ZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzQyYTIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotICAgICAgICAgICAgPCEtLSAgU1NFIFVJPyBIb3cnZCB0aGF0IGhhcHBlbmQ/ISAgLS0+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL3VpLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZjMwZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLWJpbgotdGVtcC5mb2xkZXIKLWpzcG1vZGVsLmphcgotZGV2LnByb3BlcnRpZXMKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZV82LjAuMC5qYXIKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlXzYuMC4wLnppcAotanNwbW9kZWxzcmMuemlwCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OWEyYzk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BpbmRleG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uc3RvZGlzaz1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaD1mYWxzZQotCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL3Jlc29sdmU9ZmFsc2UKLQotCi0jIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyLl9kZWJ1Zwotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvbWFuYWdlcj1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvY2FjaGU9ZmFsc2UKLQotIyBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5DTURvY3VtZW50RmFjdG9yeVRMRC5fZGVidWcKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90bGRjbWRvY3VtZW50L2ZhY3Rvcnk9ZmFsc2UKLQotI29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvamVjdERlc2NyaXB0aW9uLl9kZWJ1Z0luZGV4Q3JlYXRpb24KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvaW5kZXhjcmVhdGlvbj1mYWxzZQotI29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvamVjdERlc2NyaXB0aW9uLl9kZWJ1Z0luZGV4VGltZQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleHRpbWU9ZmFsc2UKLQotI29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliSW5kZXguX2RlYnVnRXZlbnRzCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2V2ZW50cz1mYWxzZQotI29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliSW5kZXguX2RlYnVnSW5kZXhDcmVhdGlvbgotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleGNyZWF0aW9uPWZhbHNlCi0jb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJJbmRleC5fZGVidWdSZXNvbHV0aW9uCi1vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL3Jlc29sdmU9ZmFsc2UKLQotb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGphdmFtYXBwaW5nPWZhbHNlCi0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3I9ZmFsc2UKLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90YWdsaWJ2YXJzPWZhbHNlCi0KLW9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90YWdsaWJjbGFzc2xvYWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMTBiN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9DU1NKU1BQYXJzZXIvSG93VG9HZW4uaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9Ib3dUb0dlbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQzOWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9Ib3dUb0dlbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08aHRtbD4KLTxib2R5PgotPHA+Ci1KU1BlZENTU1Rva2VuaXplciBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40LjEgCi1mcm9tIHRoZSBKU1BlZENTU1Rva2VuaXplci5mbGV4IGdyYW1tZXIgZmlsZS4KLUFmdGVyIGdlbmVyYXRpbmcgdGhlIHNjYW5uZXIsIEkgcmVtb3ZlZCB1bnVzZWQgcHJpdmF0ZSBmaWVsZCBlcnJvcnMuCi08L3A+Ci08L2JvZHk+Ci08aHRtbD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0NTU0pTUFBhcnNlci9KU1BlZENTU1Rva2VuaXplci5mbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ODE5NGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvQ1NTSlNQUGFyc2VyL0pTUGVkQ1NTVG9rZW5pemVyLmZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSw1OTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7DQotDQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsNCi0NCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkpTUGVkQ1NTUmVnaW9uQ29udGV4dHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5JQ1NTVG9rZW5pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotDQotJSUNCi0NCi0lcHVibGljDQotJWNsYXNzIEpTUGVkQ1NTVG9rZW5pemVyDQotJWltcGxlbWVudHMgSlNQZWRDU1NSZWdpb25Db250ZXh0cywgSUNTU1Rva2VuaXplcg0KLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuDQotJXR5cGUgU3RyaW5nDQotJWNoYXINCi0lbGluZQ0KLSV1bmljb2RlDQotJWNhc2VsZXNzDQotJXBhY2sNCi0NCi0lew0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5ERUZJTkVEID0gInVuZGVmaW5lZCI7DQotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydDsNCi0vLwlwcml2YXRlIGludCBmQnVmZmVyZWRUZXh0TGVuZ3RoOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7DQotLy8JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkJ1ZmZlcmVkVGV4dCA9IG51bGw7DQotCXByaXZhdGUgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBDU1NUZXh0UmVnaW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOw0KLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOw0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9OT1JNQUwgPSAxNjM4NDsNCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgQlVGRkVSX1NJWkVfU01BTEwgPSAyNTY7DQotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsNCi0NCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBzdGF0ZSkgew0KLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOw0KLQl9DQotCQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgew0KLQkJZkluaXRpYWxCdWZmZXJTaXplID0gc2l6ZTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJU3RyaW5nIGNvbnRleHQ7DQotCQlTdHJpbmcgbmV4dFRva2VuVHlwZTsNCi0JCWJvb2xlYW4gc3BhY2VGb2xsb3dzOw0KLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsNCi0JCWludCBzdGFydDsNCi0JCWludCB0ZXh0TGVuZ3RoOw0KLQkJaW50IGxlbmd0aDsNCi0JCWlmIChmQnVmZmVyZWRDb250ZXh0ICE9IG51bGwpIHsNCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0Ow0KLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7DQotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsNCi0NCi0JCQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JCX0gZWxzZSB7DQotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0vLwkJCXRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsNCi0JCQlzdGFydCA9IHl5Y2hhcjsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCX0NCi0NCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsNCi0JCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCB8fCBjb250ZXh0ID09IENTU19KU1BfRUwpew0KLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19FTF9FTkQgJiYgbmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlQpIHsNCi0vLwkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJCWlmIChjb250ZXh0LmVxdWFscyhDU1NfSlNQX1NDUklQVExFVCkgJiYgKHl5c3RhdGUoKSA9PSBTVF9KU1BfRElSRUNUSVZFIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfRVhQIHx8IHl5c3RhdGUoKSA9PSBTVF9KU1BfREVDTEFSQVRJT04pKXsNCi0JCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0JCQkJCX0NCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsNCi0JCQkJCQlicmVhazsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQlpZiAoY29udGV4dCA9PSBDU1NfSlNQX1NDUklQVExFVCl7DQotCQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlRfRU5EKSB7DQotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7DQotCQkJCQkJaWYgKGNvbnRleHQuZXF1YWxzKENTU19KU1BfU0NSSVBUTEVUKSAmJiB5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpew0KLQkJCQkJCQljb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0JCQkJCQl9DQotDQotCQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsNCi0JCQkJCQkJYnJlYWs7DQotCQkJCQkJfQ0KLQkJCQkJfQkJCQkNCi0JCQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfQ09NTUVOVCl7DQotCQkJCQkJY29udGV4dCA9IENTU19DT01NRU5UOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsNCi0JCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsNCi0JCQkJDQotCQkJfQ0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQkvLyB1bmRlZiAtPiBjb25jYXRlbmF0ZSB1bmRlZidzDQotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgew0KLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJfQ0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7DQotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOw0KLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsNCi0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblZhbHVlVHlwZShjb250ZXh0KSkgeyAvLyBkZWNsYXJhdGlvbiB2YWx1ZSBjYW4gY29udGFpbiBWQUxVRV9TDQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOw0KLQkJCQl9IGVsc2UgaWYgKGNhbkNvbnRhaW5TcGFjZShjb250ZXh0KSkgew0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsNCi0JCQkJfQ0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQNCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsNCi0JCQkJCQkvLyBuZXh0IGlzIHNwYWNlIC0+IGFwcGVuZA0KLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkvLyBuZXh0IGlzIE5PVCBzcGFjZSAtPiBwdXNoIHRoaXMgZm9yIG5leHQgdGltZSwgcmV0dXJuIGl0c2VsZg0KLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOw0KLS8vCQkJCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7DQotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7DQotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsNCi0JCQl9DQotCQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotICAJfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQkvKiBmb3Igc3RhbmRhbG9uZSB1c2UgKi8NCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOw0KLQkJZm9yIChTdHJpbmcga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKTsga2luZCAhPSBudWxsOyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpKSB7DQotCQkJdG9rZW4gPSBuZXcgQ1NTVGV4dFRva2VuKCk7DQotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJDQotCQkJdG9rZW4uc3RhcnQgPSB5eWNoYXI7DQotCQkJdG9rZW4ubGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOw0KLQkJCXRva2Vucy5hZGQodG9rZW4pOw0KLQkJfQ0KLQ0KLSAgCQlyZXR1cm4gdG9rZW5zOw0KLSAgCX0NCi0gIAkNCi0gIAkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXByaXZhdGUgYm9vbGVhbiBjYW5Db250YWluU3BhY2UoU3RyaW5nIHR5cGUpIHsNCi0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7DQotICAJCQlyZXR1cm4gZmFsc2U7DQotICAJCX0gZWxzZSB7DQotICAJCQlyZXR1cm4gdHJ1ZTsNCi0gIAkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7DQotCQlyZXR1cm4geXljaGFyOw0KLQl9DQotCQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsNCi0JCXJldHVybiB6ekF0RU9GOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsNCi0JCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCQl6elJlYWRlciA9IGluOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8NCi0JCXp6U3RhdGUgPSAwOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JCXp6TGV4aWNhbFN0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7DQotDQotCQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLw0KLQkJaWYgKHp6QnVmZmVyLmxlbmd0aCAhPSBmSW5pdGlhbEJ1ZmZlclNpemUpIHsNCi0JCQl6ekJ1ZmZlciA9IG5ldyBjaGFyW2ZJbml0aWFsQnVmZmVyU2l6ZV07DQotCQl9DQotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOw0KLQ0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCQl6ek1hcmtlZFBvcyA9IDA7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0JCXp6UHVzaGJhY2tQb3MgPSAwOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLw0KLQkJenpDdXJyZW50UG9zID0gMDsNCi0NCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JCXp6U3RhcnRSZWFkID0gMDsNCi0NCi0JCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JCQlmcm9tIGlucHV0ICovDQotCQl6ekVuZFJlYWQgPSAwOw0KLQ0KLQkJLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLw0KLQkJeXlsaW5lID0gMDsNCi0NCi0JCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5Y2hhciA9IDA7DQotDQotCQkvKioNCi0JCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSANCi0JCSAqIG1hdGNoZWQgdGV4dA0KLQkJICovDQotCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLQkJLyoqIA0KLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotCQkgKi8NCi0JCXp6QXRCT0wgPSBmYWxzZTsNCi0JCQ0KLQkJLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JCXp6QXRFT0YgPSBmYWxzZTsNCi0NCi0JCS8qIHVzZXIgdmFyaWFibGVzICovDQotCQkvLwkJZlVuZGVmaW5lZC5kZWxldGUoMCwgZlVuZGVmaW5lZC5sZW5ndGgoKSk7DQotCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIEpTUGVkQ1NTVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQkNCi0JcHJpdmF0ZSBpbnQgZkpTUFByZXZpb3VzU3RhdGUgPSBmSW5pdGlhbFN0YXRlOw0KLQlwcml2YXRlIHZvaWQgeXlKc3BCZWdpbihpbnQgbmV3c3RhdGUpew0KLQkJZkpTUFByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7DQotCQl5eWJlZ2luKG5ld3N0YXRlKTsNCi0JfQ0KLQlwcml2YXRlIHZvaWQgeXlKc3BFbmQoKXsNCi0JCXl5YmVnaW4oZkpTUFByZXZpb3VzU3RhdGUpOw0KLQl9DQotJX0NCi0NCi0lc3RhdGUgU1RfQ0hBUlNFVF9OQU1FDQotJXN0YXRlIFNUX0NIQVJTRVRfREVMSU1JVEVSDQotJXN0YXRlIFNUX0lNUE9SVF9VUkkNCi0lc3RhdGUgU1RfSU1QT1JUX01FRElVTQ0KLSVzdGF0ZSBTVF9JTVBPUlRfREVMSU1JVEVSDQotJXN0YXRlIFNUX01FRElBX01FRElVTQ0KLSVzdGF0ZSBTVF9NRURJQV9ERUxJTUlURVINCi0lc3RhdGUgU1RfUEFHRV9QU0VVRE9fUEFHRQ0KLSVzdGF0ZSBTVF9QQUdFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSDQotJXN0YXRlIFNUX1NFTEVDVE9SDQotJXN0YXRlIFNUX1NFTEVDVE9SX01PRElGSUVSDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORA0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1INCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFDQotJXN0YXRlIFNUX0pTUF9TQ1JJUFRMRVQNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRQ0KLSVzdGF0ZSBTVF9KU1BfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfSlNQX0VYUA0KLSVzdGF0ZSBTVF9KU1BfRUwNCi0lc3RhdGUgU1RfSlNQX0NPTU1FTlQNCi0NCi0NCi1oID0gWzAtOWEtZl0NCi1ub25hc2NpaSA9IFtcdTAwODAtXHVmZmZmXQ0KLXVuaWNvZGUgPSBcXHtofXsxLDZ9WyBcdFxyXG5cZl0/DQotZXNjYXBlID0ge3VuaWNvZGV9fFxcWyAtflx1MDA4MC1cdWZmZmZdDQotbm1zdGFydCA9IFtfYS16QS1aLV18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLW5tY2hhciA9IFtfYS16QS1aMC05LV18e25vbmFzY2lpfXx7ZXNjYXBlfQ0KLXN0cmluZzEgPSBcIihbXHQgISMkJSYoLX5dfFxce25sfXxcJ3x7bm9uYXNjaWl9fHtlc2NhcGV9KSpcIg0KLXN0cmluZzIgPSBcJyhbXHQgISMkJSYoLX5dfFxce25sfXxcInx7bm9uYXNjaWl9fHtlc2NhcGV9KSpcJw0KLQ0KLWlkZW50ID0ge25tc3RhcnR9e25tY2hhcn0qDQotbmFtZSA9IHtubWNoYXJ9Kw0KLW51bSA9IFsrLV0/KFswLTldK3xbMC05XSoiLiJbMC05XSspDQotc3RyaW5nID0ge3N0cmluZzF9fHtzdHJpbmcyfQ0KLXVybCA9IChbICEjJCUmKi1+XXx7bm9uYXNjaWl9fHtlc2NhcGV9KSoNCi1zID0gWyBcdFxyXG5cZl0NCi13ID0ge3N9Kg0KLW5sID0gXG58XHJcbnxccnxcZg0KLXJhbmdlID0gXD97MSw2fXx7aH0oXD97MCw1fXx7aH0oXD97MCw0fXx7aH0oXD97MCwzfXx7aH0oXD97MCwyfXx7aH0oXD8/fHtofSkpKSkpDQotDQotaGFzaCA9ICIjIntuYW1lfQ0KLXVyaSA9ICgidXJsKCJ7d317c3RyaW5nfXt3fSIpInwidXJsKCJ7d317dXJsfXt3fSIpIikNCi1mdW5jdGlvbiA9IHtpZGVudH0iKCINCi11bmljb2RlX3JhbmdlID0gIlUiXCtbMC05YS1mQS1GP117MSw2fSgiLSJbMC05YS1mQS1GP117MSw2fSk/DQotDQotU1MgPSBbXHgyMFx4MDlceDBEXHgwQV0NCi1qc3BzdGFydCA9ICI8IntTU30qIiUie1NTfSoNCi1qc3BlbmQgPSAiJSJ7U1N9KiI+Ig0KLWVsc3RhcnQgPSAiJCJ7U1N9KiJ7Ig0KLWVsZW5kID0gIn0iDQotDQotJSUNCi0NCi0NCi0NCi08WVlJTklUSUFMPiB7DQotIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30NCi19DQotDQotPFNUX0pTUF9TQ1JJUFRMRVQ+IHsNCi0gIkAiCXt5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkUpOyByZXR1cm4gQ1NTX0pTUF9ESVJFQ1RJVkU7fQ0KLSAiPSIJe3l5YmVnaW4oU1RfSlNQX0VYUCk7IHJldHVybiBDU1NfSlNQX0VYUDt9DQotICIhIgl7eXliZWdpbihTVF9KU1BfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0pTUF9ERUNMO30NCi0ge2pzcGVuZH0ge3l5SnNwRW5kKCk7ICByZXR1cm4gQ1NTX0pTUF9FTkQ7fQ0KLSAiLS0iIHsgeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7IHJldHVybiBDU1NfSlNQX0NPTU1FTlQ7fQ0KLX0NCi0NCi0vKiBvdmVycmlkZSBnbG9iYWwgIn0iICovDQotPFNUX0pTUF9FTD4gew0KLSB7ZWxlbmR9IHt5eUpzcEVuZCgpOyByZXR1cm4gQ1NTX0VMX0VORDsgfQ0KLX0NCi0NCi08U1RfSlNQX0RJUkVDVElWRSwgU1RfSlNQX0VYUCwgU1RfSlNQX0RFQ0xBUkFUSU9OPiB7DQotIHtqc3BlbmR9IHt5eUpzcEVuZCgpOyAgcmV0dXJuIENTU19KU1BfRU5EO30NCi19DQotDQotPFNUX0pTUF9DT01NRU5UPiB7DQotIC0rLXtqc3BlbmR9IHsgeXlKc3BFbmQoKTsgcmV0dXJuIENTU19KU1BfQ09NTUVOVF9FTkQ7IH0NCi0gIn0iICAgICAgICAgeyByZXR1cm4gVU5ERUZJTkVEOyB9DQotfQ0KLQ0KLQ0KLS8qDQotICogKioqIGdsb2JhbCAqKioNCi0gKi8NCi0NCi17c30rIHsgcmV0dXJuIENTU19TOyB9DQotIjwhLS0iIHsgcmV0dXJuIENTU19DRE87IH0NCi0iLS0+IiB7IHJldHVybiBDU1NfQ0RDOyB9DQotIn0iIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgfQ0KLVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLS8vXDxcJS0tW14tfV0qW31dKltefV0qLSstXCVcPiB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLQ0KLQ0KLS8vPFlZSU5JVElBTD4gew0KLS8vCSJAaW1wb3J0IiB7CXl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyB9DQotLy99DQotDQotLyoNCi0gKiAqKiogY2hhcnNldCBydWxlICoqKg0KLSAqIENIQVJTRVRfU1lNIFMqIFNUUklORyBTKiAnOycNCi0gKi8NCi0NCi0iQGNoYXJzZXQiIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7IH0NCi0NCi08U1RfQ0hBUlNFVF9OQU1FPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotfQ0KLQ0KLTxTVF9DSEFSU0VUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIGltcG9ydCBydWxlICoqKg0KLSAqIElNUE9SVF9TWU0gUyogW1NUUklOR3xVUkldIFMqIFsgbWVkaXVtIFsgQ09NTUEgUyogbWVkaXVtXSogXT8gJzsnIFMqDQotICovDQotDQotIkBpbXBvcnQiIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0NCi08U1RfSU1QT1JUX1VSST4gew0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotCS8vCSJ1cmwoInt3fXtzdHJpbmd9e3d9IikiIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JLy8JInVybCgie3d9e3VybH17d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBtZWRpYSBydWxlICoqKg0KLSAqIE1FRElBX1NZTSBTKiBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW0gXSogTEJSQUNFIFMqIHJ1bGVzZXQqICd9JyBTKg0KLSAqLw0KLQ0KLSJAbWVkaWEiIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOyB9DQotDQotLyogDQotICogbWVkaXVtDQotICogSURFTlQgUyoNCi0gKi8NCi08U1RfTUVESUFfTUVESVVNPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotfQ0KLQ0KLTxTVF9NRURJQV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIHBhZ2UgcnVsZSAqKg0KLSAqIFBBR0VfU1lNIFMqIHBzZXVkb19wYWdlPyBTKiBMQlJBQ0UgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gXSogJ30nIFMqDQotICovDQotDQotIkBwYWdlIiB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsgfQ0KLSANCi0vKg0KLSAqIHBzZXVkb19wYWdlDQotICogJzonIElERU5UDQotICovDQotDQotPFNUX1BBR0VfUFNFVURPX1BBR0U+IHsNCi0JIjoiP3tpZGVudH0geyB5eWJlZ2luKFNUX1BBR0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19QQUdFX1NFTEVDVE9SOyB9DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi08U1RfUEFHRV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogZm9udC1mYWNlDQotICogRk9OVF9GQUNFX1NZTSBTKiAneycgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gJyogJ30nIFMqDQotICovDQotDQotIkBmb250LWZhY2UiIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7IH0NCi0NCi08U1RfRk9OVF9GQUNFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBzZWxlY3Rvcg0KLSAqIHNpbXBsZV9zZWxlY3RvciBbIGNvbWJpbmF0b3Igc2ltcGxlX3NlbGVjdG9yIF0qDQotICovDQotDQotLyoNCi0gKiBzaW1wbGVfc2VsZWN0b3INCi0gKiBlbGVtZW50X25hbWUgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gXSogfCBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKw0KLSAqLw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SX01PRElGSUVSLCBTVF9TRUxFQ1RPUj4gew0KLQkiKiIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7IH0NCi0Je2hhc2h9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7IH0NCi0vLwkiOiJ7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyB9DQotCSI6IntpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIi4ie25hbWV9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7IH0NCi0JIlsiIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOyB9DQotfQ0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX01PRElGSUVSPiB7DQotCSIsIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsgfQ0KLQkvLyB1c2luZyBMT09LQUhFQUQNCi0Je3N9Ky9bXis+XHtdIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkiKyJ8Ij4iIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBhdHRyaWINCi0gKiAnWycgUyogSURFTlQgUyogWyBbICc9JyB8IElOQ0xVREVTIHwgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqIF0/ICddJw0KLSAqLw0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I+IHsNCi0JIj0ifCJ+PSJ8Inw9IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7IH0NCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFPiB7DQotCXtpZGVudH18e3N0cmluZ30geyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORD4gew0KLQkiXSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyB9DQotfQ0KLQ0KLS8qDQotICogZGVjbGFyYXRpb24NCi0gKiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPyB8IC8vIGVtcHR5IC8vDQotICovDQotDQotPFNUX0RFQ0xBUkFUSU9OPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7IH0NCi0gICAge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotICAgIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fQ0KLX0NCi0NCi08U1RfREVDTEFSQVRJT05fU0VQQVJBVE9SPiB7DQotCSI6IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9TRVBBUkFUT1I7IH0NCi0gICAge2pzcHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDt9DQotICAgIHtlbHN0YXJ0fSAgICAgICAgICB7eXlKc3BCZWdpbihTVF9KU1BfRUwpOyAgcmV0dXJuIENTU19KU1BfRUw7fSAgICANCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIiEie3N9KiJpbXBvcnRhbnQiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOyB9DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVDsgfQ0KLQkiKSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRTsgfQ0KLQl7bnVtfXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047IH0NCi0Je251bX0iJSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOyB9DQotCXtudW19IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOyB9DQotCXtmdW5jdGlvbn0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTjsgfQ0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORzsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsgfQ0KLQkiIyJ7bmFtZX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIOyB9DQotCXt1bmljb2RlX3JhbmdlfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7IH0NCi0JWywvXSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOyB9DQotICAgIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSAgICB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30gICAgDQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9WQUxVRT4gew0KLQl7c30rL1teO31dIHsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TOyB9DQotICAgIHtqc3BzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX1NDUklQVExFVCk7ICByZXR1cm4gQ1NTX0pTUF9TQ1JJUFRMRVQ7fQ0KLSAgICB7ZWxzdGFydH0gICAgICAgICAge3l5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMO30NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OLCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IsIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIjsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOyB9DQotCS8vCSJ9IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7IH0NCi19DQotDQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotLy8Je3N9KyB7IHJldHVybiBDU1NfUzsgfQ0KLS8vCS4geyByZXR1cm4gVU5ERUZJTkVEOyB9DQotLy99DQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JW14gXHRcclxuXGZdKyB7IHJldHVybiBDU1NfVU5LTk9XTjsgfQ0KLS8vfQ0KLQ0KLQ0KLQ0KLQ0KLQ0KLS4gew0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSlNQSGVhZFRva2VuaXplci5qRmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ3YWUxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9KU1BIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMzA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotCi0lJQotCi0lewotCi0KLQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLSAgICAgICAgU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotICAgICAgICBwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1hIVE1MOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNXTUw7Ci0KLQotICAgICAgICBwdWJsaWMgSlNQSGVhZFRva2VuaXplcigpIHsKLSAgICAgICAgICAgICAgICBzdXBlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLwotICAgICAgICAgICAgICAgIHp6UmVhZGVyID0gaW47Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gICAgICAgICAgICAgICAgenpTdGF0ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICAvL3l5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgLy95eWNvbHVtbiA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgICAqIG9mIGEgbGluZQotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAgICAgICAgICAgICAgIHp6QXRFT0YgPSBmYWxzZTsKLQotICAgICAgICAgICAgICAgIC8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAgICAgICAgICAgICAgIHp6RU9GRG9uZSA9IGZhbHNlOwotCi0KLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5jbGVhcigpOwotCi0gICAgICAgICAgICAgICAgaGFzTW9yZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaXNYSFRNTD1mYWxzZTsKLSAgICAgICAgICAgICAgICBpc1dNTD1mYWxzZTsKLQotCi0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLSAgICAgICAgICAgICAgICBIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlVGV4dCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgICAgICAgICBmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLSAgICAgICAgfQotIAotICAgICAgICBwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0gICAgICAgICAgICAgICAgeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzWEhUTUwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNYSFRNTDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dNTCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1dNTDsKLSAgICAgICAgfSAgICAgICAgCi0KLSV9Ci0KLSVlb2Z7Ci0gICAgICAgIGhhc01vcmU9ZmFsc2U7Ci0lZW9mfQotCi0lcHVibGljCi0lY2xhc3MgSlNQSGVhZFRva2VuaXplcgotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4KLSV0eXBlIFN0cmluZwotJWNoYXIKLSV1bmljb2RlCi0laWdub3JlY2FzZQotLy8lZGVidWcKLSVzd2l0Y2gKLSVidWZmZXIgODE5MgotCi0KLVVURjE2QkUgPSBceEZFXHhGRgotVVRGMTZMRSA9IFx4RkZceEZFCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYKLQotLy8gU3BhY2VDaGFyID0gW1x4MjBceDA5XQotCi0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdCi0KLUJlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qCi0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4KLQotCi0lc3RhdGUgU1RfWE1MRGVjbAotJXN0YXRlIFNUX1BBR0VfRElSRUNUSVZFCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUKLSVzdGF0ZSBEUV9TVFJJTkcKLSVzdGF0ZSBTUV9TVFJJTkcKLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZwotCi0lJQotCi0KLTxZWUlOSVRJQUw+Ci17Ci0gICAgICAgICAvLyBmb3JjZSB0byBzdGFydCBhdCBiZWdpbm5pbmcgb2YgbGluZSAoXikgYW5kIGF0IGJlZ2lubmluZyBvZiBmaWxlICh5eWNoYXIgPT0gMCkKLSAgICAgICAgXiB7VVRGMTZCRX0gICAgICAgICAgIHtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9fQotICAgICAgICBeIHtVVEYxNkxFfSAgICAgICAgICAge2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO319Ci0gICAgICAgIF4ge1VURjgzQnl0ZUJPTX0gICAgICAge2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fX0KLSAgICAgICAgCi0gICAgICAgIC8vIGZvcmNlIHRvIGJlIHN0YXJ0ZWQgb24gZmlyc3QgbGluZSwgYnV0IHdlIGRvIGFsbG93IHByZWNlZWRpbmcgc3BhY2VzCi0gICAgICAgIF4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0KLQotICAgICAgICAvLyBmb2xsb3dpbmcgYXJlIHNvbWUgc2ltcGx5IHJ1bGVzIHRvIGlkZW50aWZ5IEpTUCBjb250ZW50IGFzICJYSFRNTCIKLSAgICAgICAgLy8gc2VlIGh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzMyMzYudHh0Ci0gICAgICAgICI8IURPQ1RZUEUiIHtTfSogImh0bWwiIHtTfSogIlBVQkxJQyIgLiogIi8vRFREIFhIVE1MIiAgICAgICAgICAgICAgICB7aXNYSFRNTCA9IHRydWU7fQotICAgICAgICAiPGh0bWwiIHtTfSogInhtbG5zIiB7U30qICI9IiB7U30qIChcIiB8IFwnKSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgICAgIHtpc1hIVE1MID0gdHJ1ZTt9Ci0gICAgICAgICAvLyBhbm90aGVyIGNhc2UgdGhhdCdzIHBhcnQgb2YgdGhlICJIVE1MIGZhbWlseSIgaXMgV01MIDEuMCAoV01MIDIuMCBpcyBwYXJ0IG9mIFhIVE1MKQotICAgICAgICAgIjwhRE9DVFlQRSIge1N9KiAid21sIiB7U30qICJQVUJMSUMiIC4qICIvL0RURCBXTUwiICAgICAgICAgICAgICAgICAgIHtpc1dNTCA9IHRydWU7fQotCi0gICAgICAgICI8JSIge1N9KiAiQCIge1N9KiAicGFnZSIge1N9KyAgIHt5eWJlZ2luKFNUX1BBR0VfRElSRUNUSVZFKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZVN0YXJ0O30KLSAgICAgICAgIjxqc3A6ZGlyZWN0aXZlLnBhZ2UiIHtTfSsgICAgICAgICAgIHt5eWJlZ2luKFNUX1BBR0VfRElSRUNUSVZFKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZVN0YXJ0O30KLQotCi19Ci0KLTxTVF9YTUxEZWNsPgotewotICAgICAgICAidmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQotICAgICAgICAiZW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30KLSAgICAgICAgLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kCi0gICAgICAgIC8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzCi0gICAgICAgIC8vIHJlYWQgd2l0aCBpbmNvcnJlY3QgZW5jb2RpbmcgKHN1Y2ggYXMgaWYgcGxhdGZvcm0gZW5jb2RpbmcgaXMgaW4gZWZmZWN0IHVudGlsIHRydWUgZW5jb2RpbmcgZGV0ZWN0ZWQpLgotICAgICAgICAvLyBCVVQsIHRoZSBoYXNNb3JlPWZhbHNlIHdhcyByZW1vdmVkIGZvciB0aGlzIEpTUCBjYXNlIChwcm9iYWJseSBzdGlsbCBvayBmb3IgcHVyZSBYTUwpIGJlY2F1c2UKLSAgICAgICAgLy8gaW4gYSBKU1AsIHdlIG11c3QgcGFyc2UgcGFzdCB4bWxEZWNsIHRvIGdldCBhdCBKU1AgcGFnZSBkaXJlY3RpdmUuCi0gICAgICAgIC8vIFdlJ2xsIGFzc3VtZSBhbGwgY2hhcnMgaW4gdGhpcyBhcmVhIGFyZSAicmVhZGFibGUiIGFzIGlzLgotICAgICAgICB7U30qICJcPz4iICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQotfQotCi08U1RfUEFHRV9ESVJFQ1RJVkU+Ci17Ci0vLyAgcmVtb3ZlZCAnbGFuZ3VhZ2UnIHNpbmNlIGl0IHJlYWxseSBjYW4gYmUgaGFuZGxlZCBzZXBlcmF0ZWx5IGZyb20gZW5jb2RpbmcsIGJ1dCBtYXkgYWRkIGl0IGJhY2sgbGF0ZXIgZm9yIHNpbXBsZSByZS11c2UuCi0gICAgICAgICJsYW5ndWFnZSIgICAgIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VMYW5ndWFnZTt9Ci0gICAgICAgICJjb250ZW50VHlwZSIge0JlZ2luQXR0cmliZVZhbHVlfSAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VDb250ZW50VHlwZTt9Ci0gICAgICAgICJwYWdlRW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VFbmNvZGluZzt9Ci0gICAgICAgIC8vIG5vdGUgdGhlICJmb3JjZWQgZW5kIiAodmlhICdoYXNNb3JlPWZhbHNlJykgb25jZSB0aGUgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotICAgICAgICAvLyBUaGlzIGlzIHNpbmNlIG5vbi1hc2NpaSBjaGFycyBtYXkgZm9sbG93IGFuZCBtYXkgY2F1c2UgSU9FeGNlcHRpb25zIHdoaWNoIHdvdWxkIG5vdCBvY2N1ciBvbmNlIHN0cmVhbSBpcwotICAgICAgICAvLyByZWFkIGluIGNvcnJlY3QgZW5jb2RpbmcuCi0KLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQyMDUgZGVtb25zdHJhdGVzIGhvdyB3ZSBuZWVkIHRvIGtlZXAgcGFyc2luZywKLSAgICAgICAgLy8gZXZlbiBpZiBjb21lIHRvIGVuZCBvZiBvbmUgcGFnZSBkaXJlY3RpdmUsIHNvIGhhc01vcmU9ZmFsc2Ugd2FzIHJlbW92ZWQgZnJvbSB0aGVzZSBydWxlcy4KLSAgICAgICAgIiU+IiAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVFbmQ7fQotICAgICAgICAiXC8+IiAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZURpcmVjdGl2ZUVuZDt9Ci19Ci0KLQotPFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotICAgICAgICBcIiAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBcJyAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICAvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcKLSAgICAgICAge1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19Ci0KLQotPERRX1NUUklORz4KLXsKLQotICAgICAgICBcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgICAgICAge0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgICJcPz4iICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgJzwnICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgIHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0gICAgICAgICIlPiIgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCi0KLX0KLQotPFNRX1NUUklORz4KLXsKLQotICAgICAgICBcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAgICAgICB7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgIiU+IiAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgICc8JyAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotICAgICAgICAuICAgICAgICAgICAgICAgICAgICAgICB7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLSAgICAgICAgIiU+IiAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0KLQotfQotCi08VW5EZWxpbWl0ZWRTdHJpbmc+Ci17Ci0KLQotICAgICAgICB7U30gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIHtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotICAgICAgICAiXD8+IiAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgJzwnICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0gICAgICAgIC8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotICAgICAgICBcJyAgICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLSAgICAgICAgXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0KLSAgICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0gICAgICAgICIlPiIgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCi19Ci0KLS8vIFRoZSAibWF0Y2ggYW55dGhpbmciIHJ1bGUgc2hvdWxkIGFsd2F5cyBiZSBpbiBlZmZlY3QgZXhjZXB0IGZvciB3aGVuIGxvb2tpbmcgZm9yIGVuZCBvZiBzdHJpbmcKLS8vIChUaGF0IGlzLCByZW1lbWJlciB0byB1cGRhdGUgc3RhdGUgbGlzdCBpZi93aGVuIG5ldyBzdGF0ZXMgYWRkZWQpCi08WVlJTklUSUFMLCBTVF9YTUxEZWNsLCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSwgU1RfUEFHRV9ESVJFQ1RJVkU+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmViZTE4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZFBhcnNlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgbmFtZT0idG9rZW5pemVyIiBkZWZhdWx0PSJIZWFkVG9rZW5pemVyIj4KLQkKLQk8IS0tIE5vdGU6IGZvciBFY2xpcHNlIGVudi4sIHRoZSBKRmxleCAxLjQgamFyIHNob3VsZCBiZSBhZGRlZCAKLQl0byB0aGUgYW50IGdsb2JhbCBlbnRyaWVzICAtLT4KLQk8dGFza2RlZiBjbGFzc25hbWU9IkpGbGV4LmFudHRhc2suSkZsZXhUYXNrIiBuYW1lPSJqZmxleCIgLz4KLQkJCi0JPHRhcmdldCBuYW1lPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iSlNQSGVhZFRva2VuaXplci5qRmxleCIvPgkJCQotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IkhlYWRQYXJzZXJzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Ii4uL3NyYyIvPgotCQk8IS0tIHRvdWNoIGNhdXNlcyB0byBhbHdheXMgYnVpbGQsIHJlbW92ZSBmb3IgcmVhbCAnbWFrZScgYmVoYXZpb3IgLS0+Ci0JCTx0b3VjaCBmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9Ii8+Ci0JCQkJCQotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJIZWFkVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJydW4tamZsZXgiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLWpmbGV4IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGpmbGV4Ci0JICAgIAlmaWxlPSIke3NyYy5kaXJ9LyR7c3JjLmZpbGV9IgotCSAgICAJZGVzdGRpcj0iJHtkZXN0LmRpcn0iCi0JCQl2ZXJib3NlPSJ0cnVlIgotCQkJbm9iYWs9InRydWUiCi0JCQl0aW1lPSJvbiIKLQkgICAgLz4KLQk8L3RhcmdldD4KLQkKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0ZmFhMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2UuanN0LmpzcC51aSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhc2tzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbCwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyejt4LWludGVybmFsOj10cnVlCi1SZXF1aXJlLUJ1bmRsZTogY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsMy40LjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS5lcXVpbm94LnNlcnZsZXQuYXBpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjAsMS4xLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWU7IGV4Y2VwdGlvbnM9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUxODdhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gY29tcG9uZW50LnhtbCxcCi0gICAgICAgICAgICAgICBEZXZUaW1lU3VwcG9ydC8sXAotICAgICAgICAgICAgICAgc2NoZW1hLwotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9jb21wb25lbnQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjZjlhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9jb21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9lY2xpcHNlLm9yZy93dHAvcmVsZW5nL3Rvb2xzL2NvbXBvbmVudC1tb2RlbCIgbmFtZT0ib3JnLmVjbGlwc2UuanN0LmpzcCI+Ci0JPGNvbXBvbmVudC1kZXBlbmRzIHVucmVzdHJpY3RlZD0idHJ1ZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iSUphclJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnRGlyUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPiAtLT4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnbGliSW5kZXhMaXN0ZW5lciIgaW1wbGVtZW50PSJ0cnVlIiAvPiAtLT4KLQkJPHR5cGUgbmFtZT0iSVRhZ2xpYlJlY29yZCIgaW1wbGVtZW50PSJmYWxzZSIgLz4KLQkJPCEtLSA8dHlwZSBuYW1lPSJJVGFnbGliUmVjb3JkRXZlbnQiIGltcGxlbWVudD0iZmFsc2UiIC8+IC0tPgotCQk8dHlwZSBuYW1lPSJJVExEUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJJVVJMUmVjb3JkIiBpbXBsZW1lbnQ9ImZhbHNlIiAvPgotCQk8dHlwZSBuYW1lPSJUYWdsaWJJbmRleCIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0iZmFsc2UiIC8+Ci0JPC9wYWNrYWdlPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJKU1BDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL2pzdC9jb21wb25lbnRzL2pzcC9vdmVydmlldy5odG1sIiAvPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM4N2E5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9U3RydWN0dXJlZCBTb3VyY2UgSlNQIE1vZGVsCi1TdHJ1Y3R1cmVkX0pTUF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lPVN0cnVjdHVyZWQgSlNQIERvY3VtZW50IEZhY3RvcnkgRXh0ZW5zaW9uCi1KU1BfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQCi1KU1BfVGFnX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBUYWcgRGVmaW5pdGlvbgotSlNQX1RMRF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1UYWcgTGlicmFyeSBEZXNjcmlwdG9yCi1KU1BfRnJhZ21lbnRfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIEZyYWdtZW50Ci1KU1BfU3ludGF4X1ZhbGlkYXRvci5uYW1lPUpTUCBTeW50YXggVmFsaWRhdG9yCi1KU1BfRGlyZWN0aXZlX1ZhbGlkYXRvci5uYW1lPUpTUCBEaXJlY3RpdmUgVmFsaWRhdG9yCi1FTF9TeW50YXhfVmFsaWRhdG9yLm5hbWU9RUwgU3ludGF4IFZhbGlkYXRvcgotU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfU2V0dXBfcGFydGljaXBhbnQubmFtZT1TdHJ1Y3R1cmVkIEpTUCBEb2N1bWVudCBTZXR1cCBQYXJ0aWNpcGFudAotCi1leHRlbnNpb24tcG9pbnQubmFtZS4wID0gSlNQIEVMIFRyYW5zbGF0b3IKLQotY29udGVudFR5cGVDU1NKU1BOYW1lPUNTUyBKU1AKLWNvbnRlbnRUeXBlQ1NTSlNQRk5hbWU9Q1NTIEpTUCBGcmFnbWVudAotCi1jb250ZW50VHlwZUNTU0RvY3VtZW50RmFjdG9yeU5hbWU9Q29udGVudCBUeXBlIENTUyBKU1AgZG9jdW1lbnQgZmFjdG9yeSBleHRlbnNpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTczMzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlbFRyYW5zbGF0b3IiIG5hbWU9IiVleHRlbnNpb24tcG9pbnQubmFtZS4wIiBzY2hlbWE9InNjaGVtYS9lbHRyYW5zbGF0b3IuZXhzZCIvPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLm1vZGVsSGFuZGxlciI+Ci0JCTxtb2RlbEhhbmRsZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckpTUCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BmcmFnbWVudHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnRGYWN0b3JpZXMiPgotCQk8ZmFjdG9yeQotCQkJdHlwZT0idGxkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRGYWN0b3J5VExEIj4KLQkJPC9mYWN0b3J5PgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFza3MuSlNQRmlsZVRhc2tTY2FubmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YXNrcy5KU1BGaWxlVGFza1NjYW5uZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfSlNQX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRTZXR1cCIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5kb2N1bWVudHNldHVwIgotCQluYW1lPSIlU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfU2V0dXBfcGFydGljaXBhbnQubmFtZSI+Ci0JCTxwYXJ0aWNpcGFudAotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImpzcCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3BmIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc3B4IiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJqc2YiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ianN2Ij4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Imp0cGwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0idGxkIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ0YWciIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZ3giIC8+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InRhZ2YiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGwiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciBKU1AgZmlsZXMgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ianNwLGpzdixqdHBsLGpzcHgiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ianNwc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iSVNPLTg4NTktMSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9ySlNQIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQkJPCEtLSBjcmVhdGUgY29udGVudCB0eXBlIGZvciBKU1AgZnJhZ21lbnQgZmlsZXMgLS0+Ci0JCTxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ianNwZixqc2YiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfRnJhZ21lbnRfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0ianNwZnJhZ21lbnRzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IklTTy04ODU5LTEiPgotCQkJPGRlc2NyaWJlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckpTUCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JCTwhLS0gY3JlYXRlIGNvbnRlbnQgdHlwZSBmb3IgSlNQIDIuMCBUYWcgZmlsZSB0eXBlcyAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ0YWcsdGFneCx0YWdmIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlSlNQX1RhZ19Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ0YWdzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04Ii8+Ci0JCTwhLS0gY3JlYXRlIGNvbnRlbnQgdHlwZSBmb3IgLnRsZCBmaWxlcyAtLT4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ0bGQiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVKU1BfVExEX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9InRsZHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBqc3AgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSlNQQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gSlNQIEVMIGJhdGNoIHZhbGlkYXRvcgkJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJaWQ9IkpTUEVMVmFsaWRhdG9yIgotCQluYW1lPSIlRUxfU3ludGF4X1ZhbGlkYXRvci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLQkJPHZhbGlkYXRvcj4KLQkJCTxwcm9qZWN0TmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzcCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc3BmIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzZiI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc3YiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanRwbCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxoZWxwZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0Ij4KLQkJCTwvaGVscGVyPgotCQkJPHJ1bgotCQkJCWVuYWJsZWQ9InRydWUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUEVMVmFsaWRhdG9yIj4KLQkJCTwvcnVuPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gSlNQIGJhdGNoIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJaWQ9IkpTUEphdmFWYWxpZGF0b3IiCi0JCW5hbWU9IiVKU1BfU3ludGF4X1ZhbGlkYXRvci5uYW1lIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24udmFsaWRhdG9yIj4KLQkJPHZhbGlkYXRvcj4KLQkJCTxwcm9qZWN0TmF0dXJlIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCi0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNwIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzcGYiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNmIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzdiI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qdHBsIj4KLQkJCTwvZmlsdGVyPgotCQkJPGhlbHBlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaENvbnRleHQiPgotCQkJPC9oZWxwZXI+Ci0JCQk8cnVuCi0JCQkJZW5hYmxlZD0idHJ1ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uSlNQSmF2YVZhbGlkYXRvciI+Ci0JCQk8L3J1bj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBKU1AgZGlyZWN0aXZlIGJhdGNoIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0iSlNQRGlyZWN0aXZlVmFsaWRhdG9yIgotCQluYW1lPSIlSlNQX0RpcmVjdGl2ZV9WYWxpZGF0b3IubmFtZSIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0JCTx2YWxpZGF0b3I+Ci0JCQk8cHJvamVjdE5hdHVyZSBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIgLz4KLQotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzcCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc3BmIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzZiI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qc3YiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanRwbCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxoZWxwZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Xb3JrYmVuY2hDb250ZXh0Ij4KLQkJCTwvaGVscGVyPgotCQkJPHJ1bgotCQkJCWVuYWJsZWQ9InRydWUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUERpcmVjdGl2ZVZhbGlkYXRvciI+Ci0JCQk8L3J1bj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgKGFzIHlvdSB0eXBlKSB2YWxpZGF0aW9uIGZvciBKU1AgSmF2YQkJCQkgICAJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BKYXZhVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuanNwc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuREVGQVVMVF9KU1AiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuSkFWQSI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC5ERUxJTUlURVIiPgotCQkJCTwvcGFydGl0aW9uVHlwZT4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBzb3VyY2UgdmFsaWRhdGlvbiBmb3IgSlNQIEVMCQkJCSAgIAkJCQkJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5KU1BFTFZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmpzcGVsc291cmNldmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuU0NSSVBULkpTUF9FTCI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gc291cmNlIChhcyB5b3UgdHlwZSkgdmFsaWRhdGlvbiBmb3IgSlNQIGRpcmVjdGl2ZQkJCSAgIAkJCQkJCSAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InRvdGFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkpTUERpcmVjdGl2ZVZhbGlkYXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnRsZHNvdXJjZXZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSI+Ci0JCQkJPC9wYXJ0aXRpb25UeXBlPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCQotICAgIDxleHRlbnNpb24KLSAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmVsVHJhbnNsYXRvciI+Ci0gICAgICAgPGVsVHJhbnNsYXRvcgotICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5KU1BFTFRyYW5zbGF0b3IiCi0gICAgICAgICAgbmFtZT0iRGVmYXVsdCBKU1AgMi4wIEVMIFRyYW5zbGF0b3IiCi0gICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuZGVmYXVsdEpTUDIwIi8+Ci0gICAgPC9leHRlbnNpb24+Ci0gICAgCi0gIAk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIG1pbmltYWwgY29udGVudC10eXBlIGNzcyBqc3Agc3VwcG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLSAgICA8ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnRUeXBlcyI+Ci0gICAgICAgIDxjb250ZW50LXR5cGUKLQkJCWZpbGUtZXh0ZW5zaW9ucz0ianNwIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlY29udGVudFR5cGVDU1NKU1BOYW1lIgotCQkJaWQ9ImNzc2pzcHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckpTUGVkQ1NTIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLSAgICAgICAgPGNvbnRlbnQtdHlwZQotCSAgICAgICAgZmlsZS1leHRlbnNpb25zPSJqc3BmIgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlY29udGVudFR5cGVDU1NKU1BGTmFtZSIKLQkJCWlkPSJjc3Nqc3BmcmFnbWVudHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckpTUGVkQ1NTIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbEhhbmRsZXIiPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCQk8bW9kZWxIYW5kbGVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MiCi0JCQlhc3NvY2lhdGVkQ29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUubW9kZWxoYW5kbGVyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJWNvbnRlbnRUeXBlQ1NTRG9jdW1lbnRGYWN0b3J5TmFtZSI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudFNldHVwIgotCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5kb2N1bWVudHNldHVwIgotCQluYW1lPSIlU3RydWN0dXJlZF9KU1BfRG9jdW1lbnRfU2V0dXBfcGFydGljaXBhbnQubmFtZSI+Ci0JCTxwYXJ0aWNpcGFudAotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnRmYWN0b3JpZXMuZnJhZ21lbnQiCi0JCW5hbWU9IiVjb250ZW50VHlwZUNTU0RvY3VtZW50RmFjdG9yeU5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcGZyYWdtZW50c291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5maWxlYnVmZmVycy5CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkiIC8+Ci0JPC9leHRlbnNpb24+CQotCS0tPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zY2hlbWEvZWx0cmFuc2xhdG9yLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zY2hlbWEvZWx0cmFuc2xhdG9yLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZTQxMmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc2NoZW1hL2VsdHJhbnNsYXRvci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlIiBpZD0iZWxUcmFuc2xhdG9yIiBuYW1lPSJKU1AgRUwgVHJhbnNsYXRvciIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBFeHRlbnNpb24gcG9pbnQgdG8gY3VzdG9tZXIgSlNQIEV4cHJlc3Npb24gTGFuZ3VhZ2UgR2VuZXJhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJlbFRyYW5zbGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImVsVHJhbnNsYXRvciI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgPG1ldGEuZWxlbWVudCBsYWJlbEF0dHJpYnV0ZT0ibmFtZSIvPgotICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBmb3IgdGhlIEVMIFRyYW5zbGF0b3IuICBNdXN0IGJlIGFuIGltcGxlbWVudG9yIG9mIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5JSlNQRUxUcmFuc2xhdG9yLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIEVMIHRyYW5zbGF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSB1bmlxdWUgc3RyaW5nIGlkZW50aWZpZXIgZm9yIGFuIEVMIFRyYW5zbGF0b3IuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciB0aGUgZmlyc3QgcmVsZWFzZSBpbiB3aGljaCB0aGlzIGV4dGVuc2lvbiBwb2ludCBhcHBlYXJzLl0KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgW0VudGVyIGV4dGVuc2lvbiBwb2ludCB1c2FnZSBleGFtcGxlIGhlcmUuXQotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBBUEkgaW5mb3JtYXRpb24gaGVyZS5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFtFbnRlciBpbmZvcm1hdGlvbiBhYm91dCBzdXBwbGllZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGV4dGVuc2lvbiBwb2ludC5dCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZjMGM5ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsOwotCi0KLQotLyoqCi0gKiA8Y29kZT5Bc3NlcnQ8L2NvZGU+IGlzIHVzZWZ1bCBmb3IgZm9yIGVtYmVkZGluZyBydW50aW1lIHNhbml0eSBjaGVja3MgaW4KLSAqIGNvZGUuIFRoZSBwcmVkaWNhdGUgbWV0aG9kcyBhbGwgdGVzdCBhIGNvbmRpdGlvbiBhbmQgdGhyb3cgc29tZSB0eXBlIG9mCi0gKiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlmIHRoZSBjb25kaXRpb24gZG9lcyBub3QgaG9sZC4KLSAqIDxwPgotICogQXNzZXJ0aW9uIGZhaWx1cmUgZXhjZXB0aW9ucywgbGlrZSBtb3N0IHJ1bnRpbWUgZXhjZXB0aW9ucywgYXJlIHRocm93biB3aGVuCi0gKiBzb21ldGhpbmcgaXMgbWlzYmVoYXZpbmcuIEFzc2VydGlvbiBmYWlsdXJlcyBhcmUgaW52YXJpYWJseSB1bnNwZWNpZmllZAotICogYmVoYXZpb3I7IGNvbnNlcXVlbnRseSwgY2xpZW50cyBzaG91bGQgbmV2ZXIgcmVseSBvbiB0aGVzZSBiZWluZyB0aHJvd24KLSAqIChhbmQgY2VydGFpbmx5IHNob3VsZCBub3QgYmVpbmcgY2F0Y2hpbmcgdGhlbSBzcGVjaWZpY2FsbHkpLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZXJ0IHsKLQotCS8qKgotCSAqIDxjb2RlPkFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbjwvY29kZT4gaXMgYSBydW50aW1lIGV4Y2VwdGlvbiB0aHJvd24KLQkgKiBieSBzb21lIG9mIHRoZSBtZXRob2RzIGluIDxjb2RlPkFzc2VydDwvY29kZT4uCi0JICogPHA+Ci0JICogVGhpcyBjbGFzcyBpcyBub3QgZGVjbGFyZWQgcHVibGljIHRvIHByZXZlbnQgc29tZSBtaXN1c2VzOyBwcm9ncmFtcwotCSAqIHRoYXQgY2F0Y2ggb3Igb3RoZXJ3aXNlIGRlcGVuZCBvbiBhc3NlcnRpb24gZmFpbHVyZXMgYXJlIHN1c2NlcHRpYmxlIHRvCi0JICogdW5leHBlY3RlZCBicmVha2FnZSB3aGVuIGFzc2VydGlvbnMgaW4gdGhlIGNvZGUgYXJlIGFkZGVkIG9yIHJlbW92ZWQuCi0JICogPC9wPgotCSAqLwotCWNsYXNzIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbi4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uIHdpdGggdGhlIGdpdmVuIG1lc3NhZ2UuCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKFN0cmluZyBkZXRhaWwpIHsKLQkJCXN1cGVyKGRldGFpbCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZXNzYWdlKTsKLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgbm90IDxjb2RlPm51bGw8L2NvZGU+LiBJZiB0aGlzIGlzCi0JICogbm90IHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbgotCSAqIG1lc3NhZ2UgaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIG9iamVjdAotCSAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIHRlc3QKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQGV4Y2VwdGlvbiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiB0aGUgb2JqZWN0IGlzIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGlzTm90TnVsbChPYmplY3Qgb2JqZWN0LCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQl9Ci0JCXJldHVybiBleHByZXNzaW9uOwotCX0KLQotCS8qIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIGluc3RhbnRpYXRlZC4gKi8KLQlwcml2YXRlIEFzc2VydCgpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzNWYyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBKU1AgQ29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUENvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luUmVzb3VyY2VzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BJbmRleE1hbmFnZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BfU2VhcmNoOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEVMX1N5bnRheDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BFTF9Ub2tlbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BEb2N1bWVudExvYWRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZzsKLQkKLQlwcml2YXRlIEpTUENvcmVNZXNzYWdlcygpIHsKLQl9Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBKU1BDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NTZiYjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9KU1BDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BJbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJIZWxwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuVGFnbGliSW5kZXg7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBUaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIEpTUENvcmVQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBKU1BDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIHdpbGwgYmUgcmVtb3ZlZC4gQ3VycmVudGx5IHVzZWQgdG8gZ2V0ICJtb2RlbAotCSAqICAgICAgICAgICAgIHByZWZlcmVuY2VzIiwgYnV0IHRoZXJlIGFyZSBvdGhlciwgYmV0dGVyIHdheXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBKU1BDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0YXJ0KG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotCi0JCVRhZ2xpYkluZGV4LnN0YXJ0dXAoKTsKLQkJLy8gSlNQSW5kZXhNYW5hZ2VyIGRlcGVuZHMgb24gVGFnbGliQ29udHJvbGxlciwgc28gVGFnbGliQ29udHJvbGxlcgotCQkvLyBzaG91bGQgYmUgc3RhcnRlZCBmaXJzdAotCQlUYWdsaWJDb250cm9sbGVyLnN0YXJ0dXAoKTsKLQotCQkvLyBsaXN0ZW4gZm9yIGNsYXNzcGF0aCBjaGFuZ2VzCi0JCUphdmFDb3JlLmFkZEVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIoVGFnbGliSGVscGVyTWFuYWdlci5nZXRJbnN0YW5jZSgpKTsKLQotCi0JCUpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluaXRpYWxpemUoKTsKLQotCQkvLyBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcyBrZXlzCi0JCUpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIuc3RhcnR1cCgpOwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luI3N0b3Aob3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBzdG9wIGxpc3Rlbm5pbmcgZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcwotCQkvLyBrZXlzCi0JCUpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIuc2h1dGRvd24oKTsKLQotCQkvLyBzdG9wIGFueSBpbmRleGluZwotCQlKU1BJbmRleE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5zaHV0ZG93bigpOwotCi0JCS8vIHN0b3AgbGlzdGVuaW5nIGZvciBjbGFzc3BhdGggY2hhbmdlcwotCQlKYXZhQ29yZS5yZW1vdmVFbGVtZW50Q2hhbmdlZExpc3RlbmVyKFRhZ2xpYkhlbHBlck1hbmFnZXIuZ2V0SW5zdGFuY2UoKSk7Ci0KLQkJLy8gc3RvcCB0YWdsaWIgY29udHJvbGxlcgotCQlUYWdsaWJDb250cm9sbGVyLnNodXRkb3duKCk7Ci0JCVRhZ2xpYkluZGV4LnNodXRkb3duKCk7Ci0KLQkJc3VwZXIuc3RvcChjb250ZXh0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL0pTUENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzBhOWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvSlNQQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUpTUEluZGV4TWFuYWdlcl8wPVVwZGF0aW5nIEpTUCBJbmRleAotSlNQSW5kZXhNYW5hZ2VyXzI9SlNQIEluZGV4ZXIgaW5kZXhpbmcgezB9IGZpbGVzCi1KU1BfU2VhcmNoPUpTUCBTZWFyY2ggLSAKLUpTUERvY3VtZW50TG9hZGVyXzE9UHJvZ3JhbSBFcnJvcjogc3RydWN0dXJlZCBtb2RlbCBoYWQgbm8gc3RydWN0dXJlZERvY3VtZW50Ci1KU1BFTF9TeW50YXg9RUwgU3ludGF4IEVycm9yIAotSlNQRUxfVG9rZW49VW5hYmxlIHRvIGFuYWx5c2UgRUwgZXhwcmVzc2lvbiBkdWUgdG8gbGV4aWNhbCBhbmFseXNpcyBlcnJvcgotTUVTU0FHRV9KU1BfVkFMSURBVElOR19NRVNTQUdFX1VJXz1KU1AgVmFsaWRhdG9yIHZhbGlkYXRpbmcgezB9Ci1KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nPVVwZGF0aW5nIEpTUCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzCi1KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1Byb2JsZW1zX1VwZGF0aW5nPVByb2JsZW0gc2F2aW5nIEpTUCBGcmFnbWVudCBDb250ZW50IFNldHRpbmdzIGZvciB7MH0KLUpTUERpcmVjdGl2ZVZhbGlkYXRvcl8wPVJlc2VydmVkIHByZWZpeCAgJwotSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzI9RHVwbGljYXRlIHByZWZpeCAgJwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2N2E5YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmIGRlc2lyZWQsCi0gKiB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcyBwbHVnaW4uIE90aGVyCi0gKiBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogQHBhcmFtIGxldmVsIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbiBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeSBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aCAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudFdyYXBwZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnRXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDM5ODMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudFdyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBDTUNvbnRlbnRXcmFwcGVySW1wbCBleHRlbmRzIENNTm9kZVdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Db250ZW50IHsKLQotCXByaXZhdGUgQ01Db250ZW50IGZDTUNvbnRlbnQgPSBudWxsOwotCi0JLyoqCi0JICogQ01Db250ZW50V3JhcHBlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBwcmVmaXggamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHVibGljIENNQ29udGVudFdyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50IG5vZGUpIHsKLQkJc3VwZXIocHJlZml4LCBub2RlKTsKLQkJZkNNQ29udGVudCA9IG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gZkNNQ29udGVudC5nZXRNYXhPY2N1cigpOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIGZDTUNvbnRlbnQuZ2V0TWluT2NjdXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmQ01Db250ZW50OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50V3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIyN2E3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50V3JhcHBlckltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50LCBDTU5vZGVXcmFwcGVyIHsKLQotCWNsYXNzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQotCQlwcm90ZWN0ZWQgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpIHsKLQkJCXJldHVybiB0YWJsZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIHRhYmxlLnNpemUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gKENNTm9kZSkgdGFibGUuZ2V0KG5hbWUpOwotCQl9Ci0KLQkJcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQlpbnQgc2l6ZSA9IHRhYmxlLnNpemUoKTsKLQkJCWlmIChpbmRleCA8IHNpemUpIHsKLQkJCQlJdGVyYXRvciB2YWx1ZXMgPSBpdGVyYXRvcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDw9IGluZGV4OyBpKyspIHsKLQkJCQkJcmVzdWx0ID0gdmFsdWVzLm5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gKENNTm9kZSkgcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUsIENNTm9kZSBhTm9kZSkgewotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBhTm9kZSAhPSBudWxsKQotCQkJCXRhYmxlLnB1dChuYW1lLCBhTm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgQ01OYW1lc3BhY2VJbXBsIGltcGxlbWVudHMgQ01OYW1lc3BhY2UgewotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIENNRG9jdW1lbnRXcmFwcGVySW1wbC50aGlzLmdldFVSSSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuTkFNRV9TUEFDRTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQkJcmV0dXJuIENNRG9jdW1lbnRXcmFwcGVySW1wbC50aGlzLmdldFByZWZpeCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlyZXR1cm4gQ01Eb2N1bWVudFdyYXBwZXJJbXBsLnRoaXMuZ2V0VVJJKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgZmVhdHVyZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENNTmFtZWROb2RlTWFwIGZFbGVtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBmRW50aXRpZXMgPSBudWxsOwotCXByaXZhdGUgQ01OYW1lc3BhY2UgZk5hbWVzcGFjZSA9IG5ldyBDTU5hbWVzcGFjZUltcGwoKTsKLQlwcml2YXRlIFN0cmluZyBmUHJlZml4OwotCXByaXZhdGUgU3RyaW5nIGZVUkk7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudFdyYXBwZXJJbXBsKFN0cmluZyBuZXdVUkksIFN0cmluZyBuZXdQcmVmaXgsIENNRG9jdW1lbnQgdGxkKSB7Ci0JCWZVUkkgPSBuZXdVUkk7Ci0JCWZQcmVmaXggPSBuZXdQcmVmaXg7Ci0JCWZEb2N1bWVudCA9IHRsZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlpZiAoZkVsZW1lbnRzID09IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCk7Ci0JCQlDTU5hbWVkTm9kZU1hcEltcGwgZWxlbWVudHMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbChmUHJlZml4LCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGdldERvY3VtZW50KCkuZ2V0RWxlbWVudHMoKS5pdGVtKGkpKTsKLQkJCQllbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJfQotCQkJZkVsZW1lbnRzID0gZWxlbWVudHM7Ci0JCX0KLQkJcmV0dXJuIGZFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbnRpdGllcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVudGl0eURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlpZiAoZkVudGl0aWVzID09IG51bGwpIHsKLQkJCWZFbnRpdGllcyA9IGdldERvY3VtZW50KCkuZ2V0RW50aXRpZXMoKTsKLQkJfQotCQlyZXR1cm4gZkVudGl0aWVzOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVzcGFjZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZXNwYWNlCi0JICovCi0JcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGZOYW1lc3BhY2U7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgQ01Ob2RlIGdldE9yaWdpbk5vZGUoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiBmUHJlZml4OwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKS5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQlyZXR1cm4gZlVSSTsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCgpLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRWxlbWVudERlY2xhcmF0aW9uV3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzNjhmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbCBleHRlbmRzIENNTm9kZVdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCXByaXZhdGUgQ01Db250ZW50IGZDTUNvbnRlbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGZFbGVtZW50RGVjbCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gcHJlZml4IGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbm9kZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbldyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIENNRWxlbWVudERlY2xhcmF0aW9uIG5vZGUpIHsKLQkJc3VwZXIocHJlZml4LCBub2RlKTsKLQkJZkVsZW1lbnREZWNsID0gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgQXR0cmlidXRlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q01Db250ZW50IG1ldGhvZAotCSAqIEByZXR1cm4gQ01Db250ZW50Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhpcyBlbGVtZW50J3MgY29udGVudCBtb2RlbC4KLQkgKiBUaGlzIGNhbiBiZSBhbiBDTUVsZW1lbnREZWNsYXJhdGlvbiBvciBhIENNR3JvdXAKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCWlmIChmQ01Db250ZW50ID09IG51bGwpIHsKLQkJCUNNQ29udGVudCBjb250ZW50ID0gZkVsZW1lbnREZWNsLmdldENvbnRlbnQoKTsKLQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIENNR3JvdXApCi0JCQkJZkNNQ29udGVudCA9IG5ldyBDTUdyb3VwV3JhcHBlckltcGwoZlByZWZpeCwgKENNR3JvdXApIGNvbnRlbnQpOwotCQkJZWxzZQotCQkJCWZDTUNvbnRlbnQgPSBuZXcgQ01Db250ZW50V3JhcHBlckltcGwoZlByZWZpeCwgY29udGVudCk7Ci0JCX0KLQkJcmV0dXJuIGZDTUNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29udGVudFR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBmRWxlbWVudERlY2wuZ2V0RGF0YVR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMb2NhbEVsZW1lbnRzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGxvY2FsbHkgZGVmaW5lZCBlbGVtZW50cy4KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJcmV0dXJuIGZFbGVtZW50RGVjbC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWF4T2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIC0xLCBpdCdzIFVOQk9VTkRFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldE1heE9jY3VyKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TWluT2NjdXIgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIElmIDAsIGl0J3MgT1BUSU9OQUwuCi0JICogSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsLmdldE1pbk9jY3VyKCk7Ci0JfQotCi0JcHVibGljIENNTm9kZSBnZXRPcmlnaW5Ob2RlKCkgewotCQlyZXR1cm4gZkVsZW1lbnREZWNsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwV3JhcHBlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTRjNTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTUdyb3VwV3JhcHBlckltcGwgZXh0ZW5kcyBDTUNvbnRlbnRXcmFwcGVySW1wbCBpbXBsZW1lbnRzIENNR3JvdXAgewotCWNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCB7Ci0JCXByaXZhdGUgTGlzdCBub2RlcyA9IG51bGw7Ci0KLQkJLyoqCi0JCSAqIENNTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JCSAqLwotCQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQkJbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCQkgKiBAcGFyYW0gbm9kZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCQkgKi8KLQkJcHVibGljIHZvaWQgYXBwZW5kSXRlbShDTU5vZGUgbm9kZSkgewotCQkJbm9kZXMuYWRkKG5vZGUpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIGdldExlbmd0aCBtZXRob2QKLQkJICogQHJldHVybiBpbnQKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIG5vZGVzLnNpemUoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBpdGVtIG1ldGhvZAotCQkgKiBAcmV0dXJuIENNTm9kZQotCQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JCSAqLwotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG5vZGVzLnNpemUoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5nZXQoaW5kZXgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDTU5vZGVMaXN0IGZDaGlsZE5vZGVzID0gbnVsbDsKLQlwcml2YXRlIENNR3JvdXAgZkdyb3VwID0gbnVsbDsKLQotCS8qKgotCSAqIENNR3JvdXBXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIHByZWZpeCBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Hcm91cFdyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIENNR3JvdXAgbm9kZSkgewotCQlzdXBlcihwcmVmaXgsIG5vZGUpOwotCX0KLQotCS8qKgotCSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGVMaXN0Ci0JICoKLQkgKiBSZXR1cm5zIGNoaWxkIENNTm9kZUxpc3QsIHdoaWNoIGluY2x1ZGVzIEVsZW1lbnREZWZpbml0aW9uIG9yIENNRWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJQ01Ob2RlTGlzdEltcGwgY2hpbGROb2RlcyA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJQ01Ob2RlTGlzdCBjaGlsZHJlbiA9IGZHcm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlDTU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENNR3JvdXApCi0JCQkJCWNoaWxkTm9kZXMuYXBwZW5kSXRlbShuZXcgQ01Hcm91cFdyYXBwZXJJbXBsKGZQcmVmaXgsIChDTUdyb3VwKSBjaGlsZCkpOwotCQkJCWVsc2UgaWYgKGNoaWxkIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pCi0JCQkJCWNoaWxkTm9kZXMuYXBwZW5kSXRlbShuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25XcmFwcGVySW1wbChmUHJlZml4LCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkKSk7Ci0JCQkJZWxzZQotCQkJCQkvLyBlcnJvcj8KLQkJCQkJY2hpbGROb2Rlcy5hcHBlbmRJdGVtKG5ldyBDTU5vZGVXcmFwcGVySW1wbChmUHJlZml4LCBjaGlsZCkpOwotCQkJfQotCQkJZkNoaWxkTm9kZXMgPSBjaGlsZE5vZGVzOwotCQl9Ci0JCXJldHVybiBmQ2hpbGROb2RlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPcGVyYXRpb24gbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBBTE9ORSAoYSksIFNFUVVFTkNFIChhLGIpLCBDSE9JQ0UgKGF8YiksIEFMTCAoYSZiKS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gZkdyb3VwLmdldE9wZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIENNTm9kZSBnZXRPcmlnaW5Ob2RlKCkgewotCQlyZXR1cm4gZkdyb3VwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlV3JhcHBlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxMTdmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLQotcHVibGljIGNsYXNzIENNTm9kZVdyYXBwZXJJbXBsIGltcGxlbWVudHMgQ01Ob2RlLCBDTU5vZGVXcmFwcGVyIHsKLQlwcml2YXRlIENNTm9kZSBmTm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5vZGVOYW1lID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZlByZWZpeCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5vZGVXcmFwcGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZVdyYXBwZXJJbXBsKFN0cmluZyBwcmVmaXgsIENNTm9kZSBub2RlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcmVmaXggPSBwcmVmaXg7Ci0JCWZOb2RlID0gbm9kZTsKLQotCQlmTm9kZU5hbWUgPSBmUHJlZml4ICsgIjoiICsgZk5vZGUuZ2V0Tm9kZU5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBmTm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBmTm9kZS5nZXROb2RlVHlwZSgpOwotCX0KLQotCXB1YmxpYyBDTU5vZGUgZ2V0T3JpZ2luTm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZk5vZGUuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmTm9kZS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc1ZTFjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBmYWN0b3J5IGZvciBKU1AgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSlNQQ01Eb2N1bWVudEZhY3RvcnkgewotCi0Jc3RhdGljIGNsYXNzIENNRG9jSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCQlwdWJsaWMgQ01Eb2NJbXBsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgamNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkpTUDExX0RPQ19UWVBFKTsKLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIGpjbS5nZXROb2RlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBqY20uZ2V0Tm9kZVR5cGUoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJCXJldHVybiBqY20uZ2V0RWxlbWVudHMoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJCXJldHVybiBqY20uZ2V0RW50aXRpZXMoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCQlyZXR1cm4gamNtLmdldE5hbWVzcGFjZSgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgbXljbTsKLQotCXByaXZhdGUgSlNQQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCWlmIChteWNtID09IG51bGwpIHsKLQkJCW15Y20gPSBuZXcgQ01Eb2NJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIG15Y207Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ2xpYkNvbnRyb2xsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1RhZ2xpYkNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhlMjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9UYWdsaWJDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRTZXR1cFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliSW5kZXhMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLlRhZ2xpYkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIFByb3ZpZGVzIGEgZGlyZWN0IG1hcHBpbmcgZnJvbSBJU3RydWN0dXJlZERvY3VtZW50IHRvIHN1cHBvcnRpbmcKLSAqIFRMRENNRG9jdW1lbnRNYW5hZ2VyLgotICogCi0gKiBMaXN0ZW5zIHRvIHRoZSBjcmVhdGlvbiBvZiBKU1AgdHlwZSBUZXh0RmlsZUJ1ZmZlcnMgYW5kIGZvcmNlcyBhIHRleHQtbGVzcwotICogcmVwYXJzZSBhZnRlciBjb25uZWN0aW5nIHRhZ2xpYi1zdXBwb3J0aW5nIGxpc3RlbmVycy4gQ29ubmVjdGluZyB0aGUKLSAqIGxpc3RlbmVycyBiZWZvcmUgdGhlIHRleHQgaXMgc2V0IHdvdWxkIGJlIGlkZWFsLCBidXQgdGhlcmUgaXMgbm8gd2F5IHRvCi0gKiBsb29rIHVwIHRhZ2xpYiByZWZlcmVuY2VzIHNpbmNlIHRoZSBsb2NhdGlvbiBpcyBub3QgeWV0IGtub3dhYmxlLiBTaW5jZQotICogdGFnbGlicyBjYW4gYWZmZWN0IHRoZSBwYXJzaW5nIG9mIHRoZSBkb2N1bWVudCwgYSByZXBhcnNlIGlzIGN1cnJlbnRseQotICogcmVxdWlyZWQgdG8gcmVhY3QgdG8gY3VzdG9tIHRhZ3Mgd2l0aCB0YWdkZXBlbmRlbnQgY29udGVudC4KLSAqIAotICogVE9ETzogUmVtb3ZlIHRoZSByZXBhcnNlIHBlbmFsdHkuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJDb250cm9sbGVyIGltcGxlbWVudHMgSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudCB7Ci0KLQljbGFzcyBEb2N1bWVudEluZm8gaW1wbGVtZW50cyBJVGFnbGliSW5kZXhMaXN0ZW5lciB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0RmlsZUJ1ZmZlcjsKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgdGxkRG9jdW1lbnRNYW5hZ2VyOwotCi0JCXB1YmxpYyB2b2lkIGluZGV4Q2hhbmdlZChJVGFnbGliUmVjb3JkRXZlbnQgZXZlbnQpIHsKLQkJCWludCB0eXBlID0gZXZlbnQuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gSVRhZ2xpYlJlY29yZEV2ZW50LkNIQU5HRUQgfHwgdHlwZSA9PSBJVGFnbGliUmVjb3JkRXZlbnQuUkVNT1ZFRCkgewotCQkJCU9iamVjdCBrZXkgPSBUTERDTURvY3VtZW50TWFuYWdlci5nZXRVbmlxdWVJZGVudGlmaWVyKGV2ZW50LmdldFRhZ2xpYlJlY29yZCgpKTsKLQkJCQlpZiAodGxkRG9jdW1lbnRNYW5hZ2VyLmdldERvY3VtZW50cygpLmNvbnRhaW5zS2V5KGtleSkpIHsKLQkJCQkJaWYgKF9kZWJ1Z0NhY2hlKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGNsZWFyZWQgaXRzIHByaXZhdGUgQ01Eb2N1bWVudCBjYWNoZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJdGxkRG9jdW1lbnRNYW5hZ2VyLmdldERvY3VtZW50cygpLnJlbW92ZShrZXkpOwotCQkJCQl0bGREb2N1bWVudE1hbmFnZXIuZ2V0U291cmNlUGFyc2VyKCkucmVzZXRIYW5kbGVycygpOwotCi0JCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCkucmVwYXJzZSh0aGlzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXRsZERvY3VtZW50TWFuYWdlci5pbmRleENoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnQ2FjaGUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvY2FjaGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JY2xhc3MgRmlsZUJ1ZmZlckxpc3RlbmVyIGltcGxlbWVudHMgSUZpbGVCdWZmZXJMaXN0ZW5lciB7Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjYnVmZmVyQ29udGVudEFib3V0VG9CZVJlcGxhY2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWZmZXJDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNidWZmZXJDb250ZW50UmVwbGFjZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNvbnRlbnRSZXBsYWNlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2J1ZmZlckNyZWF0ZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckNyZWF0ZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcikuZ2V0RG9jdW1lbnQoKTsKLQkJCQkvLyBpZ25vcmUgbm9uLUpTUCBkb2N1bWVudHMKLQkJCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzKSB7Ci0JCQkJCWlmICghX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMuY29udGFpbnMoZG9jdW1lbnQpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlBc3NlcnQuaXNUcnVlKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCwgZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIFNldHVwUGFydGljaXBhbnQgd2FzIGNhbGxlZCBmb3Igbm9uLUlTdHJ1Y3R1cmVkRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCURvY3VtZW50SW5mbyBpbmZvID0gbmV3IERvY3VtZW50SW5mbygpOwotCQkJCWluZm8uZG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQkJaW5mby50ZXh0RmlsZUJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpbmZvLnRsZERvY3VtZW50TWFuYWdlciA9IG5ldyBUTERDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWluZm8udGxkRG9jdW1lbnRNYW5hZ2VyLnNldFNvdXJjZVBhcnNlcigoSlNQU291cmNlUGFyc2VyKSBpbmZvLmRvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJCQlzeW5jaHJvbml6ZWQgKF9pbnN0YW5jZS5mRG9jdW1lbnRNYXApIHsKLQkJCQkJX2luc3RhbmNlLmZEb2N1bWVudE1hcC5wdXQoZG9jdW1lbnQsIGluZm8pOwotCQkJCX0KLQkJCQlUYWdsaWJJbmRleC5hZGRUYWdsaWJJbmRleExpc3RlbmVyKGluZm8pOwotCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5yZXBhcnNlKHRoaXMpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2J1ZmZlckRpc3Bvc2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBidWZmZXJEaXNwb3NlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyKS5nZXREb2N1bWVudCgpOwotCQkJCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMpIHsKLQkJCQkJaWYgKCFfaW5zdGFuY2UuZkpTUGRvY3VtZW50cy5yZW1vdmUoZG9jdW1lbnQpKQotCQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCURvY3VtZW50SW5mbyBpbmZvID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZCAoZkRvY3VtZW50TWFwKSB7Ci0JCQkJT2JqZWN0W10ga2V5cyA9IGZEb2N1bWVudE1hcC5rZXlTZXQoKS50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGtleXNbaV0pOwotCQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8udGV4dEZpbGVCdWZmZXIuZXF1YWxzKGJ1ZmZlcikpIHsKLQkJCQkJCWZEb2N1bWVudE1hcC5yZW1vdmUoa2V5c1tpXSk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQlpbmZvLnRsZERvY3VtZW50TWFuYWdlci5jbGVhckNhY2hlKCk7Ci0JCQkJVGFnbGliSW5kZXgucmVtb3ZlVGFnbGliSW5kZXhMaXN0ZW5lcihpbmZvKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI2RpcnR5U3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpcnR5U3RhdGVDaGFuZ2VkKElGaWxlQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNzdGF0ZUNoYW5nZUZhaWxlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhdGVDaGFuZ2VGYWlsZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciNzdGF0ZUNoYW5naW5nKG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXIpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5naW5nKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXIjc3RhdGVWYWxpZGF0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGF0ZVZhbGlkYXRpb25DaGFuZ2VkKElGaWxlQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBpc1N0YXRlVmFsaWRhdGVkKSB7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSUZpbGVCdWZmZXJMaXN0ZW5lciN1bmRlcmx5aW5nRmlsZURlbGV0ZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcikKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVuZGVybHlpbmdGaWxlRGVsZXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlckxpc3RlbmVyI3VuZGVybHlpbmdGaWxlTW92ZWQob3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlciwKLQkJICogICAgICBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB1bmRlcmx5aW5nRmlsZU1vdmVkKElGaWxlQnVmZmVyIGJ1ZmZlciwgSVBhdGggcGF0aCkgewotCQl9Ci0KLQotCX0KLQotCXN0YXRpYyBUYWdsaWJDb250cm9sbGVyIF9pbnN0YW5jZSA9IG51bGw7Ci0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBmSXNTaHV0ZG93biA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBJVGV4dEZpbGVCdWZmZXIgZ2V0RmlsZUJ1ZmZlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIF9pbnN0YW5jZS5mRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJCWlmIChpbmZvICE9IG51bGwpCi0JCQkJcmV0dXJuIGluZm8udGV4dEZpbGVCdWZmZXI7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBtYW5hZ2VyCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVRleHRGaWxlQnVmZmVyIGdldEZpbGVCdWZmZXIoVExEQ01Eb2N1bWVudE1hbmFnZXIgbWFuYWdlcikgewotCQkvLyBpZiBfaW5zdGFuY2UgaXMgbnVsbCwgd2UgYXJlIGFscmVhZHkgc2h1dHRpbmcgZG9udwotCQlpZiAoX2luc3RhbmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJc3luY2hyb25pemVkIChfaW5zdGFuY2UuZkRvY3VtZW50TWFwKSB7Ci0JCQlJdGVyYXRvciBkb2NJbmZvcyA9IF9pbnN0YW5jZS5mRG9jdW1lbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChkb2NJbmZvcy5oYXNOZXh0KCkgJiYgYnVmZmVyID09IG51bGwpIHsKLQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGRvY0luZm9zLm5leHQoKTsKLQkJCQlpZiAoaW5mby50bGREb2N1bWVudE1hbmFnZXIuZXF1YWxzKG1hbmFnZXIpKQotCQkJCQlidWZmZXIgPSBpbmZvLnRleHRGaWxlQnVmZmVyOwotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBUTERDTURvY3VtZW50TWFuYWdlciBnZXRUTERDTURvY3VtZW50TWFuYWdlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gaWYgX2luc3RhbmNlIGlzIG51bGwsIHdlIGFyZSBhbHJlYWR5IHNodXR0aW5nIGRvbncKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZEb2N1bWVudE1hcCkgewotCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBfaW5zdGFuY2UuZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKQotCQkJCXJldHVybiBpbmZvLnRsZERvY3VtZW50TWFuYWdlcjsKLQkJCXJldHVybiBudWxsOwotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NodXRkb3duKCkgewotCQlyZXR1cm4gZklzU2h1dGRvd247Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc2V0U2h1dGRvd24oYm9vbGVhbiBpc1NodXRkb3duKSB7Ci0JCWZJc1NodXRkb3duID0gaXNTaHV0ZG93bjsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlzZXRTaHV0ZG93bih0cnVlKTsKLQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkucmVtb3ZlRmlsZUJ1ZmZlckxpc3RlbmVyKF9pbnN0YW5jZS5mQnVmZmVyTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlfaW5zdGFuY2UgPSBuZXcgVGFnbGliQ29udHJvbGxlcigpOwotCQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuYWRkRmlsZUJ1ZmZlckxpc3RlbmVyKF9pbnN0YW5jZS5mQnVmZmVyTGlzdGVuZXIpOwotCQl9Ci0JCXNldFNodXRkb3duKGZhbHNlKTsKLQl9Ci0KLQlJRmlsZUJ1ZmZlckxpc3RlbmVyIGZCdWZmZXJMaXN0ZW5lcjsKLQotCU1hcCBmRG9jdW1lbnRNYXA7Ci0KLQlMaXN0IGZKU1Bkb2N1bWVudHM7Ci0KLQkvKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgb25seSB0byBiZSBjYWxsZWQgYXMgcGFydCBvZiB0aGUgRmlsZUJ1ZmZlcgotCSAqIGZyYW1ld29yawotCSAqLwotCXB1YmxpYyBUYWdsaWJDb250cm9sbGVyKCkgewotCQlzdXBlcigpOwotCQlmQnVmZmVyTGlzdGVuZXIgPSBuZXcgRmlsZUJ1ZmZlckxpc3RlbmVyKCk7Ci0JCWZKU1Bkb2N1bWVudHMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQlmRG9jdW1lbnRNYXAgPSBuZXcgSGFzaE1hcCgxKTsKLQl9Ci0KLQotCS8qCi0JICogVGhpcyBtZXRob2QgaXMgb25seSB0byBiZSBjYWxsZWQgYXMgcGFydCBvZiB0aGUgRmlsZUJ1ZmZlciBmcmFtZXdvcmsKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklEb2N1bWVudFNldHVwUGFydGljaXBhbnQjc2V0dXAob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0dXAoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGlmIHdlJ3ZlIGFscmVhZHkgc2h1dGRvd24sIGp1c3QgaWdub3JlCi0JCWlmIChpc1NodXRkb3duKCkpCi0JCQlyZXR1cm47Ci0JCS8vIHJlZmVyZW5jZSB0aGUgc2hhcmVkIGluc3RhbmNlJ3MgZG9jdW1lbnRzIGRpcmVjdGx5Ci0JCXN5bmNocm9uaXplZCAoX2luc3RhbmNlLmZKU1Bkb2N1bWVudHMpIHsKLQkJCV9pbnN0YW5jZS5mSlNQZG9jdW1lbnRzLmFkZChkb2N1bWVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTU5OTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGltcGxlbWVudHMgVExEQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBDTURhdGFUeXBlIGF0dHJUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbjsKLQkKLQkvLwotCXByaXZhdGUgYm9vbGVhbiBmSXNGcmFnbWVudCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZPd25lckRvY3VtZW50OwotCS8vIG9wdGlvbmFsIGlkCi0JcHJpdmF0ZSBTdHJpbmcgaWQgPSBudWxsOwotCi0JLy8gcmVxdWlyZWQgbmFtZQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCS8vIG9wdGlvbmFsICJyZXF1aXJlZCIgZWxlbWVudCBwcmVzZW50LCBkZWZhdWx0cyB0byBub3QgcHJlc2VudAotCXByaXZhdGUgYm9vbGVhbiByZXF1aXJlZCA9IGZhbHNlOwotCQotCS8vIG9wdGlvbmFsIHJ1bi10aW1lIChzY3JpcGxldCBkZXJpdmVkKSB2YWx1ZSBvZiBhdHRyaWJ1dGVzLCBkZWZhdWx0cyB0byBub25lL2ZhbHNlCi0JcHJpdmF0ZSBTdHJpbmcgcnRleHBydmFsdWUgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChDTURvY3VtZW50IG93bmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lckRvY3VtZW50ID0gb3duZXI7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0ck5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0clR5cGUgbWV0aG9kCi0JICogQHJldHVybiBDTURhdGFUeXBlCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiBhdHRyVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpbiBzdXBlcmNsYXNzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICoKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY29udGVudG1vZGVsLnRsZC5UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRPd25lckRvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gZk93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUgIT0gbnVsbCAmJiBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKSB7Ci0JCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsgLy8gcmV0dXJuIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVExERG9jdW1lbnQuQ01fS0lORCkpIHsKLQkJCXJldHVybiBUTEREb2N1bWVudC5KU1BfVExEOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikpIHsKLQkJCXJldHVybiBnZXRPd25lckRvY3VtZW50KCkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRSdGV4cHJ2YWx1ZSgpIHsKLQkJcmV0dXJuIHJ0ZXhwcnZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VXNhZ2UgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKiBPUFRJT05BTHxSRVFVSVJFRAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiByZXF1aXJlZCA/IFJFUVVJUkVEIDogT1BUSU9OQUw7Ci0JfQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgaXNGcmFnbWVudC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZyYWdtZW50KCkgewotCQlyZXR1cm4gZklzRnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlcXVpcmVkOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gVGhlIGRlc2NyaXB0aW9uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBpc0ZyYWdtZW50IFRoZSBpc0ZyYWdtZW50IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGcmFnbWVudChib29sZWFuIGlzRnJhZ21lbnQpIHsKLQkJZklzRnJhZ21lbnQgPSBpc0ZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdJZCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIG5ld0lkKSB7Ci0JCWlkID0gbmV3SWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZU5hbWUoU3RyaW5nIHN0cmluZykgewotCQluYW1lID0gc3RyaW5nOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZXF1aXJlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoYm9vbGVhbiBuZXdSZXF1aXJlZCkgewotCQlyZXF1aXJlZCA9IG5ld1JlcXVpcmVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZXF1aXJlZCBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVxdWlyZWRTdHJpbmcoU3RyaW5nIG5ld1JlcXVpcmVkKSB7Ci0JCWlmIChuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIikgfHwgbmV3UmVxdWlyZWQuZXF1YWxzSWdub3JlQ2FzZSgieWVzIikpIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQlzZXRSZXF1aXJlZCh0cnVlKTsKLQkJZWxzZSBpZiAobmV3UmVxdWlyZWQuZXF1YWxzSWdub3JlQ2FzZSgiZmFsc2UiKSB8fCBuZXdSZXF1aXJlZC5lcXVhbHNJZ25vcmVDYXNlKCJubyIpKSAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJc2V0UmVxdWlyZWQoZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSdGV4cHJ2YWx1ZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UnRleHBydmFsdWUoU3RyaW5nIG5ld1J0ZXhwcnZhbHVlKSB7Ci0JCXJ0ZXhwcnZhbHVlID0gbmV3UnRleHBydmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotCQl0aGlzLnR5cGUgPSB0eXBlOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lID09IG51bGwgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFRMRERvY3VtZW50LkNNX0tJTkQpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCAiICsgc3VwZXIudG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0Tm9kZU5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCS8vIEJvb2xlYW4udG9TdHJpbmcoYm9vbGVhbikgaXMgaW50cm9kdWNlZCBpbiAxLjQKLQkJLy9idWZmZXIuYXBwZW5kKCJcblx0IHJlcXVpcmVkOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoQm9vbGVhbi50b1N0cmluZyhpc1JlcXVpcmVkKCkpKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgcmVxdWlyZWQ6IiArIFN0cmluZ1V0aWxzLnRvU3RyaW5nKGlzUmVxdWlyZWQoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgcnRleHByOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0UnRleHBydmFsdWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChnZXRJZCgpICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKCJcblx0IGlkOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0SWQoKSkpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRGF0YVR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlMDgxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01EYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZSB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGRhdGFUeXBlTmFtZTsKLQotCXB1YmxpYyBDTURhdGFUeXBlSW1wbChTdHJpbmcgZGF0YVR5cGVOYW1lKSB7Ci0JCXRoaXMuZGF0YVR5cGVOYW1lID0gZGF0YVR5cGVOYW1lOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgaXMgY3JlYXRlZC4KLQkgKiBUaGlzIHJldHVybnMgbnVsbCBvZiBhIHN1aXRhYmxlIGRlZmF1bHQgaXMgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKSB7Ci0JCXJldHVybiBkYXRhVHlwZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgIAotCSAqCi0JICogUmV0dXJucyB0aGUgaW1wbGllZCB2YWx1ZSBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRJbXBsaWVkVmFsdWVLaW5kIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICogSU1QTElFRF9WQUxVRV9OT05FLCBJTVBMSUVEX1ZBTFVFX0ZJWEVELCBJTVBMSUVEX1ZBTFVFX0RFRkFVTFQuCi0JICovCi0JcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQlyZXR1cm4gSU1QTElFRF9WQUxVRV9OT05FOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBkYXRhVHlwZU5hbWU7Ci0JfQotCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY3JpYmVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzdXBwb3J0cyBtZXRob2QKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICoKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRGYWN0b3J5VExELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEZhY3RvcnlUTEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJhMzhhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEZhY3RvcnlUTEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMjBUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTEREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERGdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERJbml0UGFyYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExETGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExEVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsLkRvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JSmFyUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRMRFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVVJMUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBDTURvY3VtZW50QnVpbGRlciBmb3IgVGFnbGliIERlc2NyaXB0b3JzCi0gKiAKLSAqIFJldHVybnMgbmFtZXNwYWNlLWxlc3MgQ01Eb2N1bWVudHMgZm9yIGEgdGFnbGliIGRlc2NyaXB0b3IsIGxvYWRpbmcgaXQKLSAqIGRpcmVjdGx5IGZyb20gYSBmaWxlIG9yIGV4dHJhY3RlZCBmcm9tIGEgSkFSIGFyY2hpdmUuIENvbnRlbnQgTW9kZWwgb2JqZWN0cwotICogd2lsbCBpbXBsZW1lbnQgdGhlIFRMRENNRG9jdW1lbnQsIFRMREVsZW1lbnREZWNsYXJhdGlvbiwgYW5kCi0gKiBUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbnRlcmZhY2VzIGZvciBleHRlbmRlZCBwcm9wZXJ0aWVzLgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlUTEQgaW1wbGVtZW50cyBDTURvY3VtZW50RmFjdG9yeSB7Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RsZGNtZG9jdW1lbnQvZmFjdG9yeSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkvKioKLQkgKiBDTURvY3VtZW50RmFjdG9yeVRMRCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVRMRCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgQVBJCi0JICogCi0JICogQHBhcmFtIGJhc2Vsb2NhdGlvbgotCSAqIEBwYXJhbSBpbnB1dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIGJhc2Vsb2NhdGlvbiwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTFUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbShpbnB1dCk7Ci0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkKLQkJCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoYmFzZWxvY2F0aW9uKTsKLQkJcmV0dXJuIGxvYWREb2N1bWVudChiYXNlbG9jYXRpb24sIHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbURpcmVjdG9yeShGaWxlIGRpcmVjdG9yeSkgewotCQlpZiAoX2RlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBpbXBsZW1lbnRlZDogdGFnZGlyIGxvYWRpbmcgZm9yICIgKyBkaXJlY3RvcnkuZ2V0QWJzb2x1dGVQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogTk9UIEFQSQotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnRGcm9tRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJLy8gbG9hZCB0aGUgdGFnbGliIGRlc2NyaXB0b3IgZmlsZQotCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJcHJvdmlkZXIuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0JCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoZmlsZU5hbWUpOwotCQlwcm92aWRlci5zZXRSb290RWxlbWVudE5hbWUoSlNQMTFUTEROYW1lcy5UQUdMSUIpOwotCQlwcm92aWRlci5zZXRGaWxlTmFtZShmaWxlTmFtZSk7Ci0JCU5vZGUgcm9vdEVsZW1lbnQgPSBwcm92aWRlci5nZXRSb290RWxlbWVudCgpOwotCQlyZXR1cm4gbG9hZERvY3VtZW50KGZpbGVOYW1lLCByb290RWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQnVpbGRzIGEgQ01Eb2N1bWVudCBhc3N1bWluZyB0aGUgSlNQIHYxLjEgZGVmYXVsdCBwYXRoCi0JICogCi0JICogQHBhcmFtIGphckZpbGVOYW1lIC0KLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBjb250YWluaW5nIEpBUiBmaWxlCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50RnJvbUphcihTdHJpbmcgamFyRmlsZU5hbWUpIHsKLQkJLy8gbG9hZCB0aGUgdGFnbGliIGRlc2NyaXB0b3IgZmlsZQotCQlyZXR1cm4gYnVpbGRDTURvY3VtZW50RnJvbUphcihqYXJGaWxlTmFtZSwgSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQik7Ci0JfQotCi0JLyoqCi0JICogQnVpbGRzIGEgQ01Eb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBqYXJGaWxlTmFtZSAtCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgY29udGFpbmluZyBKQVIgZmlsZQotCSAqIEBwYXJhbSBjb250ZW50RmlsZU5hbWUgLQotCSAqICAgICAgICAgICAgdGhlIHBhdGggd2l0aGluIHRoZSBKQVIgZm9yIGEgdmFsaWQgdGFnbGliIGRlc2NyaXB0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnRGcm9tSmFyKFN0cmluZyBqYXJGaWxlTmFtZSwgU3RyaW5nIGNvbnRlbnRGaWxlTmFtZSkgewotCQkvLyBsb2FkIHRoZSB0YWdsaWIgZGVzY3JpcHRvciBmaWxlCi0JCURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgRG9jdW1lbnRQcm92aWRlcigpOwotCQlwcm92aWRlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJcHJvdmlkZXIuc2V0QmFzZVJlZmVyZW5jZShqYXJGaWxlTmFtZSk7Ci0JCXByb3ZpZGVyLnNldFJvb3RFbGVtZW50TmFtZShKU1AxMVRMRE5hbWVzLlRBR0xJQik7Ci0JCXByb3ZpZGVyLnNldEphckZpbGVOYW1lKGphckZpbGVOYW1lKTsKLQkJcHJvdmlkZXIuc2V0RmlsZU5hbWUoY29udGVudEZpbGVOYW1lKTsKLQkJQ01Eb2N1bWVudCBkb2N1bWVudCA9IGxvYWREb2N1bWVudCgiamFyOmZpbGU6Ly8iICsgamFyRmlsZU5hbWUgKyAiISIgKyBjb250ZW50RmlsZU5hbWUsIHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJLy8gVE9ETzogQWRkIHRoZSB0YWdzIGRlY2xhcmVkIGluIE1FVEEtSU5GL3RhZ3MsIHNlZSBKU1AgMi4wIHNlY3Rpb24KLQkJLy8gOC40LjEKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCXByb3RlY3RlZCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgYXR0ck5vZGUpIHsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYXR0ciA9IG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChkb2N1bWVudCk7Ci0KLQkJTm9kZSBjaGlsZCA9IGF0dHJOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0Tm9kZU5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDExVExETmFtZXMuSUQpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldElkKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTFUTEROYW1lcy5SRVFVSVJFRCkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWF0dHIuc2V0UmVxdWlyZWRTdHJpbmcoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLlJURVhQUlZBTFVFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJYXR0ci5zZXRSdGV4cHJ2YWx1ZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDIwVExETmFtZXMuRlJBR01FTlQpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlhdHRyLnNldEZyYWdtZW50KEJvb2xlYW4udmFsdWVPZihnZXRDb250YWluZWRUZXh0KGNoaWxkKSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQgZnJvbSBhIHRhZ2xpYiBkZXNjcmlwdG9yCi0JICogCi0JICogQHBhcmFtIHVyaSAtCi0JICogICAgICAgICAgICB0aGUgbG9jYXRpb24gb2YgYSB2YWxpZCB0YWdsaWIgZGVzY3JpcHRvcgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSkgewotCQlDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCVVSTCB1cmwgPSBudWxsOwotCQl0cnkgewotCQkJdXJsID0gbmV3IFVSTCh1cmkpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gY3JlYXRlQ01Eb2N1bWVudEZyb21GaWxlKHVyaSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHVybCAhPSBudWxsKSB7Ci0JCQlpZiAodXJsLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGNyZWF0ZUNNRG9jdW1lbnRGcm9tRmlsZSh1cmwuZ2V0RmlsZSgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qKgotCQkJCSAqIFNraXAgYW55dGhpbmcgZWxzZSBzaW5jZSB0cnlpbmcgdG8gbG9hZCBhIFRMRCBmcm9tIGEgcmVtb3RlCi0JCQkJICogbG9jYXRpb24gaGFzIHVucHJlZGljdGFibGUgcGVyZm9ybWFuY2UgaW1wYWN0LgotCQkJCSAqLwotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG5ldyBDTURvY3VtZW50SW1wbCgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudEZyb21GaWxlKFN0cmluZyBmaWxlTmFtZSkgewotCQlDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCUZpbGUgZmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKLQkJdHJ5IHsKLQkJCWlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCQlyZXN1bHQgPSBidWlsZENNRG9jdW1lbnRGcm9tRGlyZWN0b3J5KGZpbGUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJaWYgKGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGJ1aWxkQ01Eb2N1bWVudEZyb21KYXIoZmlsZU5hbWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoZmlsZU5hbWUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihDTURvY3VtZW50IGNtZG9jdW1lbnQsIEVsZW1lbnQgdGFnRmlsZU5vZGUsIFN0cmluZyBwYXRoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoY21kb2N1bWVudCk7Ci0JCWJvb2xlYW4gaGFzTmFtZSA9IGZhbHNlOwotCi0JCS8vIGxvYWQgaW5mb3JtYXRpb24gZGVjbGFyZWQgd2l0aGluIHRoZSAudGxkCi0JCU5vZGUgY2hpbGQgPSB0YWdGaWxlTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ESVNQTEFZX05BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXREaXNwbGF5TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkVYQU1QTEUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRFeGFtcGxlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFNtYWxsSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLk5BTUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXROb2RlTmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJCWhhc05hbWUgPSBlZC5nZXROb2RlTmFtZSgpLnRyaW0oKS5sZW5ndGgoKSA+IDA7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlBBVEgpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRQYXRoKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuVEFHX0VYVEVOU0lPTikpIHsKLQkJCQkJZWQuZ2V0RXh0ZW5zaW9ucygpLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWlmIChoYXNOYW1lKSB7Ci0JCQkvLyBsb2FkIGluZm9ybWF0aW9uIGRlY2xhcmVkIHdpdGhpbiB0aGUgLnRhZyh4KSBmaWxlCi0JCQkvLyBKU1AyX1RPRE86IGltcGxlbWVudCBmb3IgSlNQIDIuMAotCQkJcmV0dXJuIGVkOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oQ01Eb2N1bWVudCBkb2N1bWVudCwgTm9kZSB0YWdOb2RlKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IG5ldyBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwoZG9jdW1lbnQpOwotCi0JCU5vZGUgY2hpbGQgPSB0YWdOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJLy8gdGFnIGluZm9ybWF0aW9uCi0JCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuTkFNRSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldE5vZGVOYW1lKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRBR0NMQVNTKSB8fCBub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdfQ0xBU1MpKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0VGFnY2xhc3MoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEVJQ0xBU1MpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRFSV9DTEFTUykpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllZC5zZXRUZWljbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5CT0RZQ09OVEVOVCkgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuQk9EWV9DT05URU5UKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCVN0cmluZyBib2R5Y29udGVudCA9IGdldENvbnRhaW5lZFRleHQoY2hpbGQpOwotCQkJCQkvLyBBcHBhcmVudGx5LCBBcGFjaGUgVG9tY2F0IGlzIG5vdCBjYXNlIHNlbnNpdGl2ZSBhYm91dAotCQkJCQkvLyB0aGVzZSB2YWx1ZXMKLQkJCQkJaWYgKGJvZHljb250ZW50LmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFUTEROYW1lcy5DT05URU5UX0pTUCkpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AxMVRMRE5hbWVzLkNPTlRFTlRfSlNQKTsKLQkJCQkJZWxzZSBpZiAoYm9keWNvbnRlbnQuZXF1YWxzSWdub3JlQ2FzZShKU1AxMVRMRE5hbWVzLkNPTlRFTlRfVEFHREVQRU5ERU5UKSkKLQkJCQkJCWVkLnNldEJvZHljb250ZW50KEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQpOwotCQkJCQllbHNlIGlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWSkpCi0JCQkJCQllZC5zZXRCb2R5Y29udGVudChKU1AxMVRMRE5hbWVzLkNPTlRFTlRfRU1QVFkpOwotCQkJCQllbHNlIGlmIChib2R5Y29udGVudC5lcXVhbHNJZ25vcmVDYXNlKEpTUDIwVExETmFtZXMuQ09OVEVOVF9TQ1JJUFRMRVNTKSkKLQkJCQkJCWVkLnNldEJvZHljb250ZW50KEpTUDIwVExETmFtZXMuQ09OVEVOVF9TQ1JJUFRMRVNTKTsKLQkJCQl9Ci0JCQkJLy8gaW5mbyAoMS4xIG9ubHkpIG9yIGRlc2NyaXB0aW9uICgxLjIgb25seSkKLQkJCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuSU5GTykgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuREVTQ1JJUFRJT04pKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0RGVzY3JpcHRpb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuQVRUUklCVVRFKSkgewotCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCQllZC5mQXR0cmlidXRlcy5zZXROYW1lZEl0ZW0oYXR0ci5nZXRBdHRyTmFtZSgpLCBhdHRyKTsKLQkJCQl9Ci0JCQkJLy8gdmFyaWFibGVzCi0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEUpKSB7Ci0JCQkJCWVkLmdldFZhcmlhYmxlcygpLmFkZChjcmVhdGVWYXJpYWJsZShjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZWQuc2V0TGFyZ2VJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWVkLnNldFNtYWxsSWNvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR19FWFRFTlNJT04pICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJZWQuZ2V0RXh0ZW5zaW9ucygpLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExERnVuY3Rpb24gY3JlYXRlRnVuY3Rpb24oQ01Eb2N1bWVudCBkb2N1bWVudCwgTm9kZSBmdW5jdGlvbk5vZGUpIHsKLQkJVExERnVuY3Rpb25JbXBsIGZ1bmN0aW9uID0gbmV3IFRMREZ1bmN0aW9uSW1wbChkb2N1bWVudCk7Ci0JCWJvb2xlYW4gaGFzTmFtZSA9IGZhbHNlOwotCi0JCU5vZGUgY2hpbGQgPSBmdW5jdGlvbk5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkvLyB0YWcgaW5mb3JtYXRpb24KLQkJCQlTdHJpbmcgbm9kZU5hbWUgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkVYQU1QTEUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXRFeGFtcGxlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRlVOQ1RJT05fQ0xBU1MpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5zZXRDbGFzc05hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5GVU5DVElPTl9FWFRFTlNJT04pICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlmdW5jdGlvbi5nZXRFeHRlbnNpb25zKCkuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuRlVOQ1RJT05fU0lHTkFUVVJFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0U2lnbmF0dXJlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDIwVExETmFtZXMuSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWZ1bmN0aW9uLnNldEljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJZnVuY3Rpb24uc2V0TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJCWhhc05hbWUgPSBmdW5jdGlvbi5nZXROYW1lKCkudHJpbSgpLmxlbmd0aCgpID4gMDsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJaWYgKGhhc05hbWUpIHsKLQkJCXJldHVybiBmdW5jdGlvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExESW5pdFBhcmFtIGNyZWF0ZUluaXRQYXJhbShOb2RlIGluaXRQYXJhbU5vZGUpIHsKLQkJVExESW5pdFBhcmFtSW1wbCBpbml0UGFyYW0gPSBuZXcgVExESW5pdFBhcmFtSW1wbCgpOwotCQlOb2RlIGNoaWxkID0gaW5pdFBhcmFtTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9QQVJBTV9OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJaW5pdFBhcmFtLnNldE5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5WQUxJREFUT1JfUEFSQU1fVkFMVUUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbml0UGFyYW0uc2V0VmFsdWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCWluaXRQYXJhbS5zZXREZXNjcmlwdGlvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBpbml0UGFyYW07Ci0JfQotCi0JcHJvdGVjdGVkIFRMRExpc3RlbmVyIGNyZWF0ZUxpc3RlbmVyKE5vZGUgbGlzdGVuZXJOb2RlKSB7Ci0JCVRMRExpc3RlbmVySW1wbCBsaXN0ZW5lciA9IG5ldyBUTERMaXN0ZW5lckltcGwoKTsKLQkJTm9kZSBjaGlsZCA9IGxpc3RlbmVyTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxJU1RFTkVSX0NMQVNTKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJbGlzdGVuZXIuc2V0TGlzdGVuZXJDbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiBsaXN0ZW5lcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVExEVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcihOb2RlIHZhbGlkYXRvck5vZGUpIHsKLQkJVExEVmFsaWRhdG9ySW1wbCB2YWxpZGF0b3IgPSBuZXcgVExEVmFsaWRhdG9ySW1wbCgpOwotCQlOb2RlIGNoaWxkID0gdmFsaWRhdG9yTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9DTEFTUykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhbGlkYXRvci5zZXRWYWxpZGF0b3JDbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBTElEQVRPUl9JTklUX1BBUkFNKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFsaWRhdG9yLmdldEluaXRQYXJhbXMoKS5hZGQoY3JlYXRlSW5pdFBhcmFtKGNoaWxkKSk7Ci0JCQkJfQotCQkJfQotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIFRMRFZhcmlhYmxlIGNyZWF0ZVZhcmlhYmxlKE5vZGUgdmFyaWFibGVOb2RlKSB7Ci0JCVRMRFZhcmlhYmxlSW1wbCB2YXJpYWJsZSA9IG5ldyBUTERWYXJpYWJsZUltcGwoKTsKLQkJTm9kZSBjaGlsZCA9IHZhcmlhYmxlTm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBub2RlTmFtZSA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0NMQVNTKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0VmFyaWFibGVDbGFzcyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFX0RFQ0xBUkUpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQl2YXJpYWJsZS5zZXREZWNsYXJlU3RyaW5nKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9GUk9NX0FUVFJJQlVURSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldE5hbWVGcm9tQXR0cmlidXRlKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFSSUFCTEVfTkFNRV9HSVZFTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldE5hbWVHaXZlbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlZBUklBQkxFX1NDT1BFKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJdmFyaWFibGUuc2V0U2NvcGUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJCXZhcmlhYmxlLnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHZhcmlhYmxlOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGFpbmVkVGV4dChOb2RlIHBhcmVudCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW4uaXRlbSgwKS5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQlTdHJpbmcgcmVmZXJlbmNlID0gKChFbnRpdHlSZWZlcmVuY2UpIGNoaWxkKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocmVmZXJlbmNlID09IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJlZmVyZW5jZSA9ICImIiArIGNoaWxkLmdldE5vZGVOYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJcy5hcHBlbmQocmVmZXJlbmNlLnRyaW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcy5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKTsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcy50b1N0cmluZygpLnRyaW0oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0J1aWxkZXJGb3JHcmFtbWFyKFN0cmluZyBncmFtbWFyRmlsZU5hbWUpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZ3JhbW1hckZpbGVOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCXJldHVybiBmaWxlTmFtZS5lbmRzV2l0aCgiLnRsZCIpIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCIuamFyIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGxvYWREb2N1bWVudChTdHJpbmcgYmFzZUxvY2F0aW9uLCBOb2RlIHRhZ2xpYikgewotCQlOb2RlIHJvb3QgPSB0YWdsaWI7Ci0KLQkJLy8gY3JlYXRlIHRoZSBDTURvY3VtZW50Ci0JCUNNRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbmV3IENNRG9jdW1lbnRJbXBsKCk7Ci0JCWRvY3VtZW50LnNldEJhc2VMb2NhdGlvbihiYXNlTG9jYXRpb24pOwotCi0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCWlmIChfZGVidWcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm51bGwgXCJ0YWdsaWJcIiBlbGVtZW50IGZvciBUTEQgIiArIGJhc2VMb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBkb2N1bWVudDsKLQkJfQotCi0JCS8vIHBvcHVsYXRlIHRoZSBDTURvY3VtZW50Ci0JCU5vZGUgY2hpbGQgPSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIG5vZGVOYW1lID0gY2hpbGQuZ2V0Tm9kZU5hbWUoKTsKLQkJCS8vIHRhZwotCQkJaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRBRykpIHsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGNyZWF0ZUVsZW1lbnREZWNsYXJhdGlvbihkb2N1bWVudCwgY2hpbGQpOwotCQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50LmZFbGVtZW50cy5zZXROYW1lZEl0ZW0oZWQuZ2V0Tm9kZU5hbWUoKSwgZWQpOwotCQkJCX0KLQkJCX0KLQkJCS8vIHRhZy1maWxlCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMjBUTEROYW1lcy5UQUdfRklMRSkgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlFbGVtZW50IHRhZ0ZpbGVFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCVN0cmluZyBwYXRoID0gdGFnRmlsZUVsZW1lbnQuZ2V0QXR0cmlidXRlKEpTUDIwVExETmFtZXMuUEFUSCk7Ci0KLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKSBjcmVhdGVFbGVtZW50RGVjbGFyYXRpb24oZG9jdW1lbnQsIHRhZ0ZpbGVFbGVtZW50LCBwYXRoKTsKLQkJCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudC5mRWxlbWVudHMuc2V0TmFtZWRJdGVtKGVkLmdldE5vZGVOYW1lKCksIGVkKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBvdGhlciBvbmUtb2YtYS1raW5kIGNoaWxkcmVuCi0JCQkvLyBKU1AgdmVyc2lvbgotCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLkpTUFZFUlNJT04pIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkpTUF9WRVJTSU9OKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0SnNwdmVyc2lvbihnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyB0YWcgbGlicmFyeSB2ZXJzaW9uCi0JCQllbHNlIGlmICgobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVExJQlZFUlNJT04pIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRMSUJfVkVSU0lPTikpICYmIGNoaWxkLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWRvY3VtZW50LnNldFRsaWJ2ZXJzaW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIHNob3J0IG5hbWUKLQkJCWVsc2UgaWYgKChub2RlTmFtZS5lcXVhbHMoSlNQMTFUTEROYW1lcy5TSE9SVE5BTUUpIHx8IG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlNIT1JUX05BTUUpKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRTaG9ydG5hbWUoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gVVJJL1VSTgotCQkJZWxzZSBpZiAoKG5vZGVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLlVSSSkgfHwgbm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVVJOKSkgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlkb2N1bWVudC5zZXRVcmkoZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gaW5mbwotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuSU5GTykgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0SW5mbyhnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBOZXcgSlNQIDEuMgotCQkJLy8gZGVzY3JpcHRpb24KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSkgewotCQkJCWRvY3VtZW50LnNldERlc2NyaXB0aW9uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIGRpc3BsYXkgbmFtZQotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuRElTUExBWV9OQU1FKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXREaXNwbGF5TmFtZShnZXRDb250YWluZWRUZXh0KGNoaWxkKSk7Ci0JCQl9Ci0JCQkvLyBsYXJnZSBpY29uCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MQVJHRV9JQ09OKSAmJiBjaGlsZC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQlkb2N1bWVudC5zZXRMYXJnZUljb24oZ2V0Q29udGFpbmVkVGV4dChjaGlsZCkpOwotCQkJfQotCQkJLy8gc21hbGwgaWNvbgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgJiYgY2hpbGQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJZG9jdW1lbnQuc2V0U21hbGxJY29uKGdldENvbnRhaW5lZFRleHQoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIHZhbGlkYXRvcgotCQkJZWxzZSBpZiAobm9kZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVkFMSURBVE9SKSkgewotCQkJCWRvY3VtZW50LnNldFZhbGlkYXRvcihjcmVhdGVWYWxpZGF0b3IoY2hpbGQpKTsKLQkJCX0KLQkJCS8vIGxpc3RlbmVyCi0JCQllbHNlIGlmIChub2RlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5MSVNURU5FUikpIHsKLQkJCQlkb2N1bWVudC5nZXRMaXN0ZW5lcnMoKS5hZGQoY3JlYXRlTGlzdGVuZXIoY2hpbGQpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLkZVTkNUSU9OKSkgewotCQkJCVRMREZ1bmN0aW9uIGZ1bmN0aW9uID0gY3JlYXRlRnVuY3Rpb24oZG9jdW1lbnQsIGNoaWxkKTsKLQkJCQlpZiAoZnVuY3Rpb24gIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudC5nZXRGdW5jdGlvbnMoKS5hZGQoZnVuY3Rpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVOYW1lLmVxdWFscyhKU1AyMFRMRE5hbWVzLlRBR0xJQl9FWFRFTlNJT04pKSB7Ci0JCQkJZG9jdW1lbnQuZ2V0RXh0ZW5zaW9ucygpLmFkZChjaGlsZCk7Ci0JCQl9Ci0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZmVyZW5jZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KElUYWdsaWJSZWNvcmQgcmVmZXJlbmNlKSB7Ci0JCUNNRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbnVsbDsKLQkJc3dpdGNoIChyZWZlcmVuY2UuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCUlSZXNvdXJjZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHJlY29yZC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50RnJvbUZpbGUoZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCQlpZiAoX2RlYnVnICYmIGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhaWx1cmUgcGFyc2luZyAiICsgcmVjb3JkLmdldFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCWlmIChkb2N1bWVudC5nZXRTbWFsbEljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuU01BTExfSUNPTiwgImZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChkb2N1bWVudC5nZXRMYXJnZUljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRMYXJnZUljb24oKSwgZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksICIvIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTiwgImZpbGU6IiArIGljb25QYXRoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCUlKYXJSZWNvcmQgcmVjb3JkID0gKElKYXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlkb2N1bWVudCA9IChDTURvY3VtZW50SW1wbCkgYnVpbGRDTURvY3VtZW50RnJvbUphcihyZWNvcmQuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQkJCQlpZiAoZG9jdW1lbnQuZ2V0U21hbGxJY29uKCkgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgaWNvblBhdGggPSBVUklIZWxwZXIubm9ybWFsaXplKCgoVExERG9jdW1lbnQpIGRvY3VtZW50KS5nZXRTbWFsbEljb24oKSwgcmVjb3JkLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIhTUVUQS1JTkYvIiwgIi8iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuU01BTExfSUNPTiwgImphcjpmaWxlOiIgKyBpY29uUGF0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaWYgKGRvY3VtZW50LmdldExhcmdlSWNvbigpICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0TGFyZ2VJY29uKCksIHJlY29yZC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkgKyAiIU1FVEEtSU5GLyIsICIvIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlkb2N1bWVudC5zZXRQcm9wZXJ0eShKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04sICJqYXI6ZmlsZToiICsgaWNvblBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImZhaWx1cmUgcGFyc2luZyAiICsgcmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UQUdESVIpIDogewotCQkJCS8vIFRhZ0RpclJlY29yZCByZWNvcmQgPSAoVGFnRGlyUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJLy8gZG9jdW1lbnQgPQotCQkJCS8vIGJ1aWxkQ01Eb2N1bWVudEZyb21EaXJlY3RvcnkocmVjb3JkLmdldExvY2F0aW9uKCkudG9GaWxlKCkpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCUlVUkxSZWNvcmQgcmVjb3JkID0gKElVUkxSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlJbnB1dFN0cmVhbSB1cmxDb250ZW50cyA9IG51bGw7Ci0JCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljb25uZWN0aW9uID0gcmVjb3JkLmdldFVSTCgpLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJCWlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLQkJCQkJCWNvbm5lY3Rpb24uc2V0VXNlQ2FjaGVzKGZhbHNlKTsKLQkJCQkJCXVybENvbnRlbnRzID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJCQkJZG9jdW1lbnQgPSAoQ01Eb2N1bWVudEltcGwpIGJ1aWxkQ01Eb2N1bWVudChyZWNvcmQuZ2V0QmFzZUxvY2F0aW9uKCksIHVybENvbnRlbnRzKTsKLQkJCQkJCWlmIChkb2N1bWVudC5nZXRTbWFsbEljb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIGljb25QYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZSgoKFRMRERvY3VtZW50KSBkb2N1bWVudCkuZ2V0U21hbGxJY29uKCksIHJlY29yZC5nZXRVUkwoKS50b1N0cmluZygpLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZG9jdW1lbnQuc2V0UHJvcGVydHkoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OLCBpY29uUGF0aCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoZG9jdW1lbnQuZ2V0TGFyZ2VJY29uKCkgIT0gbnVsbCkgewotCQkJCQkJCVN0cmluZyBpY29uUGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUoKChUTEREb2N1bWVudCkgZG9jdW1lbnQpLmdldExhcmdlSWNvbigpLCByZWNvcmQuZ2V0VVJMKCkudG9TdHJpbmcoKSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWRvY3VtZW50LnNldFByb3BlcnR5KEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTiwgaWNvblBhdGgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdCB1bmNvbW1vbiBnaXZlbiBpbnZhbGlkIFVSTHMKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmICh1cmxDb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCXVybENvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNRG9jdW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY0N2M3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01Eb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvbkZpbGVJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uRmlsZVBhcnNlcjsKLQotcHVibGljIGNsYXNzIENNRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgVExERG9jdW1lbnQgewotCQotCS8qKiBDb250YWlucyB0YWdpbmZvIGFuZC9vciBhbnkgb3RoZXIgbWlzYyBwcm9wZXJ0aWVzKi8KLQlwcml2YXRlIEFubm90YXRpb25NYXAgZkFubm90YXRpb25NYXAgPSBudWxsOwotCQotCXByaXZhdGUgTWFwIGZQcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXAoMCk7Ci0KLQkvKioKLQkgKiBSZWNvcmRzIGZyb20gd2hlcmUgdGhpcyBkb2N1bWVudCB3YXMgY3JlYXRlZAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZCYXNlTG9jYXRpb247Ci0JLyoqIAotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmRGVzY3JpcHRpb247Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlOYW1lOwotCi0JLyoqCi0JICogTk9UIHB1YmxpYyBBUEkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGZFbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCXByaXZhdGUgTGlzdCBmRnVuY3Rpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQkKLQkvLyBpZCBvZiB0aGUgdGFnbGliCi0JcHJpdmF0ZSBTdHJpbmcgZklkID0gbnVsbDsKLQkvKioKLQkgKiBDaGlsZHJlbiBvZiAidGFnbGliIiB3aXRoaW4gYSAudGxkIGZpbGUgZWFjaCBhbGxvdwotCSAqIG9uZSBUZXh0IG5vZGUgKCNQQ0RBVEEpIGJlbmVhdGggdGhlbS4gIFN0b3JlIHRoZSB2YWx1ZXMKLQkgKiBoZXJlIGZvciBzaW1wbGljaXR5LgotCSAqLwotCS8vIFRoZSBKU1Agc3BlY2lmaWNhdGlvbiByZXF1aXJlZCBmb3IgdGhpcyB0YWdsaWIgdG8gZnVuY3Rpb24KLQlwcml2YXRlIFN0cmluZyBmSlNQVmVyc2lvbiA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZkxhcmdlSWNvbjsKLQotCXByaXZhdGUgTGlzdCBmTGlzdGVuZXJzOwotCQotCXByaXZhdGUgU3RyaW5nIGZQYXJlbnRVUkkgPSBudWxsOwotCS8vIEEgc2hvcnQgbmFtZSBzdWdnZXN0ZWQgYXMgdGhlIGRlZmF1bHQgcHJlZml4IGZvciB0YWdzIHdpdGhpbiB0aGUgbGliCi0JcHJpdmF0ZSBTdHJpbmcgZlNob3J0TmFtZSA9IG51bGw7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZlNtYWxsSWNvbjsKLQkKLQkvKioKLQkgKiBzaW5jZSBKU1AgMi4wCi0JICogCi0JICogVGhlIGVudGlyZSBlbGVtZW50IGlzIHN0b3JlZCBoZXJlIHNpbmNlIGl0cyBsYXlvdXQgaXMgdW5kZWZpbmVkIAotCSAqLwotCXByaXZhdGUgTGlzdCBmVGFnbGliRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCi0JLy8gVmVyc2lvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhZ2xpYiBpdHNlbGYKLQlwcml2YXRlIFN0cmluZyBmVExpYlZlcnNpb24gPSBudWxsOwotCQotCS8vIEEgdW5pcXVlIHB1YmxpYyBVUkkgZGVzY3JpYmluZyB0aGlzIHRhZ2xpYi4gIFJlY29tbWVuZGVkIHRvIGJlIHRoZSBVUkwKLQkvLyB0byB0aGUgZGVzY3JpcHRvcgotCXByaXZhdGUgU3RyaW5nIGZVUkkgPSBudWxsOwotCi0JcHJvdGVjdGVkIFRMRFZhbGlkYXRvciB2YWxpZGF0b3I7Ci0JCi0JLyoqCi0JICogQ01Eb2N1bWVudEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhbm5vdGF0aW9uIG1hcCBhc3NvY2lhdGVkIHdpdGggdGhpcyBkb2N1bWVudC4gIExhemlseSBjcmVhdGVzCi0JICogYW5kIGxvYWRzIGFubm90YXRpb24gbWFwLgotCSAqIEByZXR1cm4gQW5ub3RhdGlvbk1hcAotCSAqLwotCXByaXZhdGUgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkvLyBjcmVhdGUgYSBuZXcgYW5ub3RhdGlvbiBtYXAgYW5kIGxvYWQgaXQgdXAKLQkJaWYgKGZBbm5vdGF0aW9uTWFwID09IG51bGwpIHsKLQkJCWZBbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLQkJCQotCQkJTGlzdCBhbm5vdGF0aW9uRmlsZXMgPSBDb250ZW50TW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MoZ2V0VXJpKCkpOwotCQkgICAgZm9yIChJdGVyYXRvciBpID0gYW5ub3RhdGlvbkZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkgICAgCXRyeSB7Ci0JCSAgICAJCUFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbyA9IChBbm5vdGF0aW9uRmlsZUluZm8pIGkubmV4dCgpOwotCQkgICAgCQlBbm5vdGF0aW9uRmlsZVBhcnNlciBwYXJzZXIgPSBuZXcgQW5ub3RhdGlvbkZpbGVQYXJzZXIoKTsKLQkJICAgIAkJcGFyc2VyLnBhcnNlKGZBbm5vdGF0aW9uTWFwLCBmaWxlSW5mbyk7Ci0JCSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJICAgICAgICAJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkV4Y2VwdGlvbiB0aHJvd24gaW4gQ01Eb2N1bWVudEltcGwjZ2V0QW5ub3RhdGlvbk1hcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCSAgICAgICAgfQotCQkgICAgfQotCQl9Ci0JCXJldHVybiBmQW5ub3RhdGlvbk1hcDsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBiYXNlTG9jYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmQmFzZUxvY2F0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRlc2NyaXB0aW9uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGlzcGxheU5hbWUuCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGZEaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50cyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGZFbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbnRpdGllcyBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICoKLQkgKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEVudGl0eURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGZUYWdsaWJFeHRlbnNpb25zOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZ1bmN0aW9ucy4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGdW5jdGlvbnMoKSB7Ci0JCXJldHVybiBmRnVuY3Rpb25zOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGlkLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmSWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvKCkgewotCQlyZXR1cm4gZ2V0RGVzY3JpcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEpzcHZlcnNpb24oKSB7Ci0JCXJldHVybiBmSlNQVmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXJnZUljb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYXJnZUljb24oKSB7Ci0JCXJldHVybiBmTGFyZ2VJY29uOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldExpc3RlbmVycygpIHsKLQkJaWYgKGZMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCWZMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBmTGlzdGVuZXJzOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVzcGFjZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTmFtZXNwYWNlCi0JICovCi0JcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjY21kb2N1bWVudCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5ET0NVTUVOVDsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXJlbnRVUkkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJlbnRVUkkoKSB7Ci0JCXJldHVybiBmUGFyZW50VVJJOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhUTEREb2N1bWVudC5DTV9LSU5EKSkgewotCQkJcmV0dXJuIFRMRERvY3VtZW50LkpTUF9UTEQ7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiYW5ub3RhdGlvbk1hcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBnZXRBbm5vdGF0aW9uTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnRuYW1lKCkgewotCQlyZXR1cm4gZlNob3J0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzbWFsbEljb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7Ci0JCXJldHVybiBmU21hbGxJY29uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGxpYnZlcnNpb24oKSB7Ci0JCXJldHVybiBmVExpYlZlcnNpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVcmkoKSB7Ci0JCXJldHVybiBmVVJJOwotCX0KLQotCS8qCi0JICogQHNlZSBUTEREb2N1bWVudCNnZXRWYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBUTERWYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkgewotCQlyZXR1cm4gdmFsaWRhdG9yOwotCX0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uIFRoZSBiYXNlTG9jYXRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhc2VMb2NhdGlvbihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCWZCYXNlTG9jYXRpb24gPSBiYXNlTG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5mRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkaXNwbGF5TmFtZS4KLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUgVGhlIGRpc3BsYXlOYW1lIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc3BsYXlOYW1lKFN0cmluZyBkaXNwbGF5TmFtZSkgewotCQl0aGlzLmZEaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGlkLgotCSAqIEBwYXJhbSBpZCBUaGUgaWQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0JCXRoaXMuZklkID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0luZm8gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZm8oU3RyaW5nIG5ld0luZm8pIHsKLQkJc2V0RGVzY3JpcHRpb24obmV3SW5mbyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0pzcHZlcnNpb24gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpzcHZlcnNpb24oU3RyaW5nIG5ld0pzcHZlcnNpb24pIHsKLQkJZkpTUFZlcnNpb24gPSBuZXdKc3B2ZXJzaW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhcmdlSWNvbi4KLQkgKiBAcGFyYW0gbGFyZ2VJY29uIFRoZSBsYXJnZUljb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBsYXJnZUljb24pIHsKLQkJdGhpcy5mTGFyZ2VJY29uID0gbGFyZ2VJY29uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVycyhMaXN0IGxpc3RlbmVycykgewotCQl0aGlzLmZMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnRVUkkgVGhlIHBhcmVudFVSSSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyZW50VVJJKFN0cmluZyBwYXJlbnRVUkkpIHsKLQkJZlBhcmVudFVSSSA9IHBhcmVudFVSSTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5LCBPYmplY3QgdmFsdWUpIHsKLQkJZlByb3BlcnRpZXMucHV0KHByb3BlcnR5LCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1Nob3J0bmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvcnRuYW1lKFN0cmluZyBuZXdTaG9ydG5hbWUpIHsKLQkJZlNob3J0TmFtZSA9IG5ld1Nob3J0bmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzbWFsbEljb24uCi0JICogQHBhcmFtIHNtYWxsSWNvbiBUaGUgc21hbGxJY29uIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNtYWxsSWNvbihTdHJpbmcgc21hbGxJY29uKSB7Ci0JCXRoaXMuZlNtYWxsSWNvbiA9IHNtYWxsSWNvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGxpYnZlcnNpb24gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRsaWJ2ZXJzaW9uKFN0cmluZyBuZXdUbGlidmVyc2lvbikgewotCQlmVExpYlZlcnNpb24gPSBuZXdUbGlidmVyc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VXJpIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIG5ld1VyaSkgewotCQlmVVJJID0gbmV3VXJpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZhbGlkYXRvcihUTERWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCXRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKFRMRERvY3VtZW50LkNNX0tJTkQuZXF1YWxzKHByb3BlcnR5TmFtZSkgfHwgImFubm90YXRpb25NYXAiLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZQcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBzaG9ydCBuYW1lOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0U2hvcnRuYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGRpc3BsYXkgbmFtZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERpc3BsYXlOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGRlc2NyaXB0aW9uIChpbmZvKToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERlc2NyaXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IFVSSToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFVyaSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBqc3AgdmVyc2lvbjoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldEpzcHZlcnNpb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdGFnbGliIHZlcnNpb246IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRUbGlidmVyc2lvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBzbWFsbCBpY29uOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0U21hbGxJY29uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGxhcmdlIGljb246IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRMYXJnZUljb24oKSkpOyAvLyROT04tTkxTLTEkCi0JCWlmIChnZXRWYWxpZGF0b3IoKSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YWxpZGF0b3I6IiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0VmFsaWRhdG9yKCkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBsaXN0ZW5lcnM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRMaXN0ZW5lcnMoKS5zaXplKCk7IGkrKykgewotCQkJYnVmZmVyLmFwcGVuZCgiXG4iICsgU3RyaW5nVXRpbHMucmVwbGFjZShnZXRMaXN0ZW5lcnMoKS5nZXQoaSkudG9TdHJpbmcoKSwgIlxuIiwgIlxuXHRcdCIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCQlidWZmZXIuYXBwZW5kKCJcblx0IGVsZW1lbnRzOiIpOyAvLyROT04tTkxTLTEkCi0JCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gZ2V0RWxlbWVudHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLnJlcGxhY2UoZWxlbWVudHMuaXRlbShpKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2NmJlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMRERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotCi1wdWJsaWMgY2xhc3MgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGltcGxlbWVudHMgVExERWxlbWVudERlY2xhcmF0aW9uIHsKLQotCS8vIG9wdGlvbmFsIGF0dHJpYnV0ZXMKLQlDTU5hbWVkTm9kZU1hcEltcGwgZkF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JLy8gKGVtcHR5fEpTUHx0YWdkZXBlbmRhbnR8c2NyaXB0bGVzcykgLSBvcHRpb25hbCwgZGVmYXVsdHMgdG8gSlNQCi0JcHJpdmF0ZSBTdHJpbmcgYm9keWNvbnRlbnQgPSBKU1AxMVRMRE5hbWVzLkNPTlRFTlRfSlNQOwotCi0JLyoqIAotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKiAKLQkgKiBVc2FnZSBpbmZvcm1hdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQotCS8qKiAKLQkgKiBzaW5jZSBKU1AgMS4yCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZGlzcGxheU5hbWU7Ci0KLQkvKiogCi0JICogc2luY2UgSlNQIDIuMAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZFeGFtcGxlOwotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZPd25lckRvY3VtZW50OwotCQotCXByaXZhdGUgU3RyaW5nIGZQYXRoID0gbnVsbDsKLQotCXByaXZhdGUgTGlzdCBmVGFnRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JLyoqIAotCSAqIHNpbmNlIEpTUCAxLjIKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBsYXJnZUljb247Ci0JCi0JCi0JcHJpdmF0ZSBpbnQgbWF4T2NjdXIgPSAtMTsKLQlwcml2YXRlIGludCBtaW5PY2N1ciA9IDA7Ci0KLQkvLyByZXF1aXJlZCB0YWcgbmFtZQotCXByaXZhdGUgU3RyaW5nIG5vZGVOYW1lID0gbnVsbDsKLQkKLQkvKiogCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHNtYWxsSWNvbjsKLQkKLQkvLyB0YWcgaGFuZGxlciBjbGFzcyAtIHJlcXVpcmVkCi0JcHJpdmF0ZSBTdHJpbmcgdGFnY2xhc3MgPSBudWxsOwotCQotCS8vIHRhZyBleHRyYSBpbmZvIGNsYXNzIChzdWJjbGFzcyBvZiBqYXZheC5zZXJ2bGV0LmpzcC5UYWdFeHRyYUluZm8pIC0gb3B0aW9uYWwKLQlwcml2YXRlIFN0cmluZyB0ZWljbGFzcyA9IG51bGw7Ci0KLQkvKiogCi0JICogc2luY2UgSlNQIDEuMgotCSAqLwotCXByaXZhdGUgTGlzdCB2YXJpYWJsZXM7Ci0KLQkvKioKLQkgKiBDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgb3duZXIpIHsKLQkJc3VwZXIoKTsKLQkJZk93bmVyRG9jdW1lbnQgPSBvd25lcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGVzIG1ldGhvZAotCSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLQkgKgotCSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgQXR0cmlidXRlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGZBdHRyaWJ1dGVzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9keWNvbnRlbnQoKSB7Ci0JCXJldHVybiBib2R5Y29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDTUNvbnRlbnQgbWV0aG9kCi0JICogQHJldHVybiBDTUNvbnRlbnQKLQkgKgotCSAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQncyBjb250ZW50IG1vZGVsLgotCSAqIFRoaXMgY2FuIGJlIGFuIENNRWxlbWVudERlY2xhcmF0aW9uIG9yIGEgQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29udGVudFR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoYm9keWNvbnRlbnQuZXF1YWxzKEpTUDExVExETmFtZXMuQ09OVEVOVF9FTVBUWSkpCi0JCQlyZXR1cm4gRU1QVFk7Ci0JCWlmIChib2R5Y29udGVudC5lcXVhbHMoSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkpCi0JCQlyZXR1cm4gUENEQVRBOwotCQllbHNlCi0JCQkvLyBKU1AKLQkJCXJldHVybiBBTlk7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCXJldHVybiBuZXcgQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGRpc3BsYXlOYW1lLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKSB7Ci0JCXJldHVybiBkaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbGVtZW50TmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleGFtcGxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXhhbXBsZSgpIHsKLQkJcmV0dXJuIGZFeGFtcGxlOwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4dGVuc2lvbnMuCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZW5zaW9ucygpIHsKLQkJcmV0dXJuIGZUYWdFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mbygpIHsKLQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFyZ2VJY29uLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFyZ2VJY29uKCkgewotCQlyZXR1cm4gbGFyZ2VJY29uOwotCX0KLQotCS8qKgotCSAqIGdldExvY2FsRWxlbWVudHMgbWV0aG9kCi0JICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotCSAqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbG9jYWxseSBkZWZpbmVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBtYXhPY2N1cjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4KLQkgKiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiBtaW5PY2N1cjsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gbm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZPd25lckRvY3VtZW50OwotCX0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBhdGguCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXRoKCkgewotCQlyZXR1cm4gZlBhdGg7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY3JpYmVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lICE9IG51bGwgJiYgcHJvcGVydHlOYW1lLmVxdWFscygidGFnSW5mbyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBnZXRUYWdJbmZvKCk7CS8vIHJldHVybiB0YWcgaW5mbwotCQkJLy8gYnVnODgzMzYgbm8gbmVlZCB0byByZXN0b3JlIG1hcmtlcnMgCi0JCQkvLyByZXR1cm4gU3RyaW5nVXRpbHMucmVzdG9yZU1hcmtlcnMoZ2V0VGFnSW5mbygpKTsgLy8gcmV0dXJuIHRhZyBkZXNjcmlwdGlvbgotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZSAhPSBudWxsICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoImRlc2NyaXB0aW9uIikpIHsJLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGdldERlc2NyaXB0aW9uKCk7Ci0JCQkvLyBidWc4ODMzNiBubyBuZWVkIHRvIHJlc3RvcmUgbWFya2VycyAKLQkJCS8vIHJldHVybiBTdHJpbmdVdGlscy5yZXN0b3JlTWFya2VycyhnZXREZXNjcmlwdGlvbigpKTsgLy8gcmV0dXJuIHRhZyBkZXNjcmlwdGlvbgotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoVExERG9jdW1lbnQuQ01fS0lORCkpIHsKLQkJCXJldHVybiBUTEREb2N1bWVudC5KU1BfVExEOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikpIHsKLQkJCXJldHVybiBnZXRPd25lckRvY3VtZW50KCkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzbWFsbEljb24uCi0JICogQHJldHVybiBSZXR1cm5zIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTbWFsbEljb24oKSB7Ci0JCXJldHVybiBzbWFsbEljb247Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIFhQYXRoIG9mIHRoaXMgZWxlbWVudAotCSAqIChjdXJyZW50bHkganVzdCByZXR1cm5zIHRoZSBub2RlIG5hbWUpCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNwZWMoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnY2xhc3MoKSB7Ci0JCXJldHVybiB0YWdjbGFzczsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IHRoZSB0YWdpbmZvIGZvciB0aGlzIGN1cnJlbnQgZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nIHRhZ2luZm8gaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFRhZ0luZm8oKSB7Ci0JCWlmIChnZXRPd25lckRvY3VtZW50KCkuc3VwcG9ydHMoImFubm90YXRpb25NYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlBbm5vdGF0aW9uTWFwIG1hcCA9IChBbm5vdGF0aW9uTWFwKWdldE93bmVyRG9jdW1lbnQoKS5nZXRQcm9wZXJ0eSgiYW5ub3RhdGlvbk1hcCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgc3BlYyA9IGdldFNwZWMoKTsKLQkJCVN0cmluZyByZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoc3BlYywgInRhZ0luZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlc3VsdDsKLQkJCS8vIGJ1Zzg4MzM2IG5vIG5lZWQgdG8gcmVzdG9yZSBtYXJrZXJzIAotCQkJLy8gcmV0dXJuIFN0cmluZ1V0aWxzLnJlc3RvcmVNYXJrZXJzKHJlc3VsdCk7IC8vIHJldHVybiB0YWcgaW5mbwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGVpY2xhc3MoKSB7Ci0JCXJldHVybiB0ZWljbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSB2YXJpYWJsZXMuCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFZhcmlhYmxlcygpIHsKLQkJaWYgKHZhcmlhYmxlcyA9PSBudWxsKQotCQkJdmFyaWFibGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gdmFyaWFibGVzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdCb2R5Y29udGVudCBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9keWNvbnRlbnQoU3RyaW5nIG5ld0JvZHljb250ZW50KSB7Ci0JCWJvZHljb250ZW50ID0gbmV3Qm9keWNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZGVzY3JpcHRpb24uCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRpc3BsYXlOYW1lLgotCSAqIEBwYXJhbSBkaXNwbGF5TmFtZSBUaGUgZGlzcGxheU5hbWUgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0JCXRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGV4YW1wbGUgVGhlIGV4YW1wbGUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEV4YW1wbGUoU3RyaW5nIGV4YW1wbGUpIHsKLQkJZkV4YW1wbGUgPSBleGFtcGxlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxhcmdlSWNvbi4KLQkgKiBAcGFyYW0gbGFyZ2VJY29uIFRoZSBsYXJnZUljb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFyZ2VJY29uKFN0cmluZyBsYXJnZUljb24pIHsKLQkJdGhpcy5sYXJnZUljb24gPSBsYXJnZUljb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Tm9kZU5hbWUoU3RyaW5nIHN0cmluZykgewotCQlub2RlTmFtZSA9IHN0cmluZzsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKLQkJZlBhdGggPSBwYXRoOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHNtYWxsSWNvbi4KLQkgKiBAcGFyYW0gc21hbGxJY29uIFRoZSBzbWFsbEljb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U21hbGxJY29uKFN0cmluZyBzbWFsbEljb24pIHsKLQkJdGhpcy5zbWFsbEljb24gPSBzbWFsbEljb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1RhZ2NsYXNzIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUYWdjbGFzcyhTdHJpbmcgbmV3VGFnY2xhc3MpIHsKLQkJdGFnY2xhc3MgPSBuZXdUYWdjbGFzczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGVpY2xhc3MgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRlaWNsYXNzKFN0cmluZyBuZXdUZWljbGFzcykgewotCQl0ZWljbGFzcyA9IG5ld1RlaWNsYXNzOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhcmlhYmxlcy4KLQkgKiBAcGFyYW0gdmFyaWFibGVzIFRoZSB2YXJpYWJsZXMgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VmFyaWFibGVzKExpc3QgdmFyaWFibGVzKSB7Ci0JCXRoaXMudmFyaWFibGVzID0gdmFyaWFibGVzOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gcHJvcGVydHlOYW1lID09IG51bGwgfHwgcHJvcGVydHlOYW1lLmVxdWFscygidGFnSW5mbyIpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5ERVNDUklQVElPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhUTEREb2N1bWVudC5DTV9LSU5EKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuU01BTExfSUNPTikgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLkxBUkdFX0lDT04pOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgIiArIHN1cGVyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbmFtZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE5vZGVOYW1lKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHRhZyBjbGFzczoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFRhZ2NsYXNzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHRlaSBjbGFzczoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFRlaWNsYXNzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGJvZHkgY29udGVudDoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldEJvZHljb250ZW50KCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGRlc2NyaXB0aW9uIChpbmZvKToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldERlc2NyaXB0aW9uKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGF0dHJpYnV0ZXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHRcdCIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGF0dHJpYnV0ZXMuaXRlbShpKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFyaWFibGVzOiIpOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0VmFyaWFibGVzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuXHRcdCIgKyBTdHJpbmdVdGlscy5yZXBsYWNlKGdldFZhcmlhYmxlcygpLmdldChpKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODYxM2Y5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi1wdWJsaWMgY2xhc3MgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0JcHVibGljIHN0YXRpYyBDTU5hbWVkTm9kZU1hcEltcGwgRU1QVFlfTkFNRURfTk9ERV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCS8qKgotCSAqIENNTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpIHsKLQkJcmV0dXJuIHRhYmxlOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGFibGUuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKENNTm9kZSkgdGFibGUuZ2V0KG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0JCWlmIChpbmRleCA8IHNpemUpIHsKLQkJCUl0ZXJhdG9yIHZhbHVlcyA9IGl0ZXJhdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKSB7Ci0JCQkJcmVzdWx0ID0gdmFsdWVzLm5leHQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKENNTm9kZSkgcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4KLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGFOb2RlIENNTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGFOb2RlKSB7Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgYU5vZGUgIT0gbnVsbCkKLQkJCXRhYmxlLnB1dChuYW1lLCBhTm9kZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjZjZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL0NNTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCB7Ci0Jc3RhdGljIENNTm9kZUxpc3RJbXBsIEVNUFRZX05PREVfTElTVCA9IG5ldyBDTU5vZGVMaXN0SW1wbChDb2xsZWN0aW9ucy5FTVBUWV9MSVNUKTsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKCkgewotCQl0aGlzKG5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKExpc3QgbGlzdCkgewotCQl0aGlzLmxpc3QgPSBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGVuZEl0ZW0oQ01Ob2RlIG5vZGUpIHsKLQkJbGlzdC5hZGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBsaXN0LnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRMaXN0KCkgewotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChDTU5vZGUpIGxpc3QuZ2V0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERDTURvY3VtZW50TWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTYxYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRENNRG9jdW1lbnRNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlRhZ2xpYkNvbnRyb2xsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTFUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMlRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDIwVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklKYXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVExEUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYkluZGV4TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRhZ2xpYlJlY29yZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVVSTFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLlRhZ2xpYkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgVExEQ01Eb2N1bWVudE1hbmFnZXIgaW1wbGVtZW50cyBJVGFnbGliSW5kZXhMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBpbXBsZW1lbnRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIsIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24gewotCi0JCS8qKgotCQkgKiBBZGRzIGEgYmxvY2sgdGFnbmFtZSAoZnVsbHkgbmFtZXNwYWNlIHF1YWxpZmllZCkgaW50byB0aGUgbGlzdCBvZgotCQkgKiBibG9jayB0YWcgbmFtZXMgZm9yIHRoZSBwYXJzZXIuIFRoZSBtYXJrZXIKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbG9uZyB3aXRoIHBvc2l0aW9uIGN1ZXMgZHVyaW5nIHJlcGFyc2VzCi0JCSAqIGFsbG93IHRoZSBKU1BTb3VyY2VQYXJzZXIgdG8gZW5hYmxlL2lnbm9yZSB0aGUgdGFncyBhcyBibG9ja3MuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRCbG9ja1RhZyhTdHJpbmcgdGFnbmFtZU5TLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hcmtlcikgewotCQkJaWYgKGdldFBhcnNlcigpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGdldFBhcnNlcigpLmdldEJsb2NrTWFya2VyKHRhZ25hbWVOUykgPT0gbnVsbCkgewotCQkJCWdldFBhcnNlcigpLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcih0YWduYW1lTlMsIG1hcmtlciwgRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCB0cnVlLCBmYWxzZSkpOwotCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciBhZGRlZCBibG9jayBtYXJrZXI6ICIgKyB0YWduYW1lTlMgKyAiQCIgKyBtYXJrZXIuZ2V0U3RhcnRPZmZzZXQoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkVGFnbGliVHJhY2tlcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgQ01Eb2N1bWVudCB0bGRDTURvY3VtZW50KSB7Ci0JCQlnZXRUYWdsaWJUcmFja2VycygpLmFkZChuZXcgVGFnbGliVHJhY2tlcih1cmksIHByZWZpeCwgdGxkQ01Eb2N1bWVudCwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSk7Ci0JCX0KLQotCQkvKioKLQkJICogRW5hYmxlcyBhIFRMRCBvd25pbmcgdGhlIGdpdmVuIHByZWZpeCBsb2FkZWQgZnJvbSB0aGUgZ2l2ZW4gVVJJIGF0Ci0JCSAqIHRoZSBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uIFRoZSBsaXN0IG9mCi0JCSAqIGFkZGl0aW9uYWxDTURvY3VtZW50cyB3aWxsIGNsYWltIHRvIG5vdCBrbm93IGFueSBvZiBpdHMgdGFncyBhdAotCQkgKiBwb3NpdGlvbnMgZWFybGllciB0aGFuIHRoYXQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbidzIHBvc2l0aW9uLgotCQkgKiAKLQkJICogRm9yIHRhZ2xpYiBkaXJlY3RpdmVzLCB0aGUgdGFnbGliIGlzIHRoZSBhbmNob3Igd2hpbGUgdGFnbGlicwotCQkgKiByZWdpc3RlcmVkIHRocm91Z2ggaW5jbHVkZSBkaXJlY3RpdmVzIHVzZSB0aGUgcGFyZW50IGRvY3VtZW50J3MKLQkJICogaW5jbHVkZSBkaXJlY3RpdmUgYXMgdGhlaXIgYW5jaG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHByZWZpeAotCQkgKiBAcGFyYW0gdXJpCi0JCSAqIEBwYXJhbSBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGVuYWJsZVRhZ2xpYkZyb21VUkkoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCWlmIChwcmVmaXggPT0gbnVsbCB8fCB1cmkgPT0gbnVsbCB8fCBiYW5uZWRQcmVmaXhlcy5jb250YWlucyhwcmVmaXgpKQotCQkJCXJldHVybjsKLQkJCS8vIFRyeSB0byBsb2FkIHRoZSBDTURvY3VtZW50IGZvciB0aGlzIFVSSQotCQkJQ01Eb2N1bWVudCB0bGQgPSBnZXRDTURvY3VtZW50KHVyaSk7Ci0JCQlpZiAodGxkID09IG51bGwgfHwgISh0bGQgaW5zdGFuY2VvZiBUTEREb2N1bWVudCkpIHsKLQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgZmFpbGVkIHRvIGNyZWF0ZSBhIENNRG9jdW1lbnQgZm9yICIgKyB1cmkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJlZ2lzdGVyVGFnbGliKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRsZCk7Ci0JCQlpZiAoX2RlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciByZWdpc3RlcmVkIGEgdHJhY2tlciBmb3IgIiArIHVyaSArICIgd2l0aCBwcmVmaXggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogRW5hYmxlcyBhIFRMRCBvd25pbmcgdGhlIGdpdmVuIHByZWZpeCBsb2FkZWQgZnJvbSB0aGUgZ2l2ZW4gVVJJIGF0Ci0JCSAqIHRoZSBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uIFRoZSBsaXN0IG9mCi0JCSAqIGFkZGl0aW9uYWxDTURvY3VtZW50cyB3aWxsIGNsYWltIHRvIG5vdCBrbm93IGFueSBvZiBpdHMgdGFncyBhdAotCQkgKiBwb3NpdGlvbnMgZWFybGllciB0aGFuIHRoYXQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbidzIHBvc2l0aW9uLgotCQkgKiAKLQkJICogRm9yIHRhZ2xpYiBkaXJlY3RpdmVzLCB0aGUgdGFnbGliIGlzIHRoZSBhbmNob3Igd2hpbGUgdGFnbGlicwotCQkgKiByZWdpc3RlcmVkIHRocm91Z2ggaW5jbHVkZSBkaXJlY3RpdmVzIHVzZSB0aGUgcGFyZW50IGRvY3VtZW50J3MKLQkJICogaW5jbHVkZSBkaXJlY3RpdmUgYXMgdGhlaXIgYW5jaG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHByZWZpeAotCQkgKiBAcGFyYW0gdXJpCi0JCSAqIEBwYXJhbSB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGVuYWJsZVRhZ3NJbkRpcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdGFnZGlyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJaWYgKHByZWZpeCA9PSBudWxsIHx8IHRhZ2RpciA9PSBudWxsIHx8IGJhbm5lZFByZWZpeGVzLmNvbnRhaW5zKHByZWZpeCkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKF9kZWJ1ZykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgZW5hYmxpbmcgdGFncyBmcm9tIGRpcmVjdG9yeSIgKyB0YWdkaXIgKyAiIGZvciBwcmVmaXggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBUcnkgdG8gbG9hZCB0aGUgQ01Eb2N1bWVudCBmb3IgdGhpcyBVUkkKLQkJCUNNRG9jdW1lbnQgdGxkID0gZ2V0SW1wbGljaXRDTURvY3VtZW50KHRhZ2Rpcik7Ci0JCQlpZiAodGxkID09IG51bGwgfHwgISh0bGQgaW5zdGFuY2VvZiBUTEREb2N1bWVudCkpIHsKLQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgZmFpbGVkIHRvIGNyZWF0ZSBhIENNRG9jdW1lbnQgZm9yIGRpcmVjdG9yICIgKyB0YWdkaXIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCXJlZ2lzdGVyVGFnbGliKHByZWZpeCwgdGFnZGlyLCB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRsZCk7Ci0JCQlpZiAoX2RlYnVnKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciByZWdpc3RlcmVkIGEgdHJhY2tlciBmb3IgZGlyZWN0b3J5IiArIHRhZ2RpciArICIgd2l0aCBwcmVmaXggIiArIHByZWZpeCk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCS8vIGNvdWxkIHRlc3QgPiAxLCBidXQgc2luY2Ugd2Ugb25seSBjYXJlIGlmIHRoZXJlIGFyZSA4ICg8JUAsCi0JCQkvLyB0YWdsaWIsIHVyaSwgPSwgd2hlcmUsIHByZWZpeCwgPSwgd2hhdCkgW29yIDQgZm9yIGluY2x1ZGVzXQotCQkJaWYgKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gNCAmJiBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lID0gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoZ2V0UGFyc2VyKCkgPT0gbnVsbCkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIldhcm5pbmc6IHBhcnNlciB0ZXh0IHdhcyByZXF1ZXN0ZWQgYnkgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBidXQgbm9uZSB3YXMgYXZhaWxhYmxlOyB0YWdsaWIgc3VwcG9ydCBkaXNhYmxlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJvb2xlYW4gdGFnbGliRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQgPSBmYWxzZTsKLQkJCQkJCWJvb2xlYW4gaW5jbHVkZURldGVjdGVkID0gZmFsc2U7Ci0JCQkJCQlib29sZWFuIGluY2x1ZGVEaXJlY3RpdmVEZXRlY3RlZCA9IGZhbHNlOwotCQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSk7Ci0JCQkJCQlpbnQgdGV4dExlbmd0aCA9IG5hbWUuZ2V0VGV4dExlbmd0aCgpOwotCi0JCQkJCQlpZiAoZ2V0UGFyc2VyKCkgIT0gbnVsbCkgewotCQkJCQkJCXRhZ2xpYkRldGVjdGVkID0gZ2V0UGFyc2VyKCkucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJCQkJCXRhZ2xpYkRpcmVjdGl2ZURldGVjdGVkID0gZ2V0UGFyc2VyKCkucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQkJCQkJaW5jbHVkZURldGVjdGVkID0gZ2V0UGFyc2VyKCkucmVnaW9uTWF0Y2hlcyhzdGFydE9mZnNldCwgdGV4dExlbmd0aCwgSlNQMTJUTEROYW1lcy5JTkNMVURFKTsKLQkJCQkJCQlpbmNsdWRlRGlyZWN0aXZlRGV0ZWN0ZWQgPSBnZXRQYXJzZXIoKS5yZWdpb25NYXRjaGVzKHN0YXJ0T2Zmc2V0LCB0ZXh0TGVuZ3RoLCBKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvbGQgZmFzaGlvbmVkIHdheQotCQkJCQkJCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gZ2V0UGFyc2VyKCkuZ2V0VGV4dChzdGFydE9mZnNldCwgdGV4dExlbmd0aCk7Ci0JCQkJCQkJdGFnbGliRGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQkJCQkJdGFnbGliRGlyZWN0aXZlRGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJCQlpbmNsdWRlRGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLklOQ0xVREUpOwotCQkJCQkJCWluY2x1ZGVEaXJlY3RpdmVEZXRlY3RlZCA9IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKTsKLQkJCQkJCX0KLQkJCQkJCWlmICh0YWdsaWJEZXRlY3RlZCB8fCB0YWdsaWJEaXJlY3RpdmVEZXRlY3RlZCkgewotCQkJCQkJCXByb2Nlc3NUYWdsaWIoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoaW5jbHVkZURldGVjdGVkIHx8IGluY2x1ZGVEaXJlY3RpdmVEZXRlY3RlZCkgewotCQkJCQkJCXByb2Nlc3NJbmNsdWRlKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJfQotCQkJfQotCQkJLy8gY291bGQgdGVzdCA+IDEsIGJ1dCBzaW5jZSB3ZSBvbmx5IGNhcmUgaWYgdGhlcmUgYXJlIDUgKDwsCi0JCQkvLyBqc3A6cm9vdCwgeG1sbnM6cHJlZml4LCA9LCB3aGVyZSkKLQkJCWVsc2UgaWYgKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldE51bWJlck9mUmVnaW9ucygpID4gNCAmJiBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgewotCQkJCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJXYXJuaW5nOiBwYXJzZXIgdGV4dCB3YXMgcmVxdWVzdGVkIGJ5ICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgYnV0IG5vbmUgd2FzIGF2YWlsYWJsZTsgdGFnbGliIHN1cHBvcnQgZGlzYWJsZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwcm9jZXNzSlNQUm9vdChhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0luY2x1ZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJcHJvY2Vzc0luY2x1ZGUoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBnZXRQYXJzZXIoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogUHJvY2VzcyBhbiBpbmNsdWRlIGRpcmVjdGl2ZSBmb3VuZCBieSB0aGUgdGV4dFNvdXJjZSBwYXJzZXIgYW5kCi0JCSAqIGFuY2hvciBhbnkgdGFnbGlicyBmb3VuZCB3aXRoaW4gYXQgdGhlCi0JCSAqIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4gSW5jbHVkZXMgdXNlIHRoZSBpbmNsdWRpbmcgZmlsZSBhcwotCQkgKiB0aGUgcG9pbnQgb2YgcmVmZXJlbmNlLCBub3QgbmVjZXNzYXJpbHkgdGhlICJ0b3AiIGZpbGUuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5jbHVkZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluY2x1ZGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBKU1BTb3VyY2VQYXJzZXIgdGV4dFNvdXJjZSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBpbmNsdWRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCVN0cmluZyBpbmNsdWRlZEZpbGUgPSBudWxsOwotCQkJYm9vbGVhbiBpc0ZpbGVuYW1lID0gZmFsc2U7Ci0JCQl0cnkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJCQlpZiAodGV4dFNvdXJjZS5nZXRUZXh0KGluY2x1ZGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSkuZXF1YWxzKEpTUDEyVExETmFtZXMuRklMRSkpIHsKLQkJCQkJCQlpc0ZpbGVuYW1lID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWlzRmlsZW5hbWUgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0ZpbGVuYW1lICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJaW5jbHVkZWRGaWxlID0gdGV4dFNvdXJjZS5nZXRUZXh0KGluY2x1ZGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQkJCQlpc0ZpbGVuYW1lID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCS8vIG5vdGhpbmcgdG8gYmUgZG9uZQotCQkJCWluY2x1ZGVkRmlsZSA9IG51bGw7Ci0JCQl9Ci0KLQkJCWlmIChpbmNsdWRlZEZpbGUgIT0gbnVsbCkgewotCQkJCS8vIHN0cmlwIGFueSBleHRyYW5lb3VzIHF1b3RlcyBhbmQgd2hpdGUgc3BhY2UKLQkJCQlpbmNsdWRlZEZpbGUgPSBTdHJpbmdVdGlscy5zdHJpcChpbmNsdWRlZEZpbGUpLnRyaW0oKTsKLQkJCQlJUGF0aCBmaWxlUGF0aCA9IG51bGw7Ci0JCQkJaWYgKGluY2x1ZGVkRmlsZS5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlJUGF0aCBjb250ZXh0Um9vdCA9IFRhZ2xpYkluZGV4LmdldENvbnRleHRSb290KFRhZ2xpYkNvbnRyb2xsZXIuZ2V0RmlsZUJ1ZmZlcihUTERDTURvY3VtZW50TWFuYWdlci50aGlzKS5nZXRMb2NhdGlvbigpKTsKLQkJCQkJZmlsZVBhdGggPSBjb250ZXh0Um9vdC5hcHBlbmQoaW5jbHVkZWRGaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChnZXRJbmNsdWRlcygpLmlzRW1wdHkoKSkKLQkJCQkJCWZpbGVQYXRoID0gVGFnbGliQ29udHJvbGxlci5nZXRGaWxlQnVmZmVyKFRMRENNRG9jdW1lbnRNYW5hZ2VyLnRoaXMpLmdldExvY2F0aW9uKCkucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFwcGVuZChpbmNsdWRlZEZpbGUpOwotCQkJCQllbHNlCi0JCQkJCQlmaWxlUGF0aCA9ICgoSVBhdGgpIGdldEluY2x1ZGVzKCkucGVlaygpKS5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYXBwZW5kKGluY2x1ZGVkRmlsZSk7Ci0JCQkJfQotCQkJCS8vIGNoZWNrIGZvciAibG9vcHMiCi0JCQkJaWYgKGZpbGVQYXRoICE9IG51bGwgJiYgIWdldEluY2x1ZGVzKCkuY29udGFpbnMoZmlsZVBhdGgpICYmICFmaWxlUGF0aC5lcXVhbHMoVGFnbGliQ29udHJvbGxlci5nZXRGaWxlQnVmZmVyKFRMRENNRG9jdW1lbnRNYW5hZ2VyLnRoaXMpLmdldExvY2F0aW9uKCkpKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIFByZXZlbnQgc2xvdyBwZXJmb3JtYW5jZSB3aGVuIGVkaXRpbmcgc2NyaXB0bGV0IHBhcnQgb2YKLQkJCQkJICogdGhlIEpTUCBieSBvbmx5IHByb2Nlc3NpbmcgaW5jbHVkZXMgaWYgdGhleSd2ZSBiZWVuCi0JCQkJCSAqIG1vZGlmaWVkLiBUaGUgSW5jbHVkZUhlbHBlciByZW1lbWJlcnMgYW55IENNRG9jdW1lbnRzCi0JCQkJCSAqIGNyZWF0ZWQgZnJvbSB0aGUgZmlsZXMgaXQgcGFyc2VzLiBDYWNoaW5nIHRoZSBVUkkgYW5kCi0JCQkJCSAqIHByZWZpeC90YWdkaXIgYWxsb3dzIHVzIHRvIGp1c3QgZW5hYmxlIHRoZSBDTURvY3VtZW50Ci0JCQkJCSAqIHdoZW4gdGhlIHByZXZpb3VzbHkgcGFyc2VkIGZpbGVzLgotCQkJCQkgKiAKLQkJCQkJICogUkVNQUlOSU5HIFBST0JMRU06IGZUTERDTVJlZmVyZW5jZXNNYXAgZG9lcyBub3QgbWFwCi0JCQkJCSAqIGZyb20gYSBmcmFnbWVudCdzIHBhdGggYW5kIGFsc28gaW5jbHVkZSBhbGwgb2YgdGhlIENNCi0JCQkJCSAqIHJlZmVyZW5jZXMgaW4gZnJhZ21lbnRzIHRoYXQgKml0KiBpbmNsdWRlcy4gVGhlCi0JCQkJCSAqIGZyYWdtZW50cyB0aGF0IGl0IGluY2x1ZGVzIHdvbid0IGhhdmUgaXRzIENNIHJlZmVyZW5jZXMKLQkJCQkJICogbG9hZGVkLCBidXQgdGhlbiB3ZSdkIG5lZWQgdG8gcmVjb3JkIHRoZSBVUkkgYW5kCi0JCQkJCSAqIGxvY2F0aW9uIG9mIHRoZSBpbmNsdWRlZCBmcmFnbWVudCB0byByZXNvbHZlIHRoZW0KLQkJCQkJICogY29ycmVjdGx5LCBtb2RpZnlpbmcgZW5hYmxlVGFnbGliKCkgdG8gYWxzbyB0YWtlIGEgYmFzZQotCQkJCQkgKiBwYXRoIGFuZCByZXNvbHZlIHRoZSBVUkkgYXBwcm9wcmlhdGVseS4KLQkJCQkJICovCi0JCQkJCWlmIChoYXNBbnlJbmNsdWRlQmVlbk1vZGlmaWVkKGZpbGVQYXRoKSkgewotCQkJCQkJZ2V0SW5jbHVkZXMoKS5wdXNoKGZpbGVQYXRoKTsKLQkJCQkJCWlmIChnZXRQYXJzZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQkJSW5jbHVkZUhlbHBlciBpbmNsdWRlSGVscGVyID0gbmV3IEluY2x1ZGVIZWxwZXIoYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBnZXRQYXJzZXIoKSk7Ci0JCQkJCQkJaW5jbHVkZUhlbHBlci5wYXJzZShmaWxlUGF0aCk7Ci0JCQkJCQkJTGlzdCByZWZlcmVuY2VzID0gaW5jbHVkZUhlbHBlci50YWdsaWJSZWZlcmVuY2VzOwotCQkJCQkJCWZUTERDTVJlZmVyZW5jZXNNYXAucHV0KGZpbGVQYXRoLCByZWZlcmVuY2VzKTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIFRPRE86IHdhbGsgdXAgdGhlIGluY2x1ZGUgaGllcmFyY2h5IGFuZCBhZGQKLQkJCQkJCQkgKiB0aGVzZSByZWZlcmVuY2VzIHRvIGVhY2ggb2YgdGhlIHBhcmVudHMuCi0JCQkJCQkJICovCi0JCQkJCQl9Ci0JCQkJCQllbHNlCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIldhcm5pbmc6IHBhcnNlciB0ZXh0IHdhcyByZXF1ZXN0ZWQgYnkgIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBidXQgbm9uZSB3YXMgYXZhaWxhYmxlOyB0YWdsaWIgc3VwcG9ydCBkaXNhYmxlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBBZGQgZnJvbSB0aGF0IHNhdmVkIGxpc3Qgb2YgdXJpcy9wcmVmaXhlcy9kb2N1bWVudHMKLQkJCQkJCUxpc3QgcmVmZXJlbmNlcyA9IChMaXN0KSBmVExEQ01SZWZlcmVuY2VzTWFwLmdldChmaWxlUGF0aCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgcmVmZXJlbmNlcyAhPSBudWxsICYmIGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJVExEQ01Eb2N1bWVudFJlZmVyZW5jZSByZWZlcmVuY2UgPSAoVExEQ01Eb2N1bWVudFJlZmVyZW5jZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBUaGUgdXJpIG1pZ2h0IG5vdCBiZSByZXNvbHZlZCBwcm9wZXJseSBpZgotCQkJCQkJCSAqIHJlbGF0aXZlIHRvIHRoZSBKU1AgZnJhZ21lbnQuCi0JCQkJCQkJICovCi0JCQkJCQkJZW5hYmxlVGFnbGliRnJvbVVSSShyZWZlcmVuY2UucHJlZml4LCByZWZlcmVuY2UudXJpLCBpbmNsdWRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkxPT1AgSU4gQElOQ0xVREVTIEZPVU5EOiAiICsgZmlsZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gUHVsbHMgdGhlIFVSSSBhbmQgcHJlZml4IGZyb20gdGhlIGdpdmVuIGpzcDpyb290Ci0JCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kCi0JCS8vIG1ha2VzIHN1cmUgdGhlIHRhZ3MgYXJlIGtub3duLgotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSlNQUm9vdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGpzcFJvb3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCXByb2Nlc3NKU1BSb290KGpzcFJvb3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGpzcFJvb3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFBhcnNlcigpKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NKU1BSb290KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSlNQU291cmNlUGFyc2VyIHRleHRTb3VyY2UpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQlib29sZWFuIHRhZ2xpYiA9IGZhbHNlOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSB0ZXh0U291cmNlLmdldFRleHQodGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJaWYgKG5hbWUuc3RhcnRzV2l0aChYTUxOUykpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKFhNTE5TX0xFTkdUSCk7Ci0JCQkJCQkJaWYgKCFiYW5uZWRQcmVmaXhlcy5jb250YWlucyhwcmVmaXgpKQotCQkJCQkJCQl0YWdsaWIgPSB0cnVlOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCQl0YWdsaWIgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmICh0YWdsaWIgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQl1cmkgPSB0ZXh0U291cmNlLmdldFRleHQodGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQkJaWYgKHVyaSAhPSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIChTdHJpbmdVdGlscy5zdHJpcCh1cmkpLmxlbmd0aCgpID4gMCkgJiYgKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJCWlmIChhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCQkJCQkJZW5hYmxlVGFnbGliRnJvbVVSSShTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLCBTdHJpbmdVdGlscy5zdHJpcCh1cmkpLCB0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJZW5hYmxlVGFnbGliRnJvbVVSSShTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLCBTdHJpbmdVdGlscy5zdHJpcCh1cmkpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCXVyaSA9IG51bGw7Ci0JCQkJCQkJcHJlZml4ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJLy8gbm90aGluZyB0byBiZSBkb25lCi0JCQkJdXJpID0gbnVsbDsKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RhZ2xpYihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJcHJvY2Vzc1RhZ2xpYih0YWdsaWJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZ2V0UGFyc2VyKCkpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIFB1bGxzIHRoZSBVUkkgYW5kIHByZWZpeCBmcm9tIHRoZSBnaXZlbiB0YWdsaWIgZGlyZWN0aXZlCi0JCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kIG1ha2VzIHN1cmUgdGhlIHRhZ3MgYXJlIGtub3duLgotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1RhZ2xpYihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIEpTUFNvdXJjZVBhcnNlciB0ZXh0U291cmNlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJU3RyaW5nIHRhZ2RpciA9IG51bGw7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCS8vIHJlbWVtYmVyIGF0dHJpYnV0ZSBuYW1lCi0JCQkJCWludCBzdGFydE9mZnNldCA9IHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQlpbnQgdGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQkJLy8gU3RyaW5nIG5hbWUgPSB0ZXh0U291cmNlLmdldFRleHQoc3RhcnRPZmZzZXQsCi0JCQkJCQkvLyB0ZXh0TGVuZ3RoKTsKLQkJCQkJCWlmICh0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDExVExETmFtZXMuUFJFRklYKSkgewotCQkJCQkJCWF0dHJOYW1lID0gSlNQMTFUTEROYW1lcy5QUkVGSVg7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICh0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDEyVExETmFtZXMuVVJJKSkgewotCQkJCQkJCWF0dHJOYW1lID0gSlNQMTFUTEROYW1lcy5VUkk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmICh0ZXh0U291cmNlLnJlZ2lvbk1hdGNoZXMoc3RhcnRPZmZzZXQsIHRleHRMZW5ndGgsIEpTUDIwVExETmFtZXMuVEFHRElSKSkgewotCQkJCQkJCWF0dHJOYW1lID0gSlNQMjBUTEROYW1lcy5UQUdESVI7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlhdHRyTmFtZSA9IG51bGw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gcHJvY2VzcyB2YWx1ZQotCQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCWlmIChKU1AxMVRMRE5hbWVzLlBSRUZJWC5lcXVhbHMoYXR0ck5hbWUpKQotCQkJCQkJCXByZWZpeCA9IHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwgdGV4dExlbmd0aCk7Ci0JCQkJCQllbHNlIGlmIChKU1AxMVRMRE5hbWVzLlVSSS5lcXVhbHMoYXR0ck5hbWUpKQotCQkJCQkJCXVyaSA9IHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwgdGV4dExlbmd0aCk7Ci0JCQkJCQllbHNlIGlmIChKU1AyMFRMRE5hbWVzLlRBR0RJUi5lcXVhbHMoYXR0ck5hbWUpKQotCQkJCQkJCXRhZ2RpciA9IHRleHRTb3VyY2UuZ2V0VGV4dChzdGFydE9mZnNldCwgdGV4dExlbmd0aCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBzaW9vYkV4YykgewotCQkJCS8vIG5vdGhpbmcgdG8gYmUgZG9uZQotCQkJCXVyaSA9IG51bGw7Ci0JCQkJcHJlZml4ID0gbnVsbDsKLQkJCX0KLQkJCWlmICh1cmkgIT0gbnVsbCAmJiBwcmVmaXggIT0gbnVsbCAmJiAoU3RyaW5nVXRpbHMuc3RyaXAodXJpKS5sZW5ndGgoKSA+IDApICYmIChTdHJpbmdVdGlscy5zdHJpcChwcmVmaXgpLmxlbmd0aCgpID4gMCkpIHsKLQkJCQlpZiAoYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQkJCWVuYWJsZVRhZ2xpYkZyb21VUkkoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KSwgU3RyaW5nVXRpbHMuc3RyaXAodXJpKSwgdGFnbGliU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQllbHNlCi0JCQkJCWVuYWJsZVRhZ2xpYkZyb21VUkkoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KSwgU3RyaW5nVXRpbHMuc3RyaXAodXJpKSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRhZ2RpciAhPSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIChTdHJpbmdVdGlscy5zdHJpcCh0YWdkaXIpLmxlbmd0aCgpID4gMCkgJiYgKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCkubGVuZ3RoKCkgPiAwKSkgewotCQkJCWlmIChhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCQkJZW5hYmxlVGFnc0luRGlyKFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCksIFN0cmluZ1V0aWxzLnN0cmlwKHRhZ2RpciksIHRhZ2xpYlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJZWxzZQotCQkJCQllbmFibGVUYWdzSW5EaXIoU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KSwgU3RyaW5nVXRpbHMuc3RyaXAodGFnZGlyKSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZWdpc3RlclRhZ2xpYihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgQ01Eb2N1bWVudCB0bGQpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gdGxkLmdldEVsZW1lbnRzKCk7Ci0JCQkvKgotCQkJICogR28gdGhyb3VnaCB0aGUgQ01Eb2N1bWVudCBmb3IgYW55IHRhZ3MgdGhhdCBtdXN0IGJlIG1hcmtlZCBhcwotCQkJICogYmxvY2sgdGFncyBzdGFydGluZyBhdCB0aGUgYW5jaG9yaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uCi0JCQkgKiBBcyB0aGUgZG9jdW1lbnQgaXMgZWRpdGVkIGFuZCB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJICogbW92ZWQgYXJvdW5kLCB0aGUgYmxvY2sgdGFnIGVuYWJsZW1lbnQgd2lsbCBhdXRvbWF0aWNhbGx5Ci0JCQkgKiBmb2xsb3cgaXQuCi0JCQkgKi8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCVRMREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChUTERFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLml0ZW0oaSk7Ci0JCQkJaWYgKGVkLmdldEJvZHljb250ZW50KCkgPT0gSlNQMTJUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCkKLQkJCQkJYWRkQmxvY2tUYWcocHJlZml4ICsgIjoiICsgZWQuZ2V0Tm9kZU5hbWUoKSwgYW5jaG9yU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLyoKLQkJCSAqIFNpbmNlIG1vZGlmaWNhdGlvbnMgdG8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBhZGphY2VudCB0byBhCi0JCQkgKiB0YWdsaWIgZGlyZWN0aXZlIGNhbiBjYXVzZSB0aGF0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdG8gYmUKLQkJCSAqIHJlcG9ydGVkLCBmaWx0ZXIgb3V0IGFueSBkdXBsaWNhdGVkIFVSSXMuIFdoZW4gdGhlIHRhZ2xpYiBpcwotCQkJICogYWN0dWFsbHkgbW9kaWZpZWQsIGEgZnVsbCByZWJ1aWxkIHdpbGwgb2NjdXIgYW5kIG5vIGR1cGxpY2F0ZXMKLQkJCSAqIHdpbGwvc2hvdWxkIGJlIGZvdW5kLgotCQkJICovCi0JCQlib29sZWFuIGRvVHJhY2sgPSB0cnVlOwotCQkJTGlzdCB0cmFja2VycyA9IGdldFRhZ2xpYlRyYWNrZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJVGFnbGliVHJhY2tlciB0cmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIHRyYWNrZXJzLmdldChpKTsKLQkJCQlpZiAodHJhY2tlci5nZXRQcmVmaXgoKS5lcXVhbHMocHJlZml4KSAmJiB0cmFja2VyLmdldFVSSSgpLmVxdWFscyh1cmkpKSB7Ci0JCQkJCWRvVHJhY2sgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZG9UcmFjaykgewotCQkJCWFkZFRhZ2xpYlRyYWNrZXIocHJlZml4LCB1cmksIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgdGxkKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCByZXNldEJsb2NrVGFncygpIHsKLQkJCWlmIChnZXRQYXJzZXIoKSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIG5hbWVzID0gZ2V0UGFyc2VyKCkuZ2V0QmxvY2tNYXJrZXJzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpIG5hbWVzLm5leHQoKTsKLQkJCQlpZiAoIW1hcmtlci5pc0dsb2JhbCgpICYmIG1hcmtlci5nZXRDb250ZXh0KCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJCWlmIChfZGVidWcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudE1hbmFnZXIgcmVtb3ZpbmcgYmxvY2sgdGFnIG5hbWVkOiAiICsgbWFya2VyLmdldFRhZ05hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQluYW1lcy5yZW1vdmUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkJaWYgKERlYnVnLmRlYnVnVGFnbGlicykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiByZXNldHRpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2V0SW5jbHVkZXMoKS5jbGVhcigpOwotCQkJcmVzZXRCbG9ja1RhZ3MoKTsKLQkJCXJlc2V0VGFnbGliVHJhY2tlcnMoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0JCQlBc3NlcnQuaXNUcnVlKG5ld0RvY3VtZW50ICE9IG51bGwsICJudWxsIGRvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCUFzc2VydC5pc1RydWUobmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkgIT0gbnVsbCwgIm51bGwgZG9jdW1lbnQgcGFyc2VyIik7IC8vJE5PTi1OTFMtMSQKLQkJCUFzc2VydC5pc1RydWUobmV3RG9jdW1lbnQuZ2V0UGFyc2VyKCkgaW5zdGFuY2VvZiBKU1BTb3VyY2VQYXJzZXIsICJjYW4gb25seSBsaXN0ZW4gdG8gZG9jdW1lbnQgd2l0aCBhIEpTUFNvdXJjZVBhcnNlciIpOyAvLyROT04tTkxTLTEkCi0JCQlnZXRTb3VyY2VQYXJzZXIoKS5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQkJc2V0U291cmNlUGFyc2VyKChKU1BTb3VyY2VQYXJzZXIpIG5ld0RvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJCWdldFNvdXJjZVBhcnNlcigpLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgSW5jbHVkZUhlbHBlciBleHRlbmRzIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmQW5jaG9yID0gbnVsbDsKLQkJcHJvdGVjdGVkIEpTUFNvdXJjZVBhcnNlciBmTG9jYWxQYXJzZXIgPSBudWxsOwotCQlwcm90ZWN0ZWQgSlNQU291cmNlUGFyc2VyIGZQYXJlbnRQYXJzZXIgPSBudWxsOwotCQlMaXN0IHRhZ2xpYlJlZmVyZW5jZXMgPSBudWxsOwotCi0JCXB1YmxpYyBJbmNsdWRlSGVscGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5jaG9yLCBKU1BTb3VyY2VQYXJzZXIgcm9vdFBhcnNlcikgewotCQkJc3VwZXIoKTsKLQkJCWZBbmNob3IgPSBhbmNob3I7Ci0JCQlmUGFyZW50UGFyc2VyID0gcm9vdFBhcnNlcjsKLQkJCXRhZ2xpYlJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkVGFnbGliVHJhY2tlcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvclN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgQ01Eb2N1bWVudCB0bGRDTURvY3VtZW50KSB7Ci0JCQlzdXBlci5hZGRUYWdsaWJUcmFja2VyKHByZWZpeCwgdXJpLCBhbmNob3JTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHRsZENNRG9jdW1lbnQpOwotCQkJVExEQ01Eb2N1bWVudFJlZmVyZW5jZSByZWZlcmVuY2UgPSBuZXcgVExEQ01Eb2N1bWVudFJlZmVyZW5jZSgpOwotCQkJcmVmZXJlbmNlLnByZWZpeCA9IHByZWZpeDsKLQkJCXJlZmVyZW5jZS51cmkgPSB1cmk7Ci0JCQl0YWdsaWJSZWZlcmVuY2VzLmFkZChyZWZlcmVuY2UpOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgZGV0ZWN0Q2hhcnNldChJRmlsZSBmaWxlKSB7Ci0JCQlpZiAoZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gb3B0aW1pemVkIGRlc2NyaXB0aW9uIGxvb2t1cCwgbWlnaHQgbm90IHN1Y2NlZWQKLQkJCQkJZCA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gZC5nZXRDaGFyc2V0KCk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBnaXZlbiB0aGUgYWNjZXNzaWJsZSBhbmQgZmlsZQotCQkJCQkvLyB0eXBlCi0JCQkJCS8vIGNoZWNrIGFib3ZlCi0JCQkJfQotCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQljb250ZW50cyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKGNvbnRlbnRzLCBmaWxlLmdldE5hbWUoKSwgbmV3IFF1YWxpZmllZE5hbWVbXXtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVR9KTsKLQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBkZXNjcmlwdGlvbi5nZXRDaGFyc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gd2lsbCB0cnkgdG8gY2xlYW51cCBpbiBmaW5hbGx5Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRzKElQYXRoIGZpbGVQYXRoKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCUlGaWxlIGlGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZpbGVQYXRoKTsKLQkJCWlmIChpRmlsZSAhPSBudWxsICYmIGlGaWxlLmV4aXN0cygpKSB7Ci0JCQkJU3RyaW5nIGNoYXJzZXQgPSBkZXRlY3RDaGFyc2V0KGlGaWxlKTsKLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMgPSBpRmlsZS5nZXRDb250ZW50cygpOwotCQkJCQlSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbnRlbnRzLCBjaGFyc2V0KTsKLQkJCQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQkJCQkJaW50IG4gPSByZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJCQkJd2hpbGUgKG4gPiAwKSB7Ci0JCQkJCQlzLmFwcGVuZChyZWFkQnVmZmVyLCAwLCBuKTsKLQkJCQkJCW4gPSByZWFkZXIucmVhZChyZWFkQnVmZmVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkFuIGV4Y2VwdGlvbiBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nICIgKyBmaWxlUGF0aCwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnQgYyA9IDA7Ci0JCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQkJaW50IGNvdW50ID0gMDsKLQkJCQlGaWxlIGZpbGUgPSBudWxsOwotCQkJCUZpbGVJbnB1dFN0cmVhbSBmaXMgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aC50b1N0cmluZygpKTsKLQkJCQkJbGVuZ3RoID0gKGludCkgZmlsZS5sZW5ndGgoKTsKLQkJCQkJZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCQkJd2hpbGUgKCgoYyA9IGZpcy5yZWFkKCkpID49IDApICYmIChjb3VudCA8IGxlbmd0aCkpIHsKLQkJCQkJCWNvdW50Kys7Ci0JCQkJCQlzLmFwcGVuZCgoY2hhcikgYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIgKyBmaWxlUGF0aCArICJcIiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSB3cm9uZzogc3BlY2lmeSBpbnB1dGZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGZpcyAhPSBudWxsKSB7Ci0JCQkJCQkJZmlzLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBub3RoaW5nIHRvIGRvCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcy50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9kZVBhcnNlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkvLyBjb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgOCAoPCVALAotCQkJLy8gdGFnbGliLCB1cmksID0sIHdoZXJlLCBwcmVmaXgsID0sIHdoYXQpCi0JCQlpZiAoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAxICYmIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJCXRyeSB7Ci0JCQkJCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gZkxvY2FsUGFyc2VyLmdldFRleHQoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSksIG5hbWUuZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJaWYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyVExETmFtZXMuVEFHTElCKSB8fCBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKSkgewotCQkJCQkJcHJvY2Vzc1RhZ2xpYihhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZkFuY2hvciwgZkxvY2FsUGFyc2VyKTsKLQkJCQkJfQotCQkJCQlpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoSlNQMTJUTEROYW1lcy5JTkNMVURFKSB8fCBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSkpIHsKLQkJCQkJCXByb2Nlc3NJbmNsdWRlKGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBmQW5jaG9yLCBmTG9jYWxQYXJzZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgNSAoPCwKLQkJCS8vIGpzcDpyb290LCB4bWxuczpwcmVmaXgsID0sIHdoZXJlKQotCQkJZWxzZSBpZiAoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiA0ICYmIGFDb3JlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKSB7Ci0JCQkJcHJvY2Vzc0pTUFJvb3QoYUNvcmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGZBbmNob3IsIGZMb2NhbFBhcnNlcik7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIHBhdGggLQotCQkgKiAgICAgICAgICAgIHRoZSBmdWxscGF0aCBmb3IgdGhlIHJlc291cmNlIHRvIGJlIHBhcnNlZAotCQkgKi8KLQkJdm9pZCBwYXJzZShJUGF0aCBwYXRoKSB7Ci0JCQlKU1BTb3VyY2VQYXJzZXIgcCA9IG5ldyBKU1BTb3VyY2VQYXJzZXIoKTsKLQkJCWZMb2NhbFBhcnNlciA9IHA7Ci0JCQlMaXN0IGJsb2NrVGFncyA9IGZQYXJlbnRQYXJzZXIuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCQlTdHJpbmcgcyA9IGdldENvbnRlbnRzKHBhdGgpOwotCQkJZkxvY2FsUGFyc2VyLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIodGhpcyk7Ci0JCQlmTG9jYWxQYXJzZXIucmVzZXQocyk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJsb2NrVGFncy5zaXplKCk7IGkrKykgewotCQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcikgYmxvY2tUYWdzLmdldChpKTsKLQkJCQlmTG9jYWxQYXJzZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKG1hcmtlci5nZXRUYWdOYW1lKCksIG51bGwsIG1hcmtlci5nZXRDb250ZXh0KCksIG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkpOwotCQkJfQotCQkJLy8gZm9yY2UgcGFyc2UKLQkJCWZMb2NhbFBhcnNlci5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJCWZMb2NhbFBhcnNlciA9IG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogQW4gZW50cnkgaW4gdGhlIHNoYXJlZCBjYWNoZSBtYXAKLQkgKi8KLQlzdGF0aWMgY2xhc3MgVExEQ2FjaGVFbnRyeSB7Ci0JCUNNRG9jdW1lbnQgZG9jdW1lbnQ7Ci0JCWludCByZWZlcmVuY2VDb3VudDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBUTERDTURvY3VtZW50RGVzY3JpcHRvciB7Ci0JCU9iamVjdCBjYWNoZUtleTsKLQkJQ01Eb2N1bWVudCBkb2N1bWVudDsKLQotCQlUTERDTURvY3VtZW50RGVzY3JpcHRvcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFRMRENNRG9jdW1lbnRSZWZlcmVuY2UgewotCQlTdHJpbmcgcHJlZml4OwotCQlTdHJpbmcgdXJpOwotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9tYW5hZ2VyIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdDYWNoZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGxkY21kb2N1bWVudC9jYWNoZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8gd2lsbCBob2xkIHRoZSBwcmVmaXhlcyBiYW5uZWQgYnkgdGhlIHNwZWNpZmljYXRpb247IHRhZ2xpYnMgbWF5IG5vdCB1c2UKLQkvLyB0aGVtCi0JcHJvdGVjdGVkIHN0YXRpYyBMaXN0IGJhbm5lZFByZWZpeGVzID0gbnVsbDsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBmQ2FjaGUgPSBudWxsOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlMgPSAieG1sbnM6IjsgLy8kTk9OLU5MUy0xJCAKLQotCXN0YXRpYyBmaW5hbCBpbnQgWE1MTlNfTEVOR1RIID0gWE1MTlMubGVuZ3RoKCk7Ci0KLQlzdGF0aWMgewotCQliYW5uZWRQcmVmaXhlcyA9IG5ldyBBcnJheUxpc3QoNyk7Ci0JCWJhbm5lZFByZWZpeGVzLmFkZCgianNwIik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJqc3B4Iik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJqYXZhIik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJqYXZheCIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgic2VydmxldCIpOyAvLyROT04tTkxTLTEkCi0JCWJhbm5lZFByZWZpeGVzLmFkZCgic3VuIik7IC8vJE5PTi1OTFMtMSQKLQkJYmFubmVkUHJlZml4ZXMuYWRkKCJzdW53Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGFsbCBvZiB0aGUga25vd24gZG9jdW1lbnRzLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEhhc2h0YWJsZSBvZiBlaXRoZXIgVExEQ2FjaGVFbnRyeXMgb3IgV2Vha1JlZmVyZW5jZXMKLQkgKiAgICAgICAgIHRvIFRMRCBDTURvY3VtZW50cwotCSAqLwotCXB1YmxpYyBzdGF0aWMgSGFzaHRhYmxlIGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKSB7Ci0JCWlmIChmQ2FjaGUgPT0gbnVsbCkgewotCQkJZkNhY2hlID0gbmV3IEhhc2h0YWJsZSgpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGU7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRVbmlxdWVJZGVudGlmaWVyKElUYWdsaWJSZWNvcmQgcmVmZXJlbmNlKSB7Ci0JCU9iamVjdCBpZGVudGlmaWVyID0gbnVsbDsKLQkJc3dpdGNoIChyZWZlcmVuY2UuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRMRCkgOiB7Ci0JCQkJSVRMRFJlY29yZCByZWNvcmQgPSAoSVRMRFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWlkZW50aWZpZXIgPSByZWNvcmQuZ2V0UGF0aCgpOwotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCUlKYXJSZWNvcmQgcmVjb3JkID0gKElKYXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQlpZGVudGlmaWVyID0gcmVjb3JkLmdldExvY2F0aW9uKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlRBR0RJUikgOiB7Ci0JCQkJLy8gVGFnRGlyUmVjb3JkIHJlY29yZCA9IChUYWdEaXJSZWNvcmQpIHJlZmVyZW5jZTsKLQkJCQkvLyBkb2N1bWVudCA9Ci0JCQkJLy8gYnVpbGRDTURvY3VtZW50RnJvbURpcmVjdG9yeShyZWNvcmQuZ2V0TG9jYXRpb24oKS50b0ZpbGUoKSk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIChJVGFnbGliUmVjb3JkLlVSTCkgOiB7Ci0JCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVmZXJlbmNlOwotCQkJCWlkZW50aWZpZXIgPSByZWNvcmQuZ2V0VVJMKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZGVudGlmaWVyID0gcmVmZXJlbmNlOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBpZGVudGlmaWVyOwotCX0KLQlwcml2YXRlIENNRG9jdW1lbnRGYWN0b3J5VExEIGZDTURvY3VtZW50QnVpbGRlciA9IG51bGw7Ci0KLQlwcml2YXRlIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgZkRpcmVjdGl2ZUhhbmRsZXIgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGxvY2FsbHkta25vdyBsaXN0IG9mIENNRG9jdW1lbnRzCi0JICovCi0JcHJpdmF0ZSBIYXNodGFibGUgZkRvY3VtZW50cyA9IG51bGw7Ci0KLQkvLyB0aW1lc3RhbXAgY2FjaGUgdG8gcHJldmVudCBleGNlc3NpdmUgcmVwYXJzaW5nCi0JLy8gb2YgaW5jbHVkZWQgZmlsZXMKLQkvLyBJUGF0aCAoZmlsZXBhdGgpID4gTG9uZyAobW9kaWZpY2F0aW9uIHN0YW1wKQotCUhhc2hNYXAgZkluY2x1ZGUyVGltZXN0YW1wTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgU3RhY2sgZkluY2x1ZGVzID0gbnVsbDsKLQotCXByaXZhdGUgSlNQU291cmNlUGFyc2VyIGZQYXJzZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0IGZUYWdsaWJUcmFja2VycyA9IG51bGw7Ci0KLQlNYXAgZlRMRENNUmVmZXJlbmNlc01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgVExEQ01Eb2N1bWVudE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJDYWNoZSgpIHsKLQkJaWYgKF9kZWJ1Z0NhY2hlKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRMRENNRG9jdW1lbnRNYW5hZ2VyIGNsZWFyZWQgaXRzIHByaXZhdGUgQ01Eb2N1bWVudCBjYWNoZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZm9yIChJdGVyYXRvciBpdGVyID0gZ2V0RG9jdW1lbnRzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KSB7Ci0JCQlPYmplY3Qga2V5ID0gaXRlci5uZXh0KCk7Ci0JCQlzeW5jaHJvbml6ZWQgKGdldFNoYXJlZERvY3VtZW50Q2FjaGUoKSkgewotCQkJCU9iamVjdCBvID0gZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLmdldChrZXkpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgVExEQ2FjaGVFbnRyeSkgewotCQkJCQlUTERDYWNoZUVudHJ5IGVudHJ5ID0gKFRMRENhY2hlRW50cnkpIG87Ci0JCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50LS07Ci0JCQkJCWlmIChlbnRyeS5yZWZlcmVuY2VDb3VudCA8PSAwKSB7Ci0JCQkJCQlnZXRTaGFyZWREb2N1bWVudENhY2hlKCkucHV0KGtleSwgbmV3IFdlYWtSZWZlcmVuY2UoZW50cnkuZG9jdW1lbnQpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIERlcml2ZXMgYW4gdW5pcXVlIGNhY2hlIGtleSBmb3IgdGhlIGdpdmUgVVJJLiBUaGUgVVJJIGlzICJyZXNvbHZlZCIKLQkgKiBhbmQgYSB1bmlxdWUgdmFsdWUgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdC4gVGhpcyBlbnN1cmVzIHRoYXQgdHdvCi0JICogZGlmZmVyZW50IHJlbGF0aXZlIHJlZmVyZW5jZXMgZnJvbSBkaWZmZXJlbnQgZmlsZXMgZG8gbm90IGhhdmUgb3ZlcmxhcHBpbmcKLQkgKiBUTEQgcmVjb3JkcyBpbiB0aGUgc2hhcmVkIGNhY2hlIGlmIHRoZXkgZG9uJ3QgcmVzb2x2ZSB0byB0aGUgc2FtZSBUTEQuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldENhY2hlS2V5KFN0cmluZyB1cmkpIHsKLQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGdldEN1cnJlbnRQYXJzZXJQYXRoKCkudG9TdHJpbmcoKSwgdXJpLCBmYWxzZSk7Ci0JCWlmIChyZWNvcmQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFVuaXF1ZUlkZW50aWZpZXIocmVjb3JkKTsKLQkJfQotCQlTdHJpbmcgbG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpLnRvU3RyaW5nKCksIG51bGwsIHVyaSk7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIENNRG9jdW1lbnQgYXQgdGhlIHVyaSAoY2FjaGVkKQotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHVyaSkgewotCQlpZiAodXJpID09IG51bGwgfHwgdXJpLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlZmVyZW5jZSA9IHVyaTsKLQkJLyoqCi0JCSAqIEpTUCAxLjIgU3BlY2lmaWNhdGlvbiwgc2VjdGlvbiA1LjIuMiBqc3AtMV8yLWZjcy1zcGVjLnBkZiwgcGFnZSA4NwotCQkgKi8KLQkJU3RyaW5nIFVSTnByZWZpeCA9ICJ1cm46anNwdGxkOiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlZmVyZW5jZS5zdGFydHNXaXRoKFVSTnByZWZpeCkpIHsKLQkJCS8qKgotCQkJICogQHNlZSBzZWN0aW9uIDcuMy4yCi0JCQkgKi8KLQkJCWlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPiBVUk5wcmVmaXgubGVuZ3RoKCkpCi0JCQkJcmVmZXJlbmNlID0gcmVmZXJlbmNlLnN1YnN0cmluZygxMSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgc2VjdGlvbiA3LjMuNgotCQkJICovCi0JCX0KLQkJT2JqZWN0IGNhY2hlS2V5ID0gZ2V0Q2FjaGVLZXkocmVmZXJlbmNlKTsKLQkJQ01Eb2N1bWVudCBkb2MgPSAoQ01Eb2N1bWVudCkgZ2V0RG9jdW1lbnRzKCkuZ2V0KGNhY2hlS2V5KTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogSWYgaGFzbid0IGJlZW4gbW92ZWQgaW50byB0aGUgbG9jYWwgdGFibGUsIGRvIHNvIGFuZCBpbmNyZW1lbnQKLQkJCSAqIHRoZSBjb3VudC4gQSBsb2NhbCBVUkkgcmVmZXJlbmNlIGNhbiBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uCi0JCQkgKiB0aGUgZmlsZSBmcm9tIHdoaWNoIGl0IHdhcyByZWZlcmVuY2VkLiBVc2UgYSBjb21wdXRlZCBrZXkgdG8KLQkJCSAqIGtlZXAgdGhlbSBzdHJhaWdodC4KLQkJCSAqLwotCQkJT2JqZWN0IG8gPSBnZXRTaGFyZWREb2N1bWVudENhY2hlKCkuZ2V0KGNhY2hlS2V5KTsKLQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQlpZiAobyBpbnN0YW5jZW9mIFRMRENhY2hlRW50cnkpIHsKLQkJCQkJVExEQ2FjaGVFbnRyeSBlbnRyeSA9IChUTERDYWNoZUVudHJ5KSBvOwotCQkJCQlpZiAoX2RlYnVnQ2FjaGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVExEQ01Eb2N1bWVudCBjYWNoZSBoaXQgb24gIiArIGNhY2hlS2V5KTsKLQkJCQkJfQotCQkJCQlkb2MgPSBlbnRyeS5kb2N1bWVudDsKLQkJCQkJZW50cnkucmVmZXJlbmNlQ291bnQrKzsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIFdlYWtSZWZlcmVuY2UpIHsKLQkJCQkJZG9jID0gKENNRG9jdW1lbnQpICgoV2Vha1JlZmVyZW5jZSkgbykuZ2V0KCk7Ci0JCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQkJVExEQ2FjaGVFbnRyeSBlbnRyeSA9IG5ldyBUTERDYWNoZUVudHJ5KCk7Ci0JCQkJCQllbnRyeS5kb2N1bWVudCA9IGRvYzsKLQkJCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50ID0gMTsKLQkJCQkJCWdldFNoYXJlZERvY3VtZW50Q2FjaGUoKS5wdXQoY2FjaGVLZXksIGVudHJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8qIE5vIGRvY3VtZW50IHdhcyBmb3VuZCBjYWNoZWQsIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHNoYXJlIGl0ICovCi0JCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCQlpZiAoX2RlYnVnQ2FjaGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50IGNhY2hlIG1pc3Mgb24gIiArIGNhY2hlS2V5KTsKLQkJCQl9Ci0JCQkJVExEQ01Eb2N1bWVudERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGxvYWRUYWdsaWIocmVmZXJlbmNlKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCVRMRENhY2hlRW50cnkgZW50cnkgPSBuZXcgVExEQ2FjaGVFbnRyeSgpOwotCQkJCQlkb2MgPSBlbnRyeS5kb2N1bWVudCA9IGRlc2NyaXB0b3IuZG9jdW1lbnQ7Ci0JCQkJCWVudHJ5LnJlZmVyZW5jZUNvdW50ID0gMTsKLQkJCQkJZ2V0U2hhcmVkRG9jdW1lbnRDYWNoZSgpLnB1dChjYWNoZUtleSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCWdldERvY3VtZW50cygpLnB1dChjYWNoZUtleSwgZG9jKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZG9jOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNNRG9jdW1lbnRCdWlsZGVyLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIENNRG9jdW1lbnRGYWN0b3J5VExELCBzaW5jZSBpdCBoYXMgbW9yZSBidWlsZGVyCi0JICogICAgICAgICBtZXRob2RzCi0JICovCi0JcHJvdGVjdGVkIENNRG9jdW1lbnRGYWN0b3J5VExEIGdldENNRG9jdW1lbnRCdWlsZGVyKCkgewotCQlpZiAoZkNNRG9jdW1lbnRCdWlsZGVyID09IG51bGwpCi0JCQlmQ01Eb2N1bWVudEJ1aWxkZXIgPSBuZXcgQ01Eb2N1bWVudEZhY3RvcnlUTEQoKTsKLQkJcmV0dXJuIGZDTURvY3VtZW50QnVpbGRlcjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50VHJhY2tlcnMoaW50IG9mZnNldCkgewotCQlMaXN0IHZhbGlkRG9jcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgYWxsZG9jcyA9IGdldFRhZ2xpYlRyYWNrZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGFsbGRvY3MuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIGFUcmFja2VyID0gKFRhZ2xpYlRyYWNrZXIpIGFsbGRvY3MubmV4dCgpOwotCQkJaWYgKGFUcmFja2VyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgPCBvZmZzZXQgfHwgb2Zmc2V0IDwgMCkgewotCQkJCXZhbGlkRG9jcy5hZGQoYVRyYWNrZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZERvY3M7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKFN0cmluZyBwcmVmaXgsIGludCBvZmZzZXQpIHsKLQkJTGlzdCB2YWxpZERvY3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGFsbGRvY3MgPSBnZXRUYWdsaWJUcmFja2VycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChhbGxkb2NzLmhhc05leHQoKSkgewotCQkJVGFnbGliVHJhY2tlciBhVHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSBhbGxkb2NzLm5leHQoKTsKLQkJCWlmICgoYVRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSA8IG9mZnNldCB8fCBvZmZzZXQgPCAwKSAmJiBhVHJhY2tlci5nZXRQcmVmaXgoKS5lcXVhbHMocHJlZml4KSkgewotCQkJCXZhbGlkRG9jcy5hZGQoYVRyYWNrZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiB2YWxpZERvY3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmaWxlc3lzdGVtIGxvY2F0aW9uIGluIHRoZSBjdXJyZW50IHBhcnNlci4gVGhpcyBtZXRob2QgaXMKLQkgKiBjYWxsZWQgd2hpbGUgcmVjdXJzaW5nIHRocm91Z2ggaW5jbHVkZWQgZnJhZ21lbnRzLCBzbyBpdCBtdWNoIGNoZWNrIHRoZQotCSAqIGluY2x1ZGUgc3RhY2suIFRoZSBmaWxlc3lzdGVtIGxvY2F0aW9uIGlzIG5lZWRlZCBmb3IgY29tbW9uIFVSSQotCSAqIHJlc29sdXRpb24gaW4gY2FzZSB0aGUgVGFnbGliIEluZGV4IGRvZXNuJ3Qga25vdyB0aGUgVVJJIGJlaW5nIGxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVBhdGggZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpIHsKLQkJSVBhdGggYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJSVBhdGggcGF0aCA9IGdldEN1cnJlbnRQYXJzZXJQYXRoKCk7Ci0JCWJhc2VMb2NhdGlvbiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRMb2NhdGlvbigpOwotCQlpZiAoYmFzZUxvY2F0aW9uID09IG51bGwpIHsKLQkJCWJhc2VMb2NhdGlvbiA9IHBhdGg7Ci0JCX0KLQkJcmV0dXJuIGJhc2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhdGggdXNlZCBpbiB0aGUgY3VycmVudCBwYXJzZXIuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGlsZQotCSAqIHJlY3Vyc2luZyB0aHJvdWdoIGluY2x1ZGVkIGZyYWdtZW50cywgc28gaXQgbXVjaCBjaGVjayB0aGUgaW5jbHVkZQotCSAqIHN0YWNrLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJUGF0aCBnZXRDdXJyZW50UGFyc2VyUGF0aCgpIHsKLQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCWlmICghZ2V0SW5jbHVkZXMoKS5pc0VtcHR5KCkpIHsKLQkJCXBhdGggPSAoSVBhdGgpIGdldEluY2x1ZGVzKCkucGVlaygpOwotCQl9Ci0JCWVsc2UgewotCQkJcGF0aCA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0RmlsZUJ1ZmZlcih0aGlzKS5nZXRMb2NhdGlvbigpOwotCQl9Ci0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JcHJvdGVjdGVkIERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgZ2V0RGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpIHsKLQkJaWYgKGZEaXJlY3RpdmVIYW5kbGVyID09IG51bGwpCi0JCQlmRGlyZWN0aXZlSGFuZGxlciA9IG5ldyBEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCk7Ci0JCXJldHVybiBmRGlyZWN0aXZlSGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkb2N1bWVudHMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgamF2YS51dGlsLkhhc2h0YWJsZQotCSAqLwotCXB1YmxpYyBIYXNodGFibGUgZ2V0RG9jdW1lbnRzKCkgewotCQlpZiAoZkRvY3VtZW50cyA9PSBudWxsKQotCQkJZkRvY3VtZW50cyA9IG5ldyBIYXNodGFibGUoKTsKLQkJcmV0dXJuIGZEb2N1bWVudHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBDTURvY3VtZW50IGF0IHRoZSB0YWdkaXIgKGNhY2hlZCkKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBnZXRJbXBsaWNpdENNRG9jdW1lbnQoU3RyaW5nIHRhZ2RpcikgewotCQlpZiAodGFnZGlyID09IG51bGwgfHwgdGFnZGlyLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHJlZmVyZW5jZSA9IHRhZ2RpcjsKLQkJLyoqCi0JCSAqIEpTUCAxLjIgU3BlY2lmaWNhdGlvbiwgc2VjdGlvbiA1LjIuMiBqc3AtMV8yLWZjcy1zcGVjLnBkZiwgcGFnZSA4NwotCQkgKi8KLQkJU3RyaW5nIFVSTnByZWZpeCA9ICJ1cm46anNwdGxkOiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlZmVyZW5jZS5zdGFydHNXaXRoKFVSTnByZWZpeCkpIHsKLQkJCS8qKgotCQkJICogQHNlZSBzZWN0aW9uIDcuMy4yCi0JCQkgKi8KLQkJCWlmIChyZWZlcmVuY2UubGVuZ3RoKCkgPiBVUk5wcmVmaXgubGVuZ3RoKCkpCi0JCQkJcmVmZXJlbmNlID0gcmVmZXJlbmNlLnN1YnN0cmluZygxMSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgc2VjdGlvbiA3LjMuNgotCQkJICovCi0JCX0KLQkJQ01Eb2N1bWVudCBkb2MgPSAoQ01Eb2N1bWVudCkgZ2V0RG9jdW1lbnRzKCkuZ2V0KHJlZmVyZW5jZSk7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJZG9jID0gbG9hZFRhZ0RpcihyZWZlcmVuY2UpOwotCQkJaWYgKGRvYyAhPSBudWxsKQotCQkJCWdldERvY3VtZW50cygpLnB1dChyZWZlcmVuY2UsIGRvYyk7Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmNsdWRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdGFjawotCSAqLwotCXByb3RlY3RlZCBTdGFjayBnZXRJbmNsdWRlcygpIHsKLQkJaWYgKGZJbmNsdWRlcyA9PSBudWxsKQotCQkJZkluY2x1ZGVzID0gbmV3IFN0YWNrKCk7Ci0JCXJldHVybiBmSW5jbHVkZXM7Ci0JfQotCi0JSlNQU291cmNlUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JcHVibGljIEpTUFNvdXJjZVBhcnNlciBnZXRTb3VyY2VQYXJzZXIoKSB7Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSB7Ci0JCXJldHVybiBnZXREaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFRhZ2xpYlRyYWNrZXJzKCkgewotCQlpZiAoZlRhZ2xpYlRyYWNrZXJzID09IG51bGwpCi0JCQlmVGFnbGliVHJhY2tlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBmVGFnbGliVHJhY2tlcnM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGVQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0byBjaGVjayBmb3IgbW9kaWZpY2F0aW9uCi0JICovCi0JYm9vbGVhbiBoYXNBbnlJbmNsdWRlQmVlbk1vZGlmaWVkKElQYXRoIGZpbGVQYXRoKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGNoZWNrIHRoZSB0b3AgbGV2ZWwKLQkJaWYgKGhhc0JlZW5Nb2RpZmllZChmaWxlUGF0aCkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBjaGVjayBhbGwgaW5jbHVkZWVzCi0JCQlJdGVyYXRvciBpdGVyID0gZkluY2x1ZGUyVGltZXN0YW1wTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoaGFzQmVlbk1vZGlmaWVkKChJUGF0aCkgaXRlci5uZXh0KCkpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmaWxlbmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGhhc0JlZW5Nb2RpZmllZChJUGF0aCBmaWxlUGF0aCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBxdWljayBmaWxlbmFtZS90aW1lc3RhbXAgY2FjaGUgY2hlY2sgaGVyZS4uLgotCQlJRmlsZSBmID0gbnVsbDsKLQkJaWYgKGYgPT0gbnVsbCAmJiBmaWxlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWYgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZmlsZVBhdGgpOwotCQl9Ci0JCWlmIChmICE9IG51bGwgJiYgZi5leGlzdHMoKSkgewotCQkJTG9uZyBjdXJyZW50U3RhbXAgPSBuZXcgTG9uZyhmLmdldE1vZGlmaWNhdGlvblN0YW1wKCkpOwotCQkJT2JqZWN0IG8gPSBmSW5jbHVkZTJUaW1lc3RhbXBNYXAuZ2V0KGZpbGVQYXRoKTsKLQkJCWlmIChvICE9IG51bGwpIHsKLQkJCQlMb25nIHByZXZpb3VzU3RhbXAgPSAoTG9uZykgbzsKLQkJCQkvLyBzdGFtcHMgZG9uJ3QgbWF0Y2gsIGZpbGUgY2hhbmdlZAotCQkJCWlmIChjdXJyZW50U3RhbXAubG9uZ1ZhbHVlKCkgIT0gcHJldmlvdXNTdGFtcC5sb25nVmFsdWUoKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkvLyBzdG9yZSBmb3IgbmV4dCB0aW1lCi0JCQkJCWZJbmNsdWRlMlRpbWVzdGFtcE1hcC5wdXQoZmlsZVBhdGgsIGN1cnJlbnRTdGFtcCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmV0dXJuIHRydWUsIHNpbmNlIHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCB0aGlzIGZpbGUgeWV0LgotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJLy8gc3RvcmUgZm9yIG5leHQgdGltZQotCQkJCWZJbmNsdWRlMlRpbWVzdGFtcE1hcC5wdXQoZmlsZVBhdGgsIGN1cnJlbnRTdGFtcCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbmRleENoYW5nZWQoSVRhZ2xpYlJlY29yZEV2ZW50IGV2ZW50KSB7fQotCi0JLyoqCi0JICogTG9hZHMgdGhlIHRhZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIFVSSS4gSXQgbXVzdCBwb2ludCB0byBhIFVSTCBvZiB2YWxpZAotCSAqIHRhZyBmaWxlcyB0byB3b3JrLgotCSAqLwotCXByb3RlY3RlZCBDTURvY3VtZW50IGxvYWRUYWdEaXIoU3RyaW5nIHVyaSkgewotCQlJVGFnbGliUmVjb3JkIHJlZmVyZW5jZSA9IFRhZ2xpYkluZGV4LnJlc29sdmUoZ2V0Q3VycmVudFBhcnNlclBhdGgoKS50b1N0cmluZygpLCB1cmksIGZhbHNlKTsKLQkJaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGRvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKS5jcmVhdGVDTURvY3VtZW50KHJlZmVyZW5jZSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBkb2N1bWVudDsKLQkJCX0KLQkJfQotCQkvLyBKU1AyX1RPRE86IGltcGxlbWVudCBmb3IgSlNQIDIuMAotCQlTdHJpbmcgbG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoZ2V0Q3VycmVudEJhc2VMb2NhdGlvbigpLnRvU3RyaW5nKCksIG51bGwsIHVyaSk7Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChfZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyB0YWdzIGZyb20gZGlyIiArIHVyaSArICIgYXQgIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKS5jcmVhdGVDTURvY3VtZW50KGxvY2F0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgdGFnbGliIGZyb20gdGhlIHNwZWNpZmllZCBVUkkuIEl0IG11c3QgcG9pbnQgdG8gYSB2YWxpZAotCSAqIHRhZ2xpYiBkZXNjcmlwdG9yIHRvIHdvcmsuCi0JICovCi0JcHJvdGVjdGVkIFRMRENNRG9jdW1lbnREZXNjcmlwdG9yIGxvYWRUYWdsaWIoU3RyaW5nIHVyaSkgewotCQlUTERDTURvY3VtZW50RGVzY3JpcHRvciBlbnRyeSA9IG51bGw7Ci0JCUlQYXRoIGN1cnJlbnRQYXRoID0gZ2V0Q3VycmVudFBhcnNlclBhdGgoKTsKLQkJaWYgKGN1cnJlbnRQYXRoICE9IG51bGwpIHsKLQkJCUNNRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBUYWdsaWJJbmRleC5yZXNvbHZlKGN1cnJlbnRQYXRoLnRvU3RyaW5nKCksIHVyaSwgZmFsc2UpOwotCQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQkJZG9jdW1lbnQgPSBnZXRDTURvY3VtZW50QnVpbGRlcigpLmNyZWF0ZUNNRG9jdW1lbnQocmVjb3JkKTsKLQkJCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQllbnRyeSA9IG5ldyBUTERDTURvY3VtZW50RGVzY3JpcHRvcigpOwotCQkJCQllbnRyeS5kb2N1bWVudCA9IGRvY3VtZW50OwotCQkJCQllbnRyeS5jYWNoZUtleSA9IGdldFVuaXF1ZUlkZW50aWZpZXIocmVjb3JkKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKiBOb3QgYSB2ZXJ5LW9mdGVuIHVzZWQgY29kZSBwYXRoICh3ZSBob3BlKSAqLwotCQkJCUlQYXRoIGN1cnJlbnRCYXNlTG9jYXRpb24gPSBnZXRDdXJyZW50QmFzZUxvY2F0aW9uKCk7Ci0JCQkJaWYgKGN1cnJlbnRCYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoY3VycmVudEJhc2VMb2NhdGlvbi50b1N0cmluZygpLCBudWxsLCB1cmkpOwotCQkJCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQkJaWYgKF9kZWJ1ZykgewotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyB0YWdzIGZyb20gIiArIHVyaSArICIgYXQgIiArIGxvY2F0aW9uKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWRvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudEJ1aWxkZXIoKS5jcmVhdGVDTURvY3VtZW50KGxvY2F0aW9uKTsKLQkJCQkJCWVudHJ5ID0gbmV3IFRMRENNRG9jdW1lbnREZXNjcmlwdG9yKCk7Ci0JCQkJCQllbnRyeS5kb2N1bWVudCA9IGRvY3VtZW50OwotCQkJCQkJZW50cnkuY2FjaGVLZXkgPSBsb2NhdGlvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZW50cnk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVzZXRUYWdsaWJUcmFja2VycygpIHsKLQkJaWYgKF9kZWJ1ZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUTERDTURvY3VtZW50TWFuYWdlciBjbGVhcmVkIGl0cyB0YWdsaWIgdHJhY2tlcnNcbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZ2V0VGFnbGliVHJhY2tlcnMoKS5jbGVhcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNvdXJjZVBhcnNlcihKU1BTb3VyY2VQYXJzZXIgcGFyc2VyKSB7Ci0JCWlmIChmUGFyc2VyICE9IG51bGwpCi0JCQlmUGFyc2VyLnJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcigpKTsKLQkJZlBhcnNlciA9IHBhcnNlcjsKLQkJaWYgKGZQYXJzZXIgIT0gbnVsbCkKLQkJCWZQYXJzZXIuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExERnVuY3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExERnVuY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YzdkZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMREZ1bmN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgVExERnVuY3Rpb25JbXBsIGltcGxlbWVudHMgVExERnVuY3Rpb24gewotCXByaXZhdGUgU3RyaW5nIGZDbGFzc05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmRXhhbXBsZSA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgwKTsKLQlwcml2YXRlIFN0cmluZyBmSWNvbiA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5hbWUgPSBudWxsOwotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmU2lnbmF0dXJlID0gbnVsbDsKLQotCXB1YmxpYyBUTERGdW5jdGlvbkltcGwoQ01Eb2N1bWVudCBvd25lcikgewotCQlzdXBlcigpOwotCQlmT3duZXJEb2N1bWVudCA9IG93bmVyOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY2xhc3NOYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZkNsYXNzTmFtZTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gZkRlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZGlzcGxheU5hbWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5TmFtZSgpIHsKLQkJcmV0dXJuIGZEaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGV4YW1wbGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFeGFtcGxlKCkgewotCQlyZXR1cm4gZkV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBleHRlbnNpb25zLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEV4dGVuc2lvbnMoKSB7Ci0JCXJldHVybiBmRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGljb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJY29uKCkgewotCQlyZXR1cm4gZkljb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBuYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3duZXJEb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gZk93bmVyRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzaWduYXR1cmUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmUoKSB7Ci0JCXJldHVybiBmU2lnbmF0dXJlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjbGFzc05hbWUKLQkgKiAgICAgICAgICAgIFRoZSBjbGFzc05hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCWZDbGFzc05hbWUgPSBjbGFzc05hbWU7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiBUaGUgZGVzY3JpcHRpb24gdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlmRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBkaXNwbGF5TmFtZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGlzcGxheU5hbWUoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0JCWZEaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBleGFtcGxlCi0JICogICAgICAgICAgICBUaGUgZXhhbXBsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgZXhhbXBsZSkgewotCQlmRXhhbXBsZSA9IGV4YW1wbGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGljb24KLQkgKiAgICAgICAgICAgIFRoZSBpY29uIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJY29uKFN0cmluZyBpY29uKSB7Ci0JCWZJY29uID0gaWNvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzaWduYXR1cmUKLQkgKiAgICAgICAgICAgIFRoZSBzaWduYXR1cmUgdG8gc2V0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpZ25hdHVyZShTdHJpbmcgc2lnbmF0dXJlKSB7Ci0JCWZTaWduYXR1cmUgPSBzaWduYXR1cmU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExESW5pdFBhcmFtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTFiMmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERJbml0UGFyYW1JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExESW5pdFBhcmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi1wdWJsaWMgY2xhc3MgVExESW5pdFBhcmFtSW1wbCBpbXBsZW1lbnRzIFRMREluaXRQYXJhbSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247Ci0JcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZTsKLQotCXB1YmxpYyBUTERJbml0UGFyYW1JbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJdGhpcy52YWx1ZSA9IHZhbHVlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgbmFtZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgZGVzY3JpcHRpb246IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXREZXNjcmlwdGlvbigpKSk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCB2YWx1ZToiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFZhbHVlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERMaXN0ZW5lckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERMaXN0ZW5lckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDExYWU2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExETGlzdGVuZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgOSwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExETGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBUTERMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIFN0cmluZyBsaXN0ZW5lckNsYXNzOwotCi0JcHVibGljIFN0cmluZyBnZXRMaXN0ZW5lckNsYXNzKCkgewotCQlyZXR1cm4gbGlzdGVuZXJDbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lckNsYXNzKFN0cmluZyBjbGFzc05hbWUpIHsKLQkJbGlzdGVuZXJDbGFzcyA9IGNsYXNzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IGxpc3RlbmVyIGNsYXNzOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TGlzdGVuZXJDbGFzcygpKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFsaWRhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhbGlkYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiNmYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVExEVmFsaWRhdG9ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDksIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBUTERWYWxpZGF0b3JJbXBsIGltcGxlbWVudHMgVExEVmFsaWRhdG9yIHsKLQlwcm90ZWN0ZWQgTGlzdCBpbml0UGFyYW1zOwotCXByb3RlY3RlZCBTdHJpbmcgdmFsaWRhdG9yQ2xhc3M7Ci0KLQlwdWJsaWMgTGlzdCBnZXRJbml0UGFyYW1zKCkgewotCQlpZiAoaW5pdFBhcmFtcyA9PSBudWxsKQotCQkJaW5pdFBhcmFtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIGluaXRQYXJhbXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzcygpIHsKLQkJcmV0dXJuIHZhbGlkYXRvckNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluaXRQYXJhbXMoTGlzdCBpbml0UGFyYW1zKSB7Ci0JCXRoaXMuaW5pdFBhcmFtcyA9IGluaXRQYXJhbXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yQ2xhc3MoU3RyaW5nIHZhbGlkYXRvckNsYXNzKSB7Ci0JCXRoaXMudmFsaWRhdG9yQ2xhc3MgPSB2YWxpZGF0b3JDbGFzczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlidWZmZXIuYXBwZW5kKCJcblx0IHZhbGlkYXRvciBjbGFzczoiICsgU3RyaW5nVXRpbHMuZXNjYXBlKGdldFZhbGlkYXRvckNsYXNzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IGluaXQtcGFybXM6Iik7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRJbml0UGFyYW1zKCkuc2l6ZSgpOyBpKyspIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIlxuIiArIFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0SW5pdFBhcmFtcygpLmdldChpKS50b1N0cmluZygpLCAiXG4iLCAiXG5cdFx0IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL1RMRFZhcmlhYmxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTk4MzA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UTERWYXJpYWJsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLQotcHVibGljIGNsYXNzIFRMRFZhcmlhYmxlSW1wbCBpbXBsZW1lbnRzIFRMRFZhcmlhYmxlIHsKLQkvLyBvcHRpb25hbCAtIGRlZmF1bHRzIHRvIHRydWUKLQlwcml2YXRlIGJvb2xlYW4gZGVjbGFyZSA9IHRydWU7Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCS8vIHJlcXVpcmVkCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZUZyb21BdHRyaWJ1dGU7Ci0JLy8gcmVxdWlyZWQKLQlwcml2YXRlIFN0cmluZyBuYW1lR2l2ZW47Ci0JLy8gb3B0aW9uYWwgLSBkZWZhdWx0cyB0byBORVNURUQKLQlwcml2YXRlIFN0cmluZyBzY29wZSA9IEpTUDEyVExETmFtZXMuVkFSSUFCTEVfU0NPUEVfTkVTVEVEOwotCS8vIHJlcXVpcmVkIC0gZGVmYXVsdHMgdG8gYSBTdHJpbmcKLQlwcml2YXRlIFN0cmluZyB2YXJpYWJsZUNsYXNzID0gImphdmEubGFuZy5TdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWNsYXJlKCkgewotCQlyZXR1cm4gZGVjbGFyZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lRnJvbUF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIG5hbWVGcm9tQXR0cmlidXRlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZUdpdmVuKCkgewotCQlyZXR1cm4gbmFtZUdpdmVuOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKSB7Ci0JCXJldHVybiBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhcmlhYmxlQ2xhc3MoKSB7Ci0JCXJldHVybiB2YXJpYWJsZUNsYXNzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xhcmUoYm9vbGVhbiBkZWNsYXJlKSB7Ci0JCXRoaXMuZGVjbGFyZSA9IGRlY2xhcmU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVjbGFyZVN0cmluZyhTdHJpbmcgZGVjbCkgewotCQlzZXREZWNsYXJlKGRlY2wuZXF1YWxzKEpTUDEyVExETmFtZXMuVFJVRSkgfHwgZGVjbC5lcXVhbHMoSlNQMTJUTEROYW1lcy5ZRVMpKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSBkZXNjcmlwdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVGcm9tQXR0cmlidXRlKFN0cmluZyBuYW1lRnJvbUF0dHJpYnV0ZSkgewotCQl0aGlzLm5hbWVGcm9tQXR0cmlidXRlID0gbmFtZUZyb21BdHRyaWJ1dGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZUdpdmVuKFN0cmluZyBuYW1lR2l2ZW4pIHsKLQkJdGhpcy5uYW1lR2l2ZW4gPSBuYW1lR2l2ZW47Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlKSB7Ci0JCXRoaXMuc2NvcGUgPSBzY29wZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYXJpYWJsZUNsYXNzKFN0cmluZyB2YXJpYWJsZUNsYXNzKSB7Ci0JCXRoaXMudmFyaWFibGVDbGFzcyA9IHZhcmlhYmxlQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChzdXBlci50b1N0cmluZygpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBuYW1lIGdpdmVuOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TmFtZUdpdmVuKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IG5hbWUgZnJvbSBhdHRyaWJ1dGU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXROYW1lRnJvbUF0dHJpYnV0ZSgpKSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQm9vbGVhbi50b1N0cmluZyhib29sZWFuKSBpcyBpbnRyb2R1Y2VkIGluIEpESyAxLjQKLQkJLy9idWZmZXIuYXBwZW5kKCJcblx0IGRlY2xhcmU6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShCb29sZWFuLnRvU3RyaW5nKGdldERlY2xhcmUoKSkpKTsKLQkJYnVmZmVyLmFwcGVuZCgiXG5cdCBkZWNsYXJlOiIgKyBTdHJpbmdVdGlscy50b1N0cmluZyhnZXREZWNsYXJlKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCJcblx0IHNjb3BlOiIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0U2NvcGUoKSkpOyAvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoIlxuXHQgdmFyaWFibGUgY2xhc3M6IiArIFN0cmluZ1V0aWxzLmVzY2FwZShnZXRWYXJpYWJsZUNsYXNzKCkpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UYWdsaWJUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvVGFnbGliVHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2Q5MGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9UYWdsaWJUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudFdyYXBwZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudFRyYWNrZXI7Ci0KLS8qKgotICogVGFnbGliVHJhY2tlciBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliVHJhY2tlciBleHRlbmRzIENNRG9jdW1lbnRXcmFwcGVySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRUcmFja2VyIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0JcHVibGljIFRhZ2xpYlRyYWNrZXIoU3RyaW5nIG5ld1VSSSwgU3RyaW5nIG5ld1ByZWZpeCwgQ01Eb2N1bWVudCB0bGQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlzdXBlcihuZXdVUkksIG5ld1ByZWZpeCwgdGxkKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGFTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCXJldHVybiBnZXRQcmVmaXgoKSArICJAIiArIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AxMVRMRE5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvSlNQMTFUTEROYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTQ4NGRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AxMVRMRE5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDExVExETmFtZXMgewotCi0JU3RyaW5nIFRBR0xJQiA9ICJ0YWdsaWIiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQ09OVEVOVF9KU1AgPSAiSlNQIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05URU5UX0VNUFRZID0gImVtcHR5IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05URU5UX1RBR0RFUEVOREVOVCA9ICJ0YWdkZXBlbmRlbnQiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHID0gInRhZyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQVkVSU0lPTiA9ICJqc3B2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUTElCVkVSU0lPTiA9ICJ0bGlidmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU0hPUlROQU1FID0gInNob3J0bmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVVJOID0gInVybiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIE5BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEVJQ0xBU1MgPSAidGVpY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBR0NMQVNTID0gInRhZ2NsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBCT0RZQ09OVEVOVCA9ICJib2R5Y29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQVRUUklCVVRFID0gImF0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBJRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgUkVRVUlSRUQgPSAicmVxdWlyZWQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJURVhQUlZBTFVFID0gInJ0ZXhwcnZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFBSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgSU5DTFVERSA9ICJpbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWUVTID0gInllcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTk8gPSAibm8iOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDEyVExETmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AxMlRMRE5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzI5ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDEyVExETmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMTJUTEROYW1lcyB7Ci0KLQlTdHJpbmcgVEFHTElCID0gSlNQMTFUTEROYW1lcy5UQUdMSUI7Ci0KLQlTdHJpbmcgQ09OVEVOVF9KU1AgPSBKU1AxMVRMRE5hbWVzLkNPTlRFTlRfSlNQOwotCVN0cmluZyBDT05URU5UX0VNUFRZID0gSlNQMTFUTEROYW1lcy5DT05URU5UX0VNUFRZOwotCVN0cmluZyBDT05URU5UX1RBR0RFUEVOREVOVCA9IEpTUDExVExETmFtZXMuQ09OVEVOVF9UQUdERVBFTkRFTlQ7Ci0KLQlTdHJpbmcgVEFHID0gSlNQMTFUTEROYW1lcy5UQUc7Ci0JU3RyaW5nIEpTUF9WRVJTSU9OID0gImpzcC12ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUTElCX1ZFUlNJT04gPSAidGxpYi12ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBTSE9SVF9OQU1FID0gInNob3J0LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVSSSA9IEpTUDExVExETmFtZXMuVVJJOwotCVN0cmluZyBVUk4gPSBKU1AxMVRMRE5hbWVzLlVSTjsKLQotCVN0cmluZyBOQU1FID0gSlNQMTFUTEROYW1lcy5OQU1FOwotCVN0cmluZyBURUlfQ0xBU1MgPSAidGVpLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUdfQ0xBU1MgPSAidGFnLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBCT0RZX0NPTlRFTlQgPSAiYm9keS1jb250ZW50IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSSUJVVEUgPSBKU1AxMVRMRE5hbWVzLkFUVFJJQlVURTsKLQotCVN0cmluZyBJRCA9IEpTUDExVExETmFtZXMuSUQ7Ci0JU3RyaW5nIFJFUVVJUkVEID0gSlNQMTFUTEROYW1lcy5SRVFVSVJFRDsKLQlTdHJpbmcgUlRFWFBSVkFMVUUgPSBKU1AxMVRMRE5hbWVzLlJURVhQUlZBTFVFOwotCi0JU3RyaW5nIFBSRUZJWCA9IEpTUDExVExETmFtZXMuUFJFRklYOwotCi0JU3RyaW5nIElOQ0xVREUgPSBKU1AxMVRMRE5hbWVzLklOQ0xVREU7Ci0JU3RyaW5nIEZJTEUgPSBKU1AxMVRMRE5hbWVzLkZJTEU7Ci0KLQlTdHJpbmcgVFJVRSA9IEpTUDExVExETmFtZXMuVFJVRTsKLQlTdHJpbmcgRkFMU0UgPSBKU1AxMVRMRE5hbWVzLkZBTFNFOwotCVN0cmluZyBZRVMgPSBKU1AxMVRMRE5hbWVzLllFUzsKLQlTdHJpbmcgTk8gPSBKU1AxMVRMRE5hbWVzLk5POwotCi0JLyoKLQkgKiBAc2VlIEVjbGlwc2UgSlNQIDEuMgotCSAqLwotCVN0cmluZyBERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRElTUExBWV9OQU1FID0gImRpc3BsYXktbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU01BTExfSUNPTiA9ICJzbWFsbC1pY29uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBMQVJHRV9JQ09OID0gImxhcmdlLWljb24iOyAvLyROT04tTkxTLTEkCi0KLQotCVN0cmluZyBWQUxJREFUT1IgPSAidmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxJREFUT1JfQ0xBU1MgPSAidmFsaWRhdG9yLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxJREFUT1JfSU5JVF9QQVJBTSA9ICJpbml0LXBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxJREFUT1JfUEFSQU1fTkFNRSA9ICJwYXJhbS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQUxJREFUT1JfUEFSQU1fVkFMVUUgPSAicGFyYW0tdmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLQotCVN0cmluZyBMSVNURU5FUiA9ICJsaXN0ZW5lciI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTElTVEVORVJfQ0xBU1MgPSAibGlzdGVuZXItY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVkFSSUFCTEUgPSAidmFyaWFibGUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX05BTUVfR0lWRU4gPSAibmFtZS1naXZlbiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfTkFNRV9GUk9NX0FUVFJJQlVURSA9ICJuYW1lLWZyb20tYXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9DTEFTUyA9ICJ2YXJpYWJsZS1jbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfREVDTEFSRSA9ICJkZWNsYXJlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBWQVJJQUJMRV9TQ09QRSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfU0NPUEVfTkVTVEVEID0gIk5FU1RFRCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVkFSSUFCTEVfU0NPUEVfQVRfQkVHSU4gPSAiQVRfQkVHSU4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFZBUklBQkxFX1NDT1BFX0FUX0VORCA9ICJBVF9FTkQiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDIwVExETmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9KU1AyMFRMRE5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNTFlMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL0pTUDIwVExETmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLS8qbmxzWFhYKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQMjBUTEROYW1lcyBleHRlbmRzIEpTUDEyVExETmFtZXMgewotCVN0cmluZyBDT05URU5UX1NDUklQVExFU1MgPSAic2NyaXB0bGVzcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRVhBTVBMRSA9ICJleGFtcGxlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGUkFHTUVOVCA9ICJmcmFnbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgRlVOQ1RJT04gPSAiZnVuY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZVTkNUSU9OX0NMQVNTID0gImZ1bmN0aW9uLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGVU5DVElPTl9FWFRFTlNJT04gPSAiZnVuY3Rpb24tZXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGVU5DVElPTl9TSUdOQVRVUkUgPSAiZnVuY3Rpb24tc2lnbmF0dXJlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBJQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBBVEggPSAicGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgVEFHX0VYVEVOU0lPTiA9ICJ0YWctZXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUdfRklMRSA9ICJ0YWctZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUQUdESVIgPSAidGFnZGlyIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBUQUdMSUJfRVhURU5TSU9OID0gInRhZ2xpYi1leHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMzhiZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLS8qKgotICogUmVwcmVzZW50cyBhbiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmcm9tIGEgVExECi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVExEQXR0cmlidXRlRGVjbGFyYXRpb24gZXh0ZW5kcyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotCS8qKgotCSAqIGEgZGVzY3JpcHRpb24gb2YgdGhlIGF0dHJpYnV0ZQotCSAqIEByZXR1cm4gU3RyaW5nCi0JICogQHNlZSAgSlNQIDIuMAotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCQotCS8qKgotCSAqIHRoZSBhdHRyaWJ1dGUncyBuYW1lCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRJZCgpOwotCi0JQ01Eb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBtYXkgYmUgZHluYW1pY2FsbHkgY2FsY3VsYXRlZCBhdCBydW50aW1lIGJ5IGFuIGV4cHJlc3Npb24KLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFJ0ZXhwcnZhbHVlKCk7Ci0KLQkvKioKLQkgKiB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlJ3MgdmFsdWUKLQkgKiBAc2VlICBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIHdoZXRoZXIgdGhpcyBhdHRyaWJ1dGUgaXMgYSBmcmFnbWVudAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNGcmFnbWVudCgpOwotCQotCS8qKgotCSAqIGlmIHRoZSBhdHRyaWJ1dGUgaXMgcmVxdWlyZWQgb3Igb3B0aW9uYWwKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JYm9vbGVhbiBpc1JlcXVpcmVkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODIxYTZiYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVExERG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50IHsKLQotCVN0cmluZyBDTV9LSU5EID0gIkNvbnRlbnQgTW9kZWwgS2luZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX1RMRCA9ICJKU1AgVGFnIExpYnJhcnkgRGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEBzZWUgIEpTUCAyLjAKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpOwotCQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAiZGVzY3JpcHRpb24iIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUuCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogQHJldHVybiBTdHJpbmcgLSBUaGUgY29udGVudHMgb2YgdGhlICJkaXNwbGF5LW5hbWUiIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGl0IGlzIGEgc2hvcnQgbmFtZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIGRpc3BsYXllZCBieSB0b29scwotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gTGlzdCAtIEEgbGlzdCBvZiBleHRlbnNpb24gZWxlbWVudHMgZGVzY3JpYmluZyB0aGUgdGFnIGxpYnJhcnkKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRFeHRlbnNpb25zKCk7Ci0JCi0JLyoqCi0JICogQHJldHVybiBMaXN0IC0gQSBsaXN0IG9mIFRMREZ1bmN0aW9ucyBkZXNjcmliaW5nIHRoZSBkZWNsYXJlZCBmdW5jdGlvbnMKLQkgKiBAc2VlICBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRGdW5jdGlvbnMoKTsKLQkKLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImluZm8iIGVsZW1lbnQgb2YgYSBKU1AgMS4xIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IGEgc2ltcGxlIHN0cmluZyBkZXNjcmliaW5nIHRoZSAidXNlIiBvZiB0aGlzIHRhZ2xpYiwgc2hvdWxkIGJlIHVzZXIgZGlzY2VybmFibGUuCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRJbmZvKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSB2ZXJzaW9uIG9mIEpTUCB0aGUgdGFnIGxpYnJhcnkgZGVwZW5kcyB1cG9uCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRKc3B2ZXJzaW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIFRoZSBjb250ZW50cyBvZiB0aGUgImxhcmdlLWljb24iIGVsZW1lbnQgb2YgYSBKU1AgMS4yIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3I7IG9wdGlvbmFsIGxhcmdlLWljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCSAqIEBzZWUgIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQkvKioKLQkgKiBAc2VlICBKU1AgMS4yCi0JICogQHJldHVybiBMaXN0IC0gYSBMaXN0IG9mIFRMRExpc3RlbmVycwotCSAqLwotCUxpc3QgZ2V0TGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFN0cmluZyAtIEEgc2ltcGxlIGRlZmF1bHQgc2hvcnQgbmFtZSB0aGF0IGNvdWxkIGJlIHVzZWQgYnkgYSBKU1AgYXV0aG9yaW5nIHRvb2wgdG8gY3JlYXRlIG5hbWVzIHdpdGggYSBtbmVtb25pYyB2YWx1ZTsgZm9yIGV4YW1wbGUsIGl0IG1heSBiZSB1c2VkIGFzIHRoZSBwcmVmZXJyZWQgcHJlZml4IHZhbHVlIGluIHRhZ2xpYiBkaXJlY3RpdmVzCi0JICogQHNlZSAgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRTaG9ydG5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIGNvbnRlbnRzIG9mIHRoZSAic21hbGwtaWNvbiIgZWxlbWVudCBvZiBhIEpTUCAxLjIgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcjsgb3B0aW9uYWwgc21hbGwtaWNvbiB0aGF0IGNhbiBiZSB1c2VkIGJ5IHRvb2xzCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gVGhlIHZlcnNpb24gb2YgdGhlIHRhZyBsaWJyYXJ5IChpdCdzIGltcGxlbWVudGF0aW9uKQotCSAqIEBzZWUgIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VGxpYnZlcnNpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIFVSSSBkZWNsYXJlZCB3aXRoaW4gdGhlIGRlc2NyaXB0b3IKLQkgKiBAc2VlICBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFVyaSgpOwotCi0JLyoqCi0JICogQHNlZSAgSlNQIDEuMgotCSAqLwotCVRMRFZhbGlkYXRvciBnZXRWYWxpZGF0b3IoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERWxlbWVudERlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExERWxlbWVudERlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMWFjMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIFRMREVsZW1lbnREZWNsYXJhdGlvbiBleHRlbmRzIENNRWxlbWVudERlY2xhcmF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBib2R5IGNvbnRlbnQgdHlwZQotCSAqIAotCSAqIEBzZWUgSlNQIDEuMQotCSAqLwotCVN0cmluZyBnZXRCb2R5Y29udGVudCgpOwotCi0JLyoqCi0JICogT3B0aW9uYWwgdGFnLXNwZWNpZmljIGluZm9ybWF0aW9uCi0JICogCi0JICogQHNlZSBKU1AgMS4yCi0JICovCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQkvKioKLQkgKiBBIHNob3J0IG5hbWUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSBkaXNwbGF5ZWQgYnkgdG9vbHMKLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsIGluZm9ybWFsIGRlc2NyaXB0aW9uIG9mIGFuIGV4YW1wbGUgb2YgYSB1c2Ugb2YgdGhpcyB0YWcKLQkgKiAKLQkgKiBAc2VlIEpTUCAyLjAKLQkgKi8KLQlTdHJpbmcgZ2V0RXhhbXBsZSgpOwotCi0JLyoqCi0JICogWmVybyBvciBtb3JlIGV4dGVuc2lvbnMgdGhhdCBwcm92aWRlIGV4dHJhIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgdGFnLAotCSAqIGZvciB0b29sIGNvbnN1bXB0aW9uCi0JICogCi0JICogQHNlZSBKU1AgMi4wCi0JICovCi0JTGlzdCBnZXRFeHRlbnNpb25zKCk7Ci0KLQkvKioKLQkgKiBPcHRpb25hbCB0YWctc3BlY2lmaWMgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0SW5mbygpOwotCi0JLyoqCi0JICogTmFtZSBvZiBhbiBvcHRpb25hbCBsYXJnZSBpY29uIHRoYXQgY2FuIGJlIHVzZWQgYnkgdG9vbHMKLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjIKLQkgKi8KLQlTdHJpbmcgZ2V0TGFyZ2VJY29uKCk7Ci0KLQlDTURvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIFdoZXJlIHRvIGZpbmQgdGhlIC50YWcgZmlsZSBpbXBsZW1lbnRpbmcgdGhpcyBhY3Rpb24sIHJlbGF0aXZlIHRvIHRoZQotCSAqIHJvb3Qgb2YgdGhlIHdlYiBhcHBsaWNhdGlvbiBvciB0aGUgcm9vdCBvZiB0aGUgSkFSIGZpbGUgZm9yIGEgdGFnCi0JICogbGlicmFyeSBwYWNrYWdlZCBpbiBhIEpBUi4gVGhpcyBtdXN0IGJlZ2luIHdpdGggL1dFQi1JTkYvdGFncyBpZiB0aGUKLQkgKiAudGFnIGZpbGUgcmVzaWRlcyBpbiB0aGUgV0FSLCBvciAvTUVUQS1JTkYvdGFncyBpZiB0aGUgLnRhZyBmaWxlCi0JICogcmVzaWRlcyBpbiBhIEpBUi4KLQkgKiAKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXRoIHRvIHRoZSAudGFnKHgpIGZpbGUgYXMgZGVmaW5lZCBpbiB0aGUgLnRsZCBmaWxlLCBudWxsCi0JICogICAgICAgICBpZiBpbnRlcm5hbCB0byB0aGUgLnRsZAotCSAqIEBzZWUgSlNQIDIuMAotCSAqLwotCVN0cmluZyBnZXRQYXRoKCk7Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGFuIG9wdGlvbmFsIHNtYWxsIGljb24gdGhhdCBjYW4gYmUgdXNlZCBieSB0b29scwotCSAqIAotCSAqIEBzZWUgSlNQIDEuMgotCSAqLwotCVN0cmluZyBnZXRTbWFsbEljb24oKTsKLQotCS8qKgotCSAqIFRoZSBuYW1lIG9mIHRoZSB0YWcgaGFuZGxlciBjbGFzcyBpbXBsZW1lbnRpbmcKLQkgKiBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnCi0JICogCi0JICogQHNlZSBKU1AgMS4xCi0JICovCi0JU3RyaW5nIGdldFRhZ2NsYXNzKCk7Ci0KLQkvKioKLQkgKiBUaGUgbmFtZSBvZiBhbiBvcHRpb25hbCBzdWJjbGFzcyBvZgotCSAqIGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdFeHRyYUluZm8KLQkgKiAKLQkgKiBAc2VlIEpTUCAxLjEKLQkgKi8KLQlTdHJpbmcgZ2V0VGVpY2xhc3MoKTsKLQotCS8qKgotCSAqIEBzZWUgSlNQIDEuMgotCSAqIEByZXR1cm4gTGlzdCBvZiBUTERWYXJpYWJsZXMKLQkgKi8KLQlMaXN0IGdldFZhcmlhYmxlcygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERGdW5jdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMmI1MGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMREZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgVExERnVuY3Rpb24gewotCi0JU3RyaW5nIGdldENsYXNzTmFtZSgpOwotCQotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JU3RyaW5nIGdldERpc3BsYXlOYW1lKCk7Ci0KLQlTdHJpbmcgZ2V0RXhhbXBsZSgpOwotCi0JTGlzdCBnZXRFeHRlbnNpb25zKCk7Ci0KLQlTdHJpbmcgZ2V0SWNvbigpOwotCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCUNNRG9jdW1lbnQgZ2V0T3duZXJEb2N1bWVudCgpOwotCi0JU3RyaW5nIGdldFNpZ25hdHVyZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERJbml0UGFyYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERJbml0UGFyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzMzY1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExESW5pdFBhcmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogQSBuYW1lL3ZhbHVlIHBhaXIgYXMgYW4gaW5pdGlhbGl6YXRpb24gcGFyYW0gYWxvbmcgd2l0aCBhIGRlc2NyaXB0aW9uCi0gKiBAc2VlIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERJbml0UGFyYW0gewotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogVGhlIHBhcmFtLW5hbWUgZWxlbWVudCBjb250YWlucyB0aGUgbmFtZSBvZiBhIHBhcmFtZXRlci4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JLyoqCi0JICogVGhlIHBhcmFtLXZhbHVlIGVsZW1lbnQgY29udGFpbnMgdGhlIG5hbWUgb2YgYSBwYXJhbWV0ZXIuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExETGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ5MTViOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExETGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLQotLyoqCi0gKiBEZWZpbmVzIGFuIG9wdGlvbmFsIGV2ZW50IGxpc3RlbmVyIG9iamVjdCB0byBiZSBpbnN0YW50aWF0ZWQgYW5kIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseQotICogQHNlZSBKU1AgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVExETGlzdGVuZXIgewotCVN0cmluZyBnZXRMaXN0ZW5lckNsYXNzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOThhODhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3RsZC9wcm92aXNpb25hbC9UTERWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vKioKLSAqIERlZmluZXMgYW4gb3B0aW9uYWwgdmFsaWRhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgdGhlIGNvbmZvcm1hbmNlIG9mIGEgSlNQIHBhZ2UgdG8gdXNpbmcgdGhpcyB0YWcgbGlicmFyeQotICogQHNlZSBKU1AgMS4yCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgVExEVmFsaWRhdG9yIHsKLQkvKioKLQkgKiBAcmV0dXJuIExpc3QgLSBhIExpc3Qgb2YgVExESW5pdFBhcmFtcwotCSAqLwotCUxpc3QgZ2V0SW5pdFBhcmFtcygpOwotCi0JU3RyaW5nIGdldFZhbGlkYXRvckNsYXNzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdGxkL3Byb3Zpc2lvbmFsL1RMRFZhcmlhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk1Y2JhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC90bGQvcHJvdmlzaW9uYWwvVExEVmFyaWFibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogSW5mb3JtYXRpb24gb24gdGhlIHNjcmlwdGluZyB2YXJpYWJsZXMgZGVmaW5lZCBieSB0aGlzIHRhZy4KLSAqIEBzZWUgIEpTUCAxLjIKLSAqLwotcHVibGljIGludGVyZmFjZSBUTERWYXJpYWJsZSB7Ci0KLQkvKioKLQkgKiBXaGV0aGVyIHRoZSB2YXJpYWJsZSBpcyBkZWNsYXJlZCBvciBub3QsIHRydWUgaXMgdGhlIGRlZmF1bHQuCi0JICovCi0JYm9vbGVhbiBnZXREZWNsYXJlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJudGhlIHRoZSBkZXNjcmlwdGlvbiBmb3IgdGhpcyB2YXJpYWJsZQotCSAqLwotCVN0cmluZyBnZXREZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogVGhlIG5hbWUgb2YgYW4gYXR0cmlidXRlIHdob3NlICh0cmFuc2xhdGlvbiB0aW1lKSB2YWx1ZSB3aWxsIGdpdmUgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCBvciBudWxsIG9mIHRoZSBuYW1lIGlzIG5vdCB0byBiZSBvYnRhaW5lZCB0aGlzIHdheS4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZUZyb21BdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFRoZSB2YXJpYWJsZSBuYW1lIGdpdmVuIGFzIGEgY29uc3RhbnQsIG9yIG51bGwgb2YgdGhlIG5hbWUgaXMgbm90IHNwZWNpZmllZC4KLQkgKi8KLQlTdHJpbmcgZ2V0TmFtZUdpdmVuKCk7Ci0JCi0JLyoqCi0JICogVGhlIHNjb3BlIG9mIHRoZSBzY3JpcHRpbmcgdmFyaWFibGUgZGVmaW5lZC4KLQkgKi8KLQlTdHJpbmcgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIE5hbWUgb2YgdGhlIGNsYXNzIG9mIHRoZSB2YXJpYWJsZSwgamF2YS5sYW5nLlN0cmluZyBpZiBudWxsCi0JICovCi0JU3RyaW5nIGdldFZhcmlhYmxlQ2xhc3MoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0pTUEZDb250ZW50UHJvcGVydGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWNlOTA0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJvcGVydGllcyBjb25zdGFudHMgdXNlZCBieSBKU1AgRnJhZ21lbnRzLiBDbGllbnRzIHNob3VsZCBvbmx5IHJlYWQgYW5kCi0gKiBtb2RpZnkgdGhlIEpTUCBGcmFnbWVudCBwcm9wZXJ0aWVzIHByb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhpcyBjbGFzcy4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgY2xhc3MgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzIHsKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUENPUkVfSUQgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPSkVDVF9LRVkgPSAiPHByb2plY3Q+IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lZCBrZXkgdGhhdCBjb250cm9scyB0aGUgZGVmYXVsdCBsYW5ndWFnZSBmb3IgSlNQIEZyYWdtZW50cwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUExBTkdVQUdFID0gImpzcC1sYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBBIG5hbWVkIGtleSB0aGF0IGNvbnRyb2xzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZSBmb3IgSlNQIEZyYWdtZW50cwotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUENPTlRFTlRUWVBFID0gImpzcC1jb250ZW50LXR5cGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIEpTUCBmcmFnbWVudHMgc2hvdWxkIGJlIGNvbXBpbGVkL3ZhbGlkYXRlZC4gSlNQIGZyYWdtZW50cwotCSAqIHdpbGwgYmUgdmFsaWRhdGVkIHdoZW4gdHJ1ZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqIAotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFURV9GUkFHTUVOVFMgPSAidmFsaWRhdGVGcmFnbWVudHMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aAotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZVBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHRoZSBrZXkgd2lsbCBiZSBiYXNlZCBvZmYgb2YKLQkgKiBAcmV0dXJuIHByZWZlcmVuY2Uga2V5IGJhc2VkIG9uIHJlc291cmNlUGF0aCAoYmFzaWNhbGx5IHRoZQotCSAqICAgICAgICAgcmVzb3VyY2VQYXRoIHdpdGhvdXQgdGhlIGZpbGVuYW1lKTsgUFJPSkVDVF9LRVkgaWYgcmVzb3VyY2VQYXRoCi0JICogICAgICAgICBpcyBudWxsCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRLZXlGb3IoSVBhdGggcmVzb3VyY2VQYXRoKSB7Ci0JCVN0cmluZyBrZXkgPSBQUk9KRUNUX0tFWTsKLQkJaWYgKHJlc291cmNlUGF0aCAhPSBudWxsICYmIHJlc291cmNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWtleSA9IHJlc291cmNlUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGtleTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHByZWZlcmVuY2VzIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBwcm9qZWN0IHNjb3BlIGFuZAotCSAqIHByZWZlcmVuY2Uga2V5IChzdWJOb2RlKSBJZiBjcmVhdGUgaXMgdHJ1ZSwgdGhlIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlCi0JICogY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QgYWxyZWFkeSBleGlzdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIHVuZGVyCi0JICogQHBhcmFtIHByZWZlcmVuY2VLZXkKLQkgKiAgICAgICAgICAgIHRoZSBzdWJub2RlL2NhdGVnb3J5IHRoZSBwcmVmZXJlbmNlIG5vZGUgaXMgbG9jYXRlZCBpbgotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiAgICAgICAgICAgIGlmIHRydWUsIGEgcHJlZmVyZW5jZSBub2RlIHdpbGwgYmUgY3JlYXRlZCBpZiBvbmUgZG9lcyBub3QKLQkgKiAgICAgICAgICAgIGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuIFByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiAgICAgICAgIHByZWZlcmVuY2Uga2V5LiBudWxsIGlmIG9uZSBjb3VsZCBub3QgYmUgZm91bmQgYW5kIGNyZWF0ZSBpcwotCSAqICAgICAgICAgZmFsc2UKLQkgKi8KLQlzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSVByb2plY3QgcHJvamVjdCwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gY3JlYXRlKSB7Ci0JCWlmIChjcmVhdGUpCi0JCQkvLyBjcmVhdGUgYWxsIG5vZGVzIGRvd24gdG8gdGhlIG9uZSB3ZSBhcmUgaW50ZXJlc3RlZCBpbgotCQkJcmV0dXJuIG5ldyBQcm9qZWN0U2NvcGUocHJvamVjdCkuZ2V0Tm9kZShKU1BDT1JFX0lEKS5ub2RlKHByZWZlcmVuY2VLZXkpOwotCQkvLyBiZSBjYXJlZnVsIGxvb2tpbmcgdXAgZm9yIG91ciBub2RlIHNvIG5vdCB0byBjcmVhdGUgYW55IG5vZGVzIGFzCi0JCS8vIHNpZGUgZWZmZWN0Ci0JCVByZWZlcmVuY2VzIG5vZGUgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRSb290Tm9kZSgpLm5vZGUoUHJvamVjdFNjb3BlLlNDT1BFKTsKLQkJdHJ5IHsKLQkJCS8vIFRPRE8gb25jZSBidWcgOTA1MDAgaXMgZml4ZWQsIHNob3VsZCBiZSBhcyBzaW1wbGUgYXMgdGhpczoKLQkJCS8vIFN0cmluZyBwYXRoID0gcHJvamVjdC5nZXROYW1lKCkgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gUmVzb3VyY2VzUGx1Z2luLlBJX1JFU09VUkNFUyArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBFTkNPRElOR19QUkVGX05PREU7Ci0JCQkvLyByZXR1cm4gbm9kZS5ub2RlRXhpc3RzKHBhdGgpID8gbm9kZS5ub2RlKHBhdGgpIDogbnVsbDsKLQkJCS8vIGZvciBub3csIHRha2UgdGhlIGxvbmcgd2F5Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcm9qZWN0LmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlub2RlID0gbm9kZS5ub2RlKHByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKEpTUENPUkVfSUQpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShKU1BDT1JFX0lEKTsKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByZWZlcmVuY2VLZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIG5vZGUubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG5vZGVFeGlzdHMgZmFpbGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IHJldHJpZXZlIHByZWZlcmVuY2Ugbm9kZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBrZXkgaW4gdGhlIGdpdmVuIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgVGhlIHByb3BlcnR5IGtleQotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgVGhlIGN1cnJlbnQgY29udGV4dCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBjb250ZXh0IGlzCi0JICogICAgICAgICAgICBhdmFpbGFibGUgYW5kIHRoZSB3b3Jrc3BhY2Ugc2V0dGluZyBzaG91bGQgYmUgdGFrZW4uIE5vdGUKLQkgKiAgICAgICAgICAgIHRoYXQgcGFzc2luZyA8Y29kZT5udWxsPC9jb2RlPiBzaG91bGQgYmUgYXZvaWRlZC4KLQkgKiBAcGFyYW0gcmVjdXJzZQotCSAqICAgICAgICAgICAgd2hldGhlciB0aGUgcGFyZW50IHNob3VsZCBiZSBxdWVyaWVkIHRpbGwgcHJvcGVydHkgaXMgZm91bmQKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBrZXkuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBrZXksIElSZXNvdXJjZSByZXNvdXJjZSwgYm9vbGVhbiByZWN1cnNlKSB7Ci0JCVN0cmluZyB2YWwgPSBudWxsOwotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJCXZhbCA9IGludGVybmFsR2V0UHJvcGVydHkocmVzb3VyY2UsIHJlY3Vyc2UsIHByZWZlcmVuY2VzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gbm8gcHJlZmVyZW5jZXMgZm91bmQgLSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKLQkJLy8gc2hvcnQtY2lyY3VpdAotCQkvLyBsb29rdXAgYnkgZmFsbGluZyBiYWNrIHRvIHdvcmtzcGFjZSdzIGRlZmF1bHQKLQkJLy8gc2V0dGluZwotCQlpZiAodmFsID09IG51bGwgJiYgcmVjdXJzZSkKLQkJCXZhbCA9IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0V29ya2JlbmNoUHJlZmVyZW5jZShTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKS5nZXRTdHJpbmcoSlNQQ09SRV9JRCwga2V5LCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxHZXRQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHJlc291cmNlICE9IHJlc291cmNlLmdldFByb2plY3QoKSAmJiByZWN1cnNlKSB7Ci0JCQl2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IobnVsbCksIG51bGwpOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQuIE5vdGUgY29udGV4dCBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGtleS4gSWYgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgaXMgcmVtb3ZlZCBmcm9tIHByb3BlcnRpZXMuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCXByZWZlcmVuY2VzLnJlbW92ZShnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCWVsc2UKLQkJCQkJcHJlZmVyZW5jZXMucHV0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgdmFsdWUpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNhdmUgY2hhbmdlcwotCQkJCQlwcmVmZXJlbmNlcy5mbHVzaCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BDT1JFX0lELCBJU3RhdHVzLkVSUk9SLCAiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyBqdXN0IHNldCBhIHByZWZlcmVuY2UgaW4gdGhlIGluc3RhbmNlIHNjb3BlCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKSB7Ci0JCS8vIHNldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJLy8gfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2Q0Y2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIEpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXIgewotCXB1YmxpYyBKU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCQlmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciA9IG5ldyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKCk7Ci0JCWZKb2IgPSBuZXcgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciBfaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGZKb2I7Ci0KLQkvKioKLQkgKiBUaGlzIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiB0byBzY2hlZHVsZSBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBtb2RpZnkgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX1VQREFURV9ERUxBWSA9IDUwMDsKLQkJcHJpdmF0ZSBMaXN0IGFzeW5jQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCkgewotCQkJc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoYW5nZXMoU2V0IG5ld0NoYW5nZXMpIHsKLQkJCWlmIChuZXdDaGFuZ2VzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCWFzeW5jQ2hhbmdlcy5hZGRBbGwobmV3Q2hhbmdlcyk7Ci0JCQkJYXN5bmNDaGFuZ2VzLm5vdGlmeSgpOwotCQkJfQotCQkJc2NoZWR1bGUoUFJPUEVSVElFU19VUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldE5leHRDaGFuZ2UoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiBhc3luY0NoYW5nZXMuaXNFbXB0eSgpID8gbnVsbCA6IChJUHJvamVjdCkgYXN5bmNDaGFuZ2VzLnJlbW92ZShhc3luY0NoYW5nZXMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPUkVfSUQsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBKU1BDb3JlTWVzc2FnZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgbnVsbCk7Ci0JCQltb25pdG9yID0gbW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSA6IG1vbml0b3I7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKEpTUENvcmVNZXNzYWdlcy5KU1BGQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBhc3luY0NoYW5nZXMuc2l6ZSgpKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdCBuZXh0OwotCQkJCQl3aGlsZSAoKG5leHQgPSBnZXROZXh0Q2hhbmdlKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGp1c3QgZXhpdCBpZiB0aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzCi0JCQkJCQkvLyBiZWVuIHNodXQgZG93bgotCQkJCQkJLy8gaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gcG9pbnQgYW55d2F5Ci0JCQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIikuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHByZWZlcmVuY2VzIG5vZGVzCi0JCQkJCQkJaWYgKG5leHQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBjb250ZW50IHR5cGUgcHJlZmVyZW5jZXMKLQkJCQkJCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKG5leHQsIEpTUEZDb250ZW50UHJvcGVydGllcy5KU1BDT05URU5UVFlQRSwgZmFsc2UpOwotCQkJCQkJCQlpZiAocHJvamVjdFByZWZzICE9IG51bGwpCi0JCQkJCQkJCQlwcm9qZWN0UHJlZnMuZmx1c2goKTsKLQkJCQkJCQkJLy8gc2F2ZSBsYW5ndWFnZSBwcmVmZXJlbmNlcwotCQkJCQkJCQlwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMobmV4dCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gd2UgZ290IGFuIGVycm9yIHNhdmluZwotCQkJCQkJCVN0cmluZyBkZXRhaWxNZXNzYWdlID0gTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLkpTUEZDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmcsIG5leHQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKDEgPDwgKElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VUICUgMTAwIC8gMzMpLCBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgZGV0YWlsTWVzc2FnZSwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiAhYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnlDaGFuZ2VzKElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQkvLyBjaGVjayBlYWNoIHJlc291cmNlIHdpdGgganNwIGZyYWdtZW50IHNldHRpbmcgdG8gc2VlIGlmIGl0IGhhcwotCQkJLy8gYmVlbiBtb3ZlZC9kZWxldGVkCi0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMyID0gZmFsc2U7Ci0KLQkJCS8vIHByb2plY3QgYWZmZWN0ZWQKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJcmVzb3VyY2VDaGFuZ2VzID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIHByb2plY3REZWx0YSwgcHJvamVjdHNUb1NhdmUpOwotCQkJcmVzb3VyY2VDaGFuZ2VzMiA9IHByb2Nlc3NQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBwcm9qZWN0RGVsdGEsIHByb2plY3RzVG9TYXZlKTsKLQotCQkJLy8gaWYgdGhlcmUgd2FzIGEgcHJlZmVyZW5jZSBrZXkgY2hhbmdlLCBuZWVkIHRvIHNhdmUgcHJlZmVyZW5jZXMKLQkJCWlmIChyZXNvdXJjZUNoYW5nZXMgfHwgcmVzb3VyY2VDaGFuZ2VzMikKLQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQoY3VycmVudFByb2plY3QpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdvZXMgdGhyb3VnaCBhbGwgdGhlIHJlc291cmNlLWRlcGVuZGVudCBwcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGgKLQkJICogY3VycmVudFByb2plY3QgJiBrZXkgYW5kIHVwZGF0ZXMgdGhlIHByZWZlcmVuY2Uga2V5cyBpZiBuZWVkZWQKLQkJICogYmFzZWQgb24gcHJvamVjdERlbHRhCi0JCSAqIAotCQkgKiBAcGFyYW0gY3VycmVudFByb2plY3QKLQkJICogICAgICAgICAgICBjdXJyZW50IHByb2plY3Qgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZCBhdAotCQkgKiBAcGFyYW0ga2V5Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBrZXkvc3ViY2F0ZWdvcnkgb2YgdGhlIHByZWZlcmVuY2VzIHRvIGJlIGxvb2tlZAotCQkgKiAgICAgICAgICAgIGF0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0RGVsdGEKLQkJICogICAgICAgICAgICB0aGUgY2hhbmdlcyB0byBwcm9jZXNzIHRoZSBwcmVmZXJlbmNlIGtleXMgYWdhaW5zdAotCQkgKiBAcGFyYW0gcHJvamVjdHNUb1NhdmUKLQkJICogICAgICAgICAgICB0aGUgcHJvamVjdHMgdGhhdCBuZWVkIHRvIGJlIHVwZGF0ZWQvc2F2ZWQKLQkJICogQHJldHVybiB0cnVlIGlmIGN1cnJlbnRQcm9qZWN0J3MgcHJlZmVyZW5jZXMgd2VyZSBtb2RpZmllZAotCQkgKi8KLQkJcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NQcmVmZXJlbmNlcyhJUHJvamVjdCBjdXJyZW50UHJvamVjdCwgU3RyaW5nIGtleSwgSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIGdldCB0aGUgcHJvamVjdC1rZXkgcHJlZmVyZW5jZSBub2RlCi0JCQlQcmVmZXJlbmNlcyBwcm9qZWN0UHJlZnMgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RQcmVmcyA9PSBudWxsKQotCQkJCS8vIG5vIHByZWZlcmVuY2VzIGZvciB0aGlzIHByb2plY3Qta2V5LCBqdXN0IGJhaWwKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhZmZlY3RlZFJlc291cmNlczsKLQkJCXRyeSB7Ci0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBwcm9qZWN0UHJlZnMua2V5cygpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCBzY29wZS4uLiB3ZSBnb25uYSBtaXNzIHRoZQotCQkJCS8vIGNoYW5nZXMgKGJ1dCB3aWxsIGxvZykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiUHJvYmxlbSByZXRyZWl2aW5nIEpTUCBGcmFnbWVudCBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggcHJlZmVyZW5jZSBrZXkgKHdoaWNoIGlzIHJlYWxseSBhIGZpbGUgbmFtZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBzZWUgaWYgcHJlZmVyZW5jZSBrZXkvZmlsZSBuYW1lIHdhcyBmaWxlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCQlJUmVzb3VyY2VEZWx0YSBtZW1iZXJEZWx0YSA9IHByb2plY3REZWx0YS5maW5kTWVtYmVyKG5ldyBQYXRoKGFmZmVjdGVkUmVzb3VyY2VzW2ldKSk7Ci0JCQkJLy8gbm8gY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JCQkJaWYgKG1lbWJlckRlbHRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtZW1iZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlyZXNvdXJjZUNoYW5nZXMgPSB0cnVlOwotCQkJCQkvLyByZW1vdmUgdGhlIHNldHRpbmcgZm9yIHRoZSBvcmlnaW5hbCBsb2NhdGlvbgotCQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJvamVjdFByZWZzLmdldChhZmZlY3RlZFJlc291cmNlc1tpXSwgbnVsbCk7Ci0JCQkJCXByb2plY3RQcmVmcy5yZW1vdmUoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pOwotCQkJCQlpZiAoKG1lbWJlckRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkJLy8gaWYgbW92aW5nLCBjb3B5IHRoZSBzZXR0aW5nIGZvciB0aGUgbmV3IGxvY2F0aW9uCi0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCQlQcmVmZXJlbmNlcyB0YXJnZXRQcmVmcyA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyh0YXJnZXRQcm9qZWN0LCBrZXksIHRydWUpOwotCQkJCQkJdGFyZ2V0UHJlZnMucHV0KEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRLZXlGb3IobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKSksIGN1cnJlbnRWYWx1ZSk7Ci0JCQkJCQlpZiAodGFyZ2V0UHJvamVjdCAhPSBjdXJyZW50UHJvamVjdCkKLQkJCQkJCQlwcm9qZWN0c1RvU2F2ZS5hZGQodGFyZ2V0UHJvamVjdCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzb3VyY2VDaGFuZ2VzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEZvciBhbnkgY2hhbmdlIHRvIHRoZSBlbmNvZGluZyBmaWxlIG9yIGFueSByZXNvdXJjZSB3aXRoIGVuY29kaW5nCi0JCSAqIHNldCwganVzdCBkaXNjYXJkIHRoZSBjYWNoZSBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgcHJvamVjdC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJSVJlc291cmNlRGVsdGEgZGVsdGEgPSBldmVudC5nZXREZWx0YSgpOwotCQkJaWYgKGRlbHRhID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJSVJlc291cmNlRGVsdGFbXSBwcm9qZWN0RGVsdGFzID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJLy8gcHJvY2VzcyBlYWNoIHByb2plY3QgaW4gdGhlIGRlbHRhCi0JCQlTZXQgcHJvamVjdHNUb1NhdmUgPSBuZXcgSGFzaFNldCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0RGVsdGFzLmxlbmd0aDsgaSsrKQotCQkJCS8vIG5vdGhpbmcgdG8gZG8gaWYgYSBwcm9qZWN0IGhhcyBiZWVuIGFkZGVkL3JlbW92ZWQvbW92ZWQKLQkJCQlpZiAocHJvamVjdERlbHRhc1tpXS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRCAmJiAocHJvamVjdERlbHRhc1tpXS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuT1BFTikgPT0gMCkKLQkJCQkJcHJvY2Vzc0VudHJ5Q2hhbmdlcyhwcm9qZWN0RGVsdGFzW2ldLCBwcm9qZWN0c1RvU2F2ZSk7Ci0JCQlmSm9iLmFkZENoYW5nZXMocHJvamVjdHNUb1NhdmUpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlfaW5zdGFuY2UgPSBuZXcgSlNQRkNvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MWIwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZWM3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudERlc2NyaWJlckZvckpTUCBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEUsIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9GQU1JTFlfQVRUUklCVVRFfTsKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KElucHV0U3RyZWFtIGNvbnRlbnRzKSB7Ci0JCS8vIFRoZXJlJ3MgbGl0dGxlIHRvIHByb3ZlLCB2aWEgY29udGVudHMsIHRoYXQKLQkJLy8gYSBmaWxlIGlzIEpTUCwgc28gYWx3YXlzIHJldHVybiBpbnRlcm1pbmFudCwgYW5kCi0JCS8vIGxldCBmaWxldHlwZXMgZGVjaWRlLgotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklUZXh0Q29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLlJlYWRlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShSZWFkZXIgY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCS8vIGlmIGRpc2NyaXB0aW9uIGlzIG51bGwsIHdlIGFyZSBqdXN0IGJlaW5nIGFza2VkIHRvCi0JCS8vIGFzc2VzcyBjb250ZW50cyB2YWxpZGl0eQotCQlpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShSZWFkZXIgY29udGVudHMpIHsKLQkJLy8gVGhlcmUncyBsaXR0bGUgdG8gcHJvdmUsIHZpYSBjb250ZW50cywgdGhhdAotCQkvLyBhIGZpbGUgaXMgSlNQLCBzbyBhbHdheXMgcmV0dXJuIGludGVybWluYW50LCBhbmQKLQkJLy8gbGV0IGZpbGV0eXBlcyBkZWNpZGUuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXB1YmxpYyBRdWFsaWZpZWROYW1lW10gZ2V0U3VwcG9ydGVkT3B0aW9ucygpIHsKLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCQlyZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGhhbmRsZSBzdGFuZGFyZCBvbmVzIGZpcnN0LCB0byBiZSBzdXJlIGRldGVjdG9yIHByb2Nlc3NlcwotCQloYW5kbGVTdGFuZGFyZENhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkvLyBub3cgZG8gdGhvc2Ugc3BlY2lmaWMgZm9yIEpTUHMKLQkJLy8gbm90ZTogZGV0ZWN0b3Igc2hvdWxkIGFsd2F5cyBiZSBvZiBjb3JyZWN0IGluc3RhbmNlLCBidXQgd2UnbGwKLQkJLy8gY2hlY2ssIGZvciBub3cuCi0JCWlmIChkZXRlY3RvciBpbnN0YW5jZW9mIEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgewotCQkJSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGpzcERldGVjdG9yID0gKEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3I7Ci0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBqc3BEZXRlY3Rvci5nZXRMYW5ndWFnZSgpOwotCQkJaWYgKGxhbmd1YWdlICE9IG51bGwgJiYgbGFuZ3VhZ2UubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEUsIGxhbmd1YWdlKTsKLQkJCX0KLQkJCS8qCi0JCQkgKiBjb250ZW50IHR5cGUgaXMgbGl0ZXJhbGx5IHRoZSBjb250ZW50IHR5cGUgdGhhdCdzIGluIHRoZSBwYWdlCi0JCQkgKiBkaXJlY3RpdmUKLQkJCSAqLwotCQkJU3RyaW5nIGNvbnRlbnRUeXBlQXR0cmlidXRlID0ganNwRGV0ZWN0b3IuZ2V0Q29udGVudFR5cGUoKTsKLQkJCWlmIChjb250ZW50VHlwZUF0dHJpYnV0ZSAhPSBudWxsICYmIGNvbnRlbnRUeXBlQXR0cmlidXRlLmxlbmd0aCgpID4gMCkgewotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgY29udGVudFR5cGVBdHRyaWJ1dGUpOwotCQkJfQotCQkJLyoKLQkJCSAqIGNvbnRlbnQgZmFtaWx5IGlzIHRoZSBnZW5lcmFsIGNsYXNzIG9mIGNvbnRlbnQsIHdoZW4gaXRzCi0JCQkgKiBkaWZmZXJlbnQgZnJvbSB3aGF0J3MgZGVmaW5lZCBieSBjb250ZW50IHR5cGUKLQkJCSAqLwotCQkJaWYgKGpzcERldGVjdG9yLmlzWEhUTUwoKSB8fCBqc3BEZXRlY3Rvci5pc1dNTCgpKSB7Ci0JCQkJLy8gSVNTVUU6IGxvbmcgdGVybSB0aGlzIGxvZ2ljIGFuZCB2YWx1ZSBzaG91bGQgYmUgY29udHJpYnV0ZWQgYnkgZXh0ZW5zaW9uIHBvaW50Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX0ZBTUlMWV9BVFRSSUJVVEUsIENvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTC5IVE1MX0ZBTUlMWSk7Ci0JCQl9Ci0KLQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3RhbmRhcmRDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSAoKEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYKLQkJCS8vIGludmFsaWQKLQkJCS8vIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJLy8gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LgotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGRldGVjdG9yLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9IZWFkUGFyc2VyVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE5M2UwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBjbGFzcyBIZWFkUGFyc2VyVG9rZW4gewotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgU3RyaW5nIGZUeXBlOwotCi0JcHJvdGVjdGVkIEhlYWRQYXJzZXJUb2tlbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSGVhZFBhcnNlclRva2VuKFN0cmluZyB0eXBlLCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHQgPSB0ZXh0OwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZlRleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICgidGV4dDogIiArIGZUZXh0ICsgIiBvZmZzZXQ6ICIgKyBmU3RhcnQgKyAiIHR5cGU6ICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDRkMGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSW50U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbXB0eSgpIHsKLQkJcmV0dXJuIHNpemUgPT0gMDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldChpbnQgc2xvdCkgewotCQlyZXR1cm4gbGlzdFtzbG90XTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKQotCQkJbGlzdFtpXSA9IC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjayB3aXRob3V0IHJlbW92aW5nIGl0Ci0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwZWVrKCkgewotCQlpZiAoc2l6ZSA9PSAwKQotCQkJdGhyb3cgbmV3IEVtcHR5U3RhY2tFeGNlcHRpb24oKTsKLQkJcmV0dXJuIGxpc3Rbc2l6ZSAtIDFdOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGludCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjawotCSAqIAotCSAqIEByZXR1cm4gaW50IGF0IHRoZSB0b3Agb2YgdGhpcyBzdGFjay4KLQkgKiBAZXhjZXB0aW9uIEVtcHR5U3RhY2tFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICB3aGVuIGVtcHR5LgotCSAqLwotCXB1YmxpYyBpbnQgcG9wKCkgewotCQlpbnQgdmFsdWUgPSBwZWVrKCk7Ci0JCWxpc3Rbc2l6ZSAtIDFdID0gLTE7Ci0JCXNpemUtLTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFB1c2hlcyBhbiBpdGVtIG9udG8gdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIAotCSAqIEBwYXJhbSBuZXdWYWx1ZSAtCi0JICogICAgICAgICAgICB0aGUgaW50IHRvIGJlIHB1c2hlZCBvbnRvIHRoaXMgc3RhY2suCi0JICogQHJldHVybiB0aGUgPGNvZGU+bmV3VmFsdWU8L2NvZGU+IGFyZ3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgcHVzaChpbnQgbmV3VmFsdWUpIHsKLQkJaWYgKHNpemUgPT0gbGlzdC5sZW5ndGgpIHsKLQkJCXRocm93IG5ldyBTdGFja092ZXJmbG93RXJyb3IoKTsKLQkJfQotCQlsaXN0W3NpemUrK10gPSBuZXdWYWx1ZTsKLQkJcmV0dXJuIG5ld1ZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgc2l6ZSgpIHsKLQkJcmV0dXJuIGxpc3QubGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQSGVhZFRva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzc3N2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTA3ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuNCBvbiA5LzE4LzA2IDI6MTIgUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmpmbGV4LmRlLyI+SkZsZXg8L2E+IDEuNAotICogb24gOS8xOC8wNiAyOjEyIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PkQ6L2J1aWxkcy9Xb3Jrc3BhY2VzL1dUUDE1bWFpbnRlbmFuY2Uvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0pTUEhlYWRUb2tlbml6ZXIuakZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgSlNQSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfQlVGRkVSU0laRSA9IDgxOTI7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVuRGVsaW1pdGVkU3RyaW5nID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERRX1NUUklORyA9IDg7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNRX1NUUklORyA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9YTUxEZWNsID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfUEFHRV9ESVJFQ1RJVkUgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDY7Ci0KLSAgLyoqCi0gICAqIFpaX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFpaX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgIDYsICA3LCA3Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTFcMFwxXDZcMVwxMVwyXDBcMVwxMFwyMlwwXDFcMzRcMVwxN1wxXDM3XDJcMCIrCi0gICAgIlwxXDUxXDFcMFwxXDQwXDZcMFwxXDQzXDFcMzNcMVwwXDFcNDdcMVwwXDFcNDQiKwotICAgICJcNVwwXDFcNTBcMVw0MVwxXDBcMVwxMlwxXDdcMVw1NlwxXDEzXDFcNTJcMVw1MyIrCi0gICAgIlwxXDMxXDFcMjJcMVwyMFwxXDI2XDFcMFwxXDQ2XDFcMjdcMVwzMlwxXDU0XDFcMCIrCi0gICAgIlwxXDE2XDFcMTVcMVwzNVwxXDIxXDFcMjVcMVwwXDFcNDVcMVwzNlwxXDIzXDFcMzAiKwotICAgICJcMVw1NVwxXDQyXDFcMTRcMVwyNFw3XDBcMVw1M1wxXDMxXDFcMjJcMVwyMFwxXDI2IisKLSAgICAiXDFcMFwxXDQ2XDFcMjdcMVwzMlwxXDU0XDFcMFwxXDE2XDFcMTVcMVwzNVwxXDIxIisKLSAgICAiXDFcMjVcMVwwXDFcNDVcMVwzNlwxXDIzXDFcMzBcMVw1NVwxXDQyXDFcMTRcMVwyNCIrCi0gICAgIlwxMDFcMFwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwXDFcMVwyMFwwXDFcMyIrCi0gICAgIlwxNlwwXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlwxMFwwXDIwXDFcMlwyXDFcMVwxXDNcMVw0XDFcNVwxXDYiKwotICAgICJcMVw1XDFcN1wyXDVcMVw3XDFcMTBcMlwxMVw0XDBcMVwxMiIrCi0gICAgIlwxXDEzXDZcMFwxXDE0XDVcMFwxXDE1XDFcMTZcMVwwXDFcMTciKwotICAgICJcMVwwXDFcMjBcNFwwXDFcMjFcMzZcMFwxXDIyXDIwXDBcMVwyMyIrCi0gICAgIlwyXDBcMVwyNFw2XDBcMVwyNVwxXDI2XDIyXDBcMVwyN1w1XDAiKwotICAgICJcMVwzMFw1MlwwXDFcMzFcNVwwXDFcMzJcMTJcMFwxXDMyIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbMjEyXTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9VTktOT1dOX0VSUk9SID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX05PX01BVENIID0gMTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1BVU0hCQUNLXzJCSUcgPSAyOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHp6UmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHp6U3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgenpCdWZmZXJbXSA9IG5ldyBjaGFyW1paX0JVRkZFUlNJWkVdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ek1hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgenpQdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6Q3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHp6U3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgenpFbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgLy9wcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvL3ByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6RU9GRG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCi0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotICAgICAgICBTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0gICAgICAgIHByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzWEhUTUw7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1dNTDsKLQotCi0gICAgICAgIHB1YmxpYyBKU1BIZWFkVG9rZW5pemVyKCkgewotICAgICAgICAgICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgICAgICAvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgICAgICAgICAgICAgICB6elB1c2hiYWNrUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIC8veXlsaW5lID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5Y2hhciA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAgICAgICAgICAgICAgICAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvL3l5Y29sdW1uID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpc1hIVE1MPWZhbHNlOwotICAgICAgICAgICAgICAgIGlzV01MPWZhbHNlOwotCi0KLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotICAgICAgICAgICAgICAgIEhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVUZXh0ID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotICAgICAgICAgICAgICAgIHJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotICAgICAgICB9Ci0gICAgICAgIHByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotICAgICAgICB9Ci0gCi0gICAgICAgIHByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLSAgICAgICAgICAgICAgICB5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLSAgICAgICAgfQotICAgICAgICBwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNYSFRNTCgpIHsKLSAgICAgICAgICAgIHJldHVybiBpc1hIVE1MOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzV01MKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzV01MOwotICAgICAgICB9ICAgICAgICAKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE5MikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0gICAgICB6elJlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLSAgICAvL3l5bGluZSA9IHl5Y2hhciA9IHl5Y29sdW1uID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4genpMZXhpY2FsU3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwgenpNYXJrZWRQb3MtenpTdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgcHVibGljIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB6ekJ1ZmZlclt6elN0YXJ0UmVhZCtwb3NdOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHB1YmxpYyB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB6ek1hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwKLSAgICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6RG9FT0YoKSB7Ci0gICAgaWYgKCF6ekVPRkRvbmUpIHsKLSAgICAgIHp6RU9GRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICBoYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHp6SW5wdXQ7Ci0gICAgaW50IHp6QWN0aW9uOwotCi0gICAgLy8gY2FjaGVkIGZpZWxkczoKLSAgICBpbnQgenpDdXJyZW50UG9zTDsKLSAgICBpbnQgenpNYXJrZWRQb3NMOwotICAgIGludCB6ekVuZFJlYWRMID0genpFbmRSZWFkOwotICAgIGNoYXIgW10genpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgY2hhciBbXSB6ekNNYXBMID0gWlpfQ01BUDsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB5eWNoYXIrPSB6ek1hcmtlZFBvc0wtenpTdGFydFJlYWQ7Ci0KLSAgICAgIGlmICh6ek1hcmtlZFBvc0wgPiB6elN0YXJ0UmVhZCkgewotICAgICAgICBzd2l0Y2ggKHp6QnVmZmVyTFt6ek1hcmtlZFBvc0wtMV0pIHsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICBjYXNlICdcdTAwMEInOgotICAgICAgICBjYXNlICdcdTAwMEMnOgotICAgICAgICBjYXNlICdcdTAwODUnOgotICAgICAgICBjYXNlICdcdTIwMjgnOgotICAgICAgICBjYXNlICdcdTIwMjknOgotICAgICAgICAgIHp6QXRCT0wgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdccic6IAotICAgICAgICAgIGlmICh6ek1hcmtlZFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpBdEJPTCA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdICE9ICdcbic7Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikKLSAgICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgICAgICAgICBpZiAoZW9mKSAKLSAgICAgICAgICAgICAgenpBdEJPTCA9IGZhbHNlOwotICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgenpBdEJPTCA9IHp6QnVmZmVyTFt6ek1hcmtlZFBvc0xdICE9ICdcbic7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIGlmICh6ekF0Qk9MKQotICAgICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGUrMV07Ci0gICAgICBlbHNlCi0gICAgICAgIHp6U3RhdGUgPSBaWl9MRVhTVEFURVt6ekxleGljYWxTdGF0ZV07Ci0KLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIHp6SW5wdXQgPSB6ekNNYXBMW3p6SW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB6eklzRmluYWwgPSBmYWxzZTsKLSAgICAgICAgICBib29sZWFuIHp6Tm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHp6Rm9yTmV4dDogeyBzd2l0Y2ggKHp6U3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDMyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICAgICAgICBjYXNlIDQxOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDE6IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDQ6IHp6U3RhdGUgPSA0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA0MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogenpTdGF0ZSA9IDQ1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpTdGF0ZSA9IDQ3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpTdGF0ZSA9IDM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDQwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MTogenpTdGF0ZSA9IDQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NDogenpTdGF0ZSA9IDQyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDQ4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDUwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA1MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSA1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA1NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSA1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDU4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA1OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ2OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpTdGF0ZSA9IDYxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0NjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA2MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA2MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSA2MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA2NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNDI6IHp6U3RhdGUgPSA2NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSA2NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA0NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA0NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA2ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA0OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHp6U3RhdGUgPSA1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDY6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM3OiB6elN0YXRlID0gNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gNzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gNzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDI0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA3NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSA3NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA2NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA3NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSA3ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSA3OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHp6U3RhdGUgPSA4MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSA4MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA4MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA4MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA4NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDM6IHp6U3RhdGUgPSA4NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHp6U3RhdGUgPSA4NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA4ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSA4OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSA5MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSA5MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA5MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSA5MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSA4NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSA5NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSA5NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSA5NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6U3RhdGUgPSA5OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHp6U3RhdGUgPSAxMDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQzOiB6elN0YXRlID0gMTAxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDEwMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHp6U3RhdGUgPSAxMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB6elN0YXRlID0gMTA0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDEwNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAxMDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6elN0YXRlID0gMTA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDk4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDEwODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB6elN0YXRlID0gMTA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxMTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDExMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMTEyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAxMTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDExNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzc6IHp6U3RhdGUgPSAxMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzODogenpTdGF0ZSA9IDExNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMTA5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAxMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDEyMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTEyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gMTIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAxMjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDEyMzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAxMjQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDExNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDExNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTE4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAxMTk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMjY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogenpTdGF0ZSA9IDEyNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gMTI4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAxMjI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMTI5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogenpTdGF0ZSA9IDEzMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTIzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB6elN0YXRlID0gMTMxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSAxMzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyNToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAxMzM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEyODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpTdGF0ZSA9IDEzNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAxMzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDEzMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogenpTdGF0ZSA9IDEzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTMyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTM4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHp6U3RhdGUgPSAxMzk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogenpTdGF0ZSA9IDE0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB6elN0YXRlID0gMTQxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAxNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDEzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHp6U3RhdGUgPSAxNDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpTdGF0ZSA9IDE0NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMTM5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTQ1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzg6IHp6U3RhdGUgPSAxNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0MToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDE0NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMTQyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDE0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMTQ5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDU6IHp6U3RhdGUgPSAxNTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE0NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMTQ2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTUxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6U3RhdGUgPSAxNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gMTUyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHp6U3RhdGUgPSAxNTM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogenpTdGF0ZSA9IDE1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gMTU1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxNTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDE1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMTU3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAxNTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogenpTdGF0ZSA9IDE1OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB6elN0YXRlID0gMTYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSAxNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogenpTdGF0ZSA9IDE2MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB6elN0YXRlID0gNzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpTdGF0ZSA9IDE2MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6elN0YXRlID0gMTY0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHp6U3RhdGUgPSAxNjU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpTdGF0ZSA9IDE2NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB6elN0YXRlID0gMTY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNjg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTczOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAxNzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTczOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTczOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDE3NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMTc3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB6elN0YXRlID0gMTc4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTc5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHp6U3RhdGUgPSAxODA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAxODE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE3OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSAxODI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogenpTdGF0ZSA9IDE4MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTgxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpTdGF0ZSA9IDE4NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTgyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpTdGF0ZSA9IDE4NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMTg2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB6elN0YXRlID0gMTg3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB6elN0YXRlID0gMTg4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxODY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHp6U3RhdGUgPSAxODk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHp6U3RhdGUgPSAxOTA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSAxOTE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogenpTdGF0ZSA9IDE5MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTkwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogenpTdGF0ZSA9IDE5MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE5NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTkyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gMTk1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB6elN0YXRlID0gMTk2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6U3RhdGUgPSAxNjc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5NToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogenpTdGF0ZSA9IDE5NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6elN0YXRlID0gMTcyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDE5ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTk3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM4OiB6elN0YXRlID0gMTk5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAxNzI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMjAwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6elN0YXRlID0gMTY5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAyMDE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpTdGF0ZSA9IDE3MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpTdGF0ZSA9IDE2OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDM5OiB6elN0YXRlID0gMjAyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDA6IHp6U3RhdGUgPSAyMDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA0MDogenpTdGF0ZSA9IDIwNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQwOiB6elN0YXRlID0gMjA1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6U3RhdGUgPSAyMDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogenpTdGF0ZSA9IDIwNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB6elN0YXRlID0gMjA4OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSAyMDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogenpTdGF0ZSA9IDIxMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjEwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgZXZlciByZWFjaGVkLCB0aGVyZSBpcyBhIHNlcmlvdXMgYnVnIGluIEpGbGV4Ci0gICAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX1VOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggenpJc0ZpbmFsICkgewotICAgICAgICAgICAgenpBY3Rpb24gPSB6elN0YXRlOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIGlmICggenpOb0xvb2tBaGVhZCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI3OiBicmVhazsKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDQ6IAotICAgICAgICAgIHsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgICAgeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUxhbmd1YWdlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICAgIHsgaXNYSFRNTCA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRW5jb2Rpbmc7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM1OiBicmVhazsKLSAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzc6IGJyZWFrOwotICAgICAgICBjYXNlIDk6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM4OiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUNvbnRlbnRUeXBlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDQzOiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7IHl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlRGlyZWN0aXZlRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgaXNXTUwgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RJUkVDVElWRSk7IHJldHVybiBKU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlBhZ2VEaXJlY3RpdmVTdGFydDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDg6IGJyZWFrOwotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDUwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNTE6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA1MjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB6ekRvRU9GKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhmYTViOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0pTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQSGVhZFRva2VuaXplckNvbnN0YW50cyBleHRlbmRzIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMgewotCVN0cmluZyBQYWdlRGlyZWN0aXZlU3RhcnQgPSAiUGFnZURpcmVjdGl2ZVN0YXJ0IjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBQYWdlRGlyZWN0aXZlRW5kID0gIlBhZ2VEaXJlY3RpdmVFbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VMYW5ndWFnZSA9ICJQYWdlTGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VFbmNvZGluZyA9ICJQYWdlRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFBhZ2VDb250ZW50VHlwZSA9ICJQYWdlQ29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMWFmMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByaXZhdGUgU3RyaW5nIGZDaGFyc2V0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnRUeXBlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRlbnRUeXBlVmFsdWU7Ci0KLQlwcml2YXRlIFN0cmluZyBmTGFuZ3VhZ2U7Ci0KLQlwcml2YXRlIFN0cmluZyBmUGFnZUVuY29kaW5nVmFsdWU7Ci0KLQlwcml2YXRlIEpTUEhlYWRUb2tlbml6ZXIgZlRva2VuaXplcjsKLQotCXByaXZhdGUgU3RyaW5nIGZYTUxEZWNFbmNvZGluZ05hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gdW5pY29kZUNhc2U7Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJpdmF0ZSBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0KLQlwcml2YXRlIFJlYWRlciBmUmVhZGVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGZYSFRNTDsKLQotCXByaXZhdGUgYm9vbGVhbiBmV01MOwotCi0KLQkvKioKLQkgKiBObyBBcmcgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQljbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJCXN1cGVyKCk7Ci0JCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgY29udGVudFR5cGUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUgdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcyBub3QgcHJlc2VudC4KLQkJfQotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZMYW5ndWFnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IEpTUCBTcGVjCi0JCWZpbmFsIFN0cmluZyBlbmMgPSAiSVNPLTg4NTktMSI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldFNwZWNEZWZhdWx0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXNldEFsbCgpOwotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jKTsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIKLQkJCS8vIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlTdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCQkvLyBUT0RPIHdlJ2xsIG5lZWQgdG8gInJlbWVtYmVyIiBJRmlsZSwgb3IKLQkJLy8gZ2V0IGl0cyAob3IgaXRzIHByb2plY3Qncykgc2V0dGluZ3MsIGluIGNhc2UKLQkJLy8gdGhvc2UgYXJlIG5lZWRlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiB0aGUKLQkJLy8gZW5jb2RpbmcgaXMgbm90IGluIHRoZSBmaWxlIHN0cmVhbS4KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGUgPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGUgPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGU7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGVyZSBjYW4gc29tZXRpbWVzIGJlIG11bGl0cGxlICdlbmNvZGluZ3MnIHNwZWNpZmllZCBpbiBhIGZpbGUuIFRoaXMKLQkgKiBpcyBhbiBhdHRlbXB0IHRvIGNlbnRyYWxpemUgdGhlIHJ1bGVzIGZvciBkZWNpZGluZyBiZXR3ZWVuIHRoZW0uCi0JICogUmV0dXJucyBlbmNvZGluZyBhY2NvcmRpbmcgdG8gcHJpb3JpdHk6IDEuIFhNTCBEZWNsYXJhdGlvbiAyLiBwYWdlCi0JICogZGlyZWN0aXZlIHBhZ2VFbmNvZGluZyBuYW1lIDMuIHBhZ2UgZGlyZWN0aXZlIGNvbnRlbnRUeXBlIGNoYXJzZXQgbmFtZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlRW5jb2RpbmcoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoZlhNTERlY0VuY29kaW5nTmFtZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gZlhNTERlY0VuY29kaW5nTmFtZTsKLQkJZWxzZSBpZiAoZlBhZ2VFbmNvZGluZ1ZhbHVlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmUGFnZUVuY29kaW5nVmFsdWU7Ci0JCWVsc2UgaWYgKGZDaGFyc2V0ICE9IG51bGwpCi0JCQlyZXN1bHQgPSBmQ2hhcnNldDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuIG51bGwsIGlmIGludmFsaWQgY2hhcnNldCBuYW1lIChpbiB3aGljaCBjYXNlCi0JICogImFwcHJvcHJpYXRlRGVmYXVsdCIgc2hvdWxkIGJlIHVzZWQsIGlmIGEgbmFtZSBpcyByZWFsbHkgbmVlZCBmb3Igc29tZQotCSAqICJzYXZlIGFueXdheSIgY2FzZXMpLgotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZSAtLSBpdHMgaGVyZSB3ZSBwaWNrIHVwICJydWxlcyIgZm9yIGNhc2VzCi0JCS8vIHRoYXQgYXJlIG5vdCBldmVuIGluIEphdmEKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIDIuIFVzZSB0aGUgImNhbm9uaWNhbCIgbmFtZSBmcm9tIEpSRSBtYXBwaW5ncwotCQkvLyBOb3RlOiBzZWUgQ2hhcnNldCBKYXZhRG9jLCB0aGUgbmFtZSB5b3UgZ2V0IG9uZQotCQkvLyB3aXRoIGNhbiBiZSBhbGlhcywKLQkJLy8gdGhlIG5hbWUgeW91IGdldCBiYWNrIGlzICJzdGFuZGFyZCIgbmFtZS4KLQkJQ2hhcnNldCBqYXZhQ2hhcnNldCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlqYXZhQ2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gZ2l2ZSBwcmlvcml0eSB0byBqYXZhIGNvbm9uaWNhbCBuYW1lLCBpZiBwcmVzZW50Ci0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBqYXZhQ2hhcnNldC5uYW1lKCk7Ci0JCQkvLyBidXQgc3RpbGwgYWxsb3cgb3ZlcnJpZGVzCi0JCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBKU1BIZWFkVG9rZW5pemVyIGdldFRva2luaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBKU1BIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuY29kaW5nTmFtZSwKLQkJCS8vIEVuY29kaW5nTWVtZW50by5VU0VEX0NPTlRFTlRfVFlQRV9ERUZBVUxUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShlbmNvZGluZ05hbWUpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jb2RpbmdOYW1lKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAodmFsdWVUb2tlblR5cGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUgYXMgd2hhdCBpcyBpbiAKLQkgKiBKU1BIZWFkVG9rZW5pemVyVGVzdGVyCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlQ29udGVudFR5cGVWYWx1ZShTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCI7XFxzKmNoYXJzZXRcXHMqPVxccyoiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBwYXJ0cyA9IHBhdHRlcm4uc3BsaXQoY29udGVudFR5cGUpOwotCQlpZiAocGFydHMubGVuZ3RoID4gMCkgewotCQkJLy8gaWYgb25seSBvbmUgaXRlbSwgaXQgY2FuIHN0aWxsIGJlIGNoYXJzZXQgaW5zdGVhZCBvZgotCQkJLy8gY29udGVudFR5cGUKLQkJCWlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotCQkJCWlmIChwYXJ0c1swXS5sZW5ndGgoKSA+IDYpIHsKLQkJCQkJU3RyaW5nIGNoZWNrRm9yQ2hhcnNldCA9IHBhcnRzWzBdLnN1YnN0cmluZygwLCA3KTsKLQkJCQkJaWYgKGNoZWNrRm9yQ2hhcnNldC5lcXVhbHNJZ25vcmVDYXNlKCJjaGFyc2V0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaW50IGVxcG9zID0gcGFydHNbMF0uaW5kZXhPZignPScpOwotCQkJCQkJZXFwb3MgPSBlcXBvcyArIDE7Ci0JCQkJCQlpZiAoZXFwb3MgPCBwYXJ0c1swXS5sZW5ndGgoKSkgewotCQkJCQkJCWZDaGFyc2V0ID0gcGFydHNbMF0uc3Vic3RyaW5nKGVxcG9zKTsKLQkJCQkJCQlmQ2hhcnNldCA9IGZDaGFyc2V0LnRyaW0oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZDb250ZW50VHlwZSA9IHBhcnRzWzBdOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkNvbnRlbnRUeXBlID0gcGFydHNbMF07Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHsKLQkJCWZDaGFyc2V0ID0gcGFydHNbMV07Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIExvb2tzIGZvciB3aGF0IGV2ZXIgZW5jb2RpbmcgcHJvcGVydGllcyB0aGUgdG9rZW5pemVyIHJldHVybnMuIEl0cyB0aGUKLQkgKiByZXNwb25zaWJpbGl0eSBvZiB0aGUgdG9rZW5pemVyIHRvIHN0b3Agd2hlbiBhcHByb3ByaWF0ZSBhbmQgbm90IGdvIHRvbwotCSAqIGZhci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2VIZWFkZXIoSlNQSGVhZFRva2VuaXplciB0b2tlbml6ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZQYWdlRW5jb2RpbmdWYWx1ZSA9IG51bGw7Ci0JCWZDaGFyc2V0ID0gbnVsbDsKLQotCQlIZWFkUGFyc2VyVG9rZW4gdG9rZW4gPSBudWxsOwotCQlkbyB7Ci0JCQkvLyBkb24ndCB1c2UgJ2dldCcgaGVyZSAoYXQgbGVhc3QgdW50aWwgcmVzZXQgaXNzdWUgZml4ZWQpCi0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCVN0cmluZyB0b2tlblR5cGUgPSB0b2tlbi5nZXRUeXBlKCk7Ci0JCQlpZiAoY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKHRva2VuVHlwZSkpCi0JCQkJdW5pY29kZUNhc2UgPSB0cnVlOwotCQkJZWxzZSB7Ci0KLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmWE1MRGVjRW5jb2RpbmdOYW1lID0gdmFsdWVUb2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUVuY29kaW5nKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQkJZlBhZ2VFbmNvZGluZ1ZhbHVlID0gdmFsdWVUb2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEpTUEhlYWRUb2tlbml6ZXJDb25zdGFudHMuUGFnZUNvbnRlbnRUeXBlKSB7Ci0JCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQlIZWFkUGFyc2VyVG9rZW4gdmFsdWVUb2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQkJZkNvbnRlbnRUeXBlVmFsdWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSlNQSGVhZFRva2VuaXplckNvbnN0YW50cy5QYWdlTGFuZ3VhZ2UpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJU3RyaW5nIHZhbHVlVG9rZW5UeXBlID0gdmFsdWVUb2tlbi5nZXRUeXBlKCk7Ci0JCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCQlmTGFuZ3VhZ2UgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0JCWlmIChmQ29udGVudFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQlwYXJzZUNvbnRlbnRUeXBlVmFsdWUoZkNvbnRlbnRUeXBlVmFsdWUpOwotCQl9Ci0JCWlmICh0b2tlbml6ZXIuaXNYSFRNTCgpKSB7Ci0JCQlmWEhUTUwgPSB0cnVlOwotCQl9Ci0JCWlmICh0b2tlbml6ZXIuaXNXTUwoKSApIHsKLQkJCWZXTUwgPSB0cnVlOwotCQl9Ci0JCQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlKU1BIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2luaXplcigpOwotCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCXRva2VuaXplci5yZXNldChmUmVhZGVyKTsKLQkJcGFyc2VIZWFkZXIodG9rZW5pemVyKTsKLQkJLy8gdW5pY29kZSBzdHJlYW0gY2FzZXMgYXJlIGNyZWF0ZWQgZGlyZWN0bHkgaW4gcGFyc2VIZWFkZXIKLQkJaWYgKCF1bmljb2RlQ2FzZSkgewotCQkJU3RyaW5nIGVuYyA9IGdldEFwcHJvcHJpYXRlRW5jb2RpbmcoKTsKLQkJCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkNoYXJzZXQgPSBudWxsOwotCQlmQ29udGVudFR5cGVWYWx1ZSA9IG51bGw7Ci0JCWZQYWdlRW5jb2RpbmdWYWx1ZSA9IG51bGw7Ci0JCWZYTUxEZWNFbmNvZGluZ05hbWUgPSBudWxsOwotCQl1bmljb2RlQ2FzZSA9IGZhbHNlOwotCQlmWEhUTUw9ZmFsc2U7Ci0JCWZXTUw9ZmFsc2U7Ci0JfQotCi0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzV01MKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbiBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcgcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZSB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzIG5vdCBwcmVzZW50LgotCQl9Ci0JCXJldHVybiBmV01MOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzWEhUTUwoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMgbm90IHByZXNlbnQuCi0JCX0KLQkJcmV0dXJuIGZYSFRNTDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRGYWN0b3J5Rm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMDUwZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZhY3RvcnlGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIERvY3VtZW50RmFjdG9yeUZvckpTUCBpbXBsZW1lbnRzIElEb2N1bWVudEZhY3RvcnkgewotCi0JcHVibGljIERvY3VtZW50RmFjdG9yeUZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50RmFjdG9yeSNjcmVhdGVEb2N1bWVudCgpCi0JICovCi0JcHVibGljIElEb2N1bWVudCBjcmVhdGVEb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKG5ldyBKU1BTb3VyY2VQYXJzZXIoKSk7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgTG9hZGVyCi0JCS8vIHdpbGwgbmVlZCB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgcGFyc2VyCi0JCS8vIGJhc2VkIG9uICJlbWJlZGRlZCBjb250ZW50IgotCQlKU1BTb3VyY2VQYXJzZXIgcGFyc2VyID0gbmV3IEpTUFNvdXJjZVBhcnNlcigpOwotCQkvLyBhZGQgZGVmYXVsdCBuZXN0YWJsZSB0YWcgbGlzdAotCQlhZGROZXN0YWJsZVByZWZpeChwYXJzZXIsIEpTUDExTmFtZXNwYWNlLkpTUF9UQUdfUFJFRklYKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoSlNQU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJVGFnTWFya2VyIGJtID0gbmV3IFRhZ01hcmtlcih0YWdOYW1lKTsKLQkJcGFyc2VyLmFkZE5lc3RhYmxlUHJlZml4KGJtKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMTIxNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLS8qKgotICogQ2xhc3NlcyB3aGljaCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgaGF2ZSB0d28gcmVzcG9uc2liaWxpdGllcy4gCi0gKiBPbmUgaXMgdG8gcHJvdmlkZQotICogYW5kIGVtYmVkZGVkIGZhY3RvcnkgcmVnaXN0cnkgZm9yIEpTUCBBd2FyZSBJTm9kZUFkYXB0ZXIgRmFjdG9yaWVzCi0gKiB0byB1c2UuIFRoZSBvdGhlciBpcyB0byBtb25pdG9yIHBhZ2UgZGlyZWN0aXZlcyBhbmQgaWYgCi0gKiBhIGNoYW5nZSBpbiBlbWJlZGRlZCB0eXBlIGlzIGlzIG1hZGUsIGl0IHdpbGwgc2lnbmFsIAotICogdGhlIHN0cnVjdHVyZWRNb2RlbCB0aGF0IGl0IG5lZWRzIHRvIHJlaW5pdGlhbGl6ZSBpdHNlbGYuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpOwotCi0JLyoqCi0JICogVGhpcyBzZXR0ZXIgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25jZSwgc2hvcnRseSBhZnRlcgotCSAqIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXZvaWQgc2V0RW1iZWRkZWRUeXBlKEVtYmVkZGVkVHlwZUhhbmRsZXIgaGFuZGxlcik7Ci0KLQlFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdG8gZ2l2ZSB0aGlzIGFkYXB0ZXIgYSBjaGFuY2UgdG8gdXNlCi0JICogdGhlIEFkYXB0ZXJGYWN0b3JlcyBmcm9tIHRoZSBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICogdG8gYWRhcHQgdGhlIG5vZGUuIEl0cyB0byBiZSB1c2VkIGJ5IEpTUEF3YXJlQWRhcHRlckZhY3RvcmllcwotCSAqIHRvIChwb3RlbnRpYWxseSkgYWRhcHQgbm9kZXMgZnJvbSB0aGUgZW1iZWRkZWQgY29udGVudCB0eXBlLgotCSAqLwotCUlOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBPYmplY3QgdHlwZSk7Ci0KLQl2b2lkIGFkZEVtYmVkZGVkRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0JLyoqCi0JICogTWV0aG9kIHNldExhbmd1YWdlLgotCSAqIEBwYXJhbSBsYW5ndWFnZQotCSAqLwotCXZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKTsKLQotCUlOb2RlTm90aWZpZXIgZ2V0VGFyZ2V0KCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDcwN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgYWRhcHRzIGRvY3VtZW50IAotICogd2l0aCB0aGUgYW4gaW5zdGFuY2Ugb2YgUGFnZURpcmVjdGl2ZUFkYXB0ZXIKLSAqLwotcHVibGljIGNsYXNzIFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCi0JcHJpdmF0ZSBQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkuCi0JICogTm90ZTogaXRzIGltcG9ydGFudCBub3QgdG8gYmUgYSBzaW5nbGV0b24sIHNpbmNlCi0JICogdGhpcyBmYWN0b3J5IG5lZWRzIHRvIHRyYWNrIGl0cyBhZGFwdGVyKHMpIGFuZCByZWxlYXNlCi0JICogdGhlbSB3aGVuIHRoZXkgYXJlIHJlbGVhc2VkLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKi8KLQlwcm90ZWN0ZWQgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIG5vIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGFzc3VtZXMgaXRzIGEgCi0JICogRmFjdG9yeSBmb3IgUGFnZURpcmVjdGl2ZUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5KCkgewotCQl0aGlzKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSB0YXJnZXQ7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCXJlc3VsdCA9IGdldEFkYXB0ZXJJbnN0YW5jZSh0YXJnZXQpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAocGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFdlIGFzc3VtZSB0aGlzIGlzIG9ubHkgY2FsbGVkIGZvciAnZG9jdW1lbnQnIHRhcmdldAotCSAqLwotCXByb3RlY3RlZCBQYWdlRGlyZWN0aXZlQWRhcHRlciBnZXRBZGFwdGVySW5zdGFuY2UoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJLy8gaWYgb3VyIGluc3RhbmNlIGFscmVhZHkgZXhpc3RzIHdpdGggYSBkaWZmZXJlbnQKLQkJLy8gdGFyZ2V0LCB0aGVuLCBzb21laG93LCB0aGUgZG9jdW1lbnQgbm9kZSBtdXN0IAotCQkvLyBoYXZlIGNoYW5nZWQgZm9yIGEgbW9kZWwsIHNvIHdlIHNob3VsZCByZWxlYXNlIAotCQkvLyBvbGQgYWRhcHRlciBhbmQgY3JlYXRlIG5ldyBvbmUgZm9yIG5ldyBkb2N1bWVudCAKLQkJLy8gbm9kZS4gVGhpcyBpcyBwcm9iYWJseSBhIHByb2dyYW1taW5nIGVycm9yLgotCQlpZiAocGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSAhPSBudWxsKSB7Ci0JCQlpZiAodGFyZ2V0ICE9IHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UuZ2V0VGFyZ2V0KCkpIHsKLQkJCQlyZWxlYXNlKCk7Ci0JCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSA9IG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwodGFyZ2V0KTsKLQkJCX0KLQkJCS8vIGVsc2UgcmV0dXJuIHRoZSBvbmUgd2UgaGF2ZQotCQl9Ci0JCWVsc2UgewotCQkJLy8gaWYgaXMgZXF1YWwgdG8gbnVsbCwgY3JlYXRlIGEgbmV3IG9uZQotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXJJbnN0YW5jZSA9IG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwodGFyZ2V0KTsKLQkJfQotCQlBc3NlcnQuaXNOb3ROdWxsKHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2UsICJwYWdlRGlwYWdlRGlyZWN0aXZlQWRhcHRlckluc3RhbmNlIHdhcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHBhZ2VEaXJlY3RpdmVBZGFwdGVySW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQotCQlyZXR1cm4gbmV3IFBhZ2VEaXJlY3RpdmVBZGFwdGVyRmFjdG9yeShnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEzODNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlU3RhdGVEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUZhbWlseUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRG9jdW1lbnRJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBoYXMgdGhlIHJlc3BvbnNpYmlsaXR5IHRvIHByb3ZpZGUgYW4gZW1iZWRkZWQgZmFjdG9yeSByZWdpc3RyeQotICogZm9yIEpTUCBBd2FyZSBJTm9kZUFkYXB0ZXIgRmFjdG9yaWVzIHRvIHVzZS4KLSAqIAotICogVHlwaWNhbGx5LCB0aGUgZW1iZWRkZWQgdHlwZSBpcyB0byBiZSBjb25zaWRlcmVkIGEgZmVhdHVyZSBvZiB0aGUgZG9jdW1lbnQsCi0gKiBzbyBKU1AgQXdhcmUgQWRwYXRlckZhY3RvcmllcyBzaG91bGQgY2FsbAotICogZ2V0QWRhcHRlcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcykgZGlyZWN0b3kgb24gdGhlIGRvY3VtZW50IChvciBvd25pbmcKLSAqIGRvY3VtZW50KSBub2RlLgotICovCi1wdWJsaWMgY2xhc3MgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsIGltcGxlbWVudHMgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSX0NIQVJTRVQgPSAiY2hhcnNldCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBPYmplY3QgYWRhcHRlclR5cGUgPSBQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzczsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWw7Ci0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUyA9IG5ldyBTdHJpbmdbXXsiamF2YXNjcmlwdCIsICJqYXZhc2NyaXB0MS4wIiwgImphdmFzY3JpcHQxLjFfMyIsICJqYXZhc2NyaXB0MS4yIiwgImphdmFzY3JpcHQxLjMiLCAiamF2YXNjcmlwdDEuNCIsICJqYXZhc2NyaXB0MS41IiwgImphdmFzY3JpcHQxLjYiLCAianNjcmlwdCIsICJzYXNoc2NyaXB0In07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZ1tdIEpBVkFfTEFOR1VBR0VfS0VZUyA9IG5ldyBTdHJpbmdbXXsiamF2YSJ9OyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsLgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJbm90aWZpZXJBdENyZWF0aW9uID0gdGFyZ2V0OwotCQkvLyB3ZSBuZWVkIHRvIHJlbWVtYmVyIG91ciBpbnN0YW5jZSBvZiBtb2RlbCwKLQkJLy8gaW4gY2FzZSB3ZSBuZWVkIHRvICJzaWduYWwiIGEgcmUtaW5pdCBuZWVkZWQuCi0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIHBhcnNlcyB0aGUgZnVsbCBjb250ZW50VHlwZSB2YWx1ZSBpbnRvIGl0cyB0d28gcGFydHMgdGhlIGNvbnRlbnRUeXBlLAotCSAqIGFuZCB0aGUgY2hhcnNldCwgaWYgcHJlc2VudC4gTm90ZTogdGhpcyBtZXRob2QgaXMgYSBsaWdodGx5IG1vZGlmaWVkCi0JICogdmVyc2lvbiBvZiBhIG1ldGhvZCBpbiBBYnN0cmFjdEhlYWRQYXJzZXIuIFRoZXJlLCB3ZSdyZSBtb3N0bHkKLQkgKiBpbnRlcmVzdGVkIGluIHRoZSBjaGFyc2V0IHBhcnQgb2YgY29udGVudFR5cGVWYWx1ZS4gSGVyZSwgd2UncmUgbW9zdGx5Ci0JICogaW50ZXJlc3RlZCBpbiB0aGUgbWltZVR5cGUgcGFydC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRNaW1lVHlwZUZyb21Db250ZW50VHlwZVZhbHVlKFN0cmluZyBjb250ZW50VHlwZVZhbHVlKSB7Ci0JCWlmIChjb250ZW50VHlwZVZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGNsZWFuQ29udGVudFR5cGVWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwTm9uTGV0dGVyRGlnaXRzKGNvbnRlbnRUeXBlVmFsdWUpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihjbGVhbkNvbnRlbnRUeXBlVmFsdWUsICI7PSBcdFxuXHJcZiIpOyAvLyROT04tTkxTLTEkCi0JCWludCB0TGVuID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCS8vIGlmIGNvbnRhaW5zIGVuY29kaW5nIHNob3VsZCBoYXZlIHRocmVlIHRva2VucywgdGhlIG1pbWV0eXBlLCB0aGUKLQkJLy8gd29yZCAnY2hhcnNldCcsIGFuZCB0aGUgZW5jb2RpbmcgdmFsdWUKLQkJU3RyaW5nW10gdG9rZW5zID0gbmV3IFN0cmluZ1t0TGVuXTsKLQkJaW50IGogPSAwOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJdG9rZW5zW2pdID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaisrOwotCQl9Ci0JCS8vIAotCQkvLyBGb2xsb3dpbmcgaXMgdGhlIGNvbW1vbiBmb3JtIGZvciB0YXJnZXQgZXhwcmVzc2lvbgotCQkvLyA8TUVUQSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+Ci0JCS8vIEJ1dCBhcHBhcnJlbnRseSBpcyBhbHNvIHZhbGlkIHdpdGhvdXQgdGhlIGNvbnRlbnQgdHlwZSB0aGVyZSwKLQkJLy8ganVzdCB0aGUgY2hhcnNldCwgYXMgZm9sbG93czoKLQkJLy8gPE1FVEEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJjaGFyc2V0PVVURi04Ij4KLQkJLy8gU28gd2UnbGwgbG9vcCB0aHJvdWdoIHRva2VucyBhbmQga2V5IG9mZiBvZiAnY2hhcnNldCcKLQotCQlpbnQgY2hhcnNldFBvcyA9IC0xOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5lcXVhbHNJZ25vcmVDYXNlKFNUUl9DSEFSU0VUKSkgewotCQkJCWNoYXJzZXRQb3MgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIFN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJaWYgKGNoYXJzZXRQb3MgPiAtMSkgewotCQkJLy8gY2FzZSB3aGVyZSBjaGFyc2V0IHdhcyBwcmVzZW50Ci0JCQkvLyBpbnQgY2hhcnNldFZhbHVlUG9zID0gY2hhcnNldFBvcyArIDE7Ci0JCQkvLyBpZiAoY2hhcnNldFZhbHVlUG9zIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJLy8gY2hhcnNldCA9IHRva2Vuc1tjaGFyc2V0VmFsdWVQb3NdOwotCQkJLy8gfQotCQkJaW50IGNvbnRlbnRUeXBlVmFsdWVQb3MgPSBjaGFyc2V0UG9zIC0gMTsKLQkJCWlmIChjb250ZW50VHlwZVZhbHVlUG9zID4gLTEpIHsKLQkJCQljb250ZW50VHlwZSA9IHRva2Vuc1tjb250ZW50VHlwZVZhbHVlUG9zXTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGNoYXJzZXQgd2FzIG5vdCBwcmVzZW50LCBzbyBpZiB0aGVyZSdzCi0JCQkvLyBhIHZhbHVlLCB3ZSBhc3N1bWUgaXRzIHRoZSBjb250ZW50VHlwZSB2YWx1ZQotCQkJaWYgKHRva2Vucy5sZW5ndGggPiAwKSB7Ci0JCQkJY29udGVudFR5cGUgPSB0b2tlbnNbMF07Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGVIYW5kbGVyOwotCXByaXZhdGUgTGlzdCBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeSA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIFN0cmluZyBjYWNoZWRMYW5ndWFnZTsKLQlwcml2YXRlIFN0cmluZyBjYWNoZWRDb250ZW50VHlwZTsKLQlwcml2YXRlIElOb2RlTm90aWZpZXIgbm90aWZpZXJBdENyZWF0aW9uOwotCi0JcHJpdmF0ZSBpbnQgZmlyc3RMYW5ndWFnZVBvc2l0aW9uID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZmlyc3RDb250ZW50VHlwZVBvc2l0aW9uID0gLTE7Ci0KLQkvKgotCSAqIEBzZWUgSU5vZGVBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IGFkYXB0ZXJUeXBlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU5vZGVBZGFwdGVyI25vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciwgaW50LCBPYmplY3QsIE9iamVjdCwKLQkgKiAgICAgIE9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkVHlwZShFbWJlZGRlZFR5cGVIYW5kbGVyIGhhbmRsZXIpIHsKLQkJLy8gaWYgcmVhbGx5IHRoZSBzYW1lIGhhbmRsZXIsIG5vIG5lZWQgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZwotCQlpZiAoZW1iZWRkZWRUeXBlSGFuZGxlciA9PSBoYW5kbGVyKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gdGhlbiBvbmUgZXhpc3RzLCBhbmQgdGhlIG5ldyBvbmUgaXMgdHJ1ZWx5IGRpZmZlcmVudCwgc28gd2UgbmVlZCB0bwotCQkvLyByZWxlYXNlIGFuZCByZW1vdmUgY3VycmVudCBmYWN0b3JpZXMKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgbGlzdCA9IGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobGlzdC5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgbGlzdC5uZXh0KCk7Ci0JCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQl9Ci0KLQkJCWVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5LmNsZWFyKCk7Ci0JCX0KLQotCQllbWJlZGRlZFR5cGVIYW5kbGVyID0gaGFuZGxlcjsKLQkJLy8gd2hlbiB0aGUgaGFuZGxlciBpcyBzZXQsICJ0cmFuc2ZlciIgaXRzIGZhY3RvcmllcyB0byBvdXIgb3duIGxpc3QuCi0JCS8vIG5vdGU6IG91ciBvd24gbGlzdCBtYXkgYWxzbyBiZSBhZGRlZCB0byBlbHNlIHdoZXJlLCBzdWNoIGFzIG9uCi0JCS8vICJlZGl0b3Igc2lkZSIuCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZW1iZWRkZWRUeXBlSGFuZGxlci5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCWVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5LmFkZChmYWN0b3J5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIjYWRhcHQoSU5vZGVOb3RpZmllciwgT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllciwgT2JqZWN0IHR5cGUpIHsKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGlmIGVtYmVkZGVkQ29udGVudFR5cGUgaGFzbid0IGJlZW4gc2V0LAotCQkvLyB0aGVuIHdlIGNhbiBub3QgYWRhcHQgaXQuCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyICE9IG51bGwpIHsKLQkJCWlmIChlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeSAhPSBudWxsKSB7Ci0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBlbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5pdGVyYXRvcigpOwotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCQkJcmVzdWx0ID0gZmFjdG9yeS5hZGFwdChub3RpZmllcik7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBQYWdlRGlyZWN0aXZlQWRhcHRlciNnZXRFbWJlZGRlZFR5cGUoKQotCSAqLwotCXB1YmxpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZSgpIHsKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgPT0gbnVsbCkgewotCQkJZW1iZWRkZWRUeXBlSGFuZGxlciA9IGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gZW1iZWRkZWRUeXBlSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFbWJlZGRlZEZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCS8vIHNob3VsZCB3ZSBjaGVjayBpZiBhbHJlYWR5IGV4aXN0cyBpbiBsaXN0PwotCQllbWJlZGRlZEZhY3RvcnlSZWdpc3RyeS5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBVc2VkIGJ5IFBhZ2VEaXJlY3RpdmVXYXRjaGVycyB0byBzaWduYWwgdGhhdCBzb21lIGltcG9ydGFudCBhdHRyaWJ1dGUKLQkvLyBoYXMgY2hhbmdlZCwgYW5kCi0JLy8gKiBhbnkgY2FjaGVkIHZhbHVlcyBzaG91bGQgYmUgcmUtY2FsY3VhdGVkCi0JLy8gKi8KLQkvLyB2b2lkIGNoYW5nZWQoKSB7Ci0JLy8gLy8gd2Ugd29uJ3QgYWN0dWFsbHkgY2hlY2sgaWYgY2hhbmdlIGlzIG5lZWRlZCwgaWYgdGhlIG1vZGVsIHN0YXRlIGlzCi0JLy8gYWxyZWFkeSBjaGFuZ2luZy4KLQkvLyBpZiAoIW1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JLy8gLy8gZ28gdGhyb3VnaCBvdXIgbGlzdCBvZiBwYWdlIHdhdGNoZXIgYWRhcHRlcnMsIGFuZCB1cGRhdGVzIHRoZQotCS8vIGF0dHJpYnV0ZXMKLQkvLyAvLyB3ZSdyZSBpbnRlcmVzdGVkIGluLCBpZiBhbmQgb25seSBpZiB0aGV5IGFyZSB0aGUgZWFybGllc3Qgb2NjdXJhbmNlCi0JLy8gaW4gdGhlIHJlc291cmNlCi0JLy8gU3RyaW5nIHBvdGVudGlhbENvbnRlbnRUeXBlID0gbnVsbDsKLQkvLyBTdHJpbmcgcG90ZW50aWFsTGFuZ3VhZ2UgPSBudWxsOwotCS8vIGludCBjb250ZW50VHlwZVBvc2l0aW9uID0gLTE7Ci0JLy8gaW50IGxhbmd1YWdlUG9zaXRpb24gPSAtMTsKLQkvLyBJdGVyYXRvciBpdGVyYXRvciA9IHBhZ2VEaXJlY3RpdmVXYXRjaGVycy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkvLyBQYWdlRGlyZWN0aXZlV2F0Y2hlciBwZFdhdGNoZXIgPSAoUGFnZURpcmVjdGl2ZVdhdGNoZXIpCi0JLy8gaXRlcmF0b3IubmV4dCgpOwotCS8vIFN0cmluZyBjb250ZW50VHlwZSA9IHBkV2F0Y2hlci5nZXRDb250ZW50VHlwZSgpOwotCS8vIFN0cmluZyBsYW5ndWFnZSA9IHBkV2F0Y2hlci5nZXRMYW5ndWFnZSgpOwotCS8vIGludCBvZmZzZXQgPSBwZFdhdGNoZXIuZ2V0T2Zmc2V0KCk7Ci0JLy8gaWYgKHBvdGVudGlhbENvbnRlbnRUeXBlID09IG51bGwgfHwgKGhhc1ZhbHVlKGNvbnRlbnRUeXBlKSAmJiAob2Zmc2V0IDwKLQkvLyBjb250ZW50VHlwZVBvc2l0aW9uKSkpIHsKLQkvLyBwb3RlbnRpYWxDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotCS8vIGNvbnRlbnRUeXBlUG9zaXRpb24gPSBvZmZzZXQ7Ci0JLy8gfQotCS8vIH0KLQkvLyAvLyBub3cgd2UgaGF2ZSB0aGUgYmVzdCBjYW5kaWF0ZXMgZm9yIGNhY2hlZCB2YWx1ZXMsIGxldCdzIHNlZSBpZgotCS8vIHRoZXkndmUgcmVhbGx5IGNoYW5nZWQgZnJvbQotCS8vIC8vIHdoYXQgd2UgaGFkLiBJZiBzbywgbm90ZSB3ZSBnbyB0aHJvdWdoIHRoZSBzZXR0ZXJzIHNvIHNpZGUgZWZmZWN0cwotCS8vIGNhbiB0YWtlIHBsYWNlIHRoZXJlLgotCS8vIHBvdGVudGlhbENvbnRlbnRUeXBlID0KLQkvLyBnZXRNaW1lVHlwZUZyb21Db250ZW50VHlwZVZhbHVlKHBvdGVudGlhbENvbnRlbnRUeXBlKTsKLQkvLyBpZiAocG90ZW50aWFsQ29udGVudFR5cGUgPT0gbnVsbCB8fCBwb3RlbnRpYWxDb250ZW50VHlwZS5sZW5ndGgoKSA9PSAwKQotCS8vIHsKLQkvLyAvL3BvdGVudGlhbENvbnRlbnRUeXBlID0gZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCk7Ci0JLy8gfSBlbHNlIHsKLQkvLyBzZXRDYWNoZWRDb250ZW50VHlwZShwb3RlbnRpYWxDb250ZW50VHlwZSk7Ci0JLy8gfQotCS8vCi0JLy8gaWYgKHBvdGVudGlhbExhbmd1YWdlICE9IG51bGwgJiYgaGFzVmFsdWUocG90ZW50aWFsTGFuZ3VhZ2UpKSB7Ci0JLy8gc2V0Q2FjaGVkTGFuZ3VhZ2UocG90ZW50aWFsTGFuZ3VhZ2UpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCXZvaWQgY2hhbmdlZENvbnRlbnRUeXBlKGludCBlbGVtZW50T2Zmc2V0LCBTdHJpbmcgbmV3VmFsdWUpIHsKLQkJLy8gb25seSBuZWVkIHRvIHByb2Nlc3MgaWYgdGhpcyBuZXcgdmFsdWUgaXMKLQkJLy8gZWFybGllciBpbiB0aGUgZmlsZSB0aGFuIG91ciBjdXJyZW50IHZhbHVlCi0JCWlmIChmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24gPT0gLTEgfHwgZWxlbWVudE9mZnNldCA8PSBmaXJzdENvbnRlbnRUeXBlUG9zaXRpb24pIHsKLQkJCS8vIGR3X1RPRE86IHVwZGF0ZSBlbWJlZGRlZCBwYXJ0aXRpb25lciBpbiBKU1AgZG9jdW1lbnQKLQkJCS8vIHBhcnRpdGlvbmVyCi0JCQkvLyBuc2RfVE9ETzogdXBkYXRlIGVtYmVkZGVkIHBhcnRpdGlvbmVyIGluIEpTUCBkb2N1bWVudAotCQkJLy8gcGFydGl0aW9uZXIKLQotCQkJLy8gbm8gbmVlZCB0byBjaGFuZ2UgY3VycmVudCB2YWx1ZSwgaWYgd2UncmUgdG9sZCBzb21lCi0JCQkvLyBlYXJsaWVyIHZhbHVlIGlzIG51bGwgb3IgYmxhbmsgKHNvdW5kcyBsaWtlIGFuIGVycm9yLCBhbnl3YXkpCi0JCQlpZiAoaGFzVmFsdWUobmV3VmFsdWUpKSB7Ci0JCQkJZmlyc3RDb250ZW50VHlwZVBvc2l0aW9uID0gZWxlbWVudE9mZnNldDsKLQkJCQlTdHJpbmcgcG90ZW50aWFsQ29udGVudFR5cGUgPSBnZXRNaW1lVHlwZUZyb21Db250ZW50VHlwZVZhbHVlKG5ld1ZhbHVlKTsKLQkJCQkvLyBvbmx5IGRvIHRoZSBzZXQgcHJvY2Vzc2luZyBpZiBkaWZmZXJlbnQKLQkJCQkvLyBmcm9tIHdoYXQgaXQgYWxyZWFkeSBpcwotCQkJCS8vIGlmICghcG90ZW50aWFsQ29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShjYWNoZWRMYW5ndWFnZSkpCi0JCQkJLy8gewotCQkJCXNldENhY2hlZENvbnRlbnRUeXBlKHBvdGVudGlhbENvbnRlbnRUeXBlKTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IFBhZ2VEaXJlY3RpdmVXYXRjaGVycyB0byBzaWduYWwgdGhhdCBzb21lIGltcG9ydGFudCBhdHRyaWJ1dGUKLQkgKiBoYXMgY2hhbmdlZCwgYW5kIGFueSBjYWNoZWQgdmFsdWVzIHNob3VsZCBiZSByZS1jYWxjdWF0ZWQKLQkgKi8KLQl2b2lkIGNoYW5nZWRMYW5ndWFnZShpbnQgZWxlbWVudE9mZnNldCwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCS8vIG9ubHkgbmVlZCB0byBwcm9jZXNzIGlmIHRoaXMgbmV3IHZhbHVlIGlzCi0JCS8vIGVhcmxpZXIgaW4gdGhlIGZpbGUgdGhhbiBvdXIgY3VycmVudCB2YWx1ZQotCQkvLyBoYXMgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvLCBpbiBjYXNlIG91ciBwcmV2aW91cyBlYXJsaWVzdCBvbmUsCi0JCS8vIGlzIGl0c2VsZiBjaGFuZ2luZyEKLQkJaWYgKGZpcnN0TGFuZ3VhZ2VQb3NpdGlvbiA9PSAtMSB8fCBlbGVtZW50T2Zmc2V0IDw9IGZpcnN0TGFuZ3VhZ2VQb3NpdGlvbikgewotCi0JCQkvLyBubyBuZWVkIHRvIGNoYW5nZSBjdXJyZW50IHZhbHVlLCBpZiB3ZSdyZSB0b2xkIHNvbWUKLQkJCS8vIGVhcmxpZXIgdmFsdWUgaXMgbnVsbCBvciBibGFuayAoc291bmRzIGxpa2UgYW4gZXJyb3IsIGFueXdheSkKLQkJCWlmIChoYXNWYWx1ZShuZXdWYWx1ZSkpIHsKLQkJCQlmaXJzdExhbmd1YWdlUG9zaXRpb24gPSBlbGVtZW50T2Zmc2V0OwotCQkJCS8vIG9ubHkgZG8gdGhlIHNldCBwcm9jZXNzaW5nIGlmIGRpZmZlcmVudAotCQkJCS8vIGZyb20gd2hhdCBpdCBhbHJlYWR5IGlzCi0JCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKGNhY2hlZExhbmd1YWdlKSkgewotCQkJCQlzZXRDYWNoZWRMYW5ndWFnZShuZXdWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBkd19UT0RPOiBzZXQgbGFuZ3VhZ2UgaW4gZG9jdW1lbnQgcGFydGl0aW9uZXIKLQkJCS8vIG5zZF9UT0RPOiBzZXQgbGFuZ3VhZ2UgaW4gZG9jdW1lbnQgcGFydGl0aW9uZXIKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgYnkgUGFnZURpcmVjdGl2ZVdhdGNoZXJzIHRvIHNpZ25hbCB0aGF0IHNvbWUgaW1wb3J0YW50IGF0dHJpYnV0ZQotCSAqIGhhcyBjaGFuZ2VkLCBhbmQgYW55IGNhY2hlZCB2YWx1ZXMgc2hvdWxkIGJlIHJlLWNhbGN1YXRlZAotCSAqLwotCXZvaWQgY2hhbmdlZFBhZ2VFbmNvZGluZyhpbnQgZWxlbWVudE9mZnNldCwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0KLQkJLy8gd2UgZG9uJ3QgY3VycmVudGx5IHRyYWNrIGFjdGl2ZSB2YWx1ZSwgc2luY2UKLQkJLy8ganVzdCBuZWVkIGR1cmluZyByZWFkIGFuZCB3cml0ZSAod2hlcmUgaXRzCi0JCS8vIGNhbGN1bGF0ZWQuIFdlIHdpbGwgbmVlZCBpbiBmdXR1cmUsIHRvCi0JCS8vIGFjdXJhdGVseSBjbG9uZSBhIG1vZGVsIGFuZCB0byBkaXNwbGF5Ci0JCS8vICJjdXJyZW50IGVuY29kaW5nIiB0byB1c2VyIGluIHN0YXR1cyBiYXIuCi0JfQotCi0JLyoqCi0JICogTWV0aG9kIGhhc1ZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjYWNoZWRDb250ZW50VHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCWlmIChjYWNoZWRDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljYWNoZWRDb250ZW50VHlwZSA9IGdldERlZmF1bHRDb250ZW50VHlwZSgpOwotCQl9Ci0JCXJldHVybiBjYWNoZWRDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RGVmYXVsdENvbnRlbnRUeXBlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGVmYXVsdENvbnRlbnRUeXBlKCkgewotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJdHlwZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIGZpbGUsIHRydWUpOwotCQl9Ci0JCS8vIEJVRzEzNjQ2OAotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJdHlwZSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiB0eXBlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNhY2hlZExhbmd1YWdlLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKLQkJaWYgKGNhY2hlZExhbmd1YWdlID09IG51bGwpCi0JCQljYWNoZWRMYW5ndWFnZSA9IGdldERlZmF1bHRMYW5ndWFnZSgpOwotCQlyZXR1cm4gY2FjaGVkTGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHRMYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRMYW5ndWFnZSgpIHsKLQkJU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUobW9kZWwpOwotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlsYW5ndWFnZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIGZpbGUsIHRydWUpOwotCQl9Ci0JCS8vIEJVRzEzNjQ2OAotCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCkKLQkJCWxhbmd1YWdlID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBsYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjYWNoZWRDb250ZW50VHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gY2FjaGVkQ29udGVudFR5cGUKLQkgKiAgICAgICAgICAgIFRoZSBjYWNoZWRDb250ZW50VHlwZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWRDb250ZW50VHlwZShTdHJpbmcgbmV3Q29udGVudFR5cGUpIHsKLQkJLyoKLQkJICogaWYgdGhlIHBhc3NlZCBpbiB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBleGlzdGluZywgdGhlcmUncyBub3RoaW5nIHRvCi0JCSAqIGRvLiBpZiBpdHMgZGlmZmVyZW50LCB0aGVuIHdlIG5lZWQgdG8gY2hhbmdlIHRoZSBjb250ZW50SGFuZGxlciBhcwotCQkgKiB3ZWxsIGFuZCwgbW9yZSB0byB0aGUgcG9pbnQsIHNpZ25hbCBhIHJlLWluaXRpYWxpenRhdGlvbiBpcyBuZWVkZWQuCi0JCSAqIAotCQkgKiBOb3RlOiBpZiB0aGUgdmFsdWUgd2UncmUgZ2V0dGluZyBzZXQgdG8gZG9lcyBub3QgaGF2ZSBhIGhhbmRsZXIgaW4KLQkJICogdGhlIHJlZ2lzdHJ5LCB3ZSdsbCBhY3R1YWxseSBub3Qgc2V0IGl0IHRvIG51bGwgb3IgYW55dGhpbmcsIHdlJ2xsCi0JCSAqIGp1c3QgY29udGludWUgb24gd2l0aCB0aGUgb25lIHdlIGhhdmUuIFRoaXMgaXMgcHJldHR5IGltcG9ydGFudCB0bwotCQkgKiBhdm9pZCByZS1pbml0aWFsaXppbmcgb24gZXZlcnkga2V5IHN0cm9rZSBpZiBzb21lb25lIGlzIHR5cGluZyBpbiBhCi0JCSAqIG5ldyBjb250ZW50IHR5cGUsIGJ1dCBoYXZlbid0IHlldCBmaW5pc2hlZCB0aGUgd2hvbGUgIndvcmQiLgotCQkgKiBIb3dldmVyLCBpZiBhbiBjb250ZW50VHlwZSBpcyBub3QgcmVjb2duaXplZCwgdGhlIHJlZ2lzdHJ5IHJldHVybnMKLQkJICogdGhlIG9uZSBmb3IgWE1MLgotCQkgKi8KLQkJCi0JCS8qIHNldCB0aGUgYWN0dWFsIHZhbHVlIGZpcnN0LCB0aGUgcmVzdCBpcyAic2lkZSBlZmZlY3QiICovCi0JCXRoaXMuY2FjaGVkQ29udGVudFR5cGUgPSBuZXdDb250ZW50VHlwZTsKLQotCQkvKiBzZWUgaWYgd2UgbmVlZCB0byB1cGRhdGUgZW1iZWRkZWQgaGFuZGxlciAqLwotCi0JCS8qCi0JCSAqIElmIHRoZSBkb2N1bWVudCBpcyBhIHR5cGUgb2YgWEhUTUwsIHdlIGRvIG5vdCB1c2UgdGhlIHBhZ2UKLQkJICogZGlyZWN0aXZlJ3MgY29udGVudFR5cGUgdG8gZGV0ZXJtaW5lIHRoZSBlbWJlZGRlZCB0eXBlIC4uLiBpdHMKLQkJICogWEhUTUwhIC4uLiBhbmQsIGV2ZW50dWFsbHksIHRoZSBET0NUWVBFIGFkYXB0ZXIgc2hvdWxkIGRldGVybWluZQotCQkgKiBpZi93aGVuIGl0IG5lZWRzIHRvIGNoYW5nZS4KLQkJICovCi0KLQkJLyoganVzdCBzYWZldHkgY2hlY2ssIGNhbiBiZSByZW1vdmVkIGxhdGVyLCBlYXJseSBpbiByZWxlYXNlIGN5Y2xlICovCi0JCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkvLyB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm1vZGVsIHNob3VsZCBuZXZlciBiZSBudWxsIGluCi0JCQkvLyBQYWdlRGlyZWN0aXZlIEFkYXB0ZXIiKTsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAibW9kZWwgc2hvdWxkIG5ldmVyIGJlIG51bGwgaW4gUGFnZURpcmVjdGl2ZSBBZGFwdGVyIik7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIHBvdGVudGlhbE5ld2FuZGxlciA9IG51bGw7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZ2V0Q29udGVudERlc2NyaXB0aW9uKG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJT2JqZWN0IHByb3AgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX0ZBTUlMWV9BVFRSSUJVVEUpOwotCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQlpZiAoQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLkhUTUxfRkFNSUxZLmVxdWFscyhwcm9wKSkgewotCQkJCXBvdGVudGlhbE5ld2FuZGxlciA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3IoInRleHQvaHRtbCIpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBvdGVudGlhbE5ld2FuZGxlciA9PSBudWxsKSB7Ci0JCQkvKgotCQkJICogZ2V0SGFuZGxlciBzaG91bGQgYWx3YXlzIHJldHVybiBzb21ldGhpbmcgKG5ldmVyIG51bGwpLCBiYXNlZAotCQkJICogb24gdGhlIHJ1bGVzIGluIHRoZSBmYWN0b3J5LgotCQkJICovCi0JCQlwb3RlbnRpYWxOZXdhbmRsZXIgPSBnZXRIYW5kbGVyRm9yKHRoaXMuY2FjaGVkQ29udGVudFR5cGUpOwotCQl9Ci0JCS8qCi0JCSAqIHdlIGRvIHRoaXMgY2hlY2sgZm9yIHJlLWluaXQgaGVyZSwgaW5zdGVhZCBvZiBpbiBzZXRFbWJlZGRlZFR5cGUsCi0JCSAqIHNpbmNlIHNldEVtYmVkZGVkVHlwZSBpcyBjYWxsZWQgZHVyaW5nIHRoZSBub3JtYWwgaW5pdGlhbGl6dGlvbgotCQkgKiBwcm9jZXNzLCB3aGVuIHJlLWluaXQgaXMgbm90IG5lZWRlZCAoc2luY2UgdGhlcmUgaXMgbm8gY29udGVudCkKLQkJICovCi0JCWlmIChlbWJlZGRlZFR5cGVIYW5kbGVyID09IG51bGwpIHsKLQkJCXNldEVtYmVkZGVkVHlwZShwb3RlbnRpYWxOZXdhbmRsZXIpOwotCQl9Ci0JCWVsc2UgaWYgKHBvdGVudGlhbE5ld2FuZGxlciAhPSBudWxsICYmIGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gcG90ZW50aWFsTmV3YW5kbGVyKSB7Ci0JCQkvKgotCQkJICogY2hhbmdpbmcgdGhpcyBlbWJlZGRlZCBoYW5kbGVyIGhlcmUgbWF5IGJlIGluIHRoZSBtaWRkbGUgb2YgYQotCQkJICogbm90aWZ5IGxvb3AuIFRoYXQncyB3aHkgd2Ugc2V0IHRoYXQgIml0J3MgbmVlZGVkIi4gVGhlbiB0aGUKLQkJCSAqIG1vZGVsIGRlY2lkZXMgd2hlbiBpdHMgInNhZmUiIHRvIGFjdHVhbGx5IGRvIHRoZSByZS1pbml0LgotCQkJICogCi0JCQkgKiBiZSBzdXJlIHRvIGhvbGQgb2xkSGFuZGxlciBpbiB0ZW1wIHZhciBvciBlbHNlIHNldEVtYmVkZGVkVHlwZQotCQkJICogd2lsbCAicmVzZXQiIGl0IGJlZm9yZSBtb2RlbFJlaW5pdE5lZWRlZChvbGRIYW5kbGVyLCBoYW5kbGVyKQotCQkJICogaXMgY2FsbGVkCi0JCQkgKiAKLQkJCSAqLwotCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyID0gZW1iZWRkZWRUeXBlSGFuZGxlcjsKLQkJCXNldEVtYmVkZGVkVHlwZShwb3RlbnRpYWxOZXdhbmRsZXIpOwotCQkJbW9kZWxSZWluaXROZWVkZWQob2xkSGFuZGxlciwgcG90ZW50aWFsTmV3YW5kbGVyKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byByZS1pbml0IGJhc2VkIG9uIGVtYmVkZGVkVHlwZUhhbmRsZXIgY2hhbmdpbmcuCi0JICogSXQgaXMgZ2l2ZW4gcHJpb3JpdHkgb3ZlciB0aGUgbGFuZ3VhZ2UgY2hhbmdlLCBzaW5jZSB0aGVyZSBpdHMgbW9yZQotCSAqIGltcG9ydGFudCB0byBoYXZlIG9sZCBhbmQgbmV3IGhhbmRsZXJzJ3MgaW4gdGhlIHN0YXRlRGF0YSBmaWVsZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbW9kZWxSZWluaXROZWVkZWQoRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIpIHsKLQkJaWYgKG1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImFscmVhZHkgYmVpbmcgaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdHJ5IHsKLQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKG5ldyBFbWJlZGRlZFR5cGVTdGF0ZURhdGEob2xkSGFuZGxlciwgbmV3SGFuZGxlcikpOwotCQkJbW9kZWwuc2V0UmVpbml0aWFsaXplTmVlZGVkKHRydWUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgbW9kZWxSZWluaXROZWVkZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIG1vZGVsUmVpbml0TmVlZGVkKFN0cmluZyBvbGRsYW5ndWFnZSwgU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCS8vIGJpdCBvZiBhIHNob3J0IGN1dCBmb3Igbm93IC4uLi4gd2UgZG9udCcgbmVlZCBsYW5ndWFnZSBhdCB0aGUKLQkJLy8gbW9tZW50LAotCQkvLyBidXQgc2hvdWxkIHNldCB0aGUgc3RhdGUgZGF0YQotCQlpZiAobW9kZWwuaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFscmVhZHkgYmVpbmcgaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQkvLyBpZiBhbHJlYWR5IGJlaW5nIHJlLWluaXRpYWxpemVkLCB3ZSBkb24ndCB3YW50IHRvCi0JCQkJLy8gcmVzZXQgdGhlIGRhdGEgaW4gdGhlIHN0YXRlRGF0YSBmaWVsZC4KLQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCQltb2RlbC5zZXRSZWluaXRpYWxpemVTdGF0ZURhdGEobmV3TGFuZ3VhZ2UpOwotCQkJCW1vZGVsLnNldFJlaW5pdGlhbGl6ZU5lZWRlZCh0cnVlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2FjaGVkTGFuZ3VhZ2UoU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCWlmIChjYWNoZWRMYW5ndWFnZSAhPSBudWxsICYmIGxhbmd1YWdlU3RhdGVDaGFuZ2VkKGNhY2hlZExhbmd1YWdlLCBuZXdMYW5ndWFnZSkpIHsKLQkJCS8qCi0JCQkgKiBhIGNvbXBsZXRlIHJlLWluaXQgb3ZlcmtpbGwgaW4gY3VycmVudCBzeXN0ZW0sIHNpbmNlIHJlYWxseQotCQkJICoganVzdCBuZWVkIGZvciB0aGUgbGluZSBzdHlsZSBwcm92aWRlcnMsIEJVVCwgYSBjaGFuZ2UgaW4KLQkJCSAqIGxhbmd1YWdlIGNvdWxkIGVmZmVjdCBvdGhlciB0aGluZ3MsIGFuZCB3ZSBkb24ndCBleHBlY3QgdG8KLQkJCSAqIGhhcHBlbiBvZnRlbiBzbyBhIGxpdHRsZSBvdmVya2lsbCBpc24ndCB0b28gYmFkLiBUaGUgZGVlcAotCQkJICogcHJvYmxlbSBpcyB0aGF0IHRoZXJlIGlzIG5vIHdheSB0byBnZXQgYXQgdGhlICJlZGl0IHNpZGUiCi0JCQkgKiBhZHBhcHRlcnMgc3BlY2lmaWNhbGx5IGhlcmUgaW4gbW9kZWwgY2xhc3MuIHdlIGhhdmUgdG8gZG8gdGhlCi0JCQkgKiBtb2RlbCBjaGFuZ2VkIHNlcXVlbmNlIHRvIGdldCB0aGUgc2NyZWVuIHRvIHVwZGF0ZS4gZG8gbm90Ci0JCQkgKiBzaWduYWwgYWdhaW4sIGlmIHNpZ25hbGVkIG9uY2UgKHRoZSByZWluaXQgc3RhdGUgZGF0YSB3aWxsIGJlCi0JCQkgKiB3cm9uZy4gKHRoaXMgbmVlZHMgdG8gYmUgaW1wcm92ZWQgaW4gZnV0dXJlKQotCQkJICovCi0JCQlpZiAoIW1vZGVsLmlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpKSB7Ci0JCQkJbW9kZWxSZWluaXROZWVkZWQoY2FjaGVkTGFuZ3VhZ2UsIG5ld0xhbmd1YWdlKTsKLQkJCX0KLQkJfQotCQlzZXRMYW5ndWFnZShuZXdMYW5ndWFnZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBwdWJsaWMgYWNjZXNzIG1ldGhvZCwgdXNlZCBlc3BlY2lhbGx5IGZyb20gbG9hZGVyLCBmb3IgSlNQCi0JICogRnJhZ21lbnQgc3VwcG9ydC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJdGhpcy5jYWNoZWRMYW5ndWFnZSA9IG5ld0xhbmd1YWdlOwotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpLmdldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyk7Ci0JCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1ApIHsKLQkJCSgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgcGFydGl0aW9uZXIpLnNldExhbmd1YWdlKG5ld0xhbmd1YWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBsYW5ndWFnZVN0YXRlQ2hhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBjYWNoZWRMYW5ndWFnZQotCSAqIEBwYXJhbSBuZXdMYW5ndWFnZQotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBsYW5ndWFnZVN0YXRlQ2hhbmdlZChTdHJpbmcgY2FjaGVkTGFuZ3VhZ2UsIFN0cmluZyBuZXdMYW5ndWFnZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOyAvLyBsYW5ndWFnZXMgYXJlIGVxdWFsLCB0aGVuIG5vIGNoYW5nZSBpbgotCQkvLyBzdGF0ZQotCQlpZiAoIWNhY2hlZExhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UobmV3TGFuZ3VhZ2UpKSB7Ci0JCQlib29sZWFuIG9sZExhbmd1YWdlS25vd24gPSBsYW5ndWFnZUtub3duKGNhY2hlZExhbmd1YWdlKTsKLQkJCWJvb2xlYW4gbmV3TGFuZ3VhZ2VLbm93biA9IGxhbmd1YWdlS25vd24obmV3TGFuZ3VhZ2UpOwotCQkJcmVzdWx0ID0gbmV3TGFuZ3VhZ2VLbm93biB8fCAoIW5ld0xhbmd1YWdlS25vd24gJiYgb2xkTGFuZ3VhZ2VLbm93bik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgbGFuZ3VhZ2VLbm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gY2FjaGVkTGFuZ3VhZ2UKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbGFuZ3VhZ2VLbm93bihTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJcmV0dXJuIChTdHJpbmdVdGlscy5jb250YWlucyhKQVZBX0xBTkdVQUdFX0tFWVMsIGxhbmd1YWdlLCBmYWxzZSkgfHwgU3RyaW5nVXRpbHMuY29udGFpbnMoSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTLCBsYW5ndWFnZSwgZmFsc2UpKTsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKGxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRIYW5kbGVyRm9yKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlFbWJlZGRlZFR5cGVSZWdpc3RyeSByZWcgPSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKTsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJaWYgKHJlZyAhPSBudWxsKQotCQkJaGFuZGxlciA9IHJlZy5nZXRUeXBlRm9yKGNvbnRlbnRUeXBlKTsKLQkJcmV0dXJuIGhhbmRsZXI7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeQotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogRm9yIEpTUCBmaWxlcywgdGV4dC9odG1sIGlzIHRoZSBkZWZhdWx0IGNvbnRlbnQgdHlwZS4gVGhpcyBtYXkgd2FudAotCSAqIHRoaXMgZGlmZmVyZW50IGZvciB0eXBlcyBsaWtlIGpzdiAoanNwIGZvciB2b2ljZSB4bWwpIEZvciBub3csIGhhcmQKLQkgKiBjb2RlIHRvIG5ldyBpbnN0YW5jZS4gSW4gZnV0dXJlLCBzaG91bGQgZ2V0IGluc3RhbmNlIGZyb20gcmVnaXN0cnkuCi0JICogCi0JICogU3BlY2lmaWNhdGlvbiBjaXRlcyBIVE1MIGFzIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXByb3RlY3RlZCBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRIYW5kbGVyRm9yKGdldERlZmF1bHRDb250ZW50VHlwZSgpKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVOb3RpZmllciBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiBub3RpZmllckF0Q3JlYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGVtYmVkZGVkVHlwZUhhbmRsZXIgIT0gbnVsbCkgewotCQkJaWYgKGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5ICE9IG51bGwpIHsKLQkJCQlJdGVyYXRvciBpdGVyYXRvciA9IGVtYmVkZGVkRmFjdG9yeVJlZ2lzdHJ5Lml0ZXJhdG9yKCk7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCWZhY3RvcnkgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBwYV9UT0RPOiBwb3NzaWJseSBuZWVkIHRvIHJlbGVhc2UgaGVyZS4uLgotCQkJLy8gb3IgInVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeSIKLQkJCS8vIGluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkgd2FzIGNhbGxlZCBmcm9tIEpTUE1vZGVsTG9hZGVyCi0JCQllbWJlZGRlZFR5cGVIYW5kbGVyID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oSURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRJbnB1dFN0cmVhbSBpbiA9IG5ldyBEb2N1bWVudElucHV0U3RyZWFtKGRvYyk7Ci0JCXJldHVybiBnZXRDb250ZW50RGVzY3JpcHRpb24oaW4pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29udGVudCBkZXNjcmlwdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIEFzc3VtZXMgaXQncyBKU1AKLQkgKiBjb250ZW50LiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbSB3aGVuIGZpbmlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqIEByZXR1cm4gdGhlIElDb250ZW50RGVzY3JpcHRpb24gZm9yIGluLCBvciBudWxsIGlmIGluIGlzIG51bGwKLQkgKi8KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKERvY3VtZW50SW5wdXRTdHJlYW0gaW4pIHsKLQotCQlpZiAoaW4gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IG51bGw7Ci0JCXRyeSB7Ci0KLQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQkJZGVzYyA9IGNvbnRlbnRUeXBlSlNQLmdldERlc2NyaXB0aW9uRm9yKGluLCBJQ29udGVudERlc2NyaXB0aW9uLkFMTCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkZXNjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMzcwMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi1pbnRlcmZhY2UgUGFnZURpcmVjdGl2ZVdhdGNoZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0TGFuZ3VhZ2UoKTsKLQotCWludCBnZXRPZmZzZXQoKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1BhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTdkZjgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeSBleHRlbmRzIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsIGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5LgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkoKSB7Ci0JCXRoaXMoUGFnZURpcmVjdGl2ZVdhdGNoZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlV2F0Y2hlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJUGFnZURpcmVjdGl2ZVdhdGNoZXIgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQlJRE9NRWxlbWVudCB4bWxFbGVtZW50ID0gKElET01FbGVtZW50KSB0YXJnZXQ7Ci0JCQlpZiAoeG1sRWxlbWVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0geG1sRWxlbWVudC5nZXROb2RlTmFtZSgpOwotCQkJCWlmIChub2RlTmFtZS5lcXVhbHMoImpzcDpkaXJlY3RpdmUucGFnZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmVzdWx0ID0gbmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbCh4bWxFbGVtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi1wdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IFBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeShnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmYzIxOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9QYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BdHRySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLQotCi0vKiogCi0gKiBUaGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBjbGFzcyBpcyB0byBtb25pdG9yIHBhZ2UgZGlyZWN0aXZlcyBhbmQgaWYgCi0gKiBhIGNoYW5nZSBpbiBlbWJlZGRlZCB0eXBlIGlzIGlzIG1hZGUsIGl0IHdpbGwgc2lnbmFsIAotICogdGhlIHN0cnVjdHVyZWRNb2RlbCB0aGF0IGl0IG5lZWRzIHRvIHJlaW5pdGlhbGl6ZSBpdHNlbGYuCi0gKi8KLWNsYXNzIFBhZ2VEaXJlY3RpdmVXYXRjaGVySW1wbCBpbXBsZW1lbnRzIFBhZ2VEaXJlY3RpdmVXYXRjaGVyIHsKLQotCXByaXZhdGUgc3RhdGljIE9iamVjdCBhZGFwdGVyVHlwZSA9IFBhZ2VEaXJlY3RpdmVXYXRjaGVyLmNsYXNzOwotCUlET01FbGVtZW50IHRhcmdldEVsZW1lbnQ7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgUGFnZURpcmVjdGl2ZVdhdGNoZXJJbXBsLgotCSAqLwotCXB1YmxpYyBQYWdlRGlyZWN0aXZlV2F0Y2hlckltcGwoSURPTUVsZW1lbnQgdGFyZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCXRhcmdldEVsZW1lbnQgPSB0YXJnZXQ7Ci0JCVN0cmluZyBjb250ZW50VHlwZVZhbHVlID0gdGFyZ2V0LmdldEF0dHJpYnV0ZSgiY29udGVudFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQkvLyB1c2luZyBjb25jcmV0ZSBjbGFzcyBiZWxvdywgc2luY2UgImNoYW5nZWQiIGlzIHNvbWV0aGluZyBvZiBhbiBpbnRlcm5hbCBtZXRob2QKLQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVySW1wbCBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwpICgoSURPTURvY3VtZW50KSB0YXJnZXRFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5jaGFuZ2VkQ29udGVudFR5cGUoKChJbmRleGVkUmVnaW9uKSB0YXJnZXRFbGVtZW50KS5nZXRTdGFydE9mZnNldCgpLCBjb250ZW50VHlwZVZhbHVlKTsKLQkJfQotCQlTdHJpbmcgbGFuZ3VhZ2VWYWx1ZSA9IHRhcmdldC5nZXRBdHRyaWJ1dGUoImxhbmd1YWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGxhbmd1YWdlVmFsdWUgIT0gbnVsbCkgewotCQkJLy8gdXNpbmcgY29uY3JldGUgY2xhc3MgYmVsb3csIHNpbmNlICJjaGFuZ2VkIiBpcyBzb21ldGhpbmcgb2YgYW4gaW50ZXJuYWwgbWV0aG9kCi0JCQlQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKSAoKElET01Eb2N1bWVudCkgdGFyZ2V0RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2hhbmdlZExhbmd1YWdlKCgoSW5kZXhlZFJlZ2lvbikgdGFyZ2V0RWxlbWVudCkuZ2V0U3RhcnRPZmZzZXQoKSwgbGFuZ3VhZ2VWYWx1ZSk7Ci0JCX0KLQotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gYWRhcHRlclR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyB3ZSBzaG91bGQgb25seSBiZSBhZGRlZCB0byBwYWdlIGRpcmVjdGl2ZXMsIHNvIGlmIHdlIHNlZSBhIHBhZ2UgZGlyZWN0aXZlCi0JCS8vIGNoYW5nZSwgd2UgbmVlZCB0byBjaGVjayBpdHMgYXR0cmlidXRlcywgYW5kIG5vdGlmeSB0aGUgUGFnZURpcmVjdGl2ZUFkYXB0ZXIgd2hlbiAKLQkJLy8gY2VydGFpbiBvbmVzIGNoYW5lLCBzbyBpdCBjYW4gbWFrZSBpdHMgImNlbnRyYWxpemVkIiBkZWNpc2lvbnMuCi0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0KLQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNIQU5HRSA6Ci0JCQkJCWlmIChjaGFuZ2VkRmVhdHVyZSBpbnN0YW5jZW9mIEF0dHJJbXBsKSB7Ci0JCQkJCQlBdHRySW1wbCBhdHRyaWJ1dGUgPSAoQXR0ckltcGwpIGNoYW5nZWRGZWF0dXJlOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQkJCQkJaWYgKG5hbWUuZXF1YWxzKCJjb250ZW50VHlwZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkvLyB1c2luZyBjb25jcmV0ZSBjbGFzcyBiZWxvdywgc2luY2UgImNoYW5nZWQiIGlzIHNvbWV0aGluZyBvZiBhbiBpbnRlcm5hbCBtZXRob2QKLQkJCQkJCQlQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKSAoKElET01Eb2N1bWVudCkgdGFyZ2V0RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNoYW5nZWRDb250ZW50VHlwZSgoKEluZGV4ZWRSZWdpb24pIHRhcmdldEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksIChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJCWlmIChuYW1lLmVxdWFscygibGFuZ3VhZ2UiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkvLyB1c2luZyBjb25jcmV0ZSBjbGFzcyBiZWxvdywgc2luY2UgImNoYW5nZWQiIGlzIHNvbWV0aGluZyBvZiBhbiBpbnRlcm5hbCBtZXRob2QKLQkJCQkJCQlQYWdlRGlyZWN0aXZlQWRhcHRlckltcGwgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXJJbXBsKSAoKElET01Eb2N1bWVudCkgdGFyZ2V0RWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNoYW5nZWRMYW5ndWFnZSgoKEluZGV4ZWRSZWdpb24pIHRhcmdldEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksIChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5SRU1PVkUgOgotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZlZCIrbmV3IERhdGUoKS50b1N0cmluZygpKTsKLQkJCQkJYnJlYWs7Ci0KLQotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlVmFsdWUgPSB0YXJnZXRFbGVtZW50LmdldEF0dHJpYnV0ZSgiY29udGVudFR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gY29udGVudFR5cGVWYWx1ZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlTdHJpbmcgbGFuZ3VhZ2VWYWx1ZSA9IHRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJsYW5ndWFnZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBsYW5ndWFnZVZhbHVlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGFyZ2V0RWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQXR0ckltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQXR0ckltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJjYzY2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0F0dHJJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgQXR0ckltcGxGb3JKU1AgZXh0ZW5kcyBBdHRySW1wbCB7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQlzdXBlci5zZXROYW1lKG5hbWUpOwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lc3BhY2VVUkkoU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlzdXBlci5zZXROYW1lc3BhY2VVUkkobmFtZXNwYWNlVVJJKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQ29tbWVudEltcGxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvQ29tbWVudEltcGxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1ZGY3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0NvbW1lbnRJbXBsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29tbWVudEltcGxGb3JKU1AKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRJbXBsRm9ySlNQIGV4dGVuZHMgQ29tbWVudEltcGwgewotCXByb3RlY3RlZCBDb21tZW50SW1wbEZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tbWVudEltcGxGb3JKU1AoQ29tbWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbkNsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJEb2N1bWVudChEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCk7Ci0JfQotCQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ29tbWVudEltcGwgY2xvbmVkID0gbmV3IENvbW1lbnRJbXBsRm9ySlNQKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NRG9jdW1lbnRGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NRG9jdW1lbnRGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIwYmM2NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9ET01Eb2N1bWVudEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50U3R5bGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgRE9NRG9jdW1lbnRGb3JKU1AgZXh0ZW5kcyBEb2N1bWVudFN0eWxlSW1wbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgRE9NRG9jdW1lbnRGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRoYXQKLQkgKi8KLQlwcm90ZWN0ZWQgRE9NRG9jdW1lbnRGb3JKU1AoRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcCBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlET01Eb2N1bWVudEZvckpTUCBjbG9uZWQgPSBuZXcgRE9NRG9jdW1lbnRGb3JKU1AodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVkLmltcG9ydENoaWxkTm9kZXModGhpcywgdHJ1ZSk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUVsZW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkodGFnTmFtZSk7Ci0KLQkJRWxlbWVudEltcGxGb3JKU1AgZWxlbWVudCA9IG5ldyBFbGVtZW50SW1wbEZvckpTUCgpOwotCQllbGVtZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVsZW1lbnQuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCS8qKgotCSAqIGNyZWF0ZUNvbW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Db21tZW50Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ29tbWVudCBjcmVhdGVDb21tZW50KFN0cmluZyBkYXRhKSB7Ci0JCUNvbW1lbnRJbXBsRm9ySlNQIGNvbW1lbnQgPSBuZXcgQ29tbWVudEltcGxGb3JKU1AoKTsKLQkJY29tbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJY29tbWVudC5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlBdHRySW1wbEZvckpTUCBhdHRyID0gbmV3IEF0dHJJbXBsRm9ySlNQKCk7Ci0JCWF0dHIuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsRm9ySlNQIGF0dHIgPSBuZXcgQXR0ckltcGxGb3JKU1AoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCWF0dHIuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQkvKioKLQkgKiBjcmVhdGVUZXh0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBUZXh0IGNyZWF0ZVRleHROb2RlKFN0cmluZyBkYXRhKSB7Ci0JCVRleHRJbXBsRm9ySlNQIHRleHQgPSBuZXcgVGV4dEltcGxGb3JKU1AoKTsKLQkJdGV4dC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQl0ZXh0LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiB0ZXh0OwotCX0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NTW9kZWxGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvRE9NTW9kZWxGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzNjI3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0RPTU1vZGVsRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01TdHlsZU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlhNTE1vZGVsVXBkYXRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERPTU1vZGVsRm9ySlNQIGV4dGVuZHMgRE9NU3R5bGVNb2RlbEltcGwgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIERPTU1vZGVsRm9ySlNQKCkgewotCQlzdXBlcigpOwotCQkvLyByZW1lbWJlciwgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gc3VwZXIgY29uc3RydWN0b3IsIAotCQkvLyB2aWEgaW50ZXJuYWxDcmVhdGVEb2N1bWVudAotCX0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudCBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKSB7Ci0JCURPTURvY3VtZW50Rm9ySlNQIGRvY3VtZW50ID0gbmV3IERPTURvY3VtZW50Rm9ySlNQKCk7Ci0JCWRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCXByb3RlY3RlZCBYTUxNb2RlbFBhcnNlciBjcmVhdGVNb2RlbFBhcnNlcigpIHsKLQkJcmV0dXJuIG5ldyBOZXN0ZWRET01Nb2RlbFBhcnNlcih0aGlzKTsKLQl9Ci0JcHJvdGVjdGVkIFhNTE1vZGVsVXBkYXRlciBjcmVhdGVNb2RlbFVwZGF0ZXIoKSB7Ci0JCXJldHVybiBuZXcgTmVzdERPTU1vZGVsVXBkYXRlcih0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0VsZW1lbnRJbXBsRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L0VsZW1lbnRJbXBsRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNmJjZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9FbGVtZW50SW1wbEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudFN0eWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEVsZW1lbnRJbXBsRm9ySlNQIGV4dGVuZHMgRWxlbWVudFN0eWxlSW1wbCB7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEVsZW1lbnRJbXBsRm9ySlNQKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0aGF0Ci0JICovCi0JcHVibGljIEVsZW1lbnRJbXBsRm9ySlNQKEVsZW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRFbmRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ2xvc2VkKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDbG9zZWRDb21tZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NlZE5lc3RlZERpcmVjdGl2ZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXN1cGVyLnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JfQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRWxlbWVudEltcGwgY2xvbmVkID0gbmV3IEVsZW1lbnRJbXBsRm9ySlNQKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdERPTU1vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9OZXN0RE9NTW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YjcxYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9OZXN0RE9NTW9kZWxVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuWE1MTW9kZWxVcGRhdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBOZXN0RE9NTW9kZWxVcGRhdGVyIGV4dGVuZHMgWE1MTW9kZWxVcGRhdGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBtb2RlbAotCSAqLwotCXB1YmxpYyBOZXN0RE9NTW9kZWxVcGRhdGVyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcihtb2RlbCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdGVkRE9NTW9kZWxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZG9tZG9jdW1lbnQvTmVzdGVkRE9NTW9kZWxQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3ZWI4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L05lc3RlZERPTU1vZGVsUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvbWRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5KU1BUYWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlhNTE1vZGVsUGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgTmVzdGVkRE9NTW9kZWxQYXJzZXIgZXh0ZW5kcyBYTUxNb2RlbFBhcnNlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKi8KLQlwdWJsaWMgTmVzdGVkRE9NTW9kZWxQYXJzZXIoRE9NTW9kZWxJbXBsIG1vZGVsKSB7Ci0JCXN1cGVyKG1vZGVsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRPcGVuKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29tbWVudFRleHQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQ7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb250ZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnTmFtZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUgfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnT3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTiB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVOZXN0ZWRUYWcoU3RyaW5nIHJlZ2lvblR5cGUsIFN0cmluZyB0YWdOYW1lLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyByZXN1bHRUYWdOYW1lID0gdGFnTmFtZTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB7Ci0JCQlyZXN1bHRUYWdOYW1lID0gSlNQVGFnLkpTUF9TQ1JJUFRMRVQ7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB7Ci0JCQlyZXN1bHRUYWdOYW1lID0gSlNQVGFnLkpTUF9FWFBSRVNTSU9OOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCXJlc3VsdFRhZ05hbWUgPSBKU1BUYWcuSlNQX0RFQ0xBUkFUSU9OOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSB7Ci0JCQlyZXN1bHRUYWdOYW1lID0gSlNQVGFnLkpTUF9ESVJFQ1RJVkU7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCXJlc3VsdFRhZ05hbWUgKz0gJy4nOwotCQkJcmVzdWx0VGFnTmFtZSArPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHRUYWdOYW1lOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnQ2xvc2UoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSB8fCByZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L1RleHRJbXBsRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2RvbWRvY3VtZW50L1RleHRJbXBsRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhOTFhMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9kb21kb2N1bWVudC9UZXh0SW1wbEZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5UZXh0SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFRleHRJbXBsRm9ySlNQIGV4dGVuZHMgVGV4dEltcGwgewotCXByb3RlY3RlZCBib29sZWFuIGlzTm90TmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQ7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JSlNQSGVhZENvbnRlbnREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JSlNQSGVhZENvbnRlbnREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmI4NDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUEhlYWRDb250ZW50RGV0ZWN0b3IgZXh0ZW5kcyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgewotCVN0cmluZyBnZXRDb250ZW50VHlwZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCVN0cmluZyBnZXRMYW5ndWFnZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Njc5MDM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5KU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcGFyc2VzIGJlZ2lubmluZyBwb3J0aW9uIG9mIEpTUCBmaWxlIHRvIGdldCBhdHRyaWJ1dGVzIGluIHBhZ2UKLSAqIGRpcmVjdGlpdmUKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvciBleHRlbmRzIEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElKU1BIZWFkQ29udGVudERldGVjdG9yIHsKLQotCXB1YmxpYyBKU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNGVkZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9KU1BEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQUmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkUmVhZGVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkJ1ZmZlcmVkTGltaXRlZFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlRhZ01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEpTUERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTUlNRV9UWVBFID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1BFQ19ERUZBVUxUX0VOQ09ESU5HID0gIklTTy04ODU5LTEiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcGF0aCA9IGlkLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gVE9ETyBuZWVkcyByZXdvcmsgZm9yIGxpbmtlZCByZXNvdXJjZXMKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlGaWxlIGZpbGUgPSByb290LmdldEZpbGVGb3JMb2NhdGlvbihuZXcgUGF0aChwYXRoKSk7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBKU1BEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGROZXN0YWJsZVByZWZpeChKU1BTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnTmFtZSkgewotCQlUYWdNYXJrZXIgYm0gPSBuZXcgVGFnTWFya2VyKHRhZ05hbWUpOwotCQlwYXJzZXIuYWRkTmVzdGFibGVQcmVmaXgoYm0pOwotCX0KLQotCXN5bmNocm9uaXplZCBwdWJsaWMgSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZUNvZGVkRG9jdW1lbnQoaUZpbGUpOwotCi0JCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGVtYmVkZGVkVHlwZSA9IGdldEVtYmVkZGVkVHlwZShpRmlsZSk7Ci0JCQlpZiAoZW1iZWRkZWRUeXBlICE9IG51bGwpCi0JCQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0KLQkJCWZGdWxsUHJlcGFyZWRSZWFkZXIucmVzZXQoKTsKLQkJCXNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCwgZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyICE9IG51bGwpIHsKLQkJCQlmRnVsbFByZXBhcmVkUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlQ29kZWREb2N1bWVudChJRmlsZSBpRmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkuc2V0KGlGaWxlKTsKLQotCQlmRnVsbFByZXBhcmVkUmVhZGVyID0gZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkuZ2V0Q29kZWRSZWFkZXIoKTsKLQkJZkVuY29kaW5nTWVtZW50byA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldEVuY29kaW5nTWVtZW50bygpOwotCi0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCkpOwotCi0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsICYmIGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgaGF2ZSBib3RoIG51bGwgZmlsZW5hbWUgYW5kIGlucHV0c3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb2RlZFJlYWRlckNyZWF0b3IgY29kZWRSZWFkZXJDcmVhdG9yID0gbmV3IENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQl0cnkgewotCQkJY29kZWRSZWFkZXJDcmVhdG9yLnNldChmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRDb2RlZFJlYWRlcigpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oZkVuY29kaW5nTWVtZW50byk7Ci0JCQkvLyB0aGUgZmFjdCB0aGF0IGZpbGUgaXMgbnVsbCBtZWFucyB0aGlzIG1ldGhvZC9jb2RlIHBhdGggaXMgbm8KLQkJCS8vIGdvb2QgZm9yIEpTUCBmcmFnbWVudHMKLQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRUeXBlID0gZ2V0RW1iZWRkZWRUeXBlKChJRmlsZSkgbnVsbCk7Ci0JCQlmRnVsbFByZXBhcmVkUmVhZGVyLnJlc2V0KCk7Ci0JCQlpZiAoZW1iZWRkZWRUeXBlICE9IG51bGwpCi0JCQkJZW1iZWRkZWRUeXBlLmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpICgoSVN0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5nZXRQYXJzZXIoKSk7Ci0JCQlzZXREb2N1bWVudENvbnRlbnRzRnJvbVJlYWRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZGdWxsUHJlcGFyZWRSZWFkZXIpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUgaW4gdGhpcyBjb250ZXh0Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgZ2V0RGVmYXVsdERvY3VtZW50UGFydGl0aW9uZXIuCi0JICogCi0JICogQHJldHVybiBJRG9jdW1lbnRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQKCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGdldERlZmF1bHRNaW1lVHlwZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRNaW1lVHlwZSgpIHsKLQkJcmV0dXJuIERFRkFVTFRfTUlNRV9UWVBFOwotCX0KLQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCWlmIChmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPSBuZXcgSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeQotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCkgewotCQlpZiAoZkVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5ID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIHRoZSBNSU1FIGNvbnRlbnQgdHlwZSBzcGVjaWZpZWQgaW4gYSBwYWdlIGRpcmVjdGl2ZS4gVGhpcwotCSAqIHNob3VsZCBhcHBlYXIgImFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIHRoZSBKU1AgcGFnZSIgYWNjb3JkaW5nIHRvIHRoZQotCSAqIEpTUCB2MS4yIHNwZWNpZmljYXRpb24uCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEVtYmVkZGVkVHlwZShJRmlsZSBmaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGhhbmRsZXIgPSBudWxsOwotCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciA9PSBudWxsKSB7Ci0JCQloYW5kbGVyID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG1pbWVUeXBlID0gbnVsbDsKLQotCQkJSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGpzcFByb3ZpZGVyID0gZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCk7Ci0JCQlSZWFkZXIgZnVsbFByZXBhcmVkUmVhZGVyID0gZ2V0RnVsbFByZXBhcmVkUmVhZGVyKCk7Ci0JCQlCdWZmZXJlZExpbWl0ZWRSZWFkZXIgbGltaXRlZFJlYWRlciA9IG5ldyBCdWZmZXJlZExpbWl0ZWRSZWFkZXIoZnVsbFByZXBhcmVkUmVhZGVyLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCQlqc3BQcm92aWRlci5zZXQobGltaXRlZFJlYWRlcik7Ci0JCQlpZiAoanNwUHJvdmlkZXIgaW5zdGFuY2VvZiBJSlNQSGVhZENvbnRlbnREZXRlY3RvcikgewotCQkJCW1pbWVUeXBlID0gKChJSlNQSGVhZENvbnRlbnREZXRlY3RvcikganNwUHJvdmlkZXIpLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJZnVsbFByZXBhcmVkUmVhZGVyLnJlc2V0KCk7Ci0JCQl9Ci0KLQkJCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCQkJaWYgKG1pbWVUeXBlID09IG51bGwgfHwgbWltZVR5cGUubGVuZ3RoKCkgPT0gMCkgewotCQkJCWhhbmRsZXIgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQloYW5kbGVyID0gcmVnLmdldFR5cGVGb3IobWltZVR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEZvciBKU1AgZmlsZXMsIHRleHQvaHRtbCBpcyB0aGUgZGVmYXVsdCBjb250ZW50IHR5cGUuIFRoaXMgbWF5IHdhbnQKLQkgKiB0aGlzIGRpZmZlcmVudCBmb3IgdHlwZXMgbGlrZSBqc3YgKGpzcCBmb3Igdm9pY2UgeG1sKSBGb3Igbm93LCBoYXJkCi0JICogY29kZSB0byBuZXcgaW5zdGFuY2UuIEluIGZ1dHVyZSwgc2hvdWxkIGdldCBpbnN0YW5jZSBmcm9tIHJlZ2lzdHJ5LgotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSFRNTCBhcyB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZSgpIHsKLQkJRW1iZWRkZWRUeXBlUmVnaXN0cnkgcmVnID0gZ2V0RW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5KCk7Ci0JCXJldHVybiByZWcuZ2V0VHlwZUZvcihnZXREZWZhdWx0TWltZVR5cGUoKSk7Ci0JfQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCS8vIHJlbWVtYmVyLCB0aGUgTG9hZGVyCi0JCS8vIHdpbGwgbmVlZCB0byBmaW5pc2ggaW5pdGlhbGl6YXRpb24gb2YgcGFyc2VyCi0JCS8vIGJhc2VkIG9uICJlbWJlZGRlZCBjb250ZW50IgotCQlKU1BTb3VyY2VQYXJzZXIgcGFyc2VyID0gbmV3IEpTUFNvdXJjZVBhcnNlcigpOwotCQkvLyBhZGQgZGVmYXVsdCBuZXN0YWJsZSB0YWcgbGlzdAotCQlhZGROZXN0YWJsZVByZWZpeChwYXJzZXIsIEpTUDExTmFtZXNwYWNlLkpTUF9UQUdfUFJFRklYKTsKLQkJcmV0dXJuIHBhcnNlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lmaWNhdGlvbiBjaXRlcyBJU08tODg1OS0xL0xhdGluLTEgYXMgdGhlIGRlZmF1bHQgY2hhcnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBTUEVDX0RFRkFVTFRfRU5DT0RJTkc7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSVN0cnVjdHVyZWREb2N1bWVudCwgdGhhdCBoYXMKLQkgKiBiZWVuIGluaXRpYWxpemVkIHdpdGggYXBwcm9wcmlhdGUgcGFyc2VyLiBGb3IgbWFueSBsb2FkZXJzLCB0aGUKLQkgKiAoZGVmYXVsdCkgcGFyc2VyIHVzZWQgaXMga25vd24gZm9yIGFueSBpbnB1dC4gRm9yIG90aGVycywgdGhlIGNvcnJlY3QKLQkgKiBwYXJzZXIgKGFuZCBpdHMgaW5pdGlhbGl6YXRpb24pIGlzIG5vcm1hbGwgZGVwZW5kZW50IG9uIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUuIFRoaXMgbm8tYXJndW1lbnQgbWV0aG9kIHNob3VsZCBhc3N1bWUgImVtcHR5IGlucHV0IiBhbmQgd291bGQKLQkgKiB0aGVyZWZvcmUgcmV0dXJuIHRoZSBkZWZhdWx0IHBhcnNlciBmb3IgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuIElmIHRoZQotCSAqIHBhcnNlciBpcyB0byBoYW5kbGUgdGFnIGxpYnJhcmllcywgaXQgbXVzdCBoYXZlIGEgVGFnbGliU3VwcG9ydCBvYmplY3QKLQkgKiB3aXRoIGEgdmFsaWQgVVJJUmVzb2x2ZXIgYW5kIHRoaXMgSVN0cnVjdHVyZWREb2N1bWVudCBhdHRhY2hlZCB0byBpdAotCSAqIGJlZm9yZSB0aGUgY29udGVudHMgYXJlIHNldCBvbiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKSk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIobmV3IEpTUFJlUGFyc2VyKCkpOwotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihuZXcKLQkJLy8gSlNQSmF2YURvY3VtZW50UGFydGlvbmVyKCkpOwotCQkvLyBldmVuIHRob3VnaCB0aGlzIGlzIGFuICJlbXB0eSBtb2RlbCIgLi4uIHdlIHdhbnQgaXQgdG8gaGF2ZSBhdAotCQkvLyBsZWFzdAotCQkvLyB0aGUKLQkJLy8gZGVmYXVsdCBlbWJlZGRlZGVkIGNvbnRlbnQgdHlwZSBoYW5kbGVyCi0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRUeXBlID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZSgpOwotCQllbWJlZGRlZFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8KLQkJLy8gZG9jdW1lbnQgbXVzdCBoYXZlIGFscmVhZHkgYmVlbiBzZXQgZm9yIHRoaXMgdG8KLQkJLy8gd29yay4KLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGRvY3VtZW50LCBKU1BDb3JlTWVzc2FnZXMuSlNQRG9jdW1lbnRMb2FkZXJfMSk7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkvLyBUaGlzICdnZXQnIGNhdXNlcyBmaXJzdCB0byBiZSBiZSBhdHRhY2hlZC4KLQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gbWF5IG1ha2UgdGhpcyBlYXNpZXIgdG8gdXNlIGluIGZ1dHVlCi0JCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KCkpOwotCQkvLyBGb3IgSlNQcywgdGhlIE1vZGVsUXVlcnlBZGFwdGVyIG11c3QgYmUgImF0dGFjaGVkIiB0byB0aGUgZG9jdW1lbnQKLQkJLy8gYmVmb3JlIGNvbnRlbnQgaXMgc2V0IGluIHRoZSBtb2RlbCwgc28gdGFnbGliIGluaXRpemF0aW9uIGNhbgotCQkvLyB0YWtlIHBsYWNlLgotCQkoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Db21waWxhdGlvblVuaXRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Db21waWxhdGlvblVuaXRIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRmNTUyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvQ29tcGlsYXRpb25Vbml0SGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuV29ya2luZ0NvcHlPd25lcjsKLQotLyoqCi0gKiBUbyBlbnN1cmUgdGhlcmUgaXMgb25seSBvbmUgaW5zdGFuY2Ugb2YgUHJvYmxlbVJlcXVlc3RvciBhbmQgV29ya2luZ0NvcHlPd25lcgotICogZm9yIEpTUCBwbHVnaW5zLiAgVGhlc2Ugd2VyZSByZW1vdmVkIGZyb20gSlNQVHJhbnNsYXRpb24gdG8gZW5zdXJlIHRoYXQgdGhlCi0gKiBKU1BUcmFuc2xhdGlvbiB3YXMgbm90IGhlbGQgaW4gbWVtb3J5IGJ5IGFueSB0eXBlIG9mIEpEVCBsaXN0cyAoY2FjaGluZwotICogc2VhcmNoIHJlc3VsdHMsIGV0Yy4uLikKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIENvbXBpbGF0aW9uVW5pdEhlbHBlciB7Ci0KLSAgICBwcml2YXRlIEpTUFByb2JsZW1SZXF1ZXN0b3IgZlByb2JsZW1SZXF1ZXN0b3IgPSBudWxsOwotICAgIHByaXZhdGUgV29ya2luZ0NvcHlPd25lciBmV29ya2luZ0NvcHlPd25lciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQ29tcGlsYXRpb25Vbml0SGVscGVyIGluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBDb21waWxhdGlvblVuaXRIZWxwZXIoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBpbnN0YW5jZQotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIGZpbmFsIENvbXBpbGF0aW9uVW5pdEhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQotICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgICAgIGluc3RhbmNlID0gbmV3IENvbXBpbGF0aW9uVW5pdEhlbHBlcigpOwotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEpTUFByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpIHsKLQotICAgICAgICBpZiAoZlByb2JsZW1SZXF1ZXN0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIGZQcm9ibGVtUmVxdWVzdG9yID0gbmV3IEpTUFByb2JsZW1SZXF1ZXN0b3IoKTsKLSAgICAgICAgcmV0dXJuIGZQcm9ibGVtUmVxdWVzdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0KLSAgICAgICAgaWYgKGZXb3JraW5nQ29weU93bmVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGZXb3JraW5nQ29weU93bmVyID0gbmV3IFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJKU1AgV29ya2luZyBjb3B5IG93bmVyIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZXb3JraW5nQ29weU93bmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Fc2NhcGVkVGV4dFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9Fc2NhcGVkVGV4dFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMzZjJkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvRXNjYXBlZFRleHRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBjbGFzcyB0byBoYW5kbGUgY2h1bmtzIG9mIHRleHQvcmVnaW9ucwotICogd2l0aCBlc2NhcGVkIGNoYXJhY3RlciBkYXRhCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgRXNjYXBlZFRleHRVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBmWE1MdG9KYXZhTG9va3VwID0gbnVsbDsKLQotCS8qKgotCSAqIEByZXR1cm4gdW5lc2NhcGVkIGZ1bGwgdGV4dCBvZiB0aGF0IHJlZ2lvbiwgIiIgaWYgdGhlcmUgaXMgbm8gdGV4dAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuZXNjYXBlZFRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIElUZXh0UmVnaW9uIHIpIHsKLQkJU3RyaW5nIHRlc3QgPSAocGFyZW50ICE9IHIpID8gcGFyZW50LmdldEZ1bGxUZXh0KHIpIDogcGFyZW50LmdldEZ1bGxUZXh0KCk7Ci0JCXJldHVybiBnZXRVbmVzY2FwZWRUZXh0KHRlc3QpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFVuZXNjYXBlZFRleHQoU3RyaW5nIHRlc3QpIHsKLQkJaW5pdExvb2t1cCgpOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodGVzdCAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRlc3QsICImOyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdG9rMSwgdG9rMiwgdG9rMywgdHJhbnNTdHJpbmc7Ci0JCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJdG9rMSA9IHRvazIgPSB0b2szID0gdHJhbnNTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCXRvazEgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAodG9rMS5lcXVhbHMoIiYiKSAmJiBzdC5oYXNNb3JlVG9rZW5zKCkpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCXRvazIgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJdG9rMyA9IHN0Lm5leHRUb2tlbigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghKHRyYW5zU3RyaW5nID0gZlhNTHRvSmF2YUxvb2t1cC5nZXRQcm9wZXJ0eSh0b2sxICsgdG9rMiArIHRvazMsICIiKSkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQlidWZmZXIuYXBwZW5kKHRyYW5zU3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodG9rMSArIHRvazIgKyB0b2szKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogaW5pdGlhbGl6ZSBsb29rdXAgdGFibGVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbml0TG9va3VwKCkgewotCQlmWE1MdG9KYXZhTG9va3VwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJmFwb3M7IiwgIiciKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZxdW90OyIsICJcIiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJmFtcDsiLCAiJiIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJZlhNTHRvSmF2YUxvb2t1cC5zZXRQcm9wZXJ0eSgiJmx0OyIsICI8Iik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmWE1MdG9KYXZhTG9va3VwLnNldFByb3BlcnR5KCImZ3Q7IiwgIj4iKTsgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWZYTUx0b0phdmFMb29rdXAuc2V0UHJvcGVydHkoIiZuYnNwOyIsICIgIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIGVudGl0eSByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdHJhbnNsYXRlRW50aXR5UmVmZXJlbmNlKFN0cmluZyBlbnRpdHkpIHsKLQkJcmV0dXJuIGZYTUx0b0phdmFMb29rdXAuZ2V0UHJvcGVydHkoZW50aXR5LCBlbnRpdHkpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BUcmFuc2xhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0lKU1BUcmFuc2xhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjc5ZjNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9JSlNQVHJhbnNsYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotCi0vKioKLSAqIEFuIG9iamVjdCB0aGF0IGhvbGRzIGEgdHJhbnNsYXRlZCBKU1AgU3RyaW5nIGFsb25nIHdpdGgKLSAqIHBvc2l0aW9uIG1hcHBpbmcgZnJvbSBKYXZhIHRvIEpTUCwgYW5kIEpTUCB0byBKYXZhLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFRyYW5zbGF0aW9uIHsKLQotCS8qKgotCSAqIFRoZSBzdHJpbmcgY29udGVudHMgb2YgdGhlIHRyYW5zbGF0ZWQgZG9jdW1lbnQuCi0JICogQHJldHVybiAgdGhlIHN0cmluZyBjb250ZW50cyBvZiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEphdmFUZXh0KCk7Ci0KLQkvKioKLQkgKiBUaGUgY29ycmVzcG9uZGluZyBqYXZhIG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudCBmb3IgYSBnaXZlbiBqc3Agb2Zmc2V0LgotCSAqIEBwYXJhbSBqc3BQb3NpdGlvbgotCSAqIEByZXR1cm4gdGhlIGphdmEgb2Zmc2V0IHRoYXQgbWFwcyB0byBqc3BPZmZzZXQsIC0xIGlmIHRoZSBwb3NpdGlvbiBoYXMgbm8gbWFwcGluZy4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEphdmFPZmZzZXQoaW50IGpzcE9mZnNldCk7Ci0KLQkvKioKLQkgKiBUaGUgY29ycmVzcG9uZGluZyBqc3Agb2Zmc2V0IGluIHRoZSBzb3VyY2UgZG9jdW1lbnQgZm9yIGEgZ2l2ZW4ganNwIG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBkb2N1bWVudC4KLQkgKiBAcGFyYW0gamF2YVBvc2l0aW9uCi0JICogQHJldHVybiB0aGUganNwIG9mZnNldCB0aGF0IG1hcHMgdG8gamF2YU9mZnNldCwgLTEgaWYgdGhlIHBvc2l0aW9uIGhhcyBubyBtYXBwaW5nLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KTsKLQotCS8qKgotCSAqIFRoZSBjb3JyZXNwb25kaW5nIENvbXBpbGF0aW9uVW5pdCBmb3IgdGhlIHRyYW5zbGF0ZWQgSlNQIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBJQ29tcGlsYXRpb25Vbml0IG9mIHRoZSB0cmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUphdmFFbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU1AgcmFuZ2UgaW4gdGhlIEpTUCBTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0ganNwU3RhcnQgc3RhcmluZyBvZmZzZXQgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqIEBwYXJhbSBqc3BFbmQgZW5kaW5nIG9mZnNldCBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICogQHJldHVybiBJSmF2YUVsZW1lbnRzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEpTUCBzZWxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgSUphdmFFbGVtZW50W10gZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UoaW50IGpzcFN0YXJ0LCBpbnQganNwRW5kKTsKLQotCS8qKgotCSAqIE11c3QgYmUgc2V0IHRydWUgaW4gb3JkZXIgZm9yIHByb2JsZW1zIHRvIGJlIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlLgotCSAqIElmIHNldCBmYWxzZSwgcHJvYmxlbXMgd2lsbCBiZSBpZ25vcmVkIGR1cmluZyByZWNvbmNpbGUuCi0JICogQHBhcmFtIGNvbGxlY3QKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ibGVtQ29sbGVjdGluZ0FjdGl2ZShib29sZWFuIGNvbGxlY3QpOwotCi0JLyoqCi0JICogUmVjb25jaWxlcyB0aGUgY29tcGlsYXRpb24gdW5pdCBmb3IgdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZUNvbXBpbGF0aW9uVW5pdCgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgTGlzdCBvZiBwcm9ibGVtcyBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFByb2JsZW1zKCk7Ci0JCi0JLy8gYWRkIHRoZXNlIEFQSSBvbmNlIGZpbmFsaXplZAotCS8vIGdldEpzcEVkaXRzKFRleHRFZGl0IGphdmFFZGl0KQotCS8vIGdldEphdmFSYW5nZXMoKQotICAgIC8vIGdldEphdmFEb2N1bWVudCgpCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUDJTZXJ2bGV0TmFtZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1AyU2VydmxldE5hbWVVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZGZiYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUDJTZXJ2bGV0TmFtZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1AyU2VydmxldE5hbWVVdGlsIHsKLQkKLQkvKioKLQkgKiBXQVMgbWFuZ2xlcyBUb20mSmVycnkgYXM6IF9Ub21fMjZfSmVycnk7IHRoaXMgdGFrZXMgaW4gdGhlIG1hbmdsZWQgbmFtZQotCSAqIGFuZCByZXR1cm5zIHRoZSBvcmlnaW5hbCBuYW1lLgotCSAqIAotCSAqIFVubWFuZ2xlcyB0aGUgcXVhbGlmaWVkIHR5cGUgbmFtZS4gIElmIGFuIHVuZGVyc2NvcmUgaXMgZm91bmQKLQkgKiBpdCBpcyBhc3N1bWVkIHRvIGJlIGEgbWFuZ2xlZCByZXByZXNlbnRhdGlvbiBvZiBhIG5vbi1hbHBoYSwgCi0JICogbm9uLWRpZ2l0IGNoYXJhY3RlciBvZiB0aGUgZm9ybSBfTk5fLCB3aGVyZSBOTiBhcmUgaGV4IGRpZ2l0cwotCSAqIHJlcHJlc2VudGluZyB0aGUgZW5jb2RlZCBjaGFyYWN0ZXIuICBUaGlzIHJvdXRpbmUgY29udmVydHMgaXQKLQkgKiBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgdW5tYW5nbGUoU3RyaW5nIHF1YWxpZmllZFR5cGVOYW1lKSB7Ci0JCWlmKHF1YWxpZmllZFR5cGVOYW1lLmNoYXJBdCgwKSAhPSAnXycpCi0JCQlyZXR1cm4gcXVhbGlmaWVkVHlwZU5hbWU7Ci0JCQotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgcG9zc2libGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCQkvLyByZW1vdmUgdGhlIC5qYXZhIGV4dGVuc2lvbiBpZiB0aGVyZSBpcyBvbmUKLQkJaWYocXVhbGlmaWVkVHlwZU5hbWUuZW5kc1dpdGgoIi5qYXZhIikpLy8kTk9OLU5MUy0xJAotCQkJcXVhbGlmaWVkVHlwZU5hbWUgPSBxdWFsaWZpZWRUeXBlTmFtZS5zdWJzdHJpbmcoMCwgcXVhbGlmaWVkVHlwZU5hbWUubGVuZ3RoKCkgLSA1KTsKLQkJCi0JCWZvcihpbnQgaSA9IDE7IGkgPCBxdWFsaWZpZWRUeXBlTmFtZS5sZW5ndGgoKTsgaSsrKSB7ICAvLyBzdGFydCBhdCBpbmRleCAxIGIvYyAxc3QgY2hhciBpcyBhbHdheXMgJ18nCi0JCQljaGFyIGMgPSBxdWFsaWZpZWRUeXBlTmFtZS5jaGFyQXQoaSk7Ci0JCQlpZihjID09ICdfJykgewotCQkJCWludCBlbmRJbmRleCA9IHF1YWxpZmllZFR5cGVOYW1lLmluZGV4T2YoJ18nLCBpKzEpOwotCQkJCWlmKGVuZEluZGV4ID09IC0xKQotCQkJCQlidWYuYXBwZW5kKGMpOwotCQkJCWVsc2UgewotCQkJCQljaGFyIHVubWFuZ2xlZDsKLQkJCQkJdHJ5IHsKLQkJCQkJCXBvc3NpYmxlID0gcXVhbGlmaWVkVHlwZU5hbWUuc3Vic3RyaW5nKGkrMSwgZW5kSW5kZXgpOyAKLQkJCQkJICAgIGlmKGlzVmFsaWQocG9zc2libGUpKSB7Ci0JCQkJCQkJdW5tYW5nbGVkID0gKGNoYXIpSW50ZWdlci5kZWNvZGUoIjB4IiArIHBvc3NpYmxlKS5pbnRWYWx1ZSgpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpID0gZW5kSW5kZXg7Ci0JCQkJCSAgICB9Ci0JCQkJCSAgICBlbHNlIHsgCi0JCQkJCSAgICAgICAgdW5tYW5nbGVkID0gYzsKLQkJCQkJICAgIH0KLQkJCQkJCQotCQkJCQl9IGNhdGNoKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQl1bm1hbmdsZWQgPSBjOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodW5tYW5nbGVkKTsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoYyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBpZiBnaXZlbiBzdHJpbmcgaXMgYSB2YWxpZCBIZXggcmVwcmVzZW50YXRpb24gb2YgYW4gQVNDSUkgY2hhcmFjdGVyIChlZy4gMkYgLT4gLykKLQkgKiBAcGFyYW0gcG9zc2libGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKFN0cmluZyBwb3NzaWJsZSkgewotCSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCSAgICBpZihwb3NzaWJsZS5sZW5ndGgoKSA9PSAyKXsJICAgIAotCSAgICAgICAgY2hhciBjMSA9IHBvc3NpYmxlLmNoYXJBdCgwKTsKLQkgICAgICAgIGNoYXIgYzIgPSBwb3NzaWJsZS5jaGFyQXQoMSk7Ci0JICAgICAgICAvLyAxc3QgY2hhcmFjdGVyIG11c3QgYmUgYSBkaWdpdAotCSAgICAgICAgaWYoQ2hhcmFjdGVyLmlzRGlnaXQoYzEpKSB7Ci0JICAgICAgICAgICAgLy8gMm5kIGNoYXJhY3RlciBtdXN0IGJlIGRpZ2l0IG9yIHVwcGVyIGNhc2UgbGV0dGVyIEEtRgotCSAgICAgICAgICAgIGlmKENoYXJhY3Rlci5pc0RpZ2l0KGMyKSkgewotCSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBlbHNlIGlmKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjMikgJiYgKGMyID09ICdBJyB8fCBjMiA9PSAnQicgfHwgYzIgPT0gICdDJ3x8IGMyID09ICAnRCd8fCBjMiA9PSAgJ0UnfHwgYzIgPT0gJ0YnKSkgewotCSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLQkgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBNYW5nbGUgc3RyaW5nIHRvIFdBUy1saWtlIHNwZWNpZmljYXRpb25zCi0JICoKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBtYW5nbGUoU3RyaW5nIG5hbWUpIHsJICAKLQkgIFN0cmluZ0J1ZmZlciBtb2RpZmllZE5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JICAKLQkgIC8vIGV4dGVuc2lvbiAoLmpzcCwgLmpzcGYsIC5qc3B4LCBldGMuLi4pIHNob3VsZCBhbHJlYWR5IGJlIGVuY29kZWQgaW4gbmFtZQotCSAgCi0JICBpbnQgbGVuZ3RoID0gbmFtZS5sZW5ndGgoKTsKLQkgIC8vIGluIGNhc2UgbmFtZSBpcyBmb3JiaWRkZW4gKGEgbnVtYmVyLCBjbGFzcywgZm9yLCBldGMuLi4pCi0JICBtb2RpZmllZE5hbWUuYXBwZW5kKCdfJyk7Ci0JCi0JICAvLyBlbnN1cmUgcmVzdCBvZiBjaGFyYWN0ZXJzIGFyZSB2YWxpZAkKLQkgIGZvciAoaW50IGk9MDsgaTwgbGVuZ3RoOyBpKyspIHsKLQkJICBjaGFyIGN1cnJlbnRDaGFyID0gbmFtZS5jaGFyQXQoaSk7Ci0JCSAgaWYgKENoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjdXJyZW50Q2hhcikgPT0gdHJ1ZSAgKSB7IAotCQkJICBtb2RpZmllZE5hbWUuYXBwZW5kKGN1cnJlbnRDaGFyKTsKLQkJICB9IGVsc2UgewotCQkJICBtb2RpZmllZE5hbWUuYXBwZW5kKG1hbmdsZUNoYXIoY3VycmVudENoYXIpKTsKLQkJICB9Ci0JICB9Ci0JICByZXR1cm4gbW9kaWZpZWROYW1lLnRvU3RyaW5nKCk7Ci0JICAKLQl9Ci0KLQkvKioKLQkgKiB0YWtlIGEgY2hhcmFjdGVyIGFuZCByZXR1cm4gaXRzIGhleCBlcXVpdmFsZW50Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIG1hbmdsZUNoYXIoY2hhciBjaCkgewotCSAgaWYgKCBjaCA9PSBGaWxlLnNlcGFyYXRvckNoYXIgKSB7Ci0JCSAgY2ggPSAnLyc7Ci0JICB9Ci0JCi0JICBpZiAoIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpID09IHRydWUgKSB7Ci0JCSAgcmV0dXJuICIiICsgY2g7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLQkgIHJldHVybiAiXyIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGNoKS50b1VwcGVyQ2FzZSgpICsgIl8iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQSW5jbHVkZVJlZ2lvbkhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUEluY2x1ZGVSZWdpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmNzIxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQSW5jbHVkZVJlZ2lvbkhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIEV4dGVuc2lvbiBvZiBYTUxKU1BSZWdpb25IZWxwZXIgaW50ZWRlZCB0byBwYXJzZSBlbnRpcmUgaW5jbHVkZWQgSlNQIGZpbGVzLgotICogQmFzaWNhbGx5IGl0IGV4cGFuZHMgdGhlIHJ1bGVzIGZvciB3aGF0IHRhZ3MgYXJlIHBhcnNlZCBhcyBKU1AuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIgZXh0ZW5kcyBYTUxKU1BSZWdpb25IZWxwZXIgewotCS8qKgotCSAqIEBwYXJhbSBKU1BUcmFuc2xhdG9yCi0JICovCi0JcHVibGljIEpTUEluY2x1ZGVSZWdpb25IZWxwZXIoSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKHRyYW5zbGF0b3IpOwotCX0KLQotCS8vIHRoZXNlIG1ldGhvZHMgZGV0ZXJtaW5lIHdoYXQgY29udGVudCBnZXRzIGFkZGVkIHRvIHRoZSBsb2NhbCBzY3JpcGxldCwgZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24gYnVmZmVycwotCS8qCi0JICogcmV0dXJuIHRydWUgZm9yIGVsZW1lbnRzIHdob3NlIGNvbnRlbnRzIHdlIG1pZ2h0IHdhbnQgdG8gYWRkIHRvIHRoZSBqYXZhIGZpbGUgd2UgYXJlIGJ1aWxkaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1BTdGFydFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCVN0cmluZyB0eXBlID0gc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCk7Ci0JCXJldHVybiB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVjbGFyYXRpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRlY2xhcmF0aW9uIikgLy8kTk9OLU5MUy0xJAkJCi0JCQkJCXx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgiPCUhIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwcmVzc2lvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZXhwcmVzc2lvbiIpIC8vJE5PTi1OTFMtMSQJCQotCQkJCQl8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIjwlPSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTY3JpcHRsZXQoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOnNjcmlwdGxldCIpIC8vJE5PTi1OTFMtMSQJCQotCQkJCQl8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIjwlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0luY2x1ZGVEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS5pbmNsdWRlIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQl0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImluY2x1ZGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFnbGliRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUudGFnbGliIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoInRhZ2xpYiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYWdlRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUucGFnZSIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJwYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBkaWZmZXJlbnQgYnR3biBYTUwtSlNQIGFuZCBKU1AgdGFncwkJCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZWdpb25OYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCVN0cmluZyBuYW1lU3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHNpemUgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpOwotCQlpZiAoc2l6ZSA+IDEpIHsKLQkJCS8vIHByZXN1bWFibHkgWE1MLUpTUCA8anNwOnNjcmlwdGxldD4gfCA8anNwOmV4cHJlc3Npb24+IHwgPGpzcDpkZWNsYXJhdGlvbj4KLQkJCW5hbWVSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQl9Ci0JCWVsc2UgaWYgKHNpemUgPT0gMSkgewotCQkJLy8gcHJlc3VtYWJseSBKU1Agb3BlbiA8JSB8IDwlPSB8IDwlIQotCQkJbmFtZVJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCX0KLQkJaWYgKG5hbWVSZWdpb24gIT0gbnVsbCkKLQkJCW5hbWVTdHIgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWVSZWdpb24pLCBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KG5hbWVSZWdpb24pKTsKLQkJcmV0dXJuIG5hbWVTdHIudHJpbSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NPdGhlclJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcm9jZXNzSW5jbHVkZURpcmVjdGl2ZShzZFJlZ2lvbik7Ci0JCXByb2Nlc3NQYWdlRGlyZWN0aXZlKHNkUmVnaW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFByb2JsZW1SZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BQcm9ibGVtUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmNDc2ODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFByb2JsZW1SZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmE7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQcm9ibGVtUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotCi1jbGFzcyBKU1BQcm9ibGVtUmVxdWVzdG9yIGltcGxlbWVudHMgSVByb2JsZW1SZXF1ZXN0b3IgewotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZJc0FjdGl2ZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZJc1J1bm5pbmcgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgTGlzdCBmQ29sbGVjdGVkUHJvYmxlbXM7Ci0KLSAgICBwdWJsaWMgdm9pZCBiZWdpblJlcG9ydGluZygpIHsKLQotICAgICAgICBmSXNSdW5uaW5nID0gdHJ1ZTsKLSAgICAgICAgZkNvbGxlY3RlZFByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFjY2VwdFByb2JsZW0oSVByb2JsZW0gcHJvYmxlbSkgewotCi0gICAgICAgIGlmIChpc0FjdGl2ZSgpKQotICAgICAgICAgICAgZkNvbGxlY3RlZFByb2JsZW1zLmFkZChwcm9ibGVtKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRSZXBvcnRpbmcoKSB7Ci0KLSAgICAgICAgZklzUnVubmluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgewotCi0gICAgICAgIHJldHVybiBmSXNBY3RpdmUgJiYgZkNvbGxlY3RlZFByb2JsZW1zICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoaXMgcHJvYmxlbSByZXF1ZXN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIGlzQWN0aXZlCi0gICAgICogICAgICAgICAgICB0aGUgc3RhdGUgb2YgdGhpcyBwcm9ibGVtIHJlcXVlc3RvcgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElzQWN0aXZlKGJvb2xlYW4gaXNBY3RpdmUpIHsKLQotICAgICAgICBpZiAoZklzQWN0aXZlICE9IGlzQWN0aXZlKSB7Ci0gICAgICAgICAgICBmSXNBY3RpdmUgPSBpc0FjdGl2ZTsKLSAgICAgICAgICAgIGlmIChmSXNBY3RpdmUpCi0gICAgICAgICAgICAgICAgc3RhcnRDb2xsZWN0aW5nUHJvYmxlbXMoKTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICBzdG9wQ29sbGVjdGluZ1Byb2JsZW1zKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyB0aGlzIGFubm90YXRpb24gbW9kZWwgdG8gY29sbGVjdCB0ZW1wb3JhcnkgcHJvYmxlbXMgZnJvbSBub3cgb24uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHN0YXJ0Q29sbGVjdGluZ1Byb2JsZW1zKCkgewotCi0gICAgICAgIGZDb2xsZWN0ZWRQcm9ibGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUZWxscyB0aGlzIGFubm90YXRpb24gbW9kZWwgdG8gbm8gbG9uZ2VyIGNvbGxlY3QgdGVtcG9yYXJ5IHByb2JsZW1zLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzdG9wQ29sbGVjdGluZ1Byb2JsZW1zKCkgewotCi0gICAgICAgIC8vIGRvIG5vdGhpbmcKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvbGxlY3RlZCBwcm9ibGVtcwotICAgICAqLwotICAgIHB1YmxpYyBMaXN0IGdldENvbGxlY3RlZFByb2JsZW1zKCkgewotCi0gICAgICAgIHJldHVybiBmQ29sbGVjdGVkUHJvYmxlbXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNSdW5uaW5nKCkgewotCi0gICAgICAgIHJldHVybiBmSXNSdW5uaW5nOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YTQ1YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLldvcmtpbmdDb3B5T3duZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogPHA+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJSlNQVHJhbnNsYXRpb24uICAKLSAqIDxicj4KLSAqIFRoaXMgb2JqZWN0IHRoYXQgaG9sZHMgdGhlIGphdmEgdHJhbnNsYXRpb24gb2YgCi0gKiBhIEpTUCBmaWxlIGFzIHdlbGwgYXMgYSBtYXBwaW5nIG9mIHJhbmdlcyBmcm9tIHRoZSB0cmFuc2xhdGVkIEphdmEgdG8gdGhlIEpTUCBzb3VyY2UsIAotICogYW5kIG1hcHBpbmcgZnJvbSBKU1Agc291cmNlIGJhY2sgdG8gdGhlIHRyYW5zbGF0ZWQgSmF2YS4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBZb3UgbWF5IGFsc28gdXNlIEpTUFRyYW5zbGF0aW9uIHRvIGRvIENvbXBpbGF0aW9uVW5pdC1lc3F1ZSB0aGluZ3Mgc3VjaCBhczoKLSAqIDx1bD4KLSAqIAk8bGk+Y29kZSBzZWxlY3QgKGdldCBqYXZhIGVsZW1lbnRzIGZvciBqc3Agc2VsZWN0aW9uKTwvbGk+Ci0gKiAgPGxpPnJlY29uY2lsZTwvbGk+Ci0gKiAgPGxpPmdldCBqYXZhIHJlZ2lvbnMgZm9yIGpzcCBzZWxlY3Rpb248L2xpPgotICogIDxsaT5nZXQgYSBKU1AgdGV4dCBlZGl0IGJhc2VkIG9uIGEgSmF2YSB0ZXh0IGVkaXQ8L2xpPgotICogIDxsaT5kZXRlcm1pbmUgaWYgYSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gYSBqc3A6dXNlQmVhbiByYW5nZTwvbGk+Ci0gKiAgPGxpPmRldGVybWluZSBpZiBhIGphdmEgb2Zmc2V0IGZhbGxzIHdpdGhpbiBhIGpzcCBpbXBvcnQgc3RhdG1lbnQ8L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uIGltcGxlbWVudHMgSUpTUFRyYW5zbGF0aW9uIHsKLQkKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWU9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwdHJhbnNsYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogdGhlIG5hbWUgb2YgdGhlIGNsYXNzICh3L291dCBleHRlbnNpb24pICoqLwotCXByaXZhdGUgU3RyaW5nIGZDbGFzc25hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSUphdmFQcm9qZWN0IGZKYXZhUHJvamVjdCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcE1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKc3AySmF2YU1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcEltcG9ydHNNYXAgPSBudWxsOwotCXByaXZhdGUgSGFzaE1hcCBmSmF2YTJKc3BVc2VCZWFuTWFwID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZkphdmEySnNwSW5kaXJlY3RNYXAgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmRUxQcm9ibGVtcyA9IG51bGw7Ci0JCi0JLy8gZG9uJ3Qgd2FudCB0byBob2xkIG9udG8gbW9kZWwgKHZpYSB0cmFuc2xhdG9yKQotCS8vIGFsbCByZWxldmFudCBpbmZvIGlzIGV4dHJhY3RlZCBpbiB0aGUgY29uc3RydWN0b3IuCi0JLy9wcml2YXRlIEpTUFRyYW5zbGF0b3IgZlRyYW5zbGF0b3IgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZKYXZhVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkpzcFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBmQ29tcGlsYXRpb25Vbml0ID0gbnVsbDsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JLyoqIGxvY2sgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBjb21waWxhdGlvbiB1bml0ICoqLwotCXByaXZhdGUgYnl0ZVtdIGZMb2NrID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmTWFuZ2xlZE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkpzcE5hbWU7Ci0KLQlwdWJsaWMgSlNQVHJhbnNsYXRpb24oSUphdmFQcm9qZWN0IGphdmFQcm9qLCBKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQotCQlmTG9jayA9IG5ldyBieXRlWzBdOwotCQlmSmF2YVByb2plY3QgPSBqYXZhUHJvajsKLQkJLy9mVHJhbnNsYXRvciA9IHRyYW5zbGF0b3I7Ci0JCQotCQkvLyBjYW4gYmUgbnVsbCBpZiBpdCdzIGFuIGVtcHR5IGRvY3VtZW50ICh3LyBOdWxsSlNQVHJhbnNsYXRpb24pCi0JCWlmKHRyYW5zbGF0b3IgIT0gbnVsbCkgewotCQkgICAgZkphdmFUZXh0ID0gdHJhbnNsYXRvci5nZXRUcmFuc2xhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCSAgICBmSnNwVGV4dCA9IHRyYW5zbGF0b3IuZ2V0SnNwVGV4dCgpOwotCQkJZkNsYXNzbmFtZSA9IHRyYW5zbGF0b3IuZ2V0Q2xhc3NuYW1lKCk7Ci0JCQlmSmF2YTJKc3BNYXAgPSB0cmFuc2xhdG9yLmdldEphdmEySnNwUmFuZ2VzKCk7Ci0JCQlmSnNwMkphdmFNYXAgPSB0cmFuc2xhdG9yLmdldEpzcDJKYXZhUmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BJbXBvcnRzTWFwID0gdHJhbnNsYXRvci5nZXRKYXZhMkpzcEltcG9ydFJhbmdlcygpOwotCQkJZkphdmEySnNwVXNlQmVhbk1hcCA9IHRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BVc2VCZWFuUmFuZ2VzKCk7Ci0JCQlmSmF2YTJKc3BJbmRpcmVjdE1hcCA9IHRyYW5zbGF0b3IuZ2V0SmF2YTJKc3BJbmRpcmVjdFJhbmdlcygpOwotCQkJZkVMUHJvYmxlbXMgPSB0cmFuc2xhdG9yLmdldEVMUHJvYmxlbXMoKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KCkgewotCQlyZXR1cm4gZkphdmFQcm9qZWN0OwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbiNnZXRKYXZhVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhVGV4dCgpIHsKLQkJLy9yZXR1cm4gKGZUcmFuc2xhdG9yICE9IG51bGwpID8gZlRyYW5zbGF0b3IuZ2V0VHJhbnNsYXRpb24oKS50b1N0cmluZygpIDogIiI7ICAvLyROT04tTkxTLTEkIAotCQlyZXR1cm4gZkphdmFUZXh0OwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEpzcFRleHQoKSB7Ci0JCS8vcmV0dXJuIChmVHJhbnNsYXRvciAhPSBudWxsKSA/IGZUcmFuc2xhdG9yLmdldEpzcFRleHQoKSA6ICIiOyAgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZkpzcFRleHQ7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVBhdGgoKSB7Ci0JCS8vIGNyZWF0ZSBpZiBuZWNlc3NhcnkKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlyZXR1cm4gKGN1ICE9IG51bGwpID8gY3UuZ2V0UGF0aCgpLnRvU3RyaW5nKCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEphdmEgb2Zmc2V0IGZvciBhIGdpdmUgSlNQIG9mZnNldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SmF2YU9mZnNldChpbnQganNwT2Zmc2V0KSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IG9mZnNldEluUmFuZ2UgPSAwOwotCQlQb3NpdGlvbiBqc3BQb3MsIGphdmFQb3MgPSBudWxsOwotCi0JCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqc3AgcmFuZ2VzCi0JCUl0ZXJhdG9yIGl0ID0gZkpzcDJKYXZhTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWpzcFBvcyA9IChQb3NpdGlvbikgaXQubmV4dCgpOwotCQkJLy8gbmVlZCB0byBjb3VudCB0aGUgbGFzdCBwb3NpdGlvbiBhcyBpbmNsdWRlZAotCQkJaWYgKCFqc3BQb3MuaW5jbHVkZXMoanNwT2Zmc2V0KSAmJiAhKGpzcFBvcy5vZmZzZXQranNwUG9zLmxlbmd0aCA9PSBqc3BPZmZzZXQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlvZmZzZXRJblJhbmdlID0ganNwT2Zmc2V0IC0ganNwUG9zLm9mZnNldDsKLQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGZKc3AySmF2YU1hcC5nZXQoanNwUG9zKTsKLQkJCWlmKGphdmFQb3MgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBqYXZhUG9zLm9mZnNldCArIG9mZnNldEluUmFuZ2U7Ci0JCQllbHNlICB7Ci0KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkphdmFQb3NpdGlvbiB3YXMgbnVsbCEiICsganNwT2Zmc2V0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBvZmZzZXQgZm9yIGEgZ2l2ZSBKYXZhIG9mZnNldAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCWludCByZXN1bHQgPSAtMTsKLQkJaW50IG9mZnNldEluUmFuZ2UgPSAwOwotCQlQb3NpdGlvbiBqc3BQb3MsIGphdmFQb3MgPSBudWxsOwotCi0JCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqYXZhIHJhbmdlcwotCQlJdGVyYXRvciBpdCA9IGZKYXZhMkpzcE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlqYXZhUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0JCQlpZiAoIWphdmFQb3MuaW5jbHVkZXMoamF2YU9mZnNldCkgJiYgIShqYXZhUG9zLm9mZnNldCtqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkKLQkJCQljb250aW51ZTsKLQotCQkJb2Zmc2V0SW5SYW5nZSA9IGphdmFPZmZzZXQgLSBqYXZhUG9zLm9mZnNldDsKLQkJCWpzcFBvcyA9IChQb3NpdGlvbikgZkphdmEySnNwTWFwLmdldChqYXZhUG9zKTsKLQkJCQotCQkJaWYoanNwUG9zICE9IG51bGwpCi0JCQkJcmVzdWx0ID0ganNwUG9zLm9mZnNldCArIG9mZnNldEluUmFuZ2U7Ci0JCQllbHNlICB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJqc3BQb3NpdGlvbiB3YXMgbnVsbCEiICsgamF2YU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIFBvc2l0aW9ucyBpbiB0aGUgSmF2YSBkb2N1bWVudCB0byBjb3JyZXNwb25kaW5nIFBvc2l0aW9ucyBpbiB0aGUgSlNQIGRvY3VtZW50Ci0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BNYXAoKSB7Ci0JCXJldHVybiBmSmF2YTJKc3BNYXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBQb3NpdGlvbnMgaW4gdGhlIEpTUCBkb2N1bWVudCB0byBjb3JyZXNwb25kaW5nIFBvc2l0aW9ucyBpbiB0aGUgSmF2YSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEpzcDJKYXZhTWFwKCkgewotCQlyZXR1cm4gZkpzcDJKYXZhTWFwOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIGphdmEgcmFuZ2UgY292ZXJzIG1vcmUgdGhhbiBvbmUgcGFydGl0aW9uIGluIHRoZSBKU1AgZmlsZS4KLQkgKiAKLQkgKiA8cD4KLQkgKiBleC4KLQkgKiA8Y29kZT4KLQkgKiA8JQotCSAqIAlpZihzdWJtaXQpCi0JICogIHsKLQkgKiAlPgotCSAqICAgIDxwPiBwcmludCB0aGlzLi4uPC9wPgotCSAqIAotCSAqIDwlCi0JICogIH0KLQkgKiAgZWxzZQotCSAqICB7Ci0JICogJT4KLQkgKiAJICAgPHA+IHByaW50IHRoYXQuLi48L3A+Ci0JICogPCUKLQkgKiAgfQotCSAqICU+Ci0JICogPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiB0aGUgaWYgZWxzZSBzdGF0ZW1lbnQgYWJvdmUgc3BhbnMgMyBKU1AgcGFydGl0aW9ucywgc28gaXQgd291bGQgcmV0dXJuIHRydWUuCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBqYXZhIGNvZGUgc3BhbnMgbXVsdGlwbGUgSlNQIHBhcnRpdGlvbnMsIG90aGVyd2lzZSBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBqYXZhU3BhbnNNdWx0aXBsZUpzcFBhcnRpdGlvbnMoaW50IGphdmFPZmZzZXQsIGludCBqYXZhTGVuZ3RoKSB7Ci0JCUhhc2hNYXAgamF2YTJqc3AgPSBnZXRKYXZhMkpzcE1hcCgpOwotCQlpbnQgY291bnQgPSAwOwotCQlJdGVyYXRvciBpdCA9IGphdmEyanNwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVBvc2l0aW9uIGphdmFSYW5nZSA9IG51bGw7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJamF2YVJhbmdlID0gKFBvc2l0aW9uKWl0Lm5leHQoKTsKLQkJCWlmKGphdmFSYW5nZS5vdmVybGFwc1dpdGgoamF2YU9mZnNldCwgamF2YUxlbmd0aCkpCi0JCQkJY291bnQrKzsKLQkJCWlmKGNvdW50ID4gMSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIEphdmEgcG9zaXRpb25zIGZvciB0aGUgZ2l2ZW4gcmFuZ2UgaW4gdGhlIEphdmEgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0SmF2YVJhbmdlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpdCA9IGdldEphdmEySnNwTWFwKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJUG9zaXRpb24gcCA9IG51bGw7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJcCA9IChQb3NpdGlvbilpdC5uZXh0KCk7Ci0JCQlpZihwLm92ZXJsYXBzV2l0aChvZmZzZXQsIGxlbmd0aCkpCi0JCQkJcmVzdWx0cy5hZGQocCk7Ci0JCX0KLQkJcmV0dXJuIChQb3NpdGlvbltdKXJlc3VsdHMudG9BcnJheShuZXcgUG9zaXRpb25bcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0JCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBqYXZhIE9mZnNldCBmYWxscyB3aXRoaW4gdGhlIHVzZXIgaW1wb3J0IHJhbmdlcwotCSAqIEBwYXJhbSBqYXZhT2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBqYXZhIE9mZnNldCBmYWxscyB3aXRoaW4gdGhlIHVzZXIgaW1wb3J0IHJhbmdlcywgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbXBvcnQoaW50IGphdmFPZmZzZXQpIHsKLQkJcmV0dXJuIGlzSW5SYW5nZXMoamF2YU9mZnNldCwgZkphdmEySnNwSW1wb3J0c01hcCk7Ci0JfQotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIHRoZSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gdGhlIHVzZSBiZWFuIHJhbmdlcwotCSAqIEBwYXJhbSBqYXZhT2Zmc2V0Ci0JICogQHJldHVybiB0cnVlIGlmIHRoZSBqYXZhIG9mZnNldCBmYWxscyB3aXRoaW4gdGhlIHVzZXIgaW1wb3J0IHJhbmdlcywgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVc2VCZWFuKGludCBqYXZhT2Zmc2V0KSB7Ci0JCXJldHVybiBpc0luUmFuZ2VzKGphdmFPZmZzZXQsIGZKYXZhMkpzcFVzZUJlYW5NYXApOwotCX0KLQkKLQkvKioKLQkgKiBAcGFyYW0gamF2YVBvcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0luZGlyZWN0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCXJldHVybiBpc0luUmFuZ2VzKGphdmFPZmZzZXQsIGZKYXZhMkpzcEluZGlyZWN0TWFwLCBmYWxzZSk7Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0luUmFuZ2VzKGludCBqYXZhT2Zmc2V0LCBIYXNoTWFwIHJhbmdlcykgewotCQlyZXR1cm4gaXNJblJhbmdlcyhqYXZhT2Zmc2V0LCByYW5nZXMsIHRydWUpOwotCX0KLQkvKioKLQkgKiBUZWxscyB5b3UgaWYgdGhlIGdpdmVuIG9mZnNldCBpcyBpbmNsdWRlZCBpbiBhbnkgb2YgdGhlIHJhbmdlcyAoUG9zaXRpb25zKSBwYXNzZWQgaW4uCi0JICogaW5jbHVkZUVuZE9mZnNldCB0ZWxscyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIHRoZSBlbmQgb2Zmc2V0IG9mIGVhY2ggcmFuZ2UgaW4gdGhlIHRlc3QuCi0JICogCi0JICogQHBhcmFtIGphdmFPZmZzZXQKLQkgKiBAcGFyYW0gcmFuZ2VzCi0JICogQHBhcmFtIGluY2x1ZGVFbmRPZmZzZXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5SYW5nZXMoaW50IGphdmFPZmZzZXQsIEhhc2hNYXAgcmFuZ2VzLCBib29sZWFuIGluY2x1ZGVFbmRPZmZzZXQpIHsKLQkJCi0JCUl0ZXJhdG9yIGl0ID0gcmFuZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0Lmhhc05leHQoKSkgewotCQkJUG9zaXRpb24gamF2YVBvcyA9IChQb3NpdGlvbilpdC5uZXh0KCk7Ci0JCQkvLyBhbHNvIGluY2x1ZGUgdGhlIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0IChvbmx5IGlmIHJlcXVlc3RlZCkKLQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTY4NwotCQkJaWYoamF2YVBvcy5pbmNsdWRlcyhqYXZhT2Zmc2V0KSB8fCAoaW5jbHVkZUVuZE9mZnNldCAmJiBqYXZhUG9zLm9mZnNldCtqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkgCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgSmF2YSBDb21waWxhdGlvblVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgSlNQVHJhbnNsYXRpb24gKHRoaXMgcGFydGljdWxhciBtb2RlbCkKLQkgKiBXaGVuIHVzaW5nIG1ldGhvZHMgb24gdGhlIENVLCBpdCdzIHJlY2NvbWVuZGVkIHRvIHN5bmNocm9uaXplIG9uIHRoZSBDVSBmb3IgcmVsaWFibGUKLQkgKiByZXN1bHRzLgotCSAqIAotCSAqIFRoZSBtZXRob2QgaXMgc3luY2hyb25pemVkIHRvIGVuc3VyZSB0aGF0IDxjb2RlPmNyZWF0ZUNvbXBsaWxhdGlvblVuaXQ8L2NvZGU+IGRvZXNuJ3QKLQkgKiBnZXQgZW50ZXJlZCAyIG9yIG1vcmUgdGltZXMgc2ltdWx0YW5lb3VzbHkuICBBIHNpZGUgZWZmZWN0IG9mIHRoYXQgaXMgMiBjb21waWxhdGlvbiB1bml0cwotCSAqIGNhbiBiZSBjcmVhdGVkIGluIHRoZSBKYXZhTW9kZWxNYW5hZ2VyLCBidXQgd2Ugb25seSBob2xkIG9uZSByZWZlcmVuY2UgdG8gaXQgaW4gCi0JICogZkNvbXBpbGF0aW9uVW5pdC4gIFRoaXMgd291bGQgbGVhZCB0byBhIGxlYWsgc2luY2Ugb25seSBvbmUgaW5zdGFuY2Ugb2YgdGhlIENVIGlzCi0JICogZGlzY2FyZGVkIGluIHRoZSA8Y29kZT5yZWxlYXNlKCk8L2NvZGU+IG1ldGhvZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgQ29tcGlsYXRpb25Vbml0IHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbXBpbGF0aW9uVW5pdCBnZXRDb21waWxhdGlvblVuaXQoKSB7Ci0JCXN5bmNocm9uaXplZChmTG9jaykgewotCQkJdHJ5IHsKLQkJCQlpZiAoZkNvbXBpbGF0aW9uVW5pdCA9PSBudWxsKSB7Ci0JCQkJCWZDb21waWxhdGlvblVuaXQgPSBjcmVhdGVDb21waWxhdGlvblVuaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGptZSkgewotCQkJCWlmKERFQlVHKQotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJlcnJvciBjcmVhdGluZyBKU1Agd29ya2luZyBjb3B5Li4uICIsIGptZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbXBpbGF0aW9uVW5pdDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNYW5nbGVkTmFtZSgpIHsKLQkJcmV0dXJuIGZNYW5nbGVkTmFtZTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHNldE1hbmdsZWROYW1lKFN0cmluZyBtYW5nbGVkTmFtZSkgewotCQlmTWFuZ2xlZE5hbWUgPSBtYW5nbGVkTmFtZTsKLQl9Ci0JcHJpdmF0ZSBTdHJpbmcgZ2V0SnNwTmFtZSgpIHsKLQkJcmV0dXJuIGZKc3BOYW1lOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRKc3BOYW1lKFN0cmluZyBqc3BOYW1lKSB7Ci0JCWZKc3BOYW1lID0ganNwTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBtYW5nbGVkIChzZXJ2bGV0KSBuYW1lIHdpdGgganNwIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlzcGxheVN0cmluZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGZpeHVwTWFuZ2xlZE5hbWUoU3RyaW5nIGRpc3BsYXlTdHJpbmcpIHsKLQkJCi0JCWlmKGRpc3BsYXlTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkKLQkJaWYoZ2V0SnNwTmFtZSgpID09IG51bGwgfHwgZ2V0TWFuZ2xlZE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkvLyBuYW1lcyBub3Qgc2V0IHlldAotCQkJaW5pdEpzcEFuZFNlcnZsZXROYW1lcygpOwotCQl9Ci0JCXJldHVybiBkaXNwbGF5U3RyaW5nLnJlcGxhY2VBbGwoZ2V0TWFuZ2xlZE5hbWUoKSwgZ2V0SnNwTmFtZSgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEpzcEFuZFNlcnZsZXROYW1lcygpIHsKLQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQlpZihjdSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY3VOYW1lID0gbnVsbDsKLQkJCXN5bmNocm9uaXplZChjdSkgewotCQkJCS8vIHNldCBzb21lIG5hbWVzIGZvciBmaXhpbmcgdXAgbWFuZ2xlZCBuYW1lIGluIHByb3Bvc2FscwotCQkJCS8vIHNldCBtYW5nbGVkIChzZXJ2bGV0KSBuYW1lCi0JCQkJIGN1TmFtZSA9IGN1LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpOwotCQkJfQotCQkJaWYoY3VOYW1lICE9IG51bGwpIHsKLQkJCQlzZXRNYW5nbGVkTmFtZShjdU5hbWUuc3Vic3RyaW5nKDAsIGN1TmFtZS5sYXN0SW5kZXhPZignLicpKSk7Ci0JCQkJLy8gc2V0IG5hbWUgb2YganNwIGZpbGUKLQkJCQlTdHJpbmcgdW5tYW5nbGVkID0gSlNQMlNlcnZsZXROYW1lVXRpbC51bm1hbmdsZShjdU5hbWUpOwotCQkJCXNldEpzcE5hbWUodW5tYW5nbGVkLnN1YnN0cmluZyh1bm1hbmdsZWQubGFzdEluZGV4T2YoJy8nKSArIDEsIHVubWFuZ2xlZC5sYXN0SW5kZXhPZignLicpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkKLQkvKioKLQkgKiBPcmlnaW5hbGx5IGZyb20gUmVjb25jaWxlU3RlcEZvckphdmEuICBDcmVhdGVzIGFuIElDb21waWxhdGlvblVuaXQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIElDb21waWxhdGlvblVuaXQgZnJvbSB0aGUgY29udGVudHMgb2YgdGhlIEpTUCBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSUNvbXBpbGF0aW9uVW5pdCBjcmVhdGVDb21waWxhdGlvblVuaXQoKSB0aHJvd3MgSmF2YU1vZGVsRXhjZXB0aW9uIHsKLQkJCi0JCUlQYWNrYWdlRnJhZ21lbnQgcGFja2FnZUZyYWdtZW50ID0gbnVsbDsKLQkJSUphdmFFbGVtZW50IGplID0gZ2V0SmF2YVByb2plY3QoKTsKLQotCQlpZiAoamUgPT0gbnVsbCB8fCAhamUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzd2l0Y2ggKGplLmdldEVsZW1lbnRUeXBlKCkpIHsKLQkJCWNhc2UgSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlQgOgotCQkJCWplID0gamUuZ2V0UGFyZW50KCk7Ci0JCQkvLyBmYWxsIHRocm91Z2gKLQotCQkJY2FzZSBJSmF2YUVsZW1lbnQuUEFDS0FHRV9GUkFHTUVOVF9ST09UIDoKLQkJCQlJUGFja2FnZUZyYWdtZW50Um9vdCBwYWNrYWdlRnJhZ21lbnRSb290ID0gKElQYWNrYWdlRnJhZ21lbnRSb290KSBqZTsKLQkJCQlwYWNrYWdlRnJhZ21lbnQgPSBwYWNrYWdlRnJhZ21lbnRSb290LmdldFBhY2thZ2VGcmFnbWVudChJUGFja2FnZUZyYWdtZW50Um9vdC5ERUZBVUxUX1BBQ0tBR0VST09UX1BBVEgpOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QgOgotCQkJCUlKYXZhUHJvamVjdCBqUHJvamVjdCA9IChJSmF2YVByb2plY3QpIGplOwotCi0JCQkJaWYgKCFqUHJvamVjdC5leGlzdHMoKSkgewotCQkJCQlpZihERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBBYm9ydCBjcmVhdGUgd29ya2luZyBjb3B5OiBjYW5ub3QgY3JlYXRlIHdvcmtpbmcgY29weTogSlNQIGlzIG5vdCBpbiBhIEphdmEgcHJvamVjdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcGFja2FnZUZyYWdtZW50Um9vdCA9IG51bGw7Ci0JCQkJSVBhY2thZ2VGcmFnbWVudFJvb3RbXSBwYWNrYWdlRnJhZ21lbnRSb290cyA9IGpQcm9qZWN0LmdldFBhY2thZ2VGcmFnbWVudFJvb3RzKCk7Ci0JCQkJaW50IGkgPSAwOwotCQkJCXdoaWxlIChpIDwgcGFja2FnZUZyYWdtZW50Um9vdHMubGVuZ3RoKSB7Ci0JCQkJCWlmICghcGFja2FnZUZyYWdtZW50Um9vdHNbaV0uaXNBcmNoaXZlKCkgJiYgIXBhY2thZ2VGcmFnbWVudFJvb3RzW2ldLmlzRXh0ZXJuYWwoKSkgewotCQkJCQkJcGFja2FnZUZyYWdtZW50Um9vdCA9IHBhY2thZ2VGcmFnbWVudFJvb3RzW2ldOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaSsrOwotCQkJCX0KLQkJCQlpZiAocGFja2FnZUZyYWdtZW50Um9vdCA9PSBudWxsKSB7Ci0JCQkJCWlmKERFQlVHKSB7Ci0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqIEFib3J0IGNyZWF0ZSB3b3JraW5nIGNvcHk6IGNhbm5vdCBjcmVhdGUgd29ya2luZyBjb3B5OiBKU1AgaXMgbm90IGluIGEgSmF2YSBwcm9qZWN0IHdpdGggc291cmNlIHBhY2thZ2UgZnJhZ21lbnQgcm9vdCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJCXBhY2thZ2VGcmFnbWVudCA9IHBhY2thZ2VGcmFnbWVudFJvb3QuZ2V0UGFja2FnZUZyYWdtZW50KElQYWNrYWdlRnJhZ21lbnRSb290LkRFRkFVTFRfUEFDS0FHRVJPT1RfUEFUSCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCQotCQlJQ29tcGlsYXRpb25Vbml0IGN1ID0gcGFja2FnZUZyYWdtZW50LmdldENvbXBpbGF0aW9uVW5pdChnZXRDbGFzc25hbWUoKSArICIuamF2YSIpLmdldFdvcmtpbmdDb3B5KGdldFdvcmtpbmdDb3B5T3duZXIoKSwgZ2V0UHJvYmxlbVJlcXVlc3RvcigpLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0Q29udGVudHMoY3UpOwotCi0JCWlmKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIisrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIoKykgSlNQVHJhbnNsYXRpb24gWyIrIHRoaXMgKyAiXSBmaW5pc2hlZCBjcmVhdGluZyBDb21waWxhdGlvblVuaXQ6ICIgKyBjdSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkKLQkJcmV0dXJuIGN1OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHByb2JsZW0gcmVxdWVzdG9yIGZvciB0aGUgQ29tcGlsYXRpb25Vbml0IGluIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIEpTUFByb2JsZW1SZXF1ZXN0b3IgZ2V0UHJvYmxlbVJlcXVlc3RvcigpIHsKLQkgICAgcmV0dXJuIENvbXBpbGF0aW9uVW5pdEhlbHBlci5nZXRJbnN0YW5jZSgpLmdldFByb2JsZW1SZXF1ZXN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBJV29ya2luZ0NvcHlPd25lciBmb3IgdGhpcyBDb21waWxhdGlvblVuaXQgaW4gdGhpcyBKU1BUcmFuc2xhdGlvbgotCSAqLwotCXB1YmxpYyBXb3JraW5nQ29weU93bmVyIGdldFdvcmtpbmdDb3B5T3duZXIoKSB7Ci0JICAgIHJldHVybiBDb21waWxhdGlvblVuaXRIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRXb3JraW5nQ29weU93bmVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgcHJvZ3Jlc3MgbW9uaXRvciB1c2VkIGluIGxvbmcgb3BlcmF0aW9ucyAocmVjb25jaWxlLCBjcmVhdGluZyB0aGUgQ29tcGlsYXRpb25Vbml0Li4uKSBpbiB0aGlzIEpTUFRyYW5zbGF0aW9uCi0JICovCi0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCkKLQkJCWZQcm9ncmVzc01vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQlyZXR1cm4gZlByb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBMaXN0IG9mIHByb2JsZW1zIGNvbGxlY3RlZCBkdXJpbmcgcmVjb25jaWxlIG9mIHRoZSBjb21waWxhdGlvbiB1bml0Ci0JICovCi0JcHVibGljIExpc3QgZ2V0UHJvYmxlbXMoKSB7Ci0JCUxpc3QgcHJvYmxlbXMgPSBnZXRQcm9ibGVtUmVxdWVzdG9yKCkuZ2V0Q29sbGVjdGVkUHJvYmxlbXMoKTsKLQkJcmV0dXJuIHByb2JsZW1zICE9IG51bGwgPyBwcm9ibGVtcyA6IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHJldHVybiB0aGUgTGlzdCBvZiBwcm9ibGVtcyBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZSBvZiB0aGUgY29tcGlsYXRpb24gdW5pdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVMUHJvYmxlbXMoKSB7Ci0JCXJldHVybiBmRUxQcm9ibGVtcyAhPSBudWxsID8gZkVMUHJvYmxlbXMgOiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0KLQkvKioKLQkgKiBNdXN0IGJlIHNldCB0cnVlIGluIG9yZGVyIGZvciBwcm9ibGVtcyB0byBiZSBjb2xsZWN0ZWQgZHVyaW5nIHJlY29uY2lsZS4KLQkgKiBJZiBzZXQgZmFsc2UsIHByb2JsZW1zIHdpbGwgYmUgaWdub3JlZCBkdXJpbmcgcmVjb25jaWxlLgotCSAqIEBwYXJhbSBjb2xsZWN0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvYmxlbUNvbGxlY3RpbmdBY3RpdmUoYm9vbGVhbiBjb2xsZWN0KSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYoY3UgIT0gbnVsbCkgewkKLQkJCWdldFByb2JsZW1SZXF1ZXN0b3IoKS5zZXRJc0FjdGl2ZShjb2xsZWN0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY29uY2lsZXMgdGhlIGNvbXBpbGF0aW9uIHVuaXQgZm9yIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGVDb21waWxhdGlvblVuaXQoKSB7Ci0JCUlDb21waWxhdGlvblVuaXQgY3UgPSBnZXRDb21waWxhdGlvblVuaXQoKTsKLQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25pemVkKGN1KSB7Ci0JCQkJCWN1Lm1ha2VDb25zaXN0ZW50KGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQkJY3UucmVjb25jaWxlKElDb21waWxhdGlvblVuaXQuTk9fQVNULCB0cnVlLCBnZXRXb3JraW5nQ29weU93bmVyKCksIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IGNvbnRlbnRzIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IHRvIHRoZSB0cmFuc2xhdGVkIGpzcCB0ZXh0LgotCSAqIEBwYXJhbSB0aGUgSUNvbXBpbGF0aW9uVW5pdCBvbiB3aGljaCB0byBzZXQgdGhlIGJ1ZmZlciBjb250ZW50cwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDb250ZW50cyhJQ29tcGlsYXRpb25Vbml0IGN1KSB7Ci0JCWlmIChjdSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJc3luY2hyb25pemVkIChjdSkgewotCQkJSUJ1ZmZlciBidWZmZXI7Ci0JCQl0cnkgewotCQkJCQotCQkJCWJ1ZmZlciA9IGN1LmdldEJ1ZmZlcigpOwotCQkJfQotCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlidWZmZXIgPSBudWxsOwotCQkJfQotCQotCQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJCWJ1ZmZlci5zZXRDb250ZW50cyhnZXRKYXZhVGV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElKYXZhRWxlbWVudHMgY29ycmVzcG9uZGluZyB0byB0aGUgSlNQIHJhbmdlIGluIHRoZSBKU1AgU3RydWN0dXJlZERvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGpzcFN0YXJ0IHN0YXJpbmcgb2Zmc2V0IGluIHRoZSBKU1AgZG9jdW1lbnQKLQkgKiBAcGFyYW0ganNwRW5kIGVuZGluZyBvZmZzZXQgaW4gdGhlIEpTUCBkb2N1bWVudAotCSAqIEByZXR1cm4gSUphdmFFbGVtZW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZSBKU1Agc2VsZWN0aW9uCi0JICovCi0JcHVibGljIElKYXZhRWxlbWVudFtdIGdldEVsZW1lbnRzRnJvbUpzcFJhbmdlKGludCBqc3BTdGFydCwgaW50IGpzcEVuZCkgewotCi0JCWludCBqYXZhUG9zaXRpb25TdGFydCA9IGdldEphdmFPZmZzZXQoanNwU3RhcnQpOwotCQlpbnQgamF2YVBvc2l0aW9uRW5kID0gZ2V0SmF2YU9mZnNldChqc3BFbmQpOwotCi0JCUlKYXZhRWxlbWVudFtdIEVNVFBZX1JFU1VMVF9TRVQgPSBuZXcgSUphdmFFbGVtZW50WzBdOwotCQlJSmF2YUVsZW1lbnRbXSByZXN1bHQgPSBFTVRQWV9SRVNVTFRfU0VUOwotCQl0cnkgewotCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IGdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQkJCWludCBjdURvY0xlbmd0aCA9IGN1LmdldEJ1ZmZlcigpLmdldExlbmd0aCgpOwotCQkJCQlpbnQgamF2YUxlbmd0aCA9IGphdmFQb3NpdGlvbkVuZCAtIGphdmFQb3NpdGlvblN0YXJ0OwotCQkJCQlpZiAoY3VEb2NMZW5ndGggPiAwICYmIGphdmFQb3NpdGlvblN0YXJ0ID49IDAgJiYgamF2YUxlbmd0aCA+PSAwICYmIGphdmFQb3NpdGlvbkVuZCA8IGN1RG9jTGVuZ3RoKSB7Ci0JCQkJCQlyZXN1bHQgPSBjdS5jb2RlU2VsZWN0KGphdmFQb3NpdGlvblN0YXJ0LCBqYXZhTGVuZ3RoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHJlc3VsdCA9PSBudWxsIHx8IHJlc3VsdC5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm4gRU1UUFlfUkVTVUxUX1NFVDsKLQkJfQotCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIHgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oeCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NuYW1lKCkgewotCQlyZXR1cm4gZkNsYXNzbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBNdXN0IGRpc2NhcmQgY29tcGlsYXRpb24gdW5pdCwgb3IgZWxzZSB0aGV5IGNhbiBsZWFrIGluIHRoZSBKYXZhTW9kZWxNYW5hZ2VyCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJCi0JCXN5bmNocm9uaXplZChmTG9jaykgewotCQkJaWYoZkNvbXBpbGF0aW9uVW5pdCAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKC0pIEpTUFRyYW5zbGF0aW9uIFsiICsgdGhpcyArIl0gZGlzY2FyZGluZyBDb21waWxhdGlvblVuaXQ6ICIgKyBmQ29tcGlsYXRpb25Vbml0KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZkNvbXBpbGF0aW9uVW5pdC5kaXNjYXJkV29ya2luZ0NvcHkoKTsJCi0JCQkJfSAKLQkJCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gd2UncmUgZG9uZSB3LyBpdCBhbnl3YXkKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGJhMjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0vKioKLSAqIEFuIGFkYXB0ZXIgZm9yIGdldHRpbmcgYSBKU1BUcmFuc2xhdGlvbiBvZiB0aGUgZG9jdW1lbnQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIsIElEb2N1bWVudExpc3RlbmVyIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkpzcERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmSmF2YURvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGZKU1BUcmFuc2xhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZEb2N1bWVudElzRGlydHkgPSB0cnVlOwotCXByaXZhdGUgSURPTU1vZGVsIGZYTUxNb2RlbDsKLQlwcml2YXRlIEpTUFRyYW5zbGF0b3IgZlRyYW5zbGF0b3IgPSBudWxsOwotCXByaXZhdGUgTnVsbFByb2dyZXNzTW9uaXRvciBmVHJhbnNsYXRpb25Nb25pdG9yID0gbnVsbDsKLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIoSURPTU1vZGVsIHhtbE1vZGVsKSB7Ci0JCXNldFhNTE1vZGVsKHhtbE1vZGVsKTsKLQkJaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgcmVxdWlyZWQgSmF2YSBQbHVnaW5zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCkgewotCQlKYXZhQ29yZS5nZXRQbHVnaW4oKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlLmVxdWFscyhJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoqCi0JICogQXV0b21hdGljYWxseSBzZXQgdGhyb3VnaCB0aGUgc2V0WE1MTW9kZWwoWE1MTW9kZWwpCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqLwotCXByaXZhdGUgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChmSnNwRG9jdW1lbnQgIT0gbnVsbCkKLQkJCWZKc3BEb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWRvYy5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQkJZkpzcERvY3VtZW50ID0gZG9jOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCS8vIG1hcmsgdHJhbnNsYXRpb24gZm9yIHJlYnVpbGRpbmcKLQkJZkRvY3VtZW50SXNEaXJ0eSA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQotCQlpZiAoZkpzcERvY3VtZW50ICE9IG51bGwpCi0JCQlmSnNwRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQotCQlpZiAoZlRyYW5zbGF0aW9uTW9uaXRvciAhPSBudWxsKQotCQkJZlRyYW5zbGF0aW9uTW9uaXRvci5zZXRDYW5jZWxlZCh0cnVlKTsKLQotCQlpZiAoZkpTUFRyYW5zbGF0aW9uICE9IG51bGwpIHsKLQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQVHJhbnNsYXRpb25BZGFwdGVyIHJlbGVhc2luZzoiICsgZkpTUFRyYW5zbGF0aW9uKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlmSlNQVHJhbnNsYXRpb24ucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSlNQVHJhbnNsYXRpb24gZm9yIHRoaXMgYWRhcHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGdldEpTUFRyYW5zbGF0aW9uKCkgewotCi0JCWlmIChmSlNQVHJhbnNsYXRpb24gPT0gbnVsbCB8fCBmRG9jdW1lbnRJc0RpcnR5KSB7Ci0JCQlKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBudWxsOwotCQkJaWYgKGdldFhNTE1vZGVsKCkgIT0gbnVsbCAmJiBnZXRYTUxNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oMCkgIT0gbnVsbCkgewotCQkJCXRyYW5zbGF0b3IgPSBnZXRUcmFuc2xhdG9yKChJRE9NTm9kZSkgZ2V0WE1MTW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJCQl0cmFuc2xhdG9yLnRyYW5zbGF0ZSgpOwotCQkJCVN0cmluZ0J1ZmZlciBqYXZhQ29udGVudHMgPSB0cmFuc2xhdG9yLmdldFRyYW5zbGF0aW9uKCk7Ci0JCQkJZkphdmFEb2N1bWVudCA9IG5ldyBEb2N1bWVudChqYXZhQ29udGVudHMudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBlbXB0eSBkb2N1bWVudCBjYXNlCi0JCQkJdHJhbnNsYXRvciA9IG5ldyBKU1BUcmFuc2xhdG9yKCk7Ci0JCQkJU3RyaW5nQnVmZmVyIGVtcHR5Q29udGVudHMgPSB0cmFuc2xhdG9yLmdldEVtcHR5VHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YURvY3VtZW50ID0gbmV3IERvY3VtZW50KGVtcHR5Q29udGVudHMudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQkvLyBpdCdzIGdvaW5nIHRvIGJlIHJlYnVpbHQsIHNvIHdlIHJlbGVhc2UgaXQgaGVyZQotCQkJaWYgKGZKU1BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUFRyYW5zbGF0aW9uQWRhcHRlciByZWxlYXNpbmc6IiArIGZKU1BUcmFuc2xhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQlmSlNQVHJhbnNsYXRpb24ucmVsZWFzZSgpOwotCQkJfQotCQkJZkpTUFRyYW5zbGF0aW9uID0gbmV3IEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uKGdldFhNTE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGZKYXZhRG9jdW1lbnQsIGdldEphdmFQcm9qZWN0KCksIHRyYW5zbGF0b3IpOwotCQkJZkRvY3VtZW50SXNEaXJ0eSA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBmSlNQVHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSlNQVHJhbnNsYXRvciBmb3IgdGhpcyBhZGFwdGVyLiBJZiBpdCdzIG51bGwsIGEgbmV3Ci0JICogdHJhbnNsYXRvciBpcyBjcmVhdGVkIHdpdGggdGhlIHhtbE5vZGUuIE90aGVyd2lzZSB0aGUKLQkgKiB0cmFuc2xhdG9yLnJlc2V0KHhtbE5vZGUpIGlzIGNhbGxlZCB0byByZXNldCB0aGUgY3VycmVudCBsb2NhbAotCSAqIHRyYW5zbGF0b3IuCi0JICogCi0JICogQHBhcmFtIHhtbE5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBub2RlIG9mIHRoZSBKU1AgZG9jdW1lbnQgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEByZXR1cm4gdGhlIEpTUFRyYW5zbGF0b3IgZm9yIHRoaXMgYWRhcHRlciAoY3JlYXRlcyBpZiBudWxsKQotCSAqLwotCXByaXZhdGUgSlNQVHJhbnNsYXRvciBnZXRUcmFuc2xhdG9yKElET01Ob2RlIHhtbE5vZGUpIHsKLQkJaWYgKGZUcmFuc2xhdG9yID09IG51bGwpIHsKLQkJCWZUcmFuc2xhdGlvbk1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQkJZlRyYW5zbGF0b3IgPSBuZXcgSlNQVHJhbnNsYXRvcigpOwotCQkJZlRyYW5zbGF0b3IucmVzZXQoeG1sTm9kZSwgZlRyYW5zbGF0aW9uTW9uaXRvcik7Ci0JCX0KLQkJZWxzZQotCQkJZlRyYW5zbGF0b3IucmVzZXQoeG1sTm9kZSwgZlRyYW5zbGF0aW9uTW9uaXRvcik7Ci0JCXJldHVybiBmVHJhbnNsYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBzZXQgdGhlIFhNTE1vZGVsIGZvciB0aGlzIGFkYXB0ZXIuIE11c3QgYmUgY2FsbGVkLgotCSAqIAotCSAqIEBwYXJhbSB4bWxNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsKElET01Nb2RlbCB4bWxNb2RlbCkgewotCQlmWE1MTW9kZWwgPSB4bWxNb2RlbDsKLQkJc2V0RG9jdW1lbnQoZlhNTE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBYTUxNb2RlbCBmb3IgdGhpcyBhZGFwdGVyLgotCSAqLwotCXByaXZhdGUgSURPTU1vZGVsIGdldFhNTE1vZGVsKCkgewotCQlyZXR1cm4gZlhNTE1vZGVsOwotCX0KLQotCS8qKgotCSAqIEdldHMgKG9yIGNyZWF0ZXMgdmlhIEphdmFDb3JlKSBhIEphdmFQcm9qZWN0IGJhc2VkIG9uIHRoZSBsb2NhdGlvbiBvZgotCSAqIHRoaXMgYWRhcHRlcidzIFhNTE1vZGVsLiBSZXR1cm5zIG51bGwgZm9yIG5vbiBJRmlsZSBiYXNlZCBtb2RlbHMuCi0JICogCi0JICogQHJldHVybiB0aGUgamF2YSBwcm9qZWN0IHdoZXJlCi0JICovCi0JcHVibGljIElKYXZhUHJvamVjdCBnZXRKYXZhUHJvamVjdCgpIHsKLQotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBudWxsOwotCQl0cnkgewotCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IGdldFhNTE1vZGVsKCkuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkvLyAyMDA0MTEyOSAocGEpIHRoZSBiYXNlIGxvY2F0aW9uIGNoYW5nZWQgZm9yIFhNTCBtb2RlbAotCQkJLy8gYmVjYXVzZSBvZiBGaWxlQnVmZmVycywgc28gdGhpcyBjb2RlIGhhZCB0byBiZSB1cGRhdGVkCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9Nzk2ODYKLQkJCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkJSVBhdGggZmlsZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAwKSB7Ci0JCQkJcHJvamVjdCA9IHJvb3QuZ2V0UHJvamVjdChmaWxlUGF0aC5zZWdtZW50KDApKTsKLQkJCX0KLS8vCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoYmFzZUxvY2F0aW9uKSk7Ci0vLwkJCWZvciAoaW50IGkgPSAwOyBwcm9qZWN0ID09IG51bGwgJiYgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQlpZiAoZmlsZXNbaV0uZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0vLwkJCQkJcHJvamVjdCA9IGZpbGVzW2ldLmdldFByb2plY3QoKTsKLS8vCQkJCQlicmVhazsKLS8vCQkJCX0KLS8vCQkJfQotCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCWphdmFQcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHByb2plY3QpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCWlmIChnZXRYTUxNb2RlbCgpICE9IG51bGwpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgcHJvYmxlbSBnZXR0aW5nIGphdmEgcHJvamVjdCBmcm9tIHRoZSBYTUxNb2RlbCdzIGJhc2VMb2NhdGlvbiA+ICIgKyBnZXRYTUxNb2RlbCgpLmdldEJhc2VMb2NhdGlvbigpLCBleCk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCIoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBwcm9ibGVtIGdldHRpbmcgamF2YSBwcm9qZWN0IiwgZXgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGphdmFQcm9qZWN0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0YjE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICogIAotICovCi1wdWJsaWMgY2xhc3MgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgZkFkYXB0ZXIgPSBudWxsOwotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUc9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcihJSlNQVHJhbnNsYXRpb24uY2xhc3MsIHRydWUpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgSURPTU5vZGUgJiYgZkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJZkFkYXB0ZXIgPSBuZXcgSlNQVHJhbnNsYXRpb25BZGFwdGVyKCgoSURPTU5vZGUpIHRhcmdldCkuZ2V0TW9kZWwoKSk7Ci0JCQlpZihERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgWyIgKyB0aGlzICsgIl0gY3JlYXRlZCBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkFkYXB0ZXI7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkFkYXB0ZXIgIT0gbnVsbCkgewotCQkJaWYoREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigtKSBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5IFsiICsgdGhpcyArICJdIHJlbGVhc2luZyBhZGFwdGVyOiAiICsgZkFkYXB0ZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDExY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlVuZG9FZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLQotLyoqCi0gKiBBZGRzIHRoZSBub3Rpb24gb2YgSURvY3VtZW50cyAoanNwIERvY3VtZW50IGFuZCBqYXZhIERvY3VtZW50KSBVc2VkIGZvcgotICogVGV4dEVkaXQgdHJhbnNsYXRpb24KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uIGV4dGVuZHMgSlNQVHJhbnNsYXRpb24gewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBqdXN0IGEgY29udmVuaWVuY2UgZGF0YSBzdHJ1Y3R1cmUKLQkvLyB0byBrZWVwIHRyYWNrIG9mIGphdmEgcG9zaXRpb24gZGVsdGFzCi0JcHJpdmF0ZSBjbGFzcyBQb3NpdGlvbkRlbHRhIHsKLQotCQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQgPSBmYWxzZTsKLQkJcHVibGljIGludCBwcmVPZmZzZXQgPSAwOwotCQlwdWJsaWMgaW50IHByZUxlbmd0aCA9IDA7Ci0JCXB1YmxpYyBpbnQgcG9zdE9mZnNldCA9IDA7Ci0JCXB1YmxpYyBpbnQgcG9zdExlbmd0aCA9IDA7Ci0KLQkJcHVibGljIFBvc2l0aW9uRGVsdGEoaW50IHByZU9mZnNldCwgaW50IHByZUxlbmd0aCkgewotCQkJdGhpcy5wcmVPZmZzZXQgPSBwcmVPZmZzZXQ7Ci0JCQl0aGlzLnByZUxlbmd0aCA9IHByZUxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFBvc3RFZGl0RGF0YShpbnQgcG9zdE9mZnNldCwgaW50IHBvc3RMZW5ndGgsIGJvb2xlYW4gaXNEZWxldGVkKSB7Ci0JCQl0aGlzLnBvc3RPZmZzZXQgPSBwb3N0T2Zmc2V0OwotCQkJdGhpcy5wb3N0TGVuZ3RoID0gcG9zdExlbmd0aDsKLQkJCXRoaXMuaXNEZWxldGVkID0gaXNEZWxldGVkOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkpzcERvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmSmF2YURvY3VtZW50ID0gbnVsbDsKLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbihJRG9jdW1lbnQganNwRG9jdW1lbnQsIElEb2N1bWVudCBqYXZhRG9jdW1lbnQsIElKYXZhUHJvamVjdCBqYXZhUHJvaiwgSlNQVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKGphdmFQcm9qLCB0cmFuc2xhdG9yKTsKLQkJZkpzcERvY3VtZW50ID0ganNwRG9jdW1lbnQ7Ci0JCWZKYXZhRG9jdW1lbnQgPSBqYXZhRG9jdW1lbnQ7Ci0KLQkJLy8gbWFrZSBzdXJlIHBvc2l0aW9ucyBhcmUgYWRkZWQgdG8gSmF2YSBhbmQgSlNQIGRvY3VtZW50cwotCQkvLyB0aGlzIGlzIG5lY2Vzc2FyeSBmb3IgdGV4dCBlZGl0cwotCQlhZGRQb3NpdGlvbnNUb0RvY3VtZW50cygpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0SnNwRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmSnNwRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBnZXRKYXZhRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmSmF2YURvY3VtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiBnZXRKYXZhRG9jdW1lbnQoKSAhPSBudWxsID8gZ2V0SmF2YURvY3VtZW50KCkuZ2V0KCkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb3JyZXNwb25kaW5nIFRleHRFZGl0IGZvciB0aGUgSlNQIGZpbGUgZ2l2ZW4gYSBUZXh0RWRpdCBmb3IKLQkgKiBhIEphdmEgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gamF2YUVkaXQKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBlZGl0cyAobm90IGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50IHlldCkKLQkgKi8KLQlwdWJsaWMgVGV4dEVkaXQgZ2V0SnNwRWRpdChUZXh0RWRpdCBqYXZhRWRpdCkgewotCi0JCWlmIChqYXZhRWRpdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTGlzdCBqc3BFZGl0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpbnQgb2Zmc2V0ID0gamF2YUVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBqYXZhRWRpdC5nZXRMZW5ndGgoKTsKLQotCQlpZiAoamF2YUVkaXQgaW5zdGFuY2VvZiBNdWx0aVRleHRFZGl0ICYmIGphdmFFZGl0LmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCi0JCQlJUmVnaW9uIHIgPSBUZXh0RWRpdC5nZXRDb3ZlcmFnZShnZXRBbGxFZGl0cyhqYXZhRWRpdCkpOwotCQkJb2Zmc2V0ID0gci5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHIuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvLyBnZXQgamF2YSByYW5nZXMgdGhhdCB3aWxsIGJlIGFmZmVjdGVkIGJ5IHRoZSBlZGl0Ci0JCVBvc2l0aW9uW10gamF2YVBvc2l0aW9ucyA9IGdldEphdmFSYW5nZXMob2Zmc2V0LCBsZW5ndGgpOwotCi0JCS8vIHJlY29yZCBwb3NpdGlvbiBkYXRhIGJlZm9yZSB0aGUgY2hhbmdlCi0JCVBvc2l0aW9uW10ganNwUG9zaXRpb25zID0gbmV3IFBvc2l0aW9uW2phdmFQb3NpdGlvbnMubGVuZ3RoXTsKLQkJUG9zaXRpb25EZWx0YVtdIGRlbHRhcyA9IG5ldyBQb3NpdGlvbkRlbHRhW2phdmFQb3NpdGlvbnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhUG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWx0YXNbaV0gPSBuZXcgUG9zaXRpb25EZWx0YShqYXZhUG9zaXRpb25zW2ldLm9mZnNldCwgamF2YVBvc2l0aW9uc1tpXS5sZW5ndGgpOwotCQkJLy8gaXNJbmRpcmVjdCBtZWFucyB0aGUgcG9zaXRpb24gZG9lc24ndCBhY3R1YWxseSBleGlzdCBhcyBleGFjdAotCQkJLy8gdGV4dAotCQkJLy8gbWFwcGluZyBmcm9tIGphdmEgPC0+IGpzcCAoZWcuIGFuIGltcG9ydCBzdGF0ZW1lbnQpCi0JCQlpZiAoIWlzSW5kaXJlY3QoamF2YVBvc2l0aW9uc1tpXS5vZmZzZXQpKQotCQkJCWpzcFBvc2l0aW9uc1tpXSA9IChQb3NpdGlvbikgZ2V0SmF2YTJKc3BNYXAoKS5nZXQoamF2YVBvc2l0aW9uc1tpXSk7Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZGVsdGFzOiIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgamF2YVRleHQgPSBnZXRKYXZhVGV4dCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJwb3NbIiArIGRlbHRhc1tpXS5wcmVPZmZzZXQgKyAiOiIgKyBkZWx0YXNbaV0ucHJlTGVuZ3RoICsgIl0iICsgamF2YVRleHQuc3Vic3RyaW5nKGRlbHRhc1tpXS5wcmVPZmZzZXQsIGRlbHRhc1tpXS5wcmVPZmZzZXQgKyBkZWx0YXNbaV0ucHJlTGVuZ3RoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlVbmRvRWRpdCB1bmRvID0gbnVsbDsKLQkJLy8gYXBwbHkgdGhlIGVkaXQgdG8gdGhlIGphdmEgZG9jdW1lbnQKLQkJdHJ5IHsKLQkJCXVuZG8gPSBqYXZhRWRpdC5hcHBseShnZXRKYXZhRG9jdW1lbnQoKSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQkvLyBub3cgYXQgdGhpcyBwb2ludCBKYXZhIHBvc2l0aW9ucyBhcmUgdW5yZWxpYWJsZSBzaW5jZSB0aGV5IHdlcmUKLQkJLy8gdXBkYXRlZCBhZnRlciBhcHBseWluZyBqYXZhIGVkaXQuCi0KLQkJU3RyaW5nIG5ld0phdmFUZXh0ID0gZ2V0SmF2YURvY3VtZW50KCkuZ2V0KCk7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiamF2YSBwb3N0IGZvcm1hdCB0ZXh0OlxuIiArIG5ld0phdmFUZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHJlY29yZCBwb3N0IGVkaXQgZGF0YQotCQlmb3IgKGludCBpID0gMDsgaSA8IGphdmFQb3NpdGlvbnMubGVuZ3RoOyBpKyspCi0JCQlkZWx0YXNbaV0uc2V0UG9zdEVkaXREYXRhKGphdmFQb3NpdGlvbnNbaV0ub2Zmc2V0LCBqYXZhUG9zaXRpb25zW2ldLmxlbmd0aCwgamF2YVBvc2l0aW9uc1tpXS5pc0RlbGV0ZWQpOwotCi0JCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSB0ZXh0IGVkaXRzIGZvciBkZWx0YXMKLQkJUG9zaXRpb24ganNwUG9zID0gbnVsbDsKLQkJU3RyaW5nIHJlcGxhY2VUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWx0YXMubGVuZ3RoOyBpKyspIHsKLQkJCWpzcFBvcyA9IGpzcFBvc2l0aW9uc1tpXTsKLQkJCS8vIGNhbiBiZSBudWxsIGlmIGl0J3MgYW4gaW5kaXJlY3QgbWFwcGluZyBwb3NpdGlvbgotCQkJLy8gb3IgaWYgc29tZXRoaW5nIHdhcyBhZGRlZCBpbnRvIGphdmEgdGhhdCB3YXMgbm90IG9yaWdpbmFsbHkgaW4KLQkJCS8vIEpTUCAobGlrZSBhIG5ldyBpbXBvcnQuLi4pCi0KLQkJCWlmIChqc3BQb3MgIT0gbnVsbCkgewotCQkJCWlmIChkZWx0YXNbaV0uaXNEZWxldGVkKSB7Ci0JCQkJCWpzcEVkaXRzLmFkZChuZXcgRGVsZXRlRWRpdChqc3BQb3Mub2Zmc2V0LCBqc3BQb3MubGVuZ3RoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXBsYWNlVGV4dCA9IG5ld0phdmFUZXh0LnN1YnN0cmluZyhkZWx0YXNbaV0ucG9zdE9mZnNldCwgZGVsdGFzW2ldLnBvc3RPZmZzZXQgKyBkZWx0YXNbaV0ucG9zdExlbmd0aCk7Ci0KLQkJCQkJLy8gZ2V0IHJpZCBvZiBwcmUgYW5kIHBvc3Qgd2hpdGUgc3BhY2Ugb3IgZmluZSB0dW5lZAotCQkJCQkvLyBhZGp1c3RtZW50IGxhdGVyLgotCQkJCQkvLyBmaXggdGV4dCBoZXJlLi4uCi0JCQkJCXJlcGxhY2VUZXh0ID0gZml4SnNwUmVwbGFjZVRleHQocmVwbGFjZVRleHQsIGpzcFBvcy5vZmZzZXQpOwotCi0JCQkJCWpzcEVkaXRzLmFkZChuZXcgUmVwbGFjZUVkaXQoanNwUG9zLm9mZnNldCwganNwUG9zLmxlbmd0aCwgcmVwbGFjZVRleHQpKTsKLQkJCQl9Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlkZWJ1Z1JlcGxhY2UoZGVsdGFzLCBqc3BQb3MsIHJlcGxhY2VUZXh0LCBpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoZSBuZXcgSmF2YSB0ZXh0IGhhcyBubyBjb3JyZXNwb25kaW5nIEpTUCBwb3NpdGlvbgotCQkJCS8vIHBvc3NpYmxlIG5ldyBpbXBvcnQ/Ci0JCQkJaWYgKGlzSW1wb3J0KGphdmFQb3NpdGlvbnNbaV0uZ2V0T2Zmc2V0KCkpICYmIHJlcGxhY2VUZXh0Lmxhc3RJbmRleE9mKCJpbXBvcnQgIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXBsYWNlVGV4dCA9IG5ld0phdmFUZXh0LnN1YnN0cmluZyhkZWx0YXNbaV0ucG9zdE9mZnNldCwgZGVsdGFzW2ldLnBvc3RPZmZzZXQgKyBkZWx0YXNbaV0ucG9zdExlbmd0aCk7Ci0JCQkJCVN0cmluZyBpbXBvcnRUZXh0ID0gcmVwbGFjZVRleHQuc3Vic3RyaW5nKHJlcGxhY2VUZXh0Lmxhc3RJbmRleE9mKCJpbXBvcnQgIiksIHJlcGxhY2VUZXh0LmluZGV4T2YoIjsiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkvLyBldmVudXRhbGx5IG5lZWQgdG8gY2hlY2sgaWYgaXQncyBYTUwtSlNQCi0JCQkJCWltcG9ydFRleHQgPSAiPCVAcGFnZSBpbXBvcnQ9XCIiICsgaW1wb3J0VGV4dCArICJcIiAlPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWpzcEVkaXRzLmFkZChuZXcgSW5zZXJ0RWRpdCgwLCBpbXBvcnRUZXh0KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCVRleHRFZGl0IGFsbEpzcEVkaXRzID0gY3JlYXRlTXVsdGlUZXh0RWRpdCgoVGV4dEVkaXRbXSkganNwRWRpdHMudG9BcnJheShuZXcgVGV4dEVkaXRbanNwRWRpdHMuc2l6ZSgpXSkpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDU2MzIKLQkJLy8gdW5kbyB0aGUgamF2YSBlZGl0Ci0JCS8vIChzbyB0aGUgdW5kZXJseWluZyBKYXZhIGRvY3VtZW50IHN0aWxsIHJlcHJlc2VudHMgd2hhdCdzIGluIHRoZQotCQkvLyBlZGl0b3IpCi0JCWlmICh1bmRvICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJdW5kby5hcHBseShnZXRKYXZhRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhbGxKc3BFZGl0czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmaXhKc3BSZXBsYWNlVGV4dChTdHJpbmcgcmVwbGFjZVRleHQsIGludCBqc3BPZmZzZXQpIHsKLQotCQkvLyByZXN1bHQgaXMgdGhlIHRleHQgaW5iZXR3ZWVuIHRoZSBkZWxpbWl0ZXJzCi0JCS8vIGVnLgotCQkvLyAKLQkJLy8gPCUgcmVzdWx0Ci0JCS8vICU+Ci0JCVN0cmluZyByZXN1bHQgPSByZXBsYWNlVGV4dC50cmltKCk7Ci0JCVN0cmluZyBwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJRG9jdW1lbnQganNwRG9jID0gZ2V0SnNwRG9jdW1lbnQoKTsKLQkJaWYgKGpzcERvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc0RvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KSBqc3BEb2M7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gcmVnaW9ucyA9IHNEb2MuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygwLCBqc3BPZmZzZXQpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdOwotCi0JCQkvLyBvbmx5IHNwZWNpZmljYWxseSBtb2RpZnkgc2NyaXB0bGV0cwotCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCAmJiBsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnNbaV07Ci0KLQkJCQkJLy8gaXMgdGhlcmUgYSBiZXR0ZXIgd2F5IHRvIGNoZWNrIHdoaXRlc3BhY2U/Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQgJiYgcmVnaW9uLmdldEZ1bGxUZXh0KCkudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcHJlRGVsaW1pdGVyV2hpdGVzcGFjZS5yZXBsYWNlQWxsKCJcciIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlwcmVEZWxpbWl0ZXJXaGl0ZXNwYWNlID0gcHJlRGVsaW1pdGVyV2hpdGVzcGFjZS5yZXBsYWNlQWxsKCJcbiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCS8vIG5lZWQgdG8gZGV0ZXJtaW5lIGluZGVudCBmb3IgdGhhdCBmaXJzdCBsaW5lLi4uCi0JCQkJCQlTdHJpbmcgaW5pdGlhbEluZGVudCA9IGdldEluaXRpYWxJbmRlbnQocmVzdWx0KTsKLQotCQkJCQkJLy8gZml4IHRoZSBmaXJzdCBsaW5lIG9mIGphdmEgY29kZQotCQkJCQkJcmVzdWx0ID0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihzRG9jKSArIGluaXRpYWxJbmRlbnQgKyByZXN1bHQ7Ci0KLQkJCQkJCXJlc3VsdCA9IGFkanVzdEluZGVudChyZXN1bHQsIHByZURlbGltaXRlcldoaXRlc3BhY2UsIFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoc0RvYykpOwotCi0JCQkJCQkvLyBhZGQgd2hpdGVzcGFjZSBiZWZvcmUgbGFzdCBkZWxpbWl0ZXIgdG8gbWF0Y2gKLQkJCQkJCS8vIGl0IHcvIHRoZSBvcGVuaW5nIGRlbGltaXRlcgotCQkJCQkJcmVzdWx0ID0gcmVzdWx0ICsgVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihzRG9jKSArIHByZURlbGltaXRlcldoaXRlc3BhY2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGFkanVzdEluZGVudChTdHJpbmcgdGV4dEJlZm9yZSwgU3RyaW5nIGluZGVudCwgU3RyaW5nIGRlbGltKSB7Ci0KLQkJLy8gZmlyc3QgcmVwbGFjZSBtdWx0aXBsZSBpbmRlbnQgd2l0aCBzaW5nbGUgaW5kZW50Ci0JCS8vIHRoZSB0cmlwbGUgaW5kZW50IG9jY3VycyBiZWNhdXNlIHRoZSBzY3JpcHRsZXQgY29kZQotCQkvLyBhY3R1YWxseSBvY2N1cnMgdW5kZXI6Ci0JCS8vIAotCQkvLyBjbGFzcwotCQkvLyBtZXRob2QKLQkJLy8gY29kZQotCQkvLyAKLQkJLy8gaW4gdGhlIHRyYW5zbGF0ZWQgamF2YSBkb2N1bWVudAotCi0JCXRleHRCZWZvcmUgPSB0ZXh0QmVmb3JlLnJlcGxhY2VBbGwoIlx0XHRcdCIsICJcdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBnZXQgaW5kZW50IGFmdGVyIDJuZCBsaW5lIGJyZWFrCi0JCVN0cmluZ0J1ZmZlciB0ZXh0QWZ0ZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIHdpbGwgdGhpcyB3b3JrIG9uIG1hYz8KLQkJdGV4dEJlZm9yZSA9IHRleHRCZWZvcmUucmVwbGFjZUFsbCgiXHIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHRCZWZvcmUsICJcbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCVN0cmluZyB0b2sgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCWlmICh0b2suZXF1YWxzKCJcbiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl0ZXh0QWZ0ZXIuYXBwZW5kKGRlbGltKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHByZXBlbmQgZWFjaCBsaW5lIHcvIHNwZWNpZmllZCBpbmRlbnQKLQkJCQl0ZXh0QWZ0ZXIuYXBwZW5kKGluZGVudCk7Ci0JCQkJdGV4dEFmdGVyLmFwcGVuZCh0b2spOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0QWZ0ZXIudG9TdHJpbmcoKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluaXRpYWxJbmRlbnQoU3RyaW5nIHJlc3VsdCkgewotCi0JCS8vIGdldCBpbmRlbnQgYWZ0ZXIgMm5kIGxpbmUgYnJlYWsKLQkJU3RyaW5nIGluZGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocmVzdWx0LCAiXHJcbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3QuY291bnRUb2tlbnMoKSA+IDEpIHsKLQkJCVN0cmluZyB0b2sgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCXRvayA9IHN0Lm5leHRUb2tlbigpOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWlmICh0b2sgIT0gbnVsbCkgewotCQkJCXdoaWxlICh0b2suY2hhckF0KGluZGV4KSA9PSAnICcgfHwgdG9rLmNoYXJBdChpbmRleCkgPT0gJ1x0JykgewotCQkJCQlpbmRlbnQgKz0gdG9rLmNoYXJBdChpbmRleCk7Ci0JCQkJCWluZGV4Kys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBpbmRlbnQ7Ci0JfQotCi0KLQkvKioKLQkgKiBDb21iaW5lcyBhbiBhcnJheSBvZiBlZGl0cyBpbnRvIG9uZSBNdWx0aVRleHRFZGl0ICh3aXRoIHRoZSBhcHByb3ByaWF0ZQotCSAqIGNvdmVyYWdlIHJlZ2lvbikKLQkgKiAKLQkgKiBAcGFyYW0gZWRpdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZXh0RWRpdCBjcmVhdGVNdWx0aVRleHRFZGl0KFRleHRFZGl0W10gZWRpdHMpIHsKLQotCQlpZiAoZWRpdHMubGVuZ3RoID09IDApCi0JCQlyZXR1cm4gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQotCQlJUmVnaW9uIHJlZ2lvbiA9IFRleHRFZGl0LmdldENvdmVyYWdlKGVkaXRzKTsKLQkJTXVsdGlUZXh0RWRpdCBtdWx0aUVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdChyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdHMubGVuZ3RoOyBpKyspIHsKLQkJCWFkZFRvTXVsdGlFZGl0KGVkaXRzW2ldLCBtdWx0aUVkaXQpOwotCQl9Ci0JCXJldHVybiBtdWx0aUVkaXQ7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgYWRkVG9NdWx0aUVkaXQoVGV4dEVkaXQgZWRpdCwgTXVsdGlUZXh0RWRpdCBtdWx0aUVkaXQpIHsKLQotCQkvLyBjaGVjayBmb3Igb3ZlcmxhcCBoZXJlCi0JCS8vIGRpc2NhcmQgb3ZlcmxhcHBpbmcgZWRpdHMuLgotCQkvLyBwb3NzaWJsZSBleHBvbmVudGlhbCBwZXJmb3JtYW5jZSBoaXQuLi4gbmVlZCBhIGJldHRlciB3YXkuLi4KLQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9IG11bHRpRWRpdC5nZXRDaGlsZHJlbigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW5baV0uY292ZXJzKGVkaXQpKQotCQkJCS8vIGRvbid0IGFkZAotCQkJCXJldHVybjsKLQkJfQotCQltdWx0aUVkaXQuYWRkQ2hpbGQoZWRpdCk7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gdHJhbnNsYXRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUG9zaXRpb25zVG9Eb2N1bWVudHMoKSB7Ci0KLQkJLy8gY2FuIGJlIG51bGwgaWYgaXQncyBhIE51bGxKU1BUcmFuc2xhdGlvbgotCQlpZiAoZ2V0SmF2YURvY3VtZW50KCkgIT0gbnVsbCAmJiBnZXRKc3BEb2N1bWVudCgpICE9IG51bGwpIHsKLQotCQkJSGFzaE1hcCBqYXZhMmpzcCA9IGdldEphdmEySnNwTWFwKCk7Ci0JCQlJdGVyYXRvciBpdCA9IGphdmEyanNwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlQb3NpdGlvbiBqYXZhUG9zID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlqYXZhUG9zID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJdHJ5IHsKLQotCQkJCQlmSmF2YURvY3VtZW50LmFkZFBvc2l0aW9uKGphdmFQb3MpOwotCi0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ0eXJpbmcgdG8gYWRkIEphdmEgUG9zaXRpb246WyIgKyBqYXZhUG9zLm9mZnNldCArICI6IiArIGphdmFQb3MubGVuZ3RoICsgIl0gdG8gIiArIGdldEphdmFQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAkJCQkJCi0JCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN1YnN0cmluZyA6WyIgKwotCQkJCQkJLy8gZkphdmFEb2N1bWVudC5nZXQoKS5zdWJzdHJpbmcoamF2YVBvcy5vZmZzZXQpICsKLQkJCQkJCS8vICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXRyeSB7Ci0KLQkJCQkJZkpzcERvY3VtZW50LmFkZFBvc2l0aW9uKChQb3NpdGlvbikgamF2YTJqc3AuZ2V0KGphdmFQb3MpKTsKLQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigidHlyaW5nIHRvIGFkZCBKU1AgUG9zaXRpb246WyIgKyAoKFBvc2l0aW9uKSBqYXZhMmpzcC5nZXQoamF2YVBvcykpLm9mZnNldCArICI6IiArICgoUG9zaXRpb24pIGphdmEyanNwLmdldChqYXZhUG9zKSkubGVuZ3RoICsgIl0gdG8gIiArIGdldEphdmFQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlY3Vyc2l2ZWx5IGdldHMgYWxsIGNoaWxkIGVkaXRzCi0JICogCi0JICogQHBhcmFtIGphdmFFZGl0Ci0JICogQHJldHVybiBhbGwgY2hpbGQgZWRpdHMKLQkgKi8KLQlwcml2YXRlIFRleHRFZGl0W10gZ2V0QWxsRWRpdHMoVGV4dEVkaXQgamF2YUVkaXQpIHsKLQotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGphdmFFZGl0IGluc3RhbmNlb2YgTXVsdGlUZXh0RWRpdCkgewotCQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9IGphdmFFZGl0LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKQotCQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChnZXRBbGxFZGl0cyhjaGlsZHJlbltpXSkpKTsKLQkJfQotCQllbHNlCi0JCQlyZXN1bHQuYWRkKGphdmFFZGl0KTsKLQkJcmV0dXJuIChUZXh0RWRpdFtdKSByZXN1bHQudG9BcnJheShuZXcgVGV4dEVkaXRbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWx0YXMKLQkgKiBAcGFyYW0ganNwUG9zCi0JICogQHBhcmFtIHJlcGxhY2VUZXh0Ci0JICogQHBhcmFtIGpzcFRleHQKLQkgKiBAcGFyYW0gaQotCSAqLwotCXByaXZhdGUgdm9pZCBkZWJ1Z1JlcGxhY2UoUG9zaXRpb25EZWx0YVtdIGRlbHRhcywgUG9zaXRpb24ganNwUG9zLCBTdHJpbmcgcmVwbGFjZVRleHQsIGludCBpKSB7Ci0JCVN0cmluZyBqc3BDaHVuazsKLQkJanNwQ2h1bmsgPSBnZXRKc3BEb2N1bWVudCgpLmdldCgpLnN1YnN0cmluZyhqc3BQb3Mub2Zmc2V0LCBqc3BQb3Mub2Zmc2V0ICsganNwUG9zLmxlbmd0aCk7Ci0JCWlmICghZGVsdGFzW2ldLmlzRGVsZXRlZCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXBsYWNpbmc6Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigianNwOlsiICsganNwQ2h1bmsgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidy8gOlsiICsgcmVwbGFjZVRleHQgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0aW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjY0YzhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdGlvblV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNvbXBpbGF0aW9uVW5pdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkNvcHlTb3VyY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuQ29weVRhcmdldEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1vdmVTb3VyY2VFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTW92ZVRhcmdldEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BUcmFuc2xhdGlvblV0aWwgewotCXByb3RlY3RlZCBJRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZlRyYW5zbGF0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvblV0aWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCB0cmFuc2xhdGVUZXh0RWRpdChUZXh0RWRpdCB0ZXh0RWRpdCkgewotCQlUZXh0RWRpdCB0cmFuc2xhdGVkVGV4dEVkaXQgPSBudWxsOwotCi0JCWludCBqYXZhT2Zmc2V0ID0gdGV4dEVkaXQuZ2V0T2Zmc2V0KCk7Ci0JCWludCBqc3BPZmZzZXQgPSBnZXRUcmFuc2xhdGlvbigpLmdldEpzcE9mZnNldCh0ZXh0RWRpdC5nZXRPZmZzZXQoKSk7Ci0JCWludCBsZW5ndGggPSB0ZXh0RWRpdC5nZXRMZW5ndGgoKTsKLQotCQlpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNdWx0aVRleHRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJVGV4dEVkaXRbXSBjaGlsZHJlbiA9ICgoTXVsdGlUZXh0RWRpdCkgdGV4dEVkaXQpLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGV4dEVkaXQgdHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgPSB0cmFuc2xhdGVUZXh0RWRpdChjaGlsZHJlbltpXSk7Ci0JCQkJaWYgKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0ICE9IG51bGwpCi0JCQkJCSgoTXVsdGlUZXh0RWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5hZGRDaGlsZCh0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBSZXBsYWNlRWRpdCkgewotCQkJaWYgKGpzcE9mZnNldCA9PSAtMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJaWYgKCFnZXRUcmFuc2xhdGlvbigpLmphdmFTcGFuc011bHRpcGxlSnNwUGFydGl0aW9ucyhqYXZhT2Zmc2V0LCBsZW5ndGgpKQotCQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBSZXBsYWNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCwgKChSZXBsYWNlRWRpdCkgdGV4dEVkaXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBJbnNlcnRFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgSW5zZXJ0RWRpdChqc3BPZmZzZXQsICgoSW5zZXJ0RWRpdCkgdGV4dEVkaXQpLmdldFRleHQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBEZWxldGVFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgRGVsZXRlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQlUZXh0RWRpdFtdIGNoaWxkcmVuID0gKChEZWxldGVFZGl0KSB0ZXh0RWRpdCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlUZXh0RWRpdCB0cmFuc2xhdGVkQ2hpbGRUZXh0RWRpdCA9IHRyYW5zbGF0ZVRleHRFZGl0KGNoaWxkcmVuW2ldKTsKLQkJCQlpZiAodHJhbnNsYXRlZENoaWxkVGV4dEVkaXQgIT0gbnVsbCkKLQkJCQkJKChEZWxldGVFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLmFkZENoaWxkKHRyYW5zbGF0ZWRDaGlsZFRleHRFZGl0KTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0ZXh0RWRpdCBpbnN0YW5jZW9mIENvcHlTb3VyY2VFZGl0KSB7Ci0JCQl0cmFuc2xhdGVkVGV4dEVkaXQgPSBuZXcgQ29weVNvdXJjZUVkaXQoanNwT2Zmc2V0LCBsZW5ndGgpOwotCQkJKChDb3B5U291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRUYXJnZXRFZGl0KCgoQ29weVNvdXJjZUVkaXQpIHRleHRFZGl0KS5nZXRUYXJnZXRFZGl0KCkpOwotCQkJKChDb3B5U291cmNlRWRpdCkgdHJhbnNsYXRlZFRleHRFZGl0KS5zZXRTb3VyY2VNb2RpZmllcigoKENvcHlTb3VyY2VFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlTW9kaWZpZXIoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBDb3B5VGFyZ2V0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IENvcHlUYXJnZXRFZGl0KGpzcE9mZnNldCk7Ci0JCQkoKENvcHlUYXJnZXRFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlRWRpdCgpLnNldFRhcmdldEVkaXQoKENvcHlUYXJnZXRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpOwotCQl9Ci0JCWVsc2UgaWYgKHRleHRFZGl0IGluc3RhbmNlb2YgTW92ZVNvdXJjZUVkaXQpIHsKLQkJCXRyYW5zbGF0ZWRUZXh0RWRpdCA9IG5ldyBNb3ZlU291cmNlRWRpdChqc3BPZmZzZXQsIGxlbmd0aCk7Ci0JCQkoKE1vdmVTb3VyY2VFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpLnNldFRhcmdldEVkaXQoKChNb3ZlU291cmNlRWRpdCkgdGV4dEVkaXQpLmdldFRhcmdldEVkaXQoKSk7Ci0JCX0KLQkJZWxzZSBpZiAodGV4dEVkaXQgaW5zdGFuY2VvZiBNb3ZlVGFyZ2V0RWRpdCkgewotCQkJdHJhbnNsYXRlZFRleHRFZGl0ID0gbmV3IE1vdmVUYXJnZXRFZGl0KGpzcE9mZnNldCk7Ci0JCQkoKE1vdmVUYXJnZXRFZGl0KSB0ZXh0RWRpdCkuZ2V0U291cmNlRWRpdCgpLnNldFRhcmdldEVkaXQoKE1vdmVUYXJnZXRFZGl0KSB0cmFuc2xhdGVkVGV4dEVkaXQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOZWVkIHRvIHRyYW5zbGF0ZSAiICsgdGV4dEVkaXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gdHJhbnNsYXRlZFRleHRFZGl0OwotCX0KLQotCXB1YmxpYyBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRUcmFuc2xhdGlvbigpIHsKLQkJaWYgKGZUcmFuc2xhdGlvbiA9PSBudWxsKSB7Ci0JCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJdHJ5IHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciB0cmFuc2xhdGlvbkFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSB4bWxEb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCWlmICh0cmFuc2xhdGlvbkFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJZlRyYW5zbGF0aW9uID0gdHJhbnNsYXRpb25BZGFwdGVyLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkgewotCQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQotCXB1YmxpYyBJQ29tcGlsYXRpb25Vbml0IGdldENvbXBpbGF0aW9uVW5pdCgpIHsKLQkJcmV0dXJuIGdldFRyYW5zbGF0aW9uKCkuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9KU1BUcmFuc2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTMzM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL0pTUFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhcmlhYmxlSW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDEyVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYi5UYWdsaWJIZWxwZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWIuVGFnbGliVmFyaWFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsLklKU1BFTFRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogVHJhbnNsYXRlcyBhIEpTUCBkb2N1bWVudCBpbnRvIGEgSHR0cFNlcnZsZXQuIEtlZXBzIHR3byB3YXkgbWFwcGluZyBmcm9tCi0gKiBqYXZhIHRyYW5zbGF0aW9uIHRvIHRoZSBvcmlnaW5hbCBKU1Agc291cmNlLCB3aGljaCBjYW4gYmUgb2J0YWluZWQgdGhyb3VnaAotICogZ2V0SmF2YTJKc3BSYW5nZXMoKSBhbmQgZ2V0SnNwMkphdmFSYW5nZXMoKS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFRyYW5zbGF0b3IgewotCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIGV4dGVuc2lvbiBwb2ludAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTF9UUkFOU0xBVE9SX0VYVEVOU0lPTl9OQU1FID0gImVsVHJhbnNsYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTFRSQU5TTEFUT1JfUFJPUF9OQU1FID0gIkVMVHJhbnNsYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIERlZmF1bHQgRUwgVHJhbnNsYXRvcgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0pTUF9FTF9UUkFOU0xBVE9SX0lEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuZGVmYXVsdEpTUDIwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gaGFuZHkgcGx1Z2luIElEIGNvbnN0YW50Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT1JFX1BMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1NBVkVfT1VUUFVUID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B0cmFuc2xhdGlvbnN0b2Rpc2siKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgSUpTUEVMVHJhbnNsYXRvciBmRUxUcmFuc2xhdG9yID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvanNwamF2YW1hcHBpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5ETCA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZDbGFzc0hlYWRlciA9ICJwdWJsaWMgY2xhc3MgX0pTUFNlcnZsZXQgZXh0ZW5kcyAiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzbmFtZSA9ICJfSlNQU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZJbXBsaWNpdEltcG9ydHMgPSAiaW1wb3J0IGphdmF4LnNlcnZsZXQuKjsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkiaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC4qOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCSJpbXBvcnQgamF2YXguc2VydmxldC5qc3AuKjsiICsgRU5ETCArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZTZXJ2aWNlSGVhZGVyID0gInB1YmxpYyB2b2lkIF9qc3BTZXJ2aWNlKGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwiICsgLy8kTk9OLU5MUy0xJAotCQkJCSIgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJIlx0XHR0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uIHsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQgcGFnZUNvbnRleHQgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb24gc2Vzc2lvbiA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JCQkJImphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQgYXBwbGljYXRpb24gPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWcgY29uZmlnID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQgCi0JCQkJImphdmF4LnNlcnZsZXQuanNwLkpzcFdyaXRlciBvdXQgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCQkJCSJPYmplY3QgcGFnZSA9IG51bGw7IiArIEVOREw7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZGb290ZXIgPSAifX0iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZkV4Y2VwdGlvbiA9ICJUaHJvd2FibGUgZXhjZXB0aW9uID0gbnVsbDsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9QUkVGSVggPSAib3V0LnByaW50KFwiXCIrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fU1VGRklYID0gIik7IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZTdXBlcmNsYXNzID0gImphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIGZUcnlDYXRjaFN0YXJ0ID0gRU5ETCArICJ0cnkgeyIgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgZlRyeUNhdGNoRW5kID0gIiB9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHt9ICIgKyBFTkRMOyAvLyROT04tTkxTLTEkCi0KLQkvKiogZlNvdXJjZVBvc2l0aW9uID0gcG9zaXRpb24gaW4gSlNQIHNvdXJjZSAqLwotCXByaXZhdGUgaW50IGZTb3VyY2VQb3NpdGlvbiA9IC0xOwotCS8qKiBmUmVsYXRpdmVPZmZlc3QgPSBvZmZzZXQgaW4gdGhlIGJ1ZmZlciB0aGVyZSB0aGUgY3Vyc29yIGlzICovCi0JcHJpdmF0ZSBpbnQgZlJlbGF0aXZlT2Zmc2V0ID0gLTE7Ci0JLyoqIGZDdXJzb3JQb3NpdGlvbiA9IG9mZnNldCBpbiB0aGUgdHJhbnNsYXRlZCBqYXZhIGRvY3VtZW50ICovCi0JcHJpdmF0ZSBpbnQgZkN1cnNvclBvc2l0aW9uID0gLTE7Ci0JLyoqIHNvbWUgcGFnZSBkaXJlY3RpdmUgYXR0cmlidXRlcyAqLwotCXByaXZhdGUgYm9vbGVhbiBmSXNFcnJvclBhZ2UsIGZDdXJzb3JJbkV4cHJlc3Npb24gPSBmYWxzZTsKLQotCS8qKiB1c2VyIGphdmEgY29kZSBpbiBib2R5IG9mIHRoZSBzZXJ2aWNlIG1ldGhvZCAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyQ29kZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvKiogdXNlciBFTCBFeHByZXNzaW9uICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJFTEV4cHJlc3Npb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8qKiB1c2VyIGRlZmluZWQgdmFycyBkZWNsYXJlZCBpbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjbGFzcyAqLwotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZVc2VyRGVjbGFyYXRpb25zID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqIHVzZXIgZGVmaW5lZCBpbXBvcnRzICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlVzZXJJbXBvcnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JLyoqCi0JICogQSBtYXAgb2YgdGFnIG5hbWVzIHRvIHRhZyBsaWJyYXJ5IHZhcmlhYmxlIGluZm9ybWF0aW9uOyB1c2VkIHRvIHN0b3JlCi0JICogdGhlIG9uZXMgbmVlZGVkIGZvciBBVF9FTkQgdmFyaWFibGUgc3VwcG9ydC4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlRhZ1RvVmFyaWFibGVNYXAgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZlJlc3VsdDsgLy8gdGhlIGZpbmFsIHRyYXNsYXRlZCBqYXZhIGRvY3VtZW50Ci0JLy8gc3RyaW5nIGJ1ZmZlcgotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZDdXJzb3JPd25lciA9IG51bGw7IC8vIHRoZSBidWZmZXIgd2hlcmUgdGhlIGN1cnNvcgotCS8vIGlzCi0KLQlwcml2YXRlIElET01Nb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZDdXJyZW50Tm9kZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluQ29kZVJlZ2lvbiA9IGZhbHNlOyAvLyBmbGFnIGZvciBpZiBjdXJzb3IgaXMgaW4gdGhlCi0JLy8gY3VycmVudCByZWdpb24gYmVpbmcgdHJhbnNsYXRlZAotCi0JLyoqCi0JICogdGhlc2UgY29uc3RhbnRzIGFyZSB0byBrZWVwIHRyYWNrIG9mIHdoZXRoZXIgdGhlIGNvZGUgaW4gcXVlc3Rpb24gaXMKLQkgKiBlbWJlZGRlZCAoSlNQIGFzIGFuIGF0dHJpYnV0ZSBvciB3aXRoaW4gY29tbWVudCB0YWdzKSBvciBpcyBqdXN0Ci0JICogc3RhbmRhcmQgSlNQIGNvZGUsIG9yIGlkZW50aWZpZXMgaWYgaXQncyBhbiBleHByZXNzaW9uCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgU1RBTkRBUkRfSlNQID0gMDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBFTUJFRERFRF9KU1AgPSAxOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IERFQ0xBUkFUSU9OID0gMjsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBFWFBSRVNTSU9OID0gNDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBTQ1JJUFRMRVQgPSA4OwotCi0JLyoqIHVzZWQgdG8gYXZvaWQgaW5maW5pdGUgbG9vcGluZyBpbmNsdWRlIGZpbGVzICovCi0JcHJpdmF0ZSBTdGFjayBmSW5jbHVkZXMgPSBudWxsOwotCS8qKiBtb3N0bHkgZm9yIGhlbHBlciBjbGFzc2VzLCBzbyB0aGV5IHBhcnNlIGNvcnJlY3RseSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IGZCbG9ja01hcmtlcnMgPSBudWxsOwotCS8qKgotCSAqIGZvciBrZWVwaW5nIHRyYWNrIG9mIG9mZnNldCBpbiB1c2VyIGJ1ZmZlcnMgd2hpbGUgZG9jdW1lbnQgaXMgYmVpbmcKLQkgKiBidWlsdAotCSAqLwotCXByaXZhdGUgaW50IGZPZmZzZXRJblVzZXJJbXBvcnRzID0gMDsKLQlwcml2YXRlIGludCBmT2Zmc2V0SW5Vc2VyRGVjbGFyYXRpb25zID0gMDsKLQlwcml2YXRlIGludCBmT2Zmc2V0SW5Vc2VyQ29kZSA9IDA7Ci0KLQkvKiogY29ycmVsYXRlcyByYW5nZXMgKHBvc2l0aW9ucykgaW4gamF2YSB0byByYW5nZXMgaW4ganNwICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZKYXZhMkpzcFJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkvKioKLQkgKiBtYXAgb2YgcmFuZ2VzIGluIGZVc2VySW1wb3J0cyAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIpIHRvCi0JICogcmFuZ2VzIGluIHNvdXJjZSBKU1AgYnVmZmVyLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmSW1wb3J0UmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQkvKioKLQkgKiBtYXAgb2YgcmFuZ2VzIGluIGZVc2VyQ29kZSAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIpIHRvCi0JICogcmFuZ2VzIGluIHNvdXJjZSBKU1AgYnVmZmVyLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmQ29kZVJhbmdlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBmVXNlckRlY2xhcmF0aW9ucyAocmVsYXRpdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZQotCSAqIGJ1ZmZlcikgdG8gcmFuZ2VzIGluIHNvdXJjZSBKU1AgYnVmZmVyLgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmRGVjbGFyYXRpb25SYW5nZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJpdmF0ZSBIYXNoTWFwIGZVc2VCZWFuUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSGFzaE1hcCBmVXNlckVMUmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCS8qKgotCSAqIHJhbmdlcyB0aGF0IGRvbid0IGRpcmVjdGx5IG1hcCBmcm9tIGphdmEgY29kZSB0byBKU1AgY29kZSAoZWcuCi0JICogPCVAaW5jbHVkZSBmaWxlPSJpbmNsdWRlZC5qc3AiJT4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZkluZGlyZWN0UmFuZ2VzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCS8qKgotCSAqIHNhdmUgSlNQIGRvY3VtZW50IHRleHQgZm9yIGxhdGVyIHVzZSBtYXkganVzdCB3YW50IHRvIHJlYWQgdGhpcyBmcm9tCi0JICogdGhlIGZpbGUgb3Igc3RydWNkdHVyZWQgZG9jdW1lbnQgZGVwZW5kaW5nIHdoYXQgaXMgYXZhaWxhYmxlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgZkpzcFRleHRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQotCS8qKgotCSAqIExpc3Qgb2YgRUwgcHJvYmxlbXMgdG8gYmUgdHJhbnNsYXRlZAotCSAqLwotCXByaXZhdGUgQXJyYXlMaXN0IGZFTFByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLyoqCi0JICogRUwgVHJhbnNsYXRvciBJRAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZFTFRyYW5zbGF0b3JJRDsKLQotCS8qKgotCSAqIGNvbmZpZ3VyZSB1c2luZyBhbiBYTUxOb2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoSURPTU5vZGUgbm9kZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJZlByb2dyZXNzTW9uaXRvciA9IG1vbml0b3I7Ci0JCWZTdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBmU3RydWN0dXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCi0JCWZFTFRyYW5zbGF0b3JJRCA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGJhc2VMb2NhdGlvbik7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNyZWF0ZUNsYXNzbmFtZShub2RlKTsKLQkJaWYgKGNsYXNzTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCXNldENsYXNzbmFtZShjbGFzc05hbWUpOwotCQkJZkNsYXNzSGVhZGVyID0gInB1YmxpYyBjbGFzcyAiICsgY2xhc3NOYW1lICsgIiBleHRlbmRzICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogbWVtb3J5IHNhdmluZyBjb25maWd1cmUgKG5vIFN0cnVjdHVyZWREb2N1bWVudCBpbiBtZW1vcnkpIGN1cnJlbnRseQotCSAqIGRvZXNuJ3QgaGFuZGxlIGluY2x1ZGVkIGZpbGVzCi0JICogCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKiBAcGFyYW0gbW9uaXRvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmUoSUZpbGUganNwRmlsZSwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8vIHdoZW4gY29uZmlndXJlZCBvbiBhIGZpbGUKLQkJLy8gZlN0cnVjdHVyZWRNb2RlbCwgZlBvc2l0aW9uTm9kZSwgZk1vZGVsUXVlcnksIGZTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJLy8gYXJlIGFsbCBudWxsCi0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCi0JCWZFTFRyYW5zbGF0b3JJRCA9IGdldEVMVHJhbnNsYXRvclByb3BlcnR5KGpzcEZpbGUpOwotCi0JCVN0cmluZyBjbGFzc05hbWUgPSBjcmVhdGVDbGFzc25hbWUoanNwRmlsZSk7Ci0JCWlmIChjbGFzc05hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzZXRDbGFzc25hbWUoY2xhc3NOYW1lKTsKLQkJCWZDbGFzc0hlYWRlciA9ICJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZSArICIgZXh0ZW5kcyAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUganNwIHRleHQgZnJvbSBhbiBJRmlsZQotCSAqIAotCSAqIEBwYXJhbSBqc3BGaWxlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEpzcFRleHQoSUZpbGUganNwRmlsZSkgewotCQl0cnkgewotCQkJQnVmZmVyZWRJbnB1dFN0cmVhbSBpbiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGpzcEZpbGUuZ2V0Q29udGVudHMoKSk7Ci0JCQlCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0JCQlTdHJpbmcgbGluZSA9IG51bGw7Ci0JCQl3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgewotCQkJCWZKc3BUZXh0QnVmZmVyLmFwcGVuZChsaW5lKTsKLQkJCQlmSnNwVGV4dEJ1ZmZlci5hcHBlbmQoRU5ETCk7Ci0JCQl9Ci0JCQlyZWFkZXIuY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgRUxUcmFuc2xhdG9yIHByb3BlcnR5IGZyb20gYSB3b3Jrc3BhY2UgcmVsYXRpdmUKLQkgKiBwYXRoIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24KLQkgKiAgICAgICAgICAgIFdvcmtzcGFjZS1yZWxhdGl2ZSBzdHJpbmcgcGF0aAotCSAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIEVMVHJhbnNsYXRvciBwcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2plY3QuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RUxUcmFuc2xhdG9yUHJvcGVydHkoU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJU3RyaW5nIGVsVHJhbnNsYXRvclZhbHVlID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0RmlsZShuZXcgUGF0aChiYXNlTG9jYXRpb24pKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJZWxUcmFuc2xhdG9yVmFsdWUgPSBnZXRFTFRyYW5zbGF0b3JQcm9wZXJ0eShmaWxlKTsKLQkJfQotCQlyZXR1cm4gZWxUcmFuc2xhdG9yVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgRUxUcmFuc2xhdG9yIHByb3BlcnR5IGZyb20gYW4gSUZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgSUZpbGUKLQkgKiBAcmV0dXJuIFZhbHVlIG9mIHRoZSBFTFRyYW5zbGF0b3IgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm9qZWN0LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEVMVHJhbnNsYXRvclByb3BlcnR5KElGaWxlIGZpbGUpIHsKLQkJU3RyaW5nIGVsVHJhbnNsYXRvclZhbHVlID0gbnVsbDsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCQl0cnkgewotCQkJCQllbFRyYW5zbGF0b3JWYWx1ZSA9IGZpbGUuZ2V0UGVyc2lzdGVudFByb3BlcnR5KG5ldyBRdWFsaWZpZWROYW1lKEpTUF9DT1JFX1BMVUdJTl9JRCwgRUxUUkFOU0xBVE9SX1BST1BfTkFNRSkpOwotCQkJCQlpZiAobnVsbCA9PSBlbFRyYW5zbGF0b3JWYWx1ZSkgewotCi0JCQkJCQllbFRyYW5zbGF0b3JWYWx1ZSA9IGZpbGUuZ2V0UHJvamVjdCgpLmdldFBlcnNpc3RlbnRQcm9wZXJ0eShuZXcgUXVhbGlmaWVkTmFtZShKU1BfQ09SRV9QTFVHSU5fSUQsIEVMVFJBTlNMQVRPUl9QUk9QX05BTUUpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIElTU1VFOiB3aHkgZG8gd2UgbG9nIHRoaXMgaGVyZT8gSW5zdGVhZCBvZiBhbGxvd2luZyB0bwotCQkJCQkvLyB0aHJvd3VwPwotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQotCQkJfQotCQl9Ci0JCXJldHVybiBlbFRyYW5zbGF0b3JWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVDbGFzc25hbWUoSURPTU5vZGUgbm9kZSkgewotCi0JCVN0cmluZyBjbGFzc25hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCWNsYXNzbmFtZSA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwubWFuZ2xlKGJhc2UpOwotCQl9Ci0JCXJldHVybiBjbGFzc25hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlQ2xhc3NuYW1lKElGaWxlIGpzcEZpbGUpIHsKLQotCQlTdHJpbmcgY2xhc3NuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGpzcEZpbGUgIT0gbnVsbCkgewotCQkJY2xhc3NuYW1lID0gSlNQMlNlcnZsZXROYW1lVXRpbC5tYW5nbGUoanNwRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBjbGFzc25hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xhc3NuYW1lKFN0cmluZyBjbGFzc25hbWUpIHsKLQkJdGhpcy5mQ2xhc3NuYW1lID0gY2xhc3NuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NuYW1lKCkgewotCQlyZXR1cm4gdGhpcy5mQ2xhc3NuYW1lICE9IG51bGwgPyB0aGlzLmZDbGFzc25hbWUgOiAiR2VuZXJpY0pzcFNlcnZsZXQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogU28gdGhhdCB0aGUgSlNQVHJhbnNsYXRvciBjYW4gYmUgcmV1c2VkLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KElET01Ob2RlIG5vZGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3MpIHsKLQotCQkvLyBpbml0aWFsaXplIHNvbWUgdGhpbmdzIG9uIG5vZGUKLQkJY29uZmlndXJlKG5vZGUsIHByb2dyZXNzKTsKLQkJcmVzZXQoKTsKLQkJLy8gc2V0IHRoZSBqc3AgdGV4dCBidWZmZXIKLQkJZkpzcFRleHRCdWZmZXIuYXBwZW5kKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnNlcnZhdGl2ZSB2ZXJzaW9uIChubyBTdHJ1Y3R1cmVkRG9jdW1lbnQvTW9kZWwpCi0JICogCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKiBAcGFyYW0gcHJvZ3Jlc3MKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJRmlsZSBqc3BGaWxlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzKSB7Ci0KLQkJLy8gaW5pdGlhbGl6ZSBzb21lIHRoaW5ncyBvbiBub2RlCi0JCWNvbmZpZ3VyZShqc3BGaWxlLCBwcm9ncmVzcyk7Ci0JCXJlc2V0KCk7Ci0JCS8vIHNldCB0aGUganNwIHRleHQgYnVmZmVyCi0JCXNldEpzcFRleHQoanNwRmlsZSk7Ci0JfQotCi0JLyoqCi0JICogUmVpbml0aWFsaXplIHNvbWUgZmllbGRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0KCkgewotCi0JCS8vIHJlc2V0IHByb2dyZXNzIG1vbml0b3IKLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCkKLQkJCWZQcm9ncmVzc01vbml0b3Iuc2V0Q2FuY2VsZWQoZmFsc2UpOwotCi0JCS8vIHJlaW5pdCBmaWVsZHMKLQkJZlNvdXJjZVBvc2l0aW9uID0gLTE7Ci0JCWZSZWxhdGl2ZU9mZnNldCA9IC0xOwotCQlmQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQotCQlmSXNFcnJvclBhZ2UgPSBmQ3Vyc29ySW5FeHByZXNzaW9uID0gZmFsc2U7Ci0KLQkJZlVzZXJDb2RlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmVXNlckRlY2xhcmF0aW9ucyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZlVzZXJJbXBvcnRzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmVXNlckVMRXhwcmVzc2lvbnMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJZlJlc3VsdCA9IG51bGw7Ci0JCWZDdXJzb3JPd25lciA9IG51bGw7IC8vIHRoZSBidWZmZXIgd2hlcmUgdGhlIGN1cnNvciBpcwotCi0JCWZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JCWZJbkNvZGVSZWdpb24gPSBmYWxzZTsgLy8gZmxhZyBmb3IgaWYgY3Vyc29yIGlzIGluIHRoZSBjdXJyZW50IHJlZ2lvbgotCQkvLyBiZWluZyB0cmFuc2xhdGVkCi0KLQkJaWYgKGZJbmNsdWRlcyAhPSBudWxsKQotCQkJZkluY2x1ZGVzLmNsZWFyKCk7Ci0KLQkJZkJsb2NrTWFya2VycyA9IG51bGw7Ci0KLQkJZk9mZnNldEluVXNlckltcG9ydHMgPSAwOwotCQlmT2Zmc2V0SW5Vc2VyRGVjbGFyYXRpb25zID0gMDsKLQkJZk9mZnNldEluVXNlckNvZGUgPSAwOwotCi0JCWZKYXZhMkpzcFJhbmdlcy5jbGVhcigpOwotCQlmSW1wb3J0UmFuZ2VzLmNsZWFyKCk7Ci0JCWZDb2RlUmFuZ2VzLmNsZWFyKCk7Ci0JCWZVc2VCZWFuUmFuZ2VzLmNsZWFyKCk7Ci0JCWZEZWNsYXJhdGlvblJhbmdlcy5jbGVhcigpOwotCQlmVXNlckVMUmFuZ2VzLmNsZWFyKCk7Ci0JCWZJbmRpcmVjdFJhbmdlcy5jbGVhcigpOwotCi0JCWZKc3BUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZFTFByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCi0JfQotCi0JLyoqCi0JICogQHJldHVybiBqdXN0IHRoZSAic2hlbGwiIG9mIGEgc2VydmxldCwgbm90aGluZyBjb250cmlidXRlZCBmcm9tIHRoZSBKU1AKLQkgKiAgICAgICAgIGRvYwotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZ2V0RW1wdHlUcmFuc2xhdGlvbigpIHsKLQkJcmVzZXQoKTsKLQkJYnVpbGRSZXN1bHQoKTsKLQkJcmV0dXJuIGdldFRyYW5zbGF0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogcHV0IHRoZSBmaW5hbCBqYXZhIGRvY3VtZW50IHRvZ2V0aGVyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGJ1aWxkUmVzdWx0KCkgewotCQkvLyB0byBidWlsZCB0aGUgamF2YSBkb2N1bWVudCB0aGlzIGlzIHRoZSBvcmRlcjoKLQkJLy8gCi0JCS8vICsgZGVmYXVsdCBpbXBvcnRzCi0JCS8vICsgdXNlciBpbXBvcnRzCi0JCS8vICsgY2xhc3MgaGVhZGVyCi0JCS8vIFsrIGVycm9yIHBhZ2VdCi0JCS8vICsgdXNlciBkZWNsYXJhdGlvbnMKLQkJLy8gKyBzZXJ2aWNlIG1ldGhvZCBoZWFkZXIKLQkJLy8gKyB0cnkvY2F0Y2ggc3RhcnQKLQkJLy8gKyB1c2VyIGNvZGUKLQkJLy8gKyB0cnkvY2F0Y2ggZW5kCi0JCS8vICsgc2VydmljZSBtZXRob2QgZm9vdGVyCi0JCWZSZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKGZJbXBsaWNpdEltcG9ydHMubGVuZ3RoKCkgKyBmVXNlckltcG9ydHMubGVuZ3RoKCkgKyBmQ2xhc3NIZWFkZXIubGVuZ3RoKCkgKyBmVXNlckRlY2xhcmF0aW9ucy5sZW5ndGgoKSArIGZTZXJ2aWNlSGVhZGVyLmxlbmd0aCgpICsgZlRyeUNhdGNoU3RhcnQubGVuZ3RoKCkgLy8gdHJ5L2NhdGNoCi0JCQkJCS8vIHN0YXJ0Ci0JCQkJCSsgZlVzZXJDb2RlLmxlbmd0aCgpICsgZlRyeUNhdGNoRW5kLmxlbmd0aCgpIC8vIHRyeS9jYXRjaAotCQkJCQkvLyBlbmQKLQkJCQkJKyBmRm9vdGVyLmxlbmd0aCgpKTsKLQotCQlpbnQgamF2YU9mZnNldCA9IDA7Ci0KLQkJZlJlc3VsdC5hcHBlbmQoZkltcGxpY2l0SW1wb3J0cyk7Ci0JCWphdmFPZmZzZXQgKz0gZkltcGxpY2l0SW1wb3J0cy5sZW5ndGgoKTsKLQotCQkvLyB1cGRhdGVSYW5nZXMoZkluZGlyZWN0SW1wb3J0cywgamF2YU9mZnNldCk7Ci0JCXVwZGF0ZVJhbmdlcyhmSW1wb3J0UmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJLy8gdXNlciBpbXBvcnRzCi0JCWFwcGVuZChmVXNlckltcG9ydHMpOwotCQlqYXZhT2Zmc2V0ICs9IGZVc2VySW1wb3J0cy5sZW5ndGgoKTsKLQotCQkvLyBjbGFzcyBoZWFkZXIKLQkJZlJlc3VsdC5hcHBlbmQoZkNsYXNzSGVhZGVyKTsgLy8kTk9OLU5MUy0xJAotCQlqYXZhT2Zmc2V0ICs9IGZDbGFzc0hlYWRlci5sZW5ndGgoKTsKLQkJZlJlc3VsdC5hcHBlbmQoZlN1cGVyY2xhc3MgKyAieyIgKyBFTkRMKTsgLy8kTk9OLU5MUy0xJAotCQlqYXZhT2Zmc2V0ICs9IGZTdXBlcmNsYXNzLmxlbmd0aCgpICsgMjsKLQotCQl1cGRhdGVSYW5nZXMoZkRlY2xhcmF0aW9uUmFuZ2VzLCBqYXZhT2Zmc2V0KTsKLQkJLy8gdXNlciBkZWNsYXJhdGlvbnMKLQkJYXBwZW5kKGZVc2VyRGVjbGFyYXRpb25zKTsKLQkJamF2YU9mZnNldCArPSBmVXNlckRlY2xhcmF0aW9ucy5sZW5ndGgoKTsKLQotCQl1cGRhdGVSYW5nZXMoZlVzZXJFTFJhbmdlcywgamF2YU9mZnNldCk7Ci0JCWFwcGVuZChmVXNlckVMRXhwcmVzc2lvbnMpOwotCQlqYXZhT2Zmc2V0ICs9IGZVc2VyRUxFeHByZXNzaW9ucy5sZW5ndGgoKTsKLQotCQlmUmVzdWx0LmFwcGVuZChmU2VydmljZUhlYWRlcik7Ci0JCWphdmFPZmZzZXQgKz0gZlNlcnZpY2VIZWFkZXIubGVuZ3RoKCk7Ci0JCS8vIGVycm9yIHBhZ2UKLQkJaWYgKGZJc0Vycm9yUGFnZSkgewotCQkJZlJlc3VsdC5hcHBlbmQoZkV4Y2VwdGlvbik7Ci0JCQlqYXZhT2Zmc2V0ICs9IGZFeGNlcHRpb24ubGVuZ3RoKCk7Ci0JCX0KLQotCi0JCWZSZXN1bHQuYXBwZW5kKGZUcnlDYXRjaFN0YXJ0KTsKLQkJamF2YU9mZnNldCArPSBmVHJ5Q2F0Y2hTdGFydC5sZW5ndGgoKTsKLQotCQl1cGRhdGVSYW5nZXMoZkNvZGVSYW5nZXMsIGphdmFPZmZzZXQpOwotCi0JCS8vIHVzZXIgY29kZQotCQlhcHBlbmQoZlVzZXJDb2RlKTsKLQkJamF2YU9mZnNldCArPSBmVXNlckNvZGUubGVuZ3RoKCk7Ci0KLQotCQlmUmVzdWx0LmFwcGVuZChmVHJ5Q2F0Y2hFbmQpOwotCQlqYXZhT2Zmc2V0ICs9IGZUcnlDYXRjaEVuZC5sZW5ndGgoKTsKLQotCQkvLyBmb290ZXIKLQkJZlJlc3VsdC5hcHBlbmQoZkZvb3Rlcik7Ci0JCWphdmFPZmZzZXQgKz0gZkZvb3Rlci5sZW5ndGgoKTsKLQotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZJbXBvcnRSYW5nZXMpOwotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZEZWNsYXJhdGlvblJhbmdlcyk7Ci0JCWZKYXZhMkpzcFJhbmdlcy5wdXRBbGwoZkNvZGVSYW5nZXMpOwotCQlmSmF2YTJKc3BSYW5nZXMucHV0QWxsKGZVc2VyRUxSYW5nZXMpOwotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGphdmFSYW5nZXMKLQkgKiBAcGFyYW0gb2Zmc2V0SW5KYXZhCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVJhbmdlcyhIYXNoTWFwIHJhbmdlTWFwLCBpbnQgb2Zmc2V0SW5KYXZhKSB7Ci0JCS8vIGp1c3QgbmVlZCB0byB1cGRhdGUgamF2YSByYW5nZXMgdy8gdGhlIG9mZnNldCB3ZSBub3cga25vdwotCQlJdGVyYXRvciBpdCA9IHJhbmdlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpCi0JCQkoKFBvc2l0aW9uKSBpdC5uZXh0KCkpLm9mZnNldCArPSBvZmZzZXRJbkphdmE7Ci0JfQotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyAocG9zaXRpb25zKSBpbiBqYXZhIGRvY3VtZW50IHRvIHJhbmdlcyBpbiBqc3AgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIGEgbWFwIG9mIGphdmEgcG9zaXRpb25zIHRvIGpzcCBwb3NpdGlvbnMuCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0SmF2YTJKc3BSYW5nZXMoKSB7Ci0JCXJldHVybiBmSmF2YTJKc3BSYW5nZXM7Ci0JfQotCi0JLyoqCi0JICogbWFwIG9mIHJhbmdlcyBpbiBqc3AgZG9jdW1lbnQgdG8gcmFuZ2VzIGluIGphdmEgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiBhIG1hcCBvZiBqc3AgcG9zaXRpb25zIHRvIGphdmEgcG9zaXRpb25zLCBvciBudWxsIGlmIG5vCi0JICogICAgICAgICB0cmFuc2xhdGlvbiBoYXMgb2NjdXJlZCB5ZXQgKHRoZSBtYXAgaGFzbid0IGJlZW4gYnVpbHQpLgotCSAqLwotCXB1YmxpYyBIYXNoTWFwIGdldEpzcDJKYXZhUmFuZ2VzKCkgewotCQlpZiAoZkphdmEySnNwUmFuZ2VzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSGFzaE1hcCBmbGlwRmxvcHBlZCA9IG5ldyBIYXNoTWFwKCk7Ci0JCUl0ZXJhdG9yIGtleXMgPSBmSmF2YTJKc3BSYW5nZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJT2JqZWN0IHJhbmdlID0gbnVsbDsKLQkJd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7Ci0JCQlyYW5nZSA9IGtleXMubmV4dCgpOwotCQkJZmxpcEZsb3BwZWQucHV0KGZKYXZhMkpzcFJhbmdlcy5nZXQocmFuZ2UpLCByYW5nZSk7Ci0JCX0KLQkJcmV0dXJuIGZsaXBGbG9wcGVkOwotCX0KLQotCXB1YmxpYyBIYXNoTWFwIGdldEphdmEySnNwSW1wb3J0UmFuZ2VzKCkgewotCQlyZXR1cm4gZkltcG9ydFJhbmdlczsKLQl9Ci0KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcFVzZUJlYW5SYW5nZXMoKSB7Ci0JCXJldHVybiBmVXNlQmVhblJhbmdlczsKLQl9Ci0KLQlwdWJsaWMgSGFzaE1hcCBnZXRKYXZhMkpzcEluZGlyZWN0UmFuZ2VzKCkgewotCQlyZXR1cm4gZkluZGlyZWN0UmFuZ2VzOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdG8gdGhlIGpzcDwtPmphdmEgbWFwIGJ5IGRlZmF1bHQKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGEgY29tbWEgZGVsaW1pdGVkIGxpc3Qgb2YgaW1wb3J0cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEltcG9ydHMoU3RyaW5nIHZhbHVlKSB7Ci0JCWFkZEltcG9ydHModmFsdWUsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIFBhc3MgaW4gYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnQgdmFsdWVzLCBhcHBlbmRzIGVhY2ggdG8gdGhlCi0JICogZmluYWwgcmVzdWx0IGJ1ZmZlcgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgYSBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBpbXBvcnRzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkSW1wb3J0cyhTdHJpbmcgdmFsdWUsIGJvb2xlYW4gYWRkVG9NYXApIHsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTgxNjg3Ci0JCS8vIGFkZGVkIHRoZSAiYWRkVG9NYXAiIHBhcmFtZXRlciB0byBleGNsdWRlIGltcG9ydHMgb3JpZ2luYXRpbmcKLQkJLy8gZnJvbSBpbmNsdWRlZCBKU1AgZmlsZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGpzcDwtPmphdmEgbWFwcGluZwotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHZhbHVlLCAiLCIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdG9rID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gU3RyaW5nIGFwcGVuZGFnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCXRvayA9IHN0Lm5leHRUb2tlbigpOwotCQkJYXBwZW5kSW1wb3J0VG9CdWZmZXIodG9rLCBmQ3VycmVudE5vZGUsIGFkZFRvTWFwKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIC8qIGtlZXAgdHJhY2sgb2YgY3Vyc29yIHBvc2l0aW9uIGluc2lkZSB0aGUgYnVmZmVyIC8qIGFwcGVuZHMgYnVmZmVyIHRvCi0JICogdGhlIGZpbmFsIHJlc3VsdCBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmQoU3RyaW5nQnVmZmVyIGJ1ZikgewotCQlpZiAoZ2V0Q3Vyc29yT3duZXIoKSA9PSBidWYpIHsKLQkJCWZDdXJzb3JQb3NpdGlvbiA9IGZSZXN1bHQubGVuZ3RoKCkgKyBnZXRSZWxhdGl2ZU9mZnNldCgpOwotCQl9Ci0JCWZSZXN1bHQuYXBwZW5kKGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHZhbGlkIGFmdGVyIGEgY29uZmlndXJlKC4uLiksIHRyYW5zbGF0ZSguLi4pIG9yCi0JICogdHJhbnNsYXRlRnJvbUZpbGUoLi4uKSBjYWxsCi0JICogCi0JICogQHJldHVybiB0aGUgY3VycmVudCByZXN1bHQgKGphdmEgdHJhbnNsYXRpb24pIGJ1ZmZlcgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmdCdWZmZXIgZ2V0VHJhbnNsYXRpb24oKSB7Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQl0cnkgewotCQkJCUl0ZXJhdG9yIGl0ID0gZkphdmEySnNwUmFuZ2VzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlQb3NpdGlvbiBqYXZhID0gKFBvc2l0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiSmF2YSByYW5nZTpbIiArIGphdmEub2Zmc2V0ICsgIjoiICsgamF2YS5sZW5ndGggKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiWyIgKyBmUmVzdWx0LnRvU3RyaW5nKCkuc3Vic3RyaW5nKGphdmEub2Zmc2V0LCBqYXZhLm9mZnNldCArIGphdmEubGVuZ3RoKSArICJdXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgifG1hcHMgdG8uLi58XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlQb3NpdGlvbiBqc3AgPSAoUG9zaXRpb24pIGZKYXZhMkpzcFJhbmdlcy5nZXQoamF2YSk7Ci0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiSlNQIHJhbmdlOlsiICsganNwLm9mZnNldCArICI6IiArIGpzcC5sZW5ndGggKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiWyIgKyBmSnNwVGV4dEJ1ZmZlci50b1N0cmluZygpLnN1YnN0cmluZyhqc3Aub2Zmc2V0LCBqc3Aub2Zmc2V0ICsganNwLmxlbmd0aCkgKyAiXVxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZGVidWdTdHJpbmcuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSlNQVHJhbnNsYXRpb24gZXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgZGVidWdTdHJpbmcudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAoREVCVUdfU0FWRV9PVVRQVVQpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRGaWxlKCkuZ2V0UHJvamVjdCgpOwotCQkJU3RyaW5nIHNob3J0ZW5lZENsYXNzbmFtZSA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoZ2V0RmlsZSgpLmdldE5hbWUoKSwgIi4iLCAiXyIpOwotCQkJU3RyaW5nIGZpbGVuYW1lID0gc2hvcnRlbmVkQ2xhc3NuYW1lICsgIi5qYXZhIjsKLQkJCUlQYXRoIHBhdGggPSBwcm9qZWN0LmdldEZ1bGxQYXRoKCkuYXBwZW5kKCJzcmMvIiArIGZpbGVuYW1lKTsKLQkJCXRyeSB7Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJZmlsZS5jcmVhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSwgdHJ1ZSwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgdGV4dEZpbGVCdWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCQkJdGV4dEZpbGVCdWZmZXJNYW5hZ2VyLmNvbm5lY3QocGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIGphdmFPdXRwdXRCdWZmZXIgPSB0ZXh0RmlsZUJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIocGF0aCk7Ci0JCQkJamF2YU91dHB1dEJ1ZmZlci5nZXREb2N1bWVudCgpLnNldChTdHJpbmdVdGlscy5yZXBsYWNlKGZSZXN1bHQudG9TdHJpbmcoKSwgZ2V0Q2xhc3NuYW1lKCksIHNob3J0ZW5lZENsYXNzbmFtZSkpOwotCQkJCWphdmFPdXRwdXRCdWZmZXIuY29tbWl0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJCXRleHRGaWxlQnVmZmVyTWFuYWdlci5kaXNjb25uZWN0KHBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gdGhpcyBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcsIGlnbm9yZQotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJVcGRhdGVkIHRyYW5zbGF0aW9uOiAiICsgcGF0aCk7Ci0JCX0KLQotCQlyZXR1cm4gZlJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHZhbGlkIGFmdGVyIGEgY29uZmlndXJlKC4uLiksIHRyYW5zbGF0ZSguLi4pIG9yCi0JICogdHJhbnNsYXRlRnJvbUZpbGUoLi4uKSBjYWxsCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCBpbiB0aGUgSlNQIGZpbGUKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldEpzcFRleHQoKSB7Ci0JCXJldHVybiBmSnNwVGV4dEJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ2xpYlZhcmlhYmxlcyhTdHJpbmcgdGFnVG9BZGQpIHsKLQkJSUZpbGUgZiA9IGdldEZpbGUoKTsKLQotCQlpZiAoZiA9PSBudWxsIHx8ICFmLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCVRhZ2xpYkhlbHBlciBoZWxwZXIgPSBUYWdsaWJIZWxwZXJNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0VGFnbGliSGVscGVyKGYpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1c3RvbVRhZyA9IGdldEN1cnJlbnROb2RlKCk7Ci0JCS8qCi0JCSAqIFZhcmlhYmxlcyBjYW4gZGVjbGFyZSBhcyBhdmFpbGFibGUgd2hlbiBORVNURUQsIEFUX0JFR0lOLCBvcgotCQkgKiBBVF9FTkQuIEZvciBBVF9FTkQgdmFyaWFibGVzLCBzdG9yZSB0aGUgZW50aXJlIGxpc3Qgb2YgdmFyaWFibGVzIGluCi0JCSAqIHRoZSBtYXAgZmllbGQgc28gaXQgY2FuIGJlIHVzZWQgb24gdGhlIGVuZCB0YWcuCi0JCSAqLwotCQlTdHJpbmcgZGVjbCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjdXN0b21UYWcuZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSkgewotCQkJVGFnbGliVmFyaWFibGVbXSB0YWdsaWJWYXJzID0gaGVscGVyLmdldFRhZ2xpYlZhcmlhYmxlcyh0YWdUb0FkZCwgZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIGN1c3RvbVRhZyk7Ci0JCQkvKgotCQkJICogVGhlc2UgbG9vcHMgYXJlIGR1cGxpY2F0ZWQgaW50ZW50aW9uYWxseSB0byBrZWVwIHRoZSBuZXN0aW5nCi0JCQkgKiBzY29wZWQgdmFyaWFibGVzIGZyb20gaW50ZXJmZXJpbmcgd2l0aCB0aGUgb3RoZXJzCi0JCQkgKi8KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbGliVmFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0JFR0lOKSB7Ci0JCQkJCWRlY2wgPSB0YWdsaWJWYXJzW2ldLmdldERlY2xhcmF0aW9uU3RyaW5nKCk7Ci0JCQkJCWFwcGVuZFRvQnVmZmVyKGRlY2wsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0VORCkgewotCQkJCQlkZWNsID0gdGFnbGliVmFyc1tpXS5nZXREZWNsYXJhdGlvblN0cmluZygpOwotCQkJCQlmVGFnVG9WYXJpYWJsZU1hcC5wdXQodGFnVG9BZGQsIHRhZ2xpYlZhcnMpOwotCQkJCX0KLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFnbGliVmFycy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLk5FU1RFRCkgewotCQkJCQlkZWNsID0gdGFnbGliVmFyc1tpXS5nZXREZWNsYXJhdGlvblN0cmluZygpOwotCQkJCQlhcHBlbmRUb0J1ZmZlcigieyIsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCQkJCWFwcGVuZFRvQnVmZmVyKGRlY2wsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCQkJCWZUYWdUb1ZhcmlhYmxlTWFwLnB1dCh0YWdUb0FkZCwgdGFnbGliVmFycyk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGN1c3RvbVRhZy5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpKSB7Ci0JCQkJLyoKLQkJCQkgKiBQcm9jZXNzIE5FU1RFRCB2YXJpYWJsZXMgYmFja3dhcmRzIHNvIHRoZSBzY29wZXMgInVucm9sbCIKLQkJCQkgKiBjb3JyZWN0bHkuCi0JCQkJICovCi0JCQkJZm9yIChpbnQgaSA9IHRhZ2xpYlZhcnMubGVuZ3RoOyBpID4gMDsgaS0tKSB7Ci0JCQkJCWlmICh0YWdsaWJWYXJzW2ktMV0uZ2V0U2NvcGUoKSA9PSBWYXJpYWJsZUluZm8uTkVTVEVEKSB7Ci0JCQkJCQlhcHBlbmRUb0J1ZmZlcigifSIsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLyogVHJlYXQgdGhpcyBhcyB0aGUgZW5kIGZvciBlbXB0eSB0YWdzICovCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdsaWJWYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0VORCkgewotCQkJCQkJZGVjbCA9IHRhZ2xpYlZhcnNbaV0uZ2V0RGVjbGFyYXRpb25TdHJpbmcoKTsKLQkJCQkJCWFwcGVuZFRvQnVmZmVyKGRlY2wsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogUHJvY2VzcyBORVNURUQgdmFyaWFibGVzIGZvciBhbiBlbmQgdGFnIGJhY2t3YXJkcyBzbyB0aGUgc2NvcGVzCi0JCSAqICJ1bnJvbGwiIGNvcnJlY3RseS4KLQkJICovCi0JCWVsc2UgaWYgKGN1c3RvbVRhZy5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkgewotCQkJVGFnbGliVmFyaWFibGVbXSB0YWdsaWJWYXJzID0gKFRhZ2xpYlZhcmlhYmxlW10pIGZUYWdUb1ZhcmlhYmxlTWFwLnJlbW92ZSh0YWdUb0FkZCk7Ci0JCQlpZiAodGFnbGliVmFycyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IHRhZ2xpYlZhcnMubGVuZ3RoOyBpID4gMDsgaS0tKSB7Ci0JCQkJCWlmICh0YWdsaWJWYXJzW2ktMV0uZ2V0U2NvcGUoKSA9PSBWYXJpYWJsZUluZm8uTkVTVEVEKSB7Ci0JCQkJCQlhcHBlbmRUb0J1ZmZlcigifSIsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdsaWJWYXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmICh0YWdsaWJWYXJzW2ldLmdldFNjb3BlKCkgPT0gVmFyaWFibGVJbmZvLkFUX0VORCkgewotCQkJCQkJZGVjbCA9IHRhZ2xpYlZhcnNbaV0uZ2V0RGVjbGFyYXRpb25TdHJpbmcoKTsKLQkJCQkJCWFwcGVuZFRvQnVmZmVyKGRlY2wsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlGaWxlIGYgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCWYgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGY7Ci0JfQotCi0JLyoKLQkgKiB1c2VkIGJ5IGlubmVyIGhlbHBlciBjbGFzcyAoWE1MSlNQUmVnaW9uSGVscGVyLCBKU1BJbmNsdWRlUmVnaW9uSGVscGVyKQotCSAqLwotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJaWYgKGZCbG9ja01hcmtlcnMgPT0gbnVsbCkKLQkJCWZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXJldHVybiBmQmxvY2tNYXJrZXJzOwotCX0KLQotCS8qKgotCSAqIC8qIHRoZSBtYWluIGNvbnRyb2wgbG9vcCBmb3IgdHJhbnNsYXRpbmcgdGhlIGRvY3VtZW50LCBkcml2ZW4gYnkgdGhlCi0JICogc3RydWN0dXJlZERvY3VtZW50IG5vZGVzCi0JICovCi0JcHVibGljIHZvaWQgdHJhbnNsYXRlKCkgewotCQlpZiAoZlRhZ1RvVmFyaWFibGVNYXAgPT0gbnVsbCkgewotCQkJZlRhZ1RvVmFyaWFibGVNYXAgPSBuZXcgSGFzaE1hcCgyKTsKLQkJfQotCi0JCXNldEN1cnJlbnROb2RlKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0KLQkJd2hpbGUgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCAmJiAhaXNDYW5jZWxlZCgpKSB7Ci0KLQkJCS8vIGludGVyY2VwdCBIVE1MIGNvbW1lbnQgZmxhdCBub2RlCi0JCQkvLyBhbHNvIGhhbmRsZXMgVU5ERUZJTkVEICh3aGljaCBpcyB3aGF0IENEQVRBIGNvbWVzIGluIGFzKQotCQkJLy8gYmFzaWNhbGx5IHRoaXMgcGFydCB3aWxsIGhhbmRsZSBhbnkgImVtYmVkZGVkIiBKU1AgY29udGFpbmVycwotCQkJaWYgKGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCBnZXRDdXJyZW50Tm9kZSgpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IGdldEN1cnJlbnROb2RlKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJdHJhbnNsYXRlWE1MQ29tbWVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpdGVyYXRlIHRocm91Z2ggZWFjaCByZWdpb24gaW4gdGhlIGZsYXQgbm9kZQotCQkJCXRyYW5zbGF0ZVJlZ2lvbkNvbnRhaW5lcihnZXRDdXJyZW50Tm9kZSgpLCBTVEFOREFSRF9KU1ApOwotCQkJfQotCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkKLQkJCQlhZHZhbmNlTmV4dE5vZGUoKTsKLQkJfQotCQlidWlsZFJlc3VsdCgpOwotCi0JCWZUYWdUb1ZhcmlhYmxlTWFwLmNsZWFyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRDb250ZW50KElEb2N1bWVudCBkb2N1bWVudCwgSW5wdXRTdHJlYW0gY29udGVudFN0cmVhbSwgU3RyaW5nIGNoYXJzZXQpIHsKLQkJUmVhZGVyIGluID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihjb250ZW50U3RyZWFtLCBjaGFyc2V0KSwgMjA0OCk7Ci0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigyMDQ4KTsKLQkJCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbMjA0OF07Ci0JCQlpbnQgbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl3aGlsZSAobiA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCW4gPSBpbi5yZWFkKHJlYWRCdWZmZXIpOwotCQkJfQotCQkJZG9jdW1lbnQuc2V0KGJ1ZmZlci50b1N0cmluZygpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNsYXRvcidzIHByb2dyc3MgbW9uaXRvciwgZmFsc2UgaWYgdGhlCi0JICogICAgICAgICBtb25pdG9yIGlzIG51bGwKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJcmV0dXJuIChmUHJvZ3Jlc3NNb25pdG9yID09IG51bGwpID8gZmFsc2UgOiBmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWR2YW5jZU5leHROb2RlKCkgewotCQlzZXRDdXJyZW50Tm9kZShnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKSk7Ci0JCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpCi0JCQlzZXRTb3VyY2VSZWZlcmVuY2VQb2ludCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTb3VyY2VSZWZlcmVuY2VQb2ludCgpIHsKLQkJaWYgKGlzSlNQKGdldEN1cnJlbnROb2RlKCkuZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlyID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UIHx8IHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpCi0JCQkJCWJyZWFrOwotCQkJCWVsc2UgaWYgKHIuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkKLQkJCQkJYnJlYWs7Ci0JCQkJZWxzZSBpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSAmJiBnZXRDdXJyZW50Tm9kZSgpLmdldEZ1bGxUZXh0KHIpLnRyaW0oKS5lcXVhbHMoImltcG9ydCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogdHJhbnNsYXRlcyBhIHJlZ2lvbiBjb250YWluZXIgKGFuZCBYTUwgSlNQIGNvbnRhaW5lciwgb3IgPCUgSlNQCi0JICogY29udGFpbmVyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVJlZ2lvbkNvbnRhaW5lcihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyLCBpbnQgSlNQVHlwZSkgewotCi0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24gPSBjb250YWluZXI7Ci0KLQkJLy8gY3VzdG9tIHRhZ3MgbmVlZCB0aGVpciBvd24gc2NvcGUge30KLQkJaGFuZGxlU2NvcGluZ0lmTmVjZXNzYXJ5KGNvbnRhaW5lclJlZ2lvbik7Ci0KLQkJSXRlcmF0b3IgcmVnaW9ucyA9IGNvbnRhaW5lclJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0KLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQotCQkJLy8gY29udGVudCBhc3Npc3Qgd2FzIG5vdCBzaG93aW5nIHVwIGluIEpTUCBpbnNpZGUgYSBqYXZhc2NyaXB0Ci0JCQkvLyByZWdpb24KLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCS8vIGNoZWNrIGlmIGl0J3MgbmVzdGVkIGpzcCBpbiBhIHNjcmlwdCB0YWcuLi4KLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJdHJhbnNsYXRlSlNQTm9kZShyZWdpb24sIHJlZ2lvbnMsIHR5cGUsIEVNQkVEREVEX0pTUCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkJCQkvLyBUSElTIEVNQkVEREVEIEpTUCBURVhUIFdJTEwgQ09NRSBPVVQgTEFURVIgV0hFTgotCQkJCQkvLyBQQVJUSVRJT05JTkcgSEFTCi0JCQkJCS8vIFNVUFBPUlQgRk9SIE5FU1RFRCBYTUwtSlNQCi0JCQkJCS8vIENNVkMgMjQxODgyCi0JCQkJCWRlY29kZVNjcmlwdEJsb2NrKGNvbnRhaW5lclJlZ2lvbi5nZXRGdWxsVGV4dChyZWdpb24pLCBjb250YWluZXJSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQkJfQotCQkJfQotCQkJaWYgKHR5cGUgIT0gbnVsbCAmJiBpc0pTUCh0eXBlKSkgLy8gPCUsIDwlPSwgPCUhLCA8JUAKLQkJCXsKLQkJCQkvLyB0cmFuc2xhdGVKU1BOb2RlKHJlZ2lvbiwgcmVnaW9ucywgdHlwZSwgSlNQVHlwZSk7Ci0JCQkJdHJhbnNsYXRlSlNQTm9kZShjb250YWluZXJSZWdpb24sIHJlZ2lvbnMsIHR5cGUsIEpTUFR5cGUpOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSAhPSBudWxsICYmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSkgewotCQkJCXRyYW5zbGF0ZVhNTE5vZGUoY29udGFpbmVyUmVnaW9uLCByZWdpb25zKTsKLQkJCX0KLQkJfQotCQkvLyB9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNjb3BpbmdJZk5lY2Vzc2FyeShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uKSB7Ci0JCWlmICh0cnVlKQotCQkJcmV0dXJuOwotCi0JCS8vIGNvZGUgd2l0aGluIGEgY3VzdG9tIHRhZyBnZXRzIGl0cyBvd24gc2NvcGUKLQkJLy8gc28gaWYgd2UgZW5jb3VudGVyIGEgc3RhcnQgb2YgYSBjdXN0b20gdGFnLCB3ZSBhZGQgJ3snCi0JCS8vIGFuZCBmb3IgdGhlIGVuZCBvZiBhIGN1c3RvbSB0YWcgd2UgYWRkICd9JwotCQlpZiAoY29udGFpbmVyUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkvLyBkb24ndCBhZGQgJ3snIGlmIGl0J3MgYSBzZWxmIGNsb3NpbmcgdGFnCi0JCQlpZiAoIWlzU2VsZkNsb3NpbmdUYWcoY29udGFpbmVyUmVnaW9uKSkgewotCQkJCWlmIChpc0N1c3RvbVRhZyhjb250YWluZXJSZWdpb24pKSB7Ci0JCQkJCXN0YXJ0U2NvcGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY29udGFpbmVyUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJaWYgKGlzQ3VzdG9tVGFnKGNvbnRhaW5lclJlZ2lvbikpIHsKLQkJCQllbmRTY29wZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0U2NvcGUoKSB7Ci0JCS8vIGZTY29wZURlcHRoKys7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkvLyBmb3IoaW50IGk9MDsgaTxmU2NvcGVEZXB0aDsgaSsrKSB0ZXh0LmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCXRleHQuYXBwZW5kKCJ7IC8vIDwiKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0LmFwcGVuZChnZXRSZWdpb25OYW1lKGZDdXJyZW50Tm9kZSkpOwotCQl0ZXh0LmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJYXBwZW5kVG9CdWZmZXIodGV4dC50b1N0cmluZygpLCBmVXNlckNvZGUsIGZhbHNlLCBmQ3VycmVudE5vZGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGVuZFNjb3BlKCkgewotCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJdGV4dC5hcHBlbmQoIn0gLy8gPC8iKTsgLy8kTk9OLU5MUy0xJAotCQl0ZXh0LmFwcGVuZChnZXRSZWdpb25OYW1lKGZDdXJyZW50Tm9kZSkpOwotCQl0ZXh0LmFwcGVuZCgiPlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJYXBwZW5kVG9CdWZmZXIodGV4dC50b1N0cmluZygpLCBmVXNlckNvZGUsIGZhbHNlLCBmQ3VycmVudE5vZGUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2VsZkNsb3NpbmdUYWcoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lclJlZ2lvbikgewotCi0JCWlmIChjb250YWluZXJSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGNvbnRhaW5lclJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIHIgPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQlyZXR1cm4gci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0N1c3RvbVRhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyUmVnaW9uKSB7Ci0JCVN0cmluZyB0YWdOYW1lID0gZ2V0UmVnaW9uTmFtZShjb250YWluZXJSZWdpb24pOwotCi0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKHRhZ05hbWUuaW5kZXhPZigiOiIpID4gMCAmJiAhdGFnTmFtZS5zdGFydHNXaXRoKCJqc3AiKSkgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlZ2lvbk5hbWUoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lclJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGNvbnRhaW5lclJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCW5hbWVSZWdpb24gPSByOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lUmVnaW9uICE9IG51bGwgPyBjb250YWluZXJSZWdpb24uZ2V0VGV4dChuYW1lUmVnaW9uKS50cmltKCkgOiBudWxsOwotCX0KLQotCS8qCi0JICogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAqKgotCSAqIFRFTVAgV09SS0FST1VORCBGT1IgQ01WQyAyNDE4ODIgVGFrZXMgYSBTdHJpbmcgYW5kIGJsb2NrcyBvdXQKLQkgKiBqc3A6c2NyaXB0bGV0LCBqc3A6ZXhwcmVzc2lvbiwgYW5kIGpzcDpkZWNsYXJhdGlvbiBAcGFyYW0gYmxvY2tUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgdm9pZCBkZWNvZGVTY3JpcHRCbG9jayhTdHJpbmcgYmxvY2tUZXh0LCBpbnQgc3RhcnRPZkJsb2NrKSB7Ci0JCVhNTEpTUFJlZ2lvbkhlbHBlciBoZWxwZXIgPSBuZXcgWE1MSlNQUmVnaW9uSGVscGVyKHRoaXMpOwotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6c2NyaXB0bGV0IiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJaGVscGVyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmV4cHJlc3Npb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGVjbGFyYXRpb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UpKTsgLy8kTk9OLU5MUy0xJAotCQloZWxwZXIuYWRkQmxvY2tNYXJrZXIobmV3IEJsb2NrTWFya2VyKCJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiIsIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCWhlbHBlci5yZXNldChibG9ja1RleHQsIHN0YXJ0T2ZCbG9jayk7Ci0JCS8vIGZvcmNlIHBhcnNlCi0JCWhlbHBlci5mb3JjZVBhcnNlKCk7Ci0JfQotCi0JLyoKLQkgKiByZXR1cm5zIHN0cmluZyBtaW51cyBDREFUQSBvcGVuIGFuZCBjbG9zZSB0ZXh0Ci0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyBzdHJpcENEQVRBKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyByZXN1bHRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENEQVRBX09QRU4gPSAiPCFbQ0RBVEFbIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ0RBVEFfQ0xPU0UgPSAiXV0+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgZW5kID0gdGV4dC5sZW5ndGgoKTsKLQkJd2hpbGUgKHN0YXJ0IDwgdGV4dC5sZW5ndGgoKSkgewotCQkJaWYgKHRleHQuaW5kZXhPZihDREFUQV9PUEVOLCBzdGFydCkgPiAtMSkgewotCQkJCWVuZCA9IHRleHQuaW5kZXhPZihDREFUQV9PUEVOLCBzdGFydCk7Ci0JCQkJcmVzdWx0VGV4dCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCQlzdGFydCA9IGVuZCArIENEQVRBX09QRU4ubGVuZ3RoKCk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmluZGV4T2YoQ0RBVEFfQ0xPU0UsIHN0YXJ0KSA+IC0xKSB7Ci0JCQkJZW5kID0gdGV4dC5pbmRleE9mKENEQVRBX0NMT1NFLCBzdGFydCk7Ci0JCQkJcmVzdWx0VGV4dCArPSB0ZXh0LnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQkJCQlzdGFydCA9IGVuZCArIENEQVRBX0NMT1NFLmxlbmd0aCgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZW5kID0gdGV4dC5sZW5ndGgoKTsKLQkJCQlyZXN1bHRUZXh0ICs9IHRleHQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRUZXh0OwotCX0KLQotCS8vIEVORCBPRiBXT1JLQVJPVU5EIENPREUuLi4KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLyoqCi0JICogZGV0ZXJtaW5lcyBpZiB0aGUgdHlwZSBpcyBhIHB1cmUgSlNQIHR5cGUgKG5vdCBYTUwpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNKU1AoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4gfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOKSAmJiB0eXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKTsKLQkJLy8gY2hlY2tpbmcgWE1MX1RBR19PUEVOIHNvIDxqc3A6ZGlyZWN0aXZlLnh4eC8+IGdldHMgdHJlYXRlZCBsaWtlCi0JCS8vIG90aGVyIFhNTCBqc3AgdGFncwotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgdGhlIHZhcmlvdXMgWE1MSlNQIHR5cGUgbm9kZXMKLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9ucwotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbnMgb2YgdGhlIFhNTE5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVYTUxOb2RlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIsIEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJLy8gY29udGVudHMgbXVzdCBiZSB2YWxpZCBYSFRNTCwgdHJhbnNsYXRlIGVzY2FwZWQgQ0RBVEEgaW50byB3aGF0IGl0Ci0JCS8vIHJlYWxseSBpcy4uLgotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJaWYgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQlyID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCS8vIDxqc3A6ZGlyZWN0aXZlLnh4eCA+IGNvbWVzIGluIGFzIHRoaXMKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCByLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0KLQkJCXsKLQkJCQlTdHJpbmcgZnVsbFRhZ05hbWUgPSBjb250YWluZXIuZ2V0VGV4dChyKTsKLQkJCQlpZiAoZnVsbFRhZ05hbWUuaW5kZXhPZignOicpID4gLTEpIHsKLQkJCQkJYWRkVGFnbGliVmFyaWFibGVzKGZ1bGxUYWdOYW1lKTsgLy8gaXQgbWF5IGJlIGEgY3VzdG9tCi0JCQkJCS8vIHRhZwotCQkJCX0KLQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZ1bGxUYWdOYW1lLCAiOi4iLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpICYmIHN0Lm5leHRUb2tlbigpLmVxdWFscygianNwIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWlmIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCVN0cmluZyBqc3BUYWdOYW1lID0gc3QubmV4dFRva2VuKCk7Ci0KLQkJCQkJCWlmIChqc3BUYWdOYW1lLmVxdWFscygic2NyaXB0bGV0IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQl0cmFuc2xhdGVYTUxKU1BDb250ZW50KFNDUklQVExFVCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZXhwcmVzc2lvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJdHJhbnNsYXRlWE1MSlNQQ29udGVudChFWFBSRVNTSU9OKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJkZWNsYXJhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQl7Ci0JCQkJCQkJdHJhbnNsYXRlWE1MSlNQQ29udGVudChERUNMQVJBVElPTik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZGlyZWN0aXZlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlpZiAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gc3QubmV4dFRva2VuKCk7Ci0JCQkJCQkJCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygidGFnbGliIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJaGFuZGxlVGFnbGliKCk7Ci0JCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAoZGlyZWN0aXZlTmFtZS5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0KLQkJCQkJCQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCQkJCQkvLyBza2lwIHRvIHJlcXVpcmVkICJmaWxlIiBhdHRyaWJ1dGUsCi0JCQkJCQkJCQkvLyBzaG91bGQgYmUgc2FmZSBiZWNhdXNlCi0JCQkJCQkJCQkvLyAiZmlsZSIgaXMgdGhlIG9ubHkgYXR0cmlidXRlIGZvciB0aGUKLQkJCQkJCQkJCS8vIGluY2x1ZGUgZGlyZWN0aXZlCi0JCQkJCQkJCQl3aGlsZSAociAhPSBudWxsICYmIHJlZ2lvbnMuaGFzTmV4dCgpICYmICFyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJCQkJCQkJCXIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZmlsZUxvY2F0aW9uID0gZ2V0QXR0cmlidXRlVmFsdWUociwgcmVnaW9ucyk7Ci0JCQkJCQkJCQlpZiAoZmlsZUxvY2F0aW9uICE9IG51bGwpCi0JCQkJCQkJCQkJaGFuZGxlSW5jbHVkZUZpbGUoZmlsZUxvY2F0aW9uKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIGlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygicGFnZSIpKSB7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCQkJLy8gYmFkIGlmIGN1cnJlbnROb2RlIGlzIHJlZmVyZW5jZWQgYWZ0ZXIKLQkJCQkJCQkJCS8vIGhlcmUgdy8gdGhlIGN1cnJlbnQgbGlzdAotCQkJCQkJCQkJLy8gc2VlOgotCQkJCQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzUKLQkJCQkJCQkJCS8vIHNldEN1cnJlbnROb2RlKGdldEN1cnJlbnROb2RlKCkuZ2V0TmV4dCgpKTsKLQkJCQkJCQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJCQkvLyAncmVnaW9ucycgY29udGFpbiB0aGUgYXR0cnMKLQkJCQkJCQkJCQl0cmFuc2xhdGVQYWdlRGlyZWN0aXZlQXR0cmlidXRlcyhyZWdpb25zKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIDxqc3A6aW5jbHVkZSBwYWdlPSJmaWxlbmFtZSIpIC8+Ci0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAicGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygiZm9yd2FyZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJwYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKGpzcFRhZ05hbWUuZXF1YWxzKCJwYXJhbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljaGVja0F0dHJpYnV0ZVZhbHVlQ29udGFpbmVyKHJlZ2lvbnMsICJ2YWx1ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChqc3BUYWdOYW1lLmVxdWFscygic2V0UHJvcGVydHkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihyZWdpb25zLCAidmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoanNwVGFnTmFtZS5lcXVhbHMoInVzZUJlYW4iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJewotCQkJCQkJCWNoZWNrQXR0cmlidXRlVmFsdWVDb250YWluZXIocmVnaW9ucywgIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwMDQKLQkJCQkJCQkvLyBhZHZhbmNlTmV4dE5vZGUoKTsgLy8gZ2V0IHRoZSBjb250ZW50Ci0JCQkJCQkJaWYgKGdldEN1cnJlbnROb2RlKCkgIT0gbnVsbCkgewotCQkJCQkJCQl0cmFuc2xhdGVVc2VCZWFuKGNvbnRhaW5lcik7IC8vICdyZWdpb25zJwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQljaGVja0FsbEF0dHJpYnV0ZVZhbHVlQ29udGFpbmVycyhyZWdpb25zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0cmFuc2xhdGVzIGVtYmVkZGVkIGNvbnRhaW5lcnMgZm9yIEFMTCBhdHRyaWJ1dGUgdmFsdWVzCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tBbGxBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcnMoSXRlcmF0b3IgcmVnaW9ucykgewotCQkvLyB0YWcgbmFtZSBpcyBub3QganNwCi0JCS8vIGhhbmRsZSBlbWJlZGRlZCBqc3AgYXR0cmlidXRlcy4uLgotCQlJVGV4dFJlZ2lvbiBlbWJlZGRlZCA9IG51bGw7Ci0JCS8vIEl0ZXJhdG9yIGF0dHJSZWdpb25zID0gbnVsbDsKLQkJLy8gSVRleHRSZWdpb24gYXR0ckNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQllbWJlZGRlZCA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoZW1iZWRkZWQgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCS8vIHBhcnNlIG91dCBjb250YWluZXIKLQotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzA2MDYKLQkJCQkvLyBmaXggZXhwb25lbnRpYWwgaXRlcmF0aW9uIHByb2JsZW0gdy8gZW1iZWRkZWQgZXhwcmVzc2lvbnMKLQkJCQl0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgZW1iZWRkZWQpOwotCQkJCS8vIGF0dHJSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikKLQkJCQkvLyBlbWJlZGRlZCkuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJLy8gd2hpbGUgKGF0dHJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCS8vIGF0dHJDaHVuayA9IChJVGV4dFJlZ2lvbikgYXR0clJlZ2lvbnMubmV4dCgpOwotCQkJCS8vIFN0cmluZyB0eXBlID0gYXR0ckNodW5rLmdldFR5cGUoKTsKLQkJCQkvLyAvLyBlbWJlZGRlZCBKU1AgaW4gYXR0cmlidXRlIHN1cHBvcnQgb25seSB3YW50IHRvCi0JCQkJLy8gLy8gdHJhbnNsYXRlIG9uZSB0aW1lIHBlcgotCQkJCS8vIC8vIGVtYmVkZGVkIHJlZ2lvbiBzbyB3ZSBvbmx5IHRyYW5zbGF0ZSBvbiB0aGUgSlNQIG9wZW4KLQkJCQkvLyAvLyB0YWdzIChub3QgY29udGVudCkKLQkJCQkvLyBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOIHx8Ci0JCQkJLy8gdHlwZSA9PQotCQkJCS8vIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTiB8fCB0eXBlID09Ci0JCQkJLy8gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4gfHwgdHlwZSA9PQotCQkJCS8vIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiB8fCB0eXBlID09Ci0JCQkJLy8gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pIHsKLQkJCQkvLyAvLyBub3cgY2FsbCBqc3B0cmFuc2xhdGUKLQkJCQkvLyB0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikKLQkJCQkvLyBlbWJlZGRlZCk7Ci0JCQkJLy8gYnJlYWs7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRyYW5zbGF0ZXMgZW1iZWRkZWQgY29udGFpbmVyIGZvciBzcGVjaWZpZWQgYXR0cmlidXRlCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbnMKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVWYWx1ZUNvbnRhaW5lcihJdGVyYXRvciByZWdpb25zLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FICYmIGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKS5lcXVhbHMoYXR0ck5hbWUpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBza2lwIHRvIGF0dHJpYnV0ZSB2YWx1ZQotCQkJCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwpIHsKLQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gZm9yY2VzIGVtYmVkZGVkIHJlZ2lvbiB0byBiZSB0cmFuc2xhdGVkCi0JCQkJaWYgKHIgaW5zdGFuY2VvZiBDb250ZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5BdHRyaWJ1dGUoKENvbnRleHRSZWdpb25Db250YWluZXIpIHIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogZXhhbXBsZToKLQkgKiAKLQkgKiA8anNwOnNjcmlwdGxldD5zY3JpcHRsZXQganNwLWphdmEgY29udGVudCA8IVtDREFUQVsgbW9yZSBqc3AgamF2YSBdXT4KLQkgKiBqc3AtamF2YSBjb250ZW50Li4uIDwhW0NEQVRBWyBtb3JlIGpzcCBqYXZhIF1dPiA8L2pzcDpzY3JpcHRsZXQ+Ci0JICogCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTkzMzY2Ci0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NTkwIHRyYW5zbGF0ZQotCSAqIGV2ZXJ5dGhpbmcgaW5iZXR3ZWVuIDxzY3JpcHRsZXQ+IHRhZ3MsIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4gb25lCi0JICogcmVnaW9uIChlc3AuIENEQVRBKQotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVYTUxKU1BDb250ZW50KGludCB0eXBlKSB7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBnZXRDdXJyZW50Tm9kZSgpLmdldE5leHQoKTsKLQkJaW50IHN0YXJ0ID0gc2RyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCVN0cmluZyBzZHJUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByZWFkIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9ucyB1bnRpbAotCQkvLyA8L2pzcDpzY3JpcHRsZXQ+IG9yIEVPRgotCQl3aGlsZSAoc2RyICE9IG51bGwgJiYgc2RyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCi0JCQkvLyBzZXR1cCBmb3IgbmV4dCByZWdpb24KLQkJCXN0YXJ0ID0gc2RyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlzZHJUZXh0ID0gc2RyLmdldFRleHQoKTsKLQotCQkJaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCi0JCQkJLy8ganVzdCB0byBiZSBzYWZlLCBtYWtlIHN1cmUgQ0RBVEEgc3RhcnQgJiBlbmQgYXJlIHRoZXJlCi0JCQkJaWYgKHNkclRleHQuc3RhcnRzV2l0aCgiPCFbQ0RBVEFbIikgJiYgc2RyVGV4dC5lbmRzV2l0aCgiXV0+IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJc3RhcnQgPSBzZHIuZ2V0U3RhcnRPZmZzZXQoKSArIDk7IC8vIDwhW0NEQVRBWwotCQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCkgLSAzOyAvLyBdXT4KLQkJCQkJc2RyVGV4dCA9IHNkclRleHQuc3Vic3RyaW5nKDksIHNkclRleHQubGVuZ3RoKCkgLSAzKTsKLQkJCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCBzZHJUZXh0LCBzdGFydCwgZW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQotCQkJCS8vIGhhbmRsZSBlbnRpdHkgcmVmZXJlbmNlcwotCQkJCXNkclRleHQgPSBFc2NhcGVkVGV4dFV0aWwuZ2V0VW5lc2NhcGVkVGV4dChzZHJUZXh0KTsKLQkJCQllbmQgPSBzZHIuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJd3JpdGVUb0J1ZmZlcih0eXBlLCBzZHJUZXh0LCBzdGFydCwgZW5kKTsKLQkJCX0KLQkJCXNkciA9IHNkci5nZXROZXh0KCk7Ci0JCX0KLQkJc2V0Q3VycmVudE5vZGUoc2RyKTsKLQkJc2V0U291cmNlUmVmZXJlbmNlUG9pbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgd3JpdGVUb0J1ZmZlcihpbnQgdHlwZSwgU3RyaW5nIGNvbnRlbnQsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCkgewotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgU0NSSVBUTEVUIDoKLQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoY29udGVudCwgZ2V0Q3VycmVudE5vZGUoKSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0KTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVhQUkVTU0lPTiA6Ci0JCQkJdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhjb250ZW50LCBnZXRDdXJyZW50Tm9kZSgpLCBqc3BTdGFydCwganNwRW5kIC0ganNwU3RhcnQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBERUNMQVJBVElPTiA6Ci0JCQkJdHJhbnNsYXRlRGVjbGFyYXRpb25TdHJpbmcoY29udGVudCwgZ2V0Q3VycmVudE5vZGUoKSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0KTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdvZXMgdGhyb3VnaCBjb21tZW50IHJlZ2lvbnMsIGNoZWNrcyBpZiBhbnkgYXJlIGFuIGVtYmVkZGVkIEpTUAotCSAqIGNvbnRhaW5lciBpZiBpdCBmaW5kcyBvbmUsIGl0J3Mgc2VuZHMgdGhlIGNvbnRhaW5lciBpbnRvIHRoZQotCSAqIHRyYW5zbGF0aW9uIHJvdXRpbmUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVYTUxDb21tZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSXRlcmF0b3IgaXQgPSBub2RlLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50UmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0ICE9IG51bGwgJiYgaXQuaGFzTmV4dCgpKSB7Ci0JCQljb21tZW50UmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQlpZiAoY29tbWVudFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJdHJhbnNsYXRlUmVnaW9uQ29udGFpbmVyKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgY29tbWVudFJlZ2lvbiwgRU1CRURERURfSlNQKTsgLy8gaXQncwotCQkJCS8vIGVtYmVkZGVkCi0JCQkJLy8ganNwLi4uaXRlcmF0ZQotCQkJCS8vIHJlZ2lvbnMuLi4KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGRldGVybWluZXMgd2hpY2ggdHlwZSBvZiBKU1Agbm9kZSB0byB0cmFuc2xhdGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVKU1BOb2RlKElUZXh0UmVnaW9uIHJlZ2lvbiwgSXRlcmF0b3IgcmVnaW9ucywgU3RyaW5nIHR5cGUsIGludCBKU1BUeXBlKSB7Ci0JCWlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTiAmJiByZWdpb25zICE9IG51bGwpIHsKLQkJCXRyYW5zbGF0ZURpcmVjdGl2ZShyZWdpb25zKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250ZW50UmVnaW9uID0gbnVsbDsKLQkJCWlmIChKU1BUeXBlID09IFNUQU5EQVJEX0pTUCAmJiAoc2V0Q3VycmVudE5vZGUoZ2V0Q3VycmVudE5vZGUoKS5nZXROZXh0KCkpKSAhPSBudWxsKSB7Ci0JCQkJY29udGVudFJlZ2lvbiA9IGdldEN1cnJlbnROb2RlKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChKU1BUeXBlID09IEVNQkVEREVEX0pTUCAmJiByZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQotCQkJCXRyYW5zbGF0ZUVtYmVkZGVkSlNQSW5CbG9jaygoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24pOwotCQkJCS8vIGVuc3VyZSB0aGUgcmVzdCBvZiB0aGlzIG1ldGhvZCB3b24ndCBiZSBjYWxsZWQKLQkJCQljb250ZW50UmVnaW9uID0gbnVsbDsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB7Ci0JCQkJCXRyYW5zbGF0ZUV4cHJlc3Npb24oY29udGVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCQkJdHJhbnNsYXRlRGVjbGFyYXRpb24oY29udGVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQkJdHJhbnNsYXRlU2NyaXB0bGV0KGNvbnRlbnRSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoaXMgaXMgdGhlIGNhc2Ugb2YgYW4gYXR0cmlidXRlIHcvIG5vIHJlZ2lvbiA8cAotCQkJCS8vIGFsaWduPSI8JSU+Ij4KLQkJCQlzZXRDdXJzb3JPd25lcihnZXRKU1BUeXBlRm9yUmVnaW9uKHJlZ2lvbikpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlRUwoU3RyaW5nIGVsVGV4dCwgU3RyaW5nIGRlbGltLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCBpbnQgY29udGVudFN0YXJ0LCBpbnQgY29udGVudExlbmd0aCkgewotCQlJSlNQRUxUcmFuc2xhdG9yIHRyYW5zbGF0b3IgPSBnZXRFTFRyYW5zbGF0b3IoKTsKLQkJaWYgKG51bGwgIT0gdHJhbnNsYXRvcikgewotCQkJdHJhbnNsYXRvci50cmFuc2xhdGVFTChlbFRleHQsIGRlbGltLCBjdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50TGVuZ3RoLCBmVXNlckVMRXhwcmVzc2lvbnMsIGZVc2VyRUxSYW5nZXMsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY292ZXIgYW5kIGluc3RhbnRpYXRlIGFuIEVMIHRyYW5zbGF0b3IuCi0JICovCi0JcHVibGljIElKU1BFTFRyYW5zbGF0b3IgZ2V0RUxUcmFuc2xhdG9yKCkgewotCQlpZiAoZkVMVHJhbnNsYXRvciA9PSBudWxsKSB7Ci0KLQkJCUlFeHRlbnNpb25Qb2ludCBleHRlbnNpb25Qb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoSlNQX0NPUkVfUExVR0lOX0lELCAvLyBuYW1lCi0JCQkJCQkvLyBvZgotCQkJCQkJLy8gcGx1Z2luCi0JCQkJCQkvLyB0aGF0Ci0JCQkJCQkvLyBleHBvc2VzCi0JCQkJCQkvLyB0aGlzCi0JCQkJCQkvLyBleHRlbnNpb24KLQkJCQkJCS8vIHBvaW50Ci0JCQkJCQlFTF9UUkFOU0xBVE9SX0VYVEVOU0lPTl9OQU1FKTsgLy8gLSBleHRlbnNpb24gaWQKLQotCQkJLy8gSXRlcmF0ZSBvdmVyIGFsbCBkZWNsYXJlZCBleHRlbnNpb25zIG9mIHRoaXMgZXh0ZW5zaW9uIHBvaW50LgotCQkJLy8gQSBzaW5nbGUgcGx1Z2luIG1heSBleHRlbmQgdGhlIGV4dGVuc2lvbiBwb2ludCBtb3JlIHRoYW4gb25jZSwKLQkJCS8vIGFsdGhvdWdoIGl0J3Mgbm90IHJlY29tbWVuZGVkLgotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGJlc3RUcmFuc2xhdG9yID0gbnVsbDsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gZXh0ZW5zaW9uUG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZm9yIChpbnQgY3VyRXh0ZW5zaW9uID0gMDsgY3VyRXh0ZW5zaW9uIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGN1ckV4dGVuc2lvbisrKSB7Ci0JCQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleHRlbnNpb25zW2N1ckV4dGVuc2lvbl07Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSB0cmFuc2xhdG9ycyA9IGV4dGVuc2lvbi5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCQlmb3IgKGludCBjdXJUcmFuc2xhdG9yID0gMDsgY3VyVHJhbnNsYXRvciA8IHRyYW5zbGF0b3JzLmxlbmd0aDsgY3VyVHJhbnNsYXRvcisrKSB7Ci0KLQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsVHJhbnNsYXRvciA9IHRyYW5zbGF0b3JzW2N1clRyYW5zbGF0b3JdOwotCi0JCQkJCWlmICghRUxfVFJBTlNMQVRPUl9FWFRFTlNJT05fTkFNRS5lcXVhbHMoZWxUcmFuc2xhdG9yLmdldE5hbWUoKSkpIHsgLy8gLQotCQkJCQkJLy8gbmFtZQotCQkJCQkJLy8gb2YKLQkJCQkJCS8vIGNvbmZpZ0VsZW1lbnQKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIGlkU3RyaW5nID0gZWxUcmFuc2xhdG9yLmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAobnVsbCAhPSBpZFN0cmluZyAmJiBpZFN0cmluZy5lcXVhbHMoZkVMVHJhbnNsYXRvcklEKSB8fCAobnVsbCA9PSBiZXN0VHJhbnNsYXRvciAmJiBERUZBVUxUX0pTUF9FTF9UUkFOU0xBVE9SX0lELmVxdWFscyhpZFN0cmluZykpKSB7Ci0JCQkJCQliZXN0VHJhbnNsYXRvciA9IGVsVHJhbnNsYXRvcjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG51bGwgIT0gYmVzdFRyYW5zbGF0b3IpIHsKLQkJCQl0cnkgewotCQkJCQlPYmplY3QgZXhlY0V4dCA9IGJlc3RUcmFuc2xhdG9yLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKGV4ZWNFeHQgaW5zdGFuY2VvZiBJSlNQRUxUcmFuc2xhdG9yKSB7Ci0JCQkJCQlyZXR1cm4gZkVMVHJhbnNsYXRvciA9IChJSlNQRUxUcmFuc2xhdG9yKSBleGVjRXh0OwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZFTFRyYW5zbGF0b3I7Ci0JfQotCi0JLyoqCi0JICogUGFzcyB0aGUgSVRleHRSZWdpb25Db2xsZWN0aW9uIHdoaWNoIGlzIHRoZSBlbWJlZGRlZCByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gaXRlcmF0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkJsb2NrKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb2xsZWN0aW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQlpZiAoaXNKU1AocmVnaW9uLmdldFR5cGUoKSkpCi0JCQkJYnJlYWs7Ci0JCQlyZWdpb24gPSBudWxsOwotCQl9Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJdHJhbnNsYXRlRW1iZWRkZWRKU1BJbkF0dHJpYnV0ZShjb2xsZWN0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogZm9yIGV4YW1wbGU6IDxhIGhyZWY9ImluZGV4LmpzcD9wPTwlPWFiYyU+Yj08JT14eXolPiI+YWJjPC9hPgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2xhdGVFbWJlZGRlZEpTUEluQXR0cmlidXRlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBlbWJlZGRlZENvbnRhaW5lcikgewotCQkvLyBUSElTIE1FVEhPRCBJUyBBIEZJWCBGT1IKLQkJLy8ganNwIGVtYmVkZGVkIGluIGF0dHJpYnV0ZSByZWdpb25zCi0JCS8vIGxvb3AgYWxsIHJlZ2lvbnMKLQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gZGVsaW0gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBjb250ZW50ID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVtYmVkZGVkUmVnaW9ucy5zaXplKCk7IGkrKykgewotCi0JCQkvLyBwb3NzaWJsZSBkZWxpbWl0ZXIsIGNoZWNrIGxhdGVyCi0JCQlkZWxpbSA9IGVtYmVkZGVkUmVnaW9ucy5nZXQoaSk7Ci0JCQl0eXBlID0gZGVsaW0uZ2V0VHlwZSgpOwotCi0JCQkvLyBjaGVjayBuZXh0IHJlZ2lvbiB0byBzZWUgaWYgaXQncyBjb250ZW50Ci0JCQlpZiAoaSArIDEgPCBlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBlbWJlZGRlZFJlZ2lvbnMuZ2V0KGkgKyAxKS5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgcmVnaW9uVHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkKLQkJCQkJY29udGVudCA9IGVtYmVkZGVkUmVnaW9ucy5nZXQoaSArIDEpOwotCi0JCQl9Ci0KLQkJCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCQlpbnQgY29udGVudFN0YXJ0ID0gZW1iZWRkZWRDb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoY29udGVudCk7Ci0JCQkJaW50IHJTdGFydCA9IGZDdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpICsgY29udGVudFN0YXJ0OwotCQkJCWludCByRW5kID0gZkN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyBlbWJlZGRlZENvbnRhaW5lci5nZXRFbmRPZmZzZXQoY29udGVudCk7Ci0KLQkJCQlib29sZWFuIGluVGhpc1JlZ2lvbiA9IHJTdGFydCA8PSBmU291cmNlUG9zaXRpb24gJiYgckVuZCA+PSBmU291cmNlUG9zaXRpb247Ci0JCQkJLy8gaW50IGpzcFBvc2l0aW9uU3RhcnQgPSBmQ3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArCi0JCQkJLy8gY29udGVudFN0YXJ0OwotCi0JCQkJaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgewotCQkJCQlmTGFzdEpTUFR5cGUgPSBFWFBSRVNTSU9OOwotCQkJCQkvLyB0cmFuc2xhdGVFeHByZXNzaW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksCi0JCQkJCS8vIGZDdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQkJdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhlbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0KGNvbnRlbnQpLCBlbWJlZGRlZENvbnRhaW5lciwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gU0NSSVBUTEVUOwotCQkJCQkvLyB0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwKLQkJCQkJLy8gZkN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnQuZ2V0TGVuZ3RoKCkpOwotCQkJCQl0cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gREVDTEFSQVRJT047Ci0JCQkJCS8vIHRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKGVtYmVkZGVkQ29udGFpbmVyLmdldFRleHQoY29udGVudCksCi0JCQkJCS8vIGZDdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQkJdHJhbnNsYXRlRGVjbGFyYXRpb25TdHJpbmcoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIsIGNvbnRlbnRTdGFydCwgY29udGVudC5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pIHsKLQkJCQkJZkxhc3RKU1BUeXBlID0gRVhQUkVTU0lPTjsKLQkJCQkJdHJhbnNsYXRlRUwoZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChjb250ZW50KSwgZW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dChkZWxpbSksIGZDdXJyZW50Tm9kZSwgY29udGVudFN0YXJ0LCBjb250ZW50LmdldExlbmd0aCgpKTsKLQkJCQl9Ci0KLQkJCQkvLyBjYWxjdWxhdGUgcmVsYXRpdmUgb2Zmc2V0IGluIGJ1ZmZlcgotCQkJCWlmIChpblRoaXNSZWdpb24pIHsKLQkJCQkJc2V0Q3Vyc29yT3duZXIoZkxhc3RKU1BUeXBlKTsKLQkJCQkJaW50IGN1cnJlbnRCdWZmZXJMZW5ndGggPSBnZXRDdXJzb3JPd25lcigpLmxlbmd0aCgpOwotCQkJCQlzZXRSZWxhdGl2ZU9mZnNldCgoZlNvdXJjZVBvc2l0aW9uIC0gY29udGVudFN0YXJ0KSArIGN1cnJlbnRCdWZmZXJMZW5ndGgpOwotCQkJCQlpZiAoZkxhc3RKU1BUeXBlID09IEVYUFJFU1NJT04pIHsKLQkJCQkJCS8vIGlmIGFuIGV4cHJlc3Npb24sIGFkZCB0aGVuIGxlbmd0aCBvZiB0aGUgZW5jbG9zaW5nCi0JCQkJCQkvLyBwYXJlbi4uCi0JCQkJCQlzZXRDdXJzb3JJbkV4cHJlc3Npb24odHJ1ZSk7Ci0JCQkJCQlzZXRSZWxhdGl2ZU9mZnNldChnZXRSZWxhdGl2ZU9mZnNldCgpICsgRVhQUkVTU0lPTl9QUkVGSVgubGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHlwZSA9IG51bGw7Ci0JCQkJY29udGVudCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBmTGFzdEpTUFR5cGUgPSBTQ1JJUFRMRVQ7Ci0KLQkvKioKLQkgKiBKU1BUeXBlIGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5IGluIHRoaXMgY2xhc3MgdG8gZGVzY3JpYmUgdHllIHR5cGUgb2YKLQkgKiByZWdpb24gdG8gYmUgdHJhbnNsYXRlZAotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXByaXZhdGUgaW50IGdldEpTUFR5cGVGb3JSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaW50IHR5cGUgPSBTQ1JJUFRMRVQ7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikKLQkJCXR5cGUgPSBTQ1JJUFRMRVQ7Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikKLQkJCXR5cGUgPSBFWFBSRVNTSU9OOwotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOKQotCQkJdHlwZSA9IERFQ0xBUkFUSU9OOwotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKQotCQkJdHlwZSA9IGZMYXN0SlNQVHlwZTsKLQkJLy8gcmVtZW1iZXIgdGhlIGxhc3QgdHlwZSwgaW4gY2FzZSB0aGUgbmV4dCB0eXBlIHRoYXQgY29tZXMgaW4gaXMKLQkJLy8gSlNQX0NPTlRFTlQKLQkJZkxhc3RKU1BUeXBlID0gdHlwZTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogLyogPCVAICU+IC8qIG5lZWQgdG8gcGFzcyBpbiB0aGUgZGlyZWN0aXZlIHRhZyByZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVEaXJlY3RpdmUoSXRlcmF0b3IgcmVnaW9ucykgewotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIHJlZ2lvblRleHQsIGF0dHJWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7IC8vIGNvdWxkCi0JCQkvLyBiZQotCQkJLy8gWE1MX0NPTlRFTlQKLQkJCS8vID0KLQkJCS8vICIiLAotCQkJLy8gc2tpcHMKLQkJCS8vIGF0dHJzPwotCQkJcmVnaW9uVGV4dCA9IGdldEN1cnJlbnROb2RlKCkuZ2V0VGV4dChyKTsKLQkJCWlmIChyZWdpb25UZXh0LmluZGV4T2YoInRhZ2xpYiIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGFkZCBjdXN0b20gdGFnIGJsb2NrIG1hcmtlcnMgaGVyZQotCQkJCWhhbmRsZVRhZ2xpYigpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblRleHQuZXF1YWxzKCJpbmNsdWRlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIENNVkMgMjU4MzExCi0JCQkJLy8gUE1SIDE4MzY4LCBCNjYzCi0JCQkJLy8gc2tpcCB0byByZXF1aXJlZCAiZmlsZSIgYXR0cmlidXRlLCBzaG91bGQgYmUgc2FmZSBiZWNhdXNlCi0JCQkJLy8gImZpbGUiIGlzIHRoZSBvbmx5IGF0dHJpYnV0ZSBmb3IgdGhlIGluY2x1ZGUgZGlyZWN0aXZlCi0JCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiByZWdpb25zLmhhc05leHQoKSAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQkJciA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCk7Ci0JCQkJfQotCQkJCWZpbGVMb2NhdGlvbiA9IGdldEF0dHJpYnV0ZVZhbHVlKHIsIHJlZ2lvbnMpOwotCQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkKLQkJCQkJaGFuZGxlSW5jbHVkZUZpbGUoZmlsZUxvY2F0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblRleHQuaW5kZXhPZigicGFnZSIpID4gLTEpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKHJlZ2lvbnMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgaWRlYWxseSBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBydW4gdGhyb3VnaAotCSAqIEpTUFRyYW5zbGF0b3IgVGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIGJ5IGlubmVyIGhlbHBlciBjbGFzc2VzIHRoYXQKLQkgKiBuZWVkIHRvIGFkZCBibG9jayBtYXJrZXJzIHRvIHRoZWlyIG93biBwYXJzZXJzLiBUaGlzIG1ldGhvZCBvbmx5IGFkZHMKLQkgKiBtYXJrZXJzIHRoYXQgY2FtZSBmcm9tIDxAdGFnbGliPiBkaXJlY3RpdmVzLCAobm90IDxAaW5jbHVkZT4pLCBzaW5jZQotCSAqIGluY2x1ZGUgZmlsZSB0YWdsaWJzIGFyZSBoYW5kbGVkIG9uIHRoZSBmbHkgd2hlbiB0aGV5IGFyZSBlbmNvdW50ZXJlZC4gKgotCSAqIEBwYXJhbSByZWdpb25zCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlVGFnbGliKCkgewotCQkvLyBnZXQvY3JlYXRlIFRMRENNRG9jdW1lbnQKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhnZXRDdXJyZW50Tm9kZSgpLmdldEVuZCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsKLQkJCUNNRG9jdW1lbnRUcmFja2VyIHRyYWNrZXIgPSBudWxsOwotCQkJSXRlcmF0b3IgdGFnbGliUmVnaW9ucyA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXRyYWNrZXIgPSAoQ01Eb2N1bWVudFRyYWNrZXIpIGl0Lm5leHQoKTsKLQkJCQlzZFJlZ2lvbiA9IHRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJLy8gc2luY2UgbWF5IGJlIGNhbGwgZnJvbSBhbm90aGVyIHRocmVhZCAobGlrZSBhIGJhY2tncm91bmQKLQkJCQkvLyBqb2IpCi0JCQkJLy8gdGhpcyBjaGVjayBpcyB0byBiZSBzYWZlcgotCQkJCWlmIChzZFJlZ2lvbiAhPSBudWxsICYmICFzZFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotCQkJCQl0YWdsaWJSZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChzZFJlZ2lvbiAhPSBudWxsICYmICFzZFJlZ2lvbi5pc0RlbGV0ZWQoKSAmJiB0YWdsaWJSZWdpb25zLmhhc05leHQoKSkgewotCQkJCQkJciA9IChJVGV4dFJlZ2lvbikgdGFnbGliUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkpIHsKLQkJCQkJCQlpZiAoc2RSZWdpb24uZ2V0VGV4dChyKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5UQUdMSUIpKSB7Ci0JCQkJCQkJCWFkZEJsb2NrTWFya2Vycyh0cmFja2VyLmdldERvY3VtZW50KCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogYWRkcyBibG9jayBtYXJrZXJzIHRvIEpTUFRyYW5zbGF0b3IncyBibG9jayBtYXJrZXIgbGlzdCBmb3IgYWxsCi0JICogZWxlbWVudHMgaW4gZG9jIEBwYXJhbSBkb2MKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRCbG9ja01hcmtlcnMoQ01Eb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYy5nZXRFbGVtZW50cygpLmdldExlbmd0aCgpID4gMCkgewotCQkJSXRlcmF0b3IgZWxlbWVudHMgPSBkb2MuZ2V0RWxlbWVudHMoKS5pdGVyYXRvcigpOwotCQkJQ01Ob2RlIG5vZGUgPSBudWxsOwotCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCW5vZGUgPSAoQ01Ob2RlKSBlbGVtZW50cy5uZXh0KCk7Ci0JCQkJZ2V0QmxvY2tNYXJrZXJzKCkuYWRkKG5ldyBCbG9ja01hcmtlcihub2RlLmdldE5vZGVOYW1lKCksIG51bGwsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5ULCB0cnVlKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJZiByIGlzIGFuIGF0dHJpYnV0ZSBuYW1lIHJlZ2lvbiwgdGhpcyBtZXRob2Qgd2lsbCBzYWZlbHkgcmV0dXJuIHRoZQotCSAqIHZhbHVlIGZvciB0aGF0IGF0dHJpYnV0ZS4KLQkgKiAKLQkgKiBAcGFyYW0gcgotCSAqIEBwYXJhbSByZW1haW5pbmdSZWdpb25zCi0JICogQHJldHVybiB0aGUgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgbmFtZSAociksIG9yIG51bGwgaWYgaXNuJ3Qgb25lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGVWYWx1ZShJVGV4dFJlZ2lvbiByLCBJdGVyYXRvciByZW1haW5pbmdSZWdpb25zKSB7Ci0JCWlmIChyLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSkgewotCQkJaWYgKHJlbWFpbmluZ1JlZ2lvbnMuaGFzTmV4dCgpICYmIChyID0gKElUZXh0UmVnaW9uKSByZW1haW5pbmdSZWdpb25zLm5leHQoKSkgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChyZW1haW5pbmdSZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVtYWluaW5nUmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQlyZXR1cm4gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogdGFrZXMgYW4gZW1udW1lcmF0aW9uIG9mIHRoZSBhdHRyaWJ1dGVzIG9mIGEgZGlyZWN0aXZlIHRhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVBhZ2VEaXJlY3RpdmVBdHRyaWJ1dGVzKEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSwgYXR0clZhbHVlOwotCQkvLyBpdGVyYXRlIGFsbCBhdHRyaWJ1dGVzCi0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQotCQkJCWF0dHJOYW1lID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJCQlpZiAoYXR0ck5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCi0JCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXAoZ2V0Q3VycmVudE5vZGUoKS5nZXRUZXh0KHIpKTsKLQkJCQkJCX0KLQkJCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQkJfQotCQkJCQlzZXREaXJlY3RpdmVBdHRyaWJ1dGUoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0cyB0aGUgYXBwcm9wcmlhdGUgcGFnZSBkaXJlY3RpdmUgYXR0cmlidXRlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RGlyZWN0aXZlQXR0cmlidXRlKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGF0dHJWYWx1ZSkgewotCQlpZiAoYXR0clZhbHVlID09IG51bGwpCi0JCQlyZXR1cm47IC8vIHVzZXMgZGVmYXVsdCAoaWYgdGhlcmUgd2FzIG9uZSkKLQkJaWYgKGF0dHJOYW1lLmVxdWFscygiZXh0ZW5kcyIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCWZTdXBlcmNsYXNzID0gYXR0clZhbHVlOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaW1wb3J0IikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJYWRkSW1wb3J0cyhhdHRyVmFsdWUpOwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygic2Vzc2lvbiIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIGZTZXNzaW9uID0gKCJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJidWZmZXIiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQkvLyBpZ25vcmUgZm9yIG5vdwotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiYXV0b0ZsdXNoIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJLy8gaWdub3JlIGZvciBub3cKLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImlzVGhyZWFkU2FmZSIpKSAvLyROT04tTkxTLTEkCi0JCXsKLQkJCS8vIGZUaHJlYWRTYWZlID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoYXR0clZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaXNFcnJvclBhZ2UiKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCQlmSXNFcnJvclBhZ2UgPSBCb29sZWFuLnZhbHVlT2YoYXR0clZhbHVlKS5ib29sZWFuVmFsdWUoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUluY2x1ZGVGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotCQlpZiAoZmlsZW5hbWUgIT0gbnVsbCkgewotCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG51bGw7Ci0JCQlpZiAoZ2V0UmVzb2x2ZXIoKSAhPSBudWxsKSB7Ci0JCQkJZmlsZUxvY2F0aW9uID0gKGdldEluY2x1ZGVzKCkuZW1wdHkoKSkgPyBnZXRSZXNvbHZlcigpLmdldExvY2F0aW9uQnlVUkkoU3RyaW5nVXRpbHMuc3RyaXAoZmlsZW5hbWUpKSA6IGdldFJlc29sdmVyKCkuZ2V0TG9jYXRpb25CeVVSSShTdHJpbmdVdGlscy5zdHJpcChmaWxlbmFtZSksIChTdHJpbmcpIGdldEluY2x1ZGVzKCkucGVlaygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHNob3VsZG4ndCBoYXBwZW4KLQkJCQlmaWxlTG9jYXRpb24gPSBTdHJpbmdVdGlscy5zdHJpcChmaWxlbmFtZSk7Ci0JCQl9Ci0JCQkvLyBob3BlZnVsbHksIGEgcmVzb2x2ZXIgaXMgcHJlc2VudCBhbmQgaGFzIHJldHVybmVkIGEgY2Fub25pY2FsCi0JCQkvLyBmaWxlIHBhdGgKLQkJCWlmICghZ2V0SW5jbHVkZXMoKS5jb250YWlucyhmaWxlTG9jYXRpb24pICYmIGdldEJhc2VMb2NhdGlvbigpICE9IG51bGwgJiYgIWZpbGVMb2NhdGlvbi5lcXVhbHMoZ2V0QmFzZUxvY2F0aW9uKCkpKSB7Ci0JCQkJZ2V0SW5jbHVkZXMoKS5wdXNoKGZpbGVMb2NhdGlvbik7Ci0JCQkJSlNQSW5jbHVkZVJlZ2lvbkhlbHBlciBoZWxwZXIgPSBuZXcgSlNQSW5jbHVkZVJlZ2lvbkhlbHBlcih0aGlzKTsKLQkJCQlib29sZWFuIHBhcnNlZCA9IGhlbHBlci5wYXJzZShmaWxlTG9jYXRpb24pOwotCQkJCWlmICghcGFyc2VkKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCAiRXJyb3I6IGluY2x1ZGVkIGZpbGUgIiArIGZpbGVuYW1lICsgIiBub3QgZm91bmQgeyIgKyBnZXRCYXNlTG9jYXRpb24oKSArICIpIik7Ci0JCQkJfQotCQkJCWdldEluY2x1ZGVzKCkucG9wKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFVSSVJlc29sdmVyIGdldFJlc29sdmVyKCkgewotCQlyZXR1cm4gKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgPyBmU3RydWN0dXJlZE1vZGVsLmdldFJlc29sdmVyKCkgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpIHsKLQkJaWYgKGdldFJlc29sdmVyKCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0UmVzb2x2ZXIoKS5nZXRGaWxlQmFzZUxvY2F0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdGFjayBnZXRJbmNsdWRlcygpIHsKLQkJaWYgKGZJbmNsdWRlcyA9PSBudWxsKQotCQkJZkluY2x1ZGVzID0gbmV3IFN0YWNrKCk7Ci0JCXJldHVybiBmSW5jbHVkZXM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhTdHJpbmcgbmV3VGV4dCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoKSB7Ci0JCWFwcGVuZFRvQnVmZmVyKEVYUFJFU1NJT05fUFJFRklYLCBmVXNlckNvZGUsIGZhbHNlLCBlbWJlZGRlZENvbnRhaW5lcik7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyQ29kZSwgdHJ1ZSwgZW1iZWRkZWRDb250YWluZXIsIGpzcFBvc2l0aW9uU3RhcnQsIGpzcFBvc2l0aW9uTGVuZ3RoKTsKLQkJYXBwZW5kVG9CdWZmZXIoRVhQUkVTU0lPTl9TVUZGSVgsIGZVc2VyQ29kZSwgZmFsc2UsIGVtYmVkZGVkQ29udGFpbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVEZWNsYXJhdGlvblN0cmluZyhTdHJpbmcgbmV3VGV4dCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoKSB7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyRGVjbGFyYXRpb25zLCB0cnVlLCBlbWJlZGRlZENvbnRhaW5lciwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCQlhcHBlbmRUb0J1ZmZlcihFTkRMLCBmVXNlckRlY2xhcmF0aW9ucywgZmFsc2UsIGVtYmVkZGVkQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiB1c2VkIGJ5IFhNTEpTUFJlZ2lvbkhlbHBlciBmb3IgaW5jbHVkZWQgSlNQIGZpbGVzCi0JICogCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcGFyYW0gZW1iZWRkZWRDb250YWluZXIKLQkgKiBAcGFyYW0ganNwUG9zaXRpb25TdGFydAotCSAqIEBwYXJhbSBqc3BQb3NpdGlvbkxlbmd0aAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyhTdHJpbmcgbmV3VGV4dCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGVtYmVkZGVkQ29udGFpbmVyLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoKSB7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyQ29kZSwgdHJ1ZSwgZW1iZWRkZWRDb250YWluZXIsIGpzcFBvc2l0aW9uU3RhcnQsIGpzcFBvc2l0aW9uTGVuZ3RoKTsKLQl9Ci0KLQkvLyB0aGUgZm9sbG93aW5nIDMgbWV0aG9kcyBkZXRlcm1pbmUgdGhlIGN1cnNvciBwb3NpdGlvbgotCS8vIDwlPSAlPgotCXByb3RlY3RlZCB2b2lkIHRyYW5zbGF0ZUV4cHJlc3Npb24oSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbikgewotCQlTdHJpbmcgbmV3VGV4dCA9IGdldFVuZXNjYXBlZFJlZ2lvblRleHQocmVnaW9uLCBFWFBSRVNTSU9OKTsKLQkJYXBwZW5kVG9CdWZmZXIoRVhQUkVTU0lPTl9QUkVGSVgsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGZVc2VyQ29kZSwgdHJ1ZSwgZkN1cnJlbnROb2RlKTsKLQkJYXBwZW5kVG9CdWZmZXIoRVhQUkVTU0lPTl9TVUZGSVgsIGZVc2VyQ29kZSwgZmFsc2UsIGZDdXJyZW50Tm9kZSk7Ci0JfQotCi0JLy8KLQkvLyA8JSEgJT4KLQlwcm90ZWN0ZWQgdm9pZCB0cmFuc2xhdGVEZWNsYXJhdGlvbihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyBuZXdUZXh0ID0gZ2V0VW5lc2NhcGVkUmVnaW9uVGV4dChyZWdpb24sIERFQ0xBUkFUSU9OKTsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJEZWNsYXJhdGlvbnMsIHRydWUsIGZDdXJyZW50Tm9kZSk7Ci0JCWFwcGVuZFRvQnVmZmVyKEVOREwsIGZVc2VyRGVjbGFyYXRpb25zLCBmYWxzZSwgZkN1cnJlbnROb2RlKTsKLQl9Ci0KLQkvLwotCS8vIDwlICU+Ci0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlU2NyaXB0bGV0KElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24pIHsKLQkJU3RyaW5nIG5ld1RleHQgPSBnZXRVbmVzY2FwZWRSZWdpb25UZXh0KHJlZ2lvbiwgU0NSSVBUTEVUKTsKLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgZlVzZXJDb2RlLCB0cnVlLCBmQ3VycmVudE5vZGUpOwotCX0KLQotCS8qKgotCSAqIEFwcGVuZCB1c2luZyBhIHJlZ2lvbiwgcHJvYmFibHkgaW5kaXJlY3QgbWFwcGluZyAoZWcuIDwlQHBhZ2UKLQkgKiBpbmNsdWRlPSIiJT4pCi0JICogCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiBAcGFyYW0gYnVmZmVyCi0JICogQHBhcmFtIGFkZFRvTWFwCi0JICogQHBhcmFtIGpzcFJlZmVyZW5jZVJlZ2lvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRUb0J1ZmZlcihTdHJpbmcgbmV3VGV4dCwgU3RyaW5nQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBhZGRUb01hcCwgSVRleHRSZWdpb25Db2xsZWN0aW9uIGpzcFJlZmVyZW5jZVJlZ2lvbikgewotCQlpbnQgc3RhcnQgPSAwLCBsZW5ndGggPSAwOwotCQlpZiAoanNwUmVmZXJlbmNlUmVnaW9uICE9IG51bGwpIHsKLQkJCXN0YXJ0ID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJYXBwZW5kVG9CdWZmZXIobmV3VGV4dCwgYnVmZmVyLCBhZGRUb01hcCwganNwUmVmZXJlbmNlUmVnaW9uLCBzdGFydCwgbGVuZ3RoLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBTdHJpbmdCdWZmZXIgYnVmZmVyLCBib29sZWFuIGFkZFRvTWFwLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uTGVuZ3RoKSB7Ci0JCWFwcGVuZFRvQnVmZmVyKG5ld1RleHQsIGJ1ZmZlciwgYWRkVG9NYXAsIGpzcFJlZmVyZW5jZVJlZ2lvbiwganNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgbmV3VGV4dCB0byB0aGUgYnVmZmVyIHBhc3NlZCBpbiwgYW5kIGFkZHMgdG8gdHJhbnNsYXRpb24gbWFwcGluZwotCSAqIGFzIHNwZWNpZmllZCBieSB0aGUgYWRkVG9NYXAgZmxhZy4gc29tZSBzcGVjaWFsIGNhc2VzIHRvIGNvbnNpZGVyICh0aGF0Ci0JICogbWF5IGJlIGFmZmVjdGVkIGJ5IGNoYW5nZXMgdG8gdGhpcyBtZXRob2QpOiBpbmNsdWRlZCBmaWxlcyBzY3JpcGxldHMgaW4KLQkgKiBhbiBhdHRyaWJ1dGUgdmFsdWUgcmVmYWN0b3JpbmcKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBidWZmZXIKLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVG9CdWZmZXIoU3RyaW5nIG5ld1RleHQsIFN0cmluZ0J1ZmZlciBidWZmZXIsIGJvb2xlYW4gYWRkVG9NYXAsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGludCBqc3BQb3NpdGlvblN0YXJ0LCBpbnQganNwUG9zaXRpb25MZW5ndGgsIGJvb2xlYW4gaXNJbmRpcmVjdCkgewotCi0JCWludCBvcmlnTmV3VGV4dExlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0KLQkJLy8gbm90aGluZyB0byBhcHBlbmQKLQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGFkZCBhIG5ld2xpbmUgc28gdHJhbnNsYXRpb24gbG9va3MgY2xlYW5lcgotCQlpZiAoIW5ld1RleHQuZW5kc1dpdGgoRU5ETCkpCi0JCQluZXdUZXh0ICs9IEVOREw7Ci0KLQkJaWYgKGJ1ZmZlciA9PSBmVXNlckNvZGUpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlpZiAoaXNVc2ViZWFuVGFnKGpzcFJlZmVyZW5jZVJlZ2lvbikpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHJlcXVpcmVzIHNwZWNpYWwgbWFwcGluZwotCQkJCQkJYXBwZW5kVXNlQmVhblRvQnVmZmVyKG5ld1RleHQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgaXNJbmRpcmVjdCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBzdGlsbCB3b3JraW5nIG91dCBraW5rcwotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYWxsIG90aGVyIGNhc2VzCi0JCQkJCVBvc2l0aW9uIGphdmFSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgb3JpZ05ld1RleHRMZW5ndGgpOwotCQkJCQlQb3NpdGlvbiBqc3BSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkxlbmd0aCk7Ci0KLQkJCQkJZkNvZGVSYW5nZXMucHV0KGphdmFSYW5nZSwganNwUmFuZ2UpOwotCQkJCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQkJCWZJbmRpcmVjdFJhbmdlcy5wdXQoamF2YVJhbmdlLCBqc3BSYW5nZSk7Ci0JCQkJfQotCQkJfQotCQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCQllbHNlIGlmIChidWZmZXIgPT0gZlVzZXJEZWNsYXJhdGlvbnMpIHsKLQkJCWJ1ZmZlci5hcHBlbmQobmV3VGV4dCk7Ci0JCQlpZiAoYWRkVG9NYXApIHsKLQkJCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckRlY2xhcmF0aW9ucywgbmV3VGV4dC5sZW5ndGgoKSk7Ci0JCQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUG9zaXRpb25TdGFydCwganNwUG9zaXRpb25MZW5ndGgpOwotCi0JCQkJZkRlY2xhcmF0aW9uUmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQkJZkluZGlyZWN0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJCX0KLQkJCWZPZmZzZXRJblVzZXJEZWNsYXJhdGlvbnMgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVXNlYmVhblRhZyhJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNVc2VCZWFuID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyODQ5MAotCQkJLy8gbGVuZ3RoIG9mIDExIGlzIHRoZSBsZW5ndGggb2YganNwOnVzZUJlYW4KLQkJCS8vIGFuZCBzYXZlcyB0aGUgZXhwZW5zaXZlIGdldFRleHQuZXF1YWxzIGNhbGwKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCWlmIChyLmdldFRleHRMZW5ndGgoKSA9PSAxMSAmJiBqc3BSZWZlcmVuY2VSZWdpb24uZ2V0VGV4dChyKS5lcXVhbHMoImpzcDp1c2VCZWFuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpc1VzZUJlYW4gPSB0cnVlOwotCQkJCX0KLQkJCQkvLyBicmVhayBubyBtYXR0ZXIgd2hhdCBpZiB5b3UgaGl0IHRhZ25hbWUKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaXNVc2VCZWFuOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpbXBvcnROYW1lCi0JICogICAgICAgICAgICBzaG91bGQgYmUganVzdCB0aGUgcGFja2FnZSBwbHVzIHRoZSB0eXBlIGVnLiBqYXZhLnV0aWwuTGlzdAotCSAqICAgICAgICAgICAgb3IgamF2YS51dGlsLioKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogICAgICAgICAgICBzaG91bGQgYmUgdGhlIDwlQCBwYWdlIGltcG9ydCA9ICJqYXZhLnV0aWwuTGlzdCIlPiByZWdpb24KLQkgKiBAcGFyYW0gYWRkVG9NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kSW1wb3J0VG9CdWZmZXIoU3RyaW5nIGltcG9ydE5hbWUsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGJvb2xlYW4gYWRkVG9NYXApIHsKLQkJU3RyaW5nIGphdmFJbXBvcnRTdHJpbmcgPSAiaW1wb3J0ICIgKyBpbXBvcnROYW1lICsgIjsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZVc2VySW1wb3J0cy5hcHBlbmQoamF2YUltcG9ydFN0cmluZyk7Ci0JCWlmIChhZGRUb01hcCkgewotCQkJYWRkSW1wb3J0VG9NYXAoaW1wb3J0TmFtZSwganNwUmVmZXJlbmNlUmVnaW9uKTsKLQkJfQotCQlmT2Zmc2V0SW5Vc2VySW1wb3J0cyArPSBqYXZhSW1wb3J0U3RyaW5nLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIG5ldyB0ZXh0IGNhbiBiZSBzb21ldGhpbmcgbGlrZTogImltcG9ydCBqYXZhLmxhbmcuT2JqZWN0O1xuIgotCSAqIAotCSAqIGJ1dCB0aGUgcmVmZXJlbmNlIHJlZ2lvbiBjb3VsZCBoYXZlIGJlZW4gc29tZXRoaW5nIGxpa2U6IDwlQHBhZ2UKLQkgKiBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsIGphdmEuaW8uKiwgamF2YS51dGlsLkxpc3QiJT4KLQkgKiAKLQkgKiBzbyB0aGUgZXhhY3QgbWFwcGluZyBoYXMgdG8gYmUgY2FsY3VsYXRlZCBjYXJlZnVsbHkuCi0JICogCi0JICogaXNJbmRpcmVjdCBtZWFucyB0aGF0IHRoZSBpbXBvcnQgY2FtZSBmcm9tIGFuIGluY2x1ZGVkIGZpbGUgKGlmIHRydWUpCi0JICogCi0JICogQHBhcmFtIGltcG9ydE5hbWUKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEltcG9ydFRvTWFwKFN0cmluZyBpbXBvcnROYW1lLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uKSB7Ci0KLQkJLy8gbWFzc2FnZSB0ZXh0Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS5zdWJzdHJpbmcoaW1wb3J0TmFtZS5pbmRleE9mKCJpbXBvcnQgIikKLQkJLy8gKyA3LCBpbXBvcnROYW1lLmluZGV4T2YoJzsnKSk7Ci0JCS8vIFN0cmluZyBqc3BUZXh0ID0gaW1wb3J0TmFtZS50cmltKCk7Ci0KLQkJLy8gdGhlc2UgcG9zaXRpb25zIHdpbGwgYmUgdXBkYXRlZCBiZWxvdwotCQlQb3NpdGlvbiBqYXZhUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckltcG9ydHMgKyA3LCAxKTsKLQkJUG9zaXRpb24ganNwUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0KCksIGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0KLQkJLy8gY2FsY3VsYXRlIEpTUCByYW5nZSBieSBmaW5kaW5nICJpbXBvcnQiIGF0dHJpYnV0ZQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBzaXplID0gcmVnaW9ucy5zaXplKCk7Ci0KLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWludCBsZW5ndGggPSAtMTsKLQotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJaWYgKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpLnRyaW0oKS5lcXVhbHMoImltcG9ydCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJLy8gZ2V0IHRoZSBhdHRyIHZhbHVlIHJlZ2lvbgotCQkJCQlpZiAoc2l6ZSA+IGkgKyAyKSB7Ci0JCQkJCQlyID0gcmVnaW9ucy5nZXQoaSArIDIpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQotCQkJCQkJCVN0cmluZyBqc3BJbXBvcnRUZXh0ID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0KLQkJCQkJCQkvLyB0aGUgcG9zaXRpb24gaW4gcXVlc3Rpb24gKGluIHRoZSBKU1ApIGlzIHdoYXQKLQkJCQkJCQkvLyBpcyBicmFja2V0ZWQgYmVsb3cKLQkJCQkJCQkvLyBpbmNsdWRlcyB3aGl0ZXNwYWNlCi0JCQkJCQkJLy8gPCVAcGFnZSBpbXBvcnQ9ImphdmEubGFuZy5PYmplY3QsWyBqYXZhLmlvLiogXSwKLQkJCQkJCQkvLyBqYXZhLnV0aWwuTGlzdCIlPgotCi0JCQkJCQkJLy8gaW4gdGhlIGphdmEgZmlsZQotCQkJCQkJCS8vIGltcG9ydCBbIGphdmEuaW8uKiBdOwotCi0JCQkJCQkJc3RhcnQgPSBqc3BJbXBvcnRUZXh0LmluZGV4T2YoaW1wb3J0TmFtZSk7Ci0JCQkJCQkJbGVuZ3RoID0gaW1wb3J0TmFtZS5sZW5ndGgoKTsKLQotCQkJCQkJCS8vIHNhZmV0eSwgZG9uJ3QgYWRkIHRvIG1hcCBpZiBiYWQgcG9zaXRpb25pbmcKLQkJCQkJCQlpZiAoc3RhcnQgPT0gLTEgfHwgbGVuZ3RoIDwgMSkKLQkJCQkJCQkJYnJlYWs7Ci0KLQkJCQkJCQkvLyB1cGRhdGUganNwIHJhbmdlCi0JCQkJCQkJanNwUmFuZ2Uuc2V0T2Zmc2V0KGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHN0YXJ0KTsKLQkJCQkJCQlqc3BSYW5nZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJCS8vIHVwZGF0ZSBqYXZhIHJhbmdlCi0JCQkJCQkJamF2YVJhbmdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQotCQkvLyBzYWZldHkgZm9yIGJhZCByYW5nZXMKLQkJaWYgKHN0YXJ0ICE9IC0xICYmIGxlbmd0aCA+IDEpIHsKLQkJCS8vIHB1dCByYW5nZXMgaW4gamF2YSAtPiBqc3AgcmFuZ2UgbWFwCi0JCQlmSW1wb3J0UmFuZ2VzLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRlbXAgZml4IGZvciAyODIyOTUgdW50aWwgYmV0dGVyIG1hcHBpbmcgaXMgaW4gcGxhY2UKLQkgKiAKLQkgKiBAcGFyYW0gbmV3VGV4dAotCSAqIEBwYXJhbSBqc3BSZWZlcmVuY2VSZWdpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kVXNlQmVhblRvQnVmZmVyKFN0cmluZyBuZXdUZXh0LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBib29sZWFuIGlzSW5kaXJlY3QpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBqYXZhIHN0cmluZyBsb29rcyBsaWtlIHRoaXMgKHRva2VuaXplZCkKLQkJLy8gVHlwZSBpZCA9IG5ldyBDbGFzc25hbWUoKTtcbgotCQkvLyAwIDEgMiAzIDQKLQkJLy8gb3IKLQkJLy8gVHlwZSBpZCA9IG51bGw7XG4gLy8gaWYgdGhlcmUgaXMgbm8gY2xhc3NuYW1lCi0JCS8vIDAgMSAyIDMKLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCS8vIGNhbGN1bGF0ZSBqYXZhIHJhbmdlcwotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmV3VGV4dCwgIiAiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGkgPSAwOwotCQlTdHJpbmdbXSBwYXJzZWRKYXZhID0gbmV3IFN0cmluZ1tzdC5jb3VudFRva2VucygpXTsKLQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCXBhcnNlZEphdmFbaSsrXSA9IHN0Lm5leHRUb2tlbigpOwotCi0JCVN0cmluZyB0eXBlID0gcGFyc2VkSmF2YVswXSAhPSBudWxsID8gcGFyc2VkSmF2YVswXSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpZCA9IHBhcnNlZEphdmFbMV0gIT0gbnVsbCA/IHBhcnNlZEphdmFbMV0gOiAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgY2xhc3NOYW1lID0gcGFyc2VkSmF2YS5sZW5ndGggPiA0ID8gcGFyc2VkSmF2YVs0XSA6ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJUG9zaXRpb24gamF2YVR5cGVSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgdHlwZS5sZW5ndGgoKSk7Ci0JCVBvc2l0aW9uIGphdmFJZFJhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlICsgdHlwZS5sZW5ndGgoKSArIDEsIGlkLmxlbmd0aCgpKTsKLQkJUG9zaXRpb24gamF2YUNsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oZk9mZnNldEluVXNlckNvZGUgKyB0eXBlLmxlbmd0aCgpICsgMSArIGlkLmxlbmd0aCgpICsgNywgMCk7Ci0JCWlmIChjbGFzc05hbWUubGVuZ3RoKCkgPj0gNCkgewotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2MTMyCi0JCQlpbnQgY2xhc3NOYW1lTGVuZ3RoID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBjbGFzc05hbWUuaW5kZXhPZignKCcpKS5sZW5ndGgoKTsKLQkJCWphdmFDbGFzc1JhbmdlID0gbmV3IFBvc2l0aW9uKGZPZmZzZXRJblVzZXJDb2RlICsgdHlwZS5sZW5ndGgoKSArIDEgKyBpZC5sZW5ndGgoKSArIDcsIGNsYXNzTmFtZUxlbmd0aCk7Ci0JCX0KLQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gY2FsY3VsYXRlIGpzcCByYW5nZXMKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9ICIiLCBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBxdW90ZU9mZnNldCA9IDA7Ci0JCVBvc2l0aW9uIGpzcFR5cGVSYW5nZSA9IG51bGw7Ci0JCVBvc2l0aW9uIGpzcElkUmFuZ2UgPSBudWxsOwotCQlQb3NpdGlvbiBqc3BDbGFzc1JhbmdlID0gbnVsbDsKLQotCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChqKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlhdHRyTmFtZSA9IGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCWlmIChyZWdpb25zLnNpemUoKSA+PSBqICsgMiAmJiByZWdpb25zLmdldChqICsgMikuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJLy8gZ2V0IGF0dHIgdmFsdWUKLQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGogKyAyKTsKLQkJCQkJYXR0clZhbHVlID0ganNwUmVmZXJlbmNlUmVnaW9uLmdldFRleHQocik7Ci0KLQkJCQkJLy8gbWF5IGhhdmUgcXVvdGVzCi0JCQkJCXF1b3RlT2Zmc2V0ID0gKGF0dHJWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGF0dHJWYWx1ZS5zdGFydHNXaXRoKCInIikpID8gMSA6IDA7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCWlmIChhdHRyTmFtZS5lcXVhbHMoInR5cGUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJanNwVHlwZVJhbmdlID0gbmV3IFBvc2l0aW9uKGpzcFJlZmVyZW5jZVJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSArIHF1b3RlT2Zmc2V0LCBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlc0xlYXZlSW5zaWRlU3BhY2UoYXR0clZhbHVlKS5sZW5ndGgoKSk7Ci0JCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkJanNwSWRSYW5nZSA9IG5ldyBQb3NpdGlvbihqc3BSZWZlcmVuY2VSZWdpb24uZ2V0U3RhcnRPZmZzZXQocikgKyBxdW90ZU9mZnNldCwgU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKGF0dHJWYWx1ZSkubGVuZ3RoKCkpOwotCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHMoImNsYXNzIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCWpzcENsYXNzUmFuZ2UgPSBuZXcgUG9zaXRpb24oanNwUmVmZXJlbmNlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpICsgcXVvdGVPZmZzZXQsIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShhdHRyVmFsdWUpLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBwdXQgcmFuZ2VzIGluIGphdmEgLT4ganNwIHJhbmdlIG1hcAotCQlpZiAoIXR5cGUuZXF1YWxzKCIiKSAmJiBqc3BUeXBlUmFuZ2UgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlmQ29kZVJhbmdlcy5wdXQoamF2YVR5cGVSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJCS8vIG5vdGU6IGRvbid0IHVwZGF0ZSBvZmZzZXRzIGZvciB0aGlzIG1hcCB3aGVuIHJlc3VsdCBpcyBidWlsdAotCQkJLy8gdGhleSdsbCBiZSB1cGRhdGVkIHdoZW4gY29kZSByYW5nZXMgb2Zmc2V0cyBhcmUgdXBkYXRlZAotCQkJZlVzZUJlYW5SYW5nZXMucHV0KGphdmFUeXBlUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFUeXBlUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCX0KLQkJaWYgKCFpZC5lcXVhbHMoIiIpICYmIGpzcElkUmFuZ2UgIT0gbnVsbCkgeyAvLyROT04tTkxTLTEkCi0JCQlmQ29kZVJhbmdlcy5wdXQoamF2YUlkUmFuZ2UsIGpzcElkUmFuZ2UpOwotCQkJLy8gbm90ZTogZG9uJ3QgdXBkYXRlIG9mZnNldHMgZm9yIHRoaXMgbWFwIHdoZW4gcmVzdWx0IGlzIGJ1aWx0Ci0JCQkvLyB0aGV5J2xsIGJlIHVwZGF0ZWQgd2hlbiBjb2RlIHJhbmdlcyBvZmZzZXRzIGFyZSB1cGRhdGVkCi0JCQlmVXNlQmVhblJhbmdlcy5wdXQoamF2YUlkUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCQlpZiAoaXNJbmRpcmVjdCkKLQkJCQlmSW5kaXJlY3RSYW5nZXMucHV0KGphdmFJZFJhbmdlLCBqc3BUeXBlUmFuZ2UpOwotCQl9Ci0JCWlmICghY2xhc3NOYW1lLmVxdWFscygiIikgJiYganNwQ2xhc3NSYW5nZSAhPSBudWxsKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZDb2RlUmFuZ2VzLnB1dChqYXZhQ2xhc3NSYW5nZSwganNwQ2xhc3NSYW5nZSk7Ci0JCQkvLyBub3RlOiBkb24ndCB1cGRhdGUgb2Zmc2V0cyBmb3IgdGhpcyBtYXAgd2hlbiByZXN1bHQgaXMgYnVpbHQKLQkJCS8vIHRoZXknbGwgYmUgdXBkYXRlZCB3aGVuIGNvZGUgcmFuZ2VzIG9mZnNldHMgYXJlIHVwZGF0ZWQKLQkJCWZVc2VCZWFuUmFuZ2VzLnB1dChqYXZhQ2xhc3NSYW5nZSwganNwVHlwZVJhbmdlKTsKLQkJCWlmIChpc0luZGlyZWN0KQotCQkJCWZJbmRpcmVjdFJhbmdlcy5wdXQoamF2YUNsYXNzUmFuZ2UsIGpzcFR5cGVSYW5nZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGJ1ZmZlciB0byB0aGUgY3VycmVudCBKU1BUeXBlOiBTVEFOREFSRF9KU1AsIEVNQkVEREVEX0pTUCwKLQkgKiBERUNMQVJBVElPTiwgRVhQUkVTU0lPTiwgU0NSSVBUTEVUIChmb3Iga2VlcHRpbmcgdHJhY2sgb2YgY3Vyc29yCi0JICogcG9zaXRpb24gd2hlbiB0aGUgZmluYWwgZG9jdW1lbnQgaXMgYnVpbHQpCi0JICogCi0JICogQHBhcmFtIEpTUFR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBKU1AgdHlwZSB0aGF0IHRoZSBjdXJzb3IgaXMgaW4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDdXJzb3JPd25lcihpbnQgSlNQVHlwZSkgewotCQlzd2l0Y2ggKEpTUFR5cGUpIHsKLQkJCWNhc2UgREVDTEFSQVRJT04gOgotCQkJCXNldEN1cnNvck93bmVyKGZVc2VyRGVjbGFyYXRpb25zKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVhQUkVTU0lPTiA6Ci0JCQljYXNlIFNDUklQVExFVCA6Ci0JCQkJc2V0Q3Vyc29yT3duZXIoZlVzZXJDb2RlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXNldEN1cnNvck93bmVyKGZVc2VyQ29kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGlzIHBpZWNlIG9mIGNvZGUgaXRlcmF0ZXMgdGhyb3VnaCBmQ3VycmVudE5vZGVzIGFuZCBjbHVtcHMgdGhlbQotCSAqIHRvZ2V0aGVyIGluIGEgYmlnIHRleHQgc3RyaW5nIC0gdW5lc2NhcGluZyBjaGFyYWN0ZXJzIGlmIHRoZXkgYXJlIG5vdAotCSAqIENEQVRBIC0gc2ltcGx5IGFwcGVuZGluZyBpZiB0aGV5IGFyZSBDREFUQSBpdCBzdG9wcyBpdGVyYXRpb24gd2hlbiBpdAotCSAqIGhpdHMgYSBub2RlIHRoYXQgaXMgYW4gWE1MX1RBR19OQU1FICh3aGljaCBzaG91bGQgYmUgdGhlIHJlZ2lvbiBjbG9zaW5nCi0JICogdGFnKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5lc2NhcGVkUmVnaW9uVGV4dChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gc3RSZWdpb24sIGludCBKU1BUeXBlKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBzdGFydCA9IHN0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBzdFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJLy8gYWRqdXN0bWVudCBuZWNlc3NhcnkgZm9yIGVtYmVkZGVkIHJlZ2lvbiBjb250YWluZXJzCi0JCWlmIChzdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyICYmIHN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCWlmIChzdFJlZ2lvbi5nZXRSZWdpb25zKCkgIT0gbnVsbCAmJiBzdFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkgewotCQkJCUlUZXh0UmVnaW9uIGpzcENvbnRlbnQgPSBzdFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOyAvLyBzaG91bGQKLQkJCQkvLyBiZQotCQkJCS8vIGpzcENvbnRlbnQKLQkJCQkvLyByZWdpb24KLQkJCQlzdGFydCA9IHN0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGpzcENvbnRlbnQpOwotCQkJCWVuZCA9IHN0UmVnaW9uLmdldEVuZE9mZnNldChqc3BDb250ZW50KTsKLQkJCX0KLQkJfQotCQlpbnQgQ0RBVEFPZmZzZXQgPSAwOyAvLyBudW1iZXIgb2YgY2hhcmFjdGVycyBsb3N0IGluIGNvbnZlcnNpb24KLQkJaW50IGJ1ZmZlclNpemUgPSAwOwotCQlpZiAoc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UIHx8IHN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgLy8gbmVlZAotCQkJCQkvLyB0aGlzCi0JCQkJCS8vIGZvcgotCQkJCQkvLyBlbWJlZGRlZAotCQkJCQkvLyBKU1AKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQl8fCBzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIC8vIG5lZWQKLQkJLy8gdGhpcwotCQkvLyBpbgotCQkvLyBjYXNlCi0JCS8vIHRoZXJlJ3MKLQkJLy8gbm8KLQkJLy8gcmVnaW9uLi4uCi0JCXsKLQkJCWZJbkNvZGVSZWdpb24gPSAoc3RhcnQgPD0gZlNvdXJjZVBvc2l0aW9uICYmIGZTb3VyY2VQb3NpdGlvbiA8PSBlbmQpOwotCQkJaWYgKGZJbkNvZGVSZWdpb24pIHsKLQkJCQlzZXRDdXJzb3JPd25lcihKU1BUeXBlKTsKLQkJCQlzZXRSZWxhdGl2ZU9mZnNldCgoZlNvdXJjZVBvc2l0aW9uIC0gc3RhcnQpICsgZ2V0Q3Vyc29yT3duZXIoKS5sZW5ndGgoKSk7Ci0JCQkJaWYgKEpTUFR5cGUgPT0gRVhQUkVTU0lPTikgewotCQkJCQkvLyBpZiBhbiBleHByZXNzaW9uLCBhZGQgdGhlbiBsZW5ndGggb2YgdGhlIGVuY2xvc2luZwotCQkJCQkvLyBwYXJlbi4uCi0JCQkJCXNldEN1cnNvckluRXhwcmVzc2lvbih0cnVlKTsKLQkJCQkJc2V0UmVsYXRpdmVPZmZzZXQoZ2V0UmVsYXRpdmVPZmZzZXQoKSArIEVYUFJFU1NJT05fUFJFRklYLmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJVGV4dFJlZ2lvbiBqc3BDb250ZW50ID0gbnVsbDsKLQkJCWlmIChzdFJlZ2lvbi5nZXRSZWdpb25zKCkgIT0gbnVsbCAmJiBzdFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID4gMSkKLQkJCQlqc3BDb250ZW50ID0gc3RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCXJldHVybiAoanNwQ29udGVudCAhPSBudWxsKSA/IHN0UmVnaW9uLmdldEZ1bGxUZXh0KGpzcENvbnRlbnQpIDogc3RSZWdpb24uZ2V0RnVsbFRleHQoKTsgLy8gZG9uJ3QKLQkJCS8vIHVuZXNjYXBlCi0JCQkvLyBpZgotCQkJLy8gaXQncwotCQkJLy8gbm90Ci0JCQkvLyBhbgotCQkJLy8gWE1MSlNQCi0JCQkvLyB0YWcKLQkJfQotCQllbHNlIGlmIChzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB7Ci0JCQkvLyBuZWVkIHRvIGRldGVybWluZSBjdXJzb3Igb3duZXIgc28gdGhhdCB0aGUgZkN1cm9zb3JQb3NpdGlvbgotCQkJLy8gd2lsbCBiZQotCQkJLy8gY29ycmVjdCBldmVuIGlmIHRoZXJlIGlzIG5vIHJlZ2lvbiBhZnRlciB0aGUgY3Vyc29yIGluIHRoZSBKU1AKLQkJCS8vIGZpbGUKLQkJCXNldEN1cnNvck93bmVyKEpTUFR5cGUpOwotCQl9Ci0JCS8vIGl0ZXJhdGUgWE1MQ09OVEVOVCBhbmQgQ0RBVEEgcmVnaW9ucwotCQkvLyBsb29wIGZDdXJyZW50Tm9kZSB1bnRpbCB5b3UgaGl0IDwvanNwOnNjcmlwdGxldD4gKG9yIG90aGVyIGNsb3NpbmcKLQkJLy8gdGFnIG5hbWUpCi0JCXdoaWxlIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwgJiYgZ2V0Q3VycmVudE5vZGUoKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIC8vIG5lZWQKLQkJLy8gdG8KLQkJLy8gc3RvcAotCQkvLyBvbgotCQkvLyB0aGUKLQkJLy8gZW5kaW5nCi0JCS8vIHRhZwotCQkvLyBuYW1lLi4uCi0JCXsKLQkJCXN0YXJ0ID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRTdGFydE9mZnNldCgpOwotCQkJZW5kID0gZ2V0Q3VycmVudE5vZGUoKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWJ1ZmZlclNpemUgPSBidWZmZXIubGVuZ3RoKCk7Ci0JCQlDREFUQU9mZnNldCA9IHVuZXNjYXBlUmVnaW9uKGdldEN1cnJlbnROb2RlKCksIGJ1ZmZlcik7Ci0JCQlmSW5Db2RlUmVnaW9uID0gKHN0YXJ0IDw9IGZTb3VyY2VQb3NpdGlvbiAmJiBmU291cmNlUG9zaXRpb24gPD0gZW5kKTsKLQkJCWlmIChmSW5Db2RlUmVnaW9uKSB7Ci0JCQkJc2V0Q3Vyc29yT3duZXIoSlNQVHlwZSk7Ci0JCQkJLy8gdGhpcyBvZmZzZXQgaXMgc29ydCBvZiBjb21wbGljYXRlZC4uLgotCQkJCS8vIGl0J3MgY29tcG9zZWQgb2Y6Ci0JCQkJLy8gMS4gdGhlIGxlbmd0aCBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcmVnaW9uIHVwIHRpbGwKLQkJCQkvLyB3aGVyZSB0aGUgY3Vyc29yIGlzCi0JCQkJLy8gMi4gbWludXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGxvc3QgaW4gQ0RBVEEgdHJhbnNsYXRpb24KLQkJCQkvLyAzLiBwbHVzIHRoZSBsZW5ndGggb2YgdGhlIGVzY2FwZWQgYnVmZmVyIGJlZm9yZSB0aGUgY3VycmVudAotCQkJCS8vIHJlZ2lvbiwgYnV0Ci0JCQkJLy8gaXMgc3RpbGwgd2l0aGluIHRoZSBqc3AgdGFnCi0JCQkJc2V0UmVsYXRpdmVPZmZzZXQoKGZTb3VyY2VQb3NpdGlvbiAtIGdldEN1cnJlbnROb2RlKCkuZ2V0U3RhcnRPZmZzZXQoKSkgKyBnZXRDdXJzb3JPd25lcigpLmxlbmd0aCgpIC0gQ0RBVEFPZmZzZXQgKyBidWZmZXJTaXplKTsKLQkJCQlpZiAoSlNQVHlwZSA9PSBFWFBSRVNTSU9OKSB7Ci0JCQkJCXNldEN1cnNvckluRXhwcmVzc2lvbih0cnVlKTsKLQkJCQkJLy8gaWYgYW4gZXhwcmVzc2lvbiwgYWRkIHRoZW4gbGVuZ3RoIG9mIHRoZSBlbmNsb3NpbmcKLQkJCQkJLy8gcGFyZW4uLgotCQkJCQlzZXRSZWxhdGl2ZU9mZnNldChnZXRSZWxhdGl2ZU9mZnNldCgpICsgRVhQUkVTU0lPTl9QUkVGSVgubGVuZ3RoKCkpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChnZXRDdXJyZW50Tm9kZSgpICE9IG51bGwpCi0JCQkJYWR2YW5jZU5leHROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIHRvIGJlIHVuZXNjYXBlZCAoWE1MQ29udGVudCwgWE1MIEVOVElUWQotCSAqICAgICAgICAgICAgUkVGRVJFTkNFLCBvciBDREFUQSkKLQkgKiBAcGFyYW0gc2IKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmdidWZmZXIgdG8gYXBwZW5kIHRoZSB0ZXh0IHRvCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVtb3ZlZCBpbiB1bmVzY2FwaW5nIHRoaXMgdGV4dAotCSAqLwotCXByb3RlY3RlZCBpbnQgdW5lc2NhcGVSZWdpb24oSVRleHRSZWdpb24gciwgU3RyaW5nQnVmZmVyIHNiKSB7Ci0JCVN0cmluZyBzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aEJlZm9yZSA9IDAsIGxlbmd0aEFmdGVyID0gMCwgY2RhdGFfdGFnc19sZW5ndGggPSAwOwotCQlpZiAociAhPSBudWxsICYmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UIHx8IHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpKSB7Ci0JCQlsZW5ndGhCZWZvcmUgPSAoZ2V0Q3VycmVudE5vZGUoKSAhPSByKSA/IGdldEN1cnJlbnROb2RlKCkuZ2V0RnVsbFRleHQocikubGVuZ3RoKCkgOiBnZXRDdXJyZW50Tm9kZSgpLmdldEZ1bGxUZXh0KCkubGVuZ3RoKCk7Ci0JCQlzID0gRXNjYXBlZFRleHRVdGlsLmdldFVuZXNjYXBlZFRleHQoZ2V0Q3VycmVudE5vZGUoKSwgcik7Ci0JCQlsZW5ndGhBZnRlciA9IHMubGVuZ3RoKCk7Ci0JCQlzYi5hcHBlbmQocyk7Ci0JCX0KLQkJZWxzZSBpZiAociAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIC8vIG9ubHkgaW50ZXJlc3RlZCBpbgotCQkJLy8gY29udGVudHMKLQkJCXsKLQkJCQkvLyBuYXZpZ2F0ZSB0byBuZXh0IHJlZ2lvbiBjb250YWluZXIgKHdoaWNoIHNob3VsZCBiZSBhIEpTUAotCQkJCS8vIHJlZ2lvbikKLQkJCQlJdGVyYXRvciBpdCA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIHIpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHRlbXAgPSBudWxsOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyIHx8IHRlbXAuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQpIHsKLQkJCQkJCXNiLmFwcGVuZChnZXRDdXJyZW50Tm9kZSgpLmdldEZ1bGxUZXh0KHRlbXApKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0ZW1wLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHRlbXAuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSB7Ci0JCQkJCQljZGF0YV90YWdzX2xlbmd0aCArPSB0ZW1wLmdldExlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAobGVuZ3RoQmVmb3JlIC0gbGVuZ3RoQWZ0ZXIgKyBjZGF0YV90YWdzX2xlbmd0aCk7Ci0JfQotCi0JLy8KLQkvLyA8anNwOnVzZUJlYW4+Ci0JcHJvdGVjdGVkIHZvaWQgdHJhbnNsYXRlVXNlQmVhbihJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gY29udGFpbmVyKSB7Ci0JCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgYXR0clZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKLQotCQlJdGVyYXRvciByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIChyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgci5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCi0JCQlhdHRyTmFtZSA9IGF0dHJWYWx1ZSA9IG51bGw7Ci0JCQlpZiAoci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlhdHRyTmFtZSA9IGNvbnRhaW5lci5nZXRUZXh0KHIpLnRyaW0oKTsKLQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkgJiYgKHIgPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpKSAhPSBudWxsICYmIHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSAmJiAociA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5uZXh0KCkpICE9IG51bGwgJiYgci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoY29udGFpbmVyLmdldFRleHQocikpOwotCQkJCQl9Ci0JCQkJCS8vIGhhcyBlcXVhbHMsIGJ1dCBubyB2YWx1ZT8KLQkJCQl9Ci0JCQkJLy8gYW4gYXR0cmlidXRlIHdpdGggbm8gZXF1YWxzPwotCQkJfQotCQkJLy8gKHBhKSBtaWdodCBuZWVkIGRpZmZlcmVudCBsb2dpYyBoZXJlIGlmIHdlIHdhbm5hIHN1cHBvcnQgbW9yZQotCQkJaWYgKGF0dHJOYW1lICE9IG51bGwgJiYgYXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0ck5hbWUuZXF1YWxzKCJpZCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWlkID0gYXR0clZhbHVlOwotCQkJCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFscygiY2xhc3MiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQljbGFzc05hbWUgPSBhdHRyVmFsdWU7Ci0JCQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzKCJ0eXBlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJdHlwZSA9IGF0dHJWYWx1ZTsKLQkJCX0KLQotCQl9Ci0JCS8vIGhhcyBpZCB3LyB0eXBlIGFuZC9vciBjbGFzc25hbWUKLQkJLy8gVHlwZSBpZCA9IG5ldyBDbGFzc25hbWUoKTsKLQkJLy8gb3IKLQkJLy8gVHlwZSBpZCA9IG51bGw7IC8vIGlmIHRoZXJlIGlzIG5vIGNsYXNzbmFtZQotCQlpZiAoaWQgIT0gbnVsbCAmJiAodHlwZSAhPSBudWxsIHx8IGNsYXNzTmFtZSAhPSBudWxsKSkgewotCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQl0eXBlID0gY2xhc3NOYW1lOwotCQkJU3RyaW5nIHByZWZpeCA9IHR5cGUgKyAiICIgKyBpZCArICIgPSAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN0cmluZyBzdWZmaXggPSAibnVsbDsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKQotCQkJCXN1ZmZpeCA9ICJuZXcgIiArIGNsYXNzTmFtZSArICIoKTsiICsgRU5ETDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCWFwcGVuZFRvQnVmZmVyKHByZWZpeCArIHN1ZmZpeCwgZlVzZXJDb2RlLCB0cnVlLCBmQ3VycmVudE5vZGUpOwotCQl9Ci0JfQotCi0JZmluYWwgcHVibGljIGludCBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckluRXhwcmVzc2lvbigpIHsKLQkJcmV0dXJuIGZDdXJzb3JJbkV4cHJlc3Npb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Q3Vyc29ySW5FeHByZXNzaW9uKGJvb2xlYW4gaW4pIHsKLQkJZkN1cnNvckluRXhwcmVzc2lvbiA9IGluOwotCX0KLQotCWZpbmFsIHB1YmxpYyB2b2lkIHNldFNvdXJjZUN1cnNvcihpbnQgaSkgewotCQlmU291cmNlUG9zaXRpb24gPSBpOwotCX0KLQotCWZpbmFsIHB1YmxpYyBpbnQgZ2V0U291cmNlUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmU291cmNlUG9zaXRpb247Ci0JfQotCi0JZmluYWwgcHVibGljIFRMRENNRG9jdW1lbnRNYW5hZ2VyIGdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKCkgewotCQlyZXR1cm4gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgdm9pZCBzZXRSZWxhdGl2ZU9mZnNldChpbnQgcmVsYXRpdmVPZmZzZXQpIHsKLQkJdGhpcy5mUmVsYXRpdmVPZmZzZXQgPSByZWxhdGl2ZU9mZnNldDsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgaW50IGdldFJlbGF0aXZlT2Zmc2V0KCkgewotCQlyZXR1cm4gZlJlbGF0aXZlT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRDdXJzb3JPd25lcihTdHJpbmdCdWZmZXIgY3Vyc29yT3duZXIpIHsKLQkJdGhpcy5mQ3Vyc29yT3duZXIgPSBjdXJzb3JPd25lcjsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEN1cnNvck93bmVyKCkgewotCQlyZXR1cm4gZkN1cnNvck93bmVyOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZXRDdXJyZW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlKSB7Ci0JCXJldHVybiB0aGlzLmZDdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlOwotCX0KLQotCWZpbmFsIHB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEN1cnJlbnROb2RlKCkgewotCQlyZXR1cm4gZkN1cnJlbnROb2RlOwotCX0KLQotCXB1YmxpYyBBcnJheUxpc3QgZ2V0RUxQcm9ibGVtcygpIHsKLQkJcmV0dXJuIGZFTFByb2JsZW1zOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9YTUxKU1BSZWdpb25IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYxYjQxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvWE1MSlNQUmVnaW9uSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YTsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQYXJzZXIvaGVscGVyIGNsYXNzIGZvciBKU1BUcmFuc2xhdG9yLiAgVXNlZCBmb3IgcGFyc2luZyBYTUwtSlNQIHJlZ2lvbnMgKGluIGEgc2NyaXB0IGJsb2NrKQotICogQSBsb3Qgb2YgbG9naWMgYm9ycm93ZWQgZnJvbSBUTERDTURvY3VtZW50TWFuYWdlci4gIFRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZSBYTUxKU1BSZWdpb25IZWxwZXIgcGVyIHRleHQgZmlsZQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1jbGFzcyBYTUxKU1BSZWdpb25IZWxwZXIgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIHsKLQlwcml2YXRlIGZpbmFsIEpTUFRyYW5zbGF0b3IgZlRyYW5zbGF0b3I7Ci0JcHJvdGVjdGVkIEpTUFNvdXJjZVBhcnNlciBmTG9jYWxQYXJzZXIgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZlRleHRUb1BhcnNlID0gbnVsbDsKLQkvLyBuZWVkIHRoaXMgaWYgbm90IGF0IHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQgKGVnLiBwYXJzaW5nIGp1c3QgYSBzY3JpcHQgYmxvY2spCi0JcHJvdGVjdGVkIGludCBmU3RhcnRPZlRleHRUb1BhcnNlID0gMDsKLQkvLyBuYW1lIG9mIHRoZSBvcGVuIHRhZyB0aGF0IHdhcyBsYXN0IGhhbmRsZWQgKGlmIHdlIGFyZSBpbnRlcmVzdGVkIGluIGl0KQotCXByb3RlY3RlZCBTdHJpbmcgZlRhZ25hbWUgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgZlRleHRCZWZvcmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgZlVuZXNjYXBlZFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgZlN0cmlwcGVkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JLy8gZm9yIHJlY29uY2lsaW5nIGN1cnNvciBwb3NpdGlvbiBsYXRlcgotCWludCBmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuU0NSSVBUTEVUOwotCi0JcHVibGljIFhNTEpTUFJlZ2lvbkhlbHBlcihKU1BUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJZ2V0TG9jYWxQYXJzZXIoKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKHRoaXMpOwotCQl0aGlzLmZUcmFuc2xhdG9yID0gdHJhbnNsYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSlNQU291cmNlUGFyc2VyIGdldExvY2FsUGFyc2VyKCkgewotCQlpZiAoZkxvY2FsUGFyc2VyID09IG51bGwpCi0JCQlmTG9jYWxQYXJzZXIgPSBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JCXJldHVybiBmTG9jYWxQYXJzZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWZMb2NhbFBhcnNlci5hZGRCbG9ja01hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyB0ZXh0VG9QYXJzZSkgewotCQlyZXNldCh0ZXh0VG9QYXJzZSwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIHRleHRUb1BhcnNlLCBpbnQgc3RhcnQpIHsKLQkJZlN0YXJ0T2ZUZXh0VG9QYXJzZSA9IHN0YXJ0OwotCQlnZXRMb2NhbFBhcnNlcigpLnJlc2V0KHRleHRUb1BhcnNlKTsKLQkJZlRleHRUb1BhcnNlID0gdGV4dFRvUGFyc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9yY2VQYXJzZSgpIHsKLQkJZ2V0TG9jYWxQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJZkxvY2FsUGFyc2VyID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIHBhcnNlIGFuIGVudGlyZSBmaWxlCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIHBhcnNlKFN0cmluZyBmaWxlbmFtZSkgewotCQkvLyBmcm9tIG91dGVyIGNsYXNzCi0JCUxpc3QgYmxvY2tNYXJrZXJzID0gdGhpcy5mVHJhbnNsYXRvci5nZXRCbG9ja01hcmtlcnMoKTsKLQkJU3RyaW5nIGNvbnRlbnRzID0gZ2V0Q29udGVudHMoZmlsZW5hbWUpOwotCQlpZihjb250ZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXNldChjb250ZW50cyk7Ci0JCS8vIHRoaXMgYWRkcyB0aGUgY3VycmVudCBtYXJrZXJzIGZyb20gdGhlIG91dGVyIGNsYXNzIGxpc3QKLQkJLy8gdG8gdGhpcyBwYXJzZXIgc28gcGFyc2luZyB3b3JrcyBjb3JyZWN0bHkKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBibG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCWFkZEJsb2NrTWFya2VyKChCbG9ja01hcmtlcikgYmxvY2tNYXJrZXJzLmdldChpKSk7Ci0JCX0KLQkJZm9yY2VQYXJzZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qCi0JICogbGlzdGVucyB0byBwYXJzZXIgbm9kZSBwYXJzZWQgZXZlbnRzCi0JICogYWRkcyB0byBsb2NhbCBzY3JpcGxldCwgZXhwcmVzc2lvbiwgZGVjbGFyYXRpb24gYnVmZmVycwotCSAqIGRldGVybWluZXMgd2hpY2ggdHlwZSBvZiByZWdpb24gdGhlIGN1cnNvciBpcyBpbiwgYW5kIGFkanVzdHMgY3Vyc29yIG9mZnNldCBhY2NvcmRpbmdseSAKLQkgKi8KLQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQotCQl0cnkgewotCQkJCi0JCQloYW5kbGVTY29waW5nSWZOZWNlc3Nhcnkoc2RSZWdpb24pOwotCQkJCi0JCQlpZiAoaXNKU1BTdGFydFJlZ2lvbihzZFJlZ2lvbikpIHsKLQkJCQlTdHJpbmcgbmFtZVN0ciA9IGdldFJlZ2lvbk5hbWUoc2RSZWdpb24pOwotCQkJCWlmIChpc0pTUFJlZ2lvbihuYW1lU3RyKSkKLQkJCQkJZlRhZ25hbWUgPSBuYW1lU3RyOwotCQkJCWVsc2UKLQkJCQkJZlRhZ25hbWUgPSBudWxsOwotCQkJCQotCi0JCQkJLy8gdGhpcyBzZWN0aW9uIGFzc3VtZXMgaW1wb3J0YW50IGNvbnRlbnQgKHRvIHRyYW5zbGF0ZSkKLQkJCQkvLyBJUyB0aGUgb3BlbmluZyB0YWcKLQkJCQkKLQkJCQkvLyBoYW5kbGUgaW5jbHVkZSBhbmQgZGlyZWN0aXZlCi0JCQkJaWYoZlRhZ25hbWUgIT0gbnVsbCAmJiBzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHsKLQkJCQkJcHJvY2Vzc090aGVyUmVnaW9ucyhzZFJlZ2lvbik7CQotCQkJCX0KLQkJCQkvLyBoYW5kbGUganNwOnVzZUJlYW4KLQkJCQlpZihmVGFnbmFtZSAhPSBudWxsICYmIGZUYWduYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKSkgewotCQkJCQlwcm9jZXNzVXNlQmVhbihzZFJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQgfHwgc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgewotCQkJCS8vIHRoaXMgc2VjdGlvbiBhc3N1bWVzIGltcG9ydGFudCBjb250ZW50ICh0byB0cmFuc2xhdGUpCi0JCQkJLy8gaXMgQUZURVIgdGhlIG9wZW5pbmcgdGFnCi0JCQkJaWYgKGZUYWduYW1lICE9IG51bGwpIHsKLQkJCQkJLy8gYXNzaWduIGNvbnRlbnRzIHRvIG9uZSBvZiB0aGUgdGFibGVzCi0JCQkJCWlmIChpc1NjcmlwdGxldChmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NTY3JpcHRsZXQoc2RSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzRXhwcmVzc2lvbihmVGFnbmFtZSkpIHsKLQkJCQkJCXByb2Nlc3NFeHByZXNzaW9uKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc0RlY2xhcmF0aW9uKGZUYWduYW1lKSkgewotCQkJCQkJcHJvY2Vzc0RlY2xhcmF0aW9uKHNkUmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWZUYWduYW1lID0gbnVsbDsKLQkJCX0KLQkJCS8vIHRoaXMgdXBkYXRlcyBjdXJzb3IgcG9zaXRpb24KLQkJCWNoZWNrQ3Vyc29ySW5SZWdpb24oc2RSZWdpb24pOwotCQl9Ci0JCWNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2dnaW5nIHRoaXMgZXhjZXB0aW9uIHRoYXQgSSd2ZSBzZWVuIGEgY291cGxlIG9mIHRpbWVzLi4uCi0JCQkvLyBzZWVtcyB0byBoYXBwZW4gZHVyaW5nIHNodXRkb3duIG9mIHVuaXQgdGVzdHMsIGF0IHdoaWNoIAotCQkJLy8gcG9pbnQgTG9nZ2VyIGhhcyBhbHJlYWR5IGJlZW4gdW5sb2FkZWQKLQkJCXRyeSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJYTUxKU1BSZWdpb25IZWxwZXI6IGV4Y2VwdGlvbiBpbiBub2RlIHBhcnNpbmciLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4KSB7Ci0JCQkJLy8gZG8gbm90aGluZywgc2luY2Ugd2UncmUganVzdCBlbmRpbmcKLQkJCX0KLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNjb3BpbmdJZk5lY2Vzc2FyeShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWlmKHRydWUpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZml4IHRvIG1ha2Ugc3VyZSBjdXN0b20gdGFnIGJsb2NrIGhhdmUgdGhlaXIgb3duIHNjb3BlCi0JCS8vIHdlIGFkZCAneycgZm9yIGN1c3RvbSB0YWcgb3BlbiBhbmQgJ30nIGZvciBjdXN0b20gdGFnIGNsb3NlCi0JCS8vIGluIHRoZSB0cmFuc2xhdGlvbgotCQlpZihzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJaWYoIWlzU2VsZkNsb3NpbmdUYWcoc2RSZWdpb24pKSB7Ci0JCQkJU3RyaW5nIG5hbWVTdHIgPSBnZXRSZWdpb25OYW1lKHNkUmVnaW9uKTsKLQkJCQlpZihpc1Bvc3NpYmxlQ3VzdG9tVGFnKG5hbWVTdHIpKSB7Ci0JCQkJCXN0YXJ0U2NvcGUobmFtZVN0cik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYoc2RSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlTdHJpbmcgbmFtZVN0ciA9IGdldFJlZ2lvbk5hbWUoc2RSZWdpb24pOwotCQkJaWYoaXNQb3NzaWJsZUN1c3RvbVRhZyhuYW1lU3RyKSkgewotCQkJCWVuZFNjb3BlKG5hbWVTdHIpOwotCQkJfQotCQl9Ci0JfQotCQotCXByaXZhdGUgYm9vbGVhbiBpc1NlbGZDbG9zaW5nVGFnKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24pIHsKLQkJCi0JCWlmKGNvbnRhaW5lclJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQkKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCktMSk7Ci0JCXJldHVybiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0U2NvcGUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGZUcmFuc2xhdG9yLmdldEN1cnJlbnROb2RlKCk7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0ZXh0LmFwcGVuZCgieyAvLyA8Iik7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dC5hcHBlbmQodGFnTmFtZSk7Ci0JCXRleHQuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyh0ZXh0LnRvU3RyaW5nKCksIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByaXZhdGUgdm9pZCBlbmRTY29wZShTdHJpbmcgdGFnTmFtZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXRleHQuYXBwZW5kKCJ9IC8vIDwvIik7IC8vJE5PTi1OTFMtMSQKLQkJdGV4dC5hcHBlbmQodGFnTmFtZSk7Ci0JCXRleHQuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZVNjcmlwdGxldFN0cmluZyh0ZXh0LnRvU3RyaW5nKCksIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0Tm9kZXMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tDdXJzb3JJblJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCS8vIGlmIGN1cnNvciBpcyBpbiB0aGlzIHJlZ2lvbi4uLgotCQlpZiAodGhpcy5mVHJhbnNsYXRvci5nZXRTb3VyY2VQb3NpdGlvbigpID49IGZTdGFydE9mVGV4dFRvUGFyc2UgKyBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICYmIHRoaXMuZlRyYW5zbGF0b3IuZ2V0U291cmNlUG9zaXRpb24oKSA8PSBmU3RhcnRPZlRleHRUb1BhcnNlICsgc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCWludCBlbmRPZk5hbWVUYWcgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IG9mZnNldCA9IGZUZXh0QmVmb3JlLmxlbmd0aCgpIC0gZlN0cmlwcGVkVGV4dC5sZW5ndGgoKTsKLQkJCS8vIG9mZnNldCBpbiBhZGR0aW9uIHRvIHdoYXQncyBhbHJlYWR5IGluIHRoZSBidWZmZXIKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRTb3VyY2VQb3NpdGlvbigpIC0gKGZTdGFydE9mVGV4dFRvUGFyc2UgKyBlbmRPZk5hbWVUYWcpIC0gb2Zmc2V0KTsKLQkJCS8vIG91dGVyIGNsYXNzIG1ldGhvZAotCQkJdGhpcy5mVHJhbnNsYXRvci5zZXRDdXJzb3JPd25lcihmUG9zc2libGVPd25lcik7Ci0JCQkvLyBhZGQgbGVuZ3RoIG9mIHdoYXQncyBhbHJlYWR5IGluIHRoZSBidWZmZXIKLQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRSZWxhdGl2ZU9mZnNldCgpICsgdGhpcy5mVHJhbnNsYXRvci5nZXRDdXJzb3JPd25lcigpLmxlbmd0aCgpKTsKLQkJCWlmIChmUG9zc2libGVPd25lciA9PSBKU1BUcmFuc2xhdG9yLkVYUFJFU1NJT04pIHsKLQkJCQkvLyBhZGQgbGVuZ3RoIG9mIGV4cHJlc3Npb24gcHJlZml4IGlmIG5lY2Vzc2FyeS4uLgotCQkJCXRoaXMuZlRyYW5zbGF0b3Iuc2V0UmVsYXRpdmVPZmZzZXQodGhpcy5mVHJhbnNsYXRvci5nZXRSZWxhdGl2ZU9mZnNldCgpICsgSlNQVHJhbnNsYXRvci5FWFBSRVNTSU9OX1BSRUZJWC5sZW5ndGgoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRGVjbGFyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcmVwYXJlVGV4dChzZFJlZ2lvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBmVHJhbnNsYXRvci5nZXRDdXJyZW50Tm9kZSgpOwotCQl0aGlzLmZUcmFuc2xhdG9yLnRyYW5zbGF0ZURlY2xhcmF0aW9uU3RyaW5nKGZTdHJpcHBlZFRleHQsIGN1cnJlbnROb2RlLCBjdXJyZW50Tm9kZS5nZXRTdGFydE9mZnNldCgpLCBjdXJyZW50Tm9kZS5nZXRMZW5ndGgoKSk7Ci0JCWZQb3NzaWJsZU93bmVyID0gSlNQVHJhbnNsYXRvci5ERUNMQVJBVElPTjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRXhwcmVzc2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCXByZXBhcmVUZXh0KHNkUmVnaW9uKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSA9IGZUcmFuc2xhdG9yLmdldEN1cnJlbnROb2RlKCk7Ci0JCXRoaXMuZlRyYW5zbGF0b3IudHJhbnNsYXRlRXhwcmVzc2lvblN0cmluZyhmU3RyaXBwZWRUZXh0LCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCkpOwotCQlmUG9zc2libGVPd25lciA9IEpTUFRyYW5zbGF0b3IuRVhQUkVTU0lPTjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzU2NyaXB0bGV0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcHJlcGFyZVRleHQoc2RSZWdpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJdGhpcy5mVHJhbnNsYXRvci50cmFuc2xhdGVTY3JpcHRsZXRTdHJpbmcoZlN0cmlwcGVkVGV4dCwgY3VycmVudE5vZGUsIGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnROb2RlLmdldExlbmd0aCgpKTsKLQkJZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLlNDUklQVExFVDsKLQl9Ci0KLQkvKgotCSAqIFN1YnN0aXR1dGVzIHZhbHVlcyBmb3IgZW50aXR5IHJlZmVyZW5jZXMsIHN0cmlwcyBDREFUQSB0YWdzLCBhbmQga2VlcHMKLQkgKiB0cmFjayBvZiBzdHJpbmcgbGVuZ3RoKHMpIGZvciBjdXJzb3IgcG9zaXRpb24gY2FsY3VsYXRpb24gbGF0ZXIuCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJlcGFyZVRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlmVGV4dEJlZm9yZSA9IGZUZXh0VG9QYXJzZS5zdWJzdHJpbmcoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCkpOwotCQlmVW5lc2NhcGVkVGV4dCA9IEVzY2FwZWRUZXh0VXRpbC5nZXRVbmVzY2FwZWRUZXh0KGZUZXh0QmVmb3JlKTsKLQkJZlN0cmlwcGVkVGV4dCA9IHRoaXMuZlRyYW5zbGF0b3Iuc3RyaXBDREFUQShmVW5lc2NhcGVkVGV4dCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc1VzZUJlYW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlpZiAoZlRhZ25hbWUgIT0gbnVsbCAmJiBpc1VzZUJlYW4oZlRhZ25hbWUpKSB7Ci0KLQkJCVN0cmluZyBiZWFuQ2xhc3MsIGJlYW5UeXBlLCBiZWFuSWQsIGJlYW5EZWNsID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWJlYW5DbGFzcyA9IGdldEF0dHJpYnV0ZVZhbHVlKCJjbGFzcyIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJYmVhblR5cGUgPSBnZXRBdHRyaWJ1dGVWYWx1ZSgidHlwZSIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJYmVhbklkID0gZ2V0QXR0cmlidXRlVmFsdWUoImlkIiwgc2RSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmIChiZWFuSWQgIT0gbnVsbCAmJiAoYmVhblR5cGUgIT0gbnVsbCB8fCBiZWFuQ2xhc3MgIT0gbnVsbCkpIHsKLQkJCQlpZiAoYmVhblR5cGUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJCSAgICBiZWFuVHlwZSA9IGJlYW5DbGFzczsKLQkJCQlTdHJpbmcgcHJlZml4ID0gYmVhblR5cGUgKyAiICIgKyBiZWFuSWQgKyAiID0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nIHN1ZmZpeCA9ICJudWxsO1xuIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChiZWFuQ2xhc3MgIT0gbnVsbCkKLQkJCQkJc3VmZml4ID0gIm5ldyAiICsgYmVhbkNsYXNzICsgIigpO1xuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYmVhbkRlY2wgPSBwcmVmaXggKyBzdWZmaXg7Ci0JCQl9CQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKTsKLQkJCXRoaXMuZlRyYW5zbGF0b3IudHJhbnNsYXRlU2NyaXB0bGV0U3RyaW5nKGJlYW5EZWNsLCBjdXJyZW50Tm9kZSwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudE5vZGUuZ2V0TGVuZ3RoKCkpOwotCQkJZlBvc3NpYmxlT3duZXIgPSBKU1BUcmFuc2xhdG9yLlNDUklQVExFVDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NPdGhlclJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlwcm9jZXNzSW5jbHVkZURpcmVjdGl2ZShzZFJlZ2lvbik7Ci0JCXByb2Nlc3NQYWdlRGlyZWN0aXZlKHNkUmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5jbHVkZURpcmVjdGl2ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWlmIChpc0luY2x1ZGVEaXJlY3RpdmUoZlRhZ25hbWUpKSB7Ci0JCQkvLyB0aGUgZGlyZWN0aXZlIG5hbWUgcmVnaW9uIGl0c2VsZiBjb250YWlucyB0aGUgYXR0cnMuLi4KLQkJCWlmIChzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKQotCQkJCXNkUmVnaW9uID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCVN0cmluZyBmaWxlTG9jYXRpb24gPSBnZXRBdHRyaWJ1dGVWYWx1ZSgiZmlsZSIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5mVHJhbnNsYXRvci5oYW5kbGVJbmNsdWRlRmlsZShmaWxlTG9jYXRpb24pOwotCQl9Ci0JCWVsc2UgaWYgKGlzUG9zc2libGVDdXN0b21UYWcoZlRhZ25hbWUpKSB7Ci0JCQkvLyB0aGlzIGN1c3RvbSB0YWcgbWF5IGRlZmluZSB2YXJpYWJsZXMKLQkJCXRoaXMuZlRyYW5zbGF0b3IuYWRkVGFnbGliVmFyaWFibGVzKGZUYWduYW1lKTsKLQkJfQotCQllbHNlIGlmIChpc1RhZ2xpYkRpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCS8vIGFsc28gYWRkIHRoZSBvbmVzIGNyZWF0ZWQgaGVyZSB0byB0aGUgcGFyZW50IGRvY3VtZW50Ci0JCQlTdHJpbmcgcHJlZml4ID0gZ2V0QXR0cmlidXRlVmFsdWUoInByZWZpeCIsIHNkUmVnaW9uKTsgLy8kTk9OLU5MUy0xJAotCQkJTGlzdCBkb2NzID0gdGhpcy5mVHJhbnNsYXRvci5nZXRUTERDTURvY3VtZW50TWFuYWdlcigpLmdldENNRG9jdW1lbnRUcmFja2VycyhwcmVmaXgsIHRoaXMuZlRyYW5zbGF0b3IuZ2V0Q3VycmVudE5vZGUoKS5nZXRFbmQoKSk7Ci0JCQlJdGVyYXRvciBpdCA9IGRvY3MuaXRlcmF0b3IoKTsKLQkJCUl0ZXJhdG9yIGVsZW1lbnRzID0gbnVsbDsKLQkJCUNNTm9kZSBub2RlID0gbnVsbDsKLQkJCUNNRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZG9jID0gKENNRG9jdW1lbnQpIGl0Lm5leHQoKTsKLQkJCQllbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGVsZW1lbnRzLmhhc05leHQoKSkgewotCQkJCQlub2RlID0gKENNTm9kZSkgZWxlbWVudHMubmV4dCgpOwotCQkJCQltYXJrZXIgPSBuZXcgQmxvY2tNYXJrZXIobm9kZS5nZXROb2RlTmFtZSgpLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSk7Ci0JCQkJCS8vIGdsb2JhbCBzY29wZSBpcyBPSyBiZWNhdXNlIHdlIGhhdmUgZW5jb3VudGVyZWQgdGhpcyA8QHRhZ2xpYj4gZGlyZWN0aXZlCi0JCQkJCS8vIHNvIGl0IGFsbCBtYXJrZXJzIGZyb20gaXQgc2hvdWxkIHdpbGwgYmUgaW4gc2NvcGUKLQkJCQkJLy8gYWRkIHRvIHRoaXMgbG9jYWwgcGFyc2VyCi0JCQkJCWFkZEJsb2NrTWFya2VyKG1hcmtlcik7Ci0JCQkJCS8vIGFkZCB0byBvdXRlciBjbGFzcyBtYXJrZXIgbGlzdCwgZm9yIAotCQkJCQl0aGlzLmZUcmFuc2xhdG9yLmdldEJsb2NrTWFya2VycygpLmFkZChtYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NQYWdlRGlyZWN0aXZlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJaWYgKGlzUGFnZURpcmVjdGl2ZShmVGFnbmFtZSkpIHsKLQkJCXdoaWxlIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHNkUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpCi0JCQkJCWJyZWFrOwotCQkJCXNkUmVnaW9uID0gc2RSZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCX0KLQkJCVN0cmluZyBpbXBvcnRWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKCJpbXBvcnQiLCBzZFJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbXBvcnRWYWx1ZSAhPSAiIikgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gaGFkIHRvIGFkZCAiZmFsc2UiIHBhcmFtZXRlciB0byBlbnN1cmUgdGhlc2UgCi0JCQkJLy8gaW1wb3J0cyBkb24ndCBnZXQgYWRkZWQgdG8ganNwIDwtPiBqYXZhIG1hcCAoc2luY2UgdGhleSBhcmUgZnJvbSBhbiBpbmNsdWRlZCBmaWxlKQotCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04MTY4NwotCQkJCXRoaXMuZlRyYW5zbGF0b3IuYWRkSW1wb3J0cyhpbXBvcnRWYWx1ZSwgZmFsc2UpOwotCQkJfQotCQl9Ci0JfQkKLQotCS8qCi0JICogY29udmVuaWVuY2UgbWV0aG9kIHRvIGdldCBhbiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSBhdHRyaWJ1dGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIGF0dHJOYW1lLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCVN0cmluZyBzZFJlZ2lvblRleHQgPSBmVGV4dFRvUGFyc2Uuc3Vic3RyaW5nKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKTsKLQkJU3RyaW5nIHRleHRSZWdpb25UZXh0LCBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJdGVyYXRvciBpdCA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uLCB2YWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5hbWVSZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQl0ZXh0UmVnaW9uVGV4dCA9IHNkUmVnaW9uVGV4dC5zdWJzdHJpbmcobmFtZVJlZ2lvbi5nZXRTdGFydCgpLCBuYW1lUmVnaW9uLmdldFRleHRFbmQoKSk7Ci0JCQkJaWYgKHRleHRSZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCXZhbHVlUmVnaW9uID0gKElUZXh0UmVnaW9uKSBpdC5uZXh0KCk7Ci0JCQkJCQlpZiAodmFsdWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlhdHRyVmFsdWUgPSBzZFJlZ2lvblRleHQuc3Vic3RyaW5nKHZhbHVlUmVnaW9uLmdldFN0YXJ0KCksIHZhbHVlUmVnaW9uLmdldEVuZCgpKTsKLQkJCQkJCQlicmVhazsgLy8gaW5uZXIKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlicmVhazsgLy8gb3V0ZXIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFN0cmluZ1V0aWxzLnN0cmlwUXVvdGVzKGF0dHJWYWx1ZSk7Ci0JfQotCi0JLy8gdGhlc2UgbWV0aG9kcyBkZXRlcm1pbmUgd2hhdCBjb250ZW50IGdldHMgYWRkZWQgdG8gdGhlIGxvY2FsIHNjcmlwbGV0LCBleHByZXNzaW9uLCBkZWNsYXJhdGlvbiBidWZmZXJzCi0JLyoKLQkgKiByZXR1cm4gdHJ1ZSBmb3IgZWxlbWVudHMgd2hvc2UgY29udGVudHMgd2UgbWlnaHQgd2FudCB0byBhZGQgdG8gdGhlIGphdmEgZmlsZSB3ZSBhcmUgYnVpbGRpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0pTUFN0YXJ0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJcmV0dXJuIChzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCBzZFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSlNQUmVnaW9uKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiBpc0RlY2xhcmF0aW9uKHRhZ05hbWUpIHx8IGlzRXhwcmVzc2lvbih0YWdOYW1lKSB8fCBpc1NjcmlwdGxldCh0YWdOYW1lKSB8fCBpc1VzZUJlYW4odGFnTmFtZSkgfHwgaXNJbmNsdWRlRGlyZWN0aXZlKHRhZ05hbWUpIHx8IGlzUG9zc2libGVDdXN0b21UYWcodGFnTmFtZSkgfHwgaXNUYWdsaWJEaXJlY3RpdmUodGFnTmFtZSkgfHwgaXNQYWdlRGlyZWN0aXZlKHRhZ05hbWUpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRGVjbGFyYXRpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRlY2xhcmF0aW9uIik7IC8vJE5PTi1OTFMtMSQJCQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwcmVzc2lvbihTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZXhwcmVzc2lvbiIpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NjcmlwdGxldChTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6c2NyaXB0bGV0Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VzZUJlYW4oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOnVzZUJlYW4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZURpcmVjdGl2ZShTdHJpbmcgdGFnTmFtZSkgewotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzUG9zc2libGVDdXN0b21UYWcoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuaW5kZXhPZigiOiIpID4gMCAmJiAhdGFnTmFtZS5zdGFydHNXaXRoKCJqc3AiKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVGFnbGliRGlyZWN0aXZlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImpzcDpkaXJlY3RpdmUudGFnbGliIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhZ2VEaXJlY3RpdmUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgianNwOmRpcmVjdGl2ZS5wYWdlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlZ2lvbk5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCi0JCVN0cmluZyBuYW1lU3RyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWZvcihpbnQgaT0wOyBpPHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmFtZVN0ciA9IGZUZXh0VG9QYXJzZS5zdWJzdHJpbmcoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQocikpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lU3RyLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXQgdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBhcyBhIFN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBmaWxlTmFtZQotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnRzLCBudWxsIGlmIHRoZSBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudHMoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgYyA9IDA7Ci0JCWludCBjb3VudCA9IDA7Ci0JCUlucHV0U3RyZWFtIGlzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoZmlsZU5hbWUpOwotCQkJSUZpbGUgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQlpZihmICE9IG51bGwgJiYgIWYuZXhpc3RzKCkpIHsKLQkJCQlmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24oZmlsZVBhdGgpOwotCQkJfQotICAgICAgICAgICAgaWYgKGYgIT0gbnVsbCAmJiBmLmV4aXN0cygpKSB7Ci0gICAgCQkJaXMgPSBmLmdldENvbnRlbnRzKCk7Ci0gICAgCQkJd2hpbGUgKChjID0gaXMucmVhZCgpKSAhPSAtMSkgewotICAgIAkJCQljb3VudCsrOwotICAgIAkJCQlzLmFwcGVuZCgoY2hhcikgYyk7Ci0gICAgCQkJfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAJLy8gZXJyb3IgY29uZGl0aW9uLCBmaWxlIGNvdWxkIG5vdCBiZSBmb3VuZAotICAgICAgICAgICAgCXJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJCWlzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJfQotCQl9Ci0JCXJldHVybiBzLnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2M2YTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RBZGRFeHByZXNzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQWRkRXhwcmVzcy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBZGRFeHByZXNzIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RBZGRFeHByZXNzKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRFeHByZXNzKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFkZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNiNmVhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQWRkRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFkZEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQWRkRXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RBZGRFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQW5kRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEFuZEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmZTQwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQW5kRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFuZEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQW5kRXhwcmVzc2lvbiBleHRlbmRzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiB7Ci0gIHB1YmxpYyBBU1RBbmRFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBbmRFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQ2hvaWNlRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVENob2ljZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc5MDc5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUQ2hvaWNlRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENob2ljZUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2hvaWNlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUQ2hvaWNlRXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2hvaWNlRXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEVxdWFsaXR5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTA2MTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURXF1YWxpdHlFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5M2YzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNURXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNURXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwcmVzc2lvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEZ1bmN0aW9uSW52b2NhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEZ1bmN0aW9uSW52b2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGNhZDkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RGdW5jdGlvbkludm9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdW5jdGlvbkludm9jYXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIFN0cmluZyBmdWxsRnVuY3Rpb25OYW1lOyAKLSAgCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkludm9jYXRpb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bmN0aW9uSW52b2NhdGlvbihKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotCi1wdWJsaWMgU3RyaW5nIGdldEZ1bGxGdW5jdGlvbk5hbWUoKSB7Ci0JcmV0dXJuIGZ1bGxGdW5jdGlvbk5hbWU7Ci19Ci0KLXB1YmxpYyB2b2lkIHNldEZ1bGxGdW5jdGlvbk5hbWUoU3RyaW5nIGZ1bGxGdW5jdGlvbk5hbWUpIHsKLQl0aGlzLmZ1bGxGdW5jdGlvbk5hbWUgPSBmdWxsRnVuY3Rpb25OYW1lOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEdUTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEdUTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDAwMDViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RHVE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RHVE5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUR1ROb2RlIGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RHVE5vZGUoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEdUTm9kZShKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVEltcGxpY2l0T2JqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUSW1wbGljaXRPYmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0OWFkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUSW1wbGljaXRPYmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RJbXBsaWNpdE9iamVjdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbXBsaWNpdE9iamVjdCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUSW1wbGljaXRPYmplY3QoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEltcGxpY2l0T2JqZWN0KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTGl0ZXJhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVExpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzMzRmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUTGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExpdGVyYWwuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUTGl0ZXJhbCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUTGl0ZXJhbChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTGl0ZXJhbChKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE11bHRpcGx5RXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE11bHRpcGx5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDhmNjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RNdWx0aXBseUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUTXVsdGlwbHlFeHByZXNzaW9uIGV4dGVuZHMgQVNUT3BlcmF0b3JFeHByZXNzaW9uIHsKLSAgcHVibGljIEFTVE11bHRpcGx5RXhwcmVzc2lvbihpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTXVsdGlwbHlFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3BlcmF0b3JFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3BlcmF0b3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTZiNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9wZXJhdG9yRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIEFTVE9wZXJhdG9yRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotCXByb3RlY3RlZCBBcnJheUxpc3Qgb3BlcmF0b3JUb2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQVNUT3BlcmF0b3JFeHByZXNzaW9uKGludCBpKSB7Ci0JCXN1cGVyKGkpOwotCX0KLQkKLQlwdWJsaWMgQVNUT3BlcmF0b3JFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpKSB7Ci0JCXRoaXMoaSk7Ci0JCXBhcnNlciA9IHA7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkT3BlcmF0b3JUb2tlbihUb2tlbiBvcFRva2VuKSB7Ci0JCW9wZXJhdG9yVG9rZW5zLmFkZChvcFRva2VuKTsKLQl9Ci0JCi0JcHVibGljIExpc3QgZ2V0T3BlcmF0b3JUb2tlbnMoKSB7Ci0JCXJldHVybiBvcGVyYXRvclRva2VuczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3JFeHByZXNzaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUT3JFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmI3NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVE9yRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVE9yRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RPckV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUT3JFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RPckV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMjM4NDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFJlbGF0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gZXh0ZW5kcyBBU1RPcGVyYXRvckV4cHJlc3Npb24gewotICBwdWJsaWMgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUU3RhcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RTdGFydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTExN2U1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RTdGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyogR29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFN0YXJ0IGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0gIHB1YmxpYyBBU1RTdGFydChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU3RhcnQoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RVbmFyeUV4cHJlc3Npb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RVbmFyeUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4NzBhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVW5hcnlFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVW5hcnlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFVuYXJ5RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUVW5hcnlFeHByZXNzaW9uKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RVbmFyeUV4cHJlc3Npb24oSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmEzNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFsdWUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFsdWUgZXh0ZW5kcyBTaW1wbGVOb2RlIHsKLSAgcHVibGljIEFTVFZhbHVlKGludCBpZCkgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYWx1ZShKU1BFTFBhcnNlciBwLCBpbnQgaWQpIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0FTVFZhbHVlUHJlZml4LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVQcmVmaXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWYyYmYwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVQcmVmaXguamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RWYWx1ZVByZWZpeC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYWx1ZVByZWZpeCBleHRlbmRzIFNpbXBsZU5vZGUgewotICBwdWJsaWMgQVNUVmFsdWVQcmVmaXgoaW50IGlkKSB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFZhbHVlUHJlZml4KEpTUEVMUGFyc2VyIHAsIGludCBpZCkgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUEVMUGFyc2VyVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvQVNUVmFsdWVTdWZmaXguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVN1ZmZpeC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzE3MjY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9BU1RWYWx1ZVN1ZmZpeC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhbHVlU3VmZml4LmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEFTVFZhbHVlU3VmZml4IGV4dGVuZHMgU2ltcGxlTm9kZSB7Ci0JCi0gIHByb3RlY3RlZCBUb2tlbiBwcm9wZXJ0eU5hbWVUb2tlbjsKLSAgCi0gIHB1YmxpYyBBU1RWYWx1ZVN1ZmZpeChpbnQgaWQpIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFsdWVTdWZmaXgoSlNQRUxQYXJzZXIgcCwgaW50IGlkKSB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLQotcHVibGljIFRva2VuIGdldFByb3BlcnR5TmFtZVRva2VuKCkgewotCXJldHVybiBwcm9wZXJ0eU5hbWVUb2tlbjsKLX0KLQotcHVibGljIHZvaWQgc2V0UHJvcGVydHlOYW1lVG9rZW4oVG9rZW4gcHJvcGVydHlOYW1lVG9rZW4pIHsKLQl0aGlzLnByb3BlcnR5TmFtZVRva2VuID0gcHJvcGVydHlOYW1lVG9rZW47Ci19Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRUxHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjJhZTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBUaGUgY29kZSBjaGVja2VyIGZvciB0aGUganNmL2pzcCBFTC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEVMR2VuZXJhdG9yIHsKLQkvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsb2NhdG9yIEEgdmFsaWQgRUxMb2NhdG9yIGluc3RhbmNlLCBtYXkgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIEVMR2VuZXJhdG9yKCkgewotICAgIH0gLy8gY29uc3RydWN0b3IKLQkKLQotICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBuZXR1aWVsIEFTVCBhbmQgc2V0IGRpYWdub3N0aWNzIGFzIG5lY2Vzc2FyeS4KLSAgICAgKiBAcGFyYW0gdHJhbnNsYXRvciBUT0RPCi0gICAgICogQHBhcmFtIGpzcFJlZmVyZW5jZVJlZ2lvbiBUT0RPCi0gICAgICogQHBhcmFtIGNvbnRlbnRTdGFydCAKLSAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCAKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZW5lcmF0ZShBU1RFeHByZXNzaW9uIHJvb3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUsIFN0cmluZ0J1ZmZlciByZXN1bHQsIE1hcCBjb2RlTWFwLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24ganNwUmVmZXJlbmNlUmVnaW9uLCBpbnQgY29udGVudFN0YXJ0LCBpbnQgY29udGVudExlbmd0aCkgewotCQlFTEdlbmVyYXRvclZpc2l0b3IgdmlzaXRvciA9IG5ldyBFTEdlbmVyYXRvclZpc2l0b3IocmVzdWx0LCBjdXJyZW50Tm9kZSwgY29kZU1hcCwgZG9jdW1lbnQsIGpzcFJlZmVyZW5jZVJlZ2lvbiwgY29udGVudFN0YXJ0KTsKLQkJcm9vdC5qanRBY2NlcHQodmlzaXRvciwgbnVsbCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0VMR2VuZXJhdG9yVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0VMR2VuZXJhdG9yVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTMxOTg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9FTEdlbmVyYXRvclZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgQnVnIDE1NDQ3NCBFTDogJ2FuZCcsICdvcicsIC4uLiBvcGVyYXRvcgotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ0NzQKLSAqICAgICBCZXJuaGFyZCBIdWVtZXIgPGJlcm5oYXJkLmh1ZW1lckBnbWFpbC5jb20+Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLQotcHVibGljIGNsYXNzIEVMR2VuZXJhdG9yVmlzaXRvciBpbXBsZW1lbnRzIEpTUEVMUGFyc2VyVmlzaXRvciB7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOREwgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMSA9ICJwdWJsaWMgU3RyaW5nIF9lbEV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGZFeHByZXNzaW9uSGVhZGVyMiA9ICIoKSIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJcdFx0dGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbiB7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0IHBhZ2VDb250ZXh0ID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBwYXJhbSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgcGFyYW1WYWx1ZXMgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIGhlYWRlciA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkIAotCSJqYXZhLnV0aWwuTWFwIGhlYWRlclZhbHVlcyA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgY29va2llID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQgCi0JImphdmEudXRpbC5NYXAgaW5pdFBhcmFtID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBwYWdlU2NvcGUgPSBudWxsOyIgKyBFTkRMICsgLy8kTk9OLU5MUy0xJAotCSJqYXZhLnV0aWwuTWFwIHJlcXVlc3RTY29wZSA9IG51bGw7IiArIEVOREwgKyAvLyROT04tTkxTLTEkCi0JImphdmEudXRpbC5NYXAgc2Vzc2lvblNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkiamF2YS51dGlsLk1hcCBhcHBsaWNhdGlvblNjb3BlID0gbnVsbDsiICsgRU5ETCArIC8vJE5PTi1OTFMtMSQKLQkicmV0dXJuIFwiXCIrIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmSnNwSW1wbGljaXRPYmplY3RzW10gPSB7ICJwYWdlQ29udGV4dCIgfTsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmSnNwSW1wbGljaXRNYXBzW10gPSB7IAkicGFyYW0iLCAicGFyYW1WYWx1ZXMiLCAiaGVhZGVyIiwgImhlYWRlclZhbHVlcyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJCQkJCQkJCQkJImNvb2tpZSIsICJpbml0UGFyYW0iLCAicGFnZVNjb3BlIiwgInJlcXVlc3RTY29wZSIsICJzZXNzaW9uU2NvcGUiLCAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQkJCQkJCQkJCSJhcHBsaWNhdGlvblNjb3BlIiB9OyAvLyROT04tTkxTLTEkCi0JCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSGFzaE1hcCBmSlNQSW1wbGljaXRPYmplY3RNYXAgPSBuZXcgSGFzaE1hcChmSnNwSW1wbGljaXRPYmplY3RzLmxlbmd0aCk7Ci0Jc3RhdGljIHsKLQkJZm9yKGludCBpID0gMDsgaSA8IGZKc3BJbXBsaWNpdE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWZKU1BJbXBsaWNpdE9iamVjdE1hcC5wdXQoZkpzcEltcGxpY2l0T2JqZWN0c1tpXSwgbmV3IEJvb2xlYW4odHJ1ZSkpOwotCQl9Ci0JCQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkpzcEltcGxpY2l0TWFwcy5sZW5ndGg7IGkrKykgewotCQkJZkpTUEltcGxpY2l0T2JqZWN0TWFwLnB1dChmSnNwSW1wbGljaXRNYXBzW2ldLCBuZXcgQm9vbGVhbihmYWxzZSkpOwotCQl9Ci0JfQotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmRm9vdGVyID0gIiA7IiArIEVOREwgKyAifSIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgU3RyaW5nQnVmZmVyIGZSZXN1bHQ7Ci0JcHJpdmF0ZSBNYXAgZkNvZGVNYXA7Ci0JcHJpdmF0ZSBpbnQgZk9mZnNldEluVXNlckNvZGU7Ci0JcHJpdmF0ZSBzdGF0aWMgaW50IG1ldGhvZENvdW50ZXIgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgaW50IGZDb250ZW50U3RhcnQ7Ci0JcHJpdmF0ZSBzdGF0aWMgTWFwIGZPcGVyYXRvck1hcDsKLQkKLQkvLyB0aGlzIGZsYWcgbGV0cyB1cyBrbm93IGlmIHdlIHdlcmUgdW5hYmxlIHRvIGdlbmVyYXRlIGZvciBzb21lIHJlYXNvbi4gIE9uZSBwb3NzaWJsZSByZWFzb24gaXMgdGhhdCB0aGUgZXhwcmVzc2lvbiAKLQkvLyBjb250YWlucyBhIHJlZmVyZW5jZSB0byBhIHZhcmlhYmxlIGZvciB3aGljaCBpbmZvcm1hdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBhdCBydW50aW1lLgotCXByaXZhdGUgYm9vbGVhbiBmQ2FuR2VuZXJhdGUgPSB0cnVlOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZDdXJyZW50Tm9kZTsKLQotCS8qKgotCSAqIFRyYW5sc2F0aW9uIG9mIFhNTC1zdHlsZSBvcGVyYXRvcnMgdG8gamF2YQotCSAqLwotCXN0YXRpYyB7Ci0JCWZPcGVyYXRvck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZPcGVyYXRvck1hcC5wdXQoImd0IiwgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImx0IiwgIjwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImdlIiwgIj49Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJsZSIsICI8PSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZk9wZXJhdG9yTWFwLnB1dCgibW9kIiwgIiUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoImVxIiwgIj09Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJhbmQiLCAiJiYiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZPcGVyYXRvck1hcC5wdXQoIm9yIiwgInx8Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmT3BlcmF0b3JNYXAucHV0KCJub3QiLCAiISIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yIHNxdWlycmVscyBhd2F5IGEgZmV3IHRoaW5ncyB3ZSdsbCBuZWVkIGxhdGVyCi0JICogCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBjb2RlTWFwCi0JICogQHBhcmFtIHRyYW5zbGF0b3IKLQkgKiBAcGFyYW0ganNwUmVmZXJlbmNlUmVnaW9uCi0JICogQHBhcmFtIGNvbnRlbnRTdGFydAotCSAqLwotCXB1YmxpYyBFTEdlbmVyYXRvclZpc2l0b3IoU3RyaW5nQnVmZmVyIHJlc3VsdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjdXJyZW50Tm9kZSwgTWFwIGNvZGVNYXAsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0UmVnaW9uQ29sbGVjdGlvbiBqc3BSZWZlcmVuY2VSZWdpb24sIGludCBjb250ZW50U3RhcnQpCi0JewotCQlmUmVzdWx0ID0gcmVzdWx0OwotCQlmQ29kZU1hcCA9IGNvZGVNYXA7Ci0JCWZPZmZzZXRJblVzZXJDb2RlID0gcmVzdWx0Lmxlbmd0aCgpOwotCQlmQ29udGVudFN0YXJ0ID0gY29udGVudFN0YXJ0OwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZkN1cnJlbnROb2RlID0gY3VycmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgdG9rZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0uICBBdXRvbWF0aWNhbGx5IGNhbGN1bGF0aW5nIG1hcHBpbmcuCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChUb2tlbiB0b2tlbikKLQl7Ci0JCWFwcGVuZCh0b2tlbi5pbWFnZSwgdG9rZW4uYmVnaW5Db2x1bW4gLSAxLCB0b2tlbi5lbmRDb2x1bW4pOwotCX0KLQkKLQkvKioKLQkgKiBBcHBlbmQgYSB0cmFuc2xhdGlvbiBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgaW5wdXQgdG9rZW4uCi0JICogCi0JICogQHBhcmFtIHRyYW5zbGF0ZWQKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kKFN0cmluZyB0cmFuc2xhdGVkLCBUb2tlbiB0b2tlbikKLQl7Ci0JCWFwcGVuZCh0cmFuc2xhdGVkLCB0b2tlbi5iZWdpbkNvbHVtbiAtIDEsIHRva2VuLmVuZENvbHVtbik7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIGEgc3RyaW5nIGV4cGxpY2l0bHkgZ2l2aW5nIHRoZSBpbnB1dCBtYXBwaW5nLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogQHBhcmFtIGpzcFBvc2l0aW9uU3RhcnQKLQkgKiBAcGFyYW0ganNwUG9zaXRpb25FbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kKFN0cmluZyBuZXdUZXh0LCBpbnQganNwUG9zaXRpb25TdGFydCwgaW50IGpzcFBvc2l0aW9uRW5kKQotCXsKLQkJZlJlc3VsdC5hcHBlbmQobmV3VGV4dCk7Ci0JCVBvc2l0aW9uIGphdmFSYW5nZSA9IG5ldyBQb3NpdGlvbihmT2Zmc2V0SW5Vc2VyQ29kZSwgbmV3VGV4dC5sZW5ndGgoKSk7Ci0JCVBvc2l0aW9uIGpzcFJhbmdlID0gbmV3IFBvc2l0aW9uKGZDb250ZW50U3RhcnQgKyBqc3BQb3NpdGlvblN0YXJ0LCBqc3BQb3NpdGlvbkVuZCAtIGpzcFBvc2l0aW9uU3RhcnQpOwotCi0JCWZDb2RlTWFwLnB1dChqYXZhUmFuZ2UsIGpzcFJhbmdlKTsKLQkJZk9mZnNldEluVXNlckNvZGUgKz0gbmV3VGV4dC5sZW5ndGgoKTsKLQl9Ci0JCi0JLyoqCi0JICogQXBwZW5kIHRleHQgdGhhdCB3aWxsIGJlIHVubWFwcGVkIGFuZCB0aGVyZWZvcmUgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGZvciBjb21wbGV0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZChTdHJpbmcgbmV3VGV4dCkKLQl7Ci0JCWZSZXN1bHQuYXBwZW5kKG5ld1RleHQpOwotCQlmT2Zmc2V0SW5Vc2VyQ29kZSArPSBuZXdUZXh0Lmxlbmd0aCgpOwotCX0KLQkKLQkvKioKLQkgKiBHZW5lcmF0ZSBhIGZ1bmN0aW9uIGludm9jYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZ1bGxGdW5jdGlvbk5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZW5GdW5jdGlvbihTdHJpbmcgZnVsbEZ1bmN0aW9uTmFtZSkgewotCQlUTERDTURvY3VtZW50TWFuYWdlciBkb2NNZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKGZEb2N1bWVudCk7Ci0JCWludCBjb2xvbkluZGV4ID0gZnVsbEZ1bmN0aW9uTmFtZS5pbmRleE9mKCc6Jyk7Ci0JCVN0cmluZyBwcmVmaXggPSBmdWxsRnVuY3Rpb25OYW1lLnN1YnN0cmluZygwLCBjb2xvbkluZGV4KTsKLQkJU3RyaW5nIGZ1bmN0aW9uTmFtZSA9IGZ1bGxGdW5jdGlvbk5hbWUuc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAxKTsKLQkJaWYgKGRvY01nciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJdGVyYXRvciB0YWdsaWJzID0gZG9jTWdyLmdldENNRG9jdW1lbnRUcmFja2VycyhmQ3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKHRhZ2xpYnMuaGFzTmV4dCgpKSB7Ci0JCQlUYWdsaWJUcmFja2VyIHRyYWNrZXIgPSAoVGFnbGliVHJhY2tlcil0YWdsaWJzLm5leHQoKTsKLQkJCWlmKHRyYWNrZXIuZ2V0UHJlZml4KCkuZXF1YWxzKHByZWZpeCkpIHsKLQkJCQlDTURvY3VtZW50SW1wbCBkb2MgPSAoQ01Eb2N1bWVudEltcGwpdHJhY2tlci5nZXREb2N1bWVudCgpOwotCQkJCQotCQkJCUxpc3QgZnVuY3Rpb25zID0gZG9jLmdldEZ1bmN0aW9ucygpOwotCQkJCWZvcihJdGVyYXRvciBpdCA9IGZ1bmN0aW9ucy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotCQkJCQlUTERGdW5jdGlvbiBmdW5jdGlvbiA9IChUTERGdW5jdGlvbilpdC5uZXh0KCk7Ci0JCQkJCWlmKGZ1bmN0aW9uLmdldE5hbWUoKS5lcXVhbHMoZnVuY3Rpb25OYW1lKSkgewotCQkJCQkJcmV0dXJuIGZ1bmN0aW9uLmdldENsYXNzTmFtZSgpICsgIi4iICsgZnVuY3Rpb24uZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogSGFuZGxlIGEgc2ltcGxlIG5vZGUgLS0gZmFsbGJhY2sKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuKG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSkpOwotCX0KLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgaW50IGdldE1ldGhvZENvdW50ZXIoKSB7Ci0JCXJldHVybiBtZXRob2RDb3VudGVyKys7Ci0JfQotCQotCS8qKgotCSAqIEhhbmRsZSB0b3AtbGV2ZWwgZXhwcmVzc2lvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlpbnQgc3RhcnQgPSBub2RlLmdldEZpcnN0VG9rZW4oKS5iZWdpbkNvbHVtbiAtIDE7Ci0JCWludCBlbmQgPSBub2RlLmxhc3RUb2tlbi5lbmRDb2x1bW4gLSAxOwotCQlhcHBlbmQoZkV4cHJlc3Npb25IZWFkZXIxLCBzdGFydCwgc3RhcnQpOwotCQlhcHBlbmQoSW50ZWdlci50b1N0cmluZyhnZXRNZXRob2RDb3VudGVyKCkpLCBzdGFydCwgc3RhcnQpOwotCQlhcHBlbmQoZkV4cHJlc3Npb25IZWFkZXIyLCBzdGFydCwgc3RhcnQpOwotCQkKLQkJT2JqZWN0IHJldHZhbCA9IG5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0KLQkJYXBwZW5kKGZGb290ZXIsIGVuZCwgZW5kKTsKLQkJCi0JCS8vIHNvbWV0aGluZyBpcyBwcmV2ZW50aW5nIGdvb2QgY29kZSBnZW5lcmF0aW9uIHNvIGVtcHR5IG91dCB0aGUgcmVzdWx0IGFuZCB0aGUgbWFwLgotCQlpZighZkNhbkdlbmVyYXRlKSB7Ci0JCQlmUmVzdWx0LmRlbGV0ZSgwLCBmUmVzdWx0Lmxlbmd0aCgpKTsKLQkJCWZDb2RlTWFwLmNsZWFyKCk7CQkJCi0JCX0KLQkJcmV0dXJuIHJldHZhbDsKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmljYWxseSBnZW5lcmF0ZSBhbiBvcGVyYXRvciBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRhdGEKLQkgKi8KLQlwcml2YXRlIHZvaWQgZ2VuZXJhdGVPcGVyYXRvck5vZGUoQVNUT3BlcmF0b3JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWZvcihpbnQgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQlub2RlLmNoaWxkcmVuW2ldLmpqdEFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWlmKCBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIGkgPiAxKSB7Ci0JCQkJYXBwZW5kT3BlcmF0b3IoKFRva2VuKW5vZGUuZ2V0T3BlcmF0b3JUb2tlbnMoKS5nZXQoaSkpOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIEFwcGVuZCBhbiBvcGVyYXRvciB0byB0aGUgb3V0cHV0IHN0cmVhbSBhZnRlciB0cmFuc2xhdGlvbiAoaWYgYW55KQotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBhcHBlbmRPcGVyYXRvcihUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdG9rZW5JbWFnZSA9IHRva2VuLmltYWdlLnRyaW0oKTsKLQkJU3RyaW5nIHRyYW5zbGF0ZWQgPSAoU3RyaW5nKWZPcGVyYXRvck1hcC5nZXQodG9rZW5JbWFnZSk7Ci0JCWlmKG51bGwgIT0gdHJhbnNsYXRlZCkgewotCQkJYXBwZW5kKHRyYW5zbGF0ZWQsIHRva2VuKTsKLQkJfSBlbHNlIHsKLQkJCWFwcGVuZCh0b2tlbik7Ci0JCX0KLQkJcmV0dXJuKHRyYW5zbGF0ZWQpOwotCX0KLQotCS8qKgotCSAqIEhhbmRsZSBvciBFeHByZXNzaW9uCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RPckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBhbmQgZXhwcmVzc2lvbiAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFuZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBlcXVhbGl0eQotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWdlbmVyYXRlT3BlcmF0b3JOb2RlKG5vZGUsIGRhdGEpOwotCQlyZXR1cm4obnVsbCk7Ci0JfQotCi0KLQkvKioKLQkgKiBIYW5kbGUgUmVsYXRpb25hbAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSBhZGRpdGlvbgotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlnZW5lcmF0ZU9wZXJhdG9yTm9kZShub2RlLCBkYXRhKTsKLQkJcmV0dXJuKG51bGwpOwotCX0KLQotCi0JLyoqCi0JICogSGFuZGxlIG11bHRpcGx5Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RNdWx0aXBseUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJZ2VuZXJhdGVPcGVyYXRvck5vZGUobm9kZSwgZGF0YSk7Ci0JCXJldHVybihudWxsKTsKLQl9Ci0KLQotCS8qKiAKLQkgKiBDaG9pY2UgRXhwcmVzc2lvbiAodGVybmFyeSBvcGVyYXRvcikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENob2ljZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJbm9kZS5jaGlsZHJlblswXS5qanRBY2NlcHQodGhpcywgZGF0YSk7Ci0JCWFwcGVuZCgiPyIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUuY2hpbGRyZW5bMV0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQlhcHBlbmQoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQlub2RlLmNoaWxkcmVuWzJdLmpqdEFjY2VwdCh0aGlzLGRhdGEpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEhhbmRsZSB1bmFyeQotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW5hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCWlmKEpTUEVMUGFyc2VyQ29uc3RhbnRzLkVNUFRZID09IG5vZGUuZmlyc3RUb2tlbi5raW5kKSB7Ci0JCQlhcHBlbmQoIigobnVsbCA9PSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWFwcGVuZCgiKSB8fCAoIik7IC8vJE5PTi1OTFMtMSQKLQkJCW5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JCQlhcHBlbmQoIikuaXNFbXB0eSgpKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZihKU1BFTFBhcnNlckNvbnN0YW50cy5OT1QxID09IG5vZGUuZmlyc3RUb2tlbi5raW5kIHx8IEpTUEVMUGFyc2VyQ29uc3RhbnRzLk5PVDIgPT0gbm9kZS5maXJzdFRva2VuLmtpbmQpIHsKLQkJCWFwcGVuZCgiKCEiKTsgLy8kTk9OLU5MUy0xJAotCQkJbm9kZS5jaGlsZHJlbkFjY2VwdCh0aGlzLCBkYXRhKTsKLQkJCWFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZihKU1BFTFBhcnNlckNvbnN0YW50cy5NSU5VUyA9PSBub2RlLmZpcnN0VG9rZW4ua2luZCkgewotCQkJYXBwZW5kKCIoLSIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCW5vZGUuY2hpbGRyZW5BY2NlcHQodGhpcywgZGF0YSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvKioKLQkgKiBWYWx1ZSBub2RlCi0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZSBub2RlLCBPYmplY3QgZGF0YSkgewotCQlpZihub2RlLmpqdEdldE51bUNoaWxkcmVuKCkgPj0gMikgewotCQkJaWYobm9kZS5qanRHZXRDaGlsZCgwKSBpbnN0YW5jZW9mIEFTVFZhbHVlUHJlZml4ICYmIG5vZGUuamp0R2V0Q2hpbGQoMSkgaW5zdGFuY2VvZiBBU1RWYWx1ZVN1ZmZpeCkgewotCQkJCUFTVFZhbHVlUHJlZml4IHByZWZpeCA9IChBU1RWYWx1ZVByZWZpeCkgbm9kZS5qanRHZXRDaGlsZCgwKTsKLQkJCQlBU1RWYWx1ZVN1ZmZpeCBzdWZmaXggPSAoQVNUVmFsdWVTdWZmaXgpIG5vZGUuamp0R2V0Q2hpbGQoMSk7Ci0JCQkJaWYocHJlZml4LmZpcnN0VG9rZW4uaW1hZ2UuZXF1YWxzKCJwYWdlQ29udGV4dCIpICYmIHN1ZmZpeC5nZXRQcm9wZXJ0eU5hbWVUb2tlbigpLmltYWdlLmVxdWFscygicmVxdWVzdCIpKSB7Ci0JCQkJCWFwcGVuZCgiKChIVFRQU2VydmxldFJlcXVlc3QpIik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwkKLQl9Ci0KLQotCS8qKgotCSAqIFZhbHVlIFByZWZpeAotCSAqLwotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVQcmVmaXggbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJLy8gdGhpcyBpcyBhIHJhdyBpZGVudGlmaWVyLiAgTWF5IHN1cmUgaXQncyBhbiBpbXBsaWNpdCBvYmplY3QuCi0JCS8vIFRoaXMgaXMgdGhlIHByaW1hcnkgcGxhZSB3aGVyZSBtb2RpZmljYXRpb24gaXMgbmVlZGVkIHRvIAotCQkvLyBzdXBwb3J0IEpTRiBiYWNraW5nIGJlYW5zLgotCQlpZihudWxsID09IG5vZGUuY2hpbGRyZW4pIHsKLQkJCWlmKGlzQ29tcGxldGluZ09iamVjdChub2RlLmZpcnN0VG9rZW4uaW1hZ2UpKSB7Ci0JCQkJYXBwZW5kKG5vZGUuZmlyc3RUb2tlbik7Ci0JCQl9IGVsc2UgewotCQkJCWZDYW5HZW5lcmF0ZSA9IGZhbHNlOwotCQkJfQotCQkJcmV0dXJuKG51bGwpOwotCQl9Ci0JCXJldHVybiBub2RlLmNoaWxkcmVuQWNjZXB0KHRoaXMsIGRhdGEpOwotCX0KLQotCi0JLyoqCi0JICogRnVuY3Rpb24gZm9yIHRlc3RpbmcgaW1wbGljaXQgb2JqZWN0cy4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tcGxldGluZ09iamVjdChTdHJpbmcgaW1hZ2UpIHsKLQkJQm9vbGVhbiB2YWx1ZSA9IChCb29sZWFuKWZKU1BJbXBsaWNpdE9iamVjdE1hcC5nZXQoaW1hZ2UpOwotCQlyZXR1cm4gbnVsbCA9PSB2YWx1ZSA/IGZhbHNlIDogdmFsdWUuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogVmFsdWUgc3VmZml4Ci0JICovCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZVN1ZmZpeCBub2RlLCBPYmplY3QgZGF0YSkgewotCQlpZihKU1BFTFBhcnNlckNvbnN0YW50cy5MQlJBQ0tFVCA9PSBub2RlLmZpcnN0VG9rZW4ua2luZCkgewotCQkJZkNhbkdlbmVyYXRlID0gZmFsc2U7Ci0JCX0gZWxzZSBpZihudWxsICE9IG5vZGUuZ2V0UHJvcGVydHlOYW1lVG9rZW4oKSkgewotCQkJVG9rZW4gc3VmZml4ID0gbm9kZS5nZXRQcm9wZXJ0eU5hbWVUb2tlbigpOwotCQkJU3RyaW5nIHVjYXNlTmFtZSA9IHN1ZmZpeC5pbWFnZS5zdWJzdHJpbmcoMCwgMSkudG9VcHBlckNhc2UoKSArIHN1ZmZpeC5pbWFnZS5zdWJzdHJpbmcoMSwgc3VmZml4LmltYWdlLmxlbmd0aCgpKTsgCi0KLQkJCS8vIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UuICBOb3RlIHRoYXQgdGhlIHR5cGUgc3lzdGVtLCBubyBtYXR0ZXIgaG93IG11Y2ggdHlwZSBpbmZvcm1hdGlvbgotCQkJLy8gd2Ugd291bGQgaGF2ZSB3b3VsZG4ndCBnaXZlIHVzIHRoZSBjb3JyZWN0IHJlc3VsdC4gIFdlJ3JlIGxvb2tpbmcgZm9yICJwYWdlQ29udGV4dC5yZXF1ZXN0IiAKLQkJCS8vIGhlcmUgYW5kIHdpbGwgYWRkIGEgZG93bmNhc3QgdG8gKEhUVFBTZXJ2bGV0UmVxdWVzdCkKLQkJCQotCQkJYXBwZW5kKG5vZGUuZmlyc3RUb2tlbik7Ci0JCQlhcHBlbmQoImdldCIgKyB1Y2FzZU5hbWUgKyAiKCkiLCBzdWZmaXgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQotCQkJU2ltcGxlTm9kZSBwYXJlbnQgPSAoU2ltcGxlTm9kZSkgbm9kZS5qanRHZXRQYXJlbnQoKTsKLQkJCWlmKHN1ZmZpeC5pbWFnZS5lcXVhbHMoInJlcXVlc3QiKSAmJiBwYXJlbnQgaW5zdGFuY2VvZiBBU1RWYWx1ZSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCXBhcmVudC5qanRHZXRQYXJlbnQoKSBpbnN0YW5jZW9mIEFTVFVuYXJ5RXhwcmVzc2lvbiAmJiBwYXJlbnQuZmlyc3RUb2tlbi5pbWFnZS5lcXVhbHMoInBhZ2VDb250ZXh0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWFwcGVuZCgiKSIpOwotCQkJfSAKLQotCi0JCX0gZWxzZSB7Ci0JCQlhcHBlbmQobm9kZS5maXJzdFRva2VuKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8qKgotCSAqIEZ1bmN0aW9uIGludm9jYXRpb24KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlTdHJpbmcgZnVuY3Rpb25UcmFuc2xhdGlvbiA9IGdlbkZ1bmN0aW9uKG5vZGUuZ2V0RnVsbEZ1bmN0aW9uTmFtZSgpKTsKLQkJaWYobnVsbCAhPSBmdW5jdGlvblRyYW5zbGF0aW9uKQotCQl7Ci0JCQlhcHBlbmQoZnVuY3Rpb25UcmFuc2xhdGlvbiArICIoIiwgbm9kZS5nZXRGaXJzdFRva2VuKCkpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IoaW50IGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCW5vZGUuY2hpbGRyZW5baV0uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCQkJCWlmKCBub2RlLmNoaWxkcmVuLmxlbmd0aCAtIGkgPiAxKXsKLQkJCQkJYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlhcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIExpdGVyYWwKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJLy8gVE9ETyBhbnkgZnVydGhlciB0cmFuc2xhdGlvbiBuZWVkZWQ/Ci0JCWFwcGVuZChub2RlLmZpcnN0VG9rZW4pOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9GaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDVjNTYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9GaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGNsYXNzIEZpbmRGdW5jdGlvbkludm9jYXRpb25WaXNpdG9yIGltcGxlbWVudHMgSlNQRUxQYXJzZXJWaXNpdG9yIHsKLQlwcm90ZWN0ZWQgaW50IGZDdXJzb3JQb3NpdGlvbjsKLQkKLQlwdWJsaWMgRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IoaW50IGN1cnNvclBvc2l0aW9uKQotCXsKLQkJZkN1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5jbG9zaW5nKFNpbXBsZU5vZGUgbm9kZSkgewotCQlyZXR1cm4obm9kZS5maXJzdFRva2VuLmJlZ2luQ29sdW1uIDwgZkN1cnNvclBvc2l0aW9uICYmIG5vZGUubGFzdFRva2VuLmVuZENvbHVtbiA+PSBmQ3Vyc29yUG9zaXRpb24pOwotCX0KLQotCQotCXByb3RlY3RlZCBPYmplY3QgdmlzaXRFbmNsb3NpbmdDaGlsZChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKQl7Ci0JCWlmKG51bGwgPT0gbm9kZS5jaGlsZHJlbikKLQkJCXJldHVybiBudWxsOwotCQkKLQkJZm9yKGludCBpID0gMDsgaSA8IG5vZGUuY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWlmKGlzRW5jbG9zaW5nKG5vZGUpKSAKLQkJCQlyZXR1cm4gbm9kZS5jaGlsZHJlbltpXS5qanRBY2NlcHQodGhpcywgZGF0YSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE9yRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFuZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RNdWx0aXBseUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RDaG9pY2VFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW5hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWUgbm9kZSwgT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHZpc2l0RW5jbG9zaW5nQ2hpbGQobm9kZSwgZGF0YSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZVByZWZpeCBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlU3VmZml4IG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCXJldHVybiB2aXNpdEVuY2xvc2luZ0NoaWxkKG5vZGUsIGRhdGEpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25JbnZvY2F0aW9uIG5vZGUsIE9iamVjdCBkYXRhKSB7Ci0JCU9iamVjdCBuZXN0ZWRJbnZvY2F0aW9uID0gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQkJaWYobnVsbCAhPSBuZXN0ZWRJbnZvY2F0aW9uKQotCQkJcmV0dXJuIG5lc3RlZEludm9jYXRpb247Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSkgewotCQlyZXR1cm4gdmlzaXRFbmNsb3NpbmdDaGlsZChub2RlLCBkYXRhKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSkpUSlNQRUxQYXJzZXJTdGF0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pKVEpTUEVMUGFyc2VyU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU3NDM2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSkpUSlNQRUxQYXJzZXJTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKSlRKU1BFTFBhcnNlclN0YXRlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotY2xhc3MgSkpUSlNQRUxQYXJzZXJTdGF0ZSB7Ci0gIHByaXZhdGUgamF2YS51dGlsLlN0YWNrIG5vZGVzOwotICBwcml2YXRlIGphdmEudXRpbC5TdGFjayBtYXJrczsKLQotICBwcml2YXRlIGludCBzcDsJCS8vIG51bWJlciBvZiBub2RlcyBvbiBzdGFjawotICBwcml2YXRlIGludCBtazsJCS8vIGN1cnJlbnQgbWFyawotICBwcml2YXRlIGJvb2xlYW4gbm9kZV9jcmVhdGVkOwotCi0gIEpKVEpTUEVMUGFyc2VyU3RhdGUoKSB7Ci0gICAgbm9kZXMgPSBuZXcgamF2YS51dGlsLlN0YWNrKCk7Ci0gICAgbWFya3MgPSBuZXcgamF2YS51dGlsLlN0YWNrKCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIERldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBub2RlIHdhcyBhY3R1YWxseSBjbG9zZWQgYW5kCi0gICAgIHB1c2hlZC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHRoZSBmaW5hbCB1c2VyIGFjdGlvbiBvZiBhCi0gICAgIG5vZGUgc2NvcGUuICAqLwotICBib29sZWFuIG5vZGVDcmVhdGVkKCkgewotICAgIHJldHVybiBub2RlX2NyZWF0ZWQ7Ci0gIH0KLQotICAvKiBDYWxsIHRoaXMgdG8gcmVpbml0aWFsaXplIHRoZSBub2RlIHN0YWNrLiAgSXQgaXMgY2FsbGVkCi0gICAgIGF1dG9tYXRpY2FsbHkgYnkgdGhlIHBhcnNlcidzIFJlSW5pdCgpIG1ldGhvZC4gKi8KLSAgdm9pZCByZXNldCgpIHsKLSAgICBub2Rlcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIG1hcmtzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgc3AgPSAwOwotICAgIG1rID0gMDsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGUgQVNULiAgSXQgb25seSBtYWtlcyBzZW5zZSB0byBjYWxsCi0gICAgIHRoaXMgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhcnNlLiAqLwotICBOb2RlIHJvb3ROb2RlKCkgewotICAgIHJldHVybiAoTm9kZSlub2Rlcy5lbGVtZW50QXQoMCk7Ci0gIH0KLQotICAvKiBQdXNoZXMgYSBub2RlIG9uIHRvIHRoZSBzdGFjay4gKi8KLSAgdm9pZCBwdXNoTm9kZShOb2RlIG4pIHsKLSAgICBub2Rlcy5wdXNoKG4pOwotICAgICsrc3A7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBub2RlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlCi0gICAgIHN0YWNrLiAgKi8KLSAgTm9kZSBwb3BOb2RlKCkgewotICAgIGlmICgtLXNwIDwgbWspIHsKLSAgICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gKE5vZGUpbm9kZXMucG9wKCk7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBub2RlIGN1cnJlbnRseSBvbiB0aGUgdG9wIG9mIHRoZSBzdGFjay4gKi8KLSAgTm9kZSBwZWVrTm9kZSgpIHsKLSAgICByZXR1cm4gKE5vZGUpbm9kZXMucGVlaygpOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9uIHRoZSBzdGFjayBpbiB0aGUgY3VycmVudCBub2RlCi0gICAgIHNjb3BlLiAqLwotICBpbnQgbm9kZUFyaXR5KCkgewotICAgIHJldHVybiBzcCAtIG1rOwotICB9Ci0KLQotICB2b2lkIGNsZWFyTm9kZVNjb3BlKE5vZGUgbikgewotICAgIHdoaWxlIChzcCA+IG1rKSB7Ci0gICAgICBwb3BOb2RlKCk7Ci0gICAgfQotICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICB9Ci0KLQotICB2b2lkIG9wZW5Ob2RlU2NvcGUoTm9kZSBuKSB7Ci0gICAgbWFya3MucHVzaChuZXcgSW50ZWdlcihtaykpOwotICAgIG1rID0gc3A7Ci0gICAgbi5qanRPcGVuKCk7Ci0gIH0KLQotCi0gIC8qIEEgZGVmaW5pdGUgbm9kZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIGEgc3BlY2lmaWVkIG51bWJlciBvZgotICAgICBjaGlsZHJlbi4gIFRoYXQgbnVtYmVyIG9mIG5vZGVzIGFyZSBwb3BwZWQgZnJvbSB0aGUgc3RhY2sgYW5kCi0gICAgIG1hZGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBkZWZpbml0ZSBub2RlLiAgVGhlbiB0aGUgZGVmaW5pdGUgbm9kZQotICAgICBpcyBwdXNoZWQgb24gdG8gdGhlIHN0YWNrLiAqLwotICB2b2lkIGNsb3NlTm9kZVNjb3BlKE5vZGUgbiwgaW50IG51bSkgewotICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgIHdoaWxlIChudW0tLSA+IDApIHsKLSAgICAgIE5vZGUgYyA9IHBvcE5vZGUoKTsKLSAgICAgIGMuamp0U2V0UGFyZW50KG4pOwotICAgICAgbi5qanRBZGRDaGlsZChjLCBudW0pOwotICAgIH0KLSAgICBuLmpqdENsb3NlKCk7Ci0gICAgcHVzaE5vZGUobik7Ci0gICAgbm9kZV9jcmVhdGVkID0gdHJ1ZTsKLSAgfQotCi0KLSAgLyogQSBjb25kaXRpb25hbCBub2RlIGlzIGNvbnN0cnVjdGVkIGlmIGl0cyBjb25kaXRpb24gaXMgdHJ1ZS4gIEFsbAotICAgICB0aGUgbm9kZXMgdGhhdCBoYXZlIGJlZW4gcHVzaGVkIHNpbmNlIHRoZSBub2RlIHdhcyBvcGVuZWQgYXJlCi0gICAgIG1hZGUgY2hpbGRyZW4gb2YgdGhlIHRoZSBjb25kaXRpb25hbCBub2RlLCB3aGljaCBpcyB0aGVuIHB1c2hlZAotICAgICBvbiB0byB0aGUgc3RhY2suICBJZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlIHRoZSBub2RlIGlzIG5vdAotICAgICBjb25zdHJ1Y3RlZCBhbmQgdGhleSBhcmUgbGVmdCBvbiB0aGUgc3RhY2suICovCi0gIHZvaWQgY2xvc2VOb2RlU2NvcGUoTm9kZSBuLCBib29sZWFuIGNvbmRpdGlvbikgewotICAgIGlmIChjb25kaXRpb24pIHsKLSAgICAgIGludCBhID0gbm9kZUFyaXR5KCk7Ci0gICAgICBtayA9ICgoSW50ZWdlciltYXJrcy5wb3AoKSkuaW50VmFsdWUoKTsKLSAgICAgIHdoaWxlIChhLS0gPiAwKSB7Ci0JTm9kZSBjID0gcG9wTm9kZSgpOwotCWMuamp0U2V0UGFyZW50KG4pOwotCW4uamp0QWRkQ2hpbGQoYywgYSk7Ci0gICAgICB9Ci0gICAgICBuLmpqdENsb3NlKCk7Ci0gICAgICBwdXNoTm9kZShuKTsKLSAgICAgIG5vZGVfY3JlYXRlZCA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1rID0gKChJbnRlZ2VyKW1hcmtzLnBvcCgpKS5pbnRWYWx1ZSgpOwotICAgICAgbm9kZV9jcmVhdGVkID0gZmFsc2U7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamogYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamoKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMzgzYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMLmpqCisrKyAvZGV2L251bGwKQEAgLTEsNjc1ICswLDAgQEAKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4NCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzDQotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wDQotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQNCi0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbA0KLSAqIA0KLSAqIENvbnRyaWJ1dG9yczoNCi0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uDQotICogICAgIA0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qQGJnZW4oamp0cmVlKSBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMLmpqICovDQotLypAZWdlbiovLyogSSBrbm93IHRoYXQgaGFpbmcgc29tZSBvZiB0aGVzZSBvcHRpb25zIG9uIG9uZSBsaW5lIGlzIHJ1ZGUgYnV0IA0KLSAqIGlmIHdlIGRvbid0IGRvIHRoYXQgdGhlIGxpbmUgbnVtYmVyIHJlcG9ydGVkIGZyb20gamF2YWNjIGFyZSBvZmYNCi0gKiB3aGljaCwgdHJ1c3QgbWUsIGlzIGZhciBtb3JlIGFubm95aW5nLiAgLS10Y2Fycm9sbEBiZWEuY29tDQotICovDQotb3B0aW9ucyB7DQotICBKQVZBX1VOSUNPREVfRVNDQVBFID0gZmFsc2U7DQotICBVTklDT0RFX0lOUFVUID0gdHJ1ZTsNCi0gIFNUQVRJQyA9IGZhbHNlOw0KLSAgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotfQ0KLQ0KLVBBUlNFUl9CRUdJTihKU1BFTFBhcnNlcikNCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOw0KLQ0KLXB1YmxpYyBjbGFzcyBKU1BFTFBhcnNlci8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMvKkBlZ2VuKi8gey8qQGJnZW4oamp0cmVlKSovDQotICBwcm90ZWN0ZWQgSkpUSlNQRUxQYXJzZXJTdGF0ZSBqanRyZWUgPSBuZXcgSkpUSlNQRUxQYXJzZXJTdGF0ZSgpOw0KLQ0KLS8qQGVnZW4qLw0KLSAgDQotICB2b2lkIGpqdHJlZU9wZW5Ob2RlU2NvcGUoTm9kZSBuKQ0KLSAgew0KLSAgICAgICAgICAoKFNpbXBsZU5vZGUpbikuc2V0Rmlyc3RUb2tlbihnZXRUb2tlbigxKSk7DQotICB9DQotDQotICB2b2lkIGpqdHJlZUNsb3NlTm9kZVNjb3BlKE5vZGUgbikNCi0gIHsNCi0gICAgKChTaW1wbGVOb2RlKW4pLnNldExhc3RUb2tlbihnZXRUb2tlbigwKSk7DQotICB9DQotICANCi0gIHB1YmxpYyBzdGF0aWMgSlNQRUxQYXJzZXIgY3JlYXRlUGFyc2VyKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsNCi0gICAgICAgICAgcmV0dXJuIG5ldyBKU1BFTFBhcnNlcihyZWFkZXIpOw0KLSAgfQ0KLSAgDQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsNCi0gICAgICAgICAgIFJlSW5pdChyZWFkZXIpOw0KLSAgfQ0KLSAgDQotfQ0KLQ0KLVBBUlNFUl9FTkQoSlNQRUxQYXJzZXIpDQotDQotU0tJUCA6DQotew0KLSAgIiAiDQotfCAiXHQiDQotfCAiXG4iDQotfCAiXHIiDQotfQ0KLQ0KLVRPS0VOIDoNCi17DQotLyogTGl0ZXJhbHMgKi8NCi0gIDwgSU5URUdFUl9MSVRFUkFMOiBbIjAiLSI5Il0gKFsiMCItIjkiXSkqID4NCi18DQotICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6DQotICAgICAgICAoWyIwIi0iOSJdKSsgIi4iIChbIjAiLSI5Il0pKiAoPEVYUE9ORU5UPik/DQotICAgICAgfCAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8NCi0gICAgICB8IChbIjAiLSI5Il0pKyA8RVhQT05FTlQ+DQotICA+DQotfA0KLSAgPCAjRVhQT05FTlQ6IFsiZSIsIkUiXSAoWyIrIiwiLSJdKT8gKFsiMCItIjkiXSkrID4NCi18DQotICA8IFNUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICgoflsiXCIiLCJcXCJdKSB8ICgiXFwiICggWyJcXCIsIlwiIl0gKSkpKiAiXCIiKSB8DQotICAgICAgKCJcJyIgKCh+WyJcJyIsIlxcIl0pIHwgKCJcXCIgKCBbIlxcIiwiXCciXSApKSkqICJcJyIpDQotICA+DQotfA0KLSAgPCBCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICh+WyJcIiIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCIiXSApKSkgfA0KLSAgICAgICgiXCciICh+WyJcJyIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCciXSApKSkNCi0gID4NCi0NCi0vKiBSZXNlcnZlZCBXb3JkcyBhbmQgU3ltYm9scyAqLw0KLXwgPCBUUlVFOiAidHJ1ZSIgPg0KLXwgPCBGQUxTRTogImZhbHNlIiA+DQotfCA8IE5VTEw6ICJudWxsIiA+DQotfCA8IERPVDogIi4iID4NCi18IDwgR1QxOiAiPiIgPg0KLXwgPCBHVDI6ICJndCIgPg0KLXwgPCBMVDE6ICI8IiA+DQotfCA8IExUMjogImx0IiA+DQotfCA8IEVRMTogIj09IiA+DQotfCA8IEVRMjogImVxIiA+DQotfCA8IExFMTogIjw9IiA+DQotfCA8IExFMjogImxlIiA+DQotfCA8IEdFMTogIj49IiA+DQotfCA8IEdFMjogImdlIiA+DQotfCA8IE5FUTE6ICIhPSIgPg0KLXwgPCBORVEyOiAibmUiID4NCi18IDwgTFBBUkVOOiAiKCIgPg0KLXwgPCBSUEFSRU46ICIpIiA+DQotfCA8IENPTU1BOiAiLCIgPg0KLXwgPCBDT0xPTjogIjoiID4NCi18IDwgTEJSQUNLRVQ6ICJbIiA+DQotfCA8IFJCUkFDS0VUOiAiXSIgPg0KLXwgPCBQTFVTOiAiKyIgPg0KLXwgPCBNSU5VUzogIi0iID4NCi18IDwgTVVMVElQTFk6ICIqIiA+DQotfCA8IERJVklERTE6ICIvIiA+DQotfCA8IERJVklERTI6ICJkaXYiID4NCi18IDwgTU9EVUxVUzE6ICIlIiA+DQotfCA8IE1PRFVMVVMyOiAibW9kIiA+DQotfCA8IE5PVDE6ICJub3QiID4NCi18IDwgTk9UMjogIiEiID4NCi18IDwgQU5EMTogImFuZCIgPg0KLXwgPCBBTkQyOiAiJiYiID4NCi18IDwgT1IxOiAib3IiID4NCi18IDwgT1IyOiAifHwiID4NCi18IDwgRU1QVFk6ICJlbXB0eSIgPg0KLXwgPCBDT05EOiAiPyIgPg0KLQ0KLS8qIElkZW50aWZpZXJzICovDQotDQotfCA8IElERU5USUZJRVI6ICg8TEVUVEVSPnw8SU1QTF9PQkpfU1RBUlQ+KSAoPExFVFRFUj58PERJR0lUPikqID4NCi18IDwgI0lNUExfT0JKX1NUQVJUOiAiIyIgPg0KLXwNCi0gIDwgI0xFVFRFUjoNCi0gICAgICBbDQotICAgICAgICIkIiwNCi0gICAgICAgIkEiLSJaIiwNCi0gICAgICAgIl8iLA0KLSAgICAgICAiYSItInoiLA0KLSAgICAgICAiXHUwMGMwIi0iXHUwMGQ2IiwNCi0gICAgICAgIlx1MDBkOCItIlx1MDBmNiIsDQotICAgICAgICJcdTAwZjgiLSJcdTAwZmYiLA0KLSAgICAgICAiXHUwMTAwIi0iXHUxZmZmIiwNCi0gICAgICAgIlx1MzA0MCItIlx1MzE4ZiIsDQotICAgICAgICJcdTMzMDAiLSJcdTMzN2YiLA0KLSAgICAgICAiXHUzNDAwIi0iXHUzZDJkIiwNCi0gICAgICAgIlx1NGUwMCItIlx1OWZmZiIsDQotICAgICAgICJcdWY5MDAiLSJcdWZhZmYiDQotICAgICAgXQ0KLSAgPg0KLXwNCi0gIDwgI0RJR0lUOg0KLSAgICAgIFsNCi0gICAgICAgIjAiLSI5IiwNCi0gICAgICAgIlx1MDY2MCItIlx1MDY2OSIsDQotICAgICAgICJcdTA2ZjAiLSJcdTA2ZjkiLA0KLSAgICAgICAiXHUwOTY2Ii0iXHUwOTZmIiwNCi0gICAgICAgIlx1MDllNiItIlx1MDllZiIsDQotICAgICAgICJcdTBhNjYiLSJcdTBhNmYiLA0KLSAgICAgICAiXHUwYWU2Ii0iXHUwYWVmIiwNCi0gICAgICAgIlx1MGI2NiItIlx1MGI2ZiIsDQotICAgICAgICJcdTBiZTciLSJcdTBiZWYiLA0KLSAgICAgICAiXHUwYzY2Ii0iXHUwYzZmIiwNCi0gICAgICAgIlx1MGNlNiItIlx1MGNlZiIsDQotICAgICAgICJcdTBkNjYiLSJcdTBkNmYiLA0KLSAgICAgICAiXHUwZTUwIi0iXHUwZTU5IiwNCi0gICAgICAgIlx1MGVkMCItIlx1MGVkOSIsDQotICAgICAgICJcdTEwNDAiLSJcdTEwNDkiDQotICAgICAgXQ0KLSAgPg0KLX0NCi0NCi1BU1RFeHByZXNzaW9uIEV4cHJlc3Npb24oKSA6IHsvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvbiAqLw0KLSAgQVNURXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEV4cHJlc3Npb24oSkpURVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoTE9PS0FIRUFEKCI/IikgQ2hvaWNlRXhwcmVzc2lvbigpIHwgT3JFeHByZXNzaW9uKCkpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0vKkBlZ2VuKi8geyByZXR1cm4gamp0bjAwMDsgfS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgT3JFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgOiANCi17LypAYmdlbihqanRyZWUpICNPckV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNUT3JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUT3JFeHByZXNzaW9uKEpKVE9SRVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjT3JFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBBbmRFeHByZXNzaW9uKCkgKCh0ID0gPE9SMT4gfCB0ID0gPE9SMj4pIHsgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBBbmRFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQW5kRXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI0FuZEV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNUQW5kRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFuZEV4cHJlc3Npb24oSkpUQU5ERVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjQW5kRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKCh0ID0gPEFORDE+IHwgdCA9IDxBTkQyPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLyAgICAgICAgDQotfQ0KLQ0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgICAgICAgOiANCi17LypAYmdlbihqanRyZWUpICNFcXVhbGl0eUV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNURXF1YWxpdHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpKVEVRVUFMSVRZRVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjRXF1YWxpdHlFeHByZXNzaW9uKD4gMSkgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIA0KLSAgICAgICAgKCh0ID0gPEVRMT4gfCB0ID0gPEVRMj4gfCB0ID0gPE5FUTE+IHwgdCA9IDxORVEyPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgICAgICAgIDoNCi17LypAYmdlbihqanRyZWUpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpKVFJFTEFUSU9OQUxFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQWRkRXhwcmVzc2lvbigpIA0KLSAgICAgICAgKA0KLSAgICAgICAgICAgICAgICAodCA9IDxMVDE+IHwgdCA9IDxMVDI+IHwgdCA9IDxHVDE+IHwgdCA9IDxHVDI+IHwgdCA9IDxHRTE+IHwgdCA9IDxHRTI+IHwgdCA9IDxMRTE+IHwgdCA9IDxMRTI+KSAgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgICAgICAgICAgQWRkRXhwcmVzc2lvbigpDQotICAgICAgICApKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQWRkRXhwcmVzc2lvbigpICAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI0FkZEV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgQVNUQWRkRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFkZEV4cHJlc3Npb24oSkpUQURERVhQUkVTU0lPTik7DQotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotey8qQGJnZW4oamp0cmVlKSAjQWRkRXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCkgKCh0ID0gPFBMVVM+IHwgdCA9IDxNSU5VUz4pIHsgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBNdWx0aXBseUV4cHJlc3Npb24oKSAgICAgICAgICAgICAgICAgICAgICAgICA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgI011bHRpcGx5RXhwcmVzc2lvbig+IDEpICovDQotICAgICAgICBBU1RNdWx0aXBseUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RNdWx0aXBseUV4cHJlc3Npb24oSkpUTVVMVElQTFlFWFBSRVNTSU9OKTsNCi0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovDQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17LypAYmdlbihqanRyZWUpICNNdWx0aXBseUV4cHJlc3Npb24oPiAxKSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpICgNCi0gICAgICAgICAgICAgICAgKCB0ID0gPE1VTFRJUExZPiB8IHQgPSA8RElWSURFMT4gfCB0ID0gPERJVklERTI+IHwgdCA9IDxNT0RVTFVTMT4gfCB0ID0gPE1PRFVMVVMyPikgeyBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgICAgICAgICAgVW5hcnlFeHByZXNzaW9uKCkgICAgICAgIA0KLSAgICAgICAgKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIENob2ljZUV4cHJlc3Npb24oKSA6IHsvKkBiZ2VuKGpqdHJlZSkgQ2hvaWNlRXhwcmVzc2lvbiAqLw0KLSAgQVNUQ2hvaWNlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVENob2ljZUV4cHJlc3Npb24oSkpUQ0hPSUNFRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENob2ljZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBPckV4cHJlc3Npb24oKSA8Q09ORD4gT3JFeHByZXNzaW9uKCkgPENPTE9OPiBPckV4cHJlc3Npb24oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVW5hcnlFeHByZXNzaW9uKCkgOiB7LypAYmdlbihqanRyZWUpIFVuYXJ5RXhwcmVzc2lvbiAqLw0KLSAgQVNUVW5hcnlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUVW5hcnlFeHByZXNzaW9uKEpKVFVOQVJZRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFVuYXJ5RXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgICgoPE5PVDE+IHwgPE5PVDI+IHwgPE1JTlVTPiB8IDxFTVBUWT4pIFVuYXJ5RXhwcmVzc2lvbigpKQ0KLSAgICAgICAgfCBWYWx1ZSgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi0gICAgICAgIA0KLX0NCi0NCi12b2lkIFZhbHVlKCkgOiB7LypAYmdlbihqanRyZWUpIFZhbHVlICovDQotICBBU1RWYWx1ZSBqanRuMDAwID0gbmV3IEFTVFZhbHVlKEpKVFZBTFVFKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFsdWUgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBWYWx1ZVByZWZpeCgpIChWYWx1ZVN1ZmZpeCgpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFZhbHVlUHJlZml4KCkgOiB7LypAYmdlbihqanRyZWUpIFZhbHVlUHJlZml4ICovDQotICBBU1RWYWx1ZVByZWZpeCBqanRuMDAwID0gbmV3IEFTVFZhbHVlUHJlZml4KEpKVFZBTFVFUFJFRklYKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFsdWVQcmVmaXggKi8NCi0gICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgTGl0ZXJhbCgpIHwgKDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPikgfCBMT09LQUhFQUQoMykgRnVuY3Rpb25JbnZvY2F0aW9uKCkgfCA8SURFTlRJRklFUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICB9DQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICB9IGZpbmFsbHkgew0KLSAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICB9DQotICAgIH0NCi0vKkBlZ2VuKi8gDQotfQ0KLQ0KLXZvaWQgVmFsdWVTdWZmaXgoKSA6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFsdWVTdWZmaXggKi8NCi0gICAgICAgIEFTVFZhbHVlU3VmZml4IGpqdG4wMDAgPSBuZXcgQVNUVmFsdWVTdWZmaXgoSkpUVkFMVUVTVUZGSVgpOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHQgPSBudWxsOw0KLX0NCi17LypAYmdlbihqanRyZWUpIFZhbHVlU3VmZml4ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKDxET1Q+ICh0ID0gPElERU5USUZJRVI+KT8pLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQotLypAZWdlbiovIHsgamp0bjAwMC5zZXRQcm9wZXJ0eU5hbWVUb2tlbih0KTsgfQ0KLSAgICAgICAgfCAoPExCUkFDS0VUPiBFeHByZXNzaW9uKCkgPFJCUkFDS0VUPikvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEZ1bmN0aW9uSW52b2NhdGlvbigpIDogDQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkludm9jYXRpb24gKi8NCi0gICAgICAgIEFTVEZ1bmN0aW9uSW52b2NhdGlvbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uSW52b2NhdGlvbihKSlRGVU5DVElPTklOVk9DQVRJT04pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFRva2VuIHByZWZpeCA9IG51bGwsIG5hbWUgPSBudWxsOw0KLX0NCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uSW52b2NhdGlvbiAqLw0KLSAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAocHJlZml4ID0gPElERU5USUZJRVI+IDxDT0xPTj4pIHsgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6Iik7IH0NCi0gICAgICAgIChuYW1lID0gPElERU5USUZJRVI+KT8gew0KLSAgICAgICAgICAgIGlmKG51bGwgIT0gcHJlZml4ICYmIG51bGwgIT0gbmFtZSkNCi0gICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIgKyAobnVsbCA9PSBuYW1lID8gIiIgOiBuYW1lLmltYWdlKSk7DQotICAgICAgICAgICAgZWxzZSBpZihudWxsICE9IG5hbWUpDQotICAgICAgICAgICAgICAgICAgICBqanRuMDAwLnNldEZ1bGxGdW5jdGlvbk5hbWUobmFtZS5pbWFnZSk7DQotICAgICAgICB9DQotICAgICAgICAoPExQQVJFTj4gRXhwcmVzc2lvbigpICg8Q09NTUE+IEV4cHJlc3Npb24oKSkqIHRyeSAgeyAoPFJQQVJFTj4pIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSApPy8qQGJnZW4oamp0cmVlKSovDQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICB9IGVsc2Ugew0KLSAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICB9DQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgIH0NCi0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICB9DQotICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgIH0gZmluYWxseSB7DQotICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgIH0NCi0gICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExpdGVyYWwoKSA6IHsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbCAqLw0KLSAgQVNUTGl0ZXJhbCBqanRuMDAwID0gbmV3IEFTVExpdGVyYWwoSkpUTElURVJBTCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIExpdGVyYWwgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8VFJVRT4gfCA8RkFMU0U+IHwgPElOVEVHRVJfTElURVJBTD4gfCA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gfCA8U1RSSU5HX0xJVEVSQUw+IHwgPE5VTEw+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qanQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUwuamp0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmQ0MGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTC5qanQKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24NCi0gKiAgICAgDQotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQotLyogSSBrbm93IHRoYXQgaGF2aW5nIHNvbWUgb2YgdGhlc2Ugb3B0aW9ucyBvbiBvbmUgbGluZSBpcyBydWRlIGJ1dCANCi0gKiBpZiB3ZSBkb24ndCBkbyB0aGF0IHRoZSBsaW5lIG51bWJlciByZXBvcnRlZCBmcm9tIGphdmFjYyBhcmUgb2ZmDQotICogd2hpY2gsIHRydXN0IG1lLCBpcyBmYXIgbW9yZSBhbm5veWluZy4gIC0tdGNhcnJvbGxAYmVhLmNvbQ0KLSAqLw0KLW9wdGlvbnMgew0KLSAgSkFWQV9VTklDT0RFX0VTQ0FQRSA9IGZhbHNlOw0KLSAgVU5JQ09ERV9JTlBVVCA9IHRydWU7DQotICBTVEFUSUMgPSBmYWxzZTsNCi0gIE9QVElNSVpFX1RPS0VOX01BTkFHRVIgPSB0cnVlOyBNVUxUSSA9IHRydWU7IFZJU0lUT1IgPSB0cnVlOyBOT0RFX1BBQ0tBR0UgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwiOyBOT0RFX1NDT1BFX0hPT0sgPSB0cnVlOw0KLX0NCi0NCi1QQVJTRVJfQkVHSU4oSlNQRUxQYXJzZXIpDQotDQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsNCi0NCi1wdWJsaWMgY2xhc3MgSlNQRUxQYXJzZXIgew0KLSAgDQotICB2b2lkIGpqdHJlZU9wZW5Ob2RlU2NvcGUoTm9kZSBuKQ0KLSAgew0KLSAgICAgICAgICAoKFNpbXBsZU5vZGUpbikuc2V0Rmlyc3RUb2tlbihnZXRUb2tlbigxKSk7DQotICB9DQotDQotICB2b2lkIGpqdHJlZUNsb3NlTm9kZVNjb3BlKE5vZGUgbikNCi0gIHsNCi0gICAgKChTaW1wbGVOb2RlKW4pLnNldExhc3RUb2tlbihnZXRUb2tlbigwKSk7DQotICB9DQotICANCi0gIHB1YmxpYyBzdGF0aWMgSlNQRUxQYXJzZXIgY3JlYXRlUGFyc2VyKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsNCi0gICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsNCi0gICAgICAgICAgcmV0dXJuIG5ldyBKU1BFTFBhcnNlcihyZWFkZXIpOw0KLSAgfQ0KLSAgDQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5sYW5nLlN0cmluZyBpbnB1dCkgew0KLSAgICAgICAgICAgamF2YS5pby5TdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKGlucHV0KTsNCi0gICAgICAgICAgIFJlSW5pdChyZWFkZXIpOw0KLSAgfQ0KLSAgDQotfQ0KLQ0KLVBBUlNFUl9FTkQoSlNQRUxQYXJzZXIpDQotDQotU0tJUCA6DQotew0KLSAgIiAiDQotfCAiXHQiDQotfCAiXG4iDQotfCAiXHIiDQotfQ0KLQ0KLVRPS0VOIDoNCi17DQotLyogTGl0ZXJhbHMgKi8NCi0gIDwgSU5URUdFUl9MSVRFUkFMOiBbIjAiLSI5Il0gKFsiMCItIjkiXSkqID4NCi18DQotICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6DQotICAgICAgICAoWyIwIi0iOSJdKSsgIi4iIChbIjAiLSI5Il0pKiAoPEVYUE9ORU5UPik/DQotICAgICAgfCAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8NCi0gICAgICB8IChbIjAiLSI5Il0pKyA8RVhQT05FTlQ+DQotICA+DQotfA0KLSAgPCAjRVhQT05FTlQ6IFsiZSIsIkUiXSAoWyIrIiwiLSJdKT8gKFsiMCItIjkiXSkrID4NCi18DQotICA8IFNUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICgoflsiXCIiLCJcXCJdKSB8ICgiXFwiICggWyJcXCIsIlwiIl0gKSkpKiAiXCIiKSB8DQotICAgICAgKCJcJyIgKCh+WyJcJyIsIlxcIl0pIHwgKCJcXCIgKCBbIlxcIiwiXCciXSApKSkqICJcJyIpDQotICA+DQotfA0KLSAgPCBCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMOg0KLSAgICAgICgiXCIiICh+WyJcIiIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCIiXSApKSkgfA0KLSAgICAgICgiXCciICh+WyJcJyIsIlxcIl0pKiAoIlxcIiAoIH5bIlxcIiwiXCciXSApKSkNCi0gID4NCi0NCi0vKiBSZXNlcnZlZCBXb3JkcyBhbmQgU3ltYm9scyAqLw0KLXwgPCBUUlVFOiAidHJ1ZSIgPg0KLXwgPCBGQUxTRTogImZhbHNlIiA+DQotfCA8IE5VTEw6ICJudWxsIiA+DQotfCA8IERPVDogIi4iID4NCi18IDwgR1QxOiAiPiIgPg0KLXwgPCBHVDI6ICJndCIgPg0KLXwgPCBMVDE6ICI8IiA+DQotfCA8IExUMjogImx0IiA+DQotfCA8IEVRMTogIj09IiA+DQotfCA8IEVRMjogImVxIiA+DQotfCA8IExFMTogIjw9IiA+DQotfCA8IExFMjogImxlIiA+DQotfCA8IEdFMTogIj49IiA+DQotfCA8IEdFMjogImdlIiA+DQotfCA8IE5FUTE6ICIhPSIgPg0KLXwgPCBORVEyOiAibmUiID4NCi18IDwgTFBBUkVOOiAiKCIgPg0KLXwgPCBSUEFSRU46ICIpIiA+DQotfCA8IENPTU1BOiAiLCIgPg0KLXwgPCBDT0xPTjogIjoiID4NCi18IDwgTEJSQUNLRVQ6ICJbIiA+DQotfCA8IFJCUkFDS0VUOiAiXSIgPg0KLXwgPCBQTFVTOiAiKyIgPg0KLXwgPCBNSU5VUzogIi0iID4NCi18IDwgTVVMVElQTFk6ICIqIiA+DQotfCA8IERJVklERTE6ICIvIiA+DQotfCA8IERJVklERTI6ICJkaXYiID4NCi18IDwgTU9EVUxVUzE6ICIlIiA+DQotfCA8IE1PRFVMVVMyOiAibW9kIiA+DQotfCA8IE5PVDE6ICJub3QiID4NCi18IDwgTk9UMjogIiEiID4NCi18IDwgQU5EMTogImFuZCIgPg0KLXwgPCBBTkQyOiAiJiYiID4NCi18IDwgT1IxOiAib3IiID4NCi18IDwgT1IyOiAifHwiID4NCi18IDwgRU1QVFk6ICJlbXB0eSIgPg0KLXwgPCBDT05EOiAiPyIgPg0KLQ0KLS8qIElkZW50aWZpZXJzICovDQotDQotfCA8IElERU5USUZJRVI6ICg8TEVUVEVSPnw8SU1QTF9PQkpfU1RBUlQ+KSAoPExFVFRFUj58PERJR0lUPikqID4NCi18IDwgI0lNUExfT0JKX1NUQVJUOiAiIyIgPg0KLXwNCi0gIDwgI0xFVFRFUjoNCi0gICAgICBbDQotICAgICAgICJcdTAwMjQiLA0KLSAgICAgICAiXHUwMDQxIi0iXHUwMDVhIiwNCi0gICAgICAgIlx1MDA1ZiIsDQotICAgICAgICJcdTAwNjEiLSJcdTAwN2EiLA0KLSAgICAgICAiXHUwMGMwIi0iXHUwMGQ2IiwNCi0gICAgICAgIlx1MDBkOCItIlx1MDBmNiIsDQotICAgICAgICJcdTAwZjgiLSJcdTAwZmYiLA0KLSAgICAgICAiXHUwMTAwIi0iXHUxZmZmIiwNCi0gICAgICAgIlx1MzA0MCItIlx1MzE4ZiIsDQotICAgICAgICJcdTMzMDAiLSJcdTMzN2YiLA0KLSAgICAgICAiXHUzNDAwIi0iXHUzZDJkIiwNCi0gICAgICAgIlx1NGUwMCItIlx1OWZmZiIsDQotICAgICAgICJcdWY5MDAiLSJcdWZhZmYiDQotICAgICAgXQ0KLSAgPg0KLXwNCi0gIDwgI0RJR0lUOg0KLSAgICAgIFsNCi0gICAgICAgIlx1MDAzMCItIlx1MDAzOSIsDQotICAgICAgICJcdTA2NjAiLSJcdTA2NjkiLA0KLSAgICAgICAiXHUwNmYwIi0iXHUwNmY5IiwNCi0gICAgICAgIlx1MDk2NiItIlx1MDk2ZiIsDQotICAgICAgICJcdTA5ZTYiLSJcdTA5ZWYiLA0KLSAgICAgICAiXHUwYTY2Ii0iXHUwYTZmIiwNCi0gICAgICAgIlx1MGFlNiItIlx1MGFlZiIsDQotICAgICAgICJcdTBiNjYiLSJcdTBiNmYiLA0KLSAgICAgICAiXHUwYmU3Ii0iXHUwYmVmIiwNCi0gICAgICAgIlx1MGM2NiItIlx1MGM2ZiIsDQotICAgICAgICJcdTBjZTYiLSJcdTBjZWYiLA0KLSAgICAgICAiXHUwZDY2Ii0iXHUwZDZmIiwNCi0gICAgICAgIlx1MGU1MCItIlx1MGU1OSIsDQotICAgICAgICJcdTBlZDAiLSJcdTBlZDkiLA0KLSAgICAgICAiXHUxMDQwIi0iXHUxMDQ5Ig0KLSAgICAgIF0NCi0gID4NCi19DQotDQotQVNURXhwcmVzc2lvbiBFeHByZXNzaW9uKCkgOiB7fQ0KLXsNCi0gICAgICAgIChMT09LQUhFQUQoIj8iKSBDaG9pY2VFeHByZXNzaW9uKCkgfCBPckV4cHJlc3Npb24oKSkgeyByZXR1cm4gamp0VGhpczsgfQ0KLX0NCi0NCi12b2lkIE9yRXhwcmVzc2lvbigpICNPckV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgQW5kRXhwcmVzc2lvbigpICgodCA9IDxPUjE+IHwgdCA9IDxPUjI+KSB7IGpqdFRoaXMuYWRkT3BlcmF0b3JUb2tlbih0KTsgfQ0KLSAgICAgICAgQW5kRXhwcmVzc2lvbigpKSoNCi19DQotDQotdm9pZCBBbmRFeHByZXNzaW9uKCkgI0FuZEV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKCh0ID0gPEFORDE+IHwgdCA9IDxBTkQyPikgeyBqanRUaGlzLmFkZE9wZXJhdG9yVG9rZW4odCk7IH0NCi0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpKSogICAgICAgIA0KLX0NCi0NCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpICNFcXVhbGl0eUV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSANCi0gICAgICAgICgodCA9IDxFUTE+IHwgdCA9IDxFUTI+IHwgdCA9IDxORVExPiB8IHQgPSA8TkVRMj4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpKSoNCi19DQotDQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+MSkgOg0KLXsNCi0gICAgICAgIFRva2VuIHQ7DQotfQ0KLXsNCi0gICAgICAgIEFkZEV4cHJlc3Npb24oKSANCi0gICAgICAgICgNCi0gICAgICAgICAgICAgICAgKHQgPSA8TFQxPiB8IHQgPSA8TFQyPiB8IHQgPSA8R1QxPiB8IHQgPSA8R1QyPiB8IHQgPSA8R0UxPiB8IHQgPSA8R0UyPiB8IHQgPSA8TEUxPiB8IHQgPSA8TEUyPikgIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICAgICAgICAgIEFkZEV4cHJlc3Npb24oKQ0KLSAgICAgICAgKSoNCi19DQotDQotdm9pZCBBZGRFeHByZXNzaW9uKCkgI0FkZEV4cHJlc3Npb24oPjEpIDogDQotew0KLSAgICAgICAgVG9rZW4gdDsNCi19DQotew0KLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCkgKCh0ID0gPFBMVVM+IHwgdCA9IDxNSU5VUz4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICBNdWx0aXBseUV4cHJlc3Npb24oKSkqDQotfQ0KLQ0KLXZvaWQgTXVsdGlwbHlFeHByZXNzaW9uKCkgI011bHRpcGx5RXhwcmVzc2lvbig+MSkgOiANCi17DQotICAgICAgICBUb2tlbiB0Ow0KLX0NCi17DQotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAoDQotICAgICAgICAgICAgICAgICggdCA9IDxNVUxUSVBMWT4gfCB0ID0gPERJVklERTE+IHwgdCA9IDxESVZJREUyPiB8IHQgPSA8TU9EVUxVUzE+IHwgdCA9IDxNT0RVTFVTMj4pIHsgamp0VGhpcy5hZGRPcGVyYXRvclRva2VuKHQpOyB9DQotICAgICAgICAgICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpICAgICAgICANCi0gICAgICAgICkqDQotfQ0KLQ0KLXZvaWQgQ2hvaWNlRXhwcmVzc2lvbigpIDoge30NCi17DQotICAgICAgICBPckV4cHJlc3Npb24oKSA8Q09ORD4gT3JFeHByZXNzaW9uKCkgPENPTE9OPiBPckV4cHJlc3Npb24oKQ0KLX0NCi0NCi12b2lkIFVuYXJ5RXhwcmVzc2lvbigpIDoge30NCi17DQotICAgICAgICAoKDxOT1QxPiB8IDxOT1QyPiB8IDxNSU5VUz4gfCA8RU1QVFk+KSBVbmFyeUV4cHJlc3Npb24oKSkNCi0gICAgICAgIHwgVmFsdWUoKQ0KLSAgICAgICAgDQotfQ0KLQ0KLXZvaWQgVmFsdWUoKSA6IHt9DQotew0KLSAgICAgICAgVmFsdWVQcmVmaXgoKSAoVmFsdWVTdWZmaXgoKSkqDQotfQ0KLQ0KLXZvaWQgVmFsdWVQcmVmaXgoKSA6IHt9DQotew0KLSAgICBMaXRlcmFsKCkgfCAoPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+KSB8IExPT0tBSEVBRCgzKSBGdW5jdGlvbkludm9jYXRpb24oKSB8IDxJREVOVElGSUVSPiANCi19DQotDQotdm9pZCBWYWx1ZVN1ZmZpeCgpIDogDQotew0KLSAgICAgICAgVG9rZW4gdCA9IG51bGw7DQotfQ0KLXsNCi0gICAgICAgICg8RE9UPiAodCA9IDxJREVOVElGSUVSPik/KSB7IGpqdFRoaXMuc2V0UHJvcGVydHlOYW1lVG9rZW4odCk7IH0NCi0gICAgICAgIHwgKDxMQlJBQ0tFVD4gRXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4pDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25JbnZvY2F0aW9uKCkgOiANCi17DQotICAgICAgICBUb2tlbiBwcmVmaXggPSBudWxsLCBuYW1lID0gbnVsbDsNCi19DQotew0KLSAgICAocHJlZml4ID0gPElERU5USUZJRVI+IDxDT0xPTj4pIHsgamp0VGhpcy5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6Iik7IH0NCi0gICAgICAgIChuYW1lID0gPElERU5USUZJRVI+KT8gew0KLSAgICAgICAgICAgIGlmKG51bGwgIT0gcHJlZml4ICYmIG51bGwgIT0gbmFtZSkNCi0gICAgICAgICAgICAgICAgICAgIGpqdFRoaXMuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIgKyAobnVsbCA9PSBuYW1lID8gIiIgOiBuYW1lLmltYWdlKSk7DQotICAgICAgICAgICAgZWxzZSBpZihudWxsICE9IG5hbWUpDQotICAgICAgICAgICAgICAgICAgICBqanRUaGlzLnNldEZ1bGxGdW5jdGlvbk5hbWUobmFtZS5pbWFnZSk7DQotICAgICAgICB9DQotICAgICAgICAoPExQQVJFTj4gRXhwcmVzc2lvbigpICg8Q09NTUE+IEV4cHJlc3Npb24oKSkqIHRyeSAgeyAoPFJQQVJFTj4pIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7fSApPw0KLX0NCi0NCi12b2lkIExpdGVyYWwoKSA6IHt9DQotew0KLSAgICAgICAgPFRSVUU+IHwgPEZBTFNFPiB8IDxJTlRFR0VSX0xJVEVSQUw+IHwgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IHwgPFNUUklOR19MSVRFUkFMPiB8IDxOVUxMPg0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzAxYmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWUmSmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUEVMUGFyc2VyLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTFBhcnNlci8qQGJnZW4oamp0cmVlKSovaW1wbGVtZW50cyBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMsIEpTUEVMUGFyc2VyQ29uc3RhbnRzIHsvKkBiZ2VuKGpqdHJlZSkqLwotICBwcm90ZWN0ZWQgSkpUSlNQRUxQYXJzZXJTdGF0ZSBqanRyZWUgPSBuZXcgSkpUSlNQRUxQYXJzZXJTdGF0ZSgpOwotICB2b2lkIGpqdHJlZU9wZW5Ob2RlU2NvcGUoTm9kZSBuKQotICB7Ci0gICAgICAgICAgKChTaW1wbGVOb2RlKW4pLnNldEZpcnN0VG9rZW4oZ2V0VG9rZW4oMSkpOwotICB9Ci0KLSAgdm9pZCBqanRyZWVDbG9zZU5vZGVTY29wZShOb2RlIG4pCi0gIHsKLSAgICAoKFNpbXBsZU5vZGUpbikuc2V0TGFzdFRva2VuKGdldFRva2VuKDApKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgSlNQRUxQYXJzZXIgY3JlYXRlUGFyc2VyKGphdmEubGFuZy5TdHJpbmcgaW5wdXQpIHsKLSAgICAgICAgICBqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoaW5wdXQpOwotICAgICAgICAgIHJldHVybiBuZXcgSlNQRUxQYXJzZXIocmVhZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmxhbmcuU3RyaW5nIGlucHV0KSB7Ci0gICAgICAgICAgIGphdmEuaW8uU3RyaW5nUmVhZGVyIHJlYWRlciA9IG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcihpbnB1dCk7Ci0gICAgICAgICAgIFJlSW5pdChyZWFkZXIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEFTVEV4cHJlc3Npb24gRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvbiAqLwotICBBU1RFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXhwcmVzc2lvbihKSlRFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzEoMjE0NzQ4MzY0NykpIHsKLSAgICAgICAgQ2hvaWNlRXhwcmVzc2lvbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgSU5URUdFUl9MSVRFUkFMOgotICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgY2FzZSBOT1QxOgotICAgICAgICBjYXNlIE5PVDI6Ci0gICAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBPckV4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSByZXR1cm4gamp0bjAwMDt9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBPckV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjT3JFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNUT3JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUT3JFeHByZXNzaW9uKEpKVE9SRVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIEFuZEV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzE6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBPUjE6Ci0gICAgICAgIGNhc2UgT1IyOgotICAgICAgICAgIAotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIE9SMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihPUjEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9SMjoKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihPUjIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsyXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBBbmRFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQW5kRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNBbmRFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNUQW5kRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFuZEV4cHJlc3Npb24oSkpUQU5ERVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEFORDE6Ci0gICAgICAgIGNhc2UgQU5EMjoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbM10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBBTkQxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEFORDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFORDI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oQU5EMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzRdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5hZGRPcGVyYXRvclRva2VuKHQpOwotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSAjRXF1YWxpdHlFeHByZXNzaW9uKD4gMSkgKi8KLSAgICAgICAgQVNURXF1YWxpdHlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uKEpKVEVRVUFMSVRZRVhQUkVTU0lPTik7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQ7Ci0gICAgdHJ5IHsKLSAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8zOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRVExOgotICAgICAgICBjYXNlIEVRMjoKLSAgICAgICAgY2FzZSBORVExOgotICAgICAgICBjYXNlIE5FUTI6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzVdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzM7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRVExOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEVRMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRVEyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEVRMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTkVRMToKLSAgICAgICAgICB0ID0gampfY29uc3VtZV90b2tlbihORVExKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBORVEyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE5FUTIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs2XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpICNSZWxhdGlvbmFsRXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oSkpUUkVMQVRJT05BTEVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBBZGRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF80OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgR1QxOgotICAgICAgICBjYXNlIEdUMjoKLSAgICAgICAgY2FzZSBMVDE6Ci0gICAgICAgIGNhc2UgTFQyOgotICAgICAgICBjYXNlIExFMToKLSAgICAgICAgY2FzZSBMRTI6Ci0gICAgICAgIGNhc2UgR0UxOgotICAgICAgICBjYXNlIEdFMjoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbN10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNDsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBMVDE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTFQxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVDI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTFQyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHVDE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oR1QxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHVDI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oR1QyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHRTE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oR0UxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHRTI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oR0UyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMRTE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTEUxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMRTI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTEUyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbOF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIEFkZEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCBqanRyZWUubm9kZUFyaXR5KCkgPiAxKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBZGRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI0FkZEV4cHJlc3Npb24oPiAxKSAqLwotICAgICAgICBBU1RBZGRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQWRkRXhwcmVzc2lvbihKSlRBRERFWFBSRVNTSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gdDsKLSAgICB0cnkgewotICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF81OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbOV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKFBMVVMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE1JTlVTKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTBdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuYWRkT3BlcmF0b3JUb2tlbih0KTsKLSAgICAgICAgTXVsdGlwbHlFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgamp0cmVlLm5vZGVBcml0eSgpID4gMSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTXVsdGlwbHlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgI011bHRpcGx5RXhwcmVzc2lvbig+IDEpICovCi0gICAgICAgIEFTVE11bHRpcGx5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE11bHRpcGx5RXhwcmVzc2lvbihKSlRNVUxUSVBMWUVYUFJFU1NJT04pOwotICAgICAgICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICAgICAgICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTtUb2tlbiB0OwotICAgIHRyeSB7Ci0gICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzY6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBNVUxUSVBMWToKLSAgICAgICAgY2FzZSBESVZJREUxOgotICAgICAgICBjYXNlIERJVklERTI6Ci0gICAgICAgIGNhc2UgTU9EVUxVUzE6Ci0gICAgICAgIGNhc2UgTU9EVUxVUzI6Ci0gICAgICAgICAgCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzExXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF82OwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIE1VTFRJUExZOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE1VTFRJUExZKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBESVZJREUxOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKERJVklERTEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERJVklERTI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oRElWSURFMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTU9EVUxVUzE6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oTU9EVUxVUzEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1PRFVMVVMyOgotICAgICAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKE1PRFVMVVMyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTJdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRuMDAwLmFkZE9wZXJhdG9yVG9rZW4odCk7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIGpqdHJlZS5ub2RlQXJpdHkoKSA+IDEpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENob2ljZUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIENob2ljZUV4cHJlc3Npb24gKi8KLSAgQVNUQ2hvaWNlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVENob2ljZUV4cHJlc3Npb24oSkpUQ0hPSUNFRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBPckV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09ORCk7Ci0gICAgICBPckV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgT3JFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVW5hcnlFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIFVuYXJ5RXhwcmVzc2lvbiAqLwotICBBU1RVbmFyeUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RVbmFyeUV4cHJlc3Npb24oSkpUVU5BUllFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBNSU5VUzoKLSAgICAgIGNhc2UgTk9UMToKLSAgICAgIGNhc2UgTk9UMjoKLSAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIE5PVDE6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihOT1QxKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBOT1QyOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UMik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihNSU5VUyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU1QVFk6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihFTVBUWSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEzXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFZhbHVlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzE0XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhbHVlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgVmFsdWUgKi8KLSAgQVNUVmFsdWUgamp0bjAwMCA9IG5ldyBBU1RWYWx1ZShKSlRWQUxVRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBWYWx1ZVByZWZpeCgpOwotICAgICAgbGFiZWxfNzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIERPVDoKLSAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgICAKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTVdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzc7Ci0gICAgICAgIH0KLSAgICAgICAgVmFsdWVTdWZmaXgoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYWx1ZVByZWZpeCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgICAgICAgLypAYmdlbihqanRyZWUpIFZhbHVlUHJlZml4ICovCi0gIEFTVFZhbHVlUHJlZml4IGpqdG4wMDAgPSBuZXcgQVNUVmFsdWVQcmVmaXgoSkpUVkFMVUVQUkVGSVgpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIElOVEVHRVJfTElURVJBTDoKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgICBMaXRlcmFsKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgRXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzE2XSA9IGpqX2dlbjsKLSAgICAgICAgaWYgKGpqXzJfMigzKSkgewotICAgICAgICAgIEZ1bmN0aW9uSW52b2NhdGlvbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzE3XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgfQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgIGpqdHJlZUNsb3NlTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhbHVlU3VmZml4KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFsdWVTdWZmaXggKi8KLSAgICAgICAgQVNUVmFsdWVTdWZmaXggamp0bjAwMCA9IG5ldyBBU1RWYWx1ZVN1ZmZpeChKSlRWQUxVRVNVRkZJWCk7Ci0gICAgICAgIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICBqanRyZWVPcGVuTm9kZVNjb3BlKGpqdG4wMDApO1Rva2VuIHQgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRE9UOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERPVCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE4XSA9IGpqX2dlbjsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0UHJvcGVydHlOYW1lVG9rZW4odCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7Ci0gICAgICAgIEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0tFVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzE5XSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgamp0cmVlQ2xvc2VOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bmN0aW9uSW52b2NhdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bmN0aW9uSW52b2NhdGlvbiAqLwotICAgICAgICBBU1RGdW5jdGlvbkludm9jYXRpb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkludm9jYXRpb24oSkpURlVOQ1RJT05JTlZPQ0FUSU9OKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdHJlZU9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gcHJlZml4ID0gbnVsbCwgbmFtZSA9IG51bGw7Ci0gICAgdHJ5IHsKLSAgICAgIHByZWZpeCA9IGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKHByZWZpeC5pbWFnZSArICI6Iik7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgbmFtZSA9IGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJRklFUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzIwXSA9IGpqX2dlbjsKLSAgICAgICAgCi0gICAgICB9Ci0gICAgICAgICAgICBpZihudWxsICE9IHByZWZpeCAmJiBudWxsICE9IG5hbWUpCi0gICAgICAgICAgICAgICAgICAgIGpqdG4wMDAuc2V0RnVsbEZ1bmN0aW9uTmFtZShwcmVmaXguaW1hZ2UgKyAiOiIgKyAobnVsbCA9PSBuYW1lID8gIiIgOiBuYW1lLmltYWdlKSk7Ci0gICAgICAgICAgICBlbHNlIGlmKG51bGwgIT0gbmFtZSkKLSAgICAgICAgICAgICAgICAgICAgamp0bjAwMC5zZXRGdWxsRnVuY3Rpb25OYW1lKG5hbWUuaW1hZ2UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBFeHByZXNzaW9uKCk7Ci0gICAgICAgIGxhYmVsXzg6Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsyMV0gPSBqal9nZW47Ci0gICAgICAgICAgICBicmVhayBsYWJlbF84OwotICAgICAgICAgIH0KLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgICBFeHByZXNzaW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyMl0gPSBqal9nZW47Ci0gICAgICAgIAotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICB9Ci0gICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICB9Ci0gICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBMaXRlcmFsKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBMaXRlcmFsICovCi0gIEFTVExpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsKEpKVExJVEVSQUwpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgamp0cmVlT3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFJVRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGQUxTRSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJTlRFR0VSX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5URUdFUl9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOVUxMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5VTEwpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyM10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICBqanRyZWVDbG9zZU5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgwLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDEsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJREVOVElGSUVSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0NykpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTAoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yKCkgewotICAgIGlmIChqal8zUl85KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09ORCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBKU1BFTFBhcnNlclRva2VuTWFuYWdlciB0b2tlbl9zb3VyY2U7Ci0gIFNpbXBsZUNoYXJTdHJlYW0gampfaW5wdXRfc3RyZWFtOwotICBwdWJsaWMgVG9rZW4gdG9rZW4sIGpqX250OwotICBwcml2YXRlIGludCBqal9udGs7Ci0gIHByaXZhdGUgVG9rZW4gampfc2NhbnBvcywgampfbGFzdHBvczsKLSAgcHJpdmF0ZSBpbnQgampfbGE7Ci0gIHB1YmxpYyBib29sZWFuIGxvb2tpbmdBaGVhZCA9IGZhbHNlOwotLy8gIHByaXZhdGUgYm9vbGVhbiBqal9zZW1MQTsKLSAgcHJpdmF0ZSBpbnQgampfZ2VuOwotICBmaW5hbCBwcml2YXRlIGludFtdIGpqX2xhMSA9IG5ldyBpbnRbMjRdOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMDsKLSAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzE7Ci0gIHN0YXRpYyB7Ci0gICAgICBqal9sYTFfMCgpOwotICAgICAgampfbGExXzEoKTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzAoKSB7Ci0gICAgICBqal9sYTFfMCA9IG5ldyBpbnRbXSB7MHg0MDAxZDYwLDB4MCwweDAsMHgwLDB4MCwweDMwYzAwMDAsMHgzMGMwMDAwLDB4ZjNjMDAwLDB4ZjNjMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0MDAxZDYwLDB4NDAwMDIwMDAsMHg0MDAxZDYwLDB4MCwweDAsMHg0MDAwMjAwMCwweDAsMHgxMDAwMDAwMCwweDQwMDAwMDAsMHgxZDYwLH07Ci0gICB9Ci0gICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8xKCkgewotICAgICAgampfbGExXzEgPSBuZXcgaW50W10gezB4YTE4MiwweDE4MDAsMHgxODAwLDB4NjAwLDB4NjAwLDB4MCwweDAsMHgwLDB4MCwweDMsMHgzLDB4N2MsMHg3YywweDIxODIsMHhhMTgyLDB4MCwweDAsMHg4MDAwLDB4ODAwMCwweDAsMHg4MDAwLDB4MCwweDAsMHgwLH07Ci0gICB9Ci0gIGZpbmFsIHByaXZhdGUgSkpDYWxsc1tdIGpqXzJfcnRucyA9IG5ldyBKSkNhbGxzWzJdOwotICBwcml2YXRlIGJvb2xlYW4gampfcmVzY2FuID0gZmFsc2U7Ci0gIHByaXZhdGUgaW50IGpqX2djID0gMDsKLQotICBwdWJsaWMgSlNQRUxQYXJzZXIoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBKU1BFTFBhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqdHJlZS5yZXNldCgpOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyBKU1BFTFBhcnNlcihqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBKU1BFTFBhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqanRyZWUucmVzZXQoKTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgSlNQRUxQYXJzZXIoSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIgdG0pIHsKLSAgICB0b2tlbl9zb3VyY2UgPSB0bTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNDsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChKU1BFTFBhcnNlclRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgamp0cmVlLnJlc2V0KCk7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBUb2tlbiBqal9jb25zdW1lX3Rva2VuKGludCBraW5kKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFRva2VuIG9sZFRva2VuOwotICAgIGlmICgob2xkVG9rZW4gPSB0b2tlbikubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgaWYgKHRva2VuLmtpbmQgPT0ga2luZCkgewotICAgICAgampfZ2VuKys7Ci0gICAgICBpZiAoKytqal9nYyA+IDEwMCkgewotICAgICAgICBqal9nYyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgSkpDYWxscyBjID0gampfMl9ydG5zW2ldOwotICAgICAgICAgIHdoaWxlIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjLmdlbiA8IGpqX2dlbikgYy5maXJzdCA9IG51bGw7Ci0gICAgICAgICAgICBjID0gYy5uZXh0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLSAgICB0b2tlbiA9IG9sZFRva2VuOwotICAgIGpqX2tpbmQgPSBraW5kOwotICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IgeyAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsgCi0gIH0KLSAgZmluYWwgcHJpdmF0ZSBMb29rYWhlYWRTdWNjZXNzIGpqX2xzID0gbmV3IExvb2thaGVhZFN1Y2Nlc3MoKTsKLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqX3NjYW5fdG9rZW4oaW50IGtpbmQpIHsKLSAgICBpZiAoampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB7Ci0gICAgICBqal9sYS0tOwotICAgICAgaWYgKGpqX3NjYW5wb3MubmV4dCA9PSBudWxsKSB7Ci0gICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7Ci0gICAgfQotICAgIGlmIChqal9yZXNjYW4pIHsKLSAgICAgIGludCBpID0gMDsgVG9rZW4gdG9rID0gdG9rZW47Ci0gICAgICB3aGlsZSAodG9rICE9IG51bGwgJiYgdG9rICE9IGpqX3NjYW5wb3MpIHsgaSsrOyB0b2sgPSB0b2submV4dDsgfQotICAgICAgaWYgKHRvayAhPSBudWxsKSBqal9hZGRfZXJyb3JfdG9rZW4oa2luZCwgaSk7Ci0gICAgfQotICAgIGlmIChqal9zY2FucG9zLmtpbmQgIT0ga2luZCkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX2xhID09IDAgJiYgampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB0aHJvdyBqal9sczsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgewotICAgIGlmICh0b2tlbi5uZXh0ICE9IG51bGwpIHRva2VuID0gdG9rZW4ubmV4dDsKLSAgICBlbHNlIHRva2VuID0gdG9rZW4ubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4rKzsKLSAgICByZXR1cm4gdG9rZW47Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgVG9rZW4gZ2V0VG9rZW4oaW50IGluZGV4KSB7Ci0gICAgVG9rZW4gdCA9IGxvb2tpbmdBaGVhZCA/IGpqX3NjYW5wb3MgOiB0b2tlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLSAgICAgIGlmICh0Lm5leHQgIT0gbnVsbCkgdCA9IHQubmV4dDsKLSAgICAgIGVsc2UgdCA9IHQubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHQ7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGludCBqal9udGsoKSB7Ci0gICAgaWYgKChqal9udD10b2tlbi5uZXh0KSA9PSBudWxsKQotICAgICAgcmV0dXJuIChqal9udGsgPSAodG9rZW4ubmV4dD10b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCkpLmtpbmQpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoampfbnRrID0gampfbnQua2luZCk7Ci0gIH0KLQotICBwcml2YXRlIGphdmEudXRpbC5WZWN0b3IgampfZXhwZW50cmllcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0gIHByaXZhdGUgaW50W10gampfZXhwZW50cnk7Ci0gIHByaXZhdGUgaW50IGpqX2tpbmQgPSAtMTsKLSAgcHJpdmF0ZSBpbnRbXSBqal9sYXN0dG9rZW5zID0gbmV3IGludFsxMDBdOwotICBwcml2YXRlIGludCBqal9lbmRwb3M7Ci0KLSAgcHJpdmF0ZSB2b2lkIGpqX2FkZF9lcnJvcl90b2tlbihpbnQga2luZCwgaW50IHBvcykgewotICAgIGlmIChwb3MgPj0gMTAwKSByZXR1cm47Ci0gICAgaWYgKHBvcyA9PSBqal9lbmRwb3MgKyAxKSB7Ci0gICAgICBqal9sYXN0dG9rZW5zW2pqX2VuZHBvcysrXSA9IGtpbmQ7Ci0gICAgfSBlbHNlIGlmIChqal9lbmRwb3MgIT0gMCkgewotICAgICAgampfZXhwZW50cnkgPSBuZXcgaW50W2pqX2VuZHBvc107Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2VuZHBvczsgaSsrKSB7Ci0gICAgICAgIGpqX2V4cGVudHJ5W2ldID0gampfbGFzdHRva2Vuc1tpXTsKLSAgICAgIH0KLSAgICAgIGJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0gICAgICBmb3IgKGphdmEudXRpbC5FbnVtZXJhdGlvbiBlID0gampfZXhwZW50cmllcy5lbGVtZW50cygpOyBlLmhhc01vcmVFbGVtZW50cygpOykgewotICAgICAgICBpbnRbXSBvbGRlbnRyeSA9IChpbnRbXSkoZS5uZXh0RWxlbWVudCgpKTsKLSAgICAgICAgaWYgKG9sZGVudHJ5Lmxlbmd0aCA9PSBqal9leHBlbnRyeS5sZW5ndGgpIHsKLSAgICAgICAgICBleGlzdHMgPSB0cnVlOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cnkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChvbGRlbnRyeVtpXSAhPSBqal9leHBlbnRyeVtpXSkgewotICAgICAgICAgICAgICBleGlzdHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChleGlzdHMpIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoIWV4aXN0cykgampfZXhwZW50cmllcy5hZGRFbGVtZW50KGpqX2V4cGVudHJ5KTsKLSAgICAgIGlmIChwb3MgIT0gMCkgampfbGFzdHRva2Vuc1soampfZW5kcG9zID0gcG9zKSAtIDFdID0ga2luZDsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpIHsKLSAgICBqal9leHBlbnRyaWVzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgYm9vbGVhbltdIGxhMXRva2VucyA9IG5ldyBib29sZWFuWzUxXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDUxOyBpKyspIHsKLSAgICAgIGxhMXRva2Vuc1tpXSA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAoampfa2luZCA+PSAwKSB7Ci0gICAgICBsYTF0b2tlbnNbampfa2luZF0gPSB0cnVlOwotICAgICAgampfa2luZCA9IC0xOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyBpKyspIHsKLSAgICAgIGlmIChqal9sYTFbaV0gPT0gampfZ2VuKSB7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7IGorKykgewotICAgICAgICAgIGlmICgoampfbGExXzBbaV0gJiAoMTw8aikpICE9IDApIHsKLSAgICAgICAgICAgIGxhMXRva2Vuc1tqXSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgoampfbGExXzFbaV0gJiAoMTw8aikpICE9IDApIHsKLSAgICAgICAgICAgIGxhMXRva2Vuc1szMitqXSA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTE7IGkrKykgewotICAgICAgaWYgKGxhMXRva2Vuc1tpXSkgewotICAgICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGpqX2V4cGVudHJ5WzBdID0gaTsKLSAgICAgICAgampfZXhwZW50cmllcy5hZGRFbGVtZW50KGpqX2V4cGVudHJ5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgampfZW5kcG9zID0gMDsKLSAgICBqal9yZXNjYW5fdG9rZW4oKTsKLSAgICBqal9hZGRfZXJyb3JfdG9rZW4oMCwgMCk7Ci0gICAgaW50W11bXSBleHB0b2tzZXEgPSBuZXcgaW50W2pqX2V4cGVudHJpZXMuc2l6ZSgpXVtdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cmllcy5zaXplKCk7IGkrKykgewotICAgICAgZXhwdG9rc2VxW2ldID0gKGludFtdKWpqX2V4cGVudHJpZXMuZWxlbWVudEF0KGkpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKHRva2VuLCBleHB0b2tzZXEsIHRva2VuSW1hZ2UpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgZW5hYmxlX3RyYWNpbmcoKSB7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBkaXNhYmxlX3RyYWNpbmcoKSB7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIHZvaWQgampfcmVzY2FuX3Rva2VuKCkgewotICAgIGpqX3Jlc2NhbiA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKLSAgICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpXTsKLSAgICAgIGRvIHsKLSAgICAgICAgaWYgKHAuZ2VuID4gampfZ2VuKSB7Ci0gICAgICAgICAgampfbGEgPSBwLmFyZzsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBwLmZpcnN0OwotICAgICAgICAgIHN3aXRjaCAoaSkgewotICAgICAgICAgICAgY2FzZSAwOiBqal8zXzEoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IGpqXzNfMigpOyBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IHAubmV4dDsKLSAgICAgIH0gd2hpbGUgKHAgIT0gbnVsbCk7Ci0gICAgfQotICAgIGpqX3Jlc2NhbiA9IGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSB2b2lkIGpqX3NhdmUoaW50IGluZGV4LCBpbnQgeGxhKSB7Ci0gICAgSkpDYWxscyBwID0gampfMl9ydG5zW2luZGV4XTsKLSAgICB3aGlsZSAocC5nZW4gPiBqal9nZW4pIHsKLSAgICAgIGlmIChwLm5leHQgPT0gbnVsbCkgeyBwID0gcC5uZXh0ID0gbmV3IEpKQ2FsbHMoKTsgYnJlYWs7IH0KLSAgICAgIHAgPSBwLm5leHQ7Ci0gICAgfQotICAgIHAuZ2VuID0gampfZ2VuICsgeGxhIC0gampfbGE7IHAuZmlyc3QgPSB0b2tlbjsgcC5hcmcgPSB4bGE7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgY2xhc3MgSkpDYWxscyB7Ci0gICAgaW50IGdlbjsKLSAgICBUb2tlbiBmaXJzdDsKLSAgICBpbnQgYXJnOwotICAgIEpKQ2FsbHMgbmV4dDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRlM2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZSZKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUxQYXJzZXJDb25zdGFudHMuamF2YSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGludGVyZmFjZSBKU1BFTFBhcnNlckNvbnN0YW50cyB7Ci0KLSAgaW50IEVPRiA9IDA7Ci0gIGludCBJTlRFR0VSX0xJVEVSQUwgPSA1OwotICBpbnQgRkxPQVRJTkdfUE9JTlRfTElURVJBTCA9IDY7Ci0gIGludCBFWFBPTkVOVCA9IDc7Ci0gIGludCBTVFJJTkdfTElURVJBTCA9IDg7Ci0gIGludCBCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMID0gOTsKLSAgaW50IFRSVUUgPSAxMDsKLSAgaW50IEZBTFNFID0gMTE7Ci0gIGludCBOVUxMID0gMTI7Ci0gIGludCBET1QgPSAxMzsKLSAgaW50IEdUMSA9IDE0OwotICBpbnQgR1QyID0gMTU7Ci0gIGludCBMVDEgPSAxNjsKLSAgaW50IExUMiA9IDE3OwotICBpbnQgRVExID0gMTg7Ci0gIGludCBFUTIgPSAxOTsKLSAgaW50IExFMSA9IDIwOwotICBpbnQgTEUyID0gMjE7Ci0gIGludCBHRTEgPSAyMjsKLSAgaW50IEdFMiA9IDIzOwotICBpbnQgTkVRMSA9IDI0OwotICBpbnQgTkVRMiA9IDI1OwotICBpbnQgTFBBUkVOID0gMjY7Ci0gIGludCBSUEFSRU4gPSAyNzsKLSAgaW50IENPTU1BID0gMjg7Ci0gIGludCBDT0xPTiA9IDI5OwotICBpbnQgTEJSQUNLRVQgPSAzMDsKLSAgaW50IFJCUkFDS0VUID0gMzE7Ci0gIGludCBQTFVTID0gMzI7Ci0gIGludCBNSU5VUyA9IDMzOwotICBpbnQgTVVMVElQTFkgPSAzNDsKLSAgaW50IERJVklERTEgPSAzNTsKLSAgaW50IERJVklERTIgPSAzNjsKLSAgaW50IE1PRFVMVVMxID0gMzc7Ci0gIGludCBNT0RVTFVTMiA9IDM4OwotICBpbnQgTk9UMSA9IDM5OwotICBpbnQgTk9UMiA9IDQwOwotICBpbnQgQU5EMSA9IDQxOwotICBpbnQgQU5EMiA9IDQyOwotICBpbnQgT1IxID0gNDM7Ci0gIGludCBPUjIgPSA0NDsKLSAgaW50IEVNUFRZID0gNDU7Ci0gIGludCBDT05EID0gNDY7Ci0gIGludCBJREVOVElGSUVSID0gNDc7Ci0gIGludCBJTVBMX09CSl9TVEFSVCA9IDQ4OwotICBpbnQgTEVUVEVSID0gNDk7Ci0gIGludCBESUdJVCA9IDUwOwotCi0gIGludCBERUZBVUxUID0gMDsKLQotICBTdHJpbmdbXSB0b2tlbkltYWdlID0gewotICAgICI8RU9GPiIsCi0gICAgIlwiIFwiIiwKLSAgICAiXCJcXHRcIiIsCi0gICAgIlwiXFxuXCIiLAotICAgICJcIlxcclwiIiwKLSAgICAiPElOVEVHRVJfTElURVJBTD4iLAotICAgICI8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4iLAotICAgICI8RVhQT05FTlQ+IiwKLSAgICAiPFNUUklOR19MSVRFUkFMPiIsCi0gICAgIjxCQURMWV9FU0NBUEVEX1NUUklOR19MSVRFUkFMPiIsCi0gICAgIlwidHJ1ZVwiIiwKLSAgICAiXCJmYWxzZVwiIiwKLSAgICAiXCJudWxsXCIiLAotICAgICJcIi5cIiIsCi0gICAgIlwiPlwiIiwKLSAgICAiXCJndFwiIiwKLSAgICAiXCI8XCIiLAotICAgICJcImx0XCIiLAotICAgICJcIj09XCIiLAotICAgICJcImVxXCIiLAotICAgICJcIjw9XCIiLAotICAgICJcImxlXCIiLAotICAgICJcIj49XCIiLAotICAgICJcImdlXCIiLAotICAgICJcIiE9XCIiLAotICAgICJcIm5lXCIiLAotICAgICJcIihcIiIsCi0gICAgIlwiKVwiIiwKLSAgICAiXCIsXCIiLAotICAgICJcIjpcIiIsCi0gICAgIlwiW1wiIiwKLSAgICAiXCJdXCIiLAotICAgICJcIitcIiIsCi0gICAgIlwiLVwiIiwKLSAgICAiXCIqXCIiLAotICAgICJcIi9cIiIsCi0gICAgIlwiZGl2XCIiLAotICAgICJcIiVcIiIsCi0gICAgIlwibW9kXCIiLAotICAgICJcIm5vdFwiIiwKLSAgICAiXCIhXCIiLAotICAgICJcImFuZFwiIiwKLSAgICAiXCImJlwiIiwKLSAgICAiXCJvclwiIiwKLSAgICAiXCJ8fFwiIiwKLSAgICAiXCJlbXB0eVwiIiwKLSAgICAiXCI/XCIiLAotICAgICI8SURFTlRJRklFUj4iLAotICAgICJcIiNcIiIsCi0gICAgIjxMRVRURVI+IiwKLSAgICAiPERJR0lUPiIsCi0gIH07Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMWU3MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIgaW1wbGVtZW50cyBKU1BFTFBhcnNlckNvbnN0YW50cwotewotICBwdWJsaWMgIGphdmEuaW8uUHJpbnRTdHJlYW0gZGVidWdTdHJlYW0gPSBTeXN0ZW0ub3V0OwotICBwdWJsaWMgIHZvaWQgc2V0RGVidWdTdHJlYW0oamF2YS5pby5QcmludFN0cmVhbSBkcykgeyBkZWJ1Z1N0cmVhbSA9IGRzOyB9Ci1wcml2YXRlIGZpbmFsIGludCBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoaW50IHBvcywgbG9uZyBhY3RpdmUwKQotewotICAgc3dpdGNoIChwb3MpCi0gICB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDJhZDAwMmFhOWMwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDQ3OwotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMmQwMDAwMDFjMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0NzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDJhYTgwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSAyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDFjMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0NzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7Ci0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MmQwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSAzOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDA4MDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0NzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7Ci0gICAgICAgICAgICByZXR1cm4gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTQwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDY7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIHJldHVybiAtMTsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgaW50IGpqU3RhcnROZmFfMChpbnQgcG9zLCBsb25nIGFjdGl2ZTApCi17Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKHBvcywgYWN0aXZlMCksIHBvcyArIDEpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wQXRQb3MoaW50IHBvcywgaW50IGtpbmQpCi17Ci0gICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKLSAgIHJldHVybiBwb3MgKyAxOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYVdpdGhTdGF0ZXNfMChpbnQgcG9zLCBpbnQga2luZCwgaW50IHN0YXRlKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gcG9zICsgMTsgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKHN0YXRlLCBwb3MgKyAxKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKQotewotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDMzOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDQwOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDAwTCk7Ci0gICAgICBjYXNlIDM3OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDM3KTsKLSAgICAgIGNhc2UgMzg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDQwOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI2KTsKLSAgICAgIGNhc2UgNDE6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjcpOwotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzNCk7Ci0gICAgICBjYXNlIDQzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDMyKTsKLSAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMjgpOwotICAgICAgY2FzZSA0NToKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzMyk7Ci0gICAgICBjYXNlIDQ2OgotICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMCwgMTMsIDEpOwotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCAzNSk7Ci0gICAgICBjYXNlIDU4OgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDI5KTsKLSAgICAgIGNhc2UgNjA6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTY7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMEwpOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDBMKTsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTQ7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMDAwMEwpOwotICAgICAgY2FzZSA2MzoKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA0Nik7Ci0gICAgICBjYXNlIDkxOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDMwKTsKLSAgICAgIGNhc2UgOTM6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgMzEpOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDAwMDgwMDAwTCk7Ci0gICAgICBjYXNlIDEwMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwMzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODA4MDAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjIwMDAwTCk7Ci0gICAgICBjYXNlIDEwOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDIwMDEwMDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDQwMEwpOwotICAgICAgY2FzZSAxMjQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMDAwMDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoMCwgMCk7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCkKLXsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMCwgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gMTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAzODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0Mik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTgpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDIwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg0MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAyMik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDI0KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAyMSwgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAyMywgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMjUsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4YzAwMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTM6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAxOSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgNDMsIDYpOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCAxNSwgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDE3LCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDBMKTsKLSAgICAgIGNhc2UgMTI0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA0NCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDAsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBvbGQwKTsgCi0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDEsIGFjdGl2ZTApOwotICAgICAgcmV0dXJuIDI7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAzOCwgNik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDQxLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDE4MDBMKTsKLSAgICAgIGNhc2UgMTEyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAzOSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg0MDBMKTsKLSAgICAgIGNhc2UgMTE4OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAzNiwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDEsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBvbGQwKTsgCi0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDIsIGFjdGl2ZTApOwotICAgICAgcmV0dXJuIDM7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDEwLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDEyLCA2KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMiwgYWN0aXZlMCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDIsIG9sZDApOyAKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoMywgYWN0aXZlMCk7Ci0gICAgICByZXR1cm4gNDsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMTEsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEyMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCA0NSwgNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDMsIGFjdGl2ZTApOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkKGludCBzdGF0ZSkKLXsKLSAgIGlmIChqanJvdW5kc1tzdGF0ZV0gIT0gampyb3VuZCkKLSAgIHsKLSAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IHN0YXRlOwotICAgICAgampyb3VuZHNbc3RhdGVdID0gampyb3VuZDsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICBkbyB7Ci0gICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBqam5leHRTdGF0ZXNbc3RhcnRdOwotICAgfSB3aGlsZSAoc3RhcnQrKyAhPSBlbmQpOwotfQotcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKGludCBzdGF0ZTEsIGludCBzdGF0ZTIpCi17Ci0gICBqakNoZWNrTkFkZChzdGF0ZTEpOwotICAgampDaGVja05BZGQoc3RhdGUyKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFN0YXRlcyhpbnQgc3RhcnQsIGludCBlbmQpCi17Ci0gICBkbyB7Ci0gICAgICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKLSAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKLX0KLS8vcHJpdmF0ZSBmaW5hbCB2b2lkIGpqQ2hlY2tOQWRkU3RhdGVzKGludCBzdGFydCkKLS8vewotLy8gICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnRdKTsKLS8vICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0ICsgMV0pOwotLy99Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMCA9IHsKLSAgIDB4MWZmMDAwMDBmZmZmZmZmZUwsIDB4ZmZmZmZmZmZmZmZmYzAwMEwsIDB4ZmZmZmZmZmZMLCAweDYwMDAwMDAwMDAwMDAwMEwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMiA9IHsKLSAgIDB4MEwsIDB4MEwsIDB4MEwsIDB4ZmY3ZmZmZmZmZjdmZmZmZkwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMyA9IHsKLSAgIDB4MEwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNCA9IHsKLSAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZkwsIDB4MEwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNSA9IHsKLSAgIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4MEwsIDB4MEwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjNiA9IHsKLSAgIDB4M2ZmZmZmZmZmZmZmTCwgMHgwTCwgMHgwTCwgMHgwTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM3ID0gewotICAgMHhmZmZmZmZmZmZmZmZmZmZlTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gampiaXRWZWM4ID0gewotICAgMHgwTCwgMHgwTCwgMHhmZmZmZmZmZmZmZmZmZmZmTCwgMHhmZmZmZmZmZmZmZmZmZmZmTAotfTsKLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZU5mYV8wKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKQotewotICAgaW50IHN0YXJ0c0F0ID0gMDsKLSAgIGpqbmV3U3RhdGVDbnQgPSAzNTsKLSAgIGludCBpID0gMTsKLSAgIGpqc3RhdGVTZXRbMF0gPSBzdGFydFN0YXRlOwotICAgaW50IGtpbmQgPSAweDdmZmZmZmZmOwotICAgZm9yICg7OykKLSAgIHsKLSAgICAgIGlmICgrK2pqcm91bmQgPT0gMHg3ZmZmZmZmZikKLSAgICAgICAgIFJlSW5pdFJvdW5kcygpOwotICAgICAgaWYgKGN1ckNoYXIgPCA2NCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IGN1ckNoYXI7Ci0gICAgICAgIC8vIE1hdGNoTG9vcDogCi0gICAgICAgIAkgZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA1KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDU7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygwLCA0KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgweDE4MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNSwgOSk7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM0KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTAsIDE0KTsKLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxLCAyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTgwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA0NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA0NzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAxMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg5LCAxMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSA0NikKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMSwgMTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMSwgMTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDE1LCAxNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzNCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwLCAxNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmJmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzNCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzNCAmJiBraW5kID4gOCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA4OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygyNCwgMjUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmZmZmZMICYgbCkgIT0gMEwgJiYga2luZCA+IDkpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDM5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNSwgOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmN2ZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzE6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSAmJiBraW5kID4gOCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA4OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzMiwgMzMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmZmZmZMICYgbCkgIT0gMEwgJiYga2luZCA+IDkpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPCAxMjgpCi0gICAgICB7Ci0gICAgICAgICBsb25nIGwgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICAvL01hdGNoTG9vcDogCi0gICAgICAgIAkgZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2ZmZmZmZTg3ZmZmZmZlTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjEsIDIyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjMsIDI0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjUsIDI2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTUsIDE3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE1LCAxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDI3LCAyOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMICYmIGtpbmQgPiA5KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDMwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxOCwgMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyOSwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzNDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBoaUJ5dGUgPSBjdXJDaGFyID4+IDg7Ci0gICAgICAgICBpbnQgaTEgPSBoaUJ5dGUgPj4gNjsKLSAgICAgICAgIGxvbmcgbDEgPSAxTCA8PCAoaGlCeXRlICYgMDc3KTsKLSAgICAgICAgIGludCBpMiA9IChjdXJDaGFyICYgMHhmZikgPj4gNjsKLSAgICAgICAgIGxvbmcgbDIgPSAxTCA8PCAoY3VyQ2hhciAmIDA3Nyk7Ci0gICAgICAgICAvL01hdGNoTG9vcDogCi0gICAgICAgIAkgZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoIWpqQ2FuTW92ZV8wKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDQ3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDQ3OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygxNSwgMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI0OgotICAgICAgICAgICAgICAgICAgaWYgKGpqQ2FuTW92ZV8xKGhpQnl0ZSwgaTEsIGkyLCBsMSwgbDIpKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjcsIDI4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikgJiYga2luZCA+IDkpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyODoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMShoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDE4LCAyMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzEoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyOSwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgICAgIHsKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOwotICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICB9Ci0gICAgICArK2N1clBvczsKLSAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDM1IC0gKGpqbmV3U3RhdGVDbnQgPSBzdGFydHNBdCkpKQotICAgICAgICAgcmV0dXJuIGN1clBvczsKLSAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBjdXJQb3M7IH0KLSAgIH0KLX0KLXN0YXRpYyBmaW5hbCBpbnRbXSBqam5leHRTdGF0ZXMgPSB7Ci0gICA4LCA5LCAxMCwgMTUsIDE2LCAyOCwgMjksIDMxLCAzMiwgMzMsIDIwLCAyMSwgMjMsIDI0LCAyNSwgMjAsIAotICAgMjEsIDIzLCAyOCwgMjksIDMxLCAzLCA0LCAxMywgMTQsIDE3LCAxOCwgMjQsIDI1LCAzMiwgMzMsIAotfTsKLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gampDYW5Nb3ZlXzAoaW50IGhpQnl0ZSwgaW50IGkxLCBpbnQgaTIsIGxvbmcgbDEsIGxvbmcgbDIpCi17Ci0gICBzd2l0Y2goaGlCeXRlKQotICAgewotICAgICAgY2FzZSAwOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWMyW2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBjYXNlIDQ4OgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWMzW2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBjYXNlIDQ5OgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWM0W2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBjYXNlIDUxOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWM1W2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWM2W2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBkZWZhdWx0IDogCi0gICAgICAgICBpZiAoKGpqYml0VmVjMFtpMV0gJiBsMSkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLX0KLXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gampDYW5Nb3ZlXzEoaW50IGhpQnl0ZSwgaW50IGkxLCBpbnQgaTIsIGxvbmcgbDEsIGxvbmcgbDIpCi17Ci0gICBzd2l0Y2goaGlCeXRlKQotICAgewotICAgICAgY2FzZSAwOgotICAgICAgICAgcmV0dXJuICgoampiaXRWZWM4W2kyXSAmIGwyKSAhPSAwTCk7Ci0gICAgICBkZWZhdWx0IDogCi0gICAgICAgICBpZiAoKGpqYml0VmVjN1tpMV0gJiBsMSkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgIH0KLX0KLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gampzdHJMaXRlcmFsSW1hZ2VzID0gewotIiIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJcMTY0XDE2MlwxNjVcMTQ1IiwgCi0iXDE0NlwxNDFcMTU0XDE2M1wxNDUiLCAiXDE1NlwxNjVcMTU0XDE1NCIsICJcNTYiLCAiXDc2IiwgIlwxNDdcMTY0IiwgIlw3NCIsICJcMTU0XDE2NCIsICJcNzVcNzUiLCAKLSJcMTQ1XDE2MSIsICJcNzRcNzUiLCAiXDE1NFwxNDUiLCAiXDc2XDc1IiwgIlwxNDdcMTQ1IiwgIlw0MVw3NSIsICJcMTU2XDE0NSIsICJcNTAiLCAKLSJcNTEiLCAiXDU0IiwgIlw3MiIsICJcMTMzIiwgIlwxMzUiLCAiXDUzIiwgIlw1NSIsICJcNTIiLCAiXDU3IiwgIlwxNDRcMTUxXDE2NiIsIAotIlw0NSIsICJcMTU1XDE1N1wxNDQiLCAiXDE1NlwxNTdcMTY0IiwgIlw0MSIsICJcMTQxXDE1NlwxNDQiLCAiXDQ2XDQ2IiwgIlwxNTdcMTYyIiwgCi0iXDE3NFwxNzQiLCAiXDE0NVwxNTVcMTYwXDE2NFwxNzEiLCAiXDc3IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgfTsKLXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gbGV4U3RhdGVOYW1lcyA9IHsKLSAgICJERUZBVUxUIiwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvVG9rZW4gPSB7Ci0gICAweGZmZmZmZmZmZmY2MUwsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b1NraXAgPSB7Ci0gICAweDFlTCwgCi19OwotcHJvdGVjdGVkIFNpbXBsZUNoYXJTdHJlYW0gaW5wdXRfc3RyZWFtOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanJvdW5kcyA9IG5ldyBpbnRbMzVdOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanN0YXRlU2V0ID0gbmV3IGludFs3MF07Ci1wcm90ZWN0ZWQgY2hhciBjdXJDaGFyOwotcHVibGljIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtKQotewotICAgaWYgKFNpbXBsZUNoYXJTdHJlYW0uc3RhdGljRmxhZykKLSAgICAgIHRocm93IG5ldyBFcnJvcigiRVJST1I6IENhbm5vdCB1c2UgYSBzdGF0aWMgQ2hhclN0cmVhbSBjbGFzcyB3aXRoIGEgbm9uLXN0YXRpYyBsZXhpY2FsIGFuYWx5emVyLiIpOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotfQotcHVibGljIEpTUEVMUGFyc2VyVG9rZW5NYW5hZ2VyKFNpbXBsZUNoYXJTdHJlYW0gc3RyZWFtLCBpbnQgbGV4U3RhdGUpCi17Ci0gICB0aGlzKHN0cmVhbSk7Ci0gICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pCi17Ci0gICBqam1hdGNoZWRQb3MgPSBqam5ld1N0YXRlQ250ID0gMDsKLSAgIGN1ckxleFN0YXRlID0gZGVmYXVsdExleFN0YXRlOwotICAgaW5wdXRfc3RyZWFtID0gc3RyZWFtOwotICAgUmVJbml0Um91bmRzKCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgUmVJbml0Um91bmRzKCkKLXsKLSAgIGludCBpOwotICAgampyb3VuZCA9IDB4ODAwMDAwMDE7Ci0gICBmb3IgKGkgPSAzNTsgaS0tID4gMDspCi0gICAgICBqanJvdW5kc1tpXSA9IDB4ODAwMDAwMDA7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKLXsKLSAgIFJlSW5pdChzdHJlYW0pOwotICAgU3dpdGNoVG8obGV4U3RhdGUpOwotfQotcHVibGljIHZvaWQgU3dpdGNoVG8oaW50IGxleFN0YXRlKQotewotICAgaWYgKGxleFN0YXRlID49IDEgfHwgbGV4U3RhdGUgPCAwKQotICAgICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoIkVycm9yOiBJZ25vcmluZyBpbnZhbGlkIGxleGljYWwgc3RhdGUgOiAiICsgbGV4U3RhdGUgKyAiLiBTdGF0ZSB1bmNoYW5nZWQuIiwgVG9rZW5NZ3JFcnJvci5JTlZBTElEX0xFWElDQUxfU1RBVEUpOwotICAgZWxzZQotICAgICAgY3VyTGV4U3RhdGUgPSBsZXhTdGF0ZTsKLX0KLQotcHJvdGVjdGVkIFRva2VuIGpqRmlsbFRva2VuKCkKLXsKLSAgIFRva2VuIHQgPSBUb2tlbi5uZXdUb2tlbihqam1hdGNoZWRLaW5kKTsKLSAgIHQua2luZCA9IGpqbWF0Y2hlZEtpbmQ7Ci0gICBTdHJpbmcgaW0gPSBqanN0ckxpdGVyYWxJbWFnZXNbamptYXRjaGVkS2luZF07Ci0gICB0LmltYWdlID0gKGltID09IG51bGwpID8gaW5wdXRfc3RyZWFtLkdldEltYWdlKCkgOiBpbTsKLSAgIHQuYmVnaW5MaW5lID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luTGluZSgpOwotICAgdC5iZWdpbkNvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkNvbHVtbigpOwotICAgdC5lbmRMaW5lID0gaW5wdXRfc3RyZWFtLmdldEVuZExpbmUoKTsKLSAgIHQuZW5kQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOwotICAgcmV0dXJuIHQ7Ci19Ci0KLWludCBjdXJMZXhTdGF0ZSA9IDA7Ci1pbnQgZGVmYXVsdExleFN0YXRlID0gMDsKLWludCBqam5ld1N0YXRlQ250OwotaW50IGpqcm91bmQ7Ci1pbnQgamptYXRjaGVkUG9zOwotaW50IGpqbWF0Y2hlZEtpbmQ7Ci0KLXB1YmxpYyBUb2tlbiBnZXROZXh0VG9rZW4oKSAKLXsKLSAgVG9rZW4gbWF0Y2hlZFRva2VuOwotICBpbnQgY3VyUG9zID0gMDsKLQotICBFT0ZMb29wIDoKLSAgZm9yICg7OykKLSAgeyAgIAotICAgdHJ5ICAgCi0gICB7ICAgICAKLSAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOwotICAgfSAgICAgCi0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCi0gICB7ICAgICAgICAKLSAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOwotICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICB9Ci0KLSAgIHRyeSB7IGlucHV0X3N0cmVhbS5iYWNrdXAoMCk7Ci0gICAgICB3aGlsZSAoY3VyQ2hhciA8PSAzMiAmJiAoMHgxMDAwMDI2MDBMICYgKDFMIDw8IGN1ckNoYXIpKSAhPSAwTCkKLSAgICAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOwotICAgfQotICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsgY29udGludWUgRU9GTG9vcDsgfQotICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7Ci0gICBqam1hdGNoZWRQb3MgPSAwOwotICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOwotICAgaWYgKGpqbWF0Y2hlZEtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgIHsKLSAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQotICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChjdXJQb3MgLSBqam1hdGNoZWRQb3MgLSAxKTsKLSAgICAgIGlmICgoamp0b1Rva2VuW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCi0gICAgICB7Ci0gICAgICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGNvbnRpbnVlIEVPRkxvb3A7Ci0gICAgICB9Ci0gICB9Ci0gICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7Ci0gICBpbnQgZXJyb3JfY29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOwotICAgU3RyaW5nIGVycm9yX2FmdGVyID0gbnVsbDsKLSAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOwotICAgdHJ5IHsgaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7IH0KLSAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICBFT0ZTZWVuID0gdHJ1ZTsKLSAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOwotICAgICAgaWYgKGN1ckNoYXIgPT0gJ1xuJyB8fCBjdXJDaGFyID09ICdccicpIHsKLSAgICAgICAgIGVycm9yX2xpbmUrKzsKLSAgICAgICAgIGVycm9yX2NvbHVtbiA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBlcnJvcl9jb2x1bW4rKzsKLSAgIH0KLSAgIGlmICghRU9GU2VlbikgewotICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKLSAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOwotICAgfQotICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoRU9GU2VlbiwgY3VyTGV4U3RhdGUsIGVycm9yX2xpbmUsIGVycm9yX2NvbHVtbiwgZXJyb3JfYWZ0ZXIsIGN1ckNoYXIsIFRva2VuTWdyRXJyb3IuTEVYSUNBTF9FUlJPUik7Ci0gIH0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWE2ZTQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BFTFBhcnNlclRyZWVDb25zdGFudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUEVMUGFyc2VyVHJlZUNvbnN0YW50cwotewotICBwdWJsaWMgaW50IEpKVEVYUFJFU1NJT04gPSAwOwotICBwdWJsaWMgaW50IEpKVE9SRVhQUkVTU0lPTiA9IDE7Ci0gIHB1YmxpYyBpbnQgSkpUQU5ERVhQUkVTU0lPTiA9IDI7Ci0gIHB1YmxpYyBpbnQgSkpURVFVQUxJVFlFWFBSRVNTSU9OID0gMzsKLSAgcHVibGljIGludCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTiA9IDQ7Ci0gIHB1YmxpYyBpbnQgSkpUQURERVhQUkVTU0lPTiA9IDU7Ci0gIHB1YmxpYyBpbnQgSkpUTVVMVElQTFlFWFBSRVNTSU9OID0gNjsKLSAgcHVibGljIGludCBKSlRDSE9JQ0VFWFBSRVNTSU9OID0gNzsKLSAgcHVibGljIGludCBKSlRVTkFSWUVYUFJFU1NJT04gPSA4OwotICBwdWJsaWMgaW50IEpKVFZBTFVFID0gOTsKLSAgcHVibGljIGludCBKSlRWQUxVRVBSRUZJWCA9IDEwOwotICBwdWJsaWMgaW50IEpKVFZBTFVFU1VGRklYID0gMTE7Ci0gIHB1YmxpYyBpbnQgSkpURlVOQ1RJT05JTlZPQ0FUSU9OID0gMTI7Ci0gIHB1YmxpYyBpbnQgSkpUTElURVJBTCA9IDEzOwotCi0KLSAgcHVibGljIFN0cmluZ1tdIGpqdE5vZGVOYW1lID0gewotICAgICJFeHByZXNzaW9uIiwKLSAgICAiT3JFeHByZXNzaW9uIiwKLSAgICAiQW5kRXhwcmVzc2lvbiIsCi0gICAgIkVxdWFsaXR5RXhwcmVzc2lvbiIsCi0gICAgIlJlbGF0aW9uYWxFeHByZXNzaW9uIiwKLSAgICAiQWRkRXhwcmVzc2lvbiIsCi0gICAgIk11bHRpcGx5RXhwcmVzc2lvbiIsCi0gICAgIkNob2ljZUV4cHJlc3Npb24iLAotICAgICJVbmFyeUV4cHJlc3Npb24iLAotICAgICJWYWx1ZSIsCi0gICAgIlZhbHVlUHJlZml4IiwKLSAgICAiVmFsdWVTdWZmaXgiLAotICAgICJGdW5jdGlvbkludm9jYXRpb24iLAotICAgICJMaXRlcmFsIiwKLSAgfTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFBhcnNlclZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZjZjQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvSlNQRUxQYXJzZXJWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gSlNQRUxQYXJzZXJWaXNpdG9yLmphdmEgKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotcHVibGljIGludGVyZmFjZSBKU1BFTFBhcnNlclZpc2l0b3IKLXsKLSAgcHVibGljIE9iamVjdCB2aXNpdChTaW1wbGVOb2RlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RPckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFuZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGx5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2hvaWNlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW5hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYWx1ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFsdWVQcmVmaXggbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhbHVlU3VmZml4IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkludm9jYXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWwgbm9kZSwgT2JqZWN0IGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMVHJhbnNsYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL0pTUEVMVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmE1ZWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9KU1BFTFRyYW5zbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWwuRUxQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3BlbC5JSlNQRUxUcmFuc2xhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCQotcHVibGljIGNsYXNzIEpTUEVMVHJhbnNsYXRvciBpbXBsZW1lbnRzIElKU1BFTFRyYW5zbGF0b3IgewotCS8qKgotCSAqIEpTUCBFeHByZXNzaW9uIExhbmd1YWdlIFBhcnNlci4KLQkgKi8KLQlwcml2YXRlIEpTUEVMUGFyc2VyIGVsUGFyc2VyID0gbnVsbDsKLQkKLQlwdWJsaWMgTGlzdCB0cmFuc2xhdGVFTChTdHJpbmcgZWxUZXh0LCBTdHJpbmcgZGVsaW0sCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCBpbnQgY29udGVudFN0YXJ0LAotCQkJaW50IGNvbnRlbnRMZW5ndGgsIFN0cmluZ0J1ZmZlciBmVXNlckVMRXhwcmVzc2lvbnMsCi0JCQlIYXNoTWFwIGZVc2VyRUxSYW5nZXMsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCi0JCUFycmF5TGlzdCBlbFByb2JsZW1zID0gbmV3IEFycmF5TGlzdCgpOwotCQkKLQkJdHJ5IHsKLQkJCXN5bmNocm9uaXplZCh0aGlzKSB7Ci0JCQkJaWYobnVsbCA9PSBlbFBhcnNlcikgewotCQkJCQllbFBhcnNlciA9IEpTUEVMUGFyc2VyLmNyZWF0ZVBhcnNlcihlbFRleHQpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWVsUGFyc2VyLlJlSW5pdChlbFRleHQpOwotCQkJCX0KLQkJCQotCQkJCUFTVEV4cHJlc3Npb24gZXhwcmVzc2lvbiA9IGVsUGFyc2VyLkV4cHJlc3Npb24oKTsKLQkJCQlFTEdlbmVyYXRvciBnZW4gPSBuZXcgRUxHZW5lcmF0b3IoKTsKLQkJCQlnZW4uZ2VuZXJhdGUoZXhwcmVzc2lvbiwgY3VycmVudE5vZGUsIGZVc2VyRUxFeHByZXNzaW9ucywgZlVzZXJFTFJhbmdlcywgZG9jdW1lbnQsIGN1cnJlbnROb2RlLCBjb250ZW50U3RhcnQsIGNvbnRlbnRMZW5ndGgpOwotCQkJfQotCQl9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUb2tlbiBjdXJUb2sgPSBlLmN1cnJlbnRUb2tlbjsKLQkJCWludCBwcm9ibGVtU3RhcnRPZmZzZXQ7Ci0JCQlpbnQgcHJvYmxlbUVuZE9mZnNldDsKLQkJCVBvc2l0aW9uIHBvcyA9IG51bGw7Ci0JCQlwcm9ibGVtU3RhcnRPZmZzZXQgPSAgY29udGVudFN0YXJ0ICsgY3VyVG9rLmJlZ2luQ29sdW1uOwotCQkJcHJvYmxlbUVuZE9mZnNldCA9IGNvbnRlbnRTdGFydCArIGN1clRvay5lbmRDb2x1bW47Ci0JCQkKLQkJCXBvcyA9IG5ldyBQb3NpdGlvbihwcm9ibGVtU3RhcnRPZmZzZXQsIHByb2JsZW1FbmRPZmZzZXQgLSBwcm9ibGVtU3RhcnRPZmZzZXQgKyAxKTsKLQkJCWVsUHJvYmxlbXMuYWRkKG5ldyBFTFByb2JsZW0ocG9zLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSkpOwotCQl9IGNhdGNoIChUb2tlbk1nckVycm9yIHRlKSB7Ci0JCQlQb3NpdGlvbiBwb3MgPSBuZXcgUG9zaXRpb24oY29udGVudFN0YXJ0LCBjb250ZW50TGVuZ3RoKTsKLQkJCWVsUHJvYmxlbXMuYWRkKG5ldyBFTFByb2JsZW0ocG9zLCBKU1BDb3JlTWVzc2FnZXMuSlNQRUxfVG9rZW4pKTsKLQkJfQotCQlyZXR1cm4gZWxQcm9ibGVtczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhMTg2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIE5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi0vKiBBbGwgQVNUIG5vZGVzIG11c3QgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlLiAgSXQgcHJvdmlkZXMgYmFzaWMKLSAgIG1hY2hpbmVyeSBmb3IgY29uc3RydWN0aW5nIHRoZSBwYXJlbnQgYW5kIGNoaWxkIHJlbGF0aW9uc2hpcHMKLSAgIGJldHdlZW4gbm9kZXMuICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgTm9kZSB7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgbm9kZSBoYXMgYmVlbiBtYWRlIHRoZSBjdXJyZW50Ci0gICAgbm9kZS4gIEl0IGluZGljYXRlcyB0aGF0IGNoaWxkIG5vZGVzIGNhbiBub3cgYmUgYWRkZWQgdG8gaXQuICovCi0gIHB1YmxpYyB2b2lkIGpqdE9wZW4oKTsKLQotICAvKiogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgY2hpbGQgbm9kZXMgaGF2ZSBiZWVuCi0gICAgYWRkZWQuICovCi0gIHB1YmxpYyB2b2lkIGpqdENsb3NlKCk7Ci0KLSAgLyoqIFRoaXMgcGFpciBvZiBtZXRob2RzIGFyZSB1c2VkIHRvIGluZm9ybSB0aGUgbm9kZSBvZiBpdHMKLSAgICBwYXJlbnQuICovCi0gIHB1YmxpYyB2b2lkIGpqdFNldFBhcmVudChOb2RlIG4pOwotICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKTsKLQotICAvKiogVGhpcyBtZXRob2QgdGVsbHMgdGhlIG5vZGUgdG8gYWRkIGl0cyBhcmd1bWVudCB0byB0aGUgbm9kZSdzCi0gICAgbGlzdCBvZiBjaGlsZHJlbi4gICovCi0gIHB1YmxpYyB2b2lkIGpqdEFkZENoaWxkKE5vZGUgbiwgaW50IGkpOwotCi0gIC8qKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgY2hpbGQgbm9kZS4gIFRoZSBjaGlsZHJlbiBhcmUgbnVtYmVyZWQKLSAgICAgZnJvbSB6ZXJvLCBsZWZ0IHRvIHJpZ2h0LiAqLwotICBwdWJsaWMgTm9kZSBqanRHZXRDaGlsZChpbnQgaSk7Ci0KLSAgLyoqIFJldHVybiB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIHRoZSBub2RlIGhhcy4gKi8KLSAgcHVibGljIGludCBqanRHZXROdW1DaGlsZHJlbigpOwotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkNTA4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvUGFyc2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbDsKLQotLyoqCi0gKiBUaGlzIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBwYXJzZSBlcnJvcnMgYXJlIGVuY291bnRlcmVkLgotICogWW91IGNhbiBleHBsaWNpdGx5IGNyZWF0ZSBvYmplY3RzIG9mIHRoaXMgZXhjZXB0aW9uIHR5cGUgYnkKLSAqIGNhbGxpbmcgdGhlIG1ldGhvZCBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIGluIHRoZSBnZW5lcmF0ZWQKLSAqIHBhcnNlci4KLSAqCi0gKiBZb3UgY2FuIG1vZGlmeSB0aGlzIGNsYXNzIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIHJlcG9ydGluZwotICogbWVjaGFuaXNtcyBzbyBsb25nIGFzIHlvdSByZXRhaW4gdGhlIHB1YmxpYyBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0KLSAgLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0vKioKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIGJ5IHRoZSBtZXRob2QgImdlbmVyYXRlUGFyc2VFeGNlcHRpb24iCi0gICAqIGluIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLiAgQ2FsbGluZyB0aGlzIGNvbnN0cnVjdG9yIGdlbmVyYXRlcwotICAgKiBhIG5ldyBvYmplY3Qgb2YgdGhpcyB0eXBlIHdpdGggdGhlIGZpZWxkcyAiY3VycmVudFRva2VuIiwKLSAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIHNldC4gIFRoZSBib29sZWFuCi0gICAqIGZsYWcgInNwZWNpYWxDb25zdHJ1Y3RvciIgaXMgYWxzbyBzZXQgdG8gdHJ1ZSB0byBpbmRpY2F0ZSB0aGF0Ci0gICAqIHRoaXMgY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlIHRoaXMgb2JqZWN0LgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbGxzIGl0cyBzdXBlciBjbGFzcyB3aXRoIHRoZSBlbXB0eSBzdHJpbmcKLSAgICogdG8gZm9yY2UgdGhlICJ0b1N0cmluZyIgbWV0aG9kIG9mIHBhcmVudCBjbGFzcyAiVGhyb3dhYmxlIiB0bwotICAgKiBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSBpbiB0aGUgZm9ybToKLSAgICogICAgIFBhcnNlRXhjZXB0aW9uOiA8cmVzdWx0IG9mIGdldE1lc3NhZ2U+Ci0gICAqLwotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oVG9rZW4gY3VycmVudFRva2VuVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdG9rZW5JbWFnZVZhbAotICAgICAgICAgICAgICAgICAgICAgICApCi0gIHsKLSAgICBzdXBlcigiIik7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gdHJ1ZTsKLSAgICBjdXJyZW50VG9rZW4gPSBjdXJyZW50VG9rZW5WYWw7Ci0gICAgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyA9IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWw7Ci0gICAgdG9rZW5JbWFnZSA9IHRva2VuSW1hZ2VWYWw7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMgYXJlIGZvciB1c2UgYnkgeW91IGZvciB3aGF0ZXZlcgotICAgKiBwdXJwb3NlIHlvdSBjYW4gdGhpbmsgb2YuICBDb25zdHJ1Y3RpbmcgdGhlIGV4Y2VwdGlvbiBpbiB0aGlzCi0gICAqIG1hbm5lciBtYWtlcyB0aGUgZXhjZXB0aW9uIGJlaGF2ZSBpbiB0aGUgbm9ybWFsIHdheSAtIGkuZS4sIGFzCi0gICAqIGRvY3VtZW50ZWQgaW4gdGhlIGNsYXNzICJUaHJvd2FibGUiLiAgVGhlIGZpZWxkcyAiZXJyb3JUb2tlbiIsCi0gICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBkbyBub3QgY29udGFpbgotICAgKiByZWxldmFudCBpbmZvcm1hdGlvbi4gIFRoZSBKYXZhQ0MgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgdXNlCi0gICAqIHRoZXNlIGNvbnN0cnVjdG9ycy4KLSAgICovCi0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKCkgewotICAgIHN1cGVyKCk7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIHZhcmlhYmxlIGRldGVybWluZXMgd2hpY2ggY29uc3RydWN0b3Igd2FzIHVzZWQgdG8gY3JlYXRlCi0gICAqIHRoaXMgb2JqZWN0IGFuZCB0aGVyZWJ5IGFmZmVjdHMgdGhlIHNlbWFudGljcyBvZiB0aGUKLSAgICogImdldE1lc3NhZ2UiIG1ldGhvZCAoc2VlIGJlbG93KS4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHNwZWNpYWxDb25zdHJ1Y3RvcjsKLQotICAvKioKLSAgICogVGhpcyBpcyB0aGUgbGFzdCB0b2tlbiB0aGF0IGhhcyBiZWVuIGNvbnN1bWVkIHN1Y2Nlc3NmdWxseS4gIElmCi0gICAqIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQgZHVlIHRvIGEgcGFyc2UgZXJyb3IsIHRoZSB0b2tlbgotICAgKiBmb2xsb3duZyB0aGlzIHRva2VuIHdpbGwgKHRoZXJlZm9yZSkgYmUgdGhlIGZpcnN0IGVycm9yIHRva2VuLgotICAgKi8KLSAgcHVibGljIFRva2VuIGN1cnJlbnRUb2tlbjsKLQotICAvKioKLSAgICogRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGlzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgRWFjaCBhcnJheQotICAgKiBvZiBpbnRlZ2VycyByZXByZXNlbnRzIGEgc2VxdWVuY2Ugb2YgdG9rZW5zIChieSB0aGVpciBvcmRpbmFsCi0gICAqIHZhbHVlcykgdGhhdCBpcyBleHBlY3RlZCBhdCB0aGlzIHBvaW50IG9mIHRoZSBwYXJzZS4KLSAgICovCi0gIHB1YmxpYyBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXM7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgYSByZWZlcmVuY2UgdG8gdGhlICJ0b2tlbkltYWdlIiBhcnJheSBvZiB0aGUgZ2VuZXJhdGVkCi0gICAqIHBhcnNlciB3aXRoaW4gd2hpY2ggdGhlIHBhcnNlIGVycm9yIG9jY3VycmVkLiAgVGhpcyBhcnJheSBpcwotICAgKiBkZWZpbmVkIGluIHRoZSBnZW5lcmF0ZWQgLi4uQ29uc3RhbnRzIGludGVyZmFjZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSB0b2tlbkltYWdlOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBoYXMgdGhlIHN0YW5kYXJkIGJlaGF2aW9yIHdoZW4gdGhpcyBvYmplY3QgaGFzIGJlZW4KLSAgICogY3JlYXRlZCB1c2luZyB0aGUgc3RhbmRhcmQgY29uc3RydWN0b3JzLiAgT3RoZXJ3aXNlLCBpdCB1c2VzCi0gICAqICJjdXJyZW50VG9rZW4iIGFuZCAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIgdG8gZ2VuZXJhdGUgYSBwYXJzZQotICAgKiBlcnJvciBtZXNzYWdlIGFuZCByZXR1cm5zIGl0LiAgSWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZAotICAgKiBkdWUgdG8gYSBwYXJzZSBlcnJvciwgYW5kIHlvdSBkbyBub3QgY2F0Y2ggaXQgKGl0IGdldHMgdGhyb3duCi0gICAqIGZyb20gdGhlIHBhcnNlciksIHRoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyB0aGUgcHJpbnRpbmcKLSAgICogb2YgdGhlIGZpbmFsIHN0YWNrIHRyYWNlLCBhbmQgaGVuY2UgdGhlIGNvcnJlY3QgZXJyb3IgbWVzc2FnZQotICAgKiBnZXRzIGRpc3BsYXllZC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikgewotICAgICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgU3RyaW5nIGV4cGVjdGVkID0gIiI7Ci0gICAgaW50IG1heFNpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7IGkrKykgewotICAgICAgaWYgKG1heFNpemUgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCkgewotICAgICAgICBtYXhTaXplID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoOyBqKyspIHsKLSAgICAgICAgZXhwZWN0ZWQgKz0gdG9rZW5JbWFnZVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2pdXSArICIgIjsKLSAgICAgIH0KLSAgICAgIGlmIChleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoIC0gMV0gIT0gMCkgewotICAgICAgICBleHBlY3RlZCArPSAiLi4uIjsKLSAgICAgIH0KLSAgICAgIGV4cGVjdGVkICs9IGVvbCArICIgICAgIjsKLSAgICB9Ci0gICAgU3RyaW5nIHJldHZhbCA9ICJFbmNvdW50ZXJlZCBcIiI7Ci0gICAgVG9rZW4gdG9rID0gY3VycmVudFRva2VuLm5leHQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTaXplOyBpKyspIHsKLSAgICAgIGlmIChpICE9IDApIHJldHZhbCArPSAiICI7Ci0gICAgICBpZiAodG9rLmtpbmQgPT0gMCkgewotICAgICAgICByZXR2YWwgKz0gdG9rZW5JbWFnZVswXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICByZXR2YWwgKz0gYWRkX2VzY2FwZXModG9rLmltYWdlKTsKLSAgICAgIHRvayA9IHRvay5uZXh0OyAKLSAgICB9Ci0gICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luQ29sdW1uOwotICAgIHJldHZhbCArPSAiLiIgKyBlb2w7Ci0gICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpIHsKLSAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZzoiICsgZW9sICsgIiAgICAiOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7Ci0gICAgfQotICAgIHJldHZhbCArPSBleHBlY3RlZDsKLSAgICByZXR1cm4gcmV0dmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBlbmQgb2YgbGluZSBzdHJpbmcgZm9yIHRoaXMgbWFjaGluZS4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZW9sID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIsICJcbiIpOwotIAotICAvKioKLSAgICogVXNlZCB0byBjb252ZXJ0IHJhdyBjaGFyYWN0ZXJzIHRvIHRoZWlyIGVzY2FwZWQgdmVyc2lvbgotICAgKiB3aGVuIHRoZXNlIHJhdyB2ZXJzaW9uIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgYW4gQVNDSUkKLSAgICogc3RyaW5nIGxpdGVyYWwuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGFkZF9lc2NhcGVzKFN0cmluZyBzdHIpIHsKLSAgICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICBjaGFyIGNoOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykgewotICAgICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgY2FzZSAwIDoKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xmJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcciIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcJyc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcXCIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgaWYgKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCB8fCBjaCA+IDB4N2UpIHsKLSAgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcdSIgKyBzLnN1YnN0cmluZyhzLmxlbmd0aCgpIC0gNCwgcy5sZW5ndGgoKSkpOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJldHZhbC50b1N0cmluZygpOwotICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlQ2hhclN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZUNoYXJTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAyMWI0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTaW1wbGVDaGFyU3RyZWFtLmphdmEgVmVyc2lvbiAzLjAgKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIENoYXJTdHJlYW0sIHdoZXJlIHRoZSBzdHJlYW0gaXMgYXNzdW1lZCB0bwotICogY29udGFpbiBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgKHdpdGhvdXQgdW5pY29kZSBwcm9jZXNzaW5nKS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ2hhclN0cmVhbQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOwotICBpbnQgYnVmc2l6ZTsKLSAgaW50IGF2YWlsYWJsZTsKLSAgaW50IHRva2VuQmVnaW47Ci0gIHB1YmxpYyBpbnQgYnVmcG9zID0gLTE7Ci0gIHByb3RlY3RlZCBpbnQgYnVmbGluZVtdOwotICBwcm90ZWN0ZWQgaW50IGJ1ZmNvbHVtbltdOwotCi0gIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKLSAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIGphdmEuaW8uUmVhZGVyIGlucHV0U3RyZWFtOwotCi0gIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOwotICBwcm90ZWN0ZWQgaW50IG1heE5leHRDaGFySW5kID0gMDsKLSAgcHJvdGVjdGVkIGludCBpbkJ1ZiA9IDA7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgRXhwYW5kQnVmZihib29sZWFuIHdyYXBBcm91bmQpCi0gIHsKLSAgICAgY2hhcltdIG5ld2J1ZmZlciA9IG5ldyBjaGFyW2J1ZnNpemUgKyAyMDQ4XTsKLSAgICAgaW50IG5ld2J1ZmxpbmVbXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotICAgICBpbnQgbmV3YnVmY29sdW1uW10gPSBuZXcgaW50W2J1ZnNpemUgKyAyMDQ4XTsKLQotICAgICB0cnkKLSAgICAgewotICAgICAgICBpZiAod3JhcEFyb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgdG9rZW5CZWdpbiwgbmV3YnVmZmVyLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBuZXdidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIDAsIG5ld2J1ZmxpbmUsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCAwLCBuZXdidWZjb2x1bW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICAgICBidWZjb2x1bW4gPSBuZXdidWZjb2x1bW47Ci0KLSAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgPSAoYnVmcG9zICs9IChidWZzaXplIC0gdG9rZW5CZWdpbikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgdG9rZW5CZWdpbiwgbmV3YnVmZmVyLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBidWZjb2x1bW4gPSBuZXdidWZjb2x1bW47Ci0KLSAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgPSAoYnVmcG9zIC09IHRva2VuQmVnaW4pOwotICAgICAgICB9Ci0gICAgIH0KLSAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgIH0KLQotCi0gICAgIGJ1ZnNpemUgKz0gMjA0ODsKLSAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKLSAgICAgdG9rZW5CZWdpbiA9IDA7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBGaWxsQnVmZigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICAgaWYgKG1heE5leHRDaGFySW5kID09IGF2YWlsYWJsZSkKLSAgICAgewotICAgICAgICBpZiAoYXZhaWxhYmxlID09IGJ1ZnNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKHRva2VuQmVnaW4gPiAyMDQ4KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIGlmICh0b2tlbkJlZ2luIDwgMCkKLSAgICAgICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIEV4cGFuZEJ1ZmYoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF2YWlsYWJsZSA+IHRva2VuQmVnaW4pCi0gICAgICAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7Ci0gICAgICAgIGVsc2UgaWYgKCh0b2tlbkJlZ2luIC0gYXZhaWxhYmxlKSA8IDIwNDgpCi0gICAgICAgICAgIEV4cGFuZEJ1ZmYodHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgfQotCi0gICAgIGludCBpOwotICAgICB0cnkgewotICAgICAgICBpZiAoKGkgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgbWF4TmV4dENoYXJJbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgLSBtYXhOZXh0Q2hhckluZCkpID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICBtYXhOZXh0Q2hhckluZCArPSBpOwotICAgICAgICByZXR1cm47Ci0gICAgIH0KLSAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC0tYnVmcG9zOwotICAgICAgICBiYWNrdXAoMCk7Ci0gICAgICAgIGlmICh0b2tlbkJlZ2luID09IC0xKQotICAgICAgICAgICB0b2tlbkJlZ2luID0gYnVmcG9zOwotICAgICAgICB0aHJvdyBlOwotICAgICB9Ci0gIH0KLQotICBwdWJsaWMgY2hhciBCZWdpblRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgICB0b2tlbkJlZ2luID0gLTE7Ci0gICAgIGNoYXIgYyA9IHJlYWRDaGFyKCk7Ci0gICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0KLSAgICAgcmV0dXJuIGM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBVcGRhdGVMaW5lQ29sdW1uKGNoYXIgYykKLSAgewotICAgICBjb2x1bW4rKzsKLQotICAgICBpZiAocHJldkNoYXJJc0xGKQotICAgICB7Ci0gICAgICAgIHByZXZDaGFySXNMRiA9IGZhbHNlOwotICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKLSAgICAgfQotICAgICBlbHNlIGlmIChwcmV2Q2hhcklzQ1IpCi0gICAgIHsKLSAgICAgICAgcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gICAgICAgIGlmIChjID09ICdcbicpCi0gICAgICAgIHsKLSAgICAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOwotICAgICB9Ci0KLSAgICAgc3dpdGNoIChjKQotICAgICB7Ci0gICAgICAgIGNhc2UgJ1xyJyA6Ci0gICAgICAgICAgIHByZXZDaGFySXNDUiA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbicgOgotICAgICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnIDoKLSAgICAgICAgICAgY29sdW1uLS07Ci0gICAgICAgICAgIGNvbHVtbiArPSAoOCAtIChjb2x1bW4gJiAwNykpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgIGJyZWFrOwotICAgICB9Ci0KLSAgICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKLSAgICAgYnVmY29sdW1uW2J1ZnBvc10gPSBjb2x1bW47Ci0gIH0KLQotICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICAgaWYgKGluQnVmID4gMCkKLSAgICAgewotICAgICAgICAtLWluQnVmOwotCi0gICAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQotICAgICAgICAgICBidWZwb3MgPSAwOwotCi0gICAgICAgIHJldHVybiBidWZmZXJbYnVmcG9zXTsKLSAgICAgfQotCi0gICAgIGlmICgrK2J1ZnBvcyA+PSBtYXhOZXh0Q2hhckluZCkKLSAgICAgICAgRmlsbEJ1ZmYoKTsKLQotICAgICBjaGFyIGMgPSBidWZmZXJbYnVmcG9zXTsKLQotICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOwotICAgICByZXR1cm4gKGMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIAotICAgKiBAc2VlICNnZXRFbmRDb2x1bW4KLSAgICovCi0KLSAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7Ci0gICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICogQHNlZSAjZ2V0RW5kTGluZQotICAgKi8KLQotICBwdWJsaWMgaW50IGdldExpbmUoKSB7Ci0gICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEVuZENvbHVtbigpIHsKLSAgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRMaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRCZWdpbkNvbHVtbigpIHsKLSAgICAgcmV0dXJuIGJ1ZmNvbHVtblt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QmVnaW5MaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJhY2t1cChpbnQgYW1vdW50KSB7Ci0KLSAgICBpbkJ1ZiArPSBhbW91bnQ7Ci0gICAgaWYgKChidWZwb3MgLT0gYW1vdW50KSA8IDApCi0gICAgICAgYnVmcG9zICs9IGJ1ZnNpemU7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOwotICAgIGxpbmUgPSBzdGFydGxpbmU7Ci0gICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOwotCi0gICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7Ci0gICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07Ci0gICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOwotICAgIGxpbmUgPSBzdGFydGxpbmU7Ci0gICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOwotCi0gICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlcnNpemUgIT0gYnVmZmVyLmxlbmd0aCkKLSAgICB7Ci0gICAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKLSAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIH0KLSAgICBwcmV2Q2hhcklzTEYgPSBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgICB0b2tlbkJlZ2luID0gaW5CdWYgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgYnVmcG9zID0gLTE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgIFJlSW5pdChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0gIHB1YmxpYyBTdHJpbmcgR2V0SW1hZ2UoKQotICB7Ci0gICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCB0b2tlbkJlZ2luLCBidWZwb3MgLSB0b2tlbkJlZ2luICsgMSk7Ci0gICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCB0b2tlbkJlZ2luLCBidWZzaXplIC0gdG9rZW5CZWdpbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhidWZmZXIsIDAsIGJ1ZnBvcyArIDEpOwotICB9Ci0KLSAgcHVibGljIGNoYXJbXSBHZXRTdWZmaXgoaW50IGxlbikKLSAgewotICAgICBjaGFyW10gcmV0ID0gbmV3IGNoYXJbbGVuXTsKLQotICAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnBvcyAtIGxlbiArIDEsIHJldCwgMCwgbGVuKTsKLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZzaXplIC0gKGxlbiAtIGJ1ZnBvcyAtIDEpLCByZXQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC0gYnVmcG9zIC0gMSk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCByZXQsIGxlbiAtIGJ1ZnBvcyAtIDEsIGJ1ZnBvcyArIDEpOwotICAgICB9Ci0KLSAgICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIERvbmUoKQotICB7Ci0gICAgIGJ1ZmZlciA9IG51bGw7Ci0gICAgIGJ1ZmxpbmUgPSBudWxsOwotICAgICBidWZjb2x1bW4gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBhZGp1c3QgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgZm9yIHRoZSBzdGFydCBvZiBhIHRva2VuLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRqdXN0QmVnaW5MaW5lQ29sdW1uKGludCBuZXdMaW5lLCBpbnQgbmV3Q29sKQotICB7Ci0gICAgIGludCBzdGFydCA9IHRva2VuQmVnaW47Ci0gICAgIGludCBsZW47Ci0KLSAgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQotICAgICB7Ci0gICAgICAgIGxlbiA9IGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyBpbkJ1ZiArIDE7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIGxlbiA9IGJ1ZnNpemUgLSB0b2tlbkJlZ2luICsgYnVmcG9zICsgMSArIGluQnVmOwotICAgICB9Ci0KLSAgICAgaW50IGkgPSAwLCBqID0gMCwgayA9IDA7Ci0gICAgIGludCBuZXh0Q29sRGlmZiA9IDAsIGNvbHVtbkRpZmYgPSAwOwotCi0gICAgIHdoaWxlIChpIDwgbGVuICYmCi0gICAgICAgICAgICBidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdID09IGJ1ZmxpbmVbayA9ICsrc3RhcnQgJSBidWZzaXplXSkKLSAgICAgewotICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZTsKLSAgICAgICAgbmV4dENvbERpZmYgPSBjb2x1bW5EaWZmICsgYnVmY29sdW1uW2tdIC0gYnVmY29sdW1uW2pdOwotICAgICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotICAgICAgICBjb2x1bW5EaWZmID0gbmV4dENvbERpZmY7Ci0gICAgICAgIGkrKzsKLSAgICAgfSAKLQotICAgICBpZiAoaSA8IGxlbikKLSAgICAgewotICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOwotICAgICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotCi0gICAgICAgIHdoaWxlIChpKysgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gIT0gYnVmbGluZVsrK3N0YXJ0ICUgYnVmc2l6ZV0pCi0gICAgICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICAgIH0KLSAgICAgfQotCi0gICAgIGxpbmUgPSBidWZsaW5lW2pdOwotICAgICBjb2x1bW4gPSBidWZjb2x1bW5bal07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9TaW1wbGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhYzQ3M2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1NpbXBsZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlTm9kZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWw7Ci0KLXB1YmxpYyBjbGFzcyBTaW1wbGVOb2RlIGltcGxlbWVudHMgTm9kZSB7Ci0gIHByb3RlY3RlZCBOb2RlIHBhcmVudDsKLSAgcHJvdGVjdGVkIE5vZGVbXSBjaGlsZHJlbjsKLSAgcHJvdGVjdGVkIGludCBpZDsKLSAgcHJvdGVjdGVkIEpTUEVMUGFyc2VyIHBhcnNlcjsKLSAgcHJvdGVjdGVkIFRva2VuIGZpcnN0VG9rZW47Ci0gIHByb3RlY3RlZCBUb2tlbiBsYXN0VG9rZW47Ci0KLSAgcHVibGljIFNpbXBsZU5vZGUoaW50IGkpIHsKLSAgICBpZCA9IGk7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlTm9kZShKU1BFTFBhcnNlciBwLCBpbnQgaSkgewotICAgIHRoaXMoaSk7Ci0gICAgcGFyc2VyID0gcDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGpqdE9wZW4oKSB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBqanRDbG9zZSgpIHsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgamp0U2V0UGFyZW50KE5vZGUgbikgeyBwYXJlbnQgPSBuOyB9Ci0gIHB1YmxpYyBOb2RlIGpqdEdldFBhcmVudCgpIHsgcmV0dXJuIHBhcmVudDsgfQotCi0gIHB1YmxpYyB2b2lkIGpqdEFkZENoaWxkKE5vZGUgbiwgaW50IGkpIHsKLSAgICBpZiAoY2hpbGRyZW4gPT0gbnVsbCkgewotICAgICAgY2hpbGRyZW4gPSBuZXcgTm9kZVtpICsgMV07Ci0gICAgfSBlbHNlIGlmIChpID49IGNoaWxkcmVuLmxlbmd0aCkgewotICAgICAgTm9kZSBjW10gPSBuZXcgTm9kZVtpICsgMV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGNoaWxkcmVuLCAwLCBjLCAwLCBjaGlsZHJlbi5sZW5ndGgpOwotICAgICAgY2hpbGRyZW4gPSBjOwotICAgIH0KLSAgICBjaGlsZHJlbltpXSA9IG47Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBqanRHZXRDaGlsZChpbnQgaSkgewotICAgIHJldHVybiBjaGlsZHJlbltpXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgamp0R2V0TnVtQ2hpbGRyZW4oKSB7Ci0gICAgcmV0dXJuIChjaGlsZHJlbiA9PSBudWxsKSA/IDAgOiBjaGlsZHJlbi5sZW5ndGg7Ci0gIH0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQRUxQYXJzZXJWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKSB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBjaGlsZHJlbkFjY2VwdChKU1BFTFBhcnNlclZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpIHsKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotICAgICAgICBjaGlsZHJlbltpXS5qanRBY2NlcHQodmlzaXRvciwgZGF0YSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgLyogWW91IGNhbiBvdmVycmlkZSB0aGVzZSB0d28gbWV0aG9kcyBpbiBzdWJjbGFzc2VzIG9mIFNpbXBsZU5vZGUgdG8KLSAgICAgY3VzdG9taXplIHRoZSB3YXkgdGhlIG5vZGUgYXBwZWFycyB3aGVuIHRoZSB0cmVlIGlzIGR1bXBlZC4gIElmCi0gICAgIHlvdXIgb3V0cHV0IHVzZXMgbW9yZSB0aGFuIG9uZSBsaW5lIHlvdSBzaG91bGQgb3ZlcnJpZGUKLSAgICAgdG9TdHJpbmcoU3RyaW5nKSwgb3RoZXJ3aXNlIG92ZXJyaWRpbmcgdG9TdHJpbmcoKSBpcyBwcm9iYWJseSBhbGwKLSAgICAgeW91IG5lZWQgdG8gZG8uICovCi0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIEpTUEVMUGFyc2VyVHJlZUNvbnN0YW50cy5qanROb2RlTmFtZVtpZF07IH0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgcHJlZml4KSB7IHJldHVybiBwcmVmaXggKyB0b1N0cmluZygpOyB9Ci0KLSAgLyogT3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdG8gY3VzdG9taXplIGhvdyB0aGUgbm9kZSBkdW1wcwotICAgICBvdXQgaXRzIGNoaWxkcmVuLiAqLwotCi0gIHB1YmxpYyB2b2lkIGR1bXAoU3RyaW5nIHByZWZpeCkgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbih0b1N0cmluZyhwcmVmaXgpKTsKLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewotCVNpbXBsZU5vZGUgbiA9IChTaW1wbGVOb2RlKWNoaWxkcmVuW2ldOwotCWlmIChuICE9IG51bGwpIHsKLQkgIG4uZHVtcChwcmVmaXggKyAiICIpOwotCX0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4gZ2V0Rmlyc3RUb2tlbigpIHsKLSAgICByZXR1cm4gZmlyc3RUb2tlbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEZpcnN0VG9rZW4oVG9rZW4gZmlyc3RUb2tlbikgewotICAgIHRoaXMuZmlyc3RUb2tlbiA9IGZpcnN0VG9rZW47Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4gZ2V0TGFzdFRva2VuKCkgewotICAgIHJldHVybiBsYXN0VG9rZW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRMYXN0VG9rZW4oVG9rZW4gbGFzdFRva2VuKSB7Ci0gICAgdGhpcy5sYXN0VG9rZW4gPSBsYXN0VG9rZW47Ci0gIH0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE1OTgyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgQkVBIFN5c3RlbXMgYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBCRUEgU3lzdGVtcyAtIGluaXRpYWwgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbi5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgaW5wdXQgdG9rZW4gc3RyZWFtLgotICovCi0KLXB1YmxpYyBjbGFzcyBUb2tlbiB7Ci0KLSAgLyoqCi0gICAqIEFuIGludGVnZXIgdGhhdCBkZXNjcmliZXMgdGhlIGtpbmQgb2YgdGhpcyB0b2tlbi4gIFRoaXMgbnVtYmVyaW5nCi0gICAqIHN5c3RlbSBpcyBkZXRlcm1pbmVkIGJ5IEphdmFDQ1BhcnNlciwgYW5kIGEgdGFibGUgb2YgdGhlc2UgbnVtYmVycyBpcwotICAgKiBzdG9yZWQgaW4gdGhlIGZpbGUgLi4uQ29uc3RhbnRzLmphdmEuCi0gICAqLwotICBwdWJsaWMgaW50IGtpbmQ7Ci0KLSAgLyoqCi0gICAqIGJlZ2luTGluZSBhbmQgYmVnaW5Db2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhpcyB0b2tlbjsgZW5kTGluZSBhbmQgZW5kQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUKLSAgICogbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBpbnQgYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uOwotCi0gIC8qKgotICAgKiBUaGUgc3RyaW5nIGltYWdlIG9mIHRoZSB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgaW1hZ2U7Ci0KLSAgLyoqCi0gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbiBmcm9tIHRoZSBpbnB1dAotICAgKiBzdHJlYW0uICBJZiB0aGlzIGlzIHRoZSBsYXN0IHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgb3IgaWYgdGhlCi0gICAqIHRva2VuIG1hbmFnZXIgaGFzIG5vdCByZWFkIHRva2VucyBiZXlvbmQgdGhpcyBvbmUsIHRoaXMgZmllbGQgaXMKLSAgICogc2V0IHRvIG51bGwuICBUaGlzIGlzIHRydWUgb25seSBpZiB0aGlzIHRva2VuIGlzIGFsc28gYSByZWd1bGFyCi0gICAqIHRva2VuLiAgT3RoZXJ3aXNlLCBzZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCi0gICAqIHRoaXMgZmllbGQuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gbmV4dDsKLQotICAvKioKLSAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGFjY2VzcyBzcGVjaWFsIHRva2VucyB0aGF0IG9jY3VyIHByaW9yIHRvIHRoaXMKLSAgICogdG9rZW4sIGJ1dCBhZnRlciB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbi4KLSAgICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggc3BlY2lhbCB0b2tlbnMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIG51bGwuCi0gICAqIFdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgc3VjaCBzcGVjaWFsIHRva2VuLCB0aGlzIGZpZWxkIHJlZmVycwotICAgKiB0byB0aGUgbGFzdCBvZiB0aGVzZSBzcGVjaWFsIHRva2Vucywgd2hpY2ggaW4gdHVybiByZWZlcnMgdG8gdGhlIG5leHQKLSAgICogcHJldmlvdXMgc3BlY2lhbCB0b2tlbiB0aHJvdWdoIGl0cyBzcGVjaWFsVG9rZW4gZmllbGQsIGFuZCBzbyBvbgotICAgKiB1bnRpbCB0aGUgZmlyc3Qgc3BlY2lhbCB0b2tlbiAod2hvc2Ugc3BlY2lhbFRva2VuIGZpZWxkIGlzIG51bGwpLgotICAgKiBUaGUgbmV4dCBmaWVsZHMgb2Ygc3BlY2lhbCB0b2tlbnMgcmVmZXIgdG8gb3RoZXIgc3BlY2lhbCB0b2tlbnMgdGhhdAotICAgKiBpbW1lZGlhdGVseSBmb2xsb3cgaXQgKHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgcmVndWxhciB0b2tlbikuICBJZiB0aGVyZQotICAgKiBpcyBubyBzdWNoIHRva2VuLCB0aGlzIGZpZWxkIGlzIG51bGwuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gc3BlY2lhbFRva2VuOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgIHJldHVybiBpbWFnZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbmV3IFRva2VuIG9iamVjdCwgYnkgZGVmYXVsdC4gSG93ZXZlciwgaWYgeW91IHdhbnQsIHlvdQotICAgKiBjYW4gY3JlYXRlIGFuZCByZXR1cm4gc3ViY2xhc3Mgb2JqZWN0cyBiYXNlZCBvbiB0aGUgdmFsdWUgb2Ygb2ZLaW5kLgotICAgKiBTaW1wbHkgYWRkIHRoZSBjYXNlcyB0byB0aGUgc3dpdGNoIGZvciBhbGwgdGhvc2Ugc3BlY2lhbCBjYXNlcy4KLSAgICogRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgc3ViY2xhc3Mgb2YgVG9rZW4gY2FsbGVkIElEVG9rZW4gdGhhdAotICAgKiB5b3Ugd2FudCB0byBjcmVhdGUgaWYgb2ZLaW5kIGlzIElELCBzaW1scHkgYWRkIHNvbWV0aGluZyBsaWtlIDoKLSAgICoKLSAgICogICAgY2FzZSBNeVBhcnNlckNvbnN0YW50cy5JRCA6IHJldHVybiBuZXcgSURUb2tlbigpOwotICAgKgotICAgKiB0byB0aGUgZm9sbG93aW5nIHN3aXRjaCBzdGF0ZW1lbnQuIFRoZW4geW91IGNhbiBjYXN0IG1hdGNoZWRUb2tlbgotICAgKiB2YXJpYWJsZSB0byB0aGUgYXBwcm9wcmlhdGUgdHlwZSBhbmQgdXNlIGl0IGluIHlvdXIgbGV4aWNhbCBhY3Rpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUb2tlbiBuZXdUb2tlbihpbnQgb2ZLaW5kKQotICB7Ci0gICAgIHN3aXRjaChvZktpbmQpCi0gICAgIHsKLSAgICAgICBkZWZhdWx0IDogcmV0dXJuIG5ldyBUb2tlbigpOwotICAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuTWdyRXJyb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9Ub2tlbk1nckVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNTNkYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL1Rva2VuTWdyRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW5NZ3JFcnJvci5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLmpzcGVsOwotCi1wdWJsaWMgY2xhc3MgVG9rZW5NZ3JFcnJvciBleHRlbmRzIEVycm9yCi17Ci0gICAvKgotICAgICogT3JkaW5hbHMgZm9yIHZhcmlvdXMgcmVhc29ucyB3aHkgYW4gRXJyb3Igb2YgdGhpcyB0eXBlIGNhbiBiZSB0aHJvd24uCi0gICAgKi8KLQotICAgLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0vKioKLSAgICAqIExleGljYWwgZXJyb3Igb2NjdXJlZC4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBMRVhJQ0FMX0VSUk9SID0gMDsKLQotICAgLyoqCi0gICAgKiBBbiBhdHRlbXB0IHdhc3MgbWFkZSB0byBjcmVhdGUgYSBzZWNvbmQgaW5zdGFuY2Ugb2YgYSBzdGF0aWMgdG9rZW4gbWFuYWdlci4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBTVEFUSUNfTEVYRVJfRVJST1IgPSAxOwotCi0gICAvKioKLSAgICAqIFRyaWVkIHRvIGNoYW5nZSB0byBhbiBpbnZhbGlkIGxleGljYWwgc3RhdGUuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFID0gMjsKLQotICAgLyoqCi0gICAgKiBEZXRlY3RlZCAoYW5kIGJhaWxlZCBvdXQgb2YpIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIHRva2VuIG1hbmFnZXIuCi0gICAgKi8KLSAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PUF9ERVRFQ1RFRCA9IDM7Ci0KLSAgIC8qKgotICAgICogSW5kaWNhdGVzIHRoZSByZWFzb24gd2h5IHRoZSBleGNlcHRpb24gaXMgdGhyb3duLiBJdCB3aWxsIGhhdmUKLSAgICAqIG9uZSBvZiB0aGUgYWJvdmUgNCB2YWx1ZXMuCi0gICAgKi8KLSAgIGludCBlcnJvckNvZGU7Ci0KLSAgIC8qKgotICAgICogUmVwbGFjZXMgdW5wcmludGFibGUgY2hhcmFjdGVycyBieSB0aGVpciBlc3BhY2VkIChvciB1bmljb2RlIGVzY2FwZWQpCi0gICAgKiBlcXVpdmFsZW50cyBpbiB0aGUgZ2l2ZW4gc3RyaW5nCi0gICAgKi8KLSAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIGFkZEVzY2FwZXMoU3RyaW5nIHN0cikgewotICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGNoYXIgY2g7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgewotICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gICB9Ci0KLSAgIC8qKgotICAgICogUmV0dXJucyBhIGRldGFpbGVkIG1lc3NhZ2UgZm9yIHRoZSBFcnJvciB3aGVuIGl0IGlzIHRocm93biBieSB0aGUKLSAgICAqIHRva2VuIG1hbmFnZXIgdG8gaW5kaWNhdGUgYSBsZXhpY2FsIGVycm9yLgotICAgICogUGFyYW1ldGVycyA6IAotICAgICogICAgRU9GU2VlbiAgICAgOiBpbmRpY2F0ZXMgaWYgRU9GIGNhdXNlZCB0aGUgbGV4aWNsIGVycm9yCi0gICAgKiAgICBjdXJMZXhTdGF0ZSA6IGxleGljYWwgc3RhdGUgaW4gd2hpY2ggdGhpcyBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBlcnJvckxpbmUgICA6IGxpbmUgbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yQ29sdW1uIDogY29sdW1uIG51bWJlciB3aGVuIHRoZSBlcnJvciBvY2N1cmVkCi0gICAgKiAgICBlcnJvckFmdGVyICA6IHByZWZpeCB0aGF0IHdhcyBzZWVuIGJlZm9yZSB0aGlzIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGN1cmNoYXIgICAgIDogdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXIKLSAgICAqIE5vdGU6IFlvdSBjYW4gY3VzdG9taXplIHRoZSBsZXhpY2FsIGVycm9yIG1lc3NhZ2UgYnkgbW9kaWZ5aW5nIHRoaXMgbWV0aG9kLgotICAgICovCi0gICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBMZXhpY2FsRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhcikgewotICAgICAgcmV0dXJuKCJMZXhpY2FsIGVycm9yIGF0IGxpbmUgIiArCi0gICAgICAgICAgIGVycm9yTGluZSArICIsIGNvbHVtbiAiICsKLSAgICAgICAgICAgZXJyb3JDb2x1bW4gKyAiLiAgRW5jb3VudGVyZWQ6ICIgKwotICAgICAgICAgICAoRU9GU2VlbiA/ICI8RU9GPiAiIDogKCJcIiIgKyBhZGRFc2NhcGVzKFN0cmluZy52YWx1ZU9mKGN1ckNoYXIpKSArICJcIiIpICsgIiAoIiArIChpbnQpY3VyQ2hhciArICIpLCAiKSArCi0gICAgICAgICAgICJhZnRlciA6IFwiIiArIGFkZEVzY2FwZXMoZXJyb3JBZnRlcikgKyAiXCIiKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBZb3UgY2FuIGFsc28gbW9kaWZ5IHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIG1lc3NhZ2VzLgotICAgICogRm9yIGV4YW1wbGUsIGNhc2VzIGxpa2UgTE9PUF9ERVRFQ1RFRCBhbmQgSU5WQUxJRF9MRVhJQ0FMX1NUQVRFIGFyZSBub3QKLSAgICAqIG9mIGVuZC11c2VycyBjb25jZXJuLCBzbyB5b3UgY2FuIHJldHVybiBzb21ldGhpbmcgbGlrZSA6IAotICAgICoKLSAgICAqICAgICAiSW50ZXJuYWwgRXJyb3IgOiBQbGVhc2UgZmlsZSBhIGJ1ZyByZXBvcnQgLi4uLiAiCi0gICAgKgotICAgICogZnJvbSB0aGlzIG1ldGhvZCBmb3Igc3VjaCBjYXNlcyBpbiB0aGUgcmVsZWFzZSB2ZXJzaW9uIG9mIHlvdXIgcGFyc2VyLgotICAgICovCi0gICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICAgfQotCi0gICAvKgotICAgICogQ29uc3RydWN0b3JzIG9mIHZhcmlvdXMgZmxhdm9ycyBmb2xsb3cuCi0gICAgKi8KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoKSB7Ci0gICB9Ci0KLSAgIHB1YmxpYyBUb2tlbk1nckVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgcmVhc29uKSB7Ci0gICAgICBzdXBlcihtZXNzYWdlKTsKLSAgICAgIGVycm9yQ29kZSA9IHJlYXNvbjsKLSAgIH0KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhciwgaW50IHJlYXNvbikgewotICAgICAgdGhpcyhMZXhpY2FsRXJyb3IoRU9GU2VlbiwgbGV4U3RhdGUsIGVycm9yTGluZSwgZXJyb3JDb2x1bW4sIGVycm9yQWZ0ZXIsIGN1ckNoYXIpLCByZWFzb24pOwotICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHBhcnNlci5zZWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4cGFyc2VyLnNlZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFhNWU2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvanNwZWwvZml4cGFyc2VyLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMhL3Vzci9iaW4vc2VkDQotDQotIw0KLSMgVGhlIFNTRSBnZW5lcmFsbHkgdXNlcyBjb21waWxlciBzZXR0aW5nIHRvIHR1cm4gIG1vc3Qgd2FybmluZ3MgaW50byBlcnJvcnMuICANCi0jIFRoaXMgaXMgYSBsaXR0bGUgcHJvYmxlbWF0aWMgZm9yIEphdmFDQyBnZW5lcmF0ZWQgZmlsZXMuICBXZSBkb24ndCB3YW50IA0KLSMgdG8gZGlzdHJpYnV0ZSBhIGN1c3RvbWl6ZWQgdmVyc2lvbiBvZiBKYXZhQ0Mgbm9yIGlzIHRoZXJlIGFueSAidGVtcGxhdGUiIA0KLSMgbWVjaGFuaXNtLiAgU28sIHRoaXMgc2ltcGxlIHNlZCBzY3JpcHQgZ29lcyB0aHJvdWdoIHRoZSBnZW5lcmF0ZWQgdG9rZW4NCi0jIG1hbmFnZXIgYW5kIGZpeGVzIGEgZmV3IHRoaW5ncy4gIElmIEphdmFDQyBjaGFuZ2VzIHRoZSBnZW5lcmF0ZWQgY29kZSwgDQotIyBpdCdzIGxpa2VseSB0aGF0IHRoaXMgc2NyaXB0IHdpbGwgbm8gbG9uZ2VyIGRvIHRoZSByaWdodCB0aGluZy4gIERpdHRvIHdpdGgNCi0jIGFueSB2ZXJzaW9uIG9mIEphdmFDQyBiZXNpZGVzIDMuMi4gQWxzbywgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIA0KLSMgc2NyaXB0IHdpbGwgZXZlbiB3b3JrIHdpdGggYW4gYXJiaXRyYXJ5IEphdmFDQyBncmFtbWFyLiAgSXQncyBvbmx5IGJlZW4gdGVzdGVkDQotIyB3aXRoIHRoZSBjdXJyZW50IEpTUCBFTCBncmFtbWFyLg0KLSMNCi0jIEF1dGhvcjogVGVkIEEuIENhcnJvbGwgKHRjYXJyb2xsQGJlYS5jb20pDQotIw0KLQ0KLXMvc3RhdGljIHByaXZhdGUgZmluYWwgY2xhc3MgTG9va2FoZWFkU3VjY2VzcyBleHRlbmRzIGphdmEubGFuZy5FcnJvciB7IH0vc3RhdGljIHByaXZhdGUgZmluYWwgY2xhc3MgTG9va2FoZWFkU3VjY2VzcyBleHRlbmRzIGphdmEubGFuZy5FcnJvciB7IFxuICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOyBcbiAgfS9nDQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHRtLnNlZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9maXh0bS5zZWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMWRlYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2ZpeHRtLnNlZAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMhL3Vzci9iaW4vc2VkDQotDQotIw0KLSMgVGhlIFNTRSBnZW5lcmFsbHkgdXNlcyBjb21waWxlciBzZXR0aW5nIHRvIHR1cm4gIG1vc3Qgd2FybmluZ3MgaW50byBlcnJvcnMuICANCi0jIFRoaXMgaXMgYSBsaXR0bGUgcHJvYmxlbWF0aWMgZm9yIEphdmFDQyBnZW5lcmF0ZWQgZmlsZXMuICBXZSBkb24ndCB3YW50IA0KLSMgdG8gZGlzdHJpYnV0ZSBhIGN1c3RvbWl6ZWQgdmVyc2lvbiBvZiBKYXZhQ0Mgbm9yIGlzIHRoZXJlIGFueSAidGVtcGxhdGUiIA0KLSMgbWVjaGFuaXNtLiAgU28sIHRoaXMgc2ltcGxlIHNlZCBzY3JpcHQgZ29lcyB0aHJvdWdoIHRoZSBnZW5lcmF0ZWQgdG9rZW4NCi0jIG1hbmFnZXIgYW5kIGZpeGVzIGEgZmV3IHRoaW5ncy4gIElmIEphdmFDQyBjaGFuZ2VzIHRoZSBnZW5lcmF0ZWQgY29kZSwgDQotIyBpdCdzIGxpa2VseSB0aGF0IHRoaXMgc2NyaXB0IHdpbGwgbm8gbG9uZ2VyIGRvIHRoZSByaWdodCB0aGluZy4gIERpdHRvIHdpdGgNCi0jIGFueSB2ZXJzaW9uIG9mIEphdmFDQyBiZXNpZGVzIDMuMi4gQWxzbywgdGhlcmUncyBubyBndWFyYW50ZWUgdGhhdCB0aGlzIA0KLSMgc2NyaXB0IHdpbGwgZXZlbiB3b3JrIHdpdGggYW4gYXJiaXRyYXJ5IEphdmFDQyBncmFtbWFyLiAgSXQncyBvbmx5IGJlZW4gdGVzdGVkDQotIyB3aXRoIHRoZSBjdXJyZW50IEpTUCBFTCBncmFtbWFyLg0KLSMNCi0jIEF1dGhvcjogVGVkIEEuIENhcnJvbGwgKHRjYXJyb2xsQGJlYS5jb20pDQotIw0KLQ0KLXMvKGludCkoY3VyQ2hhciA+PiA4KS9jdXJDaGFyID4+IDgvZw0KLQ0KLS9ecHVibGljIFRva2VuIGdldE5leHRUb2tlbigpLywgL0VPRkxvb3Avew0KLQkvaW50IGtpbmQ7LyB7ZH0NCi0JL1Rva2VuIHNwZWNpYWxUb2tlbiA9IG51bGw7L3tkfQ0KLX0NCi0NCi0vXnByaXZhdGUgZmluYWwgaW50IGpqTW92ZU5mYV8wKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKS8sIC9mb3IoOzspL3sNCi0Jcy9pbnQgaiwga2luZCA9IDB4N2ZmZmZmZmY7L2ludCBraW5kID0gMHg3ZmZmZmZmZjsvZw0KLQkvaW50XFtcXSBuZXh0U3RhdGVzOy97ZH0NCi19DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2dvLnNoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL2pzcGVsL2dvLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2Q1YWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9qc3BlbC9nby5zaAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotIyEvdXNyL2Jpbi9zaA0KLQ0KLSMgU2V0IEpBVkFDQ19IT01FIHRvIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG9mIGphdmFjYyAzLjINCi0kSkFWQUNDX0hPTUUvYmluL2pqdHJlZS5iYXQgSlNQRUwuamp0DQotJEpBVkFDQ19IT01FL2Jpbi9qYXZhY2MuYmF0IEpTUEVMLmpqDQotc2VkIC1mIGZpeHRtLnNlZCAtaS5iYWsgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQ0KLWRpZmYgLXcgSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIuamF2YSBKU1BFTFBhcnNlclRva2VuTWFuYWdlci5qYXZhLmJhaw0KLXNlZCAtZiBmaXhwYXJzZXIuc2VkIC1pLmJhayBKU1BFTFBhcnNlci5qYXZhDQotZGlmZiAtdyBKU1BFTFBhcnNlci5qYXZhIEpTUEVMUGFyc2VyLmphdmEuYmFrDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9JbmRleFdvcmtzcGFjZUpvYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjlhYzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSW5kZXhXb3Jrc3BhY2VKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci0KLS8qKgotICogUmUtaW5kZXhlcyB0aGUgZW50aXJlIHdvcmtzcGFjZS4KLSAqIEVuc3VyZXMgdGhlIEpTUCBJbmRleCBpcyBpbiBhIHN0YWJsZSBzdGF0ZSBiZWZvcmUgcGVyZm9ybWluZyBhIHNlYXJjaC4KLSAqIChsaWtlIGFmdGVyIGEgY3Jhc2ggb3IgaWYgcHJldmlvdXMgaW5kZXhpbmcgd2FzIGNhbmNlbGVkKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSW5kZXhXb3Jrc3BhY2VKb2IgZXh0ZW5kcyBKb2IgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BpbmRleG1hbmFnZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogVmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlLAotCSAqIGFuZCBhZGRzIHRoZSBmaWxlcyB0byBiZSBpbmRleGVkIGFzIHRoZXkgYXJlIGVuY291bnRlcmVkCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0JICAgIHByaXZhdGUgTGlzdCBmaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsgCi0JCQotCQkvLyBtb25pdG9yIGZyb20gdGhlIEpvYgotCQlJUHJvZ3Jlc3NNb25pdG9yIGZJbm5lck1vbml0b3IgPSBudWxsOwotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQl0aGlzLmZJbm5lck1vbml0b3IgPSBtb25pdG9yOwotCQl9Ci0JCQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJCi0JCQkvLyBjaGVjayBqb2IgY2FuY2VsZWQKLQkJCWlmICh0aGlzLmZJbm5lck1vbml0b3IgIT0gbnVsbCAmJiB0aGlzLmZJbm5lck1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJc2V0Q2FuY2VsZWRTdGF0ZSgpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCQotCQkJLy8gY2hlY2sgc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpIHsKLQkJCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkJCi0JCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCQkvLyBjaGVjayB0aGlzIGJlZm9yZSBkZXNjcmlwdGlvbgotCQkJCS8vIGNoZWNrIG5hbWUgYmVmb3JlIGFjdHVhbGx5IGdldHRpbmcgdGhlIGZpbGUgKGxlc3Mgd29yaykKLQkJCQlpZihnZXRKc3BDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJCi0JCQkJCQlpZihERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIigrKSBJbmRleFdvcmtzcGFjZUpvYiBhZGRpbmcgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8gdGhpcyBjYWxsIHdpbGwgY2hlY2sgdGhlIENvbnRlbnRUeXBlRGVzY3JpcHRpb24sIHNvIGRvbid0IG5lZWQgdG8gZG8gaXQgaGVyZS4KLQkJCQkJCS8vSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmFkZEpzcEZpbGUoZmlsZSk7Ci0JCQkJCQl0aGlzLmZpbGVzLmFkZChmaWxlKTsKLQkJCQkJCXRoaXMuZklubmVyTW9uaXRvci5zdWJUYXNrKHByb3h5LmdldE5hbWUoKSk7Ci0JCQkJCQkKLQkJCQkJCS8vIGRvbid0IHNlYXJjaCBkZWVwZXIgZm9yIGZpbGVzCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQkKLQkJcHVibGljIGZpbmFsIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCSAgICByZXR1cm4gKElGaWxlW10pdGhpcy5maWxlcy50b0FycmF5KG5ldyBJRmlsZVt0aGlzLmZpbGVzLnNpemUoKV0pOwotCQl9Ci0JfQotCQotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZUpTUCA9IG51bGw7Ci0JCi0JcHVibGljIEluZGV4V29ya3NwYWNlSm9iKCkgewotCQkvLyBwYV9UT0RPIG1heSB3YW50IHRvIHNheSBzb21ldGhpbmcgbGlrZSAiUmVidWlsZGluZyBKU1AgSW5kZXgiIHRvIGJlIG1vcmUKLQkJLy8gZGVzY3JpcHRpdmUgaW5zdGVhZCBvZiAiVXBkYXRpbmcgSlNQIEluZGV4IiBzaW5jZSB0aGV5IGFyZSAyIGRpZmZlcmVudCB0aGluZ3MKLQkJc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUEluZGV4TWFuYWdlcl8wKTsKLQkJc2V0UHJpb3JpdHkoSm9iLkxPTkcpOwotCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JfQotCi0JSUNvbnRlbnRUeXBlIGdldEpzcENvbnRlbnRUeXBlKCkgewotCQlpZih0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIHRoaXMuZkNvbnRlbnRUeXBlSlNQOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZyBlY2xpcHNlLmNvcmUuaW50ZXJuYWwuam9icy5JbnRlcm5hbEpvYiNydW4ob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpIAotCSAqIGZvciBzaW1pbGFyIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCi0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCi0JCWlmKG1vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQlzZXRDYW5jZWxlZFN0YXRlKCk7Ci0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCX0KLQkJCi0JCWlmKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBzdGFydGVkOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJdHJ5IHsKLQkJICAgIEpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IobW9uaXRvcik7Ci0JCSAgICAvLyBjb2xsZWN0IGFsbCBqc3AgZmlsZXMKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KHZpc2l0b3IsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0JCQkvLyByZXF1ZXN0IGluZGV4aW5nCi0JCQkvLyB0aGlzIGlzIHByZXR0eSBtdWNoIGxpa2UgZmFraW5nIGFuIGVudGlyZSB3b3Jrc3BhY2UgcmVzb3VyY2UgZGVsdGEKLQkJCUpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLmluZGV4RmlsZXModmlzaXRvci5nZXRGaWxlcygpKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlpZihERUJVRykKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYobW9uaXRvciAhPSBudWxsKQotCQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JCWxvbmcgZmluaXNoID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWlmKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgXiBJbmRleFdvcmtzcGFjZUpvYiBmaW5pc2hlZFxuICAgdG90YWwgdGltZSBydW5uaW5nOiAiICsgKGZpbmlzaCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJCi0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCXZvaWQgc2V0Q2FuY2VsZWRTdGF0ZSgpIHsKLQkJSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkuc2V0SW5kZXhTdGF0ZShKU1BJbmRleE1hbmFnZXIuU19DQU5DRUxFRCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQSW5kZXhNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmZiZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BJbmRleE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklKb2JDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iQ2hhbmdlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLmluZGV4LkluZGV4OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JlLnNlYXJjaC5pbmRleGluZy5JbmRleE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0aGUgSlNQIGluZGV4IHVwIHRvIGRhdGUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BJbmRleE1hbmFnZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCS8vIFRPRE8gbW92ZSB0aGlzIHRvIExvZ2dlciwgYXMgd2UgaGF2ZSBpbiBTU0UKLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcGluZGV4bWFuYWdlciIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEtFWV9JTkRFWF9TVEFURSA9ICJqc3BJbmRleFN0YXRlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbmRleFdvcmtzcGFjZUpvYiBpbmRleGluZ0pvYiA9IG5ldyBJbmRleFdvcmtzcGFjZUpvYigpOwotCi0KLQotCS8vIFRPRE86IGNvbnNpZGVyIGVudW1lcmF0aW9uIGZvciB0aGVzZSBpbnQgY29uc3RhbnRzCi0JLy8gc2V0IHRvIFNfVVBEQVRJTkcgb25jZSBhIHJlc291cmNlIGNoYW5nZSBjb21lcyBpbgotCS8vIHNldCB0byBTX1NUQUJMRSBpZjoKLQkvLyAtIHdlIGtub3cgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhlIHJlc291cmNlIGNoYW5nZQotCS8vIC0gb3IgdGhlIFByb2Nlc3NGaWxlc0pvYiBjb21wbGV0ZXMKLQkvLyBzZXQgdG8gU19DQU5DRUxFRCBpZiBhbiBpbmRleGluZyBqb2IgaXMgY2FuY2VsZWQKLQkvLyBzZXQgdG8gU19SRUJVSUxESU5HIGlmIHJlLWluZGV4aW5nIHRoZSBlbnRpcmUgd29ya3NwYWNlCi0KLQkvLyB0aGUgaW50ICcwJyBpcyByZXNlcnZlZCBmb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgYSBwcmVmZXJlbmNlIGlzIG5vdAotCS8vIHRoZXJlCi0JLyoqIGluZGV4IGlzIHJlbGlhYmxlIHRvIHVzZSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfU1RBQkxFID0gMTsKLQkvKiogaW5kZXggaXMgYmVpbmcgdXBkYXRlZCAoZnJvbSBhIHJlc291cmNlIGRlbHRhKSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfVVBEQVRJTkcgPSAyOwotCS8qKiBlbnRpcmUgaW5kZXggaXMgYmVpbmcgcmVidWlsdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNfUkVCVUlMRElORyA9IDM7Ci0JLyoqCi0JICogaW5kZXhpbmcgam9iIHdhcyBjYW5jZWxlZCBpbiB0aGUgbWlkZGxlIG9mIGl0LCBpbmRleCBuZWVkcyB0byBiZQotCSAqIHJlYnVpbHQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTX0NBTkNFTEVEID0gNDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb2xsZWN0cyBKU1AgZmlsZXMgZnJvbSBhIHJlc291cmNlIGRlbHRhLgotCSAqLwotCXByaXZhdGUgY2xhc3MgSlNQUmVzb3VyY2VWaXNpdG9yIGltcGxlbWVudHMgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJLy8gdXNpbmcgaGFzaCBtYXAgZW5zdXJlcyBvbmx5IG9uZSBvZiBlYWNoIGZpbGUKLQkJLy8gbXVzdCBiZSByZXNldCBiZWZvcmUgZXZlcnkgdXNlCi0JCXByaXZhdGUgSGFzaE1hcCBqc3BGaWxlcyA9IG51bGw7Ci0KLQkJcHVibGljIEpTUFJlc291cmNlVmlzaXRvcigpIHsKLQkJCXRoaXMuanNwRmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gdmlzaXQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQkJLy8gaW4gY2FzZSBKU1Agc2VhcmNoIHdhcyBjYW5jZWxlZCAoZWcuIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yKQotCQkJaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJaWYgKCFpc0hpZGRlblJlc291cmNlKGRlbHRhLmdldEZ1bGxQYXRoKCkpKSB7Ci0KLQkJCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJCWJvb2xlYW4gYWRkZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLkFEREVEKSA9PSBJUmVzb3VyY2VEZWx0YS5BRERFRDsKLQkJCQkJYm9vbGVhbiBpc0ludGVyZXN0aW5nQ2hhbmdlID0gZmFsc2U7Ci0JCQkJCWlmICgoa2luZCAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQpIHsKLQkJCQkJCWludCBmbGFncyA9IGRlbHRhLmdldEZsYWdzKCk7Ci0JCQkJCQkvLyBpZ25vcmUgdGhpbmdzIGxpa2UgbWFya2VyIGNoYW5nZXMKLQkJCQkJCWlzSW50ZXJlc3RpbmdDaGFuZ2UgPSAoZmxhZ3MgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UIHx8IChmbGFncyAmIElSZXNvdXJjZURlbHRhLlJFUExBQ0VEKSA9PSBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRDsKLQkJCQkJfQotCQkJCQlib29sZWFuIHJlbW92ZWQgPSAoa2luZCAmIElSZXNvdXJjZURlbHRhLlJFTU9WRUQpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci0JCQkJCWlmIChhZGRlZCB8fCBpc0ludGVyZXN0aW5nQ2hhbmdlKSB7Ci0KLQkJCQkJCXZpc2l0QWRkZWQoZGVsdGEpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHJlbW92ZWQpIHsKLQkJCQkJCXZpc2l0UmVtb3ZlZChkZWx0YSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCWlmIChERUJVRykKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRGVsdGEgYW5hbHlzaXMgbWF5IG5vdCBiZSBjb21wbGV0ZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBpZiB0aGUgZGVsdGEgaGFzIGNoaWxkcmVuLCBjb250aW51ZSB0byBhZGQvcmVtb3ZlIGZpbGVzCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdFJlbW92ZWQoSVJlc291cmNlRGVsdGEgZGVsdGEpIHsKLQkJCS8vIGhhbmRsZSBjbGVhbnVwCi0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSICYmIHIuZXhpc3RzKCkpIHsKLQkJCQkJZGVsZXRlSW5kZXgoKElGaWxlKSByKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgdmlzaXRBZGRlZChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM1NTMKLQkJCS8vIHF1aWNrIGNoZWNrIGlmIGl0J3MgZXZlbiBKU1AgcmVsYXRlZCB0byBpbXByb3ZlCi0JCQkvLyBwZXJmb3JtYW5jZQotCQkJLy8gY2hlY2tpbmcgbmFtZSBmcm9tIHRoZSBkZWx0YSBiZWZvcmUgZ2V0dGluZwotCQkJLy8gcmVzb3VyY2UgYmVjYXVzZSBpdCdzIGxpZ2h0ZXIKLQkJCWludCBudW1TZWdtZW50cyA9IGRlbHRhLmdldEZ1bGxQYXRoKCkuc2VnbWVudENvdW50KCk7Ci0JCQlTdHJpbmcgZmlsZW5hbWUgPSBkZWx0YS5nZXRGdWxsUGF0aCgpLnNlZ21lbnQobnVtU2VnbWVudHMgLSAxKTsKLQkJCWlmIChnZXRKc3BDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZW5hbWUpKSB7Ci0JCQkJSVJlc291cmNlIHIgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJCWlmIChyICE9IG51bGwgJiYgci5leGlzdHMoKSAmJiByLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCQl0aGlzLmpzcEZpbGVzLnB1dChyLmdldEZ1bGxQYXRoKCksIHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05MzQ2MwotCQlwcml2YXRlIGJvb2xlYW4gaXNIaWRkZW5SZXNvdXJjZShJUGF0aCBwKSB7Ci0JCQlTdHJpbmdbXSBzZWdtZW50cyA9IHAuc2VnbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoc2VnbWVudHNbaV0uc3RhcnRzV2l0aCgiLiIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGRlbGV0ZUluZGV4KElGaWxlIGZvbGRlcikgewotCQkJLy8gY2xlYW51cCBpbmRleAotCQkJSW5kZXhNYW5hZ2VyIGltID0gSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCk7Ci0JCQlJUGF0aCBmb2xkZXJQYXRoID0gZm9sZGVyLmdldEZ1bGxQYXRoKCk7Ci0JCQlJUGF0aCBpbmRleExvY2F0aW9uID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmNvbXB1dGVJbmRleExvY2F0aW9uKGZvbGRlclBhdGgpOwotCQkJaW0ucmVtb3ZlSW5kZXgoaW5kZXhMb2NhdGlvbik7Ci0JCQkvLyBpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVLZXkoZm9sZGVyUGF0aCk7Ci0JCQkvLyBpbS5pbmRleExvY2F0aW9ucy5yZW1vdmVWYWx1ZShpbmRleExvY2F0aW9uKTsKLQkJCUZpbGUgZiA9IGluZGV4TG9jYXRpb24udG9GaWxlKCk7Ci0JCQlmLmRlbGV0ZSgpOwotCQl9Ci0KLQkJcHVibGljIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIHRoaXMuanNwRmlsZXMudmFsdWVzKCkudG9BcnJheShuZXcgSUZpbGVbdGhpcy5qc3BGaWxlcy5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0KCkgewotCQkJdGhpcy5qc3BGaWxlcy5jbGVhcigpOwotCQl9Ci0JfQotCi0JLy8gZW5kIGNsYXNzIEpTUFJlc291cmNlVmlzaXRvcgotCi0JLyoqCi0JICogc2NoZWR1bGVzIEpTUCBmaWxlcyBmb3IgaW5kZXhpbmcgYnkgSmF2YSBjb3JlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQcm9jZXNzRmlsZXNKb2IgZXh0ZW5kcyBKb2IgewotCQlMaXN0IGZpbGVMaXN0ID0gbnVsbDsKLQkJLy8ga2VlcCB0cmFjayBvZiBob3cgbWFueSBmaWxlcyB3ZSd2ZSBpbmRleGVkCi0JCWludCBsYXN0RmlsZUN1cnNvciA9IDA7Ci0KLQkJUHJvY2Vzc0ZpbGVzSm9iKFN0cmluZyB0YXNrTmFtZSkgewotCQkJc3VwZXIodGFza05hbWUpOwotCQkJZmlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQotCQlzeW5jaHJvbml6ZWQgdm9pZCBwcm9jZXNzKElGaWxlW10gZmlsZXMpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlmaWxlTGlzdC5hZGQoZmlsZXNbaV0pOwotCQkJfQotCQkJaWYgKERFQlVHKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgcXVldWluZyAiICsgZmlsZXMubGVuZ3RoICsgIiBmaWxlcyIpOyAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXN5bmNocm9uaXplZCBJRmlsZVtdIGdldEZpbGVzKCkgewotCQkJcmV0dXJuIChJRmlsZVtdKSBmaWxlTGlzdC50b0FycmF5KG5ldyBJRmlsZVtmaWxlTGlzdC5zaXplKCldKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCB2b2lkIGNsZWFyRmlsZXMoKSB7Ci0JCQlmaWxlTGlzdC5jbGVhcigpOwotCQkJbGFzdEZpbGVDdXJzb3IgPSAwOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNsZWFyZWQgZmlsZXMiKTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaW5kZXhlciBtb25pdG9yIiArIG1vbml0b3IpOwotCQkJaWYgKGlzQ2FuY2VsZWQobW9uaXRvcikgfHwgZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0JCQl9Ci0KLQkJCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQkJdHJ5IHsKLQkJCQlJRmlsZVtdIGZpbGVzVG9CZVByb2Nlc3NlZCA9IGdldEZpbGVzKCk7Ci0KLQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgaW5kZXhpbmcgIiArIGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGggKyAiIGZpbGVzIik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLyBBUEkgaW5kaWNhdGVzIHRoYXQgbW9uaXRvciBpcyBuZXZlciBudWxsCi0JCQkJbW9uaXRvci5iZWdpblRhc2soIiIsIGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJSlNQU2VhcmNoU3VwcG9ydCBzcyA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJCQlTdHJpbmcgcHJvY2Vzc2luZ05GaWxlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQotCQkJCWZvciAoO2xhc3RGaWxlQ3Vyc29yIDwgZmlsZXNUb0JlUHJvY2Vzc2VkLmxlbmd0aDsgbGFzdEZpbGVDdXJzb3IrKykgewotCi0JCQkJCWlmIChpc0NhbmNlbGVkKG1vbml0b3IpIHx8IGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpIHsKLQkJCQkJCXNldENhbmNlbGVkU3RhdGUoKTsKLQkJCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCQkJfQotCQkJCQl0cnkgewotCQkJCQkJc3MuYWRkSnNwRmlsZShmaWxlc1RvQmVQcm9jZXNzZWRbbGFzdEZpbGVDdXJzb3JdKTsKLQkJCQkJCS8vIEpTUCBJbmRleGVyIHByb2Nlc3NpbmcgbiBmaWxlcwotCQkJCQkJcHJvY2Vzc2luZ05GaWxlcyA9IE5MUy5iaW5kKEpTUENvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMiwgbmV3IFN0cmluZ1tde0ludGVnZXIudG9TdHJpbmcoKGZpbGVzVG9CZVByb2Nlc3NlZC5sZW5ndGggLSBsYXN0RmlsZUN1cnNvcikpfSk7Ci0JCQkJCQltb25pdG9yLnN1YlRhc2socHJvY2Vzc2luZ05GaWxlcyArICIgLSAiICsgZmlsZXNUb0JlUHJvY2Vzc2VkW2xhc3RGaWxlQ3Vyc29yXS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQltb25pdG9yLndvcmtlZCgxKTsKLQotCQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgSm9iIGFkZGVkIGZpbGU6ICIgKyBmaWxlc1RvQmVQcm9jZXNzZWRbbGFzdEZpbGVDdXJzb3JdLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIFJBVExDMDAyODQ3NzYKLQkJCQkJCS8vIElTU1VFOiB3ZSBwcm9iYWJseSBzaG91bGRuJ3QgYmUgY2F0Y2hpbmcgRVZFUlkKLQkJCQkJCS8vIGV4Y2VwdGlvbiwgYnV0Ci0JCQkJCQkvLyB0aGUgZnJhbWV3b3JrIG9ubHkgYWxsb3dzIHRvIHJldHVybiBJU3RhdHVzIGluCi0JCQkJCQkvLyBvcmRlciB0byBjb21tdW5pY2F0ZQotCQkJCQkJLy8gdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZywgd2hpY2ggbWVhbnMgdGhlIGxvb3AKLQkJCQkJCS8vIHdvbid0IGNvbXBsZXRlLCBhbmQgd2Ugd291bGQgaGl0IHRoZSBzYW1lIHByb2JsZW0KLQkJCQkJCS8vIHRoZSBuZXh0IHRpbWUuCi0JCQkJCQkvLyAKLQkJCQkJCS8vIGEgcG9zc2libGUgc29sdXRpb24gaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUKLQkJCQkJCS8vIGV4Y2VwdGlvbnMgbG9nZ2VkCi0JCQkJCQkvLyBhbmQgb25seSBsb2cgYSBjZXJ0YWluIGFtdCBvZiB0aGUgc2FtZSBvbmUsCi0JCQkJCQkvLyBvdGhlcndpc2Ugc2tpcCBpdC4KLQkJCQkJCWlmICghZnJhbWV3b3JrSXNTaHV0dGluZ0Rvd24oKSkgewotCQkJCQkJCVN0cmluZyBmaWxlbmFtZSA9IGZpbGVzVG9CZVByb2Nlc3NlZFtsYXN0RmlsZUN1cnNvcl0gIT0gbnVsbCA/IGZpbGVzVG9CZVByb2Nlc3NlZFtsYXN0RmlsZUN1cnNvcl0uZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKU1BJbmRleGVyIHByb2JsZW0gaW5kZXhpbmc6IiArIGZpbGVuYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgZm9yCi0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBqdXN0IGluIGNhc2Ugc29tZXRoaW5nIGRpZG4ndCBmb2xsb3cgQVBJIChtb25pdG9yIGlzIG51bGwpCi0JCQkJaWYgKG1vbml0b3IgIT0gbnVsbCkKLQkJCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0KLQkJCS8vIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgY2xlYXIgZmlsZXMgbGlzdAotCQkJY2xlYXJGaWxlcygpOwotCQkJCi0JCQlsb25nIGZpbmlzaCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJbG9uZyBkaWZmID0gZmluaXNoIC0gc3RhcnQ7Ci0JCQlpZiAoREVCVUcpIHsKLQkJCQlmVG90YWxUaW1lICs9IGRpZmY7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoaXMgdGltZTogIiArIGRpZmYgKyAiIGN1bXVsYXRpdmUgdGltZSBmb3IgcmVzb3VyY2UgY2hhbmdlZDogIiArIGZUb3RhbFRpbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIHJ1bk1vbml0b3IpIHsKLQotCQkJYm9vbGVhbiBjYW5jZWxlZCA9IGZhbHNlOwotCQkJLy8gY2hlY2sgc3BlY2lmaWMgbW9uaXRvciBwYXNzZWQgaW50byBydW4gbWV0aG9kICh0aGUgcHJvZ3Jlc3MKLQkJCS8vIGdyb3VwIGluIHRoaXMgY2FzZSkKLQkJCS8vIGNoZWNrIG1haW4gc2VhcmNoIHN1cHBvcnQgY2FuY2VsZWQKLQkJCWlmIChydW5Nb25pdG9yICE9IG51bGwgJiYgcnVuTW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQkJY2FuY2VsZWQgPSB0cnVlOwotCQkJZWxzZSBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSkgewotCQkJCWNhbmNlbGVkID0gdHJ1ZTsKLQkJCQlpZiAocnVuTW9uaXRvciAhPSBudWxsKSB7Ci0JCQkJCXJ1bk1vbml0b3Iuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNhbmNlbGVkOwotCQl9Ci0JCQotCX0KLQotCS8vIGVuZCBjbGFzcyBQcm9jZXNzRmlsZXNKb2IKLQotCXByaXZhdGUgc3RhdGljIEpTUEluZGV4TWFuYWdlciBmU2luZ2xldG9uID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gaW5pdGlhbGl6ZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGluaXRpYWxpemluZyA9IHRydWU7Ci0KLQlwcml2YXRlIEluZGV4Sm9iQ29vcmRpbmF0b3IgaW5kZXhKb2JDb29yZGluYXRvcjsKLQlwcml2YXRlIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0KLQlwcml2YXRlIEpTUFJlc291cmNlVmlzaXRvciBmVmlzaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlSlNQID0gbnVsbDsKLQotCXN0YXRpYyBsb25nIGZUb3RhbFRpbWUgPSAwOwotCi0JLy8gSm9iIGZvciBwcm9jZXNzaW5nIHJlc291cmNlIGRlbHRhCi0JcHJpdmF0ZSBQcm9jZXNzRmlsZXNKb2IgcHJvY2Vzc0ZpbGVzSm9iID0gbnVsbDsKLQotCXByaXZhdGUgSlNQSW5kZXhNYW5hZ2VyKCkgewotCQlwcm9jZXNzRmlsZXNKb2IgPSBuZXcgUHJvY2Vzc0ZpbGVzSm9iKEpTUENvcmVNZXNzYWdlcy5KU1BJbmRleE1hbmFnZXJfMCk7Ci0JCS8vIG9ubHkgc2hvdyBpbiB2ZXJib3NlIG1vZGUKLQkJcHJvY2Vzc0ZpbGVzSm9iLnNldFN5c3RlbSh0cnVlKTsKLQkJcHJvY2Vzc0ZpbGVzSm9iLnNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJcHJvY2Vzc0ZpbGVzSm9iLmFkZEpvYkNoYW5nZUxpc3RlbmVyKG5ldyBKb2JDaGFuZ2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCQlzdXBlci5kb25lKGV2ZW50KTsKLQkJCQlzZXRTdGFibGVTdGF0ZSgpOwotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BJbmRleE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGZTaW5nbGV0b24gPT0gbnVsbCkKLQkJCWZTaW5nbGV0b24gPSBuZXcgSlNQSW5kZXhNYW5hZ2VyKCk7Ci0JCXJldHVybiBmU2luZ2xldG9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0KLQkJSlNQSW5kZXhNYW5hZ2VyIHNpbmdsZUluc3RhbmNlID0gZ2V0SW5zdGFuY2UoKTsKLQotCi0JCWlmICghc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6ZWQpIHsKLQkJCXNpbmdsZUluc3RhbmNlLmluaXRpYWxpemVkID0gdHJ1ZTsKLQotCQkJc2luZ2xlSW5zdGFuY2UuaW5kZXhKb2JDb29yZGluYXRvciA9IG5ldyBJbmRleEpvYkNvb3JkaW5hdG9yKCk7Ci0JCQlzaW5nbGVJbnN0YW5jZS5qc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQotCQkJLy8gYWRkZWQgYXMgSm9iQ2hhbmdlIGxpc3RlbmVyIHNvIEpTUEluZGV4TWFuYWdlciBjYW4gYmUgc21hcnRlcgotCQkJLy8gYWJvdXQgd2hlbiBpdCBydW5zCi0JCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIoc2luZ2xlSW5zdGFuY2UuaW5kZXhKb2JDb29yZGluYXRvcik7Ci0KLQkJCS8vIGFkZCBKU1BJbmRleE1hbmFnZXIgdG8ga2VlcCBKU1AgSW5kZXggdXAgdG8gZGF0ZQotCQkJLy8gbGlzdGVuaW5nIGZvciBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfREVMRVRFIGFuZAotCQkJLy8gSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGpzcFJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQotCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwOTEKLQkJCS8vIG1ha2VzIHN1cmUgSW5kZXhNYW5hZ2VyIGlzIGF3YXJlIG9mIG91ciBpbmRleGVzCi0JCQlzYXZlSW5kZXhlcygpOwotCQkJc2luZ2xlSW5zdGFuY2UuaW5pdGlhbGl6aW5nID0gZmFsc2U7Ci0KLQkJfQotCi0JfQotCQotCXN5bmNocm9uaXplZCB2b2lkIHNldEluZGV4U3RhdGUoaW50IHN0YXRlKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1BJbmRleE1hbmFnZXIgc2V0dGluZyBpbmRleCBzdGF0ZSB0bzogIiArIHN0YXRlMlN0cmluZyhzdGF0ZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJUGx1Z2luIGpzcE1vZGVsUGx1Z2luID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0JCWpzcE1vZGVsUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoUEtFWV9JTkRFWF9TVEFURSwgc3RhdGUpOwotCQlqc3BNb2RlbFBsdWdpbi5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHN0YXRlMlN0cmluZyhpbnQgc3RhdGUpIHsKLQkJU3RyaW5nIHMgPSAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKLQkJc3dpdGNoIChzdGF0ZSkgewotCQkJY2FzZSAoU19TVEFCTEUpIDoKLQkJCQlzID0gIlNfU1RBQkxFIjsgLy8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSAoU19VUERBVElORykgOgotCQkJCXMgPSAiU19VUERBVElORyI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgKFNfQ0FOQ0VMRUQpIDoKLQkJCQlzID0gIlNfQ0FOQ0VMRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIChTX1JFQlVJTERJTkcpIDoKLQkJCQlzID0gIlNfUkVCVUlMRElORyI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gczsKLQl9Ci0KLQlpbnQgZ2V0SW5kZXhTdGF0ZSgpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KFBLRVlfSU5ERVhfU1RBVEUpOwotCX0KLQotCXZvaWQgc2V0VXBkYXRpbmdTdGF0ZSgpIHsKLQkJLy9pZiAoZ2V0SW5kZXhTdGF0ZSgpICE9IFNfQ0FOQ0VMRUQpCi0JCXNldEluZGV4U3RhdGUoU19VUERBVElORyk7Ci0JfQotCi0Jdm9pZCBzZXRDYW5jZWxlZFN0YXRlKCkgewotCQlzZXRJbmRleFN0YXRlKEpTUEluZGV4TWFuYWdlci5TX0NBTkNFTEVEKTsKLQl9Ci0KLQl2b2lkIHNldFN0YWJsZVN0YXRlKCkgewotCQkvL2lmIChnZXRJbmRleFN0YXRlKCkgIT0gU19DQU5DRUxFRCkKLQkJc2V0SW5kZXhTdGF0ZShTX1NUQUJMRSk7Ci0JfQotCi0Jdm9pZCBzZXRSZWJ1aWxkaW5nU3RhdGUoKSB7Ci0JCXNldEluZGV4U3RhdGUoU19SRUJVSUxESU5HKTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgdm9pZCByZWJ1aWxkSW5kZXhJZk5lZWRlZCgpIHsKLQkJaWYgKGdldEluZGV4U3RhdGUoKSAhPSBTX1NUQUJMRSkgewotCQkJcmVidWlsZEluZGV4KCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlYnVpbGRJbmRleCgpIHsKLQotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIioqKiBKU1AgSW5kZXggdW5zdGFibGUsIHJlcXVlc3RpbmcgcmUtaW5kZXhpbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JCWdldEluZGV4aW5nSm9iKCkuYWRkSm9iQ2hhbmdlTGlzdGVuZXIobmV3IEpvYkNoYW5nZUFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhYm91dFRvUnVuKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmFib3V0VG9SdW4oZXZlbnQpOwotCQkJCXNldFJlYnVpbGRpbmdTdGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBkb25lKElKb2JDaGFuZ2VFdmVudCBldmVudCkgewotCQkJCXN1cGVyLmRvbmUoZXZlbnQpOwotCQkJCXNldFN0YWJsZVN0YXRlKCk7Ci0JCQkJZ2V0SW5kZXhpbmdKb2IoKS5yZW1vdmVKb2JDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJfSk7Ci0JCS8vIHdlJ3JlIGFib3V0IHRvIHJlaW5kZXggZXZlcnl0aGluZyBhbnl3YXkKLQkJZ2V0UHJvY2Vzc0ZpbGVzSm9iKCkuY2xlYXJGaWxlcygpOwotCQlnZXRJbmRleGluZ0pvYigpLnNjaGVkdWxlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBzY2hlZHVsZXMgYSBKb2IgdG8gcHJvY2VzcyBjb2xsZWN0ZWQgZmlsZXMuIEFsbCBKU1AKLQkgKiBpbmRleGluZyBzaG91bGQgYmUgZG9uZSB0aHJvdWdoIHRoaXMgbWV0aG9kIG9yIHByb2Nlc3NGaWxlcyhJRmlsZSBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlcwotCSAqLwotCWZpbmFsIHZvaWQgaW5kZXhGaWxlcyhJRmlsZVtdIGZpbGVzKSB7Ci0JCS8vIGRvbid0IHVzZSB0aGlzIHJ1bGUKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MzEKLQkJLy8gcHJvY2Vzc0ZpbGVzLnNldFJ1bGUobmV3IEluZGV4RmlsZVJ1bGUoKSk7Ci0JCXByb2Nlc3NGaWxlc0pvYi5wcm9jZXNzKGZpbGVzKTsKLQl9Ci0KLQotCS8qKgotCSAqIFBhY2thZ2UgcHJvdGVjdGVkIGZvciBhY2Nlc3MgYnkgaW5uZXIgSm9iIGNsYXNzIGluIHJlc291cmNlQ2hhbmdlZCguLi4pCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUpTUFJlc291cmNlVmlzaXRvciBnZXRWaXNpdG9yKCkgewotCi0JCWlmICh0aGlzLmZWaXNpdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZlZpc2l0b3IgPSBuZXcgSlNQUmVzb3VyY2VWaXNpdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZlZpc2l0b3I7Ci0JfQotCi0JLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwOTEKLQkvLyBtYWtlcyBzdXJlIEluZGV4TWFuYWdlciBpcyBhd2FyZSBvZiBvdXIgaW5kZXhlcwotCXZvaWQgc2F2ZUluZGV4ZXMoKSB7Ci0JCUluZGV4TWFuYWdlciBpbmRleE1hbmFnZXIgPSBKYXZhTW9kZWxNYW5hZ2VyLmdldEphdmFNb2RlbE1hbmFnZXIoKS5nZXRJbmRleE1hbmFnZXIoKTsKLQkJSVBhdGgganNwTW9kZWxXb3JraW5nTG9jYXRpb24gPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKTsKLQotCQlGaWxlIGZvbGRlciA9IG5ldyBGaWxlKGpzcE1vZGVsV29ya2luZ0xvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCVN0cmluZ1tdIGZpbGVzID0gZm9sZGVyLmxpc3QoKTsKLQkJU3RyaW5nIGxvY2F5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSW5kZXggaW5kZXggPSBudWxsOwotCQl0cnkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmaWxlc1tpXS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCIuaW5kZXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWxvY2F5ID0ganNwTW9kZWxXb3JraW5nTG9jYXRpb24udG9TdHJpbmcoKSArICIvIiArIGZpbGVzW2ldOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHJldXNlIGluZGV4IGZpbGUKLQkJCQkJaW5kZXggPSBuZXcgSW5kZXgobG9jYXksICJJbmRleCBmb3IgIiArIGxvY2F5LCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbmRleE1hbmFnZXIuc2F2ZUluZGV4KGluZGV4KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB3ZSBzaG91bGQgYmUgc2h1dHRpbmcgZG93biwgd2FudCB0byBzaHV0IGRvd24gcXVpZXRseQotCQkJaWYgKERFQlVHKQotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlJQ29udGVudFR5cGUgZ2V0SnNwQ29udGVudFR5cGUoKSB7Ci0JCWlmICh0aGlzLmZDb250ZW50VHlwZUpTUCA9PSBudWxsKQotCQkJdGhpcy5mQ29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIHRoaXMuZkNvbnRlbnRUeXBlSlNQOwotCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9IFBsYXRmb3JtLmdldEJ1bmRsZShPU0dJX0ZSQU1FV09SS19JRCkuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuU1RPUFBJTkc7Ci0JCWlmIChERUJVRyAmJiBzaHV0dGluZ0Rvd24pIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQSW5kZXhNYW5hZ2VyOiBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzaHV0dGluZ0Rvd247Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKLQotCQkvLyBzdG9wIGxpc3RlbmluZwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihqc3BSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQotCi0JCS8vIHN0b3AgYW55IHNlYXJjaGluZwotCQlKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuc2V0Q2FuY2VsZWQodHJ1ZSk7Ci0KLQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gam9icwotCQlQbGF0Zm9ybS5nZXRKb2JNYW5hZ2VyKCkucmVtb3ZlSm9iQ2hhbmdlTGlzdGVuZXIoaW5kZXhKb2JDb29yZGluYXRvcik7Ci0KLQotCQlpbnQgbWF4d2FpdCA9IDUwMDA7Ci0JCWlmIChwcm9jZXNzRmlsZXNKb2IgIT0gbnVsbCkgewotCQkJcHJvY2Vzc0ZpbGVzSm9iLmNhbmNlbCgpOwotCQl9Ci0JCS8vIGF0dGVtcHQgdG8gbWFrZSBzdXJlIHRoaXMgaW5kZXhpbmcgam9iIGlzIGxpdHRlcmFsbHkKLQkJLy8gZG9uZSBiZWZvcmUgY29udGludWluZywgc2luY2Ugd2UgYXJlIHNodXR0aW5nIGRvd24KLQkJd2FpdFRpbGxOb3RSdW5uaW5nKG1heHdhaXQsIHByb2Nlc3NGaWxlc0pvYik7Ci0KLQkJaWYgKGluZGV4aW5nSm9iICE9IG51bGwpIHsKLQkJCWluZGV4aW5nSm9iLmNhbmNlbCgpOwotCQl9Ci0JCXdhaXRUaWxsTm90UnVubmluZyhtYXh3YWl0LCBwcm9jZXNzRmlsZXNKb2IpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3YWl0VGlsbE5vdFJ1bm5pbmcoaW50IG1heFNlY29uZHMsIEpvYiBqb2IpIHsKLQkJaW50IHBhdXNlVGltZSA9IDEwOwotCQlpbnQgbWF4dHJpZXMgPSBtYXhTZWNvbmRzIC8gcGF1c2VUaW1lOwotCQlpbnQgY291bnQgPSAwOwotCQl3aGlsZSAoY291bnQrKyA8IG1heHRyaWVzICYmIGpvYi5nZXRTdGF0ZSgpID09IEpvYi5SVU5OSU5HKSB7Ci0JCQl0cnkgewotCQkJCVRocmVhZC5zbGVlcChwYXVzZVRpbWUpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY291bnQ6ICIgKyBjb3VudCArICIgbWF4OiAiICsKLQkJCQkvLyBtYXh0cmllcyk7Ci0JCQl9Ci0JCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEluZGV4Sm9iQ29vcmRpbmF0b3IgZXh0ZW5kcyBKb2JDaGFuZ2VBZGFwdGVyIHsKLQkJCi0JCXB1YmxpYyB2b2lkIGFib3V0VG9SdW4oSUpvYkNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlKb2Igam9iVG9Db29yZGluYXRlID0gZXZlbnQuZ2V0Sm9iKCk7Ci0JCQlpZiAoaXNKb2JUb0F2b2lkKGpvYlRvQ29vcmRpbmF0ZSkpIHsKLQkJCQkvLyBqb2Igd2lsbCBiZSByZXNjaGVkdWxlZCB3aGVuIHRoZSBqb2Igd2UKLQkJCQkvLyBhcmUgYXZvaWRpbmcgKGVnLiBidWlsZCkgaXMgZG9uZQotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLmNhbmNlbCgpOwotCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCJjYW5jZWw6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9uZShJSm9iQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJSm9iIGpvYlRvQ29vcmRpbmF0ZSA9IGV2ZW50LmdldEpvYigpOwotCQkJaWYgKGlzSm9iVG9Bdm9pZChqb2JUb0Nvb3JkaW5hdGUpKSB7Ci0JCQkJaWYgKGdldFByb2Nlc3NGaWxlc0pvYigpLmdldEZpbGVzKCkubGVuZ3RoID4gMCkgewotCQkJCQlnZXRQcm9jZXNzRmlsZXNKb2IoKS5zY2hlZHVsZSg1MDApOwotCQkJCQkvL1N5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGU6IiArIGpvYlRvQ29vcmRpbmF0ZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCQkJCi0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pvYlRvQXZvaWQoSm9iIGpvYlRvQ29vcmRpbmF0ZSkgewotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChqb2JUb0Nvb3JkaW5hdGUuYmVsb25nc1RvKFJlc291cmNlc1BsdWdpbi5GQU1JTFlfQVVUT19CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX01BTlVBTF9CVUlMRCkgfHwgam9iVG9Db29yZGluYXRlLmJlbG9uZ3NUbyhSZXNvdXJjZXNQbHVnaW4uRkFNSUxZX0FVVE9fUkVGUkVTSCkpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIEpTUFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciNyZXNvdXJjZUNoYW5nZWQob3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQotCQkJaWYgKGlzSW5pdGlhbGl6aW5nKCkpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBpZ25vcmUgcmVzb3VyY2UgY2hhbmdlcyBpZiBhbHJlYWR5IHJlYnVpbGRpbmcKLQkJCWlmIChnZXRJbmRleFN0YXRlKCkgPT0gU19SRUJVSUxESU5HKQotCQkJCXJldHVybjsKLQkJCS8vIHByZXZpb3VzbHkgY2FuY2VsZWQsIG5lZWRzIGVudGlyZSBpbmRleCByZWJ1aWxkCi0JCQlpZiAoZ2V0SW5kZXhTdGF0ZSgpID09IFNfQ0FOQ0VMRUQpIHsKLQkJCQkvLyByZWJ1aWxkSW5kZXgoKTsKLQkJCQkvLyBqdXN0IHJlc3VtZSBpbmRleGluZwotCQkJCWdldFByb2Nlc3NGaWxlc0pvYigpLnNjaGVkdWxlKDUwMCk7Ci0JCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInNjaGVkdWxlOiByZXNvdXJjZSBjaGFuZ2VkLCBwcmV2aW91c2x5IGNhbmNlbGVkIik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgIT0gbnVsbCkgewotCQkJCS8vIG9ubHkgY2FyZSBhYm91dCBhZGRzIG9yIGNoYW5nZXMgcmlnaHQgbm93Li4uCi0JCQkJaW50IGtpbmQgPSBkZWx0YS5nZXRLaW5kKCk7Ci0JCQkJYm9vbGVhbiBhZGRlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQURERUQpID09IElSZXNvdXJjZURlbHRhLkFEREVEOwotCQkJCWJvb2xlYW4gY2hhbmdlZCA9IChraW5kICYgSVJlc291cmNlRGVsdGEuQ0hBTkdFRCkgPT0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKLQkJCQlpZiAoYWRkZWQgfHwgY2hhbmdlZCkgewotCi0JCQkJCS8vIG9ubHkgYW5hbHl6ZSB0aGUgZnVsbCAoc3RhcnRpbmcgYXQgcm9vdCkgZGVsdGEKLQkJCQkJLy8gaGllcmFyY2h5Ci0JCQkJCWlmIChkZWx0YS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdHJ5IHsKLQkJCQkJCQlKU1BSZXNvdXJjZVZpc2l0b3IgdiA9IGdldFZpc2l0b3IoKTsKLQkJCQkJCQkvLyBjbGVhciBmcm9tIGxhc3QgcnVuCi0JCQkJCQkJdi5yZXNldCgpOwotCQkJCQkJCS8vIGNvdW50IGZpbGVzLCBwb3NzaWJseSBkbyB0aGlzIGluIGEgam9iIHRvby4uLgotCQkJCQkJCS8vIGRvbid0IGluY2x1ZGUgUEhBTlRPTSByZXNvdXJjZXMKLQkJCQkJCQlkZWx0YS5hY2NlcHQodiwgZmFsc2UpOwotCi0JCQkJCQkJLy8gcHJvY2VzcyBmaWxlcyBmcm9tIHRoaXMgZGVsdGEKLQkJCQkJCQlJRmlsZVtdIGZpbGVzID0gdi5nZXRGaWxlcygpOwotCQkJCQkJCWlmIChmaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCS8qCi0JCQkJCQkJCSAqIEpvYiBjaGFuZ2UgbGlzdGVuZXIgc2hvdWxkIHNldCBiYWNrIHRvCi0JCQkJCQkJCSAqIHN0YWJsZSB3aGVuIGZpbmlzaGVkCi0JCQkJCQkJCSAqLwotCQkJCQkJCQlzZXRVcGRhdGluZ1N0YXRlKCk7Ci0JCQkJCQkJCS8vIHByb2Nlc3NGaWxlcyhmaWxlcyk7Ci0JCQkJCQkJCWluZGV4RmlsZXMoZmlsZXMpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBuZWVkIHRvIHNldCBzdGF0ZSBoZXJlIHNvbWVob3csIGFuZCByZWluZGV4Ci0JCQkJCQkJLy8gb3RoZXJ3aXNlIGluZGV4IHdpbGwgYmUgdW5yZWxpYWJsZQotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIG5lZWQgdG8gc2V0IHN0YXRlIGhlcmUgc29tZWhvdywgYW5kIHJlaW5kZXgKLQkJCQkJCQkvLyBvdGhlcndpc2UgaW5kZXggd2lsbCBiZSB1bnJlbGlhYmxlCi0JCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCX0KLQotCUluZGV4V29ya3NwYWNlSm9iIGdldEluZGV4aW5nSm9iKCkgewotCQlyZXR1cm4gaW5kZXhpbmdKb2I7Ci0JfQotCi0JUHJvY2Vzc0ZpbGVzSm9iIGdldFByb2Nlc3NGaWxlc0pvYigpIHsKLQkJcmV0dXJuIHByb2Nlc3NGaWxlc0pvYjsKLQl9Ci0KLQlib29sZWFuIGlzSW5pdGlhbGl6aW5nKCkgewotCQlyZXR1cm4gaW5pdGlhbGl6aW5nOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQUGF0aEluZGV4ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkxOWY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFBhdGhJbmRleGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci0KLS8qKgotICogcGFfVE9ETyBTdGlsbCBuZWVkIHRvIHRha2UgaW50byBjb25zaWRlcmF0aW9uOgotICogCS0gZm9jdXMgaW4gd29ya3NwYWNlCi0gKiAgLSBzZWFyY2ggcGF0dGVybgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQUGF0aEluZGV4ZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLy8gdmlzaXRvciB0aGF0IHJldHJpZXZlcyBqc3AgcHJvamVjdCBwYXRocyBmb3IgYWxsIGpzcCBmaWxlcyBpbiB0aGUgd29ya3NwYWNlCi0JY2xhc3MgSlNQRmlsZVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQkvLyBoYXNoIG1hcCBmb3JjZXMgb25seSBvbmUgb2YgZWFjaCBmaWxlCi0JCXByaXZhdGUgSGFzaE1hcCBmUGF0aHMgPSBuZXcgSGFzaE1hcCgpOwotCQlJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0JCVNlYXJjaFBhdHRlcm4gZlBhdHRlcm4gPSBudWxsOwotCi0JCXB1YmxpYyBKU1BGaWxlVmlzaXRvcihTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUpIHsKLQkJCXRoaXMuZlBhdHRlcm4gPSBwYXR0ZXJuOwotCQkJdGhpcy5mU2NvcGUgPSBzY29wZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQkKLQkJCWlmKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJCi0JCQlpZiAocHJveHkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0KLQkJCQlJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzU1MwotCQkJCS8vIGNoZWNrIHRoaXMgYmVmb3JlIGRlc2NyaXB0aW9uCi0JCQkJLy8gY2hlY2sgbmFtZSBiZWZvcmUgYWN0dWFsbHkgZ2V0dGluZyB0aGUgZmlsZSAobGVzcyB3b3JrKQotCQkJCWlmKGNvbnRlbnRUeXBlSlNQLmlzQXNzb2NpYXRlZFdpdGgocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQkKLQkJCQkJSUZpbGUgZmlsZSA9IChJRmlsZSlwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBjb250ZW50RGVzY3JpcHRpb24gPSBmaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlTdHJpbmcgY3RJZCA9IG51bGw7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJY3RJZCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpLmdldElkKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AuZXF1YWxzKGN0SWQpKSB7Ci0JCQkJCQlpZiAodGhpcy5mU2NvcGUuZW5jbG9zZXMocHJveHkucmVxdWVzdEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpIHsKLQkKLQkJCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIHNlbGVjdGVkIGluZGV4IHBhdGg6IiArIGZpbGUuZ2V0UGFyZW50KCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJCWZQYXRocy5wdXQoZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLCBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuY29tcHV0ZUluZGV4TG9jYXRpb24oZmlsZS5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyBJUGF0aFtdIGdldFBhdGhzKCkgewotCQkJcmV0dXJuIChJUGF0aFtdKSBmUGF0aHMudmFsdWVzKCkudG9BcnJheShuZXcgSVBhdGhbZlBhdGhzLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JcHVibGljIElQYXRoW10gZ2V0VmlzaWJsZUpzcFBhdGhzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCi0JCUpTUEZpbGVWaXNpdG9yIGpzcEZpbGVWaXNpdG9yID0gbmV3IEpTUEZpbGVWaXNpdG9yKHBhdHRlcm4sIHNjb3BlKTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuYWNjZXB0KGpzcEZpbGVWaXNpdG9yLCAwKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlVmlzaXRvci5nZXRQYXRocygpOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjM4MjJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotCi0vKioKLSAqIENyZWF0ZWQgd2l0aCBhIC5qc3AgZmlsZSwgYnV0IHNob3VsZCBhcHBlYXIgdG8gYmUgYSAuamF2YSBmaWxlIGZvciBpbmRleGluZwotICogYW5kIHNlYXJjaGluZyBwdXJwb3Nlcy4gVGhlcmUgYXJlIHB1cnBvc2VseSBmZXcgZmllbGRzIGluIHRoaXMgY2xhc3MsIGFuZAotICogdGhvc2UgZmllbGRzIGFyZSBsaWdodHdlaWdodCBzaW5jZSBpdCdzIHBvc3NpYmxlIGZvciBtYW55IEpTUCBzZWFyY2gKLSAqIGRvY3VtZW50cyB0byBleGlzdCBpbiBtZW1vcnkgYXQgb25lIHRpbWUgKGVnLiBhZnRlciBpbXBvcnRpbmcgYSBwcm9qZWN0Ci0gKiB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIEpTUCBmaWxlcykKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaERvY3VtZW50IHsKLQotCXByaXZhdGUgU3RyaW5nIFVOS05PV05fUEFUSCA9ICIqKnBhdGggdW5rbm93bioqIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZKU1BQYXRoU3RyaW5nID0gVU5LTk9XTl9QQVRIOwotCXByaXZhdGUgU3RyaW5nIGZDVVBhdGggPSBVTktOT1dOX1BBVEg7Ci0JcHJpdmF0ZSBTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCXByaXZhdGUgbG9uZyBmTGFzdE1vZGlmaWVkU3RhbXA7Ci0JcHJpdmF0ZSBjaGFyW10gZkNhY2hlZENoYXJDb250ZW50czsKLQkKLQkvKioKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEBwYXJhbSBwYXJ0aWNpcGFudAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBKU1BTZWFyY2hEb2N1bWVudChTdHJpbmcgZmlsZVBhdGgsIFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJdGhpcy5mSlNQUGF0aFN0cmluZyA9IGZpbGVQYXRoOwotCQl0aGlzLmZQYXJ0aWNpcGFudCA9IHBhcnRpY2lwYW50OwotCX0KLQotCXB1YmxpYyBTZWFyY2hQYXJ0aWNpcGFudCBnZXRQYXJ0aWNpcGFudCgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldENoYXJDb250ZW50cygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCQotCQlpZihmQ2FjaGVkQ2hhckNvbnRlbnRzID09IG51bGwgfHwgaXNEaXJ0eSgpKSB7Ci0JCSAgICBKU1BUcmFuc2xhdGlvbiB0cmFucyA9IGdldEpTUFRyYW5zbGF0aW9uKCk7ICAgIAotCQkgICAgZkNhY2hlZENoYXJDb250ZW50cyA9IHRyYW5zICE9IG51bGwgPyB0cmFucy5nZXRKYXZhVGV4dCgpLnRvQ2hhckFycmF5KCkgOiBuZXcgY2hhclswXTsKLQkJICAgIGZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkQ2hhckNvbnRlbnRzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGdldENoYXJDb250ZW50cygpKTsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBJdCdzIG5vdCByZWNvbW1lbmRlZCBmb3IgY2xpZW50cyB0byBob2xkIG9uIHRvIHRoaXMgSlNQVHJhbnNsYXRpb24KLQkgKiBzaW5jZSBpdCdzIGtpbmQgb2YgbGFyZ2UuIElmIHBvc3NpYmxlLCBob2xkIG9uIHRvIHRoZQotCSAqIEpTUFNlYXJjaERvY3VtZW50LCB3aGljaCBpcyBtb3JlIG9mIGEgbGlnaHR3ZWlnaHQgcHJveHkuCi0JICogCi0JICogQHJldHVybiB0aGUgSlNQVHJhbnNsYXRpb24gZm9yIHRoZSBqc3AgZmlsZSwgb3IgbnVsbCBpZiBpdCdzIGFuCi0JICogICAgICAgICB1bnN1cHBvcnRlZCBmaWxlLgotCSAqLwotCXB1YmxpYyBmaW5hbCBKU1BUcmFuc2xhdGlvbkV4dGVuc2lvbiBnZXRKU1BUcmFuc2xhdGlvbigpIHsKLQkJSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCQlJRmlsZSBqc3BGaWxlID0gZ2V0RmlsZSgpOwotCQlpZiAoIUpTUFNlYXJjaFN1cHBvcnQuaXNKc3AoanNwRmlsZSkpCi0JCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQgZXhpc3RpbmcgbW9kZWwgZm9yIHJlYWQsIHRoZW4gZ2V0IGRvY3VtZW50IGZyb20gaXQKLQkJCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCQlpZiAobW9kZWxNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQltb2RlbCA9IG1vZGVsTWFuYWdlci5nZXRNb2RlbEZvclJlYWQoanNwRmlsZSk7Ci0JCQl9Ci0JCQkvLyBoYW5kbGUgdW5zdXBwb3J0ZWQKLQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpbW9kZWw7Ci0JCQkJc2V0dXBBZGFwdGVyRmFjdG9yeSh4bWxNb2RlbCk7Ci0JCQkJSURPTURvY3VtZW50IGRvYyA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoSlNQVHJhbnNsYXRpb25BZGFwdGVyKSBkb2MuZ2V0QWRhcHRlckZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQkJCXRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwgZSkgewotCQkJLy8gbm8gbmVlZCB0byBsb2cgdGhpcy4gSnVzdCBjb25zaWRlciBpdCBhbiBpbnZhbGlkIGZpbGUgZm9yIG91cgotCQkJLy8gcHVycG9zZXMuCi0JCQkvLyBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHRyYW5zbGF0aW9uOwotCX0KLQotCS8qKgotCSAqIGFkZCB0aGUgZmFjdG9yeSBmb3IgSlNQVHJhbnNsYXRpb25BZGFwdGVyIGhlcmUKLQkgKiAKLQkgKiBAcGFyYW0gc20KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBBZGFwdGVyRmFjdG9yeShJU3RydWN0dXJlZE1vZGVsIHNtKSB7Ci0JCUpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBKU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JfQotCi0JLyoqCi0JICogdGhlIHBhdGggdG8gdGhlIEphdmEgY29tcGlsYXRpb24gdW5pdAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50I2dldFBhdGgoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKLQkgICAgLy8gY2FjaGluZyB0aGUgcGF0aCBzaW5jZSBpdCdzIGV4cGVuc2l2ZSB0byBnZXQgdHJhbnNsYXRpb24KLQkJLy8gaW1wb3J0YW50IHRoYXQgaXNEaXJ0eSgpIGNoZWNrIGlzIHNlY29uZCB0byBjYWNoZSBtb2RpZmljYXRpb24gc3RhbXAKLQkgICAgaWYodGhpcy5mQ1VQYXRoID09IG51bGwgfHwgaXNEaXJ0eSgpIHx8IHRoaXMuZkNVUGF0aCA9PSBVTktOT1dOX1BBVEgpIHsKLQkgICAgICAgIEpTUFRyYW5zbGF0aW9uIHRyYW5zID0gZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkgICAgICAgIGlmKHRyYW5zICE9IG51bGwpIHsKLQkgICAgICAgICAgICB0aGlzLmZDVVBhdGggPSB0cmFucy5nZXRKYXZhUGF0aCgpOwotCSAgICAgICAgICAgIC8vIHNhdmUgc2luY2UgaXQncyBleHBlbnNpdmUgdG8gY2FsY3VsYXRlIGFnYWluIGxhdGVyCi0JICAgICAgICAgICAgZkNhY2hlZENoYXJDb250ZW50cyA9IHRyYW5zLmdldEphdmFUZXh0KCkudG9DaGFyQXJyYXkoKTsKLQkgICAgICAgIH0KLQkgICAgfQotCQlyZXR1cm4gZkNVUGF0aCAhPSBudWxsID8gZkNVUGF0aCA6IFVOS05PV05fUEFUSDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEpzcE9mZnNldChpbnQgamF2YU9mZnNldCkgewotCQkvLyBjb3BpZWQgZnJvbSBKU1BUcmFuc2xhdGlvbgotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBvZmZzZXRJblJhbmdlID0gMDsKLQkJUG9zaXRpb24ganNwUG9zLCBqYXZhUG9zID0gbnVsbDsKLQkJSlNQVHJhbnNsYXRpb24gdHJhbnMgPSBnZXRKU1BUcmFuc2xhdGlvbigpOwotCQlpZiAodHJhbnMgIT0gbnVsbCkgewotCQkJSGFzaE1hcCBqYXZhMmpzcE1hcCA9IHRyYW5zLmdldEphdmEySnNwTWFwKCk7Ci0KLQkJCS8vIGl0ZXJhdGUgYWxsIG1hcHBlZCBqYXZhIHJhbmdlcwotCQkJSXRlcmF0b3IgaXQgPSBqYXZhMmpzcE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCWphdmFQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCQkvLyBuZWVkIHRvIGNvdW50IHRoZSBsYXN0IHBvc2l0aW9uIGFzIGluY2x1ZGVkCi0JCQkJaWYgKCFqYXZhUG9zLmluY2x1ZGVzKGphdmFPZmZzZXQpICYmICEoamF2YVBvcy5vZmZzZXQgKyBqYXZhUG9zLmxlbmd0aCA9PSBqYXZhT2Zmc2V0KSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlvZmZzZXRJblJhbmdlID0gamF2YU9mZnNldCAtIGphdmFQb3Mub2Zmc2V0OwotCQkJCWpzcFBvcyA9IChQb3NpdGlvbikgamF2YTJqc3BNYXAuZ2V0KGphdmFQb3MpOwotCi0JCQkJaWYgKGpzcFBvcyAhPSBudWxsKQotCQkJCQlyZXN1bHQgPSBqc3BQb3Mub2Zmc2V0ICsgb2Zmc2V0SW5SYW5nZTsKLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJqc3BQb3NpdGlvbiB3YXMgbnVsbCEiICsgamF2YU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCUlQYXRoIGpzcFBhdGggPSBuZXcgUGF0aCh0aGlzLmZKU1BQYXRoU3RyaW5nKTsKLQkJSUZpbGUganNwRmlsZSA9IHJvb3QuZ2V0RmlsZShqc3BQYXRoKTsKLQkJaWYgKCFqc3BGaWxlLmV4aXN0cygpKSB7Ci0JCQkvLyBwb3NzaWJseSBvdXRzaWRlIHdvcmtzcGFjZQotCQkJanNwRmlsZSA9IHJvb3QuZ2V0RmlsZUZvckxvY2F0aW9uKGpzcFBhdGgpOwotCQl9Ci0JCXJldHVybiBqc3BGaWxlOwotCX0KLQotCQotCXByaXZhdGUgYm9vbGVhbiBpc0RpcnR5KCkgewotCQlib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7Ci0JCUlGaWxlIGYgPSBnZXRGaWxlKCk7Ci0JCWlmKGYgIT0gbnVsbCkgewotCQkJbG9uZyBjdXJyZW50U3RhbXAgPSBmLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0JCQlpZihjdXJyZW50U3RhbXAgIT0gZkxhc3RNb2RpZmllZFN0YW1wKQotCQkJCW1vZGlmaWVkID0gdHJ1ZTsKLQkJCWZMYXN0TW9kaWZpZWRTdGFtcCA9IGN1cnJlbnRTdGFtcDsKLQkJfQotCQlyZXR1cm4gbW9kaWZpZWQ7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gbm93IHNpbmNlIEpTUFRyYW5zbGF0aW9uIGlzIGNyZWF0ZWQgb24gdGhlIGZseQotCX0KLQotCS8qKgotCSAqIGZvciBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIltKU1BTZWFyY2hEb2N1bWVudDoiICsgdGhpcy5mSlNQUGF0aFN0cmluZyArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRFbmNvZGluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudCNnZXRCeXRlQ29udGVudHMoKQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYTNkNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhcnRpY2lwYW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogSW50ZWdyYXRpb24gb2YgSlNQIHcvIGphdmEgc2VhcmNoLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoUGFydGljaXBhbnQgZXh0ZW5kcyBTZWFyY2hQYXJ0aWNpcGFudCB7Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IGNhbGN1bGF0ZVZhbHVlKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGNhbGN1bGF0ZVZhbHVlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gZGVidWcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVidWc7Ci0JfQotCi0JLyoqCi0JICogSW1wb3J0YW50IHRvIG5ldmVyIHJldHVybiBudWxsIGhlcmUgb3IgZWxzZSBKYXZhIHNlYXJjaCBwYXJ0aWNpcGF0aW9uCi0JICogd2lsbCBicmVhay4KLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoU3RyaW5nIGRvY3VtZW50UGF0aCkgewotCQlTZWFyY2hEb2N1bWVudCBzRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KGRvY3VtZW50UGF0aCk7Ci0KLQkJaWYgKHNEb2MgPT0gbnVsbCkgewotCQkJLy8gcmV0dXJuIGEgZHVtbXkgZG9jIGhlcmUgc28gc2VhcmNoIHBhcnRpY2lwYXRpb24gZG9lc24ndCBicmVhawotCQkJcmV0dXJuIG5ldyBOdWxsU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnRQYXRoKTsKLQkJfQotCQlyZXR1cm4gc0RvYzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIkpTUCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBhdGhbXSBzZWxlY3RJbmRleGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUphdmFTZWFyY2hTY29wZSBzY29wZSkgewotCQlKU1BQYXRoSW5kZXhlciBpbmRleGVyID0gbmV3IEpTUFBhdGhJbmRleGVyKCk7Ci0JCXJldHVybiBpbmRleGVyLmdldFZpc2libGVKc3BQYXRocyhwYXR0ZXJuLCBzY29wZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5kZXhEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgSVBhdGggaW5kZXhQYXRoKSB7Ci0JCWlmICghKGRvY3VtZW50IGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUpKQotCQkJcmV0dXJuOwotCi0JCS8vIHVzZSBKYXZhIHNlYXJjaCBpbmRleGluZwotCQlTZWFyY2hFbmdpbmUuZ2V0RGVmYXVsdFNlYXJjaFBhcnRpY2lwYW50KCkuaW5kZXhEb2N1bWVudChkb2N1bWVudCwgaW5kZXhQYXRoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaERvY3VtZW50W10gaW5kZXhNYXRjaGVzLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCWlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZmlsdGVyIG91dCBudWxsIG1hdGNoZXMKLQkJTGlzdCBmaWx0ZXJlZCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJU2VhcmNoRG9jdW1lbnQgbWF0Y2ggPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGV4TWF0Y2hlcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgcG9zc2libGUgbWF0Y2hpbmcgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGU6ICIgKyBpbmRleE1hdGNoZXNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQltYXRjaCA9IGluZGV4TWF0Y2hlc1tpXTsKLQkJCWlmIChtYXRjaCAhPSBudWxsKSB7Ci0JCQkJLy8gc29tZSBtYXRjaGVzIG1heSBiZSBudWxsLCBvciBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIGRhdGUsCi0JCQkJLy8gdGhlIGZpbGUgbWF5IG5vdCBldmVuIGV4aXN0Ci0JCQkJaWYgKG1hdGNoIGluc3RhbmNlb2YgSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgJiYgKChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgbWF0Y2gpLmdldEZpbGUoKS5leGlzdHMoKSkKLQkJCQkJZmlsdGVyZWQuYWRkKG1hdGNoKTsKLQkJCX0KLQkJfQotCi0JCWluZGV4TWF0Y2hlcyA9IChTZWFyY2hEb2N1bWVudFtdKSBmaWx0ZXJlZC50b0FycmF5KG5ldyBTZWFyY2hEb2N1bWVudFtmaWx0ZXJlZC5zaXplKCldKTsKLQkJU2VhcmNoRW5naW5lLmdldERlZmF1bHRTZWFyY2hQYXJ0aWNpcGFudCgpLmxvY2F0ZU1hdGNoZXMoaW5kZXhNYXRjaGVzLCBwYXR0ZXJuLCBzY29wZSwgcmVxdWVzdG9yLCBtb25pdG9yKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudCNnZXREb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSkKLQkgKi8KLQlwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0RG9jdW1lbnQoSUZpbGUgZmlsZSkgewotCQkvLyBuZXZlciBnZXRzIGNhbGxlZD8KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU2NvcGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDljYzI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFNjb3BlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VQcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5JSmF2YVNlYXJjaFNjb3BlOwotCi0vKioKLSAqIFVzZWQgdG8gY29uc3RyYWluIEpTUC9qYXZhIHNlYXJjaCB0byBjZXJ0YWluIHBhdGhzIGFuZCBlbGVtZW50cy4KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTZWFyY2hTY29wZSBpbXBsZW1lbnRzIElKYXZhU2VhcmNoU2NvcGUgewotCi0JcHJpdmF0ZSBib29sZWFuIGZFbmNsb3Nlc0FsbCA9IGZhbHNlOwotCXByaXZhdGUgTGlzdCBmUmVzb3VyY2VQYXRocyA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZKYXZhRWxlbWVudHMgPSBudWxsOwotCi0JcHVibGljIEpTUFNlYXJjaFNjb3BlKCkgewotCQkvLyBlbXB0eSBjb25zdHJ1Y3RvciBqdXN0IHJldHVybnMgdHJ1ZSBmb3IgZXZlcnl0aGluZwotCQkvLyBldmVyeXRoaW5nIGlzIGluIHNjb3BlCi0JCXRoaXMuZkVuY2xvc2VzQWxsID0gdHJ1ZTsKLQkJaW5pdCgpOwotCX0KLQotCXB1YmxpYyBKU1BTZWFyY2hTY29wZShTdHJpbmdbXSByZXNvdXJjZVN0cmluZ1BhdGgpIHsKLQkJaW5pdCgpOwotCQlmUmVzb3VyY2VQYXRocy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZVN0cmluZ1BhdGgpKTsKLQl9Ci0KLQlwdWJsaWMgSlNQU2VhcmNoU2NvcGUoSUphdmFFbGVtZW50W10gamF2YUVsZW1lbnQpIHsKLQkJaW5pdCgpOwotCQlmSmF2YUVsZW1lbnRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGphdmFFbGVtZW50KSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCXRoaXMuZlJlc291cmNlUGF0aHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCXRoaXMuZkphdmFFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhTdHJpbmcgcmVzb3VyY2VQYXRoU3RyaW5nKSB7Ci0KLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGVuY2xvc2VzUGF0aChyZXNvdXJjZVBhdGhTdHJpbmcpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVuY2xvc2VzKElKYXZhRWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJLy8gcGFfVE9EIGltcGxlbWVudAotCQlpZiAodGhpcy5mRW5jbG9zZXNBbGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBlbmNsb3NlcyhJUmVzb3VyY2VQcm94eSBlbGVtZW50KSB7Ci0KLQkJaWYgKHRoaXMuZkVuY2xvc2VzQWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGVuY2xvc2VzUGF0aChlbGVtZW50LnJlcXVlc3RGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXRoKFN0cmluZyBwYXRoKSB7Ci0JCXRoaXMuZlJlc291cmNlUGF0aHMuYWRkKHBhdGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEVsZW1lbnQoSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJdGhpcy5mSmF2YUVsZW1lbnRzLmFkZChlbGVtZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5jbG9zZXNQYXRoKFN0cmluZyBwb3NzaWJsZSkgewotCi0JCVN0cmluZ1tdIHBhdGhzID0gKFN0cmluZ1tdKSBmUmVzb3VyY2VQYXRocy50b0FycmF5KG5ldyBTdHJpbmdbZlJlc291cmNlUGF0aHMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChwb3NzaWJsZS5lcXVhbHMocGF0aHNbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCi0JCXJldHVybiAiSlNQU2VhcmNoU2NvcGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElQYXRoW10gZW5jbG9zaW5nUHJvamVjdHNBbmRKYXJzKCkgewotCi0JCS8vIHBhX1RPRE8KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaW5jbHVkZXNCaW5hcmllcygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGluY2x1ZGVzQ2xhc3NwYXRocygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluY2x1ZGVzQmluYXJpZXMoYm9vbGVhbiBpbmNsdWRlc0JpbmFyaWVzKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbmNsdWRlc0NsYXNzcGF0aHMoYm9vbGVhbiBpbmNsdWRlc0NsYXNzcGF0aHMpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFN1cHBvcnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU3VwcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY4ZGU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoU3VwcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hFbmdpbmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5KYXZhTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1AyU2VydmxldE5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotCi0vKioKLSAqIENlbnRyYWwgYWNjZXNzIHRvIGphdmEgaW5kZXhpbmcgYW5kIHNlYXJjaC4gQWxsIGNvbnRhY3QgYmV0d2VlbiBKRFQgaW5kZXhpbmcKLSAqIGFuZCBTZWFyY2hpbmcgc2hvdWxkIGJlIGRvbmUgdGhyb3VnaCBoZXJlLgotICogCi0gKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZSB2aWEKLSAqIDxjb2RlPmdldEluc3RhbmNlKCk8L2NvZGU+LgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2VhcmNoU3VwcG9ydCB7Ci0KLSAgICAvLyBmb3IgZGVidWdnaW5nCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0gICAgc3RhdGljIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgSlNQU2VhcmNoU3VwcG9ydCBzaW5nbGV0b24gPSBudWxsOwotCi0gICAgcHJpdmF0ZSBKU1BTZWFyY2hQYXJ0aWNpcGFudCBmUGFydGljaXBhbnQgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBJUGF0aCBmSnNwUGx1Z2luTG9jYXRpb24gPSBudWxsOwotCi0gICAgLy8gcGFfVE9ETyBtYXkgYmUgc2xvdyAoZXNwIGZvciBpbmRleGluZyBlbnRpcmUgd29ya3NwYWNlKQotICAgIHByaXZhdGUgZmluYWwgQ1JDMzIgZkNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwotCi0gICAgLyoqIG1haW4gY2FuY2VsIG1vbnRpb3IgZm9yIGFsbCBzZWFyY2ggc3VwcG9ydCAqLwotICAgIHByaXZhdGUgZmluYWwgSVByb2dyZXNzTW9uaXRvciBmTW9uaXRvciA9IG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCk7Ci0KLSAgICBwcml2YXRlIEpTUFNlYXJjaFN1cHBvcnQoKSB7Ci0gICAgICAgIC8vIGZvcmNlIHVzZSBvZiBzaW5nbGUgaW5zdGFuY2UKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIG9wZXJhdGlvbiBlbnN1cmVzIHRoYXQgdGhlIGxpdmUgcmVzb3VyY2UncyBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluCi0gICAgICogdGhlIG9wZW4gZWRpdG9yLiBJdCBhbHNvIGFsbG93cyB0aGUgYWJpbGl0eSB0byBwYXNzIGluIGEgUHJvZ3Jlc3NNb25pdG9yCi0gICAgICovCi0gICAgcHJpdmF0ZSBjbGFzcyBTZWFyY2hKb2IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJSmF2YVNlYXJjaENvbnN0YW50cyB7Ci0KLSAgICAgICAgU3RyaW5nIGZTZWFyY2hUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICBJSmF2YVNlYXJjaFNjb3BlIGZTY29wZSA9IG51bGw7Ci0KLSAgICAgICAgaW50IGZTZWFyY2hGb3IgPSBGSUVMRDsKLQotICAgICAgICBpbnQgZkxpbWl0VG8gPSBBTExfT0NDVVJSRU5DRVM7Ci0KLSAgICAgICAgaW50IGZNYXRjaE1vZGUgPSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSDsKLQotICAgICAgICBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmUgPSBmYWxzZTsKLQotICAgICAgICBTZWFyY2hSZXF1ZXN0b3IgZlJlcXVlc3RvciA9IG51bGw7Ci0KLSAgICAgICAgSUphdmFFbGVtZW50IGZFbGVtZW50ID0gbnVsbDsKLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBqYXZhIGVsZW1lbnQKLSAgICAgICAgcHVibGljIFNlYXJjaEpvYihJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgICAgICBzdXBlcihKU1BDb3JlTWVzc2FnZXMuSlNQX1NlYXJjaCArIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7Ci0gICAgICAgICAgICB0aGlzLmZFbGVtZW50ID0gZWxlbWVudDsKLSAgICAgICAgICAgIHRoaXMuZlNjb3BlID0gc2NvcGU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBjb25zdHJ1Y3RvciB3LyBzZWFyY2ggdGV4dAotICAgICAgICBwdWJsaWMgU2VhcmNoSm9iKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgc3VwZXIoSlNQQ29yZU1lc3NhZ2VzLkpTUF9TZWFyY2ggKyBzZWFyY2hUZXh0KTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaFRleHQgPSBzZWFyY2hUZXh0OwotICAgICAgICAgICAgdGhpcy5mU2NvcGUgPSBzY29wZTsKLSAgICAgICAgICAgIHRoaXMuZlNlYXJjaEZvciA9IHNlYXJjaEZvcjsKLSAgICAgICAgICAgIHRoaXMuZkxpbWl0VG8gPSBsaW1pdFRvOwotICAgICAgICAgICAgdGhpcy5mTWF0Y2hNb2RlID0gbWF0Y2hNb2RlOwotICAgICAgICAgICAgdGhpcy5mSXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3Igam9iTW9uaXRvcikgewotCi0gICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsICYmIGpvYk1vbml0b3IuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICAgICAgICAgIGlmIChKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQotICAgICAgICAgICAgU2VhcmNoUGF0dGVybiBqYXZhU2VhcmNoUGF0dGVybiA9IG51bGw7Ci0gICAgICAgICAgICAvLyBpZiBhbiBlbGVtZW50IGlzIGF2YWlsYWJsZSwgdXNlIHRoYXQgdG8gY3JlYXRlIHNlYXJjaCBwYXR0ZXJuCi0gICAgICAgICAgICAvLyAoZWcuIExvY2FsVmFyaWFibGUpCi0gICAgICAgICAgICAvLyBvdGhlcndpc2UgdXNlIHRoZSB0ZXh0IGFuZCBvdGhlciBwYXJhbXRlcnMKLSAgICAgICAgICAgIGlmICh0aGlzLmZFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mRWxlbWVudCwgdGhpcy5mTGltaXRUbyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4odGhpcy5mU2VhcmNoVGV4dCwgdGhpcy5mU2VhcmNoRm9yLCB0aGlzLmZMaW1pdFRvLCB0aGlzLmZNYXRjaE1vZGUpOwotCi0gICAgICAgICAgICBpZiAoamF2YVNlYXJjaFBhdHRlcm4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEpTUFNlYXJjaFBhcnRpY2lwYW50W10gcGFydGljaXBhbnRzID0geyBnZXRTZWFyY2hQYXJ0aWNpcGFudCgpIH07Ci0gICAgICAgICAgICAgICAgU2VhcmNoRW5naW5lIGVuZ2luZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iTW9uaXRvci5iZWdpblRhc2soIiIsIElQcm9ncmVzc01vbml0b3IuVU5LTk9XTik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgZW5naW5lLnNlYXJjaChqYXZhU2VhcmNoUGF0dGVybiwgcGFydGljaXBhbnRzLCB0aGlzLmZTY29wZSwgdGhpcy5mUmVxdWVzdG9yLCBqb2JNb25pdG9yKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLUNvcmVFeGNlcHRpb25zIHdpbGwgcGVybWFuZW50bHkgc3RhbGwgdGhlIFdvcmtlciB0aHJlYWQKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKQotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoam9iTW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgam9iTW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBlbmQgU2VhcmNoSm9iCi0gICAgLyoqCi0gICAgICogUnVubmFibGUgZm9yY2VzIGNhbGxlciB0byB3YWl0IHVudGlsIGZpbmlzaGVkIChhcyBvcHBvc2VkIHRvIHVzaW5nIGEgSm9iKQotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgU2VhcmNoUnVubmFibGUgaW1wbGVtZW50cyBJV29ya3NwYWNlUnVubmFibGUsIElKYXZhU2VhcmNoQ29uc3RhbnRzIHsKLQotICAgICAgICBTdHJpbmcgZlNlYXJjaFRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIElKYXZhU2VhcmNoU2NvcGUgZlNjb3BlID0gbnVsbDsKLQotICAgICAgICBpbnQgZlNlYXJjaEZvciA9IEZJRUxEOwotCi0gICAgICAgIGludCBmTGltaXRUbyA9IEFMTF9PQ0NVUlJFTkNFUzsKLQotICAgICAgICBpbnQgZk1hdGNoTW9kZSA9IFNlYXJjaFBhdHRlcm4uUl9QQVRURVJOX01BVENIOwotCi0gICAgICAgIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0gICAgICAgIFNlYXJjaFJlcXVlc3RvciBmUmVxdWVzdG9yID0gbnVsbDsKLQotICAgICAgICBJSmF2YUVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCi0gICAgICAgIC8vIGNvbnN0cnVjdG9yIHcvIGphdmEgZWxlbWVudAotICAgICAgICBwdWJsaWMgU2VhcmNoUnVubmFibGUoSUphdmFFbGVtZW50IGVsZW1lbnQsIElKYXZhU2VhcmNoU2NvcGUgc2NvcGUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mUmVxdWVzdG9yID0gcmVxdWVzdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RydWN0b3Igdy8gc2VhcmNoIHRleHQKLSAgICAgICAgcHVibGljIFNlYXJjaFJ1bm5hYmxlKFN0cmluZyBzZWFyY2hUZXh0LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBpbnQgc2VhcmNoRm9yLCBpbnQgbGltaXRUbywgaW50IG1hdGNoTW9kZSwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUsIFNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQotICAgICAgICAgICAgdGhpcy5mU2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7Ci0gICAgICAgICAgICB0aGlzLmZTY29wZSA9IHNjb3BlOwotICAgICAgICAgICAgdGhpcy5mU2VhcmNoRm9yID0gc2VhcmNoRm9yOwotICAgICAgICAgICAgdGhpcy5mTGltaXRUbyA9IGxpbWl0VG87Ci0gICAgICAgICAgICB0aGlzLmZNYXRjaE1vZGUgPSBtYXRjaE1vZGU7Ci0gICAgICAgICAgICB0aGlzLmZJc0Nhc2VTZW5zaXRpdmUgPSBpc0Nhc2VTZW5zaXRpdmU7Ci0gICAgICAgICAgICB0aGlzLmZSZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLSAgICAgICAgICAgIGlmIChtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgaWYgKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5pc0NhbmNlbGVkKCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBTZWFyY2hQYXR0ZXJuIGphdmFTZWFyY2hQYXR0ZXJuID0gbnVsbDsKLSAgICAgICAgICAgIC8vIGlmIGFuIGVsZW1lbnQgaXMgYXZhaWxhYmxlLCB1c2UgdGhhdCB0byBjcmVhdGUgc2VhcmNoIHBhdHRlcm4KLSAgICAgICAgICAgIC8vIChlZy4gTG9jYWxWYXJpYWJsZSkKLSAgICAgICAgICAgIC8vIG90aGVyd2lzZSB1c2UgdGhlIHRleHQgYW5kIG90aGVyIHBhcmFtdGVycwotICAgICAgICAgICAgaWYgKHRoaXMuZkVsZW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBqYXZhU2VhcmNoUGF0dGVybiA9IFNlYXJjaFBhdHRlcm4uY3JlYXRlUGF0dGVybih0aGlzLmZFbGVtZW50LCBmTGltaXRUbyk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgamF2YVNlYXJjaFBhdHRlcm4gPSBTZWFyY2hQYXR0ZXJuLmNyZWF0ZVBhdHRlcm4oZlNlYXJjaFRleHQsIGZTZWFyY2hGb3IsIGZMaW1pdFRvLCBmTWF0Y2hNb2RlKTsKLQotICAgICAgICAgICAgaWYgKGphdmFTZWFyY2hQYXR0ZXJuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBKU1BTZWFyY2hQYXJ0aWNpcGFudFtdIHBhcnRpY2lwYW50cyA9IHsgZ2V0U2VhcmNoUGFydGljaXBhbnQoKSB9OwotICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZSBlbmdpbmUgPSBuZXcgU2VhcmNoRW5naW5lKCk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1vbml0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IuYmVnaW5UYXNrKCIiLCAwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICBlbmdpbmUuc2VhcmNoKGphdmFTZWFyY2hQYXR0ZXJuLCBwYXJ0aWNpcGFudHMsIGZTY29wZSwgZlJlcXVlc3RvciwgbW9uaXRvcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vdGhyb3cgZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbm9uLUNvcmVFeGNlcHRpb25zIHdpbGwgcGVybWFuZW50bHkgc3RhbGwgdGhlIFdvcmtlciB0aHJlYWQKLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAobW9uaXRvciAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvci5kb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gZW5kIFNlYXJjaFJ1bm5hYmxlCi0KLSAgICAvKioKLSAgICAgKiBDbGllbnRzIHNob3VsZCBhY2Nlc3MgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB2aWEgdGhlIHNpbmdsZSBpbnN0YW5jZQotICAgICAqIHZpYSBnZXRJbnN0YW5jZSgpCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEpTUFNlYXJjaFN1cHBvcnQgZ2V0SW5zdGFuY2UoKSB7Ci0KLSAgICAgICAgaWYgKHNpbmdsZXRvbiA9PSBudWxsKQotICAgICAgICAgICAgc2luZ2xldG9uID0gbmV3IEpTUFNlYXJjaFN1cHBvcnQoKTsKLSAgICAgICAgcmV0dXJuIHNpbmdsZXRvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVdGlsaXR5IG1ldGhvZCB0byBjaGVjayBpZiBhIGZpbGUgaXMgYSBqc3AgZmlsZSAoc2luY2UgdGhpcyBpcyBkb25lCi0gICAgICogZnJlcXVlbnRseSkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKc3AoSUZpbGUgZmlsZSkgewotICAgIAkvLyAocGEpIDIwMDUxMDI1IHJlbW92aW5nIGRlZXAgY29udGVudCB0eXBlIGNoZWNrCi0gICAgCS8vIGJlY2F1c2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyZXF1ZW50bHkKLSAgICAJLy8gYW5kIElPIGlzIGV4cGVuc2l2ZQotICAgICAgICBib29sZWFuIGlzSnNwID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgIAkKLSAgICAgICAgICAgIElDb250ZW50VHlwZSBjb250ZW50VHlwZUpTUCA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotICAgICAgICAgICAgLy8gY2hlY2sgdGhpcyBiZWZvcmUgZGVzY3JpcHRpb24sIGl0J3MgbGVzcyBleHBlbnNpdmUKLSAgICAgICAgICAgIGlmIChjb250ZW50VHlwZUpTUC5pc0Fzc29jaWF0ZWRXaXRoKGZpbGUuZ2V0TmFtZSgpKSkgewotICAgICAgICAgICAgCWlzSnNwID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBpc0pzcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBzY2hlZHVsZXMgYSBzZWFyY2ggZG9jdW1lbnQgcmVwcmVzZW50aW5nIHRoaXMgSlNQIGZpbGUgZm9yIGluZGV4aW5nIChieQotICAgICAqIHRoZSBqYXZhIGluZGV4ZXIpCi0gICAgICogCi0gICAgICogQHBhcmFtIGZpbGUKLSAgICAgKiAgICAgICAgICAgIHRoZSBKU1AgZmlsZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBpbmRleGluZyB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIFNlYXJjaERvY3VtZW50IGFkZEpzcEZpbGUoSUZpbGUgZmlsZSkgewotICAgICAgICBpZiAoSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmlzQ2FuY2VsZWQoKSB8fCAhZmlsZS5pc0FjY2Vzc2libGUoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpCi0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBKU1AgZmlsZToiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGZpbGUpOwotICAgICAgICAvLyBudWxsIGlmIG5vdCBhIGpzcCBmaWxlCi0gICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGdldFNlYXJjaFBhcnRpY2lwYW50KCkuc2NoZWR1bGVEb2N1bWVudEluZGV4aW5nKGRlbGVnYXRlLCBjb21wdXRlSW5kZXhMb2NhdGlvbihmaWxlLmdldFBhcmVudCgpLmdldEZ1bGxQYXRoKCkpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoYXQgZmFpbHVyZSBoZXJlIGRvZXNuJ3Qga2VlcCBvdGhlciBkb2N1bWVudHMgZnJvbQotICAgICAgICAgICAgICAgIC8vIGJlaW5nIGluZGV4ZWQKLSAgICAgICAgICAgICAgICAvLyBpZiBwZWZvcm1lZCBpbiBhIGJhdGNoIGNhbGwgKGxpa2UgSlNQSW5kZXhNYW5hZ2VyKQotICAgICAgICAgICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2NoZWR1bGVkIiArIGRlbGVnYXRlICsgImZvciBpbmRleGluZyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBlcmZvcm0gYSBqYXZhIHNlYXJjaCB3LyB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gUnVucyBpbiBhIGJhY2tncm91bmQgSm9iCi0gICAgICogKHJlc3VsdHMgbWF5IHN0aWxsIGNvbWUgaW4gYWZ0ZXIgdGhpcyBtZXRob2QgY2FsbCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoVGV4dAotICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBvZiB0ZXh0IHRvIHNlYXJjaCBvbgotICAgICAqIEBwYXJhbSBzZWFyY2hGb3IKLSAgICAgKiAgICAgICAgICAgIElKYXZhU2VhcmNoQ29uc3RhbnRzLlRZUEUsIE1FVEhPRCwgRklFTEQsIFBBQ0tBR0UsIGV0Yy4uLgotICAgICAqIEBwYXJhbSBsaW1pdFRvCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5ERUNMQVJBVElPTlMsCi0gICAgICogICAgICAgICAgICBJSmF2YVNlYXJjaENvbnN0YW50cy5SRUZFUkVOQ0VTLAotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuSU1QTEVNRU5UT1JTLCBvcgotICAgICAqICAgICAgICAgICAgSUphdmFTZWFyY2hDb25zdGFudHMuQUxMX09DQ1VSUkVOQ0VTCi0gICAgICogQHBhcmFtIG1hdGNoTW9kZQotICAgICAqICAgICAgICAgICAgYWxsb3cgKiB3aWxkY2FyZHMgb3Igbm90Ci0gICAgICogQHBhcmFtIGlzQ2FzZVNlbnNpdGl2ZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKiAgICAgICAgICAgIHBhc3NlZCBpbiB0byBhY2NlcHQgc2VhcmNoIG1hdGNoZXMgKGFuZCBkbyAic29tZXRoaW5nIiB3aXRoCi0gICAgICogICAgICAgICAgICB0aGVtKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChTdHJpbmcgc2VhcmNoVGV4dCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgaW50IHNlYXJjaEZvciwgaW50IGxpbWl0VG8sIGludCBtYXRjaE1vZGUsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihzZWFyY2hUZXh0LCBzY29wZSwgc2VhcmNoRm9yLCBsaW1pdFRvLCBtYXRjaE1vZGUsIGlzQ2FzZVNlbnNpdGl2ZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy8gcG9wcyB1cCB1c2VyIG9wZXJhdGlvbiBibG9ja2VkIGRpYWxvZyBpZiB5b3UgcGVyZm9ybSBhIGxvbmcgc2VhcmNoLAotICAgICAgICAvLyB0aGVuIG9wZW4gYSBmaWxlIGJlY2F1c2UgaXQgbG9ja3MgdGhlIHdvcmtzcGFjZQotICAgICAgICAvL2pvYi5zZXRSdWxlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotICAgICAgICBqb2Iuc2NoZWR1bGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWFyY2ggZm9yIGFuIElKYXZhRWxlbWVudCwgY29uc3RyYWluZWQgYnkgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIFJ1bnMgaW4KLSAgICAgKiBhIGJhY2tncm91bmQgSm9iIChyZXN1bHRzIG1heSBzdGlsbCBjb21lIGluIGFmdGVyIHRoaXMgbWV0aG9kIGNhbGwpCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQKLSAgICAgKiBAcGFyYW0gc2NvcGUKLSAgICAgKiBAcGFyYW0gcmVxdWVzdG9yCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElKYXZhRWxlbWVudCBlbGVtZW50LCBJSmF2YVNlYXJjaFNjb3BlIHNjb3BlLCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0KLSAgICAgICAgSlNQSW5kZXhNYW5hZ2VyLmdldEluc3RhbmNlKCkucmVidWlsZEluZGV4SWZOZWVkZWQoKTsKLQotICAgICAgICBTZWFyY2hKb2Igam9iID0gbmV3IFNlYXJjaEpvYihlbGVtZW50LCBzY29wZSwgcmVxdWVzdG9yKTsKLSAgICAgICAgc2V0Q2FuY2VsZWQoZmFsc2UpOwotICAgICAgICBqb2Iuc2V0VXNlcih0cnVlKTsKLSAgICAgICAgLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTUwMzIKLSAgICAgICAgLy9qb2Iuc2V0UnVsZShSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpKTsKLSAgICAgICAgam9iLnNjaGVkdWxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VhcmNoIGZvciBhbiBJSmF2YUVsZW1lbnQsIGNvbnN0cmFpbmVkIGJ5IHRoZSBnaXZlbiBwYXJhbWV0ZXJzLiBSdW5zIGluCi0gICAgICogYW4gSVdvcmtzcGFjZSBydW5uYWJsZSAocmVzdWx0cyB3aWxsIGJlIHJlcG9ydGVkIGJ5IHRoZSBlbmQgb2YgdGhpcwotICAgICAqIG1ldGhvZCkKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudAotICAgICAqIEBwYXJhbSBzY29wZQotICAgICAqIEBwYXJhbSByZXF1ZXN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hSdW5uYWJsZShJSmF2YUVsZW1lbnQgZWxlbWVudCwgSUphdmFTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotCi0gICAgICAgIEpTUEluZGV4TWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlYnVpbGRJbmRleElmTmVlZGVkKCk7Ci0KLSAgICAgICAgU2VhcmNoUnVubmFibGUgc2VhcmNoUnVubmFibGUgPSBuZXcgU2VhcmNoUnVubmFibGUoZWxlbWVudCwgc2NvcGUsIHJlcXVlc3Rvcik7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzZXRDYW5jZWxlZChmYWxzZSk7Ci0gICAgICAgICAgICBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHNlYXJjaFJ1bm5hYmxlLCBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotICAgICAgICB9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ganNwRmlsZQotICAgICAqIEByZXR1cm4gU2VhcmNoRG9jdW1lbnQgaWYgdGhlIGZpbGUgaXMgbm90IG51bGwsIGV4aXN0cywgYW5kIGlzIGEgSlNQCi0gICAgICogICAgICAgICBmaWxlLCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwcml2YXRlIFNlYXJjaERvY3VtZW50IGNyZWF0ZVNlYXJjaERvY3VtZW50KElGaWxlIGpzcEZpbGUpIHsKLQotICAgICAgICBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIGlmIChqc3BGaWxlICE9IG51bGwgJiYganNwRmlsZS5leGlzdHMoKSAmJiBpc0pzcChqc3BGaWxlKSkgewotCi0gICAgICAgICAgICBkZWxlZ2F0ZSA9IG5ldyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShuZXcgSlNQU2VhcmNoRG9jdW1lbnQoanNwRmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGdldFNlYXJjaFBhcnRpY2lwYW50KCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDZW50cmFsaXplZCBwbGFjZSB0byBhY2Nlc3MgSlNQU2VhcmNoRG9jdW1lbnRzICh1c2VkIGJ5Ci0gICAgICogSlNQU2VhcmNoUGFydGljaXBhbnQgYW5kIEpTUFNlYXJjaFJlcXVlc3RvcikKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gc2VhcmNoRG9jUGF0aAotICAgICAqIEBwYXJhbSBkb2MKLSAgICAgKiBAcmV0dXJuIHRoZSBKU1BTZWFyY2hEb2N1bWVudCBvciBudWxsIGlmIG9uZSBpcyBub3QgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgU2VhcmNoRG9jdW1lbnQgZ2V0U2VhcmNoRG9jdW1lbnQoU3RyaW5nIHNlYXJjaERvY1BhdGgpIHsKLSAgICAgICAgIAotICAgICAgICBTZWFyY2hEb2N1bWVudCBkZWxlZ2F0ZSA9IG51bGw7Ci0gICAgICAgIElGaWxlIGYgPSBmaWxlRm9yQ1VQYXRoKHNlYXJjaERvY1BhdGgpOwotICAgICAgICBpZiAoZiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZSA9IGNyZWF0ZVNlYXJjaERvY3VtZW50KGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gaGFuZGxlIGZhaWx1cmUgY2FzZS4uLiAoZmlsZSBkZWxldGVkIG1heWJlPykKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5tYW5nbGVzIHRoZSBzZWFyY2hEb2NQYXRoIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIEpTUCBmaWxlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBzZWFyY2hEb2NQYXRoCi0gICAgICovCi0gICAgcHJpdmF0ZSBJRmlsZSBmaWxlRm9yQ1VQYXRoKFN0cmluZyBzZWFyY2hEb2NQYXRoKSB7Ci0gICAgCi0gICAgICAgIFN0cmluZ1tdIHNwbGl0ID0gc2VhcmNoRG9jUGF0aC5zcGxpdCgiLyIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIFN0cmluZyBjbGFzc25hbWUgPSBzcGxpdFtzcGxpdC5sZW5ndGggLSAxXTsKLQotICAgICAgICAvLyBpZ25vcmUgYW55dGhpbmcgYnV0IC5qYXZhIG1hdGNoZXMgKGxpa2UgLmNsYXNzIGJpbmFyeSBtYXRjaGVzKQotICAgICAgICBpZighc2VhcmNoRG9jUGF0aC5lbmRzV2l0aCgiLmphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IEpTUDJTZXJ2bGV0TmFtZVV0aWwudW5tYW5nbGUoY2xhc3NuYW1lKTsKLSAgICAgICAKLSAgICAgICAgLy8gdHJ5IGFic29sdXRlIHBhdGgKLSAgICAgICAgSUZpbGUgZiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVQYXRoKSk7Ci0gICAgICAgIC8vIHdvcmtzcGFjZSByZWxhdGl2ZSB0aGVuCi0gICAgICAgIGlmKGYgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2MDA5Ci0gICAgICAgICAgICAvLyBtdXN0IGhhdmUgYSBwcm9qZWN0IG5hbWUgYXMgd2VsbAotICAgICAgICAgICAgLy8gd2hpY2ggd291bGQgbWVhbiA+PSAyIHBhdGggc2VnbWVudHMKLSAgICAgICAgICAgIElQYXRoIHBhdGggPSBuZXcgUGF0aChmaWxlUGF0aCk7Ci0gICAgICAgICAgICBpZihwYXRoLnNlZ21lbnRDb3VudCgpID49IDIpIHsKLSAgICAgICAgICAgICAgICBmID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmOwotICAgIH0KLQotICAgIEpTUFNlYXJjaFBhcnRpY2lwYW50IGdldFNlYXJjaFBhcnRpY2lwYW50KCkgewotCi0gICAgICAgIGlmICh0aGlzLmZQYXJ0aWNpcGFudCA9PSBudWxsKQotICAgICAgICAgICAgdGhpcy5mUGFydGljaXBhbnQgPSBuZXcgSlNQU2VhcmNoUGFydGljaXBhbnQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuZlBhcnRpY2lwYW50OwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgY2FsbGVkIGZyb20gSlNQUGF0aEluZGV4ZXIKLSAgICAvLyBwYV9UT0RPCi0gICAgLy9ob3cgY2FuIHdlIG1ha2Ugc3VyZSBwYXJ0aWNpcGFudCBpbmRleExvY2F0aW9ucyBhcmUgdXBkYXRlZCBhdCBzdGFydHVwPwotICAgIHB1YmxpYyBmaW5hbCBJUGF0aCBjb21wdXRlSW5kZXhMb2NhdGlvbihJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0KLSAgICAgICAgU3RyaW5nIGluZGV4TG9jYXRpb24gPSBudWxsOwotICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGluYWR2ZXJ0ZW50bHkgdXNlIGEgSkRUIEluZGV4Ci0gICAgICAgIC8vIHdlIHdhbnQgdG8gYmUgc3VyZSB0byB1c2UgdGhlIEluZGV4IGZyb20gdGhlIEpTUCBsb2NhdGlvbgotICAgICAgICAvL09iamVjdCBvYmogPSBpbmRleExvY2F0aW9ucy5nZXQoY29udGFpbmVyUGF0aCk7Ci0gICAgICAgIC8vaWYgKG9iaiAhPSBudWxsKSB7Ci0gICAgICAgIC8vICAgIGluZGV4TG9jYXRpb24gPSAoU3RyaW5nKSBvYmo7Ci0gICAgICAgIC8vfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBpbmRleCBlbnRyeQotICAgICAgICAgICAgU3RyaW5nIHBhdGhTdHJpbmcgPSBjb250YWluZXJQYXRoLnRvT1NTdHJpbmcoKTsKLSAgICAgICAgICAgIHRoaXMuZkNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotICAgICAgICAgICAgdGhpcy5mQ2hlY2tzdW1DYWxjdWxhdG9yLnVwZGF0ZShwYXRoU3RyaW5nLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gTG9uZy50b1N0cmluZyh0aGlzLmZDaGVja3N1bUNhbGN1bGF0b3IuZ2V0VmFsdWUoKSkgKyAiLmluZGV4IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGZyb20KLSAgICAgICAgICAgIC8vIEluZGV4TWFuYWdlciNjb21wdXRlSW5kZXhMb2NhdGlvbiguLi4pCi0gICAgICAgICAgICBpbmRleExvY2F0aW9uID0gZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKS5hcHBlbmQoZmlsZU5hbWUpLnRvT1NTdHJpbmcoKTsKLQotICAgICAgICAgICAgLy8gcGFfVE9ETyBuZWVkIHRvIGFkZCB0byBqYXZhIHBhdGggdG9vLCBzbyBKRFQgc2VhcmNoIHN1cHBvcnQga25vd3MKLSAgICAgICAgICAgIC8vIHRoZXJlIHNob3VsZCBiZSBhIG5vbiBpbnRlcm5hbCB3YXkgdG8gZG8gdGhpcy4KLSAgICAgICAgICAgIC8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD03NzU2NAotICAgICAgICAgICAgSmF2YU1vZGVsTWFuYWdlci5nZXRKYXZhTW9kZWxNYW5hZ2VyKCkuZ2V0SW5kZXhNYW5hZ2VyKCkuaW5kZXhMb2NhdGlvbnMucHV0KGNvbnRhaW5lclBhdGgsIGluZGV4TG9jYXRpb24pOwotICAgICAgICAvL30KLSAgICAgICAgcmV0dXJuIG5ldyBQYXRoKGluZGV4TG9jYXRpb24pOwotICAgIH0KLQotICAgIC8vIGNvcGllZCBmcm9tIEpEVCBJbmRleE1hbmFnZXIKLSAgICBwdWJsaWMgSVBhdGggZ2V0TW9kZWxKc3BQbHVnaW5Xb3JraW5nTG9jYXRpb24oKSB7Ci0KLSAgICAgICAgaWYgKHRoaXMuZkpzcFBsdWdpbkxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy5mSnNwUGx1Z2luTG9jYXRpb247Ci0KLSAgICAgICAgLy8gQXBwZW5kIHRoZSBmb2xkZXIgbmFtZSAianNwc2VhcmNoIiB0byBrZWVwIHRoZSBzdGF0ZSBsb2NhdGlvbiBhcmVhIGNsZWFuZXIKLSAgICAgICAgSVBhdGggc3RhdGVMb2NhdGlvbiA9IEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFN0YXRlTG9jYXRpb24oKS5hcHBlbmQoImpzcHNlYXJjaCIpOwotCi0gICAgICAgIC8vIHBhX1RPRE8gd29ya2Fyb3VuZCBmb3IKLSAgICAgICAgLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYyMjY3Ci0gICAgICAgIC8vIGNvcGllZCBmcm9tIEluZGV4TWFuYWdlcgotICAgICAgICBTdHJpbmcgZGV2aWNlID0gc3RhdGVMb2NhdGlvbi5nZXREZXZpY2UoKTsKLSAgICAgICAgaWYgKGRldmljZSAhPSBudWxsICYmIGRldmljZS5jaGFyQXQoMCkgPT0gJy8nKQotICAgICAgICAgICAgc3RhdGVMb2NhdGlvbiA9IHN0YXRlTG9jYXRpb24uc2V0RGV2aWNlKGRldmljZS5zdWJzdHJpbmcoMSkpOwotCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IGl0IGV4aXN0cyBvbiBkaXNrCi0gICAgICAgIEZpbGUgZm9sZGVyID0gbmV3IEZpbGUoc3RhdGVMb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQlpZiAoIWZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0gICAgICAgIHJldHVybiB0aGlzLmZKc3BQbHVnaW5Mb2NhdGlvbiA9IHN0YXRlTG9jYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgdm9pZCBzZXRDYW5jZWxlZChib29sZWFuIGNhbmNlbCkgewotICAgIAkvL1N5c3RlbS5vdXQucHJpbnRsbigic2VhcmNoIHN1cHBvcnQgbW9uaXRvciIgKyBmTW9uaXRvcik7Ci0gICAgICAgIGZNb25pdG9yLnNldENhbmNlbGVkKGNhbmNlbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgYm9vbGVhbiBpc0NhbmNlbGVkKCkgewotCi0gICAgICAgIHJldHVybiBmTW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSlNQIEluZGV4aW5nIGFuZCBTZWFyY2ggam9icyBjaGVjayB0aGlzCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIGdldFByb2dyZXNzTW9uaXRvcigpIHsKLQotICAgICAgICByZXR1cm4gdGhpcy5mTW9uaXRvcjsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2YxM2QxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvamF2YS9zZWFyY2gvSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uOwotCi0KLS8qKgotICogV3JhcHBlciBtZXRob2QgdG8gc2V0IGdldFBhdGgoKSBwYXRoIHRvIGJlIHRoZSBwYXRoIG9mIHRoZSBjb21waWxhdGlvbiB1bml0IAotICogZm9yIHRoZSBqc3AgZmlsZS4gKHNpbmNlIGl0J3MgYSBmaW5hbCBtZXRob2QsIGl0IG5lZWRzIHRvIGJlIHNldCB2aWEgY29uc3RydWN0b3IpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBleHRlbmRzIFNlYXJjaERvY3VtZW50IHsKLQkKLQlwcml2YXRlIEpTUFNlYXJjaERvY3VtZW50IGZKU1BTZWFyY2hEb2MgPSBudWxsOwotCQotCXB1YmxpYyBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZShKU1BTZWFyY2hEb2N1bWVudCBqc3BTZWFyY2hEb2MpIHsKLQkJCi0JCXN1cGVyKGpzcFNlYXJjaERvYy5nZXRQYXRoKCksIGpzcFNlYXJjaERvYy5nZXRQYXJ0aWNpcGFudCgpKTsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jID0ganNwU2VhcmNoRG9jOwotCX0KLQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRCeXRlQ29udGVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgY2hhcltdIGdldENoYXJDb250ZW50cygpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0Q2hhckNvbnRlbnRzKCk7Ci0JfQotCQotCXB1YmxpYyBTdHJpbmcgZ2V0SmF2YVRleHQoKSB7Ci0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0SmF2YVRleHQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQkKLQkJcmV0dXJuIHRoaXMuZkpTUFNlYXJjaERvYy5nZXRFbmNvZGluZygpOwotCX0KLQkKLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJCi0JCXJldHVybiB0aGlzLmZKU1BTZWFyY2hEb2MuZ2V0RmlsZSgpOwotCX0KLQkKLQlwdWJsaWMgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24gZ2V0SnNwVHJhbnNsYXRpb24oKSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpTUFRyYW5zbGF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBpbnQgZ2V0SnNwT2Zmc2V0KGludCBqYXZhT2Zmc2V0KSB7Ci0JCQotCQlyZXR1cm4gdGhpcy5mSlNQU2VhcmNoRG9jLmdldEpzcE9mZnNldChqYXZhT2Zmc2V0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJdGhpcy5mSlNQU2VhcmNoRG9jLnJlbGVhc2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9OdWxsU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5OWExMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL2phdmEvc2VhcmNoL051bGxTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRvcjsKLQotCi0KLS8qKgotICogQW4gZW1wdHkgc2VydmxldCwgc2FmZSBmb3IgSmF2YSBzZWFyY2ggcGFydGljaXBhdGlvbgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTnVsbFNlYXJjaERvY3VtZW50IGV4dGVuZHMgU2VhcmNoRG9jdW1lbnQgewotCQotCVN0cmluZ0J1ZmZlciBmRW1wdHlTZXJ2bGV0QnVmZmVyID0gbnVsbDsKLQkKLQlwdWJsaWMgTnVsbFNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgpIHsKLQkJc3VwZXIoZG9jdW1lbnRQYXRoLCBuZXcgSlNQU2VhcmNoUGFydGljaXBhbnQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyID0gbmV3IEpTUFRyYW5zbGF0b3IoKS5nZXRFbXB0eVRyYW5zbGF0aW9uKCk7Ci0JfQotCQotCXB1YmxpYyBieXRlW10gZ2V0Qnl0ZUNvbnRlbnRzKCkgewotCQlyZXR1cm4gdGhpcy5mRW1wdHlTZXJ2bGV0QnVmZmVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLQl9Ci0JCi0JcHVibGljIGNoYXJbXSBnZXRDaGFyQ29udGVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmZFbXB0eVNlcnZsZXRCdWZmZXIudG9TdHJpbmcoKS50b0NoYXJBcnJheSgpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVN0YXRlRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlU3RhdGVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDc2YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlU3RhdGVEYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIG9ubHkgZm9yIHJlbWVtYmVyaW5nIG9sZCBhbmQgbmV3IGVtYmVkZGVkIGhhbmRsZXJzLCAKLSAqIGluIHRoZSBldmVudCBhIHJlLWluaXQgaXMgbmVlZGVkLgotICovCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRUeXBlU3RhdGVEYXRhIHsKLQotCi0JRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyOwotCUVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SGFuZGxlcjsKLQotCXB1YmxpYyBFbWJlZGRlZFR5cGVTdGF0ZURhdGEoRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0hhbmRsZXIpIHsKLQkJdGhpcy5vbGRIYW5kbGVyID0gb2xkSGFuZGxlcjsKLQkJdGhpcy5uZXdIYW5kbGVyID0gbmV3SGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXROZXdIYW5kbGVyKCkgewotCQlyZXR1cm4gbmV3SGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRPbGRIYW5kbGVyKCkgewotCQlyZXR1cm4gb2xkSGFuZGxlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvSlNQTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA0MzQ0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmRvY3VtZW50LlBhZ2VEaXJlY3RpdmVXYXRjaGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9tZG9jdW1lbnQuRE9NTW9kZWxGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLklKU1BIZWFkQ29udGVudERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LkpTUE1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkpTUENhcGFibGVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVSZWdpc3RyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Eb2N1bWVudElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5EZWJ1Z0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5ET01Nb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEpTUE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0JcHJvdGVjdGVkIGZpbmFsIGludCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyA9IDIwMDAwMDsKLQotCS8qKgotCSAqIERNVyAtIE5vdGU6IEkgdGhpbmsgdGhlIGVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGluIElNb2RlbE1hbmFnZXIgY2FuIGJlCi0JICogcmVtb3ZlZAotCSAqLwotCXByaXZhdGUgRW1iZWRkZWRUeXBlUmVnaXN0cnkgZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5OwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBERUZBVUxUX01JTUVfVFlQRSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfTEFOR1VBR0UgPSAiamF2YSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBKU1BNb2RlbExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5Ci0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeSBnZXRFbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkoKSB7Ci0JCWlmIChlbWJlZGRlZENvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZW1iZWRkZWRDb250ZW50VHlwZVJlZ2lzdHJ5ID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJRE9NTW9kZWxGb3JKU1AgbW9kZWwgPSBuZXcgRE9NTW9kZWxGb3JKU1AoKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIEZvciBKU1AgZmlsZXMsIHRleHQvaHRtbCBpcyB0aGUgZGVmYXVsdCBjb250ZW50IHR5cGUuIFRoaXMgbWF5IHdhbnQKLQkgKiB0aGlzIGRpZmZlcmVudCBmb3IgdHlwZXMgbGlrZSBqc3YgKGpzcCBmb3Igdm9pY2UgeG1sKSBGb3Igbm93LCBoYXJkCi0JICogY29kZSB0byBuZXcgaW5zdGFuY2UuIEluIGZ1dHVyZSwgc2hvdWxkIGdldCBpbnN0YW5jZSBmcm9tIHJlZ2lzdHJ5LgotCSAqIAotCSAqIFNwZWNpZmljYXRpb24gY2l0ZXMgSFRNTCBhcyB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKi8KLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHJlZyA9IGdldEVtYmVkZGVkQ29udGVudFR5cGVSZWdpc3RyeSgpOwotCi0JCVN0cmluZyBtaW1lVHlwZSA9IG51bGw7Ci0JCS8vIGRlZmF1bHQgZW1iZWRkZWQgdHlwZSBmb3IgZnJhZ21lbnRzCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJbWltZVR5cGUgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBmaWxlLCB0cnVlKTsKLQkJCX0KLQkJfQotCQltaW1lVHlwZSA9IG1pbWVUeXBlID09IG51bGwgPyBnZXREZWZhdWx0TWltZVR5cGUoKSA6IG1pbWVUeXBlOwotCQlyZXR1cm4gcmVnLmdldFR5cGVGb3IobWltZVR5cGUpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXREZWZhdWx0TWltZVR5cGUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0TWltZVR5cGUoKSB7Ci0JCXJldHVybiBERUZBVUxUX01JTUVfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJU3RydWN0dXJlZERvY3VtZW50LCB0aGF0IGhhcwotCSAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJzZXIuIEZvciBtYW55IGxvYWRlcnMsIHRoZQotCSAqIChkZWZhdWx0KSBwYXJzZXIgdXNlZCBpcyBrbm93biBmb3IgYW55IGlucHV0LiBGb3Igb3RoZXJzLCB0aGUgY29ycmVjdAotCSAqIHBhcnNlciAoYW5kIGl0cyBpbml0aWFsaXphdGlvbikgaXMgbm9ybWFsbCBkZXBlbmRlbnQgb24gdGhlIGNvbnRlbnQgb2YKLQkgKiB0aGUgZmlsZS4gVGhpcyBuby1hcmd1bWVudCBtZXRob2Qgc2hvdWxkIGFzc3VtZSAiZW1wdHkgaW5wdXQiIGFuZCB3b3VsZAotCSAqIHRoZXJlZm9yZSByZXR1cm4gdGhlIGRlZmF1bHQgcGFyc2VyIGZvciB0aGUgZGVmYXVsdCBjb250ZW50VHlwZS4KLQkgKiAKLQkgKiBJZiB0aGUgcGFyc2VyIGlzIHRvIGhhbmRsZSB0YWcgbGlicmFyaWVzLCBpdCBtdXN0IGhhdmUgYSBUYWdsaWJTdXBwb3J0Ci0JICogb2JqZWN0IHdpdGggYSB2YWxpZCBVUklSZXNvbHZlciBhbmQgdGhpcyBJU3RydWN0dXJlZERvY3VtZW50IGF0dGFjaGVkCi0JICogdG8gaXQgYmVmb3JlIHRoZSBjb250ZW50cyBhcmUgc2V0IG9uIHRoZSBJU3RydWN0dXJlZERvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihuZXcgSlNQUmVQYXJzZXIoKSk7Ci0JCS8vIHN0cnVjdHVyZWREb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKG5ldwotCQkvLyBKU1BKYXZhRG9jdW1lbnRQYXJ0aW9uZXIoKSk7Ci0JCS8vIGV2ZW4gdGhvdWdoIHRoaXMgaXMgYW4gImVtcHR5IG1vZGVsIiAuLi4gd2Ugd2FudCBpdCB0byBoYXZlIGF0Ci0JCS8vIGxlYXN0IHRoZQotCQkvLyBkZWZhdWx0IGVtYmVkZGVkZWQgY29udGVudCB0eXBlIGhhbmRsZXIKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZFR5cGUgPSBnZXRKU1BEZWZhdWx0RW1iZWRkZWRUeXBlKG51bGwpOwotCQllbWJlZGRlZFR5cGUuaW5pdGlhbGl6ZVBhcnNlcigoSlNQQ2FwYWJsZVBhcnNlcikgc3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJLy8gcmVtZW1iZXIsIHRoZSBMb2FkZXIKLQkJLy8gd2lsbCBuZWVkIHRvIGZpbmlzaCBpbml0aWFsaXphdGlvbiBvZiBwYXJzZXIKLQkJLy8gYmFzZWQgb24gImVtYmVkZGVkIGNvbnRlbnQiCi0JCXJldHVybiBuZXcgSlNQU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJlTG9hZEFkYXB0KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXN1cGVyLnByZUxvYWRBZGFwdChzdHJ1Y3R1cmVkTW9kZWwpOwotCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JCS8vCi0JCS8vIGRvY3VtZW50IG11c3QgaGF2ZSBhbHJlYWR5IGJlZW4gc2V0IGZvciB0aGlzIHRvCi0JCS8vIHdvcmsuCi0JCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChkb2N1bWVudCk7Ci0JCS8vIGlmIHRoZXJlIGlzIGEgbW9kZWwgaW4gdGhlIGFkYXB0ZXIsIHRoaXMgd2lsbCBhZGFwdCBpdCB0bwotCQkvLyBmaXJzdCBub2RlLiBBZnRlciB0aGF0IHRoZSBQcm9wYWdhdGluZ0FkYXRlciBzcHJlYWRzIG92ZXIgdGhlCi0JCS8vIGNoaWxkcmVuIGJlaW5nCi0JCS8vIGNyZWF0ZWQuIEVhY2ggdGltZSB0aGF0IGhhcHBlbmRzLCBhIHNpZGUgZWZmZWN0IGlzIHRvCi0JCS8vIGFsc28gInNwcmVhZCIgc3ByZWNpZmljIHJlZ2lzdGVyZWQgYWRhcHRlcnMsCi0JCS8vIHRoZXkgdHdvIGNhbiBwcm9waWdhdGUgaXMgbmVlZGVkLgotCQkvLyBUaGlzICdnZXQnIGNhdXNlcyBmaXJzdCB0byBiZSBiZSBhdHRhY2hlZC4KLQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJLy8gbWF5IG1ha2UgdGhpcyBlYXNpZXIgdG8gdXNlIGluIGZ1dHVlCi0JCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgUGFnZURpcmVjdGl2ZVdhdGNoZXJGYWN0b3J5KCkpOwotCQlpZiAoRGVidWcuZGVidWdOb3RpZmljYXRpb25BbmRFdmVudHMpIHsKLQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXcgRGVidWdBZGFwdGVyRmFjdG9yeSgpKTsKLQkJfQotCQkvLyBGb3IgSlNQcywgdGhlIE1vZGVsUXVlcnlBZGFwdGVyIG11c3QgYmUgImF0dGFjaGVkIiB0byB0aGUgZG9jdW1lbnQKLQkJLy8gYmVmb3JlIGNvbnRlbnQgaXMgc2V0IGluIHRoZSBtb2RlbCwgc28gdGFnbGliIGluaXRpemF0aW9uIGNhbgotCQkvLyB0YWtlIHBsYWNlLgotCQkoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJLy8KLQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG11c3QgcmV0dXJuIHRob3NlIGZhY3RvcmllcyB3aGljaCBtdXN0IGJlIGF0dGFjaGVkIHRvIHRoZQotCSAqIHN0cnVjdHVyZWRNb2RlbCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLgotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQkvLwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBuZXcgUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBJSlNQSGVhZENvbnRlbnREZXRlY3RvciBnZXRIZWFkUGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCX0KLQotCXByaXZhdGUgSUNvbnRlbnREZXNjcmlwdGlvbiBnZXRDb250ZW50RGVzY3JpcHRpb24oSURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRJbnB1dFN0cmVhbSBpbiA9IG5ldyBEb2N1bWVudElucHV0U3RyZWFtKGRvYyk7Ci0JCXJldHVybiBnZXRDb250ZW50RGVzY3JpcHRpb24oaW4pOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBmaWxlUGF0aAotCSAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZGVzY3JpcHRpb24sIG9yIG51bGwgaWYgdGhlcmUncyBubyBidWZmZXIgZm9yIHRoZQotCSAqICAgICAgICAgZmlsZXBhdGgKLQkgKi8KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKFN0cmluZyBmaWxlUGF0aCkgewotCQlpZiAoZmlsZVBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlJVGV4dEZpbGVCdWZmZXIgYnVmID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkuZ2V0VGV4dEZpbGVCdWZmZXIobmV3IFBhdGgoZmlsZVBhdGgpKTsKLQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQlkb2MgPSBidWYuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCi0JCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gbnVsbDsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQljb250ZW50RGVzY3JpcHRpb24gPSBnZXRDb250ZW50RGVzY3JpcHRpb24oZG9jKTsKLQkJfQotCQlyZXR1cm4gY29udGVudERlc2NyaXB0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY29udGVudCBkZXNjcmlwdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIEFzc3VtZXMgaXQncyBKU1AKLQkgKiBjb250ZW50LiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbSB3aGVuIGZpbmlzaGVkLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqIEByZXR1cm4gdGhlIElDb250ZW50RGVzY3JpcHRpb24gZm9yIGluLCBvciBudWxsIGlmIGluIGlzIG51bGwKLQkgKi8KLQlwcml2YXRlIElDb250ZW50RGVzY3JpcHRpb24gZ2V0Q29udGVudERlc2NyaXB0aW9uKElucHV0U3RyZWFtIGluKSB7Ci0KLQkJaWYgKGluID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2MgPSBudWxsOwotCQl0cnkgewotCi0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGVKU1AgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJCWRlc2MgPSBjb250ZW50VHlwZUpTUC5nZXREZXNjcmlwdGlvbkZvcihpbiwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKGluICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlpbi5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVzYzsKLQl9Ci0KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChsb2NhdGlvbik7Ci0JCQkJaWYgKCFwYXRoLnRvRmlsZSgpLmV4aXN0cygpICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExhbmd1YWdlKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGZpcnN0IGNoZWNrIHRoZSBtb2RlbCAoZG9jdW1lbnQgaXRzZWxmKSB0byBzZWUgaWYgY29udGFpbnMKLQkJcmVzdWx0ID0gZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50KG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJLy8gTm90ZTogaWYgbW9kZWwgY29udGFpbnMgYW4gdW5zdXBwb3J0ZWQKLQkJLy8gbGFuZ3VhZ2UsIHdlJ2xsIGV2ZW4gcmV0dXJuIGl0LAotCQkvLyBzaW5jZSB3aG8ga25vd3Mgd2hhdCBmdXR1cmUgaG9sZHMuCi0KLQkJLy8gZ2V0IGRlZmF1bHQgbGFuZ3VhZ2Ugc3BlY2lmaWVkIGluIHByb3BlcnRpZXMgcGFnZQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShtb2RlbCk7Ci0JCXJlc3VsdCA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQTEFOR1VBR0UsIGZpbGUsIHRydWUpOwotCi0JCS8vIGFsd2F5cyByZXR1cm4gc29tZXRoaW5nCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gREVGQVVMVF9MQU5HVUFHRTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRMYW5ndWFnZUZyb21TdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWREb2N1bWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TGFuZ3VhZ2VGcm9tU3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gYmFzY2lhbGx5IHNhbWUgYWxnb3JpdGhtIGFzIGdldCBlbmNvZGluZyBvcgotCQkvLyBnZXQgY29udGVudCB0eXBlIGZyb20gc3RydWN0dXJlZERvY3VtZW50LgotCQlJSlNQSGVhZENvbnRlbnREZXRlY3RvciBsb2NhbEhlYWRQYXJzZXIgPSBnZXRIZWFkUGFyc2VyKCk7Ci0JCS8vIHdlIGNhbiBiZSBhc3N1cmVkIHRoYXQgaXRzIGFscmVhZHkgYmVlbgotCQkvLyBwYXJzZWQuIElmIG5vdCBjYWxsIHBhcnNlSGVhZGVyRm9yUGFnZURpcmVjdGl2ZSgpCi0JCS8vIGJlZm9yZSBjYWxsaW5nIGdldExhbmd1YWdlOwotCQlsb2NhbEhlYWRQYXJzZXIuc2V0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBsb2NhbEhlYWRQYXJzZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZQotCQkJLy8gVE9ETyBuZWVkIHRvIHJlY29uc2lkZXIgZGVzaWduIHRvIGF2b2lkCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzICJyZWluaXRpYWxpemUiIHNpbmNlIHRoZXJlIHNob3VsZCBhbHdheXMgYmUgYXQgbGVhc3QgdGhlCi0JICogZGVmYXVsdCBvbmUgYXNzaWduZWQsIGJlZm9yZSB3ZSBzdGFydCBjaGVja2luZyB0aGUgc3RyZWFtCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlSW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG9sZEVtYmVkZGVkQ29udGVudFR5cGUsIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3RW1iZWRkZWRDb250ZW50VHlwZSkgewotCQkvLyBjaGVjayBwcm9ncmFtIGxvZ2ljCi0JCUFzc2VydC5pc05vdE51bGwob2xkRW1iZWRkZWRDb250ZW50VHlwZSwgIlByb2dyYW0gZXJyb3I6IGludmFsaWQgY2FsbCBkdXJpbmcgbW9kZWwgaW5pdGlhbGl6YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvbmNlIHdlIGtub3cgdGhlIGVtYmVkZGVkIGNvbnRlbnQgdHlwZSwgd2UgbmVlZCB0byBzZXQgaXQgaW4gdGhlCi0JCS8vIFBhZ2VEaXJlY3RpdmVBZGFwdGVyIC4uLiB0aGUgb3JkZXIgb2YgaW5pdGlhbGl6YXRpb24gaXMKLQkJLy8gY3JpdGljYWwgaGVyZSwgdGhlIGRvYyBtdXN0IGhhdmUgYmVlbiBjcmVhdGVkLCBidXQgaXRzIGNvbnRlbnRzIG5vdAotCQkvLyBzZXQgeWV0LAotCQkvLyBhbmQgYWxsIGZhY3RvcmllcyBtdXN0IGhhdmUgYmVlbiBzZXQgdXAgYWxzby4KLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSBkb2N1bWVudC5nZXRFeGlzdGluZ0FkYXB0ZXIoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikKLQkJLy8gZG9jdW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJb2xkRW1iZWRkZWRDb250ZW50VHlwZS51bmluaXRpYWxpemVQYXJzZXIoKEpTUENhcGFibGVQYXJzZXIpIHN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKSk7Ci0JCS8vIHNpbmNlICdkb2N1bWVudCcgaXMgbm90IHJlY3JlYXRlZCBpbiB0aGlzCi0JCS8vIHJlaW5pdCBwYXRoLCB3ZSBuZWVkIHRvIHJlbW92ZSBhbGwgYWRhcHRlcnMsCi0JCS8vIGV4Y2VwdCBmb3IgdGhlIHByb3BhZ2F0ZWQgYWRhcHRlcnMgKGluY2x1ZGluZyBwYWdlCi0JCS8vIGRpcmVjdGl2ZSBhZGFwdGVyLCBhbmQgbW9kZWwgcXVlcnkgYWRhcHRlcikuCi0JCS8vIHRvIGFjY29tcGxpc2ggdGhpcywgd2UnbGwganVzdCByZW1vdmUgYWxsLCB0aGVuCi0JCS8vIGFkZCBiYWNrIHdpdGggYSBjYWxsIHRvIHByZS1sb2FkIGFkYXB0LgotCQkvLyBsZXQgY2xpZW50cyBkZWNpZGUgdG8gdW5sb2FkIGFkYXB0ZXJzIGZyb20gZG9jdW1lbnQKLQkJLy8gQ29sbGVjdGlvbiBvbGRBZGFwdGVycyA9IGRvY3VtZW50LmdldEFkYXB0ZXJzKCk7Ci0JCS8vIEl0ZXJhdG9yIG9sZEFkYXB0ZXJzSXRlcmF0b3IgPSBvbGRBZGFwdGVycy5pdGVyYXRvcigpOwotCQkvLyB3aGlsZSAob2xkQWRhcHRlcnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJLy8gSU5vZGVBZGFwdGVyIG9sZEFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKQotCQkvLyBvbGRBZGFwdGVyc0l0ZXJhdG9yLm5leHQoKTsKLQkJLy8gaWYgKG9sZEFkYXB0ZXIgIT0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIgJiYgb2xkQWRhcHRlciAhPQotCQkvLyBwcm9wYWdhdGluZ0FkYXB0ZXIgJiYgb2xkQWRhcHRlciAhPSBtb2RlbFF1ZXJ5QWRhcHRlcikgewotCQkvLyAvLyBETyBOT1QgcmVtb3ZlIGRpcmVjdGx5IQotCQkvLyAvLyBjYW4gY2hhbmdlIGNvbnRlbnRzIHdoaWxlIGluIG5vdGlmaXR5IGxvb3AhCi0JCS8vIC8vb2xkQWRhcHRlcnNJdGVyYXRvci5yZW1vdmUoKTsKLQkJLy8gZG9jdW1lbnQucmVtb3ZlQWRhcHRlcihvbGRBZGFwdGVyKTsKLQkJLy8gfQotCQkvLyB9Ci0JCS8vIERNVzogSSBiZWxpZXZlIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgaXMgbmVlZGVkLAotCQkvLyBzaW5jZSByZWxlYXNlcyBjYWNoZWQgYWRhcHRlcnMKLQkJLy8gaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgRG9jdW1lbnRJbXBsKSB7Ci0JCS8vICgoRG9jdW1lbnRJbXBsKSBkb2N1bWVudCkucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQkvLyAoKERvY3VtZW50SW1wbCkgZG9jdW1lbnQpLnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkvLyB9Ci0JCS8vIHJlbWVtYmVyLCBlbWJlZGRlZCB0eXBlIGZhY3RvcmllcyBhcmUgYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4KLQkJLy8gZW1iZWRlZFR5cGUgY2hhbmdlZAotCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUobmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCS8vIC8vIGJ1dCBzdGlsbCBuZWVkIHRvIGNsZWFyIHRoZSBwYWdlIGRpcmVjdGl2ZSB3YXRjaGVycywgYW5kIGxldAotCQkvLyB0aGVtIGJlIHJlZGlzY292ZXJlZCAod2l0aCBuZXcsIGFjY3VyYXRlIG5vZGUgYXMgdGFyZ2V0KQotCQkvLyBwYWdlRGlyZWN0aXZlQWRhcHRlci5jbGVhclBhZ2VXYXRjaGVycygpOwotCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0KLQkJCS8vIG5lZWQgdG8gbnVsbCBvdXQgb3IgZWxzZSBNb2RlbFBhcnNlckFkYXB0ZXIKLQkJCS8vIHdvbid0IGdldCByZWluaXRpYWxpemVkCi0JCQkoKERPTU1vZGVsSW1wbCkgbW9kZWwpLnNldE1vZGVsUGFyc2VyKG51bGwpOwotCi0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCi0JCQkvLyBwYXJ0aXRpb25lciBzZXR1cCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBsb2FkZXIKLQkJCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRvY3VtZW50UGFydGl0aW9uZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQkJLy8gSVNTVUU6IHRoaXMgbG9naWMgaXMgZmxhd2VkLCBub3Qgc3VyZSBvZiBvcmlnaW5hbCBpbnRlbnQsIGJ1dAotCQkJLy8gYWRkZWQgbnVsbC90eXBlIGNoZWNrcyBmb3Igc2FmZXR5LgotCQkJaWYgKGRvY3VtZW50UGFydGl0aW9uZXIgIT0gbnVsbCAmJiBkb2N1bWVudFBhcnRpdGlvbmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgewotCQkJCWlmIChuZXdFbWJlZGRlZENvbnRlbnRUeXBlLmdldEZhbWlseUlkKCkuZXF1YWxzKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpKSB7Ci0JCQkJCSgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgZG9jdW1lbnRQYXJ0aXRpb25lcikuc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZS5nZXRGYW1pbHlJZCgpLmVxdWFscyhDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpKSB7Ci0JCQkJCSgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUCkgZG9jdW1lbnRQYXJ0aXRpb25lcikuc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFkZGluZyBsYW5ndWFnZSBoZXJlLCBpbiB0aGlzIGNvbnZpZW5lbnQgY2VudHJhbAotCQkvLyBsb2NhdGlvbiwgYnV0IHNvbWUgb2J2aW91cyByZW5hbWluZyBvciByZWZhY3RvcmluZwotCQkvLyB3b3VsZG4ndCBodXJ0LCBpbiBmdXR1cmUuCi0JCS8vIEkgbmVlZGVkIHRvIGFkZCB0aGlzIGxhbmd1YWdlIHNldHRpbmcgZm9yIEpTUCBGcmFnbWVudCBzdXBwb3J0Ci0JCS8vIE5vdGU6IHRoaXMgaXMgdGhlIG9uZSB0aGF0IGNvdW50cywgc2luY2UgYXQgdGhpcyBwb2ludCwKLQkJLy8gdGhlIG1vZGVsIGhhcyBhbiBJRCwgc28gd2UgY2FuIGxvb2sgdXAgSUZpbGUsIGV0Yy4KLQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobW9kZWwpOwotCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgInJlaW5pdGlhbGl6ZSIgc2luY2UgdGhlcmUgc2hvdWxkIGFsd2F5cyBiZSBhdCBsZWFzdCB0aGUKLQkgKiBkZWZhdWx0IG9uZSBhc3NpZ25lZCwgYmVmb3JlIHdlIHN0YXJ0IGNoZWNraW5nIHRoZSBzdHJlYW0KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdENsb25lT2ZFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRFbWJlZGRlZENvbnRlbnRUeXBlLCBFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUpIHsKLQkJLy8gY2hlY2sgcHJvZ3JhbSBsb2dpYwotCQlBc3NlcnQuaXNOb3ROdWxsKG9sZEVtYmVkZGVkQ29udGVudFR5cGUsICJQcm9ncmFtIGVycm9yOiBpbnZhbGlkIGNhbGwgZHVyaW5nIG1vZGVsIGluaXRpYWxpemF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gb25jZSB3ZSBrbm93IHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUsIHdlIG5lZWQgdG8gc2V0IGl0IGluIHRoZQotCQkvLyBQYWdlRGlyZWN0aXZlQWRhcHRlciAuLi4gdGhlIG9yZGVyIG9mIGluaXRpYWxpemF0aW9uIGlzCi0JCS8vIGNyaXRpY2FsIGhlcmUsIHRoZSBkb2MgbXVzdCBoYXZlIGJlZW4gY3JlYXRlZCwgYnV0IGl0cyBjb250ZW50cyBub3QKLQkJLy8gc2V0IHlldCwKLQkJLy8gYW5kIGFsbCBmYWN0b3JpZXMgbXVzdCBoYXZlIGJlZW4gc2V0IHVwIGFsc28uCi0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIG1vZGVsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCS8vID09PiAvLyBQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikKLQkJLy8gKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkvLyA9PT4gLy8gTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCS8vICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkvLyBiZWNhdXNlLCBldmVuIGluIHRoZSBjbG9uZSBjYXNlLCB0aGUgbW9kZWwgaGFzIGJlZW4gcGFyaXRhbGx5Ci0JCS8vIGludGlhbGl6ZWQgd2l0aAotCQkvLyB0aGUgb2xkIGVtYmVkZGVkIHR5cGUgKGR1cmluZyBjcmVhdGVNb2RlbCksIHdlIG5lZWQgdG8gdW5pdGlhbGl6ZQotCQkvLyBwYXJ0cyBvZiBpdCwgYmFzZWQgb24gdGhlIG9sZCAob3IgZGVmYXVsdCkgb25lcwotCQlvbGRFbWJlZGRlZENvbnRlbnRUeXBlLnVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCW9sZEVtYmVkZGVkQ29udGVudFR5cGUudW5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQkvLyByZW1lbWJlciwgZW1iZWRkZWQgdHlwZSBmYWN0b3JpZXMgYXJlIGF1dG9tYXRpY2FsbHkgY2xlYXJlZCB3aGVuCi0JCS8vIGVtYmVkZWRUeXBlIGNoYW5nZWQKLQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKG5ld0VtYmVkZGVkQ29udGVudFR5cGUpOwotCQlpZiAobmV3RW1iZWRkZWRDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQluZXdFbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQkJbmV3RW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplUGFyc2VyKChKU1BDYXBhYmxlUGFyc2VyKSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCkpOwotCQl9Ci0JCS8vIGFkZGluZyBsYW5ndWFnZSBoZXJlLCBpbiB0aGlzIGNvbnZpZW5lbnQgY2VudHJhbAotCQkvLyBsb2NhdGlvbiwgYnV0IHNvbWUgb2J2aW91cyByZW5hbWluZyBvciByZWZhY3RvcmluZwotCQkvLyB3b3VsZG4ndCBodXJ0LCBpbiBmdXR1cmUuCi0JCS8vIEkgbmVlZGVkIHRvIGFkZCB0aGlzIGxhbmd1YWdlIHNldHRpbmcgZm9yIEpTUCBGcmFnbWVudCBzdXBwb3J0Ci0JCS8vIE5vdGU6IHRoaXMgaXMgdGhlIG9uZSB0aGF0IGNvdW50cywgc2luY2UgYXQgdGhpcyBwb2ludCwKLQkJLy8gdGhlIG1vZGVsIGhhcyBhbiBJRCwgc28gd2UgY2FuIGxvb2sgdXAgSUZpbGUsIGV0Yy4KLQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobW9kZWwpOwotCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCXBhZ2VEaXJlY3RpdmVBZGFwdGVyLnNldExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlEb2N1bWVudCBkb2MgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIHBhZ2VEaXJlY3RpdmVBZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvYykuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRIYW5kbGVyID0gcGFnZURpcmVjdGl2ZUFkYXB0ZXIuZ2V0RW1iZWRkZWRUeXBlKCk7Ci0JCXJldHVybiBlbWJlZGRlZEhhbmRsZXI7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVByZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0KLQkJLy8gbm90ZTogdGhpcyB3aWxsIGN1cnJlbnRseSBvbmx5IHdvcmsgZm9yIG1vZGVscyBiYWNrZWQgYnkgZmlsZXMKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBlbWJlZGRlZENvbnRlbnRUeXBlID0gbnVsbDsKLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0KLQkJU3RyaW5nIHBvc3NpYmxlRmlsZUJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCi0JCWlmIChlbWJlZGRlZENvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IGdldENvbnRlbnREZXNjcmlwdGlvbihwb3NzaWJsZUZpbGVCYXNlTG9jYXRpb24pOwotCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCU9iamVjdCBwcm9wID0gbnVsbDsKLQotCQkJCXByb3AgPSBkZXNjLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9GQU1JTFlfQVRUUklCVVRFKTsKLQkJCQlpZiAocHJvcCAhPSBudWxsKSB7Ci0JCQkJCWlmIChDb250ZW50VHlwZUZhbWlseUZvckhUTUwuSFRNTF9GQU1JTFkuZXF1YWxzKHByb3ApKSB7Ci0JCQkJCQllbWJlZGRlZENvbnRlbnRUeXBlID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCkuZ2V0VHlwZUZvcigidGV4dC9odG1sIik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoZW1iZWRkZWRDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0KLQkJCQkJcHJvcCA9IGRlc2MuZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5DT05URU5UX1RZUEVfQVRUUklCVVRFKTsKLQkJCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQkJZW1iZWRkZWRDb250ZW50VHlwZSA9IEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpLmdldFR5cGVGb3IoKFN0cmluZykgcHJvcCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBwYWdlRGlyZWN0aXZlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQYWdlRGlyZWN0aXZlQWRhcHRlci5jbGFzcyk7Ci0KLQkJaWYgKGVtYmVkZGVkQ29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0RW1iZWRkZWRUeXBlKGVtYmVkZGVkQ29udGVudFR5cGUpOwotCQkJZW1iZWRkZWRDb250ZW50VHlwZS5pbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVzZSBkZWZhdWx0IGVtYmVkZGVkVHlwZSBpZiBpdCBjb3VsZG4ndCBkZXRlcm1pbmUgb25lCi0JCQllbWJlZGRlZENvbnRlbnRUeXBlID0gZ2V0SlNQRGVmYXVsdEVtYmVkZGVkVHlwZShtb2RlbCk7Ci0JCQlwYWdlRGlyZWN0aXZlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUoZW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQllbWJlZGRlZENvbnRlbnRUeXBlLmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkobW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVBvc3QoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkvLyBzaG91bGQgYWxyZWFkeSBiZSBpbml0aWFsaXplZCAoZnJvbSBpbml0RW1iZWRkZWRUeXBlUHJlKQotCQkvLyB2aWEgSUNvbnRlbnREZXNjcmlwdGlvbgotCQlzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGluaXRFbWJlZGRlZFR5cGUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZShJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCUVtYmVkZGVkVHlwZUhhbmRsZXIgZXhpc3RpbmdFbWJlZGRlZFR5cGUgPSBnZXRFbWJlZGRlZFR5cGUob2xkTW9kZWwpOwotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0VtYmVkZGVkQ29udGVudFR5cGUgPSBleGlzdGluZ0VtYmVkZGVkVHlwZS5uZXdJbnN0YW5jZSgpOwotCQlpZiAoZXhpc3RpbmdFbWJlZGRlZFR5cGUgPT0gbnVsbCkgewotCQkJaW5pdEVtYmVkZGVkVHlwZVByZShuZXdNb2RlbCk7Ci0JCQlpbml0RW1iZWRkZWRUeXBlUG9zdChuZXdNb2RlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpbml0RW1iZWRkZWRUeXBlKG5ld01vZGVsKTsKLQkJCWluaXRDbG9uZU9mRW1iZWRkZWRUeXBlKG5ld01vZGVsLCBleGlzdGluZ0VtYmVkZGVkVHlwZSwgbmV3RW1iZWRkZWRDb250ZW50VHlwZSk7Ci0JCQlzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShuZXdNb2RlbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRMYW5ndWFnZUluUGFnZURpcmVjdGl2ZShJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCWlmIChuZXdNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIG5ld01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoUGFnZURpcmVjdGl2ZUFkYXB0ZXIuY2xhc3MpOwotCQkJU3RyaW5nIGxhbmd1YWdlID0gZ2V0TGFuZ3VhZ2UobmV3TW9kZWwpOwotCQkJcGFnZURpcmVjdGl2ZUFkYXB0ZXIuc2V0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBvbGRIYW5kbGVyID0gbnVsbDsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdIYW5kbGVyID0gbnVsbDsKLQkJT2JqZWN0IHJlaW5pdFN0YXRlRGF0YSA9IG1vZGVsLmdldFJlaW5pdGlhbGl6ZVN0YXRlRGF0YSgpOwotCQlpZiAocmVpbml0U3RhdGVEYXRhIGluc3RhbmNlb2YgRW1iZWRkZWRUeXBlU3RhdGVEYXRhKSB7Ci0JCQlFbWJlZGRlZFR5cGVTdGF0ZURhdGEgb2xkU3RhdGVEYXRhID0gKEVtYmVkZGVkVHlwZVN0YXRlRGF0YSkgcmVpbml0U3RhdGVEYXRhOwotCQkJb2xkSGFuZGxlciA9IG9sZFN0YXRlRGF0YS5nZXRPbGRIYW5kbGVyKCk7Ci0JCQluZXdIYW5kbGVyID0gb2xkU3RhdGVEYXRhLmdldE5ld0hhbmRsZXIoKTsKLQkJCS8vIG5vdGUuIFdlIHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIG5ldyBoYW5kbGVyIGluIHRoZSBtb2RlbCdzCi0JCQkvLyAoZG9jdW1lbnRzKSBhZGFwdGVycywKLQkJCS8vIHNvIG5lZWQgbmVlZCB0byB1c2UgdGhlIG9sZCBvbmUgdG8gdW5kbyB0aGUgb2xkIHN0YXRlIGRhdGEKLQkJCXJlSW5pdGlhbGl6ZUVtYmVkZGVkVHlwZShtb2RlbCwgb2xkSGFuZGxlciwgbmV3SGFuZGxlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBmb3IgbGFuZ3VhZ2UgLi4uIHdlIHNvbWVkYXkgTUlHSFQgaGF2ZSB0byBkbyBzb21ldGhpbmcKLQkJCS8vIGhlcmUsIGJ1dCBmb3Igbm93LCB3ZSBkb24ndCBoYXZlIGFueSBtb2RlbC1zaWRlIGxhbmd1YWdlCi0JCQkvLyBzZW5zaXRpdmUgYWRhcHRlcnMuCi0JCX0KLQkJcmV0dXJuIHN1cGVyLnJlaW5pdGlhbGl6ZShtb2RlbCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBKU1BNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgSlNQRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgYW4gSW5wdXRTdHJlYW0gaGFzIG1hcmsvcmVzZXQgc3VwcG9ydC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oSW5wdXRTdHJlYW0gb3JpZ2luYWwpIHsKLQkJaWYgKG9yaWdpbmFsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9yaWdpbmFsLm1hcmtTdXBwb3J0ZWQoKSkKLQkJCXJldHVybiBvcmlnaW5hbDsKLQkJcmV0dXJuIG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG9yaWdpbmFsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGdldEJ5dGVzKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgbWF4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlieXRlW10gc21hbGxCdWZmZXIgPSBuZXcgYnl0ZVttYXhdOwotCQlieXRlW10gcmV0dXJuQnVmZmVyID0gbnVsbDsKLQkJaW50IG5SZWFkID0gaW5wdXRTdHJlYW0ucmVhZChzbWFsbEJ1ZmZlciwgMCwgbWF4KTsKLQkJaWYgKG5SZWFkIDwgbWF4KSB7Ci0JCQkvLyBlbXB0eSBmaWxlIHdpbGwgcmV0dXJuIC0xOwotCQkJaWYgKG5SZWFkIDwgMCkKLQkJCQluUmVhZCA9IDA7Ci0JCQlieXRlW10gc21hbGxlckJ1ZmZlciA9IG5ldyBieXRlW25SZWFkXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoc21hbGxCdWZmZXIsIDAsIHNtYWxsZXJCdWZmZXIsIDAsIG5SZWFkKTsKLQkJCXJldHVybkJ1ZmZlciA9IHNtYWxsZXJCdWZmZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm5CdWZmZXIgPSBzbWFsbEJ1ZmZlcjsKLQkJfQotCQlyZXR1cm4gcmV0dXJuQnVmZmVyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHN1cGVyLmNyZWF0ZU1vZGVsKG9sZE1vZGVsKTsKLQkJLy8gRm9yIEpTUHMsIHRoZSBNb2RlbFF1ZXJ5QWRhcHRlciBtdXN0IGJlICJhdHRhY2hlZCIgdG8gdGhlIGRvY3VtZW50Ci0JCS8vIGJlZm9yZSBjb250ZW50IGlzIHNldCBpbiB0aGUgbW9kZWwsIHNvIHRhZ2xpYiBpbml0aXphdGlvbiBjYW4KLQkJLy8gdGFrZSBwbGFjZS4KLQkJLy8gSW4gdGhpcyAiY2xvbmUgbW9kZWwiIGNhc2UsIHdlIGNyZWF0ZSBhIE1vZGVsUXVlcnkgYWRhcHRlcgotCQkvLyBjcmVhdGUgYSBuZXcgaW5zdGFuY2UgZnJvbSB0aGUgb2xkIGRhdGEuIE5vdGU6IEkgdGhpbmsgdGhpcwotCQkvLyAiZm9yY2VkIGZpdCIgb25seSB3b3JrcyBoZXJlIHNpbmNlIHRoZSBpbXBsaW1lbnRhaXRvbiBvZgotCQkvLyBNb2RlbFF1ZXJ5QWRhdHBlciBkb2VzIG5vdAotCQkvLyBoYXZlIHRvIGJlIHJlbGVhc2VkLgotCi0JCU1vZGVsUXVlcnlBZGFwdGVyIG1vZGVsUXVlcnlBZGFwdGVyID0gZ2V0TW9kZWxRdWVyeUFkYXB0ZXIobW9kZWwpOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJbW9kZWxRdWVyeUFkYXB0ZXIgPSBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihvbGRNb2RlbCk7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlkb2N1bWVudC5hZGRBZGFwdGVyKG5ldyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwobW9kZWxRdWVyeUFkYXB0ZXIuZ2V0Q01Eb2N1bWVudENhY2hlKCksIG1vZGVsUXVlcnlBZGFwdGVyLmdldE1vZGVsUXVlcnkoKSwgbW9kZWxRdWVyeUFkYXB0ZXIuZ2V0SWRSZXNvbHZlcigpKSk7Ci0KLQkJfQotCi0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbFF1ZXJ5QWRhcHRlciBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQotCQlNb2RlbFF1ZXJ5QWRhcHRlciBtb2RlbFF1ZXJ5QWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlcjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQ1NWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5KU1BEb2N1bWVudEhlYWRDb250ZW50RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmVuY29kaW5nLkpTUERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9ySlNQIGV4dGVuZHMgQWJzdHJhY3RNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0SWQoTW9kZWxIYW5kbGVySUQpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkSlNQVGFnTmFtZShKU1BTb3VyY2VQYXJzZXIgcGFyc2VyLCBTdHJpbmcgdGFnbmFtZSkgewotCQlCbG9ja01hcmtlciBibSA9IG5ldyBCbG9ja01hcmtlcih0YWduYW1lLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgdHJ1ZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BNb2RlbExvYWRlcigpOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgSlNQRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZTAyYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwgZXh0ZW5kcyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwgewotCXB1YmxpYyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5LCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKGNtRG9jdW1lbnRDYWNoZSwgbW9kZWxRdWVyeSwgaWRSZXNvbHZlcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YjEyNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWxRdWVyeUNNUHJvdmlkZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcgotCSAqLwotCXB1YmxpYyBKU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcigpIHsKLQkJc3VwZXIobmV3IEpTUE1vZGVsUXVlcnlDTVByb3ZpZGVyKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgzNjc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSlNQQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5Q01Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IHByb3ZpZGVyIGZvciBIVE1MIGFuZCBKU1AgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgY2xhc3MgSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Q01Qcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgSlNQTW9kZWxRdWVyeUNNUHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ01Eb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBET00gTm9kZS4gb3IgbnVsbCBpZiBubwotCSAqIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpIHsKLQkJQ01Eb2N1bWVudCBqY21kb2MgPSBKU1BDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0KLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQotCQkJCS8vIHRlc3QgdG8gc2VlIGlmIHRoaXMgbm9kZSBiZWxvbmdzIHRvIEpTUCdzIENNRG9jdW1lbnQgKGNhc2UKLQkJCQkvLyBzZW5zaXRpdmUpCi0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBqY21kb2MuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCQkJCWlmIChkZWMgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSBqY21kb2M7Ci0JCQkJfQotCQkJfQotCi0JCQlTdHJpbmcgcHJlZml4ID0gbm9kZS5nZXRQcmVmaXgoKTsKLQotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIHByZWZpeCAhPSBudWxsICYmIHByZWZpeC5sZW5ndGgoKSA+IDAgJiYgbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJLy8gY2hlY2sgcG9zaXRpb24gZGVwZW5kZW50Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCQlUTERDTURvY3VtZW50TWFuYWdlciB0bGRtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHhtbE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCWlmICh0bGRtZ3IgIT0gbnVsbCkgewotCQkJCQlMaXN0IGRvY3VtZW50cyA9IHRsZG1nci5nZXRDTURvY3VtZW50VHJhY2tlcnMobm9kZS5nZXRQcmVmaXgoKSwgeG1sTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJLy8gdGhlcmUgc2hvdWxkbid0IGJlIG1vcmUgdGhhbiBvbmUgY21kb2N1bWVudCByZXR1cm5lZAotCQkJCQlpZiAoZG9jdW1lbnRzICE9IG51bGwgJiYgZG9jdW1lbnRzLnNpemUoKSA+IDApCi0JCQkJCQlyZXN1bHQgPSAoQ01Eb2N1bWVudCkgZG9jdW1lbnRzLmdldCgwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9KU1BNb2RlbFF1ZXJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmOWRhY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0pTUE1vZGVsUXVlcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUE1vZGVsUXVlcnlJbXBsIGV4dGVuZHMgTW9kZWxRdWVyeUltcGwgewotCi0JLy8gSVNTVUU6IGpzcE1vZGVsIGRvZXNuJ3Qgc2VlbSB1c2VkPwotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIGpzcE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZW1iZWRkZWRNb2RlbFF1ZXJpZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEpTUE1vZGVsUXVlcnlJbXBsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFVSSVJlc29sdmVyIHJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBKU1BNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcigpKTsKLQkJanNwTW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kZWxRdWVyeSNnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50KQotCSAqLwotCXB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBxdWVyeSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShlbGVtZW50KTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgTW9kZWxRdWVyeSNnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlKQotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlDTURvY3VtZW50IGRvYyA9IHN1cGVyLmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkobm9kZSk7Ci0JCQlpZiAocXVlcnkgIT0gbnVsbCkgewotCQkJCWRvYyA9IHF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE1vZGVsUXVlcnkjZ2V0Q01Ob2RlKE5vZGUpCi0JICovCi0JcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKSB7Ci0JCUNNTm9kZSByZXN1bHQgPSBzdXBlci5nZXRDTU5vZGUobm9kZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBxdWVyeSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShub2RlKTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVlcnkuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlQ29udGVudChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMpIHsKLQkJTW9kZWxRdWVyeSBlbXEgPSBnZXRFbWJlZGRlZE1vZGVsUXVlcnkoZWxlbWVudCk7Ci0JCWlmIChlbXEgIT0gbnVsbCkKLQkJCXJldHVybiBlbXEuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCQllbHNlCi0JCQlyZXR1cm4gc3VwZXIuZ2V0QXZhaWxhYmxlQ29udGVudChlbGVtZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMpOwotCX0KLQotCS8vIElTU1VFOiBzaG91bGRuJ3QgdGhpcyBiZSBwcml2YXRlPwotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldEVtYmVkZGVkTW9kZWxRdWVyeShOb2RlIG5vZGUpIHsKLQkJTW9kZWxRdWVyeSBlbWJlZGRlZE1vZGVsUXVlcnkgPSBudWxsOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgeyAKLQkJCU5vZGUgb3duZXJOb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAob3duZXJOb2RlID09IG51bGwpIHsKLQkJCQkvLyB0aGVuIG11c3QgYmUgdGhlIGRvY3VtZW50IGl0c2VsZgotCQkJCW93bmVyTm9kZSA9IG5vZGU7IAotCQkJfQotCQkJUGFnZURpcmVjdGl2ZUFkYXB0ZXIgcGFnZURpcmVjdGl2ZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgb3duZXJOb2RlKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChwYWdlRGlyZWN0aXZlQWRhcHRlciAhPSBudWxsKSB7Ci0KLQkJCQlTdHJpbmcgZWZmZWN0aXZlQ29udGVudFR5cGUgPSBudWxsOwotCQkJCU1vZGVsUXVlcnkgcG90ZW50aWFsTW9kZWxRdWVyeU9iamVjdCA9IG51bGw7Ci0KLQkJCQlTdHJpbmcgZmFtaWx5SWQgPSBwYWdlRGlyZWN0aXZlQWRhcHRlci5nZXRFbWJlZGRlZFR5cGUoKS5nZXRGYW1pbHlJZCgpOwotCQkJCWlmIChDb250ZW50VHlwZUZhbWlseUZvckhUTUwuSFRNTF9GQU1JTFkuZXF1YWxzKGZhbWlseUlkKSkgewotCQkJCQllZmZlY3RpdmVDb250ZW50VHlwZSA9ICJ0ZXh0L2h0bWwiOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZWZmZWN0aXZlQ29udGVudFR5cGUgPSBwYWdlRGlyZWN0aXZlQWRhcHRlci5nZXRDb250ZW50VHlwZSgpOwotCQkJCX0KLQkJCQkKLQkJCQlwb3RlbnRpYWxNb2RlbFF1ZXJ5T2JqZWN0ID0gKE1vZGVsUXVlcnkpIGVtYmVkZGVkTW9kZWxRdWVyaWVzLmdldChlZmZlY3RpdmVDb250ZW50VHlwZSk7Ci0JCQkJCi0JCQkJaWYgKHBvdGVudGlhbE1vZGVsUXVlcnlPYmplY3QgPT0gbnVsbCkgewotCQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBlbWJlZGRlZEFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpIHBhZ2VEaXJlY3RpdmVBZGFwdGVyLmFkYXB0KChJTm9kZU5vdGlmaWVyKSBub2RlLCBNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7Ci0JCQkJCWlmIChlbWJlZGRlZEFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJLy8gd2Ugd2lsbCBjYWNoZSBvbmUgbW9kZWwgcXVlcnkgcGVyIGNvbnRlbnQgdHlwZQotCQkJCQkJZW1iZWRkZWRNb2RlbFF1ZXJ5ID0gZW1iZWRkZWRBZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsKLQkJCQkJCWVtYmVkZGVkTW9kZWxRdWVyaWVzLnB1dChlZmZlY3RpdmVDb250ZW50VHlwZSwgZW1iZWRkZWRNb2RlbFF1ZXJ5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZW1iZWRkZWRNb2RlbFF1ZXJ5ID0gcG90ZW50aWFsTW9kZWxRdWVyeU9iamVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVtYmVkZGVkTW9kZWxRdWVyeTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5I2dldENNQXR0cmlidXRlRGVjbGFyYXRpb24ob3JnLnczYy5kb20uQXR0cikKLQkgKi8KLQlwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikgewotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHJlc3VsdCA9IHN1cGVyLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJTW9kZWxRdWVyeSBxdWVyeSA9IGdldEVtYmVkZGVkTW9kZWxRdWVyeShhdHRyKTsKLQkJCWlmIChxdWVyeSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVlcnkuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQkvKioKLQkgKiBOT1QgQVBJIC0tIHRoaXMgaXMgcHJvdmlkZWQsIGFuZCBpcyBwdWJsaWMsIG9ubHkgdG8gbWFrZSBzb21lIEpVbml0IHRlc3RpbmcgCi0JICogbW9yZSBzdHJhaWdodGZvcndhcmQuIEl0IHdpbGwgYmUgY2hhbmdlZCBpbiBmdXR1cmUsIGFuZCBmcm9tIHJlbGVhc2UgdG8gcmVsZWFzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeSBpbnRlcm5hbFRlc3RPbmx5X2dldEVtYmVkZGVkTW9kZWxRdWVyeShOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIGdldEVtYmVkZGVkTW9kZWxRdWVyeShub2RlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2I3MjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5YTUxDYXRhbG9nSWRSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgSlNQTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIHN0YXRlTm90aWZpZXIgPSBudWxsOwotCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckpTUCgpIHsKLQkJdGhpcyhNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySlNQIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJLZXkKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoT2JqZWN0IGtleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGtleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCi0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JKU1AuY3JlYXRlQWRhcHRlciIgKyB0YXJnZXQpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtb2RlbFF1ZXJ5QWRhcHRlckltcGwgPT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBzdGF0ZU5vdGlmaWVyID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkvLyBjb250aW51ZSBvbmx5IGlmIHRoZSBsb2NhdGlvbiBpcyBrbm93bgotCQkJCWlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCQlzdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCQkJQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSA9IG5ldyBDTURvY3VtZW50Q2FjaGUoKTsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpLnRvRmlsZSgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCQkJSVBhdGggZGVyaXZlZFBhdGggPSBudWxsOwotCQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCQlkZXJpdmVkUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkZXJpdmVkUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQoYmFzZVBhdGgpOwotCQkJCQkJaWYgKGRlcml2ZWRQYXRoICE9IG51bGwpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBkZXJpdmVkUGF0aC50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gbmV3IFhNTENhdGFsb2dJZFJlc29sdmVyKGJhc2VMb2NhdGlvbiwgbW9kZWwuZ2V0UmVzb2x2ZXIoKSk7Ci0KLQkJCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gbmV3IEpTUE1vZGVsUXVlcnlJbXBsKG1vZGVsLCByZXNvbHZlcik7Ci0JCQkJCW1vZGVsUXVlcnkuc2V0RWRpdE1vZGUoTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRCk7Ci0JCQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbCA9IG5ldyBKU1BNb2RlbFF1ZXJ5QWRhcHRlckltcGwoY21Eb2N1bWVudENhY2hlLCBtb2RlbFF1ZXJ5LCByZXNvbHZlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsRGlydHlTdGF0ZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsLAotCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkvLyBpZiBvbGRNb2RlbCAhPSBuZXdNb2RlbCwgYmFkIHRoaW5ncyBtaWdodCBoYXBwZW4gd2l0aCB0aGUgYWRhcHRlcgotCQlzdGF0ZU5vdGlmaWVyLnJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJc3RhdGVOb3RpZmllciA9IG5ld01vZGVsOwotCQl1cGRhdGVSZXNvbHZlcihzdGF0ZU5vdGlmaWVyKTsKLQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWlmIChzdGF0ZU5vdGlmaWVyICE9IG51bGwpIHsKLQkJCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCXN0YXRlTm90aWZpZXIgPSBudWxsOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsICE9IG51bGwpIHsKLQkJCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVSZXNvbHZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJSUZpbGUgYmFzZUZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpKTsKLQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCWJhc2VMb2NhdGlvbiA9IGJhc2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwuc2V0SWRSZXNvbHZlcihuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCBtb2RlbC5nZXRSZXNvbHZlcigpKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCXVwZGF0ZVJlc29sdmVyKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUERpcmVjdGl2ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMmM0OTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQuWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQkvKioKLQkgKiBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSlNQRGlyZWN0aXZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIFRoaXMgaXMgYSBsYW5ndWFnZSBzcGVjaWZpYyBtZXRob2QgKGUuZy4gSFRNTCwgSmF2YSwgUHJvbG9nLCBldGMuKSBzbwotCS8vIGNvdWxkL3Nob3VsZCBiZSBtYWRlIGNvbmZpZ3VyYWJsZS4KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BSZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDYzNjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5KU1AxMVRMRE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMk5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQ29yZU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUFJlUGFyc2VyIGV4dGVuZHMgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JLyoqCi0JICogQWxsb3cgYSByZXBhcnNlciB0byBjaGVjayBmb3IgZXh0cmEgc3ludGFjdGljIGNhc2VzIHRoYXQgcmVxdWlyZQotCSAqIHBhcnNpbmcgYmV5b25kIHRoZSBmbGF0Tm9kZSBib3VuZGFyeS4KLQkgKiAKLQkgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgSlNQIGxhbmd1YWdlIG1hcmtlcnMgKGNvbW1lbnRzIGFyZSBoYW5kbGVkCi0JICogZWxzZXdoZXJlKS4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3VwZXIuY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpOwotCQkvLyBOb25lIG9mIHRoZSBzdXBlcmNsYXNzJyBjYXNlcyB3ZXJlIHZhbGlkLCBzbyBjaGVjayBmb3IgSlNQIGNhc2VzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JKU1AoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEEgY2hhbmdlIHRvIGEgSlNQIHRhZyBjYW4gcmVzdWx0IGluIGFsbCBiZWluZyByZXBhcnNlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9ySlNQKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlPSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlISIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIiU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIGEgY29tbWVudCBzdGFydCBvciBlbmQgdGFnIGlzIGJlaW5nIGFkZGVkIG9yIGRlbGV0ZWQsIHdlJ2xsIHJlc2NhbgotCSAqIHRoZSB3aG9sZSBkb2N1bWVudC4gVGhlIHJlYXNvbiBpcyB0aGF0IGNvbnRlbnQgdGhhdCBpcyByZXZlYWxlZCBvcgotCSAqIGNvbW1lbnRlZCBvdXQgY2FuIGVmZmVjdCB0aGUgaW50ZXJwcmV0YXRpb24gb2YgdGhlIHJlc3Qgb2YgdGhlCi0JICogZG9jdW1lbnQuIE5vdGU6IGZvciBub3cgdGhpcyBpcyB2ZXJ5IFhNTC9KU1Agc3BlY2lmaWMsIGNhbgotCSAqIHJlZmFjdG9yL2ltcHJvdmUgbGF0ZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ29tbWVudHMoKSB7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3VwZXIuY2hlY2tGb3JDb21tZW50cygpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwlLS0iKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCItLSU+Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gd2UnbGwgYWxzbyBjaGVjayBmb3IgdGhlc2UgZGVnZW5lcmF0ZSBjYXNlcwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8JS0tLSU+Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBjb3JlIHJlcGFyc2luZyBtZXRob2QgLi4uIGFmdGVyIHRoZSBkaXJ0eSBzdGFydCBhbmQgZGlydHkgZW5kIGhhdmUKLQkgKiBiZWVuIGNhbGN1bGF0ZWQgZWxzZXdoZXJlLiAtIHRoaXMgbWV0aG9kIG92ZXJyaWRlcywgZG9lcyBub3QgZXh0ZW5kCi0JICogc3VwZXIncyBtZXRob2QuIGNoYW5nZXMvZml4ZXMgdG8gc3VwZXIgbWF5IGhhdmUgdG8gYmUgbWFkZSBoZXJlIGFzCi0JICogd2VsbC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwYXJzZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJaW50IHJlc2NhblN0YXJ0ID0gLTE7Ci0JCWludCByZXNjYW5FbmQgPSAtMTsKLQkJYm9vbGVhbiBmaXJzdFRpbWUgPSBmYWxzZTsKLQkJYm9vbGVhbiBkZXRlY3RlZEJyZWFraW5nQ2hhbmdlID0gZmFsc2U7Ci0KLQkJLy8KLQkJLy8gInNhdmUiIHRoZSBvbGROb2RlcyAodGhhdCBtYXkgYmUgcmVwbGFjZWQpIGluIGEgbGlzdAotCQlDb3JlTm9kZUxpc3Qgb2xkTm9kZXMgPSBmb3JtT2xkTm9kZXMoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCi0JCWlmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG9sZE5vZGVzKSB8fCBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCkpIHsKLQkJCWlmIChEZWJ1Zy5kZWJ1Z1RhZ2xpYnMpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXBhcnNlOiBpcyB0YWdsaWIgb3IgaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCQlkZXRlY3RlZEJyZWFraW5nQ2hhbmdlID0gdHJ1ZTsKLQkJCXJlc2NhblN0YXJ0ID0gMDsKLQkJCXJlc2NhbkVuZCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgKyBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCW9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJY2xlYXJUYWdsaWJJbmZvKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZGlydHlTdGFydCA9PSBudWxsIHx8IGRpcnR5RW5kID09IG51bGwpIHsKLQkJCS8vIGRpcnR5U3RhcnQgb3IgZGlydHkgZW5kIGFyZSBudWxsLCB0aGVuIHRoYXQgbWVhbnMgd2UgZGlkbid0Ci0JCQkvLyBoYXZlIGEKLQkJCS8vIGNhY2hlZCBub2RlLCB3aGljaCBtZWFucyB3ZSBoYXZlIGFuIGVtcHR5IGRvY3VtZW50LCBzbyB3ZQotCQkJLy8ganVzdCBuZWVkIHRvIHJlc2NhbiB0aGUgY2hhbmdlcwotCQkJcmVzY2FuU3RhcnQgPSAwOwotCQkJcmVzY2FuRW5kID0gZkNoYW5nZXMubGVuZ3RoKCk7Ci0JCQlmaXJzdFRpbWUgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gc2V0IHRoZSBzdGFydCBvZiB0aGUgdGV4dCB0byByZXNjYW4KLQkJCXJlc2NhblN0YXJ0ID0gZGlydHlTdGFydC5nZXRTdGFydCgpOwotCQkJLy8KLQkJCS8vIHNldCB0aGUgZW5kIG9mIHRoZSB0ZXh0IHRvIHJlc2NhbgotCQkJLy8gbm90aWNlIHdlIHVzZSB0aGUgc2FtZSByYXRpb25hbGUgYXMgZm9yIHRoZSByZXNjYW5TdGFydCwKLQkJCS8vIHdpdGggdGhlIGFkZGVkIGNhdmVhdCB0aGF0IGxlbmd0aCBoYXMgdG8gYmUgYWRkZWQgdG8gaXQsCi0JCQkvLyB0byBjb21wZW5zYXRlIGZvciB0aGUgbmV3IHRleHQgd2hpY2ggaGFzIGJlZW4gYWRkZWQgb3IgZGVsZXRlZC4KLQkJCS8vIElmIGNoYW5nZXMgaGFzIHplcm8gbGVuZ3RoLCB0aGVuICJsZW5ndGgiIHdpbGwgYmUgbmVnYXRpdmUsCi0JCQkvLyBzaW5jZQotCQkJLy8gd2UgYXJlIGRlbGV0aW5nIHRleHQuIE90aGVyd2lzZSwgdXNlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KLQkJCS8vIHdoYXQncyBzZWxlY3RlZCB0byBiZSByZXBsYWNlZCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IHRleHQuCi0JCQlyZXNjYW5FbmQgPSBkaXJ0eUVuZC5nZXRFbmQoKSArIGZMZW5ndGhEaWZmZXJlbmNlOwotCQl9Ci0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgb2xkIHN0dWZmICJzYXZlZCIgYXdheSwgdXBkYXRlIHRoZSBkb2N1bWVudAotCQkvLyB3aXRoIHRoZSBjaGFuZ2VzLgotCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tIG5vdyB0aGUgcmVhbCB3b3JrCi0JCXJlc3VsdCA9IGNvcmVfcmVwYXJzZShyZXNjYW5TdGFydCwgcmVzY2FuRW5kLCBvbGROb2RlcywgZmlyc3RUaW1lKTsKLQkJLy8KLQotCQkvLyBpZiB3ZSBkaWQgbm90IGRldGVjdCBhIGJyZWFraW5nIHR5cGUgb2YgY2hhbmdlIGF0IHRoZSBiZWdpbm5pbmcsCi0JCS8vIGJ1dAotCQkvLyBkbyBub3csIHRoZW4gcmVwYXJzZSBhbGwhIElmIHdlIGRpZCBkZXRlY3QgdGhlbSwgdGhlbiB3ZSBtYXkgb3IgbWF5Ci0JCS8vIG5vdCBkZXRlY3QgYWdhaW4sIGJ1dCBwcmVzdW1hYmx5IHdlJ3ZlIGFscmVhZHkgc2V0IHVwIHRvIHJlLXBhcnNlZAotCQkvLyBldmVydGhpbmcsIHNvIG5vIG5lZWQgdG8gZG8gYWdhaW4uCi0JCWlmICgoIWRldGVjdGVkQnJlYWtpbmdDaGFuZ2UpICYmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG9sZE5vZGVzKSkpIHsKLQkJCWNsZWFyVGFnbGliSW5mbygpOwotCQkJLy8gcmVwYXJzZSBhbGwKLQkJCW9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJcmVzdWx0ID0gY29yZV9yZXBhcnNlKDAsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIG9sZE5vZGVzLCBmaXJzdFRpbWUpOwotCQl9Ci0KLQkJLy8gZXZlbnQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgaW5jYXNlIHRoZXJlIGlzCi0JCS8vIHNvbWUgb3B0aW1pemF0aW9uIHRoZXkgY2FuIGRvCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgY29udGFpbiByZWdpb25zIHRoYXQgY291bGQgYWx0ZXIgdGhlCi0JICogYmVoYXZpb3Igb2YgdGhlIHBhcnNlciBvciB0aGUgcGFyc2luZyBvZiBhcmVhcyBvdXRzaWRlIG9mIHRoZSByZWdpb25zCi0JICogZ2l2ZW4uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdDaGFuZ2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlyZXR1cm4gaXNUYWdsaWJPckluY2x1ZGUobm9kZSwgcmVnaW9ucykgfHwgaXNKc3BSb290KHJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgcmVnaW9ucyB0b3VjaGVkIGJ5IGEKLQkgKiB0ZXh0IGNoYW5nZSBoYXZlOiAxKSAuLi5hbiBpbnNlcnRpb24gYXQgdGhlIHRleHRFbmRPZmZzZXQgb2YgYW4KLQkgKiBYTUxfVEFHX09QRU4gdGhhdCdzIGluIGl0J3Mgb3duIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYW5kIHByZWNlZGVkCi0JICogYnkgYW4gdW5lbmRlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIDIpIC4uLmEgZGVsZXRpb24gaGFwcGVuaW5nIGluCi0JICogYW4gWE1MX0VNUFRZX1RBR19DTE9TRSB0aGF0IGVuZHMgYSBJVGV4dFJlZ2lvbkNvbnRhaW5lciAzKSAuLi5hbgotCSAqIGluc2VydGlvbiBoYXBwZW5pbmcgd2l0aCBhICcgPCcgY2hhcmFjdGVyIHNvbWV3aGVyZSBpbiBhbiBYTUwgYXR0cmlidXRlCi0JICogbmFtZSBvciB2YWx1ZSA0KSAuLi5hIGRlbGV0aW9uIG9mIGEgbm9ybWFsIFhNTF9UQUdfQ0xPU0Ugc2luY2UKLQkgKiBzdWJzZXF1ZW50IHRhZ3MgYmVjb21lIGF0dHJpYnV0ZSB2YWx1ZXMKLQkgKi8KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JyZWFraW5nV2l0aE5lc3RlZFRhZyhib29sZWFuIGNoYW5nZXNJbmNsdWRlQV9sdCwgYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzID0gcGFyZW50LmdldFByZXZpb3VzKCk7Ci0JCS8vIGNhc2UgMSB0ZXN0Ci0JCWlmIChwYXJlbnQuZ2V0UmVnaW9ucygpLnNpemUoKSA9PSAxICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgKHByZXZpb3VzID09IG51bGwgfHwgKCFwcmV2aW91cy5pc0VuZGVkKCkgfHwgcHJldmlvdXMuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQkvLyBjYXNlIDIgdGVzdAotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uOwotCQkJSVRleHRSZWdpb24gaW50ZXJuYWwgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldChjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQkJaWYgKGludGVybmFsLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LldISVRFX1NQQUNFICYmIGNvbnRhaW5lci5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDIpCi0JCQkJaW50ZXJuYWwgPSBjb250YWluZXIuZ2V0UmVnaW9ucygpLmdldChjb250YWluZXIuZ2V0UmVnaW9ucygpLnNpemUoKSAtIDIpOwotCQkJaWYgKGludGVybmFsLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGNhc2UgMyB0ZXN0Ci0JCWlmIChjaGFuZ2VzSW5jbHVkZUFfbHQgJiYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQkJLy8gY2FzZSA0IHRlc3QKLQkJaWYgKGRlbHNJbmNsdWRlQV9ndCAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZ2lvbnMgZ2l2ZW4sIHJlcHJlc2VudGluZyB0aGUgY29udGVudHMgb2YgYQotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGluY2x1ZGVzIGEganNwOnJvb3QgdGFnCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSnNwUm9vdChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlyZXR1cm4gcmVnaW9ucy5zaXplKCkgPiAxICYmIHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiByZWdpb25zLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUU7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgdGhhdCB0aGUgcmVnaW9ucyBnaXZlbiwgcmVwcmVzZW50aW5nIHRoZSBjb250ZW50cyBvZiBhCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaW5jbHVkZXMgYSB2YWxpZCB0YWdsaWIgZGlyZWN0aXZlIG9yIGluY2x1ZGUKLQkgKiBkaXJlY3RpdmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUYWdsaWJPckluY2x1ZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlLCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlib29sZWFuIHNpemVBbmRUeXBlc01hdGNoID0gKHJlZ2lvbnMuc2l6ZSgpID4gMSkgJiYgKHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpICYmIChyZWdpb25zLmdldCgwKS5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTik7Ci0JCWlmICghc2l6ZUFuZFR5cGVzTWF0Y2gpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDEpOwotCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IG5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlyZXR1cm4gc2l6ZUFuZFR5cGVzTWF0Y2ggJiYgKGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDExVExETmFtZXMuVEFHTElCKSB8fCBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMVRMRE5hbWVzLklOQ0xVREUpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpIHx8IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9JTkNMVURFKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFyVGFnbGliSW5mbygpIHsKLQkJaWYgKERlYnVnLmRlYnVnVGFnbGlicykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2xlYXJpbmcgdGFnbGliIGluZm8iKTsgLy8kTk9OLU5MUy0xJAotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikKLQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBwYXJzZXIpLnJlc2V0SGFuZGxlcnMoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY29udGFpbnNCcmVha2luZ0NoYW5nZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBsaXN0KSB7Ci0JCWJvb2xlYW4gY29udGFpbnMgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCWlmIChpc0JyZWFraW5nQ2hhbmdlKG5vZGUsIG5vZGUuZ2V0UmVnaW9ucygpKSkgewotCQkJCWNvbnRhaW5zID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGFpbnM7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZERpcnR5RW5kKGludCBlbmQpIHsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IHN1cGVyLmZpbmREaXJ0eUVuZChlbmQpOwotCi0JCS8vIGlmIG5vdCB3ZWxsIGZvcm1lZCwgZ2V0IG9uZSBwYXN0LCBpZiBpdHMgbm90IG51bGwKLQotCQkvLyBub3csIGlmIGFueSBvZiB0by1iZS1zY2FubmVkIGZsYXRub2RlcyBhcmUgdGhlIHN0YXJ0IG9mIGEganNwCi0JCS8vIHJlZ2lvbiwgd2UnbGwKLQkJLy8gcmVwYXJzZSBhbGwgdGhlIHdheSB0byB0aGUgZW5kLCB0byBiZSBzdXJlIHdlIGRldGVjdCBlbWJlZGRlZAotCQkvLyByZWdpb25zIChvciBub3QtZW1iZWRkZWQgcmVnaW9ucykgY29ycmVjdGx5LgotCQkvLyBub3RpY2Ugd2UgZG9uJ3QgbmVlZCB0byBkbyBpZiB3ZSdyZSBvbmx5IHByb2Nlc3Npbmcgb25lIG5vZGUuCi0JCS8vIG5vdGljZSB0b28gd2UgaGF2ZSBhIHN0cm9uZyBhc3N1bXB0aW9uIGhlcmUgdGhhdCBkaXJ0eVN0YXJ0IGhhcwotCQkvLyBhbHJlYWR5IGJlZW4gZm91bmQhCi0JCS8vCi0JCS8vIG5vdGUgdGhhdCBkaXJ0eUVuZCBpcyBub3QgY2hlY2tlZCBpbiB0aGUgZG8tYmxvY2sgYmVsb3csIHNvIHdlJ2xsCi0JCS8vIGNoZWNrIGl0IGZpcnN0LgotCQlpZiAoaXNKU1BFbWJlZGRlZFN0YXJ0T3JFbmQocmVzdWx0KSkgewotCQkJcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3aGVuIGVuZCBub2RlIGFuZCBzdGFydCBub2RlIGFyZSB0aGUgc2FtZSwgd2Ugb25seSBuZWVkIHRoZQotCQkJLy8gYWJvdmUKLQkJCS8vIGNoZWNrLCBvdGhlcndpc2UsIHRoZXJlJ3MgYSBmZXcgY2FzZXMgdGhhdCB3ZSdsbCBzZWFyY2ggdGhlCi0JCQkvLyByZXN0IG9mIHRoZQotCQkJLy8gZmxhdG5vZGVzIG5lZWRsZXNzbHkuCi0JCQlpZiAocmVzdWx0ICE9IGRpcnR5U3RhcnQpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNlYXJjaE5vZGUgPSBkaXJ0eVN0YXJ0OwotCQkJCWRvIHsKLQkJCQkJaWYgKGlzSlNQRW1iZWRkZWRTdGFydE9yRW5kKHNlYXJjaE5vZGUpKSB7Ci0JCQkJCQlyZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc2VhcmNoTm9kZSA9IHNlYXJjaE5vZGUuZ2V0TmV4dCgpOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHdlIGdldCB0byB0aGUgY3VycmVudCBkaXJ0eSBlbmQsIG9yIGVuZCBvZgotCQkJCQkvLyBmbGF0bm9kZXMsIHdpdGhvdXQgZmluZGluZyBKU1AgcmVnaW9uIHRoZW4gd2UKLQkJCQkJLy8gZG9uJ3QgbmVlZCB0byBjaGVjayBmdXJ0aGVyCi0JCQkJfQotCQkJCXdoaWxlICgoc2VhcmNoTm9kZSAhPSByZXN1bHQpICYmIChzZWFyY2hOb2RlICE9IG51bGwpKTsKLQkJCX0KLQkJfQotCQkvLyByZXN1bHQgc2hvdWxkIG5ldmVyIGJlIG51bGwsIGJ1dCBjYWNoZWROb2RlIG5lZWRzIHRvIGJlIHByb3RlY3RlZAotCQkvLyBmcm9tIGJlaW5nIGNoYW5nZWQgdG8gbnVsbAotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtpbmdXaXRoTmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWJvb2xlYW4gY2hhbmdlc0luY2x1ZGVBX2x0ID0gZkNoYW5nZXMgIT0gbnVsbCAmJiBmQ2hhbmdlcy5pbmRleE9mKCc8JykgPj0gMDsKLQkJYm9vbGVhbiBkZWxzSW5jbHVkZUFfZ3QgPSBmRGVsZXRlZFRleHQgIT0gbnVsbCAmJiBmRGVsZXRlZFRleHQuaW5kZXhPZignPicpID49IDA7Ci0KLQkJLy8gTGlzdCByZWdpb25zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzdGFydDsKLQkJaW50IGVuZFJlcGxhY2UgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlOwotCQl3aGlsZSAoZW5kICE9IG51bGwgJiYgbm9kZSAhPSBlbmQuZ2V0TmV4dCgpKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGludGVyc2VjdHMobm9kZSwgcmVnaW9uLCBmU3RhcnQsIGVuZFJlcGxhY2UpKSB7Ci0KLQkJCQkJcmVzdWx0ID0gaXNCcmVha2luZ1dpdGhOZXN0ZWRUYWcoY2hhbmdlc0luY2x1ZGVBX2x0LCBkZWxzSW5jbHVkZUFfZ3QsIG5vZGUsIHJlZ2lvbik7Ci0KLQkJCQkJaWYgKHJlc3VsdCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCWlmIChyZXN1bHQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW50ZXJzZWN0cyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGxvdywgaW50IGhpZ2gpIHsKLQkJaW50IHN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQlpbnQgZW5kID0gbm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJcmV0dXJuIChlbmQgPj0gbG93ICYmIHN0YXJ0IDw9IGhpZ2gpIHx8IChzdGFydCA8PSBsb3cgJiYgZW5kID49IGxvdykgfHwgKHN0YXJ0IDw9IGhpZ2ggJiYgZW5kID49IGhpZ2gpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBwb3RlbnRpYWxseSBjb3VsZCBiZSBhIGpzcCBlbWJlZGRlZCByZWdpb24uIFRoaW5ncyBsaWtlCi0JICogSlNQIERlY2xhcmF0aW9uIGNhbid0IGJlIGVtYmVkZGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUEVtYmVkZGVkU3RhcnRPckVuZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlyZXN1bHQgPSAoKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGV4dGVuZHMgc3VwZXIgY2xhc3MgYmVoYXZpb3IKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1BhcnRPZkJsb2NrUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCXJlc3VsdCA9ICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB8fCBzdXBlci5pc1BhcnRPZkJsb2NrUmVnaW9uKGZsYXROb2RlKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IEpTUFJlUGFyc2VyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHF1aWNrQ2hlY2soKSB7Ci0JCWlmIChjb250YWluc0JyZWFraW5nQ2hhbmdlKG5ldyBDb3JlTm9kZUxpc3QoZGlydHlTdGFydCwgZGlydHlFbmQpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gc3VwZXIucXVpY2tDaGVjaygpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUFNvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjFkYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsLkpTUFRva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuSlNQQ2FwYWJsZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JUmVnaW9uQ29tcGFyaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBUYWtlcyBpbnB1dCBmcm9tIHRoZSBKU1BUb2tlbml6ZXIgYW5kIGNyZWF0ZXMgYSB0YWcgbGlzdAotICovCi0KLXB1YmxpYyBjbGFzcyBKU1BTb3VyY2VQYXJzZXIgZXh0ZW5kcyBYTUxTb3VyY2VQYXJzZXIgaW1wbGVtZW50cyBKU1BDYXBhYmxlUGFyc2VyIHsKLQlwcm90ZWN0ZWQgY2xhc3MgTmVzdGFibGVQcmVmaXhIYW5kbGVyIGltcGxlbWVudHMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiB7Ci0KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zOiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvKioKLQkJICogRW5hYmxlcyBhIFRMRCBvd25pbmcgdGhlIGdpdmVuIHByZWZpeCBsb2FkZWQgZnJvbSB0aGUgZ2l2ZW4gVVJJIGF0Ci0JCSAqIHRoZSBhbmNob3JGbGF0Tm9kZS4gVGhlIGxpc3Qgb2YgYWRkaXRpb25hbENNRG9jdW1lbnRzIHdpbGwgY2xhaW0gdG8KLQkJICogbm90IGtub3cgYW55IG9mIGl0cyB0YWdzIGF0IHBvc2l0aW9ucyBlYXJsaWVyIHRoYW4gdGhhdAotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uJ3MgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBGb3IgdGFnbGliIGRpcmVjdGl2ZXMsIHRoZSB0YWdsaWIgaXMgdGhlIGFuY2hvciB3aGlsZSB0YWdsaWJzCi0JCSAqIHJlZ2lzdGVyZWQgdGhyb3VnaCBpbmNsdWRlIGRpcmVjdGl2ZXMgdXNlIHRoZSBwcmltYXJ5IGluY2x1ZGUKLQkJICogZGlyZWN0aXZlIGFzIHRoZWlyIGFuY2hvci4KLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGVuYWJsZUZvclRhZ2xpYihTdHJpbmcgcHJlZml4LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuY2hvckZsYXROb2RlKSB7Ci0JCQlpZiAocHJlZml4ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJTGlzdCB0YWdtYXJrZXJzID0gKChKU1BUb2tlbml6ZXIpIGdldFRva2VuaXplcigpKS5nZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRhZ21hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlpZiAoKChUYWdNYXJrZXIpIHRhZ21hcmtlcnMuZ2V0KGkpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHByZWZpeCkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCSgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkuZ2V0TmVzdGFibGVQcmVmaXhlcygpLmFkZChuZXcgVGFnTWFya2VyKHByZWZpeCwgYW5jaG9yRmxhdE5vZGUpKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhQ29yZUZsYXROb2RlKSB7Ci0JCQkvLyBjb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgOCAoPCVALAotCQkJLy8gdGFnbGliLCB1cmksID0sIHdoZXJlLCBwcmVmaXgsID0sIHdoYXQpIFtvciA0IGZvciBpbmNsdWRlc10KLQkJCWlmIChhQ29yZUZsYXROb2RlLmdldE51bWJlck9mUmVnaW9ucygpID4gNCAmJiBhQ29yZUZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSBhQ29yZUZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaW50IG9mZnNldCA9IGFDb3JlRmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQobmFtZSk7Ci0JCQkJCWludCBsZW5ndGggPSBuYW1lLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJYm9vbGVhbiB0YWdsaWJkZXRlY3RlZCA9IGZhbHNlOwotCQkJCQlib29sZWFuIHRhZ2xpYmRpcmVjdGl2ZWRldGVjdGVkID0gZmFsc2U7Ci0JCQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCQkJCXRhZ2xpYmRldGVjdGVkID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgZkNoYXJTZXF1ZW5jZVNvdXJjZSkucmVnaW9uTWF0Y2hlcyhvZmZzZXQsIGxlbmd0aCwgSlNQMTJUTEROYW1lcy5UQUdMSUIpOwotCQkJCQkJdGFnbGliZGlyZWN0aXZlZGV0ZWN0ZWQgPSAoKElSZWdpb25Db21wYXJpYmxlKSBmQ2hhclNlcXVlbmNlU291cmNlKS5yZWdpb25NYXRjaGVzKG9mZnNldCwgbGVuZ3RoLCBKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5Ci0JCQkJCQlTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IGdldFRleHQob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJdGFnbGliZGV0ZWN0ZWQgPSBkaXJlY3RpdmVOYW1lLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRBR0xJQik7Ci0JCQkJCQl0YWdsaWJkaXJlY3RpdmVkZXRlY3RlZCA9IGRpcmVjdGl2ZU5hbWUuZXF1YWxzKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gcHJvY2Vzc0RpcmVjdGl2ZU5hbWUgPSB0YWdsaWJkZXRlY3RlZCB8fCB0YWdsaWJkaXJlY3RpdmVkZXRlY3RlZDsKLQkJCQkJaWYgKHByb2Nlc3NEaXJlY3RpdmVOYW1lKSB7Ci0JCQkJCQlwcm9jZXNzVGFnbGliKGFDb3JlRmxhdE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNpb29iRXhjKSB7Ci0JCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjb3VsZCB0ZXN0ID4gMSwgYnV0IHNpbmNlIHdlIG9ubHkgY2FyZSBpZiB0aGVyZSBhcmUgNSAoPCwKLQkJCS8vIGpzcDpyb290LCB4bWxuczpwcmVmaXgsID0sIHdoZXJlKQotCQkJZWxzZSBpZiAoYUNvcmVGbGF0Tm9kZS5nZXROdW1iZXJPZlJlZ2lvbnMoKSA+IDQgJiYgKGFDb3JlRmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKSkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKSB7Ci0JCQkJcHJvY2Vzc0pTUFJvb3QoYUNvcmVGbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSlNQUm9vdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZ2xpYkZsYXROb2RlKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZ2xpYkZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCVN0cmluZyBwcmVmaXggPSBudWxsOwotCQkJYm9vbGVhbiB0YWdsaWIgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCWludCBvZmZzZXQgPSB0YWdsaWJGbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJaW50IGxlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0KLQkJCQkJCVN0cmluZyBuYW1lID0gZ2V0VGV4dChvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKFhNTE5TKSAmJiBuYW1lLmxlbmd0aCgpID4gWE1MTlMubGVuZ3RoKCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCXByZWZpeCA9IG5hbWUuc3Vic3RyaW5nKDYpOwotCQkJCQkJCXRhZ2xpYiA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwcmVmaXggPSBudWxsOwotCQkJCQkJCXRhZ2xpYiA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRhZ2xpYiAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCXByZWZpeCA9IFN0cmluZ1V0aWxzLnN0cmlwKHByZWZpeCk7Ci0JCQkJCQlpZiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgewotCQkJCQkJCWVuYWJsZUZvclRhZ2xpYihwcmVmaXgsIHRhZ2xpYkZsYXROb2RlKTsKLQkJCQkJCQlwcmVmaXggPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGJlIGRvbmUKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFB1bGxzIHRoZSBwcmVmaXggZnJvbSB0aGUgZ2l2ZW4gdGFnbGliIGRpcmVjdGl2ZQotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFuZCBtYWtlcyBzdXJlIHRoZSBwcmVmaXggaXMgbmVzdGFibGUuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVGFnbGliKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gdGFnbGliRmxhdE5vZGUpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gdGFnbGliRmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCQlib29sZWFuIHByZWZpeG5hbWUgPSBmYWxzZTsKLQkJCXRyeSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwgJiYgZkNoYXJTZXF1ZW5jZVNvdXJjZSBpbnN0YW5jZW9mIElSZWdpb25Db21wYXJpYmxlKSB7Ci0JCQkJCQkJaW50IG9mZnNldCA9IHRhZ2xpYkZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQkJaW50IGxlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCQkJcHJlZml4bmFtZSA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIEpTUDEyVExETmFtZXMuUFJFRklYKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG9sZCBmYXNoaW9uZWQgd2F5Ci0JCQkJCQkJcHJlZml4bmFtZSA9IChnZXRUZXh0KHRhZ2xpYkZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlBSRUZJWCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHByZWZpeG5hbWUgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlwcmVmaXggPSBnZXRUZXh0KHRhZ2xpYkZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbiksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gc2lvb2JFeGMpIHsKLQkJCQkvLyBub3RoaW5nIHRvIGJlIGRvbmUKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQkJcHJlZml4ID0gU3RyaW5nVXRpbHMuc3RyaXAocHJlZml4KTsKLQkJCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZW5hYmxlRm9yVGFnbGliKHByZWZpeCwgdGFnbGliRmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXROb2RlcygpIHsKLQkJCUl0ZXJhdG9yIHRhZ21hcmtlcnMgPSAoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmdldE5lc3RhYmxlUHJlZml4ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKHRhZ21hcmtlcnMuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCEoKFRhZ01hcmtlcikgdGFnbWFya2Vycy5uZXh0KCkpLmlzR2xvYmFsKCkpCi0JCQkJCXRhZ21hcmtlcnMucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQkJcmVzZXROb2RlcygpOwotCQkJZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKS5yZW1vdmUodGhpcyk7Ci0JCQlpZiAobmV3RG9jdW1lbnQgIT0gbnVsbCAmJiBuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgewotCQkJCSgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyKSBuZXdEb2N1bWVudC5nZXRQYXJzZXIoKSkuYWRkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcih0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEpTUFNvdXJjZVBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKU1BTb3VyY2VQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgewotCQkoKEpTUFRva2VuaXplcikgZ2V0VG9rZW5pemVyKCkpLmFkZE5lc3RhYmxlUHJlZml4KG1hcmtlcik7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpIHsKLQkJcmV0dXJuICgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkuZ2V0TmVzdGFibGVQcmVmaXhlcygpOwotCX0KLQotCXByb3RlY3RlZCBCbG9ja1Rva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCWlmIChmVG9rZW5pemVyID09IG51bGwpIHsKLQkJCWZUb2tlbml6ZXIgPSBuZXcgSlNQVG9rZW5pemVyKCk7Ci0JCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpLmFkZChuZXcgTmVzdGFibGVQcmVmaXhIYW5kbGVyKCkpOwotCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCi0JcHVibGljIFJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJSlNQU291cmNlUGFyc2VyIG5ld0luc3RhbmNlID0gbmV3IEpTUFNvdXJjZVBhcnNlcigpOwotCQluZXdJbnN0YW5jZS5zZXRUb2tlbml6ZXIoZ2V0VG9rZW5pemVyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJzZU5vZGVzKCkgewotCQkvLyByZWdpb25zIGFyZSBpbml0aWFsbHkgcmVwb3J0ZWQgYXMgY29tcGxldGUgb2Zmc2V0cyB3aXRoaW4gdGhlCi0JCS8vIHNjYW5uZWQgaW5wdXQKLQkJLy8gdGhleSBhcmUgYWRqdXN0ZWQgaGVyZSB0byBiZSBpbmRleGVzIGZyb20gdGhlIGN1cnJlbnROb2RlJ3Mgc3RhcnQKLQkJLy8gb2Zmc2V0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbnVsbDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJLy8gRE1XOiAyLzEyLzAzLiBNYWRlIGN1cnJlbnQgbm9kZSBsb2NhbCB2YXJpYWJsZSwgc2luY2UKLQkJLy8gd2UgY2hhbmdlZCBjbGFzcyB0byBub3QgcmVxdWlyZSBzdGF0ZQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JCXdoaWxlICgocmVnaW9uID0gZ2V0TmV4dFJlZ2lvbigpKSAhPSBudWxsKSB7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIHRoZXNlIHR5cGVzIChtaWdodCkgZGVtYW5kIGEgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmb3IgZWFjaAotCQkJLy8gb2YgdGhlbQotCQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQkJLy8gbXVsdGlwbGUgYmxvY2sgdGV4dHMgaW5kaWNhdGVkIGVtYmVkZGVkIGNvbnRhaW5lcnM7IG5vCi0JCQkJCS8vIG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3QgY29udGludWluZyBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGVuc3VyZSB0aGF0IGFueSBleGlzdGluZyBub2RlIGlzIGF0IGxlYXN0Ci0JCQkJCQkvLyB0ZXJtaW5hdGVkCi0JCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCQl9Ci0JCQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlsYXN0Tm9kZS5zZXROZXh0KGN1cnJlbnROb2RlKTsKLQkJCQkJfQotCQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIE9QRU4gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCWVsc2UgaWYgKChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmlzRW5kZWQoKSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX09QRU4pIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdCB0ZXJtaW5hdGVkCi0JCQkJCWlmICghY3VycmVudE5vZGUuaXNFbmRlZCgpKSB7Ci0JCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5zZXRUZXh0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0KLQkJCQkJCS8vIGZDdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJfQotCQkJCQlsYXN0Tm9kZSA9IGN1cnJlbnROb2RlOwotCQkJCX0KLQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCQkvLyB0aGUgZm9sbG93aW5nIGNvbnRleHRzIE5FSVRIRVIgb3BlbiBub3IgY2xvc2UKLQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7IGp1c3QgYWRkIHRvIHRoZW0KLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9URVhUKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UKSB7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBjbG9zZSBvZmYgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJLy8gY2xlYW5seQotCQkJZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpIHx8IHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NMT1NFKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQkoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhpcyBpcyBleHRyZW1lbHkgcmFyZSwgYnV0IHZhbGlkCi0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCS8vIHBhY2sgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciB3aXRoIHRoaXMgcmVnaW9uCi0JCQkJaWYgKGxhc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIGxhc3RSZWdpb247Ci0JCQkJCWNvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKHJlZ2lvbik7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgY29udGFpbmVyIHJlZ2lvbnMgaGF2ZSBwYXJlbnQuIFByb2JhYmx5IGEKLQkJCQkJLy8gYmV0dGVyIHBsYWNlIHRvIHNldCwKLQkJCQkJLy8gYnV0IGZvciBub3csIHdpbGwgKHJlKXNldCBlYWNoIHRpbWUgdGhyb3VnaAotCQkJCQljb250YWluZXIuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjb250YWluZXIpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoY29udGFpbmVyLmdldExlbmd0aCgpIC0gcmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkvLyBza2lwIG9uIGEgdmVyeS1maXJzdCByZWdpb24gc2l0dWF0aW9uIGFzIHRoZSBkZWZhdWx0Ci0JCQkJLy8gYmVoYXZpb3IgaXMgZ29vZCBlbm91Z2gKLQkJCQkvLyBjb21iaW5lIHdpdGggcHJldmlvdXMgaWYgYWxzbyB1bmRlZmluZWQKLQkJCQlpZiAoY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpICE9IG51bGwgJiYgY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgewotCQkJCQljdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLmFkanVzdExlbmd0aChyZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCX0KLQkJCQkvLyBwcmV2aW91cyB3YXNuJ3QgdW5kZWZpbmVkCi0JCQkJZWxzZSB7Ci0JCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBpZiBhbiB1bmtub3duIHR5cGUgaXMgdGhlIGZpcnN0IHJlZ2lvbiBpbiB0aGUgZG9jdW1lbnQsCi0JCQkJLy8gZW5zdXJlIHRoYXQgYSBub2RlIGV4aXN0cwotCQkJCWlmIChjdXJyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQkJKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uKS5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBmb3VuZCByZWdpb24gb2Ygbm90IHNwZWNpZmljYWxseSBoYW5kbGVkIHR5cGUgIiArIHJlZ2lvbi5nZXRUeXBlKCkgKyAiIEAgIiArIHJlZ2lvbi5nZXRTdGFydCgpICsgIlsiICsgcmVnaW9uLmdldExlbmd0aCgpICsgIl0iKTsvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJCX0KLQotCQkJLy8gdGhlc2UgcmVnaW9ucyBhbHNvIGdldCB0aGVpciBvd24gbm9kZSwgc28gY2xvc2UgdGhlbSBjbGVhbmx5Ci0JCQkvLyBOT1RFOiB0aGVzZSByZWdpb25zIGhhdmUgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgY3JlYXRlZAotCQkJLy8gZm9yIHRoZW0gYWJvdmU7IGl0IG1heQotCQkJLy8gYmUgbW9yZSByZWFkYWJsZSBpZiB0aGF0IGlzIGhhbmRsZWQgaGVyZSBhcyB3ZWxsLCBidXQgdGhlCi0JCQkvLyBjdXJyZW50IGxheW91dAotCQkJLy8gZW5zdXJlcyB0aGF0IHRoZXkgb3BlbiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHRoZSBzYW1lIHdheQotCQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfREVDTEFSQVRJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VYUFJFU1NJT05fT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gY3VycmVudE5vZGU7Ci0JCQl9Ci0JCX0KLQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCWZpcmVOb2RlUGFyc2VkKGN1cnJlbnROb2RlKTsKLQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJfQotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyB0YWdOYW1lKSB7Ci0JCSgoSlNQVG9rZW5pemVyKSBnZXRUb2tlbml6ZXIoKSkucmVtb3ZlTmVzdGFibGVQcmVmaXgodGFnTmFtZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQUGFyc2VyUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2VlMjM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuRm9yZWlnblJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIFRoaXMgcmVnaW9uIGZhY3RvcnkgaXMgdmVyeSBzcGVjaWZpYyB0byB0aGUgcGFyc2VyIG91dHB1dCwgYW5kIHRoZSBzcGVjaWZpYwotICogaW1wbGVtZW50YXRpb24gY2xhc3NlcyBmb3IgdmFyaW91cyByZWdpb25zLgotICovCi1wdWJsaWMgY2xhc3MgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoY29udGV4dCA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IEZvcmVpZ25SZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCX0KLQkJZWxzZQotCQkJbmV3UmVnaW9uID0gc3VwZXIuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbGFuZywgc3Vycm91bmRpbmdUYWcpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wYXJzZXIvaW50ZXJuYWwvSlNQU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZiZTQyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnBhcnNlci5KU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5OwotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZiBTdHJ1Y3R1cmVkUmVnaW9ucy4gCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeSBleHRlbmRzIFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBKU1BfRElSRUNUSVZFIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBKU1BEaXJlY3RpdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWluc3RhbmNlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKHR5cGUpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3BhcnNlci9pbnRlcm5hbC9KU1BUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ5ZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcGFyc2VyL2ludGVybmFsL0pTUFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcwNiArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiA2LzcvMDYgMTo0NiBBTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qbmxzWFhYKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucGFyc2VyLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuVGFnTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5Db250ZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuSW50U3RhY2s7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gNi83LzA2IDE6NDYgQU0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovZWNsaXBzZS53dHAvd29ya3NwYWNlL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUb2tlbml6ZXIgaW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NSlNQUmVnaW9uQ29udGV4dHMgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVMgPSA1MjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTID0gNTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfU1FVT1RFU19FTkQgPSA1MzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlRfRU5EID0gNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUgPSAyMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX1NRVU9URVNfRU5EID0gNDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTID0gNDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTCA9IDQzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDM2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFUyA9IDQ0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCA9IDQxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9FUVVBTFMgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSA9IDEwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkwgPSA1MDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1NRVU9URURfVkJMID0gNTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCA9IDQwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX05BTUUgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VRVUFMUyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FID0gMTk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT05URU5UID0gMTY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSA9IDMxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDMyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAyNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMgPSAyMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCA9IDU0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRFFVT1RFRF9FTCA9IDQ4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9FTkQgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9XUyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX1RFWFQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UID0gMzM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gMzQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9EUVVPVEVTX0VORCA9IDQ3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9FTCA9IDQ5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVF9FTkQgPSAzOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0VRVUFMUyA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDID0gMzA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX1ZCTCA9IDU1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9BQk9SVF9FTUJFRERFRCA9IDQyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfQ09NTUVOVCA9IDM4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4gPSAzNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEkgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT04gPSAyNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RJUkVDVElWRV9OQU1FID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9UQUdfTkFNRSA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjZcMlwwXDFcMTdcMjJcMFwxXDE3XDFcMjVcMVwxMlwxXDYzIisKLSAgICAiXDFcMTVcMVwyMlwxXDEzXDFcMTRcMVwyNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDIwXDFcMTFcMVw3MFwxXDFcMVw1MFwxXDJcMVw0XDFcMjEiKwotICAgICJcMVwzN1wxXDcxXDFcMzVcMVwzNlwxXDU0XDFcNjZcMVw2MFwxXDYwXDFcNjFcMVw2MCIrCi0gICAgIlwxXDYwXDFcMzJcMVwzMVwxXDYyXDFcNTFcMVw1M1wxXDYwXDFcNjVcMVw2NFwxXDQwIisKLSAgICAiXDFcNjdcMlw2MFwxXDI3XDFcNTJcMVw2MFwxXDM0XDFcMTAyXDFcMjNcMVwwXDFcMTAiKwotICAgICJcMVwwXDFcNTZcMVwxMDFcMVw3MlwxXDU3XDFcNDJcMVw2NlwxXDczXDFcNjBcMVw0NSIrCi0gICAgIlwxXDc2XDFcNjBcMVwzM1wxXDMxXDFcNDdcMVw0NlwxXDc3XDFcNjBcMVw0M1wxXDQ0IisKLSAgICAiXDFcNTVcMVwxMDBcMVw0MVwxXDYwXDFcMzBcMVw1MlwxXDYwXDFcMTZcMVwwXDFcMTAzIisKLSAgICAiXDcxXDBcMVw3NVwxMFwwXDI3XDc0XDFcMFwzN1w3NFwxXDBcNzJcNzRcMlwwXDEzXDc0IisKLSAgICAiXDJcMFwxMFw3NFwxXDBcNjVcNzRcMVwwXDEwNFw3NFwxMVwwXDQ0XDc0XDNcMFwyXDc0IisKLSAgICAiXDRcMFwzNlw3NFw3MFwwXDEzMVw3NFwyMlwwXDdcNzRcMTZcMFwyXDc1XDU2XDBcMTA2XDc1IisKLSAgICAiXDMyXDBcMlw3NVw0NFwwXDFcNzRcMVw3NVwzXDc0XDFcMFwxXDc0XDFcMFwyNFw3NCIrCi0gICAgIlwxXDBcNTRcNzRcMVwwXDdcNzRcM1wwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzQiKwotICAgICJcMVwwXDFcNzRcMVwwXDIyXDc0XDE1XDBcMTRcNzRcMVwwXDEwMlw3NFwxXDBcMTRcNzQiKwotICAgICJcMVwwXDQ0XDc0XDFcMFw0XDc1XDExXDBcNjVcNzRcMlwwXDJcNzRcMlwwXDJcNzQiKwotICAgICJcM1wwXDM0XDc0XDJcMFwxMFw3NFwyXDBcMlw3NFw2N1wwXDQ2XDc0XDJcMFwxXDc0IisKLSAgICAiXDdcMFw0Nlw3NFwxMlwwXDIxXDc1XDFcMFwyN1w3NVwxXDBcM1w3NVwxXDBcMVw3NSIrCi0gICAgIlwxXDBcMlw3NVwxXDBcMVw3NVwxM1wwXDMzXDc0XDVcMFwzXDc0XDU2XDBcMzJcNzQiKwotICAgICJcNVwwXDFcNzVcMTJcNzRcMTBcNzVcMTVcMFwxMlw3NVw2XDBcMVw3NVwxMDdcNzRcMlwwIisKLSAgICAiXDVcNzRcMVwwXDE3XDc0XDFcMFw0XDc0XDFcMFwxXDc0XDE3XDc1XDJcNzRcMlw3NSIrCi0gICAgIlwxXDBcNFw3NVwyXDBcMTJcNzVcdTAyMDdcMFwzXDc1XDFcMFw2NVw3NFwyXDBcMVw3NSIrCi0gICAgIlwxXDc0XDIwXDc1XDNcMFw0XDc1XDNcMFwxMlw3NFwyXDc1XDJcMFwxMlw3NVwyMVwwIisKLSAgICAiXDNcNzVcMVwwXDEwXDc0XDJcMFwyXDc0XDJcMFwyNlw3NFwxXDBcN1w3NFwxXDAiKwotICAgICJcMVw3NFwzXDBcNFw3NFwyXDBcMVw3NVwxXDBcN1w3NVwyXDBcMlw3NVwyXDAiKwotICAgICJcM1w3NVwxMVwwXDFcNzVcNFwwXDJcNzRcMVwwXDNcNzRcMlw3NVwyXDBcMTJcNzUiKwotICAgICJcMlw3NFwyMFwwXDFcNzVcMlwwXDZcNzRcNFwwXDJcNzRcMlwwXDI2XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwyXDc0XDFcMFwyXDc0XDFcMFwyXDc0XDJcMFwxXDc1XDFcMCIrCi0gICAgIlw1XDc1XDRcMFwyXDc1XDJcMFwzXDc1XDEzXDBcNFw3NFwxXDBcMVw3NFw3XDAiKwotICAgICJcMTJcNzVcMlw3NVwzXDc0XDE0XDBcM1w3NVwxXDBcN1w3NFwxXDBcMVw3NFwxXDAiKwotICAgICJcM1w3NFwxXDBcMjZcNzRcMVwwXDdcNzRcMVwwXDJcNzRcMVwwXDVcNzRcMlwwIisKLSAgICAiXDFcNzVcMVw3NFwxMFw3NVwxXDBcM1w3NVwxXDBcM1w3NVwyMlwwXDFcNzRcNVwwIisKLSAgICAiXDEyXDc1XDIxXDBcM1w3NVwxXDBcMTBcNzRcMlwwXDJcNzRcMlwwXDI2XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwyXDc0XDJcMFw0XDc0XDJcMFwxXDc1XDFcNzRcNlw3NVwzXDAiKwotICAgICJcMlw3NVwyXDBcM1w3NVwxMFwwXDJcNzVcNFwwXDJcNzRcMVwwXDNcNzRcNFwwIisKLSAgICAiXDEyXDc1XDIyXDBcMlw3NVwxXDBcNlw3NFwzXDBcM1w3NFwxXDBcNFw3NFwzXDAiKwotICAgICJcMlw3NFwxXDBcMVw3NFwxXDBcMlw3NFwzXDBcMlw3NFwzXDBcM1w3NFwzXDAiKwotICAgICJcMTBcNzRcMVwwXDNcNzRcNFwwXDVcNzVcM1wwXDNcNzVcMVwwXDRcNzVcMTFcMCIrCi0gICAgIlwxXDc1XDE3XDBcMTFcNzVcMjFcMFwzXDc1XDFcMFwxMFw3NFwxXDBcM1w3NFwxXDAiKwotICAgICJcMjdcNzRcMVwwXDEyXDc0XDFcMFw1XDc0XDRcMFw3XDc1XDFcMFwzXDc1XDFcMCIrCi0gICAgIlw0XDc1XDdcMFwyXDc1XDExXDBcMlw3NFw0XDBcMTJcNzVcMjJcMFwyXDc1XDFcMCIrCi0gICAgIlwxMFw3NFwxXDBcM1w3NFwxXDBcMjdcNzRcMVwwXDEyXDc0XDFcMFw1XDc0XDRcMCIrCi0gICAgIlw3XDc1XDFcMFwzXDc1XDFcMFw0XDc1XDdcMFwyXDc1XDdcMFwxXDc0XDFcMCIrCi0gICAgIlwyXDc0XDRcMFwxMlw3NVwyMlwwXDJcNzVcMVwwXDEwXDc0XDFcMFwzXDc0XDFcMCIrCi0gICAgIlwyN1w3NFwxXDBcMjBcNzRcNFwwXDZcNzVcMlwwXDNcNzVcMVwwXDRcNzVcMTFcMCIrCi0gICAgIlwxXDc1XDEwXDBcMlw3NFw0XDBcMTJcNzVcMjIxXDBcNTZcNzRcMVwwXDFcNzRcMVw3NSIrCi0gICAgIlwyXDc0XDdcNzVcNVwwXDZcNzRcMVw3NVwxMFw3NVwxXDBcMTJcNzVcNDdcMFwyXDc0IisKLSAgICAiXDFcMFwxXDc0XDJcMFwyXDc0XDFcMFwxXDc0XDJcMFwxXDc0XDZcMFw0XDc0IisKLSAgICAiXDFcMFw3XDc0XDFcMFwzXDc0XDFcMFwxXDc0XDFcMFwxXDc0XDJcMFwyXDc0IisKLSAgICAiXDFcMFwyXDc0XDFcMFwxXDc0XDFcNzVcMlw3NFw2XDc1XDFcMFwyXDc1XDFcNzQiKwotICAgICJcMlwwXDVcNzRcMVwwXDFcNzVcMVwwXDZcNzVcMlwwXDEyXDc1XDc2XDBcMlw3NSIrCi0gICAgIlw2XDBcMTJcNzVcMTNcMFwxXDc1XDFcMFwxXDc1XDFcMFwxXDc1XDRcMFwyXDc1IisKLSAgICAiXDEwXDc0XDFcMFw0MVw3NFw3XDBcMjRcNzVcMVwwXDZcNzVcNFwwXDZcNzVcMVwwIisKLSAgICAiXDFcNzVcMVwwXDI1XDc1XDNcMFw3XDc1XDFcMFwxXDc1XDM0NlwwXDQ2XDc0XDEyXDAiKwotICAgICJcNDdcNzRcMTFcMFwxXDc0XDFcMFwyXDc0XDFcMFwzXDc0XDFcMFwxXDc0XDFcMCIrCi0gICAgIlwyXDc0XDFcMFw1XDc0XDUxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxM1wwIisKLSAgICAiXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcM1wwXDJcNzRcM1wwXDFcNzRcNVwwIisKLSAgICAiXDNcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcM1wwIisKLSAgICAiXDJcNzRcM1wwXDJcNzRcMVwwXDFcNzRcNTBcMFwxXDc0XDExXDBcMVw3NFwyXDAiKwotICAgICJcMVw3NFwyXDBcMlw3NFw3XDBcMlw3NFwxXDBcMVw3NFwxXDBcN1w3NFw1MFwwIisKLSAgICAiXDFcNzRcNFwwXDFcNzRcMTBcMFwxXDc0XHUwYzA2XDBcMjM0XDc0XDRcMFwxMzJcNzRcNlwwIisKLSAgICAiXDI2XDc0XDJcMFw2XDc0XDJcMFw0Nlw3NFwyXDBcNlw3NFwyXDBcMTBcNzRcMVwwIisKLSAgICAiXDFcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMVwwXDM3XDc0XDJcMFw2NVw3NFwxXDAiKwotICAgICJcN1w3NFwxXDBcMVw3NFwzXDBcM1w3NFwxXDBcN1w3NFwzXDBcNFw3NFwyXDAiKwotICAgICJcNlw3NFw0XDBcMTVcNzRcNVwwXDNcNzRcMVwwXDdcNzRcMzIzXDBcMTVcNzVcNFwwIisKLSAgICAiXDFcNzVcMTA0XDBcMVw3NFwzXDBcMlw3NFwyXDBcMVw3NFwxMjFcMFwzXDc0XHUwZTgyXDAiKwotICAgICJcMVw3NVwxXDBcMVw3NFwzMVwwXDExXDc0XDZcNzVcMVwwXDVcNzVcMTNcMFwxMjRcNzQiKwotICAgICJcNFwwXDJcNzVcMlwwXDJcNzVcMlwwXDEzMlw3NFwxXDBcM1w3NVw2XDBcNTBcNzQiKwotICAgICJcdTFjZDNcMFx1NTFhNlw3NFx1MGM1YVwwXHUyYmE0XDc0XDEzNFwwXHUwODAwXDBcdTFmZmVcMFwyXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5Y21hcCA9IHl5X3VucGFja19jbWFwKHl5Y21hcF9wYWNrZWQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgeXlfcm93TWFwIFtdID0geyAKLSAgICAgICAgMCwgICAgNjgsICAgMTM2LCAgIDIwNCwgICAyNzIsICAgMzQwLCAgIDQwOCwgICA0NzYsICAgNTQ0LCAgIDYxMiwgCi0gICAgICA2ODAsICAgNzQ4LCAgIDgxNiwgICA4ODQsICAgOTUyLCAgMTAyMCwgIDEwODgsICAxMTU2LCAgMTIyNCwgIDEyOTIsIAotICAgICAxMzYwLCAgMTQyOCwgIDE0OTYsICAxNTY0LCAgMTYzMiwgIDE3MDAsICAxNzY4LCAgMTgzNiwgIDE5MDQsICAxOTcyLCAKLSAgICAgMjA0MCwgIDIxMDgsICAyMTc2LCAgMjI0NCwgIDIzMTIsICAyMzgwLCAgMjQ0OCwgIDI1MTYsICAyNTg0LCAgMjY1MiwgCi0gICAgIDI3MjAsICAyNzg4LCAgMjg1NiwgIDI5MjQsICAyOTkyLCAgMzA2MCwgIDMxMjgsICAzMTk2LCAgMzI2NCwgIDMzMzIsIAotICAgICAzNDAwLCAgMzQ2OCwgIDM1MzYsICAzNjA0LCAgMzY3MiwgIDM3NDAsICAzODA4LCAgMzg3NiwgIDM5NDQsICA0MDEyLCAKLSAgICAgNDA4MCwgIDQxNDgsICA0MjE2LCAgNDI4NCwgIDQzNTIsICA0Mjg0LCAgNDM1MiwgIDQ0MjAsICA0Mjg0LCAgNDI4NCwgCi0gICAgIDQzNTIsICA0NDg4LCAgNDU1NiwgIDQ2MjQsICA0NjkyLCAgNDc2MCwgIDQ4MjgsICA0ODk2LCAgNDI4NCwgIDQzNTIsIAotICAgICA0OTY0LCAgNTAzMiwgIDUxMDAsICA0Mjg0LCAgNTE2OCwgIDUxNjgsICA1MjM2LCAgNTMwNCwgIDUzNzIsICA0OTY0LCAKLSAgICAgNDI4NCwgIDU0NDAsICA1NTA4LCAgNDI4NCwgIDU1NzYsICA1NjQ0LCAgNTcxMiwgIDU3ODAsICA0Mjg0LCAgNDM1MiwgCi0gICAgIDU4NDgsICA1OTE2LCAgNTk4NCwgIDYwNTIsICA2MTIwLCAgNjE4OCwgIDQyODQsICA2MjU2LCAgNjI1NiwgIDYzMjQsIAotICAgICA2MzkyLCAgNjQ2MCwgIDY1MjgsICA2NTk2LCAgNDI4NCwgIDY2NjQsICA2NzMyLCAgNjgwMCwgIDY4NjgsICA2OTM2LCAKLSAgICAgNzAwNCwgIDQyODQsICA3MDcyLCAgNzE0MCwgIDcyMDgsICA3Mjc2LCAgNzM0NCwgIDc0MTIsICA3NDgwLCAgNzU0OCwgCi0gICAgIDQyODQsICA3NjE2LCAgNzY4NCwgIDc3NTIsICA3ODIwLCAgNzg4OCwgIDc5NTYsICA4MDI0LCAgODA5MiwgIDgwOTIsIAotICAgICA4MTYwLCAgODIyOCwgIDgyOTYsICA4MzY0LCAgODM2NCwgIDg0MzIsICA4NTAwLCAgODU2OCwgIDg2MzYsICA4NjM2LCAKLSAgICAgODcwNCwgIDg3NzIsICA4ODQwLCAgODkwOCwgIDQyODQsICA4OTc2LCAgODk3NiwgIDkwNDQsICA5MTEyLCAgOTE4MCwgCi0gICAgIDkyNDgsICA0Mjg0LCAgNDI4NCwgIDQzNTIsICA5MzE2LCAgNDI4NCwgIDQzNTIsICA5Mzg0LCAgOTQ1MiwgIDk1MjAsIAotICAgICA5NTg4LCAgNDI4NCwgIDk2NTYsICA5NzI0LCAgOTc5MiwgIDk4NjAsICA0Mjg0LCAgOTkyOCwgIDk5OTYsIDEwMDY0LCAKLSAgICAxMDEzMiwgIDQyODQsICA0Mjg0LCAxMDIwMCwgIDQyODQsIDEwMjY4LCAxMDMzNiwgMTAyNjgsIDEwNDA0LCAxMDQ3MiwgCi0gICAgMTA0MDQsICA0Mjg0LCAgNDI4NCwgMTA1NDAsIDEwNjA4LCAxMDY3NiwgIDQyODQsIDEwNzQ0LCAxMDgxMiwgMTA4ODAsIAotICAgIDEwOTQ4LCAxMTAxNiwgIDQyODQsICA0Mjg0LCAxMTA4NCwgIDQyODQsIDExMTUyLCAxMTIyMCwgMTExNTIsIDExMjg4LCAKLSAgICAxMTM1NiwgMTEyODgsICA0Mjg0LCAgNDI4NCwgMTE0MjQsIDExNDkyLCAxMTU2MCwgIDQyODQsIDExNjI4LCAxMTY5NiwgCi0gICAgMTE3NjQsICA0Mjg0LCAgNDI4NCwgMTE4MzIsIDExOTAwLCAxMTk2OCwgMTIwMzYsIDEyMTA0LCAgNDI4NCwgMTIxNzIsIAotICAgIDEyMjQwLCAxMjMwOCwgMTIzNzYsIDEyNDQ0LCAxMjUxMiwgMTI1ODAsIDEyNjQ4LCAxMjcxNiwgIDQyODQsIDEyNzg0LCAKLSAgICAxMjg1MiwgIDQyODQsICA0Mjg0LCAgNTE2OCwgIDUzMDQsICA0Mjg0LCAxMjkyMCwgIDUzNzIsIDEyOTg4LCAgNTQ0MCwgCi0gICAgIDU1NzYsICA1NjQ0LCAxMzA1NiwgIDU3MTIsICA0Mjg0LCAxMzEyNCwgMTMxOTIsICA1NzgwLCAxMzI2MCwgIDQyODQsIAotICAgIDExOTAwLCAgNDI4NCwgIDYyNTYsICA2MzI0LCAgNDI4NCwgMTMzMjgsICA2MzkyLCAxMzM5NiwgIDQyODQsIDEzNDY0LCAKLSAgICAxMzUzMiwgIDcwNzIsIDEzNjAwLCAgNzI3NiwgIDQyODQsIDEzNjY4LCAgNzM0NCwgMTM3MzYsIDEzODA0LCAxMzg3MiwgCi0gICAgMTM5NDAsIDE0MDA4LCAxNDA3NiwgIDc4MjAsICA0Mjg0LCAxNDE0NCwgMTQyMTIsICA4MDkyLCAgODE2MCwgIDQyODQsIAotICAgIDE0MjgwLCAxNDM0OCwgMTQ0MTYsIDE0NDg0LCAxNDU1MiwgIDgyOTYsICA4MDkyLCAgODM2NCwgIDg0MzIsICA0Mjg0LCAKLSAgICAgODUwMCwgIDg1NjgsICA4MzY0LCAgODYzNiwgIDg3MDQsICA0Mjg0LCAxNDYyMCwgMTQ2ODgsIDE0NzU2LCAxNDgyNCwgCi0gICAgMTQ4OTIsIDE0OTYwLCAxNTAyOCwgIDg5NzYsICA5MDQ0LCAgNDI4NCwgMTUwOTYsIDE1MTY0LCAxNTIzMiwgMTUzMDAsIAotICAgIDE1MzY4LCAxNTQzNiwgMTU1MDQsIDE1NTcyLCAxNTY0MCwgIDQyODQsICA0Mjg0LCAgNDI4NCwgMTU3MDgsICA0Mjg0LCAKLSAgICAgNDI4NCwgMTU3NzYsIDE1ODQ0LCAxNTkxMiwgMTU5ODAsIDEwMjY4LCAgNDI4NCwgMTYwNDgsIDE2MTE2LCAxMDQwNCwgCi0gICAgIDQyODQsIDE2MTg0LCAxNjI1MiwgMTYzMjAsIDE2Mzg4LCAxNjQ1NiwgMTY1MjQsIDE2NTkyLCAxNjY2MCwgMTY3MjgsIAotICAgIDEwOTQ4LCAxMTE1MiwgIDQyODQsIDE2Nzk2LCAxNjg2NCwgMTEyODgsICA0Mjg0LCAxNjkzMiwgMTcwMDAsIDE3MDY4LCAKLSAgICAxNzEzNiwgMTcyMDQsIDE3MjcyLCAxNzM0MCwgMTc0MDgsIDE3NDc2LCAgNDI4NCwgIDQyODQsICA0Mjg0LCAxNzU0NCwgCi0gICAgMTc2MTIsIDE3NjgwLCAxNzc0OCwgMTc4MTYsICA0Mjg0LCAxNzg4NCwgMTc5NTIsICA0Mjg0LCAgNDI4NCwgIDQyODQsIAotICAgICA0Mjg0LCAgNDI4NCwgIDQ2OTIsIDE4MDIwLCAxODA4OCwgMTgxNTYsIDE4MjI0LCAxODI5MiwgMTgzNjAsIDE4MjkyLCAKLSAgICAxODQyOCwgMTg0OTYsIDE4NDI4LCAxODU2NCwgMTg2MzIsIDE4NzAwLCAxODc2OCwgMTg4MzYsIDE4OTA0LCAxODk3MiwgCi0gICAgMTg5NzIsIDE5MDQwLCAxOTEwOCwgMTkxMDgsIDE5MTc2LCAgODg0MCwgIDg4NDAsIDE5MjQ0LCAxOTMxMiwgMTkzODAsIAotICAgIDE5MzgwLCAxOTQ0OCwgIDkxODAsICA5MTgwLCAxOTUxNiwgMTk1ODQsIDE1OTEyLCAxOTY1MiwgMTAwNjQsIDEwMDY0LCAKLSAgICAxOTcyMCwgMTk3ODgsIDEwMjY4LCAxMDI2OCwgMTk4NTYsIDE5OTI0LCAxMDQwNCwgMTA0MDQsIDE5OTkyLCAyMDA2MCwgCi0gICAgMTA1NDAsIDEwNTQwLCAxNjQ1NiwgMjAxMjgsIDIwMTk2LCAxMDc0NCwgMTA3NDQsIDE2NjYwLCAyMDI2NCwgMjAzMzIsIAotICAgIDEwOTQ4LCAxMDk0OCwgMjA0MDAsIDExMTUyLCAxMTE1MiwgMjA0NjgsIDIwNTM2LCAxMTI4OCwgMTEyODgsIDIwNjA0LCAKLSAgICAyMDY3MiwgMTE0MjQsIDExNDI0LCAxNzIwNCwgMjA3NDAsIDIwODA4LCAxMTYyOCwgMTE2MjgsIDE3NDA4LCAyMDg3NiwgCi0gICAgIDQyODQsICA0Mjg0LCAyMDk0NCwgMjEwMTIsICA0Mjg0LCAyMTA4MCwgMjExNDgsIDIxMjE2LCAgNzA3MiwgIDQyODQsIAotICAgICA0Mjg0LCAyMTI4NCwgMjEzNTIsIDIxNDIwLCAyMTQ4OCwgMjE1NTYsIDE0NDg0LCAxNDgyNCwgIDg4NDAsIDIxNjI0LCAKLSAgICAxNTMwMCwgIDkxODAsIDIxNjkyLCAgNDI4NCwgMTAwNjQsIDEwMjY4LCAyMTc2MCwgMTA0MDQsIDIxODI4LCAxMDU0MCwgCi0gICAgMjE4OTYsICA0Mjg0LCAxMDc0NCwgMjE5NjQsIDEwOTQ4LCAxMTE1MiwgMjIwMzIsIDExMjg4LCAyMjEwMCwgMTE0MjQsIAotICAgIDIyMTY4LCAgNDI4NCwgMTE2MjgsIDIyMjM2LCAyMjMwNCwgMjIzNzIsIDIyNDQwLCAyMjUwOCwgMjI1NzYsIDIyNjQ0LCAKLSAgICAyMjcxMiwgMjI3ODAsIDIyODQ4LCAyMjkxNiwgMjI5ODQsIDIzMDUyLCAyMzEyMCwgMjMxODgsIDIzMjU2LCAyMzMyNCwgCi0gICAgMjMzOTIsIDIzNDYwLCAyMzUyOCwgMjM1OTYsICA0NjkyLCAyMzY2NCwgMjM3MzIsIDIzODAwLCAyMzg2OCwgMjM5MzYsIAotICAgICA0Mjg0LCAgNDI4NCwgMjQwMDQsIDI0MDcyLCAyNDE0MCwgMjQyMDgsIDE2NDU2LCAxNjY2MCwgMjQyNzYsIDI0MzQ0LCAKLSAgICAxNzIwNCwgMTc0MDgsIDI0NDEyLCAyNDQ4MCwgMjQ1NDgsICA0Mjg0LCAgNDI4NCwgIDQyODQsIDI0NjE2LCAyNDY4NCwgCi0gICAgMjQ3NTIsIDI0ODIwLCAyNDg4OCwgMjQ5NTYsIDI1MDI0LCAgNjgwMCwgMjUwOTIsIDI1MTYwLCAyNTIyOCwgMjUyOTYsIAotICAgIDI1MzY0LCAyNTQzMiwgMjU1MDAsICA0Mjg0LCAyNTU2OCwgIDg4NDAsICA5MTgwLCAxMDI2OCwgMTA0MDQsIDExMTUyLCAKLSAgICAxMTI4OCwgMjU2MzYsIDI1NzA0LCAyNTc3MiwgMjU4NDAsIDI1OTA4LCAyNTk3NiwgMjYwNDQsIDI2MTEyLCAyNjE4MCwgCi0gICAgMjYyNDgsIDI2MzE2LCAyNjM4NCwgMjY0NTIsIDI2NTIwLCAyNjU4OCwgMjY2NTYsIDI2NzI0LCAyNjc5MiwgMjY4NjAsIAotICAgIDI2OTI4LCAyNjk5NiwgMjcwNjQsIDI3MTMyLCAyNzIwMCwgMjcyNjgsIDI3MzM2LCAyNzQwNCwgMjc0NzIsIDI3NTQwLCAKLSAgICAyNzYwOCwgMjc2NzYsIDI3NzQ0LCAyNzgxMiwgMjc4ODAsIDI3OTQ4LCAyODAxNiwgMjgwODQsIDI4MTUyLCAyODIyMCwgCi0gICAgMjgyODgsICA0Mjg0LCAyODM1NiwgMjg0MjQsIDI4NDkyLCAyODU2MCwgIDY4MDAsIDI4NjI4LCAyODY5NiwgMjg3NjQsIAotICAgIDI4ODMyLCAyODkwMCwgMjg5NjgsIDI5MDM2LCAyOTEwNCwgMjkxNzIsIDI5MjQwLCAyOTMwOCwgMjkzNzYsIDI5NDQ0LCAKLSAgICAyOTUxMgotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNzJcMVw3M1wxMVw3MlwxXDc0XDFcNzJcMVw3NVw0XDcyXDFcNzYiKwotICAgICJcNDBcNzJcMVw3N1wyMFw3MlwxXDEwMFwxXDEwMVwxMDJcMTAwXDFcMTAyXDFcMTAzIisKLSAgICAiXDIxXDEwMlwxXDEwNFwyXDEwMlwxXDEwNVw1NVwxMDJcMVwxMDZcMVwxMDdcMTAyXDEwNiIrCi0gICAgIlwxXDEwMlwxXDEwM1w1XDEwMlwxXDExMFwxNlwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzIisKLSAgICAiXDJcMTAyXDFcMTExXDFcMTEyXDJcMTAyXDJcMTEzXDVcMTAyXDFcMTEyXDZcMTAyIisKLSAgICAiXDFcMTEyXDJcMTE0XDNcMTEzXDFcMTAyXDEwXDExM1wxXDExNVwyXDExM1wxXDEwMiIrCi0gICAgIlwxMFwxMTNcMVwxMTVcMVwxMTNcMVwxMDJcNFwxMTNcMVwxMDJcNFwxMTNcMVwxMDIiKwotICAgICJcNFwxMTNcM1wxMDJcMVwxMDNcMlwxMDJcMVwxMTFcMVwxMTZcMTFcMTAyXDFcMTE2IisKLSAgICAiXDZcMTAyXDFcMTE2XDU1XDEwMlwxXDExN1wxXDEyMFwyXDExN1wxXDEyMVwyMVwxMTciKwotICAgICJcMVwxMDVcNTVcMTE3XDFcMTAyXDFcMTAzXDJcMTAyXDFcMTIyXDFcMTEyXDJcMTAyIisKLSAgICAiXDJcMTIzXDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTIzXDFcMTAyXDEzXDEyMyIrCi0gICAgIlwxXDEwMlwxMlwxMjNcMVwxMDJcNFwxMjNcMVwxMDJcNFwxMjNcMVwxMDJcNFwxMjMiKwotICAgICJcM1wxMDJcMVwxMDNcMlwxMDJcMVwxMjJcMVwxMTJcMlwxMDJcMlwxMjNcNVwxMDIiKwotICAgICJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMjNcMVwxMDJcMTNcMTIzXDFcMTI0XDEyXDEyMyIrCi0gICAgIlwxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wyXDEwMlwxXDEyNSIrCi0gICAgIlwxXDEwM1wxXDEwMlwxXDEyNlwxXDEyN1wxXDExMlw0XDEyNVwxXDEzMFwxXDEyNSIrCi0gICAgIlwxXDEzMVwyXDEyNVwxXDExMlw2XDEyNVwxXDExMlw1NVwxMjVcMVwxMDJcMVwxMDMiKwotICAgICJcMlwxMDJcMVwxMzJcMjFcMTAyXDFcMTA1XDU2XDEwMlwxXDEwM1wxXDEzM1wxXDEzNCIrCi0gICAgIlwxXDEwMlwxXDExMlwyXDEwMlwyXDEzNVw1XDEwMlwxXDExMlw2XDEwMlwxXDExMiIrCi0gICAgIlw1XDEzNVwxXDEwMlwxM1wxMzVcMVwxMDJcMTJcMTM1XDFcMTAyXDRcMTM1XDFcMTAyIisKLSAgICAiXDRcMTM1XDFcMTAyXDRcMTM1XDNcMTAyXDFcMTAzXDFcMTMzXDFcMTM0XDFcMTAyIisKLSAgICAiXDFcMTEyXDJcMTAyXDJcMTM1XDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTM1IisKLSAgICAiXDFcMTAyXDEzXDEzNVwxXDEzNlwxMlwxMzVcMVwxMDJcNFwxMzVcMVwxMDJcNFwxMzUiKwotICAgICJcMVwxMDJcNFwxMzVcMlwxMDJcMVwxMzdcMVwxMDNcMVwxMzNcMVwxNDBcMVwxMzciKwotICAgICJcMVwxMTJcNFwxMzdcMVwxNDFcMVwxMzdcMVwxNDJcMlwxMzdcMVwxMTJcNlwxMzciKwotICAgICJcMVwxMTJcNTVcMTM3XDFcMTAyXDFcMTAzXDNcMTAyXDFcMTEyXDExXDEwMlwxXDExMiIrCi0gICAgIlw2XDEwMlwxXDExMlw1NVwxMDJcMVwxNDNcMVwxNDRcMjBcMTQzXDFcMTQ1XDYxXDE0MyIrCi0gICAgIlwxXDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMlwyXDE0N1w1XDEwMlwxXDExMiIrCi0gICAgIlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE0N1wxXDEwMlwxM1wxNDdcMVwxMDIiKwotICAgICJcMTJcMTQ3XDFcMTAyXDRcMTQ3XDFcMTAyXDRcMTQ3XDFcMTAyXDRcMTQ3XDNcMTAyIisKLSAgICAiXDFcMTQ2XDNcMTAyXDFcMTUxXDExXDEwMlwxXDE1MVwyXDEwMlwxXDE1MFwzXDEwMiIrCi0gICAgIlwxXDE1MVw1NlwxMDJcMVwxNDZcM1wxMDJcMVwxMTJcMlwxMDJcMlwxNTJcNVwxMDIiKwotICAgICJcMVwxMTJcMlwxMDJcMVwxNTBcM1wxMDJcMVwxMTJcNVwxNTJcMVwxMDJcMTNcMTUyIisKLSAgICAiXDFcMTAyXDEyXDE1MlwxXDEwMlw0XDE1MlwxXDEwMlw0XDE1MlwxXDEwMlw0XDE1MiIrCi0gICAgIlwzXDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMlwyXDE1Mlw1XDEwMlwxXDExMiIrCi0gICAgIlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE1MlwxXDEwMlwxM1wxNTJcMVwxNTMiKwotICAgICJcMTJcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyXDJcMTAyIisKLSAgICAiXDFcMTU0XDFcMTQ2XDFcMTAyXDFcMTU1XDFcMTU0XDFcMTEyXDRcMTU0XDFcMTU2IisKLSAgICAiXDFcMTU0XDFcMTU3XDJcMTU0XDFcMTEyXDJcMTU0XDFcMTYwXDNcMTU0XDFcMTEyIisKLSAgICAiXDU1XDE1NFwxXDE2MVwxXDE2MlwxXDE2M1wxXDE2NFw0XDE2MVwyXDE2NVwxNVwxNjEiKwotICAgICJcNVwxNjZcMVwxNjFcMTNcMTY2XDFcMTYxXDEyXDE2NlwxXDE2MVw0XDE2NlwxXDE2MSIrCi0gICAgIlw0XDE2NlwxXDE2MVwxXDE2N1wzXDE2NlwyXDE2MVwxXDEwMlwxXDE3MFwxXDE2MyIrCi0gICAgIlwxXDE2NFwxXDEwMlwxXDExMlwyXDEwMlwyXDE3MVw1XDEwMlwxXDExMlw2XDEwMiIrCi0gICAgIlwxXDExMlw1XDE3MVwxXDEwMlwxM1wxNzFcMVwxMDJcMTJcMTcxXDFcMTAyXDRcMTcxIisKLSAgICAiXDFcMTAyXDRcMTcxXDFcMTAyXDRcMTcxXDNcMTAyXDFcMTcwXDFcMTYzXDFcMTY0IisKLSAgICAiXDFcMTAyXDFcMTEyXDJcMTAyXDJcMTcxXDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyIisKLSAgICAiXDVcMTcxXDFcMTAyXDEzXDE3MVwxXDE3MlwxMlwxNzFcMVwxMDJcNFwxNzFcMVwxMDIiKwotICAgICJcNFwxNzFcMVwxMDJcNFwxNzFcMlwxMDJcMVwxNzNcMVwxNzRcMVwxNjNcMVwxNzUiKwotICAgICJcMVwxNzNcMVwxMTJcNFwxNzNcMVwxNzZcMVwxNzNcMVwxNzdcMVwyMDBcMVwxNzMiKwotICAgICJcMVwxMTJcNlwxNzNcMVwxMTJcMzRcMTczXDFcMjAxXDIwXDE3M1wxXDEwMlwxXDIwMiIrCi0gICAgIlwxXDIwM1wyXDEwMlwxXDExMlwxMVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcN1wxMDIiKwotICAgICJcMVwyMDRcMVwyMDVcMlwxMDJcMVwyMDZcMTFcMTAyXDFcMjA2XDFcMTAyXDFcMjA1IisKLSAgICAiXDFcMjA0XDI1XDEwMlwxXDEwM1wxXDIwM1wyXDEwMlwxXDExMlwxMVwxMDJcMVwxMTIiKwotICAgICJcNlwxMDJcMVwxMTJcNVwxMDJcMVwyMDdcNTBcMTAyXDFcMTAzXDFcMjAzXDJcMTAyIisKLSAgICAiXDFcMTEyXDJcMTAyXDJcMjEwXDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyXDVcMjEwIisKLSAgICAiXDFcMjA3XDEzXDIxMFwxXDEwMlwxMlwyMTBcMVwxMDJcNFwyMTBcMVwxMDJcNFwyMTAiKwotICAgICJcMVwxMDJcNFwyMTBcM1wxMDJcMVwxMDNcMVwyMDNcMlwxMDJcMVwxMTJcMTFcMTAyIisKLSAgICAiXDFcMTEyXDZcMTAyXDFcMTEyXDVcMTAyXDFcMjA3XDdcMTAyXDFcMjExXDZcMTAyIisKLSAgICAiXDFcMjEyXDEwXDEwMlwxXDIxMVwxMlwxMDJcMVwyMTJcNFwxMDJcMVwyMTNcMVwxMDMiKwotICAgICJcMVwyMDNcMVwyMTRcMVwyMTNcMVwxMTJcNFwyMTNcMVwyMTVcMVwyMTNcMVwyMTYiKwotICAgICJcMlwyMTNcMVwxMTJcNlwyMTNcMVwxMTJcNVwyMTNcMVwyMTdcNDdcMjEzXDFcMjIwIisKLSAgICAiXDFcMTAzXDFcMjAzXDFcMjIxXDFcMjIwXDFcMTEyXDRcMjIwXDFcMjIyXDFcMjIwIisKLSAgICAiXDFcMjIzXDJcMjIwXDFcMTEyXDZcMjIwXDFcMTEyXDVcMjIwXDFcMjI0XDQ3XDIyMCIrCi0gICAgIlwxXDIyNVwxXDEwM1wxXDIwM1wxXDIyNlwxXDIyNVwxXDExMlw0XDIyNVwxXDIyNyIrCi0gICAgIlwxXDIyNVwxXDIzMFwyXDIyNVwxXDExMlw2XDIyNVwxXDExMlw1NVwyMjVcMVwyMzEiKwotICAgICJcMVwyMzJcMVwyMzNcMTAxXDIzMVwxXDIzNFwxXDEwM1wxXDIwM1wxXDIzNVwxXDIzNCIrCi0gICAgIlwxXDExMlw0XDIzNFwxXDIzNlwxXDIzNFwxXDIzN1wyXDIzNFwxXDExMlw2XDIzNCIrCi0gICAgIlwxXDExMlw1NVwyMzRcMVwyNDBcMVwyNDFcMVwyNDJcMTAxXDI0MFwxXDI0M1wxXDI0NCIrCi0gICAgIlwxMDJcMjQzXDFcMTAyXDFcMjQ1XDI0XDEwMlwxXDEwNVw1NVwxMDJcMVwyNDZcMVwyNDciKwotICAgICJcMTAyXDI0NlwxXDEwMlwxXDEwM1w1XDEwMlwxXDI1MFwxNlwxMDJcMVwxMDVcNTVcMTAyIisKLSAgICAiXDFcMjUxXDFcMjUyXDNcMjUxXDFcMjUzXDZcMjUxXDFcMjU0XDFcMjU1XDFcMjUxIisKLSAgICAiXDFcMjUzXDZcMjUxXDFcMjUzXDM0XDI1MVwxXDI1NlwyMFwyNTFcMVwyNTdcMVwyNTIiKwotICAgICJcM1wyNTdcMVwyNjBcNFwyNTdcMVwyNjFcMlwyNTdcMVwyNjJcMVwyNTdcMVwyNjAiKwotICAgICJcNlwyNTdcMVwyNjBcMzRcMjU3XDFcMjYzXDIwXDI1N1wxXDEwMlwxXDEwM1wyNFwxMDIiKwotICAgICJcMVwxMDVcNTVcMTAyXDFcMjY0XDFcMjY1XDEwXDI2NFwxXDI2NlwxXDI2NFwxXDI2NyIrCi0gICAgIlwxXDI3MFw2NVwyNjRcMVwyNzFcMVwyNzJcMVwyNzNcMTJcMjcyXDFcMTAyXDExXDI3MiIrCi0gICAgIlwxXDI3NFw1NVwyNzJcMVwyNzVcMVwyNzZcMTBcMjc1XDFcMTAyXDEzXDI3NVwxXDI3NyIrCi0gICAgIlw1NVwyNzVcMVwxMDJcMVwxMDNcMTJcMTAyXDFcMzAwXDExXDEwMlwxXDEwNVw1NlwxMDIiKwotICAgICJcMVwxMDNcMTBcMTAyXDFcMzAxXDEzXDEwMlwxXDEwNVw1NVwxMDJcMVwzMDJcMVwzMDMiKwotICAgICJcMTBcMzAyXDFcMjYxXDY3XDMwMlwxXDMwNFwxXDMwNVwxXDMwNlwxXDMwN1wxMlwzMDYiKwotICAgICJcMVwyNTRcNjVcMzA2XDFcMzEwXDFcMzA1XDFcMzExXDFcMzEyXDEwXDMxMVwxXDMxMyIrCi0gICAgIlwxXDMxMVwxXDMxNFw0NlwzMTFcMVwzMTVcMTdcMzExXDFcMzE2XDFcMzE3XDFcMzIwIisKLSAgICAiXDEyXDMxN1wxXDEwMlwxMVwzMTdcMVwzMjFcNTVcMzE3XDFcMzIyXDFcMzIzXDEwXDMyMiIrCi0gICAgIlwxXDEwMlwxM1wzMjJcMVwzMjRcNTVcMzIyXDFcMTAyXDFcMTAzXDEyXDEwMlwxXDMyNSIrCi0gICAgIlwxMVwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzXDEwXDEwMlwxXDMyNlwxM1wxMDJcMVwxMDUiKwotICAgICJcNTVcMTAyXDFcMzI3XDFcMzMwXDEwXDMyN1wxXDI2MVw2N1wzMjdcMVwzMzFcMVwzMzIiKwotICAgICJcMVwzMzNcMVwzMzRcMTJcMzMzXDFcMjU0XDY1XDMzM1wxXDMzNVwxXDMzMlwxXDcyIisKLSAgICAiXDFcMFwxMVw3MlwxXDBcMVw3MlwxXDBcNFw3MlwxXDBcNDBcNzIiKwotICAgICJcMVwwXDIwXDcyXDNcMFwxXDMzNlwxXDMzN1wxNVwwXDFcMzQwXDJcMCIrCi0gICAgIlwxXDM0MVw2M1wwXDFcMzQyXDJcMFwyXDM0M1w1XDBcMVwzNDJcNlwwIisKLSAgICAiXDFcMzQyXDVcMzQzXDFcMFwxM1wzNDNcMVwwXDEyXDM0M1wxXDM0NFw0XDM0MyIrCi0gICAgIlwxXDBcNFwzNDNcMVwwXDRcMzQzXDJcMFwxXDM0NVwxXDBcMTFcMzQ1IisKLSAgICAiXDFcMFwxXDM0NVwxXDM0NlwxXDM0N1wzXDM0NVwxXDBcNjFcMzQ1XDVcMCIrCi0gICAgIlwxXDM0MlwyXDBcMlwzNTBcNVwwXDFcMzQyXDZcMFwxXDM0Mlw1XDM1MCIrCi0gICAgIlwxXDBcMTNcMzUwXDFcMFwxMlwzNTBcMVwwXDRcMzUwXDFcMFw0XDM1MCIrCi0gICAgIlwxXDBcNFwzNTBcMlwwXDFcMzQ1XDFcMFwxMVwzNDVcMVwwXDJcMzQ1IisKLSAgICAiXDFcMzUxXDNcMzQ1XDFcMFw0MFwzNDVcMVwzNTJcMjBcMzQ1XDEyNlwwXDFcMzUzIisKLSAgICAiXDJcMFwxXDM1NFwxMDFcMFwxXDM1NVw2N1wwXDFcMzU2XDc2XDBcMVwzNTciKwotICAgICJcMTA2XDBcMVwxMTJcMTFcMFwxXDExMlw2XDBcMVwxMTJcNjNcMFw0XDExMyIrCi0gICAgIlw2XDBcMVwxMTNcNlwwXDVcMTEzXDFcMFwxM1wxMTNcMVwwXDEyXDExMyIrCi0gICAgIlwxXDBcNFwxMTNcMVwwXDExXDExM1wxMFwwXDRcMTEzXDZcMFwxXDExMyIrCi0gICAgIlw2XDBcMlwxMTNcMVwzNjBcMlwxMTNcMVwwXDEzXDExM1wxXDBcMTJcMTEzIisKLSAgICAiXDFcMFw0XDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxMTNcNlwwXDFcMTEzIisKLSAgICAiXDZcMFwyXDExM1wxXDM2MVwyXDExM1wxXDBcMTNcMTEzXDFcMFwxMlwxMTMiKwotICAgICJcMVwwXDRcMTEzXDFcMFwxMVwxMTNcN1wwXDFcMTE2XDExXDBcMVwxMTYiKwotICAgICJcNlwwXDFcMTE2XDU3XDBcMVwzNjJcMTAzXDBcMVwzNjNcMTA3XDBcNFwxMjMiKwotICAgICJcNlwwXDFcMTIzXDZcMFw1XDEyM1wxXDBcMTNcMTIzXDFcMFwxMlwxMjMiKwotICAgICJcMVwwXDRcMTIzXDFcMFwxMVwxMjNcMlwwXDFcMTI1XDJcMFwxXDM2NCIrCi0gICAgIlwxXDEyNVwxXDBcNFwxMjVcMVwwXDFcMTI1XDFcMFwyXDEyNVwxXDAiKwotICAgICJcNlwxMjVcMVwwXDU2XDEyNVwxXDBcMVwzNjNcMVwzNjRcMVwxMjVcMVwwIisKLSAgICAiXDRcMTI1XDFcMFwxXDEyNVwxXDBcMlwxMjVcMVwwXDZcMTI1XDFcMCIrCi0gICAgIlw1NVwxMjVcMVwzNjVcMVwwXDEwXDM2NVwxXDM2NlwyXDM2NVwxXDM2N1w0NVwzNjUiKwotICAgICJcMVwzNjdcMjBcMzY1XDFcMzcwXDFcMFwxMlwzNzBcMVwzNjZcMVwzNzFcNDVcMzcwIisKLSAgICAiXDFcMzcxXDIwXDM3MFwyXDBcMVwxMzNcMVwzNzJcMTA2XDBcNFwxMzVcNlwwIisKLSAgICAiXDFcMTM1XDZcMFw1XDEzNVwxXDBcMTNcMTM1XDFcMFwxMlwxMzVcMVwwIisKLSAgICAiXDRcMTM1XDFcMFwxMVwxMzVcMlwwXDFcMTM3XDJcMFwxXDM3M1wxXDEzNyIrCi0gICAgIlwxXDBcNFwxMzdcMVwwXDFcMTM3XDFcMFwyXDEzN1wxXDBcNlwxMzciKwotICAgICJcMVwwXDU2XDEzN1wxXDBcMVwxMzNcMVwzNzRcMVwxMzdcMVwwXDRcMTM3IisKLSAgICAiXDFcMFwxXDEzN1wxXDBcMlwxMzdcMVwwXDZcMTM3XDFcMFw1NVwxMzciKwotICAgICJcMVwxNDFcMVwwXDFcMzc1XDFcMzc2XDFcMTQxXDFcMzc1XDRcMTQxXDFcMzc3IisKLSAgICAiXDFcMTQxXDFcMzc1XDFcdTAxMDBcMVwxNDFcMVwzNzVcNlwxNDFcMVwzNzVcMzRcMTQxIisKLSAgICAiXDFcdTAxMDBcMjBcMTQxXDFcMTQyXDFcMFwxXHUwMTAxXDFcdTAxMDJcMVwxNDJcMVx1MDEwMSIrCi0gICAgIlw0XDE0MlwxXHUwMTAxXDFcMTQyXDFcMzc3XDFcdTAxMDNcMVwxNDJcMVx1MDEwMVw2XDE0MiIrCi0gICAgIlwxXHUwMTAxXDM0XDE0MlwxXHUwMTAzXDIwXDE0MlwyXDBcMVx1MDEwNFwxMjNcMFwxXDM1MyIrCi0gICAgIlwyXDBcMVx1MDEwNVw2NFwwXDRcMTQ3XDZcMFwxXDE0N1w2XDBcNVwxNDciKwotICAgICJcMVwwXDEzXDE0N1wxXDBcMTJcMTQ3XDFcMFw0XDE0N1wxXDBcMTFcMTQ3IisKLSAgICAiXDRcMFwxXHUwMTA2XDEwNlwwXDFcMTUxXDExXDBcMVwxNTFcNlwwXDFcMTUxIisKLSAgICAiXDYzXDBcNFwxNTJcNlwwXDFcMTUyXDZcMFw1XDE1MlwxXDBcMTNcMTUyIisKLSAgICAiXDFcMFwxMlwxNTJcMVwwXDRcMTUyXDFcMFwxMVwxNTJcMlwwXDFcMTU0IisKLSAgICAiXDJcMFwxXHUwMTA3XDFcMTU0XDFcMFw0XDE1NFwxXDBcMVwxNTRcMVwwIisKLSAgICAiXDJcMTU0XDFcMFw2XDE1NFwxXDBcNTVcMTU0XDFcdTAxMDhcMVwwXDEwXHUwMTA4IisKLSAgICAiXDFcdTAxMDlcMlx1MDEwOFwxXHUwMTBhXDQ1XHUwMTA4XDFcdTAxMGFcMjBcdTAxMDhcMVx1MDEwYlwxXDAiKwotICAgICJcMTJcdTAxMGJcMVx1MDEwOVwxXHUwMTBjXDQ1XHUwMTBiXDFcdTAxMGNcMjBcdTAxMGJcMVwxNTRcMVwwIisKLSAgICAiXDFcdTAxMDZcMVx1MDEwN1wxXDE1NFwxXDBcNFwxNTRcMVwwXDFcMTU0XDFcMCIrCi0gICAgIlwyXDE1NFwxXDBcNlwxNTRcMVwwXDU1XDE1NFwxXDE2MVwzXDBcMjNcMTYxIisKLSAgICAiXDVcMFwxXDE2MVwxM1wwXDFcMTYxXDEyXDBcMVwxNjFcNFwwXDFcMTYxIisKLSAgICAiXDRcMFwxXDE2MVw0XDBcMlwxNjFcM1wwXDFcMzM2XDE2XDBcMVwzNTMiKwotICAgICJcMlwwXDFcMzQxXDYwXDBcMVx1MDEwZFwxMDFcMFwxXDE2MVwzXDBcMlwxNjEiKwotICAgICJcNFwxNjVcNlwxNjFcMVwxNjVcNlwxNjFcNVwxNjZcMVwxNjFcMTNcMTY2XDFcMTYxIisKLSAgICAiXDEyXDE2NlwxXDE2MVw0XDE2NlwxXDE2MVw0XDE2NlwxXDE2NVw0XDE2NlwyXDE2MSIrCi0gICAgIlw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw3XDE2NlwxXHUwMTBlXDNcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNVwwXDFcMzM2IisKLSAgICAiXDRcMFwyXHUwMTBmXDEwXDBcMVwzNTNcMlwwXDFcMzQxXDFcMFw1XHUwMTBmIisKLSAgICAiXDFcMFwxM1x1MDEwZlwxXDBcMTJcdTAxMGZcMVwwXDRcdTAxMGZcMVwwXDRcdTAxMGYiKwotICAgICJcMVwwXDRcdTAxMGZcMTBcMFw0XDE3MVw2XDBcMVwxNzFcNlwwXDVcMTcxIisKLSAgICAiXDFcMFwxM1wxNzFcMVwwXDEyXDE3MVwxXDBcNFwxNzFcMVwwXDExXDE3MSIrCi0gICAgIlwyXDBcMVwxNzNcMlwwXDFcdTAxMTBcMVwxNzNcMVwwXDRcMTczXDFcMCIrCi0gICAgIlwxXDE3M1wxXDBcMlwxNzNcMVwwXDZcMTczXDFcMFw1NVwxNzNcM1wwIisKLSAgICAiXDFcMzM2XDRcMFwyXHUwMTExXDEwXDBcMVwzNTNcMlwwXDFcMzQxXDFcMCIrCi0gICAgIlw1XHUwMTExXDFcMFwxM1x1MDExMVwxXDBcMTJcdTAxMTFcMVwwXDRcdTAxMTFcMVwwIisKLSAgICAiXDRcdTAxMTFcMVwwXDRcdTAxMTFcMlwwXDFcMTczXDFcMFwxXHUwMTBkXDFcdTAxMTAiKwotICAgICJcMVwxNzNcMVwwXDRcMTczXDFcMFwxXDE3M1wxXDBcMlwxNzNcMVwwIisKLSAgICAiXDZcMTczXDFcMFw1NVwxNzNcMVx1MDExMlwxXDBcMTBcdTAxMTJcMVx1MDExM1wyXHUwMTEyIisKLSAgICAiXDFcdTAxMTRcNDVcdTAxMTJcMVx1MDExNFwyMFx1MDExMlwxXHUwMTE1XDFcMFwxMlx1MDExNVwxXHUwMTEzIisKLSAgICAiXDFcdTAxMTZcNDVcdTAxMTVcMVx1MDExNlwyMFx1MDExNVwxXDE3M1wyXDBcMVx1MDExMFwxXDE3MyIrCi0gICAgIlwxXDBcNFwxNzNcMVwwXDFcMTczXDFcMFwxXDE3M1wxXHUwMTE3XDFcMCIrCi0gICAgIlw2XDE3M1wxXDBcNTZcMTczXDJcMFwxXHUwMTEwXDFcMTczXDFcMFw0XDE3MyIrCi0gICAgIlwxXDBcMVwxNzNcMVwwXDFcMTczXDFcdTAxMThcMVwwXDZcMTczXDFcMCIrCi0gICAgIlw1NVwxNzNcM1wwXDFcMzM2XDE2XDBcMVwzNTNcMlwwXDFcdTAxMDVcMTI0XDAiKwotICAgICJcMVx1MDExOVwyXDBcMVx1MDExOVw3MlwwXDFcdTAxMWFcMTRcMFwxXHUwMTFhXDYwXDAiKwotICAgICJcMlx1MDExYlw1MFwwXDIzXHUwMTFjXDFcdTAxMWRcNjBcdTAxMWNcNlwwXDRcMjEwXDZcMCIrCi0gICAgIlwxXDIxMFw2XDBcNVwyMTBcMVwwXDEzXDIxMFwxXDBcMTJcMjEwXDFcMCIrCi0gICAgIlw0XDIxMFwxXDBcMTFcMjEwXDU0XDBcMVx1MDExZVwxMjBcMFwxXHUwMTFmXDEwXDAiKwotICAgICJcMVx1MDExZlwzXDBcMVwyMTNcMlwwXDFcdTAxMjBcMVwyMTNcMVwwXDRcMjEzIisKLSAgICAiXDFcMFwxXDIxM1wxXDBcMlwyMTNcMVwwXDZcMjEzXDFcMFw1NVwyMTMiKwotICAgICJcMVx1MDEyMVwxXDBcMTBcdTAxMjFcMVx1MDEyMlwyXHUwMTIxXDFcdTAxMjNcNDVcdTAxMjFcMVx1MDEyMyIrCi0gICAgIlwyMFx1MDEyMVwxXHUwMTI0XDFcMFwxXHUwMTI0XDJcdTAxMjVcMVx1MDEyNFw0XHUwMTI1XDJcdTAxMjQiKwotICAgICJcMVx1MDEyNlwxXHUwMTI3XDFcdTAxMjRcNFx1MDEyNVwxXHUwMTI0XDEwXHUwMTI1XDFcdTAxMjRcMjZcdTAxMjUiKwotICAgICJcMVx1MDEyN1wxMFx1MDEyNVwyXHUwMTI0XDRcdTAxMjVcMlx1MDEyNFwxXDIxN1wyXHUwMTFjXDFcdTAxMjgiKwotICAgICJcMVwyMTdcMVx1MDExY1w0XDIxN1wxXHUwMTFjXDFcMjE3XDFcdTAxMWNcMlwyMTdcMVx1MDExYyIrCi0gICAgIlwzXDIxN1wxXHUwMTI5XDJcMjE3XDFcdTAxMWNcNTVcMjE3XDFcMjIwXDJcMFwxXHUwMTJhIisKLSAgICAiXDFcMjIwXDFcMFw0XDIyMFwxXDBcMVwyMjBcMVwwXDJcMjIwXDFcMCIrCi0gICAgIlw2XDIyMFwxXDBcNTVcMjIwXDEyXHUwMTJiXDFcdTAxMmNcNzFcdTAxMmJcMTRcdTAxMmRcMVx1MDEyYyIrCi0gICAgIlw2N1x1MDEyZFwxXDIyNFwyXHUwMTFjXDFcdTAxMmVcMVwyMjRcMVx1MDExY1w0XDIyNFwxXHUwMTFjIisKLSAgICAiXDFcMjI0XDFcdTAxMWNcMlwyMjRcMVx1MDExY1wzXDIyNFwxXHUwMTJmXDJcMjI0XDFcdTAxMWMiKwotICAgICJcNTVcMjI0XDFcMjI1XDJcMFwxXHUwMTMwXDFcMjI1XDFcMFw0XDIyNVwxXDAiKwotICAgICJcMVwyMjVcMVwwXDJcMjI1XDFcMFw2XDIyNVwxXDBcNTVcMjI1XDFcdTAxMzEiKwotICAgICJcMVwwXDEwXHUwMTMxXDFcdTAxMzJcMlx1MDEzMVwxXHUwMTMzXDQ1XHUwMTMxXDFcdTAxMzNcMjBcdTAxMzEiKwotICAgICJcMVx1MDEzNFwxXDBcMVx1MDEzNFwyXHUwMTM1XDFcdTAxMzRcNFx1MDEzNVwyXHUwMTM0XDFcdTAxMzYiKwotICAgICJcMVx1MDEzN1wxXHUwMTM0XDRcdTAxMzVcMVx1MDEzNFwxMFx1MDEzNVwxXHUwMTM0XDI2XHUwMTM1XDFcdTAxMzciKwotICAgICJcMTBcdTAxMzVcMlx1MDEzNFw0XHUwMTM1XDJcdTAxMzRcMlwyMzFcMVwwXDEwM1wyMzFcMVwwIisKLSAgICAiXDE3XDIzMVwxXHUwMTM4XDJcMjMxXDFcdTAxMzlcNTZcMjMxXDFcMjM0XDJcMFwxXHUwMTNhIisKLSAgICAiXDFcMjM0XDFcMFw0XDIzNFwxXDBcMVwyMzRcMVwwXDJcMjM0XDFcMCIrCi0gICAgIlw2XDIzNFwxXDBcNTVcMjM0XDFcdTAxM2JcMVwwXDEwXHUwMTNiXDFcdTAxM2NcMlx1MDEzYiIrCi0gICAgIlwxXHUwMTNkXDQ1XHUwMTNiXDFcdTAxM2RcMjBcdTAxM2JcMVx1MDEzZVwxXDBcMVx1MDEzZVwyXHUwMTNmIisKLSAgICAiXDFcdTAxM2VcNFx1MDEzZlwyXHUwMTNlXDFcdTAxNDBcMVx1MDE0MVwxXHUwMTNlXDRcdTAxM2ZcMVx1MDEzZSIrCi0gICAgIlwxMFx1MDEzZlwxXHUwMTNlXDI2XHUwMTNmXDFcdTAxNDFcMTBcdTAxM2ZcMlx1MDEzZVw0XHUwMTNmXDJcdTAxM2UiKwotICAgICJcMlwyNDBcMVwwXDEwM1wyNDBcMVwwXDE3XDI0MFwxXHUwMTQyXDJcMjQwXDFcdTAxNDMiKwotICAgICJcNTZcMjQwXDIyXDBcMVwzNDBcMlwwXDFcMzU0XDY1XDBcMVx1MDE0NFw3NFwwIisKLSAgICAiXDFcMjUxXDFcMFwxMlwyNTFcMVwwXDFcdTAxNDVcNDVcMjUxXDFcdTAxNDVcMjBcMjUxIisKLSAgICAiXDNcMFwxXHUwMTQ2XDE2XDBcMVwzNTNcMlwwXDFcMzU0XDU2XDBcMVwyNTEiKwotICAgICJcMVwwXDNcMjUxXDFcMjUzXDZcMjUxXDFcMFwxXHUwMTQ1XDFcMjUxXDFcMjUzIisKLSAgICAiXDZcMjUxXDFcMjUzXDM0XDI1MVwxXHUwMTQ1XDM2XDI1MVwxXHUwMTQ3XDEwM1wyNTFcMVx1MDE0OCIrCi0gICAgIlw2NVwyNTFcMVwyNTdcMVwwXDEwXDI1N1wxXDBcMlwyNTdcMVx1MDE0OVw0NVwyNTciKwotICAgICJcMVx1MDE0OVwyMVwyNTdcMVwwXDNcMjU3XDFcMjYwXDRcMjU3XDFcMFwyXDI1NyIrCi0gICAgIlwxXHUwMTQ5XDFcMjU3XDFcMjYwXDZcMjU3XDFcMjYwXDM0XDI1N1wxXHUwMTQ5XDM2XDI1NyIrCi0gICAgIlwxXHUwMTRhXDEwM1wyNTdcMVx1MDE0Ylw2NVwyNTdcMTJcMjY0XDFcMFwxXDI2NFwxXDAiKwotICAgICJcMVx1MDE0Y1w2NVwyNjRcMVwwXDEyXDI2NFwxXDBcMVwyNjRcMVwwXDFcdTAxNGMiKwotICAgICJcNFwyNjRcMVx1MDE0ZFw2MFwyNjRcMVwwXDEyXDI2NFwxXDBcMVwyNjRcMVwwIisKLSAgICAiXDFcMjY0XDFcdTAxNGVcNjRcMjY0XDFcdTAxNGZcMTRcdTAxNTBcMVx1MDE1MVwxMDNcdTAxNTBcMVx1MDE1MSIrCi0gICAgIlw1XHUwMTUwXDFcdTAxNTJcMlx1MDE1MFwxXHUwMTUzXDU2XHUwMTUwXDEyXHUwMTU0XDFcdTAxNTVcMTAzXHUwMTU0IisKLSAgICAiXDFcdTAxNTVcN1x1MDE1NFwxXHUwMTU2XDJcdTAxNTRcMVx1MDE1N1w1Nlx1MDE1NFwxMlwzMDJcMVwwIisKLSAgICAiXDY3XDMwMlwxXHUwMTU4XDFcMFwxMlwzMDJcMVwwXDdcMzAyXDFcdTAxNTlcNTdcMzAyIisKLSAgICAiXDFcdTAxNThcMVwwXDEyXDMwMlwxXHUwMTVhXDcxXDMwMlwxNFwzMDZcMVwwXDY1XDMwNiIrCi0gICAgIlwxXHUwMTViXDFcMFwxNFwzMDZcMVwwXDVcMzA2XDFcdTAxNWNcNTdcMzA2XDFcdTAxNWIiKwotICAgICJcMVwwXDE0XDMwNlwxXHUwMTVkXDY3XDMwNlwxMlwzMTFcMVwwXDFcMzExXDFcMCIrCi0gICAgIlw2NlwzMTFcMVwwXDEyXDMxMVwxXDBcMVwzMTFcMVwwXDVcMzExXDFcdTAxNWUiKwotICAgICJcNjBcMzExXDFcMFwxMlwzMTFcMVwwXDFcMzExXDFcMFwxXDMxMVwxXHUwMTVmIisKLSAgICAiXDY0XDMxMVwxXDBcMTRcdTAxNjBcMVx1MDE2MVwxMDNcdTAxNjBcMVx1MDE2MVw1XHUwMTYwXDFcdTAxNjIiKwotICAgICJcMlx1MDE2MFwxXHUwMTYzXDU2XHUwMTYwXDEyXHUwMTY0XDFcdTAxNjVcMTAzXHUwMTY0XDFcdTAxNjVcN1x1MDE2NCIrCi0gICAgIlwxXHUwMTY2XDJcdTAxNjRcMVx1MDE2N1w1Nlx1MDE2NFwxMlwzMjdcMVwwXDY3XDMyN1wxXHUwMTY4IisKLSAgICAiXDFcMFwxMlwzMjdcMVwwXDdcMzI3XDFcdTAxNjlcNTdcMzI3XDFcdTAxNjhcMVwwIisKLSAgICAiXDEyXDMyN1wxXHUwMTZhXDcxXDMyN1wxNFwzMzNcMVwwXDY1XDMzM1wxXHUwMTZiXDFcMCIrCi0gICAgIlwxNFwzMzNcMVwwXDVcMzMzXDFcdTAxNmNcNTdcMzMzXDFcdTAxNmJcMVwwXDE0XDMzMyIrCi0gICAgIlwxXHUwMTZkXDY3XDMzM1w3XDBcMVx1MDE2ZVwxMVwwXDFcdTAxNmZcM1wwXDFcdTAxNzAiKwotICAgICJcMjJcMFwxXHUwMTcxXDQyXDBcMVx1MDE3MlwyNFwwXDFcdTAxNzNcNTRcMFwxXDM0MiIrCi0gICAgIlwyXDBcMlx1MDE3NFw1XDBcMVwzNDJcNlwwXDFcMzQyXDVcdTAxNzRcMVwwIisKLSAgICAiXDEzXHUwMTc0XDFcMFwxMlx1MDE3NFwxXDBcNFx1MDE3NFwxXDBcNFx1MDE3NFwxXDAiKwotICAgICJcNFx1MDE3NFwyXDBcMVx1MDE3NVwxXDBcM1x1MDE3NVwxXHUwMTc2XDRcMzQzXDFcdTAxNzUiKwotICAgICJcMVwwXDNcdTAxNzVcMVx1MDE3NlwxXDM0M1wxXHUwMTc1XDFcMFwzXHUwMTc1XDFcdTAxNzYiKwotICAgICJcNVwzNDNcMVx1MDE3NVwxM1wzNDNcMVx1MDE3NVwxMlwzNDNcMVx1MDE3NVw0XDM0M1wxXHUwMTc3IisKLSAgICAiXDExXDM0M1wyXHUwMTc1XDIwXDBcMVx1MDE3OFw3XDBcMVx1MDE3OVw3MFwwXDFcMzQ2IisKLSAgICAiXDY2XDBcMTAzXDM0N1wxXHUwMTdhXDFcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3Nlw0XDM1MCIrCi0gICAgIlwxXHUwMTc1XDFcMFwzXHUwMTc1XDFcdTAxNzZcMVwzNTBcMVx1MDE3NVwxXDBcM1x1MDE3NSIrCi0gICAgIlwxXHUwMTc2XDVcMzUwXDFcdTAxNzVcMTNcMzUwXDFcdTAxNzVcMTJcMzUwXDFcdTAxNzVcNFwzNTAiKwotICAgICJcMVx1MDE3YlwxMVwzNTBcMlx1MDE3NVwxMDNcMzUxXDFcdTAxN2NcNjNcMFwxXDM1MlwyN1wwIisKLSAgICAiXDFcdTAxNmVcMTVcMFwxXHUwMTcwXDIyXDBcMVx1MDE3MVw2N1wwXDFcdTAxNzNcNTFcMCIrCi0gICAgIlwxXHUwMTdkXDEwM1wwXDFcdTAxN2VcMTA3XDBcNFwxMTNcNlwwXDFcMTEzXDZcMCIrCi0gICAgIlwzXDExM1wyXHUwMTdmXDFcMFwxM1wxMTNcMVwwXDEyXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDExXDExM1wxMFwwXDRcMTEzXDZcMFwxXDExM1w2XDBcNVwxMTMiKwotICAgICJcMVwwXDEzXDExM1wxXDBcMlwxMTNcMVx1MDE4MFw3XDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDZcMTEzXDFcdTAxODBcMlwxMTNcMlwwXDEyXDM2NVwxXDM2NlwzXDM2NSIrCi0gICAgIlwxXDBcNjVcMzY1XDE0XDM3MFwxXDM2NlwxXDM3MFwxXDBcNjVcMzcwXDFcMzc1IisKLSAgICAiXDFcMFwxMFwzNzVcMVwzNzdcMlwzNzVcMVx1MDE4MVw0NVwzNzVcMVx1MDE4MVwyMFwzNzUiKwotICAgICJcMVwxNDFcMlwzNzVcMVwzNzZcMVwxNDFcMVwzNzVcNFwxNDFcMVwzNzdcMVwxNDEiKwotICAgICJcMVwzNzVcMVwxNDFcMVwxMzdcMVwzNzVcNlwxNDFcMVwzNzVcNTVcMTQxXDFcdTAxMDEiKwotICAgICJcMVwwXDEyXHUwMTAxXDFcMzc3XDFcdTAxODJcNDVcdTAxMDFcMVx1MDE4MlwyMFx1MDEwMVwxXDE0MiIrCi0gICAgIlwyXHUwMTAxXDFcdTAxMDJcMVwxNDJcMVx1MDEwMVw0XDE0MlwxXHUwMTAxXDFcMTQyXDFcMzc3IisKLSAgICAiXDFcMTQyXDFcMTM3XDFcdTAxMDFcNlwxNDJcMVx1MDEwMVw1NVwxNDJcMTJcdTAxMDhcMVx1MDEwOSIrCi0gICAgIlwzXHUwMTA4XDFcMFw2NVx1MDEwOFwxNFx1MDEwYlwxXHUwMTA5XDFcdTAxMGJcMVwwXDY1XHUwMTBiIisKLSAgICAiXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDZcMTY2XDFcdTAxODNcMlwxNjYiKwotICAgICJcMTBcMFw0XHUwMTBmXDZcMFwxXHUwMTBmXDZcMFw1XHUwMTBmXDFcMFwxM1x1MDEwZiIrCi0gICAgIlwxXDBcMTJcdTAxMGZcMVwwXDRcdTAxMGZcMVwwXDExXHUwMTBmXDEwXDBcNFx1MDExMSIrCi0gICAgIlw2XDBcMVx1MDExMVw2XDBcNVx1MDExMVwxXDBcMTNcdTAxMTFcMVwwXDEyXHUwMTExIisKLSAgICAiXDFcMFw0XHUwMTExXDFcMFwxMVx1MDExMVwyXDBcMTJcdTAxMTJcMVx1MDExM1wzXHUwMTEyIisKLSAgICAiXDFcMFw2NVx1MDExMlwxNFx1MDExNVwxXHUwMTEzXDFcdTAxMTVcMVwwXDY1XHUwMTE1XDFcdTAxODQiKwotICAgICJcMlx1MDE4NVwxXHUwMTg2XDFcdTAxODRcMVx1MDE4NVw0XHUwMTg0XDFcdTAxODVcMVx1MDE4NFwxXHUwMTg1IisKLSAgICAiXDJcdTAxODRcMVx1MDE4NVw2XHUwMTg0XDFcdTAxODVcNTRcdTAxODRcMVwxNzNcMVx1MDE4N1wyXHUwMTg4IisKLSAgICAiXDFcdTAxODlcMVx1MDE4N1wxXHUwMTg4XDRcdTAxODdcMVx1MDE4OFwxXHUwMTg3XDFcdTAxODhcMlx1MDE4NyIrCi0gICAgIlwxXHUwMTg4XDZcdTAxODdcMVx1MDE4OFw1NFx1MDE4N1wxXDE3M1wzNVwwXDFcdTAxOGFcMzRcMCIrCi0gICAgIlwxXHUwMThhXDUxXDBcMVx1MDE4YlwxNFwwXDFcdTAxOGJcNzBcMFwxXHUwMThjXDExXDAiKwotICAgICJcMVx1MDE4Y1w3M1wwXDFcdTAxOGRcMTdcMFwxXHUwMThkXDExMFwwXDFcdTAxOGVcN1wwIisKLSAgICAiXDFcdTAxOGVcMlwwXDEyXHUwMTIxXDFcdTAxMjJcM1x1MDEyMVwxXDBcNjVcdTAxMjFcMVx1MDEyNCIrCi0gICAgIlwxXDBcMTJcdTAxMjRcMVx1MDEyMlwxXHUwMThmXDQ1XHUwMTI0XDFcdTAxOGZcMjFcdTAxMjRcMVwwIisKLSAgICAiXDEyXHUwMTI0XDFcdTAxOTBcMVx1MDE4Zlw0NVx1MDEyNFwxXHUwMThmXDIwXHUwMTI0XDE0XDBcMVx1MDE5MSIrCi0gICAgIlw2N1wwXDE0XHUwMTI0XDFcdTAxOTBcMVx1MDEyNFwxXDBcNjVcdTAxMjRcMTJcdTAxMzFcMVx1MDEzMiIrCi0gICAgIlwzXHUwMTMxXDFcMFw2NVx1MDEzMVwxXHUwMTM0XDFcMFwxMlx1MDEzNFwxXHUwMTMyXDFcdTAxOTIiKwotICAgICJcNDVcdTAxMzRcMVx1MDE5MlwyMVx1MDEzNFwxXDBcMTJcdTAxMzRcMVx1MDE5M1wxXHUwMTkyXDQ1XHUwMTM0IisKLSAgICAiXDFcdTAxOTJcMjBcdTAxMzRcMTRcMFwxXHUwMTk0XDY3XDBcMTRcdTAxMzRcMVx1MDE5M1wxXHUwMTM0IisKLSAgICAiXDFcMFw2NVx1MDEzNFwyXDIzMVwxXDBcNFwyMzFcMVx1MDE5NVwxNVwyMzFcMVx1MDE5NiIrCi0gICAgIlwyMlwyMzFcMVx1MDE5N1wzNVwyMzFcMVwwXDMxXDIzMVwxXHUwMTk4XDQ3XDIzMVwxMlx1MDEzYiIrCi0gICAgIlwxXHUwMTNjXDNcdTAxM2JcMVwwXDY1XHUwMTNiXDFcdTAxM2VcMVwwXDEyXHUwMTNlXDFcdTAxM2MiKwotICAgICJcMVx1MDE5OVw0NVx1MDEzZVwxXHUwMTk5XDIxXHUwMTNlXDFcMFwxMlx1MDEzZVwxXHUwMTlhXDFcdTAxOTkiKwotICAgICJcNDVcdTAxM2VcMVx1MDE5OVwyMFx1MDEzZVwxNFwwXDFcdTAxOWJcNjdcMFwxNFx1MDEzZVwxXHUwMTlhIisKLSAgICAiXDFcdTAxM2VcMVwwXDY1XHUwMTNlXDJcMjQwXDFcMFw0XDI0MFwxXHUwMTljXDE1XDI0MCIrCi0gICAgIlwxXHUwMTlkXDIyXDI0MFwxXHUwMTllXDM1XDI0MFwxXDBcMzFcMjQwXDFcdTAxOWZcNDdcMjQwIisKLSAgICAiXDIyXDBcMVx1MDFhMFw2MVwwXDE2XDI1MVwxXDBcNjVcMjUxXDE2XDI1N1wxXDAiKwotICAgICJcNjVcMjU3XDEyXDI2NFwxXDBcMVwyNjRcMVwwXDFcMjY0XDFcdTAxYTFcNjRcMjY0IisKLSAgICAiXDFcdTAxNGZcN1wyNjRcMVx1MDFhMlwyXDI2NFwxXDBcMVwyNjRcMVwwXDFcdTAxNGMiKwotICAgICJcN1wyNjRcMVx1MDFhM1wyMlwyNjRcMVx1MDFhNFwzMlwyNjRcMVwwXDEyXHUwMWExXDFcMCIrCi0gICAgIlwxXHUwMWExXDFcMFw2Nlx1MDFhMVwxXDBcMTJcdTAxNGZcMVwwXDFcdTAxNGZcMVwwIisKLSAgICAiXDFcdTAxYTVcNjVcdTAxNGZcMVwwXDdcdTAxNTBcMVx1MDFhNlw0XHUwMTUwXDFcdTAxNTFcMTBcdTAxNTAiKwotICAgICJcMVx1MDFhN1wyMlx1MDE1MFwxXHUwMWE4XDQ3XHUwMTUwXDFcdTAxNTFcMTdcdTAxNTBcMVx1MDFhOVw0N1x1MDE1MCIrCi0gICAgIlw3XHUwMTU0XDFcdTAxYWFcMlx1MDE1NFwxXHUwMTU1XDEyXHUwMTU0XDFcdTAxYWJcMjJcdTAxNTRcMVx1MDFhYyIrCi0gICAgIlw0NVx1MDE1NFwxXHUwMTU1XDIxXHUwMTU0XDFcdTAxYWRcNDdcdTAxNTRcMTJcMzAyXDFcMFwxMDBcMzAyIisKLSAgICAiXDFcdTAxYWVcMlwzMDJcMVwwXDEyXDMwMlwxXHUwMWFmXDIyXDMwMlwxXHUwMWIwXDMxXDMwMiIrCi0gICAgIlwxXHUwMTU4XDFcMFwxMDJcdTAxYjFcMVx1MDFiMlwxXHUwMWIxXDE0XDMwNlwxXDBcNzZcMzA2IisKLSAgICAiXDFcdTAxYjNcNFwzMDZcMVwwXDEwXDMwNlwxXHUwMWI0XDIyXDMwNlwxXHUwMWI1XDMxXDMwNiIrCi0gICAgIlwxXHUwMTViXDFcMFwxMDJcdTAxYjZcMVx1MDFiN1wxXHUwMWI2XDdcMzExXDFcdTAxYjhcMlwzMTEiKwotICAgICJcMVwwXDFcMzExXDFcMFwxMFwzMTFcMVx1MDFiOVwyMlwzMTFcMVx1MDFiYVwzMlwzMTEiKwotICAgICJcMVwwXDdcdTAxNjBcMVx1MDFiYlw0XHUwMTYwXDFcdTAxNjFcMTBcdTAxNjBcMVx1MDFiY1wyMlx1MDE2MCIrCi0gICAgIlwxXHUwMWJkXDQ3XHUwMTYwXDFcdTAxNjFcMTdcdTAxNjBcMVx1MDFiZVw0N1x1MDE2MFw3XHUwMTY0XDFcdTAxYmYiKwotICAgICJcMlx1MDE2NFwxXHUwMTY1XDEyXHUwMTY0XDFcdTAxYzBcMjJcdTAxNjRcMVx1MDFjMVw0NVx1MDE2NFwxXHUwMTY1IisKLSAgICAiXDIxXHUwMTY0XDFcdTAxYzJcNDdcdTAxNjRcMTJcMzI3XDFcMFwxMDBcMzI3XDFcdTAxYzNcMlwzMjciKwotICAgICJcMVwwXDEyXDMyN1wxXHUwMWM0XDIyXDMyN1wxXHUwMWM1XDMxXDMyN1wxXHUwMTY4XDFcMCIrCi0gICAgIlwxMDJcdTAxYzZcMVx1MDFjN1wxXHUwMWM2XDE0XDMzM1wxXDBcNzZcMzMzXDFcdTAxYzhcNFwzMzMiKwotICAgICJcMVwwXDEwXDMzM1wxXHUwMWM5XDIyXDMzM1wxXHUwMWNhXDMxXDMzM1wxXHUwMTZiXDFcMCIrCi0gICAgIlwxMDJcdTAxY2JcMVx1MDFjY1wxXHUwMWNiXDdcMFwxXHUwMWNkXDEwM1wwXDFcdTAxY2VcMTMxXDAiKwotICAgICJcMVx1MDFjZlw0NlwwXDFcdTAxNzRcMVwwXDExXHUwMTc0XDFcMFw2XHUwMTc0XDFcMCIrCi0gICAgIlw2MVx1MDE3NFwxXHUwMTc1XDFcMFwxMVx1MDE3NVwxXDBcNlx1MDE3NVwxXDBcNDVcdTAxNzUiKwotICAgICJcMVwwXDE0XHUwMTc1XDFcMFwzXHUwMTc1XDFcdTAxNzZcNVx1MDE3NVwxXDBcM1x1MDE3NSIrCi0gICAgIlwxXHUwMTc2XDJcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3Nlw0MVx1MDE3NVwxXHUwMWQwXDEzXHUwMTc1IisKLSAgICAiXDIwXDBcMVx1MDE3OFw0N1wwXDFcdTAxZDFcMzNcMFwxXHUwMWQyXDE0XDBcM1x1MDFkMiIrCi0gICAgIlwyXDBcMVx1MDFkMlwxMVwwXDFcdTAxZDJcMVwwXDJcdTAxZDJcNlwwXDFcdTAxZDIiKwotICAgICJcMlwwXDJcdTAxZDJcNlwwXDFcdTAxZDJcMTBcMFw0XDExM1w2XDBcMVwxMTMiKwotICAgICJcNlwwXDVcMTEzXDFcMFwxMVwxMTNcMVx1MDFkM1wxXDExM1wxXDBcMVx1MDFkMyIrCi0gICAgIlwxMVwxMTNcMVwwXDRcMTEzXDFcMFwxMVwxMTNcMlwwXDEyXDM3NVwxXDM3NyIrCi0gICAgIlwzXDM3NVwxXDBcNjVcMzc1XDE0XHUwMTAxXDFcMzc3XDFcdTAxMDFcMVwwXDY1XHUwMTAxIisKLSAgICAiXDZcMFwzXDE2NlwxXHUwMWQ0XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwIisKLSAgICAiXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDJcMCIrCi0gICAgIlwxXHUwMTg0XDJcdTAxODVcMVx1MDE4NlwxXHUwMTg0XDFcdTAxODVcNFx1MDE4NFwxXHUwMTg1XDFcdTAxODQiKwotICAgICJcMVx1MDE4NVwyXHUwMTg0XDFcdTAxODVcNlx1MDE4NFwxXHUwMTg1XDU0XHUwMTg0XDFcdTAxZDVcMTAzXHUwMTg1IisKLSAgICAiXDFcdTAxZDZcMVx1MDE4N1wyXHUwMTg4XDFcdTAxODlcMVx1MDE4N1wxXHUwMTg4XDRcdTAxODdcMVx1MDE4OCIrCi0gICAgIlwxXHUwMTg3XDFcdTAxODhcMlx1MDE4N1wxXHUwMTg4XDZcdTAxODdcMVx1MDE4OFw1NFx1MDE4N1wxXHUwMWQ1IisKLSAgICAiXDEwM1x1MDE4OFwxXHUwMWQ3XDQwXDBcMVx1MDFkOFwxNFwwXDFcdTAxZDhcNjBcMFwyXHUwMWQ5IisKLSAgICAiXDEwMVwwXDFcdTAxZGFcMTEyXDBcMVx1MDFkYlwxNFwwXDFcdTAxZGJcNjBcMFwyXHUwMWRjIisKLSAgICAiXDUwXDBcMTRcdTAxMjRcMVx1MDEyMlwxXHUwMTI0XDFcMFw2NVx1MDEyNFwzXDBcMlx1MDFkZCIrCi0gICAgIlwxXDBcNFx1MDFkZFwyXDBcMVx1MDEyNlwxXHUwMWRkXDFcMFw0XHUwMWRkXDFcMCIrCi0gICAgIlwxMFx1MDFkZFwxXDBcMzdcdTAxZGRcMlwwXDRcdTAxZGRcMlwwXDE0XHUwMTM0XDFcdTAxMzIiKwotICAgICJcMVx1MDEzNFwxXDBcNjVcdTAxMzRcM1wwXDJcdTAxZGVcMVwwXDRcdTAxZGVcMlwwIisKLSAgICAiXDFcdTAxMzZcMVx1MDFkZVwxXDBcNFx1MDFkZVwxXDBcMTBcdTAxZGVcMVwwXDM3XHUwMWRlIisKLSAgICAiXDJcMFw0XHUwMWRlXDJcMFwyXDIzMVwxXDBcNFwyMzFcMVx1MDFkZlw3NlwyMzEiKwotICAgICJcMVwwXDMyXDIzMVwxXHUwMWUwXDQ2XDIzMVwxNFx1MDEzZVwxXHUwMTNjXDFcdTAxM2VcMVwwIisKLSAgICAiXDY1XHUwMTNlXDNcMFwyXHUwMWUxXDFcMFw0XHUwMWUxXDJcMFwxXHUwMTQwXDFcdTAxZTEiKwotICAgICJcMVwwXDRcdTAxZTFcMVwwXDEwXHUwMWUxXDFcMFwzN1x1MDFlMVwyXDBcNFx1MDFlMSIrCi0gICAgIlwyXDBcMlwyNDBcMVwwXDRcMjQwXDFcdTAxZTJcNzZcMjQwXDFcMFwzMlwyNDAiKwotICAgICJcMVx1MDFlM1w0NlwyNDBcMlwwXDFcdTAxZTRcMTAxXDBcN1wyNjRcMVx1MDFlNVwyXDI2NCIrCi0gICAgIlwxXDBcMVwyNjRcMVwwXDFcdTAxNGNcNjVcMjY0XDFcMFwxMlx1MDE0ZlwxXDAiKwotICAgICJcMVx1MDE0ZlwxXDBcMVx1MDE0ZlwxXDBcNjVcdTAxNGZcN1x1MDE1MFwxXHUwMWU2XDRcdTAxNTAiKwotICAgICJcMVx1MDE1MVwxMDNcdTAxNTBcMVx1MDE1MVwyMFx1MDE1MFwxXHUwMWU3XDQ2XHUwMTUwXDdcdTAxNTRcMVx1MDFlOCIrCi0gICAgIlwyXHUwMTU0XDFcdTAxNTVcMTAzXHUwMTU0XDFcdTAxNTVcMjJcdTAxNTRcMVx1MDFlOVw0Nlx1MDE1NFw3XDMwMiIrCi0gICAgIlwxXHUwMWVhXDJcMzAyXDFcMFw2N1wzMDJcMVx1MDE1OFwxXDBcMTJcdTAxZWJcMVx1MDFlYyIrCi0gICAgIlw3MFx1MDFlYlwxXDBcN1wzMDZcMVx1MDFlZFw0XDMwNlwxXDBcNjVcMzA2XDFcdTAxNWIiKwotICAgICJcMVwwXDE0XHUwMWVlXDFcdTAxZWNcNjZcdTAxZWVcMVwwXDdcMzExXDFcdTAxZWZcMlwzMTEiKwotICAgICJcMVwwXDFcMzExXDFcMFw2NlwzMTFcMVwwXDdcdTAxNjBcMVx1MDFmMFw0XHUwMTYwIisKLSAgICAiXDFcdTAxNjFcMTAzXHUwMTYwXDFcdTAxNjFcMjBcdTAxNjBcMVx1MDFmMVw0Nlx1MDE2MFw3XHUwMTY0XDFcdTAxZjIiKwotICAgICJcMlx1MDE2NFwxXHUwMTY1XDEwM1x1MDE2NFwxXHUwMTY1XDIyXHUwMTY0XDFcdTAxZjNcNDZcdTAxNjRcN1wzMjciKwotICAgICJcMVx1MDFmNFwyXDMyN1wxXDBcNjdcMzI3XDFcdTAxNjhcMVwwXDEyXHUwMWY1XDFcdTAxZjYiKwotICAgICJcNzBcdTAxZjVcMVwwXDdcMzMzXDFcdTAxZjdcNFwzMzNcMVwwXDY1XDMzM1wxXHUwMTZiIisKLSAgICAiXDFcMFwxNFx1MDFmOFwxXHUwMWY2XDY2XHUwMWY4XDM3XDBcMVx1MDFmOVwxMzVcMFwxXHUwMWQwIisKLSAgICAiXDMzXDBcMVx1MDFkMlwxNFwwXDNcdTAxZDJcMlwwXDFcdTAxZDJcMTFcMFwxXHUwMWQyIisKLSAgICAiXDFcMFwyXHUwMWQyXDZcMFwxXHUwMWQyXDFcMFwxXHUwMWQxXDJcdTAxZDJcNlwwIisKLSAgICAiXDFcdTAxZDJcMTBcMFw0XDExM1w2XDBcMVwxMTNcNlwwXDVcMTEzXDFcMCIrCi0gICAgIlw2XDExM1wxXHUwMWZhXDRcMTEzXDFcMFwxMlwxMTNcMVwwXDFcMTEzXDFcdTAxZmEiKwotICAgICJcMlwxMTNcMVwwXDExXDExM1wxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDZcMTY2XDFcdTAxZmJcNFwxNjZcMVwwXDZcMTY2XDFcdTAxZmMiKwotICAgICJcM1wxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNTRcMFwxXHUwMWZkXDc2XDAiKwotICAgICJcMVx1MDFmZVwxM1wwXDFcdTAxZmVcNjRcMFwxXHUwMWZmXDExXDBcMVx1MDFmZlw3MVwwIisKLSAgICAiXDFcdTAyMDBcMTFcMFwxXHUwMjAwXDc0XDBcMVx1MDIwMVwxM1wwXDFcdTAyMDFcMjJcMCIrCi0gICAgIlwyXDIzMVwxXDBcMzNcMjMxXDFcdTAyMDJcNDVcMjMxXDJcMjQwXDFcMFwzM1wyNDAiKwotICAgICJcMVx1MDIwM1w0NVwyNDBcMTRcdTAxNTBcMVx1MDE1MVwyMVx1MDE1MFwxXHUwMjA0XDQ1XHUwMTUwXDEyXHUwMTU0IisKLSAgICAiXDFcdTAxNTVcMjNcdTAxNTRcMVx1MDIwNVw0NVx1MDE1NFwxMlx1MDFlYlwxXHUwMWIxXDY3XHUwMWViXDFcdTAyMDYiKwotICAgICJcMVx1MDFiMVwxNFx1MDFlZVwxXHUwMWI2XDY1XHUwMWVlXDFcdTAyMDdcMVx1MDFiNlwxNFx1MDE2MFwxXHUwMTYxIisKLSAgICAiXDIxXHUwMTYwXDFcdTAyMDhcNDVcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwyM1x1MDE2NFwxXHUwMjA5XDQ1XHUwMTY0IisKLSAgICAiXDEyXHUwMWY1XDFcdTAxYzZcNjdcdTAxZjVcMVx1MDIwYVwxXHUwMWM2XDE0XHUwMWY4XDFcdTAxY2JcNjVcdTAxZjgiKwotICAgICJcMVx1MDIwYlwxXHUwMWNiXDM3XDBcMVx1MDIwY1w1MlwwXDRcMTEzXDZcMFwxXDExMyIrCi0gICAgIlw2XDBcNVwxMTNcMVwwXDNcMTEzXDFcdTAyMGRcN1wxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcdTAyMGRcNVwxMTNcMVwwXDRcMTEzXDFcMFwxMVwxMTNcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMVwxNjZcMVx1MDIwZVwxXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2XDFcdTAyMGZcMlwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw1NVwwXDFcdTAyMTAiKwotICAgICJcMjNcMFwxXHUwMjEwXDUwXDBcMVx1MDIxMVwxN1wwXDFcdTAyMTFcNjZcMFwxXHUwMjEyIisKLSAgICAiXDEyXDBcMVx1MDIxMlw1MlwwXDFcdTAyMTNcMTA3XDBcMVx1MDIxNFwzNFwwXDFcdTAyMTQiKwotICAgICJcMTFcMFwyXDIzMVwxXDBcMzRcMjMxXDFcdTAyMTVcNDRcMjMxXDJcMjQwXDFcMCIrCi0gICAgIlwzNFwyNDBcMVx1MDIxNlw0NFwyNDBcMTRcdTAxNTBcMVx1MDE1MVwyMlx1MDE1MFwxXHUwMjE3XDQ0XHUwMTUwIisKLSAgICAiXDEyXHUwMTU0XDFcdTAxNTVcMjRcdTAxNTRcMVx1MDIxOFw0NFx1MDE1NFwxMlx1MDFlYlwxXHUwMjE5XDY3XHUwMWViIisKLSAgICAiXDFcdTAyMDZcMVx1MDFiMVwxNFx1MDFlZVwxXHUwMjFhXDY1XHUwMWVlXDFcdTAyMDdcMVx1MDFiNlwxNFx1MDE2MCIrCi0gICAgIlwxXHUwMTYxXDIyXHUwMTYwXDFcdTAyMWJcNDRcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwyNFx1MDE2NFwxXHUwMjFjIisKLSAgICAiXDQ0XHUwMTY0XDEyXHUwMWY1XDFcdTAyMWRcNjdcdTAxZjVcMVx1MDIwYVwxXHUwMWM2XDE0XHUwMWY4XDFcdTAyMWUiKwotICAgICJcNjVcdTAxZjhcMVx1MDIwYlwxXHUwMWNiXDQwXDBcMVx1MDIxZlw1MVwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDExXDE2NlwxXHUwMjIwXDFcMTY2XDFcMCIrCi0gICAgIlwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDAiKwotICAgICJcMVwxNjZcNlwwXDVcMTY2XDFcMFw2XDE2NlwxXHUwMjIxXDRcMTY2XDFcMCIrCi0gICAgIlwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNDRcMFwxXHUwMjIyXDExXDAiKwotICAgICJcMVx1MDIyMlw2N1wwXDFcdTAyMjNcMTRcMFwxXHUwMjIzXDY2XDBcMVx1MDIyNFwxNFwwIisKLSAgICAiXDFcdTAyMjRcMjZcMFwyXDIzMVwxXDBcMzVcMjMxXDFcdTAyMjVcNDNcMjMxXDJcMjQwIisKLSAgICAiXDFcMFwzNVwyNDBcMVx1MDIyNlw0M1wyNDBcMTRcdTAxNTBcMVx1MDE1MVwyM1x1MDE1MFwxXHUwMjI3IisKLSAgICAiXDQzXHUwMTUwXDEyXHUwMTU0XDFcdTAxNTVcMjVcdTAxNTRcMVx1MDIyOFw0M1x1MDE1NFwxNFx1MDE2MFwxXHUwMTYxIisKLSAgICAiXDIzXHUwMTYwXDFcdTAyMjlcNDNcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwyNVx1MDE2NFwxXHUwMjJhXDQzXHUwMTY0IisKLSAgICAiXDM3XDBcMVx1MDIyYlw1MlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDIyY1w1XDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDVcMTY2XDFcdTAyMmRcNVwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwyXDBcMlwyMzFcMVwwXDM0XDIzMVwxXHUwMjJlXDQ0XDIzMSIrCi0gICAgIlwyXDI0MFwxXDBcMzRcMjQwXDFcdTAyMmZcNDRcMjQwXDE0XHUwMTUwXDFcdTAxNTFcMjJcdTAxNTAiKwotICAgICJcMVx1MDIzMFw0NFx1MDE1MFwxMlx1MDE1NFwxXHUwMTU1XDI0XHUwMTU0XDFcdTAyMzFcNDRcdTAxNTRcMTRcdTAxNjAiKwotICAgICJcMVx1MDE2MVwyMlx1MDE2MFwxXHUwMjMyXDQ0XHUwMTYwXDEyXHUwMTY0XDFcdTAxNjVcMjRcdTAxNjRcMVx1MDIzMyIrCi0gICAgIlw0NFx1MDE2NFwzNFwwXDFcdTAyMzRcNTVcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwIisKLSAgICAiXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDFcMTY2XDFcdTAyMzVcN1wxNjZcMlwwXDJcMjMxXDFcMFwzMVwyMzFcMVx1MDIzNiIrCi0gICAgIlw0N1wyMzFcMlwyNDBcMVwwXDMxXDI0MFwxXHUwMjM3XDQ3XDI0MFwxNFx1MDE1MFwxXHUwMTUxIisKLSAgICAiXDE3XHUwMTUwXDFcdTAyMzhcNDdcdTAxNTBcMTJcdTAxNTRcMVx1MDE1NVwyMVx1MDE1NFwxXHUwMjM5XDQ3XHUwMTU0IisKLSAgICAiXDE0XHUwMTYwXDFcdTAxNjFcMTdcdTAxNjBcMVx1MDIzYVw0N1x1MDE2MFwxMlx1MDE2NFwxXHUwMTY1XDIxXHUwMTY0IisKLSAgICAiXDFcdTAyM2JcNDdcdTAxNjRcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDIzY1w1XDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDEwXDE2NlwxXHUwMjNkXDJcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXHUwMjNlXDZcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2IisKLSAgICAiXDFcMFw1XDE2NlwxXHUwMjNmXDVcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2IisKLSAgICAiXDFcMFwxMVwxNjZcMlwwXDZcdTAyNDBcNFx1MDI0MVw2XHUwMjQwXDFcdTAyNDFcNVx1MDI0MCIrCi0gICAgIlwxXDBcNVx1MDI0MVwxXHUwMjQwXDEzXHUwMjQxXDFcdTAyNDBcMTJcdTAyNDFcMVx1MDI0MFw0XHUwMjQxIisKLSAgICAiXDFcdTAyNDBcMTFcdTAyNDFcMlx1MDI0MFw0MVwwXDFcdTAyNDJcM1wwXDFcdTAyNDNcN1wwIisKLSAgICAiXDFcdTAyNDRcMVx1MDI0NVwyMFwwXDFcdTAyNDZcMTJcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFw0XDE2NlwxXHUwMjQ3XDNcMTY2XDFcdTAyNDhcMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcdTAyNDlcMVx1MDI0YVw0XDE2NlwxXDBcNFwxNjZcMVwwIisKLSAgICAiXDZcMTY2XDFcdTAyNGJcMlwxNjZcNjBcMFwxXHUwMjRjXDc0XDBcMVx1MDI0ZFwxMTJcMCIrCi0gICAgIlwxXHUwMjRlXDEwMlwwXDFcdTAyNGZcMTA0XDBcMVx1MDI1MFwzM1wwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI1MSIrCi0gICAgIlw0XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEyXDE2NlwxXHUwMjUyXDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDVcMTY2XDFcdTAyNTNcNFwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDRcMTY2XDFcdTAyNTRcNVwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDVcMTY2XDFcdTAyNTVcNFwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNDVcMFwxXHUwMjU2XDEzMlwwXDFcdTAyNTciKwotICAgICJcMTA0XDBcMVx1MDI1OFw2NVwwXDFcdTAyNTlcMTIxXDBcMVx1MDI1YVwxNlwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDZcMTY2XDFcdTAyNWJcNFwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMVwxNjZcMVx1MDI1Y1w3XDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMlwxNjZcMVx1MDI1ZFw2XDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVx1MDI1ZVw1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcMlwxNjZcMVx1MDI1Zlw2XDE2Nlw0N1wwXDFcdTAyNjAiKwotICAgICJcNzFcMFwxXHUwMjYxXDEwM1wwXDFcdTAyNjJcMTEzXDBcMVx1MDI2M1wxMDJcMFwxXHUwMjY0IisKLSAgICAiXDQ3XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2IisKLSAgICAiXDFcdTAyNjVcMlwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNFwxNjZcMVx1MDI2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDRcMTY2XDFcdTAyNjdcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNlwxNjZcMVx1MDI2OFw0XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNVwxNjZcMVx1MDI2OVw1XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDYwXDBcMVx1MDI2YSIrCi0gICAgIlwxMjVcMFwxXHUwMjZiXDUwXDBcMVx1MDI2Y1wxMDNcMFwxXHUwMjZkXDQ0XDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw1XDE2NiIrCi0gICAgIlwxXHUwMjZlXDRcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFw3XDE2NlwxXHUwMjZmXDFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2XDFcdTAyNzBcMlwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEwXDE2NlwxXHUwMjcxXDJcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTAzXDBcMVx1MDI3MiIrCi0gICAgIlw2MVwwXDFcdTAyNWFcMTI1XDBcMVx1MDI2NFwxMDNcMFwxXHUwMjczXDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxMFwxNjZcMVx1MDI3NFwxMFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNlwxNjZcMVx1MDI1ZiIrCi0gICAgIlwzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMCIrCi0gICAgIlw0XDE2NlwxXDBcMTBcMTY2XDFcdTAyNjlcMTBcMFw0XDE2Nlw2XDBcMVwxNjYiKwotICAgICJcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDEwXDE2NlwxXHUwMjc1XDM1XDBcMVx1MDI1YVwxNTBcMFwxXHUwMjc2XDExXDAiKwotICAgICJcNFwxNjZcNlwwXDFcMTY2XDZcMFw0XDE2NlwxXHUwMjVmXDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2IisKLSAgICAiXDFcMFw0XDE2NlwxXDBcN1wxNjZcMVx1MDI3N1wxXDE2Nlw1N1wwXDFcdTAyNWEiKwotICAgICJcMzRcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcdTAyNWZcNVwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjYiKwotICAgICJcMlwwIjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksIAotICAgICAxLCAgOSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDksICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgOSwgIDksICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgMywgIDMsICAzLCAgMywgIDMsICAzLCAgOSwgCi0gICAgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICA5LCAgMywgIDMsIAotICAgICAzLCAgMywgIDMsICAzLCAgOSwgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDksICAxLCAgMiwgIDEsICAyLCAgMSwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsIAotICAgICAwLCAgMCwgIDEsICA5LCAgMCwgIDksICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgMCwgIDAsICA5LCAgOSwgIDksICAwLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMiwgCi0gICAgMTMsICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsIAotICAgIDEzLCAgMywgIDIsICAyLCAxMywgIDMsICAyLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDksICA5LCAKLSAgICAgOSwgIDAsICAwLCAgMSwgIDEsICAxLCAgOSwgIDAsICAwLCAxMywgIDksIDEzLCAgOSwgIDksICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDMsICAyLCAgMiwgIDMsICAyLCAgMiwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDAsICAyLCAgMywgIDMsICAyLCAgMiwgIDMsICAzLCAgMiwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAyLCAgMywgIDMsICAyLCAgMiwgIDMsIAotICAgICAzLCAgMiwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICA5LCAgOSwgIDAsICAxLCAKLSAgICAgOSwgIDAsICAxLCAgMSwgIDUsIDEzLCAxMywgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDksICAxLCAgMywgIDIsICAzLCAgMiwgIDEsICAwLCAgOSwgIDEsICAwLCAgMSwgIDMsIAotICAgICAyLCAgMywgIDIsICAxLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDEsICAxLCAgMiwgIDIsICAwLCAgMCwgIDIsICAyLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgCi0gICAgIDAsICAwLCAgOSwgIDksICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAyLCAgMiwgIDEsICAxLCAgMCwgIDEsIAotICAgICAxLCAgOSwgIDksICA5LCAgMSwgIDEsICAyLCAgMiwgIDIsICAyLCAgMCwgIDEsICAxLCAgMSwgIDEsICAyLCAKLSAgICAgMiwgIDIsICAyLCAgOSwgIDEsICAxLCAgMSwgIDMsICAzLCAgMywgIDMsICAxLCAgMSwgIDEsICAxLCAgMCwgCi0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsKLSAKLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZfY29udGV4dCA9IG51bGw7Ci0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkCi0JcHJpdmF0ZSBTdHJpbmcgZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IHN0YXRlIHRvIGVudGVyIG9uY2UgYW4gZW1iZWRkZWQgcmVnaW9uIGhhcwotCS8vICAgYmVlbiBjb21wbGV0ZWQKLQlwcml2YXRlIGludCBmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JLy8gdGhlIGNvbnRhaW5lciB1c2VkIHRvIGNyZWF0ZSBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NPTlRFWFQgPSAiUFJPWFlfQ09OVEVYVCI7Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydCA9IDA7Ci0JcHJpdmF0ZSBpbnQgdGV4dExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCS8vIG9mZnNldCBmb3IgdHJhY2tpbmcgcG9zaXRpb24gc3BlY2lmaWMgYmxvY2sgdGFncwotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOwotCQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBiZWluZyBvcGVuZWQKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGluc2lkZSBvZiBhbiBlbWJlZGRlZCByZWdpb24KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGludGVybmFsQ29udGV4dCA9IG51bGw7Ci0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMKLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JcHJpdmF0ZSBMaXN0IGZOZXN0YWJsZVByZWZpeGVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkKLQkvLyB3aGVyZSB0aGUgbGFzdCBpbnRlcm5hbCBjb250YWluZXIgYmxvY2sgd2FzIGZvdW5kCi0JcHJpdmF0ZSBpbnQgZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsKLQotCS8vIHJlcXVpcmVkIHRvIG5vdCBzZWVrIHRleHQgYmxvY2tzIG9uIGFuIGVuZCB0YWcKLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGZGb3JiaWRKU1AgPSBmYWxzZTsKLQkKLQlwcml2YXRlIGludCBmRUxsZXZlbCA9IDA7Ci0KLQlwcml2YXRlIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpOwotCi0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkKLQkJCXJldHVybjsKLQkJZkJsb2NrTWFya2Vycy5hZGQobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKSB7Ci0JCWZOZXN0YWJsZVByZWZpeGVzLmFkZChtYXJrZXIpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldE5lc3RhYmxlUHJlZml4ZXMoKSB7Ci0JCXJldHVybiBmTmVzdGFibGVQcmVmaXhlczsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0YWJsZShTdHJpbmcgdGFnTmFtZSkgewotCQkvL0l0ZXJhdG9yIGJsb2NrcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCS8vd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQkvLwlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcilibG9ja3MubmV4dCgpOwotCQkvLwlTdHJpbmcgbWFya2VyTmFtZSA9IG1hcmtlci5nZXRUYWdOYW1lKCk7Ci0JCS8vCWlmKHRhZ05hbWUubGVuZ3RoKCkgPiBtYXJrZXJOYW1lLmxlbmd0aCgpICsgMSAmJiB0YWdOYW1lLnN0YXJ0c1dpdGgobWFya2VyTmFtZSkgJiYgdGFnTmFtZS5jaGFyQXQobWFya2VyTmFtZS5sZW5ndGgoKSkgPT0gJzonKSB7Ci0JCS8vCQlyZXR1cm4gbWFya2VyLmlzR2xvYmFsKCkgfHwgZ2V0T2Zmc2V0KCkgPj0gbWFya2VyLmdldE1hcmtlcigpLmdldFN0YXJ0KCk7Ci0JCS8vCX0KLQkJLy99Ci0JCS8vcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlTmVzdGFibGVQcmVmaXgoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGZOZXN0YWJsZVByZWZpeGVzICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIG5lc3RhYmxlcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAobmVzdGFibGVzLmhhc05leHQoKSkgewotCQkJCWlmICgoKFRhZ01hcmtlcikgbmVzdGFibGVzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJCW5lc3RhYmxlcy5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQkJaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgYmxvY2tzID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQkJYmxvY2tzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbnVsbCwgZW5kVGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMpIHsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIGVuZFR5cGVzLCBudWxsKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVHlwZSkgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbmV3IFN0cmluZ1tde2VuZFR5cGV9LCBudWxsKTsKLQl9Ci0JLyoqCi0JICogIHVzZXIgbWV0aG9kIAotCSAqIAotCSAqIEFzc2VtYmxlcyBhbiBlbWJlZGRlZCBjb250YWluZXIgYmVnaW5uaW5nIHdpdGggdGhlIGdpdmVuIHN0YXJ0VHlwZSBhcwotCSAqIHRoZSBmaXJzdCBDb250ZXh0UmVnaW9uIHdpdGhpbiBpdCBhbmQgb2YgdGhlIHR5cGUgZkVtYmVkZGVkSGludC4gIFRoZQotCSAqIGVuZFR5cGVzW10gYXJyYXkgY29udGFpbnMgdGhlIGNvbnRleHQgdHlwZXMgdGhhdCB3aWxsIGNhdXNlIGEgc3VjY2Vzc2Z1bAotCSAqIGV4aXQuICBVc2Ugb2YgdGhlIGVuZFRhZ05hbWUgcGFyYW1ldGVyIGFsdGVycyB0aGlzIGJlaGF2aW9yIHRvIGZvcmNlIGFuCi0JICogZXhpdCBvbiBhbiBYTUxfVEFHX0NMT1NFIGFmdGVyIHNlZWluZyBhbiBYTUxfVEFHX05BTUUgd2hvc2Ugc2lnbmlmaWNhbnQKLQkgKiB0ZXh0IG1hdGNoZXMgdGhlIGVuZFRhZ05hbWUgU3RyaW5nLiAgQWxsIGNvbnRlbnRzIGluIGJldHdlZW4gYXJlCi0JICogaW5zaWduaWZpY2FudCwgYW5kIHllcywgdGhpcyBtZWFucyBjb21tZW50cyBhcmUgYWxsb3dlZCBpbnNpZGUuCi0JICoqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzLCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQkvLyB0aGUgY29udGV4dCBvZiB0aGUgcmVnaW9uIGJlaW5nIGFkZGVkIHRvIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJaW50ZXJuYWxDb250ZXh0ID0gc3RhcnRUeXBlOwotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHRoaXMgY29udGFpbmVyIGJlZ2FuOyB0byBwcm92aWRlIHJlbGF0aXZlIGluZGVjZXMgZm9yIHRoZSByZWdpb25zCi0JCWludCBjb250YWluZXJTdGFydCA9IHl5Y2hhcjsKLQkJYm9vbGVhbiBub3RGaW5pc2hlZCA9IHRydWU7Ci0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgd2Ugc2VlbSB0byBiZSBzbyB0aGF0IHRoZSBlbmRUYWdOYW1lIGNhbiBiZSBjaGVja2VkCi0JCWJvb2xlYW4gaXNJbkVuZFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGlzSW5GaXJzdFRhZyA9IHRydWU7Ci0JCS8vIGNyZWF0ZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyIGFuZCBzZXR1cCBpdHMgInR5cGUiCi0JCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKGZFbWJlZGRlZEhpbnQpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KGNvbnRhaW5lclN0YXJ0KTsKLQkJCS8vIFRPRE86IHBhcmVudCByZWdpb24gbmVlZHMgdG8gYmUgc2V0IC4uLi4gYnV0IG5vdCBzdXJlIHdoZXJlIHRvIGdldCBpdCBmcm9tIAotCQkJLy8JCWZFbWJlZGRlZENvbnRhaW5lci5zZXRQYXJlbnQocGFyZW50UmVnaW9uKTsKLQkJfQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOwotCQl3aGlsZSAobm90RmluaXNoZWQpIHsKLQkJCS8vIGFkZCB0aGUgcmVnaW9uIHRvIHRoZSBjb250YWluZXIKLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgewotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJCQlib29sZWFuIGxvbmdzY2FuID0gZmFsc2U7Ci0JCQkJLy8gc2F2ZSB0aGUgdG9rZW5pemVyIHN0YXRlIGluIGNhc2Ugb2YgYSBibG9jayB0YWcgc2NhbgotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOwotCQkJCVN0cmluZyBwcmV2aW91c0N1cnJlbnRUYWdOYW1lID0gZkN1cnJlbnRUYWdOYW1lOwotCQkJCWludCBwcmV2aW91c1Bvc3RTdGF0ZSA9IGZFbWJlZGRlZFBvc3RTdGF0ZTsKLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50OwotCQkJCS8vIGRldGVybWluZSBpZiBhIGJsb2NrIHRhZyBzY2FuIGlzIG5lY2Vzc2FyeQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCQlpZighaXNOZXN0YWJsZShpbnRlcm5hbFRhZ05hbWUpKSB7Ci0JCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlCi0JCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9BQk9SVF9FTUJFRERFRDsKLQkJCQkJCW5vdEZpbmlzaGVkID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9UQUdfT1BFTiB8fCBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOwotCQkJCX0KLQkJCQkvLyBkbyB1cGtlZXAgZm9yIGVuZFRhZ05hbWUgdXNhZ2U7IG11c3QgYmUgaGVyZSBzaW5jZSB0aGUgbmV4dCB0b2tlbiBjb3VsZCBiZSB0aGUgY2xvc2UKLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJaXNJbkVuZFRhZyA9IHRydWU7Ci0JCQkJfSBlbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgewotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7Ci0JCQkJfSBlbHNlIHsKLQkJCQkgCUlUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMgPSBmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpOwotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoY29udGFpbnNUYWdOYW1lKGludGVybmFsVGFnTmFtZSkpIHsKLQkJCQkJCQlsb25nc2NhbiA9IHRydWU7Ci0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGxvbmdzY2FuKQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBpbnRlcm5hbFRhZ05hbWU7Ci0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQKLQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJaWYgKGxvbmdzY2FuKSB7Ci0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzCi0JCQkJCS8vIGFzIHdlbGwgYXMgaGFuZGxpbmcgdGhlIGJsb2NrIHJlZ2lvbiBhbmQgc2V0dGluZyB1cCBmb3Igbm9ybWFsIHNjYW5uaW5nCi0JCQkJCS8vIGluc2lkZSB0aGUgZW1iZWRkZWQgY29udGFpbmVyCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyBuZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsKLQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gcHJldmlvdXNQb3N0U3RhdGU7Ci0JCQkJCWZFbWJlZGRlZEhpbnQgPSBwcmV2aW91c0VtYmVkZGVkSGludDsKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsKLQkJCQkJeXliZWdpbihwcmV2aW91c1N0YXRlKTsKLQkJCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcmltR2V0TmV4dFRva2VuKCkgY2FsbHMgbWF5IHRocm93IGFuIElPRXhjZXB0aW9uCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93Ci0JCQkJLy8gd2lsbCBwcm9wZXJseSBleGl0IGlmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZikgewotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGYpOwotCQkJfQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7Ci0JCQlpZighaXNFbmRpbmdUeXBlKSB7Ci0JCQkJLy8gY2hlY2sgZm9yIGVuZGluZyBjb250ZXh0Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVuZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpc0VuZGluZ1R5cGUgPSBpc0VuZGluZ1R5cGUgfHwgKGludGVybmFsQ29udGV4dCA9PSBlbmRUeXBlc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlzRW5kaW5nVHlwZSA9ICgoaXNJbkVuZFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgfHwgKGlzSW5GaXJzdFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VNUFRZX1RBR19DTE9TRSkpICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsICYmIGludGVybmFsVGFnTmFtZS5lcXVhbHMoZW5kVGFnTmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQlub3RGaW5pc2hlZCA9IG5vdEZpbmlzaGVkICYmICgoIWlzRW5kaW5nVHlwZSkgJiYgIWlzRU9GKCkgJiYgKGVuZFRhZ05hbWUgIT0gbnVsbCB8fCBpbnRlcm5hbENvbnRleHQgIT0gVU5ERUZJTkVEKSAmJiAhKGludGVybmFsQ29udGV4dCA9PSBQUk9YWV9DT05URVhUICYmIChlbWJlZGRlZExpc3QuZ2V0KGVtYmVkZGVkTGlzdC5zaXplKCktMSkpLmdldFR5cGUoKSA9PSBVTkRFRklORUQpKTsKLQkJfQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQKLQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCS8vbmV3VG9rZW4uc2V0UGFyZW50KGZFbWJlZGRlZENvbnRhaW5lcik7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aCh5eWNoYXIgLSBjb250YWluZXJTdGFydCArIHl5bGVuZ3RoKCkpOwotCQl9Ci0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQkJcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuYWxsb3dzSlNQKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJCWVsc2UgaWYoIWNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBtYXJrZXIuZ2V0Q29udGV4dCgpOwotCQl9Ci0JCXJldHVybiBCTE9DS19URVhUOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGZCbG9ja01hcmtlcnM7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcigpIHsKLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBjb250YWluc1RhZ05hbWUodGFnTmFtZSk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJYmVnaW5CbG9ja01hcmtlclNjYW4obmV3VGFnTmFtZSwgQkxPQ0tfVEVYVCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotCSAqIHN0YXJ0IG9mIGEgdGV4dCBibG9jayB3aXRoaW4gYSAibmV3VGFnTmFtZSIgdGFnLgotCSAqCi0JICogRXhhbXBsZTogCi0JICoJVG9rZW5pemVyIHRva2VyID0gbmV3IFRva2VuaXplcigpOwotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0JICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotCSAqCXRva2VyLmJlZ2luQmxvY2tNYXJrZXJTY2FuKCJzY3JpcHQiLCBCTE9DS19URVhUKTsKLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IAotCSAqCi0JICogUmV0dXJuczoKLQkgKglCTE9DS19URVhUOiAwLTQwCi0JICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLQkgKglYTUxfVEFHX05BTUU6IDQzLTQ4Ci0JICoJWE1MX1RBR19DTE9TRTogNDktNDkKLQkgKglYTUxfQ09OVEVOVDogNTAtNTcKLQkgKgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBhbGxvd0pTUCAtIGNoZWNrIGZvciBhbmQgYWxsb3cgZm9yIEpTUCBtYXJrdXAgPCUlPgotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gZXhpdFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSByZWdpb24gd2FzIG9mIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkKLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MKLSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQotCWJvb2xlYW4gY2hlY2tKU1BzID0gYWxsb3dKU1AgJiYgIWZGb3JiaWRKU1A7Ci0JYm9vbGVhbiBjaGVja2VkRm9ySlNQc09uY2UgPSAhY2hlY2tKU1BzOwotCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOwotCQotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLS8vCQljID0gKGNoYXIpIG47Ci0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuCi0JCWlmIChuID09IFlZRU9GICYmIGNoZWNrZWRGb3JKU1BzT25jZSkgewotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiCi0JCQkgKi8KLQkJCWNoZWNrZWRGb3JKU1BzT25jZSA9IHRydWU7Ci0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcwotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZAotCQkJLy8gdGh1cyBmb3VuZCB0d2ljZSBhdCBjdXJyZW50LXRhcmdldExlbmd0aCBbc2luY2UgdGhlIGZpcnN0IHNjYW4gd291bGQgaGF2ZSBjb21lIG91dCB0aGlzIGZhciBhbnl3YXldLgotCQkJaWYoY2hlY2tKU1BzICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiAKLQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0Ci0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4KLQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9jdXJyZW50UG9zID4gMCAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYKLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgewotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIDE7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuCi0JCQllbHNlIGlmKGNoZWNrSlNQcyAmJiAhY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfc3RhcnRSZWFkID4gMCAmJgotCQkJCQl5eV9zdGFydFJlYWQgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZCArIDFdID09ICclJykgewotCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOwotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfc3RhcnRSZWFkOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCi0KLQkJCS8qKgotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyIKLQkJCSAqLwotCQkJLy8gMSkgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgQ0RBVEEKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBDREFUQSBiZWdpbm5pbmcgYXQgY3VycmVudC1zZWFyY2hTdHJpbmdMZW5ndGg7IGlmIHNvLCBiYWNrdXAgYW5kIHN3aXRjaCBzY2FubmVyIHN0YXRlcyB0byBoYW5kbGUgaXQuCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPFshQ0RBVEFbXV0+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0vKgkJCWlmKGNoZWNrQ0RBVEEgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zICsgc2VhcmNoU3RyaW5nTGVuZ3RoIDwgeXlfYnVmZmVyLmxlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCWNoYXJzTWF0Y2goY2RhdGFTdGFydGVyLCB5eV9idWZmZXIsIDAsIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGgpKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZAotCQkJCWlmIChmRW1iZWRkZWRDb250YWluZXIgPT0gbnVsbCkgewotCQkJCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFN0YXJ0KHl5Y2hhcik7Ci0JCQkJfQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCVN0cmluZyBjb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgewotCQkJCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOLCBYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfQ0xPU0UpOwotCQkJCX0KLQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLSovLyoKLQkJCS8vIDIpIHl5X2N1cnJlbnRQb3MgLSBjZGF0YVN0YXJ0ZXIubGVuZ3RoOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBDREFUQSByaWdodCBoZXJlIHNwb3RzIGJhY2sgaW4gd2hhdCB3ZSBjb3VsZCByZWFkCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiAqaGF2aW5nKiBjbG9zZVRhZ1N0cmluZ0xlbmd0aCBhbW91bnQgb2YgaW5wdXQgdG8gd29yayBhcyBkZXNpZ25lZC4gIE11c3QgYmUgc3VyZSB3ZSBkb24ndAotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJgotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MgOiBDaGVjayBhdCB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9uZSB0aW1lCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uCi0JCQkvLyBzaW5jZSBpdCByZWxpZXMgdXBvbiB5eV9jdXJyZW50UG9zIGVxdWFsaW5nIGV4YWN0bHkgdGhlIHByZXZpb3VzIGVuZCArMSB0byB3b3JrIGFzIGRlc2lnbmVkLgotCQkJZWxzZSBpZihjaGVja0NEQVRBICYmICFjaGVja2VkRm9yQ0RBVEFPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7Ci0JCQkJY2hlY2tlZEZvckNEQVRBT25jZSA9IHRydWU7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0qLwotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXIKLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcwotCQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2FtZSA9IHRydWU7Ci0JCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcwotCQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdwotCQkJCWVsc2UgewotCQkJCQlzYW1lID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHNhbWUgJiYgcmVxdWlyZVRhaWxTZXBhcmF0b3IgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gKLQkJCQkvLyAiPC9zY3JpcHRTIgotCQkJCWxhc3RDaGVja0NoYXIgPSB5eV9idWZmZXJbeXlfY3VycmVudFBvc107Ci0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICIKLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQotCQkJCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3RpbGxTZWFyY2hpbmcgPSAhc2FtZSB8fCAoeXlfY3VycmVudFBvcyA8IHl5X3N0YXJ0UmVhZCArIHNlYXJjaFN0cmluZ0xlbmd0aCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgewotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotCQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQkJfQotCX0KLQllbHNlIHsKLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0Ci0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7Ci0JCXl5X2N1cnJlbnRQb3MrKzsKLQl9Ci0JeXliZWdpbihleGl0U3RhdGUpOwotCS8vIElmIHRoZSBlbmRpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpCi0JCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUKLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCk7Ci0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckFsbG93c0pTUCgpLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOwotfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkKLQkgKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4KLQkgKgotCSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLgotCSAqCi0JICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJLy8gbG9hZCB0aGUgc3RhcnRpbmcgbm9uLXdoaXRlc3BhY2UgdG9rZW4gKGFzc3VtZSB0aGF0IGl0IGlzIHNvKQotCQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgewotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBjb250YWluZXIgPSBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lcjsKLQkJCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQkJCXJldHVybiBjb250YWluZXI7Ci0JCQl9Ci0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLQkJCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsKLQkJCQlyZXR1cm4gZkVtYmVkZGVkQ29udGFpbmVyOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJCWVsc2UKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJCX0gZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJCX0KLQkJCXN0YXJ0ID0geXljaGFyOwotCQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQlpZiAoeXlfYXRFT0YpIHsKLQkJCQlmVG9rZW5Db3VudCsrOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuCi0JCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7Ci0JCQlmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IGZFbWJlZGRlZENvbnRhaW5lcjsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQllbHNlCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlmQnVmZmVyZWRDb250ZXh0ID0gZl9jb250ZXh0OwotCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCQlsZW5ndGggKz0gZkJ1ZmZlcmVkTGVuZ3RoOwotCQl9Ci0JCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJCS8vIEVPRgotCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJZlRva2VuQ291bnQrKzsKLQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcigpewotCQlzdXBlcigpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCQl0aGlzKG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCAwKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgewotCQlyZXNldChpbiwgMCk7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kICoKLQkgKgotCSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3BlcwotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0JICoKLQkgKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLQkgKiBhZGRlZC4gIFRob3NlIGNvZGUgYmxvY2tzIHdlcmUgdW5kZXIgdGhlIGFib3ZlIGNvcHlyaWdodC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXl5X3N0YXRlID0gMDsKLQkKLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQkKLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfY3VycmVudFBvcyA9IDA7Ci0JCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCQotCQkvKiogCi0JCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkgKiBmcm9tIGlucHV0IAotCQkgKi8KLQkJeXlfZW5kUmVhZCA9IDA7Ci0JCi0JCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWxpbmUgPSAwOwotCQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQkKLQkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl5eV9hdEVPRiA9IGZhbHNlOwotCQotCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQkKLQkKLQkJLyogdXNlciB2YXJzOiAqLwotCQlmVG9rZW5Db3VudCA9IDA7Ci0JIAotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQlmQnVmZmVyZWRTdGFydCA9IDE7Ci0JCWZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JCi0JCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0gLTE7Ci0JCi0JCWNvbnRleHQgPSBudWxsOwotCQlzdGFydCA9IDA7Ci0JCXRleHRMZW5ndGggPSAwOwotCQlsZW5ndGggPSAwOwotCQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkKLQkJZkVMbGV2ZWwgPSAwOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqCi0JICovCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgewotCQlKU1BUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgSlNQVG9rZW5pemVyKCk7Ci0JCS8vIGdsb2JhbCB0YWdtYXJrZXJzIGNhbiBiZSBzaGFyZWQ7IHRoZXkgaGF2ZSBubyBzdGF0ZSBhbmQgCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgYmxvY2tNYXJrZXIgPSAoQmxvY2tNYXJrZXIpIGZCbG9ja01hcmtlcnMuZ2V0KGkpOwotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7Ci0JCX0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZOZXN0YWJsZVByZWZpeGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcikgZk5lc3RhYmxlUHJlZml4ZXMuZ2V0KGkpOwotCQkJaWYobWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkTmVzdGFibGVQcmVmaXgobWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhbkpTUENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gU2NhbiBmb3IgJy0tJT4nIGFuZCByZXR1cm4gdGhlIHRleHQgdXAgdG8gdGhhdCBwb2ludCBhcwotCQkvLyAgIEpTUF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX0pTUF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JCS8vICBjb250ZXh0IGFzIHVzdWFsLgotCQlyZXR1cm4gZG9TY2FuKCItLSU+IiwgZmFsc2UsIGZhbHNlLCB0cnVlLCBKU1BfQ09NTUVOVF9URVhULCBTVF9KU1BfQ09NTUVOVF9FTkQsIFNUX0pTUF9DT01NRU5UX0VORCk7Ci0JfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbMjk1ODBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDczNDYpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzc2KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0gICAgeXlfcHVzaGJhY2tQb3MgPSAtMTsKLSAgICBib29sZWFuIHl5X3dhc19wdXNoYmFjazsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIGJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfY3VycmVudFBvcysrKSB7Ci0gICAgICAgIHN3aXRjaCAoeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdKSB7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB5eV9jb3VudGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh5eV9jb3VudGVkKQotICAgICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfY291bnRlZCkgewotICAgICAgICBpZiAoIHl5X2FkdmFuY2UoKSA9PSAnXG4nICkgeXlsaW5lLS07Ci0gICAgICAgIGlmICggIXl5X2F0RU9GICkgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0gICAgICB5eV93YXNfcHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgeXlfZm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDAgKQotICAgICAgICAgICAgeXlfcHVzaGJhY2tQb3MgPSB5eV9jdXJyZW50UG9zOwotCi0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X3dhc19wdXNoYmFjayA9ICh5eV9hdHRyaWJ1dGVzICYgNCkgPiAwOwotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV93YXNfcHVzaGJhY2spCi0gICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDU5OTogCi0gICAgICAgIGNhc2UgNjA0OiAKLSAgICAgICAgY2FzZSA2MTE6IAotICAgICAgICBjYXNlIDYxNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwIGRpcmVjdGl2ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBKU1BfRElSRUNUSVZFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDYzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTYzOiAKLSAgICAgICAgY2FzZSA1NjU6IAotICAgICAgICBjYXNlIDU2NjogCi0gICAgICAgIGNhc2UgNTY3OiAKLSAgICAgICAgY2FzZSA1Njg6IAotICAgICAgICBjYXNlIDU2OTogCi0gICAgICAgIGNhc2UgNTcwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOwotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNjMzOiBicmVhazsKLSAgICAgICAgY2FzZSA1NTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImpzcDpyb290IHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ST09UX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDU0NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDYzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjM2OiBicmVhazsKLSAgICAgICAgY2FzZSA1NDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDUzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSA2Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDUzMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOwotIH0KLSAgICAgICAgY2FzZSA2Mzk6IGJyZWFrOwotICAgICAgICBjYXNlIDUyNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTAxOiAKLSAgICAgICAgY2FzZSA1NDA6IAotICAgICAgICBjYXNlIDU0MTogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQxOiBicmVhazsKLSAgICAgICAgY2FzZSA0OTE6IAotICAgICAgICBjYXNlIDUzNjogCi0gICAgICAgIGNhc2UgNTM3OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkpTUCBjb21tZW50IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gSlNQX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY0MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDcwOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlZCTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JZkVMbGV2ZWwrKzsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQ0OiBicmVhazsKLSAgICAgICAgY2FzZSA0Njk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiRUwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JZkVMbGV2ZWwrKzsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DSEFSX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjQ2OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTU1FTlRfVEVYVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQ09NTUVOVDsKLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNjQ3OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjA6IAotICAgICAgICBjYXNlIDQ3ODogCi0gICAgICAgIGNhc2UgNDgxOiAKLSAgICAgICAgY2FzZSA0ODQ6IAotICAgICAgICBjYXNlIDQ4NTogCi0gICAgICAgIGNhc2UgNDg3OiAKLSAgICAgICAgY2FzZSA0ODk6IAotICAgICAgICBjYXNlIDQ5MjogCi0gICAgICAgIGNhc2UgNDk0OiAKLSAgICAgICAgY2FzZSA0OTU6IAotICAgICAgICBjYXNlIDQ5NzogCi0gICAgICAgIGNhc2UgNDk5OiAKLSAgICAgICAgY2FzZSA1MDI6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGNvbW1lbnQgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soNCk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgIHsKLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0NPTU1FTlRfT1BFTiwgSlNQX0NPTU1FTlRfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOwotCQkvLyB0aGUgY29tbWVudCBjb250YWluZXIgaXRzZWxmIHdpbGwgYWN0IGFzIGNvbW1lbnQgdGV4dAotCQlmRW1iZWRkZWRIaW50ID0gSlNQX0NPTU1FTlRfVEVYVDsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvKgotCQkgKiByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnM7IG1hcmsgdGhpcyBvbmUgYXMgYQotCQkgKiBjb21tZW50IHNvIGl0IHdpbGwgYmUgb3RoZXJ3aXNlIGlnbm9yZWQgYnV0IHByZXNlcnZlZCAod2hpY2ggaXMgd2h5Ci0JCSAqIHdlIGNhbid0IHVzZSB3aGl0ZS1zcGFjZSkKLQkJICovCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NDg6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjQ5OiBicmVhazsKLSAgICAgICAgY2FzZSAzODE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjUwOiBicmVhazsKLSAgICAgICAgY2FzZSAzODA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NTE6IGJyZWFrOwotICAgICAgICBjYXNlIDM3OTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAyKTsKLQlmRUxsZXZlbCsrOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIEpTUF9WQkxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY1MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfUEVfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2NTM6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOwotCWZFTGxldmVsKys7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBKU1BfRUxfQ0xPU0UpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY1NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY4OiAKLSAgICAgICAgY2FzZSA0MDY6IAotICAgICAgICBjYXNlIDQxMzogCi0gICAgICAgIGNhc2UgNDE5OiAKLSAgICAgICAgY2FzZSA0MjM6IAotICAgICAgICBjYXNlIDQyNzogCi0gICAgICAgIGNhc2UgNDMxOiAKLSAgICAgICAgY2FzZSA0MzY6IAotICAgICAgICBjYXNlIDQ0MTogCi0gICAgICAgIGNhc2UgNDQ0OiAKLSAgICAgICAgY2FzZSA0NDg6IAotICAgICAgICBjYXNlIDQ1MjogCi0gICAgICAgIGNhc2UgNDU3OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBleHByZXNzaW9uIGJlZ3VuIChhbnl3aGVyZSkKLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQotCSAqICBpbmNvbWluZyBzdGF0ZSBtdXN0IGJlIGNoZWNrZWQgdG8gc2VlIGlmIGl0J3MgZXJyb25lb3VzCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQKLQkgKi8KLQkvLyBiZWdpbiBzYW5pdHkgY2hlY2tzCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7Ci0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19TQ0FOKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLQl9Ci0JLy8gZW5kIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGFuIGV4cHJlc3Npb24gb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9FWFBSRVNTSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRVhQUkVTU0lPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NTY6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NzogCi0gICAgICAgIGNhc2UgNDA1OiAKLSAgICAgICAgY2FzZSA0MTI6IAotICAgICAgICBjYXNlIDQxODogCi0gICAgICAgIGNhc2UgNDIyOiAKLSAgICAgICAgY2FzZSA0MjY6IAotICAgICAgICBjYXNlIDQzMDogCi0gICAgICAgIGNhc2UgNDM1OiAKLSAgICAgICAgY2FzZSA0NDA6IAotICAgICAgICBjYXNlIDQ0MzogCi0gICAgICAgIGNhc2UgNDQ3OiAKLSAgICAgICAgY2FzZSA0NTE6IAotICAgICAgICBjYXNlIDQ1NjogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgZGVjbGFyYXRpb24gYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSBkZWNsYXJhdGlvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9ERUNMQVJBVElPTl9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9ERUNMQVJBVElPTl9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDM2NjogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJcmV0dXJuIEpTUF9ESVJFQ1RJVkVfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RJUkVDVElWRV9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0RJUkVDVElWRV9DTE9TRSwgSlNQX0NMT1NFfSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY1ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzU2OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzUyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzUwOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX1ZCTF9PUEVOOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjYxOiBicmVhazsKLSAgICAgICAgY2FzZSAzNDA6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFU19FTkQpOwotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM2OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NjM6IGJyZWFrOwotICAgICAgICBjYXNlIDMzNDogCi0gICAgICAgICAgeyAKLQkvL1N5c3RlbS5vdXQucHJpbnRsbihKU1BfRUxfQ09OVEVOVCsgIjpbIiArIHl5dGV4dCgpICsgIl0iKTsKLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMzOiAKLSAgICAgICAgICB7IAotCWZFTGxldmVsKys7Ci0JaWYoZkVMbGV2ZWwgPT0gMSkgewotCQlyZXR1cm4gSlNQX0VMX09QRU47Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NjU6IGJyZWFrOwotICAgICAgICBjYXNlIDMzMDogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY2OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjk6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBFTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY3OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjc6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9WQkwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI2OiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfRUwpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIHNpbmdsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgRUwKLQlpZihmRW1iZWRkZWRDb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKS5lcXVhbHMoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCX0KLQllbHNlIHsKLQkJeXliZWdpbihlbnRlclN0YXRlKTsKLQl9Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI1OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGVuZCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX0VORF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjcwOiBicmVhazsKLSAgICAgICAgY2FzZSAyODQ6IAotICAgICAgICBjYXNlIDI5NjogCi0gICAgICAgIGNhc2UgMzAyOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7Ci0gfQotICAgICAgICBjYXNlIDY3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcyOiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCS8qCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8KLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDY3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgICB7IAotCVN0cmluZyB0YWdOYW1lID0geXl0ZXh0KCkuc3Vic3RyaW5nKDEpOwotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldAotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOwotCS8qCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4KLQkgKi8KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsKLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCQlyZXR1cm4gWE1MX1RBR19PUEVOOwotCX0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluIHBsYWNlIG9mIGF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCS8vIGVtYmVkZGVkIGNvbnRhaW5lciBzaG91bGQgYmUgbG9va2luZyBmb3IgdGhlIG5hbWUgKGFnYWluKSBuZXh0Ci0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShYTUxfVEFHX09QRU4sIHRhZ05hbWUpOyAvLyA/Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjczOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggZG91YmxlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjc1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIHRhZyBlbWJlZGRlZCBuYW1lIHN0YXJ0IC0gc3RhcnQgdGFnIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjc2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjI6IAotICAgICAgICBjYXNlIDEyNzogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAyNzQ6IAotICAgICAgICBjYXNlIDI3ODogCi0gICAgICAgIGNhc2UgMjc5OiAKLSAgICAgICAgY2FzZSAzODc6IAotICAgICAgICBjYXNlIDM5MDogCi0gICAgICAgIGNhc2UgNDY4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA2Nzc6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjc5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgY2FzZSAyNjk6IAotICAgICAgICBjYXNlIDM4NjogCi0gICAgICAgIGNhc2UgNDY3OiAKLSAgICAgICAgY2FzZSA1MDY6IAotICAgICAgICBjYXNlIDUwNzogCi0gICAgICAgIGNhc2UgNTI1OiAKLSAgICAgICAgY2FzZSA1MjY6IAotICAgICAgICBjYXNlIDU0MzogCi0gICAgICAgIGNhc2UgNTQ0OiAKLSAgICAgICAgY2FzZSA1NTY6IAotICAgICAgICBjYXNlIDU2NDogCi0gICAgICAgIGNhc2UgNTcxOiAKLSAgICAgICAgY2FzZSA1NzI6IAotICAgICAgICBjYXNlIDU3MzogCi0gICAgICAgIGNhc2UgNTc0OiAKLSAgICAgICAgY2FzZSA1NzY6IAotICAgICAgICBjYXNlIDU4MjogCi0gICAgICAgIGNhc2UgNTgzOiAKLSAgICAgICAgY2FzZSA1ODQ6IAotICAgICAgICBjYXNlIDU4NTogCi0gICAgICAgIGNhc2UgNTg2OiAKLSAgICAgICAgY2FzZSA1OTI6IAotICAgICAgICBjYXNlIDU5MzogCi0gICAgICAgIGNhc2UgNTk0OiAKLSAgICAgICAgY2FzZSA1OTU6IAotICAgICAgICBjYXNlIDU5NjogCi0gICAgICAgIGNhc2UgNjAyOiAKLSAgICAgICAgY2FzZSA2MDM6IAotICAgICAgICBjYXNlIDYwNTogCi0gICAgICAgIGNhc2UgNjA2OiAKLSAgICAgICAgY2FzZSA2MTI6IAotICAgICAgICBjYXNlIDYxMzogCi0gICAgICAgIGNhc2UgNjE0OiAKLSAgICAgICAgY2FzZSA2MTU6IAotICAgICAgICBjYXNlIDYyMTogCi0gICAgICAgIGNhc2UgNjIyOiAKLSAgICAgICAgY2FzZSA2MjM6IAotICAgICAgICBjYXNlIDYyNDogCi0gICAgICAgIGNhc2UgNjI3OiAKLSAgICAgICAgY2FzZSA2Mjg6IAotICAgICAgICBjYXNlIDYzMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2ODA6IGJyZWFrOwotICAgICAgICBjYXNlIDExNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0JCWZFbWJlZGRlZEhpbnQgPSBnZXRCbG9ja01hcmtlckNvbnRleHQoKTsKLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQkxPQ0tfVEFHX1NDQU47Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjgxOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMjY0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2ODM6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSk7Ci0JcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg1OiBicmVhazsKLSAgICAgICAgY2FzZSA5ODogCi0gICAgICAgIGNhc2UgOTk6IAotICAgICAgICBjYXNlIDEwMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gZG9TY2FuKCIlPiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIEpTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQpOwotIH0KLSAgICAgICAgY2FzZSA2ODY6IGJyZWFrOwotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTc6IAotICAgICAgICBjYXNlIDI1NDogCi0gICAgICAgIGNhc2UgMjU1OiAKLSAgICAgICAgY2FzZSAyNTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNjg4OiBicmVhazsKLSAgICAgICAgY2FzZSA5MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg5OiBicmVhazsKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2OTA6IGJyZWFrOwotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgMjQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2OTI6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICBjYXNlIDIwMTogCi0gICAgICAgIGNhc2UgMjA0OiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDIxNTogCi0gICAgICAgIGNhc2UgMjE4OiAKLSAgICAgICAgY2FzZSAyMTk6IAotICAgICAgICBjYXNlIDM2MTogCi0gICAgICAgIGNhc2UgMzY0OiAKLSAgICAgICAgY2FzZSA0Mzk6IAotICAgICAgICBjYXNlIDQ1MDogCi0gICAgICAgIGNhc2UgNDU1OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDE3OTogCi0gICAgICAgIGNhc2UgMTgwOiAKLSAgICAgICAgY2FzZSAxODM6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMTk0OiAKLSAgICAgICAgY2FzZSAxOTc6IAotICAgICAgICBjYXNlIDE5ODogCi0gICAgICAgIGNhc2UgMzMxOiAKLSAgICAgICAgY2FzZSAzNDU6IAotICAgICAgICBjYXNlIDM0ODogCi0gICAgICAgIGNhc2UgNDE2OiAKLSAgICAgICAgY2FzZSA0MTc6IAotICAgICAgICBjYXNlIDQyOTogCi0gICAgICAgIGNhc2UgNDM0OiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgY2FzZSAxNjA6IAotICAgICAgICBjYXNlIDMyMjogCi0gICAgICAgIGNhc2UgNDExOiAKLSAgICAgICAgY2FzZSA0MTQ6IAotICAgICAgICBjYXNlIDQ4MjogCi0gICAgICAgIGNhc2UgNTE0OiAKLSAgICAgICAgY2FzZSA1MzM6IAotICAgICAgICBjYXNlIDU0OTogCi0gICAgICAgIGNhc2UgNTU4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICBjYXNlIDE1MjogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAzMTI6IAotICAgICAgICBjYXNlIDQwNDogCi0gICAgICAgIGNhc2UgNDA3OiAKLSAgICAgICAgY2FzZSA0Nzk6IAotICAgICAgICBjYXNlIDUxMzogCi0gICAgICAgIGNhc2UgNTMyOiAKLSAgICAgICAgY2FzZSA1NDg6IAotICAgICAgICBjYXNlIDU1NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCktMSk7Ci0JCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQl9Ci0JeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDEwNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDY5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICBjYXNlIDE3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk5OiBicmVhazsKLSAgICAgICAgY2FzZSAwOiAKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgY2FzZSAyMjY6IAotICAgICAgICBjYXNlIDIyODogCi0gICAgICAgIGNhc2UgMjI5OiAKLSAgICAgICAgY2FzZSAyMzE6IAotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgIGNhc2UgMzcxOiAKLSAgICAgICAgY2FzZSAzNzI6IAotICAgICAgICBjYXNlIDM3MzogCi0gICAgICAgIGNhc2UgNDYzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzAwOiBicmVhazsKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgMTAxOiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDExOTogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDcwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDk1OiAKLSAgICAgICAgY2FzZSAxMDM6IAotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDEzMjogCi0gICAgICAgIGNhc2UgMTMzOiAKLSAgICAgICAgY2FzZSAxMzQ6IAotICAgICAgICBjYXNlIDEzNjogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMTQxOiAKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICBjYXNlIDE0NTogCi0gICAgICAgIGNhc2UgMTQ2OiAKLSAgICAgICAgY2FzZSAxNDk6IAotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgIGNhc2UgMTUxOiAKLSAgICAgICAgY2FzZSAxNTY6IAotICAgICAgICBjYXNlIDE1NzogCi0gICAgICAgIGNhc2UgMTU4OiAKLSAgICAgICAgY2FzZSAxNjQ6IAotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxNzM6IAotICAgICAgICBjYXNlIDE3NzogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxODU6IAotICAgICAgICBjYXNlIDE4NjogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxODk6IAotICAgICAgICBjYXNlIDE5NTogCi0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIwNzogCi0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgY2FzZSAyMTA6IAotICAgICAgICBjYXNlIDIxNjogCi0gICAgICAgIGNhc2UgMjIwOiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJU3lzdGVtLm91dC5wcmludGxuKCIhISF1bmV4cGVjdGVkISEhOiBcIiIgKyB5eXRleHQoKSArICJcIjoiICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDcwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCVN0cmluZyByZXR1cm5lZENvbnRleHQgPSBkb1NjYW4oIl1dPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5ELCAgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYocmV0dXJuZWRDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIHJldHVybmVkQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgNzAzOiBicmVhazsKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgMTg3OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgNzA1OiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMzgzOiAKLSAgICAgICAgY2FzZSA0NjY6IAotICAgICAgICBjYXNlIDUwNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzA2OiBicmVhazsKLSAgICAgICAgY2FzZSA3NzogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA3MDc6IGJyZWFrOwotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICAgIHsgCi0JCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQKLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgNzA4OiBicmVhazsKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDk6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggc2luZ2xlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDcxMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3MTE6IGJyZWFrOwotICAgICAgICBjYXNlIDEzNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQpOwotCXJldHVybiBYTUxfRE9DVFlQRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MTI6IGJyZWFrOwotICAgICAgICBjYXNlIDEzODogCi0gICAgICAgIGNhc2UgMTQyOiAKLSAgICAgICAgY2FzZSAyODk6IAotICAgICAgICBjYXNlIDI5MzogCi0gICAgICAgIGNhc2UgMzk5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDcxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQzOiAKLSAgICAgICAgY2FzZSAxNDc6IAotICAgICAgICBjYXNlIDI5OTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotIH0KLSAgICAgICAgY2FzZSA3MTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE0ODogCi0gICAgICAgIGNhc2UgMzA1OiAKLSAgICAgICAgY2FzZSAzMDk6IAotICAgICAgICBjYXNlIDQwMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcxNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcxNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU1OiAKLSAgICAgICAgY2FzZSAzMTU6IAotICAgICAgICBjYXNlIDMxOTogCi0gICAgICAgIGNhc2UgNDA5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MTc6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcxODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgY2FzZSAxNjY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDcxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY4OiAKLSAgICAgICAgY2FzZSAxNzQ6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSA3MjA6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWludCBpbmNvbWluZ1N0YXRlID0geXlzdGF0ZSgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBpbnNpZGUgb2YgSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsKLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7Ci0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0gfQotICAgICAgICBjYXNlIDcyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTcxOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc2OiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcyMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX0RRVU9URVMpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzI1OiBicmVhazsKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwtLTsKLQlpZihmRUxsZXZlbCA9PSAwKSB7Ci0JCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJcmV0dXJuIEpTUF9FTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MjY6IGJyZWFrOwotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTCk7Ci0JcmV0dXJuIEpTUF9FTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzI5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVMpOwotCXJldHVybiBKU1BfVkJMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzMwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDM6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVMpOwotCXJldHVybiBKU1BfVkJMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzMxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDU6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwtLTsKLQlpZihmRUxsZXZlbCA9PSAwKSB7Ci0JCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJcmV0dXJuIEpTUF9WQkxfQ0xPU0U7Ci0JfQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDczMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MzM6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkwpOwotCXJldHVybiBKU1BfVkJMX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzM0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTc6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDczNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmVuZCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX0VORF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzM2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3Mzc6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMzogCi0gICAgICAgIGNhc2UgMjM0OiAKLSAgICAgICAgY2FzZSAzMTE6IAotICAgICAgICBjYXNlIDMyMTogCi0gICAgICAgIGNhc2UgMzMyOiAKLSAgICAgICAgY2FzZSAzMzc6IAotICAgICAgICBjYXNlIDM0MTogCi0gICAgICAgIGNhc2UgMzQ0OiAKLSAgICAgICAgY2FzZSAzNDc6IAotICAgICAgICBjYXNlIDM0OTogCi0gICAgICAgIGNhc2UgMzUzOiAKLSAgICAgICAgY2FzZSAzNTc6IAotICAgICAgICBjYXNlIDM2MDogCi0gICAgICAgIGNhc2UgMzYzOiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMSk7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1Agc2NyaXB0bGV0IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1NDUklQVExFVF9PUEVOLCBKU1BfQ0xPU0UpOwotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JCX0KLQkJLy8gcmVxdWlyZWQgaGVscCBmb3Igc3VjY2Vzc2l2ZSBlbWJlZGRlZCByZWdpb25zCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQkJfQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JCX0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7Ci0JfQotIH0KLSAgICAgICAgY2FzZSA3Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgICAgeyAKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX09QRU47Ci0gfQotICAgICAgICBjYXNlIDczOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQxOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0JCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDc0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgZW5kIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIEpTUF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQ0OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjI6IAotICAgICAgICBjYXNlIDE2MzogCi0gICAgICAgICAgeyAKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JIH0KLSAgICAgICAgY2FzZSA3NDU6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHl5X2RvX2VvZigpOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwZjAwOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIEpTUCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkpOwotCi0JCS8vIGNvbXBpbGVyL3ZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRCb29sZWFuKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCB0cnVlKTsKLQotCQkvLyBjb2RlIGdlbmVyYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RW5jID0gIklTTy04ODU5LTEiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN5c3RlbUVuYyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiZmlsZS5lbmNvZGluZyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChzeXN0ZW1FbmMgIT0gbnVsbCkgewotCQkJZGVmYXVsdEVuYyA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRQcmVmZXJyZWREZWZhdWx0SWFuYU5hbWUoc3lzdGVtRW5jLCAiSVNPLTg4NTktMSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZGVmYXVsdEVuYyk7Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoaXMgY291bGQgYmUgbWFkZSBzbWFydGVyIGJ5IGFjdHVhbGx5IGxvb2tpbmcgdXAgdGhlIGNvbnRlbnQKLQkJLy8gdHlwZSdzIHZhbGlkIGV4dGVuc2lvbnMKLQkJbm9kZS5wdXQoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgImpzcCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhNDQwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBKU1AgY29yZQotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBKU1BDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEpTUCBGaWxlCi0JICogV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBKU1AgZnJhZ21lbnRzIHNob3VsZCBiZSBjb21waWxlZC92YWxpZGF0ZWQuIEpTUCBmcmFnbWVudHMKLQkgKiB3aWxsIGJlIHZhbGlkYXRlZCB3aGVuIHRydWUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVEVfRlJBR01FTlRTID0gInZhbGlkYXRlRnJhZ21lbnRzIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDExTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDExTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMTc5YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9KU1AxMU5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLS8qKgotICogSlNQIDEuMSBOYW1lc3BhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBKU1AxMU5hbWVzcGFjZSB7Ci0KLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbGVtZW50TmFtZSB7Ci0JCS8vIEVsZW1lbnQgbmFtZXMKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUTEVUID0gImpzcDpzY3JpcHRsZXQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT04gPSAianNwOmV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ0xBUkFUSU9OID0gImpzcDpkZWNsYXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1BBR0UgPSAianNwOmRpcmVjdGl2ZS5wYWdlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfSU5DTFVERSA9ICJqc3A6ZGlyZWN0aXZlLmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9UQUdMSUIgPSAianNwOmRpcmVjdGl2ZS50YWdsaWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRUJFQU4gPSAianNwOnVzZUJlYW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFBST1BFUlRZID0gImpzcDpzZXRQcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUUFJPUEVSVFkgPSAianNwOmdldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFID0gImpzcDppbmNsdWRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEID0gImpzcDpmb3J3YXJkIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU4gPSAianNwOnBsdWdpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU1TID0gImpzcDpwYXJhbXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZBTExCQUNLID0gImpzcDpmYWxsYmFjayI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFSQU0gPSAianNwOnBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UID0gImpzcDpyb290IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gImpzcDp0ZXh0IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUDExX1VSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1RBR19QUkVGSVggPSAianNwIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSBuYW1lcwotCS8vICAgZGlyZWN0aXZlLnBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VYVEVORFMgPSAiZXh0ZW5kcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTVBPUlQgPSAiaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRVNTSU9OID0gInNlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JVRkZFUiA9ICJidWZmZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FVVE9GTFVTSCA9ICJhdXRvRmx1c2giOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lTX1RIUkVBRF9TQUZFID0gImlzVGhyZWFkU2FmZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSU5GTyA9ICJpbmZvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FUlJPUl9QQUdFID0gImVycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfRVJST1JfUEFHRSA9ICJpc0Vycm9yUGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFHRV9FTkNPRElORyA9ICJwYWdlRW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUuaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9GSUxFID0gImZpbGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBkaXJlY3RpdmUudGFnbGliCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1VSSSA9ICJ1cmkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BSRUZJWCA9ICJwcmVmaXgiOyAvLyROT04tTkxTLTEkCi0JLy8gICB1c2VCZWFuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ09QRSA9ICJzY29wZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JFQU5fTkFNRSA9ICJiZWFuTmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgc2V0UHJvcGVydHkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMVUUgPSAidmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBUkFNID0gInBhcmFtIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgaW5jbHVkZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFID0gInBhZ2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZMVVNIID0gImZsdXNoIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcGx1Z2luCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERUJBU0UgPSAiY29kZWJhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gImFsaWduIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BUkNISVZFID0gImFyY2hpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9ICJoZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9ICJoc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0pSRVZFUlNJT04gPSAianJldmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVlNQQUNFID0gInZzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfV0lEVEggPSAid2lkdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05TUExVR0lOVVJMID0gIm5zcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRVBMVUdJTlVSTCA9ICJpZXBsdWdpbnVybCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHJvb3QKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfWE1MTlNfSlNQID0gInhtbG5zOmpzcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkVSU0lPTiA9ICJ2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCS8vIGF0dHJpYnV0ZSB2YWx1ZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCA9ICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI7Ly9EMTk1MzY2IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JVRlNJWl9ERUZBVUxUID0gIjhrYiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JFUVVFU1QgPSAicmVxdWVzdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQkVBTiA9ICJiZWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTEVUID0gImFwcGxldCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JJR0hUID0gInJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSlZFUjExID0gIjEuMSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1hNTE5TX0pTUCA9ICJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTJOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMTJOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI0YjI0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDEyTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBOYW1lcyBmb3IgSlNQIDEuMiBzcGVjLgotICogQ3VycmVudGx5LCBpdCBpcyBqdXN0IHRoZSBzYW1lIGFzIEpTUDExTmFtZXNwYWNlIGluIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBKU1AxMk5hbWVzcGFjZSBleHRlbmRzIEpTUDExTmFtZXNwYWNlIHsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSlNQMjBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg1MmM0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0pTUDIwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBOZXcgbmFtZXMgZm9yIEpTUCAyLjAgc3BlYy4KLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDIwTmFtZXNwYWNlIGV4dGVuZHMgSlNQMTJOYW1lc3BhY2UgewotCS8qKgotCSAqIE5ldyBlbGVtZW50cyBmb3IgSlNQIDIuMCBzcGVjLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIGV4dGVuZHMgSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUgewotCQlTdHJpbmcgRElSRUNUSVZFX1RBRyA9ICJqc3A6ZGlyZWN0aXZlLnRhZyI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIERJUkVDVElWRV9BVFRSSUJVVEUgPSAianNwOmRpcmVjdGl2ZS5hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBESVJFQ1RJVkVfVkFSSUFCTEUgPSAianNwOmRpcmVjdGl2ZS52YXJpYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NjE1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JKU1AgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfSlNQID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX0pTUEZSQUdNRU5UID0gZ2V0RnJhZ21lbnRDb25zdGFudFN0cmluZygpOwotCi0JLyoqCi0JICogRG9uJ3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLQkgKi8KLQlwcml2YXRlIENvbnRlbnRUeXBlSWRGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGdldEZyYWdtZW50Q29uc3RhbnRTdHJpbmcoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGZyYWdtZW50c291cmNlIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjg5ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9JQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29kZWRSZXNvdXJjZVBsdWdpbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AgewotCS8qKgotCSAqIEV4dHJhIHByb3BlcnRpZXMgYXMgcGFydCBvZiBDb250ZW50RGVzY3JpcHRpb24sIGlmIHRoZSBjb250ZW50IGlzIEpTUC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgQ09OVEVOVF9UWVBFX0FUVFJJQlVURSA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiY29udGVudFR5cGVBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBMQU5HVUFHRV9BVFRSSUJVVEUgPSBuZXcgUXVhbGlmaWVkTmFtZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCwgImxhbmd1YWdlQXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgQ09OVEVOVF9GQU1JTFlfQVRUUklCVVRFID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJjb250ZW50RmFtaWx5QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQ7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUpTUFBhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUpTUFBhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3OWUzYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lKU1BQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBmb3IgSlNQLgotICogQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQGRlcHJlY2F0ZWQgdXNlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklKU1BQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUFBhcnRpdGlvblR5cGVzIHsKLQotCVN0cmluZyBKU1BfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkRFRkFVTFRfSlNQIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCQotCVN0cmluZyBKU1BfU0NSSVBUX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLlNDUklQVC4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0RFTElNSVRFUiA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkRFTElNSVRFUiI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTlRFTlRfSkFWQSA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpBVkEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0pBVkFTQ1JJUFQgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKQVZBU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfREVGQVVMVF9FTCA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpTUF9FTCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0RFRkFVTFRfRUwyID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSlNQX0VMMiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgSlNQX0RJUkVDVElWRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3JlZ2lvbnMvRE9NSlNQUmVnaW9uQ29udGV4dHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01KU1BSZWdpb25Db250ZXh0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGFhMjAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01KU1BSZWdpb25Db250ZXh0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgRE9NSlNQUmVnaW9uQ29udGV4dHMgZXh0ZW5kcyBET01SZWdpb25Db250ZXh0IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ0xPU0UgPSAiSlNQX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX0NMT1NFID0gIkpTUF9DT01NRU5UX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX1RFWFQgPSAiSlNQX0NPTU1FTlRfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT05URU5UID0gIkpTUF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfQ0xPU0UgPSAiSlNQX0RJUkVDVElWRV9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX05BTUUgPSAiSlNQX0RJUkVDVElWRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRUxfQ0xPU0UgPSAiSlNQX0VMX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9DT05URU5UID0gIkpTUF9FTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9EUVVPVEUgPSAiSlNQX0VMX0RRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9PUEVOID0gIkpTUF9FTF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FTF9RVU9URURfQ09OVEVOVCA9ICJKU1BfRUxfUVVPVEVEX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VMX1NRVU9URSA9ICJKU1BfRUxfU1FVT1RFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ST09UX1RBR19OQU1FID0gIkpTUF9ST09UX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX0NMT1NFID0gIkpTUF9WQkxfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1ZCTF9DT05URU5UID0gIkpTUF9WQkxfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX0RRVU9URSA9ICJKU1BfVkJMX0RRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX09QRU4gPSAiSlNQX1ZCTF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQgPSAiSlNQX1ZCTF9RVU9URURfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVkJMX1NRVU9URSA9ICJKU1BfVkJMX1NRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUgPSAiWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFID0gIlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkNsYXNzTG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJDbGFzc0xvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODIzYjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkNsYXNzTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0KLS8qKgotICogQ3VzdG9tIGNsYXNzbG9hZGVyIHdoaWNoIGFsbG93cyB5b3UgdG8gYWRkIHNvdXJjZSBkaXJlY3RvcmllcyAoZm9sZGVycwotICogY29udGFpbmluZyAuY2xhc3MgZmlsZXMpIGFuZCBqYXJzIHRvIHRoZSBjbGFzc3BhdGguCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZSA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvZGVidWcvdGFnbGliY2xhc3Nsb2FkZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBMaXN0IGphcnNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgTGlzdCBkaXJzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIExpc3QgdXNlZEphcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBMaXN0IHVzZWREaXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJpdmF0ZSBNYXAgZmFpbGVkQ2xhc3NlcyA9IG5ldyBIYXNoTWFwKCk7IC8vIENMOiBhZGRlZCB0byBvcHRpbWl6ZQotCQkJCQkJCQkJCQkJCS8vIGZhaWxlZCBsb2FkaW5nCi0KLQkvLyBwcml2YXRlIExpc3QgbG9hZGVkQ2xhc3NGaWxlbmFtZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgVGFnbGliQ2xhc3NMb2FkZXIoQ2xhc3NMb2FkZXIgcGFyZW50TG9hZGVyKSB7Ci0JCXN1cGVyKHBhcmVudExvYWRlcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIG5ldyBqYXIgdG8gY2xhc3NwYXRoLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtCi0JICogICAgICAgICAgICBmdWxsIHBhdGggdG8gdGhlIGphciBmaWxlCi0JICovCi0JcHVibGljIHZvaWQgYWRkSmFyKFN0cmluZyBmaWxlbmFtZSkgewotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInRyeWluZyB0byBhZGQ6IFsiICsgZmlsZW5hbWUgKyAiXSB0byBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCS8vIGRvbid0IGFkZCB0aGUgc2FtZSBlbnRyeSB0d2ljZSwgb3Igc2VhcmNoIHRpbWVzIHdpbGwgZ2V0IGV2ZW4gd29yc2UKLQkJaWYgKCFqYXJzTGlzdC5jb250YWlucyhmaWxlbmFtZSkpIHsKLQkJCWphcnNMaXN0LmFkZChmaWxlbmFtZSk7Ci0JCQlmYWlsZWRDbGFzc2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiArIFsiICsgZmlsZW5hbWUgKyAiXSBhZGRlZCB0byBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgamFyIGZyb20gdGhlIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUgLQotCSAqICAgICAgICAgICAgZnVsbCBwYXRoIHRvIHRoZSBqYXIgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUphcihTdHJpbmcgZmlsZW5hbWUpIHsKLQkJamFyc0xpc3QucmVtb3ZlKGZpbGVuYW1lKTsKLQkJZmFpbGVkQ2xhc3NlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVtb3ZlZDogWyIgKyBmaWxlbmFtZSArICJdIGZyb20gY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeShTdHJpbmcgZGlyUGF0aCkgewotCQlpZiAoIWRpcnNMaXN0LmNvbnRhaW5zKGRpclBhdGgpKSB7Ci0JCQlkaXJzTGlzdC5hZGQoZGlyUGF0aCk7Ci0JCQlmYWlsZWRDbGFzc2VzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkOiBbIiArIGRpclBhdGggKyAiXSB0byBjbGFzc3BhdGgiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgZGlyZWN0b3J5IGZyb20gdGhlIGNsYXNzcGF0aC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlyUGF0aCAtCi0JICogICAgICAgICAgICBmdWxsIHBhdGggb2YgdGhlIGRpcmVjdG9yeQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURpcmVjdG9yeShTdHJpbmcgZGlyUGF0aCkgewotCQlkaXJzTGlzdC5yZW1vdmUoZGlyUGF0aCk7Ci0JCWZhaWxlZENsYXNzZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbW92ZWQ6IFsiICsgZGlyUGF0aCArICJdIGZyb20gY2xhc3NwYXRoIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpc3Qgb2YgSkFScyBvbiB0aGlzIGxvYWRlcidzIGNsYXNzcGF0aCB0aGF0IGNvbnRhaW4KLQkgKiBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgLSB0aGUgbGlzdCBvZiBKQVJzCi0JICovCi0JcHVibGljIExpc3QgZ2V0SmFyc0luVXNlKCkgewotCQlyZXR1cm4gdXNlZEphcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgb24gdGhpcyBsb2FkZXIncyBjbGFzc3BhdGggdGhhdCBjb250YWluCi0JICogY2xhc3NlcyB0aGF0IGhhdmUgYmVlbiBsb2FkZWQuCi0JICogCi0JICogQHJldHVybiBMaXN0IC0gdGhlIGxpc3Qgb2YgZGlyZWN0b3JpZXMgKGZ1bGx5LXF1YWxpZmllZCBmaWxlbmFtZQotCSAqICAgICAgICAgU3RyaW5ncykKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXREaXJlY3Rvcmllc0luVXNlKCkgewotCQlyZXR1cm4gdXNlZERpcnM7Ci0JfQotCQotCU1hcCBnZXRGYWlsdXJlcygpIHsKLQkJcmV0dXJuIGZhaWxlZENsYXNzZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgZmlsZW5hbWVzIGZvciBsb29zZSBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBvdXQKLQkgKiBvZiBkaXJlY3Rvcmllcy4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgLSB0aGUgbGlzdCBvZiBjbGFzcyBmaWxlbmFtZXMKLQkgKi8KLQkvLyBwdWJsaWMgTGlzdCBnZXRDbGFzc0ZpbGVuYW1lc0Zyb21EaXJlY3RvcmllcygpIHsKLQkvLyByZXR1cm4gbG9hZGVkQ2xhc3NGaWxlbmFtZXM7Ci0JLy8gfQotCS8qKgotCSAqIFNlYXJjaGVzIGZvciB0aGUgZ2l2ZW4gY2xhc3MgbmFtZSBvbiB0aGUgZGVmaW5lZCBjbGFzc3BhdGggLQotCSAqIGRpcmVjdG9yaWVzIGFyZSBjaGVja2VkIGJlZm9yZSBKQVJzLgotCSAqIAotCSAqIEBwYXJhbSBjbGFzc05hbWUgLQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRvIGZpbmQKLQkgKiBAcmV0dXJuIENsYXNzIC0gdGhlIGxvYWRlZCBjbGFzcwotCSAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgotCSAqLwotCXByb3RlY3RlZCBzeW5jaHJvbml6ZWQgQ2xhc3MgZmluZENsYXNzKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKLQkJQ2xhc3Mgb2xkQ2xhc3MgPSBmaW5kTG9hZGVkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJaWYgKG9sZENsYXNzICE9IG51bGwpIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IFRhZ2xpYkNsYXNzTG9hZGVyICIgKyB0aGlzICsgIiByZXR1cm5pbmcgZXhpc3RpbmcgY2xhc3M6ICIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXJldHVybiBvbGRDbGFzczsKLQkJfQotCQlpZiAoZmFpbGVkQ2xhc3Nlcy5jb250YWluc0tleShjbGFzc05hbWUpKSB7Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBUYWdsaWJDbGFzc0xvYWRlciAiICsgdGhpcyArICIga25vd24gbWlzc2luZyBjbGFzczogIiArIGNsYXNzTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJdGhyb3cgbmV3IENsYXNzTm90Rm91bmRFeGNlcHRpb24oKTsKLQkJfQotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gVGFnbGliQ2xhc3NMb2FkZXIgIiArIHRoaXMgKyAiIGZpbmRpbmcgY2xhc3M6ICIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlDbGFzcyBuZXdDbGFzcyA9IG51bGw7Ci0JCUphckZpbGUgamFyZmlsZSA9IG51bGw7Ci0JCUphckVudHJ5IGVudHJ5ID0gbnVsbDsKLQotCQkvLyBnZXQgdGhlIGNvcnJlY3QgbmFtZSBvZiB0aGUgYWN0dWFsIC5jbGFzcyBmaWxlIHRvIHNlYXJjaCBmb3IKLQkJU3RyaW5nIGZpbGVOYW1lID0gY2FsY3VsYXRlQ2xhc3NGaWxlbmFtZShjbGFzc05hbWUpOwotCQlJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gZmlyc3QgdHJ5IHNlYXJjaGluZyB0aGUgY2xhc3NwYXRoIGRpcmVjdG9yaWVzCi0JCQlJdGVyYXRvciBkaXJzID0gZGlyc0xpc3QuaXRlcmF0b3IoKTsKLQkJCUZpbGUgZjsKLQkJCVN0cmluZyBkaXJOYW1lOwotCQkJU3RyaW5nIGZpbGVUb0ZpbmQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKGRpcnMuaGFzTmV4dCgpKSB7Ci0JCQkJZGlyTmFtZSA9IChTdHJpbmcpIGRpcnMubmV4dCgpOwotCQkJCWZpbGVUb0ZpbmQgPSBkaXJOYW1lICsgIi8iICsgZmlsZU5hbWU7IC8vJE5PTi1OTFMtMSQKLQotCQkJCWYgPSBuZXcgRmlsZShmaWxlVG9GaW5kKTsKLQkJCQlpZiAoZi5leGlzdHMoKSkgewotCQkJCQlzdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKGYpOwotCQkJCQl1c2VkRGlycy5hZGQoZGlyTmFtZSk7Ci0JCQkJCS8vIGxvYWRlZENsYXNzRmlsZW5hbWVzLmFkZChmaWxlVG9GaW5kKTsKLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBhZGRlZCBmaWxlIGZyb20gZGlyOiAiICsgZGlyTmFtZSArICIvIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCi0JCQkJfQotCQkJfQotCi0JCQlpZiAoc3RyZWFtICE9IG51bGwpIHsKLQkJCQkvLyBmb3VuZCBhIGNsYXNzIGZyb20gYSBkaXJlY3RvcnkKLQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZVN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQlieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMjA0OF07Ci0JCQkJd2hpbGUgKHN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCQkJaW50IGFtb3VudFJlYWQgPSBzdHJlYW0ucmVhZChidWZmZXIpOwotCQkJCQlpZihhbW91bnRSZWFkID4gMCkgewotCQkJCQkJYnl0ZVN0cmVhbS53cml0ZShidWZmZXIsIDAsIGFtb3VudFJlYWQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJYnl0ZVtdIGJ5dGVBcnJheSA9IGJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJCQl0cnkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGRlZmluaW5nIG5ld0NsYXNzOiIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld0NsYXNzID0gZGVmaW5lQ2xhc3MoY2xhc3NOYW1lLCBieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5sZW5ndGgpOwotCQkJCQlyZXNvbHZlQ2xhc3MobmV3Q2xhc3MpOwotCQkJCX0KLQkJCQljYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgbG9hZGluZyBURUkgY2xhc3MgIiArIGNsYXNzTmFtZSwgdCk7Ci0KLQkJCQkJLy8gajkgY2FuIGdpdmUgQ2xhc3NDaXJjdWxhcml0eUVycm9yCi0JCQkJCS8vIHBhcmVudCBzaG91bGQgYWxyZWFkeSBoYXZlIHRoZSBjbGFzcyB0aGVuCi0JCQkJCS8vIHRyeSBwYXJlbnQgbG9hZGVyCi0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyBjID0gZ2V0UGFyZW50KCkubG9hZENsYXNzKGNsYXNzTmFtZSk7Ci0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCI+PiBsb2FkZWQ6ICIgKyBjbGFzc05hbWUgKyAiIHdpdGg6ICIgKyBnZXRQYXJlbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJcmV0dXJuIGM7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY25mKSB7Ci0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJY25mLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJfQotCi0JCQlpZiAoc3RyZWFtID09IG51bGwpIHsKLQkJCQkvLyBzdGlsbCBoYXZlbid0IGZvdW5kIHRoZSBjbGFzcywgc28gbm93IHRyeSBzZWFyY2hpbmcgdGhlCi0JCQkJLy8gamFycwotCQkJCS8vIHNlYXJjaCBlYWNoIG9mIHRoZSBqYXJzIHVudGlsIHdlIGZpbmQgYW4gZW50cnkgbWF0Y2hpbmcgdGhlCi0JCQkJLy8gY2xhc3NuYW1lCi0JCQkJSXRlcmF0b3IgamFycyA9IGphcnNMaXN0Lml0ZXJhdG9yKCk7Ci0JCQkJU3RyaW5nIGphck5hbWU7Ci0JCQkJd2hpbGUgKGphcnMuaGFzTmV4dCgpKSB7Ci0JCQkJCWphck5hbWUgPSAoU3RyaW5nKSBqYXJzLm5leHQoKTsKLQotCQkJCQkvLyBtYWtlIHN1cmUgdGhlIGZpbGUgZXhpc3RzIG9yICJuZXcgSmFyRmlsZSgpIiB3aWxsIHRocm93Ci0JCQkJCS8vIGFuIGV4Y2VwdGlvbgotCQkJCQlmID0gbmV3IEZpbGUoamFyTmFtZSk7Ci0JCQkJCWlmICghZi5leGlzdHMoKSkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWphcmZpbGUgPSBuZXcgSmFyRmlsZShqYXJOYW1lKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImJhZCBqYXIgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJaWYgKGphcmZpbGUgPT0gbnVsbCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQllbnRyeSA9IGphcmZpbGUuZ2V0SmFyRW50cnkoZmlsZU5hbWUpOwotCi0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigibG9va2luZyBmb3IgZmlsZW5hbWU6ICIgKyBmaWxlTmFtZSArICIgaW46ICIgKyBqYXJmaWxlLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZm91bmQgdGhlIGVudHJ5OiAiICsgZW50cnkgKyAiIGZvciBmaWxlbmFtZTogIiArIGZpbGVOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkvLyBmb3VuZCB0aGUgY2xhc3MKLQkJCQkJCWlmICghdXNlZEphcnMuY29udGFpbnMoamFyTmFtZSkpIHsKLQkJCQkJCQkvLyBhZGQgdGhlIGphciB0byB0aGUgbGlzdCBvZiBpbi11c2UgamFycwotCQkJCQkJCXVzZWRKYXJzLmFkZChqYXJOYW1lKTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWphcmZpbGUuY2xvc2UoKTsKLQkJCQl9Ci0KLQkJCQlpZiAoZW50cnkgIT0gbnVsbCkgewotCQkJCQkvLyB3ZSd2ZSBmb3VuZCBhbiBlbnRyeSBmb3IgdGhlIGRlc2lyZWQgY2xhc3MKLQkJCQkJc3RyZWFtID0gamFyZmlsZS5nZXRJbnB1dFN0cmVhbShlbnRyeSk7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlsb25nIGJ5dGVMZW5ndGggPSBlbnRyeS5nZXRTaXplKCk7Ci0JCQkJCWxvbmcgdG90YWxCeXRlc1JlYWQgPSAwOwotCQkJCQlpbnQgYnl0ZXNSZWFkOwotCQkJCQlieXRlW10gYnl0ZUJ1ZmZlciA9IG5ldyBieXRlWzEwMDAwXTsKLQkJCQkJd2hpbGUgKHRvdGFsQnl0ZXNSZWFkIDwgYnl0ZUxlbmd0aCkgewotCQkJCQkJYnl0ZXNSZWFkID0gc3RyZWFtLnJlYWQoYnl0ZUJ1ZmZlcik7Ci0JCQkJCQlpZiAoYnl0ZXNSZWFkID09IC0xKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQl0b3RhbEJ5dGVzUmVhZCA9IHRvdGFsQnl0ZXNSZWFkICsgYnl0ZXNSZWFkOwotCQkJCQkJYnl0ZVN0cmVhbS53cml0ZShieXRlQnVmZmVyLCAwLCBieXRlc1JlYWQpOwotCQkJCQl9Ci0KLQkJCQkJYnl0ZVtdIGJ5dGVBcnJheSA9IGJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+IGRlZmluaW5nIG5ld0NsYXNzOiIgKyBjbGFzc05hbWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBkZWZpbmUgdGhlIGNsYXNzIGZyb20gdGhlIGJ5dGUgYXJyYXkKLQkJCQkJCW5ld0NsYXNzID0gZGVmaW5lQ2xhc3MoY2xhc3NOYW1lLCBieXRlQXJyYXksIDAsIGJ5dGVBcnJheS5sZW5ndGgpOwotCQkJCQkJcmVzb2x2ZUNsYXNzKG5ld0NsYXNzKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIGxvYWRpbmcgVEVJIGNsYXNzICIgKyBjbGFzc05hbWUsIHQpOwotCQkJCQkJLy8gajkgY2FuIGdpdmUgQ2xhc3NDaXJjdWxhcml0eUVycm9yCi0JCQkJCQkvLyBwYXJlbnQgc2hvdWxkIGFscmVhZHkgaGF2ZSB0aGUgY2xhc3MgdGhlbgotCi0JCQkJCQkvLyB0cnkgcGFyZW50Ci0JCQkJCQl0cnkgewotCQkJCQkJCUNsYXNzIGMgPSBnZXRQYXJlbnQoKS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKLQkJCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gbG9hZGVkOiAiICsgY2xhc3NOYW1lICsgIiB3aXRoOiAiICsgZ2V0UGFyZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlyZXR1cm4gYzsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNuZikgewotCQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQkJY25mLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCQkJCWZhaWxlZENsYXNzZXMucHV0KGNsYXNzTmFtZSwgY25mKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlzdHJlYW0uY2xvc2UoKTsKLQkJCQkJamFyZmlsZS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoVGhyb3dhYmxlIHQpIHsKLQkJCWZhaWxlZENsYXNzZXMucHV0KGNsYXNzTmFtZSwgdCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCXN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQlpZiAoamFyZmlsZSAhPSBudWxsKSB7Ci0JCQkJCWphcmZpbGUuY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQkJLy8gaW9lLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCS8vIGp1c3QgdHJ5aW5nIHRvIGNsb3NlIGRvd24gYW55d2F5IC0gaWdub3JlCi0JCQl9Ci0JCX0KLQotCQlpZiAobmV3Q2xhc3MgIT0gbnVsbCkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPj4gbG9hZGVkOiAiICsgbmV3Q2xhc3MgKyAiIHdpdGg6ICIgKyB0aGlzKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gbmV3Q2xhc3M7Ci0JCX0KLQotLy8JCWZhaWxlZENsYXNzZXMuYWRkKGNsYXNzTmFtZSk7Ci0JCXRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogUmVwbGFjZXMgJy4nIGluIHRoZSBjbGFzc25hbWUgd2l0aCAnLycgYW5kIGFwcGVuZHMgJy5jbGFzcycgaWYgbmVlZGVkLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHByb3Blcmx5LWZvcm1lZCBjbGFzcyBuYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY2FsY3VsYXRlQ2xhc3NGaWxlbmFtZShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihuYW1lLnJlcGxhY2UoJy4nLCAnLycpKTsKLQkJaWYgKCFuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKCIuY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmYzMGY3NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnQXR0cmlidXRlSW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRGF0YTsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVGFnRXh0cmFJbmZvOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdJbmZvOwotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLnRhZ2V4dC5UYWdMaWJyYXJ5SW5mbzsKLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC50YWdleHQuVmFyaWFibGVJbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aENvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ2xhc3NwYXRoRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuVGFnbGliQ29udHJvbGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UTERDTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5UYWdsaWJUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLlRMREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERWYXJpYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGhlbHBzIGZpbmQgVGFnbGliVmFyaWFibGVzIGluIGEgSlNQIGZpbGUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJIZWxwZXIgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy90YWdsaWJ2YXJzIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgSVByb2plY3QgZlByb2plY3QgPSBudWxsOwotCXByaXZhdGUgVGFnbGliQ2xhc3NMb2FkZXIgZkxvYWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIFNldCBmUHJvamVjdEVudHJpZXMgPSBudWxsOwotCXByaXZhdGUgU2V0IGZDb250YWluZXJFbnRyaWVzID0gbnVsbDsKLQotCXB1YmxpYyBUYWdsaWJIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlzZXRQcm9qZWN0KHByb2plY3QpOwotCQlmUHJvamVjdEVudHJpZXMgPSBuZXcgSGFzaFNldCgpOwotCQlmQ29udGFpbmVyRW50cmllcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhZ1RvQWRkCi0JICogICAgICAgICAgICBpcyB0aGUgbmFtZSBvZiB0aGUgdGFnIHdob3NlIHZhcmlhYmxlcyB3ZSB3YW50Ci0JICogQHBhcmFtIHN0cnVjdHVyZWREb2MKLQkgKiAgICAgICAgICAgIGlzIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IHdoZXJlIHRoZSB0YWcgaXMgZm91bmQKLQkgKiBAcGFyYW0gY3VzdG9tVGFnCi0JICogICAgICAgICAgICBpcyB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuaW5nIHRhZyBmb3IgdGhlIGN1c3RvbQotCSAqICAgICAgICAgICAgdGFnCi0JICovCi0JcHVibGljIFRhZ2xpYlZhcmlhYmxlW10gZ2V0VGFnbGliVmFyaWFibGVzKFN0cmluZyB0YWdUb0FkZCwgSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1c3RvbVRhZykgewotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTW9kZWxRdWVyeSBtcSA9IGdldE1vZGVsUXVlcnkoc3RydWN0dXJlZERvYyk7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQlUTERDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBUYWdsaWJDb250cm9sbGVyLmdldFRMRENNRG9jdW1lbnRNYW5hZ2VyKHN0cnVjdHVyZWREb2MpOwotCi0JCQkvLyBUYWdsaWJTdXBwb3J0IHN1cHBvcnQgPSAoKFRhZ2xpYk1vZGVsUXVlcnkpCi0JCQkvLyBtcSkuZ2V0VGFnbGliU3VwcG9ydCgpOwotCQkJaWYgKG1nciA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgVGFnbGliVmFyaWFibGVbMF07Ci0KLQkJCUxpc3QgdHJhY2tlcnMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKGN1c3RvbVRhZy5nZXRFbmRPZmZzZXQoKSk7Ci0JCQlJdGVyYXRvciB0YWdsaWJzID0gdHJhY2tlcnMuaXRlcmF0b3IoKTsKLQotCQkJLy8gVGFnbGliU3VwcG9ydCBzdXBwb3J0ID0gKChUYWdsaWJNb2RlbFF1ZXJ5KQotCQkJLy8gbXEpLmdldFRhZ2xpYlN1cHBvcnQoKTsKLQkJCS8vIGlmIChzdXBwb3J0ID09IG51bGwpCi0JCQkvLyByZXR1cm4gbmV3IFRhZ2xpYlZhcmlhYmxlWzBdOwotCQkJLy8KLQkJCS8vIEl0ZXJhdG9yIHRhZ2xpYnMgPQotCQkJLy8gc3VwcG9ydC5nZXRDTURvY3VtZW50cyhjdXN0b21UYWcuZ2V0U3RhcnRPZmZzZXQoKSkuaXRlcmF0b3IoKTsKLQkJCUNNRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gbnVsbDsKLQkJCXdoaWxlICh0YWdsaWJzLmhhc05leHQoKSkgewotCQkJCWRvYyA9IChDTURvY3VtZW50KSB0YWdsaWJzLm5leHQoKTsKLQkJCQlDTU5vZGUgbm9kZSA9IG51bGw7Ci0JCQkJaWYgKChlbGVtZW50cyA9IGRvYy5nZXRFbGVtZW50cygpKSAhPSBudWxsICYmIChub2RlID0gZWxlbWVudHMuZ2V0TmFtZWRJdGVtKHRhZ1RvQWRkKSkgIT0gbnVsbCAmJiBub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQotCQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZVdyYXBwZXIpIHsKLQkJCQkJCW5vZGUgPSAoKENNTm9kZVdyYXBwZXIpIG5vZGUpLmdldE9yaWdpbk5vZGUoKTsKLQkJCQkJfQotCi0JCQkJCS8vIDEuMisgdGFnbGliIHN0eWxlCi0JCQkJCWFkZFZhcmlhYmxlcyhyZXN1bHRzLCBub2RlLCBjdXN0b21UYWcpOwotCi0JCQkJCS8vIGZvciAxLjEgbmVlZCBtb3JlIGluZm8gZnJvbSB0YWdsaWIgdHJhY2tlcgotCQkJCQlpZiAoZG9jIGluc3RhbmNlb2YgVGFnbGliVHJhY2tlcikgewotCQkJCQkJU3RyaW5nIHVyaSA9ICgoVGFnbGliVHJhY2tlcikgZG9jKS5nZXRVUkkoKTsKLQkJCQkJCVN0cmluZyBwcmVmaXggPSAoKFRhZ2xpYlRyYWNrZXIpIGRvYykuZ2V0UHJlZml4KCk7Ci0JCQkJCQkvLyBvbmx5IGZvciAxLjEgdGFnbGlicwotCQkJCQkJYWRkVEVJVmFyaWFibGVzKGN1c3RvbVRhZywgcmVzdWx0cywgKFRMREVsZW1lbnREZWNsYXJhdGlvbikgbm9kZSwgcHJlZml4LCB1cmkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChUYWdsaWJWYXJpYWJsZVtdKSByZXN1bHRzLnRvQXJyYXkobmV3IFRhZ2xpYlZhcmlhYmxlW3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyAxLjIgc3R5bGUgVGFnbGliVmFyaWFibGVzIHRvIHRoZSByZXN1bHRzIGxpc3QuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdHMKLQkgKiAgICAgICAgICAgIGxpc3Qgd2hlcmUgdGhlIDxjb2RlPlRhZ2xpYlZhcmlhYmxlPC9jb2RlPiBzIGFyZSBhZGRlZAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlcyhMaXN0IHJlc3VsdHMsIENNTm9kZSBub2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1c3RvbVRhZykgewotCi0JCUxpc3QgbGlzdCA9ICgoVExERWxlbWVudERlY2xhcmF0aW9uKSBub2RlKS5nZXRWYXJpYWJsZXMoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCVRMRFZhcmlhYmxlIHZhciA9IChUTERWYXJpYWJsZSkgaXQubmV4dCgpOwotCQkJU3RyaW5nIHZhck5hbWUgPSB2YXIuZ2V0TmFtZUdpdmVuKCk7Ci0JCQlpZiAodmFyTmFtZSA9PSBudWxsKSB7Ci0JCQkJU3RyaW5nIGF0dHJOYW1lID0gdmFyLmdldE5hbWVGcm9tQXR0cmlidXRlKCk7Ci0JCQkJLyoKLQkJCQkgKiBJdGVyYXRlIHRocm91Z2ggdGhlIGRvY3VtZW50IHJlZ2lvbiB0byBmaW5kIHRoZQotCQkJCSAqIGNvcnJlc3BvbmRpbmcgYXR0cmlidXRlIG5hbWUsIGFuZCB0aGVuIHVzZSBpdHMgdmFsdWUKLQkJCQkgKi8KLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGN1c3RvbVRhZy5nZXRSZWdpb25zKCk7Ci0JCQkJYm9vbGVhbiBhdHRyTmFtZUZvdW5kID0gZmFsc2U7Ci0JCQkJZm9yIChpbnQgaSA9IDI7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlpZiAoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLmVxdWFscyhyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJYXR0ck5hbWVGb3VuZCA9IGF0dHJOYW1lLmVxdWFscyhjdXN0b21UYWcuZ2V0VGV4dChyZWdpb24pKTsKLQkJCQkJfQotCQkJCQlpZiAoYXR0ck5hbWVGb3VuZCAmJiBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhyZWdpb24uZ2V0VHlwZSgpKSkgewotCQkJCQkJdmFyTmFtZSA9IFN0cmluZ1V0aWxzLnN0cmlwKGN1c3RvbVRhZy5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKHZhck5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyB2YXJDbGFzcyA9ICJqYXZhLmxhbmcuU3RyaW5nIjsgLy8kTk9OLU5MUy0xJCAvLyB0aGUgZGVmYXVsdCBjbGFzcy4uLgotCQkJCWlmICh2YXIuZ2V0VmFyaWFibGVDbGFzcygpICE9IG51bGwpIHsKLQkJCQkJdmFyQ2xhc3MgPSB2YXIuZ2V0VmFyaWFibGVDbGFzcygpOwotCQkJCX0KLQkJCQlyZXN1bHRzLmFkZChuZXcgVGFnbGliVmFyaWFibGUodmFyQ2xhc3MsIHZhck5hbWUsIHZhci5nZXRTY29wZSgpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIDEuMSBzdHlsZSBUYWdsaWJWYXJpYWJsZXMgKGRlZmluZWQgaW4gYSBUYWdFeHRyYUluZm8gY2xhc3MpIHRvIHRoZQotCSAqIHJlc3VsdHMgbGlzdC4KLQkgKiAKLQkgKiBAcGFyYW0gY3VzdG9tVGFnCi0JICogQHBhcmFtIHJlc3VsdHMKLQkgKiAgICAgICAgICAgIGxpc3Qgd2hlcmUgdGhlIDxjb2RlPlRhZ2xpYlZhcmlhYmxlPC9jb2RlPiBzIGFyZSBhZGRlZAotCSAqIEBwYXJhbSBkZWNsCi0JICogICAgICAgICAgICBUTERFbGVtZW50RGVsY2FyYXRpb24gZm9yIHRoZSBjdXN0b20gdGFnCi0JICogQHBhcmFtIHByZWZpeAotCSAqICAgICAgICAgICAgY3VzdG9tIHRhZyBwcmVmaXgKLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBVUkkgd2hlcmUgdGhlIHRsZCBjYW4gYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVEVJVmFyaWFibGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VzdG9tVGFnLCBMaXN0IHJlc3VsdHMsIFRMREVsZW1lbnREZWNsYXJhdGlvbiBkZWNsLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0KLQkJU3RyaW5nIHRlaUNsYXNzbmFtZSA9IGRlY2wuZ2V0VGVpY2xhc3MoKTsKLQkJaWYgKHRlaUNsYXNzbmFtZSA9PSBudWxsIHx8IHRlaUNsYXNzbmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCVRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlciA9IGdldENsYXNzbG9hZGVyKCk7Ci0KLQkJQ2xhc3MgdGVpQ2xhc3MgPSBudWxsOwotCQl0cnkgewotCQkJdGVpQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRlaUNsYXNzbmFtZSwgdHJ1ZSwgbG9hZGVyKTsKLQkJCWlmICh0ZWlDbGFzcyAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IHRlaU9iamVjdCA9IHRlaUNsYXNzLm5ld0luc3RhbmNlKCk7Ci0JCQkJaWYgKFRhZ0V4dHJhSW5mby5jbGFzcy5pc0luc3RhbmNlKHRlaU9iamVjdCkpIHsKLQkJCQkJVGFnRXh0cmFJbmZvIHRlaSA9IChUYWdFeHRyYUluZm8pIHRlaU9iamVjdDsKLQkJCQkJSGFzaHRhYmxlIHRhZ0RhdGFUYWJsZSA9IGV4dHJhY3RUYWdEYXRhKGN1c3RvbVRhZyk7Ci0JCQkJCVRhZ0luZm8gaW5mbyA9IGdldFRhZ0luZm8oZGVjbCwgdGVpLCBwcmVmaXgsIHVyaSk7Ci0JCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJCXRlaS5zZXRUYWdJbmZvKGluZm8pOwotCi0JCQkJCQkvLyBhZGQgdG8gcmVzdWx0cwotCQkJCQkJVGFnRGF0YSB0ZCA9IG5ldyBUYWdEYXRhKHRhZ0RhdGFUYWJsZSk7Ci0JCQkJCQlpZiAodGVpLmlzVmFsaWQodGQpKSB7Ci0JCQkJCQkJVmFyaWFibGVJbmZvW10gdkluZm9zID0gdGVpLmdldFZhcmlhYmxlSW5mbyh0ZCk7Ci0JCQkJCQkJaWYgKHZJbmZvcyAhPSBudWxsKSB7Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdkluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlyZXN1bHRzLmFkZChuZXcgVGFnbGliVmFyaWFibGUodkluZm9zW2ldLmdldENsYXNzTmFtZSgpLCB2SW5mb3NbaV0uZ2V0VmFyTmFtZSgpLCB2SW5mb3NbaV0uZ2V0U2NvcGUoKSkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRFSSBjbGFzcyB3YXNuJ3Qgb24gY2xhc3NwYXRoCi0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChERUJVRykKLQkJCQlsb2dFeGNlcHRpb24odGVpQ2xhc3NuYW1lLCBlKTsKLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIFRFSSBjbGFzcyB3YXNuJ3QgcmVhbGx5IGEgc3ViY2xhc3Mgb2YgVGFnRXh0cmFJbmZvCi0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyB0aGlzIGlzIDNyZCBwYXJ0eSBjb2RlLCBuZWVkIHRvIGNhdGNoIGFsbCBleGNlcHRpb25zCi0JCQlpZiAoREVCVUcpCi0JCQkJbG9nRXhjZXB0aW9uKHRlaUNsYXNzbmFtZSwgZSk7Ci0JCX0KLQkJY2F0Y2ggKEVycm9yIGUpIHsKLQkJCS8vIHRoaXMgaXMgM3JkIHBhcnR5IGNvZGUsIG5lZWQgdG8gY2F0Y2ggYWxsIGVycm9ycwotCQkJaWYgKERFQlVHKQotCQkJCWxvZ0V4Y2VwdGlvbih0ZWlDbGFzc25hbWUsIGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob2xkTG9hZGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZWNsCi0JICogQHJldHVybiB0aGUgVGFnSW5mbyBmb3IgdGhlIFRMREVMZW1lbnREZWNsYXJhdGlvbiBpZiB0aGUgZGVjbGFyYXRpb24gaXMKLQkgKiAgICAgICAgIHZhbGlkLCBvdGhlcndpc2UgbnVsbAotCSAqLwotCXByaXZhdGUgVGFnSW5mbyBnZXRUYWdJbmZvKFRMREVsZW1lbnREZWNsYXJhdGlvbiBkZWNsLCBUYWdFeHRyYUluZm8gdGVpLCBTdHJpbmcgcHJlZml4LCBTdHJpbmcgdXJpKSB7Ci0KLQkJVGFnTGlicmFyeUluZm8gbGliSW5mbyA9IG5ldyBUYWdMaWJyYXJ5SW5mbyhwcmVmaXgsIHVyaSkgeyAvKgotCQkJCQkJCQkJCQkJCQkJCQkgKiBkdW1teQotCQkJCQkJCQkJCQkJCQkJCQkgKiBpbXBsCi0JCQkJCQkJCQkJCQkJCQkJCSAqLwotCQl9OwotCi0JCUNNTmFtZWROb2RlTWFwIGF0dHJzID0gZGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCVRhZ0F0dHJpYnV0ZUluZm9bXSBhdHRySW5mb3MgPSBuZXcgVGFnQXR0cmlidXRlSW5mb1thdHRycy5nZXRMZW5ndGgoKV07Ci0JCVRMREF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9ICIiOyAvLyROT04tTkxTLTEkIAotCi0JCS8vIGdldCB0YWcgYXR0cmlidXRlIGluZm9zCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJYXR0ciA9IChUTERBdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cnMuaXRlbShpKTsKLQkJCXR5cGUgPSBhdHRyLmdldFR5cGUoKTsKLQkJCS8vIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgaXMgU3RyaW5nCi0JCQlpZiAoYXR0ci5nZXRUeXBlKCkgPT0gbnVsbCB8fCBhdHRyLmdldFR5cGUoKS5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkIAotCQkJCXR5cGUgPSAiamF2YS5sYW5nLlN0cmluZyI7IC8vJE5PTi1OTFMtMSQgCi0JCQlhdHRySW5mb3NbaV0gPSBuZXcgVGFnQXR0cmlidXRlSW5mbyhhdHRyLmdldEF0dHJOYW1lKCksIGF0dHIuaXNSZXF1aXJlZCgpLCB0eXBlLCBmYWxzZSk7Ci0JCX0KLQotCQlTdHJpbmcgdGFnTmFtZSA9IGRlY2wuZ2V0Tm9kZU5hbWUoKTsKLQkJU3RyaW5nIHRhZ0NsYXNzID0gZGVjbC5nZXRUYWdjbGFzcygpOwotCQlTdHJpbmcgYm9keUNvbnRlbnQgPSBkZWNsLmdldEJvZHljb250ZW50KCk7Ci0JCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnQ2xhc3MgIT0gbnVsbCAmJiBib2R5Q29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBUYWdJbmZvKHRhZ05hbWUsIHRhZ0NsYXNzLCBib2R5Q29udGVudCwgZGVjbC5nZXRJbmZvKCksIGxpYkluZm8sIHRlaSwgYXR0ckluZm9zKTsKLQkJcmV0dXJuIG51bGw7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZQotCSAqLwotCXByaXZhdGUgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIHRlaUNsYXNzbmFtZSwgVGhyb3dhYmxlIGUpIHsKLQotCQlTdHJpbmcgbWVzc2FnZSA9ICJ0ZWlDbGFzc25hbWU6IFsiOyAvLyROT04tTkxTLTEkIAotCQlpZiAodGVpQ2xhc3NuYW1lICE9IG51bGwpCi0JCQltZXNzYWdlICs9IHRlaUNsYXNzbmFtZTsKLQkJbWVzc2FnZSArPSAiXSI7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihtZXNzYWdlLCBlKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBhdHRyaWJ1dGUgLT4gdmFsdWUgcGFpcnMgZm9yIHRoZSB0YWcgaW4gYSBIYXNodGFibGUuCi0JICogCi0JICogQHBhcmFtIGN1c3RvbVRhZwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIEhhc2h0YWJsZSBleHRyYWN0VGFnRGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1c3RvbVRhZykgewotCi0JCUhhc2h0YWJsZSB0YWdEYXRhVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY3VzdG9tVGFnLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBhdHRyVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCS8vIGNoZWNrIGlmIGF0dHIgbmFtZQotCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWF0dHJOYW1lID0gY3VzdG9tVGFnLmdldFRleHQocik7Ci0JCQkJLy8gY2hlY2sgZXF1YWxzIGlzIG5leHQgcmVnaW9uCi0JCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gKytpKSB7Ci0JCQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTICYmIHJlZ2lvbnMuc2l6ZSgpID4gKytpKSB7Ci0JCQkJCQkvLyBnZXQgYXR0ciB2YWx1ZQotCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQkJaWYgKHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJCQkJLy8gYXR0cmlidXRlcyBpbiBvdXIgZG9jdW1lbnQgaGF2ZSBxdW90ZXMsIHNvIHdlCi0JCQkJCQkJLy8gbmVlZCB0byBzdHJpcCB0aGVtCi0JCQkJCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXMoY3VzdG9tVGFnLmdldFRleHQocikpOwotCQkJCQkJCXRhZ0RhdGFUYWJsZS5wdXQoYXR0ck5hbWUsIGF0dHJWYWx1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhZ0RhdGFUYWJsZTsKLQl9Ci0KLQlwcml2YXRlIFRhZ2xpYkNsYXNzTG9hZGVyIGdldENsYXNzbG9hZGVyKCkgewotCi0JCWlmIChmTG9hZGVyID09IG51bGwpIHsKLQkJCWZMb2FkZXIgPSBuZXcgVGFnbGliQ2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotCQkJZlByb2plY3RFbnRyaWVzLmNsZWFyKCk7Ci0JCQlmQ29udGFpbmVyRW50cmllcy5jbGVhcigpOwotCQkJYWRkQ2xhc3NwYXRoRW50cmllc0ZvclByb2plY3QoZ2V0UHJvamVjdCgpLCBmTG9hZGVyKTsKLQkJfQotCQlyZXR1cm4gZkxvYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KElQcm9qZWN0IHAsIFRhZ2xpYkNsYXNzTG9hZGVyIGxvYWRlcikgewotCi0JCS8vIGF2b2lkIGluZmluaXRlIHJlY3Vyc2lvbiBhbmQgY2xvc2VkIHByb2plY3QKLQkJaWYgKCFwLmlzQWNjZXNzaWJsZSgpIHx8IGZQcm9qZWN0RW50cmllcy5jb250YWlucyhwLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkpCi0JCQlyZXR1cm47Ci0JCWZQcm9qZWN0RW50cmllcy5hZGQocC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCi0JCS8vIGFkZCB0aGluZ3Mgb24gY2xhc3NwYXRoIHRoYXQgd2UgYXJlIGludGVyZXN0ZWQgaW4KLQkJaWYgKHAgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAocC5oYXNOYXR1cmUoSmF2YUNvcmUuTkFUVVJFX0lEKSkgewotCi0JCQkJCUlKYXZhUHJvamVjdCBwcm9qZWN0ID0gSmF2YUNvcmUuY3JlYXRlKHApOwotCQkJCQlJUGF0aCB3a3NwYWNlUm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKTsKLQotCQkJCQl0cnkgewotCQkJCQkJSUNsYXNzcGF0aEVudHJ5W10gZW50cmllcyA9IHByb2plY3QuZ2V0UmF3Q2xhc3NwYXRoKCk7Ci0JCQkJCQlhZGREZWZhdWx0RGlyRW50cnkobG9hZGVyLCBwcm9qZWN0LCB3a3NwYWNlUm9vdCk7Ci0JCQkJCQlhZGRDbGFzc3BhdGhFbnRyaWVzKGxvYWRlciwgcHJvamVjdCwgd2tzcGFjZVJvb3QsIGVudHJpZXMpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzcGF0aEVudHJpZXMoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggd2tzcGFjZVJvb3QsIElDbGFzc3BhdGhFbnRyeVtdIGVudHJpZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJQ2xhc3NwYXRoRW50cnkgZW50cnk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCi0JCQllbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50IGVudHJ5IGlzOiAiICsgZW50cnkpOyAvLyROT04tTkxTLTEkCi0KLQkJCXN3aXRjaCAoZW50cnkuZ2V0RW50cnlLaW5kKCkpIHsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfU09VUkNFIDoKLQkJCQkJYWRkU291cmNlRW50cnkobG9hZGVyLCB3a3NwYWNlUm9vdCwgZW50cnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6Ci0JCQkJCWFkZExpYnJhcnlFbnRyeShsb2FkZXIsIHdrc3BhY2VSb290LCBlbnRyeS5nZXRQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNsYXNzcGF0aEVudHJ5LkNQRV9QUk9KRUNUIDoKLQkJCQkJYWRkUHJvamVjdEVudHJ5KGxvYWRlciwgZW50cnkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCQlhZGRWYXJpYWJsZUVudHJ5KGxvYWRlciwgd2tzcGFjZVJvb3QsIGVudHJ5KTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX0NPTlRBSU5FUiA6Ci0JCQkJCWFkZENvbnRhaW5lckVudHJ5KGxvYWRlciwgcHJvamVjdCwgd2tzcGFjZVJvb3QsIGVudHJ5KTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFZhcmlhYmxlRW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJUGF0aCB3a3NwYWNlUm9vdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLT4gYWRkaW5nIHZhcmlhYmxlIGVudHJ5OiBbIiArIGVudHJ5ICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLy8gdmFyaWFibGUgc2hvdWxkIGVpdGhlciBiZSBhIHByb2plY3Qgb3IgYSBsaWJyYXJ5IGVudHJ5Ci0KLQkJU3RyaW5nIHZhcmlhYmxlTmFtZSA9IGVudHJ5LmdldFBhdGgoKS50b1N0cmluZygpOwotCQlJUGF0aCB2YXJpYWJsZVBhdGggPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhWYXJpYWJsZSh2YXJpYWJsZU5hbWUpOwotCi0JCS8vIFJBVExDMDEwNzY4NTQKLQkJLy8gdmFyaWFibGUgcGF0aHMgbWF5IG5vdCBleGlzdAotCQkvLyBpbiB0aGF0IGNhc2UgbnVsbCB3aWxsIGJlIHJldHVybmVkCi0JCWlmICh2YXJpYWJsZVBhdGggIT0gbnVsbCkgewotCQkJaWYgKHZhcmlhYmxlUGF0aC5zZWdtZW50cygpLmxlbmd0aCA9PSAxKSB7Ci0JCQkJSVByb2plY3QgdmFyUHJvaiA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdCh2YXJpYWJsZVBhdGgudG9TdHJpbmcoKSk7Ci0JCQkJaWYgKHZhclByb2ogIT0gbnVsbCAmJiB2YXJQcm9qLmV4aXN0cygpKSB7Ci0JCQkJCWFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KHZhclByb2osIGxvYWRlcik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCQlhZGRMaWJyYXJ5RW50cnkobG9hZGVyLCB3a3NwYWNlUm9vdCwgdmFyaWFibGVQYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxvYWRlcgotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogQHBhcmFtIHdrc3BhY2VSb290Ci0JICogQHBhcmFtIGVudHJ5Ci0JICogQHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQ29udGFpbmVyRW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggd2tzcGFjZVJvb3QsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0KLQkJSUNsYXNzcGF0aENvbnRhaW5lciBjb250YWluZXIgPSBKYXZhQ29yZS5nZXRDbGFzc3BhdGhDb250YWluZXIoZW50cnkuZ2V0UGF0aCgpLCBwcm9qZWN0KTsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQkvLyBhdm9pZCBpbmZpbml0ZSByZWN1cnNpb24KLQkJCWlmICghZkNvbnRhaW5lckVudHJpZXMuY29udGFpbnMoY29udGFpbmVyLmdldFBhdGgoKS50b1N0cmluZygpKSkgewotCQkJCWZDb250YWluZXJFbnRyaWVzLmFkZChjb250YWluZXIuZ2V0UGF0aCgpLnRvU3RyaW5nKCkpOwotCi0JCQkJSUNsYXNzcGF0aEVudHJ5W10gY3BlcyA9IGNvbnRhaW5lci5nZXRDbGFzc3BhdGhFbnRyaWVzKCk7Ci0JCQkJLy8gcmVjdXJzaXZlIGNhbGwgaGVyZQotCQkJCWFkZENsYXNzcGF0aEVudHJpZXMobG9hZGVyLCBwcm9qZWN0LCB3a3NwYWNlUm9vdCwgY3Blcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFByb2plY3RFbnRyeShUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIsIElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIC0+IHByb2plY3QgZW50cnk6IFsiICsgZW50cnkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlJUGF0aCBwYXRoID0gZW50cnkuZ2V0UGF0aCgpOwotCQlJUHJvamVjdCByZWZlcmVjZVByb2ogPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC50b1N0cmluZygpKTsKLQkJaWYgKHJlZmVyZWNlUHJvaiAhPSBudWxsICYmIHJlZmVyZWNlUHJvai5leGlzdHMoKSkKLQkJCWFkZENsYXNzcGF0aEVudHJpZXNGb3JQcm9qZWN0KHJlZmVyZWNlUHJvaiwgbG9hZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiBAcGFyYW0gd2tzcGFjZVJvb3QKLQkgKiBAdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGREZWZhdWx0RGlyRW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJSmF2YVByb2plY3QgcHJvamVjdCwgSVBhdGggd2tzcGFjZVJvb3QpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCi0JCS8vIGFkZCBkZWZhdWx0IGJpbiBkaXJlY3RvcnkgZm9yIHRoZSBwcm9qZWN0Ci0JCUlQYXRoIG91dHB1dExvY2F0aW9uID0gcHJvamVjdC5nZXRPdXRwdXRMb2NhdGlvbigpOwotCQlpZiAoIW91dHB1dExvY2F0aW9uLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQlvdXRwdXRMb2NhdGlvbiA9IHdrc3BhY2VSb290LmFwcGVuZChvdXRwdXRMb2NhdGlvbik7Ci0JCX0KLQkJbG9hZGVyLmFkZERpcmVjdG9yeShvdXRwdXRMb2NhdGlvbi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbG9hZGVyCi0JICogQHBhcmFtIHdrc3BhY2VSb290Ci0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZExpYnJhcnlFbnRyeShUYWdsaWJDbGFzc0xvYWRlciBsb2FkZXIsIElQYXRoIHdrc3BhY2VSb290LCBTdHJpbmcgbGliUGF0aCkgewotCi0JCVN0cmluZyBqYXJQYXRoID0gbGliUGF0aDsKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoamFyUGF0aCk7Ci0KLQkJLy8gaWYgbm90IGFic29sdXRlIHBhdGgsIGl0J3Mgd29ya3NwYWNlIHJlbGF0aXZlCi0JCWlmICghZmlsZS5leGlzdHMoKSkgewotCQkJamFyUGF0aCA9IHdrc3BhY2VSb290LmFwcGVuZChqYXJQYXRoKS50b1N0cmluZygpOwotCQl9Ci0KLQkJaWYgKGphclBhdGguZW5kc1dpdGgoIi5qYXIiKSkgeyAvLyROT04tTkxTLTEkIAotCQkJbG9hZGVyLmFkZEphcihqYXJQYXRoKTsKLQkJfQotCQllbHNlIGlmIChmaWxlLmlzRGlyZWN0b3J5KCkpIHsKLQkJCS8vIGl0J3MgYWN0dWFsbHkgYSBmb2xkZXIgY29udGFpbmluZyBiaW5hcmllcwotCQkJbG9hZGVyLmFkZERpcmVjdG9yeShqYXJQYXRoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb2FkZXIKLQkgKiBAcGFyYW0gd2tzcGFjZVJvb3QKLQkgKiBAcGFyYW0gZW50cnkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU291cmNlRW50cnkoVGFnbGliQ2xhc3NMb2FkZXIgbG9hZGVyLCBJUGF0aCB3a3NwYWNlUm9vdCwgSUNsYXNzcGF0aEVudHJ5IGVudHJ5KSB7Ci0KLQkJLy8gYWRkIGJpbiBkaXJlY3RvcnkgZm9yIHNwZWNpZmljIGVudHJ5IGlmIGl0IGhhcwotCQkvLyBvbmUKLQkJaWYgKGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIG91dHB1dFBhdGggPSBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQlGaWxlIGZpbGUgPSBlbnRyeS5nZXRPdXRwdXRMb2NhdGlvbigpLnRvRmlsZSgpOwotCQkJLy8gaWYgbm90IGFic29sdXRlIHBhdGgsIGl0J3Mgd29ya3NwYWNlIHJlbGF0aXZlCi0JCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCQlvdXRwdXRQYXRoID0gd2tzcGFjZVJvb3QuYXBwZW5kKGVudHJ5LmdldE91dHB1dExvY2F0aW9uKCkpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlsb2FkZXIuYWRkRGlyZWN0b3J5KG91dHB1dFBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmTW9kZWxRdWVyeS4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KElEb2N1bWVudCBkb2MpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCQltcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobW9kZWwpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIG1xOwotCX0KLQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmRmlsZS4KLQkgKi8KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIFRoZSBmRmlsZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBwKSB7Ci0JCWZQcm9qZWN0ID0gcDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJDYWNoZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliSGVscGVyQ2FjaGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmOTVjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnRhZ2xpYjsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQSBzaW1wbGUgY2FjaGUgZm9yIFRhZ2xpYkhlbHBlcnMgdG8gYXZvaWQgZXhjZXNzaXZlIGNyZWF0aW9uIG9mIFRhZ2xpYkNsYXNzTG9hZGVycwotICogQGF1dGhvciBwYXZlcnkKLSAqLwotY2xhc3MgVGFnbGliSGVscGVyQ2FjaGUgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLSAgICBzdGF0aWMgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL3RhZ2xpYnZhcnMiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gZW50cnkgZm9yIHRoZSBjYWNoZSAocHJvamVjdFBhdGggc3RyaW5nICYgVGFnbGliSGVscGVyKQotICAgICAqLwotICAgIGNsYXNzIEVudHJ5IHsKLSAgICAgICAgcHJpdmF0ZSBUYWdsaWJIZWxwZXIgZkhlbHBlcjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZlByb2plY3RQYXRoOwotICAgICAgICAKLSAgICAgICAgcHVibGljIEVudHJ5KFN0cmluZyBwcm9qZWN0UGF0aCwgVGFnbGliSGVscGVyIGhlbHBlcikgewotICAgICAgICAgICAgc2V0UHJvamVjdFBhdGgocHJvamVjdFBhdGgpOwotICAgICAgICAgICAgc2V0SGVscGVyKGhlbHBlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIFRhZ2xpYkhlbHBlciBnZXRIZWxwZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZkhlbHBlcjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRIZWxwZXIoVGFnbGliSGVscGVyIGhlbHBlcikgewotICAgICAgICAgICAgZkhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb2plY3RQYXRoKCkgewotICAgICAgICAgICAgcmV0dXJuIGZQcm9qZWN0UGF0aDsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0UGF0aChTdHJpbmcgcHJvamVjdFBhdGgpIHsKLSAgICAgICAgICAgIGZQcm9qZWN0UGF0aCA9IHByb2plY3RQYXRoOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIlRhZ2xpYiBIZWxwZXIgRW50cnkgWyIgKyBnZXRQcm9qZWN0UGF0aCgpICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIExpc3QgZkhlbHBlcnM7Ci0gICAgLy8gbWF4IHNpemUgZm9yIHRoZSBjYWNoZQotICAgIHByaXZhdGUgaW50IE1BWF9TSVpFOwotCi0gICAgLyoqCi0gICAgICogTm90IGludGVuZGVkIHRvIGJlIGxhcmdlIHNpbmNlIHVuZGVybHlpbmcgaW1wbG1lbWVudGF0aW9uIHVzZXMKLSAgICAgKiBhIExpc3QuCi0gICAgICovCi0gICAgcHVibGljIFRhZ2xpYkhlbHBlckNhY2hlKGludCBzaXplKSB7Ci0gICAgICAgIE1BWF9TSVpFID0gc2l6ZTsKLSAgICAgICAgZkhlbHBlcnMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3QoTUFYX1NJWkUpKTsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb2plY3RQYXRoCi0gICAgICogQHBhcmFtIGYKLSAgICAgKiBAcGFyYW0gbXEKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBUYWdsaWJIZWxwZXIgZ2V0SGVscGVyKElQcm9qZWN0IHByb2plY3QpIHsKLSAgICAgICAgVGFnbGliSGVscGVyIGhlbHBlciA9IG51bGw7Ci0gICAgICAgIEVudHJ5IGVudHJ5ID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHByb2plY3RQYXRoID0gcHJvamVjdC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0gICAgICAgIGludCBzaXplID0gZkhlbHBlcnMuc2l6ZSgpOwotICAgICAgICAvLyBmaXN0IGNoZWNrIGZvciBleGlzdGluZwotICAgICAgICBmb3IgKGludCBpPTA7IGk8c2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBlbnRyeSA9IChFbnRyeSlmSGVscGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZihlbnRyeS5nZXRQcm9qZWN0UGF0aCgpLmVxdWFscyhwcm9qZWN0UGF0aCkpIHsKLSAgICAgICAgICAgICAgICAvLyBleGlzdHMKLSAgICAgICAgICAgICAgICBoZWxwZXIgPSBlbnRyeS5nZXRIZWxwZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IG1vdmUgdG8gZnJvbnQgaWYgaXQncyBub3QgdGhlIGZpcnN0IGVudHJ5Ci0gICAgICAgICAgICAgICAgaWYoaT4wKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZIZWxwZXJzLnJlbW92ZShlbnRyeSk7Ci0JICAgICAgICAgICAgICAgIGZIZWxwZXJzLmFkZCgxLCBlbnRyeSk7Ci0JICAgICAgICAgICAgICAgIGlmKERFQlVHKSB7Ci0JICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiKC0+KSBUYWdsaWJIZWxwZXJDYWNoZSBtb3ZlZDogIiArIGVudHJ5ICsgIiB0byB0aGUgZnJvbnQgb2YgdGhlIGxpc3QiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JICAgICAgICAgICAgICAgICAgICBwcmludENhY2hlQ29udGVudHMoKTsKLQkgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBkaWRuJ3QgZXhpc3QKLSAgICAgICAgaWYoaGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGhlbHBlciA9IGNyZWF0ZU5ld0hlbHBlcihwcm9qZWN0UGF0aCwgcHJvamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHByb2plY3RQYXRoCi0gICAgICogQHBhcmFtIGYKLSAgICAgKiBAcGFyYW0gbXEKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHJpdmF0ZSBUYWdsaWJIZWxwZXIgY3JlYXRlTmV3SGVscGVyKFN0cmluZyBwcm9qZWN0UGF0aCwgSVByb2plY3QgcHJvamVjdCkgewotCi0gICAgICAgIFRhZ2xpYkhlbHBlciBoZWxwZXI7Ci0gICAgICAgIC8vIGNyZWF0ZQotICAgICAgICBoZWxwZXIgPSBuZXcgVGFnbGliSGVscGVyKHByb2plY3QpOwotICAgICAgICBFbnRyeSBuZXdFbnRyeSA9IG5ldyBFbnRyeShwcm9qZWN0UGF0aCwgaGVscGVyKTsKLSAgICAgICAgZkhlbHBlcnMuYWRkKDAsIG5ld0VudHJ5KTsKLSAgICAgICAgaWYoREVCVUcpIHsKLSAgICAgICAgCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICIoKykgVGFnbGliSGVscGVyQ2FjaGUgYWRkZWQ6ICIgKyBuZXdFbnRyeSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHByaW50Q2FjaGVDb250ZW50cygpOwotICAgICAgICB9Ci0gICAgICAgIGlmKGZIZWxwZXJzLnNpemUoKSA+IE1BWF9TSVpFKSB7Ci0gICAgICAgICAgICAvLyBvbmUgdG9vIG1hbnksIHJlbW92ZSBsYXN0Ci0gICAgICAgICAgICBPYmplY3QgcmVtb3ZlZCA9IGZIZWxwZXJzLnJlbW92ZShmSGVscGVycy5zaXplKCktMSk7Ci0gICAgICAgICAgICBpZihERUJVRykgewotICAgICAgICAgICAgCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICIoLSkgVGFnbGliSGVscGVyQ2FjaGUgcmVtb3ZlZDogIiArIHJlbW92ZWQpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgcHJpbnRDYWNoZUNvbnRlbnRzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGhlbHBlcjsKLSAgICB9Ci0gCi0gICAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUhlbHBlcihTdHJpbmcgcHJvamVjdFBhdGgpIHsKLSAgICAgICAgRW50cnkgZW50cnkgPSBudWxsOwotICAgICAgICBJdGVyYXRvciBpdCA9IGZIZWxwZXJzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgZW50cnkgPSAoRW50cnkpaXQubmV4dCgpOwotICAgICAgICAgICAgaWYoZW50cnkuZ2V0UHJvamVjdFBhdGgoKS5lcXVhbHMocHJvamVjdFBhdGgpKSB7Ci0gICAgICAgICAgICAgICAgZkhlbHBlcnMucmVtb3ZlKGVudHJ5KTsKLSAgICAgICAgICAgICAgICBpZihERUJVRykgeyAKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIigtKSBUYWdsaWJIZWxwZXJDYWNoZSByZW1vdmVkOiAiICsgZW50cnkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAgIHByaW50Q2FjaGVDb250ZW50cygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcHJpbnRDYWNoZUNvbnRlbnRzKCkgewotICAgICAgICBTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGRlYnVnU3RyaW5nLmFwcGVuZCgiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGRlYnVnU3RyaW5nLmFwcGVuZCgiXG5jYWNoZSBjb250ZW50czoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBmb3IgKGludCBpPTA7IGk8ZkhlbHBlcnMuc2l6ZSgpOyBpKyspCQotICAgICAgICAJZGVidWdTdHJpbmcuYXBwZW5kKCJcbiAtIiArIGkgKyAiLSAiICsgZkhlbHBlcnMuZ2V0KGkpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGRlYnVnU3RyaW5nLmFwcGVuZCgiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLklORk8sIGRlYnVnU3RyaW5nLnRvU3RyaW5nKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlck1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGFnbGliL1RhZ2xpYkhlbHBlck1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNkM2VjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJIZWxwZXJNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC50YWdsaWI7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkVsZW1lbnRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudERlbHRhOwotCi0vKioKLSAqIE1hbmFnZXMgY3JlYXRpb24gYW5kIGNhY2hpbmcgKG9yZGVyZWQgTVJVKSBvZiBUYWdsaWJIZWxwZXJzLgotICogUmVtb3ZlcyBoZWxwZXJzIHdoZW4gdGhlaXIgY2xhc3NwYXRoIGNoYW5nZXMgKHNvIHRoZXkgYXJlIHJlYnVpbHQpLgotICogVGhlcmUgaXMgb25lIGhlbHBlciBwZXIgcHJvamVjdCAod2l0aCBhIHNwZWNpZmljIGNsYXNzcGF0aCBlbnRyeSkuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJIZWxwZXJNYW5hZ2VyIGltcGxlbWVudHMgSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIgewotICAgCi0KLSAgICBwcml2YXRlIHN0YXRpYyBUYWdsaWJIZWxwZXJNYW5hZ2VyIGluc3RhbmNlID0gbnVsbDsKLSAgICAvLyB1c2luZyBhIGNhY2hlIG9mIGp1c3QgMyBsb2FkZXJzCi0gICAgcHJpdmF0ZSBUYWdsaWJIZWxwZXJDYWNoZSBmQ2FjaGUgPSBuZXcgVGFnbGliSGVscGVyQ2FjaGUoMyk7Ci0KLSAgICBwcml2YXRlIFRhZ2xpYkhlbHBlck1hbmFnZXIoKSB7Ci0gICAgICAgIC8vIHVzZSBpbnN0YW5jZQotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCBUYWdsaWJIZWxwZXJNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotICAgICAgICBpZihpbnN0YW5jZSA9PSBudWxsKQotICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgVGFnbGliSGVscGVyTWFuYWdlcigpOwotICAgICAgICByZXR1cm4gaW5zdGFuY2U7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBUYWdsaWJIZWxwZXIgZ2V0VGFnbGliSGVscGVyKElGaWxlIGYpIHsKLSAgICAgICAgSVByb2plY3QgcCA9IGYuZ2V0UHJvamVjdCgpOwotICAgICAgICByZXR1cm4gZ2V0SGVscGVyRnJvbUNhY2hlKHApOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvamVjdFBhdGgKLSAgICAgKi8KLSAgICBwcml2YXRlIFRhZ2xpYkhlbHBlciBnZXRIZWxwZXJGcm9tQ2FjaGUoSVByb2plY3QgcHJvamVjdCkgewotICAgICAgICByZXR1cm4gZkNhY2hlLmdldEhlbHBlcihwcm9qZWN0KTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVXBkYXRlIGNsYXNzcGF0aCBmb3IgYXBwcm9wcmlhdGUgbG9hZGVyLgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUVsZW1lbnRDaGFuZ2VkTGlzdGVuZXIjZWxlbWVudENoYW5nZWQob3JnLmVjbGlwc2UuamR0LmNvcmUuRWxlbWVudENoYW5nZWRFdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGNsYXNzcGF0aCBjaGFuZ2VzCi0gICAgICAgIElKYXZhRWxlbWVudERlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLSAgICAgICAgaWYoZGVsdGEuZ2V0RWxlbWVudCgpLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfTU9ERUwpIHsKLSAgICAgICAgICAgIElKYXZhRWxlbWVudERlbHRhW10gY2hhbmdlZCA9IGRlbHRhLmdldENoYW5nZWRDaGlsZHJlbigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VkLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYoKGNoYW5nZWRbaV0uZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgSUphdmFFbGVtZW50IHByb2ogPSBjaGFuZ2VkW2ldLmdldEVsZW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xhc3NwYXRoQ2hhbmdlKGNoYW5nZWQsIGksIHByb2opOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAcGFyYW0gY2hhbmdlZAotICAgICAqIEBwYXJhbSBpCi0gICAgICogQHBhcmFtIHByb2oKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ2xhc3NwYXRoQ2hhbmdlKElKYXZhRWxlbWVudERlbHRhW10gY2hhbmdlZCwgaW50IGksIElKYXZhRWxlbWVudCBwcm9qKSB7Ci0KLSAgICAgICAgaWYocHJvai5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX1BST0pFQ1QpIHsKLSAgICAgICAgICAgIFN0cmluZyBwcm9qZWN0UGF0aCA9IHByb2ouZ2V0UGF0aCgpLnRvU3RyaW5nKCkucmVwbGFjZSgnXFwnLCAnLycpOwotICAgICAgICAgICAgZkNhY2hlLnJlbW92ZUhlbHBlcihwcm9qZWN0UGF0aCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJWYXJpYWJsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YWdsaWIvVGFnbGliVmFyaWFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzZDZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RhZ2xpYi9UYWdsaWJWYXJpYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFnbGliOwotCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlZhcmlhYmxlSW5mbzsKLQotCi0vKioKLSAqIENvbnRhaW5zIGluZm8gYWJvdXQgYSBUYWdsaWJWYXJpYWJsZTogY2xhc3NuYW1lLCB2YXJpYWJsZW5hbWUuCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVGFnbGliVmFyaWFibGUgewotICAgIAotCXByaXZhdGUgU3RyaW5nIGZWYXJDbGFzcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlZhck5hbWUgPSBudWxsOwotCXByaXZhdGUgaW50IGZTY29wZTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFTkRMID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUX0VORCA9ICJBVF9FTkQiOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVF9CRUdJTiA9ICJBVF9CRUdJTiI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5FU1RFRCA9ICJORVNURUQiOwotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBUYWdsaWJWYXJpYWJsZShTdHJpbmcgdmFyQ2xhc3MsIFN0cmluZyB2YXJOYW1lLCBpbnQgc2NvcGUpIHsKLQkJc2V0VmFyQ2xhc3ModmFyQ2xhc3MpOwotCQlzZXRWYXJOYW1lKHZhck5hbWUpOwotCQlzZXRTY29wZShzY29wZSk7Ci0JfQotCi0JcHVibGljIFRhZ2xpYlZhcmlhYmxlKFN0cmluZyB2YXJDbGFzcywgU3RyaW5nIHZhck5hbWUsIFN0cmluZyBzY29wZSkgewotCQlzZXRWYXJDbGFzcyh2YXJDbGFzcyk7Ci0JCXNldFZhck5hbWUodmFyTmFtZSk7Ci0JCXNldFNjb3BlKHNjb3BlKTsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmVmFyQ2xhc3MuCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRWYXJDbGFzcygpIHsKLQkJcmV0dXJuIGZWYXJDbGFzczsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHZhckNsYXNzIFRoZSBmVmFyQ2xhc3MgdG8gc2V0LgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFZhckNsYXNzKFN0cmluZyB2YXJDbGFzcykgewotCQlmVmFyQ2xhc3MgPSB2YXJDbGFzczsKLQl9Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmVmFyTmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldFZhck5hbWUoKSB7Ci0JCXJldHVybiBmVmFyTmFtZTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIHZhck5hbWUgVGhlIGZWYXJOYW1lIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRWYXJOYW1lKFN0cmluZyB2YXJOYW1lKSB7Ci0JCWZWYXJOYW1lID0gdmFyTmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogQ29udmVuaWVuY2UgbWV0aG9kLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldERlY2xhcmF0aW9uU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0VmFyQ2xhc3MoKSArICIgIiArIGdldFZhck5hbWUoKSArICIgPSBudWxsOyIgKyBFTkRMOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0JcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIGZTY29wZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0U2NvcGUoaW50IHNjb3BlKSB7Ci0JCWZTY29wZSA9IHNjb3BlOwotCX0JCi0JcHVibGljIHZvaWQgc2V0U2NvcGUoU3RyaW5nIHNjb3BlU3RyaW5nKSB7Ci0JCWludCBzY29wZSA9IFZhcmlhYmxlSW5mby5BVF9CRUdJTjsKLQkJCi0JCVN0cmluZyB0cmltbWVkU2NvcGUgPSBzY29wZVN0cmluZy50cmltKCk7Ci0JCWlmIChORVNURUQuZXF1YWxzKHRyaW1tZWRTY29wZSkpIHsKLQkJCXNjb3BlID0gVmFyaWFibGVJbmZvLk5FU1RFRDsKLQkJfQotCQllbHNlIGlmIChBVF9CRUdJTi5lcXVhbHModHJpbW1lZFNjb3BlKSkgewotCQkJc2NvcGUgPSBWYXJpYWJsZUluZm8uQVRfQkVHSU47Ci0JCX0KLQkJZWxzZSBpZiAoQVRfRU5ELmVxdWFscyh0cmltbWVkU2NvcGUpKSB7Ci0JCQlzY29wZSA9IFZhcmlhYmxlSW5mby5BVF9FTkQ7Ci0JCX0KLQotCQlmU2NvcGUgPSBzY29wZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Rhc2tzL0pTUEZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC90YXNrcy9KU1BGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhYjUxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3Rhc2tzL0pTUEZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXI7Ci0KLXB1YmxpYyBjbGFzcyBKU1BGaWxlVGFza1NjYW5uZXIgZXh0ZW5kcyBYTUxGaWxlVGFza1NjYW5uZXIgewotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gc3VwZXIuaXNDb21tZW50UmVnaW9uKHJlZ2lvbiwgdGV4dFJlZ2lvbikgfHwgdGV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjU0MzNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQRG9jdW1lbnRIZWFkQ29udGVudERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuSlNQU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciB7Ci0JLy8gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2NS4xLjAsIHdlJ2xsIHJldXNlIFNUX0pTUF9ESVJFQ1RJVkUgZm9yIGFjdGlvbgotCS8vIHRhZ3MKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZFbmFibGVKU1BBY3Rpb25QYXJ0aXRpb25zID0gdHJ1ZTsKLQkvLyBsaXN0IG9mIHZhbGlkIEpTUCAxLjIgdGFnIGFuZCBhY3Rpb24gbmFtZXMKLQlwcml2YXRlIHN0YXRpYyBMaXN0IGZKU1BBY3Rpb25UYWdOYW1lcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTUlNRV9UWVBFID0gInRleHQvaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWEhUTUxfTUlNRV9UWVBFID0gInRleHQveGh0bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9NSU1FX1RZUEUgPSAidGV4dC94bWwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZORF9XQVBfV01MID0gInRleHQvdm5kLndhcC53bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXXtJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCwgSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwsIElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMMiwgSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSwgSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSLCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBLCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBULCBJSlNQUGFydGl0aW9ucy5KU1BfQ09NTUVOVH07Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBmRW1iZWRkZWRQYXJ0aXRpb25lciA9IG51bGw7Ci0JLyoKLQkgKiBTYXZlIGxhc3QgdGFnbGliIHByZWZpeCB0aGF0IHdhcyBjaGVja2VkIChzZWUgaXNBY3Rpb24oKSkgZm9yIGJldHRlcgotCSAqIHBlcmZvcm1hbmNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhc3RDaGVja2VkUHJlZml4ID0gbnVsbDsKLQotCS8qKgotCSAqIEFzc3VtZSBsYW5ndWFnZT1qYXZhIGJ5IGRlZmF1bHQgLi4uIGNsaWVudCwgc3VjaCBhcwotCSAqIFBhZ2VEaXJlY3RpdmVBZGFwdGVyLCBtdXN0IHNldCBsYW5ndWFnZSBvZiBkb2N1bWVudCBwYXJ0aXRpb25lciwKLQkgKiBpZi93aGVuIGl0IGNoYW5nZXMuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxhbmd1YWdlID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSlNQRG9jdW1lbnRQYXJ0aW9uZXIuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JCWlmIChmSlNQQWN0aW9uVGFnTmFtZXMgPT0gbnVsbCkgewotCQkJZkpTUEFjdGlvblRhZ05hbWVzID0gbmV3IEFycmF5TGlzdCgpOyAvLyB1c2VzIC5lcXVhbHMoKSBmb3IKLQkJCS8vIGNvbnRhaW5zKCkKLQkJCWZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVDTEFSQVRJT04pOwotCQkJLy8gZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQkvLyBmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKTsKLQkJCS8vIGZKU1BBY3Rpb25UYWdOYW1lcy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQik7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUldBUkQpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOQ0xVREUpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNUyk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBMVUdJTik7Ci0JCQkvLyBmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSk7Ci0JCQlmSlNQQWN0aW9uVGFnTmFtZXMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFQpOwotCQkJZkpTUEFjdGlvblRhZ05hbWVzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNjb25uZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXN1cGVyLmNvbm5lY3QoZG9jdW1lbnQpOwotCQlmU3VwcG9ydGVkVHlwZXMgPSBudWxsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgY3JlYXRlU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcihJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciByZXN1bHQgPSBudWxsOwotCQkvLyB0aGlzIHNhbWUgZGV0ZWN0b3Igc2hvdWxkIHVuZGVybHkgY29udGVudCBkZXNjcmliZXIsIHRvIGhhdmUgY29uc2lzdGVudCByZXN1bHRzCi0JCUpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvciBqc3BIZWFkQ29udGVudERldGVjdG9yID0gbmV3IEpTUERvY3VtZW50SGVhZENvbnRlbnREZXRlY3RvcigpOwotCQlqc3BIZWFkQ29udGVudERldGVjdG9yLnNldChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJY29udGVudFR5cGUgPSBqc3BIZWFkQ29udGVudERldGVjdG9yLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkvLyBpZiBYSFRNTCBvciBXTUwsIHRoYXQgdHJ1bXBzIHdoYXQgaXMgaW4gdGhlIHBhZ2UgZGlyZWN0aXZlCi0JCQlpZiAoanNwSGVhZENvbnRlbnREZXRlY3Rvci5pc1hIVE1MKCkgfHwganNwSGVhZENvbnRlbnREZXRlY3Rvci5pc1dNTCgpKSB7Ci0JCQkJY29udGVudFR5cGUgPSAidGV4dC9odG1sIjsKLQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dCwgc2luY2Ugd29ya2luZyB3aXRoIGRvY3VtZW50IHN0cmVhbQotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCS8vIG51bGwgb3IgZW1wdHksIHRyZWF0IGFzICJkZWZhdWx0IgotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCBjb250ZW50VHlwZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQljb250ZW50VHlwZSA9ICJ0ZXh0L2h0bWwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gd2UgY3VycmVudGx5IG9ubHkgaGF2ZSB0d28gLi4uIGV2ZW50dWFsbHkgc2hvdWxkCi0JCS8vIG1ha2Ugb3IgdGllLWluIHRvIGV4aXN0aW5nIHJlZ2lzdHJ5LgotCQlpZiAoY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShIVE1MX01JTUVfVFlQRSkgfHwgY29udGVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZShWTkRfV0FQX1dNTCkpIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhIVE1MX01JTUVfVFlQRSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKFhNTF9NSU1FX1RZUEUpIHx8IGNvbnRlbnRUeXBlLmVuZHNXaXRoKCIreG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKTsKLQkJCXJlc3VsdC5jb25uZWN0KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcigpOwotCQkJcmVzdWx0LmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2Rpc2Nvbm5lY3QoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0JCWlmIChmRW1iZWRkZWRQYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lci5kaXNjb25uZWN0KCk7Ci0JCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkwOQotCQkJLyoqCi0JCQkgKiBmb3JjZSByZWNyZWF0aW9uIHdoZW4gcmVjb25uZWN0ZWQKLQkJCSAqLwotCQkJZkVtYmVkZGVkUGFydGl0aW9uZXIgPSBudWxsOwotCQl9Ci0JCS8vIHN1cGVyLmRpc2Nvbm5lY3Qgc2hvdWxkIGNvbWUgYXQgZW5kLCBzaW5jZSBpdCAobWF5KSBzZXQKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50IHRvIG51bGwKLQkJc3VwZXIuZGlzY29ubmVjdCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbWJlZGRlZFBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpIHsKLQkJaWYgKGZFbWJlZGRlZFBhcnRpdGlvbmVyID09IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyID0gY3JlYXRlU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcihmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmNvbm5lY3QoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQotCQlyZXR1cm4gZkVtYmVkZGVkUGFydGl0aW9uZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFuZ3VhZ2UuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCkgewotCQlyZXR1cm4gZkxhbmd1YWdlOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRMb2NhbExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlMaXN0IHR5cGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlPYmplY3RbXSBjb25maWd1cmVkVHlwZXMgPSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJlZFR5cGVzLmxlbmd0aDsgaSsrKQotCQkJdHlwZXMuYWRkKGNvbmZpZ3VyZWRUeXBlc1tpXSk7Ci0JCXJldHVybiB0eXBlczsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQYXJlbnROYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICJVTktOT1dOIjsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAoc2RSZWdpb24gIT0gbnVsbCAmJiBpc1ZhbGlkSnNwQWN0aW9uUmVnaW9uVHlwZShzZFJlZ2lvbi5nZXRUeXBlKCkpKQotCQkJc2RSZWdpb24gPSBzZFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCi0JCWlmIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCS8vIG9ubHkgZmluZCBwYXJlbnQgbmFtZXMgZnJvbSBhIHN0YXJ0IHRhZwotCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gMSkgewotCQkJCUlUZXh0UmVnaW9uIHIgPSByZWdpb25zLmdldCgxKTsKLQkJCQlpZiAocmVnaW9ucy5nZXQoMCkuZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgJiYgci5nZXRUeXBlKCkuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSkgewotCQkJCQlyZXN1bHQgPSBzZFJlZ2lvbi5nZXRUZXh0KHIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShGb3JlaWduUmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJZmluYWwgU3RyaW5nIHJlZ2lvbl90eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlRm9yRG9jdW1lbnRMYW5ndWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTiB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSkKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfQ0xPU0UpCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVI7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQ7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9PUEVOIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DT05URU5UIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9DTE9TRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfRFFVT1RFIHx8IHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FTF9TUVVPVEUgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX1FVT1RFRF9DT05URU5UKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUw7Ci0JCWVsc2UgaWYgKHJlZ2lvbl90eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9WQkxfT1BFTiB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX0NPTlRFTlQgfHwgcmVnaW9uX3R5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1ZCTF9DTE9TRSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX0RRVU9URSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX1NRVU9URSB8fCByZWdpb25fdHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfVkJMX1FVT1RFRF9DT05URU5UKQotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwyOwotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUKSB7Ci0JCQkvLyBCVUcxMzE0NjM6IHBvc3NpYmx5IGJldHdlZW4gPGpzcDpzY3JpcHRsZXQ+LCA8anNwOmV4cHJlc3Npb24+LAotCQkJLy8gPGpzcDpkZWNsYXJhdGlvbj4KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSB0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChpc0pzcEphdmFBY3Rpb25OYW1lKGdldFBhcmVudE5hbWUoc2RSZWdpb24pKSkKLQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlRm9yRG9jdW1lbnRMYW5ndWFnZSgpOwotCQkJZWxzZQotCQkJCXJlc3VsdCA9IGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKS5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25fdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQkvLyBwb3NzaWJseSBiZXR3ZWVuIDxqc3A6c2NyaXB0bGV0PiwgPGpzcDpleHByZXNzaW9uPiwKLQkJCS8vIDxqc3A6ZGVjbGFyYXRpb24+Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gdGhpcy5mU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAoaXNKc3BKYXZhQWN0aW9uTmFtZShnZXRQYXJlbnROYW1lKHNkUmVnaW9uKSkpCi0JCQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZUZvckRvY3VtZW50TGFuZ3VhZ2UoKTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGUocmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSkgewotCQlyZXR1cm4gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVGb3JEb2N1bWVudExhbmd1YWdlKCkgewotCQlTdHJpbmcgcmVzdWx0OwotCQlpZiAoZkxhbmd1YWdlID09IG51bGwgfHwgZkxhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UoImphdmEiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBOwotCQl9Ci0JCWVsc2UgaWYgKGZMYW5ndWFnZS5lcXVhbHNJZ25vcmVDYXNlKCJqYXZhc2NyaXB0IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IElKU1BQYXJ0aXRpb25zLkpTUF9TQ1JJUFRfUFJFRklYICsgZ2V0TGFuZ3VhZ2UoKS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCUxpc3QgY29tYmluZWRUeXBlcyA9IGdldExvY2FsTGVnYWxDb250ZW50VHlwZXMoKTsKLQkJaWYgKGdldEVtYmVkZGVkUGFydGl0aW9uZXIoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSBtb3JlVHlwZXMgPSBnZXRFbWJlZGRlZFBhcnRpdGlvbmVyKCkuZ2V0TGVnYWxDb250ZW50VHlwZXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9yZVR5cGVzLmxlbmd0aDsgaSsrKQotCQkJCWNvbWJpbmVkVHlwZXMuYWRkKG1vcmVUeXBlc1tpXSk7Ci0JCX0KLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1swXTsKLQkJY29tYmluZWRUeXBlcy50b0FycmF5KGZTdXBwb3J0ZWRUeXBlcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBY3Rpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlpZiAoIXNkUmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvKgotCQkgKiBzaG91bGRuJ3QgZ2V0IGEgdGFnIG5hbWUgcmVnaW9uIHR5cGUgdW5sZXNzIGEgdGFnIG5hbWUgcmVnaW9uCi0JCSAqIGV4aXN0cyBhdCBbMV0KLQkJICovCi0JCUlUZXh0UmVnaW9uIHRhZ05hbWVSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQlTdHJpbmcgdGFnTmFtZSA9IHNkUmVnaW9uLmdldFRleHQodGFnTmFtZVJlZ2lvbik7Ci0KLQkJUmVnaW9uUGFyc2VyIHBhcnNlciA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCk7Ci0JCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBKU1BTb3VyY2VQYXJzZXIpIHsKLQkJCWlmICh0YWdOYW1lLmVxdWFscyhmTGFzdENoZWNrZWRQcmVmaXgpKQotCQkJCXJldHVybiB0cnVlOwotCQkJTGlzdCBmQ3VzdG9tQWN0aW9uUHJlZml4ZXMgPSAoKEpTUFNvdXJjZVBhcnNlcikgcGFyc2VyKS5nZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZDdXN0b21BY3Rpb25QcmVmaXhlcy5zaXplKCk7IGkrKykKLQkJCQlpZiAodGFnTmFtZS5zdGFydHNXaXRoKCgoVGFnTWFya2VyKSBmQ3VzdG9tQWN0aW9uUHJlZml4ZXMuZ2V0KGkpKS5nZXRUYWdOYW1lKCkpKSB7Ci0JCQkJCWZMYXN0Q2hlY2tlZFByZWZpeCA9IHRhZ05hbWU7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElUZXh0UmVnaW9uIGNvbnRhaW5lZENoaWxkUmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyBkb2N1bWVudFJlZ2lvbkNvbnRleHQgPSBzZFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChjb250YWluZWRDaGlsZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZG9jdW1lbnRSZWdpb25Db250ZXh0LmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHx8IGRvY3VtZW50UmVnaW9uQ29udGV4dC5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUpKSB7Ci0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBjb250YWluZWRDaGlsZFJlZ2lvbi5nZXRMZW5ndGgoKSwgSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTEzMzQ2Ci0JCQlpZiAoZkVuYWJsZUpTUEFjdGlvblBhcnRpdGlvbnMgJiYgaXNBY3Rpb24oc2RSZWdpb24sIG9mZnNldCkgJiYgIShjb250YWluZWRDaGlsZFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkgewotCQkJCS8vIGlmIChmRW5hYmxlSlNQQWN0aW9uUGFydGl0aW9ucyAmJiBpc0FjdGlvbihzZFJlZ2lvbiwKLQkJCQkvLyBvZmZzZXQpKSB7Ci0JCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBjb250YWluZWRDaGlsZFJlZ2lvbi5nZXRMZW5ndGgoKSwgSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihzZFJlZ2lvbiwgY29udGFpbmVkQ2hpbGRSZWdpb24sIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBvc3NpYmxlSnNwSmF2YUFjdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKc3BKYXZhQWN0aW9uTmFtZShTdHJpbmcgcG9zc2libGVKc3BKYXZhQWN0aW9uKSB7Ci0JCXJldHVybiBwb3NzaWJsZUpzcEphdmFBY3Rpb24uZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVExFVCkgfHwgcG9zc2libGVKc3BKYXZhQWN0aW9uLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5FWFBSRVNTSU9OKSB8fCBwb3NzaWJsZUpzcEphdmFBY3Rpb24uZXF1YWxzKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEpzcEFjdGlvblJlZ2lvblR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJLy8gdHJ1ZSBmb3IgYW55dGhpbmcgdGhhdCBjYW4gYmUgd2l0aGluIDxqc3A6c2NyaXB0bGV0PiwKLQkJLy8gPGpzcDpleHByZXNzaW9uPiwgPGpzcDpkZWNsYXJhdGlvbj4KLQkJcmV0dXJuIHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4gfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhUIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0U7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQIGluc3RhbmNlID0gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JKU1AoKTsKLQkJaW5zdGFuY2Uuc2V0RW1iZWRkZWRQYXJ0aXRpb25lcihjcmVhdGVTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKGZTdHJ1Y3R1cmVkRG9jdW1lbnQpKTsKLQkJaW5zdGFuY2Uuc2V0TGFuZ3VhZ2UoZkxhbmd1YWdlKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVtYmVkZGVkUGFydGl0aW9uZXIuCi0JICogCi0JICogQHBhcmFtIGVtYmVkZGVkUGFydGl0aW9uZXIKLQkgKiAgICAgICAgICAgIFRoZSBlbWJlZGRlZFBhcnRpdGlvbmVyIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVtYmVkZGVkUGFydGl0aW9uZXIoSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgZW1iZWRkZWRQYXJ0aXRpb25lcikgewotCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkwOQotCQkvKioKLQkJICogbWFuYWdlIGNvbm5lY3RlZCBzdGF0ZSBvZiBlbWJlZGRlZCBwYXJ0aXRpb25lcgotCQkgKi8KLQkJaWYgKGZFbWJlZGRlZFBhcnRpdGlvbmVyICE9IG51bGwgJiYgZlN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRQYXJ0aXRpb25lci5kaXNjb25uZWN0KCk7Ci0JCX0KLQotCQl0aGlzLmZFbWJlZGRlZFBhcnRpdGlvbmVyID0gZW1iZWRkZWRQYXJ0aXRpb25lcjsKLQotCQlpZiAoZkVtYmVkZGVkUGFydGl0aW9uZXIgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZFbWJlZGRlZFBhcnRpdGlvbmVyLmNvbm5lY3QoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQkvLyBUT0RPOiBuZWVkIHRvIGNhcnJ5IHRoaXMgc2luZ2xlIGluc3RhbmNlIGlkZWEgZnVydGhlciB0byBiZQotCQkvLyBjb21wbGV0ZSwKLQkJLy8gYnV0IGhvcGVmdWxseSB0aGlzIHdpbGwgYmUgbGVzcyBnYXJiYWdlIHRoYW4gYmVmb3JlIChlc3BlY2lhbGx5IGZvcgotCQkvLyBIVE1MLCBYTUwsCi0JCS8vIG5hdHVyYWxseSEpCi0JCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gZ2V0RW1iZWRkZWRQYXJ0aXRpb25lcigpLmNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGFuZ3VhZ2UKLQkgKiAgICAgICAgICAgIFRoZSBsYW5ndWFnZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJdGhpcy5mTGFuZ3VhZ2UgPSBsYW5ndWFnZTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3V0aWwvQ29tbW9uWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMWMyNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0NvbW1vblhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uT3V0cHV0S2V5czsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25YTUwgewotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRG9jdW1lbnRCdWlsZGVyIGdldERvY3VtZW50QnVpbGRlcigpIHsKLQkJRG9jdW1lbnRCdWlsZGVyIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIERvY3VtZW50QnVpbGRlciBnZXREb2N1bWVudEJ1aWxkZXIoYm9vbGVhbiB2YWxpZGF0aW5nKSB7Ci0JCURvY3VtZW50QnVpbGRlciByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBpbnN0YW5jZSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLQkJCWluc3RhbmNlLnNldFZhbGlkYXRpbmcodmFsaWRhdGluZyk7Ci0JCQlpbnN0YW5jZS5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGZhbHNlKTsKLQkJCWluc3RhbmNlLnNldENvYWxlc2NpbmcodHJ1ZSk7Ci0JCQlyZXN1bHQgPSBpbnN0YW5jZS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNlcmlhbGl6ZShEb2N1bWVudCBkb2N1bWVudCwgT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVNvdXJjZSBkb21Tb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCVRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJdHJ5IHsKLQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5FTkNPRElORywgIlVURi0xNiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB1bnN1cHBvcnRlZCBwcm9wZXJ0aWVzCi0JCQl9Ci0JCQlzZXJpYWxpemVyLnRyYW5zZm9ybShkb21Tb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQob3N0cmVhbSkpOwotCQl9Ci0JCWNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKFRyYW5zZm9ybWVyRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZTMxMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01JbXBsZW1lbnRhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBBbiBYTUwgQ3JlYXRvci9SZWFkZXIvV3JpdGVyIHRoYXQgMSkgSWdub3JlcyBhbnkgRG9jdW1lbnRUeXBlIE5vZGVzIGZvdW5kCi0gKiB3aXRoaW4gdGhlIGRvY3VtZW50IChhcyB3ZWxsIGFzIGFueSBlbnRpdGllcykgMikgSWdub3JlcyBhbnkKLSAqIGVycm9ycy9leGNlcHRpb25zIGZyb20gWGVyY2VzIHdoZW4gbG9hZGluZyBhIGRvY3VtZW50IDMpIENhbiBsb2FkIERvY3VtZW50cwotICogZnJvbSB3aXRoaW4gYSAuSkFSIGZpbGUgKCoqKnJlYWQtb25seSoqKikKLSAqLwotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRQcm92aWRlciB7Ci0JcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQmFzZVJlZmVyZW5jZTsKLQlwcml2YXRlIFN0cmluZyBmaWxlTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZWYWxpZGF0aW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgamFyRmlsZU5hbWUgPSBudWxsOwotCXByaXZhdGUgRW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBOb2RlIHJvb3RFbGVtZW50ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyByb290RWxlbWVudE5hbWUgPSBudWxsOwotCi0JcHVibGljIERvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgX2dldEZpbGVOYW1lKCkgewotCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChpc0pBUigpKSB7Ci0JCQlyZXR1cm4gZ2V0SmFyRmlsZU5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZ2V0RmlsZU5hbWUoKTsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IF9nZXRQYXJzZWREb2N1bWVudERPTTIoKSB7Ci0JCURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBnZXREb2N1bWVudEJ1aWxkZXIoKTsKLQkJCS8vIERPTVBhcnNlciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7Ci0JCQkvLyBwYXJzZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2NvbnRpbnVlLWFmdGVyLWZhdGFsLWVycm9yIiwKLQkJCS8vIGZhbHNlKTsvLyROT04tTkxTLTEkCi0JCQkvLyBwYXJzZXIuc2V0RmVhdHVyZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL25vbnZhbGlkYXRpbmcvbG9hZC1kdGQtZ3JhbW1hciIsCi0JCQkvLyBmYWxzZSk7Ly8kTk9OLU5MUy0xJAotCQkJLy8gcGFyc2VyLnNldEVycm9ySGFuZGxlcihnZXROdWxsRXJyb3JIYW5kbGVyKCkpOwotCQkJLy8gcGFyc2VyLnNldEVudGl0eVJlc29sdmVyKGdldE51bGxFbnRpdHlSZXNvbHZlcigpKTsKLQkJCS8vIGlzID0gZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCWJ1aWxkZXIuc2V0RW50aXR5UmVzb2x2ZXIoZ2V0RW50aXR5UmVzb2x2ZXIoKSk7Ci0JCQlidWlsZGVyLnNldEVycm9ySGFuZGxlcihnZXROdWxsRXJyb3JIYW5kbGVyKCkpOwotCQkJaXMgPSBnZXRJbnB1dFN0cmVhbSgpOwotCQkJaWYgKGlzICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gYnVpbGRlci5wYXJzZShpcywgZ2V0QmFzZVJlZmVyZW5jZSgpKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCQkvLyBwYXJzaW5nIGV4Y2VwdGlvbiwgbm90aWZ5IHRoZSB1c2VyPwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIlNBWEV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3IgIiArIF9nZXRGaWxlTmFtZSgpICsgIiAiICsgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJLy8gTk9UIGFuICJleGNlcHRpb25hbCBjYXNlIjsgZG8gbm90IExvZwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSU9FeGNlcHRpb24gd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yICIgKyBfZ2V0RmlsZU5hbWUoKSArICIgIiArIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChpcyAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaXMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHdoYXQgY2FuIGJlIGRvbmU/Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGZCYXNlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXREb2N1bWVudCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RG9jdW1lbnQoYm9vbGVhbiBjcmVhdGVFbXB0eU9uRmFpbHVyZSkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCWxvYWQoY3JlYXRlRW1wdHlPbkZhaWx1cmUpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBEb2N1bWVudEJ1aWxkZXIgZ2V0RG9jdW1lbnRCdWlsZGVyKCkgewotCQlyZXR1cm4gQ29tbW9uWE1MLmdldERvY3VtZW50QnVpbGRlcihpc1ZhbGlkYXRpbmcoKSk7Ci0JfQotCi0JcHJpdmF0ZSBET01JbXBsZW1lbnRhdGlvbiBnZXREb21JbXBsZW1lbnRhdGlvbigpIHsKLQkJRG9jdW1lbnRCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotCQl0cnkgewotCQkJYnVpbGRlciA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlMSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCX0KLQkJY2F0Y2ggKEZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZTEpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQl9Ci0JCURPTUltcGxlbWVudGF0aW9uIGltcGwgPSBidWlsZGVyLmdldERPTUltcGxlbWVudGF0aW9uKCk7Ci0JCXJldHVybiBpbXBsOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVGFrZXMgYSBzaW5nbGUgc3RyaW5nIG9mIHRoZSBmb3JtICJhL2IvYyIgYW5kIGVuc3VyZXMgdGhhdCB0aGF0Ci0JICogc3RydWN0dXJlIGV4aXN0cyBiZWxvdyB0aGUgaGVhZCBlbGVtZW50LCBkb3duIHRocm91Z2ggJ2MnLCBhbmQgcmV0dXJucwotCSAqIGEgPGVtPnNpbmdsZTwvZW0+IGVsZW1lbnQgJ2MnLiBGb3IgbXVsdGlwbGUgZWxlbWVudHMgKHN1Y2ggYXMKLQkgKiBtdWx0aXBsZSAmbHQ7bWFjcm8mZ3Q7IGVsZW1lbnRzIGNvbnRhaW5lZCB3aXRoaW4gYSBzaW5nbGUKLQkgKiAmbHQ7bWFjcm9zJmd0OyBlbGVtZW50LCBmdWxsIERPTSBhY2Nlc3MgaXMgcmVxdWlyZWQgZm9yIHNlYXJjaGluZyBhbmQKLQkgKiBjaGlsZCBlbGVtZW50IG1hbmlwdWxhdGlvbi4KLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoU3RyaW5nIG5hbWUpIHsKLQkJRWxlbWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCWxvYWQoZmFsc2UpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gKEVsZW1lbnQpIGdldE5vZGUoZ2V0Um9vdEVsZW1lbnQoKSwgbmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVudGl0eVJlc29sdmVyIHRoYXQgd29uJ3QgdHJ5IHRvIGxvYWQgYW5kIHJlc29sdmUgQU5ZCi0JICogZW50aXRpZXMKLQkgKi8KLQlwcml2YXRlIEVudGl0eVJlc29sdmVyIGdldEVudGl0eVJlc29sdmVyKCkgewotCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJcmVzb2x2ZXIgPSBuZXcgRW50aXR5UmVzb2x2ZXIoKSB7Ci0JCQkJcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lELCBTdHJpbmcgc3lzdGVtSUQpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJCQkJSW5wdXRTb3VyY2UgcmVzdWx0ID0gbnVsbDsKLQkJCQkJaWYgKGlzVmFsaWRhdGluZygpKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCVVSTCBzcGVjID0gbmV3IFVSTCgiZmlsZTovLyIgKyBnZXRCYXNlUmVmZXJlbmNlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJVVJMIHVybCA9IG5ldyBVUkwoc3BlYywgc3lzdGVtSUQpOwotCQkJCQkJCWlmICh1cmwuZ2V0UHJvdG9jb2woKS5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJCQkJCXJlc3VsdCA9IG5ldyBJbnB1dFNvdXJjZShzeXN0ZW1JRCAhPSBudWxsID8gc3lzdGVtSUQgOiAiL18iICsgdG9TdHJpbmcoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJcmVzdWx0LnNldFB1YmxpY0lkKHB1YmxpY0lEKTsKLQkJCQkJCQkJcmVzdWx0LnNldEJ5dGVTdHJlYW0oY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlyZXN1bHQgPSBudWxsOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSk7Ci0JCQkJCQlyZXN1bHQuc2V0UHVibGljSWQocHVibGljSUQpOwotCQkJCQkJcmVzdWx0LnNldFN5c3RlbUlkKHN5c3RlbUlEICE9IG51bGwgPyBzeXN0ZW1JRCA6ICIvXyIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIHJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7Ci0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuZCBpbnB1dCBzdHJlYW0gdG8gdXNlIGFzIHRoZSBzb3VyY2Ugb2YgdGhlIERvY3VtZW50IDEpIGZyb20KLQkgKiBhbiBJbnB1dFN0cmVhbSBzZXQgb24gdGhpcyBpbnN0YW5jZSAyKSBmcm9tIGEgSkFSIGZpbGUgd2l0aCB0aGUgZ2l2ZW4KLQkgKiBlbnRyeSBuYW1lIDMpIGZyb20gYSBub3JtYWwgZmlsZQotCSAqIAotCSAqIEByZXR1cm4gSW5wdXRTdHJlYW0KLQkgKi8KLQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIHsKLQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQlyZXR1cm4gaW5wdXRTdHJlYW07Ci0JCWVsc2UgaWYgKGlzSkFSKCkpIHsKLQkJCXJldHVybiBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0oZ2V0SmFyRmlsZU5hbWUoKSwgZ2V0RmlsZU5hbWUoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShnZXRGaWxlTmFtZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SmFyRmlsZU5hbWUoKSB7Ci0JCXJldHVybiBqYXJGaWxlTmFtZTsKLQl9Ci0KLQlwcml2YXRlIE5vZGUgZ2V0TmFtZWRDaGlsZChOb2RlIHBhcmVudCwgU3RyaW5nIGNoaWxkTmFtZSkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCU5vZGVMaXN0IGNoaWxkTGlzdCA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRMaXN0LmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmIChjaGlsZExpc3QuaXRlbShpKS5nZXROb2RlTmFtZSgpLmVxdWFscyhjaGlsZE5hbWUpKQotCQkJCXJldHVybiBjaGlsZExpc3QuaXRlbShpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGdldE5ld0RvY3VtZW50KCkgewotCQlEb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0RG9tSW1wbGVtZW50YXRpb24oKS5jcmVhdGVEb2N1bWVudCgiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwgZ2V0Um9vdEVsZW1lbnROYW1lKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHJlc3VsdC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlyZXN1bHQucmVtb3ZlQ2hpbGQoY2hpbGRyZW4uaXRlbShpKSk7Ci0JCQl9Ci0JCQkvLyB3ZSdyZSBnb2luZyB0aHJvdWdoIHRoaXMgZWZmb3J0IHRvIGF2b2lkIGEgTlMgZWxlbWVudAotCQkJRWxlbWVudCBzZXR0aW5ncyA9IHJlc3VsdC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsIGdldFJvb3RFbGVtZW50TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0LmFwcGVuZENoaWxkKHNldHRpbmdzKTsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0JICogVGFrZXMgYSBzaW5nbGUgc3RyaW5nIG9mIHRoZSBmb3JtICJhL2IvYyIgYW5kIGVuc3VyZXMgdGhhdCB0aGF0Ci0JICogc3RydWN0dXJlIGV4aXN0cyBiZWxvdyB0aGUgaGVhZCBlbGVtZW50LCBkb3duIHRocm91Z2ggJ2MnLCBhbmQgcmV0dXJucwotCSAqIHRoZSBlbGVtZW50ICdjJy4KLQkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCXByaXZhdGUgTm9kZSBnZXROb2RlKE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobmFtZSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgdG9rZW4gPSBudWxsOwotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlpZiAoZ2V0TmFtZWRDaGlsZChub2RlLCB0b2tlbikgPT0gbnVsbCkKLQkJCQlub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodG9rZW4pKTsKLQkJCW5vZGUgPSBnZXROYW1lZENoaWxkKG5vZGUsIHRva2VuKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEVycm9ySGFuZGxlciB0aGF0IHdpbGwgbm90IHN0b3AgdGhlIHBhcnNlciBvbiByZXBvcnRlZAotCSAqIGVycm9ycwotCSAqLwotCXByaXZhdGUgRXJyb3JIYW5kbGVyIGdldE51bGxFcnJvckhhbmRsZXIoKSB7Ci0JCWlmIChlcnJvckhhbmRsZXIgPT0gbnVsbCkgewotCQkJZXJyb3JIYW5kbGVyID0gbmV3IEVycm9ySGFuZGxlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZ2V0SmFyRmlsZU5hbWUoKSArICIvIiArIGdldEZpbGVOYW1lKCkgKyAiIChlcnJvcikgd2hpbGUgcmVhZGluZyBkZXNjcmlwdG9yOiAiICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiU0FYUGFyc2VFeGNlcHRpb24gd2l0aCAiICsgZ2V0SmFyRmlsZU5hbWUoKSArICIvIiArIGdldEZpbGVOYW1lKCkgKyAiIChmYXRhbEVycm9yKSB3aGlsZSByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJTQVhQYXJzZUV4Y2VwdGlvbiB3aXRoICIgKyBnZXRKYXJGaWxlTmFtZSgpICsgIi8iICsgZ2V0RmlsZU5hbWUoKSArICIgKHdhcm5pbmcpIHdoaWxlIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIGVycm9ySGFuZGxlcjsKLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50IGdldFBhcnNlZERvY3VtZW50KCkgewotCQlEb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoaW5wdXRTdHJlYW0gPT0gbnVsbCkgewotCQkJRmlsZSBleGlzdGVuY2VUZXN0ZXIgPSBudWxsOwotCQkJaWYgKGlzSkFSKCkpCi0JCQkJZXhpc3RlbmNlVGVzdGVyID0gbmV3IEZpbGUoZ2V0SmFyRmlsZU5hbWUoKSk7Ci0JCQllbHNlCi0JCQkJZXhpc3RlbmNlVGVzdGVyID0gbmV3IEZpbGUoZ2V0RmlsZU5hbWUoKSk7Ci0JCQlpZiAoIWV4aXN0ZW5jZVRlc3Rlci5leGlzdHMoKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJlc3VsdCA9IF9nZXRQYXJzZWREb2N1bWVudERPTTIoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcm9vdCBFbGVtZW50IG9mIHRoZSBjdXJyZW50IGRvY3VtZW50Ci0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIE5vZGUgZ2V0Um9vdEVsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRSb290RWxlbWVudChnZXREb2N1bWVudCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZS9hIHJvb3QgRWxlbWVudCBmb3IgdGhlIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Um9vdEVsZW1lbnQoRG9jdW1lbnQgZG9jKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZG9jLmdldERvY3VtZW50RWxlbWVudCgpICE9IG51bGwpCi0JCQlyZXR1cm4gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOwotCQl0cnkgewotCQkJRWxlbWVudCBuZXdSb290RWxlbWVudCA9IGRvYy5jcmVhdGVFbGVtZW50KGdldFJvb3RFbGVtZW50TmFtZSgpKTsKLQkJCWRvYy5hcHBlbmRDaGlsZChuZXdSb290RWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3Um9vdEVsZW1lbnQ7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFJvb3RFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIHJvb3RFbGVtZW50TmFtZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNKQVIoKSB7Ci0JCXJldHVybiBnZXRKYXJGaWxlTmFtZSgpICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHsKLQkJcmV0dXJuIGZWYWxpZGF0aW5nOwotCX0KLQotCXZvaWQgbG9hZChib29sZWFuIGNyZWF0ZUVtcHR5T25GYWlsdXJlKSB7Ci0JCS8vIHJvb3RFbGVtZW50TmFtZSBhbmQgZmlsZU5hbWUgYXJlIGV4cGVjdGVkIHRvIGJlIGRlZmluZWQgYXQgdGhpcwotCQkvLyBwb2ludAotCQlkb2N1bWVudCA9IGdldFBhcnNlZERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAocm9vdEVsZW1lbnROYW1lICE9IG51bGwpCi0JCQkJcm9vdEVsZW1lbnQgPSBnZXRSb290RWxlbWVudChkb2N1bWVudCk7Ci0JCQllbHNlCi0JCQkJcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJfQotCi0JCWlmIChkb2N1bWVudCA9PSBudWxsIHx8IHJvb3RFbGVtZW50ID09IG51bGwpIHsKLQkJCWlmIChjcmVhdGVFbXB0eU9uRmFpbHVyZSkgewotCQkJCWRvY3VtZW50ID0gZ2V0TmV3RG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQlOb2RlTGlzdCBjaGlsZHJlbiA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQlpZiAoY2hpbGRyZW4uaXRlbShpKS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZ2V0Um9vdEVsZW1lbnROYW1lKCkpKQotCQkJCQkJCXJvb3RFbGVtZW50ID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJfQotCQkJCQlpZiAocm9vdEVsZW1lbnQgPT0gbnVsbCkgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQkJaWYgKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJCQlyb290RWxlbWVudCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlUmVmZXJlbmNlKFN0cmluZyBzdHJpbmcpIHsKLQkJZkJhc2VSZWZlcmVuY2UgPSBzdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0ZpbGVOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmlsZU5hbWUoamF2YS5sYW5nLlN0cmluZyBuZXdGaWxlTmFtZSkgewotCQlmaWxlTmFtZSA9IG5ld0ZpbGVOYW1lOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGlucHV0U3RyZWFtIGZvciB3aGljaCB0byBwcm92aWRlIGEgRG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGlucHV0U3RyZWFtCi0JICogICAgICAgICAgICBUaGUgaW5wdXRTdHJlYW0gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaVN0cmVhbSkgewotCQl0aGlzLmlucHV0U3RyZWFtID0gaVN0cmVhbTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3SmFyRmlsZU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXJGaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld0phckZpbGVOYW1lKSB7Ci0JCWphckZpbGVOYW1lID0gbmV3SmFyRmlsZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1Jvb3RFbGVtZW50TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3RFbGVtZW50TmFtZShqYXZhLmxhbmcuU3RyaW5nIG5ld1Jvb3RFbGVtZW50TmFtZSkgewotCQlyb290RWxlbWVudE5hbWUgPSBuZXdSb290RWxlbWVudE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgewotCQlmVmFsaWRhdGluZyA9IGI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BEaXJlY3RpdmVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BEaXJlY3RpdmVWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjOGY3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRGlyZWN0aXZlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotCi0vKioKLSAqIENoZWNrcyBmb3I6IC0gZHVwbGljYXRlIHRhZ2xpYiBwcmVmaXggdmFsdWVzIGFuZCByZXNlcnZlZCB0YWdsaWIgcHJlZml4Ci0gKiB2YWx1ZXMgaW4gdGhlIHNhbWUgZmlsZQotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BEaXJlY3RpdmVWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBIYXNoTWFwIGZSZXNlcnZlZFByZWZpeGVzID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIEhhc2hNYXAgZlRhZ2xpYlByZWZpeGVzSW5Vc2UgPSBuZXcgSGFzaE1hcCgpOwotCXByaXZhdGUgSGFzaE1hcCBmVGV4dFJlZ2lvblRvRG9jdW1lbnRSZWdpb25NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEpTUERpcmVjdGl2ZVZhbGlkYXRvcigpIHsKLQkJZlJlc2VydmVkUHJlZml4ZXMucHV0KCJqc3AiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoImpzcHgiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoImphdmEiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoImphdmF4IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgCi0JCWZSZXNlcnZlZFByZWZpeGVzLnB1dCgic2VydmxldCIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoInN1biIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQlmUmVzZXJ2ZWRQcmVmaXhlcy5wdXQoInN1bnciLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci5jbGVhbnVwKHJlcG9ydGVyKTsKLQkJZlRhZ2xpYlByZWZpeGVzSW5Vc2UuY2xlYXIoKTsKLQkJZlRleHRSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwLmNsZWFyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbGxlY3RQcmVmaXgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdmFsdWVSZWdpb24sIFN0cmluZyB0YWdsaWJQcmVmaXgpIHsKLQkJZlRleHRSZWdpb25Ub0RvY3VtZW50UmVnaW9uTWFwLnB1dCh2YWx1ZVJlZ2lvbiwgZG9jdW1lbnRSZWdpb24pOwotCi0JCU9iamVjdCBvID0gZlRhZ2xpYlByZWZpeGVzSW5Vc2UuZ2V0KHRhZ2xpYlByZWZpeCk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vIHByZWZpeCBkb2Vzbid0IGV4aXN0LCByZW1lbWJlciBpdAotCQkJZlRhZ2xpYlByZWZpeGVzSW5Vc2UucHV0KHRhZ2xpYlByZWZpeCwgdmFsdWVSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJTGlzdCByZWdpb25MaXN0ID0gbnVsbDsKLQkJCS8vIGFscmVhZHkgYSBMaXN0Ci0JCQlpZiAobyBpbnN0YW5jZW9mIExpc3QpIHsKLQkJCQlyZWdpb25MaXN0ID0gKExpc3QpIG87Ci0JCQl9Ci0JCQkvKgotCQkJICogYSBzaW5nbGUgdmFsdWUgcmVnaW9uLCBjcmVhdGUgYSBuZXcgTGlzdCBhbmQgYWRkIHByZXZpb3VzCi0JCQkgKiB2YWx1ZVJlZ2lvbgotCQkJICovCi0JCQllbHNlIHsKLQkJCQlyZWdpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCXJlZ2lvbkxpc3QuYWRkKG8pOwotCQkJCWZUYWdsaWJQcmVmaXhlc0luVXNlLnB1dCh0YWdsaWJQcmVmaXgsIHJlZ2lvbkxpc3QpOwotCQkJfQotCQkJcmVnaW9uTGlzdC5hZGQodmFsdWVSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVzZXJ2ZWRQcmVmaXgoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZSZXNlcnZlZFByZWZpeGVzLmdldChuYW1lKSAhPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzRGlyZWN0aXZlKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudCBzRG9jLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uKSB7Ci0JCVN0cmluZyBkaXJlY3RpdmVOYW1lID0gZ2V0RGlyZWN0aXZlTmFtZShkb2N1bWVudFJlZ2lvbik7Ci0JCS8vIHdlIG9ubHkgY2FyZSBhYm91dCB0YWdsaWIgZGlyZWN0aXZlCi0JCWlmIChkaXJlY3RpdmVOYW1lLmVxdWFscygidGFnbGliIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKGRvY3VtZW50UmVnaW9uLCBKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUFJFRklYKTsKLQkJCWlmICh2YWx1ZVJlZ2lvbiA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJU3RyaW5nIHRhZ2xpYlByZWZpeCA9IGRvY3VtZW50UmVnaW9uLmdldFRleHQodmFsdWVSZWdpb24pOwotCQkJdGFnbGliUHJlZml4ID0gU3RyaW5nVXRpbHMuc3RyaXBRdW90ZXModGFnbGliUHJlZml4KTsKLQotCQkJY29sbGVjdFByZWZpeChkb2N1bWVudFJlZ2lvbiwgdmFsdWVSZWdpb24sIHRhZ2xpYlByZWZpeCk7Ci0KLQkJCS8vIGNoZWNrIGZvciB0aGUgdXNlIG9mIHJlc2VydmVkIHByZWZpeGVzCi0JCQlpZiAoaXNSZXNlcnZlZFByZWZpeCh0YWdsaWJQcmVmaXgpKSB7Ci0JCQkJU3RyaW5nIG1zZ1RleHQgPSBKU1BDb3JlTWVzc2FnZXMuSlNQRGlyZWN0aXZlVmFsaWRhdG9yXzAgKyB0YWdsaWJQcmVmaXggKyAiJyI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQkJCWludCBzZXYgPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IChmaWxlID09IG51bGwgPyBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIG1zZ1RleHQpIDogbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBtc2dUZXh0LCBmaWxlKSk7Ci0JCQkJaW50IHN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pOwotCQkJCWludCBsZW5ndGggPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJaW50IGxpbmVObyA9IHNEb2MuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCi0JCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBvcnREdXBsaWNhdGVQcmVmaXhlcyhJRmlsZSBmaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nW10gcHJlZml4ZXMgPSAoU3RyaW5nW10pIGZUYWdsaWJQcmVmaXhlc0luVXNlLmtleVNldCgpLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCWZvciAoaW50IHByZWZpeE51bWJlciA9IDA7IHByZWZpeE51bWJlciA8IHByZWZpeGVzLmxlbmd0aDsgcHJlZml4TnVtYmVyKyspIHsKLQkJCU9iamVjdCBvID0gZlRhZ2xpYlByZWZpeGVzSW5Vc2UuZ2V0KHByZWZpeGVzW3ByZWZpeE51bWJlcl0pOwotCQkJLyoKLQkJCSAqIE9ubHkgY2FyZSBpZiBpdCdzIGEgTGlzdCAoYmVjYXVzZSB0aGVyZSB3YXMgbW9yZSB0aGFuIG9uZQotCQkJICogZGlyZWN0aXZlIHdpdGggdGhhdCBwcmVmaXgpCi0JCQkgKi8KLQkJCWlmIChvIGluc3RhbmNlb2YgTGlzdCkgewotCQkJCUxpc3QgdmFsdWVSZWdpb25zID0gKExpc3QpIG87Ci0KLQkJCQlpbnQgc2V2ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCQlTdHJpbmcgbXNnVGV4dCA9IEpTUENvcmVNZXNzYWdlcy5KU1BEaXJlY3RpdmVWYWxpZGF0b3JfMiArIHByZWZpeGVzW3ByZWZpeE51bWJlcl0gKyAiJyI7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCi0JCQkJLy8gUmVwb3J0IGFuIGVycm9yIGluIGFsbCBkaXJlY3RpdmVzIHVzaW5nIHRoaXMgcHJlZml4Ci0JCQkJZm9yIChpbnQgcmVnaW9uTnVtYmVyID0gMDsgcmVnaW9uTnVtYmVyIDwgdmFsdWVSZWdpb25zLnNpemUoKTsgcmVnaW9uTnVtYmVyKyspIHsKLQkJCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSAoSVRleHRSZWdpb24pIHZhbHVlUmVnaW9ucy5nZXQocmVnaW9uTnVtYmVyKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBmVGV4dFJlZ2lvblRvRG9jdW1lbnRSZWdpb25NYXAuZ2V0KHZhbHVlUmVnaW9uKTsKLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gKGZpbGUgPT0gbnVsbCA/IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgbXNnVGV4dCkgOiBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIG1zZ1RleHQsIGZpbGUpKTsKLQkJCQkJbWVzc2FnZSA9IChmaWxlID09IG51bGwgPyBuZXcgTG9jYWxpemVkTWVzc2FnZShzZXYsIG1zZ1RleHQpIDogbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2LCBtc2dUZXh0LCBmaWxlKSk7Ci0KLQkJCQkJLy8gaWYgdGhlcmUncyBhIG1lc3NhZ2UsIHRoZXJlIHdhcyBhbiBlcnJvciBmb3VuZAotCQkJCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc3RhcnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh2YWx1ZVJlZ2lvbik7Ci0JCQkJCQlpbnQgbGVuZ3RoID0gdmFsdWVSZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCQkJCQkJaW50IGxpbmVObyA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQotCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIGJhdGNoIHZhbGlkYXRpb24gY2FsbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gd2hlbiB2YWxpZGF0aW5nIGFuIGVudGlyZSBmaWxlCi0JCS8vIG5lZWQgdG8gY2xlYXIgZHVwZXMgb3IgZWxzZSB5b3UncmUgY29tcGFyaW5nIGJldHdlZW4gZmlsZXMKLQkJZlRhZ2xpYlByZWZpeGVzSW5Vc2UuY2xlYXIoKTsKLQkJcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcyk7Ci0KLQkJLy8gZm9yIGJhdGNoIHZhbGlkYXRpb24KLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZik7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHNNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkvLyBpdGVyYXRlIGFsbCBkb2N1bWVudCByZWdpb25zCi0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQl3aGlsZSAocmVnaW9uICE9IG51bGwgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQkJLy8gb25seSBjaGVja2luZyBkaXJlY3RpdmVzCi0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCQkJcHJvY2Vzc0RpcmVjdGl2ZShyZXBvcnRlciwgZiwgc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQkJCQl9Ci0JCQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJfQotCi0JCQkJaWYoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQkJcmVwb3J0RHVwbGljYXRlUHJlZml4ZXMoZiwgcmVwb3J0ZXIsIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEVMVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQzMmVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQRUxWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb21kb2N1bWVudC5ET01Nb2RlbEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5KU1BFTFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5Ub2tlbk1nckVycm9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgSlNQRUxWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmaWxlLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCWlmICghcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCURPTU1vZGVsRm9ySlNQIGpzcE1vZGVsID0gKERPTU1vZGVsRm9ySlNQKSBtb2RlbDsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2MgPSBqc3BNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1ck5vZGUgPSBzdHJ1Y3R1cmVkRG9jLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJd2hpbGUgKG51bGwgIT0gY3VyTm9kZSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCQlpZiAoY3VyTm9kZS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUICYmIGN1ck5vZGUuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgJiYgY3VyTm9kZS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQkJCXZhbGlkYXRlUmVnaW9uQ29udGFpbmVyKGN1ck5vZGUsIHJlcG9ydGVyLCBmaWxlKTsKLQkJCQkJfQotCQkJCQljdXJOb2RlID0gY3VyTm9kZS5nZXROZXh0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG51bGwgIT0gbW9kZWwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVSZWdpb25Db250YWluZXIoSVRleHRSZWdpb25Db2xsZWN0aW9uIGNvbnRhaW5lciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlKSB7Ci0JCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXJSZWdpb24gPSBjb250YWluZXI7Ci0JCUl0ZXJhdG9yIHJlZ2lvbnMgPSBjb250YWluZXJSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlICE9IG51bGwgJiYgcmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudFJlZ2lvbiA9ICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24pOwotCQkJCUl0ZXJhdG9yIGNoaWxkUmVnaW9ucyA9IHBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoY2hpbGRSZWdpb25zLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBjaGlsZFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgY2hpbGRSZWdpb25zLm5leHQoKTsKLQkJCQkJaWYgKGNoaWxkUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRUxfQ09OVEVOVCkKLQkJCQkJCXZhbGlkYXRlWE1MTm9kZShwYXJlbnRSZWdpb24sIGNoaWxkUmVnaW9uLCByZXBvcnRlciwgZmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVYTUxOb2RlKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBjb250YWluZXIsIElUZXh0UmVnaW9uIHJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBlbFRleHQgPSBjb250YWluZXIuZ2V0VGV4dChyZWdpb24pOwotCQlKU1BFTFBhcnNlciBlbFBhcnNlciA9IEpTUEVMUGFyc2VyLmNyZWF0ZVBhcnNlcihlbFRleHQpOwotCQlpbnQgY29udGVudFN0YXJ0ID0gY29udGFpbmVyLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCWludCBjb250ZW50TGVuZ3RoID0gY29udGFpbmVyLmdldExlbmd0aCgpOwotCQl0cnkgewotCQkJZWxQYXJzZXIuRXhwcmVzc2lvbigpOwotCQl9Ci0JCWNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0JCQlUb2tlbiBjdXJUb2sgPSBlLmN1cnJlbnRUb2tlbjsKLQkJCWludCBwcm9ibGVtU3RhcnRPZmZzZXQgPSBjb250ZW50U3RhcnQgKyBjdXJUb2suYmVnaW5Db2x1bW47Ci0JCQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIEpTUENvcmVNZXNzYWdlcy5KU1BFTF9TeW50YXgpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQocHJvYmxlbVN0YXJ0T2Zmc2V0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGN1clRvay5lbmRDb2x1bW4gLSBjdXJUb2suYmVnaW5Db2x1bW4gKyAxKTsKLQkJCW1lc3NhZ2Uuc2V0VGFyZ2V0T2JqZWN0KGZpbGUpOwotCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtZXNzYWdlKTsKLQkJfQotCQljYXRjaCAoVG9rZW5NZ3JFcnJvciB0ZSkgewotCQkJTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZLCBKU1BDb3JlTWVzc2FnZXMuSlNQRUxfVG9rZW4pOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoY29udGVudFN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGNvbnRlbnRMZW5ndGgpOwotCQkJbWVzc2FnZS5zZXRUYXJnZXRPYmplY3QoZmlsZSk7Ci0JCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEphdmFWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9KU1BKYXZhVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMDRmOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUEphdmFWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLklQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotcHVibGljIGNsYXNzIEpTUEphdmFWYWxpZGF0b3IgZXh0ZW5kcyBKU1BWYWxpZGF0b3IgewotCQotCS8qKgotCSAqIFZhbGlkYXRlIG9uZSBmaWxlLiBJdCdzIGFzc3VtZWQgdGhhdCB0aGUgZmlsZSBoYXMgSlNQIGNvbnRlbnQgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlRmlsZShJRmlsZSBmLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBnZXQganNwIG1vZGVsLCBnZXQgdHJhbmxzYXRpb24KLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZik7Ci0JCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgbW9kZWw7Ci0KLQkJCQkJc2V0dXBBZGFwdGVyRmFjdG9yeShkb21Nb2RlbCk7Ci0JCQkJCUlET01Eb2N1bWVudCB4bWxEb2MgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgdHJhbnNsYXRpb25BZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQkJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQotCQkJCQlpZiAoIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpIHsKLQkJCQkJCXRyYW5zbGF0aW9uLnNldFByb2JsZW1Db2xsZWN0aW5nQWN0aXZlKHRydWUpOwotCQkJCQkJdHJhbnNsYXRpb24ucmVjb25jaWxlQ29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJCQlMaXN0IHByb2JsZW1zID0gdHJhbnNsYXRpb24uZ2V0UHJvYmxlbXMoKTsKLQkJCQkJCS8vIHJlbW92ZSBvbGQgbWVzc2FnZXMKLQkJCQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKHRoaXMsIGYpOwotCQkJCQkJLy8gYWRkIG5ldyBtZXNzYWdlcwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9ibGVtcy5zaXplKCkgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgewotCQkJCQkJCUlNZXNzYWdlIG0gPSBjcmVhdGVNZXNzYWdlRnJvbVByb2JsZW0oKElQcm9ibGVtKSBwcm9ibGVtcy5nZXQoaSksIGYsIHRyYW5zbGF0aW9uLCBkb21Nb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCQkJCQkJaWYgKG0gIT0gbnVsbCkKLQkJCQkJCQkJcmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLCBtKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogV2hlbiBsb2FkaW5nIG1vZGVsIGZyb20gYSBmaWxlLCB5b3UgbmVlZCB0byBleHBsaWNpdGx5IGFkZCBhZGFwdGVyCi0JICogZmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gc20KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBBZGFwdGVyRmFjdG9yeShJU3RydWN0dXJlZE1vZGVsIHNtKSB7Ci0JCWlmIChzbS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcykgPT0gbnVsbCkgewotCQkJSlNQVHJhbnNsYXRpb25BZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbmV3IEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJCXNtLmdldEZhY3RvcnlSZWdpc3RyeSgpLmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBJTWVzc2FnZSBmcm9tIGFuIElQcm9ibGVtCi0JICogCi0JICogQHBhcmFtIHByb2JsZW0KLQkgKiBAcGFyYW0gZgotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jCi0JICogQHJldHVybiBtZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9ibGVtLCBvciBudWxsIGlmIGl0IGNvdWxkIG5vdAotCSAqICAgICAgICAgY3JlYXRlIG9uZQotCSAqLwotCXByaXZhdGUgSU1lc3NhZ2UgY3JlYXRlTWVzc2FnZUZyb21Qcm9ibGVtKElQcm9ibGVtIHByb2JsZW0sIElGaWxlIGYsIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uLCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2MpIHsKLQotCQlpbnQgc291cmNlU3RhcnQgPSB0cmFuc2xhdGlvbi5nZXRKc3BPZmZzZXQocHJvYmxlbS5nZXRTb3VyY2VTdGFydCgpKTsKLQkJaW50IHNvdXJjZUVuZCA9IHRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChwcm9ibGVtLmdldFNvdXJjZUVuZCgpKTsKLQkJaWYgKHNvdXJjZVN0YXJ0ID09IC0xKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQkvLyBsaW5lIG51bWJlciBmb3IgbWFya2VyIHN0YXJ0cyBAIDEKLQkJLy8gbGluZSBudW1iZXIgZnJvbSBkb2N1bWVudCBzdGFydHMgQCAwCi0JCWludCBsaW5lTm8gPSBzdHJ1Y3R1cmVkRG9jLmdldExpbmVPZk9mZnNldChzb3VyY2VTdGFydCkgKyAxOwotCi0JCWludCBzZXYgPSBwcm9ibGVtLmlzRXJyb3IoKSA/IElNZXNzYWdlLkhJR0hfU0VWRVJJVFkgOiBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0KLQkJSU1lc3NhZ2UgbSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKHNldiwgcHJvYmxlbS5nZXRNZXNzYWdlKCksIGYpOwotCi0JCW0uc2V0TGluZU5vKGxpbmVObyk7Ci0JCW0uc2V0T2Zmc2V0KHNvdXJjZVN0YXJ0KTsKLQkJbS5zZXRMZW5ndGgoc291cmNlRW5kIC0gc291cmNlU3RhcnQgKyAxKTsKLQotCQkvLyBuZWVkIGFkZGl0aW9uYWwgYWRqdXN0bWVudCBmb3IgcHJvYmxlbXMgZnJvbQotCQkvLyBpbmRpcmVjdCAoaW5jbHVkZWQpIGZpbGVzCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTk2MzMKLQkJaWYodHJhbnNsYXRpb24uaXNJbmRpcmVjdChwcm9ibGVtLmdldFNvdXJjZVN0YXJ0KCkpKSB7Ci0JCQlhZGp1c3RJbmRpcmVjdFBvc2l0aW9uKG0sIHRyYW5zbGF0aW9uKTsKLQkJfQotCQkKLQkJcmV0dXJuIG07Ci0JfQotCi0JLyoqCi0JICogQXNzdW1lZCB0aGUgbWVzc2FnZSBvZmZzZXQgaXMgYW4gaW5kaXJlY3QgcG9zaXRpb24uCi0JICogSW4gb3RoZXIgd29yZHMsIGFuIGVycm9yIGZyb20gYW4gaW5jbHVkZWQgZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbQotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGp1c3RJbmRpcmVjdFBvc2l0aW9uKElNZXNzYWdlIG0sIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCQotCQlpZighKHRyYW5zbGF0aW9uIGluc3RhbmNlb2YgSlNQVHJhbnNsYXRpb25FeHRlbnNpb24pKQotCQkJcmV0dXJuOwotCQkKLQkJSURvY3VtZW50IGpzcERvYyA9ICgoSlNQVHJhbnNsYXRpb25FeHRlbnNpb24pdHJhbnNsYXRpb24pLmdldEpzcERvY3VtZW50KCk7Ci0JCWlmKCEoanNwRG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0JCQotCQlJU3RydWN0dXJlZERvY3VtZW50IHNEb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudClqc3BEb2M7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gc0RvYy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKDAsIG0uZ2V0T2Zmc2V0KCkgKyBtLmdldExlbmd0aCgpKTsKLQkJLy8gaXRlcmF0ZSBiYWNrd2FyZHMgdW50aWwgeW91IGhpdCB0aGUgaW5jbHVkZSBkaXJlY3RpdmUKLQkJZm9yKGludCBpPXJlZ2lvbnMubGVuZ3RoLTE7IGk+PTA7IGktLSkgewotCQkJCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnNbaV07Ci0JCQlpZihyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCWlmKGdldERpcmVjdGl2ZU5hbWUocmVnaW9uKS5lcXVhbHMoImluY2x1ZGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCUlUZXh0UmVnaW9uIGZpbGVWYWx1ZVJlZ2lvbiA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKHJlZ2lvbiwgImZpbGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQltLnNldE9mZnNldChyZWdpb24uZ2V0U3RhcnRPZmZzZXQoZmlsZVZhbHVlUmVnaW9uKSk7Ci0JCQkJCW0uc2V0TGVuZ3RoKGZpbGVWYWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vSlNQVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGVlYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0pTUFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVByb3h5VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSlNQRkNvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLklXb3JrYmVuY2hDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogUGVyZm9ybXMgc29tZSBjb21tb24gSlNQIHZhbGlkYXRpb24gdGFza3MKLSAqLwotcHVibGljIGNsYXNzIEpTUFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRF9KU1BfQ09SRSA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkpTUEZDb250ZW50VHlwZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgewotCi0JCXByaXZhdGUgU3RyaW5nIF9tZXNzYWdlID0gbnVsbDsKLQotCQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgewotCQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCQl9Ci0KLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJCXRoaXMoc2V2ZXJpdHksIG1lc3NhZ2VUZXh0LCAoT2JqZWN0KSB0YXJnZXRPYmplY3QpOwotCQl9Ci0KLQkJcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJCXN1cGVyKG51bGwsIHNldmVyaXR5LCBudWxsKTsKLQkJCXNldExvY2FsaXplZE1lc3NhZ2UobWVzc2FnZVRleHQpOwotCQkJc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSB7Ci0JCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2FsaXplZE1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gX21lc3NhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KExvY2FsZSBsLCBDbGFzc0xvYWRlciBjbCkgewotCQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBKU1BGaWxlVmlzaXRvciBpbXBsZW1lbnRzIElSZXNvdXJjZVByb3h5VmlzaXRvciB7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZGaWxlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmQ29udGVudFR5cGVzID0gbnVsbDsKLQkJcHJpdmF0ZSBJUmVwb3J0ZXIgZlJlcG9ydGVyID0gbnVsbDsKLQotCQlwdWJsaWMgSlNQRmlsZVZpc2l0b3IoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCQlmUmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZVByb3h5IHByb3h5KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCS8vIGNoZWNrIHZhbGlkYXRpb24KLQkJCWlmIChmUmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCWlmIChwcm94eS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQotCQkJCWlmIChpc0pTUFR5cGUocHJveHkuZ2V0TmFtZSgpKSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSBwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKTsKLQkJCQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQotCQkJCQkJaWYgKERFQlVHKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKCspIEpTUFZhbGlkYXRvciBhZGRpbmcgZmlsZTogIiArIGZpbGUuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZkZpbGVzLmFkZChmaWxlKTsKLQotCQkJCQkJLy8gZG9uJ3Qgc2VhcmNoIGRlZXBlciBmb3IgZmlsZXMKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIGZpbmFsIElGaWxlW10gZ2V0RmlsZXMoKSB7Ci0JCQlyZXR1cm4gKElGaWxlW10pIGZGaWxlcy50b0FycmF5KG5ldyBJRmlsZVtmRmlsZXMuc2l6ZSgpXSk7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0cyBsaXN0IG9mIGNvbnRlbnQgdHlwZXMgdGhpcyB2aXNpdG9yIGlzIGludGVyZXN0ZWQgaW4KLQkJICogQHJldHVybiBBbGwgSlNQLXJlbGF0ZWQgY29udGVudCB0eXBlcwotCQkgKi8KLQkJcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBnZXRWYWxpZENvbnRlbnRUeXBlcygpIHsKLQkJCWlmIChmQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCQkvLyBjdXJyZW50bHkgImhhcmQtY29kZWQiIHRvIGJlIGpzcCAmIGpzcGYKLQkJCQlmQ29udGVudFR5cGVzID0gbmV3IElDb250ZW50VHlwZVtde1BsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApLCBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQpfTsKLQkJCX0KLQkJCXJldHVybiBmQ29udGVudFR5cGVzOwotCQl9Ci0JCQotCQkvKioKLQkJICogQ2hlY2tzIGlmIGZpbGVOYW1lIGlzIHNvbWUgdHlwZSBvZiBKU1AgKGluY2x1ZGluZyBKU1AgZnJhZ21lbnRzKQotCQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkJICogQHJldHVybiB0cnVlIGlmIGZpbGVuYW1lIGluZGljYXRlcyBzb21lIHR5cGUgb2YgSlNQLCBmYWxzZSBvdGhlcndpc2UKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBpc0pTUFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCQkKLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0VmFsaWRDb250ZW50VHlwZXMoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNBc3NvY2lhdGVkV2l0aChmaWxlTmFtZSk7Ci0JCQkJKytpOwotCQkJfQotCQkJcmV0dXJuIHZhbGlkOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmdbXSB1cmlzID0gaGVscGVyLmdldFVSSXMoKTsKLQkJSVdvcmtzcGFjZVJvb3Qgd3NSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJaWYgKHVyaXMubGVuZ3RoID4gMCkgewotCQkJSUZpbGUgY3VycmVudEZpbGUgPSBudWxsOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmlzLmxlbmd0aCAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKTsgaSsrKSB7Ci0JCQkJY3VycmVudEZpbGUgPSB3c1Jvb3QuZ2V0RmlsZShuZXcgUGF0aCh1cmlzW2ldKSk7Ci0JCQkJaWYgKGN1cnJlbnRGaWxlICE9IG51bGwgJiYgY3VycmVudEZpbGUuZXhpc3RzKCkpIHsKLQkJCQkJaWYoc2hvdWxkVmFsaWRhdGUoY3VycmVudEZpbGUpICYmIGZyYWdtZW50Q2hlY2soY3VycmVudEZpbGUpKSB7Ci0KLQkJCQkJICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLk1FU1NBR0VfSlNQX1ZBTElEQVRJTkdfTUVTU0FHRV9VSV8sIG5ldyBTdHJpbmdbXXtjdXJyZW50RmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KSk7Ci0JCQkJCSAgICByZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJICAgIAotCQkJCQkJdmFsaWRhdGVGaWxlKGN1cnJlbnRGaWxlLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIHVyaXNbaV0gKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkKLQkJCS8vIGlmIHVyaXNbXSBsZW5ndGggMCAtPiB2YWxpZGF0ZSgpIGdldHMgY2FsbGVkIGZvciBlYWNoIHByb2plY3QKLQkJCWlmKGhlbHBlciBpbnN0YW5jZW9mIElXb3JrYmVuY2hDb250ZXh0KSB7Ci0JCQkJCi0JCQkJSVByb2plY3QgcHJvamVjdCA9ICgoSVdvcmtiZW5jaENvbnRleHQpIGhlbHBlcikuZ2V0UHJvamVjdCgpOwotCQkJCUpTUEZpbGVWaXNpdG9yIHZpc2l0b3IgPSBuZXcgSlNQRmlsZVZpc2l0b3IocmVwb3J0ZXIpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIGNvbGxlY3QgYWxsIGpzcCBmaWxlcyBmb3IgdGhlIHByb2plY3QKLQkJCQkJcHJvamVjdC5hY2NlcHQodmlzaXRvciwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCX0KLQkJCQlJRmlsZVtdIGZpbGVzID0gdmlzaXRvci5nZXRGaWxlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmICFyZXBvcnRlci5pc0NhbmNlbGxlZCgpOyBpKyspIHsKLQkJCQkJaWYoc2hvdWxkVmFsaWRhdGUoZmlsZXNbaV0pICYmIGZyYWdtZW50Q2hlY2soZmlsZXNbaV0pKSB7Ci0JCQkJCQkKLQkJCQkJICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgTkxTLmJpbmQoSlNQQ29yZU1lc3NhZ2VzLk1FU1NBR0VfSlNQX1ZBTElEQVRJTkdfTUVTU0FHRV9VSV8sIG5ldyBTdHJpbmdbXXtmaWxlc1tpXS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KSk7Ci0JCQkJCSAgICByZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLQkJCQkJICAgIAotCQkJCQkJdmFsaWRhdGVGaWxlKGZpbGVzW2ldLCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQkJaWYgKERFQlVHKQotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJ2YWxpZGF0aW5nOiBbIiArIGZpbGVzW2ldICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgb25lIGZpbGUuIEl0J3MgYXNzdW1lZCB0aGF0IHRoZSBmaWxlIGhhcyBKU1AgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBmCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVGaWxlKElGaWxlIGYsIElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBzdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgKGZvciBiYXRjaCB2YWxpZGF0aW9uKQotCX0KLQkKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gc2RyCi0JICogQHJldHVybiB0aGUganNwIGRpcmVjdGl2ZSBuYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXJlY3RpdmVOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RyKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJSVRleHRSZWdpb25MaXN0IHN1YlJlZ2lvbnMgPSBzZHIuZ2V0UmVnaW9ucygpOwotCQlmb3IgKGludCBqID0gMDsgaiA8IHN1YlJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHN1YlJlZ2lvbiA9IHN1YlJlZ2lvbnMuZ2V0KGopOwotCQkJaWYoc3ViUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUpIHsKLQkJCQluYW1lID0gc2RyLmdldFRleHQoc3ViUmVnaW9uKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHNkcgotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqIEByZXR1cm4gdGhlIElUZXh0UmVnaW9uIGZvciB0aGUgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBnaXZlbiBhdHRyaWJ1dGUgbmFtZSwgY2FzZSBzZW5zaXRpdmUsIG51bGwgaWYgbm8gbWF0Y2hpbmcgYXR0cmlidXRlIGlzIGZvdW5kCi0JICovCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RyLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3Qgc3ViUmVnaW9ucyA9IHNkci5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3ViUmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gc3ViUmVnaW9uID0gc3ViUmVnaW9ucy5nZXQoaSk7Ci0JCQlpZihzdWJSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSAmJiBzZHIuZ2V0VGV4dChzdWJSZWdpb24pLmVxdWFscyhhdHRyTmFtZSkpIHsKLQkJCQlmb3IoaW50IGo9aTsgajxzdWJSZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQkJCXN1YlJlZ2lvbiA9IHN1YlJlZ2lvbnMuZ2V0KGopOwotCQkJCQlpZihzdWJSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQkJCXZhbHVlUmVnaW9uID0gc3ViUmVnaW9uOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbHVlUmVnaW9uOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RyLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJSVRleHRSZWdpb24gciA9IGdldEF0dHJpYnV0ZVZhbHVlUmVnaW9uKHNkciwgYXR0ck5hbWUpOwotCQlpZihyICE9IG51bGwpCi0JCQlyZXR1cm4gc2RyLmdldFRleHQocikudHJpbSgpOwotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGZpbGUgaXMganNwIGZyYWdtZW50IG9yIG5vdCAoZG9lcyBhIGRlZXAsIAotCSAqIGluZGVwdGggY2hlY2ssIGxvb2tpbmcgaW50byBjb250ZW50cyBvZiBmaWxlKQotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBhc3N1bWVzIGZpbGUgaXMgbm90IG51bGwgYW5kIGV4aXN0cwotCSAqIEByZXR1cm4gdHJ1ZSBpZiBmaWxlIGlzIGpzcCBmcmFnbWVudCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRnJhZ21lbnQoSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGlzRnJhZ21lbnQgPSBmYWxzZTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotCQl0cnkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkvLyBpdCBjYW4gYmUgbnVsbAotCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJCQlpcyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQkJY29udGVudERlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoaXMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJCX0KLQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGZpbGVDdElkID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCkuZ2V0SWQoKTsKLQkJCQkJaXNGcmFnbWVudCA9IChmaWxlQ3RJZCAhPSBudWxsICYmIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1BGUkFHTUVOVC5lcXVhbHMoZmlsZUN0SWQpKTsKLQkJCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlnbm9yZSwgYXNzdW1lIGl0J3MgaW52YWxpZCBKU1AKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUsIGFzc3VtZSBpdCdzIGludmFsaWQgSlNQCi0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBtdXN0IGNsb3NlIGlucHV0IHN0cmVhbSBpbiBjYXNlIG90aGVycyBuZWVkIGl0Ci0JCQlpZiAoaXMgIT0gbnVsbCkKLQkJCQl0cnkgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gbm90IHN1cmUgaG93IHRvIHJlY292ZXIgYXQgdGhpcyBwb2ludAotCQkJCX0KLQkJfQotCQlyZXR1cm4gaXNGcmFnbWVudDsKLQl9Ci0JCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFZhbGlkYXRlKElGaWxlIGZpbGUpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZmlsZTsKLQkJZG8gewotCQkJaWYgKHJlc291cmNlLmlzRGVyaXZlZCgpIHx8IHJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSB8fCAhcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkgfHwgcmVzb3VyY2UuZ2V0TmFtZSgpLmNoYXJBdCgwKSA9PSAnLicpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQl9Ci0JCXdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBmb3IgZGVidWdnaW5nCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3B2YWxpZGF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRyA9IHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzSWdub3JlQ2FzZSgidHJ1ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCSAKLQkvKioKLQkgKiBDaGVja3MgaWYgZmlsZSBpcyBhIGpzcCBmcmFnbWVudCBvciBub3QuICBJZiBzbywgY2hlY2sgaWYgdGhlIAotCSAqIGZyYWdtZW50IHNob3VsZCBiZSB2YWxpZGF0ZWQgb3Igbm90LgotCSAqIAotCSAqIEBwYXJhbSBmaWxlCi0JICogICAgICAgICAgICBBc3N1bWVzIHNob3VsZFZhbGlkYXRlIHdhcyBhbHJlYWR5IGNhbGxlZCBvbiBmaWxlIHNvIGl0Ci0JICogICAgICAgICAgICBzaG91bGQgbm90IGJlIG51bGwgYW5kIGRvZXMgZXhpc3QKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGZpbGUgaXMgYSBmcmFnbWVudCBhbmQgaXQgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIAotCSAqIHRydWUgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZyYWdtZW50Q2hlY2soSUZpbGUgZmlsZSkgewotCQlib29sZWFuIHNob3VsZFZhbGlkYXRlID0gdHJ1ZTsKLQkJLy8gcXVpY2sgY2hlY2sgdG8gc2VlIGlmIHRoaXMgaXMgcG9zc2libHkgYSBqc3AgZnJhZ21lbnQKLQkJaWYgKGdldEpTUEZDb250ZW50VHlwZSgpLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpKSB7Ci0JCQkvLyBnZXQgcHJlZmVyZW5jZSBmb3IgdmFsaWRhdGUganNwIGZyYWdtZW50cwotCQkJYm9vbGVhbiBzaG91bGRWYWxpZGF0ZUZyYWdtZW50cyA9IEJvb2xlYW4udmFsdWVPZihKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgZmlsZSwgdHJ1ZSkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJLyoKLQkJCSAqIGlmIGpzcCBmcmFnbWVudHMgc2hvdWxkIG5vdCBiZSB2YWxpZGF0ZWQsIGNoZWNrIGlmIGZpbGUgaXMgcmVhbGx5Ci0JCQkgKiBqc3AgZnJhZ21lbnQKLQkJCSAqLwotCQkJaWYgKCFzaG91bGRWYWxpZGF0ZUZyYWdtZW50cykgewotCQkJCWJvb2xlYW4gaXNGcmFnbWVudCA9IGlzRnJhZ21lbnQoZmlsZSk7Ci0JCQkJc2hvdWxkVmFsaWRhdGUgPSAhaXNGcmFnbWVudDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc2hvdWxkVmFsaWRhdGU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgSlNQIGZyYWdtZW50IGNvbnRlbnQgdHlwZQotCSAqIEByZXR1cm4ganNwZiBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIElDb250ZW50VHlwZSBnZXRKU1BGQ29udGVudFR5cGUoKSB7Ci0JCWlmIChmSlNQRkNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZKU1BGQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQRlJBR01FTlQpOwotCQl9Ci0JCXJldHVybiBmSlNQRkNvbnRlbnRUeXBlOwotCX0KLQkgCi0JIHB1YmxpYyBJU2NoZWR1bGluZ1J1bGUgZ2V0U2NoZWR1bGluZ1J1bGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JIAotCSBwdWJsaWMgSVN0YXR1cyB2YWxpZGF0ZUluSm9iKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeXsKLQkJCXZhbGlkYXRlKGhlbHBlciwgcmVwb3J0ZXIpOwotCQl9Ci0JCWNhdGNoIChWYWxpZGF0aW9uRXhjZXB0aW9uIGUpewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgUExVR0lOX0lEX0pTUF9DT1JFLCBJU3RhdHVzLkVSUk9SLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgIGUpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvRUxQcm9ibGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2pzcGVsL0VMUHJvYmxlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTk5MDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvRUxQcm9ibGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IEJFQSBTeXN0ZW1zIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgQkVBIFN5c3RlbXMgLSBpbml0aWFsIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotCi1wdWJsaWMgY2xhc3MgRUxQcm9ibGVtIHsKLQlwcml2YXRlIFBvc2l0aW9uIGZQb3M7Ci0JcHJpdmF0ZSBTdHJpbmcgZk1lc3NhZ2U7Ci0JCi0JcHVibGljIEVMUHJvYmxlbShQb3NpdGlvbiBwb3MsIFN0cmluZyBtZXNzYWdlKQl7Ci0JCWZQb3MgPSBwb3M7Ci0JCWZNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gZk1lc3NhZ2U7Ci0JfQotCQotCi0JcHVibGljIFBvc2l0aW9uIGdldFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZlBvczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL2pzcGVsL0lKU1BFTFRyYW5zbGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvSUpTUEVMVHJhbnNsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzU2MmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvanNwZWwvSUpTUEVMVHJhbnNsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBCRUEgU3lzdGVtcyBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIEJFQSBTeXN0ZW1zIC0gaW5pdGlhbCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUEVMVHJhbnNsYXRvciB7Ci0KLQkvKioKLQkgKiBUbyBvdmVycmlkZSB0aGUgRUwgdHJhbnNsYXRpb24sIHBsZWFzZSBzZWUgdGhlIGV4dGVuc2lvbiBwb2ludCAKLQkgKiBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuZWx0cmFuc2xhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBlbFRleHQgIFRoZSB0ZXh0IHRvIGJlIHRyYW5zbGF0ZWQuCi0JICogQHBhcmFtIGRlbGltCVRoZSBzdGFydGluZyBkZWxpbWl0ZXIKLQkgKiBAcGFyYW0gY3VycmVudE5vZGUgVGhlIGN1cnJlbnQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb250ZW50U3RhcnQgVGhlIHN0YXJ0aW5nIG9mZnNldCBvZiB0aGUgRUwgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIFRoZSBsZW5ndGggb2YgdGhlIEVMIGNvbnRlbnQgdG8gYmUgdHJhbnNsYXRlZAotCSAqIEBwYXJhbSBmVXNlckVMRXhwcmVzc2lvbnMgQSBzdHJpbmcgYnVmZmVyIHRvIHdoaWNoIGdlbmVyYXRlZCBjb2RlIGNhbiBiZSBhcHBlbmRlZC4KLQkgKgkJVGhlIHRleHQgYXBwZW5kZWQgaGVyZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlIGdlbmVyYXRlZCBjbGFzcyBhdCB0aGUgdG9wIGxldmVsIAotCSAqCQlub3QgYXQgdGhlIHBvaW50IGluIHRoZSBKU1AgdHJhbnNsYXRpb24gd2hlcmUgdGhlIEVMIHdhcyBmb3VuZC4gCi0JICogCi0JICogQHBhcmFtIGZVc2VyRUxSYW5nZXMgIE1hcCBvZiBsb2NhdGlvbiByYW5nZXMgZnJvbSBKU1AgRUwgb2Zmc2V0cyB0byBnZW5lcmF0ZWQgSmF2YSBjb2RlLgotCSAqIEBwYXJhbSBkb2N1bWVudCBUaGUgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIEEgbGlzdCBvZiBFTFByb2JsZW1zIHRoYXQgZGVzY3JpYmVzIGFueSBzeW50YWN0aWMgaXNzdWVzIGZvdW5kLgotCSAqLwotCXB1YmxpYyBMaXN0IHRyYW5zbGF0ZUVMKFN0cmluZyBlbFRleHQsCi0JCQlTdHJpbmcgZGVsaW0sCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlLCAKLQkJCWludCBjb250ZW50U3RhcnQsCi0JCQlpbnQgY29udGVudExlbmd0aCwKLQkJCVN0cmluZ0J1ZmZlciB1c2VyRUxFeHByZXNzaW9ucywKLQkJCUhhc2hNYXAgdXNlckVMUmFuZ2VzLAotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JSmFyUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JSmFyUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDU1ZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSUphclJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSAqIEEgcmVjb3JkIHRvIGEgLmphciBmaWxlIGRpcmVjdGx5IHJlZmVyZW5jYWJsZSBhcyBhIHRhZyBsaWJyYXJ5LgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLQotcHVibGljIGludGVyZmFjZSBJSmFyUmVjb3JkIGV4dGVuZHMgSVRhZ2xpYlJlY29yZCB7Ci0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbiBvZiB0aGUgLmphciBpbiB0aGUgZmlsZS1zeXN0ZW0uCi0JICovCi0JcHVibGljIElQYXRoIGdldExvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdXJpLgotCSAqLwotCVN0cmluZyBnZXRVUkkoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUTERSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUTERSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxOTIzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVExEUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci0KLS8qKgotICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgc3RhbmRhbG9uZSAudGxkIGZpbGUuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRMRFJlY29yZCBleHRlbmRzIElUYWdsaWJSZWNvcmQgewotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlLgotCSAqLwotCUlQYXRoIGdldFBhdGgoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcmVjb21tZW5kZWQvZGVmYXVsdCBwcmVmaXggaWYgb25lIHdhcyBnaXZlbi4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkgKi8KLQlTdHJpbmcgZ2V0VVJJKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdEaXJSZWNvcmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdEaXJSZWNvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY4NDE4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnRGlyUmVjb3JkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLS8qKgotICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgZm9sZGVyIG9mIC50YWcvLnRhZ3ggZmlsZXMKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFnRGlyUmVjb3JkIGV4dGVuZHMgSVRhZ2xpYlJlY29yZCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVGFnbGliSW5kZXhMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI4ZmY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJJbmRleExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLQotLyoqCi0gKiBBIGxpc3RlbmVyIGZvciBjaGFuZ2VzIGluIHRoZSBpbmRleCdzIHJlY29yZHMuCi0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRhZ2xpYkluZGV4TGlzdGVuZXIgewotCi0JLyoqCi0JICogTm90aWZpZXMgdGhpcyBsaXN0ZW5lciB0aGF0IGFuIElUYWdsaWJSZWNvcmRFdmVudCBoYXMgb2NjdXJyZWQKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQl2b2lkIGluZGV4Q2hhbmdlZChJVGFnbGliUmVjb3JkRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGM2OTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJSZWNvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotLyoqCi0gKiBBIHJlcHJlc2VudGF0aW9uIG9mIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IuIFRoaXMKLSAqIGludGVyZmFjZSBpcyBjb21tb24gdG8gYWxsIHJlY29yZCB0eXBlcy4KLSAqIAotICogCi0gKiBAc2VlIElKYXJSZWNvcmQKLSAqIEBzZWUgSVRhZ0RpclJlY29yZAotICogQHNlZSBJVExEUmVjb3JkCi0gKiBAc2VlIElVUkxSZWNvcmQKLSAqICAgICAgPHA+Ci0gKiAgICAgIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogICAgICA8L3A+Ci0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGFnbGliUmVjb3JkIHsKLQkvKioKLQkgKiBBIHJlY29yZCB0byBhIC5qYXIgZmlsZSByZWZlcnJhYmxlIGRpcmVjdGx5LCAxLjEgc3R5bGUsIG9yIG1lbnRpb25lZCBpbgotCSAqIGEgd2ViLnhtbCBmaWxlLgotCSAqLwotCWludCBKQVIgPSAxIDw8IDE7Ci0KLQkvKioKLQkgKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSBmb2xkZXIgb2YgLnRhZy8udGFneCBmaWxlcwotCSAqLwotCWludCBUQUdESVIgPSAxIDw8IDM7Ci0KLQkvKioKLQkgKiBBIHJlY29yZCByZXByZXNlbnRpbmcgYSBzdGFuZGFsb25lIC50bGQgZmlsZQotCSAqLwotCWludCBUTEQgPSAxOwotCi0JLyoqCi0JICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgLnRsZCB0aGF0IGlzIG5vdCBhIHN0YW5kYWxvbmUgZmlsZQotCSAqLwotCWludCBVUkwgPSAxIDw8IDI7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgcmVjb3JkLiBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBvbmUgb2YKLQkgKiA8Y29kZT5VUkw8L2NvZGU+LCA8Y29kZT5UQUdESVI8L2NvZGU+LCA8Y29kZT5UTEQ8L2NvZGU+LCBvcgotCSAqIDxjb2RlPkpBUjwvY29kZT4uCi0JICogPHA+Ci0JICogPHVsPgotCSAqIDxsaT4gQWxsIHJlY29yZHMgb2YgdHlwZSA8Y29kZT5KQVI8L2NvZGU+IGltcGxlbWVudAotCSAqIDxjb2RlPklKYXJSZWNvcmQ8L2NvZGU+LjwvbGk+Ci0JICogPGxpPiBBbGwgcmVjb3JkcyBvZiB0eXBlIDxjb2RlPlRBR0RJUjwvY29kZT4gaW1wbGVtZW50Ci0JICogPGNvZGU+SVRhZ0RpclJlY29yZDwvY29kZT4uPC9saT4KLQkgKiA8bGk+IEFsbCByZWNvcmRzIG9mIHR5cGUgPGNvZGU+VExEPC9jb2RlPiBpbXBsZW1lbnQKLQkgKiA8Y29kZT5JVExEUmVjb3JkPC9jb2RlPi48L2xpPgotCSAqIDxsaT4gQWxsIHJlY29yZHMgb2YgdHlwZSA8Y29kZT5VUkw8L2NvZGU+IGltcGxlbWVudAotCSAqIDxjb2RlPklVUkxSZWNvcmQ8L2NvZGU+LjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHJlc291cmNlCi0JICogQHNlZSAjSkFSCi0JICogQHNlZSAjVEFHRElSCi0JICogQHNlZSAjVExECi0JICogQHNlZSAjVVJMCi0JICovCi0JaW50IGdldFJlY29yZFR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL0lUYWdsaWJSZWNvcmRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxZDE3Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVRhZ2xpYlJlY29yZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0gKiBEZXNjcmliZXMgY2hhbmdlcyB0byB0aGUga25vd24gcmVjb3JkcyB3aXRoaW4gdGhlIFRhZ2xpYkluZGV4LgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUYWdsaWJSZWNvcmRFdmVudCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSByZWNvcmQgdGhhdCB3YXMgY2hhbmdlZAotCSAqLwotCUlUYWdsaWJSZWNvcmQgZ2V0VGFnbGliUmVjb3JkKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIGNoYW5nZSwgb25lIG9mIEFEREVELCBDSEFOR0VELCBvciBSRU1PVkVECi0JICovCi0JaW50IGdldFR5cGUoKTsKLQotCWludCBBRERFRCA9IElSZXNvdXJjZURlbHRhLkFEREVEOwotCWludCBDSEFOR0VEID0gSVJlc291cmNlRGVsdGEuQ0hBTkdFRDsKLQlpbnQgUkVNT1ZFRCA9IElSZXNvdXJjZURlbHRhLlJFTU9WRUQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVVJMUmVjb3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9JVVJMUmVjb3JkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNzg2MWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvSVVSTFJlY29yZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWI7Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLS8qKgotICogQSByZWNvcmQgcmVwcmVzZW50aW5nIGEgLnRsZCB0aGF0IGlzIG5vdCBhIHN0YW5kYWxvbmUgZmlsZQotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElVUkxSZWNvcmQgZXh0ZW5kcyBJVGFnbGliUmVjb3JkIHsKLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIGJhc2UgbG9jYXRpb24gdG8gdXNlIGZvciBmdXJ0aGVyIHJlc29sdXRpb24gb2YgcmVzb3VyY2VzCi0JICogICAgICAgICBmcm9tIHRoZSBUTEQKLQkgKi8KLQlTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHNob3J0LW5hbWUgKG5vcm1hbGx5IHRyZWF0ZWQgYXMgdGhlCi0JICogICAgICAgICByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCksIGlmIG9uZSB3YXMgc3BlY2lmaWVkIHdpdGhpbiB0aGlzCi0JICogICAgICAgICBUTEQncyBjb250ZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0U2hvcnROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaSBzcGVjaWZpZWQgd2l0aGluIHRoaXMgVExEJ3MgY29udGVudHMuCi0JICovCi0JU3RyaW5nIGdldFVSSSgpOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBVUkwgdG8gdGhpcyBUTEQncyBjb250ZW50cy4KLQkgKi8KLQlVUkwgZ2V0VVJMKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9Qcm9qZWN0RGVzY3JpcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1Byb2plY3REZXNjcmlwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2ZkYjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2NvcmUvdGFnbGliL1Byb2plY3REZXNjcmlwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5GaWxlQnVmZmVyczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklUZXh0RmlsZUJ1ZmZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YVZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlUHJveHlWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDbGFzc3BhdGhDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUNsYXNzcGF0aEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudFJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLnByb3Zpc2lvbmFsLkpTUDExVExETmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuSlNQMTJUTEROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudXRpbC5Eb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuSmFyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWNsYXNzIFByb2plY3REZXNjcmlwdGlvbiB7Ci0KLQljbGFzcyBEZWx0YVZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpIHsKLQkJCQlpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZVRMRChyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVUTEQocmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZUpBUihyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVKQVIocmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGFnIikgfHwgcmVzb3VyY2UuZ2V0TmFtZSgpLmVuZHNXaXRoKCIudGFneCIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLlJFTU9WRUQpIHsKLQkJCQkJCXJlbW92ZVRhZ0RpcihyZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl1cGRhdGVUYWdEaXIocmVzb3VyY2UsIGRlbHRhLmdldEtpbmQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0TmFtZSgpLmVxdWFscyhXRUJfWE1MKSAmJiByZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXROYW1lKCkuZXF1YWxzKFdFQl9JTkYpKSB7Ci0JCQkJCWlmIChkZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQkJcmVtb3ZlV2ViWE1MKHJlc291cmNlKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXVwZGF0ZVdlYlhNTChyZXNvdXJjZSwgZGVsdGEuZ2V0S2luZCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZS5nZXROYW1lKCkubGVuZ3RoKCkgIT0gMCAmJiByZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApICE9ICcuJzsKLQkJfQotCX0KLQotCWNsYXNzIEluZGV4ZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VQcm94eVZpc2l0b3IgewotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VQcm94eSBwcm94eSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKHByb3h5LmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkgewotCQkJCWlmIChwcm94eS5nZXROYW1lKCkuZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXVwZGF0ZVRMRChwcm94eS5yZXF1ZXN0UmVzb3VyY2UoKSwgSVRhZ2xpYlJlY29yZEV2ZW50LkFEREVEKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocHJveHkuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQl1cGRhdGVKQVIocHJveHkucmVxdWVzdFJlc291cmNlKCksIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLnRhZyIpIHx8IHByb3h5LmdldE5hbWUoKS5lbmRzV2l0aCgiLnRhZ3giKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdXBkYXRlVGFnRGlyKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChwcm94eS5nZXROYW1lKCkuZXF1YWxzKFdFQl9YTUwpICYmIHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLmdldFBhcmVudCgpLmdldE5hbWUoKS5lcXVhbHMoV0VCX0lORikpIHsKLQkJCQkJdXBkYXRlV2ViWE1MKHByb3h5LnJlcXVlc3RSZXNvdXJjZSgpLCBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyBuYW1lID0gcHJveHkuZ2V0TmFtZSgpOwotCQkJcmV0dXJuIG5hbWUubGVuZ3RoKCkgIT0gMCAmJiBuYW1lLmNoYXJBdCgwKSAhPSAnLic7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgSmFyUmVjb3JkIGltcGxlbWVudHMgSUphclJlY29yZCB7Ci0JCWJvb2xlYW4gaGFzMTFUTEQ7Ci0JCWJvb2xlYW4gaXNNYXBwZWRJbldlYlhNTDsKLQotCQlUYWdsaWJJbmZvIGluZm87Ci0JCUlQYXRoIGxvY2F0aW9uOwotCQlMaXN0IHVybFJlY29yZHM7Ci0JCWJvb2xlYW4gaXNFeHBvcnRlZCA9IHRydWU7Ci0KLQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIEphclJlY29yZCkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoSmFyUmVjb3JkKSBvYmopLmxvY2F0aW9uLmVxdWFscyhsb2NhdGlvbikgJiYgKChKYXJSZWNvcmQpIG9iaikuaGFzMTFUTEQgPT0gaGFzMTFUTEQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBsb2NhdGlvbi4KLQkJICovCi0JCXB1YmxpYyBJUGF0aCBnZXRMb2NhdGlvbigpIHsKLQkJCXJldHVybiBsb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLkpBUjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby5zaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby51cmk7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlwdWJsaWMgTGlzdCBnZXRVUkxSZWNvcmRzKCkgewotCQkJcmV0dXJuIHVybFJlY29yZHM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJKYXJSZWNvcmQ6ICIgKyBsb2NhdGlvbiArICIgPC0+ICIgKyB1cmxSZWNvcmRzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUYWdEaXJSZWNvcmQgaW1wbGVtZW50cyBJVGFnRGlyUmVjb3JkIHsKLQkJSVBhdGggbG9jYXRpb247Ci0JCVN0cmluZyBzaG9ydE5hbWU7Ci0JCS8vIGEgTGlzdCBob2xkaW5nIFN0cmluZ3Mgb2YgLnRhZyBhbmQgLnRhZ3ggZmlsZW5hbWVzIHJlbGF0aXZlIHRvIHRoZQotCQkvLyB0YWdkaXIncyBsb2NhdGlvbgotCQlMaXN0IHRhZ3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBUYWdEaXJSZWNvcmQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKFRhZ0RpclJlY29yZCkgb2JqKS5sb2NhdGlvbi5lcXVhbHMobG9jYXRpb24pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgbG9jYXRpb24uCi0JCSAqLwotCQlwdWJsaWMgSVBhdGggZ2V0TG9jYXRpb24oKSB7Ci0JCQlyZXR1cm4gbG9jYXRpb247Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFJlY29yZFR5cGUoKSB7Ci0JCQlyZXR1cm4gSVRhZ2xpYlJlY29yZC5UQUdESVI7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBzaG9ydE5hbWUuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCXJldHVybiBzaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB0YWdzLgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1tdIGdldFRhZ3MoKSB7Ci0JCQlyZXR1cm4gKFN0cmluZ1tdKSB0YWdzLnRvQXJyYXkobmV3IFN0cmluZ1t0YWdzLnNpemUoKV0pOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGFnZGlyUmVjb3JkOiAiICsgbG9jYXRpb24gKyAiIDwtPiAiICsgc2hvcnROYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgYnJpZWYgcmVwcmVzZW50YXRpb24gb2YgdGhlIGluZm9ybWF0aW9uIGluIGEgVExELgotCSAqLwotCXN0YXRpYyBjbGFzcyBUYWdsaWJJbmZvIHsKLQkJLy8gZXh0cmFjdCBvbmx5IHdoZW4gYXNrZWQ/Ci0JCVN0cmluZyBkZXNjcmlwdGlvbjsKLQotCQlmbG9hdCBqc3BWZXJzaW9uOwotCQlTdHJpbmcgbGFyZ2VJY29uOwotCQlTdHJpbmcgc2hvcnROYW1lOwotCQlTdHJpbmcgc21hbGxJY29uOwotCQlTdHJpbmcgdGxpYlZlcnNpb247Ci0JCVN0cmluZyB1cmk7Ci0KLQkJcHVibGljIFRhZ2xpYkluZm8oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiVGFnbGliSW5mb3wiICsgc2hvcnROYW1lICsgInwiICsgdGxpYlZlcnNpb24gKyAifCIgKyBzbWFsbEljb24gKyAifCIgKyBsYXJnZUljb24gKyAifCIgKyBqc3BWZXJzaW9uICsgInwiICsgdXJpICsgInwiICsgZGVzY3JpcHRpb247IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQKLQkJfQotCX0KLQotCWNsYXNzIFRhZ2xpYlJlY29yZEV2ZW50IGltcGxlbWVudHMgSVRhZ2xpYlJlY29yZEV2ZW50IHsKLQkJSVRhZ2xpYlJlY29yZCBmVGFnbGliUmVjb3JkID0gbnVsbDsKLQkJaW50IGZUeXBlID0gLTE7Ci0KLQkJVGFnbGliUmVjb3JkRXZlbnQoSVRhZ2xpYlJlY29yZCByZWNvcmQsIGludCB0eXBlKSB7Ci0JCQlmVGFnbGliUmVjb3JkID0gcmVjb3JkOwotCQkJZlR5cGUgPSB0eXBlOwotCQl9Ci0KLQkJcHVibGljIElUYWdsaWJSZWNvcmQgZ2V0VGFnbGliUmVjb3JkKCkgewotCQkJcmV0dXJuIGZUYWdsaWJSZWNvcmQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gZlR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJU3RyaW5nIHN0cmluZyA9IGZUYWdsaWJSZWNvcmQudG9TdHJpbmcoKTsKLQkJCXN3aXRjaCAoZlR5cGUpIHsKLQkJCQljYXNlIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCA6Ci0JCQkJCXN0cmluZyA9ICIgQURERUQgKCIgKyBzdHJpbmcgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElUYWdsaWJSZWNvcmRFdmVudC5DSEFOR0VEIDoKLQkJCQkJc3RyaW5nID0gIiBDSEFOR0VEICgiICsgc3RyaW5nICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJVGFnbGliUmVjb3JkRXZlbnQuUkVNT1ZFRCA6Ci0JCQkJCXN0cmluZyA9ICIgUkVNT1ZFRCAoIiArIHN0cmluZyArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlzdHJpbmcgPSAiIG90aGVyOiIgKyBmVHlwZSArICIgKCIgKyBzdHJpbmcgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHN0cmluZzsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBUTERSZWNvcmQgaW1wbGVtZW50cyBJVExEUmVjb3JkIHsKLQkJVGFnbGliSW5mbyBpbmZvOwotCQlJUGF0aCBwYXRoOwotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBUTERSZWNvcmQpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCXJldHVybiAoKFRMRFJlY29yZCkgb2JqKS5wYXRoLmVxdWFscyhwYXRoKSAmJiAoKFRMRFJlY29yZCkgb2JqKS5nZXRVUkkoKS5lcXVhbHMoZ2V0VVJJKCkpOwotCQl9Ci0KLQkJcHVibGljIElQYXRoIGdldFBhdGgoKSB7Ci0JCQlyZXR1cm4gcGF0aDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlRMRDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U2hvcnROYW1lKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnNob3J0TmFtZTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHVyaS4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VVJJKCkgewotCQkJaWYgKGluZm8gPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBpbmZvLnVyaTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCQlyZXR1cm4gIlRMRFJlY29yZDogIiArIGdldFVSSSgpICsgIiA8LT4gIiArIHBhdGg7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFVSTFJlY29yZCBpbXBsZW1lbnRzIElVUkxSZWNvcmQgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uOwotCQlUYWdsaWJJbmZvIGluZm87Ci0JCVVSTCB1cmw7Ci0JCWJvb2xlYW4gaXNFeHBvcnRlZCA9IHRydWU7Ci0KLQkJcHVibGljIFVSTFJlY29yZCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgVVJMUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChVUkxSZWNvcmQpIG9iaikuYmFzZUxvY2F0aW9uLmVxdWFscyhiYXNlTG9jYXRpb24pICYmICgoVVJMUmVjb3JkKSBvYmopLnVybC5lcXVhbHModXJsKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uKCkgewotCQkJcmV0dXJuIGJhc2VMb2NhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0UmVjb3JkVHlwZSgpIHsKLQkJCXJldHVybiBJVGFnbGliUmVjb3JkLlVSTDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJlY29tbWVuZGVkL2RlZmF1bHQgcHJlZml4IGlmIG9uZSB3YXMgZ2l2ZW4uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFNob3J0TmFtZSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaW5mby5zaG9ydE5hbWU7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSB1cmkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJCWlmIChpbmZvID09IG51bGwpCi0JCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gaW5mby51cmk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBVUkwuCi0JCSAqLwotCQlwdWJsaWMgVVJMIGdldFVSTCgpIHsKLQkJCXJldHVybiB1cmw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJVUkxSZWNvcmQ6ICIgKyBiYXNlTG9jYXRpb24gKyAiIDwtPiAiICsgZ2V0VVJJKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGNsYXNzIFdlYlhNTFJlY29yZCB7Ci0JCVRhZ2xpYkluZm8gaW5mbzsKLQkJSVBhdGggcGF0aDsKLQkJTGlzdCB0bGRSZWNvcmRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgV2ViWE1MUmVjb3JkKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlyZXR1cm4gKChXZWJYTUxSZWNvcmQpIG9iaikucGF0aC5lcXVhbHMocGF0aCk7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSByZWNvbW1lbmRlZC9kZWZhdWx0IHByZWZpeCBpZiBvbmUgd2FzIGdpdmVuLgotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGluZm8uc2hvcnROYW1lOwotCQl9Ci0KLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0VExEUmVjb3JkcygpIHsKLQkJCXJldHVybiB0bGRSZWNvcmRzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgd2VieG1sLgotCQkgKi8KLQkJcHVibGljIElQYXRoIGdldFdlYlhNTCgpIHsKLQkJCXJldHVybiBwYXRoOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiAiV2ViWE1MUmVjb3JkOiAiICsgcGF0aCArICIgIiArIHRsZFJlY29yZHM7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnSW5kZXhDcmVhdGlvbiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4Y3JlYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBib29sZWFuIF9kZWJ1Z0luZGV4VGltZSA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL2luZGV4dGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0lORiA9ICJXRUItSU5GIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIElQYXRoIFdFQl9JTkZfUEFUSCA9IG5ldyBQYXRoKFdFQl9JTkYpOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRFBBVEhfUFJPSkVDVCA9ICJCVUlMRFBBVEhfUFJPSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1hNTCA9ICJ3ZWIueG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTQVZFX0ZPUk1BVF9WRVJTSU9OID0gIlRhZyBMaWJyYXJ5IEluZGV4IDEuMC4xIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVUlMRFBBVEhfRElSVFkgPSAiQlVJTERQQVRIX0RJUlRZIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBSZWNvcmRzIGFjdGl2ZSBKQVJzIG9uIHRoZSBjbGFzc3BhdGguIFRhZ2xpYiBkZXNjcmlwdG9ycyBzaG91bGQgYmUKLQkgKiB1c2FibGUsIGJ1dCB0aGUgamFycyBieSB0aGVtc2VsdmVzIGFyZSBub3QuCi0JICovCi0JSGFzaHRhYmxlIGZDbGFzc3BhdGhKYXJzOwotCi0JLyoqCi0JICogTm90ZXMgdGhhdCB0aGUgYnVpbGQgcGF0aCBpbmZvcm1hdGlvbiBpcyBzdGFsZS4gU29tZSBvcGVyYXRpb25zIGNhbiBub3cKLQkgKiBiZSBza2lwcGVkIHVudGlsIGEgcmVzb2x2ZS9nZXRBdmFpbGFibGUgY2FsbCBpcyBtYWRlLgotCSAqLwotCWJvb2xlYW4gZkJ1aWxkUGF0aElzRGlydHkgPSBmYWxzZTsKLQotCS8qKgotCSAqIEEgc2V0IG9mIHRoZSBwcm9qZWN0cyB0aGF0IGFyZSBpbiB0aGlzIHByb2plY3QncyBidWlsZCBwYXRoLgotCSAqIExvb2t1cHMvZW51bWVyYXRpb25zIHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0aGUgY29ycmVzcG9uZGluZwotCSAqIFByb2plY3REZXNjcmlwdGlvbiBpbnN0YW5jZXMKLQkgKi8KLQlTZXQgZkNsYXNzcGF0aFByb2plY3RzID0gbnVsbDsKLQotCS8vIGhvbGRzIHJlZmVyZW5jZXMgYnkgVVJJIHRvIEpBUnMKLQlIYXNodGFibGUgZkNsYXNzcGF0aFJlZmVyZW5jZXM7Ci0KLQkvLyB0aGlzIHRhYmxlIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBob2xkcyB0YWJsZXMgb2YgcmVmZXJlbmNlcyBhY2NvcmRpbmcKLQkvLyB0byBsb2NhbCByb290cwotCUhhc2h0YWJsZSBmSW1wbGljaXRSZWZlcmVuY2VzOwotCi0JSGFzaHRhYmxlIGZKQVJSZWZlcmVuY2VzOwotCi0JSVByb2plY3QgZlByb2plY3Q7Ci0KLQlIYXNodGFibGUgZlRhZ0RpclJlZmVyZW5jZXM7Ci0KLQlIYXNodGFibGUgZlRMRFJlZmVyZW5jZXM7Ci0KLQlJUmVzb3VyY2VEZWx0YVZpc2l0b3IgZlZpc2l0b3I7Ci0KLQlIYXNodGFibGUgZldlYlhNTFJlZmVyZW5jZXM7Ci0KLQlwcml2YXRlIGxvbmcgdGltZTA7Ci0JcHJpdmF0ZSBTdHJpbmcgZlNhdmVTdGF0ZUZpbGVuYW1lOwotCi0JUHJvamVjdERlc2NyaXB0aW9uKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBzYXZlU3RhdGVGaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcm9qZWN0ID0gcHJvamVjdDsKLQkJZlNhdmVTdGF0ZUZpbGVuYW1lID0gc2F2ZVN0YXRlRmlsZTsKLQotCQlmQ2xhc3NwYXRoSmFycyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZKQVJSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZlRhZ0RpclJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmVExEUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkltcGxpY2l0UmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZDbGFzc3BhdGhSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkNsYXNzcGF0aFByb2plY3RzID0gbmV3IEhhc2hTZXQoKTsKLQotCQlyZXN0b3JlUmVmZXJlbmNlcygpOwotCX0KLQotCXByaXZhdGUgQ29sbGVjdGlvbiBfZ2V0SlNQMTFBbmRXZWJYTUxKYXJSZWZlcmVuY2VzKENvbGxlY3Rpb24gYWxsSkFScykgewotCQlMaXN0IGNvbGxlY3Rpb24gPSBuZXcgQXJyYXlMaXN0KGFsbEpBUnMuc2l6ZSgpKTsKLQkJSXRlcmF0b3IgaSA9IGFsbEpBUnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlKYXJSZWNvcmQgcmVjb3JkID0gKEphclJlY29yZCkgaS5uZXh0KCk7Ci0JCQlpZiAocmVjb3JkLmhhczExVExEIHx8IHJlY29yZC5pc01hcHBlZEluV2ViWE1MKSB7Ci0JCQkJY29sbGVjdGlvbi5hZGQocmVjb3JkKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBsaXN0IG9mIGtub3duIHJlZmVyZW5jZXMgZnJvbSB0aGlzIHByb2plY3QncyBidWlsZCBwYXRoIHRvIHRoZQotCSAqIG1hcCwgYXBwZW5kaW5nIGFueSBwcm9jZXNzZWQgcHJvamVjdHMgaW50byB0aGUgbGlzdCB0byBhdm9pZAotCSAqIGJ1aWxkLXBhdGgtY3ljbGVzLgotCSAqIAotCSAqIEBzZWUgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE0MjQwOAotCSAqIAotCSAqIEBwYXJhbSByZWZlcmVuY2VzIC0KLQkgKiAgICAgICAgICAgIHRoZSBtYXAgb2YgcmVmZXJlbmNlcyB0byBJVGFnbGliUmVjb3JkcwotCSAqIEBwYXJhbSBwcm9qZWN0c1Byb2Nlc3NlZCAtCi0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiBwcm9qZWN0cyBhbHJlYWR5IGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gZXhwb3J0ZWRPbmx5IC0KLQkgKiAgICAgICAgICAgIFdoZXRoZXIgdG8gb25seSBhZGQgcmVmZXJlbmNlcyBkZXJpdmVkIGZyb20gZXhwb3J0ZWQgYnVpbGQKLQkgKiAgICAgICAgICAgIHBhdGggY29udGFpbmVycy4gVGhpcyBtZXRob2QgY2FsbHMgaXRzZWxmIHJlY3Vyc2l2ZWx5IHdpdGgKLQkgKiAgICAgICAgICAgIHRoaXMgcGFyYW1ldGVyIGFzIGZhbHNlLgotCSAqLwotCXZvaWQgYWRkQnVpbGRQYXRoUmVmZXJlbmNlcyhNYXAgcmVmZXJlbmNlcywgTGlzdCBwcm9qZWN0c1Byb2Nlc3NlZCwgYm9vbGVhbiBleHBvcnRlZE9ubHkpIHsKLQkJZW5zdXJlVXBUb2RhdGUoKTsKLQotCQlFbnVtZXJhdGlvbiBrZXlzID0gZkNsYXNzcGF0aFJlZmVyZW5jZXMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSAoVVJMUmVjb3JkKSBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5nZXQoa2V5KTsKLQkJCWlmIChleHBvcnRlZE9ubHkpIHsKLQkJCQlpZiAodXJsUmVjb3JkLmlzRXhwb3J0ZWQpIHsKLQkJCQkJcmVmZXJlbmNlcy5wdXQoa2V5LCB1cmxSZWNvcmQpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlZmVyZW5jZXMucHV0KGtleSwgdXJsUmVjb3JkKTsKLQkJCX0KLQkJfQotCQlJUHJvamVjdFtdIGJ1aWxkcGF0aFByb2plY3RzID0gKElQcm9qZWN0W10pIGZDbGFzc3BhdGhQcm9qZWN0cy50b0FycmF5KG5ldyBJUHJvamVjdFtmQ2xhc3NwYXRoUHJvamVjdHMuc2l6ZSgpXSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnVpbGRwYXRoUHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcHJvamVjdHNQcm9jZXNzZWQuY29udGFpbnMoYnVpbGRwYXRoUHJvamVjdHNbaV0pICYmIGJ1aWxkcGF0aFByb2plY3RzW2ldLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJcHJvamVjdHNQcm9jZXNzZWQuYWRkKGJ1aWxkcGF0aFByb2plY3RzW2ldKTsKLQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBUYWdsaWJJbmRleC5faW5zdGFuY2UuY3JlYXRlRGVzY3JpcHRpb24oYnVpbGRwYXRoUHJvamVjdHNbaV0pOwotCQkJCWRlc2NyaXB0aW9uLmFkZEJ1aWxkUGF0aFJlZmVyZW5jZXMocmVmZXJlbmNlcywgcHJvamVjdHNQcm9jZXNzZWQsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXJhc2VzIGFsbCBrbm93biB0YWJsZXMKLQkgKi8KLQl2b2lkIGNsZWFyKCkgewotCQlmQ2xhc3NwYXRoSmFycyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZKQVJSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZlRhZ0RpclJlZmVyZW5jZXMgPSBuZXcgSGFzaHRhYmxlKDApOwotCQlmVExEUmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQkJZkltcGxpY2l0UmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMCk7Ci0JCWZDbGFzc3BhdGhSZWZlcmVuY2VzID0gbmV3IEhhc2h0YWJsZSgwKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2F0YWxvZ0VudHJ5Ci0JICogICAgICAgICAgICBhIFhNTCBjYXRhbG9nIGVudHJ5IHBvaW50aW5nIHRvIGEgLmphciBvciAudGxkIGZpbGUKLQkgKiBAcmV0dXJuIGFuIElUYWdsaWJSZWNvcmQgZGVzY3JpYmluZyBhIFRMRCBjb250cmlidXRlZCB0byB0aGUKLQkgKiAgICAgICAgIFhNTENhdGFsb2csIGlmIG9uZSB3YXMgZm91bmQgYXQgdGhlIGdpdmVuIGxvY2F0aW9uCi0JICovCi0JcHJpdmF0ZSBJVGFnbGliUmVjb3JkIGNyZWF0ZUNhdGFsb2dSZWNvcmQoSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkpIHsKLQkJcmV0dXJuIGNyZWF0ZUNhdGFsb2dSZWNvcmQoY2F0YWxvZ0VudHJ5LmdldEtleSgpLCBjYXRhbG9nRW50cnkuZ2V0VVJJKCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB1cmkgLQotCSAqICAgICAgICAgICAgdGhlIGtleSB2YWx1ZSB0aGF0IHdpbGwgYmVjb21lIHRoZSByZXR1cm5lZCByZWNvcmQncyAiVVJJIgotCSAqIEBwYXJhbSB1cmxTdHJpbmcgLQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyBpbmRpY2F0aW5nIHdoZXJlIHRoZSBUTEQgcmVhbGx5IGlzCi0JICogQHJldHVybiBhbiBJVGFnbGliUmVjb3JkIGRlc2NyaWJpbmcgYSBUTEQgY29udHJpYnV0ZWQgdG8gdGhlIFhNTENhdGFsb2cKLQkgKi8KLQlwcml2YXRlIElUYWdsaWJSZWNvcmQgY3JlYXRlQ2F0YWxvZ1JlY29yZChTdHJpbmcgdXJpLCBTdHJpbmcgdXJsU3RyaW5nKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJLy8gaGFuZGxlICJmaWxlOiIgVVJMcyB0aGF0IHBvaW50IHRvIGEgLmphciBmaWxlIG9uIGRpc2sgKDEuMSBtb2RlKQotCQlpZiAodXJsU3RyaW5nLnRvTG93ZXJDYXNlKExvY2FsZS5VUykuZW5kc1dpdGgoKCIuamFyIikpICYmIHVybFN0cmluZy5zdGFydHNXaXRoKCJmaWxlOiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3RyaW5nIGZpbGVMb2NhdGlvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7Ci0JCQkJZmlsZUxvY2F0aW9uID0gdXJsLmdldEZpbGUoKTsKLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCS8vIG5vdCB3b3J0aCByZXBvcnRpbmcKLQkJCX0KLQkJCWlmIChmaWxlTG9jYXRpb24gIT0gbnVsbCkgewotCQkJCUphclJlY29yZCBqYXJSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQoZmlsZUxvY2F0aW9uKTsKLQkJCQlTdHJpbmdbXSBlbnRyaWVzID0gSmFyVXRpbGl0aWVzLmdldEVudHJ5TmFtZXMoZmlsZUxvY2F0aW9uKTsKLQkJCQlmb3IgKGludCBqRW50cnkgPSAwOyBqRW50cnkgPCBlbnRyaWVzLmxlbmd0aDsgakVudHJ5KyspIHsKLQkJCQkJaWYgKGVudHJpZXNbakVudHJ5XS5lbmRzV2l0aCgiLnRsZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChlbnRyaWVzW2pFbnRyeV0uZXF1YWxzKEphclV0aWxpdGllcy5KU1AxMV9UQUdMSUIpKSB7Ci0JCQkJCQkJamFyUmVjb3JkLmhhczExVExEID0gdHJ1ZTsKLQkJCQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShmaWxlTG9jYXRpb24sIGVudHJpZXNbakVudHJ5XSk7Ci0JCQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCQkJVGFnbGliSW5mbyBpbmZvID0gZXh0cmFjdEluZm8oZmlsZUxvY2F0aW9uLCBjb250ZW50cyk7Ci0JCQkJCQkJCS8qCi0JCQkJCQkJCSAqIHRoZSByZWNvcmQncyByZXBvcnRlZCBVUkkgc2hvdWxkIG1hdGNoIHRoZQotCQkJCQkJCQkgKiBjYXRhbG9nIGVudHJ5J3MgImtleSIgc28gcmVwbGFjZSB0aGUKLQkJCQkJCQkJICogZGV0ZWN0ZWQgdmFsdWUKLQkJCQkJCQkJICovCi0JCQkJCQkJCWluZm8udXJpID0gdXJpOwotCQkJCQkJCQlqYXJSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJfQotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChqYXJSZWNvcmQuaGFzMTFUTEQpIHsKLQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCBjYXRhbG9nIHJlY29yZCBmb3IgIiArIHVybFN0cmluZyArICJAIiArIGphclJlY29yZC5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXJlY29yZCA9IGphclJlY29yZDsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQkvLyBUaGUgcmVzdCBhcmUgVVJMcyBpbnRvIGEgcGx1Zy1pbi4uLnNvbWV3aGVyZQotCQllbHNlIHsKLQkJCVVSTCB1cmwgPSBudWxsOwotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gY2FjaGVkQ29udGVudHMgPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gdGxkU3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJdXJsID0gbmV3IFVSTCh1cmxTdHJpbmcpOwotCQkJCVVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCWNvbm5lY3Rpb24uc2V0RGVmYXVsdFVzZUNhY2hlcyhmYWxzZSk7Ci0JCQkJdGxkU3RyZWFtID0gY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlMSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiByZWFkaW5nIFRMRCBjb250cmlidXRlZCB0byB0aGUgWE1MIENhdGFsb2ciLCBlMSk7Ci0JCQl9Ci0KLQkJCWludCBjOwotCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCS8vIGFycmF5IGRpbSByZXN0cmljdGlvbj8KLQkJCWJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlWzIwNDhdOwotCQkJdHJ5IHsKLQkJCQl3aGlsZSAoKGMgPSB0bGRTdHJlYW0ucmVhZChieXRlcykpID49IDApIHsKLQkJCQkJYnVmZmVyLndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQl9Ci0JCQkJY2FjaGVkQ29udGVudHMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLnRvQnl0ZUFycmF5KCkpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCXRsZFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQotCQkJVVJMUmVjb3JkIHVybFJlY29yZCA9IG51bGw7Ci0JCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyh1cmxTdHJpbmcsIGNhY2hlZENvbnRlbnRzKTsKLQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIHRoZSByZWNvcmQncyByZXBvcnRlZCBVUkkgc2hvdWxkIG1hdGNoIHRoZSBjYXRhbG9nIGVudHJ5J3MKLQkJCQkgKiAia2V5IiBzbyByZXBsYWNlIHRoZSBkZXRlY3RlZCB2YWx1ZQotCQkJCSAqLwotCQkJCWluZm8udXJpID0gdXJpOwotCQkJCXVybFJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQl1cmxSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IHVybFN0cmluZzsKLQkJCQl1cmxSZWNvcmQudXJsID0gdXJsOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJY2FjaGVkQ29udGVudHMuY2xvc2UoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlyZWNvcmQgPSB1cmxSZWNvcmQ7Ci0JCX0KLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBKYXJSZWNvcmQgY3JlYXRlSkFSUmVjb3JkKElSZXNvdXJjZSBqYXIpIHsKLQkJcmV0dXJuIGNyZWF0ZUpBUlJlY29yZChqYXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIEphclJlY29yZCBjcmVhdGVKQVJSZWNvcmQoU3RyaW5nIGZpbGVMb2NhdGlvbikgewotCQlKYXJSZWNvcmQgcmVjb3JkID0gbmV3IEphclJlY29yZCgpOwotCQlyZWNvcmQubG9jYXRpb24gPSBuZXcgUGF0aChmaWxlTG9jYXRpb24pOwotCQlyZWNvcmQudXJsUmVjb3JkcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCXJldHVybiByZWNvcmQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCVRhZ0RpclJlY29yZCBjcmVhdGVUYWdkaXJSZWNvcmQoSVJlc291cmNlIHRhZ0ZpbGUpIHsKLQkJSUNvbnRhaW5lciB0YWdkaXIgPSB0YWdGaWxlLmdldFBhcmVudCgpOwotCQlTdHJpbmcgdGFnZGlyTG9jYXRpb24gPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQlUYWdEaXJSZWNvcmQgcmVjb3JkID0gKFRhZ0RpclJlY29yZCkgZlRhZ0RpclJlZmVyZW5jZXMuZ2V0KHRhZ2RpckxvY2F0aW9uKTsKLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSBuZXcgVGFnRGlyUmVjb3JkKCk7Ci0JCQlyZWNvcmQubG9jYXRpb24gPSB0YWdkaXIuZ2V0RnVsbFBhdGgoKTsKLQkJCS8vIEpTUCAyLjAgc2VjdGlvbiA4LjQuMwotCQkJaWYgKHRhZ2Rpci5nZXROYW1lKCkuZXF1YWxzKCJ0YWdzIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZWNvcmQuc2hvcnROYW1lID0gInRhZ3MiOyAvLyROT04tTkxTLTEkCi0JCQllbHNlIHsKLQkJCQlJUGF0aCB0YWdkaXJQYXRoID0gdGFnZGlyLmdldEZ1bGxQYXRoKCk7Ci0JCQkJU3RyaW5nW10gc2VnbWVudHMgPSB0YWdkaXJQYXRoLnNlZ21lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDE7IHJlY29yZC5zaG9ydE5hbWUgPT0gbnVsbCAmJiBpIDwgc2VnbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNlZ21lbnRzW2kgLSAxXS5lcXVhbHMoIldFQi1JTkYiKSAmJiBzZWdtZW50c1tpXS5lcXVhbHMoInRhZ3MiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCUlQYXRoIHRhZ2RpckxvY2FsUGF0aCA9IHRhZ2RpclBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cyhpICsgMSk7Ci0JCQkJCQlyZWNvcmQuc2hvcnROYW1lID0gdGFnZGlyTG9jYWxQYXRoLnRvU3RyaW5nKCkucmVwbGFjZSgnLycsICctJyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRMRFJlY29yZCBjcmVhdGVUTERSZWNvcmQoSVJlc291cmNlIHRsZCkgewotCQlUTERSZWNvcmQgcmVjb3JkID0gbmV3IFRMRFJlY29yZCgpOwotCQlyZWNvcmQucGF0aCA9IHRsZC5nZXRGdWxsUGF0aCgpOwotCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAodGxkLmdldExvY2F0aW9uKCkgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRzID0gKChJRmlsZSkgdGxkKS5nZXRDb250ZW50cyh0cnVlKTsKLQkJCQlTdHJpbmcgYmFzZVBhdGggPSB0bGQuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJCVRhZ2xpYkluZm8gaW5mbyA9IGV4dHJhY3RJbmZvKGJhc2VQYXRoLCBjb250ZW50cyk7Ci0JCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQlyZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQl0cnkgewotCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZ25vcmUKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVjb3JkOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVVcFRvZGF0ZSgpIHsKLQkJaWYgKGZCdWlsZFBhdGhJc0RpcnR5KSB7Ci0JCQlpbmRleENsYXNzcGF0aCgpOwotCQkJZkJ1aWxkUGF0aElzRGlydHkgPSBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgVGFnbGliSW5mbyBleHRyYWN0SW5mbyhTdHJpbmcgYmFzZVBhdGgsIElucHV0U3RyZWFtIHRsZENvbnRlbnRzKSB7Ci0JCVRhZ2xpYkluZm8gaW5mbyA9IG5ldyBUYWdsaWJJbmZvKCk7Ci0JCWlmICh0bGRDb250ZW50cyAhPSBudWxsKSB7Ci0JCQlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IERvY3VtZW50UHJvdmlkZXIoKTsKLQkJCXByb3ZpZGVyLnNldElucHV0U3RyZWFtKHRsZENvbnRlbnRzKTsKLQkJCXByb3ZpZGVyLnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCQkJcHJvdmlkZXIuc2V0Um9vdEVsZW1lbnROYW1lKEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJCXByb3ZpZGVyLnNldEJhc2VSZWZlcmVuY2UoYmFzZVBhdGgpOwotCQkJTm9kZSBjaGlsZCA9IHByb3ZpZGVyLmdldFJvb3RFbGVtZW50KCk7Ci0JCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFIHx8ICFjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLlRBR0xJQikpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5VUkkpKSB7Ci0JCQkJCQlpbmZvLnVyaSA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TSE9SVF9OQU1FKSB8fCBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLlNIT1JUTkFNRSkpIHsKLQkJCQkJCWluZm8uc2hvcnROYW1lID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLkRFU0NSSVBUSU9OKSB8fCBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLklORk8pKSB7Ci0JCQkJCQlpbmZvLmRlc2NyaXB0aW9uID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMlRMRE5hbWVzLkpTUF9WRVJTSU9OKSB8fCBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLkpTUFZFUlNJT04pKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWluZm8uanNwVmVyc2lvbiA9IEZsb2F0LnBhcnNlRmxvYXQoZ2V0VGV4dENvbnRlbnRzKGNoaWxkKSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlpbmZvLmpzcFZlcnNpb24gPSAxOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuVExJQl9WRVJTSU9OKSB8fCBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscyhKU1AxMVRMRE5hbWVzLlRMSUJWRVJTSU9OKSkgewotCQkJCQkJaW5mby50bGliVmVyc2lvbiA9IGdldFRleHRDb250ZW50cyhjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJUTEROYW1lcy5TTUFMTF9JQ09OKSkgewotCQkJCQkJaW5mby5zbWFsbEljb24gPSBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKEpTUDEyVExETmFtZXMuTEFSR0VfSUNPTikpIHsKLQkJCQkJCWluZm8ubGFyZ2VJY29uID0gZ2V0VGV4dENvbnRlbnRzKGNoaWxkKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZm87Ci0JfQotCi0Jc3luY2hyb25pemVkIExpc3QgZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhJUGF0aCBwYXRoKSB7Ci0JCWVuc3VyZVVwVG9kYXRlKCk7Ci0KLQkJQ29sbGVjdGlvbiBpbXBsaWNpdFJlZmVyZW5jZXMgPSBuZXcgSGFzaFNldChnZXRJbXBsaWNpdFJlZmVyZW5jZXMocGF0aC50b1N0cmluZygpKS52YWx1ZXMoKSk7Ci0JCUxpc3QgcmVjb3JkcyA9IG5ldyBBcnJheUxpc3QoZlRMRFJlZmVyZW5jZXMuc2l6ZSgpICsgZlRhZ0RpclJlZmVyZW5jZXMuc2l6ZSgpICsgZkpBUlJlZmVyZW5jZXMuc2l6ZSgpICsgZldlYlhNTFJlZmVyZW5jZXMuc2l6ZSgpKTsKLQkJcmVjb3Jkcy5hZGRBbGwoZlRMRFJlZmVyZW5jZXMudmFsdWVzKCkpOwotCQlyZWNvcmRzLmFkZEFsbChmVGFnRGlyUmVmZXJlbmNlcy52YWx1ZXMoKSk7Ci0JCXJlY29yZHMuYWRkQWxsKF9nZXRKU1AxMUFuZFdlYlhNTEphclJlZmVyZW5jZXMoZkpBUlJlZmVyZW5jZXMudmFsdWVzKCkpKTsKLQkJcmVjb3Jkcy5hZGRBbGwoaW1wbGljaXRSZWZlcmVuY2VzKTsKLQotCQlNYXAgYnVpbGRQYXRoUmVmZXJlbmNlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCUxpc3QgcHJvamVjdHNQcm9jZXNzZWQgPSBuZXcgQXJyYXlMaXN0KGZDbGFzc3BhdGhQcm9qZWN0cy5zaXplKCkgKyAxKTsKLQkJcHJvamVjdHNQcm9jZXNzZWQuYWRkKGZQcm9qZWN0KTsKLQkJYWRkQnVpbGRQYXRoUmVmZXJlbmNlcyhidWlsZFBhdGhSZWZlcmVuY2VzLCBwcm9qZWN0c1Byb2Nlc3NlZCwgZmFsc2UpOwotCQlyZWNvcmRzLmFkZEFsbChidWlsZFBhdGhSZWZlcmVuY2VzLnZhbHVlcygpKTsKLQotCQlJQ2F0YWxvZyBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCWlmIChkZWZhdWx0Q2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkvLyBQcm9jZXNzIGRlZmF1bHQgY2F0YWxvZwotCQkJSUNhdGFsb2dFbnRyeVtdIGVudHJpZXMgPSBkZWZhdWx0Q2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpOwotCQkJZm9yIChpbnQgZW50cnkgPSAwOyBlbnRyeSA8IGVudHJpZXMubGVuZ3RoOyBlbnRyeSsrKSB7Ci0JCQkJSVRhZ2xpYlJlY29yZCByZWNvcmQgPSBjcmVhdGVDYXRhbG9nUmVjb3JkKGVudHJpZXNbZW50cnldKTsKLQkJCQlyZWNvcmRzLmFkZChyZWNvcmQpOwotCQkJfQotCi0JCQkvLyBQcm9jZXNzIGRlY2xhcmVkIE9BU0lTIG5leHRDYXRhbG9ncyBjYXRhbG9nCi0JCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBkZWZhdWx0Q2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCWZvciAoaW50IG5leHRDYXRhbG9nID0gMDsgbmV4dENhdGFsb2cgPCBuZXh0Q2F0YWxvZ3MubGVuZ3RoOyBuZXh0Q2F0YWxvZysrKSB7Ci0JCQkJSUNhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tuZXh0Q2F0YWxvZ10uZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllczIgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0JCQkJZm9yIChpbnQgZW50cnkgPSAwOyBlbnRyeSA8IGVudHJpZXMyLmxlbmd0aDsgZW50cnkrKykgewotCQkJCQlTdHJpbmcgdXJpID0gZW50cmllczJbZW50cnldLmdldFVSSSgpOwotCQkJCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQkJCXVyaSA9IHVyaS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQkJCQkJaWYgKHVyaS5lbmRzV2l0aCgoIi5qYXIiKSkgfHwgdXJpLmVuZHNXaXRoKCgiLnRsZCIpKSkgewotCQkJCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gY3JlYXRlQ2F0YWxvZ1JlY29yZChlbnRyaWVzMltlbnRyeV0pOwotCQkJCQkJCXJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVjb3JkczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGltcGxpY2l0UmVmZXJlbmNlcyBmb3IgdGhlIGdpdmVuIHBhdGgKLQkgKi8KLQlIYXNodGFibGUgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKFN0cmluZyBwYXRoKSB7Ci0JCVN0cmluZyBsb2NhbFJvb3QgPSBnZXRMb2NhbFJvb3QocGF0aCk7Ci0JCUhhc2h0YWJsZSBpbXBsaWNpdFJlZmVyZW5jZXMgPSAoSGFzaHRhYmxlKSBmSW1wbGljaXRSZWZlcmVuY2VzLmdldChsb2NhbFJvb3QpOwotCQlpZiAoaW1wbGljaXRSZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWltcGxpY2l0UmVmZXJlbmNlcyA9IG5ldyBIYXNodGFibGUoMSk7Ci0JCQlmSW1wbGljaXRSZWZlcmVuY2VzLnB1dChsb2NhbFJvb3QsIGltcGxpY2l0UmVmZXJlbmNlcyk7Ci0JCX0KLQkJcmV0dXJuIGltcGxpY2l0UmVmZXJlbmNlczsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiBAcmV0dXJuIHRoZSBhcHBsaWNhYmxlIFdlYiBjb250ZXh0IHJvb3QgcGF0aCwgaWYgb25lIGV4aXN0cwotCSAqLwotCUlQYXRoIGdldExvY2FsUm9vdChJUGF0aCBiYXNlUGF0aCkgewotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotCQkvLyBleGlzdGluZyB3b3Jrc3BhY2UgcmVzb3VyY2VzIC0gdGhpcyBpcyB0aGUgOTMlIGNhc2UKLQkJSVJlc291cmNlIGZpbGUgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihiYXNlUGF0aCk7Ci0KLQkJLy8gVHJ5IHRoZSBiYXNlIHBhdGggYXMgYSBmb2xkZXIgZmlyc3QKLQkJaWYgKGZpbGUgPT0gbnVsbCAmJiBiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCWZpbGUgPSB3b3Jrc3BhY2VSb290LmdldEZvbGRlcihiYXNlUGF0aCk7Ci0JCX0KLQkJLy8gSWYgbm90IGEgZm9sZGVyLCB0aGVuIHRyeSBiYXNlIHBhdGggYXMgYSBmaWxlCi0JCWlmIChmaWxlICE9IG51bGwgJiYgIWZpbGUuZXhpc3RzKCkgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlmaWxlID0gd29ya3NwYWNlUm9vdC5nZXRGaWxlKGJhc2VQYXRoKTsKLQkJfQotCi0JCWlmIChmaWxlID09IG51bGwgJiYgYmFzZVBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJZmlsZSA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChiYXNlUGF0aC5zZWdtZW50KDApKTsKLQkJfQotCi0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTI5Ci0JCQkgKiAKLQkJCSAqIFRoaXMgbWV0aG9kIHByb2R1Y2VzIGEgbGVzcyBhY2N1cmF0ZSByZXN1bHQsIGJ1dCBkb2Vzbid0Ci0JCQkgKiByZXF1aXJlIHRoYXQgdGhlIGZpbGUgZXhpc3QgeWV0LgotCQkJICovCi0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihiYXNlUGF0aCk7Ci0JCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkKLQkJCQlmaWxlID0gZmlsZXNbMF07Ci0JCX0KLQotCQl3aGlsZSAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvKioKLQkJCSAqIFRyZWF0IGFueSBwYXJlbnQgZm9sZGVyIHdpdGggYSBXRUItSU5GIHN1YmZvbGRlciBhcyBhIHdlYi1hcHAKLQkJCSAqIHJvb3QKLQkJCSAqLwotCQkJSUNvbnRhaW5lciBmb2xkZXIgPSBudWxsOwotCQkJaWYgKChmaWxlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GT0xERVIpICE9IDApIHsKLQkJCQlmb2xkZXIgPSAoSUNvbnRhaW5lcikgZmlsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvbGRlciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQl9Ci0JCQkvLyBnZXRGb2xkZXIgb24gYSB3b3Jrc3BhY2Ugcm9vdCBtdXN0IHVzZSBhIGZ1bGwgcGF0aCwgc2tpcAotCQkJaWYgKGZvbGRlciAhPSBudWxsICYmIChmb2xkZXIuZ2V0VHlwZSgpICYgSVJlc291cmNlLlJPT1QpID09IDApIHsKLQkJCQlJRm9sZGVyIHdlYmluZiA9IGZvbGRlci5nZXRGb2xkZXIoV0VCX0lORl9QQVRIKTsKLQkJCQlpZiAod2ViaW5mICE9IG51bGwgJiYgd2ViaW5mLmV4aXN0cygpKSB7Ci0JCQkJCXJldHVybiBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaWxlID0gZmlsZS5nZXRQYXJlbnQoKTsKLQkJfQotCi0JCXJldHVybiBmUHJvamVjdC5nZXRGdWxsUGF0aCgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlUGF0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhbFJvb3QoU3RyaW5nIGJhc2VQYXRoKSB7Ci0JCXJldHVybiBnZXRMb2NhbFJvb3QobmV3IFBhdGgoYmFzZVBhdGgpKS50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFRleHRDb250ZW50cyhOb2RlIHBhcmVudCkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbi5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW4uaXRlbSgwKS5nZXROb2RlVmFsdWUoKS50cmltKCk7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIHMgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCU5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLQkJCQlTdHJpbmcgcmVmZXJlbmNlID0gKChFbnRpdHlSZWZlcmVuY2UpIGNoaWxkKS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpZiAocmVmZXJlbmNlID09IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJCXJlZmVyZW5jZSA9ICImIiArIGNoaWxkLmdldE5vZGVOYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlpZiAocmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCQkJcy5hcHBlbmQocmVmZXJlbmNlLnRyaW0oKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcy5hcHBlbmQoY2hpbGQuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpKTsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcy50b1N0cmluZygpLnRyaW0oKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHZpc2l0b3IuCi0JICovCi0JSVJlc291cmNlRGVsdGFWaXNpdG9yIGdldFZpc2l0b3IoKSB7Ci0JCWlmIChmVmlzaXRvciA9PSBudWxsKSB7Ci0JCQlmVmlzaXRvciA9IG5ldyBEZWx0YVZpc2l0b3IoKTsKLQkJfQotCQlyZXR1cm4gZlZpc2l0b3I7Ci0JfQotCi0Jdm9pZCBoYW5kbGVFbGVtZW50Q2hhbmdlZChJSmF2YUVsZW1lbnREZWx0YSBkZWx0YSkgewotCQlpZiAoZkJ1aWxkUGF0aElzRGlydHkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIExvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJJSmF2YUVsZW1lbnREZWx0YTogIiArIGRlbHRhKTsKLQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlBBQ0tBR0VfRlJBR01FTlRfUk9PVCAmJiAoKElQYWNrYWdlRnJhZ21lbnRSb290KSBlbGVtZW50KS5pc0FyY2hpdmUoKSkgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN0cmluZyBsaWJQYXRoID0gbnVsbDsKLQkJCWludCB0YWdsaWJSZWNvcmRFdmVudEtpbmQgPSAtMTsKLQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQURERURfVE9fQ0xBU1NQQVRIKSA+IDApIHsKLQkJCQl0YWdsaWJSZWNvcmRFdmVudEtpbmQgPSBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQ7Ci0JCQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShlbGVtZW50LmdldFBhdGgoKSk7Ci0JCQkJaWYgKGZpbGUuZXhpc3RzKCkpCi0JCQkJCWxpYlBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCQllbHNlCi0JCQkJCWxpYlBhdGggPSBlbGVtZW50LmdldFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX1JFTU9WRURfRlJPTV9DTEFTU1BBVEgpID4gMCkgewotCQkJCXRhZ2xpYlJlY29yZEV2ZW50S2luZCA9IElUYWdsaWJSZWNvcmRFdmVudC5SRU1PVkVEOwotCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZWxlbWVudC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmdldExvY2F0aW9uKCkgIT0gbnVsbCkKLQkJCQkJbGliUGF0aCA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCWVsc2UKLQkJCQkJbGliUGF0aCA9IGVsZW1lbnQuZ2V0UGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQVJDSElWRV9DT05URU5UX0NIQU5HRUQpID4gMCkgewotCQkJCXRhZ2xpYlJlY29yZEV2ZW50S2luZCA9IElUYWdsaWJSZWNvcmRFdmVudC5DSEFOR0VEOwotCQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoZWxlbWVudC5nZXRQYXRoKCkpOwotCQkJCWlmIChmaWxlLmV4aXN0cygpKQotCQkJCQlsaWJQYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJZWxzZQotCQkJCQlsaWJQYXRoID0gZWxlbWVudC5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChsaWJQYXRoICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGZyYWdtZW50aXNFeHBvcnRlZCA9IHRydWU7Ci0JCQkJdHJ5IHsKLQkJCQkJZnJhZ21lbnRpc0V4cG9ydGVkID0gKChJUGFja2FnZUZyYWdtZW50Um9vdCkgZWxlbWVudCkuZ2V0UmF3Q2xhc3NwYXRoRW50cnkoKS5pc0V4cG9ydGVkKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJQcm9ibGVtIGhhbmRsaW5nIGJ1aWxkIHBhdGggZW50cnkgZm9yICIgKyBlbGVtZW50LmdldFBhdGgoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJdXBkYXRlQ2xhc3NwYXRoTGlicmFyeShsaWJQYXRoLCB0YWdsaWJSZWNvcmRFdmVudEtpbmQsIGZyYWdtZW50aXNFeHBvcnRlZCk7Ci0JCQl9Ci0JCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJwcm9jZXNzZWQgYnVpbGQgcGF0aCBkZWx0YSBmb3IgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIoIiArIGVsZW1lbnQuZ2V0UGF0aCgpICsgIikgaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JfQotCi0Jdm9pZCBpbmRleCgpIHsKLQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlmVExEUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmSkFSUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmVGFnRGlyUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmV2ViWE1MUmVmZXJlbmNlcy5jbGVhcigpOwotCi0JCXRyeSB7Ci0JCQlmUHJvamVjdC5hY2NlcHQobmV3IEluZGV4ZXIoKSwgMCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiaW5kZXhlZCAiICsgZlByb2plY3QuZ2V0TmFtZSgpICsgIiBjb250ZW50cyBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0Jdm9pZCBpbmRleENsYXNzcGF0aCgpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCWZDbGFzc3BhdGhQcm9qZWN0cy5jbGVhcigpOwotCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5jbGVhcigpOwotCQlmQ2xhc3NwYXRoSmFycy5jbGVhcigpOwotCi0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShmUHJvamVjdCk7Ci0JCS8qCi0JCSAqIElmIHRoZSBKYXZhIG5hdHVyZSBpc24ndCBwcmVzZW50IChvciBzb21ldGhpbmcgZWxzZSBpcyB3cm9uZyksCi0JCSAqIGRvbid0IGNoZWNrIHRoZSBidWlsZCBwYXRoLgotCQkgKi8KLQkJaWYgKGphdmFQcm9qZWN0LmV4aXN0cygpKSB7Ci0JCQlpbmRleENsYXNzcGF0aChqYXZhUHJvamVjdCk7Ci0JCX0KLQkJLy8gZWxzZSB7Ci0JCS8vIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJUYWdsaWJJbmRleCB3YXMgYXNrZWQgdG8gaW5kZXggbm9uLUphdmEKLQkJLy8gUHJvamVjdCAiICsgZlByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkvLyB9Ci0KLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJpbmRleGVkICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGNsYXNzcGF0aCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVudHJ5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGluZGV4Q2xhc3NwYXRoKElDbGFzc3BhdGhFbnRyeSBlbnRyeSkgewotCQlzd2l0Y2ggKGVudHJ5LmdldEVudHJ5S2luZCgpKSB7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfQ09OVEFJTkVSIDogewotCQkJCUlDbGFzc3BhdGhDb250YWluZXIgY29udGFpbmVyID0gKElDbGFzc3BhdGhDb250YWluZXIpIGVudHJ5OwotCQkJCUlDbGFzc3BhdGhFbnRyeVtdIGNvbnRhaW5lZEVudHJpZXMgPSBjb250YWluZXIuZ2V0Q2xhc3NwYXRoRW50cmllcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmVkRW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJCQlpbmRleENsYXNzcGF0aChjb250YWluZWRFbnRyaWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfTElCUkFSWSA6IHsKLQkJCQkvKgotCQkJCSAqIElnbm9yZSBsaWJzIGluIHJlcXVpcmVkIHByb2plY3RzIHRoYXQgYXJlIG5vdCBleHBvcnRlZAotCQkJCSAqLwotCQkJCWlmIChmQ2xhc3NwYXRoUHJvamVjdHMuc2l6ZSgpIDwgMiB8fCBlbnRyeS5pc0V4cG9ydGVkKCkpIHsKLQkJCQkJSVBhdGggbGliUGF0aCA9IGVudHJ5LmdldFBhdGgoKTsKLQkJCQkJaWYgKCFmQ2xhc3NwYXRoSmFycy5jb250YWluc0tleShsaWJQYXRoLnRvU3RyaW5nKCkpKSB7Ci0JCQkJCQlpZiAobGliUGF0aC50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkobGliUGF0aC50b1N0cmluZygpLCBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQsIGVudHJ5LmlzRXhwb3J0ZWQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIE5vdGU6IC5qYXJzIG9uIHRoZSBjbGFzc3BhdGggaW5zaWRlIG9mIHRoZQotCQkJCQkJCSAqIHByb2plY3Qgd2lsbCBoYXZlIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBKQVIKLQkJCQkJCQkgKiByZWZlcmVuY2VzIHRhYmxlIHRoYXQgd2lsbCBlIHJldHVybmVkIHRvCi0JCQkJCQkJICogZ2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcygpLgotCQkJCQkJCSAqLwotCQkJCQkJCUlGaWxlIGxpYkZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUobGliUGF0aCk7Ci0JCQkJCQkJaWYgKGxpYkZpbGUgIT0gbnVsbCAmJiBsaWJGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQkJCXVwZGF0ZUNsYXNzcGF0aExpYnJhcnkobGliRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCksIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCwgZW50cnkuaXNFeHBvcnRlZCgpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfUFJPSkVDVCA6IHsKLQkJCQkvKgotCQkJCSAqIFdlJ3JlIGN1cnJlbnRseSBpZ25vcmluZyB3aGV0aGVyIHRoZSBwcm9qZWN0IGV4cG9ydHMgYWxsIG9mCi0JCQkJICogaXRzIGJ1aWxkIHBhdGgKLQkJCQkgKi8KLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KGVudHJ5LmdldFBhdGgoKS5sYXN0U2VnbWVudCgpKTsKLQkJCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCWZDbGFzc3BhdGhQcm9qZWN0cy5hZGQocHJvamVjdCk7Ci0JCQkJfQotCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ2xhc3NwYXRoRW50cnkuQ1BFX1NPVVJDRSA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDbGFzc3BhdGhFbnRyeS5DUEVfVkFSSUFCTEUgOgotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBwcml2YXRlIHZvaWQgcmVtb3ZlQ2xhc3NwYXRoTGlicmFyeShTdHJpbmcgbGlicmFyeUxvY2F0aW9uKSB7IEphclJlY29yZAotCSAqIHJlY29yZCA9IChKYXJSZWNvcmQpIGZDbGFzc3BhdGhKYXJzLnJlbW92ZShsaWJyYXJ5TG9jYXRpb24pOyBpZiAocmVjb3JkICE9Ci0JICogbnVsbCkgeyBVUkxSZWNvcmRbXSByZWNvcmRzID0gKFVSTFJlY29yZFtdKQotCSAqIHJlY29yZC5nZXRVUkxSZWNvcmRzKCkudG9BcnJheShuZXcgVVJMUmVjb3JkWzBdKTsgZm9yIChpbnQgaSA9IDA7IGkgPAotCSAqIHJlY29yZHMubGVuZ3RoOyBpKyspIHsKLQkgKiBmQ2xhc3NwYXRoUmVmZXJlbmNlcy5yZW1vdmUocmVjb3Jkc1tpXS5nZXRVUkkoKSk7IH0KLQkgKiBUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwKLQkgKiBJVGFnbGliUmVjb3JkRXZlbnQuUkVNT1ZFRCkpOyB9IH0KLQkgKi8KLQotCS8qKgotCSAqIEBwYXJhbSBqYXZhUHJvamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCBpbmRleENsYXNzcGF0aChJSmF2YVByb2plY3QgamF2YVByb2plY3QpIHsKLQkJaWYgKGphdmFQcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVByb2plY3QgcHJvamVjdCA9IGphdmFQcm9qZWN0LmdldFByb2plY3QoKTsKLQkJaWYgKHByb2plY3QuZXF1YWxzKGZQcm9qZWN0KSkgewotCQkJdHJ5IHsKLQkJCQlJQ2xhc3NwYXRoRW50cnlbXSBlbnRyaWVzID0gamF2YVByb2plY3QuZ2V0UmVzb2x2ZWRDbGFzc3BhdGgodHJ1ZSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWluZGV4Q2xhc3NwYXRoKGVudHJpZXNbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIHNlYXJjaGluZyBKYXZhIEJ1aWxkIFBhdGggKyAoIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIpIGZvciB0YWcgbGlicmFyaWVzIiwgZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZFRleHRvZkNoaWxkKE5vZGUgbm9kZSwgU3RyaW5nIGNoaWxkTmFtZSkgewotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoY2hpbGROYW1lKSkgewotCQkJCXJldHVybiBnZXRUZXh0Q29udGVudHMoY2hpbGQpOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXZvaWQgcmVtb3ZlSkFSKElSZXNvdXJjZSBqYXIpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgcmVjb3JkcyBmb3IgSkFSICIgKyBqYXIuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJSmFyUmVjb3JkIHJlY29yZCA9IChKYXJSZWNvcmQpIGZKQVJSZWZlcmVuY2VzLnJlbW92ZShqYXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlVUkxSZWNvcmRbXSByZWNvcmRzID0gKFVSTFJlY29yZFtdKSByZWNvcmQuZ2V0VVJMUmVjb3JkcygpLnRvQXJyYXkobmV3IFVSTFJlY29yZFswXSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZHNbaV0sIElUYWdsaWJSZWNvcmRFdmVudC5SRU1PVkVEKSk7Ci0JCQkJZ2V0SW1wbGljaXRSZWZlcmVuY2VzKGphci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnJlbW92ZShyZWNvcmRzW2ldLmdldFVSSSgpKTsKLQkJCX0KLQkJCWlmIChyZWNvcmQuaGFzMTFUTEQpIHsKLQkJCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwgSVRhZ2xpYlJlY29yZEV2ZW50LlJFTU9WRUQpKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlVGFnRGlyKElSZXNvdXJjZSB0YWdGaWxlKSB7Ci0JCS8vIElDb250YWluZXIgdGFnZGlyID0gdGFnRmlsZS5nZXRQYXJlbnQoKTsKLQkJLy8gU3RyaW5nIHRhZ2RpckxvY2F0aW9uID0gdGFnZGlyLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJLy8gZlRhZ0RpclJlZmVyZW5jZXMucmVtb3ZlKHRhZ2RpckxvY2F0aW9uKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZVRMRChJUmVzb3VyY2UgdGxkKSB7Ci0JCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIHJlY29yZCBmb3IgIiArIHRsZC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlUTERSZWNvcmQgcmVjb3JkID0gKFRMRFJlY29yZCkgZlRMRFJlZmVyZW5jZXMucmVtb3ZlKHRsZC5nZXRGdWxsUGF0aCgpKTsKLQkJaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0JCQlpZiAocmVjb3JkLmdldFVSSSgpICE9IG51bGwpIHsKLQkJCQlnZXRJbXBsaWNpdFJlZmVyZW5jZXModGxkLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSkucmVtb3ZlKHJlY29yZC5nZXRVUkkoKSk7Ci0JCQl9Ci0JCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZCwgSVRhZ2xpYlJlY29yZEV2ZW50LlJFTU9WRUQpKTsKLQkJfQotCX0KLQotCXZvaWQgcmVtb3ZlV2ViWE1MKElSZXNvdXJjZSB3ZWJ4bWwpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZpbmcgcmVjb3JkcyBmb3IgIiArIHdlYnhtbC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQlXZWJYTUxSZWNvcmQgcmVjb3JkID0gKFdlYlhNTFJlY29yZCkgZldlYlhNTFJlZmVyZW5jZXMucmVtb3ZlKHdlYnhtbC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQlpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJCVRMRFJlY29yZFtdIHJlY29yZHMgPSAoVExEUmVjb3JkW10pIHJlY29yZC5nZXRUTERSZWNvcmRzKCkudG9BcnJheShuZXcgVExEUmVjb3JkWzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVjb3Jkcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAicmVtb3ZlZCByZWNvcmQgZm9yICIgKyByZWNvcmRzW2ldLmdldFVSSSgpICsgIkAiICsgcmVjb3Jkc1tpXS5wYXRoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHdlYnhtbC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnJlbW92ZShyZWNvcmRzW2ldLmdldFVSSSgpKTsKLQkJCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KHJlY29yZHNbaV0sIElUYWdsaWJSZWNvcmRFdmVudC5SRU1PVkVEKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVBhdGgKLQkgKiBAcGFyYW0gcmVmZXJlbmNlCi0JICogQHJldHVybgotCSAqLwotCUlUYWdsaWJSZWNvcmQgcmVzb2x2ZShTdHJpbmcgYmFzZVBhdGgsIFN0cmluZyByZWZlcmVuY2UpIHsKLQkJZW5zdXJlVXBUb2RhdGUoKTsKLQotCQlJVGFnbGliUmVjb3JkIHJlY29yZCA9IG51bGw7Ci0JCVN0cmluZyBwYXRoID0gbnVsbDsKLQotCQkvKioKLQkJICogV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBpbiBVUklIZWxwZXI7IHVyaXMgc3RhcnRpbmcgd2l0aCAnLycgYXJlCi0JCSAqIHJldHVybmVkIGFzLWlzLgotCQkgKi8KLQkJaWYgKHJlZmVyZW5jZS5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcGF0aCA9IGdldExvY2FsUm9vdChiYXNlUGF0aCkgKyByZWZlcmVuY2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShyZWZlcmVuY2UsIGJhc2VQYXRoLCBnZXRMb2NhbFJvb3QoYmFzZVBhdGgpKTsKLQkJfQotCQkvLyBvcmRlciBkaWN0YXRlZCBieSBKU1Agc3BlYyAyLjAgc2VjdGlvbiA3LjIuMwotCQkvLyBpZiAocmVjb3JkID09IG51bGwpIHsKLQkJLy8gcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZXZWJYTUxSZWZlcmVuY2VzLmdldChwYXRoKTsKLQkJLy8gfQotCQlpZiAocmVjb3JkID09IG51bGwpIHsKLQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBmSkFSUmVmZXJlbmNlcy5nZXQocGF0aCk7Ci0JCQkvLyBvbmx5IGlmIDEuMSBUTEQgd2FzIGZvdW5kCi0JCQlpZiAocmVjb3JkIGluc3RhbmNlb2YgSmFyUmVjb3JkICYmICEoKEphclJlY29yZCkgcmVjb3JkKS5oYXMxMVRMRCkgewotCQkJCXJlY29yZCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlY29yZCA9PSBudWxsKSB7Ci0JCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZlRMRFJlZmVyZW5jZXMuZ2V0KHBhdGgpOwotCQl9Ci0JCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGdldEltcGxpY2l0UmVmZXJlbmNlcyhiYXNlUGF0aCkuZ2V0KHJlZmVyZW5jZSk7Ci0JCX0KLQotCi0JCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZUYWdEaXJSZWZlcmVuY2VzLmdldChwYXRoKTsKLQkJfQotCi0JCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJcmVjb3JkID0gKElUYWdsaWJSZWNvcmQpIGZDbGFzc3BhdGhSZWZlcmVuY2VzLmdldChyZWZlcmVuY2UpOwotCQl9Ci0JCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJTWFwIGJ1aWxkUGF0aFJlZmVyZW5jZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJTGlzdCBwcm9qZWN0c1Byb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3QoZkNsYXNzcGF0aFByb2plY3RzLnNpemUoKSArIDEpOwotCQkJcHJvamVjdHNQcm9jZXNzZWQuYWRkKGZQcm9qZWN0KTsKLQkJCWFkZEJ1aWxkUGF0aFJlZmVyZW5jZXMoYnVpbGRQYXRoUmVmZXJlbmNlcywgcHJvamVjdHNQcm9jZXNzZWQsIGZhbHNlKTsKLQkJCXJlY29yZCA9IChJVGFnbGliUmVjb3JkKSBidWlsZFBhdGhSZWZlcmVuY2VzLmdldChyZWZlcmVuY2UpOwotCQl9Ci0KLQkJLy8gQ2hlY2sgdGhlIFhNTCBDYXRhbG9nCi0JCWlmIChyZWNvcmQgPT0gbnVsbCkgewotCQkJSUNhdGFsb2cgY2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHJlc29sdmVkU3RyaW5nID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvLyBDaGVjayBhcyBzeXN0ZW0gcmVmZXJlbmNlIGZpcnN0Ci0JCQkJCXJlc29sdmVkU3RyaW5nID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHJlZmVyZW5jZSk7Ci0JCQkJCS8vIENoZWNrIGFzIFVSSQotCQkJCQlpZiAocmVzb2x2ZWRTdHJpbmcgPT0gbnVsbCB8fCByZXNvbHZlZFN0cmluZy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJcmVzb2x2ZWRTdHJpbmcgPSBjYXRhbG9nLnJlc29sdmVVUkkocmVmZXJlbmNlKTsKLQkJCQkJfQotCQkJCQkvLyBDaGVjayBhcyBwdWJsaWMgSUQKLQkJCQkJaWYgKHJlc29sdmVkU3RyaW5nID09IG51bGwgfHwgcmVzb2x2ZWRTdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCXJlc29sdmVkU3RyaW5nID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKHJlZmVyZW5jZSwgYmFzZVBhdGgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQlpZiAocmVzb2x2ZWRTdHJpbmcgIT0gbnVsbCAmJiByZXNvbHZlZFN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCXJlY29yZCA9IGNyZWF0ZUNhdGFsb2dSZWNvcmQocmVmZXJlbmNlLCByZXNvbHZlZFN0cmluZyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gSWYgbm8gcmVjb3JkcyB3ZXJlIGZvdW5kIGFuZCBubyBsb2NhbC1yb290IGFwcGxpZXMsIGNoZWNrIEFMTCBvZgotCQkvLyB0aGUgd2ViLnhtbCBmaWxlcyBhcyBhIGZhbGxiYWNrCi0JCWlmIChyZWNvcmQgPT0gbnVsbCAmJiBmUHJvamVjdC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkuZXF1YWxzKGdldExvY2FsUm9vdChiYXNlUGF0aCkpKSB7Ci0JCQlXZWJYTUxSZWNvcmRbXSB3ZWJ4bWxzID0gKFdlYlhNTFJlY29yZFtdKSBmV2ViWE1MUmVmZXJlbmNlcy52YWx1ZXMoKS50b0FycmF5KG5ldyBXZWJYTUxSZWNvcmRbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWJ4bWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHJlY29yZCAhPSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlyZWNvcmQgPSAoSVRhZ2xpYlJlY29yZCkgZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHdlYnhtbHNbaV0ucGF0aC50b1N0cmluZygpKS5nZXQocmVmZXJlbmNlKTsKLQkJCX0KLQkJfQotCi0KLQkJcmV0dXJuIHJlY29yZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlcyBhbnkgc2F2ZWQgcmVmZXJlbmNlIHRhYmxlcwotCSAqLwotCXByaXZhdGUgdm9pZCByZXN0b3JlUmVmZXJlbmNlcygpIHsKLQkJaWYgKFRhZ2xpYkluZGV4LkVOQUJMRUQpIHsKLQkJCS8vIHJlc291cmNlcyBmaXJzdAotCQkJaW5kZXgoKTsKLQkJCS8vIG5vdyBidWlsZCBwYXRoCi0KLQkJCS8vID09PT09PT09PT09PT09PT0gdGVzdCByZWxvYWQgdGltZSA9PT09PT09PT09PT09PT09PT09PT09PT0KLQkJCWJvb2xlYW4gcmVzdG9yZWQgPSBmYWxzZTsKLQkJCUZpbGUgc2F2ZWRTdGF0ZSA9IG5ldyBGaWxlKGZTYXZlU3RhdGVGaWxlbmFtZSk7Ci0JCQlpZiAoc2F2ZWRTdGF0ZS5leGlzdHMoKSkgewotCQkJCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgdGV4dEZpbGVCdWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCQkJUGF0aCBzYXZlZFN0YXRlUGF0aCA9IG5ldyBQYXRoKGZTYXZlU3RhdGVGaWxlbmFtZSk7Ci0JCQkJdHJ5IHsKLQkJCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJdGV4dEZpbGVCdWZmZXJNYW5hZ2VyLmNvbm5lY3Qoc2F2ZWRTdGF0ZVBhdGgsIG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gdGV4dEZpbGVCdWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKHNhdmVkU3RhdGVQYXRoKTsKLQkJCQkJSURvY3VtZW50IGRvYyA9IGJ1ZmZlci5nZXREb2N1bWVudCgpOwotCQkJCQlpbnQgbGluZXMgPSBkb2MuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQkJCQlpZiAobGluZXMgPiAwKSB7Ci0JCQkJCQlJUmVnaW9uIGxpbmUgPSBkb2MuZ2V0TGluZUluZm9ybWF0aW9uKDApOwotCQkJCQkJU3RyaW5nIGxpbmVUZXh0ID0gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJCQkJCUphclJlY29yZCBsaWJyYXJ5UmVjb3JkID0gbnVsbDsKLQkJCQkJCWlmIChTQVZFX0ZPUk1BVF9WRVJTSU9OLmVxdWFscyhsaW5lVGV4dCkpIHsKLQkJCQkJCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQotCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgbGluZXM7IGkrKykgewotCQkJCQkJCQlsaW5lID0gZG9jLmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQkJCQkJbGluZVRleHQgPSBkb2MuZ2V0KGxpbmUuZ2V0T2Zmc2V0KCksIGxpbmUuZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGxpbmVUZXh0LCAifCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCWlmICh0b2tlci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJCVN0cmluZyB0b2tlblR5cGUgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCWlmICgiSkFSIi5lcXVhbHNJZ25vcmVDYXNlKHRva2VuVHlwZSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJYm9vbGVhbiBoYXMxMVRMRCA9IEJvb2xlYW4udmFsdWVPZih0b2tlci5uZXh0VG9rZW4oKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQkJCQkJYm9vbGVhbiBleHBvcnRlZCA9IEJvb2xlYW4udmFsdWVPZih0b2tlci5uZXh0VG9rZW4oKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCQkJCQkJLy8gbWFrZSB0aGUgcmVzdCB0aGUgbGlicmFyeUxvY2F0aW9uCi0JCQkJCQkJCQkJU3RyaW5nIGxpYnJhcnlMb2NhdGlvbiA9IHRva2VyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJCXdoaWxlICh0b2tlci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJCQkJbGlicmFyeUxvY2F0aW9uID0gbGlicmFyeUxvY2F0aW9uICsgInwiICsgdG9rZXIubmV4dFRva2VuKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlsaWJyYXJ5TG9jYXRpb24gPSBsaWJyYXJ5TG9jYXRpb24udHJpbSgpOwotCQkJCQkJCQkJCWlmIChsaWJyYXJ5UmVjb3JkICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJVGFnbGliSW5kZXguZmlyZVRhZ2xpYlJlY29yZEV2ZW50KG5ldyBUYWdsaWJSZWNvcmRFdmVudChsaWJyYXJ5UmVjb3JkLCBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJLy8gQ3JlYXRlIGEgbmV3IEphclJlY29yZAotCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQgPSBjcmVhdGVKQVJSZWNvcmQobGlicmFyeUxvY2F0aW9uKTsKLQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLmhhczExVExEID0gaGFzMTFUTEQ7Ci0JCQkJCQkJCQkJbGlicmFyeVJlY29yZC5pc0V4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0KLQkJCQkJCQkJCQkvLyBBZGQgYSBVUkxSZWNvcmQgZm9yIHRoZSAxLjEgVExECi0JCQkJCQkJCQkJaWYgKGhhczExVExEKSB7Ci0JCQkJCQkJCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKGxpYnJhcnlMb2NhdGlvbiwgSmFyVXRpbGl0aWVzLkpTUDExX1RBR0xJQik7Ci0JCQkJCQkJCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhsaWJyYXJ5TG9jYXRpb24sIGNvbnRlbnRzKTsKLQotCQkJCQkJCQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJCQkJCVVSTFJlY29yZCB1cmxSZWNvcmQgPSBuZXcgVVJMUmVjb3JkKCk7Ci0JCQkJCQkJCQkJCQkJdXJsUmVjb3JkLmluZm8gPSBpbmZvOwotCQkJCQkJCQkJCQkJCXVybFJlY29yZC5pc0V4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0JCQkJCQkJCQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbjsKLQkJCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCQl1cmxSZWNvcmQudXJsID0gbmV3IFVSTCgiamFyOmZpbGU6IiArIGxpYnJhcnlMb2NhdGlvbiArICIhLyIgKyBKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCQkJCWxpYnJhcnlSZWNvcmQudXJsUmVjb3Jkcy5hZGQodXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHVybFJlY29yZC5nZXRVUkkoKSwgdXJsUmVjb3JkKTsKLQkJCQkJCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCByZWNvcmQgZm9yICIgKyB1cmxSZWNvcmQuZ2V0VVJJKCkgKyAiQCIgKyB1cmxSZWNvcmQuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCQkJCS8qCi0JCQkJCQkJCQkJCQkJCSAqIGRvbid0IHJlY29yZCB0aGlzCi0JCQkJCQkJCQkJCQkJCSAqIFVSSQotCQkJCQkJCQkJCQkJCQkgKi8KLQkJCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCi0JCQkJCQkJCQkJZkNsYXNzcGF0aEphcnMucHV0KGxpYnJhcnlMb2NhdGlvbiwgbGlicmFyeVJlY29yZCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmICgiVVJMIi5lcXVhbHNJZ25vcmVDYXNlKHRva2VuVHlwZSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJCWJvb2xlYW4gZXhwb3J0ZWQgPSBCb29sZWFuLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCQkJCQkJCS8vIG1ha2UgdGhlIHJlc3QgdGhlIFVSTAotCQkJCQkJCQkJCVN0cmluZyB1cmxTdHJpbmcgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCQkJCQkJCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCQkJCXVybFN0cmluZyA9IHVybFN0cmluZyArICJ8IiArIHRva2VyLm5leHRUb2tlbigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJdXJsU3RyaW5nID0gdXJsU3RyaW5nLnRyaW0oKTsKLQkJCQkJCQkJCQkvLyBBcHBlbmQgYSBVUkxyZWNvcmQKLQkJCQkJCQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gbmV3IFVSTFJlY29yZCgpOwotCQkJCQkJCQkJCXVybFJlY29yZC51cmwgPSBuZXcgVVJMKHVybFN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCXVybFJlY29yZC5pc0V4cG9ydGVkID0gZXhwb3J0ZWQ7Ci0JCQkJCQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlSZWNvcmQubG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCQkJCQkJCQlsaWJyYXJ5UmVjb3JkLnVybFJlY29yZHMuYWRkKHVybFJlY29yZCk7Ci0KLQkJCQkJCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBjYWNoZWRDb250ZW50cyA9IG51bGw7Ci0JCQkJCQkJCQkJSW5wdXRTdHJlYW0gdGxkU3RyZWFtID0gbnVsbDsKLQkJCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSB1cmxSZWNvcmQudXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0JCQkJCQkJCQkJCWNvbm5lY3Rpb24uc2V0RGVmYXVsdFVzZUNhY2hlcyhmYWxzZSk7Ci0JCQkJCQkJCQkJCXRsZFN0cmVhbSA9IGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCQkJCQkJCX0KLQotCQkJCQkJCQkJCWludCBjOwotCQkJCQkJCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCQkJCQkJLy8gYXJyYXkgZGltIHJlc3RyaWN0aW9uPwotCQkJCQkJCQkJCWJ5dGUgYnl0ZXNbXSA9IG5ldyBieXRlWzIwNDhdOwotCQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJCXdoaWxlICgoYyA9IHRsZFN0cmVhbS5yZWFkKGJ5dGVzKSkgPj0gMCkgewotCQkJCQkJCQkJCQkJYnl0ZUFycmF5T3V0cHV0LndyaXRlKGJ5dGVzLCAwLCBjKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCQljYWNoZWRDb250ZW50cyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQXJyYXlPdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCQkJCQkJCQkJLy8gbm8gY2xlYW51cCBjYW4gYmUgZG9uZQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJCXRsZFN0cmVhbS5jbG9zZSgpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0KLQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyh1cmxSZWNvcmQudXJsLnRvU3RyaW5nKCksIGNhY2hlZENvbnRlbnRzKTsKLQkJCQkJCQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJCXVybFJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQkJY2FjaGVkQ29udGVudHMuY2xvc2UoKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJZkNsYXNzcGF0aFJlZmVyZW5jZXMucHV0KHVybFJlY29yZC5nZXRVUkkoKSwgdXJsUmVjb3JkKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgaWYgKEJVSUxEUEFUSF9QUk9KRUNULmVxdWFsc0lnbm9yZUNhc2UodG9rZW5UeXBlKSkgewotCQkJCQkJCQkJCVN0cmluZyBwcm9qZWN0TmFtZSA9IHRva2VyLm5leHRUb2tlbigpOwotCQkJCQkJCQkJCWlmIChQYXRoLlJPT1QuaXNWYWxpZFNlZ21lbnQocHJvamVjdE5hbWUpKSB7Ci0JCQkJCQkJCQkJCUlQcm9qZWN0IHByb2plY3QgPSB3b3Jrc3BhY2VSb290LmdldFByb2plY3QocHJvamVjdE5hbWUpOwotCQkJCQkJCQkJCQkvKiBkbyBub3QgY2hlY2sgaWYgIm9wZW4iIGhlcmUgKi8KLQkJCQkJCQkJCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQkJCQkJCQkJZkNsYXNzcGF0aFByb2plY3RzLmFkZChwcm9qZWN0KTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCS8vIGxhc3Qgc2luY2Ugb25seSBvY2N1cnMgb25jZQotCQkJCQkJCQkJZWxzZSBpZiAoQlVJTERQQVRIX0RJUlRZLmVxdWFsc0lnbm9yZUNhc2UodG9rZW5UeXBlKSkgewotCQkJCQkJCQkJCWZCdWlsZFBhdGhJc0RpcnR5ID0gQm9vbGVhbi52YWx1ZU9mKHRva2VyLm5leHRUb2tlbigpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlpZiAobGlicmFyeVJlY29yZCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KGxpYnJhcnlSZWNvcmQsIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCkpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCXJlc3RvcmVkID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoX2RlYnVnSW5kZXhUaW1lKQotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInRpbWUgc3BlbnQgcmVsb2FkaW5nICIgKyBmUHJvamVjdC5nZXROYW1lKCkgKyAiIGJ1aWxkIHBhdGg6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlc3RvcmVkID0gZmFsc2U7Ci0JCQkJCWlmIChfZGVidWdJbmRleFRpbWUpCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiZmFpbHVyZSByZWxvYWRpbmcgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICIgYnVpbGQgcGF0aCBpbmRleCIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0ZXh0RmlsZUJ1ZmZlck1hbmFnZXIuZGlzY29ubmVjdChzYXZlZFN0YXRlUGF0aCwgbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gPT09PT09PT09PT09PT09PSB0ZXN0IHJlbG9hZCB0aW1lIChlbmQpID09PT09PT09PT09PT09PT09PQotCi0KLQkJCWlmICghcmVzdG9yZWQpIHsKLQkJCQlzZXRCdWlsZFBhdGhJc0RpcnR5KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTYXZlcyBhbnkgc3RvcmFibGUgcmVmZXJlbmNlcyB0byBkaXNrLiBUaGlzIGlzIG9ubHkgY2FsbGVkIHdoZW4gdGhlCi0JICogZGVzY3JpcHRpb24gaXMgYmVpbmcgY2xlYXJlZCBhbmQgbm90IGFmdGVyIGV2ZXJ5IHVwZGF0ZS4KLQkgKi8KLQl2b2lkIHNhdmVSZWZlcmVuY2VzKCkgewotCQkvLyB0aGUgYnVpbGQgcGF0aCBpbmZvcm1hdGlvbiBpcyBvdXQgb2YgZGF0ZSwgcmVtZW1iZXIgdGhhdAotCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotCQkvKioKLQkJICogPHByZT4KLQkJICogICAgICAgICAgICAgICAgICAJCSAxLjAuMQotCQkgKiAgICAgICAgICAgICAgICAgIAkJIFNhdmUgY2xhc3NwYXRoIGluZm9ybWF0aW9uICh8IGlzIGZpZWxkIGRlbGltaXRlcikKLQkJICogICAgICAgICAgICAgICAgICAJCSBKYXJzIGFyZSBzYXZlZCBhcyAmcXVvdDtKQVI6JnF1b3Q7KyBoYXMxMVRMRCArIGphciBwYXRoIAotCQkgKiAgICAgICAgICAgICAgICAgIAkJIFVSTFJlY29yZHMgYXMgJnF1b3Q7VVJMOiZxdW90OytVUkwKLQkJICogPC9wcmU+Ci0JCSAqLwotCQl0cnkgewotCQkJd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihuZXcgRmlsZU91dHB1dFN0cmVhbShmU2F2ZVN0YXRlRmlsZW5hbWUpLCAidXRmMTYiKTsgLy8kTk9OLU5MUy0xJAotCQkJd3JpdGVyLndyaXRlKFNBVkVfRk9STUFUX1ZFUlNJT04pOwotCQkJd3JpdGVyLndyaXRlKCdcbicpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoQlVJTERQQVRIX0RJUlRZICsgInwiICsgZkJ1aWxkUGF0aElzRGlydHkpOyAvLyROT04tTkxTLTEkCi0JCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQotCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IChJUHJvamVjdFtdKSBmQ2xhc3NwYXRoUHJvamVjdHMudG9BcnJheShuZXcgSVByb2plY3RbMF0pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9qZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCXdyaXRlci53cml0ZShCVUlMRFBBVEhfUFJPSkVDVCk7Ci0JCQkJd3JpdGVyLndyaXRlKCJ8Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGUocHJvamVjdHNbaV0uZ2V0TmFtZSgpKTsKLQkJCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJRW51bWVyYXRpb24gamFycyA9IGZDbGFzc3BhdGhKYXJzLmtleXMoKTsKLQkJCXdoaWxlIChqYXJzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIGphclBhdGggPSBqYXJzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCQlKYXJSZWNvcmQgamFyUmVjb3JkID0gKEphclJlY29yZCkgZkNsYXNzcGF0aEphcnMuZ2V0KGphclBhdGgpOwotCQkJCXdyaXRlci53cml0ZSgiSkFSfCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlKEJvb2xlYW4udG9TdHJpbmcoamFyUmVjb3JkLmhhczExVExEKSk7Ci0JCQkJd3JpdGVyLndyaXRlKCd8Jyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl3cml0ZXIud3JpdGUoQm9vbGVhbi50b1N0cmluZyhqYXJSZWNvcmQuaXNFeHBvcnRlZCkpOwotCQkJCXdyaXRlci53cml0ZSgnfCcpOyAvLyROT04tTkxTLTEkCi0JCQkJd3JpdGVyLndyaXRlKGphclBhdGgpOwotCQkJCXdyaXRlci53cml0ZSgnXG4nKTsgLy8kTk9OLU5MUy0xJAotCQkJCUl0ZXJhdG9yIGkgPSBqYXJSZWNvcmQudXJsUmVjb3Jkcy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCQlVUkxSZWNvcmQgdXJsUmVjb3JkID0gKFVSTFJlY29yZCkgaS5uZXh0KCk7Ci0JCQkJCXdyaXRlci53cml0ZSgiVVJMfCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCXdyaXRlci53cml0ZShTdHJpbmcudmFsdWVPZih1cmxSZWNvcmQuaXNFeHBvcnRlZCkpOwotCQkJCQl3cml0ZXIud3JpdGUoInwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl3cml0ZXIud3JpdGUodXJsUmVjb3JkLmdldFVSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotCQkJCQl3cml0ZXIud3JpdGUoJ1xuJyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKHdyaXRlciAhPSBudWxsKSB7Ci0JCQkJCXdyaXRlci5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJaWYgKF9kZWJ1Z0luZGV4VGltZSkKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJ0aW1lIHNwZW50IHNhdmluZyBpbmRleCBmb3IgIiArIGZQcm9qZWN0LmdldE5hbWUoKSArICI6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jdm9pZCBzZXRCdWlsZFBhdGhJc0RpcnR5KCkgewotCQlmQnVpbGRQYXRoSXNEaXJ0eSA9IHRydWU7Ci0JfQotCi0Jdm9pZCB1cGRhdGVDbGFzc3BhdGhMaWJyYXJ5KFN0cmluZyBsaWJyYXJ5TG9jYXRpb24sIGludCBkZWx0YUtpbmQsIGJvb2xlYW4gaXNFeHBvcnRlZCkgewotCQlKYXJSZWNvcmQgbGlicmFyeVJlY29yZCA9IG51bGw7Ci0JCWlmIChkZWx0YUtpbmQgPT0gSVRhZ2xpYlJlY29yZEV2ZW50LlJFTU9WRUQgfHwgZGVsdGFLaW5kID09IElUYWdsaWJSZWNvcmRFdmVudC5DSEFOR0VEKSB7Ci0JCQlsaWJyYXJ5UmVjb3JkID0gKEphclJlY29yZCkgZkNsYXNzcGF0aEphcnMucmVtb3ZlKGxpYnJhcnlMb2NhdGlvbik7Ci0JCQlpZiAobGlicmFyeVJlY29yZCAhPSBudWxsKSB7Ci0JCQkJSVVSTFJlY29yZFtdIHVybFJlY29yZHMgPSAoSVVSTFJlY29yZFtdKSBsaWJyYXJ5UmVjb3JkLnVybFJlY29yZHMudG9BcnJheShuZXcgSVVSTFJlY29yZFswXSk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB1cmxSZWNvcmRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZDbGFzc3BhdGhSZWZlcmVuY2VzLnJlbW92ZSh1cmxSZWNvcmRzW2ldLmdldFVSSSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlbHRhS2luZCA9PSBJVGFnbGliUmVjb3JkRXZlbnQuQURERUQgfHwgZGVsdGFLaW5kID09IElUYWdsaWJSZWNvcmRFdmVudC5DSEFOR0VEKSB7Ci0JCQlTdHJpbmdbXSBlbnRyaWVzID0gSmFyVXRpbGl0aWVzLmdldEVudHJ5TmFtZXMobGlicmFyeUxvY2F0aW9uKTsKLQotCQkJbGlicmFyeVJlY29yZCA9IGNyZWF0ZUpBUlJlY29yZChsaWJyYXJ5TG9jYXRpb24pOwotCQkJbGlicmFyeVJlY29yZC5pc0V4cG9ydGVkID0gaXNFeHBvcnRlZDsKLQkJCWZDbGFzc3BhdGhKYXJzLnB1dChsaWJyYXJ5TG9jYXRpb24sIGxpYnJhcnlSZWNvcmQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVudHJpZXNbaV0uZW5kc1dpdGgoIi50bGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChlbnRyaWVzW2ldLmVxdWFscyhKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKSkgewotCQkJCQkJbGlicmFyeVJlY29yZC5oYXMxMVRMRCA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBKYXJVdGlsaXRpZXMuZ2V0SW5wdXRTdHJlYW0obGlicmFyeUxvY2F0aW9uLCBlbnRyaWVzW2ldKTsKLQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCVRhZ2xpYkluZm8gaW5mbyA9IGV4dHJhY3RJbmZvKGxpYnJhcnlMb2NhdGlvbiwgY29udGVudHMpOwotCi0JCQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8udXJpICE9IG51bGwgJiYgaW5mby51cmkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkJVVJMUmVjb3JkIHVybFJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQkJCQl1cmxSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJdXJsUmVjb3JkLmJhc2VMb2NhdGlvbiA9IGxpYnJhcnlMb2NhdGlvbjsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQl1cmxSZWNvcmQuaXNFeHBvcnRlZCA9IGlzRXhwb3J0ZWQ7Ci0JCQkJCQkJCXVybFJlY29yZC51cmwgPSBuZXcgVVJMKCJqYXI6ZmlsZToiICsgbGlicmFyeUxvY2F0aW9uICsgIiEvIiArIGVudHJpZXNbaV0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJbGlicmFyeVJlY29yZC51cmxSZWNvcmRzLmFkZCh1cmxSZWNvcmQpOwotCQkJCQkJCQlmQ2xhc3NwYXRoUmVmZXJlbmNlcy5wdXQodXJsUmVjb3JkLmdldFVSSSgpLCB1cmxSZWNvcmQpOwotCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGVkIHJlY29yZCBmb3IgIiArIHVybFJlY29yZC5nZXRVUkkoKSArICJAIiArIHVybFJlY29yZC5nZXRVUkwoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCX0KLQkJCQkJCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJLy8gZG9uJ3QgcmVjb3JkIHRoaXMgVVJJCi0JCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJdHJ5IHsKLQkJCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobGlicmFyeVJlY29yZCAhPSBudWxsKSB7Ci0JCQlUYWdsaWJJbmRleC5maXJlVGFnbGliUmVjb3JkRXZlbnQobmV3IFRhZ2xpYlJlY29yZEV2ZW50KGxpYnJhcnlSZWNvcmQsIGRlbHRhS2luZCkpOwotCQl9Ci0JfQotCi0Jdm9pZCB1cGRhdGVKQVIoSVJlc291cmNlIGphciwgaW50IGRlbHRhS2luZCkgewotCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJjcmVhdGluZyByZWNvcmRzIGZvciBKQVIgIiArIGphci5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBqYXJMb2NhdGlvblN0cmluZyA9IGphci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCVN0cmluZ1tdIGVudHJpZXMgPSBKYXJVdGlsaXRpZXMuZ2V0RW50cnlOYW1lcyhqYXIpOwotCQlKYXJSZWNvcmQgamFyUmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKGphcik7Ci0JCWZKQVJSZWZlcmVuY2VzLnB1dChqYXIuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBqYXJSZWNvcmQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbnRyaWVzW2ldLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChlbnRyaWVzW2ldLmVxdWFscyhKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKSkgewotCQkJCQlqYXJSZWNvcmQuaGFzMTFUTEQgPSB0cnVlOwotCQkJCX0KLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IEphclV0aWxpdGllcy5nZXRJbnB1dFN0cmVhbShqYXIsIGVudHJpZXNbaV0pOwotCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCVRhZ2xpYkluZm8gaW5mbyA9IGV4dHJhY3RJbmZvKGphckxvY2F0aW9uU3RyaW5nLCBjb250ZW50cyk7Ci0KLQkJCQkJaWYgKGluZm8gIT0gbnVsbCAmJiBpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJVVJMUmVjb3JkIHJlY29yZCA9IG5ldyBVUkxSZWNvcmQoKTsKLQkJCQkJCXJlY29yZC5pbmZvID0gaW5mbzsKLQkJCQkJCXJlY29yZC5iYXNlTG9jYXRpb24gPSBqYXJMb2NhdGlvblN0cmluZzsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcmVjb3JkLnVybCA9IG5ldyBVUkwoImphcjpmaWxlOiIgKyBqYXJMb2NhdGlvblN0cmluZyArICIhLyIgKyBlbnRyaWVzW2ldKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJamFyUmVjb3JkLnVybFJlY29yZHMuYWRkKHJlY29yZCk7Ci0JCQkJCQkJZ2V0SW1wbGljaXRSZWZlcmVuY2VzKGphci5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnB1dChyZWNvcmQuZ2V0VVJJKCksIHJlY29yZCk7Ci0JCQkJCQkJVGFnbGliSW5kZXguZmlyZVRhZ2xpYlJlY29yZEV2ZW50KG5ldyBUYWdsaWJSZWNvcmRFdmVudChyZWNvcmQsIElUYWdsaWJSZWNvcmRFdmVudC5BRERFRCkpOwotCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKQotCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCByZWNvcmQgZm9yICIgKyByZWNvcmQuZ2V0VVJJKCkgKyAiQCIgKyByZWNvcmQuZ2V0VVJMKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGRvbid0IHJlY29yZCB0aGlzIFVSSQotCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgImNvdWxkIG5vdCByZWFkIHJlc291cmNlICIgKyBqYXIuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGphclJlY29yZC5oYXMxMVRMRCkgewotCQkJVGFnbGliSW5kZXguZmlyZVRhZ2xpYlJlY29yZEV2ZW50KG5ldyBUYWdsaWJSZWNvcmRFdmVudChqYXJSZWNvcmQsIGRlbHRhS2luZCkpOwotCQl9Ci0JfQotCi0Jdm9pZCB1cGRhdGVUYWdEaXIoSVJlc291cmNlIHRhZ0ZpbGUsIGludCBkZWx0YUtpbmQpIHsKLQkJcmV0dXJuOwotCQkvKioKLQkJICogTWFrZSBzdXJlIHRoZSB0YWcgZmlsZSBpcyBuIGEgV0VCLUlORi90YWdzIGZvbGRlciBiZWNhdXNlIG9mIHRoZQotCQkgKiBzaG9ydG5hbWUgY29tcHV0YXRpb24gcmVxdWlyZW1lbnRzCi0JCSAqLwotCQkvLyBpZiAoKHRhZ0ZpbGUuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgPiAwIHx8Ci0JCS8vIHRhZ0ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLmluZGV4T2YoIldFQi1JTkYvdGFncyIpIDwgMCkKLQkJLy8gcmV0dXJuOwotCQkvLyBUYWdEaXJSZWNvcmQgcmVjb3JkID0gY3JlYXRlVGFnZGlyUmVjb3JkKHRhZ0ZpbGUpOwotCQkvLyBpZiAocmVjb3JkICE9IG51bGwpIHsKLQkJLy8gcmVjb3JkLnRhZ3MuYWRkKHRhZ0ZpbGUuZ2V0TmFtZSgpKTsKLQkJLy8gfQotCX0KLQotCXZvaWQgdXBkYXRlVExEKElSZXNvdXJjZSB0bGQsIGludCBkZWx0YUtpbmQpIHsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRpbmcgcmVjb3JkIGZvciAiICsgdGxkLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCVRMRFJlY29yZCByZWNvcmQgPSBjcmVhdGVUTERSZWNvcmQodGxkKTsKLQkJZlRMRFJlZmVyZW5jZXMucHV0KHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlY29yZCk7Ci0JCWlmIChyZWNvcmQuZ2V0VVJJKCkgIT0gbnVsbCkgewotCQkJZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHRsZC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnB1dChyZWNvcmQuZ2V0VVJJKCksIHJlY29yZCk7Ci0JCX0KLQkJVGFnbGliSW5kZXguZmlyZVRhZ2xpYlJlY29yZEV2ZW50KG5ldyBUYWdsaWJSZWNvcmRFdmVudChyZWNvcmQsIGRlbHRhS2luZCkpOwotCX0KLQotCXZvaWQgdXBkYXRlV2ViWE1MKElSZXNvdXJjZSB3ZWJ4bWwsIGludCBkZWx0YUtpbmQpIHsKLQkJaWYgKHdlYnhtbC5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUpCi0JCQlyZXR1cm47Ci0JCUlucHV0U3RyZWFtIHdlYnhtbENvbnRlbnRzID0gbnVsbDsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJd2VieG1sQ29udGVudHMgPSAoKElGaWxlKSB3ZWJ4bWwpLmdldENvbnRlbnRzKHRydWUpOwotCQkJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBEb2N1bWVudFByb3ZpZGVyKCk7Ci0JCQlwcm92aWRlci5zZXRJbnB1dFN0cmVhbSh3ZWJ4bWxDb250ZW50cyk7Ci0JCQlwcm92aWRlci5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLQkJCXByb3ZpZGVyLnNldFJvb3RFbGVtZW50TmFtZSgid2ViLWFwcCIpOyAvLyROT04tTkxTLTEkCi0JCQlwcm92aWRlci5zZXRCYXNlUmVmZXJlbmNlKHdlYnhtbC5nZXRQYXJlbnQoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJZG9jdW1lbnQgPSBwcm92aWRlci5nZXREb2N1bWVudChmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsICIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHdlYnhtbENvbnRlbnRzICE9IG51bGwpCi0JCQkJdHJ5IHsKLQkJCQkJd2VieG1sQ29udGVudHMuY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCS8vIGlnbm9yZQotCQkJCX0KLQkJfQotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRpbmcgcmVjb3JkcyBmb3IgIiArIHdlYnhtbC5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVdlYlhNTFJlY29yZCB3ZWJ4bWxSZWNvcmQgPSBuZXcgV2ViWE1MUmVjb3JkKCk7Ci0JCXdlYnhtbFJlY29yZC5wYXRoID0gd2VieG1sLmdldEZ1bGxQYXRoKCk7Ci0JCWZXZWJYTUxSZWZlcmVuY2VzLnB1dCh3ZWJ4bWxSZWNvcmQuZ2V0V2ViWE1MKCkudG9TdHJpbmcoKSwgd2VieG1sUmVjb3JkKTsKLQkJTm9kZUxpc3QgdGFnbGlicyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDEyVExETmFtZXMuVEFHTElCKTsKLQkJZm9yIChpbnQgaVRhZ2xpYiA9IDA7IGlUYWdsaWIgPCB0YWdsaWJzLmdldExlbmd0aCgpOyBpVGFnbGliKyspIHsKLQkJCVN0cmluZyB0YWdsaWJVcmkgPSByZWFkVGV4dG9mQ2hpbGQodGFnbGlicy5pdGVtKGlUYWdsaWIpLCAidGFnbGliLXVyaSIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gc3BlY2lmaWVkIGxvY2F0aW9uIGlzIHJlbGF0aXZlIHRvIHJvb3Qgb2YgdGhlIHdlYmFwcAotCQkJU3RyaW5nIHRhZ2xpYkxvY2F0aW9uID0gcmVhZFRleHRvZkNoaWxkKHRhZ2xpYnMuaXRlbShpVGFnbGliKSwgInRhZ2xpYi1sb2NhdGlvbiIpLnRyaW0oKTsgLy8kTk9OLU5MUy0xJAotCQkJSVBhdGggcGF0aCA9IG51bGw7Ci0JCQlpZiAodGFnbGliTG9jYXRpb24uc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlwYXRoID0gbmV3IFBhdGgoZ2V0TG9jYWxSb290KHdlYnhtbC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpICsgdGFnbGliTG9jYXRpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKFVSSUhlbHBlci5ub3JtYWxpemUodGFnbGliTG9jYXRpb24sIHdlYnhtbC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGdldExvY2FsUm9vdCh3ZWJ4bWwuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKSkpOwotCQkJfQotCQkJaWYgKHBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJSUZpbGUgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUocGF0aCk7Ci0JCQkJaWYgKHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJCUlUYWdsaWJSZWNvcmQgcmVjb3JkID0gbnVsbDsKLQkJCQkJLyoKLQkJCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEyNTk2MAotCQkJCQkgKiAKLQkJCQkJICogQWxzbyBzdXBwb3J0IG1hcHBpbmdzIHRvIC5qYXIgZmlsZXMKLQkJCQkJICovCi0JCQkJCWlmIChyZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgoImphciIpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlKYXJSZWNvcmQgamFyUmVjb3JkID0gY3JlYXRlSkFSUmVjb3JkKHJlc291cmNlKTsKLQkJCQkJCVN0cmluZ1tdIGVudHJpZXMgPSBKYXJVdGlsaXRpZXMuZ2V0RW50cnlOYW1lcyhyZXNvdXJjZSk7Ci0JCQkJCQlmb3IgKGludCBqRW50cnkgPSAwOyBqRW50cnkgPCBlbnRyaWVzLmxlbmd0aDsgakVudHJ5KyspIHsKLQkJCQkJCQlpZiAoZW50cmllc1tqRW50cnldLmVuZHNXaXRoKCIudGxkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpZiAoZW50cmllc1tqRW50cnldLmVxdWFscyhKYXJVdGlsaXRpZXMuSlNQMTFfVEFHTElCKSkgewotCQkJCQkJCQkJamFyUmVjb3JkLmhhczExVExEID0gdHJ1ZTsKLQkJCQkJCQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gSmFyVXRpbGl0aWVzLmdldElucHV0U3RyZWFtKHJlc291cmNlLCBlbnRyaWVzW2pFbnRyeV0pOwotCQkJCQkJCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJCQkJCQlUYWdsaWJJbmZvIGluZm8gPSBleHRyYWN0SW5mbyhyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGNvbnRlbnRzKTsKLQkJCQkJCQkJCQlqYXJSZWNvcmQuaW5mbyA9IGluZm87Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQl0cnkgewotCQkJCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmVjb3JkID0gamFyUmVjb3JkOwotCQkJCQkJLy8gdGhlIHN0b3JlZCBVUkkgc2hvdWxkIHJlZmxlY3QgdGhlIHdlYi54bWwncyB2YWx1ZQotCQkJCQkJamFyUmVjb3JkLmluZm8udXJpID0gdGFnbGliVXJpOwotCQkJCQkJamFyUmVjb3JkLmlzTWFwcGVkSW5XZWJYTUwgPSB0cnVlOwotCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgImNyZWF0ZWQgd2ViLnhtbCByZWNvcmQgZm9yICIgKyB0YWdsaWJVcmkgKyAiQCIgKyBqYXJSZWNvcmQuZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJVExEUmVjb3JkIHRsZFJlY29yZCA9IGNyZWF0ZVRMRFJlY29yZChyZXNvdXJjZSk7Ci0JCQkJCQlyZWNvcmQgPSB0bGRSZWNvcmQ7Ci0JCQkJCQkvLyB0aGUgc3RvcmVkIFVSSSBzaG91bGQgcmVmbGVjdCB0aGUgd2ViLnhtbCdzIHZhbHVlCi0JCQkJCQl0bGRSZWNvcmQuaW5mby51cmkgPSB0YWdsaWJVcmk7Ci0JCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikKLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiY3JlYXRlZCB3ZWIueG1sIHJlY29yZCBmb3IgIiArIHRhZ2xpYlVyaSArICJAIiArIHRsZFJlY29yZC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQl3ZWJ4bWxSZWNvcmQudGxkUmVjb3Jkcy5hZGQocmVjb3JkKTsKLQkJCQkJZ2V0SW1wbGljaXRSZWZlcmVuY2VzKHdlYnhtbC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpLnB1dCh0YWdsaWJVcmksIHJlY29yZCk7Ci0JCQkJCVRhZ2xpYkluZGV4LmZpcmVUYWdsaWJSZWNvcmRFdmVudChuZXcgVGFnbGliUmVjb3JkRXZlbnQocmVjb3JkLCBkZWx0YUtpbmQpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9UYWdsaWJJbmRleC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90YWdsaWIvVGFnbGliSW5kZXguamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJlNTJiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RhZ2xpYi9UYWdsaWJJbmRleC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuQ1JDMzI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5FbGVtZW50Q2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklFbGVtZW50Q2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnREZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQuVExEQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBIG5vbi1leHRlbmRhYmxlIGluZGV4IG1hbmFnZXIgZm9yIHRhZ2xpYnMgc2ltaWxhciB0byB0aGUgcHJldmlvdXMgSjJFRQotICogSVRhZ2xpYlJlZ2lzdHJ5IGJ1dCBsYWNraW5nIGFueSB0aWVzIHRvIHByb2plY3QgbmF0dXJlcy4gRWFjaCByZWNvcmQKLSAqIHJldHVybmVkIGZyb20gdGhlIGluZGV4IHJlcHJlc2VudHMgYSBzaW5nbGUgdGFnIGxpYnJhcnkgZGVzY3JpcHRvci4KLSAqIAotICogSW5kZXhpbmcgaXMgb25seSBwZXJzaXN0ZWQgYmV0d2VlbiBzZXNzaW9ucyBmb3IgZW50cmllcyBvbiB0aGUgSmF2YSBCdWlsZAotICogUGF0aC4gTmV3IEFERCBldmVudHMgd2lsbCBiZSBzZW50IHRvIElUYWdsaWJJbmRleExpc3RlbmVycyBkdXJpbmcgZWFjaAotICogd29ya2JlbmNoIHNlc3Npb24gZm9yIGJvdGggY2FjaGVkIGFuZCBuZXdseSBmb3VuZCByZWNvcmRzLiBSRU1PVkUgZXZlbnRzCi0gKiBhcmUgbm90IGZpcmVkIG9uIHdvcmtiZW5jaCBzaHV0ZG93bi4gVGhlIHJlY29yZCdzIGNvbnRlbnRzIHNob3VsZCBiZQotICogZXhhbWluZWQgZm9yIGFueSBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICogCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUYWdsaWJJbmRleCB7Ci0JY2xhc3MgQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudENoYW5nZWRMaXN0ZW5lciB7Ci0JCUxpc3QgcHJvamVjdHNJbmRleGVkID0gbmV3IEFycmF5TGlzdCgxKTsKLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q2hhbmdlZChFbGVtZW50Q2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoIWlzSW5kZXhBdmFpbGFibGUoKSkKLQkJCQlyZXR1cm47Ci0JCQl0cnkgewotCQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJCXByb2plY3RzSW5kZXhlZC5jbGVhcigpOwotCQkJCWVsZW1lbnRDaGFuZ2VkKGV2ZW50LmdldERlbHRhKCksIHRydWUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZWxlbWVudENoYW5nZWQoSUphdmFFbGVtZW50RGVsdGEgZGVsdGEsIGJvb2xlYW4gZm9yY2VVcGRhdGUpIHsKLQkJCWlmIChmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKQotCQkJCXJldHVybjsKLQotCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBkZWx0YS5nZXRFbGVtZW50KCk7Ci0JCQlpZiAoZWxlbWVudC5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5KQVZBX01PREVMKSB7Ci0JCQkJSUphdmFFbGVtZW50RGVsdGFbXSBjaGFuZ2VkID0gZGVsdGEuZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlZC5sZW5ndGg7IGkrKykgewotCQkJCQllbGVtZW50Q2hhbmdlZChjaGFuZ2VkW2ldLCBmb3JjZVVwZGF0ZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gSGFuZGxlIGFueSBjaGFuZ2VzIGF0IHRoZSBwcm9qZWN0IGxldmVsCi0JCQllbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkpBVkFfUFJPSkVDVCkgewotCQkJCWlmICgoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfQ0xBU1NQQVRIX0NIQU5HRUQpICE9IDApIHsKLQkJCQkJSUphdmFFbGVtZW50IHByb2ogPSBlbGVtZW50OwotCQkJCQloYW5kbGVDbGFzc3BhdGhDaGFuZ2UoKElKYXZhUHJvamVjdCkgcHJvaiwgZm9yY2VVcGRhdGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSUphdmFFbGVtZW50RGVsdGFbXSBkZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkJCWlmIChkZWx0YXMubGVuZ3RoID09IDApIHsKLQkJCQkJCUlKYXZhRWxlbWVudCBwcm9qID0gZWxlbWVudDsKLQkJCQkJCWhhbmRsZUNsYXNzcGF0aENoYW5nZSgoSUphdmFQcm9qZWN0KSBwcm9qLCBmb3JjZVVwZGF0ZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWVsZW1lbnRDaGFuZ2VkKGRlbHRhc1tpXSwgZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJLyoKLQkJCSAqIE90aGVyIG1vZGlmaWNhdGlvbiB0byB0aGUgY2xhc3NwYXRoIChzdWNoIGFzIHdpdGhpbiBhIGNsYXNzcGF0aAotCQkJICogY29udGFpbmVyIGxpa2UgIldlYiBBcHAgTGlicmFyaWVzIikgZ28gdG8gdGhlIGRlc2NyaXB0aW9uCi0JCQkgKiBpdHNlbGYKLQkJCSAqLwotCQkJZWxzZSBpZiAoKGRlbHRhLmdldEZsYWdzKCkgJiBJSmF2YUVsZW1lbnREZWx0YS5GX0FEREVEX1RPX0NMQVNTUEFUSCkgIT0gMCB8fCAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElKYXZhRWxlbWVudERlbHRhLkZfUkVNT1ZFRF9GUk9NX0NMQVNTUEFUSCkgIT0gMCkgewotCQkJCUlKYXZhUHJvamVjdCBhZmZlY3RlZFByb2plY3QgPSBlbGVtZW50LmdldEphdmFQcm9qZWN0KCk7Ci0JCQkJaWYgKGFmZmVjdGVkUHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIElmIHRoZSBhZmZlY3RlZCBwcm9qZWN0IGhhcyBhbiBpbmRleCBvbi1kaXNrLCBpdCdzCi0JCQkJCSAqIGdvaW5nIHRvIGJlIGludmFsaWQtLXdlIG5lZWQgdG8gY3JlYXRlL2xvYWQgdGhlCi0JCQkJCSAqIGRlc2NyaXB0aW9uIHNvIGl0IHdpbGwgYmUgdXAgdG8gZGF0ZSBbbG9hZGluZyBub3cgYW5kCi0JCQkJCSAqIHVwZGF0aW5nIGlzIHVzdWFsbHkgZmFzdGVyIHRoYW4gcmVnZW5lcmF0aW5nIHRoZSBlbnRpcmUKLQkJCQkJICogaW5kZXhdLiBJZiB0aGVyZSBpcyBubyBpbmRleCBvbiBkaXNrLCBkbyBub3RoaW5nIG1vcmUuCi0JCQkJCSAqLwotCQkJCQlGaWxlIGluZGV4RmlsZSA9IG5ldyBGaWxlKGNvbXB1dGVJbmRleExvY2F0aW9uKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCQlpZiAoaW5kZXhGaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gYWZmZWN0ZWREZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uKGFmZmVjdGVkUHJvamVjdC5nZXRQcm9qZWN0KCkpOwotCQkJCQkJaWYgKGFmZmVjdGVkRGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJCWFmZmVjdGVkRGVzY3JpcHRpb24uaGFuZGxlRWxlbWVudENoYW5nZWQoZGVsdGEpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXByb2plY3RzSW5kZXhlZC5hZGQoYWZmZWN0ZWRQcm9qZWN0LmdldFByb2plY3QoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGhhbmRsZUNsYXNzcGF0aENoYW5nZShJSmF2YVByb2plY3QgcHJvamVjdCwgYm9vbGVhbiBmb3JjZVVwZGF0ZSkgewotCQkJaWYgKGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpCi0JCQkJcmV0dXJuOwotCi0JCQl0cnkgewotCQkJCS8qIEhhbmRsZSBsYXJnZSBjaGFuZ2VzIHRvIHRoaXMgcHJvamVjdCdzIGJ1aWxkIHBhdGggKi8KLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBwcm9qZWN0LmdldENvcnJlc3BvbmRpbmdSZXNvdXJjZSgpOwotCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgJiYgIXByb2plY3RzSW5kZXhlZC5jb250YWlucyhyZXNvdXJjZSkpIHsKLQkJCQkJLyoKLQkJCQkJICogVXNlIGdldCBpbnN0ZWFkIG9mIGNyZWF0ZSBzaW5jZSB0aGUgZG93bnN0cmVhbQotCQkJCQkgKiAodXBzdHJlYW0/KSBwcm9qZWN0IHdhc24ndCBpdHNlbGYgbW9kaWZpZWQuCi0JCQkJCSAqLwotCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQkJCQlpZiAoZm9yY2VVcGRhdGUpIHsKLQkJCQkJCWRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24oKElQcm9qZWN0KSByZXNvdXJjZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKChJUHJvamVjdCkgcmVzb3VyY2UpOwotCQkJCQl9Ci0JCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmICFmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQlwcm9qZWN0c0luZGV4ZWQuYWRkKHJlc291cmNlKTsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldEJ1aWxkUGF0aElzRGlydHkoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCWlmICghaXNJbmRleEF2YWlsYWJsZSgpKQotCQkJCXJldHVybjsKLQkJCXRyeSB7Ci0JCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQkJc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QUkVfQ0xPU0UgOgotCQkJCQljYXNlIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9ERUxFVEUgOiB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHBhaXIgZGVsdGFzIHdpdGggcHJvamVjdHMKLQkJCQkJCQlJUmVzb3VyY2VEZWx0YVtdIGRlbHRhcyA9IG5ldyBJUmVzb3VyY2VEZWx0YVtde2V2ZW50LmdldERlbHRhKCl9OwotCQkJCQkJCUlQcm9qZWN0W10gcHJvamVjdHMgPSBudWxsOwotCi0JCQkJCQkJaWYgKGRlbHRhcyAhPSBudWxsICYmIGRlbHRhcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCQkJCQkJCWlmIChkZWx0YXNbMF0gIT0gbnVsbCkgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBkZWx0YXNbMF0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCXJlc291cmNlID0gZXZlbnQuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJfQotCi0JCQkJCQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5ST09UKSB7Ci0JCQkJCQkJCQkJZGVsdGFzID0gZGVsdGFzWzBdLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFtkZWx0YXMubGVuZ3RoXTsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCQlpZiAoZGVsdGFzW2ldLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCQlwcm9qZWN0c1tpXSA9IChJUHJvamVjdCkgZGVsdGFzW2ldLmdldFJlc291cmNlKCk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQlwcm9qZWN0cyA9IG5ldyBJUHJvamVjdFsxXTsKLQkJCQkJCQkJCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCQkJCQkJCXByb2plY3RzWzBdID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSAoSVByb2plY3QpIHJlc291cmNlOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCBub3RpY2VkICIgKyBwcm9qZWN0c1tpXS5nZXROYW1lKCkgKyAiIGlzIGFib3V0IHRvIGJlIGRlbGV0ZWQvY2xvc2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pIHsKLQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIGluZGV4IG9mICIgKyBkZXNjcmlwdGlvbi5mUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWRlc2NyaXB0aW9uLmNsZWFyKCk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXNvdXJjZSBkZWxldGlvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2FzZSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSA6IHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gcGFpciBkZWx0YXMgd2l0aCBwcm9qZWN0cwotCQkJCQkJCUlSZXNvdXJjZURlbHRhW10gZGVsdGFzID0gbmV3IElSZXNvdXJjZURlbHRhW117ZXZlbnQuZ2V0RGVsdGEoKX07Ci0JCQkJCQkJSVByb2plY3RbXSBwcm9qZWN0cyA9IG51bGw7Ci0KLQkJCQkJCQlpZiAoZGVsdGFzICE9IG51bGwgJiYgZGVsdGFzLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJCQkJCQkJaWYgKGRlbHRhc1swXSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlyZXNvdXJjZSA9IGRlbHRhc1swXS5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJcmVzb3VyY2UgPSBldmVudC5nZXRSZXNvdXJjZSgpOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlJPT1QpIHsKLQkJCQkJCQkJCQlkZWx0YXMgPSBkZWx0YXNbMF0uZ2V0QWZmZWN0ZWRDaGlsZHJlbigpOwotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0W2RlbHRhcy5sZW5ndGhdOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCQkJCWlmIChkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJCXByb2plY3RzW2ldID0gKElQcm9qZWN0KSBkZWx0YXNbaV0uZ2V0UmVzb3VyY2UoKTsKLQkJCQkJCQkJCQkJfQotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCXByb2plY3RzID0gbmV3IElQcm9qZWN0WzFdOwotCQkJCQkJCQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCQkJCQkJCQkJcHJvamVjdHNbMF0gPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWVsc2UgewotCQkJCQkJCQkJCQlwcm9qZWN0c1swXSA9IChJUHJvamVjdCkgcmVzb3VyY2U7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJaWYgKGRlbHRhc1tpXSAhPSBudWxsICYmIGRlbHRhc1tpXS5nZXRLaW5kKCkgIT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCAmJiBwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkJCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBnZXREZXNjcmlwdGlvbihwcm9qZWN0c1tpXSk7Ci0JCQkJCQkJCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsICYmICFmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKSB7Ci0JCQkJCQkJCQkJCQlkZWx0YXNbaV0uYWNjZXB0KGRlc2NyaXB0aW9uLmdldFZpc2l0b3IoKSk7Ci0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJaWYgKCFwcm9qZWN0c1tpXS5pc0FjY2Vzc2libGUoKSB8fCAoZGVsdGFzW2ldICE9IG51bGwgJiYgZGVsdGFzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSkgewotCQkJCQkJCQkJCQlpZiAoX2RlYnVnSW5kZXhDcmVhdGlvbikgewotCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IG5vdGljZWQgIiArIHByb2plY3RzW2ldLmdldE5hbWUoKSArICIgd2FzIHJlbW92ZWQgb3IgaXMgbm8gbG9uZ2VyIGFjY2Vzc2libGUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCQkJCX0KLQkJCQkJCQkJCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgZlByb2plY3REZXNjcmlwdGlvbnMucmVtb3ZlKHByb2plY3RzW2ldKTsKLQkJCQkJCQkJCQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJCWlmIChfZGVidWdJbmRleENyZWF0aW9uKSB7Ci0JCQkJCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgInJlbW92aW5nIGluZGV4IG9mICIgKyBkZXNjcmlwdGlvbi5mUHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJCQlkZXNjcmlwdGlvbi5jbGVhcigpOwotCQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyByZXNvdXJjZSBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdDaGFuZ2VMaXN0ZW5lciA9IGZhbHNlOwotCi0Jc3RhdGljIGJvb2xlYW4gX2RlYnVnRXZlbnRzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS90YWdsaWIvZXZlbnRzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBib29sZWFuIF9kZWJ1Z0luZGV4Q3JlYXRpb24gPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3RhZ2xpYi9pbmRleGNyZWF0aW9uIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1Jlc29sdXRpb24gPSAidHJ1ZSIuZXF1YWxzKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvdGFnbGliL3Jlc29sdmUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0Jc3RhdGljIFRhZ2xpYkluZGV4IF9pbnN0YW5jZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIENSQzMyIGNoZWNrc3VtQ2FsY3VsYXRvciA9IG5ldyBDUkMzMigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOID0gIkNMRUFOIjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSVFkgPSAiRElSVFkiOwotCXN0YXRpYyBib29sZWFuIEVOQUJMRUQgPSBmYWxzZTsKLQotCXN0YXRpYyBJTG9jayBMT0NLID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQotCS8qKgotCSAqIE5PVCBBUEkuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlpZiAoX2luc3RhbmNlICE9IG51bGwpCi0JCQkJX2luc3RhbmNlLmludGVybmFsQWRkVGFnbGliSW5kZXhMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXN0YXRpYyB2b2lkIGZpcmVUYWdsaWJSZWNvcmRFdmVudChJVGFnbGliUmVjb3JkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKF9kZWJ1Z0V2ZW50cykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IGZpcmVkIGV2ZW50OiIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQkvKgotCQkgKiBGbHVzaCBhbnkgc2hhcmVkIGNhY2hlIGVudHJpZXMsIHRoZSBUYWdsaWJDb250cm9sbGVycyBzaG91bGQgaGFuZGxlCi0JCSAqIHVwZGF0aW5nIHRoZWlyIGRvY3VtZW50cyBhcyBuZWVkZWQuCi0JCSAqLwotCQlUTERDTURvY3VtZW50TWFuYWdlci5nZXRTaGFyZWREb2N1bWVudENhY2hlKCkucmVtb3ZlKFRMRENNRG9jdW1lbnRNYW5hZ2VyLmdldFVuaXF1ZUlkZW50aWZpZXIoZXZlbnQuZ2V0VGFnbGliUmVjb3JkKCkpKTsKLQotCQlpZiAoX2luc3RhbmNlICE9IG51bGwpIHsKLQkJCUlUYWdsaWJJbmRleExpc3RlbmVyW10gbGlzdGVuZXJzID0gX2luc3RhbmNlLmZUYWdsaWJJbmRleExpc3RlbmVyczsKLQkJCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaXN0ZW5lcnNbaV0uaW5kZXhDaGFuZ2VkKGV2ZW50KTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEZpbmRzIGFsbCBvZiB0aGUgdmlzaWJsZSBJVGFnbGliUmVjb3JkcyBmb3IgdGhlIGdpdmVuIHBhdGggaW4gdGhlCi0JICogd29ya3NwYWNlLiBUYWdsaWIgbWFwcGluZ3MgZnJvbSB3ZWIueG1sIGZpbGVzIGFyZSBvbmx5IHZpc2libGUgdG8gcGF0aHMKLQkgKiB3aXRoaW4gdGhlIHdlYi54bWwncyBjb3JyZXNwb25kaW5nIHdlYiBjb250ZW50IGZvbGRlci4KLQkgKiA8cD4KLQkgKiBWYWx1ZXMgZGVmaW5lZCB3aXRoaW4gdGhlIFhNTCBDYXRhbG9nIHdpbGwgbm90IGJlIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZnVsbFBhdGggLQotCSAqICAgICAgICAgICAgYSBwYXRoIHdpdGhpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiBBbGwgb2YgdGhlIHZpc2libGUgSVRhZ2xpYlJlY29yZHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElUYWdsaWJSZWNvcmRbXSBnZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKElQYXRoIGZ1bGxQYXRoKSB7Ci0JCXRyeSB7Ci0JCQlMT0NLLmFjcXVpcmUoKTsKLQkJCUlUYWdsaWJSZWNvcmRbXSByZWNvcmRzID0gbnVsbDsKLQkJCWlmIChfaW5zdGFuY2UgIT0gbnVsbCkKLQkJCQlyZWNvcmRzID0gX2luc3RhbmNlLmludGVybmFsR2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhmdWxsUGF0aCk7Ci0JCQllbHNlCi0JCQkJcmVjb3JkcyA9IG5ldyBJVGFnbGliUmVjb3JkWzBdOwotCQkJcmV0dXJuIHJlY29yZHM7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElQYXRoIGNvbnNpZGVyZWQgdG8gYmUgdGhlIHdlYi1hcHAgcm9vdCBmb3IgdGhlIGdpdmVuIHBhdGguCi0JICogQWxsIHJlc29sdXRpb24gZnJvbSB0aGUgZ2l2ZW4gcGF0aCBiZWdpbm5pbmcgd2l0aCAnLycgd2lsbCBiZSByZWxhdGl2ZQotCSAqIHRvIHRoZSBjb21wdXRlZCB3ZWItYXBwIHJvb3QuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBpcyBub3QgY29ycmVjdCBpbiBmbGV4aWJsZSBwcm9qZWN0cwotCSAqIEBwYXJhbSBwYXRoIC0KLQkgKiAgICAgICAgICAgIGEgcGF0aCB1bmRlciB0aGUgd2ViLWFwcCByb290Ci0JICogQHJldHVybiB0aGUgSVBhdGggY29uc2lkZXJlZCB0byBiZSB0aGUgd2ViLWFwcCdzIHJvb3QgZm9yIHRoZSBnaXZlbgotCSAqICAgICAgICAgcGF0aAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVBhdGggZ2V0Q29udGV4dFJvb3QoSVBhdGggcGF0aCkgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlyZXR1cm4gX2luc3RhbmNlLmludGVybmFsR2V0Q29udGV4dFJvb3QocGF0aCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0YXRlKCkgewotCQlTdHJpbmcgc3RhdGUgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhUYWdsaWJJbmRleC5jbGFzcy5nZXROYW1lKCkpOwotCQlyZXR1cm4gc3RhdGU7Ci0JfQotCi0JLyoqCi0JICogTk9UIEFQSS4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJaWYgKF9pbnN0YW5jZSAhPSBudWxsKQotCQkJCV9pbnN0YW5jZS5pbnRlcm5hbFJlbW92ZVRhZ2xpYkluZGV4TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJTE9DSy5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhIG1hdGNoaW5nIElUYWdsaWJSZWNvcmQgZ2l2ZW4gdGhlIHJlZmVyZW5jZS4gVHlwaWNhbGx5IHRoZQotCSAqIHJlc3VsdCB3aWxsIGhhdmUgdG8gYmUgY2FzdCB0byBhIHN1YmlpbnRlcmZhY2Ugb2YgSVRhZ2xpYlJlY29yZC4KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZVBhdGggLQotCSAqICAgICAgICAgICAgdGhlIHdvcmtzcGFjZS1yZWxhdGl2ZSBwYXRoIGZvciBJUmVzb3VyY2VzLCBmdWxsIGZpbGVzeXN0ZW0KLQkgKiAgICAgICAgICAgIHBhdGggb3RoZXJ3aXNlCi0JICogQHBhcmFtIHJlZmVyZW5jZSAtCi0JICogICAgICAgICAgICB0aGUgVVJJIHRvIGxvb2t1cCwgZm9yIGV4YW1wbGUgdGhlIHVyaSB2YWx1ZSBmcm9tIGEgdGFnbGliCi0JICogICAgICAgICAgICBkaXJlY3RpdmUKLQkgKiBAcGFyYW0gY3Jvc3NQcm9qZWN0cyAtCi0JICogICAgICAgICAgICB3aGV0aGVyIHRvIHNlYXJjaCBhY3Jvc3MgcHJvamVjdHMgKGN1cnJlbnRseSBpZ25vcmVkKQotCSAqIAotCSAqIEByZXR1cm4gYSB2aXNpYmxlIElUYWdsaWJSZWNvcmQgb3IgbnVsbCBpZiB0aGUgcmVmZXJlbmNlIHBvaW50cyB0byBubwotCSAqICAgICAgICAga25vd24gdGFnIGxpYnJhcnkgZGVzY3JpcHRvcgotCSAqIAotCSAqIEBTZWUgSVRhZ2xpYlJlY29yZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVRhZ2xpYlJlY29yZCByZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgU3RyaW5nIHJlZmVyZW5jZSwgYm9vbGVhbiBjcm9zc1Byb2plY3RzKSB7Ci0JCUlUYWdsaWJSZWNvcmQgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJaWYgKF9pbnN0YW5jZSAhPSBudWxsKQotCQkJCXJlc3VsdCA9IF9pbnN0YW5jZS5pbnRlcm5hbFJlc29sdmUoYmFzZVBhdGgsIHJlZmVyZW5jZSwgY3Jvc3NQcm9qZWN0cyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlMT0NLLnJlbGVhc2UoKTsKLQkJfQotCQlpZiAoX2RlYnVnUmVzb2x1dGlvbikgewotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IGNvdWxkIG5vdCByZXNvbHZlIFwiIiArIHJlZmVyZW5jZSArICJcIiBmcm9tICIgKyBiYXNlUGF0aCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc3dpdGNoIChyZXN1bHQuZ2V0UmVjb3JkVHlwZSgpKSB7Ci0JCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQkJCUlUTERSZWNvcmQgcmVjb3JkID0gKElUTERSZWNvcmQpIHJlc3VsdDsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJUYWdsaWJJbmRleCByZXNvbHZlZCAiICsgYmFzZVBhdGggKyAiOiIgKyByZWZlcmVuY2UgKyAiID0gIiArIHJlY29yZC5nZXRQYXRoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5KQVIpIDogewotCQkJCQkJSUphclJlY29yZCByZWNvcmQgPSAoSUphclJlY29yZCkgcmVzdWx0OwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc29sdmVkICIgKyBiYXNlUGF0aCArICI6IiArIHJlZmVyZW5jZSArICIgPSAiICsgcmVjb3JkLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5UQUdESVIpIDogewotCQkJCQl9Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgcmVzdWx0OwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIlRhZ2xpYkluZGV4IHJlc29sdmVkICIgKyBiYXNlUGF0aCArICI6IiArIHJlZmVyZW5jZSArICIgPSAiICsgcmVjb3JkLmdldFVSTCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBpbmRleCBmaWxlcy4gVXNlZCBmb3IgbWFpbnRlbmFuY2UgYW5kIGtlZXBpbmcgdGhlIGluZGV4IGZvbGRlcgotCSAqIGEgbWFuYWdlYWJsZSBzaXplLgotCSAqIAotCSAqIEBwYXJhbSBzdGFsZU9ubHkgLQotCSAqICAgICAgICAgICAgaWYgPGI+dHJ1ZTwvYj4sIHJlbW92ZXMgb25seSB0aGUgaW5kZXhlcyBmb3IgcHJvamVjdHMgbm90Ci0JICogICAgICAgICAgICBvcGVuIGluIHRoZSB3b3Jrc3BhY2UsIGlmIDxiPmZhbHNlPC9iPiwgcmVtb3ZlcyBhbGwgb2YgdGhlCi0JICogICAgICAgICAgICBpbmRleGVzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUluZGV4ZXMoYm9vbGVhbiBzdGFsZU9ubHkpIHsKLQkJU3RyaW5nIG9zUGF0aCA9IGdldFRhZ2xpYkluZGV4U3RhdGVMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJRmlsZSBmb2xkZXIgPSBuZXcgRmlsZShvc1BhdGgpOwotCQlpZiAoIWZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQl0cnkgewotCQkJCWZvbGRlci5ta2RpcigpOwotCQkJfQotCQkJY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCi0JCS8vIHJlbW92ZSBhbnkgZXh0cmFuZW91cyBpbmRleCBmaWxlcwotCQlJUHJvamVjdFtdIHByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlMaXN0IGluZGV4TmFtZXMgPSBuZXcgQXJyYXlMaXN0KHByb2plY3RzLmxlbmd0aCk7Ci0JCWlmIChzdGFsZU9ubHkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAocHJvamVjdHNbaV0uaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJaW5kZXhOYW1lcy5hZGQoY29tcHV0ZUluZGV4TmFtZShwcm9qZWN0c1tpXS5nZXRGdWxsUGF0aCgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGZvbGRlci5pc0RpcmVjdG9yeSgpKSB7Ci0JCQlGaWxlW10gZmlsZXMgPSBmb2xkZXIubGlzdEZpbGVzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgZmlsZXMgIT0gbnVsbCAmJiBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoIWluZGV4TmFtZXMuY29udGFpbnMoZmlsZXNbaV0uZ2V0TmFtZSgpKSkKLQkJCQkJZmlsZXNbaV0uZGVsZXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnN0cnVjdHMgdGhlIGluZGV4IHRvIHN0b3AgbGlzdGVuaW5nIGZvciByZXNvdXJjZSBhbmQgY2xhc3NwYXRoCi0JICogY2hhbmdlcywgYW5kIHRvIGZvcmdldCBhbGwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHN5bmNocm9uaXplZCB2b2lkIHNodXRkb3duKCkgewotCQl0cnkgewotCQkJTE9DSy5hY3F1aXJlKCk7Ci0JCQlpZiAoX2luc3RhbmNlICE9IG51bGwpIHsKLQkJCQlfaW5zdGFuY2Uuc3RvcCgpOwotCQkJfQotCQkJX2luc3RhbmNlID0gbnVsbDsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zdHJ1Y3RzIHRoZSBpbmRleCB0byBiZWdpbiBsaXN0ZW5pbmcgZm9yIHJlc291cmNlIGFuZCBjbGFzc3BhdGgKLQkgKiBjaGFuZ2VzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgc3RhcnR1cCgpIHsKLQkJdHJ5IHsKLQkJCUxPQ0suYWNxdWlyZSgpOwotCQkJRU5BQkxFRCA9ICEiZmFsc2UiLmVxdWFsc0lnbm9yZUNhc2UoU3lzdGVtLmdldFByb3BlcnR5KFRhZ2xpYkluZGV4LmNsYXNzLmdldE5hbWUoKSkpOyAvLyROT04tTkxTLTEkCi0JCQlfaW5zdGFuY2UgPSBuZXcgVGFnbGliSW5kZXgoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCUxPQ0sucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lciBmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgPSBudWxsOwotCi0JTWFwIGZQcm9qZWN0RGVzY3JpcHRpb25zOwotCi0JcHJpdmF0ZSBSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotCi0JcHJpdmF0ZSBJVGFnbGliSW5kZXhMaXN0ZW5lcltdIGZUYWdsaWJJbmRleExpc3RlbmVycyA9IG51bGw7Ci0JLyoqIHN5bWJvbGljIG5hbWUgZm9yIE9TR0kgZnJhbWV3b3JrICovCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1NHSV9GUkFNRVdPUktfSUQgPSAib3JnLmVjbGlwc2Uub3NnaSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgVGFnbGliSW5kZXgoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJLyoKLQkJICogT25seSBjb25zaWRlciBhIGNyYXNoIGlmIGEgdmFsdWUgZXhpc3RzIGFuZCBpcyBESVJUWSAobm90IGEgbmV3Ci0JCSAqIHdvcmtzcGFjZSkKLQkJICovCi0JCWlmIChESVJUWS5lcXVhbHNJZ25vcmVDYXNlKGdldFN0YXRlKCkpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkEgd29ya3NwYWNlIGNyYXNoIHdhcyBkZXRlY3RlZC4gVGhlIHByZXZpb3VzIHNlc3Npb24gZGlkIG5vdCBleGl0IG5vcm1hbGx5LiBOb3QgdXNpbmcgc2F2ZWQgdGFnbGliIGluZGV4ZXMiKTsgLy8kTk9OLU5MUy0zJAotCQkJcmVtb3ZlSW5kZXhlcyhmYWxzZSk7Ci0JCX0KLQotCQlmUHJvamVjdERlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIgPSBuZXcgQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIoKTsKLQkJaWYgKEVOQUJMRUQpIHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyLCBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSk7Ci0JCQlKYXZhQ29yZS5hZGRFbGVtZW50Q2hhbmdlZExpc3RlbmVyKGZDbGFzc3BhdGhDaGFuZ2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBCYXNlZCBvbiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZS5zZWFyY2guaW5kZXhpbmcuSW5kZXhNYW5hZ2VyCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lclBhdGgKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGNvbXB1dGVJbmRleExvY2F0aW9uKElQYXRoIGNvbnRhaW5lclBhdGgpIHsKLQkJU3RyaW5nIGZpbGVOYW1lID0gY29tcHV0ZUluZGV4TmFtZShjb250YWluZXJQYXRoKTsKLQkJaWYgKF9kZWJ1Z0luZGV4Q3JlYXRpb24pCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiLT4gaW5kZXggbmFtZSBmb3IgIiArIGNvbnRhaW5lclBhdGggKyAiIGlzICIgKyBmaWxlTmFtZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlTdHJpbmcgaW5kZXhMb2NhdGlvbiA9IGdldFRhZ2xpYkluZGV4U3RhdGVMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSkudG9PU1N0cmluZygpOwotCQlyZXR1cm4gaW5kZXhMb2NhdGlvbjsKLQl9Ci0KLQlTdHJpbmcgY29tcHV0ZUluZGV4TmFtZShJUGF0aCBjb250YWluZXJQYXRoKSB7Ci0JCWNoZWNrc3VtQ2FsY3VsYXRvci5yZXNldCgpOwotCQljaGVja3N1bUNhbGN1bGF0b3IudXBkYXRlKGNvbnRhaW5lclBhdGgudG9PU1N0cmluZygpLmdldEJ5dGVzKCkpOwotCQkvLyB1c2UgIi5kYXQiIHNvIHdlJ3JlIG5vdCBjb25mdXNlZCB3aXRoIEpEVCBpbmRleGVzCi0JCVN0cmluZyBmaWxlTmFtZSA9IExvbmcudG9TdHJpbmcoY2hlY2tzdW1DYWxjdWxhdG9yLmdldFZhbHVlKCkpICsgIi5kYXQiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmaWxlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqIEByZXR1cm4KLQkgKi8KLQlQcm9qZWN0RGVzY3JpcHRpb24gY3JlYXRlRGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQlkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGZQcm9qZWN0RGVzY3JpcHRpb25zLmdldChwcm9qZWN0KTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCS8vIE9uY2Ugd2UndmUgc3RhcnRlZCBpbmRleGluZywgd2UncmUgZGlydHkgYWdhaW4KLQkJCWlmIChmUHJvamVjdERlc2NyaXB0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlzZXRTdGF0ZShESVJUWSk7Ci0JCQl9Ci0JCQlkZXNjcmlwdGlvbiA9IG5ldyBQcm9qZWN0RGVzY3JpcHRpb24ocHJvamVjdCwgY29tcHV0ZUluZGV4TG9jYXRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpKSk7Ci0JCQlmUHJvamVjdERlc2NyaXB0aW9ucy5wdXQocHJvamVjdCwgZGVzY3JpcHRpb24pOwotCQl9Ci0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBIGNoZWNrIHRvIHNlZSBpZiB0aGUgT1NHSSBmcmFtZXdvcmsgaXMgc2h1dHRpbmcgZG93bi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFN5c3RlbSBCdW5kbGUgaXMgc3RvcHBlZCAoaWUuIHRoZSBmcmFtZXdvcmsgaXMKLQkgKiAgICAgICAgIHNodXR0aW5nIGRvd24pCi0JICovCi0JYm9vbGVhbiBmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpIHsKLQkJLy8gaW4gdGhlIEZyYW1ld29yayBjbGFzcyB0aGVyZSdzIGEgbm90ZToKLQkJLy8gc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3lzdGVtIEJ1bmRsZSB0byBTVE9QUElORy4KLQkJLy8gdGhpcyBtdXN0IGJlIGRvbmUgZmlyc3QgYWNjb3JkaW5nIHRvIHNlY3Rpb24gNC4xOS4yIGZyb20gdGhlIE9TR2kKLQkJLy8gUjMgc3BlYy4KLQkJYm9vbGVhbiBzaHV0dGluZ0Rvd24gPSAhUGxhdGZvcm0uaXNSdW5uaW5nKCkgfHwgUGxhdGZvcm0uZ2V0QnVuZGxlKE9TR0lfRlJBTUVXT1JLX0lEKS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVE9QUElORzsKLQkJcmV0dXJuIHNodXR0aW5nRG93bjsKLQl9Ci0KLQlQcm9qZWN0RGVzY3JpcHRpb24gZ2V0RGVzY3JpcHRpb24oSVByb2plY3QgcHJvamVjdCkgewotCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBudWxsOwotCQlkZXNjcmlwdGlvbiA9IChQcm9qZWN0RGVzY3JpcHRpb24pIGZQcm9qZWN0RGVzY3JpcHRpb25zLmdldChwcm9qZWN0KTsKLQkJcmV0dXJuIGRlc2NyaXB0aW9uOwotCX0KLQotCXByaXZhdGUgSVBhdGggZ2V0VGFnbGliSW5kZXhTdGF0ZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZCgidGFnbGliaW5kZXgvIik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsQWRkVGFnbGliSW5kZXhMaXN0ZW5lcihJVGFnbGliSW5kZXhMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoZlRhZ2xpYkluZGV4TGlzdGVuZXJzID09IG51bGwpIHsKLQkJCWZUYWdsaWJJbmRleExpc3RlbmVycyA9IG5ldyBJVGFnbGliSW5kZXhMaXN0ZW5lcltde2xpc3RlbmVyfTsKLQkJfQotCQllbHNlIHsKLQkJCUxpc3QgbGlzdGVuZXJzID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KGZUYWdsaWJJbmRleExpc3RlbmVycykpOwotCQkJbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCQlmVGFnbGliSW5kZXhMaXN0ZW5lcnMgPSAoSVRhZ2xpYkluZGV4TGlzdGVuZXJbXSkgbGlzdGVuZXJzLnRvQXJyYXkobmV3IElUYWdsaWJJbmRleExpc3RlbmVyWzBdKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSVRhZ2xpYlJlY29yZFtdIGludGVybmFsR2V0QXZhaWxhYmxlVGFnbGliUmVjb3JkcyhJUGF0aCBwYXRoKSB7Ci0JCUlUYWdsaWJSZWNvcmRbXSByZWNvcmRzID0gbmV3IElUYWdsaWJSZWNvcmRbMF07Ci0JCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnNlZ21lbnQoMCkpOwotCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gY3JlYXRlRGVzY3JpcHRpb24ocHJvamVjdCk7Ci0JCQlMaXN0IGF2YWlsYWJsZVJlY29yZHMgPSBkZXNjcmlwdGlvbi5nZXRBdmFpbGFibGVUYWdsaWJSZWNvcmRzKHBhdGgpOwotCi0JCQkvLyBJQ2F0YWxvZyBjYXRhbG9nID0KLQkJCS8vIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0JCQkvLyB3aGlsZSAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkvLyBJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKGVudHJpZXNbaV0uZ2V0VVJJKCkpOwotCQkJLy8gfQotCQkJLy8gSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gY2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLQkJCS8vIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKSB7Ci0JCQkvLyBJQ2F0YWxvZ0VudHJ5W10gZW50cmllczIgPQotCQkJLy8gbmV4dENhdGFsb2dzW2ldLmdldFJlZmVyZW5jZWRDYXRhbG9nKCkuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJCS8vIGZvciAoaW50IGogPSAwOyBqIDwgZW50cmllczIubGVuZ3RoOyBqKyspIHsKLQkJCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbihlbnRyaWVzMltqXS5nZXRVUkkoKSk7Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0JCQkvLyB9Ci0KLQkJCXJlY29yZHMgPSAoSVRhZ2xpYlJlY29yZFtdKSBhdmFpbGFibGVSZWNvcmRzLnRvQXJyYXkocmVjb3Jkcyk7Ci0JCX0KLQkJcmV0dXJuIHJlY29yZHM7Ci0JfQotCi0JcHJpdmF0ZSBJUGF0aCBpbnRlcm5hbEdldENvbnRleHRSb290KElQYXRoIHBhdGgpIHsKLQkJSUZpbGUgYmFzZVJlc291cmNlID0gRmlsZUJ1ZmZlcnMuZ2V0V29ya3NwYWNlRmlsZUF0TG9jYXRpb24ocGF0aCk7Ci0JCWlmIChiYXNlUmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IGJhc2VSZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlQcm9qZWN0RGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBfaW5zdGFuY2UuY3JlYXRlRGVzY3JpcHRpb24ocHJvamVjdCk7Ci0JCQlJUGF0aCByb290UGF0aCA9IGRlc2NyaXB0aW9uLmdldExvY2FsUm9vdChiYXNlUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSk7Ci0JCQlyZXR1cm4gcm9vdFBhdGg7Ci0JCX0KLQkJLy8gdHJ5IHRvIGhhbmRsZSBvdXQtb2Ytd29ya3NwYWNlIHBhdGhzCi0JCUlQYXRoIHJvb3QgPSBwYXRoOwotCQl3aGlsZSAocm9vdCAhPSBudWxsICYmICFyb290LmlzUm9vdCgpKQotCQkJcm9vdCA9IHJvb3QucmVtb3ZlTGFzdFNlZ21lbnRzKDEpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcm9vdCA9IHBhdGg7Ci0JCXJldHVybiByb290OwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbFJlbW92ZVRhZ2xpYkluZGV4TGlzdGVuZXIoSVRhZ2xpYkluZGV4TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGZUYWdsaWJJbmRleExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlMaXN0IGxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFnbGliSW5kZXhMaXN0ZW5lcnMpKTsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQkJZlRhZ2xpYkluZGV4TGlzdGVuZXJzID0gKElUYWdsaWJJbmRleExpc3RlbmVyW10pIGxpc3RlbmVycy50b0FycmF5KG5ldyBJVGFnbGliSW5kZXhMaXN0ZW5lclswXSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElUYWdsaWJSZWNvcmQgaW50ZXJuYWxSZXNvbHZlKFN0cmluZyBiYXNlUGF0aCwgZmluYWwgU3RyaW5nIHJlZmVyZW5jZSwgYm9vbGVhbiBjcm9zc1Byb2plY3RzKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlJVGFnbGliUmVjb3JkIHJlc29sdmVkID0gbnVsbDsKLQotCQlQYXRoIGJhc2VJUGF0aCA9IG5ldyBQYXRoKGJhc2VQYXRoKTsKLQkJSVJlc291cmNlIGJhc2VSZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGJhc2VJUGF0aCk7Ci0KLQkJaWYgKGJhc2VSZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2VSb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCS8vIFRyeSB0aGUgYmFzZSBwYXRoIGFzIGEgZm9sZGVyIGZpcnN0Ci0JCQlpZiAoYmFzZVJlc291cmNlID09IG51bGwgJiYgYmFzZUlQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCWJhc2VSZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0Rm9sZGVyKGJhc2VJUGF0aCk7Ci0JCQl9Ci0JCQkvLyBJZiBub3QgYSBmb2xkZXIsIHRoZW4gdHJ5IGJhc2UgcGF0aCBhcyBhIGZpbGUKLQkJCWlmIChiYXNlUmVzb3VyY2UgIT0gbnVsbCAmJiAhYmFzZVJlc291cmNlLmV4aXN0cygpICYmIGJhc2VJUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCQliYXNlUmVzb3VyY2UgPSB3b3Jrc3BhY2VSb290LmdldEZpbGUoYmFzZUlQYXRoKTsKLQkJCX0KLQkJCWlmIChiYXNlUmVzb3VyY2UgPT0gbnVsbCAmJiBiYXNlSVBhdGguc2VnbWVudENvdW50KCkgPT0gMSkgewotCQkJCWJhc2VSZXNvdXJjZSA9IHdvcmtzcGFjZVJvb3QuZ2V0UHJvamVjdChiYXNlSVBhdGguc2VnbWVudCgwKSk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYmFzZVJlc291cmNlID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE2NTI5Ci0JCQkgKiAKLQkJCSAqIFRoaXMgbWV0aG9kIHByb2R1Y2VzIGEgbGVzcyBhY2N1cmF0ZSByZXN1bHQsIGJ1dCBkb2Vzbid0Ci0JCQkgKiByZXF1aXJlIHRoYXQgdGhlIGZpbGUgZXhpc3QgeWV0LgotCQkJICovCi0JCQlJRmlsZVtdIGZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihiYXNlSVBhdGgpOwotCQkJaWYgKGZpbGVzLmxlbmd0aCA+IDApCi0JCQkJYmFzZVJlc291cmNlID0gZmlsZXNbMF07Ci0JCX0KLQkJaWYgKGJhc2VSZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0ID0gYmFzZVJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCVByb2plY3REZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IGNyZWF0ZURlc2NyaXB0aW9uKHByb2plY3QpOwotCQkJcmVzb2x2ZWQgPSBkZXNjcmlwdGlvbi5yZXNvbHZlKGJhc2VQYXRoLCByZWZlcmVuY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc29sdmVkOwotCX0KLQotCWJvb2xlYW4gaXNJbmRleEF2YWlsYWJsZSgpIHsKLQkJcmV0dXJuIF9pbnN0YW5jZSAhPSBudWxsICYmIEVOQUJMRUQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldFN0YXRlKFN0cmluZyBzdGF0ZSkgewotCQlpZiAoIXN0YXRlLmVxdWFscyhnZXRTdGF0ZSgpKSkgewotCQkJSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShUYWdsaWJJbmRleC5jbGFzcy5nZXROYW1lKCksIHN0YXRlKTsKLQkJCUpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0b3AoKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKGZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKTsKLQkJSmF2YUNvcmUucmVtb3ZlRWxlbWVudENoYW5nZWRMaXN0ZW5lcihmQ2xhc3NwYXRoQ2hhbmdlTGlzdGVuZXIpOwotCi0JCS8qCi0JCSAqIENsZWFyaW5nIHRoZSBleGlzdGluZyBzYXZlZCBzdGF0ZXMgaGVscHMgcHJ1bmUgZGVhZCBkYXRhIGZyb20gdGhlCi0JCSAqIGluZGV4IGZvbGRlci4KLQkJICovCi0JCXJlbW92ZUluZGV4ZXModHJ1ZSk7Ci0KLQkJSXRlcmF0b3IgaSA9IGZQcm9qZWN0RGVzY3JpcHRpb25zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJUHJvamVjdERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gKFByb2plY3REZXNjcmlwdGlvbikgaS5uZXh0KCk7Ci0JCQlkZXNjcmlwdGlvbi5zYXZlUmVmZXJlbmNlcygpOwotCQl9Ci0KLQkJZlByb2plY3REZXNjcmlwdGlvbnMuY2xlYXIoKTsKLQotCQlzZXRTdGF0ZShDTEVBTik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY29yZS90ZXh0L0lKU1BQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RleHQvSUpTUFBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGEzN2FhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jb3JlL3RleHQvSUpTUFBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24gdHlwZXMgZm9yIEpTUC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBzaW5jZSAxLjEKLSAqLwotcHVibGljIGludGVyZmFjZSBJSlNQUGFydGl0aW9ucyB7Ci0KLQlTdHJpbmcgSlNQX0RFRkFVTFQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5ERUZBVUxUX0pTUCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0NPTU1FTlQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQkKLQlTdHJpbmcgSlNQX1NDUklQVF9QUkVGSVggPSAib3JnLmVjbGlwc2UuanN0LmpzcC5TQ1JJUFQuIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9ERUxJTUlURVIgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJERUxJTUlURVIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9DT05URU5UX0pBVkEgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKQVZBIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKU1BfQ09OVEVOVF9KQVZBU0NSSVBUID0gSlNQX1NDUklQVF9QUkVGSVggKyAiSkFWQVNDUklQVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSlNQX0RFRkFVTFRfRUwgPSBKU1BfU0NSSVBUX1BSRUZJWCArICJKU1BfRUwiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEpTUF9ERUZBVUxUX0VMMiA9IEpTUF9TQ1JJUFRfUFJFRklYICsgIkpTUF9FTDIiOyAvLyROT04tTkxTLTEkCi0JCi0JU3RyaW5nIEpTUF9ESVJFQ1RJVkUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5KU1BfRElSRUNUSVZFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUGVkQ1NTVGFnbGliQ29udHJvbGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUGVkQ1NTVGFnbGliQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODRhNWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BlZENTU1RhZ2xpYkNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSURvY3VtZW50U2V0dXBQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTVGFnbGliQ29udHJvbGxlciBpbXBsZW1lbnRzIElEb2N1bWVudFNldHVwUGFydGljaXBhbnQgewotCi0JcHVibGljIHZvaWQgc2V0dXAoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIGlnbm9yZSBUTEQgaW4gY29udGVudCB0eXBlIGNzcyBqc3AKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckpTUGVkQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YWZhNmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckpTUGVkQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotcHVibGljIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JKU1BlZENTUyBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZVtdIFNVUFBPUlRFRF9PUFRJT05TID0ge0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgSUNvbnRlbnREZXNjcmlwdGlvbkZvckpTUC5MQU5HVUFHRV9BVFRSSUJVVEV9OwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaWJlciNkZXNjcmliZShqYXZhLmlvLklucHV0U3RyZWFtLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5WQUxJRDsKLQotCQkvLyBpZiBkaXNjcmlwdGlvbiBpcyBudWxsLCB3ZSBhcmUganVzdCBiZWluZyBhc2tlZCB0bwotCQkvLyBhc3Nlc3MgY29udGVudHMgdmFsaWRpdHkKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGRldGVybWluZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOVkFMSUQ7Ci0KLQkJLy8gaWYgZGlzY3JpcHRpb24gaXMgbnVsbCwgd2UgYXJlIGp1c3QgYmVpbmcgYXNrZWQgdG8KLQkJLy8gYXNzZXNzIGNvbnRlbnRzIHZhbGlkaXR5Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCQlyZXR1cm4gU1VQUE9SVEVEX09QVElPTlM7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JCWlmIChpc1JlbGV2ZW50KGRlc2NyaXB0aW9uKSkgewotCQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJCWRldGVjdG9yLnNldChjb250ZW50cyk7Ci0JCQloYW5kbGVDYWxjdWxhdGlvbnMoZGVzY3JpcHRpb24sIGRldGVjdG9yKTsKLQkJCXJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQkJcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuVkFMSUQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQ2FsY3VsYXRpb25zKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gaGFuZGxlIHN0YW5kYXJkIG9uZXMgZmlyc3QsIHRvIGJlIHN1cmUgZGV0ZWN0b3IgcHJvY2Vzc2VzCi0JCWhhbmRsZVN0YW5kYXJkQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCS8vIG5vdyBkbyB0aG9zZSBzcGVjaWZpYyBmb3IgSlNQcwotCQkvLyBub3RlOiBkZXRlY3RvciBzaG91bGQgYWx3YXlzIGJlIG9mIGNvcnJlY3QgaW5zdGFuY2UsIGJ1dCB3ZSdsbAotCQkvLyBjaGVjaywgZm9yIG5vdy4KLQkJaWYgKGRldGVjdG9yIGluc3RhbmNlb2YgSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSB7Ci0JCQlKU1BSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IganNwRGV0ZWN0b3IgPSAoSlNQUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcjsKLQkJCVN0cmluZyBsYW5ndWFnZSA9IGpzcERldGVjdG9yLmdldExhbmd1YWdlKCk7Ci0JCQlpZiAobGFuZ3VhZ2UgIT0gbnVsbCAmJiBsYW5ndWFnZS5sZW5ndGgoKSA+IDApIHsKLQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRm9ySlNQLkxBTkdVQUdFX0FUVFJJQlVURSwgbGFuZ3VhZ2UpOwotCQkJfQotCQkJU3RyaW5nIGNvbnRlbnRUeXBlQXR0cmlidXRlID0ganNwRGV0ZWN0b3IuZ2V0Q29udGVudFR5cGUoKTsKLQkJCWlmIChjb250ZW50VHlwZUF0dHJpYnV0ZSAhPSBudWxsICYmIGNvbnRlbnRUeXBlQXR0cmlidXRlLmxlbmd0aCgpID4gMCkgewotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSwgY29udGVudFR5cGVBdHRyaWJ1dGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEBwYXJhbSBkZXRlY3RvcgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3RhbmRhcmRDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSAoKEpTUFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYKLQkJCS8vIGludmFsaWQKLQkJCS8vIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJLy8gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIHRoZSBkZWZhdWx0LgotCQkJCU9iamVjdCBkZWZhdWx0Q2hhcnNldCA9IGRldGVjdG9yLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25Gb3JKU1AuQ09OVEVOVF9UWVBFX0FUVFJJQlVURSkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShSZWFkZXIgcmVhZGVyKSB7Ci0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSUpTUENTU0ltcG9ydFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NJbXBvcnRSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNzRiODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSUpTUENTU0ltcG9ydFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJSlNQQ1NTSW1wb3J0UnVsZSBleHRlbmRzIElDU1NJbXBvcnRSdWxlLCBJSlNQQ1NTTm9kZSB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9JSlNQQ1NTTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjI2NzU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lKU1BDU1NOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUpTUENTU05vZGUgZXh0ZW5kcyBJQ1NTTm9kZSB7Ci0Jc2hvcnQgSlNQX05PREUgPSAxNjsKLQlTdHJpbmcgZ2V0Q3NzVGV4dCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQQ1NTSW1wb3J0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU0ltcG9ydFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllOWRkMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQQ1NTSW1wb3J0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NJbXBvcnRSdWxlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLQotcHVibGljIGNsYXNzIEpTUENTU0ltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTSW1wb3J0UnVsZUltcGwgaW1wbGVtZW50cyBJSlNQQ1NTSW1wb3J0UnVsZSB7Ci0KLQlKU1BDU1NJbXBvcnRSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JCi0JSlNQQ1NTSW1wb3J0UnVsZUltcGwoSlNQQ1NTSW1wb3J0UnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkKLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlKU1BDU1NJbXBvcnRSdWxlSW1wbCBjbG9uZWQgPSBuZXcgSlNQQ1NTSW1wb3J0UnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoSFJFRik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKEhSRUYuZXF1YWxzKG5hbWUpKXsKLQkJCXZhbHVlID0gQ1NTVXRpbC5leHRyYWN0VXJpQ29udGVudHModmFsdWUpOwotCQl9Ci0JCXN1cGVyLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQQ1NTTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUENTU05vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyYmE3MGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQQ1NTTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotY2xhc3MgSlNQQ1NTTm9kZUltcGwgZXh0ZW5kcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJSlNQQ1NTTm9kZSB7Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCi0JSlNQQ1NTTm9kZUltcGwoSlNQQ1NTTm9kZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCX0KLQotCUpTUENTU05vZGVJbXBsKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZUZXh0ID0gdGV4dDsKLQl9Ci0JCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJSlNQQ1NTTm9kZUltcGwgY2xvbmVkID0gbmV3IEpTUENTU05vZGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBKU1BfTk9ERTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENzc1RleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9KU1BlZENTU01vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRhMGZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbFBhcnNlcjsKLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTTW9kZWxJbXBsIGV4dGVuZHMgQ1NTTW9kZWxJbXBsIHsKLQlwcml2YXRlIEpTUGVkQ1NTTW9kZWxQYXJzZXIgZlBhcnNlcjsKLQkKLQlwcm90ZWN0ZWQgQ1NTTW9kZWxQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAoZlBhcnNlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZlBhcnNlciA9IG5ldyBKU1BlZENTU01vZGVsUGFyc2VyKGdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQZWRDU1NNb2RlbFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQZWRDU1NNb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWE3MjNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUGVkQ1NTTW9kZWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5KU1BlZENTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbENyZWF0aW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU05vZGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1J1bGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBKU1BlZENTU01vZGVsUGFyc2VyIGV4dGVuZHMgQ1NTTW9kZWxQYXJzZXIgewotCi0JcHVibGljIEpTUGVkQ1NTTW9kZWxQYXJzZXIoSUNTU0RvY3VtZW50IGRvYykgewotCQlzdXBlcihkb2MpOwotCX0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTm9kZUltcGwgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUNTU01vZGVsQ3JlYXRpb25Db250ZXh0IGNyZWF0aW9uQ29udGV4dCA9IGdldENyZWF0aW9uQ29udGV4dCgpOwotCQlpZiAoY3JlYXRpb25Db250ZXh0ID09IG51bGwgfHwgcmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIHR5cGUgPSAoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSByZWdpb24pLmdldFR5cGUoKTsKLQkJQ1NTTm9kZUltcGwgbW9kaWZpZWQgPSBudWxsOwotCi0JCS8vSUNTU05vZGUgdGFyZ2V0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCQotCQlpZiAodHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRElSRUNUSVZFKXsKLQkJCQotCQkJYm9vbGVhbiBpc0luY2x1ZGUgPSByZWdpb24uZ2V0VGV4dCgpLmluZGV4T2YoImluY2x1ZGUiKSAhPSAtMTsKLQkJCWlmIChpc0luY2x1ZGUpewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0VW5rbm93bkltcG9ydChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQltb2RpZmllZCA9IGluc2VydFVua25vd25SdWxlKHJlZ2lvbik7CQkJCQkKLQkJCX0KLQkJfQotCi0JCS8vIHBvc3QgcHJvY2VzcwotCQlpZiAobW9kaWZpZWQgIT0gbnVsbCkgewotCQkJaWYgKG1vZGlmaWVkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIG1vZGlmaWVkKS5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGlmaWVkICE9IG51bGwgPyBtb2RpZmllZCA6IHN1cGVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihyZWdpb24pOwotCX0KLQotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0VW5rbm93bkltcG9ydChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlDU1NNb2RlbENyZWF0aW9uQ29udGV4dCBjcmVhdGlvbkNvbnRleHQgPSBnZXRDcmVhdGlvbkNvbnRleHQoKTsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gY3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJSUNTU0RvY3VtZW50IHNoZWV0ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCi0JCVN0cmluZyB0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJUGF0dGVybiBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCIgIik7Ci0JICAgIFN0cmluZ1tdIHN0cnMgPSBwYXR0ZXJuLnNwbGl0KHRleHQpOwotCSAgICBTdHJpbmcgaHJlZlZhbHVlID0gbnVsbDsKLQkgICAgZm9yIChpbnQgaT0wO2k8c3Rycy5sZW5ndGg7aSsrKSB7Ci0JICAgIAlTdHJpbmcgaHJlZlN0ciA9ICJmaWxlPVwiIjsKLQkgICAgICBpZiAoc3Ryc1tpXS5zdGFydHNXaXRoKGhyZWZTdHIpKXsKLQkJCQlpbnQgaHJlZlN0cl9sZW5ndGggPSBocmVmU3RyLmxlbmd0aCgpOwotCQkJCS8vIG1pbnVzIDEgdG8gYXZvaWQgcXVvdGU/Ci0JCQkJaW50IGhyZWZWYWx1ZV9sZW5ndGggPSBzdHJzW2ldLmxlbmd0aCgpIC0gMTsKLQkJCQlpZiAoaHJlZlZhbHVlX2xlbmd0aCA+IGhyZWZTdHJfbGVuZ3RoKSB7Ci0JCQkJCWhyZWZWYWx1ZSA9IHN0cnNbaV0uc3Vic3RyaW5nKGhyZWZTdHJfbGVuZ3RoLCBocmVmVmFsdWVfbGVuZ3RoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8qCi0JCQkJCSAqIElTU1VFOiB0aGlzIGhhbmRsZXMgY2FzZXMgd2hlcmUsIGUuZy4gImZpbGU9IiBoYXMgbm8KLQkJCQkJICogc3Vic2VxdWVudCAndmFsdWUnIC4uLiBhbmQgZnJvbSBjb2RlIGluIGluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQkgKiBJIGJlbGlldmUgc2hvdWxkIHJldHVybiBudWxsLCByYXRoZXIgdGhhbiBlbXB0eSBzdHJpbmcsIGJ1dCwgdGhpcyBtYXkgCi0JCQkJCSAqIG5lZWQgc29tZSBmaW5lIHR1bmluZyBldmVudHVhbGx5LgotCQkJCQkgKi8KLQkJCQkJaHJlZlZhbHVlID0gbnVsbDsKLQkJCQl9Ci0JICAgIAkgIGJyZWFrOwotCSAgICAgIH0KLQkgICAgfQotCQkKLQkJaWYgKGhyZWZWYWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUpTUENTU0ltcG9ydFJ1bGVJbXBsIHJ1bGUgPSBuZXcgSlNQQ1NTSW1wb3J0UnVsZUltcGwoKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHNoZWV0KTsKLQkJcnVsZS5hcHBlbmRDaGlsZCgoQ1NTTm9kZUltcGwpc2hlZXQuY3JlYXRlTWVkaWFMaXN0KCkpOwotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbiwgcmVnaW9uKTsKLQotCQkKLQkJaWYgKCFpc1VwZGF0ZUNvbnRleHRBY3RpdmUoKSkgewotCQkJcnVsZS5zZXRIcmVmKGhyZWZWYWx1ZSk7Ly9BdHRyaWJ1dGUoSUNTU0ltcG9ydFJ1bGUuSFJFRiwgaHJlZlZhbHVlKTsKLQkJfQotCi0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFpc1VwZGF0ZUNvbnRleHRBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJLy9wcm9wYWdhdGVSYW5nZVByZUluc2VydChzaGVldCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gY3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJKChDU1NOb2RlSW1wbClzaGVldCkuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJKChDU1NOb2RlSW1wbClzaGVldCkuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQkJLy9jcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRVbmtub3duUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUNTU01vZGVsQ3JlYXRpb25Db250ZXh0IGNyZWF0aW9uQ29udGV4dCA9IGdldENyZWF0aW9uQ29udGV4dCgpOwotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBjcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWlzUGFyc2VGbG9hdGluZygpICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUpTUENTU05vZGVJbXBsIHJ1bGUgPSBuZXcgSlNQQ1NTTm9kZUltcGwoZmxhdE5vZGUuZ2V0VGV4dCgpKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGZsYXROb2RlKTsKLQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghaXNVcGRhdGVDb250ZXh0QWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gY3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCS8vY3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQZWRDU1NEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSlNQZWRDU1NEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODdjYTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0pTUGVkQ1NTRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkpTUGVkQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBDU1NEb2N1bWVudExvYWRlciB7Ci1wdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQlyZXR1cm4gbmV3IEpTUGVkQ1NTU291cmNlUGFyc2VyKCk7Ci19Ci1wdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCXJldHVybiBuZXcgSlNQZWRDU1NEb2N1bWVudExvYWRlcigpOwotfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUGVkQ1NTTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9KU1BlZENTU01vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTE0YjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0pTUGVkQ1NTTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkpTUGVkQ1NTTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQZWRDU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkNTU01vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NNb2RlbExvYWRlciBleHRlbmRzIENTU01vZGVsTG9hZGVyIHsKLXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXcgSlNQZWRDU1NNb2RlbEltcGwoKTsKLQlyZXR1cm4gbW9kZWw7Ci19Ci1wdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCXJldHVybiBuZXcgSlNQZWRDU1NNb2RlbExvYWRlcigpOwotfQotcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQlpZiAoZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgSlNQZWRDU1NEb2N1bWVudExvYWRlcigpOwotCX0KLQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1BlZENTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2QxYzJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JKU1BlZENTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSlNQZWRDU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCXN0YXRpYyBTdHJpbmcgQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckpTUGVkQ1NTKCl7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQkKLQlwdWJsaWMgSU1vZGVsTG9hZGVyIGdldE1vZGVsTG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IEpTUGVkQ1NTTW9kZWxMb2FkZXIoKTsKLQl9Ci0JCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IENTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBKU1BlZENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0pTUGVkQ1NTU291cmNlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NTb3VyY2VQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI3OWM2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NTb3VyY2VQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkpTUGVkQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuSUNTU1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIEpTUGVkQ1NTU291cmNlUGFyc2VyIGV4dGVuZHMgQ1NTU291cmNlUGFyc2VyIHsKLQotCXByaXZhdGUgSlNQZWRDU1NUb2tlbml6ZXIgZlRva2VuaXplcjsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdXN0QmVTdGFydChTdHJpbmcgdHlwZSwgU3RyaW5nIGRvY1JlZ2lvblR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfQ09NTUVOVCB8fCB0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9ESVJFQ1RJVkUgfHwgdHlwZSA9PSBKU1BlZENTU1JlZ2lvbkNvbnRleHRzLkNTU19KU1BfRU5EIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0FUS0VZV09SRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHx8IChkb2NSZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKSB8fCAoIUNTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUoZG9jUmVnaW9uVHlwZSkgJiYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCkpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtdXN0QmVFbmQoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9DT01NRU5UIHx8IHR5cGUgPT0gSlNQZWRDU1NSZWdpb25Db250ZXh0cy5DU1NfSlNQX0RJUkVDVElWRSB8fCB0eXBlID09IEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0pTUF9FTkQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKTsKLQl9Ci0JCi0JcHVibGljIElDU1NUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQlpZiAoZlRva2VuaXplciA9PSBudWxsKSB7Ci0JCQlmVG9rZW5pemVyID0gbmV3IEpTUGVkQ1NTVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSlNQZWRDU1NTb3VyY2VQYXJzZXIoKTsKLQl9Ci0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvSlNQZWRDU1NUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BlZENTU1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGI3NWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9KU1BlZENTU1Rva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3NSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQuMSBvbiAwNi8wNC8zMCAxNTo0OSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkpTUGVkQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuSUNTU1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuQ1NTVGV4dFJlZ2lvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQuMQotICogb24gMDYvMDQvMzAgMTU6NDkgZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1Rva2VuaXplciBpbXBsZW1lbnRzIEpTUGVkQ1NTUmVnaW9uQ29udGV4dHMsIElDU1NUb2tlbml6ZXIgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX0JVRkZFUlNJWkUgPSAxNjM4NDsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX0VYUCA9IDIxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfRElSRUNUSVZFID0gMjE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0lNUE9SVF9ERUxJTUlURVIgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUgPSAxODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfU0VMRUNUT1IgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfQ0hBUlNFVF9ERUxJTUlURVIgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9ERUNMQVJBVElPTl9WQUxVRSA9IDE5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9QQUdFX1BTRVVET19QQUdFID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSU1QT1JUX1VSSSA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQgPSAxNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX0VMID0gMjI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiA9IDEzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfREVDTEFSQVRJT04gPSAyMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT04gPSAxNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfUEFHRV9ERUxJTUlURVIgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfTUVESUFfTUVESVVNID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfSlNQX1NDUklQVExFVCA9IDIwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9DSEFSU0VUX05BTUUgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9KU1BfQ09NTUVOVCA9IDIzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9JTVBPUlRfTUVESVVNID0gNDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SID0gMTc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIgPSA5OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9NRURJQV9ERUxJTUlURVIgPSA3OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVF9TRUxFQ1RPUl9NT0RJRklFUiA9IDExOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDExXDBcMVwxMVwxXDE3XDFcMFwxXDRcMVwyMFwyMlwwXDFcNlwxXDQwXDFcMTAiKwotICAgICJcMVwyMlwxXDMzXDFcMzFcMVwxNlwxXDVcMVwyNlwxXDEyXDFcNDJcMVwxNFwxXDYxIisKLSAgICAiXDFcMTNcMVwxNVwxXDQxXDEyXDFcMVw2NVwxXDU0XDFcMzBcMVwzN1wxXDMyXDFcMjEiKwotICAgICJcMVwzNlwxXDQ3XDFcMjdcMVw0NFwxXDYzXDFcNTJcMVw2N1wxXDY0XDFcNDVcMVw1NSIrCi0gICAgIlwyXDJcMVwyNVwxXDU2XDFcNzBcMVw2MFwxXDU3XDFcMlwxXDI0XDFcNTBcMVw1MyIrCi0gICAgIlwxXDIzXDVcMlwxXDcxXDFcM1wxXDczXDFcMTZcMVwyXDFcMTZcMVw0NlwxXDciKwotICAgICJcMVw0M1wxXDYyXDFcNTFcMVw2NlwxXDY0XDFcNDVcMVw1NVwyXDJcMVwyNVwxXDU2IisKLSAgICAiXDFcNzBcMVw2MFwxXDU3XDFcMlwxXDI0XDFcNTBcMVw1M1wxXDIzXDVcMlwxXDM0IisKLSAgICAiXDFcNzJcMVwzNVwxXDcyXDFcMFx1ZmY4MFwyIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcMzBcMFwxXDFcMVwyXDFcMVwxXDNcMVwyXDRcMVwxXDQiKwotICAgICJcMlwxXDFcNVwxXDFcMVw2XDRcMVwxXDdcM1wxXDFcMTAiKwotICAgICJcMVwxXDFcMTBcMVwxMVwxXDEyXDFcMVwxXDEyXDFcMTNcMVwxNCIrCi0gICAgIlwxXDE1XDFcMVwxXDE1XDFcMTZcMVwxXDFcM1wxXDE3XDFcMjAiKwotICAgICJcMVwyMVwxXDFcMVwyMVwxXDIyXDFcMVwxXDIzXDFcMjRcM1wxIisKLSAgICAiXDFcMjRcMVwyNVwxXDFcMVwyNVwxXDI2XDFcMjdcMVwzMFwxXDMxIisKLSAgICAiXDNcMVwxXDMyXDFcMzFcM1wxXDFcMzFcMVwxXDJcMzNcMVwzIisKLSAgICAiXDJcMVwxXDM0XDFcMzVcMVwzNlwxXDM3XDFcMVwxXDBcMlwyIisKLSAgICAiXDFcNDBcMVwwXDFcNDFcMlwwXDFcNDJcMlwwXDFcNDNcNlwwIisKLSAgICAiXDFcNDRcM1wwXDFcNDVcNVwwXDFcNDZcNFwwXDJcMTBcMVwwIisKLSAgICAiXDJcMTJcMVwwXDJcMTVcMVwxN1wxXDBcMlwyMVwxXDBcMVwyNCIrCi0gICAgIlwyXDBcMVwyNFwyXDBcMVwyNFwxXDBcMlwyNVwxXDQ3XDJcMCIrCi0gICAgIlwxXDUwXDFcMFwxXDUxXDFcMzFcMlwwXDFcNTJcMlwwXDJcMzEiKwotICAgICJcMVwzMFwxXDUzXDJcMFwxXDMxXDJcMFwxXDU0XDFcNTVcMVwwIisKLSAgICAiXDFcNTZcMVwwXDFcMlwxXDU3XDFcNDBcMVw0MVwxMFwwXDFcNDQiKwotICAgICJcMVwwXDFcNDVcMlwwXDFcNDVcMlwwXDFcNDZcMlwwXDFcNDYiKwotICAgICJcMlwwXDFcMTBcMVwxMlwxXDE1XDFcMjFcMVwyNFwxXDBcMVwyNCIrCi0gICAgIlwyXDBcMVwyNFwxXDBcMVwyNVwxXDQ3XDFcMzFcMVwwXDFcNTIiKwotICAgICJcMlwwXDFcNTJcMVwwXDFcNTNcMVw2MFwxXDMxXDNcMFwxXDIiKwotICAgICJcMVw0MFwxXDQxXDFcNjFcNVwwXDFcNjJcMlwwXDFcNDRcNVwwIisKLSAgICAiXDFcMTBcMVwxMlwxXDE1XDFcMjFcMVwyNFwyXDBcMVwyNVwxXDQ3IisKLSAgICAiXDFcMzFcMlwwXDFcNTNcMVw2MFwxXDBcMVw1MVwxXDBcMVw2MyIrCi0gICAgIlwxXDJcMVw0MFwxXDQxXDNcMFwxXDY0XDJcMFwxXDQ0XDFcMCIrCi0gICAgIlwxXDQ0XDEwXDBcMVw2NVwxXDEwXDFcMTJcMVwxNVwxXDIxXDFcMjQiKwotICAgICJcMlwwXDFcMjVcMVw0N1wxXDMxXDJcMFwxXDUzXDJcNjBcNVwwIisKLSAgICAiXDFcNjZcMVwwXDFcMlwxXDQwXDFcNDFcMlwwXDFcNjdcMlwwIisKLSAgICAiXDFcNDRcNlwwXDFcNjVcMlwwXDFcMTBcMVwxMlwxXDE1XDFcMjEiKwotICAgICJcMVwyNFwyXDBcMVwyNVwxXDQ3XDFcMzFcMlwwXDFcNTNcMlw2MCIrCi0gICAgIlwyXDBcMVw2NlwzXDBcMVwyXDFcNDBcMVw0MVwxXDBcMVw3MCIrCi0gICAgIlwyXDBcMVw0NFwxM1wwXDFcMTBcMVwxMlwxXDE1XDFcMjFcMVwyNCIrCi0gICAgIlwyXDBcMVwyNVwxXDQ3XDFcMzFcMlwwXDFcNTNcMlw2MFwxMFwwIisKLSAgICAiXDFcNDBcMVw0MVwxXDcxXDJcMFwxXDQ0XDZcMFwxXDY1XDFcMCIrCi0gICAgIlwxXDY1XDJcMFwxXDQ3XDJcMFwxXDUzXDJcNjBcMlwwXDFcNjYiKwotICAgICJcMVwwXDFcNjZcNlwwXDFcNjBcNFwwXDFcNzJcNFwwXDFcNjAiKwotICAgICJcM1wwXDFcNzNcMTJcMCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQ1NV07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBY3Rpb24oWlpfQUNUSU9OX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0FjdGlvbihTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX1JPV01BUCA9IHp6VW5wYWNrUm93TWFwKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX1JPV01BUF9QQUNLRURfMCA9Ci0gICAgIlwwXDBcMFw3NFwwXDE3MFwwXDI2NFwwXDM2MFwwXHUwMTJjXDBcdTAxNjhcMFx1MDFhNCIrCi0gICAgIlwwXHUwMWUwXDBcdTAyMWNcMFx1MDI1OFwwXHUwMjk0XDBcdTAyZDBcMFx1MDMwY1wwXHUwMzQ4XDBcdTAzODQiKwotICAgICJcMFx1MDNjMFwwXHUwM2ZjXDBcdTA0MzhcMFx1MDQ3NFwwXHUwNGIwXDBcdTA0ZWNcMFx1MDUyOFwwXHUwNTY0IisKLSAgICAiXDBcdTA1YTBcMFx1MDVkY1wwXHUwNjE4XDBcdTA2NTRcMFx1MDY5MFwwXHUwNmNjXDBcdTA3MDhcMFx1MDc0NCIrCi0gICAgIlwwXHUwNzgwXDBcdTA1YTBcMFx1MDdiY1wwXHUwN2Y4XDBcdTA1YTBcMFx1MDgzNFwwXHUwNWEwXDBcdTA4NzAiKwotICAgICJcMFx1MDhhY1wwXHUwOGU4XDBcdTA5MjRcMFx1MDVhMFwwXHUwOTYwXDBcdTA5OWNcMFx1MDlkOFwwXHUwYTE0IisKLSAgICAiXDBcdTBhNTBcMFx1MGE4Y1wwXHUwNWEwXDBcdTBhYzhcMFx1MGIwNFwwXHUwYjQwXDBcdTA1YTBcMFx1MDVhMCIrCi0gICAgIlwwXHUwYjdjXDBcdTBiYjhcMFx1MGJmNFwwXHUwNWEwXDBcdTBjMzBcMFx1MGM2Y1wwXHUwNWEwXDBcdTA1YTAiKwotICAgICJcMFx1MGNhOFwwXHUwY2U0XDBcdTBkMjBcMFx1MDVhMFwwXHUwZDVjXDBcdTA1YTBcMFx1MGQ5OFwwXHUwZGQ0IisKLSAgICAiXDBcdTBlMTBcMFx1MGU0Y1wwXHUwZTg4XDBcdTBlYzRcMFx1MGYwMFwwXHUwZjNjXDBcdTA1YTBcMFx1MDVhMCIrCi0gICAgIlwwXHUwZjc4XDBcdTBmYjRcMFx1MGZmMFwwXHUxMDJjXDBcdTEwNjhcMFx1MDVhMFwwXHUxMGE0XDBcdTEwZTAiKwotICAgICJcMFx1MTExY1wwXHUxMTU4XDBcdTExOTRcMFx1MTFkMFwwXHUwN2Y4XDBcdTA1YTBcMFx1MTIwY1wwXHUxMjQ4IisKLSAgICAiXDBcdTEyODRcMFx1MDdiY1wwXHUwNWEwXDBcdTA1YTBcMFx1MDVhMFwwXHUxMmMwXDBcdTA2MThcMFx1MTJmYyIrCi0gICAgIlwwXHUxMzM4XDBcdTA2Y2NcMFx1MTM3NFwwXHUwNzA4XDBcdTEzYjBcMFx1MTNlY1wwXHUxNDI4XDBcdTE0NjQiKwotICAgICJcMFx1MDc4MFwwXHUwNWEwXDBcdTE0YTBcMFx1MTRkY1wwXHUxNTE4XDBcdTE1NTRcMFx1MTU5MFwwXHUxNWNjIisKLSAgICAiXDBcdTE2MDhcMFx1MTY0NFwwXHUwODcwXDBcdTE2ODBcMFx1MDVhMFwwXHUwOGFjXDBcdTE2YmNcMFx1MTZmOCIrCi0gICAgIlwwXHUwOTYwXDBcdTE3MzRcMFx1MDVhMFwwXHUwOTljXDBcdTE3NzBcMFx1MTdhY1wwXHUwYTUwXDBcdTE3ZTgiKwotICAgICJcMFx1MTgyNFwwXHUwYjA0XDBcdTE4NjBcMFx1MTg5Y1wwXHUwYmI4XDBcdTE4ZDhcMFx1MTkxNFwwXHUwNWEwIisKLSAgICAiXDBcdTBjZTRcMFx1MTk1MFwwXHUxOThjXDBcdTBkZDRcMFx1MTljOFwwXHUwZTEwXDBcdTFhMDRcMFx1MDVhMCIrCi0gICAgIlwwXHUwZTRjXDBcdTFhNDBcMFx1MWE3Y1wwXHUwZjAwXDBcdTFhYjhcMFx1MWFmNFwwXHUxYjMwXDBcdTFiNmMiKwotICAgICJcMFx1MTExY1wwXHUwNWEwXDBcdTBmZjBcMFx1MDVhMFwwXHUxYmE4XDBcdTEwMmNcMFx1MWJlNFwwXHUwNWEwIisKLSAgICAiXDBcdTEwNjhcMFx1MWMyMFwwXHUxYzVjXDBcdTFjOThcMFx1MWNkNFwwXHUxMTU4XDBcdTFkMTBcMFx1MWQ0YyIrCi0gICAgIlwwXHUxZDg4XDBcdTExZDBcMFx1MWRjNFwwXHUwNWEwXDBcdTE2ZjhcMFx1MTI4NFwwXHUwNWEwXDBcdTFlMDAiKwotICAgICJcMFx1MWUzY1wwXHUwNWEwXDBcdTFlNzhcMFx1MWViNFwwXHUxZWYwXDBcdTFmMmNcMFx1MWY2OFwwXHUxZmE0IisKLSAgICAiXDBcdTFmZTBcMFx1MjAxY1wwXHUyMDU4XDBcdTIwOTRcMFx1MjBkMFwwXHUyMTBjXDBcdTA4NzBcMFx1MjE0OCIrCi0gICAgIlwwXHUyMTg0XDBcdTA4YWNcMFx1MjFjMFwwXHUyMWZjXDBcdTA5NjBcMFx1MjIzOFwwXHUyMjc0XDBcdTA5OWMiKwotICAgICJcMFx1MjJiMFwwXHUyMmVjXDBcdTIzMjhcMFx1MjM2NFwwXHUyM2EwXDBcdTIzZGNcMFx1MjQxOFwwXHUyNDU0IisKLSAgICAiXDBcdTBlMTBcMFx1MjQ5MFwwXHUyNGNjXDBcdTBlNGNcMFx1MjUwOFwwXHUyNTQ0XDBcdTI1ODBcMFx1MjViYyIrCi0gICAgIlwwXHUyNWY4XDBcdTEwMmNcMFx1MjYzNFwwXHUyNjcwXDBcdTEwNjhcMFx1MjZhY1wwXHUyNmU4XDBcdTI3MjQiKwotICAgICJcMFx1Mjc2MFwwXHUyNzljXDBcdTI3ZDhcMFx1MjgxNFwwXHUyODUwXDBcdTI4OGNcMFx1MjhjOFwwXHUwNWEwIisKLSAgICAiXDBcdTI5MDRcMFx1Mjk0MFwwXHUyOTdjXDBcdTI5YjhcMFx1MjlmNFwwXHUwNWEwXDBcdTJhMzBcMFx1MmE2YyIrCi0gICAgIlwwXHUyYWE4XDBcdTJhZTRcMFx1MmIyMFwwXHUyYjVjXDBcdTJiOThcMFx1MmJkNFwwXHUyYzEwXDBcdTJjNGMiKwotICAgICJcMFx1MmM4OFwwXHUyY2M0XDBcdTJkMDBcMFx1MmQzY1wwXHUyZDc4XDBcdTJkYjRcMFx1MmRmMFwwXHUyZTJjIisKLSAgICAiXDBcdTJlNjhcMFx1MmVhNFwwXHUyZWUwXDBcdTJmMWNcMFx1MmY1OFwwXHUyZjk0XDBcdTJmZDBcMFx1MDVhMCIrCi0gICAgIlwwXHUzMDBjXDBcdTMwNDhcMFx1MzA4NFwwXHUzMGMwXDBcdTMwZmNcMFx1MzEzOFwwXHUwNWEwXDBcdTMxNzQiKwotICAgICJcMFx1MzFiMFwwXHUwNWEwXDBcdTMxZWNcMFx1MzIyOFwwXHUzMjY0XDBcdTMyYTBcMFx1MzJkY1wwXHUzMzE4IisKLSAgICAiXDBcdTMzNTRcMFx1MzM5MFwwXHUzM2NjXDBcdTM0MDhcMFx1MDVhMFwwXHUzNDQ0XDBcdTM0ODBcMFx1MzRiYyIrCi0gICAgIlwwXHUzNGY4XDBcdTM1MzRcMFx1MzU3MFwwXHUzNWFjXDBcdTM1ZThcMFx1MzYyNFwwXHUzNjYwXDBcdTM2OWMiKwotICAgICJcMFx1MzZkOFwwXHUzNzE0XDBcdTM3NTBcMFx1Mzc4Y1wwXHUzN2M4XDBcdTM4MDRcMFx1MmY5NFwwXHUzODQwIisKLSAgICAiXDBcdTM4N2NcMFx1MDVhMFwwXHUzOGI4XDBcdTM4ZjRcMFx1MzkzMFwwXHUzOTZjXDBcdTM5YThcMFx1MzllNCIrCi0gICAgIlwwXHUwNWEwXDBcdTNhMjBcMFx1M2E1Y1wwXHUzYTk4XDBcdTNhZDRcMFx1M2IxMFwwXHUzYjRjXDBcdTNiODgiKwotICAgICJcMFx1M2JjNFwwXHUzYzAwXDBcdTMzNTRcMFx1M2MzY1wwXHUzYzc4XDBcdTNjYjRcMFx1M2NmMFwwXHUzZDJjIisKLSAgICAiXDBcdTNkNjhcMFx1M2RhNFwwXHUzZGUwXDBcdTNlMWNcMFx1M2U1OFwwXHUzZTk0XDBcdTNlZDBcMFx1M2YwYyIrCi0gICAgIlwwXHUzZjQ4XDBcdTNmODRcMFx1M2ZjMFwwXHUzZmZjXDBcdTQwMzhcMFx1NDA3NFwwXHUzN2M4XDBcdTQwYjAiKwotICAgICJcMFx1NDBlY1wwXHU0MTI4XDBcdTQxNjRcMFx1NDFhMFwwXHU0MWRjXDBcdTQyMThcMFx1MDVhMFwwXHU0MjU0IisKLSAgICAiXDBcdTQyOTBcMFx1NDJjY1wwXHU0MzA4XDBcdTQzNDRcMFx1NDM4MFwwXHU0M2JjXDBcdTQzZjhcMFx1NDQzNCIrCi0gICAgIlwwXHU0NDcwXDBcdTQ0YWNcMFx1NDRlOFwwXHU0NTI0XDBcdTQ1NjBcMFx1NDU5Y1wwXHU0NWQ4XDBcdTQ2MTQiKwotICAgICJcMFx1NDY1MFwwXHU0NjhjXDBcdTQ2YzhcMFx1NDcwNFwwXHU0NzQwXDBcdTQ3N2NcMFx1NDdiOFwwXHU0N2Y0IisKLSAgICAiXDBcdTQ4MzBcMFx1NDg2Y1wwXHU0OGE4XDBcdTQ4ZTRcMFx1NDkyMFwwXHU0OTVjXDBcdTQ5OThcMFx1NDlkNCIrCi0gICAgIlwwXHU0YTEwXDBcdTRhNGNcMFx1NGE4OFwwXHU0YWM0XDBcdTRiMDBcMFx1NGIzY1wwXHUwNWEwXDBcdTRiNzgiKwotICAgICJcMFx1NGJiNFwwXHU0YmYwXDBcdTRjMmNcMFx1NGM2OFwwXHU0Y2E0XDBcdTRjZTBcMFx1NGQxY1wwXHU0ZDU4IisKLSAgICAiXDBcdTMzY2NcMFx1NGQ5NFwwXHUzNDA4XDBcdTRkZDBcMFx1NGUwY1wwXHU0ZTQ4XDBcdTRlODRcMFx1NGVjMCIrCi0gICAgIlwwXHU0ZWZjXDBcdTRmMzhcMFx1NGY3NFwwXHU0ZmIwXDBcdTRmZWNcMFx1Mzg0MFwwXHU1MDI4XDBcdTM4N2MiKwotICAgICJcMFx1NTA2NFwwXHU1MGEwXDBcdTUwZGNcMFx1NTExOFwwXHU1MTU0XDBcdTUxOTBcMFx1NTFjY1wwXHU1MjA4IisKLSAgICAiXDBcdTUyNDRcMFx1NTI4MFwwXHU1MmJjXDBcdTA1YTBcMFx1NTJmOFwwXHU1MzM0XDBcdTUzNzBcMFx1NTNhYyIrCi0gICAgIlwwXHUwNWEwXDBcdTUzZThcMFx1NTQyNFwwXHU1NDYwXDBcdTA1YTBcMFx1NTQ5Y1wwXHU1NGQ4XDBcdTU1MTQiKwotICAgICJcMFx1NTU1MFwwXHU1NThjXDBcdTU1YzhcMFx1NTYwNFwwXHU1NjQwXDBcdTU2N2NcMFx1NTZiOCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrUm93TWFwKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQ1NV07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tSb3dNYXAoWlpfUk9XTUFQX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1Jvd01hcChTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgaGlnaCA9IHBhY2tlZC5jaGFyQXQoaSsrKSA8PCAxNjsKLSAgICAgIHJlc3VsdFtqKytdID0gaGlnaCB8IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9UUkFOUyA9IHp6VW5wYWNrVHJhbnMoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfVFJBTlNfUEFDS0VEXzAgPQotICAgICJcMlwzMVwxXDMyXDFcMzNcMVwzNFwxXDMxXDFcMzRcMVwzMlwxXDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDM1XDFcMzFcMVwzNlwxXDMxXDJcMzRcMVwzMSIrCi0gICAgIlwxXDM3XDNcMzJcMVwzMVwxXDMyXDFcNDBcMlwzMVwxXDQxXDFcMzEiKwotICAgICJcMVw0MlwxXDQzXDJcMzFcMVw0NFwxXDQ1XDExXDMyXDFcMzFcNFwzMiIrCi0gICAgIlwxXDMxXDNcMzJcMVw0NlwzXDMyXDFcNDdcNlwzMVwxXDM0XDFcNTAiKwotICAgICJcMVwzNFwxXDMxXDFcNTFcMVwzNFwxXDMxXDFcNTJcM1wzMVwyXDM0IisKLSAgICAiXDdcMzFcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMzZcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxIisKLSAgICAiXDJcMzRcN1wzMVwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NCIrCi0gICAgIlwxMlwzMVwxXDU0XDIzXDMxXDFcMzRcMVw1NVwxXDM0XDFcMzFcMVw1NiIrCi0gICAgIlwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzRcMlwzMVwxXDU3XDRcMzEiKwotICAgICJcMVw1M1w0XDMxXDFcNDJcMVw0M1wyXDMxXDFcNDRcMTJcMzFcMVw1NCIrCi0gICAgIlwyMVwzMVwxXDYwXDFcNjFcMVwzNFwxXDMxXDFcMzRcMVw2MFwxXDMxIisKLSAgICAiXDFcMzRcMVwzMVwxXDYyXDNcMzFcMlwzNFwyXDMxXDNcNjBcMVwzMSIrCi0gICAgIlwxXDYwXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcMzEiKwotICAgICJcMTFcNjBcMVw1NFw0XDYwXDFcMzFcM1w2MFwxXDMxXDNcNjBcN1wzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDUyXDNcMzEiKwotICAgICJcMlwzNFw3XDMxXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0IisKLSAgICAiXDEyXDMxXDFcNTRcNFwzMVwxXDYzXDE0XDMxXDFcNjRcMVw2NVwxXDM0IisKLSAgICAiXDFcMzFcMVwzNFwxXDY0XDFcMzFcMVwzNFwxXDMxXDFcNjZcM1wzMSIrCi0gICAgIlwyXDM0XDJcMzFcM1w2NFwxXDMxXDFcNjRcMVw1M1w0XDMxXDFcNDIiKwotICAgICJcMVw0M1wyXDMxXDFcNDRcMVwzMVwxMVw2NFwxXDMxXDRcNjRcMVwzMSIrCi0gICAgIlwzXDY0XDFcMzFcM1w2NFw3XDMxXDFcMzRcMVwzMVwxXDM0XDJcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw1M1wzXDMxIisKLSAgICAiXDFcNjdcMVw0MlwxXDQzXDJcMzFcMVw0NFwxN1wzMVwxXDcwXDE0XDMxIisKLSAgICAiXDFcNzFcMVw3MlwxXDM0XDFcMzFcMVwzNFwxXDcxXDFcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcNzNcM1wzMVwyXDM0XDJcMzFcM1w3MVwxXDMxXDFcNzEiKwotICAgICJcMVw1M1wzXDMxXDFcNzRcMVw0MlwxXDQzXDJcMzFcMVw0NFwxXDMxIisKLSAgICAiXDExXDcxXDFcMzFcNFw3MVwxXDMxXDNcNzFcMVw3NVwzXDcxXDdcMzEiKwotICAgICJcMVwzNFwxXDMxXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxIisKLSAgICAiXDJcMzRcN1wzMVwxXDUzXDNcMzFcMVw3NFwxXDQyXDFcNDNcMlwzMSIrCi0gICAgIlwxXDQ0XDM0XDMxXDFcMzJcMVwzM1wxXDM0XDFcMzFcMVwzNFwxXDMyIisKLSAgICAiXDFcMzFcMVwzNFwxXDMxXDFcMzVcMVwzMVwxXDM2XDFcMzFcMlwzNCIrCi0gICAgIlwxXDMxXDFcMzdcM1wzMlwxXDMxXDFcMzJcMVw1M1w0XDMxXDFcNDIiKwotICAgICJcMVw0M1wyXDMxXDFcNDRcMVw0NVwxMVwzMlwxXDMxXDRcMzJcMVwzMSIrCi0gICAgIlwzXDMyXDFcNDZcM1wzMlwxXDQ3XDZcMzFcMVw3NlwxXDMxXDFcNzYiKwotICAgICJcMlwzMVwxXDc2XDFcMzFcMVw1MlwxXDc3XDFcMzZcMVwzMVwyXDc2IisKLSAgICAiXDFcMzFcMVwzN1w1XDMxXDFcNTNcMVwzMVwxXDc3XDFcMzFcMVw3NCIrCi0gICAgIlwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcNDVcMTZcMzFcMVwxMDBcM1wzMSIrCi0gICAgIlwxXDQ2XDNcMzFcMVw0N1w0XDMxXDFcMTAxXDFcMTAyXDFcMzRcMVwzMSIrCi0gICAgIlwxXDM0XDFcMTAxXDFcMzFcMVwzNFwxXDMxXDFcMTAzXDNcMzFcMlwzNCIrCi0gICAgIlwyXDMxXDNcMTAxXDFcMzFcMVwxMDFcMVw1M1w0XDMxXDFcNDJcMVw0MyIrCi0gICAgIlwyXDMxXDFcNDRcMVwzMVwxMVwxMDFcMVwzMVw0XDEwMVwxXDMxXDNcMTAxIisKLSAgICAiXDFcMzFcM1wxMDFcN1wzMVwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzQiKwotICAgICJcMVwzMVwxXDUyXDNcMzFcMlwzNFw3XDMxXDFcNTNcNFwzMVwxXDQyIisKLSAgICAiXDFcNDNcMVwxMDRcMVwzMVwxXDQ0XDMwXDMxXDFcMTA1XDFcMTA2XDJcMzEiKwotICAgICJcMVwxMDdcMVwxMTBcMVwzNFwxXDExMVwxXDM0XDFcMTA3XDFcMTEyXDFcMzQiKwotICAgICJcMVwzMVwxXDExM1wzXDMxXDJcMzRcMlwzMVwzXDEwN1wxXDMxXDFcMTA3IisKLSAgICAiXDFcNTNcNFwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDFcMzFcMTFcMTA3IisKLSAgICAiXDFcMzFcNFwxMDdcMVwzMVwzXDEwN1wxXDMxXDNcMTA3XDdcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzQiKwotICAgICJcN1wzMVwxXDUzXDRcMzFcMVw0MlwxXDQzXDJcMzFcMVw0NFwzMVwzMSIrCi0gICAgIlwxXDEwNlwyXDMxXDFcMTE0XDFcMTE1XDFcMzRcMVwzMVwxXDM0XDFcMTE0IisKLSAgICAiXDFcMzFcMVwzNFwxXDMxXDFcMTE2XDNcMzFcMlwzNFwyXDMxXDNcMTE0IisKLSAgICAiXDFcMzFcMVwxMTRcMVw0MFwyXDMxXDFcNDFcMVwzMVwxXDQyXDFcNDMiKwotICAgICJcMlwzMVwxXDQ0XDFcMzFcMTFcMTE0XDFcMTE3XDRcMTE0XDFcMzFcM1wxMTQiKwotICAgICJcMVwzMVwzXDExNFw3XDMxXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw0MFwyXDMxXDFcNDEiKwotICAgICJcMVwzMVwxXDQyXDFcNDNcMlwzMVwxXDQ0XDEyXDMxXDFcMTE3XDEwXDMxIisKLSAgICAiXDFcMTIwXDdcMzFcMVwxMjFcMVwxMjJcMVwxMjNcMVwzNFwxXDEyNFwxXDM0IisKLSAgICAiXDFcMTIyXDFcMTI1XDFcMzRcMVwxMjZcMVwxMjdcMVwxMzBcMVwxMzFcMVwzMSIrCi0gICAgIlwyXDM0XDFcMzFcMVwxMzJcMVwxMzNcMlwxMjJcMVwzMVwxXDEyMlwxXDQwIisKLSAgICAiXDJcMzFcMVw0MVwxXDMxXDFcNDJcMVw0M1wxXDMxXDFcMTM0XDFcMTM1IisKLSAgICAiXDFcMzFcMTFcMTIyXDFcMTE3XDRcMTIyXDFcMTM2XDNcMTIyXDFcMzFcM1wxMjIiKwotICAgICJcNFwzMVwxXDEyMVwxXDEyMlwxXDEyM1wxXDEzN1wxXDEyNFwxXDEzN1wxXDEyMiIrCi0gICAgIlwxXDEyNVwxXDEzN1wxXDEyNlwxXDEyN1wxXDEzMFwxXDEzMVwxXDMxXDJcMTM3IisKLSAgICAiXDFcMzFcMVwxMzJcMVwxMzNcMlwxMjJcMVwzMVwxXDEyMlwxXDQwXDJcMzEiKwotICAgICJcMVw0MVwxXDMxXDFcNDJcMVw0M1wxXDMxXDFcMTM0XDFcMTM1XDFcMzEiKwotICAgICJcMTFcMTIyXDFcMTE3XDRcMTIyXDFcMTM2XDNcMTIyXDFcMzFcM1wxMjJcN1wzMSIrCi0gICAgIlwxXDM0XDFcMzFcMVwzNFwyXDMxXDFcMzRcMVwzMVwxXDE0MFwzXDMxIisKLSAgICAiXDJcMzRcN1wzMVwxXDUzXDFcMTQxXDNcMzFcMVw0MlwxXDE0MlwxXDE0MyIrCi0gICAgIlwxXDE0NFwxXDQ0XDM2XDMxXDFcMzRcMVwzMVwxXDM0XDJcMzFcMVwzNCIrCi0gICAgIlwxXDMxXDFcNTJcM1wzMVwyXDM0XDdcMzFcMVw1M1wxXDE0MVwzXDMxIisKLSAgICAiXDFcNDJcMVw0M1wyXDMxXDFcNDRcMzZcMzFcMVwzNFwxXDMxXDFcMzQiKwotICAgICJcMlwzMVwxXDM0XDFcMzFcMVw1MlwzXDMxXDJcMzRcN1wzMVwxXDUzIisKLSAgICAiXDRcMzFcMVwxNDVcMVw0M1wyXDMxXDFcNDRcMzZcMzFcMVwzNFwxXDMxIisKLSAgICAiXDFcMzRcMlwzMVwxXDM0XDFcMzFcMVwxNDZcM1wzMVwyXDM0XDdcMzEiKwotICAgICJcMVw1M1w1XDMxXDFcNDNcMlwzMVwxXDQ0XDMyXDMxXDc1XDBcMlwzMiIrCi0gICAgIlwxXDE0N1wzXDBcMVwzMlwzXDBcMVwzMlw3XDBcM1wzMlwxXDAiKwotICAgICJcMVwzMlwxM1wwXDExXDMyXDFcMFw0XDMyXDFcMFwzXDMyXDFcMCIrCi0gICAgIlwzXDMyXDRcMFwxXDE1MFwyXDMyXDFcMFwyXDMyXDFcMTUwXDFcMzIiKwotICAgICJcMVwwXDVcMzJcMlwwXDIyXDMyXDFcMTUwXDJcMzJcMVwxNTBcMlwzMiIrCi0gICAgIlwxXDE1MFwxMFwzMlwxXDE1MFwzXDMyXDFcMTUwXDVcMzJcNFwwXDFcMzQiKwotICAgICJcMVwwXDFcMzRcMlwwXDFcMzRcNVwwXDJcMzRcNTRcMFwyXDMyIisKLSAgICAiXDFcMTQ3XDNcMFwxXDMyXDNcMFwxXDE1MVw3XDBcM1wzMlwxXDAiKwotICAgICJcMVwzMlwxM1wwXDExXDMyXDFcMFw0XDMyXDFcMFwzXDMyXDFcMCIrCi0gICAgIlwzXDMyXDRcMFwyXDE1MlwxXDE1M1wzXDBcMVwxNTJcM1wwXDFcMTUyIisKLSAgICAiXDdcMFwzXDE1MlwxXDBcMVwxNTJcMTNcMFwxMVwxNTJcMVwwXDRcMTUyIisKLSAgICAiXDFcMFwzXDE1MlwxXDBcM1wxNTJcNFwwXDJcMTU0XDFcMTU1XDNcMCIrCi0gICAgIlwxXDE1NFwzXDBcMVwxNTRcN1wwXDNcMTU0XDFcMFwxXDE1NFwxM1wwIisKLSAgICAiXDExXDE1NFwxXDBcNFwxNTRcMVwwXDNcMTU0XDFcMFwzXDE1NFwxMVwwIisKLSAgICAiXDFcMTU2XDJcMFwxXDE1Nlw1XDBcMlwxNTZcMTBcMFwxXDE1N1w2XDAiKwotICAgICJcMVwxNjBcNDFcMFwxXDE2MVwyXDBcMVwxNjFcNVwwXDJcMTYxXDEzXDAiKwotICAgICJcMVwxNjJcMTAyXDBcMlwxNjNcMTBcMFwxXDE2NFwxXDE2NVwxXDE2Nlw2XDAiKwotICAgICJcMlwxNjdcNDZcMFwxXDE3MFwzM1wwXDFcMTcxXDFcMTcyXDNcMFwxXDE3MSIrCi0gICAgIlwzXDBcMVwxNzFcN1wwXDNcMTcxXDFcMFwxXDE3MVwxM1wwXDExXDE3MSIrCi0gICAgIlwxXDBcNFwxNzFcMVwwXDNcMTcxXDFcMFwzXDE3MVw0XDBcMlwxNzMiKwotICAgICJcMVwxNzRcMVwwXDFcMTc1XDExXDE3M1wyXDBcNTNcMTczXDFcMFwyXDE3NiIrCi0gICAgIlwxXDE3N1wxXDBcM1wxNzZcMVwxNzVcNlwxNzZcMlwwXDUzXDE3NlwxM1wwIisKLSAgICAiXDFcMjAwXDEyMFwwXDFcMTYwXDM0XDBcMlwyMDFcMVwyMDJcMVwwXDFcMjAzIisKLSAgICAiXDExXDIwMVwyXDBcNTNcMjAxXDFcMFwyXDIwNFwxXDIwNVwxXDBcM1wyMDQiKwotICAgICJcMVwyMDNcNlwyMDRcMlwwXDUzXDIwNFwyNFwwXDFcMjA2XDUwXDBcMlw2MCIrCi0gICAgIlwxXDIwN1wzXDBcMVw2MFwzXDBcMVw2MFw3XDBcM1w2MFwxXDAiKwotICAgICJcMVw2MFwxM1wwXDExXDYwXDFcMFw0XDYwXDFcMFwzXDYwXDFcMCIrCi0gICAgIlwzXDYwXDRcMFwxXDIxMFwyXDYwXDFcMFwyXDYwXDFcMjEwXDFcNjAiKwotICAgICJcMVwwXDVcNjBcMlwwXDIyXDYwXDFcMjEwXDJcNjBcMVwyMTBcMlw2MCIrCi0gICAgIlwxXDIxMFwxMFw2MFwxXDIxMFwzXDYwXDFcMjEwXDVcNjBcMVwwXDJcNjAiKwotICAgICJcMVwyMDdcM1wwXDFcNjBcM1wwXDFcMjExXDdcMFwzXDYwXDFcMCIrCi0gICAgIlwxXDYwXDEzXDBcMTFcNjBcMVwwXDRcNjBcMVwwXDNcNjBcMVwwIisKLSAgICAiXDNcNjBcNFwwXDJcNjRcMVwyMTJcM1wwXDFcNjRcM1wwXDFcNjQiKwotICAgICJcN1wwXDNcNjRcMVwwXDFcNjRcMTNcMFwxMVw2NFwxXDBcNFw2NCIrCi0gICAgIlwxXDBcM1w2NFwxXDBcM1w2NFw0XDBcMVwyMTNcMlw2NFwxXDAiKwotICAgICJcMlw2NFwxXDIxM1wxXDY0XDFcMFw1XDY0XDJcMFwyMlw2NFwxXDIxMyIrCi0gICAgIlwyXDY0XDFcMjEzXDJcNjRcMVwyMTNcMTBcNjRcMVwyMTNcM1w2NFwxXDIxMyIrCi0gICAgIlw1XDY0XDFcMFwyXDY0XDFcMjEyXDNcMFwxXDY0XDNcMFwxXDIxNCIrCi0gICAgIlw3XDBcM1w2NFwxXDBcMVw2NFwxM1wwXDExXDY0XDFcMFw0XDY0IisKLSAgICAiXDFcMFwzXDY0XDFcMFwzXDY0XDRcMFwyXDcxXDFcMjE1XDNcMCIrCi0gICAgIlwxXDcxXDNcMFwxXDcxXDdcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMTFcNzFcMVwwXDRcNzFcMVwwXDNcNzFcMVwwXDNcNzFcNFwwIisKLSAgICAiXDFcMjE2XDJcNzFcMVwwXDJcNzFcMVwyMTZcMVw3MVwxXDBcNVw3MSIrCi0gICAgIlwyXDBcMjJcNzFcMVwyMTZcMlw3MVwxXDIxNlwyXDcxXDFcMjE2XDEwXDcxIisKLSAgICAiXDFcMjE2XDNcNzFcMVwyMTZcNVw3MVwxXDBcMlw3MVwxXDIxNVwzXDAiKwotICAgICJcMVw3MVwzXDBcMVwyMTdcN1wwXDNcNzFcMVwwXDFcNzFcMTNcMCIrCi0gICAgIlwxMVw3MVwxXDBcNFw3MVwxXDBcM1w3MVwxXDBcM1w3MVw1XDAiKwotICAgICJcMVw3MVwxXDIxNVwzXDBcMVw3MVwzXDBcMVw3MVw3XDBcM1w3MSIrCi0gICAgIlwxXDBcMVw3MVwxM1wwXDExXDcxXDFcMFw0XDcxXDFcMFwzXDcxIisKLSAgICAiXDFcMFwzXDcxXDNcMFw0XDIyMFwxXDc2XDFcMjIwXDFcNzZcMlwyMjAiKwotICAgICJcMVw3NlwyXDIyMFwxXDBcMlwyMjBcMlw3NlwxMVwyMjBcMVwwXDFcMjIwIisKLSAgICAiXDFcMFwzN1wyMjBcMVwwXDJcMTAxXDFcMjIxXDNcMFwxXDEwMVwzXDAiKwotICAgICJcMVwxMDFcN1wwXDNcMTAxXDFcMFwxXDEwMVwxM1wwXDExXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDNcMTAxXDFcMFwzXDEwMVw0XDBcMVwyMjJcMlwxMDEiKwotICAgICJcMVwwXDJcMTAxXDFcMjIyXDFcMTAxXDFcMFw1XDEwMVwyXDBcMjJcMTAxIisKLSAgICAiXDFcMjIyXDJcMTAxXDFcMjIyXDJcMTAxXDFcMjIyXDEwXDEwMVwxXDIyMlwzXDEwMSIrCi0gICAgIlwxXDIyMlw1XDEwMVwxXDBcMlwxMDFcMVwyMjFcM1wwXDFcMTAxXDNcMCIrCi0gICAgIlwxXDIyM1w3XDBcM1wxMDFcMVwwXDFcMTAxXDEzXDBcMTFcMTAxXDFcMCIrCi0gICAgIlw0XDEwMVwxXDBcM1wxMDFcMVwwXDNcMTAxXDQyXDBcMVwxMDRcMzVcMCIrCi0gICAgIlwyXDEwN1wxXDIyNFwzXDBcMVwxMDdcM1wwXDFcMTA3XDdcMFwzXDEwNyIrCi0gICAgIlwxXDBcMVwxMDdcMTNcMFwxMVwxMDdcMVwwXDRcMTA3XDFcMFwzXDEwNyIrCi0gICAgIlwxXDBcM1wxMDdcNFwwXDFcMjI1XDJcMTA3XDFcMFwyXDEwN1wxXDIyNSIrCi0gICAgIlwxXDEwN1wxXDBcNVwxMDdcMlwwXDIyXDEwN1wxXDIyNVwyXDEwN1wxXDIyNSIrCi0gICAgIlwyXDEwN1wxXDIyNVwxMFwxMDdcMVwyMjVcM1wxMDdcMVwyMjVcNVwxMDdcMVwwIisKLSAgICAiXDJcMjI2XDFcMjI3XDFcMFwxXDIzMFwxMVwyMjZcMlwwXDUzXDIyNlwxXDAiKwotICAgICJcMlwyMzFcMVwyMzJcMVwwXDNcMjMxXDFcMjMwXDZcMjMxXDJcMFw1M1wyMzEiKwotICAgICJcMVwwXDJcMTA3XDFcMjI0XDNcMFwxXDEwN1wzXDBcMVwyMzNcN1wwIisKLSAgICAiXDNcMTA3XDFcMFwxXDEwN1wxM1wwXDExXDEwN1wxXDBcNFwxMDdcMVwwIisKLSAgICAiXDNcMTA3XDFcMFwzXDEwN1w0XDBcMlwxMTRcMVwyMzRcM1wwXDFcMTE0IisKLSAgICAiXDNcMFwxXDExNFw3XDBcM1wxMTRcMVwwXDFcMTE0XDEzXDBcMTFcMTE0IisKLSAgICAiXDFcMFw0XDExNFwxXDBcM1wxMTRcMVwwXDNcMTE0XDRcMFwxXDIzNSIrCi0gICAgIlwyXDExNFwxXDBcMlwxMTRcMVwyMzVcMVwxMTRcMVwwXDVcMTE0XDJcMCIrCi0gICAgIlwyMlwxMTRcMVwyMzVcMlwxMTRcMVwyMzVcMlwxMTRcMVwyMzVcMTBcMTE0XDFcMjM1IisKLSAgICAiXDNcMTE0XDFcMjM1XDVcMTE0XDFcMFwyXDExNFwxXDIzNFwzXDBcMVwxMTQiKwotICAgICJcM1wwXDFcMjM2XDdcMFwzXDExNFwxXDBcMVwxMTRcMTNcMFwxMVwxMTQiKwotICAgICJcMVwwXDRcMTE0XDFcMFwzXDExNFwxXDBcM1wxMTRcNFwwXDFcMTIxIisKLSAgICAiXDFcMjM3XDFcMjQwXDNcMFwxXDIzN1wzXDBcMVwyMzdcMVwwXDFcMjQxIisKLSAgICAiXDVcMFwzXDIzN1wxXDBcMVwyMzdcMVwwXDFcMjQyXDExXDBcMTFcMjM3IisKLSAgICAiXDFcMFw0XDIzN1wxXDBcM1wyMzdcMVwwXDNcMjM3XDRcMFwyXDEyMiIrCi0gICAgIlwxXDI0M1wzXDBcMVwxMjJcM1wwXDFcMTIyXDdcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDExXDEyMlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMCIrCi0gICAgIlwzXDEyMlw0XDBcMVwyNDVcMlwxMjJcMVwwXDJcMTIyXDFcMjQ1XDFcMTIyIisKLSAgICAiXDFcMFw1XDEyMlwyXDBcMjJcMTIyXDFcMjQ1XDJcMTIyXDFcMjQ1XDJcMTIyIisKLSAgICAiXDFcMjQ1XDEwXDEyMlwxXDI0NVwzXDEyMlwxXDI0NVw1XDEyMlwxXDBcMlwyNDYiKwotICAgICJcMVwyNDdcMVwwXDFcMjUwXDExXDI0NlwyXDBcNTNcMjQ2XDFcMFwyXDI1MSIrCi0gICAgIlwxXDI1MlwxXDBcM1wyNTFcMVwyNTBcNlwyNTFcMlwwXDUzXDI1MVwxXDAiKwotICAgICJcMVwyNTNcMVwxMjJcMVwyNDNcM1wwXDFcMTIyXDNcMFwxXDI1NFwxXDAiKwotICAgICJcMVwyNDFcNVwwXDNcMTIyXDFcMjQ0XDFcMTIyXDEzXDBcMTFcMTIyXDFcMCIrCi0gICAgIlw0XDEyMlwxXDBcM1wxMjJcMVwwXDNcMTIyXDRcMFwxXDEyMVwxM1wwIisKLSAgICAiXDFcMjQxXDU3XDBcMVwyNTVcNzNcMFwyXDI1NlwxXDI1N1wzXDBcMVwyNTYiKwotICAgICJcM1wwXDFcMjU2XDdcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMFwxMVwyNTYiKwotICAgICJcMVwwXDRcMjU2XDFcMFwzXDI1NlwxXDBcM1wyNTZcNFwwXDJcMTIyIisKLSAgICAiXDFcMjQzXDNcMFwxXDEyMlwzXDBcMVwxMjJcMVwyNjBcNlwwXDFcMTIyIisKLSAgICAiXDFcMjYxXDFcMTIyXDFcMjQ0XDFcMTIyXDEzXDBcMTFcMTIyXDFcMFw0XDEyMiIrCi0gICAgIlwxXDBcM1wxMjJcMVwwXDNcMTIyXDdcMFwxXDI2MlwxXDBcMVwyNjIiKwotICAgICJcMlwwXDFcMjYyXDVcMFwyXDI2MlwzNFwwXDFcMjYzXDE2XDBcNFwyNjQiKwotICAgICJcMVwxMzdcMVwyNjRcMVwxMzdcMlwyNjRcMVwxMzdcNVwyNjRcMlwxMzdcMTRcMjY0IisKLSAgICAiXDFcMFwxNlwyNjRcMVwwXDE3XDI2NFwxM1wwXDFcMjY1XDY2XDBcMVwyNjYiKwotICAgICJcMlwwXDFcMjY2XDVcMFwyXDI2NlwxMVwwXDFcMjY3XDU0XDBcMVwyNzAiKwotICAgICJcNjFcMFwxXDI3MVwxXDMyXDFcMTQ3XDFcMzJcMVwwXDFcMzJcMVwyNzEiKwotICAgICJcMVwwXDFcMzJcMVwwXDFcMzJcM1wwXDJcMzJcMlwwXDNcMzIiKwotICAgICJcMVwwXDFcMzJcMTNcMFwxXDI3MVwyXDMyXDFcMjcxXDJcMzJcMVwyNzEiKwotICAgICJcMlwzMlwxXDBcNFwzMlwxXDBcMVwyNzFcMlwzMlwxXDBcMVwyNzEiKwotICAgICJcMlwzMlw0XDBcMlwzMlwxXDE0N1wzXDBcMVwzMlwzXDBcMVwzMiIrCi0gICAgIlw3XDBcM1wzMlwxXDBcMVwzMlwyXDBcMVwyNzJcMTBcMFwxMVwzMiIrCi0gICAgIlwxXDBcNFwzMlwxXDBcM1wzMlwxXDBcM1wzMlw0XDBcMVwyNzMiKwotICAgICJcMlwxNTJcMVwwXDJcMTUyXDFcMjczXDFcMTUyXDFcMFw1XDE1MlwyXDAiKwotICAgICJcMjJcMTUyXDFcMjczXDJcMTUyXDFcMjczXDJcMTUyXDFcMjczXDEwXDE1MlwxXDI3MyIrCi0gICAgIlwzXDE1MlwxXDI3M1w1XDE1MlwxXDBcMVwyNzRcMlwxNTRcMVwwXDJcMTU0IisKLSAgICAiXDFcMjc0XDFcMTU0XDFcMFw1XDE1NFwyXDBcMjJcMTU0XDFcMjc0XDJcMTU0IisKLSAgICAiXDFcMjc0XDJcMTU0XDFcMjc0XDEwXDE1NFwxXDI3NFwzXDE1NFwxXDI3NFw1XDE1NCIrCi0gICAgIlw2XDBcMVwxNTZcMlwwXDFcMTU2XDVcMFwyXDE1NlwxMFwwXDFcMTU3IisKLSAgICAiXDUwXDBcMVwxNTdcMlwwXDFcMTU3XDVcMFwyXDE1N1w2NlwwXDFcMjc1IisKLSAgICAiXDEyNVwwXDFcMjc2XDEwNFwwXDFcMjc3XDY2XDBcMlwzMDBcNjdcMFwyXDMwMSIrCi0gICAgIlwxMDRcMFwxXDMwMlwxM1wwXDQyXDE3MFwxXDMwM1wzMVwxNzBcMVwwXDJcMTcxIisKLSAgICAiXDFcMTcyXDNcMFwxXDE3MVwzXDBcMVwxNzFcN1wwXDNcMTcxXDFcMzA0IisKLSAgICAiXDFcMTcxXDEzXDBcMTFcMTcxXDFcMFw0XDE3MVwxXDBcM1wxNzFcMVwwIisKLSAgICAiXDNcMTcxXDRcMFwxXDMwNVwyXDE3MVwxXDBcMlwxNzFcMVwzMDVcMVwxNzEiKwotICAgICJcMVwwXDVcMTcxXDJcMFwyMlwxNzFcMVwzMDVcMlwxNzFcMVwzMDVcMlwxNzEiKwotICAgICJcMVwzMDVcMTBcMTcxXDFcMzA1XDNcMTcxXDFcMzA1XDVcMTcxXDFcMFwxXDMwNiIrCi0gICAgIlwxXDE3M1wxXDE3NFwxXDE3M1wxXDMwN1wxXDE3M1wxXDMwNlwxMFwxNzNcMVwzMTAiKwotICAgICJcMjJcMTczXDFcMzA2XDJcMTczXDFcMzA2XDJcMTczXDFcMzA2XDEwXDE3M1wxXDMwNiIrCi0gICAgIlwzXDE3M1wxXDMwNlw1XDE3M1wxXDBcMVwzMTFcMVwxNzZcMVwxNzdcM1wxNzYiKwotICAgICJcMVwzMTFcMVwzMTJcN1wxNzZcMVwzMTNcMjJcMTc2XDFcMzExXDJcMTc2XDFcMzExIisKLSAgICAiXDJcMTc2XDFcMzExXDEwXDE3NlwxXDMxMVwzXDE3NlwxXDMxMVw1XDE3NlwzMlwwIisKLSAgICAiXDFcMjcyXDQyXDBcMVwzMTRcMVwyMDFcMVwyMDJcMVwyMDFcMVwzMTVcMVwyMDEiKwotICAgICJcMVwzMTRcMTBcMjAxXDFcMzE2XDIyXDIwMVwxXDMxNFwyXDIwMVwxXDMxNFwyXDIwMSIrCi0gICAgIlwxXDMxNFwxMFwyMDFcMVwzMTRcM1wyMDFcMVwzMTRcNVwyMDFcMVwwXDFcMzE3IisKLSAgICAiXDFcMjA0XDFcMjA1XDNcMjA0XDFcMzE3XDFcMzIwXDdcMjA0XDFcMzIxXDIyXDIwNCIrCi0gICAgIlwxXDMxN1wyXDIwNFwxXDMxN1wyXDIwNFwxXDMxN1wxMFwyMDRcMVwzMTdcM1wyMDQiKwotICAgICJcMVwzMTdcNVwyMDRcMjVcMFwxXDMyMlw0N1wwXDFcMzIzXDFcNjBcMVwyMDciKwotICAgICJcMVw2MFwxXDBcMVw2MFwxXDMyM1wxXDBcMVw2MFwxXDBcMVw2MCIrCi0gICAgIlwzXDBcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcMzIzIisKLSAgICAiXDJcNjBcMVwzMjNcMlw2MFwxXDMyM1wyXDYwXDFcMFw0XDYwXDFcMCIrCi0gICAgIlwxXDMyM1wyXDYwXDFcMFwxXDMyM1wyXDYwXDRcMFwyXDYwXDFcMjA3IisKLSAgICAiXDNcMFwxXDYwXDNcMFwxXDYwXDdcMFwzXDYwXDFcMFwxXDYwIisKLSAgICAiXDJcMFwxXDI3MlwxMFwwXDExXDYwXDFcMFw0XDYwXDFcMFwzXDYwIisKLSAgICAiXDFcMFwzXDYwXDRcMFwxXDMyNFwxXDY0XDFcMjEyXDFcNjRcMVwwIisKLSAgICAiXDFcNjRcMVwzMjRcMVwwXDFcNjRcMVwwXDFcNjRcM1wwXDJcNjQiKwotICAgICJcMlwwXDNcNjRcMVwwXDFcNjRcMTNcMFwxXDMyNFwyXDY0XDFcMzI0IisKLSAgICAiXDJcNjRcMVwzMjRcMlw2NFwxXDBcNFw2NFwxXDBcMVwzMjRcMlw2NCIrCi0gICAgIlwxXDBcMVwzMjRcMlw2NFw0XDBcMlw2NFwxXDIxMlwzXDBcMVw2NCIrCi0gICAgIlwzXDBcMVw2NFw3XDBcM1w2NFwxXDBcMVw2NFwyXDBcMVwyNzIiKwotICAgICJcMTBcMFwxMVw2NFwxXDBcNFw2NFwxXDBcM1w2NFwxXDBcM1w2NCIrCi0gICAgIlw0XDBcMVwzMjVcMVw3MVwxXDIxNVwxXDcxXDFcMFwxXDcxXDFcMzI1IisKLSAgICAiXDFcMFwxXDcxXDFcMFwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxIisKLSAgICAiXDFcMFwxXDcxXDEzXDBcMVwzMjVcMlw3MVwxXDMyNVwyXDcxXDFcMzI1IisKLSAgICAiXDJcNzFcMVwwXDRcNzFcMVwwXDFcMzI1XDJcNzFcMVwwXDFcMzI1IisKLSAgICAiXDJcNzFcNFwwXDJcNzFcMVwyMTVcM1wwXDFcNzFcM1wwXDFcNzEiKwotICAgICJcN1wwXDNcNzFcMVwwXDFcNzFcMlwwXDFcMjcyXDEwXDBcMTFcNzEiKwotICAgICJcMVwwXDRcNzFcMVwwXDNcNzFcMVwwXDNcNzFcNFwwXDFcMzI2IisKLSAgICAiXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXDMyNlwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMVwzMjZcMlwxMDFcMVwzMjZcMlwxMDFcMVwzMjZcMlwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwxXDMyNlwyXDEwMVwxXDBcMVwzMjZcMlwxMDFcNFwwIisKLSAgICAiXDJcMTAxXDFcMjIxXDNcMFwxXDEwMVwzXDBcMVwxMDFcN1wwXDNcMTAxIisKLSAgICAiXDFcMFwxXDEwMVwyXDBcMVwyNzJcMTBcMFwxMVwxMDFcMVwwXDRcMTAxIisKLSAgICAiXDFcMFwzXDEwMVwxXDBcM1wxMDFcNFwwXDFcMzI3XDFcMTA3XDFcMjI0IisKLSAgICAiXDFcMTA3XDFcMFwxXDEwN1wxXDMyN1wxXDBcMVwxMDdcMVwwXDFcMTA3IisKLSAgICAiXDNcMFwyXDEwN1wyXDBcM1wxMDdcMVwwXDFcMTA3XDEzXDBcMVwzMjciKwotICAgICJcMlwxMDdcMVwzMjdcMlwxMDdcMVwzMjdcMlwxMDdcMVwwXDRcMTA3XDFcMCIrCi0gICAgIlwxXDMyN1wyXDEwN1wxXDBcMVwzMjdcMlwxMDdcNFwwXDFcMzMwXDFcMjI2IisKLSAgICAiXDFcMjI3XDFcMjI2XDFcMzMxXDFcMjI2XDFcMzMwXDEwXDIyNlwxXDMzMlwyMlwyMjYiKwotICAgICJcMVwzMzBcMlwyMjZcMVwzMzBcMlwyMjZcMVwzMzBcMTBcMjI2XDFcMzMwXDNcMjI2IisKLSAgICAiXDFcMzMwXDVcMjI2XDFcMFwxXDMzM1wxXDIzMVwxXDIzMlwzXDIzMVwxXDMzMyIrCi0gICAgIlwxXDMzNFw3XDIzMVwxXDMzNVwyMlwyMzFcMVwzMzNcMlwyMzFcMVwzMzNcMlwyMzEiKwotICAgICJcMVwzMzNcMTBcMjMxXDFcMzMzXDNcMjMxXDFcMzMzXDVcMjMxXDFcMFwyXDEwNyIrCi0gICAgIlwxXDIyNFwzXDBcMVwxMDdcM1wwXDFcMTA3XDdcMFwzXDEwN1wxXDAiKwotICAgICJcMVwxMDdcMlwwXDFcMjcyXDEwXDBcMTFcMTA3XDFcMFw0XDEwN1wxXDAiKwotICAgICJcM1wxMDdcMVwwXDNcMTA3XDRcMFwxXDMzNlwxXDExNFwxXDIzNFwxXDExNCIrCi0gICAgIlwxXDBcMVwxMTRcMVwzMzZcMVwwXDFcMTE0XDFcMFwxXDExNFwzXDAiKwotICAgICJcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwXDFcMzM2XDJcMTE0IisKLSAgICAiXDFcMzM2XDJcMTE0XDFcMzM2XDJcMTE0XDFcMFw0XDExNFwxXDBcMVwzMzYiKwotICAgICJcMlwxMTRcMVwwXDFcMzM2XDJcMTE0XDRcMFwyXDExNFwxXDIzNFwzXDAiKwotICAgICJcMVwxMTRcM1wwXDFcMTE0XDdcMFwzXDExNFwxXDBcMVwxMTRcMlwwIisKLSAgICAiXDFcMjcyXDEwXDBcMTFcMTE0XDFcMFw0XDExNFwxXDBcM1wxMTRcMVwwIisKLSAgICAiXDNcMTE0XDRcMFwyXDIzN1wxXDI0MFwzXDBcMVwyMzdcM1wwXDFcMjM3IisKLSAgICAiXDdcMFwzXDIzN1wxXDBcMVwyMzdcMTNcMFwxMVwyMzdcMVwwXDRcMjM3IisKLSAgICAiXDFcMFwzXDIzN1wxXDBcM1wyMzdcNFwwXDFcMzM3XDJcMjM3XDFcMCIrCi0gICAgIlwyXDIzN1wxXDMzN1wxXDIzN1wxXDBcNVwyMzdcMlwwXDIyXDIzN1wxXDMzNyIrCi0gICAgIlwyXDIzN1wxXDMzN1wyXDIzN1wxXDMzN1wxMFwyMzdcMVwzMzdcM1wyMzdcMVwzMzciKwotICAgICJcNVwyMzdcMVwwXDFcMzQwXDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMiIrCi0gICAgIlwxXDM0MFwxXDBcMVwxMjJcMVwwXDFcMTIyXDNcMFwyXDEyMlwyXDAiKwotICAgICJcM1wxMjJcMVwyNDRcMVwxMjJcMTNcMFwxXDM0MFwyXDEyMlwxXDM0MFwyXDEyMiIrCi0gICAgIlwxXDM0MFwyXDEyMlwxXDBcNFwxMjJcMVwwXDFcMzQwXDJcMTIyXDFcMCIrCi0gICAgIlwxXDM0MFwyXDEyMlw0XDBcMVwzNDFcMVwyNDZcMVwyNDdcMVwyNDZcMVwzNDIiKwotICAgICJcMVwyNDZcMVwzNDFcMTBcMjQ2XDFcMzQzXDIyXDI0NlwxXDM0MVwyXDI0NlwxXDM0MSIrCi0gICAgIlwyXDI0NlwxXDM0MVwxMFwyNDZcMVwzNDFcM1wyNDZcMVwzNDFcNVwyNDZcMVwwIisKLSAgICAiXDFcMzQ0XDFcMjUxXDFcMjUyXDNcMjUxXDFcMzQ0XDFcMzQ1XDdcMjUxXDFcMzQ2IisKLSAgICAiXDIyXDI1MVwxXDM0NFwyXDI1MVwxXDM0NFwyXDI1MVwxXDM0NFwxMFwyNTFcMVwzNDQiKwotICAgICJcM1wyNTFcMVwzNDRcNVwyNTFcMVwwXDFcMjUzXDFcMTIyXDFcMjQzXDNcMCIrCi0gICAgIlwxXDEyMlwzXDBcMVwxMjJcMVwwXDFcMjQxXDVcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxXDBcMVwyNDJcMTFcMFwxMVwxMjJcMVwwXDRcMTIyXDFcMCIrCi0gICAgIlwzXDEyMlwxXDBcM1wxMjJcNFwwXDJcMTIyXDFcMjQzXDNcMFwxXDEyMiIrCi0gICAgIlwzXDBcMVwxMjJcN1wwXDNcMTIyXDFcMjQ0XDFcMTIyXDJcMFwxXDI3MiIrCi0gICAgIlwxMFwwXDExXDEyMlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMFwzXDEyMiIrCi0gICAgIlw0XDBcMVwyNTVcMVwyMzdcMVwyNDBcM1wwXDFcMjM3XDNcMFwxXDIzNyIrCi0gICAgIlw3XDBcM1wyMzdcMVwwXDFcMjM3XDFcMFwxXDI0MlwxMVwwXDExXDIzNyIrCi0gICAgIlwxXDBcNFwyMzdcMVwwXDNcMjM3XDFcMFwzXDIzN1w0XDBcMVwzNDciKwotICAgICJcMlwyNTZcMVwwXDJcMjU2XDFcMzQ3XDFcMjU2XDFcMFw1XDI1NlwyXDAiKwotICAgICJcMjJcMjU2XDFcMzQ3XDJcMjU2XDFcMzQ3XDJcMjU2XDFcMzQ3XDEwXDI1NlwxXDM0NyIrCi0gICAgIlwzXDI1NlwxXDM0N1w1XDI1NlwxXDBcMVwzNTBcNVwwXDFcMzUwXDExXDAiKwotICAgICJcMVwzNTBcNVwwXDFcMzUwXDEzXDBcMlwzNTBcMVwwXDJcMzUwXDFcMCIrCi0gICAgIlwyXDM1MFw3XDBcMlwzNTBcMlwwXDJcMzUwXDVcMFwyXDEyMlwxXDI0MyIrCi0gICAgIlwzXDBcMVwxMjJcM1wwXDFcMTIyXDdcMFwyXDEyMlwxXDM1MVwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDExXDEyMlwxXDBcNFwxMjJcMVwwXDNcMTIyXDFcMCIrCi0gICAgIlwzXDEyMlw2MVwwXDFcMzUyXDMwXDBcMVwzNTNcMTVcMFwxXDM1NFwxXDI3MiIrCi0gICAgIlw0MlwwXDFcMzU1XDFcMzJcMVwxNDdcMVwzMlwxXDBcMVwzMlwxXDM1NSIrCi0gICAgIlwxXDBcMVwzMlwxXDBcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMiIrCi0gICAgIlwxXDBcMVwzMlwxM1wwXDFcMzU1XDJcMzJcMVwzNTVcMlwzMlwxXDM1NSIrCi0gICAgIlwyXDMyXDFcMFw0XDMyXDFcMFwxXDM1NVwyXDMyXDFcMFwxXDM1NSIrCi0gICAgIlwyXDMyXDRcMFwxXDM1NlwxXDE1MlwxXDE1M1wxXDE1MlwxXDBcMVwxNTIiKwotICAgICJcMVwzNTZcMVwwXDFcMTUyXDFcMFwxXDE1MlwzXDBcMlwxNTJcMlwwIisKLSAgICAiXDNcMTUyXDFcMFwxXDE1MlwxM1wwXDFcMzU2XDJcMTUyXDFcMzU2XDJcMTUyIisKLSAgICAiXDFcMzU2XDJcMTUyXDFcMFw0XDE1MlwxXDBcMVwzNTZcMlwxNTJcMVwwIisKLSAgICAiXDFcMzU2XDJcMTUyXDRcMFwxXDM1N1wxXDE1NFwxXDE1NVwxXDE1NFwxXDAiKwotICAgICJcMVwxNTRcMVwzNTdcMVwwXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTQiKwotICAgICJcMlwwXDNcMTU0XDFcMFwxXDE1NFwxM1wwXDFcMzU3XDJcMTU0XDFcMzU3IisKLSAgICAiXDJcMTU0XDFcMzU3XDJcMTU0XDFcMFw0XDE1NFwxXDBcMVwzNTdcMlwxNTQiKwotICAgICJcMVwwXDFcMzU3XDJcMTU0XDE2XDBcMVwzNjBcMTI2XDBcMlwzNjFcMTAzXDAiKwotICAgICJcMVwzNjJcNzZcMFwyXDM2M1w3NFwwXDFcMzY0XDc3XDBcMVwzNjVcM1wwIisKLSAgICAiXDQxXDE3MFwxXDM2NlwxXDMwM1wzMVwxNzBcMlwwXDFcMzY3XDFcMzcwXDFcMzA0IisKLSAgICAiXDFcMFwxXDMwNFwxXDM2N1wxXDBcMVwzMDRcMVwwXDFcMzY3XDNcMCIrCi0gICAgIlwyXDMwNFwyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMTFcMzY3XDFcMCIrCi0gICAgIlw0XDM2N1wxXDBcM1wzNjdcMVwwXDNcMzY3XDRcMFwxXDM3MVwxXDE3MSIrCi0gICAgIlwxXDE3MlwxXDE3MVwxXDBcMVwxNzFcMVwzNzFcMVwwXDFcMTcxXDFcMCIrCi0gICAgIlwxXDE3MVwzXDBcMlwxNzFcMlwwXDNcMTcxXDFcMzA0XDFcMTcxXDEzXDAiKwotICAgICJcMVwzNzFcMlwxNzFcMVwzNzFcMlwxNzFcMVwzNzFcMlwxNzFcMVwwXDRcMTcxIisKLSAgICAiXDFcMFwxXDM3MVwyXDE3MVwxXDBcMVwzNzFcMlwxNzFcNFwwXDFcMzcyIisKLSAgICAiXDFcMTczXDFcMTc0XDFcMTczXDFcMTc1XDFcMTczXDFcMzcyXDMzXDE3M1wxXDM3MiIrCi0gICAgIlwyXDE3M1wxXDM3MlwyXDE3M1wxXDM3MlwxMFwxNzNcMVwzNzJcM1wxNzNcMVwzNzIiKwotICAgICJcNVwxNzNcMVwwXDJcMTczXDFcMTc0XDFcMFwxXDE3NVwxMlwxNzNcMVwwIisKLSAgICAiXDUzXDE3M1wxXDBcMVwzNzNcMVwxNzZcMVwxNzdcM1wxNzZcMVwzNzNcMVwxNzUiKwotICAgICJcMzJcMTc2XDFcMzczXDJcMTc2XDFcMzczXDJcMTc2XDFcMzczXDEwXDE3NlwxXDM3MyIrCi0gICAgIlwzXDE3NlwxXDM3M1w1XDE3NlwxXDBcMlwxNzZcMVwxNzdcMVwwXDNcMTc2IisKLSAgICAiXDFcMTc1XDdcMTc2XDFcMFw1M1wxNzZcMVwwXDFcMzc0XDFcMjAxXDFcMjAyIisKLSAgICAiXDFcMjAxXDFcMjAzXDFcMjAxXDFcMzc0XDMzXDIwMVwxXDM3NFwyXDIwMVwxXDM3NCIrCi0gICAgIlwyXDIwMVwxXDM3NFwxMFwyMDFcMVwzNzRcM1wyMDFcMVwzNzRcNVwyMDFcMVwwIisKLSAgICAiXDJcMjAxXDFcMjAyXDFcMFwxXDIwM1wxMlwyMDFcMVwwXDUzXDIwMVwxXDAiKwotICAgICJcMVwzNzVcMVwyMDRcMVwyMDVcM1wyMDRcMVwzNzVcMVwyMDNcMzJcMjA0XDFcMzc1IisKLSAgICAiXDJcMjA0XDFcMzc1XDJcMjA0XDFcMzc1XDEwXDIwNFwxXDM3NVwzXDIwNFwxXDM3NSIrCi0gICAgIlw1XDIwNFwxXDBcMlwyMDRcMVwyMDVcMVwwXDNcMjA0XDFcMjAzXDdcMjA0IisKLSAgICAiXDFcMFw1M1wyMDRcMjZcMFwxXDM3Nlw0NlwwXDFcMzc3XDFcNjBcMVwyMDciKwotICAgICJcMVw2MFwxXDBcMVw2MFwxXDM3N1wxXDBcMVw2MFwxXDBcMVw2MCIrCi0gICAgIlwzXDBcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcMzc3IisKLSAgICAiXDJcNjBcMVwzNzdcMlw2MFwxXDM3N1wyXDYwXDFcMFw0XDYwXDFcMCIrCi0gICAgIlwxXDM3N1wyXDYwXDFcMFwxXDM3N1wyXDYwXDRcMFwxXHUwMTAwXDFcNjQiKwotICAgICJcMVwyMTJcMVw2NFwxXDBcMVw2NFwxXHUwMTAwXDFcMFwxXDY0XDFcMCIrCi0gICAgIlwxXDY0XDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0XDEzXDAiKwotICAgICJcMVx1MDEwMFwyXDY0XDFcdTAxMDBcMlw2NFwxXHUwMTAwXDJcNjRcMVwwXDRcNjQiKwotICAgICJcMVwwXDFcdTAxMDBcMlw2NFwxXDBcMVx1MDEwMFwyXDY0XDRcMFwxXHUwMTAxIisKLSAgICAiXDFcNzFcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXHUwMTAxXDFcMFwxXDcxIisKLSAgICAiXDFcMFwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDEzXDBcMVx1MDEwMVwyXDcxXDFcdTAxMDFcMlw3MVwxXHUwMTAxXDJcNzFcMVwwIisKLSAgICAiXDRcNzFcMVwwXDFcdTAxMDFcMlw3MVwxXDBcMVx1MDEwMVwyXDcxXDRcMCIrCi0gICAgIlwxXHUwMTAyXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXHUwMTAyXDFcMCIrCi0gICAgIlwxXDEwMVwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDAiKwotICAgICJcMVwxMDFcMTNcMFwxXHUwMTAyXDJcMTAxXDFcdTAxMDJcMlwxMDFcMVx1MDEwMlwyXDEwMSIrCi0gICAgIlwxXDBcNFwxMDFcMVwwXDFcdTAxMDJcMlwxMDFcMVwwXDFcdTAxMDJcMlwxMDEiKwotICAgICJcNFwwXDFcdTAxMDNcMVwxMDdcMVwyMjRcMVwxMDdcMVwwXDFcMTA3XDFcdTAxMDMiKwotICAgICJcMVwwXDFcMTA3XDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3IisKLSAgICAiXDFcMFwxXDEwN1wxM1wwXDFcdTAxMDNcMlwxMDdcMVx1MDEwM1wyXDEwN1wxXHUwMTAzIisKLSAgICAiXDJcMTA3XDFcMFw0XDEwN1wxXDBcMVx1MDEwM1wyXDEwN1wxXDBcMVx1MDEwMyIrCi0gICAgIlwyXDEwN1w0XDBcMVx1MDEwNFwxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNiIrCi0gICAgIlwxXHUwMTA0XDMzXDIyNlwxXHUwMTA0XDJcMjI2XDFcdTAxMDRcMlwyMjZcMVx1MDEwNFwxMFwyMjYiKwotICAgICJcMVx1MDEwNFwzXDIyNlwxXHUwMTA0XDVcMjI2XDFcMFwyXDIyNlwxXDIyN1wxXDAiKwotICAgICJcMVwyMzBcMTJcMjI2XDFcMFw1M1wyMjZcMVwwXDFcdTAxMDVcMVwyMzFcMVwyMzIiKwotICAgICJcM1wyMzFcMVx1MDEwNVwxXDIzMFwzMlwyMzFcMVx1MDEwNVwyXDIzMVwxXHUwMTA1XDJcMjMxIisKLSAgICAiXDFcdTAxMDVcMTBcMjMxXDFcdTAxMDVcM1wyMzFcMVx1MDEwNVw1XDIzMVwxXDBcMlwyMzEiKwotICAgICJcMVwyMzJcMVwwXDNcMjMxXDFcMjMwXDdcMjMxXDFcMFw1M1wyMzFcMVwwIisKLSAgICAiXDFcdTAxMDZcMVwxMTRcMVwyMzRcMVwxMTRcMVwwXDFcMTE0XDFcdTAxMDZcMVwwIisKLSAgICAiXDFcMTE0XDFcMFwxXDExNFwzXDBcMlwxMTRcMlwwXDNcMTE0XDFcMCIrCi0gICAgIlwxXDExNFwxM1wwXDFcdTAxMDZcMlwxMTRcMVx1MDEwNlwyXDExNFwxXHUwMTA2XDJcMTE0IisKLSAgICAiXDFcMFw0XDExNFwxXDBcMVx1MDEwNlwyXDExNFwxXDBcMVx1MDEwNlwyXDExNCIrCi0gICAgIlw0XDBcMVx1MDEwN1wxXDIzN1wxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDEwNyIrCi0gICAgIlwxXDBcMVwyMzdcMVwwXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzciKwotICAgICJcMVwwXDFcMjM3XDEzXDBcMVx1MDEwN1wyXDIzN1wxXHUwMTA3XDJcMjM3XDFcdTAxMDciKwotICAgICJcMlwyMzdcMVwwXDRcMjM3XDFcMFwxXHUwMTA3XDJcMjM3XDFcMFwxXHUwMTA3IisKLSAgICAiXDJcMjM3XDRcMFwxXHUwMTA4XDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMiIrCi0gICAgIlwxXHUwMTA4XDFcMFwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMCIrCi0gICAgIlwzXDEyMlwxXDI0NFwxXDEyMlwxM1wwXDFcdTAxMDhcMlwxMjJcMVx1MDEwOFwyXDEyMiIrCi0gICAgIlwxXHUwMTA4XDJcMTIyXDFcMFw0XDEyMlwxXDBcMVx1MDEwOFwyXDEyMlwxXDAiKwotICAgICJcMVx1MDEwOFwyXDEyMlw0XDBcMVx1MDEwOVwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MCIrCi0gICAgIlwxXDI0NlwxXHUwMTA5XDMzXDI0NlwxXHUwMTA5XDJcMjQ2XDFcdTAxMDlcMlwyNDZcMVx1MDEwOSIrCi0gICAgIlwxMFwyNDZcMVx1MDEwOVwzXDI0NlwxXHUwMTA5XDVcMjQ2XDFcMFwyXDI0NlwxXDI0NyIrCi0gICAgIlwxXDBcMVwyNTBcMTJcMjQ2XDFcMFw1M1wyNDZcMVwwXDFcdTAxMGFcMVwyNTEiKwotICAgICJcMVwyNTJcM1wyNTFcMVx1MDEwYVwxXDI1MFwzMlwyNTFcMVx1MDEwYVwyXDI1MVwxXHUwMTBhIisKLSAgICAiXDJcMjUxXDFcdTAxMGFcMTBcMjUxXDFcdTAxMGFcM1wyNTFcMVx1MDEwYVw1XDI1MVwxXDAiKwotICAgICJcMlwyNTFcMVwyNTJcMVwwXDNcMjUxXDFcMjUwXDdcMjUxXDFcMFw1M1wyNTEiKwotICAgICJcMVwwXDFcdTAxMGJcMVwyNTZcMVwyNTdcMVwyNTZcMVwwXDFcMjU2XDFcdTAxMGIiKwotICAgICJcMVwwXDFcMjU2XDFcMFwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2IisKLSAgICAiXDFcMFwxXDI1NlwxM1wwXDFcdTAxMGJcMlwyNTZcMVx1MDEwYlwyXDI1NlwxXHUwMTBiIisKLSAgICAiXDJcMjU2XDFcMFw0XDI1NlwxXDBcMVx1MDEwYlwyXDI1NlwxXDBcMVx1MDEwYiIrCi0gICAgIlwyXDI1Nlw0XDBcMVx1MDEwY1w1XDBcMVx1MDEwY1wzXDBcMVx1MDEwZFw1XDAiKwotICAgICJcMVx1MDEwY1w1XDBcMVx1MDEwY1wxM1wwXDJcdTAxMGNcMVwwXDJcdTAxMGNcMVwwIisKLSAgICAiXDJcdTAxMGNcN1wwXDJcdTAxMGNcMlwwXDJcdTAxMGNcNVwwXDJcMTIyXDFcMjQzIisKLSAgICAiXDNcMFwxXDEyMlwzXDBcMVwxMjJcN1wwXDNcMTIyXDFcdTAxMGVcMVwxMjIiKwotICAgICJcMTNcMFwxMVwxMjJcMVwwXDRcMTIyXDFcMFwzXDEyMlwxXDBcM1wxMjIiKwotICAgICJcNjJcMFwxXHUwMTBmXDI3XDBcMVwzNTNcMTVcMFwxXDM1NFw1MFwwXDFcMzU0IisKLSAgICAiXDJcMFwxXDM1NFw1XDBcMlwzNTRcMTFcMFwxXHUwMTEwXDQyXDBcMVx1MDExMSIrCi0gICAgIlwxXDMyXDFcMTQ3XDFcMzJcMVwwXDFcMzJcMVx1MDExMVwxXDBcMVwzMiIrCi0gICAgIlwxXDBcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMlwxXDBcMVwzMiIrCi0gICAgIlwxM1wwXDFcdTAxMTFcMlwzMlwxXHUwMTExXDJcMzJcMVx1MDExMVwyXDMyXDFcMCIrCi0gICAgIlw0XDMyXDFcMFwxXHUwMTExXDJcMzJcMVwwXDFcdTAxMTFcMlwzMlw0XDAiKwotICAgICJcMVx1MDExMlwxXDE1MlwxXDE1M1wxXDE1MlwxXDBcMVwxNTJcMVx1MDExMlwxXDAiKwotICAgICJcMVwxNTJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTJcMVwwIisKLSAgICAiXDFcMTUyXDEzXDBcMVx1MDExMlwyXDE1MlwxXHUwMTEyXDJcMTUyXDFcdTAxMTJcMlwxNTIiKwotICAgICJcMVwwXDRcMTUyXDFcMFwxXHUwMTEyXDJcMTUyXDFcMFwxXHUwMTEyXDJcMTUyIisKLSAgICAiXDRcMFwxXHUwMTEzXDFcMTU0XDFcMTU1XDFcMTU0XDFcMFwxXDE1NFwxXHUwMTEzIisKLSAgICAiXDFcMFwxXDE1NFwxXDBcMVwxNTRcM1wwXDJcMTU0XDJcMFwzXDE1NCIrCi0gICAgIlwxXDBcMVwxNTRcMTNcMFwxXHUwMTEzXDJcMTU0XDFcdTAxMTNcMlwxNTRcMVx1MDExMyIrCi0gICAgIlwyXDE1NFwxXDBcNFwxNTRcMVwwXDFcdTAxMTNcMlwxNTRcMVwwXDFcdTAxMTMiKwotICAgICJcMlwxNTRcMjdcMFwxXHUwMTE0XDEyN1wwXDFcdTAxMTVcNzBcMFwxXHUwMTE2XDY3XDAiKwotICAgICJcMlx1MDExN1w3NFwwXDFcdTAxMThcMjFcMFwyXDM2N1wxXDM3MFwxXHUwMTE5XDFcMCIrCi0gICAgIlwxXHUwMTE5XDFcMzY3XDFcMFwxXHUwMTE5XDFcdTAxMWFcMVwzNjdcM1wwXDJcdTAxMTkiKwotICAgICJcMlwwXDNcMzY3XDFcMFwxXDM2N1wxM1wwXDExXDM2N1wxXDBcNFwzNjciKwotICAgICJcMVwwXDNcMzY3XDFcMFwzXDM2N1w0XDBcMVx1MDExYlwyXDM2N1wxXDAiKwotICAgICJcMlwzNjdcMVx1MDExYlwxXDM2N1wxXDBcNVwzNjdcMlwwXDIyXDM2N1wxXHUwMTFiIisKLSAgICAiXDJcMzY3XDFcdTAxMWJcMlwzNjdcMVx1MDExYlwxMFwzNjdcMVx1MDExYlwzXDM2N1wxXHUwMTFiIisKLSAgICAiXDVcMzY3XDFcMFwxXHUwMTFjXDFcMTcxXDFcMTcyXDFcMTcxXDFcMFwxXDE3MSIrCi0gICAgIlwxXHUwMTFjXDFcMFwxXDE3MVwxXDBcMVwxNzFcM1wwXDJcMTcxXDJcMCIrCi0gICAgIlwzXDE3MVwxXDMwNFwxXDE3MVwxM1wwXDFcdTAxMWNcMlwxNzFcMVx1MDExY1wyXDE3MSIrCi0gICAgIlwxXHUwMTFjXDJcMTcxXDFcMFw0XDE3MVwxXDBcMVx1MDExY1wyXDE3MVwxXDAiKwotICAgICJcMVx1MDExY1wyXDE3MVw0XDBcMVx1MDExZFwxXDE3M1wxXDE3NFwxXDE3M1wxXDE3NSIrCi0gICAgIlwxXDE3M1wxXHUwMTFkXDMzXDE3M1wxXHUwMTFkXDJcMTczXDFcdTAxMWRcMlwxNzNcMVx1MDExZCIrCi0gICAgIlwxMFwxNzNcMVx1MDExZFwzXDE3M1wxXHUwMTFkXDVcMTczXDFcMFwxXHUwMTFlXDFcMTc2IisKLSAgICAiXDFcMTc3XDNcMTc2XDFcdTAxMWVcMVwxNzVcMzJcMTc2XDFcdTAxMWVcMlwxNzZcMVx1MDExZSIrCi0gICAgIlwyXDE3NlwxXHUwMTFlXDEwXDE3NlwxXHUwMTFlXDNcMTc2XDFcdTAxMWVcNVwxNzZcMVwwIisKLSAgICAiXDFcdTAxMWZcMVwyMDFcMVwyMDJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDExZlwzM1wyMDEiKwotICAgICJcMVx1MDExZlwyXDIwMVwxXHUwMTFmXDJcMjAxXDFcdTAxMWZcMTBcMjAxXDFcdTAxMWZcM1wyMDEiKwotICAgICJcMVx1MDExZlw1XDIwMVwxXDBcMVx1MDEyMFwxXDIwNFwxXDIwNVwzXDIwNFwxXHUwMTIwIisKLSAgICAiXDFcMjAzXDMyXDIwNFwxXHUwMTIwXDJcMjA0XDFcdTAxMjBcMlwyMDRcMVx1MDEyMFwxMFwyMDQiKwotICAgICJcMVx1MDEyMFwzXDIwNFwxXHUwMTIwXDVcMjA0XDFcMFwyXHUwMTIxXDFcdTAxMjJcMVwzNzYiKwotICAgICJcMVx1MDEyM1wxXDM3NlwxXHUwMTIxXDFcdTAxMjRcMVwzNzZcMVx1MDEyNVw0XHUwMTIxXDJcMzc2IisKLSAgICAiXDVcdTAxMjFcMVwwXDQ1XHUwMTIxXDFcMFwxXHUwMTI2XDFcNjBcMVwyMDdcMVw2MCIrCi0gICAgIlwxXDBcMVw2MFwxXHUwMTI2XDFcMFwxXDYwXDFcMFwxXDYwXDNcMCIrCi0gICAgIlwyXDYwXDJcMFwzXDYwXDFcMFwxXDYwXDEzXDBcMVx1MDEyNlwyXDYwIisKLSAgICAiXDFcdTAxMjZcMlw2MFwxXHUwMTI2XDJcNjBcMVwwXDRcNjBcMVwwXDFcdTAxMjYiKwotICAgICJcMlw2MFwxXDBcMVx1MDEyNlwyXDYwXDRcMFwxXHUwMTI3XDFcNjRcMVwyMTIiKwotICAgICJcMVw2NFwxXDBcMVw2NFwxXHUwMTI3XDFcMFwxXDY0XDFcMFwxXDY0IisKLSAgICAiXDNcMFwyXDY0XDJcMFwzXDY0XDFcMFwxXDY0XDEzXDBcMVx1MDEyNyIrCi0gICAgIlwyXDY0XDFcdTAxMjdcMlw2NFwxXHUwMTI3XDJcNjRcMVwwXDRcNjRcMVwwIisKLSAgICAiXDFcdTAxMjdcMlw2NFwxXDBcMVx1MDEyN1wyXDY0XDRcMFwxXHUwMTI4XDFcNzEiKwotICAgICJcMVwyMTVcMVw3MVwxXDBcMVw3MVwxXHUwMTI4XDFcMFwxXDcxXDFcMCIrCi0gICAgIlwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxXDEzXDAiKwotICAgICJcMVx1MDEyOFwyXDcxXDFcdTAxMjhcMlw3MVwxXHUwMTI4XDJcNzFcMVwwXDRcNzEiKwotICAgICJcMVwwXDFcdTAxMjhcMlw3MVwxXDBcMVx1MDEyOFwyXDcxXDRcMFwxXHUwMTI5IisKLSAgICAiXDFcMTAxXDFcMjIxXDFcMTAxXDFcMFwxXDEwMVwxXHUwMTI5XDFcMFwxXDEwMSIrCi0gICAgIlwxXDBcMVwxMDFcM1wwXDJcMTAxXDJcMFwzXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMTNcMFwxXHUwMTI5XDJcMTAxXDFcdTAxMjlcMlwxMDFcMVx1MDEyOVwyXDEwMVwxXDAiKwotICAgICJcNFwxMDFcMVwwXDFcdTAxMjlcMlwxMDFcMVwwXDFcdTAxMjlcMlwxMDFcNFwwIisKLSAgICAiXDFcdTAxMmFcMVwxMDdcMVwyMjRcMVwxMDdcMVwwXDFcMTA3XDFcdTAxMmFcMVwwIisKLSAgICAiXDFcMTA3XDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMCIrCi0gICAgIlwxXDEwN1wxM1wwXDFcdTAxMmFcMlwxMDdcMVx1MDEyYVwyXDEwN1wxXHUwMTJhXDJcMTA3IisKLSAgICAiXDFcMFw0XDEwN1wxXDBcMVx1MDEyYVwyXDEwN1wxXDBcMVx1MDEyYVwyXDEwNyIrCi0gICAgIlw0XDBcMVx1MDEyYlwxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNlwxXHUwMTJiIisKLSAgICAiXDMzXDIyNlwxXHUwMTJiXDJcMjI2XDFcdTAxMmJcMlwyMjZcMVx1MDEyYlwxMFwyMjZcMVx1MDEyYiIrCi0gICAgIlwzXDIyNlwxXHUwMTJiXDVcMjI2XDFcMFwxXHUwMTJjXDFcMjMxXDFcMjMyXDNcMjMxIisKLSAgICAiXDFcdTAxMmNcMVwyMzBcMzJcMjMxXDFcdTAxMmNcMlwyMzFcMVx1MDEyY1wyXDIzMVwxXHUwMTJjIisKLSAgICAiXDEwXDIzMVwxXHUwMTJjXDNcMjMxXDFcdTAxMmNcNVwyMzFcMVwwXDFcdTAxMmRcMVwxMTQiKwotICAgICJcMVwyMzRcMVwxMTRcMVwwXDFcMTE0XDFcdTAxMmRcMVwwXDFcMTE0XDFcMCIrCi0gICAgIlwxXDExNFwzXDBcMlwxMTRcMlwwXDNcMTE0XDFcMFwxXDExNFwxM1wwIisKLSAgICAiXDFcdTAxMmRcMlwxMTRcMVx1MDEyZFwyXDExNFwxXHUwMTJkXDJcMTE0XDFcMFw0XDExNCIrCi0gICAgIlwxXDBcMVx1MDEyZFwyXDExNFwxXDBcMVx1MDEyZFwyXDExNFw0XDBcMVx1MDEyZSIrCi0gICAgIlwxXDIzN1wxXDI0MFwxXDIzN1wxXDBcMVwyMzdcMVx1MDEyZVwxXDBcMVwyMzciKwotICAgICJcMVwwXDFcMjM3XDNcMFwyXDIzN1wyXDBcM1wyMzdcMVwwXDFcMjM3IisKLSAgICAiXDEzXDBcMVx1MDEyZVwyXDIzN1wxXHUwMTJlXDJcMjM3XDFcdTAxMmVcMlwyMzdcMVwwIisKLSAgICAiXDRcMjM3XDFcMFwxXHUwMTJlXDJcMjM3XDFcMFwxXHUwMTJlXDJcMjM3XDRcMCIrCi0gICAgIlwxXHUwMTJmXDFcMTIyXDFcMjQzXDFcMTIyXDFcMFwxXDEyMlwxXHUwMTJmXDFcMCIrCi0gICAgIlwxXDEyMlwxXDBcMVwxMjJcM1wwXDJcMTIyXDJcMFwzXDEyMlwxXDI0NCIrCi0gICAgIlwxXDEyMlwxM1wwXDFcdTAxMmZcMlwxMjJcMVx1MDEyZlwyXDEyMlwxXHUwMTJmXDJcMTIyIisKLSAgICAiXDFcMFw0XDEyMlwxXDBcMVx1MDEyZlwyXDEyMlwxXDBcMVx1MDEyZlwyXDEyMiIrCi0gICAgIlw0XDBcMVx1MDEzMFwxXDI0NlwxXDI0N1wxXDI0NlwxXDI1MFwxXDI0NlwxXHUwMTMwIisKLSAgICAiXDMzXDI0NlwxXHUwMTMwXDJcMjQ2XDFcdTAxMzBcMlwyNDZcMVx1MDEzMFwxMFwyNDZcMVx1MDEzMCIrCi0gICAgIlwzXDI0NlwxXHUwMTMwXDVcMjQ2XDFcMFwxXHUwMTMxXDFcMjUxXDFcMjUyXDNcMjUxIisKLSAgICAiXDFcdTAxMzFcMVwyNTBcMzJcMjUxXDFcdTAxMzFcMlwyNTFcMVx1MDEzMVwyXDI1MVwxXHUwMTMxIisKLSAgICAiXDEwXDI1MVwxXHUwMTMxXDNcMjUxXDFcdTAxMzFcNVwyNTFcMVwwXDFcdTAxMzJcMVwyNTYiKwotICAgICJcMVwyNTdcMVwyNTZcMVwwXDFcMjU2XDFcdTAxMzJcMVwwXDFcMjU2XDFcMCIrCi0gICAgIlwxXDI1NlwzXDBcMlwyNTZcMlwwXDNcMjU2XDFcMFwxXDI1NlwxM1wwIisKLSAgICAiXDFcdTAxMzJcMlwyNTZcMVx1MDEzMlwyXDI1NlwxXHUwMTMyXDJcMjU2XDFcMFw0XDI1NiIrCi0gICAgIlwxXDBcMVx1MDEzMlwyXDI1NlwxXDBcMVx1MDEzMlwyXDI1Nlw0XDBcMVx1MDEzMyIrCi0gICAgIlw1XDBcMVx1MDEzM1wzXDBcMVx1MDEwZFw1XDBcMVx1MDEzM1w1XDBcMVx1MDEzMyIrCi0gICAgIlwxM1wwXDJcdTAxMzNcMVwwXDJcdTAxMzNcMVwwXDJcdTAxMzNcN1wwXDJcdTAxMzMiKwotICAgICJcMlwwXDJcdTAxMzNcNVwwXDFcdTAxMzRcNVwwXDFcdTAxMzRcMTFcMFwxXHUwMTM0IisKLSAgICAiXDVcMFwxXHUwMTM0XDEzXDBcMlx1MDEzNFwxXDBcMlx1MDEzNFwxXDBcMlx1MDEzNCIrCi0gICAgIlw3XDBcMlx1MDEzNFwyXDBcMlx1MDEzNFw1XDBcMlx1MDEzNVwxXHUwMTM2XDFcdTAxMzciKwotICAgICJcMVx1MDEzOFwxXHUwMTM3XDFcdTAxMzVcMVx1MDEzOVwxXHUwMTM3XDFcdTAxM2FcNFx1MDEzNVwyXHUwMTM3IisKLSAgICAiXDVcdTAxMzVcMVwwXDQ1XHUwMTM1XDYwXDBcMVx1MDEzYlwxNFwwXDFcdTAxM2NcMVwzMiIrCi0gICAgIlwxXDE0N1wxXDMyXDFcMFwxXDMyXDFcdTAxM2NcMVwwXDFcMzJcMVwwIisKLSAgICAiXDFcMzJcM1wwXDJcMzJcMlwwXDNcMzJcMVwwXDFcMzJcMTNcMCIrCi0gICAgIlwxXHUwMTNjXDJcMzJcMVx1MDEzY1wyXDMyXDFcdTAxM2NcMlwzMlwxXDBcNFwzMiIrCi0gICAgIlwxXDBcMVx1MDEzY1wyXDMyXDFcMFwxXHUwMTNjXDJcMzJcNFwwXDFcdTAxM2QiKwotICAgICJcMVwxNTJcMVwxNTNcMVwxNTJcMVwwXDFcMTUyXDFcdTAxM2RcMVwwXDFcMTUyIisKLSAgICAiXDFcMFwxXDE1MlwzXDBcMlwxNTJcMlwwXDNcMTUyXDFcMFwxXDE1MiIrCi0gICAgIlwxM1wwXDFcdTAxM2RcMlwxNTJcMVx1MDEzZFwyXDE1MlwxXHUwMTNkXDJcMTUyXDFcMCIrCi0gICAgIlw0XDE1MlwxXDBcMVx1MDEzZFwyXDE1MlwxXDBcMVx1MDEzZFwyXDE1Mlw0XDAiKwotICAgICJcMVx1MDEzZVwxXDE1NFwxXDE1NVwxXDE1NFwxXDBcMVwxNTRcMVx1MDEzZVwxXDAiKwotICAgICJcMVwxNTRcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDBcM1wxNTRcMVwwIisKLSAgICAiXDFcMTU0XDEzXDBcMVx1MDEzZVwyXDE1NFwxXHUwMTNlXDJcMTU0XDFcdTAxM2VcMlwxNTQiKwotICAgICJcMVwwXDRcMTU0XDFcMFwxXHUwMTNlXDJcMTU0XDFcMFwxXHUwMTNlXDJcMTU0IisKLSAgICAiXDUzXDBcMVx1MDEzZlw0N1wwXDFcdTAxNDBcMTE1XDBcMlx1MDE0MVwzN1wwXDFcdTAxNDIiKwotICAgICJcNjRcMFwxXHUwMTE5XDFcMFwxXHUwMTE5XDJcMFwxXHUwMTE5XDFcdTAxMWFcNFwwIisKLSAgICAiXDJcdTAxMTlcNTRcMFwxXHUwMTQzXDFcMzY3XDFcMzcwXDFcMzY3XDFcMFwxXDM2NyIrCi0gICAgIlwxXHUwMTQzXDFcMFwxXDM2N1wxXHUwMTFhXDFcMzY3XDNcMFwyXDM2N1wyXDAiKwotICAgICJcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMVx1MDE0M1wyXDM2N1wxXHUwMTQzXDJcMzY3IisKLSAgICAiXDFcdTAxNDNcMlwzNjdcMVwwXDRcMzY3XDFcMFwxXHUwMTQzXDJcMzY3XDFcMCIrCi0gICAgIlwxXHUwMTQzXDJcMzY3XDRcMFwxXHUwMTQ0XDFcMTcxXDFcMTcyXDFcMTcxXDFcMCIrCi0gICAgIlwxXDE3MVwxXHUwMTQ0XDFcMFwxXDE3MVwxXDBcMVwxNzFcM1wwXDJcMTcxIisKLSAgICAiXDJcMFwzXDE3MVwxXDMwNFwxXDE3MVwxM1wwXDFcdTAxNDRcMlwxNzFcMVx1MDE0NCIrCi0gICAgIlwyXDE3MVwxXHUwMTQ0XDJcMTcxXDFcMFw0XDE3MVwxXDBcMVx1MDE0NFwyXDE3MSIrCi0gICAgIlwxXDBcMVx1MDE0NFwyXDE3MVw0XDBcMVx1MDE0NVwxXDE3M1wxXDE3NFwxXDE3MyIrCi0gICAgIlwxXDE3NVwxXDE3M1wxXHUwMTQ1XDMzXDE3M1wxXHUwMTQ1XDJcMTczXDFcdTAxNDVcMlwxNzMiKwotICAgICJcMVx1MDE0NVwxMFwxNzNcMVx1MDE0NVwzXDE3M1wxXHUwMTQ1XDVcMTczXDFcMFwxXHUwMTQ2IisKLSAgICAiXDFcMTc2XDFcMTc3XDNcMTc2XDFcdTAxNDZcMVwxNzVcMzJcMTc2XDFcdTAxNDZcMlwxNzYiKwotICAgICJcMVx1MDE0NlwyXDE3NlwxXHUwMTQ2XDEwXDE3NlwxXHUwMTQ2XDNcMTc2XDFcdTAxNDZcNVwxNzYiKwotICAgICJcMVwwXDFcdTAxNDdcMVwyMDFcMVwyMDJcMVwyMDFcMVwyMDNcMVwyMDFcMVx1MDE0NyIrCi0gICAgIlwzM1wyMDFcMVx1MDE0N1wyXDIwMVwxXHUwMTQ3XDJcMjAxXDFcdTAxNDdcMTBcMjAxXDFcdTAxNDciKwotICAgICJcM1wyMDFcMVx1MDE0N1w1XDIwMVwxXDBcMVx1MDE0OFwxXDIwNFwxXDIwNVwzXDIwNCIrCi0gICAgIlwxXHUwMTQ4XDFcMjAzXDMyXDIwNFwxXHUwMTQ4XDJcMjA0XDFcdTAxNDhcMlwyMDRcMVx1MDE0OCIrCi0gICAgIlwxMFwyMDRcMVx1MDE0OFwzXDIwNFwxXHUwMTQ4XDVcMjA0XDFcMFwyXHUwMTIxXDFcdTAxMjIiKwotICAgICJcMVx1MDE0OVwxXDBcMlx1MDEyMVwxXDBcMVx1MDE0OVwxXHUwMTI1XDRcdTAxMjFcMlx1MDE0OSIrCi0gICAgIlw1XHUwMTIxXDFcMFw0NVx1MDEyMVwxXDBcMVx1MDE0YVwxXHUwMTIxXDFcdTAxMjJcMVx1MDE0OSIrCi0gICAgIlwyXHUwMTIxXDFcdTAxNGFcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxNGJcNFx1MDEyMVwyXHUwMTQ5XDIyXHUwMTIxIisKLSAgICAiXDFcdTAxNGFcMlx1MDEyMVwxXHUwMTRhXDJcdTAxMjFcMVx1MDE0YVwxMFx1MDEyMVwxXHUwMTRhXDNcdTAxMjEiKwotICAgICJcMVx1MDE0YVw1XHUwMTIxXDFcMFwyXHUwMTIzXDFcdTAxNGNcMVwwXDFcdTAxNDlcMTFcdTAxMjMiKwotICAgICJcMlwwXDUzXHUwMTIzXDFcMFwyXHUwMTI0XDFcdTAxNGRcMVwwXDNcdTAxMjRcMVx1MDE0OSIrCi0gICAgIlw2XHUwMTI0XDJcMFw1M1x1MDEyNFwxXDBcMVx1MDE0ZVwxXDYwXDFcMjA3XDFcNjAiKwotICAgICJcMVwwXDFcNjBcMVx1MDE0ZVwxXDBcMVw2MFwxXDBcMVw2MFwzXDAiKwotICAgICJcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcdTAxNGVcMlw2MCIrCi0gICAgIlwxXHUwMTRlXDJcNjBcMVx1MDE0ZVwyXDYwXDFcMFw0XDYwXDFcMFwxXHUwMTRlIisKLSAgICAiXDJcNjBcMVwwXDFcdTAxNGVcMlw2MFw0XDBcMVx1MDE0ZlwxXDY0XDFcMjEyIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVx1MDE0ZlwxXDBcMVw2NFwxXDBcMVw2NCIrCi0gICAgIlwzXDBcMlw2NFwyXDBcM1w2NFwxXDBcMVw2NFwxM1wwXDFcdTAxNGYiKwotICAgICJcMlw2NFwxXHUwMTRmXDJcNjRcMVx1MDE0ZlwyXDY0XDFcMFw0XDY0XDFcMCIrCi0gICAgIlwxXHUwMTRmXDJcNjRcMVwwXDFcdTAxNGZcMlw2NFw0XDBcMVx1MDE1MFwxXDcxIisKLSAgICAiXDFcMjE1XDFcNzFcMVwwXDFcNzFcMVx1MDE1MFwxXDBcMVw3MVwxXDAiKwotICAgICJcMVw3MVwzXDBcMlw3MVwyXDBcM1w3MVwxXDBcMVw3MVwxM1wwIisKLSAgICAiXDFcdTAxNTBcMlw3MVwxXHUwMTUwXDJcNzFcMVx1MDE1MFwyXDcxXDFcMFw0XDcxIisKLSAgICAiXDFcMFwxXHUwMTUwXDJcNzFcMVwwXDFcdTAxNTBcMlw3MVw0XDBcMVx1MDE1MSIrCi0gICAgIlwxXDEwMVwxXDIyMVwxXDEwMVwxXDBcMVwxMDFcMVx1MDE1MVwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMVx1MDE1MVwyXDEwMVwxXHUwMTUxXDJcMTAxXDFcdTAxNTFcMlwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwxXHUwMTUxXDJcMTAxXDFcMFwxXHUwMTUxXDJcMTAxXDRcMCIrCi0gICAgIlwxXHUwMTUyXDFcMTA3XDFcMjI0XDFcMTA3XDFcMFwxXDEwN1wxXHUwMTUyXDFcMCIrCi0gICAgIlwxXDEwN1wxXDBcMVwxMDdcM1wwXDJcMTA3XDJcMFwzXDEwN1wxXDAiKwotICAgICJcMVwxMDdcMTNcMFwxXHUwMTUyXDJcMTA3XDFcdTAxNTJcMlwxMDdcMVx1MDE1MlwyXDEwNyIrCi0gICAgIlwxXDBcNFwxMDdcMVwwXDFcdTAxNTJcMlwxMDdcMVwwXDFcdTAxNTJcMlwxMDciKwotICAgICJcNFwwXDFcdTAxNTNcMVwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcMVwyMjZcMVx1MDE1MyIrCi0gICAgIlwzM1wyMjZcMVx1MDE1M1wyXDIyNlwxXHUwMTUzXDJcMjI2XDFcdTAxNTNcMTBcMjI2XDFcdTAxNTMiKwotICAgICJcM1wyMjZcMVx1MDE1M1w1XDIyNlwxXDBcMVx1MDE1NFwxXDIzMVwxXDIzMlwzXDIzMSIrCi0gICAgIlwxXHUwMTU0XDFcMjMwXDMyXDIzMVwxXHUwMTU0XDJcMjMxXDFcdTAxNTRcMlwyMzFcMVx1MDE1NCIrCi0gICAgIlwxMFwyMzFcMVx1MDE1NFwzXDIzMVwxXHUwMTU0XDVcMjMxXDFcMFwxXHUwMTU1XDFcMTE0IisKLSAgICAiXDFcMjM0XDFcMTE0XDFcMFwxXDExNFwxXHUwMTU1XDFcMFwxXDExNFwxXDAiKwotICAgICJcMVwxMTRcM1wwXDJcMTE0XDJcMFwzXDExNFwxXDBcMVwxMTRcMTNcMCIrCi0gICAgIlwxXHUwMTU1XDJcMTE0XDFcdTAxNTVcMlwxMTRcMVx1MDE1NVwyXDExNFwxXDBcNFwxMTQiKwotICAgICJcMVwwXDFcdTAxNTVcMlwxMTRcMVwwXDFcdTAxNTVcMlwxMTRcNFwwXDFcdTAxNTYiKwotICAgICJcMVwyMzdcMVwyNDBcMVwyMzdcMVwwXDFcMjM3XDFcdTAxNTZcMVwwXDFcMjM3IisKLSAgICAiXDFcMFwxXDIzN1wzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzNyIrCi0gICAgIlwxM1wwXDFcdTAxNTZcMlwyMzdcMVx1MDE1NlwyXDIzN1wxXHUwMTU2XDJcMjM3XDFcMCIrCi0gICAgIlw0XDIzN1wxXDBcMVx1MDE1NlwyXDIzN1wxXDBcMVx1MDE1NlwyXDIzN1w0XDAiKwotICAgICJcMVx1MDE1N1wxXDEyMlwxXDI0M1wxXDEyMlwxXDBcMVwxMjJcMVx1MDE1N1wxXDAiKwotICAgICJcMVwxMjJcMVwwXDFcMTIyXDNcMFwyXDEyMlwyXDBcM1wxMjJcMVwyNDQiKwotICAgICJcMVwxMjJcMTNcMFwxXHUwMTU3XDJcMTIyXDFcdTAxNTdcMlwxMjJcMVx1MDE1N1wyXDEyMiIrCi0gICAgIlwxXDBcNFwxMjJcMVwwXDFcdTAxNTdcMlwxMjJcMVwwXDFcdTAxNTdcMlwxMjIiKwotICAgICJcNFwwXDFcdTAxNThcMVwyNDZcMVwyNDdcMVwyNDZcMVwyNTBcMVwyNDZcMVx1MDE1OCIrCi0gICAgIlwzM1wyNDZcMVx1MDE1OFwyXDI0NlwxXHUwMTU4XDJcMjQ2XDFcdTAxNThcMTBcMjQ2XDFcdTAxNTgiKwotICAgICJcM1wyNDZcMVx1MDE1OFw1XDI0NlwxXDBcMVx1MDE1OVwxXDI1MVwxXDI1MlwzXDI1MSIrCi0gICAgIlwxXHUwMTU5XDFcMjUwXDMyXDI1MVwxXHUwMTU5XDJcMjUxXDFcdTAxNTlcMlwyNTFcMVx1MDE1OSIrCi0gICAgIlwxMFwyNTFcMVx1MDE1OVwzXDI1MVwxXHUwMTU5XDVcMjUxXDFcMFwxXHUwMTVhXDFcMjU2IisKLSAgICAiXDFcMjU3XDFcMjU2XDFcMFwxXDI1NlwxXHUwMTVhXDFcMFwxXDI1NlwxXDAiKwotICAgICJcMVwyNTZcM1wwXDJcMjU2XDJcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMCIrCi0gICAgIlwxXHUwMTVhXDJcMjU2XDFcdTAxNWFcMlwyNTZcMVx1MDE1YVwyXDI1NlwxXDBcNFwyNTYiKwotICAgICJcMVwwXDFcdTAxNWFcMlwyNTZcMVwwXDFcdTAxNWFcMlwyNTZcNFwwXDFcdTAxNWIiKwotICAgICJcNVwwXDFcdTAxNWJcM1wwXDFcdTAxMGRcNVwwXDFcdTAxNWJcNVwwXDFcdTAxNWIiKwotICAgICJcMTNcMFwyXHUwMTViXDFcMFwyXHUwMTViXDFcMFwyXHUwMTViXDdcMFwyXHUwMTViIisKLSAgICAiXDJcMFwyXHUwMTViXDVcMFwxXHUwMTVjXDVcMFwxXHUwMTVjXDExXDBcMVx1MDE1YyIrCi0gICAgIlw1XDBcMVx1MDE1Y1wxM1wwXDJcdTAxNWNcMVwwXDJcdTAxNWNcMVwwXDJcdTAxNWMiKwotICAgICJcN1wwXDJcdTAxNWNcMlwwXDJcdTAxNWNcNVwwXDJcdTAxMzVcMVx1MDEzNlwxXHUwMTVkIisKLSAgICAiXDFcMFwyXHUwMTM1XDFcMFwxXHUwMTVkXDFcdTAxM2FcNFx1MDEzNVwyXHUwMTVkXDVcdTAxMzUiKwotICAgICJcMVwwXDQ1XHUwMTM1XDFcMFwxXHUwMTVlXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTVkXDJcdTAxMzUiKwotICAgICJcMVx1MDE1ZVwxXHUwMTM1XDFcdTAxNWRcMVx1MDE1Zlw0XHUwMTM1XDJcdTAxNWRcMjJcdTAxMzVcMVx1MDE1ZSIrCi0gICAgIlwyXHUwMTM1XDFcdTAxNWVcMlx1MDEzNVwxXHUwMTVlXDEwXHUwMTM1XDFcdTAxNWVcM1x1MDEzNVwxXHUwMTVlIisKLSAgICAiXDVcdTAxMzVcMVwwXDJcdTAxMzhcMVx1MDE2MFwxXDBcMVx1MDE1ZFwxMVx1MDEzOFwyXDAiKwotICAgICJcNTNcdTAxMzhcMVwwXDJcdTAxMzlcMVx1MDE2MVwxXDBcM1x1MDEzOVwxXHUwMTVkXDZcdTAxMzkiKwotICAgICJcMlwwXDUzXHUwMTM5XDI0XDBcMVx1MDE2Mlw1MFwwXDFcdTAxNjNcMVwzMlwxXDE0NyIrCi0gICAgIlwxXDMyXDFcMFwxXDMyXDFcdTAxNjNcMVwwXDFcMzJcMVwwXDFcMzIiKwotICAgICJcM1wwXDJcMzJcMlwwXDNcMzJcMVwwXDFcMzJcMTNcMFwxXHUwMTYzIisKLSAgICAiXDJcMzJcMVx1MDE2M1wyXDMyXDFcdTAxNjNcMlwzMlwxXDBcNFwzMlwxXDAiKwotICAgICJcMVx1MDE2M1wyXDMyXDFcMFwxXHUwMTYzXDJcMzJcNFwwXDFcdTAxNjRcMVwxNTIiKwotICAgICJcMVwxNTNcMVwxNTJcMVwwXDFcMTUyXDFcdTAxNjRcMVwwXDFcMTUyXDFcMCIrCi0gICAgIlwxXDE1MlwzXDBcMlwxNTJcMlwwXDNcMTUyXDFcMFwxXDE1MlwxM1wwIisKLSAgICAiXDFcdTAxNjRcMlwxNTJcMVx1MDE2NFwyXDE1MlwxXHUwMTY0XDJcMTUyXDFcMFw0XDE1MiIrCi0gICAgIlwxXDBcMVx1MDE2NFwyXDE1MlwxXDBcMVx1MDE2NFwyXDE1Mlw0XDBcMVx1MDE2NSIrCi0gICAgIlwxXDE1NFwxXDE1NVwxXDE1NFwxXDBcMVwxNTRcMVx1MDE2NVwxXDBcMVwxNTQiKwotICAgICJcMVwwXDFcMTU0XDNcMFwyXDE1NFwyXDBcM1wxNTRcMVwwXDFcMTU0IisKLSAgICAiXDEzXDBcMVx1MDE2NVwyXDE1NFwxXHUwMTY1XDJcMTU0XDFcdTAxNjVcMlwxNTRcMVwwIisKLSAgICAiXDRcMTU0XDFcMFwxXHUwMTY1XDJcMTU0XDFcMFwxXHUwMTY1XDJcMTU0XDU0XDAiKwotICAgICJcMlx1MDE2Nlw3NFwwXDFcdTAxNjdcMTA2XDBcMlx1MDE2OFw1XDBcMVx1MDE2OVwxXDM2NyIrCi0gICAgIlwxXDM3MFwxXDM2N1wxXDBcMVwzNjdcMVx1MDE2OVwxXDBcMVwzNjdcMVx1MDExYSIrCi0gICAgIlwxXDM2N1wzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMFwxXDM2N1wxM1wwIisKLSAgICAiXDFcdTAxNjlcMlwzNjdcMVx1MDE2OVwyXDM2N1wxXHUwMTY5XDJcMzY3XDFcMFw0XDM2NyIrCi0gICAgIlwxXDBcMVx1MDE2OVwyXDM2N1wxXDBcMVx1MDE2OVwyXDM2N1w0XDBcMVx1MDE2YSIrCi0gICAgIlwxXDE3MVwxXDE3MlwxXDE3MVwxXDBcMVwxNzFcMVx1MDE2YVwxXDBcMVwxNzEiKwotICAgICJcMVwwXDFcMTcxXDNcMFwyXDE3MVwyXDBcM1wxNzFcMVwzMDRcMVwxNzEiKwotICAgICJcMTNcMFwxXHUwMTZhXDJcMTcxXDFcdTAxNmFcMlwxNzFcMVx1MDE2YVwyXDE3MVwxXDAiKwotICAgICJcNFwxNzFcMVwwXDFcdTAxNmFcMlwxNzFcMVwwXDFcdTAxNmFcMlwxNzFcNFwwIisKLSAgICAiXDFcdTAxNmJcMVwxNzNcMVwxNzRcMVwxNzNcMVwxNzVcMVwxNzNcMVx1MDE2YlwzM1wxNzMiKwotICAgICJcMVx1MDE2YlwyXDE3M1wxXHUwMTZiXDJcMTczXDFcdTAxNmJcMTBcMTczXDFcdTAxNmJcM1wxNzMiKwotICAgICJcMVx1MDE2Ylw1XDE3M1wxXDBcMVx1MDE2Y1wxXDE3NlwxXDE3N1wzXDE3NlwxXHUwMTZjIisKLSAgICAiXDFcMTc1XDMyXDE3NlwxXHUwMTZjXDJcMTc2XDFcdTAxNmNcMlwxNzZcMVx1MDE2Y1wxMFwxNzYiKwotICAgICJcMVx1MDE2Y1wzXDE3NlwxXHUwMTZjXDVcMTc2XDFcMFwxXHUwMTZkXDFcMjAxXDFcMjAyIisKLSAgICAiXDFcMjAxXDFcMjAzXDFcMjAxXDFcdTAxNmRcMzNcMjAxXDFcdTAxNmRcMlwyMDFcMVx1MDE2ZCIrCi0gICAgIlwyXDIwMVwxXHUwMTZkXDEwXDIwMVwxXHUwMTZkXDNcMjAxXDFcdTAxNmRcNVwyMDFcMVwwIisKLSAgICAiXDFcdTAxNmVcMVwyMDRcMVwyMDVcM1wyMDRcMVx1MDE2ZVwxXDIwM1wzMlwyMDRcMVx1MDE2ZSIrCi0gICAgIlwyXDIwNFwxXHUwMTZlXDJcMjA0XDFcdTAxNmVcMTBcMjA0XDFcdTAxNmVcM1wyMDRcMVx1MDE2ZSIrCi0gICAgIlw1XDIwNFw0XDBcMVx1MDE0OVwxXDBcMVx1MDE0OVwyXDBcMVx1MDE0OVwxXHUwMTI1IisKLSAgICAiXDRcMFwyXHUwMTQ5XDU0XDBcMVx1MDE2ZlwxXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDAiKwotICAgICJcMVx1MDEyMVwxXHUwMTZmXDFcMFwxXHUwMTIxXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDE0XHUwMTIxIisKLSAgICAiXDFcdTAxNmZcMlx1MDEyMVwxXHUwMTZmXDJcdTAxMjFcMVx1MDE2ZlwxMFx1MDEyMVwxXHUwMTZmXDNcdTAxMjEiKwotICAgICJcMVx1MDE2Zlw1XHUwMTIxXDFcMFwxXHUwMTcwXDFcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNzEiKwotICAgICJcMVx1MDEyM1wxXHUwMTcwXDEwXHUwMTIzXDFcdTAxNzJcMjJcdTAxMjNcMVx1MDE3MFwyXHUwMTIzXDFcdTAxNzAiKwotICAgICJcMlx1MDEyM1wxXHUwMTcwXDEwXHUwMTIzXDFcdTAxNzBcM1x1MDEyM1wxXHUwMTcwXDVcdTAxMjNcMVwwIisKLSAgICAiXDFcdTAxNzNcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjRcMVx1MDE3M1wxXHUwMTc0XDdcdTAxMjRcMVx1MDE3NSIrCi0gICAgIlwyMlx1MDEyNFwxXHUwMTczXDJcdTAxMjRcMVx1MDE3M1wyXHUwMTI0XDFcdTAxNzNcMTBcdTAxMjRcMVx1MDE3MyIrCi0gICAgIlwzXHUwMTI0XDFcdTAxNzNcNVx1MDEyNFwxXDBcMVx1MDE3NlwxXDYwXDFcMjA3XDFcNjAiKwotICAgICJcMVwwXDFcNjBcMVx1MDE3NlwxXDBcMVw2MFwxXDBcMVw2MFwzXDAiKwotICAgICJcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MFwxM1wwXDFcdTAxNzZcMlw2MCIrCi0gICAgIlwxXHUwMTc2XDJcNjBcMVx1MDE3NlwyXDYwXDFcMFw0XDYwXDFcMFwxXHUwMTc2IisKLSAgICAiXDJcNjBcMVwwXDFcdTAxNzZcMlw2MFw0XDBcMVx1MDE3N1wxXDY0XDFcMjEyIisKLSAgICAiXDFcNjRcMVwwXDFcNjRcMVx1MDE3N1wxXDBcMVw2NFwxXDBcMVw2NCIrCi0gICAgIlwzXDBcMlw2NFwyXDBcM1w2NFwxXDBcMVw2NFwxM1wwXDFcdTAxNzciKwotICAgICJcMlw2NFwxXHUwMTc3XDJcNjRcMVx1MDE3N1wyXDY0XDFcMFw0XDY0XDFcMCIrCi0gICAgIlwxXHUwMTc3XDJcNjRcMVwwXDFcdTAxNzdcMlw2NFw0XDBcMVx1MDE3OFwxXDcxIisKLSAgICAiXDFcMjE1XDFcNzFcMVwwXDFcNzFcMVx1MDE3OFwxXDBcMVw3MVwxXDAiKwotICAgICJcMVw3MVwzXDBcMlw3MVwyXDBcM1w3MVwxXDBcMVw3MVwxM1wwIisKLSAgICAiXDFcdTAxNzhcMlw3MVwxXHUwMTc4XDJcNzFcMVx1MDE3OFwyXDcxXDFcMFw0XDcxIisKLSAgICAiXDFcMFwxXHUwMTc4XDJcNzFcMVwwXDFcdTAxNzhcMlw3MVw0XDBcMVx1MDE3OSIrCi0gICAgIlwxXDEwMVwxXDIyMVwxXDEwMVwxXDBcMVwxMDFcMVx1MDE3OVwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMVx1MDE3OVwyXDEwMVwxXHUwMTc5XDJcMTAxXDFcdTAxNzlcMlwxMDFcMVwwIisKLSAgICAiXDRcMTAxXDFcMFwxXHUwMTc5XDJcMTAxXDFcMFwxXHUwMTc5XDJcMTAxXDRcMCIrCi0gICAgIlwxXHUwMTdhXDFcMTA3XDFcMjI0XDFcMTA3XDFcMFwxXDEwN1wxXHUwMTdhXDFcMCIrCi0gICAgIlwxXDEwN1wxXDBcMVwxMDdcM1wwXDJcMTA3XDJcMFwzXDEwN1wxXDAiKwotICAgICJcMVwxMDdcMTNcMFwxXHUwMTdhXDJcMTA3XDFcdTAxN2FcMlwxMDdcMVx1MDE3YVwyXDEwNyIrCi0gICAgIlwxXDBcNFwxMDdcMVwwXDFcdTAxN2FcMlwxMDdcMVwwXDFcdTAxN2FcMlwxMDciKwotICAgICJcNFwwXDFcdTAxN2JcMVwyMjZcMVwyMjdcMVwyMjZcMVwyMzBcMVwyMjZcMVx1MDE3YiIrCi0gICAgIlwzM1wyMjZcMVx1MDE3YlwyXDIyNlwxXHUwMTdiXDJcMjI2XDFcdTAxN2JcMTBcMjI2XDFcdTAxN2IiKwotICAgICJcM1wyMjZcMVx1MDE3Ylw1XDIyNlwxXDBcMVx1MDE3Y1wxXDIzMVwxXDIzMlwzXDIzMSIrCi0gICAgIlwxXHUwMTdjXDFcMjMwXDMyXDIzMVwxXHUwMTdjXDJcMjMxXDFcdTAxN2NcMlwyMzFcMVx1MDE3YyIrCi0gICAgIlwxMFwyMzFcMVx1MDE3Y1wzXDIzMVwxXHUwMTdjXDVcMjMxXDFcMFwxXHUwMTdkXDFcMTE0IisKLSAgICAiXDFcMjM0XDFcMTE0XDFcMFwxXDExNFwxXHUwMTdkXDFcMFwxXDExNFwxXDAiKwotICAgICJcMVwxMTRcM1wwXDJcMTE0XDJcMFwzXDExNFwxXDBcMVwxMTRcMTNcMCIrCi0gICAgIlwxXHUwMTdkXDJcMTE0XDFcdTAxN2RcMlwxMTRcMVx1MDE3ZFwyXDExNFwxXDBcNFwxMTQiKwotICAgICJcMVwwXDFcdTAxN2RcMlwxMTRcMVwwXDFcdTAxN2RcMlwxMTRcNFwwXDFcdTAxN2UiKwotICAgICJcMVwyMzdcMVwyNDBcMVwyMzdcMVwwXDFcMjM3XDFcdTAxN2VcMVwwXDFcMjM3IisKLSAgICAiXDFcMFwxXDIzN1wzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzNyIrCi0gICAgIlwxM1wwXDFcdTAxN2VcMlwyMzdcMVx1MDE3ZVwyXDIzN1wxXHUwMTdlXDJcMjM3XDFcMCIrCi0gICAgIlw0XDIzN1wxXDBcMVx1MDE3ZVwyXDIzN1wxXDBcMVx1MDE3ZVwyXDIzN1w0XDAiKwotICAgICJcMVx1MDE3ZlwxXDEyMlwxXDI0M1wxXDEyMlwxXDBcMVwxMjJcMVx1MDE3ZlwxXDAiKwotICAgICJcMVwxMjJcMVwwXDFcMTIyXDNcMFwyXDEyMlwyXDBcM1wxMjJcMVwyNDQiKwotICAgICJcMVwxMjJcMTNcMFwxXHUwMTdmXDJcMTIyXDFcdTAxN2ZcMlwxMjJcMVx1MDE3ZlwyXDEyMiIrCi0gICAgIlwxXDBcNFwxMjJcMVwwXDFcdTAxN2ZcMlwxMjJcMVwwXDFcdTAxN2ZcMlwxMjIiKwotICAgICJcNFwwXDFcdTAxODBcMVwyNDZcMVwyNDdcMVwyNDZcMVwyNTBcMVwyNDZcMVx1MDE4MCIrCi0gICAgIlwzM1wyNDZcMVx1MDE4MFwyXDI0NlwxXHUwMTgwXDJcMjQ2XDFcdTAxODBcMTBcMjQ2XDFcdTAxODAiKwotICAgICJcM1wyNDZcMVx1MDE4MFw1XDI0NlwxXDBcMVx1MDE4MVwxXDI1MVwxXDI1MlwzXDI1MSIrCi0gICAgIlwxXHUwMTgxXDFcMjUwXDMyXDI1MVwxXHUwMTgxXDJcMjUxXDFcdTAxODFcMlwyNTFcMVx1MDE4MSIrCi0gICAgIlwxMFwyNTFcMVx1MDE4MVwzXDI1MVwxXHUwMTgxXDVcMjUxXDFcMFwxXHUwMTgyXDFcMjU2IisKLSAgICAiXDFcMjU3XDFcMjU2XDFcMFwxXDI1NlwxXHUwMTgyXDFcMFwxXDI1NlwxXDAiKwotICAgICJcMVwyNTZcM1wwXDJcMjU2XDJcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMCIrCi0gICAgIlwxXHUwMTgyXDJcMjU2XDFcdTAxODJcMlwyNTZcMVx1MDE4MlwyXDI1NlwxXDBcNFwyNTYiKwotICAgICJcMVwwXDFcdTAxODJcMlwyNTZcMVwwXDFcdTAxODJcMlwyNTZcNFwwXDFcdTAxODMiKwotICAgICJcNVwwXDFcdTAxODNcM1wwXDFcdTAxMGRcNVwwXDFcdTAxODNcNVwwXDFcdTAxODMiKwotICAgICJcMTNcMFwyXHUwMTgzXDFcMFwyXHUwMTgzXDFcMFwyXHUwMTgzXDdcMFwyXHUwMTgzIisKLSAgICAiXDJcMFwyXHUwMTgzXDVcMFwxXHUwMTg0XDVcMFwxXHUwMTg0XDExXDBcMVx1MDE4NCIrCi0gICAgIlw1XDBcMVx1MDE4NFwxM1wwXDJcdTAxODRcMVwwXDJcdTAxODRcMVwwXDJcdTAxODQiKwotICAgICJcN1wwXDJcdTAxODRcMlwwXDJcdTAxODRcMTBcMFwxXHUwMTVkXDFcMFwxXHUwMTVkIisKLSAgICAiXDJcMFwxXHUwMTVkXDFcdTAxM2FcNFwwXDJcdTAxNWRcNTRcMFwxXHUwMTg1XDFcdTAxMzUiKwotICAgICJcMVx1MDEzNlwxXHUwMTM1XDFcMFwxXHUwMTM1XDFcdTAxODVcMVwwXDFcdTAxMzVcMVx1MDEzYSIrCi0gICAgIlwxM1x1MDEzNVwxXDBcMTRcdTAxMzVcMVx1MDE4NVwyXHUwMTM1XDFcdTAxODVcMlx1MDEzNVwxXHUwMTg1IisKLSAgICAiXDEwXHUwMTM1XDFcdTAxODVcM1x1MDEzNVwxXHUwMTg1XDVcdTAxMzVcMVwwXDFcdTAxODZcMVx1MDEzOCIrCi0gICAgIlwxXHUwMTYwXDFcdTAxMzhcMVx1MDE4N1wxXHUwMTM4XDFcdTAxODZcMTBcdTAxMzhcMVx1MDE4OFwyMlx1MDEzOCIrCi0gICAgIlwxXHUwMTg2XDJcdTAxMzhcMVx1MDE4NlwyXHUwMTM4XDFcdTAxODZcMTBcdTAxMzhcMVx1MDE4NlwzXHUwMTM4IisKLSAgICAiXDFcdTAxODZcNVx1MDEzOFwxXDBcMVx1MDE4OVwxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMTg5IisKLSAgICAiXDFcdTAxOGFcN1x1MDEzOVwxXHUwMThiXDIyXHUwMTM5XDFcdTAxODlcMlx1MDEzOVwxXHUwMTg5XDJcdTAxMzkiKwotICAgICJcMVx1MDE4OVwxMFx1MDEzOVwxXHUwMTg5XDNcdTAxMzlcMVx1MDE4OVw1XHUwMTM5XDUzXDBcMVx1MDE4YyIrCi0gICAgIlwyMVwwXDJcMzJcMVwxNDdcMVwzMlwxXDBcMlwzMlwxXDBcMVwzMiIrCi0gICAgIlwxXDBcMVwzMlwzXDBcMlwzMlwyXDBcM1wzMlwxXDBcMVwzMiIrCi0gICAgIlwxM1wwXDExXDMyXDFcMFw0XDMyXDFcMFwzXDMyXDFcMFwzXDMyIisKLSAgICAiXDRcMFwxXHUwMThkXDFcMTUyXDFcMTUzXDFcMTUyXDFcMFwxXDE1MlwxXHUwMThkIisKLSAgICAiXDFcMFwxXDE1MlwxXDBcMVwxNTJcM1wwXDJcMTUyXDJcMFwzXDE1MiIrCi0gICAgIlwxXDBcMVwxNTJcMTNcMFwxXHUwMThkXDJcMTUyXDFcdTAxOGRcMlwxNTJcMVx1MDE4ZCIrCi0gICAgIlwyXDE1MlwxXDBcNFwxNTJcMVwwXDFcdTAxOGRcMlwxNTJcMVwwXDFcdTAxOGQiKwotICAgICJcMlwxNTJcNFwwXDFcdTAxOGVcMVwxNTRcMVwxNTVcMVwxNTRcMVwwXDFcMTU0IisKLSAgICAiXDFcdTAxOGVcMVwwXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTRcMlwwIisKLSAgICAiXDNcMTU0XDFcMFwxXDE1NFwxM1wwXDFcdTAxOGVcMlwxNTRcMVx1MDE4ZVwyXDE1NCIrCi0gICAgIlwxXHUwMThlXDJcMTU0XDFcMFw0XDE1NFwxXDBcMVx1MDE4ZVwyXDE1NFwxXDAiKwotICAgICJcMVx1MDE4ZVwyXDE1NFw1NlwwXDFcdTAxOGZcNjZcMFwyXHUwMTkwXDI1XDBcMVx1MDE5MSIrCi0gICAgIlwxXDM2N1wxXDM3MFwxXDM2N1wxXDBcMVwzNjdcMVx1MDE5MVwxXDBcMVwzNjciKwotICAgICJcMVx1MDExYVwxXDM2N1wzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMFwxXDM2NyIrCi0gICAgIlwxM1wwXDFcdTAxOTFcMlwzNjdcMVx1MDE5MVwyXDM2N1wxXHUwMTkxXDJcMzY3XDFcMCIrCi0gICAgIlw0XDM2N1wxXDBcMVx1MDE5MVwyXDM2N1wxXDBcMVx1MDE5MVwyXDM2N1w0XDAiKwotICAgICJcMVx1MDE5MlwxXDE3MVwxXDE3MlwxXDE3MVwxXDBcMVwxNzFcMVx1MDE5MlwxXDAiKwotICAgICJcMVwxNzFcMVwwXDFcMTcxXDNcMFwyXDE3MVwyXDBcM1wxNzFcMVwzMDQiKwotICAgICJcMVwxNzFcMTNcMFwxXHUwMTkyXDJcMTcxXDFcdTAxOTJcMlwxNzFcMVx1MDE5MlwyXDE3MSIrCi0gICAgIlwxXDBcNFwxNzFcMVwwXDFcdTAxOTJcMlwxNzFcMVwwXDFcdTAxOTJcMlwxNzEiKwotICAgICJcNFwwXDFcdTAxOTNcMVwxNzNcMVwxNzRcMVwxNzNcMVwxNzVcMVwxNzNcMVx1MDE5MyIrCi0gICAgIlwzM1wxNzNcMVx1MDE5M1wyXDE3M1wxXHUwMTkzXDJcMTczXDFcdTAxOTNcMTBcMTczXDFcdTAxOTMiKwotICAgICJcM1wxNzNcMVx1MDE5M1w1XDE3M1wxXDBcMVx1MDE5NFwxXDE3NlwxXDE3N1wzXDE3NiIrCi0gICAgIlwxXHUwMTk0XDFcMTc1XDMyXDE3NlwxXHUwMTk0XDJcMTc2XDFcdTAxOTRcMlwxNzZcMVx1MDE5NCIrCi0gICAgIlwxMFwxNzZcMVx1MDE5NFwzXDE3NlwxXHUwMTk0XDVcMTc2XDFcMFwxXHUwMTk1XDFcMjAxIisKLSAgICAiXDFcMjAyXDFcMjAxXDFcMjAzXDFcMjAxXDFcdTAxOTVcMzNcMjAxXDFcdTAxOTVcMlwyMDEiKwotICAgICJcMVx1MDE5NVwyXDIwMVwxXHUwMTk1XDEwXDIwMVwxXHUwMTk1XDNcMjAxXDFcdTAxOTVcNVwyMDEiKwotICAgICJcMVwwXDFcdTAxOTZcMVwyMDRcMVwyMDVcM1wyMDRcMVx1MDE5NlwxXDIwM1wzMlwyMDQiKwotICAgICJcMVx1MDE5NlwyXDIwNFwxXHUwMTk2XDJcMjA0XDFcdTAxOTZcMTBcMjA0XDFcdTAxOTZcM1wyMDQiKwotICAgICJcMVx1MDE5Nlw1XDIwNFwxXDBcMVx1MDE5N1wxXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDAiKwotICAgICJcMVx1MDEyMVwxXHUwMTk3XDFcMFwxXHUwMTIxXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDE0XHUwMTIxIisKLSAgICAiXDFcdTAxOTdcMlx1MDEyMVwxXHUwMTk3XDJcdTAxMjFcMVx1MDE5N1wxMFx1MDEyMVwxXHUwMTk3XDNcdTAxMjEiKwotICAgICJcMVx1MDE5N1w1XHUwMTIxXDFcMFwxXHUwMTk4XDFcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDkiKwotICAgICJcMVx1MDEyM1wxXHUwMTk4XDMzXHUwMTIzXDFcdTAxOThcMlx1MDEyM1wxXHUwMTk4XDJcdTAxMjNcMVx1MDE5OCIrCi0gICAgIlwxMFx1MDEyM1wxXHUwMTk4XDNcdTAxMjNcMVx1MDE5OFw1XHUwMTIzXDFcMFwyXHUwMTIzXDFcdTAxNGMiKwotICAgICJcMlx1MDE0OVwxXHUwMTcxXDJcdTAxMjNcMVx1MDE3MVwxXHUwMTk5XDRcdTAxMjNcMlx1MDE0OVw1M1x1MDEyMyIrCi0gICAgIlwxXDBcMlx1MDEyM1wxXHUwMTRjXDFcMFwxXHUwMTQ5XDEyXHUwMTIzXDFcMFw1M1x1MDEyMyIrCi0gICAgIlwxXDBcMVx1MDE5YVwxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMTlhXDFcdTAxNDlcMzJcdTAxMjQiKwotICAgICJcMVx1MDE5YVwyXHUwMTI0XDFcdTAxOWFcMlx1MDEyNFwxXHUwMTlhXDEwXHUwMTI0XDFcdTAxOWFcM1x1MDEyNCIrCi0gICAgIlwxXHUwMTlhXDVcdTAxMjRcMVwwXDJcdTAxMjRcMVx1MDE0ZFwxXHUwMTQ5XDFcdTAxMjRcMVx1MDE3NCIrCi0gICAgIlwxXHUwMTI0XDFcdTAxNDlcMVx1MDE3NFwxXHUwMTliXDRcdTAxMjRcMlx1MDE0OVw1M1x1MDEyNFwxXDAiKwotICAgICJcMlx1MDEyNFwxXHUwMTRkXDFcMFwzXHUwMTI0XDFcdTAxNDlcN1x1MDEyNFwxXDBcNTNcdTAxMjQiKwotICAgICJcMVwwXDJcNjBcMVwyMDdcMVw2MFwxXDBcMlw2MFwxXDBcMVw2MCIrCi0gICAgIlwxXDBcMVw2MFwzXDBcMlw2MFwyXDBcM1w2MFwxXDBcMVw2MCIrCi0gICAgIlwxM1wwXDExXDYwXDFcMFw0XDYwXDFcMFwzXDYwXDFcMFwzXDYwIisKLSAgICAiXDRcMFwyXDY0XDFcMjEyXDFcNjRcMVwwXDJcNjRcMVwwXDFcNjQiKwotICAgICJcMVwwXDFcNjRcM1wwXDJcNjRcMlwwXDNcNjRcMVwwXDFcNjQiKwotICAgICJcMTNcMFwxMVw2NFwxXDBcNFw2NFwxXDBcM1w2NFwxXDBcM1w2NCIrCi0gICAgIlw0XDBcMlw3MVwxXDIxNVwxXDcxXDFcMFwyXDcxXDFcMFwxXDcxIisKLSAgICAiXDFcMFwxXDcxXDNcMFwyXDcxXDJcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDEzXDBcMTFcNzFcMVwwXDRcNzFcMVwwXDNcNzFcMVwwXDNcNzEiKwotICAgICJcNFwwXDJcMTAxXDFcMjIxXDFcMTAxXDFcMFwyXDEwMVwxXDBcMVwxMDEiKwotICAgICJcMVwwXDFcMTAxXDNcMFwyXDEwMVwyXDBcM1wxMDFcMVwwXDFcMTAxIisKLSAgICAiXDEzXDBcMTFcMTAxXDFcMFw0XDEwMVwxXDBcM1wxMDFcMVwwXDNcMTAxIisKLSAgICAiXDRcMFwyXDEwN1wxXDIyNFwxXDEwN1wxXDBcMlwxMDdcMVwwXDFcMTA3IisKLSAgICAiXDFcMFwxXDEwN1wzXDBcMlwxMDdcMlwwXDNcMTA3XDFcMFwxXDEwNyIrCi0gICAgIlwxM1wwXDExXDEwN1wxXDBcNFwxMDdcMVwwXDNcMTA3XDFcMFwzXDEwNyIrCi0gICAgIlw0XDBcMVx1MDE5Y1wxXDIyNlwxXDIyN1wxXDIyNlwxXDIzMFwxXDIyNlwxXHUwMTljIisKLSAgICAiXDMzXDIyNlwxXHUwMTljXDJcMjI2XDFcdTAxOWNcMlwyMjZcMVx1MDE5Y1wxMFwyMjZcMVx1MDE5YyIrCi0gICAgIlwzXDIyNlwxXHUwMTljXDVcMjI2XDFcMFwxXHUwMTlkXDFcMjMxXDFcMjMyXDNcMjMxIisKLSAgICAiXDFcdTAxOWRcMVwyMzBcMzJcMjMxXDFcdTAxOWRcMlwyMzFcMVx1MDE5ZFwyXDIzMVwxXHUwMTlkIisKLSAgICAiXDEwXDIzMVwxXHUwMTlkXDNcMjMxXDFcdTAxOWRcNVwyMzFcMVwwXDJcMTE0XDFcMjM0IisKLSAgICAiXDFcMTE0XDFcMFwyXDExNFwxXDBcMVwxMTRcMVwwXDFcMTE0XDNcMCIrCi0gICAgIlwyXDExNFwyXDBcM1wxMTRcMVwwXDFcMTE0XDEzXDBcMTFcMTE0XDFcMCIrCi0gICAgIlw0XDExNFwxXDBcM1wxMTRcMVwwXDNcMTE0XDRcMFwxXHUwMTllXDFcMjM3IisKLSAgICAiXDFcMjQwXDFcMjM3XDFcMFwxXDIzN1wxXHUwMTllXDFcMFwxXDIzN1wxXDAiKwotICAgICJcMVwyMzdcM1wwXDJcMjM3XDJcMFwzXDIzN1wxXDBcMVwyMzdcMTNcMCIrCi0gICAgIlwxXHUwMTllXDJcMjM3XDFcdTAxOWVcMlwyMzdcMVx1MDE5ZVwyXDIzN1wxXDBcNFwyMzciKwotICAgICJcMVwwXDFcdTAxOWVcMlwyMzdcMVwwXDFcdTAxOWVcMlwyMzdcNFwwXDJcMTIyIisKLSAgICAiXDFcMjQzXDFcMTIyXDFcMFwyXDEyMlwxXDBcMVwxMjJcMVwwXDFcMTIyIisKLSAgICAiXDNcMFwyXDEyMlwyXDBcM1wxMjJcMVwyNDRcMVwxMjJcMTNcMFwxMVwxMjIiKwotICAgICJcMVwwXDRcMTIyXDFcMFwzXDEyMlwxXDBcM1wxMjJcNFwwXDFcdTAxOWYiKwotICAgICJcMVwyNDZcMVwyNDdcMVwyNDZcMVwyNTBcMVwyNDZcMVx1MDE5ZlwzM1wyNDZcMVx1MDE5ZiIrCi0gICAgIlwyXDI0NlwxXHUwMTlmXDJcMjQ2XDFcdTAxOWZcMTBcMjQ2XDFcdTAxOWZcM1wyNDZcMVx1MDE5ZiIrCi0gICAgIlw1XDI0NlwxXDBcMVx1MDFhMFwxXDI1MVwxXDI1MlwzXDI1MVwxXHUwMWEwXDFcMjUwIisKLSAgICAiXDMyXDI1MVwxXHUwMWEwXDJcMjUxXDFcdTAxYTBcMlwyNTFcMVx1MDFhMFwxMFwyNTFcMVx1MDFhMCIrCi0gICAgIlwzXDI1MVwxXHUwMWEwXDVcMjUxXDFcMFwxXHUwMWExXDFcMjU2XDFcMjU3XDFcMjU2IisKLSAgICAiXDFcMFwxXDI1NlwxXHUwMWExXDFcMFwxXDI1NlwxXDBcMVwyNTZcM1wwIisKLSAgICAiXDJcMjU2XDJcMFwzXDI1NlwxXDBcMVwyNTZcMTNcMFwxXHUwMWExXDJcMjU2IisKLSAgICAiXDFcdTAxYTFcMlwyNTZcMVx1MDFhMVwyXDI1NlwxXDBcNFwyNTZcMVwwXDFcdTAxYTEiKwotICAgICJcMlwyNTZcMVwwXDFcdTAxYTFcMlwyNTZcNFwwXDFcdTAxYTJcNVwwXDFcdTAxYTIiKwotICAgICJcM1wwXDFcdTAxMGRcNVwwXDFcdTAxYTJcNVwwXDFcdTAxYTJcMTNcMFwyXHUwMWEyIisKLSAgICAiXDFcMFwyXHUwMWEyXDFcMFwyXHUwMWEyXDdcMFwyXHUwMWEyXDJcMFwyXHUwMWEyIisKLSAgICAiXDVcMFwxXHUwMWEzXDVcMFwxXHUwMWEzXDExXDBcMVx1MDFhM1w1XDBcMVx1MDFhMyIrCi0gICAgIlwxM1wwXDJcdTAxYTNcMVwwXDJcdTAxYTNcMVwwXDJcdTAxYTNcN1wwXDJcdTAxYTMiKwotICAgICJcMlwwXDJcdTAxYTNcNVwwXDFcdTAxYTRcMVx1MDEzNVwxXHUwMTM2XDFcdTAxMzVcMVwwIisKLSAgICAiXDFcdTAxMzVcMVx1MDFhNFwxXDBcMVx1MDEzNVwxXHUwMTNhXDEzXHUwMTM1XDFcMFwxNFx1MDEzNSIrCi0gICAgIlwxXHUwMWE0XDJcdTAxMzVcMVx1MDFhNFwyXHUwMTM1XDFcdTAxYTRcMTBcdTAxMzVcMVx1MDFhNFwzXHUwMTM1IisKLSAgICAiXDFcdTAxYTRcNVx1MDEzNVwxXDBcMVx1MDFhNVwxXHUwMTM4XDFcdTAxNjBcMVx1MDEzOFwxXHUwMTVkIisKLSAgICAiXDFcdTAxMzhcMVx1MDFhNVwzM1x1MDEzOFwxXHUwMWE1XDJcdTAxMzhcMVx1MDFhNVwyXHUwMTM4XDFcdTAxYTUiKwotICAgICJcMTBcdTAxMzhcMVx1MDFhNVwzXHUwMTM4XDFcdTAxYTVcNVx1MDEzOFwxXDBcMlx1MDEzOFwxXHUwMTYwIisKLSAgICAiXDJcdTAxNWRcMVx1MDE4N1wyXHUwMTM4XDFcdTAxODdcMVx1MDFhNlw0XHUwMTM4XDJcdTAxNWRcNTNcdTAxMzgiKwotICAgICJcMVwwXDJcdTAxMzhcMVx1MDE2MFwxXDBcMVx1MDE1ZFwxMlx1MDEzOFwxXDBcNTNcdTAxMzgiKwotICAgICJcMVwwXDFcdTAxYTdcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFhN1wxXHUwMTVkXDMyXHUwMTM5IisKLSAgICAiXDFcdTAxYTdcMlx1MDEzOVwxXHUwMWE3XDJcdTAxMzlcMVx1MDFhN1wxMFx1MDEzOVwxXHUwMWE3XDNcdTAxMzkiKwotICAgICJcMVx1MDFhN1w1XHUwMTM5XDFcMFwyXHUwMTM5XDFcdTAxNjFcMVx1MDE1ZFwxXHUwMTM5XDFcdTAxOGEiKwotICAgICJcMVx1MDEzOVwxXHUwMTVkXDFcdTAxOGFcMVx1MDFhOFw0XHUwMTM5XDJcdTAxNWRcNTNcdTAxMzlcMVwwIisKLSAgICAiXDJcdTAxMzlcMVx1MDE2MVwxXDBcM1x1MDEzOVwxXHUwMTVkXDdcdTAxMzlcMVwwXDUzXHUwMTM5IisKLSAgICAiXDQ2XDBcMlx1MDFhOVwyNVwwXDJcMTUyXDFcMTUzXDFcMTUyXDFcMFwyXDE1MiIrCi0gICAgIlwxXDBcMVwxNTJcMVwwXDFcMTUyXDNcMFwyXDE1MlwyXDBcM1wxNTIiKwotICAgICJcMVwwXDFcMTUyXDEzXDBcMTFcMTUyXDFcMFw0XDE1MlwxXDBcM1wxNTIiKwotICAgICJcMVwwXDNcMTUyXDRcMFwyXDE1NFwxXDE1NVwxXDE1NFwxXDBcMlwxNTQiKwotICAgICJcMVwwXDFcMTU0XDFcMFwxXDE1NFwzXDBcMlwxNTRcMlwwXDNcMTU0IisKLSAgICAiXDFcMFwxXDE1NFwxM1wwXDExXDE1NFwxXDBcNFwxNTRcMVwwXDNcMTU0IisKLSAgICAiXDFcMFwzXDE1NFw0NlwwXDJcdTAxYWFcMzBcMFwxXHUwMWFiXDFcMzY3XDFcMzcwIisKLSAgICAiXDFcMzY3XDFcMFwxXDM2N1wxXHUwMWFiXDFcMFwxXDM2N1wxXHUwMTFhXDFcMzY3IisKLSAgICAiXDNcMFwyXDM2N1wyXDBcM1wzNjdcMVwwXDFcMzY3XDEzXDBcMVx1MDFhYiIrCi0gICAgIlwyXDM2N1wxXHUwMWFiXDJcMzY3XDFcdTAxYWJcMlwzNjdcMVwwXDRcMzY3XDFcMCIrCi0gICAgIlwxXHUwMWFiXDJcMzY3XDFcMFwxXHUwMWFiXDJcMzY3XDRcMFwyXDE3MVwxXDE3MiIrCi0gICAgIlwxXDE3MVwxXDBcMlwxNzFcMVwwXDFcMTcxXDFcMFwxXDE3MVwzXDAiKwotICAgICJcMlwxNzFcMlwwXDNcMTcxXDFcMzA0XDFcMTcxXDEzXDBcMTFcMTcxXDFcMCIrCi0gICAgIlw0XDE3MVwxXDBcM1wxNzFcMVwwXDNcMTcxXDRcMFwyXDE3M1wxXDE3NCIrCi0gICAgIlwxXDE3M1wxXDE3NVw2NlwxNzNcMVwwXDJcMTc2XDFcMTc3XDRcMTc2XDFcMTc1IisKLSAgICAiXDYzXDE3NlwxXDBcMlwyMDFcMVwyMDJcMVwyMDFcMVwyMDNcNjZcMjAxXDFcMCIrCi0gICAgIlwyXDIwNFwxXDIwNVw0XDIwNFwxXDIwM1w2M1wyMDRcMVwwXDFcdTAxYWNcMVx1MDEyMSIrCi0gICAgIlwxXHUwMTIyXDFcdTAxMjFcMVwwXDFcdTAxMjFcMVx1MDFhY1wxXDBcMVx1MDEyMVwxXHUwMTI1IisKLSAgICAiXDEzXHUwMTIxXDFcMFwxNFx1MDEyMVwxXHUwMWFjXDJcdTAxMjFcMVx1MDFhY1wyXHUwMTIxXDFcdTAxYWMiKwotICAgICJcMTBcdTAxMjFcMVx1MDFhY1wzXHUwMTIxXDFcdTAxYWNcNVx1MDEyMVwxXDBcMVx1MDFhZFwxXHUwMTIzIisKLSAgICAiXDFcdTAxNGNcMVx1MDEyM1wxXHUwMTQ5XDFcdTAxMjNcMVx1MDFhZFwzM1x1MDEyM1wxXHUwMWFkXDJcdTAxMjMiKwotICAgICJcMVx1MDFhZFwyXHUwMTIzXDFcdTAxYWRcMTBcdTAxMjNcMVx1MDFhZFwzXHUwMTIzXDFcdTAxYWRcNVx1MDEyMyIrCi0gICAgIlwxXDBcMVx1MDFhZVwxXHUwMTI0XDFcdTAxNGRcM1x1MDEyNFwxXHUwMWFlXDFcdTAxNDlcMzJcdTAxMjQiKwotICAgICJcMVx1MDFhZVwyXHUwMTI0XDFcdTAxYWVcMlx1MDEyNFwxXHUwMWFlXDEwXHUwMTI0XDFcdTAxYWVcM1x1MDEyNCIrCi0gICAgIlwxXHUwMWFlXDVcdTAxMjRcMVwwXDJcMjI2XDFcMjI3XDFcMjI2XDFcMjMwXDY2XDIyNiIrCi0gICAgIlwxXDBcMlwyMzFcMVwyMzJcNFwyMzFcMVwyMzBcNjNcMjMxXDFcMFwyXDIzNyIrCi0gICAgIlwxXDI0MFwxXDIzN1wxXDBcMlwyMzdcMVwwXDFcMjM3XDFcMFwxXDIzNyIrCi0gICAgIlwzXDBcMlwyMzdcMlwwXDNcMjM3XDFcMFwxXDIzN1wxM1wwXDExXDIzNyIrCi0gICAgIlwxXDBcNFwyMzdcMVwwXDNcMjM3XDFcMFwzXDIzN1w0XDBcMlwyNDYiKwotICAgICJcMVwyNDdcMVwyNDZcMVwyNTBcNjZcMjQ2XDFcMFwyXDI1MVwxXDI1Mlw0XDI1MSIrCi0gICAgIlwxXDI1MFw2M1wyNTFcMVwwXDJcMjU2XDFcMjU3XDFcMjU2XDFcMFwyXDI1NiIrCi0gICAgIlwxXDBcMVwyNTZcMVwwXDFcMjU2XDNcMFwyXDI1NlwyXDBcM1wyNTYiKwotICAgICJcMVwwXDFcMjU2XDEzXDBcMTFcMjU2XDFcMFw0XDI1NlwxXDBcM1wyNTYiKwotICAgICJcMVwwXDNcMjU2XDE2XDBcMVx1MDEwZFw2MVwwXDFcdTAxYWZcNVwwXDFcdTAxYWYiKwotICAgICJcMTFcMFwxXHUwMWFmXDVcMFwxXHUwMWFmXDEzXDBcMlx1MDFhZlwxXDBcMlx1MDFhZiIrCi0gICAgIlwxXDBcMlx1MDFhZlw3XDBcMlx1MDFhZlwyXDBcMlx1MDFhZlw1XDBcMVx1MDFiMCIrCi0gICAgIlwxXHUwMTM1XDFcdTAxMzZcMVx1MDEzNVwxXDBcMVx1MDEzNVwxXHUwMWIwXDFcMFwxXHUwMTM1IisKLSAgICAiXDFcdTAxM2FcMTNcdTAxMzVcMVwwXDE0XHUwMTM1XDFcdTAxYjBcMlx1MDEzNVwxXHUwMWIwXDJcdTAxMzUiKwotICAgICJcMVx1MDFiMFwxMFx1MDEzNVwxXHUwMWIwXDNcdTAxMzVcMVx1MDFiMFw1XHUwMTM1XDFcMFwxXHUwMWIxIisKLSAgICAiXDFcdTAxMzhcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWRcMVx1MDEzOFwxXHUwMWIxXDMzXHUwMTM4XDFcdTAxYjEiKwotICAgICJcMlx1MDEzOFwxXHUwMWIxXDJcdTAxMzhcMVx1MDFiMVwxMFx1MDEzOFwxXHUwMWIxXDNcdTAxMzhcMVx1MDFiMSIrCi0gICAgIlw1XHUwMTM4XDFcMFwxXHUwMWIyXDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxYjJcMVx1MDE1ZCIrCi0gICAgIlwzMlx1MDEzOVwxXHUwMWIyXDJcdTAxMzlcMVx1MDFiMlwyXHUwMTM5XDFcdTAxYjJcMTBcdTAxMzlcMVx1MDFiMiIrCi0gICAgIlwzXHUwMTM5XDFcdTAxYjJcNVx1MDEzOVw3MFwwXDFcdTAxYjNcNTRcMFwyXHUwMWI0XDIyXDAiKwotICAgICJcMVx1MDFiNVwxXDM2N1wxXDM3MFwxXDM2N1wxXDBcMVwzNjdcMVx1MDFiNVwxXDAiKwotICAgICJcMVwzNjdcMVx1MDExYVwxXDM2N1wzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMCIrCi0gICAgIlwxXDM2N1wxM1wwXDFcdTAxYjVcMlwzNjdcMVx1MDFiNVwyXDM2N1wxXHUwMWI1XDJcMzY3IisKLSAgICAiXDFcMFw0XDM2N1wxXDBcMVx1MDFiNVwyXDM2N1wxXDBcMVx1MDFiNVwyXDM2NyIrCi0gICAgIlw0XDBcMVx1MDFiNlwxXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDBcMVx1MDEyMVwxXHUwMWI2IisKLSAgICAiXDFcMFwxXHUwMTIxXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDE0XHUwMTIxXDFcdTAxYjZcMlx1MDEyMSIrCi0gICAgIlwxXHUwMWI2XDJcdTAxMjFcMVx1MDFiNlwxMFx1MDEyMVwxXHUwMWI2XDNcdTAxMjFcMVx1MDFiNlw1XHUwMTIxIisKLSAgICAiXDFcMFwxXHUwMWI3XDFcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDlcMVx1MDEyM1wxXHUwMWI3IisKLSAgICAiXDMzXHUwMTIzXDFcdTAxYjdcMlx1MDEyM1wxXHUwMWI3XDJcdTAxMjNcMVx1MDFiN1wxMFx1MDEyM1wxXHUwMWI3IisKLSAgICAiXDNcdTAxMjNcMVx1MDFiN1w1XHUwMTIzXDFcMFwxXHUwMWI4XDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0IisKLSAgICAiXDFcdTAxYjhcMVx1MDE0OVwzMlx1MDEyNFwxXHUwMWI4XDJcdTAxMjRcMVx1MDFiOFwyXHUwMTI0XDFcdTAxYjgiKwotICAgICJcMTBcdTAxMjRcMVx1MDFiOFwzXHUwMTI0XDFcdTAxYjhcNVx1MDEyNFwxXDBcMVx1MDFiOVw1XDAiKwotICAgICJcMVx1MDFiOVwxMVwwXDFcdTAxYjlcNVwwXDFcdTAxYjlcMTNcMFwyXHUwMWI5XDFcMCIrCi0gICAgIlwyXHUwMWI5XDFcMFwyXHUwMWI5XDdcMFwyXHUwMWI5XDJcMFwyXHUwMWI5XDVcMCIrCi0gICAgIlwxXHUwMWJhXDFcdTAxMzVcMVx1MDEzNlwxXHUwMTM1XDFcMFwxXHUwMTM1XDFcdTAxYmFcMVwwIisKLSAgICAiXDFcdTAxMzVcMVx1MDEzYVwxM1x1MDEzNVwxXDBcMTRcdTAxMzVcMVx1MDFiYVwyXHUwMTM1XDFcdTAxYmEiKwotICAgICJcMlx1MDEzNVwxXHUwMWJhXDEwXHUwMTM1XDFcdTAxYmFcM1x1MDEzNVwxXHUwMWJhXDVcdTAxMzVcMVwwIisKLSAgICAiXDFcdTAxYmJcMVx1MDEzOFwxXHUwMTYwXDFcdTAxMzhcMVx1MDE1ZFwxXHUwMTM4XDFcdTAxYmJcMzNcdTAxMzgiKwotICAgICJcMVx1MDFiYlwyXHUwMTM4XDFcdTAxYmJcMlx1MDEzOFwxXHUwMWJiXDEwXHUwMTM4XDFcdTAxYmJcM1x1MDEzOCIrCi0gICAgIlwxXHUwMWJiXDVcdTAxMzhcMVwwXDFcdTAxYmNcMVx1MDEzOVwxXHUwMTYxXDNcdTAxMzlcMVx1MDFiYyIrCi0gICAgIlwxXHUwMTVkXDMyXHUwMTM5XDFcdTAxYmNcMlx1MDEzOVwxXHUwMWJjXDJcdTAxMzlcMVx1MDFiY1wxMFx1MDEzOSIrCi0gICAgIlwxXHUwMWJjXDNcdTAxMzlcMVx1MDFiY1w1XHUwMTM5XDUzXDBcMVx1MDFiZFwyMVwwXDJcMzY3IisKLSAgICAiXDFcMzcwXDFcMzY3XDFcMFwyXDM2N1wxXDBcMVwzNjdcMVx1MDExYVwxXDM2NyIrCi0gICAgIlwzXDBcMlwzNjdcMlwwXDNcMzY3XDFcMFwxXDM2N1wxM1wwXDExXDM2NyIrCi0gICAgIlwxXDBcNFwzNjdcMVwwXDNcMzY3XDFcMFwzXDM2N1w0XDBcMVx1MDFiZSIrCi0gICAgIlwxXHUwMTIxXDFcdTAxMjJcMVx1MDEyMVwxXDBcMVx1MDEyMVwxXHUwMWJlXDFcMFwxXHUwMTIxIisKLSAgICAiXDFcdTAxMjVcMTNcdTAxMjFcMVwwXDE0XHUwMTIxXDFcdTAxYmVcMlx1MDEyMVwxXHUwMWJlXDJcdTAxMjEiKwotICAgICJcMVx1MDFiZVwxMFx1MDEyMVwxXHUwMWJlXDNcdTAxMjFcMVx1MDFiZVw1XHUwMTIxXDFcMFwxXHUwMWJmIisKLSAgICAiXDFcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDlcMVx1MDEyM1wxXHUwMWJmXDMzXHUwMTIzXDFcdTAxYmYiKwotICAgICJcMlx1MDEyM1wxXHUwMWJmXDJcdTAxMjNcMVx1MDFiZlwxMFx1MDEyM1wxXHUwMWJmXDNcdTAxMjNcMVx1MDFiZiIrCi0gICAgIlw1XHUwMTIzXDFcMFwxXHUwMWMwXDFcdTAxMjRcMVx1MDE0ZFwzXHUwMTI0XDFcdTAxYzBcMVx1MDE0OSIrCi0gICAgIlwzMlx1MDEyNFwxXHUwMWMwXDJcdTAxMjRcMVx1MDFjMFwyXHUwMTI0XDFcdTAxYzBcMTBcdTAxMjRcMVx1MDFjMCIrCi0gICAgIlwzXHUwMTI0XDFcdTAxYzBcNVx1MDEyNFwxXDBcMVx1MDFjMVwxXHUwMTM1XDFcdTAxMzZcMVx1MDEzNSIrCi0gICAgIlwxXDBcMVx1MDEzNVwxXHUwMWMxXDFcMFwxXHUwMTM1XDFcdTAxM2FcMTNcdTAxMzVcMVwwIisKLSAgICAiXDE0XHUwMTM1XDFcdTAxYzFcMlx1MDEzNVwxXHUwMWMxXDJcdTAxMzVcMVx1MDFjMVwxMFx1MDEzNVwxXHUwMWMxIisKLSAgICAiXDNcdTAxMzVcMVx1MDFjMVw1XHUwMTM1XDFcMFwxXHUwMWMyXDFcdTAxMzhcMVx1MDE2MFwxXHUwMTM4IisKLSAgICAiXDFcdTAxNWRcMVx1MDEzOFwxXHUwMWMyXDMzXHUwMTM4XDFcdTAxYzJcMlx1MDEzOFwxXHUwMWMyXDJcdTAxMzgiKwotICAgICJcMVx1MDFjMlwxMFx1MDEzOFwxXHUwMWMyXDNcdTAxMzhcMVx1MDFjMlw1XHUwMTM4XDFcMFwxXHUwMWMzIisKLSAgICAiXDFcdTAxMzlcMVx1MDE2MVwzXHUwMTM5XDFcdTAxYzNcMVx1MDE1ZFwzMlx1MDEzOVwxXHUwMWMzXDJcdTAxMzkiKwotICAgICJcMVx1MDFjM1wyXHUwMTM5XDFcdTAxYzNcMTBcdTAxMzlcMVx1MDFjM1wzXHUwMTM5XDFcdTAxYzNcNVx1MDEzOSIrCi0gICAgIlwxXDBcMlx1MDEyMVwxXHUwMTIyXDFcdTAxMjFcMVwwXDJcdTAxMjFcMVwwXDFcdTAxMjEiKwotICAgICJcMVx1MDEyNVwxM1x1MDEyMVwxXDBcNDVcdTAxMjFcMVwwXDFcdTAxYzRcMVx1MDEyM1wxXHUwMTRjIisKLSAgICAiXDFcdTAxMjNcMVx1MDE0OVwxXHUwMTIzXDFcdTAxYzRcMzNcdTAxMjNcMVx1MDFjNFwyXHUwMTIzXDFcdTAxYzQiKwotICAgICJcMlx1MDEyM1wxXHUwMWM0XDEwXHUwMTIzXDFcdTAxYzRcM1x1MDEyM1wxXHUwMWM0XDVcdTAxMjNcMVwwIisKLSAgICAiXDFcdTAxYzVcMVx1MDEyNFwxXHUwMTRkXDNcdTAxMjRcMVx1MDFjNVwxXHUwMTQ5XDMyXHUwMTI0XDFcdTAxYzUiKwotICAgICJcMlx1MDEyNFwxXHUwMWM1XDJcdTAxMjRcMVx1MDFjNVwxMFx1MDEyNFwxXHUwMWM1XDNcdTAxMjRcMVx1MDFjNSIrCi0gICAgIlw1XHUwMTI0XDFcMFwyXHUwMTM1XDFcdTAxMzZcMVx1MDEzNVwxXDBcMlx1MDEzNVwxXDAiKwotICAgICJcMVx1MDEzNVwxXHUwMTNhXDEzXHUwMTM1XDFcMFw0NVx1MDEzNVwxXDBcMVx1MDFjNlwxXHUwMTM4IisKLSAgICAiXDFcdTAxNjBcMVx1MDEzOFwxXHUwMTVkXDFcdTAxMzhcMVx1MDFjNlwzM1x1MDEzOFwxXHUwMWM2XDJcdTAxMzgiKwotICAgICJcMVx1MDFjNlwyXHUwMTM4XDFcdTAxYzZcMTBcdTAxMzhcMVx1MDFjNlwzXHUwMTM4XDFcdTAxYzZcNVx1MDEzOCIrCi0gICAgIlwxXDBcMVx1MDFjN1wxXHUwMTM5XDFcdTAxNjFcM1x1MDEzOVwxXHUwMWM3XDFcdTAxNWRcMzJcdTAxMzkiKwotICAgICJcMVx1MDFjN1wyXHUwMTM5XDFcdTAxYzdcMlx1MDEzOVwxXHUwMWM3XDEwXHUwMTM5XDFcdTAxYzdcM1x1MDEzOSIrCi0gICAgIlwxXHUwMWM3XDVcdTAxMzlcMVwwXDJcdTAxMjNcMVx1MDE0Y1wxXHUwMTIzXDFcdTAxNDlcNjZcdTAxMjMiKwotICAgICJcMVwwXDJcdTAxMjRcMVx1MDE0ZFw0XHUwMTI0XDFcdTAxNDlcNjNcdTAxMjRcMVwwXDJcdTAxMzgiKwotICAgICJcMVx1MDE2MFwxXHUwMTM4XDFcdTAxNWRcNjZcdTAxMzhcMVwwXDJcdTAxMzlcMVx1MDE2MVw0XHUwMTM5IisKLSAgICAiXDFcdTAxNWRcNjNcdTAxMzkiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1RyYW5zKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzIyMjYwXTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1RyYW5zKFpaX1RSQU5TX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1RyYW5zKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9OT19NQVRDSCA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BVFRSSUJVVEVfUEFDS0VEXzAgPQotICAgICJcMzBcMFwxXDExXDEwXDFcMVwxMVwyXDFcMVwxMVwxXDFcMVwxMSIrCi0gICAgIlw0XDFcMVwxMVw2XDFcMVwxMVwzXDFcMlwxMVwzXDFcMVwxMSIrCi0gICAgIlwxXDFcMVwzXDJcMTFcM1wxXDFcMTFcMVwxXDFcMTFcMTBcMSIrCi0gICAgIlwyXDExXDVcMVwxXDExXDdcMVwxXDExXDFcM1wzXDFcM1wxMSIrCi0gICAgIlwxXDFcMVwwXDNcMVwxXDBcMVwxXDJcMFwxXDFcMlwwIisKLSAgICAiXDFcMTFcNlwwXDFcMVwzXDBcMVwxMVw1XDBcMVwxMVw0XDAiKwotICAgICJcMlwxXDFcMFwyXDFcMVwwXDJcMVwxXDE1XDFcMFwyXDEiKwotICAgICJcMVwwXDFcMVwyXDBcMVwxMVwyXDBcMVwxXDFcMFwzXDEiKwotICAgICJcMlwwXDFcMTFcMVwwXDFcMTFcMVwxXDJcMFwxXDExXDJcMCIrCi0gICAgIlw0XDFcMlwwXDFcMVwyXDBcMVwxNVwxXDFcMVwwXDFcMTEiKwotICAgICJcMVwwXDFcMVwxXDExXDJcMVwxMFwwXDFcMVwxXDBcMVwxIisKLSAgICAiXDJcMFwxXDFcMlwwXDFcMVwyXDBcMVwxXDJcMFw1XDEiKwotICAgICJcMVwwXDFcMVwyXDBcMVwxXDFcMFwzXDFcMVwwXDFcMSIrCi0gICAgIlwyXDBcMVwxXDFcMFwzXDFcM1wwXDNcMVwxXDExXDVcMCIrCi0gICAgIlwxXDExXDJcMFwxXDFcNVwwXDVcMVwyXDBcM1wxXDJcMCIrCi0gICAgIlwyXDFcMVwwXDFcMVwxXDBcMVwxMVwzXDFcM1wwXDFcMTEiKwotICAgICJcMlwwXDFcMTFcMVwwXDFcMVwxMFwwXDFcMTFcNVwxXDJcMCIrCi0gICAgIlwzXDFcMlwwXDNcMVw1XDBcMVwxMVwxXDBcM1wxXDJcMCIrCi0gICAgIlwxXDExXDJcMFwxXDFcNlwwXDFcMVwyXDBcNVwxXDJcMCIrCi0gICAgIlwzXDFcMlwwXDNcMVwyXDBcMVwxXDNcMFwzXDFcMVwwIisKLSAgICAiXDFcMTFcMlwwXDFcMVwxM1wwXDVcMVwyXDBcM1wxXDJcMCIrCi0gICAgIlwzXDFcMTBcMFwyXDFcMVwxMVwyXDBcMVwxXDZcMFwxXDEiKwotICAgICJcMVwwXDFcMVwyXDBcMVwxXDJcMFwzXDFcMlwwXDFcMSIrCi0gICAgIlwxXDBcMVwxXDZcMFwxXDFcNFwwXDFcMTFcNFwwXDFcMTEiKwotICAgICJcM1wwXDFcMTFcMTJcMCI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQXR0cmlidXRlKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzQ1NV07Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIC8vcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0KLSAgLyoqIAotICAgKiB6ekF0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgLy9wcml2YXRlIGJvb2xlYW4genpBdEJPTCA9IHRydWU7Ci0KLSAgLyoqIHp6QXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgYXQgdGhlIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4genpBdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0OwotLy8JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkVGV4dExlbmd0aDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7Ci0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU1RleHRSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX1NNQUxMID0gMjU2OwotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsKLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTdGF0ZShpbnQgc3RhdGUpIHsKLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgewotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQ7Ci0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOwotCQlib29sZWFuIHNwYWNlRm9sbG93czsKLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsKLQkJaW50IHN0YXJ0OwotCQlpbnQgdGV4dExlbmd0aDsKLQkJaW50IGxlbmd0aDsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfU0NSSVBUTEVUIHx8IGNvbnRleHQgPT0gQ1NTX0pTUF9FTCl7Ci0JCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0VORCAmJiBuZXh0VG9rZW5UeXBlICE9IENTU19FTF9FTkQgJiYgbmV4dFRva2VuVHlwZSAhPSBDU1NfSlNQX0NPTU1FTlQpIHsKLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJCQkJaWYgKGNvbnRleHQuZXF1YWxzKENTU19KU1BfU0NSSVBUTEVUKSAmJiAoeXlzdGF0ZSgpID09IFNUX0pTUF9ESVJFQ1RJVkUgfHwgeXlzdGF0ZSgpID09IFNUX0pTUF9FWFAgfHwgeXlzdGF0ZSgpID09IFNUX0pTUF9ERUNMQVJBVElPTikpewotCQkJCQkJY29udGV4dCA9IG5leHRUb2tlblR5cGU7Ci0JCQkJCX0KLQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQlpZiAobmV4dFRva2VuVHlwZSA9PSBudWxsKXsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfU0NSSVBUTEVUKXsKLQkJCQkJd2hpbGUgKG5leHRUb2tlblR5cGUgIT0gQ1NTX0pTUF9DT01NRU5UX0VORCkgewotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7Ci0JCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQkJaWYgKGNvbnRleHQuZXF1YWxzKENTU19KU1BfU0NSSVBUTEVUKSAmJiB5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpewotCQkJCQkJCWNvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotCQkJCQkJfQotCi0JCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQkJaWYgKG5leHRUb2tlblR5cGUgPT0gbnVsbCl7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCi0JCQkJCWlmIChjb250ZXh0ID09IENTU19KU1BfQ09NTUVOVCl7Ci0JCQkJCQljb250ZXh0ID0gQ1NTX0NPTU1FTlQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCWxlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCQkJCi0JCQl9Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQkvLyB1bmRlZiAtPiBjb25jYXRlbmF0ZSB1bmRlZidzCi0JCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl3aGlsZSAobmV4dFRva2VuVHlwZSA9PSBVTkRFRklORUQpIHsKLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCXRleHRMZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQkJbGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQl9Ci0JCQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG5leHRUb2tlblR5cGU7Ci0vLwkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbmV4dFRva2VuVHlwZSA9IG51bGw7Ci0JCQkJc3BhY2VGb2xsb3dzID0gZmFsc2U7Ci0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblZhbHVlVHlwZShjb250ZXh0KSkgeyAvLyBkZWNsYXJhdGlvbiB2YWx1ZSBjYW4gY29udGFpbiBWQUxVRV9TCi0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19ERUNMQVJBVElPTl9WQUxVRV9TKTsKLQkJCQl9IGVsc2UgaWYgKGNhbkNvbnRhaW5TcGFjZShjb250ZXh0KSkgewotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQlzcGFjZUZvbGxvd3MgPSAobmV4dFRva2VuVHlwZSA9PSBDU1NfUyk7Ci0JCQkJfQotCQkJCWlmIChuZXh0VG9rZW5UeXBlICE9IG51bGwpIHsgLy8gbmV4dFRva2VuIGlzIHJldHJpZXZlZAotCQkJCQlpZiAoc3BhY2VGb2xsb3dzKSB7Ci0JCQkJCQkvLyBuZXh0IGlzIHNwYWNlIC0+IGFwcGVuZAotLy8JCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCQlsZW5ndGggKz0geXlsZW5ndGgoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5leHQgaXMgTk9UIHNwYWNlIC0+IHB1c2ggdGhpcyBmb3IgbmV4dCB0aW1lLCByZXR1cm4gaXRzZWxmCi0JCQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJCQkJZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JCQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7Ci0JCQkJY29udGV4dCA9IENTU19VTktOT1dOOwotCQkJfQotCQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCS8qIGZvciBzdGFuZGFsb25lIHVzZSAqLwotICAJcHVibGljIGZpbmFsIExpc3QgcGFyc2VUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAJCUNTU1RleHRUb2tlbiB0b2tlbjsKLQkJZm9yIChTdHJpbmcga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKTsga2luZCAhPSBudWxsOyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpKSB7Ci0JCQl0b2tlbiA9IG5ldyBDU1NUZXh0VG9rZW4oKTsKLQkJCXRva2VuLmtpbmQgPSBraW5kOyAgCQkJCQotCQkJdG9rZW4uc3RhcnQgPSB5eWNoYXI7Ci0JCQl0b2tlbi5sZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJdG9rZW4uaW1hZ2UgPSB5eXRleHQoKTsKLQkJCXRva2Vucy5hZGQodG9rZW4pOwotCQl9Ci0KLSAgCQlyZXR1cm4gdG9rZW5zOwotICAJfQotICAJCi0gIAkvKiB1c2VyIG1ldGhvZCAqLwotICAJcHJpdmF0ZSBib29sZWFuIGNhbkNvbnRhaW5TcGFjZShTdHJpbmcgdHlwZSkgewotICAJCWlmICh0eXBlID09IENTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NfUkJSQUNFIHx8IHR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotICAJCQlyZXR1cm4gZmFsc2U7Ci0gIAkJfSBlbHNlIHsKLSAgCQkJcmV0dXJuIHRydWU7Ci0gIAkJfQotICAJfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHl5Y2hhcjsKLQl9Ci0JCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHp6QXRFT0Y7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCQl6elJlYWRlciA9IGluOwotCi0JCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JCXp6U3RhdGUgPSAwOwotCi0JCS8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXp6TGV4aWNhbFN0YXRlID0gZkluaXRpYWxTdGF0ZTsgLy9ZWUlOSVRJQUw7Ci0KLQkJLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJCXRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotCQlpZiAoenpCdWZmZXIubGVuZ3RoICE9IGZJbml0aWFsQnVmZmVyU2l6ZSkgewotCQkJenpCdWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOwotCQl9Ci0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLQkJLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXp6TWFya2VkUG9zID0gMDsKLQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJenpQdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl6ekN1cnJlbnRQb3MgPSAwOwotCi0JCS8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJenpTdGFydFJlYWQgPSAwOwotCi0JCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJCWZyb20gaW5wdXQgKi8KLQkJenpFbmRSZWFkID0gMDsKLQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5bGluZSA9IDA7Ci0KLQkJLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0JCS8qKgotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0JCSAqIG1hdGNoZWQgdGV4dAotCQkgKi8KLQkJLy95eWNvbHVtbiA9IDA7IAotCi0JCS8qKiAKLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0JCSAqLwotCQkvL3p6QXRCT0wgPSBmYWxzZTsKLQkJCi0JCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXp6QXRFT0YgPSBmYWxzZTsKLQotCQkvKiB1c2VyIHZhcmlhYmxlcyAqLwotCQkvLwkJZlVuZGVmaW5lZC5kZWxldGUoMCwgZlVuZGVmaW5lZC5sZW5ndGgoKSk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgSlNQZWRDU1NUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXByaXZhdGUgaW50IGZKU1BQcmV2aW91c1N0YXRlID0gZkluaXRpYWxTdGF0ZTsKLQlwcml2YXRlIHZvaWQgeXlKc3BCZWdpbihpbnQgbmV3c3RhdGUpewotCQlmSlNQUHJldmlvdXNTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJeXliZWdpbihuZXdzdGF0ZSk7Ci0JfQotCXByaXZhdGUgdm9pZCB5eUpzcEVuZCgpewotCQl5eWJlZ2luKGZKU1BQcmV2aW91c1N0YXRlKTsKLQl9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQZWRDU1NUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBKU1BlZENTU1Rva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHp6VW5wYWNrQ01hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxNzApIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elB1c2hiYWNrUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh6ekN1cnJlbnRQb3MgPj0genpCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt6ekN1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIubGVuZ3RoLXp6RW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHp6RW5kUmVhZCs9IG51bVJlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB6ekF0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh6elJlYWRlciAhPSBudWxsKQotICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKiBEb2VzIG5vdCBjbG9zZSB0aGUgb2xkIHJlYWRlci4KLSAgICoKLSAgICogQWxsIGludGVybmFsIHZhcmlhYmxlcyBhcmUgcmVzZXQsIHRoZSBvbGQgaW5wdXQgc3RyZWFtIAotICAgKiA8Yj5jYW5ub3Q8L2I+IGJlIHJldXNlZCAoaW50ZXJuYWwgYnVmZmVyIGlzIGRpc2NhcmRlZCBhbmQgbG9zdCkuCi0gICAqIExleGljYWwgc3RhdGUgaXMgc2V0IHRvIDx0dD5aWl9JTklUSUFMPC90dD4uCi0gICAqCi0gICAqIEBwYXJhbSByZWFkZXIgICB0aGUgbmV3IGlucHV0IHN0cmVhbSAKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0gICAvLyB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSAwOy8veXljb2x1bW4gPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwdWJsaWMgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHVibGljIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB6elNjYW5FcnJvcihaWl9QVVNIQkFDS18yQklHKTsKLQotICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLSAgICBpbnQgW10genpUcmFuc0wgPSBaWl9UUkFOUzsKLSAgICBpbnQgW10genpSb3dNYXBMID0gWlpfUk9XTUFQOwotICAgIGludCBbXSB6ekF0dHJMID0gWlpfQVRUUklCVVRFOwotICAgIGludCB6elB1c2hiYWNrUG9zTCA9IHp6UHVzaGJhY2tQb3MgPSAtMTsKLSAgICBib29sZWFuIHp6V2FzUHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0KLSAgICAgIHl5Y2hhcis9IHp6TWFya2VkUG9zTC16elN0YXJ0UmVhZDsKLQotICAgICAgYm9vbGVhbiB6elIgPSBmYWxzZTsKLSAgICAgIGZvciAoenpDdXJyZW50UG9zTCA9IHp6U3RhcnRSZWFkOyB6ekN1cnJlbnRQb3NMIDwgenpNYXJrZWRQb3NMOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvc0wrKykgewotICAgICAgICBzd2l0Y2ggKHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMXSkgewotICAgICAgICBjYXNlICdcdTAwMEInOgotICAgICAgICBjYXNlICdcdTAwMEMnOgotICAgICAgICBjYXNlICdcdTAwODUnOgotICAgICAgICBjYXNlICdcdTIwMjgnOgotICAgICAgICBjYXNlICdcdTIwMjknOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHp6UiA9IGZhbHNlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgenpSID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh6elIpCi0gICAgICAgICAgICB6elIgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB6elIgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoenpSKSB7Ci0gICAgICAgIC8vIHBlZWsgb25lIGNoYXJhY3RlciBhaGVhZCBpZiBpdCBpcyBcbiAoaWYgd2UgaGF2ZSBjb3VudGVkIG9uZSBsaW5lIHRvbyBtdWNoKQotICAgICAgICBib29sZWFuIHp6UGVlazsKLSAgICAgICAgaWYgKHp6TWFya2VkUG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgenpQZWVrID0genpCdWZmZXJMW3p6TWFya2VkUG9zTF0gPT0gJ1xuJzsKLSAgICAgICAgZWxzZSBpZiAoenpBdEVPRikKLSAgICAgICAgICB6elBlZWsgPSBmYWxzZTsKLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgIHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgenpNYXJrZWRQb3NMID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgenpCdWZmZXJMID0genpCdWZmZXI7Ci0gICAgICAgICAgaWYgKGVvZikgCi0gICAgICAgICAgICB6elBlZWsgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgICAgenpQZWVrID0genpCdWZmZXJMW3p6TWFya2VkUG9zTF0gPT0gJ1xuJzsKLSAgICAgICAgfQotICAgICAgICBpZiAoenpQZWVrKSB5eWxpbmUtLTsKLSAgICAgIH0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICB6elN0YXRlID0genpMZXhpY2FsU3RhdGU7Ci0KLSAgICAgIHp6V2FzUHVzaGJhY2sgPSBmYWxzZTsKLQotICAgICAgenpGb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoenpDdXJyZW50UG9zTCA8IHp6RW5kUmVhZEwpCi0gICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoenpBdEVPRikgewotICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3MgID0genpDdXJyZW50UG9zTDsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zICAgPSB6ek1hcmtlZFBvc0w7Ci0gICAgICAgICAgICB6elB1c2hiYWNrUG9zID0genpQdXNoYmFja1Bvc0w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICAvLyBnZXQgdHJhbnNsYXRlZCBwb3NpdGlvbnMgYW5kIHBvc3NpYmx5IG5ldyBidWZmZXIKLSAgICAgICAgICAgIHp6Q3VycmVudFBvc0wgID0genpDdXJyZW50UG9zOwotICAgICAgICAgICAgenpNYXJrZWRQb3NMICAgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCAgICAgID0genpCdWZmZXI7Ci0gICAgICAgICAgICB6ekVuZFJlYWRMICAgICA9IHp6RW5kUmVhZDsKLSAgICAgICAgICAgIHp6UHVzaGJhY2tQb3NMID0genpQdXNoYmFja1BvczsKLSAgICAgICAgICAgIGlmIChlb2YpIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IFlZRU9GOwotICAgICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB6eklucHV0ID0genpCdWZmZXJMW3p6Q3VycmVudFBvc0wrK107Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCB6ek5leHQgPSB6elRyYW5zTFsgenpSb3dNYXBMW3p6U3RhdGVdICsgenpDTWFwTFt6eklucHV0XSBdOwotICAgICAgICAgIGlmICh6ek5leHQgPT0gLTEpIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIHp6U3RhdGUgPSB6ek5leHQ7Ci0KLSAgICAgICAgICBpbnQgenpBdHRyaWJ1dGVzID0genpBdHRyTFt6elN0YXRlXTsKLSAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiAyKSA9PSAyICkKLSAgICAgICAgICAgIHp6UHVzaGJhY2tQb3NMID0genpDdXJyZW50UG9zTDsKLQotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6eldhc1B1c2hiYWNrID0gKHp6QXR0cmlidXRlcyAmIDQpID09IDQ7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLSAgICAgIGlmICh6eldhc1B1c2hiYWNrKQotICAgICAgICB6ek1hcmtlZFBvcyA9IHp6UHVzaGJhY2tQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT047Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDYzOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTogCi0gICAgICAgICAgeyByZXR1cm4gVU5ERUZJTkVEOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0lNUE9SVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NMQVNTOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNjk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzA6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDcxOiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzM6IGJyZWFrOwotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfRk9OVF9GQUNFX0RFTElNSVRFUik7IHJldHVybiBDU1NfRk9OVF9GQUNFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyB5eUpzcEVuZCgpOyByZXR1cm4gQ1NTX0VMX0VORDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7IHl5SnNwRW5kKCk7ICByZXR1cm4gQ1NTX0pTUF9FTkQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc3OiBicmVhazsKLSAgICAgICAgY2FzZSA1MzogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNzg6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDc5OiBicmVhazsKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0NEQzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODA6IGJyZWFrOwotICAgICAgICBjYXNlIDE0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODE6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfVU5JVkVSU0FMOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDgzOiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX0NETzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODQ6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODU6IGJyZWFrOwotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODY6IGJyZWFrOwotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg3OiBicmVhazsKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1BBR0VfUFNFVURPX1BBR0UpOyByZXR1cm4gQ1NTX1BBR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDg4OiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgODk6IGJyZWFrOwotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfQ0hBUlNFVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1NUUklORzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTA6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgICB7IHl5SnNwQmVnaW4oU1RfSlNQX0VMKTsgIHJldHVybiBDU1NfSlNQX0VMOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTM6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDk0OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTY6IGJyZWFrOwotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9QQUdFX0RFTElNSVRFUik7IHJldHVybiBDU1NfUEFHRV9TRUxFQ1RPUjsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA5OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICAgIHsgcmV0dXJuIENTU19DT01NRU5UOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTAyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9TRVBBUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzogCi0gICAgICAgICAgeyByZXR1cm4gQ1NTX1M7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICAgIHsgeXlKc3BFbmQoKTsgcmV0dXJuIENTU19KU1BfQ09NTUVOVF9FTkQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDEwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9KU1BfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0pTUF9ERUNMOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVESUFfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTEwOiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0pTUF9FWFApOyByZXR1cm4gQ1NTX0pTUF9FWFA7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTI6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTEzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7IHJldHVybiBDU1NfSlNQX0NPTU1FTlQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICAgIHsgeXlKc3BCZWdpbihTVF9KU1BfU0NSSVBUTEVUKTsgIHJldHVybiBDU1NfSlNQX1NDUklQVExFVDsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMTE2OiBicmVhazsKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgICAgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDExNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFKTsgcmV0dXJuIENTU19KU1BfRElSRUNUSVZFOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxMTg6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoenpJbnB1dCA9PSBZWUVPRiAmJiB6elN0YXJ0UmVhZCA9PSB6ekN1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHp6QXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHp6U2NhbkVycm9yKFpaX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9KU1BlZENTU1JlZ2lvbkNvbnRleHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0pTUGVkQ1NTUmVnaW9uQ29udGV4dHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxYjE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0pTUGVkQ1NTUmVnaW9uQ29udGV4dHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSlNQZWRDU1NSZWdpb25Db250ZXh0cyBleHRlbmRzIENTU1JlZ2lvbkNvbnRleHRzIHsJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9FWFAgPSAiQ1NTX0pTUF9FWFAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9FTCA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT1JFSUdOX0VMRU1FTlQ7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX1NDUklQVExFVCA9ICJDU1NfSlNQX1NDUklQVExFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0RJUkVDVElWRSA9ICJDU1NfSlNQX0RJUkVDVElWRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0RFQ0wgPSAiQ1NTX0pTUF9ERUNMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19KU1BfRU5EID0gIkNTU19KU1BfRU5EIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19FTF9FTkQgPSAiQ1NTX0VMX0VORCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSlNQX0NPTU1FTlRfRU5EID0gIkNTU19KU1BfQ09NTUVOVF9FTkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0pTUF9DT01NRU5UID0gIkNTU19KU1BfQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTRlMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS9qc3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL2pzdC8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMGMyNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotanNwZWRpdG9yLmphcgotdGVtcC5mb2xkZXIKLW9yZy5lY2xpcHNlLmpzdC5qc3AudWlfNi4wLjAuamFyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE3NGQ2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLmpzdC5qc3AudWkvZGVidWcvanNwY29udGVudGFzc2lzdD1mYWxzZQotb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wcm9qZWN0aW9ucGVyZj1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0MmU0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS5qc3QuanNwLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgQXVnIDE5IDE2OjMxOjQzIEVEVCAyMDA2DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDIxZGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuanNwLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2UuanN0LmpzcC51aSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmRlcml2ZWQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZm9ybWF0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5yZWdpc3RyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudmlld3MuY29udGVudG91dGxpbmUKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAwLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpkdC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZHQuZGVidWc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3Jpbmc7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmx0ay51aS5yZWZhY3RvcmluZztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLm1vZHVsZWNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjMzYWUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXNvdXJjZS4uID0gc3JjLwotYmluLmluY2x1ZGVzID0gLixcCi0gICAgICAgICAgICAgICB0ZW1wbGF0ZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIGljb25zLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2pzcF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdqc3Bfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZmOWIzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2pzcF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdqc3Bfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3anNwX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTQ0YWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdqc3Bfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2NsYXNzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDAxMThkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2NsYXNzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9kZWZhdWx0X2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2RlZmF1bHRfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWExNDYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2RlZmF1bHRfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfZGVmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfZGVmYXVsdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTI5ZDNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX2RlZmF1bHRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX3ByaXZhdGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX3ByaXZhdGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZlMDY0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcm90ZWN0ZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX3Byb3RlY3RlZF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc3YjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2ZpZWxkX3Byb3RlY3RlZF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHVibGljX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wdWJsaWNfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRjYjQyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wdWJsaWNfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfZGVmYXVsdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19kZWZhdWx0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyNDRhN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19kZWZhdWx0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3ByaXZhdGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJpdmF0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzkyZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJpdmF0ZV9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wcm90ZWN0ZWRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDU1NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wcm90ZWN0ZWRfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHVibGljX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmNsYXNzX3B1YmxpY19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGMyYTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHVibGljX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9kZWZhdWx0X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9kZWZhdWx0X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMWI1NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfZGVmYXVsdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHJpdmF0ZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHJpdmF0ZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWNiZmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3Byb3RlY3RlZF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHJvdGVjdGVkX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1OGVlZjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHJvdGVjdGVkX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9pbm5lcmludGVyZmFjZV9wdWJsaWNfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3B1YmxpY19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWJjNDZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3B1YmxpY19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWRjZTk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3BhY2thZ2Vfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxYzI4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wYWNrYWdlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wcml2YXRlX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3ByaXZhdGVfY28uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Yjg4MWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3ByaXZhdGVfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvdGVjdGVkX2NvLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkODNiOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvdGVjdGVkX2NvLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3B1YmxpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDI0NzA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3B1YmxpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWNfY28uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTlhZjVkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi9wdWJsaWNfY28uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmNTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctanNwLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDg0NjAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMWY4MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdqc3BmaWxlX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3anNwZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI1OTdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdqc3BmaWxlX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwZGVjbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwZGVjbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZjQ4ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGRlY2wuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcGV4cC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwZXhwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0ZDc0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwZXhwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BpbmNsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BpbmNsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU4NGMzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BzY3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzUzYjk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy9qc3BzY3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL2pzcHRhZ2xpYi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwdGFnbGliLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I1NWUzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvanNwdGFnbGliLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWdlbmVyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdmYjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9pY29ucy9zbmlwcGV0cy90YWctZ2VuZXJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWpzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvaWNvbnMvc25pcHBldHMvdGFnLWpzcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNGRlMzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL2ljb25zL3NuaXBwZXRzL3RhZy1qc3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTBkZTczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9U1NFIEpTUCBTb3VyY2UgRWRpdG9yCi1KU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9SlNQIEVkaXRvcgotQ1NTX0pTUF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1DU1MgSlNQIEVkaXRvcgotSlNQX0ZpbGVzLm5hbWU9SlNQIEZpbGVzCi1KU1BfU291cmNlLm5hbWU9SlNQIFNvdXJjZQotSlNQX1RlbXBsYXRlcy5uYW1lPUpTUCBUZW1wbGF0ZXMKLUpTUF9TdHlsZXMubmFtZT1KU1AgU3R5bGVzCi0KLSMgU25pcHBldHMgY29udHJpYnV0aW9ucyBmb3IgaGVscGluZyB3aXRoIEpTUCBzeW50YXgKLWpzcF9zY3JpcHRsZXQ9PCUuLiU+IHNjcmlwdGxldAotanNwX3Njcl9jb250ZW50PTwlICAlPgotanNwX2hpZGRlbl9jb21tZW50PTwlLS0uLi0tJT4gY29tbWVudAotanNwX2hpZGRlbl9jb21tZW50X2NvbnRlbnQ9PCUtLSAgLS0lPgotanNwX2RlY2xhcmF0aW9uPTwlIS4uJT4gZGVjbGFyYXRpb24KLWpzcF9kZWNsYXJhdGlvbl9jb250ZW50PTwlISAgJT4KLWpzcF9leHByZXNzaW9uPTwlPS4uJT4gZXhwcmVzc2lvbgotanNwX2V4cHJlc3Npb25fY29udGVudD08JT0gICU+Ci1qc3BfaW5jbHVkZV9kaXJlY3RpdmU9aW5jbHVkZSBkaXJlY3RpdmUKLWpzcF9pbmNsdWRlX2RpcmVjdGl2ZV9jb250ZW50PTwlQCBpbmNsdWRlIGZpbGU9IiIgJT4KLWpzcF9wYWdlX2RpcmVjdGl2ZT1wYWdlIGRpcmVjdGl2ZQotanNwX3BhZ2VfZGlyZWN0aXZlX2NvbnRlbnQ9PCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD0iICU+Ci1qc3BfdGFnbGliX2RpcmVjdGl2ZT10YWdsaWIgZGlyZWN0aXZlCi1qc3BfdGFnbGliX2RpcmVjdGl2ZV9jb250ZW50PTwlQCB0YWdsaWIgdXJpPSIke3VyaX0iIHByZWZpeD0iJHtwcmVmaXh9IiAlPgotanNwX3RhZ2xpYl9kaXJlY3RpdmVfdXJpPVVSSSB0byB0aGUgY29udGFpbmluZyBKQVIgZmlsZSBvciB0YWdsaWIgZGVzY3JpcHRvciAoLnRsZCkKLWpzcF90YWdsaWJfZGlyZWN0aXZlX3ByZWZpeD1OYW1lc3BhY2UgcHJlZml4IGZvciB0YWdzIGZyb20gdGhpcyBsaWJyYXJ5Ci1KU1BGcmFnbWVudENvbnRlbnRTZXR0aW5ncy5uYW1lPUpTUCBGcmFnbWVudAotY29tbWFuZC5qc3AucmVmYWN0b3IucmVuYW1lLm5hbWU9UmVuYW1lCi1jb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUuZGVzY3JpcHRpb249UmVuYW1lIGEgSmF2YSBFbGVtZW50Ci1jb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLm5hbWU9TW92ZQotY29tbWFuZC5qc3AucmVmYWN0b3IubW92ZS5kZXNjcmlwdGlvbj1Nb3ZlIGEgSmF2YSBFbGVtZW50IHRvIGFub3RoZXIgcGFja2FnZQotc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AubmFtZT1FZGl0aW5nIEpTUCBTb3VyY2UKLXNjb3BlLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLmRlc2NyaXB0aW9uPUVkaXRpbmcgSlNQIFNvdXJjZQotSlNQX1R5cGVfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFR5cGUgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfTWV0aG9kX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBNZXRob2QgUmVuYW1lIFBhcnRpY2lwYW50Ci1KU1BfUGFja2FnZV9SZW5hbWVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgUGFja2FnZSBSZW5hbWUgUGFydGljaXBhbnQKLUpTUF9UeXBlX01vdmVfUGFydGljaXBhbnRfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgVHlwZSBNb3ZlIFBhcnRpY2lwYW50Ci1BbGxfSlNQX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUFsbCBKU1AKLUpTUF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9TmV3IEpTUAotSlNQX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1KU1AgVGFnCi1KU1BfQXR0cmlidXRlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUpTUCBBdHRyaWJ1dGUKLUpTUF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIEF0dHJpYnV0ZSB2YWx1ZQotSlNQX1F1ZXJ5X1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SlNQIFF1ZXJ5IFBhcnRpY2lwYW50Ci1KU1BfRXh0ZW5zaW9uX0VsZW1lbnQubGFiZWw9SlNQCi0jb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24gcG9pbnQKLV9VSV9XSVpBUkRfTkFNRSA9IEpTUAotX1VJX1dJWkFSRF9DUkVBVEVfTkVXX0ZJTEUgPSBDcmVhdGUgYSBuZXcgSmF2YVNlcnZlciBQYWdlCi0jIwotQWRkVGFzay5sYWJlbD1BZGQgJlRhc2suLi4KLUFkZFRhc2sudG9vbHRpcD1BZGQgVGFzay4uLgotQWRkQm9va21hcmsubGFiZWw9QWRkIEJvbyZrbWFyay4uLgotQWRkQm9va21hcmsudG9vbHRpcD1BZGQgQm9va21hcmsuLi4KLVNlbGVjdFJ1bGVyLmxhYmVsPVNlbGVjdCBSdWxlcgotIyMgRUwgRXJyb3IgTWVzc2FnZQotIyMKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1Ub2dnbGVDb21tZW50X2xhYmVsPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X3Rvb2x0aXA9VG9nZ2xlIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9sYWJlbD1BZGQgQmxvY2sgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X3Rvb2x0aXA9QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUZpbmRPY2N1cnJlbmNlc19sYWJlbD1PY2N1cnJlbmNlcyBpbiBGaWxlCi1SZW5hbWVFbGVtZW50X2xhYmVsPVJlbmFtZQotTW92ZUVsZW1lbnRfbGFiZWw9TW92ZQotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9UHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD1SZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA9UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNkMmU1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlSlNQX1NvdXJjZV9QYWdlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy8vZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmIgotCQkJZXh0ZW5zaW9ucz0ianNwLCBqc2YsIGpzcGYsIGpzcHgsIHRhZywgdGFnZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkFjdGlvbkNvbnRyaWJ1dG9ySlNQIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIj4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8L2VkaXRvcj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJUNTU19KU1BfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zLy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5BY3Rpb25Db250cmlidXRvckpTUCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIgotCQkJc3ltYm9saWNGb250TmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXh0Zm9udCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlLnNvdXJjZSI+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmNzc2pzcHNvdXJjZSIgLz4KLQkJCTxjb250ZW50VHlwZUJpbmRpbmcKLQkJCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudmlld3MuY29udGVudG91dGxpbmUuSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InNvdXJjZWVkaXRpbmd0ZXh0dG9vbHMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSlNQU291cmNlRWRpdGluZ1RleHRUb29scyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0iY2hhcmFjdGVycGFpcm1hdGNoZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0LkpTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbi5TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcC5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3Auc3R5bGVzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJzaG93aW50YXJnZXQiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LnVpLlBhY2thZ2VFeHBsb3JlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJwYXJ0aWFsIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5NYXJrdXBWYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLm1hcmt1cHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLkpTUF9ESVJFQ1RJVkUiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InBhcnRpYWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbi5IVE1MVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5odG1sc3ludGF4dmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuSlNQX0RJUkVDVElWRSIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQiLz4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySlNQIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0KLQkJPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCTwhLS0gSlNQIFBSRUZFUkVOQ0UgUEFHRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVKU1BfRmlsZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcCIgLz4KLQotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9Tb3VyY2UubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUFNvdXJjZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnNvdXJjZSIgLz4KLQotCQk8cGFnZQotCQkJbmFtZT0iJUpTUF9UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmpzcCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkpTUFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5qc3AudGVtcGxhdGVzIiAvPgotCi0JCTxwYWdlCi0JCQluYW1lPSIlSlNQX1N0eWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuSlNQQ29sb3JQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnN0eWxlcyIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBGT1IgSlNQL0pBVkEgUkVOQU1FIFBBUlRJQ0lQQVRJT04gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucmVuYW1lUGFydGljaXBhbnRzIj4KLQkJPHJlbmFtZVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlSlNQX1R5cGVfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCIKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZVJlbmFtZVBhcnRpY2lwYW50Ij4KLQkJCTxlbmFibGVtZW50PgotCQkJCTx3aXRoIHZhcmlhYmxlPSJhZmZlY3RlZE5hdHVyZXMiPgotCQkJCQk8aXRlcmF0ZSBvcGVyYXRvcj0ib3IiPgotCQkJCQkJPGVxdWFscyB2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZSIgLz4KLQotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCi0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJUpTUF9NZXRob2RfUmVuYW1lX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5yZWZhY3RvcmluZy5KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L3JlbmFtZVBhcnRpY2lwYW50PgotCi0JCTxyZW5hbWVQYXJ0aWNpcGFudAotCQkJbmFtZT0iJUpTUF9QYWNrYWdlX1JlbmFtZV9QYXJ0aWNpcGFudF9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BQYWNrYWdlUmVuYW1lUGFydGljaXBhbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qYXZhLnJlZmFjdG9yaW5nLkpTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudCI+Ci0JCQk8ZW5hYmxlbWVudD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iYWZmZWN0ZWROYXR1cmVzIj4KLQkJCQkJPGl0ZXJhdGUgb3BlcmF0b3I9Im9yIj4KLQkJCQkJCTxlcXVhbHMgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiIC8+Ci0KLQkJCQkJPC9pdGVyYXRlPgotCQkJCTwvd2l0aD4KLQkJCQk8d2l0aCB2YXJpYWJsZT0iZWxlbWVudCI+Ci0JCQkJCTxpbnN0YW5jZW9mCi0JCQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudCIgLz4KLQotCQkJCTwvd2l0aD4KLQkJCTwvZW5hYmxlbWVudD4KLQkJPC9yZW5hbWVQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRk9SIEpTUC9KQVZBIE1PVkUgUEFSVElDSVBBVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLm1vdmVQYXJ0aWNpcGFudHMiPgotCi0JCTxtb3ZlUGFydGljaXBhbnQKLQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmphdmEucmVmYWN0b3JpbmcuSlNQVHlwZU1vdmVQYXJ0aWNpcGFudCIKLQkJCW5hbWU9IiVKU1BfVHlwZV9Nb3ZlX1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkpTUFR5cGVNb3ZlUGFydGljaXBhbnQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPHdpdGggdmFyaWFibGU9ImFmZmVjdGVkTmF0dXJlcyI+Ci0JCQkJCTxpdGVyYXRlIG9wZXJhdG9yPSJvciI+Ci0JCQkJCQk8ZXF1YWxzIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlIiAvPgotCQkJCQk8L2l0ZXJhdGU+Ci0JCQkJPC93aXRoPgotCQkJCTx3aXRoIHZhcmlhYmxlPSJlbGVtZW50Ij4KLQkJCQkJPGluc3RhbmNlb2YgdmFsdWU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlIiAvPgotCi0JCQkJPC93aXRoPgotCQkJPC9lbmFibGVtZW50PgotCQk8L21vdmVQYXJ0aWNpcGFudD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gZm9yIGJyZWFrcG9pbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYnJlYWtwb2ludCI+Ci0JCTxicmVha3BvaW50Q29udHJpYnV0aW9uIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnByb3ZpZGVycyI+Ci0JCQk8IS0tIAotCQkJCTxwcm92aWRlcgotCQkJCWV4dGVuc2lvbnM9ImpzcCwganNwZiwganNmIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVycy5KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlciI+Ci0JCQkJPC9wcm92aWRlcj4KLQkJCS0tPgotCQkJPHByb3ZpZGVyCi0JCQkJY29udGVudFR5cGVzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnMuSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXI6KmpzcCxqc3Bfc2VydmxldC5fKiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzLkphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyIiAvPgotCQk8L2JyZWFrcG9pbnRDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIFNuaXBwZXQgVmlldyBjb250cmlidXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnNuaXBwZXRzLlNuaXBwZXRDb250cmlidXRpb25zIj4KLQkJPGNhdGVnb3J5Ci0JCQlsYWJlbD0iJUpTUF9FeHRlbnNpb25fRWxlbWVudC5sYWJlbCIKLQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvdGFnLWpzcC5naWYiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5jYXRlZ29yeTAiCi0JCQljb250ZW50dHlwZXM9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9oaWRkZW5fY29tbWVudCIKLQkJCQlzbWFsbGljb249Imljb25zL3NuaXBwZXRzL3RhZy1nZW5lcmljLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfaGlkZGVuX2NvbW1lbnQiPgotCQkJCTxjb250ZW50PiVqc3BfaGlkZGVuX2NvbW1lbnRfY29udGVudDwvY29udGVudD4KLQkJCTwvaXRlbT4KLQkJCTxpdGVtCi0JCQkJbGFiZWw9IiVqc3Bfc2NyaXB0bGV0IgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwc2NyLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3Bfc2NyaXB0bGV0Ij4KLQkJCQk8Y29udGVudD4lanNwX3Njcl9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF9leHByZXNzaW9uIgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwZXhwLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfZXhwcmVzc2lvbiI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9leHByZXNzaW9uX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX2RlY2xhcmF0aW9uIgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwZGVjbC5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX2RlY2xhcmF0aW9uIj4KLQkJCQk8Y29udGVudD4lanNwX2RlY2xhcmF0aW9uX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX2luY2x1ZGVfZGlyZWN0aXZlIgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwaW5jbC5naWYiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuanNwX2luY2x1ZGVfZGlyZWN0aXZlIj4KLQkJCQk8Y29udGVudD4lanNwX2luY2x1ZGVfZGlyZWN0aXZlX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQk8L2l0ZW0+Ci0JCQk8aXRlbQotCQkJCWxhYmVsPSIlanNwX3BhZ2VfZGlyZWN0aXZlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmpzcF9wYWdlX2RpcmVjdGl2ZSI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF9wYWdlX2RpcmVjdGl2ZV9jb250ZW50PC9jb250ZW50PgotCQkJPC9pdGVtPgotCQkJPGl0ZW0KLQkJCQlsYWJlbD0iJWpzcF90YWdsaWJfZGlyZWN0aXZlIgotCQkJCXNtYWxsaWNvbj0iaWNvbnMvc25pcHBldHMvanNwdGFnbGliLmdpZiIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5qc3BfdGFnbGliX2RpcmVjdGl2ZSI+Ci0JCQkJPGNvbnRlbnQ+JWpzcF90YWdsaWJfZGlyZWN0aXZlX2NvbnRlbnQ8L2NvbnRlbnQ+Ci0JCQkJPHZhcmlhYmxlCi0JCQkJCWRlc2NyaXB0aW9uPSIlanNwX3RhZ2xpYl9kaXJlY3RpdmVfdXJpIgotCQkJCQlpZD0idXJpIiAvPgotCi0JCQkJPHZhcmlhYmxlCi0JCQkJCWRlZmF1bHQ9Im15bGliIgotCQkJCQlkZXNjcmlwdGlvbj0iJWpzcF90YWdsaWJfZGlyZWN0aXZlX3ByZWZpeCIKLQkJCQkJaWQ9InByZWZpeCIgLz4KLQotCQkJPC9pdGVtPgotCQk8L2NhdGVnb3J5PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIEpTUCBFZGl0b3Igc3BlY2lmaWMgYWN0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5jb21tYW5kcyI+Ci0JCTwhLS0gcmVuYW1lIHJlZmFjdG9yIC0tPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuanNwLnJlZmFjdG9yLnJlbmFtZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5yZW5hbWUuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IucmVuYW1lIiAvPgotCi0JCTwhLS0gbW92ZSByZWZhY3RvciAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmpzcC5yZWZhY3Rvci5tb3ZlLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuanNwLnJlZmFjdG9yLm1vdmUuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkucmVmYWN0b3IubW92ZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleWJpbmRpbmcgc2NvcGUgZm9yIGpzcCBzb3VyY2UgZWRpdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZC50ZXh0LmVkaXRvci5qc3AuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSI+Ci0JCTwvY29udGV4dD4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8IS0tIEtleWJpbmRpbmdzIGZvciBqc3Agc291cmNlIGVkaXRvciAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5iaW5kaW5ncyI+Ci0JICAgIDwhLS0gIHdpbjMyOiAgTTE9Q1RSTCwgTTI9U0hJRlQsIE0zPUFMVCAtLT4KLQkJPCEtLSByZW5hbWUgcmVmYWN0b3IgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMitNMytSIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnN0cnVjdHVyZWQudGV4dC5lZGl0b3IuanNwLnNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLnJlbmFtZSIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0KLQkJPCEtLSBtb3ZlIHJlZmFjdG9yIC0tPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrViIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5zdHJ1Y3R1cmVkLnRleHQuZWRpdG9yLmpzcC5zY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5tb3ZlIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gVGVtcGxhdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQWxsX0pTUF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF9hbGwiIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSlNQX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF9uZXciIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSlNQX1RhZ19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF90YWciIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSlNQX0F0dHJpYnV0ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF9hdHRyaWJ1dGUiIC8+Ci0KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSlNQX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSlNQIgotCQkJaWQ9ImpzcF9hdHRyaWJ1dGVfdmFsdWUiIC8+Ci0KLQkJPGluY2x1ZGUKLQkJCWZpbGU9InRlbXBsYXRlcy9qc3BkZWZhdWx0LXRlbXBsYXRlcy54bWwiCi0JCQl0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiIC8+Ci0KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gcXVlcnlQYXJ0aWNpcGFudCB0byBwYXJ0aWNpcGF0ZSBpbiBqYXZhIHNlcmFjaGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmpkdC51aS5xdWVyeVBhcnRpY2lwYW50cyI+Ci0JCTxxdWVyeVBhcnRpY2lwYW50Ci0JCQluYW1lPSIlSlNQX1F1ZXJ5X1BhcnRpY2lwYW50X0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQluYXR1cmU9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC51aS5KU1BRdWVyeVBhcnRpY2lwYW50IgotCQkJaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuamF2YS5zZWFyY2gudWkuSlNQUXVlcnlQYXJ0aWNpcGFudCIgLz4KLQotCTwvZXh0ZW5zaW9uPgotCTwhLS0gaW5pdGlhbGl6ZSB4bWwgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gRG9jdW1lbnQgcHJvdmlkZXIgZm9yIEV4dGVybmFsRmlsZUVkaXRvcklucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMuZG9jdW1lbnRQcm92aWRlcnMiPgotCQk8cHJvdmlkZXIKLQkJCWlucHV0VHlwZXM9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkV4dGVybmFsRmlsZUVkaXRvcklucHV0IgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RmlsZURvY3VtZW50UHJvdmlkZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5FeHRlcm5hbEZpbGVEb2N1bWVudFByb3ZpZGVyIiAvPgotCi0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIE5ldyBKU1Agd2l6YXJkIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMiPgotCQk8d2l6YXJkCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQuTmV3SlNQV2l6YXJkIgotCQkJbmFtZT0iJV9VSV9XSVpBUkRfTkFNRSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdKU1BXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2pzcF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX1dJWkFSRF9DUkVBVEVfTkVXX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gQWRkIG5ldyBKU1Agd2l6YXJkIHRvIEoyRUUgUHJvamVjdCBOYXZpZ2F0b3IgLS0+Ci0JPGV4dGVuc2lvbgotCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb21tb25XaXphcmQubmV3SlNQIgotCQlwb2ludD0ib3JnLmVjbGlwc2UudWkubmF2aWdhdG9yLm5hdmlnYXRvckNvbnRlbnQiPgotCQk8Y29tbW9uV2l6YXJkCi0gICAgICAgIG1lbnVHcm91cElkPSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotICAgICAgICB0eXBlPSJuZXciCi0gICAgICAgIHdpemFyZElkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZC5OZXdKU1BXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCTx0ZXN0Ci0JCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLnByb2plY3RGYWNldCIKLQkJCQkJCQl2YWx1ZT0ianN0LndlYiIvPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIiAvPgotCi0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIgLz4KLQotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotCQk8ZWRpdG9yQ29udHJpYnV0aW9uCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UuZWRpdG9yQWN0aW9ucyIKLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQ2xlYW51cERvY3VtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJUb2dnbGVDb21tZW50IgotCQkJCWxhYmVsPSIlVG9nZ2xlQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVRvZ2dsZUNvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlRvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iVG9nZ2xlQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQWRkQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlQWRkQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlQWRkQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQWRkQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW1vdmVCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlJlbmFtZUVsZW1lbnQiCi0JCQkJbGFiZWw9IiVSZW5hbWVFbGVtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5yZWZhY3Rvci5yZW5hbWUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlJlbmFtZUVsZW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9Ik1vdmVFbGVtZW50IgotCQkJCWxhYmVsPSIlTW92ZUVsZW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnJlZmFjdG9yLm1vdmUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZy5KU1BNb3ZlRWxlbWVudEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJNb3ZlRWxlbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iRmluZE9jY3VycmVuY2VzIgotCQkJCWxhYmVsPSIlRmluZE9jY3VycmVuY2VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zZWFyY2guZmluZC5vY2N1cnJlbmNlcyIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iRmluZE9jY3VycmVuY2VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBKU1AgRnJhZ21lbnQgUHJvcGVydHkgUGFnZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPCEtLSBmb3IgajJlZSB3ZWIgcHJvamVjdCAtLT4KLQkJPHBhZ2UKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLQkJCWFkYXB0YWJsZT0idHJ1ZSIKLQkJCW5hbWU9IiVKU1BGcmFnbWVudENvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSI+Ci0gICAgICAgICAJPGVuYWJsZWRXaGVuPgotICAgICAgICAgICAgICAgCTxhbmQ+Ci0JCQkJCTxhZGFwdCB0eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCI+Ci0JCQkJCQk8b3I+IAotCQkJCQkJCTx0ZXN0IAotCQkJCQkJCQlmb3JjZVBsdWdpbkFjdGl2YXRpb249InRydWUiCi0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3Qud2ViIiAvPgotCQkJCQkJPC9vcj4KLQkJCQkJPC9hZGFwdD4KLQkJCQk8L2FuZD4gCi0JCQk8L2VuYWJsZWRXaGVuPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQlhZGFwdGFibGU9InRydWUiCi0JCQluYW1lPSIlSlNQRnJhZ21lbnRDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIj4KLSAgICAgICAgIAk8ZW5hYmxlZFdoZW4+Ci0gICAgICAgICAgICAgICAJPGFuZD4KLQkJCQkJPGFkYXB0IHR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIj4KLQkJCQkJCTxvcj4gCi0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4JCi0JPCEtLSAganNwLWZvci1jc3MgZWRpdG9yIGNvbmZpZ3VyYXRpb25zIC0tPgkJCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUuQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC52aWV3cy5wcm9wZXJ0aWVzLkpTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGV4dC5DU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24uU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlLCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc3R5bGVzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUyI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5jc3Nqc3Bzb3VyY2UiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9KU1BlZENTU1Byb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Yzc4MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ1NTUHJvcGVydHlTb3VyY2U7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZSBleHRlbmRzIENTU1Byb3BlcnR5U291cmNlIHsKLQotCXB1YmxpYyBKU1BlZENTU1Byb3BlcnR5U291cmNlKElDU1NOb2RlIHRhcmdldCkgewotCQlzdXBlcih0YXJnZXQpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJLy8gd29ya2Fyb3VuZCB0byBhdm9pZCBET01FeGNlcHRpb246IGlmIHZhbHVlIGNvbnRhaW5zIGpzcCBlbGVtZW50LCBub3RoaW5nIGhhcHBlbi4KLQkJU3RyaW5nIHYgPSB2YWx1ZS50b1N0cmluZygpOwotCQlpZiAodi5pbmRleE9mKCIkeyIpICE9IC0xIHx8IHYuaW5kZXhPZigiPCU9IikgIT0gLTEpewotCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJU3RyaW5nIHRpdGxlID0gSlNQVUlNZXNzYWdlcy5UaXRsZV9JbnZhbGlkVmFsdWU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBtZXNzYWdlID0gSlNQVUlNZXNzYWdlcy5NZXNzYWdlX0ludmFsaWRWYWx1ZTsgLy8kTk9OLU5MUy0xJAotCQkJTWVzc2FnZURpYWxvZy5vcGVuV2FybmluZyh3aW5kb3cuZ2V0U2hlbGwoKSwgdGl0bGUsIG1lc3NhZ2UpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXN1cGVyLnNldFByb3BlcnR5VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckpTUGVkQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJKU1BlZENTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDllODdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC9jc3MvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckpTUGVkQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY3NzLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlQcm92aWRlckpTUGVkQ1NTIGV4dGVuZHMgQWRhcHRlckZhY3RvcnlQcm92aWRlckNTUyB7Ci0KLQotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgTW9kZWxIYW5kbGVyRm9ySlNQZWRDU1MpOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvSlNQZWRDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL2Nzcy91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0pTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQwMzgxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvY3NzL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvSlNQZWRDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC5jc3MudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkpTUGVkQ1NTUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBKU1BlZENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGV4dGVuZHMgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgY2xhc3MgQ1NTUHJvcGVydHlTaGVldFJlZnJlc2hBZGFwdGVyIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQkJcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwpIHsKLQkJCQlnZXRQcm9wZXJ0aWVzUmVmcmVzaEpvYigpLmFkZFByb3BlcnR5U2hlZXRQYWdlKGZQcm9wZXJ0eVNoZWV0UGFnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENTU1Byb3BlcnR5U291cmNlUHJvdmlkZXIgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2VQcm92aWRlciB7Ci0JCXByaXZhdGUgSVByb3BlcnR5U291cmNlIGZQcm9wZXJ0eVNvdXJjZSA9IG51bGw7Ci0JCXByaXZhdGUgSUNTU05vZGUgZlNvdXJjZSA9IG51bGw7Ci0KLQkJcHVibGljIElQcm9wZXJ0eVNvdXJjZSBnZXRQcm9wZXJ0eVNvdXJjZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlpZiAoZlNvdXJjZSAhPSBudWxsICYmIG9iamVjdC5lcXVhbHMoZlNvdXJjZSkpIHsKLQkJCQlyZXR1cm4gZlByb3BlcnR5U291cmNlOwotCQkJfQotCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQlmU291cmNlID0gKElDU1NOb2RlKW9iamVjdDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSBuZXcgSlNQZWRDU1NQcm9wZXJ0eVNvdXJjZShmU291cmNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZTb3VyY2UgPSBudWxsOwotCQkJCWZQcm9wZXJ0eVNvdXJjZSA9IG51bGw7Ci0JCQl9Ci0JCQlyZXR1cm4gZlByb3BlcnR5U291cmNlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBQcm9wZXJ0aWVzUmVmcmVzaEpvYiBleHRlbmRzIFVJSm9iIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVVBEQVRFX0RFTEFZID0gMjAwOwotCi0JCXByaXZhdGUgU2V0IHByb3BlcnR5U2hlZXRQYWdlcyA9IG51bGw7Ci0KLQkJcHVibGljIFByb3BlcnRpZXNSZWZyZXNoSm9iKCkgewotCQkJc3VwZXIoWE1MVUlNZXNzYWdlcy5KRmFjZU5vZGVBZGFwdGVyXzEpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcyA9IG5ldyBIYXNoU2V0KDEpOwotCQl9Ci0KLQkJdm9pZCBhZGRQcm9wZXJ0eVNoZWV0UGFnZShJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmFkZChwYWdlKTsKLQkJCXNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJT2JqZWN0W10gcGFnZXMgPSBwcm9wZXJ0eVNoZWV0UGFnZXMudG9BcnJheSgpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzLmNsZWFyKCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKFByb3BlcnR5U2hlZXRQYWdlKSBwYWdlc1tpXTsKLQkJCQlpZiAocGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb3BlcnRpZXNSZWZyZXNoSm9iIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG51bGw7Ci0KLQlJUHJvcGVydHlTaGVldFBhZ2UgZlByb3BlcnR5U2hlZXRQYWdlOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElOb2RlQWRhcHRlciBmUmVmcmVzaEFkYXB0ZXIgPSBuZXcgQ1NTUHJvcGVydHlTaGVldFJlZnJlc2hBZGFwdGVyKCk7Ci0KLQlwcml2YXRlIElOb2RlTm90aWZpZXJbXSBmU2VsZWN0ZWROb3RpZmllcnM7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIENTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIEpTUGVkQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gcmVtb3ZlIFVJIHJlZnJlc2ggYWRhcHRlcnMKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzdXBlci5nZXRJbnB1dFNlbGVjdGlvbihzZWxlY3RpbmdQYXJ0LCBzZWxlY3Rpb24pOwotCQlpZiAocHJlZmVycmVkU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCldOwotCQkJU3lzdGVtLmFycmF5Y29weSgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSwgMCwgc2VsZWN0ZWRPYmplY3RzLCAwLCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHNlbGVjdGVkT2JqZWN0c1tpXTsKLQkJCQkJd2hpbGUgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUpIHsKLQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCXNlbGVjdGVkT2JqZWN0c1tpXSA9IG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBBZGQgVUkgcmVmcmVzaCBhZGFwdGVycyBhbmQgcmVtZW1iZXIgbm90aWZpZXJzIGZvciBsYXRlcgotCQkJICogcmVtb3ZhbAotCQkJICovCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlMaXN0IHNlbGVjdGVkTm90aWZpZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzW2ldIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJc2VsZWN0ZWROb3RpZmllcnMuYWRkKHNlbGVjdGVkT2JqZWN0c1tpXSk7Ci0JCQkJCQkoKElOb2RlTm90aWZpZXIpIHNlbGVjdGVkT2JqZWN0c1tpXSkuYWRkQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IChJTm9kZU5vdGlmaWVyW10pIHNlbGVjdGVkTm90aWZpZXJzLnRvQXJyYXkobmV3IElOb2RlTm90aWZpZXJbc2VsZWN0ZWROb3RpZmllcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0JCQlwcmVmZXJyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE9iamVjdHMpOwotCQl9Ci0JCXJldHVybiBwcmVmZXJyZWRTZWxlY3Rpb247Ci0JfQotCi0JUHJvcGVydGllc1JlZnJlc2hKb2IgZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUHJvcGVydGllc1JlZnJlc2hKb2IgPT0gbnVsbCkgewotCQkJZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbmV3IFByb3BlcnRpZXNSZWZyZXNoSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYjsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlpZiAoZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBuZXcgQ1NTUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gcGFnZTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI5NDczYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuSUphdmFQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwudGV4dC5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYXV0b2VkaXQuQXV0b0VkaXRTdHJhdGVneUZvclRhYnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdC5TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNQQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5KU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZm9ybWF0LkZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuSlNQSmF2YUh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlRhZ2xpYkh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rLlhNTEh5cGVybGlua0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhLkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsLkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvLkpTUEluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvLkpTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvLkpTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm8uSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdC5IVE1MRm9ybWF0UHJvY2Vzc29ySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5UZXh0SG92ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBKU1AgY29udGVudC4KLSAqIDxwPgotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlIHNwZWNpZmljCi0gKiB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIHsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIG5vdCBzb3VyY2V2aWV3ZXItc3BlY2lmaWMgYW5kCi0JICogaXQncyBhIFN0cmluZyBhcnJheQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckphdmE7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckpTUDsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gZkhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCXByaXZhdGUgSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gZkphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZYTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSlNQKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiNnZXRBdXRvRWRpdFN0cmF0ZWdpZXMob3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElBdXRvRWRpdFN0cmF0ZWd5W10gZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdHJhdGVnaWVzID0gbnVsbDsKLQotCQlpZiAoY29udGVudFR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpIHsKLQkJCS8vIHhtbCBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlzdHJhdGVnaWVzID0gZ2V0WE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEF1dG9FZGl0U3RyYXRlZ2llcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSB7Ci0JCQkvLyBqc3AgamF2YSBhdXRvZWRpdCBzdHJhdGVnaWVzCi0JCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCQlJQXV0b0VkaXRTdHJhdGVneVtdIGphdmFTdHJhdGVnaWVzID0gZ2V0SmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqYXZhU3RyYXRlZ2llcy5sZW5ndGg7IGkrKykgewotCQkJCWFsbFN0cmF0ZWdpZXMuYWRkKGphdmFTdHJhdGVnaWVzW2ldKTsKLQkJCX0KLQkJCS8vIGJlIHN1cmUgdGhpcyBpcyBhZGRlZCBsYXN0LCBhZnRlciBvdGhlcnMsIHNvIGl0IGNhbiBtb2RpZnkKLQkJCS8vIHJlc3VsdHMgZnJvbSBlYXJsaWVyIHN0ZXBzLgotCQkJLy8gYWRkIGF1dG8gZWRpdCBzdHJhdGVneSB0aGF0IGhhbmRsZXMgd2hlbiB0YWIga2V5IGlzIHByZXNzZWQKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicygpKTsKLQotCQkJc3RyYXRlZ2llcyA9IChJQXV0b0VkaXRTdHJhdGVneVtdKSBhbGxTdHJhdGVnaWVzLnRvQXJyYXkobmV3IElBdXRvRWRpdFN0cmF0ZWd5W2FsbFN0cmF0ZWdpZXMuc2l6ZSgpXSk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUNMQVJBVElPTikgewotCQkJLy8gaHRtbCBhbmQganNwIGF1dG9lZGl0IHN0cmF0ZWdpZXMKLQkJCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJCS8vIGFkZCB0aGUganNwIGF1dG9lZGl0IHN0cmF0ZWd5IGZpcnN0IHRoZW4gYWRkIGFsbCBodG1sJ3MKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUCgpKTsKLQotCQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBodG1sU3RyYXRlZ2llcyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBodG1sU3RyYXRlZ2llcy5sZW5ndGg7IGkrKykgewotCQkJCWFsbFN0cmF0ZWdpZXMuYWRkKGh0bWxTdHJhdGVnaWVzW2ldKTsKLQkJCX0KLQotCQkJc3RyYXRlZ2llcyA9IChJQXV0b0VkaXRTdHJhdGVneVtdKSBhbGxTdHJhdGVnaWVzLnRvQXJyYXkobmV3IElBdXRvRWRpdFN0cmF0ZWd5W2FsbFN0cmF0ZWdpZXMuc2l6ZSgpXSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBkZWZhdWx0IGF1dG9lZGl0IHN0cmF0ZWdpZXMKLQkJCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3VwZXJTdHJhdGVnaWVzID0gc3VwZXIuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdXBlclN0cmF0ZWdpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlhbGxTdHJhdGVnaWVzLmFkZChzdXBlclN0cmF0ZWdpZXNbaV0pOwotCQkJfQotCi0JCQkvLyBiZSBzdXJlIHRoaXMgaXMgYWRkZWQgbGFzdCwgYWZ0ZXIgb3RoZXJzLCBzbyBpdCBjYW4gbW9kaWZ5Ci0JCQkvLyByZXN1bHRzIGZyb20gZWFybGllciBzdGVwcy4KLQkJCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgQXV0b0VkaXRTdHJhdGVneUZvclRhYnMoKSk7Ci0KLQkJCXN0cmF0ZWdpZXMgPSAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCQl9Ci0KLQkJcmV0dXJuIHN0cmF0ZWdpZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBBIGxpdHRsZSBiaXQgb2YgY2hlYXRpbmcgYmVjYXVzZSBhc3N1bWluZyBodG1sJ3MgY29uZmlndXJlZAotCQkJICogY29udGVudCB0eXBlcyB3aWxsIGFkZCBkZWZhdWx0LCB1bmtub3duLCBhbmQgYWxsIHhtbCBjb25maWd1cmVkCi0JCQkgKiBjb250ZW50IHR5cGVzCi0JCQkgKi8KLQkJCVN0cmluZ1tdIGh0bWxUeXBlcyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJU3RyaW5nW10ganNwVHlwZXMgPSBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySlNQLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1todG1sVHlwZXMubGVuZ3RoICsganNwVHlwZXMubGVuZ3RoXTsKLQotCQkJaW50IGluZGV4ID0gMDsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaHRtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXgsIGh0bWxUeXBlcy5sZW5ndGgpOwotCQkJU3lzdGVtLmFycmF5Y29weShqc3BUeXBlcywgMCwgZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMsIGluZGV4ICs9IGh0bWxUeXBlcy5sZW5ndGgsIGpzcFR5cGVzLmxlbmd0aCk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yW10gcHJvY2Vzc29ycyA9IG51bGw7Ci0KLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJLy8gSFRNTCBKYXZhU2NyaXB0Ci0JCQlJQ29udGVudEFzc2lzdGFudCBodG1sQ29udGVudEFzc2lzdGFudCA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0Q29udGVudEFzc2lzdGFudChzb3VyY2VWaWV3ZXIpOwotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gaHRtbENvbnRlbnRBc3Npc3RhbnQuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKTsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtwcm9jZXNzb3J9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHsKLQkJCS8vIEhUTUwgQ1NTCi0JCQlJQ29udGVudEFzc2lzdGFudCBodG1sQ29udGVudEFzc2lzdGFudCA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0Q29udGVudEFzc2lzdGFudChzb3VyY2VWaWV3ZXIpOwotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gaHRtbENvbnRlbnRBc3Npc3RhbnQuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihJQ1NTUGFydGl0aW9ucy5TVFlMRSk7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117cHJvY2Vzc29yfTsKLQkJfQotCQkvLyAvLyBqc3Bjb250ZW50YXNzaXN0cHJvY2Vzc29yIGhhbmRsZXMgdGhpcz8KLQkJLy8gZWxzZSBpZiAoKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25UeXBlcy5IVE1MX0RFRkFVTFQpIHx8Ci0JCS8vIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9uVHlwZXMuSFRNTF9DT01NRU5UKSkgewotCQkvLyBwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3Ci0JCS8vIEhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQkvLyB9Ci0JCWVsc2UgaWYgKChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5UKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09NTUVOVCkpIHsKLQkJCS8vIGpzcAotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0JCWVsc2UgaWYgKChwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQSkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSkpIHsKLQkJCS8vIGpzcCBqYXZhCi0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFRfRUwpIHsKLQkJCS8vIGpzcCBlbAotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBKU1BFTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT04pIHsKLQkJCS8vIHVua25vd24KLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySlNQKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NvcnM7Ci0JfQotCi0JcHVibGljIElDb250ZW50Rm9ybWF0dGVyIGdldENvbnRlbnRGb3JtYXR0ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpOwotCi0JCWZvcm1hdHRlci5zZXRNYXN0ZXJTdHJhdGVneShuZXcgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShuZXcgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwoKSkpOwotCQlmb3JtYXR0ZXIuc2V0U2xhdmVTdHJhdGVneShuZXcgRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YSgpLCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUlUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSBzdHJhdGVneSA9IG51bGw7Ci0KLQkJLy8gaHRtbCBvciBqYXZhc2NyaXB0Ci0JCWlmIChjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUIHx8IGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpCi0JCQlzdHJhdGVneSA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZWxzZSBpZiAoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSB8fCBjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUKQotCQkJLy8gSlNQIEphdmEgb3IgSlNQIEphdmFTY3JpcHQKLQkJCXN0cmF0ZWd5ID0gZ2V0SmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXREb3VibGVDbGlja1N0cmF0ZWd5KHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCkKLQkJCS8vIEpTUCAoanVzdCB0cmVhdCBsaWtlIGh0bWwpCi0JCQlzdHJhdGVneSA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0RG91YmxlQ2xpY2tTdHJhdGVneShzb3VyY2VWaWV3ZXIsIElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpOwotCQllbHNlCi0JCQlzdHJhdGVneSA9IHN1cGVyLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0KLQkJcmV0dXJuIHN0cmF0ZWd5OwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQlpZiAoZkhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID09IG51bGwpIHsKLQkJCWZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MKCk7Ci0JCX0KLQkJcmV0dXJuIGZIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSUh5cGVybGlua0RldGVjdG9yW10gZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHNvdXJjZVZpZXdlciA9PSBudWxsIHx8ICFmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSFlQRVJMSU5LU19FTkFCTEVEKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgYWxsRGV0ZWN0b3JzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJYWxsRGV0ZWN0b3JzLmFkZChuZXcgSlNQSmF2YUh5cGVybGlua0RldGVjdG9yKCkpOwotCQlhbGxEZXRlY3RvcnMuYWRkKG5ldyBUYWdsaWJIeXBlcmxpbmtEZXRlY3RvcigpKTsKLQkJYWxsRGV0ZWN0b3JzLmFkZChuZXcgWE1MSHlwZXJsaW5rRGV0ZWN0b3IoKSk7Ci0KLQkJSUh5cGVybGlua0RldGVjdG9yW10gc3VwZXJEZXRlY3RvcnMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvcnMoc291cmNlVmlld2VyKTsKLQkJZm9yIChpbnQgbSA9IDA7IG0gPCBzdXBlckRldGVjdG9ycy5sZW5ndGg7IG0rKykgewotCQkJSUh5cGVybGlua0RldGVjdG9yIGRldGVjdG9yID0gc3VwZXJEZXRlY3RvcnNbbV07Ci0JCQlpZiAoIWFsbERldGVjdG9ycy5jb250YWlucyhkZXRlY3RvcikpIHsKLQkJCQlhbGxEZXRlY3RvcnMuYWRkKGRldGVjdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElIeXBlcmxpbmtEZXRlY3RvcltdKSBhbGxEZXRlY3RvcnMudG9BcnJheShuZXcgSUh5cGVybGlua0RldGVjdG9yWzBdKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW5kZW50UHJlZml4ZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlTdHJpbmdbXSBpbmRlbnRhdGlvbnMgPSBudWxsOwotCi0JCWlmIChjb250ZW50VHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkKLQkJCWluZGVudGF0aW9ucyA9IGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRJbmRlbnRQcmVmaXhlcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQkJZWxzZQotCQkJaW5kZW50YXRpb25zID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRJbmRlbnRQcmVmaXhlcyhzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlKTsKLQotCQlyZXR1cm4gaW5kZW50YXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBJSW5mb3JtYXRpb25Qcm92aWRlciBnZXRJbmZvcm1hdGlvblByb3ZpZGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlJSW5mb3JtYXRpb25Qcm92aWRlciBwcm92aWRlciA9IG51bGw7Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpIHsKLQkJCS8vIEhUTUwKLQkJCUlJbmZvcm1hdGlvblByZXNlbnRlciBodG1sUHJlc2VudGVyID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRJbmZvcm1hdGlvblByZXNlbnRlcihzb3VyY2VWaWV3ZXIpOwotCQkJcHJvdmlkZXIgPSBodG1sUHJlc2VudGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXIoSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQkvLyBIVE1MIEphdmFTY3JpcHQKLQkJCUlJbmZvcm1hdGlvblByZXNlbnRlciBodG1sUHJlc2VudGVyID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRJbmZvcm1hdGlvblByZXNlbnRlcihzb3VyY2VWaWV3ZXIpOwotCQkJcHJvdmlkZXIgPSBodG1sUHJlc2VudGVyLmdldEluZm9ybWF0aW9uUHJvdmlkZXIoSUhUTUxQYXJ0aXRpb25zLlNDUklQVCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkgewotCQkJLy8gWE1MCi0JCQlJSW5mb3JtYXRpb25QcmVzZW50ZXIgeG1sUHJlc2VudGVyID0gZ2V0WE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEluZm9ybWF0aW9uUHJlc2VudGVyKHNvdXJjZVZpZXdlcik7Ci0JCQlwcm92aWRlciA9IHhtbFByZXNlbnRlci5nZXRJbmZvcm1hdGlvblByb3ZpZGVyKElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKTsKLQkJfQotCQllbHNlIGlmICgocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSkpIHsKLQkJCS8vIEpTUCB0YWdzCi0JCQlwcm92aWRlciA9IG5ldyBKU1BJbmZvcm1hdGlvblByb3ZpZGVyKCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSB7Ci0JCQkvLyBKU1AgamF2YQotCQkJcHJvdmlkZXIgPSBuZXcgSlNQSmF2YUphdmFkb2NJbmZvcm1hdGlvblByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyOwotCX0KLQotCXByaXZhdGUgSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gZ2V0SmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IFByZWZlcmVuY2VDb25zdGFudHMuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkvKgotCQkJICogTk9URTogbnVsbCB0ZXh0IGVkaXRvciBpcyBiZWluZyBwYXNzZWQgdG8KLQkJCSAqIEphdmFTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGJlY2F1c2UKLQkJCSAqIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBkb2VzIG5vdCBrbm93IGN1cnJlbnQgZWRpdG9yLgotCQkJICogdGhpcyBpcyBva2F5IGJlY2F1c2UgZWRpdG9yIGlzIG5vdCBuZWVkZWQgaW4gdGhlIGNhc2VzIHdlIGFyZQotCQkJICogdXNpbmcgamF2YXNvdXJjZXZpZXdlcmNvbmZpZ3VyYXRpb24uCi0JCQkgKi8KLQkJCWZKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBKYXZhU291cmNlVmlld2VyQ29uZmlndXJhdGlvbihKYXZhVUkuZ2V0Q29sb3JNYW5hZ2VyKCksIHN0b3JlLCBudWxsLCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcpOwotCQl9Ci0JCXJldHVybiBmSmF2YVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9IG51bGw7Ci0KLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUNMQVJBVElPTikgewotCQkJcHJvdmlkZXJzID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUKSB7Ci0JCQlwcm92aWRlcnMgPSBnZXRIVE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHsKLQkJCXByb3ZpZGVycyA9IGdldEhUTUxTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgSUNTU1BhcnRpdGlvbnMuU1RZTEUpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEgfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCB8fCBwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTiB8fCBwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9QSSkgewotCQkJcHJvdmlkZXJzID0gZ2V0WE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YSgpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTU1FTlQgfHwgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIgfHwgcGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCB8fCBwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHsKLQkJCXByb3ZpZGVycyA9IG5ldyBMaW5lU3R5bGVQcm92aWRlcltde2dldExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YSgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckphdmEgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YSA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YTsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckpTUCA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckpTUCgpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1A7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9ySlNQRUwgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRIb3ZlciBnZXRUZXh0SG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSwgaW50IHN0YXRlTWFzaykgewotCQlJVGV4dEhvdmVyIGhvdmVyID0gbnVsbDsKLQotCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCB8fCBjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQkvLyBodG1sIGFuZCBqYXZhc2NyaXB0IHJlZ2lvbnMKLQkJCWhvdmVyID0gZ2V0SFRNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKS5nZXRUZXh0SG92ZXIoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSwgc3RhdGVNYXNrKTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50VHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkgewotCQkJLy8geG1sIHJlZ2lvbnMKLQkJCWhvdmVyID0gZ2V0WE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlLCBzdGF0ZU1hc2spOwotCQl9Ci0JCWVsc2UgaWYgKChjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCkgfHwgKGNvbnRlbnRUeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHx8IChjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSkgewotCQkJVGV4dEhvdmVyTWFuYWdlciBtYW5hZ2VyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKTsKLQkJCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcltdIGhvdmVyRGVzY3MgPSBtYW5hZ2VyLmdldFRleHRIb3ZlcnMoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgaG92ZXJEZXNjcy5sZW5ndGggJiYgaG92ZXIgPT0gbnVsbCkgewotCQkJCWlmIChob3ZlckRlc2NzW2ldLmlzRW5hYmxlZCgpICYmIEVkaXRvclV0aWxpdHkuY29tcHV0ZVN0YXRlTWFzayhob3ZlckRlc2NzW2ldLmdldE1vZGlmaWVyU3RyaW5nKCkpID09IHN0YXRlTWFzaykgewotCQkJCQlTdHJpbmcgaG92ZXJUeXBlID0gaG92ZXJEZXNjc1tpXS5nZXRJZCgpOwotCQkJCQlpZiAoVGV4dEhvdmVyTWFuYWdlci5DT01CSU5BVElPTl9IT1ZFUi5lcXVhbHNJZ25vcmVDYXNlKGhvdmVyVHlwZSkpIHsKLQkJCQkJCWlmICgoY29udGVudFR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQpIHx8IChjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSkgewotCQkJCQkJCS8vIEpTUAotCQkJCQkJCWhvdmVyID0gbWFuYWdlci5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gSlNQIEphdmEKLQkJCQkJCQlob3ZlciA9IG1hbmFnZXIuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IEpTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoVGV4dEhvdmVyTWFuYWdlci5ET0NVTUVOVEFUSU9OX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkgewotCQkJCQkJaWYgKChjb250ZW50VHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfREVGQVVMVCkgfHwgKGNvbnRlbnRUeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpKSB7Ci0JCQkJCQkJLy8gSlNQCi0JCQkJCQkJaG92ZXIgPSBuZXcgSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBKU1AgSmF2YQotCQkJCQkJCWhvdmVyID0gbmV3IEpTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQotCQkvLyBubyBhcHByb3ByaWF0ZSB0ZXh0IGhvdmVycyBmb3VuZCwgdHJ5IHN1cGVyCi0JCWlmIChob3ZlciA9PSBudWxsKQotCQkJaG92ZXIgPSBzdXBlci5nZXRUZXh0SG92ZXIoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSwgc3RhdGVNYXNrKTsKLQkJcmV0dXJuIGhvdmVyOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKTsKLQkJfQotCQlyZXR1cm4gZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9JQWN0aW9uQ29uc3RhbnRzSlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MDA3ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25Db25zdGFudHNKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25Db25zdGFudHNKU1AgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1JFTkFNRV9FTEVNRU5UID0gIlJlbmFtZUVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfTU9WRV9FTEVNRU5UID0gIk1vdmVFbGVtZW50IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0lBY3Rpb25EZWZpbml0aW9uSWRzSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwNjA3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSUFjdGlvbkRlZmluaXRpb25JZHNKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLklKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25EZWZpbml0aW9uSWRzSlNQIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBSRU5BTUVfRUxFTUVOVCA9IElKYXZhRWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5SRU5BTUVfRUxFTUVOVDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNT1ZFX0VMRU1FTlQgPSBJSmF2YUVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuTU9WRV9FTEVNRU5UOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOGIyNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0pTUFVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBKU1AgVUkKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQkKLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSlNQVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhbXBsZV9KU1BfZG9jOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUF9EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWZhY3Rvcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVFbGVtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNb3ZlRWxlbWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTW92ZUVsZW1lbnRXaXphcmQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT0s7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQX2NoYW5nZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWN0aW9uQ29udHJpYnV0b3JKU1BfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BSZW5hbWVFbGVtZW50QWN0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQTW92ZUVsZW1lbnRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSlNQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOSU5HX0ZJTEVfTVVTVF9CRV9JTlNJREVfSkFWQV9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9sYWJlbDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZE9jY3VycmVuY2VzX2xhYmVsOwkvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE92ZXJyaWRlX21ldGhvZF9pbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSmF2YV9Db250ZW50X0Fzc2lzdF9pc19ub3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUENvbG9yUGFnZV9qc3BfY29udGVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUaXRsZV9JbnZhbGlkVmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWVzc2FnZV9JbnZhbGlkVmFsdWU7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWFlYmEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkpTUFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIEpTUFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2UuanN0LmpzcC51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBzdGF0aWMgSlNQVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwkKLQkKLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yLiAKLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JCi0JLyoqIAotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBqc3AgZWRpdG9yLiAKLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgSlNQVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEpTUFVJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BVSVBsdWdpbiBnZXRJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5nZXRJbnN0YW5jZSgpOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBqc3AgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGpzcCBlZGl0b3IgdGVtcGxhdGVzCi0JICovCi0JcHVibGljIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJaWYgKGZUZW1wbGF0ZVN0b3JlID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVN0b3JlPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZShnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgSlNQVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0JCQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGpzcCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUganNwIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLlRBRyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURV9WQUxVRSk7Ci0JCQkKLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5PSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvSlNQVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWNmZTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9KU1BVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgc2FtcGxlIEpTUCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMQotIyMgV2VsY29tZSEKLSMjIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjIKLSMjIFdlbGNvbWUhCi1TYW1wbGVfSlNQX2RvYz08JUAgcGFnZSBcblx0bGFuZ3VhZ2U9XCJqYXZhXCIgXG5cdGNvbnRlbnRUeXBlPVwidGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTFcIlxuJT5cbjxqc3A6aW5jbHVkZSBmbHVzaD1cInRydWVcIiBwYWdlPVwidGl0bGVCYXIuanNwXCIvPlxuXG48JS0tIFVzZSBiZWxvdyB0YWdzIE9OTFkgZm9yIEpTUCAxLjEgLS0lPlxuPCVcblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG4lPlxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4yIC0tJT5cbjxqc3A6c2NyaXB0bGV0PlxuXHRTeXN0ZW0ub3V0LnByaW50bG4oXCJXZWxjb21lIVwiKTtcbjwvanNwOnNjcmlwdGxldD4KLUpTUF9EZWxpbWl0ZXJzX1VJXz1KU1AgRGVsaW1pdGVycwotUmVmYWN0b3JfbGFiZWw9UmVmYWN0b3IKLVJlbmFtZUVsZW1lbnRfbGFiZWw9UmVuYW1lCi1Nb3ZlRWxlbWVudF9sYWJlbD1Nb3ZlCi1Nb3ZlRWxlbWVudFdpemFyZD1Nb3ZlIHRoZSBzZWxlY3RlZCBlbGVtZW50cwotIwotT0s9T0sKLUpTUF9jaGFuZ2VzPUpTUCBjaGFuZ2VzCi1BY3Rpb25Db250cmlidXRvckpTUF8wPVJlZmEmY3RvcgotSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wPUVkaXRvciBzZWxlY3Rpb24gZG9lcyBub3QgcmVzb2x2ZSB0byBhIHJlbmFtYWJsZSBKYXZhIGVsZW1lbnQKLUpTUE1vdmVFbGVtZW50QWN0aW9uXzA9RWRpdG9yIHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIG1vdmFibGUgSmF2YSBlbGVtZW50cwotQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8wPUpTUCBSZW5hbWUKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMT1pbiBmaWxlOiB7MH0gbGluZTogezF9Ci1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzI9TW92ZSBUeXBlICcnezB9JycgdG8gcGFja2FnZSAnJ3sxfScnCi1CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzM9UmVuYW1lIE1ldGhvZCAnJ3swfScnIHRvICcnezF9JycKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfND1SZW5hbWUgVHlwZSAnJ3swfScnIHRvICcnezF9JycKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNT1SZW5hbWUgUGFja2FnZSAnJ3swfScnIHRvICcnezF9JycKLUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNj1KU1AgUmVuYW1lIENoYW5nZQotIwotX1VJX1dJWkFSRF9ORVdfVElUTEUgPSBOZXcgSmF2YVNlcnZlciBQYWdlCi1fVUlfV0laQVJEX05FV19IRUFESU5HID0gSmF2YVNlcnZlciBQYWdlCi1fVUlfV0laQVJEX05FV19ERVNDUklQVElPTiA9IENyZWF0ZSBhIG5ldyBKYXZhU2VydmVyIFBhZ2UuCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSlNQID0gVGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4gCi1fV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVCA9IEphdmFTZXJ2ZXIgUGFnZXMgY3JlYXRlZCBpbiBwcm9qZWN0cyB0aGF0IGRvIG5vdCBzdXBwb3J0IEphdmEgbWlnaHQgbm90IHdvcmsgYXMgZXhwZWN0ZWQuIAotX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5UID0gRmlsZXMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBXZWIgQ29udGVudCBmb2xkZXIgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4geW91ciBkZXBsb3llZCBXZWIgYXBwbGljYXRpb24uIAotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgSlNQIFRlbXBsYXRlCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBKU1AgcGFnZS4KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgSlNQIFRlbXBsYXRlCi1OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldwotTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV82PVRlbXBsYXRlcyBhcmUgJ05ldyBKU1AnIHRlbXBsYXRlcyBmb3VuZCBpbiB0aGUgPGE+SlNQIFRlbXBsYXRlczwvYT4gcHJlZmVyZW5jZSBwYWdlLgotIyBDb3BpZWQgZnJvbSBzc2UudWkKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLU9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMD17MH0gLSB7MX0gT2NjdXJyZW5jZXMgaW4gezJ9Ci1PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzI9ZmlsZQotQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfPUNvbnRlbnQgQXNzaXN0IG5vdCBhdmFpbGFibGUgYXQgdGhlIGN1cnJlbnQgbG9jYXRpb24KLUphdmFfQ29udGVudF9Bc3Npc3RfaXNfbm90X1VJXz1KYXZhIENvbnRlbnQgQXNzaXN0IGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoZSBjdXJyZW50IGN1cnNvciBsb2NhdGlvbgotIwotT3ZlcnJpZGVfbWV0aG9kX2luPU92ZXJyaWRlIG1ldGhvZCBpbiAnCi1DcmVhdGluZ19maWxlc19lbmNvZGluZz1DcmVhdGluZyBmaWxlcyBlbmNvZGluZyBwcmVmZXJlbmNlCi0jCi1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8wPUpTUCBTb3VyY2UgcHJlZmVyZW5jZXMgYXJlIGJhc2VkIG9uIHRoZSBjb250ZW50IHdpdGhpbiB0aGUgSlNQLgotSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMT1TZWUgPGE+Jyd7MH0nJzwvYT4gZm9yIEpTUCB3aXRoIEhUTUwgY29udGVudC4KLUpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzI9U2VlIDxhPicnezB9Jyc8L2E+IGZvciBKU1Agd2l0aCBYTUwgY29udGVudC4KLUpTUENvbG9yUGFnZV9qc3BfY29udGVudD1KU1AgQ29udGVudAotSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8wPVZhbGlkYXRpbmcgZmlsZXMKLUpTUEZpbGVzUHJlZmVyZW5jZVBhZ2VfMT1WYWxpZGF0ZSBKU1AgZnJhZ21lbnRzCi0jIEpTUCBGcmFnbWVudHMKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1ub25lCi1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE9VGhlIHByb3BlcnRpZXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwYWdlIGRpcmVjdGl2ZSB0aGF0IGNhbm5vdCBiZSBzcGVjaWZpZWQgaW4gSlNQIGZyYWdtZW50IGZpbGVzLiAgVGhlIHByb2plY3Qgc2V0dGluZyBpcyB1c2VkIGlmIHlvdSBzcGVjaWZ5ICJub25lLiIKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMj1MYW5ndWFnZToKLUpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMz1Db250ZW50IFR5cGU6Ci1KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzQ9RW5hYmxlIHNwZWNpZmljIHNldHRpbmc6Ci1Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSBwcm9wZXJ0aWVzIGZvciBKMkVFIFdlYiBwcm9qZWN0cyBhY3QgYXMgInByb2plY3QiIGRlZmF1bHQgdG8gYmUgbG9va2VkIHVwIHdoZW4gbm8gcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgSlNQIGZyYWdtZW50IGZpbGUuCi0jIENTUyBKU1AKLVRpdGxlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIFZhbHVlCi1NZXNzYWdlX0ludmFsaWRWYWx1ZT1JbnZhbGlkIHByb3BlcnR5IHZhbHVlLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWU0MjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZiBkZXNpcmVkLAotICogdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMgcGx1Z2luLiBPdGhlcgotICogcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS5qc3QuanNwLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIEBwYXJhbSBsZXZlbCBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLCBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24gZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGggL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM3OWM5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQ29uZmlndXJhYmxlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBBdXRvRWRpdFN0cmF0ZWd5IHRvIGhhbmRsZSBjaGFyYWN0ZXJzIGluc2VydGVkIHdoZW4gVGFiIGtleSBpcyBwcmVzc2VkCi0gKi8KLXB1YmxpYyBjbGFzcyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicyBpbXBsZW1lbnRzIElBdXRvRWRpdFN0cmF0ZWd5IHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUQUJfQ0hBUkFDVEVSID0gIlx0IjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkKLQkJCXJldHVybjsKLQotCQkvLyBzcGFjZXMgZm9yIHRhYiBjaGFyYWN0ZXIKLQkJaWYgKGNvbW1hbmQubGVuZ3RoID09IDAgJiYgY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKSAhPSAtMSkKLQkJCXNtYXJ0SW5zZXJ0Rm9yVGFiKGNvbW1hbmQsIGRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgc3BhY2VzIGZvciB0YWJzCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmQKLQkgKi8KLQlwcml2YXRlIHZvaWQgc21hcnRJbnNlcnRGb3JUYWIoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQkvLyB0YWIga2V5IHdhcyBwcmVzc2VkLiBub3cgY2hlY2sgcHJlZmVyZW5jZXMgdG8gc2VlIGlmIG5lZWQgdG8gaW5zZXJ0Ci0JCS8vIHNwYWNlcyBpbnN0ZWFkIG9mIHRhYgotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IGdldEluZGVudGF0aW9uV2lkdGgoKTsKLQkJaWYgKGluZGVudGF0aW9uV2lkdGggPiAtMSkgewotCQkJU3RyaW5nIG9yaWdpbmFsVGV4dCA9IGNvbW1hbmQudGV4dDsKLQkJCVN0cmluZ0J1ZmZlciBuZXdUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcihvcmlnaW5hbFRleHQpOwotCi0JCQkvLyBkZXRlcm1pbmUgd2hlcmUgaW4gbGluZSB0aGlzIGNvbW1hbmQgYmVnaW5zCi0JCQlpbnQgbGluZU9mZnNldCA9IC0xOwotCQkJdHJ5IHsKLQkJCQlJUmVnaW9uIGxpbmVJbmZvID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoY29tbWFuZC5vZmZzZXQpOwotCQkJCWxpbmVPZmZzZXQgPSBjb21tYW5kLm9mZnNldCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQotCQkJSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gZ2V0TGluZVRyYWNrZXIoZG9jdW1lbnQsIG9yaWdpbmFsVGV4dCk7Ci0KLQkJCWludCBzdGFydEluZGV4ID0gMDsKLQkJCWludCBpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCVN0cmluZyBpbmRlbnQgPSBnZXRJbmRlbnRTdHJpbmcoaW5kZW50YXRpb25XaWR0aCwgbGluZU9mZnNldCwgbGluZVRyYWNrZXIsIGluZGV4KTsKLQotCQkJCS8vIHJlcGxhY2UgXHQgY2hhcmFjdGVyIHdpdGggc3BhY2VzCi0JCQkJbmV3VGV4dC5yZXBsYWNlKGluZGV4LCBpbmRleCArIDEsIGluZGVudCk7Ci0JCQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWxpbmVUcmFja2VyLnJlcGxhY2UoaW5kZXgsIDEsIGluZGVudCk7Ci0JCQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggcmVwbGFjaW5nIHRleHQsIGp1c3QKLQkJCQkJCS8vIHJlc2V0IHRvIGN1cnJlbnQgc3RyaW5nCi0JCQkJCQlsaW5lVHJhY2tlci5zZXQobmV3VGV4dC50b1N0cmluZygpKTsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXN0YXJ0SW5kZXggPSBpbmRleCArIGluZGVudC5sZW5ndGgoKTsKLQkJCQlpbmRleCA9IG5ld1RleHQuaW5kZXhPZihUQUJfQ0hBUkFDVEVSLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWNvbW1hbmQudGV4dCA9IG5ld1RleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBudW1iZXIgb2Ygc3BhY2VzIGZvciBuZXh0IHRhYiBzdG9wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKGludCBpbmRlbnRhdGlvbldpZHRoLCBpbnQgbGluZU9mZnNldCwgSUxpbmVUcmFja2VyIGxpbmVUcmFja2VyLCBpbnQgaW5kZXgpIHsKLQkJaW50IGluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoOwotCQlpbnQgb2Zmc2V0SW5MaW5lID0gLTE7Ci0JCWlmIChsaW5lVHJhY2tlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBsaW5lVHJhY2tlci5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbmRleCk7Ci0JCQkJaWYgKGxpbmVJbmZvLmdldE9mZnNldCgpID09IDAgJiYgbGluZU9mZnNldCA+IC0xKQotCQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQkJZWxzZQotCQkJCQlvZmZzZXRJbkxpbmUgPSBpbmRleCAtIGxpbmVJbmZvLmdldE9mZnNldCgpOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmIChsaW5lT2Zmc2V0ID4gLTEpIHsKLQkJCQlvZmZzZXRJbkxpbmUgPSBsaW5lT2Zmc2V0ICsgaW5kZXg7Ci0JCQl9Ci0JCX0KLQkJaWYgKG9mZnNldEluTGluZSA+IC0xICYmIGluZGVudGF0aW9uV2lkdGggPiAwKSB7Ci0JCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQkJCWluZGVudFNpemUgPSBpbmRlbnRhdGlvbldpZHRoIC0gcmVtYWluZGVyOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRTaXplOyBpKyspCi0JCQlpbmRlbnQuYXBwZW5kKCcgJyk7Ci0JCXJldHVybiBpbmRlbnQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYSBsaW5lIHRyYWNrZXIgZm9yIHRleHQgd2l0aGluIGNvbW1hbmQgaWYgdGV4dCBpcyBtdWx0aS1saW5lCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0TGluZVRyYWNrZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgb3JpZ2luYWxUZXh0KSB7Ci0JCUNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyIGxpbmVUcmFja2VyID0gbnVsbDsKLQkJaW50W10gZGVsaW1zID0gVGV4dFV0aWxpdGllcy5pbmRleE9mKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgb3JpZ2luYWxUZXh0LCAwKTsKLQkJaWYgKGRlbGltc1swXSAhPSAtMSB8fCBkZWxpbXNbMV0gIT0gLTEpIHsKLQkJCWxpbmVUcmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSk7Ci0JCQlsaW5lVHJhY2tlci5zZXQob3JpZ2luYWxUZXh0KTsKLQkJfQotCQlyZXR1cm4gbGluZVRyYWNrZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWN0aXZlIGVkaXRvciBpcyBpbiBzbWFydCBpbnNlcnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQkJCQllbHNlCi0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgc21hcnQgaW5zZXJ0IG1vZGUKLQkJaWYgKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKQotCQkJaXNTbWFydEluc2VydE1vZGUgPSB0cnVlOwotCQlyZXR1cm4gaXNTbWFydEluc2VydE1vZGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmRlbnRhdGlvbiB3aWR0aCBpZiB1c2luZyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLCAtMSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZW50YXRpb25XaWR0aCgpIHsKLQkJaW50IHdpZHRoID0gLTE7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKQotCQkJd2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJcmV0dXJuIHdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9hdXRvZWRpdC9TdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2Njg4YzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50Q29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SlNQIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXB1YmxpYyB2b2lkIGN1c3RvbWl6ZURvY3VtZW50Q29tbWFuZChJRG9jdW1lbnQgZG9jdW1lbnQsIERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCU9iamVjdCB0ZXh0RWRpdG9yID0gZ2V0QWN0aXZlVGV4dEVkaXRvcigpOwotCQlpZiAoISh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zICYmICgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCi0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmIChjb21tYW5kLnRleHQgIT0gbnVsbCkgewotCQkJCQlpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIHNjcmlwdGxldCAtIGFkZCBlbmQgJT4KLQkJCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIG1vZGVsLmdldEluZGV4ZWRSZWdpb24oY29tbWFuZC5vZmZzZXQpOwotCQkJCQkJaWYgKHByZWZpeGVkV2l0aChkb2N1bWVudCwgY29tbWFuZC5vZmZzZXQsICI8IikgJiYgIW5vZGUuZ2V0U291cmNlKCkuZW5kc1dpdGgoIiU+IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJY29tbWFuZC50ZXh0ICs9ICIgJT4iOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJY29tbWFuZC5zaGlmdHNDYXJldCA9IGZhbHNlOwotCQkJCQkJCWNvbW1hbmQuY2FyZXRPZmZzZXQgPSBjb21tYW5kLm9mZnNldCArIDE7Ci0JCQkJCQkJY29tbWFuZC5kb2l0ID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoInsiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNvbW1hbmQub2Zmc2V0KTsKLQkJCQkJCWlmICgocHJlZml4ZWRXaXRoKGRvY3VtZW50LCBjb21tYW5kLm9mZnNldCwgIiQiKSB8fCBwcmVmaXhlZFdpdGgoZG9jdW1lbnQsIGNvbW1hbmQub2Zmc2V0LCAiIyIpKSAmJiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCSFub2RlLmdldFNvdXJjZSgpLmVuZHNXaXRoKCJ9IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJY29tbWFuZC50ZXh0ICs9ICIgfSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljb21tYW5kLnNoaWZ0c0NhcmV0ID0gZmFsc2U7Ci0JCQkJCQkJY29tbWFuZC5jYXJldE9mZnNldCA9IGNvbW1hbmQub2Zmc2V0ICsgMTsKLQkJCQkJCQljb21tYW5kLmRvaXQgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY3RpdmUgdGV4dCBlZGl0b3IgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0aGUgYWN0aXZlIGVkaXRvcgotCSAqIHBhcnQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgT2JqZWN0IGdldEFjdGl2ZVRleHRFZGl0b3IoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJCWlmICh0ZXh0RWRpdG9yICE9IG51bGwpCi0JCQkJCQlyZXR1cm4gdGV4dEVkaXRvcjsKLQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHByZWZpeGVkV2l0aChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmcpIHsKLQotCQl0cnkgewotCQkJcmV0dXJuIGRvY3VtZW50LmdldExlbmd0aCgpID49IHN0cmluZy5sZW5ndGgoKSAmJiBkb2N1bWVudC5nZXQob2Zmc2V0IC0gc3RyaW5nLmxlbmd0aCgpLCBzdHJpbmcubGVuZ3RoKCkpLmVxdWFscyhzdHJpbmcpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0Fic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9BYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDc0NzcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0Fic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmJyZWFrcG9pbnRwcm92aWRlcnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnRsZC5wcm92aXNpb25hbC5UTERFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Ob2RlV3JhcHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5JRE9NU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogQWJzdHJhY3QgYnJlYWtwb2ludCBwcm92aWRlciBjbGFzcyB3aGljaCBpbXBsZW1lbnRzIGJyZWFrcG9pbnQgcHJvdmlkZXIKLSAqIGludGVyZmFjZS4KLSAqIAotICogVGhpcyBpcyBhIHRlbXBvcmFyeSBjbGFzcyBmb3IgSmF2YUJyZWFrcG9pbnRQcm92aWRlciBhbmQKLSAqIEphdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIsIGFuZCBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBzZXBhcmF0ZSBKYXZhIGFuZAotICogSmF2YVNjcmlwdCBwYXJ0cy4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyIGltcGxlbWVudHMgSUJyZWFrcG9pbnRQcm92aWRlciB7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfTElORSA9IC0xOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEpBVkEgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IEpBVkFTQ1JJUFQgPSAyOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUyA9IG5ldyBTdHJpbmdbXXsiamF2YXNjcmlwdCIsICJqYXZhc2NyaXB0MS4wIiwgImphdmFzY3JpcHQxLjFfMyIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJImphdmFzY3JpcHQxLjIiLCAiamF2YXNjcmlwdDEuMyIsICJqYXZhc2NyaXB0MS40IiwgImphdmFzY3JpcHQxLjUiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJImphdmFzY3JpcHQxLjYiLCAianNjcmlwdCIsICJzYXNoc2NyaXB0In07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfUEFHRSA9ICJqc3A6ZGlyZWN0aXZlLnBhZ2UiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBOT19WQUxJRF9DT05URU5UID0gLTI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgVU5TVVBQT1JURUQgPSAwOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZ1tdIGhheXN0YWNrLCBTdHJpbmcgbmVlZGxlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaGF5c3RhY2subGVuZ3RoOyBpKyspIHsKLQkJCWlmIChoYXlzdGFja1tpXS5lcXVhbHMobmVlZGxlKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIFJldHVybiB0aGUgcGFnZSBsYW5ndWFnZQotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgaW50IGdldFBhZ2VMYW5ndWFnZShEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIFVOU1VQUE9SVEVEOwotCi0JCU5vZGVMaXN0IHBhZ2VEaXJlY3RpdmVzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUF9ESVJFQ1RJVkVfUEFHRSk7Ci0JCS8vIFNlYXJjaCBmb3IgZmlyc3QgbGFuZ3VhZ2UgZGlyZWN0aXZlCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZURpcmVjdGl2ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBjaGlsZCA9IHBhZ2VEaXJlY3RpdmVzLml0ZW0oaSk7Ci0JCQlOb2RlIGxhbmd1YWdlQXR0ciA9IGNoaWxkLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oImxhbmd1YWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChsYW5ndWFnZUF0dHIgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwYWdlTGFuZ3VhZ2UgPSBsYW5ndWFnZUF0dHIuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJaWYgKHBhZ2VMYW5ndWFnZSA9PSBudWxsIHx8IHBhZ2VMYW5ndWFnZS5sZW5ndGgoKSA9PSAwKQotCQkJCQlyZXR1cm4gVU5TVVBQT1JURUQ7Ci0JCQkJcGFnZUxhbmd1YWdlID0gcGFnZUxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7Ci0JCQkJaWYgKGNvbnRhaW5zKEpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUywgcGFnZUxhbmd1YWdlKSkKLQkJCQkJcmV0dXJuIEpBVkFTQ1JJUFQ7Ci0JCQkJZWxzZSBpZiAocGFnZUxhbmd1YWdlLmVxdWFscygiamF2YSIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIEpBVkE7Ci0JCQkJZWxzZQotCQkJCQlyZXR1cm4gVU5TVVBQT1JURUQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIEpBVkE7IC8vIEphdmEgaXMgZGVmYXVsdCBpZiBubyBsYW5ndWFnZSBkaXJlY3RpdmUKLQl9Ci0KLQkvKgotCSAqIFNlYXJjaCB0aGUgUmVnaW9uQ29udGFpbmVyJ3MgcmVnaW9ucyBsb29raW5nIGZvciBKU1AgY29udGVudC4gSWYgdmFsaWQKLQkgKiBjb250ZW50IGlzIGZvdW5kLCByZXR1cm4gdGhlIHBvc2l0aW9uID49IDAgSWYgbm8gdmFsaWQgY29udGVudCBpcwotCSAqIGZvdW5kLCByZXR1cm4gTk9fVkFMSURfQ09OVEVOVC4gSWYgYSByZWdpb24gc3RhcnRzIGFmdGVyIHRoZSBsaW5lJ3MKLQkgKiBlbmRPZmZzZXQsIHJldHVybiBFTkRfT0ZfTElORS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0VmFsaWRSZWdpb25Qb3NpdGlvbihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uQ29udGFpbmVyLCBpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHJlZ2lvbkNvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJaW50IHZhbGlkUG9zaXRpb24gPSBnZXRWYWxpZFJlZ2lvblBvc2l0aW9uKG1vZGVsLCAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24sIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCQkJCWlmICh2YWxpZFBvc2l0aW9uID09IEVORF9PRl9MSU5FIHx8IHZhbGlkUG9zaXRpb24gPj0gMCkKLQkJCQkJcmV0dXJuIHZhbGlkUG9zaXRpb247Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyByZWdpb24gbXVzdCBiZSBhdCBsZWFzdCBwYXJ0aWFsbHkgb24gc2VsZWN0ZWQgbGluZQotCQkJCWlmIChyZWdpb25Db250YWluZXIuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPiBzdGFydE9mZnNldCkgewotCi0JCQkJCWludCByZWdpb25TdGFydE9mZnNldCA9IHJlZ2lvbkNvbnRhaW5lci5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkvLyBpZiByZWdpb24gc3RhcnRzIGFmdGVyIGxpbmUncyBlbmRPZmZzZXQsIHdlJ3JlIGRvbmUKLQkJCQkJLy8gc2VhcmNoaW5nCi0JCQkJCWlmIChyZWdpb25TdGFydE9mZnNldCA+IGVuZE9mZnNldCkKLQkJCQkJCXJldHVybiBFTkRfT0ZfTElORTsKLQotCQkJCQkvLyBJZiByZWdpb24gaXMgSlNQIGNvbnRlbnQsIG1ha2Ugc3VyZSB0aGUgbGFuZ3VhZ2UgaXMKLQkJCQkJLy8gSmF2YSBub3QgSmF2YXNjcmlwdCBieQotCQkJCQkvLyBjaGVja2luZyB0aGUgY29udGVudCBhc3Npc3QgYWRhcHRlcidzIHR5cGUuCi0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCkpIHsKLQkJCQkJCS8vIERXTTogdGhpcyBsb2dpYyBpcyBub3QgaW5jb3JyZWN0IC4uLiBnaXZlbiBjaGFuZ2VzCi0JCQkJCQkvLyB0byBhZGFwdGVycywgZXRjLgotCQkJCQkJLy8gYnV0IHByb2JhYmx5IGRvbid0IG5lZWQgYW55dGhpbmcgaGVyZSwgc2luY2UgYm90aAotCQkJCQkJLy8gSmF2YSBhbmQgSmF2YVNjcmlwdAotCQkJCQkJLy8gYXJlIHN1cHBvcnRlZCBpbiBWNS4KLQotCQkJCQkJLy8gbnNkX1RPRE86IHZlcmlmeSB0aGlzISEhCi0KLQkJCQkJCS8vIElOb2RlTm90aWZpZXIgbm90aWZpZXIgPQotCQkJCQkJLy8gKElOb2RlTm90aWZpZXIpbW9kZWwuZ2V0Tm9kZShyZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCQkvLyBJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9Ci0JCQkJCQkvLyBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKENvbnRlbnRBc3Npc3RBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCS8vIGlmKGZhY3RvcnkgaW5zdGFuY2VvZgotCQkJCQkJLy8gSFRNTENvbnRlbnRBc3Npc3RBZGFwdGVyRmFjdG9yeSkgewotCQkJCQkJLy8gSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPQotCQkJCQkJLy8gKChIVE1MQ29udGVudEFzc2lzdEFkYXB0ZXJGYWN0b3J5KWZhY3RvcnkpLmNyZWF0ZUFkYXB0ZXIobm90aWZpZXIsCi0JCQkJCQkvLyByZWdpb24pOwotCQkJCQkJLy8gaWYoYWRhcHRlciAhPSBudWxsICYmIGFkYXB0ZXIgaW5zdGFuY2VvZgotCQkJCQkJLy8gSlNQSmF2YUNvbnRlbnRBc3Npc3RBZGFwdGVyKQotCi0JCQkJCQlpZiAocmVnaW9uU3RhcnRPZmZzZXQgPiBzdGFydE9mZnNldCkKLQkJCQkJCQlyZXR1cm4gcmVnaW9uU3RhcnRPZmZzZXQ7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCQkJCQkJLy8gfQotCQkJCQl9Ci0JCQkJCS8vIGEgY3VzdG9tIHRhZywganNwOnVzZUJlYW4sIGdldHByb3BlcnR5IG9yIHNldHByb3BlcnR5Ci0JCQkJCS8vIHN0YXRlbWVudCBpcyBhbHNvIGEgdmFsaWQgYnJlYWtwb2ludCBsb2NhdGlvbgotCQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgJiYgKGlzQ3VzdG9tVGFnUmVnaW9uKG1vZGVsLmdldEluZGV4ZWRSZWdpb24ocmVnaW9uU3RhcnRPZmZzZXQpKSB8fCByZWdpb25Db250YWluZXIuZ2V0VGV4dChyZWdpb24pLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKSB8fCByZWdpb25Db250YWluZXIuZ2V0VGV4dChyZWdpb24pLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSkgfHwgcmVnaW9uQ29udGFpbmVyLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VUUFJPUEVSVFkpKSkgewotCi0JCQkJCQlpZiAocmVnaW9uU3RhcnRPZmZzZXQgPiBzdGFydE9mZnNldCkKLQkJCQkJCQlyZXR1cm4gcmVnaW9uU3RhcnRPZmZzZXQ7Ci0JCQkJCQllbHNlCi0JCQkJCQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gRGVmZWN0ICMyNDEwOTAsIHRoZSBUZXh0IE5vZGVzIGluc2lkZSBvZiBKU1AKLQkJCQkJCS8vIHNjcmlwdGxldHMsIGV4cHJlc3Npb25zLCBhbmQgZGVjbGFyYXRpb25zIGFyZSB2YWxpZAotCQkJCQkJLy8gYnJlYWtwb2ludC1hYmxlIGxvY2F0aW9ucwotCQkJCQkJYm9vbGVhbiBpc0NvZGVOb2RlID0gZmFsc2U7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5vZGUgPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvblN0YXJ0T2Zmc2V0KTsKLQkJCQkJCWlmIChub2RlICE9IG51bGwgJiYgbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCQlOb2RlIGRvbU5vZGUgPSAoTm9kZSkgbm9kZTsKLQkJCQkJCQlOb2RlIHJvb3QgPSBkb21Ob2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCQlpZiAocm9vdCAhPSBudWxsICYmIHJvb3QuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCkgJiYgZG9tTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIGRvbU5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQkJCQkJU3RyaW5nIHBhcmVudE5hbWUgPSBkb21Ob2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCQlpc0NvZGVOb2RlID0gcGFyZW50TmFtZS5lcXVhbHMoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUKSB8fCBwYXJlbnROYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5FWFBSRVNTSU9OKSB8fCBwYXJlbnROYW1lLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUNMQVJBVElPTik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJaWYgKGlzQ29kZU5vZGUpIHsKLQkJCQkJCQlpZiAocmVnaW9uU3RhcnRPZmZzZXQgPiBzdGFydE9mZnNldCkKLQkJCQkJCQkJcmV0dXJuIHJlZ2lvblN0YXJ0T2Zmc2V0OwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDdXN0b21UYWdSZWdpb24oSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlFbGVtZW50IHhtbEVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHhtbEVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih4bWxFbGVtZW50KTsKLQkJCWlmIChkZWNsIGluc3RhbmNlb2YgQ01Ob2RlV3JhcHBlcikgewotCQkJCUNNTm9kZSBjbU5vZGUgPSAoKENNTm9kZVdyYXBwZXIpIGRlY2wpLmdldE9yaWdpbk5vZGUoKTsKLQkJCQlyZXR1cm4gY21Ob2RlIGluc3RhbmNlb2YgVExERWxlbWVudERlY2xhcmF0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGZTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotCi0KLQlwcm90ZWN0ZWQgSVJlc291cmNlIGdldEVkaXRvcklucHV0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpOwotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkgewotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElSZXNvdXJjZS5jbGFzcyk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBJU291cmNlRWRpdGluZ1RleHRUb29scyBnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkgewotCQlyZXR1cm4gZlNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRWYWxpZFBvc2l0aW9uKElEb2N1bWVudCBpZG9jLCBpbnQgbGluZU51bWJlcikgewotCQlpZiAoIShnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkgaW5zdGFuY2VvZiBJRE9NU291cmNlRWRpdGluZ1RleHRUb29scykpIHsKLQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCQl9Ci0JCWlmIChpZG9jID09IG51bGwpCi0JCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQotCQlpbnQgc3RhcnRPZmZzZXQsIGVuZE9mZnNldDsKLQkJdHJ5IHsKLQkJCXN0YXJ0T2Zmc2V0ID0gaWRvYy5nZXRMaW5lT2Zmc2V0KGxpbmVOdW1iZXIgLSAxKTsKLQkJCWVuZE9mZnNldCA9IGlkb2MuZ2V0TGluZU9mZnNldChsaW5lTnVtYmVyKSAtIDE7Ci0KLQkJCWlmIChpZG9jID09IG51bGwpCi0JCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0JCQlTdHJpbmcgbGluZVRleHQgPSBpZG9jLmdldChzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpLnRyaW0oKTsKLQotCQkJLy8gYmxhbmsgbGluZXMgb3IgbGluZXMgd2l0aCBvbmx5IGFuIG9wZW4gb3IgY2xvc2UgYnJhY2Ugb3IKLQkJCS8vIHNjcmlwdGxldCB0YWcgY2Fubm90IGhhdmUgYSBicmVha3BvaW50Ci0JCQlpZiAobGluZVRleHQuZXF1YWxzKCIiKSB8fCBsaW5lVGV4dC5lcXVhbHMoInsiKSB8fCAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJbGluZVRleHQuZXF1YWxzKCJ9IikgfHwgbGluZVRleHQuZXF1YWxzKCI8JSIpKS8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBOT19WQUxJRF9DT05URU5UOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgaWRvYykuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnRPZmZzZXQpOwotCQkvLyBnbyB0aHJvdWdoIHRoZSBub2RlJ3MgcmVnaW9ucyBsb29raW5nIGZvciBKU1AgY29udGVudAotCQkvLyB1bnRpbCByZWFjaGluZyB0aGUgZW5kIG9mIHRoZSBsaW5lCi0JCXdoaWxlIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlpbnQgdmFsaWRQb3NpdGlvbiA9IGdldFZhbGlkUmVnaW9uUG9zaXRpb24oKChJRE9NRG9jdW1lbnQpICgoSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGdldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKSkuZ2V0RE9NRG9jdW1lbnQoKSkuZ2V0TW9kZWwoKSwgZmxhdE5vZGUsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCi0JCQlpZiAodmFsaWRQb3NpdGlvbiA9PSBFTkRfT0ZfTElORSkKLQkJCQlyZXR1cm4gTk9fVkFMSURfQ09OVEVOVDsKLQotCQkJaWYgKHZhbGlkUG9zaXRpb24gPj0gMCkKLQkJCQlyZXR1cm4gdmFsaWRQb3NpdGlvbjsKLQotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIE5PX1ZBTElEX0NPTlRFTlQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U291cmNlRWRpdGluZ1RleHRUb29scyhJU291cmNlRWRpdGluZ1RleHRUb29scyBzb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSB7Ci0JCWZTb3VyY2VFZGl0aW5nVGV4dFRvb2xzID0gc291cmNlRWRpdGluZ1RleHRUb29sczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhQnJlYWtwb2ludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhQnJlYWtwb2ludFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzYwNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy5jb3JlLkpESURlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5JRE9NU291cmNlRWRpdGluZ1RleHRUb29sczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEEgQnJlYWtwb2ludFByb3ZpZGVyIHN1cHBvcnRpbmcgc2VydmVyLXNpZGUgSmF2YSBhcyBhIEpTUCBsYW5ndWFnZQotICogCi0gKiBAZGVwcmVjYXRlZAotICovCi1wdWJsaWMgY2xhc3MgSmF2YUJyZWFrcG9pbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0QnJlYWtwb2ludFByb3ZpZGVyIHsKLQotCS8qCi0JICogQHBhcmFtIHJlcyBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRUeXBlTmFtZShJUmVzb3VyY2UgcmVzKSB7Ci0JCUlQYXRoIHBhdGggPSByZXMuZ2V0RnVsbFBhdGgoKTsKLQkJLy8gQXNzdW1lIHVuZGVyIFdlYiBDb250ZW50IGZvbGRlciBpZiBtb3JlIHRoYW4gMiBzZWdtZW50cwotCQlpZiAocGF0aC5zZWdtZW50Q291bnQoKSA+IDIpIHsKLQkJCXBhdGggPSBwYXRoLnJlbW92ZUZpcnN0U2VnbWVudHMoMik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXRoID0gcGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKDEpOwotCQl9Ci0JCVN0cmluZyB0eXBlTmFtZSA9IHBhdGgudG9TdHJpbmcoKS5yZXBsYWNlKElQYXRoLlNFUEFSQVRPUiwgJy4nKTsKLQkJaWYgKHJlcy5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotCQkJdHlwZU5hbWUgPSB0eXBlTmFtZS5zdWJzdHJpbmcoMCwgdHlwZU5hbWUubGFzdEluZGV4T2YoJy4nKSk7Ci0JCX0KLQkJcmV0dXJuIHR5cGVOYW1lOwotCX0KLQotCi0KLQlwdWJsaWMgSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpbnQgcG9zID0gZ2V0VmFsaWRQb3NpdGlvbihkb2N1bWVudCwgbGluZU51bWJlcik7Ci0JCWlmIChwb3MgIT0gTk9fVkFMSURfQ09OVEVOVCkgewotCQkJSVJlc291cmNlIHJlcyA9IGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUocmVzKTsKLQkJCQl0cnkgewotCQkJCQlKRElEZWJ1Z01vZGVsLmNyZWF0ZUxpbmVCcmVha3BvaW50KHJlcywgdHlwZU5hbWUsIGxpbmVOdW1iZXIsIHBvcywgcG9zLCAwLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlyZXR1cm4gZS5nZXRTdGF0dXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlNQVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIEpTUFVJTWVzc2FnZXMuT0ssIG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuQWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgTm9kZSBub2RlLCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgewotCQlJUmVzb3VyY2UgcmVzID0gaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0ID8gKChJRmlsZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0RmlsZSgpIDogbnVsbDsKLQkJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJaWYgKGdldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKSBpbnN0YW5jZW9mIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSB7Ci0JCQlkb2MgPSAoKElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBnZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkpLmdldERPTURvY3VtZW50KCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzICE9IG51bGwgJiYgIWlzQnJlYWtwb2ludEV4aXN0KHJlcywgbGluZU51bWJlcikgJiYgaXNWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBsaW5lTnVtYmVyKSAmJiAoZ2V0UGFnZUxhbmd1YWdlKGRvYykgPT0gSkFWQSk7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCX0KLQotCS8qCi0JICogQHBhcmFtIHJlcyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNCcmVha3BvaW50RXhpc3QoSVJlc291cmNlIHJlcywgaW50IGxpbmVOdW1iZXIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBKRElEZWJ1Z01vZGVsLmxpbmVCcmVha3BvaW50RXhpc3RzKGdldFR5cGVOYW1lKHJlcyksIGxpbmVOdW1iZXIpICE9IG51bGw7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAcGFyYW0gZG9jIEBwYXJhbSBpZG9jIEBwYXJhbSBsaW5lTnVtYmVyIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUG9zaXRpb24oSURvY3VtZW50IGlkb2MsIGludCBsaW5lTnVtYmVyKSB7Ci0JCXJldHVybiBnZXRWYWxpZFBvc2l0aW9uKGlkb2MsIGxpbmVOdW1iZXIpICE9IE5PX1ZBTElEX0NPTlRFTlQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVNjcmlwdEJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzIyOTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9icmVha3BvaW50cHJvdmlkZXJzL0phdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBIElCcmVha3BvaW50UHJvdmlkZXIgc3VwcG9ydGluZyBzZXJ2ZXItc2lkZSBKYXZhU2NyaXB0IGFzIGEgSlNQIGxhbmd1YWdlCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEphdmFTY3JpcHRCcmVha3BvaW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEJyZWFrcG9pbnRQcm92aWRlciB7Ci0JcHVibGljIGJvb2xlYW4gY2FuQWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHsKLQkJSVJlc291cmNlIHJlcyA9IGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlyZXR1cm4gcmVzICE9IG51bGwgJiYgIWlzQnJlYWtwb2ludEV4aXN0KHJlcywgbGluZU51bWJlcikgJiYgaXNWYWxpZFBvc2l0aW9uKGRvY3VtZW50LCBsaW5lTnVtYmVyKSAmJiAoZ2V0UGFnZUxhbmd1YWdlKGRvYykgIT0gSkFWQSk7Ci0JfQotCi0KLQlwdWJsaWMgSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgewotCQlpbnQgcG9zID0gZ2V0VmFsaWRQb3NpdGlvbihkb2N1bWVudCwgbGluZU51bWJlcik7Ci0JCWlmIChwb3MgIT0gTk9fVkFMSURfQ09OVEVOVCAmJiBjYW5BZGRCcmVha3BvaW50KGRvY3VtZW50LCBpbnB1dCwgbGluZU51bWJlciwgb2Zmc2V0KSkgewotCQkJSVJlc291cmNlIHJlcyA9IGdldEVkaXRvcklucHV0UmVzb3VyY2UoaW5wdXQpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJbmV3IEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludChyZXMsIGxpbmVOdW1iZXIsIHBvcywgcG9zKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgSlNQVUlNZXNzYWdlcy5PSywgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEBwYXJhbSByZXMgQHBhcmFtIGxpbmVOdW1iZXIgQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQnJlYWtwb2ludEV4aXN0KElSZXNvdXJjZSByZXMsIGludCBsaW5lTnVtYmVyKSB7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCUlCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBtYW5hZ2VyLmdldEJyZWFrcG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghKGJyZWFrcG9pbnRzW2ldIGluc3RhbmNlb2YgSmF2YXNjcmlwdExpbmVCcmVha3BvaW50KSkKLQkJCQljb250aW51ZTsKLQkJCUphdmFzY3JpcHRMaW5lQnJlYWtwb2ludCBicmVha3BvaW50ID0gKEphdmFzY3JpcHRMaW5lQnJlYWtwb2ludCkgYnJlYWtwb2ludHNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChicmVha3BvaW50LmdldFJlc291cmNlKCkuZXF1YWxzKHJlcykgJiYgYnJlYWtwb2ludC5nZXRMaW5lTnVtYmVyKCkgPT0gbGluZU51bWJlcikgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHBhcmFtIGRvYyBAcGFyYW0gaWRvYyBAcGFyYW0gbGluZU51bWJlciBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFBvc2l0aW9uKElEb2N1bWVudCBpZG9jLCBpbnQgbGluZU51bWJlcikgewotCQlyZXR1cm4gZ2V0VmFsaWRQb3NpdGlvbihpZG9jLCBsaW5lTnVtYmVyKSAhPSBOT19WQUxJRF9DT05URU5UOwotCX0KLQotCXB1YmxpYyBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCXJldHVybiBnZXRFZGl0b3JJbnB1dFJlc291cmNlKGlucHV0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YVN0cmF0dW1CcmVha3BvaW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmYWM4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhU3RyYXR1bUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5icmVha3BvaW50cHJvdmlkZXJzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5kZWJ1Zy5jb3JlLkpESURlYnVnTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci0KLS8qKgotICogQSBJQnJlYWtwb2ludFByb3ZpZGVyIHN1cHBvcnRpbmcgSlNQIGJyZWFrcG9pbnRzIGZvciBhIE5vbi1KYXZhIExhbmd1YWdlCi0gKiBTb3VyY2UgSlNQIHBhZ2UKLSAqLwotcHVibGljIGNsYXNzIEphdmFTdHJhdHVtQnJlYWtwb2ludFByb3ZpZGVyIGltcGxlbWVudHMgSUJyZWFrcG9pbnRQcm92aWRlciwgSUV4ZWN1dGFibGVFeHRlbnNpb24gewotCXByaXZhdGUgU3RyaW5nIGZDbGFzc1BhdHRlcm4gPSBudWxsOwotCi0JcHVibGljIElTdGF0dXMgYWRkQnJlYWtwb2ludChJRG9jdW1lbnQgZG9jdW1lbnQsIElFZGl0b3JJbnB1dCBpbnB1dCwgaW50IGVkaXRvckxpbmVOdW1iZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSB2YWxpZCBwb3NpdGlvbiB0byBzZXQgYnJlYWtwb2ludAotCQlpbnQgcG9zID0gZ2V0VmFsaWRQb3NpdGlvbihkb2N1bWVudCwgZWRpdG9yTGluZU51bWJlcik7Ci0JCUlTdGF0dXMgc3RhdHVzID0gbnVsbDsKLQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQlJUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2VGcm9tSW5wdXQoaW5wdXQpOwotCQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHBhdGggPSBudWxsOyAvL3Jlcy5nZXROYW1lKCk7Ly8gcmVzLmdldEZ1bGxQYXRoKCkucmVtb3ZlRmlyc3RTZWdtZW50cygyKS50b1N0cmluZygpOwotCQkJCUlCcmVha3BvaW50IHBvaW50ID0gSkRJRGVidWdNb2RlbC5jcmVhdGVTdHJhdHVtQnJlYWtwb2ludChyZXMsICJKU1AiLCByZXMuZ2V0TmFtZSgpLCBwYXRoLCBnZXRDbGFzc1BhdHRlcm4ocmVzKSwgZWRpdG9yTGluZU51bWJlciwgcG9zLCBwb3MsIDAsIHRydWUsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBvaW50ID09IG51bGwpIHsKLQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgInVuc3VwcG9ydGVkIGlucHV0IHR5cGUiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCS8vIEZvciBub24tcmVzb3VyY2VzLCB1c2UgdGhlIHdvcmtzcGFjZSByb290IGFuZCBhIGNvb3JkaW5hdGVkCi0JCQkJLy8gYXR0cmlidXRlIHRoYXQgaXMgdXNlZCB0bwotCQkJCS8vIHByZXZlbnQgdW53YW50ZWQgKGJyZWFrcG9pbnQpIG1hcmtlcnMgZnJvbSBiZWluZyBsb2FkZWQKLQkJCQkvLyBpbnRvIHRoZSBlZGl0b3JzLgotCQkJCXJlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQkJU3RyaW5nIGlkID0gaW5wdXQuZ2V0TmFtZSgpOwotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQgJiYgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpICE9IG51bGwgJiYgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkgIT0gbnVsbCkgewotCQkJCQlpZCA9ICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlhdHRyaWJ1dGVzLnB1dChTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwuU0VDT05EQVJZX0lEX0tFWSwgaWQpOwotCQkJCVN0cmluZyBwYXRoID0gbnVsbDsKLQkJCQlJQnJlYWtwb2ludCBwb2ludCA9IEpESURlYnVnTW9kZWwuY3JlYXRlU3RyYXR1bUJyZWFrcG9pbnQocmVzLCAiSlNQIiwgaW5wdXQuZ2V0TmFtZSgpLCBwYXRoLCBnZXRDbGFzc1BhdHRlcm4ocmVzKSwgZWRpdG9yTGluZU51bWJlciwgcG9zLCBwb3MsIDAsIHRydWUsIGF0dHJpYnV0ZXMpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHBvaW50ID09IG51bGwpIHsKLQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBKU1BVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgInVuc3VwcG9ydGVkIGlucHV0IHR5cGUiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoc3RhdHVzID09IG51bGwpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgSlNQVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssIEpTUFVJTWVzc2FnZXMuT0ssIG51bGwpOwotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q2xhc3NQYXR0ZXJuKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJU3RyaW5nIHNob3J0TmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJCVN0cmluZyBleHRlbnNpb24gPSByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCk7Ci0JCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwgJiYgZXh0ZW5zaW9uLmxlbmd0aCgpID4gc2hvcnROYW1lLmxlbmd0aCgpIC0gMSkgewotCQkJCXNob3J0TmFtZSA9IHNob3J0TmFtZS5zdWJzdHJpbmcoMCwgc2hvcnROYW1lLmxlbmd0aCgpIC0gZXh0ZW5zaW9uLmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCQkvKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDQ3NQotCQkJICovCi0JCQlyZXR1cm4gZkNsYXNzUGF0dGVybiArICIsXyIgKyBzaG9ydE5hbWU7Ci0JCX0KLQkJcmV0dXJuIGZDbGFzc1BhdHRlcm47Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGdldFJlc291cmNlRnJvbUlucHV0KGlucHV0KTsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZUZyb21JbnB1dChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgaW5wdXQuZ2V0QWRhcHRlcihJRmlsZS5jbGFzcyk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgYSB2YWxpZCBwb3NpdGlvbiBzb21ld2hlcmUgb24gbGluZU51bWJlciBpbiBkb2N1bWVudCwgaWRvYywgd2hlcmUKLQkgKiBhIGJyZWFrcG9pbnQgY2FuIGJlIHNldCBhbmQgcmV0dXJucyB0aGF0IHBvc2l0aW9uLiAtMSBpcyByZXR1cm5lZCBpZiBhCi0JICogcG9zaXRpb24gY291bGQgbm90IGJlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSBpZG9jCi0JICogQHBhcmFtIGVkaXRvckxpbmVOdW1iZXIKLQkgKiBAcmV0dXJuIHBvc2l0aW9uIHRvIHNldCBicmVha3BvaW50IG9yIC0xIGlmIG5vIHBvc2l0aW9uIGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VmFsaWRQb3NpdGlvbihJRG9jdW1lbnQgaWRvYywgaW50IGVkaXRvckxpbmVOdW1iZXIpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpZiAoaWRvYyAhPSBudWxsKSB7Ci0KLQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lID0gaWRvYy5nZXRMaW5lSW5mb3JtYXRpb24oZWRpdG9yTGluZU51bWJlciAtIDEpOwotCQkJCXN0YXJ0T2Zmc2V0ID0gbGluZS5nZXRPZmZzZXQoKTsKLQkJCQllbmRPZmZzZXQgPSBNYXRoLm1heChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSk7Ci0KLQkJCQlTdHJpbmcgbGluZVRleHQgPSBpZG9jLmdldChzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpLnRyaW0oKTsKLQotCQkJCS8vIGJsYW5rIGxpbmVzIG9yIGxpbmVzIHdpdGggb25seSBhbiBvcGVuIG9yIGNsb3NlIGJyYWNlIG9yCi0JCQkJLy8gc2NyaXB0bGV0IHRhZyBjYW5ub3QgaGF2ZSBhIGJyZWFrcG9pbnQKLQkJCQlpZiAobGluZVRleHQuZXF1YWxzKCIiKSB8fCBsaW5lVGV4dC5lcXVhbHMoInsiKSB8fCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQlsaW5lVGV4dC5lcXVhbHMoIn0iKSB8fCBsaW5lVGV4dC5lcXVhbHMoIjwlIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXsKLQkJCQkJcmVzdWx0ID0gLTE7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBnZXQgYWxsIHBhcnRpdGlvbnMgZm9yIGN1cnJlbnQgbGluZQotCQkJCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zID0gbnVsbDsKLQotCQkJCQlwYXJ0aXRpb25zID0gaWRvYy5jb21wdXRlUGFydGl0aW9uaW5nKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0KLQotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbnMubGVuZ3RoOyArK2kpIHsKLQkJCQkJCVN0cmluZyB0eXBlID0gcGFydGl0aW9uc1tpXS5nZXRUeXBlKCk7Ci0JCQkJCQkvLyBpZiBmb3VuZCBqc3AgamF2YSBjb250ZW50LCBqc3AgZGlyZWN0aXZlIHRhZ3MsCi0JCQkJCQkvLyBjdXN0b20KLQkJCQkJCS8vIHRhZ3MsCi0JCQkJCQkvLyByZXR1cm4gdGhhdCBwb3NpdGlvbgotCQkJCQkJaWYgKHR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSB8fCB0eXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHsKLQkJCQkJCQlyZXN1bHQgPSBwYXJ0aXRpb25zW2ldLmdldE9mZnNldCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXN1bHQgPSAtMTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4ZWN1dGFibGVFeHRlbnNpb24jc2V0SW5pdGlhbGl6YXRpb25EYXRhKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxpemF0aW9uRGF0YShJQ29uZmlndXJhdGlvbkVsZW1lbnQgY29uZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZyAmJiBkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZkNsYXNzUGF0dGVybiA9IChTdHJpbmcpIGRhdGE7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzKSB7Ci0JCS8vIG5vdCB1c2VkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2JyZWFrcG9pbnRwcm92aWRlcnMvSmF2YXNjcmlwdExpbmVCcmVha3BvaW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1ODBkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvYnJlYWtwb2ludHByb3ZpZGVycy9KYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIEp1bCAyMCwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuYnJlYWtwb2ludHByb3ZpZGVyczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIGRhdmlkdwotICogCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCB0eXBlIGNvbW1lbnQgZ28gdG8KLSAqIFdpbmRvdz5QcmVmZXJlbmNlcz5KYXZhPkNvZGUgR2VuZXJhdGlvbj5Db2RlIGFuZCBDb21tZW50cwotICovCi1wdWJsaWMgY2xhc3MgSmF2YXNjcmlwdExpbmVCcmVha3BvaW50IHsKLQotCS8qKgotCSAqIEBwYXJhbSByZXMKLQkgKiBAcGFyYW0gbGluZU51bWJlcgotCSAqIEBwYXJhbSBwb3MKLQkgKiBAcGFyYW0gcG9zMQotCSAqLwotCXB1YmxpYyBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQoSVJlc291cmNlIHJlcywgaW50IGxpbmVOdW1iZXIsIGludCBwb3MsIGludCBwb3MxKSB7Ci0KLQkJLy8gVE9ETyBTaG91bGQgYmUgZGVsZXRlZD8gQWxvbmcgd2l0aCBjYWxsaW5nIGNsYXNzPwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBKYXZhc2NyaXB0TGluZUJyZWFrcG9pbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiAwOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXV0b0ltcG9ydFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdXRvSW1wb3J0UHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkOGMxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdXRvSW1wb3J0UHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEF1dG9JbXBvcnRQcm9wb3NhbCBleHRlbmRzIEpTUENvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JCi0JLy8gdGhlIGltcG9ydCBzdHJpbmcsIG5vIHF1b3RlcyBvciBjb2xvbnMKLQlTdHJpbmcgZkltcG9ydERlY2xhcmF0aW9uOwotCQotCXB1YmxpYyBBdXRvSW1wb3J0UHJvcG9zYWwoU3RyaW5nIGltcG9ydERlY2xhcmF0aW9uLCBTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgcmVsZXZhbmNlLCB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpOwotCQlzZXRJbXBvcnREZWNsYXJhdGlvbihpbXBvcnREZWNsYXJhdGlvbik7Ci0JfQotCQotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCXN1cGVyLmFwcGx5KHZpZXdlciwgdHJpZ2dlciwgc3RhdGVNYXNrLCBvZmZzZXQpOwotCQlhZGRJbXBvcnREZWNsYXJhdGlvbih2aWV3ZXIpOwotCX0KLQkvKioKLQkgKiBhZGRzIHRoZSBpbXBvcnQgZGVjbGFyYXRpb24gdG8gdGhlIGRvY3VtZW50IGluIHRoZSB2aWV3ZXIgaW4gdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9uCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRJbXBvcnREZWNsYXJhdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJCi0JCUlEb2N1bWVudCBkb2MgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCi0JCS8vIGNhbGN1bGF0ZSBvbmNlIGFuZCBwYXNzIGFsb25nCi0JCWJvb2xlYW4gaXNYbWwgPSBpc1htbEZvcm1hdChkb2MpOwotCQkKLQkJaW50IGluc2VydFBvc2l0aW9uID0gZ2V0SW5zZXJ0UG9zaXRpb24oZG9jLCBpc1htbCk7Ci0JCVN0cmluZyBpbnNlcnRUZXh0ID0gY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oZG9jLCBpc1htbCk7Ci0JCUluc2VydEVkaXQgaW5zZXJ0ID0gbmV3IEluc2VydEVkaXQoaW5zZXJ0UG9zaXRpb24sIGluc2VydFRleHQpOwotCQl0cnkgewotCQkJaW5zZXJ0LmFwcGx5KGRvYyk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFRyZWVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQkKLQkJLy8gbWFrZSBzdXJlIHRoZSBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgaXMgY29ycmVjdAotCQlzZXRDdXJzb3JQb3NpdGlvbihnZXRDdXJzb3JQb3NpdGlvbigpICsgaW5zZXJ0VGV4dC5sZW5ndGgoKSk7Ci0JfQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcGFyYW0gaXNYbWwKLQkgKiBAcmV0dXJuIHBvc2l0aW9uIGFmdGVyIDxqc3A6cm9vdD4gaWYgeG1sLCBvdGhlcndpc2UgcmlnaHQgYmVmb3JlIHRoZSBkb2N1bWVudCBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5zZXJ0UG9zaXRpb24oSURvY3VtZW50IGRvYywgYm9vbGVhbiBpc1htbCkgewotCQlpbnQgcG9zID0gMDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvYyk7Ci0JCXRyeSB7Ci0JCQlpZihzTW9kZWwgIT0gbnVsbCkgewotCQkJCWlmKHNNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnROb2RlID0gKChJRE9NTW9kZWwpc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQlOb2RlIGRvY0VsZW1lbnQgPSBkb2N1bWVudE5vZGUuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCQkJCWlmKGRvY0VsZW1lbnQgIT0gbnVsbCAmJiBkb2NFbGVtZW50IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSAoKElET01FbGVtZW50KWRvY0VsZW1lbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQlpZihpc1htbCkgewotCQkJCQkJCS8vIGluc2VydCByaWdodCBhZnRlciBkb2N1bWVudCBlbGVtZW50Ci0JCQkJCQkJcG9zID0gc2RSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBpbnNlcnQgYmVmb3JlIGRvY3VtZW50IGVsZW1lbnQKLQkJCQkJCQlwb3MgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBwb3M7Ci0JfQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBkb2N1bWVudCBpcyB4bWwtanNwIHN5bnRheCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzWG1sRm9ybWF0KElEb2N1bWVudCBkb2MpIHsKLQkJYm9vbGVhbiBpc1htbCA9IGZhbHNlOwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jKTsKLQkJdHJ5IHsKLQkJCWlmKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYoIWlzWG1sKSB7Ci0JCQkJCWlmKHNNb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQkJSURPTURvY3VtZW50IGRvY3VtZW50Tm9kZSA9ICgoSURPTU1vZGVsKXNNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvY3VtZW50Tm9kZS5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCWlzWG1sID0gZG9jRWxlbWVudCAhPSBudWxsICYmICgoZG9jRWxlbWVudC5nZXROb2RlTmFtZSgpLmVxdWFscygianNwOnJvb3QiKSkgfHwgKCgoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgJiYgKChJRE9NTm9kZSkgZG9jRWxlbWVudCkuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQkJCQkKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gaXNYbWw7Ci0JfQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBkb2MKLQkgKiBAcGFyYW0gaXNYbWwKLQkgKiBAcmV0dXJuIGFwcHJvcHJpYXRlIGltcG9ydCBkZWNsYXJhdGlvbiBzdHJpbmcgZGVwZW5kaW5nIGlmIGRvY3VtZW50IGlzIHhtbCBvciBub3QKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBjcmVhdGVJbXBvcnREZWNsYXJhdGlvbihJRG9jdW1lbnQgZG9jLCBib29sZWFuIGlzWG1sKSB7Ci0JCVN0cmluZyBkZWxpbSA9IChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSA/ICgoSVN0cnVjdHVyZWREb2N1bWVudClkb2MpLmdldExpbmVEZWxpbWl0ZXIoKSA6IFRleHRVdGlsaXRpZXMuZ2V0RGVmYXVsdExpbmVEZWxpbWl0ZXIoZG9jKTsKLQkJaWYoaXNYbWwpCi0JCQlyZXR1cm4gZGVsaW0gKyAiPGpzcDpkaXJlY3RpdmUucGFnZSBpbXBvcnQ9XCIiK2dldEltcG9ydERlY2xhcmF0aW9uKCkrIlwiLz4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcmV0dXJuICI8JUBwYWdlIGltcG9ydD1cIiIgKyBnZXRJbXBvcnREZWNsYXJhdGlvbigpICsgIlwiJT4iICsgZGVsaW07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wb3J0RGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBmSW1wb3J0RGVjbGFyYXRpb247Ci0JfQotCXB1YmxpYyB2b2lkIHNldEltcG9ydERlY2xhcmF0aW9uKFN0cmluZyBpbXBvcnREZWNsYXJhdGlvbikgewotCQlmSW1wb3J0RGVjbGFyYXRpb24gPSBpbXBvcnREZWNsYXJhdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9CZWFuSW5mb1Byb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9CZWFuSW5mb1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZGVkNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQmVhbkluZm9Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS5iZWFucy5JbnRyb3NwZWN0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGVIaWVyYXJjaHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YUNvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIE5hdmlnYXRlcyB0aGUgSUphdmFQcm9qZWN0IGNsYXNzcGF0aCAoaW5jbC4gc291cmNlKSBvbiBhIGdpdmVuIHJlc291cmNlIGFuZCBpbmZlcnMgYmVhbiBwcm9wZXJ0aWVzCi0gKiBnaXZlbiBhIGZ1bGx5IHF1YWxpZmllZCBiZWFubmFtZS4gQmVhbiBwcm9wZXJ0aWVzIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmc6Ci0gKiA8Y29kZT5nZXRSdW50aW1lUHJvcGVydGllcyhJUmVzb3VyY2UgYmFzZVJlc291cmNlLCBTdHJpbmcgdHlwZU5hbWUpPC9jb2RlPgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJlYW5JbmZvUHJvdmlkZXIgaW1wbGVtZW50cyBJQmVhbkluZm9Qcm92aWRlciB7Ci0KLQlwdWJsaWMgY2xhc3MgSmF2YVByb3BlcnR5RGVzY3JpcHRvciBpbXBsZW1lbnRzIElKYXZhUHJvcGVydHlEZXNjcmlwdG9yIHsKLQkJU3RyaW5nIGZUeXBlID0gbnVsbDsKLQkJU3RyaW5nIGZOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBmUmVhZGFibGUgPSB0cnVlOwotCQlib29sZWFuIGZXcml0YWJsZSA9IHRydWU7Ci0KLQkJcHVibGljIEphdmFQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIG5hbWUsIFN0cmluZyB0eXBlLCBib29sZWFuIHJlYWRhYmxlLCBib29sZWFuIHdyaXRhYmxlKSB7Ci0JCQlmTmFtZSA9IG5hbWU7Ci0JCQlmVHlwZSA9IHR5cGU7Ci0JCQlmUmVhZGFibGUgPSByZWFkYWJsZTsKLQkJCWZXcml0YWJsZSA9IHdyaXRhYmxlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREZWNsYXJlZFR5cGUoKSB7Ci0JCQlyZXR1cm4gZlR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQkJcmV0dXJuIGZOYW1lOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIGZOYW1lOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0UmVhZGFibGUoKSB7Ci0JCQlyZXR1cm4gZlJlYWRhYmxlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gZ2V0V3JpdGVhYmxlKCkgewotCQkJcmV0dXJuIGZXcml0YWJsZTsKLQkJfQotCX0KLQotCS8vIGxvb2tzIHVwIGVuY29kZWQgdHlwZSAoc2VlIENsYXNzLmdldE5hbWUpLCBhbmQgZ2l2ZXMgeW91IGEgZGlzcGxheWFibGUgc3RyaW5nCi0JcHJpdmF0ZSBIYXNoTWFwIGZFbmNvZGVkVHlwZU1hcCA9IG51bGw7Ci0JLy8gdG8gYXZvaWQgcmVwZWF0IHByb3BlcnRpZXMgZnJvbSBzaG93aW5nIHVwCi0JcHJpdmF0ZSBIYXNoU2V0IGZSZXBlYXRNZXRob2RzID0gbnVsbDsKLQotCXB1YmxpYyBCZWFuSW5mb1Byb3ZpZGVyKCkgewotCQlmUmVwZWF0TWV0aG9kcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5mZXJyZWQgcHJvcGVydGllcyBvZiBhIGJlYW4gYmFzZWQgb24gdGhlIHByb2plY3QgZnJvbSB0aGUgYmFzZVJlc291cmNlLAotCSAqIGFuZCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGJlYW4uCi0JICogCi0JICogQHBhcmFtIGJhc2VSZXNvdXJjZSB0aGUgYmFzZSByZXNvdXJjZSB3aGVyZSB0aGUgYmVhbiBpcyBiZWluZyB1c2VkCi0JICogQHBhcmFtIHR5cGVOYW1lIHRoZSA8aT5mdWxseSBxdWFsaWZpZWQ8L2k+IHR5cGUgbmFtZSAoZWcuIGphdmF4LnN3aW5nLkpCdXR0b24pIG9mIHRoZSBiZWFuCi0JICovCi0JcHVibGljIElKYXZhUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UnVudGltZVByb3BlcnRpZXMoSVJlc291cmNlIGJhc2VSZXNvdXJjZSwgU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCUlKYXZhUHJvamVjdCBqYXZhUHJvamVjdCA9IEphdmFDb3JlLmNyZWF0ZShiYXNlUmVzb3VyY2UuZ2V0UHJvamVjdCgpKTsKLQkJUXVhbGlmaWVkTmFtZSB0eXBlUXVhbGlmaWVkTmFtZSA9IGdldFR5cGVRdWFsaWZpZWROYW1lKHR5cGVOYW1lKTsKLQkJTGlzdCBnZXRNZXRob2RSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGlzTWV0aG9kUmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBzZXRNZXRob2RSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGRlc2NyaXB0b3JSZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJSVR5cGUgdHlwZSA9IGphdmFQcm9qZWN0LmZpbmRUeXBlKHR5cGVRdWFsaWZpZWROYW1lLmdldFF1YWxpZmllcigpICsgIi4iICsgdHlwZVF1YWxpZmllZE5hbWUuZ2V0TG9jYWxOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvLyB0eXBlIG11c3QgZXhpc3QKLQkJCWlmKHR5cGUgIT0gbnVsbCkgewotCQkJCUlUeXBlSGllcmFyY2h5IGhpZXJhcmNoeSA9IHR5cGUubmV3VHlwZUhpZXJhcmNoeShudWxsKTsKLQkJCQlJVHlwZVtdIHN1cGVycyA9IGhpZXJhcmNoeS5nZXRBbGxTdXBlcmNsYXNzZXModHlwZSk7Ci0JCi0JCQkJSU1ldGhvZFtdIG1ldGhvZHMgPSB0eXBlLmdldE1ldGhvZHMoKTsKLQkJCQkvLyBpdGVyYXRlIHRoZSBiZWFuJ3MgbWV0aG9kcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykKLQkJCQkJYWNjZXB0TWV0aG9kKGdldE1ldGhvZFJlc3VsdHMsIGlzTWV0aG9kUmVzdWx0cywgc2V0TWV0aG9kUmVzdWx0cywgbWV0aG9kc1tpXSk7Ci0JCQkJLy8gdGhlIGJlYW4gaGllcmFyY2h5J3MgbWV0aG9kcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCW1ldGhvZHMgPSBzdXBlcnNbaV0uZ2V0TWV0aG9kcygpOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1ldGhvZHMubGVuZ3RoOyBqKyspCi0JCQkJCQlhY2NlcHRNZXRob2QoZ2V0TWV0aG9kUmVzdWx0cywgaXNNZXRob2RSZXN1bHRzLCBzZXRNZXRob2RSZXN1bHRzLCBtZXRob2RzW2pdKTsKLQkJCQl9Ci0JCQkJYWRhcHRNZXRob2RzVG9Qcm9wZXJ0eURlc2NyaXB0b3JzKGdldE1ldGhvZFJlc3VsdHMsIGlzTWV0aG9kUmVzdWx0cywgc2V0TWV0aG9kUmVzdWx0cywgZGVzY3JpcHRvclJlc3VsdHMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1leCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvYmxlbSBuYXZpZ2F0aW5nIEphdmFQcm9qZWN0IGluIEJlYW5JbmZvUHJvdmlkZXIiLCBqbWV4KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbXSBmaW5hbFJlc3VsdHMgPSBuZXcgSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbZGVzY3JpcHRvclJlc3VsdHMuc2l6ZSgpXTsKLQkJU3lzdGVtLmFycmF5Y29weShkZXNjcmlwdG9yUmVzdWx0cy50b0FycmF5KCksIDAsIGZpbmFsUmVzdWx0cywgMCwgZGVzY3JpcHRvclJlc3VsdHMuc2l6ZSgpKTsKLQkJcmV0dXJuIGZpbmFsUmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmcm9tIG1ldGhvZCBkZWNsYXJhdGlvbiBsaXN0cywgY3JlYXRlcyBhbmQgZmlsbHMgYSBsaXN0IG9mIEphdmFQcm9wZXJ0eURlc2NyaXB0b3JzLgotCSAqIEBwYXJhbSBnZXRNZXRob2RzCi0JICogQHBhcmFtIGlzTWV0aG9kcwotCSAqIEBwYXJhbSBzZXRNZXRob2RzCi0JICogQHBhcmFtIGRlc2NyaXB0b3JSZXN1bHRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkYXB0TWV0aG9kc1RvUHJvcGVydHlEZXNjcmlwdG9ycyhMaXN0IGdldE1ldGhvZHMsIExpc3QgaXNNZXRob2RzLCBMaXN0IHNldE1ldGhvZHMsIExpc3QgZGVzY3JpcHRvcnMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlMaXN0IHJlYWRhYmxlID0gbmV3IEFycmF5TGlzdCgpOwotCQlIYXNoTWFwIHR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQotCQkvLyBpdGVyYXRlIHRocm91Z2ggZ2V0KiBhbmQgaXMqIG1ldGhvZHMsIHVwZGF0aW5nICdyZWFkYWJsZScgbGlzdCBhbmQgJ3R5cGVzJyBtYXAKLQkJZmlsdGVyR2V0TWV0aG9kcyhnZXRNZXRob2RzLCByZWFkYWJsZSwgdHlwZXMpOwotCQlmaWx0ZXJJc01ldGhvZHMoaXNNZXRob2RzLCByZWFkYWJsZSwgdHlwZXMpOwotCi0JCS8vIGl0ZXJhdGUgc2V0KiBtZXRob2RzLCBjaGVja2luZyBvdmVybGFwIHcvIHJlYWRhYmxlCi0JCUl0ZXJhdG9yIGl0ID0gc2V0TWV0aG9kcy5pdGVyYXRvcigpOwotCQlJTWV0aG9kIHRlbXAgPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0eXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gZW5jb2RlZFBhcmFtcyA9IG51bGw7Ci0JCVN0cmluZyByZXR1cm5UeXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHBhcmFtMCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdGVtcCA9IChJTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQluYW1lID0gY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZCh0ZW1wKTsKLQkJCS8vIGludmFsaWQgbmFtaW5nIGNvbnZlbnRpb24KLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCXJldHVyblR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUodGVtcC5nZXRSZXR1cm5UeXBlKCkpOwotCQkJLy8gc2V0dGVyIHNob3VsZCBoYXZlIG5vIHJldHVybiB0eXBlCi0JCQlpZiAoIXJldHVyblR5cGUuZXF1YWxzKCJ2b2lkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQljb250aW51ZTsKLQotCQkJLy8gbmVlZCB0byBnZXQgdHlwZSBmcm9tIHBhcmFtZXRlcgotCQkJZW5jb2RlZFBhcmFtcyA9IHRlbXAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWlmIChlbmNvZGVkUGFyYW1zICE9IG51bGwgJiYgZW5jb2RlZFBhcmFtcy5sZW5ndGggPiAwKSB7Ci0JCQkJaWYgKGVuY29kZWRQYXJhbXMubGVuZ3RoID4gMSkgewotCQkJCQkvLyBtdWx0aXBsZSBwYXJhbXMKLQkJCQkJcGFyYW0wID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCQlpZiAoIXBhcmFtMC5lcXVhbHMoImludCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBub3QgYSB2YWxpZCBpbmRleGVkIHByb3BlcnR5Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJCi0JCQkJCXR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFBhcmFtc1sxXSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBvbmUgcGFyYW0sIHJlZ3VsYXIgc2V0dGVyCi0JCQkJCWlmIChpc0FycmF5KGVuY29kZWRQYXJhbXNbMF0pKQotCQkJCQkJdHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUGFyYW1zWzBdKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChyZWFkYWJsZS5jb250YWlucyhuYW1lKSkgewotCQkJCS8vIHdyaXRhYmxlIGFuZCByZWFkYWJsZQotCQkJCWlmICghZlJlcGVhdE1ldGhvZHMuY29udGFpbnMobmFtZSkpIHsKLQkJCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIChTdHJpbmcpIHR5cGVzLmdldChuYW1lKSwgdHJ1ZSwgdHJ1ZSkpOwotCQkJCQlyZWFkYWJsZS5yZW1vdmUobmFtZSk7Ci0JCQkJCWZSZXBlYXRNZXRob2RzLmFkZChuYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB3YXNuJ3QgcmVhZGFibGUsIGp1c3Qgd3JpdGFibGUKLQkJCQlTdHJpbmdbXSBwYXJhbXMgPSB0ZW1wLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJLy8gY2FuJ3QgYmUgc2V0UHJvcGVydHkgaWYgbm8gcGFyYW1ldGVycwotCQkJCWlmICghKHBhcmFtcy5sZW5ndGggPiAwKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKCFmUmVwZWF0TWV0aG9kcy5jb250YWlucyhuYW1lKSkgewotCQkJCQl0eXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKHBhcmFtc1swXSk7Ci0JCQkJCWRlc2NyaXB0b3JzLmFkZChuZXcgSmF2YVByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCB0eXBlLCBmYWxzZSwgdHJ1ZSkpOwotCQkJCQlmUmVwZWF0TWV0aG9kcy5hZGQobmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFkZCBsZWZ0b3ZlciBmcm9tIHJlYWRhYmxlLCBnZXQqIGFuZCBpcyogbWV0aG9kcyAocmVhZGFibGUgPSB0cnVlLCB3cml0YWJsZSA9IGZhbHNlKQotCQlpdCA9IHJlYWRhYmxlLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCW5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0JCQlpZiAoIWZSZXBlYXRNZXRob2RzLmNvbnRhaW5zKG5hbWUpKSB7Ci0JCQkJZGVzY3JpcHRvcnMuYWRkKG5ldyBKYXZhUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIChTdHJpbmcpIHR5cGVzLmdldChuYW1lKSwgdHJ1ZSwgZmFsc2UpKTsKLQkJCQlmUmVwZWF0TWV0aG9kcy5hZGQobmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsdGVyR2V0TWV0aG9kcyhMaXN0IGdldE1ldGhvZHMsIExpc3QgcmVhZGFibGUsIEhhc2hNYXAgdHlwZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kIHRlbXA7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgZW5jb2RlZFJldHVyblR5cGU7Ci0JCVN0cmluZyByZXR1cm5UeXBlOwotCQlJdGVyYXRvciBpdCA9IGdldE1ldGhvZHMuaXRlcmF0b3IoKTsKLQkJU3RyaW5nW10gZW5jb2RlZFBhcmFtczsKLQkJU3RyaW5nIHBhcmFtVHlwZTsKLQkJLy8gaXRlcmF0ZSBnZXQqIG1ldGhvZHMKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdGVtcCA9IChJTWV0aG9kKSBpdC5uZXh0KCk7Ci0JCQluYW1lID0gY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZCh0ZW1wKTsKLQkJCS8vIGludmFsaWQgYmVhbiBuYW1pbmcgY29udmVudGlvbgotCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQotCQkJZW5jb2RlZFJldHVyblR5cGUgPSB0ZW1wLmdldFJldHVyblR5cGUoKTsKLQkJCXJldHVyblR5cGUgPSBnZXREZWNvZGVkVHlwZU5hbWUoZW5jb2RlZFJldHVyblR5cGUpOwotCi0JCQkvLyAgY2FuJ3QgZ2V0IGJlIGEgZ2V0UHJvcGVydHkgaWYgcmV0dXJucyB2b2lkCi0JCQlpZiAocmV0dXJuVHlwZS5lcXVhbHMoInZvaWQiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBjaGVjayBwYXJhbXMgaW4gY2FzZSBpdCdzIGluZGV4ZWQgcHJvcGV0eQotCQkJZW5jb2RlZFBhcmFtcyA9IHRlbXAuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLQkJCWlmIChlbmNvZGVkUGFyYW1zICE9IG51bGwgJiYgZW5jb2RlZFBhcmFtcy5sZW5ndGggPT0gMSkgewotCQkJCXBhcmFtVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUGFyYW1zWzBdKTsKLQkJCQkvLyBzeW50YXggaXMgPiBUeXBlIGdldHRlcihpbnQpOwotCQkJCWlmICghcGFyYW1UeXBlLmVxdWFscygiaW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkvL2l0J3Mgbm90IGFuIGluZGV4ZWQgcHJvcGVydHkKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCS8vIGl0IGlzIGluZGV4ZWQsIHByb3AgdHlwZSBpcyBhbiBBUlJBWQotCQkJCXJldHVyblR5cGUgKz0gIltdIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZWFkYWJsZS5hZGQobmFtZSk7Ci0JCQl0eXBlcy5wdXQobmFtZSwgcmV0dXJuVHlwZSk7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBmaWx0ZXJJc01ldGhvZHMoTGlzdCBpc01ldGhvZFJlc3VsdHMsIExpc3QgcmVhZGFibGUsIEhhc2hNYXAgdHlwZXMpIHRocm93cyBKYXZhTW9kZWxFeGNlcHRpb24gewotCQlJTWV0aG9kIHRlbXA7Ci0JCVN0cmluZyBuYW1lOwotCQlTdHJpbmcgZW5jb2RlZFJldHVyblR5cGU7Ci0JCVN0cmluZyByZXR1cm5UeXBlOwotCQlTdHJpbmdbXSBlbmNvZGVkUGFyYW1zOwotCQlTdHJpbmcgcGFyYW1UeXBlOwotCQkvLyBpdGVyYXRlIGlzKiBtZXRob2RzCi0JCUl0ZXJhdG9yIGl0ID0gaXNNZXRob2RSZXN1bHRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXRlbXAgPSAoSU1ldGhvZCkgaXQubmV4dCgpOwotCQkJbmFtZSA9IGNyZWF0ZVByb3BlcnR5TmFtZUZyb21NZXRob2QodGVtcCk7Ci0JCQkvLyBpbnZhbGlkIGJlYW4gbmFtaW5nIGNvbnZlbnRpb24KLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQllbmNvZGVkUmV0dXJuVHlwZSA9IHRlbXAuZ2V0UmV0dXJuVHlwZSgpOwotCQkJcmV0dXJuVHlwZSA9IGdldERlY29kZWRUeXBlTmFtZShlbmNvZGVkUmV0dXJuVHlwZSk7Ci0KLQkJCS8vIGlzUHJvcGVydHkgb25seSB2YWxpZCBmb3IgYm9vbGVhbgotCQkJaWYgKCFyZXR1cm5UeXBlLmVxdWFscygiYm9vbGVhbiIpKSAvLyROT04tTkxTLTEkCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIGNoZWNrIHBhcmFtcyBpbiBjYXNlIGl0J3MgaW5kZXhlZCBwcm9wZXR5Ci0JCQllbmNvZGVkUGFyYW1zID0gdGVtcC5nZXRQYXJhbWV0ZXJUeXBlcygpOwotCQkJaWYgKGVuY29kZWRQYXJhbXMgIT0gbnVsbCAmJiBlbmNvZGVkUGFyYW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJcGFyYW1UeXBlID0gZ2V0RGVjb2RlZFR5cGVOYW1lKGVuY29kZWRQYXJhbXNbMF0pOwotCQkJCS8vIHN5bnRheCBpcyA+IFR5cGUgZ2V0dGVyKGludCk7Ci0JCQkJaWYgKCFwYXJhbVR5cGUuZXF1YWxzKCJpbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vaXQncyBub3QgYSB2YWxpZCBpbmRleGVkIHByb3BlcnR5Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCX0KLQotCQkJcmVhZGFibGUuYWRkKG5hbWUpOwotCQkJdHlwZXMucHV0KG5hbWUsIHJldHVyblR5cGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUGFzcyBpbiBhIGdldCp8c2V0KnxpcyogbWV0aG9kIGFuZCBpdCB3aWxsIHJldHVybiBhbiBpbmZlcnJlZCBwcm9wZXJ0eSBuYW1lIHVzaW5nIDxjb2RlPkludHJvc3BlY3Rvci5kZWNhcGl0YWxpemUoU3RyaW5nKTwvY29kZT4KLQkgKiBAcGFyYW0gdGVtcAotCSAqIEByZXR1cm4gYW4gaW5mZXJyZWQgcHJvcGVydHkgbmFtZSBiYXNlZCBvbiB0aGUgSU1ldGhvZCBuYW1lLCBudWxsIGlmIHRoZSBuYW1lIGlzIG5vdCB2YWxpZCBhY2NvcmRpbmcgdG8gYmVhbiBzcGVjCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgY3JlYXRlUHJvcGVydHlOYW1lRnJvbU1ldGhvZChJTWV0aG9kIHRlbXApIHsKLQkJU3RyaW5nIG5hbWUgPSB0ZW1wLmdldEVsZW1lbnROYW1lKCk7Ci0JCWlmIChuYW1lLnN0YXJ0c1dpdGgoImlzIikpIC8vJE5PTi1OTFMtMSQKLQkJCW5hbWUgPSBJbnRyb3NwZWN0b3IuZGVjYXBpdGFsaXplKG5hbWUuc3Vic3RyaW5nKDIpKTsKLQkJZWxzZQotCQkJLy8gbXVzdCBiZSBnZXQgb3Igc2V0Ci0JCQluYW1lID0gSW50cm9zcGVjdG9yLmRlY2FwaXRhbGl6ZShuYW1lLnN1YnN0cmluZygzKSk7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWwgZmlsdGVyaW5nIG9mIG1ldGhvZHMuICBDaGVja3MgcHJlZml4IGlmIGl0J3MgdmFsaWQgbGVuZ3RoLiAgSWYgdGhlIHByZWZpeCBpcyAiZ2V0IiB0aGUgIG1ldGhvZCBuYW1lIAotCSAqIGlzIHBsYWNlZCBpbiB0aGUgZ2V0TWV0aG9kUmVzdWx0cyBMaXN0LiAgSWYgdGhlIHByZWZpeCBpcyAiaXMiLCB0aGUgbmFtZSBpcyBhZGRlZCB0byB0aGUgaXNNZXRob2RSZXN1bHRzIGxpc3QuICBJZiB0aGUKLQkgKiBwcmVmaXggaXMgInNldCIsIGl0J3MgYWRkZWQgdG8gdGhlIHNldE1ldGhvZFJlc3VsdHNMaXN0LgotCSAqIAotCSAqIEBwYXJhbSBnZXRNZXRob2RSZXN1bHRzCi0JICogQHBhcmFtIGlzTWV0aG9kUmVzdWx0cwotCSAqIEBwYXJhbSBzZXRNZXRob2RSZXN1bHRzCi0JICogQHBhcmFtIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCBhY2NlcHRNZXRob2QoTGlzdCBnZXRNZXRob2RSZXN1bHRzLCBMaXN0IGlzTWV0aG9kUmVzdWx0cywgTGlzdCBzZXRNZXRob2RSZXN1bHRzLCBJTWV0aG9kIG1ldGhvZCkgdGhyb3dzIEphdmFNb2RlbEV4Y2VwdGlvbiB7Ci0JCWlmICghZlJlcGVhdE1ldGhvZHMuY29udGFpbnMobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpKSB7Ci0JCQlmUmVwZWF0TWV0aG9kcy5hZGQobWV0aG9kLmdldEVsZW1lbnROYW1lKCkpOwotCQkJaW50IGZsYWdzID0gbWV0aG9kLmdldEZsYWdzKCk7Ci0JCQlTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXRFbGVtZW50TmFtZSgpOwotCQkJaWYgKEZsYWdzLmlzUHVibGljKGZsYWdzKSkgewotCQkJCWlmIChtZXRob2ROYW1lLmxlbmd0aCgpID4gMyAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWdldE1ldGhvZFJlc3VsdHMuYWRkKG1ldGhvZCk7Ci0JCQkJZWxzZSBpZiAobWV0aG9kTmFtZS5sZW5ndGgoKSA+IDIgJiYgbWV0aG9kTmFtZS5zdGFydHNXaXRoKCJpcyIpKSAvLyROT04tTkxTLTEkCi0JCQkJCWlzTWV0aG9kUmVzdWx0cy5hZGQobWV0aG9kKTsKLQkJCQllbHNlIGlmIChtZXRob2ROYW1lLmxlbmd0aCgpID4gMyAmJiBtZXRob2ROYW1lLnN0YXJ0c1dpdGgoInNldCIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXNldE1ldGhvZFJlc3VsdHMuYWRkKG1ldGhvZCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdHlwZU5hbWUKLQkgKiBAcmV0dXJuIGEgUXVhbGlmaWVkIG5hbWUgd2l0aCB0aGUgcGFja2FnZSBhcyB0aGUgcXVhbGlmaWVyLCBhbmQgY2xhc3MgbmFtZSBhcyBMb2NhbE5hbWUKLQkgKi8KLQlwcml2YXRlIFF1YWxpZmllZE5hbWUgZ2V0VHlwZVF1YWxpZmllZE5hbWUoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHlwZU5hbWUsICIuIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW5ndGggPSBzdC5jb3VudFRva2VucygpOwotCQlpbnQgY291bnQgPSAwOwotCQlTdHJpbmdCdWZmZXIgcm9vdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJd2hpbGUgKGNvdW50KysgPCBsZW5ndGggLSAxKSB7Ci0JCQlyb290LmFwcGVuZChzdC5uZXh0VG9rZW4oKSk7Ci0JCQlpZiAoY291bnQgPCBsZW5ndGggLSAxKQotCQkJCXJvb3QuYXBwZW5kKCcuJyk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBRdWFsaWZpZWROYW1lKHJvb3QudG9TdHJpbmcoKSwgc3QubmV4dFRva2VuKCkpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBlbmNvZGVkVHlwZU5hbWUgaXMgYW4gYXJyYXkKLQkgKiBAcGFyYW0gZW5jb2RlZFR5cGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGVuY29kZWRUeXBlTmFtZSBpcyBhbiBhcnJheSwgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0FycmF5KFN0cmluZyBlbmNvZGVkVHlwZU5hbWUpIHsKLQkJaWYgKGVuY29kZWRUeXBlTmFtZSAhPSBudWxsICYmIGVuY29kZWRUeXBlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCWlmIChlbmNvZGVkVHlwZU5hbWUuY2hhckF0KDApID09ICdbJykKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVjb2RlZCAoZGlzcGxheWFibGUpIG5hbWUgZm8gdGhlIHR5cGUuCi0JICogRWl0aGVyIGEgcHJpbWl0aXZlIHR5cGUgKGludCwgbG9uZywgZmxvYXQuLi4pIE9iamVjdCAoU3RyaW5nKQotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybiBkZWNvZGVkIG5hbWUgZm9yIHRoZSBlbmNvZGVkIHN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlY29kZWRUeXBlTmFtZShTdHJpbmcgZW5jb2RlZCkgewotCQlIYXNoTWFwIG1hcCA9IGdldEVuY29kZWRUeXBlTWFwKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIGRlY29kZWQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXIgQlJBQ0tFVCA9ICdbJzsKLQkJU3RyaW5nIEJSQUNLRVRTID0gIltdIjsgLy8kTk9OLU5MUy0xJAotCQljaGFyIGlkZW50aWZpZXIgPSAnICc7Ci0JCWludCBsYXN0ID0gMDsKLQkJLy8gY291bnQgYnJhY2tldHMKLQkJd2hpbGUgKGVuY29kZWQuaW5kZXhPZihCUkFDS0VULCBsYXN0KSAhPSAtMSkgewotCQkJbGFzdCsrOwotCQl9Ci0JCWlkZW50aWZpZXIgPSBlbmNvZGVkLmNoYXJBdChsYXN0KTsKLQkJT2JqZWN0IHByaW1pdGl2ZVR5cGUgPSBtYXAuZ2V0KFN0cmluZy52YWx1ZU9mKGlkZW50aWZpZXIpKTsKLQkJLy8gTCA+IGJpbmFyeSB0eXBlIG5hbWUsIFEgPiBzb3VyY2UgdHlwZSBuYW1lCi0JCWlmIChpZGVudGlmaWVyID09ICdMJyB8fCBpZGVudGlmaWVyID09ICdRJykgewotCQkJLy8gaGFuZGxlIG9iamVjdAotCQkJU3RyaW5nIGNsYXNzbmFtZSA9IGVuY29kZWQuc3Vic3RyaW5nKGxhc3QgKyAxLCBlbmNvZGVkLmxlbmd0aCgpIC0gMSk7Ci0JCQlkZWNvZGVkLmFwcGVuZChjbGFzc25hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgIT0gbnVsbCkgewotCQkJLy8gaGFuZGxlIHByaW1pdGl2ZSB0eXBlIChmcm9tIElGaWVsZC5nZXRTaWduYXR1cmUoKSkKLQkJCWRlY29kZWQuYXBwZW5kKChTdHJpbmcpIHByaW1pdGl2ZVR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gaGFuZGxlIHByaW1pdGl2ZSB0eXBlIChmcm9tIENsYXNzLmdldE5hbWUoKSkKLQkJCWRlY29kZWQuYXBwZW5kKGVuY29kZWQpOwotCQl9Ci0JCS8vIGhhbmRsZSBhcnJheXMKLQkJaWYgKGxhc3QgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxhc3Q7IGkrKykgewotCQkJCWRlY29kZWQuYXBwZW5kKEJSQUNLRVRTKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVjb2RlZC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqCWZyb20gQ2xhc3MuZ2V0TmFtZSgpIGphdmFkb2MKLQkgKglhbHNvIHNlZSBTaWduYXR1cmUgaW4gamR0LmNvcmUgYXBpCi0JICo8cHJlPgotCSAqCQkJQiAgICAgICAgICAgIGJ5dGUKLQkgKgkJCUMgICAgICAgICAgICBjaGFyCi0JICoJCQlEICAgICAgICAgICAgZG91YmxlCi0JICoJCQlGICAgICAgICAgICAgZmxvYXQKLQkgKgkJCUkgICAgICAgICAgICBpbnQKLQkgKgkJCUogICAgICAgICAgICBsb25nCi0JICoJCQlMY2xhc3NuYW1lOyAgY2xhc3Mgb3IgaW50ZXJmYWNlCi0JICoJCQlRc291cmNlbmFtZTsgc291cmNlCi0JICoJCQlTICAgICAgICAgICAgc2hvcnQKLQkgKgkJCVogICAgICAgICAgICBib29sZWFuCi0JICoJCQlWCSAgIAkJIHZvaWQKLQkgKjwvcHJlPgotCSAqCi0JICogQHJldHVybiB0aGUgImVuY29kaW5nIGxldHRlciIgdG8gInR5cGUiIG1hcC4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0RW5jb2RlZFR5cGVNYXAoKSB7Ci0JCWlmIChmRW5jb2RlZFR5cGVNYXAgPT0gbnVsbCkgewotCQkJZkVuY29kZWRUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkIiLCAiYnl0ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkMiLCAiY2hhciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkQiLCAiZG91YmxlIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiRiIsICJmbG9hdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIkkiLCAiaW50Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiSiIsICJsb25nIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZkVuY29kZWRUeXBlTWFwLnB1dCgiUyIsICJzaG9ydCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIloiLCAiYm9vbGVhbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWZFbmNvZGVkVHlwZU1hcC5wdXQoIlYiLCAidm9pZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gZkVuY29kZWRUeXBlTWFwOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU4MGJkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21UZW1wbGF0ZVByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVQcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsOwotCi0vKioKLSAqIFB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBtYWtlIHRoZSBhZGRpdGlvbmFsIHByb3Bvc2FsIGluZm8gaW50byBjb250ZW50Ci0gKiBmaXQgZm9yIGFuIEhUTUwgdmlld2VyIChieSBlc2NhcGluZyBjaGFyYWN0ZXJzKQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotY2xhc3MgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCBleHRlbmRzIFRlbXBsYXRlUHJvcG9zYWwgaW1wbGVtZW50cyBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0KLQlwdWJsaWMgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBJbWFnZSBpbWFnZSwgaW50IHJlbGV2YW5jZSkgewotCQlzdXBlcih0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBpbWFnZSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJcmV0dXJuIFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KGFkZGl0aW9uYWxJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JQmVhbkluZm9Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSUJlYW5JbmZvUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ4N2UzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JQmVhbkluZm9Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJlYW5JbmZvUHJvdmlkZXIgewotCUlKYXZhUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UnVudGltZVByb3BlcnRpZXMoSVJlc291cmNlIGJhc2VSZXNvdXJjZSwgU3RyaW5nIHR5cGVOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lKYXZhUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JSmF2YVByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjA2YTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lKYXZhUHJvcGVydHlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSmF2YVByb3BlcnR5RGVzY3JpcHRvciB7Ci0KLQlTdHJpbmcgZ2V0RGVjbGFyZWRUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0RGlzcGxheU5hbWUoKTsKLQotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQlib29sZWFuIGdldFJlYWRhYmxlKCk7Ci0KLQlib29sZWFuIGdldFdyaXRlYWJsZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2QxZTUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElSZWxlYXNhYmxlIHsKLQkvLyBmb3IgZGVidWdnaW5nCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHRyYW5zbGF0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKRFRfQ09SRV9QTFVHSU5fSUQgPSAib3JnLmVjbGlwc2UuamR0LmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgaW50IGZKc3BTb3VyY2VQb3NpdGlvbiwgZkphdmFQb3NpdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZFcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQlwcml2YXRlIEpTUFRyYW5zbGF0aW9uQWRhcHRlciBmVHJhbnNsYXRpb25BZGFwdGVyID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBsaXN0IG9mIGNvbXBsZXRpb24gcHJvcG9zYWxzIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24KLQkgKiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uCi0JICogd2l0aGluIHRoZSB0ZXh0IHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdmlld2VyIHdob3NlIGRvY3VtZW50IGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgcHJvcG9zYWxzCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb21wbGV0aW9ucyBzaG91bGQKLQkgKiAgICAgICAgICAgIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb21wbGV0aW9uIHByb3Bvc2FscyBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubwotCSAqICAgICAgICAgcHJvcG9zYWxzIGFyZSBwb3NzaWJsZQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgcG9zKSB7Ci0JCWluaXRpYWxpemUocG9zKTsKLQotCQlKU1BQcm9wb3NhbENvbGxlY3RvciBjb2xsZWN0b3IgPSBudWxsOwotCQkKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcikKLQkJCQlmVmlld2VyID0gKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXI7Ci0KLQkJCXhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmVmlld2VyLmdldERvY3VtZW50KCkpOwotCi0JCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmVHJhbnNsYXRpb25BZGFwdGVyID09IG51bGwpCi0JCQkJZlRyYW5zbGF0aW9uQWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQlpZiAoZlRyYW5zbGF0aW9uQWRhcHRlciAhPSBudWxsKSB7Ci0KLQkJCQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGZUcmFuc2xhdGlvbkFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkJCQlmSmF2YVBvc2l0aW9uID0gdHJhbnNsYXRpb24uZ2V0SmF2YU9mZnNldChnZXREb2N1bWVudFBvc2l0aW9uKCkpOwotCi0JCQkJaWYgKERFQlVHKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZGVidWcodHJhbnNsYXRpb24pKTsKLQotCQkJCXRyeSB7Ci0KLQkJCQkJSUNvbXBpbGF0aW9uVW5pdCBjdSA9IHRyYW5zbGF0aW9uLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCi0JCQkJCS8vIGNhbid0IGdldCBqYXZhIHByb3Bvc2FscyB3L291dCBhIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJLy8gb3Igd2l0aG91dCBhIHZhbGlkIHBvc2l0aW9uCi0JCQkJCWlmIChjdSA9PSBudWxsIHx8IC0xID09IGZKYXZhUG9zaXRpb24pCi0JCQkJCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkJCQotCQkJCQljb2xsZWN0b3IgPSBnZXRQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCQkJCQlzeW5jaHJvbml6ZWQgKGN1KSB7Ci0JCQkJCQljdS5jb2RlQ29tcGxldGUoZkphdmFQb3NpdGlvbiwgY29sbGVjdG9yLCBudWxsKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjb3JlRXgpIHsKLQkJCQkJLy8gYSBwb3NzaWJsZSBKYXZhIE1vZGVsIEV4Y2VwdGlvbiBkdWUgdG8gbm90IGJlaW5nIGEgV2ViCi0JCQkJCS8vIChKYXZhKSBQcm9qZWN0Ci0JCQkJCWNvcmVFeC5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsKLQkJCWV4Yy5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vIHRocm93IG91dCBleGNlcHRpb25zIG9uIGNvZGUgYXNzaXN0LgotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCQlpZihjb2xsZWN0b3IgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IGNvbGxlY3Rvci5nZXRKU1BDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCQlpZiAocmVzdWx0cyA9PSBudWxsIHx8IHJlc3VsdHMubGVuZ3RoIDwgMSkKLQkJCQlmRXJyb3JNZXNzYWdlID0gSlNQVUlNZXNzYWdlcy5KYXZhX0NvbnRlbnRfQXNzaXN0X2lzX25vdF9VSV87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCQotCXByb3RlY3RlZCBKU1BQcm9wb3NhbENvbGxlY3RvciBnZXRQcm9wb3NhbENvbGxlY3RvcihJQ29tcGlsYXRpb25Vbml0IGN1LCBKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCQlyZXR1cm4gbmV3IEpTUFByb3Bvc2FsQ29sbGVjdG9yKGN1LCB0cmFuc2xhdGlvbik7Ci0JfQotCQotCS8qKgotCSAqIEZvciBkZWJ1Z2dpbmcgdHJhbnNsYXRpb24gbWFwcGluZyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSB0cmFuc2xhdGlvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGRlYnVnKEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJSGFzaE1hcCBqc3AyamF2YSA9IHRyYW5zbGF0aW9uLmdldEpzcDJKYXZhTWFwKCk7Ci0JCVN0cmluZyBqYXZhVGV4dCA9IHRyYW5zbGF0aW9uLmdldEphdmFUZXh0KCk7Ci0JCVN0cmluZyBqc3BUZXh0ID0gZlZpZXdlci5nZXREb2N1bWVudCgpLmdldCgpOwotCQlkZWJ1Z1N0cmluZy5hcHBlbmQoIltqc3AySmF2YU1hcCBpbiBKU1BDb21wbGV0aW9uUHJvY2Vzc29yXVxyXG4iKTsgLy8kTk9OLU5MUy0xJAotCQlkZWJ1Z1N0cmluZy5hcHBlbmQoImpzcCBjdXJzb3IgcG9zaXRpb24gPj4gIiArIGZWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCkgKyAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCUl0ZXJhdG9yIGl0ID0ganNwMmphdmEua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJdHJ5IHsKLQkJCQlQb3NpdGlvbiBqc3BQb3MgPSAoUG9zaXRpb24pIGl0Lm5leHQoKTsKLQkJCQlQb3NpdGlvbiBqYXZhUG9zID0gKFBvc2l0aW9uKSBqc3AyamF2YS5nZXQoanNwUG9zKTsKLQkJCQlkZWJ1Z1N0cmluZy5hcHBlbmQoImpzcCA+ICIgKyBqc3BQb3Mub2Zmc2V0ICsgIjoiICsganNwUG9zLmxlbmd0aCArICI6IiArIGpzcFRleHQuc3Vic3RyaW5nKGpzcFBvcy5vZmZzZXQsIGpzcFBvcy5vZmZzZXQgKyBqc3BQb3MubGVuZ3RoKSArICI6XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiamF2YSA+ICIgKyBqYXZhUG9zLm9mZnNldCArICI6IiArIGphdmFQb3MubGVuZ3RoICsgIjoiICsgamF2YVRleHQuc3Vic3RyaW5nKGphdmFQb3Mub2Zmc2V0LCBqYXZhUG9zLm9mZnNldCArIGphdmFQb3MubGVuZ3RoKSArICI6XG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCS8vIGVhdCBleGNlcHRpb25zLCBpdCdzIG9ubHkgZm9yIGRlYnVnCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlYnVnU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBjb250ZXh0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHBvc3NpYmxlCi0JICogICAgICAgICAgICBjb250ZXh0cwotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICBhbiBvZmZzZXQgd2l0aGluIHRoZSBkb2N1bWVudCBmb3Igd2hpY2ggY29udGV4dCBpbmZvcm1hdGlvbgotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgIGlmIG5vIGNvbnRleHQgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gcHJlc3NlZCBzaG91bGQgYXV0b21hdGljYWxseQotCSAqIGRpc3BsYXkgY29udGVudC1hc3Npc3QgcHJvcG9zYWxzLgotCSAqIAotCSAqIEByZXR1cm4gc3RyaW5nIG9mIGNoYXJhY3RlcnMKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdXRvUHJvcG9zYWxJbnZvY2F0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyBvZiBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gcHJlc3NlZCBzaG91bGQgYXV0b21hdGljYWxseQotCSAqIGRpc3BsYXkgYSBjb250ZW50LWFzc2lzdCB0aXAuCi0JICogCi0JICogQHJldHVybiBzdHJpbmcgb2YgY2hhcmFjdGVycwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEF1dG9UaXBJbnZvY2F0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIGNvbXBsZXRpb24gcHJvcG9zYWwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgYXV0byBhY3RpdmF0aW9uIGNoYXJhY3RlcnMgZm9yIHByZXNlbnRpbmcgY29udGV4dAotCSAqICAgICAgICAgaW5mb3JtYXRpb24gb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzCi0JICogICAgICAgICBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gYSBjb250ZXh0IGluZm9ybWF0aW9uIHZhbGlkYXRvciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlCi0JICogICAgICAgICBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXREb2N1bWVudFBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkpzcFNvdXJjZVBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQkvLyBUT0RPOiBnZXQgYXBwcm9wcmlhdGUgZXJyb3IgbWVzc2FnZQotCQkvLyBpZiAoZkNvbGxlY3Rvci5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsICYmCi0JCS8vIGZDb2xsZWN0b3IuZ2V0RXJyb3JNZXNzYWdlKCkubGVuZ3RoKCkgPiAwKQotCQkvLyByZXR1cm4gZkNvbGxlY3Rvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJcmV0dXJuIGZFcnJvck1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGUgY29kZSBhc3Npc3QgcHJvY2Vzc29yLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoaW50IHBvcykgewotCQlpbml0aWFsaXplSmF2YVBsdWdpbnMoKTsKLQotCQlmSnNwU291cmNlUG9zaXRpb24gPSBwb3M7Ci0JCWZFcnJvck1lc3NhZ2UgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhlIEphdmEgUGx1Z2lucyB0aGF0IHRoZSBKU1AgcHJvY2Vzc29yIHJlcXVpcmVzLgotCSAqIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTQzNzY1Ci0JICogV2Ugc2hvdWxkIG5vdCBjYWxsICJzdGFydCIsIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlIHRoYXQgCi0JICogc3RhdGUgdG8gYmUgcmVtZW1iZXJlZCwgYW5kIHJlLXN0YXJ0ZWQgYXV0b21hdGljYWxseSBkdXJpbmcgCi0JICogdGhlIG5leHQgYm9vdCB1cCBzZXF1ZW5jZS4gCi0JICogCi0JICogSVNTVUU6IHdlIG1heSBiZSBhYmxlIHRvIGdldCByaWQgb2YgdGhpcyBhbGwgdG9nZXRoZXIsIGluIGZ1dHVyZSwgCi0JICogc2luY2UgOTklIHdlIHByb2JhYmx5IGhhdmUgYWxyZWFkeSB1c2VkIHNvbWUgSkRUIGNsYXNzIGJ5IHRoZSB0aW1lIAotCSAqIHdlIG5lZWQgSkRUIHRvIGJlIGFjdGl2ZSAuLi4gYnV0IC4uLiB0aGlzIGlzIHRoZSBzYWZlc3QgZml4IGZvciAKLQkgKiB0aGlzIHBvaW50IGluIDEuNSBzdHJlYW0uIE5leHQgcmVsZWFzZSwgbGV0J3MganVzdCByZW1vdmUgdGhpcywgCi0JICogcmUtZGlzY292ZXIgd2hhdCBldmVyIGJ1ZyB0aGlzIHdhcyBmaXhpbmcgKGlmIGFueSkgYW5kIGlmIHRoZXJlIGlzIAotCSAqIG9uZSwgdGhlbiB3ZSdsbCBlaXRoZXIgcHV0IGJhY2sgaW4sIGFzIGlzLCBvciBjb21lIHVwIHdpdGggYSAKLQkgKiBtb3JlIGFwcHJvcHJpYXRlIGZpeC4gCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUphdmFQbHVnaW5zKCkgewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShKRFRfQ09SRV9QTFVHSU5fSUQpOwotCQkJYnVuZGxlLmxvYWRDbGFzcygiZHVtbXlDbGFzc05hbWVUaGF0U2hvdWxkTmV2ZXJFeGlzdCIpOwotCQl9Ci0JCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHRoaXMgaXMgdGhlIGV4cGVjdGVkIHJlc3VsdCwgd2UganVzdCB3YW50IHRvIAotCQkJLy8gbnVkZ2UgdGhlIGJ1bmRsZSB0byBiZSBzdXJlIGl0cyBhY3RpdmF0ZWQuIAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJZlRyYW5zbGF0aW9uQWRhcHRlciA9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUENvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMjlkNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmphdmEuSUphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIElKYXZhQ29tcGxldGlvblByb3Bvc2FsIGZvciB1c2Ugd2l0aCBKU1BQcm9wb3NhbENvbGxlY3Rvci4KLSAqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEpTUENvbXBsZXRpb25Qcm9wb3NhbCBleHRlbmRzIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBpbXBsZW1lbnRzIElKYXZhQ29tcGxldGlvblByb3Bvc2FsICB7Ci0KLQkvKgotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjQ0ODMKLQkgKiAKLQkgKiBUaGlzIGlzIGEgd3JhcHBlZCBwcm9wb3NhbCBzbyB3ZSBkb24ndCBuZWVkIHRvIAotCSAqIG1ha2UgInNsb3ciIGNhbGxzIHRvIHRoZSBqYXZhIHByb3Bvc2FsIHVwIGZyb250LCBvbmx5IHdoZW4gbmVlZGVkCi0JICogZm9yIGV4YW1wbGUsIGdldEFkZGl0aW9uYWxJbmZvKCkgcmVhZHMgZXh0ZXJuYWwgamF2YWRvYywgYW5kIGl0IG1ha2VzCi0JICogbm8gc2Vuc2UKLQkgKi8gCi0JSUNvbXBsZXRpb25Qcm9wb3NhbCBmSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCA9IG51bGw7Ci0JCi0JcHVibGljIEpTUENvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywgSUNvbnRleHRJbmZvcm1hdGlvbiBjb250ZXh0SW5mb3JtYXRpb24sIFN0cmluZyBhZGRpdGlvbmFsUHJvcG9zYWxJbmZvLCBpbnQgcmVsZXZhbmNlLCBib29sZWFuIHVwZGF0ZVJlcGxhY2VtZW50TGVuZ3RoT25WYWxpZGF0ZSkgewotCQlzdXBlcihyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgcmVsZXZhbmNlLCB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpOwotCX0KLQkKLQkvKioKLQkgKiBTZXRzIGN1cnNvciBwb3NpdGlvbiBhZnRlciBhcHBseWluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseShJVGV4dFZpZXdlciB2aWV3ZXIsIGNoYXIgdHJpZ2dlciwgaW50IHN0YXRlTWFzaywgaW50IG9mZnNldCkgewotCQlzdXBlci5hcHBseSh2aWV3ZXIsIHRyaWdnZXIsIHN0YXRlTWFzaywgb2Zmc2V0KTsKLQl9Ci0KLQlmaW5hbCBwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbCBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKCkgewotCQlyZXR1cm4gZkphdmFDb21wbGV0aW9uUHJvcG9zYWw7Ci0JfQotCi0JZmluYWwgcHVibGljIHZvaWQgc2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbChJQ29tcGxldGlvblByb3Bvc2FsIGphdmFDb21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJZkphdmFDb21wbGV0aW9uUHJvcG9zYWwgPSBqYXZhQ29tcGxldGlvblByb3Bvc2FsOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCQotCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgamF2YVByb3Bvc2FsID0gZ2V0SmF2YUNvbXBsZXRpb25Qcm9wb3NhbCgpOwotCQlpZihqYXZhUHJvcG9zYWwgIT0gbnVsbCkKLQkJCWFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJCi0JCXJldHVybiBhZGRpdGlvbmFsSW5mbzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNWY1MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuUGFnZURpcmVjdGl2ZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTJOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUENNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5IVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC51aS5pbnRlcm5hbC5jb21tb24uY29udGVudGFzc2lzdC5KYXZhU2NyaXB0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUxTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50VHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsLkNNTm9kZVdyYXBwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0UmVxdWVzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlByb3Bvc2FsQ29tcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudEFzc2lzdFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEFkZHMgcHJvcG9zYWxzIG5vdCBub3JtYWxseSBjb3ZlcmVkIGJ5IHRoZSBnZW5lcmljIGJlaGF2aW9yIHdpdGggdGhlCi0gKiBjb250ZW50IG1vZGVsCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0KLQlwcm90ZWN0ZWQgaW50IGRlcHRoQ291bnQgPSAwOwotCXByb3RlY3RlZCBJVGV4dFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VFbWJlZGRlZFJlc3VsdHMgPSB0cnVlOwotCXByb3RlY3RlZCBib29sZWFuIGlzSW50ZXJuYWxBZGFwdGVyID0gZmFsc2U7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgZk5hbWVUb1Byb2Nlc3Nvck1hcCA9IG51bGw7Ci0JcHJvdGVjdGVkIEhhc2hNYXAgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIElDb21wbGV0aW9uUHJvcG9zYWxbXSBFTVBUWV9QUk9QT1NBTF9TRVQgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQlwcml2YXRlIEpTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBmVGVtcGxhdGVQcm9jZXNzb3IgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVGVtcGxhdGVDb250ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCQlpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCk7Ci0JCWluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCX0KLQotCS8qKgotCSAqIGluaXQgbWFwIGZvciBleHRyYSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzICh1c2VCZWFuLAotCSAqIGdldC9zZXRQcm9wZXJ0eSkuIHBvaW50cyBbdGFnbmFtZSA+IHByb2Nlc3Nvcl0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TmFtZVRvUHJvY2Vzc29yTWFwKCkgewotCQlmTmFtZVRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcFByb3BlcnR5Q0FQID0gbmV3IEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSwganNwUHJvcGVydHlDQVApOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwLnB1dChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOLCBuZXcgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSk7Ci0JfQotCi0JLyoqCi0JICogaW50IG1hcCB0aGF0IHBvaW50cyBbcGFydGl0aW9uID4gcHJvY2Vzc29yXS4gVGhpcyB0YWtlcyBwbGFjZSBvZgotCSAqIGVtYmVkZGVkIGFkYXB0ZXJzIGZvciBub3cuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciBodG1sUHJvY2Vzc29yID0gbmV3IEhUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCUpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcEphdmFQcm9jZXNzb3IgPSBuZXcgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciB4bWxQcm9jZXNzb3IgPSBuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlKYXZhU2NyaXB0Q29udGVudEFzc2lzdFByb2Nlc3NvciBqYXZhc2NyaXB0UHJvY2Vzc29yID0gbmV3IEphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0KLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxULCBodG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCwgeG1sUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04sIGh0bWxQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxULCBqc3BKYXZhUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFLCB4bWxQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIGh0bWxQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQsIGphdmFzY3JpcHRQcm9jZXNzb3IpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAucHV0KElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUX0VMLCBqc3BKYXZhUHJvY2Vzc29yKTsKLQkJZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLnB1dChJSFRNTFBhcnRpdGlvbnMuU0NSSVBULCBqYXZhc2NyaXB0UHJvY2Vzc29yKTsgLy8gZGVmYXVsdAotCQkvLyB0bwotCQkvLyBqYXZhc2NyaXB0Ci0JCS8vIGZvcgotCQkvLyBhbGwKLQkJLy8gc2NyaXB0Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWVudFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGREb2NUeXBlUHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLk5FVyk7Ci0KLQkJc3VwZXIuYWRkRW1wdHlEb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgMCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUENEQVRBUHJvcG9zYWwoU3RyaW5nIG5vZGVOYW1lLCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnQ2xvc2VQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFhNTFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbmRUYWdQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURSk7Ci0JfQotCi0JLyoqCi0JICogYWRkIHByb3Bvc2FscyBmb3IgdGFncyBpbiBhdHRyaWJ1dGUgdmFsdWVzCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFUVFJJQlVURV9WQUxVRSk7Ci0KLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCi0JCS8vIGFkZCBKU1AgZXh0cmEgcHJvcG9zYWxzIGZyb20gSlNQQmVhbkluZm9Db250ZW50QXNzaXN0UHJvY2Vzc29yCi0JCS8vIEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcgotCi0JCS8vIDIuMQotCQkvLyBnZXQgcmVzdWx0cyBmcm9tIEpTUFVzZUJlYW4gYW5kIEpTUFByb3BlcnR5IGhlcmUKLQkJLy8gKGxvb2sgdXAgcHJvY2Vzc29yIGluIGEgbWFwIGJhc2VkIG9uIG5vZGUgbmFtZSkKLQkJSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dHJhUHJvY2Vzc29yID0gKEpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvcikgZk5hbWVUb1Byb2Nlc3Nvck1hcC5nZXQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKGV4dHJhUHJvY2Vzc29yICE9IG51bGwgJiYgY29udGVudEFzc2lzdFJlcXVlc3QgIT0gbnVsbCkgewotCQkJZXh0cmFQcm9jZXNzb3IuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJQ01Eb2N1bWVudCBkb2MgPSBtcS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChub2RlKTsKLQkJCS8vIHRoaXMgc2hvdWxkbid0IGhhdmUgdG8gaGF2ZSB0aGUgcHJlZml4IGNvZGVkIGluCi0JCQlpZiAoZG9jIGluc3RhbmNlb2YgSlNQQ01Eb2N1bWVudCB8fCBkb2MgaW5zdGFuY2VvZiBDTU5vZGVXcmFwcGVyIHx8IG5vZGUuZ2V0Tm9kZU5hbWUoKS5zdGFydHNXaXRoKCJqc3A6IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3BlbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IG9wZW5SZWdpb25zID0gb3Blbi5nZXRSZWdpb25zKCk7Ci0JCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KG5hbWVSZWdpb24pOwotCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbnVsbDsKLQkJaWYgKGF0dHJpYnV0ZU5hbWUgIT0gbnVsbCkKLQkJCWN1cnJlbnRWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQotCQkvLyBvbiBhbiBlbXB0eSB2YWx1ZSwgYWRkIGFsbCB0aGUgSlNQIGFuZCB0YWdsaWIgdGFncwotCQlpZiAoKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpID09IDApIHx8IChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSAmJiAoY3VycmVudFZhbHVlID09IG51bGwgfHwgY3VycmVudFZhbHVlLmxlbmd0aCgpID09IDApKSkgewotCQkJTGlzdCByZWplY3RFbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVYUFJFU1NJT04pOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRFQ0xBUkFUSU9OKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfSU5DTFVERSk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1BBR0UpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9UQUdMSUIpOwotCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZBTExCQUNLKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5TRVRQUk9QRVJUWSk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9SV0FSRCk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUExVR0lOKTsKLQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsKLQotCQkJTGlzdCBhZGRpdGlvbmFsRWxlbWVudHMgPSBnZXRBZGRpdGlvbmFsQ2hpbGRyZW4obmV3IEFycmF5TGlzdCgpLCBub2RlLCAtMSk7Ci0JCQlmb3IgKGkgPSAwOyBpIDwgYWRkaXRpb25hbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGFkZGl0aW9uYWxFbGVtZW50cy5nZXQoaSk7Ci0JCQkJaWYgKHJlamVjdEVsZW1lbnRzLmNvbnRhaW5zKGVkLmdldE5vZGVOYW1lKCkpKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHJpbmcgdGFnbmFtZSA9IGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRSZXF1aXJlZE5hbWUobm9kZSwgZWQpOwotCQkJCVN0cmluZ0J1ZmZlciBjb250ZW50cyA9IG5ldyBTdHJpbmdCdWZmZXIoIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVUYWcobm9kZSwgZWQsIGNvbnRlbnRzKTsKLQkJCQljb250ZW50cy5hcHBlbmQoJyInKTsKLQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKGNvbnRlbnRzLnRvU3RyaW5nKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBjb250ZW50cy5sZW5ndGgoKSwgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyksIHRhZ25hbWUsIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0pTUF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCi0JCWVsc2UgaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQl0cnkgewotCQkJCS8vIENyZWF0ZSBhIG5ldyBtb2RlbCBmb3IgQ29udGVudCBBc3Npc3QgdG8gb3BlcmF0ZSBvbi4gVGhpcwotCQkJCS8vIHdpbGwgc2ltdWxhdGUKLQkJCQkvLyBhIGZ1bGwgRG9jdW1lbnQgYW5kIHRoZW4gYWRqdXN0IHRoZSBvZmZzZXQgbnVtYmVycyBpbiB0aGUKLQkJCQkvLyBsaXN0IG9mIHJlc3VsdHMuCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBpbnRlcm5hbE1vZGVsID0gbnVsbDsKLQkJCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJCQlpbnRlcm5hbE1vZGVsID0gbW1hbmFnZXIuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQkJCUlET01Nb2RlbCB4bWxPdXRlck1vZGVsID0gbnVsbDsKLQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJeG1sTm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCQkJCQl4bWxPdXRlck1vZGVsID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCQlpbnRlcm5hbE1vZGVsLnNldFJlc29sdmVyKHhtbE91dGVyTW9kZWwuZ2V0UmVzb2x2ZXIoKSk7Ci0JCQkJCWludGVybmFsTW9kZWwuc2V0QmFzZUxvY2F0aW9uKHhtbE91dGVyTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCX0KLQkJCQlTdHJpbmcgY29udGVudHMgPSBTdHJpbmdVdGlscy5zdHJpcChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRUZXh0KCkpOwotCQkJCWlmICh4bWxOb2RlICE9IG51bGwgJiYgY29udGVudHMgIT0gbnVsbCkgewotCQkJCQlpbnQgYWRkaXRpb25hbFNoaWZ0cyA9IDA7Ci0JCQkJCS8vIEJlIHN1cmUgdGhhdCBjdXN0b20gdGFncyBmcm9tIHRhZ2xpYnMgYWxzbyBzaG93IHVwCi0JCQkJCS8vIGJ5Ci0JCQkJCS8vIGFkZGluZyB0YWdsaWIgZGVjbGFyYXRpb25zIHRvIHRoZSBpbnRlcm5hbCBtb2RlbC4KLQkJCQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgbWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcih4bWxPdXRlck1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IHRyYWNrZXJzID0gbWdyLmdldENNRG9jdW1lbnRUcmFja2Vycyhjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JCQkJCQlpZiAodHJhY2tlcnMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaSA9IDA7IGkgPCB0cmFja2Vycy5zaXplKCk7IGkrKykgewotCQkJCQkJCQlDTURvY3VtZW50VHJhY2tlciB0cmFja2VyID0gKENNRG9jdW1lbnRUcmFja2VyKSB0cmFja2Vycy5nZXQoaSk7Ci0JCQkJCQkJCVN0cmluZyBkZWNsYXJhdGlvbiA9IHRyYWNrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCQkJCQkJCQlpZiAoZGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQkJCQkJY29udGVudHMgPSBkZWNsYXJhdGlvbiArIGNvbnRlbnRzOwotCQkJCQkJCQkJYWRkaXRpb25hbFNoaWZ0cyArPSBkZWNsYXJhdGlvbi5sZW5ndGgoKTsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBBbHNvIGNvcHkgYW55IGpzcDp1c2VCZWFuIHRhZ3Mgc28gdGhhdAotCQkJCQkvLyBqc3A6W2dzXWV0UHJvcGVydHkgd2lsbCBmdW5jdGlvbgotCQkJCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotCQkJCQkJZG9jID0gKERvY3VtZW50KSBub2RlOwotCQkJCQllbHNlCi0JCQkJCQlkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQkJTm9kZUxpc3QgdXNlQmVhbnMgPSBkb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTik7Ci0JCQkJCWZvciAoaW50IGsgPSAwOyBrIDwgdXNlQmVhbnMuZ2V0TGVuZ3RoKCk7IGsrKykgewotCQkJCQkJSURPTU5vZGUgdXNlQmVhbiA9IChJRE9NTm9kZSkgdXNlQmVhbnMuaXRlbShrKTsKLQkJCQkJCWlmICh1c2VCZWFuLmdldFN0YXJ0T2Zmc2V0KCkgPCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSkgewotCQkJCQkJCVN0cmluZ0J1ZmZlciB1c2VCZWFuVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoIjxqc3A6dXNlQmVhbiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCB1c2VCZWFuLmdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJCUF0dHIgYXR0ciA9IChBdHRyKSB1c2VCZWFuLmdldEF0dHJpYnV0ZXMoKS5pdGVtKGopOwotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoJyAnKTsKLQkJCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKCI9XCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQl1c2VCZWFuVGV4dC5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQkJCQkJdXNlQmVhblRleHQuYXBwZW5kKCciJyk7Ci0JCQkJCQkJfQotCQkJCQkJCXVzZUJlYW5UZXh0LmFwcGVuZCgiLz4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWFkZGl0aW9uYWxTaGlmdHMgKz0gdXNlQmVhblRleHQubGVuZ3RoKCk7Ci0JCQkJCQkJY29udGVudHMgPSB1c2VCZWFuVGV4dC50b1N0cmluZygpICsgY29udGVudHM7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaW50ZXJuYWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXQoY29udGVudHMpOwotCQkJCQlpbnQgaW50ZXJuYWxPZmZzZXQgPSAwOwotCQkJCQlib29sZWFuIHF1b3RlZCA9IGZhbHNlOwotCQkJCQkvLyBpZiBxdW90ZWQsIHVzZSBwb3NpdGlvbiBpbnNpZGUgYW5kIHNoaWZ0IGJ5IG9uZQotCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDAgJiYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkuY2hhckF0KDApID09ICdcJycgfHwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5jaGFyQXQoMCkgPT0gJyInKSkgewotCQkJCQkJaW50ZXJuYWxPZmZzZXQgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpIC0gMSArIGFkZGl0aW9uYWxTaGlmdHM7Ci0JCQkJCQlxdW90ZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCS8vIGlmIHVucXVvdGVkLCB1c2UgcG9zaXRpb24gaW5zaWRlCi0JCQkJCWVsc2UgaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkuY2hhckF0KDApID09ICc8JykKLQkJCQkJCWludGVybmFsT2Zmc2V0ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSArIGFkZGl0aW9uYWxTaGlmdHM7Ci0JCQkJCWVsc2UKLQkJCQkJCWludGVybmFsT2Zmc2V0ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgLSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRTdGFydE9mZnNldCgpICsgYWRkaXRpb25hbFNoaWZ0czsKLQkJCQkJZGVwdGhDb3VudCsrOwotCQkJCQlJbmRleGVkUmVnaW9uIGludGVybmFsTm9kZSA9IG51bGw7Ci0JCQkJCWludCB0bXBPZmZzZXQgPSBpbnRlcm5hbE9mZnNldDsKLQkJCQkJd2hpbGUgKGludGVybmFsTm9kZSA9PSBudWxsICYmIHRtcE9mZnNldCA+PSAwKQotCQkJCQkJaW50ZXJuYWxOb2RlID0gaW50ZXJuYWxNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRtcE9mZnNldC0tKTsKLQotCQkJCQlpZiAoaW50ZXJuYWxNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBzZXQgdXAgdGhlIGludGVybmFsIG1vZGVsCi0JCQkJCQlpZiAoaW50ZXJuYWxNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQkJCQkJaW50ZXJuYWxNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKS5hZGRGYWN0b3J5KG5ldyBQYWdlRGlyZWN0aXZlQWRhcHRlckZhY3RvcnkoKSk7Ci0JCQkJCQl9Ci0JCQkJCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBvdXRlckVtYmVkZGVkVHlwZUFkYXB0ZXIgPSAoUGFnZURpcmVjdGl2ZUFkYXB0ZXIpIHhtbE91dGVyTW9kZWwuZ2V0RG9jdW1lbnQoKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCVBhZ2VEaXJlY3RpdmVBZGFwdGVyIGludGVybmFsRW1iZWRkZWRUeXBlQWRhcHRlciA9IChQYWdlRGlyZWN0aXZlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSAoKE5vZGUpIGludGVybmFsTm9kZSkuZ2V0T3duZXJEb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWludGVybmFsRW1iZWRkZWRUeXBlQWRhcHRlci5zZXRFbWJlZGRlZFR5cGUob3V0ZXJFbWJlZGRlZFR5cGVBZGFwdGVyLmdldEVtYmVkZGVkVHlwZSgpKTsKLQkJCQkJfQotCi0JCQkJCUFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgYWRhcHRlclJlZ2lzdHJ5ID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCQkJSXRlcmF0b3IgYWRhcHRlckxpc3QgPSBhZGFwdGVyUmVnaXN0cnkuZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCQkJCQkvLyBBbmQgYWxsIHRob3NlIGFwcHJvcHJpYXRlIGZvciB0aGlzIHBhcnRpY3VsYXIgdHlwZQotCQkJCQkvLyBvZiBjb250ZW50Ci0JCQkJCXdoaWxlIChhZGFwdGVyTGlzdC5oYXNOZXh0KCkpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQWRhcHRlckZhY3RvcnlQcm92aWRlciBwcm92aWRlciA9IChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBhZGFwdGVyTGlzdC5uZXh0KCk7Ci0JCQkJCQkJaWYgKHByb3ZpZGVyLmlzRm9yKGludGVybmFsTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCkpKSB7Ci0JCQkJCQkJCXByb3ZpZGVyLmFkZEFkYXB0ZXJGYWN0b3JpZXMoaW50ZXJuYWxNb2RlbCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8qKgotCQkJCQkgKiB0aGUgaW50ZXJuYWwgYWRhcHRlciBkb2VzIGFsbCB0aGUgcmVhbCB3b3JrIG9mIHVzaW5nCi0JCQkJCSAqIHRoZSBKU1AgY29udGVudCBtb2RlbCB0byBmb3JtIHByb3Bvc2FscwotCQkJCQkgKi8KLQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBudWxsOwotCQkJCQlkZXB0aENvdW50LS07Ci0JCQkJCWlmIChyZXN1bHRzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldFJlcGxhY2VtZW50T2Zmc2V0KCkgLSBhZGRpdGlvbmFsU2hpZnRzICsgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0U3RhcnRPZmZzZXQoKSArIChxdW90ZWQgPyAxIDogMCksICgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0Q3Vyc29yUG9zaXRpb24oKSwgcmVzdWx0c1tpXS5nZXRJbWFnZSgpLCByZXN1bHRzW2ldLmdldERpc3BsYXlTdHJpbmcoKSwgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHJlc3VsdHNbaV0pLmdldENvbnRleHRJbmZvcm1hdGlvbigpLCAoKEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCkgcmVzdWx0c1tpXSkuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpLCAocmVzdWx0c1tpXSBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwpID8gKChJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzW2ldKS5nZXRSZWxldmFuY2UoKSA6IElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciBpbiBlbWJlZGRlZCBKU1AgQ29udGVudCBBc3Npc3QiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRBZGRpdGlvbmFsQ2hpbGRyZW4oTGlzdCBlbGVtZW50RGVjbHMsIE5vZGUgbm9kZSwgaW50IGNoaWxkSW5kZXgpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJLyoKLQkJCSAqIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbnRlbmRlZCBpbnNlcnRpb24gYXMgaXQgd2lsbCBnaXZlIHVzCi0JCQkgKiB0aGUgY29ycmVjdCBvZmZzZXQgZm9yIGNoZWNraW5nIHBvc2l0aW9uIGRlcGVuZGVudCBDTURvY3VtZW50cwotCQkJICovCi0JCQlpbnQgdGV4dEluc2VydGlvbk9mZnNldCA9IDA7Ci0JCQlOb2RlTGlzdCBjaGlsZHJlbiA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkcmVuLmdldExlbmd0aCgpID49IGNoaWxkSW5kZXggJiYgY2hpbGRJbmRleCA+PSAwKSB7Ci0JCQkJTm9kZSBub2RlQWxyZWFkeUF0SW5kZXggPSBjaGlsZHJlbi5pdGVtKGNoaWxkSW5kZXgpOwotCQkJCWlmIChub2RlQWxyZWFkeUF0SW5kZXggaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCQkJdGV4dEluc2VydGlvbk9mZnNldCA9ICgoSURPTU5vZGUpIG5vZGVBbHJlYWR5QXRJbmRleCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0ZXh0SW5zZXJ0aW9uT2Zmc2V0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCVRMRENNRG9jdW1lbnRNYW5hZ2VyIG1nciA9IFRhZ2xpYkNvbnRyb2xsZXIuZ2V0VExEQ01Eb2N1bWVudE1hbmFnZXIoKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJTGlzdCBtb3JlQ01Eb2N1bWVudHMgPSBtZ3IuZ2V0Q01Eb2N1bWVudFRyYWNrZXJzKHRleHRJbnNlcnRpb25PZmZzZXQpOwotCQkJCWlmIChtb3JlQ01Eb2N1bWVudHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG1vcmVDTURvY3VtZW50cy5zaXplKCk7IGkrKykgewotCQkJCQkJQ01Eb2N1bWVudCBkb2MgPSAoQ01Eb2N1bWVudCkgbW9yZUNNRG9jdW1lbnRzLmdldChpKTsKLQkJCQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gZG9jLmdldEVsZW1lbnRzKCk7Ci0JCQkJCQlpZiAoZWxlbWVudHMgIT0gbnVsbCkgewotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZWxlbWVudHMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuaXRlbShqKTsKLQkJCQkJCQkJZWxlbWVudERlY2xzLmFkZChlZCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBnZXQgcG9zaXRpb24gZGVwZW5kZW50IENNRG9jdW1lbnRzIGFuZCBpbnNlcnQgdGhlaXIgdGFncyBhcwotCQkJLy8gcHJvcG9zYWxzCi0KLQkJCU1vZGVsUXVlcnlBZGFwdGVyIG1xQWRhcHRlciA9IG51bGw7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQltcUFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSURPTU5vZGUpIG5vZGUpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJZWxzZQotCQkJCW1xQWRhcHRlciA9IChNb2RlbFF1ZXJ5QWRhcHRlcikgKChJRE9NTm9kZSkgbm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCi0JCQlpZiAobXFBZGFwdGVyICE9IG51bGwpIHsKLQkJCQlDTURvY3VtZW50IGRvYyA9IG1xQWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0JCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0KLQkJCQkJQ01Eb2N1bWVudCBKQ01Eb2MgPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSlNQMTFfRE9DX1RZUEUpOwotCQkJCQlDTU5hbWVkTm9kZU1hcCBqc3BlbGVtZW50cyA9IEpDTURvYy5nZXRFbGVtZW50cygpOwotCi0JCQkJCWlmIChqc3BlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCQlMaXN0IHJlamVjdEVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCQkJCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGRvY3VtZW50IGlzIGluIFhNTCBmb3JtCi0JCQkJCQlEb2N1bWVudCBkb21Eb2MgPSBudWxsOwotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQkJZG9tRG9jID0gKERvY3VtZW50KSBub2RlOwotCQkJCQkJZWxzZQotCQkJCQkJCWRvbURvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCQkJCi0JCQkJCQkvLyBTaG93IFhNTCB0YWcgZm9ybXMgb2YgSlNQIG1hcmtlcnMgaWYganNwOnJvb3QgaXMKLQkJCQkJCS8vIHRoZSBkb2N1bWVudCBlbGVtZW50IE9SIGl0J3MgSFRNTCBidXQKLQkJCQkJCS8vIGlzbid0IHJlYWxseSBpbiB0aGUgdGV4dC4KLQkJCQkJCS8vIElmIHRoZSBkb2N1bWVudCBpc24ndCBzdHJpY3RseSBYTUwsIHB1bGwgb3V0IHRoZQotCQkJCQkJLy8gWE1MIHRhZyBmb3JtcyBpdCBpcyB4bWwgZm9ybWF0Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUTEVUKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5FWFBSRVNTSU9OKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERUNMQVJBVElPTik7Ci0JCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX0lOQ0xVREUpOwotCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5URVhUKTsKLQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfVEFHTElCKTsKLQkJCQkJCQkKLQkJCQkJCWlmIChpc1hNTEZvcm1hdChkb21Eb2MpKSB7Ci0KLQkJCQkJCQkvLyBqc3AgYWN0aW9ucwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVTRUJFQU4pOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5HRVRQUk9QRVJUWSk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5DTFVERSk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUldBUkQpOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5QTFVHSU4pOwotCQkJCQkJCXJlamVjdEVsZW1lbnRzLmFkZChKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5GQUxMQkFDSyk7Ci0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBBUkFNKTsKLQkJCQkJCQlyZWplY3RFbGVtZW50cy5hZGQoSlNQMTJOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU1TKTsKLQkJCQkJCX0KLQkJCQkJCQotCQkJCQkJCi0JCQkJCQkvLyBkb24ndCBzaG93IGpzcDpyb290IGlmIGEgZG9jdW1lbnQgZWxlbWVudCBhbHJlYWR5Ci0JCQkJCQkvLyBleGlzdHMKLQkJCQkJCUVsZW1lbnQgZG9jRWxlbWVudCA9IGRvbURvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQkJCQkJCWlmIChkb2NFbGVtZW50ICE9IG51bGwgJiYgKChkb2NFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKCJqc3A6cm9vdCIpKSB8fCAoKCgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCB8fCAoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSkpKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmVqZWN0RWxlbWVudHMuYWRkKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLlJPT1QpOwotCi0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGpzcGVsZW1lbnRzLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikganNwZWxlbWVudHMuaXRlbShqKTsKLQkJCQkJCQlpZiAocmVqZWN0RWxlbWVudHMuY29udGFpbnMoZWQuZ2V0Tm9kZU5hbWUoKSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCWVsZW1lbnREZWNscy5hZGQoZWQpOwotCQkJCQkJfQotCQkJCQkKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudERlY2xzOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChFbGVtZW50IHBhcmVudCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgYWRkaXRpb25hbEVsZW1lbnRzID0gZ2V0QWRkaXRpb25hbENoaWxkcmVuKG5ldyBBcnJheUxpc3QoKSwgcGFyZW50LCBpbmRleCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRkaXRpb25hbEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQlNb2RlbFF1ZXJ5QWN0aW9uIGluc2VydEFjdGlvbiA9IG5ldyBOb25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGFkZGl0aW9uYWxFbGVtZW50cy5nZXQoaSksIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJULCAwLCBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpLCBudWxsKTsKLQkJCWxpc3QuYWRkKGluc2VydEFjdGlvbik7Ci0JCX0KLQotCQkvLyBhZGQgYWxsb3dlZCBjaGlsZHJlbiBvZiBpbXBsaWNpdCB0YWdzIHRoYXQgZG9uJ3QgYWxyZWFkeSBleGlzdAotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCUxpc3QgY2hpbGROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGNoaWxkcmVuICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljaGlsZE5hbWVzLmFkZChjaGlsZC5nZXROb2RlTmFtZSgpLnRvTG93ZXJDYXNlKCkpOwotCQkJfQotCQl9Ci0JCUxpc3QgYWxsQWN0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWFsbEFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQlpZiAoYWN0aW9uLmdldENNTm9kZSgpIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCUhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgYWN0aW9uLmdldENNTm9kZSgpOwotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlZC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKCFjaGlsZE5hbWVzLmNvbnRhaW5zKGVkLmdldE5vZGVOYW1lKCkudG9Mb3dlckNhc2UoKSkgJiYgKChvbW1pc3Npb24gIT0gbnVsbCkgJiYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIKSkpKSB7Ci0JCQkJCUxpc3QgaW1wbGljaXRWYWxpZEFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIGVkLCAwLCBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMsIE1vZGVsUXVlcnkuVkFMSURJVFlfTk9ORSwgaW1wbGljaXRWYWxpZEFjdGlvbnMpOwotCQkJCQlpZiAoaW1wbGljaXRWYWxpZEFjdGlvbnMgIT0gbnVsbCkgewotCQkJCQkJSXRlcmF0b3IgaW1wbGljaXRWYWxpZEFjdGlvbnNJdGVyYXRvciA9IGltcGxpY2l0VmFsaWRBY3Rpb25zLml0ZXJhdG9yKCk7Ci0JCQkJCQl3aGlsZSAoaW1wbGljaXRWYWxpZEFjdGlvbnNJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCQlNb2RlbFF1ZXJ5QWN0aW9uIGluc2VydEFjdGlvbiA9IG5ldyBOb25WYWxpZGF0aW5nTW9kZWxRdWVyeUFjdGlvbigoKE1vZGVsUXVlcnlBY3Rpb24pIGltcGxpY2l0VmFsaWRBY3Rpb25zSXRlcmF0b3IubmV4dCgpKS5nZXRDTU5vZGUoKSwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIDAsIHBhcmVudC5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCksIG51bGwpOwotCQkJCQkJCWFsbEFjdGlvbnMuYWRkKGluc2VydEFjdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFsbEFjdGlvbnM7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKERvY3VtZW50IGRvY3VtZW50LCBpbnQgY2hpbGRJbmRleCkgewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghaXNYTUxGb3JtYXQoZG9jdW1lbnQpKQotCQkJZ2V0QWRkaXRpb25hbENoaWxkcmVuKGxpc3QsIGRvY3VtZW50LCBjaGlsZEluZGV4KTsKLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJc3VwZXIuaW5pdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCWlmIChkZXB0aENvdW50ID09IDApCi0JCQlmRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGFjdGluZyBhcyBhICJjYXRjaCBhbGwiIGZvciBwdWxsaW5nIHRvZ2V0aGVyIGNvbnRlbnQKLQkgKiBhc3Npc3QgcHJvcG9zYWxzIGZyb20gZGlmZmVyZW50IFByb2Nlc3NvcnMgd2hlbiBkb2N1bWVudCBwYXJ0aXRpb25pbmcKLQkgKiBhbG9uZSBjb3VsZG4ndCBkZXRlcm1pbmUgZGVmaW5pdGl2ZWx5IHdoYXQgY29udGVudCBhc3Npc3Qgc2hvdWxkIHNob3cKLQkgKiB1cCBhdCB0aGF0IHBhcnRpY3VsYXIgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZUZW1wbGF0ZUNvbnRleHRzLmNsZWFyKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGpzcFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBlbWJlZGRlZFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0KLQkJLy8gY2hlY2sgdGhlIGFjdHVhbCBwYXJ0aXRpb24gdHlwZQotCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9IGdldFBhcnRpdGlvblR5cGUoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCi0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gQU5PVEhFUiBXT1JLQVJPVU5EIFVOVElMIFBBUlRJVElPTklORyBUQUtFUyBDQVJFIE9GIFRISVMKLQkJLy8gY2hlY2sgZm9yIHhtbC1qc3AgdGFncy4uLgotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFICYmIGZuICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcG9zc2libGVYTUxKU1AgPSAoKGZuLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSAmJiBmbi5nZXRQcmV2aW91cygpICE9IG51bGwpID8gZm4uZ2V0UHJldmlvdXMoKSA6IGZuOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBwb3NzaWJsZVhNTEpTUC5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJLy8gY2hlY2sgYm91bmRzIGNhc2VzCi0JCQkJSVRleHRSZWdpb24geG1sT3Blbk9yQ2xvc2UgPSByZWdpb25zLmdldCgwKTsKLQkJCQlpZiAoeG1sT3Blbk9yQ2xvc2UuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIGRvY3VtZW50UG9zaXRpb24gPT0gcG9zc2libGVYTUxKU1AuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkvLyBkbyByZWd1bGFyIGpzcCBjb250ZW50IGFzc2lzdAotCQkJCX0KLQkJCQllbHNlIGlmICh4bWxPcGVuT3JDbG9zZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOICYmIGRvY3VtZW50UG9zaXRpb24gPiBwb3NzaWJsZVhNTEpTUC5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCS8vIGRvIHJlZ3VsYXIganNwIGNvbnRlbnQgYXNzaXN0Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBwb3NzaWJsZSB4bWwtanNwCi0JCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJCQkJU3RyaW5nIG5hbWUgPSBwb3NzaWJsZVhNTEpTUC5nZXRUZXh0KG5hbWVSZWdpb24pOwotCQkJCQlpZiAobmFtZS5lcXVhbHMoImpzcDpzY3JpcHRsZXQiKSB8fCBuYW1lLmVxdWFscygianNwOmV4cHJlc3Npb24iKSB8fCBuYW1lLmVxdWFscygianNwOmRlY2xhcmF0aW9uIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCQkvLyAqKiBUSElTIElTIEEgVEVNUCBGSVggVU5USUwgUEFSVElUSU9OSU5HIFRBS0VTIENBUkUgT0YgVEhJUy4uLgotCQkvLyBjaGVjayBmb3IgWE1MLUpTUCBpbiBhIDxzY3JpcHQ+IHJlZ2lvbgotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJLy8gZm4gc2hvdWxkIGJlIGJsb2NrIHRleHQKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGVjb2RlZFNEUmVnaW9uID0gZGVjb2RlU2NyaXB0QmxvY2soZm4uZ2V0RnVsbFRleHQoKSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRlY29kZWQgPiAiICsKLQkJCS8vIGJsb2NrT2ZUZXh0LnN1YnN0cmluZyhkZWNvZGVkU0RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwKLQkJCS8vIGRlY29kZWRTRFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSkpOwotCQkJaWYgKGRlY29kZWRTRFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZHIgPSBkZWNvZGVkU0RSZWdpb247Ci0JCQkJd2hpbGUgKHNkciAhPSBudWxsKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2RyICIgKyBzZHIuZ2V0VHlwZSgpKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZHIgPiAiICsKLQkJCQkJLy8gYmxvY2tPZlRleHQuc3Vic3RyaW5nKHNkci5nZXRTdGFydE9mZnNldCgpLAotCQkJCQkvLyBzZHIuZ2V0RW5kT2Zmc2V0KCkpKTsKLQkJCQkJaWYgKHNkci5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpIHsKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBkb2N1bWVudFBvc2l0aW9uIDw9IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCQlyZXR1cm4gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChzZHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBkb2N1bWVudFBvc2l0aW9uIDwgZm4uZ2V0U3RhcnRPZmZzZXQoKSArIHNkci5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJCXJldHVybiBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0RW5kT2Zmc2V0KCkgJiYgc2RyLmdldE5leHQoKSAhPSBudWxsICYmIHNkci5nZXROZXh0KCkuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQkJCQkJLy8gdGhlIGVuZCBvZiBhbiBvcGVuIHRhZyA8c2NyaXB0PgotCQkJCQkJCS8vIDxqc3A6c2NyaXB0bGV0PnwgYmxhaCA8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuLmdldFN0YXJ0T2Zmc2V0KCkgKyBzZHIuZ2V0U3RhcnRPZmZzZXQoKSAmJiBzZHIuZ2V0UHJldmlvdXMoKSAhPSBudWxsICYmIHNkci5nZXRQcmV2aW91cygpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNkciA9IHNkci5nZXROZXh0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gY2hlY2sgc3BlY2lhbCBKU1AgZGVsaW1pdGVyIGNhc2VzCi0JCWlmIChmbiAhPSBudWxsICYmIHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfREVMSU1JVEVSKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuRGVsaW0gPSBmbjsKLQotCQkJLy8gaWYgaXQncyBhIG5lc3RlZCBKU1AgcmVnaW9uLCBuZWVkIHRvIGdldCB0aGUgY29ycmVjdAotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBjaGVjayB3YXMgdGhlcmUuLi4KLQkJCS8vIGlmIChmbkRlbGltLmdldFR5cGUoKSA9PSBYTUxSZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCUl0ZXJhdG9yIGJsb2NrUmVnaW9ucyA9IGZuRGVsaW0uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQlJVGV4dFJlZ2lvbiB0ZW1wID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIHRyYzsKLQkJCXdoaWxlIChibG9ja1JlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgYmxvY2tSZWdpb25zLm5leHQoKTsKLQkJCQkvLyB3ZSBoaXQgYSBuZXN0ZWQKLQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCXRyYyA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgdGVtcDsKLQkJCQkJLy8gaXQncyBpbiB0aGlzIHJlZ2lvbgotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSB0cmMuZ2V0U3RhcnRPZmZzZXQoKSAmJiBkb2N1bWVudFBvc2l0aW9uIDwgdHJjLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQlJdGVyYXRvciBuZXN0ZWRKU1BSZWdpb25zID0gdHJjLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCQkJd2hpbGUgKG5lc3RlZEpTUFJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgbmVzdGVkSlNQUmVnaW9ucy5uZXh0KCk7Ci0JCQkJCQkJaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BPcGVuRGVsaW1pdGVyKHRlbXAuZ2V0VHlwZSgpKSAmJiBkb2N1bWVudFBvc2l0aW9uID09IHRyYy5nZXRTdGFydE9mZnNldCh0ZW1wKSkgewotCQkJCQkJCQkvLyBIVE1MIGNvbnRlbnQgYXNzaXN0Ci0JCQkJCQkJCS8vIHdlIGFjdHVhbGx5IHdhbnQgY29udGVudCBhc3Npc3QgZm9yIHRoZQotCQkJCQkJCQkvLyBwcmV2aW91cyB0eXBlIG9mIHJlZ2lvbiwKLQkJCQkJCQkJLy8gd2VsbCBnZXQgdGhvc2UgcHJvcG9zYWxzIGZyb20gdGhlIGVtYmVkZGVkCi0JCQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSB7Ci0JCQkJCQkJCQlwYXJ0aXRpb25UeXBlID0gZ2V0UGFydGl0aW9uVHlwZSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiAtIDEpOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUENsb3NlRGVsaW1pdGVyKHRlbXAuZ2V0VHlwZSgpKSAmJiBkb2N1bWVudFBvc2l0aW9uID09IHRyYy5nZXRTdGFydE9mZnNldCh0ZW1wKSkgewotCQkJCQkJCQkvLyBKU1AgY29udGVudCBhc3Npc3QKLQkJCQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIH0KLQkJCX0KLQotCQkJLy8gdGFrZSBjYXJlIG9mIFhNTC1KU1AgZGVsaW10ZXIgY2FzZXMKLQkJCWlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzWE1MSlNQRGVsaW1pdGVyKGZuRGVsaW0pKSB7Ci0JCQkJLy8gc2luY2UgaXQncyBhIGRlbGltaXRlciwgd2Uga25vdyBpdCdzIGEgSVRleHRSZWdpb25Db250YWluZXIKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IGZuRGVsaW0uZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJCQlpZiAoZm5EZWxpbS5nZXRTdGFydE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24gJiYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikpIHsKLQkJCQkJLy8gfDxqc3A6c2NyaXB0bGV0PiA8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCS8vIChwYSkgY29tbWVudGVkIG91dCBzbyB0aGF0IHdlIGdldCByZWd1bGFyIGJlaGF2aW9yIEpTUAotCQkJCQkvLyBtYWNyb3MgZXRjLi4uCi0JCQkJCS8vIHJldHVybiBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsCi0JCQkJCS8vIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCQllbHNlIGlmIChmbkRlbGltLmdldFN0YXJ0T2Zmc2V0KCkgPT0gZG9jdW1lbnRQb3NpdGlvbiAmJiAoZmlyc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikpIHsKLQkJCQkJLy8gPGpzcDpzY3JpcHRsZXQ+IHw8L2pzcDpzY3JpcHRsZXQ+Ci0JCQkJCS8vIGNoZWNrIHByZXZpb3VzIHBhcnRpdGlvbiB0eXBlIHRvIHNlZSBpZiBpdCdzIEpBVkFTQ1JJUFQKLQkJCQkJLy8gaWYgaXQgaXMsIHdlJ3JlIGp1c3QgZ29ubmEgbGV0IHRoZSBlbWJlZGRlZCBKQVZBU0NSSVBUCi0JCQkJCS8vIGFkYXB0ZXIgZ2V0IHRoZSBwcm9wb3NhbHMKLQkJCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiAwKSB7Ci0JCQkJCQlTdHJpbmcgY2hlY2tUeXBlID0gZ2V0UGFydGl0aW9uVHlwZSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiAtIDEpOwotCQkJCQkJaWYgKGNoZWNrVHlwZSAhPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUKSB7IC8vIHRoaXMKLQkJCQkJCQkvLyBjaGVjawotCQkJCQkJCS8vIGlzCi0JCQkJCQkJLy8gZmFpbGluZwotCQkJCQkJCS8vIGZvcgotCQkJCQkJCS8vIFhNTC1KU1AKLQkJCQkJCQkvLyAocmVnaW9uCi0JCQkJCQkJLy8gaXMKLQkJCQkJCQkvLyBub3QKLQkJCQkJCQkvLyBqYXZhc2NyaXB0Li4uKQotCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJfQotCQkJCQkJcGFydGl0aW9uVHlwZSA9IElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkFTQ1JJUFQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgJiYgZG9jdW1lbnRQb3NpdGlvbiA+PSBmbkRlbGltLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCS8vIGFueXRoaW5nIGVsc2UgaW5iZXR3ZWVuCi0JCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BEZWxpbWl0ZXIoZm5EZWxpbSkpIHsKLQkJCQkvLyB0aGUgZGVsaW1pdGVyIDwlLCA8JT0sIDwlISwgLi4uCi0JCQkJaWYgKFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuaXNKU1BDbG9zZURlbGltaXRlcihmbkRlbGltKSkgewotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBmbkRlbGltLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJCS8vIGNoZWNrIHByZXZpb3VzIHBhcnRpdGlvbiB0eXBlIHRvIHNlZSBpZiBpdCdzCi0JCQkJCQkvLyBKQVZBU0NSSVBUCi0JCQkJCQkvLyBpZiBpdCBpcywgd2UncmUganVzdCBnb25uYSBsZXQgdGhlIGVtYmVkZGVkCi0JCQkJCQkvLyBKQVZBU0NSSVBUIGFkYXB0ZXIgZ2V0IHRoZSBwcm9wb3NhbHMKLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID4gMCkgewotCQkJCQkJCVN0cmluZyBjaGVja1R5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uIC0gMSk7Ci0JCQkJCQkJaWYgKGNoZWNrVHlwZSAhPSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBU0NSSVBUKSB7Ci0JCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCQlwYXJ0aXRpb25UeXBlID0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQT3BlbkRlbGltaXRlcihmbkRlbGltKSkgewotCQkJCQkvLyBpZiBpdCdzIHRoZSBmaXJzdCBwb3NpdGlvbiBvZiBvcGVuIGRlbGltaXRlcgotCQkJCQkvLyB1c2UgZW1iZWRkZWQgSFRNTCByZXN1bHRzCi0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuRGVsaW0uZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkJZW1iZWRkZWRSZXN1bHRzID0gZ2V0SFRNTENvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IGZuRGVsaW0uZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCS8vIGl0J3MgYXQgdGhlIEVPRiA8JXwKLQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gbmVlZCB0byBjaGVjayBpZiBpdCdzIEpTUCByZWdpb24gaW5zaWRlIG9mIENEQVRBIHcvIG5vIHJlZ2lvbgotCQkvLyA8IVtDREFUQVsgPCV8JT4gXV0+Ci0JCS8vIG9yIGEgY29tbWVudCByZWdpb24KLQkJLy8gPCEtLSA8JSB8JT4gLS0+Ci0JCWlmIChmbiAhPSBudWxsICYmIChmbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCBmbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSkgewotCQkJaWYgKGZuIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCQlPYmplY3RbXSBjZGF0YVJlZ2lvbnMgPSBmbi5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotCQkJCUlUZXh0UmVnaW9uIGpzcFJlZ2lvbiA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjZGF0YVJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJciA9IChJVGV4dFJlZ2lvbikgY2RhdGFSZWdpb25zW2ldOwotCQkJCQlpZiAociBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQkvLyBDREFUQSBlbWJlZGRlZCBjb250YWluZXIsIG9yIGNvbW1lbnQgY29udGFpbmVyCi0JCQkJCQlPYmplY3RbXSBqc3BSZWdpb25zID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcikuZ2V0UmVnaW9ucygpLnRvQXJyYXkoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwganNwUmVnaW9ucy5sZW5ndGg7IGorKykgewotCQkJCQkJCWpzcFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikganNwUmVnaW9uc1tqXTsKLQkJCQkJCQlpZiAoanNwUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ0xPU0UpIHsKLQkJCQkJCQkJaWYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGpzcFJlZ2lvbikgPT0gZG9jdW1lbnRQb3NpdGlvbikKLQkJCQkJCQkJCXJldHVybiBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgaXQncyBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUsIGlmIHNvLCBkb24ndCBhZGQgQ0RBVEEKLQkJLy8gcHJvcG9zYWwKLQkJSVRleHRSZWdpb24gYXR0ckNvbnRhaW5lciA9IChmbiAhPSBudWxsKSA/IGZuLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pIDogbnVsbDsKLQkJaWYgKGF0dHJDb250YWluZXIgIT0gbnVsbCAmJiBhdHRyQ29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCWlmIChhdHRyQ29udGFpbmVyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJLy8gdGVzdCBsb2NhdGlvbiBvZiB0aGUgY3Vyc29yCi0JCQkJLy8gcmV0dXJuIG51bGwgaWYgaXQncyBpbiB0aGUgbWlkZGxlIG9mIGFuIG9wZW4vY2xvc2UKLQkJCQkvLyBkZWxpbWV0ZXIKLQkJCQlJdGVyYXRvciBhdHRyUmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGF0dHJDb250YWluZXIpLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHRlc3RSZWdpb24gPSBudWxsOwotCQkJCXdoaWxlIChhdHRyUmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJdGVzdFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgYXR0clJlZ2lvbnMubmV4dCgpOwotCQkJCQkvLyBuZWVkIHRvIGNoZWNrIGZvciBvdGhlciB2YWxpZCBhdHRyaWJ1dGUgcmVnaW9ucwotCQkJCQlpZiAoWE1MQ29udGVudEFzc2lzdFV0aWxpdGllcy5pc0pTUE9wZW5EZWxpbWl0ZXIodGVzdFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQlpZiAoISgoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBhdHRyQ29udGFpbmVyKS5nZXRFbmRPZmZzZXQodGVzdFJlZ2lvbikgPD0gZG9jdW1lbnRQb3NpdGlvbikpCi0JCQkJCQkJcmV0dXJuIEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmlzSlNQQ2xvc2VEZWxpbWl0ZXIodGVzdFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCQlpZiAoISgoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBhdHRyQ29udGFpbmVyKS5nZXRTdGFydE9mZnNldCh0ZXN0UmVnaW9uKSA+PSBkb2N1bWVudFBvc2l0aW9uKSkKLQkJCQkJCQlyZXR1cm4gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIFRPRE86IGhhbmRsZSBub24tSmF2YSBjb2RlIHN1Y2ggYXMgbmVzdGVkIHRhZ3MKLQkJCQlpZiAodGVzdFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSkKLQkJCQkJcmV0dXJuIGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJcmV0dXJuIEVNUFRZX1BST1BPU0FMX1NFVDsKLQkJCX0KLQkJfQotCi0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5nZXQocGFydGl0aW9uVHlwZSk7Ci0JCWlmIChwICE9IG51bGwpIHsKLQkJCWVtYmVkZGVkUmVzdWx0cyA9IHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCS8vIGdldCBiZWFuIG1ldGhvZHMsIG9iamVjdHMsIGFuZCBjb25zdGFudHMgaWYgdGhlcmUgYXJlIGFueS4uLgotCQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCB8fCBwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5TQ1JJUFQpIHsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYmVhblJlc3VsdHMgPSBnZXRKU1BKYXZhQmVhblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCWlmIChiZWFuUmVzdWx0cyAhPSBudWxsICYmIGJlYW5SZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGFkZGVkID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbYmVhblJlc3VsdHMubGVuZ3RoICsgZW1iZWRkZWRSZXN1bHRzLmxlbmd0aF07Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoYmVhblJlc3VsdHMsIDAsIGFkZGVkLCAwLCBiZWFuUmVzdWx0cy5sZW5ndGgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGVtYmVkZGVkUmVzdWx0cywgMCwgYWRkZWQsIGJlYW5SZXN1bHRzLmxlbmd0aCwgZW1iZWRkZWRSZXN1bHRzLmxlbmd0aCk7Ci0JCQkJCWVtYmVkZGVkUmVzdWx0cyA9IGFkZGVkOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBwYXJ0aXRpb24gdHlwZSBpcyBwcm9iYWJseSBub3QgbWFwcGVkCi0JCX0KLQotCQkvLyBmaXggZm9yOgotCQkvLyBIVE1MIGNvbnRlbnQgYXNzaXN0IGdpdmUgSlNQIHRhZ3MgaW4gYmV0d2VlbiBlbXB0eSBzY3JpcHQgdGFncwotCQlpZiAoIShwIGluc3RhbmNlb2YgSmF2YVNjcmlwdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgfHwgcCBpbnN0YW5jZW9mIENTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5jbGVhcigpOwotCQkJanNwUmVzdWx0cyA9IHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCX0KLQkJaWYgKHVzZUVtYmVkZGVkUmVzdWx0cykgewotCQkJaWYgKGVtYmVkZGVkUmVzdWx0cyAhPSBudWxsICYmIGVtYmVkZGVkUmVzdWx0cy5sZW5ndGggPiAwKSB7Ci0JCQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW1iZWRkZWRSZXN1bHRzLmxlbmd0aDsgaSsrKQotCQkJCQlyZXN1bHRzLmFkZChlbWJlZGRlZFJlc3VsdHNbaV0pOwotCQkJCWlmIChqc3BSZXN1bHRzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqc3BSZXN1bHRzLmxlbmd0aDsgaSsrKQotCQkJCQkJcmVzdWx0cy5hZGQoanNwUmVzdWx0c1tpXSk7Ci0JCQkJfQotCQkJCWpzcFJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLnNpemUoKV07Ci0JCQkJQ29sbGVjdGlvbnMuc29ydChyZXN1bHRzLCBuZXcgUHJvcG9zYWxDb21wYXJhdG9yKCkpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0cy5zaXplKCk7IGkrKykKLQkJCQkJanNwUmVzdWx0c1tpXSA9IChJQ29tcGxldGlvblByb3Bvc2FsKSByZXN1bHRzLmdldChpKTsKLQotCQkJfQotCQl9Ci0JCWlmIChqc3BSZXN1bHRzID09IG51bGwpCi0JCQlqc3BSZXN1bHRzID0gRU1QVFlfUFJPUE9TQUxfU0VUOwotCQlzZXRFcnJvck1lc3NhZ2UoanNwUmVzdWx0cy5sZW5ndGggPT0gMCA/IFVOS05PV05fQ09OVEVYVCA6IG51bGwpOwotCi0JCS8vIGZpeCBmb3I6Ci0JCS8vIGNoZWNrIGZvciB8PCUtLSAtLSU+IGZpcnN0IHBvc2l0aW9uIG9mIGpzcCBjb21tZW50Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9DT01NRU5UKSB7Ci0JCQlpZiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGh0bWxSZXN1bHRzID0gZ2V0SFRNTENvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlqc3BSZXN1bHRzID0gbWVyZ2UoanNwUmVzdWx0cywgaHRtbFJlc3VsdHMpOwotCQkJfQotCQl9Ci0KLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2NjU2Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IElKU1BQYXJ0aXRpb25zLkpTUF9ESVJFQ1RJVkUpIHsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBpbXBvcnRQcm9wb3NhbHMgPSBnZXRJbXBvcnRQcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWlmIChpbXBvcnRQcm9wb3NhbHMubGVuZ3RoID4gMCkKLQkJCQlqc3BSZXN1bHRzID0gbWVyZ2UoanNwUmVzdWx0cywgaW1wb3J0UHJvcG9zYWxzKTsKLQkJfQotCQlyZXR1cm4ganNwUmVzdWx0czsKLQl9Ci0KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRJbXBvcnRQcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlMaXN0IGltcG9ydFByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldEpTUEphdmFDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocHJvcG9zYWxzW2ldIGluc3RhbmNlb2YgSlNQQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0KLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsIGltcG9ydFByb3Bvc2FsID0gYWRqdXN0SW1wb3J0UHJvcG9zYWwoKEpTUENvbXBsZXRpb25Qcm9wb3NhbCkgcHJvcG9zYWxzW2ldKTsKLQkJCQlpbXBvcnRQcm9wb3NhbHMuYWRkKGltcG9ydFByb3Bvc2FsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgaW1wb3J0UHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbaW1wb3J0UHJvcG9zYWxzLnNpemUoKV0pOwotCX0KLQotCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsIGFkanVzdEltcG9ydFByb3Bvc2FsKEpTUENvbXBsZXRpb25Qcm9wb3NhbCBpbXBvcnRQcm9wb3NhbCkgewotCi0JCS8vIGp1c3QgbmVlZCB0byByZW1vdmUgdGhlICI7IgotCQkvLyBhbmQgYWRqdXN0IG9mZnNldHMgZm9yIHRoZSBjaGFuZ2UKLQkJU3RyaW5nIG5ld1JlcGxhY2UgPSBpbXBvcnRQcm9wb3NhbC5nZXRSZXBsYWNlbWVudFN0cmluZygpLnJlcGxhY2VBbGwoIjsiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbXBvcnRQcm9wb3NhbC5zZXRSZXBsYWNlbWVudFN0cmluZyhuZXdSZXBsYWNlKTsKLQotCQlTdHJpbmcgbmV3RGlzcGxheSA9IGltcG9ydFByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKS5yZXBsYWNlQWxsKCI7IiwgIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW1wb3J0UHJvcG9zYWwuc2V0RGlzcGxheVN0cmluZyhuZXdEaXNwbGF5KTsKLQotCQlpbnQgbmV3UmVwbGFjZW1lbnRMZW5ndGggPSBpbXBvcnRQcm9wb3NhbC5nZXRSZXBsYWNlbWVudExlbmd0aCgpIC0gMTsKLQkJaW1wb3J0UHJvcG9zYWwuc2V0UmVwbGFjZW1lbnRMZW5ndGgobmV3UmVwbGFjZW1lbnRMZW5ndGgpOwotCi0JCWludCBuZXdDdXJzb3JQb3NpdGlvbiA9IGltcG9ydFByb3Bvc2FsLmdldEN1cnNvclBvc2l0aW9uKCkgLSAxOwotCQlpbXBvcnRQcm9wb3NhbC5zZXRDdXJzb3JQb3NpdGlvbihuZXdDdXJzb3JQb3NpdGlvbik7Ci0KLQkJcmV0dXJuIGltcG9ydFByb3Bvc2FsOwotCX0KLQotCS8qKgotCSAqIEFkZHMgMiBhcnJheXMgb2YgSUNvbXBsZXRpb25Qcm9wb3NhbHMgYW5kIHNvcnRzIHRoZW0gd2l0aCBhCi0JICogUHJvcG9zYWxDb21wYXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBqc3BSZXN1bHRzCi0JICogQHBhcmFtIGh0bWxSZXN1bHRzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG1lcmdlKElDb21wbGV0aW9uUHJvcG9zYWxbXSBqc3BSZXN1bHRzLCBJQ29tcGxldGlvblByb3Bvc2FsW10gaHRtbFJlc3VsdHMpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGpzcHMgPSBBcnJheXMuYXNMaXN0KGpzcFJlc3VsdHMpOwotCQlMaXN0IGh0bWxzID0gQXJyYXlzLmFzTGlzdChodG1sUmVzdWx0cyk7Ci0KLQkJcmVzdWx0cy5hZGRBbGwoanNwcyk7Ci0JCXJlc3VsdHMuYWRkQWxsKGh0bWxzKTsKLQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIG5ldyBQcm9wb3NhbENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSByZXN1bHRzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIEpTUEphdmEgUHJvcG9zYWxzIHRoYXQgYXJlIHJlbGV2YW50IHRvIGFueSBqYXZhCi0JICogYmVhbnMgdGhhdCBpbiBzY29wZSBhdCB0aGUgZG9jdW1lbnRQb3NpdGlvbgotCSAqIAotCSAqIFRPRE8gKHBhKSBhcmUgdGFnbGliIHZhcnMgZ2V0dGluZyBmaWx0ZXJlZD8KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uIEByZXR1cm4gSUNvbXBsZXRpb25Qcm9wb3NhbFtdCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQSmF2YUJlYW5Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVndWxhckpTUFJlc3VsdHMgPSBnZXRKU1BKYXZhQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQlWZWN0b3IgZmlsdGVyZWRQcm9wb3NhbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBmaW5hbFJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVndWxhckpTUFJlc3VsdHMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgdGVzdCA9IHJlZ3VsYXJKU1BSZXN1bHRzW2ldOwotCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInByb3Bvc2FsID4gIiArIHRlc3QuZ2V0RGlzcGxheVN0cmluZygpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWxldmFuY2UgPiAiICsgKChDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHRlc3QpLmdldFJlbGV2YW5jZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlpZiAoaXNSZWxldmFuY2VBbGxvd2VkKCgoQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKSB0ZXN0KS5nZXRSZWxldmFuY2UoKSkpIHsKLQkJCQlmaWx0ZXJlZFByb3Bvc2Fscy5hZGQodGVzdCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpbHRlcmVkUHJvcG9zYWxzLnNpemUoKSA+IDApIHsKLQkJCWZpbmFsUmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2ZpbHRlcmVkUHJvcG9zYWxzLnNpemUoKV07Ci0JCQlJdGVyYXRvciBpdCA9IGZpbHRlcmVkUHJvcG9zYWxzLml0ZXJhdG9yKCk7Ci0JCQlpbnQgaiA9IDA7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZmluYWxSZXN1bHRzW2orK10gPSAoSUNvbXBsZXRpb25Qcm9wb3NhbCkgaXQubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaW5hbFJlc3VsdHM7Ci0JfQotCi0JLy8gVGhlc2UgYXJlIHRoZSBvbmx5IHRoaW5ncyBJJ20gYWxsb3dpbmcgZm9yIHVzZSBiZWFuIGlmIHRoZSBsYW5ndWFnZSBpcwotCS8vIEpBVkFTQ1JJUFQKLQkvLyBJJ20gZmlsdGVyaW5nIGJhc2VkIG9uIEphdmFDb250ZW50QXNzaXN0UHJvcG9zYWwgcmVsZXZhbmNlCi0JLy8KLQkvLyA0ODUgPiBtZXRob2QgdGhhdCBiZWxvbmdzIHRvIHRoZSBiZWFuCi0JLy8gNDg2ID4gYmVhbiBvYmplY3QKLQkvLyAzODYgPiBiZWFuIENPTlNUQU5UCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZhbmNlQWxsb3dlZChpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiAocmVsZXZhbmNlID09IDQ4NSB8fCByZWxldmFuY2UgPT0gNDg2IHx8IHJlbGV2YW5jZSA9PSAzMjYpOwotCX0KLQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsW10KLQkgKi8KLQlwcml2YXRlIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRIVE1MQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKTsKLQkJcmV0dXJuIHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIElDb21wbGV0aW9uUHJvcG9zYWxbXQotCSAqLwotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQSmF2YUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKEpTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAuZ2V0KElKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUKTsKLQkJcmV0dXJuIHAuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXBhcnRpdGlvblR5cGUgPSBUZXh0VXRpbGl0aWVzLmdldENvbnRlbnRUeXBlKHZpZXdlci5nZXREb2N1bWVudCgpLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCB2aWV3ZXIubW9kZWxPZmZzZXQyV2lkZ2V0T2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXBhcnRpdGlvblR5cGUgPSBJRG9jdW1lbnQuREVGQVVMVF9DT05URU5UX1RZUEU7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvblR5cGU7Ci0JfQotCi0JLyoKLQkgKiAqKiBURU1QIFdPUktBUk9VTkQgRk9SIENNVkMgMjQxODgyIFRha2VzIGEgU3RyaW5nIGFuZCBibG9ja3Mgb3V0Ci0JICoganNwOnNjcmlwdGxldCwganNwOmV4cHJlc3Npb24sIGFuZCBqc3A6ZGVjbGFyYXRpb24gQHBhcmFtIGJsb2NrVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGVjb2RlU2NyaXB0QmxvY2soU3RyaW5nIGJsb2NrVGV4dCkgewotCQlYTUxTb3VyY2VQYXJzZXIgcGFyc2VyID0gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCQkvLyB1c2UgSlNQX0NPTlRFTlQgZm9yIHJlZ2lvbiB0eXBlCi0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihuZXcgQmxvY2tNYXJrZXIoImpzcDpzY3JpcHRsZXQiLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmV4cHJlc3Npb24iLCBudWxsLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgZmFsc2UsIGZhbHNlKSk7IC8vJE5PTi1OTFMtMSQKLQkJcGFyc2VyLmFkZEJsb2NrTWFya2VyKG5ldyBCbG9ja01hcmtlcigianNwOmRlY2xhcmF0aW9uIiwgbnVsbCwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIGZhbHNlLCBmYWxzZSkpOyAvLyROT04tTkxTLTEkCi0JCXBhcnNlci5yZXNldChibG9ja1RleHQpOwotCQlyZXR1cm4gcGFyc2VyLmdldERvY3VtZW50UmVnaW9ucygpOwotCX0KLQotCS8qCi0JICogQHNlZSBDb250ZW50QXNzaXN0QWRhcHRlciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyLCBpbnQsCi0JICogICAgICBJbmRleGVkUmVnaW9uKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCwgSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpOwotCX0KLQotCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCVN0cmluZyBrZXkgPSBKU1BVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERTsKLQotCQlTdHJpbmcgY2hhcnMgPSBzdG9yZS5nZXRTdHJpbmcoa2V5KTsKLQkJcmV0dXJuIChjaGFycyAhPSBudWxsKSA/IGNoYXJzLnRvQ2hhckFycmF5KCkgOiBuZXcgY2hhclswXTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hNTEZvcm1hdChEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50IGRvY0VsZW1lbnQgPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0JCXJldHVybiBkb2NFbGVtZW50ICE9IG51bGwgJiYgKChkb2NFbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKCJqc3A6cm9vdCIpKSB8fCAoKCgoSURPTU5vZGUpIGRvY0VsZW1lbnQpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCAmJiAoKElET01Ob2RlKSBkb2NFbGVtZW50KS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIENvbnRlbnRBc3Npc3RBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJLy8gcmVsZWFzZSAqQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgaW4gbWFwcwotCQkvLyBDTVZDIDI1NDAyMwotCQlyZWxlYXNlUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKTsKLQkJcmVsZWFzZU5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpIHsKLQkJcmVsZWFzZU1hcChmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VOYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCXJlbGVhc2VNYXAoZk5hbWVUb1Byb2Nlc3Nvck1hcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU1hcChIYXNoTWFwIG1hcCkgewotCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCWlmICghbWFwLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIGl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQkJT2JqZWN0IGtleSA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlrZXkgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChtYXAuZ2V0KGtleSkgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkgewotCQkJCQkJKChJUmVsZWFzYWJsZSkgbWFwLmdldChrZXkpKS5yZWxlYXNlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQltYXAuY2xlYXIoKTsKLQkJCW1hcCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQsCi0JICogICAgICBTdHJpbmcsIElUZXh0UmVnaW9uLCBJRE9NTm9kZSwgSURPTU5vZGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlLCBJRE9NTm9kZSB4bWxub2RlKSB7Ci0KLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgcmVxdWVzdCA9IHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZUZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlpZiAoeG1sbm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAoeG1sbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCQlkb2MgPSAoRG9jdW1lbnQpIHhtbG5vZGU7Ci0JCQllbHNlCi0JCQkJZG9jID0geG1sbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCX0KLQkJU3RyaW5nW10gZGlyZWN0aXZlTmFtZXMgPSB7InBhZ2UiLCAiaW5jbHVkZSIsICJ0YWdsaWIifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJLy8gc3VnZ2VzdCBKU1AgRXhwcmVzc2lvbiBpbnNpZGUgb2YgWE1MIGNvbW1lbnRzCi0JCWlmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQgJiYgIWlzWE1MRm9ybWF0KGRvYykpIHsKLQkJCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQkJcmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIjwlPSAgJT4iLCBkb2N1bWVudFBvc2l0aW9uLCAwLCA0LCBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgImpzcDpleHByZXNzaW9uIiwgbnVsbCwgIiZsdDslPSAlJmd0OyIsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0pTUCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJLy8gaGFuZGxlIHByb3Bvc2FscyBpbiBhbmQgYXJvdW5kIEpTUF9ESVJFQ1RJVkVfT1BFTiBhbmQKLQkJLy8gSlNQX0RJUkVDVElWRV9OQU1FCi0JCWVsc2UgaWYgKChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4gJiYgZG9jdW1lbnRQb3NpdGlvbiA+PSBzZFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSB8fCAoY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FICYmIGRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkpIHsKLQkJCWlmIChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX09QRU4pIHsKLQkJCQlpZiAocmVxdWVzdCA9PSBudWxsKQotCQkJCQlyZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoeG1sbm9kZSwgeG1sbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlJdGVyYXRvciByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQkJU3RyaW5nIG5hbWVTdHJpbmcgPSBudWxsOwotCQkJCWludCBiZWdpbiA9IHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCk7Ci0JCQkJaW50IGxlbmd0aCA9IHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJCQluYW1lU3RyaW5nID0gc2RSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJCQkJYmVnaW4gPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJbGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChuYW1lU3RyaW5nID09IG51bGwpCi0JCQkJCW5hbWVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGlyZWN0aXZlTmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGRpcmVjdGl2ZU5hbWVzW2ldLnN0YXJ0c1dpdGgobmFtZVN0cmluZykgfHwgZG9jdW1lbnRQb3NpdGlvbiA8PSBiZWdpbikKLQkJCQkJCXJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChkaXJlY3RpdmVOYW1lc1tpXSwgYmVnaW4sIGxlbmd0aCwgZGlyZWN0aXZlTmFtZXNbaV0ubGVuZ3RoKCksIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCBkaXJlY3RpdmVOYW1lc1tpXSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7IC8vIGJ5IGRlZmF1bHQsIEpTUF9ESVJFQ1RJVkVfTkFNRQotCQkJCWlmIChyZXF1ZXN0ID09IG51bGwpCi0JCQkJCXJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh4bWxub2RlLCB4bWxub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RpdmVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoZGlyZWN0aXZlTmFtZXNbaV0uc3RhcnRzV2l0aChtYXRjaFN0cmluZykpCi0JCQkJCQlyZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoZGlyZWN0aXZlTmFtZXNbaV0sIHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgZGlyZWN0aXZlTmFtZXNbaV0ubGVuZ3RoKCksIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCBkaXJlY3RpdmVOYW1lc1tpXSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX05BTUUgJiYgZG9jdW1lbnRQb3NpdGlvbiA+IHNkUmVnaW9uLmdldFRleHRFbmRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHx8IChjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRElSRUNUSVZFX0NMT1NFICYmIGRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpKSB7Ci0JCQlpZiAocmVxdWVzdCA9PSBudWxsKQotCQkJCXJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQlzdXBlci5hZGRUYWdDbG9zZVByb3Bvc2FscyhyZXF1ZXN0KTsKLQkJCS8vIENNVkMgMjc0MDMzLCB0aGlzIGlzIGJlaW5nIGFkZGVkIGZvciBhbGwgPGpzcDoqIHRhZ3MKLQkJCS8vIGluIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpCi0JCQkvLyBzdXBlci5hZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKHJlcXVlc3QpOwotCQl9Ci0JCS8vIG5vIG5hbWU/OiA8JUAgJT4KLQkJZWxzZSBpZiAoY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSAmJiBkb2N1bWVudFBvc2l0aW9uIDw9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSB7Ci0JCQlpZiAocmVxdWVzdCAhPSBudWxsKQotCQkJCXJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQlJdGVyYXRvciByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCQlTdHJpbmcgbmFtZVN0cmluZyA9IG51bGw7Ci0JCQl3aGlsZSAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCQluYW1lU3RyaW5nID0gc2RSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobmFtZVN0cmluZyA9PSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJlY3RpdmVOYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCQlyZXF1ZXN0LmFkZFByb3Bvc2FsKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoZGlyZWN0aXZlTmFtZXNbaV0sIHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIHJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgZGlyZWN0aXZlTmFtZXNbaV0ubGVuZ3RoKCksIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCBkaXJlY3RpdmVOYW1lc1tpXSwgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfSlNQKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYnVnMTE1OTI3IHVzZSBvcmlnaW5hbCBkb2N1bWVudCBwb3NpdGlvbiBmb3IgYWxsL2FueSByZWdpb24gdGVtcGxhdGVzCi0JCWFkZFRlbXBsYXRlcyhyZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLkFMTCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCXByaXZhdGUgSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZUZW1wbGF0ZVByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVQcm9jZXNzb3IgPSBuZXcgSlNQVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY29udGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCX0KLQkKLQkvKioKLQkgKiBBZGRzIHRlbXBsYXRlcyB0byB0aGUgbGlzdCBvZiBwcm9wb3NhbHMKLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudEFzc2lzdFJlcXVlc3QKLQkgKiBAcGFyYW0gY29udGV4dAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRUZW1wbGF0ZXMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnRPZmZzZXQpIHsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gaWYgYWxyZWFkeSBhZGRpbmcgdGVtcGxhdGUgcHJvcG9zYWxzIGZvciBhIGNlcnRhaW4gY29udGV4dCB0eXBlLCBkbwotCQkvLyBub3QgYWRkIGFnYWluCi0JCWlmICghZlRlbXBsYXRlQ29udGV4dHMuY29udGFpbnMoY29udGV4dCkpIHsKLQkJCWZUZW1wbGF0ZUNvbnRleHRzLmFkZChjb250ZXh0KTsKLQkJCWJvb2xlYW4gdXNlUHJvcG9zYWxMaXN0ID0gIWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNob3VsZFNlcGFyYXRlKCk7Ci0KLQkJCWlmIChnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0Q29udGV4dFR5cGUoY29udGV4dCk7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGZUZXh0Vmlld2VyLCBzdGFydE9mZnNldCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJaWYgKHVzZVByb3Bvc2FsTGlzdCkKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZE1hY3JvKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEVudGl0eVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCS8vIGlnbm9yZQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLlRBRyk7Ci0KLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQkJaWYgKGlzSW50ZXJuYWxBZGFwdGVyKQotCQkJdXNlRW1iZWRkZWRSZXN1bHRzID0gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ZjJhYTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRHVtbXlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5BYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxDb250ZW50TW9kZWxHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSAibnVsbCIgdmVyc2lvbiBvZiBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29tbWVudFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZENvbW1lbnRQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KExpc3QgY29udGVudExpc3QsIENNQ29udGVudCBjb250ZW50KSB7Ci0JCXN1cGVyLmFkZENvbnRlbnQoY29udGVudExpc3QsIGNvbnRlbnQpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRG9jVHlwZVByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZERvY1R5cGVQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCXN1cGVyLmFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnTmFtZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRFbmRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ1Byb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW50aXR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgdHJlZU5vZGUpIHsKLQkJc3VwZXIuYWRkRW50aXR5UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBkb2N1bWVudFBvc2l0aW9uLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoVmVjdG9yIHByb3Bvc2FscywgUHJvcGVydGllcyBtYXAsIFN0cmluZyBrZXksIGludCBub2RlT2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbikgewotCQlzdXBlci5hZGRFbnRpdHlQcm9wb3NhbHMocHJvcG9zYWxzLCBtYXAsIGtleSwgbm9kZU9mZnNldCwgcGFyZW50LCBjb21wbGV0aW9uUmVnaW9uKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBDREFUQVByb3Bvc2FsKFN0cmluZyBub2RlTmFtZSwgQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkUENEQVRBUHJvcG9zYWwobm9kZU5hbWUsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJc3VwZXIuYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdDbG9zZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlzdXBlci5hZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCXN1cGVyLmFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgY2hpbGRQb3NpdGlvbik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlzdXBlci5hZGRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdHRyaWJ1dGVJbkxpc3QoSURPTU5vZGUgbm9kZSwgTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmF0dHJpYnV0ZUluTGlzdChub2RlLCBwYXJlbnQsIGNtbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBiZWdpbnNXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiBzdXBlci5iZWdpbnNXaXRoKGFTdHJpbmcsIHByZWZpeCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUF0dHJpYnV0ZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCBub2RlQXRPZmZzZXQsIG5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlLCBJRE9NTm9kZSB4bWxub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCX0KLQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUNvbnRlbnRQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29udGVudFByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24odmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVFbmRUYWdPcGVuUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZUVuZFRhZ09wZW5Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVxdWFsc1Byb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVFcXVhbHNQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVTdGFydERvY3VtZW50UHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuY29tcHV0ZVN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIG5vZGVBdE9mZnNldCwgbm9kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVUYWdDbG9zZVByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSBub2RlQXRPZmZzZXQsIElET01Ob2RlIG5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVUYWdDbG9zZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlVGFnTmFtZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlVGFnT3BlblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgbm9kZUF0T2Zmc2V0LCBub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEFkZGl0aW9uYWxJbmZvKENNTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBZGRpdGlvbmFsSW5mbyhwYXJlbnRPck93bmVyLCBjbW5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkcmVuQXRJbmRleChFbGVtZW50IHBhcmVudCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykgewotCQlyZXR1cm4gc3VwZXIuZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KHBhcmVudCwgaW5kZXgsIHZhbGlkaXR5Q2hlY2tpbmcpOwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbihEb2N1bWVudCBkb2N1bWVudCwgaW50IGNoaWxkSW5kZXgpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF2YWlsYWJsZVJvb3RDaGlsZHJlbihkb2N1bWVudCwgY2hpbGRJbmRleCk7Ci0JfQotCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24obm9kZSk7Ci0JfQotCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgb2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRDb21wbGV0aW9uUmVnaW9uKG9mZnNldCwgZmxhdE5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXRDb21wbGV0aW9uUmVnaW9uKGludCBkb2N1bWVudFBvc2l0aW9uLCBOb2RlIGRvbW5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldENvbXBsZXRpb25SZWdpb24oZG9jdW1lbnRQb3NpdGlvbiwgZG9tbm9kZSk7Ci0JfQotCi0JcHVibGljIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBnZXRDb250ZW50R2VuZXJhdG9yKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGVudEdlbmVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JfQotCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRFbGVtZW50UG9zaXRpb24oTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RWxlbWVudFBvc2l0aW9uKGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXRjaFN0cmluZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gYVJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0TWF0Y2hTdHJpbmcocGFyZW50LCBhUmVnaW9uLCBvZmZzZXQpOwotCX0KLQotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJcmV0dXJuIHN1cGVyLmdldE5hbWVSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhOb2RlIG5vZGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMobm9kZSwgYWQpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCXJldHVybiBzdXBlci5nZXRSZXF1aXJlZE5hbWUocGFyZW50T3JPd25lciwgY21ub2RlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlcXVpcmVkVGV4dChOb2RlIHBhcmVudE9yT3duZXIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJcmV0dXJuIHN1cGVyLmdldFJlcXVpcmVkVGV4dChwYXJlbnRPck93bmVyLCBhdHRyRGVjbCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZFRleHQoTm9kZSBwYXJlbnRPck93bmVyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UmVxdWlyZWRUZXh0KHBhcmVudE9yT3duZXIsIGVsZW1lbnREZWNsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRWYWxpZENoaWxkRWxlbWVudERlY2xhcmF0aW9ucyhFbGVtZW50IHBhcmVudCwgaW50IGNoaWxkUG9zaXRpb24sIGludCBraW5kT2ZBY3Rpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKHBhcmVudCwgY2hpbGRQb3NpdGlvbiwga2luZE9mQWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlzdXBlci5pbml0KCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDbG9zZVJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIHN1cGVyLmlzQ2xvc2VSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05hbWVSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBzdXBlci5pc05hbWVSZWdpb24ocmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN1cGVyLmlzUXVvdGUoc3RyaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydGllcyBtYXBUb1Byb3BlcnRpZXMoQ01OYW1lZE5vZGVNYXAgbWFwKSB7Ci0JCXJldHVybiBzdXBlci5tYXBUb1Byb3BlcnRpZXMobWFwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIGFwcGVuZCkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBhcHBlbmQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgcHJlcGVuZCwgU3RyaW5nIGFwcGVuZCkgewotCQlzdXBlci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlLCBwcmVwZW5kLCBhcHBlbmQpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHN0cmluZ3NFcXVhbChTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLQkJcmV0dXJuIHN1cGVyLnN0cmluZ3NFcXVhbChhLCBiKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BFTENvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWY0Yjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotCi1wdWJsaWMgY2xhc3MgSlNQRUxDb21wbGV0aW9uUHJvY2Vzc29yIGV4dGVuZHMgSlNQQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIEpTUFByb3Bvc2FsQ29sbGVjdG9yIGdldFByb3Bvc2FsQ29sbGVjdG9yKElDb21waWxhdGlvblVuaXQgY3UsIEpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uKSB7Ci0JCXJldHVybiBuZXcgSlNQRUxQcm9wb3NhbENvbGxlY3RvcihjdSwgdHJhbnNsYXRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNGI4MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5UYWdsaWJDb250cm9sbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRMRENNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudGxkLlRhZ2xpYlRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC50bGQucHJvdmlzaW9uYWwuVExERnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuQVNURXhwcmVzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5BU1RGdW5jdGlvbkludm9jYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuanNwZWwuU2ltcGxlQ2hhclN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5qc3BlbC5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIGNoYXIgZWxDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnNbXSA9IG5ldyBjaGFyW117Jy4nLCAnOid9OwotCi0JcHJvdGVjdGVkIEpTUENvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0SnNwQ29tcGxldGlvblByb2Nlc3NvcigpIHsKLQkJaWYgKGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gbmV3IEpTUEVMQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmSnNwQ29tcGxldGlvblByb2Nlc3NvcjsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQotCi0JCS8vIGdldCByZXN1bHRzIGZyb20gSlNQIGNvbXBsZXRpb24gcHJvY2Vzc29yCi0JCWZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gZ2V0SnNwQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzdWx0cyA9IGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWZFcnJvck1lc3NhZ2UgPSBmSnNwQ29tcGxldGlvblByb2Nlc3Nvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJaWYgKHJlc3VsdHMubGVuZ3RoID09IDAgJiYgKGZFcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBmRXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApKSB7Ci0JCQlmRXJyb3JNZXNzYWdlID0gVU5LTk9XTl9DT05URVhUOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0ID0gQ29udGVudEFzc2lzdFV0aWxzLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkKLQkJaWYgKGZsYXQgIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb24gY3Vyc29yUmVnaW9uID0gZmxhdC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWlmIChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFID09IGN1cnNvclJlZ2lvbi5nZXRUeXBlKCkpIHsKLQkJCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIGN1cnNvclJlZ2lvbjsKLQkJCQljdXJzb3JSZWdpb24gPSBjb250YWluZXIuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGN1cnNvclJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0VMX0NPTlRFTlQpIHsKLQkJCQkJU3RyaW5nIGVsVGV4dCA9IGNvbnRhaW5lci5nZXRUZXh0KGN1cnNvclJlZ2lvbikudHJpbSgpOwotCQkJCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KGRvY3VtZW50UG9zaXRpb24gLSBjb250YWluZXIuZ2V0U3RhcnRPZmZzZXQoY3Vyc29yUmVnaW9uKSAtIDEsIGVsVGV4dCk7Ci0JCQkJCWlmIChudWxsICE9IHByZWZpeCkgewotCQkJCQkJTGlzdCBwcm9wb3NhbHMgPSBnZXRGdW5jdGlvblByb3Bvc2FscyhwcmVmaXgsIChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQkJCXJlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXTsKLQkJCQkJCXByb3Bvc2Fscy50b0FycmF5KHJlc3VsdHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZpeChpbnQgcmVsYXRpdmVQb3NpdGlvbiwgU3RyaW5nIGVsVGV4dCkgewotCQlqYXZhLmlvLlN0cmluZ1JlYWRlciByZWFkZXIgPSBuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoZWxUZXh0KTsKLQkJSlNQRUxQYXJzZXJUb2tlbk1hbmFnZXIgc2Nhbm5lciA9IG5ldyBKU1BFTFBhcnNlclRva2VuTWFuYWdlcihuZXcgU2ltcGxlQ2hhclN0cmVhbShyZWFkZXIsIDEsIDEpKTsKLQkJVG9rZW4gY3VyVG9rZW4gPSBudWxsLCBsYXN0SWRlbnRpZmllciA9IG51bGw7Ci0JCXdoaWxlIChKU1BFTFBhcnNlckNvbnN0YW50cy5FT0YgIT0gKGN1clRva2VuID0gc2Nhbm5lci5nZXROZXh0VG9rZW4oKSkua2luZCkgewotCQkJaWYgKEpTUEVMUGFyc2VyQ29uc3RhbnRzLkNPTE9OID09IGN1clRva2VuLmtpbmQgJiYgY3VyVG9rZW4uZW5kQ29sdW1uID09IHJlbGF0aXZlUG9zaXRpb24gJiYgbnVsbCAhPSBsYXN0SWRlbnRpZmllcikgewotCQkJCXJldHVybiAobGFzdElkZW50aWZpZXIuaW1hZ2UpOwotCQkJfQotCi0JCQlpZiAoSlNQRUxQYXJzZXJDb25zdGFudHMuSURFTlRJRklFUiA9PSBjdXJUb2tlbi5raW5kKSB7Ci0JCQkJbGFzdElkZW50aWZpZXIgPSBjdXJUb2tlbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxhc3RJZGVudGlmaWVyID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQVNURnVuY3Rpb25JbnZvY2F0aW9uIGdldEludm9jYXRpb24oaW50IHJlbGF0aXZlUG9zaXRpb24sIFN0cmluZyBlbFRleHQpIHsKLQkJRmluZEZ1bmN0aW9uSW52b2NhdGlvblZpc2l0b3IgdmlzaXRvciA9IG5ldyBGaW5kRnVuY3Rpb25JbnZvY2F0aW9uVmlzaXRvcihyZWxhdGl2ZVBvc2l0aW9uKTsKLQkJSlNQRUxQYXJzZXIgcGFyc2VyID0gSlNQRUxQYXJzZXIuY3JlYXRlUGFyc2VyKGVsVGV4dCk7Ci0JCXRyeSB7Ci0JCQlBU1RFeHByZXNzaW9uIGV4cHJlc3Npb24gPSBwYXJzZXIuRXhwcmVzc2lvbigpOwotCQkJcmV0dXJuIChBU1RGdW5jdGlvbkludm9jYXRpb24pIGV4cHJlc3Npb24uamp0QWNjZXB0KHZpc2l0b3IsIG51bGwpOwotCQl9Ci0JCWNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7IC8qIHBhcnNlIGV4Y2VwdGlvbiA9IG5vIGNvbXBsZXRpb24gKi8KLQkJfQotCQlyZXR1cm4gKG51bGwpOwotCX0KLQotCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBlbENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRGdW5jdGlvblByb3Bvc2FscyhTdHJpbmcgcHJlZml4LCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJVExEQ01Eb2N1bWVudE1hbmFnZXIgZG9jTWdyID0gVGFnbGliQ29udHJvbGxlci5nZXRUTERDTURvY3VtZW50TWFuYWdlcih2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCUFycmF5TGlzdCBjb21wbGV0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGRvY01nciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSXRlcmF0b3IgdGFnbGlicyA9IGRvY01nci5nZXRDTURvY3VtZW50VHJhY2tlcnMob2Zmc2V0KS5pdGVyYXRvcigpOwotCQl3aGlsZSAodGFnbGlicy5oYXNOZXh0KCkpIHsKLQkJCVRhZ2xpYlRyYWNrZXIgdHJhY2tlciA9IChUYWdsaWJUcmFja2VyKSB0YWdsaWJzLm5leHQoKTsKLQkJCWlmICh0cmFja2VyLmdldFByZWZpeCgpLmVxdWFscyhwcmVmaXgpKSB7Ci0JCQkJQ01Eb2N1bWVudEltcGwgZG9jID0gKENNRG9jdW1lbnRJbXBsKSB0cmFja2VyLmdldERvY3VtZW50KCk7Ci0KLQkJCQlMaXN0IGZ1bmN0aW9ucyA9IGRvYy5nZXRGdW5jdGlvbnMoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZnVuY3Rpb25zLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJVExERnVuY3Rpb24gZnVuY3Rpb24gPSAoVExERnVuY3Rpb24pIGl0Lm5leHQoKTsKLQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChmdW5jdGlvbi5nZXROYW1lKCkgKyAiKCkiLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCW9mZnNldCwgMCwgZnVuY3Rpb24uZ2V0TmFtZSgpLmxlbmd0aCgpICsgMSwgbnVsbCwgZnVuY3Rpb24uZ2V0TmFtZSgpICsgIiAtICIgKyBmdW5jdGlvbi5nZXRTaWduYXR1cmUoKSwgbnVsbCwgbnVsbCwgMSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQljb21wbGV0aW9uTGlzdC5hZGQocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gY29tcGxldGlvbkxpc3Q7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxQcm9wb3NhbENvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQRUxQcm9wb3NhbENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWZlNWVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEVMUHJvcG9zYWxDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklDb21waWxhdGlvblVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLXB1YmxpYyBjbGFzcyBKU1BFTFByb3Bvc2FsQ29sbGVjdG9yIGV4dGVuZHMgSlNQUHJvcG9zYWxDb2xsZWN0b3IgewotCi0JcHVibGljIEpTUEVMUHJvcG9zYWxDb2xsZWN0b3IoSUNvbXBpbGF0aW9uVW5pdCBjdSwgSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24pIHsKLQkJc3VwZXIoY3UsIHRyYW5zbGF0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUphdmFDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlSmF2YUNvbXBsZXRpb25Qcm9wb3NhbChDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwpIHsKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQkJCi0JCWlmKG51bGwgPT0gcHJvcG9zYWwgfHwgbnVsbCA9PSBwcm9wb3NhbC5nZXROYW1lKCkpCi0JCQlyZXR1cm4obnVsbCk7Ci0JCQotCQlTdHJpbmcgcmF3TmFtZSA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0TmFtZSgpKTsKLQkJU3RyaW5nIGNvbXBsZXRpb24gPSBudWxsOwotCQkKLQkJaWYocHJvcG9zYWwuZ2V0S2luZCgpID09IENvbXBsZXRpb25Qcm9wb3NhbC5NRVRIT0RfUkVGICYmIHByb3Bvc2FsLmZpbmRQYXJhbWV0ZXJOYW1lcyhudWxsKS5sZW5ndGggPT0gMCkgewotCQkJaWYocmF3TmFtZS5sZW5ndGgoKSA+IDMgJiYgcmF3TmFtZS5zdGFydHNXaXRoKCJnZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29tcGxldGlvbiA9IHJhd05hbWUuc3Vic3RyaW5nKDMsNCkudG9Mb3dlckNhc2UoKSArIHJhd05hbWUuc3Vic3RyaW5nKDQsIHJhd05hbWUubGVuZ3RoKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCQotCQkJLy8gamF2YSBvZmZzZXQKLQkJCWludCBvZmZzZXQgPSBwcm9wb3NhbC5nZXRSZXBsYWNlU3RhcnQoKSArIDE7Ci0JCQkKLQkJCS8vIHJlcGxhY2VtZW50IGxlbmd0aAotCQkJaW50IGxlbmd0aCA9IHByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSAtIG9mZnNldCArIDE7Ci0JCQkKLQkJCS8vIHRyYW5zbGF0ZSBvZmZzZXQgZnJvbSBKYXZhID4gSlNQCi0JCQlvZmZzZXQgPSBnZXRUcmFuc2xhdGlvbigpLmdldEpzcE9mZnNldChvZmZzZXQpOwotCQkJCi0JCQkvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0JCQlpbnQgcG9zaXRpb25BZnRlciA9IG9mZnNldCArIGNvbXBsZXRpb24ubGVuZ3RoKCk7Ci0JCQkJCi0JCQkvLyBmcm9tIGphdmEgcHJvcG9zYWwKLQkJCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQkJU3RyaW5nIGxvbmdEaXNwbGF5U3RyaW5nID0gamF2YVByb3Bvc2FsLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCWludCBmaXN0U3BhY2VJbmRleCA9IGxvbmdEaXNwbGF5U3RyaW5nLmluZGV4T2YoJyAnKTsKLQkJCVN0cmluZyBzaG9ydERpc3BsYXlTdHJpbmcgPSBsb25nRGlzcGxheVN0cmluZzsKLQkJCQotCQkJaWYoZmlzdFNwYWNlSW5kZXggIT0gLTEpIHsKLQkJCQlzaG9ydERpc3BsYXlTdHJpbmcgPSBsb25nRGlzcGxheVN0cmluZy5zdWJzdHJpbmcoZmlzdFNwYWNlSW5kZXgpOwotCQkJfQotCQkJCQotCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBjb21wbGV0aW9uICsgIiAiICsgc2hvcnREaXNwbGF5U3RyaW5nOyAvLyROT04tTkxTLTEkCi0JCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IGphdmFQcm9wb3NhbC5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCQlpbnQgcmVsZXZhbmNlID0gamF2YVByb3Bvc2FsLmdldFJlbGV2YW5jZSgpOwotCQkJCi0JCQlib29sZWFuIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB0cnVlOwotCQkJCi0JCQlqc3BQcm9wb3NhbCA9IG5ldyBKU1BDb21wbGV0aW9uUHJvcG9zYWwoY29tcGxldGlvbiwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIGFkZGl0aW9uYWxJbmZvLCByZWxldmFuY2UsIHVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUpOwotCQkJCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0JCQkvLyBzZXQgd3JhcHBlZCBqYXZhIHByb3Bvc2FsIHNvIGFkZGl0aW9uYWwgaW5mbyBjYW4gYmUgY2FsY3VsYXRlZCBvbiBkZW1hbmQKLQkJCWpzcFByb3Bvc2FsLnNldEphdmFDb21wbGV0aW9uUHJvcG9zYWwoamF2YVByb3Bvc2FsKTsKLQkJCQotCQkJcmV0dXJuIGpzcFByb3Bvc2FsOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLS8vCXByb3RlY3RlZCB2b2lkIGFjY2VwdE1ldGhvZChjaGFyW10gZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBjaGFyW10gZGVjbGFyaW5nVHlwZU5hbWUsIGNoYXJbXSBuYW1lLCBjaGFyW11bXSBwYXJhbWV0ZXJQYWNrYWdlTmFtZXMsIGNoYXJbXVtdIHBhcmFtZXRlclR5cGVOYW1lcywgY2hhcltdW10gcGFyYW1ldGVyTmFtZXMsIGNoYXJbXSByZXR1cm5UeXBlUGFja2FnZU5hbWUsIGNoYXJbXSByZXR1cm5UeXBlTmFtZSwgY2hhcltdIGNvbXBsZXRpb25OYW1lLCBpbnQgbW9kaWZpZXJzLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCByZWxldmFuY2UpIHsKLS8vCQlTdHJpbmcgcmF3TmFtZSA9IFN0cmluZy52YWx1ZU9mKG5hbWUpOwotLy8JCWlmKHBhcmFtZXRlck5hbWVzLmxlbmd0aCA9PSAwICYmIHJhd05hbWUubGVuZ3RoKCkgPiAzICYmIHJhd05hbWUuc3RhcnRzV2l0aCgiZ2V0IikpCi0vLwkJewotLy8JCQlTdHJpbmcgbWFuZ2xlZE5hbWUgPSByYXdOYW1lLnN1YnN0cmluZygzLDQpLnRvTG93ZXJDYXNlKCkgKyByYXdOYW1lLnN1YnN0cmluZyg0LCByYXdOYW1lLmxlbmd0aCgpKTsKLS8vCQkJc3VwZXIuYWNjZXB0RmllbGQoZGVjbGFyaW5nVHlwZVBhY2thZ2VOYW1lLCBkZWNsYXJpbmdUeXBlTmFtZSwgbWFuZ2xlZE5hbWUudG9DaGFyQXJyYXkoKSwgcmV0dXJuVHlwZVBhY2thZ2VOYW1lLCByZXR1cm5UeXBlTmFtZSwgbWFuZ2xlZE5hbWUudG9DaGFyQXJyYXkoKSwgbW9kaWZpZXJzLCBzdGFydCwgZW5kLCByZWxldmFuY2UpOwotLy8JCX0KLS8vCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzZjMjA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5YTUxSZWxldmFuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotCi0vKioKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaW1wbGVtZW50cyBJQ29udGVudEFzc2lzdFByb2Nlc3NvciwgSVJlbGVhc2FibGUgewotCXByb3RlY3RlZCBjaGFyIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbmV3IGNoYXJbXXsnLid9OwotCXByb3RlY3RlZCBjaGFyIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0NPTlRFWFQgPSBKU1BVSU1lc3NhZ2VzLkNvbnRlbnRfQXNzaXN0X25vdF9hdmFpbGFiX1VJXzsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZFcnJvck1lc3NhZ2UgPSBudWxsOwotCXByb3RlY3RlZCBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gbnVsbDsKLQotCXB1YmxpYyBKU1BKYXZhQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBsaXN0IG9mIHByb3Bvc2VkIGNvZGUgY29tcGxldGlvbnMgYmFzZWQgb24gdGhlCi0JICogc3BlY2lmaWVkIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcwotCSAqIHRvIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQtZWRpdG9yIGNvbnRyb2wuCi0JICoKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbiBhIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNvZGUtYXNzaXN0IGl0ZW1zIAotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCUluZGV4ZWRSZWdpb24gdHJlZU5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gZ2V0IHJlc3VsdHMgZnJvbSBKU1AgY29tcGxldGlvbiBwcm9jZXNzb3IJCi0JCWZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gZ2V0SnNwQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcmVzdWx0cyA9IGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWZFcnJvck1lc3NhZ2UgPSBmSnNwQ29tcGxldGlvblByb2Nlc3Nvci5nZXRFcnJvck1lc3NhZ2UoKTsKLQkJaWYgKHJlc3VsdHMubGVuZ3RoID09IDAgJiYgKGZFcnJvck1lc3NhZ2UgPT0gbnVsbCB8fCBmRXJyb3JNZXNzYWdlLmxlbmd0aCgpID09IDApKSB7Ci0JCQlmRXJyb3JNZXNzYWdlID0gVU5LTk9XTl9DT05URVhUOwotCQl9Ci0KLQkJSURPTU5vZGUgeE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXQgPSBudWxsOwotCQlpZiAodHJlZU5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJeE5vZGUgPSAoSURPTU5vZGUpIHRyZWVOb2RlOwotCQkJZmxhdCA9IHhOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdCAhPSBudWxsICYmIGZsYXQuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCQkJZmxhdCA9IGZsYXQuZ2V0UHJldmlvdXMoKTsKLQkJCX0KLQkJfQotCi0JCS8vIHRoaXMgaXMgaW4gY2FzZSBpdCdzIGEgPCVALCBpdCB3aWxsIGJlIGEgcmVnaW9uIGNvbnRhaW5lci4uLgotCQlJVGV4dFJlZ2lvbiBvcGVuUmVnaW9uID0gbnVsbDsKLQkJaWYgKGZsYXQgIT0gbnVsbCAmJiBmbGF0IGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCB2ID0gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgZmxhdCkuZ2V0UmVnaW9ucygpOwotCQkJaWYgKHYuc2l6ZSgpID4gMCkKLQkJCQlvcGVuUmVnaW9uID0gdi5nZXQoMCk7Ci0JCX0KLQotCQkvLyBBREQgQ0RBVEEgUFJPUE9TQUwgSUYgSVQnUyBBTiBYTUwtSlNQIFRBRyAgCi0JCWlmIChmbGF0ICE9IG51bGwgJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1NDUklQVExFVF9PUEVOICYmIGZsYXQuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOICYmIGZsYXQuZ2V0VHlwZSgpICE9IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4gJiYgZmxhdC5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUICYmIChvcGVuUmVnaW9uICE9IG51bGwgJiYgb3BlblJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOKSAmJiAhaW5BdHRyaWJ1dGVSZWdpb24oZmxhdCwgZG9jdW1lbnRQb3NpdGlvbikpIHsKLQotCQkJLy8gZGV0ZXJtaW5lIGlmIGN1cnNvciBpcyBiZWZvcmUgb3IgYWZ0ZXIgc2VsZWN0ZWQgcmFuZ2UKLQkJCWludCBhZGp1c3RlZERvY1Bvc2l0aW9uID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJCWludCByZWFsQ2FyZXRQb3NpdGlvbiA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCWludCBzZWxlY3Rpb25MZW5ndGggPSB2aWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLnk7Ci0JCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IHJlYWxDYXJldFBvc2l0aW9uKSB7Ci0JCQkJYWRqdXN0ZWREb2NQb3NpdGlvbiAtPSBzZWxlY3Rpb25MZW5ndGg7Ci0JCQl9Ci0KLQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBjZGF0YVByb3Bvc2FsID0gY3JlYXRlQ0RBVEFQcm9wb3NhbChhZGp1c3RlZERvY1Bvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG5ld1Jlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShyZXN1bHRzLCAwLCBuZXdSZXN1bHRzLCAwLCByZXN1bHRzLmxlbmd0aCk7Ci0JCQluZXdSZXN1bHRzW3Jlc3VsdHMubGVuZ3RoXSA9IGNkYXRhUHJvcG9zYWw7Ci0JCQlyZXN1bHRzID0gbmV3UmVzdWx0czsKLQkJfQotCi0JCS8vIChwYSkgKiogdGhpcyBpcyBjb2RlIGluIHByb2dyZXNzLi4uCi0JCS8vIGFkZCBlbmRpbmcgJT4gcHJvcG9zYWwgZm9yIG5vbiBjbG9zZWQgSlNQIHRhZ3MKLQkJLy8JCVN0cmluZyB0YWdUZXh0ID0gZmxhdC5nZXRUZXh0KCk7Ci0JCS8vCQkvLyBUT0RPIG5lZWQgYSBtdWNoIGJldHRlciBjb21wYXJlICh1c2luZyBjb25zdGFudHM/KQotCQkvLwkJaWYodGFnVGV4dC5lcXVhbHMoIjwlIikgfHwgdGFnVGV4dC5lcXVhbHMoIjwlPSIpIHx8IHRhZ1RleHQuZXF1YWxzKCI8JSEiKSk7Ci0JCS8vCQl7Ci0JCS8vCQkJSUNvbXBsZXRpb25Qcm9wb3NhbCB0ZXN0YWggPSBDb250ZW50QXNzaXN0VXRpbHMuY29tcHV0ZUpTUEVuZFRhZ1Byb3Bvc2FsKHZpZXdlcixkb2N1bWVudFBvc2l0aW9uLCB0cmVlTm9kZSwgIjwlIiAsIFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkvLwkJCWlmKHRlc3RhaCAhPSBudWxsKQotCQkvLwkJCXsKLQkJLy8JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIG5ld1Jlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXN1bHRzLmxlbmd0aCArIDFdOwotCQkvLwkJCQlTeXN0ZW0uYXJyYXljb3B5KCByZXN1bHRzLCAwLCBuZXdSZXN1bHRzLCAwLCByZXN1bHRzLmxlbmd0aCk7Ci0JCS8vCQkJCW5ld1Jlc3VsdHNbcmVzdWx0cy5sZW5ndGhdID0gdGVzdGFoOwotCQkvLwkJCQlyZXN1bHRzID0gbmV3UmVzdWx0czsKLQkJLy8JCQl9Ci0JCS8vCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JcHJpdmF0ZSBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlQ0RBVEFQcm9wb3NhbChpbnQgYWRqdXN0ZWREb2NQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQlyZXR1cm4gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCFbQ0RBVEFbXV0+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQlhZGp1c3RlZERvY1Bvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgsIC8vIHNob3VsZCBiZSB0aGUgc2VsZWN0aW9uIGxlbmd0aAotCQkJCQk5LCBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0NEQVRBU0VDVElPTiksIAotCQkJCQkiQ0RBVEEgU2VjdGlvbiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0RBVEEpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbkF0dHJpYnV0ZVJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXQsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCUlUZXh0UmVnaW9uIGF0dHJDb250YWluZXIgPSBmbGF0LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pOwotCQlpZiAoYXR0ckNvbnRhaW5lciAhPSBudWxsICYmIGF0dHJDb250YWluZXIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJaWYgKGF0dHJDb250YWluZXIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgY29tcGxldGlvbiBwcm9wb3NhbCBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqCQlpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICoKLQkgKiBAcmV0dXJuIHRoZSBhdXRvIGFjdGl2YXRpb24gY2hhcmFjdGVycyBmb3IgcHJlc2VudGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICoJCW9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcyBkZXNpcmVkCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBjb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSByZWFzb24gd2h5IGNvbXB1dGVQcm9wb3NhbHMgd2FzIG5vdCBhYmxlIHRvIGZpbmQgYW55IGNvbXBsZXRpb25zLgotCSAqCi0JICogQHJldHVybiBhbiBlcnJvciBtZXNzYWdlCi0JICogICBvciBudWxsIGlmIG5vIGVycm9yIG9jY3VycmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ29udGVudEFzc2lzdEFkYXB0ZXIjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCWZKc3BDb21wbGV0aW9uUHJvY2Vzc29yLnJlbGVhc2UoKTsKLQkJCWZKc3BDb21wbGV0aW9uUHJvY2Vzc29yID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBKU1BDb21wbGV0aW9uUHJvY2Vzc29yIGdldEpzcENvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9PSBudWxsKSB7Ci0JCQlmSnNwQ29tcGxldGlvblByb2Nlc3NvciA9IG5ldyBKU1BDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZKc3BDb21wbGV0aW9uUHJvY2Vzc29yOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIG5lZWQgdG8gY29tcHV0ZSBjb250ZXh0IGluZm8gaGVyZSwgaWYgaXQncyBKU1AsIGNhbGwgamF2YSBjb21wdXRlcgotCQlJRG9jdW1lbnQgZG9jID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIGRwID0gbnVsbDsKLQkJaWYoZG9jIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJZHAgPSAoKElEb2N1bWVudEV4dGVuc2lvbjMpZG9jKS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpOwotCQl9Ci0JCWlmKGRwICE9IG51bGwpIHsKLQkJCS8vSURvY3VtZW50UGFydGl0aW9uZXIgZHAgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCk7Ci0JCQlTdHJpbmcgdHlwZSA9IGRwLmdldFBhcnRpdGlvbihkb2N1bWVudE9mZnNldCkuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQgfHwgdHlwZSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBKSB7Ci0JCQkJLy8gZ2V0IGNvbnRleHQgaW5mbyBmcm9tIGNvbXBsZXRpb24gcmVzdWx0cy4uLgotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ29udGV4dEluZm9ybWF0aW9uIGNpID0gcHJvcG9zYWxzW2ldLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQkJCQlpZiAoY2kgIT0gbnVsbCkKLQkJCQkJCXJlc3VsdHMuYWRkKGNpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29udGV4dEluZm9ybWF0aW9uW10pIHJlc3VsdHMudG9BcnJheShuZXcgSUNvbnRleHRJbmZvcm1hdGlvbltyZXN1bHRzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvY2Vzc29yIGlzCi0JICogaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqCi0JICogQHJldHVybiBhIGNvbnRleHQgaW5mb3JtYXRpb24gdmFsaWRhdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvY2Vzc29yCi0JICogCQkJaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlyZXR1cm4gbmV3IEphdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODcxOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTFJlbGV2YW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29tcHV0ZXMgYXR0cmlidXRlIHZhbHVlIGNvbXBsZXRpb24gcHJvcG9zYWxzIGZvciAmbHQ7anNwOltnc11ldFByb3BlcnR5Jmd0OyB0YWdzLgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZXh0ZW5kcyBKU1BEdW1teUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXB1YmxpYyBKU1BQcm9wZXJ0eUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpOwotCi0JCS8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB3aGljaCB0aGlzIHBvc2l0aW9uIHNob3VsZCBoYXZlIGEgdmFsdWUKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvcGVuID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3Qgb3BlblJlZ2lvbnMgPSBvcGVuLmdldFJlZ2lvbnMoKTsKLQkJaW50IGkgPSBvcGVuUmVnaW9ucy5pbmRleE9mKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpKTsKLQkJaWYgKGkgPCAwKQotCQkJcmV0dXJuOwotCi0JCS8vIGdldCB0aGUgYXR0cmlidXRlIGluIHF1ZXN0aW9uIChmaXJzdCBhdHRyIG5hbWUgdG8gdGhlIGxlZnQgb2YgdGhlIGN1cnNvcikKLQkJSVRleHRSZWdpb24gYXR0ck5hbWVSZWdpb24gPSBudWxsOwotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCWF0dHJOYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQlpZiAoYXR0ck5hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQlicmVhazsKLQkJfQotCQlpZiAoYXR0ck5hbWVSZWdpb24gIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZU5hbWUgPSBvcGVuLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCi0JCS8vIGRldGVybWluZSBnZXQgb3Igc2V0Ci0JCUlUZXh0UmVnaW9uIHRhZ05hbWVSZWdpb24gPSBudWxsOwotCQlib29sZWFuIGlzR2V0UHJvcGVydHkgPSB0cnVlOwotCQlmb3IgKGludCBqID0gMDsgaiA8IG9wZW5SZWdpb25zLnNpemUoKTsgaisrKSB7Ci0JCQl0YWdOYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGopOwotCQkJaWYgKHRhZ05hbWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmIG9wZW4uZ2V0VGV4dCh0YWdOYW1lUmVnaW9uKS50cmltKCkuZXF1YWxzKCJqc3A6c2V0UHJvcGVydHkiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaXNHZXRQcm9wZXJ0eSA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG51bGw7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkKLQkJCWN1cnJlbnRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFRleHQoKTsKLQkJZWxzZQotCQkJY3VycmVudFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gbnVsbDsKLQkJLy8gZml4dXBzIHNpbmNlIHRoZSBtYXRjaFN0cmluZyBjb21wdXRhdGlvbnMgZG9uJ3QgY2FyZSBpZiB0aGVyZSBhcmUgcXVvdGVzIGFyb3VuZCB0aGUgdmFsdWUKLQkJaWYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IFN0cmluZ1V0aWxzLnN0cmlwKGN1cnJlbnRWYWx1ZSkubGVuZ3RoKCkgJiYgKGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCJcIiIpIHx8IGN1cnJlbnRWYWx1ZS5zdGFydHNXaXRoKCInIikpICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW1hdGNoU3RyaW5nID0gY3VycmVudFZhbHVlLnN1YnN0cmluZygxLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpKTsKLQkJZWxzZQotCQkJbWF0Y2hTdHJpbmcgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDAsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkpOwotCi0JCS8vIGZvciBub3cgd2UgaWdub3JlIGNvbXBsaWNhdGVkIHZhbHVlcyBzdWNoIGFzIGpzcCBlbWJlZGRlZCBpbiBhbiBhdHRyaWJ1dGUKLQkJYm9vbGVhbiBleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXI7Ci0JCWlmIChleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUpIHsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFByb3Bvc2FscygpLmNsZWFyKCk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYWNyb3MoKS5jbGVhcigpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FKSkgewotCQkJCWFkZEJlYW5OYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBub2RlLCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUFJPUEVSVFkpKSB7Ci0JCQkJYWRkQmVhblByb3BlcnR5UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBub2RlLCBpc0dldFByb3BlcnR5LCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQmVhblByb3BlcnR5UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBJRE9NTm9kZSBub2RlLCBib29sZWFuIGlzR2V0UHJvcGVydHksIFN0cmluZyBtYXRjaFN0cmluZykgewotCQkvLyBhc3N1bWVzIHRoYXQgdGhlIG5vZGUgaXMgdGhlIFtnc11ldFByb3BlcnR5IHRhZwotCQlTdHJpbmcgdXNlQmVhbk5hbWUgPSAoKEVsZW1lbnQpIG5vZGUpLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSk7Ci0JCS8vIHByb3BlcnRpZXMgY2FuIG9ubHkgYmUgcHJvdmlkZWQgaWYgYSBjbGFzcy90eXBlL2JlYW5OYW1lIGhhcyBiZWVuIGRlY2xhcmVkCi0JCWlmICh1c2VCZWFuTmFtZSAhPSBudWxsICYmIHVzZUJlYW5OYW1lLmxlbmd0aCgpID4gMCkgewotCQkJTm9kZUxpc3QgdXNlQmVhbnMgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRFbGVtZW50c0J5VGFnTmFtZShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOKTsKLQkJCWlmICh1c2VCZWFucyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHR5cGVOYW1lID0gbnVsbDsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHVzZUJlYW5zLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQkJaWYgKHVzZUJlYW5zLml0ZW0oaikuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlFbGVtZW50IHVzZUJlYW4gPSAoRWxlbWVudCkgdXNlQmVhbnMuaXRlbShqKTsKLQkJCQkJaWYgKHVzZUJlYW4gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uICYmICgoSW5kZXhlZFJlZ2lvbikgdXNlQmVhbikuZ2V0U3RhcnRPZmZzZXQoKSA8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQkJaWYgKHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9JRCkuZXF1YWxzKHVzZUJlYW5OYW1lKSkgewotCQkJCQkJCXR5cGVOYW1lID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0NMQVNTKTsKLQkJCQkJCQlpZiAodHlwZU5hbWUgPT0gbnVsbCB8fCB0eXBlTmFtZS5sZW5ndGgoKSA8IDEpIHsKLQkJCQkJCQkJdHlwZU5hbWUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmICh0eXBlTmFtZSA9PSBudWxsIHx8IHR5cGVOYW1lLmxlbmd0aCgpIDwgMSkgewotCQkJCQkJCQl0eXBlTmFtZSA9IHVzZUJlYW4uZ2V0QXR0cmlidXRlKEpTUDExTmFtZXNwYWNlLkFUVFJfTkFNRV9CRUFOX05BTUUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodHlwZU5hbWUgIT0gbnVsbCAmJiB0eXBlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJLy8gZmluZCB0aGUgY2xhc3MvdHlwZS9iZWFuTmFtZSBkZWZpbml0aW9uIGFuZCBvYnRhaW4gdGhlIGxpc3Qgb2YgcHJvcGVydGllcwotCQkJCQlJQmVhbkluZm9Qcm92aWRlciBwcm92aWRlciA9IG5ldyBCZWFuSW5mb1Byb3ZpZGVyKCk7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJSUphdmFQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IHByb3ZpZGVyLmdldFJ1bnRpbWVQcm9wZXJ0aWVzKHJlc291cmNlLCB0eXBlTmFtZSk7Ci0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9ycy5sZW5ndGg7IGorKykgewotCQkJCQkJSUphdmFQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBkZXNjcmlwdG9yc1tqXTsKLQkJCQkJCS8vIGNoZWNrIHdoZXRoZXIgaXQncyBnZXQgb3Igc2V0IGtpbmRhIHByb3BlcnR5Ci0JCQkJCQlpZiAocGQuZ2V0UmVhZGFibGUoKSAmJiBpc0dldFByb3BlcnR5IHx8IHBkLmdldFdyaXRlYWJsZSgpICYmICFpc0dldFByb3BlcnR5KSB7Ci0JCQkJCQkJLy8gZmlsdGVyIGF0dHIgdmFsdWUgbmFtZQotCQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHBkLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpIHsKLQkJCQkJCQkJZGlzcGxheVN0cmluZyA9IHBkLmdldERpc3BsYXlOYW1lKCk7Ci0JCQkJCQkJCWlmIChwZC5nZXREZWNsYXJlZFR5cGUoKSAhPSBudWxsICYmIHBkLmdldERlY2xhcmVkVHlwZSgpLmxlbmd0aCgpID4gMCkKLQkJCQkJCQkJCWRpc3BsYXlTdHJpbmcgKz0gIiAtICIgKyBwZC5nZXREZWNsYXJlZFR5cGUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIHBkLmdldE5hbWUoKSArICJcIiIsIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcGQuZ2V0TmFtZSgpLmxlbmd0aCgpICsgMiwgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9BVFRSSUJVVEUpLAotCQkJCQkJCQkJCQlkaXNwbGF5U3RyaW5nLCBudWxsLCBwZC5nZXREZWNsYXJlZFR5cGUoKSwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfWE1MX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkQmVhbk5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIElET01Ob2RlIG5vZGUsIFN0cmluZyBtYXRjaFN0cmluZykgewotCQkvLyB3aWxsIG5vdCBjYXRjaCB1c2VCZWFucyBzcGVjaWZpZWQgdXNpbmcgb3RoZXIgdGhhbiBhY3R1YWwgRE9NIE5vZGVzCi0JCU5vZGVMaXN0IHVzZUJlYW5zID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuVVNFQkVBTik7Ci0JCWlmICh1c2VCZWFucyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgaWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBudWxsOwotCQkJU3RyaW5nIGNsYXNzT3JUeXBlID0gbnVsbDsKLQkJCVN0cmluZyBpbWFnZU5hbWUgPSBKU1BFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DTEFTU19PQko7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHVzZUJlYW5zLmdldExlbmd0aCgpOyBqKyspIHsKLQkJCQlpZiAodXNlQmVhbnMuaXRlbShqKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljb250aW51ZTsKLQkJCQlFbGVtZW50IHVzZUJlYW4gPSAoRWxlbWVudCkgdXNlQmVhbnMuaXRlbShqKTsKLQkJCQlpZiAodXNlQmVhbiBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24gJiYgKChJbmRleGVkUmVnaW9uKSB1c2VCZWFuKS5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJCWlkID0gU3RyaW5nVXRpbHMuc3RyaXAodXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lEKSk7Ci0JCQkJCWRpc3BsYXlTdHJpbmcgPSBudWxsOwotCQkJCQljbGFzc09yVHlwZSA9IG51bGw7Ci0JCQkJCWltYWdlTmFtZSA9IEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NMQVNTX09CSjsKLQkJCQkJLy8gc2V0IHRoZSBJbWFnZSBiYXNlZCBvbiB3aGV0aGVyIHRoZSBjbGFzcywgdHlwZSwgb3IgYmVhbk5hbWUgYXR0cmlidXRlIGlzIHByZXNlbnQKLQkJCQkJY2xhc3NPclR5cGUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQ0xBU1MpOwotCQkJCQlpZiAoY2xhc3NPclR5cGUgPT0gbnVsbCB8fCBjbGFzc09yVHlwZS5sZW5ndGgoKSA8IDEpIHsKLQkJCQkJCWNsYXNzT3JUeXBlID0gdXNlQmVhbi5nZXRBdHRyaWJ1dGUoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUpOwotCQkJCQkJaW1hZ2VOYW1lID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFVCTElDOwotCQkJCQl9Ci0JCQkJCWlmIChjbGFzc09yVHlwZSA9PSBudWxsIHx8IGNsYXNzT3JUeXBlLmxlbmd0aCgpIDwgMSkgewotCQkJCQkJY2xhc3NPclR5cGUgPSB1c2VCZWFuLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQkVBTl9OQU1FKTsKLQkJCQkJCWltYWdlTmFtZSA9IEpTUEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BVQkxJQzsKLQkJCQkJfQotCQkJCQlpZiAoY2xhc3NPclR5cGUgIT0gbnVsbCAmJiBjbGFzc09yVHlwZS5sZW5ndGgoKSA+IDApCi0JCQkJCQlkaXNwbGF5U3RyaW5nID0gaWQgKyAiIC0gIiArIGNsYXNzT3JUeXBlOyAvLyROT04tTkxTLTEkCi0JCQkJCWVsc2UKLQkJCQkJCWRpc3BsYXlTdHJpbmcgPSBpZDsKLQotCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MjM0MQotCQkJCQlpZihpZCAhPSBudWxsKSB7Ci0JCQkJCSAgICAvLyBmaWx0ZXIKLQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IGlkLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcpKSB7Ci0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiXCIiICsgaWQgKyAiXCIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQubGVuZ3RoKCkgKyAyLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlTmFtZSksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdHJpbmcsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHByb2plY3QgcmVxdWVzdCBpcyBpbgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIGJhc2Vsb2NhdGlvbiA9IG51bGw7Ci0KLQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSByZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSByZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJYmFzZWxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkgewotCQkJLy8gY29waWVkIGZyb20gSlNQVHJhbnNsYXRpb25BZGFwdGVyI2dldEphdmFQcm9qZWN0Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZWxvY2F0aW9uKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJZmlsZSA9IHJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQl9Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3Bvc2FsQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BQcm9wb3NhbENvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZhM2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFByb3Bvc2FsQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLlNpZ25hdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbXBsZXRpb25Qcm9wb3NhbENvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbXBsZXRpb25Qcm9wb3NhbENvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuamF2YS5JSmF2YUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogUGFzc2VkIGludG8gSUNvZGVDb21wbGV0ZSNjb2RlQ29tcGxldGUoaW50IG9mZnNldCwgQ29tcGxldGlvblJlcXVlc3RvciByZXF1ZXN0b3IpLgotICogQWRhcHRzIElKYXZhQ29tcGxldGlvblByb3Bvc2FscyB0byBKU1BDb21wbGV0aW9uIHByb3Bvc2Fscy4KLSAqIFRoaXMgaW5jbHVkZXM6Ci0gKiAgLSB0cmFuc2xhdGluZyBvZmZzZXRzCi0gKiAgLSAiZml4aW5nIiB1cCBkaXNwbGF5IHN0cmluZ3MKLSAqICAtIGZpbHRlcmluZyBzb21lIHVud2FudGVkIHByb3Bvc2FscwotICoKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQUHJvcG9zYWxDb2xsZWN0b3IgZXh0ZW5kcyBDb21wbGV0aW9uUHJvcG9zYWxDb2xsZWN0b3IgewotCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbiBmVHJhbnNsYXRpb247Ci0JcHJpdmF0ZSBDb21wYXJhdG9yIGZDb21wYXJhdG9yOwotCQotCXB1YmxpYyBKU1BQcm9wb3NhbENvbGxlY3RvcihJQ29tcGlsYXRpb25Vbml0IGN1LCBKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbikgewotCQlzdXBlcihjdSk7Ci0JCi0JCWlmKHRyYW5zbGF0aW9uID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJKU1BUcmFuc2xhdGlvbiBjYW5ub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlmVHJhbnNsYXRpb24gPSB0cmFuc2xhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHRoYXQgd2Ugb25seSByZXR1cm4gSlNQQ29tcGxldGlvblByb3Bvc2Fscy4KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMKLQkgKi8KLQlwdWJsaWMgSlNQQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0SlNQQ29tcGxldGlvblByb3Bvc2FscygpIHsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbFtdIGphdmFQcm9wb3NhbHMgPSBnZXRKYXZhQ29tcGxldGlvblByb3Bvc2FscygpOwotCQkvLyBuZWVkIHRvIGZpbHRlciBvdXQgbm9uIEpTUENvbXBsZXRpb25Qcm9wb3NhbHMKLQkJLy8gYmVjYXVzZSB0aGVpciBvZmZzZXRzIGhhdmVuJ3QgYmVlbiB0cmFuc2xhdGVkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgamF2YVByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJaWYoamF2YVByb3Bvc2Fsc1tpXSBpbnN0YW5jZW9mIEpTUENvbXBsZXRpb25Qcm9wb3NhbCkKLQkJCQlyZXN1bHRzLmFkZChqYXZhUHJvcG9zYWxzW2ldKTsKLQkJfQotCQlDb2xsZWN0aW9ucy5zb3J0KHJlc3VsdHMsIGdldENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiAoSlNQQ29tcGxldGlvblByb3Bvc2FsW10pcmVzdWx0cy50b0FycmF5KG5ldyBKU1BDb21wbGV0aW9uUHJvcG9zYWxbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGdldENvbXBhcmF0b3IoKSB7Ci0JCWlmKGZDb21wYXJhdG9yID09IG51bGwpCi0JCQlmQ29tcGFyYXRvciA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxDb21wYXJhdG9yKCk7Ci0JCXJldHVybiBmQ29tcGFyYXRvcjsKLQl9Ci0JCi0JLyoqCi0JICogT3ZlcnJpZGRlbiB0bzoKLQkgKiAgLSB0cmFuc2xhdGUgSmF2YSAtPiBKU1Agb2Zmc2V0cwotCSAqICAtIGZpeCBjdXJzb3ItcG9zaXRpb24tYWZ0ZXIKLQkgKiAgLSBmaXggbWFuZ2xlZCBzZXJ2bGV0IG5hbWUgaW4gZGlzcGxheSBzdHJpbmcKLQkgKiAgLSByZW1vdmUgdW53YW50ZWQgcHJvcG9zYWxzIChzZXJ2bGV0IGNvbnN0cnVjdG9yKQotCSAqLwotCXByb3RlY3RlZCBJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCkgewotCQkKLQkJSlNQQ29tcGxldGlvblByb3Bvc2FsIGpzcFByb3Bvc2FsID0gbnVsbDsKLQkJCi0JCS8vIGlnbm9yZSBjb25zdHJ1Y3RvciBwcm9wb3NhbHMgKHRoZXkncmUgbm90IHJlbGV2YW50IGZvciBvdXIgSlNQIHByb3Bvc2FsIGxpc3QpCi0JCWlmKCFwcm9wb3NhbC5pc0NvbnN0cnVjdG9yKCkpIHsKLQkJCQotCQkJaWYocHJvcG9zYWwuZ2V0S2luZCgpID09IENvbXBsZXRpb25Qcm9wb3NhbC5UWVBFX1JFRikgewotCQkJCVN0cmluZyBzaWduYXR1cmUgPSBTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpKTsKLQkJCQlTdHJpbmcgY29tcGxldGlvbiA9IFN0cmluZy52YWx1ZU9mKHByb3Bvc2FsLmdldENvbXBsZXRpb24oKSk7Ci0JCQkJaWYoY29tcGxldGlvbi5pbmRleE9mKHNpZ25hdHVyZSkgIT0gLTEpIHsKLQkJCQkJanNwUHJvcG9zYWwgPSBjcmVhdGVBdXRvSW1wb3J0UHJvcG9zYWwocHJvcG9zYWwpOwkJCQotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZGVmYXVsdCBiZWhhdmlvcgotCQkJaWYoanNwUHJvcG9zYWwgPT0gbnVsbCkKLQkJCQlqc3BQcm9wb3NhbCA9IGNyZWF0ZUpzcFByb3Bvc2FsKHByb3Bvc2FsKTsJCQotCQl9Ci0JCXJldHVybiBqc3BQcm9wb3NhbDsKLQl9Ci0KLQkKLQkKLQlwcml2YXRlIEpTUENvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVBdXRvSW1wb3J0UHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCQotCQlKU1BDb21wbGV0aW9uUHJvcG9zYWwganNwUHJvcG9zYWwgPSBudWxsOwotCi0JCVN0cmluZyBzaWduYXR1cmUgPSBuZXcgU3RyaW5nKHByb3Bvc2FsLmdldERlY2xhcmF0aW9uU2lnbmF0dXJlKCkpOwotCQlTdHJpbmcgY29tcGxldGlvbiA9IG5ldyBTdHJpbmcocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLQkJCi0JCS8vIGl0J3MgZnVsbHkgcXVhbGlmaWVkIHNvIHdlIHNob3VsZAotCQkvLyBhZGQgYW4gaW1wb3J0IHN0YXRlbWVudAotCQkvLyBjcmVhdGUgYW4gYXV0b2ltcG9ydCBwcm9wb3NhbAotCQlTdHJpbmcgbmV3Q29tcGxldGlvbiA9IGNvbXBsZXRpb24ucmVwbGFjZUFsbChzaWduYXR1cmUgKyAiLiIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQotCQkvLyBqYXZhIG9mZnNldAotCQlpbnQgb2Zmc2V0ID0gcHJvcG9zYWwuZ2V0UmVwbGFjZVN0YXJ0KCk7Ci0JCS8vIHJlcGxhY2VtZW50IGxlbmd0aAotCQlpbnQgbGVuZ3RoID0gcHJvcG9zYWwuZ2V0UmVwbGFjZUVuZCgpIC0gb2Zmc2V0OwotCQkvLyB0cmFuc2xhdGUgb2Zmc2V0IGZyb20gSmF2YSA+IEpTUAotCQlvZmZzZXQgPSBmVHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KG9mZnNldCk7Ci0JCS8vIGN1cnNvciBwb3NpdGlvbiBhZnRlciBtdXN0IGJlIGNhbGN1bGF0ZWQKLQkJaW50IHBvc2l0aW9uQWZ0ZXIgPSBjYWxjdWxhdGVQb3NpdGlvbkFmdGVyKHByb3Bvc2FsLCBuZXdDb21wbGV0aW9uLCBvZmZzZXQpOwotCQkKLQkJLy8gZnJvbSBqYXZhIHByb3Bvc2FsCi0JCUlKYXZhQ29tcGxldGlvblByb3Bvc2FsIGphdmFQcm9wb3NhbCA9IHN1cGVyLmNyZWF0ZUphdmFDb21wbGV0aW9uUHJvcG9zYWwocHJvcG9zYWwpOwotCQlwcm9wb3NhbC5nZXREZWNsYXJhdGlvblNpZ25hdHVyZSgpOwotCQlJbWFnZSBpbWFnZSA9IGphdmFQcm9wb3NhbC5nZXRJbWFnZSgpOwotCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9IGphdmFQcm9wb3NhbC5nZXREaXNwbGF5U3RyaW5nKCk7Ci0JCWRpc3BsYXlTdHJpbmcgPSBnZXRUcmFuc2xhdGlvbigpLmZpeHVwTWFuZ2xlZE5hbWUoZGlzcGxheVN0cmluZyk7Ci0JCUlDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uID0gamF2YVByb3Bvc2FsLmdldENvbnRleHRJbmZvcm1hdGlvbigpOwotCQkvLyBkb24ndCBkbyB0aGlzLCBpdCdzIHNsb3cKLQkJLy8gU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJaW50IHJlbGV2YW5jZSA9IGphdmFQcm9wb3NhbC5nZXRSZWxldmFuY2UoKTsKLQkJCi0JCWJvb2xlYW4gdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHRydWU7Ci0JCQotCQlqc3BQcm9wb3NhbCA9IG5ldyBBdXRvSW1wb3J0UHJvcG9zYWwoY29tcGxldGlvbiwgbmV3Q29tcGxldGlvbiwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIG51bGwsIHJlbGV2YW5jZSwgdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSk7Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0JCS8vIHNldCB3cmFwcGVkIGphdmEgcHJvcG9zYWwgc28gYWRkaXRpb25hbCBpbmZvIGNhbiBiZSBjYWxjdWxhdGVkIG9uIGRlbWFuZAotCQlqc3BQcm9wb3NhbC5zZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKGphdmFQcm9wb3NhbCk7Ci0JCQotCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JfQotCi0JcHJpdmF0ZSBKU1BDb21wbGV0aW9uUHJvcG9zYWwgY3JlYXRlSnNwUHJvcG9zYWwoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsKSB7Ci0JCQotCQlKU1BDb21wbGV0aW9uUHJvcG9zYWwganNwUHJvcG9zYWw7Ci0JCVN0cmluZyBjb21wbGV0aW9uID0gU3RyaW5nLnZhbHVlT2YocHJvcG9zYWwuZ2V0Q29tcGxldGlvbigpKTsKLQkJLy8gamF2YSBvZmZzZXQKLQkJaW50IG9mZnNldCA9IHByb3Bvc2FsLmdldFJlcGxhY2VTdGFydCgpOwotCQkvLyByZXBsYWNlbWVudCBsZW5ndGgKLQkJaW50IGxlbmd0aCA9IHByb3Bvc2FsLmdldFJlcGxhY2VFbmQoKSAtIG9mZnNldDsKLQkJLy8gdHJhbnNsYXRlIG9mZnNldCBmcm9tIEphdmEgPiBKU1AKLQkJb2Zmc2V0ID0gZlRyYW5zbGF0aW9uLmdldEpzcE9mZnNldChvZmZzZXQpOwotCQkvLyBjdXJzb3IgcG9zaXRpb24gYWZ0ZXIgbXVzdCBiZSBjYWxjdWxhdGVkCi0JCWludCBwb3NpdGlvbkFmdGVyID0gY2FsY3VsYXRlUG9zaXRpb25BZnRlcihwcm9wb3NhbCwgY29tcGxldGlvbiwgb2Zmc2V0KTsKLQkJCi0JCS8vIGZyb20gamF2YSBwcm9wb3NhbAotCQlJSmF2YUNvbXBsZXRpb25Qcm9wb3NhbCBqYXZhUHJvcG9zYWwgPSBzdXBlci5jcmVhdGVKYXZhQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJcHJvcG9zYWwuZ2V0RGVjbGFyYXRpb25TaWduYXR1cmUoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBqYXZhUHJvcG9zYWwuZ2V0SW1hZ2UoKTsKLQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcgPSBqYXZhUHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotCQlkaXNwbGF5U3RyaW5nID0gZ2V0VHJhbnNsYXRpb24oKS5maXh1cE1hbmdsZWROYW1lKGRpc3BsYXlTdHJpbmcpOwotCQlJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiA9IGphdmFQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLQkJLy8gU3RyaW5nIGFkZGl0aW9uYWxJbmZvID0gamF2YVByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJaW50IHJlbGV2YW5jZSA9IGphdmFQcm9wb3NhbC5nZXRSZWxldmFuY2UoKTsKLQkJCi0JCWJvb2xlYW4gdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSA9IHRydWU7Ci0JCQotCQlqc3BQcm9wb3NhbCA9IG5ldyBKU1BDb21wbGV0aW9uUHJvcG9zYWwoY29tcGxldGlvbiwgb2Zmc2V0LCBsZW5ndGgsIHBvc2l0aW9uQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBjb250ZXh0SW5mb3JtYXRpb24sIG51bGwsIHJlbGV2YW5jZSwgdXBkYXRlTGVuZ3RoT25WYWxpZGF0ZSk7Ci0JCQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI0NDgzCi0JCS8vIHNldCB3cmFwcGVkIGphdmEgcHJvcG9zYWwgc28gYWRkaXRpb25hbCBpbmZvIGNhbiBiZSBjYWxjdWxhdGVkIG9uIGRlbWFuZAotCQlqc3BQcm9wb3NhbC5zZXRKYXZhQ29tcGxldGlvblByb3Bvc2FsKGphdmFQcm9wb3NhbCk7Ci0JCQotCQlyZXR1cm4ganNwUHJvcG9zYWw7Ci0JfQotCi0JLyoqCi0JICogQ2FjbHVhdGVzIHRoZSB3aGVyZSB0aGUgY3Vyc29yIHNob3VsZCBiZSBhZnRlciBhcHBseWluZyB0aGlzIHByb3Bvc2FsLgotCSAqIGVnLiBtZXRob2QofCkgaWYgdGhlIG1ldGhvZCBwcm9wb3NhbCBjaG9zZW4gaGFkIHBhcmFtcy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvcG9zYWwKLQkgKiBAcGFyYW0gY29tcGxldGlvbgotCSAqIEBwYXJhbSBjdXJyZW50Q3Vyc29yT2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGNhbGN1bGF0ZVBvc2l0aW9uQWZ0ZXIoQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsLCBTdHJpbmcgY29tcGxldGlvbiwgaW50IGN1cnJlbnRDdXJzb3JPZmZzZXQpIHsKLQkJLy8gY2FsY3VsYXRlIGN1cnNvciBwb3NpdGlvbiBhZnRlcgotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE4Mzk4Ci0JCS8vaW50IHBvc2l0aW9uQWZ0ZXIgPSBjdXJyZW50Q3Vyc29yT2Zmc2V0K2NvbXBsZXRpb24ubGVuZ3RoKCk7Ci0JCWludCBwb3NpdGlvbkFmdGVyID0gY29tcGxldGlvbi5sZW5ndGgoKTsKLQkJCi0JCWludCBraW5kID0gcHJvcG9zYWwuZ2V0S2luZCgpOwotCQkKLQkJLy8gbWF5IG5lZWQgYmV0dGVyIGxvZ2ljIGhlcmUuLi4KLQkJLy8gcHV0IGN1cnNvciBpbnNpZGUgcGFyZW50aGVzaXMgaWYgdGhlcmUncyBwYXJhbXMKLQkJLy8gb25seSBjaGVja2luZyBmb3IgYW55IGtpbmQgb2YgZGVjbGFyYXRpb24KLQkJaWYoa2luZCA9PSBDb21wbGV0aW9uUHJvcG9zYWwuQU5PTllNT1VTX0NMQVNTX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9ERUNMQVJBVElPTiB8fCBraW5kID09IENvbXBsZXRpb25Qcm9wb3NhbC5QT1RFTlRJQUxfTUVUSE9EX0RFQ0xBUkFUSU9OIHx8IGtpbmQgPT0gQ29tcGxldGlvblByb3Bvc2FsLk1FVEhPRF9SRUYpIHsKLQkJCVN0cmluZ1tdIHBhcmFtcyA9IFNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcyhTdHJpbmcudmFsdWVPZihwcm9wb3NhbC5nZXRTaWduYXR1cmUoKSkpOwotCQkJaWYoY29tcGxldGlvbi5sZW5ndGgoKSA+IDAgJiYgcGFyYW1zLmxlbmd0aCA+IDApCi0JCQkJcG9zaXRpb25BZnRlci0tOwotCQl9Ci0JCXJldHVybiBwb3NpdGlvbkFmdGVyOwotCX0KLQkKLQlzdGF0aWMgY2hhcltdIGdldFR5cGVUcmlnZ2VycygpIHsKLQkJcmV0dXJuIFRZUEVfVFJJR0dFUlM7Ci0JfQotCi0JcHVibGljIEpTUFRyYW5zbGF0aW9uIGdldFRyYW5zbGF0aW9uKCkgewotCQlyZXR1cm4gZlRyYW5zbGF0aW9uOwotCX0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTNhMjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0pTUFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci0KLS8qKgotICogQ29tcGxldGlvbiBwcm9jZXNzb3IgZm9yIEpTUCBUZW1wbGF0ZXMuIE1vc3Qgb2YgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lIGJ5Ci0gKiB0aGUgSlNQIENvbnRlbnQgQXNzaXN0IHByb2Nlc3Nvciwgc28gYnkgdGhlIHRpbWUgdGhlCi0gKiBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgaXMgYXNrZWQgZm9yIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FscywgdGhlCi0gKiBqc3AgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGhhcyBhbHJlYWR5IHNldCB0aGUgY29udGV4dCB0eXBlIGZvcgotICogdGVtcGxhdGVzLgotICovCi1jbGFzcyBKU1BUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByb3Bvc2FsQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCXJldHVybiAoKFRlbXBsYXRlUHJvcG9zYWwpIG8yKS5nZXRSZWxldmFuY2UoKSAtICgoVGVtcGxhdGVQcm9wb3NhbCkgbzEpLmdldFJlbGV2YW5jZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvciBmZ1Byb3Bvc2FsQ29tcGFyYXRvciA9IG5ldyBQcm9wb3NhbENvbXBhcmF0b3IoKTsKLQlwcml2YXRlIFN0cmluZyBmQ29udGV4dFR5cGVJZCA9IG51bGw7Ci0KLQkvKgotCSAqIENvcGllZCBmcm9tIHN1cGVyIGNsYXNzIGV4Y2VwdCBpbnN0ZWFkIG9mIGNhbGxpbmcgY3JlYXRlQ29udGV4dCh2aWV3ZXIsCi0JICogcmVnaW9uKSBjYWxsIGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCkgaW5zdGVhZAotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0KLQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSB2aWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQotCQkvLyBhZGp1c3Qgb2Zmc2V0IHRvIGVuZCBvZiBub3JtYWxpemVkIHNlbGVjdGlvbgotCQlpZiAoc2VsZWN0aW9uLmdldE9mZnNldCgpID09IG9mZnNldCkKLQkJCW9mZnNldCA9IHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQotCQlTdHJpbmcgcHJlZml4ID0gZXh0cmFjdFByZWZpeCh2aWV3ZXIsIG9mZnNldCk7Ci0JCVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKG9mZnNldCAtIHByZWZpeC5sZW5ndGgoKSwgcHJlZml4Lmxlbmd0aCgpKTsKLQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KHZpZXdlciwgcmVnaW9uLCBvZmZzZXQpOwotCQlpZiAoY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBJQ29tcGxldGlvblByb3Bvc2FsWzBdOwotCi0JCS8vIG5hbWUgb2YgdGhlIHNlbGVjdGlvbiB2YXJpYWJsZXMge2xpbmUsIHdvcmR9X3NlbGVjdGlvbgotCQljb250ZXh0LnNldFZhcmlhYmxlKCJzZWxlY3Rpb24iLCBzZWxlY3Rpb24uZ2V0VGV4dCgpKTsgLy8gLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlW10gdGVtcGxhdGVzID0gZ2V0VGVtcGxhdGVzKGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKTsKLQotCQlMaXN0IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLnZhbGlkYXRlKHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCQl9Ci0JCQljYXRjaCAoVGVtcGxhdGVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHRlbXBsYXRlLm1hdGNoZXMocHJlZml4LCBjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJbWF0Y2hlcy5hZGQoY3JlYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIChJUmVnaW9uKSByZWdpb24sIGdldFJlbGV2YW5jZSh0ZW1wbGF0ZSwgcHJlZml4KSkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLCBmZ1Byb3Bvc2FsQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG1hdGNoZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFttYXRjaGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25jcmV0ZSB0ZW1wbGF0ZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGluIHRoZQotCSAqIGRvY3VtZW50LiBUaGlzIGludm9sdmVzIGZpbmRpbmcgb3V0IHdoaWNoIGNvbnRleHQgdHlwZSBpcyB2YWxpZCBhdCB0aGUKLQkgKiBnaXZlbiBsb2NhdGlvbiwgYW5kIHRoZW4gY3JlYXRpbmcgYSBjb250ZXh0IG9mIHRoaXMgdHlwZS4gVGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+U21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0PC9jb2RlPiBmb3IKLQkgKiB0aGUgY29udGV4dCB0eXBlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhpcyB0YWtlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoCi0JICogY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZvciB3aGljaCB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKiBAcmV0dXJuIGEgdGVtcGxhdGUgY29udGV4dCB0aGF0IGNhbiBoYW5kbGUgdGVtcGxhdGUgaW5zZXJ0aW9uIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHByZXR0eSBtdWNoIHNhbWUgY29kZSBhcyBzdXBlci5jcmVhdGVDb250ZXh0IGV4Y2VwdCBjcmVhdGUKLQkJLy8gU21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBnZXRDb250ZXh0VHlwZSh2aWV3ZXIsIHJlZ2lvbik7Ci0JCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybiBuZXcgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBnZXRJbWFnZSh0ZW1wbGF0ZSksIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXR5cGUgPSByZWdpc3RyeS5nZXRDb250ZXh0VHlwZShmQ29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0JCS8vIGp1c3QgcmV0dXJuIHRoZSBzYW1lIGltYWdlIGZvciBub3cKLQkJcmV0dXJuIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0pTUCk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlW10gZ2V0VGVtcGxhdGVzKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlc1tdID0gbnVsbDsKLQotCQlUZW1wbGF0ZVN0b3JlIHN0b3JlID0gZ2V0VGVtcGxhdGVTdG9yZSgpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCkKLQkJCXRlbXBsYXRlcyA9IHN0b3JlLmdldFRlbXBsYXRlcyhjb250ZXh0VHlwZUlkKTsKLQotCQlyZXR1cm4gdGVtcGxhdGVzOwotCX0KLQotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKTsKLQl9Ci0KLQl2b2lkIHNldENvbnRleHRUeXBlKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7Ci0JCWZDb250ZXh0VHlwZUlkID0gY29udGV4dFR5cGVJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkYjI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BVc2VCZWFuQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEpTUER1bW15Q29udGVudEFzc2lzdFByb2Nlc3NvciB7Ci0KLQlwdWJsaWMgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0KLQkJLy8gRmluZCB0aGUgYXR0cmlidXRlIG5hbWUgZm9yIHdoaWNoIHRoaXMgcG9zaXRpb24gc2hvdWxkIGhhdmUgYSB2YWx1ZQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9wZW4gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvcGVuUmVnaW9ucyA9IG9wZW4uZ2V0UmVnaW9ucygpOwotCQlpbnQgaSA9IG9wZW5SZWdpb25zLmluZGV4T2YoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkpOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoaSA+PSAwKSB7Ci0JCQluYW1lUmVnaW9uID0gb3BlblJlZ2lvbnMuZ2V0KGktLSk7Ci0JCQlpZiAobmFtZVJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBudWxsOwotCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKQotCQkJYXR0cmlidXRlTmFtZSA9IG9wZW4uZ2V0VGV4dChuYW1lUmVnaW9uKTsKLQotCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJY3VycmVudFZhbHVlID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0VGV4dCgpOwotCQllbHNlCi0JCQljdXJyZW50VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBudWxsOwotCQkvLyBmaXh1cHMKLQkJaW50IHN0YXJ0ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCk7Ci0JCWludCBsZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQlpZiAoY3VycmVudFZhbHVlLmxlbmd0aCgpID4gU3RyaW5nVXRpbHMuc3RyaXAoY3VycmVudFZhbHVlKS5sZW5ndGgoKSAmJiAoY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgfHwgY3VycmVudFZhbHVlLnN0YXJ0c1dpdGgoIiciKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCSYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQltYXRjaFN0cmluZyA9IGN1cnJlbnRWYWx1ZS5zdWJzdHJpbmcoMSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSk7Ci0JCQlzdGFydCsrOwotCQkJbGVuZ3RoID0gbWF0Y2hTdHJpbmcubGVuZ3RoKCk7Ci0JCX0gZWxzZQotCQkJbWF0Y2hTdHJpbmcgPSBjdXJyZW50VmFsdWUuc3Vic3RyaW5nKDAsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkubGVuZ3RoKCkpOwotCQlib29sZWFuIGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpICE9IG51bGwgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLQkJaWYgKGV4aXN0aW5nQ29tcGxpY2F0ZWRWYWx1ZSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuY2xlYXIoKTsKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hY3JvcygpLmNsZWFyKCk7Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0NMQVNTKSkgewotCQkJCS8vIGNsYXNzIGlzIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBjbGFzcwotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gY2xhc3NQcm9wb3NhbHMgPSBKYXZhVHlwZUZpbmRlci5nZXRDbGFzc1Byb3Bvc2FscyhyZXNvdXJjZSwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJaWYgKGNsYXNzUHJvcG9zYWxzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBjbGFzc1Byb3Bvc2Fscy5sZW5ndGg7IGorKykgewotCQkJCQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIGNsYXNzUHJvcG9zYWxzW2pdOwotCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0UXVhbGlmaWVkTmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSB8fCBwcm9wb3NhbC5nZXRTaG9ydE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSkpIHsKLQkJCQkvLyB0eXBlIGlzIHRoZSBtb3JlIGdlbmVyYWwgdHlwZSBmb3IgdGhlIGJlYW4KLQkJCQkvLyB3aGljaCBtZWFucyBpdCBtYXkgYmUgYW4gaW50ZXJmYWNlCi0JCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSB0eXBlUHJvcG9zYWxzID0gSmF2YVR5cGVGaW5kZXIuZ2V0VHlwZVByb3Bvc2FscyhyZXNvdXJjZSwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJaWYgKHR5cGVQcm9wb3NhbHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHR5cGVQcm9wb3NhbHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJCUphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gKEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSB0eXBlUHJvcG9zYWxzW2pdOwotCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0UXVhbGlmaWVkTmFtZSgpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSB8fCBwcm9wb3NhbC5nZXRTaG9ydE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkpCi0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfQkVBTl9OQU1FKSkgewotCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IGdldFJlc291cmNlKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYmVhbk5hbWVQcm9wb3NhbHMgPSBKYXZhVHlwZUZpbmRlci5nZXRCZWFuUHJvcG9zYWxzKHJlc291cmNlLCBzdGFydCwgbGVuZ3RoKTsKLQkJCQlpZiAoYmVhbk5hbWVQcm9wb3NhbHMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGJlYW5OYW1lUHJvcG9zYWxzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZiAoYmVhbk5hbWVQcm9wb3NhbHNbal0gaW5zdGFuY2VvZiBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwpIHsKLQkJCQkJCQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IChKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbCkgYmVhbk5hbWVQcm9wb3NhbHNbal07Ci0JCQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID09IDAgfHwgcHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZy50b0xvd2VyQ2FzZSgpKSkKLQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfSBlbHNlIGlmIChiZWFuTmFtZVByb3Bvc2Fsc1tqXSBpbnN0YW5jZW9mIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkJCQkJSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSAoSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwpIGJlYW5OYW1lUHJvcG9zYWxzW2pdOwotCQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHByb3Bvc2FsLmdldFF1YWxpZmllZE5hbWUoKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobWF0Y2hTdHJpbmcudG9Mb3dlckNhc2UoKSkgfHwgcHJvcG9zYWwuZ2V0U2hvcnROYW1lKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKG1hdGNoU3RyaW5nLnRvTG93ZXJDYXNlKCkpKQotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHByb2plY3QgcmVxdWVzdCBpcyBpbgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVJlc291cmNlIGdldFJlc291cmNlKENvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIGJhc2Vsb2NhdGlvbiA9IG51bGw7Ci0KLQkJaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSByZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSByZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJYmFzZWxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9IGZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChiYXNlbG9jYXRpb24gIT0gbnVsbCkgewotCQkJLy8gY29waWVkIGZyb20gSlNQVHJhbnNsYXRpb25BZGFwdGVyI2dldEphdmFQcm9qZWN0Ci0JCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlQYXRoIGZpbGVQYXRoID0gbmV3IFBhdGgoYmFzZWxvY2F0aW9uKTsKLQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCQlpZiAoZmlsZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJZmlsZSA9IHJvb3QuZ2V0RmlsZShmaWxlUGF0aCk7Ci0JCQl9Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmVzb3VyY2UgPSBmaWxlLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFQYXJhbWV0ZXJMaXN0VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjFmNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVBhcmFtZXRlckxpc3RWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotCi0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhUGFyYW1ldGVyTGlzdFZhbGlkYXRvciBpbXBsZW1lbnRzIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IsIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIgewotICAgIAotICAgIHByaXZhdGUgaW50IGZQb3NpdGlvbjsKLSAgICBwcml2YXRlIElUZXh0Vmlld2VyIGZWaWV3ZXI7Ci0gICAgcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uIGZJbmZvcm1hdGlvbjsKLSAgICAKLSAgICBwcml2YXRlIGludCBmQ3VycmVudFBhcmFtZXRlcjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uLCBJVGV4dFZpZXdlciwgaW50KQotICAgICAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciNpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24sIElUZXh0Vmlld2VyLCBpbnQpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uIGluZm8sIElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLSAgICAgICAgZlBvc2l0aW9uPSBkb2N1bWVudFBvc2l0aW9uOwotICAgICAgICBmVmlld2VyPSB2aWV3ZXI7Ci0gICAgICAgIGZJbmZvcm1hdGlvbj0gaW5mbzsKLSAgICAgICAgCi0gICAgICAgIGZDdXJyZW50UGFyYW1ldGVyPSAtMTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q29tbWVudEVuZChJRG9jdW1lbnQgZCwgaW50IHBvcywgaW50IGVuZCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKHBvcyA8IGVuZCkgewotICAgICAgICAgICAgY2hhciBjdXJyPSBkLmdldENoYXIocG9zKTsKLSAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgaWYgKGN1cnIgPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvcyA8IGVuZCAmJiBkLmdldENoYXIocG9zKSA9PSAnLycpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvcyArIDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBlbmQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0U3RyaW5nRW5kKElEb2N1bWVudCBkLCBpbnQgcG9zLCBpbnQgZW5kLCBjaGFyIGNoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotICAgICAgICB3aGlsZSAocG9zIDwgZW5kKSB7Ci0gICAgICAgICAgICBjaGFyIGN1cnI9IGQuZ2V0Q2hhcihwb3MpOwotICAgICAgICAgICAgcG9zKys7Ci0gICAgICAgICAgICBpZiAoY3VyciA9PSAnXFwnKSB7Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIGVzY2FwZWQgY2hhcmFjdGVycwotICAgICAgICAgICAgICAgIHBvcysrOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJyID09IGNoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBvczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW5kOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBnZXRDaGFyQ291bnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgc3RhcnQsIGludCBlbmQsIGNoYXIgaW5jcmVtZW50LCBjaGFyIGRlY3JlbWVudCwgYm9vbGVhbiBjb25zaWRlck5lc3RpbmcpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICAgIAotICAgICAgICBBc3NlcnQuaXNUcnVlKChpbmNyZW1lbnQgIT0gMCB8fCBkZWNyZW1lbnQgIT0gMCkgJiYgaW5jcmVtZW50ICE9IGRlY3JlbWVudCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgbmVzdGluZ0xldmVsPSAwOwotICAgICAgICBpbnQgY2hhckNvdW50PSAwOwotICAgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgIGNoYXIgY3Vycj0gZG9jdW1lbnQuZ2V0Q2hhcihzdGFydCsrKTsKLSAgICAgICAgICAgIHN3aXRjaCAoY3VycikgewotICAgICAgICAgICAgICAgIGNhc2UgJy8nOgotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbmV4dD0gZG9jdW1lbnQuZ2V0Q2hhcihzdGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGNvbW1lbnQgc3RhcnRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IGVuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0PSBnZXRDb21tZW50RW5kKGRvY3VtZW50LCBzdGFydCArIDEsIGVuZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQgPT0gJy8nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJy8vJy1jb21tZW50OiBub3RoaW5nIHRvIGRvIGFueW1vcmUgb24gdGhpcyBsaW5lIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0PSBlbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAnKic6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGFydCA8IGVuZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0PSBkb2N1bWVudC5nZXRDaGFyKHN0YXJ0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICcvJykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgYmVlbiBpbiBhIGNvbW1lbnQ6IGZvcmdldCB3aGF0IHdlIHJlYWQgYmVmb3JlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhckNvdW50PSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrIHN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgICAgICAgc3RhcnQ9IGdldFN0cmluZ0VuZChkb2N1bWVudCwgc3RhcnQsIGVuZCwgY3Vycik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBpZiAoY29uc2lkZXJOZXN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgnKCcgPT0gY3VycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyBuZXN0aW5nTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgnKScgPT0gY3VycikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLSBuZXN0aW5nTGV2ZWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVzdGluZ0xldmVsICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmNyZW1lbnQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnIgPT0gaW5jcmVtZW50KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrIGNoYXJDb3VudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlY3JlbWVudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VyciA9PSBkZWNyZW1lbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gY2hhckNvdW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHJldHVybiBjaGFyQ291bnQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBzZWUgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCBwb3NpdGlvbikgeyAgICAgICAgCi0gICAgICAgIAotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgZlBvc2l0aW9uKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIElEb2N1bWVudCBkb2N1bWVudD0gZlZpZXdlci5nZXREb2N1bWVudCgpOwotICAgICAgICAgICAgSVJlZ2lvbiBsaW5lPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChmUG9zaXRpb24pOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAocG9zaXRpb24gPCBsaW5lLmdldE9mZnNldCgpIHx8IHBvc2l0aW9uID49IGRvY3VtZW50LmdldExlbmd0aCgpKQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiAoZ2V0Q2hhckNvdW50KGRvY3VtZW50LCBmUG9zaXRpb24sIHBvc2l0aW9uLCAnKCcsICcpJywgZmFsc2UpID49IDApOwotICAgICAgICAgICAgCi0gICAgICAgIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBAc2VlIElDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIjdXBkYXRlUHJlc2VudGF0aW9uKGludCwgVGV4dFByZXNlbnRhdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGVQcmVzZW50YXRpb24oaW50IHBvc2l0aW9uLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotICAgICAgICAKLSAgICAgICAgaW50IGN1cnJlbnRQYXJhbWV0ZXI9IC0xOwotICAgICAgICAKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGN1cnJlbnRQYXJhbWV0ZXI9IGdldENoYXJDb3VudChmVmlld2VyLmdldERvY3VtZW50KCksIGZQb3NpdGlvbiwgcG9zaXRpb24sICcsJywgKGNoYXIpIDAsIHRydWUpOwotICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChmQ3VycmVudFBhcmFtZXRlciAhPSAtMSkgewotICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJhbWV0ZXIgPT0gZkN1cnJlbnRQYXJhbWV0ZXIpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBwcmVzZW50YXRpb24uY2xlYXIoKTsKLSAgICAgICAgZkN1cnJlbnRQYXJhbWV0ZXI9IGN1cnJlbnRQYXJhbWV0ZXI7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgcz0gZkluZm9ybWF0aW9uLmdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpOwotICAgICAgICBpbnQgc3RhcnQ9IDA7Ci0gICAgICAgIGludCBvY2N1cnJlbmNlcz0gMDsKLSAgICAgICAgd2hpbGUgKG9jY3VycmVuY2VzIDwgZkN1cnJlbnRQYXJhbWV0ZXIpIHsKLSAgICAgICAgICAgIGludCBmb3VuZD0gcy5pbmRleE9mKCcsJywgc3RhcnQpOwotICAgICAgICAgICAgaWYgKGZvdW5kID09IC0xKQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgc3RhcnQ9IGZvdW5kICsgMTsKLSAgICAgICAgICAgICsrIG9jY3VycmVuY2VzOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAob2NjdXJyZW5jZXMgPCBmQ3VycmVudFBhcmFtZXRlcikgewotICAgICAgICAgICAgcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2UobmV3IFN0eWxlUmFuZ2UoMCwgcy5sZW5ndGgoKSwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCkpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmIChzdGFydCA9PSAtMSkKLSAgICAgICAgICAgIHN0YXJ0PSAwOwotICAgICAgICAKLSAgICAgICAgaW50IGVuZD0gcy5pbmRleE9mKCcsJywgc3RhcnQpOwotICAgICAgICBpZiAoZW5kID09IC0xKQotICAgICAgICAgICAgZW5kPSBzLmxlbmd0aCgpOwotICAgICAgICAgICAgCi0gICAgICAgIGlmIChzdGFydCA+IDApICAKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKDAsIHN0YXJ0LCBudWxsLCBudWxsLCBTV1QuTk9STUFMKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZW5kID4gc3RhcnQpCi0gICAgICAgICAgICBwcmVzZW50YXRpb24uYWRkU3R5bGVSYW5nZShuZXcgU3R5bGVSYW5nZShzdGFydCwgZW5kIC0gc3RhcnQsIG51bGwsIG51bGwsIFNXVC5CT0xEKSk7Ci0gICAgICAgIAotICAgICAgICBpZiAoZW5kIDwgcy5sZW5ndGgoKSkKLSAgICAgICAgICAgIHByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKGVuZCwgcy5sZW5ndGgoKSAtIGVuZCwgbnVsbCwgbnVsbCwgU1dULk5PUk1BTCkpOwotICAgICAgICAgICAgCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiNGRlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgSUNvbXBsZXRpb25Qcm9wb3NhbCB3aG9zZSB2YWx1ZXMgY2FuIGJlCi0gKiByZWFkIGFmdGVyIGNyZWF0aW9uLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIGV4dGVuZHMgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0KLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCXByaXZhdGUgU3RyaW5nIGZMb2NhbERpc3BsYXlTdHJpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgZlNob3J0TmFtZTsKLQlwcml2YXRlIFN0cmluZyBmUXVhbGlmaWVkTmFtZTsKLQlwcml2YXRlIFN0cmluZyBmQ29udGFpbmVyTmFtZTsKLQotCXB1YmxpYyBKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgSW1hZ2UgaW1hZ2UsIFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGNvbnRhaW5lck5hbWUsICBpbnQgcmVsZXZlbmNlLCAgYm9vbGVhbiB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpIHsKLQkJc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgcXVhbGlmaWVkTmFtZS5sZW5ndGgoKSArIDIsIGltYWdlLCAKLSAgICAgICAgICAgICAgICAoY29udGFpbmVyTmFtZSAhPSBudWxsICYmIGNvbnRhaW5lck5hbWUubGVuZ3RoKCkgPiAwKSA/IHR5cGVOYW1lICsgIiAtICIgKyBjb250YWluZXJOYW1lIDogdHlwZU5hbWUsIG51bGwsIG51bGwsIHJlbGV2ZW5jZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQ01WQyAyNDM4MTcsIHN1cGVyY2xhc3Mgd2FzIGNvbXBhcmluZyBpbmNvcnJlY3QgZGlzcGxheSBzdHJpbmcgaW4gdmFsaWRhdGUgbWV0aG9kLi4uCi0JCS8vc3VwZXIocmVwbGFjZW1lbnRTdHJpbmcsIHJlcGxhY2VtZW50T2Zmc2V0LCByZXBsYWNlbWVudExlbmd0aCwgaW1hZ2UsIChjb250YWluZXJOYW1lICE9IG51bGwgJiYgY29udGFpbmVyTmFtZS5sZW5ndGgoKSA+IDApPyB0eXBlTmFtZSArICIgLSAiICsgY29udGFpbmVyTmFtZTp0eXBlTmFtZS8qcXVhbGlmaWVkTmFtZSovLCByZWxldmVuY2UpOwotCQlmU2hvcnROYW1lID0gdHlwZU5hbWU7Ci0JCWZRdWFsaWZpZWROYW1lID0gcXVhbGlmaWVkTmFtZTsKLQkJZkNvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lOwotCQlmQ3Vyc29yUG9zaXRpb24gPSBmUXVhbGlmaWVkTmFtZS5sZW5ndGgoKSArIDI7Ci0JCS8vZlByb3Bvc2FsSW5mbyA9IHByb3Bvc2FsSW5mbzsKLQkJaWYgKGNvbnRhaW5lck5hbWUgIT0gbnVsbCAmJiBjb250YWluZXJOYW1lLmxlbmd0aCgpID4gMCkKLQkJCWZMb2NhbERpc3BsYXlTdHJpbmcgPSB0eXBlTmFtZSArICIgLSAiICsgY29udGFpbmVyTmFtZTsgLy8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlmTG9jYWxEaXNwbGF5U3RyaW5nID0gdHlwZU5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gZkxvY2FsRGlzcGxheVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEN1cnNvclBvc2l0aW9uKCkgewotCQlyZXR1cm4gZkN1cnNvclBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEN1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbikgewotCQlzdXBlci5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3NpdGlvbik7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UXVhbGlmaWVkTmFtZSgpIHsKLQkJcmV0dXJuIGZRdWFsaWZpZWROYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJLy8JCVN0cmluZyBpbmZvID0gc3VwZXIuZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpOwotCQkvLwkJaWYgKGluZm8gPT0gbnVsbCB8fCBpbmZvLmxlbmd0aCgpID09IDAgJiYgZlByb3Bvc2FsSW5mbyAhPSBudWxsKQotCQkvLwkJCXJldHVybiBmUHJvcG9zYWxJbmZvLmdldEluZm8oKTsKLQkJLy8JCXJldHVybiBpbmZvOwotCQlyZXR1cm4gbnVsbDsgLy8gdW5leHBsYWluZWQgTlBFCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTaG9ydE5hbWUoKSB7Ci0JCXJldHVybiBmU2hvcnROYW1lOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0SW1wb3J0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCVN0cmluZyBpbXBvcnRTcGVjID0gbnVsbDsKLQkJYm9vbGVhbiBpc0ltcG9ydCA9IGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKGZsYXROb2RlLmdldFRleHQocmVnaW9uKS5lcXVhbHMoSlNQMTFOYW1lc3BhY2UuQVRUUl9OQU1FX0lNUE9SVCkpIHsKLQkJCQkJaXNJbXBvcnQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXNJbXBvcnQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpc0ltcG9ydCAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpbXBvcnRTcGVjID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbXBvcnRTcGVjOwotCX0KLQotCS8qKgotCSAqIEFkZCBhbiBpbXBvcnQgcGFnZSBkaXJlY3RpdmUgZm9yIHRoZSBjdXJyZW50IHR5cGUgbmFtZQotCSAqLwotCXByb3RlY3RlZCBpbnQgYXBwbHlJbXBvcnQoSVN0cnVjdHVyZWREb2N1bWVudCBtb2RlbCkgewotCQkvLyBpZiB0aGUgdHlwZSBpcyBpbiB0aGUgZGVmYXVsdCBwYWNrYWdlIG9yIGphdmEubGFuZywgc2tpcCBpdAotCQlpZiAoZkNvbnRhaW5lck5hbWUgPT0gbnVsbCB8fCBmQ29udGFpbmVyTmFtZS5sZW5ndGgoKSA9PSAwIHx8IGZDb250YWluZXJOYW1lLmVxdWFscygiamF2YS5sYW5nIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiAwOwotCQkvLyBjb2xsZWN0IHBhZ2UgZGlyZWN0aXZlcyBhbmQgc3RvcmUgdGhlaXIgaW1wb3J0IHZhbHVlcwotCQlMaXN0IGltcG9ydHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IG1vZGVsLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJLy8gdXNlIHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEgcGFnZSBkaXJlY3RpdmUgYXMgYSBoaW50IGFzIHRvIHdoZXJlIHRvIGFkZAotCQkvLyBhIG5ldyBvbmUKLQkJaW50IGhpbnQgPSAwOwotCQkvLyB3YXRjaCBmb3IganNwOnJvb3Qgc28gdGhhdCB3ZSB1c2UgdGhlIHJpZ2h0IFhNTC9KU1AgZm9ybWF0IGZvciB0aGUgZGlyZWN0aXZlCi0JCWJvb2xlYW4gdXNlWE1MID0gZmFsc2U7Ci0KLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJLy8gQ2FuJ3QganVzdCBsb29rIGZvciBhbGwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBzdGFydGluZyB3aXRoIEpTUF9ESVJFQ1RJVkVfT1BFTgotCQkJLy8gc2luY2UgdGhlIFhNTCBmb3JtIGlzIHJlcXVpcmVkLCB0b28KLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAocmVnaW9ucy5zaXplKCkgPiAxKSB7Ci0JCQkJSVRleHRSZWdpb24gbmFtZSA9IHJlZ2lvbnMuZ2V0KDEpOwotCQkJCS8vIHZlcmlmeSB0aGF0IHRoaXMgaXMgYSBKU1AgZGlyZWN0aXZlCi0JCQkJaWYgKG5hbWUuZ2V0VHlwZSgpID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJCQkvLyB2ZXJpZnkgdGhhdCB0aGlzIGlzIGEgKnBhZ2UqIGRpcmVjdGl2ZQotCQkJCQlpZiAobm9kZS5nZXRUZXh0KG5hbWUpLmVxdWFscyhKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfUEFHRSkgfHwgbm9kZS5nZXRUZXh0KG5hbWUpLmVxdWFscyhKU1AxMk5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVJFQ1RJVkVfUEFHRSkpIHsKLQkJCQkJCWlmIChub2RlLmdldEVuZE9mZnNldCgpIDwgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSkKLQkJCQkJCQloaW50ID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCVN0cmluZyBpbXBvcnRTcGVjID0gZ2V0SW1wb3J0KG5vZGUpOwotCQkJCQkJaWYgKGltcG9ydFNwZWMgIT0gbnVsbCkgewotCQkJCQkJCWltcG9ydHMuYWRkKGltcG9ydFNwZWMpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBpZiB0aGlzIGlzIGEganNwOnJvb3QgdGFnLCB1c2UgdGhlIFhNTCBmb3JtCi0JCQkJCXVzZVhNTCA9IHVzZVhNTCB8fCBuYW1lLmdldFR5cGUoKSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfUk9PVF9UQUdfTkFNRTsKLQkJCQl9Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCX0KLQotCQkvLyBldmFsdWF0ZSByZXF1aXJlbWVudHMgZm9yIGEgIm5ldyIgaW1wb3J0IGRpcmVjdGl2ZQotCQlib29sZWFuIG5lZWRzSW1wb3J0ID0gIWltcG9ydEhhbmRsZXMoZlF1YWxpZmllZE5hbWUsIGltcG9ydHMpOwotCQlpbnQgYWRqdXN0bWVudExlbmd0aCA9IDA7Ci0JCS8vIGluc2VydCAibmV3IiBpbXBvcnQgZGlyZWN0aXZlCi0JCWlmIChuZWVkc0ltcG9ydCkgewotCQkJU3RyaW5nIGRpcmVjdGl2ZSA9IG51bGw7Ci0KLQkJCS8vIHZhcnkgdGhlIFhNTCBiZWhhdmlvcgotCQkJaWYgKHVzZVhNTCkgewotCQkJCWRpcmVjdGl2ZSA9ICI8anNwOmRpcmVjdGl2ZS5wYWdlIGltcG9ydD1cIiIgKyBmUXVhbGlmaWVkTmFtZSArICJcIi8+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlkaXJlY3RpdmUgPSAiPCVAIHBhZ2UgaW1wb3J0PVwiIiArIGZRdWFsaWZpZWROYW1lICsgIlwiICU+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lID0gbW9kZWwuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoaGludCk7Ci0JCQkJYm9vbGVhbiBwcmVwZW5kTmV3TGluZSA9IGxpbmUuZ2V0T2Zmc2V0KCkgKyBsaW5lLmdldExlbmd0aCgpID09IGhpbnQ7Ci0JCQkJYm9vbGVhbiBhcHBlbmROZXdMaW5lID0gaGludCA9PSAwOwotCQkJCWlmIChwcmVwZW5kTmV3TGluZSkKLQkJCQkJZGlyZWN0aXZlID0gbW9kZWwuZ2V0TGluZURlbGltaXRlcigpICsgZGlyZWN0aXZlOwotCQkJCWlmIChhcHBlbmROZXdMaW5lKQotCQkJCQlkaXJlY3RpdmUgPSBkaXJlY3RpdmUgKyBtb2RlbC5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQkJYWRqdXN0bWVudExlbmd0aCA9IGRpcmVjdGl2ZS5sZW5ndGgoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJbW9kZWwucmVwbGFjZShoaW50LCAwLCBkaXJlY3RpdmUpOwotCi0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIE5vdCB0aGF0IHdlIHNob3VsZCBldmVyIGdldCBhIEJMRSwgYnV0IGlmIHNvLCBvdXIKLQkJCQkvLyByZXBsYWNlbWVudCBvZmZzZXQgZnJvbSB0aGUgQ29udGVudCBBc3Npc3QgY2FsbCBzaG91bGQKLQkJCQkvLyB3b3JrCi0JCQkJdHJ5IHsKLQkJCQkJbW9kZWwucmVwbGFjZShnZXRSZXBsYWNlbWVudE9mZnNldCgpLCAwLCBkaXJlY3RpdmUpOwotCQkJCQlhZGp1c3RtZW50TGVuZ3RoID0gZGlyZWN0aXZlLmxlbmd0aCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZTIpIHsKLQkJCQkJLy8gbm93IHdoYXQ/Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGp1c3RtZW50TGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIFNlZSBpZiB0aGUgaW1wb3J0IHNwZWNpZmljYXRpb24gaXMgYSB3aWxkY2FyZCBpbXBvcnQsIGFuZCBpZiBzbywgdGhhdAotCSAqIGl0IGFwcGxpZXMgdG8gdGhlIGdpdmVuIHR5cGUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXaWxkY2FyZE1hdGNoKFN0cmluZyBpbXBvcnRTcGVjLCBTdHJpbmcgdHlwZSkgewotCQlpbnQgc3BlY0xlbmd0aCA9IGltcG9ydFNwZWMubGVuZ3RoKCk7Ci0JCWlmIChpbXBvcnRTcGVjLmVuZHNXaXRoKCIqIikgJiYgc3BlY0xlbmd0aCA+IDIgJiYgdHlwZS5sZW5ndGgoKSA+PSBzcGVjTGVuZ3RoKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHB1bGwgb3V0IHRoZSBwYWNrYWdlIG5hbWUgaW5jbHVkaW5nIHRoZSBmaW5hbCAnLicKLQkJCVN0cmluZyBjb250YWluZXIgPSBpbXBvcnRTcGVjLnN1YnN0cmluZygwLCBzcGVjTGVuZ3RoIC0gMSk7Ci0JCQkvLyB2ZXJpZnkgdGhhdCB0aGUgdHlwZSBpcyBpbiB0aGUgY29udGFpbmVyJ3MgaGllcmFyY2h5IGFuZCB0aGF0Ci0JCQkvLyB0aGVyZSBhcmUgbm8gb3RoZXIgcGFja2FnZSBzZXBhcmF0b3JzIGFmdGVyd2FyZHMKLQkJCWlmICh0eXBlLnN0YXJ0c1dpdGgoY29udGFpbmVyKSAmJiB0eXBlLmluZGV4T2YoJy4nLCBzcGVjTGVuZ3RoIC0gMSkgPCAwKSB7Ci0JCQkJLy8gY29udGFpbmVyIG1hdGNoZXMKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW1wb3J0SGFuZGxlcyhTdHJpbmcgdHlwZSwgTGlzdCBsaXN0T2ZJbXBvcnRzKSB7Ci0JCUl0ZXJhdG9yIGltcG9ydHMgPSBsaXN0T2ZJbXBvcnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpbXBvcnRzLmhhc05leHQoKSkgewotCQkJU3RyaW5nIGltcG9ydFNwZWMgPSBTdHJpbmdVdGlscy5zdHJpcChpbXBvcnRzLm5leHQoKS50b1N0cmluZygpKTsKLQkJCWlmIChpbXBvcnRTcGVjLmVxdWFscyh0eXBlKSB8fCBpc1dpbGRjYXJkTWF0Y2goaW1wb3J0U3BlYywgdHlwZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCwgY2hhciB0cmlnZ2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIElmIHdlIGhhdmUgYSBwYXJzZWQgSVN0cnVjdHVyZWREb2N1bWVudCwgaW5zZXJ0IHRoZSBzaG9ydCBuYW1lIGluc3RlYWQgb2YgdGhlCi0JCS8vIGZ1bGx5IHF1YWxpZmllZCBuYW1lIGFuZCBhIGltcG9ydCBwYWdlIGRpcmVjdGl2ZSBpZgotCQkvLyBuZWVkZWQuICBEbyB0aGUgaW1wb3J0IGZpcnN0IHNvIHRoZSBjdXJzb3IgZ29lcyB0byB0aGUgcmlnaHQgbG9jYXRpb24KLQkJLy8gYW5kIHdlIGRvbid0IHN1cnByaXNlIHRoZSB1c2VyLgotCi0JCWJvb2xlYW4gYWRkU2hvcnRGb3JtID0gZmFsc2U7IC8vZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50ICYmIGZDb250YWluZXJOYW1lICE9IG51bGwgJiYgZkNvbnRhaW5lck5hbWUubGVuZ3RoKCkgPiAwOwotCQlpZiAoYWRkU2hvcnRGb3JtKSB7Ci0JCQlzZXRSZXBsYWNlbWVudFN0cmluZygnIicgKyBmU2hvcnROYW1lICsgJyInKTsKLQkJCWludCBpbXBvcnRMZW5ndGggPSBhcHBseUltcG9ydCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpOwotCQkJc2V0UmVwbGFjZW1lbnRPZmZzZXQoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSArIGltcG9ydExlbmd0aCk7Ci0JCX0KLQotCQlzZXRDdXJzb3JQb3NpdGlvbihnZXRSZXBsYWNlbWVudFN0cmluZygpLmxlbmd0aCgpKTsKLQkJc3VwZXIuYXBwbHkoZG9jdW1lbnQsIHRyaWdnZXIsIG9mZnNldCk7Ci0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24xI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIENNVkMgMjQzODE1Ci0JCS8vIChwYSkgdGhpcyBpcyBvdmVycmlkZGVuIHRvIGdldCBhcm91bmQgcmVwbGFjZW1lbnQgbGVuZ3RoIG1vZGlmaWNhdGlvbgotCQkvLyB3aGljaCBpcyBkb25lIGluIHRoZSBzdXBlciAoc2luY2UgZWNsaXBzZSAyLjEpCi0JCWFwcGx5KHZpZXdlci5nZXREb2N1bWVudCgpLCB0cmlnZ2VyLCBvZmZzZXQpOwotCX0KLQotCS8vIGNvZGUgaXMgYm9ycm93ZWQgZnJvbSBKYXZhQ29tcGxldGlvblByb3Bvc2FsCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3RhcnRzV2l0aChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIFN0cmluZyB3b3JkKSB7Ci0JCWludCB3b3JkTGVuZ3RoID0gd29yZCA9PSBudWxsID8gMCA6IHdvcmQubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBnZXRSZXBsYWNlbWVudE9mZnNldCgpICsgd29yZExlbmd0aCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQl0cnkgewotCQkJaW50IGxlbmd0aCA9IG9mZnNldCAtIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0JCQkvLyBDTVZDIDI0MzgxNwotCQkJLy8gc2xpZ2h0bHkgbW9kaWZpZWQgdG8gYmUgYSBsaXR0bGUgbW9yZSBmbGV4aWJsZSBmb3IgYXR0cmlidXRlIHZhbHVlIHN0cmluZyBtYXRjaGluZy4uCi0JCQlTdHJpbmcgc3RhcnQgPSBTdHJpbmdVdGlscy5zdHJpcFF1b3Rlcyhkb2N1bWVudC5nZXQoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgbGVuZ3RoKSk7Ci0JCQlyZXR1cm4gd29yZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoc3RhcnQudG9Mb3dlckNhc2UoKSkgfHwgZlF1YWxpZmllZE5hbWUudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKHN0YXJ0LnRvTG93ZXJDYXNlKCkpOwotCQkJLy9yZXR1cm4gd29yZC5zdWJzdHJpbmcoMCwgbGVuZ3RoKS5lcXVhbHNJZ25vcmVDYXNlKHN0YXJ0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJLy8gaWdub3JlCi0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQ29tcGxldGlvblByb3Bvc2FsI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LCBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgLy8JICovCi0JLy8JcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkvLwkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlKGRvY3VtZW50LCBvZmZzZXQsIGV2ZW50KTsKLQkvLwl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuamF2YS5KYXZhQ29tcGxldGlvblByb3Bvc2FsI3NlbGVjdGVkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JCS8vIChwYSkgd2UgY3VycmVudGx5IGRvbid0IHVzZSBzbWFydCB0b2dnbGUuLi4KLQkJc3VwZXIuc2VsZWN0ZWQodmlld2VyLCBmYWxzZSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0phdmFUeXBlRmluZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMTIwZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklKYXZhUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhQ29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guSUphdmFTZWFyY2hDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLklKYXZhU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaEVuZ2luZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb25zdGFudHM7Ci0KLS8qKgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhVHlwZUZpbmRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRCZWFuUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gdHlwZVByb3Bvc2FscyA9IGdldFR5cGVQcm9wb3NhbHMocmVzb3VyY2UsIHJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHNlcmlhbFByb3Bvc2FscyA9IGdldFNlcmlhbGl6ZWRQcm9wb3NhbHMocmVzb3VyY2UsIHJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGJlYW5Qcm9wb3NhbHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFt0eXBlUHJvcG9zYWxzLmxlbmd0aCArIHNlcmlhbFByb3Bvc2Fscy5sZW5ndGhdOwotCi0JCWludCBpOwotCQlmb3IgKGkgPSAwOyBpIDwgc2VyaWFsUHJvcG9zYWxzLmxlbmd0aDsgaSsrKSB7Ci0JCQliZWFuUHJvcG9zYWxzW2ldID0gc2VyaWFsUHJvcG9zYWxzW2ldOwotCQl9Ci0JCWZvciAoaSA9IHNlcmlhbFByb3Bvc2Fscy5sZW5ndGg7IGkgPCBzZXJpYWxQcm9wb3NhbHMubGVuZ3RoICsgdHlwZVByb3Bvc2Fscy5sZW5ndGg7IGkrKykgewotCQkJYmVhblByb3Bvc2Fsc1tpXSA9IHR5cGVQcm9wb3NhbHNbaSAtIHNlcmlhbFByb3Bvc2Fscy5sZW5ndGhdOwotCQl9Ci0JCXJldHVybiBiZWFuUHJvcG9zYWxzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZ2V0TWVtYmVycyhJQ29udGFpbmVyIGNvbnRhaW5lciwgTGlzdCBtZW1iZXJzTGlzdCkgewotCQl0cnkgewotCQkJSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKHRydWUpOwotCQkJaWYgKG1lbWJlcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobWVtYmVyc1tpXS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQkJCQltZW1iZXJzTGlzdC5hZGQobWVtYmVyc1tpXSk7Ci0JCQkJCWVsc2UgaWYgKG1lbWJlcnNbaV0uZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GT0xERVIpCi0JCQkJCQlnZXRNZW1iZXJzKChJQ29udGFpbmVyKSBtZW1iZXJzW2ldLCBtZW1iZXJzTGlzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRTZXJpYWxpemVkUHJvcG9zYWxzKElSZXNvdXJjZSByZXNvdXJjZSwgaW50IHJlcGxhY2VtZW50U3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlMaXN0IG5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZ2V0TWVtYmVycyhyZXNvdXJjZS5nZXRQcm9qZWN0KCksIHJlc291cmNlcyk7Ci0JCUlSZXNvdXJjZSBtZW1iZXJSZXNvdXJjZSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQltZW1iZXJSZXNvdXJjZSA9IChJUmVzb3VyY2UpIHJlc291cmNlcy5nZXQoaSk7Ci0JCQlpZiAobWVtYmVyUmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIG1lbWJlclJlc291cmNlLmdldE5hbWUoKS5lbmRzV2l0aCgiLnNlciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGF0aCA9IFVSSUhlbHBlci5ub3JtYWxpemUobWVtYmVyUmVzb3VyY2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCByZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIHJlc291cmNlLmdldFByb2plY3QoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCkpOwotCQkJCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCQkJbmFtZXMuYWRkKG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIHBhdGggKyAiXCIiLCAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJcmVwbGFjZW1lbnRTdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIHBhdGgubGVuZ3RoKCkgKyAyLCBudWxsLCBwYXRoLCBudWxsLCBudWxsLCBJUmVsZXZhbmNlQ29uc3RhbnRzLlJfTk9ORSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbmFtZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtuYW1lcy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEBwYXJhbSByZXBsYWNlbWVudFN0YXJ0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50TGVuZ3RoCi0JICogQHBhcmFtIHNlYXJjaEZvciBJSmF2YVNlYXJjaENvbnN0YW50cy5UWVBFLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZmluZFByb3Bvc2FscyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXBsYWNlbWVudFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIGludCBzZWFyY2hGb3IsIGJvb2xlYW4gaWdub3JlQWJzdHJhY3RDbGFzc2VzKSB7Ci0KLQkJSmF2YVR5cGVOYW1lUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKYXZhVHlwZU5hbWVSZXF1ZXN0b3IoKTsKLQkJcmVxdWVzdG9yLnNldEpTUE9mZnNldChyZXBsYWNlbWVudFN0YXJ0KTsKLQkJcmVxdWVzdG9yLnNldFJlcGxhY2VtZW50TGVuZ3RoKHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJcmVxdWVzdG9yLnNldElnbm9yZUFic3RyYWN0Q2xhc3NlcyhpZ25vcmVBYnN0cmFjdENsYXNzZXMpOwotCi0JCXRyeSB7Ci0JCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IG5ldyBJSmF2YUVsZW1lbnRbXXtnZXRKYXZhUHJvamVjdChyZXNvdXJjZSl9OwotCQkJSUphdmFTZWFyY2hTY29wZSBzY29wZSA9IFNlYXJjaEVuZ2luZS5jcmVhdGVKYXZhU2VhcmNoU2NvcGUoZWxlbWVudHMpOwotCQkJbmV3IFNlYXJjaEVuZ2luZSgpLnNlYXJjaEFsbFR5cGVOYW1lcyhudWxsLCBudWxsLCBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCB8IFNlYXJjaFBhdHRlcm4uUl9QUkVGSVhfTUFUQ0gsIHNlYXJjaEZvciwgc2NvcGUsIHJlcXVlc3RvciwgSUphdmFTZWFyY2hDb25zdGFudHMuV0FJVF9VTlRJTF9SRUFEWV9UT19TRUFSQ0gsIG51bGwpOwotCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Yyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGMpIHsgCi0JCQkvLyBKYXZhTW9kZWwKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjKTsKLQkJfQotCQlyZXR1cm4gcmVxdWVzdG9yLmdldFByb3Bvc2FscygpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFR5cGVQcm9wb3NhbHMoSVJlc291cmNlIHJlc291cmNlLCBpbnQgcmVwbGFjZW1lbnRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoKSB7Ci0JCXJldHVybiBmaW5kUHJvcG9zYWxzKHJlc291cmNlLCByZXBsYWNlbWVudFN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgSUphdmFTZWFyY2hDb25zdGFudHMuVFlQRSwgZmFsc2UpOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRDbGFzc1Byb3Bvc2FscyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCByZXBsYWNlbWVudFN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJcmV0dXJuIGZpbmRQcm9wb3NhbHMocmVzb3VyY2UsIHJlcGxhY2VtZW50U3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBJSmF2YVNlYXJjaENvbnN0YW50cy5DTEFTUywgdHJ1ZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUphdmFQcm9qZWN0IGdldEphdmFQcm9qZWN0KElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlJUHJvamVjdCBwcm9qID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlJSmF2YVByb2plY3QgamF2YVByb2plY3QgPSBKYXZhQ29yZS5jcmVhdGUocHJvaik7Ci0JCXJldHVybiBqYXZhUHJvamVjdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSmF2YVR5cGVOYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1NGQxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9KYXZhVHlwZU5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuRmxhZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuU2lnbmF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5UeXBlTmFtZVJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkudGV4dC5qYXZhLkNvbXBsZXRpb25Qcm9wb3NhbExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLkpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC51aS5pbnRlcm5hbC5jb21tb24uY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29uc3RhbnRzOwotCi0vKioKLSAqIFVzZSB3LyBKRFQgc2VhcmNoIGVuZ2luZSB0byBmaW5kIGFsbCB0eXBlIG5hbWVzLgotICogQ3JlYXRlcyBwcm9wb3NhbHMgZnJvbSBtYXRjaGVzIHJlcG9ydGVkLgotICoKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSmF2YVR5cGVOYW1lUmVxdWVzdG9yIGV4dGVuZHMgVHlwZU5hbWVSZXF1ZXN0b3IgewotCQotCXByaXZhdGUgaW50IGZKU1BPZmZzZXQgPSAtMTsKLQlwcml2YXRlIGludCBmUmVwbGFjZW1lbnRMZW5ndGggPSAtMTsKLQlwcml2YXRlIExpc3QgZlByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIGJvb2xlYW4gZklnbm9yZUFic3RyYWN0Q2xhc3NlcyA9IGZhbHNlOwotCQotCXByaXZhdGUgQ29tcGxldGlvblByb3Bvc2FsTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWxMYWJlbFByb3ZpZGVyKCk7Ci0JCi0JcHVibGljIHZvaWQgYWNjZXB0VHlwZShpbnQgbW9kaWZpZXJzLCBjaGFyW10gcGFja2FnZU5hbWUsIGNoYXJbXSBzaW1wbGVUeXBlTmFtZSwgY2hhcltdW10gZW5jbG9zaW5nVHlwZU5hbWVzLCBTdHJpbmcgcGF0aCkgewotCi0gICAgICAgIGludCBvZmZzZXQgPSBnZXRKU1BPZmZzZXQoKTsKLSAgICAgICAgaW50IGxlbmd0aCA9IGdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCQotCQkvLyBzb21laG93IG9mZnNldCBvciBsZW5ndGggd2FzIHNldCBpbmNvcnJlY3RseQotCQlpZihvZmZzZXQgPT0gLTEgfHwgbGVuZ3RoID09IC0xKQotCQkJcmV0dXJuOwotCQkvLyBpZ25vcmUgYWJzdHJhY3QgY2xhc3Nlcz8KLQkJaWYoaWdub3JlQWJzdHJhY3RDbGFzc2VzKCkgJiYgRmxhZ3MuaXNBYnN0cmFjdChtb2RpZmllcnMpKQotCQkJcmV0dXJuOwotCQkKLQkJSW1hZ2UgaW1hZ2UgPSBjYWxjdWxhdGVJbWFnZShtb2RpZmllcnMpOwotCQkKLSAgICAgICAgU3RyaW5nIGNvbnRhaW5lck5hbWVTdHJpbmcgPSBuZXcgU3RyaW5nKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lU3RyaW5nID0gU3RyaW5nLnZhbHVlT2Yoc2ltcGxlVHlwZU5hbWUpOwotCQkJCi0gICAgICAgIC8vIGNvbnRhaW5lcm5hbWUgY2FuIGJlIG51bGwKLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gY29uY2F0ZW5hdGVOYW1lKGNvbnRhaW5lck5hbWVTdHJpbmcsIHR5cGVOYW1lU3RyaW5nKTsKLQotICAgICAgICBTdHJpbmcgc2ltcGxlTmFtZSA9IFNpZ25hdHVyZS5nZXRTaW1wbGVOYW1lKGZ1bGxOYW1lKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoc2ltcGxlTmFtZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlUXVhbGlmaWVyID0gU2lnbmF0dXJlLmdldFF1YWxpZmllcihmdWxsTmFtZSk7Ci0gICAgICAgIGlmICh0eXBlUXVhbGlmaWVyLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYnVmLmFwcGVuZCgiIC0gIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQodHlwZVF1YWxpZmllcik7Ci0gICAgICAgIH0KLQkJCi0gICAgICAgIEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEphdmFUeXBlQ29tcGxldGlvblByb3Bvc2FsKGZ1bGxOYW1lLCBvZmZzZXQsIGxlbmd0aCwgZnVsbE5hbWUsIGltYWdlLCB0eXBlTmFtZVN0cmluZywgdHlwZVF1YWxpZmllciwgSVJlbGV2YW5jZUNvbnN0YW50cy5SX05PTkUsIHRydWUpOwotICAgICAgICBwcm9wb3NhbC5zZXRUcmlnZ2VyQ2hhcmFjdGVycyhKU1BQcm9wb3NhbENvbGxlY3Rvci5nZXRUeXBlVHJpZ2dlcnMoKSk7Ci0JCWZQcm9wb3NhbHMuYWRkKHByb3Bvc2FsKTsKLQl9Ci0KLQotCXByaXZhdGUgSW1hZ2UgY2FsY3VsYXRlSW1hZ2UoaW50IG1vZGlmaWVycykgewotCQlDb21wbGV0aW9uUHJvcG9zYWwgcCA9IENvbXBsZXRpb25Qcm9wb3NhbC5jcmVhdGUoQ29tcGxldGlvblByb3Bvc2FsLlRZUEVfUkVGLCBnZXRKU1BPZmZzZXQoKSk7Ci0JCXAuc2V0RmxhZ3MobW9kaWZpZXJzKTsKLQkJCi0JCS8vaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMjIwNgotCQljaGFyW10gc2lnID0gbmV3IGNoYXJbXXtTaWduYXR1cmUuQ19VTlJFU09MVkVEfTsKLQkJcC5zZXRTaWduYXR1cmUoc2lnKTsKLQkJCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZkxhYmVsUHJvdmlkZXIuY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHApOwotCQlJbWFnZSBpbWFnZSA9IEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoZGVzY3JpcHRvcik7Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0JCi0gICAgLyoqCi0gICAgICogQ29uY2F0ZW5hdGVzIHR3byBuYW1lcy4gVXNlcyBhIGRvdCBmb3Igc2VwYXJhdGlvbi4gQm90aCBzdHJpbmdzIGNhbiBiZQotICAgICAqIGVtcHR5IG9yIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgY29uY2F0ZW5hdGVOYW1lKFN0cmluZyBuYW1lMSwgU3RyaW5nIG5hbWUyKSB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIGlmIChuYW1lMSAhPSBudWxsICYmIG5hbWUxLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgYnVmLmFwcGVuZChuYW1lMSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5hbWUyICE9IG51bGwgJiYgbmFtZTIubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID4gMCkgewotICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJy4nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQobmFtZTIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0JCi0JaW50IGdldEpTUE9mZnNldCgpIHsKLQkJcmV0dXJuIGZKU1BPZmZzZXQ7Ci0JfQotCi0Jdm9pZCBzZXRKU1BPZmZzZXQoaW50IG9mZnNldCkgewotCQlmSlNQT2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCWludCBnZXRSZXBsYWNlbWVudExlbmd0aCgpIHsKLQkJcmV0dXJuIGZSZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0KLQl2b2lkIHNldFJlcGxhY2VtZW50TGVuZ3RoKGludCByZXBsYWNlbWVudExlbmd0aCkgewotCQlmUmVwbGFjZW1lbnRMZW5ndGggPSByZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0Jdm9pZCBzZXRJZ25vcmVBYnN0cmFjdENsYXNzZXMoYm9vbGVhbiBpZ25vcmUpIHsKLQkJZklnbm9yZUFic3RyYWN0Q2xhc3NlcyA9IGlnbm9yZTsKLQl9Ci0JYm9vbGVhbiBpZ25vcmVBYnN0cmFjdENsYXNzZXMoKSB7Ci0JCXJldHVybiBmSWdub3JlQWJzdHJhY3RDbGFzc2VzOwotCX0KLQkKLQlKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscygpIHsKLQkJcmV0dXJuIChKYXZhVHlwZUNvbXBsZXRpb25Qcm9wb3NhbFtdKWZQcm9wb3NhbHMudG9BcnJheShuZXcgSmF2YVR5cGVDb21wbGV0aW9uUHJvcG9zYWxbZlByb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzIyOTM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRleHQuSUpTUFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotLyoqCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUCBleHRlbmRzIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwgewotCi0JcHJpdmF0ZSBTdHJpbmdbXSBmSlNQQ29udGV4dHMgPSBudWxsOwotCi0JcHVibGljIE5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckpTUCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdEpTUENvbnRleHRzKCk7Ci0JfQotCi0JLyogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwjaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCXN1cGVyLmluaXRQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbmV3IEpTUENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQotCQkvLyBKU1AKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxULCBqc3BDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0RFRkFVTFQsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0RJUkVDVElWRSwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9ERUxJTUlURVIsIGpzcENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQVNDUklQVCwganNwQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNwSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSlNQSmF2YUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElKU1BQYXJ0aXRpb25zLkpTUF9DT05URU5UX0pBVkEsIGpzcEphdmFDb250ZW50QXNzaXN0UHJvY2Vzc29yKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCXN1cGVyLmluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKTsKLQkJSlNQUHJvcGVydHlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGpzcFByb3BlcnR5Q0FQID0gbmV3IEpTUFByb3BlcnR5Q29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGROYW1lUHJvY2Vzc29yKEpTUDExTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFVFBST1BFUlRZLCBqc3BQcm9wZXJ0eUNBUCk7Ci0JCWFkZE5hbWVQcm9jZXNzb3IoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuR0VUUFJPUEVSVFksIGpzcFByb3BlcnR5Q0FQKTsKLQkJYWRkTmFtZVByb2Nlc3NvcihKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5VU0VCRUFOLCBuZXcgSlNQVXNlQmVhbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRKU1BDb250ZXh0cygpIHsKLQkJZkpTUENvbnRleHRzID0gbmV3IFN0cmluZ1tde0RPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ERUNMQVJBVElPTl9PUEVOLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOLCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU59OwotCX0KLQotCS8qKgotCSAqIFF1aWNrIGNoZWNrIHRvIHNlZSBpZiBjb250ZXh0IChTdHJpbmcpIHNob3VsZCBtYXAgdG8KLQkgKiBKU1BDb250ZW50QXNzaXN0UHJvY2Vzc29yLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHJldHVybiBpZiBpdCdzIGEgSlNQIFJlZ2lvbiAoZm9yIHdoaWNoIHdlIG5lZWQgSlNQIENvbnRlbnQgYXNzaXN0KQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCVN0cmluZyBjb250ZXh0ID0gc2RSZWdpb24uZ2V0VHlwZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZKU1BDb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGNvbnRleHQgPT0gZkpTUENvbnRleHRzW2ldKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ3Vlc3NDb250ZW50QXNzaXN0UHJvY2Vzc29yKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSBzdXBlci5ndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3Iodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCWlmIChwID09IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHZpZXdlci5nZXREb2N1bWVudCgpKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudE9mZnNldCk7Ci0JCQlpZiAoaXNKU1BSZWdpb24oc2RSZWdpb24pKQotCQkJCXAgPSBnZXRQYXJ0aXRpb25Qcm9jZXNzb3IoSUpTUFBhcnRpdGlvbnMuSlNQX0NPTlRFTlRfSkFWQSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9SZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjRlOWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLQotLyoqCi0gKiBKdXN0IGxpa2UgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgZXhjZXB0IGlmIGFuIGluc2VydCBvZmZzZXQgaXMgcGFzc2VkIGluLAotICogZHVyaW5nIGV2YWx1YXRpb24sIHRoZSAicHJlZml4IiBiZWZvcmUgdGhlIHRlbXBsYXRlIHdpbGwgYmUgY2hlY2tlZCB0byBzZWUKLSAqIGlmIGl0IG1hdGNoZXMgdGhlIHRlbXBsYXRlIG5hbWUuIElmIHNvLCBvdmVyd3JpdGUgdGhlIHRlbXBsYXRlIG5hbWUuCi0gKiBPdGhlcndpc2UsIGp1c3QgaW5zZXJ0IHRoZSB0ZW1wbGF0ZSBhdCB0aGUgaW5zZXJ0IG9mZnNldCBsb2NhdGlvbiAoYnkgbm90Ci0gKiBvdmVyd3JpdGluZyB0aGUgcHJlZml4IHRleHQpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dCBleHRlbmRzIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IHsKLQlwcml2YXRlIGludCBmSW5zZXJ0T2Zmc2V0ID0gLTE7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LiBUaGUgc3VwcGxpZWQgPGNvZGU+UG9zaXRpb248L2NvZGU+Ci0JICogd2lsbCBiZSBxdWVyaWVkIHRvIGNvbXB1dGUgdGhlIDxjb2RlPmdldFN0YXJ0PC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5nZXRFbmQ8L2NvZGU+IG1ldGhvZHMsIHdoaWNoIHdpbGwgdGhlcmVmb3JlIGFuc3dlciB1cGRhdGVkCi0JICogcG9zaXRpb24gZGF0YSBpZiBpdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBkZXNjcmliaW5nIHRoZSBhcmVhIG9mIHRoZSBkb2N1bWVudCB3aGljaCBmb3JtcwotCSAqICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGNvbnRleHQKLQkgKiBAc2luY2UgMy4xCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBQb3NpdGlvbiBwb3NpdGlvbikgewotCQlzdXBlcih0eXBlLCBkb2N1bWVudCwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gaW5zZXJ0T2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24gd2hlcmUgaW5zZXJ0IHdhcwotCSAqICAgICAgICAgICAgb3JpZ2luYWxseSByZXF1ZXN0ZWQKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGludCBpbnNlcnRPZmZzZXQpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JCWZJbnNlcnRPZmZzZXQgPSBpbnNlcnRPZmZzZXQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dCNldmFsdWF0ZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZSkKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVCdWZmZXIgZXZhbHVhdGUoVGVtcGxhdGUgdGVtcGxhdGUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgVGVtcGxhdGVFeGNlcHRpb24gewotCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBzdXBlci5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCWlmIChidWZmZXIgIT0gbnVsbCkgewotCQkJaWYgKGZJbnNlcnRPZmZzZXQgPiAtMSAmJiBmSW5zZXJ0T2Zmc2V0ID4gZ2V0U3RhcnQoKSkgewotCQkJCVN0cmluZyBwcmVmaXggPSBnZXREb2N1bWVudCgpLmdldChnZXRTdGFydCgpLCBmSW5zZXJ0T2Zmc2V0IC0gZ2V0U3RhcnQoKSk7Ci0JCQkJaWYgKCF0ZW1wbGF0ZS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0JCQkJCS8vIGdlbmVyYXRlIGEgbmV3IGJ1ZmZlciB0aGF0IGFjdHVhbGx5IGNvbnRhaW5zIHRoZQotCQkJCQkvLyB0ZXh0IHRoYXQgd2FzIGdvaW5nIHRvIGJlIG92ZXJ3cml0dGVuCi0JCQkJCWJ1ZmZlciA9IG5ldyBUZW1wbGF0ZUJ1ZmZlcihwcmVmaXggKyBidWZmZXIuZ2V0U3RyaW5nKCksIGJ1ZmZlci5nZXRWYXJpYWJsZXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0pTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YTQxOGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0pTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkpTUEZDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotCi0vKioKLSAqIEpTUCBGcmFnbWVudCBQcm9wZXJ0eSBQYWdlCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUX05PTkUgPSBKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQotCS8vIFRPRE86IEZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIHRoZXNlIHN0cmluZ3MvdmFyaWFibGVzCi0JcHJpdmF0ZSBTdHJpbmdbXSBmTGFuZ3VhZ2VzID0ge1NFTEVDVF9OT05FLCAiamF2YSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiamF2YXNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29udGVudFR5cGVzID0ge1NFTEVDVF9OT05FLCAiYXBwbGljYXRpb24veGh0bWwreG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJInRleHQvaHRtbCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkidGV4dC94bWwiLCAgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L2NzcyJ9OyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIEJ1dHRvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCWJvb2xlYW4gc3BlY2lmaWMgPSBmU3BlY2lmaWNTZXR0aW5nLmdldFNlbGVjdGlvbigpOwotCQkJdXBkYXRlQnV0dG9ucyhzcGVjaWZpYyk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbWJvIGZMYW5ndWFnZUNvbWJvOwotCXByaXZhdGUgQ29tYm8gZkNvbnRlbnRUeXBlQ29tYm87Ci0JcHJpdmF0ZSBCdXR0b24gZlZhbGlkYXRlRnJhZ21lbnRzOwotCUJ1dHRvbiBmU3BlY2lmaWNTZXR0aW5nOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZlNwZWNpZmljTGlzdGVuZXI7Ci0KLQlwdWJsaWMgSlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGVzY3JpcHRpb24oSlNQVUlNZXNzYWdlcy5KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzEpOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcHJvcGVydHlQYWdlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0KLQkJLy8gZnJhZ21lbnQgbGFuZ3VhZ2UgY29udHJvbAotCQlUZXh0IGxhbmd1YWdlTGFiZWwgPSBuZXcgVGV4dChwcm9wZXJ0eVBhZ2UsIFNXVC5SRUFEX09OTFkpOwotCQlsYW5ndWFnZUxhYmVsLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzIpOwotCQlmTGFuZ3VhZ2VDb21ibyA9IG5ldyBDb21ibyhwcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZMYW5ndWFnZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZMYW5ndWFnZUNvbWJvLnNldEl0ZW1zKGZMYW5ndWFnZXMpOwotCi0JCS8vIGZyYWdtZW50IGNvbnRlbnQgdHlwZSBjb250cm9sCi0JCVRleHQgY29udGVudFR5cGVMYWJlbCA9IG5ldyBUZXh0KHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCWNvbnRlbnRUeXBlTGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMyk7Ci0JCWZDb250ZW50VHlwZUNvbWJvID0gbmV3IENvbWJvKHByb3BlcnR5UGFnZSwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZkNvbnRlbnRUeXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJZkNvbnRlbnRUeXBlQ29tYm8uc2V0SXRlbXMoZkNvbnRlbnRUeXBlcyk7Ci0KLQkJLy8gY3JlYXRlIHNlcGFyYXRvcgotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0eVBhZ2UsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEudmVydGljYWxTcGFuID0gODsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBzcGVjaWZpYyBzZXR0aW5nCi0JCWZTcGVjaWZpY1NldHRpbmcgPSBuZXcgQnV0dG9uKHByb3BlcnR5UGFnZSwgU1dULkNIRUNLIHwgU1dULkxFRlQpOwotCQlmU3BlY2lmaWNTZXR0aW5nLnNldFRleHQoSlNQVUlNZXNzYWdlcy5KU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzQpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZTcGVjaWZpY1NldHRpbmcuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmU3BlY2lmaWNMaXN0ZW5lciA9IG5ldyBCdXR0b25MaXN0ZW5lcigpOwotCQlmU3BlY2lmaWNTZXR0aW5nLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGZTcGVjaWZpY0xpc3RlbmVyKTsKLQotCQkvLyB2YWxpZGF0ZSBmaWxlCi0JCWZWYWxpZGF0ZUZyYWdtZW50cyA9IG5ldyBCdXR0b24ocHJvcGVydHlQYWdlLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8xKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSA1OwotCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlpbml0aWFsaXplVmFsdWVzKCk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5KU1BfRlJBR01FTlRfSEVMUElEKTsKLQkJcmV0dXJuIHByb3BlcnR5UGFnZTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZUJ1dHRvbnMoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWZTcGVjaWZpY1NldHRpbmcuc2V0U2VsZWN0aW9uKGVuYWJsZWQpOwotCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIHRoaXMgcHJvcGVydGllcyBwYWdlIGlzIGZvcgotCSAqIAotCSAqIEByZXR1cm4gSVJlc291cmNlIGZvciB0aGlzIHByb3BlcnRpZXMgcGFnZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICBJUmVzb3VyY2UKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlTdHJpbmcgbGFuZ3VhZ2UgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChsYW5ndWFnZSA9PSBudWxsIHx8IGxhbmd1YWdlLmxlbmd0aCgpID09IDApIHsKLQkJCS8vIGlmIG51bGwsIHVzZSBub25lCi0JCQlsYW5ndWFnZSA9IFNFTEVDVF9OT05FOwotCQl9Ci0JCS8qCi0JCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgYWRkIHRvIHRoZQotCQkgKiBjb21ib2JveC4KLQkJICovCi0JCWludCBpbmRleCA9IGZMYW5ndWFnZUNvbWJvLmluZGV4T2YobGFuZ3VhZ2UpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZMYW5ndWFnZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0JCWVsc2UKLQkJCWZMYW5ndWFnZUNvbWJvLnNldFRleHQobGFuZ3VhZ2UpOwotCi0JCVN0cmluZyBjb250ZW50VHlwZSA9IEpTUEZDb250ZW50UHJvcGVydGllcy5nZXRQcm9wZXJ0eShKU1BGQ29udGVudFByb3BlcnRpZXMuSlNQQ09OVEVOVFRZUEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwgfHwgY29udGVudFR5cGUubGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gaWYgbnVsbCwgdXNlIG5vbmUKLQkJCWNvbnRlbnRUeXBlID0gU0VMRUNUX05PTkU7Ci0JCX0KLQkJLyoKLQkJICogSWYgaXRlbSBpcyBhbHJlYWR5IHBhcnQgb2YgY29tYm8sIHNlbGVjdCBpdC4gT3RoZXJ3aXNlLCBhZGQgdG8gdGhlCi0JCSAqIGNvbWJvYm94LgotCQkgKi8KLQkJaW5kZXggPSBmQ29udGVudFR5cGVDb21iby5pbmRleE9mKGNvbnRlbnRUeXBlKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmQ29udGVudFR5cGVDb21iby5zZWxlY3QoaW5kZXgpOwotCQllbHNlCi0JCQlmQ29udGVudFR5cGVDb21iby5zZXRUZXh0KGNvbnRlbnRUeXBlKTsKLQotCQlTdHJpbmcgdmFsaWRhdGUgPSBKU1BGQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLlZBTElEQVRFX0ZSQUdNRU5UUywgZ2V0UmVzb3VyY2UoKSwgZmFsc2UpOwotCQlTdHJpbmcgdmFsaWRhdGUyID0gSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5WQUxJREFURV9GUkFHTUVOVFMsIGdldFJlc291cmNlKCksIHRydWUpOwotCQlpZiAodmFsaWRhdGUgPT0gbnVsbCB8fCB2YWxpZGF0ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl1cGRhdGVCdXR0b25zKGZhbHNlKTsKLQkJCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRTZWxlY3Rpb24oQm9vbGVhbi52YWx1ZU9mKHZhbGlkYXRlMikuYm9vbGVhblZhbHVlKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlQnV0dG9ucyh0cnVlKTsKLQkJCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRTZWxlY3Rpb24oQm9vbGVhbi52YWx1ZU9mKHZhbGlkYXRlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWludCBpbmRleCA9IGZMYW5ndWFnZUNvbWJvLmluZGV4T2YoU0VMRUNUX05PTkUpOwotCQlpZiAoaW5kZXggPiAtMSkKLQkJCWZMYW5ndWFnZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0KLQkJaW5kZXggPSBmQ29udGVudFR5cGVDb21iby5pbmRleE9mKFNFTEVDVF9OT05FKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmQ29udGVudFR5cGVDb21iby5zZWxlY3QoaW5kZXgpOwotCi0JCXVwZGF0ZUJ1dHRvbnMoZmFsc2UpOwotCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0U2VsZWN0aW9uKHRydWUpOwotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJdHJ5IHsKLQkJCS8vIHNhdmUgdGhlIGZyYWdtZW50IGxhbmd1YWdlCi0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBmTGFuZ3VhZ2VDb21iby5nZXRUZXh0KCk7Ci0JCQlpZiAobGFuZ3VhZ2UgPT0gbnVsbCB8fCBsYW5ndWFnZS5sZW5ndGgoKSA9PSAwIHx8IGxhbmd1YWdlLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlsYW5ndWFnZSA9IG51bGw7Ci0JCQl9Ci0JCQlKU1BGQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUExBTkdVQUdFLCBnZXRSZXNvdXJjZSgpLCBsYW5ndWFnZSk7Ci0KLQkJCS8vIHNhdmUgZnJhZ21lbnQgY29udGVudCB0eXBlCi0JCQlTdHJpbmcgY29udGVudFR5cGUgPSBmQ29udGVudFR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCB8fCBjb250ZW50VHlwZS5sZW5ndGgoKSA9PSAwIHx8IGNvbnRlbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQljb250ZW50VHlwZSA9IG51bGw7Ci0JCQl9Ci0JCQlKU1BGQ29udGVudFByb3BlcnRpZXMuc2V0UHJvcGVydHkoSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLkpTUENPTlRFTlRUWVBFLCBnZXRSZXNvdXJjZSgpLCBjb250ZW50VHlwZSk7Ci0KLQkJCVN0cmluZyB2YWxpZGF0ZSA9IG51bGw7Ci0JCQlpZiAoZlNwZWNpZmljU2V0dGluZy5nZXRTZWxlY3Rpb24oKSkgewotCQkJCXZhbGlkYXRlID0gQm9vbGVhbi50b1N0cmluZyhmVmFsaWRhdGVGcmFnbWVudHMuZ2V0U2VsZWN0aW9uKCkpOwotCQkJfQotCQkJSlNQRkNvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KEpTUEZDb250ZW50UHJvcGVydGllcy5WQUxJREFURV9GUkFHTUVOVFMsIGdldFJlc291cmNlKCksIHZhbGlkYXRlKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBtYXliZSBpbiBmdXR1cmUsIGxldCB1c2VyIGtub3cgdGhlcmUgd2FzIGEgcHJvYmxlbSBzYXZpbmcgZmlsZQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOTc2YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RKU1BGQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIEpTUEZDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgewotCXB1YmxpYyBQcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc2V0RGVzY3JpcHRpb24oSlNQVUlNZXNzYWdlcy5Qcm9qZWN0SlNQRkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZGVyaXZlZC9TaW5nbGVDaGFyUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViOThlMjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuY29yZXh0LmphdmFkb2MuU2luZ2xlQ2hhclJlYWRlci4KLSAqIE1vZGlmaWNhdGlvbiB3YXMgbWFkZSB0byBmaXggc3RhdGVtZW50IHVubmVjZXNzYXJpbHkgbmVzdGVkIHdpdGhpbiBlbHNlCi0gKiBjbGF1c2Ugd2FybmluZyBpbiByZWFkKC4uKS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNpbmdsZUNoYXJSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZChjaGFyW10saW50LGludCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBlbmQgPSBvZmYgKyBsZW47Ci0JCWZvciAoaW50IGkgPSBvZmY7IGkgPCBlbmQ7IGkrKykgewotCQkJaW50IGNoID0gcmVhZCgpOwotCQkJaWYgKGNoID09IC0xKSB7Ci0JCQkJaWYgKGkgPT0gb2ZmKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGkgLSBvZmY7Ci0JCQl9Ci0JCQljYnVmW2ldID0gKGNoYXIpIGNoOwotCQl9Ci0JCXJldHVybiBsZW47Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZHkoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudCBhcyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoOwotCQl3aGlsZSAoKGNoID0gcmVhZCgpKSAhPSAtMSkgewotCQkJYnVmLmFwcGVuZCgoY2hhcikgY2gpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9ySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNGFmOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9BY3Rpb25Db250cmlidXRvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5hY3Rpb25zLlJlZmFjdG9yQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5JQWN0aW9uQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSUFjdGlvbkRlZmluaXRpb25JZHNKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0LnVpLkFjdGlvbkNvbnRyaWJ1dG9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci0KLS8qKgotICogQWN0aW9uQ29udHJpYnV0b3JKU1AKLSAqIAotICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgaW5zaWRlIG11bHRpIHBhZ2UgZWRpdG9yJ3MKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yLCBzaW5jZSBjYXNjYWRlZCBpbml0KCkgY2FsbCBmcm9tIHRoZQotICogQWN0aW9uQmFyQ29udHJpYnV0b3Igd2lsbCBjYXVzZXMgZXhjZXB0aW9uIGFuZCBpdCBsZWFkcyB0byBsb3NlIHdob2xlCi0gKiB0b29sYmFycy4KLSAqIAotICogSW5zdGVhZCwgdXNlIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBmb3Igc291cmNlIHBhZ2UgY29udHJpYnV0b3Igb2YKLSAqIG11bHRpIHBhZ2UgZWRpdG9yLgotICogCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzdGlsbCB2YWxpZCBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3JKU1AgZXh0ZW5kcyBBY3Rpb25Db250cmlidXRvckhUTUwgewotCi0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gcmVuYW1lRWxlbWVudEFjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gbW92ZUVsZW1lbnRBY3Rpb24gPSBudWxsOwotCXByaXZhdGUgSU1lbnVNYW5hZ2VyIHJlZmFjdG9yTWVudSA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIEFjdGlvbkNvbnRyaWJ1dG9ySlNQKCkgewotCQlzdXBlcigpOwotCi0JCVJlc291cmNlQnVuZGxlIGJ1bmRsZSA9IEpTUFVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfUkVOQU1FX0VMRU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQl0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElBY3Rpb25EZWZpbml0aW9uSWRzSlNQLlJFTkFNRV9FTEVNRU5UKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24sIElIZWxwQ29udGV4dElkcy5KU1BfUkVGQUNUT1JSRU5BTUVfSEVMUElEKTsKLQotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihidW5kbGUsIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfTU9WRV9FTEVNRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuRE9UKTsKLQkJdGhpcy5tb3ZlRWxlbWVudEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUFjdGlvbkRlZmluaXRpb25JZHNKU1AuTU9WRV9FTEVNRU5UKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0aGlzLm1vdmVFbGVtZW50QWN0aW9uLCBJSGVscENvbnRleHRJZHMuSlNQX1JFRkFDVE9STU9WRV9IRUxQSUQpOwotCi0JCS8vIHRoZSByZWZhY3RvciBtZW51LCBhZGQgdGhlIG1lbnUgaXRzZWxmIHRvIGFkZCBhbGwgcmVmYWN0b3IgYWN0aW9ucwotCQl0aGlzLnJlZmFjdG9yTWVudSA9IG5ldyBNZW51TWFuYWdlcihKU1BVSU1lc3NhZ2VzLkFjdGlvbkNvbnRyaWJ1dG9ySlNQXzAsIFJlZmFjdG9yQWN0aW9uR3JvdXAuTUVOVV9JRCk7IC8vJE5PTi1OTFMtMSQKLQkJcmVmYWN0b3JNZW51LmFkZCh0aGlzLnJlbmFtZUVsZW1lbnRBY3Rpb24pOwotCQlyZWZhY3Rvck1lbnUuYWRkKHRoaXMubW92ZUVsZW1lbnRBY3Rpb24pOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuYWRkVG9NZW51KG1lbnUpOwotCi0JCW1lbnUuaW5zZXJ0QWZ0ZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX0VESVQsIHRoaXMucmVmYWN0b3JNZW51KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJdGhpcy5yZW5hbWVFbGVtZW50QWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24oZ2V0VGV4dEVkaXRvcihnZXRBY3RpdmVFZGl0b3JQYXJ0KCkpLCBJQWN0aW9uQ29uc3RhbnRzSlNQLkFDVElPTl9OQU1FX1JFTkFNRV9FTEVNRU5UKSk7Ci0JCXRoaXMubW92ZUVsZW1lbnRBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbihnZXRUZXh0RWRpdG9yKGdldEFjdGl2ZUVkaXRvclBhcnQoKSksIElBY3Rpb25Db25zdGFudHNKU1AuQUNUSU9OX05BTUVfTU9WRV9FTEVNRU5UKSk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCi0JCXN1cGVyLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZW5hYmxlZCk7Ci0JCXRoaXMucmVuYW1lRWxlbWVudEFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl0aGlzLm1vdmVFbGVtZW50QWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZWM1OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBKU1AgU291cmNlIEVkaXRvci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gSlNQVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIEpTUCBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1AgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEpTUCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDUwIjsgLy8kTk9OLU5MUy0xJAotCS8vIEpTUCBTdHlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNTEiOyAvLyROT04tTkxTLTEkCi0JLy8gSlNQIFRlbXBsYXRlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA1MiI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLy8gSlNQIEZyYWdtZW50IFByb3BlcnR5IFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRlJBR01FTlRfSEVMUElEID0gUFJFRklYICsgImpzcGYxMDAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSlNQIFNvdXJjZSBFZGl0b3IgQ29udGV4dCBNZW51Ci0JLy8gUmVmYWN0b3IgUmVuYW1lCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1JFRkFDVE9SUkVOQU1FX0hFTFBJRCA9IFBSRUZJWCArICJqc3ByMDAxMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFJlZmFjdG9yIE1vdmUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUkVGQUNUT1JNT1ZFX0hFTFBJRCA9IFBSRUZJWCArICJqc3ByMDAyMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEpTUCBOZXcgRmlsZSBXaXphcmQgLSBUZW1wbGF0ZSBQYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQgPSBQUkVGSVggKyAianNwdzAwMTAiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjU5YjliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqIAotICogTk9URTogRm9yIGludGVybmFsIHVzZSBvbmx5LiBGb3IgaW1hZ2VzIHVzZWQgZXh0ZXJuYWxseSwgcGxlYXNlIHVzZSB0aGUKLSAqIFNoYXJlZCoqKkltYWdlSGVscGVyIGNsYXNzIGluc3RlYWQuCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IEpTUFVJUGx1Z2luLklEOwotCXByaXZhdGUgc3RhdGljIEpTUEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8vCSBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBKU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogSWYgdGhlIGltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgYXQKLQkgKiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYW4gaW1hZ2UKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0gICAKLSAgICAvKioKLSAgICAgKiBSZXRyaWV2ZXMgdGhlIEltYWdlIGFzc29jaWF0ZWQgd2l0aCBJbWFnZURlc2NyaXB0b3IgZnJvbSB0aGUgaW1hZ2UKLSAgICAgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgSW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgaXQgaXMgY3JlYXRlZAotICAgICAqIGZyb20gdGhlIEltYWdlRGVzY3JpcHRvcgotICAgICAqIAotICAgICAqIEBwYXJhbSByZXNvdXJjZQotICAgICAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLSAgICAgKiBAcmV0dXJuIEltYWdlIHRoZSBhc3NvY2lhdGVkIHdpdGggdGhlIEltYWdlRGVzY3JpcHRvciBvcgotICAgICAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotICAgICAqICAgICAgICAgZm91bmQKLSAgICAgKi8KLSAgICBwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIGRlc2NyaXB0b3I9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgSW1hZ2UgcmVzdWx0PSAoSW1hZ2UpZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQoZGVzY3JpcHRvcik7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIAotICAgICAgICByZXN1bHQ9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgICAgICAgICAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoZGVzY3JpcHRvciwgcmVzdWx0KTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJCi0JCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJLy8gZG9udCBhZGQgdGhlIG1pc3NpbmcgaW1hZ2UgZGVzY3JpcHRvciBpbWFnZSB0byB0aGUgaW1hZ2UgcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpCi0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmMwNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIEpTUCBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIEpTUEVkaXRvclBsdWdpbkltYWdlcyB7IAkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NMQVNTX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2NsYXNzX29iai5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfSlNQID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19URU1QTEFURSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1BVQkxJQyA9ICJpY29ucy9mdWxsL29iajE2L3B1YmxpYy5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9QUk9URUNURURfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvZmllbGRfcHJvdGVjdGVkX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfUFVCTElDX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2ZpZWxkX3B1YmxpY19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX0RFRkFVTFRfT0JKPSAiaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9kZWZhdWx0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfUFJJVkFURV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9maWVsZF9wcml2YXRlX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9DTyA9ICJpY29ucy9mdWxsL29iajE2L2RlZmF1bHRfY28uZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1RFQ1RFRF9DTyA9ICJpY29ucy9mdWxsL29iajE2L3Byb3RlY3RlZF9jby5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0NPID0gImljb25zL2Z1bGwvb2JqMTYvcHVibGljX2NvLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUklWQVRFX0NPID0gImljb25zL2Z1bGwvb2JqMTYvcHJpdmF0ZV9jby5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJDTEFTU19ERUZBVUxUX09CSj0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19kZWZhdWx0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJDTEFTU19QUklWQVRFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJpdmF0ZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOTkVSQ0xBU1NfUFJPVEVDVEVEX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyY2xhc3NfcHJvdGVjdGVkX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJDTEFTU19QVUJMSUNfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJjbGFzc19wdWJsaWNfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUklOVEVSRkFDRV9ERUZBVUxUX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX2RlZmF1bHRfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUklOVEVSRkFDRV9QUklWQVRFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3ByaXZhdGVfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTk5FUklOVEVSRkFDRV9QUk9URUNURURfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvaW5uZXJpbnRlcmZhY2VfcHJvdGVjdGVkX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ORVJJTlRFUkZBQ0VfUFVCTElDX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2lubmVyaW50ZXJmYWNlX3B1YmxpY19vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfT0JKID0gImljb25zL2Z1bGwvb2JqMTYvcGFja2FnZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FMX1ZBUklBQkxFX09CSiA9ICJpY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1dJWkJBTl9ORVdKU1BGSUxFID0gImljb25zL2Z1bGwvd2l6YmFuL25ld2pzcGZpbGVfd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9lZGl0b3IvSlNQU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMWNiMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2VkaXRvci9KU1BTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5QYWdlRGlyZWN0aXZlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSlNQMTFOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDEyTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGludGVyZmFjZQotICovCi1wdWJsaWMgY2xhc3MgSlNQU291cmNlRWRpdGluZ1RleHRUb29scyBleHRlbmRzIFhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgewotCi0JcHVibGljIFN0cmluZyBnZXRQYWdlTGFuZ3VhZ2UoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0JCURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlkb2MgPSAoRG9jdW1lbnQpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkb2MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJfQotCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCQlQYWdlRGlyZWN0aXZlQWRhcHRlciBhZGFwdGVyID0gKFBhZ2VEaXJlY3RpdmVBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgZG9jKS5nZXRBZGFwdGVyRm9yKFBhZ2VEaXJlY3RpdmVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlsYW5ndWFnZSA9IGFkYXB0ZXIuZ2V0TGFuZ3VhZ2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgb2YgdGhlIHBhZ2UgZGlyZWN0aXZlcwotCQkJCU5vZGVMaXN0IHBhZ2VEaXJlY3RpdmVzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKEpTUDEyTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUkVDVElWRV9QQUdFKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VEaXJlY3RpdmVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJRWxlbWVudCBwYWdlRGlyZWN0aXZlID0gKEVsZW1lbnQpIHBhZ2VEaXJlY3RpdmVzLml0ZW0oaSk7Ci0JCQkJCVN0cmluZyBsYW5nVmFsdWUgPSBwYWdlRGlyZWN0aXZlLmdldEF0dHJpYnV0ZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR1VBR0UpOwotCQkJCQkvLyBsYXN0IG9uZSB0byBkZWNsYXJlIGEgbGFuZ3VhZ2Ugd2lucwotCQkJCQlpZiAobGFuZ1ZhbHVlICE9IG51bGwpCi0JCQkJCQlsYW5ndWFnZSA9IGxhbmdWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgbm8gbGFuZ3VhZ2Ugd2FzIHNwZWNpZmllZCBhbnl3aGVyZSwgYXNzdW1lIEphdmEKLQkJaWYgKGxhbmd1YWdlID09IG51bGwpCi0JCQlsYW5ndWFnZSA9IEpTUDExTmFtZXNwYWNlLkFUVFJfVkFMVUVfSkFWQTsKLQkJcmV0dXJuIGxhbmd1YWdlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0dGluZ1N0cmF0ZWd5SlNQSmF2YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOWIwMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2Zvcm1hdC9Gb3JtYXR0aW5nU3RyYXRlZ3lKU1BKYXZhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JQ29tcGlsYXRpb25Vbml0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFNb2RlbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5Ub29sRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuQ29kZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkZvcm1hdHRpbmdDb250ZXh0UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JRm9ybWF0dGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NYWxmb3JtZWRUcmVlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuVGV4dEVkaXQ7Ci0KLQotcHVibGljIGNsYXNzIEZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEgZXh0ZW5kcyBDb250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kgewotCi0JLyoqIERvY3VtZW50cyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmRG9jdW1lbnRzID0gbmV3IExpbmtlZExpc3QoKTsKLQkvKiogUGFydGl0aW9ucyB0byBiZSBmb3JtYXR0ZWQgYnkgdGhpcyBzdHJhdGVneSAqLwotCXByaXZhdGUgZmluYWwgTGlua2VkTGlzdCBmUGFydGl0aW9ucyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBqYXZhIGZvcm1hdHRpbmcgc3RyYXRlZ3kuCi0JICovCi0JcHVibGljIEZvcm1hdHRpbmdTdHJhdGVneUpTUEphdmEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdCgpIHsKLQkJc3VwZXIuZm9ybWF0KCk7Ci0KLQkJZmluYWwgSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgZkRvY3VtZW50cy5yZW1vdmVGaXJzdCgpOwotCQlmaW5hbCBUeXBlZFBvc2l0aW9uIHBhcnRpdGlvbiA9IChUeXBlZFBvc2l0aW9uKSBmUGFydGl0aW9ucy5yZW1vdmVGaXJzdCgpOwotCi0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIHBhcnRpdGlvbiAhPSBudWxsKSB7Ci0JCQl0cnkgewotCi0JCQkJSlNQVHJhbnNsYXRpb25VdGlsIHRyYW5zbGF0aW9uVXRpbCA9IG5ldyBKU1BUcmFuc2xhdGlvblV0aWwoZG9jdW1lbnQpOwotCQkJCUlDb21waWxhdGlvblVuaXQgY3UgPSB0cmFuc2xhdGlvblV0aWwuZ2V0Q29tcGlsYXRpb25Vbml0KCk7Ci0JCQkJaWYgKGN1ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGN1U291cmNlID0gY3UuZ2V0U291cmNlKCk7Ci0JCQkJCVRleHRFZGl0IHRleHRFZGl0ID0gZm9ybWF0U3RyaW5nKENvZGVGb3JtYXR0ZXIuS19DT01QSUxBVElPTl9VTklULCBjdVNvdXJjZSwgMCwgVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2N1bWVudCksIGdldFByZWZlcmVuY2VzKCkpOwotCi0JCQkJCVRleHRFZGl0IGpzcEVkaXQgPSB0cmFuc2xhdGlvblV0aWwuZ2V0VHJhbnNsYXRpb24oKS5nZXRKc3BFZGl0KHRleHRFZGl0KTsKLQkJCQkJaWYgKGpzcEVkaXQgIT0gbnVsbCAmJiBqc3BFZGl0Lmhhc0NoaWxkcmVuKCkpCi0JCQkJCQlqc3BFZGl0LmFwcGx5KGRvY3VtZW50KTsKLQkJCQl9Ci0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvLyBDYW4gb25seSBoYXBwZW4gb24gY29uY3VycmVudCBkb2N1bWVudCBtb2RpZmljYXRpb24gLSBsb2cKLQkJCQkvLyBhbmQgYmFpbCBvdXQKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCQljYXRjaCAoSmF2YU1vZGVsRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RhcnRzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RhcnRzKGNvbnRleHQpOwotCi0JCWZQYXJ0aXRpb25zLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QQVJUSVRJT04pKTsKLQkJZkRvY3VtZW50cy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLkNvbnRleHRCYXNlZEZvcm1hdHRpbmdTdHJhdGVneSNmb3JtYXR0ZXJTdG9wcygpCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0dGVyU3RvcHMoKSB7Ci0JCXN1cGVyLmZvcm1hdHRlclN0b3BzKCk7Ci0KLQkJZlBhcnRpdGlvbnMuY2xlYXIoKTsKLQkJZkRvY3VtZW50cy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBUZXh0RWRpdCBmb3JtYXRTdHJpbmcoaW50IGtpbmQsIFN0cmluZyBzdHJpbmcsIGludCBpbmRlbnRhdGlvbkxldmVsLCBTdHJpbmcgbGluZVNlcGFyYXRvciwgTWFwIG9wdGlvbnMpIHsKLQkJcmV0dXJuIFRvb2xGYWN0b3J5LmNyZWF0ZUNvZGVGb3JtYXR0ZXIob3B0aW9ucykuZm9ybWF0KGtpbmQsIHN0cmluZywgMCwgc3RyaW5nLmxlbmd0aCgpLCBpbmRlbnRhdGlvbkxldmVsLCBsaW5lU2VwYXJhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiNTAyNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhdGhFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JTG9jYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlcjsKLQotLyoqCi0gKiBFZGl0b3JJbnB1dCBmb3IgZXh0ZXJuYWwgZmlsZXMuIENvcGllZCBmcm9tCi0gKiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5lZGl0b3JzLnRleHQuSmF2YUZpbGVFZGl0b3JJbnB1dAotICovCi1jbGFzcyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbXBsZW1lbnRzIElFZGl0b3JJbnB1dCwgSUxvY2F0aW9uUHJvdmlkZXIgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGV4aXN0IGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkKLQkvKioKLQkgKiBUaGUgd29ya2JlbmNoIGFkYXB0ZXIgd2hpY2ggc2ltcGx5IHByb3ZpZGVzIHRoZSBsYWJlbC4KLQkgKiAKLQkgKiBAc2VlICBFY2xpcHNlIDMuMQotCSAqLwotCXByaXZhdGUgY2xhc3MgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAoKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvKS5nZXROYW1lKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGZGaWxlOwotCXByaXZhdGUgV29ya2JlbmNoQWRhcHRlciBmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQkJZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmRmlsZS5leGlzdHMoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJTG9jYXRpb25Qcm92aWRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCXJldHVybiBmV29ya2JlbmNoQWRhcHRlcjsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0I2dldFBhdGgoKQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICB9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQkJCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgSVBhdGhFZGl0b3JJbnB1dCBpbnB1dD0gKElQYXRoRWRpdG9ySW5wdXQpbzsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYXRoKCkuZXF1YWxzKGlucHV0LmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmRmlsZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjVkOTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIGV4dGVybmFsIGZpbGVzLgotICovCi1jbGFzcyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JCi0JcHJpdmF0ZSBJUmVnaW9uIGZIeXBlcmxpbmtSZWdpb247Ci0JcHJpdmF0ZSBGaWxlIGZIeXBlcmxpbmtGaWxlOwotCi0JcHVibGljIEV4dGVybmFsRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgRmlsZSBmaWxlKSB7Ci0JCWZIeXBlcmxpbmtGaWxlID0gZmlsZTsKLQkJZkh5cGVybGlua1JlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkh5cGVybGlua0ZpbGUgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEV4dGVybmFsRmlsZUVkaXRvcklucHV0KGZIeXBlcmxpbmtGaWxlKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCksIHRydWUpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOWY5NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBKU1AgSmF2YSBlbGVtZW50cwotICovCi1jbGFzcyBKU1BKYXZhSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJSmF2YUVsZW1lbnQgZkVsZW1lbnQ7Ci0KLQlwdWJsaWMgSlNQSmF2YUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgSUphdmFFbGVtZW50IGVsZW1lbnQpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkVsZW1lbnQgPSBlbGVtZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtSZWdpb24oKQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IEphdmFVSS5vcGVuSW5FZGl0b3IoZkVsZW1lbnQpOwotCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJSmF2YVVJLnJldmVhbEluRWRpdG9yKGVkaXRvciwgZkVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvSlNQSmF2YUh5cGVybGlua0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDQxZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9KU1BKYXZhSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JRmllbGQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklMb2NhbFZhcmlhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVNvdXJjZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklTb3VyY2VSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSmF2YU1vZGVsRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotICogRGV0ZWN0cyBoeXBlcmxpbmtzIGluIEpTUCBKYXZhIGNvbnRlbnQKLSAqLwotcHVibGljIGNsYXNzIEpTUEphdmFIeXBlcmxpbmtEZXRlY3RvciBpbXBsZW1lbnRzIElIeXBlcmxpbmtEZXRlY3RvciB7Ci0KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKElKYXZhRWxlbWVudCBlbGVtZW50LCBJUmVnaW9uIHJlZ2lvbiwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gb3BlbiBsb2NhbCB2YXJpYWJsZSBpbiB0aGUgSlNQIGZpbGUuLi4KLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVNvdXJjZVJlZmVyZW5jZSkgewotCQkJCUlGaWxlIGZpbGUgPSBudWxsOwotCQkJCWludCBqc3BPZmZzZXQgPSAwOwotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQotCQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJCXRyeSB7Ci0JCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJCVVSSVJlc29sdmVyIHJlc29sdmVyID0gc01vZGVsLmdldFJlc29sdmVyKCk7Ci0JCQkJCQlpZihyZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHVyaVN0cmluZyA9IHJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQkJCQkJCQlmaWxlID0gZ2V0RmlsZSh1cmlTdHJpbmcpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCi0JCQkJLy8gZ2V0IEphdmEgcmFuZ2UsIHRyYW5zbGF0ZSBjb29yZGluYXRlIHRvIEpTUAotCi0JCQkJdHJ5IHsKLQkJCQkJSVNvdXJjZVJhbmdlIHJhbmdlID0gbnVsbDsKLQkJCQkJSUpTUFRyYW5zbGF0aW9uIGpzcFRyYW5zbGF0aW9uID0gZ2V0SlNQVHJhbnNsYXRpb24oZG9jdW1lbnQpOwotCQkJCQlpZiAoanNwVHJhbnNsYXRpb24gIT0gbnVsbCkgewotCQkJCQkJLy8gbGluayB0byBsb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucwotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTG9jYWxWYXJpYWJsZSkgewotCQkJCQkJCXJhbmdlID0gKChJTG9jYWxWYXJpYWJsZSkgZWxlbWVudCkuZ2V0TmFtZVJhbmdlKCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBsaW5raW5nIHRvIGZpZWxkcyBvZiB0aGUgc2FtZSBjb21waWxhdGlvbiB1bml0Ci0JCQkJCQllbHNlIGlmIChlbGVtZW50LmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkZJRUxEKSB7Ci0JCQkJCQkJT2JqZWN0IGN1ID0gKChJRmllbGQpIGVsZW1lbnQpLmdldENvbXBpbGF0aW9uVW5pdCgpOwotCQkJCQkJCWlmIChjdSAhPSBudWxsICYmIGN1LmVxdWFscyhqc3BUcmFuc2xhdGlvbi5nZXRDb21waWxhdGlvblVuaXQoKSkpCi0JCQkJCQkJCXJhbmdlID0gKChJU291cmNlUmVmZXJlbmNlKSBlbGVtZW50KS5nZXRTb3VyY2VSYW5nZSgpOwotCQkJCQkJfQotCQkJCQkJLy8gbGlua2luZyB0byBtZXRob2RzIG9mIHRoZSBzYW1lIGNvbXBpbGF0aW9uIHVuaXQKLQkJCQkJCWVsc2UgaWYgKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSA9PSBJSmF2YUVsZW1lbnQuTUVUSE9EKSB7Ci0JCQkJCQkJT2JqZWN0IGN1ID0gKChJTWV0aG9kKSBlbGVtZW50KS5nZXRDb21waWxhdGlvblVuaXQoKTsKLQkJCQkJCQlpZiAoY3UgIT0gbnVsbCAmJiBjdS5lcXVhbHMoanNwVHJhbnNsYXRpb24uZ2V0Q29tcGlsYXRpb25Vbml0KCkpKQotCQkJCQkJCQlyYW5nZSA9ICgoSVNvdXJjZVJlZmVyZW5jZSkgZWxlbWVudCkuZ2V0U291cmNlUmFuZ2UoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCWlmIChyYW5nZSAhPSBudWxsICYmIGZpbGUgIT0gbnVsbCkgewotCQkJCQkJanNwT2Zmc2V0ID0ganNwVHJhbnNsYXRpb24uZ2V0SnNwT2Zmc2V0KHJhbmdlLmdldE9mZnNldCgpKTsKLQkJCQkJCWlmIChqc3BPZmZzZXQgPj0gMCkgewotCQkJCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhyZWdpb24sIGZpbGUsIG5ldyBSZWdpb24oanNwT2Zmc2V0LCByYW5nZS5nZXRMZW5ndGgoKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gam1lKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGptZS5nZXRNZXNzYWdlKCksIGptZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGxpbmsgPT0gbnVsbCkgewotCQkJCWxpbmsgPSBuZXcgSlNQSmF2YUh5cGVybGluayhyZWdpb24sIGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGlua0RldGVjdG9yI2RldGVjdEh5cGVybGlua3Mob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkJLy8gY2hlY2sgYW5kIG1ha2Ugc3VyZSB0aGlzIGlzIGEgdmFsaWQgSmF2YSB0eXBlCi0JCQlKU1BUcmFuc2xhdGlvbiBqc3BUcmFuc2xhdGlvbiA9IGdldEpTUFRyYW5zbGF0aW9uKGRvY3VtZW50KTsKLQkJCWlmIChqc3BUcmFuc2xhdGlvbiAhPSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgaWYgd2UgYXJlIGluIEpTUCBKYXZhIGNvbnRlbnQKLQkJCQlpbnQgamF2YU9mZnNldCA9IGpzcFRyYW5zbGF0aW9uLmdldEphdmFPZmZzZXQocmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQlpZiAoamF2YU9mZnNldCA+IC0xKSB7Ci0JCQkJCS8vIGNoZWNrIHRoYXQgd2UgYXJlIG5vdCBpbiBpbmRpcmVjdCBKYXZhIGNvbnRlbnQgKGxpa2UKLQkJCQkJLy8gaW5jbHVkZWQgZmlsZXMpCi0JCQkJCWlmICghanNwVHJhbnNsYXRpb24uaXNJbmRpcmVjdChqYXZhT2Zmc2V0KSkgewotCQkJCQkJLy8gZ2V0IEphdmEgZWxlbWVudHMKLQkJCQkJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0ganNwVHJhbnNsYXRpb24uZ2V0RWxlbWVudHNGcm9tSnNwUmFuZ2UocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJaWYgKGVsZW1lbnRzICE9IG51bGwgJiYgZWxlbWVudHMubGVuZ3RoID4gMCkgewotCQkJCQkJCS8vIGNyZWF0ZSBhIEpTUEphdmFIeXBlcmxpbmsgZm9yIGVhY2ggSmF2YSBlbGVtZW50Ci0JCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7ICsraSkgewotCQkJCQkJCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCi0JCQkJCQkJCS8vIGZpbmQgaHlwZXJsaW5rIHJhbmdlIGZvciBKYXZhIGVsZW1lbnQKLQkJCQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBzZWxlY3RXb3JkKGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCQlJSHlwZXJsaW5rIGxpbmsgPSBjcmVhdGVIeXBlcmxpbmsoZWxlbWVudCwgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCk7Ci0JCQkJCQkJCWlmIChsaW5rICE9IG51bGwpIHsKLQkJCQkJCQkJCWh5cGVybGlua3MuYWRkKGxpbmspOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBJRmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgaWYgcG9zc2libGUsIG51bGwgaWYgY2Fubm90IGZpbmQKLQkgKiBmaWxlIGZyb20gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybiByZXR1cm5zIElGaWxlIGlmIGZpbGVTdHJpbmcgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgZmlsZSA9PSBudWxsOyBpKyspCi0JCQkJaWYgKGZpbGVzW2ldLmV4aXN0cygpKQotCQkJCQlmaWxlID0gZmlsZXNbaV07Ci0JCX0KLQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0JLyoqCi0JICogR2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QKLQkgKiAKLQkgKiBAcmV0dXJuIEpTUFRyYW5zbGF0aW9uIGlmIG9uZSBleGlzdHMsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBKU1BUcmFuc2xhdGlvbiBnZXRKU1BUcmFuc2xhdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSlNQVHJhbnNsYXRpb24gdHJhbnNsYXRpb24gPSBudWxsOwotCi0JCUlET01Nb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl4bWxNb2RlbCA9IChJRE9NTW9kZWwpIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQl0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNsYXRpb247Ci0JfQotCi0JLyoqCi0JICogSmF2YSBhbHdheXMgc2VsZWN0cyB3b3JkIHdoZW4gZGVmaW5pbmcgcmVnaW9uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIGFuY2hvcgotCSAqIEByZXR1cm4gSVJlZ2lvbgotCSAqLwotCXByaXZhdGUgSVJlZ2lvbiBzZWxlY3RXb3JkKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGFuY2hvcikgewotCi0JCXRyeSB7Ci0JCQlpbnQgb2Zmc2V0ID0gYW5jaG9yOwotCQkJY2hhciBjOwotCi0JCQl3aGlsZSAob2Zmc2V0ID49IDApIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotCQkJCQlicmVhazsKLQkJCQktLW9mZnNldDsKLQkJCX0KLQotCQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCi0JCQlvZmZzZXQgPSBhbmNob3I7Ci0JCQlpbnQgbGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0KLQkJCXdoaWxlIChvZmZzZXQgPCBsZW5ndGgpIHsKLQkJCQljID0gZG9jdW1lbnQuZ2V0Q2hhcihvZmZzZXQpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotCQkJCQlicmVhazsKLQkJCQkrK29mZnNldDsKLQkJCX0KLQotCQkJaW50IGVuZCA9IG9mZnNldDsKLQotCQkJaWYgKHN0YXJ0ID09IGVuZCkKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCwgMCk7Ci0KLQkJCXJldHVybiBuZXcgUmVnaW9uKHN0YXJ0ICsgMSwgZW5kIC0gc3RhcnQgLSAxKTsKLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2MzRhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkh5cGVybGlua0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5VUkxIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVRMRFJlY29yZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklUYWdsaWJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5UYWdsaWJJbmRleDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGV4dC5JSlNQUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgZm9yIHRhZ2xpYnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdsaWJIeXBlcmxpbmtEZXRlY3RvciBpbXBsZW1lbnRzIElIeXBlcmxpbmtEZXRlY3RvciB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJodHRwOi8vIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IG51bGw7Ci0KLQkJaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCAmJiByZWdpb24gIT0gbnVsbCkgewotCQkJSURvY3VtZW50IGRvYyA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNoZWNrIGlmIGpzcCB0YWcvZGlyZWN0aXZlIGZpcnN0Ci0JCQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBUZXh0VXRpbGl0aWVzLmdldFBhcnRpdGlvbihkb2MsIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIHJlZ2lvbi5nZXRPZmZzZXQoKSwgZmFsc2UpOwotCQkJCQlpZiAocGFydGl0aW9uICE9IG51bGwgJiYgcGFydGl0aW9uLmdldFR5cGUoKSA9PSBJSlNQUGFydGl0aW9ucy5KU1BfRElSRUNUSVZFKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiBqc3AgdGFnbGliIGRpcmVjdGl2ZQotCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IGdldEN1cnJlbnROb2RlKGRvYywgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsICYmIGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSRUNUSVZFX1RBR0xJQi5lcXVhbHNJZ25vcmVDYXNlKGN1cnJlbnROb2RlLmdldE5vZGVOYW1lKCkpKSB7Ci0JCQkJCQkJLy8gZ2V0IHRoZSB1cmkgYXR0cmlidXRlCi0JCQkJCQkJQXR0ciB0YWdsaWJOb2RlID0gKChFbGVtZW50KSBjdXJyZW50Tm9kZSkuZ2V0QXR0cmlidXRlTm9kZShKU1AxMU5hbWVzcGFjZS5BVFRSX05BTUVfVVJJKTsKLQkJCQkJCQlJVGFnbGliUmVjb3JkIHJlZmVyZW5jZSA9IFRhZ2xpYkluZGV4LnJlc29sdmUoZ2V0QmFzZUxvY2F0aW9uRm9yVGFnbGliKGRvYyksIHRhZ2xpYk5vZGUuZ2V0VmFsdWUoKSwgZmFsc2UpOwotCQkJCQkJCWlmIChyZWZlcmVuY2UgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBoYW5kbGUgdGFnbGlicwotCQkJCQkJCQlzd2l0Y2ggKHJlZmVyZW5jZS5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQkJCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVExEKSA6IHsKLQkJCQkJCQkJCQlJVExEUmVjb3JkIHJlY29yZCA9IChJVExEUmVjb3JkKSByZWZlcmVuY2U7Ci0JCQkJCQkJCQkJU3RyaW5nIHVyaVN0cmluZyA9IHJlY29yZC5nZXRQYXRoKCkudG9TdHJpbmcoKTsKLQkJCQkJCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbih0YWdsaWJOb2RlKTsKLQkJCQkJCQkJCQloeXBlcmxpbmsgPSBjcmVhdGVIeXBlcmxpbmsodXJpU3RyaW5nLCBoeXBlcmxpbmtSZWdpb24sIGRvYywgdGFnbGliTm9kZSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOgotCQkJCQkJCQkJY2FzZSAoSVRhZ2xpYlJlY29yZC5VUkwpIDogewotCQkJCQkJCQkJCUlSZWdpb24gaHlwZXJsaW5rUmVnaW9uID0gZ2V0SHlwZXJsaW5rUmVnaW9uKHRhZ2xpYk5vZGUpOwotCQkJCQkJCQkJCWh5cGVybGluayA9IG5ldyBUYWdsaWJKYXJVcmlIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCByZWZlcmVuY2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGluayAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBJSHlwZXJsaW5rW117aHlwZXJsaW5rfTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwgKGlmIHdpdGhpbiB3b3Jrc3BhY2UsCi0JICogbG9jYXRpb24gaXMgcmVsYXRpdmUgdG8gd29ya3NwYWNlLCBvdGhlcndpc2UsIGZpbGUgc3lzdGVtIHBhdGgpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZUxvY2F0aW9uRm9yVGFnbGliKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQliYXNlTG9jID0gc01vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBiYXNlTG9jOwotCX0KLQotCS8vIHRoZSBiZWxvdyBtZXRob2RzIHdlcmUgY29waWVkIGZyb20gVVJJSHlwZXJsaW5rRGV0ZWN0b3IKLQotCXByaXZhdGUgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oTm9kZSBub2RlKSB7Ci0JCUlSZWdpb24gaHlwZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZXMKLQkJCQlJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0JCQkJLy8gZG8gbm90IGluY2x1ZGUgcXVvdGVzIGluIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQlpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dC5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCByZWdMZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzUXVvdGVkKGF0dFZhbHVlKSkgewotCQkJCQkJKytyZWdPZmZzZXQ7Ci0JCQkJCQlyZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotCQkJCQl9Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoeXBlclJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgd29ya3NwYWNlLXJlbGF0aXZlIHBhdGggdG8gYW4gZXhpc3RpbmcgZmlsZSBpbiB0aGUgd29ya3NwYWNlCi0JICogQHJldHVybiByZXR1cm5zIGV4aXN0aW5nIElGaWxlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCS8qCi0JCSAqIE5vdGUgYXQgdGhpcyBwb2ludCwgZmlsZVN0cmluZyBpcyBhbHJlYWR5IGd1YXJhbnRlZWQgdG8gYmUgcG9pbnRpbmcKLQkJICogdG8gYW4gZXhpc3RpbmcgZmlsZSBpbiB0aGUgd29ya3NwYWNlLCBzbyB3ZSBjYW4ganVzdCBjYWxsIGdldEZpbGUuCi0JCSAqLwotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGh5cGVybGluawotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcGFyYW0gaHlwZXJsaW5rUmVnaW9uCi0JICogQHJldHVybiBJSHlwZXJsaW5rCi0JICovCi0JcHJpdmF0ZSBJSHlwZXJsaW5rIGNyZWF0ZUh5cGVybGluayhTdHJpbmcgdXJpU3RyaW5nLCBJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiwgSURvY3VtZW50IGRvY3VtZW50LCBOb2RlIG5vZGUpIHsKLQkJSUh5cGVybGluayBsaW5rID0gbnVsbDsKLQotCQlpZiAodXJpU3RyaW5nICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZW1wID0gdXJpU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcC5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKSB7Ci0JCQkJLy8gdGhpcyBpcyBhIFVSTEh5cGVybGluayBzaW5jZSB0aGlzIGlzIGEgd2ViIGFkZHJlc3MKLQkJCQlsaW5rID0gbmV3IFVSTEh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHVyaVN0cmluZyk7Ci0JCQl9Ci0KLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZQotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUodXJpU3RyaW5nKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkvLyB0aGlzIGlzIGEgV29ya3NwYWNlRmlsZUh5cGVybGluayBzaW5jZSBmaWxlIGV4aXN0cyBpbgotCQkJCS8vIHdvcmtzcGFjZQotCQkJCWxpbmsgPSBuZXcgV29ya3NwYWNlRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGZpbGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhpcyBpcyBhbiBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgc2luY2UgZmlsZSBkb2VzIG5vdCBleGlzdAotCQkJCS8vIGluIHdvcmtzcGFjZQotCQkJCUZpbGUgZXh0ZXJuYWxGaWxlID0gbmV3IEZpbGUodXJpU3RyaW5nKTsKLQkJCQlsaW5rID0gbmV3IEV4dGVybmFsRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIGV4dGVybmFsRmlsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBub2RlIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IG9uIGluIHRoZSBkb2N1bWVudC4gbnVsbCBpZiBubwotCSAqIG5vZGUgaXMgc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBOb2RlIGVpdGhlciBlbGVtZW50LCBkb2N0eXBlLCB0ZXh0LCBvciBudWxsCi0JICovCi0JcHJpdmF0ZSBOb2RlIGdldEN1cnJlbnROb2RlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQkvLyBnZXQgdGhlIGN1cnJlbnQgbm9kZSBhdCB0aGUgb2Zmc2V0IChyZXR1cm5zIGVpdGhlcjogZWxlbWVudCwKLQkJLy8gZG9jdHlwZSwgdGV4dCkKLQkJSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQkJaWYgKGlub2RlID09IG51bGwpCi0JCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQotCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gKE5vZGUpIGlub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFySHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1RhZ2xpYkphckh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzYyOTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFySHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgdGFnbGliIGZpbGVzIGluIGphcnMuCi0gKi8KLWNsYXNzIFRhZ2xpYkphckh5cGVybGluayBpbXBsZW1lbnRzIElIeXBlcmxpbmsgewotCXN0YXRpYyBjbGFzcyBaaXBTdG9yYWdlIGltcGxlbWVudHMgSVN0b3JhZ2UgewotCQlGaWxlIGZGaWxlID0gbnVsbDsKLQkJU3RyaW5nIGZFbnRyeU5hbWUgPSBudWxsOwotCi0JCVppcFN0b3JhZ2UoRmlsZSBmaWxlLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCQlmRmlsZSA9IGZpbGU7Ci0JCQlmRW50cnlOYW1lID0gZW50cnlOYW1lOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJWmlwRmlsZSBmaWxlID0gbmV3IFppcEZpbGUoZkZpbGUpOwotCQkJCVppcEVudHJ5IGVudHJ5ID0gZmlsZS5nZXRFbnRyeShmRW50cnlOYW1lKTsKLQkJCQlzdHJlYW0gPSBmaWxlLmdldElucHV0U3RyZWFtKGVudHJ5KTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBDb3JlRXhjZXB0aW9uKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBnZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGUpKTsKLQkJCX0KLQkJCXJldHVybiBzdHJlYW07Ci0JCX0KLQotCQlwdWJsaWMgSVBhdGggZ2V0RnVsbFBhdGgoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyBJUGF0aC5TRVBBUkFUT1IgKyBmRW50cnlOYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJCXJldHVybiBmRW50cnlOYW1lOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNSZWFkT25seSgpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJUGF0aCBmWmlwRmlsZVBhdGg7Ci0KLQlwdWJsaWMgVGFnbGliSmFySHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJUGF0aCB6aXBGaWxlUGF0aCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmWmlwRmlsZVBhdGggPSB6aXBGaWxlUGF0aDsKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oKSB7Ci0JCXJldHVybiBmUmVnaW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRUeXBlTGFiZWwoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZUxhYmVsKCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluayNnZXRIeXBlcmxpbmtUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEh5cGVybGlua1RleHQoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFVSTEZpbGVIeXBlcmxpbmsuU3RvcmFnZUVkaXRvcklucHV0KG5ldyBaaXBTdG9yYWdlKGZaaXBGaWxlUGF0aC50b0ZpbGUoKSwgIk1FVEEtSU5GL3RhZ2xpYi50bGQiKSk7IC8vJE5PTi1OTFMtMSQKLQkJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQkJdHJ5IHsKLQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCkpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJVcmlIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVGFnbGliSmFyVXJpSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjcwODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9UYWdsaWJKYXJVcmlIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGFnbGliLklKYXJSZWNvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLnRhZ2xpYi5JVGFnbGliUmVjb3JkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50YWdsaWIuSVVSTFJlY29yZDsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIHRhZ2xpYiBmaWxlcyBpbiBqYXJzIG9yIHNwZWNpZmllZCBieSB1cmxzLgotICovCi1jbGFzcyBUYWdsaWJKYXJVcmlIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQlwcml2YXRlIElUYWdsaWJSZWNvcmQgZlRhZ2xpYlJlY29yZDsKLQlwcml2YXRlIElIeXBlcmxpbmsgZkh5cGVybGluazsKLQotCXB1YmxpYyBUYWdsaWJKYXJVcmlIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElUYWdsaWJSZWNvcmQgcmVjb3JkKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZUYWdsaWJSZWNvcmQgPSByZWNvcmQ7Ci0JfQotCi0JcHJpdmF0ZSBJSHlwZXJsaW5rIGdldEh5cGVybGluaygpIHsKLQkJaWYgKGZIeXBlcmxpbmsgPT0gbnVsbCAmJiBmVGFnbGliUmVjb3JkICE9IG51bGwpIHsKLQkJCXN3aXRjaCAoZlRhZ2xpYlJlY29yZC5nZXRSZWNvcmRUeXBlKCkpIHsKLQkJCQljYXNlIChJVGFnbGliUmVjb3JkLkpBUikgOiB7Ci0JCQkJCUlKYXJSZWNvcmQgcmVjb3JkID0gKElKYXJSZWNvcmQpIGZUYWdsaWJSZWNvcmQ7Ci0JCQkJCWZIeXBlcmxpbmsgPSBuZXcgVGFnbGliSmFySHlwZXJsaW5rKGZSZWdpb24sIHJlY29yZC5nZXRMb2NhdGlvbigpKTsKLQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgKElUYWdsaWJSZWNvcmQuVVJMKSA6IHsKLQkJCQkJSVVSTFJlY29yZCByZWNvcmQgPSAoSVVSTFJlY29yZCkgZlRhZ2xpYlJlY29yZDsKLQkJCQkJZkh5cGVybGluayA9IG5ldyBVUkxGaWxlSHlwZXJsaW5rKGZSZWdpb24sIHJlY29yZC5nZXRVUkwoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmSHlwZXJsaW5rOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJSVJlZ2lvbiByZWdpb24gPSBudWxsOwotCi0JCUlIeXBlcmxpbmsgbGluayA9IGdldEh5cGVybGluaygpOwotCQlpZiAobGluayAhPSBudWxsKSB7Ci0JCQlyZWdpb24gPSBsaW5rLmdldEh5cGVybGlua1JlZ2lvbigpOwotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBnZXRIeXBlcmxpbmsoKTsKLQkJaWYgKGxpbmsgIT0gbnVsbCkgewotCQkJbGluay5vcGVuKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1VSTEZpbGVIeXBlcmxpbmsuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UwMTZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvVVJMRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotCi0vKioKLSAqIEh5cGVybGluayBmb3IgVVJMcyAob3BlbnMgaW4gcmVhZC1vbmx5IG1vZGUpCi0gKi8KLWNsYXNzIFVSTEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlzdGF0aWMgY2xhc3MgU3RvcmFnZUVkaXRvcklucHV0IGltcGxlbWVudHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0JCUlTdG9yYWdlIGZTdG9yYWdlID0gbnVsbDsKLQotCQlTdG9yYWdlRWRpdG9ySW5wdXQoSVN0b3JhZ2Ugc3RvcmFnZSkgewotCQkJZlN0b3JhZ2UgPSBzdG9yYWdlOwotCQl9Ci0KLQkJcHVibGljIElTdG9yYWdlIGdldFN0b3JhZ2UoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCQlyZXR1cm4gZlN0b3JhZ2UuZ2V0RnVsbFBhdGgoKSAhPSBudWxsID8gZlN0b3JhZ2UuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpIDogZlN0b3JhZ2UuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCQotCXN0YXRpYyBjbGFzcyBVUkxTdG9yYWdlIGltcGxlbWVudHMgSVN0b3JhZ2UgewotCQlVUkwgZlVSTCA9IG51bGw7Ci0KLQkJVVJMU3RvcmFnZShVUkwgdXJsKSB7Ci0JCQlmVVJMID0gdXJsOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3RyZWFtID0gZlVSTC5vcGVuU3RyZWFtKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl0aHJvdyBuZXcgQ29yZUV4Y2VwdGlvbihuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgSVN0YXR1cy5FUlJPUiwgZlVSTC50b1N0cmluZygpLCBlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RyZWFtOwotCQl9Ci0KLQkJcHVibGljIElQYXRoIGdldEZ1bGxQYXRoKCkgewotCQkJcmV0dXJuIG5ldyBQYXRoKGZVUkwudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gbmV3IFBhdGgoZlVSTC5nZXRGaWxlKCkpLmxhc3RTZWdtZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3MgYWRhcHRlcikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBmUmVnaW9uOwotCXByaXZhdGUgVVJMIGZVUkw7Ci0KLQlwdWJsaWMgVVJMRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgVVJMIHVybCkgewotCQlmUmVnaW9uID0gcmVnaW9uOwotCQlmVVJMID0gdXJsOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZSZWdpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldFR5cGVMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rI2dldEh5cGVybGlua1RleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjb3BlbigpCi0JICovCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZVUkwgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IFN0b3JhZ2VFZGl0b3JJbnB1dChuZXcgVVJMU3RvcmFnZShmVVJMKSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3YWFhMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBmaWxlcyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gKEFzIGxvbmcgYXMgdGhlcmUgaXMgYW4gSUZpbGUsCi0gKiB0aGlzIGNhbiBiZSB1c2VkKSBPcGVucyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIHRoZSBmaWxlLgotICovCi1jbGFzcyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkhpZ2hsaWdodFJhbmdlOwotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlLCBJUmVnaW9uIHJhbmdlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQkJZkhpZ2hsaWdodFJhbmdlID0gcmFuZ2U7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmRmlsZSAhPSBudWxsICYmIGZGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmRmlsZSwgdHJ1ZSk7Ci0JCQkJLy8gaGlnaGxpZ2h0IHJhbmdlIGluIGVkaXRvciBpZiBwb3NzaWJsZQotCQkJCWlmIChmSGlnaGxpZ2h0UmFuZ2UgIT0gbnVsbCAmJiBlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkoKElUZXh0RWRpdG9yKSBlZGl0b3IpLnNldEhpZ2hsaWdodFJhbmdlKGZIaWdobGlnaHRSYW5nZS5nZXRPZmZzZXQoKSwgZkhpZ2hsaWdodFJhbmdlLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmVlODk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5VUkxIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIERldGVjdHMgaHlwZXJsaW5rcyBpbiBYTUwgdGFncy4gSW5jbHVkZXMgZGV0ZWN0aW9uIGluIERPQ1RZUEUgYW5kIGF0dHJpYnV0ZQotICogdmFsdWVzLiBSZXNvbHZlcyByZWZlcmVuY2VzIHRvIHNjaGVtYXMsIGR0ZHMsIGV0YyB1c2luZyB0aGUgQ29tbW9uIFVSSQotICogUmVzb2x2ZXIuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTEh5cGVybGlua0RldGVjdG9yIGltcGxlbWVudHMgSUh5cGVybGlua0RldGVjdG9yIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OID0gIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhTSV9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBoeXBlcmxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbgotCSAqIEByZXR1cm4gSUh5cGVybGluawotCSAqLwotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoU3RyaW5nIHVyaVN0cmluZywgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBub2RlKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0KLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKSB7Ci0JCQlsaW5rID0gbmV3IFVSTEh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHVyaVN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCUZpbGUgc3lzdGVtRmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoc3lzdGVtRmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN5c3RlbVBhdGggPSBzeXN0ZW1GaWxlLmdldFBhdGgoKTsKLQkJCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShzeXN0ZW1QYXRoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZXhpc3RzIGluCi0JCQkJCS8vIHdvcmtzcGFjZQotCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBmaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgaXMgYW4gRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZG9lcyBub3QKLQkJCQkJLy8gZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgc3lzdGVtRmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCS8vIGZvciBub3csIG9ubHkgY2FwYWJsZSBvZiBjcmVhdGluZyAxIGh5cGVybGluawotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCU5vZGUgY3VycmVudE5vZGUgPSBnZXRDdXJyZW50Tm9kZShkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaVN0cmluZyA9IG51bGw7Ci0JCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJLy8gZG9jdHlwZSBub2RlcwotCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudE5vZGUsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkvLyBlbGVtZW50IG5vZGVzCi0JCQkJCUF0dHIgY3VycmVudEF0dHIgPSBnZXRDdXJyZW50QXR0ck5vZGUoY3VycmVudE5vZGUsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBsaW5rIGZvciBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJLy8gcmVzb2x2ZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJLy8gdmVyaWZ5IHZhbGlkaXR5IG9mIHVyaSBzdHJpbmcKLQkJCQkJCWlmICh1cmlTdHJpbmcgPT0gbnVsbCB8fCAhaXNWYWxpZFVSSSh1cmlTdHJpbmcpKQotCQkJCQkJCS8vIHJlc2V0IGN1cnJlbnQgYXR0cmlidXRlCi0JCQkJCQkJY3VycmVudEF0dHIgPSBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChjdXJyZW50QXR0ciA9PSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBhIGxpbmthYmxlIGF0dHJpYnV0ZSB3aXRoaW4gZWxlbWVudAotCQkJCQkJY3VycmVudEF0dHIgPSBnZXRMaW5rYWJsZUF0dHIoKEVsZW1lbnQpIGN1cnJlbnROb2RlKTsKLQkJCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnRBdHRyLCBkb2N1bWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUgPSBjdXJyZW50QXR0cjsKLQkJCQl9Ci0JCQkJLy8gdHJ5IHRvIGNyZWF0ZSBoeXBlcmxpbmsgZnJvbSBpbmZvcm1hdGlvbiBnYXRoZXJlZAotCQkJCWlmICh1cmlTdHJpbmcgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsICYmIGlzVmFsaWRVUkkodXJpU3RyaW5nKSkgewotCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihjdXJyZW50Tm9kZSk7Ci0JCQkJCUlIeXBlcmxpbmsgaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKHVyaVN0cmluZywgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCwgY3VycmVudE5vZGUpOwotCQkJCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpIHsKLQkJCQkJCWh5cGVybGlua3MuYWRkKGh5cGVybGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwgKGxvY2FsIGZpbGUgc3lzdGVtKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEJhc2VMb2NhdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCWlmIChsb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCQliYXNlTG9jID0gbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJCQliYXNlTG9jID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGxvY2F0aW9uKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGxvY2F0aW9uKS50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZUxvYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENNRWxlbWVudERlY2xhcmF0aW9uIGZvciBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCWVkID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBub2RlIHdpdGhpbiBub2RlIGF0IG9mZnNldAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gQXR0cgotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRDdXJyZW50QXR0ck5vZGUoTm9kZSBub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgobm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuY29udGFpbnMob2Zmc2V0KSAmJiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBhdHRyaWJ1dGUgaW4gbm9kZSBhbmQgaWYgYXR0cmlidXRlIGNvbnRhaW5zCi0JCQkvLyBvZmZzZXQsIHJldHVybiB0aGF0IGF0dHJpYnV0ZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkJLy8gYXNzdW1wdGlvbiB0aGF0IGlmIHBhcmVudCBub2RlIGlzIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbiwKLQkJCQkvLyB0aGVuIGl0cyBhdHRyaWJ1dGVzIHdpbGwgYWxzbyBiZSBvZiB0eXBlIEluZGV4ZWRSZWdpb24KLQkJCQlJbmRleGVkUmVnaW9uIGF0dFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBhdHRycy5pdGVtKGkpOwotCQkJCWlmIChhdHRSZWdpb24uY29udGFpbnMob2Zmc2V0KSkgewotCQkJCQlyZXR1cm4gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JCQlpZiAoaW5vZGUgPT0gbnVsbCkKLQkJCQlpbm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCAtIDEpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCi0JCWlmIChpbm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJldHVybiAoTm9kZSkgaW5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBJRmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgaWYgcG9zc2libGUsIG51bGwgaWYgY2Fubm90IGZpbmQKLQkgKiBmaWxlIGZyb20gdXJpLgotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICogICAgICAgICAgICBmaWxlIHN5c3RlbSBwYXRoCi0JICogQHJldHVybiByZXR1cm5zIElGaWxlIGlmIGZpbGVTdHJpbmcgZXhpc3RzIGluIHRoZSB3b3Jrc3BhY2UKLQkgKi8KLQlwcml2YXRlIElGaWxlIGdldEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0KLQkJaWYgKGZpbGVTdHJpbmcgIT0gbnVsbCkgewotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgoZmlsZVN0cmluZykpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGggJiYgZmlsZSA9PSBudWxsOyBpKyspCi0JCQkJaWYgKGZpbGVzW2ldLmV4aXN0cygpKQotCQkJCQlmaWxlID0gZmlsZXNbaV07Ci0JCX0KLQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBmaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgdXJpU3RyaW5nIGlzIG5vdCBodHRwOi8vCi0JICogQHJldHVybiBGaWxlIGNyZWF0ZWQgZnJvbSB1cmlTdHJpbmcgaWYgcG9zc2libGUsIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBGaWxlIGdldEZpbGVGcm9tVXJpU3RyaW5nKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIGZpcnN0IGp1c3QgdHJ5IHRvIGNyZWF0ZSBhIGZpbGUgZGlyZWN0bHkgZnJvbSB1cmlTdHJpbmcgYXMKLQkJCS8vIGRlZmF1bHQgaW4gY2FzZSBjcmVhdGUgZmlsZSBmcm9tIHVyaSBkb2VzIG5vdCB3b3JrCi0JCQlmaWxlID0gbmV3IEZpbGUodXJpU3RyaW5nKTsKLQotCQkJLy8gdHJ5IHRvIGNyZWF0ZSBmaWxlIGZyb20gdXJpCi0JCQlVUkkgdXJpID0gbmV3IFVSSSh1cmlTdHJpbmcpOwotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBleGNlcHRpb24gaXMgdGhyb3duIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgRmlsZSBqdXN0IGlnbm9yZQotCQkJLy8gYW5kIGZpbGUgd2lsbCBiZSBudWxsCi0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbihOb2RlIG5vZGUpIHsKLQkJSVJlZ2lvbiBoeXBlclJlZ2lvbiA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQkJCUlET01Ob2RlIGRvY05vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgZG9jTm9kZS5nZXRFbmRPZmZzZXQoKSAtIGRvY05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlcwotCQkJCUlET01BdHRyIGF0dCA9IChJRE9NQXR0cikgbm9kZTsKLQkJCQkvLyBkbyBub3QgaW5jbHVkZSBxdW90ZXMgaW4gYXR0cmlidXRlIHZhbHVlIHJlZ2lvbgotCQkJCWludCByZWdPZmZzZXQgPSBhdHQuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0LmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IHJlZ0xlbmd0aCA9IHZhbHVlUmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQkJCQkJU3RyaW5nIGF0dFZhbHVlID0gYXR0LmdldFZhbHVlUmVnaW9uVGV4dCgpOwotCQkJCQlpZiAoU3RyaW5nVXRpbHMuaXNRdW90ZWQoYXR0VmFsdWUpKSB7Ci0JCQkJCQkrK3JlZ09mZnNldDsKLQkJCQkJCXJlZ0xlbmd0aCA9IHJlZ0xlbmd0aCAtIDI7Ci0JCQkJCX0KLQkJCQkJaHlwZXJSZWdpb24gPSBuZXcgUmVnaW9uKHJlZ09mZnNldCwgcmVnTGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGh5cGVyUmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEF0dGVtcHRzIHRvIGZpbmQgYW4gYXR0cmlidXRlIHdpdGhpbiBlbGVtZW50IHRoYXQgaXMgb3BlbmFibGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcmV0dXJuIEF0dHIgYXR0cmlidXRlIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG9wZW4gb24sIG51bGwgaWYgbm8KLQkgKiAgICAgICAgIGF0dHJpYnV0ZSBjb3VsZCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRMaW5rYWJsZUF0dHIoRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCS8vIGdldCB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGlzIG5vZGUKLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkgewotCQkJLy8gY2hlY2sgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIgotCQkJQXR0ciBhdHQgPSAoQXR0cikgYXR0cnMuaXRlbShpKTsKLQkJCWlmIChpc0xpbmthYmxlQXR0cihhdHQsIGVkKSkgewotCQkJCXJldHVybiBhdHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRmluZCB0aGUgbG9jYXRpb24gaGludCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZVVSSSBpZiBpdCBleGlzdHMKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudE5vZGUgLQotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gbmFtZXNwYWNlVVJJIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBsb2NhdGlvbiBoaW50IChzeXN0ZW1JZCkgaWYgaXQgd2FzIGZvdW5kLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldExvY2F0aW9uSGludChFbGVtZW50IGVsZW1lbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCUF0dHIgc2NoZW1hTG9jTm9kZSA9IGVsZW1lbnROb2RlLmdldEF0dHJpYnV0ZU5vZGVOUyhYU0lfTkFNRVNQQUNFX1VSSSwgU0NIRU1BX0xPQ0FUSU9OKTsKLQkJaWYgKHNjaGVtYUxvY05vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzY2hlbWFMb2NOb2RlLmdldFZhbHVlKCkpOwotCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJLy8gZm91bmQgbG9jYXRpb24gaGludAotCQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzSWdub3JlQ2FzZShwdWJsaWNJZCkpCi0JCQkJCXJldHVybiBzeXN0ZW1JZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFVSSVN0cmluZyhOb2RlIG5vZGUsIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgcmVzb2x2ZWRVUkkgPSBudWxsOwotCQkvLyBuZWVkIHRoZSBiYXNlIGxvY2F0aW9uLCBwdWJsaWNJZCwgYW5kIHN5c3RlbUlkIGZvciBVUklSZXNvbHZlcgotCQlTdHJpbmcgYmFzZUxvYyA9IG51bGw7Ci0JCVN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IG51bGw7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCS8vIGhhbmRsZSBkb2MgdHlwZSBub2RlCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0JCQlwdWJsaWNJZCA9ICgoRG9jdW1lbnRUeXBlKSBub2RlKS5nZXRQdWJsaWNJZCgpOwotCQkJc3lzdGVtSWQgPSAoKERvY3VtZW50VHlwZSkgbm9kZSkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkvLyBoYW5kbGUgYXR0cmlidXRlIG5vZGUKLQkJCUF0dHIgYXR0ck5vZGUgPSAoQXR0cikgbm9kZTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJOb2RlLmdldE5hbWUoKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBhdHRyTm9kZS5nZXRWYWx1ZSgpOwotCQkJYXR0clZhbHVlID0gU3RyaW5nVXRpbHMuc3RyaXAoYXR0clZhbHVlKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCAmJiBhdHRyVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYmFzZUxvYyA9IGdldEJhc2VMb2NhdGlvbihkb2N1bWVudCk7Ci0KLQkJCQkvLyBoYW5kbGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JCQkJU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ck5hbWUpOwotCQkJCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCXB1YmxpY0lkID0gYXR0clZhbHVlOwotCQkJCQlzeXN0ZW1JZCA9IGdldExvY2F0aW9uSGludChhdHRyTm9kZS5nZXRPd25lckVsZW1lbnQoKSwgcHVibGljSWQpOwotCQkJCQlpZiAoc3lzdGVtSWQgPT0gbnVsbCkgewotCQkJCQkJc3lzdGVtSWQgPSBhdHRyVmFsdWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKFhTSV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKGF0dHJOb2RlKSkpICYmIChTQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCQkJLy8gZm9yIG5vdyBqdXN0IHVzZSB0aGUgZmlyc3QgcGFpcgotCQkJCQkvLyBuZWVkIHRvIGxvb2sgaW50byBiZWluZyBtb3JlIHByZWNpc2UKLQkJCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUpOwotCQkJCQlwdWJsaWNJZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkJc3lzdGVtSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCS8vIGVsc2UgY2hlY2sgaWYgeG1sbnMgcHVibGljSWQgPSB2YWx1ZQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3lzdGVtSWQgPSBhdHRyVmFsdWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmVzb2x2ZWRVUkkgPSByZXNvbHZlVVJJKGJhc2VMb2MsIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCXJldHVybiByZXNvbHZlZFVSSTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyB1cmlTdHJpbmcgaXMgYW4gaHR0cCBzdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHJldHVybiB0cnVlIGlmIHVyaVN0cmluZyBpcyBodHRwIHN0cmluZywgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSHR0cChTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCWJvb2xlYW4gaXNIdHRwID0gZmFsc2U7Ci0JCWlmICh1cmlTdHJpbmcgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRlbXBTdHJpbmcgPSB1cmlTdHJpbmcudG9Mb3dlckNhc2UoKTsKLQkJCWlmICh0ZW1wU3RyaW5nLnN0YXJ0c1dpdGgoSFRUUF9QUk9UT0NPTCkpCi0JCQkJaXNIdHRwID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gaXNIdHRwOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIGF0dHJpYnV0ZSBpcyBvcGVuYWJsZS4gQXR0cmlidXRlIGlzIG9wZW5hYmxlCi0JICogaWYgaXQgaXMgYSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gYXR0cmlidXRlIG9yIGlmIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMKLQkgKiBvZiB0eXBlIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cgotCSAqICAgICAgICAgICAgY2Fubm90IGJlIG51bGwKLQkgKiBAcGFyYW0gY21FbGVtZW50Ci0JICogICAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSAoY2FuIGJlCi0JICogICAgICAgICAgICBudWxsKQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGF0dHJpYnV0ZSBpcyAib3Blbk9uLWFibGUiIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0xpbmthYmxlQXR0cihBdHRyIGF0dHIsIENNRWxlbWVudERlY2xhcmF0aW9uIGNtRWxlbWVudCkgewotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgoYXR0ck5hbWUpOwotCQlTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ck5hbWUpOwotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIGlzIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotCQlpZiAoKFhNTE5TLmVxdWFscyhwcmVmaXgpKSB8fCAoWE1MTlMuZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIGNvbnRhaW5zIHNjaGVtYSBsb2NhdGlvbgotCQlpZiAoKFhTSV9OQU1FU1BBQ0VfVVJJLmVxdWFscyhET01OYW1lc3BhY2VIZWxwZXIuZ2V0TmFtZXNwYWNlVVJJKGF0dHIpKSkgJiYgKChTQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkgfHwgKE5PX05BTUVTUEFDRV9TQ0hFTUFfTE9DQVRJT04uZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSB2YWx1ZSBpcyBvZiB0eXBlIFVSSQotCQlpZiAoY21FbGVtZW50ICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21FbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQkJaWYgKChhdHRyRGVjbCAhPSBudWxsKSAmJiAoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSAmJiAoQ01EYXRhVHlwZS5VUkkuZXF1YWxzKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkpKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdXJpU3RyaW5nIGlzIHJlYWxseSBwb2ludGluZyB0byBhIGZpbGUKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRVUkkoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLQotCQlpZiAoaXNIdHRwKHVyaVN0cmluZykpCi0JCQlpc1ZhbGlkID0gdHJ1ZTsKLQkJZWxzZSB7Ci0JCQlGaWxlIGZpbGUgPSBnZXRGaWxlRnJvbVVyaVN0cmluZyh1cmlTdHJpbmcpOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlpc1ZhbGlkID0gZmlsZS5pc0ZpbGUoKTsKLQkJfQotCQlyZXR1cm4gaXNWYWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJJIGluZm9ybWF0aW9uCi0JICogCi0JICogQHBhcmFtIGJhc2VMb2NhdGlvbgotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqIEByZXR1cm4gU3RyaW5nIHJlc29sdmVkIHVyaS4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCS8vIGRvbnQgcmVzb2x2ZSBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gcmVzb2x2ZQotCQlpZiAoKGJhc2VMb2NhdGlvbiA9PSBudWxsKSAmJiAocHVibGljSWQgPT0gbnVsbCkgJiYgKHN5c3RlbUlkID09IG51bGwpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0Jhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwNWY0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuRG9jdW1lbnRDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk1hbGZvcm1lZFRyZWVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuUmVwbGFjZUVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5UZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLldvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRTdHJlYW1DcmVhdG9yOwotCi0vKioKLSAqIENyZWF0ZXMgZG9jdW1lbnQgY2hhbmdlKHMpIGZvciBhbiBJSmF2YUVsZW1lbnQgcmVuYW1lLgotICogQ2hhbmdlcyBhcmUgY3JlYXRlZCBmb3IgZXZlcnkgdHlwZSAibWF0Y2giIGluIHRoZSB3b3Jrc3BhY2UKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yIHsKLQkKLQkvKioKLQkgKiBXb3Jrc3BhY2Ugb3BlcmF0aW9uIHRvIHBlcmZvcm0gc2F2ZSBvbiBtb2RlbCBmb3IgdXBkYXRlZCBkb2N1bWVudHMuCi0JICogU2hvdWxkIG9ubHkgYmUgZG9uZSBvbiBtb2RlbHMgbm90IG9wZW4gaW4gYW4gZWRpdG9yLgotCSAqLwotCXByaXZhdGUgY2xhc3MgU2F2ZUpzcEZpbGVPcCBleHRlbmRzIFdvcmtzcGFjZU1vZGlmeU9wZXJhdGlvbiB7Ci0JCQotCQlwcml2YXRlIElEb2N1bWVudCBmSlNQRG9jID0gbnVsbDsKLQkJcHJpdmF0ZSBJRmlsZSBmSlNQRmlsZSA9IG51bGw7Ci0JCQotCQlwdWJsaWMgU2F2ZUpzcEZpbGVPcChJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jKSB7Ci0JCQl0aGlzLmZKU1BEb2MgPSBqc3BEb2M7Ci0JCQl0aGlzLmZKU1BGaWxlID0ganNwRmlsZTsKLQkJfQotCQkKLQkJcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZShJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCQkKLQkJCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zNzY1Ci0JCQkvLyBzYXZlIGZpbGUgdy8gbm8gaW50ZXJtZWRpYXRlIG1vZGVsIGNyZWF0aW9uCi0JCQkKLQkJCUNvZGVkU3RyZWFtQ3JlYXRvciBjb2RlZFN0cmVhbUNyZWF0b3IgPSBuZXcgQ29kZWRTdHJlYW1DcmVhdG9yKCk7Ci0JCQlSZWFkZXIgcmVhZGVyID0gbmV3IERvY3VtZW50UmVhZGVyKHRoaXMuZkpTUERvYyk7Ci0JCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KHRoaXMuZkpTUEZpbGUsIHJlYWRlcik7Ci0JCQkKLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBjb2RlZEJ5dGVTdHJlYW0gPSBudWxsOwotCQkJSW5wdXRTdHJlYW0gY29kZWRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb2RlZEJ5dGVTdHJlYW0gPSBjb2RlZFN0cmVhbUNyZWF0b3IuZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQljb2RlZFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb2RlZEJ5dGVTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQkJaWYgKHRoaXMuZkpTUEZpbGUuZXhpc3RzKCkpCi0JCQkJCXRoaXMuZkpTUEZpbGUuc2V0Q29udGVudHMoY29kZWRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5mSlNQRmlsZS5jcmVhdGUoY29kZWRTdHJlYW0sIGZhbHNlLCBudWxsKTsKLQkJCQkKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmKGNvZGVkQnl0ZVN0cmVhbSAhPSBudWxsKQotCQkJCQkJY29kZWRCeXRlU3RyZWFtLmNsb3NlKCk7Ci0JCQkJCWlmKGNvZGVkU3RyZWFtICE9IG51bGwpCi0JCQkJCQljb2RlZFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0JCQkJCS8vIHVubGlrZWx5Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8vIGVuZCBpbm5lciBjbGFzcyBTYXZlSnNwRmlsZU9wCi0JCi0JLyoqCi0JICogQ2hhbmdlIGNsYXNzIHRoYXQgd3JhcHMgYSB0ZXh0IGVkaXQgb24gdGhlIGpzcCBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgY2xhc3MgUmVuYW1lQ2hhbmdlIGV4dGVuZHMgRG9jdW1lbnRDaGFuZ2UgewotCi0JCXByaXZhdGUgVGV4dEVkaXQgZkVkaXQgPSBudWxsOwotCQlwcml2YXRlIElGaWxlIGZKU1BGaWxlID0gbnVsbDsKLQkJcHJpdmF0ZSBJRG9jdW1lbnQgZkpTUERvYyA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbiA9IEpTUFVJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8wOwotCQkKLQkJcHVibGljIFJlbmFtZUNoYW5nZShJRmlsZSBqc3BGaWxlLCBJRG9jdW1lbnQganNwRG9jLCBUZXh0RWRpdCBlZGl0LCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJCXN1cGVyKEpTUFVJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl82LCBqc3BEb2MpOwotCQkJdGhpcy5mRWRpdCA9IGVkaXQ7Ci0JCQl0aGlzLmZKU1BGaWxlID0ganNwRmlsZTsKLQkJCXRoaXMuZkpTUERvYyA9IGpzcERvYzsKLQkJCXRoaXMuZkRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCX0KLQkJCi0JCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCQl9Ci0JCQotCQlwdWJsaWMgSURvY3VtZW50IGdldFByZXZpZXdEb2N1bWVudChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlJRG9jdW1lbnQgY29weURvYyA9IG5ldyBEb2N1bWVudChmSlNQRG9jLmdldCgpKTsKLQkJCXRyeSB7Ci0JCQkJZkVkaXQuYXBwbHkoY29weURvYyk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWdub3JlCi0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQkJcmV0dXJuIGNvcHlEb2M7Ci0JCX0KLQkJCi0JCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlSZW5hbWVDaGFuZ2UgdW5kb0NoYW5nZSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCQotCQkJCWlmKCFpc09wZW5JbkVkaXRvcih0aGlzLmZKU1BEb2MpKSB7Ci0JCQkJCS8vIGFwcGx5IGVkaXQgdG8gSlNQIGRvYyBBTkQgc2F2ZSBtb2RlbAotCQkJCQl1bmRvQ2hhbmdlID0gbmV3IFJlbmFtZUNoYW5nZSh0aGlzLmZKU1BGaWxlLCB0aGlzLmZKU1BEb2MsIHRoaXMuZkVkaXQuYXBwbHkoZkpTUERvYyksIHRoaXMuZkRlc2NyaXB0aW9uKTsKLQkJCQkJc2F2ZUZpbGUodGhpcy5mSlNQRmlsZSwgdGhpcy5mSlNQRG9jKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGp1c3QgYXBwbHkgZWRpdCB0byBKU1AgZG9jdW1lbnQKLQkJCQkJdW5kb0NoYW5nZSA9IG5ldyBSZW5hbWVDaGFuZ2UodGhpcy5mSlNQRmlsZSwgdGhpcy5mSlNQRG9jLCB0aGlzLmZFZGl0LmFwcGx5KGZKU1BEb2MpLCB0aGlzLmZEZXNjcmlwdGlvbik7Ci0JCQkJfQotCQkJCQotCQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJcmV0dXJuIHVuZG9DaGFuZ2U7Ci0JCX0KLQkJCi0JCS8qKgotCQkgKiBQZXJmb3JtZWQgaW4gYW4gb3BlcmF0aW9uIHNpbmNlIGl0IG1vZGlmaWVzIHJlc291cmNlcyBpbiB0aGUgd29ya3NwYWNlCi0JCSAqIEBwYXJhbSBqc3BEb2MKLQkJICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JCSAqLwotCQlwcml2YXRlIHZvaWQgc2F2ZUZpbGUoSUZpbGUganNwRmlsZSwgSURvY3VtZW50IGpzcERvYykgewotCQkJCi0JCQlTYXZlSnNwRmlsZU9wIG9wICA9IG5ldyBTYXZlSnNwRmlsZU9wKGpzcEZpbGUsIGpzcERvYyk7Ci0JCQkKLQkJCXRyeSB7Ci0JCQkJb3AucnVuKEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2tzIGlmIGEgZG9jdW1lbnQgaXMgb3BlbiBpbiBhbiBlZGl0b3IKLQkJICogQHBhcmFtIGpzcERvYwotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gaXNPcGVuSW5FZGl0b3IoSURvY3VtZW50IGpzcERvYykgewotCQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFdvcmtiZW5jaFdpbmRvd3MoKTsKLQkJCUlXb3JrYmVuY2hXaW5kb3cgdyA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQotCQkJCXcgPSB3aW5kb3dzW2ldOwotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0KLQkJCQkJSUVkaXRvclJlZmVyZW5jZVtdIHJlZmVyZW5jZXMgPSBwYWdlLmdldEVkaXRvclJlZmVyZW5jZXMoKTsKLQkJCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gbnVsbDsKLQkJCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJCQlJRG9jdW1lbnQgZG9jID0gbnVsbDsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCByZWZlcmVuY2VzLmxlbmd0aDsgaisrKSB7Ci0KLQkJCQkJCWVkaXRvciA9IHJlZmVyZW5jZXNbal0uZ2V0RWRpdG9yKHRydWUpOwotCQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM3NjQKLQkJCQkJCS8vIHVzZSBhZGFwdGVyIHRvIGdldCBJVGV4dEVkaXRvciAoZm9yIHRoaW5ncyBsaWtlCi0JCQkJCQkvLyBwYWdlIGRlc2lnbmVyKQotCQkJCQkJbyA9IGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJCWlmIChvICE9IG51bGwgJiYgbyBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0KLQkJCQkJCQlkb2MgPSAoKElUZXh0RWRpdG9yKSBvKS5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJCQkJCWlmIChkb2MgIT0gbnVsbCAmJiBkb2MuZXF1YWxzKGpzcERvYykpIHsKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkJcmV0dXJuIHRoaXMuZkRlc2NyaXB0aW9uOwotCQl9Ci0JCQotCQlwdWJsaWMgT2JqZWN0IGdldE1vZGlmaWVkRWxlbWVudCgpIHsKLQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCX0KLQl9Ci0JLy8gZW5kIGlubmVyIGNsYXNzIFJlbmFtZUNoYW5nZQotCQotCQotCS8qKiBUaGUgdHlwZSBiZWluZyByZW5hbWVkICh0aGUgb2xkIHR5cGUpKi8KLQlJSmF2YUVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCS8qKiBUaGUgbmV3IG5hbWUgb2YgdGhlIHR5cGUgYmVpbmcgcmVuYW1lZCovCi0JcHJpdmF0ZSBTdHJpbmcgZk5ld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBtYXBzIGEgSlNQU2VhcmNoRG9jdW1lbnQgcGF0aCAtPiBNdWx0aVRleHRFZGl0IGZvciB0aGUgamF2YSBmaWxlKi8KLQlwcml2YXRlIEhhc2hNYXAgZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAgPSBudWxsOwotCQotCXB1YmxpYyBCYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3TmFtZSkgewotCQl0aGlzLmZOZXdOYW1lID0gbmV3TmFtZTsKLQkJdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCXRoaXMuZlNlYXJjaERvY1BhdGgySmF2YUVkaXRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQkKLQlwdWJsaWMgSUphdmFFbGVtZW50IGdldEVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdGhlIG5ldyBuYW1lIGZvciB0aGUgVHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmV3TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMuZk5ld05hbWU7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2gpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQlTdHJpbmcgbWF0Y2hEb2N1bWVudFBhdGggPSBqYXZhTWF0Y2guZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCVNlYXJjaERvY3VtZW50IHNlYXJjaERvYyA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5nZXRTZWFyY2hEb2N1bWVudChtYXRjaERvY3VtZW50UGF0aCk7Ci0JCi0JCWlmIChzZWFyY2hEb2MgIT0gbnVsbCAmJiBzZWFyY2hEb2MgaW5zdGFuY2VvZiBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgewotCQotCQkJU3RyaW5nIHJlbmFtZVRleHQgPSBnZXRSZW5hbWVUZXh0KChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSlzZWFyY2hEb2MsIGphdmFNYXRjaCk7Ci0JCQkKLQkJCS8vIGFkZCBpdCBmb3IgdGhlIGNvcnJlY3QgZG9jdW1lbnQKLQkJCWFkZEphdmFFZGl0KHNlYXJjaERvYy5nZXRQYXRoKCksIG5ldyBSZXBsYWNlRWRpdChqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRMZW5ndGgoKSwgcmVuYW1lVGV4dCkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBzZWFyY2hEb2MKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCXJldHVybiBnZXROZXdOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0byB0aGUgbXVsdGkgZWRpdCBmb3IgYSBnaXZlIGphdmEgZG9jdW1lbnQuCi0JICogQHBhcmFtIGphdmFEb2N1bWVudAotCSAqIEBwYXJhbSBqYXZhRWRpdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRKYXZhRWRpdChTdHJpbmcgc2VhcmNoRG9jUGF0aCwgUmVwbGFjZUVkaXQgamF2YUVkaXQpIHsKLQkJCi0JCU9iamVjdCBvID0gdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcC5nZXQoc2VhcmNoRG9jUGF0aCk7Ci0JCWlmKG8gIT0gbnVsbCkgewotCi0JCQlNdWx0aVRleHRFZGl0IG11bHRpID0gKE11bHRpVGV4dEVkaXQpbzsKLQkJCW11bHRpLmFkZENoaWxkKGphdmFFZGl0KTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVzZSBhIG11bHRpIGVkaXQgc28gZG9jIHBvc2l0aW9uIG9mZnNldHMgZ2V0IHVwZGF0ZWQgYXV0b21hdGljYWxseQotCQkJLy8gd2hlbiBhZGRpbmcgbXVsdGlwbGUgY2hpbGQgZWRpdHMKLQkJCU11bHRpVGV4dEVkaXQgbXVsdGkgPSBuZXcgTXVsdGlUZXh0RWRpdCgpOwotCQkJbXVsdGkuYWRkQ2hpbGQoamF2YUVkaXQpOwotCQkJdGhpcy5mU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcC5wdXQoc2VhcmNoRG9jUGF0aCwgbXVsdGkpOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYWxsIEpTUCBjaGFuZ2VzIGZvciB0aGUgc2VhcmNoIG1hdGNoZXMgZm9yIHRoZSBnaXZlbiBUeXBlCi0JICovCi0JcHVibGljIENoYW5nZVtdIGdldENoYW5nZXMoKSB7Ci0JCQotCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCUxpc3QgY2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZTZWFyY2hEb2NQYXRoMkphdmFFZGl0TWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCVN0cmluZyBzZWFyY2hEb2NQYXRoID0gbnVsbDsKLQkJU2VhcmNoRG9jdW1lbnQgZGVsZWdhdGUgPSBudWxsOwotCQkKLQkJd2hpbGUoa2V5cy5oYXNOZXh0KCkpIHsKLQkJCS8vIGNyZWF0ZSBvbiB0aGUgZmx5Ci0JCQlzZWFyY2hEb2NQYXRoID0gKFN0cmluZylrZXlzLm5leHQoKTsKLQkJCU11bHRpVGV4dEVkaXQgamF2YUVkaXQgPSAoTXVsdGlUZXh0RWRpdClmU2VhcmNoRG9jUGF0aDJKYXZhRWRpdE1hcC5nZXQoc2VhcmNoRG9jUGF0aCk7Ci0JCQlkZWxlZ2F0ZSA9IHN1cHBvcnQuZ2V0U2VhcmNoRG9jdW1lbnQoc2VhcmNoRG9jUGF0aCk7Ci0JCQkKLQkJCWlmKGRlbGVnYXRlICE9IG51bGwgJiYgZGVsZWdhdGUgaW5zdGFuY2VvZiBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgewotCQkJCUphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIGphdmFEZWxlZ2F0ZSA9IChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSlkZWxlZ2F0ZTsKLQkJCQljaGFuZ2VzLmFkZChjcmVhdGVDaGFuZ2UoamF2YURlbGVnYXRlLCBqYXZhRGVsZWdhdGUuZ2V0SnNwVHJhbnNsYXRpb24oKS5nZXRKc3BFZGl0KGphdmFFZGl0KSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoQ2hhbmdlW10pY2hhbmdlcy50b0FycmF5KG5ldyBDaGFuZ2VbY2hhbmdlcy5zaXplKCldKTsKLQl9Ci0JCi0JcHJpdmF0ZSBDaGFuZ2UgY3JlYXRlQ2hhbmdlKEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgVGV4dEVkaXQgZWRpdCkgewotCQkKLQkJSURvY3VtZW50IGRvYyA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEpzcERvY3VtZW50KCk7Ci0JCVN0cmluZyBmaWxlID0gc2VhcmNoRG9jLmdldEZpbGUoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IGdldERlc2NyaXB0aW9uKCk7Ci0JCXRyeSB7Ci0JCQkvLyBkb2N1bWVudCBsaW5lcyBhcmUgMCBiYXNlZAotCQkJU3RyaW5nIGxpbmVOdW1iZXIgPSBJbnRlZ2VyLnRvU3RyaW5nKGRvYy5nZXRMaW5lT2ZPZmZzZXQoZWRpdC5nZXRPZmZzZXQoKSkgKyAxKTsKLQkJCWRlc2NyaXB0aW9uICs9ICIgIiArIE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8xLCBuZXcgU3RyaW5nW117ZmlsZSwgbGluZU51bWJlcn0pOyAvLyROT04tTkxTLTEkCi0JCX0gCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBuZXcgUmVuYW1lQ2hhbmdlKHNlYXJjaERvYy5nZXRGaWxlKCksIGRvYywgZWRpdCwgZGVzY3JpcHRpb24pOwotCX0KLQkKLQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzIwNQotCS8vIG9ubHkgcmVsZXZhbnQgZm9yIElUeXBlIHJlZmFjdG9yaW5ncwotCXByb3RlY3RlZCBib29sZWFuIGlzRnVsbHlRdWFsaWZpZWQoU3RyaW5nIG1hdGNoVGV4dCkgewotCQlpZihnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJVHlwZSkgewotCQkJU3RyaW5nIHBrZyA9ICgoSVR5cGUpZ2V0RWxlbWVudCgpKS5nZXRQYWNrYWdlRnJhZ21lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQkJcmV0dXJuIG1hdGNoVGV4dC5zdGFydHNXaXRoKHBrZyk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRvIGJldHRlciBkZXNjcmliZSB0aGUgY2hhbmdlLgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzhmMmRhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BKYXZhU2VsZWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLklKU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5KU1BUcmFuc2xhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLWNsYXNzIEpTUEphdmFTZWxlY3Rpb25Qcm92aWRlciB7Ci0Jc3RhdGljIElKYXZhRWxlbWVudFtdIGdldFNlbGVjdGlvbihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbnVsbDsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQkvLyBnZXQgdGhlIEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgZWRpdG9yJ3MgZG9jdW1lbnQKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsgCi0JCQl0cnkgewotCQkJCWlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgewotCQkJCQlJRE9NTW9kZWwgeG1sTW9kZWwgPSAoSURPTU1vZGVsKW1vZGVsOwotCQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCQkJCQkJZWxlbWVudHMgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZSh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODVmZjExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZUNoYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JTWV0aG9kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElNZXRob2QgbWV0aG9kLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy8gc3VwcG9ydC5pbmRleFdvcmtzcGFjZUFuZFdhaXQoKTsKLQkJCi0JCUJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yID0gbmV3IEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvcihtZXRob2QsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKG1ldGhvZCwgbmV3IEpTUFNlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCS8vIHBhX1RPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGFjOWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1ldGhvZFJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBNYXkgNiwgMjAwNAotICoKLSAqIFRPRE8gVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93IC0gUHJlZmVyZW5jZXMgLSBKYXZhIC0gQ29kZSBTdHlsZSAtIENvZGUgVGVtcGxhdGVzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1ldGhvZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BNZXRob2RSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQkKLQlwcml2YXRlIElNZXRob2QgZk1ldGhvZCA9IG51bGw7Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQlpZihlbGVtZW50IGluc3RhbmNlb2YgSU1ldGhvZCkgewotCQkJdGhpcy5mTWV0aG9kID0gKElNZXRob2QpIGVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmKHRoaXMuZk1ldGhvZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCW5hbWUgPSB0aGlzLmZNZXRob2QuZ2V0U291cmNlKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY3JlYXRlQ2hhbmdlKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBDaGFuZ2UgY3JlYXRlQ2hhbmdlKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJQ2hhbmdlW10gY2hhbmdlcyA9IEpTUE1ldGhvZFJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKHRoaXMuZk1ldGhvZCwgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLQkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsgCi0JCQlpZihjaGFuZ2VzLmxlbmd0aCA+IDApCi0JCQkJbXVsdGlDaGFuZ2UgID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbXVsdGlDaGFuZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTWV0aG9kUmVuYW1lUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0NzIwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUE1ldGhvZFJlbmFtZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCQotCXB1YmxpYyBKU1BNZXRob2RSZW5hbWVSZXF1ZXN0b3IoSUphdmFFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCXN1cGVyKGVsZW1lbnQsIG5ld05hbWUpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJlbmFtZVRleHQoSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgc2VhcmNoRG9jLCBTZWFyY2hNYXRjaCBqYXZhTWF0Y2gpIHsKLQkJCi0JCVN0cmluZyBqYXZhVGV4dCA9IHNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpLmdldEphdmFUZXh0KCk7Ci0JCVN0cmluZyBtZXRob2RUZXh0ID0gamF2YVRleHQuc3Vic3RyaW5nKGphdmFNYXRjaC5nZXRPZmZzZXQoKSwgamF2YU1hdGNoLmdldE9mZnNldCgpICsgamF2YU1hdGNoLmdldExlbmd0aCgpKTsKLQkJU3RyaW5nIG1ldGhvZFN1ZmZpeCA9IG1ldGhvZFRleHQuc3Vic3RyaW5nKG1ldGhvZFRleHQuaW5kZXhPZigiKCIpKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ2V0TmV3TmFtZSgpICsgbWV0aG9kU3VmZml4OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCi0JCVN0cmluZyBtZXRob2ROYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfMywgbmV3IFN0cmluZ1tde21ldGhvZE5hbWUsIG5ld05hbWV9KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjFkNGJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUE1vdmVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgdGhhdCBsYXVuY2hlcyBKRFQgbW92ZSBlbGVtZW50IHdpemFyZAotICogCi0gKiBTdGlsbCByZWxpZXMgaGVhdmlseSBvbiBpbnRlcm5hbCBBUEkKLSAqIHdpbGwgY2hhbmdlIHBvc3QgMy4wIHdpdGggcHVibGljIG1vdmUgc3VwcG9ydAotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTYxODE3IAotICovCi1wdWJsaWMgY2xhc3MgSlNQTW92ZUVsZW1lbnRBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JLy9wcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQkvL2ZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbnVsbGluZyBvdXQganVzdCBpbiBjYXNlCi0JCS8vZkVkaXRvciA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuTW92ZUVsZW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KEpTUFVJTWVzc2FnZXMuTW92ZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJCi0JCS8vIG5vLW9wIHVudGlsIHdlIGtub3cgaG93IHdlJ3JlIHN1cHBvc2VkIHRvIHVzZSB0aGlzIAotCQkvLyBlY2xpcHNlIDMuMk01Ci0JCS8vIHB1YmxpYyBtb3ZlIHN1cHBvcnQ6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02MTgxNwotCQkKLS8vCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGdldFNlbGVjdGVkRWxlbWVudHMoKTsKLS8vCQlpZiAoZWxlbWVudHMubGVuZ3RoID4gMCkgewotLy8KLS8vCQkJLy8gbmVlZCB0byBjaGVjayBpZiBpdCdzIG1vdmFibGUKLS8vCQkJdHJ5IHsKLS8vCQkJCUphdmFNb3ZlUHJvY2Vzc29yIHByb2Nlc3NvciA9IEphdmFNb3ZlUHJvY2Vzc29yLmNyZWF0ZShnZXRSZXNvdXJjZXMoZWxlbWVudHMpLCBlbGVtZW50cyk7Ci0vLwkJCQkKLS8vCQkJCVNoZWxsIHBhcmVudCA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLS8vCQkJCU1vdmVSZWZhY3RvcmluZyByZWZhY3RvcmluZyA9IG5ldyBNb3ZlUmVmYWN0b3JpbmcocHJvY2Vzc29yKTsKLS8vCi0vLwkJCQlSZWZhY3RvcmluZ1dpemFyZCB3aXphcmQgPSBjcmVhdGVXaXphcmQocmVmYWN0b3JpbmcpOwotLy8KLS8vCQkJCS8qCi0vLwkJCQkgKiBXZSB3YW50IHRvIGdldCB0aGUgc2hlbGwgZnJvbSB0aGUgcmVmYWN0b3JpbmcgZGlhbG9nIGJ1dAotLy8JCQkJICogaXQncyBub3Qga25vd24gYXQgdGhpcyBwb2ludCwgc28gd2UgcGFzcyB0aGUgd2l6YXJkIGFuZAotLy8JCQkJICogdGhlbiwgb25jZSB0aGUgZGlhbG9nIGlzIG9wZW4sIHdlIHdpbGwgaGF2ZSBhY2Nlc3MgdG8gaXRzCi0vLwkJCQkgKiBzaGVsbC4KLS8vCQkJCSAqLwotLy8KLS8vCQkJCXByb2Nlc3Nvci5zZXRDcmVhdGVUYXJnZXRRdWVyaWVzKG5ldyBDcmVhdGVUYXJnZXRRdWVyaWVzKHdpemFyZCkpOwotLy8JCQkJcHJvY2Vzc29yLnNldFJlb3JnUXVlcmllcyhuZXcgUmVvcmdRdWVyaWVzKHdpemFyZCkpOwotLy8JCQkJLy8gU3RyaW5nIG9wZW5SZWZhY3RvcmluZ1dpek1zZyA9Ci0vLwkJCQkvLyBSZWZhY3RvcmluZ01lc3NhZ2VzLmdldFN0cmluZygiT3BlblJlZmFjdG9yaW5nV2l6YXJkQWN0aW9uLnJlZmFjdG9yaW5nIik7Ci0vLwkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQlTdHJpbmcgb3BlblJlZmFjdG9yaW5nV2l6TXNnID0gSlNQVUlNZXNzYWdlcy5Nb3ZlRWxlbWVudFdpemFyZDsgLy8gIk1vdmUKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBzZWxlY3RlZAotLy8JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGVsZW1lbnRzIjsKLS8vCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0vLwkJCQluZXcgUmVmYWN0b3JpbmdTdGFydGVyKCkuYWN0aXZhdGUocmVmYWN0b3JpbmcsIHdpemFyZCwgcGFyZW50LCBvcGVuUmVmYWN0b3JpbmdXaXpNc2csIHRydWUpOwotLy8KLS8vCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0vLwotLy8JCQl9Ci0vLwkJCWNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotLy8JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLS8vCQkJfQotLy8JCX0KLS8vCQllbHNlIHsKLS8vCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQTW92ZUVsZW1lbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLS8vCQl9Ci0JCQotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVDaGFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1ZTA4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BQYWNrYWdlUmVuYW1lQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFBhY2thZ2VSZW5hbWVDaGFuZ2UgZXh0ZW5kcyBDaGFuZ2UgewotCi0JcHVibGljIHN0YXRpYyBDaGFuZ2VbXSBjcmVhdGVDaGFuZ2VzRm9yKElQYWNrYWdlRnJhZ21lbnQgcGtnLCBTdHJpbmcgbmV3TmFtZSkgewotCQlKU1BTZWFyY2hTdXBwb3J0IHN1cHBvcnQgPSBKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCk7Ci0JCQotCQkvLyBzaG91bGQgYmUgaGFuZGxlZCBieSBKU1BJbmRleE1hbmFnZXIKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTMwMzYKLQkJLy9zdXBwb3J0LmluZGV4V29ya3NwYWNlQW5kV2FpdCgpOwotCQkKLQkJQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvcihwa2csIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHBrZywgbmV3IEpTUFNlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCQotCQkvL3JldHVybiB0aGlzLnBrZzsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDNkMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklQYWNrYWdlRnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotCi0vKioKLSAqIFJlbWVtYmVyIHRvIGNoYW5nZSB0aGUgcGx1Z2luLnhtbCBmaWxlIGlmIHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgY2hhbmdlcy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFBhY2thZ2VSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCXByaXZhdGUgSVBhY2thZ2VGcmFnbWVudCBmUGtnID0gbnVsbDsKLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2luaXRpYWxpemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbml0aWFsaXplKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmKGVsZW1lbnQgaW5zdGFuY2VvZiBJUGFja2FnZUZyYWdtZW50KSB7Ci0JCQl0aGlzLmZQa2cgPSAoSVBhY2thZ2VGcmFnbWVudCkgZWxlbWVudDsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYodGhpcy5mUGtnICE9IG51bGwpIHsKLQkJCW5hbWUgPSB0aGlzLmZQa2cuZ2V0RWxlbWVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NoZWNrQ29uZGl0aW9ucyhvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQpCi0JICovCi0JcHVibGljIFJlZmFjdG9yaW5nU3RhdHVzIGNoZWNrQ29uZGl0aW9ucyhJUHJvZ3Jlc3NNb25pdG9yIHBtLCBDaGVja0NvbmRpdGlvbnNDb250ZXh0IGNvbnRleHQpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2NyZWF0ZUNoYW5nZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgQ2hhbmdlIGNyZWF0ZUNoYW5nZShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCSBDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQUGFja2FnZVJlbmFtZUNoYW5nZS5jcmVhdGVDaGFuZ2VzRm9yKHRoaXMuZlBrZywgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLQkJIENvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7Ci0JCSBpZihjaGFuZ2VzLmxlbmd0aCA+IDApCi0JCQltdWx0aUNoYW5nZSA9IG5ldyBDb21wb3NpdGVDaGFuZ2UoSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlcywgY2hhbmdlcyk7IC8vJE5PTi1OTFMtMSQKLQkgICAgIHJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUGFja2FnZVJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2ZmYTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFBhY2thZ2VSZW5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIE92ZXJyaWRlcyBnZXQgZGVzY3JpcHRpb24KLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BQYWNrYWdlUmVuYW1lUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JLyoqCi0JICogRWxlbWVudCBpcyB0aGUgb2xkIHBhY2thZ2UuICBuZXdOYW1lIGlzIHRoZSBuZXcgcGFja2FnZSBuYW1lLgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHBhcmFtIG5ld05hbWUKLQkgKi8KLQlwdWJsaWMgSlNQUGFja2FnZVJlbmFtZVJlcXVlc3RvcihJSmF2YUVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIoZWxlbWVudCwgbmV3TmFtZSk7Ci0JfQotCQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJU3RyaW5nIHBhY2thZ2VOYW1lID0gZ2V0RWxlbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCVN0cmluZyBuZXdOYW1lID0gZ2V0TmV3TmFtZSgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBOTFMuYmluZChKU1BVSU1lc3NhZ2VzLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3JfNSwgKG5ldyBTdHJpbmdbXXtwYWNrYWdlTmFtZSwgbmV3TmFtZX0pKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQUmVuYW1lRWxlbWVudEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4N2ZjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklNZXRob2Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVBhY2thZ2VGcmFnbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkucmVmYWN0b3JpbmcuUmVuYW1lU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBBbiBhY3Rpb24gZGVsZWdhdGUgdGhhdCBsYXVuY2hlcyBKRFQgcmVuYW1lIGVsZW1lbnQgd2l6YXJkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BSZW5hbWVFbGVtZW50QWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQkKLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoSlNQVUlNZXNzYWdlcy5SZW5hbWVFbGVtZW50X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChKU1BVSU1lc3NhZ2VzLlJlbmFtZUVsZW1lbnRfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudCBlbGVtZW50ID0gZ2V0U2VsZWN0ZWRFbGVtZW50KCk7Ci0JCWlmKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJUmVuYW1lU3VwcG9ydCByZW5hbWVTdXBwb3J0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc3dpdGNoKGVsZW1lbnQuZ2V0RWxlbWVudFR5cGUoKSkgewotCQkJCQljYXNlIElKYXZhRWxlbWVudC5UWVBFOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElUeXBlKWVsZW1lbnQsIGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSwgUmVuYW1lU3VwcG9ydC5VUERBVEVfUkVGRVJFTkNFUyk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJSmF2YUVsZW1lbnQuTUVUSE9EOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElNZXRob2QpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElKYXZhRWxlbWVudC5QQUNLQUdFX0ZSQUdNRU5UOgotCQkJCQkJcmVuYW1lU3VwcG9ydD0gUmVuYW1lU3VwcG9ydC5jcmVhdGUoKElQYWNrYWdlRnJhZ21lbnQpZWxlbWVudCwgZWxlbWVudC5nZXRFbGVtZW50TmFtZSgpLCBSZW5hbWVTdXBwb3J0LlVQREFURV9SRUZFUkVOQ0VTKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZihyZW5hbWVTdXBwb3J0ICE9IG51bGwpIHsKLQkJCQkJcmVuYW1lU3VwcG9ydC5vcGVuRGlhbG9nKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKSk7Ci0JCQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSAgewotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKEpTUFVJTWVzc2FnZXMuSlNQUmVuYW1lRWxlbWVudEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCQl9Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnQgZ2V0U2VsZWN0ZWRFbGVtZW50KCkgewotCQlJSmF2YUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gSlNQSmF2YVNlbGVjdGlvblByb3ZpZGVyLmdldFNlbGVjdGlvbigoSVRleHRFZGl0b3IpZkVkaXRvcik7Ci0JCQlpZiAoZWxlbWVudHMubGVuZ3RoID09IDEpCi0JCQkJZWxlbWVudCA9IGVsZW1lbnRzWzBdOwotCQl9Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWNkNjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlQ2hhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5yZWZhY3RvcmluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUeXBlTW92ZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJCi0JCUpTUFNlYXJjaFN1cHBvcnQgc3VwcG9ydCA9IEpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKTsKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCQotCQlKU1BUeXBlTW92ZVJlcXVlc3RvciByZXF1ZXN0b3IgPSBuZXcgSlNQVHlwZU1vdmVSZXF1ZXN0b3IodHlwZSwgbmV3TmFtZSk7Ci0JCXN1cHBvcnQuc2VhcmNoUnVubmFibGUodHlwZSwgbmV3IEpTUFNlYXJjaFNjb3BlKCksIHJlcXVlc3Rvcik7Ci0KLQkJcmV0dXJuIHJlcXVlc3Rvci5nZXRDaGFuZ2VzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gSlNQVUlNZXNzYWdlcy5KU1BfY2hhbmdlczsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVWYWxpZGF0aW9uRGF0YShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gZGVjaWRlIGNvcnJlY3QgdmFsdWUgb2YgaXNWYWxpZAotCX0KLQotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBpc1ZhbGlkKElQcm9ncmVzc01vbml0b3IgcG0pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gcGFfVE9ETyBpbXBsZW1lbnQKLQkJLy8gVGhpcyBtZXRob2QgbXVzdCBlbnN1cmUgdGhhdCB0aGUgY2hhbmdlIG9iamVjdCBpcyBzdGlsbCB2YWxpZC4KLQkJLy8gVGhpcyBpcyBpbiBwYXJ0aWN1bGFyIGludGVyZXN0aW5nIHdoZW4gcGVyZm9ybWluZyBhbiB1bmRvIGNoYW5nZQotCQkvLyBzaW5jZSB0aGUgd29ya3NwYWNlIGNvdWxkIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgdW5kbyBjaGFuZ2UgaGFzCi0JCS8vIGJlZW4gY3JlYXRlZC4KLQkJcmV0dXJuIG5ldyBSZWZhY3RvcmluZ1N0YXR1cygpOwotCX0KLQotCXB1YmxpYyBDaGFuZ2UgcGVyZm9ybShJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gcmV0dXJuIHRoZSAidW5kbyIgY2hhbmdlIGhlcmUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRNb2RpZmllZEVsZW1lbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlTW92ZVBhcnRpY2lwYW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYzgwYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JUGFja2FnZUZyYWdtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLklUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuQ29tcG9zaXRlQ2hhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLlJlZmFjdG9yaW5nU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5Nb3ZlUGFydGljaXBhbnQ7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlUGFydGljaXBhbnQgZXh0ZW5kcyBNb3ZlUGFydGljaXBhbnQgewotCQotCUlUeXBlIGZUeXBlID0gbnVsbDsKLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNpbml0aWFsaXplKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5pdGlhbGl6ZShPYmplY3QgZWxlbWVudCkgewotCQkKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQl0aGlzLmZUeXBlID0gKElUeXBlKWVsZW1lbnQ7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQkKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZUeXBlICE9IG51bGwpCi0JCQluYW1lID0gdGhpcy5mVHlwZS5nZXRFbGVtZW50TmFtZSgpOwotCQlyZXR1cm4gbmFtZTsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjY2hlY2tDb25kaXRpb25zKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuQ2hlY2tDb25kaXRpb25zQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgY2hlY2tDb25kaXRpb25zKElQcm9ncmVzc01vbml0b3IgcG0sIENoZWNrQ29uZGl0aW9uc0NvbnRleHQgY29udGV4dCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkKLQkJaWYocG0gIT0gbnVsbCAmJiBwbS5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJCi0JCUNvbXBvc2l0ZUNoYW5nZSBtdWx0aUNoYW5nZSA9IG51bGw7IAotCQlPYmplY3QgZGVzdCA9IGdldEFyZ3VtZW50cygpLmdldERlc3RpbmF0aW9uKCk7Ci0JCQotCQlpZihkZXN0IGluc3RhbmNlb2YgSVBhY2thZ2VGcmFnbWVudCkgewkJCi0JCQlDaGFuZ2VbXSBjaGFuZ2VzID0gSlNQVHlwZU1vdmVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0ZvcihmVHlwZSwgKChJUGFja2FnZUZyYWdtZW50KWRlc3QpLmdldEVsZW1lbnROYW1lKCkpOwotCQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKQotCQkJCW11bHRpQ2hhbmdlID0gbmV3IENvbXBvc2l0ZUNoYW5nZShKU1BVSU1lc3NhZ2VzLkpTUF9jaGFuZ2VzLCBjaGFuZ2VzKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVNb3ZlUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDAyZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZU1vdmVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVNb3ZlUmVxdWVzdG9yIGV4dGVuZHMgQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBuZXdOYW1lCi0JICovCi0JcHVibGljIEpTUFR5cGVNb3ZlUmVxdWVzdG9yKElKYXZhRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmV3UGFja2FnZSkgewotCQlzdXBlcihlbGVtZW50LCBuZXdQYWNrYWdlKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZW5hbWVUZXh0KEphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlIHNlYXJjaERvYywgU2VhcmNoTWF0Y2ggamF2YU1hdGNoKSB7Ci0JCQotCQlTdHJpbmcgcmVuYW1lVGV4dCA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCi0JCUpTUFRyYW5zbGF0aW9uIHRyYW5zID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCVN0cmluZyBtYXRjaFRleHQgPSB0cmFucy5nZXRKYXZhVGV4dCgpLnN1YnN0cmluZyhqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRPZmZzZXQoKSArIGphdmFNYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCQotCQkvLyBpZiBpdCdzIGFuIGltcG9ydCBvciBqc3A6dXNlQmVhbiwgd2UgbmVlZCB0byBhZGQgdGhlIHBhY2thZ2UgbmFtZSBhcyB3ZWxsCi0JCWlmKHRyYW5zLmlzSW1wb3J0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSkgfHwgdHJhbnMuaXNVc2VCZWFuKGphdmFNYXRjaC5nZXRPZmZzZXQoKSkgfHwgaXNGdWxseVF1YWxpZmllZChtYXRjaFRleHQpKSB7Ci0JCQlpZighZ2V0TmV3TmFtZSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBnZXROZXdOYW1lKCkgaXMgdGhlIHBrZyBuYW1lCi0JCQkJcmVuYW1lVGV4dCA9IGdldE5ld05hbWUoKSArICIuIiArIHJlbmFtZVRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVuYW1lVGV4dDsKLQl9Ci0JCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nLkJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IjZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCQotCQlTdHJpbmcgdHlwZU5hbWUgPSBnZXRFbGVtZW50KCkuZ2V0RWxlbWVudE5hbWUoKTsKLQkJU3RyaW5nIG5ld05hbWUgPSBnZXROZXdOYW1lKCk7Ci0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IE1lc3NhZ2VGb3JtYXQuZm9ybWF0KEpTUFVJTWVzc2FnZXMuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3Rvcl8yLCBuZXcgU3RyaW5nW117dHlwZU5hbWUsIG5ld05hbWV9KTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVzY3JpcHRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZUNoYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZUNoYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYxNjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVDaGFuZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTdXBwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5DaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZVJlbmFtZUNoYW5nZSBleHRlbmRzIENoYW5nZSB7Ci0KLQlwdWJsaWMgc3RhdGljIENoYW5nZVtdIGNyZWF0ZUNoYW5nZXNGb3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkKLQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgSlNQSW5kZXhNYW5hZ2VyCi0JCS8vIGh0dHBzOi8vdzMub3BlbnNvdXJjZS5pYm0uY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0zMDM2Ci0JCS8vIHN1cHBvcnQuaW5kZXhXb3Jrc3BhY2VBbmRXYWl0KCk7Ci0JCi0JCQotCQlKU1BUeXBlUmVuYW1lUmVxdWVzdG9yIHJlcXVlc3RvciA9IG5ldyBKU1BUeXBlUmVuYW1lUmVxdWVzdG9yKHR5cGUsIG5ld05hbWUpOwotCQlzdXBwb3J0LnNlYXJjaFJ1bm5hYmxlKHR5cGUsIG5ldyBKU1BTZWFyY2hTY29wZSgpLCByZXF1ZXN0b3IpOwotCi0JCXJldHVybiByZXF1ZXN0b3IuZ2V0Q2hhbmdlcygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXM7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplVmFsaWRhdGlvbkRhdGEoSVByb2dyZXNzTW9uaXRvciBwbSkgewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotCQkvLyBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGRlY2lkZSBjb3JyZWN0IHZhbHVlIG9mIGlzVmFsaWQKLQl9Ci0KLQlwdWJsaWMgUmVmYWN0b3JpbmdTdGF0dXMgaXNWYWxpZChJUHJvZ3Jlc3NNb25pdG9yIHBtKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIHBhX1RPRE8gaW1wbGVtZW50Ci0JCS8vIFRoaXMgbWV0aG9kIG11c3QgZW5zdXJlIHRoYXQgdGhlIGNoYW5nZSBvYmplY3QgaXMgc3RpbGwgdmFsaWQuCi0JCS8vIFRoaXMgaXMgaW4gcGFydGljdWxhciBpbnRlcmVzdGluZyB3aGVuIHBlcmZvcm1pbmcgYW4gdW5kbyBjaGFuZ2UKLQkJLy8gc2luY2UgdGhlIHdvcmtzcGFjZSBjb3VsZCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIHVuZG8gY2hhbmdlIGhhcwotCQkvLyBiZWVuIGNyZWF0ZWQuCi0JCXJldHVybiBuZXcgUmVmYWN0b3JpbmdTdGF0dXMoKTsKLQl9Ci0KLQlwdWJsaWMgQ2hhbmdlIHBlcmZvcm0oSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHJldHVybiB0aGUgInVuZG8iIGNoYW5nZSBoZXJlCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kaWZpZWRFbGVtZW50KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9yZWZhY3RvcmluZy9KU1BUeXBlUmVuYW1lUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmExNmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3Jpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLkNoYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5Db21wb3NpdGVDaGFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuUmVmYWN0b3JpbmdTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLkNoZWNrQ29uZGl0aW9uc0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlbmFtZVBhcnRpY2lwYW50OwotCi0vKioKLSAqIFJlbWVtYmVyIHRvIGNoYW5nZSB0aGUgcGx1Z2luLnhtbCBmaWxlIGlmIHRoZSBuYW1lIG9mIHRoaXMgY2xhc3MgY2hhbmdlcy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFR5cGVSZW5hbWVQYXJ0aWNpcGFudCBleHRlbmRzIFJlbmFtZVBhcnRpY2lwYW50IHsKLQotCXByaXZhdGUgSVR5cGUgZlR5cGUgPSBudWxsOwotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucGFydGljaXBhbnRzLlJlZmFjdG9yaW5nUGFydGljaXBhbnQjaW5pdGlhbGl6ZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGluaXRpYWxpemUoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYoZWxlbWVudCBpbnN0YW5jZW9mIElUeXBlKSB7Ci0JCQl0aGlzLmZUeXBlID0gKElUeXBlKSBlbGVtZW50OwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5SZWZhY3RvcmluZ1BhcnRpY2lwYW50I2dldE5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZih0aGlzLmZUeXBlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbmFtZSA9IHRoaXMuZlR5cGUuZ2V0U291cmNlKCk7Ci0JCQl9IGNhdGNoIChKYXZhTW9kZWxFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjaGVja0NvbmRpdGlvbnMob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IsIG9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnBhcnRpY2lwYW50cy5DaGVja0NvbmRpdGlvbnNDb250ZXh0KQotCSAqLwotCXB1YmxpYyBSZWZhY3RvcmluZ1N0YXR1cyBjaGVja0NvbmRpdGlvbnMoSVByb2dyZXNzTW9uaXRvciBwbSwgQ2hlY2tDb25kaXRpb25zQ29udGV4dCBjb250ZXh0KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wYXJ0aWNpcGFudHMuUmVmYWN0b3JpbmdQYXJ0aWNpcGFudCNjcmVhdGVDaGFuZ2Uob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIENoYW5nZSBjcmVhdGVDaGFuZ2UoSVByb2dyZXNzTW9uaXRvciBwbSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlDaGFuZ2VbXSBjaGFuZ2VzID0gIEpTUFR5cGVSZW5hbWVDaGFuZ2UuY3JlYXRlQ2hhbmdlc0ZvcihmVHlwZSwgZ2V0QXJndW1lbnRzKCkuZ2V0TmV3TmFtZSgpKTsKLQkJQ29tcG9zaXRlQ2hhbmdlIG11bHRpQ2hhbmdlID0gbnVsbDsKLQkJaWYoY2hhbmdlcy5sZW5ndGggPiAwKQotCQkJbXVsdGlDaGFuZ2UgPSBuZXcgQ29tcG9zaXRlQ2hhbmdlKEpTUFVJTWVzc2FnZXMuSlNQX2NoYW5nZXMsIGNoYW5nZXMpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBtdWx0aUNoYW5nZTsKLQl9Ci0JCi0JCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvcmVmYWN0b3JpbmcvSlNQVHlwZVJlbmFtZVJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTNjY2Y3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3JlZmFjdG9yaW5nL0pTUFR5cGVSZW5hbWVSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnJlZmFjdG9yaW5nOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLQotLyoqCi0gKiBDcmVhdGVzIGRvY3VtZW50IGNoYW5nZShzKSBmb3IgYSB0eXBlIHJlbmFtZS4KLSAqIENoYW5nZXMgYXJlIGNyZWF0ZWQgZm9yIGV2ZXJ5IHR5cGUgIm1hdGNoIiBpbiB0aGUgd29ya3NwYWNlCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQVHlwZVJlbmFtZVJlcXVlc3RvciBleHRlbmRzIEJhc2ljUmVmYWN0b3JTZWFyY2hSZXF1ZXN0b3IgewotCi0JcHVibGljIEpTUFR5cGVSZW5hbWVSZXF1ZXN0b3IoSVR5cGUgdHlwZSwgU3RyaW5nIG5ld05hbWUpIHsKLQkJc3VwZXIodHlwZSwgbmV3TmFtZSk7Ci0JfQotCQotCXByaXZhdGUgSVR5cGUgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIChJVHlwZSlnZXRFbGVtZW50KCk7Ci0JfQotCQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVuYW1lVGV4dChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSBzZWFyY2hEb2MsIFNlYXJjaE1hdGNoIGphdmFNYXRjaCkgewotCQkKLQkJU3RyaW5nIHJlbmFtZVRleHQgPSBnZXROZXdOYW1lKCk7Ci0JCQotCQlTdHJpbmcgcGtnID0gZ2V0VHlwZSgpLmdldFBhY2thZ2VGcmFnbWVudCgpLmdldEVsZW1lbnROYW1lKCk7Ci0JCUpTUFRyYW5zbGF0aW9uIHRyYW5zID0gc2VhcmNoRG9jLmdldEpzcFRyYW5zbGF0aW9uKCk7Ci0JCVN0cmluZyBtYXRjaFRleHQgPSB0cmFucy5nZXRKYXZhVGV4dCgpLnN1YnN0cmluZyhqYXZhTWF0Y2guZ2V0T2Zmc2V0KCksIGphdmFNYXRjaC5nZXRPZmZzZXQoKSArIGphdmFNYXRjaC5nZXRMZW5ndGgoKSk7Ci0JCQotCQkvLyBpZiBpdCdzIGFuIGltcG9ydCBvciBqc3A6dXNlQmVhbiBvciBmdWxseSBxdWFsaWZpZWQgdHlwZSwgd2UgbmVlZCB0byBhZGQgdGhlIHBhY2thZ2UgbmFtZSBhcyB3ZWxsCi0JCWlmKHRyYW5zLmlzSW1wb3J0KGphdmFNYXRjaC5nZXRPZmZzZXQoKSkgfHwgLyp0cmFucy5pc1VzZUJlYW4oamF2YU1hdGNoLmdldE9mZnNldCgpKSB8fCovIGlzRnVsbHlRdWFsaWZpZWQobWF0Y2hUZXh0KSkgewotCQkJaWYoIXBrZy5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQkJcmVuYW1lVGV4dCA9IHBrZyArICIuIiArIHJlbmFtZVRleHQ7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVuYW1lVGV4dDsKLQl9Ci0JCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEucmVmYWN0b3JpbmcuQmFzaWNSZWZhY3RvclNlYXJjaFJlcXVlc3RvciNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJCi0JCVN0cmluZyB0eXBlTmFtZSA9IGdldEVsZW1lbnQoKS5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgbmV3TmFtZSA9IGdldE5ld05hbWUoKTsKLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoSlNQVUlNZXNzYWdlcy5CYXNpY1JlZmFjdG9yU2VhcmNoUmVxdWVzdG9yXzQsIG5ldyBTdHJpbmdbXXt0eXBlTmFtZSwgbmV3TmFtZX0pOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBkZXNjcmlwdGlvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvQmFzaWNKU1BTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTNkYmM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9CYXNpY0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkphdmFTZWFyY2hEb2N1bWVudERlbGVnYXRlOwotCi0vKioKLSAqIEFjY2VwdHMgbWF0Y2hlcyBmcm9tIEpTUFNlYXJjaFN1cHBvcnQuc2VhcmNoKC4uLikgcmVxdWVzdC4KLSAqIEFkYXB0cyB0aGUgcmVzdWx0cyBmcm9tIGphdmEgdG8gSlNQIGFuZCBkaXNwbGF5cyBpbiB0aGUgU2VhcmNoUmVzdWx0Vmlldy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljSlNQU2VhcmNoUmVxdWVzdG9yIGV4dGVuZHMgU2VhcmNoUmVxdWVzdG9yIHsKLQotCS8vIGZvciBkZWJ1Z2dpbmcKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHOwotCXN0YXRpYyB7Ci0JCVN0cmluZyB2YWx1ZT0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS9kZWJ1Zy9qc3BzZWFyY2giKTsgLy8kTk9OLU5MUy0xJAotCQlERUJVRz0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JCi0JLyoqCi0JICogTWFwcyBqYXZhIHNlYXJjaCBjb29yZGluYXRlcyB0byBjb3JyZXNwb25kaW5nIEpTUCBjb29yZGluYXRlcy4KLQkgKiBBZGRzIHRoZSBtYXRjaGVzIHRvIHRoZSBTZWFyY2ggUmVzdWx0cyB2aWV3LgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNhY2NlcHRTZWFyY2hNYXRjaChvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoTWF0Y2gpCi0JICovCi0JcHVibGljIHZvaWQgYWNjZXB0U2VhcmNoTWF0Y2goU2VhcmNoTWF0Y2ggbWF0Y2gpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlpZihKU1BTZWFyY2hTdXBwb3J0LmdldEluc3RhbmNlKCkuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQkJCQotCQlTdHJpbmcgbWF0Y2hEb2N1bWVudFBhdGggPSBtYXRjaC5nZXRSZXNvdXJjZSgpLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKTsKLQkJU2VhcmNoRG9jdW1lbnQgc2VhcmNoRG9jID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLmdldFNlYXJjaERvY3VtZW50KG1hdGNoRG9jdW1lbnRQYXRoKTsKLQkJCi0JCWlmIChzZWFyY2hEb2MgIT0gbnVsbCAmJiBzZWFyY2hEb2MgaW5zdGFuY2VvZiBKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSkgewotCQkJSmF2YVNlYXJjaERvY3VtZW50RGVsZWdhdGUgamF2YVNlYXJjaERvYyA9IChKYXZhU2VhcmNoRG9jdW1lbnREZWxlZ2F0ZSlzZWFyY2hEb2M7Ci0JCQlpbnQganNwU3RhcnQgPSBqYXZhU2VhcmNoRG9jLmdldEpzcE9mZnNldChtYXRjaC5nZXRPZmZzZXQoKSk7Ci0JCQlpbnQganNwRW5kID0gamF2YVNlYXJjaERvYy5nZXRKc3BPZmZzZXQobWF0Y2guZ2V0T2Zmc2V0KCkgKyBtYXRjaC5nZXRMZW5ndGgoKSk7Ci0KLQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zID0gamF2YVNlYXJjaERvYy5nZXRKc3BUcmFuc2xhdGlvbigpOwotCQkJU3RyaW5nIGpzcFRleHQgPSB0cmFucy5nZXRKc3BUZXh0KCk7Ci0JCQlTdHJpbmcgamF2YVRleHQgPSBqYXZhU2VhcmNoRG9jLmdldEphdmFUZXh0KCk7Ci0KLQkJCWlmIChERUJVRykgCi0JCQkJZGlzcGxheURlYnVnSW5mbyhtYXRjaCwganNwU3RhcnQsIGpzcEVuZCwganNwVGV4dCwgamF2YVRleHQpOwotCQkKLQkJCWlmIChqc3BTdGFydCA+IC0xICYmIGpzcEVuZCA+IC0xKQotCQkJCWFkZFNlYXJjaE1hdGNoKG5ldyBEb2N1bWVudCh0cmFucy5nZXRKc3BUZXh0KCkpLCBqYXZhU2VhcmNoRG9jLmdldEZpbGUoKSwganNwU3RhcnQsIGpzcEVuZCwganNwVGV4dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VhcmNoRG9jCi0JICogQHBhcmFtIGpzcFN0YXJ0Ci0JICogQHBhcmFtIGpzcEVuZAotCSAqIEBwYXJhbSBqc3BUcmFuc2xhdGlvbgotCSAqIEBwYXJhbSBqc3BUZXh0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VhcmNoTWF0Y2goSURvY3VtZW50IGpzcERvY3VtZW50LCBJRmlsZSBqc3BGaWxlLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIFN0cmluZyBqc3BUZXh0KSB7Ci0JCS8vIGltcGxlbWVudCBpbiBzdWJjbGFzcwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvciNiZWdpblJlcG9ydGluZygpCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5SZXBvcnRpbmcoKSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogYmVnaW5SZXBvcnRpbmcoKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2VuZFJlcG9ydGluZygpCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVwb3J0aW5nKCkgewotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGVuZFJlcG9ydGluZygpIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3IjZW50ZXJQYXJ0aWNpcGFudChvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQpCi0JICovCi0JcHVibGljIHZvaWQgZW50ZXJQYXJ0aWNpcGFudChTZWFyY2hQYXJ0aWNpcGFudCBwYXJ0aWNpcGFudCkgewotCi0JCWlmIChERUJVRykKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSlNQIFNlYXJjaCByZXF1ZXN0b3I6IGVudGVyUGFydGljaXBhbnQoKSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yI2V4aXRQYXJ0aWNpcGFudChvcmcuZWNsaXBzZS5qZHQuY29yZS5zZWFyY2guU2VhcmNoUGFydGljaXBhbnQpCi0JICovCi0JcHVibGljIHZvaWQgZXhpdFBhcnRpY2lwYW50KFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJKU1AgU2VhcmNoIHJlcXVlc3RvcjogZXhpdFBhcnRpY2lwYW50KCkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEZvciBkZWJ1Zy4KLQkgKiBAcGFyYW0gb3JpZ01hdGNoCi0JICogQHBhcmFtIGpzcFN0YXJ0Ci0JICogQHBhcmFtIGpzcEVuZAotCSAqIEBwYXJhbSBqc3BUZXh0Ci0JICogQHBhcmFtIGphdmFUZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGRpc3BsYXlEZWJ1Z0luZm8oU2VhcmNoTWF0Y2ggb3JpZ01hdGNoLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIFN0cmluZyBqc3BUZXh0LCBTdHJpbmcgamF2YVRleHQpIHsKLQotCQlpZiAob3JpZ01hdGNoID09IG51bGwgfHwganNwU3RhcnQgPT0gLTEgfHwganNwRW5kID09IC0xIHx8IGpzcEVuZCA8IGpzcFN0YXJ0IHx8IGpzcFRleHQgPT0gbnVsbCB8fCBqYXZhVGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYWNjZXB0IHBvc3NpYmxlIG1hdGNoIFtqc3BEb2M6ICIgKyBvcmlnTWF0Y2guZ2V0UmVzb3VyY2UoKS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSArICIgIiArIG9yaWdNYXRjaC5nZXRPZmZzZXQoKSArICI6IiArIG9yaWdNYXRjaC5nZXRPZmZzZXQoKSArIG9yaWdNYXRjaC5nZXRMZW5ndGgoKSArICJdPyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigibWF0Y2ggaW5mbzoiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4oInRoZSBqYXZhIHRleHQgaXM6IiArIGphdmFUZXh0LnN1YnN0cmluZyhvcmlnTWF0Y2guZ2V0T2Zmc2V0KCksIG9yaWdNYXRjaC5nZXRPZmZzZXQoKSArIG9yaWdNYXRjaC5nZXRMZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiamF2YSBzZWFyY2ggbWF0Y2ggdHJhbnNsYXRlcyB0byBqc3AgY29vcmRzIFtzdGFydDogIiArIGpzcFN0YXJ0ICsgIiBlbmQ6IiArIGpzcEVuZCArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiIHRoZSBqc3AgdGV4dCBpczoiICsganNwVGV4dC5zdWJzdHJpbmcoanNwU3RhcnQsIGpzcEVuZCkpOyAvLyROT04tTkxTLTEkCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYWVlYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2guSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZXRzIHVwIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGZvciBqc3AgZmluZCBvY2N1cnJlbmNlcyBwcm9jZXNzb3JzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIExpc3QgZlByb2Nlc3NvcnM7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotLy8JCQkgdGVtcG9yYXJ5LCB3b3JrYXJvdW5kIHRvIGRpc2FibGUgZnVuY3Rpb24sIHNpbmNlIHVzaW5nIHRoZSBmdW5jdGlvbiAKLS8vCQkJIGNhbiBlYXNpbHkgY2F1c2UgZGVhZGxvY2sgdG8gb2NjdXIuCi0vLwkJCQkJIFNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTAzNjYyCi0vLwkJCUpTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBqc3BQcm9jZXNzb3IgPSBuZXcgSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0vLwkJCWZQcm9jZXNzb3JzLmFkZChqc3BQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZjE1YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLS8qKgotICogQ29uZmlndXJlcyBhIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB3aXRoIEpTUCBwYXJ0aXRpb25zIGFuZCByZWdpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgewotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCkgewotCQlyZXR1cm4gbmV3IFN0cmluZ1tde0lKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxULCBJSlNQUGFydGl0aW9ucy5KU1BfQ09OVEVOVF9KQVZBfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UmVnaW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVH07Ci0JfQotCi0JcHJvdGVjdGVkIElTZWFyY2hRdWVyeSBnZXRTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJcmV0dXJuIG5ldyBKU1BTZWFyY2hRdWVyeShmaWxlLCBnZXRKYXZhRWxlbWVudChkb2N1bWVudCwgdGV4dFNlbGVjdGlvbikpOwotCX0KLQotCXByaXZhdGUgSUphdmFFbGVtZW50IGdldEphdmFFbGVtZW50KElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJSmF2YUVsZW1lbnRbXSBlbGVtZW50cyA9IGdldEphdmFFbGVtZW50c0ZvckN1cnJlbnRTZWxlY3Rpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24pOwotCQlyZXR1cm4gZWxlbWVudHMubGVuZ3RoID4gMCA/IGVsZW1lbnRzWzBdIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB1c2VzIEpTUFRyYW5zbGF0aW9uIHRvIGdldCBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGN1cnJlbnRseSBzZWxlY3RlZCBJSmF2YUVsZW1lbnRzCi0JICovCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnRbXSBnZXRKYXZhRWxlbWVudHNGb3JDdXJyZW50U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlKYXZhRWxlbWVudFtdIGVsZW1lbnRzID0gbmV3IElKYXZhRWxlbWVudFswXTsKLQkJLy8gZ2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgdmlld2VyJ3MgZG9jdW1lbnQKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQl0cnkgewotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCUpTUFRyYW5zbGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKEpTUFRyYW5zbGF0aW9uQWRhcHRlcikgeG1sRG9jLmdldEFkYXB0ZXJGb3IoSUpTUFRyYW5zbGF0aW9uLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCUpTUFRyYW5zbGF0aW9uIHRyYW5zbGF0aW9uID0gYWRhcHRlci5nZXRKU1BUcmFuc2xhdGlvbigpOwotCi0JCQkJCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDIyMTEKLQkJCQkJZWxlbWVudHMgPSB0cmFuc2xhdGlvbi5nZXRFbGVtZW50c0Zyb21Kc3BSYW5nZShzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZDRmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoUmVzdWx0OwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCBleHRlbmRzIE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0IHsKLQkKLQlwdWJsaWMgSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQoSVNlYXJjaFF1ZXJ5IHF1ZXJ5KSB7Ci0JCXN1cGVyKHF1ZXJ5KTsKLQl9Ci0JCi0JcHVibGljIE1hdGNoW10gZ2V0TWF0Y2hlcygpIHsKLQkJcmV0dXJuICgoSlNQU2VhcmNoUXVlcnkpZ2V0UXVlcnkoKSkuZ2V0TWF0Y2hlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTZWFyY2hRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFF1ZXJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOTYxNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFF1ZXJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuc2VhcmNoLlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5CYXNpY1NlYXJjaFF1ZXJ5OwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIDxjb2RlPklTZWFyY2hRdWVyeTwvY29kZT4gZm9yIDxjb2RlPklKYXZhRWxlbWVudDwvY29kZT5zIGluIEpTUCBmaWxlcy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEpTUFNlYXJjaFF1ZXJ5IGV4dGVuZHMgQmFzaWNTZWFyY2hRdWVyeSB7Ci0JCi0JLyoqIHRoZSBJSmF2YUVsZW1lbnQgd2UgYXJlIHNlYXJjaGluZyBmb3IgaW4gdGhlIGZpbGUgKiovCi0JcHJpdmF0ZSBJSmF2YUVsZW1lbnQgZkVsZW1lbnQgPSBudWxsOwotCQotCXB1YmxpYyBKU1BTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJSmF2YUVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihmaWxlKTsKLQkJdGhpcy5mRWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCQotCXB1YmxpYyBJSmF2YUVsZW1lbnQgZ2V0SmF2YUVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmZFbGVtZW50OwotCX0KLQkKLQkvLyBmb3IgYWNjZXNzIGJ5IGlubmVyIGNsYXNzCi0JcHVibGljIEpTUFNlYXJjaFF1ZXJ5IGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9RdWVyeSgpIHsKLQkJCi0JCWNsZWFyTWF0Y2hlcygpOwotCQkKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl0cnkgewotCQkJSlNQU2VhcmNoU3VwcG9ydCBzdXBwb3J0ID0gSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpOwotCQkJLy8gaW5kZXggdGhlIGZpbGUKLQkJCVNlYXJjaERvY3VtZW50IGRlbGVnYXRlID0gIHN1cHBvcnQuYWRkSnNwRmlsZShnZXRGaWxlKCkpOwotCQkJCi0JCQlTdHJpbmcgc2NvcGVQYXRoID0gZGVsZWdhdGUuZ2V0UGF0aCgpOwotCQkJSlNQU2VhcmNoU2NvcGUgc2luZ2xlRmlsZVNjb3BlID0gbmV3IEpTUFNlYXJjaFNjb3BlKG5ldyBTdHJpbmdbXXtnZXRGaWxlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBzY29wZVBhdGh9KTsKLQkJCQotCQkJLy8gcGVyZm9ybSBhIHNlYXJjaHMKLQkJCS8vIGJ5IHBhc3NpbmcgaW4gdGhpcyBqc3Agc2VhcmNoIHF1ZXJ5LCByZXF1c3RvciBjYW4gYWRkIG1hdGNoZXMKLQkJCXN1cHBvcnQuc2VhcmNoUnVubmFibGUoZ2V0SmF2YUVsZW1lbnQoKSwgc2luZ2xlRmlsZVNjb3BlLCBuZXcgSlNQU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3RvcihnZXRJbnN0YW5jZSgpKSk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKXsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiLCBJU3RhdHVzLk9LLCAiIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQJLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRMYWJlbCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJU3RyaW5nW10gYXJncyA9IHtnZXRTZWFyY2hUZXh0KCksIGdldE9jY3VycmVuY2VzQ291bnRUZXh0KCksIGdldEZpbGVuYW1lKCl9OwotCQlyZXR1cm4gTkxTLmJpbmQoSlNQVUlNZXNzYWdlcy5PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzAsIGFyZ3MpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEZpbGVuYW1lKCkgewotCQlTdHJpbmcgZmlsZW5hbWUgPSBKU1BVSU1lc3NhZ2VzLk9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMjsKLQkJaWYoZ2V0RmlsZSgpICE9IG51bGwpCi0JCQlmaWxlbmFtZSA9IGdldEZpbGUoKS5nZXROYW1lKCk7Ci0JCXJldHVybiBmaWxlbmFtZTsKLQl9Ci0JCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSB7Ci0JCVN0cmluZyBjb3VudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHBhX1RPRE8gbWFrZSBkeW5hbWljCi0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNlYXJjaFRleHQoKSB7Ci0JCXJldHVybiBmRWxlbWVudC5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQkKLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUnVuSW5CYWNrZ3JvdW5kKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5SdW5JbkJhY2tncm91bmQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeSNnZXRTZWFyY2hSZXN1bHQoKQotCSAqLwotCXB1YmxpYyBJU2VhcmNoUmVzdWx0IGdldFNlYXJjaFJlc3VsdCgpIHsKLQkJCi0JCXJldHVybiBuZXcgSlNQT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvSlNQU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOWJmMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNlYXJjaFJlcXVlc3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmphdmEuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLQotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBKU1BTZWFyY2hSZXF1ZXN0b3IgZXh0ZW5kcyBCYXNpY0pTUFNlYXJjaFJlcXVlc3RvciB7Ci0JCi0JcHJpdmF0ZSBJU2VhcmNoUmVxdWVzdG9yIGZKYXZhUmVxdWVzdG9yID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNQU2VhcmNoUmVxdWVzdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgSlNQU2VhcmNoUmVxdWVzdG9yKElTZWFyY2hSZXF1ZXN0b3IgamF2YVJlcXVlc3RvcikgewotCQkvLyBuZWVkIHRvIHJlcG9ydCBtYXRjaGVzIHRvIGphdmFSZXF1ZXN0b3IKLQkJdGhpcy5mSmF2YVJlcXVlc3RvciA9IGphdmFSZXF1ZXN0b3I7Ci0JfQotCQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU2VhcmNoTWF0Y2goSURvY3VtZW50IGpzcERvY3VtZW50LCBJRmlsZSBqc3BGaWxlLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIFN0cmluZyBqc3BUZXh0KSB7Ci0JCQotCQlpZighanNwRmlsZS5leGlzdHMoKSkKLQkJCXJldHVybjsKLQotCQlpbnQgbGluZU51bWJlciA9IC0xOwotCQl0cnkgewotCQkJbGluZU51bWJlciA9IGpzcERvY3VtZW50LmdldExpbmVPZk9mZnNldChqc3BTdGFydCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIm9mZnNldDogIiArIEludGVnZXIudG9TdHJpbmcoanNwU3RhcnQpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNyZWF0ZVNlYXJjaE1hcmtlcihqc3BGaWxlLCBqc3BTdGFydCwganNwRW5kLCBsaW5lTnVtYmVyKTsKLQkJCi0JCWlmKHRoaXMuZkphdmFSZXF1ZXN0b3IgIT0gbnVsbCkgewotCQkJTWF0Y2ggbWF0Y2ggPSBuZXcgTWF0Y2goanNwRmlsZSwganNwU3RhcnQsIGpzcEVuZCAtIGpzcFN0YXJ0KTsKLQkJCXRoaXMuZkphdmFSZXF1ZXN0b3IucmVwb3J0TWF0Y2gobWF0Y2gpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGpzcEZpbGUKLQkgKiBAcGFyYW0ganNwU3RhcnQKLQkgKiBAcGFyYW0ganNwRW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZVNlYXJjaE1hcmtlcihJRmlsZSBqc3BGaWxlLCBpbnQganNwU3RhcnQsIGludCBqc3BFbmQsIGludCBsaW5lTnVtYmVyKSB7Ci0JCQotCQl0cnkgewotCQkJSU1hcmtlciBtYXJrZXIgPSBqc3BGaWxlLmNyZWF0ZU1hcmtlcihOZXdTZWFyY2hVSS5TRUFSQ0hfTUFSS0VSKTsKLQkJCUhhc2hNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKDQpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX1NUQVJULCBuZXcgSW50ZWdlcihqc3BTdGFydCkpOwotCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5DSEFSX0VORCwgbmV3IEludGVnZXIoanNwRW5kKSk7Ci0JCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkxJTkVfTlVNQkVSLCBuZXcgSW50ZWdlcihsaW5lTnVtYmVyKSk7Ci0JCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC9KU1BTaW5nbGVGaWxlU2VhcmNoUmVxdWVzdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzVkODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL0pTUFNpbmdsZUZpbGVTZWFyY2hSZXF1ZXN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0KLS8qKgotICogPHA+Ci0gKiBTcGVjaWFsIHJlcXVlc3RvciB0aGF0IGFkZHMgc2VhcmNoIHJlc3VsdHMgZm9yIHNpbmdsZSBmaWxlIHNlYXJjaAotICogKFVzZWQgZm9yIEpTUEZpbmRPY2N1cnJlbmNlcyBhY3Rpb24pLgotICogSXQgZ3JvdXBzIGVhY2ggbWF0Y2ggYXMgaXQncyBvd24gcmVzdWx0LgotICogPC9wPgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3RvciBleHRlbmRzIEJhc2ljSlNQU2VhcmNoUmVxdWVzdG9yIHsKLQotCXByaXZhdGUgSlNQU2VhcmNoUXVlcnkgZlF1ZXJ5ID0gbnVsbDsKLQkKLQlwdWJsaWMgSlNQU2luZ2xlRmlsZVNlYXJjaFJlcXVlc3RvcihKU1BTZWFyY2hRdWVyeSBxdWVyeSkgewotCQl0aGlzLmZRdWVyeSA9IHF1ZXJ5OwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRTZWFyY2hNYXRjaChJRG9jdW1lbnQganNwRG9jdW1lbnQsIElGaWxlIGpzcEZpbGUsIGludCBqc3BTdGFydCwgaW50IGpzcEVuZCwgU3RyaW5nIGpzcFRleHQpIHsKLQkJLy8gYWRkIG1hdGNoIHRvIEpTUCBxdWVyeS4uLgotCQl0aGlzLmZRdWVyeS5hZGRNYXRjaChqc3BEb2N1bWVudCwganNwU3RhcnQsIGpzcEVuZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BNYXRjaFByZXNlbnRhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pTUE1hdGNoUHJlc2VudGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YjFhMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL2phdmEvc2VhcmNoL3VpL0pTUE1hdGNoUHJlc2VudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoTGFiZWxQcm92aWRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgSlNQTWF0Y2hQcmVzZW50YXRpb24gaW1wbGVtZW50cyBJTWF0Y2hQcmVzZW50YXRpb24gewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbiNjcmVhdGVMYWJlbFByb3ZpZGVyKCkKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgY3JlYXRlTGFiZWxQcm92aWRlcigpIHsKLQkJcmV0dXJuIG5ldyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIoKTsKLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklNYXRjaFByZXNlbnRhdGlvbiNzaG93TWF0Y2gob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2gsIGludCwgaW50LCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNob3dNYXRjaChNYXRjaCBtYXRjaCwgaW50IGN1cnJlbnRPZmZzZXQsIGludCBjdXJyZW50TGVuZ3RoLCBib29sZWFuIGFjdGl2YXRlKSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQkvLyBwYV9UT0RPIGltcGxlbWVudAotLy8JCU9iamVjdCBvYmogPSBtYXRjaC5nZXRFbGVtZW50KCk7Ci0JCS8vIHNob3cgbWF0Y2ggaW4gSlNQIGVkaXRvcgotCQlpZihhY3RpdmF0ZSkgewotCQkJLy8gdXNlIHNob3cgaW4gdGFyZ2V0PwotCQl9Ci0JCWVsc2UgewotCQkJLy8ganVzdCBzZWxlY3QKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BRdWVyeVBhcnRpY2lwYW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvamF2YS9zZWFyY2gvdWkvSlNQUXVlcnlQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWRiZjE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9qYXZhL3NlYXJjaC91aS9KU1BRdWVyeVBhcnRpY2lwYW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuamF2YS5zZWFyY2gudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSUphdmFFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLnNlYXJjaC5TZWFyY2hSZXF1ZXN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5FbGVtZW50UXVlcnlTcGVjaWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSU1hdGNoUHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5JU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLlF1ZXJ5U3BlY2lmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5zZWFyY2guSlNQU2VhcmNoU2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuc2VhcmNoLkpTUFNlYXJjaFN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5qYXZhLnNlYXJjaC5KU1BTZWFyY2hSZXF1ZXN0b3I7Ci0KLS8qKgotICogQGF1dGhvciBwYXZlcnkgCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BRdWVyeVBhcnRpY2lwYW50IGltcGxlbWVudHMgSVF1ZXJ5UGFydGljaXBhbnQgewotCi0JLy8gZm9yIGRlYnVnZ2luZwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlL2RlYnVnL2pzcHNlYXJjaCIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjc2VhcmNoKG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVNlYXJjaFJlcXVlc3Rvciwgb3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24sIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlYXJjaChJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgUXVlcnlTcGVjaWZpY2F0aW9uIHF1ZXJ5U3BlY2lmaWNhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQotCQkvL2luZGV4SWZOZWVkZWQoKTsKLQkJCi0JCS8vIGRvIHNlYXJjaCBiYXNlZCBvbiB0aGUgcGFydGljdWxhciBKYXZhIHF1ZXJ5Ci0JCWlmKHF1ZXJ5U3BlY2lmaWNhdGlvbiBpbnN0YW5jZW9mIEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pIHsKLQkJCS8vIGVsZW1lbnQgc2VhcmNoIChlZy4gZnJvbSBnbG9iYWwgZmluZCByZWZlcmVuY2VzIGluIEphdmEgZmlsZSkKLQkJCUVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24gZWxlbWVudFF1ZXJ5ID0gKEVsZW1lbnRRdWVyeVNwZWNpZmljYXRpb24pcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJSUphdmFFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50UXVlcnkuZ2V0RWxlbWVudCgpOwotCQkJCi0JCQlpZihERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gRUxFTUVOVDogIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSlNQU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkKLQkJCS8vIHBhX1RPRE8gbmVlZCB0byBhZGFwdCBKYXZhU2VhcmNoU2NvcGUgdG8gYSBKU1BTZWFyY2hTY29wZQotCQkJSlNQU2VhcmNoU3VwcG9ydC5nZXRJbnN0YW5jZSgpLnNlYXJjaChlbGVtZW50LCBuZXcgSlNQU2VhcmNoU2NvcGUoKSwganNwUmVxdWVzdG9yKTsKLQkJCQotCQl9Ci0JCWVsc2UgaWYocXVlcnlTcGVjaWZpY2F0aW9uIGluc3RhbmNlb2YgUGF0dGVyblF1ZXJ5U3BlY2lmaWNhdGlvbikgewotCQkJCi0JCQkvLyBwYXR0ZXJuIHNlYXJjaCAoZWcuIGZyb20gSmF2YSBzZWFyY2ggcGFnZSkKLQkJCVBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24gcGF0dGVyblF1ZXJ5ID0gKFBhdHRlcm5RdWVyeVNwZWNpZmljYXRpb24pcXVlcnlTcGVjaWZpY2F0aW9uOwotCQkJU3RyaW5nIHBhdHRlcm4gPSBwYXR0ZXJuUXVlcnkuZ2V0UGF0dGVybigpOwotCQkJCi0JCQlpZihERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkpTUCBRdWVyeSBQYXJ0aWNpcGFudCBzZWFyY2hpbmcgb24gUEFUVEVSTjogIiArIHBhdHRlcm4pOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCVNlYXJjaFJlcXVlc3RvciBqc3BSZXF1ZXN0b3IgPSBuZXcgSlNQU2VhcmNoUmVxdWVzdG9yKHJlcXVlc3Rvcik7Ci0JCQkKLQkJCUpTUFNlYXJjaFN1cHBvcnQuZ2V0SW5zdGFuY2UoKS5zZWFyY2gocGF0dGVybiwgCi0JCQkJCQkJCQkJCQkJbmV3IEpTUFNlYXJjaFNjb3BlKCksIAotCQkJCQkJCQkJCQkJCXBhdHRlcm5RdWVyeS5nZXRTZWFyY2hGb3IoKSwgCi0JCQkJCQkJCQkJCQkJcGF0dGVyblF1ZXJ5LmdldExpbWl0VG8oKSwgCi0JCQkJCQkJCQkJCQkJU2VhcmNoUGF0dGVybi5SX1BBVFRFUk5fTUFUQ0gsIAotCQkJCQkJCQkJCQkJCWZhbHNlLCAKLQkJCQkJCQkJCQkJCQlqc3BSZXF1ZXN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZHQudWkuc2VhcmNoLklRdWVyeVBhcnRpY2lwYW50I2VzdGltYXRlVGlja3Mob3JnLmVjbGlwc2UuamR0LnVpLnNlYXJjaC5RdWVyeVNwZWNpZmljYXRpb24pCi0JICovCi0JcHVibGljIGludCBlc3RpbWF0ZVRpY2tzKFF1ZXJ5U3BlY2lmaWNhdGlvbiBkYXRhKSB7Ci0JCS8vIHBhX1RPRE8gdXNlIHByb2plY3QgZmlsZSBjb3VudGVyIGZyb20gSlNQU2VhcmNoU3VwcG9ydC4uLgotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC51aS5zZWFyY2guSVF1ZXJ5UGFydGljaXBhbnQjZ2V0VUlQYXJ0aWNpcGFudCgpCi0JICovCi0JcHVibGljIElNYXRjaFByZXNlbnRhdGlvbiBnZXRVSVBhcnRpY2lwYW50KCkgewotCQlyZXR1cm4gbmV3IEpTUE1hdGNoUHJlc2VudGF0aW9uKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSlNQVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjI2NDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBKU1AgVUkgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIEpTUFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQkvLyBzZXR0aW5nIHRoZSBzYW1lIGFzIEhUTUwKLQkJc3RvcmUuc2V0RGVmYXVsdChKU1BVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KEpTUFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPCIpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBKU1AgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDEyNywgMCwgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDQyLCAwLCAyNTUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBzcGVjaWZpZWQgdmFsdWUgaXMgYmxhY2s7IGxlYXZpbmcgYXMgd2lkZ2V0IGRlZmF1bHQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgOTUsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgMTI3LCAxMjcpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygxOTEsIDk1LCA2MykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBuZXcganNwIGZpbGUgdGVtcGxhdGUgdG8gdXNlIGluIG5ldyBmaWxlIHdpemFyZAotCQkvKgotCQkgKiBOZWVkIHRvIGZpbmQgdGVtcGxhdGUgbmFtZSB0aGF0IGdvZXMgd2l0aCBkZWZhdWx0IHRlbXBsYXRlIGlkIChuYW1lCi0JCSAqIG1heSBjaGFuZ2UgZm9yIGRpZmZlcm50IGxhbmd1YWdlKQotCQkgKi8KLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKS5maW5kVGVtcGxhdGVCeUlkKCJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BodG1sIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9KU1BVSVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxODUwNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0pTUFVJUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBKU1AgVUkKLSAqLwotcHVibGljIGNsYXNzIEpTUFVJUHJlZmVyZW5jZU5hbWVzIHsKLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBjb250cm9scyBpZiBjb2RlIGFzc2lzdCBnZXRzIGF1dG8gYWN0aXZhdGVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRSA9IGdldEF1dG9Qcm9wb3NlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2UiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY2hhcmFjdGVycyB0aGF0IGF1dG8gYWN0aXZhdGUgY29kZQotCSAqIGFzc2lzdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEFsbCBjaGFyYWN0ZXJzIHRoYXQgdHJpZ2dlcgotCSAqIGF1dG8gY29kZSBhc3Npc3QuCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVE9fUFJPUE9TRV9DT0RFID0gZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXV0b1Byb3Bvc2VDb2RlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlQ29kZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoZSBrZXkgdG8gc3RvcmUgY3VzdG9taXplZCB0ZW1wbGF0ZXMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURVNfS0VZID0gZ2V0VGVtcGxhdGVzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVzS2V5KCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY3VzdG9tX3RlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgSlNQIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUENvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTllYjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTUpTUFJlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0pTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0eWxlZFRleHRDb2xvclBpY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi1wdWJsaWMgY2xhc3MgSlNQQ29sb3JQYWdlIGV4dGVuZHMgWE1MQ29sb3JQYWdlIHsKLQotCS8qKgotCSAqIE92ZXJyaWRkZW4gdG8gc2V0IHVwIFN0eWxlZFRleHRDb2xvclBpY2tlciBkaWZmZXJlbnRseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yUGlja2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHRoZSBjb2xvciBwaWNrZXIKLQkJZlBpY2tlciA9IG5ldyBKU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIocGFyZW50LCBTV1QuTlVMTCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZlBpY2tlci5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWZQaWNrZXIuc2V0UHJlZmVyZW5jZVN0b3JlKGZPdmVybGF5U3RvcmUpOwotCQlzZXR1cFBpY2tlcihmUGlja2VyKTsKLQotCQlmUGlja2VyLnNldFRleHQoZ2V0U2FtcGxlVGV4dCgpKTsKLQl9Ci0JCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JCUl0ZXJhdG9yIGkgPSBzdHlsZUxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZylpLm5leHQoKSkpOwkKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIEpTUFVJTWVzc2FnZXMuU2FtcGxlX0pTUF9kb2M7IC8vJE5PTi1OTFMtMSQgPSAiPCVAIHBhZ2UgXG5cdGxhbmd1YWdlPVwiamF2YVwiIFxuXHRjb250ZW50VHlwZT1cInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xXCJcbiU+XG48anNwOmluY2x1ZGUgZmx1c2g9XCJ0cnVlXCIgcGFnZT1cInRpdGxlQmFyLmpzcFwiLz5cblxuPCUtLSBVc2UgYmVsb3cgdGFncyBPTkxZIGZvciBKU1AgMS4xIC0tJT5cbjwlXG5cdFN5c3RlbS5vdXQucHJpbnRsbihcIldlbGNvbWUhXCIpO1xuJT5cbjwlLS0gVXNlIGJlbG93IHRhZ3MgT05MWSBmb3IgSlNQIDEuMiAtLSU+XG48anNwOnNjcmlwdGxldD5cblx0U3lzdGVtLm91dC5wcmludGxuKFwiV2VsY29tZSFcIik7XG48L2pzcDpzY3JpcHRsZXQ+IgotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQotCQlpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5yZW1vdmUoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCk7IC8vIGxlYXZlIGNvbnRlbnQgYmV0d2VlbiB0YWdzIGFsb25lCi0JCWNvbnRleHRTdHlsZU1hcC5yZW1vdmUoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTik7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0JCWNvbnRleHRTdHlsZU1hcC5yZW1vdmUoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOyAvLyB4bWwvaHRtbCBzcGVjaWZpYwotCQljb250ZXh0U3R5bGVNYXAucmVtb3ZlKERPTVJlZ2lvbkNvbnRleHQuWE1MX0VMRU1FTlRfREVDTF9DTE9TRSk7IC8vIHhtbC9odG1sIHNwZWNpZmljCi0KLQkJLy8JY29udGV4dFN0eWxlTWFwLnB1dChYTUxKU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgSFRNTENvbG9yTWFuYWdlci5TQ1JJUFRfQVJFQSk7Ci0JCS8vCWNvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuQkxPQ0tfVEVYVCwgSFRNTENvbG9yTWFuYWdlci5TQ1JJUFRfQVJFQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4sIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfU0NSSVBUTEVUX09QRU4sIElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfRVhQUkVTU0lPTl9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9PUEVOLCBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQkKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQkJCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQkJaW5pdENvbW1vbkRlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlkZXNjcmlwdGlvbnMucmVtb3ZlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7IC8vIGxlYXZlIGNvbnRlbnQgYmV0d2VlbiB0YWdzIGFsb25lCi0JCWRlc2NyaXB0aW9ucy5yZW1vdmUoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUiwgSlNQVUlNZXNzYWdlcy5KU1BfRGVsaW1pdGVyc19VSV8pOyAvLyROT04tTkxTLTEkID0gIkpTUCBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0pTUC5KU1BfQ09OVEVOVCwgSlNQVUlNZXNzYWdlcy5KU1BDb2xvclBhZ2VfanNwX2NvbnRlbnQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJaW5pdENvbW1vblN0eWxlTGlzdChsaXN0KTsKLQkJbGlzdC5yZW1vdmUoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsgLy8gbGVhdmUgY29udGVudCBiZXR3ZWVuIHRhZ3MgYWxvbmUKLQkJbGlzdC5yZW1vdmUoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsgLy8geG1sL2h0bWwgc3BlY2lmaWMKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApLmdldFBhcnNlcigpKTsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWdobGlnaHRpbmcgdHlwZXMKLQkJRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQotCQkvLyBtYXAgcmVnaW9uIHR5cGVzIHRvIGhpZ2hsaWdodGluZyB0eXBlcwotCQlEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQotCQlwaWNrZXIuc2V0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCXBpY2tlci5zZXREZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJcGlja2VyLnNldFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCi0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkpTUF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDcxYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUEZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSlNQRmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIEJ1dHRvbiBmVmFsaWRhdGVGcmFnbWVudHM7Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUpTUENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCi0JCUdyb3VwIGcgPSBjcmVhdGVHcm91cCgoQ29tcG9zaXRlKSBjLCAxKTsKLQkJZy5zZXRUZXh0KEpTUFVJTWVzc2FnZXMuSlNQRmlsZXNQcmVmZXJlbmNlUGFnZV8wKTsKLQkJZlZhbGlkYXRlRnJhZ21lbnRzID0gY3JlYXRlQ2hlY2tCb3goZywgSlNQVUlNZXNzYWdlcy5KU1BGaWxlc1ByZWZlcmVuY2VQYWdlXzEpOwotCQlib29sZWFuIHZhbGlkYXRlRnJhZ21lbnRzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5WQUxJREFURV9GUkFHTUVOVFMpOwotCQlmVmFsaWRhdGVGcmFnbWVudHMuc2V0U2VsZWN0aW9uKHZhbGlkYXRlRnJhZ21lbnRzKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5KU1BfUFJFRldFQlhfRklMRVNfSEVMUElEKTsKLQkJCi0JCXNldFNpemUoKENvbXBvc2l0ZSljKTsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50c0ZvckxvYWRpbmdHcm91cChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JMb2FkaW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBubyBsb2FkaW5nIHByZWZlcmVuY2VzCi0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JKU1AuQ29udGVudFR5cGVJRF9KU1ApOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UjaW5pdGlhbGl6ZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJLy8gbm8gbG9hZGluZyBwcmVmZXJlbmNlcwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0KLQkJYm9vbGVhbiB2YWxpZGF0ZUZyYWdtZW50cyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihKU1BDb3JlUHJlZmVyZW5jZU5hbWVzLlZBTElEQVRFX0ZSQUdNRU5UUyk7Ci0JCWZWYWxpZGF0ZUZyYWdtZW50cy5zZXRTZWxlY3Rpb24odmFsaWRhdGVGcmFnbWVudHMpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMudWkuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzRm9yTG9hZGluZ0dyb3VwKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JMb2FkaW5nR3JvdXAoKSB7Ci0JCS8vIG5vIGxvYWRpbmcgcHJlZmVyZW5jZXMKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJYm9vbGVhbiB2YWxpZGF0ZUZyYWdtZW50cyA9IGZWYWxpZGF0ZUZyYWdtZW50cy5nZXRTZWxlY3Rpb24oKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEpTUENvcmVQcmVmZXJlbmNlTmFtZXMuVkFMSURBVEVfRlJBR01FTlRTLCB2YWxpZGF0ZUZyYWdtZW50cyk7Ci0JCXN1cGVyLnN0b3JlVmFsdWVzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSNzdG9yZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXNGb3JMb2FkaW5nR3JvdXAoKSB7Ci0JCS8vIG5vIGxvYWRpbmcgcHJlZmVyZW5jZXMKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODMwY2RhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLQotcHVibGljIGNsYXNzIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50KTsKLQotCQlUZXh0IGxhYmVsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFiZWwuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLkpTUFNvdXJjZVByZWZlcmVuY2VQYWdlXzApOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCQotCQlQcmVmZXJlbmNlTGlua0FyZWEgZmlsZUVkaXRvcnNBcmVhID0gbmV3IFByZWZlcmVuY2VMaW5rQXJlYShjb21wb3NpdGUsIFNXVC5OT05FLCAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlIiwgSlNQVUlNZXNzYWdlcy5KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZV8xLC8vJE5PTi1OTFMtMSQKLQkJCQkJKElXb3JrYmVuY2hQcmVmZXJlbmNlQ29udGFpbmVyKSBnZXRDb250YWluZXIoKSwgbnVsbCk7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSA1OwotCQlmaWxlRWRpdG9yc0FyZWEuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJUHJlZmVyZW5jZUxpbmtBcmVhIGNvbnRlbnRUeXBlQXJlYSA9IG5ldyBQcmVmZXJlbmNlTGlua0FyZWEoY29tcG9zaXRlLCBTV1QuTk9ORSwgIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnNvdXJjZSIsIEpTUFVJTWVzc2FnZXMuSlNQU291cmNlUHJlZmVyZW5jZVBhZ2VfMiwvLyROT04tTkxTLTEkCi0JCQkJCShJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMIHwgR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gNTsKLQkJY29udGVudFR5cGVBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNjcm9sbGJhcnMgZm9yIHRoaXMgcGFyZW50IHdoZW4gbmVlZGVkCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShzYzEpOwotCQlzYzEuc2V0Q29udGVudChjb21wb3NpdGUpOwotCi0JCS8vIG5vdCBjYWxsaW5nIHNldFNpemUgZm9yIGNvbXBvc2l0ZSB3aWxsIHJlc3VsdCBpbiBhIGJsYW5rIGNvbXBvc2l0ZSwKLQkJLy8gc28gY2FsbGluZyBpdCBoZXJlIGluaXRpYWxseQotCQkvLyBzZXRTaXplIGFjdHVhbGx5IG5lZWRzIHRvIGJlIGNhbGxlZCBhZnRlciBhbGwgY29udHJvbHMgYXJlIGNyZWF0ZWQsCi0JCS8vIHNvIHNjcm9sbGVkQ29tcG9zaXRlCi0JCS8vIGhhcyBjb3JyZWN0IG1pblNpemUKLQkJc2V0U2l6ZShjb21wb3NpdGUpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBOb3RlOiBUaGUgZm9udCBpcyBzZXQgaGVyZSBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgY2xhc3MgaW5oZXJpdGluZwotCQkJLy8gICAgICAgdGhpcyBiYXNlIGNsYXNzIG1heSBhZGQgd2lkZ2V0cyB0byB0aGUgZGlhbG9nLiAgIHNldFNpemUKLQkJCS8vICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHdlIGdvIGxpdmUuCi0JCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0Ci0JCQkvLyBoYXMgc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNvbXBvc2l0ZS5zZXRGb250KHBhcmVudC5nZXRGb250KCkpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9KU1BTdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTliZDgwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0eWxlZFRleHRDb2xvclBpY2tlcjsKLQotLyoqCi0qIE92ZXJyaWRlcyBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgZm9yIHNwZWNpYWwgZW5hYmxlbWVudCBiZWhhdmlvciAKLSogZm9yIEpTUENvbnRlbnQgKG9ubHkgYmFja2dyb3VuZCBzZXR0YWJsZSkKLSoqLwotcHVibGljIGNsYXNzIEpTUFN0eWxlZFRleHRDb2xvclBpY2tlciBleHRlbmRzIFN0eWxlZFRleHRDb2xvclBpY2tlciB7Ci0JCi0JcHVibGljIEpTUFN0eWxlZFRleHRDb2xvclBpY2tlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JfQotCQotCS8qKgotCSAqIEFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlLgotCSAqIE92ZXJyaWRkZW4gdG8gZGlzYWJsZSBmb3JlZ3JvdW5kIGNvbG9yLCBib2xkLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlKFN0cmluZyBuYW1lZFN0eWxlKSB7Ci0JCXN1cGVyLmFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCQkKLQkJaWYobmFtZWRTdHlsZSA9PSBJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpIHsKLQkJCWZGb3JlZ3JvdW5kLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlpZiAoc2hvd0l0YWxpYykKLQkJCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsJCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0pTUFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlMWQ5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0KLS8qKgotICogUHJlZmVyZW5jZSBwYWdlIGZvciBKU1AgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwdWJsaWMgSlNQVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJSlNQVUlQbHVnaW4ganNwRWRpdG9yUGx1Z2luID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXNldFByZWZlcmVuY2VTdG9yZShqc3BFZGl0b3JQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXRUZW1wbGF0ZVN0b3JlKGpzcEVkaXRvclBsdWdpbi5nZXRUZW1wbGF0ZVN0b3JlKCkpOwotCQlzZXRDb250ZXh0VHlwZVJlZ2lzdHJ5KGpzcEVkaXRvclBsdWdpbi5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCUpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIG9rOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMoYW5jZXN0b3IpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5KU1BfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNjcmVhdGVWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckpTUC5Db250ZW50VHlwZUlEX0pTUDsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25KU1AoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGVJRCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFhNThmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIENvbnRhaW5zIGEgc2V0IG9mIHByb2plY3Rpb24gbW9kZWwgYWRkaXRpb25zL2RlbGV0aW9ucy9tb2RpZmljYXRpb25zCi0gKi8KLWNsYXNzIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQlwcml2YXRlIE5vZGUgZk5vZGU7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZkRlbGV0aW9uczsKLQlwcml2YXRlIE1hcCBmQWRkaXRpb25zOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZNb2RpZmljYXRpb25zOwotCi0JcHVibGljIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJZk5vZGUgPSBub2RlOwotCQlmRGVsZXRpb25zID0gZGVsZXRpb25zOwotCQlmQWRkaXRpb25zID0gYWRkaXRpb25zOwotCQlmTW9kaWZpY2F0aW9ucyA9IG1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRBZGRpdGlvbnMoKSB7Ci0JCXJldHVybiBmQWRkaXRpb25zOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0RGVsZXRpb25zKCkgewotCQlyZXR1cm4gZkRlbGV0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldE1vZGlmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiBmTW9kaWZpY2F0aW9uczsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQlyZXR1cm4gZk5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjEyZWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiBtb2RlbCBub2RlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlByb2plY3Rpb25WaWV3ZXJzOwotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTChPYmplY3QgYWRhcHRlcktleSkgewotCQlzdXBlcihhZGFwdGVyS2V5KTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCgpIHsKLQkJdGhpcyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqIEFjdHVhbGx5IGNyZWF0ZXMgYW4gYWRhcHRlciBmb3IgdGhlIHBhcmVudCBvZiB0YXJnZXQgaWYgdGFyZ2V0IGlzIHRoZQotCSAqICJhZGFwdC1hYmxlIiBub2RlCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCWlmICgoaXNBY3RpdmUoKSkgJiYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpICYmICgoTm9kZSkgdGFyZ2V0KS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgdGFyZ2V0OwotCQkJaWYgKGlzTm9kZVByb2plY3RhYmxlKG5vZGUpKSB7Ci0KLQkJCQkvLyBhY3R1YWxseSB3b3JrIHdpdGggdGhlIHBhcmVudCBub2RlIHRvIGxpc3RlbiBmb3IgYWRkLAotCQkJCS8vIGRlbGV0ZSBldmVudHMKLQkJCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCUlOb2RlTm90aWZpZXIgcGFyZW50Tm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgcGFyZW50OwotCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwgcGFyZW50QWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwpIHBhcmVudE5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJCQlpZiAocGFyZW50QWRhcHRlciA9PSBudWxsKSB7Ci0JCQkJCQkvLyBjcmVhdGUgYSBuZXcgYWRhcHRlciBmb3IgcGFyZW50Ci0JCQkJCQlwYXJlbnRBZGFwdGVyID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCh0aGlzKTsKLQkJCQkJCXBhcmVudE5vdGlmaWVyLmFkZEFkYXB0ZXIocGFyZW50QWRhcHRlcik7Ci0JCQkJCX0KLQkJCQkJLy8gY2FsbCB1cGRhdGUgb24gcGFyZW50IGJlY2F1c2UgYSBuZXcgbm9kZSBoYXMganVzdCBiZWVuCi0JCQkJCS8vIGFkZGVkCi0JCQkJCXBhcmVudEFkYXB0ZXIudXBkYXRlQWRhcHRlcihwYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgbm9kZSB0eXBlIGFibGUgdG8gZm9sZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbm9kZSBpcyBwcm9qZWN0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc05vZGVQcm9qZWN0YWJsZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkvLyBub2RlIGlzIG9ubHkgcHJvamVjdGFibGUgaWYgaXQgaXMgaGVhZCwgYm9keSwgc2NyaXB0LCBzdHlsZSwKLQkJCS8vIHRhYmxlLCB1bCwgb2wgdGFncwotCQkJaWYgKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFkuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkgfHwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgZmFjdG9yeSBpcyBjdXJyZW50bHkgYWN0aXZlbHkgbWFuYWdpbmcgcHJvamVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsICYmICFmUHJvamVjdGlvblZpZXdlcnMuaXNFbXB0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBpZiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4KLQkgKiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICovCi0Jdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoTm9kZSBub2RlLCBBbm5vdGF0aW9uW10gZGVsZXRpb25zLCBNYXAgYWRkaXRpb25zLCBBbm5vdGF0aW9uW10gbW9kaWZpY2F0aW9ucykgewotCQlxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGZvciBhIHNwZWNpZmljIHByb2plY3Rpb24gdmlld2VyIGlmCi0JICogZG9jdW1lbnQgaXMgbm90IGluIGZsdXguIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQKLQkgKiB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGRlbGV0aW9ucwotCSAqIEBwYXJhbSBhZGRpdGlvbnMKLQkgKiBAcGFyYW0gbW9kaWZpY2F0aW9ucwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyBjcmVhdGUgYSBjaGFuZ2Ugb2JqZWN0IGZvciBsYXRlc3QgY2hhbmdlIGFuZCBhZGQgdG8gcXVldWUKLQkJUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlID0gbmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIGRlbGV0aW9ucywgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlpZiAodmlld2VyICE9IG51bGwpIHsKLQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGZQcm9qZWN0aW9uVmlld2Vycy5nZXQodmlld2VyKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSXRlcmF0b3IgaW5mb3MgPSBmUHJvamVjdGlvblZpZXdlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaW5mb3MuaGFzTmV4dCgpKSB7Ci0JCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCQlpbmZvLnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhuZXdDaGFuZ2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGdvIHRocm91Z2ggZXZlcnkgcHJvamVjdGlvbnZpZXdlciBhbmQgY2FsbAotCQkvLyByZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaW5mb3MgPSBmUHJvamVjdGlvblZpZXdlcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQlQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbyA9IChQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24pIGluZm9zLm5leHQoKTsKLQkJCQlpbmZvLmRpc3Bvc2UoKTsKLQkJCQlpbmZvcy5yZW1vdmUoKTsKLQkJCX0KLQkJCWZQcm9qZWN0aW9uVmlld2VycyA9IG51bGw7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdmlld2VyIHRvIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMgZmFjdG9yeSBpcyBhc3NvY2lhdGVkCi0JICogd2l0aAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyB2aWV3ZXIncyBkb2N1bWVudCBhbmQgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JICogICAgICAgICAgICBhcmUgbm90IG51bGwKLQkgKi8KLQl2b2lkIGFkZFByb2plY3Rpb25WaWV3ZXIoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gcmVtb3ZlIG9sZCBlbnRyeSBpZiBpdCBleGlzdHMKLQkJcmVtb3ZlUHJvamVjdGlvblZpZXdlcih2aWV3ZXIpOwotCi0JCWlmIChmUHJvamVjdGlvblZpZXdlcnMgPT0gbnVsbCkgewotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJfQotCi0JCS8vIGNyZWF0ZSBuZXcgb2JqZWN0IGNvbnRhaW5pbmcgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGl0cyBpbmZvCi0JCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gbmV3IFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbih2aWV3ZXIpOwotCQlmUHJvamVjdGlvblZpZXdlcnMucHV0KHZpZXdlciwgaW5mbyk7Ci0JCWluZm8uaW5pdGlhbGl6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIGdpdmVuIHZpZXdlciBmcm9tIHRoZSBsaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyB0aGlzCi0JICogZmFjdG9yIGlzIGFzc29jaWF0ZWQgd2l0aAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIoUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQkvLyByZW1vdmUgZW50cnkgZnJvbSBsaXN0IG9mIHZpZXdlcnMKLQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLnJlbW92ZSh2aWV3ZXIpOwotCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJfQotCQkJLy8gaWYgcmVtb3ZpbmcgbGFzdCBwcm9qZWN0aW9uIHZpZXdlciwgY2xlYXIgb3V0IGV2ZXJ5dGhpbmcKLQkJCWlmIChmUHJvamVjdGlvblZpZXdlcnMuaXNFbXB0eSgpKSB7Ci0JCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMWVkZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5KU1AxMU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZXh0ZW5kcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIHsKLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQKCkgewotCQl0aGlzKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUChPYmplY3QgYWRhcHRlcktleSkgewotCQlzdXBlcihhZGFwdGVyS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIGFuIGFkYXB0ZXIgZm9yIHRoZSBwYXJlbnQgb2YgdGFyZ2V0IGlmIHRhcmdldCBpcyB0aGUKLQkgKiAiYWRhcHQtYWJsZSIgbm9kZQotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlpZiAoKGlzQWN0aXZlKCkpICYmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSAmJiAoKE5vZGUpIHRhcmdldCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSkgewotCi0JCQkJLy8gYWN0dWFsbHkgd29yayB3aXRoIHRoZSBwYXJlbnQgbm9kZSB0byBsaXN0ZW4gZm9yIGFkZCwKLQkJCQkvLyBkZWxldGUgZXZlbnRzCi0JCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQlJTm9kZU5vdGlmaWVyIHBhcmVudE5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHBhcmVudDsKLQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AgcGFyZW50QWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUCkgcGFyZW50Tm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQkJCQkJaWYgKHBhcmVudEFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGEgbmV3IGFkYXB0ZXIgZm9yIHBhcmVudAotCQkJCQkJcGFyZW50QWRhcHRlciA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUCh0aGlzKTsKLQkJCQkJCXBhcmVudE5vdGlmaWVyLmFkZEFkYXB0ZXIocGFyZW50QWRhcHRlcik7Ci0JCQkJCX0KLQkJCQkJLy8gY2FsbCB1cGRhdGUgb24gcGFyZW50IGJlY2F1c2UgYSBuZXcgbm9kZSBoYXMganVzdCBiZWVuCi0JCQkJCS8vIGFkZGVkCi0JCQkJCXBhcmVudEFkYXB0ZXIudXBkYXRlQWRhcHRlcihwYXJlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgbm9kZSB0eXBlIGFibGUgdG8gZm9sZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbm9kZSBpcyBwcm9qZWN0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc05vZGVQcm9qZWN0YWJsZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkvLyBub2RlIGlzIG9ubHkgcHJvamVjdGFibGUgaWYgaXQgaXMganNwIHNjcmlwdGxldCB0YWcKLQkJCWlmIChKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFRMRVQuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTc2MjFiNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIGltcGxlbWVudHMgSU5vZGVBZGFwdGVyIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBjbGFzcyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleHRlbmRzIFByb2plY3Rpb25Bbm5vdGF0aW9uIHsKLQkJcHJpdmF0ZSBib29sZWFuIGZJc1Zpc2libGUgPSBmYWxzZTsgLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihOb2RlIG5vZGUsIGJvb2xlYW4gaXNDb2xsYXBzZWQpIHsKLQkJCXN1cGVyKGlzQ29sbGFwc2VkKTsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5vZGUoKSB7Ci0JCQlyZXR1cm4gZk5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROb2RlKE5vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgZlRhZ0Fubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5KSB7Ci0JCWZBZGFwdGVyRmFjdG9yeSA9IGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvamVjdGlvbiBwb3NpdGlvbiBmcm9tIHRoZSBnaXZlbiBub2RlLiBBYmxlIHRvIGdldAotCSAqIHByb2plY3Rpb24gcG9zaXRpb24gaWYgbm9kZSBpc05vZGVQcm9qZWN0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbnVsbCBpZiBubyBwcm9qZWN0aW9uIHBvc2l0aW9uIHBvc3NpYmxlLCBhIFBvc2l0aW9uIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgUG9zaXRpb24gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKE5vZGUgbm9kZSkgewotCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQlpZiAoZkFkYXB0ZXJGYWN0b3J5LmlzTm9kZVByb2plY3RhYmxlKG5vZGUpICYmIG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkvLyBJRG9jdW1lbnQgZG9jdW1lbnQgPQotCQkJLy8gZkFkYXB0ZXJGYWN0b3J5LmdldFByb2plY3Rpb25WaWV3ZXIoKS5nZXREb2N1bWVudCgpOwotCQkJLy8gaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUluZGV4ZWRSZWdpb24gaW5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJCWludCBzdGFydCA9IGlub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gaW5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoc3RhcnQgPj0gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJCS8vIHJlZ2lvbi1iYXNlZAotCQkJCS8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQkJLy8gdHJ5IHsKLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IG5vIHJlZ2lvbgotCQkJCS8vIC8vIGluY3JlYXNlIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQkvLyBJUmVnaW9uIHN0YXJ0TGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnQpOwotCQkJCS8vIElSZWdpb24gZW5kTGluZVJlZ2lvbiA9Ci0JCQkJLy8gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpbnQgc3RhcnRPZmZzZXQgPSBzdGFydExpbmVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGVuZExpbmVSZWdpb24uZ2V0T2Zmc2V0KCkgKwotCQkJCS8vIGVuZExpbmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJLy8gaWYgKGVuZE9mZnNldCA+IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJLy8gcG9zID0gbmV3IFBvc2l0aW9uKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLQotCQkJCS8vIHN0YXJ0T2Zmc2V0KTsKLQkJCQkvLyB9Ci0JCQkJLy8KLQkJCQkvLyAvLyBsaW5lLWJhc2VkCi0JCQkJLy8gLy8gbm8gZXh0cmEgbGluZSB3aGVuIGNvbGxhcHNlZCwgYnV0IHJlZ2lvbiBpbmNyZWFzZQotCQkJCS8vIC8vIHdoZW4gYWRkIG5ld2xpbmUKLQkJCQkvLyBpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmQpOwotCQkJCS8vIGlmIChlbmRMaW5lICsgMSA8IGRvY3VtZW50LmdldE51bWJlck9mTGluZXMoKSkgewotCQkJCS8vIGludCBvZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHN0YXJ0TGluZSk7Ci0JCQkJLy8gaW50IGVuZE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoZW5kTGluZSArIDEpOwotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGVuZE9mZnNldCAtIG9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vIH0KLQkJCQkvLyBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCS8vIExvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIG51bGwsIHgpOwotCQkJCS8vIH0KLQkJCX0KLQkJfQotCQkvLyB9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogRmluZCBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmb3Igbm9kZSBpbiB0aGUgY3VycmVudCBsaXN0IG9mIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBnZXRFeGlzdGluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJTm9kZSBuID0gYS5nZXROb2RlKCk7Ci0JCQkJaWYgKG5vZGUuZXF1YWxzKG4pKSB7Ci0JCQkJCWFubm8gPSBhOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gY2hlY2sgaWYgZm9sZGluZyBpcyBldmVuIGVuYWJsZWQsIGlmIG5vdCwganVzdCBpZ25vcmUgbm90aWZ5Q2hhbmdlZAotCQkvLyBldmVudHMKLQkJaWYgKCFmQWRhcHRlckZhY3RvcnkuaXNBY3RpdmUoKSkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgJiYgKG5vdGlmaWVyIGluc3RhbmNlb2YgTm9kZSkpIHsKLQkJCXVwZGF0ZUFkYXB0ZXIoKE5vZGUpIG5vdGlmaWVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlKSB7Ci0JCXVwZGF0ZUFkYXB0ZXIobm9kZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUgYW5kIGFkZHMgYWxsIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gdmlld2VyIChmb3IgbmV3bHkgYWRkZWQKLQkgKiB2aWV3ZXJzKQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihOb2RlIG5vZGUsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlNYXAgYWRkaXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJTWFwIHByb2plY3Rpb25Bbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJLy8gZ28gdGhyb3VnaCBpbW1lZGlhdGUgY2hpbGQgbm9kZXMgYW5kIGZpZ3VyZSBvdXQgcHJvamVjdGlvbgotCQkvLyBtb2RlbCBhbm5vdGF0aW9ucwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJUG9zaXRpb24gbmV3UG9zID0gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJaWYgKG5ld1BvcyAhPSBudWxsKSB7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcgVGFnUHJvamVjdGlvbkFubm90YXRpb24oY2hpbGROb2RlLCBmYWxzZSk7Ci0JCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4aXN0aW5nID0gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKGNoaWxkTm9kZSk7Ci0JCQkJCWlmIChleGlzdGluZyA9PSBudWxsKSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gYWRkCi0JCQkJCQlhZGRpdGlvbnMucHV0KG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgdG8gbWFwIGNvbnRhaW5pbmcgYWxsIGFubm90YXRpb25zIGZvciB0aGlzCi0JCQkJCQkvLyBhZGFwdGVyCi0JCQkJCQlwcm9qZWN0aW9uQW5ub3RhdGlvbnMucHV0KGV4aXN0aW5nLCBuZXdQb3MpOwotCQkJCQkJLy8gcmVtb3ZlIGZyb20gbWFwIGNvbnRhaW5pbmcgYW5ub3RhdGlvbnMgdG8gZGVsZXRlCi0JCQkJCQlmVGFnQW5ub3RhdGlvbnMucmVtb3ZlKGV4aXN0aW5nKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQotCQkJLy8gaW4gdGhlIGVuZCwgd2FudCB0byBkZWxldGUgYW55dGhpbmcgbGVmdG92ZXIgaW4gb2xkIGxpc3QsIGFkZAotCQkJLy8gZXZlcnl0aGluZyBpbiBhZGRpdGlvbnMsIGFuZCB1cGRhdGUgZXZlcnl0aGluZyBpbgotCQkJLy8gcHJvamVjdGlvbkFubm90YXRpb25zCi0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG9sZExpc3QgPSBudWxsOwotCQkJaWYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJb2xkTGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBtb2RpZnlMaXN0ID0gbnVsbDsKLQkJCWlmICghcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW1vZGlmeUxpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgcHJvamVjdGlvbkFubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQotCQkJLy8gc3BlY2lmaWNhbGx5IGFkZCBhbGwgYW5ub3RhdGlvbnMgdG8gdmlld2VyCi0JCQlpZiAodmlld2VyICE9IG51bGwgJiYgIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG51bGwsIHByb2plY3Rpb25Bbm5vdGF0aW9ucywgbnVsbCwgdmlld2VyKTsKLQkJCX0KLQotCQkJLy8gb25seSB1cGRhdGUgd2hlbiB0aGVyZSBpcyBzb21ldGhpbmcgdG8gdXBkYXRlCi0JCQlpZiAoKG9sZExpc3QgIT0gbnVsbCAmJiBvbGRMaXN0Lmxlbmd0aCA+IDApIHx8ICghYWRkaXRpb25zLmlzRW1wdHkoKSkgfHwgKG1vZGlmeUxpc3QgIT0gbnVsbCAmJiBtb2RpZnlMaXN0Lmxlbmd0aCA+IDApKQotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgb2xkTGlzdCwgYWRkaXRpb25zLCBtb2RpZnlMaXN0KTsKLQkJfQotCi0JCS8vIHNhdmUgbmV3IGxpc3Qgb2YgYW5ub3RhdGlvbnMKLQkJZlRhZ0Fubm90YXRpb25zID0gcHJvamVjdGlvbkFubm90YXRpb25zOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3RyaW5nIG5vZGVOYW1lID0gbm9kZSAhPSBudWxsID8gbm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC51cGRhdGVBZGFwdGVyICgiICsgbm9kZU5hbWUgKyAiKToiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExOTUzNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi0vKioKLSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIHdpdGggcHJvamVjdGlvbiBhbm5vdGF0aW9ucyBmb3IgdGhpcwotICogYWRhcHRlciBub2RlJ3MgY2hpbGRyZW4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQIGV4dGVuZHMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIHsKLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIGZhY3RvcnkpIHsKLQkJc3VwZXIoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUC5jbGFzczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Zjg0ZDFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBwcm9qZWN0aW9uIHZpZXdlciBhbmQgYWxzbyBtYW5hZ2VzIHVwZGF0aW5nCi0gKiB0aGUgdmlld2VyJ3MgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0gKi8KLWNsYXNzIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0ZW5zIHRvIGRvY3VtZW50IHRvIGJlIGF3YXJlIG9mIHdoZW4gdG8gdXBkYXRlIHRoZSBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRMaXN0ZW5lciB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBEb2N1bWVudExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZXZlbnQuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChmSW5mby5nZXREb2N1bWVudCgpID09IGRvY3VtZW50KSB7Ci0JCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKHRydWUpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCS8vIHJlZ2lzdGVyIGEgcG9zdCBub3RpZmljYXRpb24gcmVwbGFjZSBzbyB0aGF0IHByb2plY3Rpb24KLQkJCS8vIGFubm90YXRpb24gbW9kZWwgd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGFsbCBkb2N1bWVudENoYW5nZWQKLQkJCS8vIGxpc3RlbmVycyBoYXZlIGJlZW4gbm90aWZpZWQKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24gJiYgZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWlmIChmSW5mby5oYXNDaGFuZ2VzUXVldWVkKCkpCi0JCQkJCSgoSURvY3VtZW50RXh0ZW5zaW9uKSBkb2N1bWVudCkucmVnaXN0ZXJQb3N0Tm90aWZpY2F0aW9uUmVwbGFjZSh0aGlzLCBuZXcgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZJbmZvKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFc3NlbnRpYWxseSBhIHBvc3QgZG9jdW1lbnQgY2hhbmdlZCBsaXN0ZW5lciBiZWNhdXNlIGl0IGlzIGNhbGxlZCBhZnRlcgotCSAqIGRvY3VtZW50Y2hhbmdlZCBoYXMgYmVlbiBmaXJlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSB7Ci0JCXByaXZhdGUgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGZJbmZvOwotCi0JCXB1YmxpYyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8pIHsKLQkJCWZJbmZvID0gaW5mbzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHBlcmZvcm0oSURvY3VtZW50IGRvY3VtZW50LCBJRG9jdW1lbnRMaXN0ZW5lciBvd25lcikgewotCQkJZkluZm8uYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCQlmSW5mby5zZXRJc0RvY3VtZW50Q2hhbmdpbmcoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGN1cnJlbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIHZpZXdlcgotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCBmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLQkvKioKLQkgKiBEb2N1bWVudCBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JLyoqCi0JICogTGlzdGVuZXIgdG8gZlByb2plY3Rpb25WaWV3ZXIncyBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXIgZkRvY3VtZW50TGlzdGVuZXI7Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGRvY3VtZW50IGlzIGluIHRoZSBtaWRkbGUgb2YgY2hhbmdpbmcKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZklzRG9jdW1lbnRDaGFuZ2luZyA9IGZhbHNlOwotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdGhhdCBuZWVkIHRvIGJlIGFwcGxpZWQKLQkgKi8KLQlwcml2YXRlIExpc3QgZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCi0JcHVibGljIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlmRG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgPSB2aWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwotCX0KLQotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKSB7Ci0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCXJldHVybiBmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXM7Ci0JfQotCi0Jdm9pZCBzZXRJc0RvY3VtZW50Q2hhbmdpbmcoYm9vbGVhbiBjaGFuZ2luZykgewotCQlmSXNEb2N1bWVudENoYW5naW5nID0gY2hhbmdpbmc7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRG9jdW1lbnRDaGFuZ2luZygpIHsKLQkJcmV0dXJuIGZJc0RvY3VtZW50Q2hhbmdpbmc7Ci0JfQotCi0JLyoqCi0JICogQXBwbGllcyB0aGUgcGVuZGluZyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgY2hhbmdlcyB0byB0aGUKLQkgKiBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0Jdm9pZCBhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKSB7Ci0JCUxpc3QgcXVldWVkQ2hhbmdlcyA9IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCk7Ci0JCS8vIGdvIHRocm91Z2ggYWxsIHRoZSBwZW5kaW5nIGFubm90YXRpb24gY2hhbmdlcyBhbmQgYXBwbHkKLQkJLy8gdGhlbSB0bwotCQkvLyB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsCi0JCXdoaWxlICghcXVldWVkQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIGNoYW5nZXMgPSAoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMpIHF1ZXVlZENoYW5nZXMucmVtb3ZlKDApOwotCQkJdHJ5IHsKLQkJCQlmUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbC5tb2RpZnlBbm5vdGF0aW9ucyhjaGFuZ2VzLmdldERlbGV0aW9ucygpLCBjaGFuZ2VzLmdldEFkZGl0aW9ucygpLCBjaGFuZ2VzLmdldE1vZGlmaWNhdGlvbnMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCBsb2cgaXQgYmUgY29udGludWUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFubm90YXRpb24gY2hhbmdlcyBxdWV1ZWQgdXAsIGZhbHNlIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaGFzQ2hhbmdlc1F1ZXVlZCgpIHsKLQkJcmV0dXJuICFnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmlzRW1wdHkoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBpZiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4KLQkgKiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICovCi0JcHVibGljIHZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzIG5ld0NoYW5nZSkgewotCQkvKgotCQkgKiBmdXR1cmVfVE9ETzogbWF5YmUgaW1wcm92ZSBieSBjaGVja2luZyBpZiBhbm5vdGF0aW9uIHByb2plY3Rpb24KLQkJICogbW9kZWwgY2hhbmdlIGFscmVhZHkgZXhpc3RzIGZvciBub2RlLiBpZiBzbywgdGhyb3cgb3V0IG9sZCBjaGFuZ2UuCi0JCSAqLwotCQlnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpLmFkZChuZXdDaGFuZ2UpOwotCi0JCS8vIGlmIGRvY3VtZW50IGlzbid0IGNoYW5naW5nLCBnbyBhaGVhZCBhbmQgYXBwbHkgaXQKLQkJaWYgKCFpc0RvY3VtZW50Q2hhbmdpbmcoKSkgewotCQkJYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQkvLyBhZGQgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZEb2N1bWVudExpc3RlbmVyID0gbmV3IERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJZ2V0RG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyByZW1vdmUgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKGZEb2N1bWVudExpc3RlbmVyICE9IG51bGwpIHsKLQkJCWdldERvY3VtZW50KCkucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgbGlzdCBvZiBxdWV1ZWQgY2hhbmdlcyBzaW5jZSBpdCBtYXkgbm8gbG9uZ2VyCi0JCS8vIGJlIGFjY3VyYXRlCi0JCWlmIChmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgIT0gbnVsbCkgewotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzLmNsZWFyKCk7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNjY2YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3Byb2plY3Rpb24vU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIHByb2plY3Rpb24gbW9kZWwgb2YgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciBKU1AuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciwgSVByb2plY3Rpb25MaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2UuanN0LmpzcC51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VyIGZWaWV3ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCS8qKgotCSAqIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIG5vZGVzIHRvIGFkZCBhZGFwdGVycyB0byAobGltaXQgZm9yIHBlcmZvcm1hbmNlCi0JICogc2FrZSkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBNQVhfQ0hJTERSRU4gPSAxMDsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBzaWJsaW5nIG5vZGVzIHRvIGFkZCBhZGFwdGVycyB0byAobGltaXQgZm9yCi0JICogcGVyZm9ybWFuY2Ugc2FrZSkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBNQVhfU0lCTElOR1MgPSAxMDAwOwotCi0JLyoqCi0JICogQWRkcyBhbiBhZGFwdGVyIHRvIG5vZGUgYW5kIGl0cyBjaGlsZHJlbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGNoaWxkTGV2ZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKE5vZGUgbm9kZSwgaW50IGNoaWxkTGV2ZWwpIHsKLQkJLy8gc3RvcCBhZGRpbmcgaW5pdGlhbCBhZGFwdGVycyBNQVhfQ0hJTERSRU4gbGV2ZWxzIGRlZXAgZm9yCi0JCS8vIHBlcmZvcm1hbmNlIHNha2UKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyICYmIGNoaWxkTGV2ZWwgPCBNQVhfQ0hJTERSRU4pIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQotCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGFkYXB0ZXIgZm9yIHRoZSBjdXJyZW50IG5vZGUgYW5kIHVwZGF0ZSB0aGUKLQkJCS8vIGFkYXB0ZXIgd2l0aCBwcm9qZWN0aW9uIGluZm9ybWF0aW9uCi0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckpTUCBhZGFwdGVyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIudXBkYXRlQWRhcHRlcihub2RlLCBmVmlld2VyKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGp1c3QgY2FsbCBnZXRhZGFwdGVyIHNvIHRoZSBhZGFwdGVyIGlzIGNyZWF0ZWQgYW5kCi0JCQkJLy8gYXV0b21hdGljYWxseSBpbml0aWFsaXplZAotCQkJCW5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJKU1AuY2xhc3MpOwotCQkJfQotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MIGFkYXB0ZXIyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCkgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlcjIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIyLnVwZGF0ZUFkYXB0ZXIobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IGNhbGwgZ2V0YWRhcHRlciBzbyB0aGUgYWRhcHRlciBpcyBjcmVhdGVkIGFuZAotCQkJCS8vIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQKLQkJCQlub3RpZmllci5nZXRBZGFwdGVyRm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQl9Ci0JCQlpbnQgc2libGluZ0xldmVsID0gMDsKLQkJCU5vZGUgbmV4dENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwgJiYgc2libGluZ0xldmVsIDwgTUFYX1NJQkxJTkdTKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlhZGRBZGFwdGVyVG9Ob2RlQW5kQ2hpbGRyZW4oY2hpbGROb2RlLCBjaGlsZExldmVsICsgMSk7Ci0JCQkJKytzaWJsaW5nTGV2ZWw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgYWRkcyBhbiBhZGFwdGVyIG9udG8gZWFjaCBmb3IgdHJhY2tpbmcKLQkgKiBwdXJwb3NlcwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBbGxBZGFwdGVycygpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJCUluZGV4ZWRSZWdpb24gc3RhcnROb2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRPZmZzZXQpOwotCQkJCQlpZiAoc3RhcnROb2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJaW50IHNpYmxpbmdMZXZlbCA9IDA7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsICYmIHNpYmxpbmdMZXZlbCA8IE1BWF9TSUJMSU5HUykgewotCQkJCQkJCU5vZGUgY3VycmVudE5vZGUgPSBuZXh0U2libGluZzsKLQkJCQkJCQluZXh0U2libGluZyA9IGN1cnJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCQlhZGRBZGFwdGVyVG9Ob2RlQW5kQ2hpbGRyZW4oY3VycmVudE5vZGUsIDApOwotCQkJCQkJCSsrc2libGluZ0xldmVsOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySlNQLmFkZEFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCB0byB1c2Ugd2l0aCB0aGlzCi0JICogcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGdldEFkYXB0ZXJGYWN0b3J5SFRNTChib29sZWFuIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc01vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JCQkJCS8vIGdldHRpbmcgdGhlIHByb2plY3Rpb25tb2RlbG5vZGVhZGFwdGVyIGZvciB0aGUgZmlyc3QKLQkJCQkJLy8gdGltZQotCQkJCQkvLyBzbyBkbyBzb21lIGluaXRpYWxpemluZwotCQkJCQlpZiAoIWZhY3RvcnlSZWdpc3RyeS5jb250YWlucyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpICYmIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIG5ld0ZhY3RvcnkgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCgpOwotCi0JCQkJCQkvLyBhZGQgZmFjdG9yeSB0byBmYWN0b3J5IHJlZ2lzdHJ5Ci0JCQkJCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShuZXdGYWN0b3J5KTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gcHJvcG9nYXRpbmcgYWRhcHRlcgotCQkJCQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc01vZGVsOwotCQkJCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb21Nb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJCQkJCWlmIChwcm9wYWdhdGluZ0FkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCXByb3BhZ2F0aW5nQWRhcHRlci5hZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShuZXdGYWN0b3J5KTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBmYWN0b3J5Ci0JCQkJCWZhY3RvcnkgPSAoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCkgZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5nZXRBZGFwdGVyRmFjdG9yeUhUTUw6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIHRvIHVzZSB3aXRoIHRoaXMgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBnZXRBZGFwdGVyRmFjdG9yeUpTUChib29sZWFuIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1AgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkJCQkJLy8gZ2V0dGluZyB0aGUgcHJvamVjdGlvbm1vZGVsbm9kZWFkYXB0ZXIgZm9yIHRoZSBmaXJzdAotCQkJCQkvLyB0aW1lCi0JCQkJCS8vIHNvIGRvIHNvbWUgaW5pdGlhbGl6aW5nCi0JCQkJCWlmICghZmFjdG9yeVJlZ2lzdHJ5LmNvbnRhaW5zKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKSAmJiBjcmVhdGVJZk5lZWRlZCkgewotCQkJCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIG5ld0ZhY3RvcnkgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQKCk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIGZhY3RvcnkgcmVnaXN0cnkKLQkJCQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCi0JCQkJCQkvLyBhZGQgZmFjdG9yeSB0byBwcm9wb2dhdGluZyBhZGFwdGVyCi0JCQkJCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzTW9kZWw7Ci0JCQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJCQkJaWYgKHByb3BhZ2F0aW5nQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGZhY3RvcnkKLQkJCQkJZmFjdG9yeSA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlKU1ApIGZhY3RvcnlSZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckpTUC5nZXRBZGFwdGVyRmFjdG9yeUpTUDogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGlzIHByb3ZpZGVyIHdpdGggdGhlIGNvcnJlY3QgZG9jdW1lbnQuIEFzc3VtZXMgcHJvamVjdGlvbgotCSAqIGlzIGVuYWJsZWQuIChvdGhlcndpc2UsIG9ubHkgaW5zdGFsbCB3b3VsZCBoYXZlIGJlZW4gY2FsbGVkKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmICghaXNJbnN0YWxsZWQoKSkKLQkJCXJldHVybjsKLQotCQkvLyBjbGVhciBvdXQgb2xkIGluZm8KLQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJZkRvY3VtZW50ID0gZlZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCS8vIHNldCBwcm9qZWN0aW9uIHZpZXdlciBvbiBuZXcgZG9jdW1lbnQncyBhZGFwdGVyIGZhY3RvcnkKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpIHsKLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUpTUCBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnlKU1AodHJ1ZSk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRQcm9qZWN0aW9uVmlld2VyKGZWaWV3ZXIpOwotCQkJfQotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5MiA9IGdldEFkYXB0ZXJGYWN0b3J5SFRNTCh0cnVlKTsKLQkJCWlmIChmYWN0b3J5MiAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeTIuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQotCQkJYWRkQWxsQWRhcHRlcnMoKTsKLQkJfQotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGUgYSBQcm9qZWN0aW9uVmlld2VyIHdpdGggdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHVuaW5zdGFsbCBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbGwgbmV3IHZpZXdlcgotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJdW5pbnN0YWxsKCk7Ci0JCX0KLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SlNQIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeUpTUChmYWxzZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZhY3RvcnkucmVtb3ZlUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJfQotCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGZhY3RvcnkyID0gZ2V0QWRhcHRlckZhY3RvcnlIVE1MKGZhbHNlKTsKLQkJaWYgKGZhY3RvcnkyICE9IG51bGwpIHsKLQkJCWZhY3RvcnkyLnJlbW92ZVByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIGFubm90YXRpb25zCi0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKQotCQkJZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkucmVtb3ZlQWxsQW5ub3RhdGlvbnMoKTsKLQotCQlyZW1vdmVBbGxBZGFwdGVycygpOwotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbiBhZGFwdGVyIGZyb20gbm9kZSBhbmQgaXRzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBpbnQgbGV2ZWwpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCByZW1vdmUgaXQKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySlNQLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlub3RpZmllci5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCi0JCQlJTm9kZUFkYXB0ZXIgYWRhcHRlcjIgPSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyMiAhPSBudWxsKSB7Ci0JCQkJbm90aWZpZXIucmVtb3ZlQWRhcHRlcihhZGFwdGVyMik7Ci0JCQl9Ci0KLQkJCU5vZGUgbmV4dENoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQlOb2RlIGNoaWxkTm9kZSA9IG5leHRDaGlsZDsKLQkJCQluZXh0Q2hpbGQgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGNoaWxkTm9kZSwgbGV2ZWwgKyAxKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBub2RlIGFuZCByZW1vdmVzIGFkYXB0ZXIgZnJvbSBlYWNoIGZvciBjbGVhbnVwCi0JICogcHVycG9zZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsQWRhcHRlcnMoKSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJCQlJbmRleGVkUmVnaW9uIHN0YXJ0Tm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0T2Zmc2V0KTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSAoTm9kZSkgc3RhcnROb2RlOwotCQkJCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG51bGwpIHsKLQkJCQkJCQlOb2RlIGN1cnJlbnROb2RlID0gbmV4dFNpYmxpbmc7Ci0JCQkJCQkJbmV4dFNpYmxpbmcgPSBjdXJyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJCQkJcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oY3VycmVudE5vZGUsIDApOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJKU1AuYWRkQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgZm9sZGluZyBpcyBlbmFibGVkIGFuZCBuZXcgZG9jdW1lbnQgaXMgZ29pbmcgdG8gYmUgYSB0b3RhbGx5Ci0JCS8vIGRpZmZlcmVudCBkb2N1bWVudCwgZGlzYWJsZSBwcm9qZWN0aW9uCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBmRG9jdW1lbnQgIT0gbmV3SW5wdXQpIHsKLQkJCS8vIGRpc2FibGUgcHJvamVjdGlvbiBhbmQgZGlzY29ubmVjdCBldmVyeXRoaW5nCi0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBwcm9qZWN0aW9uIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgYmVmb3JlIGlucHV0IGRvY3VtZW50IGNoYW5nZWQKLQkJLy8gYW5kIG5ldyBkb2N1bWVudCBpcyBkaWZmZXJlbnQgdGhhbiBvbGQgZG9jdW1lbnQKLQkJaWYgKGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCAmJiBmRG9jdW1lbnQgPT0gbnVsbCAmJiBuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0aW9uRW5hYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZyb20gcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwOGMxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSUpTUFRyYW5zbGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5qYXZhLkpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JKU1AgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIHRoZXNlIGFyZSB0aGUgbWFpbiBmYWN0b3JpZXMsIG9uIG1vZGVsJ3MgZmFjdG9yeSByZWdpc3RyeQotCQlhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoc3RydWN0dXJlZE1vZGVsKTsKLQkJLy8gLS0tLS0tLQotCQkvLyBNdXN0IHVwZGF0ZS9hZGQgdG8gcHJvcGFnYXRpbmcgYWRhcHRlcnMgaGVyZSB0b28KLQkJYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChJSkZhY2VOb2RlQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSlNQVHJhbnNsYXRpb24uY2xhc3MpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEpTUFRyYW5zbGF0aW9uQWRhcHRlckZhY3RvcnkoKTsKLQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUHJvcGFnYXRpbmdBZGFwdGVycyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Nb2RlbCB4bWxNb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgZG9jdW1lbnQuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKHByb3BhZ2F0aW5nQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJLy8gd2hhdCB0byBkbz8KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKENvbnRlbnRUeXBlRGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JKU1ApOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MWJmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZTsKLQotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNKU1AgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DT05URU5UID0gImpzcF9jb250ZW50IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZiY2M0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9ySlNQIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyewotCi0JcHJpdmF0ZSBTdHJpbmcgZkxhbmd1YWdlID0gbnVsbDsKLQotCS8vICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JLy8gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0gbmV3IFN0cmluZ1tdIHsKLQkvLyAiamF2YXNjcmlwdCIsICJqYXZhc2NyaXB0MS4wIiwgImphdmFzY3JpcHQxLjFfMyIsICJqYXZhc2NyaXB0MS4yIiwKLQkvLyAiamF2YXNjcmlwdDEuMyIsICJqYXZhc2NyaXB0MS40IiwgImphdmFzY3JpcHQxLjUiLCAiamF2YXNjcmlwdDEuNiIsCi0JLy8gImpzY3JpcHQiLCAic2FzaHNjcmlwdCIgfTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkvLyAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JCAvLyROT04tTkxTLTckIC8vJE5PTi1OTFMtOCQKLQkvLyAvLyROT04tTkxTLTkkIC8vJE5PTi1OTFMtMTAkCi0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1AoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKioKLQkJICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJzeXRsZSBydWxlcyIgZm9yIHJlZ2lvbnMKLQkJICovCi0JCVRleHRBdHRyaWJ1dGUgcmVzdWx0ID0gbnVsbDsKLQkJLy8gbm90IHN1cmUgd2h5IHRoaXMgaXMgY29taW5nIHRocm91Z2ggbnVsbCwgYnV0IGp1c3QgdG8gY2F0Y2ggaXQKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQl9Ci0JCWVsc2UgewotCi0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKCh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfT1BFTikgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NMT1NFKSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSB8fCB0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ST09UX1RBR19OQU1FKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkJCX0KLQkJCQllbHNlIGlmICgodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9PUEVOKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0cy5KU1BfQ09NTUVOVF9DTE9TRSkpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfVEVYVCkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCQkJfQotCQkJCS8vID09PT09PT09PT09PSBUaGVzZSBhcmUgaW4gY29tbW9uIHdpdGggWE1MIC0tLSAoZm9yIFhNTCBmb3JtCi0JCQkJLy8gb2YgdGFncykKLQkJCQkvLyAgICAgICAgICAgICAgTm90ZTogdGhpcyBhc3N1bWUncyB0aGlzIHByb3ZpZGVyIGlzIG9ubHkgY2FsbGVkIGZvcgotCQkJCS8vICAgICAgICAgICAgICB0cnVlIEpTUCBOb2Rlcy4gSWYgaXRzIGNhbGxlZCBmb3Igb3RoZXJzLCB0aGVuIHRoaXMgd2lsbAotCQkJCS8vICAgICAgICAgICAgICBjYXVzZSB0aGVpciB0YWcgbmFtZXMgdG8gYmUgaGlnaGxpZ2h0ZWQgdG9vIQotCQkJCS8vICAgICAgICAgICAgICBGdXJ0aGVyIGNoZWNrcyBjb3VsZCBiZSBkb25lIHRvIHByZXZlbnQgdGhhdCwgYnV0IGRvZXNuJ3QKLQkJCQkvLyAgICAgICAgICAgICAgc2VlbSB3b3J0aCBpdCwgc2luY2UgaWYgYWRwYXRlcnMgZmFjdG9yaWVzIGFyZSB3b3JraW5nCi0JCQkJLy8gcmlnaHQsCi0JCQkJLy8gICAgICAgICAgICAgIHRoZW4gd291bGRuJ3QgYmUgbmVlZGVkLgotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHMuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFKSkgewotCQkJCQlyZXN1bHQgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQkJCX0KLQotCQkJCS8vIERNVzogYWRkZWQgOS8xLzIwMDIgVW5kZWZpbmVkIGNvbG9yIG1heSBuZWVkIGFkZGp1c3RtZW50IDopCi0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0KLQkJCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpCi0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQkJCS8vIERNVyBhZGRlZCA4LzMwLzIwMDIgLS0gc2hvdWxkIHByb3ZpZGUgSlNQIHNwZWNpZmljCi0JCQkJLy8gcHJlZmVyZW5jZSBmb3IgImN1c3RvbSB0YWcgY29udGVudCIgKGJvdGggdGFnIGRlcGVuZGVudCwKLQkJCQkvLyBCTE9DS0VEX1RFWFQsIGFuZCBub3QsIFhNTCBDT05URU5UKQotCQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCkKLQkJCQkJcmVzdWx0ID0gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCQkJZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpCi0JCQkJCXJlc3VsdCA9IChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCQl9Ci0JCX0KLQkJLy8gZGVmYXVsdCwgcmV0dXJuIG51bGwgdG8gc2lnbmFsICJub3QgaGFuZGxlZCIKLQkJLy8gaW4gd2hpY2ggY2FzZSwgb3RoZXIgZmFjdG9yaWVzIHNob3VsZCBiZSB0cmllZAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgc3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVI7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVDsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUjsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYW5ndWFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBmTGFuZ3VhZ2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbGFuZ3VhZ2UuCi0JICogCi0JICogQHBhcmFtIGxhbmd1YWdlCi0JICogICAgICAgICAgICBUaGUgbGFuZ3VhZ2UgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCXRoaXMuZkxhbmd1YWdlID0gbGFuZ3VhZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzI1MDI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0lTdHlsZUNvbnN0YW50c0pTUEphdmEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzSlNQSmF2YSB7Ci0JU3RyaW5nIEpBVkFfS0VZV09SRCA9ICJrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQgPSAic2luZ2xlX2xpbmVfY29tbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSkFWQV9TVFJJTkcgPSAic3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBKQVZBX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2RlU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvZGVTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyOGVkNjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvZGVTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuRW5kT2ZMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuTXVsdGlMaW5lUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlNpbmdsZUxpbmVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Xb3JkUnVsZTsKLQotLyoqCi0gKiBBIEphdmEgY29kZSBzY2FubmVyLgotICovCi1jbGFzcyBKYXZhQ29kZVNjYW5uZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlJ1bGVCYXNlZFNjYW5uZXIgewotCXByaXZhdGUgSVRva2VuIGZLZXl3b3JkVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlR5cGVUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmU3RyaW5nVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlNpbmdsZUxpbmVDb21tZW50VG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZkRlZmF1bHRUb2tlbjsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnS2V5d29yZHMgPSB7ImFic3RyYWN0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJicmVhayIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiY2FzZSIsICJjYXRjaCIsICJjbGFzcyIsICJjb250aW51ZSIsIC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkiZGVmYXVsdCIsICJkbyIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJImVsc2UiLCAiZXh0ZW5kcyIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJImZpbmFsIiwgImZpbmFsbHkiLCAiZm9yIiwgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJImlmIiwgImltcGxlbWVudHMiLCAiaW1wb3J0IiwgImluc3RhbmNlb2YiLCAiaW50ZXJmYWNlIiwgLy8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkibmF0aXZlIiwgIm5ldyIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJInBhY2thZ2UiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJyZXR1cm4iLCAvLyROT04tTkxTLTEkCi0JCQkJInN0YXRpYyIsICJzdXBlciIsICJzd2l0Y2giLCAic3luY2hyb25pemVkIiwgLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSJ0aGlzIiwgInRocm93IiwgInRocm93cyIsICJ0cmFuc2llbnQiLCAidHJ5IiwgLy8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkidm9sYXRpbGUiLCAvLyROT04tTkxTLTEkCi0JCQkJIndoaWxlIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJzdHJpY3RmcCIsLy8kTk9OLU5MUy0xJAotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZmdUeXBlcyA9IHsidm9pZCIsICJib29sZWFuIiwgImNoYXIiLCAiYnl0ZSIsICJzaG9ydCIsICJpbnQiLCAibG9uZyIsICJmbG9hdCIsICJkb3VibGUifTsvLyROT04tTkxTLTkkLy8kTk9OLU5MUy04JC8vJE5PTi1OTFMtNyQvLyROT04tTkxTLTYkLy8kTk9OLU5MUy01JC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmZ0NvbnN0YW50cyA9IHsiZmFsc2UiLCAibnVsbCIsICJ0cnVlIn07Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgSmF2YSBjb2RlIHNjYW5uZXIKLQkgKi8KLQlwdWJsaWMgSmF2YUNvZGVTY2FubmVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUnVsZXMoKSB7Ci0JCUxpc3QgcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gQWRkIHJ1bGUgZm9yIG11bHRpcGxlIGxpbmUgY29tbWVudHMuCi0JCXJ1bGVzLmFkZChuZXcgTXVsdGlMaW5lUnVsZSgiLyoiLCAiKi8iLCBmU2luZ2xlTGluZUNvbW1lbnRUb2tlbikpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCS8vIEFkZCBydWxlIGZvciBzaW5nbGUgbGluZSBjb21tZW50cy4KLQkJcnVsZXMuYWRkKG5ldyBFbmRPZkxpbmVSdWxlKCIvLyIsIGZTaW5nbGVMaW5lQ29tbWVudFRva2VuKSk7Ly8kTk9OLU5MUy0xJAotCi0JCS8vIEFkZCBydWxlIGZvciBzdHJpbmdzIGFuZCBjaGFyYWN0ZXIgY29uc3RhbnRzLgotCQlydWxlcy5hZGQobmV3IFNpbmdsZUxpbmVSdWxlKCJcIiIsICJcIiIsIGZTdHJpbmdUb2tlbiwgJ1xcJykpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJ1bGVzLmFkZChuZXcgU2luZ2xlTGluZVJ1bGUoIiciLCAiJyIsIGZTdHJpbmdUb2tlbiwgJ1xcJykpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJLy8gQWRkIGdlbmVyaWMgd2hpdGVzcGFjZSBydWxlLgotCQkvL3J1bGVzLmFkZChuZXcgV2hpdGVzcGFjZVJ1bGUobmV3IEphdmFXaGl0ZXNwYWNlRGV0ZWN0b3IoKSkpOwotCi0JCS8vIEFkZCB3b3JkIHJ1bGUgZm9yIGtleXdvcmRzLCB0eXBlcywgYW5kIGNvbnN0YW50cy4KLQkJV29yZFJ1bGUgd29yZFJ1bGUgPSBuZXcgV29yZFJ1bGUobmV3IEphdmFXb3JkRGV0ZWN0b3IoKSwgZkRlZmF1bHRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdLZXl3b3Jkcy5sZW5ndGg7IGkrKykKLQkJCXdvcmRSdWxlLmFkZFdvcmQoZmdLZXl3b3Jkc1tpXSwgZktleXdvcmRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdUeXBlcy5sZW5ndGg7IGkrKykKLQkJCXdvcmRSdWxlLmFkZFdvcmQoZmdUeXBlc1tpXSwgZlR5cGVUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdDb25zdGFudHMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnQ29uc3RhbnRzW2ldLCBmVHlwZVRva2VuKTsKLQkJcnVsZXMuYWRkKHdvcmRSdWxlKTsKLQotCi0JCUlSdWxlW10gcmVzdWx0ID0gbmV3IElSdWxlW3J1bGVzLnNpemUoKV07Ci0JCXJ1bGVzLnRvQXJyYXkocmVzdWx0KTsKLQkJc2V0UnVsZXMocmVzdWx0KTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0VG9rZW5EYXRhKFN0cmluZyB0b2tlbktleSwgT2JqZWN0IGRhdGEpIHsKLQkJaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9LRVlXT1JEKSB7Ci0JCQlmS2V5d29yZFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQkJZlR5cGVUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU1RSSU5HKSB7Ci0JCQlmU3RyaW5nVG9rZW4gPSBuZXcgVG9rZW4oZGF0YSk7Ci0JCX0gZWxzZSBpZiAodG9rZW5LZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLQkJCWZTaW5nbGVMaW5lQ29tbWVudFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9IGVsc2UgaWYgKHRva2VuS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKSB7Ci0JCQlmRGVmYXVsdFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvbG9yUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0phdmFDb2xvclByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDM1NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YUNvbG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLlByZWZlcmVuY2VDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci0KLS8qKgotICogQ29sb3JzIHVzZWQgaW4gdGhlIEphdmEgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXZhQ29sb3JQcm92aWRlciB7Ci0JCi0JLy8gcGVvcGxlIHNob3VsZCBub3QgYmUgc2V0dGluZyB0aGVzZSwgZXZlbiB0aG91Z2ggdGhleSBhcmUgY3VycmVudGx5IG5vdCBmaW5hbAotCXB1YmxpYyBzdGF0aWMgUkdCIE1VTFRJX0xJTkVfQ09NTUVOVCA9IG5ldyBSR0IoMTI4LCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBTSU5HTEVfTElORV9DT01NRU5UID0gbmV3IFJHQigxMjgsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgS0VZV09SRCA9IG5ldyBSR0IoMCwgMCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBUWVBFID0gbmV3IFJHQigwLCAwLCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIFNUUklORyA9IG5ldyBSR0IoMCwgMTI4LCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBERUZBVUxUID0gbmV3IFJHQigwLCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0tFWVdPUkQgPSBuZXcgUkdCKDAsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19UQUcgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfTElOSyA9IG5ldyBSR0IoMTI4LCAxMjgsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19ERUZBVUxUID0gbmV3IFJHQigwLCAxMjgsIDEyOCk7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgTVVMVElfTElORV9DT01NRU5UX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IFNJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgS0VZV09SRF9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgVFlQRV9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgU1RSSU5HX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IERFRkFVTFRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19LRVlXT1JEX0JPTEQgPSBTV1QuQk9MRDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX1RBR19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX0xJTktfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19ERUZBVUxUX0JPTEQgPSBTV1QuTk9STUFMOwotCQotCXByaXZhdGUgc3RhdGljIEphdmFDb2xvclByb3ZpZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBKYXZhQ29sb3JQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSmF2YUNvbG9yUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQkKLQkvKioKLQkgKiBVc2UgY29sb3JzIGZyb20gSkRUIHBsdWdpbgotCSAqLwotCXB1YmxpYyB2b2lkIGxvYWRKYXZhQ29sb3JzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIGpkdFN0b3JlID0gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJTVVMVElfTElORV9DT01NRU5UID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJU0lOR0xFX0xJTkVfQ09NTUVOVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQlLRVlXT1JEID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SKTsKLQkJVFlQRSA9IEtFWVdPUkQ7Ci0JCVNUUklORyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19DT0xPUik7Ci0JCURFRkFVTFQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IpOwotCQlKQVZBRE9DX0tFWVdPUkQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0tFWVdPUkRfQ09MT1IpOwotCQlKQVZBRE9DX1RBRyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfVEFHX0NPTE9SKTsKLQkJSkFWQURPQ19MSU5LID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19MSU5LU19DT0xPUik7Ci0JCUpBVkFET0NfREVGQVVMVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfREVGQVVMVF9DT0xPUik7Ci0JCQotCQlNVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlTSU5HTEVfTElORV9DT01NRU5UX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUtFWVdPUkRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlUWVBFX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJU1RSSU5HX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJREVGQVVMVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfVEFHX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfVEFHX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX0xJTktfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19MSU5LU19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19ERUZBVUxUX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfREVGQVVMVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV2hpdGVzcGFjZURldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV2hpdGVzcGFjZURldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MTg5M2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdoaXRlc3BhY2VEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLQotCi0vKioKLSAqIEEgamF2YSBhd2FyZSB3aGl0ZSBzcGFjZSBkZXRlY3Rvci4KLSAqLwotcHVibGljIGNsYXNzIEphdmFXaGl0ZXNwYWNlRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXaGl0ZXNwYWNlRGV0ZWN0b3IgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXaGl0ZXNwYWNlRGV0ZWN0b3IjaXNXaGl0ZXNwYWNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9KYXZhV29yZERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3ZmU3NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2phdmEvSmF2YVdvcmREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmphdmE7Ci0KLQotLyoqCi0gKiBBIEphdmEgYXdhcmUgd29yZCBkZXRlY3Rvci4KLSAqLwotcHVibGljIGNsYXNzIEphdmFXb3JkRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclBhcnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1dvcmRQYXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JV29yZERldGVjdG9yI2lzV29yZElkZW50aWZpZXJTdGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFN0YXJ0KGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJTdGFydChjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvamF2YS9MaW5lU3R5bGVQcm92aWRlckZvckphdmEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTA5MzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qYXZhL0xpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qYXZhOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vLyBOb3RlOiBtYW55IG9mIHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3Mgd2VyZSBiYXNlZCBvbiAob3IgY29waWVkIGZyb20pIHRob3NlCi0vLyBmb3VuZCBpbiB0aGUgZXhhbXBsZSBKYXZhIEVkaXRvcgotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YSBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyewotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGhhdmUgdG8gZG8gaXQgdGhpcyB3YXkgc28gb3RoZXJzIGNhbiBvdmVycmlkZSB0aGUgbWV0aG9kCi0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBIaWdobGlnaHRlciBmSGlnaGxpZ2h0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0luaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCS8qKiBUaGUgc2Nhbm5lciBpdCB1c2VzICovCi0JcHJpdmF0ZSBKYXZhQ29kZVNjYW5uZXIgZlNjYW5uZXI7Ci0JLyoqIENvbnRhaW5zIGFsbCB0ZXh0IGF0dHJpYnV0ZXMgcHJldGFpbmluZyB0byB0aGlzIGxpbmUgc3R5bGUgcHJvdmlkZXIgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlRleHRBdHRyaWJ1dGVzID0gbnVsbDsKLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckphdmEoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZTY2FubmVyID0gbmV3IEphdmFDb2RlU2Nhbm5lcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgc3R5bGUgaW5mb3JtYXRpb24gdG8gdGhlIGdpdmVuIHRleHQgcHJlc2VudGF0aW9uLgotCSAqCi0JICogQHBhcmFtIHByZXNlbnRhdGlvbiB0aGUgdGV4dCBwcmVzZW50YXRpb24gdG8gYmUgZXh0ZW5kZWQKLQkgKiBAcGFyYW0gb2Zmc2V0IHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqIEBwYXJhbSBsZW5ndGggdGhlIGxlbmd0aCBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICogQHBhcmFtIGF0dHIgdGhlIGF0dHJpYnV0ZSBkZXNjcmliaW5nIHRoZSBzdHlsZSBvZiB0aGUgcmFuZ2UgdG8gYmUgc3R5bGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFJhbmdlKENvbGxlY3Rpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBUZXh0QXR0cmlidXRlIGF0dHIpIHsKLQkJLy8gc3VwcG9ydCBmb3IgdXNlciBkZWZpbmVkIGJhY2tncm91ZCBmb3IgSlNQIHNjcmlwdGxldCByZWdpb25zCi0JCVN0cmluZyBzdHlsZVN0cmluZyA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSVN0eWxlQ29uc3RhbnRzSlNQLkpTUF9DT05URU5UKTsKLQkJU3RyaW5nW10gcHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlU3RyaW5nKTsKLQkJQ29sb3IgYmdDb2xvciA9IChwcmVmcyAhPSBudWxsICYmIHByZWZzLmxlbmd0aCA9PSAzICYmIHByZWZzWzFdLnN0YXJ0c1dpdGgoIiMiKSAmJiBEaXNwbGF5LmdldEN1cnJlbnQoKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJPyBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIENvbG9ySGVscGVyLnRvUkdCKHByZWZzWzFdKSkKLQkJCQkJCQk6IGF0dHIuZ2V0QmFja2dyb3VuZCgpOwotCQkJCQkJCQotCQlwcmVzZW50YXRpb24uYWRkKG5ldyBTdHlsZVJhbmdlKG9mZnNldCwgbGVuZ3RoLCBhdHRyLmdldEZvcmVncm91bmQoKSwgYmdDb2xvciwgYXR0ci5nZXRTdHlsZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJaWYgKGdldENvbG9yUHJlZmVyZW5jZXMoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldENvbG9yUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoY29sb3JLZXkpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCQkJCWJvb2xlYW4gYm9sZCA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlnZXRUZXh0QXR0cmlidXRlcygpLnB1dChjb2xvcktleSwgY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kLCBib2xkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkSmF2YVRleHRBdHRyaWJ1dGUoU3RyaW5nIGNvbG9yS2V5KSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBnZXRKYXZhQ29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAoc3RvcmUgIT0gbnVsbCAmJiBjb2xvcktleSAhPSBudWxsKSB7IAotCQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG51bGw7Ci0JCQlpZiAoY29sb3JLZXkgPT0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0tFWVdPUkQpIHsKLQkJCQkvLyBrZXl3b3JkCi0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQyk7Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIGJvbGQsIGl0YWxpY3MpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU1RSSU5HKSB7Ci0JCQkJLy8gc3RyaW5nCi0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU1RSSU5HX0lUQUxJQyk7Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIGJvbGQsIGl0YWxpY3MpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCkgewotCQkJCS8vIHNpbmdsZSBsaW5lIGNvbW1lbnQKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfU0lOR0xFX0xJTkVfQ09NTUVOVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfSVRBTElDKTsKLQkJCQl0YSA9IGNyZWF0ZVRleHRBdHRyaWJ1dGUoZm9yZWdyb3VuZCwgbnVsbCwgYm9sZCwgaXRhbGljcyk7Ci0JCQl9IGVsc2UgaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKSB7Ci0JCQkJLy8gZGVmYXVsdAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMpOwotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBib2xkLCBpdGFsaWNzKTsKLQkJCX0KLQkJCWlmICh0YSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIHRhKTsKLQkJCQlmU2Nhbm5lci5zZXRUb2tlbkRhdGEoY29sb3JLZXksIHRhKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBjcmVhdGVUZXh0QXR0cmlidXRlKFJHQiBmb3JlZ3JvdW5kLCBSR0IgYmFja2dyb3VuZCwgYm9vbGVhbiBib2xkKSB7Ci0JCXJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBib2xkID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKTsKLQl9Ci0JCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGNyZWF0ZVRleHRBdHRyaWJ1dGUoUkdCIGZvcmVncm91bmQsIFJHQiBiYWNrZ3JvdW5kLCBib29sZWFuIGJvbGQsIGJvb2xlYW4gaXRhbGljcykgewotCQlpbnQgc3R5bGUgPSBib2xkID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlpZiAoaXRhbGljcykKLQkJCXN0eWxlIHw9IFNXVC5JVEFMSUM7Ci0JCQotCQlyZXR1cm4gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgc3R5bGUpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNodGFibGUgY29udGFpbmluZyBhbGwgdGhlIHRleHQgYXR0cmlidXRlcyBmb3IgdGhpcyBsaW5lCi0JICogc3R5bGUgcHJvdmlkZXIuIExhemlseSBjcmVhdGVzIGEgaGFzaHRhYmxlIGlmIG9uZSBoYXMgbm90IGFscmVhZHkgYmVlbgotCSAqIGNyZWF0ZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRUZXh0QXR0cmlidXRlcygpIHsKLQkJaWYgKGZUZXh0QXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQkJbG9hZENvbG9ycygpOwotCQl9Ci0JCXJldHVybiBmVGV4dEF0dHJpYnV0ZXM7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgYSB0ZXh0IGF0dHJpYnV0ZSBlbmNvZGVkIGluIHRoZSBnaXZlbiB0b2tlbi4gSWYgdGhlIHRva2VuJ3MKLQkgKiBkYXRhIGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiBhbmQgYSB0ZXh0IGF0dHJpYnV0ZSBpdCBpcyBhc3N1bWVkIHRoYXQKLQkgKiBpdCBpcyB0aGUgZW5jb2RlZCB0ZXh0IGF0dHJpYnV0ZS4gSXQgcmV0dXJucyB0aGUgZGVmYXVsdCB0ZXh0IGF0dHJpYnV0ZQotCSAqIGlmIHRoZXJlIGlzIG5vIGVuY29kZWQgdGV4dCBhdHRyaWJ1dGUgZm91bmQuCi0JICoKLQkgKiBAcGFyYW0gdG9rZW4gdGhlIHRva2VuIHdob3NlIHRleHQgYXR0cmlidXRlIGlzIHRvIGJlIGRldGVybWluZWQKLQkgKiBAcmV0dXJuIHRoZSB0b2tlbidzIHRleHQgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldFRva2VuVGV4dEF0dHJpYnV0ZShJVG9rZW4gdG9rZW4pIHsKLQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG51bGw7Ci0JCQotCQlPYmplY3QgZGF0YSA9IHRva2VuLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgaW5zdGFuY2VvZiBUZXh0QXR0cmlidXRlKQotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSlkYXRhOwotCQllbHNlIHsKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQpOwotCQl9Ci0JCXJldHVybiB0YTsgCi0JfQotCQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSGlnaGxpZ2h0ZXIgaGlnaGxpZ2h0ZXIpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZIaWdobGlnaHRlciA9IGhpZ2hsaWdodGVyOwotCQkKLQkJaWYgKGZJc0luaXRpYWxpemVkKQotCQkJcmV0dXJuOwotCi0JCXJlZ2lzdGVyUHJlZmVyZW5jZUxpc3RlbmVyKCk7Ci0KLQkJZklzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCX0KLQotCXByaXZhdGUgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCQotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TVFJJTkcpOwotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKTsKLQkJCi0JCWZTY2FubmVyLmluaXRpYWxpemVSdWxlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQkJU3RyaW5nIGphdmFTdHlsZUtleSA9IG51bGw7Ci0KLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQk9MRC5lcXVhbHMocHJlZktleSkpfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9LRVlXT1JEOwotCQkJfSBlbHNlIGlmIChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TVFJJTkdfQk9MRC5lcXVhbHMocHJlZktleSkpfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9TVFJJTkc7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IuZXF1YWxzKHByZWZLZXkpIHx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0JPTEQuZXF1YWxzKHByZWZLZXkpKXx8IChQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9TSU5HTEVfTElORV9DT01NRU5UX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX1NJTkdMRV9MSU5FX0NPTU1FTlQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xELmVxdWFscyhwcmVmS2V5KSl8fCAoUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0lUQUxJQy5lcXVhbHMocHJlZktleSkpKSB7Ci0JCQkJamF2YVN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQl9Ci0JCWlmIChqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZEphdmFUZXh0QXR0cmlidXRlKGphdmFTdHlsZUtleSk7Ci0JCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCB8fCBqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gZm9yY2UgYSBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIKLQkJCWZIaWdobGlnaHRlci5yZWZyZXNoRGlzcGxheSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgc3Nzc3JlcXVlc3RlZFN0YXJ0LCBpbnQgc3Nzc3JlcXVlc3RlZExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQkvLyBpZGVhbGx5LCBldmVudHVhbGx5LCB3ZSdsbCBoYXZlIGEgInZpcnR1YWxEb2N1bWVudCIgd2UgY2FuIAotCQkJLy8gcmVmZXIgdG8sIGJ1dCBmb3Igbm93IC4uLiB3ZSdsbCBzaW1wbGUgcmVzY2FuIHRoZSBvbmUgcmVnaW9uLgotCQkJLy8gdXNlIHNpbXBsZSBhZGp1c3RtZW50IChzaW5jZSAic3ViLWNvbnRlbnQiIHN0YXJ0cyBhdCAwCi0JCQlpbnQgb2Zmc2V0QWRqdXN0bWVudCA9IHR5cGVkUmVnaW9uLmdldE9mZnNldCgpOwotCQkJU3RyaW5nIGNvbnRlbnQgPSBmRG9jdW1lbnQuZ2V0KHR5cGVkUmVnaW9uLmdldE9mZnNldCgpLCB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBuZXcgRG9jdW1lbnQoY29udGVudCk7Ci0KLQkJCWludCBsYXN0U3RhcnQgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlJVG9rZW4gbGFzdFRva2VuID0gVG9rZW4uVU5ERUZJTkVEOwotCi0JCQlpbnQgcmVtYWluaW5nTGVuZ3RoID0gdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlmU2Nhbm5lci5zZXRSYW5nZShkb2N1bWVudCwgbGFzdFN0YXJ0LCByZW1haW5pbmdMZW5ndGgpOwotCi0JCQl3aGlsZSAodHJ1ZSkgewotCi0JCQkJSVRva2VuIHRva2VuID0gZlNjYW5uZXIubmV4dFRva2VuKCk7Ci0KLQkJCQlpZiAodG9rZW4uaXNFT0YoKSkgewotCQkJCQlpZiAoIWxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpICYmIGxlbmd0aCAhPSAwKQotCQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCArIG9mZnNldEFkanVzdG1lbnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAodG9rZW4uaXNXaGl0ZXNwYWNlKCkpIHsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmIChsYXN0VG9rZW4uaXNVbmRlZmluZWQoKSkgewotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCWlmICh0b2tlbiAhPSBsYXN0VG9rZW4pIHsKLQkJCQkJYWRkUmFuZ2UoaG9sZFJlc3VsdHMsIGxhc3RTdGFydCArIG9mZnNldEFkanVzdG1lbnQsIGxlbmd0aCwgZ2V0VG9rZW5UZXh0QXR0cmlidXRlKGxhc3RUb2tlbikpOwotCQkJCQlsYXN0VG9rZW4gPSB0b2tlbjsKLQkJCQkJbGFzdFN0YXJ0ID0gZlNjYW5uZXIuZ2V0VG9rZW5PZmZzZXQoKTsKLQkJCQkJbGVuZ3RoID0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJbGVuZ3RoICs9IGZTY2FubmVyLmdldFRva2VuTGVuZ3RoKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZG4ndCBoYXBwZW4sIGJ1dCB3ZSBkb24ndCB3YW50IGl0IHRvIHN0b3Agb3RoZXIgaGlnaGxpZ2h0aW5nLCBpZiBpdCBkb2VzLgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUHJlZmVyZW5jZUxpc3RlbmVyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl1bnJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJaWYgKGZUZXh0QXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJCWZUZXh0QXR0cmlidXRlcyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5yZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldEphdmFDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSVN0eWxlQ29uc3RhbnRzSlNQRUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9JU3R5bGVDb25zdGFudHNKU1BFTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTk4ODQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9JU3R5bGVDb25zdGFudHNKU1BFTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzSlNQRUwgewotCVN0cmluZyBFTF9LRVlXT1JEID0gImtleXdvcmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEVMX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvZGVTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxDb2RlU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2Y3Y2M5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvZGVTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLldoaXRlc3BhY2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuV29yZFJ1bGU7Ci0KLS8qKgotICogQSBKYXZhIGNvZGUgc2Nhbm5lci4KLSAqLwotcHVibGljIGNsYXNzIEpTUEVMQ29kZVNjYW5uZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLlJ1bGVCYXNlZFNjYW5uZXIgewotCXByaXZhdGUgSVRva2VuIGZLZXl3b3JkVG9rZW47Ci0JcHJpdmF0ZSBJVG9rZW4gZlR5cGVUb2tlbjsKLQlwcml2YXRlIElUb2tlbiBmRGVmYXVsdFRva2VuOwotCQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnS2V5d29yZHMgPSB7Ci0JCQkJImFuZCIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZGlkIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJkaXYiLCAvLyROT04tTkxTLTEkCi0JCQkJImVtcHR5IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJlcSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkiZ2UiLCAvLyROT04tTkxTLTEkCi0JCQkJImd0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJvciIsIC8vJE5PTi1OTFMtMSQKLQkJCQkibGUiLCAvLyROT04tTkxTLTEkCi0JCQkJImx0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJtb2QiLCAvLyROT04tTkxTLTEkCi0gCQkJCSJuZSIsIC8vJE5PTi1OTFMtMSQKLSAJCQkJIm5vdCIgIC8vJE5PTi1OTFMtMSQKLQl9OwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGZnQ29uc3RhbnRzID0geyJmYWxzZSIsICJ0cnVlIn07Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBKYXZhIGNvZGUgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBKU1BFTENvZGVTY2FubmVyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUnVsZXMoKSB7Ci0JCUxpc3QgcnVsZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gQWRkIGdlbmVyaWMgd2hpdGVzcGFjZSBydWxlLgotCQlydWxlcy5hZGQobmV3IFdoaXRlc3BhY2VSdWxlKG5ldyBKU1BFTFdoaXRlc3BhY2VEZXRlY3RvcigpKSk7Ci0KLQkJLy8gQWRkIHdvcmQgcnVsZSBmb3Iga2V5d29yZHMsIHR5cGVzLCBhbmQgY29uc3RhbnRzLgotCQlXb3JkUnVsZSB3b3JkUnVsZSA9IG5ldyBXb3JkUnVsZShuZXcgSlNQRUxXb3JkRGV0ZWN0b3IoKSwgZkRlZmF1bHRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdLZXl3b3Jkcy5sZW5ndGg7IGkrKykKLQkJCXdvcmRSdWxlLmFkZFdvcmQoZmdLZXl3b3Jkc1tpXSwgZktleXdvcmRUb2tlbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmdDb25zdGFudHMubGVuZ3RoOyBpKyspCi0JCQl3b3JkUnVsZS5hZGRXb3JkKGZnQ29uc3RhbnRzW2ldLCBmVHlwZVRva2VuKTsKLQkJcnVsZXMuYWRkKHdvcmRSdWxlKTsKLQotCQlJUnVsZVtdIHJlc3VsdCA9IG5ldyBJUnVsZVtydWxlcy5zaXplKCldOwotCQlydWxlcy50b0FycmF5KHJlc3VsdCk7Ci0JCXNldFJ1bGVzKHJlc3VsdCk7Ci0JfQotCQotCXB1YmxpYyB2b2lkIHNldFRva2VuRGF0YShTdHJpbmcgdG9rZW5LZXksIE9iamVjdCBkYXRhKSB7Ci0JCWlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9LRVlXT1JEKSB7Ci0JCQlmS2V5d29yZFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQkJZlR5cGVUb2tlbiA9IG5ldyBUb2tlbihkYXRhKTsKLQkJfSBlbHNlIGlmICh0b2tlbktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9ERUZBVUxUKSB7Ci0JCQlmRGVmYXVsdFRva2VuID0gbmV3IFRva2VuKGRhdGEpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29sb3JQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMQ29sb3JQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTYwNzFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTENvbG9yUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuanNwZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLQotLyoqCi0gKiBDb2xvcnMgdXNlZCBpbiB0aGUgSmF2YSBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEpTUEVMQ29sb3JQcm92aWRlciB7Ci0JCi0JLy8gcGVvcGxlIHNob3VsZCBub3QgYmUgc2V0dGluZyB0aGVzZSwgZXZlbiB0aG91Z2ggdGhleSBhcmUgY3VycmVudGx5IG5vdCBmaW5hbAotCXB1YmxpYyBzdGF0aWMgUkdCIE1VTFRJX0xJTkVfQ09NTUVOVCA9IG5ldyBSR0IoMTI4LCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBTSU5HTEVfTElORV9DT01NRU5UID0gbmV3IFJHQigxMjgsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgS0VZV09SRCA9IG5ldyBSR0IoMCwgMCwgMTI4KTsKLQlwdWJsaWMgc3RhdGljIFJHQiBUWVBFID0gbmV3IFJHQigwLCAwLCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIFNUUklORyA9IG5ldyBSR0IoMCwgMTI4LCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBERUZBVUxUID0gbmV3IFJHQigwLCAwLCAwKTsKLQlwdWJsaWMgc3RhdGljIFJHQiBKQVZBRE9DX0tFWVdPUkQgPSBuZXcgUkdCKDAsIDEyOCwgMCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19UQUcgPSBuZXcgUkdCKDEyOCwgMTI4LCAxMjgpOwotCXB1YmxpYyBzdGF0aWMgUkdCIEpBVkFET0NfTElOSyA9IG5ldyBSR0IoMTI4LCAxMjgsIDEyOCk7Ci0JcHVibGljIHN0YXRpYyBSR0IgSkFWQURPQ19ERUZBVUxUID0gbmV3IFJHQigwLCAxMjgsIDEyOCk7Ci0JCi0JcHVibGljIHN0YXRpYyBpbnQgTVVMVElfTElORV9DT01NRU5UX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IFNJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgS0VZV09SRF9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgVFlQRV9CT0xEID0gU1dULkJPTEQ7Ci0JcHVibGljIHN0YXRpYyBpbnQgU1RSSU5HX0JPTEQgPSBTV1QuTk9STUFMOwotCXB1YmxpYyBzdGF0aWMgaW50IERFRkFVTFRfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19LRVlXT1JEX0JPTEQgPSBTV1QuQk9MRDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX1RBR19CT0xEID0gU1dULk5PUk1BTDsKLQlwdWJsaWMgc3RhdGljIGludCBKQVZBRE9DX0xJTktfQk9MRCA9IFNXVC5OT1JNQUw7Ci0JcHVibGljIHN0YXRpYyBpbnQgSkFWQURPQ19ERUZBVUxUX0JPTEQgPSBTV1QuTk9STUFMOwotCQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGFsbCBlZGl0b3JzIHVzZSBzYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBSR0IgRURJVE9SX0JBQ0tHUk9VTkQgPSBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIGFsbCBlZGl0b3JzIHVzZSBzYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIEVESVRPUl9DVVJSRU5UX0xJTkUgPSB0cnVlOwotCS8qKgotCSAqIEBkZXByZWNhdGVkIGFsbCBlZGl0b3JzIHVzZSBzYW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBSR0IgRURJVE9SX0NVUlJFTlRfTElORV9DT0xPUiA9IG5ldyBSR0IoMTI4LCAxMjgsIDEyOCk7Ci0JCi0JcHJpdmF0ZSBzdGF0aWMgSlNQRUxDb2xvclByb3ZpZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci0JCi0JcHVibGljIHN0YXRpYyBKU1BFTENvbG9yUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IEpTUEVMQ29sb3JQcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCQotCS8qKgotCSAqIFVzZSBjb2xvcnMgZnJvbSBKRFQgcGx1Z2luCi0JICovCi0JcHVibGljIHZvaWQgbG9hZEphdmFDb2xvcnMoKSB7Ci0JCQotCQlJUHJlZmVyZW5jZVN0b3JlIGpkdFN0b3JlID0gUHJlZmVyZW5jZUNvbnN0YW50cy5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJTVVMVElfTElORV9DT01NRU5UID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0NPTE9SKTsKLQkJU0lOR0xFX0xJTkVfQ09NTUVOVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQ09MT1IpOwotCQlLRVlXT1JEID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0NPTE9SKTsKLQkJVFlQRSA9IEtFWVdPUkQ7Ci0JCVNUUklORyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19DT0xPUik7Ci0JCURFRkFVTFQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQ09MT1IpOwotCQlKQVZBRE9DX0tFWVdPUkQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKGpkdFN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBRE9DX0tFWVdPUkRfQ09MT1IpOwotCQlKQVZBRE9DX1RBRyA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfVEFHX0NPTE9SKTsKLQkJSkFWQURPQ19MSU5LID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihqZHRTdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19MSU5LU19DT0xPUik7Ci0JCUpBVkFET0NfREVGQVVMVCA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoamR0U3RvcmUsIFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfREVGQVVMVF9DT0xPUik7Ci0JCQotCQlNVUxUSV9MSU5FX0NPTU1FTlRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfTVVMVElfTElORV9DT01NRU5UX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlTSU5HTEVfTElORV9DT01NRU5UX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NJTkdMRV9MSU5FX0NPTU1FTlRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUtFWVdPUkRfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlUWVBFX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJU1RSSU5HX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX1NUUklOR19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJREVGQVVMVF9CT0xEID0gamR0U3RvcmUuZ2V0Qm9vbGVhbihQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0RFRkFVTFRfQk9MRCkgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCUpBVkFET0NfVEFHX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfVEFHX0JPTEQpID8gU1dULkJPTEQgOiBTV1QuTk9STUFMOwotCQlKQVZBRE9DX0xJTktfQk9MRCA9IGpkdFN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQURPQ19MSU5LU19CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJSkFWQURPQ19ERUZBVUxUX0JPTEQgPSBqZHRTdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFET0NfREVGQVVMVF9CT0xEKSA/IFNXVC5CT0xEIDogU1dULk5PUk1BTDsKLQkJCi0vLwkJRURJVE9SX0JBQ0tHUk9VTkQgPSBuZXcgUkdCKDI1NSwgMjU1LCAyNTUpOwotCQkKLS8vCQlJUHJlZmVyZW5jZVN0b3JlIHNzZVN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotLy8JCUVESVRPUl9DVVJSRU5UX0xJTkUgPSBzc2VTdG9yZS5nZXRCb29sZWFuKEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0NVUlJFTlRfTElORSk7Ci0vLwkJRURJVE9SX0NVUlJFTlRfTElORV9DT0xPUiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3NlU3RvcmUsIEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvclByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0NVUlJFTlRfTElORV9DT0xPUik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3N0eWxlL2pzcGVsL0pTUEVMV2hpdGVzcGFjZURldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyMzQ1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5zdHlsZS5qc3BlbDsKLQotCi0KLS8qKgotICogQSBqYXZhIGF3YXJlIHdoaXRlIHNwYWNlIGRldGVjdG9yLgotICovCi1wdWJsaWMgY2xhc3MgSlNQRUxXaGl0ZXNwYWNlRGV0ZWN0b3IgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXaGl0ZXNwYWNlRGV0ZWN0b3IgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXaGl0ZXNwYWNlRGV0ZWN0b3IjaXNXaGl0ZXNwYWNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXaGl0ZXNwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvSlNQRUxXb3JkRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdvcmREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Njc2ZTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9KU1BFTFdvcmREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi0KLS8qKgotICogQSBKYXZhIGF3YXJlIHdvcmQgZGV0ZWN0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BFTFdvcmREZXRlY3RvciBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciB7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucnVsZXMuSVdvcmREZXRlY3RvciNpc1dvcmRJZGVudGlmaWVyUGFydAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV29yZFBhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYyk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJ1bGVzLklXb3JkRGV0ZWN0b3IjaXNXb3JkSWRlbnRpZmllclN0YXJ0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXb3JkU3RhcnQoY2hhciBjKSB7Ci0JCXJldHVybiBDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclN0YXJ0KGMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9MaW5lU3R5bGVQcm92aWRlckZvckpTUEVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvc3R5bGUvanNwZWwvTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjAwMGEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC9zdHlsZS9qc3BlbC9MaW5lU3R5bGVQcm92aWRlckZvckpTUEVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnN0eWxlLmpzcGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQudWkuUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5JVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5ydWxlcy5Ub2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuc3R5bGUuamF2YS5JU3R5bGVDb25zdGFudHNKU1BKYXZhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vLyBOb3RlOiBtYW55IG9mIHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3Mgd2VyZSBiYXNlZCBvbiAob3IgY29waWVkIGZyb20pCi0vLyB0aG9zZQotLy8gZm91bmQgaW4gdGhlIGV4YW1wbGUgSmF2YSBFZGl0b3IKLXB1YmxpYyBjbGFzcyBMaW5lU3R5bGVQcm92aWRlckZvckpTUEVMIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIGhhdmUgdG8gZG8gaXQgdGhpcyB3YXkgc28gb3RoZXJzIGNhbiBvdmVycmlkZSB0aGUgbWV0aG9kCi0JCQloYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBIaWdobGlnaHRlciBmSGlnaGxpZ2h0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZJc0luaXRpYWxpemVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcigpOwotCS8qKiBUaGUgc2Nhbm5lciBpdCB1c2VzICovCi0JcHJpdmF0ZSBKU1BFTENvZGVTY2FubmVyIGZTY2FubmVyOwotCS8qKiBDb250YWlucyBhbGwgdGV4dCBhdHRyaWJ1dGVzIHByZXRhaW5pbmcgdG8gdGhpcyBsaW5lIHN0eWxlIHByb3ZpZGVyICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZUZXh0QXR0cmlidXRlcyA9IG51bGw7Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JKU1BFTCgpIHsKLQkJc3VwZXIoKTsKLQkJZlNjYW5uZXIgPSBuZXcgSlNQRUxDb2RlU2Nhbm5lcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgc3R5bGUgaW5mb3JtYXRpb24gdG8gdGhlIGdpdmVuIHRleHQgcHJlc2VudGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwcmVzZW50YXRpb24KLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHByZXNlbnRhdGlvbiB0byBiZSBleHRlbmRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIHRvIGJlIHN0eWxlZAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICB0aGUgYXR0cmlidXRlIGRlc2NyaWJpbmcgdGhlIHN0eWxlIG9mIHRoZSByYW5nZSB0byBiZSBzdHlsZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUmFuZ2UoQ29sbGVjdGlvbiBwcmVzZW50YXRpb24sIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFRleHRBdHRyaWJ1dGUgYXR0cikgewotCQkvLyBzdXBwb3J0IGZvciB1c2VyIGRlZmluZWQgYmFja2dyb3VkIGZvciBKU1Agc2NyaXB0bGV0IHJlZ2lvbnMKLQkJU3RyaW5nIHN0eWxlU3RyaW5nID0gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhJU3R5bGVDb25zdGFudHNKU1AuSlNQX0NPTlRFTlQpOwotCQlTdHJpbmdbXSBwcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMoc3R5bGVTdHJpbmcpOwotCQlDb2xvciBiZ0NvbG9yID0gKHByZWZzICE9IG51bGwgJiYgcHJlZnMubGVuZ3RoID09IDMgJiYgcHJlZnNbMV0uc3RhcnRzV2l0aCgiIyIpICYmIERpc3BsYXkuZ2V0Q3VycmVudCgpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJCQkJPyBuZXcgQ29sb3IoRGlzcGxheS5nZXRDdXJyZW50KCksIENvbG9ySGVscGVyLnRvUkdCKHByZWZzWzFdKSkgOiBhdHRyLmdldEJhY2tncm91bmQoKTsKLQotCQlwcmVzZW50YXRpb24uYWRkKG5ldyBTdHlsZVJhbmdlKG9mZnNldCwgbGVuZ3RoLCBhdHRyLmdldEZvcmVncm91bmQoKSwgYmdDb2xvciwgYXR0ci5nZXRTdHlsZSgpKSk7Ci0JfQotCi0JLyoqCi0JICogTG9va3MgdXAgdGhlIGNvbG9yS2V5IGluIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGFuZCBhZGRzIHRoZSBzdHlsZQotCSAqIGluZm9ybWF0aW9uIHRvIGxpc3Qgb2YgVGV4dEF0dHJpYnV0ZXMKLQkgKiAKLQkgKiBAcGFyYW0gY29sb3JLZXkKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJaWYgKGdldENvbG9yUHJlZmVyZW5jZXMoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldENvbG9yUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoY29sb3JLZXkpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCQkJCWJvb2xlYW4gYm9sZCA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlnZXRUZXh0QXR0cmlidXRlcygpLnB1dChjb2xvcktleSwgY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kLCBib2xkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb29rcyB1cCB0aGUgY29sb3JLZXkgaW4gdGhlIHByZWZlcmVuY2Ugc3RvcmUgYW5kIGFkZHMgdGhlIHN0eWxlCi0JICogaW5mb3JtYXRpb24gdG8gbGlzdCBvZiBUZXh0QXR0cmlidXRlcwotCSAqIAotCSAqIEBwYXJhbSBjb2xvcktleQotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRKYXZhVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IGdldEphdmFDb2xvclByZWZlcmVuY2VzKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsICYmIGNvbG9yS2V5ICE9IG51bGwpIHsKLQkJCVRleHRBdHRyaWJ1dGUgdGEgPSBudWxsOwotCQkJaWYgKGNvbG9yS2V5ID09IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0tFWVdPUkQpIHsKLQkJCQkvLyBrZXl3b3JkCi0JCQkJUkdCIGZvcmVncm91bmQgPSBQcmVmZXJlbmNlQ29udmVydGVyLmdldENvbG9yKHN0b3JlLCBQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9KQVZBX0tFWVdPUkRfQ09MT1IpOwotCQkJCWJvb2xlYW4gYm9sZCA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0JPTEQpOwotCQkJCWJvb2xlYW4gaXRhbGljcyA9IHN0b3JlLmdldEJvb2xlYW4oUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9LRVlXT1JEX0lUQUxJQyk7Ci0JCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIG51bGwsIGJvbGQsIGl0YWxpY3MpOwotCQkJfSBlbHNlIGlmIChjb2xvcktleSA9PSBJU3R5bGVDb25zdGFudHNKU1BFTC5FTF9ERUZBVUxUKSB7Ci0JCQkJLy8gZGVmYXVsdAotCQkJCVJHQiBmb3JlZ3JvdW5kID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwgUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSkFWQV9ERUZBVUxUX0NPTE9SKTsKLQkJCQlib29sZWFuIGJvbGQgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xEKTsKLQkJCQlib29sZWFuIGl0YWxpY3MgPSBzdG9yZS5nZXRCb29sZWFuKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMpOwotCQkJCXRhID0gY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBudWxsLCBib2xkLCBpdGFsaWNzKTsKLQkJCX0KLQkJCWlmICh0YSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGV4dEF0dHJpYnV0ZXMoKS5wdXQoY29sb3JLZXksIHRhKTsKLQkJCQlmU2Nhbm5lci5zZXRUb2tlbkRhdGEoY29sb3JLZXksIHRhKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBjcmVhdGVUZXh0QXR0cmlidXRlKFJHQiBmb3JlZ3JvdW5kLCBSR0IgYmFja2dyb3VuZCwgYm9vbGVhbiBib2xkKSB7Ci0JCXJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBib2xkID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRBdHRyaWJ1dGUgY3JlYXRlVGV4dEF0dHJpYnV0ZShSR0IgZm9yZWdyb3VuZCwgUkdCIGJhY2tncm91bmQsIGJvb2xlYW4gYm9sZCwgYm9vbGVhbiBpdGFsaWNzKSB7Ci0JCWludCBzdHlsZSA9IGJvbGQgPyBTV1QuQk9MRCA6IFNXVC5OT1JNQUw7Ci0JCWlmIChpdGFsaWNzKQotCQkJc3R5bGUgfD0gU1dULklUQUxJQzsKLQotCQlyZXR1cm4gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGhhc2h0YWJsZSBjb250YWluaW5nIGFsbCB0aGUgdGV4dCBhdHRyaWJ1dGVzIGZvciB0aGlzIGxpbmUKLQkgKiBzdHlsZSBwcm92aWRlci4gTGF6aWx5IGNyZWF0ZXMgYSBoYXNodGFibGUgaWYgb25lIGhhcyBub3QgYWxyZWFkeSBiZWVuCi0JICogY3JlYXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldFRleHRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZlRleHRBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWZUZXh0QXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlsb2FkQ29sb3JzKCk7Ci0JCX0KLQkJcmV0dXJuIGZUZXh0QXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdGV4dCBhdHRyaWJ1dGUgZW5jb2RlZCBpbiB0aGUgZ2l2ZW4gdG9rZW4uIElmIHRoZSB0b2tlbidzCi0JICogZGF0YSBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4gYW5kIGEgdGV4dCBhdHRyaWJ1dGUgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JICogaXQgaXMgdGhlIGVuY29kZWQgdGV4dCBhdHRyaWJ1dGUuIEl0IHJldHVybnMgdGhlIGRlZmF1bHQgdGV4dCBhdHRyaWJ1dGUKLQkgKiBpZiB0aGVyZSBpcyBubyBlbmNvZGVkIHRleHQgYXR0cmlidXRlIGZvdW5kLgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqICAgICAgICAgICAgdGhlIHRva2VuIHdob3NlIHRleHQgYXR0cmlidXRlIGlzIHRvIGJlIGRldGVybWluZWQKLQkgKiBAcmV0dXJuIHRoZSB0b2tlbidzIHRleHQgYXR0cmlidXRlCi0JICovCi0JcHJpdmF0ZSBUZXh0QXR0cmlidXRlIGdldFRva2VuVGV4dEF0dHJpYnV0ZShJVG9rZW4gdG9rZW4pIHsKLQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG51bGw7Ci0KLQkJT2JqZWN0IGRhdGEgPSB0b2tlbi5nZXREYXRhKCk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgVGV4dEF0dHJpYnV0ZSkKLQkJCXRhID0gKFRleHRBdHRyaWJ1dGUpIGRhdGE7Ci0JCWVsc2UgewotCQkJdGEgPSAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzSlNQSmF2YS5KQVZBX0RFRkFVTFQpOwotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmSGlnaGxpZ2h0ZXIgPSBoaWdobGlnaHRlcjsKLQotCQlpZiAoZklzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0KLQkJcmVnaXN0ZXJQcmVmZXJlbmNlTGlzdGVuZXIoKTsKLQotCQlmSXNJbml0aWFsaXplZCA9IHRydWU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRDb2xvcnMoKSB7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQotCQlhZGRKYXZhVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNKU1BKYXZhLkpBVkFfS0VZV09SRCk7Ci0JCWFkZEphdmFUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0pTUEphdmEuSkFWQV9ERUZBVUxUKTsKLQotCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHlsZUtleSA9IG51bGw7Ci0JCVN0cmluZyBqYXZhU3R5bGVLZXkgPSBudWxsOwotCi0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZktleSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0JCQkvLyBjaGVjayBpZiBwcmVmZXJlbmNlIGNoYW5nZWQgaXMgYSBzdHlsZSBwcmVmZXJlbmNlCi0JCQlpZiAoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUU7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfS0VZV09SRF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0tFWVdPUkQ7Ci0JCQl9IGVsc2UgaWYgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9DT0xPUi5lcXVhbHMocHJlZktleSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9CT0xELmVxdWFscyhwcmVmS2V5KSkgfHwgKFByZWZlcmVuY2VDb25zdGFudHMuRURJVE9SX0pBVkFfREVGQVVMVF9JVEFMSUMuZXF1YWxzKHByZWZLZXkpKSkgewotCQkJCWphdmFTdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0pTUEVMLkVMX0RFRkFVTFQ7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQl9Ci0JCWlmIChqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZEphdmFUZXh0QXR0cmlidXRlKGphdmFTdHlsZUtleSk7Ci0JCQlmU2Nhbm5lci5pbml0aWFsaXplUnVsZXMoKTsKLQkJfQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCB8fCBqYXZhU3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gZm9yY2UgYSBmdWxsIHVwZGF0ZSBvZiB0aGUgdGV4dCB2aWV3ZXIKLQkJCWZIaWdobGlnaHRlci5yZWZyZXNoRGlzcGxheSgpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgc3Nzc3JlcXVlc3RlZFN0YXJ0LCBpbnQgc3Nzc3JlcXVlc3RlZExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQkvLyBpZGVhbGx5LCBldmVudHVhbGx5LCB3ZSdsbCBoYXZlIGEgInZpcnR1YWxEb2N1bWVudCIgd2UgY2FuCi0JCQkvLyByZWZlciB0bywgYnV0IGZvciBub3cgLi4uIHdlJ2xsIHNpbXBsZSByZXNjYW4gdGhlIG9uZSByZWdpb24uCi0JCQkvLyB1c2Ugc2ltcGxlIGFkanVzdG1lbnQgKHNpbmNlICJzdWItY29udGVudCIgc3RhcnRzIGF0IDAKLQkJCWludCBvZmZzZXRBZGp1c3RtZW50ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlTdHJpbmcgY29udGVudCA9IGZEb2N1bWVudC5nZXQodHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCksIHR5cGVkUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudChjb250ZW50KTsKLQotCQkJaW50IGxhc3RTdGFydCA9IDA7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCUlUb2tlbiBsYXN0VG9rZW4gPSBUb2tlbi5VTkRFRklORUQ7Ci0KLQkJCWludCByZW1haW5pbmdMZW5ndGggPSB0eXBlZFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCWZTY2FubmVyLnNldFJhbmdlKGRvY3VtZW50LCBsYXN0U3RhcnQsIHJlbWFpbmluZ0xlbmd0aCk7Ci0KLQkJCXdoaWxlICh0cnVlKSB7Ci0KLQkJCQlJVG9rZW4gdG9rZW4gPSBmU2Nhbm5lci5uZXh0VG9rZW4oKTsKLQotCQkJCWlmICh0b2tlbi5pc0VPRigpKSB7Ci0JCQkJCWlmICghbGFzdFRva2VuLmlzVW5kZWZpbmVkKCkgJiYgbGVuZ3RoICE9IDApCi0JCQkJCQlhZGRSYW5nZShob2xkUmVzdWx0cywgbGFzdFN0YXJ0ICsgb2Zmc2V0QWRqdXN0bWVudCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQotCQkJCWlmICh0b2tlbi5pc1doaXRlc3BhY2UoKSkgewotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKGxhc3RUb2tlbi5pc1VuZGVmaW5lZCgpKSB7Ci0JCQkJCWxhc3RUb2tlbiA9IHRva2VuOwotCQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKHRva2VuICE9IGxhc3RUb2tlbikgewotCQkJCQlhZGRSYW5nZShob2xkUmVzdWx0cywgbGFzdFN0YXJ0ICsgb2Zmc2V0QWRqdXN0bWVudCwgbGVuZ3RoLCBnZXRUb2tlblRleHRBdHRyaWJ1dGUobGFzdFRva2VuKSk7Ci0JCQkJCWxhc3RUb2tlbiA9IHRva2VuOwotCQkJCQlsYXN0U3RhcnQgPSBmU2Nhbm5lci5nZXRUb2tlbk9mZnNldCgpOwotCQkJCQlsZW5ndGggPSBmU2Nhbm5lci5nZXRUb2tlbkxlbmd0aCgpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlsZW5ndGggKz0gZlNjYW5uZXIuZ2V0VG9rZW5MZW5ndGgoKTsKLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IHdlIGRvbid0IHdhbnQgaXQgdG8gc3RvcCBvdGhlcgotCQkJLy8gaGlnaGxpZ2h0aW5nLCBpZiBpdCBkb2VzLgotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHJlZ2lzdGVyUHJlZmVyZW5jZUxpc3RlbmVyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQl1blJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQkJaWYgKGZUZXh0QXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlmVGV4dEF0dHJpYnV0ZXMuY2xlYXIoKTsKLQkJCWZUZXh0QXR0cmlidXRlcyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5SZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlnZXRDb2xvclByZWZlcmVuY2VzKCkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcmVmZXJlbmNlTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQkKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0SmF2YUNvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBQcmVmZXJlbmNlQ29uc3RhbnRzLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxQcmludGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MUHJpbnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWRmYjQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0hUTUxQcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dURXJyb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotCi0KLS8qKgotICogUHJvdmlkZXMgYSBzZXQgb2YgY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY3JlYXRpbmcgSFRNTCBwYWdlcy4KLSAqIAotICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSFRNTFByaW50ZXIKLSAqLwotY2xhc3MgSFRNTFByaW50ZXIgewotCi0Jc3RhdGljIFJHQiBCR19DT0xPUl9SR0IgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gRGlzcGxheS5nZXREZWZhdWx0KCk7Ci0JCWlmIChkaXNwbGF5ICE9IG51bGwgJiYgIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSB7Ci0JCQl0cnkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJLyoKLQkJCQkJICogQHNlZSBqYXZhLmxhbmcuUnVubmFibGUjcnVuKCkKLQkJCQkJICovCi0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUJHX0NPTE9SX1JHQiA9IGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0lORk9fQkFDS0dST1VORCkuZ2V0UkdCKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCWNhdGNoIChTV1RFcnJvciBlcnIpIHsKLQkJCQkvLyBzZWU6IGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD00NTI5NAotCQkJCWlmIChlcnIuY29kZSAhPSBTV1QuRVJST1JfREVWSUNFX0RJU1BPU0VEKQotCQkJCQl0aHJvdyBlcnI7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEhUTUxQcmludGVyKCkgewotCQkvLyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHRleHQsIGNoYXIgYywgU3RyaW5nIHMpIHsKLQotCQlpbnQgcHJldmlvdXMgPSAwOwotCQlpbnQgY3VycmVudCA9IHRleHQuaW5kZXhPZihjLCBwcmV2aW91cyk7Ci0KLQkJaWYgKGN1cnJlbnQgPT0gLTEpCi0JCQlyZXR1cm4gdGV4dDsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl3aGlsZSAoY3VycmVudCA+IC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHByZXZpb3VzLCBjdXJyZW50KSk7Ci0JCQlidWZmZXIuYXBwZW5kKHMpOwotCQkJcHJldmlvdXMgPSBjdXJyZW50ICsgMTsKLQkJCWN1cnJlbnQgPSB0ZXh0LmluZGV4T2YoYywgcHJldmlvdXMpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcocHJldmlvdXMpKTsKLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgJyYnLCAiJmFtcDsiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCAnIicsICImcXVvdDsiKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCAnPCcsICImbHQ7Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlcGxhY2UoY29udGVudCwgJz4nLCAiJmd0OyIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIFN0cmluZyByZWFkKFJlYWRlciByZCkgewotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbMjA0OF07Ci0KLQkJdHJ5IHsKLQkJCWludCBuID0gcmQucmVhZChyZWFkQnVmZmVyKTsKLQkJCXdoaWxlIChuID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJbiA9IHJkLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCS8vIG5ldmVyIGV4cGVjdGVkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCB4LmdldE1lc3NhZ2UoKSwgeCk7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24sIFJHQiBiZ1JHQiwgVVJMIHN0eWxlU2hlZXRVUkwpIHsKLQotCQlpZiAoYmdSR0IgPT0gbnVsbCkKLQkJCWluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgc3R5bGVTaGVldFVSTCk7Ci0JCWVsc2UgewotCQkJU3RyaW5nQnVmZmVyIHBhZ2VQcm9sb2cgPSBuZXcgU3RyaW5nQnVmZmVyKDMwMCk7Ci0KLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCI8aHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlhcHBlbmRTdHlsZVNoZWV0TGluayhwYWdlUHJvbG9nLCBzdHlsZVNoZWV0VVJMKTsKLQotCQkJcGFnZVByb2xvZy5hcHBlbmQoIjxib2R5IHRleHQ9XCIjMDAwMDAwXCIgYmdjb2xvcj1cIiIpOyAvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRDb2xvcihwYWdlUHJvbG9nLCBiZ1JHQik7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiXCI+PGZvbnQgc2l6ZT0tMT4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlidWZmZXIuaW5zZXJ0KHBvc2l0aW9uLCBwYWdlUHJvbG9nLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uLCBSR0IgYmdSR0IpIHsKLQkJaWYgKGJnUkdCID09IG51bGwpCi0JCQlpbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgcG9zaXRpb24pOwotCQllbHNlIHsKLQkJCVN0cmluZ0J1ZmZlciBwYWdlUHJvbG9nID0gbmV3IFN0cmluZ0J1ZmZlcig2MCk7Ci0JCQlwYWdlUHJvbG9nLmFwcGVuZCgiPGh0bWw+PGJvZHkgdGV4dD1cIiMwMDAwMDBcIiBiZ2NvbG9yPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZENvbG9yKHBhZ2VQcm9sb2csIGJnUkdCKTsKLQkJCXBhZ2VQcm9sb2cuYXBwZW5kKCJcIj48Zm9udCBzaXplPS0xPiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuaW5zZXJ0KHBvc2l0aW9uLCBwYWdlUHJvbG9nLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRTdHlsZVNoZWV0TGluayhTdHJpbmdCdWZmZXIgYnVmZmVyLCBVUkwgc3R5bGVTaGVldFVSTCkgewotCQlpZiAoc3R5bGVTaGVldFVSTCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJ1ZmZlci5hcHBlbmQoIjxoZWFkPiIpOyAvLyROT04tTkxTLTEkCi0KLQkJYnVmZmVyLmFwcGVuZCgiPExJTksgUkVMPVwic3R5bGVzaGVldFwiIEhSRUY9IFwiIik7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChzdHlsZVNoZWV0VVJMKTsKLQkJYnVmZmVyLmFwcGVuZCgiXCIgQ0hBUlNFVD1cIklTTy04ODU5LTFcIiBUWVBFPVwidGV4dC9jc3NcIj4iKTsgLy8kTk9OLU5MUy0xJAotCi0JCWJ1ZmZlci5hcHBlbmQoIjwvaGVhZD4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kQ29sb3IoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgUkdCIHJnYikgewotCQlidWZmZXIuYXBwZW5kKCcjJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZ2IucmVkKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhyZ2IuZ3JlZW4pKTsKLQkJYnVmZmVyLmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKHJnYi5ibHVlKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGluc2VydFBhZ2VQcm9sb2coU3RyaW5nQnVmZmVyIGJ1ZmZlciwgaW50IHBvc2l0aW9uKSB7Ci0JCWluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgZ2V0QmdDb2xvcigpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgaW5zZXJ0UGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24sIFVSTCBzdHlsZVNoZWV0VVJMKSB7Ci0JCWluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCBwb3NpdGlvbiwgZ2V0QmdDb2xvcigpLCBzdHlsZVNoZWV0VVJMKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBSR0IgZ2V0QmdDb2xvcigpIHsKLQkJaWYgKEJHX0NPTE9SX1JHQiAhPSBudWxsKQotCQkJcmV0dXJuIEJHX0NPTE9SX1JHQjsKLQkJLy8gUkdCIHZhbHVlIG9mIGluZm8gYmcgY29sb3Igb24gV2luZG93c1hQCi0JCXJldHVybiBuZXcgUkdCKDI1NSwgMjU1LCAyMjUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaW5zZXJ0UGFnZVByb2xvZyhidWZmZXIsIGJ1ZmZlci5sZW5ndGgoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhZ2VFcGlsb2coU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlidWZmZXIuYXBwZW5kKCI8L2ZvbnQ+PC9ib2R5PjwvaHRtbD4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydEJ1bGxldExpc3QoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlidWZmZXIuYXBwZW5kKCI8dWw+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgZW5kQnVsbGV0TGlzdChTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWJ1ZmZlci5hcHBlbmQoIjwvdWw+Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkQnVsbGV0KFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBidWxsZXQpIHsKLQkJaWYgKGJ1bGxldCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8bGk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJ1ZmZlci5hcHBlbmQoYnVsbGV0KTsKLQkJCWJ1ZmZlci5hcHBlbmQoIjwvbGk+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRTbWFsbEhlYWRlcihTdHJpbmdCdWZmZXIgYnVmZmVyLCBTdHJpbmcgaGVhZGVyKSB7Ci0JCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgiPGg1PiIpOyAvLyROT04tTkxTLTEkCi0JCQlidWZmZXIuYXBwZW5kKGhlYWRlcik7Ci0JCQlidWZmZXIuYXBwZW5kKCI8L2g1PiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgYWRkUGFyYWdyYXBoKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBwYXJhZ3JhcGgpIHsKLQkJaWYgKHBhcmFncmFwaCAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCI8cD4iKTsgLy8kTk9OLU5MUy0xJAotCQkJYnVmZmVyLmFwcGVuZChwYXJhZ3JhcGgpOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZFBhcmFncmFwaChTdHJpbmdCdWZmZXIgYnVmZmVyLCBSZWFkZXIgcGFyYWdyYXBoUmVhZGVyKSB7Ci0JCWlmIChwYXJhZ3JhcGhSZWFkZXIgIT0gbnVsbCkKLQkJCWFkZFBhcmFncmFwaChidWZmZXIsIHJlYWQocGFyYWdyYXBoUmVhZGVyKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmY2ODBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIGNvbnRleHQgaGVscCBmb3IgSlNQIHRhZ3MgKFNob3cgdG9vbHRpcCBkZXNjcmlwdGlvbikKLSAqLwotcHVibGljIGNsYXNzIEpTUEluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmVGV4dEhvdmVyID0gbnVsbDsKLQotCXB1YmxpYyBKU1BJbmZvcm1hdGlvblByb3ZpZGVyKCkgewotCQlmVGV4dEhvdmVyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRJbmZvcm1hdGlvbjIoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVySW5mbyh0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YzYwOTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NIb3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5JSmF2YUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LmNvcmUuSU1lbWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZHQuY29yZS5KYXZhTW9kZWxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamR0LnVpLkphdmFFbGVtZW50TGFiZWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC51aS5KYXZhZG9jQ29udGVudEFjY2VzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuamF2YS5JSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLmphdmEuSlNQVHJhbnNsYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5BYnN0cmFjdEhvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLQotLyoqCi0gKiBQcm92aWRlcyBqYXZhZG9jIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgamF2YSBjb2RlIGluc2lkZSBKU1BzCi0gKi8KLXB1YmxpYyBjbGFzcyBKU1BKYXZhSmF2YWRvY0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JLyoKLQkgKiBCdWxrIG9mIHRoZSB3b3JrIHdhcyBjb3BpZWQgZnJvbQotCSAqIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuaG92ZXIuSmF2YWRvY0hvdmVyCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBsb25nIExBQkVMX0ZMQUdTID0gSmF2YUVsZW1lbnRMYWJlbHMuQUxMX0ZVTExZX1FVQUxJRklFRCB8IEphdmFFbGVtZW50TGFiZWxzLk1fUFJFX1JFVFVSTlRZUEUgfCBKYXZhRWxlbWVudExhYmVscy5NX1BBUkFNRVRFUl9UWVBFUyB8IEphdmFFbGVtZW50TGFiZWxzLk1fUEFSQU1FVEVSX05BTUVTIHwgSmF2YUVsZW1lbnRMYWJlbHMuTV9FWENFUFRJT05TIHwgSmF2YUVsZW1lbnRMYWJlbHMuRl9QUkVfVFlQRV9TSUdOQVRVUkUgfCBKYXZhRWxlbWVudExhYmVscy5NX1BSRV9UWVBFX1BBUkFNRVRFUlMgfCBKYXZhRWxlbWVudExhYmVscy5UX1RZUEVfUEFSQU1FVEVSUyB8IEphdmFFbGVtZW50TGFiZWxzLlVTRV9SRVNPTFZFRDsKLQlwcml2YXRlIGZpbmFsIGxvbmcgTE9DQUxfVkFSSUFCTEVfRkxBR1MgPSBMQUJFTF9GTEFHUyAmIH5KYXZhRWxlbWVudExhYmVscy5GX0ZVTExZX1FVQUxJRklFRCB8IEphdmFFbGVtZW50TGFiZWxzLkZfUE9TVF9RVUFMSUZJRUQ7Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRIb3ZlckluZm8oSUphdmFFbGVtZW50W10gcmVzdWx0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBuUmVzdWx0cyA9IHJlc3VsdC5sZW5ndGg7Ci0JCWlmIChuUmVzdWx0cyA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5SZXN1bHRzID4gMSkgewotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykgewotCQkJCUhUTUxQcmludGVyLnN0YXJ0QnVsbGV0TGlzdChidWZmZXIpOwotCQkJCUlKYXZhRWxlbWVudCBjdXJyID0gcmVzdWx0W2ldOwotCQkJCWlmIChjdXJyIGluc3RhbmNlb2YgSU1lbWJlciB8fCBjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LkxPQ0FMX1ZBUklBQkxFKQotCQkJCQlIVE1MUHJpbnRlci5hZGRCdWxsZXQoYnVmZmVyLCBnZXRJbmZvVGV4dChjdXJyKSk7Ci0JCQkJSFRNTFByaW50ZXIuZW5kQnVsbGV0TGlzdChidWZmZXIpOwotCQkJfQotCi0JCX0KLQkJZWxzZSB7Ci0KLQkJCUlKYXZhRWxlbWVudCBjdXJyID0gcmVzdWx0WzBdOwotCQkJaWYgKGN1cnIgaW5zdGFuY2VvZiBJTWVtYmVyKSB7Ci0JCQkJSU1lbWJlciBtZW1iZXIgPSAoSU1lbWJlcikgY3VycjsKLQkJCQlIVE1MUHJpbnRlci5hZGRTbWFsbEhlYWRlcihidWZmZXIsIGdldEluZm9UZXh0KG1lbWJlcikpOwotCQkJCVJlYWRlciByZWFkZXI7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVhZGVyID0gSmF2YWRvY0NvbnRlbnRBY2Nlc3MuZ2V0SFRNTENvbnRlbnRSZWFkZXIobWVtYmVyLCB0cnVlLCB0cnVlKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEphdmFNb2RlbEV4Y2VwdGlvbiBleCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCUhUTUxQcmludGVyLmFkZFBhcmFncmFwaChidWZmZXIsIHJlYWRlcik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY3Vyci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSB8fCBjdXJyLmdldEVsZW1lbnRUeXBlKCkgPT0gSUphdmFFbGVtZW50LlRZUEVfUEFSQU1FVEVSKQotCQkJCUhUTUxQcmludGVyLmFkZFNtYWxsSGVhZGVyKGJ1ZmZlciwgZ2V0SW5mb1RleHQoY3VycikpOwotCQl9Ci0KLQkJaWYgKGJ1ZmZlci5sZW5ndGgoKSA+IDApIHsKLQkJCUhUTUxQcmludGVyLmluc2VydFBhZ2VQcm9sb2coYnVmZmVyLCAwKTsKLQkJCUhUTUxQcmludGVyLmFkZFBhZ2VFcGlsb2coYnVmZmVyKTsKLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVySW5mbyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SG92ZXJJbmZvKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gaG92ZXJSZWdpb24pIHsKLQkJLy8gZ2V0IEpTUCB0cmFuc2xhdGlvbiBvYmplY3QgZm9yIHRoaXMgdmlld2VyJ3MgZG9jdW1lbnQKLQkJSURPTU1vZGVsIHhtbE1vZGVsID0gKElET01Nb2RlbCkgU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkpOwotCQl0cnkgewotCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpIHsKLQkJCQlJRE9NRG9jdW1lbnQgeG1sRG9jID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQlKU1BUcmFuc2xhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChKU1BUcmFuc2xhdGlvbkFkYXB0ZXIpIHhtbERvYy5nZXRBZGFwdGVyRm9yKElKU1BUcmFuc2xhdGlvbi5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlKU1BUcmFuc2xhdGlvbiB0cmFuc2xhdGlvbiA9IGFkYXB0ZXIuZ2V0SlNQVHJhbnNsYXRpb24oKTsKLQkJCQkJCi0JCQkJCUlKYXZhRWxlbWVudFtdIHJlc3VsdCA9IHRyYW5zbGF0aW9uLmdldEVsZW1lbnRzRnJvbUpzcFJhbmdlKGhvdmVyUmVnaW9uLmdldE9mZnNldCgpLCBob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKSArIGhvdmVyUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJcmV0dXJuIHRyYW5zbGF0aW9uLmZpeHVwTWFuZ2xlZE5hbWUoZ2V0SG92ZXJJbmZvKHJlc3VsdCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gSmF2YVdvcmRGaW5kZXIuZmluZFdvcmQodGV4dFZpZXdlci5nZXREb2N1bWVudCgpLCBvZmZzZXQpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZm9UZXh0KElKYXZhRWxlbWVudCBtZW1iZXIpIHsKLQkJbG9uZyBmbGFncyA9IG1lbWJlci5nZXRFbGVtZW50VHlwZSgpID09IElKYXZhRWxlbWVudC5MT0NBTF9WQVJJQUJMRSA/IExPQ0FMX1ZBUklBQkxFX0ZMQUdTIDogTEFCRUxfRkxBR1M7Ci0JCVN0cmluZyBsYWJlbCA9IEphdmFFbGVtZW50TGFiZWxzLmdldEVsZW1lbnRMYWJlbChtZW1iZXIsIGZsYWdzKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaGFyIGNoID0gbGFiZWwuY2hhckF0KGkpOwotCQkJaWYgKGNoID09ICc8JykgewotCQkJCWJ1Zi5hcHBlbmQoIiZsdDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoY2ggPT0gJz4nKSB7Ci0JCQkJYnVmLmFwcGVuZCgiJmd0OyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlidWYuYXBwZW5kKGNoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQSmF2YUphdmFkb2NJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkwZjVhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KU1BKYXZhSmF2YWRvY0luZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIFByb3ZpZGVzIGphdmFkb2MgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgamF2YSBjb2RlIGluc2lkZSBKU1BzIChTaG93cwotICogdG9vbHRpcCBkZXNjcmlwdGlvbikKLSAqLwotcHVibGljIGNsYXNzIEpTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyLCBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiB7Ci0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUZXh0SG92ZXIgPSBudWxsOwotCi0JcHVibGljIEpTUEphdmFKYXZhZG9jSW5mb3JtYXRpb25Qcm92aWRlcigpIHsKLQkJZlRleHRIb3ZlciA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCkuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IEpTUEphdmFKYXZhZG9jSG92ZXJQcm9jZXNzb3IoKSk7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0U3ViamVjdChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVyUmVnaW9uKHRleHRWaWV3ZXIsIG9mZnNldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEluZm9ybWF0aW9uMih0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uMihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJJbmZvKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90YWdpbmZvL0pTUFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjM0Y2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvLkhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci0KLS8qKgotICogUHJvdmlkZXMgaG92ZXIgaGVscCBkb2N1bWVudGF0aW9uIGZvciBKU1AgdGFncwotICovCi1wdWJsaWMgY2xhc3MgSlNQVGFnSW5mb0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVSZWdpb25IZWxwKEluZGV4ZWRSZWdpb24gdHJlZU5vZGUsIElET01Ob2RlIHBhcmVudE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJcmVzdWx0ID0gY29tcHV0ZUpTUERpckhlbHAoKElET01Ob2RlKSB0cmVlTm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZQotCQkJcmVzdWx0ID0gc3VwZXIuY29tcHV0ZVJlZ2lvbkhlbHAodHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhvdmVyIGhlbHAgZm9yIHRoZSBqc3AgZGlyZWN0aXZlIG5hbWUKLQkgKiBmb3Igbm93LCB0cmVhdCBqc3AgZGlyZWN0aXZlcyBsaWtlIGFueSBvdGhlciB0YWcgbmFtZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUpTUERpckhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXJldHVybiBjb21wdXRlVGFnTmFtZUhlbHAoeG1sbm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KYXZhV29yZEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RhZ2luZm8vSmF2YVdvcmRGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNjNWI2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGFnaW5mby9KYXZhV29yZEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLQotLyoqCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhV29yZEZpbmRlcgotICovCi1jbGFzcyBKYXZhV29yZEZpbmRlciB7Ci0JCi0JcHVibGljIHN0YXRpYyBJUmVnaW9uIGZpbmRXb3JkKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQkKLQkJaW50IHN0YXJ0PSAtMTsKLQkJaW50IGVuZD0gLTE7Ci0JCQotCQkKLQkJdHJ5IHsKLQkJCQotCQkJaW50IHBvcz0gb2Zmc2V0OwotCQkJY2hhciBjOwotCQkJCi0JCQl3aGlsZSAocG9zID49IDApIHsKLQkJCQljPSBkb2N1bWVudC5nZXRDaGFyKHBvcyk7Ci0JCQkJaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoYykpCi0JCQkJCWJyZWFrOwotCQkJCS0tcG9zOwotCQkJfQotCQkJCi0JCQlzdGFydD0gcG9zOwotCQkJCi0JCQlwb3M9IG9mZnNldDsKLQkJCWludCBsZW5ndGg9IGRvY3VtZW50LmdldExlbmd0aCgpOwotCQkJCi0JCQl3aGlsZSAocG9zIDwgbGVuZ3RoKSB7Ci0JCQkJYz0gZG9jdW1lbnQuZ2V0Q2hhcihwb3MpOwotCQkJCWlmICghQ2hhcmFjdGVyLmlzSmF2YUlkZW50aWZpZXJQYXJ0KGMpKQotCQkJCQlicmVhazsKLQkJCQkrK3BvczsKLQkJCX0KLQkJCQotCQkJZW5kPSBwb3M7Ci0JCQkKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQl9Ci0JCQotCQlpZiAoc3RhcnQgPiAtMSAmJiBlbmQgPiAtMSkgewotCQkJaWYgKHN0YXJ0ID09IG9mZnNldCAmJiBlbmQgPT0gb2Zmc2V0KQotCQkJCXJldHVybiBuZXcgUmVnaW9uKG9mZnNldCwgMCk7Ci0JCQllbHNlIGlmIChzdGFydCA9PSBvZmZzZXQpCi0JCQkJcmV0dXJuIG5ldyBSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihzdGFydCArIDEsIGVuZCAtIHN0YXJ0IC0gMSk7Ci0JCX0KLQkJCi0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiMTA1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL0VuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySlNQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuSlNQQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi0KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckpTUCBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckpTUCgpIHsKLQkJc3VwZXIoRU5DT0RJTkdfVFlQRSwgSlNQVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlc19lbmNvZGluZyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKFRlbXBsYXRlQ29udGV4dCBjb250ZXh0KSB7Ci0JCXJldHVybiBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU1ZDllMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gZ2V0QWxsKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEUgPSBnZXRBdHRyaWJ1dGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9IGdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSBnZXROZXcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IGdldFRhZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFsbCgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hbGwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZV92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3KCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX25ldyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gImpzcCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX3RhZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVKU1AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUpTUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTA3ZDI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUpTUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgSlNQIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBKU1AgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZUpTUCBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgewotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlSlNQKCkgewotCQlzdXBlcigpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRGF0ZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5UaW1lKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVXNlcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLldvcmRTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJKU1AoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSlNQRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSlNQRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEyNjc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0pTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NSlNQUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0LkRvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEpTUERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgY2hhcltdIEJSQUNLRVRTID0geyd7JywgJ30nLCAnKCcsICcpJywgJ1snLCAnXSd9OwotCi0JLyoqCi0JICogQHBhcmFtIHZhbGlkQ29udGV4dHMKLQkgKiBAcGFyYW0gbmV4dE1hdGNoZXIKLQkgKi8KLQlwdWJsaWMgSlNQRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcigpIHsKLQkJc3VwZXIobmV3IFN0cmluZ1tde0RPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX1RFWFQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIERPTUpTUFJlZ2lvbkNvbnRleHRzLkpTUF9ESVJFQ1RJVkVfTkFNRSwgRE9NSlNQUmVnaW9uQ29udGV4dHMuSlNQX1JPT1RfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQsIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4sIERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NPTlRFTlR9LCBuZXcgSmF2YVBhaXJNYXRjaGVyKEJSQUNLRVRTKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0ODNkZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBTZXAgMiwgMjAwMwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIGZpbGUgZ28gdG8KLSAqIFdpbmRvdyZndDtQcmVmZXJlbmNlcyZndDtKYXZhJmd0O0NvZGUgR2VuZXJhdGlvbiZndDtDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuZGVyaXZlZC5TaW5nbGVDaGFyUmVhZGVyOwotCi0KLS8qKgotICogUmVhZHMgZnJvbSBhIGRvY3VtZW50IGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMuIE1heSBiZSBjb25maWd1cmVkIHRvCi0gKiBza2lwIGNvbW1lbnRzIGFuZCBzdHJpbmdzLgotICogCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dCBzbyB3ZSBkb24ndCBoYXZlIHRvCi0gKiBkZXBlbmQgb24gdGhlIG9yZy5lY2xpcHNlLmpkdC51aSBwbHVnaW4uCi0gKiAKLSAqIE5vIG1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlLgotICovCi1jbGFzcyBKYXZhQ29kZVJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCi0JLyoqIFRoZSBFT0YgY2hhcmFjdGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNraXBDb21tZW50cyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFN0cmluZ3MgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcndhcmQgPSBmYWxzZTsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0JcHJpdmF0ZSBpbnQgZkVuZCA9IC0xOwotCXByaXZhdGUgaW50IGZDYWNoZWRMaW5lTnVtYmVyID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVPZmZzZXQgPSAtMTsKLQotCi0JcHVibGljIEphdmFDb2RlUmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbGFzdCByZWFkIGNoYXJhY3Rlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHJlYWQgaGFzIGJlZW4gY2FsbGVkLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gZkZvcndhcmQgPyBmT2Zmc2V0IC0gMSA6IGZPZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgY29uZmlndXJlRm9yd2FyZFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gc2tpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpbmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNraXBDb21tZW50cyA9IHNraXBDb21tZW50czsKLQkJZlNraXBTdHJpbmdzID0gc2tpcFN0cmluZ3M7Ci0KLQkJZkZvcndhcmQgPSB0cnVlOwotCQlmRW5kID0gTWF0aC5taW4oZkRvY3VtZW50LmdldExlbmd0aCgpLCBmT2Zmc2V0ICsgbGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVCYWNrd2FyZFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGJvb2xlYW4gc2tpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpbmdzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZlNraXBDb21tZW50cyA9IHNraXBDb21tZW50czsKLQkJZlNraXBTdHJpbmdzID0gc2tpcFN0cmluZ3M7Ci0KLQkJZkZvcndhcmQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBSZWFkZXIjY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgU2luZ2xlQ2hhclJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0cnkgewotCQkJcmV0dXJuIGZGb3J3YXJkID8gcmVhZEZvcndhcmRzKCkgOiByZWFkQmFja3dhcmRzKCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbih4LmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnKicpIHsKLQkJCQlpZiAoZk9mZnNldCA8IGZFbmQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCSsrZk9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvU3RyaW5nRW5kKGNoYXIgZGVsaW1pdGVyKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl3aGlsZSAoZk9mZnNldCA8IGZFbmQpIHsKLQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQrKyk7Ci0JCQlpZiAoY3VycmVudCA9PSAnXFwnKSB7Ci0JCQkJLy8gaWdub3JlIGVzY2FwZWQgY2hhcmFjdGVycwotCQkJCSsrZk9mZnNldDsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnQgPT0gZGVsaW1pdGVyKSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9MaW5lRW5kKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaW50IGxpbmUgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQlmT2Zmc2V0ID0gZkRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSArIDEpOwotCX0KLQotCXByaXZhdGUgaW50IHJlYWRGb3J3YXJkcygpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQotCQkJc3dpdGNoIChjdXJyZW50KSB7Ci0JCQkJY2FzZSAnLycgOgotCi0JCQkJCWlmIChmU2tpcENvbW1lbnRzICYmIGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQkJCQljaGFyIG5leHQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCQkJCWlmIChuZXh0ID09ICcqJykgewotCQkJCQkJCS8vIGEgY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgZW5kCi0JCQkJCQkJKytmT2Zmc2V0OwotCQkJCQkJCWdvdG9Db21tZW50RW5kKCk7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChuZXh0ID09ICcvJykgewotCQkJCQkJCS8vICcvLyctY29tbWVudCBzdGFydHMsIGFkdmFuY2UgdG8gdGhlIGxpbmUgZW5kCi0JCQkJCQkJZ290b0xpbmVFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCi0JCQkJY2FzZSAnIicgOgotCQkJCWNhc2UgJ1wnJyA6Ci0KLQkJCQkJaWYgKGZTa2lwU3RyaW5ncykgewotCQkJCQkJZ290b1N0cmluZ0VuZChjdXJyZW50KTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBjdXJyZW50OwotCQl9Ci0KLQkJcmV0dXJuIEVPRjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCWlmIChsaW5lIDwgZkNhY2hlZExpbmVOdW1iZXIpIHsKLQkJCWZDYWNoZWRMaW5lTnVtYmVyID0gbGluZTsKLQkJCWZDYWNoZWRMaW5lT2Zmc2V0ID0gZkRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQlpbnQgb2Zmc2V0ID0gZk9mZnNldDsKLQkJCXdoaWxlIChmQ2FjaGVkTGluZU9mZnNldCA8IG9mZnNldCkgewotCQkJCWNoYXIgY3VycmVudCA9IGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldC0tKTsKLQkJCQlpZiAoY3VycmVudCA9PSAnLycgJiYgZkNhY2hlZExpbmVPZmZzZXQgPD0gb2Zmc2V0ICYmIGZEb2N1bWVudC5nZXRDaGFyKG9mZnNldCkgPT0gJy8nKSB7Ci0JCQkJCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0NvbW1lbnRTdGFydCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldC0tKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJyAmJiAwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCkgPT0gJy8nKQotCQkJCXJldHVybjsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvU3RyaW5nU3RhcnQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQlpZiAoY3VycmVudCA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlpZiAoISgwIDw9IGZPZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCAtIDEpID09ICdcXCcpKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQktLWZPZmZzZXQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCByZWFkQmFja3dhcmRzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQotCQl3aGlsZSAoMCA8IGZPZmZzZXQpIHsKLQkJCS0tZk9mZnNldDsKLQotCQkJaGFuZGxlU2luZ2xlTGluZUNvbW1lbnQoKTsKLQotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJyA6Ci0KLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA+IDEpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQgLSAxKTsKLQkJCQkJCWlmIChuZXh0ID09ICcqJykgewotCQkJCQkJCS8vIGEgY29tbWVudCBlbmRzLCBhZHZhbmNlIHRvIHRoZSBjb21tZW50IHN0YXJ0Ci0JCQkJCQkJZk9mZnNldCAtPSAyOwotCQkJCQkJCWdvdG9Db21tZW50U3RhcnQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCi0JCQkJY2FzZSAnIicgOgotCQkJCWNhc2UgJ1wnJyA6Ci0KLQkJCQkJaWYgKGZTa2lwU3RyaW5ncykgewotCQkJCQkJLS1mT2Zmc2V0OwotCQkJCQkJZ290b1N0cmluZ1N0YXJ0KGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQotCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCX0KLQotCQlyZXR1cm4gRU9GOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTU1ZTkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC90ZXh0L0phdmFQYWlyTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLQotCi0vKioKLSAqIEhlbHBlciBjbGFzcyBmb3IgbWF0Y2ggcGFpcnMgb2YgY2hhcmFjdGVycy4KLSAqCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dCBzbyB3ZSBkb24ndCBoYXZlIHRvCi0gKiBkZXBlbmQgb24gdGhlIG9yZy5lY2xpcHNlLmpkdC51aSBwbHVnaW4uCi0gKiAKLSAqIE5vIG1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlLgotICovCi1jbGFzcyBKYXZhUGFpck1hdGNoZXIgaW1wbGVtZW50cyBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgewotCi0JcHJvdGVjdGVkIGNoYXJbXSBmUGFpcnM7Ci0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIGludCBmT2Zmc2V0OwotCi0JcHJvdGVjdGVkIGludCBmU3RhcnRQb3M7Ci0JcHJvdGVjdGVkIGludCBmRW5kUG9zOwotCXByb3RlY3RlZCBpbnQgZkFuY2hvcjsKLQotCXByb3RlY3RlZCBKYXZhQ29kZVJlYWRlciBmUmVhZGVyID0gbmV3IEphdmFDb2RlUmVhZGVyKCk7Ci0KLQotCXB1YmxpYyBKYXZhUGFpck1hdGNoZXIoY2hhcltdIHBhaXJzKSB7Ci0JCWZQYWlycyA9IHBhaXJzOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNtYXRjaChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIG1hdGNoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCi0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0KLQkJaWYgKGZPZmZzZXQgPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsICYmIG1hdGNoUGFpcnNBdCgpICYmIGZTdGFydFBvcyAhPSBmRW5kUG9zKQotCQkJcmV0dXJuIG5ldyBSZWdpb24oZlN0YXJ0UG9zLCBmRW5kUG9zIC0gZlN0YXJ0UG9zICsgMSk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2dldEFuY2hvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBbmNob3IoKSB7Ci0JCXJldHVybiBmQW5jaG9yOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljbGVhcigpOwotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKGZSZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hQYWlyc0F0KCkgewotCi0JCWludCBpOwotCQlpbnQgcGFpckluZGV4MSA9IGZQYWlycy5sZW5ndGg7Ci0JCWludCBwYWlySW5kZXgyID0gZlBhaXJzLmxlbmd0aDsKLQotCQlmU3RhcnRQb3MgPSAtMTsKLQkJZkVuZFBvcyA9IC0xOwotCi0JCS8vIGdldCB0aGUgY2hhcnMgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JCXRyeSB7Ci0KLQkJCWNoYXIgcHJldkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihNYXRoLm1heChmT2Zmc2V0IC0gMSwgMCkpOwotCQkJLy8gbW9kaWZpZWQgYmVoYXZpb3IgZm9yIGh0dHA6Ly9kZXYuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTY4NzkJCQkKLQkJCS8vCQkJY2hhciBuZXh0Q2hhcj0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCk7Ci0KLQkJCS8vIHNlYXJjaCBmb3Igb3BlbmluZyBwZWVyIGNoYXJhY3RlciBuZXh0IHRvIHRoZSBhY3RpdmF0aW9uIHBvaW50Ci0JCQlmb3IgKGkgPSAwOyBpIDwgZlBhaXJzLmxlbmd0aDsgaSA9IGkgKyAyKSB7Ci0JCQkJLy8JCQkJaWYgKG5leHRDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCS8vCQkJCQlmU3RhcnRQb3M9IGZPZmZzZXQ7Ci0JCQkJLy8JCQkJCXBhaXJJbmRleDE9IGk7Ci0JCQkJLy8JCQkJfSBlbHNlIAotCQkJCWlmIChwcmV2Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkJZlN0YXJ0UG9zID0gZk9mZnNldCAtIDE7Ci0JCQkJCXBhaXJJbmRleDEgPSBpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gc2VhcmNoIGZvciBjbG9zaW5nIHBlZXIgY2hhcmFjdGVyIG5leHQgdG8gdGhlIGFjdGl2YXRpb24gcG9pbnQKLQkJCWZvciAoaSA9IDE7IGkgPCBmUGFpcnMubGVuZ3RoOyBpID0gaSArIDIpIHsKLQkJCQlpZiAocHJldkNoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJCWZFbmRQb3MgPSBmT2Zmc2V0IC0gMTsKLQkJCQkJcGFpckluZGV4MiA9IGk7Ci0JCQkJfQotCQkJCS8vCQkJCWVsc2UgaWYgKG5leHRDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCS8vCQkJCQlmRW5kUG9zPSBmT2Zmc2V0OwotCQkJCS8vCQkJCQlwYWlySW5kZXgyPSBpOwotCQkJCS8vCQkJCX0KLQkJCX0KLQotCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBSSUdIVDsKLQkJCQlmU3RhcnRQb3MgPSBzZWFyY2hGb3JPcGVuaW5nUGVlcihmRW5kUG9zLCBmUGFpcnNbcGFpckluZGV4MiAtIDFdLCBmUGFpcnNbcGFpckluZGV4Ml0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZTdGFydFBvcyA+IC0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWZFbmRQb3MgPSAtMTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZTdGFydFBvcyA+IC0xKSB7Ci0JCQkJZkFuY2hvciA9IExFRlQ7Ci0JCQkJZkVuZFBvcyA9IHNlYXJjaEZvckNsb3NpbmdQZWVyKGZTdGFydFBvcywgZlBhaXJzW3BhaXJJbmRleDFdLCBmUGFpcnNbcGFpckluZGV4MSArIDFdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmRW5kUG9zID4gLTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZlN0YXJ0UG9zID0gLTE7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JDbG9zaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWZSZWFkZXIuY29uZmlndXJlRm9yd2FyZFJlYWRlcihkb2N1bWVudCwgb2Zmc2V0ICsgMSwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCksIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gb3BlbmluZ1BlZXIgJiYgYyAhPSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBjbG9zaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yT3BlbmluZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKGRvY3VtZW50LCBvZmZzZXQsIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gY2xvc2luZ1BlZXIgJiYgYyAhPSBvcGVuaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBvcGVuaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkKLQkJCQlyZXR1cm4gZlJlYWRlci5nZXRPZmZzZXQoKTsKLQotCQkJYyA9IGZSZWFkZXIucmVhZCgpOwotCQl9Ci0KLQkJcmV0dXJuIC0xOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUEZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUEZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGFhZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpkdC5jb3JlLkphdmFDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkpTUENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkpTUENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JKU1A7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci0KLWNsYXNzIE5ld0pTUEZpbGVXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSB7Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZSBmQ29udGVudFR5cGU7Ci0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0JcHVibGljIE5ld0pTUEZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIG92ZXJyaWRlbiB0byBzZXQgdGhlIHNlbGVjdGVkIGZvbGRlciB0byB3ZWIgY29udGVudHMKLQkgKiBmb2xkZXIgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIG91dHNpZGUgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCkgewotCQlzdXBlci5pbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKTsKLQotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCi0JCWlmICh3ZWJDb250ZW50UGF0aCAhPSBudWxsICYmICF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJc2V0Q29udGFpbmVyRnVsbFBhdGgod2ViQ29udGVudFBhdGgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCBhZGRpdGlvbmFsIHZhbGlkYXRpb24gc3BlY2lmaWMgdG8ganNwCi0JICogZmlsZXMuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0KLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJSVBhdGggZnVsbFBhdGggPSBnZXRDb250YWluZXJGdWxsUGF0aCgpOwotCQlpZiAoKGZ1bGxQYXRoICE9IG51bGwpICYmIChmdWxsUGF0aC5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChmaWxlTmFtZSAhPSBudWxsKSkgewotCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQlpZiAoIWV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoZmlsZU5hbWUpKSB7Ci0JCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKEpTUFVJTWVzc2FnZXMuX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0pTUCwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJLy8gZXh0ZW5zaW9uIGRvZXNuJ3QgZXF1YWwgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZnVsbFBhdGguYXBwZW5kKG5ld0ZpbGVOYW1lKTsKLQotCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShKU1BVSU1lc3NhZ2VzLlJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGdldCB0aGUgSVByb2plY3QgZm9yIHRoZSBzZWxlY3Rpb24gcGF0aAotCQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJaWYgKCFpc0phdmFQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJCXNldE1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5fV0FSTklOR19GSUxFX01VU1RfQkVfSU5TSURFX0pBVkFfUFJPSkVDVCwgV0FSTklORyk7Ci0JCQkJfQotCQkJCS8vIGlmIGluc2lkZSB3ZWIgcHJvamVjdCwgY2hlY2sgaWYgaW5zaWRlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJaWYgKGlzRHluYW1pY1dlYlByb2plY3QocHJvamVjdCkpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyBpbnNpZGUgdGhlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQkJCWlmICghd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCQkJCXNldE1lc3NhZ2UoSlNQVUlNZXNzYWdlcy5fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQsIFdBUk5JTkcpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBkZWZhdWx0IGV4dGVuc2lvbiB0byB0aGUgZmlsZW5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZW5hbWUpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBKU1BDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgZXh0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoSlNQQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJbmV3RmlsZU5hbWUuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBKU1AgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKFN0cmluZyBmaWxlTmFtZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0KLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkvLyB0aGVyZSBpcyBjdXJyZW50bHkgYW4gZXh0ZW5zaW9uCi0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpICE9IC0xKSB7Ci0JCQkvLyBjaGVjayB3aGF0IGNvbnRlbnQgdHlwZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBjdXJyZW50IGV4dGVuc2lvbgotCQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVzRm9yKGZpbGVOYW1lKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgdHlwZXMubGVuZ3RoICYmICF2YWxpZCkgewotCQkJCXZhbGlkID0gdHlwZXNbaV0uaXNLaW5kT2YodHlwZSk7Ci0JCQkJKytpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXZhbGlkID0gdHJ1ZTsgLy8gbm8gZXh0ZW5zaW9uIHNvIHZhbGlkCi0JCXJldHVybiB2YWxpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBwYXRoCi0JICogCi0JICogQHBhcmFtIHBhdGgKLQkgKiAgICAgICAgICAgIHRoZSBwYXRoIHdoaWNoIHByb2plY3QgaXMgbmVlZGVkCi0JICogQHJldHVybiBJUHJvamVjdCBvYmplY3QuIElmIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHJldHVybgotCSAqICAgICAgICAgdmFsdWUgaXMgYWxzbyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tUGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQotCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQlpZiAod29ya3NwYWNlLnZhbGlkYXRlUGF0aChwYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5QUk9KRUNUKS5pc09LKCkpIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRQcm9qZWN0KHBhdGgudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB3ZWIgcHJvamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIHdlYiBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNEeW5hbWljV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJaWYgKGZhY2V0ZWQgIT0gbnVsbCAmJiBmYWNldGVkLmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgdHlwZSBvZiBqYXZhIHByb2plY3QuCi0JICogCi0JICogQHBhcmFtIHByb2plY3QKLQkgKiAgICAgICAgICAgIHByb2plY3QgdG8gYmUgY2hlY2tlZCAoY2Fubm90IGJlIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIGEgdHlwZSBvZiBqYXZhIHByb2plY3QsIG90aGVyd2lzZSBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0phdmFQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJYm9vbGVhbiBpc0phdmEgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlzSmF2YSA9IHByb2plY3QuaGFzTmF0dXJlKEphdmFDb3JlLk5BVFVSRV9JRCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcmV0dXJuIGlzSmF2YTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyIG9mIHRoZSBzcGVjaWZpZWQgcHJvamVjdAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0Ci0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB3aGljaCB3ZWIgY29udGVudHMgcGF0aCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQYXRoIG9mIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgaXNEeW5hbWljV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJSVZpcnR1YWxDb21wb25lbnQgY29tcG9uZW50ID0gQ29tcG9uZW50Q29yZS5jcmVhdGVDb21wb25lbnQocHJvamVjdCk7Ci0JCQlwYXRoID0gY29tcG9uZW50LmdldFJvb3RGb2xkZXIoKS5nZXRXb3Jrc3BhY2VSZWxhdGl2ZVBhdGgoKTsKLQkJfQotCi0JCXJldHVybiBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS9zcmMvb3JnL2VjbGlwc2UvanN0L2pzcC91aS9pbnRlcm5hbC93aXphcmQvTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3Y2E0YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkpTUFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5KU1BVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5KU1BVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSlNQOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcwotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCS8qKiBUaGUgdGVtcGxhdGUgc3RvcmUuICovCi0JCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBmU3RvcmUuZ2V0VGVtcGxhdGVzKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlIiwgSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEpTUFVJTWVzc2FnZXMuTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgSlNQIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsaW5rLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzYpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGlua0NsaWNrZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGVtcGxhdGVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGlubmVyUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChKU1BVSU1lc3NhZ2VzLk5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkpTUF9ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9ySlNQLkNvbnRlbnRUeXBlSURfSlNQOwotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkpTUCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoSlNQVUlNZXNzYWdlcy5OZXdKU1BUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBjb250cm9scyBpbiBwYWdlIGJhc2VkIG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbidzIGN1cnJlbnQKLQkgKiBzdGF0ZS4KLQkgKi8KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZlVzZVRlbXBsYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmICghZW5hYmxlZCkgewotCQkJLy8gc2F2ZSBsYXN0IHNlbGVjdGVkIHRlbXBsYXRlCi0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQllbHNlCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuanNwLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGpzcCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBKU1AgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IEpTUFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IEpTUCBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlKU1BVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSlNQVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNKU1AuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL2ludGVybmFsL3dpemFyZC9OZXdKU1BXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE1MjA1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0pTUFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5KU1BDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmVkaXRvci5KU1BFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSU5ld1dpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLXB1YmxpYyBjbGFzcyBOZXdKU1BXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkIHsKLQlwcml2YXRlIE5ld0pTUEZpbGVXaXphcmRQYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld0pTUFRlbXBsYXRlc1dpemFyZFBhZ2UgZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlOwotCXByaXZhdGUgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlmTmV3RmlsZVBhZ2UgPSBuZXcgTmV3SlNQRmlsZVdpemFyZFBhZ2UoIkpTUFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UiLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJREUuY29tcHV0ZVNlbGVjdGVkUmVzb3VyY2VzKGZTZWxlY3Rpb24pKSk7IC8vJE5PTi1OTFMtMSQgCi0JCWZOZXdGaWxlUGFnZS5zZXRUaXRsZShKU1BVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0hFQURJTkcpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oSlNQVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19ERVNDUklQVElPTik7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVQYWdlKTsKLQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2UgPSBuZXcgTmV3SlNQVGVtcGxhdGVzV2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKGZOZXdGaWxlVGVtcGxhdGVzUGFnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKEpTUFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfVElUTEUpOwotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSlNQRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoSlNQRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfV0laQkFOX05FV0pTUEZJTEUpOwotCQlzZXREZWZhdWx0UGFnZUltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgb3BlbkVkaXRvcihmaW5hbCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgZmlsZSwgdHJ1ZSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybUZpbmlzaCgpIHsKLQkJYm9vbGVhbiBwZXJmb3JtZWRPSyA9IGZhbHNlOwotCi0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSlNQQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQlTdHJpbmcgY2hhclNldCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQkJCXRyeSB7Ci0JCQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCU91dHB1dFN0cmVhbVdyaXRlciBvdXRwdXRTdHJlYW1Xcml0ZXIgPSBudWxsOwotCQkJCQlpZiAoY2hhclNldCA9PSBudWxsIHx8IGNoYXJTZXQudHJpbSgpLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8ganVzdCB1c2UgZGVmYXVsdCBlbmNvZGluZwotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJTZXQpOwotCQkJCQl9Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci53cml0ZSh0ZW1wbGF0ZVN0cmluZyk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLQkJCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQkJCQlmaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCBmYWxzZSwgbnVsbCk7Ci0JCQkJCWlucHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSBjb250ZW50cyBmb3IgbmV3IEpTUCBmaWxlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIG9wZW4gdGhlIGZpbGUgaW4gZWRpdG9yCi0JCQlvcGVuRWRpdG9yKGZpbGUpOwotCi0JCQkvLyBldmVyeXRoaW5nJ3MgZmluZQotCQkJcGVyZm9ybWVkT0sgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBwZXJmb3JtZWRPSzsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvdmlld3MvY29udGVudG91dGxpbmUvSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvc3JjL29yZy9lY2xpcHNlL2pzdC9qc3AvdWkvdmlld3MvY29udGVudG91dGxpbmUvSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5YTE1NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpL3NyYy9vcmcvZWNsaXBzZS9qc3QvanNwL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuSlNQVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudmlld3MuY29udGVudG91dGxpbmUuSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBKU1AgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0KLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gVE9ETzogQXV0b21hdGUgdGhlIGxvYWRpbmcgb2YgYSByZWFsIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIG1vZGVsCi0JLy8gdHlwZSBhdAotCS8vIGNyZWF0aW9uIHRpbWU7IGNsZWFyIG9uIHVuQ29uZmlndXJlIHNvIHRoYXQgYSBuZXcgZW1iZWRkZWQKLQkvLyBjb25maWd1cmF0aW9uIGNhbgotCS8vIGJlIHVzZWQKLQkvLyBwcml2YXRlIFN0cnVjdHVyZWRDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gZkVtYmVkZGVkQ29uZmlndXJhdGlvbiA9Ci0JLy8gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgSlNQQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIEpTUENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSlNQVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRlZmY0Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5uYW1lPUpTUCBzY3JpcHRsZXQKLVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQuZGVzYz1KU1Agc2NyaXB0bGV0IDwlLi4lPgotVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5jb250ZW50PTwlICR7Y3Vyc29yfSAlPgotVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQubmFtZT1KU1AgaGlkZGVuIGNvbW1lbnQKLVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50LmRlc2M9SlNQIGhpZGRlbiBjb21tZW50IDwlLS0gLS0lPgotVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQuY29udGVudD08JS0tICR7Y3Vyc29yfSAtLSU+Ci1UZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24ubmFtZT1KU1AgZGVjbGFyYXRpb24ocykKLVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5kZXNjPUpTUCBkZWNsYXJhdGlvbihzKSA8JSEuLiU+Ci1UZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24uY29udGVudD08JSEgJHtjdXJzb3J9ICU+Ci1UZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5uYW1lPUpTUCBleHByZXNzaW9uCi1UZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5kZXNjPUpTUCBleHByZXNzaW9uIDwlPS4uJT4KLVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLmNvbnRlbnQ9PCU9ICR7Y3Vyc29yfSAlPgotVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUubmFtZT1KU1AgaW5jbHVkZSBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLmRlc2M9SlNQIGluY2x1ZGUgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5jb250ZW50PTwlQCBpbmNsdWRlIGZpbGU9IiR7Y3Vyc29yfSIgJT4KLVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLm5hbWU9SlNQIHBhZ2UgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5kZXNjPUpTUCBwYWdlIGRpcmVjdGl2ZQotVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUuY29udGVudD08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiAlPgotVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5uYW1lPUpTUCB0YWdsaWIgZGlyZWN0aXZlCi1UZW1wbGF0ZXMuanNwdGFnbGliZGlyZWN0aXZlLmRlc2M9SlNQIHRhZ2xpYiBkaXJlY3RpdmUKLVRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUuY29udGVudD08JUAgdGFnbGliIHVyaT0iIiBwcmVmaXg9IiR7Y3Vyc29yfSIgJT4KLVRlbXBsYXRlcy5qc3BodG1sLm5hbWU9TmV3IEpTUCBGaWxlIChodG1sKQotVGVtcGxhdGVzLmpzcGh0bWwuZGVzYz1KU1Agd2l0aCBodG1sIG1hcmt1cAotVGVtcGxhdGVzLmpzcGh0bWwuY29udGVudD08JUAgcGFnZSBsYW5ndWFnZT0iamF2YSIgY29udGVudFR5cGU9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSJcbiAgICBwYWdlRW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiU+XG48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj5cbjxodG1sPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSI+XG48dGl0bGU+SW5zZXJ0IHRpdGxlIGhlcmU8L3RpdGxlPlxuPC9oZWFkPlxuPGJvZHk+XG4ke2N1cnNvcn1cbjwvYm9keT5cbjwvaHRtbD4KLVRlbXBsYXRlcy5qc3B4aHRtbC5uYW1lPU5ldyBKU1AgRmlsZSAoeGh0bWwpCi1UZW1wbGF0ZXMuanNweGh0bWwuZGVzYz1KU1Agd2l0aCB4aHRtbCBtYXJrdXAKLVRlbXBsYXRlcy5qc3B4aHRtbC5jb250ZW50PTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IiR7ZW5jb2Rpbmd9IiA/PlxuPCVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iXG4gICAgcGFnZUVuY29kaW5nPSIke2VuY29kaW5nfSIlPlxuPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPlxuPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgLz5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPgotVGVtcGxhdGVzLmpzcHhodG1seG1sLm5hbWU9TmV3IEpTUCBGaWxlICh4aHRtbCwgeG1sIHN5bnRheCkKLVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5kZXNjPUpTUCB3aXRoIHhodG1sIG1hcmt1cCBhbmQgeG1sIHN0eWxlIHN5bnRheAotVGVtcGxhdGVzLmpzcHhodG1seG1sLmNvbnRlbnQ9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iID8+XG48anNwOnJvb3QgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIiB2ZXJzaW9uPSIyLjAiPlxuICAgIDxqc3A6ZGlyZWN0aXZlLnBhZ2UgbGFuZ3VhZ2U9ImphdmEiXG4gICAgICAgIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iIHBhZ2VFbmNvZGluZz0iJHtlbmNvZGluZ30iIC8+XG4gICAgPGpzcDp0ZXh0PlxuICAgICAgICA8IVtDREFUQVsgPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iID8+IF1dPlxuICAgIDwvanNwOnRleHQ+XG4gICAgPGpzcDp0ZXh0PlxuICAgICAgICA8IVtDREFUQVsgPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPiBdXT5cbiAgICA8L2pzcDp0ZXh0PlxuPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiPlxuPGhlYWQ+XG48bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD0ke2VuY29kaW5nfSIgLz5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48Ym9keT5cbiR7Y3Vyc29yfVxuPC9ib2R5PlxuPC9odG1sPlxuPC9qc3A6cm9vdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkvdGVtcGxhdGVzL2pzcGRlZmF1bHQtdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTM5NjMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2UuanN0LmpzcC51aS90ZW1wbGF0ZXMvanNwZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0ZW1wbGF0ZXM+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcHNjcmlwdGxldC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHNjcmlwdGxldCIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BzY3JpcHRsZXQuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGhpZGRlbmNvbW1lbnQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwaGlkZGVuY29tbWVudCIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BoaWRkZW5jb21tZW50LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BkZWNsYXJhdGlvbi5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24iIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwZGVjbGFyYXRpb24uY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGV4cHJlc3Npb24ubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwZXhwcmVzc2lvbi5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwZXhwcmVzc2lvbiIgY29udGV4dD0ianNwX2FsbCIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BleHByZXNzaW9uLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3BpbmNsdWRlZGlyZWN0aXZlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcGluY2x1ZGVkaXJlY3RpdmUiIGNvbnRleHQ9ImpzcF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNwaW5jbHVkZWRpcmVjdGl2ZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuanNwcGFnZWRpcmVjdGl2ZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3BwYWdlZGlyZWN0aXZlIiBjb250ZXh0PSJqc3BfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLmpzcHBhZ2VkaXJlY3RpdmUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVtcGxhdGVzLmpzcHRhZ2xpYmRpcmVjdGl2ZSIgY29udGV4dD0ianNwX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3B0YWdsaWJkaXJlY3RpdmUuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcGh0bWwubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuanNwaHRtbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNwaHRtbCIgY29udGV4dD0ianNwX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3BodG1sLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5qc3B4aHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5qc3B4aHRtbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZW1wbGF0ZXMuanNweGh0bWwiIGNvbnRleHQ9ImpzcF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuanNweGh0bWwuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmpzcHhodG1seG1sLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmpzcHhodG1seG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlbXBsYXRlcy5qc3B4aHRtbHhtbCIgY29udGV4dD0ianNwX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5qc3B4aHRtbHhtbC5jb250ZW50PC90ZW1wbGF0ZT4KLTwvdGVtcGxhdGVzPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDk0MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMiIGtpbmQ9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiIGtpbmQ9ImNvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiIGtpbmQ9ImNvbiI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlLyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0iYmluIiBraW5kPSJvdXRwdXQiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYmY2N2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotY3NzbW9kZWwuamFyCi1idWlsZC54bWwKLWRldi5wcm9wZXJ0aWVzCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTA5NzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2RlYnVnL3RyYWNlZmlsdGVyPQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMDQ2ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MmE3OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotI1N1biBBdWcgMjAgMDA6NDk6MTEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZhbGx0aHJvdWdoQ2FzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm51bGxSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDQ5NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3M7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlOyBleGNlcHRpb25zPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMWY4MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGNzc3Byb2ZpbGUvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwotICAgICAgICAgICAgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjAzM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jc3MiPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9jc3Mvb3ZlcnZpZXcuaHRtbCI+PC9kZXNjcmlwdGlvbj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXMiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzcy1wcm9maWxlLmR0ZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzLXByb2ZpbGUuZHRkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTUzNWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzLXByb2ZpbGUuZHRkCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLTwhLS0gRFREIGZvciBDU1MgTWV0YSBNb2RlbCBQcm9maWxlIC0tPgotCi08IS0tIEVudGl0aWVzIC0tPgotCi08IS0tIG5hbWUtZGVmaW5pdGlvbgk6IEluIGRlZmluaW5nIG1ldGEgbW9kZWwgb2JqZWN0LCBvYmplY3QgbmFtZSAtLT4KLTwhLS0gaXMgZ2l2ZW4gYnkgdXNpbmcgdGhpcyBhdHRyaWJ1dGUuIC0tPgotCi08IUVOVElUWSAlIG5hbWUtZGVmaW5pdGlvbiAnbmFtZSBDREFUQSAjUkVRVUlSRUQnID4KLQotPCEtLSBuYW1lLXJlZmVyZW5jZQkJOiB1c2VkIHRvIHJlZmVyIG1ldGEgbW9kZWwgb2JqZWN0IHRoYXQgZGVmaW5lZCAtLT4KLTwhLS0gYnkgbmFtZS1kZWZpbml0aW9uIC0tPgotCi08IUVOVElUWSAlIG5hbWUtcmVmZXJlbmNlICduYW1lIENEQVRBICNSRVFVSVJFRCcgPgotCi08IS0tIGF2YWlsYWJpbGl0eQkJOiBDU1MgTWV0YSBNb2RlbCBQcm9maWxlIHBlcm1pdCBpbXBvcnRpbmcgLS0+Ci08IS0tIG90aGVyIHByb2ZpbGUgYW5kIGRlc2NyaWJlIGRpZmZlcmVuY2UgZm9yIGl0LiAtLT4KLQotPCFFTlRJVFkgJSBhdmFpbGFiaWxpdHkgJ2VuYWJsZWQgKHRydWUgfCBmYWxzZSkgInRydWUiJyA+Ci08IUVOVElUWSAlIG92ZXJ3cml0ZSAnb3ZlcndyaXRlICh0cnVlIHwgZmFsc2UpICJmYWxzZSInID4KLQotPCEtLSAqKioqKioqKioqKioqKioqKioqKiAtLT4KLTwhLS0gIGVsbWVudHMvYXR0cmlidXRlcyAgLS0+Ci08IS0tICoqKioqKioqKioqKioqKioqKioqIC0tPgotCi08IUVMRU1FTlQgY3NzLXByb2ZpbGUgKHByb2ZpbGUtaW1wb3J0PyAsIChzdHlsZXNoZWV0LWRlZiB8IGNoYXJzZXQtcnVsZS1kZWYgfCBpbXBvcnQtcnVsZS1kZWYgfCBwYWdlLXJ1bGUtZGVmIHwgbWVkaWEtcnVsZS1kZWYgfCBmb250ZmFjZS1ydWxlLWRlZiB8IHN0eWxlLXJ1bGUtZGVmIHwgcHJvcGVydHktZGVmIHwgZGVzY3JpcHRvci1kZWYgfCBjb250YWluZXItZGVmIHwgZnVuY3Rpb24tZGVmIHwgbnVtYmVyLWRlZiB8IHVuaXQtZGVmIHwga2V5d29yZC1kZWYgfCBjYXRlZ29yeS1kZWYgfCBwc2V1ZG8tZWxlbWVudC1kZWYgfCBwc2V1ZG8tY2xhc3MtZGVmKSopID4KLQotPCEtLSBhIHByb2ZpbGUgY2FuIGluY2x1ZGUgb3RoZXIgcHJvZmlsZSAtLT4KLQotPCFFTEVNRU5UIHByb2ZpbGUtaW1wb3J0IEVNUFRZID4KLTwhQVRUTElTVCBwcm9maWxlLWltcG9ydCBuYW1lIENEQVRBICNSRVFVSVJFRCA+Ci0KLTwhLS0gd2hpY2ggdHlwZSBvZiBydWxlIGNhbiBiZSB1c2VkPyAtLT4KLQotPCFFTEVNRU5UIHN0eWxlc2hlZXQtZGVmIChkZXNjcmlwdGlvbj8gLCAoY2hhcnNldC1ydWxlIHwgaW1wb3J0LXJ1bGUgfCBwYWdlLXJ1bGUgfCBtZWRpYS1ydWxlIHwgZm9udGZhY2UtcnVsZSB8IHN0eWxlLXJ1bGUpKikgPgotPCFBVFRMSVNUIHN0eWxlc2hlZXQtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIGNoYXJzZXQtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1QgY2hhcnNldC1ydWxlICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBpbXBvcnQtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1QgaW1wb3J0LXJ1bGUgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIHBhZ2UtcnVsZSBFTVBUWSA+Ci08IUFUVExJU1QgcGFnZS1ydWxlICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBtZWRpYS1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBtZWRpYS1ydWxlICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBmb250ZmFjZS1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBmb250ZmFjZS1ydWxlICVhdmFpbGFiaWxpdHk7ID4KLTwhRUxFTUVOVCBzdHlsZS1ydWxlIEVNUFRZID4KLTwhQVRUTElTVCBzdHlsZS1ydWxlICVhdmFpbGFiaWxpdHk7ID4KLQotPCFFTEVNRU5UIGNoYXJzZXQtcnVsZS1kZWYgKGRlc2NyaXB0aW9uPykgPgotPCFBVFRMSVNUIGNoYXJzZXQtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgaW1wb3J0LXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8pID4KLTwhQVRUTElTVCBpbXBvcnQtcnVsZS1kZWYgJW92ZXJ3cml0ZTsgPgotCi08IUVMRU1FTlQgcGFnZS1ydWxlLWRlZiAoZGVzY3JpcHRpb24/ICwgKHByb3BlcnR5IHwgcHNldWRvLWNsYXNzKSopID4KLTwhQVRUTElTVCBwYWdlLXJ1bGUtZGVmICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIG1lZGlhLXJ1bGUtZGVmIChkZXNjcmlwdGlvbj8pID4KLTwhQVRUTElTVCBtZWRpYS1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBmb250ZmFjZS1ydWxlLWRlZiAoZGVzY3JpcHRpb24/ICwgZGVzY3JpcHRvciopID4KLTwhQVRUTElTVCBmb250ZmFjZS1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBzdHlsZS1ydWxlLWRlZiAoZGVzY3JpcHRpb24/ICwgKHByb3BlcnR5IHwgc2VsZWN0b3ItZXhwcmVzc2lvbiB8IHBzZXVkby1jbGFzcyB8IHBzZXVkby1lbGVtZW50KSopID4KLTwhQVRUTElTVCBzdHlsZS1ydWxlLWRlZiAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBzZWxlY3Rvci1leHByZXNzaW9uIEVNUFRZID4KLTwhQVRUTElTVCBzZWxlY3Rvci1leHByZXNzaW9uIG5hbWUgKGRlc2NlbmRhbnQgfCBjaGlsZCB8IGFkamFjZW50IHwgdW5pdmVyc2FsIHwgYXR0cmlidXRlKSAjUkVRVUlSRUQgJWF2YWlsYWJpbGl0eTsgPgotCi08IUVMRU1FTlQgcHNldWRvLWNsYXNzIEVNUFRZID4KLTwhQVRUTElTVCBwc2V1ZG8tY2xhc3MgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+Ci0KLTwhRUxFTUVOVCBwc2V1ZG8tZWxlbWVudCBFTVBUWSA+Ci08IUFUVExJU1QgcHNldWRvLWVsZW1lbnQgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+Ci0KLTwhRUxFTUVOVCBwc2V1ZG8tY2xhc3MtZGVmIChkZXNjcmlwdGlvbj8sIHNlbGVjdG9yLXZhbHVlKSA+Ci08IUFUVExJU1QgcHNldWRvLWNsYXNzLWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci08IUVMRU1FTlQgc2VsZWN0b3ItdmFsdWUgKCNQQ0RBVEEpID4KLQotPCFFTEVNRU5UIHBzZXVkby1lbGVtZW50LWRlZiAoZGVzY3JpcHRpb24/LCBzZWxlY3Rvci12YWx1ZSkgPgotPCFBVFRMSVNUIHBzZXVkby1lbGVtZW50LWRlZiAlbmFtZS1kZWZpbml0aW9uOyAlb3ZlcndyaXRlOyA+Ci0KLTwhRUxFTUVOVCBrZXl3b3JkLWRlZiAoZGVzY3JpcHRpb24/ICwga2V5d29yZC12YWx1ZSkgPgotPCFBVFRMSVNUIGtleXdvcmQtZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCBrZXl3b3JkLXZhbHVlICgjUENEQVRBKSA+Ci08IUVMRU1FTlQgZGVzY3JpcHRpb24gKCNQQ0RBVEEpID4KLQotPCFFTEVNRU5UIGZ1bmN0aW9uLWRlZiAoZGVzY3JpcHRpb24/ICwgZnVuY3Rpb24tdmFsdWUpID4KLTwhQVRUTElTVCBmdW5jdGlvbi1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIGZ1bmN0aW9uLXZhbHVlICgjUENEQVRBKSA+Ci0KLTwhRUxFTUVOVCBudW1iZXItZGVmIChkZXNjcmlwdGlvbj8gLCB1bml0KikgPgotPCFBVFRMSVNUIG51bWJlci1kZWYgJW5hbWUtZGVmaW5pdGlvbjsgJW92ZXJ3cml0ZTsgPgotPCFFTEVNRU5UIHVuaXQgRU1QVFkgPgotPCFBVFRMSVNUIHVuaXQgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+Ci0KLTwhRUxFTUVOVCB1bml0LWRlZiAoZGVzY3JpcHRpb24/ICwgdW5pdC12YWx1ZSkgPgotPCFBVFRMSVNUIHVuaXQtZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCB1bml0LXZhbHVlICgjUENEQVRBKSA+Ci0KLTwhRUxFTUVOVCBjb250YWluZXItZGVmIChkZXNjcmlwdGlvbj8gLCAobnVtYmVyIHwga2V5d29yZCB8IGZ1bmN0aW9uIHwgY29udGFpbmVyKSopID4KLTwhQVRUTElTVCBjb250YWluZXItZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIGNhdGVnb3J5LWRlZiAoZGVzY3JpcHRpb24/LCBjYXB0aW9uKSA+Ci08IUFUVExJU1QgY2F0ZWdvcnktZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLTwhRUxFTUVOVCBjYXB0aW9uICgjUENEQVRBKSA+Ci0KLTwhRUxFTUVOVCBwcm9wZXJ0eS1kZWYgKGRlc2NyaXB0aW9uPyAsIChudW1iZXIgfCBrZXl3b3JkIHwgZnVuY3Rpb24gfCBjb250YWluZXIgfCBzdHJpbmcgfCBzZXBhcmF0b3IgfCBwcm9wZXJ0eSkqKSA+Ci08IUFUVExJU1QgcHJvcGVydHktZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7Ci0JCQkJCSAgIGluaGVyaXRlZCAoeWVzIHwgbm8gfCBuYSkgIm5hIgotCQkJCQkgICBtZWRpYWdyb3VwIENEQVRBICNJTVBMSUVECi0JCQkJCSAgIGNhdGVnb3J5IENEQVRBICNJTVBMSUVEID4KLTwhRUxFTUVOVCBkZXNjcmlwdG9yLWRlZiAoZGVzY3JpcHRpb24/LCAobnVtYmVyIHwga2V5d29yZCB8IGZ1bmN0aW9uIHwgY29udGFpbmVyIHwgc3RyaW5nIHwgc2VwYXJhdG9yIHwgcHJvcGVydHkpKikgPgotPCFBVFRMSVNUIGRlc2NyaXB0b3ItZGVmICVuYW1lLWRlZmluaXRpb247ICVvdmVyd3JpdGU7ID4KLQotPCFFTEVNRU5UIG51bWJlciBFTVBUWSA+Ci08IUFUVExJU1QgbnVtYmVyICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPiAKLTwhRUxFTUVOVCBrZXl3b3JkIEVNUFRZID4KLTwhQVRUTElTVCBrZXl3b3JkICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPiAKLTwhRUxFTUVOVCBmdW5jdGlvbiBFTVBUWSA+Ci08IUFUVExJU1QgZnVuY3Rpb24gJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgY29udGFpbmVyIEVNUFRZID4KLTwhQVRUTElTVCBjb250YWluZXIgJW5hbWUtcmVmZXJlbmNlOyAlYXZhaWxhYmlsaXR5OyA+IAotPCFFTEVNRU5UIHN0cmluZyBFTVBUWSA+Ci08IUFUVExJU1Qgc3RyaW5nICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgotPCFFTEVNRU5UIHNlcGFyYXRvciBFTVBUWSA+Ci08IUFUVExJU1Qgc2VwYXJhdG9yIG5hbWUgKGNvbW1hIHwgc2xhc2gpICNSRVFVSVJFRCAlYXZhaWxhYmlsaXR5OyA+Ci08IUVMRU1FTlQgcHJvcGVydHkgRU1QVFkgPgotPCFBVFRMSVNUIHByb3BlcnR5ICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPiAKLTwhRUxFTUVOVCBkZXNjcmlwdG9yIEVNUFRZID4KLTwhQVRUTElTVCBkZXNjcmlwdG9yICVuYW1lLXJlZmVyZW5jZTsgJWF2YWlsYWJpbGl0eTsgPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczEueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiMTc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KLTwhLS08IURPQ1RZUEUgY3NzLXByb2ZpbGUgU1lTVEVNICJjc3MtcHJvZmlsZS5kdGQiID4tLT4KLTxjc3MtcHJvZmlsZT4KLQk8c3R5bGVzaGVldC1kZWY+Ci0JCTxkZXNjcmlwdGlvbj4lY3NzMS5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+Ci0JCTxpbXBvcnQtcnVsZS8+Ci0JCTxzdHlsZS1ydWxlLz4KLQk8L3N0eWxlc2hlZXQtZGVmPgotCi0JPGltcG9ydC1ydWxlLWRlZj4KLQk8L2ltcG9ydC1ydWxlLWRlZj4KLQotCTxzdHlsZS1ydWxlLWRlZj4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iZGVzY2VuZGFudCIvPgotCQk8cHNldWRvLWVsZW1lbnQgbmFtZT0iZmlyc3QtbGluZSIvPgotCQk8cHNldWRvLWVsZW1lbnQgbmFtZT0iZmlyc3QtbGV0dGVyIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0ibGluayIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9InZpc2l0ZWQiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJhY3RpdmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtYXR0YWNobWVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1pbWFnZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXJpZ2h0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci10b3Atd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2xlYXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkaXNwbGF5Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmbG9hdCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1mYW1pbHkiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC12YXJpYW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXdlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0iaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZXR0ZXItc3BhY2luZyIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGluZS1oZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLWJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1hbGlnbiIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1kZWNvcmF0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWluZGVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC10cmFuc2Zvcm0iLz4KLQkJPHByb3BlcnR5IG5hbWU9InZlcnRpY2FsLWFsaWduIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aGl0ZS1zcGFjZSIvPgotCQk8cHJvcGVydHkgbmFtZT0id2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmQtc3BhY2luZyIvPgotCTwvc3R5bGUtcnVsZS1kZWY+Ci0KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJsaW5rIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmxpbms8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJ2aXNpdGVkIj4KLQkJPHNlbGVjdG9yLXZhbHVlPnZpc2l0ZWQ8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJhY3RpdmUiPgotCQk8c2VsZWN0b3ItdmFsdWU+YWN0aXZlPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImZpcnN0LWxpbmUiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zmlyc3QtbGluZTwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJmaXJzdC1sZXR0ZXIiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zmlyc3QtbGV0dGVyPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQotCTwhLS0gcHJvcGVydHkgZGVmaW5pdGlvbiAtLT4KLQotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWNvbG9yIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIi8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXJlcGVhdCIvPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIi8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzY3JvbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZml4ZWQiLz4KLSAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtY29sb3IiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InRyYW5zcGFyZW50Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLXBvc2l0aW9uIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90dG9tIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJhY2tncm91bmQtcmVwZWF0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdC14Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdC15Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vLXJlcGVhdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1jb2xvciIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1zdHlsZSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZG90dGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRhc2hlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzb2xpZCIvPgotCQk8a2V5d29yZCBuYW1lPSJkb3VibGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZ3Jvb3ZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZGdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imluc2V0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im91dHNldCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXJpZ2h0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXRvcC13aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdC13aWR0aCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaW4iLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRoaWNrIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItd2lkdGgiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJ0aGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0aGljayIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY2xlYXIiIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90aCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY29sb3IiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlzcGxheSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGtleXdvcmQgbmFtZT0iYmxvY2siLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5saW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxpc3QtaXRlbSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmbG9hdCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtdmFyaWFudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC13ZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGluZS1oZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtZmFtaWx5Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0ic2xhc2giLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtZmFtaWx5IiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8c3RyaW5nIG5hbWU9ImZhbWlseS1uYW1lIi8+Ci0JCTxjb250YWluZXIgbmFtZT0iZ2VuZXJpYy1mYW1pbHkiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zaXplIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8Y29udGFpbmVyIG5hbWU9ImFic29sdXRlLXNpemUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJyZWxhdGl2ZS1zaXplIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zdHlsZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Iml0YWxpYyIvPgotCQk8a2V5d29yZCBuYW1lPSJvYmxpcXVlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXZhcmlhbnQiIGluaGVyaXRlZD0ieWVzIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJzbWFsbC1jYXBzIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXdlaWdodCIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpZ2h0ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iMTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjIwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIzMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNDAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjUwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI2MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjgwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI5MDAiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImhlaWdodCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsZXR0ZXItc3BhY2luZyIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaW5lLWhlaWdodCIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNxdWFyZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5zaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im91dHNpZGUiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLWltYWdlIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaXN0LXN0eWxlLXBvc2l0aW9uIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGtleXdvcmQgbmFtZT0iaW5zaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im91dHNpZGUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNxdWFyZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbiIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tdG9wIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1yaWdodCIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4tYm90dG9tIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1sZWZ0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmciIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJib3giPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZGRpbmctdG9wIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLXJpZ2h0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLWJvdHRvbSIgaW5oZXJpdGVkPSJubyIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1sZWZ0IiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWFsaWduIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJqdXN0aWZ5Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iIGluaGVyaXRlZD0ibm8iIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bmRlcmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3ZlcmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGluZS10aHJvdWdoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsaW5rIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWluZGVudCIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LXRyYW5zZm9ybSIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0iY2FwaXRhbGl6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlcmNhc2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibG93ZXJjYXNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImJhc2VsaW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1YiIvPgotCQk8a2V5d29yZCBuYW1lPSJzdXBlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0idGV4dC10b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWlkZGxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZXh0LWJvdHRvbSIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9IndoaXRlLXNwYWNlIiBpbmhlcml0ZWQ9InllcyIgY2F0ZWdvcnk9ImNsYXNzaWZpY2F0aW9uIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InByZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub3dyYXAiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9IndpZHRoIiBpbmhlcml0ZWQ9Im5vIiBjYXRlZ29yeT0iYm94Ij4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9IndvcmQtc3BhY2luZyIgaW5oZXJpdGVkPSJ5ZXMiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0KLQk8IS0tIGNvbnRhaW5lciBkZWZpbml0aW9uIDogQ29udGFpbmVyIGlzIHRoZSBsdW1wIG9mIHZhbHVlcy4KLQlJdCBjYW4gYmUgdXNlZCBsaWtlIG1hY3Jvcy4gLS0+Ci0gICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYWJzb2x1dGUtc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Inh4LXNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Ingtc21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic21hbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxhcmdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9IngtbGFyZ2UiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ieHgtbGFyZ2UiLz4KLSAgICA8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iY29sb3IiPgotCQk8a2V5d29yZCBuYW1lPSJhcXVhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsYWNrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsdWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZnVjaHNpYSIvPgotCQk8a2V5d29yZCBuYW1lPSJncmF5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImdyZWVuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpbWUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWFyb29uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5hdnkiLz4KLQkJPGtleXdvcmQgbmFtZT0ib2xpdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0icHVycGxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzaWx2ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idGVhbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ3aGl0ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ5ZWxsb3ciLz4KLQkJPGZ1bmN0aW9uIG5hbWU9InJnYiIvPgotCQk8bnVtYmVyIG5hbWU9Imhhc2giLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iZ2VuZXJpYy1mYW1pbHkiPgotCQk8a2V5d29yZCBuYW1lPSJzZXJpZiIvPgotCQk8a2V5d29yZCBuYW1lPSJzYW5zLXNlcmlmIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImN1cnNpdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFudGFzeSIvPgotCQk8a2V5d29yZCBuYW1lPSJtb25vc3BhY2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0icmVsYXRpdmUtc2l6ZSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGFyZ2VyIi8+Ci0JPC9jb250YWluZXItZGVmPgotCi0JPCEtLSBjYXRlZ29yeSBkZWZpbml0aW9uIDogVGhpcyBpcyB1c2VkIHRvIGNhdGVnb3JpemUgcHJvcGVydGllcwotCWluIFByb3BlcnRpZXMgVmlldy4gLS0+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJib3giPgotCQk8Y2FwdGlvbj4lY3NzMS5jYXRlZ29yeS1kZWYuYm94LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8Y2FwdGlvbj4lY3NzMS5jYXRlZ29yeS1kZWYuY29sb3JhbmRiYWNrZ3JvdW5kLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJjbGFzc2lmaWNhdGlvbiI+Ci0JCTxjYXB0aW9uPiVjc3MxLmNhdGVnb3J5LWRlZi5jbGFzc2lmaWNhdGlvbi5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0iZm9udCI+Ci0JCTxjYXB0aW9uPiVjc3MxLmNhdGVnb3J5LWRlZi5mb250LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ0ZXh0Ij4KLQkJPGNhcHRpb24+JWNzczEuY2F0ZWdvcnktZGVmLnRleHQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQotCTxmdW5jdGlvbi1kZWYgbmFtZT0icmdiIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPnJnYjwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJ1cmkiPgotCQk8ZnVuY3Rpb24tdmFsdWU+dXJsPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQkKLQk8IS0tIG51bWJlciBkZWZpbml0aW9uIDogV2hhdCB1bml0IHR5cGVzIGJlIGFjY2VwdGFibGUgZm9yIGVhY2gKLQludW1iZXIgdHlwZT8gLS0+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0iaGFzaCI+Ci0gICAgICAgIDx1bml0IG5hbWU9Imhhc2giLz4KLSAgICA8L251bWJlci1kZWY+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0ibGVuZ3RoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iZW0iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iZXgiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icHgiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iaW4iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iY20iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0ibW0iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icHQiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icGMiLz4KLSAgICA8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0ibnVtYmVyIj4KLQk8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0icGVyY2VudGFnZSI+Ci0JCTx1bml0IG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L251bWJlci1kZWY+Ci0KLQk8dW5pdC1kZWYgbmFtZT0iY20iPgotCQk8dW5pdC12YWx1ZT5jbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJlbSI+Ci0JCTx1bml0LXZhbHVlPmVtPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImV4Ij4KLQkJPHVuaXQtdmFsdWU+ZXg8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iaGFzaCI+Ci0JCTx1bml0LXZhbHVlPiM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iaW4iPgotCQk8dW5pdC12YWx1ZT5pbjwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJtbSI+Ci0JCTx1bml0LXZhbHVlPm1tPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InBjIj4KLQkJPHVuaXQtdmFsdWU+cGM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icGVyY2VudGFnZSI+Ci0JCTx1bml0LXZhbHVlPiU8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icHQiPgotCQk8dW5pdC12YWx1ZT5wdDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJweCI+Ci0JCTx1bml0LXZhbHVlPnB4PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0KLSAgICA8IS0tIGtleXdvcmRzIDogc3RyaW5nIGNvbnN0YW50cyAodGhpcyBpcyBsYXN0IHBhcnQuLikgLS0+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjEwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjEwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIyMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4yMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMzAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MzAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjQwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjQwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI1MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT41MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNjAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NjAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjcwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjcwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI4MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT44MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iOTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+OTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFxdWEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hcXVhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImF1dG8iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hdXRvPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJhc2VsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmFzZWxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxhY2siPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibGFjazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibGluayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsaW5rPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsb2NrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmxvY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmx1ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsdWU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm9sZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvbGQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYm9sZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym9sZGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvdGgiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib3RoPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvdHRvbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvdHRvbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYXBpdGFsaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2FwaXRhbGl6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjZW50ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jZW50ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2lyY2xlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2lyY2xlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImN1cnNpdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jdXJzaXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRhc2hlZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRhc2hlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWNpbWFsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGVjaW1hbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkaXNjIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGlzYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkb3R0ZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kb3R0ZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG91YmxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG91YmxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhbnRhc3kiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYW50YXN5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZpeGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Zml4ZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZnVjaHNpYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZ1Y2hzaWE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3JheSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmdyYXk8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3JlZW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncmVlbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncm9vdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ncm9vdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5saW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5saW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imluc2V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5zZXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5zaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW5zaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Iml0YWxpYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPml0YWxpYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJqdXN0aWZ5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+anVzdGlmeTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhcmdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhcmdlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxhcmdlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsZWZ0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGVmdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaWdodGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGlnaHRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaW1lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGltZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaW5lLXRocm91Z2giPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saW5lLXRocm91Z2g8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGlzdC1pdGVtIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGlzdC1pdGVtPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLWFscGhhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItYWxwaGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItcm9tYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1yb21hbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlcmNhc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlcmNhc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWFyb29uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWFyb29uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1lZGl1bSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1lZGl1bTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtaWRkbGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5taWRkbGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibW9ub3NwYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bW9ub3NwYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5hdnkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uYXZ5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vLXJlcGVhdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vLXJlcGVhdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJub25lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm9uZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJub3JtYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub3JtYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm93cmFwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm93cmFwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im9ibGlxdWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vYmxpcXVlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im9saXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b2xpdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ib3V0c2V0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3V0c2V0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im91dHNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vdXRzaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im92ZXJsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3ZlcmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icHJlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cHJlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InB1cnBsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnB1cnBsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJlcGVhdC14Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmVwZWF0LXg8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0LXkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQteTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWRnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJpZGdlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmlnaHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2Fucy1zZXJpZiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNhbnMtc2VyaWY8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2Nyb2xsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2Nyb2xsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlcmlmIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2VyaWY8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2lsdmVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2lsdmVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGwtY2FwcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsLWNhcHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGxlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNtYWxsZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic29saWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zb2xpZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzcXVhcmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zcXVhcmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3ViIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3ViPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN1cGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3VwZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGVhbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRlYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dC10b3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZXh0LXRvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0ZXh0LWJvdHRvbSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRleHQtYm90dG9tPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRoaWNrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGhpY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGhpbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRoaW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idG9wIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dG9wPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRyYW5zcGFyZW50Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dHJhbnNwYXJlbnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idW5kZXJsaW5lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dW5kZXJsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLWFscGhhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItYWxwaGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItcm9tYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1yb21hbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlcmNhc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlcmNhc2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0id2hpdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53aGl0ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1sYXJnZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LXNtYWxsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4eC1zbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnh4LXNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Inh4LWxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eHgtbGFyZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieWVsbG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eWVsbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYzA4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtY3NzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMjU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLTwhRE9DVFlQRSBjc3MtcHJvZmlsZSBTWVNURU0gImNzcy1wcm9maWxlLmR0ZCIgPi0tPgotPGNzcy1wcm9maWxlPgotCTxzdHlsZXNoZWV0LWRlZj4KLQkJPGRlc2NyaXB0aW9uPiVjc3MyLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPGNoYXJzZXQtcnVsZS8+Ci0JCTxpbXBvcnQtcnVsZS8+Ci0JCTxwYWdlLXJ1bGUvPgotCQk8bWVkaWEtcnVsZS8+Ci0JCTxmb250ZmFjZS1ydWxlLz4KLQkJPHN0eWxlLXJ1bGUvPgotCTwvc3R5bGVzaGVldC1kZWY+Ci0KLQk8Y2hhcnNldC1ydWxlLWRlZj4KLQk8L2NoYXJzZXQtcnVsZS1kZWY+Ci0JPGltcG9ydC1ydWxlLWRlZj4KLQk8L2ltcG9ydC1ydWxlLWRlZj4KLQk8bWVkaWEtcnVsZS1kZWY+Ci0JPC9tZWRpYS1ydWxlLWRlZj4KLQotCTxwYWdlLXJ1bGUtZGVmPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxlZnQiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJyaWdodCIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImZpcnN0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrcyIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1hZnRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstaW5zaWRlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvcnBoYW5zIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWRvd3MiLz4KLQk8L3BhZ2UtcnVsZS1kZWY+Ci0KLQk8Zm9udGZhY2UtcnVsZS1kZWY+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImFzY2VudCIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJiYXNlbGluZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJiYm94Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImNhcC1oZWlnaHQiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iY2VudGVybGluZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJkZWZpbml0aW9uLXNyYyIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJkZXNjZW50Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtZmFtaWx5Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9ImZvbnQtc2l6ZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LXN0cmV0Y2giLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC1zdHlsZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJmb250LXZhcmlhbnQiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0iZm9udC13ZWlnaHQiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ibWF0aGxpbmUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0icGFub3NlLTEiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ic2xvcGUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ic2xvcGUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0ic3JjIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InN0ZW1oIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InN0ZW12Ii8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9InRvcGxpbmUiLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0idW5pY29kZS1yYW5nZSIvPgotCQk8ZGVzY3JpcHRvciBuYW1lPSJ1bml0cy1wZXItZW0iLz4KLQkJPGRlc2NyaXB0b3IgbmFtZT0id2lkdGhzIi8+Ci0JCTxkZXNjcmlwdG9yIG5hbWU9IngtaGVpZ2h0Ii8+Ci0JPC9mb250ZmFjZS1ydWxlLWRlZj4KLQotCTwhLS0gV2hpY2ggcHJvcGVydGllcyBjYW4gc3R5bGUgcnVsZSBpbmNsdWRlID8gLS0+Ci0KLQk8c3R5bGUtcnVsZS1kZWY+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImRlc2NlbmRhbnQiLz4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iY2hpbGQiLz4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iYWRqYWNlbnQiLz4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0idW5pdmVyc2FsIi8+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImF0dHJpYnV0ZSIvPgotCQk8cHNldWRvLWVsZW1lbnQgbmFtZT0iZmlyc3QtbGluZSIvPgotCQk8cHNldWRvLWVsZW1lbnQgbmFtZT0iZmlyc3QtbGV0dGVyIi8+Ci0JCTxwc2V1ZG8tZWxlbWVudCBuYW1lPSJiZWZvcmUiLz4KLQkJPHBzZXVkby1lbGVtZW50IG5hbWU9ImFmdGVyIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iZmlyc3QtY2hpbGQiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsaW5rIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0idmlzaXRlZCIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImhvdmVyIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iYWN0aXZlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iZm9jdXMiLz4KLQkJPHBzZXVkby1jbGFzcyBuYW1lPSJsYW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhemltdXRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcmVwZWF0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1jb2xsYXBzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3BhY2luZyIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQtY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20tY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0LWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wLXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20tc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1ib3R0b20td2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvdHRvbSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2FwdGlvbi1zaWRlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjbGVhciIvPgotCQk8cHJvcGVydHkgbmFtZT0iY2xpcCIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29sb3IiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvbnRlbnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvdW50ZXItaW5jcmVtZW50Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjb3VudGVyLXJlc2V0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1hZnRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3VlLWJlZm9yZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY3Vyc29yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkaXJlY3Rpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRpc3BsYXkiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImVsZXZhdGlvbiIvPgotCQk8cHJvcGVydHkgbmFtZT0iZW1wdHktY2VsbHMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZsb2F0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LWZhbWlseSIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXNpemUtYWRqdXN0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0cmV0Y2giLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtdmFyaWFudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC13ZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGV0dGVyLXNwYWNpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9ImxpbmUtaGVpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLWltYWdlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXR5cGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmdpbiIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLXRvcCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFyZ2luLXJpZ2h0Ii8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJnaW4tbGVmdCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya2VyLW9mZnNldCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWFya3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1heC1oZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1heC13aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWluLWhlaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWluLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvcnBoYW5zIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdmVyZmxvdyIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZyIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFkZGluZy10b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctcmlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZGRpbmctYm90dG9tIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nLWxlZnQiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYWZ0ZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYmVmb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWluc2lkZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlLWFmdGVyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1iZWZvcmUiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBpdGNoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaXRjaC1yYW5nZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGxheS1kdXJpbmciLz4KLQkJPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJxdW90ZXMiLz4KLQkJPHByb3BlcnR5IG5hbWU9InJpY2huZXNzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJyaWdodCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic2l6ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWsiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWFrLWhlYWRlciIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstbnVtZXJhbCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstcHVuY3R1YXRpb24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InNwZWVjaC1yYXRlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzdHJlc3MiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRhYmxlLWxheW91dCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1hbGlnbiIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1kZWNvcmF0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0ZXh0LWluZGVudCIvPgotCQk8cHJvcGVydHkgbmFtZT0idGV4dC1zaGFkb3ciLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtdHJhbnNmb3JtIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ0b3AiLz4KLQkJPHByb3BlcnR5IG5hbWU9InVuaWNvZGUtYmlkaSIvPgotCQk8cHJvcGVydHkgbmFtZT0idmVydGljYWwtYWxpZ24iLz4KLQkJPHByb3BlcnR5IG5hbWU9InZpc2liaWxpdHkiLz4KLQkJPHByb3BlcnR5IG5hbWU9InZvaWNlLWZhbWlseSIvPgotCQk8cHJvcGVydHkgbmFtZT0idm9sdW1lIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aGl0ZS1zcGFjZSIvPgotCQk8cHJvcGVydHkgbmFtZT0id2lkb3dzIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ3aWR0aCIvPgotCQk8cHJvcGVydHkgbmFtZT0id29yZC1zcGFjaW5nIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJ6LWluZGV4Ii8+Ci0JPC9zdHlsZS1ydWxlLWRlZj4KLQotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImZpcnN0LWNoaWxkIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0LWNoaWxkPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0ibGluayI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5saW5rPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0idmlzaXRlZCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT52aXNpdGVkPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iaG92ZXIiPgotCQk8c2VsZWN0b3ItdmFsdWU+aG92ZXI8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJhY3RpdmUiPgotCQk8c2VsZWN0b3ItdmFsdWU+YWN0aXZlPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0JPHBzZXVkby1jbGFzcy1kZWYgbmFtZT0iZm9jdXMiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zm9jdXM8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJsYW5nIj4KLQkJPHNlbGVjdG9yLXZhbHVlPmxhbmc8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJsZWZ0Ij4KLQkJPHNlbGVjdG9yLXZhbHVlPmxlZnQ8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWNsYXNzLWRlZj4KLQk8cHNldWRvLWNsYXNzLWRlZiBuYW1lPSJyaWdodCI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5yaWdodDwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tY2xhc3MtZGVmPgotCTxwc2V1ZG8tY2xhc3MtZGVmIG5hbWU9ImZpcnN0Ij4KLQkJPHNlbGVjdG9yLXZhbHVlPmZpcnN0PC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1jbGFzcy1kZWY+Ci0KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImZpcnN0LWxpbmUiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zmlyc3QtbGluZTwvc2VsZWN0b3ItdmFsdWU+Ci0JPC9wc2V1ZG8tZWxlbWVudC1kZWY+Ci0JPHBzZXVkby1lbGVtZW50LWRlZiBuYW1lPSJmaXJzdC1sZXR0ZXIiPgotCQk8c2VsZWN0b3ItdmFsdWU+Zmlyc3QtbGV0dGVyPC9zZWxlY3Rvci12YWx1ZT4KLQk8L3BzZXVkby1lbGVtZW50LWRlZj4KLQk8cHNldWRvLWVsZW1lbnQtZGVmIG5hbWU9ImJlZm9yZSI+Ci0JCTxzZWxlY3Rvci12YWx1ZT5iZWZvcmU8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCTxwc2V1ZG8tZWxlbWVudC1kZWYgbmFtZT0iYWZ0ZXIiPgotCQk8c2VsZWN0b3ItdmFsdWU+YWZ0ZXI8L3NlbGVjdG9yLXZhbHVlPgotCTwvcHNldWRvLWVsZW1lbnQtZGVmPgotCi0JPCEtLSBwcm9wZXJ0eSBkZWZpbml0aW9uIC0tPgotCi0JPHByb3BlcnR5LWRlZiBuYW1lPSJhemltdXRoIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5UaGlzIHByb3ZpZGVzIHNwYXRpYWwgYXVkaW8gcHJvcGVydHkgZm9yIGF1cmFsCi0gICAgICAgIHByZXNlbnRhdGlvbjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxudW1iZXIgbmFtZT0iYW5nbGUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibGVmdC1zaWRlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImZhci1sZWZ0Ii8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iY2VudGVyLWxlZnQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImNlbnRlci1yaWdodCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJmYXItcmlnaHQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0icmlnaHQtc2lkZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJiZWhpbmQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ibGVmdHdhcmRzIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InJpZ2h0d2FyZHMiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtY29sb3IiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtaW1hZ2UiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcmVwZWF0Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQtcG9zaXRpb24iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1hdHRhY2htZW50IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJzY3JvbGwiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZml4ZWQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLSAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ0cmFuc3BhcmVudCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWltYWdlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb2xvcmFuZGJhY2tncm91bmQiPgotICAgICAgICA8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgIDwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1wb3NpdGlvbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29sb3JhbmRiYWNrZ3JvdW5kIj4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90dG9tIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYmFja2dyb3VuZC1yZXBlYXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxrZXl3b3JkIG5hbWU9InJlcGVhdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQteCIvPgotCQk8a2V5d29yZCBuYW1lPSJyZXBlYXQteSIvPgotCQk8a2V5d29yZCBuYW1lPSJuby1yZXBlYXQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItY29sbGFwc2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJjb2xsYXBzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzZXBhcmF0ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0idHJhbnNwYXJlbnQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLXNwYWNpbmciCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3AiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItdG9wLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItcmlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItcmlnaHQtd2lkdGgiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1ib3R0b20iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItYm90dG9tLXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItbGVmdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImJvcmRlci1sZWZ0LXdpZHRoIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItdG9wLWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodC1jb2xvciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJib3JkZXItYm90dG9tLWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1sZWZ0LWNvbG9yIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9ImNvbG9yIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3Atc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbS1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItc3R5bGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQtc3R5bGUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXN0eWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci10b3Atd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci1yaWdodC13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWJvdHRvbS13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm9yZGVyLWxlZnQtd2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImJvcmRlci13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJib3JkZXItd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iYm90dG9tIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjYXB0aW9uLXNpZGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0YWJsZXMiPgotCQk8a2V5d29yZCBuYW1lPSJ0b3AiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90dG9tIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY2xlYXIiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJib3RoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNsaXAiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxjb250YWluZXIgbmFtZT0ic2hhcGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJjb2xvciIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0JCTxjb250YWluZXIgbmFtZT0iY29sb3IiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY29udGVudCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxzdHJpbmcgbmFtZT0iYW55Ii8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9ImNvdW50ZXIiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9ImF0dHIiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3Blbi1xdW90ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJjbG9zZS1xdW90ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJuby1vcGVuLXF1b3RlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vLWNsb3NlLXF1b3RlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImNvdW50ZXItaW5jcmVtZW50IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPHN0cmluZyBuYW1lPSJjb3VudGVyLWlkZW50aWZpZXIiLz4KLQkJPG51bWJlciBuYW1lPSJpbnRlZ2VyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY291bnRlci1yZXNldCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxzdHJpbmcgbmFtZT0iY291bnRlci1pZGVudGlmaWVyIi8+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImN1ZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYmVmb3JlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdWUtYWZ0ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY3VlLWFmdGVyIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImN1ZS1iZWZvcmUiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iY3Vyc29yIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iY3Jvc3NoYWlyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlZmF1bHQiLz4KLQkJPGtleXdvcmQgbmFtZT0icG9pbnRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJtb3ZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImUtcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5lLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJudy1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibi1yZXNpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic2UtcmVzaXplIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN3LXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzLXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ3LXJlc2l6ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZXh0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IndhaXQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGVscCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImRpcmVjdGlvbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9Imx0ciIvPgotCQk8a2V5d29yZCBuYW1lPSJydGwiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZGlzcGxheSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYWxsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0iaW5saW5lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsb2NrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxpc3QtaXRlbSIvPgotCQk8a2V5d29yZCBuYW1lPSJydW4taW4iLz4KLQkJPGtleXdvcmQgbmFtZT0iY29tcGFjdCIvPgotCQk8a2V5d29yZCBuYW1lPSJtYXJrZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5saW5lLXRhYmxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLXJvdy1ncm91cCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1oZWFkZXItZ3JvdXAiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtZm9vdGVyLWdyb3VwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLXJvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJ0YWJsZS1jb2x1bW4tZ3JvdXAiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtY29sdW1uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRhYmxlLWNlbGwiLz4KLQkJPGtleXdvcmQgbmFtZT0idGFibGUtY2FwdGlvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImVsZXZhdGlvbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9ImFuZ2xlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJlbG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxldmVsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFib3ZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpZ2hlciIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJlbXB0eS1jZWxscyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRhYmxlcyI+Ci0JCTxrZXl3b3JkIG5hbWU9InNob3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmbG9hdCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc3R5bGUiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtdmFyaWFudCIvPgotCQk8cHJvcGVydHkgbmFtZT0iZm9udC13ZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGluZS1oZWlnaHQiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtZmFtaWx5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNhcHRpb24iLz4KLQkJPGtleXdvcmQgbmFtZT0iaWNvbiIvPgotCQk8a2V5d29yZCBuYW1lPSJtZW51Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9Im1lc3NhZ2UtYm94Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsLWNhcHRpb24iLz4KLQkJPGtleXdvcmQgbmFtZT0ic3RhdHVzLWJhciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0ic2xhc2giLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtZmFtaWx5IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxzdHJpbmcgbmFtZT0iZmFtaWx5LW5hbWUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJnZW5lcmljLWZhbWlseSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc2l6ZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8Y29udGFpbmVyIG5hbWU9ImFic29sdXRlLXNpemUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJyZWxhdGl2ZS1zaXplIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXNpemUtYWRqdXN0IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iZm9udC1zdHJldGNoIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iZm9udCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ3aWRlciIvPgotCQk8a2V5d29yZCBuYW1lPSJuYXJyb3dlciIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bHRyYS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXh0cmEtY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzZW1pLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzZW1pLWV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImV4dHJhLWV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVsdHJhLWV4cGFuZGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtc3R5bGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJmb250Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Iml0YWxpYyIvPgotCQk8a2V5d29yZCBuYW1lPSJvYmxpcXVlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImZvbnQtdmFyaWFudCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGwtY2FwcyIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJmb250LXdlaWdodCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImZvbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm9sZCIvPgotCQk8a2V5d29yZCBuYW1lPSJib2xkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlnaHRlciIvPgotCQk8a2V5d29yZCBuYW1lPSIxMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iMjAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjMwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI0MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjYwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI3MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iODAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjkwMCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJoZWlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxlZnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9ImxldHRlci1zcGFjaW5nIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJsaW5lLWhlaWdodCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8bnVtYmVyIG5hbWU9Im51bWJlciIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8cHJvcGVydHkgbmFtZT0ibGlzdC1zdHlsZS10eXBlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLXBvc2l0aW9uIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaXN0LXN0eWxlLWltYWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtaW1hZ2UiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtcG9zaXRpb24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJjb250ZW50Ij4KLQkJPGtleXdvcmQgbmFtZT0iaW5zaWRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im91dHNpZGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibGlzdC1zdHlsZS10eXBlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImRpc2MiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2lyY2xlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNxdWFyZSIvPgotCQk8a2V5d29yZCBuYW1lPSJkZWNpbWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImRlY2ltYWwtbGVhZGluZy16ZXJvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLXJvbWFuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWdyZWVrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyLWxhdGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLWFscGhhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVwcGVyLWxhdGluIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhlYnJldyIvPgotCQk8a2V5d29yZCBuYW1lPSJhcm1lbmlhbiIvPgotCQk8a2V5d29yZCBuYW1lPSJnZW9yZ2lhbiIvPgotCQk8a2V5d29yZCBuYW1lPSJjamstaWRlb2dyYXBoaWMiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlyYWdhbmEiLz4KLQkJPGtleXdvcmQgbmFtZT0ia2F0YWthbmEiLz4KLQkJPGtleXdvcmQgbmFtZT0iaGlyYWdhbmEtaXJvaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ia2F0YWthbmEtaXJvaGEiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJtYXJnaW4iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0ibWFyZ2luLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi10b3AiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0ibWFyZ2luLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmdpbi1yaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLWJvdHRvbSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iYm94Ij4KLQkJPGNvbnRhaW5lciBuYW1lPSJtYXJnaW4td2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWFyZ2luLWxlZnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0ibWFyZ2luLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmtlci1vZmZzZXQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1hcmtzIgotCQlpbmhlcml0ZWQ9Im5hIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPGtleXdvcmQgbmFtZT0iY3JvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJjcm9zcyIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1heC1oZWlnaHQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im1heC13aWR0aCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWluLWhlaWdodCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ibWluLXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvcnBoYW5zIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdXRsaW5lIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLWNvbG9yIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXN0eWxlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im91dGxpbmUtY29sb3IiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxpbnRlcmFjdGl2ZSIgY2F0ZWdvcnk9InVpIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8a2V5d29yZCBuYW1lPSJpbnZlcnQiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ib3V0bGluZS1zdHlsZSIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsLGludGVyYWN0aXZlIiBjYXRlZ29yeT0idWkiPgotCQk8Y29udGFpbmVyIG5hbWU9ImJvcmRlci1zdHlsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJvdXRsaW5lLXdpZHRoIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwsaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ1aSI+Ci0JCTxjb250YWluZXIgbmFtZT0iYm9yZGVyLXdpZHRoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Im92ZXJmbG93IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJ2aXNpYmxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpZGRlbiIvPgotCQk8a2V5d29yZCBuYW1lPSJzY3JvbGwiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9InBhZGRpbmctd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy10b3AiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLXJpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJib3giPgotCQk8Y29udGFpbmVyIG5hbWU9InBhZGRpbmctd2lkdGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGFkZGluZy1ib3R0b20iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWRkaW5nLWxlZnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImJveCI+Ci0JCTxjb250YWluZXIgbmFtZT0icGFkZGluZy13aWR0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWdlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsLHBhZ2VkIiBjYXRlZ29yeT0icGFnZSI+Ci0JCTxzdHJpbmcgbmFtZT0icGFnZS1pZGVudGlmaWVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZ2UtYnJlYWstYWZ0ZXIiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFsd2F5cyIvPgotCQk8a2V5d29yZCBuYW1lPSJhdm9pZCIvPgotCQk8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InJpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhZ2UtYnJlYWstYmVmb3JlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJhbHdheXMiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXZvaWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYWdlLWJyZWFrLWluc2lkZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8a2V5d29yZCBuYW1lPSJhdm9pZCIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBhdXNlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJ0aW1lIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwYXVzZS1hZnRlciIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0idGltZSIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0icGF1c2UtYmVmb3JlIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJ0aW1lIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwaXRjaCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8bnVtYmVyIG5hbWU9ImZyZXF1ZW5jeSIvPgotCQk8a2V5d29yZCBuYW1lPSJ4LWxvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpZ2giLz4KLQkJPGtleXdvcmQgbmFtZT0ieC1oaWdoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBpdGNoLXJhbmdlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InBsYXktZHVyaW5nIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InVyaSIvPgotCQk8a2V5d29yZCBuYW1lPSJtaXgiLz4KLQkJPGtleXdvcmQgbmFtZT0icmVwZWF0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJwb3NpdGlvbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0ic3RhdGljIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlbGF0aXZlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImFic29sdXRlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZpeGVkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InF1b3RlcyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8c3RyaW5nIG5hbWU9ImFueSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InJpY2huZXNzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InJpZ2h0IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzaXplIgotCQlpbmhlcml0ZWQ9Im5hIiBtZWRpYWdyb3VwPSJ2aXN1YWwscGFnZWQiIGNhdGVnb3J5PSJwYWdlIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJwb3J0cmFpdCIvPgotCQk8a2V5d29yZCBuYW1lPSJsYW5kc2NhcGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3BlYWsiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3BlbGwtb3V0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InNwZWFrLWhlYWRlciIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0ib25jZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhbHdheXMiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3BlYWstbnVtZXJhbCIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8a2V5d29yZCBuYW1lPSJkaWdpdHMiLz4KLQkJPGtleXdvcmQgbmFtZT0iY29udGludW91cyIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJzcGVhay1wdW5jdHVhdGlvbiIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9ImF1cmFsIiBjYXRlZ29yeT0iYXVyYWwiPgotCQk8a2V5d29yZCBuYW1lPSJjb2RlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3BlZWNoLXJhdGUiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ieC1zbG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InNsb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZhc3QiLz4KLQkJPGtleXdvcmQgbmFtZT0ieC1mYXN0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImZhc3RlciIvPgotCQk8a2V5d29yZCBuYW1lPSJzbG93ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0ic3RyZXNzIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRhYmxlLWxheW91dCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGFibGVzIj4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8a2V5d29yZCBuYW1lPSJmaXhlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWFsaWduIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY2VudGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imp1c3RpZnkiLz4KLQkJPHN0cmluZyBuYW1lPSJhbnkiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idGV4dC1kZWNvcmF0aW9uIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibm9uZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1bmRlcmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ib3ZlcmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGluZS10aHJvdWdoIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsaW5rIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtaW5kZW50IgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LXNoYWRvdyIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJjb2xvciIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtdHJhbnNmb3JtIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9ImNhcGl0YWxpemUiLz4KLQkJPGtleXdvcmQgbmFtZT0idXBwZXJjYXNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Imxvd2VyY2FzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRvcCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPG51bWJlciBuYW1lPSJwZXJjZW50YWdlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImF1dG8iLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idW5pY29kZS1iaWRpIgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0iZW1iZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmlkaS1vdmVycmlkZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0iYmFzZWxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3ViIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1cGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJ0ZXh0LXRvcCIvPgotCQk8a2V5d29yZCBuYW1lPSJtaWRkbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYm90dG9tIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InRleHQtYm90dG9tIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2aXNpYmlsaXR5IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJ2aXNpYmxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImhpZGRlbiIvPgotCQk8a2V5d29yZCBuYW1lPSJjb2xsYXBzZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2b2ljZS1mYW1pbHkiCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJhdXJhbCIgY2F0ZWdvcnk9ImF1cmFsIj4KLQkJPHN0cmluZyBuYW1lPSJzcGVjaWZpYy12b2ljZSIvPgotCQk8Y29udGFpbmVyIG5hbWU9ImdlbmVyaWMtdm9pY2UiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0idm9sdW1lIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0iYXVyYWwiIGNhdGVnb3J5PSJhdXJhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzaWxlbnQiLz4KLQkJPGtleXdvcmQgbmFtZT0ieC1zb2Z0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9InNvZnQiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWVkaXVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxvdWQiLz4KLQkJPGtleXdvcmQgbmFtZT0ieC1sb3VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9IndoaXRlLXNwYWNlIgotCQlpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idGV4dCI+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJwcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm93cmFwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9IndpZG93cyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCxwYWdlZCIgY2F0ZWdvcnk9InBhZ2UiPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0id2lkdGgiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9IndvcmQtc3BhY2luZyIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCTxwcm9wZXJ0eS1kZWYgbmFtZT0iei1pbmRleCIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0iYXV0byIvPgotCQk8bnVtYmVyIG5hbWU9ImludGVnZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotCTwvcHJvcGVydHktZGVmPgotCi0JPCEtLSBkZXNjcmlwdG9yIGRlZmluaXRpb24gOiBUaGVzZSBhcmUgZm9yIEBmb250LWZhY2UgLS0+Ci0KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iYXNjZW50Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJiYXNlbGluZSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iYmJveCI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJjYXAtaGVpZ2h0Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJjZW50ZXJsaW5lIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJkZWZpbml0aW9uLXNyYyI+Ci0JCTxmdW5jdGlvbiBuYW1lPSJ1cmkiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJkZXNjZW50Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LWZhbWlseSI+Ci0JCTxzdHJpbmcgbmFtZT0iZmFtaWx5LW5hbWUiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJnZW5lcmljLWZhbWlseSIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC1zaXplIj4KLQkJPGtleXdvcmQgbmFtZT0iYWxsIi8+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXN0cmV0Y2giPgotCQk8a2V5d29yZCBuYW1lPSJhbGwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVsdHJhLWNvbmRlbnNlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJleHRyYS1jb25kZW5zZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlbWktY29uZGVuc2VkIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InNlbWktZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0iZXh0cmEtZXhwYW5kZWQiLz4KLQkJPGtleXdvcmQgbmFtZT0idWx0cmEtZXhwYW5kZWQiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9ImZvbnQtc3R5bGUiPgotCQk8a2V5d29yZCBuYW1lPSJhbGwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Iml0YWxpYyIvPgotCQk8a2V5d29yZCBuYW1lPSJvYmxpcXVlIi8+Ci0JCTxzZXBhcmF0b3IgbmFtZT0iY29tbWEiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJmb250LXZhcmlhbnQiPgotCQk8a2V5d29yZCBuYW1lPSJub3JtYWwiLz4KLQkJPGtleXdvcmQgbmFtZT0ic21hbGwtY2FwcyIvPgotCQk8c2VwYXJhdG9yIG5hbWU9ImNvbW1hIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0iZm9udC13ZWlnaHQiPgotCQk8a2V5d29yZCBuYW1lPSJhbGwiLz4KLQkJPGtleXdvcmQgbmFtZT0ibm9ybWFsIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJvbGQiLz4KLQkJPGtleXdvcmQgbmFtZT0iMTAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjIwMCIvPgotCQk8a2V5d29yZCBuYW1lPSIzMDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNDAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjUwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI2MDAiLz4KLQkJPGtleXdvcmQgbmFtZT0iNzAwIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IjgwMCIvPgotCQk8a2V5d29yZCBuYW1lPSI5MDAiLz4KLQkJPHNlcGFyYXRvciBuYW1lPSJjb21tYSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9Im1hdGhsaW5lIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJwYW5vc2UtMSI+Ci0JCTxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InNsb3BlIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJzcmMiPgotCQk8ZnVuY3Rpb24gbmFtZT0idXJpIi8+Ci0JCTxmdW5jdGlvbiBuYW1lPSJmb3JtYXQiLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJmb250LWZhY2UtbmFtZSIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9InN0ZW1oIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJzdGVtdiI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0idG9wbGluZSI+Ci0JCTxudW1iZXIgbmFtZT0ibnVtYmVyIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0idW5pY29kZS1yYW5nZSI+Ci0JCTxzdHJpbmcgbmFtZT0idXJhbmdlIi8+Ci0JPC9kZXNjcmlwdG9yLWRlZj4KLQk8ZGVzY3JpcHRvci1kZWYgbmFtZT0idW5pdHMtcGVyLWVtIj4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCTxkZXNjcmlwdG9yLWRlZiBuYW1lPSJ3aWR0aHMiPgotCQk8c3RyaW5nIG5hbWU9InVyYW5nZSIvPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCTwvZGVzY3JpcHRvci1kZWY+Ci0JPGRlc2NyaXB0b3ItZGVmIG5hbWU9IngtaGVpZ2h0Ij4KLQkJPG51bWJlciBuYW1lPSJudW1iZXIiLz4KLQk8L2Rlc2NyaXB0b3ItZGVmPgotCi0JPCEtLSBjb250YWluZXIgZGVmaW5pdGlvbiA6IENvbnRhaW5lciBpcyB0aGUgbHVtcCBvZiB2YWx1ZXMuCi0JSXQgY2FuIGJlIHVzZWQgbGlrZSBtYWNyb3MuIC0tPgotICAgIDxjb250YWluZXItZGVmIG5hbWU9ImFic29sdXRlLXNpemUiPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4eC1zbWFsbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4LXNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNtYWxsIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im1lZGl1bSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJsYXJnZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJ4LWxhcmdlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Inh4LWxhcmdlIi8+Ci0gICAgPC9jb250YWluZXItZGVmPgotICAgIDxjb250YWluZXItZGVmIG5hbWU9ImJvcmRlci1zdHlsZSI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iaGlkZGVuIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9ImRvdHRlZCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJkYXNoZWQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0ic29saWQiLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0iZG91YmxlIi8+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9Imdyb292ZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWRnZSIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbnNldCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJvdXRzZXQiLz4KLSAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iYm9yZGVyLXdpZHRoIj4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0idGhpbiIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJtZWRpdW0iLz4KLSAgICAgICAgPGtleXdvcmQgbmFtZT0idGhpY2siLz4KLSAgICAgICAgPG51bWJlciBuYW1lPSJsZW5ndGgiLz4KLSAgICA8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iY29sb3IiPgotCQk8a2V5d29yZCBuYW1lPSJhcXVhIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsYWNrIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImJsdWUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZnVjaHNpYSIvPgotCQk8a2V5d29yZCBuYW1lPSJncmF5Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9ImdyZWVuIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImxpbWUiLz4KLQkJPGtleXdvcmQgbmFtZT0ibWFyb29uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5hdnkiLz4KLQkJPGtleXdvcmQgbmFtZT0ib2xpdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0icHVycGxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InJlZCIvPgotCQk8a2V5d29yZCBuYW1lPSJzaWx2ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0idGVhbCIvPgotCQk8a2V5d29yZCBuYW1lPSJ3aGl0ZSIvPgotCQk8a2V5d29yZCBuYW1lPSJ5ZWxsb3ciLz4KLQkJPGNvbnRhaW5lciBuYW1lPSJzeXN0ZW0tY29sb3IiLz4KLQkJPGZ1bmN0aW9uIG5hbWU9InJnYiIvPgotCQk8bnVtYmVyIG5hbWU9Imhhc2giLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iZ2VuZXJpYy1mYW1pbHkiPgotCQk8a2V5d29yZCBuYW1lPSJzZXJpZiIvPgotCQk8a2V5d29yZCBuYW1lPSJzYW5zLXNlcmlmIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImN1cnNpdmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmFudGFzeSIvPgotCQk8a2V5d29yZCBuYW1lPSJtb25vc3BhY2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iZm9udC1mYWNlLW5hbWUiPgotCQk8ZnVuY3Rpb24gbmFtZT0ibG9jYWwiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0iZ2VuZXJpYy12b2ljZSI+Ci0JCTxrZXl3b3JkIG5hbWU9Im1hbGUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZmVtYWxlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNoaWxkIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9Im1hcmdpbi13aWR0aCI+Ci0JCTxudW1iZXIgbmFtZT0ibGVuZ3RoIi8+Ci0JCTxudW1iZXIgbmFtZT0icGVyY2VudGFnZSIvPgotCQk8a2V5d29yZCBuYW1lPSJhdXRvIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InBhZGRpbmctd2lkdGgiPgotCQk8bnVtYmVyIG5hbWU9Imxlbmd0aCIvPgotCQk8bnVtYmVyIG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0icmVsYXRpdmUtc2l6ZSI+Ci0JCTxrZXl3b3JkIG5hbWU9InNtYWxsZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ibGFyZ2VyIi8+Ci0JPC9jb250YWluZXItZGVmPgotCTxjb250YWluZXItZGVmIG5hbWU9InNoYXBlIj4KLQkJPGZ1bmN0aW9uIG5hbWU9InJlY3QiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0JPGNvbnRhaW5lci1kZWYgbmFtZT0ic3lzdGVtLWNvbG9yIj4KLQkJPGtleXdvcmQgbmFtZT0iQWN0aXZlQm9yZGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkFjdGl2ZUNhcHRpb24iLz4KLQkJPGtleXdvcmQgbmFtZT0iQXBwV29ya3NwYWNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJhY2tncm91bmQiLz4KLQkJPGtleXdvcmQgbmFtZT0iQnV0dG9uRmFjZSIvPgotCQk8a2V5d29yZCBuYW1lPSJCdXR0b25IaWdobGlnaHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iQnV0dG9uU2hhZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkJ1dHRvblRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iQ2FwdGlvblRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iR3JheVRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSGlnaGxpZ2h0Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IkhpZ2hsaWdodFRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5hY3RpdmVCb3JkZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5hY3RpdmVDYXB0aW9uIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IkluYWN0aXZlQ2FwdGlvblRleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5mb0JhY2tncm91bmQiLz4KLQkJPGtleXdvcmQgbmFtZT0iSW5mb1RleHQiLz4KLQkJPGtleXdvcmQgbmFtZT0iTWVudSIvPgotCQk8a2V5d29yZCBuYW1lPSJNZW51VGV4dCIvPgotCQk8a2V5d29yZCBuYW1lPSJTY3JvbGxiYXIiLz4KLQkJPGtleXdvcmQgbmFtZT0iVGhyZWVERGFya1NoYWRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZURGYWNlIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IlRocmVlREhpZ2hsaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZURMaWdodFNoYWRvdyIvPgotCQk8a2V5d29yZCBuYW1lPSJUaHJlZURTaGFkb3ciLz4KLQkJPGtleXdvcmQgbmFtZT0iV2luZG93Ii8+Ci0JCTxrZXl3b3JkIG5hbWU9IldpbmRvd0ZyYW1lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9IldpbmRvd1RleHQiLz4KLQk8L2NvbnRhaW5lci1kZWY+Ci0KLQk8IS0tIGNhdGVnb3J5IGRlZmluaXRpb24gOiBUaGlzIGlzIHVzZWQgdG8gY2F0ZWdvcml6ZSBwcm9wZXJ0aWVzCi0JaW4gUHJvcGVydGllcyBWaWV3LiAtLT4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImF1cmFsIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmF1cmFsLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJib3giPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuYm94LmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJjb2xvcmFuZGJhY2tncm91bmQiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuY29sb3JhbmRiYWNrZ3JvdW5kLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJjb250ZW50Ij4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLmNvbnRlbnQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9ImZvbnQiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYuZm9udC5jYXB0aW9uPC9jYXB0aW9uPgotCTwvY2F0ZWdvcnktZGVmPgotCTxjYXRlZ29yeS1kZWYgbmFtZT0icGFnZSI+Ci0JCTxjYXB0aW9uPiVjc3MyLmNhdGVnb3J5LWRlZi5wYWdlLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ0YWJsZXMiPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudGFibGVzLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ0ZXh0Ij4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnRleHQuY2FwdGlvbjwvY2FwdGlvbj4KLQk8L2NhdGVnb3J5LWRlZj4KLQk8Y2F0ZWdvcnktZGVmIG5hbWU9InVpIj4KLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnVpLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JPGNhdGVnb3J5LWRlZiBuYW1lPSJ2aXN1YWwiPgotPCEtLQkJPGNhcHRpb24+JWNzczIuY2F0ZWdvcnktZGVmLnZpc3VhbC5jYXB0aW9uPC9jYXB0aW9uPi0tPgotCQk8Y2FwdGlvbj4lY3NzMi5jYXRlZ29yeS1kZWYudmlzdWFsLmNhcHRpb248L2NhcHRpb24+Ci0JPC9jYXRlZ29yeS1kZWY+Ci0JCi0JPCEtLSBmdW5jdGlvbiBkZWZpbml0aW9uIC0tPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0iYXR0ciI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5hdHRyPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9ImNvdW50ZXIiPgotCQk8ZnVuY3Rpb24tdmFsdWU+Y291bnRlcjwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJyZWN0Ij4KLQkJPGZ1bmN0aW9uLXZhbHVlPnJlY3Q8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0icmdiIj4KLQkJPGZ1bmN0aW9uLXZhbHVlPnJnYjwvZnVuY3Rpb24tdmFsdWU+Ci0JPC9mdW5jdGlvbi1kZWY+Ci0JPGZ1bmN0aW9uLWRlZiBuYW1lPSJ1cmkiPgotCQk8ZnVuY3Rpb24tdmFsdWU+dXJsPC9mdW5jdGlvbi12YWx1ZT4KLQk8L2Z1bmN0aW9uLWRlZj4KLQk8ZnVuY3Rpb24tZGVmIG5hbWU9ImZvcm1hdCI+Ci0JCTxmdW5jdGlvbi12YWx1ZT5mb3JtYXQ8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCTxmdW5jdGlvbi1kZWYgbmFtZT0ibG9jYWwiPgotCQk8ZnVuY3Rpb24tdmFsdWU+bG9jYWw8L2Z1bmN0aW9uLXZhbHVlPgotCTwvZnVuY3Rpb24tZGVmPgotCi0JPCEtLSBudW1iZXIgZGVmaW5pdGlvbiA6IFdoYXQgdW5pdCB0eXBlcyBiZSBhY2NlcHRhYmxlIGZvciBlYWNoCi0JbnVtYmVyIHR5cGU/IC0tPgotICAgIDxudW1iZXItZGVmIG5hbWU9ImFuZ2xlIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iZGVnIi8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImdyYWQiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icmFkIi8+Ci0gICAgPC9udW1iZXItZGVmPgotICAgIDxudW1iZXItZGVmIG5hbWU9ImZyZXF1ZW5jeSI+Ci0gICAgICAgIDx1bml0IG5hbWU9Imh6Ii8+Ci0gICAgICAgIDx1bml0IG5hbWU9ImtoeiIvPgotICAgIDwvbnVtYmVyLWRlZj4KLSAgICA8bnVtYmVyLWRlZiBuYW1lPSJoYXNoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iaGFzaCIvPgotICAgIDwvbnVtYmVyLWRlZj4KLQk8bnVtYmVyLWRlZiBuYW1lPSJpbnRlZ2VyIj4KLQk8L251bWJlci1kZWY+Ci0gICAgPG51bWJlci1kZWYgbmFtZT0ibGVuZ3RoIj4KLSAgICAgICAgPHVuaXQgbmFtZT0iZW0iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iZXgiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icHgiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iaW4iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0iY20iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0ibW0iLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icHQiLz4KLSAgICAgICAgPHVuaXQgbmFtZT0icGMiLz4KLSAgICA8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0ibnVtYmVyIj4KLQk8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0icGVyY2VudGFnZSI+Ci0JCTx1bml0IG5hbWU9InBlcmNlbnRhZ2UiLz4KLQk8L251bWJlci1kZWY+Ci0JPG51bWJlci1kZWYgbmFtZT0idGltZSI+Ci0JCTx1bml0IG5hbWU9Im1zIi8+Ci0JCTx1bml0IG5hbWU9InMiLz4KLQk8L251bWJlci1kZWY+Ci0KLQk8dW5pdC1kZWYgbmFtZT0iY20iPgotCQk8dW5pdC12YWx1ZT5jbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJkZWciPgotCQk8dW5pdC12YWx1ZT5kZWc8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iZW0iPgotCQk8dW5pdC12YWx1ZT5lbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJleCI+Ci0JCTx1bml0LXZhbHVlPmV4PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9ImdyYWQiPgotCQk8dW5pdC12YWx1ZT5ncmFkPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Imhhc2giPgotCQk8dW5pdC12YWx1ZT4jPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9Imh6Ij4KLQkJPHVuaXQtdmFsdWU+SHo8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0iaW4iPgotCQk8dW5pdC12YWx1ZT5pbjwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJraHoiPgotCQk8dW5pdC12YWx1ZT5rSHo8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0ibW0iPgotCQk8dW5pdC12YWx1ZT5tbTwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJtcyI+Ci0JCTx1bml0LXZhbHVlPm1zPC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InBjIj4KLQkJPHVuaXQtdmFsdWU+cGM8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icGVyY2VudGFnZSI+Ci0JCTx1bml0LXZhbHVlPiU8L3VuaXQtdmFsdWU+Ci0JPC91bml0LWRlZj4KLQk8dW5pdC1kZWYgbmFtZT0icHQiPgotCQk8dW5pdC12YWx1ZT5wdDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJweCI+Ci0JCTx1bml0LXZhbHVlPnB4PC91bml0LXZhbHVlPgotCTwvdW5pdC1kZWY+Ci0JPHVuaXQtZGVmIG5hbWU9InJhZCI+Ci0JCTx1bml0LXZhbHVlPnJhZDwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCTx1bml0LWRlZiBuYW1lPSJzIj4KLQkJPHVuaXQtdmFsdWU+czwvdW5pdC12YWx1ZT4KLQk8L3VuaXQtZGVmPgotCi0gICAgPCEtLSBrZXl3b3JkcyA6IHN0cmluZyBjb25zdGFudHMgKHRoaXMgaXMgbGFzdCBwYXJ0Li4pIC0tPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSIxMDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT4xMDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iMjAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+MjAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjMwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjMwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI0MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT40MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iNTAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+NTAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjYwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjYwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSI3MDAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT43MDA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iODAwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ODAwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IjkwMCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPjkwMDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhYm92ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFib3ZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFic29sdXRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YWJzb2x1dGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQWN0aXZlQm9yZGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QWN0aXZlQm9yZGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkFjdGl2ZUNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5BY3RpdmVDYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhbHdheXMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hbHdheXM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQXBwV29ya3NwYWNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QXBwV29ya3NwYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFxdWEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hcXVhPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImFybWVuaWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YXJtZW5pYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXV0byI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmF1dG88L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXZvaWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5hdm9pZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCYWNrZ3JvdW5kIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QmFja2dyb3VuZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiYXNlbGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJhc2VsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJlaGluZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJlaGluZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJiZWxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJlbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJpZGktb3ZlcnJpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5iaWRpLW92ZXJyaWRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsYWNrIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+YmxhY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iYmxpbmsiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibGluazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJibG9jayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJsb2NrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJsdWUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ibHVlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvbGQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib2xkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImJvbGRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmJvbGRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib3RoIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Ym90aDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJib3R0b20iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ib3R0b208L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQnV0dG9uRmFjZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJ1dHRvbkZhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iQnV0dG9uSGlnaGxpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QnV0dG9uSGlnaGxpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkJ1dHRvblNoYWRvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkJ1dHRvblNoYWRvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJCdXR0b25UZXh0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+QnV0dG9uVGV4dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYXBpdGFsaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2FwaXRhbGl6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJDYXB0aW9uVGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkNhcHRpb25UZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNlbnRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNlbnRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjZW50ZXItbGVmdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNlbnRlci1sZWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNlbnRlci1yaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNlbnRlci1yaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjaGlsZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNoaWxkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNpcmNsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNpcmNsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjamstaWRlb2dyYXBoaWMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jamstaWRlb2dyYXBoaWM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2xvc2UtcXVvdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jbG9zZS1xdW90ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb2RlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29kZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb25kZW5zZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb25kZW5zZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iY29sbGFwc2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5jb2xsYXBzZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb21wYWN0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29tcGFjdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb250aW51b3VzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y29udGludW91czwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjcm9wIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3JvcDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjcm9zcyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNyb3NzPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImNyb3NzaGFpciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmNyb3NzaGFpcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjdXJzaXZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3Vyc2l2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkYXNoZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kYXNoZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVjaW1hbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRlY2ltYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGVjaW1hbC1sZWFkaW5nLXplcm8iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kZWNpbWFsLWxlYWRpbmctemVybzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkZWZhdWx0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGVmYXVsdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJkaWdpdHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5kaWdpdHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZGlzYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRpc2M8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZG90dGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZG90dGVkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvdWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvdWJsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJlLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmUtcmVzaXplPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImVtYmVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZW1iZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZXhwYW5kZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5leHBhbmRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJleHRyYS1jb25kZW5zZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5leHRyYS1jb25kZW5zZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZXh0cmEtZXhwYW5kZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5leHRyYS1leHBhbmRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYW50YXN5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFudGFzeTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYXItbGVmdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhci1sZWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhci1yaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZhci1yaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYXN0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmFzdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmYXN0ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5mYXN0ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZmVtYWxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmVtYWxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImZpeGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Zml4ZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZnVjaHNpYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmZ1Y2hzaWE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ2VvcmdpYW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5nZW9yZ2lhbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJncmF5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3JheTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJHcmF5VGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkdyYXlUZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImdyZWVuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3JlZW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iZ3Jvb3ZlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+Z3Jvb3ZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhlYnJldyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhlYnJldzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoZWxwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGVscDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaWRkZW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5oaWRkZW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaGlnaCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpZ2g8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSGlnaGxpZ2h0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+SGlnaGxpZ2h0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IkhpZ2hsaWdodFRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5IaWdobGlnaHRUZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpZ2hlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpZ2hlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJoaXJhZ2FuYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmhpcmFnYW5hPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImhpcmFnYW5hLWlyb2hhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aGlyYWdhbmEtaXJvaGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaWNvbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmljb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5hY3RpdmVCb3JkZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmFjdGl2ZUJvcmRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmFjdGl2ZUNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmFjdGl2ZUNhcHRpb248L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5hY3RpdmVDYXB0aW9uVGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluYWN0aXZlQ2FwdGlvblRleHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iSW5mb0JhY2tncm91bmQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5JbmZvQmFja2dyb3VuZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJJbmZvVGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPkluZm9UZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImluaGVyaXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmhlcml0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImlubGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmlubGluZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbmxpbmUtdGFibGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmxpbmUtdGFibGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5zZXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnNldDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJpbnNpZGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnNpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW52ZXJ0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+aW52ZXJ0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Iml0YWxpYyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPml0YWxpYzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJqdXN0aWZ5Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+anVzdGlmeTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJrYXRha2FuYSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmthdGFrYW5hPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImthdGFrYW5hLWlyb2hhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+a2F0YWthbmEtaXJvaGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFuZHNjYXBlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFuZHNjYXBlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFyZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGFyZ2VyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGFyZ2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxlZnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sZWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxlZnQtc2lkZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxlZnQtc2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsZWZ0d2FyZHMiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sZWZ0d2FyZHM8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGV2ZWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sZXZlbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaWdodGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGlnaHRlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaW1lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGltZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsaW5lLXRocm91Z2giPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5saW5lLXRocm91Z2g8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibGlzdC1pdGVtIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bGlzdC1pdGVtPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxvdWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9ImxvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLWFscGhhIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItYWxwaGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXItZ3JlZWsiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3dlci1ncmVlazwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3dlci1sYXRpbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmxvd2VyLWxhdGluPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imxvd2VyLXJvbWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXItcm9tYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibG93ZXJjYXNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bG93ZXJjYXNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Imx0ciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPmx0cjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtYWxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWFsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtYXJrZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tYXJrZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWFyb29uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWFyb29uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1lZGl1bSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1lZGl1bTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJNZW51Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+TWVudTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJNZW51VGV4dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPk1lbnVUZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1lc3NhZ2UtYm94Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWVzc2FnZS1ib3g8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibWlkZGxlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bWlkZGxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im1peCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1peDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtb25vc3BhY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5tb25vc3BhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibW92ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm1vdmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibi1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuYXJyb3dlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5hcnJvd2VyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5hdnkiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uYXZ5PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5lLXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5lLXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuby1jbG9zZS1xdW90ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vLWNsb3NlLXF1b3RlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vLW9wZW4tcXVvdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5uby1vcGVuLXF1b3RlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im5vLXJlcGVhdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm5vLXJlcGVhdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJub25lIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm9uZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJub3JtYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ub3JtYWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ibm93cmFwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+bm93cmFwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im53LXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm53LXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvYmxpcXVlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b2JsaXF1ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvbGl2ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm9saXZlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im9uY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vbmNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im9wZW4tcXVvdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5vcGVuLXF1b3RlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Im91dHNldCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm91dHNldDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdXRzaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+b3V0c2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvdmVybGluZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPm92ZXJsaW5lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InBvaW50ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5wb2ludGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InBvcnRyYWl0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cG9ydHJhaXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icHJlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cHJlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InB1cnBsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnB1cnBsZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVsYXRpdmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZWxhdGl2ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmVwZWF0LXgiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXBlYXQteDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyZXBlYXQteSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnJlcGVhdC15PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InJpZGdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmlkZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icmlnaHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5yaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWdodC1zaWRlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmlnaHQtc2lkZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyaWdodHdhcmRzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cmlnaHR3YXJkczwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJydGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5ydGw8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0icnVuLWluIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cnVuLWluPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InMtcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+cy1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2Fucy1zZXJpZiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNhbnMtc2VyaWY8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2Nyb2xsIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2Nyb2xsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IlNjcm9sbGJhciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlNjcm9sbGJhcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZS1yZXNpemUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZS1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2VtaS1jb25kZW5zZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zZW1pLWNvbmRlbnNlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZW1pLWV4cGFuZGVkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2VtaS1leHBhbmRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzZXBhcmF0ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNlcGFyYXRlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNlcmlmIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2VyaWY8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2hvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNob3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic2lsZW50Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2lsZW50PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNpbHZlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNpbHZlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c2xvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbG93ZXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbG93ZXI8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zbWFsbDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbC1jYXBzIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGwtY2Fwczwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbC1jYXB0aW9uIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGwtY2FwdGlvbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbWFsbGVyIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c21hbGxlcjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzb2Z0Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c29mdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzb2xpZCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNvbGlkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InNwZWxsLW91dCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnNwZWxsLW91dDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzcXVhcmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zcXVhcmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ic3RhdGljIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+c3RhdGljPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN0YXR1cy1iYXIiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5zdGF0dXMtYmFyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN1YiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN1Yjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdXBlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN1cGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InN3LXJlc2l6ZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnN3LXJlc2l6ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWNhcHRpb24iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1jYXB0aW9uPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWNlbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1jZWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWNvbHVtbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWNvbHVtbjwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1jb2x1bW4tZ3JvdXAiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1jb2x1bW4tZ3JvdXA8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtZm9vdGVyLWdyb3VwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtZm9vdGVyLWdyb3VwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRhYmxlLWhlYWRlci1ncm91cCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYmxlLWhlYWRlci1ncm91cDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWJsZS1yb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50YWJsZS1yb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGFibGUtcm93LWdyb3VwIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGFibGUtcm93LWdyb3VwPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRlYWwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZWFsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRleHQtdG9wIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dGV4dC10b3A8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idGV4dC1ib3R0b20iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50ZXh0LWJvdHRvbTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0aGljayI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnRoaWNrPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InRoaW4iPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50aGluPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IlRocmVlRERhcmtTaGFkb3ciPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5UaHJlZUREYXJrU2hhZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IlRocmVlREZhY2UiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5UaHJlZURGYWNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IlRocmVlREhpZ2hsaWdodCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlREhpZ2hsaWdodDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJUaHJlZURMaWdodFNoYWRvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlRExpZ2h0U2hhZG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IlRocmVlRFNoYWRvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPlRocmVlRFNoYWRvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0b3AiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50b3A8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idHJhbnNwYXJlbnQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT50cmFuc3BhcmVudDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1bHRyYS1jb25kZW5zZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51bHRyYS1jb25kZW5zZWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idWx0cmEtZXhwYW5kZWQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51bHRyYS1leHBhbmRlZDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1bmRlcmxpbmUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51bmRlcmxpbmU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXItYWxwaGEiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT51cHBlci1hbHBoYTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1cHBlci1sYXRpbiI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnVwcGVyLWxhdGluPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InVwcGVyLXJvbWFuIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXItcm9tYW48L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0idXBwZXJjYXNlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dXBwZXJjYXNlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InZpc2libGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT52aXNpYmxlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9InctcmVzaXplIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+dy1yZXNpemU8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0id2FpdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPndhaXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0id2hpdGUiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT53aGl0ZTwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ3aWRlciI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPndpZGVyPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IldpbmRvdyI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPldpbmRvdzwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJXaW5kb3dGcmFtZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPldpbmRvd0ZyYW1lPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IldpbmRvd1RleHQiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT5XaW5kb3dUZXh0PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtZmFzdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtZmFzdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4LWhpZ2giPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LWhpZ2g8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1sYXJnZSI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtbGFyZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1sb3VkIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1sb3VkPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9IngtbG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1sb3c8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieC1zbG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eC1zbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ingtc21hbGwiPgotICAgICAgICA8a2V5d29yZC12YWx1ZT54LXNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Ingtc29mdCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPngtc29mdDwva2V5d29yZC12YWx1ZT4KLSAgICA8L2tleXdvcmQtZGVmPgotICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ4eC1zbWFsbCI+Ci0gICAgICAgIDxrZXl3b3JkLXZhbHVlPnh4LXNtYWxsPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgPGtleXdvcmQtZGVmIG5hbWU9Inh4LWxhcmdlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eHgtbGFyZ2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgPC9rZXl3b3JkLWRlZj4KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0ieWVsbG93Ij4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+eWVsbG93PC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci08L2Nzcy1wcm9maWxlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYjZjMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9jc3Nwcm9maWxlLW1vYmlsZTFfMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+Ci08IS0tPCFET0NUWVBFIGNzcy1wcm9maWxlIFNZU1RFTSAiY3NzLXByb2ZpbGUuZHRkIiA+LS0+Ci08Y3NzLXByb2ZpbGU+Ci0JPHByb2ZpbGUtaW1wb3J0IG5hbWU9ImNzc3Byb2ZpbGUtY3NzMi54bWwiLz4KLQk8c3R5bGVzaGVldC1kZWY+Ci0JCTxkZXNjcmlwdGlvbj4lbW9iaWxlMV8wLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPC9kZXNjcmlwdGlvbj4KLQkJPGNoYXJzZXQtcnVsZS8+Ci0JCTxpbXBvcnQtcnVsZS8+Ci0JCTxtZWRpYS1ydWxlLz4KLQkJPHN0eWxlLXJ1bGUvPgotCTwvc3R5bGVzaGVldC1kZWY+Ci0KLQk8IS0tIFdoaWNoIHByb3BlcnRpZXMgY2FuIHN0eWxlIHJ1bGUgaW5jbHVkZSA/IC0tPgotCTwhLS0gdXNpbmcgIm92ZXJ3cml0ZSIgbWV0aG9kOiBvbmx5IGRpc2FibGVkIHByb3BlcnRpZXMgYXJlIHdyaXR0ZW4uIC0tPgotCi0JPHN0eWxlLXJ1bGUtZGVmIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0JCTxzZWxlY3Rvci1leHByZXNzaW9uIG5hbWU9ImNoaWxkIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8c2VsZWN0b3ItZXhwcmVzc2lvbiBuYW1lPSJhZGphY2VudCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHNlbGVjdG9yLWV4cHJlc3Npb24gbmFtZT0iYXR0cmlidXRlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImZpcnN0LWNoaWxkIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxpbmsiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwc2V1ZG8tY2xhc3MgbmFtZT0iYWN0aXZlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHNldWRvLWNsYXNzIG5hbWU9ImxhbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJhemltdXRoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWNvbGxhcHNlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iYm9yZGVyLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJib3R0b20iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjYXB0aW9uLXNpZGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjbGlwIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY29udGVudCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImNvdW50ZXItaW5jcmVtZW50IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iY291bnRlci1yZXNldCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1hZnRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImN1ZS1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJjdXJzb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJkaXJlY3Rpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbGV2YXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJlbXB0eS1jZWxscyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZvbnQtc2l6ZS1hZGp1c3QiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJmb250LXN0cmV0Y2giIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsZWZ0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibGV0dGVyLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJsaW5lLWhlaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1hcmtlci1vZmZzZXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXJrcyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im1heC1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtYXgtd2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJtaW4taGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ibWluLXdpZHRoIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3JwaGFucyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdXRsaW5lLWNvbG9yIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1zdHlsZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9Im91dGxpbmUtd2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJvdmVyZmxvdyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhZ2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGFnZS1icmVhay1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWluc2lkZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBhdXNlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGF1c2UtYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwaXRjaCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InBpdGNoLXJhbmdlIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icGxheS1kdXJpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InF1b3RlcyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InJpY2huZXNzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0icmlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzaXplIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWsiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1oZWFkZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVhay1udW1lcmFsIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3BlYWstcHVuY3R1YXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcGVlY2gtcmF0ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InN0cmVzcyIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRhYmxlLWxheW91dCIgZW5hYmxlZD0iZmFsc2UiLz4KLQkJPHByb3BlcnR5IG5hbWU9InRleHQtc2hhZG93IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idG9wIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idW5pY29kZS1iaWRpIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idm9pY2UtZmFtaWx5IiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0idm9sdW1lIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0id2lkb3dzIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0id29yZC1zcGFjaW5nIiBlbmFibGVkPSJmYWxzZSIvPgotCQk8cHJvcGVydHkgbmFtZT0iei1pbmRleCIgZW5hYmxlZD0iZmFsc2UiLz4KLQk8L3N0eWxlLXJ1bGUtZGVmPgotCi0JPCEtLSBwcm9wZXJ0eSBkZWZpbml0aW9uIC0tPgotCTwhLS0gdXNpbmcgInJlZGlmaW5lIiBtZXRob2Q6IGlmICJvdmVyd3JpdGUiIGF0dHJpYnV0ZSBpcyBzZXQgdG8KLQkiZmFsc2UiCW9yIG5vdCBzZXQsIGl0IG1lYW5zIHRoZSBub2RlIGlzIGNsZWFubHkgcmVkaWZpbmVkIC0tPgotCi0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbG9yYW5kYmFja2dyb3VuZCI+Ci0gICAgICAgIDxrZXl3b3JkIG5hbWU9InNjcm9sbCIvPgotICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJkaXNwbGF5IgotCQlpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJhbGwiIGNhdGVnb3J5PSJ2aXN1YWwiPgotCQk8a2V5d29yZCBuYW1lPSJpbmxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iYmxvY2siLz4KLQkJPGtleXdvcmQgbmFtZT0ibGlzdC1pdGVtIi8+Ci0JCTxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIKLQkJaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9ImNvbnRlbnQiPgotCQk8a2V5d29yZCBuYW1lPSJkaXNjIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImNpcmNsZSIvPgotCQk8a2V5d29yZCBuYW1lPSJzcXVhcmUiLz4KLQkJPGtleXdvcmQgbmFtZT0iZGVjaW1hbCIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1yb21hbiIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1ncmVlayIvPgotCQk8a2V5d29yZCBuYW1lPSJsb3dlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJ1cHBlci1hbHBoYSIvPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQk8cHJvcGVydHktZGVmIG5hbWU9InRleHQtYWxpZ24iCi0JCWluaGVyaXRlZD0ieWVzIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLQkJPGtleXdvcmQgbmFtZT0ibGVmdCIvPgotCQk8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotCQk8a2V5d29yZCBuYW1lPSJjZW50ZXIiLz4KLQkJPGtleXdvcmQgbmFtZT0ianVzdGlmeSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ0ZXh0LWRlY29yYXRpb24iCi0JCWluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotCQk8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InVuZGVybGluZSIvPgotCQk8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0JPC9wcm9wZXJ0eS1kZWY+Ci0JPHByb3BlcnR5LWRlZiBuYW1lPSJ2ZXJ0aWNhbC1hbGlnbiIKLQkJaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0idmlzdWFsIj4KLQkJPGtleXdvcmQgbmFtZT0iYmFzZWxpbmUiLz4KLQkJPGtleXdvcmQgbmFtZT0ic3ViIi8+Ci0JCTxrZXl3b3JkIG5hbWU9InN1cGVyIi8+Ci0JCTxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLQk8L3Byb3BlcnR5LWRlZj4KLQotCTwhLS0gY29udGFpbmVyIGRlZmluaXRpb24gOiBDb250YWluZXIgaXMgdGhlIGx1bXAgb2YgdmFsdWVzLgotCUl0IGNhbiBiZSB1c2VkIGxpa2UgbWFjcm9zLiAtLT4KLQk8Y29udGFpbmVyLWRlZiBuYW1lPSJjb2xvciIgb3ZlcndyaXRlPSJ0cnVlIj4KLQkJPGNvbnRhaW5lciBuYW1lPSJzeXN0ZW0tY29sb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0JPC9jb250YWluZXItZGVmPgotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtd2FwLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS13YXAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDFiY2EzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS13YXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjE4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPCEtLTwhRE9DVFlQRSBjc3MtcHJvZmlsZSBTWVNURU0gImNzcy1wcm9maWxlLmR0ZCIgPi0tPgotPGNzcy1wcm9maWxlPgotICAgICAgICA8cHJvZmlsZS1pbXBvcnQgbmFtZT0iY3NzcHJvZmlsZS1jc3MyLnhtbCIvPgotICAgICAgICA8c3R5bGVzaGVldC1kZWY+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0aW9uPiV3YXAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb248L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgICAgIDxjaGFyc2V0LXJ1bGUvPgotICAgICAgICAgICAgICAgIDxpbXBvcnQtcnVsZS8+Ci0gICAgICAgICAgICAgICAgPG1lZGlhLXJ1bGUvPgotICAgICAgICAgICAgICAgIDxzdHlsZS1ydWxlLz4KLSAgICAgICAgPC9zdHlsZXNoZWV0LWRlZj4KLQotICAgICAgICA8IS0tIFdoaWNoIHByb3BlcnRpZXMgY2FuIHN0eWxlIHJ1bGUgaW5jbHVkZSA/IC0tPgotICAgICAgICA8IS0tIHVzaW5nICJvdmVyd3JpdGUiIG1ldGhvZDogb25seSBkaXNhYmxlZCBwcm9wZXJ0aWVzIGFyZSB3cml0dGVuLiAtLT4KLQotICAgICAgICA8c3R5bGUtcnVsZS1kZWYgb3ZlcndyaXRlPSJ0cnVlIj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXppbXV0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm9yZGVyLWNvbGxhcHNlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJib3JkZXItc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYm90dG9tIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYXB0aW9uLXNpZGUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsaXAiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNvbnRlbnQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImN1ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iY3VlLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdWUtYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjdXJzb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRpcmVjdGlvbiIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWxldmF0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbXB0eS1jZWxscyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9udC1zaXplLWFkanVzdCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9udC1zdHJldGNoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZWZ0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsZXR0ZXItc3BhY2luZyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibGluZS1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hcmtlci1vZmZzZXQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hcmtzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgtaGVpZ2h0IiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgtd2lkdGgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1pbi1oZWlnaHQiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1pbi13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3JwaGFucyIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0bGluZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1jb2xvciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0bGluZS1zdHlsZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3V0bGluZS13aWR0aCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3ZlcmZsb3ciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhZ2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYWZ0ZXIiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhZ2UtYnJlYWstYmVmb3JlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYWdlLWJyZWFrLWluc2lkZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGF1c2UiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBhdXNlLWFmdGVyIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXVzZS1iZWZvcmUiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBpdGNoIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaXRjaC1yYW5nZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0icGxheS1kdXJpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InBvc2l0aW9uIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJxdW90ZXMiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InJpY2huZXNzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJyaWdodCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2l6ZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BlYWsiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwZWFrLWhlYWRlciIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BlYWstbnVtZXJhbCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic3BlYWstcHVuY3R1YXRpb24iIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNwZWVjaC1yYXRlIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzdHJlc3MiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhYmxlLWxheW91dCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dC1zaGFkb3ciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRvcCIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idW5pY29kZS1iaWRpIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2b2ljZS1mYW1pbHkiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InZvbHVtZSIgZW5hYmxlZD0iZmFsc2UiLz4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0id2lkb3dzIiBlbmFibGVkPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3b3JkLXNwYWNpbmciIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InotaW5kZXgiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1zdHlsZSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLW1hcnF1ZWUtbG9vcCIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLW1hcnF1ZWUtZGlyIi8+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Ii13YXAtbWFycXVlZS1zcGVlZCIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLWFjY2Vzc2tleSIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLWlucHV0LWZvcm1hdCIvPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSItd2FwLWlucHV0LXJlcXVpcmVkIi8+Ci0gICAgICAgIDwvc3R5bGUtcnVsZS1kZWY+Ci0KLSAgICAgICAgPCEtLSBwcm9wZXJ0eSBkZWZpbml0aW9uIC0tPgotICAgICAgICA8IS0tIHVzaW5nICJyZWRpZmluZSIgbWV0aG9kOiBpZiAib3ZlcndyaXRlIiBhdHRyaWJ1dGUgaXMgc2V0IHRvCi0gICAgICAgICJmYWxzZSIgb3Igbm90IHNldCwgaXQgbWVhbnMgdGhlIG5vZGUgaXMgY2xlYW5seSByZWRpZmluZWQgLS0+Ci0KLSAgICAgICAgPHByb3BlcnR5LWRlZiBuYW1lPSJkaXNwbGF5IgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9ImFsbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5saW5lIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYmxvY2siLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsaXN0LWl0ZW0iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSItd2FwLW1hcnF1ZWUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgICAgICA8cHJvcGVydHktZGVmIG5hbWU9Imxpc3Qtc3R5bGUtdHlwZSIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9InllcyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0iY29udGVudCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZGlzYyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNpcmNsZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNxdWFyZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImRlY2ltYWwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsb3dlci1yb21hbiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InVwcGVyLXJvbWFuIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibG93ZXItYWxwaGEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ1cHBlci1hbHBoYSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vbmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgICAgICA8cHJvcGVydHktZGVmIG5hbWU9InRleHQtYWxpZ24iCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJ5ZXMiIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InRleHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxlZnQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyaWdodCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNlbnRlciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Imp1c3RpZnkiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgICAgICA8cHJvcGVydHktZGVmIG5hbWU9InRleHQtZGVjb3JhdGlvbiIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ0ZXh0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJub25lIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idW5kZXJsaW5lIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYmxpbmsiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgICAgICA8cHJvcGVydHktZGVmIG5hbWU9InZlcnRpY2FsLWFsaWduIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9InZpc3VhbCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYmFzZWxpbmUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzdWIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzdXBlciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InRvcCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im1pZGRsZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImJvdHRvbSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUtc3R5bGUiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzY3JvbGwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzbGlkZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImFsdGVybmF0ZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0gICAgPHByb3BlcnR5LWRlZiBuYW1lPSItd2FwLW1hcnF1ZWUtbG9vcCIKLSAgICAgICAgICAgICAgICBpbmhlcml0ZWQ9Im5vIiBtZWRpYWdyb3VwPSJ2aXN1YWwiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxudW1iZXIgbmFtZT0iaW50ZWdlciIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluZmluaXRlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtbWFycXVlZS1kaXIiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0idmlzdWFsIiBjYXRlZ29yeT0id2FwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsdHIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJydGwiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlLXNwZWVkIgotICAgICAgICAgICAgICAgIGluaGVyaXRlZD0ibm8iIG1lZGlhZ3JvdXA9InZpc3VhbCIgY2F0ZWdvcnk9IndhcCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic2xvdyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im5vcm1hbCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImZhc3QiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1hY2Nlc3NrZXkiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ia2V5Y29tYmluYXRpb24iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJpbmhlcml0Ii8+Ci0gICAgICAgIDwvcHJvcGVydHktZGVmPgotICAgIDxwcm9wZXJ0eS1kZWYgbmFtZT0iLXdhcC1pbnB1dC1mb3JtYXQiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iZm9ybWF0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iaW5oZXJpdCIvPgotICAgICAgICA8L3Byb3BlcnR5LWRlZj4KLSAgICA8cHJvcGVydHktZGVmIG5hbWU9Ii13YXAtaW5wdXQtcmVxdWlyZWQiCi0gICAgICAgICAgICAgICAgaW5oZXJpdGVkPSJubyIgbWVkaWFncm91cD0iaW50ZXJhY3RpdmUiIGNhdGVnb3J5PSJ3YXAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InRydWUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmYWxzZSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImluaGVyaXQiLz4KLSAgICAgICAgPC9wcm9wZXJ0eS1kZWY+Ci0KLSAgICAgICAgPCEtLSBjb250YWluZXIgZGVmaW5pdGlvbiA6IENvbnRhaW5lciBpcyB0aGUgbHVtcCBvZiB2YWx1ZXMuCi0gICAgICAgIEl0IGNhbiBiZSB1c2VkIGxpa2UgbWFjcm9zLiAtLT4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iY29sb3IiIG92ZXJ3cml0ZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJzeXN0ZW0tY29sb3IiIGVuYWJsZWQ9ImZhbHNlIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iZm9ybWF0Ij4KLSAgICAgICAgICAgICAgICA8c3RyaW5nIG5hbWU9ImFueSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImtleWNvbWJpbmF0aW9uIj4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImtleSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Ii0iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNwYWNlIi8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJzcGVjaWFsa2V5Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ic3BlY2lhbGtleSI+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJtb2RpZmllcmtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iZnVuY3Rpb25rZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9Im5hdmlnYXRpb25rZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImVkaXRrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9Im1pc2NrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InZvbHVtZWNvbnRyb2xrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImFwcGxpY2F0aW9ua2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJwaG9uZWtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0idmVuZG9ya2V5Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0ibW9kaWZpZXJrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImFjY2Vzc2tleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0iY21ka2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJvcHRrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9ImN0cmxrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9InNoaWZ0a2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGNvbnRhaW5lciBuYW1lPSJhbHRrZXkiLz4KLSAgICAgICAgICAgICAgICA8Y29udGFpbmVyIG5hbWU9IndpbmtleSIvPgotICAgICAgICAgICAgICAgIDxjb250YWluZXIgbmFtZT0ibWV0YWtleSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImZuIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZmNuIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY2FwcyIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImNtZGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY21kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmNtZCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxjbWQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJvcHRrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im9wdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJvcHQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsb3B0Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iY3RybGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iY3RybCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJjdHJsIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibGN0cmwiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJzaGlmdGtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic2hpZnQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyc2hpZnQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsc2hpZnQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJhbHRrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImFsdCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJhbHQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsYWx0Ii8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0id2lua2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ3aW4iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJyd2luIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibHdpbiIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9Im1ldGFrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9Im1ldGEiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJybWV0YSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImxtZXRhIi8+Ci0gICAgICAgIDwvY29udGFpbmVyLWRlZj4KLSAgICAgICAgPGNvbnRhaW5lci1kZWYgbmFtZT0iZnVuY3Rpb25rZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYxIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmMyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmNiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImY3Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZjgiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJmOSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYxMCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYxMSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYxMiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYxMyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYxNCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImYxNSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9Im5hdmlnYXRpb25rZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InRhYiIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImVzYyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImVudGVyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmV0dXJuIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibWVudSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImhlbHAiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJuYW1lbWVudSIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InJjbCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InNuZCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImFycm93a2V5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGFnZWtleSIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImFycm93a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJ1cCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImRvd24iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJsZWZ0Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icmlnaHQiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJwYWdla2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJob21lIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iZW5kIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGd1cCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBnZG4iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJlZGl0a2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJicyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImRlbCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImlucyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InVuZG8iLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjdXQiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjb3B5Ii8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGFzdGUiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJjbHIiLz4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJzdG8iLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJtaXNja2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJwcnRzYyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InN5c3JxIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ic2NybG9jayIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBhdXNlIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0iYnJrIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibnVtbG9jayIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InB3ciIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InZvbHVtZWNvbnRyb2xrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InZvbHVtZXVwIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idm9sdW1lZG93biIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9ImFwcGxpY2F0aW9ua2V5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZCBuYW1lPSJtZW1vIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idG9kbyIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImNhbGVuZGFyIi8+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0ibWFpbCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9ImFkZHJlc3MiLz4KLSAgICAgICAgPC9jb250YWluZXItZGVmPgotICAgICAgICA8Y29udGFpbmVyLWRlZiBuYW1lPSJwaG9uZWtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0icGhvbmUtc2VuZCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBob25lLWVuZCIvPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkIG5hbWU9InBob25lLWFjY2VwdCIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0gICAgICAgIDxjb250YWluZXItZGVmIG5hbWU9InZlbmRvcmtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQgbmFtZT0idm5kLiIvPgotICAgICAgICA8L2NvbnRhaW5lci1kZWY+Ci0KLSAgICAgICAgPGNhdGVnb3J5LWRlZiBuYW1lPSJ3YXAiPgotICAgICAgICAgICAgICAgIDxjYXB0aW9uPiV3YXAuY2F0ZWdvcnktZGVmLndhcC5jYXB0aW9uPC9jYXB0aW9uPgotICAgICAgICA8L2NhdGVnb3J5LWRlZj4KLQotICAgICAgICA8bnVtYmVyLWRlZiBuYW1lPSJsZW5ndGgiPgotICAgICAgICA8dW5pdCBuYW1lPSJlbSIvPgotICAgICAgICA8dW5pdCBuYW1lPSJleCIvPgotICAgICAgICA8dW5pdCBuYW1lPSJweCIvPgotICAgICAgICA8L251bWJlci1kZWY+Ci0KLSAgICA8a2V5d29yZC1kZWYgbmFtZT0iLXdhcC1tYXJxdWVlIj4KLSAgICAgICAgPGtleXdvcmQtdmFsdWU+LXdhcC1tYXJxdWVlPC9rZXl3b3JkLXZhbHVlPgotICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzbGlkZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c2xpZGU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhbHRlcm5hdGUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmFsdGVybmF0ZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImluZmluaXRlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5pbmZpbml0ZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Ii0iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPi08L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzcGFjZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c3BhY2U8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhY2Nlc3NrZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmFjY2Vzc2tleTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImZuIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImZjbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZmNuPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2FwcyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y2Fwczwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImNtZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y21kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icmNtZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cmNtZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxjbWQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmxjbWQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJvcHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPm9wdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJvcHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJvcHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsb3B0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sb3B0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3RybCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Y3RybDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJjdHJsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yY3RybDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImxjdHJsIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sY3RybDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InNoaWZ0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zaGlmdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJzaGlmdCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cnNoaWZ0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibHNoaWZ0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sc2hpZnQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhbHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmFsdDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InJhbHQiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJhbHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsYWx0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5sYWx0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0id2luIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT53aW48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyd2luIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yd2luPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0ibHdpbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bHdpbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im1ldGEiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPm1ldGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJybWV0YSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cm1ldGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJsbWV0YSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bG1ldGE8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjE8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjM8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmNCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmNSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmNiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjY8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmNyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Zjc8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmOCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Zjg8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmOSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+Zjk8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTAiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxMDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxMSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjExPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjEyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJmMTMiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmYxMzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImYxNCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZjE0PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZjE1Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mMTU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ0YWIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnRhYjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImVzYyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZXNjPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZW50ZXIiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmVudGVyPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icmV0dXJuIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5yZXR1cm48L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJuYW1lbWVudSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+bmFtZW1lbnU8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJyY2wiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnJjbDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InNuZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+c25kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iYXJyb3drZXkiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmFycm93a2V5PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGFnZWtleSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGFnZWtleTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InVwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT51cDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImRvd24iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmRvd248L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJob21lIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5ob21lPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iZW5kIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5lbmQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwZ3VwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wZ3VwPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGdkbiI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGdkbjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImJzIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5iczwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImRlbCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+ZGVsPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iaW5zIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5pbnM8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ1bmRvIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT51bmRvPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY3V0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jdXQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJjb3B5Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jb3B5PC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGFzdGUiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnBhc3RlPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0iY2xyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jbHI8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJzdG8iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnN0bzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBydHNjIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wcnRzYzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InN5c3JxIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5zeXNycTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InNjcmxvY2siPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnNjcmxvY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJicmsiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPmJyazwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im51bWxvY2siPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPm51bWxvY2s8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJwd3IiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnB3cjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InZvbHVtZXVwIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT52b2x1bWV1cDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InZvbHVtZWRvd24iPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPnZvbHVtZWRvd248L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJtZW1vIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5tZW1vPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idG9kbyI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dG9kbzwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImNhbGVuZGFyIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5jYWxlbmRhcjwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9Im1haWwiPgotICAgICAgICAgICAgICAgIDxrZXl3b3JkLXZhbHVlPm1haWw8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJhZGRyZXNzIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5hZGRyZXNzPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGhvbmUtc2VuZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGhvbmUtc2VuZDwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBob25lLWVuZCI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+cGhvbmUtZW5kPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0icGhvbmUtYWNjZXB0Ij4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5waG9uZS1hY2NlcHQ8L2tleXdvcmQtdmFsdWU+Ci0gICAgICAgIDwva2V5d29yZC1kZWY+Ci0gICAgICAgIDxrZXl3b3JkLWRlZiBuYW1lPSJ2bmQuIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT52bmQuPC9rZXl3b3JkLXZhbHVlPgotICAgICAgICA8L2tleXdvcmQtZGVmPgotICAgICAgICA8a2V5d29yZC1kZWYgbmFtZT0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgPGtleXdvcmQtdmFsdWU+dHJ1ZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5mYWxzZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLSAgICAgICAgPGtleXdvcmQtZGVmIG5hbWU9InBhdXNlIj4KLSAgICAgICAgICAgICAgICA8a2V5d29yZC12YWx1ZT5wYXVzZTwva2V5d29yZC12YWx1ZT4KLSAgICAgICAgPC9rZXl3b3JkLWRlZj4KLQotPC9jc3MtcHJvZmlsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9jc3Nwcm9maWxlL2Nzc3Byb2ZpbGUucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDdlMzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvY3NzcHJvZmlsZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgY3NzcHJvZmlsZS1jc3MxLnhtbAotY3NzMS5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1DYXNjYWRpbmcgU3R5bGUgU2hlZXRzLCBsZXZlbCAxCi1jc3MxLmNhdGVnb3J5LWRlZi5ib3guY2FwdGlvbj1Cb3ggbW9kZWwKLWNzczEuY2F0ZWdvcnktZGVmLmNvbG9yYW5kYmFja2dyb3VuZC5jYXB0aW9uPUNvbG9ycyBhbmQgQmFja2dyb3VuZHMKLWNzczEuY2F0ZWdvcnktZGVmLmNsYXNzaWZpY2F0aW9uLmNhcHRpb249Q2xhc3NpZmljYXRpb24KLWNzczEuY2F0ZWdvcnktZGVmLmZvbnQuY2FwdGlvbj1Gb250Ci1jc3MxLmNhdGVnb3J5LWRlZi50ZXh0LmNhcHRpb249VGV4dAotIyBjc3Nwcm9maWxlLWNzczIueG1sCi1jc3MyLnN0eWxlc2hlZXQtZGVmLmRlc2NyaXB0aW9uPUNhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDIKLWNzczIuY2F0ZWdvcnktZGVmLmF1cmFsLmNhcHRpb249QXVyYWwKLWNzczIuY2F0ZWdvcnktZGVmLmJveC5jYXB0aW9uPUJveCBtb2RlbAotY3NzMi5jYXRlZ29yeS1kZWYuY29sb3JhbmRiYWNrZ3JvdW5kLmNhcHRpb249Q29sb3JzIGFuZCBCYWNrZ3JvdW5kcwotY3NzMi5jYXRlZ29yeS1kZWYuY29udGVudC5jYXB0aW9uPUdlbmVyYXRlZCBjb250ZW50L0xpc3QKLWNzczIuY2F0ZWdvcnktZGVmLmZvbnQuY2FwdGlvbj1Gb250cwotY3NzMi5jYXRlZ29yeS1kZWYucGFnZS5jYXB0aW9uPVBhZ2VkIG1lZGlhCi1jc3MyLmNhdGVnb3J5LWRlZi50YWJsZXMuY2FwdGlvbj1UYWJsZXMKLWNzczIuY2F0ZWdvcnktZGVmLnRleHQuY2FwdGlvbj1UZXh0Ci1jc3MyLmNhdGVnb3J5LWRlZi52aXN1YWwuY2FwdGlvbj1WaXN1YWwKLWNzczIuY2F0ZWdvcnktZGVmLnVpLmNhcHRpb249VXNlciBpbnRlcmZhY2UKLSMgY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sCi1tb2JpbGUxXzAuc3R5bGVzaGVldC1kZWYuZGVzY3JpcHRpb249Q1NTIE1vYmlsZSBQcm9maWxlIDEuMAotIyBjc3Nwcm9maWxlLXdhcC54bWwKLXdhcC5zdHlsZXNoZWV0LWRlZi5kZXNjcmlwdGlvbj1XQ1NTIDEuMAotd2FwLmNhdGVnb3J5LWRlZi53YXAuY2FwdGlvbj1XQ1NTIEV4dGVuc2lvbnMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL2Nzc3Byb2ZpbGUvZGVzY3JpcHRpb24udHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9kZXNjcmlwdGlvbi50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMzFmMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvY3NzcHJvZmlsZS9kZXNjcmlwdGlvbi50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotCi0gKiBOb25lIG9mIHRoZSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSAKLSAqIG5lZWQgdG8gYmUgdHJhbnNsYXRlZCAKLSAqIGV4Y2VwdCBmb3IgY3NzcHJvZmlsZS5wcm9wZXJ0aWVzCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTI3YWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBDU1MgTW9kZWwKLWNzc3Byb2ZpbGVfY3NzMi5uYW1lPUNTUzI6IENhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDIKLWNzc3Byb2ZpbGVfY3NzMS5uYW1lPUNTUzE6IENhc2NhZGluZyBTdHlsZSBTaGVldHMsIGxldmVsIDEKLWNzc3Byb2ZpbGVfbW9iaWxlMV8wLm5hbWU9Q1NTIE1vYmlsZSBQcm9maWxlIDEuMAotY3NzcHJvZmlsZV93YXAubmFtZT1XQ1NTIDEuMAotU3RydWN0dXJlZF9DU1NfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIENTUyBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotQ1NTX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUNTUwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YzdjZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNzc3Byb2ZpbGUiPgotCQk8cHJvZmlsZQotCQkJbmFtZT0iJWNzc3Byb2ZpbGVfY3NzMi5uYW1lIgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCXVyaT0iY3NzcHJvZmlsZS9jc3Nwcm9maWxlLWNzczIueG1sIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nwcm9maWxlLmNzczIiPgotCQk8L3Byb2ZpbGU+Ci0JCTxwcm9maWxlCi0JCQluYW1lPSIlY3NzcHJvZmlsZV9jc3MxLm5hbWUiCi0JCQl1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1jc3MxLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS5jc3MxIj4KLQkJPC9wcm9maWxlPgotCQk8cHJvZmlsZQotCQkJbmFtZT0iJWNzc3Byb2ZpbGVfbW9iaWxlMV8wLm5hbWUiCi0JCQl1cmk9ImNzc3Byb2ZpbGUvY3NzcHJvZmlsZS1tb2JpbGUxXzAueG1sIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nwcm9maWxlLm1vYmlsZTFfMCI+Ci0JCTwvcHJvZmlsZT4KLQkJPHByb2ZpbGUKLQkJCW5hbWU9IiVjc3Nwcm9maWxlX3dhcC5uYW1lIgotCQkJdXJpPSJjc3Nwcm9maWxlL2Nzc3Byb2ZpbGUtd2FwLnhtbCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3NzcHJvZmlsZS53YXAiPgotCQk8L3Byb2ZpbGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yQ1NTIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGFza3MuQ1NTRmlsZVRhc2tTY2FubmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50YXNrcy5DU1NGaWxlVGFza1NjYW5uZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfQ1NTX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImNzcyI+Ci0JCTwvZmlsZVR5cGVzPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JDU1MiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJjc3MiCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVDU1NfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQlpZD0iY3Nzc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUudGV4dCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9yQ1NTIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBjc3MgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NzYxYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IENTUyBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFlvdV9jYW5ub3RfdXNlX0NTU1N0eWxlU2hlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMWNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzJjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8zY29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNGNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzI1Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMjZjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF8yN2NvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzI4Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfNWNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgXzZjb25jYXRfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF83Y29uY2F0X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfOGNvbmNhdF9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZzsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBDU1NDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvQ1NTQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2OTMyMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENTU0NvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENTU0NvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvLyBsaXN0ZW4gZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcyBrZXlzCi0JCUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zdGFydHVwKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQkvLyBzdG9wIGxpc3Rlbm5pbmcgZm9yIHJlc291cmNlIGNoYW5nZXMgdG8gdXBkYXRlIGNvbnRlbnQgcHJvcGVydGllcwotCQkvLyBrZXlzCi0JCUNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9DU1NDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyZjU3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0NTU0NvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVlvdV9jYW5ub3RfdXNlX0NTU1N0eWxlU2hlX1VJXz1Zb3UgY2Fubm90IHVzZSBDU1NTdHlsZVNoZWV0LmdldE93bmVyUnVsZSgpIGJlY2F1c2Ugb2YgbWFueSByZWZlcmVuY2VycyBvZiB0aGlzIHJ1bGVcblBsZWFzZSB1c2UgZ2V0T253ZXJSdWxlcygpCi1fMWNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgZmxhdCBub2RlIGlzIG51bGwuCi1fMmNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgZmxhdCBub2RlIGlzIG5vdCBpbiBtb2RlbC4KLV8zY29uY2F0X0VSUk9SXz17MH1sYXN0IGZsYXQgbm9kZSBpcyBudWxsLgotXzRjb25jYXRfRVJST1JfPXswfWxhc3QgZmxhdCBub2RlIGlzIG5vdCBpbiBtb2RlbC4KLV8yNWNvbmNhdF9FUlJPUl89ezB9Zmlyc3QgcmVnaW9uIGlzIG51bGwuCi1fMjZjb25jYXRfRVJST1JfPXswfWZpcnN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuCi1fMjdjb25jYXRfRVJST1JfPXswfWxhc3QgcmVnaW9uIGlzIG51bGwuCi1fMjhjb25jYXRfRVJST1JfPXswfWxhc3QgcmVnaW9uIGlzIG5vdCBpbiBtb2RlbC4KLV81Y29uY2F0X0VSUk9SXz17MH1maXJzdCByZWdpb24gaXMgbnVsbC4KLV82Y29uY2F0X0VSUk9SXz17MH1maXJzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLgotXzdjb25jYXRfRVJST1JfPXswfWxhc3QgcmVnaW9uIGlzIG51bGwuCi1fOGNvbmNhdF9FUlJPUl89ezB9bGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLgotIwotQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nPVVwZGF0aW5nIENTUyBDb250ZW50IFNldHRpbmdzCi1DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc9UHJvYmxlbSBzYXZpbmcgQ1NTIENvbnRlbnQgU2V0dGluZ3MgZm9yIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2Q1Zjg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0JCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNDgyNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTQ2xlYW51cFN0cmF0ZWd5IHsKLQotCXN0YXRpYyBmaW5hbCBzaG9ydCBBU0lTID0gMDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgTE9XRVIgPSAxOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUFBFUiA9IDI7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0SWRlbnRDYXNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0UHJvcE5hbWVDYXNlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0UHJvcFZhbHVlQ2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXNob3J0IGdldFNlbGVjdG9yVGFnQ2FzZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc0Zvcm1hdFNvdXJjZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBpc1F1b3RlVmFsdWVzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZm9ybWF0U291cmNlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkZW50Q2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQl2b2lkIHNldElkZW50Q2FzZShzaG9ydCBpZGVudENhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BOYW1lQ2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQl2b2lkIHNldFByb3BOYW1lQ2FzZShzaG9ydCBwcm9wTmFtZUNhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BWYWx1ZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRQcm9wVmFsdWVDYXNlKHNob3J0IHByb3BWYWx1ZUNhc2UpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHF1b3RlVmFsdWVzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0Jdm9pZCBzZXRRdW90ZVZhbHVlcyhib29sZWFuIHF1b3RlVmFsdWVzKTsKLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RvclRhZ0Nhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0Jdm9pZCBzZXRTZWxlY3RvclRhZ0Nhc2Uoc2hvcnQgc2VsZWN0b3JUYWdDYXNlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NTU0NsZWFudXBTdHJhdGVneUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZlM2U2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCBpbXBsZW1lbnRzIENTU0NsZWFudXBTdHJhdGVneSB7Ci0KLQlzdGF0aWMgcHJpdmF0ZSBDU1NDbGVhbnVwU3RyYXRlZ3kgaW5zdGFuY2UgPSBudWxsOwotCS8vIGluaXRpYWxpemUgd2l0aCBkZWZhdWx0cwotCXByb3RlY3RlZCBzaG9ydCBmSWRlbnRDYXNlID0gQVNJUzsKLQlwcm90ZWN0ZWQgc2hvcnQgZlByb3BOYW1lQ2FzZSA9IEFTSVM7Ci0JcHJvdGVjdGVkIHNob3J0IGZQcm9wVmFsdWVDYXNlID0gQVNJUzsKLQlwcm90ZWN0ZWQgc2hvcnQgZlNlbGVjdG9yVGFnQ2FzZSA9IFVQUEVSOwotCXByb3RlY3RlZCBib29sZWFuIGZRdW90ZVZhbHVlcyA9IHRydWU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkZvcm1hdFNvdXJjZSA9IHRydWU7Ci0KLQkvKioKLQkgKiBDU1NDbGVhbnVwU3RyYXRlZ3lJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIENTU0NsZWFudXBTdHJhdGVneUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldElkZW50Q2FzZSgpIHsKLQkJcmV0dXJuIGZJZGVudENhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NDbGVhbnVwU3RyYXRlZ3kgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRQcm9wTmFtZUNhc2UoKSB7Ci0JCXJldHVybiBmUHJvcE5hbWVDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0UHJvcFZhbHVlQ2FzZSgpIHsKLQkJcmV0dXJuIGZQcm9wVmFsdWVDYXNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0U2VsZWN0b3JUYWdDYXNlKCkgewotCQlyZXR1cm4gZlNlbGVjdG9yVGFnQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlmSWRlbnRDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUikpOwotCQlmUHJvcE5hbWVDYXNlID0gZ2V0Q2xlYW51cENhc2VWYWx1ZShwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSkpOwotCQlmUHJvcFZhbHVlQ2FzZSA9IGdldENsZWFudXBDYXNlVmFsdWUocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1BST1BFUlRZX1ZBTFVFKSk7Ci0JCWZTZWxlY3RvclRhZ0Nhc2UgPSBnZXRDbGVhbnVwQ2FzZVZhbHVlKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9TRUxFQ1RPUikpOwotCQlmUXVvdGVWYWx1ZXMgPSBwcmVmcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpOwotCQlmRm9ybWF0U291cmNlID0gcHJlZnMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgQ1NTQ2xlYW51cFN0cmF0ZWd5IGVxdWl2YWxlbnQgY2FzZSBzaG9ydCB2YWx1ZSB3aGVuIGdpdmVuIGFuCi0JICogaW50Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogQHJldHVybiBlcXVpdmFsZW50IGNhc2Ugc2hvcnQgb3IgQVNJUyBpZiBjYW5ub3QgYmUgZGV0ZXJtaW5lZAotCSAqLwotCXByaXZhdGUgc2hvcnQgZ2V0Q2xlYW51cENhc2VWYWx1ZShpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSIDoKLQkJCQlyZXR1cm4gTE9XRVI7Ci0JCQljYXNlIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIgOgotCQkJCXJldHVybiBVUFBFUjsKLQkJfQotCQlyZXR1cm4gQVNJUzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Zvcm1hdFNvdXJjZSgpIHsKLQkJcmV0dXJuIGZGb3JtYXRTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNRdW90ZVZhbHVlcygpIHsKLQkJcmV0dXJuIGZRdW90ZVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZm9ybWF0U291cmNlCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9ybWF0U291cmNlKGJvb2xlYW4gZm9ybWF0U291cmNlKSB7Ci0JCWZGb3JtYXRTb3VyY2UgPSBmb3JtYXRTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGlkZW50Q2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZGVudENhc2Uoc2hvcnQgaWRlbnRDYXNlKSB7Ci0JCWZJZGVudENhc2UgPSBpZGVudENhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BOYW1lQ2FzZQotCSAqICAgICAgICAgICAgc2hvcnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wTmFtZUNhc2Uoc2hvcnQgcHJvcE5hbWVDYXNlKSB7Ci0JCWZQcm9wTmFtZUNhc2UgPSBwcm9wTmFtZUNhc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHByb3BWYWx1ZUNhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcFZhbHVlQ2FzZShzaG9ydCBwcm9wVmFsdWVDYXNlKSB7Ci0JCWZQcm9wVmFsdWVDYXNlID0gcHJvcFZhbHVlQ2FzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcXVvdGVWYWx1ZXMKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZVZhbHVlcyhib29sZWFuIHF1b3RlVmFsdWVzKSB7Ci0JCWZRdW90ZVZhbHVlcyA9IHF1b3RlVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RvclRhZ0Nhc2UKLQkgKiAgICAgICAgICAgIHNob3J0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JUYWdDYXNlKHNob3J0IHNlbGVjdG9yVGFnQ2FzZSkgewotCQlmU2VsZWN0b3JUYWdDYXNlID0gc2VsZWN0b3JUYWdDYXNlOwotCX0KLQotCS8vIFRPRE86IGEgc2F2ZU9wdGlvbnMgc2hvdWxkIGJlIGFkZGVkIHRvIENTU0NsZWFudXBTdHJhdGVneSBpbnRlcmZhY2UKLQlwdWJsaWMgdm9pZCBzYXZlT3B0aW9ucygpIHsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9JREVOVElGSUVSLCBmSWRlbnRDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FLCBmUHJvcE5hbWVDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQ0FTRV9QUk9QRVJUWV9WQUxVRSwgZlByb3BWYWx1ZUNhc2UpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1NFTEVDVE9SLCBmU2VsZWN0b3JUYWdDYXNlKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCBmUXVvdGVWYWx1ZXMpOwotCQlDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSwgZkZvcm1hdFNvdXJjZSk7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0ODA3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NGb3JtYXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cFByb2Nlc3NvckNTUyBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCi0JcHVibGljIHZvaWQgY2xlYW51cE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJQ1NTRm9ybWF0VXRpbCBmb3JtYXRVdGlsID0gQ1NTRm9ybWF0VXRpbC5nZXRJbnN0YW5jZSgpOwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gKChJQ1NTTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBkb2MpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IGZvcm1hdHRlci5jbGVhbnVwKGRvYyk7Ci0JCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGRvYykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBkb2MpLmdldEVuZE9mZnNldCgpOwotCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShkb2MuZ2V0TW9kZWwoKSwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlMaXN0IGNzc25vZGVzID0gZm9ybWF0VXRpbC5jb2xsZWN0Q1NTTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJCWlmIChjc3Nub2RlcyAhPSBudWxsICYmICFjc3Nub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3Nzbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgY3Nzbm9kZXMuZ2V0KGkpOwotCQkJCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgbm9kZSk7Ci0JCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuY2xlYW51cChub2RlKTsKLQkJCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkJCQkJbW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkJfQotCQkJCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKG1vZGVsLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCi0JCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gc2hvdWxkIGltcGxlbWVudCwgb3IgZGVsZXRlPwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBUT0RPIHNob3VsZCBpbXBsZW1lbnQsIG9yIGRlbGV0ZT8KLQotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZ2V0Rm9ybWF0UHJvY2Vzc29yKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JTWVkaWFHcm91cElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9JTWVkaWFHcm91cElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMDJhYzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSU1lZGlhR3JvdXBJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTWVkaWFHcm91cElEIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fUEFHRUQgPSAicGFnZWQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1ZJU1VBTCA9ICJ2aXN1YWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BVVJBTCA9ICJhdXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNX1RBQ1RJTEUgPSAidGFjdGlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fR1JJRCA9ICJncmlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQklUTUFQID0gImJpdG1hcCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1fSU5URVJBQ1RJVkUgPSAiaW50ZXJhY3RpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9TVEFUSUMgPSAic3RhdGljIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTV9BTEwgPSAiYWxsIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0lWYWxJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVZhbElELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWMxYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSVZhbElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVmFsSUQgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl8xMDAgPSAiMTAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfMjAwID0gIjIwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzMwMCA9ICIzMDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl80MDAgPSAiNDAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfNTAwID0gIjUwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzYwMCA9ICI2MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl83MDAgPSAiNzAwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfODAwID0gIjgwMCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWXzkwMCA9ICI5MDAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BQk9WRSA9ICJhYm92ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FCU09MVVRFID0gImFic29sdXRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQUNUSVZFQk9SREVSID0gIkFjdGl2ZUJvcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FDVElWRUNBUFRJT04gPSAiQWN0aXZlQ2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9BTFdBWVMgPSAiYWx3YXlzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVBQV09SS1NQQUNFID0gIkFwcFdvcmtzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FRVUEgPSAiYXF1YSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0FSTUVOSUFOID0gImFybWVuaWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVVUTyA9ICJhdXRvIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQVZPSUQgPSAiYXZvaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CQUNLR1JPVU5EID0gIkJhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JFSElORCA9ICJiZWhpbmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CRUxPVyA9ICJiZWxvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JJRElfT1ZFUlJJREUgPSAiYmlkaS1vdmVycmlkZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMQUNLID0gImJsYWNrIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQkxJTksgPSAiYmxpbmsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CTE9DSyA9ICJibG9jayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JMVUUgPSAiYmx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPTEQgPSAiYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JPTERFUiA9ICJib2xkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT1RIID0gImJvdGgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9ORkFDRSA9ICJCdXR0b25GYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQlVUVE9OSElHSExJR0hUID0gIkJ1dHRvbkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0JVVFRPTlNIQURPVyA9ICJCdXR0b25TaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9CVVRUT05URVhUID0gIkJ1dHRvblRleHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBJVEFMSVpFID0gImNhcGl0YWxpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBUSU9OID0gImNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DQVBUSU9OVEVYVCA9ICJDYXB0aW9uVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DRU5URVJfTEVGVCA9ICJjZW50ZXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NFTlRFUl9SSUdIVCA9ICJjZW50ZXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NJUkNMRSA9ICJjaXJjbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DSktfSURFT0dSQVBISUMgPSAiY2prLWlkZW9ncmFwaGljIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ0xPU0VfUVVPVEUgPSAiY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT0RFID0gImNvZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT05ERU5TRUQgPSAiY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfQ09MTEFQU0UgPSAiY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT01QQUNUID0gImNvbXBhY3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DT05USU5VT1VTID0gImNvbnRpbnVvdXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DUk9QID0gImNyb3AiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DUk9TUyA9ICJjcm9zcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0NST1NTSEFJUiA9ICJjcm9zc2hhaXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9DVVJTSVZFID0gImN1cnNpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9EQVNIRUQgPSAiZGFzaGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREVDSU1BTCA9ICJkZWNpbWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfREVDSU1BTF9MRUFESU5HX1pFUk8gPSAiZGVjaW1hbC1sZWFkaW5nLXplcm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ESUdJVFMgPSAiZGlnaXRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRElTQyA9ICJkaXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRE9UVEVEID0gImRvdHRlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0RPVUJMRSA9ICJkb3VibGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FX1JFU0laRSA9ICJlLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0VNQkVEID0gImVtYmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRVhQQU5ERUQgPSAiZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9FWFRSQV9DT05ERU5TRUQgPSAiZXh0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRVhUUkFfRVhQQU5ERUQgPSAiZXh0cmEtZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQU5UQVNZID0gImZhbnRhc3kiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVJfTEVGVCA9ICJmYXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZBUl9SSUdIVCA9ICJmYXItcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVNUID0gImZhc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9GQVNURVIgPSAiZmFzdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRkVNQUxFID0gImZlbWFsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0ZJWEVEID0gImZpeGVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfRlVDSFNJQSA9ICJmdWNoc2lhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR0VPUkdJQU4gPSAiZ2VvcmdpYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUkFZID0gImdyYXkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9HUkFZVEVYVCA9ICJHcmF5VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0dSRUVOID0gImdyZWVuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfR1JPT1ZFID0gImdyb292ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hFQlJFVyA9ICJoZWJyZXciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9IRUxQID0gImhlbHAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISURERU4gPSAiaGlkZGVuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElERSA9ICJoaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSCA9ICJoaWdoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSElHSExJR0hUID0gIkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0hMSUdIVFRFWFQgPSAiSGlnaGxpZ2h0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJR0hFUiA9ICJoaWdoZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9ISVJBR0FOQSA9ICJoaXJhZ2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0hJUkFHQU5BX0lST0hBID0gImhpcmFnYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSUNPTiA9ICJpY29uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5BQ1RJVkVCT1JERVIgPSAiSW5hY3RpdmVCb3JkZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkFDVElWRUNBUFRJT04gPSAiSW5hY3RpdmVDYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5BQ1RJVkVDQVBUSU9OVEVYVCA9ICJJbmFjdGl2ZUNhcHRpb25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5GT0JBQ0tHUk9VTkQgPSAiSW5mb0JhY2tncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkZPVEVYVCA9ICJJbmZvVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lOTElORSA9ICJpbmxpbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTkxJTkVfVEFCTEUgPSAiaW5saW5lLXRhYmxlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5TRVQgPSAiaW5zZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9JTlNJREUgPSAiaW5zaWRlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfSU5WRVJUID0gImludmVydCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0lUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9KVVNUSUZZID0gImp1c3RpZnkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9LQVRBS0FOQSA9ICJrYXRha2FuYSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0tBVEFLQU5BX0lST0hBID0gImthdGFrYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEFORFNDQVBFID0gImxhbmRzY2FwZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xBUkdFID0gImxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEFSR0VSID0gImxhcmdlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFRlQgPSAibGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xFRlRfU0lERSA9ICJsZWZ0LXNpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MRUZUV0FSRFMgPSAibGVmdHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTEVWRUwgPSAibGV2ZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MSUdIVEVSID0gImxpZ2h0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MSU1FID0gImxpbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MSU5FX1RIUk9VR0ggPSAibGluZS10aHJvdWdoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTElTVF9JVEVNID0gImxpc3QtaXRlbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPVUQgPSAibG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPVyA9ICJsb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUiA9ICJsb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX0FMUEhBID0gImxvd2VyLWFscGhhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJfR1JFRUsgPSAibG93ZXItZ3JlZWsiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9MT1dFUl9MQVRJTiA9ICJsb3dlci1sYXRpbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xPV0VSX1JPTUFOID0gImxvd2VyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTE9XRVJDQVNFID0gImxvd2VyY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX0xUUiA9ICJsdHIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NQUxFID0gIm1hbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NQVJLRVIgPSAibWFya2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUFST09OID0gIm1hcm9vbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01FRElVTSA9ICJtZWRpdW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRU5VID0gIm1lbnUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NRU5VVEVYVCA9ICJNZW51VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01FU1NBR0VfQk9YID0gIm1lc3NhZ2UtYm94IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTUlERExFID0gIm1pZGRsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX01JWCA9ICJtaXgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9NT05PU1BBQ0UgPSAibW9ub3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTU9WRSA9ICJtb3ZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTl9SRVNJWkUgPSAibi1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OQVJST1dFUiA9ICJuYXJyb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05BVlkgPSAibmF2eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05FX1JFU0laRSA9ICJuZS1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT19DTE9TRV9RVU9URSA9ICJuby1jbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PX09QRU5fUVVPVEUgPSAibm8tb3Blbi1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05PX1JFUEVBVCA9ICJuby1yZXBlYXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT05FID0gIm5vbmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9OT1JNQUwgPSAibm9ybWFsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfTk9XUkFQID0gIm5vd3JhcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX05XX1JFU0laRSA9ICJudy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PQkxJUVVFID0gIm9ibGlxdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PTElWRSA9ICJvbGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09OQ0UgPSAib25jZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09QRU5fUVVPVEUgPSAib3Blbi1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX09VVFNFVCA9ICJvdXRzZXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PVVRTSURFID0gIm91dHNpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9PVkVSTElORSA9ICJvdmVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BPSU5URVIgPSAicG9pbnRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BPUlRSQUlUID0gInBvcnRyYWl0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUFJFID0gInByZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1BVUlBMRSA9ICJwdXJwbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRUQgPSAicmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVMQVRJVkUgPSAicmVsYXRpdmUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRVBFQVQgPSAicmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUkVQRUFUX1ggPSAicmVwZWF0LXgiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SRVBFQVRfWSA9ICJyZXBlYXQteSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1JJREdFID0gInJpZGdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSUdIVF9TSURFID0gInJpZ2h0LXNpZGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SSUdIVFdBUkRTID0gInJpZ2h0d2FyZHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9SVEwgPSAicnRsIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfUlVOX0lOID0gInJ1bi1pbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NfUkVTSVpFID0gInMtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0FOU19TRVJJRiA9ICJzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0NST0xMID0gInNjcm9sbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NDUk9MTEJBUiA9ICJTY3JvbGxiYXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRV9SRVNJWkUgPSAic2UtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0VNSV9DT05ERU5TRUQgPSAic2VtaS1jb25kZW5zZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRU1JX0VYUEFOREVEID0gInNlbWktZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TRVBBUkFURSA9ICJzZXBhcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NFUklGID0gInNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0hPVyA9ICJzaG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU0lMRU5UID0gInNpbGVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NJTFZFUiA9ICJzaWx2ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTE9XID0gInNsb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTE9XRVIgPSAic2xvd2VyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU01BTEwgPSAic21hbGwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTF9DQVBTID0gInNtYWxsLWNhcHMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTF9DQVBUSU9OID0gInNtYWxsLWNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TTUFMTEVSID0gInNtYWxsZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TT0ZUID0gInNvZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TT0xJRCA9ICJzb2xpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NQRUxMX09VVCA9ICJzcGVsbC1vdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TUVVBUkUgPSAic3F1YXJlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NUQVRVU19CQVIgPSAic3RhdHVzLWJhciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NVQiA9ICJzdWIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9TVVBFUiA9ICJzdXBlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1NXX1JFU0laRSA9ICJzdy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRSA9ICJ0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NBUFRJT04gPSAidGFibGUtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NFTEwgPSAidGFibGUtY2VsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0NPTFVNTiA9ICJ0YWJsZS1jb2x1bW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9DT0xVTU5fR1JPVVAgPSAidGFibGUtY29sdW1uLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfRk9PVEVSX0dST1VQID0gInRhYmxlLWZvb3Rlci1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RBQkxFX0hFQURFUl9HUk9VUCA9ICJ0YWJsZS1oZWFkZXItZ3JvdXAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UQUJMRV9ST1cgPSAidGFibGUtcm93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEFCTEVfUk9XX0dST1VQID0gInRhYmxlLXJvdy1ncm91cCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RFQUwgPSAidGVhbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RFWFRfVE9QID0gInRleHQtdG9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVEVYVF9CT1RUT00gPSAidGV4dC1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USElDSyA9ICJ0aGljayI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RISU4gPSAidGhpbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFRERBUktTSEFET1cgPSAiVGhyZWVERGFya1NoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFREZBQ0UgPSAiVGhyZWVERmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFREhJR0hMSUdIVCA9ICJUaHJlZURIaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9USFJFRURMSUdIVFNIQURPVyA9ICJUaHJlZURMaWdodFNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1RIUkVFRFNIQURPVyA9ICJUaHJlZURTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9UT1AgPSAidG9wIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVFJBTlNQQVJFTlQgPSAidHJhbnNwYXJlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VTFRSQV9DT05ERU5TRUQgPSAidWx0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVUxUUkFfRVhQQU5ERUQgPSAidWx0cmEtZXhwYW5kZWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VTkRFUkxJTkUgPSAidW5kZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJfQUxQSEEgPSAidXBwZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9VUFBFUl9MQVRJTiA9ICJ1cHBlci1sYXRpbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1VQUEVSX1JPTUFOID0gInVwcGVyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfVVBQRVJDQVNFID0gInVwcGVyY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1ZJU0lCTEUgPSAidmlzaWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dfUkVTSVpFID0gInctcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0FJVCA9ICJ3YWl0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfV0hJVEUgPSAid2hpdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSURFUiA9ICJ3aWRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJTkRPVyA9ICJXaW5kb3ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9XSU5ET1dGUkFNRSA9ICJXaW5kb3dGcmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1dJTkRPV1RFWFQgPSAiV2luZG93VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfRkFTVCA9ICJ4LWZhc3QiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YX0hJR0ggPSAieC1oaWdoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9MQVJHRSA9ICJ4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9MT1VEID0gIngtbG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfTE9XID0gIngtbG93IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWF9TTE9XID0gIngtc2xvdyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfU01BTEwgPSAieC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hfU09GVCA9ICJ4LXNvZnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVl9YWF9TTUFMTCA9ICJ4eC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWX1hYX0xBUkdFID0gInh4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZfWUVMTE9XID0gInllbGxvdyI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDEzZjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTUNvbnRhaW5lciBleHRlbmRzIFByb3BDTU5vZGUgewotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIG5vZGVzID0gbmV3IFZlY3RvcigpOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQUJTT0xVVEVfU0laRSA9ICJhYnNvbHV0ZS1zaXplIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0JPUkRFUl9TVFlMRSA9ICJib3JkZXItc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQk9SREVSX1dJRFRIID0gImJvcmRlci13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9DT0xPUiA9ICJjb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9TWVNURU1fQ09MT1IgPSAic3lzdGVtLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0dFTkVSSUNfRkFNSUxZID0gImdlbmVyaWMtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0dFTkVSSUNfVk9JQ0UgPSAiZ2VuZXJpYy12b2ljZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9NQVJHSU5fV0lEVEggPSAibWFyZ2luLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1BBRERJTkdfV0lEVEggPSAicGFkZGluZy13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9SRUxBVElWRV9TSVpFID0gInJlbGF0aXZlLXNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01Db250YWluZXIoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JT2JqZWN0IGFwcGVuZENoaWxkKE9iamVjdCBub2RlKSB7Ci0JCWlmICghbm9kZXMuY29udGFpbnMobm9kZSkpCi0JCQlub2Rlcy5hZGQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkhhdmUoU3RyaW5nIGlkZW50aWZpZXIpIHsKLQkJaW50IG5DaGlsZCA9IGdldE51bUNoaWxkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkOyBpKyspIHsKLQkJCU9iamVjdCBjaGlsZCA9IGdldENoaWxkQXQoaSk7Ci0JCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBTdHJpbmcgJiYgaWRlbnRpZmllci5lcXVhbHNJZ25vcmVDYXNlKChTdHJpbmcpIGNoaWxkKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIFByb3BDTUNvbnRhaW5lciAmJiAoKFByb3BDTUNvbnRhaW5lcikgY2hpbGQpLmNhbkhhdmUoaWRlbnRpZmllcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0Q2hpbGRBdChpbnQgaW5kZXgpIHsKLQkJaWYgKG5vZGVzID09IG51bGwgfHwgaW5kZXggPCAwIHx8IG5vZGVzLnNpemUoKSA8PSBpbmRleCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgUHJvcENNQ29udGFpbmVyIGdldENvbnRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMjApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTUNvbnRhaW5lcikgbm9kZTsKLQotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJLy8gcmVnaXN0ZXIKLQkJCW5vZGUgPSBuZXcgUHJvcENNQ29udGFpbmVyKG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNQ29udGFpbmVyKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGlkZW50cykgewotCQlpZiAoaWRlbnRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBuQ2hpbGRyZW4gPSBub2Rlcy5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkcmVuOyBpKyspIHsKLQkJCU9iamVjdCBub2RlID0gbm9kZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBQcm9wQ01Ob2RlKQotCQkJCSgoUHJvcENNTm9kZSkgbm9kZSkuZ2V0SWRlbnRpZmllcnMoaWRlbnRzKTsKLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdHJpbmcpCi0JCQkJaWRlbnRzLmFkZChub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtQ2hpbGQoKSB7Ci0JCWlmIChub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBWQUxfQ09OVEFJTkVSOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0VmFsdWVzKENvbGxlY3Rpb24gdmFsdWVzKSB7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG5DaGlsZHJlbiA9IG5vZGVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuQ2hpbGRyZW47IGkrKykgewotCQkJT2JqZWN0IG5vZGUgPSBub2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFByb3BDTU5vZGUpCi0JCQkJKChQcm9wQ01Ob2RlKSBub2RlKS5nZXRWYWx1ZXModmFsdWVzKTsKLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLQkJCQlpZiAoIXZhbHVlcy5jb250YWlucyhub2RlKSkKLQkJCQkJdmFsdWVzLmFkZChub2RlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCU9iamVjdCByZW1vdmVDaGlsZChPYmplY3Qgbm9kZSkgewotCQlub2Rlcy5yZW1vdmUobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Gb250UHJvcGVydHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZvbnRQcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjhlMjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZvbnRQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTUZvbnRQcm9wZXJ0eSBleHRlbmRzIFByb3BDTVByb3BlcnR5IHsKLQotCS8vIHN0YXRpYyBmaWVsZHMKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBjYWNoZWRJZE1hcCA9IG51bGw7Ci0JLy8gc2VsZWN0aW5nIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX0ZBTUlMWSA9ICJmb250LWZhbWlseSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfU1RZTEUgPSAiZm9udC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfVkFSSUFOVCA9ICJmb250LXZhcmlhbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1dFSUdIVCA9ICJmb250LXdlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0ZPTlRfU1RSRVRDSCA9ICJmb250LXN0cmV0Y2giOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9GT05UX1NJWkUgPSAiZm9udC1zaXplIjsvLyROT04tTkxTLTEkCi0JLy8gcXVhbGlmaWNhdGlvbiBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfVU5JQ09ERV9SQU5HRSA9ICJ1bmljb2RlLXJhbmdlIjsvLyROT04tTkxTLTEkCi0JLy8gbnVtZXJpYyBwcm9wZXJ0aWVzCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfVU5JVFNfUEVSX0VNID0gInVuaXRzLXBlci1lbSI7Ly8kTk9OLU5MUy0xJAotCS8vIHJlZmVyZW5jaW5nIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TUkMgPSAic3JjIjsvLyROT04tTkxTLTEkCi0JLy8gbWF0Y2hpbmcgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1BBTk9TRV8xID0gInBhbm9zZS0xIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfU1RFTVYgPSAic3RlbXYiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9TVEVNSCA9ICJzdGVtaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX1NMT1BFID0gInNsb3BlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQ0FQX0hFSUdIVCA9ICJjYXAtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfWF9IRUlHSFQgPSAieC1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9BU0NFTlQgPSAiYXNjZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfREVTQ0VOVCA9ICJkZXNjZW50IjsvLyROT04tTkxTLTEkCi0JLy8gc3ludGhlc2lzIHByb3BlcnRpZXMKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9XSURUSFMgPSAid2lkdGhzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQkJPWCA9ICJiYm94IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfREVGSU5JVElPTl9TUkMgPSAiZGVmaW5pdGlvbi1zcmMiOy8vJE5PTi1OTFMtMSQKLQkvLyBhbGlnbm1lbnQgcHJvcGVydGllcwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBGX0JBU0VMSU5FID0gImJhc2VsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfQ0VOVEVSTElORSA9ICJjZW50ZXJsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEZfTUFUSExJTkUgPSAibWF0aGxpbmUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQRl9UT1BMSU5FID0gInRvcGxpbmUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01Gb250UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNRm9udFByb3BlcnR5KG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXROYW1lRW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMua2V5cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydHlFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX0ZPTlRQUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBuYW1lcygpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IG5hbWVzKE9iamVjdCBtZWRpYUdyb3VwKSB7Ci0JCWlmIChtZWRpYUdyb3VwID09IG51bGwpCi0JCQlyZXR1cm4gbmFtZXMoKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJVmVjdG9yIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJSXRlcmF0b3IgaXQgPSBpbnN0YW5jZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKHByb3AuZ2V0TWVkaWFHcm91cHMoKS5jb250YWlucyhtZWRpYUdyb3VwKSkKLQkJCQlwcm9wZXJ0aWVzLmFkZChwcm9wLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBJZiBpdGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIHByb3BlcnRpZXNGb3IoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gc2hvcnRoYW5kcykgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gaWYgaWRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy52YWx1ZXMoKSk7Ci0KLQkJaWYgKGNhY2hlZElkTWFwID09IG51bGwpIHsKLQkJCS8vIHN0YXJ0IGNhY2hlaW5nCi0JCQljYWNoZWRJZE1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBjYWNoZWQKLQkJCU9iamVjdCByZXQgPSBjYWNoZWRJZE1hcC5nZXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpKTsKLQkJCWlmIChyZXQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFZlY3RvcigoQ29sbGVjdGlvbikgcmV0KTsKLQkJfQotCi0JCS8vIGNyZWF0ZQotCQlFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzID0gZ2V0UHJvcGVydHlFbnVtKCk7Ci0JCUhhc2hTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJd2hpbGUgKHByb3BlcnRpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSAoUHJvcENNUHJvcGVydHkpIHByb3BlcnRpZXMubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghc2hvcnRoYW5kcyAmJiBwcm9wLmlzU2hvcnRoYW5kKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocHJvcC5jYW5IYXZlKGlkZW50aWZpZXIpKQotCQkJCXNldC5hZGQocHJvcCk7Ci0JCX0KLQotCQkvLyBjYWNoZQotCQljYWNoZWRJZE1hcC5wdXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpLCBzZXQpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKHNldCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZ1bmN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01GdW5jdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2VmYzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNRnVuY3Rpb24gZXh0ZW5kcyBQcm9wQ01Ob2RlIHsKLQotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgaW5zdGFuY2VzID0gbnVsbDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfQVRUUiA9ICJhdHRyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0NPVU5URVIgPSAiY291bnRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9SR0IgPSAicmdiIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1NIQVBFID0gInJlY3QiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBWQUxfVVJJID0gInVybCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTF9GT1JNQVQgPSAiZm9ybWF0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX0xPQ0FMID0gImxvY2FsIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNRnVuY3Rpb24oU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwdWJsaWMgUHJvcENNRnVuY3Rpb24gZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01GdW5jdGlvbikgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01GdW5jdGlvbihuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTUZ1bmN0aW9uKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX0ZVTkM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyYTg0ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUHJvcENNTm9kZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9JREVOVElGSUVSID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9QUk9QRVJUWSA9IDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfTlVNQkVSID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIHNob3J0IFZBTF9TVFJJTkcgPSAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0ZVTkMgPSA0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0NPTlRBSU5FUiA9IDU7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfU1VCUFJPUEVSVFkgPSA2OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgc2hvcnQgVkFMX0ZPTlRQUk9QRVJUWSA9IDc7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBzaG9ydCBWQUxfVU5JQ09ERV9SQU5HRSA9IDg7Ci0JcHJvdGVjdGVkIGphdmEubGFuZy5TdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgc2hvcnQgTE9BRElORyA9IDA7IC8vIDAgOiBub3QgaW5pdGlhbGl6ZWQsIDEgOiB1bmRlcgotCQkJCQkJCQkJCS8vIGluaXRpYWxpemluZywgMiA6IGluaXRpYWxpemUtZG9uZQotCQkJCQkJCQkJCS8vIGFuZCBmaXggREIKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQcm9wQ01Ob2RlKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNldCBnZXRJZGVudGlmaWVycygpIHsKLQkJSGFzaFNldCBpZHMgPSBuZXcgSGFzaFNldCgpOwotCQlnZXRJZGVudGlmaWVycyhpZHMpOwotCQlyZXR1cm4gaWRzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWFic3RyYWN0IHZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0VmFsdWVzKCkgewotCQlWZWN0b3IgdmFscyA9IG5ldyBWZWN0b3IoKTsKLQkJZ2V0VmFsdWVzKHZhbHMpOwotCQlyZXR1cm4gdmFsczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlhYnN0cmFjdCB2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcyk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgaW5pdFByb3BlcnR5Q00oKSB7Ci0JCWlmICghaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJcmV0dXJuOwotCQlMT0FESU5HID0gMTsKLQotCQlQcm9wQ01OdW1iZXIuaW5pdE51bWJlckNNRGltKCk7Ci0KLQkJLy8gYXppbXV0aAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0FaSU1VVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfQU5HTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUX1NJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZBUl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVJfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0VOVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVJfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GQVJfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUX1NJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JFSElORCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVFdBUkRTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVFdBUkRTKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQotCQkvLyBiYWNrZ3JvdW5kCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg2KTsKLQotCQkvLyBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQ1JPTEwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZJWEVEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UUkFOU1BBUkVOVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLWltYWdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1wb3NpdGlvbiAtLS0tIHN1Yi1wcm9wZXJ0aWVzIGhvcml6b250YWwKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xFRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYmFja2dyb3VuZC1wb3NpdGlvbiAtLS0tIHN1Yi1wcm9wZXJ0aWVzIHZlcnRpY2FsCi0JCXByb3AgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UT1ApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NFTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJhY2tncm91bmQtcG9zaXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBiYWNrZ3JvdW5kLXJlcGVhdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SRVBFQVRfWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVQRUFUX1kpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PX1JFUEVBVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSk7Ci0JCS8vIHByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg5KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1jb2xsYXBzZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xMQVBTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09MTEFQU0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFUEFSQVRFKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1jb2xvcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RSQU5TUEFSRU5UKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXNwYWNpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1BBQ0lORyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItdG9wCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1yaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLWxlZnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci10b3AtY29sb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXRvcC13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0LWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9DT0xPUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXJpZ2h0LXN0eWxlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1yaWdodC13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItYm90dG9tLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20tc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1ib3R0b20td2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0LWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3JkZXItbGVmdC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGJvcmRlci1sZWZ0LXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gYm9yZGVyLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKTsKLQkJLy8gcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBib3R0b20KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjYXB0aW9uLXNpZGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DQVBUSU9OX1NJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGVhcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMRUFSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQk9USCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU1RBVElDKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyB0b3AKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJKChQcm9wQ01TdWJQcm9wZXJ0eSkgcHJvcCkuc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwIC0tLS0gc3ViLXByb3BlcnRpZXMgcmlnaHQKLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQkoKFByb3BDTVN1YlByb3BlcnR5KSBwcm9wKS5zZXRDb250YWluZXIoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNsaXAgLS0tLSBzdWItcHJvcGVydGllcyBib3R0b20KLQkJcHJvcCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJKChQcm9wQ01TdWJQcm9wZXJ0eSkgcHJvcCkuc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwIC0tLS0gc3ViLXByb3BlcnRpZXMgbGVmdAotCQlwcm9wID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJKChQcm9wQ01TdWJQcm9wZXJ0eSkgcHJvcCkuc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjbGlwCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfU0hBUEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09MT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBjb250ZW50Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09OVEVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNU3RyaW5nLmdldEluc3RhbmNlT2YoUHJvcENNU3RyaW5nLlZBTF9BTlkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9DT1VOVEVSKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfQVRUUikpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09QRU5fUVVPVEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NMT1NFX1FVT1RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT19PUEVOX1FVT1RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT19DTE9TRV9RVU9URSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7IC8vIGluZmluaXRlCi0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBjb3VudGVyLWluY3JlbWVudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPVU5URVJfSU5DUkVNRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0NPVU5URVJfSUQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BTEwpOwotCi0JCS8vIGNvdW50ZXItcmVzZXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX1JFU0VUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0NPVU5URVJfSUQpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BTEwpOwotCi0JCS8vIGN1ZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0FGVEVSKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgyKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gY3VlLWFmdGVyCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0FGVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gY3VlLWJlZm9yZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBjdXJzb3IKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVVJTT1IpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NST1NTSEFJUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfREVGQVVMVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUE9JTlRFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTU9WRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRV9SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05FX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTldfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TV19SRVNJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NfUkVTSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XX1JFU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEVYVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0FJVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSEVMUCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7IC8vIGluZmluaXRlCi0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gZGlyZWN0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElSRUNUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MVFIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JUTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBkaXNwbGF5Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElTUExBWSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5MSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTE9DSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTElTVF9JVEVNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SVU5fSU4pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTVBBQ1QpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01BUktFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lOTElORV9UQUJMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfUk9XX0dST1VQKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9IRUFERVJfR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0ZPT1RFUl9HUk9VUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfUk9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9UQUJMRV9DT0xVTU5fR1JPVVApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RBQkxFX0NPTFVNTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ0VMTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEFCTEVfQ0FQVElPTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQUxMKTsKLQotCQkvLyBlbGV2YXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTEVWQVRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfQU5HTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CRUxPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVWRUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FCT1ZFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdIRVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gZW1wdHktY2VsbHMKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTVBUWV9DRUxMUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0hPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElERSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmbG9hdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZMT0FUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSU5FX0hFSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NBUFRJT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lDT04pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FTlUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FU1NBR0VfQk9YKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TTUFMTF9DQVBUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVEFUVVNfQkFSKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfRk9OVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfRkFNSUxZKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBmb250LXNpemUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0FCU09MVVRFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9SRUxBVElWRV9TSVpFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtc2l6ZS1hZGp1c3QKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkVfQURKVVNUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zdHJldGNoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFJFVENIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1dJREVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OQVJST1dFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVUxUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFRSQV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0VNSV9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFRSQV9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVUxUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gZm9udC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lUQUxJQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT0JMSVFVRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtdmFyaWFudAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExfQ0FQUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGZvbnQtd2VpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPTEQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzEwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8zMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzQwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl82MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzcwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfODAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl85MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xJR0hURVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JPTERFUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxlZnR0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxldHRlci1zcGFjaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVUVEVSX1NQQUNJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpbmUtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGlzdC1zdHlsZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTikpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUtaW1hZ2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01GdW5jdGlvbi5nZXRJbnN0YW5jZU9mKFByb3BDTUZ1bmN0aW9uLlZBTF9VUkkpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIGxpc3Qtc3R5bGUtcG9zaXRpb24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTlNJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09VVFNJREUpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbGlzdC1zdHlsZS10eXBlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ESVNDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DSVJDTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NRVUFSRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfREVDSU1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfREVDSU1BTF9MRUFESU5HX1pFUk8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX1JPTUFOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VUFBFUl9ST01BTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJfR1JFRUspOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0xPV0VSX0FMUEhBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MT1dFUl9MQVRJTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVVBQRVJfQUxQSEEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSX0xBVElOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9IRUJSRVcpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FSTUVOSUFOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HRU9SR0lBTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ0pLX0lERU9HUkFQSElDKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISVJBR0FOQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfS0FUQUtBTkEpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJUkFHQU5BX0lST0hBKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9LQVRBS0FOQV9JUk9IQSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fQk9UVE9NKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCg0KTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbi10b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmdpbi1yaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tYm90dG9tCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfTUFSR0lOX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXJnaW4tbGVmdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9NQVJHSU5fV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1hcmtlci1vZmZzZXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLRVJfT0ZGU0VUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gbWFya3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ1JPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ1JPU1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gbWF4LWhlaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9IRUlHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtYXgtd2lkdGgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVhfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyBtaW4taGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUlOX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG1pbi13aWR0aAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIG9ycGhhbnMKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PUlBIQU5TKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBvdXRsaW5lCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1dJRFRIKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgzKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdXRsaW5lLWNvbG9yCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9DT0xPUik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQ09MT1IpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTlZFUlQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fSU5URVJBQ1RJVkUpOwotCi0JCS8vIG91dGxpbmUtc3R5bGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfU1RZTEUpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0lOVEVSQUNUSVZFKTsKLQotCQkvLyBvdXRsaW5lLXdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9XSURUSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQk9SREVSX1dJRFRIKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9JTlRFUkFDVElWRSk7Ci0KLQkJLy8gb3ZlcmZsb3cKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVkVSRkxPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVklTSUJMRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElEREVOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQ1JPTEwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZwotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkcpOwotCQkvLyBwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19UT1ApKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZy10b3AKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFkZGluZy1yaWdodAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctYm90dG9tCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1BBRERJTkdfV0lEVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHBhZGRpbmctbGVmdAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfUEFERElOR19XSURUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcGFnZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfUEFHRV9JRCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhZ2UtYnJlYWstYWZ0ZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0FGVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTFdBWVMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FWT0lEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gcGFnZS1icmVhay1iZWZvcmUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0JFRk9SRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQUxXQVlTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVk9JRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEVGVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklHSFQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHBhZ2UtYnJlYWstaW5zaWRlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19JTlNJREUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FWT0lEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1BBR0VEKTsKLQotCQkvLyBwYXVzZQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1RJTUUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDIpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwYXVzZS1hZnRlcgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0FGVEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1RJTUUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGF1c2UtYmVmb3JlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQkVGT1JFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1RJTUUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcGl0Y2gKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9GUkVRVUVOQ1kpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX0xPVyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NRURJVU0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJR0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1hfSElHSCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBpdGNoLXJhbmdlCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0hfUkFOR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHBsYXktZHVyaW5nCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUExBWV9EVVJJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1VSSSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01JWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVQRUFUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBwb3NpdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BPU0lUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQlNPTFVURSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVMQVRJVkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZJWEVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVEFUSUMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcXVvdGVzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUVVPVEVTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0FOWSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gcmljaG5lc3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUNITkVTUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gcmlnaHQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHNpemUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TSVpFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1BPUlRSQUlUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MQU5EU0NBUEUpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoMik7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9QQUdFRCk7Ci0KLQkJLy8gc3BlYWsKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBSyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TUEVMTF9PVVQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVhay1oZWFkZXIKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19IRUFERVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09OQ0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMV0FZUyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fQVVSQUwpOwotCi0JCS8vIHNwZWFrLW51bWVyYWwKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19OVU1FUkFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ESUdJVFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NPTlRJTlVPVVMpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyBzcGVhay1wdW5jdHVhdGlvbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX1BVTkNUVUFUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT0RFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3BlZWNoLXJhdGUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVFQ0hfUkFURSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX1NMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NMT1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFTVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9GQVNUKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gc3RyZXNzCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1RSRVNTKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyB0YWJsZS1sYXlvdXQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UQUJMRV9MQVlPVVQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FVVE8pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0ZJWEVEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtYWxpZ24KLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0FMSUdOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MRUZUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DRU5URVIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1JJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9KVVNUSUZZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX0FOWSkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC1kZWNvcmF0aW9uCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9ERUNPUkFUSU9OKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9VTkRFUkxJTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX09WRVJMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9MSU5FX1RIUk9VR0gpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JMSU5LKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdGV4dC1pbmRlbnQKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX0lOREVOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtc2hhZG93Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9TSEFET1cpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PTkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRleHQtdHJhbnNmb3JtCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9UUkFOU0ZPUk0pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0NBUElUQUxJWkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VQUEVSQ0FTRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9XRVJDQVNFKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT05FKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHRvcAotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHVuaWNvZGUtYmlkaQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1VOSUNPREVfQklESSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FTUJFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQklESV9PVkVSUklERSk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB2ZXJ0aWNhbC1hbGlnbgotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZFUlRJQ0FMX0FMSUdOKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT1RUT00pOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1RFWFRfQk9UVE9NKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TVUIpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0JBU0VMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NSURETEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NVUEVSKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9URVhUX1RPUCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfVE9QKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdmlzaWJpbGl0eQotCQlwcm9wID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZJU0lCSUxJVFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1ZJU0lCTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0hJRERFTik7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ09MTEFQU0UpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0KLQkJLy8gdm9pY2UtZmFtaWx5Ci0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01TdHJpbmcuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdHJpbmcuVkFMX1ZPSUNFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfR0VORVJJQ19WT0lDRSkpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX0FVUkFMKTsKLQotCQkvLyB2b2x1bWUKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0xVTUUpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0lMRU5UKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YX1NPRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NPRlQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTE9VRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9MT1VEKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9BVVJBTCk7Ci0KLQkJLy8gd2hpdGUtc3BhY2UKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSElURV9TUEFDRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9QUkUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PV1JBUCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB3aWRvd3MKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURPV1MpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSU5URUdFUikpOwotCQlwcm9wLmFwcGVuZE1lZGlhR3JvdXAoSU1lZGlhR3JvdXBJRC5NX1ZJU1VBTCk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fUEFHRUQpOwotCi0JCS8vIHdpZHRoCi0JCXByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lEVEgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9QRVJDRU5UQUdFKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfQVVUTyk7Ci0JCXByb3AuYXBwZW5kTWVkaWFHcm91cChJTWVkaWFHcm91cElELk1fVklTVUFMKTsKLQotCQkvLyB3b3JkLXNwYWNpbmcKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XT1JEX1NQQUNJTkcpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX05PUk1BTCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8vIHotaW5kZXgKLQkJcHJvcCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9aX0lOREVYKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5hcHBlbmRNZWRpYUdyb3VwKElNZWRpYUdyb3VwSUQuTV9WSVNVQUwpOwotCi0JCS8qKiAqKioqKioqKiBmb250IHByb3BlcnRpZXMgKioqKioqKioqICovCi0JCS8vIGZvbnQtZmFtaWx5Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9GQU1JTFkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVN0cmluZy5nZXRJbnN0YW5jZU9mKFByb3BDTVN0cmluZy5WQUxfRk9OVCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfRkFNSUxZKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC1zdHlsZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfU1RZTEUpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0lUQUxJQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfT0JMSVFVRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtdmFyaWFudAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfVkFSSUFOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTExfQ0FQUyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9STUFMKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBmb250LXdlaWdodAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfV0VJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CT0xEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl8xMDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzIwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfMzAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl80MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzUwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfNjAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl83MDApOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WXzgwMCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfOTAwKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gZm9udC1zdHJldGNoCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfRk9OVF9TVFJFVENIKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9OT1JNQUwpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0NPTkRFTlNFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9DT05ERU5TRUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1NFTUlfQ09OREVOU0VEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRU1JX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9FWFBBTkRFRCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoSVZhbElELlZfRVhUUkFfRVhQQU5ERUQpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX1VMVFJBX0VYUEFOREVEKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BTEwpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoLTEpOwotCi0JCS8vIGZvbnQtc2l6ZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0ZPTlRfU0laRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfQUJTT0xVVEVfU0laRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1JFTEFUSVZFX1NJWkUpKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCQlwcm9wLmFwcGVuZENoaWxkKElWYWxJRC5WX0FMTCk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gdW5pY29kZS1yYW5nZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1VOSUNPREVfUkFOR0UpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTVVSYW5nZS5nZXRJbnN0YW5jZU9mKFByb3BDTVVSYW5nZS5WQUxfVVJBTkdFKSk7Ci0JCXByb3Auc2V0TWF4VmFsdWVDb3VudCgtMSk7Ci0KLQkJLy8gdW5pdHMtcGVyLWVtCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfVU5JVFNfUEVSX0VNKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHNyYwotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NSQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfRk9STUFUKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfTE9DQUwpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBwYW5vc2UtMQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1BBTk9TRV8xKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0lOVEVHRVIpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDEwKTsKLQotCQkvLyBzdGVtdgotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1NURU1WKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHN0ZW1oCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfU1RFTUgpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0KLQkJLy8gc2xvcGUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9TTE9QRSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBjYXAtaGVpZ2h0Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQ0FQX0hFSUdIVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyB4LWhlaWdodAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX1hfSEVJR0hUKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIGFzY2VudAotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX0FTQ0VOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBkZXNjZW50Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfREVTQ0VOVCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyB3aWR0aHMKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9XSURUSFMpOwotCQlwcm9wLmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTlVNKSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNVVJhbmdlLmdldEluc3RhbmNlT2YoUHJvcENNVVJhbmdlLlZBTF9VUkFOR0UpKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KC0xKTsKLQotCQkvLyBiYm94Ci0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQkJPWCk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQkJcHJvcC5zZXRNYXhWYWx1ZUNvdW50KDQpOwotCQlwcm9wLnNldE1heFZhbHVlQ291bnQoNCk7Ci0KLQkJLy8gZGVmaW5pdGlvbi1zcmMKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9ERUZJTklUSU9OX1NSQyk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNRnVuY3Rpb24uZ2V0SW5zdGFuY2VPZihQcm9wQ01GdW5jdGlvbi5WQUxfVVJJKSk7Ci0KLQkJLy8gYmFzZWxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9CQVNFTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBjZW50ZXJsaW5lCi0JCXByb3AgPSBQcm9wQ01Gb250UHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Gb250UHJvcGVydHkuUEZfQ0VOVEVSTElORSk7Ci0JCXByb3AuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9OVU0pKTsKLQotCQkvLyBtYXRobGluZQotCQlwcm9wID0gUHJvcENNRm9udFByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNRm9udFByb3BlcnR5LlBGX01BVEhMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8vIHRvcGxpbmUKLQkJcHJvcCA9IFByb3BDTUZvbnRQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTUZvbnRQcm9wZXJ0eS5QRl9UT1BMSU5FKTsKLQkJcHJvcC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX05VTSkpOwotCi0JCS8qKiAqKioqKioqKiBjb250YWluZXJzICoqKioqKioqKiAqLwotCi0JCS8vIGFic29sdXRlLXNpemUKLQkJUHJvcENNQ29udGFpbmVyIGNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9BQlNPTFVURV9TSVpFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9YWF9TTUFMTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfWF9TTUFMTCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU01BTEwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTEFSR0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hfTEFSR0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1hYX0xBUkdFKTsKLQotCQkvLyBib3JkZXItc3R5bGUKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0JPUkRFUl9TVFlMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU09MSUQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0RBU0hFRCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRE9UVEVEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ET1VCTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0dST09WRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfUklER0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0lOU0VUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9PVVRTRVQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0hJRERFTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTk9ORSk7Ci0KLQkJLy8gYm9yZGVyLXdpZHRoCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9CT1JERVJfV0lEVEgpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RISU4pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FRElVTSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhJQ0spOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfTEVOR1RIKSk7Ci0KLQkJLy8gY29sb3IKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0NPTE9SKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BUVVBKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CTEFDSyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkxVRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRlVDSFNJQSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JBWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfR1JFRU4pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0xJTUUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01BUk9PTik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTkFWWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfT0xJVkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1BVUlBMRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfUkVEKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TSUxWRVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RFQUwpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1dISVRFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ZRUxMT1cpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1NZU1RFTV9DT0xPUikpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTUZ1bmN0aW9uLmdldEluc3RhbmNlT2YoUHJvcENNRnVuY3Rpb24uVkFMX1JHQikpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfSEFTSCkpOwotCi0JCS8vIHN5c3RlbSBjb2xvcgotCQljb250ID0gUHJvcENNQ29udGFpbmVyLmdldENvbnRJbnN0YW5jZU9mKFByb3BDTUNvbnRhaW5lci5WQUxfU1lTVEVNX0NPTE9SKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BQ1RJVkVCT1JERVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FDVElWRUNBUFRJT04pOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0FQUFdPUktTUEFDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQkFDS0dST1VORCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9ORkFDRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQlVUVE9OSElHSExJR0hUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9CVVRUT05TSEFET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0JVVFRPTlRFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0NBUFRJT05URVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9HUkFZVEVYVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSElHSExJR0hUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9ISUdITElHSFRURVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkFDVElWRUJPUkRFUik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5BQ1RJVkVDQVBUSU9OKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkFDVElWRUNBUFRJT05URVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9JTkZPQkFDS0dST1VORCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfSU5GT1RFWFQpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FTlUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX01FTlVURVhUKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TQ1JPTExCQVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFRERBUktTSEFET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFREZBQ0UpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFREhJR0hMSUdIVCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfVEhSRUVETElHSFRTSEFET1cpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1RIUkVFRFNIQURPVyk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0lORE9XKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9XSU5ET1dGUkFNRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfV0lORE9XVEVYVCk7Ci0KLQkJLy8gZ2VuZXJpYy1mYW1pbHkKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX0dFTkVSSUNfRkFNSUxZKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9TRVJJRik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfU0FOU19TRVJJRik7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfQ1VSU0lWRSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfRkFOVEFTWSk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoSVZhbElELlZfTU9OT1NQQUNFKTsKLQotCQkvLyBnZW5lcmljLXZvaWNlCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9HRU5FUklDX1ZPSUNFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9NQUxFKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9GRU1BTEUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0NISUxEKTsKLQotCQkvLyBtYXJnaW4td2lkdGgKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX01BUkdJTl9XSURUSCk7Ci0JCWNvbnQuYXBwZW5kQ2hpbGQoUHJvcENNTnVtYmVyLmdldEluc3RhbmNlT2YoUHJvcENNTnVtYmVyLlZBTF9MRU5HVEgpKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX1BFUkNFTlRBR0UpKTsKLQkJY29udC5hcHBlbmRDaGlsZChJVmFsSUQuVl9BVVRPKTsKLQotCQkvLyBwYWRkaW5nLXdpZHRoCi0JCWNvbnQgPSBQcm9wQ01Db250YWluZXIuZ2V0Q29udEluc3RhbmNlT2YoUHJvcENNQ29udGFpbmVyLlZBTF9QQURESU5HX1dJRFRIKTsKLQkJY29udC5hcHBlbmRDaGlsZChQcm9wQ01OdW1iZXIuZ2V0SW5zdGFuY2VPZihQcm9wQ01OdW1iZXIuVkFMX0xFTkdUSCkpOwotCQljb250LmFwcGVuZENoaWxkKFByb3BDTU51bWJlci5nZXRJbnN0YW5jZU9mKFByb3BDTU51bWJlci5WQUxfUEVSQ0VOVEFHRSkpOwotCi0JCS8vIHJlbGF0aXZlLXNpemUKLQkJY29udCA9IFByb3BDTUNvbnRhaW5lci5nZXRDb250SW5zdGFuY2VPZihQcm9wQ01Db250YWluZXIuVkFMX1JFTEFUSVZFX1NJWkUpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX1NNQUxMRVIpOwotCQljb250LmFwcGVuZENoaWxkKElWYWxJRC5WX0xBUkdFUik7Ci0KLQkJTE9BRElORyA9IDI7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzTG9hZGluZygpIHsKLQkJcmV0dXJuIExPQURJTkcgPT0gMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNOZWVkSW5pdGlhbGl6ZSgpIHsKLQkJcmV0dXJuIExPQURJTkcgPT0gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01OdW1iZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU51bWJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmNjY2IwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTU51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNTnVtYmVyIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9BTkdMRSA9ICJhbmdsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfRlJFUVVFTkNZID0gImZyZXF1ZW5jeSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfSU5URUdFUiA9ICJpbnRlZ2VyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9MRU5HVEggPSAibGVuZ3RoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9QRVJDRU5UQUdFID0gInBlcmNlbnRhZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX1RJTUUgPSAidGltZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfSEFTSCA9ICJoYXNoIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfTlVNID0gIm51bWJlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9DTSA9ICJjbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9ERUcgPSAiZGVnIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0VNUyA9ICJlbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9FWFMgPSAiZXgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fR1JBRCA9ICJncmFkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX0hBU0ggPSAiIyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9IWiA9ICJIeiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9JTiA9ICJpbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9JTlRFR0VSID0gIklOVEVHRVIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBESU1fS0haID0gImtIeiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9NTSA9ICJtbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9NUyA9ICJtcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9OVU1CRVIgPSAiTlVNQkVSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1BDID0gInBjIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1BFUkNFTlRBR0UgPSAiJSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QVCA9ICJwdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9QWCA9ICJweCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERJTV9SQUQgPSAicmFkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElNX1MgPSAicyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgamF2YS51dGlsLlZlY3RvciBmRGltcyA9IG5ldyBWZWN0b3IoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01OdW1iZXIoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0RGltZW5zaW9uKHNob3J0IHByaW1pdGl2ZVR5cGUpIHsKLQkJc3dpdGNoIChwcmltaXRpdmVUeXBlKSB7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJcmV0dXJuIERJTV9DTTsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJcmV0dXJuIERJTV9ERUc7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVMgOgotCQkJCXJldHVybiBESU1fRU1TOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRVhTIDoKLQkJCQlyZXR1cm4gRElNX0VYUzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0dSQUQgOgotCQkJCXJldHVybiBESU1fR1JBRDsKLQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19IQVNIIDoKLQkJCQlyZXR1cm4gRElNX0hBU0g7IC8vIHByZWZpeCBkaW1lbnNpb24gLi4uLgotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCXJldHVybiBESU1fSFo7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTiA6Ci0JCQkJcmV0dXJuIERJTV9JTjsKLQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSIDoKLQkJCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfS0haIDoKLQkJCQlyZXR1cm4gRElNX0tIWjsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01NIDoKLQkJCQlyZXR1cm4gRElNX01NOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTVMgOgotCQkJCXJldHVybiBESU1fTVM7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgOgotCQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QQyA6Ci0JCQkJcmV0dXJuIERJTV9QQzsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0UgOgotCQkJCXJldHVybiBESU1fUEVSQ0VOVEFHRTsKLQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BUIDoKLQkJCQlyZXR1cm4gRElNX1BUOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFggOgotCQkJCXJldHVybiBESU1fUFg7Ci0JCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQgOgotCQkJCXJldHVybiBESU1fUkFEOwotCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJcmV0dXJuIERJTV9TOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNldCBnZXREaW1lbnNpb25zKCkgewotCQlIYXNoU2V0IHZhbHMgPSBuZXcgSGFzaFNldCgpOwotCQlJdGVyYXRvciBpdCA9IGZEaW1zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXZhbHMuYWRkKGl0Lm5leHQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gdmFsczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldElkZW50aWZpZXJzKFNldCBpbmRlbnRzKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHB1YmxpYyBQcm9wQ01OdW1iZXIgZ2V0SW5zdGFuY2VPZihTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDIwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01OdW1iZXIpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNTnVtYmVyKG5hbWUpOwotCQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQkJfQotCi0JCXJldHVybiAoUHJvcENNTnVtYmVyKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX05VTUJFUjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGdldFZhbHVlcyhDb2xsZWN0aW9uIHZhbHVlcykgewotCQlpZiAodmFsdWVzICE9IG51bGwgJiYgIXZhbHVlcy5jb250YWlucyh0aGlzKSkKLQkJCXZhbHVlcy5hZGQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdE51bWJlckNNRGltKCkgewotCQlQcm9wQ01OdW1iZXIgbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfQU5HTEUpOwotCQludW0uZkRpbXMuYWRkKERJTV9ERUcpOwotCQludW0uZkRpbXMuYWRkKERJTV9HUkFEKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUkFEKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9GUkVRVUVOQ1kpOwotCQludW0uZkRpbXMuYWRkKERJTV9IWik7Ci0JCW51bS5mRGltcy5hZGQoRElNX0tIWik7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfSEFTSCk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0hBU0gpOwotCi0JCS8vIG51bSA9IGdldEluc3RhbmNlT2YoVkFMX0lOVEVHRVIpOwotCQkvLyBudW0uZkRpbXMuYWRkKERJTV9JTlRFR0VSKTsKLQotCQludW0gPSBnZXRJbnN0YW5jZU9mKFZBTF9MRU5HVEgpOwotCQludW0uZkRpbXMuYWRkKERJTV9DTSk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0VNUyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0VYUyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX0lOKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fTU0pOwotCQludW0uZkRpbXMuYWRkKERJTV9QQyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BUKTsKLQkJbnVtLmZEaW1zLmFkZChESU1fUFgpOwotCi0JCS8vIG51bSA9IGdldEluc3RhbmNlT2YoVkFMX05VTUJFUik7Ci0JCS8vIG51bS5mRGltcy5hZGQoRElNX05VTUJFUik7Ci0KLQkJbnVtID0gZ2V0SW5zdGFuY2VPZihWQUxfUEVSQ0VOVEFHRSk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1BFUkNFTlRBR0UpOwotCi0JCW51bSA9IGdldEluc3RhbmNlT2YoVkFMX1RJTUUpOwotCQludW0uZkRpbXMuYWRkKERJTV9NUyk7Ci0JCW51bS5mRGltcy5hZGQoRElNX1MpOwotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVByb3BlcnR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmFiMzhmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVByb3BlcnR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVByb3BlcnR5IGV4dGVuZHMgUHJvcENNQ29udGFpbmVyIHsKLQotCS8vIHN0YXRpYyBmaWVsZHMKLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBjYWNoZWRJZE1hcCA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9BWklNVVRIID0gImF6aW11dGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHID0gImJhY2tncm91bmQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0FUVEFDSE1FTlQgPSAiYmFja2dyb3VuZC1hdHRhY2htZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19DT0xPUiA9ICJiYWNrZ3JvdW5kLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19JTUFHRSA9ICJiYWNrZ3JvdW5kLWltYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19QT1NJVElPTiA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CR19SRVBFQVQgPSAiYmFja2dyb3VuZC1yZXBlYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUiA9ICJib3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xMQVBTRSA9ICJib3JkZXItY29sbGFwc2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9DT0xPUiA9ICJib3JkZXItY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9TUEFDSU5HID0gImJvcmRlci1zcGFjaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfU1RZTEUgPSAiYm9yZGVyLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QID0gImJvcmRlci10b3AiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVCA9ICJib3JkZXItcmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT00gPSAiYm9yZGVyLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlQgPSAiYm9yZGVyLWxlZnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfQ09MT1IgPSAiYm9yZGVyLXRvcC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX0NPTE9SID0gImJvcmRlci1yaWdodC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9DT0xPUiA9ICJib3JkZXItYm90dG9tLWNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9DT0xPUiA9ICJib3JkZXItbGVmdC1jb2xvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9TVFlMRSA9ICJib3JkZXItdG9wLXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfU1RZTEUgPSAiYm9yZGVyLXJpZ2h0LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX1NUWUxFID0gImJvcmRlci1ib3R0b20tc3R5bGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX1NUWUxFID0gImJvcmRlci1sZWZ0LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX1dJRFRIID0gImJvcmRlci10b3Atd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9XSURUSCA9ICJib3JkZXItcmlnaHQtd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fV0lEVEggPSAiYm9yZGVyLWJvdHRvbS13aWR0aCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfV0lEVEggPSAiYm9yZGVyLWxlZnQtd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9XSURUSCA9ICJib3JkZXItd2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0JPVFRPTSA9ICJib3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NBUFRJT05fU0lERSA9ICJjYXB0aW9uLXNpZGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NMRUFSID0gImNsZWFyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DTElQID0gImNsaXAiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT05URU5UID0gImNvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NPVU5URVJfSU5DUkVNRU5UID0gImNvdW50ZXItaW5jcmVtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DT1VOVEVSX1JFU0VUID0gImNvdW50ZXItcmVzZXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRSA9ICJjdWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9BRlRFUiA9ICJjdWUtYWZ0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0NVRV9CRUZPUkUgPSAiY3VlLWJlZm9yZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VSU09SID0gImN1cnNvciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElSRUNUSU9OID0gImRpcmVjdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRElTUExBWSA9ICJkaXNwbGF5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTEVWQVRJT04gPSAiZWxldmF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9FTVBUWV9DRUxMUyA9ICJlbXB0eS1jZWxscyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRkxPQVQgPSAiZmxvYXQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlQgPSAiZm9udCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9GQU1JTFkgPSAiZm9udC1mYW1pbHkiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRSA9ICJmb250LXNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfU0laRV9BREpVU1QgPSAiZm9udC1zaXplLWFkanVzdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFJFVENIID0gImZvbnQtc3RyZXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TVFlMRSA9ICJmb250LXN0eWxlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1ZBUklBTlQgPSAiZm9udC12YXJpYW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1dFSUdIVCA9ICJmb250LXdlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfSEVJR0hUID0gImhlaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTEVGVCA9ICJsZWZ0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MRVRURVJfU1BBQ0lORyA9ICJsZXR0ZXItc3BhY2luZyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElORV9IRUlHSFQgPSAibGluZS1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEUgPSAibGlzdC1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9JTUFHRSA9ICJsaXN0LXN0eWxlLWltYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX1BPU0lUSU9OID0gImxpc3Qtc3R5bGUtcG9zaXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfVFlQRSA9ICJsaXN0LXN0eWxlLXR5cGUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTiA9ICJtYXJnaW4iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9UT1AgPSAibWFyZ2luLXRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX1JJR0hUID0gIm1hcmdpbi1yaWdodCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX0JPVFRPTSA9ICJtYXJnaW4tYm90dG9tIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fTEVGVCA9ICJtYXJnaW4tbGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSS0VSX09GRlNFVCA9ICJtYXJrZXItb2Zmc2V0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJLUyA9ICJtYXJrcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFYX0hFSUdIVCA9ICJtYXgtaGVpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVhfV0lEVEggPSAibWF4LXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NSU5fSEVJR0hUID0gIm1pbi1oZWlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX01JTl9XSURUSCA9ICJtaW4td2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09SUEhBTlMgPSAib3JwaGFucyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORSA9ICJvdXRsaW5lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX0NPTE9SID0gIm91dGxpbmUtY29sb3IiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfU1RZTEUgPSAib3V0bGluZS1zdHlsZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9XSURUSCA9ICJvdXRsaW5lLXdpZHRoIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVkVSRkxPVyA9ICJvdmVyZmxvdyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElORyA9ICJwYWRkaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX1RPUCA9ICJwYWRkaW5nLXRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19SSUdIVCA9ICJwYWRkaW5nLXJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX0JPVFRPTSA9ICJwYWRkaW5nLWJvdHRvbSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFERElOR19MRUZUID0gInBhZGRpbmctbGVmdCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRSA9ICJwYWdlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0FGVEVSID0gInBhZ2UtYnJlYWstYWZ0ZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfQkVGT1JFID0gInBhZ2UtYnJlYWstYmVmb3JlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFX0JSRUFLX0lOU0lERSA9ICJwYWdlLWJyZWFrLWluc2lkZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0UgPSAicGF1c2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFX0FGVEVSID0gInBhdXNlLWFmdGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRV9CRUZPUkUgPSAicGF1c2UtYmVmb3JlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QSVRDSCA9ICJwaXRjaCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUElUQ0hfUkFOR0UgPSAicGl0Y2gtcmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1BMQVlfRFVSSU5HID0gInBsYXktZHVyaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QT1NJVElPTiA9ICJwb3NpdGlvbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUVVPVEVTID0gInF1b3RlcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUklDSE5FU1MgPSAicmljaG5lc3MiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1JJR0hUID0gInJpZ2h0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TSVpFID0gInNpemUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLID0gInNwZWFrIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19IRUFERVIgPSAic3BlYWstaGVhZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVBS19OVU1FUkFMID0gInNwZWFrLW51bWVyYWwiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX1BVTkNUVUFUSU9OID0gInNwZWFrLXB1bmN0dWF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TUEVFQ0hfUkFURSA9ICJzcGVlY2gtcmF0ZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1RSRVNTID0gInN0cmVzcyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEFCTEVfTEFZT1VUID0gInRhYmxlLWxheW91dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9BTElHTiA9ICJ0ZXh0LWFsaWduIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0RFQ09SQVRJT04gPSAidGV4dC1kZWNvcmF0aW9uIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0lOREVOVCA9ICJ0ZXh0LWluZGVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9TSEFET1cgPSAidGV4dC1zaGFkb3ciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfVFJBTlNGT1JNID0gInRleHQtdHJhbnNmb3JtIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9UT1AgPSAidG9wIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9VTklDT0RFX0JJREkgPSAidW5pY29kZS1iaWRpIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WRVJUSUNBTF9BTElHTiA9ICJ2ZXJ0aWNhbC1hbGlnbiI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVklTSUJJTElUWSA9ICJ2aXNpYmlsaXR5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0lDRV9GQU1JTFkgPSAidm9pY2UtZmFtaWx5IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WT0xVTUUgPSAidm9sdW1lIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSElURV9TUEFDRSA9ICJ3aGl0ZS1zcGFjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lET1dTID0gIndpZG93cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV0lEVEggPSAid2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1dPUkRfU1BBQ0lORyA9ICJ3b3JkLXNwYWNpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQX1pfSU5ERVggPSAiei1pbmRleCI7Ly8kTk9OLU5MUy0xJAotCS8vIGluc3RhbmNlIGZpZWxkcwotCXByaXZhdGUgaW50IGZNaW5WYWx1ZUNvdW50ID0gMTsKLQlwcml2YXRlIGludCBmTWF4VmFsdWVDb3VudCA9IDE7Ci0JcHJpdmF0ZSBPYmplY3RbXSBtZWRpYUdyb3VwczsKLQlwcm90ZWN0ZWQgTGlzdCBjb250YWluZXJzOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCU9iamVjdCBhcHBlbmRDaGlsZChPYmplY3Qgbm9kZSkgewotCQlPYmplY3QgcmV0ID0gc3VwZXIuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgUHJvcENNUHJvcGVydHkpIHsKLQkJCS8vIHJlZ2lzdGVyIHNob3J0aGFuZCBjb250YWluZXIKLQkJCVByb3BDTVByb3BlcnR5IGNtID0gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCQkJaWYgKGNtLmNvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCQljbS5jb250YWluZXJzID0gbmV3IFZlY3RvcigpOwotCQkJaWYgKCFjbS5jb250YWluZXJzLmNvbnRhaW5zKHRoaXMpKQotCQkJCWNtLmNvbnRhaW5lcnMuYWRkKHRoaXMpOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhcHBlbmRNZWRpYUdyb3VwKE9iamVjdCBtZykgewotCQlpZiAobWVkaWFHcm91cHMgPT0gbnVsbCkKLQkJCW1lZGlhR3JvdXBzID0gbmV3IE9iamVjdFsxXTsKLQkJZWxzZSB7Ci0JCQlPYmplY3RbXSBvbGRNZWRpYUdyb3VwcyA9IG1lZGlhR3JvdXBzOwotCQkJbWVkaWFHcm91cHMgPSBuZXcgT2JqZWN0W29sZE1lZGlhR3JvdXBzLmxlbmd0aCArIDFdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRNZWRpYUdyb3VwcywgMCwgbWVkaWFHcm91cHMsIDAsIG9sZE1lZGlhR3JvdXBzLmxlbmd0aCk7Ci0JCX0KLQkJbWVkaWFHcm91cHNbbWVkaWFHcm91cHMubGVuZ3RoIC0gMV0gPSBtZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDIwMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNUHJvcGVydHkpIG5vZGU7Ci0KLQkJLy8gcmVnaXN0ZXIKLQkJaWYgKFByb3BDTU5vZGUuaXNMb2FkaW5nKCkpIHsKLQkJCW5vZGUgPSBuZXcgUHJvcENNUHJvcGVydHkobmFtZSk7Ci0JCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1heFZhbHVlQ291bnQoKSB7Ci0JCXJldHVybiBmTWF4VmFsdWVDb3VudDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRNZWRpYUdyb3VwcygpIHsKLQkJaWYgKG1lZGlhR3JvdXBzICE9IG51bGwpCi0JCQlyZXR1cm4gQXJyYXlzLmFzTGlzdChtZWRpYUdyb3Vwcyk7Ci0JCWVsc2UKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRNaW5WYWx1ZUNvdW50KCkgewotCQlyZXR1cm4gZk1pblZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBFbnVtZXJhdGlvbiBnZXROYW1lRW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMua2V5cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0UHJvcGVydHlFbnVtKCkgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJcmV0dXJuIGluc3RhbmNlcy5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKSB7Ci0JCXJldHVybiAoY29udGFpbmVycyA9PSBudWxsKSA/IDAgOiBjb250YWluZXJzLnNpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9QUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3J0aGFuZCgpIHsKLQkJaW50IG5DaGlsZCA9IGdldE51bUNoaWxkKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkNoaWxkOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBnZXRDaGlsZEF0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5ICYmICEob2JqIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBuYW1lcygpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBMaXN0IG5hbWVzKE9iamVjdCBtZWRpYUdyb3VwKSB7Ci0JCWlmIChtZWRpYUdyb3VwID09IG51bGwpCi0JCQlyZXR1cm4gbmFtZXMoKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJVmVjdG9yIHByb3BlcnRpZXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJSXRlcmF0b3IgaXQgPSBpbnN0YW5jZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJUHJvcENNUHJvcGVydHkgcHJvcCA9IChQcm9wQ01Qcm9wZXJ0eSkgaXQubmV4dCgpOwotCQkJaWYgKHByb3AuZ2V0TWVkaWFHcm91cHMoKS5jb250YWlucyhtZWRpYUdyb3VwKSkKLQkJCQlwcm9wZXJ0aWVzLmFkZChwcm9wLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcGVydGllczsKLQl9Ci0KLQkvKioKLQkgKiBJZiBpZGVudGlmaWVyIGlzIG51bGwsIGdldCBhbGwgcHJvcGVydGllcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgVmVjdG9yIHByb3BlcnRpZXNGb3IoU3RyaW5nIGlkZW50aWZpZXIsIGJvb2xlYW4gc2hvcnRoYW5kcykgewotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gaWYgaWRlbnRpZmllciBpcyBudWxsLCBnZXQgYWxsIHByb3BlcnRpZXMKLQkJaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy52YWx1ZXMoKSk7Ci0KLQkJaWYgKGNhY2hlZElkTWFwID09IG51bGwpIHsKLQkJCS8vIHN0YXJ0IGNhY2hlaW5nCi0JCQljYWNoZWRJZE1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBjYWNoZWQKLQkJCU9iamVjdCByZXQgPSBjYWNoZWRJZE1hcC5nZXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpKTsKLQkJCWlmIChyZXQgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFZlY3RvcigoQ29sbGVjdGlvbikgcmV0KTsKLQkJfQotCi0JCS8vIGNyZWF0ZQotCQlFbnVtZXJhdGlvbiBwcm9wZXJ0eUVudW0gPSBnZXRQcm9wZXJ0eUVudW0oKTsKLQkJSGFzaFNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQl3aGlsZSAocHJvcGVydHlFbnVtLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wID0gKFByb3BDTVByb3BlcnR5KSBwcm9wZXJ0eUVudW0ubmV4dEVsZW1lbnQoKTsKLQkJCWlmICghc2hvcnRoYW5kcyAmJiBwcm9wLmlzU2hvcnRoYW5kKCkpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocHJvcC5jYW5IYXZlKGlkZW50aWZpZXIpKQotCQkJCXNldC5hZGQocHJvcCk7Ci0JCX0KLQotCQkvLyBjYWNoZQotCQljYWNoZWRJZE1hcC5wdXQoaWRlbnRpZmllciArIFN0cmluZy52YWx1ZU9mKHNob3J0aGFuZHMpLCBzZXQpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKHNldCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWF4VmFsdWVDb3VudChpbnQgbmV3TWF4VmFsdWVDb3VudCkgewotCQlmTWF4VmFsdWVDb3VudCA9IG5ld01heFZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWluVmFsdWVDb3VudChpbnQgbmV3TWluVmFsdWVDb3VudCkgewotCQlmTWluVmFsdWVDb3VudCA9IG5ld01pblZhbHVlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFByb3BDTVByb3BlcnR5IHNob3J0aGFuZENvbnRhaW5lckF0KGludCBpKSB7Ci0JCWlmIChjb250YWluZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGkgPCAwIHx8IGNvbnRhaW5lcnMuc2l6ZSgpIDw9IGkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgY29udGFpbmVycy5nZXQoaSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIHNob3J0aGFuZENvbnRhaW5lckl0ZXJhdG9yKCkgewotCQlpZiAoY29udGFpbmVycyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IEl0ZXJhdG9yKCkgewotCQkJCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBjb250YWluZXJzLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjMwYzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNU3RyaW5nIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9GT05UID0gImZvbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0NPVU5URVJfSUQgPSAiY291bnRlcklkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIFZBTF9QQUdFX0lEID0gInBhZ2VJZCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBWQUxfVk9JQ0UgPSAidm9pY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgVkFMX0FOWSA9ICJhbnkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgUHJvcENNU3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZ2V0SWRlbnRpZmllcnMoU2V0IGluZGVudHMpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgcHVibGljIFByb3BDTVN0cmluZyBnZXRJbnN0YW5jZU9mKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyBpbml0aWFsaXplCi0JCWlmIChpbnN0YW5jZXMgPT0gbnVsbCkKLQkJCWluc3RhbmNlcyA9IG5ldyBIYXNodGFibGUoMTApOwotCi0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQkvLyBxdWVyeQotCQlPYmplY3Qgbm9kZSA9IGluc3RhbmNlcy5nZXQobmFtZSk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKFByb3BDTVN0cmluZykgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlub2RlID0gbmV3IFByb3BDTVN0cmluZyhuYW1lKTsKLQkJaW5zdGFuY2VzLnB1dChuYW1lLCBub2RlKTsKLQotCQlyZXR1cm4gKFByb3BDTVN0cmluZykgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9TVFJJTkc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdWJQcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNU3ViUHJvcGVydHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFlYmIzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01TdWJQcm9wZXJ0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNU3ViUHJvcGVydHkgZXh0ZW5kcyBQcm9wQ01Qcm9wZXJ0eSB7Ci0KLQkvLyBzdGF0aWMgZmllbGRzCi0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBpbnN0YW5jZXMgPSBudWxsOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQkdfUE9TSVRJT05fWCA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uSCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQkdfUE9TSVRJT05fWSA9ICJiYWNrZ3JvdW5kLXBvc2l0aW9uViI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQ0xJUF9UT1AgPSAiY2xpcFRvcCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFBTVUJfQ0xJUF9SSUdIVCA9ICJjbGlwUmlnaHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfQk9UVE9NID0gImNsaXBCb3R0b20iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBQU1VCX0NMSVBfTEVGVCA9ICJjbGlwTGVmdCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIFByb3BDTVN1YlByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQcm9wQ01Qcm9wZXJ0eSBnZXRDb250YWluZXIoKSB7Ci0JCXJldHVybiBzaG9ydGhhbmRDb250YWluZXJBdCgwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFByb3BDTVByb3BlcnR5IGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJLy8gaW5pdGlhbGl6ZQotCQlpZiAoaW5zdGFuY2VzID09IG51bGwpCi0JCQlpbnN0YW5jZXMgPSBuZXcgSGFzaHRhYmxlKDEwKTsKLQotCQkvLyBJbml0aWFsaXplIG9mIERCCi0JCWlmIChpc05lZWRJbml0aWFsaXplKCkpCi0JCQlQcm9wQ01Ob2RlLmluaXRQcm9wZXJ0eUNNKCk7Ci0KLQkJLy8gcXVlcnkKLQkJT2JqZWN0IG5vZGUgPSBpbnN0YW5jZXMuZ2V0KG5hbWUpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIChQcm9wQ01Qcm9wZXJ0eSkgbm9kZTsKLQotCQkvLyByZWdpc3RlcgotCQlpZiAoUHJvcENNTm9kZS5pc0xvYWRpbmcoKSkgewotCQkJbm9kZSA9IG5ldyBQcm9wQ01TdWJQcm9wZXJ0eShuYW1lKTsKLQkJCWluc3RhbmNlcy5wdXQobmFtZSwgbm9kZSk7Ci0JCX0KLQotCQlyZXR1cm4gKFByb3BDTVByb3BlcnR5KSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW51bWVyYXRpb24gZ2V0TmFtZUVudW0oKSB7Ci0JCS8vIEluaXRpYWxpemUgb2YgREIKLQkJaWYgKGlzTmVlZEluaXRpYWxpemUoKSkKLQkJCVByb3BDTU5vZGUuaW5pdFByb3BlcnR5Q00oKTsKLQotCQlyZXR1cm4gaW5zdGFuY2VzLmtleXMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVudW1lcmF0aW9uIGdldFByb3BlcnR5RW51bSgpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBpbnN0YW5jZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFZBTF9TVUJQUk9QRVJUWTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZlY3RvciBuYW1lcygpIHsKLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCXJldHVybiBuZXcgVmVjdG9yKGluc3RhbmNlcy5rZXlTZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKFByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJaWYgKGNvbnRhaW5lcnMgPT0gbnVsbCkKLQkJCWNvbnRhaW5lcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWNvbnRhaW5lcnMuY2xlYXIoKTsKLQkJY29udGFpbmVycy5hZGQocHJvcCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL1Byb3BDTVVSYW5nZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVVJhbmdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNzU3MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVVJhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgUHJvcENNVVJhbmdlIGV4dGVuZHMgUHJvcENNTm9kZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBqYXZhLnV0aWwuSGFzaHRhYmxlIGluc3RhbmNlcyA9IG51bGw7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMX1VSQU5HRSA9ICJ1cmFuZ2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBQcm9wQ01VUmFuZ2UoU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRJZGVudGlmaWVycyhTZXQgaW5kZW50cykgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgUHJvcENNVVJhbmdlIGdldEluc3RhbmNlT2YoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGluaXRpYWxpemUKLQkJaWYgKGluc3RhbmNlcyA9PSBudWxsKQotCQkJaW5zdGFuY2VzID0gbmV3IEhhc2h0YWJsZSgxMCk7Ci0KLQkJLy8gSW5pdGlhbGl6ZSBvZiBEQgotCQlpZiAoaXNOZWVkSW5pdGlhbGl6ZSgpKQotCQkJUHJvcENNTm9kZS5pbml0UHJvcGVydHlDTSgpOwotCi0JCS8vIHF1ZXJ5Ci0JCU9iamVjdCBub2RlID0gaW5zdGFuY2VzLmdldChuYW1lKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoUHJvcENNVVJhbmdlKSBub2RlOwotCi0JCS8vIHJlZ2lzdGVyCi0JCW5vZGUgPSBuZXcgUHJvcENNVVJhbmdlKG5hbWUpOwotCQlpbnN0YW5jZXMucHV0KG5hbWUsIG5vZGUpOwotCi0JCXJldHVybiAoUHJvcENNVVJhbmdlKSBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gVkFMX1VOSUNPREVfUkFOR0U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBnZXRWYWx1ZXMoQ29sbGVjdGlvbiB2YWx1ZXMpIHsKLQkJaWYgKHZhbHVlcyAhPSBudWxsICYmICF2YWx1ZXMuY29udGFpbnModGhpcykpCi0JCQl2YWx1ZXMuYWRkKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wQ01VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmJhMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcENNVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByb3BDTVV0aWwgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1pbnVzKENvbGxlY3Rpb24gc3JjLCBDb2xsZWN0aW9uIHJlZikgewotCQlJdGVyYXRvciBpdCA9IHJlZi5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKHNyYy5jb250YWlucyhvYmopKQotCQkJCXNyYy5yZW1vdmUob2JqKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIHBsdXMoQ29sbGVjdGlvbiBzcmMsIENvbGxlY3Rpb24gcmVmKSB7Ci0JCUl0ZXJhdG9yIGl0ID0gcmVmLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAoIXNyYy5jb250YWlucyhvYmopKQotCQkJCXNyYy5hZGQob2JqKTsKLQkJfQotCQlyZXR1cm47Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiYzU4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuUHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJvcGVydGllcyBjb25zdGFudHMgdXNlZCBieSBDU1MuIENsaWVudHMgc2hvdWxkIG9ubHkgcmVhZCBhbmQgbW9kaWZ5IHRoZQotICogQ1NTIHByb3BlcnRpZXMgcHJvZ3JhbW1hdGljYWxseSB1c2luZyB0aGlzIGNsYXNzLgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NDb250ZW50UHJvcGVydGllcyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDU1NDT1JFX0lEID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfS0VZID0gIjxwcm9qZWN0PiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGNzcyBwcm9maWxlIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BST0ZJTEUgPSAiY3NzLXByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYSBwcmVmZXJlbmNlIGtleSBiYXNlZCBvbiByZXNvdXJjZVBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0aGUga2V5IHdpbGwgYmUgYmFzZWQgb2ZmIG9mCi0JICogQHJldHVybiBwcmVmZXJlbmNlIGtleSBiYXNlZCBvbiByZXNvdXJjZVBhdGggKGJhc2ljYWxseSB0aGUKLQkgKiAgICAgICAgIHJlc291cmNlUGF0aCB3aXRob3V0IHRoZSBmaWxlbmFtZSk7IFBST0pFQ1RfS0VZIGlmIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgaXMgbnVsbAotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0S2V5Rm9yKElQYXRoIHJlc291cmNlUGF0aCkgewotCQlTdHJpbmcga2V5ID0gUFJPSkVDVF9LRVk7Ci0JCWlmIChyZXNvdXJjZVBhdGggIT0gbnVsbCAmJiByZXNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlrZXkgPSByZXNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcmVmZXJlbmNlcyBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiBwcmVmZXJlbmNlIGtleSAoc3ViTm9kZSkgSWYgY3JlYXRlIGlzIHRydWUsIHRoZSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZQotCSAqIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyB1bmRlcgotCSAqIEBwYXJhbSBwcmVmZXJlbmNlS2V5Ci0JICogICAgICAgICAgICB0aGUgc3Vibm9kZS9jYXRlZ29yeSB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIGxvY2F0ZWQgaW4KLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogICAgICAgICAgICBpZiB0cnVlLCBhIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90Ci0JICogICAgICAgICAgICBhbHJlYWR5IGV4aXN0Ci0JICogQHJldHVybiBQcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogICAgICAgICBwcmVmZXJlbmNlIGtleS4gbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGZvdW5kIGFuZCBjcmVhdGUgaXMKLQkgKiAgICAgICAgIGZhbHNlCi0JICovCi0Jc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwcmVmZXJlbmNlS2V5LCBib29sZWFuIGNyZWF0ZSkgewotCQlpZiAoY3JlYXRlKQotCQkJLy8gY3JlYXRlIGFsbCBub2RlcyBkb3duIHRvIHRoZSBvbmUgd2UgYXJlIGludGVyZXN0ZWQgaW4KLQkJCXJldHVybiBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLmdldE5vZGUoQ1NTQ09SRV9JRCkubm9kZShwcmVmZXJlbmNlS2V5KTsKLQkJLy8gYmUgY2FyZWZ1bCBsb29raW5nIHVwIGZvciBvdXIgbm9kZSBzbyBub3QgdG8gY3JlYXRlIGFueSBub2RlcyBhcwotCQkvLyBzaWRlIGVmZmVjdAotCQlQcmVmZXJlbmNlcyBub2RlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Um9vdE5vZGUoKS5ub2RlKFByb2plY3RTY29wZS5TQ09QRSk7Ci0JCXRyeSB7Ci0JCQkvLyBUT0RPIG9uY2UgYnVnIDkwNTAwIGlzIGZpeGVkLCBzaG91bGQgYmUgYXMgc2ltcGxlIGFzIHRoaXM6Ci0JCQkvLyBTdHJpbmcgcGF0aCA9IHByb2plY3QuZ2V0TmFtZSgpICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMgKyBJUGF0aC5TRVBBUkFUT1IgKwotCQkJLy8gRU5DT0RJTkdfUFJFRl9OT0RFOwotCQkJLy8gcmV0dXJuIG5vZGUubm9kZUV4aXN0cyhwYXRoKSA/IG5vZGUubm9kZShwYXRoKSA6IG51bGw7Ci0JCQkvLyBmb3Igbm93LCB0YWtlIHRoZSBsb25nIHdheQotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMocHJvamVjdC5nZXROYW1lKCkpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShwcm9qZWN0LmdldE5hbWUoKSk7Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhDU1NDT1JFX0lEKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUoQ1NTQ09SRV9JRCk7Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcmVmZXJlbmNlS2V5KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBub2RlLm5vZGUocHJlZmVyZW5jZUtleSk7Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub2RlRXhpc3RzIGZhaWxlZAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCByZXRyaWV2ZSBwcmVmZXJlbmNlIG5vZGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29udGV4dCBpcwotCSAqICAgICAgICAgICAgYXZhaWxhYmxlIGFuZCB0aGUgd29ya3NwYWNlIHNldHRpbmcgc2hvdWxkIGJlIHRha2VuLiBOb3RlCi0JICogICAgICAgICAgICB0aGF0IHBhc3NpbmcgPGNvZGU+bnVsbDwvY29kZT4gc2hvdWxkIGJlIGF2b2lkZWQuCi0JICogQHBhcmFtIHJlY3Vyc2UKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHBhcmVudCBzaG91bGQgYmUgcXVlcmllZCB0aWxsIHByb3BlcnR5IGlzIGZvdW5kCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUga2V5LgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSkgewotCQlTdHJpbmcgdmFsID0gbnVsbDsKLQkJLy8gYm9vbGVhbiBwcmVmZXJlbmNlRm91bmQgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBrZXksIGZhbHNlKTsKLQkJCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCQl2YWwgPSBpbnRlcm5hbEdldFByb3BlcnR5KHJlc291cmNlLCByZWN1cnNlLCBwcmVmZXJlbmNlcyk7Ci0JCQkJCS8vIHByZWZlcmVuY2VGb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIC8vIG5vIHByZWZlcmVuY2VzIGZvdW5kIC0gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsCi0JCS8vIC8vIHNob3J0LWNpcmN1aXQKLQkJLy8gLy8gbG9va3VwIGJ5IGZhbGxpbmcgYmFjayB0byB3b3Jrc3BhY2UncyBkZWZhdWx0Ci0JCS8vIC8vIHNldHRpbmcKLQkJLy8gaWYgKCFwcmVmZXJlbmNlRm91bmQpCi0JCS8vIHZhbCA9IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxHZXRQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHJlc291cmNlICE9IHJlc291cmNlLmdldFByb2plY3QoKSAmJiByZWN1cnNlKSB7Ci0JCQl2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IobnVsbCksIG51bGwpOwotCQl9Ci0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8gLy8gZW5zdXJlIHdlIGRlZmF1bHQgdG8gdGhlIHdvcmtzcGFjZSBwcmVmZXJlbmNlIGlmIG5vbmUgaXMgZm91bmQKLQkJLy8gcmV0dXJuIHZhbHVlID09IG51bGwgPyBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSkgOiB2YWx1ZTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQuIE5vdGUgY29udGV4dCBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGtleS4gSWYgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgaXMgcmVtb3ZlZCBmcm9tIHByb3BlcnRpZXMuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCXByZWZlcmVuY2VzLnJlbW92ZShnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCWVsc2UKLQkJCQkJcHJlZmVyZW5jZXMucHV0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgdmFsdWUpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNhdmUgY2hhbmdlcwotCQkJCQlwcmVmZXJlbmNlcy5mbHVzaCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBDU1NDT1JFX0lELCBJU3RhdHVzLkVSUk9SLCAiVW5hYmxlIHRvIHNldCBwcm9wZXJ0eSIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBXb3JrYmVuY2ggcHJlZmVyZW5jZSBtYXkgbm90IGJlIG5lZWRlZCBzbyBsZWF2ZSBvdXQgZm9yIG5vdwotCQkvLyBqdXN0IHNldCBhIHByZWZlcmVuY2UgaW4gdGhlIGluc3RhbmNlIHNjb3BlCi0JCS8vIGlmICghcHJlZmVyZW5jZUZvdW5kKSB7Ci0JCS8vIHNldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJLy8gfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWE0YjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ1NTQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5CYWNraW5nU3RvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotcHVibGljIGNsYXNzIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciB7Ci0JcHVibGljIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQkJZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIgPSBuZXcgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcigpOwotCQlmSm9iID0gbmV3IENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciBfaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgZlJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci0JQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGZKb2I7Ci0KLQkvKioKLQkgKiBUaGlzIGpvYiBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIHRvIGFsbG93IHRoZSByZXNvdXJjZSBjaGFuZ2UgbGlzdGVuZXIKLQkgKiB0byBzY2hlZHVsZSBvcGVyYXRpb25zIHRoYXQgbmVlZCB0byBtb2RpZnkgdGhlIHdvcmtzcGFjZS4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlckpvYiBleHRlbmRzIEpvYiB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9QRVJUSUVTX1VQREFURV9ERUxBWSA9IDUwMDsKLQkJcHJpdmF0ZSBMaXN0IGFzeW5jQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwdWJsaWMgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iKCkgewotCQkJc3VwZXIoQ1NTQ29yZU1lc3NhZ2VzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZyk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuSU5URVJBQ1RJVkUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkQ2hhbmdlcyhTZXQgbmV3Q2hhbmdlcykgewotCQkJaWYgKG5ld0NoYW5nZXMuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJYXN5bmNDaGFuZ2VzLmFkZEFsbChuZXdDaGFuZ2VzKTsKLQkJCQlhc3luY0NoYW5nZXMubm90aWZ5KCk7Ci0JCQl9Ci0JCQlzY2hlZHVsZShQUk9QRVJUSUVTX1VQREFURV9ERUxBWSk7Ci0JCX0KLQotCQlwdWJsaWMgSVByb2plY3QgZ2V0TmV4dENoYW5nZSgpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuIGFzeW5jQ2hhbmdlcy5pc0VtcHR5KCkgPyBudWxsIDogKElQcm9qZWN0KSBhc3luY0NoYW5nZXMucmVtb3ZlKGFzeW5jQ2hhbmdlcy5zaXplKCkgLSAxKTsKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU11bHRpU3RhdHVzIHJlc3VsdCA9IG5ldyBNdWx0aVN0YXR1cyhDU1NDb250ZW50UHJvcGVydGllcy5DU1NDT1JFX0lELCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgQ1NTQ29yZU1lc3NhZ2VzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9VcGRhdGluZywgbnVsbCk7Ci0JCQltb25pdG9yID0gbW9uaXRvciA9PSBudWxsID8gbmV3IE51bGxQcm9ncmVzc01vbml0b3IoKSA6IG1vbml0b3I7Ci0JCQl0cnkgewotCQkJCW1vbml0b3IuYmVnaW5UYXNrKENTU0NvcmVNZXNzYWdlcy5DU1NDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcsIGFzeW5jQ2hhbmdlcy5zaXplKCkpOwotCQkJCXRyeSB7Ci0JCQkJCUlQcm9qZWN0IG5leHQ7Ci0JCQkJCXdoaWxlICgobmV4dCA9IGdldE5leHRDaGFuZ2UoKSkgIT0gbnVsbCkgewotCQkJCQkJLy8ganVzdCBleGl0IGlmIHRoZSBzeXN0ZW0gaXMgc2h1dHRpbmcgZG93biBvciBoYXMKLQkJCQkJCS8vIGJlZW4gc2h1dCBkb3duCi0JCQkJCQkvLyBpdCBpcyB0b28gbGF0ZSB0byBjaGFuZ2UgdGhlIHdvcmtzcGFjZSBhdCB0aGlzCi0JCQkJCQkvLyBwb2ludCBhbnl3YXkKLQkJCQkJCWlmIChQbGF0Zm9ybS5nZXRCdW5kbGUoIm9yZy5lY2xpcHNlLm9zZ2kiKS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5BQ1RJVkUpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gc2F2ZSB0aGUgcHJlZmVyZW5jZXMgbm9kZXMKLQkJCQkJCQlpZiAobmV4dC5pc0FjY2Vzc2libGUoKSkgewotCQkJCQkJCQkvLyBzYXZlIGNzcyBwcm9maWxlIHByZWZlcmVuY2VzCi0JCQkJCQkJCVByZWZlcmVuY2VzIHByb2plY3RQcmVmcyA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKG5leHQsIENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBmYWxzZSk7Ci0JCQkJCQkJCWlmIChwcm9qZWN0UHJlZnMgIT0gbnVsbCkKLQkJCQkJCQkJCXByb2plY3RQcmVmcy5mbHVzaCgpOwotCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gd2UgZ290IGFuIGVycm9yIHNhdmluZwotCQkJCQkJCVN0cmluZyBkZXRhaWxNZXNzYWdlID0gTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcl9Qcm9ibGVtc19VcGRhdGluZywgbmV4dC5nZXRGdWxsUGF0aCgpKTsKLQkJCQkJCQlyZXN1bHQuYWRkKG5ldyBTdGF0dXMoMSA8PCAoSVJlc291cmNlU3RhdHVzLkZBSUxFRF9TRVRUSU5HX0NIQVJTRVQgJSAxMDAgLyAzMyksIFJlc291cmNlc1BsdWdpbi5QSV9SRVNPVVJDRVMsIElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VULCBkZXRhaWxNZXNzYWdlLCBlKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJCWNhdGNoIChPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9uaXRvci5kb25lKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2Ijc2hvdWxkUnVuKCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZFJ1bigpIHsKLQkJCXN5bmNocm9uaXplZCAoYXN5bmNDaGFuZ2VzKSB7Ci0JCQkJcmV0dXJuICFhc3luY0NoYW5nZXMuaXNFbXB0eSgpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NFbnRyeUNoYW5nZXMoSVJlc291cmNlRGVsdGEgcHJvamVjdERlbHRhLCBTZXQgcHJvamVjdHNUb1NhdmUpIHsKLQkJCS8vIGNoZWNrIGVhY2ggcmVzb3VyY2Ugd2l0aCBjc3MgY29udGVudCBzZXR0aW5nIHRvIHNlZSBpZiBpdCBoYXMKLQkJCS8vIGJlZW4gbW92ZWQvZGVsZXRlZAotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gcHJvamVjdCBhZmZlY3RlZAotCQkJSVByb2plY3QgY3VycmVudFByb2plY3QgPSAoSVByb2plY3QpIHByb2plY3REZWx0YS5nZXRSZXNvdXJjZSgpOwotCi0JCQlyZXNvdXJjZUNoYW5nZXMgPSBwcm9jZXNzUHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBwcm9qZWN0RGVsdGEsIHByb2plY3RzVG9TYXZlKTsKLQotCQkJLy8gaWYgdGhlcmUgd2FzIGEgcHJlZmVyZW5jZSBrZXkgY2hhbmdlLCBuZWVkIHRvIHNhdmUgcHJlZmVyZW5jZXMKLQkJCWlmIChyZXNvdXJjZUNoYW5nZXMpCi0JCQkJcHJvamVjdHNUb1NhdmUuYWRkKGN1cnJlbnRQcm9qZWN0KTsKLQkJfQotCi0JCS8qKgotCQkgKiBHb2VzIHRocm91Z2ggYWxsIHRoZSByZXNvdXJjZS1kZXBlbmRlbnQgcHJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoCi0JCSAqIGN1cnJlbnRQcm9qZWN0ICYga2V5IGFuZCB1cGRhdGVzIHRoZSBwcmVmZXJlbmNlIGtleXMgaWYgbmVlZGVkCi0JCSAqIGJhc2VkIG9uIHByb2plY3REZWx0YQotCQkgKiAKLQkJICogQHBhcmFtIGN1cnJlbnRQcm9qZWN0Ci0JCSAqICAgICAgICAgICAgY3VycmVudCBwcm9qZWN0IG9mIHRoZSBwcmVmZXJlbmNlcyB0byBiZSBsb29rZWQgYXQKLQkJICogQHBhcmFtIGtleQotCQkgKiAgICAgICAgICAgIGN1cnJlbnQga2V5L3N1YmNhdGVnb3J5IG9mIHRoZSBwcmVmZXJlbmNlcyB0byBiZSBsb29rZWQKLQkJICogICAgICAgICAgICBhdAotCQkgKiBAcGFyYW0gcHJvamVjdERlbHRhCi0JCSAqICAgICAgICAgICAgdGhlIGNoYW5nZXMgdG8gcHJvY2VzcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGFnYWluc3QKLQkJICogQHBhcmFtIHByb2plY3RzVG9TYXZlCi0JCSAqICAgICAgICAgICAgdGhlIHByb2plY3RzIHRoYXQgbmVlZCB0byBiZSB1cGRhdGVkL3NhdmVkCi0JCSAqIEByZXR1cm4gdHJ1ZSBpZiBjdXJyZW50UHJvamVjdCdzIHByZWZlcmVuY2VzIHdlcmUgbW9kaWZpZWQKLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBwcm9jZXNzUHJlZmVyZW5jZXMoSVByb2plY3QgY3VycmVudFByb2plY3QsIFN0cmluZyBrZXksIElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQlib29sZWFuIHJlc291cmNlQ2hhbmdlcyA9IGZhbHNlOwotCi0JCQkvLyBnZXQgdGhlIHByb2plY3Qta2V5IHByZWZlcmVuY2Ugbm9kZQotCQkJUHJlZmVyZW5jZXMgcHJvamVjdFByZWZzID0gQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0UHJlZmVyZW5jZXMoY3VycmVudFByb2plY3QsIGtleSwgZmFsc2UpOwotCQkJaWYgKHByb2plY3RQcmVmcyA9PSBudWxsKQotCQkJCS8vIG5vIHByZWZlcmVuY2VzIGZvciB0aGlzIHByb2plY3Qta2V5LCBqdXN0IGJhaWwKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlTdHJpbmdbXSBhZmZlY3RlZFJlc291cmNlczsKLQkJCXRyeSB7Ci0JCQkJYWZmZWN0ZWRSZXNvdXJjZXMgPSBwcm9qZWN0UHJlZnMua2V5cygpOwotCQkJfQotCQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gcHJvYmxlbXMgd2l0aCB0aGUgcHJvamVjdCBzY29wZS4uLiB3ZSBnb25uYSBtaXNzIHRoZQotCQkJCS8vIGNoYW5nZXMgKGJ1dCB3aWxsIGxvZykKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiUHJvYmxlbSByZXRyZWl2aW5nIEpTUCBGcmFnbWVudCBwcmVmZXJlbmNlcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggcHJlZmVyZW5jZSBrZXkgKHdoaWNoIGlzIHJlYWxseSBhIGZpbGUgbmFtZSkKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYWZmZWN0ZWRSZXNvdXJjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBzZWUgaWYgcHJlZmVyZW5jZSBrZXkvZmlsZSBuYW1lIHdhcyBmaWxlIHRoYXQgd2FzIGNoYW5nZWQKLQkJCQlJUmVzb3VyY2VEZWx0YSBtZW1iZXJEZWx0YSA9IHByb2plY3REZWx0YS5maW5kTWVtYmVyKG5ldyBQYXRoKGFmZmVjdGVkUmVzb3VyY2VzW2ldKSk7Ci0JCQkJLy8gbm8gY2hhbmdlcyBmb3IgdGhlIGdpdmVuIHJlc291cmNlCi0JCQkJaWYgKG1lbWJlckRlbHRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChtZW1iZXJEZWx0YS5nZXRLaW5kKCkgPT0gSVJlc291cmNlRGVsdGEuUkVNT1ZFRCkgewotCQkJCQlyZXNvdXJjZUNoYW5nZXMgPSB0cnVlOwotCQkJCQkvLyByZW1vdmUgdGhlIHNldHRpbmcgZm9yIHRoZSBvcmlnaW5hbCBsb2NhdGlvbgotCQkJCQlTdHJpbmcgY3VycmVudFZhbHVlID0gcHJvamVjdFByZWZzLmdldChhZmZlY3RlZFJlc291cmNlc1tpXSwgbnVsbCk7Ci0JCQkJCXByb2plY3RQcmVmcy5yZW1vdmUoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pOwotCQkJCQlpZiAoKG1lbWJlckRlbHRhLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5NT1ZFRF9UTykgIT0gMCkgewotCQkJCQkJLy8gaWYgbW92aW5nLCBjb3B5IHRoZSBzZXR0aW5nIGZvciB0aGUgbmV3IGxvY2F0aW9uCi0JCQkJCQlJUHJvamVjdCB0YXJnZXRQcm9qZWN0ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkuc2VnbWVudCgwKSk7Ci0JCQkJCQlQcmVmZXJlbmNlcyB0YXJnZXRQcmVmcyA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKHRhcmdldFByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJCQl0YXJnZXRQcmVmcy5wdXQoQ1NTQ29udGVudFByb3BlcnRpZXMuZ2V0S2V5Rm9yKG1lbWJlckRlbHRhLmdldE1vdmVkVG9QYXRoKCkpLCBjdXJyZW50VmFsdWUpOwotCQkJCQkJaWYgKHRhcmdldFByb2plY3QgIT0gY3VycmVudFByb2plY3QpCi0JCQkJCQkJcHJvamVjdHNUb1NhdmUuYWRkKHRhcmdldFByb2plY3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc291cmNlQ2hhbmdlczsKLQkJfQotCi0JCS8qKgotCQkgKiBGb3IgYW55IGNoYW5nZSB0byB0aGUgZW5jb2RpbmcgZmlsZSBvciBhbnkgcmVzb3VyY2Ugd2l0aCBlbmNvZGluZwotCQkgKiBzZXQsIGp1c3QgZGlzY2FyZCB0aGUgY2FjaGUgZm9yIHRoZSBjb3JyZXNwb25kaW5nIHByb2plY3QuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZXNvdXJjZUNoYW5nZWQoSVJlc291cmNlQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJCUlSZXNvdXJjZURlbHRhIGRlbHRhID0gZXZlbnQuZ2V0RGVsdGEoKTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUlSZXNvdXJjZURlbHRhW10gcHJvamVjdERlbHRhcyA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCS8vIHByb2Nlc3MgZWFjaCBwcm9qZWN0IGluIHRoZSBkZWx0YQotCQkJU2V0IHByb2plY3RzVG9TYXZlID0gbmV3IEhhc2hTZXQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdERlbHRhcy5sZW5ndGg7IGkrKykKLQkJCQkvLyBub3RoaW5nIHRvIGRvIGlmIGEgcHJvamVjdCBoYXMgYmVlbiBhZGRlZC9yZW1vdmVkL21vdmVkCi0JCQkJaWYgKHByb2plY3REZWx0YXNbaV0uZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgKHByb2plY3REZWx0YXNbaV0uZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk9QRU4pID09IDApCi0JCQkJCXByb2Nlc3NFbnRyeUNoYW5nZXMocHJvamVjdERlbHRhc1tpXSwgcHJvamVjdHNUb1NhdmUpOwotCQkJZkpvYi5hZGRDaGFuZ2VzKHByb2plY3RzVG9TYXZlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc3RhcnR1cCgpIHsKLQkJX2luc3RhbmNlID0gbmV3IENTU0NvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlcigpOwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIsIElSZXNvdXJjZUNoYW5nZUV2ZW50LlBPU1RfQ0hBTkdFKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHNodXRkb3duKCkgewotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihfaW5zdGFuY2UuZlJlc291cmNlQ2hhbmdlTGlzdGVuZXIpOwotCQlfaW5zdGFuY2UgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWZiNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm8gbWVhbnMgbWVhbnQgdG8gYmUKLSAqIGdlbmVyYWwgcHVycG9zZS4gSXRzIHVzZSBpcyByZXN0cmljdGVkIHRvIHRob3NlIGNhc2VzIHdoZXJlIHRoZSBpbnB1dAotICogc3RyZWFtIGNhbiBiZSByZWdhcmRlZCBhcyBhc2NpaSBqdXN0IGxvbmcgZW5vdWdoIHRvIGRldGVybWluZSB3aGF0IHRoZSByZWFsCi0gKiBlbmNvZGluZyBzaG91bGQgYmUuCi0gKi8KLQotcHVibGljIGNsYXNzIEJ5dGVSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IENvZGVkSU8uTUFYX0JVRl9TSVpFOwotCi0JcHJvdGVjdGVkIGJ5dGVbXSBmQnVmZmVyOwotCi0JcHJvdGVjdGVkIElucHV0U3RyZWFtIGZJbnB1dFN0cmVhbTsKLQotCXByb3RlY3RlZCBCeXRlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXRoaXMoaW5wdXRTdHJlYW0sIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBzaXplKSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGhpcy5mQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLmNsb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCgpOwotCQlyZXR1cm4gKGIwICYgMHgwMEZGKTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjaFtdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobGVuZ3RoID4gdGhpcy5mQnVmZmVyLmxlbmd0aCkgewotCQkJbGVuZ3RoID0gdGhpcy5mQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQodGhpcy5mQnVmZmVyLCAwLCBsZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaW50IGIwID0gdGhpcy5mQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLmF2YWlsYWJsZSgpID4gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLnJlc2V0KCk7Ci0JfQotCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkYThjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMS8yNy8wNCA2OjQyIFBNICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSA8YQotICogaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleCA8L2E+IDEuMi4yCi0gKiBvbiAxLzI3LzA0IDY6NDIgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIENTU0hlYWRUb2tlbml6ZXIgewotCi0JLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotCS8qKiBsZXhpY2FsIHN0YXRlcyAqLwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDEwOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBDSEFSU0VUX1JVTEUgPSA0OwotCi0JLyoqCi0JICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLQkgKiBZWV9MRVhTVEFURVtsKzFdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsIGF0IHRoZQotCSAqIGJlZ2lubmluZyBvZiBhIGxpbmUgbCBpcyBvZiB0aGUgZm9ybSBsID0gMiprLCBrIGEgbm9uIG5lZ2F0aXZlIGludGVnZXIKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHswLCAxLCAyLCAyLCAzLCAzLCA0LCA0LCA1LCA1LCA2LCA2LCA3LCA3fTsKLQotCS8qKgotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gIlwxMVwwXDFcNlwxXDExXDJcMFwxXDEwXDIyXDBcMVw2XDFcMFwxXDM2XDJcMCIgKyAiXDFcNDFcMVwwXDFcMzdcN1wwXDFcNDBcMTNcMFwxXDM1XDFcMTJcMVw3XDFcMzQiICsgIlwxXDEzXDFcMTdcMVwyMlwxXDBcMVwyMFwxXDMxXDFcMjVcMVwwXDFcMzNcMVwyMSIgKyAiXDFcMzJcMlwwXDFcMTZcMVwxNVwxXDI3XDFcMzBcMlwwXDFcMjNcMVwyNFwxXDI2IiArICJcM1wwXDFcMTRcMTBcMFwxXDIyXDFcMFwxXDIwXDFcMzFcMVwyNVwxXDBcMVwzMyIgKyAiXDFcMjFcMVwzMlwyXDBcMVwxNlwxXDE1XDFcMjdcMVwzMFwyXDBcMVwyM1wxXDI0IiArICJcMVwyNlwzXDBcMVwxNFwxMDJcMFwxXDRcM1wwXDFcNVwxN1wwXDFcM1wxNlwwIiArICJcMVwxXDIwXDBcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLQkvKioKLQkgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLQkgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBjaGFyW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotCS8qIGVycm9yIGNvZGVzICovCi0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1VOS05PV05fRVJST1IgPSAwOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotCS8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7IlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLCAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UifTsKLQotCS8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCXByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0JLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQlwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JLyoqCi0JICogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcyB0aGUgc291cmNlCi0JICogb2YgdGhlIHl5dGV4dCgpIHN0cmluZwotCSAqLwotCXByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0JLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0JLyoqCi0JICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkIGZyb20KLQkgKiBpbnB1dAotCSAqLwotCXByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLQotCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQlwcml2YXRlIGludCB5eWNoYXI7Ci0KLQotCS8qKgotCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+dGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYQotCSAqIGxpbmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLQkvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT50aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0JLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotCS8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCi0JcHVibGljIENTU0hlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIGluKSB7Ci0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJeXlfcmVhZGVyID0gaW47Ci0KLQkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0JCS8qCi0JCSAqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMgdGhlCi0JCSAqIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nCi0JCSAqLwotCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikgMCk7Ci0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQkJeXlfbWFya2VkUG9zID0gMDsKLQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9zdGFydFJlYWQgPSAwOwotCi0JCS8qKgotCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkJICogZnJvbSBpbnB1dAotCQkgKi8KLQkJeXlfZW5kUmVhZCA9IDA7Ci0KLQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQotCi0JCS8qKgotCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PnRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKLQkJICogbGluZQotCQkgKi8KLQkJeXlfYXRCT0wgPSBmYWxzZTsKLQotCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCQlmU3RhdGVTdGFjay5jbGVhcigpOwotCi0JCWhhc01vcmUgPSB0cnVlOwotCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLQotCi0JfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIgVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZgotCSAqIHRoaXMgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGluCi0JICogICAgICAgICAgICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JCXRoaXMueXlfcmVhZGVyID0gaW47Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcwotCSAqIGNvbnN0cnVjdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpbgotCSAqICAgICAgICAgICAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQkJdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBwYWNrZWQKLQkgKiAgICAgICAgICAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICogQHJldHVybiB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLQkJY2hhcltdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotCQlpbnQgaSA9IDA7IC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgKi8KLQkJaW50IGogPSAwOyAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotCQl3aGlsZSAoaSA8IDE1OCkgewotCQkJaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLQkJCWRvCi0JCQkJbWFwW2orK10gPSB2YWx1ZTsKLQkJCXdoaWxlICgtLWNvdW50ID4gMCk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQotCS8qKgotCSAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUgZW5kIG9mIHRoZQotCSAqICAgICAgICAgc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogQGV4Y2VwdGlvbiBJT0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCQkvKiBzdGFuZGFyZCBjYXNlICovCi0JCWlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkKLQkJCXJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotCQkvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovCi0JCWlmICh5eV9hdEVPRikKLQkJCXJldHVybiBZWUVPRjsKLQotCQkvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotCQkvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotCQlpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfYnVmZmVyLCAwLCB5eV9lbmRSZWFkIC0geXlfc3RhcnRSZWFkKTsKLQotCQkJLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLQkJCXl5X2VuZFJlYWQgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfY3VycmVudFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9tYXJrZWRQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfcHVzaGJhY2tQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfc3RhcnRSZWFkID0gMDsKLQkJfQotCi0JCS8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJLyogaWYgbm90OiBibG93IGl0IHVwICovCi0JCQljaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0JCQl5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0JCX0KLQotCQkvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLQkJaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIHl5X2J1ZmZlci5sZW5ndGggLSB5eV9lbmRSZWFkKTsKLQotCQlpZiAobnVtUmVhZCA9PSAtMSkKLQkJCXJldHVybiBZWUVPRjsKLQotCQl5eV9lbmRSZWFkICs9IG51bVJlYWQ7Ci0KLQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCX0KLQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJeXlfYXRFT0YgPSB0cnVlOyAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotCQl5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAqLwotCQl5eV9yZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0JCXJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotCX0KLQotCS8qKgotCSAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXRlCi0JICogICAgICAgICAgICB0aGUgbmV3IGxleGljYWwgc3RhdGUKLQkgKi8KLQlmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotCQl5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotCSAqLwotCWZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotCQlyZXR1cm4gbmV3IFN0cmluZyh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zIC0geXlfc3RhcnRSZWFkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0JICovCi0JZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLQkJcmV0dXJuIHl5X21hcmtlZFBvcyAtIHl5X3N0YXJ0UmVhZDsKLQl9Ci0KLQotCS8qKgotCSAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvckNvZGUKLQkgKiAgICAgICAgICAgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotCSAqLwotCXByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotCQl0cnkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLQkJfQotCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotCQl9Ci0KLQkJU3lzdGVtLmV4aXQoMSk7Ci0JfQotCi0KLQkvKioKLQkgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLQkgKiAKLQkgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG51bWJlcgotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uIFRoaXMgbnVtYmVyIG11c3QKLQkgKiAgICAgICAgICAgIG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLQkgKi8KLQlwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0JCWlmIChudW1iZXIgPiB5eWxlbmd0aCgpKQotCQkJeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0JCXl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBDb250YWlucyB1c2VyIEVPRi1jb2RlLCB3aGljaCB3aWxsIGJlIGV4ZWN1dGVkIGV4YWN0bHkgb25jZSwgd2hlbiB0aGUKLQkgKiBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHl5X2RvX2VvZigpIHsKLQkJaWYgKCF5eV9lb2ZfZG9uZSkgewotCQkJeXlfZW9mX2RvbmUgPSB0cnVlOwotCQkJaGFzTW9yZSA9IGZhbHNlOwotCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsIHRoZSBlbmQKLQkgKiBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5leHQgdG9rZW4KLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWludCB5eV9pbnB1dDsKLQkJaW50IHl5X2FjdGlvbjsKLQotCi0JCXdoaWxlICh0cnVlKSB7Ci0KLQkJCXl5Y2hhciArPSB5eWxlbmd0aCgpOwotCi0JCQl5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXSA9PSAnXG4nOwotCQkJaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zIC0gMV0gPT0gJ1xyJykgewotCQkJCXl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0JCQkJaWYgKCF5eV9hdEVPRikKLQkJCQkJeXlfY3VycmVudFBvcy0tOwotCQkJfQotCi0JCQl5eV9hY3Rpb24gPSAtMTsKLQotCQkJeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotCQkJaWYgKHl5X2F0Qk9MKQotCQkJCXl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSArIDFdOwotCQkJZWxzZQotCQkJCXl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotCQkJeXlfZm9yQWN0aW9uIDogewotCQkJCXdoaWxlICh0cnVlKSB7Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLQkJCQkJaWYgKHl5X2lucHV0ID09IFlZRU9GKQotCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0JCQkJCXl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotCQkJCQlib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0JCQkJCXl5X2Zvck5leHQgOiB7Ci0JCQkJCQlzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0JCQkJCQkJY2FzZSAwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDExOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMwIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMwIDoKLQkJCQkJCQkJCWNhc2UgMzEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyMCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDM2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTAgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMTUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzNyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAzOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTIgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0NyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0OCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0OSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDU4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA1OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA2MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDU5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQl5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHl5X2lzRmluYWwpIHsKLQkJCQkJCXl5X2FjdGlvbiA9IHl5X3N0YXRlOwotCQkJCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJCQkJCWlmICh5eV9ub0xvb2tBaGVhZCkKLQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCi0JCQlzd2l0Y2ggKHl5X2FjdGlvbikgewotCi0JCQkJY2FzZSA0NSA6IHsKLQkJCQkJeXlwdXNoYmFjaygyKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDY1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNSA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDY2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxOSA6Ci0JCQkJY2FzZSAyMCA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7Ci0JCQkJCXN0cmluZy5zZXRMZW5ndGgoMCk7Ci0JCQkJfQotCQkJCWNhc2UgNjcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE4IDogewotCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuUnVsZUVuZDsKLQkJCQl9Ci0JCQkJY2FzZSA2OCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzIgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA2OSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDQgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMik7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA3MCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNjEgOiB7Ci0JCQkJCWlmICh5eWNoYXIgPT0gMCkgewotCQkJCQkJeXliZWdpbihDSEFSU0VUX1JVTEUpOwotCQkJCQkJcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhc2UgNzEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDU2IDogewotCQkJCQlpZiAoeXljaGFyID09IDApIHsKLQkJCQkJCXl5YmVnaW4oU1RfWE1MRGVjbCk7Ci0JCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2FzZSA3MiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgOCA6Ci0JCQkJY2FzZSA5IDoKLQkJCQljYXNlIDEwIDoKLQkJCQljYXNlIDExIDoKLQkJCQljYXNlIDEyIDoKLQkJCQljYXNlIDEzIDoKLQkJCQljYXNlIDE0IDoKLQkJCQljYXNlIDE1IDoKLQkJCQljYXNlIDE2IDoKLQkJCQljYXNlIDIxIDogewotCQkJCQlpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHsKLQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXNlIDczIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MSA6IHsKLQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOwotCQkJCX0KLQkJCQljYXNlIDc0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MyA6IHsKLQkJCQkJcHVzaEN1cnJlbnRTdGF0ZSgpOwotCQkJCQl5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsKLQkJCQkJcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7Ci0JCQkJfQotCQkJCWNhc2UgNzUgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMgOgotCQkJCWNhc2UgMTcgOiB7Ci0JCQkJCXB1c2hDdXJyZW50U3RhdGUoKTsKLQkJCQkJeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7Ci0JCQkJfQotCQkJCWNhc2UgNzYgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ2IDogewotCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007Ci0JCQkJfQotCQkJCWNhc2UgNzcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMzIDogewotCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOwotCQkJCX0KLQkJCQljYXNlIDc4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzNCA6IHsKLQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsKLQkJCQl9Ci0JCQkJY2FzZSA3OSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjQgOgotCQkJCWNhc2UgMjYgOgotCQkJCWNhc2UgMjkgOiB7Ci0JCQkJCXN0cmluZy5hcHBlbmQoeXl0ZXh0KCkpOwotCQkJCX0KLQkJCQljYXNlIDgwIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMyA6IHsKLQkJCQkJeXliZWdpbihTUV9TVFJJTkcpOwotCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCX0KLQkJCQljYXNlIDgxIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyMiA6IHsKLQkJCQkJeXliZWdpbihEUV9TVFJJTkcpOwotCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCX0KLQkJCQljYXNlIDgyIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyNyA6IHsKLQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCX0KLQkJCQljYXNlIDgzIDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyOCA6IHsKLQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA4NCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzAgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA4NSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMzEgOiB7Ci0JCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLQkJCQl9Ci0JCQkJY2FzZSA4NiA6Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLQkJCQkJCXl5X2F0RU9GID0gdHJ1ZTsKLQkJCQkJCXl5X2RvX2VvZigpOwotCQkJCQkJewotCQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLQkJCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLQkgKiAKLQkgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuIEl0IHByaW50cwotCSAqIGVhY2ggcmV0dXJuZWQgdG9rZW4gdG8gU3lzdGVtLm91dCB1bnRpbCB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZCwgb3IKLQkgKiBhbiBlcnJvciBvY2N1cmVkLgotCSAqIAotCSAqIEBwYXJhbSBhcmd2Ci0JICogICAgICAgICAgICB0aGUgY29tbWFuZCBsaW5lLCBjb250YWlucyB0aGUgZmlsZW5hbWVzIHRvIHJ1biB0aGUgc2Nhbm5lcgotCSAqICAgICAgICAgICAgb24uCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLQkJCUNTU0hlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNjYW5uZXIgPSBuZXcgQ1NTSGVhZFRva2VuaXplcihuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIiArIGFyZ3ZbaV0gKyAiXCIiKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIENTU0hlYWRUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQotCQkJdHJ5IHsKLQkJCQlkbyB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0JCQkJfQotCQkJCXdoaWxlICghc2Nhbm5lci55eV9hdEVPRik7Ci0KLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQl9Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTQ0NmM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzIHsKLQotCVN0cmluZyBSdWxlRW5kID0gIlJ1bGVFbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIENIQVJTRVRfUlVMRSA9ICJDSEFSU0VUX1JVTEUiOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9DU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZiNmU2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQljbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JCS8qKgotCQkgKiAKLQkJICovCi0JCXB1YmxpYyBOdWxsTWVtZW50bygpIHsKLQkJCXN1cGVyKCk7Ci0JCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCQlzZXRKYXZhQ2hhcnNldE5hbWUoZGVmYXVsdENoYXJzZXQpOwotCQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgQ1NTSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0JcHJpdmF0ZSBib29sZWFuIGZIZWFkZXJQYXJzZWQ7Ci0JcHJpdmF0ZSBSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqIFRoZXJlIGlzIG5vIHNwZWMgZGVmaW5lZCBlbmNvZGluZyBmb3IgQ1NTLCBzbyBOdWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gc2hvdWxkIG1hdGNoIHdoYXQncyBpbiBwbHVnaW4ueG1sIChvciBsb29rIGl0IHVwIGZyb20gdGhlcmUpLgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCXJldHVybiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBDU1NIZWFkVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBDU1NIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzTGVnYWxTdHJpbmcoU3RyaW5nIHZhbHVlVG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICh2YWx1ZVRva2VuVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQljaGVja0luQ29udGVudHMoKTsKLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJY2hlY2tIZXVyaXN0aWNzKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tJbkNvbnRlbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJQ1NTSGVhZFRva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJdG9rZW5pemVyLnJlc2V0KGZSZWFkZXIpOwotCQlIZWFkUGFyc2VyVG9rZW4gdG9rZW4gPSBudWxsOwotCQlTdHJpbmcgdG9rZW5UeXBlID0gbnVsbDsKLQkJZG8gewotCQkJdG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQl0b2tlblR5cGUgPSB0b2tlbi5nZXRUeXBlKCk7Ci0JCQlpZiAoY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKHRva2VuVHlwZSkpIHsKLQkJCQkvLyBzaWRlIGVmZmVjdCBvZiBjYW5IYW5kbGUgaXMgdG8gY3JlYXRlIGFwcHJvcHJpYXRlIG1lbWVudG8KLQkJCX0KLQkJCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBDU1NIZWFkVG9rZW5pemVyQ29uc3RhbnRzLkNIQVJTRVRfUlVMRSkgewotCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCUhlYWRQYXJzZXJUb2tlbiB2YWx1ZVRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQlTdHJpbmcgdmFsdWVUb2tlblR5cGUgPSB2YWx1ZVRva2VuLmdldFR5cGUoKTsKLQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodmFsdWVUb2tlblR5cGUpKSB7Ci0JCQkJCQljcmVhdGVFbmNvZGluZ01lbWVudG8odmFsdWVUb2tlbi5nZXRUZXh0KCksIEVuY29kaW5nTWVtZW50by5GT1VORF9FTkNPRElOR19JTl9DT05URU5UKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0hldXJpc3RpY3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIG5vSGV1cmlzdGljID0gZmFsc2U7Ci0JCVN0cmluZyBoZXVyaXN0aWNFbmNvZGluZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCQlieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVszXTsKLQkJCWludCBuUmVhZCA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGZSZWFkZXIucmVhZHkoKSkgewotCQkJCQlpbnQgb25lQnl0ZSA9IGZSZWFkZXIucmVhZCgpOwotCQkJCQluUmVhZCsrOwotCQkJCQlpZiAob25lQnl0ZSA8PSAweEZGKSB7Ci0JCQkJCQlieXRlc1tpXSA9IChieXRlKSBvbmVCeXRlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJbm9IZXVyaXN0aWMgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlub0hldXJpc3RpYyA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghbm9IZXVyaXN0aWMgJiYgblJlYWQgPT0gMykgewotCQkJCWhldXJpc3RpY0VuY29kaW5nID0gRW5jb2RpbmdHdWVzc2VyLmd1ZXNzRW5jb2RpbmcoYnl0ZXMsIDMpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBhbnkgSU8gZXhjZXB0aW9uLCB0aGVuIG5vdCBhIGhldXJpc3RpYyBjYXNlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCX0KLQkJaWYgKGhldXJpc3RpY0VuY29kaW5nICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhoZXVyaXN0aWNFbmNvZGluZywgRW5jb2RpbmdNZW1lbnRvLkdVRVNTRURfRU5DT0RJTkdfRlJPTV9TVFJFQU0pOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVFbmNvZGluZ01lbWVudG8oU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChkZXRlY3RlZENoYXJzZXROYW1lKSk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIGNvbnZpZW5jZSBtZXRob2QgYWxsIHN1YmNsYXNzZXMgY2FuIHVzZSAoYnV0IG5vdCBvdmVycmlkZSkKLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEBwYXJhbSByZWFzb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCQkvLyBOb3RlOiB0aGVyZSBpcyBhICJoaWRkZW4gYXNzdW1wdGlvbiIgaGVyZQotCQkJLy8gdGhhdCBhbiBlbXB0eQotCQkJLy8gc3RyaW5nIGluIGNvbnRlbnQgc2hvdWxkIGJlIHRyZWF0ZWQgc2FtZSBhcwotCQkJLy8gbm90IHByZXNlbnQuCi0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJaGFuZGxlU3BlY0RlZmF1bHQoKTsKLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkvLyBzYWZ0eSBuZXQKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgTnVsbE1lbWVudG8oKTsKLQkJfQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldFNwZWNEZWZhdWx0RW5jb2RpbmdNZW1lbnRvKCkgewotCQlyZXNldEFsbCgpOwotCQlFbmNvZGluZ01lbWVudG8gcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVGQVVMVFNfQVNTVU1FRF9GT1JfRU1QVFlfSU5QVVQpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZW5jKTsKLQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlU3BlY0RlZmF1bHQoKSB7Ci0JCVN0cmluZyBlbmNvZGluZ05hbWU7Ci0JCWVuY29kaW5nTmFtZSA9IGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsKSB7Ci0JCQkvLyBjcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IG5ldyBCeXRlUmVhZGVyKGlucHV0U3RyZWFtKTsKLQkJdHJ5IHsKLQkJCWZSZWFkZXIubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSBrbm93IEJ5dGVSZWFkZXIKLQkJCS8vIHN1cHBvcnRzIG1hcmtpbmcKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlyZXNldEFsbCgpOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IGlTdG9yYWdlLmdldENvbnRlbnRzKCk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpOwotCQlyZXNldHRhYmxlU3RyZWFtLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJc2V0KHJlc2V0dGFibGVTdHJlYW0pOwotCQkvLyBUT0RPIHdlJ2xsIG5lZWQgdG8gInJlbWVtYmVyIiBJRmlsZSwgb3IKLQkJLy8gZ2V0IGl0cyAob3IgaXRzIHByb2plY3Qncykgc2V0dGluZ3MsIGluIGNhc2UKLQkJLy8gdGhvc2UgYXJlIG5lZWRlZCB0byBoYW5kbGUgY2FzZXMgd2hlbiB0aGUKLQkJLy8gZW5jb2RpbmcgaXMgbm90IGluIHRoZSBmaWxlIHN0cmVhbS4KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTA2NTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnREZXNjcmliZXJGb3JDU1MgaW1wbGVtZW50cyBJVGV4dENvbnRlbnREZXNjcmliZXIgewotCWZpbmFsIHByaXZhdGUgc3RhdGljIFF1YWxpZmllZE5hbWVbXSBTVVBQT1JURURfT1BUSU9OUyA9IHtJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUfTsKLQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoSW5wdXRTdHJlYW0gY29udGVudHMsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhjb250ZW50cywgZGVzY3JpcHRpb24pOwotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZGVzY3JpYmUoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlVmFsaWRpdHkoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJLy8gY3VycmVudGx5IG5vIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZGlsdHkKLQkJLy8gYmFzZWQgb24gY29udGVudHMuCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgaW50IGNvbXB1dGVWYWxpZGl0eShSZWFkZXIgcmVhZGVyKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWRpbHR5Ci0JCS8vIGJhc2VkIG9uIGNvbnRlbnRzLgotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBnZXREZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vIFRPRE86IEkgbmVlZCB0byB2ZXJpZnkgdG8gc2VlIGlmIHRoaXMgQk9NIHdvcmsgaXMgYWx3YXlzIGRvbmUKLQkJLy8gYnkgdGV4dCB0eXBlLgotCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJaWYgKGRldGVjdGVkQnl0ZU9yZGVyTWFyayAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdCeXRlT3JkZXJNYXJrID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsIG1heQotCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJaWYgKCFkZXRlY3RlZEJ5dGVPcmRlck1hcmsuZXF1YWxzKGV4aXN0aW5nQnl0ZU9yZGVyTWFyaykpCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkssIGRldGVjdGVkQnl0ZU9yZGVyTWFyayk7Ci0JCX0KLQotCi0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSkgewotCQkJLy8gbm90ZTogYWZ0ZXIgc2V0dGluZyBoZXJlLCBpdHMgdGhlIG1lcmUgcHJlc2VuY2Ugb2YKLQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkvLyBpbiB0aGUgcmVzb3VyY2UncyBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZgotCQkJLy8gaW52YWxpZAotCQkJLy8gaW4gdGhvc2UgY2FzZXMsIHRoZSAiZGV0ZWN0ZWQiIHByb3BlcnR5IGNvbnRhaW5zIGFuCi0JCQkvLyAiYXBwcm9wcmlhdGUgZGVmYXVsdCIgdG8gdXNlLgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCwgZW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpKTsKLQkJfQotCi0JCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlPYmplY3QgamF2YUNoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCk7Ci0KLQkJLy8gd2UgYWx3YXlzIGluY2x1ZGUgZGV0ZWN0ZWQsIGlmIGl0cyBkaWZmZXJlbnQgdGhhbiBqYXZhCi0JCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCWlmIChqYXZhQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgZXhpc3RpbmdDaGFyc2V0ID0gZGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKTsKLQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbWF5IG5lZWQgdG8gYWRkIHdoYXQgd2UgZm91bmQsIGJ1dCBvbmx5IG5lZWQgdG8gYWRkCi0JCQkJLy8gaWYgZGlmZmVyZW50IGZyb20gZGVmYXVsdC50aGUKLQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQlpZiAoZGVmYXVsdENoYXJzZXQgIT0gbnVsbCkgewotCQkJCQlpZiAoIWRlZmF1bHRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBhc3N1bWluZyBpZiB0aGVyZSBpcyBubyBzcGVjIGRlZmF1bHQsIHdlIGFsd2F5cyBuZWVkIHRvCi0JCQkJCS8vIGFkZCwgSSdtIGFzc3VtaW5nCi0JCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgT2JqZWN0IGRldGVjdGVkQ2hhcnNldCwgT2JqZWN0IGphdmFDaGFyc2V0KSB7Ci0JCS8vIHNpbmNlIGVxdWFsLCB3ZSBkb24ndCBuZWVkIHRvIGFkZCwgYnV0IGlmIG91ciBkZXRlY3RlZCB2ZXJzaW9uIGlzCi0JCS8vIGRpZmZlcmVudCB0aGFuIGphdmFDaGFyc2V0LCB0aGVuIHdlIHNob3VsZCBhZGQgaXQuIFRoaXMgd2lsbAotCQkvLyBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiB0aGVyZSdzIGRpZmZlcmVuY2VzIGluIGNhc2UsIG9yIGRpZmZlcmVuY2VzCi0JCS8vIGR1ZSB0byBvdmVycmlkZSBwcm9wZXJ0aWVzCi0JCWlmIChkZXRlY3RlZENoYXJzZXQgIT0gbnVsbCkgewotCi0JCQkvLyBPbmNlIHdlIGRldGVjdGVkIGEgY2hhcnNldCwgd2Ugc2hvdWxkIHNldCB0aGUgcHJvcGVydHkgZXZlbgotCQkJLy8gdGhvdWdoIGl0J3MgdGhlIHNhbWUgYXMgamF2YUNoYXJzZXQKLQkJCS8vIGJlY2F1c2UgdGhlcmUgYXJlIGNsaWVudHMgdGhhdCByZWx5IG9uIHRoaXMgcHJvcGVydHkgdG8KLQkJCS8vIGRldGVybWluZSBpZiB0aGUgY2hhcnNldCBpcyBhY3R1YWxseSBkZXRlY3RlZCBpbiBmaWxlIG9yIG5vdC4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULCBkZXRlY3RlZENoYXJzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1JlbGV2ZW50KElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5BUFBST1BSSUFURV9ERUZBVUxUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCS8vIGVsc2UgaWYKLQkJLy8gKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5FTkNPRElOR19NRU1FTlRPKSkKLQkJLy8gcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyZjZlNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiAKLSAqIFRoaXMgaXMgcG9ydGVkIGZyb20gUGFnZURlc2lnbmVyJ3MgaHBiY29tL0thbmppLmNwcCdzCi0gKiBLYW5qaTo6Z3Vlc3Nfa2FuamlfY29kZSgpLAotICogIAotICovCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdHdWVzc2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUkgPSAwOyAvLyBBU0NJSQotCS8vIElTTy0yMDIyLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFTQ0lJX0lOID0gODsgLy8gVGhpcyBpcyBhZnRlciBJU08yMDIyJ3MgY2hhbmdlCi0JLy8gU2hpZnQtSklTCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVVQ19IQUxGS0FOQSA9IDY7IC8vIFRoaXMgaXMgSGFsZiBLYW5hIGluIEVVQy1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFVUNfSlAgPSAzOyAvLyBUaGlzIGlzIEVVQy1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJU08yMDIyX0pQID0gNDsgLy8gVGhpcyBpcyBJU08tMjAyMi1KUAotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBKSVNfSEFMRktBTkEgPSA3OyAvLyBUSGlzIGlzIEhhbGYgS2FuYSBpbgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVVDMSA9IDB4NDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FVUMyID0gKGJ5dGUpIDB4ODA7Ci0JLy8gQVNDSUkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pJTiA9IDB4MDE7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KT1VUID0gMHgwMjsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VTQyA9IDB4MDQ7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9KSVMgPSAweDA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfU0ZUMSA9IDB4MTA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9TRlQyID0gMHgyMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGt0eXBlW10gPSB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgLyogMDAgKi8KLQkweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAxMCAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDksIDB4MDgsIDB4MDgsIDB4MDgsIC8qICEiIyQlJicgKi8vKiAiICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogKCkqKywtLi8gKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiAwMTIzNDU2NyAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qIDg5OjsgPD0+PyAqLwotCTB4MjksIDB4MjgsIDB4MmIsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIEBBQkNERUZHICovCi0JMHgyYSwgMHgyOCwgMHgyYSwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogSElKS0xNTk8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBQUVJTVFVWVyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIFhZWltcXV5fICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogYWJjZGVmZyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIGhpamtsbW5vICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogcHFyc3R1dncgKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDAwLCAvKiB4eXp7fH1+ICovCi0JMHgyMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgLyogODAgKi8KLQkweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAvKiA5MCAqLwotCTB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MjAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBBMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBCMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBDMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAvKiBEMCAqLwotCShieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAvKiBFMCAqLwotCShieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAvKiBGMCAqLwotCShieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4YzAsIChieXRlKSAweGMwLCAweDAwLH07Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTTzg4NTlfMSA9IDE7IC8vIElTTy0xCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNISUZUX0pJUyA9IDI7IC8vIFRoaXMgaXMgU2hpZnQtSklTCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNKSVNfSEFMRktBTkEgPSA1OyAvLyBUaGlzIGlzIEhhbGYgS2FuYSBpbgotCi0JLyoqCi0JICogQ3VycmVudGx5LCBvbmx5IEphcGFuZXNlIGVuY29kaW5ncyBhcmUgc3VwcG9ydGVkLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTktOT1dOID0gLTE7IC8vIFVua25vd24KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2RlCi0JICogICAgICAgICAgICBpbnQKLQkgKiAKLQkgKiBDb252ZXJ0IHByaXZhdGUgaW50IHRvIElBTkEgRW5jb2RpbmcgbmFtZS4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSUFOQUVuY29kaW5nTmFtZShpbnQgY29kZSkgewotCQlTdHJpbmcgZW5jb2RpbmcgPSBudWxsOwotCi0JCXN3aXRjaCAoY29kZSkgewotCQkJY2FzZSBTSElGVF9KSVMgOgotCQkJY2FzZSBTSklTX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJTaGlmdF9KSVMiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgRVVDX0pQIDoKLQkJCWNhc2UgRVVDX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJFVUMtSlAiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgSVNPMjAyMl9KUCA6Ci0JCQljYXNlIEpJU19IQUxGS0FOQSA6Ci0JCQkJZW5jb2RpbmcgPSAiSVNPLTIwMjItSlAiOy8vJE5PTi1OTFMtMSQKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGVuY29kaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBndWVzc2VkIEphdmEgRW5jb2RpbmcgbmFtZSB0YXJnZXQ6IGJ5dGVzIHRvIGJlIGluc3BlY3RlZCBsZW5ndGg6Ci0JICogbGVuZ3RoIG9mIHRhcmdldAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGd1ZXNzRW5jb2RpbmcoYnl0ZVtdIHRhcmdldCwgaW50IGxlbmd0aCkgewotCQlpbnQgY29kZSA9IFVOS05PV047Ci0KLQkJLy8gQ3VycmVudGx5LCBvbmx5IEphcGFuZXNlIGlzIHN1cHBvcnRlZC4KLQkJU3RyaW5nIHN5c3RlbV9jdHlwZSA9IGphdmEudXRpbC5Mb2NhbGUuZ2V0RGVmYXVsdCgpLmdldExhbmd1YWdlKCk7Ci0JCVN0cmluZyBqcF9jdHlwZSA9IGphdmEudXRpbC5Mb2NhbGUuSkFQQU5FU0UuZ2V0TGFuZ3VhZ2UoKTsKLQkJaWYgKHN5c3RlbV9jdHlwZS5jb21wYXJlVG8oanBfY3R5cGUpID09IDApIHsKLQkJCS8vIE9rLCBJJ20gdW5kZXIgamFfSlAuCi0JCQljb2RlID0gQVNDSUk7Ci0JCQlpbnQgcG9zID0gMDsKLQkJCXdoaWxlICgoY29kZSA9PSBBU0NJSSkgJiYgKGxlbmd0aCA+IDApKSB7Ci0JCQkJaW50IGNoMSA9IHRhcmdldFtwb3NdOwotCQkJCWNoMSA9IGNoMSAmIDB4MDAwMDAwRkY7Ci0JCQkJaW50IGNoMiA9IChsZW5ndGggPj0gMikgPyB0YXJnZXRbcG9zICsgMV0gOiAwOwotCQkJCWNoMiA9IGNoMiAmIDB4MDAwMDAwRkY7Ci0JCQkJaW50IGNoMyA9IChsZW5ndGggPj0gMykgPyB0YXJnZXRbcG9zICsgMl0gOiAwOwotCQkJCWNoMyA9IGNoMyAmIDB4MDAwMDAwRkY7Ci0JCQkJY29kZSA9IGd1ZXNzSmFwYW5lc2VLYW5qaUNvZGUoY2gxLCBjaDIsIGNoMywgMCk7Ci0JCQkJcG9zKys7Ci0JCQkJbGVuZ3RoLS07Ci0JCQl9Ci0JCQlzd2l0Y2ggKGNvZGUpIHsKLQkJCQljYXNlIElTTzIwMjJfSlAgOgotCQkJCWNhc2UgSklTX0hBTEZLQU5BIDoKLQkJCQkJY29kZSA9IElTTzIwMjJfSlA7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgRVVDX0pQIDoKLQkJCQkJY29kZSA9IEVVQ19KUDsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvZGUgPSBTSElGVF9KSVM7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChjb252ZXJ0VG9JQU5BRW5jb2RpbmdOYW1lKGNvZGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBHdWVzcyB0aGUgZW5jb2RpbmcuIGhhbGZrYW5hX2ZsYWcgPSAweDAxICggZGV0ZWN0IFNKSVMgaGFsZiBrYW5hICkKLQkgKiBoYWxma2FuYV9mbGFnID0gMHgwMiAoIGRldGVjdCBFVUMgaGFsZiBrYW5hICkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ3Vlc3NKYXBhbmVzZUthbmppQ29kZShpbnQgY2gxLCBpbnQgY2gyLCBpbnQgY2gzLCBpbnQgaGFsZmthbmFfZmxhZykgewotCQlib29sZWFuIHNqaXNfaGFua2FrdV9mbGFnID0gKChoYWxma2FuYV9mbGFnICYgMHgwMSkgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0JCWJvb2xlYW4gZXVjX2hhbmtha3VfZmxhZyA9ICgoaGFsZmthbmFfZmxhZyAmIDB4MDIpICE9IDApID8gdHJ1ZSA6IGZhbHNlOwotCi0JCWlmIChjaDEgPT0gMCkKLQkJCXJldHVybiBVTktOT1dOOwotCQlpZiAoc2ppc19oYW5rYWt1X2ZsYWcgJiYgY2gxID49IDB4YTEgJiYgY2gxIDw9IDB4ZGYpCi0JCQlyZXR1cm4gU0pJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoZXVjX2hhbmtha3VfZmxhZyAmJiBjaDEgPT0gMHg4ZSAmJiBjaDIgPj0gMHhhMSAmJiBjaDIgPD0gMHhkZikKLQkJCXJldHVybiBFVUNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKCgoa3R5cGVbY2gxXSAmIEtUX1NGVDEpICE9IDApICYmICgoa3R5cGVbY2gyXSAmIEtUX1NGVDIpICE9IDApKQotCQkJcmV0dXJuIFNISUZUX0pJUzsKLQkJZWxzZSBpZiAoKChrdHlwZVtjaDFdICYgS1RfRVVDMSkgIT0gMCkgJiYgKChrdHlwZVtjaDJdICYgS1RfRVVDMikgIT0gMCkpCi0JCQlyZXR1cm4gRVVDX0pQOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiAoKGt0eXBlW2NoMl0gJiBLVF9KSU4pICE9IDApKQotCQkJcmV0dXJuIElTTzIwMjJfSlA7Ci0JCWVsc2UgaWYgKGNoMSA+PSAweGExICYmIGNoMSA8PSAweGRmKQotCQkJcmV0dXJuIFNKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmIGNoMiA9PSAweDI4LyogJygnICovJiYgY2gzID09IDB4NDkvKiAnSScgKi8pCi0JCQlyZXR1cm4gSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChjaDEgPT0gMHgxYiAmJiBjaDIgPT0gMHgyOC8qICcoJyAqLyYmICgoa3R5cGVbY2gzXSAmIEtUX0pPVVQpICE9IDApKQotCQkJcmV0dXJuIEFTQ0lJX0lOOwotCi0JCXJldHVybiBBU0NJSTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdHdWVzc2VyKCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODIxNDA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotcHVibGljIGNsYXNzIEhlYWRQYXJzZXJUb2tlbiB7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgSGVhZFBhcnNlclRva2VuKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBIZWFkUGFyc2VyVG9rZW4oU3RyaW5nIHR5cGUsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IHR5cGU7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dCA9IHRleHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKCJ0ZXh0OiAiICsgZlRleHQgKyAiIG9mZnNldDogIiArIGZTdGFydCArICIgdHlwZTogIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNzEzNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbGlzdC5sZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdENTU05vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0Q1NTTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA5NDljYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0Fic3RyYWN0Q1NTTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENTU05vZGVMaXN0IHsKLQotCXByb3RlY3RlZCBWZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JSUNTU05vZGUgYXBwZW5kTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMubm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXRoaXMubm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gdGhpcy5ub2Rlcy5zaXplKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgSUNTU05vZGUgaXRlbUltcGwoaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLm5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElDU1NOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JfQotCi0KLQlJQ1NTTm9kZSByZW1vdmVOb2RlKGludCBpbmRleCkgewotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vIG5vZGUKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLm5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCi0JCUlDU1NOb2RlIHJlbW92ZWQgPSAoSUNTU05vZGUpIHRoaXMubm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQkJdGhpcy5ub2Rlcy5yZW1vdmVFbGVtZW50QXQoaW5kZXgpOwotCQlyZXR1cm4gcmVtb3ZlZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NBdHRySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NBdHRySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzFiNDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQXR0ckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTQXR0ckltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTQXR0ciB7Ci0KLQlwcml2YXRlIFN0cmluZyBmTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIG93bmVyQ1NTTm9kZSA9IG51bGw7Ci0KLQlDU1NBdHRySW1wbChDU1NBdHRySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCQl0aGlzLmZOYW1lID0gdGhhdC5mTmFtZTsKLQkJdGhpcy5zZXRWYWx1ZSh0aGF0LmZWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQ1NTQXR0ciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0F0dHJJbXBsKFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuZk5hbWUgPSBuYW1lOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCXJldHVybiBuZXcgQ1NTQXR0ckltcGwodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIElDU1NOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZOYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBVFRSX05PREU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE93bmVyQ1NTTm9kZSgpIHsKLQkJcmV0dXJuIG93bmVyQ1NTTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIGZWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoTmFtZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIC8qICh0aGlzLm5hbWUgPT0gbnVsbCkgKi9mYWxzZTsKLQkJaWYgKHRoaXMuZk5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRoaXMuZk5hbWUuZXF1YWxzKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZChTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYgKHRoaXMub3duZXJDU1NOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZm9yIG1vZGVsCi0JCUlDU1NEb2N1bWVudCBkb2MgPSBvd25lckNTU05vZGUuZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLnZhbHVlQ2hhbmdlZCh0aGlzLCBvbGRWYWx1ZSk7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCVN0cmluZyB2YWx1ZSA9IGdldFZhbHVlKCk7Ci0JCXRoaXMub3duZXJDU1NOb2RlLm5vdGlmeShDSEFOR0UsIHRoaXMsIG9sZFZhbHVlLCB2YWx1ZSwgdGhpcy5vd25lckNTU05vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXROYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3TmFtZSkgewotCQlmTmFtZSA9IG5ld05hbWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJDU1NOb2RlKENTU05vZGVJbXBsIG5ld093bmVyQ1NTTm9kZSkgewotCQlvd25lckNTU05vZGUgPSBuZXdPd25lckNTU05vZGU7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoamF2YS5sYW5nLlN0cmluZyBuZXdWYWx1ZSkgewotCQlTdHJpbmcgb2xkVmFsdWUgPSBmVmFsdWU7Ci0JCWZWYWx1ZSA9IG5ld1ZhbHVlOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZChvbGRWYWx1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQ2hhcnNldFJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0NoYXJzZXRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWM1ZDVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTQ2hhcnNldFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0NoYXJzZXRSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVJbXBsIGltcGxlbWVudHMgSUNTU0NoYXJzZXRSdWxlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0NoYXJzZXRSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NDaGFyc2V0UnVsZUltcGwoQ1NTQ2hhcnNldFJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTQ2hhcnNldFJ1bGVJbXBsIGNsb25lZCA9IG5ldyBDU1NDaGFyc2V0UnVsZUltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5jb2RpbmcgaW5mb3JtYXRpb24gdXNlZCBpbiB0aGlzIDxjb2RlPkBjaGFyc2V0PC9jb2RlPiBydWxlLgotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgZW5jb2RpbmcgdmFsdWUgaGFzIGEKLQkgKiAgICAgICAgICAgICAgICBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGVuY29kaW5nCi0JICogICAgICAgICAgICAgICAgcnVsZSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHMoZ2V0QXR0cmlidXRlKEVOQ09ESU5HKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENIQVJTRVRSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gQ0hBUlNFVF9SVUxFOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBxdW90ZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJU3RyaW5nIGVuYyA9IENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKGVuY29kaW5nKTsKLQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGVuYywgcXVvdGUpOwotCQlzZXRBdHRyaWJ1dGUoRU5DT0RJTkcsIHF1b3RlICsgZW5jICsgcXVvdGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RlY2xhcmF0aW9uSXRlbVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM1YjdkNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0RlY2xhcmF0aW9uSXRlbVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNvdW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciB7Ci0JLyoqCi0JICogCi0JICovCi0JZmluYWwgY2xhc3MgRmxvYXRJbmZvIHsKLQkJLyoqCi0JCSAqIAotCQkgKi8KLQkJRmxvYXRJbmZvKFN0cmluZyB0ZXh0KSB7Ci0JCQlwYXJzZSh0ZXh0KTsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXZvaWQgcGFyc2UoU3RyaW5nIHRleHQpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZJZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYk51bSA9IHRydWU7Ci0JCQlpbnQgbGVuID0gdGV4dC5sZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLQkJCQljaGFyIGMgPSB0ZXh0LmNoYXJBdChpKTsKLQkJCQlpZiAoYk51bSkgewotCQkJCQlpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScgfHwgYyA9PSAnLicgfHwgYyA9PSAnKycgfHwgYyA9PSAnLScpIHsKLQkJCQkJCWJ1ZlZhbHVlLmFwcGVuZChjKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWJ1ZklkZW50LmFwcGVuZChjKTsKLQkJCQkJCWJOdW0gPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnVmSWRlbnQuYXBwZW5kKGMpOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB2YWx1ZVN0ciA9IGJ1ZlZhbHVlLnRvU3RyaW5nKCk7Ci0JCQlmVmFsdWUgPSBGbG9hdC52YWx1ZU9mKHZhbHVlU3RyKS5mbG9hdFZhbHVlKCk7Ci0JCQlmSWRlbnRpZmllciA9IGJ1ZklkZW50LnRvU3RyaW5nKCk7Ci0JCQlmVHlwZSA9IGdldEZsb2F0VmFsdWVUeXBlKHZhbHVlU3RyLCBmSWRlbnRpZmllcik7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlmbG9hdCBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiBmVmFsdWU7Ci0JCX0KLQotCQkvKioKLQkJICogCi0JCSAqLwotCQlTdHJpbmcgZ2V0SWRlbnRpZmllcigpIHsKLQkJCXJldHVybiBmSWRlbnRpZmllcjsKLQkJfQotCi0JCS8qKgotCQkgKiAKLQkJICovCi0JCXNob3J0IGdldFZhbHVlVHlwZSgpIHsKLQkJCXJldHVybiBmVHlwZTsKLQkJfQotCi0JCXByaXZhdGUgZmxvYXQgZlZhbHVlID0gMC4wZjsKLQkJcHJpdmF0ZSBTdHJpbmcgZklkZW50aWZpZXIgPSBudWxsOwotCQlwcml2YXRlIHNob3J0IGZUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VOS05PV047Ci0JfQotCi0JZmluYWwgc3RhdGljIGludCBTX05PUk1BTCA9IDA7Ci0JZmluYWwgc3RhdGljIGludCBTX0ZVTkNUSU9OID0gMTsKLQlmaW5hbCBzdGF0aWMgaW50IFNfRk9OVF9TTEFTSCA9IDI7Ci0JZmluYWwgc3RhdGljIGludCBTX0NPTU1BX1NFUEFSQVRJT04gPSAzOwotCXByaXZhdGUgSUNTU0RvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZQYXJlbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmVGVtcFN0cnVjdHVyZWREb2N1bWVudCA9IGZhbHNlOwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IGZVcGRhdGVDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0RlY2xhcmF0aW9uSXRlbVBhcnNlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0RlY2xhcmF0aW9uSXRlbVBhcnNlcihJQ1NTRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudCA9IGRvYzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVBdHRyVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImF0dHIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVH07Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDEpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShnZXRUZXh0KHJlZ2lvbikpOwotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVDb3VudGVyc1ZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyBmdW5jTmFtZSA9IGdldEZ1bmN0aW9uTmFtZShyZWdpb25zKTsKLQkJaWYgKGZ1bmNOYW1lID09IG51bGwgfHwgIWZ1bmNOYW1lLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJjb3VudGVycyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkd9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpbnQgc2l6ZSA9IHZhbHVlUmVnaW9ucy5zaXplKCk7Ci0JCWlmIChzaXplICE9IDIgJiYgc2l6ZSAhPSAzKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvdW50ZXJJbXBsIHZhbHVlID0gZ2V0Q291bnRlcigpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0ZXh0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQl2YWx1ZS5zZXRJZGVudGlmaWVyKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5JREVOVElGSUVSKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJdmFsdWUuc2V0U2VwYXJhdG9yKHRleHQpOwotCQkJCQlhdHRyID0gdmFsdWUuZ2V0QXR0cmlidXRlTm9kZShJQ291bnRlci5TRVBBUkFUT1IpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQl2YWx1ZS5zZXRMaXN0U3R5bGUodGV4dCk7Ci0JCQkJCWF0dHIgPSB2YWx1ZS5nZXRBdHRyaWJ1dGVOb2RlKElDb3VudGVyLkxJU1RTVFlMRSk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVDb3VudGVyVmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImNvdW50ZXIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UfTsKLQkJSVRleHRSZWdpb25MaXN0IHZhbHVlUmVnaW9ucyA9IGdldEZ1bmN0aW9uUGFyYW1ldGVycyhyZWdpb25zLCBhY2NlcHRzKTsKLQkJaW50IHNpemUgPSB2YWx1ZVJlZ2lvbnMuc2l6ZSgpOwotCQlpZiAoc2l6ZSAhPSAxICYmIHNpemUgIT0gMikgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDb3VudGVySW1wbCB2YWx1ZSA9IGdldENvdW50ZXIoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSBudWxsOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJdmFsdWUuc2V0SWRlbnRpZmllcih0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuSURFTlRJRklFUik7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXZhbHVlLnNldExpc3RTdHlsZSh0ZXh0KTsKLQkJCQkJYXR0ciA9IHZhbHVlLmdldEF0dHJpYnV0ZU5vZGUoSUNvdW50ZXIuTElTVFNUWUxFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsSXRlbUltcGwgY3JlYXRlRGVjbGFyYXRpb25JdGVtKElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlDU1NTdHlsZURlY2xJdGVtSW1wbCBpdGVtID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBnZXRQcm9wZXJ0eU5hbWUobm9kZVJlZ2lvbnMpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlpdGVtID0gZ2V0Q1NTU3R5bGVEZWNsSXRlbShuYW1lKTsKLQkJfQotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVGbG9hdFZhbHVlKFN0cmluZyB0ZXh0LCBTdHJpbmcgdHlwZSkgewotCQlGbG9hdEluZm8gaW5mbyA9IG5ldyBGbG9hdEluZm8odGV4dCk7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKGluZm8uZ2V0VmFsdWVUeXBlKCkpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0VmFsdWUoaW5mby5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlRm9ybWF0VmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoImZvcm1hdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBhY2NlcHRzW10gPSB7Q1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklOR307Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCS8vIGZvcm1hdCBjYW4gdGFrZSB2YXJpYWJsZSBhcmdzLgotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRk9STUFUKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gdmFsdWVSZWdpb25zLmdldCgwKTsKLQkJdmFsdWUuc2V0VmFsdWUoQ1NTVXRpbC5leHRyYWN0U3RyaW5nQ29udGVudHMoZ2V0VGV4dChyZWdpb24pKSk7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlTG9jYWxWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygibG9jYWwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkd9OwotCQlJVGV4dFJlZ2lvbkxpc3QgdmFsdWVSZWdpb25zID0gZ2V0RnVuY3Rpb25QYXJhbWV0ZXJzKHJlZ2lvbnMsIGFjY2VwdHMpOwotCQlpZiAodmFsdWVSZWdpb25zLnNpemUoKSAhPSAxKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IGdldENTU1ByaW1pdGl2ZVZhbHVlKElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTE9DQUwpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KDApOwotCQl2YWx1ZS5zZXRWYWx1ZShDU1NVdGlsLmV4dHJhY3RTdHJpbmdDb250ZW50cyhnZXRUZXh0KHJlZ2lvbikpKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlUHJpbWl0aXZlVmFsdWUoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJaWYgKGlzQmxhbmsodHlwZSkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCXZhbHVlID0gY3JlYXRlRmxvYXRWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkcgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCXZhbHVlID0gY3JlYXRlU3RyaW5nVmFsdWUodGV4dCwgdHlwZSk7Ci0JCX0KLQotCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZSh0ZXh0LCB0eXBlKTsKLQkJfQotCi0JCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgdmFsdWUgIT0gbnVsbCkgewotCQkJdmFsdWUuc2V0UmFuZ2VSZWdpb24oZlBhcmVudFJlZ2lvbiwgcmVnaW9uLCByZWdpb24pOwotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVByaW1pdGl2ZVZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IG51bGw7Ci0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlpZiAocmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKS50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRleHQuZXF1YWxzKCJyZ2IoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlUmdiVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygiY291bnRlcigiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdmFsdWUgPSBjcmVhdGVDb3VudGVyVmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygiY291bnRlcnMoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlQ291bnRlcnNWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJhdHRyKCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZUF0dHJWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJmb3JtYXQoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlRm9ybWF0VmFsdWUocmVnaW9ucyk7Ci0JCQl9Ci0JCQllbHNlIGlmICh0ZXh0LmVxdWFscygibG9jYWwoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXZhbHVlID0gY3JlYXRlTG9jYWxWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRleHQuZXF1YWxzKCJyZWN0KCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl2YWx1ZSA9IGNyZWF0ZVJlY3RWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQkJdmFsdWUgPSBjcmVhdGVTdHJpbmdWYWx1ZShyZWdpb25zKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlID0gY3JlYXRlU3RyaW5nVmFsdWUocmVnaW9ucyk7Ci0JCX0KLQotCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50ICYmIHZhbHVlICE9IG51bGwpIHsKLQkJCXZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbnMuZ2V0KDApLCByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpKTsKLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVSZWN0VmFsdWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nIGZ1bmNOYW1lID0gZ2V0RnVuY3Rpb25OYW1lKHJlZ2lvbnMpOwotCQlpZiAoZnVuY05hbWUgPT0gbnVsbCB8fCAhZnVuY05hbWUudG9Mb3dlckNhc2UoKS5lcXVhbHMoInJlY3QiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgYWNjZXB0c1tdID0ge0NTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04sIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVH07IC8vIElERU5UOgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBmb3IKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJ2F1dG8nCi0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDQpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUmVjdEltcGwgdmFsdWUgPSBnZXRSZWN0KCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSB2YWx1ZVJlZ2lvbnMuZ2V0KGkpOwotCQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNoaWxkVmFsdWUgPSBudWxsOwotCQkJc3dpdGNoIChpKSB7Ci0JCQkJY2FzZSAwIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldFRvcCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDEgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0UmlnaHQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAyIDoKLQkJCQkJY2hpbGRWYWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHZhbHVlLmdldEJvdHRvbSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDMgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0TGVmdCgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFRleHQocmVnaW9uKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCXNldFN0cmluZ1ZhbHVlKGNoaWxkVmFsdWUsIHRleHQsIHR5cGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0RmxvYXRWYWx1ZShjaGlsZFZhbHVlLCB0ZXh0LCB0eXBlKTsKLQkJCX0KLQkJCWlmICghZlRlbXBTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQljaGlsZFZhbHVlLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBjcmVhdGVSZ2JWYWx1ZShJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucykgewotCQlTdHJpbmcgZnVuY05hbWUgPSBnZXRGdW5jdGlvbk5hbWUocmVnaW9ucyk7Ci0JCWlmIChmdW5jTmFtZSA9PSBudWxsIHx8ICFmdW5jTmFtZS50b0xvd2VyQ2FzZSgpLmVxdWFscygicmdiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGFjY2VwdHNbXSA9IHtDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRX07Ci0JCUlUZXh0UmVnaW9uTGlzdCB2YWx1ZVJlZ2lvbnMgPSBnZXRGdW5jdGlvblBhcmFtZXRlcnMocmVnaW9ucywgYWNjZXB0cyk7Ci0JCWlmICh2YWx1ZVJlZ2lvbnMuc2l6ZSgpICE9IDMpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJUkdCQ29sb3JJbXBsIHZhbHVlID0gZ2V0UkdCQ29sb3IoKTsKLQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHZhbHVlUmVnaW9ucy5nZXQoaSk7Ci0JCQlDU1NQcmltaXRpdmVWYWx1ZUltcGwgY2hpbGRWYWx1ZSA9IG51bGw7Ci0JCQlzd2l0Y2ggKGkpIHsKLQkJCQljYXNlIDAgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0UmVkKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMSA6Ci0JCQkJCWNoaWxkVmFsdWUgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSB2YWx1ZS5nZXRHcmVlbigpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIDIgOgotCQkJCQljaGlsZFZhbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgdmFsdWUuZ2V0Qmx1ZSgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoY2hpbGRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQlzZXRGbG9hdFZhbHVlKGNoaWxkVmFsdWUsIGdldFRleHQocmVnaW9uKSwgcmVnaW9uLmdldFR5cGUoKSk7Ci0JCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJY2hpbGRWYWx1ZS5zZXRSYW5nZVJlZ2lvbihmUGFyZW50UmVnaW9uLCByZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgY3JlYXRlU3RyaW5nVmFsdWUoU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCXNob3J0IHZhbHVlVHlwZSA9IGdldFN0cmluZ1ZhbHVlVHlwZSh0ZXh0LCB0eXBlKTsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlID0gZ2V0Q1NTUHJpbWl0aXZlVmFsdWUodmFsdWVUeXBlKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmICh2YWx1ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSkgewotCQkJCXRleHQgPSBDU1NVdGlsLmV4dHJhY3RVcmlDb250ZW50cyh0ZXh0KTsKLQkJCX0KLQkJCWVsc2UgaWYgKHZhbHVlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU1RSSU5HKSB7Ci0JCQkJdGV4dCA9IENTU1V0aWwuZXh0cmFjdFN0cmluZ0NvbnRlbnRzKHRleHQpOwotCQkJfQotCQkJdmFsdWUuc2V0VmFsdWUodGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNyZWF0ZVN0cmluZ1ZhbHVlKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCVN0cmluZyB0eXBlID0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRlU3RyaW5nVmFsdWUobWFrZVN0cmluZyhyZWdpb25zKSwgdHlwZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDb3VudGVySW1wbCBnZXRDb3VudGVyKCkgewotCQlDb3VudGVySW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q291bnRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDb3VudGVySW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBnZXRDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCB0eXBlKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTUHJpbWl0aXZlVmFsdWUodHlwZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKHR5cGUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsSXRlbUltcGwgZ2V0Q1NTU3R5bGVEZWNsSXRlbShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dCAhPSBudWxsICYmIGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NTdHlsZURlY2xJdGVtKHByb3BlcnR5TmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShwcm9wZXJ0eU5hbWUpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBzaG9ydCBnZXRGbG9hdFZhbHVlVHlwZShTdHJpbmcgaWRlbnQpIHsKLQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmIChpZGVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFg7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiY20iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ007Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgibW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU07Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU47Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicGMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZGVnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImdyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1M7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFo7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgia2h6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWjsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT047Ci0JCX0KLQkJcmV0dXJuIHZhbHVlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgc2hvcnQgZ2V0RmxvYXRWYWx1ZVR5cGUoU3RyaW5nIHZhbHVlLCBTdHJpbmcgaWRlbnQpIHsKLQkJaWRlbnQgPSBpZGVudC50b0xvd2VyQ2FzZSgpOwotCQlzaG9ydCB2YWx1ZVR5cGU7Ci0JCWlmIChpZGVudC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAoMCA8PSB2YWx1ZS5pbmRleE9mKCcuJykpIHsKLQkJCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTlVNQkVSOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTlRFR0VSOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFscygiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QRVJDRU5UQUdFOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VNUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJleCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFg7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiY20iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ007Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgibW0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU07Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaW4iKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU47Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQ7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgicGMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEM7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiZGVnIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEOwotCQl9Ci0JCWVsc2UgaWYgKGlkZW50LmVxdWFsc0lnbm9yZUNhc2UoImdyYWQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRDsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJtcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUzsKLQkJfQotCQllbHNlIGlmIChpZGVudC5lcXVhbHNJZ25vcmVDYXNlKCJzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1M7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgiaHoiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFo7Ci0JCX0KLQkJZWxzZSBpZiAoaWRlbnQuZXF1YWxzSWdub3JlQ2FzZSgia2h6IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWjsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ESU1FTlNJT047Ci0JCX0KLQkJcmV0dXJuIHZhbHVlVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRGdW5jdGlvbk5hbWUoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA8IDIpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCWlmIChmaXJzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KGZpcnN0UmVnaW9uKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBoYXMgbm8gdmFsaWRhdGlvbiBjaGVjaywgdGhlbiByZWdpb25zIG11c3QgYmUgcGFzc2VkCi0JICogZ2V0RnVuY3Rpb25OYW1lKCkuLi4KLQkgKi8KLQlwcml2YXRlIElUZXh0UmVnaW9uTGlzdCBnZXRGdW5jdGlvblBhcmFtZXRlcnMoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMsIFN0cmluZ1tdIGFjY2VwdHMpIHsKLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKCk7Ci0JCWludCBuQWNjZXB0cyA9IChhY2NlcHRzICE9IG51bGwpID8gYWNjZXB0cy5sZW5ndGggOiAwOwotCQlJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQlpLm5leHQoKTsgLy8gc2tpcCBGVU5DVElPTgotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobkFjY2VwdHMgPT0gMCkgewotCQkJCW5ld1JlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpQWNjZXB0ID0gMDsgaUFjY2VwdCA8IG5BY2NlcHRzOyBpQWNjZXB0KyspIHsKLQkJCQkJaWYgKHR5cGUgPT0gYWNjZXB0c1tpQWNjZXB0XSkgewotCQkJCQkJbmV3UmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5TmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JLy8gVmVjdG9yIG5vZGVSZWdpb25zID0gbmV3IFZlY3RvcihmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCS8vIHJldHVybiBnZXRQcm9wZXJ0eU5hbWUobm9kZVJlZ2lvbnMpOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuYW1lUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQl3aGlsZSAoIW5vZGVSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZVJlZ2lvbnMucmVtb3ZlKDApOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2UobmFtZVJlZ2lvbnMpOwotCQkJCW5hbWUgPSBtYWtlU3RyaW5nKG5hbWVSZWdpb25zKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5hbWVSZWdpb25zLmFkZChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgUmVjdEltcGwgZ2V0UmVjdCgpIHsKLQkJUmVjdEltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0ICE9IG51bGwgJiYgZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldFJlY3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoUmVjdEltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBSR0JDb2xvckltcGwgZ2V0UkdCQ29sb3IoKSB7Ci0JCVJHQkNvbG9ySW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCAmJiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0UkdCQ29sb3IoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoUkdCQ29sb3JJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHNob3J0IGdldFN0cmluZ1ZhbHVlVHlwZShTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJc2hvcnQgdmFsdWVUeXBlOwotCQlpZiAodGV4dC50b0xvd2VyQ2FzZSgpLmVxdWFscygiaW5oZXJpdCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXZhbHVlVHlwZSA9IElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5IRVJJVF9QUklNSVRJVkU7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQl2YWx1ZVR5cGUgPSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfVVJJOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORykgewotCQkJdmFsdWVUeXBlID0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NUUklORzsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0g7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdGV4dC5lcXVhbHMoIiwiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPTU1BOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIHRleHQuZXF1YWxzKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdmFsdWVUeXBlID0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19TTEFTSDsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFKSB7Ci0JCQl2YWx1ZVR5cGUgPSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSQU5HRTsKLQkJfQotCQllbHNlIHsKLQkJCXZhbHVlVHlwZSA9IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVDsKLQkJfQotCQlyZXR1cm4gdmFsdWVUeXBlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgU3RyaW5nIG1ha2VTdHJpbmcoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYm9vbGVhbiBiU3BhY2UgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoIWJTcGFjZSAmJiBpc0JsYW5rKHR5cGUpKSB7Ci0JCQkJYnVmLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJYlNwYWNlID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJ1Zi5hcHBlbmQoZ2V0VGV4dChyZWdpb24pKTsKLQkJCQliU3BhY2UgPSBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeShib29sZWFuIGJUZW1wKSB7Ci0JCWZUZW1wU3RydWN0dXJlZERvY3VtZW50ID0gYlRlbXA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEZsb2F0VmFsdWUoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHZhbHVlLCBTdHJpbmcgdGV4dCwgU3RyaW5nIHR5cGUpIHsKLQkJRmxvYXRJbmZvIGluZm8gPSBuZXcgRmxvYXRJbmZvKHRleHQpOwotCQl2YWx1ZS5zZXRGbG9hdFZhbHVlKGluZm8uZ2V0VmFsdWVUeXBlKCksIGluZm8uZ2V0VmFsdWUoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFN0cmluZ1ZhbHVlKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSwgU3RyaW5nIHRleHQsIFN0cmluZyB0eXBlKSB7Ci0JCXNob3J0IHZhbHVlVHlwZSA9IGdldFN0cmluZ1ZhbHVlVHlwZSh0ZXh0LCB0eXBlKTsKLQkJdmFsdWUuc2V0U3RyaW5nVmFsdWUodmFsdWVUeXBlLCB0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaXRlbQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbEl0ZW0KLQkgKiBAcGFyYW0gbm9kZVJlZ2lvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBJbXBvcnRhbnRBdHRyaWJ1dGUoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWlmIChpdGVtID09IG51bGwgfHwgbm9kZVJlZ2lvbnMgPT0gbnVsbCB8fCBub2RlUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBub2RlUmVnaW9ucy5nZXQobm9kZVJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQpIHsKLQkJCWl0ZW0uc2V0UHJpb3JpdHkoZ2V0VGV4dChyZWdpb24pKTsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBpdGVtKS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCk7Ci0JCQlhdHRyLnNldFJhbmdlUmVnaW9uKGZQYXJlbnRSZWdpb24sIHJlZ2lvbiwgcmVnaW9uKTsKLQkJCW5vZGVSZWdpb25zLnJlbW92ZShyZWdpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRVcGRhdGVDb250ZXh0KENTU01vZGVsVXBkYXRlQ29udGV4dCB1cGRhdGVDb250ZXh0KSB7Ci0JCWZVcGRhdGVDb250ZXh0ID0gdXBkYXRlQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzQ29sb25TZXBhcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwgc2V0dXBEZWNsYXJhdGlvbkl0ZW0oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJaWYgKCFoYXNDb2xvblNlcGFyYXRvcihmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZlBhcmVudFJlZ2lvbiA9IGZsYXROb2RlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoZmxhdE5vZGUuZ2V0UmVnaW9ucygpKTsgLy8gbWFrZQotCQkvLyBjb3B5Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIG5ld0l0ZW0gPSBjcmVhdGVEZWNsYXJhdGlvbkl0ZW0obm9kZVJlZ2lvbnMpOwotCQlpZiAobmV3SXRlbSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWZUZW1wU3RydWN0dXJlZERvY3VtZW50ICYmIGZsYXROb2RlICE9IG51bGwpIHsKLQkJCW5ld0l0ZW0uc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGZsYXROb2RlKTsKLQkJfQotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKG5vZGVSZWdpb25zKTsKLQkJc2V0dXBJbXBvcnRhbnRBdHRyaWJ1dGUobmV3SXRlbSwgbm9kZVJlZ2lvbnMpOwotCQkvLyBOb3csIG5vZGVSZWdpb25zIGp1c3QgaGFzIHJlZ2lvbnMgZm9yIHZhbHVlLgotCQlzZXR1cFZhbHVlcyhuZXdJdGVtLCBub2RlUmVnaW9ucyk7Ci0JCXJldHVybiBuZXdJdGVtOwotCX0KLQotCXZvaWQgc2V0dXBWYWx1ZXMoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24sIElUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucykgewotCQlmUGFyZW50UmVnaW9uID0gcGFyZW50UmVnaW9uOwotCQlzZXR1cFZhbHVlcyhpdGVtLCBub2RlUmVnaW9ucyk7Ci0JfQotCi0JLyoqCi0JICogbm9kZVJlZ2lvbnMgbXVzdCBiZSBicm9rZW4uIElmIHlvdSBuZWVkIGFmdGVyLCBtYWtlIGNvcHkgb2YgdGhlbS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBWYWx1ZXMoSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSwgSVRleHRSZWdpb25MaXN0IG5vZGVSZWdpb25zKSB7Ci0JCWlmIChpdGVtID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlDU1NQcmltaXRpdmVWYWx1ZSB2YWx1ZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkJ1ZiA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCQlTdHJpbmcgcHJvcGVydHlOYW1lID0gaXRlbS5nZXRQcm9wZXJ0eU5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQlib29sZWFuIGJGb250ID0gKHByb3BlcnR5TmFtZS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UKSk7Ci0JCS8vIChzaG9ydC1oYW5kKSBmb250Ci0JCWludCBzdGF0dXMgPSAocHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSkgPyBTX0NPTU1BX1NFUEFSQVRJT04gOiBTX05PUk1BTDsKLQkJd2hpbGUgKCFub2RlUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCXZhbHVlID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGVSZWdpb25zLnJlbW92ZSgwKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlCi0JCQkvLyA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkvLyBicmVhazsKLQkJCS8vIH0KLQkJCXN3aXRjaCAoc3RhdHVzKSB7Ci0JCQkJY2FzZSBTX05PUk1BTCA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCQkJcmVnaW9uQnVmLmFkZChyZWdpb24pOwotCQkJCQkJc3RhdHVzID0gU19GVU5DVElPTjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChiRm9udCAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiAmJiBmUGFyZW50UmVnaW9uLmdldFRleHQocmVnaW9uKS5lcXVhbHMoIi8iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCQlzdGF0dXMgPSBTX0ZPTlRfU0xBU0g7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfRlVOQ1RJT04gOgotCQkJCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCQkJCXJlZ2lvbkJ1Zi5jbGVhcigpOwotCQkJCQkJc3RhdHVzID0gU19OT1JNQUw7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoIWlzQmxhbmsodHlwZSkpIHsKLQkJCQkJCXJlZ2lvbkJ1Zi5hZGQocmVnaW9uKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNfRk9OVF9TTEFTSCA6Ci0JCQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04pIHsKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uKTsKLQkJCQkJCXN0YXR1cyA9IFNfQ09NTUFfU0VQQVJBVElPTjsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghaXNCbGFuayh0eXBlKSkgewotCQkJCQkJdmFsdWUgPSBjcmVhdGVQcmltaXRpdmVWYWx1ZShyZWdpb24pOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgU19DT01NQV9TRVBBUkFUSU9OIDoKLQkJCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SICYmIGZQYXJlbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pLmVxdWFscygiLCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXZhbHVlID0gY3JlYXRlUHJpbWl0aXZlVmFsdWUocmVnaW9uQnVmKTsKLQkJCQkJCXJlZ2lvbkJ1Zi5jbGVhcigpOwotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZWdpb25CdWYuYWRkKHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCQlpdGVtLmFwcGVuZFZhbHVlKHZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKCFyZWdpb25CdWYuaXNFbXB0eSgpKSB7Ci0JCQl2YWx1ZSA9IGNyZWF0ZVByaW1pdGl2ZVZhbHVlKHJlZ2lvbkJ1Zik7Ci0JCQlpZiAoZlVwZGF0ZUNvbnRleHQgPT0gbnVsbCB8fCAhZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJCWl0ZW0uYXBwZW5kVmFsdWUodmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIChmUGFyZW50UmVnaW9uICE9IG51bGwpID8gZlBhcmVudFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbikgOiAiIjsgLy8kTk9OLU5MUy0xJCAKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQmxhbmsoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRG9jdW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTY4OGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NEb2N1bWVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTRG9jdW1lbnRJbXBsIGV4dGVuZHMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSUNTU0RvY3VtZW50IHsKLQotCXByaXZhdGUgQ1NTTW9kZWxJbXBsIGZNb2RlbCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NEb2N1bWVudEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NEb2N1bWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQlDU1NEb2N1bWVudEltcGwoQ1NTRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JSUNTU05vZGUgY3JlYXRlQ1NTQXR0cihTdHJpbmcgbmFtZSkgewotCQlDU1NBdHRySW1wbCBhdHRyID0gbmV3IENTU0F0dHJJbXBsKG5hbWUpOwotCQlhdHRyLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGUKLQkgKi8KLQlwdWJsaWMgSUNTU0NoYXJzZXRSdWxlIGNyZWF0ZUNTU0NoYXJzZXRSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGUKLQkgKi8KLQlwdWJsaWMgQ1NTRm9udEZhY2VSdWxlIGNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTSW1wb3J0UnVsZSBjcmVhdGVDU1NJbXBvcnRSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5JQ1NTTWVkaWFSdWxlCi0JICovCi0JcHVibGljIElDU1NNZWRpYVJ1bGUgY3JlYXRlQ1NTTWVkaWFSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTUGFnZVJ1bGUgY3JlYXRlQ1NTUGFnZVJ1bGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICovCi0JcHVibGljIElDU1NQcmltaXRpdmVWYWx1ZSBjcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCBwcmltaXRpdmVUeXBlKSB7Ci0JCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IG51bGw7Ci0JCWlmIChwcmltaXRpdmVUeXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSKQotCQkJdmFsdWUgPSBuZXcgQ291bnRlckltcGwoKTsKLQkJZWxzZSBpZiAocHJpbWl0aXZlVHlwZSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVCkKLQkJCXZhbHVlID0gbmV3IFJlY3RJbXBsKCk7Ci0JCWVsc2UgaWYgKHByaW1pdGl2ZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SKQotCQkJdmFsdWUgPSBuZXcgUkdCQ29sb3JJbXBsKCk7Ci0JCWVsc2UKLQkJCXZhbHVlID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbChwcmltaXRpdmVUeXBlKTsKLQkJdmFsdWUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENTU1J1bGUgY3JlYXRlQ1NTUnVsZShTdHJpbmcgcnVsZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIElDU1NTdHlsZURlY2xhcmF0aW9uIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSBjcmVhdGVDU1NTdHlsZURlY2xJdGVtKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJQ1NTU3R5bGVEZWNsSXRlbUltcGwgaXRlbSA9IG5ldyBDU1NTdHlsZURlY2xJdGVtSW1wbChwcm9wZXJ0eU5hbWUpOwotCQlpdGVtLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlCi0JICovCi0JcHVibGljIElDU1NTdHlsZVJ1bGUgY3JlYXRlQ1NTU3R5bGVSdWxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZQotCSAqLwotCXB1YmxpYyBDU1NVbmtub3duUnVsZSBjcmVhdGVDU1NVbmtub3duUnVsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QKLQkgKi8KLQlwdWJsaWMgTWVkaWFMaXN0IGNyZWF0ZU1lZGlhTGlzdCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQl2b2lkIHNldE1vZGVsKENTU01vZGVsSW1wbCBtb2RlbCkgewotCQl0aGlzLmZNb2RlbCA9IG1vZGVsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU0ZvbnRGYWNlUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRm9udEZhY2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNkYzI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTRm9udEZhY2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTRm9udEZhY2VSdWxlSW1wbCBleHRlbmRzIENTU1J1bGVEZWNsQ29udGFpbmVyIGltcGxlbWVudHMgQ1NTRm9udEZhY2VSdWxlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTRm9udEZhY2VSdWxlSW1wbChDU1NGb250RmFjZVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTRm9udEZhY2VSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGV4dHJhY3RQcmVTdHJpbmcoKSB7Ci0JCXJldHVybiAiQGZvbnQtZmFjZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBGT05URkFDRVJVTEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBGT05UX0ZBQ0VfUlVMRTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NJbXBvcnRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NJbXBvcnRSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTdkY2JmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTSW1wb3J0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JTW9kZWxQcm92aWRlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0xpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5VUkxNb2RlbFByb3ZpZGVyQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAqLwotcHVibGljIGNsYXNzIENTU0ltcG9ydFJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTSW1wb3J0UnVsZSB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRpcnR5ID0gdHJ1ZTsKLQlwcml2YXRlIElDU1NTdHlsZVNoZWV0IGZTdHlsZVNoZWV0OwotCi0JLyoqCi0gICAgICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLSAgICAgKi8KLQlwdWJsaWMgQ1NTSW1wb3J0UnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU0ltcG9ydFJ1bGVJbXBsKENTU0ltcG9ydFJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTSW1wb3J0UnVsZUltcGwgY2xvbmVkID0gbmV3IENTU0ltcG9ydFJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNsb3NlU3R5bGVTaGVldCgpIHsKLQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpIHsKLQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gZlN0eWxlU2hlZXQ7Ci0JCQlmU3R5bGVTaGVldCA9IG51bGw7IC8vIHRvIHByZXZlbnQgbG9vcCwgd2UgbXVzdCByZXNldCBmU3R5bGVTaGVldAotCQkJCQkJCQkvLyBiZWZvcmUgYWxsIGNsb3NpbmcgYWN0aW9uCi0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkvLyBhZGFwdGVyID0gKE1vZGVsUHJvdmlkZUFkYXB0ZXIpCi0JCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyB9Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxSZW1vdmVkKHNoZWV0LmdldE1vZGVsKCkpOwotCi0JCQlzaGVldC5nZXRNb2RlbCgpLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGxvY2F0aW9uIG9mIHRoZSBzdHlsZSBzaGVldCB0byBiZSBpbXBvcnRlZC4gVGhlIGF0dHJpYnV0ZSB3aWxsIG5vdAotCSAqIGNvbnRhaW4gdGhlIDxjb2RlPiJ1cmwoLi4uKSI8L2NvZGU+IHNwZWNpZmllciBhcm91bmQgdGhlIFVSSS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7Ci0JCXJldHVybiBDU1NVdGlsLmV4dHJhY3RVcmlDb250ZW50cyhnZXRBdHRyaWJ1dGUoSFJFRikpOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBtZWRpYSB0eXBlcyBmb3Igd2hpY2ggdGhpcyBzdHlsZSBzaGVldCBtYXkgYmUgdXNlZC4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0IGdldE1lZGlhKCkgewotCQlJQ1NTTm9kZSBtZWRpYSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKG1lZGlhICE9IG51bGwpIHsKLQkJCWlmIChtZWRpYSBpbnN0YW5jZW9mIE1lZGlhTGlzdCkgewotCQkJCXJldHVybiAoTWVkaWFMaXN0KSBtZWRpYTsKLQkJCX0KLQkJfQotCi0JCS8vIFRISVMgQ0FTRSBJUyBFUlJPUiBDQVNFCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBJTVBPUlRSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN0eWxlIHNoZWV0IHJlZmVycmVkIHRvIGJ5IHRoaXMgcnVsZSwgaWYgaXQgaGFzIGJlZW4gbG9hZGVkLiBUaGUKLQkgKiB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSBpcyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgc3R5bGUgc2hlZXQgaGFzCi0JICogbm90IHlldCBiZWVuIGxvYWRlZCBvciBpZiBpdCB3aWxsIG5vdCBiZSBsb2FkZWQgKGUuZy4gaWYgdGhlIHN0eWxlCi0JICogc2hlZXQgaXMgZm9yIGEgbWVkaWEgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB1c2VyIGFnZW50KS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCkgewotCi0JCWlmIChmRGlydHkpIHsKLQkJCS8vIE5PVEU6IHRyeS9jYXRjaCBibG9jayBpcyBhIFRFTVAgZml4IHRvIGF2b2lkIGNvbXBpbGUgZXJyb3JzOgotCQkJdHJ5IHsKLQkJCQljbG9zZVN0eWxlU2hlZXQoKTsKLQotCQkJCWlmIChnZXRIcmVmKCkgPT0gbnVsbCB8fCBnZXRIcmVmKCkubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlmRGlydHkgPSBmYWxzZTsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwgPSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKTsKLQkJCQlpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsgLy8gY2FzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gU1RZTEUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRhZwotCQkJCQliYXNlTW9kZWwgPSAoKElET01Ob2RlKSBnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRPd25lckRPTU5vZGUoKSkuZ2V0TW9kZWwoKTsKLQkJCQl9Ci0JCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJCS8vIElDU1NNb2RlbC5FTUJFRERFRCkgeyAvLyBjYXNlIFNUWUxFIHRhZwotCQkJCS8vIGFkYXB0ZXIgPSAoTW9kZWxQcm92aWRlQWRhcHRlcikKLQkJCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJLy8gfQotCi0JCQkJLy8gbG9hZCBtb2RlbCBmcm9tIElNb2RlbE1hbmFnZXIKLQkJCQlVUkxNb2RlbFByb3ZpZGVyQ1NTIHByb3ZpZGVyID0gbmV3IFVSTE1vZGVsUHJvdmlkZXJDU1MoKTsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gcHJvdmlkZXIuZ2V0TW9kZWxGb3JSZWFkKGJhc2VNb2RlbCwgZ2V0SHJlZigpKTsKLQkJCQlmRGlydHkgPSBmYWxzZTsKLQotCQkJCWlmIChuZXdNb2RlbCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlpZiAoIShuZXdNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkpIHsKLQkJCQkJbmV3TW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCS8vIG5vdGlmeSBhZGFwdGVyCi0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQkJYWRhcHRlci5tb2RlbFByb3ZpZGVkKG5ld01vZGVsKTsKLQotCQkJCWZTdHlsZVNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSAoKElDU1NNb2RlbCkgbmV3TW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpCi0JCQkJCWZTdHlsZVNoZWV0LmdldE1vZGVsKCkuYWRkU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlN0eWxlU2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gSU1QT1JUX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFN0eWxlU2hlZXQoKSB7Ci0JCWlmICghZkRpcnR5KSB7Ci0JCQljbG9zZVN0eWxlU2hlZXQoKTsKLQkJCWZEaXJ0eSA9IHRydWU7Ci0JCQlub3RpZnkoSU5vZGVOb3RpZmllci5DSEFOR0UsIGdldEF0dHJpYnV0ZU5vZGUoSFJFRiksIG51bGwsIG51bGwsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZWxlYXNlUnVsZSgpIHsKLQkJaWYgKGZTdHlsZVNoZWV0ICE9IG51bGwpIHsKLQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gZlN0eWxlU2hlZXQ7Ci0JCQlmU3R5bGVTaGVldCA9IG51bGw7IC8vIHRvIHByZXZlbnQgbG9vcCwgd2UgbXVzdCByZXNldCBmU3R5bGVTaGVldAotCQkJCQkJCQkvLyBiZWZvcmUgYWxsIGNsb3NpbmcgYWN0aW9uCi0KLQkJCXNoZWV0LmdldE1vZGVsKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihnZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBpZiAoZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PQotCQkJLy8gSUNTU01vZGVsLkVNQkVEREVEKSB7IC8vIGNhc2UgU1RZTEUgdGFnCi0JCQkvLyBhZGFwdGVyID0gKE1vZGVsUHJvdmlkZUFkYXB0ZXIpCi0JCQkvLyAoKElOb2RlTm90aWZpZXIpZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyB9Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChzaGVldC5nZXRNb2RlbCgpKTsKLQotCQkJc2hlZXQuZ2V0TW9kZWwoKS5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBocmVmCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgaHJlZikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWZEaXJ0eSA9IHRydWU7Ci0JCXNldEF0dHJpYnV0ZShIUkVGLCBDU1NMaW5rQ29udmVydGVyLmFkZEZ1bmMoaHJlZikpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01lZGlhUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTWVkaWFSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJjODM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTWVkaWFSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNZWRpYVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBJQ1NTTWVkaWFSdWxlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU01lZGlhUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTTWVkaWFSdWxlSW1wbChDU1NNZWRpYVJ1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgYXBwZW5kUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTTWVkaWFSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTTWVkaWFSdWxlSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byBkZWxldGUgYSBydWxlIGZyb20gdGhlIG1lZGlhIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgVGhlIGluZGV4IHdpdGhpbiB0aGUgbWVkaWEgYmxvY2sncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlCi0JICogICAgICAgICAgICBydWxlIHRvIHJlbW92ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBkb2VzIG5vdAotCSAqICAgICAgICAgICAgICAgIGNvcnJlc3BvbmQgdG8gYSBydWxlIGluIHRoZSBtZWRpYSBydWxlIGxpc3QuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1lZGlhIHJ1bGUKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVSdWxlKGludCBpbmRleCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUNTU05vZGVJbXBsIG5vZGUgPSBnZXRJbmRleGVkUnVsZShpbmRleCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBBIGxpc3Qgb2YgYWxsIENTUyBydWxlcyBjb250YWluZWQgd2l0aGluIHRoZSBtZWRpYSBibG9jay4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZUxpc3QgZ2V0Q3NzUnVsZXMoKSB7Ci0JCUNTU1J1bGVMaXN0SW1wbCBsaXN0ID0gbmV3IENTU1J1bGVMaXN0SW1wbCgpOwotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpCi0JCQkJbGlzdC5hcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JQ1NTUnVsZUltcGwgZ2V0SW5kZXhlZFJ1bGUoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQlpZiAoaSsrID09IGluZGV4KQotCQkJCQlyZXR1cm4gKENTU1J1bGVJbXBsKSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEEgbGlzdCBvZiBtZWRpYSB0eXBlcyBmb3IgdGhpcyBydWxlLgotCSAqLwotCXB1YmxpYyBNZWRpYUxpc3QgZ2V0TWVkaWEoKSB7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIE1lZGlhTGlzdEltcGwpCi0JCQkJcmV0dXJuIChNZWRpYUxpc3QpIG5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gTUVESUFSVUxFX05PREU7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gTUVESUFfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGluc2VydCBhIG5ldyBydWxlIGludG8gdGhlIG1lZGlhIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBUaGUgcGFyc2FibGUgdGV4dCByZXByZXNlbnRpbmcgdGhlIHJ1bGUuIEZvciBydWxlIHNldHMgdGhpcwotCSAqICAgICAgICAgICAgY29udGFpbnMgYm90aCB0aGUgc2VsZWN0b3IgYW5kIHRoZSBzdHlsZSBkZWNsYXJhdGlvbi4gRm9yCi0JICogICAgICAgICAgICBhdC1ydWxlcywgdGhpcyBzcGVjaWZpZXMgYm90aCB0aGUgYXQtaWRlbnRpZmllciBhbmQgdGhlIHJ1bGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQuCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBtZWRpYSBibG9jaydzIHJ1bGUgY29sbGVjdGlvbiBvZiB0aGUKLQkgKiAgICAgICAgICAgIHJ1bGUgYmVmb3JlIHdoaWNoIHRvIGluc2VydCB0aGUgc3BlY2lmaWVkIHJ1bGUuIElmIHRoZQotCSAqICAgICAgICAgICAgc3BlY2lmaWVkIGluZGV4IGlzIGVxdWFsIHRvIHRoZSBsZW5ndGggb2YgdGhlIG1lZGlhIGJsb2NrcydzCi0JICogICAgICAgICAgICBydWxlIGNvbGxlY3Rpb24sIHRoZSBydWxlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUKLQkgKiAgICAgICAgICAgIG1lZGlhIGJsb2NrLgotCSAqIEByZXR1cm4gVGhlIGluZGV4IHdpdGhpbiB0aGUgbWVkaWEgYmxvY2sncyBydWxlIGNvbGxlY3Rpb24gb2YgdGhlIG5ld2x5Ci0JICogICAgICAgICBpbnNlcnRlZCBydWxlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIHJ1bGUgY2Fubm90IGJlCi0JICogICAgICAgICAgICAgICAgaW5zZXJ0ZWQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgZS5nLiwgaWYgYW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5AaW1wb3J0PC9jb2RlPiBydWxlIGlzIGluc2VydGVkIGFmdGVyIGEgc3RhbmRhcmQgcnVsZSBzZXQgb3Igb3RoZXIKLQkgKiAgICAgICAgIGF0LXJ1bGUuIDxicj4KLQkgKiAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBpbmRleCBpcyBub3QgYSB2YWxpZAotCSAqICAgICAgICAgaW5zZXJ0aW9uIHBvaW50LiA8YnI+Ci0JICogICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIG1lZGlhIHJ1bGUgaXMKLQkgKiAgICAgICAgIHJlYWRvbmx5LiA8YnI+Ci0JICogICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBydWxlIGhhcyBhIHN5bnRheCBlcnJvciBhbmQKLQkgKiAgICAgICAgIGlzIHVucGFyc2FibGUuCi0JICovCi0JcHVibGljIGludCBpbnNlcnRSdWxlKFN0cmluZyBydWxlLCBpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpbnQgbGVuZ3RoID0gZ2V0Q3NzUnVsZXMoKS5nZXRMZW5ndGgoKTsKLQkJaWYgKGluZGV4IDwgMCB8fCBsZW5ndGggPCBpbmRleCkKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCi0JCUNTU1J1bGVJbXBsIHJlZlJ1bGUgPSAobGVuZ3RoICE9IGluZGV4KSA/IGdldEluZGV4ZWRSdWxlKGluZGV4KSA6IG51bGw7Ci0KLQkJQ1NTUnVsZUltcGwgbmV3UnVsZSA9IChDU1NSdWxlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1J1bGUocnVsZSk7Ci0KLQkJLy8gcHJldmVudCBmcm9tIG5lc3RpbmcgQG1lZGlhIHJ1bGUKLQkJaWYgKG5ld1J1bGUuZ2V0VHlwZSgpID09IENTU1J1bGUuTUVESUFfUlVMRSkKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLlNZTlRBWF9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0KLQkJaW5zZXJ0QmVmb3JlKG5ld1J1bGUsIHJlZlJ1bGUpOwotCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIGluc2VydFJ1bGVCZWZvcmUob3JnLnczYy5kb20uY3NzLkNTU1J1bGUgbmV3UnVsZSwgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVmUnVsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdSdWxlID09IG51bGwgJiYgcmVmUnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgaW5zZXJ0QmVmb3JlKChDU1NOb2RlSW1wbCkgbmV3UnVsZSwgKENTU05vZGVJbXBsKSByZWZSdWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZW1vdmVSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAocnVsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTUnVsZSByZXQgPSAoQ1NTUnVsZSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBydWxlKTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBvbGRDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlcGxhY2VSdWxlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIG9sZFJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlcGxhY2VDaGlsZCgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgb2xkUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E2ZGQxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsQ3JlYXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgewotCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmUm9vdE5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZlRhcmdldE5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTTm9kZUltcGwgZk5leHROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBmUmVwYXJzZVN0YXJ0ID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlJlcGFyc2VFbmQgPSAtMTsKLQotCS8qKgotCSAqIENTU01vZGVsQ29udGV4dCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsQ3JlYXRpb25Db250ZXh0KENTU05vZGVJbXBsIHJvb3ROb2RlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJZlJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBjbGVhcigpIHsKLQkJZk5leHROb2RlID0gbnVsbDsKLQkJZlRhcmdldE5vZGUgPSBudWxsOwotCQlyZXNldFJlcGFyc2VSYW5nZSgpOwotCX0KLQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU05vZGVJbXBsIGdldE5leHROb2RlKCkgewotCQlyZXR1cm4gZk5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZXBhcnNlRW5kKCkgewotCQlyZXR1cm4gZlJlcGFyc2VFbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlcGFyc2VTdGFydCgpIHsKLQkJcmV0dXJuIGZSZXBhcnNlU3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTm9kZUltcGwgZ2V0Um9vdE5vZGUoKSB7Ci0JCXJldHVybiBmUm9vdE5vZGU7Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgZ2V0VGFyZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZUYXJnZXROb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNUb1JlcGFyc2UoKSB7Ci0JCXJldHVybiAoMCA8PSBnZXRSZXBhcnNlU3RhcnQoKSAmJiAwIDw9IGdldFJlcGFyc2VFbmQoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZXNldFJlcGFyc2VSYW5nZSgpIHsKLQkJZlJlcGFyc2VTdGFydCA9IGZSZXBhcnNlRW5kID0gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRMYXN0KCkgewotCQlmTmV4dE5vZGUgPSBudWxsOwotCi0JCWlmICghKGZSb290Tm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCWZUYXJnZXROb2RlID0gZlJvb3ROb2RlOwotCQl9Ci0JCWVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZSb290Tm9kZSkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJQ1NTTm9kZUltcGwgbm9kZSA9IGZSb290Tm9kZTsKLQkJCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCQlJQ1NTTm9kZSBsYXN0Q2hpbGQgPSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJCWlmIChsYXN0Q2hpbGQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgJiYgKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGxhc3RDaGlsZCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJbm9kZSA9IChDU1NOb2RlSW1wbCkgbGFzdENoaWxkOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZlRhcmdldE5vZGUgPSBub2RlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXROZXh0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWZOZXh0Tm9kZSA9IChDU1NOb2RlSW1wbCkgbm9kZTsKLQkJaWYgKGZOZXh0Tm9kZSAhPSBudWxsKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IChDU1NOb2RlSW1wbCkgZk5leHROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0UmVwYXJzZUVuZChpbnQgZW5kKSB7Ci0JCWZSZXBhcnNlRW5kID0gZW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0UmVwYXJzZVN0YXJ0KGludCBzdGFydCkgewotCQlmUmVwYXJzZVN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRUYXJnZXROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJZlRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGU7Ci0JCWlmIChmTmV4dE5vZGUgIT0gbnVsbCAmJiBmTmV4dE5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IGZUYXJnZXROb2RlKSB7Ci0JCQlmTmV4dE5vZGUgPSBudWxsOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1OGU1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsRGVsZXRpb25Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NNb2RlbERlbGV0aW9uQ29udGV4dCB7Ci0KLQlwcml2YXRlIGludCBmT2xkU3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmT2xkTGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBmTmV3U3RhcnQgPSAtMTsKLQlwcml2YXRlIGludCBmTmV3TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBmTGVuZ3RoRGlmZmVyZW5jZSA9IDA7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IG51bGw7Ci0JLy8gcHJpdmF0ZSBJQ1NTTm9kZSBmUm9vdE5vZGUgPSBudWxsOwotCXByaXZhdGUgaW50IGZSZW1vdmVkUmFuZ2VCZWdpbiA9IC0xOwotCXByaXZhdGUgaW50IGZSZW1vdmVkUmFuZ2VFbmQgPSAtMTsKLQlwcml2YXRlIENTU05vZGVMaXN0SW1wbCBmTm9kZXNUb0JlUmVtb3ZlZCA9IG5ldyBDU1NOb2RlTGlzdEltcGwoKTsKLQotCS8qKgotCSAqIENTU01vZGVsRGVsZXRpb25Db250ZXh0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQoSUNTU05vZGUgcm9vdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBmUm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGFkZE5vZGVUb0JlUmVtb3ZlZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuTm9kZXMgPSBmTm9kZXNUb0JlUmVtb3ZlZC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuTm9kZXM7IGkrKykgewotCQkJSUNTU05vZGUgcGFyZW50ID0gZk5vZGVzVG9CZVJlbW92ZWQuaXRlbShpKTsKLQkJCWlmIChDU1NNb2RlbFV0aWwuaXNQYXJlbnRPZihwYXJlbnQsIG5vZGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWZOb2Rlc1RvQmVSZW1vdmVkLmFwcGVuZE5vZGUobm9kZSk7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgZXhwYW5kUmVtb3ZlZFJhbmdlQmVnaW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBuZXdCZWdpbiA9IGZsYXROb2RlLmdldFN0YXJ0KCk7IC8vIGZPbGRTdGFydCA9PSBmTmV3U3RhcnQsIHJpZ2h0Pz8KLQkJaWYgKGZSZW1vdmVkUmFuZ2VCZWdpbiA8IDAgfHwgbmV3QmVnaW4gPCBmUmVtb3ZlZFJhbmdlQmVnaW4pIHsKLQkJCWZSZW1vdmVkUmFuZ2VCZWdpbiA9IG5ld0JlZ2luOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBleHBhbmRSZW1vdmVkUmFuZ2VFbmQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBuZXdFbmQgPSBmbGF0Tm9kZS5nZXRFbmQoKSArICgoaXNPbGROb2RlKGZsYXROb2RlKSkgPyBmTGVuZ3RoRGlmZmVyZW5jZSA6IDApOwotCQlpZiAoZlJlbW92ZWRSYW5nZUVuZCA8IDAgfHwgZlJlbW92ZWRSYW5nZUVuZCA8IG5ld0VuZCkgewotCQkJZlJlbW92ZWRSYW5nZUVuZCA9IG5ld0VuZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGZpbmRDb250YWluZXIoQ1NTTm9kZUltcGwgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCS8vIEFtIGkgYSBjb250YWluZXIgb2YgZmxhdE5vZGU/Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaW50IGZpcnN0U3RhcnQgPSBnZXRPcmlnaW5hbE9mZnNldChmaXJzdE5vZGUpOwotCQkJaW50IGxhc3RTdGFydCA9IGdldE9yaWdpbmFsT2Zmc2V0KGxhc3ROb2RlKTsKLQkJCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0KLQkJCWlmIChmaXJzdFN0YXJ0IDw9IHN0YXJ0ICYmIHN0YXJ0IDw9IGxhc3RTdGFydCkgewotCQkJCS8vIEkgYW0gYSBjb250YWluZXIsIGlzIG15IGNoaWxkIGEgY29udGFpbmVyID8KLQkJCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJCQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbmRDb250YWluZXIoKENTU05vZGVJbXBsKSBub2RlLCBmbGF0Tm9kZSk7Ci0JCQkJCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCQkJCQlyZXR1cm4gY29udGFpbmVyOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgZmluZERlbGV0aW9uVGFyZ2V0KENTU05vZGVJbXBsIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0ID0gZmluZENvbnRhaW5lcihwYXJlbnQsIGZsYXROb2RlKTsKLQkJaWYgKHRhcmdldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnQoZmxhdE5vZGUudG9TdHJpbmcoKSArICI6ICIpOwotCi0JCS8vIGNoaWxkIGEoPT09PT0pYig9PT09PSljCi0JCS8vIHBhcmVudCAoPT09PT09PT09PT09PT09PSkgYSxjIGNhbiByZW1vdmUgcGFyZW50LCBidXQgYiBjYW5ub3QuCi0KLQkJSUNTU05vZGUgY2hpbGQ7Ci0KLQkJZm9yIChjaGlsZCA9IHRhcmdldC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGwgJiYgIShjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcik7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJLy8ganVzdCBhZHZhbmNpbmcKLQkJfQotCi0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInRhcmdldCBoYXMgbm8gY2hpbGRyZW4uIik7IC8vIFRFU1RCWUNPWlkKLQkJCXJldHVybiB0YXJnZXQ7IC8vIGhhcyBubyBjaGlsZCBjb250YWluZXJzLgotCQl9Ci0JCWVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnQoKSA8IGdldE9yaWdpbmFsT2Zmc2V0KGZpcnN0Tm9kZSkpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImZsYXROb2RlIGlzIGluIGZyb250IG9mIGZpcnN0IGNoaWxkIik7Ci0JCQkJLy8gLy8gVEVTVEJZQ09aWQotCQkJCXJldHVybiB0YXJnZXQ7IC8vIGEKLQkJCX0KLQkJfQotCi0JCWZvciAoY2hpbGQgPSB0YXJnZXQuZ2V0TGFzdENoaWxkKCk7IGNoaWxkICE9IG51bGwgJiYgIShjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcik7IGNoaWxkID0gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkpIHsKLQkJCS8vIGp1c3QgYWR2YW5jaW5nCi0JCX0KLQotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ0YXJnZXQgaGFzIG5vIGNoaWxkcmVuLiIpOyAvLyBURVNUQllDT1pZCi0JCQlyZXR1cm4gdGFyZ2V0OyAvLyBoYXMgbm8gY2hpbGQgY29udGFpbmVycy4KLQkJfQotCQllbHNlIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGdldE9yaWdpbmFsT2Zmc2V0KGZpcnN0Tm9kZSkgPCBmbGF0Tm9kZS5nZXRTdGFydCgpKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJmbGF0Tm9kZSBpcyBpbiBhZnRlciBvZiBsYXN0IGNoaWxkIik7Ci0JCQkJLy8gLy8gVEVTVEJZQ09aWQotCQkJCXJldHVybiB0YXJnZXQ7IC8vIGMKLQkJCX0KLQkJfQotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZmxhdE5vZGUgaW5uZXIgb2YgY2hpbGRyZW4iKTsgLy8gVEVTVEJZQ09aWQotCQlyZXR1cm4gbnVsbDsgLy8gYgotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldE5vZGVzVG9CZVJlbW92ZWQoKSB7Ci0JCUNvbGxlY3Rpb24gbm9kZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWludCBuTm9kZXMgPSBmTm9kZXNUb0JlUmVtb3ZlZC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuTm9kZXM7IGkrKykgewotCQkJbm9kZXMuYWRkKGZOb2Rlc1RvQmVSZW1vdmVkLml0ZW0oaSkpOwotCQl9Ci0JCXJldHVybiBub2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgaW50IGdldE9yaWdpbmFsT2Zmc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJaWYgKDAgPD0gZkxlbmd0aERpZmZlcmVuY2UpIHsKLQkJCQlpZiAoZk5ld1N0YXJ0ICsgZk5ld0xlbmd0aCA8IG9mZnNldCkgewotCQkJCQlvZmZzZXQgLT0gZkxlbmd0aERpZmZlcmVuY2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGZPbGRTdGFydCArIGZPbGRMZW5ndGggPD0gb2Zmc2V0IHx8IChmTmV3U3RhcnQgPCAwICYmIGZPbGRTdGFydCA8PSBvZmZzZXQgJiYgIWlzT2xkTm9kZShmbGF0Tm9kZSkpIHx8ICgwIDw9IGZOZXdTdGFydCAmJiBmTmV3U3RhcnQgKyBmTmV3TGVuZ3RoIDw9IG9mZnNldCAmJiAhaXNPbGROb2RlKGZsYXROb2RlKSkpIHsKLQkJCQkJb2Zmc2V0IC09IGZMZW5ndGhEaWZmZXJlbmNlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldFJlbW92ZWRSYW5nZUJlZ2luKCkgewotCQlyZXR1cm4gZlJlbW92ZWRSYW5nZUJlZ2luOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRSZW1vdmVkUmFuZ2VFbmQoKSB7Ci0JCXJldHVybiBmUmVtb3ZlZFJhbmdlRW5kOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc09sZE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCQlpZiAoZS5uZXh0RWxlbWVudCgpID09IGZsYXROb2RlKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldHVwQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQlmT2xkTGVuZ3RoID0gQ1NTVXRpbC5nZXRUZXh0TGVuZ3RoKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIDAgPCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpICYmIChmbGF0Tm9kZSA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSkgIT0gbnVsbCkgewotCQkJZk9sZFN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZPbGRTdGFydCA9IC0xOwotCQl9Ci0JCWZOZXdMZW5ndGggPSBDU1NVdGlsLmdldFRleHRMZW5ndGgobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwgJiYgMCA8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCkgJiYgKGZsYXROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKDApKSAhPSBudWxsKSB7Ci0JCQlmTmV3U3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJZlJlbW92ZWRSYW5nZUJlZ2luID0gZk5ld1N0YXJ0OwotCQkJZlJlbW92ZWRSYW5nZUVuZCA9IGZOZXdTdGFydCArIGZOZXdMZW5ndGg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTmV3U3RhcnQgPSAtMTsKLQkJCWZSZW1vdmVkUmFuZ2VCZWdpbiA9IGZSZW1vdmVkUmFuZ2VFbmQgPSAtMTsKLQkJfQotCQlmTGVuZ3RoRGlmZmVyZW5jZSA9IGZOZXdMZW5ndGggLSBmT2xkTGVuZ3RoOwotCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0KLQkJLy8gY2xlYW51cCBub2RlcwotCQl3aGlsZSAoMCA8IGZOb2Rlc1RvQmVSZW1vdmVkLmdldExlbmd0aCgpKSB7Ci0JCQlmTm9kZXNUb0JlUmVtb3ZlZC5yZW1vdmVOb2RlKDApOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjcxNTFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50aW1wbC5DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGwuQ1NTU3R5bGVOb3RpZnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuSW1wb3J0ZWRDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuU2VsZWN0b3JzQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIENTU01vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSUNTU01vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JcHJpdmF0ZSBDU1NEb2N1bWVudEltcGwgZG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgb3JnLnczYy5kb20uTm9kZSBvd25lck5vZGUgPSBudWxsOwotCXByaXZhdGUgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIHN0eWxlTm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZXIgZlVwZGF0ZXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gZmFsc2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIElEX05PTl9FWFRFUk5BTF9DU1MgPSAiKipfTk9OX0VYVEVSTkFMX0NTU18qKioiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENTU01vZGVsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NNb2RlbEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuZXZlbnQuQ1NTU3R5bGVMaXN0ZW5lcgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLmFkZFN0eWxlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXZvaWQgYXR0clJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0F0dHIsIENTU05vZGVJbXBsIG9sZEF0dHIpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIuYXR0clJlcGxhY2VkKHBhcmVudE5vZGUsIG5ld0F0dHIsIG9sZEF0dHIpOwotCQl9Ci0KLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAob2xkQXR0ciAhPSBudWxsICYmIG9sZEF0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgb2xkQXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SKSkgewotCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgb2xkQXR0cjsKLQkJCS8vIGNvbGxlY3QgY2hhbmdlZCBzZWxlY3RvcgotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCXJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW2xpc3QuZ2V0TGVuZ3RoKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJcmVtb3ZlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCX0KLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCAmJiBuZXdBdHRyLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuQVRUUl9OT0RFICYmICgoQ1NTQXR0ckltcGwpIG5ld0F0dHIpLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIG5ld0F0dHI7Ci0JCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQlhZGRlZFtpXSA9IGxpc3QuZ2V0U2VsZWN0b3IoaSk7Ci0JCX0KLQkJaWYgKHJlbW92ZWQgIT0gbnVsbCB8fCBhZGRlZCAhPSBudWxsIHx8IGdldERvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBmb3IgaHJlZiBhdHRyaWJ1dGUKLQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCAmJiBnZXRTdHlsZUxpc3RlbmVycygpLnNpemUoKSA+IDApIHsKLQkJCWJvb2xlYW4gdXBkYXRlID0gZmFsc2U7Ci0JCQlpZiAob2xkQXR0ciAhPSBudWxsICYmIG9sZEF0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgb2xkQXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCXVwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAobmV3QXR0ciAhPSBudWxsICYmIG5ld0F0dHIuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbmV3QXR0cikuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCXVwZGF0ZSA9IHRydWU7Ci0JCQl9Ci0JCQlpZiAodXBkYXRlKQotCQkJCSgoSUNTU0ltcG9ydFJ1bGUpIHBhcmVudE5vZGUpLmdldFN0eWxlU2hlZXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWdldFN0eWxlTm90aWZpZXIoKS5iZWdpblJlY29yZGluZygpOwotCi0JCU5vZGUgbm9kZSA9IGdldE93bmVyRE9NTm9kZSgpOwotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCXZvaWQgY2hpbGRSZXBsYWNlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHsKLQkJaWYgKCFmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlKSB7Ci0JCQlDU1NNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldFVwZGF0ZXIoKTsKLQkJCXVwZGF0ZXIuY2hpbGRSZXBsYWNlZChwYXJlbnROb2RlLCBuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQl9Ci0KLQkJLy8gYWx3YXlzIGNoZWNrIGFuZCBzZW5kIHNlbGVjdG9yIGV2ZW50Ci0JCUlDU1NTZWxlY3RvciByZW1vdmVkW10gPSBudWxsLCBhZGRlZFtdID0gbnVsbDsKLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUgfHwgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBUlVMRV9OT0RFKSB7Ci0JCQkvLyBjb2xsZWN0IG9sZCBzZWxlY3RvcnMKLQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJc2VsVHJhdi5hcHBseShvbGRDaGlsZCk7Ci0JCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJaWYgKG5TZWwgPiAwKSB7Ci0JCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbblNlbF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSAoSUNTU1NlbGVjdG9yKSBzZWxUcmF2LmdldFNlbGVjdG9ycygpLmdldChpKTsKLQkJCX0KLQkJCS8vIGNvbGxlY3QgbmV3IHNlbGVjdG9ycwotCQkJc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCXNlbFRyYXYuYXBwbHkobmV3Q2hpbGQpOwotCQkJblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJaWYgKG5TZWwgPiAwKSB7Ci0JCQkJYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gbW9kaWZpY2F0aW9uCi0JCQlJQ1NTTm9kZSBydWxlID0gcGFyZW50Tm9kZTsKLQkJCXdoaWxlIChydWxlICE9IG51bGwpIHsKLQkJCQlpZiAocnVsZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpCi0JCQkJCWJyZWFrOwotCQkJCXJ1bGUgPSBydWxlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChydWxlICE9IG51bGwpIHsKLQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSAoKElDU1NTdHlsZVJ1bGUpIHJ1bGUpLmdldFNlbGVjdG9ycygpOwotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJfQotCQl9Ci0JCWlmIChyZW1vdmVkICE9IG51bGwgfHwgYWRkZWQgIT0gbnVsbCB8fCBnZXREb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSB7Ci0JCQkvLyBzZW5kIHNlbGVjdG9yIGNoYW5nZWQgZXZlbnQKLQkJCWdldFN0eWxlTm90aWZpZXIoKS5maXJlKHJlbW92ZWQsIGFkZGVkLCBudWxsKTsKLQkJfQotCQkvLyBjbG9zZSByZW1vdmVkIGltcG9ydC1ydWxlJ3MgZXh0ZXJuYWwgc3R5bGUgc2hlZXRzCi0JCXsKLQkJCUltcG9ydFJ1bGVDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRSdWxlQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRSdWxlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQubmV4dCgpKS5jbG9zZVN0eWxlU2hlZXQoKTsKLQkJCX0KLQkJfQotCQkvLyBzZW5kIGV2ZW50cyB0byBsaXN0ZW5lciBmb3IgbmV3IGltcG9ydC1ydWxlcwotCQlpZiAoZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsICYmIGdldFN0eWxlTGlzdGVuZXJzKCkuc2l6ZSgpID4gMCkgewotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShuZXdDaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VJbXBvcnRlZCgpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQkvLyByZWxlYXNlIGxpc3RlbmVycwotCQkJaWYgKGdldFN0eWxlTGlzdGVuZXJzKCkgIT0gbnVsbCkgewotCQkJCVZlY3RvciB0b1JlbW92ZSA9IG5ldyBWZWN0b3IoZ2V0U3R5bGVMaXN0ZW5lcnMoKSk7Ci0JCQkJSXRlcmF0b3IgaXQgPSB0b1JlbW92ZS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJcmVtb3ZlU3R5bGVMaXN0ZW5lcigoSUNTU1N0eWxlTGlzdGVuZXIpIGl0Lm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gY2xvc2UgaW1wb3J0IHJ1bGVzCi0JCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShnZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0MiA9IHRyYXYuZ2V0UnVsZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Mi5oYXNOZXh0KCkpIHsKLQkJCQkoKENTU0ltcG9ydFJ1bGVJbXBsKSBpdDIubmV4dCgpKS5yZWxlYXNlUnVsZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBDU1NEb2N1bWVudEltcGwgY3JlYXRlRG9jdW1lbnQoKSB7Ci0JCUNTU0RvY3VtZW50SW1wbCBkb2MgPSBudWxsOwotCQlpbnQgcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkgewotCQkJLy8gdGhpcyBjYXNlIGlzIGV4dGVybmFsIENTUyBmaWxlCi0JCQlkb2MgPSAoQ1NTU3R5bGVTaGVldEltcGwpIERPTUNTU0ltcGwuY3JlYXRlQ1NTU3R5bGVTaGVldChudWxsLCBudWxsKTsgLy8gcGFyYW1ldGVycwotCQkJLy8gYXJlCi0JCQkvLyBmb3IKLQkJCS8vIFNUWUxFLXRhZwotCQkJcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXJOb2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCAmJiAoKEVsZW1lbnQpIG93bmVyTm9kZSkuZ2V0VGFnTmFtZSgpLnRvVXBwZXJDYXNlKCkuZXF1YWxzKCJTVFlMRSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy8gdGhpcyBjYXNlIGlzIFNUWUxFLXRhZwotCQkJRWxlbWVudCBzdHlsZSA9IChFbGVtZW50KSBvd25lck5vZGU7Ci0JCQlkb2MgPSAoQ1NTU3R5bGVTaGVldEltcGwpIERPTUNTU0ltcGwuY3JlYXRlQ1NTU3R5bGVTaGVldChzdHlsZS5nZXRBdHRyaWJ1dGUoIlRJVExFIiksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXN0eWxlLmdldEF0dHJpYnV0ZSgiTUVESUEiKSk7Ly8kTk9OLU5MUy0xJAotCQkJcGFyc2VyTW9kZSA9IENTU1NvdXJjZVBhcnNlci5NT0RFX1NUWUxFU0hFRVQ7Ci0JCX0KLQkJZWxzZSBpZiAob3duZXJOb2RlIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCB8fCBvd25lck5vZGUgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5BdHRyKSB7Ci0JCQkvLyBJbmxpbmUgYXR0cmlidXRlcwotCQkJZG9jID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBET01DU1NJbXBsLmNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQkJCXBhcnNlck1vZGUgPSBDU1NTb3VyY2VQYXJzZXIuTU9ERV9ERUNMQVJBVElPTjsKLQkJfQotCQlSZWdpb25QYXJzZXIgcmVnaW9uUGFyc2VyID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UGFyc2VyKCk7Ci0JCWlmIChyZWdpb25QYXJzZXIgaW5zdGFuY2VvZiBDU1NTb3VyY2VQYXJzZXIpIHsKLQkJCSgoQ1NTU291cmNlUGFyc2VyKSByZWdpb25QYXJzZXIpLnNldFBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCX0KLQkJcmV0dXJuIGRvYzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQlOb2RlIG5vZGUgPSBnZXRPd25lckRPTU5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5lbmRSZWNvcmRpbmcocmVxdWVzdGVyKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc3VwZXIuZW5kUmVjb3JkaW5nKHJlcXVlc3Rlcik7Ci0KLQkJZ2V0U3R5bGVOb3RpZmllcigpLmVuZFJlY29yZGluZygpOwotCX0KLQotCXB1YmxpYyBJQ1NTRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQl0aGlzLmRvY3VtZW50ID0gY3JlYXRlRG9jdW1lbnQoKTsKLQkJCXRoaXMuZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JCXN0cnVjdHVyZWREb2N1bWVudCA9IHN1cGVyLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCi0JCS8vIHRoZSBmaXJzdCB0aW1lCi0JCUFzc2VydC5pc05vdE51bGwoZ2V0TW9kZWxIYW5kbGVyKCkpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0TW9kZWxIYW5kbGVyKCkuZ2V0RG9jdW1lbnRMb2FkZXIoKS5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0RG9jdW1lbnQoKSkuZ2V0Q29udGFpbmVyTm9kZShvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldE93bmVyRE9NTm9kZSgpIHsKLQkJcmV0dXJuIG93bmVyTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gb3duZXJOb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlIGlmIHRoZSBjYXNlIG9mIGV4dGVybmFsIENTUyBtb2RlbCwgeW91Ci0JICogICAgICAgICAgICBzaG91bGQgc2V0IG51bGwsIGVsc2UgaWYgaW50ZXJuYWwgY3NzLCB5b3Ugc2hvdWxkIHNldAotCSAqICAgICAgICAgICAgU1RZTEUtdGFnIG5vZGUsIGVsc2UgaWYgaW5saW5lIGNzcywgeW91IHNob3VsZCBzZXQgdGhlCi0JICogICAgICAgICAgICBlbGVtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHN0eWxlLWF0dHJpYnV0ZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRPTU5vZGUoTm9kZSBub2RlKSB7Ci0JCS8vIHByb2hpYml0IG93bmVyIGNoYW5nZQotCQlBc3NlcnQuaXNUcnVlKG93bmVyTm9kZSA9PSBudWxsKTsKLQkJb3duZXJOb2RlID0gbm9kZTsKLQkJaWYgKG93bmVyTm9kZSAhPSBudWxsKSB7IC8vIGZvciBpbnRlcm5hbC9pbmxpbmUgQ1NTIGNvbnRleHQKLQkJCXRyeSB7Ci0JCQkJc2V0SWQoSURfTk9OX0VYVEVSTkFMX0NTUyk7Ci0JCQl9Ci0JCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkJLy8gaW1wb3NzaWJsZQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTW9kZWxQYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlpZiAoZlBhcnNlciA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZlBhcnNlciA9IG5ldyBDU1NNb2RlbFBhcnNlcihkb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0eWxlTGlzdGVuZXJzKCkgewotCQlyZXR1cm4gZ2V0U3R5bGVOb3RpZmllcigpLmdldFN0eWxlTGlzdGVuZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGphdmEubGFuZy5PYmplY3QgZ2V0U3R5bGVTaGVldFR5cGUoKSB7Ci0JCWlmIChnZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQlyZXR1cm4gSU5MSU5FOwotCQlpZiAoZ2V0T3duZXJET01Ob2RlKCkgIT0gbnVsbCkKLQkJCXJldHVybiBFTUJFRERFRDsKLQkJZWxzZQotCQkJcmV0dXJuIEVYVEVSTkFMOwotCX0KLQotCXByaXZhdGUgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIGdldFN0eWxlTm90aWZpZXIoKSB7Ci0JCWlmIChzdHlsZU5vdGlmaWVyID09IG51bGwpIHsKLQkJCXN0eWxlTm90aWZpZXIgPSAob3duZXJOb2RlICE9IG51bGwpID8gbmV3IENTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIodGhpcykgOiBuZXcgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBzdHlsZU5vdGlmaWVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTW9kZWxVcGRhdGVyIGdldFVwZGF0ZXIoKSB7Ci0JCWlmIChmVXBkYXRlciA9PSBudWxsKSB7Ci0JCQlmVXBkYXRlciA9IG5ldyBDU1NNb2RlbFVwZGF0ZXIodGhpcyk7Ci0JCQlmVXBkYXRlci5zZXRQYXJzZXIoZ2V0UGFyc2VyKCkpOwotCQl9Ci0JCXJldHVybiBmVXBkYXRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1JlY29yZGluZygpIHsKLQkJcmV0dXJuIGdldFN0eWxlTm90aWZpZXIoKS5pc1JlY29yZGluZygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWQoKSB7Ci0JCXJldHVybiAoZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBFWFRFUk5BTCkgJiYgc3VwZXIuaXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBmb3IgdGhlIGNhc2UKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uTGlzdCgpOwotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGdldERvY3VtZW50KCkpLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGZsYXROb2RlcywgbnVsbCk7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIG5vQ2hhbmdlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJLy8gbm9wCi0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwgJiYgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQotCQlDU1NNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRQYXJzZXIoKTsKLQkJcGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjbGVhbnVwIC0+IHJlYnVpbGQgQ1NTIE5vZGVzIFRoaXMgaXMgcHJlLWJldGEgZml4IGZvciAxNzgxNzYuCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaE5vZGVzKCkgewotCQkvLyBjbGVhbnVwIG9sZCBub2RlcwotCQlmU3RydWN0dXJlZERvY3VtZW50VXBkYXRlID0gdHJ1ZTsKLQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGdldERvY3VtZW50KCkpLnJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCi0JCWdldFBhcnNlcigpLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJU3RyaW5nIHNvdXJjZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRUZXh0KCk7Ci0KLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsIDAsIHNvdXJjZS5sZW5ndGgoKSwgbnVsbCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLCAwLCBzb3VyY2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFJlZ2lvbigpOwotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSB0cnVlOwotCi0JCUNTU01vZGVsUGFyc2VyIHBhcnNlciA9IGdldFBhcnNlcigpOwotCQlwYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQlwYXJzZXIuY2hhbmdlUmVnaW9uKGZsYXROb2RlLCByZWdpb24pOwotCi0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2xkUmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJaWYgKG9sZFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IHRydWU7Ci0KLQkJQ1NTTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0JCXBhcnNlci5yZXBsYWNlUmVnaW9ucyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0KLQkJZlN0cnVjdHVyZWREb2N1bWVudFVwZGF0ZSA9IGZhbHNlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUZyb21FZGl0KCkgewotCQljbG9zZUltcG9ydGVkKCk7Ci0JCWlmIChnZXRTdHlsZVNoZWV0VHlwZSgpID09IEVYVEVSTkFMKSB7Ci0JCQlzdXBlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJY2xvc2VJbXBvcnRlZCgpOwotCQlpZiAoZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBFWFRFUk5BTCkgewotCQkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5ldmVudC5DU1NTdHlsZUxpc3RlbmVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkucmVtb3ZlU3R5bGVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RpbmcgdG8gZG8KLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJbmV3TW9kZWwobmV3IE5ld0RvY3VtZW50RXZlbnQobmV3U3RydWN0dXJlZERvY3VtZW50LCB0aGlzKSk7Ci0JCQl9Ci0JCQluZXdTdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNyY01vZGVsCi0JICogICAgICAgICAgICBjb20uaW1iLnNlZC5jc3MubW9kZS5pbnRlZmFjZXMuSUNTU01vZGVsCi0JICogQHBhcmFtIHJlbW92ZWQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NTZWxlY3RvcltdCi0JICogQHBhcmFtIGFkZGVkCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU2VsZWN0b3JbXQotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJZ2V0U3R5bGVOb3RpZmllcigpLnN0eWxlQ2hhbmdlZChzcmNNb2RlbCwgcmVtb3ZlZCwgYWRkZWQsIG1lZGlhKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3JjTW9kZWwKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlnZXRTdHlsZU5vdGlmaWVyKCkuc3R5bGVVcGRhdGUoc3JjTW9kZWwpOwotCX0KLQotCXZvaWQgdmFsdWVDaGFuZ2VkKENTU05vZGVJbXBsIG5vZGUsIFN0cmluZyBvbGRWYWx1ZSkgewotCQlpZiAoIWZTdHJ1Y3R1cmVkRG9jdW1lbnRVcGRhdGUpIHsKLQkJCUNTU01vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0VXBkYXRlcigpOwotCQkJdXBkYXRlci52YWx1ZUNoYW5nZWQobm9kZSwgb2xkVmFsdWUpOwotCQl9Ci0KLQkJSUNTU1NlbGVjdG9yIHJlbW92ZWRbXSA9IG51bGwsIGFkZGVkW10gPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSAmJiAoKENTU0F0dHJJbXBsKSBub2RlKS5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQkJQ1NTQXR0ckltcGwgYXR0ciA9IChDU1NBdHRySW1wbCkgbm9kZTsKLQkJCQkvLyBjb2xsZWN0IGNoYW5nZWQgc2VsZWN0b3IKLQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChhdHRyLmdldFZhbHVlKCkpOwotCQkJCWFkZGVkID0gbmV3IElDU1NTZWxlY3RvcltsaXN0LmdldExlbmd0aCgpXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykKLQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCi0JCQkJLy8gZ2V0IG9sZCB2YWx1ZQotCQkJCWxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChvbGRWYWx1ZSk7Ci0JCQkJcmVtb3ZlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LmdldExlbmd0aCgpOyBpKyspCi0JCQkJCXJlbW92ZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCUlDU1NOb2RlIHJ1bGUgPSBub2RlOwotCQkJCXdoaWxlIChydWxlICE9IG51bGwpIHsKLQkJCQkJaWYgKHJ1bGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKQotCQkJCQkJYnJlYWs7Ci0JCQkJCXJ1bGUgPSBydWxlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHJ1bGUgIT0gbnVsbCkgewotCQkJCQlJQ1NTU2VsZWN0b3JMaXN0IGxpc3QgPSAoKElDU1NTdHlsZVJ1bGUpIHJ1bGUpLmdldFNlbGVjdG9ycygpOwotCQkJCQlhZGRlZCA9IG5ldyBJQ1NTU2VsZWN0b3JbbGlzdC5nZXRMZW5ndGgoKV07Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotCQkJCQkJYWRkZWRbaV0gPSBsaXN0LmdldFNlbGVjdG9yKGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAocmVtb3ZlZCAhPSBudWxsIHx8IGFkZGVkICE9IG51bGwgfHwgZ2V0RG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCQlnZXRTdHlsZU5vdGlmaWVyKCkuZmlyZShyZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0JCX0KLQkJLy8gZm9yIGhyZWYgYXR0cmlidXRlCi0JCWlmIChnZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwgJiYgZ2V0U3R5bGVMaXN0ZW5lcnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5BVFRSX05PREUgJiYgKChDU1NBdHRySW1wbCkgbm9kZSkuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCSgoSUNTU0ltcG9ydFJ1bGUpICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpKS5nZXRTdHlsZVNoZWV0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxOb2RlRmVlZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTA1ZTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbE5vZGVGZWVkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTTW9kZWxOb2RlRmVlZGVyIHsKLQkvKioKLQkgKiBjdXJyZW50bHkgSUNTU0RvY3VtZW50IGlzIHVzZWQgYnV0IG1heSBnbyBiYWNrIHRvIENTU0RvY3VtZW50SW1wbCBpbiBmdXR1cmUuCi0JICovCi0JSUNTU0RvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JQ1NTTW9kZWxVcGRhdGVDb250ZXh0IGZVcGRhdGVDb250ZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIENTU01vZGVsTm9kZUZlZWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU01vZGVsTm9kZUZlZWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NNb2RlbE5vZGVGZWVkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBjdXJyZW50bHkgSUNTU0RvY3VtZW50IGlzIHVzZWQgYnV0IG1heSBnbyBiYWNrIHRvIENTU0RvY3VtZW50SW1wbCBpbiBmdXR1cmUuCi0JICovCi0JQ1NTTW9kZWxOb2RlRmVlZGVyKElDU1NEb2N1bWVudCBkb2N1bWVudCwgQ1NTTW9kZWxVcGRhdGVDb250ZXh0IHVwZGF0ZUNvbnRleHQpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZVcGRhdGVDb250ZXh0ID0gdXBkYXRlQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NDaGFyc2V0UnVsZUltcGwgZ2V0Q1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCUNTU0NoYXJzZXRSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU0NoYXJzZXRSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU0NoYXJzZXRSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU0NoYXJzZXRSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlSW1wbCBnZXRDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCUNTU0ZvbnRGYWNlUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NGb250RmFjZVJ1bGUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGUgPSAoQ1NTRm9udEZhY2VSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU0ZvbnRGYWNlUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU0ltcG9ydFJ1bGVJbXBsIGdldENTU0ltcG9ydFJ1bGUoKSB7Ci0JCUNTU0ltcG9ydFJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTSW1wb3J0UnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NJbXBvcnRSdWxlSW1wbCkgZkRvY3VtZW50LmNyZWF0ZUNTU0ltcG9ydFJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNZWRpYVJ1bGVJbXBsIGdldENTU01lZGlhUnVsZSgpIHsKLQkJQ1NTTWVkaWFSdWxlSW1wbCBub2RlOwotCQlpZiAoZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJbm9kZSA9IGZVcGRhdGVDb250ZXh0LmdldENTU01lZGlhUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NNZWRpYVJ1bGVJbXBsKSBmRG9jdW1lbnQuY3JlYXRlQ1NTTWVkaWFSdWxlKCk7Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUGFnZVJ1bGVJbXBsIGdldENTU1BhZ2VSdWxlKCkgewotCQlDU1NQYWdlUnVsZUltcGwgbm9kZTsKLQkJaWYgKGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCW5vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRDU1NQYWdlUnVsZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJbm9kZSA9IChDU1NQYWdlUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NQYWdlUnVsZSgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlUnVsZUltcGwgZ2V0Q1NTU3R5bGVSdWxlKCkgewotCQlDU1NTdHlsZVJ1bGVJbXBsIG5vZGU7Ci0JCWlmIChmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlub2RlID0gZlVwZGF0ZUNvbnRleHQuZ2V0Q1NTU3R5bGVSdWxlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlub2RlID0gKENTU1N0eWxlUnVsZUltcGwpIGZEb2N1bWVudC5jcmVhdGVDU1NTdHlsZVJ1bGUoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjgyOWNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUnVsZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkNvcmVOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5UZXh0UmVnaW9uTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotICovCi1wdWJsaWMgY2xhc3MgQ1NTTW9kZWxQYXJzZXIgewotCi0JcHJpdmF0ZSBJQ1NTRG9jdW1lbnQgZkRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENTU01vZGVsQ3JlYXRpb25Db250ZXh0IGZDcmVhdGlvbkNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQgZkRlbGV0aW9uQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQgZlVwZGF0ZUNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxOb2RlRmVlZGVyIGZGZWVkZXIgPSBudWxsOwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyIGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUGFyc2VGbG9hdGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ1NTTW9kZWxQYXJzZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENTU01vZGVsUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGN1cnJlbnRseSBwcm92ZGVkIHRoaXMgbWV0aG9kIGJ1dCBtYXkgYmUgcmVtb3ZlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJzZUZsb2F0aW5nKCl7Ci0JCXJldHVybiBmUGFyc2VGbG9hdGluZzsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHByb3ZkZWQgdGhpcyBtZXRob2QgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQgZ2V0Q3JlYXRpb25Db250ZXh0KCl7Ci0JCXJldHVybiBmQ3JlYXRpb25Db250ZXh0OwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHJvdmRlZCB0aGlzIG1ldGhvZCBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRlQ29udGV4dEFjdGl2ZSgpewotCQlyZXR1cm4gZlVwZGF0ZUNvbnRleHQgIT0gbnVsbCA/IGZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgOiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTW9kZWxQYXJzZXIoSUNTU0RvY3VtZW50IGRvYykgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnQgPSBkb2M7Ci0JCWZDcmVhdGlvbkNvbnRleHQgPSBuZXcgQ1NTTW9kZWxDcmVhdGlvbkNvbnRleHQoKENTU05vZGVJbXBsKWRvYyk7Ci0JCWZEZWxldGlvbkNvbnRleHQgPSBuZXcgQ1NTTW9kZWxEZWxldGlvbkNvbnRleHQoZG9jKTsKLQkJZlVwZGF0ZUNvbnRleHQgPSBuZXcgQ1NTTW9kZWxVcGRhdGVDb250ZXh0KCk7Ci0JCWZGZWVkZXIgPSBuZXcgQ1NTTW9kZWxOb2RlRmVlZGVyKGRvYywgZlVwZGF0ZUNvbnRleHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMobmV3IENvcmVOb2RlTGlzdChmbGF0Tm9kZSwgZmxhdE5vZGUpLCBuZXcgQ29yZU5vZGVMaXN0KGZsYXROb2RlLCBmbGF0Tm9kZSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2hhbmdlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tOZXh0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHQgPSBDU1NVdGlsLmZpbmROZXh0U2lnbmlmaWNhbnROb2RlKGZsYXROb2RlKTsKLQkJaWYgKENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShuZXh0KSA9PSB0eXBlKSB7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VTdGFydChmbGF0Tm9kZS5nZXRFbmQoKSk7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFJlcGFyc2VFbmQobmV4dC5nZXRFbmQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cERlbGV0aW9uQ29udGV4dCgpIHsKLQkJLy8gc2V0dXBEZWxldGlvbkNvbnRleHQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBjbGVhbnVwRmlyc3ROb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlLCBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0KSB7Ci0JCWlmIChmaXJzdE5vZGUgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZpcnN0Tm9kZSA9PSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0TmV4dE5vZGVJbkN1cnJlbnQoZmlyc3ROb2RlKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGxhc3ROb2RlID09IG51bGwgfHwgZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlci5pc09sZE5vZGUobGFzdE5vZGUpIHx8IG5leHROb2RlID09IG51bGwgfHwgbGFzdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IG5leHROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQl0YXJnZXQuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXQuc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV4dE5vZGUpOwotCQkJfQotCQkJSUNTU05vZGUgcGFyZW50ID0gdGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQljbGVhbnVwRmlyc3ROb2RlKGZpcnN0Tm9kZSwgKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50KTsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGNsZWFudXBMYXN0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlLCBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgdGFyZ2V0KSB7Ci0JCWlmIChsYXN0Tm9kZSA9PSBudWxsIHx8IHRhcmdldCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlpZiAobGFzdE5vZGUgPT0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0UHJldk5vZGVJbkN1cnJlbnQobGFzdE5vZGUpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmaXJzdE5vZGUgPT0gbnVsbCB8fCBmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmlzT2xkTm9kZShmaXJzdE5vZGUpIHx8IHByZXZOb2RlID09IG51bGwgfHwgcHJldk5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGZpcnN0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJdGFyZ2V0LnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0LnNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJldk5vZGUpOwotCQkJfQotCQkJSUNTU05vZGUgcGFyZW50ID0gdGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQljbGVhbnVwTGFzdE5vZGUobGFzdE5vZGUsIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCk7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGNsZWFudXBVcGRhdGVDb250ZXh0KCkgewotCQlpbnQgcmVtYWlucyA9IGZVcGRhdGVDb250ZXh0LmdldE5vZGVDb3VudCgpOwotCQlmVXBkYXRlQ29udGV4dC5jbGVhbnVwQ29udGV4dCgpOwotCQlyZXR1cm4gcmVtYWluczsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgZmxvYXRpbmcgQ1NTIHJ1bGUgKG93bmVyIGRvY3VtZW50IHdpbGwgYmUgc2V0KSB0aGlzIGlzIGZvcgotCSAqIENTU1N0eWxlU2hlZXQuY3JlYXRlQ1NTUnVsZShTdHJpbmcpCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqLwotCUNTU1J1bGUgY3JlYXRlQ1NTUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMpIHsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWZQYXJzZUZsb2F0aW5nID0gdHJ1ZTsKLQotCQkvLyBzZXR1cCBjcmVhdGlvbiBjb250ZXh0Ci0JCWZDcmVhdGlvbkNvbnRleHQuY2xlYXIoKTsKLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKG51bGwpOwotCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKG51bGwpOwotCQlDU1NSdWxlSW1wbCBwYXJlbnRSdWxlID0gbnVsbDsKLQotCQlmb3IgKEVudW1lcmF0aW9uIGUgPSBmbGF0Tm9kZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUNTU05vZGVJbXBsIG1vZGlmaWVkID0gaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCWlmIChwYXJlbnRSdWxlID09IG51bGwgJiYgbW9kaWZpZWQgaW5zdGFuY2VvZiBDU1NSdWxlSW1wbCkgewotCQkJCXBhcmVudFJ1bGUgPSAoQ1NTUnVsZUltcGwpIG1vZGlmaWVkOwotCQkJfQotCQl9Ci0KLQkJZlBhcnNlRmxvYXRpbmcgPSBmYWxzZTsKLQotCQlpZiAocGFyZW50UnVsZSAhPSBudWxsKSB7Ci0JCQlDU1NNb2RlbFV0aWwuY2xlYW51cENvbnRhaW5lcihwYXJlbnRSdWxlKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnRSdWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaW5kQnJhY2VDbG9zZShpbnQgZGVwdGgsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnQsIGJvb2xlYW4gYkJyZWFrU2libGluZykgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCWludCBicmFjZUxldmVsID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gc3RhcnQuZ2V0TmV4dCgpOwotCQlmb3IgKDsgcmVnaW9uICE9IG51bGw7IHJlZ2lvbiA9IHJlZ2lvbi5nZXROZXh0KCkpIHsKLQkJCWludCBvZmZzZXQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQkJQXNzZXJ0LmlzVHJ1ZShmYWxzZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCQlpbnQgZGVwdGhIaXQgPSAobm9kZSAhPSBudWxsKSA/IENTU01vZGVsVXRpbC5nZXREZXB0aChub2RlKSA6IC0xOwotCQkJaWYgKGRlcHRoIDw9IGRlcHRoSGl0KSB7Ci0JCQkJLy8gc2libGluZyBpcyBmb3VuZCBiZWZvcmUgIn0iCi0JCQkJaWYgKGJCcmVha1NpYmxpbmcpIHsKLQkJCQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJd2hpbGUgKGRlcHRoIDw9IENTU01vZGVsVXRpbC5nZXREZXB0aChwYXJlbnQpKSB7Ci0JCQkJCQlub2RlID0gcGFyZW50OwotCQkJCQkJcGFyZW50ID0gKENTU05vZGVJbXBsKSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBub2RlICE9IG51bGwpIHsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gcHJldk5vZGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKHJlZ2lvbik7Ci0JCQlpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJYnJhY2VMZXZlbCsrOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCWJyYWNlTGV2ZWwtLTsKLQkJCQlpZiAoYnJhY2VMZXZlbCA8IDApIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlwcmV2Tm9kZSA9IHJlZ2lvbjsKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiByZWdpb24gPT0gbnVsbCkgewotCQkJLy8gcmVhY2ggdGhlIGVuZCBvZiBkb2N1bWVudAotCQkJcmVzdWx0ID0gcHJldk5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdChpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgbm9kZUxpc3QgPSBudWxsOwotCQlpZiAoMCA8PSBzdGFydCAmJiBzdGFydCA8PSBlbmQpIHsKLQkJCUlDU1NNb2RlbCBtb2RlbCA9IGZEb2N1bWVudC5nZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQ1NTTW9kZWxJbXBsKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoKENTU01vZGVsSW1wbCkgbW9kZWwpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQgLSAxKTsKLQkJCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsICYmIGVuZE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbm9kZUxpc3QgPSBuZXcgQ29yZU5vZGVMaXN0KHN0YXJ0Tm9kZSwgZW5kTm9kZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlDU1NOb2RlSW1wbCByb290Tm9kZSA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJSUNTU05vZGUgdGFyZ2V0ID0gcm9vdE5vZGUuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBDU1NOb2RlSW1wbCkgewotCQkJcmV0dXJuIChDU1NOb2RlSW1wbCkgdGFyZ2V0OwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEJyYWNlQ2xvc2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJSUNTU05vZGUgdGFyZ2V0ID0gQ1NTTW9kZWxVdGlsLmZpbmRCcmFjZUNvbnRhaW5lcihmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKSk7Ci0KLQkJaWYgKCEodGFyZ2V0IGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgdGFyZ2V0OwotCQlpZiAoQ1NTTW9kZWxVdGlsLmlzSW50ZXJydXB0aW9uKHBhcmVudCwgcmVnaW9uKSkgewotCQkJSUNTU05vZGUgbm9kZSA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU05vZGVJbXBsKSB7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlU3RhcnQocGFyZW50LmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZUVuZChwYXJlbnQuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCSgoQ1NTTm9kZUltcGwpIG5vZGUpLnJlbW92ZUNoaWxkKHBhcmVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUgfHwgcGFyZW50IGluc3RhbmNlb2YgSUNTU01lZGlhUnVsZSB8fCBwYXJlbnQgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUgfHwgcGFyZW50IGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJQ1NTTW9kZWxVdGlsLmV4cGFuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcihwYXJlbnQsIHJlZ2lvbik7Ci0JCQlpZiAoIUNTU01vZGVsVXRpbC5pc0JyYWNlQ2xvc2VkKHRhcmdldCkpIHsKLQkJCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocGFyZW50LmdldFBhcmVudE5vZGUoKSk7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShwYXJlbnQuZ2V0TmV4dFNpYmxpbmcoKSk7Ci0JCQkJcmV0dXJuIHBhcmVudDsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0QnJhY2VPcGVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ga2V5UmVnaW9uID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJaWYgKGtleVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoIWZQYXJzZUZsb2F0aW5nKSB7Ci0JCQlDU1NOb2RlSW1wbCBub2RlID0gZ2V0Tm9kZUF0KGtleVJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWlmIChub2RlICE9IG51bGwgJiYgIShub2RlIGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoa2V5UmVnaW9uKTsKLQotCQlDU1NOb2RlSW1wbCBpbnNlcnRlZCA9IG51bGw7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFKSB7Ci0JCQlpbnNlcnRlZCA9IGluc2VydFBhZ2VSdWxlKGtleVJlZ2lvbiwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRNZWRpYVJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRGb250RmFjZVJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKENTU1V0aWwuaXNTZWxlY3RvclRleHQoa2V5UmVnaW9uKSkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRTdHlsZVJ1bGUoa2V5UmVnaW9uLCByZWdpb24pOwotCQl9Ci0KLQkJaWYgKGluc2VydGVkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkvLyBDU1NNb2RlbFV0aWwuZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpaW5zZXJ0ZWQsCi0JCQkvLyBmbGF0Tm9kZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlQ2xvc2UgPSBmaW5kQnJhY2VDbG9zZShDU1NNb2RlbFV0aWwuZ2V0RGVwdGgoaW5zZXJ0ZWQpLCByZWdpb24sICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkpOwotCQkJaWYgKGJyYWNlQ2xvc2UgIT0gbnVsbCkgewotCQkJCWZDcmVhdGlvbkNvbnRleHQuc2V0UmVwYXJzZVN0YXJ0KHJlZ2lvbi5nZXRFbmQoKSk7Ci0JCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRSZXBhcnNlRW5kKGJyYWNlQ2xvc2UuZ2V0RW5kKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluc2VydGVkOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0Q2hhcnNldFJ1bGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBiZWdpbkRvY1JlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmREb2NSZWdpb24pIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGJlZ2luRG9jUmVnaW9uLmdldFJlZ2lvbnMoKSk7Ci0JCXJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAY2hhcnNldCIKLQkJSVRleHRSZWdpb24gZW5jb2RpbmdSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAodGV4dFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHRleHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORykgewotCQkJCWVuY29kaW5nUmVnaW9uID0gdGV4dFJlZ2lvbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChlbmNvZGluZ1JlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU0NoYXJzZXRSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NDaGFyc2V0UnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSkgewotCQkJcnVsZS5zZXRBdHRyaWJ1dGUoSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HLCBiZWdpbkRvY1JlZ2lvbi5nZXRUZXh0KGVuY29kaW5nUmVnaW9uKSk7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGJlZ2luRG9jUmVnaW9uLCBlbmREb2NSZWdpb24pOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORyk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oYmVnaW5Eb2NSZWdpb24sIGVuY29kaW5nUmVnaW9uLCBlbmNvZGluZ1JlZ2lvbik7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKGZDcmVhdGlvbkNvbnRleHQgPT0gbnVsbCB8fCByZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9ICgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHJlZ2lvbikuZ2V0VHlwZSgpOwotCQlDU1NOb2RlSW1wbCBtb2RpZmllZCA9IG51bGw7Ci0KLQkJSUNTU05vZGUgdGFyZ2V0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0KLQkJaWYgKChmUGFyc2VGbG9hdGluZyAmJiB0YXJnZXQgPT0gbnVsbCkgfHwgdGFyZ2V0IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpIHsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQltb2RpZmllZCA9IGluc2VydFNlbWlDb2xvbkZvclJ1bGUocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCW1vZGlmaWVkID0gaW5zZXJ0QnJhY2VPcGVuKHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQltb2RpZmllZCA9IGluc2VydEJyYWNlQ2xvc2UocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFIHx8IENTU1V0aWwuaXNTZWxlY3RvclRleHQocmVnaW9uKSkgewotCQkJCWNoZWNrTmV4dE5vZGUocmVnaW9uLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUKSB7Ci0JCQkJY2hlY2tOZXh0Tm9kZShyZWdpb24sIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKCh0YXJnZXQgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lciB8fCB0YXJnZXQgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKSAmJiB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSkgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRTdHlsZURlY2xhcmF0aW9uSXRlbShyZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtICYmIHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRTZW1pQ29sb25Gb3JTdHlsZURlY2xhcmF0aW9uSXRlbShyZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJbW9kaWZpZWQgPSBpbnNlcnRCcmFjZUNsb3NlKHJlZ2lvbik7Ci0JCX0KLQotCQkvLyBwb3N0IHByb2Nlc3MKLQkJaWYgKG1vZGlmaWVkICE9IG51bGwpIHsKLQkJCWlmIChtb2RpZmllZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBtb2RpZmllZCkucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCByZWdpb25MaXN0KSB7Ci0JCWZvciAoRW51bWVyYXRpb24gZSA9IHJlZ2lvbkxpc3QuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbik7Ci0JCQlpZiAoZkNyZWF0aW9uQ29udGV4dC5pc1RvUmVwYXJzZSgpKSB7Ci0JCQkJaW50IG9yaWdTdGFydCA9IHJlZ2lvbi5nZXRFbmQoKTsKLQkJCQlpbnQgb3JpZ0VuZCA9IHJlZ2lvbkxpc3QuaXRlbShyZWdpb25MaXN0LmdldExlbmd0aCgpIC0gMSkuZ2V0RW5kKCk7Ci0JCQkJaW50IG5ld1N0YXJ0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRSZXBhcnNlU3RhcnQoKTsKLQkJCQlpbnQgbmV3RW5kID0gZkNyZWF0aW9uQ29udGV4dC5nZXRSZXBhcnNlRW5kKCk7Ci0JCQkJaWYgKG5ld1N0YXJ0IDwgb3JpZ1N0YXJ0IHx8IG9yaWdFbmQgPCBuZXdFbmQpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3Tm9kZUxpc3QgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0KG5ld1N0YXJ0LCBuZXdFbmQpOwotCQkJCQlzZXR1cENyZWF0aW9uQ29udGV4dChuZXdOb2RlTGlzdC5pdGVtKDApKTsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdOb2RlTGlzdCk7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZDcmVhdGlvbkNvbnRleHQucmVzZXRSZXBhcnNlUmFuZ2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydEZvbnRGYWNlUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBicmFjZU5vZGUpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gZkNyZWF0aW9uQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICghZlBhcnNlRmxvYXRpbmcgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTUnVsZUNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTRm9udEZhY2VSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NGb250RmFjZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbiwgYnJhY2VOb2RlKTsKLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocnVsZSk7Ci0JCS8vIFRhcmdldE5leHQgaXMgc2V0IHRvIG51bGwgYXV0b21hdGljYWxseQotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0SW1wb3J0UnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJlZ2luRG9jUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZERvY1JlZ2lvbikgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoYmVnaW5Eb2NSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJcmVnaW9ucy5yZW1vdmUoMCk7IC8vIG11c3QgYmUgIkBpbXBvcnQiCi0JCUlUZXh0UmVnaW9uIGhyZWZSZWdpb24gPSBudWxsOwotCQl3aGlsZSAoIXJlZ2lvbnMuaXNFbXB0eSgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gcmVnaW9ucy5yZW1vdmUoMCk7Ci0JCQlpZiAodGV4dFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmcgdHlwZSA9IHRleHRSZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcpIHsKLQkJCQlocmVmUmVnaW9uID0gdGV4dFJlZ2lvbjsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmIChocmVmUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJQ1NTSW1wb3J0UnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTSW1wb3J0UnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhTGlzdCA9IChNZWRpYUxpc3RJbXBsKSBydWxlLmdldE1lZGlhKCk7Ci0JCXNldE1lZGlhTGlzdChtZWRpYUxpc3QsIGJlZ2luRG9jUmVnaW9uLCByZWdpb25zKTsKLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCXJ1bGUuc2V0QXR0cmlidXRlKElDU1NJbXBvcnRSdWxlLkhSRUYsIGJlZ2luRG9jUmVnaW9uLmdldFRleHQoaHJlZlJlZ2lvbikpOwotCQl9Ci0KLQkJLy8gc2V0dXAgZmxhdCBjb250YWluZXIKLQkJcnVsZS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgZW5kRG9jUmVnaW9uKTsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IHJ1bGUuZ2V0QXR0cmlidXRlTm9kZShJQ1NTSW1wb3J0UnVsZS5IUkVGKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihiZWdpbkRvY1JlZ2lvbiwgaHJlZlJlZ2lvbiwgaHJlZlJlZ2lvbik7Ci0JCX0KLQotCQkvLyBpbnNlcnQgdG8gdHJlZQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkgJiYgcGFyZW50ICE9IG51bGwpIHsKLQkJCXByb3BhZ2F0ZVJhbmdlUHJlSW5zZXJ0KHBhcmVudCwgcnVsZSk7Ci0JCQlDU1NOb2RlSW1wbCBuZXh0ID0gZkNyZWF0aW9uQ29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5leHQgIT0gbnVsbCkgewotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUocnVsZSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQocnVsZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydE1lZGlhUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlDU1NNZWRpYVJ1bGVJbXBsIHJ1bGUgPSBmRmVlZGVyLmdldENTU01lZGlhUnVsZSgpOwotCQlpZiAocnVsZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCQlyZWdpb25zLnJlbW92ZSgwKTsgLy8gbXVzdCBiZSAiQG1lZGlhIgotCi0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHJlZ2lvbnMpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhTGlzdCA9IChNZWRpYUxpc3RJbXBsKSBydWxlLmdldE1lZGlhKCk7Ci0JCXNldE1lZGlhTGlzdChtZWRpYUxpc3QsIGZsYXROb2RlLCByZWdpb25zKTsKLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBicmFjZU5vZGUpOwotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRQYWdlUnVsZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGJyYWNlTm9kZSkgewotCQlDU1NOb2RlSW1wbCBwYXJlbnQgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKCFmUGFyc2VGbG9hdGluZyAmJiAhKHBhcmVudCBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBnZXQgc2VsZWN0b3IgcmVnaW9ucwotCQlJVGV4dFJlZ2lvbkxpc3Qgc2VsZWN0b3JSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChmbGF0Tm9kZS5nZXRSZWdpb25zKCkpOwotCQlzZWxlY3RvclJlZ2lvbnMucmVtb3ZlKDApOyAvLyBtdXN0IGJlICJAcGFnZSIKLQkJQ1NTVXRpbC5zdHJpcFN1cnJvdW5kaW5nU3BhY2Uoc2VsZWN0b3JSZWdpb25zKTsKLQotCQlDU1NQYWdlUnVsZUltcGwgcnVsZSA9IGZGZWVkZXIuZ2V0Q1NTUGFnZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCVN0cmluZyBzZWxlY3RvclN0ciA9IENTU1V0aWwuZ2V0UmVnaW9uVGV4dChmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zKTsKLQkJCWlmICgwIDwgc2VsZWN0b3JTdHIubGVuZ3RoKCkpIHsKLQkJCQlydWxlLnNldFNlbGVjdG9yVGV4dChzZWxlY3RvclN0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlydWxlLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlLCBicmFjZU5vZGUpOwotCQlDU1NBdHRySW1wbCBhdHRyID0gcnVsZS5nZXRBdHRyaWJ1dGVOb2RlKElDU1NQYWdlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgc2VsZWN0b3JSZWdpb25zICE9IG51bGwgJiYgIXNlbGVjdG9yUmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCWF0dHIuc2V0UmFuZ2VSZWdpb24oZmxhdE5vZGUsIHNlbGVjdG9yUmVnaW9ucy5nZXQoMCksIHNlbGVjdG9yUmVnaW9ucy5nZXQoc2VsZWN0b3JSZWdpb25zLnNpemUoKSAtIDEpKTsKLQkJfQotCi0JCS8vIGluc2VydCB0byB0cmVlCi0JCWlmICghZlVwZGF0ZUNvbnRleHQuaXNBY3RpdmUoKSAmJiBwYXJlbnQgIT0gbnVsbCkgewotCQkJcHJvcGFnYXRlUmFuZ2VQcmVJbnNlcnQocGFyZW50LCBydWxlKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShydWxlLCBuZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXBhcmVudC5hcHBlbmRDaGlsZChydWxlKTsKLQkJCX0KLQkJfQotCi0JCWZDcmVhdGlvbkNvbnRleHQuc2V0VGFyZ2V0Tm9kZShydWxlKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTZW1pQ29sb25Gb3JSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ga2V5UmVnaW9uID0gQ1NTVXRpbC5maW5kUHJldmlvdXNTaWduaWZpY2FudE5vZGUocmVnaW9uKTsKLQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoa2V5UmVnaW9uKTsKLQotCQlDU1NOb2RlSW1wbCBpbnNlcnRlZCA9IG51bGw7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQpIHsKLQkJCWluc2VydGVkID0gaW5zZXJ0SW1wb3J0UnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCkgewotCQkJaW5zZXJ0ZWQgPSBpbnNlcnRDaGFyc2V0UnVsZShrZXlSZWdpb24sIHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gaW5zZXJ0ZWQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBpbnNlcnRTZW1pQ29sb25Gb3JTdHlsZURlY2xhcmF0aW9uSXRlbShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQkvLyBvbmx5IHRhcmdldC9uZXQgbm9kZSBpcyBjaGFuZ2VkLiBub3RoaW5nIHRvIGRvLgotCi0JCUNTU05vZGVJbXBsIHRhcmdldE5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJaW50IG9mZnNldCA9IHRhcmdldE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCS8vIHdpZGVuIGRvY3VtZW50IHJlZ2lvbiByYW5nZQotCQkJLy8gKChDU1NTdHlsZURlY2xJdGVtSW1wbCl0YXJnZXROb2RlKS5zZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHJlZ2lvbik7Ci0JCQlDU1NNb2RlbFV0aWwuZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKChDU1NTdHlsZURlY2xJdGVtSW1wbCkgdGFyZ2V0Tm9kZSwgcmVnaW9uKTsKLQkJCS8vIHBzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluZGljYXRlcyBDU1NTdHlsZURlY2xJdGVtCi0JCQlJQ1NTTm9kZSBwYXJlbnROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUocGFyZW50Tm9kZSk7Ci0JCQlJQ1NTTm9kZSBuZXh0ID0gbnVsbDsKLQkJCWlmIChwYXJlbnROb2RlLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCWZvciAoSUNTU05vZGUgY2hpbGQgPSB0YXJnZXROb2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciAmJiBvZmZzZXQgPCAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQkJCW5leHQgPSBjaGlsZDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQotCQkJcmV0dXJuIHRhcmdldE5vZGU7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGluc2VydFN0eWxlRGVjbGFyYXRpb25JdGVtKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHBhcmVudCA9IG51bGw7Ci0JCUNTU05vZGVJbXBsIG5vZGUgPSBmQ3JlYXRpb25Db250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lcikgewotCQkJQ1NTUnVsZURlY2xDb250YWluZXIgZGVjbENvbnRhaW5lciA9IChDU1NSdWxlRGVjbENvbnRhaW5lcikgbm9kZTsKLQkJCXBhcmVudCA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgZGVjbENvbnRhaW5lci5nZXRTdHlsZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgewotCQkJcGFyZW50ID0gKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSBub2RlOwotCQl9Ci0KLQkJQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyIGl0ZW1QYXJzZXIgPSBuZXcgQ1NTRGVjbGFyYXRpb25JdGVtUGFyc2VyKHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpdGVtUGFyc2VyLnNldFN0cnVjdHVyZWREb2N1bWVudFRlbXBvcmFyeShmYWxzZSk7Ci0JCWl0ZW1QYXJzZXIuc2V0VXBkYXRlQ29udGV4dChmVXBkYXRlQ29udGV4dCk7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGRlY2xJdGVtID0gaXRlbVBhcnNlci5zZXR1cERlY2xhcmF0aW9uSXRlbShkb2NSZWdpb24pOwotCQlpZiAoZGVjbEl0ZW0gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBzZXR1cCBmbGF0IGNvbnRhaW5lcgotCQlkZWNsSXRlbS5zZXRSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2NSZWdpb24sIGRvY1JlZ2lvbik7Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIGRlY2xJdGVtKTsKLQkJCUNTU05vZGVJbXBsIG5leHQgPSBmQ3JlYXRpb25Db250ZXh0LmdldE5leHROb2RlKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShkZWNsSXRlbSwgbmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlwYXJlbnQuYXBwZW5kQ2hpbGQoZGVjbEl0ZW0pOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKGRlY2xJdGVtKTsKLQkJLy8gVGFyZ2V0TmV4dCBpcyBzZXQgdG8gbnVsbCBhdXRvbWF0aWNhbGx5Ci0KLQkJcmV0dXJuIGRlY2xJdGVtOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTTm9kZUltcGwgaW5zZXJ0U3R5bGVSdWxlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYnJhY2VOb2RlKSB7Ci0JCUNTU05vZGVJbXBsIHBhcmVudCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQlpZiAoIWZQYXJzZUZsb2F0aW5nICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1J1bGVDb250YWluZXIpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGdldCBzZWxlY3RvciByZWdpb25zCi0JCUlUZXh0UmVnaW9uTGlzdCBzZWxlY3RvclJlZ2lvbnMgPSBuZXcgVGV4dFJlZ2lvbkxpc3RJbXBsKGZsYXROb2RlLmdldFJlZ2lvbnMoKSk7Ci0JCUNTU1V0aWwuc3RyaXBTdXJyb3VuZGluZ1NwYWNlKHNlbGVjdG9yUmVnaW9ucyk7Ci0KLQkJQ1NTU3R5bGVSdWxlSW1wbCBydWxlID0gZkZlZWRlci5nZXRDU1NTdHlsZVJ1bGUoKTsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWZVcGRhdGVDb250ZXh0LmlzQWN0aXZlKCkpIHsKLQkJCVN0cmluZyBzZWxlY3RvclN0ciA9IENTU1V0aWwuZ2V0UmVnaW9uVGV4dChmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zKTsKLQkJCWlmIChzZWxlY3RvclN0ciAhPSBudWxsICYmIDAgPCBzZWxlY3RvclN0ci5sZW5ndGgoKSkgewotCQkJCXJ1bGUuc2V0U2VsZWN0b3JUZXh0KHNlbGVjdG9yU3RyKTsKLQkJCX0KLQkJfQotCi0JCS8vIHNldHVwIGZsYXQgY29udGFpbmVyCi0JCXJ1bGUuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUsIGJyYWNlTm9kZSk7Ci0JCUNTU0F0dHJJbXBsIGF0dHIgPSBydWxlLmdldEF0dHJpYnV0ZU5vZGUoSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiBzZWxlY3RvclJlZ2lvbnMgIT0gbnVsbCAmJiAhc2VsZWN0b3JSZWdpb25zLmlzRW1wdHkoKSkgewotCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihmbGF0Tm9kZSwgc2VsZWN0b3JSZWdpb25zLmdldCgwKSwgc2VsZWN0b3JSZWdpb25zLmdldChzZWxlY3RvclJlZ2lvbnMuc2l6ZSgpIC0gMSkpOwotCQl9Ci0KLQkJLy8gaW5zZXJ0IHRvIHRyZWUKLQkJaWYgKCFmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpICYmIHBhcmVudCAhPSBudWxsKSB7Ci0JCQlwcm9wYWdhdGVSYW5nZVByZUluc2VydChwYXJlbnQsIHJ1bGUpOwotCQkJQ1NTTm9kZUltcGwgbmV4dCA9IGZDcmVhdGlvbkNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKHJ1bGUsIG5leHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcGFyZW50LmFwcGVuZENoaWxkKHJ1bGUpOwotCQkJfQotCQl9Ci0KLQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKHJ1bGUpOwotCQkvLyBUYXJnZXROZXh0IGlzIHNldCB0byBudWxsIGF1dG9tYXRpY2FsbHkKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJldGVuZFJlbW92ZU5vZGUoKSB7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBub2RlID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZlVwZGF0ZUNvbnRleHQuZ2V0RGVsZXRpb25UYXJnZXQoKTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdE5vZGUgIT0gbnVsbCkgewotCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VCZWdpbihmaXJzdE5vZGUpOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCWZEZWxldGlvbkNvbnRleHQuZXhwYW5kUmVtb3ZlZFJhbmdlRW5kKGxhc3ROb2RlKTsKLQkJfQotCi0JCXNocmlua0NvbnRhaW5lcigoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmVXBkYXRlQ29udGV4dC5nZXREZWxldGlvblRhcmdldFBhcmVudCgpLCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKgljdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIGNoaWxkCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9wYWdhdGVSYW5nZVByZUluc2VydChDU1NOb2RlSW1wbCBwYXJlbnQsIENTU05vZGVJbXBsIGNoaWxkKSB7Ci0JCWlmICghKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB8fCAhKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBwYXJlbnRDb250YWluZXIgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCUNTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjaGlsZENvbnRhaW5lciA9IChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGNoaWxkOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IGNoaWxkQ29udGFpbmVyLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBjaGlsZENvbnRhaW5lci5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdE5vZGUgPT0gbnVsbCB8fCBsYXN0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGJNb2RpZmllZCA9IHBhcmVudENvbnRhaW5lci5pbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmlyc3ROb2RlLCBsYXN0Tm9kZSk7Ci0JCWlmIChiTW9kaWZpZWQpIHsKLQkJCXBhcmVudENvbnRhaW5lci5wcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCWRvIHsKLQkJCQlmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0UHJldk5vZGUoZmxhdE5vZGUpOwotCQkJCXR5cGUgPSAoZmxhdE5vZGUgIT0gbnVsbCkgPyBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpIDogbnVsbDsKLQkJCX0KLQkJCXdoaWxlICh0eXBlICE9IG51bGwgJiYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpZiAoZkRlbGV0aW9uQ29udGV4dC5pc0luUmVtb3ZlZFJhbmdlKGZsYXROb2RlKSkgeyAvLyBhbHJlYWR5Ci0JCS8vIHJlbW92ZWQKLQkJLy8gcmV0dXJuOwotCQkvLyB9Ci0KLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIG5vZGUgPSBmRGVsZXRpb25Db250ZXh0LmZpbmREZWxldGlvblRhcmdldCgoQ1NTTm9kZUltcGwpZkRvY3VtZW50LCBmbGF0Tm9kZSk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgbm9kZSA9PSBmRG9jdW1lbnQpIHsKLQkJCXJldHVybjsgLy8gbm90IGF0dGFjaGVkIHdpdGggYW55IHRyZWVOb2RlCi0JCX0KLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKSB7Ci0JCQlJQ1NTTm9kZSBydWxlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocnVsZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZUltcGwpIHsKLQkJCQlub2RlID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcnVsZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCi0JCS8vIElDU1NOb2RlIHAgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJLy8gaWYgKHAgPT0gbnVsbCB8fCAhIChwIGluc3RhbmNlb2YKLQkJLy8gQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSkgewotCQkvLyByZXR1cm47Ci0JCS8vIH0KLQkJLy8gQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIHBhcmVudCA9Ci0JCS8vIChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpcDsKLQotCQlpZiAoZkRlbGV0aW9uQ29udGV4dC5hZGROb2RlVG9CZVJlbW92ZWQobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZpcnN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJZkRlbGV0aW9uQ29udGV4dC5leHBhbmRSZW1vdmVkUmFuZ2VCZWdpbihmaXJzdE5vZGUpOwotCQkJfQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQlmRGVsZXRpb25Db250ZXh0LmV4cGFuZFJlbW92ZWRSYW5nZUVuZChsYXN0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzaHJpbmtDb250YWluZXIobm9kZSk7Ci0JCS8vIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBmbGF0Tm9kZXMpIHsKLQkJZm9yIChFbnVtZXJhdGlvbiBlID0gZmxhdE5vZGVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0KLQkJSXRlcmF0b3IgaSA9IGZEZWxldGlvbkNvbnRleHQuZ2V0Tm9kZXNUb0JlUmVtb3ZlZCgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU05vZGVJbXBsIG5vZGUgPSAoQ1NTTm9kZUltcGwpIGkubmV4dCgpOwotCQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUNTU05vZGVJbXBsIHBhcmVudCA9IChDU1NOb2RlSW1wbCkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAoIShwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlzaHJpbmtDb250YWluZXIoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgcGFyZW50LCAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlpZiAoZkRvY3VtZW50ID09IG51bGwgfHwgZkNyZWF0aW9uQ29udGV4dCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIDAgPCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpKSB7Ci0JCQlzZXR1cERlbGV0aW9uQ29udGV4dChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJCXNob3J0IHVwZGF0ZU1vZGUgPSBmVXBkYXRlQ29udGV4dC5nZXRVcGRhdGVNb2RlKCk7Ci0JCQlpZiAodXBkYXRlTW9kZSA9PSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lETEUpIHsKLQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcHJldGVuZFJlbW92ZU5vZGUoKTsKLQkJCX0KLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0KGZEZWxldGlvbkNvbnRleHQuZ2V0UmVtb3ZlZFJhbmdlQmVnaW4oKSwgZkRlbGV0aW9uQ29udGV4dC5nZXRSZW1vdmVkUmFuZ2VFbmQoKSk7Ci0JCQljbGVhbnVwRGVsZXRpb25Db250ZXh0KCk7Ci0JCX0KLQotCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsICYmIDAgPCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmdldExlbmd0aCgpKSB7Ci0JCQlzZXR1cENyZWF0aW9uQ29udGV4dChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpOwotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJfQotCi0JCS8vIG1ha2UgZG9jdW1lbnQgaG9sZCB3aG9sZSBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJLyoKLQkJICogYm9vbGVhbiBiVXBkYXRlID0gZmFsc2U7IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCSAqIGZsYXROb2RlID0gZkRvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7IGJVcGRhdGUgPQotCQkgKiBiVXBkYXRlIHx8IChmbGF0Tm9kZSA9PSBudWxsIHx8Ci0JCSAqIGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGZsYXROb2RlKSB8fAotCQkgKiBmbGF0Tm9kZS5nZXRQcmV2aW91cygpICE9IG51bGwpOyBmbGF0Tm9kZSA9Ci0JCSAqIGZEb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7IGJVcGRhdGUgPSBiVXBkYXRlIHx8Ci0JCSAqIChmbGF0Tm9kZSA9PSBudWxsIHx8IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaXNPbGROb2RlKGZsYXROb2RlKSB8fAotCQkgKiBmbGF0Tm9kZS5nZXROZXh0KCkgIT0gbnVsbCk7Ci0JCSAqLwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCSgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKWZEb2N1bWVudCkuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oc3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkvKiB9ICovCi0KLQkJLy8gcmVtb3ZlIGluIG9mZmljaWFsIHJlbGVhc2UKLQkJLy8gQ1NTTW9kZWxVdGlsLmRpYWdub3NlVHJlZShmRG9jdW1lbnQsCi0JCS8vIGZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG5ld1JlZ2lvbnMgPT0gbnVsbCB8fCBvbGRSZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q3JlYXRpb25UYXJnZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsIHx8IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpIDw9IDApIHsKLQkJCS8vIHRvcCBvZiBkb2N1bWVudAotCQkJZkNyZWF0aW9uQ29udGV4dC5zZXRUYXJnZXROb2RlKGZEb2N1bWVudCk7Ci0JCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKGZEb2N1bWVudC5nZXRGaXJzdENoaWxkKCkpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQlDU1NOb2RlSW1wbCBjdXJzb3JOb2RlID0gZ2V0Tm9kZUF0KGN1cnNvclBvcyk7Ci0JCWlmIChjdXJzb3JOb2RlID09IG51bGwpIHsgLy8gZW5kIG9mIGRvY3VtZW50Ci0JCQljdXJzb3JOb2RlID0gKENTU05vZGVJbXBsKWZEb2N1bWVudDsKLQkJfQotCi0JCS8vIGZpbmQgZWRnZSBvZiB0cmVlIG5vZGUKLQkJQ1NTTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0JCS8vIGJvb2xlYW4gYk92ZXJTZW1pQ29sb24gPSBmYWxzZTsKLQkJYm9vbGVhbiBiT3Zlck9wZW5CcmFjZSA9IGZhbHNlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQlmb3IgKGZsYXROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOyBmbGF0Tm9kZSAhPSBudWxsOyBmbGF0Tm9kZSA9IGZsYXROb2RlLmdldFByZXZpb3VzKCkpIHsKLQkJCW5vZGUgPSBnZXROb2RlQXQoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQkJbm9kZSA9IChDU1NOb2RlSW1wbClmRG9jdW1lbnQ7Ci0JCQl9Ci0JCQlpZiAobm9kZSAhPSBjdXJzb3JOb2RlIHx8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA9PSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJU3RyaW5nIHR5cGUgPSBDU1NVdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQkJCS8vIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwKLQkJCQkvLyB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkvLyBiT3ZlclNlbWlDb2xvbiA9IHRydWU7Ci0JCQkJLy8gfSBlbHNlCi0JCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQliT3Zlck9wZW5CcmFjZSA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJQ1NTTm9kZUltcGwgdGFyZ2V0Tm9kZSA9IG51bGw7Ci0KLQkJLy8gaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJLy8gdjwtLXwKLQkJLy8gQUFBQUFBCi0JCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpBICwgbm9kZTpCIC0+IHRhcmdldCBpcyBBCi0JCS8vIHRhcmdldE5vZGUgPSAobm9kZSA9PSBudWxsKSA/IGZEb2N1bWVudCA6IG5vZGU7Ci0JCS8vIH0gZWxzZQotCQlpZiAoY3Vyc29yTm9kZSA9PSBub2RlKSB7Ci0JCQkvLyB2PC0tfAotCQkJLy8gQUFBQUFBCi0JCQkvLyBCQkJCQkJCQkJCIGN1cnNvck5vZGU6QSAsIG5vZGU6QiAtPiB0YXJnZXQgaXMgQQotCQkJaWYgKGJPdmVyT3BlbkJyYWNlICYmIGN1cnNvck5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lcikgewotCQkJCXRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpICgoQ1NTUnVsZURlY2xDb250YWluZXIpIGN1cnNvck5vZGUpLmdldFN0eWxlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0YXJnZXROb2RlID0gY3Vyc29yTm9kZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHY8LS18Ci0JCQkvLyBBQUEKLQkJCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpCICwgbm9kZTpBIC0+IGRlcGVuZCBvbiBBJ3Mgbm9kZSB0eXBlCi0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCQkvLyB0YXJnZXROb2RlID0gKENTU05vZGVJbXBsKSgoYk92ZXJTZW1pQ29sb24pID8KLQkJCQkvLyBub2RlLmdldFBhcmVudE5vZGUoKSA6IG5vZGUpOyAvLyBOUAotCQkJCVN0cmluZyByZWdpb25UeXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJCQl0YXJnZXROb2RlID0gKENTU05vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRhcmdldE5vZGUgPSBub2RlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShmbGF0Tm9kZSkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCXRhcmdldE5vZGUgPSAoQ1NTTm9kZUltcGwpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGFyZ2V0Tm9kZSA9IG5vZGU7Ci0JCQl9Ci0JCX0KLQotCQlmQ3JlYXRpb25Db250ZXh0LnNldFRhcmdldE5vZGUodGFyZ2V0Tm9kZSk7Ci0JCUlDU1NOb2RlIG5leHQgPSBudWxsOwotCQlpZiAodGFyZ2V0Tm9kZS5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCWZvciAoSUNTU05vZGUgY2hpbGQgPSB0YXJnZXROb2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyICYmIGN1cnNvclBvcyA8ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQluZXh0ID0gY2hpbGQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmQ3JlYXRpb25Db250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0UmVwYXJzZVJhbmdlKCkgewotCQlmQ3JlYXRpb25Db250ZXh0LmNsZWFyKCk7Ci0JfQotCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFdhbGtlciA9PSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFdhbGtlcigpOwotCQl9Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIuaW5pdGlhbGl6ZShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogcmVnaW9uczogc3Vycm91bmRpbmcgc3BhY2VzIHNob3VsZCBiZSByZW1vdmVkLiBRLiBXaHkgZGlkIHlvdSBzZXQKLQkgKiBtZWRpYVRhYmxlID8gQS4gTWVkaWFMaXN0IG1heSBoYXZlIHR3byBvciBtb3JlIG1lZGl1bSB0aGF0IGhhdmUgc2FtZQotCSAqIHZhbHVlLCB0aGVuIHNlYXJjaW5nIGluIE1lZGlhTGlzdCBpcyBub3QgcGVyZmVjdC4gUS4KLQkgKiBmVXBkYXRlQ29udGV4dC5pc0FjdGl2ZSgpIGlzIG5vdCBjYXJlLiBBcmUgeW91IE9LPyBBLiBPSy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0TWVkaWFMaXN0KE1lZGlhTGlzdEltcGwgbWVkaWFMaXN0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zKSB7Ci0JCWlmIChtZWRpYUxpc3QgPT0gbnVsbCB8fCB0ZXh0UmVnaW9ucyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ29sbGVjdGlvbiBtZWRpYVRhYmxlID0gbmV3IEhhc2hTZXQoKTsKLQkJQ1NTTm9kZUxpc3RJbXBsIGF0dHJzID0gbWVkaWFMaXN0LmdldE1lZGlhKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpICE9IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCW1lZGlhVGFibGUuYWRkKGF0dHJzLml0ZW0oaSkpOwotCQl9Ci0KLQkJSVRleHRSZWdpb24gc3RhcnQgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBlbmQgPSBudWxsOwotCi0JCUl0ZXJhdG9yIGkgPSB0ZXh0UmVnaW9ucy5pdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gKElUZXh0UmVnaW9uKSAoKGkuaGFzTmV4dCgpKSA/IGkubmV4dCgpIDogbnVsbCk7Ci0JCXdoaWxlICh0ZXh0UmVnaW9uICE9IG51bGwpIHsKLQkJCWlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESVVNKSB7Ci0JCQkJU3RyaW5nIG1lZGl1bVN0ciA9IHJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQkJCWlmICgwIDwgbWVkaXVtU3RyLmxlbmd0aCgpKSB7Ci0JCQkJCUNTU0F0dHJJbXBsIGF0dHIgPSBudWxsOwotCQkJCQkvLyBpcyB0aGUgbWVkaXVtIGFscmVhZHkgc2V0ID8KLQkJCQkJSXRlcmF0b3IgaVRhYmxlID0gbWVkaWFUYWJsZS5pdGVyYXRvcigpOwotCQkJCQl3aGlsZSAoaVRhYmxlLmhhc05leHQoKSkgewotCQkJCQkJQ1NTQXR0ckltcGwgY2FpID0gKENTU0F0dHJJbXBsKSBpVGFibGUubmV4dCgpOwotCQkJCQkJaWYgKG1lZGl1bVN0ci5lcXVhbHNJZ25vcmVDYXNlKGNhaS5nZXRWYWx1ZSgpKSkgewotCQkJCQkJCWF0dHIgPSBjYWk7Ci0JCQkJCQkJbWVkaWFUYWJsZS5yZW1vdmUoY2FpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoYXR0ciA9PSBudWxsKSB7Ci0JCQkJCQkvLyBpcyBub3Qgc2V0LiBjcmVhdGUgbmV3IGF0dHJpYnV0ZQotCQkJCQkJU3RyaW5nIGtleSA9ICJtZWRpdW1QIiArIG1lZGlhTGlzdC5tZWRpdW1Db3VudGVyKys7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1lZGlhTGlzdC5zZXRBdHRyaWJ1dGUoa2V5LCBtZWRpdW1TdHIpOwotCQkJCQkJYXR0ciA9IG1lZGlhTGlzdC5nZXRBdHRyaWJ1dGVOb2RlKGtleSk7Ci0JCQkJCX0KLQkJCQkJYXR0ci5zZXRSYW5nZVJlZ2lvbihyZWdpb24sIHRleHRSZWdpb24sIHRleHRSZWdpb24pOwotCQkJCQlpZiAoc3RhcnQgPT0gbnVsbCkgewotCQkJCQkJc3RhcnQgPSB0ZXh0UmVnaW9uOwotCQkJCQl9Ci0JCQkJCWVuZCA9IHRleHRSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJdGV4dFJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgKChpLmhhc05leHQoKSkgPyBpLm5leHQoKSA6IG51bGwpOwotCQl9Ci0KLQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kICE9IG51bGwpIHsKLQkJCW1lZGlhTGlzdC5zZXRSYW5nZVJlZ2lvbihyZWdpb24sIHN0YXJ0LCBlbmQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQ3JlYXRpb25Db250ZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCXJlc2V0UmVwYXJzZVJhbmdlKCk7Ci0JCXJlc2V0Q3JlYXRpb25UYXJnZXQocmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0dXBEZWxldGlvbkNvbnRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlmRGVsZXRpb25Db250ZXh0LnNldHVwQ29udGV4dChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldHVwVXBkYXRlQ29udGV4dChzaG9ydCB1cGRhdGVNb2RlLCBJQ1NTTm9kZSBwYXJlbnROb2RlLCBJQ1NTTm9kZSB0YXJnZXROb2RlKSB7Ci0JCWZVcGRhdGVDb250ZXh0LnNldHVwQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCB0YXJnZXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNocmlua0NvbnRhaW5lcihDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50LCBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0JCWJNb2RpZmllZCA9IGJNb2RpZmllZCB8fCBjbGVhbnVwTGFzdE5vZGUoY2hpbGQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBwYXJlbnQpOwotCQliTW9kaWZpZWQgPSBiTW9kaWZpZWQgfHwgY2xlYW51cEZpcnN0Tm9kZShjaGlsZC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCBwYXJlbnQpOwotCi0JCWlmIChiTW9kaWZpZWQpIHsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWZvciAoSUNTU05vZGUgbm9kZSA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQlpZiAoY2hpbGQgIT0gbm9kZSAmJiBub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWNoaWxkLnNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwsIG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFVwZGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0NDk5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsVXBkYXRlQ29udGV4dCB7Ci0KLQotCWNsYXNzIENTU05vZGVVcGRhdGVUcmF2ZXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0JCXB1YmxpYyBDU1NOb2RlVXBkYXRlVHJhdmVyc2VyKCkgewotCQkJc3VwZXIoKTsKLQkJCXNldFRyYXZlcnNlSW1wb3J0ZWQoZmFsc2UpOwotCQkJc2V0VHJhdmVyc2VJbXBvcnRGaXJzdChmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgTGlua2VkTGlzdCBnZXROb2RlTGlzdCgpIHsKLQkJCXJldHVybiBmVHJhdk5vZGVMaXN0OwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQkJZlRyYXZOb2RlTGlzdCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NBdHRySW1wbCB8fCBub2RlIGluc3RhbmNlb2YgTWVkaWFMaXN0SW1wbCkgewotCQkJCS8vIHNraXAKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZUcmF2Tm9kZUxpc3QuYWRkKG5vZGUpOwotCQkJfQotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVDb250YWluZXIpIHsKLQkJCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0JCQl9Ci0JCX0KLQotCQlMaW5rZWRMaXN0IGZUcmF2Tm9kZUxpc3QgPSBudWxsOwotCX0KLQotCUlDU1NOb2RlIGZMYXN0Tm9kZSA9IG51bGw7Ci0JSUNTU05vZGUgZkRlbGV0aW9uVGFyZ2V0UGFyZW50ID0gbnVsbDsKLQlJQ1NTTm9kZSBmRGVsZXRpb25UYXJnZXQgPSBudWxsOwotCUxpbmtlZExpc3QgZk5vZGVMaXN0ID0gbnVsbDsKLQlwcml2YXRlIHNob3J0IGZVcGRhdGVNb2RlID0gVVBEQVRFX0lETEU7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9JRExFID0gMDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgVVBEQVRFX0lOU0VSVF9GTkNPTlRBSU5FUiA9IDE7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9JTlNFUlRfUkNPTlRBSU5FUiA9IDI7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IFVQREFURV9SRU1PVkVfRk5DT05UQUlORVIgPSAzOwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfUkVNT1ZFX1JDT05UQUlORVIgPSA0OwotCXN0YXRpYyBmaW5hbCBzaG9ydCBVUERBVEVfQ0hBTkdFX1JDT05UQUlORVIgPSA1OwotCi0JLyoqCi0JICogQ1NTTm9kZVVwZGF0ZVF1ZXVlIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTTW9kZWxVcGRhdGVDb250ZXh0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgY2xlYW51cENvbnRleHQoKSB7Ci0JCWZOb2RlTGlzdCA9IG51bGw7Ci0JCWZEZWxldGlvblRhcmdldCA9IG51bGw7Ci0JCWZEZWxldGlvblRhcmdldFBhcmVudCA9IG51bGw7Ci0JCWZVcGRhdGVNb2RlID0gVVBEQVRFX0lETEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ291bnRlckltcGwgZ2V0Q291bnRlcigpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDb3VudGVySW1wbCkgewotCQkJcmV0dXJuIChDb3VudGVySW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNvdW50ZXJJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NDaGFyc2V0UnVsZUltcGwgZ2V0Q1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTQ2hhcnNldFJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU0NoYXJzZXRSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU0NoYXJzZXRSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTRm9udEZhY2VSdWxlSW1wbCBnZXRDU1NGb250RmFjZVJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlSW1wbCkgewotCQkJcmV0dXJuIChDU1NGb250RmFjZVJ1bGVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTRm9udEZhY2VSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTSW1wb3J0UnVsZUltcGwgZ2V0Q1NTSW1wb3J0UnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NJbXBvcnRSdWxlSW1wbCkgewotCQkJcmV0dXJuIChDU1NJbXBvcnRSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU0ltcG9ydFJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NNZWRpYVJ1bGVJbXBsIGdldENTU01lZGlhUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU01lZGlhUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NNZWRpYVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQYWdlUnVsZUltcGwgZ2V0Q1NTUGFnZVJ1bGUoKSB7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXROb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUGFnZVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU1BhZ2VSdWxlSW1wbCkgbm9kZTsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNTU1BhZ2VSdWxlSW1wbCBpcyBleHBlY3RlZCwgYnV0ICIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQlDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpKTsKLQkJCXVuZ2V0Tm9kZSgpOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGdldENTU1ByaW1pdGl2ZVZhbHVlKHNob3J0IHR5cGUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gKChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGUpLmdldFByaW1pdGl2ZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSB0eXBlIHx8ICgobm9kZVR5cGUgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiB8fCBub2RlVHlwZSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIpICYmICh0eXBlID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgfHwgdHlwZSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIpKSkgewotCQkJCXJldHVybiAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBub2RlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHsKLQkJCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCB2YWx1ZSA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIG5vZGU7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NQcmltaXRpdmVWYWx1ZUltcGwgWyIgKyB0eXBlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJIl0gaXMgZXhwZWN0ZWQsIGJ1dCB0eXBlIGlzIFsiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJdmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpICsgIl06IFwiIiArIHZhbHVlLmdlbmVyYXRlU291cmNlKCkgKyAiXCIiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKCIgKyB0eXBlICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJIikgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCX0KLQotCQl1bmdldE5vZGUoKTsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1ByaW1pdGl2ZVZhbHVlSW1wbCBnZXRDU1NQcmltaXRpdmVWYWx1ZUFueSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NQcmltaXRpdmVWYWx1ZUltcGwpIHsKLQkJCXJldHVybiAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZURlY2xJdGVtSW1wbCBnZXRDU1NTdHlsZURlY2xJdGVtKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCAmJiAoKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHByb3BlcnR5TmFtZSkpIHsKLQkJCXJldHVybiAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NTdHlsZURlY2xJdGVtSW1wbCgiICsgcHJvcGVydHlOYW1lICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJIikgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ly8kTk9OLU5MUy0xJAotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVJ1bGVJbXBsIGdldENTU1N0eWxlUnVsZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZVJ1bGVJbXBsKSB7Ci0JCQlyZXR1cm4gKENTU1N0eWxlUnVsZUltcGwpIG5vZGU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJDU1NTdHlsZVJ1bGVJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0RGVsZXRpb25UYXJnZXQoKSB7Ci0JCXJldHVybiBmRGVsZXRpb25UYXJnZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCUlDU1NOb2RlIGdldERlbGV0aW9uVGFyZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gZkRlbGV0aW9uVGFyZ2V0UGFyZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgSUNTU05vZGUgZ2V0Tm9kZSgpIHsKLQkJSUNTU05vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChmTm9kZUxpc3QgIT0gbnVsbCAmJiAwIDwgZk5vZGVMaXN0LnNpemUoKSkgewotCQkJbm9kZSA9IChJQ1NTTm9kZSkgZk5vZGVMaXN0LnJlbW92ZUZpcnN0KCk7Ci0JCX0KLQkJZkxhc3ROb2RlID0gbm9kZTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldE5vZGVDb3VudCgpIHsKLQkJaWYgKGZOb2RlTGlzdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZk5vZGVMaXN0LnNpemUoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIElDU1NOb2RlIGdldFBhcmVudE5vZGUoKSB7Ci0JLy8gcmV0dXJuIGZQYXJlbnROb2RlOwotCS8vIH0KLQkvKioKLQkgKiAKLQkgKi8KLQlSZWN0SW1wbCBnZXRSZWN0KCkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0Tm9kZSgpOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFJlY3RJbXBsKSB7Ci0JCQlyZXR1cm4gKFJlY3RJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiUmVjdEltcGwgaXMgZXhwZWN0ZWQsIGJ1dCAiICsgLy8kTk9OLU5MUy0xJAotCQkJCQkJQ1NTVXRpbC5nZXRDbGFzc1N0cmluZyhub2RlKSk7Ci0JCQl1bmdldE5vZGUoKTsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVJHQkNvbG9ySW1wbCBnZXRSR0JDb2xvcigpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGdldE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBSR0JDb2xvckltcGwpIHsKLQkJCXJldHVybiAoUkdCQ29sb3JJbXBsKSBub2RlOwotCQl9Ci0JCWVsc2UgewotCQkJQ1NTVXRpbC5kZWJ1Z091dCgiUkdCQ29sb3JJbXBsIGlzIGV4cGVjdGVkLCBidXQgIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCUNTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkpOwotCQkJdW5nZXROb2RlKCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0Jc2hvcnQgZ2V0VXBkYXRlTW9kZSgpIHsKLQkJcmV0dXJuIGZVcGRhdGVNb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiAoZk5vZGVMaXN0ICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0dXBDb250ZXh0KHNob3J0IHVwZGF0ZU1vZGUsIElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIHRhcmdldE5vZGUpIHsKLQkJZlVwZGF0ZU1vZGUgPSB1cGRhdGVNb2RlOwotCi0JCUlDU1NOb2RlIHRyYXZlcnNlUm9vdDsKLQkJaWYgKHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX0NIQU5HRV9SQ09OVEFJTkVSKSB7Ci0JCQl0cmF2ZXJzZVJvb3QgPSBwYXJlbnROb2RlOwotCQkJd2hpbGUgKHRyYXZlcnNlUm9vdCBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJCXRyYXZlcnNlUm9vdCA9IHRyYXZlcnNlUm9vdC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0cmF2ZXJzZVJvb3QgPSB0YXJnZXROb2RlOwotCQl9Ci0KLQkJaWYgKHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSIHx8IC8vIHJlZ2lvbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaW5zZXJ0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyA9PgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcmVwbGFjZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZmxhdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm9kZQotCQkJCQl1cGRhdGVNb2RlID09IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUiB8fCB1cGRhdGVNb2RlID09IFVQREFURV9SRU1PVkVfRk5DT05UQUlORVIpIHsKLQkJCWZEZWxldGlvblRhcmdldCA9IHRyYXZlcnNlUm9vdDsKLQkJCWlmIChmRGVsZXRpb25UYXJnZXQgPT0gdGFyZ2V0Tm9kZSkgewotCQkJCWZEZWxldGlvblRhcmdldFBhcmVudCA9IHBhcmVudE5vZGU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmRGVsZXRpb25UYXJnZXRQYXJlbnQgPSBmRGVsZXRpb25UYXJnZXQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZkRlbGV0aW9uVGFyZ2V0ID0gbnVsbDsKLQkJCWZEZWxldGlvblRhcmdldFBhcmVudCA9IG51bGw7Ci0JCX0KLQotCQlpZiAodXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX1JDT05UQUlORVIgfHwgdXBkYXRlTW9kZSA9PSBVUERBVEVfSU5TRVJUX0ZOQ09OVEFJTkVSIHx8IHVwZGF0ZU1vZGUgPT0gVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSIHx8IC8vIHJlZ2lvbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyByZW1vdmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gPT4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gcmUtaW5zZXJ0Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGZsYXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbm9kZQotCQkJCQl1cGRhdGVNb2RlID09IFVQREFURV9DSEFOR0VfUkNPTlRBSU5FUikgewotCQkJQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlciB0cmF2ZXJzZXIgPSBuZXcgQ1NTTm9kZVVwZGF0ZVRyYXZlcnNlcigpOwotCQkJdHJhdmVyc2VyLmFwcGx5KHRyYXZlcnNlUm9vdCk7Ci0JCQlmTm9kZUxpc3QgPSB0cmF2ZXJzZXIuZ2V0Tm9kZUxpc3QoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZOb2RlTGlzdCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5nZXROb2RlKCkgewotCQlpZiAoZk5vZGVMaXN0ICE9IG51bGwgJiYgZkxhc3ROb2RlICE9IG51bGwpIHsKLQkJCWZOb2RlTGlzdC5hZGRGaXJzdChmTGFzdE5vZGUpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU01vZGVsVXBkYXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQ4MDU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5BdHRyQ2hhbmdlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsVXBkYXRlciB7Ci0KLQlwcml2YXRlIENTU01vZGVsSW1wbCBmTW9kZWwgPSBudWxsOwotCXByaXZhdGUgQ1NTTW9kZWxQYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NNb2RlbFVwZGF0ZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NNb2RlbFVwZGF0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTTW9kZWxVcGRhdGVyKENTU01vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQlmTW9kZWwgPSBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgdm9pZCBhdHRySW5zZXJ0ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTQXR0ckltcGwgYXR0cikgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNhbm5vdCBnZXQgZm9ybWF0IGFkYXB0ZXIgOiAiICsgcGFyZW50Tm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lOU0VSVF9SQ09OVEFJTkVSOwotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBhdHRyKTsKLQotCQkvLyBnZXQgZm9ybWF0dGVkIGluZm8KLQkJQXR0ckNoYW5nZUNvbnRleHQgcmVnaW9uID0gbmV3IEF0dHJDaGFuZ2VDb250ZXh0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhmb3JtYXR0ZXIuZm9ybWF0QXR0ckNoYW5nZWQocGFyZW50Tm9kZSwgYXR0ciwgdHJ1ZSwgcmVnaW9uKSk7Ci0KLQkJLy8gc2V0IHRleHQKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gaW5zZXJ0VGV4dChyZWdpb24uc3RhcnQsIHJlZ2lvbi5lbmQgLSByZWdpb24uc3RhcnQsIHRleHQpOwotCi0JCWludCBuUmVtYWlucyA9IGZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlpZiAoMCA8IG5SZW1haW5zICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXR0clJlbW92ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTQXR0ckltcGwgYXR0cikgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyID09IG51bGwpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIkNhbm5vdCBnZXQgZm9ybWF0IGFkYXB0ZXIgOiAiICsgcGFyZW50Tm9kZS5nZXRDbGFzcygpLnRvU3RyaW5nKCkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX1JFTU9WRV9SQ09OVEFJTkVSOwotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBhdHRyKTsKLQotCQkvLyBnZXQgZm9ybWF0dGVkIGluZm8KLQkJQXR0ckNoYW5nZUNvbnRleHQgcmVnaW9uID0gbmV3IEF0dHJDaGFuZ2VDb250ZXh0KCk7Ci0JCVN0cmluZyB0ZXh0ID0gbmV3IFN0cmluZyhmb3JtYXR0ZXIuZm9ybWF0QXR0ckNoYW5nZWQocGFyZW50Tm9kZSwgYXR0ciwgZmFsc2UsIHJlZ2lvbikpOwotCi0JCS8vIHNldCB0ZXh0Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IGluc2VydFRleHQocmVnaW9uLnN0YXJ0LCByZWdpb24uZW5kIC0gcmVnaW9uLnN0YXJ0LCB0ZXh0KTsKLQotCQlpbnQgblJlbWFpbnMgPSBmUGFyc2VyLmNsZWFudXBVcGRhdGVDb250ZXh0KCk7Ci0KLQkJaWYgKDAgPCBuUmVtYWlucyAmJiAhKHJlc3VsdCBpbnN0YW5jZW9mIE5vQ2hhbmdlRXZlbnQpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCQkKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYXR0clJlcGxhY2VkKENTU05vZGVJbXBsIHBhcmVudE5vZGUsIENTU05vZGVJbXBsIG5ld0F0dHIsIENTU05vZGVJbXBsIG9sZEF0dHIpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJYXR0clJlbW92ZWQocGFyZW50Tm9kZSwgKENTU0F0dHJJbXBsKSBvbGRBdHRyKTsKLQkJfQotCi0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCWF0dHJJbnNlcnRlZChwYXJlbnROb2RlLCAoQ1NTQXR0ckltcGwpIG5ld0F0dHIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoaWxkSW5zZXJ0ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlzaG9ydCB1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JRExFOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9JTlNFUlRfRk5DT05UQUlORVI7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikgewotCQkJdXBkYXRlTW9kZSA9IENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfSU5TRVJUX1JDT05UQUlORVI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDU1NVdGlsLmRlYnVnT3V0KCJXaGF0J3MgdGhpcyBub2RlPyA6ICIgKyBub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSk7Ly8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZlBhcnNlci5zZXR1cFVwZGF0ZUNvbnRleHQodXBkYXRlTW9kZSwgcGFyZW50Tm9kZSwgbm9kZSk7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gZGVmYXVsdEluc2VydGVkKHBhcmVudE5vZGUsIG5vZGUpOwotCi0JCWludCBuUmVtYWlucyA9IGZQYXJzZXIuY2xlYW51cFVwZGF0ZUNvbnRleHQoKTsKLQotCQlpZiAoMCA8IG5SZW1haW5zICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfTU9ESUZJQ0FUSU9OX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQJCQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoaWxkUmVtb3ZlZChDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCXNob3J0IHVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX0lETEU7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCXVwZGF0ZU1vZGUgPSBDU1NNb2RlbFVwZGF0ZUNvbnRleHQuVVBEQVRFX1JFTU9WRV9GTkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQl1cGRhdGVNb2RlID0gQ1NTTW9kZWxVcGRhdGVDb250ZXh0LlVQREFURV9SRU1PVkVfUkNPTlRBSU5FUjsKLQkJfQotCQllbHNlIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIldoYXQncyB0aGlzIG5vZGU/IDogIiArIG5vZGUuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlmUGFyc2VyLnNldHVwVXBkYXRlQ29udGV4dCh1cGRhdGVNb2RlLCBwYXJlbnROb2RlLCBub2RlKTsKLQotCQlDU1NOb2RlSW1wbCBwcmV2ID0gZ2V0T2xkUHJldmlvdXMocGFyZW50Tm9kZSwgbm9kZSk7Ci0JCUNTU05vZGVJbXBsIG5leHQgPSBnZXRPbGROZXh0KHBhcmVudE5vZGUsIG5vZGUpOwotCQlpbnQgaW5zZXJ0UG9zID0gLTEsIGVuZFBvcyA9IC0xOwotCQlTdHJpbmcgc291cmNlID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQlpbnNlcnRQb3MgPSBwcmV2LmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0UG9zID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW5zZXJ0UG9zIC09IG5lYXJlc3RTcGFjZUxlbmd0aEJlZm9yZShwYXJlbnROb2RlLCBpbnNlcnRQb3MpOwotCQl9Ci0JCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCWVuZFBvcyA9IG5leHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQllbHNlIHsKLQkJCWVuZFBvcyA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQllbmRQb3MgKz0gbmVhcmVzdFNwYWNlTGVuZ3RoQWZ0ZXIocGFyZW50Tm9kZSwgZW5kUG9zKTsKLQkJfQotCQlzb3VyY2UgPSBnZXRTcGFjZUJlZm9yZShwYXJlbnROb2RlLCBuZXh0LCBub2RlKTsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0OwotCQlpZiAoc291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJcmVzdWx0ID0gaW5zZXJ0VGV4dChpbnNlcnRQb3MsIGVuZFBvcyAtIGluc2VydFBvcywgc291cmNlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IHJlbW92ZVRleHQoaW5zZXJ0UG9zLCBlbmRQb3MgLSBpbnNlcnRQb3MpOwotCQl9Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQotCQkvKgotCQkgKiBpbnQgcmVtb3ZlU3RhcnQgPSAtMTsgaW50IHJlbW92ZUVuZCA9IC0xOyBpZiAobm9kZSBpbnN0YW5jZW9mCi0JCSAqIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkgKiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0KLQkJICogKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcilub2RlOwotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9Ci0JCSAqIGNvbnRhaW5lci5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0KLQkJICogY29udGFpbmVyLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsgaWYgKGZpcnN0Tm9kZSAhPSBudWxsICYmCi0JCSAqIGxhc3ROb2RlICE9IG51bGwpIHsgcmVtb3ZlU3RhcnQgPSBmaXJzdE5vZGUuZ2V0U3RhcnQoKTsgcmVtb3ZlRW5kID0KLQkJICogbGFzdE5vZGUuZ2V0RW5kKCk7IH0gfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCSAqIENTU1JlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoQ1NTUmVnaW9uQ29udGFpbmVyKW5vZGU7Ci0JCSAqIElUZXh0UmVnaW9uIGZpcnN0UmVnaW9uID0gY29udGFpbmVyLmdldEZpcnN0UmVnaW9uKCk7IElUZXh0UmVnaW9uCi0JCSAqIGxhc3RSZWdpb24gPSBjb250YWluZXIuZ2V0TGFzdFJlZ2lvbigpOyBpZiAoZmlyc3RSZWdpb24gIT0gbnVsbCAmJgotCQkgKiBsYXN0UmVnaW9uICE9IG51bGwpIHsgcmVtb3ZlU3RhcnQgPSBmaXJzdFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkgKiByZW1vdmVFbmQgPSBsYXN0UmVnaW9uLmdldEVuZE9mZnNldCgpOyB9IH0gaWYgKDAgPD0gcmVtb3ZlU3RhcnQgJiYKLQkJICogMCA8PSByZW1vdmVFbmQpIHsgcmVtb3ZlVGV4dChyZW1vdmVTdGFydCwgcmVtb3ZlRW5kIC0gcmVtb3ZlU3RhcnQgKwotCQkgKiAxKTsgfQotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGNoaWxkUmVwbGFjZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChvbGRDaGlsZCAhPSBudWxsKSB7Ci0JCQljaGlsZFJlbW92ZWQocGFyZW50Tm9kZSwgb2xkQ2hpbGQpOwotCQl9Ci0KLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCWNoaWxkSW5zZXJ0ZWQocGFyZW50Tm9kZSwgbmV3Q2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBkZWZhdWx0SW5zZXJ0ZWQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlpbnQgaW5zZXJ0UG9zID0gLTE7Ci0JCUlDU1NOb2RlIHNpYmxpbmc7Ci0JCVN0cmluZyBwcmVTcGFjZSA9ICIiLCBwb3N0U3BhY2UgPSAiIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAoaW5zZXJ0UG9zIDwgMCkgewotCQkJaWYgKChzaWJsaW5nID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSkgIT0gbnVsbCkgewotCQkJCS8vIGFmdGVyIHByZXZpb3VzIGNoaWxkCi0JCQkJaW5zZXJ0UG9zID0gZ2V0VGV4dEVuZChzaWJsaW5nKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQlpZiAoKHNpYmxpbmcgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpICE9IG51bGwpIHsKLQkJCQkvLyBiZWZvcmUgbmV4dCBjaGlsZAotCQkJCWluc2VydFBvcyA9IGdldFRleHRTdGFydChzaWJsaW5nKTsKLQkJCX0KLQkJfQotCi0JCWlmIChpbnNlcnRQb3MgPCAwKSB7Ci0JCQkvLyBwb3NpdGlvbiBvZiBwYXJlbnQKLQkJCWluc2VydFBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKHBhcmVudE5vZGUpOwotCQl9Ci0KLQkJaWYgKGluc2VydFBvcyA8IDApIHsKLQkJCS8vIGZpcnN0dGltZQotCQkJaW5zZXJ0UG9zID0gMDsKLQkJfQotCi0JCS8vIGZvcm1hdCBwcmV2aW91cyBzcGFjZXMKLQkJbGVuZ3RoID0gbmVhcmVzdFNwYWNlTGVuZ3RoQmVmb3JlKHBhcmVudE5vZGUsIGluc2VydFBvcyk7Ci0JCWluc2VydFBvcyAtPSBsZW5ndGg7Ci0JCXByZVNwYWNlID0gZ2V0U3BhY2VCZWZvcmUocGFyZW50Tm9kZSwgbm9kZSwgbnVsbCk7Ci0JCS8vIGZvcm1hdCBwb3N0IHNwYWNlcwotCQlsZW5ndGggKz0gbmVhcmVzdFNwYWNlTGVuZ3RoQWZ0ZXIocGFyZW50Tm9kZSwgaW5zZXJ0UG9zICsgbGVuZ3RoKTsKLQkJcG9zdFNwYWNlID0gZ2V0U3BhY2VCZWZvcmUocGFyZW50Tm9kZSwgbm9kZS5nZXROZXh0U2libGluZygpLCBudWxsKTsKLQotCQkvLyBzZXQgdGV4dAotCQlTdHJpbmcgdGV4dCA9IHByZVNwYWNlICsgbm9kZS5nZW5lcmF0ZVNvdXJjZSgpLnRyaW0oKSArIHBvc3RTcGFjZTsKLQkJcmV0dXJuIGluc2VydFRleHQoaW5zZXJ0UG9zLCBsZW5ndGgsIHRleHQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgaW50IGdldENoaWxkSW5zZXJ0UG9zKENTU05vZGVJbXBsIG5vZGUpIHsKLQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIobm9kZSk7Ci0JCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmb3JtYXR0ZXIuZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWVsc2UKLQkJCXJldHVybiBub2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKi8KLQlwcml2YXRlIENTU05vZGVJbXBsIGdldE9sZE5leHQoQ1NTTm9kZUltcGwgcGFyZW50Tm9kZSwgQ1NTTm9kZUltcGwgbm9kZSkgewotCQlDU1NOb2RlSW1wbCBjaGlsZCA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJQ1NTTm9kZUltcGwgcmV0ID0gbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldEVuZE9mZnNldCgpIDwgY2hpbGQuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJcmV0ID0gY2hpbGQ7Ci0JCQllbHNlCi0JCQkJYnJlYWs7Ci0JCQljaGlsZCA9IChDU1NOb2RlSW1wbCkgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuQ1NTTm9kZUltcGwKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICovCi0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBnZXRPbGRQcmV2aW91cyhDU1NOb2RlSW1wbCBwYXJlbnROb2RlLCBDU1NOb2RlSW1wbCBub2RlKSB7Ci0JCUNTU05vZGVJbXBsIGNoaWxkID0gKENTU05vZGVJbXBsKSBwYXJlbnROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJQ1NTTm9kZUltcGwgcmV0ID0gbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXRTdGFydE9mZnNldCgpIDwgbm9kZS5nZXRTdGFydE9mZnNldCgpKQotCQkJCXJldCA9IGNoaWxkOwotCQkJZWxzZQotCQkJCWJyZWFrOwotCQkJY2hpbGQgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLkNTU05vZGVJbXBsCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5DU1NOb2RlSW1wbAotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNwYWNlQmVmb3JlKElDU1NOb2RlIHBhcmVudE5vZGUsIElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIHRvUmVtb3ZlKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBwYXJlbnROb2RlKTsKLQotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBleGNlcHRGb3IgPSBudWxsOwotCQkJaWYgKHRvUmVtb3ZlICE9IG51bGwpIHsKLQkJCQlDU1NOb2RlSW1wbCByZW1vdmUgPSAoQ1NTTm9kZUltcGwpIHRvUmVtb3ZlOwotCQkJCWV4Y2VwdEZvciA9IG5ldyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbihyZW1vdmUuZ2V0U3RhcnRPZmZzZXQoKSwgcmVtb3ZlLmdldEVuZE9mZnNldCgpIC0gcmVtb3ZlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJcmV0dXJuIGZvcm1hdHRlci5mb3JtYXRCZWZvcmUocGFyZW50Tm9kZSwgbm9kZSwgZXhjZXB0Rm9yKS50b1N0cmluZygpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dEVuZChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBlbmQgPSAtMTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQllbmQgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJZW5kID0gKChDU1NSZWdpb25Db250YWluZXIpIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VGV4dFN0YXJ0KElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IHN0YXJ0ID0gLTE7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJc3RhcnQgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSZWdpb25Db250YWluZXIpIHsKLQkJCQlzdGFydCA9ICgoQ1NTUmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGluc2VydFRleHQoaW50IHN0YXJ0LCBpbnQgb2xkTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGV4dCAhPSBudWxsICYmIDAgPCBvbGRMZW5ndGggJiYgc3RhcnQgKyBvbGRMZW5ndGggPD0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJLy8gbWluaW1pemUgdGV4dCBjaGFuZ2UKLQkJCQlTdHJpbmcgZGVsVGV4dCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIG9sZExlbmd0aCk7Ci0JCQkJaW50IG5ld0xlbmd0aCA9IHRleHQubGVuZ3RoKCk7Ci0JCQkJaW50IHNob3J0ZXJMZW4gPSBNYXRoLm1pbihvbGRMZW5ndGgsIG5ld0xlbmd0aCk7Ci0JCQkJaW50IHN0TWF0Y2hMZW47Ci0JCQkJZm9yIChzdE1hdGNoTGVuID0gMDsgc3RNYXRjaExlbiA8IHNob3J0ZXJMZW4gJiYgdGV4dC5jaGFyQXQoc3RNYXRjaExlbikgPT0gZGVsVGV4dC5jaGFyQXQoc3RNYXRjaExlbik7IHN0TWF0Y2hMZW4rKykgewotCQkJCQkvLyAKLQkJCQl9Ci0JCQkJaWYgKDAgPCBzdE1hdGNoTGVuICYmIHN0TWF0Y2hMZW4gPCBzaG9ydGVyTGVuICYmIHRleHQuY2hhckF0KHN0TWF0Y2hMZW4gLSAxKSA9PSAweDAwMGQgJiYgKHRleHQuY2hhckF0KHN0TWF0Y2hMZW4pID09IDB4MDAwYSB8fCBkZWxUZXh0LmNoYXJBdChzdE1hdGNoTGVuKSA9PSAweDAwMGEpKSB7Ci0JCQkJCS8vIG11c3Qgbm90IGRpdmlkZSAwZC0+MGEgc2VxdWVuY2UKLQkJCQkJc3RNYXRjaExlbi0tOwotCQkJCX0KLQkJCQlpZiAoc3RNYXRjaExlbiA9PSBzaG9ydGVyTGVuKSB7Ci0JCQkJCWlmIChvbGRMZW5ndGggPCBuZXdMZW5ndGgpIHsgLy8ganVzdCBpbnNlcnQKLQkJCQkJCW9sZExlbmd0aCA9IDA7Ci0JCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKHN0TWF0Y2hMZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5ld0xlbmd0aCA8IG9sZExlbmd0aCkgeyAvLyBqdXN0IHJlbW92ZQotCQkJCQkJb2xkTGVuZ3RoIC09IHN0TWF0Y2hMZW47Ci0JCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQkJdGV4dCA9IG51bGw7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7IC8vIG5vdGhpbmcgdG8gZG8KLQkJCQkJCW9sZExlbmd0aCA9IDA7Ci0JCQkJCQl0ZXh0ID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IGVkTWF0Y2hMZW47Ci0JCQkJCWZvciAoZWRNYXRjaExlbiA9IDA7IHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuIDwgc2hvcnRlckxlbiAmJiB0ZXh0LmNoYXJBdChuZXdMZW5ndGggLSBlZE1hdGNoTGVuIC0gMSkgPT0gZGVsVGV4dC5jaGFyQXQob2xkTGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpOyBlZE1hdGNoTGVuKyspIHsKLQkJCQkJCS8vCi0JCQkJCX0KLQkJCQkJaWYgKDAgPCBlZE1hdGNoTGVuICYmIHRleHQuY2hhckF0KG5ld0xlbmd0aCAtIGVkTWF0Y2hMZW4pID09IDB4MDAwYSAmJiAoKGVkTWF0Y2hMZW4gPCBuZXdMZW5ndGggJiYgdGV4dC5jaGFyQXQobmV3TGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IDB4MDAwZCkgfHwgKGVkTWF0Y2hMZW4gPCBvbGRMZW5ndGggJiYgZGVsVGV4dC5jaGFyQXQob2xkTGVuZ3RoIC0gZWRNYXRjaExlbiAtIDEpID09IDB4MDAwZCkpKSB7Ci0JCQkJCQkvLyBtdXN0IG5vdCBkaXZpZGUgMGQtPjBhIHNlcXVlbmNlCi0JCQkJCQllZE1hdGNoTGVuLS07Ci0JCQkJCX0KLQkJCQkJb2xkTGVuZ3RoIC09IHN0TWF0Y2hMZW4gKyBlZE1hdGNoTGVuOwotCQkJCQlzdGFydCArPSBzdE1hdGNoTGVuOwotCQkJCQlpZiAoc3RNYXRjaExlbiArIGVkTWF0Y2hMZW4gPCBuZXdMZW5ndGgpIHsKLQkJCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZyhzdE1hdGNoTGVuLCBuZXdMZW5ndGggLSBlZE1hdGNoTGVuKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRleHQgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKDAgPCBvbGRMZW5ndGggfHwgdGV4dCAhPSBudWxsKSB7Ci0JCQkJLy8gU3RyaW5nIGRlbFRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0LCBvbGRMZW5ndGgpOwotCQkJCXJlc3VsdCA9IHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChmTW9kZWwsIHN0YXJ0LCBvbGRMZW5ndGgsIHRleHQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBuZWFyZXN0U3BhY2VMZW5ndGhBZnRlcihDU1NOb2RlSW1wbCBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKG5vZGUpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBmb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUsIGluc2VydFBvcyk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwcml2YXRlIGludCBuZWFyZXN0U3BhY2VMZW5ndGhCZWZvcmUoQ1NTTm9kZUltcGwgbm9kZSwgaW50IGluc2VydFBvcykgewotCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcihub2RlKTsKLQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZm9ybWF0dGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZSwgaW5zZXJ0UG9zKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlbW92ZVRleHQoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZk1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChmTW9kZWwsIHN0YXJ0LCBsZW5ndGgsIG5ldyBTdHJpbmcoIiIpKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldFBhcnNlcihDU1NNb2RlbFBhcnNlciBwYXJzZXIpIHsKLQkJZlBhcnNlciA9IHBhcnNlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHZhbHVlQ2hhbmdlZChDU1NOb2RlSW1wbCBub2RlLCBTdHJpbmcgb2xkVmFsdWUpIHsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1JlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCUNTU1V0aWwuZGVidWdPdXQoIlRvbyBCYWQuLiIgKyAvLyROT04tTkxTLTEkCi0JCQkJCQkoKG5vZGUgPT0gbnVsbCkgPyAibnVsbCIgOiBub2RlLmdldENsYXNzKCkudG9TdHJpbmcoKSkpOy8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzdGFydCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSkgewotCQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZTsKLQkJCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKChJTm9kZU5vdGlmaWVyKSBhdHRyLmdldE93bmVyQ1NTTm9kZSgpKTsKLQkJCWlmIChmb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQlzdGFydCA9IGZvcm1hdHRlci5nZXRBdHRySW5zZXJ0UG9zKGF0dHIuZ2V0T3duZXJDU1NOb2RlKCksIGF0dHIuZ2V0TmFtZSgpKTsKLQkJfQotCi0JCWludCBvbGRMZW5ndGggPSAob2xkVmFsdWUgPT0gbnVsbCkgPyAwIDogb2xkVmFsdWUubGVuZ3RoKCk7Ci0JCS8vIGZsYXNoIG9sZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uL0lUZXh0UmVnaW9uCi0JCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1JlZ2lvbkNvbnRhaW5lcikgbm9kZSkuc2V0UmFuZ2VSZWdpb24obnVsbCwgbnVsbCwgbnVsbCk7Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgbmV3IHNvdXJjZQotCQlTdHJpbmcgbmV3VmFsdWUgPSBub2RlLmdlbmVyYXRlU291cmNlKCk7Ci0KLQkJSUNTU05vZGUgcGFyZW50OwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLkFUVFJfTk9ERSkgewotCQkJcGFyZW50ID0gKChJQ1NTQXR0cikgbm9kZSkuZ2V0T3duZXJDU1NOb2RlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCi0JCWZQYXJzZXIuc2V0dXBVcGRhdGVDb250ZXh0KENTU01vZGVsVXBkYXRlQ29udGV4dC5VUERBVEVfQ0hBTkdFX1JDT05UQUlORVIsIHBhcmVudCwgbm9kZSk7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gaW5zZXJ0VGV4dChzdGFydCwgb2xkTGVuZ3RoLCBuZXdWYWx1ZSk7Ci0KLQkJaW50IG5SZW1haW5zID0gZlBhcnNlci5jbGVhbnVwVXBkYXRlQ29udGV4dCgpOwotCi0JCWlmICgwIDwgblJlbWFpbnMgJiYgIShyZXN1bHQgaW5zdGFuY2VvZiBOb0NoYW5nZUV2ZW50KSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAkJCi0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTW9kZWxVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGU1ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NNb2RlbFV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1J1bGVDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU01vZGVsVXRpbCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBjYW5Db250YWluQnJhY2UoSUNTU05vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiAobm9kZSBpbnN0YW5jZW9mIElDU1NSdWxlQ29udGFpbmVyIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlRGVjbENvbnRhaW5lcikpID8gdHJ1ZSA6IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0Jc3RhdGljIHZvaWQgY2xlYW51cENvbnRhaW5lcihJQ1NTTm9kZSBwYXJlbnQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2xlYW51cENvbnRhaW5lcihjaGlsZCk7Ci0JCX0KLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJKChDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHBhcmVudCkuc2V0UmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCwgbnVsbCk7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkoKENTU1JlZ2lvbkNvbnRhaW5lcikgcGFyZW50KS5zZXRSYW5nZVJlZ2lvbihudWxsLCBudWxsLCBudWxsKTsKLQkJfQotCX0KLQotCXN0YXRpYyBib29sZWFuIGRpYWdub3NlTm9kZShJQ1NTTm9kZSBwYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCS8vIGNoZWNrIHRoaXMKLQkJVmVjdG9yIGVycm9ycyA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIG5vZGUgPSAoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQ7Ci0JCQlTdHJpbmcgbm9kZVRleHQgPSBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpICsgIjogIjsvLyROT04tTkxTLTEkCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwgJiYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHx8IG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0SW1wbCkgfHwgbm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkpIHsKLQkJCQllcnJvcnMuYWRkKE5MUy5iaW5kKENTU0NvcmVNZXNzYWdlcy5fMWNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IGZsYXQgbm9kZSBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbW9kZWxOb2RlKSB7Ci0JCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl8yY29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgZmxhdCBub2RlIGlzIG5vdCBpbiBtb2RlbC4iCi0JCQkJfQotCQkJfQotCQkJZmxhdE5vZGUgPSBub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCB8fCBub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldEltcGwpIHx8IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzNjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IGZsYXQgbm9kZSBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1vZGVsTm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbW9kZWxOb2RlKSB7Ci0JCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl80Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCBmbGF0IG5vZGUgaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTUmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlDU1NSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NSZWdpb25Db250YWluZXIpIHBhcmVudDsKLQkJCVN0cmluZyBub2RlVGV4dCA9IENTU1V0aWwuZ2V0Q2xhc3NTdHJpbmcobm9kZSkgKyAiOiAiOy8vJE5PTi1OTFMtMSQKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RSZWdpb24oKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50UmVnaW9uID0gbm9kZS5nZXREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl8yNWNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IHJlZ2lvbiBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl8yNmNvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWZpcnN0IHJlZ2lvbiBpcyBub3QgaW4gbW9kZWwuIgotCQkJCX0KLQkJCX0KLQkJCXJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsICYmICghKG5vZGUgaW5zdGFuY2VvZiBNZWRpYUxpc3RJbXBsKSB8fCBub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsKSkgewotCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl8yN2NvbmNhdF9FUlJPUl8sIChuZXcgT2JqZWN0W117bm9kZVRleHR9KSkpOyAvLyROT04tTkxTLTEkID0gInswfWxhc3QgcmVnaW9uIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzI4Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlJQ1NTTm9kZUxpc3QgYXR0cnMgPSBwYXJlbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbkF0dHJzID0gYXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQlDU1NSZWdpb25Db250YWluZXIgbm9kZSA9IChDU1NSZWdpb25Db250YWluZXIpIGF0dHI7Ci0JCQlTdHJpbmcgbm9kZVRleHQgPSBDU1NVdGlsLmdldENsYXNzU3RyaW5nKG5vZGUpICsgIigiICsgYXR0ci5nZXROYW1lKCkgKyAiKTogIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbm9kZS5nZXRGaXJzdFJlZ2lvbigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24gPSBub2RlLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwgJiYgMCA8IGF0dHIuZ2V0VmFsdWUoKS5sZW5ndGgoKSkgewotCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl81Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9Zmlyc3QgcmVnaW9uIGlzIG51bGwuIgotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gcGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtb2RlbE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbiBtb2RlbFJlZ2lvbiA9IG1vZGVsTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCWlmIChyZWdpb24gIT0gbW9kZWxSZWdpb24pIHsKLQkJCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzZjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1maXJzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCQlyZWdpb24gPSBub2RlLmdldExhc3RSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCAmJiAwIDwgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpKSB7Ci0JCQkJZXJyb3JzLmFkZChOTFMuYmluZChDU1NDb3JlTWVzc2FnZXMuXzdjb25jYXRfRVJST1JfLCAobmV3IE9iamVjdFtde25vZGVUZXh0fSkpKTsgLy8kTk9OLU5MUy0xJCA9ICJ7MH1sYXN0IHJlZ2lvbiBpcyBudWxsLiIKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcmVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbW9kZWxOb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJSVRleHRSZWdpb24gbW9kZWxSZWdpb24gPSBtb2RlbE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uICE9IG1vZGVsUmVnaW9uKSB7Ci0JCQkJCWVycm9ycy5hZGQoTkxTLmJpbmQoQ1NTQ29yZU1lc3NhZ2VzLl84Y29uY2F0X0VSUk9SXywgKG5ldyBPYmplY3RbXXtub2RlVGV4dH0pKSk7IC8vJE5PTi1OTFMtMSQgPSAiezB9bGFzdCByZWdpb24gaXMgbm90IGluIG1vZGVsLiIKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoIWVycm9ycy5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGkgPSBlcnJvcnMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU1V0aWwuZGVidWdPdXQoKFN0cmluZykgaS5uZXh0KCkpOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBkaWFnbm9zZVRyZWUoSUNTU05vZGUgcGFyZW50LCBJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBjaGVjayBjaGlsZHJlbgotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlkaWFnbm9zZVRyZWUoY2hpbGQsIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQotCQlkaWFnbm9zZU5vZGUocGFyZW50LCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIElmIG5lZWRlZCwgbW9kaWZ5IGxhc3QgZmxhdCBub2RlCi0JICovCi0Jc3RhdGljIHZvaWQgZXhwYW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKHRhcmdldCA9PSBudWxsIHx8IGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAobGFzdE5vZGUgPT0gZmxhdE5vZGUpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobGFzdE5vZGUgPT0gbnVsbCB8fCBsYXN0Tm9kZS5nZXRTdGFydCgpIDwgZmxhdE5vZGUuZ2V0U3RhcnQoKSkgewotCQkJdGFyZ2V0LnNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAKLQkgKi8KLQlzdGF0aWMgSUNTU05vZGUgZmluZEJyYWNlQ29udGFpbmVyKElDU1NOb2RlIG5vZGUpIHsKLQkJZm9yIChJQ1NTTm9kZSBpID0gbm9kZTsgaSAhPSBudWxsOyBpID0gaS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChDU1NNb2RlbFV0aWwuY2FuQ29udGFpbkJyYWNlKGkpKSB7Ci0JCQkJcmV0dXJuIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIGludCBnZXREZXB0aChJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBkZXB0aCA9IC0xOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlkZXB0aCsrOwotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBkZXB0aDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc0JyYWNlQ2xvc2VkKElDU1NOb2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBiQ2xvc2VkID0gdHJ1ZTsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikpIHsKLQkJCXJldHVybiBiQ2xvc2VkOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9ICgoQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSAoKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgbm9kZSkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmlyc3QgPT0gbnVsbCB8fCBsYXN0ID09IG51bGwpIHsKLQkJCXJldHVybiBiQ2xvc2VkOwotCQl9Ci0JCWlmIChsYXN0LmdldFN0YXJ0KCkgPCBmaXJzdC5nZXRTdGFydCgpKSB7Ci0JCQlyZXR1cm4gYkNsb3NlZDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBmaXJzdDsKLQkJaW50IG5PcGVuID0gMDsKLQkJaW50IG5DbG9zZSA9IDA7Ci0JCWRvIHsKLQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQluT3BlbisrOwotCQkJfQotCQkJZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQkJbkNsb3NlKys7Ci0JCQl9Ci0JCQlmbGF0Tm9kZSA9IGZsYXROb2RlLmdldE5leHQoKTsKLQkJfQotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZSAhPSBsYXN0KTsKLQotCQlpZiAoKG5PcGVuID09IDAgJiYgbkNsb3NlID09IDApIHx8IG5DbG9zZSA8IG5PcGVuKSB7Ci0JCQliQ2xvc2VkID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gYkNsb3NlZDsKLQl9Ci0KLQkvKioKLQkgKiBvbmx5IGZvciBpbnNlcnRpb24uLgotCSAqLwotCXN0YXRpYyBib29sZWFuIGlzSW50ZXJydXB0aW9uKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0YXJnZXQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKHRhcmdldCA9PSBudWxsIHx8IGZsYXROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpbnQgc3RhcnQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IHRhcmdldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gdGFyZ2V0LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0Tm9kZSAhPSBudWxsICYmIGZpcnN0Tm9kZS5nZXRTdGFydCgpIDwgc3RhcnQgJiYgbGFzdE5vZGUgIT0gbnVsbCAmJiBzdGFydCA8IGxhc3ROb2RlLmdldFN0YXJ0KCkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlzdGF0aWMgYm9vbGVhbiBpc1BhcmVudE9mKElDU1NOb2RlIHBhcmVudCwgSUNTU05vZGUgY2hpbGQpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGNoaWxkOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKHBhcmVudCA9PSBub2RlKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTmFtZWROb2RlTWFwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDUxMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU05hbWVkTm9kZU1hcEltcGwgZXh0ZW5kcyBDU1NOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBJQ1NTTmFtZWROb2RlTWFwIHsKLQotCS8qKgotCSAqIENTU05hbWVkTm9kZU1hcEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlDU1NOYW1lZE5vZGVNYXBJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJSXRlcmF0b3IgaXQgPSBub2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIENTU0F0dHJJbXBsICYmICgoQ1NTQXR0ckltcGwpIG9iaikuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UobmFtZSkgPT0gMCkgewotCQkJCXJldHVybiAoSUNTU05vZGUpIG9iajsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODdjOWI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENTU05vZGVJbXBsIGV4dGVuZHMgQWJzdHJhY3ROb3RpZmllciBpbXBsZW1lbnRzIElDU1NOb2RlLCBJbmRleGVkUmVnaW9uIHsKLQotCXByaXZhdGUgQ1NTRG9jdW1lbnRJbXBsIGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZQYXJlbnROb2RlID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZOZXh0U2libGluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NOb2RlSW1wbCBmUHJldmlvdXNTaWJsaW5nID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZGaXJzdENoaWxkID0gbnVsbDsKLQlwcml2YXRlIENTU05vZGVJbXBsIGZMYXN0Q2hpbGQgPSBudWxsOwotCXByb3RlY3RlZCBDU1NOYW1lZE5vZGVNYXBJbXBsIGZBdHRycyA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NOb2RlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU05vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU05vZGVJbXBsKENTU05vZGVJbXBsIHRoYXQpIHsKLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5mT3duZXJEb2N1bWVudCA9IHRoYXQuZk93bmVyRG9jdW1lbnQ7Ci0JCQlpZiAodGhhdC5mQXR0cnMgIT0gbnVsbCkgewotCQkJCWludCBuQXR0cnMgPSB0aGF0LmZBdHRycy5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQkJCUNTU0F0dHJJbXBsIGF0dHIgPSAoQ1NTQXR0ckltcGwpIHRoYXQuZkF0dHJzLml0ZW0oaSk7Ci0JCQkJCXNldEF0dHJpYnV0ZShhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgYXBwZW5kQ2hpbGQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlyZXR1cm4gaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCBudWxsKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUNoaWxkTm9kZXMoSUNTU05vZGUgbmV3UGFyZW50LCBib29sZWFuIGRlZXApIHsKLQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudCA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCUNTU05vZGVJbXBsIGNvbnRhaW5lciA9IChDU1NOb2RlSW1wbCkgbmV3UGFyZW50OwotCQljb250YWluZXIucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJQ1NTTm9kZUltcGwgY2xvbmVkID0gKENTU05vZGVJbXBsKSBjaGlsZC5jbG9uZU5vZGUoZGVlcCk7Ci0JCQlpZiAoY2xvbmVkICE9IG51bGwpCi0JCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKGNsb25lZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAoZ2V0U3RhcnRPZmZzZXQoKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2VuZXJhdGVTb3VyY2UoKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHRoaXMpOwotCQlyZXR1cm4gZm9ybWF0dGVyLmZvcm1hdCh0aGlzKS50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsKLQkJQ1NTQXR0ckltcGwgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ1NTQXR0ckltcGwgZ2V0QXR0cmlidXRlTm9kZShTdHJpbmcgbmFtZSkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbkF0dHJzID0gZkF0dHJzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5BdHRyczsgaSsrKSB7Ci0JCQlDU1NBdHRySW1wbCBhdHRyID0gKENTU0F0dHJJbXBsKSBmQXR0cnMuaXRlbShpKTsKLQkJCWlmIChhdHRyLm1hdGNoTmFtZShuYW1lKSkKLQkJCQlyZXR1cm4gYXR0cjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgSUNTU05hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQlmQXR0cnMgPSBuZXcgQ1NTTmFtZWROb2RlTWFwSW1wbCgpOwotCQlyZXR1cm4gZkF0dHJzOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpIHsKLQkJQ1NTTm9kZUxpc3RJbXBsIGxpc3QgPSBuZXcgQ1NTTm9kZUxpc3RJbXBsKCk7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JSUNTU05vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChJQ1NTTm9kZSBuYSA9IG5vZGU7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKElDU1NOb2RlIHRhID0gdGhpczsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpCi0JCQkJCXJldHVybiB0YTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQlDU1NEb2N1bWVudEltcGwgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKSB7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IHRoaXM7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU0RvY3VtZW50SW1wbCkgewotCQkJCUNTU0RvY3VtZW50SW1wbCBkb2MgPSAoQ1NTRG9jdW1lbnRJbXBsKSBub2RlOwotCQkJCWlmIChkb2MuaXNEb2N1bWVudCgpKQotCQkJCQlyZXR1cm4gZG9jOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUNTU05vZGVJbXBsIGdldENvbnRhaW5lck5vZGUoaW50IG9mZnNldCkgewotCQlpZiAoIWNvbnRhaW5zKG9mZnNldCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCUlDU1NOb2RlIGZvdW5kID0gKChDU1NOb2RlSW1wbCkgY2hpbGQpLmdldENvbnRhaW5lck5vZGUob2Zmc2V0KTsKLQkJCWlmIChmb3VuZCAhPSBudWxsKQotCQkJCXJldHVybiAoQ1NTTm9kZUltcGwpIGZvdW5kOwotCQl9Ci0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZyA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJldHVybiByZWc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZGaXJzdENoaWxkOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZMYXN0Q2hpbGQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5mTmV4dFNpYmxpbmc7Ci0JfQotCi0JSUNTU05vZGUgZ2V0Tm9kZUF0KGludCBvZmZzZXQpIHsKLQkJLy8gdGhlIHNhbWUgYXMgZ2V0Q29udGFpbmVyTm9kZSgpCi0JCXJldHVybiBnZXRDb250YWluZXJOb2RlKG9mZnNldCk7Ci0JfQotCi0JcHVibGljIElDU1NEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5mT3duZXJEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMuZlBhcmVudE5vZGU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMuZlByZXZpb3VzU2libGluZzsKLQl9Ci0KLQlJQ1NTTm9kZSBnZXRSb290Tm9kZSgpIHsKLQkJQ1NTTm9kZUltcGwgcGFyZW50ID0gKENTU05vZGVJbXBsKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiB0aGlzOwotCQlyZXR1cm4gcGFyZW50LmdldFJvb3ROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpIHsKLQkJcmV0dXJuICh0aGlzLmZGaXJzdENoaWxkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTTm9kZUltcGwgaW5zZXJ0QmVmb3JlKENTU05vZGVJbXBsIG5ld0NoaWxkLCBDU1NOb2RlSW1wbCByZWZDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ1NTTm9kZUltcGwgY2hpbGQgPSBuZXdDaGlsZDsKLQkJQ1NTTm9kZUltcGwgbmV4dCA9IHJlZkNoaWxkOwotCQlDU1NOb2RlSW1wbCBwcmV2ID0gbnVsbDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMuZkxhc3RDaGlsZDsKLQkJCXRoaXMuZkxhc3RDaGlsZCA9IGNoaWxkOwotCQl9Ci0JCWVsc2UgewotCQkJcHJldiA9IChDU1NOb2RlSW1wbCkgbmV4dC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKGNoaWxkKTsKLQkJfQotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZGaXJzdENoaWxkID0gY2hpbGQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcoY2hpbGQpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG5leHQpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKHRoaXMpOwotCi0JCW5vdGlmeUNoaWxkUmVwbGFjZWQoY2hpbGQsIG51bGwpOwotCi0JCXJldHVybiBuZXdDaGlsZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlBdHRyUmVwbGFjZWQoQ1NTTm9kZUltcGwgbmV3QXR0ciwgQ1NTTm9kZUltcGwgb2xkQXR0cikgewotCQkvLyBmb3IgbW9kZWwKLQkJSUNTU0RvY3VtZW50IGRvYyA9IGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ1NTTW9kZWxJbXBsIG1vZGVsID0gKENTU01vZGVsSW1wbCkgZG9jLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5hdHRyUmVwbGFjZWQodGhpcywgbmV3QXR0ciwgb2xkQXR0cik7Ci0KLQkJLy8gZm9yIGFkYXB0ZXJzCi0JCWludCB0eXBlID0gQ0hBTkdFOwotCQlpZiAobmV3QXR0ciA9PSBudWxsKQotCQkJdHlwZSA9IFJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQXR0ciA9PSBudWxsKQotCQkJdHlwZSA9IEFERDsKLQkJbm90aWZ5KHR5cGUsIG9sZEF0dHIsIG9sZEF0dHIsIG5ld0F0dHIsIGdldFN0YXJ0T2Zmc2V0KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUNoaWxkUmVwbGFjZWQoQ1NTTm9kZUltcGwgbmV3Q2hpbGQsIENTU05vZGVJbXBsIG9sZENoaWxkKSB7Ci0JCS8vIGZvciBtb2RlbAotCQlJQ1NTRG9jdW1lbnQgZG9jID0gZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDU1NNb2RlbEltcGwgbW9kZWwgPSAoQ1NTTW9kZWxJbXBsKSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmNoaWxkUmVwbGFjZWQodGhpcywgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJaW50IHR5cGUgPSBDSEFOR0U7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IFJFTU9WRTsKLQkJZWxzZSBpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXR5cGUgPSBBREQ7Ci0JCW5vdGlmeSh0eXBlLCBvbGRDaGlsZCwgb2xkQ2hpbGQsIG5ld0NoaWxkLCBnZXRTdGFydE9mZnNldCgpKTsKLQl9Ci0KLQl2b2lkIHJlbW92ZUF0dHJpYnV0ZU5vZGUoQ1NTTm9kZUltcGwgYXR0cikgewotCQkvLyBmaW5kCi0JCWludCBuQXR0cnMgPSBmQXR0cnMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJzOyBpKyspIHsKLQkJCWlmIChmQXR0cnMuaXRlbShpKSA9PSBhdHRyKSB7Ci0JCQkJZkF0dHJzLnJlbW92ZU5vZGUoaSk7Ci0JCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBDU1NOb2RlSW1wbCByZW1vdmVDaGlsZChDU1NOb2RlSW1wbCBvbGRDaGlsZCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvbGRDaGlsZC5nZXRQYXJlbnROb2RlKCkgIT0gdGhpcykKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNsb3NlIGltcG9ydCBydWxlcwotCQlJbXBvcnRSdWxlQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0UnVsZUNvbGxlY3RvcigpOwotCQl0cmF2LmFwcGx5KG9sZENoaWxkKTsKLQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldFJ1bGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJKChDU1NJbXBvcnRSdWxlSW1wbCkgaXQubmV4dCgpKS5jbG9zZVN0eWxlU2hlZXQoKTsKLQkJfQotCi0JCUNTU05vZGVJbXBsIGNoaWxkID0gb2xkQ2hpbGQ7Ci0JCUNTU05vZGVJbXBsIHByZXYgPSAoQ1NTTm9kZUltcGwpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQlDU1NOb2RlSW1wbCBuZXh0ID0gKENTU05vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZGaXJzdENoaWxkID0gbmV4dDsKLQkJZWxzZQotCQkJcHJldi5zZXROZXh0U2libGluZyhuZXh0KTsKLQotCQlpZiAobmV4dCA9PSBudWxsKQotCQkJdGhpcy5mTGFzdENoaWxkID0gcHJldjsKLQkJZWxzZQotCQkJbmV4dC5zZXRQcmV2aW91c1NpYmxpbmcocHJldik7Ci0KLQkJY2hpbGQuc2V0UHJldmlvdXNTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXROZXh0U2libGluZyhudWxsKTsKLQkJY2hpbGQuc2V0UGFyZW50Tm9kZShudWxsKTsKLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKG51bGwsIGNoaWxkKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCQlJQ1NTTm9kZSBuZXh0Q2hpbGQgPSBudWxsOwotCQlmb3IgKElDU1NOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5leHRDaGlsZCkgewotCQkJbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgY2hpbGQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIENTU05vZGVJbXBsIHJlcGxhY2VDaGlsZChDU1NOb2RlSW1wbCBuZXdDaGlsZCwgQ1NTTm9kZUltcGwgb2xkQ2hpbGQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAob2xkQ2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdDaGlsZDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpCi0JCQlpbnNlcnRCZWZvcmUobmV3Q2hpbGQsIG9sZENoaWxkKTsKLQkJcmV0dXJuIHJlbW92ZUNoaWxkKG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICoKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ1NTQXR0ckltcGwgYXR0ciA9IGdldEF0dHJpYnV0ZU5vZGUobmFtZSk7Ci0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCVN0cmluZyBvbGRWYWx1ZSA9IGF0dHIuZ2V0VmFsdWUoKTsKLQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpCi0JCQkJcmV0dXJuOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAob2xkVmFsdWUgIT0gbnVsbCkgewotCQkJCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZkF0dHJzID09IG51bGwpCi0JCQkJZkF0dHJzID0gbmV3IENTU05hbWVkTm9kZU1hcEltcGwoKTsKLQkJCUNTU0RvY3VtZW50SW1wbCBkb2MgPSAoQ1NTRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJYXR0ciA9IChDU1NBdHRySW1wbCkgZG9jLmNyZWF0ZUNTU0F0dHIobmFtZSk7Ci0JCQlhdHRyLnNldE93bmVyQ1NTTm9kZSh0aGlzKTsKLQkJCWZBdHRycy5hcHBlbmROb2RlKGF0dHIpOwotCQkJbm90aWZ5QXR0clJlcGxhY2VkKGF0dHIsIG51bGwpOwotCQl9Ci0JCWF0dHIuc2V0VmFsdWUodmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjc3NUZXh0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q3NzVGV4dChTdHJpbmcgY3NzVGV4dCkgewotCQkvLyBUT0RPIDogY2FsbCBmbGF0IG1vZGVsIHBhcnNlciBhbmQgcmVwbGFjZSBteXNlbGYgd2l0aCBuZXcgdGhyZWUhIQotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsICIiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldE5leHRTaWJsaW5nKElDU1NOb2RlIG5leHRTaWJsaW5nKSB7Ci0JCXRoaXMuZk5leHRTaWJsaW5nID0gKENTU05vZGVJbXBsKSBuZXh0U2libGluZzsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPd25lckRvY3VtZW50KElDU1NEb2N1bWVudCBvd25lckRvY3VtZW50KSB7Ci0JCXRoaXMuZk93bmVyRG9jdW1lbnQgPSAoQ1NTRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQYXJlbnROb2RlKElDU1NOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5mUGFyZW50Tm9kZSA9IChDU1NOb2RlSW1wbCkgcGFyZW50Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKElDU1NOb2RlIHByZXZpb3VzU2libGluZykgewotCQl0aGlzLmZQcmV2aW91c1NpYmxpbmcgPSAoQ1NTTm9kZUltcGwpIHByZXZpb3VzU2libGluZzsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3RhcnQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGVuZCA9IGdldEVuZE9mZnNldCgpOwotCQkJaWYgKGVuZCA+PSAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5kIC0gc3RhcnQ7Ci0JCQkJaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NOb2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQxYzQxMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU05vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZUxpc3Q7Ci0KLWNsYXNzIENTU05vZGVMaXN0SW1wbCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBJQ1NTTm9kZUxpc3QgewotCi0JQ1NTTm9kZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlyZXR1cm4gaXRlbUltcGwoaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1BhZ2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQYWdlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIzMTkwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1BhZ2VSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTUGFnZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZURlY2xDb250YWluZXIgaW1wbGVtZW50cyBJQ1NTUGFnZVJ1bGUgewotCi0JSUNTU1NlbGVjdG9yTGlzdCBmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwobnVsbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NQYWdlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTUGFnZVJ1bGVJbXBsKENTU1BhZ2VSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1BhZ2VSdWxlSW1wbCBjbG9uZWQgPSBuZXcgQ1NTUGFnZVJ1bGVJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIHByZVN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoIkBwYWdlICIpOy8vJE5PTi1OTFMtMSQKLQkJcHJlU3RyLmFwcGVuZChnZXRTZWxlY3RvclRleHQoKSk7Ci0KLQkJcmV0dXJuIHByZVN0ci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBQQUdFUlVMRV9OT0RFOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIGZTZWxlY3Rvckxpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcnNhYmxlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhZ2Ugc2VsZWN0b3IgZm9yIHRoZSBydWxlLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgQ1NTIHN0cmluZyB2YWx1ZSBoYXMKLQkgKiAgICAgICAgICAgICAgICBhIHN5bnRheCBlcnJvciBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcnVsZSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JUZXh0KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKFNFTEVDVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgcnVsZSwgYXMgZGVmaW5lZCBhYm92ZS4gVGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKLQkgKiBiaW5kaW5nLXNwZWNpZmljIGNhc3RpbmcgbWV0aG9kcyBjYW4gYmUgdXNlZCB0byBjYXN0IGRvd24gZnJvbSBhbgotCSAqIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5DU1NSdWxlPC9jb2RlPiBpbnRlcmZhY2UgdG8gdGhlIHNwZWNpZmljCi0JICogZGVyaXZlZCBpbnRlcmZhY2UgaW1wbGllZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4uCi0JICovCi0JcHVibGljIHNob3J0IGdldFR5cGUoKSB7Ci0JCXJldHVybiBQQUdFX1JVTEU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2VsZWN0b3JUZXh0KFN0cmluZyBzZWxlY3RvclRleHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRBdHRyaWJ1dGUoU0VMRUNUT1IsIHNlbGVjdG9yVGV4dCk7Ci0JCWZTZWxlY3Rvckxpc3QgPSBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclRleHQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NQcmltaXRpdmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU4NjViOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGV4dGVuZHMgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIHsKLQotCUNTU1ByaW1pdGl2ZUNvbnRhaW5lcihDU1NQcmltaXRpdmVDb250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlDU1NQcmltaXRpdmVDb250YWluZXIoc2hvcnQgcHJpbWl0aXZlVHlwZSkgewotCQlzdXBlcihwcmltaXRpdmVUeXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0UHJpbWl0aXZlcygpOwotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3duZXJEb2N1bWVudChJQ1NTRG9jdW1lbnQgb3duZXJEb2N1bWVudCkgewotCQlzdXBlci5zZXRPd25lckRvY3VtZW50KG93bmVyRG9jdW1lbnQpOwotCi0JCWluaXRQcmltaXRpdmVzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1ByaW1pdGl2ZVZhbHVlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzJjYTgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUHJpbWl0aXZlVmFsdWVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNvdW50ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJHQkNvbG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5SZWN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBleHRlbmRzIENTU1JlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NQcmltaXRpdmVWYWx1ZSB7Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgZlByaW1pdGl2ZVR5cGUgPSBDU1NfVU5LTk9XTjsKLQlwcml2YXRlIGZsb2F0IGZGbG9hdFZhbHVlID0gMC4wZjsKLQlwcml2YXRlIFN0cmluZyBmU3RyaW5nVmFsdWUgPSBudWxsOwotCi0JQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCXRoaXMuZlByaW1pdGl2ZVR5cGUgPSB0aGF0LmZQcmltaXRpdmVUeXBlOwotCQl0aGlzLmZGbG9hdFZhbHVlID0gdGhhdC5mRmxvYXRWYWx1ZTsKLQkJdGhpcy5mU3RyaW5nVmFsdWUgPSB0aGF0LmZTdHJpbmdWYWx1ZTsKLQl9Ci0KLQlDU1NQcmltaXRpdmVWYWx1ZUltcGwoc2hvcnQgcHJpbWl0aXZlVHlwZSkgewotCQlzdXBlcigpOwotCQlmUHJpbWl0aXZlVHlwZSA9IHByaW1pdGl2ZVR5cGU7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTUHJpbWl0aXZlVmFsdWVJbXBsIGNsb25lZCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgQ291bnRlciB2YWx1ZS4gSWYgdGhpcyBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBjb3VudGVyIHZhbHVlLCBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gaXMgcmFpc2VkLgotCSAqIE1vZGlmaWNhdGlvbiB0byB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBwcm9wZXJ0eSBjYW4gYmUgYWNoaWV2ZWQgdXNpbmcKLQkgKiB0aGUgPGNvZGU+Q291bnRlcjwvY29kZT4gaW50ZXJmYWNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIENvdW50ZXIgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgQ291bnRlciB2YWx1ZSAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19DT1VOVEVSPC9jb2RlPikuCi0JICovCi0JcHVibGljIENvdW50ZXIgZ2V0Q291bnRlclZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRDU1NWYWx1ZVRleHQoKSB7Ci0JCXJldHVybiBnZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQSBjb2RlIGRlZmluaW5nIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSBhcyBkZWZpbmVkIGFib3ZlLgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRDc3NWYWx1ZVR5cGUoKSB7Ci0JCWlmIChnZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTX0lOSEVSSVRfUFJJTUlUSVZFKSB7Ci0JCQlyZXR1cm4gQ1NTX0lOSEVSSVQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ1NTX1BSSU1JVElWRV9WQUxVRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IGEgZmxvYXQgdmFsdWUgaW4gYSBzcGVjaWZpZWQgdW5pdC4gSWYgdGhpcwotCSAqIENTUyB2YWx1ZSBkb2Vzbid0IGNvbnRhaW4gYSBmbG9hdCB2YWx1ZSBvciBjYW4ndCBiZSBjb252ZXJ0ZWQgaW50byB0aGUKLQkgKiBzcGVjaWZpZWQgdW5pdCwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gdW5pdFR5cGUKLQkgKiAgICAgICAgICAgIEEgdW5pdCBjb2RlIHRvIGdldCB0aGUgZmxvYXQgdmFsdWUuIFRoZSB1bml0IGNvZGUgY2FuIG9ubHkKLQkgKiAgICAgICAgICAgIGJlIGEgZmxvYXQgdW5pdCB0eXBlIChpLmUuIDxjb2RlPkNTU19OVU1CRVI8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1BFUkNFTlRBR0U8L2NvZGU+LDxjb2RlPkNTU19FTVM8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0VYUzwvY29kZT4sPGNvZGU+Q1NTX1BYPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19DTTwvY29kZT4sPGNvZGU+Q1NTX01NPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19JTjwvY29kZT4sPGNvZGU+Q1NTX1BUPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QQzwvY29kZT4sPGNvZGU+Q1NTX0RFRzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUkFEPC9jb2RlPiw8Y29kZT5DU1NfR1JBRDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfTVM8L2NvZGU+LDxjb2RlPkNTU19TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19IWjwvY29kZT4sPGNvZGU+Q1NTX0tIWjwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfRElNRU5TSU9OPC9jb2RlPikuCi0JICogQHJldHVybiBUaGUgZmxvYXQgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCB1bml0LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogICAgICAgICAgICAgICAgY29udGFpbiBhIGZsb2F0IHZhbHVlIG9yIGlmIHRoZSBmbG9hdCB2YWx1ZSBjYW4ndCBiZQotCSAqICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgdW5pdC4KLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXRWYWx1ZShzaG9ydCB1bml0VHlwZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXN3aXRjaCAoZlByaW1pdGl2ZVR5cGUpIHsKLQkJCWNhc2UgQ1NTX05VTUJFUiA6Ci0JCQljYXNlIENTU19QRVJDRU5UQUdFIDoKLQkJCWNhc2UgQ1NTX0VNUyA6Ci0JCQljYXNlIENTU19FWFMgOgotCQkJY2FzZSBDU1NfUFggOgotCQkJY2FzZSBDU1NfQ00gOgotCQkJY2FzZSBDU1NfTU0gOgotCQkJY2FzZSBDU1NfSU4gOgotCQkJY2FzZSBDU1NfUFQgOgotCQkJY2FzZSBDU1NfUEMgOgotCQkJY2FzZSBDU1NfREVHIDoKLQkJCWNhc2UgQ1NTX1JBRCA6Ci0JCQljYXNlIENTU19HUkFEIDoKLQkJCWNhc2UgQ1NTX01TIDoKLQkJCWNhc2UgQ1NTX1MgOgotCQkJY2FzZSBDU1NfSFogOgotCQkJY2FzZSBDU1NfS0haIDoKLQkJCWNhc2UgQ1NTX0RJTUVOU0lPTiA6Ci0JCQljYXNlIENTU19JTlRFR0VSIDoKLQkJCWNhc2UgQ1NTX0hBU0ggOgotCQkJCXJldHVybiBmRmxvYXRWYWx1ZTsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMTcKLQkgKiAxMjoxMjoxOCkKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUFJJTUlUSVZFVkFMVUVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgYXMgZGVmaW5lZCBieSB0aGUgY29uc3RhbnRzIHNwZWNpZmllZCBhYm92ZS4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0UHJpbWl0aXZlVHlwZSgpIHsKLQkJcmV0dXJuIGZQcmltaXRpdmVUeXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBSZWN0IHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIHJlY3QgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5SZWN0PC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgUmVjdCB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBSZWN0IHZhbHVlLiAoZS5nLiB0aGlzIGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkNTU19SRUNUPC9jb2RlPikuCi0JICovCi0JcHVibGljIFJlY3QgZ2V0UmVjdFZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGdldCB0aGUgUkdCIGNvbG9yLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIFJHQiBjb2xvciB2YWx1ZSwgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IGlzIHJhaXNlZC4KLQkgKiBNb2RpZmljYXRpb24gdG8gdGhlIGNvcnJlc3BvbmRpbmcgc3R5bGUgcHJvcGVydHkgY2FuIGJlIGFjaGlldmVkIHVzaW5nCi0JICogdGhlIDxjb2RlPlJHQkNvbG9yPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiB0aGUgUkdCIGNvbG9yIHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIGF0dGFjaGVkIHByb3BlcnR5Ci0JICogICAgICAgICAgICAgICAgY2FuJ3QgcmV0dXJuIGEgUkdCIGNvbG9yIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX1JHQkNPTE9SPC9jb2RlPikuCi0JICovCi0JcHVibGljIFJHQkNvbG9yIGdldFJHQkNvbG9yVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9BQ0NFU1NfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBzdHJpbmcgdmFsdWUuIElmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqIGNvbnRhaW4gYSBzdHJpbmcgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuIFNvbWUKLQkgKiBwcm9wZXJ0aWVzIChsaWtlICdmb250LWZhbWlseScgb3IgJ3ZvaWNlLWZhbWlseScpIGNvbnZlcnQgYSB3aGl0ZXNwYWNlCi0JICogc2VwYXJhdGVkIGxpc3Qgb2YgaWRlbnRzIHRvIGEgc3RyaW5nLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN0cmluZyB2YWx1ZSBpbiB0aGUgY3VycmVudCB1bml0LiBUaGUgY3VycmVudAotCSAqICAgICAgICAgPGNvZGU+cHJpbWl0aXZlVHlwZTwvY29kZT4gY2FuIG9ubHkgYmUgYSBzdHJpbmcgdW5pdCB0eXBlCi0JICogICAgICAgICAoaS5lLiA8Y29kZT5DU1NfU1RSSU5HPC9jb2RlPiw8Y29kZT5DU1NfVVJJPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPkNTU19JREVOVDwvY29kZT4gYW5kIDxjb2RlPkNTU19BVFRSPC9jb2RlPikuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgc3RyaW5nIHZhbHVlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChmUHJpbWl0aXZlVHlwZSkgewotCQkJY2FzZSBDU1NfU1RSSU5HIDoKLQkJCWNhc2UgQ1NTX1VSSSA6Ci0JCQljYXNlIENTU19JREVOVCA6Ci0JCQljYXNlIENTU19BVFRSIDoKLQkJCWNhc2UgQ1NTX1VSQU5HRSA6Ci0JCQljYXNlIENTU19GT1JNQVQgOgotCQkJY2FzZSBDU1NfTE9DQUwgOgotCQkJY2FzZSBDU1NfSEFTSCA6Ci0JCQljYXNlIENTU19DT01NQSA6Ci0JCQljYXNlIENTU19TTEFTSCA6Ci0JCQljYXNlIENTU19JTkhFUklUX1BSSU1JVElWRSA6Ci0JCQkJcmV0dXJuIGZTdHJpbmdWYWx1ZTsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZChTdHJpbmcgb2xkVmFsdWUpIHsKLQkJLy8gZm9yIG1vZGVsCi0JCUlDU1NEb2N1bWVudCBkb2MgPSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNTU01vZGVsSW1wbCBtb2RlbCA9IChDU1NNb2RlbEltcGwpIGRvYy5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMsIG9sZFZhbHVlKTsKLQotCQkvLyBmb3IgYWRhcHRlcnMKLQkJbm90aWZ5KENIQU5HRSwgbmV3IFNob3J0KGZQcmltaXRpdmVUeXBlKSwgbnVsbCwgbnVsbCwgZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JfQotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gc2V0IHRoZSBmbG9hdCB2YWx1ZSB3aXRoIGEgc3BlY2lmaWVkIHVuaXQuIElmIHRoZSBwcm9wZXJ0eQotCSAqIGF0dGFjaGVkIHdpdGggdGhpcyB2YWx1ZSBjYW4gbm90IGFjY2VwdCB0aGUgc3BlY2lmaWVkIHVuaXQgb3IgdGhlIGZsb2F0Ci0JICogdmFsdWUsIHRoZSB2YWx1ZSB3aWxsIGJlIHVuY2hhbmdlZCBhbmQgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+Ci0JICogd2lsbCBiZSByYWlzZWQuCi0JICogCi0JICogQHBhcmFtIHVuaXRUeXBlCi0JICogICAgICAgICAgICBBIHVuaXQgY29kZSBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgdW5pdCBjb2RlIGNhbiBvbmx5IGJlIGEKLQkgKiAgICAgICAgICAgIGZsb2F0IHVuaXQgdHlwZSAoaS5lLiA8Y29kZT5DU1NfTlVNQkVSPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19QRVJDRU5UQUdFPC9jb2RlPiw8Y29kZT5DU1NfRU1TPC9jb2RlPiwKLQkgKiAgICAgICAgICAgIDxjb2RlPkNTU19FWFM8L2NvZGU+LDxjb2RlPkNTU19QWDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfQ008L2NvZGU+LDxjb2RlPkNTU19NTTwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfSU48L2NvZGU+LDxjb2RlPkNTU19QVDwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfUEM8L2NvZGU+LDxjb2RlPkNTU19ERUc8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1JBRDwvY29kZT4sPGNvZGU+Q1NTX0dSQUQ8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX01TPC9jb2RlPiw8Y29kZT5DU1NfUzwvY29kZT4sCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfSFo8L2NvZGU+LDxjb2RlPkNTU19LSFo8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX0RJTUVOU0lPTjwvY29kZT4pLgotCSAqIEBwYXJhbSBmbG9hdFZhbHVlCi0JICogICAgICAgICAgICBUaGUgbmV3IGZsb2F0IHZhbHVlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9BQ0NFU1NfRVJSOiBSYWlzZWQgaWYgdGhlIGF0dGFjaGVkIHByb3BlcnR5Ci0JICogICAgICAgICAgICAgICAgZG9lc24ndCBzdXBwb3J0IHRoZSBmbG9hdCB2YWx1ZSBvciB0aGUgdW5pdCB0eXBlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZsb2F0VmFsdWUoc2hvcnQgdW5pdFR5cGUsIGZsb2F0IGZsb2F0VmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzd2l0Y2ggKHVuaXRUeXBlKSB7Ci0JCQljYXNlIENTU19OVU1CRVIgOgotCQkJY2FzZSBDU1NfUEVSQ0VOVEFHRSA6Ci0JCQljYXNlIENTU19FTVMgOgotCQkJY2FzZSBDU1NfRVhTIDoKLQkJCWNhc2UgQ1NTX1BYIDoKLQkJCWNhc2UgQ1NTX0NNIDoKLQkJCWNhc2UgQ1NTX01NIDoKLQkJCWNhc2UgQ1NTX0lOIDoKLQkJCWNhc2UgQ1NTX1BUIDoKLQkJCWNhc2UgQ1NTX1BDIDoKLQkJCWNhc2UgQ1NTX0RFRyA6Ci0JCQljYXNlIENTU19SQUQgOgotCQkJY2FzZSBDU1NfR1JBRCA6Ci0JCQljYXNlIENTU19NUyA6Ci0JCQljYXNlIENTU19TIDoKLQkJCWNhc2UgQ1NTX0haIDoKLQkJCWNhc2UgQ1NTX0tIWiA6Ci0JCQljYXNlIENTU19ESU1FTlNJT04gOgotCQkJY2FzZSBDU1NfSU5URUdFUiA6Ci0JCQkJU3RyaW5nIG9sZFZhbHVlID0gZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJZlByaW1pdGl2ZVR5cGUgPSB1bml0VHlwZTsKLQkJCQlmRmxvYXRWYWx1ZSA9IGZsb2F0VmFsdWU7Ci0JCQkJbm90aWZ5VmFsdWVDaGFuZ2VkKG9sZFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgbWV0aG9kIHRvIHNldCB0aGUgc3RyaW5nIHZhbHVlIHdpdGggdGhlIHNwZWNpZmllZCB1bml0LiBJZiB0aGUKLQkgKiBwcm9wZXJ0eSBhdHRhY2hlZCB0byB0aGlzIHZhbHVlIGNhbid0IGFjY2VwdCB0aGUgc3BlY2lmaWVkIHVuaXQgb3IgdGhlCi0JICogc3RyaW5nIHZhbHVlLCB0aGUgdmFsdWUgd2lsbCBiZSB1bmNoYW5nZWQgYW5kIGEKLQkgKiA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IHdpbGwgYmUgcmFpc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdHJpbmdUeXBlCi0JICogICAgICAgICAgICBBIHN0cmluZyBjb2RlIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBzdHJpbmcgY29kZSBjYW4gb25seSBiZQotCSAqICAgICAgICAgICAgYSBzdHJpbmcgdW5pdCB0eXBlIChpLmUuIDxjb2RlPkNTU19TVFJJTkc8L2NvZGU+LAotCSAqICAgICAgICAgICAgPGNvZGU+Q1NTX1VSSTwvY29kZT4sPGNvZGU+Q1NTX0lERU5UPC9jb2RlPiwgYW5kCi0JICogICAgICAgICAgICA8Y29kZT5DU1NfQVRUUjwvY29kZT4pLgotCSAqIEBwYXJhbSBzdHJpbmdWYWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyBzdHJpbmcgdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0FDQ0VTU19FUlI6IFJhaXNlZCBpZiB0aGUgQ1NTIHZhbHVlIGRvZXNuJ3QKLQkgKiAgICAgICAgICAgICAgICBjb250YWluIGEgc3RyaW5nIHZhbHVlIG9yIGlmIHRoZSBzdHJpbmcgdmFsdWUgY2FuJ3QgYmUKLQkgKiAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgaW50byB0aGUgc3BlY2lmaWVkIHVuaXQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyaW5nVmFsdWUoc2hvcnQgc3RyaW5nVHlwZSwgU3RyaW5nIHN0cmluZ1ZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc3dpdGNoIChzdHJpbmdUeXBlKSB7Ci0JCQljYXNlIENTU19TVFJJTkcgOgotCQkJY2FzZSBDU1NfVVJJIDoKLQkJCWNhc2UgQ1NTX0lERU5UIDoKLQkJCWNhc2UgQ1NTX0FUVFIgOgotCQkJY2FzZSBDU1NfVVJBTkdFIDoKLQkJCWNhc2UgQ1NTX0ZPUk1BVCA6Ci0JCQljYXNlIENTU19MT0NBTCA6Ci0JCQljYXNlIENTU19IQVNIIDoKLQkJCWNhc2UgQ1NTX0NPTU1BIDoKLQkJCWNhc2UgQ1NTX1NMQVNIIDoKLQkJCWNhc2UgQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBnZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlmUHJpbWl0aXZlVHlwZSA9IHN0cmluZ1R5cGU7Ci0JCQkJZlN0cmluZ1ZhbHVlID0gc3RyaW5nVmFsdWU7Ci0JCQkJbm90aWZ5VmFsdWVDaGFuZ2VkKG9sZFZhbHVlKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQUNDRVNTX0VSUiwgIiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDEvMjQKLQkgKiAxNTowNjoyNSkKLQkgKiAKLQkgKiBAcGFyYW0gZmxvYXRWYWx1ZQotCSAqICAgICAgICAgICAgZmxvYXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoZmxvYXQgZmxvYXRWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldEZsb2F0VmFsdWUoZ2V0UHJpbWl0aXZlVHlwZSgpLCBmbG9hdFZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzAxLzI0Ci0JICogMTU6MDY6MjUpCi0JICogCi0JICogQHBhcmFtIHN0cmluZ1ZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKGphdmEubGFuZy5TdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXRTdHJpbmdWYWx1ZShnZXRQcmltaXRpdmVUeXBlKCksIHN0cmluZ1ZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MjU2ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUmVnaW9uQ29udGFpbmVyIGV4dGVuZHMgQ1NTTm9kZUltcGwgewotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmRmlyc3RSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gZkxhc3RSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmUGFyZW50UmVnaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1JlZ2lvbkNvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1JlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDU1NSZWdpb25Db250YWluZXIoQ1NTUmVnaW9uQ29udGFpbmVyIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDc3NUZXh0KCkgewotCQlpZiAoZkZpcnN0UmVnaW9uID09IG51bGwgfHwgZkxhc3RSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBnZW5lcmF0ZVNvdXJjZSgpOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZlBhcmVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJvb2xlYW4gYkluID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gY3VycmVudCA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKGJJbikgewotCQkJCXNvdXJjZS5hcHBlbmQoZlBhcmVudFJlZ2lvbi5nZXRUZXh0KGN1cnJlbnQpKTsKLQkJCQlpZiAoY3VycmVudCA9PSBmTGFzdFJlZ2lvbikKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoY3VycmVudCA9PSBmRmlyc3RSZWdpb24pIHsKLQkJCQkJYkluID0gdHJ1ZTsKLQkJCQkJc291cmNlLmFwcGVuZChmUGFyZW50UmVnaW9uLmdldFRleHQoY3VycmVudCkpOwotCQkJCQlpZiAoY3VycmVudCA9PSBmTGFzdFJlZ2lvbikKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzb3VyY2UudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldExhc3RSZWdpb24oKTsKLQkJaWYgKCEocmVnaW9uID09IG51bGwgfHwgZlBhcmVudFJlZ2lvbiA9PSBudWxsKSkgewotCQkJcmVzdWx0ID0gZlBhcmVudFJlZ2lvbi5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBmUGFyZW50UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQlyZXR1cm4gZkZpcnN0UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXJldHVybiBmTGFzdFJlZ2lvbjsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRSZWdpb24oaW50IGluZGV4KSB7Ci0JCWlmIChnZXRGaXJzdFJlZ2lvbigpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChyZWdpb25zLmdldChpKSA9PSBnZXRGaXJzdFJlZ2lvbigpKSB7Ci0JCQkJaWYgKGkgKyBpbmRleCA8IHJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHRhcmdldCA9IHJlZ2lvbnMuZ2V0KGkgKyBpbmRleCk7Ci0JCQkJCWlmICh0YXJnZXQuZ2V0U3RhcnQoKSA8PSBnZXRMYXN0UmVnaW9uKCkuZ2V0U3RhcnQoKSkKLQkJCQkJCXJldHVybiB0YXJnZXQ7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFJlZ2lvbkNvdW50KCkgewotCQl2YWxpZGF0ZVJhbmdlKCk7Ci0KLQkJaWYgKGdldEZpcnN0UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpZiAoZ2V0Rmlyc3RSZWdpb24oKSA9PSBnZXRMYXN0UmVnaW9uKCkpCi0JCQlyZXR1cm4gMTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmUGFyZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gY3VycmVudCA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKGogIT0gMCB8fCBjdXJyZW50ID09IGdldEZpcnN0UmVnaW9uKCkpCi0JCQkJaisrOwotCQkJaWYgKGN1cnJlbnQgPT0gZ2V0TGFzdFJlZ2lvbigpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBqOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRGaXJzdFJlZ2lvbigpOwotCQlpZiAoIShyZWdpb24gPT0gbnVsbCB8fCBmUGFyZW50UmVnaW9uID09IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSBmUGFyZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBzZXRGaXJzdFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJdGhpcy5mRmlyc3RSZWdpb24gPSByZWdpb247Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBzZXRMYXN0UmVnaW9uKElUZXh0UmVnaW9uIGxhc3RSZWdpb24pIHsKLQkJdGhpcy5mTGFzdFJlZ2lvbiA9IGxhc3RSZWdpb247Ci0JCXJldHVybiBsYXN0UmVnaW9uOwotCX0KLQotCXZvaWQgc2V0UmFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnRSZWdpb24sIElUZXh0UmVnaW9uIGZpcnN0UmVnaW9uLCBJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uKSB7Ci0JCXRoaXMuZlBhcmVudFJlZ2lvbiA9IHBhcmVudFJlZ2lvbjsKLQkJdGhpcy5mRmlyc3RSZWdpb24gPSBmaXJzdFJlZ2lvbjsKLQkJdGhpcy5mTGFzdFJlZ2lvbiA9IGxhc3RSZWdpb247Ci0KLQkJaWYgKGZpcnN0UmVnaW9uID09IG51bGwgJiYgbGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlzZXRGaXJzdFJlZ2lvbihudWxsKTsKLQkJCXNldExhc3RSZWdpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7IC8vIHJhbmdlIHZhbGlkYXRpb24KLQkJCXZhbGlkYXRlUmFuZ2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVJhbmdlKCkgewotCQlib29sZWFuIGJNb2RpZmllZCA9IGZhbHNlOwotCi0JCWlmICh0aGlzLmZGaXJzdFJlZ2lvbiAhPSBudWxsIHx8IHRoaXMuZkxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZkZpcnN0UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmZGaXJzdFJlZ2lvbiA9IHRoaXMuZkxhc3RSZWdpb247Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZkxhc3RSZWdpb24gPT0gbnVsbCkgewotCQkJCXRoaXMuZkxhc3RSZWdpb24gPSB0aGlzLmZGaXJzdFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5mRmlyc3RSZWdpb24uZ2V0U3RhcnQoKSA+IHRoaXMuZkxhc3RSZWdpb24uZ2V0U3RhcnQoKSkgewotCQkJCS8vIG5lZWQgdG8gc3dhcCBmaXJzdCBmb3IgbGFzdAotCQkJCUlUZXh0UmVnaW9uIHJlZyA9IGZGaXJzdFJlZ2lvbjsKLQkJCQlmRmlyc3RSZWdpb24gPSBmTGFzdFJlZ2lvbjsKLQkJCQlmTGFzdFJlZ2lvbiA9IHJlZzsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBiTW9kaWZpZWQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZURlY2xDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZURlY2xDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0OTE0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVEZWNsQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUnVsZURlY2xDb250YWluZXIgZXh0ZW5kcyBDU1NSdWxlSW1wbCB7Ci0KLQkvKioKLQkgKiBDU1NSdWxlRGVjbENvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU1J1bGVEZWNsQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENTU1J1bGVEZWNsQ29udGFpbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTUnVsZURlY2xDb250YWluZXIoQ1NTUnVsZURlY2xDb250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlhYnN0cmFjdCBTdHJpbmcgZXh0cmFjdFByZVN0cmluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldFN0eWxlKCkgewotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQkJcmV0dXJuIChDU1NTdHlsZURlY2xhcmF0aW9uKSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3ZDMzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1J1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlU2hlZXQ7Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTUnVsZUltcGwgZXh0ZW5kcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBDU1NSdWxlIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1J1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1J1bGVJbXBsKENTU1J1bGVJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyBydWxlIGlzIGNvbnRhaW5lZCBpbnNpZGUgYW5vdGhlciBydWxlIChlLmcuIGEgc3R5bGUgcnVsZSBpbnNpZGUKLQkgKiBhbgotCSAqIAotCSAqIEBtZWRpYSBibG9jayksIHRoaXMgaXMgdGhlIGNvbnRhaW5pbmcgcnVsZS4gSWYgdGhpcyBydWxlIGlzIG5vdCBuZXN0ZWQKLQkgKiAgICAgICAgaW5zaWRlIGFueSBvdGhlciBydWxlcywgdGhpcyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGdldFBhcmVudFJ1bGUoKSB7Ci0JCUlDU1NOb2RlIHJ1bGUgPSBnZXRQYXJlbnROb2RlKCk7Ci0KLQkJLy8gcGFyZW50IHJ1bGUgaXMgdXNlZCBvbmx5IGlmIHBhcmVudCBpcyBtZWRpYSBydWxlCi0JCWlmIChydWxlIGluc3RhbmNlb2YgQ1NTTWVkaWFSdWxlSW1wbCkKLQkJCXJldHVybiAoQ1NTUnVsZSkgcnVsZTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgc3R5bGUgc2hlZXQgdGhhdCBjb250YWlucyB0aGlzIHJ1bGUuCi0JICovCi0JcHVibGljIENTU1N0eWxlU2hlZXQgZ2V0UGFyZW50U3R5bGVTaGVldCgpIHsKLQkJSUNTU05vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAocGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0SW1wbCkKLQkJCQlyZXR1cm4gKENTU1N0eWxlU2hlZXQpIHBhcmVudDsKLQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBzaG9ydCBnZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTUnVsZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZjE1YTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NSdWxlTGlzdEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1J1bGVMaXN0SW1wbCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBDU1NSdWxlTGlzdCB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NSdWxlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSBhIENTUyBydWxlIGJ5IG9yZGluYWwgaW5kZXguIFRoZSBvcmRlciBpbiB0aGlzCi0JICogY29sbGVjdGlvbiByZXByZXNlbnRzIHRoZSBvcmRlciBvZiB0aGUgcnVsZXMgaW4gdGhlIENTUyBzdHlsZSBzaGVldC4gSWYKLQkgKiBpbmRleCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBydWxlcyBpbiB0aGUgbGlzdCwgdGhpcwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGluZGV4SW5kZXgKLQkgKiAgICAgICAgICAgIGludG8gdGhlIGNvbGxlY3Rpb24KLQkgKiBAcmV0dXJuIFRoZSBzdHlsZSBydWxlIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5DU1NSdWxlTGlzdDwvY29kZT4sIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoYXQgaXMKLQkgKiAgICAgICAgIG5vdCBhIHZhbGlkIGluZGV4LgotCSAqLwotCXB1YmxpYyBDU1NSdWxlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiAoQ1NTUnVsZSkgaXRlbUltcGwoaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDljMGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNlbGVjdG9yQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JDb21iaW5hdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1NlbGVjdG9yIGltcGxlbWVudHMgSUNTU1NlbGVjdG9yIHsKLQotCXByaXZhdGUgaW50IGZTcGVjaWZpY2l0eSA9IC0xOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTdHJpbmcgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVG9rZW5zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkl0ZW1zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlBhcnNlRXJyb3JzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZk5hbWVFcnJvcnMgPSBudWxsOwotCi0JQ1NTU2VsZWN0b3IoTGlzdCB0b2tlbnMpIHsKLQkJZlRva2VucyA9IG5ldyBBcnJheUxpc3QodG9rZW5zKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2JqCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJaWYgKHRoaXMgPT0gb2JqKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG9iaiA9PSBudWxsIHx8IHRoaXMuZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDU1NTZWxlY3RvciBmb3JlaWduID0gKENTU1NlbGVjdG9yKSBvYmo7Ci0KLQkJLy8gaWYgKGZTcGVjaWZpY2l0eSAhPSBmb3JlaWduLmZTcGVjaWZpY2l0eSkgcmV0dXJuIGZhbHNlOwotCi0JCWlmIChnZXRMZW5ndGgoKSAhPSBmb3JlaWduLmdldExlbmd0aCgpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKCFnZXRJdGVtKGkpLmVxdWFscyhmb3JlaWduLmdldEl0ZW0oaSkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JJdGVtIGdldEl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJZkl0ZW1zID0gcGFyc2VTZWxlY3RvcihmVG9rZW5zKTsKLQkJfQotCQlpZiAoZkl0ZW1zICE9IG51bGwgJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IGZJdGVtcy5zaXplKCkpIHsKLQkJCXJldHVybiAoSUNTU1NlbGVjdG9ySXRlbSkgZkl0ZW1zLmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgewotCQlpZiAoZkl0ZW1zID09IG51bGwpIHsKLQkJCWZJdGVtcyA9IHBhcnNlU2VsZWN0b3IoZlRva2Vucyk7Ci0JCX0KLQkJcmV0dXJuIChmSXRlbXMgIT0gbnVsbCkgPyBmSXRlbXMuaXRlcmF0b3IoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaWYgKGZJdGVtcyA9PSBudWxsKSB7Ci0JCQlmSXRlbXMgPSBwYXJzZVNlbGVjdG9yKGZUb2tlbnMpOwotCQl9Ci0JCXJldHVybiAoZkl0ZW1zICE9IG51bGwpID8gZkl0ZW1zLnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBFbGVtZW50IGdldFBhcmVudEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRyeSB7Ci0JCQllbGVtZW50ID0gKEVsZW1lbnQpIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCS8vIGNhc3QgZXJyb3Igb3IgbnVsbCBwb2ludGVyIC4uLgotCQkJZWxlbWVudCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSBFbGVtZW50IGdldFByZXZpb3VzRWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJRWxlbWVudCBwID0gbnVsbDsKLQkJZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50LmdldFByZXZpb3VzU2libGluZygpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcCA9IChFbGVtZW50KSBub2RlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBhIHNlbGVjdG9yJ3Mgc3BlY2lmaWNpdHkgYSA9IHRoZSBudW1iZXIgb2YgSUQgYXR0cmlidXRlcyBpbgotCSAqIHRoZSBzZWxlY3RvciBiID0gdGhlIG51bWJlciBvZiBvdGhlciBhdHRyaWJ1dGVzIGFuZCBwc2V1ZG8tY2xhc3NlcyBpbgotCSAqIHRoZSBzZWxlY3RvciBjID0gdGhlIG51bWJlciBvZiBlbGVtZW50IG5hbWVzIGluIHRoZSBzZWxlY3RvciAoaWdub3JlCi0JICogcHNldWRvLWVsZW1lbnRzKSBDb25jYXRlbmF0aW5nIHRoZSB0aHJlZSBudW1iZXJzIGEtYi1jIChpbiBhIG51bWJlcgotCSAqIHN5c3RlbSB3aXRoIGEgbGFyZ2UgYmFzZSkgZ2l2ZXMgdGhlIHNwZWNpZmljaXR5LgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTcGVjaWZpY2l0eSgpIHsKLQkJaWYgKGZTcGVjaWZpY2l0eSA8IDApIHsKLQkJCWludCBuSURzID0gMDsKLQkJCWludCBuQXR0cmlidXRlcyA9IDA7Ci0JCQlpbnQgbkVsZW1lbnRzID0gMDsKLQkJCUl0ZXJhdG9yIGkgPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gKElDU1NTZWxlY3Rvckl0ZW0pIGkubmV4dCgpOwotCQkJCWlmIChpdGVtIGluc3RhbmNlb2YgQ1NTU2ltcGxlU2VsZWN0b3IpIHsKLQkJCQkJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IgPSAoQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQkJCW5JRHMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKTsKLQkJCQkJbkF0dHJpYnV0ZXMgKz0gc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCk7Ci0JCQkJCW5BdHRyaWJ1dGVzICs9IHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpOwotCQkJCQluQXR0cmlidXRlcyArPSBzZWxlY3Rvci5nZXROdW1PZlBzZXVkb05hbWVzKCk7Ci0JCQkJCWlmICghc2VsZWN0b3IuaXNVbml2ZXJzYWwoKSkgewotCQkJCQkJbkVsZW1lbnRzKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmU3BlY2lmaWNpdHkgPSBuSURzICogMTAwMDAgKyBuQXR0cmlidXRlcyAqIDEwMCArIG5FbGVtZW50czsKLQkJfQotCi0JCXJldHVybiBmU3BlY2lmaWNpdHk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChmQ2FjaGVkU3RyaW5nID09IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlJdGVyYXRvciBpID0gZ2V0SXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpLm5leHQoKTsKLQkJCQlpZiAoaXRlbSBpbnN0YW5jZW9mIENTU1NlbGVjdG9yQ29tYmluYXRvcikgewotCQkJCQkvLyBJZiBpdGVtIGlzIERFU0NFTkRBTlQgY29tYmluYXRvciwgaXQgaXMganVzdCBzaW5nbGUKLQkJCQkJLy8gc3BhY2UuCi0JCQkJCS8vIFRoZW4sIHlvdSBkb250IGhhdmUgdG8gYXBwZW5kIHN0cmluZy4uCi0JCQkJCWlmICgoKENTU1NlbGVjdG9yQ29tYmluYXRvcikgaXRlbSkuZ2V0Q29tYmluYXRvclR5cGUoKSAhPSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQpIHsKLQkJCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJCQlidWYuYXBwZW5kKGl0ZW0uZ2V0U3RyaW5nKCkpOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlidWYuYXBwZW5kKGl0ZW0uZ2V0U3RyaW5nKCkpOwotCQkJCX0KLQkJCX0KLQkJCWZDYWNoZWRTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJldHVybiBmQ2FjaGVkU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHVibGljIGJvb2xlYW4gbWF0Y2gob3JnLnczYy5kb20uRWxlbWVudCBlbGVtZW50LCBqYXZhLmxhbmcuU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJRWxlbWVudCB0YXJnZXQgPSBlbGVtZW50OwotCQljaGFyIGNvbWJpbmF0b3JUeXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5VTktOT1dOOwotCQlFbGVtZW50IGNodW5rU3RhcnRFbGVtZW50ID0gbnVsbDsgLy8gZm9yIENISUxEIGFuZCBBREpBQ0VOVAotCQkJCQkJCQkJCQkvLyBjb21iaW5hdG9yCi0JCWludCBjaHVua1N0YXJ0SXRlbSA9IC0xOyAvLyBmb3IgQ0hJTEQgYW5kIEFESkFDRU5UIGNvbWJpbmF0b3IKLQkJaW50IG51bUl0ZW1zID0gZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGlJdGVtID0gbnVtSXRlbXMgLSAxOyBpSXRlbSA+PSAwOyBpSXRlbS0tKSB7Ci0JCQkvLyBDaGVjayBTZWxlY3RvciBJdGVtcwotCQkJSUNTU1NlbGVjdG9ySXRlbSBpdGVtID0gZ2V0SXRlbShpSXRlbSk7Ci0JCQlpZiAoaXRlbSBpbnN0YW5jZW9mIElDU1NTaW1wbGVTZWxlY3RvcikgewotCQkJCS8vIFNpbXBsZSBTZWxlY3RvcgotCQkJCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmICghbWF0Y2hFeGFjdGx5KChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW0sIHRhcmdldCwgcHNldWRvTmFtZSkpIHsKLQkJCQkJc3dpdGNoIChjb21iaW5hdG9yVHlwZSkgewotCQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkRFU0NFTkRBTlQgOgotCQkJCQkJCWRvIHsKLQkJCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudCh0YXJnZXQpOwotCQkJCQkJCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQkJfQotCQkJCQkJCXdoaWxlICghbWF0Y2hFeGFjdGx5KChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW0sIHRhcmdldCwgcHNldWRvTmFtZSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSBJQ1NTU2VsZWN0b3JDb21iaW5hdG9yLkNISUxEIDoKLQkJCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5BREpBQ0VOVCA6Ci0JCQkJCQkJaWYgKGNodW5rU3RhcnRFbGVtZW50ICE9IG51bGwgJiYgY2h1bmtTdGFydEVsZW1lbnQgIT0gZWxlbWVudCkgewotCQkJCQkJCQkvLyBwcmV2aW91cyBjb25iaW5hdG9yIG11c3QgYmUgREVTQ0VOREVOVC4KLQkJCQkJCQkJLy8gZ290byBwYXJlbnQKLQkJCQkJCQkJdGFyZ2V0ID0gZ2V0UGFyZW50RWxlbWVudChjaHVua1N0YXJ0RWxlbWVudCk7Ci0JCQkJCQkJCWlJdGVtID0gY2h1bmtTdGFydEl0ZW0gKyAxOwotCQkJCQkJCQljaHVua1N0YXJ0RWxlbWVudCA9IG51bGw7Ci0JCQkJCQkJCWNodW5rU3RhcnRJdGVtID0gLTE7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCS8vIG90aGVyIGNvbWJpbmF0b3JzIGFyZSBub3Qgc3VwcG9ydGVkIHlldC4KLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgSUNTU1NlbGVjdG9yQ29tYmluYXRvcikgewotCQkJCS8vIENvbWJpbmF0b3IgKCAiKyIsICI+IiwgIiAiLCAuLi4pCi0JCQkJaWYgKGlJdGVtID09IG51bUl0ZW1zIC0gMSkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBsYXN0IGl0ZW0gaXMgY29tYmluYXRvcgotCi0JCQkJSUNTU1NlbGVjdG9yQ29tYmluYXRvciBzYyA9IChJQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSBpdGVtOwotCQkJCWNvbWJpbmF0b3JUeXBlID0gc2MuZ2V0Q29tYmluYXRvclR5cGUoKTsKLQkJCQlzd2l0Y2ggKGNvbWJpbmF0b3JUeXBlKSB7Ci0JCQkJCWNhc2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvci5ERVNDRU5EQU5UIDoKLQkJCQkJCXRhcmdldCA9IGdldFBhcmVudEVsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQgOgotCQkJCQljYXNlIElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQURKQUNFTlQgOgotCQkJCQkJaWYgKGNodW5rU3RhcnRFbGVtZW50ID09IG51bGwpIHsKLQkJCQkJCQljaHVua1N0YXJ0RWxlbWVudCA9IHRhcmdldDsKLQkJCQkJCQljaHVua1N0YXJ0SXRlbSA9IGlJdGVtICsgMTsgLy8gc2FmZSBiZWNhdXNlIHRoaXMKLQkJCQkJCQkJCQkJCQkJLy8gaXMgbm90IGEgbGFzdCBpdGVtLgotCQkJCQkJfQotCQkJCQkJaWYgKGNvbWJpbmF0b3JUeXBlID09IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQpIHsKLQkJCQkJCQl0YXJnZXQgPSBnZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl0YXJnZXQgPSBnZXRQcmV2aW91c0VsZW1lbnQodGFyZ2V0KTsKLQkJCQkJCX0KLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdoYXQgaXMgdGhpcyBpdGVtID8/PwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQkvLyBPSyB0aGlzIHNlbGVjdG9yIG1hY2hlcyB0aGUgZWxlbWVudC4KLQkJcmV0dXJuIHRydWU7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hFeGFjdGx5KElDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlJU3R5bGVTZWxlY3RvckFkYXB0ZXIgYWRhcHRlciA9IChJU3R5bGVTZWxlY3RvckFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0QWRhcHRlckZvcihJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5tYXRjaChzZWxlY3RvciwgZWxlbWVudCwgcHNldWRvTmFtZSk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgaTsKLQkJU3RyaW5nIGtleTsKLQotCQkvLyBUT0RPOiBQc2V1ZG9OYW1lCi0KLQkJLy8gY2hlY2sgdGFnIG5hbWUKLQkJaWYgKCFzZWxlY3Rvci5pc1VuaXZlcnNhbCgpICYmICFlbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzKHNlbGVjdG9yLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gY2hlY2sgaWQKLQkJaSA9IHNlbGVjdG9yLmdldE51bU9mSURzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKGkgPiAxKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWtleSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJpZCIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChrZXkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlpZiAoIXNlbGVjdG9yLmdldElEKDApLmVxdWFscyhrZXkpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNoZWNrIGNsYXNzCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZkNsYXNzZXMoKTsKLQkJaWYgKGkgPiAwKSB7Ci0JCQlrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiY2xhc3MiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoa2V5KTsKLQkJCWZvciAoaSA9IGkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCWJvb2xlYW4gb2sgPSBmYWxzZTsKLQkJCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQlpZiAoc2VsZWN0b3IuZ2V0Q2xhc3MoaSkuZXF1YWxzKHRva2VuaXplci5uZXh0VG9rZW4oKSkpIHsKLQkJCQkJCW9rID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICghb2spCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCS8vIGNoZWNrIGF0dHJpYnV0ZXMKLQkJZm9yIChpID0gc2VsZWN0b3IuZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2VsZWN0b3IuZ2V0QXR0cmlidXRlKGkpLCAiPX58IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJaW50IGNvdW50VG9rZW5zID0gdG9rZW5pemVyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAoY291bnRUb2tlbnMgPiAwKSB7Ci0JCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQkJaWYgKGF0dHJWYWx1ZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNvdW50VG9rZW5zID4gMSkgewotCQkJCQlTdHJpbmcgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCI9IFx0XHJcblxmIik7Ly8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdUb2tlbml6ZXIgYXR0clZhbHVlVG9rZW5pemVyID0gbnVsbDsKLQkJCQkJaWYgKHRva2VuLmVxdWFscygifiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKHRva2VuLmVxdWFscygifCIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYXR0clZhbHVlVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWUsICItIik7Ly8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWlmIChhdHRyVmFsdWVUb2tlbml6ZXIgIT0gbnVsbCkgewotCQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQl0b2tlbiA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJCQkJd2hpbGUgKGF0dHJWYWx1ZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCQkJaWYgKHRva2VuLmVxdWFscyhhdHRyVmFsdWVUb2tlbml6ZXIubmV4dFRva2VuKCkpKSB7Ci0JCQkJCQkJCQlvayA9IHRydWU7Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIW9rKQotCQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoIWF0dHJWYWx1ZS5lcXVhbHModG9rZW4pKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXByaXZhdGUgTGlzdCBwYXJzZVNlbGVjdG9yKExpc3QgdG9rZW5zKSB7Ci0JCUNTU1NlbGVjdG9yUGFyc2VyIHBhcnNlciA9IG5ldyBDU1NTZWxlY3RvclBhcnNlcih0b2tlbnMpOwotCQlMaXN0IHNlbGVjdG9yID0gcGFyc2VyLmdldFNlbGVjdG9yKCk7Ci0JCUl0ZXJhdG9yIGkgPSBwYXJzZXIuZ2V0RXJyb3JzKCk7Ci0JCWZQYXJzZUVycm9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlmUGFyc2VFcnJvcnMuYWRkKGkubmV4dCgpKTsKLQkJfQotCQlyZXR1cm4gc2VsZWN0b3I7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJaWYgKGZOYW1lRXJyb3JzID09IG51bGwpIHsKLQkJCWZOYW1lRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSXRlcmF0b3IgaUl0ZW0gPSBnZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGlJdGVtLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpSXRlbS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2ltcGxlU2VsZWN0b3IpIHsKLQkJCQkJaWYgKCEoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSkuaXNVbml2ZXJzYWwoKSkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSAoKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbSkuZ2V0TmFtZSgpOwotCQkJCQkJaWYgKCFOYW1lVmFsaWRhdG9yLmlzVmFsaWQobmFtZSkpIHsKLQkJCQkJCQlmTmFtZUVycm9ycy5hZGQoaXRlbSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KGZQYXJzZUVycm9ycyk7Ci0JCWVycm9ycy5hZGRBbGwoZk5hbWVFcnJvcnMpOwotCQlyZXR1cm4gZXJyb3JzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFN0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSUNTU1NlbGVjdG9yI2dldEVycm9yQ291bnQoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJaW50IG5FcnJvcnMgPSAwOwotCQlJdGVyYXRvciBpID0gZ2V0RXJyb3JzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJbkVycm9ycysrOwotCQkJaS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5FcnJvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yQ29tYmluYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGYyNTk0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yQ29tYmluYXRvcjsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGV4dGVuZHMgQ1NTU2VsZWN0b3JJdGVtIGltcGxlbWVudHMgSUNTU1NlbGVjdG9yQ29tYmluYXRvciB7Ci0KLQljaGFyIGZUeXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5VTktOT1dOOwotCi0JLyoqCi0JICogQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENTU1NlbGVjdG9yQ29tYmluYXRvcihjaGFyIHR5cGUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0Q29tYmluYXRvclR5cGUodHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG9iagotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmICh0aGlzID09IG9iaikKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvYmogPT0gbnVsbCB8fCB0aGlzLmdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGZvcmVpZ24gPSAoQ1NTU2VsZWN0b3JDb21iaW5hdG9yKSBvYmo7Ci0KLQkJcmV0dXJuIChnZXRDb21iaW5hdG9yVHlwZSgpID09IGZvcmVpZ24uZ2V0Q29tYmluYXRvclR5cGUoKSk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBjaGFyIGdldENvbWJpbmF0b3JUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEl0ZW1UeXBlKCkgewotCQlyZXR1cm4gQ09NQklOQVRPUjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChmVHlwZSk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldENvbWJpbmF0b3JUeXBlKGNoYXIgdHlwZSkgewotCQlmVHlwZSA9IHR5cGU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9ySXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTM0YmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JJdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ1NTU2VsZWN0b3JJdGVtIGltcGxlbWVudHMgSUNTU1NlbGVjdG9ySXRlbSB7Ci0KLQkvKioKLQkgKiBDU1NTZWxlY3Rvckl0ZW0gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ1NTU2VsZWN0b3JJdGVtKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRJdGVtVHlwZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzVjN2VlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3Rvckxpc3RJbXBsIGltcGxlbWVudHMgSUNTU1NlbGVjdG9yTGlzdCB7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFN0cmluZyA9IG51bGw7IC8vIG5vcm1hbGl6ZWQgc3RyaW5nCi0JcHJpdmF0ZSBMaXN0IGZTZWxlY3RvcnMgPSBudWxsOwotCi0JcHVibGljIENTU1NlbGVjdG9yTGlzdEltcGwoU3RyaW5nIGNzc1RleHQpIHsKLQkJc3VwZXIoKTsKLQkJZlRleHQgPSBjc3NUZXh0OwotCQlwYXJzZVNlbGVjdG9yVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NlbGVjdG9yTGlzdEltcGwgZm9yZWlnbiA9IChDU1NTZWxlY3Rvckxpc3RJbXBsKSBvYmo7Ci0KLQkJaWYgKGdldExlbmd0aCgpICE9IGZvcmVpZ24uZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBnZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIWdldFNlbGVjdG9yKGkpLmVxdWFscyhmb3JlaWduLmdldFNlbGVjdG9yKGkpKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRJdGVyYXRvcigpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9ycygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9ycygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yIGdldFNlbGVjdG9yKGludCBpbmRleCkgewotCQlMaXN0IHNlbGVjdG9ycyA9IGdldFNlbGVjdG9ycygpOwotCQlpZiAoMCA8PSBpbmRleCAmJiBpbmRleCA8IHNlbGVjdG9ycy5zaXplKCkpIHsKLQkJCXJldHVybiAoSUNTU1NlbGVjdG9yKSBzZWxlY3RvcnMuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJaWYgKGZTZWxlY3RvcnMgPT0gbnVsbCkgewotCQkJcGFyc2VTZWxlY3RvclRleHQoKTsKLQkJfQotCQlyZXR1cm4gZlNlbGVjdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKLQkJaWYgKGZDYWNoZWRTdHJpbmcgPT0gbnVsbCkgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gYkZpcnN0ID0gdHJ1ZTsKLQkJCS8vIGdyb3VwcyBpcyBsaXN0IG9mIGNvbW1hLXNlcGFyYXRlZCBzZWxlY3RvcnMKLQkJCUl0ZXJhdG9yIGkgPSBnZXRTZWxlY3RvcnMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCFiRmlyc3QpIHsKLQkJCQkJYnVmLmFwcGVuZCgiLCAiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCUlDU1NTZWxlY3RvciBpdGVtID0gKElDU1NTZWxlY3RvcikgaS5uZXh0KCk7Ci0JCQkJYnVmLmFwcGVuZChpdGVtLmdldFN0cmluZygpKTsKLQkJCQliRmlyc3QgPSBmYWxzZTsKLQkJCX0KLQkJCWZDYWNoZWRTdHJpbmcgPSBidWYudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gZkNhY2hlZFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpIHsKLQkJaW50IG5TZWxlY3RvcnMgPSBnZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaVNlbGVjdG9yID0gMDsgaVNlbGVjdG9yIDwgblNlbGVjdG9yczsgaVNlbGVjdG9yKyspIHsKLQkJCS8vIENoZWNrIGVhY2ggU2VsZWN0b3IgTGlzdHMKLQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGlTZWxlY3Rvcik7Ci0JCQlpZiAoc2VsZWN0b3IubWF0Y2goZWxlbWVudCwgcHNldWRvTmFtZSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBwYXJzZVNlbGVjdG9yVGV4dCgpIHsKLQkJZlNlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKGZUZXh0ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX1NUWUxFU0hFRVQsIGZUZXh0KTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlMaXN0IHRva2VuR3JvdXAgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlDU1NUZXh0VG9rZW4gdG9rZW4gPSB0b2tlbnNbaV07Ci0JCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SICYmIDAgPCB0b2tlbkdyb3VwLnNpemUoKSkgewotCQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IG5ldyBDU1NTZWxlY3Rvcih0b2tlbkdyb3VwKTsKLQkJCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJCQlmU2VsZWN0b3JzLmFkZChzZWxlY3Rvcik7Ci0JCQkJfQotCQkJCXRva2VuR3JvdXAuY2xlYXIoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRva2VuR3JvdXAuYWRkKHRva2Vuc1tpXSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKDAgPCB0b2tlbkdyb3VwLnNpemUoKSkgewotCQkJSUNTU1NlbGVjdG9yIHNlbGVjdG9yID0gbmV3IENTU1NlbGVjdG9yKHRva2VuR3JvdXApOwotCQkJaWYgKHNlbGVjdG9yICE9IG51bGwpIHsKLQkJCQlmU2VsZWN0b3JzLmFkZChzZWxlY3Rvcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGdldEVycm9ycygpIHsKLQkJTGlzdCBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUl0ZXJhdG9yIGlTZWxlY3RvciA9IGdldFNlbGVjdG9ycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpU2VsZWN0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJdGVyYXRvciBpRXJyb3IgPSAoKElDU1NTZWxlY3RvcikgaVNlbGVjdG9yLm5leHQoKSkuZ2V0RXJyb3JzKCk7Ci0JCQl3aGlsZSAoaUVycm9yLmhhc05leHQoKSkgewotCQkJCWVycm9ycy5hZGQoaUVycm9yLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVycm9ycy5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb3VudCgpIHsKLQkJaW50IG5FcnJvcnMgPSAwOwotCQlJdGVyYXRvciBpID0gZ2V0RXJyb3JzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJbkVycm9ycysrOwotCQkJaS5uZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIG5FcnJvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2VsZWN0b3JQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwMDM0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1NlbGVjdG9yUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvckNvbWJpbmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckl0ZW07Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1NlbGVjdG9yUGFyc2VyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBJRExFID0gMDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgQVRUUklCVVRFID0gMTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgU0lNUExFID0gMjsKLQotCXByaXZhdGUgTGlzdCBmVG9rZW5zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkl0ZW1zID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkVycm9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTZWxlY3RvclBhcnNlcihMaXN0IHRva2VucykgewotCQlzdXBlcigpOwotCQlmVG9rZW5zID0gbmV3IEFycmF5TGlzdCh0b2tlbnMpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCUxpc3QgZ2V0U2VsZWN0b3IoKSB7Ci0JCWlmIChmSXRlbXMgPT0gbnVsbCkgewotCQkJcGFyc2VTZWxlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmSXRlbXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBhcnNlU2VsZWN0b3IoKSB7Ci0JCWZJdGVtcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlMaXN0IGF0dHJCdWYgPSBudWxsOwotCQlDU1NTaW1wbGVTZWxlY3RvciBpdGVtID0gbnVsbDsKLQotCQlpbnQgc3RhdHVzID0gSURMRTsKLQkJSXRlcmF0b3IgaSA9IGZUb2tlbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NUZXh0VG9rZW4gdG9rZW4gPSAoQ1NTVGV4dFRva2VuKSBpLm5leHQoKTsKLQkJCWlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJc3dpdGNoIChzdGF0dXMpIHsKLQkJCQljYXNlIElETEUgOgotCQkJCQlpZiAoaXNUYWcodG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlhcHBlbmRUYWcoaXRlbSwgdG9rZW4pOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzSUQodG9rZW4pKSB7Ci0JCQkJCQlpdGVtID0gY3JlYXRlU2ltcGxlKCk7Ci0JCQkJCQlhcHBlbmRJRChpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNDbGFzcyh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZENsYXNzKGl0ZW0sIHRva2VuKTsKLQkJCQkJCXN0YXR1cyA9IFNJTVBMRTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChpc1BzZXVkbyh0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCWFwcGVuZFBzZXVkbyhpdGVtLCB0b2tlbik7Ci0JCQkJCQlzdGF0dXMgPSBTSU1QTEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNBdHRyaWJ1dGVCZWdpbih0b2tlbikpIHsKLQkJCQkJCWl0ZW0gPSBjcmVhdGVTaW1wbGUoKTsKLQkJCQkJCXN0YXR1cyA9IEFUVFJJQlVURTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFkZEVycm9yKHRva2VuKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIFNJTVBMRSA6Ci0JCQkJCWlmIChpc0lEKHRva2VuKSkgewotCQkJCQkJYXBwZW5kSUQoaXRlbSwgdG9rZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQ2xhc3ModG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRDbGFzcyhpdGVtLCB0b2tlbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNQc2V1ZG8odG9rZW4pKSB7Ci0JCQkJCQlhcHBlbmRQc2V1ZG8oaXRlbSwgdG9rZW4pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGlzQXR0cmlidXRlQmVnaW4odG9rZW4pKSB7Ci0JCQkJCQlzdGF0dXMgPSBBVFRSSUJVVEU7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaXNDb21iaW5hdG9yKHRva2VuKSkgeyAvLyBjb21iaW5hdG9yCi0JCQkJCQljbG9zZUl0ZW0oaXRlbSk7Ci0JCQkJCQljbG9zZUl0ZW0oY3JlYXRlQ29tYmluYXRvcih0b2tlbikpOwotCQkJCQkJc3RhdHVzID0gSURMRTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWFkZEVycm9yKHRva2VuKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEFUVFJJQlVURSA6Ci0JCQkJCWlmIChpc0F0dHJpYnV0ZUVuZCh0b2tlbikpIHsKLQkJCQkJCWFwcGVuZEF0dHJpYnV0ZShpdGVtLCBhdHRyQnVmKTsKLQkJCQkJCWF0dHJCdWYgPSBudWxsOwotCQkJCQkJc3RhdHVzID0gU0lNUExFOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGF0dHJCdWYgPT0gbnVsbCkgewotCQkJCQkJCWF0dHJCdWYgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJCQl9Ci0JCQkJCQlhdHRyQnVmLmFkZCh0b2tlbik7Ci0JCQkJCQlpZiAoIWlzQXR0cmlidXRlQ29udGVudCh0b2tlbikpIHsKLQkJCQkJCQlhZGRFcnJvcih0b2tlbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJY2xvc2VJdGVtKGl0ZW0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyaWJ1dGVDb250ZW50KENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0F0dHJpYnV0ZUVuZChDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNBdHRyaWJ1dGVCZWdpbihDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJU3RyaW5nIHR5cGUgPSB0b2tlbi5raW5kOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbWJpbmF0b3IoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DT01CSU5BVE9SKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUHNldWRvKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdG9rZW4KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ2xhc3MoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRva2VuCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0lEKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdHlwZSA9IHRva2VuLmtpbmQ7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUYWcoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0eXBlID0gdG9rZW4ua2luZDsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pOwotCX0KLQotCXByaXZhdGUgQ1NTU2ltcGxlU2VsZWN0b3IgY3JlYXRlU2ltcGxlKCkgewotCQlyZXR1cm4gbmV3IENTU1NpbXBsZVNlbGVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogaWYgIiAiIG9yICIrIiBvciAiPiIgYXBwZWFyZWQsIGNsb3NlIHNpbXBsZXNlbGVjdG9yIGFuZCBhZGQgbmV3Ci0JICogY29tYmluYXRvcgotCSAqLwotCXByaXZhdGUgQ1NTU2VsZWN0b3JDb21iaW5hdG9yIGNyZWF0ZUNvbWJpbmF0b3IoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWNoYXIgdHlwZSA9IDA7Ci0KLQkJU3RyaW5nIHN0ciA9IHRva2VuLmltYWdlOwotCQlpZiAoc3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7IC8vIHNwYWNlCi0JCQl0eXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5ERVNDRU5EQU5UOwotCQl9Ci0JCWVsc2UgaWYgKHN0ci5lcXVhbHMoIisiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0eXBlID0gSUNTU1NlbGVjdG9yQ29tYmluYXRvci5BREpBQ0VOVDsKLQkJfQotCQllbHNlIGlmIChzdHIuZXF1YWxzKCI+IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdHlwZSA9IElDU1NTZWxlY3RvckNvbWJpbmF0b3IuQ0hJTEQ7Ci0JCX0KLQotCQlpZiAoMCA8IHR5cGUpIHsKLQkJCXJldHVybiBuZXcgQ1NTU2VsZWN0b3JDb21iaW5hdG9yKHR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xvc2VJdGVtKElDU1NTZWxlY3Rvckl0ZW0gaXRlbSkgewotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlmSXRlbXMuYWRkKGl0ZW0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZFRhZyhDU1NTaW1wbGVTZWxlY3RvciBpdGVtLCBDU1NUZXh0VG9rZW4gdG9rZW4pIHsKLQkJaXRlbS5zZXROYW1lKHRva2VuLmltYWdlKTsKLQkJaWYgKHRva2VuLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pIHsKLQkJCWFkZEVycm9yKHRva2VuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGlmICIjeHh4eCIgYXBwZWFyZWQsIGFkZCBJRCB0byBjdXJyZW50IHNlbGVjdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZElEKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdGV4dCA9IHRva2VuLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBpZENvbnRlbnQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJaXRlbS5hZGRJRChpZENvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIGlmICIueHh4eCIgYXBwZWFyZWQsIGFkZCBDbGFzcyB0byBjdXJyZW50IHNlbGVjdG9yCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZENsYXNzKENTU1NpbXBsZVNlbGVjdG9yIGl0ZW0sIENTU1RleHRUb2tlbiB0b2tlbikgewotCQlTdHJpbmcgdGV4dCA9IHRva2VuLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBjbGFzc0NvbnRlbnQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJaXRlbS5hZGRDbGFzcyhjbGFzc0NvbnRlbnQpOwotCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoY2xhc3NDb250ZW50LmNoYXJBdCgwKSkpIHsKLQkJCWFkZEVycm9yKHRva2VuKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGlmICI6eHh4eCIgYXBwZWFyZWQsIGFkZCBQc2V1ZG8oZWxlbWVudC9jbGFzcykgdG8gY3VycmVudCBzZWxlY3RvcgotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRQc2V1ZG8oQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCVN0cmluZyB0ZXh0ID0gdG9rZW4udG9TdHJpbmcoKTsKLQkJU3RyaW5nIHBzZXVkb0NvbnRlbnQgPSB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpKTsKLQkJaXRlbS5hZGRQc2V1ZG9OYW1lKHBzZXVkb0NvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBhcHBlbmRBdHRyaWJ1dGUoQ1NTU2ltcGxlU2VsZWN0b3IgaXRlbSwgTGlzdCB0b2tlbnMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlDU1NUZXh0VG9rZW4gdG9rZW47Ci0JCUl0ZXJhdG9yIGkgPSB0b2tlbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQl0b2tlbiA9IChDU1NUZXh0VG9rZW4pIGkubmV4dCgpOwotCQkJYnVmLmFwcGVuZCh0b2tlbi5pbWFnZSk7Ci0JCX0KLQotCQlpdGVtLmFkZEF0dHJpYnV0ZShidWYudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JTGlzdCBnZXRTZWxlY3RvclRhZ3MoKSB7Ci0JCUxpc3QgdGFnTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHRhZ0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEVycm9yKENTU1RleHRUb2tlbiB0b2tlbikgewotCQlpZiAoZkVycm9ycyA9PSBudWxsKSB7Ci0JCQlmRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZFcnJvcnMuYWRkKHRva2VuKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBnZXRFcnJvcnMoKSB7Ci0JCXJldHVybiAoZkVycm9ycyA9PSBudWxsKSA/IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKSA6IGZFcnJvcnMuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTaW1wbGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Zjc2ZWEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU2ltcGxlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1NpbXBsZVNlbGVjdG9yIGV4dGVuZHMgQ1NTU2VsZWN0b3JJdGVtIGltcGxlbWVudHMgSUNTU1NpbXBsZVNlbGVjdG9yIHsKLQotCXByaXZhdGUgU3RyaW5nIGZOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmU3RyaW5nQnVmID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlBzZXVkb05hbWUgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmQXR0cmlidXRlID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZkNsYXNzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZklEID0gbnVsbDsKLQotCS8qKgotCSAqIENTU1NpbXBsZVNlbGVjdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENTU1NpbXBsZVNlbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBhdHRyaWJ1dGUpIHsKLQkJaWYgKGZBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJZkF0dHJpYnV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmQXR0cmlidXRlLmFkZChhdHRyaWJ1dGUpOwotCQlhZGRUb0J1ZigiWyIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoYXR0cmlidXRlKTsKLQkJYWRkVG9CdWYoIl0iKTsvLyROT04tTkxTLTEkCi0JCWZDYWNoZWRTdHJpbmcgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkQ2xhc3MoU3RyaW5nIGNscykgewotCQlpZiAoZkNsYXNzID09IG51bGwpIHsKLQkJCWZDbGFzcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmQ2xhc3MuYWRkKGNscyk7Ci0JCWFkZFRvQnVmKCIuIik7Ly8kTk9OLU5MUy0xJAotCQlhZGRUb0J1ZihjbHMpOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFkZElEKFN0cmluZyBpZCkgewotCQlpZiAoZklEID09IG51bGwpIHsKLQkJCWZJRCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlmSUQuYWRkKGlkKTsKLQkJYWRkVG9CdWYoIiMiKTsvLyROT04tTkxTLTEkCi0JCWFkZFRvQnVmKGlkKTsKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhZGRQc2V1ZG9OYW1lKFN0cmluZyBjbHMpIHsKLQkJaWYgKGZQc2V1ZG9OYW1lID09IG51bGwpIHsKLQkJCWZQc2V1ZG9OYW1lID0gbmV3IEFycmF5TGlzdCgpOwotCQl9Ci0JCWZQc2V1ZG9OYW1lLmFkZChjbHMpOwotCQlhZGRUb0J1ZigiOiIpOy8vJE5PTi1OTFMtMSQKLQkJYWRkVG9CdWYoY2xzKTsKLQkJZkNhY2hlZFN0cmluZyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRvQnVmKFN0cmluZyBzdHIpIHsKLQkJaWYgKGZTdHJpbmdCdWYgPT0gbnVsbCkgewotCQkJZlN0cmluZ0J1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJfQotCQlmU3RyaW5nQnVmLmFwcGVuZChzdHIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqIEBwYXJhbSBvYmoKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotCQlpZiAodGhpcyA9PSBvYmopCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAob2JqID09IG51bGwgfHwgdGhpcy5nZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNTU1NpbXBsZVNlbGVjdG9yIGZvcmVpZ24gPSAoQ1NTU2ltcGxlU2VsZWN0b3IpIG9iajsKLQotCQlpZiAoZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXROYW1lKCkpICE9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGk7Ci0KLQkJLy8gY29tcGFyZSBwc2V1ZG8tY2xhc3NlcyAvIHBzZXVkby1lbGVtZW50cwotCQlpZiAoZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpICE9IGZvcmVpZ24uZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZQc2V1ZG9OYW1lcygpOyBpKyspIHsKLQkJCWlmIChnZXRQc2V1ZG9OYW1lKGkpLmNvbXBhcmVUb0lnbm9yZUNhc2UoZm9yZWlnbi5nZXRQc2V1ZG9OYW1lKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNvbXBhcmUgY2xhc3NlcwotCQlpZiAoZ2V0TnVtT2ZDbGFzc2VzKCkgIT0gZm9yZWlnbi5nZXROdW1PZkNsYXNzZXMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpID0gMDsgaSA8IGdldE51bU9mQ2xhc3NlcygpOyBpKyspIHsKLQkJCWlmIChnZXRDbGFzcyhpKS5jb21wYXJlVG9JZ25vcmVDYXNlKGZvcmVpZ24uZ2V0Q2xhc3MoaSkpICE9IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY29tcGFyZSBJRHMKLQkJaWYgKGdldE51bU9mSURzKCkgIT0gZm9yZWlnbi5nZXROdW1PZklEcygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGkgPSAwOyBpIDwgZ2V0TnVtT2ZJRHMoKTsgaSsrKSB7Ci0JCQlpZiAoZ2V0SUQoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldElEKGkpKSAhPSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCS8vIGNvbXBhcmUgQXR0cmlidXRlcwotCQlpZiAoZ2V0TnVtT2ZBdHRyaWJ1dGVzKCkgIT0gZm9yZWlnbi5nZXROdW1PZkF0dHJpYnV0ZXMoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpID0gMDsgaSA8IGdldE51bU9mQXR0cmlidXRlcygpOyBpKyspIHsKLQkJCWlmIChnZXRBdHRyaWJ1dGUoaSkuY29tcGFyZVRvSWdub3JlQ2FzZShmb3JlaWduLmdldEF0dHJpYnV0ZShpKSkgIT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShpbnQgaW5kZXgpIHsKLQkJaWYgKGZBdHRyaWJ1dGUgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZkF0dHJpYnV0ZS5zaXplKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBmQXR0cmlidXRlLmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsYXNzKGludCBpbmRleCkgewotCQlpZiAoZkNsYXNzICE9IG51bGwgJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IGZDbGFzcy5zaXplKCkpIHsKLQkJCXJldHVybiAoU3RyaW5nKSBmQ2xhc3MuZ2V0KGluZGV4KTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUQoaW50IGluZGV4KSB7Ci0JCWlmIChmSUQgIT0gbnVsbCAmJiAwIDw9IGluZGV4ICYmIGluZGV4IDwgZklELnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZJRC5nZXQoaW5kZXgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRJdGVtVHlwZSgpIHsKLQkJcmV0dXJuIFNJTVBMRTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiAoZk5hbWUgIT0gbnVsbCkgPyBmTmFtZSA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE51bU9mQXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIChmQXR0cmlidXRlICE9IG51bGwpID8gZkF0dHJpYnV0ZS5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZDbGFzc2VzKCkgewotCQlyZXR1cm4gKGZDbGFzcyAhPSBudWxsKSA/IGZDbGFzcy5zaXplKCkgOiAwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtT2ZJRHMoKSB7Ci0JCXJldHVybiAoZklEICE9IG51bGwpID8gZklELnNpemUoKSA6IDA7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGludCBnZXROdW1PZlBzZXVkb05hbWVzKCkgewotCQlyZXR1cm4gKGZQc2V1ZG9OYW1lICE9IG51bGwpID8gZlBzZXVkb05hbWUuc2l6ZSgpIDogMDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHNldWRvTmFtZShpbnQgaW5kZXgpIHsKLQkJaWYgKGZQc2V1ZG9OYW1lICE9IG51bGwgJiYgMCA8PSBpbmRleCAmJiBpbmRleCA8IGZQc2V1ZG9OYW1lLnNpemUoKSkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZQc2V1ZG9OYW1lLmdldChpbmRleCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7Ci0JCWlmIChmQ2FjaGVkU3RyaW5nID09IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGdldE5hbWUoKSk7Ci0JCQlpZiAoZlN0cmluZ0J1ZiAhPSBudWxsKSB7Ci0JCQkJYnVmLmFwcGVuZChmU3RyaW5nQnVmLnRvU3RyaW5nKCkpOwotCQkJfQotCQkJZkNhY2hlZFN0cmluZyA9IGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBmQ2FjaGVkU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVW5pdmVyc2FsKCkgewotCQlyZXR1cm4gKGZOYW1lID09IG51bGwgfHwgZk5hbWUuZXF1YWxzKCIqIikpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJZk5hbWUgPSBuYW1lOwotCQlmQ2FjaGVkU3RyaW5nID0gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTY1YTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0vKioKLSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgZXh0ZW5kcyBDU1NOb2RlSW1wbCB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQotCS8qKgotCSAqIENTU0NvbnRhaW5lciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHVibGljIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0JLyoqCi0JICogY3VycmVudGx5IHB1YmxpYyBidXQgbWF5IGJlIG1hZGUgZGVmYXVsdCBhY2Nlc3MgcHJvdGVjdGVkIGluIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3NzVGV4dCgpIHsKLQkJaWYgKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBnZW5lcmF0ZVNvdXJjZSgpOwotCi0JCVN0cmluZ0J1ZmZlciBzdHIgPSBuZXcgU3RyaW5nQnVmZmVyKGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQl3aGlsZSAobm9kZSAhPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJCXN0ci5hcHBlbmQobm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldEVuZCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBpbmRleCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJZm9yIChpbnQgaSA9IGluZGV4OyBpID4gMDsgaS0tKSB7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCkgewotCQlpZiAoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoOyBub2RlICE9IG51bGw7IGkrKykKLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJcmV0dXJuIGk7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JYm9vbGVhbiBpbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0KSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJLy8gdmFsaWRhdGUgcmFuZ2Ugb2YgcGFyYW1ldGVycwotCQlpZiAoZmlyc3QgIT0gbnVsbCAmJiBsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChmaXJzdC5nZXRTdGFydCgpID4gbGFzdC5nZXRTdGFydCgpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZmlyc3Q7Ci0JCQkJZmlyc3QgPSBsYXN0OwotCQkJCWxhc3QgPSBub2RlOwotCQkJfQotCQl9Ci0KLQkJLy8gdmFsaWRhdGUgbWluZQotCQlib29sZWFuIGIgPSB2YWxpZGF0ZVJhbmdlKCk7Ci0JCWJNb2RpZmllZCA9IGIgfHwgYk1vZGlmaWVkOwotCi0JCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQlpZiAoZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsIHx8IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnQoKSA+IGZpcnN0LmdldFN0YXJ0KCkpIHsKLQkJCQlzZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmaXJzdCk7Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmIChsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCB8fCBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnQoKSA8IGxhc3QuZ2V0U3RhcnQoKSkgewotCQkJCXNldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obGFzdCk7Ci0JCQkJYk1vZGlmaWVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCS8vIHJlLXZhbGlkYXRlCi0JCWlmIChiTW9kaWZpZWQpCi0JCQl2YWxpZGF0ZVJhbmdlKCk7Ci0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwcm9wYWdhdGVSYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJYm9vbGVhbiBiTW9kaWZpZWQgPSBmYWxzZTsKLQotCQlDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgcGFyZW50ID0gKENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gYk1vZGlmaWVkOwotCi0JCWJvb2xlYW4gYiA9IHBhcmVudC5pbmNsdWRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQkJYk1vZGlmaWVkID0gYiB8fCBiTW9kaWZpZWQ7Ci0KLQkJaWYgKGIpCi0JCQlwYXJlbnQucHJvcGFnYXRlUmFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gZWxzZSBuZWVkIG5vdCB1cGRhdGUgcmFuZ2Ugb2YgYW5jZXN0b3JzCi0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCksIGdldEVuZE9mZnNldCgpIC0gZ2V0U3RhcnRPZmZzZXQoKSwgY3NzVGV4dCk7Ci0JCX0KLQkJZWxzZQotCQkJc3VwZXIuc2V0Q3NzVGV4dChjc3NUZXh0KTsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSkgewotCQlmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGU7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGU7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3ROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlKSB7Ci0JCWlmIChmaXJzdE5vZGUgIT0gbnVsbCkKLQkJCXNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZpcnN0Tm9kZSk7Ci0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKQotCQkJc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihsYXN0Tm9kZSk7Ci0KLQkJaWYgKGZpcnN0Tm9kZSA9PSBudWxsICYmIGxhc3ROb2RlID09IG51bGwpIHsKLQkJCXNldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJc2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJfQotCQllbHNlIHsgLy8gcmFuZ2UgdmFsaWRhdGlvbgotCQkJdmFsaWRhdGVSYW5nZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHZhbGlkYXRlUmFuZ2UoKSB7Ci0JCWJvb2xlYW4gYk1vZGlmaWVkID0gZmFsc2U7Ci0KLQkJaWYgKGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgfHwgbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJdGhpcy5maXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMubGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAodGhpcy5sYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWJNb2RpZmllZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmICh0aGlzLmZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgPiB0aGlzLmxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSkgewotCQkJCS8vIG5lZWQgdG8gc3dhcCBmaXJzdCBmb3IgbGFzdAotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQlsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZTsKLQkJCQliTW9kaWZpZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJNb2RpZmllZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xJdGVtSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xJdGVtSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQ2YmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsSXRlbUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyLkNTU1NvdXJjZUZvcm1hdHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5TdHlsZURlY2xJdGVtRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTU3R5bGVEZWNsSXRlbUltcGwgZXh0ZW5kcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBJQ1NTU3R5bGVEZWNsSXRlbSB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgZlByb3BlcnR5TmFtZTsKLQotCS8qKgotCSAqIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwoQ1NTU3R5bGVEZWNsSXRlbUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJdGhpcy5mUHJvcGVydHlOYW1lID0gdGhhdC5mUHJvcGVydHlOYW1lOwotCX0KLQotCS8qKgotCSAqIENTU1N0eWxlRGVjbEl0ZW1JbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTU3R5bGVEZWNsSXRlbUltcGwoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlzdXBlcigpOwotCQl0aGlzLmZQcm9wZXJ0eU5hbWUgPSBwcm9wZXJ0eU5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgYXBwZW5kVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc2VydFZhbHVlQmVmb3JlKHZhbHVlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGNsb25lZCA9IG5ldyBDU1NTdHlsZURlY2xJdGVtSW1wbCh0aGlzKTsKLQotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVmFsdWVTb3VyY2UoKSB7Ci0JCUNTU1NvdXJjZUdlbmVyYXRvciBmb3JtYXR0ZXIgPSBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuZ2V0U291cmNlRm9ybWF0dGVyKHRoaXMpOwotCQlpZiAoZm9ybWF0dGVyICE9IG51bGwgJiYgZm9ybWF0dGVyIGluc3RhbmNlb2YgU3R5bGVEZWNsSXRlbUZvcm1hdHRlcikKLQkJCXJldHVybiAoKFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0VmFsdWUodGhpcykudG9TdHJpbmcoKTsKLQkJZWxzZQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZQotCSAqLwotCXB1YmxpYyBDU1NWYWx1ZSBnZXRDU1NWYWx1ZSgpIHsKLQkJaW50IG5WYWx1ZSA9IGdldExlbmd0aCgpOwotCQlpZiAoblZhbHVlIDw9IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZSBpZiAoblZhbHVlID09IDEpCi0JCQlyZXR1cm4gaXRlbSgwKTsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0Q1NTVmFsdWVUZXh0KCkgewotCQlpZiAoZ2V0Rmlyc3RDaGlsZCgpID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQkvLyBjaGVjayB3aGV0aGVyIGNoaWxkcmVuIGhhcyBmbGF0bm9kZXMKLQkJSUNTU05vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCQlyZXR1cm4gZ2VuZXJhdGVWYWx1ZVNvdXJjZSgpOwotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBnZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgLSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIGdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJcmV0dXJuIG5vZGUuZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldENzc1ZhbHVlVHlwZSgpIHsKLQkJcmV0dXJuIENTU19WQUxVRV9MSVNUOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCWludCBpID0gMDsKLQkJZm9yIChJQ1NTTm9kZSBub2RlID0gZ2V0Rmlyc3RDaGlsZCgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKQotCQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVERUNMSVRFTV9OT0RFOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFByaW9yaXR5KCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKElNUE9SVEFOVCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZlByb3BlcnR5TmFtZS50cmltKCk7Ci0JCXJldHVybiBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKG5hbWUpICE9IG51bGwgPyBmUHJvcGVydHlOYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpIDogbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIHJlZlZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgaW5zZXJ0VmFsdWVCZWZvcmUoSUNTU1ByaW1pdGl2ZVZhbHVlIG5ld1ZhbHVlLCBJQ1NTUHJpbWl0aXZlVmFsdWUgcmVmVmFsdWUpIHsKLQkJSUNTU05vZGUgbm9kZSA9IGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIG5ld1ZhbHVlLCAoQ1NTTm9kZUltcGwpIHJlZlZhbHVlKTsKLQkJcmV0dXJuIChJQ1NTUHJpbWl0aXZlVmFsdWUpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBDU1NWYWx1ZSBpdGVtKGludCBpbmRleCkgewotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgewotCQkJCWlmIChpKysgPT0gaW5kZXgpCi0JCQkJCXJldHVybiAoQ1NTVmFsdWUpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCXB1YmxpYyBJQ1NTUHJpbWl0aXZlVmFsdWUgcmVtb3ZlVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSUNTU05vZGUgbm9kZSA9IHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgdmFsdWUpOwotCQlyZXR1cm4gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKi8KLQlwdWJsaWMgSUNTU1ByaW1pdGl2ZVZhbHVlIHJlcGxhY2VWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgbmV3VmFsdWUsIElDU1NQcmltaXRpdmVWYWx1ZSBvbGRWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ld1ZhbHVlOwotCQlpZiAobmV3VmFsdWUgIT0gbnVsbCkKLQkJCWluc2VydFZhbHVlQmVmb3JlKG5ld1ZhbHVlLCBvbGRWYWx1ZSk7Ci0JCXJldHVybiByZW1vdmVWYWx1ZShvbGRWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1ZhbHVlVGV4dChTdHJpbmcgdmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlJQ1NTTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCUlDU1NOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQkJcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBjaGlsZCk7Ci0JCQl9Ci0JCQljaGlsZCA9IG5leHQ7Ci0JCX0KLQkJc2V0Q3NzVmFsdWVUZXh0Q29yZSh2YWx1ZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNldENzc1ZhbHVlVGV4dENvcmUoU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gdXNlIHRlbXBvcmFyeSBkb2N1bWVudAotCQlzeW5jaHJvbml6ZWQgKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmNsYXNzKSB7Ci0JCQlpZiAoc2hhcmVkU3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpIHsKLQkJCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JCQkJc2hhcmVkU3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkoKENTU1NvdXJjZVBhcnNlcikgc2hhcmVkU3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpKS5zZXRQYXJzZXJNb2RlKENTU1NvdXJjZVBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFKTsKLQotCQkJfQotCQkJc2hhcmVkU3RydWN0dXJlZERvY3VtZW50LnNldCh2YWx1ZSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzaGFyZWRTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChub2RlLmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5WQUxJRF9NT0RJRklDQVRJT05fRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIgaXRlbVBhcnNlciA9IG5ldyBDU1NEZWNsYXJhdGlvbkl0ZW1QYXJzZXIoZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWl0ZW1QYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50VGVtcG9yYXJ5KHRydWUpOwotCQkJLy8gbWFrZSBhIGNvcHkgb2Ygbm9kZWxpc3QgYmVjYXVzZSBzZXR1cFZhbHVlcyB3aWxsIGRlc3Ryb3kgbGlzdAotCQkJSVRleHRSZWdpb25MaXN0IG5vZGVMaXN0ID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbChub2RlLmdldFJlZ2lvbnMoKSk7Ci0JCQlpdGVtUGFyc2VyLnNldHVwVmFsdWVzKHRoaXMsIG5vZGUsIG5vZGVMaXN0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc2hhcmVkU3RydWN0dXJlZERvY3VtZW50OwotCi0JLyoqCi0JICogQHBhcmFtIG5ld1ByaW9yaXR5Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJpb3JpdHkoamF2YS5sYW5nLlN0cmluZyBuZXdQcmlvcml0eSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShJTVBPUlRBTlQsIG5ld1ByaW9yaXR5KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNjE0MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dCB7Ci0KLQlwcm90ZWN0ZWQgSUNTU0RvY3VtZW50IGZPd25lckRvY3VtZW50ID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb25lQ2hpbGROb2RlcyhJQ1NTTm9kZSBzcmMsIElDU1NOb2RlIGRlc3QpIHsKLQkJaWYgKGZPd25lckRvY3VtZW50ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShkZXN0IGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlDU1NOb2RlSW1wbCBjb250YWluZXIgPSAoQ1NTTm9kZUltcGwpIGRlc3Q7Ci0JCWNvbnRhaW5lci5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0KLQkJZm9yIChJQ1NTTm9kZSBjaGlsZCA9IHNyYy5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHsKLQkJCQkvLyBleHRyYWN0IHNob3J0aGFuZCBwcm9wZXJ0eSAuLgotCQkJCS8vIC0tPiBUZW1wCi0JCQkJSUNTU05vZGUgY2xvbmVkID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQlpZiAoY2xvbmVkIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQkJKChDU1NOb2RlSW1wbCkgY2xvbmVkKS5zZXRPd25lckRvY3VtZW50KGZPd25lckRvY3VtZW50KTsKLQkJCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgY2xvbmVkKTsKLQkJCQkJY2xvbmVDaGlsZE5vZGVzKGNoaWxkLCBjbG9uZWQpOwotCQkJCX0KLQkJCQkvLyA8LS0gVGVtcAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUNTU05vZGUgY2xvbmVkID0gY2hpbGQuY2xvbmVOb2RlKGZhbHNlKTsKLQkJCQlpZiAoY2xvbmVkIGluc3RhbmNlb2YgQ1NTTm9kZUltcGwpIHsKLQkJCQkJKChDU1NOb2RlSW1wbCkgY2xvbmVkKS5zZXRPd25lckRvY3VtZW50KGZPd25lckRvY3VtZW50KTsKLQkJCQkJY29udGFpbmVyLmFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgY2xvbmVkKTsKLQkJCQkJY2xvbmVDaGlsZE5vZGVzKGNoaWxkLCBjbG9uZWQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU1N0eWxlRGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlU3R5bGVEZWNsYXJhdGlvbigpIHsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgZGVjbCA9IG5ldyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCh0cnVlKTsKLQkJZGVjbC5zZXRPd25lckRvY3VtZW50KGRlY2wpOwotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlRGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTdmMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZURlY2xhcmF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENTU0RvY3VtZW50SW1wbCBpbXBsZW1lbnRzIElDU1NTdHlsZURlY2xhcmF0aW9uIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmSXNEb2N1bWVudDsKLQotCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsKENTU1N0eWxlRGVjbGFyYXRpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXRoaXMuZklzRG9jdW1lbnQgPSB0aGF0LmZJc0RvY3VtZW50OwotCQlpZiAoZklzRG9jdW1lbnQpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbChib29sZWFuIGlzRG9jdW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZklzRG9jdW1lbnQgPSBpc0RvY3VtZW50OwotCQlpZiAoZklzRG9jdW1lbnQpIHsKLQkJCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBjbG9uZWQgPSBuZXcgQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSBnZXREZWNsSXRlbU5vZGUoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlJQ1NTTm9kZSBub2RlID0gZ2V0TGFzdENoaWxkKCk7Ci0JCXByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZS50cmltKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpIHsKLQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gKElDU1NTdHlsZURlY2xJdGVtKSBub2RlOwotCQkJCWlmIChwcm9wZXJ0eU5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShpdGVtLmdldFByb3BlcnR5TmFtZSgpLnRyaW0oKSkgPT0gMCkKLQkJCQkJcmV0dXJuIGl0ZW07Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgaSA9IDA7Ci0JCUlDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsSXRlbUltcGwpCi0JCQkJaSsrOwotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gaTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVERUNMQVJBVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSBDU1MgcnVsZSB0aGF0IGNvbnRhaW5zIHRoaXMgZGVjbGFyYXRpb24gYmxvY2sgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiBpZiB0aGlzIDxjb2RlPkNTU1N0eWxlRGVjbGFyYXRpb248L2NvZGU+IGlzIG5vdCBhdHRhY2hlZCB0byBhCi0JICogPGNvZGU+Q1NTUnVsZTwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0UGFyZW50UnVsZSgpIHsKLQkJSUNTU05vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTUnVsZSkKLQkJCXJldHVybiAoQ1NTUnVsZSkgcGFyZW50OwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIHRoZSBvYmplY3QgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGEgQ1NTCi0JICogcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGUgcHJvcGVydHkgaXMgYSBzaG9ydGhhbmQKLQkgKiBwcm9wZXJ0eS4gU2hvcnRoYW5kIHByb3BlcnR5IHZhbHVlcyBjYW4gb25seSBiZSBhY2Nlc3NlZCBhbmQgbW9kaWZpZWQKLQkgKiBhcyBzdHJpbmdzLCB1c2luZyB0aGUgPGNvZGU+Z2V0UHJvcGVydHlWYWx1ZTwvY29kZT4gYW5kCi0JICogPGNvZGU+c2V0UHJvcGVydHk8L2NvZGU+IG1ldGhvZHMuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldC4KLQkgKi8KLQlwdWJsaWMgQ1NTVmFsdWUgZ2V0UHJvcGVydHlDU1NWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCXJldHVybiBpdGVtLmdldENTU1ZhbHVlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHByaW9yaXR5IG9mIGEgQ1NTIHByb3BlcnR5IChlLmcuIHRoZQotCSAqIDxjb2RlPiJpbXBvcnRhbnQiPC9jb2RlPiBxdWFsaWZpZXIpIGlmIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbgotCSAqIGV4cGxpY2l0bHkgc2V0IGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHByaW9yaXR5IChlLmcuCi0JICogICAgICAgICA8Y29kZT4iaW1wb3J0YW50IjwvY29kZT4pIGlmIG9uZSBleGlzdHMuIFRoZSBlbXB0eSBzdHJpbmcgaWYKLQkgKiAgICAgICAgIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlQcmlvcml0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW0gPSBnZXREZWNsSXRlbU5vZGUocHJvcGVydHlOYW1lKTsKLQkJaWYgKGl0ZW0gIT0gbnVsbCkKLQkJCXJldHVybiBpdGVtLmdldFByaW9yaXR5KCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gcmV0cmlldmUgdGhlIHZhbHVlIG9mIGEgQ1NTIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkKLQkgKiBzZXQgd2l0aGluIHRoaXMgZGVjbGFyYXRpb24gYmxvY2suCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgVGhlIG5hbWUgb2YgdGhlIENTUyBwcm9wZXJ0eS4gU2VlIHRoZSBDU1MgcHJvcGVydHkgaW5kZXguCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaWYgaXQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQKLQkgKiAgICAgICAgIGZvciB0aGlzIGRlY2xhcmF0aW9uIGJsb2NrLiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhlCi0JICogICAgICAgICBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlWYWx1ZShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUNTU1ZhbHVlIHZhbHVlID0gZ2V0UHJvcGVydHlDU1NWYWx1ZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCXJldHVybiAoKElDU1NWYWx1ZSkgdmFsdWUpLmdldENTU1ZhbHVlVGV4dCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RvY3VtZW50KCkgewotCQlyZXR1cm4gZklzRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCB0byByZXRyaWV2ZSB0aGUgcHJvcGVydGllcyB0aGF0IGhhdmUgYmVlbiBleHBsaWNpdGx5IHNldCBpbiB0aGlzCi0JICogZGVjbGFyYXRpb24gYmxvY2suIFRoZSBvcmRlciBvZiB0aGUgcHJvcGVydGllcyByZXRyaWV2ZWQgdXNpbmcgdGhpcwotCSAqIG1ldGhvZCBkb2VzIG5vdCBoYXZlIHRvIGJlIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgc2V0LiBUaGlzCi0JICogbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGl0ZXJhdGUgb3ZlciBhbGwgcHJvcGVydGllcyBpbiB0aGlzIGRlY2xhcmF0aW9uCi0JICogYmxvY2suCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBJbmRleCBvZiB0aGUgcHJvcGVydHkgbmFtZSB0byByZXRyaWV2ZS4KLQkgKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBhdCB0aGlzIG9yZGluYWwgcG9zaXRpb24uIFRoZSBlbXB0eQotCSAqICAgICAgICAgc3RyaW5nIGlmIG5vIHByb3BlcnR5IGV4aXN0cyBhdCB0aGlzIHBvc2l0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBpID0gMDsKLQkJSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xJdGVtSW1wbCkgewotCQkJCWlmIChpICE9IGluZGV4KQotCQkJCQlpKys7Ci0JCQkJZWxzZSB7Ci0JCQkJCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIG5vZGU7Ci0JCQkJCXJldHVybiBpdGVtLmdldFByb3BlcnR5TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElDU1NTdHlsZURlY2xJdGVtIHJlbW92ZURlY2xJdGVtTm9kZShJQ1NTU3R5bGVEZWNsSXRlbSBvbGREZWNsKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgcmVtb3ZlQ2hpbGQoKENTU05vZGVJbXBsKSBvbGREZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlbW92ZSBhIENTUyBwcm9wZXJ0eSBpZiBpdCBoYXMgYmVlbiBleHBsaWNpdGx5IHNldCB3aXRoaW4gdGhpcwotCSAqIGRlY2xhcmF0aW9uIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlmIGl0IGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0Ci0JICogICAgICAgICBmb3IgdGhpcyBkZWNsYXJhdGlvbiBibG9jay4gUmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoZQotCSAqICAgICAgICAgcHJvcGVydHkgaGFzIG5vdCBiZWVuIHNldCBvciB0aGUgcHJvcGVydHkgbmFtZSBkb2VzIG5vdAotCSAqICAgICAgICAgY29ycmVzcG9uZCB0byBhIGtub3duIENTUyBwcm9wZXJ0eS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgZGVjbGFyYXRpb24KLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seSBvciB0aGUgcHJvcGVydHkgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyByZW1vdmVQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSUNTU1N0eWxlRGVjbEl0ZW0gaXRlbSA9IGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQlyZW1vdmVDaGlsZCgoQ1NTTm9kZUltcGwpIGl0ZW0pOwotCQkJcmV0dXJuIGl0ZW0uZ2V0Q3NzVGV4dCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsSXRlbSBzZXREZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gbmV3RGVjbCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdEZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gZ2V0RGVjbEl0ZW1Ob2RlKG5ld0RlY2wuZ2V0UHJvcGVydHlOYW1lKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKQotCQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgcmVwbGFjZUNoaWxkKChDU1NOb2RlSW1wbCkgbmV3RGVjbCwgKENTU05vZGVJbXBsKSBpdGVtKTsKLQkJZWxzZQotCQkJcmV0dXJuIChJQ1NTU3R5bGVEZWNsSXRlbSkgYXBwZW5kQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdEZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHNldCBhIHByb3BlcnR5IHZhbHVlIGFuZCBwcmlvcml0eSB3aXRoaW4gdGhpcyBkZWNsYXJhdGlvbgotCSAqIGJsb2NrLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBDU1MgcHJvcGVydHkuIFNlZSB0aGUgQ1NTIHByb3BlcnR5IGluZGV4LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIG5ldyB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCi0JICogQHBhcmFtIHByaW9yaXR5Ci0JICogICAgICAgICAgICBUaGUgbmV3IHByaW9yaXR5IG9mIHRoZSBwcm9wZXJ0eSAoZS5nLgotCSAqICAgICAgICAgICAgPGNvZGU+ImltcG9ydGFudCI8L2NvZGU+KS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGhhcyBhIHN5bnRheAotCSAqICAgICAgICAgICAgICAgIGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBkZWNsYXJhdGlvbgotCSAqICAgICAgICAgICAgICAgIGlzIHJlYWRvbmx5IG9yIHRoZSBwcm9wZXJ0eSBpcyByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBTdHJpbmcgdmFsdWUsIFN0cmluZyBwcmlvcml0eSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCAiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBZb3UgY2FuIHVzZSB0aGlzIG9ubHkgaWYgQ1NTVmFsdWUuc2V0Q3NzVGV4dCgpIGlzIGltcGxlbWVudGVkCi0JCUNTU1N0eWxlRGVjbEl0ZW1JbXBsIGl0ZW0gPSAoQ1NTU3R5bGVEZWNsSXRlbUltcGwpIGdldERlY2xJdGVtTm9kZShwcm9wZXJ0eU5hbWUpOwotCQlpZiAoaXRlbSA9PSBudWxsKSB7Ci0JCQlpdGVtID0gKENTU1N0eWxlRGVjbEl0ZW1JbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTU3R5bGVEZWNsSXRlbShwcm9wZXJ0eU5hbWUpOwotCQkJYXBwZW5kQ2hpbGQoaXRlbSk7Ci0JCX0KLQotCQkvLyBJQ1NTTm9kZSBuZXh0ID0gaXRlbS5nZXROZXh0U2libGluZygpOwotCQkvLyByZW1vdmVDaGlsZChpdGVtKTsKLQotCQlpdGVtLnNldENzc1ZhbHVlVGV4dCh2YWx1ZSk7Ci0JCWl0ZW0uc2V0UHJpb3JpdHkocHJpb3JpdHkpOwotCi0JCS8vIGluc2VydEJlZm9yZShpdGVtLCAoQ1NTTm9kZUltcGwpbmV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YWRkMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NTdHlsZVJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3Rvckxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlUnVsZUltcGwgZXh0ZW5kcyBDU1NSdWxlRGVjbENvbnRhaW5lciBpbXBsZW1lbnRzIElDU1NTdHlsZVJ1bGUgewotCi0JSUNTU1NlbGVjdG9yTGlzdCBmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwobnVsbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDU1NTdHlsZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1N0eWxlUnVsZUltcGwoQ1NTU3R5bGVSdWxlSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUNTU1N0eWxlUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlUnVsZUltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBleHRyYWN0UHJlU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0U2VsZWN0b3JUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFUlVMRV9OT0RFOwotCX0KLQotCXB1YmxpYyBJQ1NTU2VsZWN0b3JMaXN0IGdldFNlbGVjdG9ycygpIHsKLQkJcmV0dXJuIGZTZWxlY3Rvckxpc3Q7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNlbGVjdG9yIGZvciB0aGUgcnVsZSBzZXQuIFRoZQotCSAqIGltcGxlbWVudGF0aW9uIG1heSBoYXZlIHN0cmlwcGVkIG91dCBpbnNpZ25pZmljYW50IHdoaXRlc3BhY2Ugd2hpbGUKLQkgKiBwYXJzaW5nIHRoZSBzZWxlY3Rvci4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIENTUyBzdHJpbmcgdmFsdWUgaGFzCi0JICogICAgICAgICAgICAgICAgYSBzeW50YXggZXJyb3IgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHJ1bGUgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVGV4dCgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRUxFQ1RPUik7Ci0JfQotCi0JLyoqCi0JICogVGhlIHR5cGUgb2YgdGhlIHJ1bGUsIGFzIGRlZmluZWQgYWJvdmUuIFRoZSBleHBlY3RhdGlvbiBpcyB0aGF0Ci0JICogYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIG1ldGhvZHMgY2FuIGJlIHVzZWQgdG8gY2FzdCBkb3duIGZyb20gYW4KLQkgKiBpbnN0YW5jZSBvZiB0aGUgPGNvZGU+Q1NTUnVsZTwvY29kZT4gaW50ZXJmYWNlIHRvIHRoZSBzcGVjaWZpYwotCSAqIGRlcml2ZWQgaW50ZXJmYWNlIGltcGxpZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXRUeXBlKCkgewotCQlyZXR1cm4gU1RZTEVfUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTZWxlY3RvclRleHQoU3RyaW5nIHNlbGVjdG9yVGV4dCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShTRUxFQ1RPUiwgc2VsZWN0b3JUZXh0KTsKLQkJZlNlbGVjdG9yTGlzdCA9IG5ldyBDU1NTZWxlY3Rvckxpc3RJbXBsKHNlbGVjdG9yVGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTU3R5bGVTaGVldEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyYTJkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NTU1N0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydFJ1bGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIENTU1N0eWxlU2hlZXRJbXBsIGV4dGVuZHMgQ1NTRG9jdW1lbnRJbXBsIGltcGxlbWVudHMgSUNTU1N0eWxlU2hlZXQgewotCi0KLQljbGFzcyBJbnRlcm5hbE5vZGVMaXN0IGltcGxlbWVudHMgTm9kZUxpc3QgewotCi0JCVZlY3RvciBub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCWlmIChub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJZWxzZQotCQkJCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpKSB7Ci0JCQlpZiAobm9kZXMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpIDwgMCB8fCBub2Rlcy5zaXplKCkgPD0gaSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoTm9kZSkgbm9kZXMuZ2V0KGkpOwotCQl9Ci0JfQotCi0JY2xhc3MgSW50ZXJuYWxTdHlsZVNoZWV0TGlzdCBleHRlbmRzIEFic3RyYWN0Q1NTTm9kZUxpc3QgaW1wbGVtZW50cyBTdHlsZVNoZWV0TGlzdCB7Ci0KLQkJcHVibGljIElDU1NOb2RlIGFwcGVuZE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQkJaWYgKG5vZGVzID09IG51bGwgfHwgIW5vZGVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCXJldHVybiBzdXBlci5hcHBlbmROb2RlKG5vZGUpOwotCQkJZWxzZQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0KLQkJcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaSkgewotCQkJcmV0dXJuIChTdHlsZVNoZWV0KSBpdGVtSW1wbChpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmRGlzYWJsZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCUNTU1N0eWxlU2hlZXRJbXBsKCkgewotCQlzdXBlcigpOwotCQlzZXRPd25lckRvY3VtZW50KHRoaXMpOwotCX0KLQotCUNTU1N0eWxlU2hlZXRJbXBsKENTU1N0eWxlU2hlZXRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JCXNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgYXBwZW5kUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGFwcGVuZENoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JcHVibGljIElDU1NOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ1NTU3R5bGVTaGVldEltcGwgY2xvbmVkID0gbmV3IENTU1N0eWxlU2hlZXRJbXBsKHRoaXMpOwotCi0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTQ2hhcnNldFJ1bGUgY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKSB7Ci0JCUNTU0NoYXJzZXRSdWxlSW1wbCBydWxlID0gbmV3IENTU0NoYXJzZXRSdWxlSW1wbCgpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZQotCSAqLwotCXB1YmxpYyBDU1NGb250RmFjZVJ1bGUgY3JlYXRlQ1NTRm9udEZhY2VSdWxlKCkgewotCQlDU1NGb250RmFjZVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTRm9udEZhY2VSdWxlSW1wbCgpOwotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBzdHlsZSA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQoc3R5bGUpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTSW1wb3J0UnVsZSBjcmVhdGVDU1NJbXBvcnRSdWxlKCkgewotCQlDU1NJbXBvcnRSdWxlSW1wbCBydWxlID0gbmV3IENTU0ltcG9ydFJ1bGVJbXBsKCk7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWEgPSAoTWVkaWFMaXN0SW1wbCkgY3JlYXRlTWVkaWFMaXN0KCk7Ci0KLQkJcnVsZS5hcHBlbmRDaGlsZChtZWRpYSk7Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5JQ1NTTWVkaWFSdWxlCi0JICovCi0JcHVibGljIElDU1NNZWRpYVJ1bGUgY3JlYXRlQ1NTTWVkaWFSdWxlKCkgewotCQlDU1NNZWRpYVJ1bGVJbXBsIHJ1bGUgPSBuZXcgQ1NTTWVkaWFSdWxlSW1wbCgpOwotCQlNZWRpYUxpc3RJbXBsIG1lZGlhID0gKE1lZGlhTGlzdEltcGwpIGNyZWF0ZU1lZGlhTGlzdCgpOwotCi0JCXJ1bGUuaW5zZXJ0QmVmb3JlKG1lZGlhLCAoQ1NTTm9kZUltcGwpIHJ1bGUuZ2V0Rmlyc3RDaGlsZCgpKTsgLy8gbWVkaWEKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG11c3QKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIHRvcAotCQkJCQkJCQkJCQkJCQkJCQkJLy8gb2YKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNoaWxkcmVuCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBsaXN0Ci0JCXJ1bGUuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQotCQlyZXR1cm4gcnVsZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTUGFnZVJ1bGUgY3JlYXRlQ1NTUGFnZVJ1bGUoKSB7Ci0JCUNTU1BhZ2VSdWxlSW1wbCBydWxlID0gbmV3IENTU1BhZ2VSdWxlSW1wbCgpOwotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBzdHlsZSA9IChDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCkgY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JCXJ1bGUuYXBwZW5kQ2hpbGQoc3R5bGUpOwotCQlydWxlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0KLQkJcmV0dXJuIHJ1bGU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENTU1J1bGUgY3JlYXRlQ1NTUnVsZShTdHJpbmcgcnVsZSkgewotCQlDU1NEb2N1bWVudExvYWRlciBsb2FkZXIgPSBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0KHJ1bGUpOwotCi0JCS8vQ1NTTW9kZWxQYXJzZXIgbW9kZWxQYXJzZXIgPSBuZXcgQ1NTTW9kZWxQYXJzZXIoKENTU0RvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJQ1NTTW9kZWxQYXJzZXIgbW9kZWxQYXJzZXIgPSBuZXcgQ1NTTW9kZWxQYXJzZXIoZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJcmV0dXJuIG1vZGVsUGFyc2VyLmNyZWF0ZUNTU1J1bGUoc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgewotCQlDU1NTdHlsZURlY2xhcmF0aW9uSW1wbCBkZWNsID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKGZhbHNlKTsKLQkJZGVjbC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBkZWNsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZQotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVSdWxlIGNyZWF0ZUNTU1N0eWxlUnVsZSgpIHsKLQkJQ1NTU3R5bGVSdWxlSW1wbCBydWxlID0gbmV3IENTU1N0eWxlUnVsZUltcGwoKTsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwgc3R5bGUgPSAoQ1NTU3R5bGVEZWNsYXJhdGlvbkltcGwpIGNyZWF0ZUNTU1N0eWxlRGVjbGFyYXRpb24oKTsKLQotCQlydWxlLmFwcGVuZENoaWxkKHN0eWxlKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlCi0JICovCi0JcHVibGljIENTU1Vua25vd25SdWxlIGNyZWF0ZUNTU1Vua25vd25SdWxlKCkgewotCQlDU1NVbmtub3duUnVsZUltcGwgcnVsZSA9IG5ldyBDU1NVbmtub3duUnVsZUltcGwoKTsKLQkJcnVsZS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBydWxlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0Ci0JICovCi0JcHVibGljIE1lZGlhTGlzdCBjcmVhdGVNZWRpYUxpc3QoKSB7Ci0JCU1lZGlhTGlzdEltcGwgbWVkaWEgPSBuZXcgTWVkaWFMaXN0SW1wbCgpOwotCQltZWRpYS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCi0JCXJldHVybiBtZWRpYTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRlbGV0ZSBhIHJ1bGUgZnJvbSB0aGUgc3R5bGUgc2hlZXQuCi0JICogCi0JICogQHBhcmFtIGluZGV4Ci0JICogICAgICAgICAgICBUaGUgaW5kZXggd2l0aGluIHRoZSBzdHlsZSBzaGVldCdzIHJ1bGUgbGlzdCBvZiB0aGUgcnVsZSB0bwotCSAqICAgICAgICAgICAgcmVtb3ZlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGRvZXMgbm90Ci0JICogICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byBhIHJ1bGUgaW4gdGhlIHN0eWxlIHNoZWV0J3MgcnVsZSBsaXN0LgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHN0eWxlIHNoZWV0Ci0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUnVsZShpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlDU1NOb2RlSW1wbCBub2RlID0gZ2V0SW5kZXhlZFJ1bGUoaW5kZXgpOwotCQlpZiAobm9kZSAhPSBudWxsKQotCQkJcmVtb3ZlQ2hpbGQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGxpc3Qgb2YgYWxsIENTUyBydWxlcyBjb250YWluZWQgd2l0aGluIHRoZSBzdHlsZSBzaGVldC4gVGhpcwotCSAqIGluY2x1ZGVzIGJvdGggcnVsZSBzZXRzIGFuZCBhdC1ydWxlcy4KLQkgKi8KLQlwdWJsaWMgQ1NTUnVsZUxpc3QgZ2V0Q3NzUnVsZXMoKSB7Ci0JCUNTU1J1bGVMaXN0SW1wbCBsaXN0ID0gbmV3IENTU1J1bGVMaXN0SW1wbCgpOwotCi0JCWZvciAoSUNTU05vZGUgbm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQlsaXN0LmFwcGVuZE5vZGUobm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5mYWxzZTwvY29kZT4gaWYgdGhlIHN0eWxlIHNoZWV0IGlzIGFwcGxpZWQgdG8gdGhlIGRvY3VtZW50LgotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIGl0IGlzIG5vdC4gTW9kaWZ5aW5nIHRoaXMgYXR0cmlidXRlIG1heSBjYXVzZSBhCi0JICogbmV3IHJlc29sdXRpb24gb2Ygc3R5bGUgZm9yIHRoZSBkb2N1bWVudC4gQSBzdHlsZXNoZWV0IG9ubHkgYXBwbGllcyBpZgotCSAqIGJvdGggYW4gYXBwcm9wcmlhdGUgbWVkaXVtIGRlZmluaXRpb24gaXMgcHJlc2VudCBhbmQgdGhlIGRpc2FibGVkCi0JICogYXR0cmlidXRlIGlzIGZhbHNlLiBTbywgaWYgdGhlIG1lZGlhIGRvZXNuJ3QgYXBwbHkgdG8gdGhlIGN1cnJlbnQgdXNlcgotCSAqIGFnZW50LCB0aGUgPGNvZGU+ZGlzYWJsZWQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBpZ25vcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldERpc2FibGVkKCkgewotCQlyZXR1cm4gZkRpc2FibGVkOwotCX0KLQotCS8qKgotCSAqIElmIHRoZSBzdHlsZSBzaGVldCBpcyBhIGxpbmtlZCBzdHlsZSBzaGVldCwgdGhlIHZhbHVlIG9mIGl0cyBhdHRyaWJ1dGUKLQkgKiBpcyBpdHMgbG9jYXRpb24uIEZvciBpbmxpbmUgc3R5bGUgc2hlZXRzLCB0aGUgdmFsdWUgb2YgdGhpcyBhdHRyaWJ1dGUKLQkgKiBpcyA8Y29kZT5udWxsPC9jb2RlPi4gU2VlIHRoZSBocmVmIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGZvciB0aGUKLQkgKiA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50IGluIEhUTUwgNC4wLCBhbmQgdGhlIGhyZWYgcHNldWRvLWF0dHJpYnV0ZQotCSAqIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIcmVmKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJcmV0dXJuIG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJLyoKLQkJCSAqIE9iamVjdCBpZCA9IG1vZGVsLmdldElkKCk7IGlmIChpZCAhPSBudWxsKSB7IGlmIChpZCBpbnN0YW5jZW9mCi0JCQkgKiBJUmVzb3VyY2UpIHsgLy8gVE9ETzogbmVlZCB0byBjaGVjayB3aGV0aGVyIHRoaXMgaXMgY29ycmVjdCBvcgotCQkJICogbm90LCBsYXRlci4gcmV0dXJuICgoSVJlc291cmNlKWlkKS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7IH0KLQkJCSAqIHJldHVybiBpZC50b1N0cmluZygpOyB9Ci0JCQkgKi99Ci0JCXJldHVybiBudWxsOwotCX0KLQotCUNTU1J1bGVJbXBsIGdldEluZGV4ZWRSdWxlKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKElDU1NOb2RlIG5vZGUgPSBnZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NSdWxlKSB7Ci0JCQkJaWYgKGkrKyA9PSBpbmRleCkKLQkJCQkJcmV0dXJuIChDU1NSdWxlSW1wbCkgbm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgaW50ZW5kZWQgZGVzdGluYXRpb24gbWVkaWEgZm9yIHN0eWxlIGluZm9ybWF0aW9uLiBUaGUgbWVkaWEgaXMKLQkgKiBvZnRlbiBzcGVjaWZpZWQgaW4gdGhlIDxjb2RlPm93bmVyTm9kZTwvY29kZT4uIElmIG5vIG1lZGlhIGhhcyBiZWVuCi0JICogc3BlY2lmaWVkLCB0aGUgPGNvZGU+TWVkaWFMaXN0PC9jb2RlPiB3aWxsIGJlIGVtcHR5LiBTZWUgdGhlIG1lZGlhCi0JICogYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZSA8Y29kZT5MSU5LPC9jb2RlPiBlbGVtZW50IGluIEhUTUwgNC4wLAotCSAqIGFuZCB0aGUgbWVkaWEgcHNldWRvLWF0dHJpYnV0ZSBmb3IgdGhlIFhNTCBzdHlsZSBzaGVldCBwcm9jZXNzaW5nCi0JICogaW5zdHJ1Y3Rpb24gLiBNb2RpZnlpbmcgdGhlIG1lZGlhIGxpc3QgbWF5IGNhdXNlIGEgY2hhbmdlIHRvIHRoZQotCSAqIGF0dHJpYnV0ZSA8Y29kZT5kaXNhYmxlZDwvY29kZT4uCi0JICovCi0JcHVibGljIE1lZGlhTGlzdCBnZXRNZWRpYSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIFNUWUxFU0hFRVRfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbm9kZSB0aGF0IGFzc29jaWF0ZXMgdGhpcyBzdHlsZSBzaGVldCB3aXRoIHRoZSBkb2N1bWVudC4gRm9yIEhUTUwsCi0JICogdGhpcyBtYXkgYmUgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+TElOSzwvY29kZT4gb3IgPGNvZGU+U1RZTEU8L2NvZGU+Ci0JICogZWxlbWVudC4gRm9yIFhNTCwgaXQgbWF5IGJlIHRoZSBsaW5raW5nIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIEZvcgotCSAqIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBieSBvdGhlciBzdHlsZSBzaGVldHMsIHRoZSB2YWx1ZSBvZiB0aGlzCi0JICogYXR0cmlidXRlIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldE93bmVyTm9kZSgpIHsKLQkJLy8gZm9yIDxMSU5LPiB0YWcgb3IgPFNUWUxFPiB0YWcKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQlyZXR1cm4gbW9kZWwuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uTm9kZUxpc3QgZ2V0T3duZXJOb2RlcygpIHsKLQkJTGlzdCBsaXN0ID0gKGdldE1vZGVsKCkuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSA/IG5ldyBWZWN0b3IoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpKSA6IG51bGw7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW50ZXJuYWxOb2RlTGlzdCBub2RlcyA9IG5ldyBJbnRlcm5hbE5vZGVMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikgewotCQkJCW5vZGVzLm5vZGVzLmFkZCgoKElTdHlsZVNoZWV0QWRhcHRlcikgb2JqKS5nZXRFbGVtZW50KCkpOwotCQkJfQotCQl9Ci0JCWlmIChub2Rlcy5nZXRMZW5ndGgoKSA+IDApCi0JCQlyZXR1cm4gbm9kZXM7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gZG9jCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRPd25lck5vZGVzKERvY3VtZW50IGRvYykgewotCQlMaXN0IGxpc3QgPSAoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpID8gbmV3IFZlY3RvcihnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkpIDogbnVsbDsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbE5vZGVMaXN0IG5vZGVzID0gbmV3IEludGVybmFsTm9kZUxpc3QoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSB7Ci0JCQkJRWxlbWVudCBlbGUgPSAoKElTdHlsZVNoZWV0QWRhcHRlcikgb2JqKS5nZXRFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZS5nZXRPd25lckRvY3VtZW50KCkgPT0gZG9jKQotCQkJCQlub2Rlcy5ub2Rlcy5hZGQoZWxlKTsKLQkJCX0KLQkJfQotCQlpZiAobm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIG5vZGVzOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBJZiB0aGlzIHN0eWxlIHNoZWV0IGNvbWVzIGZyb20gYW4gPGNvZGU+QGltcG9ydDwvY29kZT4gcnVsZSwgdGhlIDxjb2RlPm93bmVyUnVsZTwvY29kZT4gYXR0cmlidXRlIHdpbGwKLQkgKiAgICAgICAgIGNvbnRhaW4gdGhlIDxjb2RlPkNTU0ltcG9ydFJ1bGU8L2NvZGU+LiBJbiB0aGF0IGNhc2UsIHRoZQotCSAqICAgICAgICAgPGNvZGU+b3duZXJOb2RlPC9jb2RlPiBhdHRyaWJ1dGUgaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5TdHlsZVNoZWV0PC9jb2RlPiBpbnRlcmZhY2Ugd2lsbCBiZSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAgICAgICAgIElmIHRoZSBzdHlsZSBzaGVldCBjb21lcyBmcm9tIGFuIGVsZW1lbnQgb3IgYSBwcm9jZXNzaW5nCi0JICogICAgICAgICBpbnN0cnVjdGlvbiwgdGhlIDxjb2RlPm93bmVyUnVsZTwvY29kZT4gYXR0cmlidXRlIHdpbGwgYmUKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGFuZCB0aGUgPGNvZGU+b3duZXJOb2RlPC9jb2RlPiBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIHdpbGwgY29udGFpbiB0aGUgPGNvZGU+Tm9kZTwvY29kZT4uCi0JICovCi0JcHVibGljIENTU1J1bGUgZ2V0T3duZXJSdWxlKCkgewotCQlBc3NlcnQuaXNUcnVlKGZhbHNlLCBDU1NDb3JlTWVzc2FnZXMuWW91X2Nhbm5vdF91c2VfQ1NTU3R5bGVTaGVfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJZb3UgY2Fubm90IHVzZSBDU1NTdHlsZVNoZWV0LmdldE93bmVyUnVsZSgpIGJlY2F1c2Ugb2YgbWFueSByZWZlcmVuY2VycyBvZiB0aGlzIHJ1bGVcblBsZWFzZSB1c2UgZ2V0T253ZXJSdWxlcygpIgotCQkvLyBmb3IgQGltcG9ydAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlTGlzdAotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3QgZ2V0T3duZXJSdWxlcygpIHsKLQkJU3R5bGVTaGVldExpc3QgbGlzdCA9IGdldFBhcmVudFN0eWxlU2hlZXRzKCk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ1NTUnVsZUxpc3RJbXBsIHJ1bGVMaXN0ID0gbmV3IENTU1J1bGVMaXN0SW1wbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IodGhpcyk7Ci0JCQl0cmF2LmFwcGx5KChJQ1NTU3R5bGVTaGVldCkgbGlzdC5pdGVtKGkpKTsKLQkJCXJ1bGVMaXN0Lm5vZGVzLmFkZEFsbCh0cmF2LmdldFJ1bGVzKCkpOwotCQl9Ci0JCXJldHVybiBydWxlTGlzdDsKLQl9Ci0KLQkvKioKLQkgKiBGb3Igc3R5bGUgc2hlZXQgbGFuZ3VhZ2VzIHRoYXQgc3VwcG9ydCB0aGUgY29uY2VwdCBvZiBzdHlsZSBzaGVldAotCSAqIGluY2x1c2lvbiwgdGhpcyBhdHRyaWJ1dGUgcmVwcmVzZW50cyB0aGUgaW5jbHVkaW5nIHN0eWxlIHNoZWV0LCBpZiBvbmUKLQkgKiBleGlzdHMuIElmIHRoZSBzdHlsZSBzaGVldCBpcyBhIHRvcC1sZXZlbCBzdHlsZSBzaGVldCwgb3IgdGhlIHN0eWxlCi0JICogc2hlZXQgbGFuZ3VhZ2UgZG9lcyBub3Qgc3VwcG9ydCBpbmNsdXNpb24sIHRoZSB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZQotCSAqIGlzIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFBhcmVudFN0eWxlU2hlZXQoKSB7Ci0JCUNTU1J1bGUgb3duZXIgPSBnZXRPd25lclJ1bGUoKTsKLQkJaWYgKG93bmVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3duZXIuZ2V0UGFyZW50U3R5bGVTaGVldCgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0Ci0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0IGdldFBhcmVudFN0eWxlU2hlZXRzKCkgewotCQlMaXN0IGxpc3QgPSAoZ2V0TW9kZWwoKS5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpID8gbmV3IFZlY3RvcihnZXRNb2RlbCgpLmdldFN0eWxlTGlzdGVuZXJzKCkpIDogbnVsbDsKLQkJaWYgKGxpc3QgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJbnRlcm5hbFN0eWxlU2hlZXRMaXN0IHNoZWV0cyA9IG5ldyBJbnRlcm5hbFN0eWxlU2hlZXRMaXN0KCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJCXNoZWV0cy5hcHBlbmROb2RlKCgoSUNTU01vZGVsKSBvYmopLmdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCWlmIChzaGVldHMuZ2V0TGVuZ3RoKCkgPiAwKQotCQkJcmV0dXJuIHNoZWV0czsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhlIGFkdmlzb3J5IHRpdGxlLiBUaGUgdGl0bGUgaXMgb2Z0ZW4gc3BlY2lmaWVkIGluIHRoZQotCSAqIDxjb2RlPm93bmVyTm9kZTwvY29kZT4uIFNlZSB0aGUgdGl0bGUgYXR0cmlidXRlIGRlZmluaXRpb24gZm9yIHRoZQotCSAqIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQgaW4gSFRNTCA0LjAsIGFuZCB0aGUgdGl0bGUgcHNldWRvLWF0dHJpYnV0ZQotCSAqIGZvciB0aGUgWE1MIHN0eWxlIHNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJTm9kZSBub2RlID0gZ2V0T3duZXJOb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlKCJUSVRMRSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHNwZWNpZmllcyB0aGUgc3R5bGUgc2hlZXQgbGFuZ3VhZ2UgZm9yIHRoaXMgc3R5bGUgc2hlZXQuIFRoZSBzdHlsZQotCSAqIHNoZWV0IGxhbmd1YWdlIGlzIHNwZWNpZmllZCBhcyBhIGNvbnRlbnQgdHlwZSAoZS5nLiAidGV4dC9jc3MiKS4gVGhlCi0JICogY29udGVudCB0eXBlIGlzIG9mdGVuIHNwZWNpZmllZCBpbiB0aGUgPGNvZGU+b3duZXJOb2RlPC9jb2RlPi4gQWxzbwotCSAqIHNlZSB0aGUgdHlwZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgdGhlIDxjb2RlPkxJTks8L2NvZGU+IGVsZW1lbnQKLQkgKiBpbiBIVE1MIDQuMCwgYW5kIHRoZSB0eXBlIHBzZXVkby1hdHRyaWJ1dGUgZm9yIHRoZSBYTUwgc3R5bGUgc2hlZXQKLQkgKiBwcm9jZXNzaW5nIGluc3RydWN0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJTm9kZSBub2RlID0gZ2V0T3duZXJOb2RlKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJcmV0dXJuICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlKCJUWVBFIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gaW5zZXJ0IGEgbmV3IHJ1bGUgaW50byB0aGUgc3R5bGUgc2hlZXQuIFRoZSBuZXcgcnVsZSBub3cKLQkgKiBiZWNvbWVzIHBhcnQgb2YgdGhlIGNhc2NhZGUuCi0JICogCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIFRoZSBwYXJzYWJsZSB0ZXh0IHJlcHJlc2VudGluZyB0aGUgcnVsZS4gRm9yIHJ1bGUgc2V0cyB0aGlzCi0JICogICAgICAgICAgICBjb250YWlucyBib3RoIHRoZSBzZWxlY3RvciBhbmQgdGhlIHN0eWxlIGRlY2xhcmF0aW9uLiBGb3IKLQkgKiAgICAgICAgICAgIGF0LXJ1bGVzLCB0aGlzIHNwZWNpZmllcyBib3RoIHRoZSBhdC1pZGVudGlmaWVyIGFuZCB0aGUgcnVsZQotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIFRoZSBpbmRleCB3aXRoaW4gdGhlIHN0eWxlIHNoZWV0J3MgcnVsZSBsaXN0IG9mIHRoZSBydWxlCi0JICogICAgICAgICAgICBiZWZvcmUgd2hpY2ggdG8gaW5zZXJ0IHRoZSBzcGVjaWZpZWQgcnVsZS4gSWYgdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgICAgaW5kZXggaXMgZXF1YWwgdG8gdGhlIGxlbmd0aCBvZiB0aGUgc3R5bGUgc2hlZXQncyBydWxlCi0JICogICAgICAgICAgICBjb2xsZWN0aW9uLCB0aGUgcnVsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIHN0eWxlCi0JICogICAgICAgICAgICBzaGVldC4KLQkgKiBAcmV0dXJuIFRoZSBpbmRleCB3aXRoaW4gdGhlIHN0eWxlIHNoZWV0J3MgcnVsZSBjb2xsZWN0aW9uIG9mIHRoZSBuZXdseQotCSAqICAgICAgICAgaW5zZXJ0ZWQgcnVsZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBydWxlIGNhbm5vdCBiZQotCSAqICAgICAgICAgICAgICAgIGluc2VydGVkIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZS5nLiBpZiBhbgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkBpbXBvcnQ8L2NvZGU+IHJ1bGUgaXMgaW5zZXJ0ZWQgYWZ0ZXIgYSBzdGFuZGFyZCBydWxlIHNldCBvciBvdGhlcgotCSAqICAgICAgICAgYXQtcnVsZS4gPGJyPgotCSAqICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGlzIG5vdCBhIHZhbGlkCi0JICogICAgICAgICBpbnNlcnRpb24gcG9pbnQuIDxicj4KLQkgKiAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgc3R5bGUgc2hlZXQgaXMKLQkgKiAgICAgICAgIHJlYWRvbmx5LiA8YnI+Ci0JICogICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIHNwZWNpZmllZCBydWxlIGhhcyBhIHN5bnRheCBlcnJvciBhbmQKLQkgKiAgICAgICAgIGlzIHVucGFyc2FibGUuCi0JICovCi0JcHVibGljIGludCBpbnNlcnRSdWxlKFN0cmluZyBydWxlLCBpbnQgaW5kZXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpbnQgbGVuZ3RoID0gZ2V0Q3NzUnVsZXMoKS5nZXRMZW5ndGgoKTsKLQkJaWYgKGluZGV4IDwgMCB8fCBsZW5ndGggPCBpbmRleCkKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCAiIik7Ly8kTk9OLU5MUy0xJAotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ1NTUnVsZUltcGwgcmVmUnVsZSA9IChsZW5ndGggIT0gaW5kZXgpID8gZ2V0SW5kZXhlZFJ1bGUoaW5kZXgpIDogbnVsbDsKLQkJaW50IG9mZnNldCA9IChyZWZSdWxlICE9IG51bGwpID8gcmVmUnVsZS5nZXRTdGFydE9mZnNldCgpIDogZG9jLmdldExlbmd0aCgpOwotCQlkb2MucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBydWxlKTsKLQotCQkvLyBpbnNlcnRCZWZvcmUoKENTU05vZGVJbXBsKSBjcmVhdGVDU1NSdWxlKHJ1bGUpLHJlZlJ1bGUpOwotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSByZWZSdWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBpbnNlcnRSdWxlQmVmb3JlKG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIG5ld1J1bGUsIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlIHJlZlJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlpZiAobmV3UnVsZSA9PSBudWxsICYmIHJlZlJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIGluc2VydEJlZm9yZSgoQ1NTTm9kZUltcGwpIG5ld1J1bGUsIChDU1NOb2RlSW1wbCkgcmVmUnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEb2N1bWVudCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUgcmVtb3ZlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJ1bGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUNTU1J1bGUgcmV0ID0gKENTU1J1bGUpIHJlbW92ZUNoaWxkKChDU1NOb2RlSW1wbCkgcnVsZSk7Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSByZXBsYWNlUnVsZShvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBuZXdSdWxlLCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSBvbGRSdWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld1J1bGUgPT0gbnVsbCAmJiBvbGRSdWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlDU1NSdWxlIHJldCA9IChDU1NSdWxlKSByZXBsYWNlQ2hpbGQoKENTU05vZGVJbXBsKSBuZXdSdWxlLCAoQ1NTTm9kZUltcGwpIG9sZFJ1bGUpOwotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIHNldERpc2FibGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkKGJvb2xlYW4gZGlzYWJsZWQpIHsKLQkJdGhpcy5mRGlzYWJsZWQgPSBkaXNhYmxlZDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NVbmtub3duUnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ1NTVW5rbm93blJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2OGRhNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DU1NVbmtub3duUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgQ1NTVW5rbm93blJ1bGVJbXBsIGV4dGVuZHMgQ1NTUnVsZUltcGwgaW1wbGVtZW50cyBDU1NVbmtub3duUnVsZSB7Ci0KLQkvLyBUT0RPOiBUaGlzIGZpZWxkIGlzIG5ldmVyIHJlYWQKLQlTdHJpbmcgZkNzc1RleHQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JQ1NTVW5rbm93blJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCUNTU1Vua25vd25SdWxlSW1wbChDU1NVbmtub3duUnVsZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDU1NVbmtub3duUnVsZUltcGwgY2xvbmVkID0gbmV3IENTU1Vua25vd25SdWxlSW1wbCh0aGlzKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBVTktOT1dOUlVMRV9OT0RFOwotCX0KLQotCS8qKgotCSAqIFRoZSB0eXBlIG9mIHRoZSBydWxlLCBhcyBkZWZpbmVkIGFib3ZlLiBUaGUgZXhwZWN0YXRpb24gaXMgdGhhdAotCSAqIGJpbmRpbmctc3BlY2lmaWMgY2FzdGluZyBtZXRob2RzIGNhbiBiZSB1c2VkIHRvIGNhc3QgZG93biBmcm9tIGFuCi0JICogaW5zdGFuY2Ugb2YgdGhlIDxjb2RlPkNTU1J1bGU8L2NvZGU+IGludGVyZmFjZSB0byB0aGUgc3BlY2lmaWMKLQkgKiBkZXJpdmVkIGludGVyZmFjZSBpbXBsaWVkIGJ5IHRoZSA8Y29kZT50eXBlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFVOS05PV05fUlVMRTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY3NzVGV4dAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldENzc1RleHQoU3RyaW5nIGNzc1RleHQpIHsKLQkJdGhpcy5mQ3NzVGV4dCA9IGNzc1RleHQ7Ci0KLQkJc3VwZXIuc2V0Q3NzVGV4dChjc3NUZXh0KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db3VudGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db3VudGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDZhZTY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ291bnRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDb3VudGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ291bnRlcjsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBDb3VudGVySW1wbCBleHRlbmRzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBpbXBsZW1lbnRzIElDb3VudGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCUNvdW50ZXJJbXBsKCkgewotCQlzdXBlcihDU1NfQ09VTlRFUik7Ci0JfQotCi0JQ291bnRlckltcGwoQ291bnRlckltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlDb3VudGVySW1wbCBjbG9uZWQgPSBuZXcgQ291bnRlckltcGwodGhpcyk7Ci0KLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSBDb3VudGVyIHZhbHVlLiBJZiB0aGlzIENTUyB2YWx1ZSBkb2Vzbid0Ci0JICogY29udGFpbiBhIGNvdW50ZXIgdmFsdWUsIGEgPGNvZGU+RE9NRXhjZXB0aW9uPC9jb2RlPiBpcyByYWlzZWQuCi0JICogTW9kaWZpY2F0aW9uIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0eWxlIHByb3BlcnR5IGNhbiBiZSBhY2hpZXZlZCB1c2luZwotCSAqIHRoZSA8Y29kZT5Db3VudGVyPC9jb2RlPiBpbnRlcmZhY2UuCi0JICogCi0JICogQHJldHVybiBUaGUgQ291bnRlciB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQUNDRVNTX0VSUjogUmFpc2VkIGlmIHRoZSBDU1MgdmFsdWUgZG9lc24ndAotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW4gYSBDb3VudGVyIHZhbHVlIChlLmcuIHRoaXMgaXMgbm90Ci0JICogICAgICAgICAgICAgICAgPGNvZGU+Q1NTX0NPVU5URVI8L2NvZGU+KS4KLQkgKi8KLQlwdWJsaWMgQ291bnRlciBnZXRDb3VudGVyVmFsdWUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGNvdW50ZXIuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZGVudGlmaWVyKCkgewotCQlyZXR1cm4gZ2V0QXR0cmlidXRlKElERU5USUZJRVIpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBzdHlsZSBvZiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZSgpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShMSVNUU1RZTEUpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBzZXBhcmF0b3Igb2YgdGhlIG5lc3RlZCBjb3VudGVycy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlcGFyYXRvcigpIHsKLQkJcmV0dXJuIGdldEF0dHJpYnV0ZShTRVBBUkFUT1IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCQlyZXR1cm47Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkZW50aWZpZXIKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRlbnRpZmllcihTdHJpbmcgaWRlbnRpZmllcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXNldEF0dHJpYnV0ZShJREVOVElGSUVSLCBpZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdFN0eWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZShTdHJpbmcgbGlzdFN0eWxlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKExJU1RTVFlMRSwgbGlzdFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gU2VwYXJhdG9yCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlcGFyYXRvcihTdHJpbmcgU2VwYXJhdG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0QXR0cmlidXRlKFNFUEFSQVRPUiwgU2VwYXJhdG9yKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01DU1NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyOGE1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTUNTU0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRE9NQ1NTSW1wbCB7Ci0KLQkvKioKLQkgKiBET01DU1NJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIERPTUNTU0ltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb25JbXBsIGRvY3VtZW50ID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25JbXBsKHRydWUpOwotCi0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0Ci0JICogQHBhcmFtIHRpdGxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG1lZGlhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ1NTU3R5bGVTaGVldCBjcmVhdGVDU1NTdHlsZVNoZWV0KFN0cmluZyB0aXRsZSwgU3RyaW5nIG1lZGlhKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG5ldyBDU1NTdHlsZVNoZWV0SW1wbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L01lZGlhTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWVkaWFMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWZmYjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWVkaWFMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLWNsYXNzIE1lZGlhTGlzdEltcGwgZXh0ZW5kcyBDU1NSZWdpb25Db250YWluZXIgaW1wbGVtZW50cyBNZWRpYUxpc3QgewotCi0JaW50IG1lZGl1bUNvdW50ZXI7Ci0KLQkvKioKLQkgKiBNZWRpYUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTWVkaWFMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZWRpYUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTWVkaWFMaXN0SW1wbChNZWRpYUxpc3RJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgbWVkaXVtIDxjb2RlPm5ld01lZGl1bTwvY29kZT4gdG8gdGhlIGVuZCBvZiB0aGUgbGlzdC4gSWYgdGhlCi0JICogPGNvZGU+bmV3TWVkaXVtPC9jb2RlPiBpcyBhbHJlYWR5IHVzZWQsIGl0IGlzIGZpcnN0IHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIG5ld01lZGl1bVRoZQotCSAqICAgICAgICAgICAgbmV3IG1lZGl1bSB0byBhZGQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX0NIQVJBQ1RFUl9FUlI6IElmIHRoZSBtZWRpdW0gY29udGFpbnMgY2hhcmFjdGVycwotCSAqICAgICAgICAgICAgICAgIHRoYXQgYXJlIGludmFsaWQgaW4gdGhlIHVuZGVybHlpbmcgc3R5bGUgbGFuZ3VhZ2UuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGxpc3QgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRNZWRpdW0oU3RyaW5nIG5ld01lZGl1bSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdNZWRpdW0gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlDU1NOb2RlTGlzdEltcGwgbSA9IGdldE1lZGlhKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpICE9IG0uZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKG5ld01lZGl1bS5lcXVhbHMoaXRlbShpKSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJc2V0QXR0cmlidXRlKCJtZWRpdW0iICsgSW50ZWdlci50b1N0cmluZyhtZWRpdW1Db3VudGVyKyspLCBuZXdNZWRpdW0pOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlNZWRpYUxpc3RJbXBsIGNsb25lZCA9IG5ldyBNZWRpYUxpc3RJbXBsKHRoaXMpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIERlbGV0ZXMgdGhlIG1lZGl1bSBpbmRpY2F0ZWQgYnkgPGNvZGU+b2xkTWVkaXVtPC9jb2RlPiBmcm9tIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBvbGRNZWRpdW1UaGUKLQkgKiAgICAgICAgICAgIG1lZGl1bSB0byBkZWxldGUgaW4gdGhlIG1lZGlhIGxpc3QuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIGxpc3QgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PVF9GT1VORF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vbGRNZWRpdW08L2NvZGU+IGlzIG5vdAotCSAqICAgICAgICAgICAgICAgIGluIHRoZSBsaXN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZU1lZGl1bShTdHJpbmcgb2xkTWVkaXVtKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgIT0gZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKG9sZE1lZGl1bS5lcXVhbHMoaXRlbShpKSkpIHsKLQkJCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKChDU1NBdHRySW1wbCkgZkF0dHJzLml0ZW0oaSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBtZWRpYSBpbiB0aGUgbGlzdC4gVGhlIHJhbmdlIG9mIHZhbGlkIG1lZGlhIGlzCi0JICogPGNvZGU+MDwvY29kZT4gdG8gPGNvZGU+bGVuZ3RoLTE8L2NvZGU+IGluY2x1c2l2ZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGdldE1lZGlhKCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBDU1NOb2RlTGlzdEltcGwKLQkgKi8KLQlDU1NOb2RlTGlzdEltcGwgZ2V0TWVkaWEoKSB7Ci0JCWlmIChmQXR0cnMgPT0gbnVsbCkKLQkJCWZBdHRycyA9IG5ldyBDU1NOYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCXJldHVybiBmQXR0cnM7Ci0JfQotCi0JLyoqCi0JICogVGhlIHBhcnNhYmxlIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGxpc3QuIFRoaXMgaXMgYQotCSAqIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG1lZGlhLgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHZhbHVlIGhhcyBhCi0JICogICAgICAgICAgICAgICAgc3ludGF4IGVycm9yIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBtZWRpYSBsaXN0Ci0JICogICAgICAgICAgICAgICAgaXMgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZWRpYVRleHQoKSB7Ci0JCXJldHVybiBnZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoMjAwMS8wMS8xNwotCSAqIDE4OjUwOjI5KQotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBNRURJQUxJU1RfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggaW4gdGhlIGxpc3QuIElmIDxjb2RlPmluZGV4PC9jb2RlPgotCSAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIG1lZGlhIGluIHRoZSBsaXN0LCB0aGlzCi0JICogcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IGludG8gdGhlIGNvbGxlY3Rpb24uCi0JICogQHJldHVybiBUaGUgbWVkaXVtIGF0IHRoZSA8Y29kZT5pbmRleDwvY29kZT4gdGggcG9zaXRpb24gaW4gdGhlCi0JICogICAgICAgICA8Y29kZT5NZWRpYUxpc3Q8L2NvZGU+LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGF0IGlzCi0JICogICAgICAgICBub3QgYSB2YWxpZCBpbmRleC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgZ2V0TGVuZ3RoKCkgPD0gaW5kZXgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKChDU1NBdHRySW1wbCkgZ2V0TWVkaWEoKS5pdGVtKGluZGV4KSkuZ2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRNZWRpYVRleHQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWVkaWFUZXh0KFN0cmluZyBtZWRpYVRleHQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRDc3NUZXh0KG1lZGlhVGV4dCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUkdCQ29sb3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JHQkNvbG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4N2Q0Yjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUkdCQ29sb3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUkdCQ29sb3I7Ci0KLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgUkdCQ29sb3JJbXBsIGV4dGVuZHMgQ1NTUHJpbWl0aXZlQ29udGFpbmVyIGltcGxlbWVudHMgUkdCQ29sb3IgewotCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZlJlZDsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmR3JlZW47Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkJsdWU7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlSR0JDb2xvckltcGwoKSB7Ci0JCXN1cGVyKENTU19SR0JDT0xPUik7Ci0JfQotCi0JUkdCQ29sb3JJbXBsKFJHQkNvbG9ySW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWZSZWQgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZlJlZCk7Ci0JCWFwcGVuZENoaWxkKGZSZWQpOwotCi0JCWZHcmVlbiA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mR3JlZW4pOwotCQlhcHBlbmRDaGlsZChmR3JlZW4pOwotCi0JCWZCbHVlID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZCbHVlKTsKLQkJYXBwZW5kQ2hpbGQoZkJsdWUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVJHQkNvbG9ySW1wbCBjbG9uZWQgPSBuZXcgUkdCQ29sb3JJbXBsKHRoaXMpOwotCi0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIGJsdWUgdmFsdWUgb2YgdGhlIFJHQiBjb2xvci4KLQkgKi8KLQlwdWJsaWMgQ1NTUHJpbWl0aXZlVmFsdWUgZ2V0Qmx1ZSgpIHsKLQkJcmV0dXJuIGZCbHVlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBncmVlbiB2YWx1ZSBvZiB0aGUgUkdCIGNvbG9yLgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRHcmVlbigpIHsKLQkJcmV0dXJuIGZHcmVlbjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgcmVkIHZhbHVlIG9mIHRoZSBSR0IgY29sb3IuCi0JICovCi0JcHVibGljIENTU1ByaW1pdGl2ZVZhbHVlIGdldFJlZCgpIHsKLQkJcmV0dXJuIGZSZWQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuUkdCQ29sb3IKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JcHVibGljIFJHQkNvbG9yIGdldFJHQkNvbG9yVmFsdWUoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFByaW1pdGl2ZXMoKSB7Ci0KLQkJZlJlZCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZlJlZCk7Ci0KLQkJZkdyZWVuID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmR3JlZW4pOwotCi0JCWZCbHVlID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmQmx1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVjdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVjdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZjYzJkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlY3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuUmVjdDsKLQotCi0vKioKLSAqIAotICovCi1jbGFzcyBSZWN0SW1wbCBleHRlbmRzIENTU1ByaW1pdGl2ZUNvbnRhaW5lciBpbXBsZW1lbnRzIFJlY3QgewotCi0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZlRvcDsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmUmlnaHQ7Ci0JcHJpdmF0ZSBDU1NQcmltaXRpdmVWYWx1ZUltcGwgZkJvdHRvbTsKLQlwcml2YXRlIENTU1ByaW1pdGl2ZVZhbHVlSW1wbCBmTGVmdDsKLQotCS8qKgotCSAqIAotCSAqLwotCVJlY3RJbXBsKCkgewotCQlzdXBlcihDU1NfUkVDVCk7Ci0JfQotCi0JUmVjdEltcGwoUmVjdEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlmVG9wID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZUb3ApOwotCQlhcHBlbmRDaGlsZChmVG9wKTsKLQotCQlmUmlnaHQgPSBuZXcgQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKHRoYXQuZlJpZ2h0KTsKLQkJYXBwZW5kQ2hpbGQoZlJpZ2h0KTsKLQotCQlmQm90dG9tID0gbmV3IENTU1ByaW1pdGl2ZVZhbHVlSW1wbCh0aGF0LmZCb3R0b20pOwotCQlhcHBlbmRDaGlsZChmQm90dG9tKTsKLQotCQlmTGVmdCA9IG5ldyBDU1NQcmltaXRpdmVWYWx1ZUltcGwodGhhdC5mTGVmdCk7Ci0JCWFwcGVuZENoaWxkKGZMZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgSUNTU05vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlSZWN0SW1wbCBjbG9uZWQgPSBuZXcgUmVjdEltcGwodGhpcyk7Ci0KLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgYm90dG9tIG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRCb3R0b20oKSB7Ci0JCXJldHVybiBmQm90dG9tOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGlzIHVzZWQgZm9yIHRoZSBsZWZ0IG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRMZWZ0KCkgewotCQlyZXR1cm4gZkxlZnQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuUmVjdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlwdWJsaWMgUmVjdCBnZXRSZWN0VmFsdWUoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdXNlZCBmb3IgdGhlIHJpZ2h0IG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRSaWdodCgpIHsKLQkJcmV0dXJuIGZSaWdodDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGF0dHJpYnV0ZSBpcyB1c2VkIGZvciB0aGUgdG9wIG9mIHRoZSByZWN0LgotCSAqLwotCXB1YmxpYyBDU1NQcmltaXRpdmVWYWx1ZSBnZXRUb3AoKSB7Ci0JCXJldHVybiBmVG9wOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRQcmltaXRpdmVzKCkgewotCi0JCWZUb3AgPSAoQ1NTUHJpbWl0aXZlVmFsdWVJbXBsKSBnZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQ1NTUHJpbWl0aXZlVmFsdWUoQ1NTX05VTUJFUik7Ci0JCWFwcGVuZENoaWxkKGZUb3ApOwotCi0JCWZSaWdodCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZlJpZ2h0KTsKLQotCQlmQm90dG9tID0gKENTU1ByaW1pdGl2ZVZhbHVlSW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpLmNyZWF0ZUNTU1ByaW1pdGl2ZVZhbHVlKENTU19OVU1CRVIpOwotCQlhcHBlbmRDaGlsZChmQm90dG9tKTsKLQotCQlmTGVmdCA9IChDU1NQcmltaXRpdmVWYWx1ZUltcGwpIGdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShDU1NfTlVNQkVSKTsKLQkJYXBwZW5kQ2hpbGQoZkxlZnQpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0eWxlU2hlZXRMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHlsZVNoZWV0TGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhMWJmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0eWxlU2hlZXRMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiAKLSAqLwotY2xhc3MgU3R5bGVTaGVldExpc3RJbXBsIGV4dGVuZHMgQWJzdHJhY3RDU1NOb2RlTGlzdCBpbXBsZW1lbnRzIFN0eWxlU2hlZXRMaXN0IHsKLQotCS8qKgotCSAqIFN0eWxlU2hlZXRMaXN0SW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCVN0eWxlU2hlZXRMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJldHJpZXZlIGEgc3R5bGUgc2hlZXQgYnkgb3JkaW5hbCBpbmRleC4gSWYgaW5kZXggaXMgZ3JlYXRlcgotCSAqIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBzdHlsZSBzaGVldHMgaW4gdGhlIGxpc3QsIHRoaXMgcmV0dXJucwotCSAqIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBpbmRleEluZGV4Ci0JICogICAgICAgICAgICBpbnRvIHRoZSBjb2xsZWN0aW9uCi0JICogQHJldHVybiBUaGUgc3R5bGUgc2hlZXQgYXQgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBwb3NpdGlvbiBpbiB0aGUKLQkgKiAgICAgICAgIDxjb2RlPlN0eWxlU2hlZXRMaXN0PC9jb2RlPiwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhhdAotCSAqICAgICAgICAgaXMgbm90IGEgdmFsaWQgaW5kZXguCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgaXRlbShpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIChTdHlsZVNoZWV0KSBpdGVtSW1wbChpbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAzZjc5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ1NTUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIENTU1Jlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nTmFtZShJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIGRvY3VtZW50IGlzIGVtcHR5LCB0aGVuIHRoZXJlIHdpbGwgYmUgbm8gbm9kZXMsCi0JCS8vIHNvIG5vIG5lZWQgdG8gY29udGludWUuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbnVsbDsKLQkJCS8vIHNraXAgYW55IGluaXRpYWwgd2hpdGVzcGFjZQotCQkJLy8gTm90ZSB0aGF0IEBjaGFyc2V0ICJlbmNvZGluZ25hbWUiOwotCQkJLy8gbXVzdCBhcHBlYXIgYXQgdmVyeSBiZWdpbm5pbmcgb2YgZG9jdW1lbnQsCi0JCQkvLyB0byBiZSB2YWxpZC4KLQkJCS8vIE1heSBoYXZlIHRvIHRlc3Qgd2l0aCAiZGFtYWdlZCIgZmlsZXMgKGUuZy4KLQkJCS8vIGJlZ2lubmluZyBFT0xzLCBldGMuLCB0byB2ZXJpZnkgdGhpcyB3b3JrcwotCQkJLy8gYXMgZXhwZWN0ZWQuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlub2RlID0gbm9kZXMuaXRlbShpKTsKLQkJCQlpZiAoZ2V0VHlwZShub2RlKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlJdGVyYXRvciByZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5leHRSZWdpb25PZlR5cGUoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQsIHJlZ2lvbnMpOwotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcsIHJlZ2lvbnMpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIGlmIGRpZG4ndCBmaW5kIHRoZSByZWdpb24sIGl0cyBwcm9iYWJseSBkdWUgdG8gaWxsCi0JCQkJCS8vIGZvcm1lZCBpbnB1dCwgc3VjaCBhcwotCQkJCQkvLyBAY2hhcnNldCAiSVNPLTg4NTktNjsKLQkJCQkJLy8gc28gd2UnbGwgdHJ5IGFnYWluIGZvciAidW5rbm93biIgcmVnaW9uLgotCQkJCQkvLyBJZiB0aGF0IGZhaWxzLCB3ZSdsbCBnaXZlIHVwPwotCQkJCQlyZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCkuaXRlcmF0b3IoKTsKLQkJCQkJcmVnaW9uID0gZ2V0TmV4dFJlZ2lvbk9mVHlwZShDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgcmVnaW9ucyk7Ci0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJdmFsdWVSZWdpb24gPSBnZXROZXh0UmVnaW9uT2ZUeXBlKENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTktOT1dOLCByZWdpb25zKTsKLQkJCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJcmVzdWx0ID0gbm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmVzdWx0ID0gbm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmVzdWx0ID0gU3RyaW5nVXRpbHMuc3RyaXBOb25MZXR0ZXJEaWdpdHMocmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmdOYW1lKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJZW5jID0gZ2V0RW5jb2RpbmdOYW1lKChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPIEltcG9ydGFudDogbmVlZCB0byBpbXBsZW1lbnQgc29tZSAicmF3IiBwYXJzZXIgZm9yCi0JCQkvLyBJRG9jdW1lbnQgbGV2ZWwKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBub2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCB8fCByZWdpb25zLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlTdHJpbmcgcmVzdWx0ID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb25PZlR5cGUoU3RyaW5nIHR5cGUsIEl0ZXJhdG9yIHJlZ2lvbnMpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCXdoaWxlIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IHR5cGUpIHsKLQkJCQlyZXN1bHQgPSByZWdpb247Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9DU1NEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTQxMmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ1NTRG9jdW1lbnRMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ0d1ZXNzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NTb3VyY2VQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQuQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTRG9jdW1lbnRMb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX0lEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQlwcml2YXRlIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0KLQotCXB1YmxpYyBDU1NEb2N1bWVudExvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVuY29kaW5nTmFtZUJ5R3Vlc3MoYnl0ZVtdIHN0cmluZywgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgaWFuYUVuYyA9IG51bGw7Ci0JCWlhbmFFbmMgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhzdHJpbmcsIGxlbmd0aCk7Ci0JCXJldHVybiBpYW5hRW5jOwotCX0KLQotCS8qKgotCSAqIERlZmF1bHQgZW5jb2RpbmcuIEZvciBDU1MgdGhlcmUgaXMgbm8gc3BlYydkIGRlZmF1bHQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKSB7Ci0JCS8vIERNVzogSSBjb3BpZWQgdGhpcyBmcm9tIENTU01vZGVsSW1wbGUgLi4uCi0JCS8vIGJ1dCBhbSBub3Qgc3VyZSBpdHMgcmlnaHQKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgcmVQYXJzZXIgPSBuZXcgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKTsKLQkJcmVQYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuc2V0UmVQYXJzZXIocmVQYXJzZXIpOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQkvLyByZXR1cm4gbmV3IENTU1JlZ2lvblBhcnNlcigpOwotCQlyZXR1cm4gbmV3IENTU1NvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDU1NfSUQpOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID09IG51bGwpIHsKLQkJCWRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3I7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU0RvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudC9JQ1NTU3R5bGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDRlOTRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnQvSUNTU1N0eWxlTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2NTVhZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50L0lDU1NTdHlsZU5vdGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVOb3RpZmllciBleHRlbmRzIElDU1NTdHlsZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgYWRkU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlMaXN0IGdldFN0eWxlTGlzdGVuZXJzKCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGlzUmVjb3JkaW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHJlbW92ZVN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU0VtYmVkZWRTdHlsZU5vdGlmeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiYzI3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudGltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NFbWJlZGVkU3R5bGVOb3RpZnlBZGFwdGVyIGV4dGVuZHMgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIHsKLQotCS8qKgotCSAqIENTU0VtYmVkZGVkU3R5bGVOb3RpZnlBZGFwdGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgQ1NTRW1iZWRlZFN0eWxlTm90aWZ5QWRhcHRlcihJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIobW9kZWwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgbW9kZWwuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm9kZS5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTGlzdGVuZXIpIHsKLQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlQ2hhbmdlZChzcmNNb2RlbCwgcmVtb3ZlZCwgYWRkZWQsIG1lZGlhKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBtb2RlbC5nZXRPd25lckRPTU5vZGUoKTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVMaXN0ZW5lcikgewotCQkJKChJQ1NTU3R5bGVMaXN0ZW5lcikgYWRhcHRlcikuc3R5bGVVcGRhdGUoc3JjTW9kZWwpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlRXZlbnREZWxpdmVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDMyYjlkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2V2ZW50aW1wbC9DU1NTdHlsZUV2ZW50RGVsaXZlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3R5bGVFdmVudERlbGl2ZXJlciB7Ci0KLQlwcml2YXRlIFZlY3RvciBmVmlzaXRlZCA9IG5ldyBWZWN0b3IoKTsKLQlwcml2YXRlIElDU1NNb2RlbCBmU3JjTW9kZWw7Ci0JcHJpdmF0ZSBJQ1NTU2VsZWN0b3JbXSBmUmVtb3ZlZDsKLQlwcml2YXRlIElDU1NTZWxlY3RvcltdIGZBZGRlZDsKLQlwcml2YXRlIFN0cmluZyBmTWVkaWE7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlKElDU1NNb2RlbCBzcmNNb2RlbCwgSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgSUNTU1NlbGVjdG9yW10gYWRkZWQsIFN0cmluZyBtZWRpYSkgewotCQlpZiAoc3JjTW9kZWwgPT0gbnVsbCB8fCBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQkJdGhpcy5mUmVtb3ZlZCA9IHJlbW92ZWQ7Ci0JCXRoaXMuZkFkZGVkID0gYWRkZWQ7Ci0JCXRoaXMuZk1lZGlhID0gbWVkaWE7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQlmVmlzaXRlZC5hZGQoc3JjTW9kZWwpOwotCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCXZpc2l0KChJQ1NTU3R5bGVMaXN0ZW5lcikgbGlzdGVuZXJzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGZpcmVUbyhJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciwgSUNTU01vZGVsIHNyY01vZGVsLCBJQ1NTU2VsZWN0b3JbXSByZW1vdmVkLCBJQ1NTU2VsZWN0b3JbXSBhZGRlZCwgU3RyaW5nIG1lZGlhKSB7Ci0JCXRoaXMuZlNyY01vZGVsID0gc3JjTW9kZWw7Ci0JCXRoaXMuZlJlbW92ZWQgPSByZW1vdmVkOwotCQl0aGlzLmZBZGRlZCA9IGFkZGVkOwotCQl0aGlzLmZNZWRpYSA9IG1lZGlhOwotCi0JCS8vIHByb2hpYml0IGRlbGl2ZXJpbmcgdG8gc3JjTW9kZWwKLQkJZlZpc2l0ZWQuY2xlYXIoKTsKLQkJLy8gdmlzaXRlZC5hZGQoc3JjTW9kZWwpOyA6IGJlY2F1c2UgbG9vcGluZyBwcm9ibGVtCi0JCXZpc2l0KGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlVXBkYXRlKElDU1NNb2RlbCBzcmNNb2RlbCkgewotCQlpZiAoc3JjTW9kZWwgPT0gbnVsbCB8fCBzcmNNb2RlbC5nZXRTdHlsZUxpc3RlbmVycygpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5mU3JjTW9kZWwgPSBzcmNNb2RlbDsKLQotCQkvLyBwcm9oaWJpdCBkZWxpdmVyaW5nIHRvIHNyY01vZGVsCi0JCWZWaXNpdGVkLmNsZWFyKCk7Ci0JCWZWaXNpdGVkLmFkZChzcmNNb2RlbCk7Ci0JCU9iamVjdFtdIGxpc3RlbmVycyA9IHNyY01vZGVsLmdldFN0eWxlTGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJdmlzaXRVcGRhdGUoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVVwZGF0ZVRvKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyLCBJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJaWYgKHNyY01vZGVsID09IG51bGwgfHwgc3JjTW9kZWwuZ2V0U3R5bGVMaXN0ZW5lcnMoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRoaXMuZlNyY01vZGVsID0gc3JjTW9kZWw7Ci0KLQkJLy8gcHJvaGliaXQgZGVsaXZlcmluZyB0byBzcmNNb2RlbAotCQlmVmlzaXRlZC5jbGVhcigpOwotCQkvLyB2aXNpdGVkLmFkZChzcmNNb2RlbCk7Ci0JCXZpc2l0VXBkYXRlKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdChJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCB8fCBmVmlzaXRlZC5jb250YWlucyhsaXN0ZW5lcikpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZmlyZSBldmVudCB0byBsaXN0ZW5lcgotCQlsaXN0ZW5lci5zdHlsZUNoYW5nZWQoZlNyY01vZGVsLCBmUmVtb3ZlZCwgZkFkZGVkLCBmTWVkaWEpOwotCQlmVmlzaXRlZC5hZGQobGlzdGVuZXIpOwotCi0JCS8vIHRyYXZlcnNlIG5vdGlmaWVyCi0JCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIElDU1NTdHlsZU5vdGlmaWVyKSB7Ci0JCQlJQ1NTU3R5bGVOb3RpZmllciBub3RpZmllciA9IChJQ1NTU3R5bGVOb3RpZmllcikgbGlzdGVuZXI7Ci0JCQlpZiAobm90aWZpZXIuZ2V0U3R5bGVMaXN0ZW5lcnMoKSAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gbm90aWZpZXIuZ2V0U3R5bGVMaXN0ZW5lcnMoKS50b0FycmF5KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJdmlzaXQoKElDU1NTdHlsZUxpc3RlbmVyKSBsaXN0ZW5lcnNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0VXBkYXRlKElDU1NTdHlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChsaXN0ZW5lciA9PSBudWxsIHx8IGZWaXNpdGVkLmNvbnRhaW5zKGxpc3RlbmVyKSkKLQkJCXJldHVybjsKLQotCQkvLyBmaXJlIGV2ZW50IHRvIGxpc3RlbmVyCi0JCWxpc3RlbmVyLnN0eWxlVXBkYXRlKGZTcmNNb2RlbCk7Ci0JCWZWaXNpdGVkLmFkZChsaXN0ZW5lcik7Ci0KLQkJLy8gdHJhdmVyc2Ugbm90aWZpZXIKLQkJaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgSUNTU1N0eWxlTm90aWZpZXIpIHsKLQkJCUlDU1NTdHlsZU5vdGlmaWVyIG5vdGlmaWVyID0gKElDU1NTdHlsZU5vdGlmaWVyKSBsaXN0ZW5lcjsKLQkJCWlmIChub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpICE9IG51bGwpIHsKLQkJCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBub3RpZmllci5nZXRTdHlsZUxpc3RlbmVycygpLnRvQXJyYXkoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQl2aXNpdFVwZGF0ZSgoSUNTU1N0eWxlTGlzdGVuZXIpIGxpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZXZlbnRpbXBsL0NTU1N0eWxlTm90aWZ5QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YzRlNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9ldmVudGltcGwvQ1NTU3R5bGVOb3RpZnlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnRpbXBsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5ldmVudC5JQ1NTU3R5bGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkltcG9ydGVkQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlNlbGVjdG9yc0NvbGxlY3RvcjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTU3R5bGVOb3RpZnlBZGFwdGVyIGltcGxlbWVudHMgSUNTU1N0eWxlTm90aWZpZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgbGlzdGVuZXJzOwotCXByb3RlY3RlZCBmaW5hbCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBib29sZWFuIHJlY29yZGluZyA9IGZhbHNlOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENTU1N0eWxlTm90aWZ5QWRhcHRlcihJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFN0eWxlTGlzdGVuZXIoSUNTU1N0eWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKGxpc3RlbmVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGxpc3RlbmVycyA9PSBudWxsKQotCQkJbGlzdGVuZXJzID0gbmV3IFZlY3RvcigpOwotCQlpZiAoIWxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpIHsKLQotCQkJLy8gc2VuZCBuZXcgc2VsZWN0b3JzIGV2ZW50IHRvIGxpc3RlbmVyCi0JCQlJbXBvcnRlZENvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydGVkQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LmFwcGx5KG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJSXRlcmF0b3IgaXQgPSB0cmF2LmdldEV4dGVybmFscygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSUNTU1N0eWxlU2hlZXQgc2hlZXQgPSAoSUNTU1N0eWxlU2hlZXQpIGl0Lm5leHQoKTsKLQkJCQkvLyBjb2xsZWN0IHNlbGVjdG9ycwotCQkJCVNlbGVjdG9yc0NvbGxlY3RvciBzZWxUcmF2ID0gbmV3IFNlbGVjdG9yc0NvbGxlY3RvcigpOwotCQkJCXNlbFRyYXYuYXBwbHkoc2hlZXQpOwotCQkJCWludCBuU2VsID0gc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5zaXplKCk7Ci0JCQkJSUNTU1NlbGVjdG9yW10gYWRkZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlhZGRlZFtpXSA9IChJQ1NTU2VsZWN0b3IpIHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuZ2V0KGkpOwotCi0JCQkJLy8gZmlyZSBldmVudAotCQkJCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXZlcmVyID0gbmV3IENTU1N0eWxlRXZlbnREZWxpdmVyZXIoKTsKLQkJCQlkZWxpdmVyZXIuZmlyZVRvKGxpc3RlbmVyLCBzaGVldC5nZXRNb2RlbCgpLCBudWxsLCBhZGRlZCwgbnVsbC8qCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIG1lZGlhCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHdpbGwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogYmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW1wbGVtZW50ZWQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogaW4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJICogdGhlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGZ1dHVyZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKi8pOwotCQkJfQotCi0JCQkvLyBhZGQgbGlzdGVuZXIKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoKSB7Ci0JCXJlY29yZGluZyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKCkgewotCQlyZWNvcmRpbmcgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaXJlKElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJLy8gc2VuZCBzZWxlY3RvciBjaGFuZ2VkIGV2ZW50Ci0JCUNTU1N0eWxlRXZlbnREZWxpdmVyZXIgZGVsaXYgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQlkZWxpdi5maXJlKG1vZGVsLCByZW1vdmVkLCBhZGRlZCwgbnVsbCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0U3R5bGVMaXN0ZW5lcnMoKSB7Ci0JCXJldHVybiBsaXN0ZW5lcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWNvcmRpbmcoKSB7Ci0JCXJldHVybiByZWNvcmRpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlU3R5bGVMaXN0ZW5lcihJQ1NTU3R5bGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAobGlzdGVuZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAobGlzdGVuZXJzLmNvbnRhaW5zKGxpc3RlbmVyKSkgewotCQkJbGlzdGVuZXJzLnJlbW92ZShsaXN0ZW5lcik7Ci0KLQkJCS8vIHNlbmQgb2xkIHNlbGVjdG9ycyBldmVudCB0byBsaXN0ZW5lcgotCQkJSW1wb3J0ZWRDb2xsZWN0b3IgdHJhdiA9IG5ldyBJbXBvcnRlZENvbGxlY3RvcigpOwotCQkJdHJhdi5hcHBseShtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdHJhdi5nZXRFeHRlcm5hbHMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSBpdC5uZXh0KCk7Ci0JCQkJLy8gY29sbGVjdCBzZWxlY3RvcnMKLQkJCQlTZWxlY3RvcnNDb2xsZWN0b3Igc2VsVHJhdiA9IG5ldyBTZWxlY3RvcnNDb2xsZWN0b3IoKTsKLQkJCQlzZWxUcmF2LmFwcGx5KHNoZWV0KTsKLQkJCQlpbnQgblNlbCA9IHNlbFRyYXYuZ2V0U2VsZWN0b3JzKCkuc2l6ZSgpOwotCQkJCUlDU1NTZWxlY3RvcltdIHJlbW92ZWQgPSBuZXcgSUNTU1NlbGVjdG9yW25TZWxdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgblNlbDsgaSsrKQotCQkJCQlyZW1vdmVkW2ldID0gKElDU1NTZWxlY3Rvcikgc2VsVHJhdi5nZXRTZWxlY3RvcnMoKS5nZXQoaSk7Ci0KLQkJCQkvLyBmaXJlIGV2ZW50Ci0JCQkJQ1NTU3R5bGVFdmVudERlbGl2ZXJlciBkZWxpdmVyZXIgPSBuZXcgQ1NTU3R5bGVFdmVudERlbGl2ZXJlcigpOwotCQkJCWRlbGl2ZXJlci5maXJlVG8obGlzdGVuZXIsIHNoZWV0LmdldE1vZGVsKCksIHJlbW92ZWQsIG51bGwsIG51bGwvKgotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBtZWRpYQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiB3aWxsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGJlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGltcGxlbWVudGVkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIGluCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAqIHRoZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkgKiBmdXR1cmUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJICovKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsIHNyY01vZGVsLCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yW10gcmVtb3ZlZCwgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcltdIGFkZGVkLCBqYXZhLmxhbmcuU3RyaW5nIG1lZGlhKSB7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc3R5bGVVcGRhdGUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbCBzcmNNb2RlbCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdC9DU1NTb3VyY2VGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2ZlNjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU291cmNlRm9ybWF0dGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nQnVmZmVyCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uCi0JICovCi0JU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Zvcm1hdFByb2Nlc3NvckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZjg2NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlci5DU1NGb3JtYXRVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXIuQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRm9ybWF0UHJvY2Vzc29yQ1NTIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCkgewotCQlyZXR1cm4gImNzcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgc3RhcnQgPSAwOwotCQlpbnQgbGVuZ3RoID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCi0JCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlDU1NGb3JtYXRVdGlsIGZvcm1hdFV0aWwgPSBDU1NGb3JtYXRVdGlsLmdldEluc3RhbmNlKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCS8vQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQlpZiAoc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNClzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQl9Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCkgPyBudWxsIDoKLQkJCQlkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQkJCQotCQkJSUNTU0RvY3VtZW50IGRvYyA9ICgoSUNTU01vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgZG9jKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBmb3JtYXR0ZXIuZm9ybWF0KGRvYyk7Ci0JCQlpZiAoYnVmICE9IG51bGwpIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGRvYykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBkb2MpLmdldEVuZE9mZnNldCgpOwotCQkJCWZvcm1hdFV0aWwucmVwbGFjZVNvdXJjZShkb2MuZ2V0TW9kZWwoKSwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCBidWYudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCQkKLQkJCS8vQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlMaXN0IGNzc25vZGVzID0gZm9ybWF0VXRpbC5jb2xsZWN0Q1NTTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQkJCWlmIChjc3Nub2RlcyAhPSBudWxsICYmICFjc3Nub2Rlcy5pc0VtcHR5KCkpIHsKLQkJCQlJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCQotCQkJCS8vQlVHMTAyODIyIHRha2UgYWR2YW50YWdlIG9mIElEb2N1bWVudEV4dGVuc2lvbjQKLQkJCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNClzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsKSA/IG51bGwgOgotCQkJCQlkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQkJCQkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNzc25vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIGNzc25vZGVzLmdldChpKTsKLQkJCQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIG5vZGUpOwotCQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gZm9ybWF0dGVyLmZvcm1hdChub2RlKTsKLQkJCQkJaWYgKGJ1ZiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JCQkJCQkJbW9kZWwgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQkJCQkJfQotCQkJCQkJZm9ybWF0VXRpbC5yZXBsYWNlU291cmNlKG1vZGVsLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIGJ1Zi50b1N0cmluZygpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkKLQkJCQkvL0JVRzEwMjgyMiB0YWtlIGFkdmFudGFnZSBvZiBJRG9jdW1lbnRFeHRlbnNpb240Ci0JCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBnZXRGb3JtYXRQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCkgewotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlODQyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgaW1wbGVtZW50cyBDU1NTb3VyY2VHZW5lcmF0b3IgewotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBzaG9ydCBHRU5FUkFURSA9IDA7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBzaG9ydCBGT1JNQVQgPSAxOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgc2hvcnQgQ0xFQU5VUCA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBzaG9ydCBzdHJhdGVneTsKLQotCS8qKgotCSAqIAotCSAqLwotCUFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZERlbGltQmVmb3JlKElDU1NOb2RlIG5vZGUsIENvbXBvdW5kUmVnaW9uIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0NsZWFudXAoKSAmJiAhZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpCi0JCQlyZXR1cm47IC8vIGZvciBub3QgZm9ybWF0dGluZyBjYXNlIG9uIGNsZWFudXAgYWN0aW9uCi0JCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0KLQkJYm9vbGVhbiBuZWVkSW5kZW50ID0gIShub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpOwotCQlpZiAodG9BcHBlbmQgPT0gbnVsbCkgewotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlpZiAobmVlZEluZGVudCkKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyB0eXBlID0gdG9BcHBlbmQuZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcih0b0FwcGVuZC5nZXREb2N1bWVudFJlZ2lvbigpLCB0b0FwcGVuZC5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCWl0LnByZXYoKTsKLQkJCQlJVGV4dFJlZ2lvbiBwcmV2ID0gaXQucHJldigpOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChwcmV2KSwgMClbMF0gPj0gMCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLmdldFRleHQoKSwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcHBlbmQuZ2V0RG9jdW1lbnRSZWdpb24oKSwgdG9BcHBlbmQuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCQlpdC5wcmV2KCk7Ci0JCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQotCQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBUZXh0VXRpbGl0aWVzLmluZGV4T2YoRGVmYXVsdExpbmVUcmFja2VyLkRFTElNSVRFUlMsIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocHJldiksIDApWzBdID49IDApIHsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJCQlpbnQgYXBwZW5kID0gMTsKLQkJCQkJaWYgKGxlbmd0aCArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFwcGVuZFNwYWNlQmVmb3JlKElDU1NOb2RlIG5vZGUsIENvbXBvdW5kUmVnaW9uIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgdG9BcHBlbmQgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2xlYW51cCgpICYmICFnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybjsgLy8gZm9yIG5vdCBmb3JtYXR0aW5nIGNhc2Ugb24gY2xlYW51cCBhY3Rpb24KLQkJU3RyaW5nIHR5cGUgPSB0b0FwcGVuZC5nZXRUeXBlKCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCWJvb2xlYW4gbmVlZEluZGVudCA9ICEobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCS8vIGNoZWNrIHdoZXRoZXIgcHJldmlvdXMgcmVnaW9uIGlzICdTJyBhbmQgaGFzIENSLUxGCi0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IodG9BcHBlbmQuZ2V0RG9jdW1lbnRSZWdpb24oKSwgdG9BcHBlbmQuZ2V0VGV4dFJlZ2lvbigpKTsKLQkJCWl0LnByZXYoKTsKLQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgVGV4dFV0aWxpdGllcy5pbmRleE9mKERlZmF1bHRMaW5lVHJhY2tlci5ERUxJTUlURVJTLCBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHByZXYpLCAwKVswXSA+PSAwKSB7Ci0JCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLmdldFRleHQoKSwgc291cmNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX05FV0xJTkVfT05fT1BFTl9CUkFDRSkpIHsKLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCS8vIH0gZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ1VSTFlfQlJBQ0VfQ0xPU0UpIHsKLQkJCS8vIH0gZWxzZSBpZiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU5DTFVERVMgfHwgdHlwZSA9PQotCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RBU0hNQVRDSCkgewotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiAmJiBub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCWludCBuID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNKTsKLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSA+IDAgJiYgKCFwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSB8fCBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkpIHsKLQkJCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCQlpbnQgYXBwZW5kID0gMTsKLQkJCQlpZiAobGVuZ3RoICsgbiArIGFwcGVuZCA+IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQkJaWYgKG5lZWRJbmRlbnQpCi0JCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQkJbiA9IDA7IC8vIG5vIHNwYWNlIGlzIG5lY2Vzc2FyeQotCQkJCX0KLQkJCX0KLQkJCS8vIG5vIGRlbGltaXRlciBjYXNlCi0JCQl3aGlsZSAobi0tID4gMCkKLQkJCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCWlmIChsZW5ndGggKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQkJCWlmIChuZWVkSW5kZW50KQotCQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT1JFSUdOX0VMRU1FTlQgPT0gdHlwZSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLmdldFRleHQoKSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTcGFjZUJlZm9yZShJQ1NTTm9kZSBub2RlLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGlzQ2xlYW51cCgpICYmICFnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSkuaXNGb3JtYXRTb3VyY2UoKSkKLQkJCXJldHVybjsgLy8gZm9yIG5vdCBmb3JtYXR0aW5nIGNhc2Ugb24gY2xlYW51cCBhY3Rpb24KLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmICh0b0FwcGVuZCAhPSBudWxsICYmIHRvQXBwZW5kLnN0YXJ0c1dpdGgoInsiKSAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFKSkgey8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSBpZiAoLyogISBtZ3IuaXNPbmVQcm9wZXJ0eVBlckxpbmUoKSAmJiAqL3ByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJaW50IG4gPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJaW50IGFwcGVuZCA9ICh0b0FwcGVuZCAhPSBudWxsKSA/IFRleHRVdGlsaXRpZXMuaW5kZXhPZihEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUywgdG9BcHBlbmQsIDApWzBdIDogMDsKLQkJCWlmICh0b0FwcGVuZCAhPSBudWxsKQotCQkJCWFwcGVuZCA9IChhcHBlbmQgPCAwKSA/IHRvQXBwZW5kLmxlbmd0aCgpIDogYXBwZW5kOwotCQkJaWYgKG4gKyBhcHBlbmQgKyAxID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldExpbmVEZWxpbWl0ZXIobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50KG5vZGUpKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJc291cmNlLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGNsZWFudXAoSUNTU05vZGUgbm9kZSkgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IENMRUFOVVA7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBmb3JtYXRQcm9jKG5vZGUpOwotCQlzdHJhdGVneSA9IG9sZFN0cmF0ZWd5OwotCi0JCXJldHVybiBzb3VyY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKSB7Ci0JCXNob3J0IG9sZFN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0JCXN0cmF0ZWd5ID0gQ0xFQU5VUDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSwgcmVnaW9uKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkSWRlbnRSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVN0cmluZyB0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkpCi0JCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMCwgc3RneSk7Ci0KLQkJaWYgKGlzQ2xlYW51cCgpKSB7Ci0JCQlpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCXJldHVybiB0ZXh0OwotCQkJZWxzZSBpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJcmV0dXJuIHRleHQudG9VcHBlckNhc2UoKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQl9Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCXJldHVybiB0ZXh0OwotCQllbHNlIGlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkUHJvcE5hbWVSZWdpb24oQ29tcG91bmRSZWdpb24gcmVnaW9uLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVN0cmluZyB0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkpCi0JCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMSwgc3RneSk7Ci0JCWlmIChpc0NsZWFudXAoKSkgewotCQkJaWYgKHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMgfHwgcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkpCi0JCQkJcmV0dXJuIHRleHQ7Ci0JCQllbHNlIGlmIChzdGd5LmdldFByb3BOYW1lQ2FzZSgpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUikKLQkJCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJZWxzZQotCQkJCXJldHVybiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSkKLQkJCXJldHVybiB0ZXh0OwotCQllbHNlIGlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQllbHNlCi0JCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKENvbXBvdW5kUmVnaW9uIHJlZ2lvbiwgQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kpIHsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gcmVnaW9uLmdldFRleHQoKTsKLQotCQlTdHJpbmcgdGV4dCA9IHJlZ2lvbi5nZXRUZXh0KCk7Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkkpCi0JCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMiwgc3RneSk7Ci0JCWlmIChpc0NsZWFudXAoKSkgewotCQkJaWYgKHN0Z3kuZ2V0UHJvcFZhbHVlQ2FzZSgpICE9IENTU0NsZWFudXBTdHJhdGVneS5BU0lTKSB7Ci0JCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJCQl0ZXh0ID0gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJCQllbHNlCi0JCQkJCQl0ZXh0ID0gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlY29yYXRlZFJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIGludCB0eXBlLCBDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSkgewotCQlpZiAoaXNGb3JtYXQoKSkKLQkJCXJldHVybiByZWdpb24uZ2V0VGV4dCgpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIHRleHQgPSByZWdpb24uZ2V0VGV4dCgpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVVJJKSB7Ci0JCQlTdHJpbmcgdXJpID0gQ1NTTGlua0NvbnZlcnRlci5zdHJpcEZ1bmModGV4dCk7Ci0KLQkJCWJvb2xlYW4gcHJlZklzVXBwZXIgPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCQlib29sZWFuIHVwcGVyID0gKHR5cGUgPT0gMCkgPyBwcmVmSXNVcHBlciA6ICgodHlwZSA9PSAxKSA/IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQkJU3RyaW5nIGZ1bmMgPSB0ZXh0LnN1YnN0cmluZygwLCA0KTsKLQkJCWlmIChpc0NsZWFudXAoKSkgewotCQkJCXVwcGVyID0gKCh0eXBlID09IDApID8gc3RneS5nZXRJZGVudENhc2UoKSA6ICgodHlwZSA9PSAxKSA/IHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgOiBzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSkpID09IENTU0NsZWFudXBTdHJhdGVneS5VUFBFUjsKLQkJCQlmdW5jID0gKCh0eXBlID09IDApID8gc3RneS5nZXRJZGVudENhc2UoKSA6ICgodHlwZSA9PSAxKSA/IHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgOiBzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSkpID09IENTU0NsZWFudXBTdHJhdGVneS5BU0lTID8gdGV4dC5zdWJzdHJpbmcoMCwgNCkgOiAodXBwZXIgPyAiVVJMKCIgOiAidXJsKCIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoKCFpc0NsZWFudXAoKSAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSkpIHx8IChpc0NsZWFudXAoKSAmJiBzdGd5LmlzUXVvdGVWYWx1ZXMoKSkpIHsKLQkJCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZSh1cmksIHF1b3RlKTsKLQkJCQl0ZXh0ID0gZnVuYyArIHF1b3RlICsgdXJpICsgcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSBpZiAoaXNDbGVhbnVwKCkgJiYgIXN0Z3kuaXNRdW90ZVZhbHVlcygpKSB7Ci0JCQkJdGV4dCA9IGZ1bmMgKyBDU1NMaW5rQ29udmVydGVyLnJlbW92ZUZ1bmModGV4dCkgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGV4dCA9IGZ1bmMgKyB1cmkgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORyAmJiAoIWlzQ2xlYW51cCgpIHx8IHN0Z3kuaXNRdW90ZVZhbHVlcygpKSkgewotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCS8vIGJlZ2dpbm5pbmcKLQkJCWlmICghdGV4dC5zdGFydHNXaXRoKHF1b3RlKSkgewotCQkJCWlmICh0ZXh0LnN0YXJ0c1dpdGgoIlwiIikgfHwgdGV4dC5zdGFydHNXaXRoKCJcJyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdGV4dCA9IHF1b3RlICsgdGV4dC5zdWJzdHJpbmcoMSk7Ci0JCQkJZWxzZQotCQkJCQl0ZXh0ID0gcXVvdGUgKyB0ZXh0OwotCQkJfQotCQkJLy8gZW5kaW5nCi0JCQlpZiAoIXRleHQuZW5kc1dpdGgocXVvdGUpKSB7Ci0JCQkJaWYgKHRleHQuZW5kc1dpdGgoIlwiIikgfHwgdGV4dC5lbmRzV2l0aCgiXCciKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCB0ZXh0Lmxlbmd0aCgpIC0gMSkgKyBxdW90ZTsKLQkJCQllbHNlCi0JCQkJCXRleHQgPSB0ZXh0ICsgcXVvdGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSkgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IEZPUk1BVDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSk7Ci0JCXN0cmF0ZWd5ID0gb2xkU3RyYXRlZ3k7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlzaG9ydCBvbGRTdHJhdGVneSA9IHN0cmF0ZWd5OwotCQlzdHJhdGVneSA9IEZPUk1BVDsKLQkJU3RyaW5nQnVmZmVyIHNvdXJjZSA9IGZvcm1hdFByb2Mobm9kZSwgcmVnaW9uKTsKLQkJc3RyYXRlZ3kgPSBvbGRTdHJhdGVneTsKLQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmdCdWZmZXIgZm9ybWF0QXR0ckNoYW5nZWQoSUNTU05vZGUgbm9kZSwgSUNTU0F0dHIgYXR0ciwgYm9vbGVhbiBpbnNlcnQsIEF0dHJDaGFuZ2VDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdCdWZmZXIoaW5zZXJ0ICYmIChhdHRyICE9IG51bGwpID8gYXR0ci5nZXRWYWx1ZSgpIDogIiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGJldHdlZW4gY2hpbGRyZW4oJ2NoaWxkJyBhbmQgaXRzIHByZXZpb3VzCi0JICogc2libGluZykgYW5kIGFwcGVuZCB0byBzdHJpbmcgYnVmZmVyCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmV0d2VlbiBjaGlsZHJlbignY2hpbGQnIGFuZCBpdHMgcHJldmlvdXMKLQkgKiBzaWJsaW5nKSBhbmQgYXBwZW5kIHRvIHN0cmluZyBidWZmZXIKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShjaGlsZCA9PSBudWxsIHx8IGNoaWxkLmdldFBhcmVudE5vZGUoKSA9PSBub2RlKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCAvKiAoY2hpbGQgIT0gbnVsbCkgPyAoY2hpbGQuZ2V0Q3NzVGV4dCgpKSA6ICovIiIsIGJ1ZiwgZXhjZXB0Rm9yKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogR2VuZXJhdGUgb3IgZm9ybWF0IHNvdXJjZSBiZXR3ZWVuIGNoaWxkcmVuKCdjaGlsZCcgYW5kIGl0cyBwcmV2aW91cwotCSAqIHNpYmxpbmcpIGFuZCBhcHBlbmQgdG8gc3RyaW5nIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBmb3JtYXRDaGlsZHJlbihJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWJvb2xlYW4gZmlyc3QgPSB0cnVlOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJLy8gYXBwZW5kIGNoaWxkCi0JCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgKChJTm9kZU5vdGlmaWVyKSBjaGlsZCkuZ2V0QWRhcHRlckZvcihDU1NTb3VyY2VGb3JtYXR0ZXIuY2xhc3MpOwotCQkJaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7Ci0JCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgY2hpbGQpOwotCQkJfQotCQkJU3RyaW5nQnVmZmVyIGNoaWxkU291cmNlID0gKChBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlcikgZm9ybWF0dGVyKS5mb3JtYXRQcm9jKGNoaWxkKTsKLQkJCWlmICghZmlyc3QpIHsKLQkJCQlmb3JtYXRCZWZvcmUobm9kZSwgY2hpbGQsIG5ldyBTdHJpbmcoY2hpbGRTb3VyY2UpLCBzb3VyY2UsIG51bGwpOwotCQkJfQotCQkJc291cmNlLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCQkvLyBhcHBlbmQgYmV0d2VlbiBjaGlsZHJlbgotCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJZmlyc3QgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcm1hdENoaWxkcmVuKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJYm9vbGVhbiBmaXJzdCA9IHRydWU7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpbnQgY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlTdHJpbmdCdWZmZXIgY2hpbGRTb3VyY2UgPSBudWxsOwotCQkJYm9vbGVhbiB0b0ZpbmlzaCA9IGZhbHNlOwotCQkJaWYgKHN0YXJ0IDwgY3VyRW5kKSB7Ci0JCQkJaW50IGN1clN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpZiAoY3VyU3RhcnQgPCBlbmQpIHsKLQkJCQkJLy8gYXBwZW5kIGNoaWxkCi0JCQkJCUNTU1NvdXJjZUZvcm1hdHRlciBmb3JtYXR0ZXIgPSAoQ1NTU291cmNlRm9ybWF0dGVyKSAoKElOb2RlTm90aWZpZXIpIGNoaWxkKS5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCQkJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJCQkJZm9ybWF0dGVyID0gQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmdldFNvdXJjZUZvcm1hdHRlcigoSU5vZGVOb3RpZmllcikgY2hpbGQpOwotCQkJCQl9Ci0JCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQkJY2hpbGRTb3VyY2UgPSAoKEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyKSBmb3JtYXR0ZXIpLmZvcm1hdFByb2MoY2hpbGQpOwotCQkJCQllbHNlCi0JCQkJCQljaGlsZFNvdXJjZSA9ICgoQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIpIGZvcm1hdHRlcikuZm9ybWF0UHJvYyhjaGlsZCwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQl0b0ZpbmlzaCA9IHRydWU7Ci0JCQl9Ci0JCQkvLyBhcHBlbmQgYmV0d2VlbiBjaGlsZHJlbgotCQkJaWYgKCFmaXJzdCkgewotCQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7IC8vIGNoYW5nZQotCQkJCS8vIG9ubHkKLQkJCQkvLyBzdGFydAotCQkJCWlmIChzdGFydCA8IGN1ckVuZCkgewotCQkJCQlpbnQgY3VyU3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaWYgKGN1clN0YXJ0IDwgZW5kKSB7Ci0JCQkJCQlTdHJpbmcgdG9BcHBlbmQgPSAoY2hpbGRTb3VyY2UgIT0gbnVsbCkgPyBuZXcgU3RyaW5nKGNoaWxkU291cmNlKSA6ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQkJCWZvcm1hdEJlZm9yZShub2RlLCBjaGlsZCwgdG9BcHBlbmQsIHNvdXJjZSwgbnVsbCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZm9ybWF0QmVmb3JlKG5vZGUsIGNoaWxkLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNoaWxkU291cmNlICE9IG51bGwpIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGNoaWxkU291cmNlKTsKLQkJCX0KLQkJCWZpcnN0ID0gZmFsc2U7Ci0JCQlpZiAodG9GaW5pc2gpCi0JCQkJYnJlYWs7Ci0JCQljaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBvciBmb3JtYXQgc291cmNlIGFmdGVyIHRoZSBsYXN0IGNoaWxkIGFuZCBhcHBlbmQgdG8gc3RyaW5nCi0JICogYnVmZmVyCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYWZ0ZXIgdGhlIGxhc3QgY2hpbGQgYW5kIGFwcGVuZCB0byBzdHJpbmcKLQkgKiBidWZmZXIKLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmVmb3JlIHRoZSBmaXJzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIG9yIGZvcm1hdCBzb3VyY2UgYmVmb3JlIHRoZSBmaXJzdCBjaGlsZCBhbmQgYXBwZW5kIHRvIHN0cmluZwotCSAqIGJ1ZmZlcgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdCdWZmZXIKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nQnVmZmVyIGZvcm1hdFByb2MoSUNTU05vZGUgbm9kZSkgewotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgc291cmNlKTsKLQkJZm9ybWF0UG9zdChub2RlLCBzb3VyY2UpOwotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgZm9ybWF0UHJvYyhJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmdCdWZmZXIgc291cmNlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY3VyU3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBjdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRQcmUobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQkJY3VyU3RhcnQgPSBjdXJFbmQ7Ci0JCQljdXJFbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKG92ZXJsYXBzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpIHsKLQkJCQlpZiAoaW5jbHVkZXMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkKLQkJCQkJZm9ybWF0Q2hpbGRyZW4obm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdENoaWxkcmVuKG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJCWN1clN0YXJ0ID0gY3VyRW5kOwotCQkJY3VyRW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvdmVybGFwcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKSB7Ci0JCQkJaWYgKGluY2x1ZGVzKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCkpCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFBvc3Qobm9kZSwgb3ZlcmxhcHBlZFJlZ2lvbihyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJY3VyRW5kID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQcmUobm9kZSwgc291cmNlKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdFByZShub2RlLCBvdmVybGFwcGVkUmVnaW9uKHJlZ2lvbiwgY3VyU3RhcnQsIGN1ckVuZCksIHNvdXJjZSk7Ci0JCQl9Ci0JCQljdXJTdGFydCA9IGN1ckVuZDsKLQkJCWN1ckVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAob3ZlcmxhcHMocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSkgewotCQkJCWlmIChpbmNsdWRlcyhyZWdpb24sIGN1clN0YXJ0LCBjdXJFbmQpKQotCQkJCQlmb3JtYXRQb3N0KG5vZGUsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlmb3JtYXRQb3N0KG5vZGUsIG92ZXJsYXBwZWRSZWdpb24ocmVnaW9uLCBjdXJTdGFydCwgY3VyRW5kKSwgc291cmNlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqLwotCXByb3RlY3RlZCBDU1NDbGVhbnVwU3RyYXRlZ3kgZ2V0Q2xlYW51cFN0cmF0ZWd5KElDU1NOb2RlIG5vZGUpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IGN1cnJlbnRTdHJhdGVneSA9IENTU0NsZWFudXBTdHJhdGVneUltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJSUNTU0RvY3VtZW50IGRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gY3VycmVudFN0cmF0ZWd5OwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBkb2MuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gY3VycmVudFN0cmF0ZWd5OwotCQlpZiAobW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSAhPSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCS8vIFRPRE8gLSBUUkFOU0lUSU9OIE5ha2Ftb3JpLXNhbiwgb3IgS2l0LCBob3cgY2FuIHdlIG1vdmUgdG8KLQkJCS8vICJIVE1MIiBwbHVnaW4/Ci0JCQkvLyBjYW4gd2Ugc3ViY2xhc3M/Ci0JCQkvLyBjdXJyZW50U3RyYXRlZ3kgPSBDU1NJbkhUTUxDbGVhbnVwU3RyYXRlZ3lJbXBsLmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGN1cnJlbnRTdHJhdGVneTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEluZGVudChJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTQXR0cikKLQkJCXBhcmVudCA9ICgoSUNTU0F0dHIpIG5vZGUpLmdldE93bmVyQ1NTTm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gIiI7Ly8kTk9OLU5MUy0xJAotCQlpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uKQotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgcGFyZW50SW5kZW50ID0gZ2V0SW5kZW50KHBhcmVudCk7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZSkKLQkJCXJldHVybiBwYXJlbnRJbmRlbnQgKyBnZXRJbmRlbnRTdHJpbmcoKTsKLQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24pCi0JCQlyZXR1cm4gcGFyZW50SW5kZW50ICsgZ2V0SW5kZW50U3RyaW5nKCk7Ci0JCXJldHVybiBwYXJlbnRJbmRlbnQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRMYXN0TGluZUxlbmd0aChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJU3RyaW5nIHN0ciA9IG5ldyBTdHJpbmcoc291cmNlKTsKLQkJaW50IG4gPSBzdHIubGFzdEluZGV4T2YoZGVsaW0pOwotCQlpZiAobiA8IDApCi0JCQlyZXR1cm4gc3RyLmxlbmd0aCgpOwotCi0JCXJldHVybiBzdHIubGVuZ3RoKCkgLSBuIC0gZGVsaW0ubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDwgMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zKSkKLQkJCXJldHVybiAwOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlyZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQkvLyBpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSICYmCi0JCQkvLyByZWdpb24uZ2V0VHlwZSgpICE9Ci0JCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlpbnQgcG9zID0gKGZvdW5kID8gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA6IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgLSBpbnNlcnRQb3M7Ci0JCXJldHVybiAocG9zID49IDApID8gcG9zIDogMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5zZXJ0UG9zIC0gMSk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluc2VydFBvcyAtIDEpOwotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJcmVnaW9uID0gaXQucHJldigpOwotCQkJLy8gaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYKLQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiAmJgotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSAhPQotCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHBvcyA9IGluc2VydFBvcyAtIChmb3VuZCA/IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSA6IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpOwotCQkvLyBmbGF0Tm9kZSA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkvLyBpZiAoZm91bmQpIHsKLQkJLy8gaWYgKHJlZ2lvbi5nZXRMZW5ndGgoKSAhPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpKSB7Ci0JCS8vIHBvcyA9IGluc2VydFBvcyAtIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKTsKLQkJLy8gfSBlbHNlIHsKLQkJLy8gcG9zID0gaW5zZXJ0UG9zIC0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCS8vIH0KLQkJLy8gfSBlbHNlIHsKLQkJLy8gcG9zID0gaW5zZXJ0UG9zIC0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJLy8gfQotCQlyZXR1cm4gKHBvcyA+PSAwKSA/IHBvcyA6IDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSAobm9kZSAhPSBudWxsKSA/IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkgOiBudWxsOwotCQlyZXR1cm4gKG1vZGVsICE9IG51bGwpID8gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpIDogIlxuIjsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIFRPRE8gOiBjaGVjayB3aGV0aGVyIHRvIHVzZSBtb2RlbC5nZXRMaW5lRGVsaW1pdGVyKCkgb3IKLQkJLy8gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uW10gZ2V0T3V0c2lkZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudCBtb2RlbCwgSVJlZ2lvbiByZWcpIHsKLQkJQ29tcG91bmRSZWdpb25bXSByZXQgPSBuZXcgQ29tcG91bmRSZWdpb25bMl07Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKG1vZGVsLCByZWcuZ2V0T2Zmc2V0KCkpOwotCQlpdC5wcmV2KCk7Ci0JCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHRleHRSZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlyZXRbMF0gPSBuZXcgQ29tcG91bmRSZWdpb24oZG9jdW1lbnRSZWdpb24sIHRleHRSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0WzBdID0gbnVsbDsKLQkJfQotCQlpdC5yZXNldChtb2RlbCwgcmVnLmdldE9mZnNldCgpICsgcmVnLmdldExlbmd0aCgpKTsKLQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXJldFsxXSA9IG5ldyBDb21wb3VuZFJlZ2lvbihkb2N1bWVudFJlZ2lvbiwgdGV4dFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXRbMV0gPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENTU1NvdXJjZUdlbmVyYXRvciBnZXRQYXJlbnRGb3JtYXR0ZXIoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlDU1NTb3VyY2VHZW5lcmF0b3IgZm9ybWF0dGVyID0gKENTU1NvdXJjZUdlbmVyYXRvcikgKChJTm9kZU5vdGlmaWVyKSBwYXJlbnQpLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJCWlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewotCQkJCWZvcm1hdHRlciA9IENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5nZXRTb3VyY2VGb3JtYXR0ZXIoKElOb2RlTm90aWZpZXIpIHBhcmVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZm9ybWF0dGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbltdIGdldFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudCBtb2RlbCwgSVJlZ2lvbiByZWcsIElSZWdpb24gZXhjZXB0Rm9yLCBTdHJpbmcgcGlja3VwVHlwZSkgewotCQlpbnQgc3RhcnQgPSByZWcuZ2V0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSByZWcuZ2V0T2Zmc2V0KCkgKyByZWcuZ2V0TGVuZ3RoKCk7Ci0JCWludCBzdGFydEUgPSAoZXhjZXB0Rm9yICE9IG51bGwpID8gZXhjZXB0Rm9yLmdldE9mZnNldCgpIDogLTE7Ci0JCWludCBlbmRFID0gKGV4Y2VwdEZvciAhPSBudWxsKSA/IGV4Y2VwdEZvci5nZXRPZmZzZXQoKSArIGV4Y2VwdEZvci5nZXRMZW5ndGgoKSA6IDA7Ci0KLQkJQXJyYXlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBtb2RlbC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCWJvb2xlYW4gcGlja3VwZWQgPSBmYWxzZTsKLQkJd2hpbGUgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IGVuZCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlJdGVyYXRvciBpdCA9IHJlZ2lvbkxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8IHN0YXJ0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZW5kIDw9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzdGFydEUgPj0gMCAmJiBzdGFydEUgPD0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSAmJiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSA8PSBlbmRFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPKQotCQkJCQlsaXN0LmFkZChuZXcgQ29tcG91bmRSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbikpOwotCQkJCWVsc2UgaWYgKCFwaWNrdXBlZCAmJiByZWdpb24uZ2V0VHlwZSgpID09IHBpY2t1cFR5cGUpIHsKLQkJCQkJbGlzdC5hZGQobmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCByZWdpb24pKTsKLQkJCQkJcGlja3VwZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWZsYXROb2RlID0gZmxhdE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCWlmIChsaXN0LnNpemUoKSA+IDApIHsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG5ldyBDb21wb3VuZFJlZ2lvbltsaXN0LnNpemUoKV07Ci0JCQlsaXN0LnRvQXJyYXkocmVnaW9ucyk7Ci0JCQlyZXR1cm4gcmVnaW9uczsKLQkJfQotCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uWzBdOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbltdIGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoSVN0cnVjdHVyZWREb2N1bWVudCBtb2RlbCwgSVJlZ2lvbiByZWcsIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCWludCBzdGFydCA9IHJlZy5nZXRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IHJlZy5nZXRPZmZzZXQoKSArIHJlZy5nZXRMZW5ndGgoKSAtIDE7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbW9kZWwuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpIDw9IGVuZCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlJdGVyYXRvciBpdCA9IHJlZ2lvbkxpc3QuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGl0Lm5leHQoKTsKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8IHN0YXJ0KQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoZW5kIDwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkKLQkJCQkJYnJlYWs7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgKGlzQ2xlYW51cCgpICYmICFzdGd5LmlzRm9ybWF0U291cmNlKCkpKSAvLyBmb3IKLQkJCQkJLy8gbm90Ci0JCQkJCS8vIGZvcm1hdHRpbmcKLQkJCQkJLy8gY2FzZQotCQkJCQkvLyBvbgotCQkJCQkvLyBjbGVhbnVwCi0JCQkJCS8vIGFjdGlvbgotCQkJCQlsaXN0LmFkZChuZXcgQ29tcG91bmRSZWdpb24oZmxhdE5vZGUsIHJlZ2lvbikpOwotCQkJfQotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbmV3IENvbXBvdW5kUmVnaW9uW2xpc3Quc2l6ZSgpXTsKLQkJCWxpc3QudG9BcnJheShyZWdpb25zKTsKLQkJCXJldHVybiByZWdpb25zOwotCQl9Ci0JCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb25bMF07Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGluY2x1ZGVzKElSZWdpb24gcmVnaW9uLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAocmVnaW9uLmdldE9mZnNldCgpIDw9IHN0YXJ0KSAmJiAoZW5kIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzQ2xlYW51cCgpIHsKLQkJcmV0dXJuIHN0cmF0ZWd5ID09IENMRUFOVVA7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIGlzRm9ybWF0KCkgewotCQlyZXR1cm4gc3RyYXRlZ3kgPT0gRk9STUFUOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzSW5jbHVkZXNQcmVFbmQoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gKHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXN0YXRpYyBwcm90ZWN0ZWQgYm9vbGVhbiBuZWVkUyhDb21wb3VuZFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElSZWdpb24gb3ZlcmxhcHBlZFJlZ2lvbihJUmVnaW9uIHJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCWlmIChvdmVybGFwcyhyZWdpb24sIHN0YXJ0LCBlbmQpKSB7Ci0JCQlpbnQgb2Zmc2V0ID0gKHJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBzdGFydCkgPyBzdGFydCA6IHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGggPSAoKGVuZCA8PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpID8gZW5kIDogcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSAtIG9mZnNldDsKLQkJCXJldHVybiBuZXcgRm9ybWF0UmVnaW9uKG9mZnNldCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gb3ZlcmxhcHMoSVJlZ2lvbiByZWdpb24sIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJcmV0dXJuIChzdGFydCA8IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSkgJiYgKHJlZ2lvbi5nZXRPZmZzZXQoKSA8IGVuZCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJDaGFuZ2VDb250ZXh0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyQ2hhbmdlQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjRhNzNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJDaGFuZ2VDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXR0ckNoYW5nZUNvbnRleHQgewotCi0JcHVibGljIGludCBzdGFydCwgZW5kOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEF0dHJDaGFuZ2VDb250ZXh0KCkgewotCQlzdXBlcigpOwotCQlzdGFydCA9IGVuZCA9IDA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0F0dHJGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQwMWQ0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9BdHRyRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBBdHRyRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JQXR0ckZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0KLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUikgfHwgYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NQYWdlUnVsZS5TRUxFQ1RPUikpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGkgIT0gMCkKLQkJCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTSW1wb3J0UnVsZS5IUkVGKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTQ2hhcnNldFJ1bGUuRU5DT0RJTkcpKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5UKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGF0dHIuZ2V0TmFtZSgpID09IG51bGwgfHwgYXR0ci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSAhPSAwKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY291bnRlciBhdHRyaWJ1dGVzCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpICE9IDApCi0JCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCQotCQkJU3RyaW5nIHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJdmFsdWUgPSAiIjsvLyROT04tTkxTLTEkCi0JCQlpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZVJ1bGUuU0VMRUNUT1IpIHx8IGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IpKSB7Ci0JCQl9Ci0JCQllbHNlIGlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMoSUNTU0ltcG9ydFJ1bGUuSFJFRikpIHsKLQkJCQlTdHJpbmcgdXJpID0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTTGlua0NvbnZlcnRlci5zdHJpcEZ1bmModmFsdWUpOwotCQkJCVN0cmluZyBmdW5jID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA/ICJVUkwoIiA6ICJ1cmwoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSkpIHsKLQkJCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKHVyaSwgcXVvdGUpOwotCQkJCQl2YWx1ZSA9IGZ1bmMgKyBxdW90ZSArIHVyaSArIHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gZnVuYyArIHVyaSArICIpIjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NDaGFyc2V0UnVsZS5FTkNPRElORykpIHsKLQkJCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJCWlmICghdmFsdWUuc3RhcnRzV2l0aCgiXCIiKSAmJiAhdmFsdWUuc3RhcnRzV2l0aCgiXCciKSkvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQl2YWx1ZSA9IHF1b3RlICsgdmFsdWU7Ci0JCQkJaWYgKCF2YWx1ZS5lbmRzV2l0aCgiXCIiKSAmJiAhdmFsdWUuZW5kc1dpdGgoIlwnIikpLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJdmFsdWUgPSB2YWx1ZSArIHF1b3RlOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkuZXF1YWxzKElDU1NTdHlsZURlY2xJdGVtLklNUE9SVEFOVCkpIHsKLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoYXR0ci5nZXROYW1lKCkgPT0gbnVsbCB8fCBhdHRyLmdldE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZWxzZQotCQkJCQl2YWx1ZSA9IHZhbHVlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJc291cmNlLmFwcGVuZCh2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJZm9ybWF0UHJlKG5vZGUsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQXR0ckZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEF0dHJGb3JtYXR0ZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU0Zvcm1hdFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU0Zvcm1hdFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyZGMwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NGb3JtYXRVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JQ1NTTW9kZWxBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTRm9ybWF0VXRpbCB7Ci0JcHVibGljIExpc3QgY29sbGVjdENTU05vZGVzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUluZGV4ZWRSZWdpb24gc3RhcnROb2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydCk7Ci0JCUluZGV4ZWRSZWdpb24gZW5kTm9kZSA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnQgKyBsZW5ndGggLSAxKTsKLQotCQlpZiAoc3RhcnROb2RlID09IG51bGwgfHwgZW5kTm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbm9kZXM7Ci0JCX0KLQotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJQ1NTTW9kZWwgJiYgc3RhcnROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUgJiYgZW5kTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkvLyBDU1MgbW9kZWwKLQkJCUlDU1NOb2RlIGNhID0gZ2V0Q29tbW9uQW5jZXN0b3IoKElDU1NOb2RlKSBzdGFydE5vZGUsIChJQ1NTTm9kZSkgZW5kTm9kZSk7Ci0JCQlpZiAoY2EgIT0gbnVsbCkgewotCQkJCWZvciAoSUNTU05vZGUgbm9kZSA9IGNhLmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsICYmIHN0YXJ0ICsgbGVuZ3RoIDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCWlmIChzdGFydCA8ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJCW5vZGVzLmFkZChub2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCAmJiBzdGFydE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiBlbmROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJc3RhcnROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoVGV4dCkgc3RhcnROb2RlKS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlpZiAoZW5kTm9kZSBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQllbmROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoVGV4dCkgZW5kTm9kZSkuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQkJLy8gSFRNTCBtb2RlbCwgbWF5YmUKLQkJCUlET01Ob2RlIGNhID0gKElET01Ob2RlKSBnZXRDb21tb25BbmNlc3RvcigoTm9kZSkgc3RhcnROb2RlLCAoTm9kZSkgZW5kTm9kZSk7Ci0JCQlmaW5kQ1NTKG5vZGVzLCBjYSk7Ci0JCX0KLQotCQlyZXR1cm4gbm9kZXM7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q29tbW9uQW5jZXN0b3IgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoTm9kZSBub2RlMSwgTm9kZSBub2RlMikgewotCQlpZiAobm9kZTEgPT0gbnVsbCB8fCBub2RlMiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5hID0gbm9kZTI7IG5hICE9IG51bGw7IG5hID0gbmEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlmb3IgKE5vZGUgdGEgPSBub2RlMTsgdGEgIT0gbnVsbDsgdGEgPSB0YS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQlpZiAodGEgPT0gbmEpCi0JCQkJCXJldHVybiB0YTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRDU1MoTGlzdCBjc3NOb2RlcywgSURPTU5vZGUgbm9kZSkgewotCQlJQ1NTTW9kZWxBZGFwdGVyIGFkYXB0ZXI7Ci0JCWFkYXB0ZXIgPSAoSUNTU01vZGVsQWRhcHRlcikgbm9kZS5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCUlDU1NNb2RlbCBtb2RlbCA9IGFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFN0eWxlU2hlZXRUeXBlKCkgPT0gSUNTU01vZGVsLkVNQkVEREVEKSB7Ci0JCQkJY3NzTm9kZXMuYWRkKG1vZGVsLmdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJYWRhcHRlciA9IChJQ1NTTW9kZWxBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlJQ1NTTW9kZWwgbW9kZWwgPSBhZGFwdGVyLmdldE1vZGVsKCk7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuSU5MSU5FKSB7Ci0JCQkJCWNzc05vZGVzLmFkZChtb2RlbC5nZXREb2N1bWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlmb3IgKElET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoSURPTU5vZGUpIGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWZpbmRDU1MoY3NzTm9kZXMsIGNoaWxkKTsKLQkJfQotCX0KLQotCXByaXZhdGUgSUNTU05vZGUgZ2V0Q29tbW9uQW5jZXN0b3IoSUNTU05vZGUgbm9kZUEsIElDU1NOb2RlIG5vZGVCKSB7Ci0JCWlmIChub2RlQSA9PSBudWxsIHx8IG5vZGVCID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJZm9yIChJQ1NTTm9kZSBuYSA9IG5vZGVBOyBuYSAhPSBudWxsOyBuYSA9IG5hLmdldFBhcmVudE5vZGUoKSkgewotCQkJZm9yIChJQ1NTTm9kZSB0YSA9IG5vZGVCOyB0YSAhPSBudWxsOyB0YSA9IHRhLmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmICh0YSA9PSBuYSkgewotCQkJCQlyZXR1cm4gdGE7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VTb3VyY2UoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAob2Zmc2V0ID49IDAgJiYgbGVuZ3RoID49IDAgJiYgb2Zmc2V0ICsgbGVuZ3RoIDw9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKSkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoc291cmNlID09IG51bGwpCi0JCQkJc291cmNlID0gbmV3IFN0cmluZygpOwotCQkJLy8gV2UgdXNlICdzdHJ1Y3R1cmVkRG9jdW1lbnQnIGFzIHRoZSByZXF1ZXN0ZXIgb2JqZWN0IGp1c3Qgc28KLQkJCS8vIHRoaXMgYW5kIHRoZSBvdGhlcgotCQkJLy8gZm9ybWF0LXJlbGF0ZWQgJ3JlcGFsY2VUZXh0JyAoaW4gcmVwbGFjZVNvdXJjZSkgY2FuIHVzZSB0aGUKLQkJCS8vIHNhbWUgcmVxdWVzdGVyLgotCQkJLy8gT3RoZXJ3aXNlLCBpZiByZXF1ZXN0ZXIgaXMgbm90IGlkZW50aWNhbCwKLQkJCS8vIHRoZSB1bmRvIGdyb3VwIGdldHMgImJyb2tlbiIgaW50byBtdWx0aXBsZSBwaWVjZXMgYmFzZWQKLQkJCS8vIG9uIHRoZSByZXF1ZXN0ZXJzIGJlaW5nIGRpZmZlcmVudC4gVGVjaG5pY2FsbHksIGFueSB1bmlxdWUsCi0JCQkvLyBjb21tb24KLQkJCS8vIHJlcXVlc3RlciBvYmplY3Qgd291bGQgd29yay4KLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTRm9ybWF0VXRpbCBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTRm9ybWF0VXRpbCgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBDU1NGb3JtYXRVdGlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU0Zvcm1hdFV0aWwgZkluc3RhbmNlOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhOWFmMDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgY2xlYW51cChJQ1NTTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ0J1ZmZlcgotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbgotCSAqLwotCVN0cmluZ0J1ZmZlciBjbGVhbnVwKElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXQoSUNTU05vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmdCdWZmZXIgZm9ybWF0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYmY1OTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1NvdXJjZUZvcm1hdHRlckZhY3RvcnkgewotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgQ1NTU291cmNlRm9ybWF0dGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU291cmNlR2VuZXJhdG9yIGdldFNvdXJjZUZvcm1hdHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlJQ1NTTm9kZSBub2RlID0gKElDU1NOb2RlKSB0YXJnZXQ7Ci0JCXNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJQ1NTTm9kZS5DSEFSU0VUUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gQ2hhcnNldFJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJCXJldHVybiBGb250RmFjZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuSU1QT1JUUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gSW1wb3J0UnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSA6Ci0JCQkJcmV0dXJuIE1lZGlhTGlzdEZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSA6Ci0JCQkJcmV0dXJuIE1lZGlhUnVsZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFIDoKLQkJCQlJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUgPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSBub2RlOwotCQkJCWlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT1VOVEVSKQotCQkJCQlyZXR1cm4gQ291bnRlckZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJCWVsc2UgaWYgKHZhbHVlLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QpCi0JCQkJCXJldHVybiBSZWN0Rm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQkJZWxzZSBpZiAodmFsdWUuZ2V0UHJpbWl0aXZlVHlwZSgpID09IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1IpCi0JCQkJCXJldHVybiBSR0JGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybiBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gUGFnZVJ1bGVGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgOgotCQkJCXJldHVybiBTdHlsZURlY2xJdGVtRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCQlyZXR1cm4gU3R5bGVSdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSA6Ci0JCQkJcmV0dXJuIFN0eWxlU2hlZXRGb3JtYXR0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCWNhc2UgSUNTU05vZGUuQVRUUl9OT0RFIDoKLQkJCQlyZXR1cm4gQXR0ckZvcm1hdHRlci5nZXRJbnN0YW5jZSgpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIFVua25vd25SdWxlRm9ybWF0dGVyLmdldEluc3RhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5IGZJbnN0YW5jZTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DU1NTb3VyY2VHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGZlOGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NTU1NvdXJjZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTU291cmNlR2VuZXJhdG9yIGV4dGVuZHMgQ1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgcmVnaW9uKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZ0J1ZmZlciBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gZXhjZXB0Rm9yKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCWludCBnZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIoSUNTU05vZGUgbm9kZSwgaW50IGluc2VydFBvcyk7Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCWludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9DaGFyc2V0UnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTkwZmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NoYXJzZXRSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0NoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBDSEFSU0VUID0gIkBjaGFyc2V0IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlDaGFyc2V0UnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NDaGFyc2V0UnVsZS5FTkNPRElORy5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSkKLQkJCXJldHVybiBidWY7Ci0KLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQucHJldigpOwotCQkJCWlmIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHByZXYpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0gZWxzZSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSArIDE7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWZvcm1hdFByZShub2RlLCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHNvdXJjZSk7Ci0JCX0gZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQkJU3RyaW5nIHN0ciA9IENIQVJTRVQ7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IENIQVJTRVQudG9VcHBlckNhc2UoKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCVN0cmluZyBlbmMgPSAoKElDU1NDaGFyc2V0UnVsZSkgbm9kZSkuZ2V0RW5jb2RpbmcoKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShlbmMsIHF1b3RlKTsKLQkJCXN0ciA9IHF1b3RlICsgKChlbmMgIT0gbnVsbCkgPyBlbmMgOiAiIikgKyBxdW90ZSArICI7IjsvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpICYmICFyZWdpb25zW2ldLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpZiAoIUlDU1NDaGFyc2V0UnVsZS5FTkNPRElORy5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU0NoYXJzZXRSdWxlLkVOQ09ESU5HKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldEVuZE9mZnNldCgpIDw9IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJQ29tcG91bmRSZWdpb24gcmVnaW9uc1tdID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBuZXcgRm9ybWF0UmVnaW9uKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGlOb2RlLmdldEVuZE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSksIHN0Z3kpOwotCQlmb3IgKGludCBpID0gcmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCXJldHVybiByZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGlOb2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgQ2hhcnNldFJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db21wb3VuZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvQ29tcG91bmRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzYzhmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db21wb3VuZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotY2xhc3MgQ29tcG91bmRSZWdpb24gewotCi0JQ29tcG91bmRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlzdXBlcigpOwotCQl0aGlzLmZEb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQl0aGlzLmZUZXh0UmVnaW9uID0gdGV4dFJlZ2lvbjsKLQl9Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZkRvY3VtZW50UmVnaW9uOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFRleHRSZWdpb24oKSB7Ci0JCXJldHVybiBmVGV4dFJlZ2lvbjsKLQl9Ci0KLQlTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUZXh0UmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudFJlZ2lvbi5nZXRUZXh0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pOwotCX0KLQotCWludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQl9Ci0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmRG9jdW1lbnRSZWdpb247Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBmVGV4dFJlZ2lvbjsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0NvdW50ZXJGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxZGQxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Db3VudGVyRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDb3VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3VudGVyRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb3VudGVyRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JQ291bnRlckZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCi0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIHNvdXJjZTsKLQotCQlpZiAoIUlDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkgJiYgIUlDb3VudGVyLkxJU1RTVFlMRS5lcXVhbHNJZ25vcmVDYXNlKGF0dHIuZ2V0TmFtZSgpKSAmJiAhSUNvdW50ZXIuU0VQQVJBVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIHNvdXJjZTsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQljb250ZXh0LnN0YXJ0ID0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJY29udGV4dC5lbmQgPSBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQotCQlJQ291bnRlciBjb3VudGVyID0gKElDb3VudGVyKSBub2RlOwotCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQlTdHJpbmcgc2VwID0gY291bnRlci5nZXRTZXBhcmF0b3IoKTsKLQkJU3RyaW5nIGlkZW50ID0gY291bnRlci5nZXRJZGVudGlmaWVyKCk7Ci0JCVN0cmluZyBzdHlsZSA9IGNvdW50ZXIuZ2V0TGlzdFN0eWxlKCk7Ci0KLQkJaWYgKElDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsKLQkJCWlmIChpbnNlcnQpCi0JCQkJaWRlbnQgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQllbHNlCi0JCQkJaWRlbnQgPSAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7Ci0JCQlpZiAoaW5zZXJ0KQotCQkJCXN0eWxlID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJZWxzZQotCQkJCXN0eWxlID0gbnVsbDsKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5TRVBBUkFUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpIHsKLQkJCWlmIChpbnNlcnQpCi0JCQkJc2VwID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJZWxzZQotCQkJCXNlcCA9IG51bGw7Ci0JCX0KLQotCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc2VwLCBxdW90ZSk7Ci0JCXNlcCA9IChzZXAgPT0gbnVsbCB8fCBzZXAubGVuZ3RoKCkgPT0gMCkgPyBudWxsIDogKHF1b3RlICsgc2VwICsgcXVvdGUpOwotCi0JCVN0cmluZyBmdW5jID0gKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSA/ICJjb3VudGVyKCIgOiAiY291bnRlcnMoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgewotCQkJaWRlbnQgPSBpZGVudC50b1VwcGVyQ2FzZSgpOwotCQkJc3R5bGUgPSBzdHlsZS50b1VwcGVyQ2FzZSgpOwotCQkJZnVuYyA9IGZ1bmMudG9VcHBlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCWlkZW50ID0gaWRlbnQudG9Mb3dlckNhc2UoKTsKLQkJCXN0eWxlID0gc3R5bGUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlpZiAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApIHsKLQkJCXNvdXJjZS5hcHBlbmQoZnVuYyk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGlkZW50LCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChpZGVudCk7Ci0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgc2VwLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzZXApOwotCQl9Ci0KLQkJaWYgKHN0eWxlICE9IG51bGwgJiYgc3R5bGUubGVuZ3RoKCkgIT0gMCkgewotCQkJc291cmNlLmFwcGVuZCgiLCIpOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0eWxlLCBzb3VyY2UpOwotCQl9Ci0JCXNvdXJjZS5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0KLQkJLyoKLQkJICogSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPQotCQkgKiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkgKiBJVGV4dFJlZ2lvbltdIHJlZ2lvbnMgPQotCQkgKiBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3Ci0JCSAqIEZvcm1hdFJlZ2lvbihjb250ZXh0LnN0YXJ0LCBjb250ZXh0LmVuZCAtIGNvbnRleHQuc3RhcnQgKyAxKSk7IGludAotCQkgKiBjb21tYXNbMl07IGludCBudW1Db21tYSA9IDA7IGZvcihpbnQgaiA9IDA7IGogPHJlZ2lvbnMubGVuZ3RoOyBqKyspIHsKLQkJICogaWYgKHJlZ2lvbnNbal0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNPTU1BKSB7Ci0JCSAqIGNvbW1hc1tudW1Db21tYSsrXSA9IGo7IGlmIChudW1Db21tYSA+IDEpIGJyZWFrOyB9IH0KLQkJICogCi0JCSAqIGlmIChJQ291bnRlci5JREVOVElGSUVSLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7IH0gZWxzZQotCQkgKiBpZiAoSUNvdW50ZXIuTElTVFNUWUxFLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7IH0gZWxzZQotCQkgKiBpZiAoSUNvdW50ZXIuU0VQQVJBVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKSB7IGJvb2xlYW4KLQkJICogc2tpcFNwYWNlID0gZmFsc2U7IFN0cmluZyBmdW5jID0gaW5zZXJ0ID8gImNvdW50ZXJzKCIgOiAiY291bnRlcigiOwotCQkgKiBpZiAobWdyLmlzUHJvcFZhbHVlVXBwZXJDYXNlKCkpIGZ1bmMgPSBmdW5jLnRvVXBwZXJDYXNlKCk7Ci0JCSAqIAotCQkgKiBmb3IoaW50IGk9MDsgaSA8cmVnaW9ucy5sZW5ndGg7IGkrKykgeyBpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0KLQkJICogQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkgKiBzb3VyY2UuYXBwZW5kKGZ1bmMpOyBlbHNlIHsgaWYgKG51bUNvbW1hID09IDIgJiYgY29tbWFzWzFdIDwgaSkgewotCQkgKiAgfSBlbHNlIGlmIChudW1Db21tYSA9PSAxICYmIGNvbW1hc1swXSA8IGkgJiYgaW5zZXJ0KSB7Ci0JCSAqICB9IGVsc2UgaWYgKG51bUNvbW1hID09IDEgJiYgY29tbWFzWzBdIDwgaSAmJiAhIGluc2VydCkgeyB9IGVsc2UgaWYKLQkJICogKG51bUNvbW1hID09IDAgJiYgaW5zZXJ0ICYmIHJlZ2lvbnNbaV0uZ2V0VHlwZSA9PQotCQkgKiBDU1NSZWdpb25Db250ZXh0cy5QQVJFTlRIRVNJU19DTE9TRSkgeyBzb3VyY2UuYXBwZW5kKCIsIik7Ci0JCSAqIGFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsYXR0ci5nZXRWYWx1ZSgpLHNvdXJjZSk7Ci0JCSAqIHNvdXJjZS5hcHBlbmQoYXR0ci5nZXRWYWx1ZSgpKTsgfQotCQkgKiAKLQkJICogaWYgKGkgIT0gMCAmJiAhc2tpcFNwYWNlKQotCQkgKiBhcHBlbmRTcGFjZUJlZm9yZShub2RlLHJlZ2lvbnNbaV0sc291cmNlKTsKLQkJICogc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSkpOyB9IHNraXBTcGFjZSA9Ci0JCSAqIGZhbHNlOwotCQkgKiAKLQkJICogaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09Ci0JCSAqIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgc2tpcFNwYWNlID0gdHJ1ZTsgfSB9Ci0JCSAqLwotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWJvb2xlYW4gc2tpcFNwYWNlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwICYmICFza2lwU3BhY2UpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc2tpcFNwYWNlID0gZmFsc2U7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXNraXBTcGFjZSA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJSUNvdW50ZXIgY291bnRlciA9IChJQ291bnRlcikgbm9kZTsKLQkJCVN0cmluZyBxdW90ZSA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSk7Ci0JCQlTdHJpbmcgc2VwYXJhdG9yID0gY291bnRlci5nZXRTZXBhcmF0b3IoKTsKLQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzZXBhcmF0b3IsIHF1b3RlKTsKLQkJCVN0cmluZyBzZXAgPSAoc2VwYXJhdG9yID09IG51bGwgfHwgc2VwYXJhdG9yLmxlbmd0aCgpID09IDApID8gbnVsbCA6IChxdW90ZSArIHNlcGFyYXRvciArIHF1b3RlKTsKLQkJCVN0cmluZyBpZGVudCA9IGNvdW50ZXIuZ2V0SWRlbnRpZmllcigpOwotCQkJU3RyaW5nIHN0eWxlID0gY291bnRlci5nZXRMaXN0U3R5bGUoKTsKLQkJCVN0cmluZyBmdW5jID0gKHNlcCA9PSBudWxsIHx8IHNlcC5sZW5ndGgoKSA9PSAwKSA/ICJjb3VudGVyKCIgOiAiY291bnRlcnMoIjsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJLy8gbm9ybWFsaXplCi0JCQlpZiAoaWRlbnQgPT0gbnVsbCkKLQkJCQlpZGVudCA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChzdHlsZSA9PSBudWxsKQotCQkJCXN0eWxlID0gIiI7Ly8kTk9OLU5MUy0xJAotCi0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgewotCQkJCWlkZW50ID0gaWRlbnQudG9VcHBlckNhc2UoKTsKLQkJCQlzdHlsZSA9IHN0eWxlLnRvVXBwZXJDYXNlKCk7Ci0JCQkJZnVuYyA9IGZ1bmMudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlkZW50ID0gaWRlbnQudG9Mb3dlckNhc2UoKTsKLQkJCQlzdHlsZSA9IHN0eWxlLnRvTG93ZXJDYXNlKCk7Ci0JCQl9Ci0JCQlpZiAoc2VwID09IG51bGwgfHwgc2VwLmxlbmd0aCgpID09IDApIHsKLQkJCQlzb3VyY2UuYXBwZW5kKGZ1bmMpOwotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIGlkZW50LCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoaWRlbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBpZGVudCwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGlkZW50KTsKLQkJCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHNlcCwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHNlcCk7Ci0JCQl9Ci0KLQkJCWlmIChzdHlsZSAhPSBudWxsICYmIHN0eWxlLmxlbmd0aCgpICE9IDApIHsKLQkJCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0eWxlLCBzb3VyY2UpOwotCQkJfQotCQkJc291cmNlLmFwcGVuZCgiKSIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKElDb3VudGVyLklERU5USUZJRVIuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ291bnRlci5JREVOVElGSUVSKTsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWlmIChpTm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKQotCQkJCXJldHVybiAtMTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpKTsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJfQotCQllbHNlIGlmIChJQ291bnRlci5MSVNUU1RZTEUuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHsKLQkJCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ291bnRlci5MSVNUU1RZTEUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGlOb2RlLmdldEVuZE9mZnNldCgpIC0gMSkpOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IpCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJcmV0dXJuIGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJZWxzZSBpZiAoSUNvdW50ZXIuU0VQQVJBVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKSB7Ci0JCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNvdW50ZXIuU0VQQVJBVE9SKTsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpTm9kZS5nZXRFbmRPZmZzZXQoKSAtIDEpKTsKLQkJCWJvb2xlYW4gaGFzQ29tbWEgPSBmYWxzZTsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SKSB7Ci0JCQkJCWlmICghaGFzQ29tbWEpCi0JCQkJCQloYXNDb21tYSA9IHRydWU7Ci0JCQkJCWVsc2UKLQkJCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb3VudGVyRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IENvdW50ZXJGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWNsQ29udGFpbmVyRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWNsQ29udGFpbmVyRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZmY0NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRGVjbENvbnRhaW5lckZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIERlY2xDb250YWluZXJGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCURlY2xDb250YWluZXJGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBkZWNvcmF0ZWRTZWxlY3RvclJlZ2lvbihDb21wb3VuZFJlZ2lvbiByZWdpb24sIENvbXBvdW5kUmVnaW9uIHByZXZSZWdpb24sIENTU0NsZWFudXBTdHJhdGVneSBzdGd5KSB7Ci0JCVN0cmluZyB0ZXh0ID0gcmVnaW9uLmdldFRleHQoKTsKLQkJaWYgKGlzRm9ybWF0KCkpCi0JCQlyZXR1cm4gdGV4dDsKLQotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETykgewotCQkJc2hvcnQgc2VsQ2FzZSA9IHN0Z3kuZ2V0U2VsZWN0b3JUYWdDYXNlKCk7Ci0JCQlpZiAoc2VsQ2FzZSA9PSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpIHsKLQkJCQlyZXR1cm4gdGV4dC50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoc2VsQ2FzZSA9PSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpIHsKLQkJCQlyZXR1cm4gdGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQotCQlyZXR1cm4gZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbiwgMCwgc3RneSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKQotCQkJCXJldHVybiBuIC0gMTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0RlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFhZWQyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9EZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNTU1JlZ2lvblV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhcHBlbmRTcGFjZUJldHdlZW4oSUNTU05vZGUgbm9kZSwgQ29tcG91bmRSZWdpb24gcHJldiwgQ29tcG91bmRSZWdpb24gbmV4dCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpZiAoaXNDbGVhbnVwKCkgJiYgIWdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKQotCQkJcmV0dXJuOyAvLyBmb3Igbm90IGZvcm1hdHRpbmcgY2FzZSBvbiBjbGVhbnVwIGFjdGlvbgotCi0JCS8vIGluIHNlbGVjdG9yCi0JCVN0cmluZyBwcmV2VHlwZSA9IHByZXYuZ2V0VHlwZSgpOwotCQlTdHJpbmcgbmV4dFR5cGUgPSBuZXh0LmdldFR5cGUoKTsKLQkJaWYgKENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUocHJldlR5cGUpICYmIENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUobmV4dFR5cGUpKSB7Ci0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzM5OTAKLQkJCS8vIEZvcm1hdHRpbmcgQ1NTIGZpbGUgc3BsaXRzIGVsZW1lbnQuY2xhc3MgaW50byBlbGVtZW50IC4gY2xhc3MKLQkJCWlmICgocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSAmJiAobmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCkpIHx8ICgocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MpICYmIG5leHRUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pKSB7Ci0JCQkJLy8gSW5kaXZpZHVhbGx5LCBTRUxFQ1RPUl9FTEVNRU5UX05BTUUsIFNFTEVDVE9SX0NMQVNTLCBhbmQgU0VMRUNUT1JfSUQgY2FuIGFsbCBiZSBiZWdpbm5pbmcgdHlwZXMuCi0JCQkJLy8gQnV0LCB3ZSBzaG91bGQgbm90IGluc2VydCBhIHNwYWNlIGluIGJldHdlZW4gd2hlbiBTRUxFQ1RPUl9FTEVNRU5UX05BTUUgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfQ0xBU1MsIG9yIHdoZW4KLQkJCQkvLyBTRUxFQ1RPUl9FTEVNRU5UX05BTUUgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfSUQuCi0JCQkJLy8gRm9yIGV4YW1wbGU6IEgxLnBhc3RvcmFsIGFuZCBIMSN6OTh5Ci0JCQkJLy8KLQkJCQkvLyBBbHNvLCBzcGFjZSBpcyBub3cgbm90IGluc2VydGVkIGluIGJldHdlZW4gd2hlbiBTRUxFQ1RPUl9FTEVNRU5UX05BTUUgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfUFNFVURPLCBvciB3aGVuCi0JCQkJLy8gU0VMRUNUT1JfQ0xBU1MgaXMgZm9sbG93ZWQgYnkgU0VMRUNUT1JfUFNFVURPLgotCQkJCS8vIEZvciBleGFtcGxlOiBQOmZpcnN0LWxldHRlciBhbmQgQS5leHRlcm5hbDp2aXNpdGVkCi0JCQl9Ci0JCQllbHNlCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JEIHx8IHByZXZUeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCB8fCBwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEpIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG5leHQsIHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAocHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04gJiYgbmV4dFR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCWlmIChwcmV2LmdldEVuZE9mZnNldCgpICE9IG5leHQuZ2V0U3RhcnRPZmZzZXQoKSkgeyAvLyBub3QKLQkJCQkJCQkJCQkJCQkJCQkvLyBzZXF1ZW50aWFsCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChwcmV2VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgcHJldlR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQgfHwgbmV4dFR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCBuZXh0VHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgbmV4dCwgc291cmNlKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkKLQkJCXJldHVybiBuOwotCQlyZXR1cm4gLTE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ZvbnRGYWNlUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YTY3ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9udEZhY2VSdWxlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRm9udEZhY2VSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVjbENvbnRhaW5lckZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgRk9OVF9GQUNFID0gIkBmb250LWZhY2UiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlGb250RmFjZVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgc3RyID0gRk9OVF9GQUNFOwotCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IEZPTlRfRkFDRS50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBGb250RmFjZVJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgRm9udEZhY2VSdWxlRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRm9ybWF0UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwYzlkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Gb3JtYXRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLWNsYXNzIEZvcm1hdFJlZ2lvbiBpbXBsZW1lbnRzIElSZWdpb24gewotCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCwgZkxlbmd0aDsKLQotCS8qKgotCSAqIAotCSAqLwotCUZvcm1hdFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldChvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aGlzLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMuZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldExlbmd0aChpbnQgbmV3TGVuZ3RoKSB7Ci0JCWZMZW5ndGggPSBuZXdMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG5ld09mZnNldCkgewotCQlmT2Zmc2V0ID0gbmV3T2Zmc2V0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9GdW5jdGlvbkZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvRnVuY3Rpb25Gb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk0OTliYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9GdW5jdGlvbkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZ1bmN0aW9uRm9ybWF0dGVyIGV4dGVuZHMgQWJzdHJhY3RDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JRnVuY3Rpb25Gb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUjsKLQkJCQlpZiAocHJldiA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSBiZXR3ZWVuCi0JCQkvLyBwYXJhbWV0ZXJzCi0JCQlzb3VyY2UuYXBwZW5kKCIsIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGUgbm9kZSwgamF2YS5sYW5nLlN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCXNvdXJjZS5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCi0JCWlmIChlbmQgPiAwKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCVN0cmluZyBmdW5jID0gZ2V0RnVuYygpOwotCQkJaWYgKENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlmdW5jID0gZnVuYy50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChmdW5jKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRGdW5jKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvSW1wb3J0UnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvSW1wb3J0UnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWQzZWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL0ltcG9ydFJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEltcG9ydFJ1bGVGb3JtYXR0ZXIgZXh0ZW5kcyBBYnN0cmFjdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgSU1QT1JUID0gIkBpbXBvcnQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBJbXBvcnRSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JSW1wb3J0UnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlpZiAoIUlDU1NJbXBvcnRSdWxlLkhSRUYuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWl0Lm5leHQoKTsKLQkJCQl9IGVsc2UKLQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWl0Lm5leHQoKTsKLQkJCQlpZiAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5leHQpOwotCQkJCQllbHNlCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0gZWxzZQotCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJfSBlbHNlIHsKLQkJCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIC0gMSk7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgLSAxKTsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQgJiYgYXR0ci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCS8vIGZvciBtZWRpYS10eXBlCi0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJLy8gZ2V0IG1lYW5pbmcgcmVnaW9ucwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gbnVsbDsKLQkJCWlmIChleGNlcHRGb3IgPT0gbnVsbCkKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1I7Ci0JCQkJaWYgKHByZXYgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJCQlwaWNrdXBUeXBlID0gbnVsbDsKLQkJCQlyZWdpb25zID0gZ2V0UmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgZXhjZXB0Rm9yLCBwaWNrdXBUeXBlKTsKLQkJCX0KLQkJCS8vIGV4dHJhY3Qgc291cmNlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCS8vIGJlCi0JCQkJLy8gY29tbWVudHMKLQkJCX0KLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQl9IGVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6ID8/Pz8KLQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsvLyROT04tTkxTLTEkCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfSBlbHNlIGlmIChjaGlsZCAhPSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6IGJldHdlZW4gJ3VybCgpJyBhbmQKLQkJCS8vIG1lZGlhIHR5cGVzCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkvLyBjb21tZW50cwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKCgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IChub2RlLmdldExhc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldExhc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpICYmICFyZWdpb25zW2ldLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIHN0ciA9IHJlZ2lvbnNbaV0uZ2V0VGV4dCgpOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKQotCQkJCQlzdHIgPSBkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCQllbHNlCi0JCQkJCXN0ciA9IGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJCVN0cmluZyBzdHIgPSBJTVBPUlQ7Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCXN0ciA9IElNUE9SVC50b1VwcGVyQ2FzZSgpOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJCXN0ciA9ICJ1cmwoIjsvLyROT04tTkxTLTEkCi0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBzdHIudG9VcHBlckNhc2UoKTsKLQkJCVN0cmluZyBocmVmID0gKChJQ1NTSW1wb3J0UnVsZSkgbm9kZSkuZ2V0SHJlZigpOwotCQkJcXVvdGUgPSBDU1NVdGlsLmRldGVjdFF1b3RlKGhyZWYsIHF1b3RlKTsKLQkJCXN0ciA9IHN0ciArIHF1b3RlICsgaHJlZiArIHF1b3RlICsgIikiOy8vJE5PTi1OTFMtMSQKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCQlJQ1NTTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QpICYmICgob3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0KSBjaGlsZCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBzdHIgPSByZWdpb25zW2ldLmdldFRleHQoKTsKLQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JUKQotCQkJCXN0ciA9IGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpOwotCQkJZWxzZQotCQkJCXN0ciA9IGRlY29yYXRlZFByb3BWYWx1ZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KTsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoc3RyKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NJbXBvcnRSdWxlLkhSRUYuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKElDU1NJbXBvcnRSdWxlLkhSRUYpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlGb3JtYXRSZWdpb24gZm9ybWF0UmVnaW9uID0gbnVsbDsKLQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJZm9ybWF0UmVnaW9uID0gbmV3IEZvcm1hdFJlZ2lvbihpTm9kZS5nZXRTdGFydE9mZnNldCgpLCAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIC0gaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCWVsc2UKLQkJCWZvcm1hdFJlZ2lvbiA9IG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKTsKLQkJQ29tcG91bmRSZWdpb24gcmVnaW9uc1tdID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBmb3JtYXRSZWdpb24sIGdldENsZWFudXBTdHJhdGVneShub2RlKSk7Ci0KLQkJYm9vbGVhbiBhdHJ1bGUgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCkgewotCQkJCWF0cnVsZSA9IHRydWU7Ci0JCQkJY29udGludWU7Ci0JCQl9IGVsc2UgaWYgKCFhdHJ1bGUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiBpTm9kZS5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaW50IG4gPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAobiA+IDApIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSkuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpCi0JCQkJcmV0dXJuIG4gLSAxOwotCQkJcmV0dXJuIG47Ci0JCX0KLQkJcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEltcG9ydFJ1bGVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSW1wb3J0UnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhTGlzdEZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhNTI2ZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvTWVkaWFMaXN0Rm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NBdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYUxpc3RGb3JtYXR0ZXIgZXh0ZW5kcyBEZWZhdWx0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIE1lZGlhTGlzdEZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCU1lZGlhTGlzdEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGZvcm1hdEF0dHJDaGFuZ2VkKElDU1NOb2RlIG5vZGUsIElDU1NBdHRyIGF0dHIsIGJvb2xlYW4gaW5zZXJ0LCBBdHRyQ2hhbmdlQ29udGV4dCBjb250ZXh0KSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQlib29sZWFuIGZpcnN0ID0gZmFsc2UsIGxhc3QgPSBmYWxzZTsKLQkJLy8gZ2V0IHJlZ2lvbiB0byByZXBsYWNlCi0JCWlmIChjb250ZXh0ICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQucHJldigpOwotCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY29udGV4dC5zdGFydCA8ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlmaXJzdCA9IHRydWU7Ci0KLQkJCQl9Ci0JCQkJaXQucmVzZXQoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBpdC5uZXh0KCk7Ci0JCQkJCWlmIChuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyB8fCBuZXh0LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SIHx8IG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmV4dCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA8IGNvbnRleHQuZW5kKSB7Ci0JCQkJCWNvbnRleHQuZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJbGFzdCA9IHRydWU7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlsYXN0ID0gdHJ1ZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gcHJldiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IgfHwgcHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpCi0JCQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocHJldik7Ci0JCQkJCWVsc2UKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAoY29udGV4dC5zdGFydCA8ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlmaXJzdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGdlbmVyYXRlIHRleHQKLQkJaWYgKGluc2VydCAmJiBhdHRyLmdldFZhbHVlKCkgIT0gbnVsbCAmJiBhdHRyLmdldFZhbHVlKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAoIWZpcnN0KQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQkJaWYgKCFsYXN0KSB7Ci0JCQkJYnVmLmFwcGVuZCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIGlmICghZmlyc3QgJiYgIWxhc3QpIHsKLQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gYnVmOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCU1lZGlhTGlzdCBsaXN0ID0gKE1lZGlhTGlzdCkgbm9kZTsKLQkJCWludCBuID0gbGlzdC5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJU3RyaW5nIG1lZGl1bSA9IGxpc3QuaXRlbShpKTsKLQkJCQlpZiAoQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW1lZGl1bSA9IG1lZGl1bS50b1VwcGVyQ2FzZSgpOwotCQkJCWVsc2UKLQkJCQkJbWVkaXVtID0gbWVkaXVtLnRvTG93ZXJDYXNlKCk7Ci0KLQkJCQlpZiAoaSAhPSAwKSB7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBtZWRpdW0sIHNvdXJjZSk7Ci0JCQkJfQotCQkJCXNvdXJjZS5hcHBlbmQobWVkaXVtKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ckluc2VydFBvcyhJQ1NTTm9kZSBub2RlLCBTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBhdHRyTmFtZSA9PSBudWxsIHx8IGF0dHJOYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0KLQkJSUNTU0F0dHIgYXR0ciA9IChJQ1NTQXR0cikgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQkvKgotCQkgKiBJVGV4dFJlZ2lvbiByZWdpb25zW10gPQotCQkgKiBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksCi0JCSAqIG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLQotCQkgKiBpTm9kZS5nZXRTdGFydE9mZnNldCgpICsgMSkpOyBmb3IoaW50IGk9cmVnaW9ucy5sZW5ndGggLSAxOyBpID49IDA7Ci0JCSAqIGktLSkgeyBpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuSU1QT1JUQU5UX1NZTSkKLQkJICogcmV0dXJuIHJlZ2lvbnNbaV0uZ2V0U3RhcnRPZmZzZXQoKTsgfQotCQkgKi8KLQkJcmV0dXJuIGlOb2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE1lZGlhTGlzdEZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBNZWRpYUxpc3RGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9NZWRpYVJ1bGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhUnVsZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzUyNTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL01lZGlhUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUnVsZUZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBNRURJQSA9ICJAbWVkaWEiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBNZWRpYVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlNZWRpYVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZwotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBudWxsOwotCQkJCWlmICgocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgfHwgKHByZXYgPT0gbnVsbCAmJiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkpIHsKLQkJCQkJcGlja3VwVHlwZSA9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0U7Ci0JCQkJfQotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZXh0cmFjdCBzb3VyY2UKLQkJCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsgLy8gYmV0d2VlbgotCQkJCS8vICJAbWVkaWEiCi0JCQkJLy8gYW5kCi0JCQkJLy8gbWVkaWF0eXBlCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsgLy8gbXVzdAotCQkJCQkvLyBiZQotCQkJCQkvLyBjb21tZW50cwotCQkJCX0KLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gbWVkaWF0eXBlCi0JCQkJLy8gYW5kCi0JCQkJLy8gdGhlCi0JCQkJLy8gZmlyc3QKLQkJCQkvLyBzdHlsZQotCQkJCS8vIHJ1bGUKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCS8vIGJlCi0JCQkJCS8vIGNvbW1lbnRzCi0JCQkJfQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9IGVsc2UgeyAvLyBiZXR3ZWVuIHN0eWxlcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkJLy8gYmUKLQkJCQkJLy8gY29tbWVudHMKLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCWlmIChjaGlsZCA9PSBudWxsICYmIHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuTUVESUFMSVNUX05PREUpIHsgLy8gYWZ0ZXIKLQkJCQkvLyB0aGUKLQkJCQkvLyBsYXN0Ci0JCQkJLy8gc3R5bGUKLQkJCQkvLyBydWxlCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIG51bGwsIHNvdXJjZSk7Ci0JCQl9IGVsc2UgaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gIkBtZWRpYSIKLQkJCQkvLyBhbmQKLQkJCQkvLyBtZWRpYXR5cGUKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkJLy8gbWVkaWF0eXBlCi0JCQkJLy8gYW5kCi0JCQkJLy8gdGhlCi0JCQkJLy8gZmlyc3QKLQkJCQkvLyBzdHlsZQotCQkJCS8vIHJ1bGUKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJCXNvdXJjZS5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJZWxzZQotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLmdldFBhcmVudE5vZGUoKSwgbnVsbCwgc291cmNlKTsKLQkJCX0gZWxzZSB7IC8vIG5vcm1hbCBjYXNlCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgeyAvLyBiZXR3ZWVuCi0JCQkvLyAiQG1lZGlhIgotCQkJLy8gYW5kCi0JCQkvLyBtZWRpYXR5cGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoY2hpbGQgIT0gbnVsbCAmJiAoY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCB8fCBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSkgeyAvLyBiZXR3ZWVuCi0JCQkvLyBtZWRpYXR5cGUKLQkJCS8vIGFuZAotCQkJLy8gdGhlCi0JCQkvLyBmaXJzdAotCQkJLy8gc3R5bGUKLQkJCS8vIHJ1bGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gYmV0d2VlbiBzdHlsZXMKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgPT0gcmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSA9PSBudWxsIHx8IG5vZGUuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlib29sZWFuIGJJbkN1cmx5QnJhY2UgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKCFiSW5DdXJseUJyYWNlKQotCQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJZWxzZQotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQkJCQlpZiAocmVnaW9uc1tpXS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJCWJJbkN1cmx5QnJhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCVN0cmluZyBkZWxpbSA9IGdldExpbmVEZWxpbWl0ZXIobm9kZSk7Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIG5vZGUuZ2V0TGFzdENoaWxkKCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICJ7Iiwgc291cmNlKTsvLyROT04tTkxTLTEkCi0JCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudChub2RlKSk7Ci0JCQlzb3VyY2UuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZwotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfSBlbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCVN0cmluZyBzdHIgPSBNRURJQTsKLQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBNRURJQS50b1VwcGVyQ2FzZSgpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQl9Ci0JCUlDU1NOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIChjaGlsZCBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLk1lZGlhTGlzdCkgJiYgKChvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QpIGNoaWxkKS5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsICIiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRJZGVudFJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pICYmICFpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuID4gMCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpOwotCQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKS5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQlyZXR1cm4gbiAtIDE7Ci0JCQlyZXR1cm4gbjsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTWVkaWFSdWxlRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IE1lZGlhUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05vZGUKLQkgKiBAcGFyYW0gaW5zZXJ0UG9zCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkgeyAvLyBpbnNlcnRlZAotCQkJLy8gZmlyc3QKLQkJCS8vIHN0eWxlCi0JCQkvLyBydWxlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRQb3MpOwotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJcmVnaW9uID0gaXQubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChubm9kZS5nZXRFbmRPZmZzZXQoKSA8PSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpbnQgcG9zID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSAtIGluc2VydFBvczsKLQkJCXJldHVybiAocG9zID49IDApID8gcG9zIDogMDsKLQotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRMZW5ndGhUb1JlZm9ybWF0QWZ0ZXIobm9kZSwgaW5zZXJ0UG9zKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBpbnQgaW5zZXJ0UG9zKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJSW5kZXhlZFJlZ2lvbiBubm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaW5zZXJ0UG9zIDw9IDAgfHwgIW5ub2RlLmNvbnRhaW5zKGluc2VydFBvcyAtIDEpKQotCQkJcmV0dXJuIDA7Ci0KLQkJaWYgKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5leHRTaWJsaW5nKCkgPT0gbm9kZS5nZXRMYXN0Q2hpbGQoKSkgeyAvLyBpbnNlcnRlZAotCQkJLy8gZmlyc3QKLQkJCS8vIHN0eWxlCi0JCQkvLyBydWxlCi0JCQlpbnQgcG9zID0gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAocG9zIDw9IDApCi0JCQkJcG9zID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpICsgNiAvKgotCQkJCQkJCQkJCQkJCQkJCQkgKiBsZW5ndGgKLQkJCQkJCQkJCQkJCQkJCQkJICogb2YKLQkJCQkJCQkJCQkJCQkJCQkJICogIkBtZWRpYSIKLQkJCQkJCQkJCQkJCQkJCQkJICovOwotCQkJcmV0dXJuIGluc2VydFBvcyAtIHBvczsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEJlZm9yZShub2RlLCBpbnNlcnRQb3MpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QYWdlUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUGFnZVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNkZTk0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QYWdlUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQYWdlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFBhZ2VSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVjbENvbnRhaW5lckZvcm1hdHRlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgUEFHRSA9ICJAcGFnZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFBhZ2VSdWxlRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUGFnZVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTUGFnZVJ1bGUuU0VMRUNUT1IuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSAtIDEpOwotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCQlpdC5uZXh0KCk7Ci0JCQkJaWYgKGl0Lmhhc05leHQoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXh0ID0gaXQubmV4dCgpOwotCQkJCQlpZiAobmV4dC5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZXh0KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQljb250ZXh0LmVuZCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldEF0dHJJbnNlcnRQb3Mobm9kZSwgYXR0ci5nZXROYW1lKCkpOwotCQkJCWNvbnRleHQuc3RhcnQgPSBwb3M7Ci0JCQkJY29udGV4dC5lbmQgPSBwb3M7Ci0JCQkJLyoKLQkJCQkgKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0KLQkJCQkgKiBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldE5vZGVBdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJICogSVRleHRSZWdpb24gcmVnaW9uID0KLQkJCQkgKiBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJICogaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuUykgewotCQkJCSAqIGNvbnRleHQuc3RhcnQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsgY29udGV4dC5lbmQgPQotCQkJCSAqIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsgfSBlbHNlIHsgY29udGV4dC5zdGFydCA9Ci0JCQkJICogZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCkgKyAxOyBjb250ZXh0LmVuZCA9Ci0JCQkJICogZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7IH0KLQkJCQkgKi99Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlTdHJpbmcgdmFsID0gYXR0ci5nZXRWYWx1ZSgpOwotCQkJaWYgKHZhbCAhPSBudWxsICYmIHZhbC5sZW5ndGgoKSA+IDApIHsKLQkJCQlidWYuYXBwZW5kKHZhbCk7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgIiIsIGJ1Zik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJCX0KLQkJfQotCQllbHNlIHsgLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlTdHJpbmcgc3RyID0gUEFHRTsKLQkJCWlmIChDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBQQUdFLnRvVXBwZXJDYXNlKCk7Ci0JCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlzdHIgPSAoKElDU1NQYWdlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JUZXh0KCk7Ci0JCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID4gMCkgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHN0ciwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQl9Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAieyIsIHNvdXJjZSk7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgieyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgKGkgPT0gMCkgPyBvdXRzaWRlWzBdIDogcmVnaW9uc1tpIC0gMV0sIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZElkZW50UmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkpIHsKLQkJCWlmIChpc0luY2x1ZGVzUHJlRW5kKG5vZGUsIHJlZ2lvbikpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCWVsc2UKLQkJCQlhcHBlbmRTcGFjZUJldHdlZW4obm9kZSwgcmVnaW9uc1tyZWdpb25zLmxlbmd0aCAtIDFdLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRBdHRySW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHJOYW1lID09IG51bGwgfHwgYXR0ck5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoIUlDU1NQYWdlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU1BhZ2VSdWxlLlNFTEVDVE9SKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkKLQkJCXJldHVybiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWVsc2UgaWYgKCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCXJlZ2lvbiA9IGl0Lm5leHQoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkJCXJldHVybiBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPj0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBQYWdlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBQYWdlUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1ByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9QcmltaXRpdmVWYWx1ZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODU1ZTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1ByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmltaXRpdmVWYWx1ZUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVByaW1pdGl2ZVZhbHVlRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJaWYgKGVuZCA+IDApIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlib29sZWFuIGFwcGVuZFF1b3RlID0gcmVnaW9ucy5sZW5ndGggPiAxICYmIG5vZGUuZ2V0UGFyZW50Tm9kZSgpIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0gJiYgaXNDbGVhbnVwKCkgJiYgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzUXVvdGVWYWx1ZXMoKSAmJiAoKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZS5nZXRQYXJlbnROb2RlKCkpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpIHx8ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUuZ2V0UGFyZW50Tm9kZSgpKS5nZXRQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSkgfHwgKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZS5nZXRQYXJlbnROb2RlKCkpLmdldFByb3BlcnR5TmFtZSgpLmVxdWFscyhQcm9wQ01Qcm9wZXJ0eS5QX1ZPSUNFX0ZBTUlMWSkpOwotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQotCQkJU3RyaW5nQnVmZmVyIHN0ckJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJvb2xlYW4gc2tpcFNwYWNlID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwICYmICFza2lwU3BhY2UpCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHN0ckJ1Zik7Ci0JCQkJc2tpcFNwYWNlID0gZmFsc2U7Ci0JCQkJc3RyQnVmLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pCi0JCQkJCXNraXBTcGFjZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChhcHBlbmRRdW90ZSkgewotCQkJCXNvdXJjZS5hcHBlbmQocXVvdGUpOwotCQkJCVN0cmluZyBzdHIgPSBzdHJCdWYudG9TdHJpbmcoKTsKLQkJCQlzdHIgPSBzdHIucmVwbGFjZSgnXCcnLCAnICcpOwotCQkJCXN0ciA9IHN0ci5yZXBsYWNlKCdcIicsICcgJyk7Ci0JCQkJc3RyID0gc3RyLnRyaW0oKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQkJc291cmNlLmFwcGVuZChxdW90ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzb3VyY2UuYXBwZW5kKHN0ckJ1Zik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQkJCXNob3J0IHR5cGUgPSB2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCk7Ci0JCQlTdHJpbmcgcXVvdGUgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCi0JCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJCWlmICh2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpID09ICgoaW50KSB2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpKSkgewotCQkJCQkJc3RyID0gSW50ZWdlci50b1N0cmluZygoaW50KSB2YWx1ZS5nZXRGbG9hdFZhbHVlKHR5cGUpKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXN0ciA9IEZsb2F0LnRvU3RyaW5nKHZhbHVlLmdldEZsb2F0VmFsdWUodHlwZSkpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSEFTSCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOSEVSSVRfUFJJTUlUSVZFIDoKLQkJCQkJc3RyID0gdmFsdWUuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJaWYgKHN0ciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQkJCQlzdHIgPSBzdHIudG9VcHBlckNhc2UoKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlzdHIudG9Mb3dlckNhc2UoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TVFJJTkcgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQVRUUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSQU5HRSA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0ZPUk1BVCA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0xPQ0FMIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09NTUEgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19TTEFTSCA6Ci0JCQkJCXN0ciA9IHZhbHVlLmdldFN0cmluZ1ZhbHVlKCk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBwcmVTdHIgPSBudWxsLCBwb3N0U3RyID0gbnVsbDsKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIgOgotCQkJCQlwcmVTdHIgPSAiYXR0cigiOy8vJE5PTi1OTFMtMSQKLQkJCQkJcG9zdFN0ciA9ICIpIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NNIDoKLQkJCQkJcG9zdFN0ciA9ICJjbSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQkvLyBjYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfQ09VTlRFUjoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19ERUcgOgotCQkJCQlwb3N0U3RyID0gImRlZyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FTVMgOgotCQkJCQlwb3N0U3RyID0gImVtIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0VYUyA6Ci0JCQkJCXBvc3RTdHIgPSAiZXgiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfR1JBRCA6Ci0JCQkJCXBvc3RTdHIgPSAiZ3JhZCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19IWiA6Ci0JCQkJCXBvc3RTdHIgPSAiSHoiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU4gOgotCQkJCQlwb3N0U3RyID0gImluIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJCXBvc3RTdHIgPSAia0h6IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX01NIDoKLQkJCQkJcG9zdFN0ciA9ICJtbSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJCXBvc3RTdHIgPSAibXMiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCQlwb3N0U3RyID0gInBjIjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BFUkNFTlRBR0UgOgotCQkJCQlwb3N0U3RyID0gIiUiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUFQgOgotCQkJCQlwb3N0U3RyID0gInB0IjsvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQkJcG9zdFN0ciA9ICJweCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19SQUQgOgotCQkJCQlwb3N0U3RyID0gInJhZCI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQkvLyBjYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkVDVDoKLQkJCQkvLyBjYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkdCQ09MT1I6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJCXBvc3RTdHIgPSAicyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19TVFJJTkcgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9IHF1b3RlOwotCQkJCQlwb3N0U3RyID0gcXVvdGU7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSA6Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzdHIsIHF1b3RlKTsKLQkJCQkJcHJlU3RyID0gInVybCgiICsgcXVvdGU7Ly8kTk9OLU5MUy0xJAotCQkJCQlwb3N0U3RyID0gcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQkvLyB0aGUgZm9sbG93aW5ncyBhcmUgb3JpZ2luYWwgcHJpbWl0aXZlIHZhbHVlcwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lERU5UIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VTktOT1dOIDoKLQkJCQkvLyB1c2Ugc3RyCi0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOVEVHRVIgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19IQVNIIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfU0xBU0ggOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT01NQSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19OVU1CRVIgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19JTkhFUklUX1BSSU1JVElWRSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkFOR0UgOgotCQkJCQlwcmVTdHIgPSAiVSsiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0ZPUk1BVCA6Ci0JCQkJCXF1b3RlID0gQ1NTVXRpbC5kZXRlY3RRdW90ZShzdHIsIHF1b3RlKTsKLQkJCQkJcHJlU3RyID0gImZvcm1hdCgiICsgcXVvdGU7Ly8kTk9OLU5MUy0xJAotCQkJCQlwb3N0U3RyID0gcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTE9DQUwgOgotCQkJCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUoc3RyLCBxdW90ZSk7Ci0JCQkJCXByZVN0ciA9ICJsb2NhbCgiICsgcXVvdGU7Ly8kTk9OLU5MUy0xJAotCQkJCQlwb3N0U3RyID0gcXVvdGUgKyAiKSI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSB7Ci0JCQkJaWYgKHByZVN0ciAhPSBudWxsKQotCQkJCQlwcmVTdHIgPSBwcmVTdHIudG9VcHBlckNhc2UoKTsKLQkJCQlpZiAocG9zdFN0ciAhPSBudWxsKQotCQkJCQlwb3N0U3RyID0gcG9zdFN0ci50b1VwcGVyQ2FzZSgpOwotCQkJfQotCQkJaWYgKHByZVN0ciAhPSBudWxsKQotCQkJCXNvdXJjZS5hcHBlbmQocHJlU3RyKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkKLQkJCQlzb3VyY2UuYXBwZW5kKHN0cik7Ci0JCQlpZiAocG9zdFN0ciAhPSBudWxsKQotCQkJCXNvdXJjZS5hcHBlbmQocG9zdFN0cik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcFZhbHVlUmVnaW9uKHJlZ2lvbnNbaV0sIHN0Z3kpKTsKLQkJfQotCQlpZiAobmVlZFMob3V0c2lkZVsxXSkgJiYgIWlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgUHJpbWl0aXZlVmFsdWVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SR0JGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjkwOWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvZm9ybWF0dGVyL1JHQkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJHQkZvcm1hdHRlciBleHRlbmRzIEZ1bmN0aW9uRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFJHQkZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVJHQkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bmMoKSB7Ci0JCXJldHVybiAicmdiKCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFJHQkZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBSR0JGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9SZWN0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZWM4MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvUmVjdEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlY3RGb3JtYXR0ZXIgZXh0ZW5kcyBGdW5jdGlvbkZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBSZWN0Rm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JUmVjdEZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZ1bmMoKSB7Ci0JCXJldHVybiAicmVjdCgiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBSZWN0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFJlY3RGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xJdGVtRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZjkxMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsSXRlbUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVEZWNsSXRlbUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3R5bGVEZWNsSXRlbUZvcm1hdHRlciBpbnN0YW5jZTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGVuZEFmdGVyQ29sb25TcGFjZShJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaW50IG4gPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNKTsKLQotCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkgPiAwICYmICghcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUikgfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSAhPSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZ2V0TGFzdExpbmVMZW5ndGgobm9kZSwgc291cmNlKTsKLQkJCWludCBhcHBlbmQgPSBnZXRGaXJzdENoaWxkUmVnaW9uTGVuZ3RoKG5vZGUpOwotCQkJaWYgKGxlbmd0aCArIG4gKyBhcHBlbmQgPiBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSkgewotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0TGluZURlbGltaXRlcihub2RlKSk7Ci0JCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCXNvdXJjZS5hcHBlbmQoZ2V0SW5kZW50U3RyaW5nKCkpOwotCQkJCW4gPSAwOyAvLyBubyBzcGFjZSBpcyBuZWNlc3NhcnkKLQkJCX0KLQkJfQotCQkvLyBubyBkZWxpbWl0ZXIgY2FzZQotCQl3aGlsZSAobi0tID4gMCkKLQkJCXNvdXJjZS5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0Rmlyc3RDaGlsZFJlZ2lvbkxlbmd0aChJQ1NTTm9kZSBub2RlKSB7Ci0JCUlDU1NOb2RlIGZpcnN0Q2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiAxOwotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGZpcnN0Q2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ciA9IG5ldyBSZWdpb25JdGVyYXRvcihub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBzdGFydCk7Ci0JCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWcgPSBpdHIubmV4dCgpOwotCQkJaWYgKHJlZyAhPSBudWxsICYmIHJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJcmV0dXJuIHJlZy5nZXRUZXh0TGVuZ3RoKCk7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQuZXF1YWxzSWdub3JlQ2FzZShhdHRyLmdldE5hbWUoKSkpCi0JCQlyZXR1cm4gYnVmOwotCi0JCS8vIGdldCByZWdpb24gdG8gcmVwbGFjZQotCQlpZiAoY29udGV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWl0LnByZXYoKTsKLQkJCQlpZiAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHByZXYgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChwcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykKLQkJCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwcmV2KTsKLQkJCQkJZWxzZQotCQkJCQkJY29udGV4dC5zdGFydCA9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlCi0JCQkJCWNvbnRleHQuc3RhcnQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQl9IGVsc2UgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWNvbnRleHQuZW5kID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJY29udGV4dC5zdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCQljb250ZXh0LmVuZCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBnZW5lcmF0ZSB0ZXh0Ci0JCWlmIChpbnNlcnQgJiYgYXR0ci5nZXRWYWx1ZSgpICE9IG51bGwgJiYgYXR0ci5nZXRWYWx1ZSgpLmxlbmd0aCgpID4gMCkgewotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgYXR0ci5nZXRWYWx1ZSgpLCBidWYpOwotCQkJYnVmLmFwcGVuZChhdHRyLmdldFZhbHVlKCkpOwotCQl9Ci0JCXJldHVybiBidWY7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UsIElSZWdpb24gZXhjZXB0Rm9yKSB7Ci0JCUlDU1NOb2RlIHByZXYgPSAoY2hpbGQgIT0gbnVsbCkgPyBjaGlsZC5nZXRQcmV2aW91c1NpYmxpbmcoKSA6IG5vZGUuZ2V0TGFzdENoaWxkKCk7Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgbnVsbCk7Ci0JCQl9Ci0JCQkvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMiwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJLy8gYmUKLQkJCQkvLyBjb21tZW50cwotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQlpZiAoKChJQ1NTUHJpbWl0aXZlVmFsdWUpIGNoaWxkKS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19DT01NQSkKLQkJCQl0b0FwcGVuZCA9ICIsIjsvLyROT04tTkxTLTEkCi0JCQllbHNlIGlmICgoKElDU1NQcmltaXRpdmVWYWx1ZSkgY2hpbGQpLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1NMQVNIKQotCQkJCXRvQXBwZW5kID0gIi8iOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiB0b0FwcGVuZCAhPSBudWxsICYmICF0b0FwcGVuZC5lcXVhbHMoIiwiKSAmJiAhdG9BcHBlbmQuZXF1YWxzKCIvIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIElDU1NOb2RlIGNoaWxkLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAyLCBzdGd5KSk7IC8vIG11c3QgYmUKLQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlpZiAodG9BcHBlbmQgIT0gIiwiICYmIHRvQXBwZW5kICE9ICIvIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHRvQXBwZW5kLCBzb3VyY2UpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UG9zdChJQ1NTTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJaWYgKGVuZCA+IDAgJiYgc3RhcnQgPCBlbmQpIHsgLy8gZm9ybWF0IHNvdXJjZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCS8vIGFwcGVuZCAiIWltcG9ydGFudCIKLQkJCVN0cmluZyBwcmlvcml0eSA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUpLmdldFByaW9yaXR5KCk7Ci0JCQlpZiAocHJpb3JpdHkgIT0gbnVsbCAmJiBwcmlvcml0eS5sZW5ndGgoKSA+IDApIHsKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBwcmlvcml0eSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKHByaW9yaXR5KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkSWRlbnRSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0UHJlKElDU1NOb2RlIG5vZGUsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0RW5kT2Zmc2V0KCkgPiAwKSA/ICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldFN0YXJ0T2Zmc2V0KCkgOiBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwKQotCQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUHJvcE5hbWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9IGVsc2UgeyAvLyBnZW5lcmF0b2Ugc291cmNlCi0JCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtID0gKElDU1NTdHlsZURlY2xJdGVtKSBub2RlOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzb3VyY2UuYXBwZW5kKGl0ZW0uZ2V0UHJvcGVydHlOYW1lKCkudG9VcHBlckNhc2UoKSk7Ci0JCQllbHNlCi0JCQkJc291cmNlLmFwcGVuZChpdGVtLmdldFByb3BlcnR5TmFtZSgpKTsKLQotCQkJaW50IGsgPSBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0pOwotCQkJaWYgKHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpID4gMCAmJiAoIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFKSkgewotCQkJCWludCBsZW5ndGggPSBnZXRMYXN0TGluZUxlbmd0aChub2RlLCBzb3VyY2UpOwotCQkJCWludCBhcHBlbmQgPSAxOwotCQkJCWlmIChsZW5ndGggKyBrICsgYXBwZW5kID4gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpIHsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRMaW5lRGVsaW1pdGVyKG5vZGUpKTsKLQkJCQkJc291cmNlLmFwcGVuZChnZXRJbmRlbnQobm9kZSkpOwotCQkJCQlzb3VyY2UuYXBwZW5kKGdldEluZGVudFN0cmluZygpKTsKLQkJCQkJayA9IDA7IC8vIG5vIHNwYWNlIGlzIG5lY2Vzc2FyeQotCQkJCX0KLQkJCX0KLQkJCS8vIG5vIGRlbGltaXRlciBjYXNlCi0JCQl3aGlsZSAoay0tID4gMCkKLQkJCQlzb3VyY2UuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJc291cmNlLmFwcGVuZCgiOiIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIWlzQ2xlYW51cCgpIHx8IGdldENsZWFudXBTdHJhdGVneShub2RlKS5pc0Zvcm1hdFNvdXJjZSgpKSB7Ci0JCQlhcHBlbmRBZnRlckNvbG9uU3BhY2Uobm9kZSwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wTmFtZVJlZ2lvbihyZWdpb25zW2ldLCBzdGd5KSk7Ci0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pICYmICghaXNDbGVhbnVwKCkgfHwgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpLmlzRm9ybWF0U291cmNlKCkpKSB7Ci0JCQkJYXBwZW5kQWZ0ZXJDb2xvblNwYWNlKG5vZGUsIHNvdXJjZSk7Ci0JCQl9IGVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCBvdXRzaWRlWzFdLCBzb3VyY2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRWYWx1ZShJQ1NTTm9kZSBub2RlKSB7Ci0JCVN0cmluZ0J1ZmZlciBzb3VyY2UgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvcm1hdENoaWxkcmVuKG5vZGUsIHNvdXJjZSk7Ci0KLQkJcmV0dXJuIHNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU1N0eWxlRGVjbEl0ZW0uSU1QT1JUQU5ULmVxdWFsc0lnbm9yZUNhc2UoYXR0ck5hbWUpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlDU1NBdHRyIGF0dHIgPSAoSUNTU0F0dHIpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShJQ1NTU3R5bGVEZWNsSXRlbS5JTVBPUlRBTlQpOwotCQlpZiAoYXR0ciAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJcmV0dXJuICgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSW5kZXhlZFJlZ2lvbiBpTm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQlpZiAoaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgPD0gMCkKLQkJCXJldHVybiAtMTsKLQotCQlDb21wb3VuZFJlZ2lvbiByZWdpb25zW10gPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG5ldyBGb3JtYXRSZWdpb24oaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBpTm9kZS5nZXRTdGFydE9mZnNldCgpKSwgZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpKTsKLQkJZm9yIChpbnQgaSA9IHJlZ2lvbnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChyZWdpb25zW2ldLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UKQotCQkJCXJldHVybiByZWdpb25zW2ldLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGlOb2RlLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q2hpbGRJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSkgewotCQlpbnQgbiA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChuIDwgMCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwgJiYgZmxhdE5vZGUuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCW4gLT0gZmxhdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCX0KLQkJaWYgKG4gPiAwKSB7Ci0JCQlTdHJpbmcgaW1wb3J0YW50ID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJpb3JpdHkoKTsKLQkJCWlmIChpbXBvcnRhbnQgIT0gbnVsbCAmJiBpbXBvcnRhbnQubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJLy8gZmluZCBiZWZvcmUgIiFpbXBvcnRhbnQiIHBvc2l0aW9uCi0JCQkJZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobiAtIDEpKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQkJaWYgKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IGZsYXROb2RlKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JTVBPUlRBTlQpCi0JCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBza2lwIGxhc3Qgc3BhY2UKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuIC0gMSk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQluIC09IHJlZ2lvbi5nZXRMZW5ndGgoKSAtIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQl9Ci0KLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZURlY2xJdGVtRm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlRGVjbEl0ZW1Gb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDY2MzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGV4dGVuZHMgRGVmYXVsdENTU1NvdXJjZUZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyIGluc3RhbmNlOwotCi0JLyoqCi0JICogCi0JICovCi0JU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSwgSVJlZ2lvbiBleGNlcHRGb3IpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSUNTU05vZGUgcHJldiA9IChjaGlsZCAhPSBudWxsKSA/IGNoaWxkLmdldFByZXZpb3VzU2libGluZygpIDogbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaW50IHN0YXJ0ID0gKHByZXYgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIHByZXYpLmdldEVuZE9mZnNldCgpIDogMDsKLQkJaW50IGVuZCA9IChjaGlsZCAhPSBudWxsKSA/ICgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCkgOiAwOwotCi0JCS8vIGNoZWNrIG5vIGNoaWxkCi0JCWlmIChjaGlsZCA9PSBudWxsICYmIHByZXYgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoc3RhcnQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7IC8vIGZvcm1hdCBzb3VyY2UKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOwotCQkJCWlmIChwcmV2ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCQkJcGlja3VwVHlwZSA9IG51bGw7Ci0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIGV4Y2VwdEZvciwgcGlja3VwVHlwZSk7Ci0JCQl9Ci0JCQkvLyBleHRyYWN0IHNvdXJjZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7IC8vIG11c3QKLQkJCQkvLyBiZQotCQkJCS8vIGNvbW1lbnRzCi0JCQl9Ci0JCX0gZWxzZSBpZiAocHJldiAhPSBudWxsICYmIGNoaWxkICE9IG51bGwpIHsgLy8gZ2VuZXJhdGUgc291cmNlIDoKLQkJCS8vIGJldHdlZW4gdHdvCi0JCQkvLyBkZWNsYXJhdGlvbnMKLQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAocHJldiA9PSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6IGJlZm9yZSB0aGUgZmlyc3QKLQkJCS8vIGRlY2xhcmF0aW9uCi0JCQlvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvciBpdCA9IG51bGw7Ci0JCQlpZiAoZW5kID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVuZCAtIDEpOwotCQkJfSBlbHNlIHsKLQkJCQlpbnQgcG9zID0gZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCQkJaWYgKHBvcyA+PSAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJaXQgPSBuZXcgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3MgLSAxKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXQgIT0gbnVsbCkgewotCQkJCWludCBsaW1pdCA9ICgoSW5kZXhlZFJlZ2lvbikgKChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSA/IG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSkpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBjdXJSZWcgPSBpdC5wcmV2KCk7Ci0JCQkJCWlmIChjdXJSZWcuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKQotCQkJCQkJYnJlYWs7Ci0JCQkJCWlmIChjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TICYmIGN1clJlZy5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCXNvdXJjZS5hcHBlbmQoIjsiKTsvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoY3VyUmVnKSA8PSBsaW1pdCkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChjaGlsZCA9PSBudWxsKSB7IC8vIGdlbmVyYXRlIHNvdXJjZSA6IGFmdGVyIHRoZSBsYXN0Ci0JCQkvLyBkZWNsYXJhdGlvbgotCQkJb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3IgaXQgPSBudWxsOwotCQkJaWYgKHN0YXJ0ID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlpdCA9IG5ldyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCWl0ID0gbmV3IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaXQgIT0gbnVsbCkgewotCQkJCWludCBsaW1pdCA9ICgoSW5kZXhlZFJlZ2lvbikgKChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSA/IG5vZGUuZ2V0UGFyZW50Tm9kZSgpIDogbm9kZSkpLmdldEVuZE9mZnNldCgpOwotCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gY3VyUmVnID0gaXQubmV4dCgpOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFIHx8IGN1clJlZy5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikKLQkJCQkJCWJyZWFrOwotCQkJCQlpZiAoY3VyUmVnLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBjdXJSZWcuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlzb3VyY2UuYXBwZW5kKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaWYgKGxpbWl0IDw9IGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChjdXJSZWcpKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkJLy8gZ2V0IG5leHQgcmVnaW9uCi0JCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCUNvbXBvdW5kUmVnaW9uIHRvQXBwZW5kUmVnaW9uID0gbnVsbDsKLQkJCQlpZiAocG9zID49IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHBvcyk7Ci0JCQkJCXRvQXBwZW5kUmVnaW9uID0gbmV3IENvbXBvdW5kUmVnaW9uKGZsYXROb2RlLCBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3MpKTsKLQkJCQl9Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZS5nZXRQYXJlbnROb2RlKCksIHRvQXBwZW5kUmVnaW9uLCBzb3VyY2UpOwotCQkJfQotCQl9IGVsc2UgaWYgKChwcmV2ICE9IG51bGwgfHwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSA8PSAwKSkgewotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkgJiYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUgfHwgIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZSBpZiAocHJldiAhPSBudWxsIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUpCi0JCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgdG9BcHBlbmQsIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRCZWZvcmUoSUNTU05vZGUgbm9kZSwgSUNTU05vZGUgY2hpbGQsIElSZWdpb24gcmVnaW9uLCBTdHJpbmcgdG9BcHBlbmQsIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkvLyBjb21tZW50cwotCQl9Ci0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgJiYgcHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX09ORV9QRVJfTElORSkgJiYgKG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpICE9IG5vZGUgfHwgIXByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKSkgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQl9IGVsc2UKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCB0b0FwcGVuZCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENoaWxkSW5zZXJ0UG9zKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQkJaW50IHBvcyA9IHN1cGVyLmdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAocG9zIDwgMCkgewotCQkJQ1NTU291cmNlR2VuZXJhdG9yIGZvcm1hdHRlciA9IGdldFBhcmVudEZvcm1hdHRlcihub2RlKTsKLQkJCXJldHVybiAoZm9ybWF0dGVyICE9IG51bGwpID8gZm9ybWF0dGVyLmdldENoaWxkSW5zZXJ0UG9zKG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSA6IC0xOwotCQl9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU3R5bGVEZWNsYXJhdGlvbkZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZURlY2xhcmF0aW9uRm9ybWF0dGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPCAwIHx8ICFubm9kZS5jb250YWlucyhpbnNlcnRQb3MpKSB7Ci0JCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCAmJiBubm9kZS5nZXRFbmRPZmZzZXQoKSA8PSAwKSB7Ci0JCQkJQ1NTU291cmNlR2VuZXJhdG9yIHBudEZvcm1hdHRlciA9IGdldFBhcmVudEZvcm1hdHRlcihub2RlKTsKLQkJCQlpZiAocG50Rm9ybWF0dGVyICE9IG51bGwpCi0JCQkJCXJldHVybiBwbnRGb3JtYXR0ZXIuZ2V0TGVuZ3RoVG9SZWZvcm1hdEFmdGVyKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBpbnNlcnRQb3MpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aFRvUmVmb3JtYXRBZnRlcihub2RlLCBpbnNlcnRQb3MpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICogQHBhcmFtIGluc2VydFBvcwotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKElDU1NOb2RlIG5vZGUsIGludCBpbnNlcnRQb3MpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlJbmRleGVkUmVnaW9uIG5ub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCWlmIChpbnNlcnRQb3MgPD0gMCB8fCAhbm5vZGUuY29udGFpbnMoaW5zZXJ0UG9zIC0gMSkpIHsKLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsICYmIG5ub2RlLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCQlDU1NTb3VyY2VHZW5lcmF0b3IgcG50Rm9ybWF0dGVyID0gZ2V0UGFyZW50Rm9ybWF0dGVyKG5vZGUpOwotCQkJCWlmIChwbnRGb3JtYXR0ZXIgIT0gbnVsbCkKLQkJCQkJcmV0dXJuIHBudEZvcm1hdHRlci5nZXRMZW5ndGhUb1JlZm9ybWF0QmVmb3JlKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBpbnNlcnRQb3MpOwotCQkJfQotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldExlbmd0aFRvUmVmb3JtYXRCZWZvcmUobm9kZSwgaW5zZXJ0UG9zKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVSdWxlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5MzU2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVJ1bGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXR0ZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNTU0NsZWFudXBTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0F0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVSdWxlRm9ybWF0dGVyIGV4dGVuZHMgRGVjbENvbnRhaW5lckZvcm1hdHRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZVJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHlsZVJ1bGVGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBmb3JtYXRBdHRyQ2hhbmdlZChJQ1NTTm9kZSBub2RlLCBJQ1NTQXR0ciBhdHRyLCBib29sZWFuIGluc2VydCwgQXR0ckNoYW5nZUNvbnRleHQgY29udGV4dCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBidWY7Ci0KLQkJaWYgKCFJQ1NTU3R5bGVSdWxlLlNFTEVDVE9SLmVxdWFsc0lnbm9yZUNhc2UoYXR0ci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGJ1ZjsKLQotCQkvLyBnZXQgcmVnaW9uIHRvIHJlcGxhY2UKLQkJaWYgKGNvbnRleHQgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgYXR0cikuZ2V0RW5kT2Zmc2V0KCkgLSAxKTsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCgoKEluZGV4ZWRSZWdpb24pIGF0dHIpLmdldEVuZE9mZnNldCgpIC0gMSk7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQkJaXQubmV4dCgpOwotCQkJCWlmIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJSVRleHRSZWdpb24gbmV4dCA9IGl0Lm5leHQoKTsKLQkJCQkJaWYgKG5leHQuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmV4dCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRleHQuZW5kID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJY29udGV4dC5lbmQgPSBpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQljb250ZXh0LnN0YXJ0ID0gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KCgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQljb250ZXh0LnN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNvbnRleHQuc3RhcnQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJY29udGV4dC5lbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZ2VuZXJhdGUgdGV4dAotCQlpZiAoaW5zZXJ0KSB7Ci0JCQlidWYuYXBwZW5kKGF0dHIuZ2V0VmFsdWUoKSk7Ci0JCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCAiIiwgYnVmKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGJ1ZjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAobm9kZS5nZXRGaXJzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRFbmRPZmZzZXQoKSA+IDApID8gKChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKSkuZ2V0U3RhcnRPZmZzZXQoKSA6IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW2kgLSAxXSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFNlbGVjdG9yUmVnaW9uKHJlZ2lvbnNbaV0sIChpICE9IDApID8gcmVnaW9uc1tpIC0gMV0gOiBudWxsLCBzdGd5KSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7IC8vIGdlbmVyYXRlIHNvdXJjZQotCQkJU3RyaW5nIHN0ciA9ICgoSUNTU1N0eWxlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JUZXh0KCk7Ci0JCQkvLyBhcHBlbmRTcGFjZUJlZm9yZShub2RlLHN0cixzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChzdHIpOwotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgInsiLCBzb3VyY2UpOy8vJE5PTi1OTFMtMSQKLQkJCXNvdXJjZS5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIFN0cmluZ0J1ZmZlciBzb3VyY2UpIHsKLQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uLCBzdGd5KTsKLQkJQ29tcG91bmRSZWdpb25bXSBvdXRzaWRlID0gZ2V0T3V0c2lkZVJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChpICE9IDAgfHwgbmVlZFMob3V0c2lkZVswXSkpCi0JCQkJYXBwZW5kU3BhY2VCZXR3ZWVuKG5vZGUsIChpID09IDApID8gb3V0c2lkZVswXSA6IHJlZ2lvbnNbaSAtIDFdLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRTZWxlY3RvclJlZ2lvbihyZWdpb25zW2ldLCAoaSAhPSAwKSA/IHJlZ2lvbnNbaSAtIDFdIDogbnVsbCwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJZWxzZQotCQkJCWFwcGVuZFNwYWNlQmV0d2Vlbihub2RlLCByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0sIG91dHNpZGVbMV0sIHNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJJbnNlcnRQb3MoSUNTU05vZGUgbm9kZSwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgYXR0ck5hbWUgPT0gbnVsbCB8fCBhdHRyTmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmICghSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUi5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkKLQkJCXJldHVybiAtMTsKLQotCQlJQ1NTQXR0ciBhdHRyID0gKElDU1NBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oSUNTU1N0eWxlUnVsZS5TRUxFQ1RPUik7Ci0JCWlmIChhdHRyICE9IG51bGwgJiYgKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRFbmRPZmZzZXQoKSA+IDApCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBhdHRyKS5nZXRTdGFydE9mZnNldCgpOwotCQllbHNlCi0JCQlyZXR1cm4gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0eWxlUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBTdHlsZVJ1bGVGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9TdHlsZVNoZWV0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzE5ODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvU3R5bGVTaGVldEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdHRlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVTaGVldEZvcm1hdHRlciBleHRlbmRzIEFic3RyYWN0Q1NTU291cmNlRm9ybWF0dGVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0eWxlU2hlZXRGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHlsZVNoZWV0Rm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgU3RyaW5nIHRvQXBwZW5kLCBTdHJpbmdCdWZmZXIgc291cmNlLCBJUmVnaW9uIGV4Y2VwdEZvcikgewotCQlTdHJpbmcgZGVsaW0gPSBnZXRMaW5lRGVsaW1pdGVyKG5vZGUpOwotCQlJQ1NTTm9kZSBwcmV2ID0gKGNoaWxkICE9IG51bGwpID8gY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCkgOiBub2RlLmdldExhc3RDaGlsZCgpOwotCQlpZiAocHJldiA9PSBudWxsICYmIGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBzdGFydCA9IChwcmV2ICE9IG51bGwpID8gKChJbmRleGVkUmVnaW9uKSBwcmV2KS5nZXRFbmRPZmZzZXQoKSA6IDA7Ci0JCWludCBlbmQgPSAoY2hpbGQgIT0gbnVsbCkgPyAoKEluZGV4ZWRSZWdpb24pIGNoaWxkKS5nZXRTdGFydE9mZnNldCgpIDogMDsKLQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8IGVuZCkgewotCQkJQ1NTQ2xlYW51cFN0cmF0ZWd5IHN0Z3kgPSBnZXRDbGVhbnVwU3RyYXRlZ3kobm9kZSk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIGdldCBtZWFuaW5nIHJlZ2lvbnMKLQkJCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IG51bGw7Ci0JCQlpZiAoZXhjZXB0Rm9yID09IG51bGwpCi0JCQkJcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCksIHN0Z3kpOwotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHBpY2t1cFR5cGUgPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSOwotCQkJCWlmIChwcmV2ID09IG51bGwpCi0JCQkJCXBpY2t1cFR5cGUgPSBudWxsOwotCQkJCXJlZ2lvbnMgPSBnZXRSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBleGNlcHRGb3IsIHBpY2t1cFR5cGUpOwotCQkJfQotCQkJLy8gZ2VuZXJhdGUgc291cmNlCi0JCQlpZiAocHJldiAhPSBudWxsKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgKHJlZ2lvbnMubGVuZ3RoID4gMCkgPyByZWdpb25zWzBdIDogbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0Ci0JCQkJCQkJCQkJCQkJCQkJCQkvLyBiZQotCQkJCQkJCQkJCQkJCQkJCQkJLy8gY29tbWVudHMKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9yCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBzZW1pX2NvbG9uCi0JCQkJaWYgKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCQkJLy8gYXBwZW5kIGRlbGltIGFmdGVyCi0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHByZXYgIT0gbnVsbCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQl9Ci0JCWVsc2UgaWYgKHByZXYgIT0gbnVsbCAmJiBjaGlsZCAhPSBudWxsKSB7IC8vIHNvdXJjZSBnZW5lcmF0aW9uIDoKLQkJCQkJCQkJCQkJCQkvLyBiZXR3ZWVuIHR3byBydWxlcwotCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlbGltKTsKLQkJfQotCQllbHNlIGlmICgoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpID4gMCkgewotCQkJaWYgKHByZXYgPT0gbnVsbCkgeyAvLyBzb3VyY2UgZm9ybWF0dGluZyA6IGJlZm9yZSB0aGUgZmlyc3QgcnVsZQotCQkJCUlDU1NOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWludCBwb3MgPSBnZXRDaGlsZEluc2VydFBvcyhub2RlKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbmV4dCkuZ2V0RW5kT2Zmc2V0KCkgPiAwKQotCQkJCQlwb3MgPSAoKEluZGV4ZWRSZWdpb24pIG5leHQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaWYgKHBvcyAhPSAwKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJQ29tcG91bmRSZWdpb25bXSBwcmV2UmVnaW9ucyA9IGdldFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50LCBuZXcgRm9ybWF0UmVnaW9uKDAsIHBvcyksIG51bGwsIG51bGwpOwotCQkJCQlpZiAocHJldlJlZ2lvbnMgIT0gbnVsbCAmJiBwcmV2UmVnaW9ucy5sZW5ndGggPiAwKQotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjaGlsZCA9PSBudWxsKSB7IC8vIHNvdXJjZSBmb3JtYXR0aW5nIDogYWZ0ZXIgdGhlIGxhc3QKLQkJCQkJCQkJCQkvLyBydWxlCi0JCQkJaWYgKHN0YXJ0ID4gMCAmJiBzdGFydCA8PSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIG51bGwsIHNvdXJjZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHN0YXJ0IDw9IDApIHsKLQkJCQkJaW50IHBvcyA9IGdldENoaWxkSW5zZXJ0UG9zKG5vZGUpOwotCQkJCQlpZiAocG9zIDwgKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKSkgewotCQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEJlZm9yZShJQ1NTTm9kZSBub2RlLCBJQ1NTTm9kZSBjaGlsZCwgSVJlZ2lvbiByZWdpb24sIFN0cmluZyB0b0FwcGVuZCwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOyAvLyBtdXN0IGJlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbW1lbnRzCi0JCX0KLQkJaWYgKG5lZWRTKG91dHNpZGVbMV0pKSB7Ci0JCQlpZiAoKChJbmRleGVkUmVnaW9uKSBjaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFBvc3QoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gKG5vZGUuZ2V0TGFzdENoaWxkKCkgIT0gbnVsbCAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0TGFzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJCXNvdXJjZS5hcHBlbmQoZGVjb3JhdGVkUmVnaW9uKHJlZ2lvbnNbaV0sIDAsIHN0Z3kpKTsKLQkJCX0KLQkJCWlmICgocmVnaW9ucyAhPSBudWxsICYmIHJlZ2lvbnMubGVuZ3RoID4gMCAmJiByZWdpb25zW3JlZ2lvbnMubGVuZ3RoIC0gMV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpCi0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlIHsgLy8gc291cmNlIGdlbmVyYXRpb24KLQkJCWlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCBudWxsLCBzb3VyY2UpOwotCQkJcmV0dXJuOyAvLyBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQb3N0KElDU1NOb2RlIG5vZGUsIElSZWdpb24gcmVnaW9uLCBTdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pKQotCQkJCWFwcGVuZERlbGltQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlIG5vZGUsIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCWludCBzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9IChub2RlLmdldEZpcnN0Q2hpbGQoKSAhPSBudWxsICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRGaXJzdENoaWxkKCkpLmdldEVuZE9mZnNldCgpID4gMCkgPyAoKEluZGV4ZWRSZWdpb24pIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpKS5nZXRTdGFydE9mZnNldCgpIDogZ2V0Q2hpbGRJbnNlcnRQb3Mobm9kZSk7Ci0JCWlmIChlbmQgPiAwKSB7Ci0JCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG5ldyBGb3JtYXRSZWdpb24oc3RhcnQsIGVuZCAtIHN0YXJ0KSwgc3RneSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaSAhPSAwIHx8IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgcmVnaW9uc1tpXSwgc291cmNlKTsKLQkJCQlzb3VyY2UuYXBwZW5kKGRlY29yYXRlZFJlZ2lvbihyZWdpb25zW2ldLCAwLCBzdGd5KSk7Ci0JCQl9Ci0JCQlpZiAobm9kZS5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIChzb3VyY2UubGVuZ3RoKCkgPiAwIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpKSB7Ci0JCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChub2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpICE9IG51bGwgJiYgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJYXBwZW5kRGVsaW1CZWZvcmUobm9kZSwgbnVsbCwgc291cmNlKTsKLQkJCS8vIHNvdXJjZS5hcHBlbmQoIjwhLS0iKTsKLQkJCS8vIGFwcGVuZERlbGltQmVmb3JlKG5vZGUsbnVsbCwgc291cmNlKTsKLQkJfQotCQllbHNlCi0JCQlyZXR1cm47IC8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgSVJlZ2lvbiByZWdpb24sIGphdmEubGFuZy5TdHJpbmdCdWZmZXIgc291cmNlKSB7Ci0JCUNTU0NsZWFudXBTdHJhdGVneSBzdGd5ID0gZ2V0Q2xlYW51cFN0cmF0ZWd5KG5vZGUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJQ29tcG91bmRSZWdpb25bXSByZWdpb25zID0gZ2V0UmVnaW9uc1dpdGhvdXRXaGl0ZVNwYWNlcyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbiwgc3RneSk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gb3V0c2lkZSA9IGdldE91dHNpZGVSZWdpb25zKHN0cnVjdHVyZWREb2N1bWVudCwgcmVnaW9uKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSAhPSAwIHx8IG5lZWRTKG91dHNpZGVbMF0pIHx8IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gfHwgbm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkKLQkJCQlhcHBlbmREZWxpbUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRSZWdpb24ocmVnaW9uc1tpXSwgMCwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSkgewotCQkJaWYgKGlzSW5jbHVkZXNQcmVFbmQobm9kZSwgcmVnaW9uKSkgewotCQkJCWlmIChzb3VyY2UubGVuZ3RoKCkgPiAwIHx8IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCQkJU3RyaW5nIGRlbGltID0gZ2V0TGluZURlbGltaXRlcihub2RlKTsKLQkJCQkJc291cmNlLmFwcGVuZChkZWxpbSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRDaGlsZEluc2VydFBvcyhJQ1NTTm9kZSBub2RlKSB7Ci0JCWludCBuID0gKChJbmRleGVkUmVnaW9uKSBub2RlKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG4gPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG4gLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZsYXROb2RlLCByZWdpb24pOwotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZyA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKQotCQkJCQlyZXR1cm4gaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnKTsKLQkJCX0KLQkJCXJldHVybiBuOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZVNoZWV0Rm9ybWF0dGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlU2hlZXRGb3JtYXR0ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9mb3JtYXR0ZXIvVW5rbm93blJ1bGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA2YTQwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL2Zvcm1hdHRlci9Vbmtub3duUnVsZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0dGVyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1Vua25vd25SdWxlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duUnVsZUZvcm1hdHRlciBleHRlbmRzIERlZmF1bHRDU1NTb3VyY2VGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgVW5rbm93blJ1bGVGb3JtYXR0ZXIgaW5zdGFuY2U7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlVbmtub3duUnVsZUZvcm1hdHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRQcmUoSUNTU05vZGUgbm9kZSwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoZW5kID4gMCkgeyAvLyBmb3JtYXQgc291cmNlCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlDb21wb3VuZFJlZ2lvbltdIHJlZ2lvbnMgPSBnZXRSZWdpb25zV2l0aG91dFdoaXRlU3BhY2VzKHN0cnVjdHVyZWREb2N1bWVudCwgbmV3IEZvcm1hdFJlZ2lvbihzdGFydCwgZW5kIC0gc3RhcnQpLCBzdGd5KTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpICE9IDApCi0JCQkJCWFwcGVuZFNwYWNlQmVmb3JlKG5vZGUsIHJlZ2lvbnNbaV0sIHNvdXJjZSk7Ci0JCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQkJfQotCQl9Ci0JCWVsc2UgeyAvLyBnZW5lcmF0ZSBzb3VyY2UKLQkJCUNTU1Vua25vd25SdWxlIHJ1bGUgPSAoQ1NTVW5rbm93blJ1bGUpIG5vZGU7Ci0JCQlzb3VyY2UuYXBwZW5kKHJ1bGUuZ2V0Q3NzVGV4dCgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdFByZShJQ1NTTm9kZSBub2RlLCBJUmVnaW9uIHJlZ2lvbiwgU3RyaW5nQnVmZmVyIHNvdXJjZSkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IGdldENsZWFudXBTdHJhdGVneShub2RlKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUNvbXBvdW5kUmVnaW9uW10gcmVnaW9ucyA9IGdldFJlZ2lvbnNXaXRob3V0V2hpdGVTcGFjZXMoc3RydWN0dXJlZERvY3VtZW50LCByZWdpb24sIHN0Z3kpOwotCQlDb21wb3VuZFJlZ2lvbltdIG91dHNpZGUgPSBnZXRPdXRzaWRlUmVnaW9ucyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIHJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgIT0gMCB8fCBuZWVkUyhvdXRzaWRlWzBdKSkKLQkJCQlhcHBlbmRTcGFjZUJlZm9yZShub2RlLCByZWdpb25zW2ldLCBzb3VyY2UpOwotCQkJc291cmNlLmFwcGVuZChkZWNvcmF0ZWRQcm9wVmFsdWVSZWdpb24ocmVnaW9uc1tpXSwgc3RneSkpOwotCQl9Ci0JCWlmIChuZWVkUyhvdXRzaWRlWzFdKSAmJiAhaXNJbmNsdWRlc1ByZUVuZChub2RlLCByZWdpb24pKQotCQkJYXBwZW5kU3BhY2VCZWZvcmUobm9kZSwgb3V0c2lkZVsxXSwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBVbmtub3duUnVsZUZvcm1hdHRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBVbmtub3duUnVsZUZvcm1hdHRlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2F0ZWdvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjZDQwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNhdGVnb3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1DYXRlZ29yeSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0Q2FwdGlvbigpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NQ2hhcnNldFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3ZmNkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNoYXJzZXRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NQ2hhcnNldFJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Db250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4MzcxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUNvbnRhaW5lciBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YmE3MjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NRGVzY3JpcHRvciBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlJdGVyYXRvciBnZXRWYWx1ZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Gb250RmFjZVJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0NWRjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZvbnRGYWNlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTUZvbnRGYWNlUnVsZSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NRnVuY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJkZjI1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUZ1bmN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWw7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NRnVuY3Rpb24gZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldEZ1bmN0aW9uU3RyaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1JbXBvcnRSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdmZDE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUltcG9ydFJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1JbXBvcnRSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1LZXl3b3JkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUtleXdvcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI0NWIzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTUtleXdvcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1LZXl3b3JkIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCVN0cmluZyBnZXRLZXl3b3JkU3RyaW5nKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTWVkaWFSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MGFhMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1NZWRpYVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1NZWRpYVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWFlMmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNTU5vZGUgewotCVN0cmluZyBnZXRUeXBlKCk7Ci0KLQlTdHJpbmcgZ2V0TmFtZSgpOwotCi0JU3RyaW5nIGdldERlc2NyaXB0aW9uKCk7Ci0KLQlTdHJpbmcgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lKTsKLQotCUl0ZXJhdG9yIGdldENoaWxkTm9kZXMoKTsKLQotCUl0ZXJhdG9yIGdldERlc2NlbmRhbnRzKCk7Ci0KLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgX1BSRUZJWCA9ICJDU1NNTS4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0tFWVdPUkQgPSBfUFJFRklYICsgIktleXdvcmQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1VOSVQgPSBfUFJFRklYICsgIlVuaXQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0ZVTkNUSU9OID0gX1BSRUZJWCArICJGdW5jdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU1RSSU5HID0gX1BSRUZJWCArICJTdHJpbmciOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NUWUxFX1NIRUVUID0gX1BSRUZJWCArICJTdHlsZVNoZWV0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QUk9QRVJUWSA9IF9QUkVGSVggKyAiUHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0RFU0NSSVBUT1IgPSBfUFJFRklYICsgIkRlc2NyaXB0b3IiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NPTlRBSU5FUiA9IF9QUkVGSVggKyAiQ29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9OVU1CRVIgPSBfUFJFRklYICsgIk51bWJlciI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfU0VQQVJBVE9SID0gX1BSRUZJWCArICJTZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0NIQVJTRVRfUlVMRSA9IF9QUkVGSVggKyAiQ2hhcnNldFJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX0lNUE9SVF9SVUxFID0gX1BSRUZJWCArICJJbXBvcnRSdWxlIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9TVFlMRV9SVUxFID0gX1BSRUZJWCArICJTdHlsZVJ1bGUiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX01FRElBX1JVTEUgPSBfUFJFRklYICsgIk1lZGlhUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfUEFHRV9SVUxFID0gX1BSRUZJWCArICJQYWdlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRk9OVF9GQUNFX1JVTEUgPSBfUFJFRklYICsgIkZvbnRGYWNlUnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfQ0FURUdPUlkgPSBfUFJFRklYICsgIkNhdGVnb3J5IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9NRVRBX01PREVMID0gX1BSRUZJWCArICJNZXRhTW9kZWwiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1NFTEVDVE9SID0gX1BSRUZJWCArICJTZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQJCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1OdW1iZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYTFiMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1OdW1iZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1OdW1iZXIgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVBhZ2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0Zjk5ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1QYWdlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVBhZ2VSdWxlIGV4dGVuZHMgQ1NTTU1Ob2RlIHsKLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1Qcm9wZXJ0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzQxNDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1Qcm9wZXJ0eSBleHRlbmRzIENTU01NTm9kZSB7Ci0KLQlTdHJpbmcgZ2V0Q2F0ZWdvcnlOYW1lKCk7Ci0KLQlJdGVyYXRvciBnZXRWYWx1ZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVNlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxN2FjMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TZWxlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU01NU2VsZWN0b3IgZXh0ZW5kcyBDU1NNTU5vZGUgewotCVN0cmluZyBnZXRTZWxlY3RvclR5cGUoKTsKLQotCVN0cmluZyBnZXRTZWxlY3RvclN0cmluZygpOwotCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEVfRVhQUkVTU0lPTiA9ICJFeHByZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRV9QU0VVRE9fQ0xBU1MgPSAiUHNldWRvQ2xhc3MiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBUWVBFX1BTRVVET19FTEVNRU5UID0gIlBzZXVkb0VsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBlbWJlZGRlZCBleHByZXNzaW9uIHR5cGUKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fREVTQ0VOREFOVCA9ICJkZXNjZW5kYW50IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEVYUFJFU1NJT05fQURKQUNFTlQgPSAiYWRqYWNlbnQiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX1VOSVZFUlNBTCA9ICJ1bml2ZXJzYWwiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFWFBSRVNTSU9OX0FUVFJJQlVURSA9ICJhdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZGRmOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TdHJpbmcgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNDE0ZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTTU1TdHlsZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTTU1TdHlsZVJ1bGUgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVN0eWxlU2hlZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGRjNjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NU3R5bGVTaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVN0eWxlU2hlZXQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNTVVuaXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjkxMGM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01NVW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotcHVibGljIGludGVyZmFjZSBDU1NNTVVuaXQgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JU3RyaW5nIGdldFVuaXRTdHJpbmcoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NNZXRhTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODBjMjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL0NTU01ldGFNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotcHVibGljIGludGVyZmFjZSBDU1NNZXRhTW9kZWwgZXh0ZW5kcyBDU1NNTU5vZGUgewotCi0JLy8gcHVibGljIGludGVyZmFjZSBDU1NNZXRhTW9kZWwgewotCUNTU01NU3R5bGVTaGVldCBnZXRTdHlsZVNoZWV0KCk7Ci0KLQkvKgotCSAqIFNob3J0Y3V0IHRvIGFjY2VzcyBwcm9wZXJ0eSBub2RlCi0JICovCi0JLy8gSXRlcmF0b3IgZ2V0UHJvcGVydGllcygpOwotCS8vIEl0ZXJhdG9yIGdldERlc2NyaXB0b3JzKCk7Ci0JLy8gQ1NTTU1Qcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQkvKgotCSAqIGFjY2VzcyB0byBjYXRlZ29yeSBpbmZvcm1hdGlvbgotCSAqLwotCUl0ZXJhdG9yIGdldENhdGVnb3JpZXMoKTsKLQotCS8qCi0JICogVXRpbGl0aWVzCi0JICovCi0JLy8gSXRlcmF0b3IgY29sbGVjdE5vZGVzQnlUeXBlKFN0cmluZyB0eXBlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNWZiODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1Byb2ZpbGUgewotCi0JU3RyaW5nIGdldFByb2ZpbGVJRCgpOwotCi0JU3RyaW5nIGdldFByb2ZpbGVOYW1lKCk7Ci0KLQlVUkwgZ2V0UHJvZmlsZVVSTCgpOwotCi0JQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpOwotCi0JYm9vbGVhbiBpc0RlZmF1bHQoKTsKLQotCVN0cmluZyBnZXRPd25lclBsdWdpbklEKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvQ1NTUHJvZmlsZVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIyYjRjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC9DU1NQcm9maWxlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbC5SZWdpc3RyeVJlYWRlcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDU1NQcm9maWxlUmVnaXN0cnkgewotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU1Byb2ZpbGVSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJvZmlsZVJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0UHJvZmlsZXMoKSB7Ci0JCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGZQcm9maWxlcy52YWx1ZXMoKSkuaXRlcmF0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBnZXRQcm9maWxlKFN0cmluZyBwcm9maWxlSUQpIHsKLQkJcmV0dXJuIChDU1NQcm9maWxlKSBmUHJvZmlsZXMuZ2V0KHByb2ZpbGVJRCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZ2V0RGVmYXVsdFByb2ZpbGUoKSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCWlmIChwcm9maWxlLmlzRGVmYXVsdCgpKSB7Ci0JCQkJcmV0dXJuIHByb2ZpbGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU1Byb2ZpbGVSZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQkJZlByb2ZpbGVzID0gbmV3IEhhc2hNYXAoKTsKLQkJSXRlcmF0b3IgaSA9IG5ldyBSZWdpc3RyeVJlYWRlcigpLmVudW1Qcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBwcm9maWxlID0gaS5uZXh0KCk7Ci0JCQlpZiAocHJvZmlsZSBpbnN0YW5jZW9mIENTU1Byb2ZpbGUpIHsKLQkJCQlmUHJvZmlsZXMucHV0KCgoQ1NTUHJvZmlsZSkgcHJvZmlsZSkuZ2V0UHJvZmlsZUlEKCksIHByb2ZpbGUpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIHN0YXRpYyBDU1NQcm9maWxlUmVnaXN0cnkgZkluc3RhbmNlID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmUHJvZmlsZXMgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTRnVuY3Rpb25JRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZDY3YjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NGdW5jdGlvbklELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NGdW5jdGlvbklEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9BVFRSID0gImF0dHIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGX0NPVU5URVIgPSAiY291bnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfUkdCID0gInJnYiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZfUkVDVCA9ICJyZWN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9GT1JNQVQgPSAiZm9ybWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRl9MT0NBTCA9ICJsb2NhbCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0tleXdvcmRJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NLZXl3b3JkSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2YjM2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU0tleXdvcmRJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU0tleXdvcmRJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMTAwID0gIjEwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMjAwID0gIjIwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfMzAwID0gIjMwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNDAwID0gIjQwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNTAwID0gIjUwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNjAwID0gIjYwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfNzAwID0gIjcwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfODAwID0gIjgwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfOTAwID0gIjkwMCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQUJPVkUgPSAiYWJvdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FCU09MVVRFID0gImFic29sdXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQ1RJVkVCT1JERVIgPSAiQWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19BQ1RJVkVDQVBUSU9OID0gIkFjdGl2ZUNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FMTCA9ICJhbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FMV0FZUyA9ICJhbHdheXMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FQUFdPUktTUEFDRSA9ICJBcHBXb3Jrc3BhY2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FRVUEgPSAiYXF1YSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVJNRU5JQU4gPSAiYXJtZW5pYW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0FVVE8gPSAiYXV0byI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQVZPSUQgPSAiYXZvaWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JBQ0tHUk9VTkQgPSAiQmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkFTRUxJTkUgPSAiYmFzZWxpbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JFSElORCA9ICJiZWhpbmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JFTE9XID0gImJlbG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CSURJX09WRVJSSURFID0gImJpZGktb3ZlcnJpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMQUNLID0gImJsYWNrIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CTElOSyA9ICJibGluayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQkxPQ0sgPSAiYmxvY2siOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JMVUUgPSAiYmx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQk9MRCA9ICJib2xkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT0xERVIgPSAiYm9sZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19CT1RIID0gImJvdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JPVFRPTSA9ICJib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0JVVFRPTkZBQ0UgPSAiQnV0dG9uRmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OSElHSExJR0hUID0gIkJ1dHRvbkhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OU0hBRE9XID0gIkJ1dHRvblNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQlVUVE9OVEVYVCA9ICJCdXR0b25UZXh0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DQVBJVEFMSVpFID0gImNhcGl0YWxpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NBUFRJT04gPSAiY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0FQVElPTlRFWFQgPSAiQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUiA9ICJjZW50ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NFTlRFUl9MRUZUID0gImNlbnRlci1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DRU5URVJfUklHSFQgPSAiY2VudGVyLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DSElMRCA9ICJjaGlsZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0lSQ0xFID0gImNpcmNsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0pLX0lERU9HUkFQSElDID0gImNqay1pZGVvZ3JhcGhpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ0xPU0VfUVVPVEUgPSAiY2xvc2UtcXVvdGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NPREUgPSAiY29kZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09OREVOU0VEID0gImNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09MTEFQU0UgPSAiY29sbGFwc2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NPTVBBQ1QgPSAiY29tcGFjdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfQ09OVElOVU9VUyA9ICJjb250aW51b3VzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DUk9QID0gImNyb3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0NST1NTID0gImNyb3NzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DUk9TU0hBSVIgPSAiY3Jvc3NoYWlyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19DVVJTSVZFID0gImN1cnNpdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RBU0hFRCA9ICJkYXNoZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RFQ0lNQUwgPSAiZGVjaW1hbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfREVDSU1BTF9MRUFESU5HX1pFUk8gPSAiZGVjaW1hbC1sZWFkaW5nLXplcm8iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0RFRkFVTFQgPSAiZGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRElHSVRTID0gImRpZ2l0cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRElTQyA9ICJkaXNjIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ET1RURUQgPSAiZG90dGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ET1VCTEUgPSAiZG91YmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FX1JFU0laRSA9ICJlLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRU1CRUQgPSAiZW1iZWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0VYUEFOREVEID0gImV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FWFRSQV9DT05ERU5TRUQgPSAiZXh0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19FWFRSQV9FWFBBTkRFRCA9ICJleHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFOVEFTWSA9ICJmYW50YXN5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVJfTEVGVCA9ICJmYXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFSX1JJR0hUID0gImZhci1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRkFTVCA9ICJmYXN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GQVNURVIgPSAiZmFzdGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GRU1BTEUgPSAiZmVtYWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19GSVhFRCA9ICJmaXhlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfRlVDSFNJQSA9ICJmdWNoc2lhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HRU9SR0lBTiA9ICJnZW9yZ2lhbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JBWSA9ICJncmF5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19HUkFZVEVYVCA9ICJHcmF5VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfR1JFRU4gPSAiZ3JlZW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0dST09WRSA9ICJncm9vdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hFQlJFVyA9ICJoZWJyZXciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hFTFAgPSAiaGVscCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElEREVOID0gImhpZGRlbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElERSA9ICJoaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ISUdIID0gImhpZ2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0hMSUdIVCA9ICJIaWdobGlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJR0hMSUdIVFRFWFQgPSAiSGlnaGxpZ2h0VGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElHSEVSID0gImhpZ2hlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSElSQUdBTkEgPSAiaGlyYWdhbmEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0hJUkFHQU5BX0lST0hBID0gImhpcmFnYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOQUNUSVZFQk9SREVSID0gIkluYWN0aXZlQm9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkFDVElWRUNBUFRJT04gPSAiSW5hY3RpdmVDYXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkFDVElWRUNBUFRJT05URVhUID0gIkluYWN0aXZlQ2FwdGlvblRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lORk9CQUNLR1JPVU5EID0gIkluZm9CYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19JTkZPVEVYVCA9ICJJbmZvVGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5MSU5FID0gImlubGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5MSU5FX1RBQkxFID0gImlubGluZS10YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfSU5TRVQgPSAiaW5zZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOU0lERSA9ICJpbnNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lOVkVSVCA9ICJpbnZlcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0lUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0pVU1RJRlkgPSAianVzdGlmeSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfS0FUQUtBTkEgPSAia2F0YWthbmEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0tBVEFLQU5BX0lST0hBID0gImthdGFrYW5hLWlyb2hhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQU5EU0NBUEUgPSAibGFuZHNjYXBlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MQVJHRSA9ICJsYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTEFSR0VSID0gImxhcmdlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUX1NJREUgPSAibGVmdC1zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRUZUV0FSRFMgPSAibGVmdHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MRVZFTCA9ICJsZXZlbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTElHSFRFUiA9ICJsaWdodGVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MSU1FID0gImxpbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJTkVfVEhST1VHSCA9ICJsaW5lLXRocm91Z2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xJU1RfSVRFTSA9ICJsaXN0LWl0ZW0iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPVUQgPSAibG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XID0gImxvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVIgPSAibG93ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX0FMUEhBID0gImxvd2VyLWFscGhhIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUl9HUkVFSyA9ICJsb3dlci1ncmVlayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTE9XRVJfTEFUSU4gPSAibG93ZXItbGF0aW4iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX0xPV0VSX1JPTUFOID0gImxvd2VyLXJvbWFuIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MT1dFUkNBU0UgPSAibG93ZXJjYXNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19MVFIgPSAibHRyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NQUxFID0gIm1hbGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BUktFUiA9ICJtYXJrZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01BUk9PTiA9ICJtYXJvb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FRElVTSA9ICJtZWRpdW0iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FTlUgPSAibWVudSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTUVOVVRFWFQgPSAiTWVudVRleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX01FU1NBR0VfQk9YID0gIm1lc3NhZ2UtYm94IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NSURETEUgPSAibWlkZGxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NSVggPSAibWl4IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NT05PU1BBQ0UgPSAibW9ub3NwYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19NT1ZFID0gIm1vdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05fUkVTSVpFID0gIm4tcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OQVJST1dFUiA9ICJuYXJyb3dlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTkFWWSA9ICJuYXZ5IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ORV9SRVNJWkUgPSAibmUtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19DTE9TRV9RVU9URSA9ICJuby1jbG9zZS1xdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfTk9fT1BFTl9RVU9URSA9ICJuby1vcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT19SRVBFQVQgPSAibm8tcmVwZWF0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19OT05FID0gIm5vbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PUk1BTCA9ICJub3JtYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05PV1JBUCA9ICJub3dyYXAiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX05XX1JFU0laRSA9ICJudy1yZXNpemUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09CTElRVUUgPSAib2JsaXF1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT0xJVkUgPSAib2xpdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09OQ0UgPSAib25jZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfT1BFTl9RVU9URSA9ICJvcGVuLXF1b3RlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PVVRTRVQgPSAib3V0c2V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19PVVRTSURFID0gIm91dHNpZGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX09WRVJMSU5FID0gIm92ZXJsaW5lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QT0lOVEVSID0gInBvaW50ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1BPUlRSQUlUID0gInBvcnRyYWl0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QUkUgPSAicHJlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19QVVJQTEUgPSAicHVycGxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRUQgPSAicmVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SRUxBVElWRSA9ICJyZWxhdGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUID0gInJlcGVhdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUkVQRUFUX1ggPSAicmVwZWF0LXgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JFUEVBVF9ZID0gInJlcGVhdC15IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SSURHRSA9ICJyaWRnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1JJR0hUX1NJREUgPSAicmlnaHQtc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfUklHSFRXQVJEUyA9ICJyaWdodHdhcmRzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SVEwgPSAicnRsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19SVU5fSU4gPSAicnVuLWluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TX1JFU0laRSA9ICJzLXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0FOU19TRVJJRiA9ICJzYW5zLXNlcmlmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQ1JPTEwgPSAic2Nyb2xsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TQ1JPTExCQVIgPSAiU2Nyb2xsYmFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRV9SRVNJWkUgPSAic2UtcmVzaXplIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRU1JX0NPTkRFTlNFRCA9ICJzZW1pLWNvbmRlbnNlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0VNSV9FWFBBTkRFRCA9ICJzZW1pLWV4cGFuZGVkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TRVBBUkFURSA9ICJzZXBhcmF0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0VSSUYgPSAic2VyaWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NIT1cgPSAic2hvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0lMRU5UID0gInNpbGVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0lMVkVSID0gInNpbHZlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU0xPVyA9ICJzbG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTE9XRVIgPSAic2xvd2VyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTCA9ICJzbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU01BTExfQ0FQUyA9ICJzbWFsbC1jYXBzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TTUFMTF9DQVBUSU9OID0gInNtYWxsLWNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1NNQUxMRVIgPSAic21hbGxlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU09GVCA9ICJzb2Z0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TT0xJRCA9ICJzb2xpZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1BFTExfT1VUID0gInNwZWxsLW91dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1FVQVJFID0gInNxdWFyZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1RBVElDID0gInN0YXRpYyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1RBVFVTX0JBUiA9ICJzdGF0dXMtYmFyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVUIgPSAic3ViIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19TVVBFUiA9ICJzdXBlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfU1dfUkVTSVpFID0gInN3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEUgPSAidGFibGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RBQkxFX0NBUFRJT04gPSAidGFibGUtY2FwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEFCTEVfQ0VMTCA9ICJ0YWJsZS1jZWxsIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DT0xVTU4gPSAidGFibGUtY29sdW1uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9DT0xVTU5fR1JPVVAgPSAidGFibGUtY29sdW1uLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9GT09URVJfR1JPVVAgPSAidGFibGUtZm9vdGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9IRUFERVJfR1JPVVAgPSAidGFibGUtaGVhZGVyLWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9ST1cgPSAidGFibGUtcm93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19UQUJMRV9ST1dfR1JPVVAgPSAidGFibGUtcm93LWdyb3VwIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19URUFMID0gInRlYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFWFQgPSAidGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEVYVF9UT1AgPSAidGV4dC10b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RFWFRfQk9UVE9NID0gInRleHQtYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USElDSyA9ICJ0aGljayI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhJTiA9ICJ0aGluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19USFJFRUREQVJLU0hBRE9XID0gIlRocmVlRERhcmtTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFREZBQ0UgPSAiVGhyZWVERmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVESElHSExJR0hUID0gIlRocmVlREhpZ2hsaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVEhSRUVETElHSFRTSEFET1cgPSAiVGhyZWVETGlnaHRTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RIUkVFRFNIQURPVyA9ICJUaHJlZURTaGFkb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1RSQU5TUEFSRU5UID0gInRyYW5zcGFyZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTFRSQV9DT05ERU5TRUQgPSAidWx0cmEtY29uZGVuc2VkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VTFRSQV9FWFBBTkRFRCA9ICJ1bHRyYS1leHBhbmRlZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVU5ERVJMSU5FID0gInVuZGVybGluZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJfQUxQSEEgPSAidXBwZXItYWxwaGEiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1VQUEVSX0xBVElOID0gInVwcGVyLWxhdGluIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19VUFBFUl9ST01BTiA9ICJ1cHBlci1yb21hbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVVBQRVJDQVNFID0gInVwcGVyY2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfVklTSUJMRSA9ICJ2aXNpYmxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XX1JFU0laRSA9ICJ3LXJlc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0FJVCA9ICJ3YWl0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSElURSA9ICJ3aGl0ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfV0lERVIgPSAid2lkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPVyA9ICJXaW5kb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1dJTkRPV0ZSQU1FID0gIldpbmRvd0ZyYW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19XSU5ET1dURVhUID0gIldpbmRvd1RleHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfRkFTVCA9ICJ4LWZhc3QiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfSElHSCA9ICJ4LWhpZ2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfTEFSR0UgPSAieC1sYXJnZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MT1VEID0gIngtbG91ZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9MT1cgPSAieC1sb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfU0xPVyA9ICJ4LXNsb3ciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hfU01BTEwgPSAieC1zbWFsbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWF9TT0ZUID0gIngtc29mdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtfWFhfU01BTEwgPSAieHgtc21hbGwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBLX1hYX0xBUkdFID0gInh4LWxhcmdlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS19ZRUxMT1cgPSAieWVsbG93IjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTU1UeXBlQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01NVHlwZUNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmJhZjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTU1UeXBlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENTU01NVHlwZUNvbGxlY3RvciBleHRlbmRzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVHlwZUNvbGxlY3Rvci4KLQkgKi8KLQlwdWJsaWMgQ1NTTU1UeXBlQ29sbGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFwcGx5KENTU01NTm9kZSBub2RlLCBTdHJpbmcgdHlwZSkgewotCQlmVHlwZSA9IHR5cGU7Ci0JCWZOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJYXBwbHkobm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29sbGVjdE5lc3RlZFR5cGUoYm9vbGVhbiBuZXN0ZWQpIHsKLQkJZk5lc3RlZCA9IG5lc3RlZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlzaG9ydCByYyA9IFRSQVZfQ09OVDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKGZUeXBlID09IG5vZGUuZ2V0VHlwZSgpKSB7Ci0JCQkJaWYgKCFmTm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCQkJZk5vZGVzLmFkZChub2RlKTsKLQkJCQl9Ci0JCQkJaWYgKCFmTmVzdGVkKSB7Ci0JCQkJCXJjID0gVFJBVl9QUlVORTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJjOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXROb2RlcygpIHsKLQkJcmV0dXJuIGZOb2Rlcy5pdGVyYXRvcigpOwotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIGZOZXN0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmVHlwZSA9IG51bGw7Ci0JTGlzdCBmTm9kZXMgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01lZGlhR3JvdXBJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2JkYTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWVkaWFHcm91cElELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NNZWRpYUdyb3VwSUQgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0NPTlRJTlVPVVMgPSAiY29udGludW91cyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fUEFHRUQgPSAicGFnZWQiOyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fVklTVUFMID0gInZpc3VhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQVVSQUwgPSAiYXVyYWwiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX1RBQ1RJTEUgPSAidGFjdGlsZSI7IC8vJE5PTi1OTFMtMSQKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTV9HUklEID0gImdyaWQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX0JJVE1BUCA9ICJiaXRtYXAiOyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fSU5URVJBQ1RJVkUgPSAiaW50ZXJhY3RpdmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBNX1NUQVRJQyA9ICJzdGF0aWMiOyAvLyROT04tTkxTLTEkCi0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1fQUxMID0gImFsbCI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbEZpbmRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA3ZDg0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbEZpbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGNsYXNzIENTU01ldGFNb2RlbEZpbmRlciB7Ci0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbEZpbmRlci4KLQkgKi8KLQlwcml2YXRlIENTU01ldGFNb2RlbEZpbmRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBDU1NNZXRhTW9kZWxGaW5kZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU01ldGFNb2RlbEZpbmRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENTU01ldGFNb2RlbCBmaW5kTWV0YU1vZGVsRm9yKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIENTU1Byb2ZpbGVGaW5kZXIuZ2V0SW5zdGFuY2UoKS5maW5kUHJvZmlsZUZvcihub2RlKS5nZXRNZXRhTW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKG1vZGVsKS5nZXRNZXRhTW9kZWwoKTsKLQotCX0KLQotCS8vIGZpbmRNZXRhTW9kZWxGb3IoTm9kZSkgaXMgbm90IHVzZWQuCi0JLy8gRXZlbiBpZiBpdCBpcyB1c2VkLCBpdCBjYW4gYmUgcmVwbGFjZWQgd2l0aAotCS8vIGZpbmRNZXRhTW9kZWxGb3IoSVN0cnVjdHVyZWRNb2RlbCkgZWFzaWx5Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGZpbmRNZXRhTW9kZWxGb3IoU3RyaW5nIGJhc2VMb2NhdGlvbikgewotCQlyZXR1cm4gQ1NTUHJvZmlsZUZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRQcm9maWxlRm9yKGJhc2VMb2NhdGlvbikuZ2V0TWV0YU1vZGVsKCk7Ci0JfQotCi0Jc3RhdGljIHByaXZhdGUgQ1NTTWV0YU1vZGVsRmluZGVyIGZJbnN0YW5jZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxUcmF2ZXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YTZmNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NNZXRhTW9kZWxUcmF2ZXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi0KLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIENTU01ldGFNb2RlbFRyYXZlcnNlciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgVHJhdmVyc2VyLgotCSAqLwotCXB1YmxpYyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHkoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJZlRyYXZTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JCWJlZ2luKG5vZGUpOwotCQl0cmF2ZXJzZShub2RlKTsKLQkJZW5kKG5vZGUpOwotCX0KLQotCXByaXZhdGUgZmluYWwgc2hvcnQgdHJhdmVyc2UoQ1NTTU1Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCi0JCWZUcmF2U3RhY2sucHVzaChub2RlKTsKLQotCQlzaG9ydCByYzsKLQkJcmMgPSBwcmVOb2RlKG5vZGUpOwotCi0JCWlmIChyYyA9PSBUUkFWX0NPTlQpIHsKLQkJCUl0ZXJhdG9yIGkgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZSBjaGlsZCA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJCXNob3J0IHJjQ2hpbGQgPSB0cmF2ZXJzZShjaGlsZCk7Ci0JCQkJaWYgKHJjQ2hpbGQgPT0gVFJBVl9TVE9QKSB7Ci0JCQkJCWZUcmF2U3RhY2sucG9wKCk7Ci0JCQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJjID09IFRSQVZfU1RPUCkgewotCQkJZlRyYXZTdGFjay5wb3AoKTsKLQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCX0KLQotCQlyYyA9IHBvc3ROb2RlKG5vZGUpOwotCi0JCWZUcmF2U3RhY2sucG9wKCk7Ci0JCXJldHVybiAocmMgPT0gVFJBVl9QUlVORSkgPyBUUkFWX0NPTlQgOiByYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBiZWdpbihDU1NNTU5vZGUgbm9kZSkgewotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5kKENTU01NTm9kZSBub2RlKSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCi0JU3RhY2sgZlRyYXZTdGFjayA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIHNob3J0IFRSQVZfQ09OVCA9IDA7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBzaG9ydCBUUkFWX1NUT1AgPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgc2hvcnQgVFJBVl9QUlVORSA9IDI7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU01ldGFNb2RlbFV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQwYjFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTWV0YU1vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZTsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTTWV0YU1vZGVsVXRpbCB7Ci0JcHVibGljIENTU01ldGFNb2RlbFV0aWwoQ1NTTWV0YU1vZGVsIG1ldGFtb2RlbCkgewotCQlzdXBlcigpOwotCQlmTWV0YU1vZGVsID0gbWV0YW1vZGVsOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX1BST1BFUlRZKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RGVzY3JpcHRvcnMoKSB7Ci0JCXJldHVybiBjb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGNvbGxlY3ROb2Rlc0J5VHlwZShTdHJpbmcgdHlwZSkgewotCQlDU1NNTVR5cGVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IENTU01NVHlwZUNvbGxlY3RvcigpOwotCQljb2xsZWN0b3IuYXBwbHkoZk1ldGFNb2RlbCwgdHlwZSk7Ci0JCXJldHVybiBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1Qcm9wZXJ0eSBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCUl0ZXJhdG9yIGlQcm9wZXJ0eSA9IGdldFByb3BlcnRpZXMoKTsKLQkJd2hpbGUgKGlQcm9wZXJ0eS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaVByb3BlcnR5Lm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHByb3BlcnR5TmFtZSkpIHsKLQkJCQlyZXR1cm4gKENTU01NUHJvcGVydHkpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENTU01NRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKFN0cmluZyBkZXNjcmlwdG9yTmFtZSkgewotCQlJdGVyYXRvciBpRGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3JzKCk7Ci0JCXdoaWxlIChpRGVzY3JpcHRvci5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaURlc2NyaXB0b3IubmV4dCgpOwotCQkJaWYgKG5vZGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoZGVzY3JpcHRvck5hbWUpKSB7Ci0JCQkJcmV0dXJuIChDU1NNTURlc2NyaXB0b3IpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENTU01NTm9kZSBnZXRNZXRhTW9kZWxOb2RlRm9yKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikgewotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJcmV0dXJuIGdldFByb3BlcnR5KCgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUpLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZSkgewotCQkJCXJldHVybiBnZXREZXNjcmlwdG9yKCgoSUNTU1N0eWxlRGVjbEl0ZW0pIG5vZGUpLmdldFByb3BlcnR5TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChmVHlwZU1hcCA9PSBudWxsKSB7Ci0JCQlmVHlwZU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmVHlwZU1hcC5wdXQobmV3IFNob3J0KElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFKSwgQ1NTTU1Ob2RlLlRZUEVfU1RZTEVfUlVMRSk7Ci0JCQlmVHlwZU1hcC5wdXQobmV3IFNob3J0KElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFKSwgQ1NTTU1Ob2RlLlRZUEVfRk9OVF9GQUNFX1JVTEUpOwotCQkJZlR5cGVNYXAucHV0KG5ldyBTaG9ydChJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFKSwgQ1NTTU1Ob2RlLlRZUEVfUEFHRV9SVUxFKTsKLQkJfQotCi0JCVN0cmluZyBub2RlVHlwZSA9IChTdHJpbmcpIGZUeXBlTWFwLmdldChuZXcgU2hvcnQobm9kZS5nZXROb2RlVHlwZSgpKSk7Ci0JCWlmIChub2RlVHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUl0ZXJhdG9yIGlOb2RlcyA9IGNvbGxlY3ROb2Rlc0J5VHlwZShub2RlVHlwZSk7Ci0JCWlmIChpTm9kZXMuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgdGFyZ2V0Tm9kZSA9IChDU1NNTU5vZGUpIGlOb2Rlcy5uZXh0KCk7Ci0JCQlpZiAoIWlOb2Rlcy5oYXNOZXh0KCkpIHsgLy8gaXQncyBvbmx5IG9uZQotCQkJCXJldHVybiB0YXJnZXROb2RlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIENTU01ldGFNb2RlbCBnZXRNZXRhTW9kZWwoKSB7Ci0JCXJldHVybiBmTWV0YU1vZGVsOwotCX0KLQotCi0JcHJpdmF0ZSBDU1NNZXRhTW9kZWwgZk1ldGFNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZlR5cGVNYXAgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTnVtYmVySUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTTnVtYmVySUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIzNjdhYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU051bWJlcklELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NOdW1iZXJJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0FOR0xFID0gImFuZ2xlIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9GUkVRVUVOQ1kgPSAiZnJlcXVlbmN5IjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9JTlRFR0VSID0gImludGVnZXIiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX0xFTkdUSCA9ICJsZW5ndGgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgamF2YS5sYW5nLlN0cmluZyBOX1BFUkNFTlRBR0UgPSAicGVyY2VudGFnZSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBqYXZhLmxhbmcuU3RyaW5nIE5fVElNRSA9ICJ0aW1lIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9IQVNIID0gImhhc2giOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIGphdmEubGFuZy5TdHJpbmcgTl9OVU0gPSAibnVtYmVyIjsvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NQcm9maWxlRmluZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1Byb2ZpbGVGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZiMGYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1Byb2ZpbGVGaW5kZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NQcm9maWxlRmluZGVyIHsKLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTUHJvZmlsZUZpbmRlci4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVGaW5kZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIHN5bmNocm9uaXplZCBwdWJsaWMgQ1NTUHJvZmlsZUZpbmRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJvZmlsZUZpbmRlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoSUNTU05vZGUgbm9kZSkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQltb2RlbCA9IGRvYy5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmaW5kUHJvZmlsZUZvcihtb2RlbCk7Ci0JfQotCi0JcHVibGljIENTU1Byb2ZpbGUgZmluZFByb2ZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlPYmplY3QgbW9kZWxUeXBlID0gKChJQ1NTTW9kZWwpIG1vZGVsKS5nZXRTdHlsZVNoZWV0VHlwZSgpOwotCQkJaWYgKG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG1vZGVsVHlwZSA9PSBJQ1NTTW9kZWwuRU1CRURERUQgfHwgbW9kZWxUeXBlID09IElDU1NNb2RlbC5JTkxJTkUpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsgLy8gbWF5IGJlIG51bGwKLQkJCX0KLQkJfQotCQllbHNlIGlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQliYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gZmluZFByb2ZpbGVGb3IoYmFzZUxvY2F0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTUHJvZmlsZSBmaW5kUHJvZmlsZUZvcihTdHJpbmcgYmFzZUxvY2F0aW9uKSB7Ci0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gbnVsbDsKLQotCQlpZiAoYmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAocmVzb3VyY2UgPT0gbnVsbCAmJiBwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQlyZXNvdXJjZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHByb2ZpbGVJRCA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCByZXNvdXJjZSwgdHJ1ZSk7Ci0JCQkJaWYgKHByb2ZpbGVJRCAhPSBudWxsICYmIDAgPCBwcm9maWxlSUQubGVuZ3RoKCkpIHsKLQkJCQkJcHJvZmlsZSA9IHJlZy5nZXRQcm9maWxlKHByb2ZpbGVJRCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChwcm9maWxlICE9IG51bGwpID8gcHJvZmlsZSA6IHJlZy5nZXREZWZhdWx0UHJvZmlsZSgpOwotCX0KLQotCXN0YXRpYyBwcml2YXRlIENTU1Byb2ZpbGVGaW5kZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1Byb3BlcnR5SUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjY2Y2RiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTUHJvcGVydHlJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsOwotCi1wdWJsaWMgaW50ZXJmYWNlIENTU1Byb3BlcnR5SUQgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0FaSU1VVEggPSAiYXppbXV0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkcgPSAiYmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQkdfQVRUQUNITUVOVCA9ICJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0NPTE9SID0gImJhY2tncm91bmQtY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX0lNQUdFID0gImJhY2tncm91bmQtaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX1BPU0lUSU9OID0gImJhY2tncm91bmQtcG9zaXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JHX1JFUEVBVCA9ICJiYWNrZ3JvdW5kLXJlcGVhdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSID0gImJvcmRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0NPTExBUFNFID0gImJvcmRlci1jb2xsYXBzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0NPTE9SID0gImJvcmRlci1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1NQQUNJTkcgPSAiYm9yZGVyLXNwYWNpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9TVFlMRSA9ICJib3JkZXItc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1AgPSAiYm9yZGVyLXRvcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUID0gImJvcmRlci1yaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTSA9ICJib3JkZXItYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVCA9ICJib3JkZXItbGVmdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1RPUF9DT0xPUiA9ICJib3JkZXItdG9wLWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfUklHSFRfQ09MT1IgPSAiYm9yZGVyLXJpZ2h0LWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfQk9UVE9NX0NPTE9SID0gImJvcmRlci1ib3R0b20tY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9MRUZUX0NPTE9SID0gImJvcmRlci1sZWZ0LWNvbG9yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfVE9QX1NUWUxFID0gImJvcmRlci10b3Atc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9SSUdIVF9TVFlMRSA9ICJib3JkZXItcmlnaHQtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9CT1RUT01fU1RZTEUgPSAiYm9yZGVyLWJvdHRvbS1zdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0xFRlRfU1RZTEUgPSAiYm9yZGVyLWxlZnQtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0JPUkRFUl9UT1BfV0lEVEggPSAiYm9yZGVyLXRvcC13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1JJR0hUX1dJRFRIID0gImJvcmRlci1yaWdodC13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX0JPVFRPTV9XSURUSCA9ICJib3JkZXItYm90dG9tLXdpZHRoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9CT1JERVJfTEVGVF9XSURUSCA9ICJib3JkZXItbGVmdC13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9SREVSX1dJRFRIID0gImJvcmRlci13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQk9UVE9NID0gImJvdHRvbSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0FQVElPTl9TSURFID0gImNhcHRpb24tc2lkZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ0xFQVIgPSAiY2xlYXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NMSVAgPSAiY2xpcCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09MT1IgPSAiY29sb3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NPTlRFTlQgPSAiY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ09VTlRFUl9JTkNSRU1FTlQgPSAiY291bnRlci1pbmNyZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0NPVU5URVJfUkVTRVQgPSAiY291bnRlci1yZXNldCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VFID0gImN1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VFX0FGVEVSID0gImN1ZS1hZnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfQ1VFX0JFRk9SRSA9ICJjdWUtYmVmb3JlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9DVVJTT1IgPSAiY3Vyc29yIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9ESVJFQ1RJT04gPSAiZGlyZWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9ESVNQTEFZID0gImRpc3BsYXkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0VMRVZBVElPTiA9ICJlbGV2YXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0VNUFRZX0NFTExTID0gImVtcHR5LWNlbGxzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GTE9BVCA9ICJmbG9hdCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVCA9ICJmb250IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX0ZBTUlMWSA9ICJmb250LWZhbWlseSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TSVpFID0gImZvbnQtc2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfRk9OVF9TSVpFX0FESlVTVCA9ICJmb250LXNpemUtYWRqdXN0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NUUkVUQ0ggPSAiZm9udC1zdHJldGNoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9GT05UX1NUWUxFID0gImZvbnQtc3R5bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfVkFSSUFOVCA9ICJmb250LXZhcmlhbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0ZPTlRfV0VJR0hUID0gImZvbnQtd2VpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9IRUlHSFQgPSAiaGVpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MRUZUID0gImxlZnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xFVFRFUl9TUEFDSU5HID0gImxldHRlci1zcGFjaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSU5FX0hFSUdIVCA9ICJsaW5lLWhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRSA9ICJsaXN0LXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9MSVNUX1NUWUxFX0lNQUdFID0gImxpc3Qtc3R5bGUtaW1hZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX0xJU1RfU1RZTEVfUE9TSVRJT04gPSAibGlzdC1zdHlsZS1wb3NpdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTElTVF9TVFlMRV9UWVBFID0gImxpc3Qtc3R5bGUtdHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOID0gIm1hcmdpbiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUFSR0lOX1RPUCA9ICJtYXJnaW4tdG9wIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fUklHSFQgPSAibWFyZ2luLXJpZ2h0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJHSU5fQk9UVE9NID0gIm1hcmdpbi1ib3R0b20iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUkdJTl9MRUZUID0gIm1hcmdpbi1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVJLRVJfT0ZGU0VUID0gIm1hcmtlci1vZmZzZXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BUktTID0gIm1hcmtzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9NQVhfSEVJR0hUID0gIm1heC1oZWlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01BWF9XSURUSCA9ICJtYXgtd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX01JTl9IRUlHSFQgPSAibWluLWhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfTUlOX1dJRFRIID0gIm1pbi13aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1JQSEFOUyA9ICJvcnBoYW5zIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FID0gIm91dGxpbmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09VVExJTkVfQ09MT1IgPSAib3V0bGluZS1jb2xvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfT1VUTElORV9TVFlMRSA9ICJvdXRsaW5lLXN0eWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9PVVRMSU5FX1dJRFRIID0gIm91dGxpbmUtd2lkdGgiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX09WRVJGTE9XID0gIm92ZXJmbG93IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HID0gInBhZGRpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfVE9QID0gInBhZGRpbmctdG9wIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX1JJR0hUID0gInBhZGRpbmctcmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBRERJTkdfQk9UVE9NID0gInBhZGRpbmctYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQURESU5HX0xFRlQgPSAicGFkZGluZy1sZWZ0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQUdFID0gInBhZ2UiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfQUZURVIgPSAicGFnZS1icmVhay1hZnRlciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFHRV9CUkVBS19CRUZPUkUgPSAicGFnZS1icmVhay1iZWZvcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBR0VfQlJFQUtfSU5TSURFID0gInBhZ2UtYnJlYWstaW5zaWRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QQVVTRSA9ICJwYXVzZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUEFVU0VfQUZURVIgPSAicGF1c2UtYWZ0ZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BBVVNFX0JFRk9SRSA9ICJwYXVzZS1iZWZvcmUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BJVENIID0gInBpdGNoIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9QSVRDSF9SQU5HRSA9ICJwaXRjaC1yYW5nZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUExBWV9EVVJJTkcgPSAicGxheS1kdXJpbmciOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1BPU0lUSU9OID0gInBvc2l0aW9uIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9RVU9URVMgPSAicXVvdGVzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9SSUNITkVTUyA9ICJyaWNobmVzcyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NJWkUgPSAic2l6ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUsgPSAic3BlYWsiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX0hFQURFUiA9ICJzcGVhay1oZWFkZXIiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUFLX05VTUVSQUwgPSAic3BlYWstbnVtZXJhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfU1BFQUtfUFVOQ1RVQVRJT04gPSAic3BlYWstcHVuY3R1YXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1NQRUVDSF9SQVRFID0gInNwZWVjaC1yYXRlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9TVFJFU1MgPSAic3RyZXNzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9UQUJMRV9MQVlPVVQgPSAidGFibGUtbGF5b3V0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX0FMSUdOID0gInRleHQtYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfREVDT1JBVElPTiA9ICJ0ZXh0LWRlY29yYXRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RFWFRfSU5ERU5UID0gInRleHQtaW5kZW50IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9URVhUX1NIQURPVyA9ICJ0ZXh0LXNoYWRvdyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfVEVYVF9UUkFOU0ZPUk0gPSAidGV4dC10cmFuc2Zvcm0iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1RPUCA9ICJ0b3AiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1VOSUNPREVfQklESSA9ICJ1bmljb2RlLWJpZGkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1ZFUlRJQ0FMX0FMSUdOID0gInZlcnRpY2FsLWFsaWduIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9WSVNJQklMSVRZID0gInZpc2liaWxpdHkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1ZPSUNFX0ZBTUlMWSA9ICJ2b2ljZS1mYW1pbHkiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1ZPTFVNRSA9ICJ2b2x1bWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQX1dISVRFX1NQQUNFID0gIndoaXRlLXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSURPV1MgPSAid2lkb3dzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUF9XSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfV09SRF9TUEFDSU5HID0gIndvcmQtc3BhY2luZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBfWl9JTkRFWCA9ICJ6LWluZGV4IjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTU3RyaW5nSUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsL3V0aWwvQ1NTU3RyaW5nSUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyNTE5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1N0cmluZ0lELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBDU1NTdHJpbmdJRCB7Ci0KLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfQU5ZID0gImFueSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfQ09VTlRFUl9JREVOVElGSUVSID0gImNvdW50ZXItaWRlbnRpZmllciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfRkFNSUxZX05BTUUgPSAiZmFtaWx5LW5hbWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTX0ZPTlRfRkFDRV9OQU1FID0gImZvbnQtZmFjZS1uYW1lIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19QQUdFX0lERU5USUZJRVIgPSAicGFnZS1pZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU19TUEVDSUZJQ19WT0lDRSA9ICJzcGVjaWZpYy12b2ljZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNfVVJBTkdFID0gInVyYW5nZSI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1VuaXRJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWwvdXRpbC9DU1NVbml0SUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UyYjVmMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbC91dGlsL0NTU1VuaXRJRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ1NTVW5pdElEIHsKLQotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9DTSA9ICJjbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9ERUcgPSAiZGVnIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0VNUyA9ICJlbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9FWFMgPSAiZXgiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfR1JBRCA9ICJncmFkIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX0hBU0ggPSAiIyI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9IWiA9ICJIeiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9JTiA9ICJpbiI7Ly8kTk9OLU5MUy0xJAotCS8vIGZpbmFsIHN0YXRpYyBTdHJpbmcgVV9JTlRFR0VSID0gIklOVEVHRVIiOy8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVfS0haID0gImtIeiI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9NTSA9ICJtbSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9NUyA9ICJtcyI7Ly8kTk9OLU5MUy0xJAotCS8vIGZpbmFsIHN0YXRpYyBTdHJpbmcgVV9OVU1CRVIgPSAiTlVNQkVSIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1BDID0gInBjIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1BFUkNFTlRBR0UgPSAiJSI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QVCA9ICJwdCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9QWCA9ICJweCI7Ly8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgVV9SQUQgPSAicmFkIjsvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVX1MgPSAicyI7Ly8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNhdGVnb3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NDFhNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2F0ZWdvcnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUNhdGVnb3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUNhdGVnb3J5SW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUNhdGVnb3J5IHsKLQotCXB1YmxpYyBDU1NNTUNhdGVnb3J5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0NBVEVHT1JZOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRDYXB0aW9uKCkgewotCQlyZXR1cm4gZkNhcHRpb247Ci0JfQotCi0Jdm9pZCBzZXRDYXB0aW9uKFN0cmluZyBjYXB0aW9uKSB7Ci0JCWZDYXB0aW9uID0gY2FwdGlvbjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIGlmIChnZXRDYXB0aW9uKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I3RvU3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0Q2FwdGlvbigpOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZkNhcHRpb24gPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNoYXJzZXRSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2hhcnNldFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwN2RlYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ2hhcnNldFJ1bGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUNoYXJzZXRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUNoYXJzZXRSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUNoYXJzZXRSdWxlIHsKLQotCi0JcHVibGljIENTU01NQ2hhcnNldFJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ0hBUlNFVF9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ29udGFpbmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NQ29udGFpbmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTRjNTgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUNvbnRhaW5lckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUNvbnRhaW5lckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Db250YWluZXIgewotCi0KLQlwdWJsaWMgQ1NTTU1Db250YWluZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfQ09OVEFJTkVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9OVU1CRVIgfHwgdHlwZSA9PSBUWVBFX0tFWVdPUkQgfHwgdHlwZSA9PSBUWVBFX0ZVTkNUSU9OIHx8IHR5cGUgPT0gVFlQRV9DT05UQUlORVIpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1EZXNjcmlwdG9ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI2YzI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTURlc2NyaXB0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLQotY2xhc3MgQ1NTTU1EZXNjcmlwdG9ySW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTURlc2NyaXB0b3IgewotCi0KLQlwdWJsaWMgQ1NTTU1EZXNjcmlwdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0RFU0NSSVBUT1I7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCWlmIChjaGlsZCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHR5cGUgPSBjaGlsZC5nZXRUeXBlKCk7Ci0JCXJldHVybiAodHlwZSA9PSBUWVBFX05VTUJFUiB8fCB0eXBlID09IFRZUEVfS0VZV09SRCB8fCB0eXBlID09IFRZUEVfRlVOQ1RJT04gfHwgdHlwZSA9PSBUWVBFX0NPTlRBSU5FUiB8fCB0eXBlID09IFRZUEVfU1RSSU5HIHx8IHR5cGUgPT0gVFlQRV9TRVBBUkFUT1IpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTURlc2NyaXB0b3IjZ2V0VmFsdWVzKCkKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0VmFsdWVzKCkgewotCQlWYWx1ZUNvbGxlY3RvciBjb2xsZWN0b3IgPSBuZXcgVmFsdWVDb2xsZWN0b3IoKTsKLQkJY29sbGVjdG9yLmFwcGx5KHRoaXMpOwotCQlyZXR1cm4gY29sbGVjdG9yLmdldE5vZGVzKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NRm9udEZhY2VSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOGQ1NjFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZvbnRGYWNlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotCi1jbGFzcyBDU1NNTUZvbnRGYWNlUnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Gb250RmFjZVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1Gb250RmFjZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfRk9OVF9GQUNFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldFR5cGUoKSA9PSBUWVBFX0RFU0NSSVBUT1IpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1GdW5jdGlvbkltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZ1bmN0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjZiMDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUZ1bmN0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1GdW5jdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1GdW5jdGlvbkltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1GdW5jdGlvbiB7Ci0KLQlwdWJsaWMgQ1NTTU1GdW5jdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9GVU5DVElPTjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVuY3Rpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vCi0JLy8gTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9BVFRSKTsKLQkvLyBsaXN0LmFkZChDU1NGdW5jdGlvbklELkZfQ09VTlRFUik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1JHQik7Ci0JLy8gbGlzdC5hZGQoQ1NTRnVuY3Rpb25JRC5GX1JFQ1QpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9VUkkpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9GT1JNQVQpOwotCS8vIGxpc3QuYWRkKENTU0Z1bmN0aW9uSUQuRl9MT0NBTCk7Ci0JLy8KLQkvLyBpZiAoISBsaXN0LmNvbnRhaW5zKG5hbWUudG9Mb3dlckNhc2UoKSkpIHsKLQkvLyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsKLQkvLyB9Ci0JLy8gfQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRGdW5jdGlvblN0cmluZygpOwotCX0KLQotCXZvaWQgc2V0RnVuY3Rpb25TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2dldEVycm9yKCkKLQkgKi8KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldEZ1bmN0aW9uU3RyaW5nKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT19DSElMRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUltcG9ydFJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MmVhOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NSW1wb3J0UnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotY2xhc3MgQ1NTTU1JbXBvcnRSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTUltcG9ydFJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1JbXBvcnRSdWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX0lNUE9SVF9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNnZXRFcnJvcigpCi0JICovCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUtleXdvcmRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1LZXl3b3JkSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDYwNDJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTUtleXdvcmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTUtleXdvcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NS2V5d29yZEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1LZXl3b3JkIHsKLQotCXB1YmxpYyBDU1NNTUtleXdvcmRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfS0VZV09SRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTUtleXdvcmQjZ2V0S2V5d29yZFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRLZXl3b3JkU3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRLZXl3b3JkU3RyaW5nKCk7Ci0JfQotCi0Jdm9pZCBzZXRLZXl3b3JkU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSB2YWx1ZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PVF9ERUZJTkVEOwotCQl9Ci0JCWVsc2UgaWYgKGdldEtleXdvcmRTdHJpbmcoKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1NZWRpYVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1NZWRpYVJ1bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZGVjN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTWVkaWFSdWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1NZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci0KLWNsYXNzIENTU01NTWVkaWFSdWxlSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTU1lZGlhUnVsZSB7Ci0KLQotCXB1YmxpYyBDU1NNTU1lZGlhUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9NRURJQV9SVUxFOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIE5BTUVfTk9UX0FWQUlMQUJMRTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlSW1wbCNjYW5Db250YWluKENTU01NTm9kZSkKLQkgKi8KLQlib29sZWFuIGNhbkNvbnRhaW4oQ1NTTU1Ob2RlIGNoaWxkKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMTQ0ZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLQotCi1hYnN0cmFjdCBjbGFzcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Ob2RlIHsKLQotCXB1YmxpYyBDU1NNTU5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlpZiAoZkF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmcpIGZBdHRyaWJ1dGVzLmdldChuYW1lKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2hpbGROb2RlcygpIHsKLQkJaWYgKGZDaGlsZE5vZGVzID09IG51bGwpIHsKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihmQ2hpbGROb2RlcykuaXRlcmF0b3IoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXREZXNjZW5kYW50cygpIHsKLQkJTGlzdCBkZXNjZW5kYW50cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaUNoaWxkID0gZ2V0Q2hpbGROb2RlcygpOwotCQl3aGlsZSAoaUNoaWxkLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIGNoaWxkID0gKENTU01NTm9kZSkgaUNoaWxkLm5leHQoKTsKLQkJCUl0ZXJhdG9yIGlEZXNjZW5kYW50ID0gY2hpbGQuZ2V0RGVzY2VuZGFudHMoKTsKLQkJCWlmIChpRGVzY2VuZGFudC5oYXNOZXh0KCkpIHsKLQkJCQl3aGlsZSAoaURlc2NlbmRhbnQuaGFzTmV4dCgpKSB7Ci0JCQkJCUNTU01NTm9kZSBkZXNjZW5kYW50ID0gKENTU01NTm9kZSkgaURlc2NlbmRhbnQubmV4dCgpOwotCQkJCQlpZiAoIWRlc2NlbmRhbnRzLmNvbnRhaW5zKGRlc2NlbmRhbnQpKSB7Ci0JCQkJCQlkZXNjZW5kYW50cy5hZGQoZGVzY2VuZGFudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWRlc2NlbmRhbnRzLmNvbnRhaW5zKGNoaWxkKSkgewotCQkJCQlkZXNjZW5kYW50cy5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihkZXNjZW5kYW50cykuaXRlcmF0b3IoKTsKLQl9Ci0KLQl2b2lkIGFwcGVuZENoaWxkKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmQ2hpbGROb2RlcyA9PSBudWxsKSB7Ci0JCQlmQ2hpbGROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlpZiAoIWZDaGlsZE5vZGVzLmNvbnRhaW5zKGNoaWxkKSkgewotCQkJZkNoaWxkTm9kZXMuYWRkKGNoaWxkKTsKLQkJCSgoQ1NTTU1Ob2RlSW1wbCkgY2hpbGQpLmZSZWZDb3VudCsrOwotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVDaGlsZChDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwgfHwgZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZXJhdG9yIGkgPSBmQ2hpbGROb2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCWlmIChpLm5leHQoKSA9PSBjaGlsZCkgewotCQkJCWkucmVtb3ZlKCk7Ci0JCQkJKChDU1NNTU5vZGVJbXBsKSBjaGlsZCkuZlJlZkNvdW50LS07Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCByZW1vdmVBbGxDaGlsZE5vZGVzKCkgewotCQlpZiAoZkNoaWxkTm9kZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZXJhdG9yIGkgPSBmQ2hpbGROb2Rlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCSgoQ1NTTU1Ob2RlSW1wbCkgaS5uZXh0KCkpLmZSZWZDb3VudC0tOwotCQl9Ci0JCWZDaGlsZE5vZGVzLmNsZWFyKCk7Ci0JfQotCi0JYWJzdHJhY3QgYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCk7Ci0KLQl2b2lkIGluaXRpYWxpemVBdHRyaWJ1dGUoTWFwIGF0dHJpYnV0ZXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQlpZiAoZkF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJZkF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0JCWZBdHRyaWJ1dGVzLnB1dEFsbChhdHRyaWJ1dGVzKTsKLQkJcG9zdFNldEF0dHJpYnV0ZSgpOwotCX0KLQotCXZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCWZEZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCX0KLQotCXZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotCQkvLyBkZWZhdWx0IDogbm9wCi0JfQotCi0JYWJzdHJhY3Qgc2hvcnQgZ2V0RXJyb3IoKTsKLQotCWludCBnZXRDaGlsZENvdW50KCkgewotCQlyZXR1cm4gKGZDaGlsZE5vZGVzICE9IG51bGwpID8gZkNoaWxkTm9kZXMuc2l6ZSgpIDogMDsKLQl9Ci0KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnQoKSB7Ci0JCXJldHVybiBmUmVmQ291bnQ7Ci0JfQotCi0KLQlwcml2YXRlIExpc3QgZkNoaWxkTm9kZXMgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZEZXNjcmlwdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBNYXAgZkF0dHJpYnV0ZXMgPSBudWxsOwotCXByaXZhdGUgaW50IGZSZWZDb3VudCA9IDA7IC8vIGZvciBlcnJvciBjaGVjawotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVfTk9UX0FWQUlMQUJMRSA9ICIiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTnVtYmVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NTnVtYmVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJhOWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTU51bWJlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTnVtYmVyOwotCi1jbGFzcyBDU1NNTU51bWJlckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1OdW1iZXIgewotCi0KLQlwdWJsaWMgQ1NTTU1OdW1iZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfTlVNQkVSOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gKGNoaWxkICE9IG51bGwgJiYgY2hpbGQuZ2V0VHlwZSgpID09IFRZUEVfVU5JVCk7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUGFnZVJ1bGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1QYWdlUnVsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5MzU2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1QYWdlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NUGFnZVJ1bGU7Ci0KLWNsYXNzIENTU01NUGFnZVJ1bGVJbXBsIGV4dGVuZHMgQ1NTTU1Ob2RlSW1wbCBpbXBsZW1lbnRzIENTU01NUGFnZVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1QYWdlUnVsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9QQUdFX1JVTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfUFJPUEVSVFkgfHwgdHlwZSA9PSBUWVBFX1NFTEVDVE9SKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qcm9wZXJ0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzkwOThiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVByb3BlcnR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLQotCi1jbGFzcyBDU1NNTVByb3BlcnR5SW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNTVByb3BlcnR5IHsKLQlwdWJsaWMgQ1NTTU1Qcm9wZXJ0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9QUk9QRVJUWTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfTlVNQkVSIHx8IHR5cGUgPT0gVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gVFlQRV9GVU5DVElPTiB8fCB0eXBlID09IFRZUEVfQ09OVEFJTkVSIHx8IHR5cGUgPT0gVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBUWVBFX1NFUEFSQVRPUiB8fCB0eXBlID09IFRZUEVfUFJPUEVSVFkpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVByb3BlcnR5I2dldENhdGVnb3J5TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDYXRlZ29yeU5hbWUoKSB7Ci0JCXJldHVybiBnZXRBdHRyaWJ1dGUoQVRUUl9DQVRFR09SWSk7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldFZhbHVlcygpIHsKLQkJVmFsdWVDb2xsZWN0b3IgY29sbGVjdG9yID0gbmV3IFZhbHVlQ29sbGVjdG9yKCk7Ci0JCWNvbGxlY3Rvci5hcHBseSh0aGlzKTsKLQkJcmV0dXJuIGNvbGxlY3Rvci5nZXROb2RlcygpOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0FURUdPUlkgPSAiY2F0ZWdvcnkiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NUHNldWRvQ2xhc3NJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBjYWI5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWNsYXNzIENTU01NUHNldWRvQ2xhc3NJbXBsIGV4dGVuZHMgQ1NTTU1TZWxlY3RvckltcGwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwuCi0JICovCi0JcHVibGljIENTU01NUHNldWRvQ2xhc3NJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVNlbGVjdG9yI2dldFNlbGVjdG9yVHlwZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTZWxlY3RvclR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX1BTRVVET19DTEFTUzsKLQl9Ci0KLQl2b2lkIHNldFNlbGVjdG9yU3RyaW5nKFN0cmluZyB2YWx1ZSkgewotCQlmVmFsdWUgPSAiOiIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0VsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWU5MDY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVBzZXVkb0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1wdWJsaWMgY2xhc3MgQ1NTTU1Qc2V1ZG9FbGVtZW50SW1wbCBleHRlbmRzIENTU01NU2VsZWN0b3JJbXBsIHsKLQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01NUHNldWRvRWxlbWVudEltcGwuCi0JICovCi0JcHVibGljIENTU01NUHNldWRvRWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfUFNFVURPX0VMRU1FTlQ7Ci0JfQotCi0Jdm9pZCBzZXRTZWxlY3RvclN0cmluZyhTdHJpbmcgdmFsdWUpIHsKLQkJZlZhbHVlID0gIjoiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNThiZTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0KLWNsYXNzIENTU01NU2VsZWN0b3JFeHByZXNzaW9uSW1wbCBleHRlbmRzIENTU01NU2VsZWN0b3JJbXBsIHsKLQotCXB1YmxpYyBDU1NNTVNlbGVjdG9yRXhwcmVzc2lvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNlbGVjdG9yVHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfRVhQUkVTU0lPTjsKLQl9Ci0KLQl2b2lkIHBvc3RTZXRBdHRyaWJ1dGUoKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQkJc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCQlTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQl9Ci0KLQkJTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCW1hcC5wdXQoRVhQUkVTU0lPTl9BREpBQ0VOVC50b0xvd2VyQ2FzZSgpLCAiKyIpOyAvLyROT04tTkxTLTEkCi0JCW1hcC5wdXQoRVhQUkVTU0lPTl9BVFRSSUJVVEUudG9Mb3dlckNhc2UoKSwgIltdIik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0NISUxELnRvTG93ZXJDYXNlKCksICI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJbWFwLnB1dChFWFBSRVNTSU9OX0RFU0NFTkRBTlQudG9Mb3dlckNhc2UoKSwgIicgJyIpOyAvLyROT04tTkxTLTEkCi0JCW1hcC5wdXQoRVhQUkVTU0lPTl9VTklWRVJTQUwudG9Mb3dlckNhc2UoKSwgIioiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZWYWx1ZSA9IChTdHJpbmcpIG1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkJaWYgKGZWYWx1ZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU2VsZWN0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdhODJjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TZWxlY3RvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU2VsZWN0b3I7Ci0KLQotYWJzdHJhY3QgY2xhc3MgQ1NTTU1TZWxlY3RvckltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TZWxlY3RvciB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTU1TZWxlY3RvckltcGwuCi0JICovCi0JcHVibGljIENTU01NU2VsZWN0b3JJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGUjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShBVFRSX05BTUUpOwotCQlpZiAobmFtZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTU1Ob2RlI2dldFR5cGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU0VMRUNUT1I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjZ2V0RXJyb3IoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NU2VsZWN0b3IjZ2V0U2VsZWN0b3JTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0b3JTdHJpbmcoKSB7Ci0JCXJldHVybiBmVmFsdWU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFNlbGVjdG9yU3RyaW5nKCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3RyaW5nSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3RyaW5nSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDM3NTlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0cmluZ0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3RyaW5nOwotCi1jbGFzcyBDU1NNTVN0cmluZ0ltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TdHJpbmcgewotCi0KLQlwdWJsaWMgQ1NTTU1TdHJpbmdJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU1RSSU5HOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIG5hbWUgPSBnZXRBdHRyaWJ1dGUoQVRUUl9OQU1FKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0Jc2hvcnQgZ2V0RXJyb3IoKSB7Ci0JCWlmIChnZXROYW1lKCkgPT0gbnVsbCkgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5FUlJPUl9OT1RfREVGSU5FRDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuTk9fRVJST1I7Ci0JCX0KLQl9Ci0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjcG9zdFNldEF0dHJpYnV0ZSgpCi0JICovCi0JLy8gdm9pZCBwb3N0U2V0QXR0cmlidXRlKCkgdGhyb3dzIEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uIHsKLQkvLyBzdXBlci5wb3N0U2V0QXR0cmlidXRlKCk7Ci0JLy8gU3RyaW5nIG5hbWUgPSBnZXROYW1lKCk7Ci0JLy8gaWYgKG5hbWUgPT0gbnVsbCkgeyB0aHJvdyBuZXcgQmFkSW5pdGlhbGl6YXRpb25FeGNlcHRpb24oKTsgfQotCS8vCi0JLy8gTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0FOWS50b0xvd2VyQ2FzZSgpLCAiPGFueT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19DT1VOVEVSX0lERU5USUZJRVIudG9Mb3dlckNhc2UoKSwgIjxjb3VudGVyPiIpOwotCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfRkFNSUxZX05BTUUudG9Mb3dlckNhc2UoKSwgIjxmYW1pbHktbmFtZT4iKTsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NTdHJpbmdJRC5TX0ZPTlRfRkFDRV9OQU1FLnRvTG93ZXJDYXNlKCksCi0JLy8gIjxmb250LWZhY2UtbmFtZT4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19QQUdFX0lERU5USUZJRVIudG9Mb3dlckNhc2UoKSwKLQkvLyAiPHBhZ2UtaWRlbnRpZmllcj4iKTsgLy8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTU3RyaW5nSUQuU19TUEVDSUZJQ19WT0lDRS50b0xvd2VyQ2FzZSgpLAotCS8vICI8c3BlY2lmaWMtdm9pY2U+Iik7IC8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1N0cmluZ0lELlNfVVJBTkdFLnRvTG93ZXJDYXNlKCksICI8dXJhbmdlPiIpOyAvLyROT04tTkxTLTEkCi0JLy8KLQkvLyBmVmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkvLyBpZiAoZlZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyB9Ci0JLy8KLQkvLyAvKgotCS8vICogQHNlZSBPYmplY3QjdG9TdHJpbmcoKQotCS8vICovCi0JLy8gcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkvLyByZXR1cm4gZlZhbHVlOwotCS8vIH0KLQkvLwotCS8vIHByaXZhdGUgU3RyaW5nIGZWYWx1ZSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NU3R5bGVSdWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDZjZmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlUnVsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NU3R5bGVSdWxlOwotCi1jbGFzcyBDU1NNTVN0eWxlUnVsZUltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TdHlsZVJ1bGUgewotCi0KLQlwdWJsaWMgQ1NTTU1TdHlsZVJ1bGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfU1RZTEVfUlVMRTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9QUk9QRVJUWSB8fCB0eXBlID09IFRZUEVfU0VMRUNUT1IpOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0Q2hpbGRDb3VudCgpID09IDApIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlU2hlZXRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1TdHlsZVNoZWV0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWRlOThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9DU1NNTVN0eWxlU2hlZXRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVN0eWxlU2hlZXQ7Ci0KLWNsYXNzIENTU01NU3R5bGVTaGVldEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1TdHlsZVNoZWV0IHsKLQotCi0JcHVibGljIENTU01NU3R5bGVTaGVldEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gVFlQRV9TVFlMRV9TSEVFVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBOQU1FX05PVF9BVkFJTEFCTEU7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENTU01NTm9kZUltcGwjY2FuQ29udGFpbihDU1NNTU5vZGUpCi0JICovCi0JYm9vbGVhbiBjYW5Db250YWluKENTU01NTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gY2hpbGQuZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gVFlQRV9DSEFSU0VUX1JVTEUgfHwgdHlwZSA9PSBUWVBFX0lNUE9SVF9SVUxFIHx8IHR5cGUgPT0gVFlQRV9QQUdFX1JVTEUgfHwgdHlwZSA9PSBUWVBFX01FRElBX1JVTEUgfHwgdHlwZSA9PSBUWVBFX0ZPTlRfRkFDRV9SVUxFIHx8IHR5cGUgPT0gVFlQRV9TVFlMRV9SVUxFKTsKLQl9Ci0KLQlzaG9ydCBnZXRFcnJvcigpIHsKLQkJaWYgKGdldENoaWxkQ291bnQoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLkVSUk9SX05PX0NISUxEOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUjsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Vbml0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01NVW5pdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRmM2YzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTU1Vbml0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NVW5pdDsKLQotLyoqCi0gKiBDU1NNTVVuaXQgOiBlbWJlZGRlZCB0eXBlCi0gKi8KLWNsYXNzIENTU01NVW5pdEltcGwgZXh0ZW5kcyBDU1NNTU5vZGVJbXBsIGltcGxlbWVudHMgQ1NTTU1Vbml0IHsKLQotCXB1YmxpYyBDU1NNTVVuaXRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIFRZUEVfVU5JVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyBuYW1lID0gZ2V0QXR0cmlidXRlKEFUVFJfTkFNRSk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCXJldHVybiBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTVVuaXQjZ2V0VW5pdFN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVbml0U3RyaW5nKCkgewotCQlyZXR1cm4gZlZhbHVlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI3Bvc3RTZXRBdHRyaWJ1dGUoKQotCSAqLwotCS8vIHZvaWQgcG9zdFNldEF0dHJpYnV0ZSgpIHRocm93cyBCYWRJbml0aWFsaXphdGlvbkV4Y2VwdGlvbiB7Ci0JLy8gc3VwZXIucG9zdFNldEF0dHJpYnV0ZSgpOwotCS8vIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCS8vIGlmIChuYW1lID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0NNLnRvTG93ZXJDYXNlKCksICJjbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0RFRy50b0xvd2VyQ2FzZSgpLCAiZGVnIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfRU1TLnRvTG93ZXJDYXNlKCksICJlbSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0VYUy50b0xvd2VyQ2FzZSgpLCAiZXgiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9HUkFELnRvTG93ZXJDYXNlKCksICJncmFkIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfSEFTSC50b0xvd2VyQ2FzZSgpLCAiIyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0haLnRvTG93ZXJDYXNlKCksICJIeiIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX0lOLnRvTG93ZXJDYXNlKCksICJpbiIpOy8vJE5PTi1OTFMtMSQKLQkvLyAvLyBtYXAucHV0KENTU1VuaXRJRC5VX0lOVEVHRVIudG9Mb3dlckNhc2UoKSwKLQkvLyAiKGludGVnZXIpIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfS0haLnRvTG93ZXJDYXNlKCksICJrSHoiKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9NTS50b0xvd2VyQ2FzZSgpLCAibW0iKTsvLyROT04tTkxTLTEkCi0JLy8gbWFwLnB1dChDU1NVbml0SUQuVV9NUy50b0xvd2VyQ2FzZSgpLCAibXMiKTsvLyROT04tTkxTLTEkCi0JLy8gLy8gbWFwLnB1dChDU1NVbml0SUQuVV9OVU1CRVIudG9Mb3dlckNhc2UoKSwgIihudW1iZXIpIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUEMudG9Mb3dlckNhc2UoKSwgInBjIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUEVSQ0VOVEFHRS50b0xvd2VyQ2FzZSgpLCAiJSIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BULnRvTG93ZXJDYXNlKCksICJwdCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1BYLnRvTG93ZXJDYXNlKCksICJweCIpOy8vJE5PTi1OTFMtMSQKLQkvLyBtYXAucHV0KENTU1VuaXRJRC5VX1JBRC50b0xvd2VyQ2FzZSgpLCAicmFkIik7Ly8kTk9OLU5MUy0xJAotCS8vIG1hcC5wdXQoQ1NTVW5pdElELlVfUy50b0xvd2VyQ2FzZSgpLCAicyIpOy8vJE5PTi1OTFMtMSQKLQkvLyBmVmFsdWUgPSAoU3RyaW5nKW1hcC5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKTsKLQkvLyBpZiAoZlZhbHVlID09IG51bGwpIHsgdGhyb3cgbmV3IEJhZEluaXRpYWxpemF0aW9uRXhjZXB0aW9uKCk7IH0KLQkvLyB9Ci0JLyoKLQkgKiBAc2VlIE9iamVjdCN0b1N0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIGdldFVuaXRTdHJpbmcoKTsKLQl9Ci0KLQl2b2lkIHNldFVuaXRTdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLQotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0TmFtZSgpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9UX0RFRklORUQ7Ci0JCX0KLQkJZWxzZSBpZiAoZ2V0VW5pdFN0cmluZygpID09IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZlZhbHVlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU01ldGFNb2RlbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3MjVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTTWV0YU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci0KLQotY2xhc3MgQ1NTTWV0YU1vZGVsSW1wbCBleHRlbmRzIENTU01NTm9kZUltcGwgaW1wbGVtZW50cyBDU1NNZXRhTW9kZWwgewotCS8vIGNsYXNzIENTU01ldGFNb2RlbEltcGwgaW1wbGVtZW50cyBDU1NNZXRhTW9kZWwgewotCXB1YmxpYyBDU1NNZXRhTW9kZWxJbXBsKCkgewotCQlzdXBlcigpOwotCQlmTm9kZVBvb2wgPSBuZXcgTm9kZVBvb2woKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBUWVBFX01FVEFfTU9ERUw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gTkFNRV9OT1RfQVZBSUxBQkxFOwotCX0KLQotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2NhbkNvbnRhaW4oQ1NTTU1Ob2RlKQotCSAqLwotCWJvb2xlYW4gY2FuQ29udGFpbihDU1NNTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGNoaWxkLmdldFR5cGUoKTsKLQkJcmV0dXJuICh0eXBlID09IFRZUEVfU1RZTEVfU0hFRVQgfHwgdHlwZSA9PSBUWVBFX0NBVEVHT1JZKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTU1TdHlsZVNoZWV0IGdldFN0eWxlU2hlZXQoKSB7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRDaGlsZE5vZGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBUWVBFX1NUWUxFX1NIRUVUKSB7Ci0JCQkJcmV0dXJuIChDU1NNTVN0eWxlU2hlZXQpIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JCS8vIHJldHVybiBmU3R5bGVTaGVldDsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0Q2F0ZWdvcmllcygpIHsKLQkJTGlzdCBjYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpID0gZ2V0Q2hpbGROb2RlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBub2RlID0gKENTU01NTm9kZSkgaS5uZXh0KCk7Ci0JCQlpZiAobm9kZS5nZXRUeXBlKCkgPT0gVFlQRV9DQVRFR09SWSkgewotCQkJCWNhdGVnb3JpZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBjYXRlZ29yaWVzLml0ZXJhdG9yKCk7Ci0JfQotCi0Jdm9pZCBsb2FkQ29tcGxldGVkKCkgewotCQlmTm9kZVBvb2wgPSBudWxsOwotCX0KLQotCS8vIExpc3QgZkNhdGVnb3JpZXMgPSBudWxsOwotCS8qCi0JICogQHNlZSBDU1NNTU5vZGVJbXBsI2lzVmFsaWQoKQotCSAqLwotCXNob3J0IGdldEVycm9yKCkgewotCQlpZiAoZ2V0U3R5bGVTaGVldCgpICE9IG51bGwpIHsKLQkJCXJldHVybiBNZXRhTW9kZWxFcnJvcnMuRVJST1JfTk9fQ0hJTEQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gTWV0YU1vZGVsRXJyb3JzLk5PX0VSUk9SOwotCQl9Ci0JfQotCi0JTm9kZVBvb2wgZ2V0Tm9kZVBvb2woKSB7Ci0JCXJldHVybiBmTm9kZVBvb2w7Ci0JfQotCi0KLQlwcml2YXRlIE5vZGVQb29sIGZOb2RlUG9vbCA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZkZjUwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNZXRhTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotCi1jbGFzcyBDU1NQcm9maWxlSW1wbCBpbXBsZW1lbnRzIENTU1Byb2ZpbGUgewotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIENTU01ldGFNb2RlbFByb2ZpbGVJbmZvSW1wbC4KLQkgKi8KLQlwcml2YXRlIENTU1Byb2ZpbGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxQcm9maWxlSW5mb0ltcGwuCi0JICovCi0JcHVibGljIENTU1Byb2ZpbGVJbXBsKFN0cmluZyBpZCwgVVJMIHVybCkgewotCQlzdXBlcigpOwotCQlmSUQgPSBpZDsKLQkJZlVSTCA9IHVybDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm9JbXBsLgotCSAqLwotCUNTU1Byb2ZpbGVJbXBsKFN0cmluZyBpZCwgVVJMIHVybCwgU3RyaW5nIHJlbGF0aXZlVVJJKSB7Ci0JCXN1cGVyKCk7Ci0JCWZJRCA9IGlkOwotCQlmVVJMID0gdXJsOwotCQlmUmVsYXRpdmVVUkkgPSByZWxhdGl2ZVVSSTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm8jZ2V0UHJvZmlsZUlEKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByb2ZpbGVJRCgpIHsKLQkJcmV0dXJuIGZJRDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm8jZ2V0UHJvZmlsZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvZmlsZU5hbWUoKSB7Ci0JCXJldHVybiAoZk5hbWUgPT0gbnVsbCkgPyBmSUQgOiBmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTTWV0YU1vZGVsIGdldE1ldGFNb2RlbCgpIHsKLQkJaWYgKGZNZXRhTW9kZWwgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IGdldFByb2ZpbGVVUkwoKS5vcGVuU3RyZWFtKCk7Ci0JCQkJUHJvZmlsZUxvYWRlciBsb2FkZXIgPSBuZXcgUHJvZmlsZUxvYWRlcihnZXRSZXNvdXJjZUJ1bmRsZSgpLCBnZXRMb2dnaW5nKCkpOwotCQkJCWZNZXRhTW9kZWwgPSBsb2FkZXIubG9hZFByb2ZpbGUoaW5wdXQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJDYW5ub3Qgb3BlbiBzdHJlYW0gZm9yIHByb2ZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBmTWV0YU1vZGVsOwotCX0KLQotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gbnVsbDsKLQotCQlCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJU3RyaW5nIHBsdWdpbklEID0gZ2V0T3duZXJQbHVnaW5JRCgpOwotCQlpZiAocGx1Z2luSUQgIT0gbnVsbCkgewotCQkJYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCS8vIG5lZWRlZCB0byB3b3JrIGFyb3VuZCBGaWxlTG9jYXRvci5vcGVuU3RyZWFtIG5vdCBsb29raW5nIGZvcgotCQkJCS8vIGZpbGVzIHdpdGggSmF2YSBuYW1pbmcgY29udmVudGlvbnMgKEJVRzEwMzM0NSkKLQkJCQlJUGF0aFtdIHBhdGhzID0gZ2V0UmVzb3VyY2VCdW5kbGVQYXRocygpOwotCQkJCWlmIChwYXRocyAhPSBudWxsKSB7Ci0JCQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJCQkJaW50IGkgPSAwOwotCQkJCQl3aGlsZSAoaSA8IHBhdGhzLmxlbmd0aCAmJiBpblN0cmVhbSA9PSBudWxsKSB7Ci0JCQkJCQlJUGF0aCBwYXRoID0gcGF0aHNbaV07Ci0JCQkJCQl0cnkgewotCQkJCQkJCWluU3RyZWFtID0gRmlsZUxvY2F0b3Iub3BlblN0cmVhbShidW5kbGUsIHBhdGgsIHRydWUpOwotCQkJCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKQotCQkJCQkJCQlyZXNvdXJjZUJ1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGluU3RyZWFtKTsKLQkJCQkJCQllbHNlCi0JCQkJCQkJCSsraTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJLy8gdW5hYmxlIHRvIG9wZW4gc3RyZWFtIHdpdGggY3VycmVudCBwYXRoIHNvIGp1c3QKLQkJCQkJCQkvLyB0cnkgbmV4dCBwYXRoCi0JCQkJCQkJKytpOwotCQkJCQkJfQotCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJaWYgKGluU3RyZWFtICE9IG51bGwpCi0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBwb3RlbnRpYWwgcmVzb3VyY2UgYnVuZGxlIHBhdGhzIG9yIG51bGwgaWYgdGhlcmUKLQkgKiBhcmUgbm9uZQotCSAqIAotCSAqIEByZXR1cm4gSVBhdGhbXSBvciBudWxsCi0JICovCi0JcHJpdmF0ZSBJUGF0aFtdIGdldFJlc291cmNlQnVuZGxlUGF0aHMoKSB7Ci0JCUlQYXRoW10gcGF0aHMgPSBuZXcgSVBhdGhbMF07Ci0KLQkJaWYgKGZSZWxhdGl2ZVVSSSAhPSBudWxsKSB7Ci0JCQkvLyBvcmlnaW5hbCBwYXRoID0gbG9jYXRpb24gb2YgcHJvZmlsZS54bWwgLSBwcm9maWxlLnhtbAotCQkJSVBhdGggb3JpZ2luYWxQYXRoID0gUGF0aC5mcm9tT1NTdHJpbmcoZlJlbGF0aXZlVVJJKS5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0KLQkJCVN0cmluZyBiYXNlTmFtZSA9ICJjc3Nwcm9maWxlIjsgLy8kTk9OLU5MUy0xJCAKLQkJCVZlY3RvciBuYW1lcyA9IGNhbGN1bGF0ZUJ1bmRsZU5hbWVzKGJhc2VOYW1lLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQotCQkJaW50IGEgPSAwOwotCQkJcGF0aHMgPSBuZXcgSVBhdGhbbmFtZXMuc2l6ZSgpXTsKLQkJCWZvciAoaW50IGkgPSBuYW1lcy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKLQkJCQlTdHJpbmcgYnVuZGxlTmFtZSA9IChTdHJpbmcpIG5hbWVzLmdldChpIC0gMSk7Ci0JCQkJSVBhdGggcGF0aCA9IG9yaWdpbmFsUGF0aC5hcHBlbmQoYnVuZGxlTmFtZSkuYWRkRmlsZUV4dGVuc2lvbigicHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJcGF0aHNbYV0gPSBwYXRoOwotCQkJCSsrYTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGF0aHM7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIHRoZSBidW5kbGVzIGFsb25nIHRoZSBzZWFyY2ggcGF0aCBmcm9tIHRoZSBiYXNlIGJ1bmRsZSB0byB0aGUKLQkgKiBidW5kbGUgc3BlY2lmaWVkIGJ5IGJhc2VOYW1lIGFuZCBsb2NhbGUuPGJyIC8+Ci0JICogCi0JICogQHBhcmFtIGJhc2VOYW1lCi0JICogICAgICAgICAgICB0aGUgYmFzZSBidW5kbGUgbmFtZQotCSAqIEBwYXJhbSBsb2NhbGUKLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbGUKLQkgKiBAcGFyYW0gbmFtZXMKLQkgKiAgICAgICAgICAgIHRoZSB2ZWN0b3IgdXNlZCB0byByZXR1cm4gdGhlIG5hbWVzIG9mIHRoZSBidW5kbGVzIGFsb25nIHRoZQotCSAqICAgICAgICAgICAgc2VhcmNoIHBhdGguCi0JICogCi0JICovCi0JcHJpdmF0ZSBWZWN0b3IgY2FsY3VsYXRlQnVuZGxlTmFtZXMoU3RyaW5nIGJhc2VOYW1lLCBMb2NhbGUgbG9jYWxlKSB7Ci0JICAgIC8vIHRoaXMgbWV0aG9kIGNhbiBiZSBkZWxldGVkIGFmdGVyIEJVRzEwMzM0NSBpcyBmaXhlZAotCQlmaW5hbCBWZWN0b3IgcmVzdWx0ID0gbmV3IFZlY3Rvcig0KTsgLy8gZGVmYXVsdCBzaXplIDQKLQkJZmluYWwgU3RyaW5nIGxhbmd1YWdlID0gbG9jYWxlLmdldExhbmd1YWdlKCk7Ci0JCWZpbmFsIGludCBsYW5ndWFnZUxlbmd0aCA9IGxhbmd1YWdlLmxlbmd0aCgpOwotCQlmaW5hbCBTdHJpbmcgY291bnRyeSA9IGxvY2FsZS5nZXRDb3VudHJ5KCk7Ci0JCWZpbmFsIGludCBjb3VudHJ5TGVuZ3RoID0gY291bnRyeS5sZW5ndGgoKTsKLQkJZmluYWwgU3RyaW5nIHZhcmlhbnQgPSBsb2NhbGUuZ2V0VmFyaWFudCgpOwotCQlmaW5hbCBpbnQgdmFyaWFudExlbmd0aCA9IHZhcmlhbnQubGVuZ3RoKCk7Ci0KLQkJcmVzdWx0LmFkZEVsZW1lbnQoYmFzZU5hbWUpOyAvLyBhdCBsZWFzdCBhZGQgYmFzZSBuYW1lCi0JCWlmIChsYW5ndWFnZUxlbmd0aCArIGNvdW50cnlMZW5ndGggKyB2YXJpYW50TGVuZ3RoID09IDApIHsKLQkJCS8vIFRoZSBsb2NhbGUgaXMgIiIsICIiLCAiIi4KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJZmluYWwgU3RyaW5nQnVmZmVyIHRlbXAgPSBuZXcgU3RyaW5nQnVmZmVyKGJhc2VOYW1lKTsKLQkJdGVtcC5hcHBlbmQoJ18nKTsKLQkJdGVtcC5hcHBlbmQobGFuZ3VhZ2UpOwotCQlpZiAobGFuZ3VhZ2VMZW5ndGggPiAwKSB7Ci0JCQlyZXN1bHQuYWRkRWxlbWVudCh0ZW1wLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKGNvdW50cnlMZW5ndGggKyB2YXJpYW50TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJdGVtcC5hcHBlbmQoJ18nKTsKLQkJdGVtcC5hcHBlbmQoY291bnRyeSk7Ci0JCWlmIChjb3VudHJ5TGVuZ3RoID4gMCkgewotCQkJcmVzdWx0LmFkZEVsZW1lbnQodGVtcC50b1N0cmluZygpKTsKLQkJfQotCi0JCWlmICh2YXJpYW50TGVuZ3RoID09IDApIHsKLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQkJdGVtcC5hcHBlbmQoJ18nKTsKLQkJdGVtcC5hcHBlbmQodmFyaWFudCk7Ci0JCXJlc3VsdC5hZGRFbGVtZW50KHRlbXAudG9TdHJpbmcoKSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ1NTTWV0YU1vZGVsUHJvZmlsZUluZm8jZ2V0UHJvZmlsZVVSTCgpCi0JICovCi0JcHVibGljIFVSTCBnZXRQcm9maWxlVVJMKCkgewotCQlyZXR1cm4gZlVSTDsKLQl9Ci0KLQl2b2lkIHNldFByb2ZpbGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWZOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiBmRGVmYXVsdDsKLQl9Ci0KLQl2b2lkIHNldERlZmF1bHQoYm9vbGVhbiBpc0RlZmF1bHQpIHsKLQkJZkRlZmF1bHQgPSBpc0RlZmF1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPd25lclBsdWdpbklEKCkgewotCQlyZXR1cm4gZk93bmVyUGx1Z2luSUQ7Ci0JfQotCi0Jdm9pZCBzZXRPd25lclBsdWdpbklEKFN0cmluZyBwbHVnaW5JRCkgewotCQlmT3duZXJQbHVnaW5JRCA9IHBsdWdpbklEOwotCX0KLQotCS8qKgotCSAqIGhpZGRlbiBvcHRpb24gOiBsb2dnaW5nCi0JICovCi0Jdm9pZCBzZXRMb2dnaW5nKGJvb2xlYW4gbG9nZ2luZykgewotCQlmTG9nZ2luZyA9IGxvZ2dpbmc7Ci0JfQotCi0JYm9vbGVhbiBnZXRMb2dnaW5nKCkgewotCQlyZXR1cm4gZkxvZ2dpbmc7Ci0JfQotCi0KLQlTdHJpbmcgZklEID0gbnVsbDsKLQlTdHJpbmcgZk5hbWUgPSBudWxsOwotCVVSTCBmVVJMID0gbnVsbDsKLQlDU1NNZXRhTW9kZWwgZk1ldGFNb2RlbCA9IG51bGw7Ci0JU3RyaW5nIGZPd25lclBsdWdpbklEID0gbnVsbDsKLQlib29sZWFuIGZEZWZhdWx0ID0gZmFsc2U7Ci0JYm9vbGVhbiBmTG9nZ2luZyA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZSZWxhdGl2ZVVSSSA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL0NTU1Byb2ZpbGVUZXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxMTU5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvQ1NTUHJvZmlsZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci0KLQotY2xhc3MgQ1NTUHJvZmlsZVRlc3QgewotCi0KLQkvKioKLQkgKiBUZXN0IHVzZSBvbmx5Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlpZiAoYXJncy5sZW5ndGggPT0gMCkKLQkJCXJldHVybjsKLQkJQ1NTTWV0YU1vZGVsIG1ldGFtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlDU1NQcm9maWxlIHByb2ZpbGUgPSBuZXcgQ1NTUHJvZmlsZUltcGwoInRlc3QiLCBuZXcgVVJMKGFyZ3NbMF0pKTsgLy8kTk9OLU5MUy0xJAotCQkJbWV0YW1vZGVsID0gcHJvZmlsZS5nZXRNZXRhTW9kZWwoKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKG1ldGFtb2RlbCA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLyoKLQkJICogQ1NTTU1UeXBlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDU1NNTVR5cGVDb2xsZWN0b3IoKTsKLQkJICogY29sbGVjdG9yLmFwcGx5KG1ldGFtb2RlbCwgQ1NTTU1Ob2RlLlRZUEVfUFJPUEVSVFkpOyBJdGVyYXRvcgotCQkgKiBpUHJvcGVydHkgPSBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsgd2hpbGUgKGlQcm9wZXJ0eS5oYXNOZXh0KCkpIHsKLQkJICogQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKWlQcm9wZXJ0eS5uZXh0KCk7Ci0JCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvcGVydHkgIiArIG5vZGUuZ2V0TmFtZSgpICsgIiBjYW4gY29udGFpbjoiKTsKLQkJICogLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkIEl0ZXJhdG9yIGlWYWx1ZSA9Ci0JCSAqIG5vZGUuZ2V0RGVzY2VuZGFudHMoKTsgd2hpbGUgKGlWYWx1ZS5oYXNOZXh0KCkpIHsKLQkJICogZGVidWdPdXQoKENTU01NTm9kZSlpVmFsdWUubmV4dCgpLCAwLCBmYWxzZSk7IH0gfQotCQkgKi8KLQkJZGVidWdPdXQobWV0YW1vZGVsLCAwLCB0cnVlKTsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBkZWJ1Z091dChDU1NNTU5vZGUgbm9kZSwgaW50IGRlcHRoLCBib29sZWFuIHJlY3Vyc2l2ZSkgewotCQlTdHJpbmcgdHlwZSA9IG5vZGUuZ2V0VHlwZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlcHRoOyBpKyspIHsKLQkJCVN5c3RlbS5vdXQucHJpbnQoIlx0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50KCJbICIgKyBub2RlLmdldE5hbWUoKSArICIoIiArIHR5cGUgKyAiKSBdIik7IC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlID09IENTU01NTm9kZS5UWVBFX1VOSVQgfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9LRVlXT1JEIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfRlVOQ1RJT04gfHwgdHlwZSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUikgewotCQkJU3lzdGVtLm91dC5wcmludCgiIC0+ICIgKyBub2RlLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0KLQkJaWYgKHJlY3Vyc2l2ZSkgewotCQkJamF2YS51dGlsLkl0ZXJhdG9yIGlOb2RlID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQl3aGlsZSAoaU5vZGUuaGFzTmV4dCgpKSB7Ci0JCQkJZGVidWdPdXQoKENTU01NTm9kZSkgaU5vZGUubmV4dCgpLCBkZXB0aCArIDEsIHRydWUpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9NZXRhTW9kZWxFcnJvcnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9NZXRhTW9kZWxFcnJvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4YzU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvTWV0YU1vZGVsRXJyb3JzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbnRlcmZhY2UgTWV0YU1vZGVsRXJyb3JzIHsKLQotCXN0YXRpYyBmaW5hbCBzaG9ydCBOT19FUlJPUiA9IDA7Ci0KLQkvLyBNQVNLCi0Jc3RhdGljIGZpbmFsIHNob3J0IE1BU0tfV0FSTklORyA9IDB4MTAwMDsKLQlzdGF0aWMgZmluYWwgc2hvcnQgTUFTS19FUlJPUiA9IDB4MjAwMDsKLQotCS8vIEVSUk9SCi0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PVF9ERUZJTkVEID0gTUFTS19FUlJPUiArIDB4MDE7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX0lOVkFMSURfTkFNRSA9IE1BU0tfRVJST1IgKyAweDA0OwotCXN0YXRpYyBmaW5hbCBzaG9ydCBFUlJPUl9JTlZBSUxEX0NISUxEID0gTUFTS19FUlJPUiArIDB4MDI7Ci0Jc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PX0NISUxEID0gTUFTS19FUlJPUiArIDB4MDg7Ci0JLy8gc3RhdGljIGZpbmFsIHNob3J0IEVSUk9SX05PX0VTU0VOVElBTF9DSElMRCA9IE1BU0tfRVJST1IgKyAweDEwCi0KLQkvLyBXQVJOSU5HCi0Jc3RhdGljIGZpbmFsIHNob3J0IFdBUk5JTkdfSEFTX05PX0NISUxEID0gTUFTS19XQVJOSU5HICsgMHgwMTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvTm9kZVBvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDVkZDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Ob2RlUG9vbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0KLWNsYXNzIE5vZGVQb29sIHsKLQotCU5vZGVQb29sKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplQ2xhc3NOYW1lVGFibGUoKTsKLQl9Ci0KLQlDU1NNTU5vZGVJbXBsIGdldE5vZGUoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyBub2RlTmFtZSkgewotCQlpZiAobm9kZU5hbWUgIT0gbnVsbCkgewotCQkJbm9kZU5hbWUgPSBub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwotCQl9Ci0JCVN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBjbGFzc05hbWVzLmdldCh0YWdOYW1lKTsKLQkJaWYgKGNsYXNzTmFtZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlNYXAgbm9kZXMgPSAoTWFwKSBub2RlUmVnaXN0cnkuZ2V0KGNsYXNzTmFtZSk7Ci0JCWlmIChub2RlcyA9PSBudWxsKSB7Ci0JCQlub2RlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlub2RlUmVnaXN0cnkucHV0KGNsYXNzTmFtZSwgbm9kZXMpOwotCQl9Ci0JCUNTU01NTm9kZUltcGwgbm9kZSA9IChDU1NNTU5vZGVJbXBsKSBub2Rlcy5nZXQobm9kZU5hbWUpOwotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlub2RlID0gY3JlYXRlTmV3Tm9kZShjbGFzc05hbWUpOwotCQkJbm9kZXMucHV0KG5vZGVOYW1lLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQlwcml2YXRlIENTU01NTm9kZUltcGwgY3JlYXRlTmV3Tm9kZShTdHJpbmcgY2xhc3NOYW1lKSB7Ci0JCUNTU01NTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0JCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJY2xhc3NOYW1lID0gZ2V0UGFja2FnZU5hbWUoKSArICIuIiArIGNsYXNzTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQlub2RlID0gKENTU01NTm9kZUltcGwpIENsYXNzLmZvck5hbWUoY2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJfQotCQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQljYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihjbGFzc05hbWUgKyAiIGlzIENyZWF0ZWQiKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogRXJyb3IgY2hlY2sgZnVuY3Rpb246IGZpbmQgbm9kZXMgdGhhdCBhcmUgbm90IHJlZmVycmVkIGJ5IGFueSBub2RlCi0JICovCi0JSXRlcmF0b3IgZ2V0U3RyYXlOb2RlcygpIHsKLQkJTGlzdCBzdHJheU5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlJdGVyYXRvciBpTWFwID0gbm9kZVJlZ2lzdHJ5LnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpTWFwLmhhc05leHQoKSkgewotCQkJTWFwIG5vZGVzID0gKE1hcCkgaU1hcC5uZXh0KCk7Ci0JCQlJdGVyYXRvciBpTm9kZSA9IG5vZGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaU5vZGUuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlSW1wbCBub2RlID0gKENTU01NTm9kZUltcGwpIGlOb2RlLm5leHQoKTsKLQkJCQlpZiAobm9kZS5nZXRSZWZlcmVuY2VDb3VudCgpID09IDApIHsKLQkJCQkJc3RyYXlOb2Rlcy5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJheU5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLy8gVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBpbm5lciBjbGFzcyA6KQotCXByaXZhdGUgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotCQlpZiAoZlBhY2thZ2VOYW1lID09IG51bGwpIHsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBnZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCWludCBwb3MgPSBjbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKTsKLQkJCWlmICgwIDwgcG9zKSB7Ci0JCQkJZlBhY2thZ2VOYW1lID0gY2xhc3NOYW1lLnN1YnN0cmluZygwLCBwb3MpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlBhY2thZ2VOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlBhY2thZ2VOYW1lOwotCX0KLQotCXZvaWQgaW5pdGlhbGl6ZUNsYXNzTmFtZVRhYmxlKCkgewotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RZTEVTSEVFVF9ERUYsIENMQVNTX1NUWUxFX1NIRUVUKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNIQVJTRVRfUlVMRV9ERUYsIENMQVNTX0NIQVJTRVRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DSEFSU0VUX1JVTEUsIENMQVNTX0NIQVJTRVRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GT05URkFDRV9SVUxFX0RFRiwgQ0xBU1NfRk9OVF9GQUNFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuRk9OVEZBQ0VfUlVMRSwgQ0xBU1NfRk9OVF9GQUNFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuSU1QT1JUX1JVTEVfREVGLCBDTEFTU19JTVBPUlRfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5JTVBPUlRfUlVMRSwgQ0xBU1NfSU1QT1JUX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuTUVESUFfUlVMRV9ERUYsIENMQVNTX01FRElBX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuTUVESUFfUlVMRSwgQ0xBU1NfTUVESUFfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QQUdFX1JVTEVfREVGLCBDTEFTU19QQUdFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUEFHRV9SVUxFLCBDTEFTU19QQUdFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RZTEVfUlVMRV9ERUYsIENMQVNTX1NUWUxFX1JVTEUpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuU1RZTEVfUlVMRSwgQ0xBU1NfU1RZTEVfUlVMRSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5QUk9QRVJUWV9ERUYsIENMQVNTX1BST1BFUlRZKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZLCBDTEFTU19QUk9QRVJUWSk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5ERVNDUklQVE9SX0RFRiwgQ0xBU1NfREVTQ1JJUFRPUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5ERVNDUklQVE9SLCBDTEFTU19ERVNDUklQVE9SKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNPTlRBSU5FUl9ERUYsIENMQVNTX0NPTlRBSU5FUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5DT05UQUlORVIsIENMQVNTX0NPTlRBSU5FUik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5OVU1CRVJfREVGLCBDTEFTU19OVU1CRVIpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuTlVNQkVSLCBDTEFTU19OVU1CRVIpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuS0VZV09SRF9ERUYsIENMQVNTX0tFWVdPUkQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuS0VZV09SRCwgQ0xBU1NfS0VZV09SRCk7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5VTklULCBDTEFTU19VTklUKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlVOSVRfREVGLCBDTEFTU19VTklUKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkZVTkNUSU9OLCBDTEFTU19GVU5DVElPTik7Ci0JCWNsYXNzTmFtZXMucHV0KFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9ERUYsIENMQVNTX0ZVTkNUSU9OKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX0VYUFJFU1NJT04sIENMQVNTX1NFTEVDVE9SX0VYUFJFU1NJT04pOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0VMRU1FTlQsIENMQVNTX1BTRVVET19FTEVNRU5UKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlBTRVVET19FTEVNRU5UX0RFRiwgQ0xBU1NfUFNFVURPX0VMRU1FTlQpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0NMQVNTLCBDTEFTU19QU0VVRE9fQ0xBU1MpOwotCQljbGFzc05hbWVzLnB1dChQcm9maWxlS2V5d29yZHMuUFNFVURPX0NMQVNTX0RFRiwgQ0xBU1NfUFNFVURPX0NMQVNTKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLlNUUklORywgQ0xBU1NfU1RSSU5HKTsKLQkJY2xhc3NOYW1lcy5wdXQoUHJvZmlsZUtleXdvcmRzLkNBVEVHT1JZX0RFRiwgQ0xBU1NfQ0FURUdPUlkpOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZlBhY2thZ2VOYW1lOwotCS8qCi0JICogQ29udmVyc2lvbiBUYWJsZXMgbm9kZVJlZ2lzdHJ5IDogY2xhc3MgbmFtZSAtPiBoYXNoIG9mIG5vZGUgaW5zdGFuY2VzCi0JICogY2xhc3NOYW1lcyA6IFByb2ZpbGUgVGFnIG5hbWUgLT4gamF2YSBjbGFzcyBuYW1lCi0JICovCi0JcHJpdmF0ZSBNYXAgbm9kZVJlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQlwcml2YXRlIE1hcCBjbGFzc05hbWVzID0gbmV3IEhhc2hNYXAoKTsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19TVFlMRV9TSEVFVCA9ICJDU1NNTVN0eWxlU2hlZXRJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19DSEFSU0VUX1JVTEUgPSAiQ1NTTU1DaGFyc2V0UnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0ZPTlRfRkFDRV9SVUxFID0gIkNTU01NRm9udEZhY2VSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfSU1QT1JUX1JVTEUgPSAiQ1NTTU1JbXBvcnRSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfTUVESUFfUlVMRSA9ICJDU1NNTU1lZGlhUnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BBR0VfUlVMRSA9ICJDU1NNTVBhZ2VSdWxlSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU1RZTEVfUlVMRSA9ICJDU1NNTVN0eWxlUnVsZUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BST1BFUlRZID0gIkNTU01NUHJvcGVydHlJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19ERVNDUklQVE9SID0gIkNTU01NRGVzY3JpcHRvckltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0NPTlRBSU5FUiA9ICJDU1NNTUNvbnRhaW5lckltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX05VTUJFUiA9ICJDU1NNTU51bWJlckltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX0tFWVdPUkQgPSAiQ1NTTU1LZXl3b3JkSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfVU5JVCA9ICJDU1NNTVVuaXRJbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19GVU5DVElPTiA9ICJDU1NNTUZ1bmN0aW9uSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfU1RSSU5HID0gIkNTU01NU3RyaW5nSW1wbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xBU1NfQ0FURUdPUlkgPSAiQ1NTTU1DYXRlZ29yeUltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1NFTEVDVE9SX0VYUFJFU1NJT04gPSAiQ1NTTU1TZWxlY3RvckV4cHJlc3Npb25JbXBsIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBDTEFTU19QU0VVRE9fQ0xBU1MgPSAiQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENMQVNTX1BTRVVET19FTEVNRU5UID0gIkNTU01NUHNldWRvRWxlbWVudEltcGwiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJiOTBiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0KLWNsYXNzIFByb2ZpbGVIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgewotCi0JcHVibGljIFByb2ZpbGVIYW5kbGVyKENTU01ldGFNb2RlbEltcGwgbWV0YW1vZGVsLCBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgYm9vbGVhbiBsb2dnaW5nKSB7Ci0JCXN1cGVyKCk7Ci0JCWZNZXRhTW9kZWwgPSBtZXRhbW9kZWw7Ci0JCWZOb2RlUG9vbCA9IG1ldGFtb2RlbC5nZXROb2RlUG9vbCgpOwotCQlmUmVzb3VyY2VCdW5kbGUgPSByZXNvdXJjZUJ1bmRsZTsKLQkJZkxvZ2dpbmcgPSBsb2dnaW5nOwotCX0KLQotCXB1YmxpYyBQcm9maWxlSGFuZGxlcihDU1NNZXRhTW9kZWxJbXBsIG1ldGFtb2RlbCwgUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUpIHsKLQkJc3VwZXIoKTsKLQkJZk1ldGFNb2RlbCA9IG1ldGFtb2RlbDsKLQkJZk5vZGVQb29sID0gbWV0YW1vZGVsLmdldE5vZGVQb29sKCk7Ci0JCWZSZXNvdXJjZUJ1bmRsZSA9IHJlc291cmNlQnVuZGxlOwotCQlmTG9nZ2luZyA9IGZhbHNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlU3RyaW5nKFN0cmluZyBrZXkpIHsKLQkJaWYgKGtleS5lcXVhbHMoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JCWlmICgha2V5LnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JCWlmIChrZXkuc3RhcnRzV2l0aCgiJSUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4ga2V5LnN1YnN0cmluZygxKTsKLQkJfQotCi0JCWlmIChmUmVzb3VyY2VCdW5kbGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZS5nZXRTdHJpbmcoa2V5LnN1YnN0cmluZygxKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4ga2V5OwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnREb2N1bWVudCgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN0YXJ0RG9jdW1lbnQiKTsKLQkJLy8gZk5vZGVTdGFjay5wdXNoKG1ldGFtb2RlbCk7Ci0JCS8vIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJbmV3IEVycm9yQ29ycmVjdG9yKCkuZG9Db3JyZWN0KGZNZXRhTW9kZWwpOwotCQlpZiAoZkxvZ2dpbmcpIHsKLQkJCUl0ZXJhdG9yIGkgPSBmTm9kZVBvb2wuZ2V0U3RyYXlOb2RlcygpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJCQlTdHJpbmcgc3RyID0gIltDU1NQcm9maWxlIFdhcm5pbmddICIgKyBub2RlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0ciArPSAiKCIgKyBub2RlLmdldFR5cGUoKSArICIpIGlzIG5vdCByZWZlcnJlZCBieSBhbnkgbm9kZS4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCBzdHIpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbihzdHIpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJVGFnTm9kZSB0YWdOb2RlID0gbnVsbDsKLQkJQ1NTTU1Ob2RlSW1wbCBwYXJlbnROb2RlID0gbnVsbDsKLQkJaWYgKDAgPCBmTm9kZVN0YWNrLnNpemUoKSkgewotCQkJdGFnTm9kZSA9IChUYWdOb2RlKSBmTm9kZVN0YWNrLnBlZWsoKTsKLQkJCXBhcmVudE5vZGUgPSB0YWdOb2RlLm5vZGU7Ci0JCX0KLQotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCQlpZiAocU5hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5QUk9GSUxFX0lNUE9SVCkpIHsgLy8gaW1wb3J0Ci0JCQlTdHJpbmcgcHJvZmlsZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9SRUZFUkVOQ0UpOwotCQkJaW1wb3J0UHJvZmlsZShwcm9maWxlTmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNEZWZpbml0aW9uKHFOYW1lKSkgeyAvLyBub2RlIGNyZWF0aW9uCi0JCQlTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9ERUZJTklUSU9OKTsKLQkJCW5vZGUgPSBmTm9kZVBvb2wuZ2V0Tm9kZShxTmFtZSwgbm9kZU5hbWUpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBvdmVyd3JpdGUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfT1ZFUldSSVRFKTsKLQkJCQlpZiAob3ZlcndyaXRlID09IG51bGwgfHwgb3ZlcndyaXRlLmVxdWFscyhBVFRSX1ZBTFVFX09WRVJXUklURV9GQUxTRSkpIHsKLQkJCQkJbm9kZS5yZW1vdmVBbGxDaGlsZE5vZGVzKCk7Ci0JCQkJfQotCQkJCU1hcCBhdHRyTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlhdHRyTWFwLnB1dChhdHRyaWJ1dGVzLmdldFFOYW1lKGkpLCBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpKTsKLQkJCQl9Ci0JCQkJdHJ5IHsKLQkJCQkJbm9kZS5pbml0aWFsaXplQXR0cmlidXRlKGF0dHJNYXApOwotCQkJCX0KLQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSA9PSBudWxsKSB7IC8vIG5vZGUgcmVmZXJlbmNlCi0JCQlTdHJpbmcgbm9kZU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKEFUVFJfTkFNRV9SRUZFUkVOQ0UpOwotCQkJbm9kZSA9IGZOb2RlUG9vbC5nZXROb2RlKHFOYW1lLCBub2RlTmFtZSk7Ci0JCX0KLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuY2FuQ29udGFpbihub2RlKSkgewotCQkJCVN0cmluZyBlbmFibGVkID0gYXR0cmlidXRlcy5nZXRWYWx1ZShBVFRSX0VOQUJMRUQpOwotCQkJCWlmIChlbmFibGVkICE9IG51bGwgJiYgZW5hYmxlZC5lcXVhbHMoQVRUUl9WQUxVRV9FTkFCTEVEX0ZBTFNFKSkgewotCQkJCQlwYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TVFlMRV9TSEVFVCB8fCBub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9DQVRFR09SWSkgewotCQkJCWZNZXRhTW9kZWwuYXBwZW5kQ2hpbGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZkxvZ2dpbmcgJiYgcGFyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBwYXJlbnROb2RlLmdldFR5cGUoKSArICIgY2Fubm90IGNvbnRhaW4gIiArIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbm9kZS5nZXRUeXBlKCkgKyAiICgiICsgcU5hbWUgKyAiKSIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWZOb2RlU3RhY2sucHVzaChuZXcgVGFnTm9kZShxTmFtZSwgKG5vZGUgIT0gbnVsbCkgPyBub2RlIDogcGFyZW50Tm9kZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJZk5vZGVTdGFjay5wb3AoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJVGFnTm9kZSB0YWdOb2RlID0gKFRhZ05vZGUpIGZOb2RlU3RhY2sucGVlaygpOwotCQlTdHJpbmcgdGFnTmFtZSA9IHRhZ05vZGUudGFnOwotCQlpZiAodGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5VTklUX1ZBTFVFKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fVkFMVUUpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TRUxFQ1RPUl9WQUxVRSkgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUSU9OKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FQVElPTikpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJYnVmLmFwcGVuZChjaFtzdGFydCArIGldKTsKLQkJCX0KLQkJCVN0cmluZyB2YWx1ZSA9IGdldFJlc291cmNlU3RyaW5nKGJ1Zi50b1N0cmluZygpLnRyaW0oKSk7Ci0JCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSB0YWdOb2RlLm5vZGU7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0tFWVdPUkQgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfVkFMVUUpKSB7Ci0JCQkJCSgoQ1NTTU1LZXl3b3JkSW1wbCkgbm9kZSkuc2V0S2V5d29yZFN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX1VOSVQgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfVkFMVUUpKSB7Ci0JCQkJCSgoQ1NTTU1Vbml0SW1wbCkgbm9kZSkuc2V0VW5pdFN0cmluZyh2YWx1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5vZGUuZ2V0VHlwZSgpID09IENTU01NTm9kZS5UWVBFX0ZVTkNUSU9OICYmIHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5GVU5DVElPTl9WQUxVRSkpIHsKLQkJCQkJKChDU1NNTUZ1bmN0aW9uSW1wbCkgbm9kZSkuc2V0RnVuY3Rpb25TdHJpbmcodmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUiAmJiAoKENTU01NU2VsZWN0b3IpIG5vZGUpLmdldFNlbGVjdG9yVHlwZSgpID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fRUxFTUVOVCkgewotCQkJCQkoKENTU01NUHNldWRvRWxlbWVudEltcGwpIG5vZGUpLnNldFNlbGVjdG9yU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfU0VMRUNUT1IgJiYgKChDU1NNTVNlbGVjdG9yKSBub2RlKS5nZXRTZWxlY3RvclR5cGUoKSA9PSBDU1NNTVNlbGVjdG9yLlRZUEVfUFNFVURPX0NMQVNTKSB7Ci0JCQkJCSgoQ1NTTU1Qc2V1ZG9DbGFzc0ltcGwpIG5vZGUpLnNldFNlbGVjdG9yU3RyaW5nKHZhbHVlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXRUeXBlKCkgPT0gQ1NTTU1Ob2RlLlRZUEVfQ0FURUdPUlkgJiYgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkNBUFRJT04pKSB7Ci0JCQkJCSgoQ1NTTU1DYXRlZ29yeUltcGwpIG5vZGUpLnNldENhcHRpb24odmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuREVTQ1JJUFRJT04pKSB7Ci0JCQkJCW5vZGUuc2V0RGVzY3JpcHRpb24odmFsdWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmluaXRpb24oU3RyaW5nIHRhZ05hbWUpIHsKLQkJcmV0dXJuICh0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU1RZTEVTSEVFVF9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5DSEFSU0VUX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuSU1QT1JUX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUEFHRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLk1FRElBX1JVTEVfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRk9OVEZBQ0VfUlVMRV9ERUYpIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TVFlMRV9SVUxFX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLktFWVdPUkRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuTlVNQkVSX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBST1BFUlRZX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLkRFU0NSSVBUT1JfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ09OVEFJTkVSX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlVOSVRfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuRlVOQ1RJT05fREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuU1RSSU5HKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuQ0FURUdPUllfREVGKSB8fCB0YWdOYW1lLmVxdWFscyhQcm9maWxlS2V5d29yZHMuUFNFVURPX0NMQVNTX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlBTRVVET19FTEVNRU5UX0RFRikgfHwgdGFnTmFtZS5lcXVhbHMoUHJvZmlsZUtleXdvcmRzLlNFTEVDVE9SX0VYUFJFU1NJT04pIHx8IHRhZ05hbWUuZXF1YWxzKFByb2ZpbGVLZXl3b3Jkcy5TRVBBUkFUT1IpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW1wb3J0UHJvZmlsZShTdHJpbmcgcHJvZmlsZU5hbWUpIHsKLQkJVVJMIHByb2ZpbGVVUkwgPSBudWxsOwotCQlDU1NQcm9maWxlUmVnaXN0cnkgcmVnID0gQ1NTUHJvZmlsZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IHJlZy5nZXRQcm9maWxlKHByb2ZpbGVOYW1lKTsKLQkJaWYgKHByb2ZpbGUgIT0gbnVsbCkgewotCQkJLy8gZmlyc3Q6IGZpbmQgVVJMIGJ5IElECi0JCQlwcm9maWxlVVJMID0gcHJvZmlsZS5nZXRQcm9maWxlVVJMKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZWNvbmQ6IGZpbmQgVVJMIGJ5IGZpbGVuYW1lIG9mIHByb2ZpbGUgVVJMCi0JCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJCVVSTCB1cmwgPSBwcm9maWxlLmdldFByb2ZpbGVVUkwoKTsKLQkJCQlpZiAodXJsLmdldEZpbGUoKS5lbmRzV2l0aChwcm9maWxlTmFtZSkpIHsKLQkJCQkJcHJvZmlsZVVSTCA9IHVybDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChwcm9maWxlVVJMID09IG51bGwpIHsKLQkJCS8vIGZpbmFsOiBpdCBtYXkgYmUgdXJsIGl0c2VsZgotCQkJdHJ5IHsKLQkJCQlwcm9maWxlVVJMID0gbmV3IFVSTChwcm9maWxlTmFtZSk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCWlmIChwcm9maWxlVVJMICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJUHJvZmlsZUxvYWRlci5sb2FkUHJvZmlsZShmTWV0YU1vZGVsLCBwcm9maWxlVVJMLm9wZW5TdHJlYW0oKSwgZlJlc291cmNlQnVuZGxlLCBmTG9nZ2luZyk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkNhbm5vdCBvcGVuIHN0cmVhbSBmb3IgcHJvZmlsZSIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQllKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFRhZ05vZGUgewotCi0JCVN0cmluZyB0YWcgPSBudWxsOwotCQlDU1NNTU5vZGVJbXBsIG5vZGUgPSBudWxsOwotCi0JCVRhZ05vZGUoU3RyaW5nIHRhZywgQ1NTTU1Ob2RlSW1wbCBub2RlKSB7Ci0JCQl0aGlzLnRhZyA9IHRhZzsKLQkJCXRoaXMubm9kZSA9IG5vZGU7Ci0JCX0KLQl9Ci0KLQljbGFzcyBFcnJvckNvcnJlY3RvciB7Ci0KLQkJdm9pZCBkb0NvcnJlY3QoQ1NTTU1Ob2RlSW1wbCBub2RlKSB7Ci0JCQlJdGVyYXRvciBpID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlBcnJheUxpc3QgZXJyb3JOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCUNTU01NTm9kZUltcGwgY2hpbGQgPSAoQ1NTTU1Ob2RlSW1wbCkgaS5uZXh0KCk7Ci0JCQkJZG9Db3JyZWN0KGNoaWxkKTsKLQkJCQlzaG9ydCBlcnJvciA9IGNoaWxkLmdldEVycm9yKCk7Ci0JCQkJaWYgKGVycm9yICE9IE1ldGFNb2RlbEVycm9ycy5OT19FUlJPUikgewotCQkJCQkvLyBub2RlLnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJZXJyb3JOb2Rlcy5hZGQoY2hpbGQpOwotCi0JCQkJCVN0cmluZyBzdHIgPSAiW0NTU1Byb2ZpbGUgRXJyb3JdICIgKyBub2RlLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzdHIgKz0gIigiICsgbm9kZS5nZXRUeXBlKCkgKyAiKSBjb250YWlucyBlcnJvciBub2RlOiAiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc3RyICs9IGNoaWxkLmdldE5hbWUoKSArICIoIiArIGNoaWxkLmdldFR5cGUoKSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXN0ciArPSAiIC0gZXJyb3IgY29kZSA9ICIgKyBlcnJvcjsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoZkxvZ2dpbmcpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBzdHIpOwotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKHN0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpbnQgZXJyb3JTaXplID0gZXJyb3JOb2Rlcy5zaXplKCk7Ci0JCQlpZiAoZXJyb3JTaXplID4gMCkgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZXJyb3JTaXplOyBqKyspIHsKLQkJCQkJQ1NTTU1Ob2RlSW1wbCBlcnJvck5vZGUgPSAoQ1NTTU1Ob2RlSW1wbCkgZXJyb3JOb2Rlcy5nZXQoaik7Ci0JCQkJCW5vZGUucmVtb3ZlQ2hpbGQoZXJyb3JOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgQ1NTTWV0YU1vZGVsSW1wbCBmTWV0YU1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE5vZGVQb29sIGZOb2RlUG9vbCA9IG51bGw7Ci0JcHJpdmF0ZSBTdGFjayBmTm9kZVN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JYm9vbGVhbiBmTG9nZ2luZyA9IGZhbHNlOwotCXByaXZhdGUgUmVzb3VyY2VCdW5kbGUgZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX05BTUVfREVGSU5JVElPTiA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX05BTUVfUkVGRVJFTkNFID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfT1ZFUldSSVRFID0gIm92ZXJ3cml0ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUUl9FTkFCTEVEID0gImVuYWJsZWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVFJfVkFMVUVfT1ZFUldSSVRFX0ZBTFNFID0gImZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRSX1ZBTFVFX0VOQUJMRURfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVLZXl3b3Jkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVLZXl3b3Jkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjgzMTViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9Qcm9maWxlS2V5d29yZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbGltcGw7Ci0KLWludGVyZmFjZSBQcm9maWxlS2V5d29yZHMgewotCi0JZmluYWwgc3RhdGljIFN0cmluZyBDU1NfUFJPRklMRSA9ICJjc3MtcHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBST0ZJTEVfSU1QT1JUID0gInByb2ZpbGUtaW1wb3J0IjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVTSEVFVF9ERUYgPSAic3R5bGVzaGVldC1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDSEFSU0VUX1JVTEUgPSAiY2hhcnNldC1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1JVTEUgPSAiaW1wb3J0LXJ1bGUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQQUdFX1JVTEUgPSAicGFnZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgTUVESUFfUlVMRSA9ICJtZWRpYS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRk9OVEZBQ0VfUlVMRSA9ICJmb250ZmFjZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RZTEVfUlVMRSA9ICJzdHlsZS1ydWxlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgQ0hBUlNFVF9SVUxFX0RFRiA9ICJjaGFyc2V0LXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgSU1QT1JUX1JVTEVfREVGID0gImltcG9ydC1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFBBR0VfUlVMRV9ERUYgPSAicGFnZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIE1FRElBX1JVTEVfREVGID0gIm1lZGlhLXJ1bGUtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRk9OVEZBQ0VfUlVMRV9ERUYgPSAiZm9udGZhY2UtcnVsZS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRV9SVUxFX0RFRiA9ICJzdHlsZS1ydWxlLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEZVTkNUSU9OX0RFRiA9ICJmdW5jdGlvbi1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBGVU5DVElPTl9WQUxVRSA9ICJmdW5jdGlvbi12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIEtFWVdPUkRfREVGID0gImtleXdvcmQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRF9WQUxVRSA9ICJrZXl3b3JkLXZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBOVU1CRVJfREVGID0gIm51bWJlci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUID0gInVuaXQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBVTklUX0RFRiA9ICJ1bml0LWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFVOSVRfVkFMVUUgPSAidW5pdC12YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENPTlRBSU5FUl9ERUYgPSAiY29udGFpbmVyLWRlZiI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIENBVEVHT1JZX0RFRiA9ICJjYXRlZ29yeS1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDQVBUSU9OID0gImNhcHRpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWV9ERUYgPSAicHJvcGVydHktZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRPUl9ERUYgPSAiZGVzY3JpcHRvci1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBTRUxFQ1RPUl9FWFBSRVNTSU9OID0gInNlbGVjdG9yLWV4cHJlc3Npb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fQ0xBU1MgPSAicHNldWRvLWNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgUFNFVURPX0VMRU1FTlQgPSAicHNldWRvLWVsZW1lbnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fQ0xBU1NfREVGID0gInBzZXVkby1jbGFzcy1kZWYiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQU0VVRE9fRUxFTUVOVF9ERUYgPSAicHNldWRvLWVsZW1lbnQtZGVmIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU0VMRUNUT1JfVkFMVUUgPSAic2VsZWN0b3ItdmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBOVU1CRVIgPSAibnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgS0VZV09SRCA9ICJrZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgRlVOQ1RJT04gPSAiZnVuY3Rpb24iOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBDT05UQUlORVIgPSAiY29udGFpbmVyIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSSU5HID0gInN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUEFSQVRPUiA9ICJzZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgc3RhdGljIFN0cmluZyBQUk9QRVJUWSA9ICJwcm9wZXJ0eSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0NSSVBUT1IgPSAiZGVzY3JpcHRvciI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1Byb2ZpbGVMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgyNjJlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUHJvZmlsZUxvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotCi0KLQotY2xhc3MgUHJvZmlsZUxvYWRlciB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBQcm9maWxlTG9hZGVyLgotCSAqLwotCXByaXZhdGUgUHJvZmlsZUxvYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlQcm9maWxlTG9hZGVyKFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBib29sZWFuIGxvZ2dpbmcpIHsKLQkJc3VwZXIoKTsKLQkJZlJlc291cmNlQnVuZGxlID0gcmVzb3VyY2VCdW5kbGU7Ci0JCWZMb2dnaW5nID0gbG9nZ2luZzsKLQl9Ci0KLQlzdGF0aWMgdm9pZCBsb2FkUHJvZmlsZShDU1NNZXRhTW9kZWxJbXBsIG1ldGFtb2RlbCwgSW5wdXRTdHJlYW0gaW5wdXQsIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlLCBib29sZWFuIGxvZ2dpbmcpIHsKLQkJdHJ5IHsKLQkJCVhNTFJlYWRlciB4bWxSZWFkZXIgPSBYTUxSZWFkZXJVdGlsLmNyZWF0ZVhNTFJlYWRlcihQQVJTRVJfTkFNRSk7Ci0JCQkvLyBYTUxSZWFkZXJGYWN0b3J5LmNyZWF0ZVhNTFJlYWRlcihQQVJTRVJfTkFNRSk7Ci0JCQl4bWxSZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IFByb2ZpbGVIYW5kbGVyKG1ldGFtb2RlbCwgcmVzb3VyY2VCdW5kbGUsIGxvZ2dpbmcpKTsKLQkJCXhtbFJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlDU1NNZXRhTW9kZWwgbG9hZFByb2ZpbGUoSW5wdXRTdHJlYW0gaW5wdXQpIHsKLQkJaWYgKGZNZXRhTW9kZWwgPT0gbnVsbCkgewotCQkJZk1ldGFNb2RlbCA9IG5ldyBDU1NNZXRhTW9kZWxJbXBsKCk7Ci0JCX0KLQkJbG9hZFByb2ZpbGUoZk1ldGFNb2RlbCwgaW5wdXQsIGZSZXNvdXJjZUJ1bmRsZSwgZkxvZ2dpbmcpOwotCQlmTWV0YU1vZGVsLmxvYWRDb21wbGV0ZWQoKTsKLQkJcmV0dXJuIGZNZXRhTW9kZWw7Ci0JfQotCi0KLQlDU1NNZXRhTW9kZWxJbXBsIGZNZXRhTW9kZWwgPSBudWxsOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJTRVJfTkFNRSA9ICJvcmcuYXBhY2hlLnhlcmNlcy5wYXJzZXJzLlNBWFBhcnNlciI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZMb2dnaW5nID0gZmFsc2U7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1JlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjllY2MxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi0KLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5GaWxlTG9jYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQkvLwotCXByaXZhdGUgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNzc3Byb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgVEFHX05BTUUgPSAicHJvZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX05BTUUgPSAibmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIFN0cmluZyBBVFRfREVGQVVMVCA9ICJkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIEFUVF9MT0dHSU5HID0gImxvZ2dpbmciOyAvLyBIaWRkZW4gT3B0aW9uIC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDU1NNZXRhTW9kZWxSZWdpc3RyeVJlYWRlci4KLQkgKi8KLQlwdWJsaWMgUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIENTU1Byb2ZpbGUgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJQ1NTUHJvZmlsZUltcGwgaW5mbyA9IG51bGw7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgc3RySUQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQkJU3RyaW5nIHN0ck5BTUUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRSk7Ci0JCQlTdHJpbmcgc3RyVVJJID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1VSSSk7Ci0KLQkJCWlmIChzdHJJRCAhPSBudWxsIHx8IHN0clVSSSAhPSBudWxsKSB7Ci0JCQkJQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0JCQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXRDb250cmlidXRvcigpLmdldE5hbWUoKTsKLQkJCQlidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQkJCWlmIChidW5kbGUgIT0gbnVsbCkgewotCQkJCQlQYXRoIHBhdGggPSBuZXcgUGF0aChzdHJVUkkpOwotCQkJCQlVUkwgdXJsID0gRmlsZUxvY2F0b3IuZmluZChidW5kbGUsIHBhdGgsIG51bGwpOwotCQkJCQlpZiAodXJsICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJdXJsID0gRmlsZUxvY2F0b3IudG9GaWxlVVJMKHVybCk7Ci0JCQkJCQkJaW5mbyA9IG5ldyBDU1NQcm9maWxlSW1wbChzdHJJRCwgdXJsLCBzdHJVUkkpOwotCQkJCQkJCWluZm8uc2V0UHJvZmlsZU5hbWUoc3RyTkFNRSk7Ci0JCQkJCQkJaW5mby5zZXREZWZhdWx0KChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVGQVVMVCkgIT0gbnVsbCkpOwotCQkJCQkJCWluZm8uc2V0TG9nZ2luZygoZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xPR0dJTkcpICE9IG51bGwpKTsKLQkJCQkJCQlpbmZvLnNldE93bmVyUGx1Z2luSUQocGx1Z2luSWQpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIHRocm91Z2gKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGluZm8gPT0gbnVsbCkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRXJyb3IgcmVhZGluZyBDU1MgUHJvZmlsZTogIiArIHN0cklEKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBpbmZvOwotCX0KLQotCS8qKgotCSAqIFdlIHNpbXBseSByZXF1aXJlIGFuICdhZGQnIG1ldGhvZCwgb2Ygd2hhdCBldmVyIGl0IGlzIHdlIGFyZSB0byByZWFkCi0JICogaW50bwotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBlbnVtUHJvZmlsZXMoKSB7Ci0JCVNldCBzZXQgPSBuZXcgSGFzaFNldCgpOwotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUNTU1Byb2ZpbGUgaW5mbyA9IHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCQkvLyBudWxsIGNhbiBiZSByZXR1cm5lZCBpZiB0aGVyZSdzIGFuIGVycm9yIHJlYWRpbmcgdGhlCi0JCQkJLy8gZWxlbWVudAotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJc2V0LmFkZChpbmZvKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNldC5pdGVyYXRvcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbWV0YW1vZGVsaW1wbC9WYWx1ZUNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1ZhbHVlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmRlYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1ZhbHVlQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWxpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsVHJhdmVyc2VyOwotCi0KLQotY2xhc3MgVmFsdWVDb2xsZWN0b3IgZXh0ZW5kcyBDU1NNZXRhTW9kZWxUcmF2ZXJzZXIgewotCXB1YmxpYyB2b2lkIGJlZ2luKENTU01NTm9kZSBub2RlKSB7Ci0JCWZOb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShDU1NNTU5vZGUgbm9kZSkgewotCQlzaG9ydCByYyA9IFRSQVZfQ09OVDsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSBub2RlLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU01NTm9kZS5UWVBFX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfREVTQ1JJUFRPUiB8fCB0eXBlID09IENTU01NTm9kZS5UWVBFX0NPTlRBSU5FUikgewotCQkJCXJjID0gVFJBVl9DT05UOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmTm9kZXMuY29udGFpbnMobm9kZSkpIHsKLQkJCQkJZk5vZGVzLmFkZChub2RlKTsKLQkJCQkJcmMgPSBUUkFWX1BSVU5FOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldE5vZGVzKCkgewotCQlyZXR1cm4gZk5vZGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0KLQlwcml2YXRlIExpc3QgZk5vZGVzID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvWE1MUmVhZGVyVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tZXRhbW9kZWxpbXBsL1hNTFJlYWRlclV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU4OTRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21ldGFtb2RlbGltcGwvWE1MUmVhZGVyVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsaW1wbDsKLQotCi0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotCi1jbGFzcyBYTUxSZWFkZXJVdGlsIHsKLQotCXN0YXRpYyBwdWJsaWMgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcihTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQljYXRjaCAoRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvQ1NTTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ0ZTdkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9DU1NNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5BYnN0cmFjdE1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU01vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0JLyoqCi0JICogQ1NTTG9hZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENTU01vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJTW9kZWxMb2FkZXIjbmV3TW9kZWwoKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbmV3IENTU01vZGVsSW1wbCgpOwotCQkvLyBub3cgZG9uZSBpbiBjcmVhdGUKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJLy8gbW9kZWwuc2V0RmFjdG9yeVJlZ2lzdHJ5KGRlZmF1bHRGYWN0b3J5UmVnaXN0cnkoKSk7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU01vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBDU1NEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjJkODE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmVuY29kaW5nLkNTU0RvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5DU1NEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuQWJzdHJhY3RNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbEhhbmRsZXJGb3JDU1MgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEKTsKLQkJc2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXJldHVybiBuZXcgQ1NTRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVEZXNjcmlwdGlvbiNnZXRNb2RlbExvYWRlcigpCi0JICovCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBDU1NNb2RlbExvYWRlcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1JlZ2lvblV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1JlZ2lvblV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjljYTU0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NSZWdpb25VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTUmVnaW9uVXRpbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWNsYXJhdGlvblZhbHVlVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogdGhlc2UgdHlwZSBjYW4gYmUgYmVnZ2luaW5nIG9mIHNlbGVjdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8gfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ0xBU1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlY2xhcmF0aW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiB8fCBpc0RlY2xhcmF0aW9uVmFsdWVUeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUik7Ci0JfQotCi0JLyoqCi0JICogVGhlc2UgdHlwZXMgY29uc2lzdCBzZWxlY3RvciByZWdpb24KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZWxlY3RvclR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lEIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTb3VyY2VQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDNhYzgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1NvdXJjZVBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTU291cmNlUGFyc2VyIGltcGxlbWVudHMgUmVnaW9uUGFyc2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX1NUWUxFU0hFRVQgPSAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVDTEFSQVRJT04gPSAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1PREVfREVDTEFSQVRJT05fVkFMVUUgPSAyOwotCi0JcHJpdmF0ZSBsb25nIGZTdGFydFRpbWU7Ci0JcHJpdmF0ZSBsb25nIGZTdG9wVGltZTsKLQlwcml2YXRlIElDU1NUb2tlbml6ZXIgZlRva2VuaXplcjsKLQotCXB1YmxpYyB2b2lkIHNldFBhcnNlck1vZGUoaW50IG1vZGUpIHsKLQkJaW50IGluaXRpYWxTdGF0ZTsKLQkJaW50IGJ1ZnNpemU7Ci0JCXN3aXRjaCAobW9kZSkgewotCQkJY2FzZSBNT0RFX1NUWUxFU0hFRVQgOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5ZWUlOSVRJQUw7Ci0JCQkJYnVmc2l6ZSA9IENTU1Rva2VuaXplci5CVUZGRVJfU0laRV9OT1JNQUw7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVfREVDTEFSQVRJT04gOgotCQkJCWluaXRpYWxTdGF0ZSA9IENTU1Rva2VuaXplci5TVF9ERUNMQVJBVElPTjsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTl9WQUxVRSA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRTsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX1NNQUxMOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWlmICgwIDwgaW5pdGlhbFN0YXRlKSB7Ci0JCQlJQ1NTVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQkJdG9rZW5pemVyLnNldEluaXRpYWxTdGF0ZShpbml0aWFsU3RhdGUpOwotCQkJdG9rZW5pemVyLnNldEluaXRpYWxCdWZmZXJTaXplKGJ1ZnNpemUpOwotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb25zKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWRub2RlID0gbnVsbDsKLQkJaWYgKGhlYWRub2RlID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCkgewotCQkJCWZTdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCWhlYWRub2RlID0gcGFyc2VOb2RlcygpOwotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJZlN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgLS0gY3JlYXRpbmcgbm9kZXMgb2YgSVN0cnVjdHVyZWREb2N1bWVudCAtLSAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIFRpbWUgcGFyc2UgYW5kIGluaXQgYWxsIHJlZ2lvbnM6ICIgKyAoZlN0b3BUaW1lIC0gZlN0YXJ0VGltZSkgKyAiIChtc2VjcykiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBmb3IgIiArIGZSZWdpb25zLnNpemUoKSArICIKLQkJCQkvLyBSZWdpb25zIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIGFuZCAiICsgX2NvdW50Tm9kZXMoaGVhZG5vZGUpICsgIiBOb2RlcyIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBoZWFkbm9kZTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZWdpb25zKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJaWYgKCFnZXRUb2tlbml6ZXIoKS5pc0VPRigpKSB7Ci0JCQloZWFkTm9kZSA9IGdldERvY3VtZW50UmVnaW9ucygpOwotCQkJLy8gdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFyc2luZyBoYXMgbm90IGZpbmlzaGVkIik7Ci0JCX0KLQkJLy8gZm9yIG1lbW9yeSByZWNvdmVyeSwgd2UgYXNzdW1lIGlmIHNvbWVvbmUKLQkJLy8gcmVxdWVzdHMgYWxsIHJlZ2lvbnMsIHdlIGNhbiByZXNldCBvdXIgYmlnCi0JCS8vIG1lbW9yeSBjb25zdW1pbmcgb2JqZWN0cwotCQkvLyBidXQgdGhlIG5ldyAiZ2V0UmVnaW9ucyIgbWV0aG9kIGlzIHRoZW4gbW9yZSBleHBlbnNpdmUuCi0JCS8vIEkgZG9uJ3QgdGhpbmsgaXRzIHVzZWQgbXVjaCwgdGhvdWdoLgotCQlMaXN0IGxvY2FsUmVnaW9uc0xpc3QgPSBnZXRSZWdpb25zKGhlYWROb2RlKTsKLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBsb2NhbFJlZ2lvbnNMaXN0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpb25zLgotCSAqIAotCSAqIEBwYXJhbSBoZWFkTm9kZQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSkgewotCQlMaXN0IGFsbFJlZ2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBoZWFkTm9kZTsKLQkJd2hpbGUgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucyA9IGN1cnJlbnROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZVJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhbGxSZWdpb25zLmFkZChub2RlUmVnaW9ucy5nZXQoaSkpOwotCQkJfQotCQkJY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGFsbFJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlcikgewotCQlwcmltUmVzZXQoKTsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQocmVhZGVyLCAwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KHJlYWRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCXJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChTdHJpbmcgaW5wdXQsIGludCBvZmZzZXQpIHsKLQkJcmVzZXQoaW5wdXQpOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgQ1NTU291cmNlUGFyc2VyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcnNlTm9kZXMoKSB7Ci0JCS8vIHJlZ2lvbnMgYXJlIGluaXRpYWxseSByZXBvcnRlZCBhcyBjb21wbGV0ZSBvZmZzZXRzIHdpdGhpbiB0aGUKLQkJLy8gc2Nhbm5lZCBpbnB1dAotCQkvLyB0aGV5IGFyZSBhZGp1c3RlZCBoZXJlIHRvIGJlIGluZGV4ZXMgZnJvbSB0aGUgY3VycmVudE5vZGUncyBzdGFydAotCQkvLyBvZmZzZXQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBudWxsOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgY3VycmVudFJlZ2lvblR5cGUgPSBudWxsOwotCi0JCXdoaWxlICgocmVnaW9uID0gZ2V0TmV4dFJlZ2lvbigpKSAhPSBudWxsKSB7Ci0JCQl0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChtdXN0QmVTdGFydCh0eXBlLCBjdXJyZW50UmVnaW9uVHlwZSkgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJfQotCi0JCQlpZiAoKGN1cnJlbnROb2RlICE9IG51bGwgJiYgY3VycmVudE5vZGUuaXNFbmRlZCgpKSB8fCBjdXJyZW50Tm9kZSA9PSBudWxsKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQl9Ci0JCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQljdXJyZW50Tm9kZSA9IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0eXBlKTsKLQkJCQljdXJyZW50UmVnaW9uVHlwZSA9IHR5cGU7Ci0JCQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQl9Ci0KLQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCi0JCQlpZiAobXVzdEJlRW5kKHR5cGUpKSB7Ci0JCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCQl9Ci0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGN1cnJlbnROb2RlOwotCQkJfQotCQl9Ci0KLQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwgJiYgIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJY3VycmVudE5vZGUuc2V0RW5kZWQodHJ1ZSk7Ci0JCX0KLQotCQlwcmltUmVzZXQoKTsKLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKHR5cGUpOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG11c3RCZVN0YXJ0KFN0cmluZyB0eXBlLCBTdHJpbmcgZG9jUmVnaW9uVHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19JTVBPUlQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19GT05UX0ZBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19BVEtFWVdPUkQgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB8fCAoZG9jUmVnaW9uVHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgJiYgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgfHwgKCFDU1NSZWdpb25VdGlsLmlzU2VsZWN0b3JCZWdnaW5pbmdUeXBlKGRvY1JlZ2lvblR5cGUpICYmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfVU5JVkVSU0FMIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1BTRVVETyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUyB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9JRCB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQpKSk7Ci0JfQotCS8qKgotCSAqIGN1cnJlbnRseSBwdWJsaWMgYnV0IG1heSBiZSBtYWRlIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBpbiBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gbXVzdEJlRW5kKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKTsKLQl9Ci0KLQlwcml2YXRlIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb24oKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZWdpb24gPSBnZXRUb2tlbml6ZXIoKS5nZXROZXh0VG9rZW4oKTsKLQkJCS8vIERNVzogMi8xMi8wMyBSZW1vdmVkIHN0YXRlCi0JCQkvLyBpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIGZSZWdpb25zLmFkZChyZWdpb24pOwotCQkJLy8gfQotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiBpbnB1dCBjb3VsZCBub3QgYmUgcGFyc2VkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0VG9rZW5pemVyKCkuZ2V0T2Zmc2V0KCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSArICIgKCIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSArICIpIiwgZSk7IC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcmltUmVzZXQoKSB7Ci0KLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQobmV3IGNoYXJbMF0pOwotCX0KLQkvKioKLQkgKiBjdXJyZW50bHkgcHVibGljIGJ1dCBtYXkgYmUgbWFkZSBkZWZhdWx0IGFjY2VzcyBwcm90ZWN0ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBJQ1NTVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBDU1NUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBzaW1wbGUgdXRpbGl0eSB0byBjb3VudCBub2Rlcy4gVXNlZCBvbmx5IGZvciBkZWJ1ZwotCSAqIHN0YXRlbWVudHMuCi0JICovCi0JcHJpdmF0ZSBpbnQgX2NvdW50Tm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBub2RlczsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQrKzsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlN2EyNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NTU1Rva2VuaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTVG9rZW5pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4M2IxN2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ1NTVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTA1ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDYvNy8wNiA1OjIzIFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5DU1NUZXh0UmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gNi83LzA2IDU6MjMgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovYnVpbGRzL1dvcmtzcGFjZXMvcHVyZUhlYWRXVFAvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgQ1NTVG9rZW5pemVyIGltcGxlbWVudHMgQ1NTUmVnaW9uQ29udGV4dHMsIElDU1NUb2tlbml6ZXIgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSA9IDExOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9JTVBPUlRfREVMSU1JVEVSID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0hBUlNFVF9ERUxJTUlURVIgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTl9WQUxVRSA9IDE4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QQUdFX1BTRVVET19QQUdFID0gODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSU1QT1JUX1VSSSA9IDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BBR0VfREVMSU1JVEVSID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX01FRElBX01FRElVTSA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NIQVJTRVRfTkFNRSA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0lNUE9SVF9NRURJVU0gPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfRk9OVF9GQUNFX0RFTElNSVRFUiA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX01FRElBX0RFTElNSVRFUiA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX01PRElGSUVSID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gCi0gICAgIlwxMVwwXDFcMTJcMVwxN1wxXDBcMVw0XDFcMjBcMjJcMFwxXDZcMVwzMVwxXDExIisKLSAgICAiXDFcMjFcMVwxNlwxXDcyXDFcMTZcMVw1XDFcMjVcMVwxM1wxXDM1XDFcMTRcMVw1NSIrCi0gICAgIlwxXDEwXDFcMTVcMVwzNFwxMlwxXDFcNjJcMVw1MFwxXDMwXDFcNjdcMVwzMlwxXDI3IisKLSAgICAiXDFcMzZcMVw0M1wxXDI2XDFcNDBcMVw1N1wxXDQ2XDFcNjRcMVw2MVwxXDQxXDFcNTEiKwotICAgICJcMlwyXDFcMjRcMVw1MlwxXDY1XDFcNTRcMVw1M1wxXDJcMVwyM1wxXDQ0XDFcNDciKwotICAgICJcMVwyMlw1XDJcMVw2NlwxXDNcMVw3MVwxXDE2XDFcMlwxXDE2XDFcNDJcMVw3IisKLSAgICAiXDFcMzdcMVw1NlwxXDQ1XDFcNjNcMVw2MVwxXDQxXDFcNTFcMlwyXDFcMjRcMVw1MiIrCi0gICAgIlwxXDY1XDFcNTRcMVw1M1wxXDJcMVwyM1wxXDQ0XDFcNDdcMVwyMlw1XDJcMVw2MCIrCi0gICAgIlwxXDcwXDFcMzNcMVw3MFwxXDBcdWZmODBcMiI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA1OSwgICAxMTgsICAgMTc3LCAgIDIzNiwgICAyOTUsICAgMzU0LCAgIDQxMywgICA0NzIsICAgNTMxLCAKLSAgICAgIDU5MCwgICA2NDksICAgNzA4LCAgIDc2NywgICA4MjYsICAgODg1LCAgIDk0NCwgIDEwMDMsICAxMDYyLCAgMTEyMSwgCi0gICAgIDExODAsICAxMjM5LCAgMTI5OCwgIDEzNTcsICAxNDE2LCAgMTQ3NSwgIDE1MzQsICAxMTIxLCAgMTU5MywgIDExMjEsIAotICAgICAxNjUyLCAgMTcxMSwgIDExMjEsICAxNzcwLCAgMTgyOSwgIDE4ODgsICAxMTIxLCAgMTk0NywgIDIwMDYsICAyMDY1LCAKLSAgICAgMjEyNCwgIDIxODMsICAyMjQyLCAgMTEyMSwgIDIzMDEsICAyMzYwLCAgMjQxOSwgIDExMjEsICAxMTIxLCAgMjQ3OCwgCi0gICAgIDI1MzcsICAyNTk2LCAgMTEyMSwgIDI2NTUsICAyNzE0LCAgMTEyMSwgIDExMjEsICAyNzczLCAgMjgzMiwgIDI4OTEsIAotICAgICAxMTIxLCAgMjk1MCwgIDExMjEsICAzMDA5LCAgMzA2OCwgIDMxMjcsICAzMTg2LCAgMzI0NSwgIDMzMDQsICAzMzYzLCAKLSAgICAgMzQyMiwgIDExMjEsICAxMTIxLCAgMzQ4MSwgIDM1NDAsICAzNTk5LCAgMzY1OCwgIDM3MTcsICAzNzc2LCAgMTEyMSwgCi0gICAgIDM4MzUsICAzODk0LCAgMzk1MywgIDQwMTIsICA0MDcxLCAgMTU5MywgIDExMjEsICA0MTMwLCAgMTIzOSwgIDQxODksIAotICAgICA0MjQ4LCAgMTQxNiwgIDQzMDcsICAxNDc1LCAgNDM2NiwgIDQ0MjUsICA0NDg0LCAgNDU0MywgIDQ2MDIsICA0NjYxLCAKLSAgICAgNDcyMCwgIDQ3NzksICA0ODM4LCAgNDg5NywgIDQ5NTYsICAxNzcwLCAgNTAxNSwgIDExMjEsICAxODg4LCAgNTA3NCwgCi0gICAgIDE5NDcsICA1MTMzLCAgMTEyMSwgIDIwMDYsICA1MTkyLCAgNTI1MSwgIDIxODMsICA1MzEwLCAgMjM2MCwgIDUzNjksIAotICAgICAyNTM3LCAgNTQyOCwgIDU0ODcsICAxMTIxLCAgMjcxNCwgIDI4MzIsICA1NTQ2LCAgMzA2OCwgIDU2MDUsICAzMTI3LCAKLSAgICAgNTY2NCwgIDExMjEsICAzMjQ1LCAgNTcyMywgIDMzNjMsICA1NzgyLCAgNTg0MSwgIDU5MDAsICA1OTU5LCAgMzg5NCwgCi0gICAgIDExMjEsICAzNTk5LCAgMTEyMSwgIDYwMTgsICAzNjU4LCAgNjA3NywgIDExMjEsICAzNzc2LCAgNjEzNiwgIDYxOTUsIAotICAgICAzOTUzLCAgNjI1NCwgIDYzMTMsICA2MzcyLCAgNDA3MSwgIDY0MzEsICAxMTIxLCAgNDEzMCwgIDY0OTAsICAxMTIxLCAKLSAgICAgNjU0OSwgIDY2MDgsICA2NjY3LCAgNjcyNiwgIDY3ODUsICA2ODQ0LCAgNjkwMywgIDY5NjIsICA3MDIxLCAgNzA4MCwgCi0gICAgIDcxMzksICA3MTk4LCAgMTc3MCwgIDcyNTcsICA3MzE2LCAgMTg4OCwgIDczNzUsICA3NDM0LCAgMTk0NywgIDc0OTMsIAotICAgICA3NTUyLCAgMjAwNiwgIDc2MTEsICA3NjcwLCAgNzcyOSwgIDc3ODgsICA3ODQ3LCAgNzkwNiwgIDc5NjUsICA4MDI0LCAKLSAgICAgMzEyNywgIDgwODMsICA4MTQyLCAgMzI0NSwgIDgyMDEsICA4MjYwLCAgODMxOSwgIDgzNzgsICA4NDM3LCAgMzY1OCwgCi0gICAgIDg0OTYsICA4NTU1LCAgMzc3NiwgIDg2MTQsICA4NjczLCAgODczMiwgIDg3OTEsICA4ODUwLCAgODkwOSwgIDg5NjgsIAotICAgICA5MDI3LCAgMTEyMSwgIDExMjEsICA5MDg2LCAgOTE0NSwgIDkyMDQsICA5MjYzLCAgOTMyMiwgIDkzODEsICA5NDQwLCAKLSAgICAgOTQ5OSwgIDk1NTgsICA5NjE3LCAgOTY3NiwgIDk3MzUsICA5Nzk0LCAgOTg1MywgIDk5MTIsICA5OTcxLCAxMDAzMCwgCi0gICAgMTAwODksIDEwMTQ4LCAxMDIwNywgMTAyNjYsIDEwMzI1LCAxMDM4NCwgMTA0NDMsIDEwNTAyLCAxMDU2MSwgMTA2MjAsIAotICAgIDEwNjc5LCAxMDczOCwgMTA3OTcsIDEwODU2LCAxMDkxNSwgMTA5NzQsIDExMDMzLCAxMTA5MiwgMTExNTEsIDExMjEwLCAKLSAgICAgMTEyMSwgMTEyNjksIDExMzI4LCAgMTEyMSwgMTEzODcsIDExNDQ2LCAxMTUwNSwgMTE1NjQsIDExNjIzLCAxMTY4MiwgCi0gICAgMTE3NDEsIDExODAwLCAxMTg1OSwgMTE5MTgsICAxMTIxLCAxMTk3NywgMTIwMzYsIDEyMDk1LCAxMjE1NCwgMTIyMTMsIAotICAgIDEyMjcyLCAxMjMzMSwgMTIzOTAsIDEyNDQ5LCAxMjUwOCwgMTI1NjcsIDEyNjI2LCAxMjY4NSwgMTI3NDQsIDEyODAzLCAKLSAgICAxMjg2MiwgMTI5MjEsIDEwNzk3LCAxMjk4MCwgMTMwMzksICAxMTIxLCAxMzA5OCwgMTMxNTcsIDEzMjE2LCAxMzI3NSwgCi0gICAgMTMzMzQsIDEzMzkzLCAgMTEyMSwgMTM0NTIsIDEzNTExLCAxMzU3MCwgMTM2MjksIDEzNjg4LCAxMzc0NywgMTM4MDYsIAotICAgIDEzODY1LCAxMzkyNCwgMTE3NDEsIDEzOTgzLCAxNDA0MiwgMTQxMDEsIDE0MTYwLCAxNDIxOSwgMTQyNzgsIDE0MzM3LCAKLSAgICAxNDM5NiwgMTQ0NTUsIDE0NTE0LCAxNDU3MywgMTQ2MzIsIDE0NjkxLCAxNDc1MCwgMTQ4MDksIDE0ODY4LCAxNDkyNywgCi0gICAgMTQ5ODYsIDE1MDQ1LCAxMjg2MiwgMTUxMDQsIDE1MTYzLCAxNTIyMiwgMTUyODEsIDE1MzQwLCAxNTM5OSwgMTU0NTgsIAotICAgICAxMTIxLCAxNTUxNywgMTU1NzYsIDE1NjM1LCAxNTY5NCwgMTU3NTMsIDE1ODEyLCAxNTg3MSwgMTU5MzAsIDE1OTg5LCAKLSAgICAxNjA0OCwgMTYxMDcsIDE2MTY2LCAxNjIyNSwgMTYyODQsIDE2MzQzLCAxNjQwMiwgMTY0NjEsIDE2NTIwLCAxNjU3OSwgCi0gICAgMTY2MzgsIDE2Njk3LCAxNjc1NiwgMTY4MTUsIDE2ODc0LCAxNjkzMywgMTY5OTIsIDE3MDUxLCAxNzExMCwgMTcxNjksIAotICAgIDE3MjI4LCAxNzI4NywgMTczNDYsIDE3NDA1LCAxNzQ2NCwgMTc1MjMsIDE3NTgyLCAxNzY0MSwgMTc3MDAsIDE3NzU5LCAKLSAgICAgMTEyMSwgMTc4MTgsIDE3ODc3LCAxNzkzNiwgMTc5OTUsIDE4MDU0LCAxODExMywgMTgxNzIsIDE4MjMxLCAxODI5MCwgCi0gICAgMTE4NTksIDE4MzQ5LCAxMTkxOCwgMTg0MDgsIDE4NDY3LCAxODUyNiwgMTg1ODUsIDE4NjQ0LCAxODcwMywgMTg3NjIsIAotICAgIDE4ODIxLCAxODg4MCwgMTg5MzksIDEyOTgwLCAxODk5OCwgMTMwMzksIDE5MDU3LCAxOTExNiwgMTkxNzUsIDE5MjM0LCAKLSAgICAxOTI5MywgMTkzNTIsIDE5NDExLCAxOTQ3MCwgMTk1MjksIDE5NTg4LCAxOTY0NywgIDExMjEsIDE5NzA2LCAxOTc2NSwgCi0gICAgMTk4MjQsIDE5ODgzLCAgMTEyMSwgMTk5NDIsIDIwMDAxLCAyMDA2MCwgIDExMjEsIDIwMTE5LCAyMDE3OCwgMjAyMzcsIAotICAgIDIwMjk2LCAyMDM1NSwgMjA0MTQsIDIwNDczLCAyMDUzMiwgMjA1OTEsIDIwNjUwCi0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMlwyNFwxXDI1XDFcMjZcMVwyN1wxXDI0XDFcMjdcMVwyNVwxXDMwIisKLSAgICAiXDFcMjRcMVwyN1wyXDI0XDFcMzFcMVwyNFwyXDI3XDFcMzJcM1wyNSIrCi0gICAgIlwxXDI0XDFcMjVcMVwyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMzYiKwotICAgICJcMVwzN1wxMVwyNVwxXDI0XDRcMjVcMVwyNFwyXDI1XDFcMjRcMVwyNSIrCi0gICAgIlwxXDQwXDNcMjVcMVw0MVwxMFwyNFwxXDI3XDFcNDJcMVwyN1wxXDI0IisKLSAgICAiXDFcNDNcMVw0NFwxXDI3XDRcMjRcMlwyN1w3XDI0XDFcMzNcMlwyNCIrCi0gICAgIlwxXDM0XDFcMzVcMVwyNFwxXDM3XDQwXDI0XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVw0NVwyNlwyNCIrCi0gICAgIlwxXDI3XDFcNDZcMVwyN1wxXDI0XDFcNDNcMVw0N1wxXDI3XDRcMjQiKwotICAgICJcMlwyN1wxXDI0XDFcNTBcNVwyNFwxXDMzXDJcMjRcMVwzNFwxXDM1IisKLSAgICAiXDFcMjRcMVwzN1wxMVwyNFwxXDQ1XDI0XDI0XDFcNTFcMVw1MlwxXDI3IisKLSAgICAiXDFcMjRcMVwyN1wxXDUxXDFcNTNcMVwyNFwxXDI3XDRcMjRcMlwyNyIrCi0gICAgIlwxXDI0XDNcNTFcMVwyNFwxXDUxXDFcMjRcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMTFcNTFcMVw0NVw0XDUxXDFcMjRcMlw1MSIrCi0gICAgIlwxXDI0XDFcNTFcMVwyNFwzXDUxXDExXDI0XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNFwyXDI3XDdcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVw0NVw0XDI0IisKLSAgICAiXDFcNTRcMTdcMjRcMVw1NVwxXDU2XDFcMjdcMVwyNFwxXDI3XDFcNTUiKwotICAgICJcMVw1N1wxXDI0XDFcMjdcNFwyNFwyXDI3XDFcMjRcM1w1NVwxXDI0IisKLSAgICAiXDFcNTVcMVwyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzNyIrCi0gICAgIlwxMVw1NVwxXDI0XDRcNTVcMVwyNFwyXDU1XDFcMjRcMVw1NVwxXDI0IisKLSAgICAiXDNcNTVcMTFcMjRcMVwyN1wxXDI0XDFcMjdcMVwyNFwxXDQzXDFcMjQiKwotICAgICJcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1IisKLSAgICAiXDFcMjRcMVwzN1wxNlwyNFwxXDYwXDJcMjRcMVw2MVwxNFwyNFwxXDYyIisKLSAgICAiXDFcNjNcMVwyN1wxXDI0XDFcMjdcMVw2MlwxXDY0XDFcMjRcMVwyNyIrCi0gICAgIlw0XDI0XDJcMjdcMVwyNFwzXDYyXDFcMjRcMVw2MlwxXDI0XDFcMzMiKwotICAgICJcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDYyXDFcMjRcNFw2MiIrCi0gICAgIlwxXDI0XDJcNjJcMVw2NVwxXDYyXDFcNjZcM1w2MlwxMVwyNFwxXDI3IisKLSAgICAiXDFcMjRcMVwyN1wxXDI0XDFcNDNcMVwyNFwxXDI3XDRcMjRcMlwyNyIrCi0gICAgIlw3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDIxXDI0IisKLSAgICAiXDFcNjVcMTZcMjRcMVw2N1wxXDI0XDFcNjdcMVwyNFwxXDQzXDFcMjQiKwotICAgICJcMVw2N1wxXDI0XDFcNzBcMVwzMVwxXDI0XDJcNjdcMVwzMlw2XDI0IisKLSAgICAiXDFcMzNcMVwyNFwxXDcwXDFcMzRcMVwzNVwxXDM2XDFcMzdcMTZcMjQiKwotICAgICJcMVw3MVwyXDI0XDFcNjVcMVwyNFwxXDQwXDNcMjRcMVw0MVw2XDI0IisKLSAgICAiXDFcNzJcMVw3M1wxXDI3XDFcMjRcMVwyN1wxXDcyXDFcNzRcMVwyNCIrCi0gICAgIlwxXDI3XDRcMjRcMlwyN1wxXDI0XDNcNzJcMVwyNFwxXDcyXDFcMjQiKwotICAgICJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcNzJcMVwyNCIrCi0gICAgIlw0XDcyXDFcMjRcMlw3MlwxXDI0XDFcNzJcMVwyNFwzXDcyXDExXDI0IisKLSAgICAiXDFcMjdcMVwyNFwxXDI3XDFcMjRcMVw0M1wxXDI0XDFcMjdcNFwyNCIrCi0gICAgIlwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMzBcMjRcMVw3NVwxXDc2XDFcNzdcM1wyNFwxXDEwMFwxXDEwMVwxXDI3IisKLSAgICAiXDFcMTAyXDFcMjdcMVwxMDBcMVwxMDNcMVwxMDRcMVwyN1w0XDI0XDJcMjciKwotICAgICJcMVwyNFwzXDEwMFwxXDI0XDFcMTAwXDFcMjRcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMTFcMTAwXDFcMjRcNFwxMDBcMVwyNFwyXDEwMCIrCi0gICAgIlwxXDI0XDFcMTAwXDFcMjRcM1wxMDBcMTFcMjRcMVwyN1wxXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0XDJcMjdcN1wyNFwxXDMzIisKLSAgICAiXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wzMlwyNFwxXDc3XDNcMjQiKwotICAgICJcMVwxMDVcMVwxMDZcMVwyN1wxXDI0XDFcMjdcMVwxMDVcMVwxMDdcMVwyNCIrCi0gICAgIlwxXDI3XDRcMjRcMlwyN1wxXDI0XDNcMTA1XDFcMjRcMVwxMDVcMVwyNCIrCi0gICAgIlwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVwxMDVcMVwxMTAiKwotICAgICJcNFwxMDVcMVwyNFwyXDEwNVwxXDI0XDFcMTA1XDFcMjRcM1wxMDVcMTFcMjQiKwotICAgICJcMVwyN1wxXDI0XDFcMjdcMVwyNFwxXDQzXDFcMjRcMVwyN1w0XDI0IisKLSAgICAiXDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzNyIrCi0gICAgIlwxMVwyNFwxXDExMFwxMVwyNFwxXDExMVwxMVwyNFwxXDExMlwxXDExM1wxXDExNCIrCi0gICAgIlwxXDI3XDFcMTE1XDFcMjdcMVwxMTNcMVwxMTZcMVwxMTdcMVwyN1wxXDEyMCIrCi0gICAgIlwxXDEyMVwxXDEyMlwxXDI0XDJcMjdcMVwxMjNcMVwxMjRcMlwxMTNcMVwyNCIrCi0gICAgIlwxXDExM1wxXDI0XDFcMzNcMVwxMjVcMVwyNFwxXDM0XDFcMTI2XDFcMjQiKwotICAgICJcMVwzN1wxMVwxMTNcMVwxMTBcNFwxMTNcMVwxMjdcMlwxMTNcMVwyNFwxXDExMyIrCi0gICAgIlwxXDI0XDNcMTEzXDZcMjRcMVwxMTJcMVwxMTNcMVwxMTRcMVwxMzBcMVwxMTUiKwotICAgICJcMVwxMzBcMVwxMTNcMVwxMTZcMVwxMTdcMVwxMzBcMVwxMjBcMVwxMjFcMVwxMjIiKwotICAgICJcMVwyNFwyXDEzMFwxXDEyM1wxXDEyNFwyXDExM1wxXDI0XDFcMTEzXDFcMjQiKwotICAgICJcMVwzM1wxXDEyNVwxXDI0XDFcMzRcMVwxMjZcMVwyNFwxXDM3XDExXDExMyIrCi0gICAgIlwxXDExMFw0XDExM1wxXDEyN1wyXDExM1wxXDI0XDFcMTEzXDFcMjRcM1wxMTMiKwotICAgICJcNVwyNFw3NFwwXDJcMjVcMVwxMzFcM1wwXDJcMjVcMTFcMFwzXDI1IisKLSAgICAiXDFcMFwxXDI1XDEwXDBcMTFcMjVcMVwwXDRcMjVcMVwwXDJcMjUiKwotICAgICJcMVwwXDFcMjVcMVwwXDNcMjVcNlwwXDFcMTMyXDJcMjVcMVwwIisKLSAgICAiXDJcMjVcMVwxMzJcMlwyNVwxXDBcNFwyNVwyXDBcMTZcMjVcMVwxMzIiKwotICAgICJcMlwyNVwxXDEzMlwyXDI1XDFcMTMyXDEwXDI1XDFcMTMyXDRcMjVcMVwxMzIiKwotICAgICJcN1wyNVw0XDBcMVwyN1wxXDBcMVwyN1wzXDBcMVwyN1w0XDAiKwotICAgICJcMlwyN1w1NFwwXDFcMjVcMVwxMzFcM1wwXDFcMjVcMVwxMzNcMTFcMCIrCi0gICAgIlwzXDI1XDFcMFwxXDI1XDEwXDBcMTFcMjVcMVwwXDRcMjVcMVwwIisKLSAgICAiXDJcMjVcMVwwXDFcMjVcMVwwXDNcMjVcNlwwXDJcMTM0XDFcMTM1IisKLSAgICAiXDNcMFwyXDEzNFwxMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwXDExXDEzNCIrCi0gICAgIlwxXDBcNFwxMzRcMVwwXDJcMTM0XDFcMFwxXDEzNFwxXDBcM1wxMzQiKwotICAgICJcNlwwXDJcMTM2XDFcMTM3XDNcMFwyXDEzNlwxMVwwXDNcMTM2XDFcMCIrCi0gICAgIlwxXDEzNlwxMFwwXDExXDEzNlwxXDBcNFwxMzZcMVwwXDJcMTM2XDFcMCIrCi0gICAgIlwxXDEzNlwxXDBcM1wxMzZcMzZcMFwxXDE0MFw3NlwwXDFcMTQxXDc0XDAiKwotICAgICJcMlwxNDJcMTBcMFwxXDE0M1wxXDE0NFwxXDE0NVw3XDBcMlwxNDZcMTBcMCIrCi0gICAgIlwxXDE0N1wxXDE1MFwzXDBcMVwxNDdcMVwxNTFcMTFcMFwzXDE0N1wxXDAiKwotICAgICJcMVwxNDdcMTBcMFwxMVwxNDdcMVwwXDRcMTQ3XDFcMFwyXDE0N1wxXDAiKwotICAgICJcMVwxNDdcMVwwXDNcMTQ3XDZcMFwyXDE1MlwxXDE1M1wxXDBcMVwxNTQiKwotICAgICJcMTFcMTUyXDJcMFw1MlwxNTJcMTBcMFwxXDEzM1w2M1wwXDJcMTU1XDFcMTU2IisKLSAgICAiXDFcMFw0XDE1NVwxXDE1NFw1XDE1NVwyXDBcNTJcMTU1XDFcMFwyXDE1NyIrCi0gICAgIlwxXDE2MFwxXDBcMVwxNjFcMTFcMTU3XDJcMFw1MlwxNTdcMVwwXDJcMTYyIisKLSAgICAiXDFcMTYzXDFcMFw0XDE2MlwxXDE2MVw1XDE2MlwyXDBcNTJcMTYyXDIzXDAiKwotICAgICJcMVwxNjRcNTBcMFwyXDUxXDFcMTY1XDNcMFwyXDUxXDExXDBcM1w1MSIrCi0gICAgIlwxXDBcMVw1MVwxMFwwXDExXDUxXDFcMFw0XDUxXDFcMFwyXDUxIisKLSAgICAiXDFcMFwxXDUxXDFcMFwzXDUxXDZcMFwxXDE2NlwyXDUxXDFcMCIrCi0gICAgIlwyXDUxXDFcMTY2XDJcNTFcMVwwXDRcNTFcMlwwXDE2XDUxXDFcMTY2IisKLSAgICAiXDJcNTFcMVwxNjZcMlw1MVwxXDE2NlwxMFw1MVwxXDE2Nlw0XDUxXDFcMTY2IisKLSAgICAiXDdcNTFcMlwwXDFcNTFcMVwxNjVcM1wwXDFcNTFcMVwxMzNcMTFcMCIrCi0gICAgIlwzXDUxXDFcMFwxXDUxXDEwXDBcMTFcNTFcMVwwXDRcNTFcMVwwIisKLSAgICAiXDJcNTFcMVwwXDFcNTFcMVwwXDNcNTFcNlwwXDJcNTVcMVwxNjciKwotICAgICJcM1wwXDJcNTVcMTFcMFwzXDU1XDFcMFwxXDU1XDEwXDBcMTFcNTUiKwotICAgICJcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTVcMVwwXDNcNTUiKwotICAgICJcNlwwXDFcMTcwXDJcNTVcMVwwXDJcNTVcMVwxNzBcMlw1NVwxXDAiKwotICAgICJcNFw1NVwyXDBcMTZcNTVcMVwxNzBcMlw1NVwxXDE3MFwyXDU1XDFcMTcwIisKLSAgICAiXDEwXDU1XDFcMTcwXDRcNTVcMVwxNzBcN1w1NVwyXDBcMVw1NVwxXDE2NyIrCi0gICAgIlwzXDBcMVw1NVwxXDEzM1wxMVwwXDNcNTVcMVwwXDFcNTVcMTBcMCIrCi0gICAgIlwxMVw1NVwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDAiKwotICAgICJcM1w1NVw2XDBcMlw2MlwxXDE3MVwzXDBcMlw2MlwxMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMTBcMFwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcM1w2Mlw2XDBcMVwxNzJcMlw2MlwxXDAiKwotICAgICJcMlw2MlwxXDE3MlwyXDYyXDFcMFw0XDYyXDJcMFwxNlw2MlwxXDE3MiIrCi0gICAgIlwyXDYyXDFcMTcyXDJcNjJcMVwxNzJcMTBcNjJcMVwxNzJcNFw2MlwxXDE3MiIrCi0gICAgIlw3XDYyXDJcMFwxXDYyXDFcMTcxXDNcMFwxXDYyXDFcMTMzXDExXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxMFwwXDExXDYyXDFcMFw0XDYyXDFcMCIrCi0gICAgIlwyXDYyXDFcMFwxXDYyXDFcMFwzXDYyXDdcMFwxXDYyXDFcMTcxIisKLSAgICAiXDNcMFwxXDYyXDFcMTczXDExXDBcM1w2MlwxXDBcMVw2MlwxMFwwIisKLSAgICAiXDExXDYyXDFcMFw0XDYyXDFcMFwyXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDVcMFw0XDE3NFwxXDE3NVwxXDE3NFwxXDE3NVwzXDE3NFwxXDE3NSIrCi0gICAgIlwxXDE3NFwxXDBcMlwxNzRcMlwxNzVcMTFcMTc0XDFcMFwyNVwxNzRcMVwwIisKLSAgICAiXDEyXDE3NFwxXDBcMlw3MlwxXDE3NlwzXDBcMlw3MlwxMVwwXDNcNzIiKwotICAgICJcMVwwXDFcNzJcMTBcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MiIrCi0gICAgIlwxXDBcMVw3MlwxXDBcM1w3Mlw2XDBcMVwxNzdcMlw3MlwxXDAiKwotICAgICJcMlw3MlwxXDE3N1wyXDcyXDFcMFw0XDcyXDJcMFwxNlw3MlwxXDE3NyIrCi0gICAgIlwyXDcyXDFcMTc3XDJcNzJcMVwxNzdcMTBcNzJcMVwxNzdcNFw3MlwxXDE3NyIrCi0gICAgIlw3XDcyXDJcMFwxXDcyXDFcMTc2XDNcMFwxXDcyXDFcMTMzXDExXDAiKwotICAgICJcM1w3MlwxXDBcMVw3MlwxMFwwXDExXDcyXDFcMFw0XDcyXDFcMCIrCi0gICAgIlwyXDcyXDFcMFwxXDcyXDFcMFwzXDcyXDc0XDBcMVw3NVw0XDAiKwotICAgICJcMlwxMDBcMVwyMDBcM1wwXDJcMTAwXDExXDBcM1wxMDBcMVwwXDFcMTAwIisKLSAgICAiXDEwXDBcMTFcMTAwXDFcMFw0XDEwMFwxXDBcMlwxMDBcMVwwXDFcMTAwIisKLSAgICAiXDFcMFwzXDEwMFw2XDBcMVwyMDFcMlwxMDBcMVwwXDJcMTAwXDFcMjAxIisKLSAgICAiXDJcMTAwXDFcMFw0XDEwMFwyXDBcMTZcMTAwXDFcMjAxXDJcMTAwXDFcMjAxIisKLSAgICAiXDJcMTAwXDFcMjAxXDEwXDEwMFwxXDIwMVw0XDEwMFwxXDIwMVw3XDEwMFwxXDAiKwotICAgICJcMlwyMDJcMVwyMDNcMVwwXDFcMjA0XDExXDIwMlwyXDBcNTJcMjAyXDJcMCIrCi0gICAgIlwxXDEwMFwxXDIwMFwzXDBcMVwxMDBcMVwxMzNcMTFcMFwzXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMTBcMFwxMVwxMDBcMVwwXDRcMTAwXDFcMFwyXDEwMFwxXDAiKwotICAgICJcMVwxMDBcMVwwXDNcMTAwXDZcMFwyXDIwNVwxXDIwNlwxXDBcNFwyMDUiKwotICAgICJcMVwyMDRcNVwyMDVcMlwwXDUyXDIwNVwxXDBcMlwxMDVcMVwyMDdcM1wwIisKLSAgICAiXDJcMTA1XDExXDBcM1wxMDVcMVwwXDFcMTA1XDEwXDBcMTFcMTA1XDFcMCIrCi0gICAgIlw0XDEwNVwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNVw2XDAiKwotICAgICJcMVwyMTBcMlwxMDVcMVwwXDJcMTA1XDFcMjEwXDJcMTA1XDFcMFw0XDEwNSIrCi0gICAgIlwyXDBcMTZcMTA1XDFcMjEwXDJcMTA1XDFcMjEwXDJcMTA1XDFcMjEwXDEwXDEwNSIrCi0gICAgIlwxXDIxMFw0XDEwNVwxXDIxMFw3XDEwNVwyXDBcMVwxMDVcMVwyMDdcM1wwIisKLSAgICAiXDFcMTA1XDFcMTMzXDExXDBcM1wxMDVcMVwwXDFcMTA1XDEwXDBcMTFcMTA1IisKLSAgICAiXDFcMFw0XDEwNVwxXDBcMlwxMDVcMVwwXDFcMTA1XDFcMFwzXDEwNSIrCi0gICAgIlw2XDBcMVwxMTJcMVwyMTFcMVwyMTJcM1wwXDFcMjExXDFcMjEzXDRcMCIrCi0gICAgIlwxXDIxNFw0XDBcM1wyMTFcMVwwXDFcMjExXDEwXDBcMTFcMjExXDFcMCIrCi0gICAgIlw0XDIxMVwxXDBcMlwyMTFcMVwwXDFcMjExXDFcMFwzXDIxMVw0XDAiKwotICAgICJcMVwyMTVcMVwwXDJcMTEzXDFcMjE2XDNcMFwyXDExM1wxMVwwXDNcMTEzIisKLSAgICAiXDFcMjE3XDFcMTEzXDEwXDBcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTMiKwotICAgICJcMVwwXDFcMTEzXDFcMFwzXDExM1w2XDBcMVwyMjBcMlwxMTNcMVwwIisKLSAgICAiXDJcMTEzXDFcMjIwXDJcMTEzXDFcMFw0XDExM1wyXDBcMTZcMTEzXDFcMjIwIisKLSAgICAiXDJcMTEzXDFcMjIwXDJcMTEzXDFcMjIwXDEwXDExM1wxXDIyMFw0XDExM1wxXDIyMCIrCi0gICAgIlw3XDExM1wxXDBcMlwyMjFcMVwyMjJcMVwwXDFcMjIzXDExXDIyMVwyXDAiKwotICAgICJcNTJcMjIxXDFcMFwxXDExMlwxXDExM1wxXDIxNlwzXDBcMVwxMTNcMVwxMzMiKwotICAgICJcNFwwXDFcMjE0XDRcMFwzXDExM1wxXDBcMVwxMTNcMTBcMFwxMVwxMTMiKwotICAgICJcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzIisKLSAgICAiXDZcMFwyXDIyNFwxXDIyNVwxXDBcNFwyMjRcMVwyMjNcNVwyMjRcMlwwIisKLSAgICAiXDUyXDIyNFwxXDBcMVwxMTJcMTNcMFwxXDIxNFw1NlwwXDFcMjI2XDcyXDAiKwotICAgICJcMlwyMjdcMVwyMzBcM1wwXDJcMjI3XDExXDBcM1wyMjdcMVwwXDFcMjI3IisKLSAgICAiXDEwXDBcMTFcMjI3XDFcMFw0XDIyN1wxXDBcMlwyMjdcMVwwXDFcMjI3IisKLSAgICAiXDFcMFwzXDIyN1w2XDBcMlwxMTNcMVwyMTZcM1wwXDJcMTEzXDNcMCIrCi0gICAgIlwxXDIzMVw1XDBcMVwxMTNcMVwyMzJcMVwxMTNcMVwyMTdcMVwxMTNcMTBcMCIrCi0gICAgIlwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDBcMVwxMTNcMVwwIisKLSAgICAiXDNcMTEzXDExXDBcMVwyMzNcMVwwXDFcMjMzXDNcMFwxXDIzM1w0XDAiKwotICAgICJcMlwyMzNcMzBcMFwxXDIzNFwyMVwwXDRcMjM1XDFcMjM2XDFcMjM1XDFcMjM2IisKLSAgICAiXDNcMjM1XDFcMjM2XDRcMjM1XDJcMjM2XDEyXDIzNVwxXDBcMTRcMjM1XDFcMCIrCi0gICAgIlwyMlwyMzVcMVwwXDFcMjM3XDFcMjVcMVwxMzFcMVwyNVwxXDBcMVwyNSIrCi0gICAgIlwxXDIzN1wxXDI1XDFcMFwxXDI1XDRcMFwyXDI1XDFcMFwzXDI1IisKLSAgICAiXDFcMFwxXDI1XDEwXDBcMVwyMzdcMlwyNVwxXDIzN1wyXDI1XDFcMjM3IisKLSAgICAiXDJcMjVcMVwwXDRcMjVcMVwwXDFcMjM3XDFcMjVcMVwwXDFcMjUiKwotICAgICJcMVwwXDFcMjM3XDJcMjVcMzdcMFwxXDI0MFw0MVwwXDFcMjQxXDJcMTM0IisKLSAgICAiXDFcMFwyXDEzNFwxXDI0MVwyXDEzNFwxXDBcNFwxMzRcMlwwXDE2XDEzNCIrCi0gICAgIlwxXDI0MVwyXDEzNFwxXDI0MVwyXDEzNFwxXDI0MVwxMFwxMzRcMVwyNDFcNFwxMzQiKwotICAgICJcMVwyNDFcN1wxMzRcMVwwXDFcMjQyXDJcMTM2XDFcMFwyXDEzNlwxXDI0MiIrCi0gICAgIlwyXDEzNlwxXDBcNFwxMzZcMlwwXDE2XDEzNlwxXDI0MlwyXDEzNlwxXDI0MiIrCi0gICAgIlwyXDEzNlwxXDI0MlwxMFwxMzZcMVwyNDJcNFwxMzZcMVwyNDJcN1wxMzZcMTBcMCIrCi0gICAgIlwxXDI0M1w2MlwwXDM1XDE0MVwxXDI0NFwzNVwxNDFcNDFcMFwxXDI0NVwxMDNcMCIrCi0gICAgIlwxXDI0Nlw2NVwwXDJcMjQ3XDY2XDBcMlwyNTBcMTAzXDBcMVwyNTFcMTdcMCIrCi0gICAgIlwyXDE0N1wxXDE1MFwzXDBcMlwxNDdcMTFcMFwzXDE0N1wxXDI1MlwxXDE0NyIrCi0gICAgIlwxMFwwXDExXDE0N1wxXDBcNFwxNDdcMVwwXDJcMTQ3XDFcMFwxXDE0NyIrCi0gICAgIlwxXDBcM1wxNDdcNlwwXDFcMjUzXDJcMTQ3XDFcMFwyXDE0N1wxXDI1MyIrCi0gICAgIlwyXDE0N1wxXDBcNFwxNDdcMlwwXDE2XDE0N1wxXDI1M1wyXDE0N1wxXDI1MyIrCi0gICAgIlwyXDE0N1wxXDI1M1wxMFwxNDdcMVwyNTNcNFwxNDdcMVwyNTNcN1wxNDdcMlwwIisKLSAgICAiXDFcMTQ3XDFcMTUwXDNcMFwxXDE0N1wxMlwwXDNcMTQ3XDFcMFwxXDE0NyIrCi0gICAgIlwxMFwwXDExXDE0N1wxXDBcNFwxNDdcMVwwXDJcMTQ3XDFcMFwxXDE0NyIrCi0gICAgIlwxXDBcM1wxNDdcNlwwXDFcMjU0XDFcMTUyXDFcMTUzXDFcMTUyXDFcMjU1IisKLSAgICAiXDFcMTUyXDFcMjU0XDEwXDE1MlwxXDI1NlwxNlwxNTJcMVwyNTRcMlwxNTJcMVwyNTQiKwotICAgICJcMlwxNTJcMVwyNTRcMTBcMTUyXDFcMjU0XDRcMTUyXDFcMjU0XDdcMTUyXDFcMCIrCi0gICAgIlwxXDI1N1wxXDE1NVwxXDE1NlwzXDE1NVwxXDI1N1wxXDE1NVwxXDI2MFw2XDE1NSIrCi0gICAgIlwxXDI2MVwxNlwxNTVcMVwyNTdcMlwxNTVcMVwyNTdcMlwxNTVcMVwyNTdcMTBcMTU1IisKLSAgICAiXDFcMjU3XDRcMTU1XDFcMjU3XDdcMTU1XDFcMFwxXDI2MlwxXDE1N1wxXDE2MCIrCi0gICAgIlwxXDE1N1wxXDI2M1wxXDE1N1wxXDI2MlwxMFwxNTdcMVwyNjRcMTZcMTU3XDFcMjYyIisKLSAgICAiXDJcMTU3XDFcMjYyXDJcMTU3XDFcMjYyXDEwXDE1N1wxXDI2Mlw0XDE1N1wxXDI2MiIrCi0gICAgIlw3XDE1N1wxXDBcMVwyNjVcMVwxNjJcMVwxNjNcM1wxNjJcMVwyNjVcMVwxNjIiKwotICAgICJcMVwyNjZcNlwxNjJcMVwyNjdcMTZcMTYyXDFcMjY1XDJcMTYyXDFcMjY1XDJcMTYyIisKLSAgICAiXDFcMjY1XDEwXDE2MlwxXDI2NVw0XDE2MlwxXDI2NVw3XDE2MlwyNFwwXDFcMjcwIisKLSAgICAiXDQ3XDBcMVwyNzFcMVw1MVwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcMjcxIisKLSAgICAiXDFcNTFcMVwwXDFcNTFcNFwwXDJcNTFcMVwwXDNcNTFcMVwwIisKLSAgICAiXDFcNTFcMTBcMFwxXDI3MVwyXDUxXDFcMjcxXDJcNTFcMVwyNzFcMlw1MSIrCi0gICAgIlwxXDBcNFw1MVwxXDBcMVwyNzFcMVw1MVwxXDBcMVw1MVwxXDAiKwotICAgICJcMVwyNzFcMlw1MVw2XDBcMVwyNzJcMVw1NVwxXDE2N1wxXDU1XDFcMCIrCi0gICAgIlwxXDU1XDFcMjcyXDFcNTVcMVwwXDFcNTVcNFwwXDJcNTVcMVwwIisKLSAgICAiXDNcNTVcMVwwXDFcNTVcMTBcMFwxXDI3MlwyXDU1XDFcMjcyXDJcNTUiKwotICAgICJcMVwyNzJcMlw1NVwxXDBcNFw1NVwxXDBcMVwyNzJcMVw1NVwxXDAiKwotICAgICJcMVw1NVwxXDBcMVwyNzJcMlw1NVw2XDBcMVwyNzNcMVw2MlwxXDE3MSIrCi0gICAgIlwxXDYyXDFcMFwxXDYyXDFcMjczXDFcNjJcMVwwXDFcNjJcNFwwIisKLSAgICAiXDJcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMTBcMFwxXDI3M1wyXDYyIisKLSAgICAiXDFcMjczXDJcNjJcMVwyNzNcMlw2MlwxXDBcNFw2MlwxXDBcMVwyNzMiKwotICAgICJcMVw2MlwxXDBcMVw2MlwxXDBcMVwyNzNcMlw2Mlw3XDBcMVw2MiIrCi0gICAgIlwxXDE3MVwzXDBcMVw2MlwxMlwwXDNcNjJcMVwwXDFcNjJcMTBcMCIrCi0gICAgIlwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcM1w2Mlw2XDBcMVwyNzRcMVw3MlwxXDE3NlwxXDcyXDFcMFwxXDcyIisKLSAgICAiXDFcMjc0XDFcNzJcMVwwXDFcNzJcNFwwXDJcNzJcMVwwXDNcNzIiKwotICAgICJcMVwwXDFcNzJcMTBcMFwxXDI3NFwyXDcyXDFcMjc0XDJcNzJcMVwyNzQiKwotICAgICJcMlw3MlwxXDBcNFw3MlwxXDBcMVwyNzRcMVw3MlwxXDBcMVw3MiIrCi0gICAgIlwxXDBcMVwyNzRcMlw3Mlw2XDBcMVwyNzVcMVwxMDBcMVwyMDBcMVwxMDAiKwotICAgICJcMVwwXDFcMTAwXDFcMjc1XDFcMTAwXDFcMFwxXDEwMFw0XDBcMlwxMDAiKwotICAgICJcMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDFcMjc1XDJcMTAwXDFcMjc1IisKLSAgICAiXDJcMTAwXDFcMjc1XDJcMTAwXDFcMFw0XDEwMFwxXDBcMVwyNzVcMVwxMDAiKwotICAgICJcMVwwXDFcMTAwXDFcMFwxXDI3NVwyXDEwMFw2XDBcMVwyNzZcMVwyMDIiKwotICAgICJcMVwyMDNcMVwyMDJcMVwyNzdcMVwyMDJcMVwyNzZcMTBcMjAyXDFcMzAwXDE2XDIwMiIrCi0gICAgIlwxXDI3NlwyXDIwMlwxXDI3NlwyXDIwMlwxXDI3NlwxMFwyMDJcMVwyNzZcNFwyMDIiKwotICAgICJcMVwyNzZcN1wyMDJcMVwwXDFcMzAxXDFcMjA1XDFcMjA2XDNcMjA1XDFcMzAxIisKLSAgICAiXDFcMjA1XDFcMzAyXDZcMjA1XDFcMzAzXDE2XDIwNVwxXDMwMVwyXDIwNVwxXDMwMSIrCi0gICAgIlwyXDIwNVwxXDMwMVwxMFwyMDVcMVwzMDFcNFwyMDVcMVwzMDFcN1wyMDVcMVwwIisKLSAgICAiXDFcMzA0XDFcMTA1XDFcMjA3XDFcMTA1XDFcMFwxXDEwNVwxXDMwNFwxXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMFwzXDEwNVwxXDBcMVwxMDUiKwotICAgICJcMTBcMFwxXDMwNFwyXDEwNVwxXDMwNFwyXDEwNVwxXDMwNFwyXDEwNVwxXDAiKwotICAgICJcNFwxMDVcMVwwXDFcMzA0XDFcMTA1XDFcMFwxXDEwNVwxXDBcMVwzMDQiKwotICAgICJcMlwxMDVcNlwwXDJcMjExXDFcMjEyXDNcMFwyXDIxMVwxMVwwXDNcMjExIisKLSAgICAiXDFcMFwxXDIxMVwxMFwwXDExXDIxMVwxXDBcNFwyMTFcMVwwXDJcMjExIisKLSAgICAiXDFcMFwxXDIxMVwxXDBcM1wyMTFcNlwwXDFcMzA1XDJcMjExXDFcMCIrCi0gICAgIlwyXDIxMVwxXDMwNVwyXDIxMVwxXDBcNFwyMTFcMlwwXDE2XDIxMVwxXDMwNSIrCi0gICAgIlwyXDIxMVwxXDMwNVwyXDIxMVwxXDMwNVwxMFwyMTFcMVwzMDVcNFwyMTFcMVwzMDUiKwotICAgICJcN1wyMTFcMlwwXDFcMjExXDFcMjEyXDNcMFwxXDIxMVwxMlwwXDNcMjExIisKLSAgICAiXDFcMFwxXDIxMVwxMFwwXDExXDIxMVwxXDBcNFwyMTFcMVwwXDJcMjExIisKLSAgICAiXDFcMFwxXDIxMVwxXDBcM1wyMTFcNlwwXDFcMzA2XDFcMTEzXDFcMjE2IisKLSAgICAiXDFcMTEzXDFcMFwxXDExM1wxXDMwNlwxXDExM1wxXDBcMVwxMTNcNFwwIisKLSAgICAiXDJcMTEzXDFcMFwzXDExM1wxXDIxN1wxXDExM1wxMFwwXDFcMzA2XDJcMTEzIisKLSAgICAiXDFcMzA2XDJcMTEzXDFcMzA2XDJcMTEzXDFcMFw0XDExM1wxXDBcMVwzMDYiKwotICAgICJcMVwxMTNcMVwwXDFcMTEzXDFcMFwxXDMwNlwyXDExM1w2XDBcMVwzMDciKwotICAgICJcMVwyMjFcMVwyMjJcMVwyMjFcMVwzMTBcMVwyMjFcMVwzMDdcMTBcMjIxXDFcMzExIisKLSAgICAiXDE2XDIyMVwxXDMwN1wyXDIyMVwxXDMwN1wyXDIyMVwxXDMwN1wxMFwyMjFcMVwzMDciKwotICAgICJcNFwyMjFcMVwzMDdcN1wyMjFcMVwwXDFcMzEyXDFcMjI0XDFcMjI1XDNcMjI0IisKLSAgICAiXDFcMzEyXDFcMjI0XDFcMzEzXDZcMjI0XDFcMzE0XDE2XDIyNFwxXDMxMlwyXDIyNCIrCi0gICAgIlwxXDMxMlwyXDIyNFwxXDMxMlwxMFwyMjRcMVwzMTJcNFwyMjRcMVwzMTJcN1wyMjQiKwotICAgICJcMVwwXDFcMjI2XDFcMjExXDFcMjEyXDNcMFwxXDIxMVwxXDIxM1wxMVwwIisKLSAgICAiXDNcMjExXDFcMFwxXDIxMVwxMFwwXDExXDIxMVwxXDBcNFwyMTFcMVwwIisKLSAgICAiXDJcMjExXDFcMFwxXDIxMVwxXDBcM1wyMTFcNFwwXDFcMjE1XDFcMCIrCi0gICAgIlwxXDMxNVwyXDIyN1wxXDBcMlwyMjdcMVwzMTVcMlwyMjdcMVwwXDRcMjI3IisKLSAgICAiXDJcMFwxNlwyMjdcMVwzMTVcMlwyMjdcMVwzMTVcMlwyMjdcMVwzMTVcMTBcMjI3IisKLSAgICAiXDFcMzE1XDRcMjI3XDFcMzE1XDdcMjI3XDFcMFwxXDMxNlw1XDBcMVwzMTYiKwotICAgICJcMTZcMFwyXDMxNlw3XDBcMlwzMTZcMVwwXDJcMzE2XDFcMFwyXDMxNiIrCi0gICAgIlw3XDBcMlwzMTZcM1wwXDJcMzE2XDdcMFwyXDExM1wxXDIxNlwzXDAiKwotICAgICJcMlwxMTNcMTFcMFwyXDExM1wxXDMxN1wxXDIxN1wxXDExM1wxMFwwXDExXDExMyIrCi0gICAgIlwxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTMiKwotICAgICJcNTdcMFwxXDMyMFwyMVwwXDFcMzIxXDFcMjVcMVwxMzFcMVwyNVwxXDAiKwotICAgICJcMVwyNVwxXDMyMVwxXDI1XDFcMFwxXDI1XDRcMFwyXDI1XDFcMCIrCi0gICAgIlwzXDI1XDFcMFwxXDI1XDEwXDBcMVwzMjFcMlwyNVwxXDMyMVwyXDI1IisKLSAgICAiXDFcMzIxXDJcMjVcMVwwXDRcMjVcMVwwXDFcMzIxXDFcMjVcMVwwIisKLSAgICAiXDFcMjVcMVwwXDFcMzIxXDJcMjVcNlwwXDFcMzIyXDFcMTM0XDFcMTM1IisKLSAgICAiXDFcMTM0XDFcMFwxXDEzNFwxXDMyMlwxXDEzNFwxXDBcMVwxMzRcNFwwIisKLSAgICAiXDJcMTM0XDFcMFwzXDEzNFwxXDBcMVwxMzRcMTBcMFwxXDMyMlwyXDEzNCIrCi0gICAgIlwxXDMyMlwyXDEzNFwxXDMyMlwyXDEzNFwxXDBcNFwxMzRcMVwwXDFcMzIyIisKLSAgICAiXDFcMTM0XDFcMFwxXDEzNFwxXDBcMVwzMjJcMlwxMzRcNlwwXDFcMzIzIisKLSAgICAiXDFcMTM2XDFcMTM3XDFcMTM2XDFcMFwxXDEzNlwxXDMyM1wxXDEzNlwxXDAiKwotICAgICJcMVwxMzZcNFwwXDJcMTM2XDFcMFwzXDEzNlwxXDBcMVwxMzZcMTBcMCIrCi0gICAgIlwxXDMyM1wyXDEzNlwxXDMyM1wyXDEzNlwxXDMyM1wyXDEzNlwxXDBcNFwxMzYiKwotICAgICJcMVwwXDFcMzIzXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzMjNcMlwxMzYiKwotICAgICJcMTVcMFwxXDMyNFw2MlwwXDM0XDE0MVwxXDMyNVwxXDI0NFwzNVwxNDFcNDJcMCIrCi0gICAgIlwyXDMyNlwxMDJcMFwxXDMyN1w3NVwwXDJcMzMwXDc0XDBcMVwzMzFcNzZcMCIrCi0gICAgIlwxXDMzMlw3XDBcMVwzMzNcMVwzMzRcMVwyNTJcMVwwXDFcMjUyXDFcMzMzIisKLSAgICAiXDFcMzM1XDFcMFwxXDI1Mlw0XDBcMlwyNTJcMVwwXDNcMzMzXDFcMCIrCi0gICAgIlwxXDMzM1wxMFwwXDExXDMzM1wxXDBcNFwzMzNcMVwwXDJcMzMzXDFcMCIrCi0gICAgIlwxXDMzM1wxXDBcM1wzMzNcNlwwXDFcMzM2XDFcMTQ3XDFcMTUwXDFcMTQ3IisKLSAgICAiXDFcMFwxXDE0N1wxXDMzNlwxXDE0N1wxXDBcMVwxNDdcNFwwXDJcMTQ3IisKLSAgICAiXDFcMFwzXDE0N1wxXDI1MlwxXDE0N1wxMFwwXDFcMzM2XDJcMTQ3XDFcMzM2IisKLSAgICAiXDJcMTQ3XDFcMzM2XDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVwzMzZcMVwxNDciKwotICAgICJcMVwwXDFcMTQ3XDFcMFwxXDMzNlwyXDE0N1w2XDBcMVwzMzdcMVwxNTIiKwotICAgICJcMVwxNTNcMVwxNTJcMVwxNTRcMVwxNTJcMVwzMzdcMjdcMTUyXDFcMzM3XDJcMTUyIisKLSAgICAiXDFcMzM3XDJcMTUyXDFcMzM3XDEwXDE1MlwxXDMzN1w0XDE1MlwxXDMzN1w3XDE1MiIrCi0gICAgIlwxXDBcMlwxNTJcMVwxNTNcMVwwXDFcMTU0XDEyXDE1MlwxXDBcNTJcMTUyIisKLSAgICAiXDFcMFwxXDM0MFwxXDE1NVwxXDE1NlwzXDE1NVwxXDM0MFwxXDE1NVwxXDE1NCIrCi0gICAgIlwyNVwxNTVcMVwzNDBcMlwxNTVcMVwzNDBcMlwxNTVcMVwzNDBcMTBcMTU1XDFcMzQwIisKLSAgICAiXDRcMTU1XDFcMzQwXDdcMTU1XDFcMFwyXDE1NVwxXDE1NlwxXDBcNFwxNTUiKwotICAgICJcMVwxNTRcNlwxNTVcMVwwXDUyXDE1NVwxXDBcMVwzNDFcMVwxNTdcMVwxNjAiKwotICAgICJcMVwxNTdcMVwxNjFcMVwxNTdcMVwzNDFcMjdcMTU3XDFcMzQxXDJcMTU3XDFcMzQxIisKLSAgICAiXDJcMTU3XDFcMzQxXDEwXDE1N1wxXDM0MVw0XDE1N1wxXDM0MVw3XDE1N1wxXDAiKwotICAgICJcMlwxNTdcMVwxNjBcMVwwXDFcMTYxXDEyXDE1N1wxXDBcNTJcMTU3XDFcMCIrCi0gICAgIlwxXDM0MlwxXDE2MlwxXDE2M1wzXDE2MlwxXDM0MlwxXDE2MlwxXDE2MVwyNVwxNjIiKwotICAgICJcMVwzNDJcMlwxNjJcMVwzNDJcMlwxNjJcMVwzNDJcMTBcMTYyXDFcMzQyXDRcMTYyIisKLSAgICAiXDFcMzQyXDdcMTYyXDFcMFwyXDE2MlwxXDE2M1wxXDBcNFwxNjJcMVwxNjEiKwotICAgICJcNlwxNjJcMVwwXDUyXDE2MlwyNVwwXDFcMzQzXDQ2XDBcMVwzNDRcMVw1MSIrCi0gICAgIlwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcMzQ0XDFcNTFcMVwwXDFcNTEiKwotICAgICJcNFwwXDJcNTFcMVwwXDNcNTFcMVwwXDFcNTFcMTBcMFwxXDM0NCIrCi0gICAgIlwyXDUxXDFcMzQ0XDJcNTFcMVwzNDRcMlw1MVwxXDBcNFw1MVwxXDAiKwotICAgICJcMVwzNDRcMVw1MVwxXDBcMVw1MVwxXDBcMVwzNDRcMlw1MVw2XDAiKwotICAgICJcMVwzNDVcMVw1NVwxXDE2N1wxXDU1XDFcMFwxXDU1XDFcMzQ1XDFcNTUiKwotICAgICJcMVwwXDFcNTVcNFwwXDJcNTVcMVwwXDNcNTVcMVwwXDFcNTUiKwotICAgICJcMTBcMFwxXDM0NVwyXDU1XDFcMzQ1XDJcNTVcMVwzNDVcMlw1NVwxXDAiKwotICAgICJcNFw1NVwxXDBcMVwzNDVcMVw1NVwxXDBcMVw1NVwxXDBcMVwzNDUiKwotICAgICJcMlw1NVw2XDBcMVwzNDZcMVw2MlwxXDE3MVwxXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMzQ2XDFcNjJcMVwwXDFcNjJcNFwwXDJcNjJcMVwwXDNcNjIiKwotICAgICJcMVwwXDFcNjJcMTBcMFwxXDM0NlwyXDYyXDFcMzQ2XDJcNjJcMVwzNDYiKwotICAgICJcMlw2MlwxXDBcNFw2MlwxXDBcMVwzNDZcMVw2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVwzNDZcMlw2Mlw2XDBcMVwzNDdcMVw3MlwxXDE3NlwxXDcyIisKLSAgICAiXDFcMFwxXDcyXDFcMzQ3XDFcNzJcMVwwXDFcNzJcNFwwXDJcNzIiKwotICAgICJcMVwwXDNcNzJcMVwwXDFcNzJcMTBcMFwxXDM0N1wyXDcyXDFcMzQ3IisKLSAgICAiXDJcNzJcMVwzNDdcMlw3MlwxXDBcNFw3MlwxXDBcMVwzNDdcMVw3MiIrCi0gICAgIlwxXDBcMVw3MlwxXDBcMVwzNDdcMlw3Mlw2XDBcMVwzNTBcMVwxMDAiKwotICAgICJcMVwyMDBcMVwxMDBcMVwwXDFcMTAwXDFcMzUwXDFcMTAwXDFcMFwxXDEwMCIrCi0gICAgIlw0XDBcMlwxMDBcMVwwXDNcMTAwXDFcMFwxXDEwMFwxMFwwXDFcMzUwIisKLSAgICAiXDJcMTAwXDFcMzUwXDJcMTAwXDFcMzUwXDJcMTAwXDFcMFw0XDEwMFwxXDAiKwotICAgICJcMVwzNTBcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXDM1MFwyXDEwMFw2XDAiKwotICAgICJcMVwzNTFcMVwyMDJcMVwyMDNcMVwyMDJcMVwyMDRcMVwyMDJcMVwzNTFcMjdcMjAyIisKLSAgICAiXDFcMzUxXDJcMjAyXDFcMzUxXDJcMjAyXDFcMzUxXDEwXDIwMlwxXDM1MVw0XDIwMiIrCi0gICAgIlwxXDM1MVw3XDIwMlwxXDBcMlwyMDJcMVwyMDNcMVwwXDFcMjA0XDEyXDIwMiIrCi0gICAgIlwxXDBcNTJcMjAyXDFcMFwxXDM1MlwxXDIwNVwxXDIwNlwzXDIwNVwxXDM1MiIrCi0gICAgIlwxXDIwNVwxXDIwNFwyNVwyMDVcMVwzNTJcMlwyMDVcMVwzNTJcMlwyMDVcMVwzNTIiKwotICAgICJcMTBcMjA1XDFcMzUyXDRcMjA1XDFcMzUyXDdcMjA1XDFcMFwyXDIwNVwxXDIwNiIrCi0gICAgIlwxXDBcNFwyMDVcMVwyMDRcNlwyMDVcMVwwXDUyXDIwNVwxXDBcMVwzNTMiKwotICAgICJcMVwxMDVcMVwyMDdcMVwxMDVcMVwwXDFcMTA1XDFcMzUzXDFcMTA1XDFcMCIrCi0gICAgIlwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1XDFcMFwxXDEwNVwxMFwwIisKLSAgICAiXDFcMzUzXDJcMTA1XDFcMzUzXDJcMTA1XDFcMzUzXDJcMTA1XDFcMFw0XDEwNSIrCi0gICAgIlwxXDBcMVwzNTNcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXDM1M1wyXDEwNSIrCi0gICAgIlw2XDBcMVwzNTRcMVwyMTFcMVwyMTJcMVwyMTFcMVwwXDFcMjExXDFcMzU0IisKLSAgICAiXDFcMjExXDFcMFwxXDIxMVw0XDBcMlwyMTFcMVwwXDNcMjExXDFcMCIrCi0gICAgIlwxXDIxMVwxMFwwXDFcMzU0XDJcMjExXDFcMzU0XDJcMjExXDFcMzU0XDJcMjExIisKLSAgICAiXDFcMFw0XDIxMVwxXDBcMVwzNTRcMVwyMTFcMVwwXDFcMjExXDFcMCIrCi0gICAgIlwxXDM1NFwyXDIxMVw2XDBcMVwzNTVcMVwxMTNcMVwyMTZcMVwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcMzU1XDFcMTEzXDFcMFwxXDExM1w0XDBcMlwxMTNcMVwwIisKLSAgICAiXDNcMTEzXDFcMjE3XDFcMTEzXDEwXDBcMVwzNTVcMlwxMTNcMVwzNTVcMlwxMTMiKwotICAgICJcMVwzNTVcMlwxMTNcMVwwXDRcMTEzXDFcMFwxXDM1NVwxXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVwwXDFcMzU1XDJcMTEzXDZcMFwxXDM1NlwxXDIyMVwxXDIyMiIrCi0gICAgIlwxXDIyMVwxXDIyM1wxXDIyMVwxXDM1NlwyN1wyMjFcMVwzNTZcMlwyMjFcMVwzNTYiKwotICAgICJcMlwyMjFcMVwzNTZcMTBcMjIxXDFcMzU2XDRcMjIxXDFcMzU2XDdcMjIxXDFcMCIrCi0gICAgIlwyXDIyMVwxXDIyMlwxXDBcMVwyMjNcMTJcMjIxXDFcMFw1MlwyMjFcMVwwIisKLSAgICAiXDFcMzU3XDFcMjI0XDFcMjI1XDNcMjI0XDFcMzU3XDFcMjI0XDFcMjIzXDI1XDIyNCIrCi0gICAgIlwxXDM1N1wyXDIyNFwxXDM1N1wyXDIyNFwxXDM1N1wxMFwyMjRcMVwzNTdcNFwyMjQiKwotICAgICJcMVwzNTdcN1wyMjRcMVwwXDJcMjI0XDFcMjI1XDFcMFw0XDIyNFwxXDIyMyIrCi0gICAgIlw2XDIyNFwxXDBcNTJcMjI0XDFcMFwxXDM2MFwxXDIyN1wxXDIzMFwxXDIyNyIrCi0gICAgIlwxXDBcMVwyMjdcMVwzNjBcMVwyMjdcMVwwXDFcMjI3XDRcMFwyXDIyNyIrCi0gICAgIlwxXDBcM1wyMjdcMVwwXDFcMjI3XDEwXDBcMVwzNjBcMlwyMjdcMVwzNjAiKwotICAgICJcMlwyMjdcMVwzNjBcMlwyMjdcMVwwXDRcMjI3XDFcMFwxXDM2MFwxXDIyNyIrCi0gICAgIlwxXDBcMVwyMjdcMVwwXDFcMzYwXDJcMjI3XDZcMFwxXDM2MVw1XDAiKwotICAgICJcMVwzNjFcMVwzNjJcMTVcMFwyXDM2MVw3XDBcMlwzNjFcMVwwXDJcMzYxIisKLSAgICAiXDFcMFwyXDM2MVw3XDBcMlwzNjFcM1wwXDJcMzYxXDdcMFwyXDExMyIrCi0gICAgIlwxXDIxNlwzXDBcMlwxMTNcMTFcMFwzXDExM1wxXDM2M1wxXDExM1wxMFwwIisKLSAgICAiXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDAiKwotICAgICJcM1wxMTNcNjBcMFwxXDM2NFwyMFwwXDFcMzY1XDFcMjVcMVwxMzFcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVwxXDM2NVwxXDI1XDFcMFwxXDI1XDRcMFwyXDI1IisKLSAgICAiXDFcMFwzXDI1XDFcMFwxXDI1XDEwXDBcMVwzNjVcMlwyNVwxXDM2NSIrCi0gICAgIlwyXDI1XDFcMzY1XDJcMjVcMVwwXDRcMjVcMVwwXDFcMzY1XDFcMjUiKwotICAgICJcMVwwXDFcMjVcMVwwXDFcMzY1XDJcMjVcNlwwXDFcMzY2XDFcMTM0IisKLSAgICAiXDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXDM2NlwxXDEzNFwxXDBcMVwxMzQiKwotICAgICJcNFwwXDJcMTM0XDFcMFwzXDEzNFwxXDBcMVwxMzRcMTBcMFwxXDM2NiIrCi0gICAgIlwyXDEzNFwxXDM2NlwyXDEzNFwxXDM2NlwyXDEzNFwxXDBcNFwxMzRcMVwwIisKLSAgICAiXDFcMzY2XDFcMTM0XDFcMFwxXDEzNFwxXDBcMVwzNjZcMlwxMzRcNlwwIisKLSAgICAiXDFcMzY3XDFcMTM2XDFcMTM3XDFcMTM2XDFcMFwxXDEzNlwxXDM2N1wxXDEzNiIrCi0gICAgIlwxXDBcMVwxMzZcNFwwXDJcMTM2XDFcMFwzXDEzNlwxXDBcMVwxMzYiKwotICAgICJcMTBcMFwxXDM2N1wyXDEzNlwxXDM2N1wyXDEzNlwxXDM2N1wyXDEzNlwxXDAiKwotICAgICJcNFwxMzZcMVwwXDFcMzY3XDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzNjciKwotICAgICJcMlwxMzZcMzBcMFwxXDM3MFwxMjNcMFwxXDM3MVw2N1wwXDFcMzcyXDY2XDAiKwotICAgICJcMlwzNzNcNzNcMFwxXDM3NFwyNFwwXDJcMzMzXDFcMzM0XDFcMzc1XDFcMCIrCi0gICAgIlwxXDM3NVwyXDMzM1wxXDBcMVwzNzVcMVwzNzZcM1wwXDJcMzc1XDFcMCIrCi0gICAgIlwzXDMzM1wxXDBcMVwzMzNcMTBcMFwxMVwzMzNcMVwwXDRcMzMzXDFcMCIrCi0gICAgIlwyXDMzM1wxXDBcMVwzMzNcMVwwXDNcMzMzXDZcMFwxXDM3N1wyXDMzMyIrCi0gICAgIlwxXDBcMlwzMzNcMVwzNzdcMlwzMzNcMVwwXDRcMzMzXDJcMFwxNlwzMzMiKwotICAgICJcMVwzNzdcMlwzMzNcMVwzNzdcMlwzMzNcMVwzNzdcMTBcMzMzXDFcMzc3XDRcMzMzIisKLSAgICAiXDFcMzc3XDdcMzMzXDJcMFwxXDMzM1wxXDMzNFwzXDBcMVwzMzNcMTJcMCIrCi0gICAgIlwzXDMzM1wxXDBcMVwzMzNcMTBcMFwxMVwzMzNcMVwwXDRcMzMzXDFcMCIrCi0gICAgIlwyXDMzM1wxXDBcMVwzMzNcMVwwXDNcMzMzXDZcMFwxXHUwMTAwXDFcMTQ3IisKLSAgICAiXDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTAwXDFcMTQ3XDFcMFwxXDE0NyIrCi0gICAgIlw0XDBcMlwxNDdcMVwwXDNcMTQ3XDFcMjUyXDFcMTQ3XDEwXDBcMVx1MDEwMCIrCi0gICAgIlwyXDE0N1wxXHUwMTAwXDJcMTQ3XDFcdTAxMDBcMlwxNDdcMVwwXDRcMTQ3XDFcMCIrCi0gICAgIlwxXHUwMTAwXDFcMTQ3XDFcMFwxXDE0N1wxXDBcMVx1MDEwMFwyXDE0N1w2XDAiKwotICAgICJcMVx1MDEwMVwxXDE1MlwxXDE1M1wxXDE1MlwxXDE1NFwxXDE1MlwxXHUwMTAxXDI3XDE1MiIrCi0gICAgIlwxXHUwMTAxXDJcMTUyXDFcdTAxMDFcMlwxNTJcMVx1MDEwMVwxMFwxNTJcMVx1MDEwMVw0XDE1MiIrCi0gICAgIlwxXHUwMTAxXDdcMTUyXDFcMFwxXHUwMTAyXDFcMTU1XDFcMTU2XDNcMTU1XDFcdTAxMDIiKwotICAgICJcMVwxNTVcMVwxNTRcMjVcMTU1XDFcdTAxMDJcMlwxNTVcMVx1MDEwMlwyXDE1NVwxXHUwMTAyIisKLSAgICAiXDEwXDE1NVwxXHUwMTAyXDRcMTU1XDFcdTAxMDJcN1wxNTVcMVwwXDFcdTAxMDNcMVwxNTciKwotICAgICJcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDEwM1wyN1wxNTdcMVx1MDEwM1wyXDE1NyIrCi0gICAgIlwxXHUwMTAzXDJcMTU3XDFcdTAxMDNcMTBcMTU3XDFcdTAxMDNcNFwxNTdcMVx1MDEwM1w3XDE1NyIrCi0gICAgIlwxXDBcMVx1MDEwNFwxXDE2MlwxXDE2M1wzXDE2MlwxXHUwMTA0XDFcMTYyXDFcMTYxIisKLSAgICAiXDI1XDE2MlwxXHUwMTA0XDJcMTYyXDFcdTAxMDRcMlwxNjJcMVx1MDEwNFwxMFwxNjJcMVx1MDEwNCIrCi0gICAgIlw0XDE2MlwxXHUwMTA0XDdcMTYyXDFcMFwyXHUwMTA1XDFcdTAxMDZcMVwzNDNcMVx1MDEwNyIrCi0gICAgIlwxXDM0M1wyXHUwMTA1XDFcdTAxMDhcMVwzNDNcMVx1MDEwOVwzXHUwMTA1XDJcMzQzXDRcdTAxMDUiKwotICAgICJcMVwwXDQ1XHUwMTA1XDFcMFwxXHUwMTBhXDFcNTFcMVwxNjVcMVw1MVwxXDAiKwotICAgICJcMVw1MVwxXHUwMTBhXDFcNTFcMVwwXDFcNTFcNFwwXDJcNTFcMVwwIisKLSAgICAiXDNcNTFcMVwwXDFcNTFcMTBcMFwxXHUwMTBhXDJcNTFcMVx1MDEwYVwyXDUxIisKLSAgICAiXDFcdTAxMGFcMlw1MVwxXDBcNFw1MVwxXDBcMVx1MDEwYVwxXDUxXDFcMCIrCi0gICAgIlwxXDUxXDFcMFwxXHUwMTBhXDJcNTFcNlwwXDFcdTAxMGJcMVw1NVwxXDE2NyIrCi0gICAgIlwxXDU1XDFcMFwxXDU1XDFcdTAxMGJcMVw1NVwxXDBcMVw1NVw0XDAiKwotICAgICJcMlw1NVwxXDBcM1w1NVwxXDBcMVw1NVwxMFwwXDFcdTAxMGJcMlw1NSIrCi0gICAgIlwxXHUwMTBiXDJcNTVcMVx1MDEwYlwyXDU1XDFcMFw0XDU1XDFcMFwxXHUwMTBiIisKLSAgICAiXDFcNTVcMVwwXDFcNTVcMVwwXDFcdTAxMGJcMlw1NVw2XDBcMVx1MDEwYyIrCi0gICAgIlwxXDYyXDFcMTcxXDFcNjJcMVwwXDFcNjJcMVx1MDEwY1wxXDYyXDFcMCIrCi0gICAgIlwxXDYyXDRcMFwyXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDEwXDAiKwotICAgICJcMVx1MDEwY1wyXDYyXDFcdTAxMGNcMlw2MlwxXHUwMTBjXDJcNjJcMVwwXDRcNjIiKwotICAgICJcMVwwXDFcdTAxMGNcMVw2MlwxXDBcMVw2MlwxXDBcMVx1MDEwY1wyXDYyIisKLSAgICAiXDZcMFwxXHUwMTBkXDFcNzJcMVwxNzZcMVw3MlwxXDBcMVw3MlwxXHUwMTBkIisKLSAgICAiXDFcNzJcMVwwXDFcNzJcNFwwXDJcNzJcMVwwXDNcNzJcMVwwIisKLSAgICAiXDFcNzJcMTBcMFwxXHUwMTBkXDJcNzJcMVx1MDEwZFwyXDcyXDFcdTAxMGRcMlw3MiIrCi0gICAgIlwxXDBcNFw3MlwxXDBcMVx1MDEwZFwxXDcyXDFcMFwxXDcyXDFcMCIrCi0gICAgIlwxXHUwMTBkXDJcNzJcNlwwXDFcdTAxMGVcMVwxMDBcMVwyMDBcMVwxMDBcMVwwIisKLSAgICAiXDFcMTAwXDFcdTAxMGVcMVwxMDBcMVwwXDFcMTAwXDRcMFwyXDEwMFwxXDAiKwotICAgICJcM1wxMDBcMVwwXDFcMTAwXDEwXDBcMVx1MDEwZVwyXDEwMFwxXHUwMTBlXDJcMTAwIisKLSAgICAiXDFcdTAxMGVcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXHUwMTBlXDFcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxXDBcMVx1MDEwZVwyXDEwMFw2XDBcMVx1MDEwZlwxXDIwMlwxXDIwMyIrCi0gICAgIlwxXDIwMlwxXDIwNFwxXDIwMlwxXHUwMTBmXDI3XDIwMlwxXHUwMTBmXDJcMjAyXDFcdTAxMGYiKwotICAgICJcMlwyMDJcMVx1MDEwZlwxMFwyMDJcMVx1MDEwZlw0XDIwMlwxXHUwMTBmXDdcMjAyXDFcMCIrCi0gICAgIlwxXHUwMTEwXDFcMjA1XDFcMjA2XDNcMjA1XDFcdTAxMTBcMVwyMDVcMVwyMDRcMjVcMjA1IisKLSAgICAiXDFcdTAxMTBcMlwyMDVcMVx1MDExMFwyXDIwNVwxXHUwMTEwXDEwXDIwNVwxXHUwMTEwXDRcMjA1IisKLSAgICAiXDFcdTAxMTBcN1wyMDVcMVwwXDFcdTAxMTFcMVwxMDVcMVwyMDdcMVwxMDVcMVwwIisKLSAgICAiXDFcMTA1XDFcdTAxMTFcMVwxMDVcMVwwXDFcMTA1XDRcMFwyXDEwNVwxXDAiKwotICAgICJcM1wxMDVcMVwwXDFcMTA1XDEwXDBcMVx1MDExMVwyXDEwNVwxXHUwMTExXDJcMTA1IisKLSAgICAiXDFcdTAxMTFcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTExXDFcMTA1XDFcMCIrCi0gICAgIlwxXDEwNVwxXDBcMVx1MDExMVwyXDEwNVw2XDBcMVx1MDExMlwxXDIxMVwxXDIxMiIrCi0gICAgIlwxXDIxMVwxXDBcMVwyMTFcMVx1MDExMlwxXDIxMVwxXDBcMVwyMTFcNFwwIisKLSAgICAiXDJcMjExXDFcMFwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxXHUwMTEyXDJcMjExIisKLSAgICAiXDFcdTAxMTJcMlwyMTFcMVx1MDExMlwyXDIxMVwxXDBcNFwyMTFcMVwwXDFcdTAxMTIiKwotICAgICJcMVwyMTFcMVwwXDFcMjExXDFcMFwxXHUwMTEyXDJcMjExXDZcMFwxXHUwMTEzIisKLSAgICAiXDFcMTEzXDFcMjE2XDFcMTEzXDFcMFwxXDExM1wxXHUwMTEzXDFcMTEzXDFcMCIrCi0gICAgIlwxXDExM1w0XDBcMlwxMTNcMVwwXDNcMTEzXDFcMjE3XDFcMTEzXDEwXDAiKwotICAgICJcMVx1MDExM1wyXDExM1wxXHUwMTEzXDJcMTEzXDFcdTAxMTNcMlwxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcMFwxXHUwMTEzXDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDExM1wyXDExMyIrCi0gICAgIlw2XDBcMVx1MDExNFwxXDIyMVwxXDIyMlwxXDIyMVwxXDIyM1wxXDIyMVwxXHUwMTE0IisKLSAgICAiXDI3XDIyMVwxXHUwMTE0XDJcMjIxXDFcdTAxMTRcMlwyMjFcMVx1MDExNFwxMFwyMjFcMVx1MDExNCIrCi0gICAgIlw0XDIyMVwxXHUwMTE0XDdcMjIxXDFcMFwxXHUwMTE1XDFcMjI0XDFcMjI1XDNcMjI0IisKLSAgICAiXDFcdTAxMTVcMVwyMjRcMVwyMjNcMjVcMjI0XDFcdTAxMTVcMlwyMjRcMVx1MDExNVwyXDIyNCIrCi0gICAgIlwxXHUwMTE1XDEwXDIyNFwxXHUwMTE1XDRcMjI0XDFcdTAxMTVcN1wyMjRcMVwwXDFcdTAxMTYiKwotICAgICJcMVwyMjdcMVwyMzBcMVwyMjdcMVwwXDFcMjI3XDFcdTAxMTZcMVwyMjdcMVwwIisKLSAgICAiXDFcMjI3XDRcMFwyXDIyN1wxXDBcM1wyMjdcMVwwXDFcMjI3XDEwXDAiKwotICAgICJcMVx1MDExNlwyXDIyN1wxXHUwMTE2XDJcMjI3XDFcdTAxMTZcMlwyMjdcMVwwXDRcMjI3IisKLSAgICAiXDFcMFwxXHUwMTE2XDFcMjI3XDFcMFwxXDIyN1wxXDBcMVx1MDExNlwyXDIyNyIrCi0gICAgIlw2XDBcMVx1MDExN1w1XDBcMVx1MDExN1wxXDM2MlwxNVwwXDJcdTAxMTdcN1wwIisKLSAgICAiXDJcdTAxMTdcMVwwXDJcdTAxMTdcMVwwXDJcdTAxMTdcN1wwXDJcdTAxMTdcM1wwIisKLSAgICAiXDJcdTAxMTdcN1wwXDFcdTAxMThcNVwwXDFcdTAxMThcMTZcMFwyXHUwMTE4XDdcMCIrCi0gICAgIlwyXHUwMTE4XDFcMFwyXHUwMTE4XDFcMFwyXHUwMTE4XDdcMFwyXHUwMTE4XDNcMCIrCi0gICAgIlwyXHUwMTE4XDdcMFwyXHUwMTE5XDFcdTAxMWFcMVx1MDExYlwxXHUwMTFjXDFcdTAxMWJcMlx1MDExOSIrCi0gICAgIlwxXHUwMTFkXDFcdTAxMWJcMVx1MDExZVwzXHUwMTE5XDJcdTAxMWJcNFx1MDExOVwxXDBcNDVcdTAxMTkiKwotICAgICJcNTRcMFwxXHUwMTFmXDE3XDBcMVx1MDEyMFwxXDI1XDFcMTMxXDFcMjVcMVwwIisKLSAgICAiXDFcMjVcMVx1MDEyMFwxXDI1XDFcMFwxXDI1XDRcMFwyXDI1XDFcMCIrCi0gICAgIlwzXDI1XDFcMFwxXDI1XDEwXDBcMVx1MDEyMFwyXDI1XDFcdTAxMjBcMlwyNSIrCi0gICAgIlwxXHUwMTIwXDJcMjVcMVwwXDRcMjVcMVwwXDFcdTAxMjBcMVwyNVwxXDAiKwotICAgICJcMVwyNVwxXDBcMVx1MDEyMFwyXDI1XDZcMFwxXHUwMTIxXDFcMTM0XDFcMTM1IisKLSAgICAiXDFcMTM0XDFcMFwxXDEzNFwxXHUwMTIxXDFcMTM0XDFcMFwxXDEzNFw0XDAiKwotICAgICJcMlwxMzRcMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwXDFcdTAxMjFcMlwxMzQiKwotICAgICJcMVx1MDEyMVwyXDEzNFwxXHUwMTIxXDJcMTM0XDFcMFw0XDEzNFwxXDBcMVx1MDEyMSIrCi0gICAgIlwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxMjFcMlwxMzRcNlwwXDFcdTAxMjIiKwotICAgICJcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxMjJcMVwxMzZcMVwwIisKLSAgICAiXDFcMTM2XDRcMFwyXDEzNlwxXDBcM1wxMzZcMVwwXDFcMTM2XDEwXDAiKwotICAgICJcMVx1MDEyMlwyXDEzNlwxXHUwMTIyXDJcMTM2XDFcdTAxMjJcMlwxMzZcMVwwXDRcMTM2IisKLSAgICAiXDFcMFwxXHUwMTIyXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVx1MDEyMlwyXDEzNiIrCi0gICAgIlw1MVwwXDFcdTAxMjNcNTFcMFwxXHUwMTI0XDExMVwwXDJcdTAxMjVcMzdcMFwxXHUwMTI2IisKLSAgICAiXDY2XDBcMVwzNzVcMVwwXDFcMzc1XDNcMFwxXDM3NVwxXDM3NlwzXDAiKwotICAgICJcMlwzNzVcNTNcMFwxXHUwMTI3XDFcMzMzXDFcMzM0XDFcMzMzXDFcMFwxXDMzMyIrCi0gICAgIlwxXHUwMTI3XDFcMzMzXDFcMFwxXDMzM1wxXDM3NlwzXDBcMlwzMzNcMVwwIisKLSAgICAiXDNcMzMzXDFcMFwxXDMzM1wxMFwwXDFcdTAxMjdcMlwzMzNcMVx1MDEyN1wyXDMzMyIrCi0gICAgIlwxXHUwMTI3XDJcMzMzXDFcMFw0XDMzM1wxXDBcMVx1MDEyN1wxXDMzM1wxXDAiKwotICAgICJcMVwzMzNcMVwwXDFcdTAxMjdcMlwzMzNcNlwwXDFcdTAxMjhcMVwxNDdcMVwxNTAiKwotICAgICJcMVwxNDdcMVwwXDFcMTQ3XDFcdTAxMjhcMVwxNDdcMVwwXDFcMTQ3XDRcMCIrCi0gICAgIlwyXDE0N1wxXDBcM1wxNDdcMVwyNTJcMVwxNDdcMTBcMFwxXHUwMTI4XDJcMTQ3IisKLSAgICAiXDFcdTAxMjhcMlwxNDdcMVx1MDEyOFwyXDE0N1wxXDBcNFwxNDdcMVwwXDFcdTAxMjgiKwotICAgICJcMVwxNDdcMVwwXDFcMTQ3XDFcMFwxXHUwMTI4XDJcMTQ3XDZcMFwxXHUwMTI5IisKLSAgICAiXDFcMTUyXDFcMTUzXDFcMTUyXDFcMTU0XDFcMTUyXDFcdTAxMjlcMjdcMTUyXDFcdTAxMjkiKwotICAgICJcMlwxNTJcMVx1MDEyOVwyXDE1MlwxXHUwMTI5XDEwXDE1MlwxXHUwMTI5XDRcMTUyXDFcdTAxMjkiKwotICAgICJcN1wxNTJcMVwwXDFcdTAxMmFcMVwxNTVcMVwxNTZcM1wxNTVcMVx1MDEyYVwxXDE1NSIrCi0gICAgIlwxXDE1NFwyNVwxNTVcMVx1MDEyYVwyXDE1NVwxXHUwMTJhXDJcMTU1XDFcdTAxMmFcMTBcMTU1IisKLSAgICAiXDFcdTAxMmFcNFwxNTVcMVx1MDEyYVw3XDE1NVwxXDBcMVx1MDEyYlwxXDE1N1wxXDE2MCIrCi0gICAgIlwxXDE1N1wxXDE2MVwxXDE1N1wxXHUwMTJiXDI3XDE1N1wxXHUwMTJiXDJcMTU3XDFcdTAxMmIiKwotICAgICJcMlwxNTdcMVx1MDEyYlwxMFwxNTdcMVx1MDEyYlw0XDE1N1wxXHUwMTJiXDdcMTU3XDFcMCIrCi0gICAgIlwxXHUwMTJjXDFcMTYyXDFcMTYzXDNcMTYyXDFcdTAxMmNcMVwxNjJcMVwxNjFcMjVcMTYyIisKLSAgICAiXDFcdTAxMmNcMlwxNjJcMVx1MDEyY1wyXDE2MlwxXHUwMTJjXDEwXDE2MlwxXHUwMTJjXDRcMTYyIisKLSAgICAiXDFcdTAxMmNcN1wxNjJcMVwwXDJcdTAxMDVcMVx1MDEwNlwxXHUwMTJkXDFcMFwzXHUwMTA1IisKLSAgICAiXDFcMFwxXHUwMTJkXDFcdTAxMDlcM1x1MDEwNVwyXHUwMTJkXDRcdTAxMDVcMVwwXDQ1XHUwMTA1IisKLSAgICAiXDFcMFwxXHUwMTJlXDFcdTAxMDVcMVx1MDEwNlwxXHUwMTJkXDJcdTAxMDVcMVx1MDEyZVwyXHUwMTA1IisKLSAgICAiXDFcdTAxMmRcMVx1MDEyZlwzXHUwMTA1XDJcdTAxMmRcMTZcdTAxMDVcMVx1MDEyZVwyXHUwMTA1XDFcdTAxMmUiKwotICAgICJcMlx1MDEwNVwxXHUwMTJlXDEwXHUwMTA1XDFcdTAxMmVcNFx1MDEwNVwxXHUwMTJlXDdcdTAxMDVcMVwwIisKLSAgICAiXDJcdTAxMDdcMVx1MDEzMFwxXDBcMVx1MDEyZFwxMVx1MDEwN1wyXDBcNTJcdTAxMDdcMVwwIisKLSAgICAiXDJcdTAxMDhcMVx1MDEzMVwxXDBcNFx1MDEwOFwxXHUwMTJkXDVcdTAxMDhcMlwwXDUyXHUwMTA4IisKLSAgICAiXDFcMFwxXHUwMTMyXDFcNTFcMVwxNjVcMVw1MVwxXDBcMVw1MVwxXHUwMTMyIisKLSAgICAiXDFcNTFcMVwwXDFcNTFcNFwwXDJcNTFcMVwwXDNcNTFcMVwwIisKLSAgICAiXDFcNTFcMTBcMFwxXHUwMTMyXDJcNTFcMVx1MDEzMlwyXDUxXDFcdTAxMzJcMlw1MSIrCi0gICAgIlwxXDBcNFw1MVwxXDBcMVx1MDEzMlwxXDUxXDFcMFwxXDUxXDFcMCIrCi0gICAgIlwxXHUwMTMyXDJcNTFcNlwwXDFcdTAxMzNcMVw1NVwxXDE2N1wxXDU1XDFcMCIrCi0gICAgIlwxXDU1XDFcdTAxMzNcMVw1NVwxXDBcMVw1NVw0XDBcMlw1NVwxXDAiKwotICAgICJcM1w1NVwxXDBcMVw1NVwxMFwwXDFcdTAxMzNcMlw1NVwxXHUwMTMzXDJcNTUiKwotICAgICJcMVx1MDEzM1wyXDU1XDFcMFw0XDU1XDFcMFwxXHUwMTMzXDFcNTVcMVwwIisKLSAgICAiXDFcNTVcMVwwXDFcdTAxMzNcMlw1NVw2XDBcMVx1MDEzNFwxXDYyXDFcMTcxIisKLSAgICAiXDFcNjJcMVwwXDFcNjJcMVx1MDEzNFwxXDYyXDFcMFwxXDYyXDRcMCIrCi0gICAgIlwyXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDEwXDBcMVx1MDEzNFwyXDYyIisKLSAgICAiXDFcdTAxMzRcMlw2MlwxXHUwMTM0XDJcNjJcMVwwXDRcNjJcMVwwXDFcdTAxMzQiKwotICAgICJcMVw2MlwxXDBcMVw2MlwxXDBcMVx1MDEzNFwyXDYyXDZcMFwxXHUwMTM1IisKLSAgICAiXDFcNzJcMVwxNzZcMVw3MlwxXDBcMVw3MlwxXHUwMTM1XDFcNzJcMVwwIisKLSAgICAiXDFcNzJcNFwwXDJcNzJcMVwwXDNcNzJcMVwwXDFcNzJcMTBcMCIrCi0gICAgIlwxXHUwMTM1XDJcNzJcMVx1MDEzNVwyXDcyXDFcdTAxMzVcMlw3MlwxXDBcNFw3MiIrCi0gICAgIlwxXDBcMVx1MDEzNVwxXDcyXDFcMFwxXDcyXDFcMFwxXHUwMTM1XDJcNzIiKwotICAgICJcNlwwXDFcdTAxMzZcMVwxMDBcMVwyMDBcMVwxMDBcMVwwXDFcMTAwXDFcdTAxMzYiKwotICAgICJcMVwxMDBcMVwwXDFcMTAwXDRcMFwyXDEwMFwxXDBcM1wxMDBcMVwwIisKLSAgICAiXDFcMTAwXDEwXDBcMVx1MDEzNlwyXDEwMFwxXHUwMTM2XDJcMTAwXDFcdTAxMzZcMlwxMDAiKwotICAgICJcMVwwXDRcMTAwXDFcMFwxXHUwMTM2XDFcMTAwXDFcMFwxXDEwMFwxXDAiKwotICAgICJcMVx1MDEzNlwyXDEwMFw2XDBcMVx1MDEzN1wxXDIwMlwxXDIwM1wxXDIwMlwxXDIwNCIrCi0gICAgIlwxXDIwMlwxXHUwMTM3XDI3XDIwMlwxXHUwMTM3XDJcMjAyXDFcdTAxMzdcMlwyMDJcMVx1MDEzNyIrCi0gICAgIlwxMFwyMDJcMVx1MDEzN1w0XDIwMlwxXHUwMTM3XDdcMjAyXDFcMFwxXHUwMTM4XDFcMjA1IisKLSAgICAiXDFcMjA2XDNcMjA1XDFcdTAxMzhcMVwyMDVcMVwyMDRcMjVcMjA1XDFcdTAxMzhcMlwyMDUiKwotICAgICJcMVx1MDEzOFwyXDIwNVwxXHUwMTM4XDEwXDIwNVwxXHUwMTM4XDRcMjA1XDFcdTAxMzhcN1wyMDUiKwotICAgICJcMVwwXDFcdTAxMzlcMVwxMDVcMVwyMDdcMVwxMDVcMVwwXDFcMTA1XDFcdTAxMzkiKwotICAgICJcMVwxMDVcMVwwXDFcMTA1XDRcMFwyXDEwNVwxXDBcM1wxMDVcMVwwIisKLSAgICAiXDFcMTA1XDEwXDBcMVx1MDEzOVwyXDEwNVwxXHUwMTM5XDJcMTA1XDFcdTAxMzlcMlwxMDUiKwotICAgICJcMVwwXDRcMTA1XDFcMFwxXHUwMTM5XDFcMTA1XDFcMFwxXDEwNVwxXDAiKwotICAgICJcMVx1MDEzOVwyXDEwNVw2XDBcMVx1MDEzYVwxXDIxMVwxXDIxMlwxXDIxMVwxXDAiKwotICAgICJcMVwyMTFcMVx1MDEzYVwxXDIxMVwxXDBcMVwyMTFcNFwwXDJcMjExXDFcMCIrCi0gICAgIlwzXDIxMVwxXDBcMVwyMTFcMTBcMFwxXHUwMTNhXDJcMjExXDFcdTAxM2FcMlwyMTEiKwotICAgICJcMVx1MDEzYVwyXDIxMVwxXDBcNFwyMTFcMVwwXDFcdTAxM2FcMVwyMTFcMVwwIisKLSAgICAiXDFcMjExXDFcMFwxXHUwMTNhXDJcMjExXDZcMFwxXHUwMTNiXDFcMTEzXDFcMjE2IisKLSAgICAiXDFcMTEzXDFcMFwxXDExM1wxXHUwMTNiXDFcMTEzXDFcMFwxXDExM1w0XDAiKwotICAgICJcMlwxMTNcMVwwXDNcMTEzXDFcMjE3XDFcMTEzXDEwXDBcMVx1MDEzYlwyXDExMyIrCi0gICAgIlwxXHUwMTNiXDJcMTEzXDFcdTAxM2JcMlwxMTNcMVwwXDRcMTEzXDFcMFwxXHUwMTNiIisKLSAgICAiXDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDEzYlwyXDExM1w2XDBcMVx1MDEzYyIrCi0gICAgIlwxXDIyMVwxXDIyMlwxXDIyMVwxXDIyM1wxXDIyMVwxXHUwMTNjXDI3XDIyMVwxXHUwMTNjIisKLSAgICAiXDJcMjIxXDFcdTAxM2NcMlwyMjFcMVx1MDEzY1wxMFwyMjFcMVx1MDEzY1w0XDIyMVwxXHUwMTNjIisKLSAgICAiXDdcMjIxXDFcMFwxXHUwMTNkXDFcMjI0XDFcMjI1XDNcMjI0XDFcdTAxM2RcMVwyMjQiKwotICAgICJcMVwyMjNcMjVcMjI0XDFcdTAxM2RcMlwyMjRcMVx1MDEzZFwyXDIyNFwxXHUwMTNkXDEwXDIyNCIrCi0gICAgIlwxXHUwMTNkXDRcMjI0XDFcdTAxM2RcN1wyMjRcMVwwXDFcdTAxM2VcMVwyMjdcMVwyMzAiKwotICAgICJcMVwyMjdcMVwwXDFcMjI3XDFcdTAxM2VcMVwyMjdcMVwwXDFcMjI3XDRcMCIrCi0gICAgIlwyXDIyN1wxXDBcM1wyMjdcMVwwXDFcMjI3XDEwXDBcMVx1MDEzZVwyXDIyNyIrCi0gICAgIlwxXHUwMTNlXDJcMjI3XDFcdTAxM2VcMlwyMjdcMVwwXDRcMjI3XDFcMFwxXHUwMTNlIisKLSAgICAiXDFcMjI3XDFcMFwxXDIyN1wxXDBcMVx1MDEzZVwyXDIyN1w2XDBcMVx1MDEzZiIrCi0gICAgIlw1XDBcMVx1MDEzZlwxXDM2MlwxNVwwXDJcdTAxM2ZcN1wwXDJcdTAxM2ZcMVwwIisKLSAgICAiXDJcdTAxM2ZcMVwwXDJcdTAxM2ZcN1wwXDJcdTAxM2ZcM1wwXDJcdTAxM2ZcN1wwIisKLSAgICAiXDFcdTAxNDBcNVwwXDFcdTAxNDBcMTZcMFwyXHUwMTQwXDdcMFwyXHUwMTQwXDFcMCIrCi0gICAgIlwyXHUwMTQwXDFcMFwyXHUwMTQwXDdcMFwyXHUwMTQwXDNcMFwyXHUwMTQwXDdcMCIrCi0gICAgIlwyXHUwMTE5XDFcdTAxMWFcMVx1MDE0MVwxXDBcM1x1MDExOVwxXDBcMVx1MDE0MVwxXHUwMTFlIisKLSAgICAiXDNcdTAxMTlcMlx1MDE0MVw0XHUwMTE5XDFcMFw0NVx1MDExOVwxXDBcMVx1MDE0MlwxXHUwMTE5IisKLSAgICAiXDFcdTAxMWFcMVx1MDE0MVwyXHUwMTE5XDFcdTAxNDJcMlx1MDExOVwxXHUwMTQxXDFcdTAxNDNcM1x1MDExOSIrCi0gICAgIlwyXHUwMTQxXDE2XHUwMTE5XDFcdTAxNDJcMlx1MDExOVwxXHUwMTQyXDJcdTAxMTlcMVx1MDE0MlwxMFx1MDExOSIrCi0gICAgIlwxXHUwMTQyXDRcdTAxMTlcMVx1MDE0Mlw3XHUwMTE5XDFcMFwyXHUwMTFjXDFcdTAxNDRcMVwwIisKLSAgICAiXDFcdTAxNDFcMTFcdTAxMWNcMlwwXDUyXHUwMTFjXDFcMFwyXHUwMTFkXDFcdTAxNDVcMVwwIisKLSAgICAiXDRcdTAxMWRcMVx1MDE0MVw1XHUwMTFkXDJcMFw1Mlx1MDExZFwyM1wwXDFcdTAxNDZcNTBcMCIrCi0gICAgIlwxXHUwMTQ3XDFcMjVcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXHUwMTQ3XDFcMjUiKwotICAgICJcMVwwXDFcMjVcNFwwXDJcMjVcMVwwXDNcMjVcMVwwXDFcMjUiKwotICAgICJcMTBcMFwxXHUwMTQ3XDJcMjVcMVx1MDE0N1wyXDI1XDFcdTAxNDdcMlwyNVwxXDAiKwotICAgICJcNFwyNVwxXDBcMVx1MDE0N1wxXDI1XDFcMFwxXDI1XDFcMFwxXHUwMTQ3IisKLSAgICAiXDJcMjVcNlwwXDFcdTAxNDhcMVwxMzRcMVwxMzVcMVwxMzRcMVwwXDFcMTM0IisKLSAgICAiXDFcdTAxNDhcMVwxMzRcMVwwXDFcMTM0XDRcMFwyXDEzNFwxXDBcM1wxMzQiKwotICAgICJcMVwwXDFcMTM0XDEwXDBcMVx1MDE0OFwyXDEzNFwxXHUwMTQ4XDJcMTM0XDFcdTAxNDgiKwotICAgICJcMlwxMzRcMVwwXDRcMTM0XDFcMFwxXHUwMTQ4XDFcMTM0XDFcMFwxXDEzNCIrCi0gICAgIlwxXDBcMVx1MDE0OFwyXDEzNFw2XDBcMVx1MDE0OVwxXDEzNlwxXDEzN1wxXDEzNiIrCi0gICAgIlwxXDBcMVwxMzZcMVx1MDE0OVwxXDEzNlwxXDBcMVwxMzZcNFwwXDJcMTM2IisKLSAgICAiXDFcMFwzXDEzNlwxXDBcMVwxMzZcMTBcMFwxXHUwMTQ5XDJcMTM2XDFcdTAxNDkiKwotICAgICJcMlwxMzZcMVx1MDE0OVwyXDEzNlwxXDBcNFwxMzZcMVwwXDFcdTAxNDlcMVwxMzYiKwotICAgICJcMVwwXDFcMTM2XDFcMFwxXHUwMTQ5XDJcMTM2XDUyXDBcMlx1MDE0YVw3M1wwIisKLSAgICAiXDFcdTAxNGJcMTA2XDBcMlx1MDE0Y1w3XDBcMVx1MDE0ZFwxXDMzM1wxXDMzNFwxXDMzMyIrCi0gICAgIlwxXDBcMVwzMzNcMVx1MDE0ZFwxXDMzM1wxXDBcMVwzMzNcMVwzNzZcM1wwIisKLSAgICAiXDJcMzMzXDFcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMFwxXHUwMTRkXDJcMzMzIisKLSAgICAiXDFcdTAxNGRcMlwzMzNcMVx1MDE0ZFwyXDMzM1wxXDBcNFwzMzNcMVwwXDFcdTAxNGQiKwotICAgICJcMVwzMzNcMVwwXDFcMzMzXDFcMFwxXHUwMTRkXDJcMzMzXDZcMFwxXHUwMTRlIisKLSAgICAiXDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTRlXDFcMTQ3XDFcMCIrCi0gICAgIlwxXDE0N1w0XDBcMlwxNDdcMVwwXDNcMTQ3XDFcMjUyXDFcMTQ3XDEwXDAiKwotICAgICJcMVx1MDE0ZVwyXDE0N1wxXHUwMTRlXDJcMTQ3XDFcdTAxNGVcMlwxNDdcMVwwXDRcMTQ3IisKLSAgICAiXDFcMFwxXHUwMTRlXDFcMTQ3XDFcMFwxXDE0N1wxXDBcMVx1MDE0ZVwyXDE0NyIrCi0gICAgIlw2XDBcMVx1MDE0ZlwxXDE1MlwxXDE1M1wxXDE1MlwxXDE1NFwxXDE1MlwxXHUwMTRmIisKLSAgICAiXDI3XDE1MlwxXHUwMTRmXDJcMTUyXDFcdTAxNGZcMlwxNTJcMVx1MDE0ZlwxMFwxNTJcMVx1MDE0ZiIrCi0gICAgIlw0XDE1MlwxXHUwMTRmXDdcMTUyXDFcMFwxXHUwMTUwXDFcMTU1XDFcMTU2XDNcMTU1IisKLSAgICAiXDFcdTAxNTBcMVwxNTVcMVwxNTRcMjVcMTU1XDFcdTAxNTBcMlwxNTVcMVx1MDE1MFwyXDE1NSIrCi0gICAgIlwxXHUwMTUwXDEwXDE1NVwxXHUwMTUwXDRcMTU1XDFcdTAxNTBcN1wxNTVcMVwwXDFcdTAxNTEiKwotICAgICJcMVwxNTdcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDE1MVwyN1wxNTdcMVx1MDE1MSIrCi0gICAgIlwyXDE1N1wxXHUwMTUxXDJcMTU3XDFcdTAxNTFcMTBcMTU3XDFcdTAxNTFcNFwxNTdcMVx1MDE1MSIrCi0gICAgIlw3XDE1N1wxXDBcMVx1MDE1MlwxXDE2MlwxXDE2M1wzXDE2MlwxXHUwMTUyXDFcMTYyIisKLSAgICAiXDFcMTYxXDI1XDE2MlwxXHUwMTUyXDJcMTYyXDFcdTAxNTJcMlwxNjJcMVx1MDE1MlwxMFwxNjIiKwotICAgICJcMVx1MDE1Mlw0XDE2MlwxXHUwMTUyXDdcMTYyXDRcMFwxXHUwMTJkXDFcMFwxXHUwMTJkIisKLSAgICAiXDNcMFwxXHUwMTJkXDFcdTAxMDlcM1wwXDJcdTAxMmRcNTNcMFwxXHUwMTUzXDFcdTAxMDUiKwotICAgICJcMVx1MDEwNlwxXHUwMTA1XDFcMFwxXHUwMTA1XDFcdTAxNTNcMVx1MDEwNVwxXDBcMVx1MDEwNSIrCi0gICAgIlwxXHUwMTA5XDExXHUwMTA1XDFcMFwxMVx1MDEwNVwxXHUwMTUzXDJcdTAxMDVcMVx1MDE1M1wyXHUwMTA1IisKLSAgICAiXDFcdTAxNTNcMTBcdTAxMDVcMVx1MDE1M1w0XHUwMTA1XDFcdTAxNTNcN1x1MDEwNVwxXDBcMVx1MDE1NCIrCi0gICAgIlwxXHUwMTA3XDFcdTAxMzBcMVx1MDEwN1wxXHUwMTU1XDFcdTAxMDdcMVx1MDE1NFwxMFx1MDEwN1wxXHUwMTU2IisKLSAgICAiXDE2XHUwMTA3XDFcdTAxNTRcMlx1MDEwN1wxXHUwMTU0XDJcdTAxMDdcMVx1MDE1NFwxMFx1MDEwN1wxXHUwMTU0IisKLSAgICAiXDRcdTAxMDdcMVx1MDE1NFw3XHUwMTA3XDFcMFwxXHUwMTU3XDFcdTAxMDhcMVx1MDEzMVwzXHUwMTA4IisKLSAgICAiXDFcdTAxNTdcMVx1MDEwOFwxXHUwMTU4XDZcdTAxMDhcMVx1MDE1OVwxNlx1MDEwOFwxXHUwMTU3XDJcdTAxMDgiKwotICAgICJcMVx1MDE1N1wyXHUwMTA4XDFcdTAxNTdcMTBcdTAxMDhcMVx1MDE1N1w0XHUwMTA4XDFcdTAxNTdcN1x1MDEwOCIrCi0gICAgIlwxXDBcMVx1MDE1YVwxXDUxXDFcMTY1XDFcNTFcMVwwXDFcNTFcMVx1MDE1YSIrCi0gICAgIlwxXDUxXDFcMFwxXDUxXDRcMFwyXDUxXDFcMFwzXDUxXDFcMCIrCi0gICAgIlwxXDUxXDEwXDBcMVx1MDE1YVwyXDUxXDFcdTAxNWFcMlw1MVwxXHUwMTVhXDJcNTEiKwotICAgICJcMVwwXDRcNTFcMVwwXDFcdTAxNWFcMVw1MVwxXDBcMVw1MVwxXDAiKwotICAgICJcMVx1MDE1YVwyXDUxXDZcMFwxXHUwMTViXDFcNTVcMVwxNjdcMVw1NVwxXDAiKwotICAgICJcMVw1NVwxXHUwMTViXDFcNTVcMVwwXDFcNTVcNFwwXDJcNTVcMVwwIisKLSAgICAiXDNcNTVcMVwwXDFcNTVcMTBcMFwxXHUwMTViXDJcNTVcMVx1MDE1YlwyXDU1IisKLSAgICAiXDFcdTAxNWJcMlw1NVwxXDBcNFw1NVwxXDBcMVx1MDE1YlwxXDU1XDFcMCIrCi0gICAgIlwxXDU1XDFcMFwxXHUwMTViXDJcNTVcNlwwXDFcdTAxNWNcMVw2MlwxXDE3MSIrCi0gICAgIlwxXDYyXDFcMFwxXDYyXDFcdTAxNWNcMVw2MlwxXDBcMVw2Mlw0XDAiKwotICAgICJcMlw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxMFwwXDFcdTAxNWNcMlw2MiIrCi0gICAgIlwxXHUwMTVjXDJcNjJcMVx1MDE1Y1wyXDYyXDFcMFw0XDYyXDFcMFwxXHUwMTVjIisKLSAgICAiXDFcNjJcMVwwXDFcNjJcMVwwXDFcdTAxNWNcMlw2Mlw2XDBcMVx1MDE1ZCIrCi0gICAgIlwxXDcyXDFcMTc2XDFcNzJcMVwwXDFcNzJcMVx1MDE1ZFwxXDcyXDFcMCIrCi0gICAgIlwxXDcyXDRcMFwyXDcyXDFcMFwzXDcyXDFcMFwxXDcyXDEwXDAiKwotICAgICJcMVx1MDE1ZFwyXDcyXDFcdTAxNWRcMlw3MlwxXHUwMTVkXDJcNzJcMVwwXDRcNzIiKwotICAgICJcMVwwXDFcdTAxNWRcMVw3MlwxXDBcMVw3MlwxXDBcMVx1MDE1ZFwyXDcyIisKLSAgICAiXDZcMFwxXHUwMTVlXDFcMTAwXDFcMjAwXDFcMTAwXDFcMFwxXDEwMFwxXHUwMTVlIisKLSAgICAiXDFcMTAwXDFcMFwxXDEwMFw0XDBcMlwxMDBcMVwwXDNcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwxMFwwXDFcdTAxNWVcMlwxMDBcMVx1MDE1ZVwyXDEwMFwxXHUwMTVlXDJcMTAwIisKLSAgICAiXDFcMFw0XDEwMFwxXDBcMVx1MDE1ZVwxXDEwMFwxXDBcMVwxMDBcMVwwIisKLSAgICAiXDFcdTAxNWVcMlwxMDBcNlwwXDFcdTAxNWZcMVwyMDJcMVwyMDNcMVwyMDJcMVwyMDQiKwotICAgICJcMVwyMDJcMVx1MDE1ZlwyN1wyMDJcMVx1MDE1ZlwyXDIwMlwxXHUwMTVmXDJcMjAyXDFcdTAxNWYiKwotICAgICJcMTBcMjAyXDFcdTAxNWZcNFwyMDJcMVx1MDE1Zlw3XDIwMlwxXDBcMVx1MDE2MFwxXDIwNSIrCi0gICAgIlwxXDIwNlwzXDIwNVwxXHUwMTYwXDFcMjA1XDFcMjA0XDI1XDIwNVwxXHUwMTYwXDJcMjA1IisKLSAgICAiXDFcdTAxNjBcMlwyMDVcMVx1MDE2MFwxMFwyMDVcMVx1MDE2MFw0XDIwNVwxXHUwMTYwXDdcMjA1IisKLSAgICAiXDFcMFwxXHUwMTYxXDFcMTA1XDFcMjA3XDFcMTA1XDFcMFwxXDEwNVwxXHUwMTYxIisKLSAgICAiXDFcMTA1XDFcMFwxXDEwNVw0XDBcMlwxMDVcMVwwXDNcMTA1XDFcMCIrCi0gICAgIlwxXDEwNVwxMFwwXDFcdTAxNjFcMlwxMDVcMVx1MDE2MVwyXDEwNVwxXHUwMTYxXDJcMTA1IisKLSAgICAiXDFcMFw0XDEwNVwxXDBcMVx1MDE2MVwxXDEwNVwxXDBcMVwxMDVcMVwwIisKLSAgICAiXDFcdTAxNjFcMlwxMDVcNlwwXDFcdTAxNjJcMVwyMTFcMVwyMTJcMVwyMTFcMVwwIisKLSAgICAiXDFcMjExXDFcdTAxNjJcMVwyMTFcMVwwXDFcMjExXDRcMFwyXDIxMVwxXDAiKwotICAgICJcM1wyMTFcMVwwXDFcMjExXDEwXDBcMVx1MDE2MlwyXDIxMVwxXHUwMTYyXDJcMjExIisKLSAgICAiXDFcdTAxNjJcMlwyMTFcMVwwXDRcMjExXDFcMFwxXHUwMTYyXDFcMjExXDFcMCIrCi0gICAgIlwxXDIxMVwxXDBcMVx1MDE2MlwyXDIxMVw2XDBcMVx1MDE2M1wxXDExM1wxXDIxNiIrCi0gICAgIlwxXDExM1wxXDBcMVwxMTNcMVx1MDE2M1wxXDExM1wxXDBcMVwxMTNcNFwwIisKLSAgICAiXDJcMTEzXDFcMFwzXDExM1wxXDIxN1wxXDExM1wxMFwwXDFcdTAxNjNcMlwxMTMiKwotICAgICJcMVx1MDE2M1wyXDExM1wxXHUwMTYzXDJcMTEzXDFcMFw0XDExM1wxXDBcMVx1MDE2MyIrCi0gICAgIlwxXDExM1wxXDBcMVwxMTNcMVwwXDFcdTAxNjNcMlwxMTNcNlwwXDFcdTAxNjQiKwotICAgICJcMVwyMjFcMVwyMjJcMVwyMjFcMVwyMjNcMVwyMjFcMVx1MDE2NFwyN1wyMjFcMVx1MDE2NCIrCi0gICAgIlwyXDIyMVwxXHUwMTY0XDJcMjIxXDFcdTAxNjRcMTBcMjIxXDFcdTAxNjRcNFwyMjFcMVx1MDE2NCIrCi0gICAgIlw3XDIyMVwxXDBcMVx1MDE2NVwxXDIyNFwxXDIyNVwzXDIyNFwxXHUwMTY1XDFcMjI0IisKLSAgICAiXDFcMjIzXDI1XDIyNFwxXHUwMTY1XDJcMjI0XDFcdTAxNjVcMlwyMjRcMVx1MDE2NVwxMFwyMjQiKwotICAgICJcMVx1MDE2NVw0XDIyNFwxXHUwMTY1XDdcMjI0XDFcMFwxXHUwMTY2XDFcMjI3XDFcMjMwIisKLSAgICAiXDFcMjI3XDFcMFwxXDIyN1wxXHUwMTY2XDFcMjI3XDFcMFwxXDIyN1w0XDAiKwotICAgICJcMlwyMjdcMVwwXDNcMjI3XDFcMFwxXDIyN1wxMFwwXDFcdTAxNjZcMlwyMjciKwotICAgICJcMVx1MDE2NlwyXDIyN1wxXHUwMTY2XDJcMjI3XDFcMFw0XDIyN1wxXDBcMVx1MDE2NiIrCi0gICAgIlwxXDIyN1wxXDBcMVwyMjdcMVwwXDFcdTAxNjZcMlwyMjdcNlwwXDFcdTAxNjciKwotICAgICJcNVwwXDFcdTAxNjdcMVwzNjJcMTVcMFwyXHUwMTY3XDdcMFwyXHUwMTY3XDFcMCIrCi0gICAgIlwyXHUwMTY3XDFcMFwyXHUwMTY3XDdcMFwyXHUwMTY3XDNcMFwyXHUwMTY3XDdcMCIrCi0gICAgIlwxXHUwMTY4XDVcMFwxXHUwMTY4XDE2XDBcMlx1MDE2OFw3XDBcMlx1MDE2OFwxXDAiKwotICAgICJcMlx1MDE2OFwxXDBcMlx1MDE2OFw3XDBcMlx1MDE2OFwzXDBcMlx1MDE2OFwxMlwwIisKLSAgICAiXDFcdTAxNDFcMVwwXDFcdTAxNDFcM1wwXDFcdTAxNDFcMVx1MDExZVwzXDBcMlx1MDE0MSIrCi0gICAgIlw1M1wwXDFcdTAxNjlcMVx1MDExOVwxXHUwMTFhXDFcdTAxMTlcMVwwXDFcdTAxMTlcMVx1MDE2OSIrCi0gICAgIlwxXHUwMTE5XDFcMFwxXHUwMTE5XDFcdTAxMWVcMTFcdTAxMTlcMVwwXDExXHUwMTE5XDFcdTAxNjkiKwotICAgICJcMlx1MDExOVwxXHUwMTY5XDJcdTAxMTlcMVx1MDE2OVwxMFx1MDExOVwxXHUwMTY5XDRcdTAxMTlcMVx1MDE2OSIrCi0gICAgIlw3XHUwMTE5XDFcMFwxXHUwMTZhXDFcdTAxMWNcMVx1MDE0NFwxXHUwMTFjXDFcdTAxNmJcMVx1MDExYyIrCi0gICAgIlwxXHUwMTZhXDEwXHUwMTFjXDFcdTAxNmNcMTZcdTAxMWNcMVx1MDE2YVwyXHUwMTFjXDFcdTAxNmFcMlx1MDExYyIrCi0gICAgIlwxXHUwMTZhXDEwXHUwMTFjXDFcdTAxNmFcNFx1MDExY1wxXHUwMTZhXDdcdTAxMWNcMVwwXDFcdTAxNmQiKwotICAgICJcMVx1MDExZFwxXHUwMTQ1XDNcdTAxMWRcMVx1MDE2ZFwxXHUwMTFkXDFcdTAxNmVcNlx1MDExZFwxXHUwMTZmIisKLSAgICAiXDE2XHUwMTFkXDFcdTAxNmRcMlx1MDExZFwxXHUwMTZkXDJcdTAxMWRcMVx1MDE2ZFwxMFx1MDExZFwxXHUwMTZkIisKLSAgICAiXDRcdTAxMWRcMVx1MDE2ZFw3XHUwMTFkXDQ3XDBcMVx1MDE3MFwyNFwwXDJcMjVcMVwxMzEiKwotICAgICJcMVwyNVwxXDBcM1wyNVwxXDBcMVwyNVw0XDBcMlwyNVwxXDAiKwotICAgICJcM1wyNVwxXDBcMVwyNVwxMFwwXDExXDI1XDFcMFw0XDI1XDFcMCIrCi0gICAgIlwyXDI1XDFcMFwxXDI1XDFcMFwzXDI1XDZcMFwxXHUwMTcxXDFcMTM0IisKLSAgICAiXDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXHUwMTcxXDFcMTM0XDFcMFwxXDEzNCIrCi0gICAgIlw0XDBcMlwxMzRcMVwwXDNcMTM0XDFcMFwxXDEzNFwxMFwwXDFcdTAxNzEiKwotICAgICJcMlwxMzRcMVx1MDE3MVwyXDEzNFwxXHUwMTcxXDJcMTM0XDFcMFw0XDEzNFwxXDAiKwotICAgICJcMVx1MDE3MVwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxNzFcMlwxMzRcNlwwIisKLSAgICAiXDFcdTAxNzJcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxNzJcMVwxMzYiKwotICAgICJcMVwwXDFcMTM2XDRcMFwyXDEzNlwxXDBcM1wxMzZcMVwwXDFcMTM2IisKLSAgICAiXDEwXDBcMVx1MDE3MlwyXDEzNlwxXHUwMTcyXDJcMTM2XDFcdTAxNzJcMlwxMzZcMVwwIisKLSAgICAiXDRcMTM2XDFcMFwxXHUwMTcyXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVx1MDE3MiIrCi0gICAgIlwyXDEzNlw1NFwwXDFcdTAxNzNcNjVcMFwyXHUwMTc0XDMwXDBcMVx1MDE3NVwxXDMzMyIrCi0gICAgIlwxXDMzNFwxXDMzM1wxXDBcMVwzMzNcMVx1MDE3NVwxXDMzM1wxXDBcMVwzMzMiKwotICAgICJcMVwzNzZcM1wwXDJcMzMzXDFcMFwzXDMzM1wxXDBcMVwzMzNcMTBcMCIrCi0gICAgIlwxXHUwMTc1XDJcMzMzXDFcdTAxNzVcMlwzMzNcMVx1MDE3NVwyXDMzM1wxXDBcNFwzMzMiKwotICAgICJcMVwwXDFcdTAxNzVcMVwzMzNcMVwwXDFcMzMzXDFcMFwxXHUwMTc1XDJcMzMzIisKLSAgICAiXDZcMFwxXHUwMTc2XDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTc2IisKLSAgICAiXDFcMTQ3XDFcMFwxXDE0N1w0XDBcMlwxNDdcMVwwXDNcMTQ3XDFcMjUyIisKLSAgICAiXDFcMTQ3XDEwXDBcMVx1MDE3NlwyXDE0N1wxXHUwMTc2XDJcMTQ3XDFcdTAxNzZcMlwxNDciKwotICAgICJcMVwwXDRcMTQ3XDFcMFwxXHUwMTc2XDFcMTQ3XDFcMFwxXDE0N1wxXDAiKwotICAgICJcMVx1MDE3NlwyXDE0N1w2XDBcMVx1MDE3N1wxXDE1MlwxXDE1M1wxXDE1MlwxXDE1NCIrCi0gICAgIlwxXDE1MlwxXHUwMTc3XDI3XDE1MlwxXHUwMTc3XDJcMTUyXDFcdTAxNzdcMlwxNTJcMVx1MDE3NyIrCi0gICAgIlwxMFwxNTJcMVx1MDE3N1w0XDE1MlwxXHUwMTc3XDdcMTUyXDFcMFwxXHUwMTc4XDFcMTU1IisKLSAgICAiXDFcMTU2XDNcMTU1XDFcdTAxNzhcMVwxNTVcMVwxNTRcMjVcMTU1XDFcdTAxNzhcMlwxNTUiKwotICAgICJcMVx1MDE3OFwyXDE1NVwxXHUwMTc4XDEwXDE1NVwxXHUwMTc4XDRcMTU1XDFcdTAxNzhcN1wxNTUiKwotICAgICJcMVwwXDFcdTAxNzlcMVwxNTdcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDE3OSIrCi0gICAgIlwyN1wxNTdcMVx1MDE3OVwyXDE1N1wxXHUwMTc5XDJcMTU3XDFcdTAxNzlcMTBcMTU3XDFcdTAxNzkiKwotICAgICJcNFwxNTdcMVx1MDE3OVw3XDE1N1wxXDBcMVx1MDE3YVwxXDE2MlwxXDE2M1wzXDE2MiIrCi0gICAgIlwxXHUwMTdhXDFcMTYyXDFcMTYxXDI1XDE2MlwxXHUwMTdhXDJcMTYyXDFcdTAxN2FcMlwxNjIiKwotICAgICJcMVx1MDE3YVwxMFwxNjJcMVx1MDE3YVw0XDE2MlwxXHUwMTdhXDdcMTYyXDFcMFwxXHUwMTdiIisKLSAgICAiXDFcdTAxMDVcMVx1MDEwNlwxXHUwMTA1XDFcMFwxXHUwMTA1XDFcdTAxN2JcMVx1MDEwNVwxXDAiKwotICAgICJcMVx1MDEwNVwxXHUwMTA5XDExXHUwMTA1XDFcMFwxMVx1MDEwNVwxXHUwMTdiXDJcdTAxMDVcMVx1MDE3YiIrCi0gICAgIlwyXHUwMTA1XDFcdTAxN2JcMTBcdTAxMDVcMVx1MDE3Ylw0XHUwMTA1XDFcdTAxN2JcN1x1MDEwNVwxXDAiKwotICAgICJcMVx1MDE3Y1wxXHUwMTA3XDFcdTAxMzBcMVx1MDEwN1wxXHUwMTJkXDFcdTAxMDdcMVx1MDE3Y1wyN1x1MDEwNyIrCi0gICAgIlwxXHUwMTdjXDJcdTAxMDdcMVx1MDE3Y1wyXHUwMTA3XDFcdTAxN2NcMTBcdTAxMDdcMVx1MDE3Y1w0XHUwMTA3IisKLSAgICAiXDFcdTAxN2NcN1x1MDEwN1wxXDBcMlx1MDEwN1wxXHUwMTMwXDJcdTAxMmRcMVx1MDE1NVwzXHUwMTA3IisKLSAgICAiXDFcdTAxNTVcMVx1MDE3ZFwzXHUwMTA3XDJcdTAxMmRcNTJcdTAxMDdcMVwwXDJcdTAxMDdcMVx1MDEzMCIrCi0gICAgIlwxXDBcMVx1MDEyZFwxMlx1MDEwN1wxXDBcNTJcdTAxMDdcMVwwXDFcdTAxN2VcMVx1MDEwOCIrCi0gICAgIlwxXHUwMTMxXDNcdTAxMDhcMVx1MDE3ZVwxXHUwMTA4XDFcdTAxMmRcMjVcdTAxMDhcMVx1MDE3ZVwyXHUwMTA4IisKLSAgICAiXDFcdTAxN2VcMlx1MDEwOFwxXHUwMTdlXDEwXHUwMTA4XDFcdTAxN2VcNFx1MDEwOFwxXHUwMTdlXDdcdTAxMDgiKwotICAgICJcMVwwXDJcdTAxMDhcMVx1MDEzMVwxXHUwMTJkXDFcdTAxMDhcMVx1MDE1OFwyXHUwMTA4XDFcdTAxMmQiKwotICAgICJcMVx1MDE1OFwxXHUwMTdmXDNcdTAxMDhcMlx1MDEyZFw1Mlx1MDEwOFwxXDBcMlx1MDEwOFwxXHUwMTMxIisKLSAgICAiXDFcMFw0XHUwMTA4XDFcdTAxMmRcNlx1MDEwOFwxXDBcNTJcdTAxMDhcMVwwXDJcNTEiKwotICAgICJcMVwxNjVcMVw1MVwxXDBcM1w1MVwxXDBcMVw1MVw0XDBcMlw1MSIrCi0gICAgIlwxXDBcM1w1MVwxXDBcMVw1MVwxMFwwXDExXDUxXDFcMFw0XDUxIisKLSAgICAiXDFcMFwyXDUxXDFcMFwxXDUxXDFcMFwzXDUxXDZcMFwyXDU1IisKLSAgICAiXDFcMTY3XDFcNTVcMVwwXDNcNTVcMVwwXDFcNTVcNFwwXDJcNTUiKwotICAgICJcMVwwXDNcNTVcMVwwXDFcNTVcMTBcMFwxMVw1NVwxXDBcNFw1NSIrCi0gICAgIlwxXDBcMlw1NVwxXDBcMVw1NVwxXDBcM1w1NVw2XDBcMlw2MiIrCi0gICAgIlwxXDE3MVwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDRcMFwyXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDEwXDBcMTFcNjJcMVwwXDRcNjIiKwotICAgICJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjJcNlwwXDJcNzIiKwotICAgICJcMVwxNzZcMVw3MlwxXDBcM1w3MlwxXDBcMVw3Mlw0XDBcMlw3MiIrCi0gICAgIlwxXDBcM1w3MlwxXDBcMVw3MlwxMFwwXDExXDcyXDFcMFw0XDcyIisKLSAgICAiXDFcMFwyXDcyXDFcMFwxXDcyXDFcMFwzXDcyXDZcMFwyXDEwMCIrCi0gICAgIlwxXDIwMFwxXDEwMFwxXDBcM1wxMDBcMVwwXDFcMTAwXDRcMFwyXDEwMCIrCi0gICAgIlwxXDBcM1wxMDBcMVwwXDFcMTAwXDEwXDBcMTFcMTAwXDFcMFw0XDEwMCIrCi0gICAgIlwxXDBcMlwxMDBcMVwwXDFcMTAwXDFcMFwzXDEwMFw2XDBcMVx1MDE4MCIrCi0gICAgIlwxXDIwMlwxXDIwM1wxXDIwMlwxXDIwNFwxXDIwMlwxXHUwMTgwXDI3XDIwMlwxXHUwMTgwIisKLSAgICAiXDJcMjAyXDFcdTAxODBcMlwyMDJcMVx1MDE4MFwxMFwyMDJcMVx1MDE4MFw0XDIwMlwxXHUwMTgwIisKLSAgICAiXDdcMjAyXDFcMFwxXHUwMTgxXDFcMjA1XDFcMjA2XDNcMjA1XDFcdTAxODFcMVwyMDUiKwotICAgICJcMVwyMDRcMjVcMjA1XDFcdTAxODFcMlwyMDVcMVx1MDE4MVwyXDIwNVwxXHUwMTgxXDEwXDIwNSIrCi0gICAgIlwxXHUwMTgxXDRcMjA1XDFcdTAxODFcN1wyMDVcMVwwXDJcMTA1XDFcMjA3XDFcMTA1IisKLSAgICAiXDFcMFwzXDEwNVwxXDBcMVwxMDVcNFwwXDJcMTA1XDFcMFwzXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMTBcMFwxMVwxMDVcMVwwXDRcMTA1XDFcMFwyXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMVwwXDNcMTA1XDZcMFwxXHUwMTgyXDFcMjExXDFcMjEyIisKLSAgICAiXDFcMjExXDFcMFwxXDIxMVwxXHUwMTgyXDFcMjExXDFcMFwxXDIxMVw0XDAiKwotICAgICJcMlwyMTFcMVwwXDNcMjExXDFcMFwxXDIxMVwxMFwwXDFcdTAxODJcMlwyMTEiKwotICAgICJcMVx1MDE4MlwyXDIxMVwxXHUwMTgyXDJcMjExXDFcMFw0XDIxMVwxXDBcMVx1MDE4MiIrCi0gICAgIlwxXDIxMVwxXDBcMVwyMTFcMVwwXDFcdTAxODJcMlwyMTFcNlwwXDJcMTEzIisKLSAgICAiXDFcMjE2XDFcMTEzXDFcMFwzXDExM1wxXDBcMVwxMTNcNFwwXDJcMTEzIisKLSAgICAiXDFcMFwzXDExM1wxXDIxN1wxXDExM1wxMFwwXDExXDExM1wxXDBcNFwxMTMiKwotICAgICJcMVwwXDJcMTEzXDFcMFwxXDExM1wxXDBcM1wxMTNcNlwwXDFcdTAxODMiKwotICAgICJcMVwyMjFcMVwyMjJcMVwyMjFcMVwyMjNcMVwyMjFcMVx1MDE4M1wyN1wyMjFcMVx1MDE4MyIrCi0gICAgIlwyXDIyMVwxXHUwMTgzXDJcMjIxXDFcdTAxODNcMTBcMjIxXDFcdTAxODNcNFwyMjFcMVx1MDE4MyIrCi0gICAgIlw3XDIyMVwxXDBcMVx1MDE4NFwxXDIyNFwxXDIyNVwzXDIyNFwxXHUwMTg0XDFcMjI0IisKLSAgICAiXDFcMjIzXDI1XDIyNFwxXHUwMTg0XDJcMjI0XDFcdTAxODRcMlwyMjRcMVx1MDE4NFwxMFwyMjQiKwotICAgICJcMVx1MDE4NFw0XDIyNFwxXHUwMTg0XDdcMjI0XDFcMFwxXHUwMTg1XDFcMjI3XDFcMjMwIisKLSAgICAiXDFcMjI3XDFcMFwxXDIyN1wxXHUwMTg1XDFcMjI3XDFcMFwxXDIyN1w0XDAiKwotICAgICJcMlwyMjdcMVwwXDNcMjI3XDFcMFwxXDIyN1wxMFwwXDFcdTAxODVcMlwyMjciKwotICAgICJcMVx1MDE4NVwyXDIyN1wxXHUwMTg1XDJcMjI3XDFcMFw0XDIyN1wxXDBcMVx1MDE4NSIrCi0gICAgIlwxXDIyN1wxXDBcMVwyMjdcMVwwXDFcdTAxODVcMlwyMjdcNlwwXDFcdTAxODYiKwotICAgICJcNVwwXDFcdTAxODZcMVwzNjJcMTVcMFwyXHUwMTg2XDdcMFwyXHUwMTg2XDFcMCIrCi0gICAgIlwyXHUwMTg2XDFcMFwyXHUwMTg2XDdcMFwyXHUwMTg2XDNcMFwyXHUwMTg2XDdcMCIrCi0gICAgIlwxXHUwMTg3XDVcMFwxXHUwMTg3XDE2XDBcMlx1MDE4N1w3XDBcMlx1MDE4N1wxXDAiKwotICAgICJcMlx1MDE4N1wxXDBcMlx1MDE4N1w3XDBcMlx1MDE4N1wzXDBcMlx1MDE4N1w3XDAiKwotICAgICJcMVx1MDE4OFwxXHUwMTE5XDFcdTAxMWFcMVx1MDExOVwxXDBcMVx1MDExOVwxXHUwMTg4XDFcdTAxMTkiKwotICAgICJcMVwwXDFcdTAxMTlcMVx1MDExZVwxMVx1MDExOVwxXDBcMTFcdTAxMTlcMVx1MDE4OFwyXHUwMTE5IisKLSAgICAiXDFcdTAxODhcMlx1MDExOVwxXHUwMTg4XDEwXHUwMTE5XDFcdTAxODhcNFx1MDExOVwxXHUwMTg4XDdcdTAxMTkiKwotICAgICJcMVwwXDFcdTAxODlcMVx1MDExY1wxXHUwMTQ0XDFcdTAxMWNcMVx1MDE0MVwxXHUwMTFjXDFcdTAxODkiKwotICAgICJcMjdcdTAxMWNcMVx1MDE4OVwyXHUwMTFjXDFcdTAxODlcMlx1MDExY1wxXHUwMTg5XDEwXHUwMTFjXDFcdTAxODkiKwotICAgICJcNFx1MDExY1wxXHUwMTg5XDdcdTAxMWNcMVwwXDJcdTAxMWNcMVx1MDE0NFwyXHUwMTQxXDFcdTAxNmIiKwotICAgICJcM1x1MDExY1wxXHUwMTZiXDFcdTAxOGFcM1x1MDExY1wyXHUwMTQxXDUyXHUwMTFjXDFcMFwyXHUwMTFjIisKLSAgICAiXDFcdTAxNDRcMVwwXDFcdTAxNDFcMTJcdTAxMWNcMVwwXDUyXHUwMTFjXDFcMFwxXHUwMThiIisKLSAgICAiXDFcdTAxMWRcMVx1MDE0NVwzXHUwMTFkXDFcdTAxOGJcMVx1MDExZFwxXHUwMTQxXDI1XHUwMTFkXDFcdTAxOGIiKwotICAgICJcMlx1MDExZFwxXHUwMThiXDJcdTAxMWRcMVx1MDE4YlwxMFx1MDExZFwxXHUwMThiXDRcdTAxMWRcMVx1MDE4YiIrCi0gICAgIlw3XHUwMTFkXDFcMFwyXHUwMTFkXDFcdTAxNDVcMVx1MDE0MVwxXHUwMTFkXDFcdTAxNmVcMlx1MDExZCIrCi0gICAgIlwxXHUwMTQxXDFcdTAxNmVcMVx1MDE4Y1wzXHUwMTFkXDJcdTAxNDFcNTJcdTAxMWRcMVwwXDJcdTAxMWQiKwotICAgICJcMVx1MDE0NVwxXDBcNFx1MDExZFwxXHUwMTQxXDZcdTAxMWRcMVwwXDUyXHUwMTFkXDQyXDAiKwotICAgICJcMlx1MDE4ZFwzMFwwXDJcMTM0XDFcMTM1XDFcMTM0XDFcMFwzXDEzNFwxXDAiKwotICAgICJcMVwxMzRcNFwwXDJcMTM0XDFcMFwzXDEzNFwxXDBcMVwxMzRcMTBcMCIrCi0gICAgIlwxMVwxMzRcMVwwXDRcMTM0XDFcMFwyXDEzNFwxXDBcMVwxMzRcMVwwIisKLSAgICAiXDNcMTM0XDZcMFwyXDEzNlwxXDEzN1wxXDEzNlwxXDBcM1wxMzZcMVwwIisKLSAgICAiXDFcMTM2XDRcMFwyXDEzNlwxXDBcM1wxMzZcMVwwXDFcMTM2XDEwXDAiKwotICAgICJcMTFcMTM2XDFcMFw0XDEzNlwxXDBcMlwxMzZcMVwwXDFcMTM2XDFcMCIrCi0gICAgIlwzXDEzNlw0NFwwXDJcdTAxOGVcMzNcMFwxXHUwMThmXDFcMzMzXDFcMzM0XDFcMzMzIisKLSAgICAiXDFcMFwxXDMzM1wxXHUwMThmXDFcMzMzXDFcMFwxXDMzM1wxXDM3NlwzXDAiKwotICAgICJcMlwzMzNcMVwwXDNcMzMzXDFcMFwxXDMzM1wxMFwwXDFcdTAxOGZcMlwzMzMiKwotICAgICJcMVx1MDE4ZlwyXDMzM1wxXHUwMThmXDJcMzMzXDFcMFw0XDMzM1wxXDBcMVx1MDE4ZiIrCi0gICAgIlwxXDMzM1wxXDBcMVwzMzNcMVwwXDFcdTAxOGZcMlwzMzNcNlwwXDJcMTQ3IisKLSAgICAiXDFcMTUwXDFcMTQ3XDFcMFwzXDE0N1wxXDBcMVwxNDdcNFwwXDJcMTQ3IisKLSAgICAiXDFcMFwzXDE0N1wxXDI1MlwxXDE0N1wxMFwwXDExXDE0N1wxXDBcNFwxNDciKwotICAgICJcMVwwXDJcMTQ3XDFcMFwxXDE0N1wxXDBcM1wxNDdcNlwwXDJcMTUyIisKLSAgICAiXDFcMTUzXDFcMTUyXDFcMTU0XDY1XDE1MlwxXDBcMlwxNTVcMVwxNTZcNVwxNTUiKwotICAgICJcMVwxNTRcNjFcMTU1XDFcMFwyXDE1N1wxXDE2MFwxXDE1N1wxXDE2MVw2NVwxNTciKwotICAgICJcMVwwXDJcMTYyXDFcMTYzXDVcMTYyXDFcMTYxXDYxXDE2MlwxXDBcMVx1MDE5MCIrCi0gICAgIlwxXHUwMTA1XDFcdTAxMDZcMVx1MDEwNVwxXDBcMVx1MDEwNVwxXHUwMTkwXDFcdTAxMDVcMVwwIisKLSAgICAiXDFcdTAxMDVcMVx1MDEwOVwxMVx1MDEwNVwxXDBcMTFcdTAxMDVcMVx1MDE5MFwyXHUwMTA1XDFcdTAxOTAiKwotICAgICJcMlx1MDEwNVwxXHUwMTkwXDEwXHUwMTA1XDFcdTAxOTBcNFx1MDEwNVwxXHUwMTkwXDdcdTAxMDVcMVwwIisKLSAgICAiXDFcdTAxOTFcMVx1MDEwN1wxXHUwMTMwXDFcdTAxMDdcMVx1MDEyZFwxXHUwMTA3XDFcdTAxOTFcMjdcdTAxMDciKwotICAgICJcMVx1MDE5MVwyXHUwMTA3XDFcdTAxOTFcMlx1MDEwN1wxXHUwMTkxXDEwXHUwMTA3XDFcdTAxOTFcNFx1MDEwNyIrCi0gICAgIlwxXHUwMTkxXDdcdTAxMDdcMVwwXDFcdTAxOTJcMVx1MDEwOFwxXHUwMTMxXDNcdTAxMDhcMVx1MDE5MiIrCi0gICAgIlwxXHUwMTA4XDFcdTAxMmRcMjVcdTAxMDhcMVx1MDE5MlwyXHUwMTA4XDFcdTAxOTJcMlx1MDEwOFwxXHUwMTkyIisKLSAgICAiXDEwXHUwMTA4XDFcdTAxOTJcNFx1MDEwOFwxXHUwMTkyXDdcdTAxMDhcMVwwXDJcMjAyXDFcMjAzIisKLSAgICAiXDFcMjAyXDFcMjA0XDY1XDIwMlwxXDBcMlwyMDVcMVwyMDZcNVwyMDVcMVwyMDQiKwotICAgICJcNjFcMjA1XDFcMFwyXDIxMVwxXDIxMlwxXDIxMVwxXDBcM1wyMTFcMVwwIisKLSAgICAiXDFcMjExXDRcMFwyXDIxMVwxXDBcM1wyMTFcMVwwXDFcMjExXDEwXDAiKwotICAgICJcMTFcMjExXDFcMFw0XDIxMVwxXDBcMlwyMTFcMVwwXDFcMjExXDFcMCIrCi0gICAgIlwzXDIxMVw2XDBcMlwyMjFcMVwyMjJcMVwyMjFcMVwyMjNcNjVcMjIxXDFcMCIrCi0gICAgIlwyXDIyNFwxXDIyNVw1XDIyNFwxXDIyM1w2MVwyMjRcMVwwXDJcMjI3XDFcMjMwIisKLSAgICAiXDFcMjI3XDFcMFwzXDIyN1wxXDBcMVwyMjdcNFwwXDJcMjI3XDFcMCIrCi0gICAgIlwzXDIyN1wxXDBcMVwyMjdcMTBcMFwxMVwyMjdcMVwwXDRcMjI3XDFcMCIrCi0gICAgIlwyXDIyN1wxXDBcMVwyMjdcMVwwXDNcMjI3XDE1XDBcMVwzNjJcNjNcMCIrCi0gICAgIlwxXHUwMTkzXDVcMFwxXHUwMTkzXDE2XDBcMlx1MDE5M1w3XDBcMlx1MDE5M1wxXDAiKwotICAgICJcMlx1MDE5M1wxXDBcMlx1MDE5M1w3XDBcMlx1MDE5M1wzXDBcMlx1MDE5M1w3XDAiKwotICAgICJcMVx1MDE5NFwxXHUwMTE5XDFcdTAxMWFcMVx1MDExOVwxXDBcMVx1MDExOVwxXHUwMTk0XDFcdTAxMTkiKwotICAgICJcMVwwXDFcdTAxMTlcMVx1MDExZVwxMVx1MDExOVwxXDBcMTFcdTAxMTlcMVx1MDE5NFwyXHUwMTE5IisKLSAgICAiXDFcdTAxOTRcMlx1MDExOVwxXHUwMTk0XDEwXHUwMTE5XDFcdTAxOTRcNFx1MDExOVwxXHUwMTk0XDdcdTAxMTkiKwotICAgICJcMVwwXDFcdTAxOTVcMVx1MDExY1wxXHUwMTQ0XDFcdTAxMWNcMVx1MDE0MVwxXHUwMTFjXDFcdTAxOTUiKwotICAgICJcMjdcdTAxMWNcMVx1MDE5NVwyXHUwMTFjXDFcdTAxOTVcMlx1MDExY1wxXHUwMTk1XDEwXHUwMTFjXDFcdTAxOTUiKwotICAgICJcNFx1MDExY1wxXHUwMTk1XDdcdTAxMWNcMVwwXDFcdTAxOTZcMVx1MDExZFwxXHUwMTQ1XDNcdTAxMWQiKwotICAgICJcMVx1MDE5NlwxXHUwMTFkXDFcdTAxNDFcMjVcdTAxMWRcMVx1MDE5NlwyXHUwMTFkXDFcdTAxOTZcMlx1MDExZCIrCi0gICAgIlwxXHUwMTk2XDEwXHUwMTFkXDFcdTAxOTZcNFx1MDExZFwxXHUwMTk2XDdcdTAxMWRcNjVcMFwxXHUwMTk3IisKLSAgICAiXDUyXDBcMlx1MDE5OFwyNVwwXDFcdTAxOTlcMVwzMzNcMVwzMzRcMVwzMzNcMVwwIisKLSAgICAiXDFcMzMzXDFcdTAxOTlcMVwzMzNcMVwwXDFcMzMzXDFcMzc2XDNcMFwyXDMzMyIrCi0gICAgIlwxXDBcM1wzMzNcMVwwXDFcMzMzXDEwXDBcMVx1MDE5OVwyXDMzM1wxXHUwMTk5IisKLSAgICAiXDJcMzMzXDFcdTAxOTlcMlwzMzNcMVwwXDRcMzMzXDFcMFwxXHUwMTk5XDFcMzMzIisKLSAgICAiXDFcMFwxXDMzM1wxXDBcMVx1MDE5OVwyXDMzM1w2XDBcMVx1MDE5YVwxXHUwMTA1IisKLSAgICAiXDFcdTAxMDZcMVx1MDEwNVwxXDBcMVx1MDEwNVwxXHUwMTlhXDFcdTAxMDVcMVwwXDFcdTAxMDUiKwotICAgICJcMVx1MDEwOVwxMVx1MDEwNVwxXDBcMTFcdTAxMDVcMVx1MDE5YVwyXHUwMTA1XDFcdTAxOWFcMlx1MDEwNSIrCi0gICAgIlwxXHUwMTlhXDEwXHUwMTA1XDFcdTAxOWFcNFx1MDEwNVwxXHUwMTlhXDdcdTAxMDVcMVwwXDFcdTAxOWIiKwotICAgICJcMVx1MDEwN1wxXHUwMTMwXDFcdTAxMDdcMVx1MDEyZFwxXHUwMTA3XDFcdTAxOWJcMjdcdTAxMDdcMVx1MDE5YiIrCi0gICAgIlwyXHUwMTA3XDFcdTAxOWJcMlx1MDEwN1wxXHUwMTliXDEwXHUwMTA3XDFcdTAxOWJcNFx1MDEwN1wxXHUwMTliIisKLSAgICAiXDdcdTAxMDdcMVwwXDFcdTAxOWNcMVx1MDEwOFwxXHUwMTMxXDNcdTAxMDhcMVx1MDE5Y1wxXHUwMTA4IisKLSAgICAiXDFcdTAxMmRcMjVcdTAxMDhcMVx1MDE5Y1wyXHUwMTA4XDFcdTAxOWNcMlx1MDEwOFwxXHUwMTljXDEwXHUwMTA4IisKLSAgICAiXDFcdTAxOWNcNFx1MDEwOFwxXHUwMTljXDdcdTAxMDhcMVwwXDFcdTAxOWRcNVwwXDFcdTAxOWQiKwotICAgICJcMTZcMFwyXHUwMTlkXDdcMFwyXHUwMTlkXDFcMFwyXHUwMTlkXDFcMFwyXHUwMTlkIisKLSAgICAiXDdcMFwyXHUwMTlkXDNcMFwyXHUwMTlkXDdcMFwxXHUwMTllXDFcdTAxMTlcMVx1MDExYSIrCi0gICAgIlwxXHUwMTE5XDFcMFwxXHUwMTE5XDFcdTAxOWVcMVx1MDExOVwxXDBcMVx1MDExOVwxXHUwMTFlIisKLSAgICAiXDExXHUwMTE5XDFcMFwxMVx1MDExOVwxXHUwMTllXDJcdTAxMTlcMVx1MDE5ZVwyXHUwMTE5XDFcdTAxOWUiKwotICAgICJcMTBcdTAxMTlcMVx1MDE5ZVw0XHUwMTE5XDFcdTAxOWVcN1x1MDExOVwxXDBcMVx1MDE5ZlwxXHUwMTFjIisKLSAgICAiXDFcdTAxNDRcMVx1MDExY1wxXHUwMTQxXDFcdTAxMWNcMVx1MDE5ZlwyN1x1MDExY1wxXHUwMTlmXDJcdTAxMWMiKwotICAgICJcMVx1MDE5ZlwyXHUwMTFjXDFcdTAxOWZcMTBcdTAxMWNcMVx1MDE5Zlw0XHUwMTFjXDFcdTAxOWZcN1x1MDExYyIrCi0gICAgIlwxXDBcMVx1MDFhMFwxXHUwMTFkXDFcdTAxNDVcM1x1MDExZFwxXHUwMWEwXDFcdTAxMWRcMVx1MDE0MSIrCi0gICAgIlwyNVx1MDExZFwxXHUwMWEwXDJcdTAxMWRcMVx1MDFhMFwyXHUwMTFkXDFcdTAxYTBcMTBcdTAxMWRcMVx1MDFhMCIrCi0gICAgIlw0XHUwMTFkXDFcdTAxYTBcN1x1MDExZFw0N1wwXDFcdTAxYTFcMjRcMFwyXDMzM1wxXDMzNCIrCi0gICAgIlwxXDMzM1wxXDBcM1wzMzNcMVwwXDFcMzMzXDFcMzc2XDNcMFwyXDMzMyIrCi0gICAgIlwxXDBcM1wzMzNcMVwwXDFcMzMzXDEwXDBcMTFcMzMzXDFcMFw0XDMzMyIrCi0gICAgIlwxXDBcMlwzMzNcMVwwXDFcMzMzXDFcMFwzXDMzM1w2XDBcMVx1MDFhMiIrCi0gICAgIlwxXHUwMTA1XDFcdTAxMDZcMVx1MDEwNVwxXDBcMVx1MDEwNVwxXHUwMWEyXDFcdTAxMDVcMVwwIisKLSAgICAiXDFcdTAxMDVcMVx1MDEwOVwxMVx1MDEwNVwxXDBcMTFcdTAxMDVcMVx1MDFhMlwyXHUwMTA1XDFcdTAxYTIiKwotICAgICJcMlx1MDEwNVwxXHUwMWEyXDEwXHUwMTA1XDFcdTAxYTJcNFx1MDEwNVwxXHUwMWEyXDdcdTAxMDVcMVwwIisKLSAgICAiXDFcdTAxYTNcMVx1MDEwN1wxXHUwMTMwXDFcdTAxMDdcMVx1MDEyZFwxXHUwMTA3XDFcdTAxYTNcMjdcdTAxMDciKwotICAgICJcMVx1MDFhM1wyXHUwMTA3XDFcdTAxYTNcMlx1MDEwN1wxXHUwMWEzXDEwXHUwMTA3XDFcdTAxYTNcNFx1MDEwNyIrCi0gICAgIlwxXHUwMWEzXDdcdTAxMDdcMVwwXDFcdTAxYTRcMVx1MDEwOFwxXHUwMTMxXDNcdTAxMDhcMVx1MDFhNCIrCi0gICAgIlwxXHUwMTA4XDFcdTAxMmRcMjVcdTAxMDhcMVx1MDFhNFwyXHUwMTA4XDFcdTAxYTRcMlx1MDEwOFwxXHUwMWE0IisKLSAgICAiXDEwXHUwMTA4XDFcdTAxYTRcNFx1MDEwOFwxXHUwMWE0XDdcdTAxMDhcMVwwXDFcdTAxYTVcMVx1MDExOSIrCi0gICAgIlwxXHUwMTFhXDFcdTAxMTlcMVwwXDFcdTAxMTlcMVx1MDFhNVwxXHUwMTE5XDFcMFwxXHUwMTE5IisKLSAgICAiXDFcdTAxMWVcMTFcdTAxMTlcMVwwXDExXHUwMTE5XDFcdTAxYTVcMlx1MDExOVwxXHUwMWE1XDJcdTAxMTkiKwotICAgICJcMVx1MDFhNVwxMFx1MDExOVwxXHUwMWE1XDRcdTAxMTlcMVx1MDFhNVw3XHUwMTE5XDFcMFwxXHUwMWE2IisKLSAgICAiXDFcdTAxMWNcMVx1MDE0NFwxXHUwMTFjXDFcdTAxNDFcMVx1MDExY1wxXHUwMWE2XDI3XHUwMTFjXDFcdTAxYTYiKwotICAgICJcMlx1MDExY1wxXHUwMWE2XDJcdTAxMWNcMVx1MDFhNlwxMFx1MDExY1wxXHUwMWE2XDRcdTAxMWNcMVx1MDFhNiIrCi0gICAgIlw3XHUwMTFjXDFcMFwxXHUwMWE3XDFcdTAxMWRcMVx1MDE0NVwzXHUwMTFkXDFcdTAxYTdcMVx1MDExZCIrCi0gICAgIlwxXHUwMTQxXDI1XHUwMTFkXDFcdTAxYTdcMlx1MDExZFwxXHUwMWE3XDJcdTAxMWRcMVx1MDFhN1wxMFx1MDExZCIrCi0gICAgIlwxXHUwMWE3XDRcdTAxMWRcMVx1MDFhN1w3XHUwMTFkXDFcMFwyXHUwMTA1XDFcdTAxMDZcMVx1MDEwNSIrCi0gICAgIlwxXDBcM1x1MDEwNVwxXDBcMVx1MDEwNVwxXHUwMTA5XDExXHUwMTA1XDFcMFw0NVx1MDEwNSIrCi0gICAgIlwxXDBcMVx1MDFhOFwxXHUwMTA3XDFcdTAxMzBcMVx1MDEwN1wxXHUwMTJkXDFcdTAxMDdcMVx1MDFhOCIrCi0gICAgIlwyN1x1MDEwN1wxXHUwMWE4XDJcdTAxMDdcMVx1MDFhOFwyXHUwMTA3XDFcdTAxYThcMTBcdTAxMDdcMVx1MDFhOCIrCi0gICAgIlw0XHUwMTA3XDFcdTAxYThcN1x1MDEwN1wxXDBcMVx1MDFhOVwxXHUwMTA4XDFcdTAxMzFcM1x1MDEwOCIrCi0gICAgIlwxXHUwMWE5XDFcdTAxMDhcMVx1MDEyZFwyNVx1MDEwOFwxXHUwMWE5XDJcdTAxMDhcMVx1MDFhOVwyXHUwMTA4IisKLSAgICAiXDFcdTAxYTlcMTBcdTAxMDhcMVx1MDFhOVw0XHUwMTA4XDFcdTAxYTlcN1x1MDEwOFwxXDBcMlx1MDExOSIrCi0gICAgIlwxXHUwMTFhXDFcdTAxMTlcMVwwXDNcdTAxMTlcMVwwXDFcdTAxMTlcMVx1MDExZVwxMVx1MDExOSIrCi0gICAgIlwxXDBcNDVcdTAxMTlcMVwwXDFcdTAxYWFcMVx1MDExY1wxXHUwMTQ0XDFcdTAxMWNcMVx1MDE0MSIrCi0gICAgIlwxXHUwMTFjXDFcdTAxYWFcMjdcdTAxMWNcMVx1MDFhYVwyXHUwMTFjXDFcdTAxYWFcMlx1MDExY1wxXHUwMWFhIisKLSAgICAiXDEwXHUwMTFjXDFcdTAxYWFcNFx1MDExY1wxXHUwMWFhXDdcdTAxMWNcMVwwXDFcdTAxYWJcMVx1MDExZCIrCi0gICAgIlwxXHUwMTQ1XDNcdTAxMWRcMVx1MDFhYlwxXHUwMTFkXDFcdTAxNDFcMjVcdTAxMWRcMVx1MDFhYlwyXHUwMTFkIisKLSAgICAiXDFcdTAxYWJcMlx1MDExZFwxXHUwMWFiXDEwXHUwMTFkXDFcdTAxYWJcNFx1MDExZFwxXHUwMWFiXDdcdTAxMWQiKwotICAgICJcMVwwXDJcdTAxMDdcMVx1MDEzMFwxXHUwMTA3XDFcdTAxMmRcNjVcdTAxMDdcMVwwXDJcdTAxMDgiKwotICAgICJcMVx1MDEzMVw1XHUwMTA4XDFcdTAxMmRcNjFcdTAxMDhcMVwwXDJcdTAxMWNcMVx1MDE0NFwxXHUwMTFjIisKLSAgICAiXDFcdTAxNDFcNjVcdTAxMWNcMVwwXDJcdTAxMWRcMVx1MDE0NVw1XHUwMTFkXDFcdTAxNDFcNjFcdTAxMWQiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLS8vICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0vLyAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKgotICAgKiBZWV9BVFRSSUJVVEVbYVN0YXRlXSBjb250YWlucyB0aGUgYXR0cmlidXRlcyBvZiBzdGF0ZSA8Y29kZT5hU3RhdGU8L2NvZGU+Ci0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIFlZX0FUVFJJQlVURVtdID0gewotICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDksICAxLCAgMSwgCi0gICAgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksIAotICAgICA5LCAgMSwgIDEsICAxLCAgOSwgIDEsICAzLCAgOSwgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAzLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsIDEzLCAgNywgIDAsICAxLCAgMCwgCi0gICAgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksICAwLCAgOSwgIDEsIAotICAgICAwLCAgMCwgIDksICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsIDEzLCAgNywgIDEsICA5LCAKLSAgICAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsIAotICAgICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgOSwgIDAsICAxLCAKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgIDEsIAotICAgICAxLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAKLSAgICAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICA5LCAgMCwgIDAsICAxLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAKLSAgICAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDEsICAxLCAgOSwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgCi0gICAgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLS8vICBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0vLyAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0OwotLy8JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkVGV4dExlbmd0aDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7Ci0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU1RleHRSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX1NNQUxMID0gMjU2OwotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsKLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTdGF0ZShpbnQgc3RhdGUpIHsKLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgewotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQ7Ci0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOwotCQlib29sZWFuIHNwYWNlRm9sbG93czsKLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsKLQkJaW50IHN0YXJ0OwotCQlpbnQgdGV4dExlbmd0aDsKLQkJaW50IGxlbmd0aDsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCS8vIHVuZGVmIC0+IGNvbmNhdGVuYXRlIHVuZGVmJ3MKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsKLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVmFsdWVUeXBlKGNvbnRleHQpKSB7IC8vIGRlY2xhcmF0aW9uIHZhbHVlIGNhbiBjb250YWluIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0gZWxzZSBpZiAoY2FuQ29udGFpblNwYWNlKGNvbnRleHQpKSB7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsKLQkJCQl9Ci0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsKLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYKLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047Ci0JCQl9Ci0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotICAJCXJldHVybiB0b2tlbnM7Ci0gIAl9Ci0gIAkKLSAgCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7Ci0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0gIAkJCXJldHVybiBmYWxzZTsKLSAgCQl9IGVsc2UgewotICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4geXljaGFyOwotCX0KLQkKLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vWVlJTklUSUFMOwotCi0JCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOwotCQl9Ci0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQotCQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkJZnJvbSBpbnB1dCAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5bGluZSA9IDA7Ci0KLQkJLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0JCS8qKgotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0JCSAqIG1hdGNoZWQgdGV4dAotCQkgKi8KLS8vCQl5eWNvbHVtbiA9IDA7IAotCi0JCS8qKiAKLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0JCSAqLwotLy8JCXl5X2F0Qk9MID0gZmFsc2U7Ci0JCQotCQkvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0JCS8qIHVzZXIgdmFyaWFibGVzICovCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsKLQl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBDU1NUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIENTU1Rva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFsyMDcwOV07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTMzOTIpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxNzApIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLSAgICB5eV9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotLy8gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLS8vICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0vLyAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLS8vCi0vLyAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICB5eV9wdXNoYmFja1BvcyA9IC0xOwotICAgIGJvb2xlYW4geXlfd2FzX3B1c2hiYWNrOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLSAgICAgIHl5X3dhc19wdXNoYmFjayA9IGZhbHNlOwotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc1sgeXlfcm93TWFwW3l5X3N0YXRlXSArIHl5Y21hcFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0gWVlfQVRUUklCVVRFW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMikgPiAwICkKLSAgICAgICAgICAgIHl5X3B1c2hiYWNrUG9zID0geXlfY3VycmVudFBvczsKLQotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA+IDAgKSB7Ci0gICAgICAgICAgICB5eV93YXNfcHVzaGJhY2sgPSAoeXlfYXR0cmlidXRlcyAmIDQpID4gMDsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfd2FzX3B1c2hiYWNrKQotICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvczsKLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSA0MTY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVDsgIH0KLSAgICAgICAgY2FzZSA0Mjg6IGJyZWFrOwotICAgICAgICBjYXNlIDQwNzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7ICB9Ci0gICAgICAgIGNhc2UgNDI5OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfQ0hBUlNFVF9OQU1FKTsgcmV0dXJuIENTU19DSEFSU0VUOyAgfQotICAgICAgICBjYXNlIDQzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMwOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0lNUE9SVF9VUkkpOyByZXR1cm4gQ1NTX0lNUE9SVDsgIH0KLSAgICAgICAgY2FzZSA0MzE6IGJyZWFrOwotICAgICAgICBjYXNlIDI5MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOyAgfQotICAgICAgICBjYXNlIDQzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg1OiAKLSAgICAgICAgY2FzZSAzMjI6IAotICAgICAgICBjYXNlIDM5MzogCi0gICAgICAgIGNhc2UgMzk1OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VUkk7ICB9Ci0gICAgICAgIGNhc2UgNDMzOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjQ6IAotICAgICAgICBjYXNlIDMwMjogCi0gICAgICAgIGNhc2UgMzgwOiAKLSAgICAgICAgY2FzZSAzODI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyAgfQotICAgICAgICBjYXNlIDQzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjUwOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1BBR0VfUFNFVURPX1BBR0UpOyByZXR1cm4gQ1NTX1BBR0U7ICB9Ci0gICAgICAgIGNhc2UgNDM1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgIHJldHVybiBDU1NfQ09NTUVOVDsgIH0KLSAgICAgICAgY2FzZSA0MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgICAgeyAgcmV0dXJuIENTU19DRE87ICB9Ci0gICAgICAgIGNhc2UgNDM3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDU6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAyNzk6IAotICAgICAgICBjYXNlIDMxODogCi0gICAgICAgIGNhc2UgMzE5OiAKLSAgICAgICAgY2FzZSAzNTg6IAotICAgICAgICBjYXNlIDM1OTogCi0gICAgICAgIGNhc2UgMzg5OiAKLSAgICAgICAgY2FzZSAzOTA6IAotICAgICAgICBjYXNlIDQwMjogCi0gICAgICAgIGNhc2UgNDEyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFOyAgfQotICAgICAgICBjYXNlIDQzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU5OiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX0NEQzsgIH0KLSAgICAgICAgY2FzZSA0Mzk6IGJyZWFrOwotICAgICAgICBjYXNlIDE1NjogCi0gICAgICAgICAgeyAgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TOyAgfQotICAgICAgICBjYXNlIDQ0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICBjYXNlIDIzOTogCi0gICAgICAgIGNhc2UgMjc3OiAKLSAgICAgICAgY2FzZSAzMTc6IAotICAgICAgICBjYXNlIDM1NzogCi0gICAgICAgIGNhc2UgMzg4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIOyAgfQotICAgICAgICBjYXNlIDQ0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ2OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOyAgfQotICAgICAgICBjYXNlIDQ0MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgIGNhc2UgMTg3OiAKLSAgICAgICAgY2FzZSAyMzA6IAotICAgICAgICBjYXNlIDI2ODogCi0gICAgICAgIGNhc2UgMzA4OiAKLSAgICAgICAgY2FzZSAzNDg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRTsgIH0KLSAgICAgICAgY2FzZSA0NDM6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9TRVBBUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDQ0OiBicmVhazsKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgIGNhc2UgMTIzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9DT01CSU5BVE9SOyAgfQotICAgICAgICBjYXNlIDQ0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgIH0KLSAgICAgICAgY2FzZSA0NDY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgY2FzZSAxMjE6IAotICAgICAgICBjYXNlIDE4NjogCi0gICAgICAgIGNhc2UgMjI5OiAKLSAgICAgICAgY2FzZSAyNjc6IAotICAgICAgICBjYXNlIDMwNzogCi0gICAgICAgIGNhc2UgMzQ3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1BBR0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19QQUdFX1NFTEVDVE9SOyAgfQotICAgICAgICBjYXNlIDQ0NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19MQlJBQ0U7ICB9Ci0gICAgICAgIGNhc2UgNDQ4OiBicmVhazsKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0NDk6IGJyZWFrOwotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMjI4OiAKLSAgICAgICAgY2FzZSAyNjY6IAotICAgICAgICBjYXNlIDMwNjogCi0gICAgICAgIGNhc2UgMzQ2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyAgfQotICAgICAgICBjYXNlIDQ1MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSAxNTg6IAotICAgICAgICBjYXNlIDIwODogCi0gICAgICAgIGNhc2UgMjQ0OiAKLSAgICAgICAgY2FzZSAyODc6IAotICAgICAgICBjYXNlIDMyNjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfRUxFTUVOVF9OQU1FOyAgfQotICAgICAgICBjYXNlIDQ1MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgMTI0OiAKLSAgICAgICAgY2FzZSAxNTc6IAotICAgICAgICAgIHsgIHJldHVybiBDU1NfUzsgIH0KLSAgICAgICAgY2FzZSA0NTM6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfUkJSQUNFOyAgfQotICAgICAgICBjYXNlIDQ1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTDsgIH0KLSAgICAgICAgY2FzZSA0NTU6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQ7ICB9Ci0gICAgICAgIGNhc2UgNDU2OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgIH0KLSAgICAgICAgY2FzZSA0NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgIGNhc2UgMjI3OiAKLSAgICAgICAgY2FzZSAyNjU6IAotICAgICAgICBjYXNlIDMwNTogCi0gICAgICAgIGNhc2UgMzQ1OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0lNUE9SVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX01FRElVTTsgIH0KLSAgICAgICAgY2FzZSA0NTg6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX09QRVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQ7ICB9Ci0gICAgICAgIGNhc2UgNDYwOiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDE4ODogCi0gICAgICAgIGNhc2UgMTkwOiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgY2FzZSAzMDk6IAotICAgICAgICBjYXNlIDM0OTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUU7ICB9Ci0gICAgICAgIGNhc2UgNDYxOiBicmVhazsKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgMTM1OiAKLSAgICAgICAgY2FzZSAxOTU6IAotICAgICAgICBjYXNlIDIzNDogCi0gICAgICAgIGNhc2UgMjcyOiAKLSAgICAgICAgY2FzZSAzMTI6IAotICAgICAgICBjYXNlIDM1MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZOyAgfQotICAgICAgICBjYXNlIDQ2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUjsgIH0KLSAgICAgICAgY2FzZSA0NjM6IGJyZWFrOwotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDE0OTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSOyAgfQotICAgICAgICBjYXNlIDQ2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzQ6IAotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE1MzogCi0gICAgICAgIGNhc2UgMTk3OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgIGNhc2UgMjc0OiAKLSAgICAgICAgY2FzZSAzMTQ6IAotICAgICAgICBjYXNlIDM1NDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7ICB9Ci0gICAgICAgIGNhc2UgNDY2OiBicmVhazsKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7ICB9Ci0gICAgICAgIGNhc2UgNDY3OiBicmVhazsKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMjA5OiAKLSAgICAgICAgY2FzZSAyNDU6IAotICAgICAgICBjYXNlIDI4ODogCi0gICAgICAgIGNhc2UgMzI3OiAKLSAgICAgICAgY2FzZSAzNjg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NMQVNTOyAgfQotICAgICAgICBjYXNlIDQ2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDE2MTogCi0gICAgICAgIGNhc2UgMjEwOiAKLSAgICAgICAgY2FzZSAyNDY6IAotICAgICAgICBjYXNlIDI4OTogCi0gICAgICAgIGNhc2UgMzI4OiAKLSAgICAgICAgY2FzZSAzNjk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0lEOyAgfQotICAgICAgICBjYXNlIDQ3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxNzA6IAotICAgICAgICBjYXNlIDIyMTogCi0gICAgICAgIGNhc2UgMjUzOiAKLSAgICAgICAgY2FzZSAyNTU6IAotICAgICAgICBjYXNlIDI5NTogCi0gICAgICAgIGNhc2UgMzMzOiAKLSAgICAgICAgY2FzZSAzNzM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgIH0KLSAgICAgICAgY2FzZSA0NzE6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgIGNhc2UgMTcyOiAKLSAgICAgICAgY2FzZSAxNzU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfQ0hBUlNFVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1NUUklORzsgIH0KLSAgICAgICAgY2FzZSA0NzI6IGJyZWFrOwotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyAgfQotICAgICAgICBjYXNlIDQ3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM2OiAKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICBjYXNlIDIzNTogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgY2FzZSAzMTM6IAotICAgICAgICBjYXNlIDM1MzogCi0gICAgICAgIGNhc2UgMzg1OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047ICB9Ci0gICAgICAgIGNhc2UgNDc0OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0U7ICB9Ci0gICAgICAgIGNhc2UgNDc1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDI6IAotICAgICAgICBjYXNlIDI0MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT047ICB9Ci0gICAgICAgIGNhc2UgNDc2OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAzNzogCi0gICAgICAgIGNhc2UgMzg6IAotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgY2FzZSA0NjogCi0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSA1MzogCi0gICAgICAgIGNhc2UgNTg6IAotICAgICAgICBjYXNlIDU5OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgY2FzZSA3NzogCi0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICBjYXNlIDgwOiAKLSAgICAgICAgY2FzZSA4MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgICB7IAotCXJldHVybiBVTkRFRklORUQ7Ci0gfQotICAgICAgICBjYXNlIDQ3NzogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIENTU1Rva2VuaXplciBzY2FubmVyID0gbnVsbDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNjYW5uZXIgPSBuZXcgQ1NTVG9rZW5pemVyKCBuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pICk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGUgbm90IGZvdW5kIDogXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVycm9yIG9wZW5pbmcgZmlsZSBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZSA6IGphdmEgQ1NTVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0lDU1NUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0lDU1NUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxNWVjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9JQ1NTVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogY3VycmVudGx5IHByb3ZpZGUgdGhpcyBpbnRlcmZhY2UgYnV0IG1heSBiZSByZW1vdmVkIGluIGZ1dHVyZS4KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTVG9rZW5pemVyIHsKLQotCXZvaWQgc2V0SW5pdGlhbFN0YXRlKGludCBpbml0aWFsU3RhdGUpOwotCi0Jdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgYnVmc2l6ZSk7Ci0KLQlib29sZWFuIGlzRU9GKCk7Ci0KLQl2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIsIGludCBpKTsKLQotCUlUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIHJlc2V0KGNoYXJbXSBjcyk7Ci0KLQlpbnQgZ2V0T2Zmc2V0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZkY2RkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0NTU1RleHRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIENTU1RleHRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDU1NUZXh0UmVnaW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTVGV4dFJlZ2lvbkZhY3RvcnkoKTsKLQkJfQotCQlyZXR1cm4gZkluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVSZWdpb24oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJcmVnaW9uID0gbmV3IENvbnRleHRSZWdpb24oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCk7Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBDU1NUZXh0UmVnaW9uRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBDU1NUZXh0UmVnaW9uRmFjdG9yeSBmSW5zdGFuY2UgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NSZWdpb25Db250ZXh0cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYzhhZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1JlZ2lvbkNvbnRleHRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6OwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBDU1NSZWdpb25Db250ZXh0cyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0NPTU1FTlQgPSAiQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ0RPID0gIkNETyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ0RDID0gIkNEQyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUyA9ICJTIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFTElNSVRFUiA9ICJERUxJTUlURVIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0xCUkFDRSA9ICJMQlJBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1JCUkFDRSA9ICJSQlJBQ0UiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfSU1QT1JUID0gIklNUE9SVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUEFHRSA9ICJQQUdFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19NRURJQSA9ICJNRURJQSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfRk9OVF9GQUNFID0gIkZPTlRfRkFDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ0hBUlNFVCA9ICJDSEFSU0VUIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19BVEtFWVdPUkQgPSAiQVRLRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NUUklORyA9ICJTVFJJTkciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1VSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX01FRElVTSA9ICJNRURJVU0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX01FRElBX1NFUEFSQVRPUiA9ICJNRURJQV9TRVBBUkFUT1IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ0hBUlNFVF9OQU1FID0gIkNIQVJTRVRfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19QQUdFX1NFTEVDVE9SID0gIkNTU19QQUdFX1NFTEVDVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSA9ICJTRUxFQ1RPUl9FTEVNRU5UX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCA9ICJTRUxFQ1RPUl9VTklWRVJTQUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX1BTRVVETyA9ICJTRUxFQ1RPUl9QU0VVRE8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0NMQVNTID0gIlNFTEVDVE9SX0NMQVNTIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9JRCA9ICJTRUxFQ1RPUl9JRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUiA9ICJTRUxFQ1RPUl9DT01CSU5BVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19TRUxFQ1RPUl9TRVBBUkFUT1IgPSAiU0VMRUNUT1JfU0VQQVJBVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQgPSAiU0VMRUNUT1JfQVRUUklCVVRFX0VORCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUgPSAiU0VMRUNUT1JfQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRSA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiA9ICJTRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFkgPSAiREVDTEFSQVRJT05fUFJPUEVSVFkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiA9ICJERUNMQVJBVElPTl9TRVBBUkFUT1IiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUiA9ICJERUNMQVJBVElPTl9ERUxJTUlURVIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT04gPSAiREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiA9ICJERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSA9ICJERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1VSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCA9ICJERUNMQVJBVElPTl9WQUxVRV9IQVNIIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFID0gIkRFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCA9ICJDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiA9ICJERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfREVDTEFSQVRJT05fVkFMVUVfUyA9ICJERUNMQVJBVElPTl9WQUxVRV9TIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1VOS05PV04gPSAiVU5LTk9XTiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIEZvciBudWxsIG9iamVjdCA6IENTU1Rva2VuaXplciBuZXZlciBzZXQgdGhpcyB2YWx1ZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19VTkRFRklORUQgPSAiVU5ERUZJTkVEIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotIAkgKiBjdXJyZW50bHkgcHJvdmlkZWQgdGhpcyBmaWVsZCBidXQgbWF5IGJlIHJlbW92ZWQgaW4gZnV0dXJlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19GT1JFSUdOX0VMRU1FTlQgPSAiRk9SRUlHTl9FTEVNRU5UIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0UGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjJjM2YxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcGFyc2Vyei9DU1NUZXh0UGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NUb2tlbml6ZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFBhcnNlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9TVFlMRVNIRUVUID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMjsKLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlKSB7Ci0JCWluaXRpYWxpemVQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCWluaXRpYWxpemVQYXJzZXJNb2RlKHBhcnNlck1vZGUpOwotCQlyZXNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyBDU1NUZXh0UGFyc2VyKGludCBwYXJzZXJNb2RlLCBTdHJpbmcgaW5wdXQpIHsKLQkJaW5pdGlhbGl6ZVBhcnNlck1vZGUocGFyc2VyTW9kZSk7Ci0JCXJlc2V0KGlucHV0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KHJlYWRlciwgMCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0KSB7Ci0JCWdldFRva2VuaXplcigpLnJlc2V0KG5ldyBTdHJpbmdSZWFkZXIoaW5wdXQpLCAwKTsKLQl9Ci0KLQlwdWJsaWMgQ1NTVGV4dFRva2VuW10gZ2V0VG9rZW5zKCkgewotCQlMaXN0IHRva2VuTGlzdCA9IGdldFRva2VuTGlzdCgpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBuZXcgQ1NTVGV4dFRva2VuW3Rva2VuTGlzdC5zaXplKCldOwotCQlyZXR1cm4gKENTU1RleHRUb2tlbltdKSB0b2tlbkxpc3QudG9BcnJheSh0b2tlbnMpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldFRva2VuTGlzdCgpIHsKLQkJTGlzdCB0b2tlbnM7Ci0JCXRyeSB7Ci0JCQl0b2tlbnMgPSBnZXRUb2tlbml6ZXIoKS5wYXJzZVRleHQoKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJdG9rZW5zID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplUGFyc2VyTW9kZShpbnQgcGFyc2VyTW9kZSkgewotCQlpbnQgaW5pdGlhbFN0YXRlOwotCQlpbnQgYnVmc2l6ZTsKLQkJc3dpdGNoIChwYXJzZXJNb2RlKSB7Ci0JCQljYXNlIE1PREVfU1RZTEVTSEVFVCA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLllZSU5JVElBTDsKLQkJCQlidWZzaXplID0gQ1NTVG9rZW5pemVyLkJVRkZFUl9TSVpFX05PUk1BTDsKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERV9ERUNMQVJBVElPTiA6Ci0JCQkJaW5pdGlhbFN0YXRlID0gQ1NTVG9rZW5pemVyLlNUX0RFQ0xBUkFUSU9OOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfTk9STUFMOwotCQkJCWJyZWFrOwotCQkJY2FzZSBNT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFIDoKLQkJCQlpbml0aWFsU3RhdGUgPSBDU1NUb2tlbml6ZXIuU1RfREVDTEFSQVRJT05fUFJFX1ZBTFVFOwotCQkJCWJ1ZnNpemUgPSBDU1NUb2tlbml6ZXIuQlVGRkVSX1NJWkVfU01BTEw7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKDAgPCBpbml0aWFsU3RhdGUpIHsKLQkJCUNTU1Rva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsU3RhdGUoaW5pdGlhbFN0YXRlKTsKLQkJCXRva2VuaXplci5zZXRJbml0aWFsQnVmZmVyU2l6ZShidWZzaXplKTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ1NTVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBDU1NUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIENTU1Rva2VuaXplciBmVG9rZW5pemVyID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3BhcnNlcnovQ1NTVGV4dFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkY2YwMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXJ6L0NTU1RleHRUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyejsKLQotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dFRva2VuIHsKLQlwdWJsaWMgU3RyaW5nIGtpbmQ7Ci0JcHVibGljIFN0cmluZyBpbWFnZTsKLQlwdWJsaWMgaW50IHN0YXJ0OwotCXB1YmxpYyBpbnQgbGVuZ3RoOwotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIChpbWFnZSAhPSBudWxsKSA/IGltYWdlIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA1NjI4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkNoYXJzZXROYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgQ1NTIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIENTU0NvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gZm9ybWF0dGluZyBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCi0JCS8vIGNsZWFudXAgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQotCQkvLyBjb2RlIGdlbmVyYXRpb24gcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkZWZhdWx0RW5jID0gIlVURi04IjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBzeXN0ZW1FbmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc3lzdGVtRW5jICE9IG51bGwpIHsKLQkJCWRlZmF1bHRFbmMgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0UHJlZmVycmVkRGVmYXVsdElhbmFOYW1lKHN5c3RlbUVuYywgIlVURi04Iik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCBkZWZhdWx0RW5jKTsKLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdGhpcyBjb3VsZCBiZSBtYWRlIHNtYXJ0ZXIgYnkgYWN0dWFsbHkgbG9va2luZyB1cCB0aGUgY29udGVudAotCQkvLyB0eXBlJ3MgdmFsaWQgZXh0ZW5zaW9ucwotCQlub2RlLnB1dChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiY3NzIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBhZGRpdGlvbmFsIGNzcyBjb3JlIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNLCAwKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNLCAxKTsKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUsICJcIiIpOy8vJE5PTi1OTFMtMSQKLQkJbm9kZS5wdXQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfQkVUV0VFTl9WQUxVRSwgIiAiKTsvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkksIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UsIGZhbHNlKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlub2RlLnB1dEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0KLQkJLy8gQ1NTIGNsZWFudXAgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfSURFTlRJRklFUiwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfTkFNRSwgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJbm9kZS5wdXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0NBU0VfUFJPUEVSVFlfVkFMVUUsIENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCW5vZGUucHV0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9DQVNFX1NFTEVDVE9SLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNmYTA4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NTU0NvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDU1MgY29yZSBwcmVmZXJlbmNlIGtleXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfSURFTlRJRklFUiA9ICJpZGVudGlmaWVyQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVNFX1BST1BFUlRZX05BTUUgPSAicHJvcE5hbWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBU0VfUFJPUEVSVFlfVkFMVUUgPSAicHJvcFZhbHVlQ2FzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfQkVUV0VFTl9WQUxVRSA9ICJiZXR3ZWVuVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1BST1BfUE9TVF9ERUxJTSA9ICJwb3N0RGVsaW0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STUFUX1BST1BfUFJFX0RFTElNID0gInByZURlbGltIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9RVU9URSA9ICJxdW90ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUVVPVEVfSU5fVVJJID0gInF1b3RlSW5VUkkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JBUFBJTkdfTkVXTElORV9PTl9PUEVOX0JSQUNFID0gIm5ld0xpbmVPbk9wZW5CcmFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXUkFQUElOR19PTkVfUEVSX0xJTkUgPSAib25lUHJvcGVydHlQZXJMaW5lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUiA9ICJwcm9oaWJpdFdyYXBPbkF0dHIiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgY2xlYW51cCBwcmVmZXJlbmNlIG5hbWVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX0lERU5USUZJRVIgPSAiY2xlYW51cElkZW50aWZpZXJDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQ0FTRV9QUk9QRVJUWV9OQU1FID0gImNsZWFudXBQcm9wTmFtZUNhc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9DQVNFX1BST1BFUlRZX1ZBTFVFID0gImNsZWFudXBQcm9wVmFsdWVDYXNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQ0FTRV9TRUxFQ1RPUiA9ICJjbGVhbnVwU2VsZWN0b3JDYXNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgZXh0ZW5zaW9uIHRvIHVzZSB3aGVuIG5vbmUgaXMgc3BlY2lmaWVkIGluIHRoZSBOZXcgQ1NTIEZpbGUKLQkgKiBXaXphcmQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICJkZWZhdWx0RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qKgotCSAqIFRoZSBtYXhpbXVtIHdpZHRoIG9mIGEgbGluZSBiZWZvcmUgYSBsaW5lIHNwbGl0IGlzIG5lZWRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1dJRFRIID0gImxpbmVXaWR0aCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGlmIGFsbCBibGFua3MgbGluZXMgc2hvdWxkIGJlIGNsZWFyZWQgZHVyaW5nIGZvcm1hdHRpbmcuCi0JICogQmxhbmsgbGluZXMgd2lsbCBiZSBrZXB0IHdoZW4gZmFsc2UuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQVJfQUxMX0JMQU5LX0xJTkVTID0gImNsZWFyQWxsQmxhbmtMaW5lcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiAjSU5ERU5UQVRJT05fQ0hBUiBmb3IgMSBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkRFTlRBVElPTl9TSVpFID0gImluZGVudGF0aW9uU2l6ZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciB1c2VkIGZvciBpbmRlbnRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VEFCLCBTUEFDRX0KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fQ0hBUiA9ICJpbmRlbnRhdGlvbkNoYXIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjSU5ERU5UQVRJT05fQ0hBUi4gSW5kaWNhdGVzIHRvIHVzZQotCSAqIHRhYiBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1NQQUNFCi0JICogQHNlZSAjSU5ERU5UQVRJT05fQ0hBUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBQiA9ICJ0YWIiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiBzcGFjZSBjaGFyYWN0ZXIgd2hlbiBmb3JtYXR0aW5nLgotCSAqIAotCSAqIEBzZWUgI1RBQgotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRSA9ICJzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBjbGVhbnVwIHByb2Nlc3NvciBzaG91bGQgZm9ybWF0IHNvdXJjZS4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBjYXNlIHByZWZlcmVuY2VzIEluZGljYXRlcyB0byBsZWF2ZSBjYXNlIGFzIGlzLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjVVBQRVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBU0lTID0gMDsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgY2FzZSBwcmVmZXJlbmNlcyBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lCi0JICogbG93ZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0FTSVMKLQkgKiBAc2VlICNVUFBFUgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPV0VSID0gMTsKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgY2FzZSBwcmVmZXJlbmNlcyBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lCi0JICogdXBwZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjQVNJUwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQUEVSID0gMjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSUNTU01vZGVsQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOGFlMGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JQ1NTTW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU01vZGVsQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlJQ1NTTW9kZWwgZ2V0TW9kZWwoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lNb2RlbFByb3ZpZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lNb2RlbFByb3ZpZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMmFjMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JTW9kZWxQcm92aWRlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxQcm92aWRlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIG1vZGVsUHJvdmlkZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIG1vZGVsUmVsZWFzZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQkvKioKLQkgKi8KLQl2b2lkIG1vZGVsUmVtb3ZlZChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk3ZjFiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyIGV4dGVuZHMgSUNTU01vZGVsQWRhcHRlciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNlbGVjdG9yQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjc4MzU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZVNlbGVjdG9yQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBwc2V1ZG9OYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JYm9vbGVhbiBtYXRjaChJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsZWN0b3IsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2FkYXB0ZXJzL0lTdHlsZVNoZWV0QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGU4MjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZVNoZWV0QWRhcHRlciBleHRlbmRzIElDU1NNb2RlbEFkYXB0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyBIVE1ML1hNTCBlbGVtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgYWRhcHRlcgotCSAqLwotCUVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBDU1MgZG9jdW1lbnQgdGhhdCBpcyByZWxhdGVkIHRvIHRoaXMgZWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFNoZWV0KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGNhbGxlZCBhdCB0aGUgdGltZSBvZiByZWxlYXNpbmcgSFRNTC9YTUwgbW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlZCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIHRpbWUgb2YgcmVtb3ZpbmcgdGhpcyBFbGVtZW50IGZyb20gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlZCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvYWRhcHRlcnMvSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldExpc3RBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMjc3NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9hZGFwdGVycy9JU3R5bGVTaGVldExpc3RBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVyczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JRW51bWVyYXRpb24gZ2V0Q2xhc3NlcygpOwotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHlsZVNoZWV0TGlzdCBnZXRTdHlsZVNoZWV0cygpOwotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2MjJjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0KLS8qKgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZpZW5jZSB0byBwcm92aWRlIGNvbXBpbGUtdGltZQotICogc2FmZXR5IHdoZW4gcmVmZXJpbmcgdG8gYSBjb250ZW50VHlwZSBJRC4gVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZAotICogZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbiBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JDU1MgewotCS8qKgotCSAqIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQgZmllbGQgbXVzdCBtYXRjaCB3aGF0IGlzIHNwZWNpZmllZCBpbgotCSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0Ci0JICogcHJvdGVjdGVkIG1ldGhvZCBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfQ1NTID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUlkRm9yQ1NTKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotCQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NBY2Nlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDg0YzMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0FjY2Vzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQWNjZXNzIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLlZlY3RvcgotCSAqLwotCVZlY3RvciBnZXRDbGFzc05hbWVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQXR0ci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQXR0ci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTFlNGMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0F0dHIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTQXR0ciBleHRlbmRzIElDU1NOb2RlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXROYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5tb2RlbC5pbnRlcmZhY2VzLklDU1NOb2RlCi0JICovCi0JSUNTU05vZGUgZ2V0T3duZXJDU1NOb2RlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWUoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgc2V0VmFsdWUoU3RyaW5nIG5ld1ZhbHVlKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTQ2hhcnNldFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY4N2ViZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NDaGFyc2V0UnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0NoYXJzZXRSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NDaGFyc2V0UnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NDaGFyc2V0UnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIEVOQ09ESU5HID0gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NEb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDU2MmIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0RvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NVbmtub3duUnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3Q7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU0RvY3VtZW50IGV4dGVuZHMgSUNTU05vZGUgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTQ2hhcnNldFJ1bGUKLQkgKi8KLQlJQ1NTQ2hhcnNldFJ1bGUgY3JlYXRlQ1NTQ2hhcnNldFJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ZvbnRGYWNlUnVsZQotCSAqLwotCUNTU0ZvbnRGYWNlUnVsZSBjcmVhdGVDU1NGb250RmFjZVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGUKLQkgKi8KLQlJQ1NTSW1wb3J0UnVsZSBjcmVhdGVDU1NJbXBvcnRSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5JQ1NTTWVkaWFSdWxlCi0JICovCi0JSUNTU01lZGlhUnVsZSBjcmVhdGVDU1NNZWRpYVJ1bGUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlCi0JICovCi0JSUNTU1BhZ2VSdWxlIGNyZWF0ZUNTU1BhZ2VSdWxlKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBjcmVhdGVDU1NQcmltaXRpdmVWYWx1ZShzaG9ydCBwcmltaXRpdmVUeXBlKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gcnVsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUNTU1J1bGUgY3JlYXRlQ1NTUnVsZShTdHJpbmcgcnVsZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uCi0JICovCi0JSUNTU1N0eWxlRGVjbGFyYXRpb24gY3JlYXRlQ1NTU3R5bGVEZWNsYXJhdGlvbigpOwotCi0JLyoqCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUlDU1NTdHlsZURlY2xJdGVtIGNyZWF0ZUNTU1N0eWxlRGVjbEl0ZW0oU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVJ1bGUKLQkgKi8KLQlJQ1NTU3R5bGVSdWxlIGNyZWF0ZUNTU1N0eWxlUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVW5rbm93blJ1bGUKLQkgKi8KLQlDU1NVbmtub3duUnVsZSBjcmVhdGVDU1NVbmtub3duUnVsZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5NZWRpYUxpc3QKLQkgKi8KLQlNZWRpYUxpc3QgY3JlYXRlTWVkaWFMaXN0KCk7Ci0KLQlJQ1NTTW9kZWwgZ2V0TW9kZWwoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNEb2N1bWVudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0ltcG9ydFJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU0ltcG9ydFJ1bGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxNGFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NJbXBvcnRSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTSW1wb3J0UnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTSW1wb3J0UnVsZSBleHRlbmRzIElDU1NOb2RlLCBDU1NJbXBvcnRSdWxlIHsKLQotCWphdmEubGFuZy5TdHJpbmcgSFJFRiA9ICJocmVmIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCByZWZyZXNoU3R5bGVTaGVldCgpOwotCi0JLyoqCi0JICogQHBhcmFtIGhyZWYKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHNldEhyZWYoU3RyaW5nIGhyZWYpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU01lZGlhUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTWVkaWFSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZjk1YTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTWVkaWFSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTTWVkaWFSdWxlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NNZWRpYVJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1J1bGVDb250YWluZXIsIENTU01lZGlhUnVsZSB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ1N2NmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmV2ZW50LklDU1NTdHlsZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTW9kZWwgZXh0ZW5kcyBJQ1NTU3R5bGVOb3RpZmllciwgSVN0cnVjdHVyZWRNb2RlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFUk5BTCA9ICJleHRlcm5hbENTUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRERFRCA9ICJlbWJlZGRlZENTUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkxJTkUgPSAiaW5saW5lQ1NTIjsgLy8kTk9OLU5MUy0xJAotCi0JSUNTU0RvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlIGdldE93bmVyRE9NTm9kZSgpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICovCi0JT2JqZWN0IGdldFN0eWxlU2hlZXRUeXBlKCk7Ci0KLQkvKioKLQkgKiBjbGVhbnVwIC0+IHJlYnVpbGQgQ1NTIE5vZGVzIFRoaXMgaXMgcHJlLWJldGEgZml4IGZvciAxNzgxNzYuCi0JICovCi0Jdm9pZCByZWZyZXNoTm9kZXMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOYW1lZE5vZGVNYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05hbWVkTm9kZU1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmMxMzZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05hbWVkTm9kZU1hcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOYW1lZE5vZGVNYXAgZXh0ZW5kcyBJQ1NTTm9kZUxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTm9kZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSUNTU05vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyNjkxYmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NOb2RlIHsKLQotCXNob3J0IEFUVFJfTk9ERSA9IC0xOwotCXNob3J0IFVOS05PV05SVUxFX05PREUgPSAwOwotCXNob3J0IFNUWUxFUlVMRV9OT0RFID0gMTsKLQlzaG9ydCBDSEFSU0VUUlVMRV9OT0RFID0gMjsKLQlzaG9ydCBJTVBPUlRSVUxFX05PREUgPSAzOwotCXNob3J0IE1FRElBUlVMRV9OT0RFID0gNDsKLQlzaG9ydCBGT05URkFDRVJVTEVfTk9ERSA9IDU7Ci0Jc2hvcnQgUEFHRVJVTEVfTk9ERSA9IDY7Ci0Jc2hvcnQgU1RZTEVTSEVFVF9OT0RFID0gNzsKLQlzaG9ydCBTVFlMRURFQ0xBUkFUSU9OX05PREUgPSA4OwotCXNob3J0IFNUWUxFREVDTElURU1fTk9ERSA9IDk7Ci0Jc2hvcnQgVkFMVUVMSVNUX05PREUgPSAxMDsKLQlzaG9ydCBQUklNSVRJVkVWQUxVRV9OT0RFID0gMTE7Ci0Jc2hvcnQgTUVESUFMSVNUX05PREUgPSAxMjsKLQlzaG9ydCBET0NVTUVOVENTU1NUWUxFX05PREUgPSAxMzsKLQlzaG9ydCBMSU5LU1RZTEVfTk9ERSA9IDE0OwotCXNob3J0IEVMRU1FTlRDU1NJTkxJTkVTVFlMRV9OT0RFID0gMTU7Ci0KLQlJQ1NTTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKTsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLm1vZGVsLmludGVyZmFjZXMuSUNTU05hbWVkTm9kZU1hcAotCSAqLwotCUlDU1NOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpOwotCi0JSUNTU05vZGVMaXN0IGdldENoaWxkTm9kZXMoKTsKLQotCUlDU1NOb2RlIGdldEZpcnN0Q2hpbGQoKTsKLQotCUlDU1NOb2RlIGdldExhc3RDaGlsZCgpOwotCi0JSUNTU05vZGUgZ2V0TmV4dFNpYmxpbmcoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlzaG9ydCBnZXROb2RlVHlwZSgpOwotCi0JSUNTU0RvY3VtZW50IGdldE93bmVyRG9jdW1lbnQoKTsKLQotCUlDU1NOb2RlIGdldFBhcmVudE5vZGUoKTsKLQotCUlDU1NOb2RlIGdldFByZXZpb3VzU2libGluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU05vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDMyM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTTm9kZUxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQlJQ1NTTm9kZSBpdGVtKGludCBpbmRleCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUGFnZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1BhZ2VSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkMjY4NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUGFnZVJ1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQYWdlUnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJQ1NTUGFnZVJ1bGUgZXh0ZW5kcyBJQ1NTTm9kZSwgQ1NTUGFnZVJ1bGUgewotCi0JamF2YS5sYW5nLlN0cmluZyBTRUxFQ1RPUiA9ICJzZWxlY3RvciI7IC8vJE5PTi1OTFMtMSQKLQotCUlDU1NTZWxlY3Rvckxpc3QgZ2V0U2VsZWN0b3JzKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ByaW1pdGl2ZVZhbHVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YTBlYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUHJpbWl0aXZlVmFsdWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUHJpbWl0aXZlVmFsdWUgZXh0ZW5kcyBJQ1NTTm9kZSwgSUNTU1ZhbHVlLCBDU1NQcmltaXRpdmVWYWx1ZSB7Ci0KLQlzaG9ydCBDU1NfSU5URUdFUiA9IDI2OwotCXNob3J0IENTU19IQVNIID0gMjc7Ci0Jc2hvcnQgQ1NTX1VSQU5HRSA9IDI4OwotCXNob3J0IENTU19GT1JNQVQgPSAyOTsKLQlzaG9ydCBDU1NfTE9DQUwgPSAzMDsKLQlzaG9ydCBDU1NfU0xBU0ggPSAzMTsKLQlzaG9ydCBDU1NfQ09NTUEgPSAzMjsKLQlzaG9ydCBDU1NfSU5IRVJJVF9QUklNSVRJVkUgPSAzMzsKLQotCS8qKgotCSAqIEBwYXJhbSBmbG9hdFZhbHVlCi0JICogICAgICAgICAgICBmbG9hdAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldFZhbHVlKGZsb2F0IGZsb2F0VmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3RyaW5nVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgc3RyaW5nVmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTUnVsZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGJlMWRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1J1bGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTUnVsZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgYXBwZW5kUnVsZShDU1NSdWxlIHJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIG5ld1J1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQHBhcmFtIHJlZlJ1bGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICovCi0JQ1NTUnVsZSBpbnNlcnRSdWxlQmVmb3JlKENTU1J1bGUgbmV3UnVsZSwgQ1NTUnVsZSByZWZSdWxlKSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBydWxlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlDU1NSdWxlIHJlbW92ZVJ1bGUoQ1NTUnVsZSBydWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1J1bGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NSdWxlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUNTU1J1bGUgcmVwbGFjZVJ1bGUoQ1NTUnVsZSBuZXdSdWxlLCBDU1NSdWxlIG9sZFJ1bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZTdiZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yIHsKLQotCUlDU1NTZWxlY3Rvckl0ZW0gZ2V0SXRlbShpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlJdGVyYXRvciBnZXRJdGVyYXRvcigpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRTcGVjaWZpY2l0eSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFN0cmluZygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotCi0JLyoqCi0JICogCi0JICovCi0JSXRlcmF0b3IgZ2V0RXJyb3JzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgZ2V0RXJyb3JDb3VudCgpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yQ29tYmluYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwZTI1YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JDb21iaW5hdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NlbGVjdG9yQ29tYmluYXRvciBleHRlbmRzIElDU1NTZWxlY3Rvckl0ZW0gewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIERFU0NFTkRBTlQgPSAnICc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENISUxEID0gJz4nOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBBREpBQ0VOVCA9ICcrJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgVU5LTk9XTiA9ICc/JzsgLy8gZXJyb3IgY2FzZQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQljaGFyIGdldENvbWJpbmF0b3JUeXBlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUzNTg1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTZWxlY3Rvckl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTU2VsZWN0b3JJdGVtIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNJTVBMRSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NQklOQVRPUiA9IDI7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRJdGVtVHlwZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFN0cmluZygpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NlbGVjdG9yTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MTRjZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU2VsZWN0b3JMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTZWxlY3Rvckxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlJdGVyYXRvciBnZXRJdGVyYXRvcigpOwotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5WZWN0b3IKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCUlDU1NTZWxlY3RvciBnZXRTZWxlY3RvcihpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFN0cmluZygpOwotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGdldEVycm9yQ291bnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCUl0ZXJhdG9yIGdldEVycm9ycygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlib29sZWFuIG1hdGNoKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHBzZXVkb05hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NpbXBsZVNlbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTaW1wbGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGU3NzlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1NpbXBsZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1NpbXBsZVNlbGVjdG9yIGV4dGVuZHMgSUNTU1NlbGVjdG9ySXRlbSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCVN0cmluZyBnZXRBdHRyaWJ1dGUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldENsYXNzKGludCBpbmRleCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCVN0cmluZyBnZXRJRChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldE5hbWUoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWludCBnZXROdW1PZkF0dHJpYnV0ZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWludCBnZXROdW1PZkNsYXNzZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWludCBnZXROdW1PZklEcygpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JaW50IGdldE51bU9mUHNldWRvTmFtZXMoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JU3RyaW5nIGdldFBzZXVkb05hbWUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gaXNVbml2ZXJzYWwoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMTcwYzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZURlY2xJdGVtIGV4dGVuZHMgSUNTU05vZGUsIElDU1NWYWx1ZUxpc3QgewotCi0JamF2YS5sYW5nLlN0cmluZyBJTVBPUlRBTlQgPSAiaW1wb3J0YW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlJQ1NTUHJpbWl0aXZlVmFsdWUgYXBwZW5kVmFsdWUoSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWUKLQkgKi8KLQlDU1NWYWx1ZSBnZXRDU1NWYWx1ZSgpOwotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFByaW9yaXR5KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSByZW1vdmVWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqIEBwYXJhbSBuZXdWYWx1ZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uY3NzLkNTU1ByaW1pdGl2ZVZhbHVlCi0JICogQHBhcmFtIG9sZFZhbHVlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JSUNTU1ByaW1pdGl2ZVZhbHVlIHJlcGxhY2VWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgbmV3VmFsdWUsIElDU1NQcmltaXRpdmVWYWx1ZSBvbGRWYWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBwcmlvcml0eQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgc2V0UHJpb3JpdHkoU3RyaW5nIHByaW9yaXR5KTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTg3ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1N0eWxlRGVjbGFyYXRpb24gZXh0ZW5kcyBJQ1NTRG9jdW1lbnQsIENTU1N0eWxlRGVjbGFyYXRpb24gewotCi0JSUNTU1N0eWxlRGVjbEl0ZW0gZ2V0RGVjbEl0ZW1Ob2RlKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JSUNTU1N0eWxlRGVjbEl0ZW0gcmVtb3ZlRGVjbEl0ZW1Ob2RlKElDU1NTdHlsZURlY2xJdGVtIG9sZERlY2wpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQlJQ1NTU3R5bGVEZWNsSXRlbSBzZXREZWNsSXRlbU5vZGUoSUNTU1N0eWxlRGVjbEl0ZW0gbmV3RGVjbCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDQ0MTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1N0eWxlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlUnVsZTsKLQotcHVibGljIGludGVyZmFjZSBJQ1NTU3R5bGVSdWxlIGV4dGVuZHMgSUNTU05vZGUsIENTU1N0eWxlUnVsZSB7Ci0KLQlqYXZhLmxhbmcuU3RyaW5nIFNFTEVDVE9SID0gInNlbGVjdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JSUNTU1NlbGVjdG9yTGlzdCBnZXRTZWxlY3RvcnMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVNoZWV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NTdHlsZVNoZWV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ODZkOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTU3R5bGVTaGVldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NTdHlsZVNoZWV0IGV4dGVuZHMgSUNTU0RvY3VtZW50LCBJQ1NTUnVsZUNvbnRhaW5lciwgQ1NTU3R5bGVTaGVldCB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGVMaXN0Ci0JICovCi0JTm9kZUxpc3QgZ2V0T3duZXJOb2RlcygpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqIEBwYXJhbSBkb2MKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JTm9kZUxpc3QgZ2V0T3duZXJOb2RlcyhEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZUxpc3QKLQkgKi8KLQlDU1NSdWxlTGlzdCBnZXRPd25lclJ1bGVzKCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0Ci0JICovCi0JU3R5bGVTaGVldExpc3QgZ2V0UGFyZW50U3R5bGVTaGVldHMoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JQ1NTVmFsdWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczMjMxZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NWYWx1ZSBleHRlbmRzIENTU1ZhbHVlIHsKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCVN0cmluZyBnZXRDU1NWYWx1ZVRleHQoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDU1NWYWx1ZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDZlNDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNTU1ZhbHVlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlTGlzdDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ1NTVmFsdWVMaXN0IGV4dGVuZHMgSUNTU1ZhbHVlLCBDU1NWYWx1ZUxpc3QgewotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSBhcHBlbmRWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWUKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZQotCSAqLwotCUlDU1NQcmltaXRpdmVWYWx1ZSByZW1vdmVWYWx1ZShJQ1NTUHJpbWl0aXZlVmFsdWUgdmFsdWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNvdW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUNvdW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVlYTE3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lDb3VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ291bnRlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJQ291bnRlciBleHRlbmRzIElDU1NOb2RlLCBDb3VudGVyIHsKLQotCWphdmEubGFuZy5TdHJpbmcgSURFTlRJRklFUiA9ICJpZGVudGlmaWVyIjsgLy8kTk9OLU5MUy0xJAotCWphdmEubGFuZy5TdHJpbmcgTElTVFNUWUxFID0gImxpc3RzdHlsZSI7IC8vJE5PTi1OTFMtMSQKLQlqYXZhLmxhbmcuU3RyaW5nIFNFUEFSQVRPUiA9ICJzZXBhcmF0b3IiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQl2b2lkIHNldElkZW50aWZpZXIoU3RyaW5nIGlkZW50aWZpZXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gbGlzdFN0eWxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0TGlzdFN0eWxlKFN0cmluZyBsaXN0U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gU2VwYXJhdG9yCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCXZvaWQgc2V0U2VwYXJhdG9yKFN0cmluZyBzZXBhcmF0b3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb25DU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyODg5MWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NSW1wbGVtZW50YXRpb25DU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5ET01JbXBsZW1lbnRhdGlvbkNTUzsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NSW1wbGVtZW50YXRpb25DU1MgZXh0ZW5kcyBET01JbXBsZW1lbnRhdGlvbkNTUyB7Ci0KLQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVDU1NTdHlsZURlY2xhcmF0aW9uKCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lEb2N1bWVudFN0eWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lEb2N1bWVudFN0eWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZGJlZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRG9jdW1lbnRTdHlsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuRG9jdW1lbnRTdHlsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudFN0eWxlIGV4dGVuZHMgRG9jdW1lbnRTdHlsZSB7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gbmV3U2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCBhcHBlbmRTaGVldChTdHlsZVNoZWV0IG5ld1NoZWV0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIG5ld1NoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQHBhcmFtIHJlZlNoZWV0Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0Ci0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgZXhjZXB0aW9uIGRlc2NyaXB0aW9uLgotCSAqLwotCVN0eWxlU2hlZXQgaW5zZXJ0U2hlZXRCZWZvcmUoU3R5bGVTaGVldCBuZXdTaGVldCwgU3R5bGVTaGVldCByZWZTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBwYXJhbSBvbGRTaGVldAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBkZXNjcmlwdGlvbi4KLQkgKi8KLQlTdHlsZVNoZWV0IHJlbW92ZVNoZWV0KFN0eWxlU2hlZXQgb2xkU2hlZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gbmV3U2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAcGFyYW0gb2xkU2hlZXQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBleGNlcHRpb24gZGVzY3JpcHRpb24uCi0JICovCi0JU3R5bGVTaGVldCByZXBsYWNlU2hlZXQoU3R5bGVTaGVldCBuZXdTaGVldCwgU3R5bGVTaGVldCBvbGRTaGVldCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NTU1ByZWZlcmVuY2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ1NTUHJlZmVyZW5jZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDkwMDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ1NTUHJlZmVyZW5jZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQganVzdCBhY2Nlc3MgcHJlZmVyZW5jZXMgZGlyZWN0bHkKLSAqLwotcHVibGljIGNsYXNzIENTU1ByZWZlcmVuY2VIZWxwZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTUHJlZmVyZW5jZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgQ1NTUHJlZmVyZW5jZUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCZXR3ZWVuVmFsdWVTdHJpbmcoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9CRVRXRUVOX1ZBTFVFKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0UHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0JCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4TGluZVdpZHRoKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1b3RlU3RyaW5nKElDU1NNb2RlbCBtb2RlbCkgewotCQkvLyBuYWthbW9yaV9UT0RPIGNzcyBwcmVmIHRyYW5zaXRpb24KLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNwYWNlc1Bvc3REZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9QUk9QX1BPU1RfREVMSU0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3BhY2VzUHJlRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSWRlbnRVcHBlckNhc2UoKSB7Ci0JCWlmIChnZXRQcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lT25PcGVuQnJhY2UoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT25lUHJvcGVydHlQZXJMaW5lKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb2hpYml0V3JhcE9uQXR0cigpIHsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLldSQVBQSU5HX1BST0hJQklUX1dSQVBfT05fQVRUUik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQcm9wTmFtZVVwcGVyQ2FzZSgpIHsKLQkJaWYgKGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BWYWx1ZVVwcGVyQ2FzZSgpIHsKLQkJaWYgKGdldFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNRdW90ZUluVVJJKCkgewotCQlyZXR1cm4gZ2V0UHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFX0lOX1VSSSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0QmV0d2VlblZhbHVlU3RyaW5nKFN0cmluZyBuZXdCZXR3ZWVuVmFsdWVTdHJpbmcpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9CRVRXRUVOX1ZBTFVFLCBuZXdCZXR3ZWVuVmFsdWVTdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElkZW50VXBwZXJDYXNlKGJvb2xlYW4gbmV3SWRlbnRVcHBlckNhc2UpIHsKLQkJaW50IHRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSOwotCQlpZiAobmV3SWRlbnRVcHBlckNhc2UpCi0JCQl0aGVDYXNlID0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUiwgdGhlQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T25lUHJvcGVydHlQZXJMaW5lKGJvb2xlYW4gbmV3T25lUHJvcGVydHlQZXJMaW5lKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUsIG5ld09uZVByb3BlcnR5UGVyTGluZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvaGliaXRXcmFwT25BdHRyKGJvb2xlYW4gbmV3UHJvaGliaXRXcmFwT25BdHRyKSB7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIsIG5ld1Byb2hpYml0V3JhcE9uQXR0cik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJvcE5hbWVVcHBlckNhc2UoYm9vbGVhbiBuZXdQcm9wTmFtZVVwcGVyQ2FzZSkgewotCQlpbnQgdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVI7Ci0JCWlmIChuZXdQcm9wTmFtZVVwcGVyQ2FzZSkKLQkJCXRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSOwotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FLCB0aGVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQcm9wVmFsdWVVcHBlckNhc2UoYm9vbGVhbiBuZXdQcm9wVmFsdWVVcHBlckNhc2UpIHsKLQkJaW50IHRoZUNhc2UgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSOwotCQlpZiAobmV3UHJvcFZhbHVlVXBwZXJDYXNlKQotCQkJdGhlQ2FzZSA9IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JCWdldFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFLCB0aGVDYXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZVN0cmluZyhTdHJpbmcgcXVvdGUpIHsKLQkJZ2V0UHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URSwgcXVvdGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwYWNlc1Bvc3REZWxpbWl0ZXIoaW50IG51bSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUE9TVF9ERUxJTSwgbnVtKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGFjZXNQcmVEZWxpbWl0ZXIoaW50IG51bSkgewotCQlnZXRQcmVmZXJlbmNlcygpLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1BST1BfUFJFX0RFTElNLCBudW0pOwotCX0KLQotCXByaXZhdGUgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoKSB7Ci0JCUNTU0NvcmVQbHVnaW4gY3NzTW9kZWxQbHVnaW4gPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKTsKLQkJcmV0dXJuIGNzc01vZGVsUGx1Z2luLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBDU1NQcmVmZXJlbmNlSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENTU1ByZWZlcmVuY2VIZWxwZXIgZkluc3RhbmNlID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUNTU1BhcnRpdGlvblR5cGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSUNTU1BhcnRpdGlvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTVjNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lDU1NQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXM7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLiBJdCBkZWZpbmVzIHRoZQotICogcGFydGl0aW9uaW5nIGZvciBDU1MgYW5kIGFsbCBpdHMgcGFydGl0aW9ucy4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZQotICogcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTU1BhcnRpdGlvblR5cGVzIGV4dGVuZHMgSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcyB7Ci0KLQlTdHJpbmcgU1RZTEUgPSAib3JnLmVjbGlwc2Uud3N0LmNzcy5TVFlMRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3Rhc2tzL0NTU0ZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTE1ZmYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGFza3MvQ1NTRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lcjsKLQotcHVibGljIGNsYXNzIENTU0ZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBDU1NGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tZW50ZWRUZXh0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlTdHJpbmcgdGV4dCA9IHN1cGVyLmdldENvbW1lbnRlZFRleHQoZG9jdW1lbnQsIGJlZ2luLCBsZW5ndGgpOwotCQlpZiAodGV4dCAhPSBudWxsICYmIHRleHQuZW5kc1dpdGgoIiovIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHRleHQubGVuZ3RoKCkgLSAyKTsKLQkJfQotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NThmODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L0NTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIGNlbnRyYWxpemVkIHBsYWNlIHRvIHB1dCAicmVwYXJzaW5nIiBsb2dpYy4gVGhpcyBpcwotICogdGhlIGxvZ2ljIHRoYXQgcmVwYXJzZXMgdGhlIHRleHQgaW5jcmVtZW50YWxseSwgYXMgYSB1c2VyIHR5cGVzIGluIG5ldwotICogY2hhcmFjdGVycywgb3IgRE9NIG5vZGVzIGFyZSBpbnNlcnRlZCBvciBkZWxldGVkLiBOb3RlOiBpdCBpcyBub3QgYSB0aHJlYWQKLSAqIHNhZmUgY2xhc3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIHsKLQotCWNsYXNzIFJlcGFyc2VSYW5nZSB7Ci0JCVJlcGFyc2VSYW5nZSgpIHsKLQkJCXJlc2V0KCk7Ci0JCX0KLQotCQlSZXBhcnNlUmFuZ2UoaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0JCQlmUmFuZ2VTdGFydCA9IHN0YXJ0OwotCQkJZlJhbmdlRW5kID0gZW5kOwotCQl9Ci0KLQkJdm9pZCBzZXRTdGFydChpbnQgc3RhcnQpIHsKLQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCX0KLQotCQl2b2lkIHNldEVuZChpbnQgZW5kKSB7Ci0JCQlmUmFuZ2VFbmQgPSBlbmQ7Ci0JCX0KLQotCQlpbnQgZ2V0U3RhcnQoKSB7Ci0JCQlyZXR1cm4gZlJhbmdlU3RhcnQ7Ci0JCX0KLQotCQlpbnQgZ2V0RW5kKCkgewotCQkJcmV0dXJuIGZSYW5nZUVuZDsKLQkJfQotCi0JCWJvb2xlYW4gaXNWYWxpZCgpIHsKLQkJCXJldHVybiAoMCA8IGZSYW5nZUVuZCAtIGZSYW5nZVN0YXJ0KSA/IHRydWUgOiBmYWxzZTsKLQkJfQotCi0JCXZvaWQgcmVzZXQoKSB7Ci0JCQlmUmFuZ2VTdGFydCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCQkJZlJhbmdlRW5kID0gMDsKLQkJfQotCi0JCXZvaWQgZXhwYW5kKFJlcGFyc2VSYW5nZSByYW5nZSkgewotCQkJaWYgKHJhbmdlID09IG51bGwgfHwgIXJhbmdlLmlzVmFsaWQoKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBzdGFydCA9IHJhbmdlLmdldFN0YXJ0KCk7Ci0JCQlpZiAoc3RhcnQgPCBmUmFuZ2VTdGFydCkgewotCQkJCWZSYW5nZVN0YXJ0ID0gc3RhcnQ7Ci0JCQl9Ci0JCQlpbnQgZW5kID0gcmFuZ2UuZ2V0RW5kKCk7Ci0JCQlpZiAoZlJhbmdlRW5kIDwgZW5kKSB7Ci0JCQkJZlJhbmdlRW5kID0gZW5kOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBpbnQgZlJhbmdlU3RhcnQ7Ci0JCXByaXZhdGUgaW50IGZSYW5nZUVuZDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JLy8gcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50Ci0JLy8gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlczIoKSB7Ci0JLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gc3BlY2lhbFBvc2l0aW9uVXBkYXRlKGZTdGFydCwgZlN0YXJ0ICsKLQkvLyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JLy8gaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JLy8gcmVzdWx0ID0gY2hlY2tJbnNpZGVCcmFjZSgpOwotCS8vIH0KLQkvLyByZXR1cm4gcmVzdWx0OwotCS8vIH0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblN5bnRheCgpIHsKLQkJaW50IGNoZWNrU3RhcnQgPSBmU3RhcnQ7Ci0JCWludCBjaGVja0VuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoY2hlY2tFbmQpOwotCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCWNoZWNrRW5kID0gZW5kUmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQl9Ci0KLQkJUmVwYXJzZVJhbmdlIHJhbmdlID0gbmV3IFJlcGFyc2VSYW5nZShjaGVja1N0YXJ0LCBjaGVja0VuZCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yRGVsaW1pdGVyKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclVua25vd25SZWdpb24ocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JRdW90ZXMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yQ29tbWVudHMocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpKTsKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yQnJhY2VzKHJhbmdlLmdldFN0YXJ0KCksIHJhbmdlLmdldEVuZCgpKSk7Ci0KLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0OwotCi0JCXJlc3VsdCA9IGNoZWNrSW5zaWRlQnJhY2UocmFuZ2UuZ2V0U3RhcnQoKSwgcmFuZ2UuZ2V0RW5kKCkpOwotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVwYXJzZShyYW5nZS5nZXRTdGFydCgpLCByYW5nZS5nZXRFbmQoKSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yVW5rbm93blJlZ2lvbihpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJaW50IG5ld1N0YXJ0ID0gc3RhcnQ7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0IC0gMSk7Ci0JCWlmIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCWl0ZXJhdG9yLnByZXYoKTsgLy8gc2tpcCBteXNlbGYKLQkJfQotCQl3aGlsZSAoaXRlcmF0b3IuaGFzUHJldigpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyYXRvci5wcmV2KCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwgJiYgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTikgewotCQkJCW5ld1N0YXJ0ID0gaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJaWYgKHN0YXJ0ICE9IG5ld1N0YXJ0KSB7Ci0JCQlyZXR1cm4gbmV3IFJlcGFyc2VSYW5nZShuZXdTdGFydCwgZW5kKTsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yRGVsaW1pdGVyKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoZGlydHlTdGFydCAhPSBudWxsICYmIGRpcnR5U3RhcnQuZ2V0U3RhcnQoKSA8IHN0YXJ0KSB7Ci0JCQlzdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQpOwotCQlpZiAoZG9jUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmIChkb2NSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldlJlZ2lvbiA9IGRvY1JlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKHByZXZSZWdpb24uZ2V0U3RhcnQoKSwgZW5kKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yUXVvdGVzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiXCIiLCAiXCIiKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIlwnIiwgIlwnIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAocmFuZ2UuaXNWYWxpZCgpKSA/IHJhbmdlIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvckNvbW1lbnRzKGludCBzdGFydCwgaW50IGVuZCkgewotCQlSZXBhcnNlUmFuZ2UgcmFuZ2UgPSBuZXcgUmVwYXJzZVJhbmdlKCk7Ci0KLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiLyoiLCAiKi8iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIjwlIiwgIiU+IikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiAocmFuZ2UuaXNWYWxpZCgpKSA/IHJhbmdlIDogbnVsbDsKLQl9Ci0KLQlwcml2YXRlIFJlcGFyc2VSYW5nZSBnZXRVcGRhdGVSYW5nZUZvckJyYWNlcyhpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJUmVwYXJzZVJhbmdlIHJhbmdlID0gbmV3IFJlcGFyc2VSYW5nZSgpOwotCi0JCXJhbmdlLmV4cGFuZChnZXRVcGRhdGVSYW5nZUZvclBhaXIoc3RhcnQsIGVuZCwgIlsiLCAiXSIpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJcmFuZ2UuZXhwYW5kKGdldFVwZGF0ZVJhbmdlRm9yUGFpcihzdGFydCwgZW5kLCAiKCIsICIpIikpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyYW5nZS5leHBhbmQoZ2V0VXBkYXRlUmFuZ2VGb3JQYWlyKHN0YXJ0LCBlbmQsICJ7IiwgIn0iKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIChyYW5nZS5pc1ZhbGlkKCkpID8gcmFuZ2UgOiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tJbnNpZGVCcmFjZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlib29sZWFuIGJEZWNsYXJhdGlvbiA9IGZhbHNlOwotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCWJEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCX0KLQkJaWYgKCFiRGVjbGFyYXRpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldlJlZ2lvbiA9IENTU1V0aWwuZmluZFByZXZpb3VzU2lnbmlmaWNhbnROb2RlKHJlZ2lvbik7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJdHlwZSA9IHByZXZSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmIChDU1NSZWdpb25VdGlsLmlzRGVjbGFyYXRpb25UeXBlKHR5cGUpIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJCQliRGVjbGFyYXRpb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWJEZWNsYXJhdGlvbikgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0UmVnaW9uID0gQ1NTVXRpbC5maW5kTmV4dFNpZ25pZmljYW50Tm9kZShyZWdpb24pOwotCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCXR5cGUgPSBuZXh0UmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVHlwZSh0eXBlKSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpIHsKLQkJCQkJYkRlY2xhcmF0aW9uID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYkRlY2xhcmF0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0gZmluZFJ1bGVTdGFydChyZWdpb24pOwotCQkJaWYgKHN0YXJ0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kKTsKLQkJCQlpZiAoZW5kUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gcmVwYXJzZShzdGFydFJlZ2lvbiwgZW5kUmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZFJ1bGVTdGFydChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gc3RhcnRSZWdpb247Ci0JCS8vIGZpbmQgJ3snCi0JCXdoaWxlIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQl9Ci0JCS8vIGlmIChyZWdpb24gPT0gc3RhcnRSZWdpb24pIHsKLQkJLy8gcmV0dXJuIG51bGw7Ci0JCS8vIH0KLQkJLy8gZWxzZQotCQlpZiAocmVnaW9uICE9IG51bGwpIHsgLy8gJ3snIGlzIGZvdW5kCi0JCQlyZWdpb24gPSByZWdpb24uZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChpc0xlYWRpbmdEZWNsYXJhdGlvblR5cGUocmVnaW9uLmdldFR5cGUoKSkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlYWRpbmdEZWNsYXJhdGlvblR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQUdFIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSB8fCBDU1NSZWdpb25VdGlsLmlzU2VsZWN0b3JUeXBlKHR5cGUpKTsKLQl9Ci0KLQkvLyBwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkvLyBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCS8vIHJldHVybiBzcGVjaWFsUG9zaXRpb25VcGRhdGUoZlN0YXJ0LCBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlIC0gMSk7Ci0JLy8gfQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgUmVwYXJzZVJhbmdlIGdldFVwZGF0ZVJhbmdlRm9yUGFpcihpbnQgc3RhcnQsIGludCBlbmQsIFN0cmluZyBvcGVuZXIsIFN0cmluZyBjbG9zZXIpIHsKLQkJU3RyaW5nQnVmZmVyIGRlbGV0aW9uQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdCdWZmZXIgaW5zZXJ0aW9uQnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgcXVvdGVMZW4gPSBNYXRoLm1heChvcGVuZXIubGVuZ3RoKCksIGNsb3Nlci5sZW5ndGgoKSk7Ci0JCWlmICgxIDwgcXVvdGVMZW4pIHsKLQkJCS8qKgotCQkJICogZXgpIG9wZW5lciA9ICJBQkMiLCBjbG9zZXIgPSAiWFlaIiBtb2RlbDogQUJDREVGLi4uLi4uLlVWV1hZWgotCQkJICogZGVsZXRpb246IENERUYuLi4uLi4uVVZXWCBwcmUvcG9zdDogQUIgLyBZWgotCQkJICovCi0JCQlpbnQgYWRkU3RhcnQgPSBzdGFydCAtIChxdW90ZUxlbiAtIDEpOwotCQkJaWYgKDAgPD0gYWRkU3RhcnQpIHsKLQkJCQlTdHJpbmcgYWRkU3RyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoYWRkU3RhcnQsIHF1b3RlTGVuIC0gMSk7Ci0JCQkJZGVsZXRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQkJaW5zZXJ0aW9uQnVmLmFwcGVuZChhZGRTdHIpOwotCQkJfQotCQkJZGVsZXRpb25CdWYuYXBwZW5kKGZEZWxldGVkVGV4dCk7Ci0JCQlpbnNlcnRpb25CdWYuYXBwZW5kKGZDaGFuZ2VzKTsKLQkJCWlmIChlbmQgKyAocXVvdGVMZW4gLSAxKSA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlTdHJpbmcgYWRkU3RyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXQoZW5kICsgMSwgcXVvdGVMZW4gLSAxKTsKLQkJCQlkZWxldGlvbkJ1Zi5hcHBlbmQoYWRkU3RyKTsKLQkJCQlpbnNlcnRpb25CdWYuYXBwZW5kKGFkZFN0cik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkZWxldGlvbkJ1Zi5hcHBlbmQoZkRlbGV0ZWRUZXh0KTsKLQkJCWluc2VydGlvbkJ1Zi5hcHBlbmQoZkNoYW5nZXMpOwotCQl9Ci0JCVN0cmluZyBkZWxldGlvbiA9IGRlbGV0aW9uQnVmLnRvU3RyaW5nKCk7Ci0JCVN0cmluZyBpbnNlcnRpb24gPSBpbnNlcnRpb25CdWYudG9TdHJpbmcoKTsKLQotCQlpbnQgcmFuZ2VTdGFydCA9IHN0YXJ0OwotCQlpbnQgcmFuZ2VFbmQgPSBlbmQ7Ci0KLQkJaWYgKDAgPD0gZGVsZXRpb24uaW5kZXhPZihvcGVuZXIpIHx8IDAgPD0gZGVsZXRpb24uaW5kZXhPZihjbG9zZXIpIHx8IDAgPD0gaW5zZXJ0aW9uLmluZGV4T2Yob3BlbmVyKSB8fCAwIDw9IGluc2VydGlvbi5pbmRleE9mKGNsb3NlcikpIHsKLQkJCWludCBzLCBlOwotCQkJdHJ5IHsKLQkJCQlpZiAoc3RhcnQgPD0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCQlJUmVnaW9uIHN0YXJ0UmVnaW9uID0gZ2V0RmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoKS5maW5kKHN0YXJ0IC0gMSwgb3BlbmVyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChzdGFydFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlzID0gc3RhcnRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzID0gLTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXMgPSAtMTsKLQkJCQl9Ci0JCQkJaWYgKGVuZCA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKSB7Ci0JCQkJCUlSZWdpb24gZW5kUmVnaW9uID0gZ2V0RmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoKS5maW5kKGVuZCArIDEsIGNsb3NlciwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZSA9IGVuZFJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWUgPSAtMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZSA9IC0xOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJaWYgKDAgPD0gcykgewotCQkJCXJhbmdlU3RhcnQgPSBNYXRoLm1pbihyYW5nZVN0YXJ0LCBzKTsKLQkJCX0KLQkJCWlmICgwIDw9IGUpIHsKLQkJCQlyYW5nZUVuZCA9IE1hdGgubWF4KHJhbmdlRW5kLCBlKTsKLQkJCX0KLQkJfQotCi0JCWlmIChyYW5nZVN0YXJ0IDwgc3RhcnQgfHwgZW5kIDwgcmFuZ2VFbmQpIHsKLQkJCXJldHVybiBuZXcgUmVwYXJzZVJhbmdlKHJhbmdlU3RhcnQsIHJhbmdlRW5kKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IENTU1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvQ1NTU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTc0YmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9DU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENTU19HRU5FUklDID0gMTAxMTA5OwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIENTU19HRU5FUklDIDoKLQkJCQlpbnN0YW5jZSA9IG5ldyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NmY3M2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFdhbGtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIgewotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgPSBudWxsOwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudCA9IG51bGw7Ci0JU3RyaW5nIGZPcmlnaW5hbENoYW5nZXMgPSBudWxsOwotCWludCBmT3JpZ2luYWxPZmZzZXQgPSAwOwotCWludCBmT3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSAwOwotCWludCBmTGVuZ3RoRGlmZmVyZW5jZSA9IDA7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50V2Fsa2VyKCkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRXYWxrZXIoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaW5pdGlhbGl6ZShldmVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTzEgLT4gT3V0cHV0OiBPMiBJbnB1dDogTzIgLT4gT3V0cHV0OiBPMyBJbnB1dDogTzMgLT4gT3V0cHV0OiBDNAotCSAqIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuKzEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCW5leHROb2RlID0gbm9kZS5nZXROZXh0KCk7Ci0JCQlpZiAobmV4dE5vZGUgPT0gbnVsbCkgewotCQkJCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCQkJLy8gdGhpcyBtYXkgYmUgdGhlIGVuZCBvZiBvbGQgZmxhdG5vZGVzCi0JCQkJCWludCBuZXdTdGFydCA9IG5vZGUuZ2V0RW5kKCkgLSBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCQkJbmV4dE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5ld1N0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPKiAtPiBPdXRwdXQ6IEM0IElucHV0OiBDbiAtPiBPdXRwdXQ6IENuKzEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0Tm9kZUluQ3VycmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSA9IG51bGw7Ci0JCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkRW5kTm9kZSA9IGZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0Lml0ZW0oZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWludCBuZXdTdGFydCA9IG9sZEVuZE5vZGUuZ2V0RW5kKCkgLSBmTGVuZ3RoRGlmZmVyZW5jZTsKLQkJCW5leHROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChuZXdTdGFydCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQluZXh0Tm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBuZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBPbGQgTm9kZXM6IC0tW08xXS0tW08yXS0tW08zXS0tLSA6IC8gXCBDdXJyZW50IE5vZGVzOgotCSAqIC0tLVtDMV0tLS0tLVtDMl0tLS0tLVtDM10tLS0tLVtDNF0tLS0KLQkgKiAKLQkgKiBJbnB1dDogTzEgLT4gT3V0cHV0OiBDMSBJbnB1dDogTzIgLT4gT3V0cHV0OiBPMSBJbnB1dDogTzMgLT4gT3V0cHV0OiBPMgotCSAqIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuLTEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXByZXZOb2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXZOb2RlID09IG51bGwpIHsKLQkJCQlpZiAoaXNPbGROb2RlKG5vZGUpKSB7Ci0JCQkJCS8vIHRoaXMgbWF5IGJlIHRoZSBzdGFydCBvZiBvbGQgZmxhdG5vZGVzCi0JCQkJCWludCBuZXdFbmQgPSBub2RlLmdldFN0YXJ0KCkgLSAxOwotCQkJCQlwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3RW5kKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZXZOb2RlOwotCX0KLQotCS8qKgotCSAqIE9sZCBOb2RlczogLS1bTzFdLS1bTzJdLS1bTzNdLS0tIDogLyBcIEN1cnJlbnQgTm9kZXM6Ci0JICogLS0tW0MxXS0tLS0tW0MyXS0tLS0tW0MzXS0tLS0tW0M0XS0tLQotCSAqIAotCSAqIElucHV0OiBPKiAtPiBPdXRwdXQ6IEMxIElucHV0OiBDbiAtPiBPdXRwdXQ6IENuLTEKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2Tm9kZUluQ3VycmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2Tm9kZSA9IG51bGw7Ci0JCWlmIChpc09sZE5vZGUobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RhcnROb2RlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuaXRlbSgwKTsKLQkJCWludCBuZXdFbmQgPSBvbGRTdGFydE5vZGUuZ2V0U3RhcnQoKSAtIDE7Ci0JCQlwcmV2Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV3RW5kKTsKLQkJfQotCQllbHNlIGlmIChub2RlICE9IG51bGwpIHsKLQkJCXByZXZOb2RlID0gbm9kZS5nZXRQcmV2aW91cygpOwotCQl9Ci0JCXJldHVybiBwcmV2Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJZk9yaWdpbmFsQ2hhbmdlcyA9IGV2ZW50LmdldFRleHQoKTsKLQkJZk9yaWdpbmFsT2Zmc2V0ID0gZXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCWZPcmlnaW5hbExlbmd0aFRvUmVwbGFjZSA9IGV2ZW50LmdldExlbmd0aCgpOwotCQlmTGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGZPcmlnaW5hbENoYW5nZXMsIGZPcmlnaW5hbExlbmd0aFRvUmVwbGFjZSk7Ci0KLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCkgZXZlbnQpLmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0ID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzT2xkTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJYm9vbGVhbiBiT2xkID0gZmFsc2U7Ci0JCWlmIChmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJaWYgKGUubmV4dEVsZW1lbnQoKSA9PSBub2RlKSB7Ci0JCQkJCWJPbGQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJPbGQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDQ1MWNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JDU1MgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQkKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIGxlZ2FsVHlwZXMgPSBuZXcgU3RyaW5nW117SUNTU1BhcnRpdGlvbnMuU1RZTEUsIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTn07Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkgewotCQlyZXR1cm4gSUNTU1BhcnRpdGlvbnMuU1RZTEU7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gbGVnYWxUeXBlczsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckNTUygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQWJzdHJhY3RDc3NUcmF2ZXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9BYnN0cmFjdENzc1RyYXZlcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTlmOWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9BYnN0cmFjdENzc1RyYXZlcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwdWJsaWMgc3RhdGljIHNob3J0IFRSQVZfQ09OVCA9IDA7Ci0JcHVibGljIHN0YXRpYyBzaG9ydCBUUkFWX1BSVU5FID0gMTsKLQlwdWJsaWMgc3RhdGljIHNob3J0IFRSQVZfU1RPUCA9IDI7Ci0JcHJvdGVjdGVkIGphdmEudXRpbC5TdGFjayB0cmF2U3RhY2s7Ci0JcHJpdmF0ZSBib29sZWFuIGZUcmF2ZXJzZUltcG9ydGVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZUcmF2ZXJzZUltcG9ydEZpcnN0ID0gZmFsc2U7Ci0JcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIHRyYXZlcnNlZFNoZWV0czsKLQotCS8qKgotCSAqIENzc1Byb3BDTU5vZGUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RDc3NUcmF2ZXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vZGVsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhcHBseShJQ1NTTW9kZWwgbW9kZWwpIHsKLQkJYXBwbHkobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYXBwbHkoSUNTU05vZGUgcm9vdCkgewotCQl0cmF2U3RhY2sgPSBuZXcgU3RhY2soKTsKLQkJaWYgKGZUcmF2ZXJzZUltcG9ydGVkKSB7Ci0JCQl0cmF2ZXJzZWRTaGVldHMgPSBuZXcgVmVjdG9yKCk7Ci0JCQlpZiAocm9vdCAhPSBudWxsICYmIHJvb3QuZ2V0T3duZXJEb2N1bWVudCgpICE9IG51bGwgJiYgcm9vdC5nZXRPd25lckRvY3VtZW50KCkuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCQl0cmF2ZXJzZWRTaGVldHMuYWRkKHJvb3QuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCi0JCS8vIGZpcnN0IGNhbGwgYmVnaW4oKQotCQliZWdpbihyb290KTsKLQotCQkvLyB0cmF2ZXJzZQotCQl0cmF2ZXJzZShyb290KTsKLQotCQkvLyBsYXN0IGNhbGwgZW5kKCkKLQkJZW5kKHJvb3QpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgZW5kKElDU1NOb2RlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1RyYXZlcnNlSW1wb3J0ZWQoKSB7Ci0JCXJldHVybiBmVHJhdmVyc2VJbXBvcnRlZDsKLQl9Ci0KLQotCXByb3RlY3RlZCBzaG9ydCBwb3N0Tm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoc2hvcnQpIDA7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXJldHVybiAoc2hvcnQpIDA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1RyYXZlcnNlSW1wb3J0ZWQKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRUcmF2ZXJzZUltcG9ydGVkKGJvb2xlYW4gbmV3VHJhdmVyc2VJbXBvcnRlZCkgewotCQlmVHJhdmVyc2VJbXBvcnRlZCA9IG5ld1RyYXZlcnNlSW1wb3J0ZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1RyYXZlcnNlSW1wb3J0Rmlyc3QKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRUcmF2ZXJzZUltcG9ydEZpcnN0KGJvb2xlYW4gbmV3VHJhdmVyc2VJbXBvcnRGaXJzdCkgewotCQlmVHJhdmVyc2VJbXBvcnRGaXJzdCA9IG5ld1RyYXZlcnNlSW1wb3J0Rmlyc3Q7Ci0JfQotCi0KLQlwcml2YXRlIGZpbmFsIHNob3J0IHRyYXZlcnNlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBUUkFWX0NPTlQ7Ci0KLQkJdHJhdlN0YWNrLnB1c2gobm9kZSk7Ci0KLQkJLy8gcHJlLWFjdGlvbgotCQlzaG9ydCByZXQgPSBwcmVOb2RlKG5vZGUpOwotCi0JCWlmIChyZXQgPT0gVFJBVl9DT05UKSB7Ci0JCQlpZiAoZlRyYXZlcnNlSW1wb3J0ZWQgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpKSB7Ci0JCQkJSUNTU0ltcG9ydFJ1bGUgcnVsZSA9IChJQ1NTSW1wb3J0UnVsZSkgbm9kZTsKLQkJCQkvLyB0cmF2ZXJzZSBleHRlcm5hbCBzdHlsZS1zaGVldAotCQkJCUlDU1NTdHlsZVNoZWV0IHNoZWV0ID0gKElDU1NTdHlsZVNoZWV0KSBydWxlLmdldFN0eWxlU2hlZXQoKTsKLQkJCQlpZiAoc2hlZXQgIT0gbnVsbCAmJiAhdHJhdmVyc2VkU2hlZXRzLmNvbnRhaW5zKHNoZWV0KSkgeyAvLyBwcmV2ZW50Ci0JCQkJCQkJCQkJCQkJCQkJCQkJLy8gbG9vcAotCQkJCQl0cmF2ZXJzZWRTaGVldHMuYWRkKHNoZWV0KTsKLQkJCQkJc2hvcnQgcmV0RXh0ID0gdHJhdmVyc2Uoc2hlZXQpOwotCQkJCQlpZiAocmV0RXh0ID09IFRSQVZfU1RPUCkgewotCQkJCQkJdHJhdlN0YWNrLnBvcCgpOwotCQkJCQkJcmV0dXJuIHJldEV4dDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gY29sbGVjdCBjaGlsZHJlbgotCQkJQXJyYXlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNTU05vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChmVHJhdmVyc2VJbXBvcnRGaXJzdCkgewotCQkJCUFycmF5TGlzdCBvdGhlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpCi0JCQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJCQllbHNlCi0JCQkJCQlvdGhlcnMuYWRkKGNoaWxkKTsKLQkJCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCQljaGlsZHJlbi5hZGRBbGwob3RoZXJzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIHRyYXZlcnNlIGNoaWxkcmVuCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLnNpemUoKTsgaSsrKSB7Ci0JCQkJY2hpbGQgPSAoSUNTU05vZGUpIGNoaWxkcmVuLmdldChpKTsKLQkJCQlzaG9ydCByZXRDaGlsZCA9IHRyYXZlcnNlKGNoaWxkKTsKLQkJCQlpZiAocmV0Q2hpbGQgPT0gVFJBVl9TVE9QKSB7Ci0JCQkJCXRyYXZTdGFjay5wb3AoKTsKLQkJCQkJcmV0dXJuIHJldENoaWxkOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChyZXQgPT0gVFJBVl9TVE9QKSB7Ci0JCQl0cmF2U3RhY2sucG9wKCk7Ci0JCQlyZXR1cm4gcmV0OwotCQl9Ci0KLQkJLy8gcG9zdC1hY3Rpb24KLQkJcmV0ID0gcG9zdE5vZGUobm9kZSk7Ci0KLQkJdHJhdlN0YWNrLnBvcCgpOwotCQlyZXR1cm4gKHJldCA9PSBUUkFWX1BSVU5FKSA/IFRSQVZfQ09OVCA6IHJldDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0NsYXNzVHJhdmVyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTQ2xhc3NUcmF2ZXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc1NzRkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTQ2xhc3NUcmF2ZXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01lZGlhUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9ySXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NpbXBsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ2xhc3NUcmF2ZXJzZXIgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlBcnJheUxpc3QgZkNsYXNzTmFtZXM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTQ2xhc3NUcmF2ZXJzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZENsYXNzTmFtZXMoSUNTU1N0eWxlUnVsZSBydWxlKSB7Ci0JCUlDU1NTZWxlY3Rvckxpc3Qgc2VsZWN0b3JMaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJSXRlcmF0b3IgaVNlbGVjdG9yID0gc2VsZWN0b3JMaXN0LmdldEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpU2VsZWN0b3IuaGFzTmV4dCgpKSB7Ci0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSAoSUNTU1NlbGVjdG9yKSBpU2VsZWN0b3IubmV4dCgpOwotCQkJSXRlcmF0b3IgaUl0ZW0gPSBzZWxlY3Rvci5nZXRJdGVyYXRvcigpOwotCQkJd2hpbGUgKGlJdGVtLmhhc05leHQoKSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IChJQ1NTU2VsZWN0b3JJdGVtKSBpSXRlbS5uZXh0KCk7Ci0JCQkJaWYgKGl0ZW0uZ2V0SXRlbVR5cGUoKSA9PSBJQ1NTU2VsZWN0b3JJdGVtLlNJTVBMRSkgewotCQkJCQlJQ1NTU2ltcGxlU2VsZWN0b3Igc2VsID0gKElDU1NTaW1wbGVTZWxlY3RvcikgaXRlbTsKLQkJCQkJaW50IG5DbGFzc2VzID0gc2VsLmdldE51bU9mQ2xhc3NlcygpOwotCQkJCQlmb3IgKGludCBpQ2xhc3MgPSAwOyBpQ2xhc3MgPCBuQ2xhc3NlczsgaUNsYXNzKyspIHsKLQkJCQkJCVN0cmluZyBjbGFzc05hbWUgPSBzZWwuZ2V0Q2xhc3MoaUNsYXNzKTsKLQkJCQkJCWlmICghZkNsYXNzTmFtZXMuY29udGFpbnMoY2xhc3NOYW1lKSkKLQkJCQkJCQlmQ2xhc3NOYW1lcy5hZGQoY2xhc3NOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGJlZ2luKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKGZDbGFzc05hbWVzID09IG51bGwpCi0JCQlmQ2xhc3NOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmQoSUNTU05vZGUgbm9kZSkgewotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDb2xsZWN0aW9uIGdldENsYXNzTmFtZXMoKSB7Ci0JCXJldHVybiAoZkNsYXNzTmFtZXMgIT0gbnVsbCkgPyBmQ2xhc3NOYW1lcyA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCXNob3J0IHJldDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQlhZGRDbGFzc05hbWVzKChJQ1NTU3R5bGVSdWxlKSBub2RlKTsKLQkJCXJldCA9IFRSQVZfUFJVTkU7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0IHx8IG5vZGUgaW5zdGFuY2VvZiBJQ1NTTWVkaWFSdWxlIHx8IG5vZGUgaW5zdGFuY2VvZiBJQ1NTSW1wb3J0UnVsZSkgewotCQkJcmV0ID0gVFJBVl9DT05UOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0ID0gVFJBVl9QUlVORTsKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTTGlua0NvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU0xpbmtDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTVkMzY5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTTGlua0NvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ByaW1pdGl2ZVZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NMaW5rQ29udmVydGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxfQkVHSU4gPSAidXJsKCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMX0VORCA9ICIpIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERfUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNfUVVPVEUgPSAiXCciOyAvLyROT04tTkxTLTEkCi0KLQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDU1NMaW5rQ29udmVydGVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQkJYmFzZU1vZGVsID0gbW9kZWw7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCAmJiAoKElDU1NNb2RlbCkgbW9kZWwpLmdldFN0eWxlU2hlZXRUeXBlKCkgIT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSAoKElDU1NNb2RlbCkgbW9kZWwpLmdldE93bmVyRE9NTm9kZSgpOwotCQkJYmFzZU1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRkRnVuYyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKCF2YWx1ZS50cmltKCkudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFVSTF9CRUdJTikpIHsKLQkJCS8vIHBhX1RPRE8gY3NzIHByZWYKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQkJU3RyaW5nIHF1b3RlID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1FVT1RFKTsKLQkJCXZhbHVlID0gQ1NTVXRpbC5zdHJpcFF1b3Rlcyh2YWx1ZSk7Ci0JCQlxdW90ZSA9IENTU1V0aWwuZGV0ZWN0UXVvdGUodmFsdWUsIHF1b3RlKTsKLQkJCVN0cmluZyBzdHIgPSBVUkxfQkVHSU47Ci0JCQlpZiAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCQlzdHIgPSBzdHIudG9VcHBlckNhc2UoKTsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cik7Ci0JCQlidWYuYXBwZW5kKHF1b3RlKTsKLQkJCWJ1Zi5hcHBlbmQodmFsdWUpOwotCQkJYnVmLmFwcGVuZChxdW90ZSk7Ci0JCQlidWYuYXBwZW5kKFVSTF9FTkQpOwotCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQlpZiAoYmFzZU1vZGVsID09IG51bGwpIHsKLQkJCWJhc2VNb2RlbCA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpLmdldE1vZGVsKCk7Ci0JCQlpZiAoYmFzZU1vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsICYmICgoSUNTU01vZGVsKSBiYXNlTW9kZWwpLmdldFN0eWxlU2hlZXRUeXBlKCkgIT0gSUNTU01vZGVsLkVYVEVSTkFMKSB7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgKChJQ1NTTW9kZWwpIGJhc2VNb2RlbCkuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCQkJYmFzZU1vZGVsID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1VybChTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJc291cmNlID0gc291cmNlLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQlyZXR1cm4gc291cmNlLnN0YXJ0c1dpdGgoVVJMX0JFR0lOKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSkgewotCQkJdG9BYnNvbHV0ZSgoQ1NTVmFsdWUpIG5vZGUpOwotCQl9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCUlDU1NJbXBvcnRSdWxlIGlSdWxlID0gKElDU1NJbXBvcnRSdWxlKSBub2RlOwotCQkJaVJ1bGUuc2V0SHJlZih0b0Fic29sdXRlKGFkZEZ1bmMoaVJ1bGUuZ2V0SHJlZigpKSkpOwotCQl9Ci0JCXJldHVybiBUUkFWX0NPTlQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlRnVuYyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFk7Ci0JCVN0cmluZyBmaWVsZCA9IHZhbHVlLnRyaW0oKTsKLQkJLy8gZmlyc3QgOiB0ZWFyICJ1cmwoLi4uLikiCi0JCWlmIChmaWVsZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoVVJMX0JFR0lOKSkgewotCQkJaW50IHVybCA9IGZpZWxkLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihVUkxfQkVHSU4pOwotCQkJaW50IGVuZFBhcmVudGhlc2lzID0gZmllbGQubGFzdEluZGV4T2YoVVJMX0VORCk7Ci0JCQlpZiAoZW5kUGFyZW50aGVzaXMgPiB1cmwpIHsKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyh1cmwgKyA0LCBlbmRQYXJlbnRoZXNpcyk7Ci0JCQl9IGVsc2UKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyh1cmwgKyA0KTsKLQkJfQotCQlyZXR1cm4gZmllbGQudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmlwRnVuYyhTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlyZXR1cm4gRU1QVFk7Ci0JCS8vIGZpcnN0IDogdGVhciAidXJsKC4uLi4pIgotCQlTdHJpbmcgZmllbGQgPSByZW1vdmVGdW5jKHZhbHVlKTsKLQkJLy8gc2Vjb25kIDogdGVhciBxdW90YXRpb25zCi0JCWlmIChmaWVsZC50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoRF9RVU9URSkpIHsKLQkJCWludCBxdW90ZSA9IGZpZWxkLmluZGV4T2YoRF9RVU9URSk7Ci0JCQlpbnQgZW5kID0gZmllbGQubGFzdEluZGV4T2YoRF9RVU9URSk7Ci0JCQlpZiAoZW5kID4gcXVvdGUpIHsKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEsIGVuZCk7Ci0JCQl9IGVsc2UKLQkJCQlmaWVsZCA9IGZpZWxkLnN1YnN0cmluZyhxdW90ZSArIDEpOwotCQl9IGVsc2UgaWYgKGZpZWxkLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChTX1FVT1RFKSkgewotCQkJaW50IHF1b3RlID0gZmllbGQuaW5kZXhPZihTX1FVT1RFKTsKLQkJCWludCBlbmQgPSBmaWVsZC5sYXN0SW5kZXhPZihTX1FVT1RFKTsKLQkJCWlmIChlbmQgPiBxdW90ZSkgewotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSwgZW5kKTsKLQkJCX0gZWxzZQotCQkJCWZpZWxkID0gZmllbGQuc3Vic3RyaW5nKHF1b3RlICsgMSk7Ci0JCX0KLQotCQlyZXR1cm4gZmllbGQudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9BYnNvbHV0ZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChpc1VybChzb3VyY2UpKSB7Ci0JCQlTdHJpbmcgdXJsID0gQ1NTUGF0aFNlcnZpY2UuZ2V0QWJzb2x1dGVVUkwoYmFzZU1vZGVsLCBzdHJpcEZ1bmMoc291cmNlKSk7Ci0JCQlyZXR1cm4gKHVybCAhPSBudWxsKSA/IGFkZEZ1bmModXJsKSA6IChVUkxfQkVHSU4gKyBVUkxfRU5EKTsKLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIHRvQWJzb2x1dGUoQ1NTVmFsdWUgbm9kZSkgewotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHZhbHVlID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgbm9kZTsKLQkJCWlmICh2YWx1ZS5nZXRQcmltaXRpdmVUeXBlKCkgPT0gQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1VSSSkgewotCQkJCXZhbHVlLnNldFZhbHVlKHN0cmlwRnVuYyh0b0Fic29sdXRlKFVSTF9CRUdJTiArIHZhbHVlLmdldFN0cmluZ1ZhbHVlKCkgKyBVUkxfRU5EKSkpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1BhdGhTZXJ2aWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTUGF0aFNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZhODQzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTUGF0aFNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1BhdGhTZXJ2aWNlIHsKLQotCS8vIENvbnN0YW50cwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFVVJMU0NIRU1FID0gImZpbGUiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJMQ09MT04gPSAiOiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRVVSTFBSRUZJWCA9IEZJTEVVUkxTQ0hFTUUgKyBVUkxDT0xPTiArICIvLyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVUkxTRVBBUkFUT1IgPSAiLyI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEFic29sdXRlVVJMKElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB7Ci0JCVN0cmluZyBhYnNMaW5rID0gVVJMTW9kZWxQcm92aWRlckNTUy5yZXNvbHZlVVJJKGJhc2VNb2RlbCwgcmVmLCB0cnVlKTsKLQkJU3RyaW5nIHVybCA9IGFic0xpbms7Ci0JCWlmIChhYnNMaW5rICE9IG51bGwpIHsgLy8gaWYgaXQgaGFzIG5vdCBzY2hlbWUsIHdlIG11c3QgYWRkICJmaWxlIgotCQkJCQkJCQkvLyBzY2hlbWUKLQkJCXRyeSB7Ci0JCQkJbmV3IGphdmEubmV0LlVSTChhYnNMaW5rKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCUlQYXRoIHBhdGggPSBuZXcgUGF0aChhYnNMaW5rKTsKLQkJCQlpZiAocGF0aCAhPSBudWxsKQotCQkJCQl1cmwgPSB0b1VSTChwYXRoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdXJsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGxvY2F0aW9uMkZpbGUoU3RyaW5nIGxvY2F0aW9uKSB7Ci0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZUZvckxvY2F0aW9uKHBhdGgpOwotCQlpZiAoZmlsZSA9PSBudWxsICYmIHBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogR2V0cyBhIGZpbGUgVVJMIGZvciB0aGUgcGF0aC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9VUkwoSVBhdGggcGF0aCkgewotCQlwYXRoID0gbmV3IFBhdGgocGF0aC50b0ZpbGUoKS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCWlmIChwYXRoLmlzVU5DKCkgPT0gdHJ1ZSkgewotCQkJLy8gaXQncyBVTkMuIHJldHVybiBmaWxlOi8vaG9zdC9mb28vYmFyL2Jhei5odG1sCi0JCQlyZXR1cm4gRklMRVVSTFNDSEVNRSArIFVSTENPTE9OICsgcGF0aC50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBGSUxFVVJMUFJFRklYICsgVVJMU0VQQVJBVE9SICsgcGF0aC50b1N0cmluZygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1NlbGVjdG9yTGlzdEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRiOTdlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NTZWxlY3Rvckxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IHsKLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NTZWxlY3Rvckxpc3RGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSUNTU1NlbGVjdG9yTGlzdCBjcmVhdGVTZWxlY3Rvckxpc3QoU3RyaW5nIHNlbGVjdG9yU3RyaW5nKSB7Ci0JCXJldHVybiBuZXcgQ1NTU2VsZWN0b3JMaXN0SW1wbChzZWxlY3RvclN0cmluZyk7Ci0JfQotCi0KLQlwcml2YXRlIENTU1NlbGVjdG9yTGlzdEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ1NTU2VsZWN0b3JMaXN0RmFjdG9yeSBmSW5zdGFuY2U7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg1YWNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmRvY3VtZW50LkNTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5Q29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGV4dGVuZHMgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnlDb250ZXh0IHsKLQotCXByaXZhdGUgc3RhdGljIENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NTdHlsZURlY2xhcmF0aW9uRmFjdG9yeSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqIEBwYXJhbSBkZWNsCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUubW9kZWwuaW50ZXJmYWNlcy5JQ1NTU3R5bGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBjcmVhdGVTdHlsZURlY2xhcmF0aW9uKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUNTU1N0eWxlRGVjbGFyYXRpb24gbmV3Tm9kZSA9IGNyZWF0ZVN0eWxlRGVjbGFyYXRpb24oKTsKLQotCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmT3duZXJEb2N1bWVudCA9IG5ld05vZGU7Ci0JCWNsb25lQ2hpbGROb2RlcyhkZWNsLCBuZXdOb2RlKTsKLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IENTU1N0eWxlRGVjbGFyYXRpb25GYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9DU1NVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ODM4NTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0NTU1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTUmVnaW9uVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENTU1V0aWwgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRlYnVnT3V0KFN0cmluZyBzdHIpIHsKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgImNzcyB3YXJuaW5nOiAiICsgc3RyKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCS8vIHB1YmxpYyBzdGF0aWMgVmVjdG9yIGV4dHJhY3RNZWRpYUNvbnRlbnRzKFZlY3RvciByZWdpb25zKSB7Ci0JLy8gVmVjdG9yIG1lZGlhID0gbmV3IFZlY3RvcigpOwotCS8vIGlmIChyZWdpb25zID09IG51bGwpIHsgcmV0dXJuIG1lZGlhOyB9Ci0JLy8KLQkvLyBib29sZWFuIGJSZWFkeSA9IHRydWU7Ci0JLy8gZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JLy8gSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKWkubmV4dCgpOwotCS8vIGlmIChyZWdpb24gPT0gbnVsbCkgeyBjb250aW51ZTsgfQotCS8vIFN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkvLyBpZiAoYlJlYWR5KSB7Ci0JLy8gaWYgKHR5cGUgPT0gSURFTlQpIHsKLQkvLyBtZWRpYS5hZGRFbGVtZW50KHJlZ2lvbi5nZXRUZXh0KCkpOwotCS8vIGJSZWFkeSA9IGZhbHNlOwotCS8vIH0KLQkvLyB9IGVsc2UgewotCS8vIGlmICh0eXBlID09IENPTU1BKSB7Ci0JLy8gYlJlYWR5ID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vIHJldHVybiBtZWRpYTsKLQkvLyB9Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXh0cmFjdFN0cmluZ0NvbnRlbnRzKFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBzdHJpcFF1b3Rlcyh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBleHRyYWN0VXJpQ29udGVudHMoU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIGNvbnRlbnRzID0gdGV4dC50cmltKCk7Ci0JCWlmIChjb250ZW50cy50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoInVybCgiKSAmJiAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRlbnRzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIikiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHN0cmlwICJ1cmwoIiwgIikiCi0JCQljb250ZW50cyA9IGNvbnRlbnRzLnN1YnN0cmluZyg0LCBjb250ZW50cy5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCWNvbnRlbnRzID0gc3RyaXBRdW90ZXMoY29udGVudHMpOwotCi0JCXJldHVybiBjb250ZW50czsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZE5leHRTaWduaWZpY2FudE5vZGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydE5vZGUpIHsKLQkJaWYgKHN0YXJ0Tm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBzdGFydE5vZGUuZ2V0TmV4dCgpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSk7Ci0JCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZE5vZGVCYWNrd2FyZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGU7Ci0JCWZvciAobm9kZSA9IHN0YXJ0Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQcmV2aW91cygpKSB7Ci0JCQlpZiAobm9kZS5nZXRTdGFydE9mZnNldCgpIDwgZW5kTm9kZS5nZXRTdGFydE9mZnNldCgpKSB7Ci0JCQkJbm9kZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIGlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5vZGUpID09IHR5cGUpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZE5vZGVGb3J3YXJkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUsIFN0cmluZyB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZTsKLQkJZm9yIChub2RlID0gc3RhcnROb2RlOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldE5leHQoKSkgewotCQkJaWYgKGVuZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJCW5vZGUgPSBudWxsOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZWxzZSBpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShub2RlKSA9PSB0eXBlKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmRQcmV2aW91c1NpZ25pZmljYW50Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0Tm9kZSkgewotCQlpZiAoc3RhcnROb2RlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IHN0YXJ0Tm9kZS5nZXRQcmV2aW91cygpOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUobm9kZSk7Ci0JCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETyAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMpIHsKLQkJCQlyZXR1cm4gbm9kZTsKLQkJCX0KLQkJCW5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0Q2xhc3NTdHJpbmcoT2JqZWN0IG9iamVjdCkgewotCQlpZiAob2JqZWN0ID09IG51bGwpIHsKLQkJCXJldHVybiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gb2JqZWN0LmdldENsYXNzKCkudG9TdHJpbmcoKTsKLQkJCWludCBsYXN0UGVyaW9kID0gbmFtZS5sYXN0SW5kZXhPZignLicpOwotCQkJcmV0dXJuIG5hbWUuc3Vic3RyaW5nKGxhc3RQZXJpb2QgKyAxKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuIENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTkRFRklORUQ7Ci0JCX0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIENTU1JlZ2lvbkNvbnRleHRzLkNTU19VTkRFRklORUQ7Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCXJldHVybiByZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldExlbmd0aERpZmZlcmVuY2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3Tm9kZXMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZE5vZGVzKSB7Ci0JCWludCBuZXdMZW4gPSBnZXRUZXh0TGVuZ3RoKG5ld05vZGVzKTsKLQkJaW50IG9sZExlbiA9IGdldFRleHRMZW5ndGgob2xkTm9kZXMpOwotCQlyZXR1cm4gbmV3TGVuIC0gb2xkTGVuOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFJlZ2lvblRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gcmVnaW9ucy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGkubmV4dCgpOwotCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJYnVmLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGdldFRleHRMZW5ndGgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgbm9kZXMpIHsKLQkJaW50IGxlbmd0aCA9IDA7Ci0KLQkJaWYgKG5vZGVzICE9IG51bGwpIHsKLQkJCWZvciAoRW51bWVyYXRpb24gZSA9IG5vZGVzLmVsZW1lbnRzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoICs9IGZsYXROb2RlLmdldFRleHQoKS5sZW5ndGgoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSB0b2tlbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNMZW5ndGgoQ1NTVGV4dFRva2VuIHRva2VuKSB7Ci0JCWlmICh0b2tlbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodG9rZW4ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0b2tlbi5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCWRvdWJsZSBudW1iZXIgPSBEb3VibGUucGFyc2VEb3VibGUodG9rZW4uaW1hZ2UpOwotCQkJaWYgKG51bWJlciA9PSAwLjApCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NlbGVjdG9yVGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblR5cGUocmVnaW9uKTsKLQkJaWYgKENTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUodHlwZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pIHsKLQkJCS8vIFN0cmluZyB0ZXh0ID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQkJLy8gaWYgKHRleHQgIT0gbnVsbCAmJiB0ZXh0LmluZGV4T2YoJy4nKSA9PSAwKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vIH0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFF1b3RlcyhTdHJpbmcgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBjb250ZW50cyA9IHRleHQudHJpbSgpOwotCQlpZiAoMiA8PSBjb250ZW50cy5sZW5ndGgoKSkgewotCQkJY2hhciBmaXJzdCA9IGNvbnRlbnRzLmNoYXJBdCgwKTsKLQkJCWNoYXIgbGFzdCA9IGNvbnRlbnRzLmNoYXJBdChjb250ZW50cy5sZW5ndGgoKSAtIDEpOwotCQkJaWYgKChmaXJzdCA9PSAnXCInICYmIGxhc3QgPT0gJ1wiJykgfHwgKGZpcnN0ID09ICdcJycgJiYgbGFzdCA9PSAnXCcnKSkgewotCQkJCWNvbnRlbnRzID0gY29udGVudHMuc3Vic3RyaW5nKDEsIGNvbnRlbnRzLmxlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGVjdFF1b3RlKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZWZhdWx0UXVvdGUpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIGRlZmF1bHRRdW90ZTsKLQkJZmluYWwgU3RyaW5nIERfUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBTX1FVT1RFID0gIlwnIjsgLy8kTk9OLU5MUy0xJAotCi0JCWludCBkSW5kZXggPSBzb3VyY2UuaW5kZXhPZihEX1FVT1RFKTsKLQkJaW50IHNJbmRleCA9IHNvdXJjZS5pbmRleE9mKFNfUVVPVEUpOwotCQlpZiAoZEluZGV4IDwgMCAmJiBzSW5kZXggPCAwKSB7Ci0JCQlyZXR1cm4gZGVmYXVsdFF1b3RlOwotCQl9Ci0JCWVsc2UgaWYgKGRJbmRleCA8IDApIHsKLQkJCXJldHVybiBEX1FVT1RFOwotCQl9Ci0JCWVsc2UgaWYgKHNJbmRleCA8IDApIHsKLQkJCXJldHVybiBTX1FVT1RFOwotCQl9Ci0JCWVsc2UgaWYgKGRJbmRleCA8IHNJbmRleCkgewotCQkJcmV0dXJuIFNfUVVPVEU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRF9RVU9URTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdHJpcFN1cnJvdW5kaW5nU3BhY2UoSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMpIHsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCXdoaWxlICghcmVnaW9ucy5pc0VtcHR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCXJlZ2lvbnMucmVtb3ZlKDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKCFyZWdpb25zLmlzRW1wdHkoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQlyZWdpb25zLnJlbW92ZShyZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydFJ1bGVDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9JbXBvcnRSdWxlQ29sbGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzRlYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydFJ1bGVDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVNoZWV0OwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBJbXBvcnRSdWxlQ29sbGVjdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHJvdGVjdGVkIGphdmEudXRpbC5WZWN0b3IgcnVsZXMgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIElDU1NTdHlsZVNoZWV0IHRhcmdldCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1wb3J0UnVsZUNvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEltcG9ydFJ1bGVDb2xsZWN0b3IoSUNTU1N0eWxlU2hlZXQgc2hlZXQpIHsKLQkJc3VwZXIoKTsKLQkJdGFyZ2V0ID0gc2hlZXQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGphdmEudXRpbC5WZWN0b3IgZ2V0UnVsZXMoKSB7Ci0JCXJldHVybiBydWxlczsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuTUVESUFSVUxFX05PREUgfHwgbm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJaWYgKHRhcmdldCAhPSBudWxsKSB7Ci0JCQkJSUNTU0ltcG9ydFJ1bGUgaW1wID0gKElDU1NJbXBvcnRSdWxlKSBub2RlOwotCQkJCWlmIChpbXAuZ2V0U3R5bGVTaGVldCgpICE9IHRhcmdldCkKLQkJCQkJcmV0dXJuIFRSQVZfUFJVTkU7Ci0JCQl9Ci0JCQlpZiAoIXJ1bGVzLmNvbnRhaW5zKG5vZGUpKQotCQkJCXJ1bGVzLmFkZChub2RlKTsKLQkJfQotCQlyZXR1cm4gVFJBVl9QUlVORTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL0ltcG9ydGVkQ29sbGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0ZWRDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM0NzUxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvSW1wb3J0ZWRDb2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSW1wb3J0ZWRDb2xsZWN0b3IgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5BYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcm90ZWN0ZWQgamF2YS51dGlsLlZlY3RvciBleHRlcm5hbHMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSW1wb3J0ZWRDb2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldFRyYXZlcnNlSW1wb3J0ZWQodHJ1ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIExpc3QgZ2V0RXh0ZXJuYWxzKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXByb3RlY3RlZCBzaG9ydCBwcmVOb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFU0hFRVRfTk9ERSkgewotCQkJaWYgKCFleHRlcm5hbHMuY29udGFpbnMobm9kZSkpIHsKLQkJCQlleHRlcm5hbHMuYWRkKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSkgewotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlyZXR1cm4gVFJBVl9QUlVORTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1JlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyNjI2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvUmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIHsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGN1ckRvY3VtZW50UmVnaW9uID0gbnVsbDsKLQlwcml2YXRlIGludCBjdXJyZW50ID0gLTE7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGludCBpbmRleCkgewotCQlzdXBlcigpOwotCi0JCXJlc2V0KHN0cnVjdHVyZWREb2N1bWVudCwgaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJc3VwZXIoKTsKLQkJcmVzZXQoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gY3VyRG9jdW1lbnRSZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJaWYgKGRvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChjdXJyZW50IDwgMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGN1cnJlbnQgPCBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcmV2KCkgewotCQkvLyB0aGUgc2FtZSBhcyBoYXNOZXh0KCkKLQkJcmV0dXJuIGhhc05leHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gbmV4dCgpIHsKLQkJaWYgKGRvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGN1cnJlbnQgPCAwIHx8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKSA9PSBudWxsIHx8IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPD0gY3VycmVudCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoY3VycmVudCk7Ci0JCWN1ckRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb247Ci0KLQkJaWYgKGN1cnJlbnQgPj0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpIHsKLQkJCWRvY3VtZW50UmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQkJY3VycmVudCA9IC0xOwotCQl9Ci0JCWN1cnJlbnQrKzsKLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBwcmV2KCkgewotCQlpZiAoZG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY3VycmVudCA8IDAgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpID09IG51bGwgfHwgZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA8PSBjdXJyZW50KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLmdldChjdXJyZW50KTsKLQkJY3VyRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQotCQlpZiAoY3VycmVudCA9PSAwKSB7Ci0JCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQlpZiAoZG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQljdXJyZW50ID0gZG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKTsKLQkJCWVsc2UKLQkJCQljdXJyZW50ID0gMDsKLQkJfQotCQljdXJyZW50LS07Ci0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgaW50IGluZGV4KSB7Ci0JCWRvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4KTsKLQkJY3VyRG9jdW1lbnRSZWdpb24gPSBkb2N1bWVudFJlZ2lvbjsKLQkJaWYgKGRvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4KTsKLQkJCWN1cnJlbnQgPSBkb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuaW5kZXhPZihyZWdpb24pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiBmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQl0aGlzLmRvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0JCQljdXJEb2N1bWVudFJlZ2lvbiA9IGZsYXROb2RlOwotCQkJY3VycmVudCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5pbmRleE9mKHJlZ2lvbik7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkNvbGxlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1NlbGVjdGlvbkNvbGxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTIzOTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3Rpb25Db2xsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdGlvbkNvbGxlY3RvciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkFic3RyYWN0Q3NzVHJhdmVyc2VyIHsKLQotCWludCBzdGFydCwgZW5kOwotCUxpc3Qgc2VsZWN0ZWROb2RlczsKLQotCS8qKgotCSAqIFNlbGVjdGlvbkNvbGxlY3RvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTZWxlY3Rpb25Db2xsZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW4oSUNTU05vZGUgbm9kZSkgewotCQlzZWxlY3RlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBMaXN0IGdldFNlbGVjdGVkTm9kZXMoKSB7Ci0JCWlmIChzZWxlY3RlZE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgpOwotCQllbHNlCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdChzZWxlY3RlZE5vZGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCUluZGV4ZWRSZWdpb24gaU5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZTsKLQkJaWYgKGlOb2RlLmdldFN0YXJ0T2Zmc2V0KCkgPD0gZW5kICYmIHN0YXJ0IDwgaU5vZGUuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBpRmlyc3RDaGlsZCA9IChJbmRleGVkUmVnaW9uKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlJbmRleGVkUmVnaW9uIGlMYXN0Q2hpbGQgPSAoSW5kZXhlZFJlZ2lvbikgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCQlpZiAoaUZpcnN0Q2hpbGQgPT0gbnVsbCB8fCBzdGFydCA8IGlGaXJzdENoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgfHwgaUxhc3RDaGlsZC5nZXRFbmRPZmZzZXQoKSA8PSBlbmQpCi0JCQkJCXNlbGVjdGVkTm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIFRSQVZfQ09OVDsKLQkJfQotCQlpZiAoaU5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA+IGVuZCkKLQkJCXJldHVybiBUUkFWX1NUT1A7Ci0JCWVsc2UKLQkJCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbihpbnQgbmV3U3RhcnQsIGludCBuZXdFbmQpIHsKLQkJc3RhcnQgPSBuZXdTdGFydDsKLQkJZW5kID0gbmV3RW5kOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTkyYWFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ1NTU2VsZWN0b3JMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdG9yVmFsaWRhdG9yIHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBTZWxlY3RvclZhbGlkYXRvci4KLQkgKi8KLQlwdWJsaWMgU2VsZWN0b3JWYWxpZGF0b3IoU3RyaW5nIHRleHQpIHsKLQkJc3VwZXIoKTsKLQkJZlRleHQgPSB0ZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGV4dCBjb25zaXN0cyBvZiBvbmUgQ0xBU1Mgc2VsZWN0b3IuIHN5bnRheCBjaGVjawotCSAqIGlzIGEgbGl0dGxlIGxvb3NlICguMTIzIGlzIHBhc3NlZCkKLQkgKiAKLQkgKiAiLmNsYXNzIiAtPiB0cnVlICIuMTIzIiAtPiB0cnVlICIuY2xhc3MgLCAuY2xhc3MyIiAtPiBmYWxzZQotCSAqICIuY2xhc3MuY2xhc3MyIiAtPiBmYWxzZSAiLjEyM3t9IiAtPiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xhc3MoKSB7Ci0JCUlDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciA9IGdldE9ubHlPbmVTaW1wbGVTZWxlY3RvcigpOwotCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIChzZWxlY3Rvci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpID09IDEgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKSA9PSAwKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXh0IGNvbnNpc3RzIG9mIG9uZSBJRCBzZWxlY3Rvci4KLQkgKiAKLQkgKiAiI0lEIiAtPiB0cnVlICJIMSNteUlEIiAtPiBmYWxzZSAiI2FiY3t9IiAtPiBmYWxzZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSUQoKSB7Ci0JCUlDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciA9IGdldE9ubHlPbmVTaW1wbGVTZWxlY3RvcigpOwotCQlpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotCQkJcmV0dXJuIChzZWxlY3Rvci5nZXROYW1lKCkubGVuZ3RoKCkgPT0gMCAmJiBzZWxlY3Rvci5nZXROdW1PZkF0dHJpYnV0ZXMoKSA9PSAwICYmIHNlbGVjdG9yLmdldE51bU9mQ2xhc3NlcygpID09IDAgJiYgc2VsZWN0b3IuZ2V0TnVtT2ZJRHMoKSA9PSAxICYmIHNlbGVjdG9yLmdldE51bU9mUHNldWRvTmFtZXMoKSA9PSAwKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogb3ZlcmFsbCBjaGVjawotCSAqIAotCSAqICJQI2hvZ2U5OCArICo6aG92ZXIgPiBBOmxpbmssIEEuZXh0ZXJuYWw6dmlzaXRlZCIgLT4gdHJ1ZSAiSDEgSDIge30iIC0+Ci0JICogZmFsc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlwYXJzZSgpOwotCQlyZXR1cm4gKGZTZWxlY3Rvckxpc3QgIT0gbnVsbCAmJiBmU2VsZWN0b3JMaXN0LmdldEVycm9yQ291bnQoKSA9PSAwKTsKLQl9Ci0KLQlwcml2YXRlIElDU1NTaW1wbGVTZWxlY3RvciBnZXRPbmx5T25lU2ltcGxlU2VsZWN0b3IoKSB7Ci0JCXBhcnNlKCk7Ci0JCWlmIChmU2VsZWN0b3JMaXN0ICE9IG51bGwgJiYgZlNlbGVjdG9yTGlzdC5nZXRMZW5ndGgoKSA9PSAxKSB7Ci0JCQlJQ1NTU2VsZWN0b3Igc2VsZWN0b3IgPSBmU2VsZWN0b3JMaXN0LmdldFNlbGVjdG9yKDApOwotCQkJaW50IG5JdGVtID0gc2VsZWN0b3IuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAobkl0ZW0gPT0gMSkgewotCQkJCUlDU1NTZWxlY3Rvckl0ZW0gaXRlbSA9IHNlbGVjdG9yLmdldEl0ZW0oMCk7Ci0JCQkJaWYgKGl0ZW0gaW5zdGFuY2VvZiBJQ1NTU2ltcGxlU2VsZWN0b3IpIHsKLQkJCQkJcmV0dXJuIChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZSgpIHsKLQkJaWYgKGZTZWxlY3Rvckxpc3QgPT0gbnVsbCkgewotCQkJaWYgKGZUZXh0ICE9IG51bGwpIHsKLQkJCQlmU2VsZWN0b3JMaXN0ID0gbmV3IENTU1NlbGVjdG9yTGlzdEltcGwoZlRleHQpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwcml2YXRlIFN0cmluZyBmVGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBJQ1NTU2VsZWN0b3JMaXN0IGZTZWxlY3Rvckxpc3QgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9TZWxlY3RvcnNDb2xsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNhYTMyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvU2VsZWN0b3JzQ29sbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RvcnNDb2xsZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdENzc1RyYXZlcnNlciB7Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIHNlbGVjdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgVmVjdG9yIHNlbGVjdG9yc1RvQXZvaWQgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFNlbGVjdG9yc0NvbGxlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VHJhdmVyc2VJbXBvcnRlZChmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgYWRkU2VsZWN0b3JUb0F2b2lkKElDU1NTZWxlY3RvciBzZWxUb0F2b2lkKSB7Ci0JCWlmIChzZWxUb0F2b2lkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChzZWxlY3RvcnNUb0F2b2lkID09IG51bGwpCi0JCQlzZWxlY3RvcnNUb0F2b2lkID0gbmV3IFZlY3RvcigpOwotCi0JCWlmICghc2VsZWN0b3JzVG9Bdm9pZC5jb250YWlucyhzZWxUb0F2b2lkKSkKLQkJCXNlbGVjdG9yc1RvQXZvaWQuYWRkKHNlbFRvQXZvaWQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdG9yVG9Bdm9pZChJQ1NTU3R5bGVSdWxlIHJ1bGUpIHsKLQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gcnVsZS5nZXRTZWxlY3RvcnMoKTsKLQkJSXRlcmF0b3IgaXQgPSBsaXN0LmdldEl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlDU1NTZWxlY3RvciBzZWwgPSAoSUNTU1NlbGVjdG9yKSBpdC5uZXh0KCk7Ci0JCQlhZGRTZWxlY3RvclRvQXZvaWQoc2VsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBqYXZhLnV0aWwuTGlzdCBnZXRTZWxlY3RvcnMoKSB7Ci0JCXJldHVybiBzZWxlY3RvcnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHByZU5vZGUoSUNTU05vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFKSB7Ci0JCQlJQ1NTU3R5bGVSdWxlIHJ1bGUgPSAoSUNTU1N0eWxlUnVsZSkgbm9kZTsKLQkJCUlDU1NTZWxlY3Rvckxpc3QgbGlzdCA9IHJ1bGUuZ2V0U2VsZWN0b3JzKCk7Ci0JCQlJdGVyYXRvciBpdCA9IGxpc3QuZ2V0SXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChzZWxlY3RvcnNUb0F2b2lkICE9IG51bGwgJiYgc2VsZWN0b3JzVG9Bdm9pZC5jb250YWlucyhvYmopKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoIXNlbGVjdG9ycy5jb250YWlucyhvYmopKQotCQkJCQlzZWxlY3RvcnMuYWRkKG9iaik7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJfQotCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gSUNTU05vZGUuU1RZTEVTSEVFVF9OT0RFKSB7Ci0JCQlyZXR1cm4gVFJBVl9DT05UOwotCQl9Ci0JCXJldHVybiBUUkFWX1BSVU5FOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNlbGVjdG9yc1RvQXZvaWQoamF2YS51dGlsLlZlY3RvciBuZXdTZWxlY3RvcnNUb0F2b2lkKSB7Ci0JCXNlbGVjdG9yc1RvQXZvaWQgPSBuZXdTZWxlY3RvcnNUb0F2b2lkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MTQ2MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTEhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5QYXRoSGVscGVyOwotCi0vKioKLSAqIEh5cGVybGluayBtYW5hZ2VyLiBQcm92ZWQgdXNlZnVsIHNlcnZpY2VzIGxpa2UgbGluayBjb252ZXJzaW9uIEFuIHV0aWxpdHkKLSAqIGNsYXNzIHRvIGhlbHAgb3RoZXIgcGFyc3JlIG1vZHVsZXMgdG8gY29udmVydCBsaW5rcwotICovCi1wdWJsaWMgY2xhc3MgVVJMSGVscGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BST1RPQ09MX1NFQVJDSF9TSUcgPSAiZmlsZTovIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0xfU0lHID0gImZpbGU6Ly8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFJFTEFUSVZFX1BBVEhfU0lHID0gIi4uIjsvLyROT04tTkxTLTEkCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JXQVJEX1NMQVNIID0gIi8iOy8vJE5PTi1OTFMtMSQJCi0JcHJpdmF0ZSBVUkwgZkJhc2VVcmwgPSBudWxsOyAvLyBiYXNlIHVybC4gYXNzdW1lZCB0byBhIGFic3VsdXRlIHVybAotCXByaXZhdGUgU3RyaW5nIGZCYXNlVXJsU3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFVSTCBmRG9jUm9vdCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRvY1Jvb3RTdHJpbmcgPSBudWxsOwotCi0JcHVibGljIFVSTEhlbHBlcihTdHJpbmcgYmFzZVVybCkgewotCQlpbml0aWFsaXplKGJhc2VVcmwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBVUkxIZWxwZXIoU3RyaW5nIGJhc2VVcmwsIFN0cmluZyBkb2NSb290KSB7Ci0JCWluaXRpYWxpemUoYmFzZVVybCwgZG9jUm9vdCk7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBhZHVqdXN0IGZvciBmaWxlIHVybAotCSAqLwotCXB1YmxpYyBTdHJpbmcgYWRqdXN0RmlsZVByb3RvY29sVXJsKFN0cmluZyB1cmwpIHsKLQkJaWYgKHVybC5zdGFydHNXaXRoKEZJTEVfUFJPVE9DT0xfU0VBUkNIX1NJRykpIHsKLQkJCXVybCA9IEZJTEVfUFJPVE9DT0xfU0lHICsgdXJsLnN1YnN0cmluZyhGSUxFX1BST1RPQ09MX1NFQVJDSF9TSUcubGVuZ3RoKCkpOwotCQl9Ci0JCXJldHVybiB1cmw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgY29udmVydChTdHJpbmcgdXJsLCBVUkwgYmFzZVVybCwgU3RyaW5nIHVybFN0cmluZykgewotCQlTdHJpbmcgYWJzVXJsID0gdXJsOwotCQlpZiAoYmFzZVVybCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCS8vIGRvIHNwZWNpYWwgdGhpbmcgZmlsZSBwcm90b2NvbAotCQkJCWlmIChiYXNlVXJsLmdldFByb3RvY29sKCkuZXF1YWxzSWdub3JlQ2FzZSgiZmlsZSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCQkvLyByZW1vdmUgdGhlIGZpc3QKLQkJCQkJaWYgKHVybC5zdGFydHNXaXRoKCIvIikpLy8kTk9OLU5MUy0xJAotCQkJCQkJdXJsID0gdXJsLnN1YnN0cmluZygxKTsKLQkJCQkJLy8gZW1wdHkgc3RyaW5nIGNhdXNlcyBtYWxmb3JtZWQgZXhjZXB0aW9uCi0JCQkJCVN0cmluZyB0ZW1wVXJsID0gdXJsOwotCQkJCQlpZiAoIiIuZXF1YWxzKHVybCkpLy8kTk9OLU5MUy0xJAotCQkJCQkJdGVtcFVybCA9ICIgIjsvLyROT04tTkxTLTEkCi0JCQkJCVVSTCBuZXdVcmwgPSBuZXcgVVJMKGJhc2VVcmwsIHRlbXBVcmwpOwotCQkJCQkvLyBkbyBleHRyYSBtYXRoIGZvciBmaWxlIHByb3RvY29sIHRvIHN1cHBvcnQgaWUgYmFzZWQKLQkJCQkJYWJzVXJsID0gYWRqdXN0RmlsZVByb3RvY29sVXJsKG5ld1VybC50b1N0cmluZygpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVVSTCBuZXdVcmwgPSBuZXcgVVJMKGZCYXNlVXJsLCB1cmwpOwotCQkJCQlhYnNVcmwgPSBuZXdVcmwudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCQl9Ci0JCQkvLyBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8gZm9yd2FyZCBzbGFzaAotCQkJYWJzVXJsID0gUGF0aEhlbHBlci5zd2l0Y2hUb0ZvcndhcmRTbGFzaGVzKGFic1VybCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0aGUgZ2l2ZW4gbWF5IGJlIGJhc2VkIG9uIGZpbGUKLQkJCWlmICh1cmxTdHJpbmcgIT0gbnVsbCkgewotCQkJCS8vIHN3aWNoIHRoZSB1cmwgdG8gcHJvcGVyIGRpcmVjdGlvbgotCQkJCXVybCA9IFBhdGhIZWxwZXIucmVtb3ZlTGVhZGluZ1NlcGFyYXRvcih1cmwpOwotCQkJCUZpbGUgZmxlID0gbmV3IEZpbGUodXJsU3RyaW5nLCB1cmwpOwotCQkJCWFic1VybCA9IGZsZS5nZXRQYXRoKCk7Ci0KLQkJCX0KLQkJCS8vIGNvbnZlcnQgZXZlcnl0aGluZyB0byBmb3J3YXJkIHNsYXNoCi0JCQlhYnNVcmwgPSBQYXRoSGVscGVyLnN3aXRjaFRvRm9yd2FyZFNsYXNoZXMoYWJzVXJsKTsKLQotCQkJLy8gaWYgdGhlIHBhdGggZW5kcyB3aXRoICIuLiIgd2UgbmVlZCB0byBhZGQgYSB0ZXJtaW5hdGluZyBzbGFzaAotCQkJLy8gb3IKLQkJCS8vIGVsc2UgdGhlIGxpbmsgd2lsbCBub3QgYmUgcmVzb2x2ZWQgY29ycmVjdGx5LiAoaXQgd2lsbCBsb29rCi0JCQkvLyBsaWtlCi0JCQkvLyAvdXJsL3BhdGgvdG8vc29tZXdoZXJlLy4uIGluc3RlYWQgb2YgL3VybC9wYXRoL3RvLwotCQkJaWYgKGFic1VybC5lbmRzV2l0aChGT1JXQVJEX1NMQVNIICsgUkVMQVRJVkVfUEFUSF9TSUcpKSB7Ci0JCQkJYWJzVXJsICs9IEZPUldBUkRfU0xBU0g7Ci0JCQl9Ci0JCX0KLQotCQkvLyByZXNvbHZlIHJlbGF0aXZlIHBhdGggdG8gYWJzb2x1dGUKLQkJYWJzVXJsID0gUGF0aEhlbHBlci5hZGp1c3RQYXRoKGFic1VybCk7Ci0JCXJldHVybiBhYnNVcmw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoU3RyaW5nIGJhc2VVcmwsIFN0cmluZyBkb2NSb290KSB7Ci0JCS8vCi0JCS8vIEZpbmQgb3V0IHdoZXRoZXIgYmFlcyB1cmwgaXMgYSB1cmwgb3IgZmlsZSBuYW1lCi0JCS8vCi0JCXRyeSB7Ci0JCQlTdHJpbmcgdGVtcCA9IFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChiYXNlVXJsKTsKLQkJCWZCYXNlVXJsID0gbmV3IFVSTCh0ZW1wKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG11ZSkgewotCQl9Ci0JCWlmIChmQmFzZVVybCA9PSBudWxsKSB7Ci0JCQkvLyBpdCBpcyBhIGZpbGUgYmFzZWQgdXJsCi0JCQlmQmFzZVVybFN0cmluZyA9IGJhc2VVcmw7Ci0JCX0KLQotCQkvLyBkbyB0aGUgc2FtZSBmb3IgZG9jIHJvb3QKLQkJaWYgKGRvY1Jvb3QgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlTdHJpbmcgdGVtcCA9IFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChkb2NSb290KTsKLQkJCQlmRG9jUm9vdCA9IG5ldyBVUkwodGVtcCk7Ci0KLQkJCX0KLQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbXVlKSB7Ci0JCQl9Ci0JCQlpZiAoZkRvY1Jvb3QgPT0gbnVsbCkgewotCQkJCS8vIGl0IGlzIGEgZmlsZSBiYXNlZCB1cmwKLQkJCQlmRG9jUm9vdFN0cmluZyA9IGRvY1Jvb3Q7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0IHRoZSBnaXZlbiB1cmwgdG8gYSBhYm9sdXRlIHVybCB1c2luZyB0aGUgYmFzZSB1cmwgSW5wdXQgdXJsIGNhbgotCSAqIGJlIG9mIGFueSBvdGhlIGZvbGxvd2luZyBmb3JtYXQgQWJzb2x1dGUgdXJscyAtLS0tLS0tLS0tLS0tLSAuCi0JICogaHR0cDovL3d3dy5mb28uY29tLyAuIGh0dHA6Ly93d3cuZm9vLmNvbSAuIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIgLgotCSAqIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIvIC4gaHR0cDovL3d3dy5mb28uY29tL2luZGV4Lmh0bWwgLgotCSAqIGh0dHA6Ly93d3cuZm9vLmNvbS9mb2xkZXIvaW5kZXguaHRtbCAuCi0JICogaHR0cDovL3d3dy5mb28uY29tL2ZvbGRlci8uLi9pbmRleC5odG1sIFVybCByZWxhdGl2ZSBvbiBkb2N1bWVudCByb290Ci0JICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAuIC8gLiAvZm9sZGVyIC4gL2luZGV4Lmh0bWwgLgotCSAqIC9mb2xkZXIvaW5kZXguaHRtbCAuIC9mb2xkZXIvLi4vaW5kZXguaHRtbAotCSAqIAotCSAqIFNlbGYgcmVsYXRpdmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAuIGluZGV4Lmh0bWwgLiAuL2luZGV4Lmh0bWwgLgotCSAqIC4uL2luZGV4Lmh0bWwgLiBmb2xkZXIvaW5kZXguaHRtbCAuIGZvbGRlci8uLi9pbmRleC5odG1sCi0JICogCi0JICogZmlsZSBiYXNlZCB1cmwgYWRkcyBhbm90aGVyIGRpbWVuc2lvbiBzaW5jZSBpdCBkb2Vzbid0IGhhdmUgYSBkb2N1bWVudAotCSAqIHJvb3QgU28gdXNlcyBmRG9jUm9vdCBpZiBwcm92aWRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9BYnNvbHV0ZShTdHJpbmcgdXJsKSB7Ci0JCVN0cmluZyBhYnNVcmwgPSB1cmw7Ci0KLQkJVVJMIG5ld1VybCA9IG51bGw7Ci0JCS8vIHRyeSB0byBzZWUgaXQgaXMgYSBhYnNvbHV0ZSB1cmwKLQkJdHJ5IHsKLQkJCW5ld1VybCA9IG5ldyBVUkwodXJsKTsKLQkJfQotCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1lKSB7Ci0JCX0KLQkJLy8gaWYgZG9jdW1lbnQgcm9vdCBpcyBwcm92aWRlZAotCQkvLyBkbyBzcGVjaWFsIGNhc2UKLQkJaWYgKG5ld1VybCA9PSBudWxsKSB7Ci0JCQlpZiAoZkRvY1Jvb3QgPT0gbnVsbCAmJiBmRG9jUm9vdFN0cmluZyA9PSBudWxsKSB7Ci0JCQkJLy8gdHJ5IHRvIGNoZWNrIHJlbGF0aXZlIHVybAotCQkJCWFic1VybCA9IGNvbnZlcnQodXJsLCBmQmFzZVVybCwgZkJhc2VVcmxTdHJpbmcpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZG9jIHJvb3QgaXMgcHJvdmlkZWQKLQkJCQkvLyBpZiB0aGUgdXJsIGlzIGEgZG9jIHJvb3QgYmFzZWQgdXNlIGRvYyByb290Ci0KLQkJCQlpZiAodXJsLnN0YXJ0c1dpdGgoIi8iKSkvLyROT04tTkxTLTEkCi0JCQkJCWFic1VybCA9IGNvbnZlcnQodXJsLCBmRG9jUm9vdCwgZkRvY1Jvb3RTdHJpbmcpOwotCQkJCWVsc2UKLQkJCQkJYWJzVXJsID0gY29udmVydCh1cmwsIGZCYXNlVXJsLCBmQmFzZVVybFN0cmluZyk7Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYWJzVXJsOwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgZnJvbSBhbiBhYnNvbHV0ZSB1cmwgdG8gcmVsYXRpdmUgdXJsIGJhc2VkIG9uIHRoZSBnaXZlbiB1cmwKLQkgKiBCb3RoIGFyZSBhc3N1bWVkIHRvIGJlIGFibHN1dGUgdXJsCi0JICovCi0JcHVibGljIFN0cmluZyB0b1JlbGF0aXZlKFN0cmluZyB1cmwsIFN0cmluZyBkb2N1bWVudFVybCkgewotCQlTdHJpbmcgb3V0cHV0ID0gdXJsOwotCQkvLyBhc3N1bWluZyBib3RoIHVybHMgYXJlIGFic29sdXRlCi0JCXRyeSB7Ci0JCQlVUkwgaW5wdXRVcmwgPSBuZXcgVVJMKHVybCk7Ci0JCQlVUkwgZG9jVXJsID0gbmV3IFVSTChkb2N1bWVudFVybCk7Ci0JCQkvLyBmaWx0ZXIgb3V0IGlmIHRoZSB1cmxzIGFyZSBub3QgZnJvIHRoZSBzYW1lIGRvbWFpbgotCQkJaWYgKCFpbnB1dFVybC5nZXRQcm90b2NvbCgpLmVxdWFscyhkb2NVcmwuZ2V0UHJvdG9jb2woKSkgfHwgIWlucHV0VXJsLmdldEhvc3QoKS5lcXVhbHMoZG9jVXJsLmdldEhvc3QoKSkgfHwgaW5wdXRVcmwuZ2V0UG9ydCgpICE9IGRvY1VybC5nZXRQb3J0KCkpCi0JCQkJcmV0dXJuIG91dHB1dDsKLQkJCS8vIGJvdGggdXJsIGFyZSBjb21pbmcgZm9ybSB0aGUgc2FtZSBwbGFjZQotCQkJLy8gc3RyaXAgb2ZmIHRoZSBkb21haW4gcGFydHMKLQkJCVN0cmluZyBpbnB1dE5hbWUgPSBpbnB1dFVybC5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgZG9jTmFtZSA9IGRvY1VybC5nZXRGaWxlKCk7Ci0JCQlvdXRwdXQgPSBQYXRoSGVscGVyLmNvbnZlcnRUb1JlbGF0aXZlKGlucHV0TmFtZSwgZG9jTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkgewotCQkJb3V0cHV0ID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMTW9kZWxQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL1VSTE1vZGVsUHJvdmlkZXJDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyYmI2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvVVJMTW9kZWxQcm92aWRlckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWw7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUFscmVhZHlFeGlzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VJblVzZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5QYXRoSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlByb2plY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBVUkxNb2RlbFByb3ZpZGVyQ1NTIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTU9ERUxfRk9SX1JFQUQgPSAxOwotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHRVRfTkVXX01PREVMX0ZPUl9SRUFEID0gMjsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX01PREVMX0ZPUl9FRElUID0gMzsKLQkvLyBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX05FV19NT0RFTF9GT1JfRURJVCA9IDQ7Ci0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfQlVGRkVSX1NJWkUgPSA0MDk2OwotCS8vIElNb2RlbE1hbmFnZXIKLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBVUkxNb2RlbFByb3ZpZGVyQ1NTKCkgewotCQlzdXBlcigpOwotCi0JCS8vIG9idGFpbiBtb2RlbCBtYW5hZ2VyCi0JCW1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIElEIGZyb20gYSBmaWxlbmFtZS4gVGhpcyBtdXN0IGJlIHNhbWUgYXMKLQkgKiBGaWxlTW9kZWxQcm92aWRlci5jYWxjdWxhdGVJZChJRmlsZSkKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSVBhdGggZnVsbElQYXRoKSB7Ci0JCXJldHVybiBmdWxsSVBhdGgudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q29tbW9uTW9kZWxGb3IoZmluYWwgSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIGZpbmFsIFN0cmluZyByZWYsIGZpbmFsIGludCB3aGljaCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZmlyc3QsIGNyZWF0ZSBhYnNvbHV0ZSB1cmwKLQkJU3RyaW5nIGFic1VSTCA9IHJlc29sdmVVUkkoYmFzZU1vZGVsLCByZWYsIHRydWUpOwotCQlpZiAoKGFic1VSTCA9PSBudWxsKSB8fCAoYWJzVVJMLmxlbmd0aCgpID09IDApKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIG5lZWQgdG8gcmVtb3ZlIGZpbGU6Ly8gc2NoZW1lIGlmIG5lY2Vzc2FyeQotCQl0cnkgewotCQkJZmluYWwgVVJMIGFVUkwgPSBuZXcgVVJMKGFic1VSTCk7Ci0JCQkvLyBBbiBhY3R1YWwgVVJMIHdhcyBnaXZlbiwgb25seSBmaWxlOi8vLyBpcyBzdXBwb3J0ZWQKLQkJCS8vIHJlc29sdmUgaXQgYnkgZmluZGluZyB0aGUgZmlsZSBpdCBwb2ludHMgdG8KLQkJCWlmICghYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoImZpbGUiKSAmJiAoYVVSTC5nZXRIb3N0KCkuZXF1YWxzKCJsb2NhbGhvc3QiKSB8fCBhVVJMLmdldEhvc3QoKS5sZW5ndGgoKSA9PSAwKSkgeyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQlhYnNVUkwgPSBhVVJMLmdldEZpbGUoKTsKLQkJCQkJZmluYWwgSVBhdGggaXBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQkJCQkvLyBpZiBwYXRoIGhhcyBhIGRldmljZSwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoCi0JCQkJCS8vIElQYXRoLlNFUEFSQVRPUiwgcmVtb3ZlIGl0Ci0JCQkJCWZpbmFsIFN0cmluZyBkZXZpY2UgPSBpcGF0aC5nZXREZXZpY2UoKTsKLQkJCQkJaWYgKChkZXZpY2UgIT0gbnVsbCkgJiYgKGRldmljZS5sZW5ndGgoKSA+IDApKSB7Ci0JCQkJCQlpZiAoZGV2aWNlLmNoYXJBdCgwKSA9PSBJUGF0aC5TRVBBUkFUT1IpIHsKLQkJCQkJCQlmaW5hbCBTdHJpbmcgbmV3RGV2aWNlID0gZGV2aWNlLnN1YnN0cmluZygxKTsKLQkJCQkJCQlhYnNVUkwgPSBpcGF0aC5zZXREZXZpY2UobmV3RGV2aWNlKS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZnVFeGMpIHsKLQkJfQotCi0JCS8vIG5leHQsIGRlY2lkZSBwcm9qZWN0Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlmaW5hbCBJUGF0aCBmdWxsSVBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2NhdGlvbihmdWxsSVBhdGgpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCS8vIGZ1bGxJUGF0aCBkb2Vzbid0IGV4aXN0IGluIHdvcmtzcGFjZQotCQkJcHJvamVjdCA9IGNvbnRhaW5lci5nZXRQcm9qZWN0KCk7Ci0JCX0KLQotCQkvLyBJZiBIVE1MIGRvY3VtZW50IGhhcyBhIGxpbmsgdG8gYW4gZXh0ZXJuIENTUyB3aGljaCBpcyBub3QgaW4KLQkJLy8gSVByb2plY3QKLQkJLy8gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvYXRpb24oKSBtYXkgcmV0dXJuIG51bGwuIFdlIG5lZWQgdG8gdGFrZQotCQkvLyBjYXJlCi0JCS8vIG9mIHRoaXMgY2FzZQotCi0JCS8vIG5vdywgZ2V0IGFic1VSTCdzIElGaWxlCi0JCWlmICgocHJvamVjdCAhPSBudWxsKSAmJiAocHJvamVjdC5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YoZnVsbElQYXRoKSA9PSBmYWxzZSkpIHsKLQkJCS8vIGl0J3MgYXQgb3V0c2lkZSBvZiBQcm9qZWN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IGZ1bGxJUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHByb2plY3QuZ2V0TG9jYXRpb24oKS5zZWdtZW50Q291bnQoKSk7Ci0JCQlJRmlsZSBmaWxlID0gKGZpbGVQYXRoICE9IG51bGwgJiYgIWZpbGVQYXRoLmlzRW1wdHkoKSkgPyBwcm9qZWN0LmdldEZpbGUoZmlsZVBhdGgpIDogbnVsbDsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQlpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9FRElUKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX1JFQUQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCX0KLQotCQkJLy8gc2V0dGluZyBzeW5jaHJvbml6YXRpb24gc3RhbXAgaXMgSU1vZGVsTWFuYWdlcidzIGNsaWVudCdzCi0JCQkvLyByZXNwb25zaWJpbGl0eQotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkKLQkJCQltb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJCS8vIG9idGFpbiByZXNvbHZlcgotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAocHJvamVjdCAhPSBudWxsKSA/IChVUklSZXNvbHZlcikgcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKSA6IG51bGw7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCS8vIFByb2plY3RSZXNvbHZlciBjYW4gdGFrZSBjYXJlIG9mIHRoZSBjYXNlIGlmIHByb2plY3QgaXMKLQkJCQkvLyBudWxsLgotCQkJCXJlc29sdmVyID0gbmV3IFByb2plY3RSZXNvbHZlcihwcm9qZWN0KTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIHRoZXJlIGlzIG5vIHByb2plY3QuIHdlIGNhbid0IGV4cGVjdCBJUHJvamVjdCBoZWxwIHRvIGNyZWF0ZQotCQkJLy8gaWQvaW5wdXRTdHJlYW0KLQkJCUZpbGUgZmlsZSA9IGZ1bGxJUGF0aC50b0ZpbGUoKTsKLQotCQkJLy8gb2JhdGluIGlkCi0JCQlpZCA9IGNhbGN1bGF0ZUlkKGZ1bGxJUGF0aCk7Ci0KLQkJCS8vIG9idGFpbiBJbnB1dFN0cmVhbQotCQkJdHJ5IHsKLQkJCQlpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKLQkJCQkvLyB0aGUgZmlsZSBkb2VzIG5vdCBleGlzdCwgb3Igd2UgZG9uJ3QgaGF2ZSByZWFkIHBlcm1pc3Npb24KLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQl0cnkgewotCQkJCWlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX0VESVQpIHsKLQkJCQkJbW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoaWQsIGluU3RyZWFtLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfUkVBRCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZSkgewotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gY2xvc2Ugbm93ICEKLQkJCQlpZiAoaW5TdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpblN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIHNldCBsb2NhdGlvbmlkCi0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldEJhc2VMb2NhdGlvbigpID09IG51bGwpIHsKLQkJCW1vZGVsLnNldEJhc2VMb2NhdGlvbihmdWxsSVBhdGgudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBTdHJpbmcgcmVmKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q29tbW9uTW9kZWxGb3IoYmFzZU1vZGVsLCByZWYsIEdFVF9NT0RFTF9GT1JfRURJVCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBmaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCi0JCS8vIGNyZWF0ZSBhIGZha2UgSW5wdXRTdHJlYW0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZXgpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlLCBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbk1vZGVsRm9yKGJhc2VNb2RlbCwgcmVmLCBHRVRfTU9ERUxfRk9SX1JFQUQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCQkvLyBjcmVhdGUgYSBmYWtlIElucHV0U3RyZWFtCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChpRmlsZSwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIHJpdSkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUFscmVhZHlFeGlzdHMgcmFlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKSB7Ci0JCWlmIChpRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbWFuYWdlciA9IGdldE1vZGVsTWFuYWdlcigpOwotCQlpZiAobWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1hbmFnZXIuZ2V0TmV3TW9kZWxGb3JFZGl0KGlGaWxlLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2Ugcml1KSB7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlQWxyZWFkeUV4aXN0cyByYWUpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKiA8Y29kZT5yZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3M8L2NvZGU+OiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MKLQkgKiBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZCB3aWxsIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcwotCSAqIGEgdmFsaWQgVVJJIHBvaW50aW5nIHRvIGFub3RoZXIgKGFwcHJvcHJpYXRlKSBwcm9qZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc29sdmVVUkkoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCWlmIChiYXNlTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGdldCByZXNvbHZlciBpbiBNb2RlbAotCQlmaW5hbCBVUklSZXNvbHZlciByZXNvbHZlciA9IGJhc2VNb2RlbC5nZXRSZXNvbHZlcigpOwotCi0JCS8vIHJlc29sdmUgdG8gYWJzb2x1dGUgdXJsCi0JCWZpbmFsIFN0cmluZyBhYnN1cmwgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSA6IG51bGw7Ci0JCWlmICgocmVzb2x2ZXIgIT0gbnVsbCkgJiYgKGFic3VybCA9PSBudWxsKSAmJiAocmVmICE9IG51bGwpICYmIChyZWYudHJpbSgpLmxlbmd0aCgpID4gMCkgJiYgKHJlZi50cmltKCkuY2hhckF0KDApID09ICcvJykpIHsKLQkJCS8vIHRvIHJlYWNoIGhlcmUgbWVhbnMgOgotCQkJLy8gcmVmIGlzIGEgRG9jcm9vdCByZWxhdGl2ZQotCQkJLy8gcmVzb2x2ZXIgY2FuJ3QgcmVzb2x2ZSByZWYKLQkJCS8vIHNvIHRoYXQgaHJlZiBpcyBhIGJyb2tlbiBhbmQgc2hvdWxkIG5vdCBjcmVhdGUgbW9kZWwKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCWlmICgoYWJzdXJsICE9IG51bGwpICYmIChhYnN1cmwubGVuZ3RoKCkgPiAwKSkgewotCQkJcmV0dXJuIGFic3VybDsKLQkJfQotCi0JCS8vIG1heWJlIHJlZiBpcyBhdCBvdXRzaWRlIG9mIHRoZSBQcm9qZWN0Ci0JCS8vIG9idGFpbiBkb2Nyb290OwotCQlmaW5hbCBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChyZXNvbHZlciAhPSBudWxsKSA/IHJlc29sdmVyLmdldFJvb3RMb2NhdGlvbigpIDogbnVsbDsKLQkJU3RyaW5nIGRvY3Jvb3QgPSBudWxsOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCWRvY3Jvb3QgPSBjb250YWluZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCWlmIChkb2Nyb290ID09IG51bGwpIHsKLQkJCWRvY3Jvb3QgPSBiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCX0KLQkJaWYgKGRvY3Jvb3QgPT0gbnVsbCkgewotCQkJLy8gc2hvdWxkIG5vdCBiZQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBvYnRhaW4gZG9jdW1lbnQgdXJsCi0JCVN0cmluZyBtb2RlbEJhc2VMb2NhdGlvbiA9IGJhc2VNb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJaWYgKChtb2RlbEJhc2VMb2NhdGlvbiA9PSBudWxsKSB8fCAobW9kZWxCYXNlTG9jYXRpb24ubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGZhbGxiYWNrLi4uCi0JCQltb2RlbEJhc2VMb2NhdGlvbiA9IGJhc2VNb2RlbC5nZXRJZCgpOwotCQl9Ci0JCWlmICgobW9kZWxCYXNlTG9jYXRpb24gPT0gbnVsbCkgfHwgKG1vZGVsQmFzZUxvY2F0aW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBpIGNhbid0IHJlc29sdmUgdXJpICEKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gcmVzb2x2ZSB1cmwKLQkJVVJMSGVscGVyIGhlbHBlciA9IG5ldyBVUkxIZWxwZXIoUGF0aEhlbHBlci5nZXRDb250YWluaW5nRm9sZGVyUGF0aChtb2RlbEJhc2VMb2NhdGlvbiksIFBhdGhIZWxwZXIuZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgoUGF0aEhlbHBlci5hcHBlbmRUcmFpbGluZ1VSTFNsYXNoKGRvY3Jvb3QpKSk7Ci0JCXJldHVybiBoZWxwZXIudG9BYnNvbHV0ZShyZWYpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWFiOTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLklWYWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogZm9yIGhvcml6b250YWwgdmFsdWUgb2YgJ2JhY2tncm91bmQtcG9zaXRpb24nCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQmFja2dyb3VuZFBvc2l0aW9uWFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTVGV4dFRva2VuW10gY29ycmVjdE1lYW5pbmdUb2tlbihDU1NUZXh0VG9rZW5bXSBzcmMpIHsKLQkJamF2YS51dGlsLkFycmF5TGlzdCBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlsaXN0LmFkZChzcmNbaV0pOwotCQl9Ci0JCUNTU1RleHRUb2tlbltdIHJldCA9IG5ldyBDU1NUZXh0VG9rZW5bbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3BYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkJUHJvcENNUHJvcGVydHkgcHJvcFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgewotCQkJCUlDU1NWYWx1ZUxpc3QgbGlzdCA9IChJQ1NTVmFsdWVMaXN0KSBvYmo7Ci0JCQkJSUNTU1ZhbHVlIHZhbHVlID0gKElDU1NWYWx1ZSkgbGlzdC5pdGVtKDApOwotCQkJCWlmICh2YWx1ZS5nZXRDc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1ZS5DU1NfUFJJTUlUSVZFX1ZBTFVFKSB7Ci0JCQkJCUlDU1NQcmltaXRpdmVWYWx1ZSBwcmltID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgdmFsdWU7Ci0JCQkJCWlmIChwcmltLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQpIHsKLQkJCQkJCS8vIGNoZWNrIG5vdCB0b3Agb3IgYm90dG9tCi0JCQkJCQlpZiAoIXByb3BYLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSAmJiBwcm9wWS5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkpIHsKLQkJCQkJCQkvLyBjYXNlIG9yZGVyIGlzIHZlcnRpY2FsIC0+IGhvcml6b250YWwKLQkJCQkJCQl2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzdHIgPSB2YWx1ZS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgewotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCWlmIChzdHIuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9CT1RUT00pIHx8IHN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzdHIpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQotCQkJCXRva2VucyA9IGNvcnJlY3RNZWFuaW5nVG9rZW4odG9rZW5zKTsKLQkJCQlpZiAodG9rZW5zLmxlbmd0aCA9PSAwKQotCQkJCQlzdHIgPSAiIjsvLyROT04tTkxTLTEkCi0JCQkJZWxzZSBpZiAodG9rZW5zLmxlbmd0aCA9PSAxICYmICh0b2tlbnNbMF0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9CT1RUT00pIHx8IHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpKQotCQkJCQlzdHIgPSAiIjsvLyROT04tTkxTLTEkCi0JCQkJZWxzZQotCQkJCQlzdHIgPSB0b2tlbnNbMF0uaW1hZ2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChzdHIgIT0gbnVsbCkgPyBzdHIgOiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgbmV3VmFsdWUgPSBudWxsOwotCQlTdHJpbmcgdmFsSCA9IHZhbHVlOwotCQlTdHJpbmcgdmFsViA9IHByb3BlcnRpZXMuZ2V0QmFja2dyb3VuZFBvc2l0aW9uWSgpOwotCQlpZiAodmFsViA9PSBudWxsIHx8IHZhbFYubGVuZ3RoKCkgPT0gMCkKLQkJCW5ld1ZhbHVlID0gdmFsSDsKLQkJZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8IHZhbEgubGVuZ3RoKCkgPT0gMCkgewotCQkJQ29sbGVjdGlvbiB2YWxYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpLmdldFZhbHVlcygpOwotCQkJQ29sbGVjdGlvbiB2YWxZID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkJUHJvcENNVXRpbC5taW51cyh2YWxZLCB2YWxYKTsKLQkJCUl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7Ci0JCQkJCS8vIG5lZWQgbm90IGNvbXBlbnNhdGUgZm9yIC4uLgotCQkJCQluZXdWYWx1ZSA9IHZhbFY7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNvbXBlbnNhdGUgZm9yIEhvcml6b250YWwgdmFsdWUKLQkJCWlmIChuZXdWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJLy8gY2hlY2sgdmFsViBpcyBsZW5ndGggb3Igbm90Ci0JCQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHZhbFYudHJpbSgpKTsKLQkJCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCQkJaWYgKHRva2VucyAhPSBudWxsICYmIHRva2Vucy5sZW5ndGggPiAwICYmIHRva2Vuc1swXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQluZXdWYWx1ZSA9IElWYWxJRC5WX0xFRlQgKyAiICIgKyB2YWxWOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQluZXdWYWx1ZSA9ICIwJSAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCXByb3BlcnRpZXMuc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiOWU5YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRQb3NpdGlvbllTdWJTdHlsZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01TdWJQcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTVmFsdWU7Ci0KLQotLyoqCi0gKiBmb3IgdmVydGljYWwgdmFsdWUgb2YgJ2JhY2tncm91bmQtcG9zaXRpb24nCi0gKi8KLXB1YmxpYyBjbGFzcyBCYWNrZ3JvdW5kUG9zaXRpb25ZU3ViU3R5bGVBZGFwdGVyIGltcGxlbWVudHMgSVN1YlByb3BlcnR5QWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgQ1NTVGV4dFRva2VuW10gY29ycmVjdE1lYW5pbmdUb2tlbihDU1NUZXh0VG9rZW5bXSBzcmMpIHsKLQkJamF2YS51dGlsLkFycmF5TGlzdCBsaXN0ID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUyAmJiBzcmNbaV0ua2luZCAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlsaXN0LmFkZChzcmNbaV0pOwotCQl9Ci0JCUNTU1RleHRUb2tlbltdIHJldCA9IG5ldyBDU1NUZXh0VG9rZW5bbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmV0KTsKLQkJcmV0dXJuIHJldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcykgewotCQlTdHJpbmcgc3RyID0gbnVsbDsKLQkJT2JqZWN0IG9iaiA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTikpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCVByb3BDTVByb3BlcnR5IHByb3BYID0gUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gpOwotCQkJUHJvcENNUHJvcGVydHkgcHJvcFkgPSBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWSk7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgewotCQkJCUlDU1NWYWx1ZUxpc3QgbGlzdCA9IChJQ1NTVmFsdWVMaXN0KSBvYmo7Ci0JCQkJaW50IGluZGV4ID0gMTsKLQkJCQlJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7Ci0JCQkJaWYgKHZhbHVlLmdldENzc1ZhbHVlVHlwZSgpID09IENTU1ZhbHVlLkNTU19QUklNSVRJVkVfVkFMVUUpIHsKLQkJCQkJSUNTU1ByaW1pdGl2ZVZhbHVlIHByaW0gPSAoSUNTU1ByaW1pdGl2ZVZhbHVlKSB2YWx1ZTsKLQkJCQkJaWYgKHByaW0uZ2V0UHJpbWl0aXZlVHlwZSgpID09IENTU1ByaW1pdGl2ZVZhbHVlLkNTU19JREVOVCkgewotCQkJCQkJLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20KLQkJCQkJCWlmICghcHJvcFguY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpICYmIHByb3BZLmNhbkhhdmUocHJpbS5nZXRTdHJpbmdWYWx1ZSgpKSkgewotCQkJCQkJCS8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4gaG9yaXpvbnRhbAotCQkJCQkJCWluZGV4ID0gMDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgbGlzdC5pdGVtKGluZGV4KSkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBJQ1NTVmFsdWUpIHsKLQkJCQlzdHIgPSAoKElDU1NWYWx1ZSkgb2JqKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlpZiAoIXN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0JPVFRPTSkgJiYgIXN0ci5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzdHIpOwotCQkJCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQotCQkJCXRva2VucyA9IGNvcnJlY3RNZWFuaW5nVG9rZW4odG9rZW5zKTsKLQkJCQlpZiAodG9rZW5zLmxlbmd0aCA9PSAxICYmICh0b2tlbnNbMF0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9CT1RUT00pIHx8IHRva2Vuc1swXS5pbWFnZS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX1RPUCkpKQotCQkJCQlzdHIgPSB0b2tlbnNbMF0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAodG9rZW5zLmxlbmd0aCA+IDEpCi0JCQkJCXN0ciA9IHRva2Vuc1sxXS5pbWFnZTsKLQkJCQllbHNlCi0JCQkJCXN0ciA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBuZXdWYWx1ZSA9IG51bGw7Ci0JCVN0cmluZyB2YWxIID0gcHJvcGVydGllcy5nZXRCYWNrZ3JvdW5kUG9zaXRpb25YKCk7Ci0JCVN0cmluZyB2YWxWID0gdmFsdWU7Ci0JCWlmICh2YWxIICE9IG51bGwgJiYgKHZhbEgudHJpbSgpLmVxdWFscygiMCUiKSAvKiBkZWZhdWx0IHZhbHVlICovfHwgLy8kTk9OLU5MUy0xJAotCQkJCQl2YWxILnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0xFRlQpIC8qCi0JCQkJCQkJCQkJCQkJCQkJICogYW5vdGhlcgotCQkJCQkJCQkJCQkJCQkJCSAqIGRlZmF1bHQKLQkJCQkJCQkJCQkJCQkJCQkgKiB2YWx1ZQotCQkJCQkJCQkJCQkJCQkJCSAqLykpCi0JCQl2YWxIID0gbnVsbDsKLQkJaWYgKHZhbFYgPT0gbnVsbCB8fCB2YWxWLmxlbmd0aCgpID09IDApCi0JCQluZXdWYWx1ZSA9IHZhbEg7Ci0JCWVsc2UgaWYgKHZhbEggPT0gbnVsbCB8fCB2YWxILmxlbmd0aCgpID09IDApIHsKLQkJCUNvbGxlY3Rpb24gdmFsWCA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJCUNvbGxlY3Rpb24gdmFsWSA9IFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKS5nZXRWYWx1ZXMoKTsKLQkJCVByb3BDTVV0aWwubWludXModmFsWSwgdmFsWCk7Ci0JCQlJdGVyYXRvciBpdCA9IHZhbFkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXQubmV4dCgpOwotCQkJCWlmIChvYmoudG9TdHJpbmcoKS5lcXVhbHModmFsVi50b0xvd2VyQ2FzZSgpKSkgewotCQkJCQkvLyBuZWVkIG5vdCBjb21wZW5zYXRlIGZvciAuLi4KLQkJCQkJbmV3VmFsdWUgPSB2YWxWOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjb21wZW5zYXRlIGZvciBIb3Jpem9udGFsIHZhbHVlCi0JCQlpZiAobmV3VmFsdWUgPT0gbnVsbCkgewotCQkJCS8vIGNoZWNrIHZhbFYgaXMgbGVuZ3RoIG9yIG5vdAotCQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCB2YWxWLnRyaW0oKSk7Ci0JCQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQkJCWlmICh0b2tlbnMgIT0gbnVsbCAmJiB0b2tlbnMubGVuZ3RoID4gMCAmJiB0b2tlbnNbMF0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkJbmV3VmFsdWUgPSBJVmFsSUQuVl9MRUZUICsgIiAiICsgdmFsVjsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UKLQkJCQkJbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCW5ld1ZhbHVlID0gdmFsSCArICIgIiArIHZhbFY7Ly8kTk9OLU5MUy0xJAotCQlwcm9wZXJ0aWVzLnNldEJhY2tncm91bmRQb3NpdGlvbihuZXdWYWx1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9CYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YjVmZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JhY2tncm91bmRTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdiYWNrZ3JvdW5kJyBwcm9wZXJ0eSAnYmFja2dyb3VuZCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JhY2tncm91bmQtYXR0YWNobWVudCcsICdiYWNrZ3JvdW5kLWNvbG9yJywgJ2JhY2tncm91bmQtaW1hZ2UnLAotICogJ2JhY2tncm91bmQtcG9zaXRpb24nLCAnYmFja2dyb3VuZC1yZXBlYXQnLAotICovCi1wdWJsaWMgY2xhc3MgQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQmFja2dyb3VuZFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgaW1hZ2UgPSAiIiwgcmVwZWF0ID0gIiIsIGF0dGFjaCA9ICIiLCBwb3MgPSAiIjsvLyROT04tTkxTLTUkLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUmVwZWF0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX1JFUEVBVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BBdHRhY2ggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQVRUQUNITUVOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BQb3MgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BSZXBlYXQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlyZXBlYXQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEF0dGFjaC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWF0dGFjaCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wUG9zLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCQlpZiAocG9zID09IG51bGwgfHwgcG9zLmxlbmd0aCgpIDw9IDApCi0JCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UKLQkJCQkJCXBvcyA9IHBvcyArICIgIiArIHRva2Vuc1tpXS5pbWFnZTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCQlpZiAocG9zID09IG51bGwgfHwgcG9zLmxlbmd0aCgpIDw9IDApCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlCi0JCQkJCXBvcyA9IHBvcyArICIgIiArIHRva2Vuc1tpXS5pbWFnZTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcEltYWdlLmdldE5hbWUoKSwgaW1hZ2UpOwotCQlkZXN0LnNldChwcm9wUmVwZWF0LmdldE5hbWUoKSwgcmVwZWF0KTsKLQkJZGVzdC5zZXQocHJvcEF0dGFjaC5nZXROYW1lKCksIGF0dGFjaCk7Ci0JCWRlc3Quc2V0KHByb3BQb3MuZ2V0TmFtZSgpLCBwb3MpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBpbWFnZSA9IG51bGwsIHJlcGVhdCA9IG51bGwsIGF0dGFjaCA9IG51bGwsIHBvcyA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BJbWFnZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19JTUFHRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BSZXBlYXQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEF0dGFjaCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFBvcyA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19QT1NJVElPTik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcEltYWdlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFJlcGVhdC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXJlcGVhdCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQXR0YWNoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJYXR0YWNoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BQb3MuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJCWlmIChwb3MgPT0gbnVsbCkKLQkJCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZQotCQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkgewotCQkJCWlmIChwb3MgPT0gbnVsbCkKLQkJCQkJcG9zID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UKLQkJCQkJcG9zID0gcG9zICsgIiAiICsgdG9rZW5zW2ldLmltYWdlOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkkpIHsKLQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcEltYWdlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGltYWdlOwotCQllbHNlIGlmIChwcm9wUmVwZWF0ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHJlcGVhdDsKLQkJZWxzZSBpZiAocHJvcEF0dGFjaCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBhdHRhY2g7Ci0JCWVsc2UgaWYgKHByb3BQb3MgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gcG9zOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5YjUwNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckJvdHRvbVNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1ib3R0b20nIHByb3BlcnR5ICdib3JkZXItYm90dG9tJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLWJvdHRvbS1jb2xvcicsICdib3JkZXItYm90dG9tLXN0eWxlJywgJ2JvcmRlci1ib3R0b20td2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyQm90dG9tU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gIiIsIHN0eWxlID0gIiIsIHdpZHRoID0gIiI7Ly8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wQ29sb3IuZ2V0TmFtZSgpLCBjb2xvcik7Ci0JCWRlc3Quc2V0KHByb3BTdHlsZS5nZXROYW1lKCksIHN0eWxlKTsKLQkJZGVzdC5zZXQocHJvcFdpZHRoLmdldE5hbWUoKSwgd2lkdGgpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSBudWxsLCBzdHlsZSA9IG51bGwsIHdpZHRoID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWlmIChwcm9wQ29sb3IgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gY29sb3I7Ci0JCWVsc2UgaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFdpZHRoID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHdpZHRoOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE0MDA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2JvcmRlci1jb2xvcicgcHJvcGVydHkgJ2JvcmRlci1jb2xvcicgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3AtY29sb3InLCAnYm9yZGVyLXJpZ2h0LWNvbG9yJywgJ2JvcmRlci1ib3R0b20tY29sb3InLAotICogJ2JvcmRlci1sZWZ0LWNvbG9yJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlckNvbG9yU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBCb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJaWRlbnRzW2orK10gPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWlkZW50c1tqKytdID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9DT0xPUikKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYzc5MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlckxlZnRTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItbGVmdCcgcHJvcGVydHkgJ2JvcmRlci1sZWZ0JyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLWxlZnQtY29sb3InLCAnYm9yZGVyLWxlZnQtc3R5bGUnLCAnYm9yZGVyLWxlZnQtd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyTGVmdFNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NGU0NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLXJpZ2h0JyBwcm9wZXJ0eSAnYm9yZGVyLXJpZ2h0JyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXJpZ2h0LWNvbG9yJywgJ2JvcmRlci1yaWdodC1zdHlsZScsICdib3JkZXItcmlnaHQtd2lkdGgnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyUmlnaHRTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGEzMzMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXInIHByb3BlcnR5ICdib3JkZXInIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ2JvcmRlci1jb2xvcicsCi0gKiAnYm9yZGVyLXN0eWxlJywgJ2JvcmRlci13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlclNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgY29sb3IgPSAiIiwgc3R5bGUgPSAiIiwgd2lkdGggPSAiIjsvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJUHJvcENNUHJvcGVydHkgcHJvcENvbG9yID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCWlmIChwcm9wU3R5bGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wV2lkdGguY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIGlmIChwcm9wQ29sb3IuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSKSB7Ci0JCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCkgewotCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OKSB7Ci0JCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQl3aGlsZSAoaSA8IHRva2Vucy5sZW5ndGgpIHsKLQkJCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJCQlpKys7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlidWYuYXBwZW5kKHRva2Vuc1tpXS5pbWFnZSk7Ci0JCQkJCWlmICh0b2tlbnNbaSsrXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpLS07Ci0JCQkJY29sb3IgPSBidWYudG9TdHJpbmcoKTsKLQkJCX0KLQkJfQotCi0JCWRlc3Quc2V0KHByb3BDb2xvci5nZXROYW1lKCksIGNvbG9yKTsKLQkJZGVzdC5zZXQocHJvcFN0eWxlLmdldE5hbWUoKSwgc3R5bGUpOwotCQlkZXN0LnNldChwcm9wV2lkdGguZ2V0TmFtZSgpLCB3aWR0aCk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9IG51bGwsIHN0eWxlID0gbnVsbCwgd2lkdGggPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXaWR0aCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BDb2xvciA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBjb2xvcjsKLQkJZWxzZSBpZiAocHJvcFN0eWxlID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHN0eWxlOwotCQllbHNlIGlmIChwcm9wV2lkdGggPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gd2lkdGg7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ZmI5NjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0JvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnYm9yZGVyLXN0eWxlJyBwcm9wZXJ0eSAnYm9yZGVyLXN0eWxlJyB3aWxsIGJlIGV4cGFuZGVkIHRvCi0gKiAnYm9yZGVyLXRvcC1zdHlsZScsICdib3JkZXItcmlnaHQtc3R5bGUnLCAnYm9yZGVyLWJvdHRvbS1zdHlsZScsCi0gKiAnYm9yZGVyLWxlZnQtc3R5bGUnLAotICovCi1wdWJsaWMgY2xhc3MgQm9yZGVyU3R5bGVTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEJvcmRlclN0eWxlU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJU3RyaW5nW10gZGVzdHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UgaWYgKGogPT0gMSkgewotCQkJZGVzdHNbMF0gPSBkZXN0c1sxXSA9IGRlc3RzWzJdID0gZGVzdHNbM10gPSBpZGVudHNbMF07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAyKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzJdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWRlc3RzWzBdID0gaWRlbnRzWzBdOwotCQkJZGVzdHNbMV0gPSBkZXN0c1szXSA9IGlkZW50c1sxXTsKLQkJCWRlc3RzWzJdID0gaWRlbnRzWzJdOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgayA9IDA7IGsgPCA0OyBrKyspCi0JCQkJZGVzdHNba10gPSBpZGVudHNba107Ci0JCX0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFLCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFLCBkZXN0c1sxXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSwgZGVzdHNbMl0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1NUWUxFLCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfU1RZTEUpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzI4Mzk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJUb3BTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItdG9wJyBwcm9wZXJ0eSAnYm9yZGVyLXRvcCcgd2lsbCBiZSBleHBhbmRlZCB0bwotICogJ2JvcmRlci10b3AtY29sb3InLCAnYm9yZGVyLXRvcC1zdHlsZScsICdib3JkZXItdG9wLXdpZHRoJywKLSAqLwotcHVibGljIGNsYXNzIEJvcmRlclRvcFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBjb2xvciA9ICIiLCBzdHlsZSA9ICIiLCB3aWR0aCA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wQ29sb3IgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9DT0xPUik7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BTdHlsZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFdpZHRoID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXN0eWxlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BXaWR0aC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWVsc2UgaWYgKHByb3BDb2xvci5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCWNvbG9yID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIpIHsKLQkJCQl3aWR0aCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9IQVNIKSB7Ci0JCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCXdoaWxlIChpIDwgdG9rZW5zLmxlbmd0aCkgewotCQkJCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQkJCWkrKzsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJCQkJaWYgKHRva2Vuc1tpKytdLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWktLTsKLQkJCQljb2xvciA9IGJ1Zi50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJZGVzdC5zZXQocHJvcENvbG9yLmdldE5hbWUoKSwgY29sb3IpOwotCQlkZXN0LnNldChwcm9wU3R5bGUuZ2V0TmFtZSgpLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KHByb3BXaWR0aC5nZXROYW1lKCksIHdpZHRoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGNvbG9yID0gbnVsbCwgc3R5bGUgPSBudWxsLCB3aWR0aCA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BDb2xvciA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX0NPTE9SKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2lkdGggPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFN0eWxlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJc3R5bGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcFdpZHRoLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJd2lkdGggPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSBpZiAocHJvcENvbG9yLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJY29sb3IgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUikgewotCQkJCXdpZHRoID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gpIHsKLQkJCQljb2xvciA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikgewotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJd2hpbGUgKGkgPCB0b2tlbnMubGVuZ3RoKSB7Ci0JCQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkgewotCQkJCQkJaSsrOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJYnVmLmFwcGVuZCh0b2tlbnNbaV0uaW1hZ2UpOwotCQkJCQlpZiAodG9rZW5zW2krK10ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0UpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaS0tOwotCQkJCWNvbG9yID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcENvbG9yID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGNvbG9yOwotCQllbHNlIGlmIChwcm9wU3R5bGUgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gc3R5bGU7Ci0JCWVsc2UgaWYgKHByb3BXaWR0aCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3aWR0aDsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9Cb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RhMDllNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFRva2VuOwotCi0KLS8qKgotICogRm9yICdib3JkZXItd2lkdGgnIHByb3BlcnR5ICdib3JkZXItd2lkdGgnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdib3JkZXItdG9wLXdpZHRoJywgJ2JvcmRlci1yaWdodC13aWR0aCcsICdib3JkZXItYm90dG9tLXdpZHRoJywKLSAqICdib3JkZXItbGVmdC13aWR0aCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBCb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQm9yZGVyV2lkdGhTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEgsIGRlc3RzWzBdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgsIGRlc3RzWzFdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRILCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgsIGRlc3RzWzNdKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nW10gaWRlbnRzID0gbmV3IFN0cmluZ1s0XTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfV0lEVEggfHwgcHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX1dJRFRIKQotCQkJCXJldHVybiBpZGVudHNbMl07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9XSURUSCkKLQkJCQlyZXR1cm4gaWRlbnRzWzNdOwotCQkJZWxzZQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NTU1Byb3BlcnR5Q29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NTU1Byb3BlcnR5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjQwNzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DU1NQcm9wZXJ0eUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1ZhbHVlOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQcm9wZXJ0eUNvbnRleHQgaW1wbGVtZW50cyBJQ1NTMlByb3BlcnRpZXMgewotCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBmUHJvcGVydGllcyA9IG5ldyBIYXNodGFibGUoKTsKLQlIYXNoU2V0IGZNb2RpZmllZCA9IG51bGw7Ci0JcHJpdmF0ZSBzdGF0aWMgamF2YS51dGlsLkhhc2h0YWJsZSBzdWJQcm9wZXJ0eUFkYXB0ZXJzOwotCXByaXZhdGUgc3RhdGljIGphdmEudXRpbC5IYXNodGFibGUgc2hvcnRoYW5kQWRhcHRlcnM7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTUHJvcGVydHlDb250ZXh0KCkgewotCQlzdXBlcigpOwotCQlpbml0U2hvcnRoYW5kQWRhcHRlcnMoKTsKLQkJaW5pdFN1YlByb3BlcnR5QWRhcHRlcnMoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ1NTUHJvcGVydHlDb250ZXh0KElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJc3VwZXIoKTsKLQkJaW5pdFNob3J0aGFuZEFkYXB0ZXJzKCk7Ci0JCWluaXRTdWJQcm9wZXJ0eUFkYXB0ZXJzKCk7Ci0JCWluaXRpYWxpemUoZGVjbCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBleHBvcnRzIGFsbCBwcm9wZXJ0eS92YWx1ZSBwYWlycyB0byAnZGVjbCcgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseUZ1bGwoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlFbnVtZXJhdGlvbiBrZXlzID0gZlByb3BlcnRpZXMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGtleSA9IGtleXMubmV4dEVsZW1lbnQoKTsKLQkJCU9iamVjdCB2YWwgPSBmUHJvcGVydGllcy5nZXQoa2V5KTsKLQkJCVN0cmluZyB2YWx1ZSA9ICh2YWwgaW5zdGFuY2VvZiBJQ1NTVmFsdWUpID8gKChJQ1NTVmFsdWUpIHZhbCkuZ2V0Q1NTVmFsdWVUZXh0KCkgOiB2YWwudG9TdHJpbmcoKTsKLQotCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPD0gMCkKLQkJCQlkZWNsLnJlbW92ZVByb3BlcnR5KGtleS50b1N0cmluZygpKTsKLQkJCWVsc2UKLQkJCQlkZWNsLnNldFByb3BlcnR5KGtleS50b1N0cmluZygpLCB2YWx1ZS50cmltKCksICh2YWwgaW5zdGFuY2VvZiBWYWx1ZURhdGEgJiYgKChWYWx1ZURhdGEpIHZhbCkuaW1wb3J0YW50KSA/ICIhaW1wb3J0YW50IiA6ICIiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBleHBvcnRzIG1vZGlmaWVkIHByb3BlcnR5L3ZhbHVlIHBhaXJzIHRvICdkZWNsJwotCSAqIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlNb2RpZmllZChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmIChkZWNsID09IG51bGwgfHwgZk1vZGlmaWVkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gZk1vZGlmaWVkLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBrZXkgPSBpdC5uZXh0KCk7Ci0JCQlPYmplY3QgdmFsID0gZlByb3BlcnRpZXMuZ2V0KGtleSk7Ci0JCQlTdHJpbmcgdmFsdWUgPSAodmFsIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSA/ICgoSUNTU1ZhbHVlKSB2YWwpLmdldENTU1ZhbHVlVGV4dCgpIDogKCh2YWwgIT0gbnVsbCkgPyB2YWwudG9TdHJpbmcoKSA6IG51bGwpOwotCi0JCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA8PSAwKQotCQkJCWRlY2wucmVtb3ZlUHJvcGVydHkoa2V5LnRvU3RyaW5nKCkpOwotCQkJZWxzZQotCQkJCWRlY2wuc2V0UHJvcGVydHkoa2V5LnRvU3RyaW5nKCksIHZhbHVlLnRyaW0oKSwgKHZhbCBpbnN0YW5jZW9mIFZhbHVlRGF0YSAmJiAoKFZhbHVlRGF0YSkgdmFsKS5pbXBvcnRhbnQpID8gIiFpbXBvcnRhbnQiIDogIiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGUgY2xvbmUgb2YgdGhpcyBjb250ZXh0Ci0JICovCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJQ1NTUHJvcGVydHlDb250ZXh0IGNsb25lID0gbmV3IENTU1Byb3BlcnR5Q29udGV4dCgpOwotCQlpZiAodGhpcy5mTW9kaWZpZWQgIT0gbnVsbCkKLQkJCWNsb25lLmZNb2RpZmllZCA9IChIYXNoU2V0KSB0aGlzLmZNb2RpZmllZC5jbG9uZSgpOwotCQllbHNlCi0JCQljbG9uZS5mTW9kaWZpZWQgPSBudWxsOwotCQljbG9uZS5mUHJvcGVydGllcyA9IChIYXNodGFibGUpIHRoaXMuZlByb3BlcnRpZXMuY2xvbmUoKTsKLQkJcmV0dXJuIGNsb25lOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gZXhwYW5kcyBhIHNob3J0LWhhbmQgcHJvcGVydHkncyB2YWx1ZSB0byBlYWNoIGxlYWYKLQkgKiBwcm9wZXJ0eSdzIHZhbHVlIGFuZCBzZXQgdGhlbSB0byAnZm9yZWlnbicKLQkgKiAKLQkgKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gW3Byb3A9Ym9yZGVyLXRvcCwgdmFsdWU9InNvbGlkIDFweCB5ZWxsb3ciXSB3aWxsIGJlCi0JICogZXhwYW5kZWQgdG8gW2JvcmRlci10b3AtY29sb3I9eWVsbG93LCBib3JkZXItdG9wLXN0eWxlPXNvbGlkLAotCSAqIGJvcmRlci10b3Atd2lkdGg9MXB4XSBhbmQgdGhleSBhcmUgc3RvcmVkIHRvICdmb3JlaWduJyBjb250ZXh0LgotCSAqIAotCSAqIE5vdGUgdGhhdCByZWN1cnNpdmVseSBzaG9ydGhhbmRlZCBwcm9wZXJ0eSBsaWtlICdib3JkZXInIHdpbGwgYmUKLQkgKiBleHBhbmRlZCB0byBhbGwgZGVzY2VuZGFudCBsZWFmIHByb3BlcnRpZXMgbGlrZQotCSAqICdib3JkZXItW3RvcC9yaWdodC9ib3R0b20vbGVmdF0tW2NvbG9yL3N0eWxlL3dpZHRoXScKLQkgKiAKLQkgKiBAcGFyYW0gcHJvcAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eQotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBmb3JlaWduCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbi5DU1NQcm9wZXJ0eUNvbnRleHQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgZXhwYW5kVG9MZWFmKFByb3BDTVByb3BlcnR5IHByb3AsIFN0cmluZyB2YWx1ZSwgQ1NTUHJvcGVydHlDb250ZXh0IGZvcmVpZ24pIHsKLQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQlpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU2hvcnRoYW5kQWRhcHRlciBhZGFwdGVyID0gKElTaG9ydGhhbmRBZGFwdGVyKSBzaG9ydGhhbmRBZGFwdGVycy5nZXQocHJvcCk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5leHBhbmQodmFsdWUsIGZvcmVpZ24pOwotCQkJCWZvcmVpZ24uc2V0KHByb3AuZ2V0TmFtZSgpLCAiIik7Ly8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcC5nZXROdW1DaGlsZCgpOyBpKyspIHsKLQkJCQkJT2JqZWN0IG9iaiA9IHByb3AuZ2V0Q2hpbGRBdChpKTsKLQkJCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5ICYmICEob2JqIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpKSB7Ci0JCQkJCQlQcm9wQ01Qcm9wZXJ0eSBleHBhbmRlZFByb3AgPSAoUHJvcENNUHJvcGVydHkpIG9iajsKLQkJCQkJCXZhbHVlID0gZm9yZWlnbi5nZXQoZXhwYW5kZWRQcm9wLmdldE5hbWUoKSk7Ci0JCQkJCQlleHBhbmRUb0xlYWYoZXhwYW5kZWRQcm9wLCB2YWx1ZSwgZm9yZWlnbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICghdmFsdWUuZXF1YWxzKGZvcmVpZ24uZ2V0KHByb3AuZ2V0TmFtZSgpKSkpIHsKLQkJCQlmb3JlaWduLnNldChwcm9wLmdldE5hbWUoKSwgdmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIG9mICdwcm9wJy4gUXVlcnlpbmcgdmFsdWUgbWVjaGFuaXNtIGNoZWNrcwotCSAqIHNob3J0LWhhbmQgcHJvcGVydGllcy4KLQkgKiAKLQkgKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gImJhY2tncm91bmQ9Zml4ZWQgd2hpdGUiIGlzIHNldCBpbiB0aGlzIGluc2F0bmNlIGFuZAotCSAqIHBhcmFtICJwcm9wPWJhY2tncm91bmQtY29sb3IiLCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUgIndoaXRlIi4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eSBwcm9wKSB7Ci0JCWlmIChwcm9wIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpIHsKLQkJCUlTdWJQcm9wZXJ0eUFkYXB0ZXIgYWRhcHRlciA9IChJU3ViUHJvcGVydHlBZGFwdGVyKSBzdWJQcm9wZXJ0eUFkYXB0ZXJzLmdldChwcm9wLmdldE5hbWUoKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyLmdldCh0aGlzKTsKLQkJfQotCQlTdHJpbmcgc3RyID0gZ2V0KHByb3AuZ2V0TmFtZSgpKTsKLQkJaWYgKChzdHIgPT0gbnVsbCB8fCBzdHIubGVuZ3RoKCkgPT0gMCkgJiYgcHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpID4gMCkgewotCQkJLy8gZ2V0IGV4cGFuZGVkIHByb3BlcnR5Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKTsgaSsrKSB7Ci0JCQkJUHJvcENNUHJvcGVydHkgcHJvcFBhcmVudCA9IHByb3Auc2hvcnRoYW5kQ29udGFpbmVyQXQoaSk7Ci0JCQkJU3RyaW5nIHN0clBhcmVudCA9IGdldChwcm9wUGFyZW50KTsKLQkJCQlpZiAoc3RyUGFyZW50ICE9IG51bGwgJiYgc3RyUGFyZW50LnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJSVNob3J0aGFuZEFkYXB0ZXIgYWRhcHRlciA9IChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3BQYXJlbnQpOwotCQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQlTdHJpbmcgZXh0cmFjdGVkVmFsdWUgPSBhZGFwdGVyLmV4dHJhY3Qoc3RyUGFyZW50LCBwcm9wKTsKLQkJCQkJCXJldHVybiAoZXh0cmFjdGVkVmFsdWUgIT0gbnVsbCkgPyBleHRyYWN0ZWRWYWx1ZSA6ICIiOy8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB2YWx1ZSBvZiAncHJvcCcuIFF1ZXJ5aW5nIHZhbHVlIG1lY2hhbmlzbSBkb2VzCi0JICogbm90IGNhcmUgc2hvcnRoYW5kIHByb3BlcnRpZXMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXQoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVN0cmluZyBzdHIgPSBudWxsOwotCQlPYmplY3Qgb2JqID0gZlByb3BlcnRpZXMuZ2V0KHByb3BOYW1lKTsKLQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKQotCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJZWxzZQotCQkJCXN0ciA9IG9iai50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiAoc3RyICE9IG51bGwpID8gc3RyIDogIiI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYXppbXV0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbiBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF6aW11dGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0FaSU1VVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb24gb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYmFja2dyb3VuZC1hdHRhY2htZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZEF0dGFjaG1lbnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0FUVEFDSE1FTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtaW1hZ2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRJbWFnZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfSU1BR0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtcG9zaXRpb24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb25YKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKSk7Ci0JCS8qCi0JCSAqIFN0cmluZyBzdHIgPSBudWxsOyBPYmplY3Qgb2JqID0KLQkJICogZlByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOyBpZiAob2JqICE9IG51bGwpIHsKLQkJICogUHJvcENNUHJvcGVydHkgcHJvcFggPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCSAqIFByb3BDTVByb3BlcnR5IHByb3BZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpOwotCQkgKiBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgeyBJQ1NTVmFsdWVMaXN0IGxpc3QgPQotCQkgKiAoSUNTU1ZhbHVlTGlzdCkgb2JqOyBJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKSBsaXN0Lml0ZW0oMCk7IGlmCi0JCSAqICh2YWx1ZS5nZXRDc3NWYWx1ZVR5cGUoKSA9PSBDU1NWYWx1ZS5DU1NfUFJJTUlUSVZFX1ZBTFVFKSB7Ci0JCSAqIElDU1NQcmltaXRpdmVWYWx1ZSBwcmltID0gKElDU1NQcmltaXRpdmVWYWx1ZSkgdmFsdWU7IGlmCi0JCSAqIChwcmltLmdldFByaW1pdGl2ZVR5cGUoKSA9PSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQpIHsgLy8gY2hlY2sKLQkJICogbm90IHRvcCBvciBib3R0b20gaWYgKCFwcm9wWC5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkgJiYKLQkJICogcHJvcFkuY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpKSB7IC8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4KLQkJICogaG9yaXpvbnRhbCB2YWx1ZSA9IChJQ1NTVmFsdWUpIGxpc3QuaXRlbSgxKTsgfSB9IH0gc3RyID0KLQkJICogdmFsdWUuZ2V0Q1NTVmFsdWVUZXh0KCk7IH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7IHN0ciA9Ci0JCSAqICgoSUNTU1ZhbHVlKW9iaikuZ2V0Q1NTVmFsdWVUZXh0KCk7IH0gZWxzZSBzdHIgPSBvYmoudG9TdHJpbmcoKTsgfQotCQkgKiByZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKSk7Ci0JCS8qCi0JCSAqIFN0cmluZyBzdHIgPSBudWxsOyBPYmplY3Qgb2JqID0KLQkJICogZlByb3BlcnRpZXMuZ2V0KFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pOyBpZiAob2JqICE9IG51bGwpIHsKLQkJICogUHJvcENNUHJvcGVydHkgcHJvcFggPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCk7Ci0JCSAqIFByb3BDTVByb3BlcnR5IHByb3BZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpOwotCQkgKiBpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlTGlzdCkgeyBJQ1NTVmFsdWVMaXN0IGxpc3QgPQotCQkgKiAoSUNTU1ZhbHVlTGlzdCkgb2JqOyBpbnQgaW5kZXggPSAxOyBJQ1NTVmFsdWUgdmFsdWUgPSAoSUNTU1ZhbHVlKQotCQkgKiBsaXN0Lml0ZW0oMCk7IGlmICh2YWx1ZS5nZXRDc3NWYWx1ZVR5cGUoKSA9PQotCQkgKiBDU1NWYWx1ZS5DU1NfUFJJTUlUSVZFX1ZBTFVFKSB7IElDU1NQcmltaXRpdmVWYWx1ZSBwcmltID0KLQkJICogKElDU1NQcmltaXRpdmVWYWx1ZSkgdmFsdWU7IGlmIChwcmltLmdldFByaW1pdGl2ZVR5cGUoKSA9PQotCQkgKiBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSURFTlQpIHsgLy8gY2hlY2sgbm90IHRvcCBvciBib3R0b20gaWYKLQkJICogKCFwcm9wWC5jYW5IYXZlKHByaW0uZ2V0U3RyaW5nVmFsdWUoKSkgJiYKLQkJICogcHJvcFkuY2FuSGF2ZShwcmltLmdldFN0cmluZ1ZhbHVlKCkpKSB7IC8vIGNhc2Ugb3JkZXIgaXMgdmVydGljYWwgLT4KLQkJICogaG9yaXpvbnRhbCBpbmRleCA9IDA7IH0gfSB9IHN0ciA9Ci0JCSAqICgoSUNTU1ZhbHVlKWxpc3QuaXRlbShpbmRleCkpLmdldENTU1ZhbHVlVGV4dCgpOyB9IGVsc2UgaWYgKG9iagotCQkgKiBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgeyAvLyBkbyBub3RoaW5nIC0tLSB2YWx1ZSBpcyBudWxsIH0gZWxzZSBzdHIgPQotCQkgKiBvYmoudG9TdHJpbmcoKTsgfSByZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJhY2tncm91bmQtcmVwZWF0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFja2dyb3VuZFJlcGVhdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUkVQRUFUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT00pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1ib3R0b20tY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckJvdHRvbUNvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItYm90dG9tLXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJCb3R0b21TdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWJvdHRvbS13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQm90dG9tV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1jb2xsYXBzZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyQ29sbGFwc2UoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xMQVBTRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1sZWZ0LWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJMZWZ0Q29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItbGVmdC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyTGVmdFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLWxlZnQtd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlckxlZnRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXJpZ2h0LWNvbG9yIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJSaWdodENvbG9yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci1yaWdodC1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyUmlnaHRTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItcmlnaHQtd2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclJpZ2h0V2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXNwYWNpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclNwYWNpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TUEFDSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXRvcC1jb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Qm9yZGVyVG9wQ29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGJvcmRlci10b3Atc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvcmRlclRvcFN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3JkZXItdG9wLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJUb3BXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgYm9yZGVyLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCb3JkZXJXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1dJRFRIKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjYXB0aW9uLXNpZGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENhcHRpb25TaWRlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DQVBUSU9OX1NJREUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNsZWFyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGVhcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xFQVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNsaXAgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXAoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXBCb3R0b20oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwTGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDbGlwUmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENsaXBUb3AoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjb2xvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29sb3IoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTE9SKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjb250ZW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT05URU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjb3VudGVyLWluY3JlbWVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q291bnRlckluY3JlbWVudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9JTkNSRU1FTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGNvdW50ZXItcmVzZXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvdW50ZXJSZXNldCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ09VTlRFUl9SRVNFVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZmxvYXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENzc0Zsb2F0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GTE9BVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY3VlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdWUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgY3VlLWFmdGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdWVBZnRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0FGVEVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBjdWUtYmVmb3JlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDdWVCZWZvcmUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NVRV9CRUZPUkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGN1cnNvciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q3Vyc29yKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVVJTT1IpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGRpcmVjdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlyZWN0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVJFQ1RJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGRpc3BsYXkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0RJU1BMQVkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGVsZXZhdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RWxldmF0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTEVWQVRJT04pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGVtcHR5LWNlbGxzIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbXB0eUNlbGxzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9FTVBUWV9DRUxMUykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC1mYW1pbHkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRGYW1pbHkoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXNpemUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc2l6ZS1hZGp1c3QgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTaXplQWRqdXN0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkVfQURKVVNUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXN0cmV0Y2ggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTdHJldGNoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUUkVUQ0gpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGZvbnQtc3R5bGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZvbnRTdHlsZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgZm9udC12YXJpYW50IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGb250VmFyaWFudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBmb250LXdlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Rm9udFdlaWdodCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9IRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFRlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxldHRlci1zcGFjaW5nIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMZXR0ZXJTcGFjaW5nKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MRVRURVJfU1BBQ0lORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGluZS1oZWlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIGxpc3Qtc3R5bGUtaW1hZ2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpc3RTdHlsZUltYWdlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBsaXN0LXN0eWxlLXBvc2l0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGVQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbGlzdC1zdHlsZS10eXBlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMaXN0U3R5bGVUeXBlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFyZ2luKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi1ib3R0b20gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbkJvdHRvbSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFyZ2luLWxlZnQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpbkxlZnQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJnaW4tcmlnaHQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpblJpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1hcmdpbi10b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1hcmdpblRvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWFya2VyLW9mZnNldCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFya2VyT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJLRVJfT0ZGU0VUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXJrcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWFya3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtYXgtaGVpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNYXhIZWlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9IRUlHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG1heC13aWR0aCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWF4V2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9XSURUSCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgbWluLWhlaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TWluSGVpZ2h0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fSEVJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBtaW4td2lkdGggcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1pbldpZHRoKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG9ycGhhbnMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE9ycGhhbnMoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09SUEhBTlMpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG91dGxpbmUtY29sb3IgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE91dGxpbmVDb2xvcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9DT0xPUikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgb3V0bGluZS1zdHlsZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0T3V0bGluZVN0eWxlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX1NUWUxFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBvdXRsaW5lLXdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdXRsaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIG92ZXJmbG93IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRPdmVyZmxvdygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1ZFUkZMT1cpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhZGRpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkcpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmctYm90dG9tIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nQm90dG9tKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFkZGluZy1sZWZ0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nTGVmdCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWRkaW5nLXJpZ2h0IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nUmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZGRpbmctdG9wIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWRkaW5nVG9wKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGFnZS1icmVhay1hZnRlciBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUJyZWFrQWZ0ZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQUZURVIpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBhZ2UtYnJlYWstYmVmb3JlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYWdlQnJlYWtCZWZvcmUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBR0VfQlJFQUtfQkVGT1JFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYWdlLWJyZWFrLWluc2lkZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUJyZWFrSW5zaWRlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0lOU0lERSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGF1c2UgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdXNlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGF1c2UtYWZ0ZXIgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdXNlQWZ0ZXIoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBVVNFX0FGVEVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwYXVzZS1iZWZvcmUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhdXNlQmVmb3JlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9CRUZPUkUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBpdGNoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaXRjaCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0gpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHBpdGNoLXJhbmdlIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQaXRjaFJhbmdlKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QSVRDSF9SQU5HRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgcGxheS1kdXJpbmcgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsYXlEdXJpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BMQVlfRFVSSU5HKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBwb3NpdGlvbiBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BPU0lUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBxdW90ZXMgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFF1b3RlcygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUVVPVEVTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSByaWNobmVzcyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmljaG5lc3MoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJQ0hORVNTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSByaWdodCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UmlnaHQoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJR0hUKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudXRpbC5kZWNsYXJhdGlvbi5JU2hvcnRoYW5kQWRhcHRlcgotCSAqIEBwYXJhbSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJU2hvcnRoYW5kQWRhcHRlciBnZXRTaG9ydGhhbmRBZGFwdGVyKFByb3BDTVByb3BlcnR5IHByb3ApIHsKLQkJcmV0dXJuIChJU2hvcnRoYW5kQWRhcHRlcikgc2hvcnRoYW5kQWRhcHRlcnMuZ2V0KHByb3ApOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc2l6ZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2l6ZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU0laRSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWsgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWFrKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBSykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlYWstaGVhZGVyIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVha0hlYWRlcigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfSEVBREVSKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzcGVhay1udW1lcmFsIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVha051bWVyYWwoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLX05VTUVSQUwpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHNwZWFrLXB1bmN0dWF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTcGVha1B1bmN0dWF0aW9uKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19QVU5DVFVBVElPTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgc3BlZWNoLXJhdGUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWVjaFJhdGUoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUVDSF9SQVRFKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSBzdHJlc3MgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmVzcygpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1RSRVNTKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0YWJsZS1sYXlvdXQgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRhYmxlTGF5b3V0KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UQUJMRV9MQVlPVVQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtYWxpZ24gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRBbGlnbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9BTElHTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC1kZWNvcmF0aW9uIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0RGVjb3JhdGlvbigpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9ERUNPUkFUSU9OKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0ZXh0LWluZGVudCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dEluZGVudCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9JTkRFTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHRleHQtc2hhZG93IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0U2hhZG93KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1NIQURPVykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdGV4dC10cmFuc2Zvcm0gcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRUcmFuc2Zvcm0oKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfVFJBTlNGT1JNKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB0b3AgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvcCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVE9QKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB1bmljb2RlLWJpZGkgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVuaWNvZGVCaWRpKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9VTklDT0RFX0JJREkpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHZlcnRpY2FsLWFsaWduIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWZXJ0aWNhbEFsaWduKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WRVJUSUNBTF9BTElHTikpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdmlzaWJpbGl0eSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmlzaWJpbGl0eSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVklTSUJJTElUWSkpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgdm9pY2UtZmFtaWx5IHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWb2ljZUZhbWlseSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB2b2x1bWUgcHJvcGVydHkgZGVmaW5pdGlvbiBpbiBDU1MyLgotCSAqIAotCSAqIEBleGNlcHRpb25vcmcudzNjLmRvbS5ET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBTWU5UQVhfRVJSOiBSYWlzZWQgaWYgdGhlIG5ldyB2YWx1ZSBoYXMgYSBzeW50YXggZXJyb3IKLQkgKiAgICAgICAgICAgICAgICBhbmQgaXMgdW5wYXJzYWJsZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIHRoaXMgcHJvcGVydHkgaXMKLQkgKiAgICAgICAgICAgICAgICByZWFkb25seS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZvbHVtZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9MVU1FKSk7Ci0JfQotCi0JLyoqCi0JICogU2VlIHRoZSB3aGl0ZS1zcGFjZSBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2hpdGVTcGFjZSgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0hJVEVfU1BBQ0UpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdpZG93cyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V2lkb3dzKCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURPV1MpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdpZHRoIHByb3BlcnR5IGRlZmluaXRpb24gaW4gQ1NTMi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9ub3JnLnczYy5kb20uRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgU1lOVEFYX0VSUjogUmFpc2VkIGlmIHRoZSBuZXcgdmFsdWUgaGFzIGEgc3ludGF4IGVycm9yCi0JICogICAgICAgICAgICAgICAgYW5kIGlzIHVucGFyc2FibGUuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiB0aGlzIHByb3BlcnR5IGlzCi0JICogICAgICAgICAgICAgICAgcmVhZG9ubHkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaWR0aCgpIHsKLQkJcmV0dXJuIGdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfV0lEVEgpKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWUgdGhlIHdvcmQtc3BhY2luZyBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0V29yZFNwYWNpbmcoKSB7Ci0JCXJldHVybiBnZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dPUkRfU1BBQ0lORykpOwotCX0KLQotCS8qKgotCSAqIFNlZSB0aGUgei1pbmRleCBwcm9wZXJ0eSBkZWZpbml0aW9uIGluIENTUzIuCi0JICogCi0JICogQGV4Y2VwdGlvbm9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFNZTlRBWF9FUlI6IFJhaXNlZCBpZiB0aGUgbmV3IHZhbHVlIGhhcyBhIHN5bnRheCBlcnJvcgotCSAqICAgICAgICAgICAgICAgIGFuZCBpcyB1bnBhcnNhYmxlLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgdGhpcyBwcm9wZXJ0eSBpcwotCSAqICAgICAgICAgICAgICAgIHJlYWRvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WkluZGV4KCkgewotCQlyZXR1cm4gZ2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9aX0lOREVYKSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWZQcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCWlmIChmTW9kaWZpZWQgIT0gbnVsbCkKLQkJCWZNb2RpZmllZC5jbGVhcigpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBuUHJvcGVydGllcyA9IGRlY2wuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgblByb3BlcnRpZXM7IGkrKykgewotCQkJU3RyaW5nIHByb3BOYW1lID0gZGVjbC5pdGVtKGkpOwotCQkJaWYgKHByb3BOYW1lICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJvcE4gPSBwcm9wTmFtZS50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpZiAocHJvcE4ubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlDU1NWYWx1ZSB2YWwgPSBkZWNsLmdldFByb3BlcnR5Q1NTVmFsdWUocHJvcE5hbWUpOwotCQkJCQlpZiAodmFsICE9IG51bGwpCi0JCQkJCQlmUHJvcGVydGllcy5wdXQocHJvcE4sIHZhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdFNob3J0aGFuZEFkYXB0ZXJzKCkgewotCQlpZiAoc2hvcnRoYW5kQWRhcHRlcnMgPT0gbnVsbCkgewotCQkJc2hvcnRoYW5kQWRhcHRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCQkvLyByZWdpc3RlcgotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CRyksIG5ldyBCYWNrZ3JvdW5kU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSKSwgbmV3IEJvcmRlclNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9DT0xPUiksIG5ldyBCb3JkZXJDb2xvclNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9TVFlMRSksIG5ldyBCb3JkZXJTdHlsZVNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCksIG5ldyBCb3JkZXJXaWR0aFNob3J0aGFuZEFkYXB0ZXIoKSk7Ci0JCQlzaG9ydGhhbmRBZGFwdGVycy5wdXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1ApLCBuZXcgQm9yZGVyVG9wU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1JJR0hUKSwgbmV3IEJvcmRlclJpZ2h0U2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTSksIG5ldyBCb3JkZXJCb3R0b21TaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVCksIG5ldyBCb3JkZXJMZWZ0U2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVCksIG5ldyBGb250U2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRSksIG5ldyBMaXN0U3R5bGVTaG9ydGhhbmRBZGFwdGVyKCkpOwotCQkJc2hvcnRoYW5kQWRhcHRlcnMucHV0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NQVJHSU4pLCBuZXcgTWFyZ2luU2hvcnRoYW5kQWRhcHRlcigpKTsKLQkJCXNob3J0aGFuZEFkYXB0ZXJzLnB1dChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElORyksIG5ldyBQYWRkaW5nU2hvcnRoYW5kQWRhcHRlcigpKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0Jc3RhdGljIHZvaWQgaW5pdFN1YlByb3BlcnR5QWRhcHRlcnMoKSB7Ci0JCWlmIChzdWJQcm9wZXJ0eUFkYXB0ZXJzID09IG51bGwpIHsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJCS8vIHJlZ2lzdGVyCi0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1gsIG5ldyBCYWNrZ3JvdW5kUG9zaXRpb25YU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZLCBuZXcgQmFja2dyb3VuZFBvc2l0aW9uWVN1YlN0eWxlQWRhcHRlcigpKTsKLQkJCXN1YlByb3BlcnR5QWRhcHRlcnMucHV0KFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1AsIG5ldyBDbGlwVG9wU3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1JJR0hULCBuZXcgQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyKCkpOwotCQkJc3ViUHJvcGVydHlBZGFwdGVycy5wdXQoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX0JPVFRPTSwgbmV3IENsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIoKSk7Ci0JCQlzdWJQcm9wZXJ0eUFkYXB0ZXJzLnB1dChQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCwgbmV3IENsaXBMZWZ0U3ViU3R5bGVBZGFwdGVyKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmllZCgpIHsKLQkJcmV0dXJuIChmTW9kaWZpZWQgIT0gbnVsbCAmJiBmTW9kaWZpZWQuc2l6ZSgpICE9IDApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZlByb3BlcnRpZXMua2V5cygpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBwcm9wZXJ0aWVzTW9kaWZpZWQoKSB7Ci0JCWlmIChmTW9kaWZpZWQgIT0gbnVsbCkgewotCQkJcmV0dXJuICgoQ29sbGVjdGlvbikgZk1vZGlmaWVkLmNsb25lKCkpLml0ZXJhdG9yKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGV4cGFuZHMgdGhlIHZhbHVlIG9mIHNob3J0aGFuZCAncHJvcCcgdG8gJ2ZvcmVpZ24nCi0JICogY29udGV4dC4gTm90ZSB0aGF0IGlmIHRoaXMgaGFzIHBhcmVudCBzaG9ydGhhbmQgcHJvcGVydGllcyBvZiAncHJvcCcsCi0JICogdGhleSBhcmUgYWxsIGV4cGFuZGVkIHRvICdmb3JlaWduJyBjb250ZXh0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlY3Vyc2l2ZUV4dHJhY3QoUHJvcENNUHJvcGVydHkgcHJvcCwgQ1NTUHJvcGVydHlDb250ZXh0IGZvcmVpZ24pIHsKLQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKTsgaSsrKSB7Ci0JCQlyZWN1cnNpdmVFeHRyYWN0KHByb3Auc2hvcnRoYW5kQ29udGFpbmVyQXQoaSksIGZvcmVpZ24pOwotCQl9Ci0JCVN0cmluZyBzdHIgPSBnZXQocHJvcC5nZXROYW1lKCkpOwotCQlpZiAoc3RyID09IG51bGwgfHwgc3RyLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJc3RyID0gZm9yZWlnbi5nZXQocHJvcC5nZXROYW1lKCkpOwotCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCUlTaG9ydGhhbmRBZGFwdGVyIGFkYXB0ZXIgPSAoSVNob3J0aGFuZEFkYXB0ZXIpIHNob3J0aGFuZEFkYXB0ZXJzLmdldChwcm9wKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLmV4cGFuZChzdHIsIGZvcmVpZ24pOwotCQkJCWZvcmVpZ24uc2V0KHByb3AuZ2V0TmFtZSgpLCAiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlRGVzY2VuZGFudHMoUHJvcENNUHJvcGVydHkgcHJvcCkgewotCQlpZiAocHJvcC5pc1Nob3J0aGFuZCgpKSB7Ci0JCQkvLyByZW1vdmUgcHJvcGVydGllcwotCQkJaW50IG4gPSBwcm9wLmdldE51bUNoaWxkKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBwcm9wLmdldENoaWxkQXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIFByb3BDTVByb3BlcnR5KSB7Ci0JCQkJCXJlbW92ZURlc2NlbmRhbnRzKChQcm9wQ01Qcm9wZXJ0eSkgb2JqKTsKLQotCQkJCQlTdHJpbmcgc3RyID0gZ2V0KG9iai50b1N0cmluZygpKTsKLQkJCQkJaWYgKHN0ciAhPSBudWxsICYmIHN0ci5sZW5ndGgoKSA+IDApCi0JCQkJCQlzZXQob2JqLnRvU3RyaW5nKCksICIiKTsvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXRNb2RpZmllZCgpIHsKLQkJaWYgKGZNb2RpZmllZCAhPSBudWxsKQotCQkJZk1vZGlmaWVkLmNsZWFyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBwYWlyIG9mICdwcm9wJy8ndmFsdWUnLiBJZiBzaG9ydGhhbmQgcHJvcGVydGllcwotCSAqIHJlbGF0ZWQgdG8gJ3Byb3AnIGFyZSBhbHJlYWR5IGRlZmluZWQsIHRoZXkgd2lsbCBiZSBleHBhbmRlZCB0byBhdm9pZAotCSAqIHByb3BlcnR5IGNvbmZsaWN0aW9uLiBJZiBkZXNjZW5kYW50IHByb3BlcnRpZXMgb2YgJ3Byb3AnIGFyZSBhbHJlYWR5Ci0JICogZGVmaW5lZCwgdGhleSB3aWxsIGJlIHJlbW92ZWQgdG8gYXZvaWQgcHJvcGVydHkgY29uZmxpY3Rpb24uCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHkgcHJvcCwgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCWlmIChwcm9wIGluc3RhbmNlb2YgUHJvcENNU3ViUHJvcGVydHkpIHsKLQkJCUlTdWJQcm9wZXJ0eUFkYXB0ZXIgYWRhcHRlciA9IChJU3ViUHJvcGVydHlBZGFwdGVyKSBzdWJQcm9wZXJ0eUFkYXB0ZXJzLmdldChwcm9wLmdldE5hbWUoKSk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXQodGhpcywgdmFsdWUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAocHJvcC5nZXRTaG9ydGhhbmRDb250YWluZXJDb3VudCgpID4gMCkgewotCQkJLy8gZXhwYW5kIHNob3J0aGFuZCBwcm9wZXJ0eQotCQkJQ1NTUHJvcGVydHlDb250ZXh0IGNvbnRleHQgPSBuZXcgQ1NTUHJvcGVydHlDb250ZXh0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb3AuZ2V0U2hvcnRoYW5kQ29udGFpbmVyQ291bnQoKTsgaSsrKSB7Ci0JCQkJcmVjdXJzaXZlRXh0cmFjdChwcm9wLnNob3J0aGFuZENvbnRhaW5lckF0KGkpLCBjb250ZXh0KTsKLQkJCX0KLQkJCUVudW1lcmF0aW9uIHByb3BlcnRpZXMgPSBjb250ZXh0LnByb3BlcnRpZXMoKTsKLQkJCXdoaWxlIChwcm9wZXJ0aWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJU3RyaW5nIHByb3BGb3JlaWduID0gcHJvcGVydGllcy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJc2V0KHByb3BGb3JlaWduLCBjb250ZXh0LmdldChwcm9wRm9yZWlnbikpOwotCQkJfQotCQl9Ci0KLQkJcmVtb3ZlRGVzY2VuZGFudHMocHJvcCk7Ci0KLQkJc2V0KHByb3AuZ2V0TmFtZSgpLCB2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBzZXRzIHRoZSBwYWlyIG9mICdwcm9wTmFtZScvJ3ZhbHVlJyByZWdhcmRsZXNzIG9mIGl0cwotCSAqIHNob3J0aGFuZCBwcm9wZXJ0aWVzLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldChTdHJpbmcgcHJvcE5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBrZXkgPSBwcm9wTmFtZTsKLQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQlmUHJvcGVydGllcy5yZW1vdmUoa2V5KTsKLQkJZWxzZQotCQkJZlByb3BlcnRpZXMucHV0KGtleSwgdmFsdWUpOwotCQlpZiAoZk1vZGlmaWVkID09IG51bGwpCi0JCQlmTW9kaWZpZWQgPSBuZXcgSGFzaFNldCgpOwotCQlmTW9kaWZpZWQuYWRkKGtleSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QXppbXV0aChTdHJpbmcgYXppbXV0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQVpJTVVUSCksIGF6aW11dGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmQoU3RyaW5nIGJhY2tncm91bmQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHKSwgYmFja2dyb3VuZCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEF0dGFjaG1lbnQoU3RyaW5nIGJhY2tncm91bmRBdHRhY2htZW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19BVFRBQ0hNRU5UKSwgYmFja2dyb3VuZEF0dGFjaG1lbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRDb2xvcihTdHJpbmcgYmFja2dyb3VuZENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19DT0xPUiksIGJhY2tncm91bmRDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZEltYWdlKFN0cmluZyBiYWNrZ3JvdW5kSW1hZ2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JHX0lNQUdFKSwgYmFja2dyb3VuZEltYWdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb24oU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQkdfUE9TSVRJT04pLCBiYWNrZ3JvdW5kUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblgoamF2YS5sYW5nLlN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb25YKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKSwgYmFja2dyb3VuZFBvc2l0aW9uWCk7Ci0JCS8qCi0JCSAqIFN0cmluZyBuZXdWYWx1ZSA9IG51bGw7IFN0cmluZyB2YWxIID0gYmFja2dyb3VuZFBvc2l0aW9uWDsgU3RyaW5nCi0JCSAqIHZhbFYgPSBnZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCk7IGlmICh2YWxWID09IG51bGwgfHwKLQkJICogdmFsVi5sZW5ndGgoKT09IDApIG5ld1ZhbHVlID0gdmFsSDsgZWxzZSBpZiAodmFsSCA9PSBudWxsIHx8Ci0JCSAqIHZhbEgubGVuZ3RoKCkgPT0gMCkgeyBDb2xsZWN0aW9uIHZhbFggPQotCQkgKiBQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQkdfUE9TSVRJT05fWCkuZ2V0VmFsdWVzKCk7Ci0JCSAqIENvbGxlY3Rpb24gdmFsWSA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9ZKS5nZXRWYWx1ZXMoKTsKLQkJICogUHJvcENNVXRpbC5taW51cyh2YWxZLHZhbFgpOyBJdGVyYXRvciBpdCA9IHZhbFkuaXRlcmF0b3IoKTsKLQkJICogd2hpbGUoaXQuaGFzTmV4dCgpKSB7IE9iamVjdCBvYmogPSBpdC5uZXh0KCk7IGlmCi0JCSAqIChvYmoudG9TdHJpbmcoKS5lcXVhbHModmFsVi50b0xvd2VyQ2FzZSgpKSkgeyAvLyBuZWVkIG5vdAotCQkgKiBjb21wZW5zYXRlIGZvciAuLi4gbmV3VmFsdWUgPSB2YWxWOyBicmVhazsgfSB9IC8vIGNvbXBlbnNhdGUgZm9yCi0JCSAqIEhvcml6b250YWwgdmFsdWUgaWYgKG5ld1ZhbHVlID09IG51bGwpIG5ld1ZhbHVlID0gIjAlICIgKyB2YWxWOyB9Ci0JCSAqIGVsc2UgbmV3VmFsdWUgPSB2YWxIICsgIiAiICsgdmFsVjsgc2V0QmFja2dyb3VuZFBvc2l0aW9uKG5ld1ZhbHVlKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZFBvc2l0aW9uWShqYXZhLmxhbmcuU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvblkpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLCBiYWNrZ3JvdW5kUG9zaXRpb25ZKTsKLQkJLyoKLQkJICogU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsgU3RyaW5nIHZhbEggPSBnZXRCYWNrZ3JvdW5kUG9zaXRpb25YKCk7Ci0JCSAqIFN0cmluZyB2YWxWID0gYmFja2dyb3VuZFBvc2l0aW9uWTsgaWYgKHZhbFYgPT0gbnVsbCB8fAotCQkgKiB2YWxWLmxlbmd0aCgpPT0gMCkgbmV3VmFsdWUgPSB2YWxIOyBlbHNlIGlmICh2YWxIID09IG51bGwgfHwKLQkJICogdmFsSC5sZW5ndGgoKSA9PSAwKSB7IENvbGxlY3Rpb24gdmFsWCA9Ci0JCSAqIFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9CR19QT1NJVElPTl9YKS5nZXRWYWx1ZXMoKTsKLQkJICogQ29sbGVjdGlvbiB2YWxZID0KLQkJICogUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0JHX1BPU0lUSU9OX1kpLmdldFZhbHVlcygpOwotCQkgKiBQcm9wQ01VdGlsLm1pbnVzKHZhbFksdmFsWCk7IEl0ZXJhdG9yIGl0ID0gdmFsWS5pdGVyYXRvcigpOwotCQkgKiB3aGlsZShpdC5oYXNOZXh0KCkpIHsgT2JqZWN0IG9iaiA9IGl0Lm5leHQoKTsgaWYKLQkJICogKG9iai50b1N0cmluZygpLmVxdWFscyh2YWxWLnRvTG93ZXJDYXNlKCkpKSB7IC8vIG5lZWQgbm90Ci0JCSAqIGNvbXBlbnNhdGUgZm9yIC4uLiBuZXdWYWx1ZSA9IHZhbFY7IGJyZWFrOyB9IH0gLy8gY29tcGVuc2F0ZSBmb3IKLQkJICogSG9yaXpvbnRhbCB2YWx1ZSBpZiAobmV3VmFsdWUgPT0gbnVsbCkgbmV3VmFsdWUgPSAiMCUgIiArIHZhbFY7IH0KLQkJICogZWxzZSBuZXdWYWx1ZSA9IHZhbEggKyAiICIgKyB2YWxWOyBzZXRCYWNrZ3JvdW5kUG9zaXRpb24obmV3VmFsdWUpOwotCQkgKi8KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kUmVwZWF0KFN0cmluZyBiYWNrZ3JvdW5kUmVwZWF0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CR19SRVBFQVQpLCBiYWNrZ3JvdW5kUmVwZWF0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXIoU3RyaW5nIGJvcmRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSKSwgYm9yZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b20oU3RyaW5nIGJvcmRlckJvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTSksIGJvcmRlckJvdHRvbSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQm90dG9tQ29sb3IoU3RyaW5nIGJvcmRlckJvdHRvbUNvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQk9UVE9NX0NPTE9SKSwgYm9yZGVyQm90dG9tQ29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckJvdHRvbVN0eWxlKFN0cmluZyBib3JkZXJCb3R0b21TdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0JPVFRPTV9TVFlMRSksIGJvcmRlckJvdHRvbVN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJCb3R0b21XaWR0aChTdHJpbmcgYm9yZGVyQm90dG9tV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9CT1RUT01fV0lEVEgpLCBib3JkZXJCb3R0b21XaWR0aCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQ29sbGFwc2UoU3RyaW5nIGJvcmRlckNvbGxhcHNlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MTEFQU0UpLCBib3JkZXJDb2xsYXBzZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyQ29sb3IoU3RyaW5nIGJvcmRlckNvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfQ09MT1IpLCBib3JkZXJDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdChTdHJpbmcgYm9yZGVyTGVmdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlQpLCBib3JkZXJMZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJMZWZ0Q29sb3IoU3RyaW5nIGJvcmRlckxlZnRDb2xvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX0xFRlRfQ09MT1IpLCBib3JkZXJMZWZ0Q29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlckxlZnRTdHlsZShTdHJpbmcgYm9yZGVyTGVmdFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfTEVGVF9TVFlMRSksIGJvcmRlckxlZnRTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyTGVmdFdpZHRoKFN0cmluZyBib3JkZXJMZWZ0V2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9MRUZUX1dJRFRIKSwgYm9yZGVyTGVmdFdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodChTdHJpbmcgYm9yZGVyUmlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9SSUdIVCksIGJvcmRlclJpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodENvbG9yKFN0cmluZyBib3JkZXJSaWdodENvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfQ09MT1IpLCBib3JkZXJSaWdodENvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodFN0eWxlKFN0cmluZyBib3JkZXJSaWdodFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfU1RZTEUpLCBib3JkZXJSaWdodFN0eWxlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJSaWdodFdpZHRoKFN0cmluZyBib3JkZXJSaWdodFdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfUklHSFRfV0lEVEgpLCBib3JkZXJSaWdodFdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJTcGFjaW5nKFN0cmluZyBib3JkZXJTcGFjaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfU1BBQ0lORyksIGJvcmRlclNwYWNpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclN0eWxlKFN0cmluZyBib3JkZXJTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1NUWUxFKSwgYm9yZGVyU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcChTdHJpbmcgYm9yZGVyVG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QKSwgYm9yZGVyVG9wKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJUb3BDb2xvcihTdHJpbmcgYm9yZGVyVG9wQ29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9UT1BfQ09MT1IpLCBib3JkZXJUb3BDb2xvcik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Qm9yZGVyVG9wU3R5bGUoU3RyaW5nIGJvcmRlclRvcFN0eWxlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9CT1JERVJfVE9QX1NUWUxFKSwgYm9yZGVyVG9wU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEJvcmRlclRvcFdpZHRoKFN0cmluZyBib3JkZXJUb3BXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9SREVSX1RPUF9XSURUSCksIGJvcmRlclRvcFdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3JkZXJXaWR0aChTdHJpbmcgYm9yZGVyV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0JPUkRFUl9XSURUSCksIGJvcmRlcldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCb3R0b20oU3RyaW5nIGJvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQk9UVE9NKSwgYm90dG9tKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYXB0aW9uU2lkZShTdHJpbmcgY2FwdGlvblNpZGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NBUFRJT05fU0lERSksIGNhcHRpb25TaWRlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGVhcihTdHJpbmcgY2xlYXIpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMRUFSKSwgY2xlYXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXAoU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwQm90dG9tKGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9CT1RUT00pLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwTGVmdChqYXZhLmxhbmcuU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCksIGNsaXApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENsaXBSaWdodChqYXZhLmxhbmcuU3RyaW5nIGNsaXApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDbGlwVG9wKGphdmEubGFuZy5TdHJpbmcgY2xpcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApLCBjbGlwKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb2xvcihTdHJpbmcgY29sb3IpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTE9SKSwgY29sb3IpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NPTlRFTlQpLCBjb250ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3VudGVySW5jcmVtZW50KFN0cmluZyBjb3VudGVySW5jcmVtZW50KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX0lOQ1JFTUVOVCksIGNvdW50ZXJJbmNyZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvdW50ZXJSZXNldChTdHJpbmcgY291bnRlclJlc2V0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DT1VOVEVSX1JFU0VUKSwgY291bnRlclJlc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDc3NGbG9hdChTdHJpbmcgY3NzRmxvYXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZMT0FUKSwgY3NzRmxvYXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1ZShTdHJpbmcgY3VlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUUpLCBjdWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1ZUFmdGVyKFN0cmluZyBjdWVBZnRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VFX0FGVEVSKSwgY3VlQWZ0ZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEN1ZUJlZm9yZShTdHJpbmcgY3VlQmVmb3JlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DVUVfQkVGT1JFKSwgY3VlQmVmb3JlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDdXJzb3IoU3RyaW5nIGN1cnNvcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ1VSU09SKSwgY3Vyc29yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJlY3Rpb24oU3RyaW5nIGRpcmVjdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRElSRUNUSU9OKSwgZGlyZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXNwbGF5KFN0cmluZyBkaXNwbGF5KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9ESVNQTEFZKSwgZGlzcGxheSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxldmF0aW9uKFN0cmluZyBlbGV2YXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0VMRVZBVElPTiksIGVsZXZhdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW1wdHlDZWxscyhTdHJpbmcgZW1wdHlDZWxscykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRU1QVFlfQ0VMTFMpLCBlbXB0eUNlbGxzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250KFN0cmluZyBmb250KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKSwgZm9udCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udEZhbWlseShTdHJpbmcgZm9udEZhbWlseSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9GQU1JTFkpLCBmb250RmFtaWx5KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U2l6ZShTdHJpbmcgZm9udFNpemUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRSksIGZvbnRTaXplKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRGb250U2l6ZUFkanVzdChTdHJpbmcgZm9udFNpemVBZGp1c3QpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU0laRV9BREpVU1QpLCBmb250U2l6ZUFkanVzdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFN0cmV0Y2goU3RyaW5nIGZvbnRTdHJldGNoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUUkVUQ0gpLCBmb250U3RyZXRjaCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0Rm9udFN0eWxlKFN0cmluZyBmb250U3R5bGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpLCBmb250U3R5bGUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRWYXJpYW50KFN0cmluZyBmb250VmFyaWFudCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5UKSwgZm9udFZhcmlhbnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEZvbnRXZWlnaHQoU3RyaW5nIGZvbnRXZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKSwgZm9udFdlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVpZ2h0KFN0cmluZyBoZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0hFSUdIVCksIGhlaWdodCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGVmdChTdHJpbmcgbGVmdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTEVGVCksIGxlZnQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExldHRlclNwYWNpbmcoU3RyaW5nIGxldHRlclNwYWNpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xFVFRFUl9TUEFDSU5HKSwgbGV0dGVyU3BhY2luZyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZUhlaWdodChTdHJpbmcgbGluZUhlaWdodCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElORV9IRUlHSFQpLCBsaW5lSGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGUoU3RyaW5nIGxpc3RTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRSksIGxpc3RTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGlzdFN0eWxlSW1hZ2UoU3RyaW5nIGxpc3RTdHlsZUltYWdlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX0lNQUdFKSwgbGlzdFN0eWxlSW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RTdHlsZVBvc2l0aW9uKFN0cmluZyBsaXN0U3R5bGVQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9QT1NJVElPTiksIGxpc3RTdHlsZVBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRMaXN0U3R5bGVUeXBlKFN0cmluZyBsaXN0U3R5bGVUeXBlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpLCBsaXN0U3R5bGVUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW4oU3RyaW5nIG1hcmdpbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOKSwgbWFyZ2luKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5Cb3R0b20oU3RyaW5nIG1hcmdpbkJvdHRvbSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSksIG1hcmdpbkJvdHRvbSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFyZ2luTGVmdChTdHJpbmcgbWFyZ2luTGVmdCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpLCBtYXJnaW5MZWZ0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5SaWdodChTdHJpbmcgbWFyZ2luUmlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCksIG1hcmdpblJpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXJnaW5Ub3AoU3RyaW5nIG1hcmdpblRvcCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCksIG1hcmdpblRvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWFya2VyT2Zmc2V0KFN0cmluZyBtYXJrZXJPZmZzZXQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BUktFUl9PRkZTRVQpLCBtYXJrZXJPZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hcmtzKFN0cmluZyBtYXJrcykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFSS1MpLCBtYXJrcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0TWF4SGVpZ2h0KFN0cmluZyBtYXhIZWlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01BWF9IRUlHSFQpLCBtYXhIZWlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1heFdpZHRoKFN0cmluZyBtYXhXaWR0aCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTUFYX1dJRFRIKSwgbWF4V2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1pbkhlaWdodChTdHJpbmcgbWluSGVpZ2h0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9NSU5fSEVJR0hUKSwgbWluSGVpZ2h0KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNaW5XaWR0aChTdHJpbmcgbWluV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX01JTl9XSURUSCksIG1pbldpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPcnBoYW5zKFN0cmluZyBvcnBoYW5zKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PUlBIQU5TKSwgb3JwaGFucyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZShTdHJpbmcgb3V0bGluZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORSksIG91dGxpbmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE91dGxpbmVDb2xvcihTdHJpbmcgb3V0bGluZUNvbG9yKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9PVVRMSU5FX0NPTE9SKSwgb3V0bGluZUNvbG9yKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRPdXRsaW5lU3R5bGUoU3RyaW5nIG91dGxpbmVTdHlsZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1VUTElORV9TVFlMRSksIG91dGxpbmVTdHlsZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0T3V0bGluZVdpZHRoKFN0cmluZyBvdXRsaW5lV2lkdGgpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX09VVExJTkVfV0lEVEgpLCBvdXRsaW5lV2lkdGgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE92ZXJmbG93KFN0cmluZyBvdmVyZmxvdykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfT1ZFUkZMT1cpLCBvdmVyZmxvdyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZyhTdHJpbmcgcGFkZGluZykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFERElORyksIHBhZGRpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdCb3R0b20oU3RyaW5nIHBhZGRpbmdCb3R0b20pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKSwgcGFkZGluZ0JvdHRvbSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ0xlZnQoU3RyaW5nIHBhZGRpbmdMZWZ0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0xFRlQpLCBwYWRkaW5nTGVmdCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFkZGluZ1JpZ2h0KFN0cmluZyBwYWRkaW5nUmlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfUklHSFQpLCBwYWRkaW5nUmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZGRpbmdUb3AoU3RyaW5nIHBhZGRpbmdUb3ApIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKSwgcGFkZGluZ1RvcCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFnZShTdHJpbmcgcGFnZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRSksIHBhZ2UpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VCcmVha0FmdGVyKFN0cmluZyBwYWdlQnJlYWtBZnRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19BRlRFUiksIHBhZ2VCcmVha0FmdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYWdlQnJlYWtCZWZvcmUoU3RyaW5nIHBhZ2VCcmVha0JlZm9yZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFHRV9CUkVBS19CRUZPUkUpLCBwYWdlQnJlYWtCZWZvcmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhZ2VCcmVha0luc2lkZShTdHJpbmcgcGFnZUJyZWFrSW5zaWRlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQUdFX0JSRUFLX0lOU0lERSksIHBhZ2VCcmVha0luc2lkZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGF1c2UoU3RyaW5nIHBhdXNlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRSksIHBhdXNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXVzZUFmdGVyKFN0cmluZyBwYXVzZUFmdGVyKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QQVVTRV9BRlRFUiksIHBhdXNlQWZ0ZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhdXNlQmVmb3JlKFN0cmluZyBwYXVzZUJlZm9yZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUEFVU0VfQkVGT1JFKSwgcGF1c2VCZWZvcmUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBpdGNoKFN0cmluZyBwaXRjaCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0gpLCBwaXRjaCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGl0Y2hSYW5nZShTdHJpbmcgcGl0Y2hSYW5nZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUElUQ0hfUkFOR0UpLCBwaXRjaFJhbmdlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQbGF5RHVyaW5nKFN0cmluZyBwbGF5RHVyaW5nKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9QTEFZX0RVUklORyksIHBsYXlEdXJpbmcpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBvc2l0aW9uKFN0cmluZyBwb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfUE9TSVRJT04pLCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UXVvdGVzKFN0cmluZyBxdW90ZXMpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1FVT1RFUyksIHF1b3Rlcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmljaG5lc3MoU3RyaW5nIHJpY2huZXNzKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9SSUNITkVTUyksIHJpY2huZXNzKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSaWdodChTdHJpbmcgcmlnaHQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1JJR0hUKSwgcmlnaHQpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNpemUoU3RyaW5nIHNpemUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NJWkUpLCBzaXplKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVhayhTdHJpbmcgc3BlYWspIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUFLKSwgc3BlYWspOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrSGVhZGVyKFN0cmluZyBzcGVha0hlYWRlcikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfU1BFQUtfSEVBREVSKSwgc3BlYWtIZWFkZXIpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWFrTnVtZXJhbChTdHJpbmcgc3BlYWtOdW1lcmFsKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19OVU1FUkFMKSwgc3BlYWtOdW1lcmFsKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTcGVha1B1bmN0dWF0aW9uKFN0cmluZyBzcGVha1B1bmN0dWF0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9TUEVBS19QVU5DVFVBVElPTiksIHNwZWFrUHVuY3R1YXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFNwZWVjaFJhdGUoU3RyaW5nIHNwZWVjaFJhdGUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NQRUVDSF9SQVRFKSwgc3BlZWNoUmF0ZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RyZXNzKFN0cmluZyBzdHJlc3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1NUUkVTUyksIHN0cmVzcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGFibGVMYXlvdXQoU3RyaW5nIHRhYmxlTGF5b3V0KSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UQUJMRV9MQVlPVVQpLCB0YWJsZUxheW91dCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dEFsaWduKFN0cmluZyB0ZXh0QWxpZ24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfQUxJR04pLCB0ZXh0QWxpZ24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHREZWNvcmF0aW9uKFN0cmluZyB0ZXh0RGVjb3JhdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9ERUNPUkFUSU9OKSwgdGV4dERlY29yYXRpb24pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRJbmRlbnQoU3RyaW5nIHRleHRJbmRlbnQpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1RFWFRfSU5ERU5UKSwgdGV4dEluZGVudCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFNoYWRvdyhTdHJpbmcgdGV4dFNoYWRvdykgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVEVYVF9TSEFET1cpLCB0ZXh0U2hhZG93KTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0VHJhbnNmb3JtKFN0cmluZyB0ZXh0VHJhbnNmb3JtKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9URVhUX1RSQU5TRk9STSksIHRleHRUcmFuc2Zvcm0pOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRvcChTdHJpbmcgdG9wKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9UT1ApLCB0b3ApOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuaWNvZGVCaWRpKFN0cmluZyB1bmljb2RlQmlkaSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVU5JQ09ERV9CSURJKSwgdW5pY29kZUJpZGkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnRpY2FsQWxpZ24oU3RyaW5nIHZlcnRpY2FsQWxpZ24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1ZFUlRJQ0FMX0FMSUdOKSwgdmVydGljYWxBbGlnbik7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShTdHJpbmcgdmlzaWJpbGl0eSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVklTSUJJTElUWSksIHZpc2liaWxpdHkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZvaWNlRmFtaWx5KFN0cmluZyB2b2ljZUZhbWlseSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfVk9JQ0VfRkFNSUxZKSwgdm9pY2VGYW1pbHkpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZvbHVtZShTdHJpbmcgdm9sdW1lKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9WT0xVTUUpLCB2b2x1bWUpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFdoaXRlU3BhY2UoU3RyaW5nIHdoaXRlU3BhY2UpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dISVRFX1NQQUNFKSwgd2hpdGVTcGFjZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkb3dzKFN0cmluZyB3aWRvd3MpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dJRE9XUyksIHdpZG93cyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0V2lkdGgoU3RyaW5nIHdpZHRoKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9XSURUSCksIHdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXb3JkU3BhY2luZyhTdHJpbmcgd29yZFNwYWNpbmcpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlzZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX1dPUkRfU1BBQ0lORyksIHdvcmRTcGFjaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRaSW5kZXgoU3RyaW5nIHpJbmRleCkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCXNldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfWl9JTkRFWCksIHpJbmRleCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcEJvdHRvbVN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGYwNmZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIGJvdHRvbSB2YWx1ZSBvZiAnY2xpcCcgcHJvcGVydHkncyByZWN0KCkgZnVuY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIENsaXBCb3R0b21TdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwQm90dG9tU3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRCb3R0b20oKS5nZXRDc3NUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JaW50IGluZGV4KCkgewotCQlyZXR1cm4gMjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbiB7Ci0JCVN0cmluZyB0b3AgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9UT1ApKTsKLQkJU3RyaW5nIHJpZ2h0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfUklHSFQpKTsKLQkJU3RyaW5nIGxlZnQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9MRUZUKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHRvcCwgcmlnaHQsIHZhbHVlLCBsZWZ0LCB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmxlbmd0aCgpID09IDApOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwTGVmdFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGJhODczLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwTGVmdFN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciBsZWZ0IHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcExlZnRTdWJTdHlsZUFkYXB0ZXIgZXh0ZW5kcyBDbGlwU3ViU3R5bGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBDbGlwTGVmdFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0TGVmdCgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAzOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgYm90dG9tID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0KLQkJc2V0KHByb3BlcnRpZXMsIHRvcCwgcmlnaHQsIGJvdHRvbSwgdmFsdWUsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwUmlnaHRTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTU2MGFmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNU3ViUHJvcGVydHk7Ci0KLS8qKgotICogRm9yIHJpZ2h0IHZhbHVlIG9mICdjbGlwJyBwcm9wZXJ0eSdzIHJlY3QoKSBmdW5jdGlvbgotICovCi1wdWJsaWMgY2xhc3MgQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyIGV4dGVuZHMgQ2xpcFN1YlN0eWxlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFJpZ2h0U3ViU3R5bGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQob3JnLnczYy5kb20uY3NzLlJlY3QgcmVjdCkgewotCQlyZXR1cm4gcmVjdC5nZXRSaWdodCgpLmdldENzc1RleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlpbnQgaW5kZXgoKSB7Ci0JCXJldHVybiAxOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJU3RyaW5nIHRvcCA9IHByb3BlcnRpZXMuZ2V0KFByb3BDTVN1YlByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNU3ViUHJvcGVydHkuUFNVQl9DTElQX1RPUCkpOwotCQlTdHJpbmcgYm90dG9tID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0JCVN0cmluZyBsZWZ0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCkpOwotCi0JCXNldChwcm9wZXJ0aWVzLCB0b3AsIHZhbHVlLCBib3R0b20sIGxlZnQsIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFN1YlN0eWxlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDE5YTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9DbGlwU3ViU3R5bGVBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLklWYWxJRDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVByb3BlcnR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLlJlY3Q7Ci0KLQotLyoqCi0gKiBBYnN0cmFjdCBjbGFzcyBmb3IgY2xpcCBzdWItcHJvcGVydGllcwotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQ2xpcFN1YlN0eWxlQWRhcHRlciBpbXBsZW1lbnRzIElTdWJQcm9wZXJ0eUFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIENsaXBTdWJTdHlsZUFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKLQkJU3RyaW5nIHN0ciA9IG51bGw7Ci0JCU9iamVjdCBvYmogPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfQ0xJUCkpOwotCQlpZiAob2JqICE9IG51bGwpIHsKLQkJCWlmIChvYmogaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5jc3MuUmVjdCkgewotCQkJCXN0ciA9IGdldCgob3JnLnczYy5kb20uY3NzLlJlY3QpIG9iaik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJCXN0ciA9ICgoSUNTU1ZhbHVlKSBvYmopLmdldENTU1ZhbHVlVGV4dCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3RyID0gb2JqLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXN0ciA9IHN0ci50cmltKCkudG9Mb3dlckNhc2UoKTsKLQkJCQlpbnQgcG9zID0gc3RyLmluZGV4T2YoInJlY3QoIik7Ly8kTk9OLU5MUy0xJAotCQkJCWlmIChwb3MgPj0gMCkgewotCQkJCQlTdHJpbmcgc3ViU3RyID0gbnVsbDsKLQkJCQkJcG9zICs9IDU7Ci0JCQkJCWludCBpID0gMDsKLQkJCQkJZG8gewotCQkJCQkJaW50IHBvc0VuZCA9IHN0ci5pbmRleE9mKCIsIiwgcG9zKTsvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAocG9zRW5kIDwgMCkKLQkJCQkJCQlwb3NFbmQgPSBzdHIuaW5kZXhPZigiKSIsIHBvcyk7Ly8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKHBvc0VuZCA8IDAgJiYgcG9zIDwgc3RyLmxlbmd0aCgpKQotCQkJCQkJCXBvc0VuZCA9IHN0ci5sZW5ndGgoKTsKLQkJCQkJCWlmIChwb3NFbmQgPj0gcG9zKSB7Ci0JCQkJCQkJc3ViU3RyID0gc3RyLnN1YnN0cmluZyhwb3MsIHBvc0VuZCk7Ci0JCQkJCQkJcG9zID0gcG9zRW5kICsgMTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UKLQkJCQkJCQlwb3MgPSAtMTsKLQkJCQkJfQotCQkJCQl3aGlsZSAoaSsrIDwgaW5kZXgoKSAmJiBwb3MgPiAwKTsKLQotCQkJCQlpZiAocG9zID4gMCkKLQkJCQkJCXN0ciA9IHN1YlN0ci50cmltKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCXN0ciA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJc3RyID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHN0ciAhPSBudWxsKSA/IHN0ciA6ICIiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlhYnN0cmFjdCBTdHJpbmcgZ2V0KFJlY3QgcmVjdCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlhYnN0cmFjdCBpbnQgaW5kZXgoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICgyMDAxLzEwLzA0Ci0JICogMTk6MjU6NDYpCi0JICogCi0JICogQHBhcmFtIHByb3BlcnRpZXMKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS51dGlsLmRlY2xhcmF0aW9uLklDU1MyUHJvcGVydGllcwotCSAqIEBwYXJhbSB0b3AKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmlnaHQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gYm90dG9tCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGxlZnQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gcmVtb3ZlQ2hlY2sKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQl2b2lkIHNldChJQ1NTMlByb3BlcnRpZXMgcHJvcGVydGllcywgU3RyaW5nIHRvcCwgU3RyaW5nIHJpZ2h0LCBTdHJpbmcgYm90dG9tLCBTdHJpbmcgbGVmdCwgYm9vbGVhbiByZW1vdmVDaGVjaykgewotCQlpZiAodG9wID09IG51bGwgfHwgdG9wLmxlbmd0aCgpID09IDApCi0JCQl0b3AgPSBJVmFsSUQuVl9BVVRPOwotCQlpZiAocmlnaHQgPT0gbnVsbCB8fCByaWdodC5sZW5ndGgoKSA9PSAwKQotCQkJcmlnaHQgPSBJVmFsSUQuVl9BVVRPOwotCQlpZiAoYm90dG9tID09IG51bGwgfHwgYm90dG9tLmxlbmd0aCgpID09IDApCi0JCQlib3R0b20gPSBJVmFsSUQuVl9BVVRPOwotCQlpZiAobGVmdCA9PSBudWxsIHx8IGxlZnQubGVuZ3RoKCkgPT0gMCkKLQkJCWxlZnQgPSBJVmFsSUQuVl9BVVRPOwotCi0JCWlmIChyZW1vdmVDaGVjayAmJiB0b3AudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykgJiYgcmlnaHQudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykgJiYgYm90dG9tLnRyaW0oKS5lcXVhbHNJZ25vcmVDYXNlKElWYWxJRC5WX0FVVE8pICYmIGxlZnQudHJpbSgpLmVxdWFsc0lnbm9yZUNhc2UoSVZhbElELlZfQVVUTykpIHsKLQkJCXByb3BlcnRpZXMuc2V0KFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9DTElQKSwgbnVsbCk7Ci0JCX0KLQkJZWxzZQotCQkJcHJvcGVydGllcy5zZXQoUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0NMSVApLCAicmVjdCgiICsgdG9wICsgIiwgIiArIHJpZ2h0ICsgIiwgIiArIGJvdHRvbSArICIsICIgKyBsZWZ0ICsgIikiKTsvLyROT04tTkxTLTUkLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFRvcFN1YlN0eWxlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0NsaXBUb3BTdWJTdHlsZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFiNWQ1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vQ2xpcFRvcFN1YlN0eWxlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLlByb3BDTVN1YlByb3BlcnR5OwotCi0vKioKLSAqIEZvciB0b3AgdmFsdWUgb2YgJ2NsaXAnIHByb3BlcnR5J3MgcmVjdCgpIGZ1bmN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGlwVG9wU3ViU3R5bGVBZGFwdGVyIGV4dGVuZHMgQ2xpcFN1YlN0eWxlQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ2xpcFRvcFN1YlN0eWxlQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KG9yZy53M2MuZG9tLmNzcy5SZWN0IHJlY3QpIHsKLQkJcmV0dXJuIHJlY3QuZ2V0VG9wKCkuZ2V0Q3NzVGV4dCgpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCWludCBpbmRleCgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElDU1MyUHJvcGVydGllcyBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWUpIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb24gewotCQlTdHJpbmcgcmlnaHQgPSBwcm9wZXJ0aWVzLmdldChQcm9wQ01TdWJQcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVN1YlByb3BlcnR5LlBTVUJfQ0xJUF9SSUdIVCkpOwotCQlTdHJpbmcgYm90dG9tID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfQk9UVE9NKSk7Ci0JCVN0cmluZyBsZWZ0ID0gcHJvcGVydGllcy5nZXQoUHJvcENNU3ViUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01TdWJQcm9wZXJ0eS5QU1VCX0NMSVBfTEVGVCkpOwotCi0JCXNldChwcm9wZXJ0aWVzLCB2YWx1ZSwgcmlnaHQsIGJvdHRvbSwgbGVmdCwgdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0ZvbnRTaG9ydGhhbmRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vRm9udFNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFkNDljYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vRm9udFNob3J0aGFuZEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSVZhbElEOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci0KLQotLyoqCi0gKiBGb3IgJ2ZvbnQnIHByb3BlcnR5ICdmb250JyB3aWxsIGJlIGV4cGFuZGVkIHRvICdmb250LWZhbWlseScsICdmb250LXNpemUnLAotICogJ2ZvbnQtc3R5bGUnLCAnZm9udC12YXJpYW50JywgJ2ZvbnQtd2VpZ2h0JywgJ2xpbmUtaGVpZ2h0JywKLSAqLwotcHVibGljIGNsYXNzIEZvbnRTaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEZvbnRTaG9ydGhhbmRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4cGFuZChTdHJpbmcgc291cmNlLCBDU1NQcm9wZXJ0eUNvbnRleHQgZGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHN0eWxlID0gbnVsbCwgdmFyaWFudCA9IG51bGwsIHdlaWdodCA9IG51bGwsIHNpemUgPSBudWxsLCBoZWlnaHQgPSBudWxsLCBmYW1pbHkgPSBudWxsOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wRm9udCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFN0eWxlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfU1RZTEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVmFyaWFudCA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1ZBUklBTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wV2VpZ2h0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfV0VJR0hUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFNpemUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TSVpFKTsKLQkJYm9vbGVhbiBiTm9ybWFsU3BlY2lmaWVkID0gZmFsc2U7Ci0KLQkJaW50IGkgPSAwOwotCQlmb3IgKDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCS8vIGZpcnN0IG9mIGFsbCwgY2hlY2sgZm9udCBpZGVudHMKLQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvcEZvbnQuZ2V0TnVtQ2hpbGQoKTsgaisrKSB7Ci0JCQkJCQlPYmplY3Qgb2JqID0gcHJvcEZvbnQuZ2V0Q2hpbGRBdChpKTsKLQkJCQkJCWlmIChvYmogaW5zdGFuY2VvZiBTdHJpbmcgJiYgdG9rZW5zW2ldLmltYWdlLmNvbXBhcmVUb0lnbm9yZUNhc2Uob2JqLnRvU3RyaW5nKCkpID09IDApCi0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHZhbHVlICJub3JtYWwiIGlzIHNoYXJlZCAhIQotCQkJCWlmICh0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9OT1JNQUwpKSB7Ci0JCQkJCWJOb3JtYWxTcGVjaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFZhcmlhbnQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdmFyaWFudCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BTaXplLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCQkJc2l6ZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJCWJyZWFrOyAvLyBpZiBzaXplIGZvdW5kLCBicmVhayBsb29wCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSICYmIHdlaWdodCA9PSBudWxsICYmIHByb3BXZWlnaHQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJd2VpZ2h0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWJyZWFrOyAvLyBpZiBzaXplIGZvdW5kLCBicmVhayBsb29wCi0JCQl9Ci0JCX0KLQotCQlpZiAoYk5vcm1hbFNwZWNpZmllZCkgewotCQkJaWYgKHN0eWxlID09IG51bGwpCi0JCQkJc3R5bGUgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCQlpZiAodmFyaWFudCA9PSBudWxsKQotCQkJCXZhcmlhbnQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCQlpZiAod2VpZ2h0ID09IG51bGwpCi0JCQkJd2VpZ2h0ID0gSVZhbElELlZfTk9STUFMOwotCQl9Ci0KLQkJLy8gc2tpcCB3aGl0ZXNwYWNlCi0JCWZvciAoaSsrOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdG9rZW5zW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBsaW5lLWhlaWdodCA/Ci0JCWlmIChpIDwgdG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdG9rZW5zW2ldLmltYWdlLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaSsrOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQloZWlnaHQgPSB0b2tlbnNbaSsrXS5pbWFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZm9udC1mYW1pbHkKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yICg7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJfQotCQlmYW1pbHkgPSBidWYudG9TdHJpbmcoKS50cmltKCk7Ci0KLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1NUWUxFLCBzdHlsZSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfRk9OVF9WQVJJQU5ULCB2YXJpYW50KTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1dFSUdIVCwgd2VpZ2h0KTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUsIHNpemUpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hULCBoZWlnaHQpOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfRkFNSUxZLCBmYW1pbHkpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgc3R5bGUgPSBudWxsLCB2YXJpYW50ID0gbnVsbCwgd2VpZ2h0ID0gbnVsbCwgc2l6ZSA9IG51bGwsIGhlaWdodCA9IG51bGwsIGZhbWlseSA9IG51bGw7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BGb250ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU3R5bGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9TVFlMRSk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BWYXJpYW50ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0ZPTlRfVkFSSUFOVCk7Ci0JCVByb3BDTVByb3BlcnR5IHByb3BXZWlnaHQgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfRk9OVF9XRUlHSFQpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wU2l6ZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX1NJWkUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSGVpZ2h0ID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJTkVfSEVJR0hUKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEZhbWlseSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9GT05UX0ZBTUlMWSk7Ci0JCWJvb2xlYW4gYk5vcm1hbFNwZWNpZmllZCA9IGZhbHNlOwotCi0JCWludCBpID0gMDsKLQkJZm9yICg7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQkvLyBmaXJzdCBvZiBhbGwsIGNoZWNrIGZvbnQgaWRlbnRzCi0JCQkJaWYgKGkgPT0gMCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3BGb250LmdldE51bUNoaWxkKCk7IGorKykgewotCQkJCQkJT2JqZWN0IG9iaiA9IHByb3BGb250LmdldENoaWxkQXQoaSk7Ci0JCQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RyaW5nICYmIHRva2Vuc1tpXS5pbWFnZS5jb21wYXJlVG9JZ25vcmVDYXNlKG9iai50b1N0cmluZygpKSA9PSAwKQotCQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIHZhbHVlICJub3JtYWwiIGlzIHNoYXJlZCAhIQotCQkJCWlmICh0b2tlbnNbaV0uaW1hZ2UuZXF1YWxzSWdub3JlQ2FzZShJVmFsSUQuVl9OT1JNQUwpKSB7Ci0JCQkJCWJOb3JtYWxTcGVjaWZpZWQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHByb3BTdHlsZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlzdHlsZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFZhcmlhbnQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdmFyaWFudCA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJZWxzZSBpZiAocHJvcFdlaWdodC5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQl3ZWlnaHQgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWVsc2UgaWYgKHByb3BTaXplLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkgewotCQkJCQkJc2l6ZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJCWJyZWFrOyAvLyBpZiBzaXplIGZvdW5kLCBicmVhayBsb29wCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSICYmIHdlaWdodCA9PSBudWxsICYmIHByb3BXZWlnaHQuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKSB7Ci0JCQkJd2VpZ2h0ID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpIHsKLQkJCQlzaXplID0gdG9rZW5zW2ldLmltYWdlOwotCQkJCWJyZWFrOyAvLyBpZiBzaXplIGZvdW5kLCBicmVhayBsb29wCi0JCQl9Ci0JCX0KLQotCQlpZiAoYk5vcm1hbFNwZWNpZmllZCkgewotCQkJaWYgKHN0eWxlID09IG51bGwpCi0JCQkJc3R5bGUgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCQlpZiAodmFyaWFudCA9PSBudWxsKQotCQkJCXZhcmlhbnQgPSBJVmFsSUQuVl9OT1JNQUw7Ci0JCQlpZiAod2VpZ2h0ID09IG51bGwpCi0JCQkJd2VpZ2h0ID0gSVZhbElELlZfTk9STUFMOwotCQl9Ci0KLQkJLy8gc2tpcCB3aGl0ZXNwYWNlCi0JCWZvciAoaSsrOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgfHwgdG9rZW5zW2ldLmtpbmQgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyBsaW5lLWhlaWdodCA/Ci0JCWlmIChpIDwgdG9rZW5zLmxlbmd0aCAmJiB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IgJiYgdG9rZW5zW2ldLmltYWdlLmVxdWFscygiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaSsrOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWwuaXNMZW5ndGgodG9rZW5zW2ldKSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCkgewotCQkJCQloZWlnaHQgPSB0b2tlbnNbaSsrXS5pbWFnZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZm9udC1mYW1pbHkKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yICg7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCWJ1Zi5hcHBlbmQodG9rZW5zW2ldLmltYWdlKTsKLQkJfQotCQlmYW1pbHkgPSBidWYudG9TdHJpbmcoKS50cmltKCk7Ci0KLQkJaWYgKHByb3BTdHlsZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiBzdHlsZTsKLQkJZWxzZSBpZiAocHJvcFZhcmlhbnQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gdmFyaWFudDsKLQkJZWxzZSBpZiAocHJvcFdlaWdodCA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB3ZWlnaHQ7Ci0JCWVsc2UgaWYgKHByb3BTaXplID09IHByb3BEZXN0KQotCQkJcmV0dXJuIHNpemU7Ci0JCWVsc2UgaWYgKHByb3BIZWlnaHQgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gaGVpZ2h0OwotCQllbHNlIGlmIChwcm9wRmFtaWx5ID09IHByb3BEZXN0KQotCQkJcmV0dXJuIGZhbWlseTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JQ1NTMlByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJkNTE4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSUNTUzJQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTUzJQcm9wZXJ0aWVzOwotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNTUzJQcm9wZXJ0aWVzIGV4dGVuZHMgQ1NTMlByb3BlcnRpZXMgewotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBhcHBseUZ1bGwoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIGFwcGx5TW9kaWZpZWQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0KFByb3BDTVByb3BlcnR5IHByb3ApOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldEJhY2tncm91bmRQb3NpdGlvblgoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXRCYWNrZ3JvdW5kUG9zaXRpb25ZKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcEJvdHRvbSgpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGdldENsaXBMZWZ0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcFJpZ2h0KCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlTdHJpbmcgZ2V0Q2xpcFRvcCgpOwotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBpc01vZGlmaWVkKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlJdGVyYXRvciBwcm9wZXJ0aWVzTW9kaWZpZWQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgcmVzZXRNb2RpZmllZCgpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXQoUHJvcENNUHJvcGVydHkgcHJvcCwgU3RyaW5nIHZhbHVlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRCYWNrZ3JvdW5kUG9zaXRpb25YKFN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb24pIHRocm93cyBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEJhY2tncm91bmRQb3NpdGlvblkoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q2xpcEJvdHRvbShTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwTGVmdChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXRDbGlwUmlnaHQoU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbikgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIAotCSAqLwotCXZvaWQgc2V0Q2xpcFRvcChTdHJpbmcgYmFja2dyb3VuZFBvc2l0aW9uKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTaG9ydGhhbmRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhOTFmMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0lTaG9ydGhhbmRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpOwotCi0JLyoqCi0JICogCi0JICovCi0JU3RyaW5nIGV4dHJhY3QoU3RyaW5nIHNvdXJjZSwgUHJvcENNUHJvcGVydHkgcHJvcERlc3QpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU3ViUHJvcGVydHlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vSVN1YlByb3BlcnR5QWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDg3YjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9JU3ViUHJvcGVydHlBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLmRlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3ViUHJvcGVydHlBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCVN0cmluZyBnZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMpOwotCi0JLyoqCi0JICogCi0JICovCi0Jdm9pZCBzZXQoSUNTUzJQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL0xpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYwMjAzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnbGlzdC1zdHlsZScgcHJvcGVydHkgJ2xpc3Qtc3R5bGUnIHdpbGwgYmUgZXhwYW5kZWQgdG8KLSAqICdsaXN0LXN0eWxlLWltYWdlJywgJ2xpc3Qtc3R5bGUtcG9zaXRpb24nLCAnbGlzdC1zdHlsZS10eXBlJywKLSAqLwotcHVibGljIGNsYXNzIExpc3RTdHlsZVNob3J0aGFuZEFkYXB0ZXIgaW1wbGVtZW50cyBJU2hvcnRoYW5kQWRhcHRlciB7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgTGlzdFN0eWxlU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZyBpbWFnZSA9ICIiLCBwb3MgPSAiIiwgdHlwZSA9ICIiOy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wUG9zID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfUE9TSVRJT04pOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wVHlwZSA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1RZUEUpOwotCQlQcm9wQ01Qcm9wZXJ0eSBwcm9wSW1hZ2UgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9JTUFHRSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQpIHsKLQkJCQlpZiAocHJvcFBvcy5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCXBvcyA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQllbHNlIHsgLy8gdmFsdWU9Im5vbmUiIGlzIHNoYXJlZCAhIQotCQkJCQlpZiAocHJvcFR5cGUuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJdHlwZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQkJaWYgKHByb3BJbWFnZS5jYW5IYXZlKHRva2Vuc1tpXS5pbWFnZSkpCi0JCQkJCQlpbWFnZSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICh0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJKSB7Ci0JCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQl9Ci0JCX0KLQotCQlkZXN0LnNldChwcm9wUG9zLmdldE5hbWUoKSwgcG9zKTsKLQkJZGVzdC5zZXQocHJvcFR5cGUuZ2V0TmFtZSgpLCB0eXBlKTsKLQkJZGVzdC5zZXQocHJvcEltYWdlLmdldE5hbWUoKSwgaW1hZ2UpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZXh0cmFjdChTdHJpbmcgc291cmNlLCBQcm9wQ01Qcm9wZXJ0eSBwcm9wRGVzdCkgewotCQlDU1NUZXh0UGFyc2VyIHBhcnNlciA9IG5ldyBDU1NUZXh0UGFyc2VyKENTU1RleHRQYXJzZXIuTU9ERV9ERUNMQVJBVElPTl9WQUxVRSwgc291cmNlKTsKLQkJQ1NTVGV4dFRva2VuW10gdG9rZW5zID0gcGFyc2VyLmdldFRva2VucygpOwotCQlpZiAodG9rZW5zLmxlbmd0aCA8PSAwKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmcgaW1hZ2UgPSBudWxsLCBwb3MgPSBudWxsLCB0eXBlID0gbnVsbDsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFBvcyA9IFByb3BDTVByb3BlcnR5LmdldEluc3RhbmNlT2YoUHJvcENNUHJvcGVydHkuUF9MSVNUX1NUWUxFX1BPU0lUSU9OKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcFR5cGUgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKFByb3BDTVByb3BlcnR5LlBfTElTVF9TVFlMRV9UWVBFKTsKLQkJUHJvcENNUHJvcGVydHkgcHJvcEltYWdlID0gUHJvcENNUHJvcGVydHkuZ2V0SW5zdGFuY2VPZihQcm9wQ01Qcm9wZXJ0eS5QX0xJU1RfU1RZTEVfSU1BR0UpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UKSB7Ci0JCQkJaWYgKHByb3BQb3MuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQlwb3MgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJZWxzZSB7IC8vIHZhbHVlPSJub25lIiBpcyBzaGFyZWQgISEKLQkJCQkJaWYgKHByb3BUeXBlLmNhbkhhdmUodG9rZW5zW2ldLmltYWdlKSkKLQkJCQkJCXR5cGUgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJCWlmIChwcm9wSW1hZ2UuY2FuSGF2ZSh0b2tlbnNbaV0uaW1hZ2UpKQotCQkJCQkJaW1hZ2UgPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAodG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSSkgewotCQkJCWltYWdlID0gdG9rZW5zW2ldLmltYWdlOwotCQkJfQotCQl9Ci0KLQkJaWYgKHByb3BQb3MgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gcG9zOwotCQllbHNlIGlmIChwcm9wVHlwZSA9PSBwcm9wRGVzdCkKLQkJCXJldHVybiB0eXBlOwotCQllbHNlIGlmIChwcm9wSW1hZ2UgPT0gcHJvcERlc3QpCi0JCQlyZXR1cm4gaW1hZ2U7Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTWFyZ2luU2hvcnRoYW5kQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL01hcmdpblNob3J0aGFuZEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUzYWZjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vTWFyZ2luU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAnbWFyZ2luJyBwcm9wZXJ0eSAnbWFyZ2luJyB3aWxsIGJlIGV4cGFuZGVkIHRvICdtYXJnaW4tdG9wJywKLSAqICdtYXJnaW4tcmlnaHQnLCAnbWFyZ2luLWJvdHRvbScsICdtYXJnaW4tbGVmdCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXJnaW5TaG9ydGhhbmRBZGFwdGVyIGltcGxlbWVudHMgSVNob3J0aGFuZEFkYXB0ZXIgewotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE1hcmdpblNob3J0aGFuZEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhwYW5kKFN0cmluZyBzb3VyY2UsIENTU1Byb3BlcnR5Q29udGV4dCBkZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmdbXSBpZGVudHMgPSBuZXcgU3RyaW5nWzRdOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdG9rZW5zLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAob3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbC5pc0xlbmd0aCh0b2tlbnNbaV0pIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lERU5UIHx8IHRva2Vuc1tpXS5raW5kID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFKQotCQkJCWlkZW50c1tqKytdID0gdG9rZW5zW2ldLmltYWdlOwotCQkJaWYgKGogPT0gNCkKLQkJCQlicmVhazsKLQkJfQotCi0JCVN0cmluZ1tdIGRlc3RzID0gbmV3IFN0cmluZ1s0XTsKLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIGlmIChqID09IDEpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMV0gPSBkZXN0c1syXSA9IGRlc3RzWzNdID0gaWRlbnRzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJZGVzdHNbMF0gPSBkZXN0c1syXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCX0KLQkJZWxzZSBpZiAoaiA9PSAzKSB7Ci0JCQlkZXN0c1swXSA9IGlkZW50c1swXTsKLQkJCWRlc3RzWzFdID0gZGVzdHNbM10gPSBpZGVudHNbMV07Ci0JCQlkZXN0c1syXSA9IGlkZW50c1syXTsKLQkJfQotCQllbHNlIHsKLQkJCWZvciAoaW50IGsgPSAwOyBrIDwgNDsgaysrKQotCQkJCWRlc3RzW2tdID0gaWRlbnRzW2tdOwotCQl9Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX1RPUCwgZGVzdHNbMF0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00sIGRlc3RzWzJdKTsKLQkJZGVzdC5zZXQoUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fTEVGVCwgZGVzdHNbM10pOwotCi0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UpCi0JCQkJaWRlbnRzW2orK10gPSB0b2tlbnNbaV0uaW1hZ2U7Ci0JCQlpZiAoaiA9PSA0KQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJaWYgKGogPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlIGlmIChqID09IDEpCi0JCQlyZXR1cm4gaWRlbnRzWzBdOwotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9NQVJHSU5fVE9QIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9UT1ApCi0JCQkJcmV0dXJuIGlkZW50c1swXTsKLQkJCWVsc2UgaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX01BUkdJTl9SSUdIVCkKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfTUFSR0lOX0xFRlQpCi0JCQkJcmV0dXJuIGlkZW50c1szXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vUGFkZGluZ1Nob3J0aGFuZEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9QYWRkaW5nU2hvcnRoYW5kQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2RlNDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvaW50ZXJuYWwvdXRpbC9kZWNsYXJhdGlvbi9QYWRkaW5nU2hvcnRoYW5kQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb247Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Qcm9wQ01Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0UGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsKLQotCi0vKioKLSAqIEZvciAncGFkZGluZycgcHJvcGVydHkgJ3BhZGRpbmcnIHdpbGwgYmUgZXhwYW5kZWQgdG8gJ3BhZGRpbmctdG9wJywKLSAqICdwYWRkaW5nLXJpZ2h0JywgJ3BhZGRpbmctYm90dG9tJywgJ3BhZGRpbmctbGVmdCcsCi0gKi8KLXB1YmxpYyBjbGFzcyBQYWRkaW5nU2hvcnRoYW5kQWRhcHRlciBpbXBsZW1lbnRzIElTaG9ydGhhbmRBZGFwdGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBQYWRkaW5nU2hvcnRoYW5kQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleHBhbmQoU3RyaW5nIHNvdXJjZSwgQ1NTUHJvcGVydHlDb250ZXh0IGRlc3QpIHsKLQkJQ1NTVGV4dFBhcnNlciBwYXJzZXIgPSBuZXcgQ1NTVGV4dFBhcnNlcihDU1NUZXh0UGFyc2VyLk1PREVfREVDTEFSQVRJT05fVkFMVUUsIHNvdXJjZSk7Ci0JCUNTU1RleHRUb2tlbltdIHRva2VucyA9IHBhcnNlci5nZXRUb2tlbnMoKTsKLQkJaWYgKHRva2Vucy5sZW5ndGggPD0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlTdHJpbmdbXSBkZXN0cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWlmIChqID09IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAoaiA9PSAxKSB7Ci0JCQlkZXN0c1swXSA9IGRlc3RzWzFdID0gZGVzdHNbMl0gPSBkZXN0c1szXSA9IGlkZW50c1swXTsKLQkJfQotCQllbHNlIGlmIChqID09IDIpIHsKLQkJCWRlc3RzWzBdID0gZGVzdHNbMl0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgaWYgKGogPT0gMykgewotCQkJZGVzdHNbMF0gPSBpZGVudHNbMF07Ci0JCQlkZXN0c1sxXSA9IGRlc3RzWzNdID0gaWRlbnRzWzFdOwotCQkJZGVzdHNbMl0gPSBpZGVudHNbMl07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBrID0gMDsgayA8IDQ7IGsrKykKLQkJCQlkZXN0c1trXSA9IGlkZW50c1trXTsKLQkJfQotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QLCBkZXN0c1swXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19SSUdIVCwgZGVzdHNbMV0pOwotCQlkZXN0LnNldChQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NLCBkZXN0c1syXSk7Ci0JCWRlc3Quc2V0KFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZULCBkZXN0c1szXSk7Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBleHRyYWN0KFN0cmluZyBzb3VyY2UsIFByb3BDTVByb3BlcnR5IHByb3BEZXN0KSB7Ci0JCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OX1ZBTFVFLCBzb3VyY2UpOwotCQlDU1NUZXh0VG9rZW5bXSB0b2tlbnMgPSBwYXJzZXIuZ2V0VG9rZW5zKCk7Ci0JCWlmICh0b2tlbnMubGVuZ3RoIDw9IDApIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ1tdIGlkZW50cyA9IG5ldyBTdHJpbmdbNF07Ci0JCWludCBqID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b2tlbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NVdGlsLmlzTGVuZ3RoKHRva2Vuc1tpXSkgfHwgdG9rZW5zW2ldLmtpbmQgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUiB8fCB0b2tlbnNbaV0ua2luZCA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfUEVSQ0VOVEFHRSkKLQkJCQlpZGVudHNbaisrXSA9IHRva2Vuc1tpXS5pbWFnZTsKLQkJCWlmIChqID09IDQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAoaiA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsc2UgaWYgKGogPT0gMSkKLQkJCXJldHVybiBpZGVudHNbMF07Ci0JCWVsc2UgaWYgKGogPT0gMikgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QIHx8IHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfQk9UVE9NKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGlkZW50c1sxXTsKLQkJfQotCQllbHNlIGlmIChqID09IDMpIHsKLQkJCWlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1RPUCkKLQkJCQlyZXR1cm4gaWRlbnRzWzBdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19CT1RUT00pCi0JCQkJcmV0dXJuIGlkZW50c1syXTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gaWRlbnRzWzFdOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHByb3BEZXN0LmdldE5hbWUoKSA9PSBQcm9wQ01Qcm9wZXJ0eS5QX1BBRERJTkdfVE9QKQotCQkJCXJldHVybiBpZGVudHNbMF07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX1JJR0hUKQotCQkJCXJldHVybiBpZGVudHNbMV07Ci0JCQllbHNlIGlmIChwcm9wRGVzdC5nZXROYW1lKCkgPT0gUHJvcENNUHJvcGVydHkuUF9QQURESU5HX0JPVFRPTSkKLQkJCQlyZXR1cm4gaWRlbnRzWzJdOwotCQkJZWxzZSBpZiAocHJvcERlc3QuZ2V0TmFtZSgpID09IFByb3BDTVByb3BlcnR5LlBfUEFERElOR19MRUZUKQotCQkJCXJldHVybiBpZGVudHNbM107Ci0JCQllbHNlCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL2ludGVybmFsL3V0aWwvZGVjbGFyYXRpb24vVmFsdWVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2NGYzYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC91dGlsL2RlY2xhcmF0aW9uL1ZhbHVlRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5kZWNsYXJhdGlvbjsKLQotCi0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWx1ZURhdGEgewotCi0JcHVibGljIFN0cmluZyB2YWx1ZTsKLQlwdWJsaWMgYm9vbGVhbiBpbXBvcnRhbnQgPSBmYWxzZTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBWYWx1ZURhdGEoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFZhbHVlRGF0YShTdHJpbmcgdmFsLCBib29sZWFuIGltcCkgewotCQlzdXBlcigpOwotCQl2YWx1ZSA9IHZhbDsKLQkJaW1wb3J0YW50ID0gaW1wOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS90ZXh0L0lDU1NQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3RleHQvSUNTU1BhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4NmI5Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy9jb3JlL3RleHQvSUNTU1BhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuIEl0IGRlZmluZXMgdGhlCi0gKiBwYXJ0aXRpb25pbmcgZm9yIENTUyBhbmQgYWxsIGl0cyBwYXJ0aXRpb25zLiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlCi0gKiBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQgaGVyZSBkaXJlY3RseS4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDU1NQYXJ0aXRpb25zIHsKLQotCVN0cmluZyBTVFlMRSA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMxZDllZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMiIGtpbmQ9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiIGtpbmQ9ImNvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiIGtpbmQ9ImNvbiI+Ci0JCTxhY2Nlc3NydWxlcz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS8qKiIvPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlL3VpLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3Qvc3NlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC94bWwvdWkvKioiLz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJiaW4iIGtpbmQ9Im91dHB1dCIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDM3ZjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1jc3NlZGl0b3IuamFyCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi1kZXYucHJvcGVydGllcwotYmluCi1AZG90Ci1zcmMuemlwCi1qYXZhQ29tcGlsZXIuLi5hcmdzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjBiNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5vcHRpb25zCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wcm9qZWN0aW9ucGVyZj1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDIwMzVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5jc3MudWk8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YmFjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA1YzBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuY3NzLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LmNzcy51aSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdC51aTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MucHJvcGVydGllcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkudmlld3M7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMSwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMzU3ODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgLm9wdGlvbnMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwotc291cmNlLi4gPSBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2Nzc193aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdjc3Nfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk0Zjc1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2Nzc193aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjc3Nfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y3NzX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMjg3YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdjc3Nfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2F1cmFsX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2F1cmFsX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYxNzA0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9hdXJhbF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9ib3htb2RlbF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9ib3htb2RlbF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMDUwZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvYm94bW9kZWxfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hhcnNldF9ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NoYXJzZXRfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlOTM4NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hhcnNldF9ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NsYXNzX3NlbGVjdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NsYXNzX3NlbGVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyNGQ3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19zZWxlY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb2xiYWNrX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbGJhY2tfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2EyMzBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2NvbGJhY2tfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29udGVudF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb250ZW50X3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzM2RlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jb250ZW50X3Byb3BzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eW5hbWUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5bmFtZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTU4YWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5bmFtZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9mdW5jdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9mdW5jdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZDEyZGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfZnVuY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfaWRlbnRpZmllci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9pZGVudGlmaWVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkYmRkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9pZGVudGlmaWVyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2Nzc19wcm9wZXJ0eXZhbHVlX3VuaXQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfdW5pdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOGEzYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfdW5pdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250X3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2E1Zjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2ZvbnRfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvZm9udGZhY2VfcnVsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250ZmFjZV9ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzFmNTllOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9mb250ZmFjZV9ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2lkX3NlbGVjdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L2lkX3NlbGVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA4NTdkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9pZF9zZWxlY3Rvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19ydWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkODljZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbGlua19zZWxlY3Rvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3NlbGVjdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg1Yjc4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9saW5rX3NlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L21lZGlhX3J1bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWVkaWFfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOTFmMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvbWVkaWFfcnVsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9vdGhlcl9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9vdGhlcl9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMGMyMjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvb3RoZXJfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFnZV9ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VfcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNWY2NGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFnZV9ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3BhZ2VkbWVkaWFfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFnZWRtZWRpYV9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNjM1YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcGFnZWRtZWRpYV9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wc2V1ZG8uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHNldWRvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI2YTZkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9wc2V1ZG8uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjNWQwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZV9ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlX3J1bGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTc2ZmY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3N0eWxlX3J1bGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvc3R5bGVzaGVldC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZXNoZWV0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhmZGUwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi9zdHlsZXNoZWV0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhYmxlX3Byb3BzLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhYmxlX3Byb3BzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNjNzZjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZV9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZjgxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGVtcGxhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX3NlbGVjdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RhZ19zZWxlY3Rvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODUwZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnX3NlbGVjdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3RleHRfcHJvcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dF9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZjYzZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91aV9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi91aV9wcm9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5YThiOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdWlfcHJvcHMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdW5rbm93bl9ydWxlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Vua25vd25fcnVsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1N2U0ZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvb2JqMTYvdW5rbm93bl9ydWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Zpc3VhbF9wcm9wcy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC9vYmoxNi92aXN1YWxfcHJvcHMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE4YjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9pY29ucy9mdWxsL29iajE2L3Zpc3VhbF9wcm9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3Y3NzZmlsZV93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2Nzc2ZpbGVfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRjZjAzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3Y3NzZmlsZV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzBlNGEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9U1NFIENTUyBTb3VyY2UgRWRpdG9yCi1DU1NfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9Q1NTIEVkaXRvcgotQ1NTX0ZpbGVzLm5hbWU9Q1NTIEZpbGVzCi1DU1NfU291cmNlLm5hbWU9Q1NTIFNvdXJjZQotQ1NTX1N0eWxlcy5uYW1lPUNTUyBTdHlsZXMKLUNTU19UZW1wbGF0ZXMubmFtZT1DU1MgVGVtcGxhdGVzCi1XZWJDb250ZW50U2V0dGluZ3MubmFtZT1XZWIgQ29udGVudCBTZXR0aW5ncwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgZm9sbG93aW5nIHByb3BlcnR5IGtleXMgbWF5YmUgdW51c2VkLiBDb21tZW50ZWQgb3V0IG9uIDEyLzcvMjAwNC4gVW5jb21tZW50IGlmIG5lZWRlZC4KLSNDU1NfQW5ub3RhdGlvbnMubmFtZT1DU1MgQW5ub3RhdGlvbnMKLQotCi0jb3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyBleHRlbnNpb24gcG9pbnQKLV9VSV9XSVpBUkRfTkFNRSA9IENTUwotX1VJX1dJWkFSRF9DUkVBVEVfTkVXX0ZJTEUgPSBDcmVhdGUgYSBuZXcgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0LgotIyMKLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9UHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD1SZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA9UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotIyMKLUFsbF9DU1NfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9QWxsIENTUwotQ1NTX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgQ1NTCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EzYjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVDU1NfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQWN0aW9uQ29udHJpYnV0b3JDU1MiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmUuQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXMuQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGV4dC5DU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24uU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlLCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc3R5bGVzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX0ZpbGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNTU0ZpbGVzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3MiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX1NvdXJjZS5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTU291cmNlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5jc3Muc291cmNlIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJUNTU19UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmNzcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlQ1NTX1N0eWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ1NTQ29sb3JQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuY3NzLnN0eWxlcyI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gQ1NTIENvbnRlbnQgU2V0dGluZ3MgUHJvcGVydHkgUGFnZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCWFkYXB0YWJsZT0idHJ1ZSIKLQkJCW5hbWU9IiVXZWJDb250ZW50U2V0dGluZ3MubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5jc3MiPgotCQkJPGZpbHRlcgotCQkJCW5hbWU9ImNvbnRlbnRUeXBlSWQiCi0JCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2UiPgotCQkJPC9maWx0ZXI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSI+PC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSI+PC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBjc3MgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gTmV3IENTUyB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZC5OZXdDU1NXaXphcmQiCi0JCQluYW1lPSIlX1VJX1dJWkFSRF9OQU1FIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwud2l6YXJkLk5ld0NTU1dpemFyZCIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Qud2ViLnVpIgotCQkJaWNvbj0iJG5sJC9pY29ucy9mdWxsL2V0b29sMTYvbmV3Y3NzX3dpei5naWYiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiIC8+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZS5SdWxlckNvbnRleHQiCi0JCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5ydWxlci5jb250ZXh0LmFjdGlvbnMiPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkVGFzay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5BZGRUYXNrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkVGFzay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuYm9va21hcmtfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLQkJCQl0b29sdGlwPSIlQWRkQm9va21hcmsudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvdmlld2VyQ29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBUZW1wbGF0ZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZW1wbGF0ZXMiPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVBbGxfQ1NTX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVDU1MiCi0JCQlpZD0iY3NzX2FsbCI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJUNTU19OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUNTUyIKLQkJCWlkPSJjc3NfbmV3Ij4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGluY2x1ZGUKLQkJCWZpbGU9InRlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwiCi0JCQl0cmFuc2xhdGlvbnM9IiRubCQvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMiPgotCQk8L2luY2x1ZGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIENTUyBlZGl0b3IgYWN0aW9ucyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5jc3Nzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmNzc3NvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJDbGVhbnVwRG9jdW1lbnQiCi0JCQkJbGFiZWw9IiVDbGVhbnVwRG9jdW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiCi0JCQkJdG9vbHRpcD0iJUNsZWFudXBEb2N1bWVudF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJDbGVhbnVwRG9jdW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dENTU0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA0YjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLk11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGV4dC5JQ1NTUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmF1dG9lZGl0LlN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5Q1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgQ1NTLgotICogPHA+Ci0gKiBDbGllbnRzIGNhbiBzdWJjbGFzcyBhbmQgb3ZlcnJpZGUganVzdCB0aG9zZSBtZXRob2RzIHdoaWNoIG11c3QgYmUgc3BlY2lmaWMKLSAqIHRvIHRoZWlyIG5lZWRzLgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2Ugbm90IHNvdXJjZXZpZXdlci1zcGVjaWZpYyBhbmQKLQkgKiBpdCdzIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTOwotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdXBlclN0cmF0ZWdpZXMgPSBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChzdXBlclN0cmF0ZWdpZXNbaV0pOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IElDU1NQYXJ0aXRpb25zLlNUWUxFKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChuZXcgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MoKSk7Ci0JCX0KLQotCQlyZXR1cm4gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbMF0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWlmIChmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9PSBudWxsKSB7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbXXtJQ1NTUGFydGl0aW9ucy5TVFlMRSwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT059OwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHx8IChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTikpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCi0JCXJldHVybiBwcm9jZXNzb3JzOwotCX0KLQotCXB1YmxpYyBJQ29udGVudEZvcm1hdHRlciBnZXRDb250ZW50Rm9ybWF0dGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZpbmFsIE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbmV3IE11bHRpUGFzc0NvbnRlbnRGb3JtYXR0ZXIoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlciksIElDU1NQYXJ0aXRpb25zLlNUWUxFKTsKLQotCQlmb3JtYXR0ZXIuc2V0TWFzdGVyU3RyYXRlZ3kobmV3IFN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kobmV3IEZvcm1hdFByb2Nlc3NvckNTUygpKSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW5kZW50UHJlZml4ZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCS8vIHByZWZpeFswXSBpcyBlaXRoZXIgJ1x0JyBvciAnICcgeCB0YWJXaWR0aCwgZGVwZW5kaW5nIG9uIHByZWZlcmVuY2UKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJYm9vbGVhbiB1c2VTcGFjZXMgPSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhpbmRlbnRDaGFyUHJlZik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBhcHBlbmRUYWIgPSBmYWxzZTsKLQotCQkJaWYgKHVzZVNwYWNlcykgewotCQkJCWZvciAoaW50IGogPSAwOyBqICsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0KLQkJCQlpZiAoaSAhPSBpbmRlbnRhdGlvbldpZHRoKQotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXBwZW5kVGFiKSB7Ci0JCQkJcHJlZml4LmFwcGVuZCgnXHQnKTsKLQkJCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJCQkvLyByZW1vdmUgdGhlIHRhYiBzbyB0aGF0IGluZGVudGF0aW9uIC0gdGFiIGlzIGFsc28gYW4gaW5kZW50Ci0JCQkJLy8gcHJlZml4Ci0JCQkJcHJlZml4LmRlbGV0ZUNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJdmVjdG9yLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKFN0cmluZ1tdKSB2ZWN0b3IudG9BcnJheShuZXcgU3RyaW5nW3ZlY3Rvci5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLQotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJQ1NTUGFydGl0aW9ucy5TVFlMRSkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JDU1MoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JDU1MoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvckNTUzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0FjdGlvbkNvbnRyaWJ1dG9yQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQWN0aW9uQ29udHJpYnV0b3JDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc1OGNmNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQWN0aW9uQ29udHJpYnV0b3JDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXRhcmdldFRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLQotLyoqCi0gKiBBY3Rpb25Db250cmlidXRvckNTUwotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvckNTUyBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuY3Nzc291cmNlLnNvdXJjZSIsICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ29udGVudEFzc2lzdCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ2xlYW51cERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgZkZvcm1hdE1lbnUgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZvcm1hdERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZGb3JtYXRBY3RpdmVFbGVtZW50cyA9IG51bGw7Ci0KLQlwdWJsaWMgQWN0aW9uQ29udHJpYnV0b3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBDU1NVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCk7Ci0KLQkJLy8gZWRpdCBjb21tYW5kcwotCQlmQ29udGVudEFzc2lzdCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlmQ29udGVudEFzc2lzdC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUyk7Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCWZDbGVhbnVwRG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5DTEVBTlVQX0RPQ1VNRU5UKTsKLQotCQlmRm9ybWF0RG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9ET0NVTUVOVCk7Ci0KLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKTsKLQotCQlmRm9ybWF0TWVudSA9IG5ldyBNZW51TWFuYWdlcihDU1NVSU1lc3NhZ2VzLkZvcm1hdE1lbnVfbGFiZWwpOwotCQlmRm9ybWF0TWVudS5hZGQoZkZvcm1hdERvY3VtZW50KTsKLQkJZkZvcm1hdE1lbnUuYWRkKGZGb3JtYXRBY3RpdmVFbGVtZW50cyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIGVkaXRNZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWlmIChlZGl0TWVudSAhPSBudWxsKSB7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmRXhwYW5kU2VsZWN0aW9uVG9NZW51KTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZDb250ZW50QXNzaXN0KTsKLQkJCWVkaXRNZW51LmFkZChmTWVudUFkZGl0aW9uc0dyb3VwTWFya2VyKTsKLQkJfQotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlTdHJpbmcgc291cmNlTWVudUxhYmVsID0gQ1NTVUlNZXNzYWdlcy5Tb3VyY2VNZW51X2xhYmVsOwotCQlTdHJpbmcgc291cmNlTWVudUlkID0gInNvdXJjZU1lbnVJZCI7IC8vJE5PTi1OTFMtMSQKLQkJSU1lbnVNYW5hZ2VyIHNvdXJjZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoc291cmNlTWVudUxhYmVsLCBzb3VyY2VNZW51SWQpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCBzb3VyY2VNZW51KTsKLQkJaWYgKHNvdXJjZU1lbnUgIT0gbnVsbCkgewotCQkJc291cmNlTWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdFJpZ2h0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZTaGlmdExlZnQpOwotCQkJc291cmNlTWVudS5hZGQoZkNsZWFudXBEb2N1bWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmRm9ybWF0TWVudSk7Ci0JCQlzb3VyY2VNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gZ2V0VGV4dEVkaXRvcihhY3RpdmVFZGl0b3IpOwotCi0JCWZDb250ZW50QXNzaXN0LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMpKTsKLQotCQlmQ2xlYW51cERvY3VtZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ0xFQU5VUF9ET0NVTUVOVCkpOwotCQlmRm9ybWF0RG9jdW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQpKTsKLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUykpOwotCQlmQ2xlYW51cERvY3VtZW50LnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiNGZiMmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi1wdWJsaWMgY2xhc3MgQ1NTVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgQ1NTVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJTkZPX05vdF9DYXRlZ29yaXplZF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfV3JhcHBpbmdXaXRob3V0QXR0cjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUdyb3VwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUlkZW50OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0Nhc2VJZGVudFVwcGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZUlkZW50TG93ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9DYXNlUHJvcE5hbWVVcHBlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZUxvd2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZVVwcGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZUxvd2VyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfU2VsZWN0b3JUYWdOYW1lVXBwZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVMb3dlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yU2FtcGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JOb3JtYWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvckF0bWFya1J1bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclNlbGVjdG9yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JNZWRpYTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQ29tbWVudDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eVZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZWZzTGFiZWxfQ29sb3JVcmk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclN0cmluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQ29sb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZnNMYWJlbF9Db2xvclNlbWlDb2xvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yQ3VybHlCcmFjZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmc0xhYmVsX0NvbG9yRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU29ydEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0NTUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGl0bGVfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1lc3NhZ2VfSW52YWxpZFZhbHVlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdE1lbnVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9ub25lOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU19DbGVhbnVwX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJZGVudGlmaWVyX2Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9wZXJ0eV92YWx1ZV9jYXNlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2VsZWN0b3JfdGFnX25hbWVfY2FzZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1b3RlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXNfaXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvd2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVcHBlcl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXR0aW5nX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBMaW5lX3dpZHRoX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3RhYnNfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudF91c2luZ19zcGFjZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50YXRpb25fc2l6ZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplX3RpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8xOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0NTU1VJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg2ODhlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkNTU1VJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1M7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5jc3MudWkiOyAvLyROT04tTkxTLTEkCi0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENTU1VJUGx1Z2luIHBsdWdpbjsJCi0JCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgY3NzIHVpLgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIGNzcyB1aS4KLQkgKi8KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIENTU1VJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIENTU1VJUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgY3NzIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSBjc3MgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBDU1NVSVByZWZlcmVuY2VOYW1lcy5URU1QTEFURVNfS0VZKTsKLQotCQkJdHJ5IHsKLQkJCQlmVGVtcGxhdGVTdG9yZS5sb2FkKCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgY3NzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBjb250ZXh0IHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBjc3MgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuQUxMKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQotCQkJZkNvbnRleHRUeXBlUmVnaXN0cnkgPSByZWdpc3RyeTsKLQkJfQotCi0JCXJldHVybiBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvQ1NTVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTkyZDA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9DU1NVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotSU5GT19Ob3RfQ2F0ZWdvcml6ZWRfMT1Ob3QgQ2F0ZWdvcml6ZWQKLQotIyMgQ1NTIFByZWZlcmVuY2VzIC0tIHNvdXJjZSAjIwotUHJlZnNMYWJlbF9XcmFwcGluZ1dpdGhvdXRBdHRyPURpc2FibGUgd3JhcHBpbmcgaW4gc3R5bGUgJmF0dHJpYnV0ZSBvZiBIVE1MCi1QcmVmc0xhYmVsX1dyYXBwaW5nSW5zZXJ0TGluZUJyZWFrPUluc2VydCAmbGluZSBicmVhayBiZXR3ZWVuIHByb3BlcnRpZXMKLQotUHJlZnNMYWJlbF9DYXNlR3JvdXA9Q2FwaXRhbGl6YXRpb24gc3R5bGUKLVByZWZzTGFiZWxfQ2FzZUlkZW50PUlkZW50aWZpZXI6Ci1QcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZT1Qcm9wZXJ0eSBuYW1lOgotUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlPVByb3BlcnR5IHZhbHVlOgotUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWU9U2VsZWN0b3IgdGFnIG5hbWU6Ci0KLVByZWZzTGFiZWxfQ2FzZUlkZW50VXBwZXI9JlVwcGVyY2FzZQotUHJlZnNMYWJlbF9DYXNlSWRlbnRMb3dlcj1MJm93ZXJjYXNlCi1QcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZVVwcGVyPVUmcHBlcmNhc2UKLVByZWZzTGFiZWxfQ2FzZVByb3BOYW1lTG93ZXI9TG8md2VyY2FzZQotUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlVXBwZXI9VXBwJmVyY2FzZQotUHJlZnNMYWJlbF9DYXNlUHJvcFZhbHVlTG93ZXI9TG93ZSZyY2FzZQotUHJlZnNMYWJlbF9TZWxlY3RvclRhZ05hbWVVcHBlcj1VcHBlciZjYXNlCi1QcmVmc0xhYmVsX1NlbGVjdG9yVGFnTmFtZUxvd2VyPUxvd2VyY2Emc2UKLQotIyMgQ1NTIFByZWZlcmVuY2VzIC0tIGNvbG9yICMjCi0KLSMjIFRoZSBmb2xsb3dpbmcgbGluZSBpcyBhIHNhbXBsZSBDU1MgZG9jdW1lbnQuICBQbGVhc2UgdHJhbnNsYXRlIG9ubHkgdGhlIGZvbGxvd2luZyBwYXJ0czoKLSMjIFNhbXBsZSBTdHlsZXMKLVByZWZzTGFiZWxfQ29sb3JTYW1wbGU9QGltcG9ydCB1cmwoIi4uL3NhbXBsZTIuY3NzIik7XG5cbi8qIFNhbXBsZSBTdHlsZXMgKi9cblxuQk9EWSB7XG5cdGNvbG9yIDogYmxhY2s7XG5cdGJhY2tncm91bmQtY29sb3IgOiByZ2IoMTgxLCAyNTMsIDIxMSk7XG5cdHRleHQtYWxpZ24gOiBjZW50ZXI7XG5cdGZvbnQtZmFtaWx5IDogIkhlaXNlaSBNaW5jaG8gVzMiLCBzZXJpZlxufVxuXG5AcGFnZSA6bGVmdCB7IG1hcmdpbi1sZWZ0IDogNGNtIH1cblxuQG1lZGlhIGF1cmFsIHtcblx0UC5oZWlkaSB7XG5cdFx0YXppbXV0aCA6IGNlbnRlci1sZWZ0O1xuXHRcdGVsZXZhdGlvbiA6IDEyLjNkZWc7XG5cdFx0cGF1c2UgOiAzMG1zIDEuNnNcblx0fVxufVxuCi0KLVByZWZzTGFiZWxfQ29sb3JOb3JtYWw9RGVmYXVsdAotUHJlZnNMYWJlbF9Db2xvckF0bWFya1J1bGU9QXQtUnVsZQotUHJlZnNMYWJlbF9Db2xvclNlbGVjdG9yPVNlbGVjdG9yCi1QcmVmc0xhYmVsX0NvbG9yTWVkaWE9TWVkaWEgTmFtZQotUHJlZnNMYWJlbF9Db2xvckNvbW1lbnQ9Q29tbWVudAotUHJlZnNMYWJlbF9Db2xvclByb3BlcnR5TmFtZT1Qcm9wZXJ0eSBOYW1lCi1QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlWYWx1ZT1Qcm9wZXJ0eSBWYWx1ZQotUHJlZnNMYWJlbF9Db2xvclVyaT1VUkkKLVByZWZzTGFiZWxfQ29sb3JTdHJpbmc9UXVvdGVkIFN0cmluZwotUHJlZnNMYWJlbF9Db2xvckNvbG9uPVByb3BlcnR5IERlbGltaXRlcgotUHJlZnNMYWJlbF9Db2xvclNlbWlDb2xvbj1TZW1pQ29sb24KLVByZWZzTGFiZWxfQ29sb3JDdXJseUJyYWNlPUN1cmx5IEJyYWNlCi1QcmVmc0xhYmVsX0NvbG9yRXJyb3I9RXJyb3IKLSMKLVNvcnRBY3Rpb25fMD1Tb3J0Ci0jCi1fVUlfV0laQVJEX05FV19USVRMRSA9IE5ldyBDYXNjYWRpbmcgU3R5bGUgU2hlZXQKLV9VSV9XSVpBUkRfTkVXX0hFQURJTkcgPSBDYXNjYWRpbmcgU3R5bGUgU2hlZXQKLV9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OID0gQ3JlYXRlIGEgbmV3IENTUyBmaWxlLgotX0VSUk9SX0ZJTEVOQU1FX01VU1RfRU5EX0NTUyA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi1fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQgPSBGaWxlcyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFdlYiBDb250ZW50IGZvbGRlciB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB5b3VyIGRlcGxveWVkIFdlYiBhcHBsaWNhdGlvbi4gCi0jCi1UaXRsZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBWYWx1ZQotTWVzc2FnZV9JbnZhbGlkVmFsdWU9SW52YWxpZCBwcm9wZXJ0eSB2YWx1ZS4KLSMgQ29waWVkIGZyb20gc3NlLnVpCi1Gb3JtYXRNZW51X2xhYmVsPUYmb3JtYXQKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DJmxlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLVVJX25vbmU9bm9uZQotQ2xlYW51cF9VSV89Q2xlYW51cAotQ1NTX0NsZWFudXBfVUlfPUNTUyBDbGVhbnVwCi1JZGVudGlmaWVyX2Nhc2VfX1VJXz1JZGVudGlmaWVyIGNhc2U6Ci1Qcm9wZXJ0eV9uYW1lX2Nhc2VfX1VJXz1Qcm9wZXJ0eSBuYW1lIGNhc2U6Ci1Qcm9wZXJ0eV92YWx1ZV9jYXNlX19VSV89UHJvcGVydHkgdmFsdWUgY2FzZToKLVNlbGVjdG9yX3RhZ19uYW1lX2Nhc2VfX1VJXz1TZWxlY3RvciB0YWcgbmFtZSBjYXNlOgotUXVvdGVfdmFsdWVzX1VJXz1RdW90ZSB2YWx1ZXMKLUZvcm1hdF9zb3VyY2VfVUlfPSZGb3JtYXQgc291cmNlCi1Bc19pc19VSV89QXMtaXMKLUxvd2VyX1VJXz1Mb3dlcgotVXBwZXJfVUlfPVVwcGVyCi1Tb3VyY2VNZW51X2xhYmVsPSZTb3VyY2UKLUZvcm1hdHRpbmdfVUlfPUZvcm1hdHRpbmcKLUxpbmVfd2lkdGhfX1VJXz1MaW5lICZ3aWR0aDoKLUluZGVudF91c2luZ190YWJzXz0mSW5kZW50IHVzaW5nIHRhYnMKLUluZGVudF91c2luZ19zcGFjZXM9SSZuZGVudCB1c2luZyBzcGFjZXMKLUluZGVudGF0aW9uX3NpemU9SW4mZGVudGF0aW9uIHNpemU6Ci1JbmRlbnRhdGlvbl9zaXplX3RpcD1JbmRlbnRhdGlvbiBzaXplCi1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWw9JkVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9Jk5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdE5leHRfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9JlByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi0jIwotQ3JlYXRpbmdfZmlsZXNfZW5jb2Rpbmc9Q3JlYXRpbmcgZmlsZXMgZW5jb2RpbmcgcHJlZmVyZW5jZQotUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzID0gVGhlIHNhbWUgbmFtZSBhbHJlYWR5IGV4aXN0cy4KLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgQ1NTIFRlbXBsYXRlCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzE9U2VsZWN0IGEgdGVtcGxhdGUgYXMgaW5pdGlhbCBjb250ZW50IGluIHRoZSBDU1MgcGFnZS4KLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMj1OYW1lCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzM9RGVzY3JpcHRpb24KLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgQ1NTIFRlbXBsYXRlCi1OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzU9UHJldmlldzoKLU5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNj1UZW1wbGF0ZXMgYXJlICdOZXcgQ1NTJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkNTUyBUZW1wbGF0ZXM8L2E+IHByZWZlcmVuY2UgcGFnZS4KLSMgQ1NTIENvbnRlbnQgU2V0dGluZ3MKLUNTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSB0eXBlIG9mIENTUyB0byB1c2UuICBUaGUgcHJvamVjdCBzZXR0aW5nIGlzIHVzZWQgaWYgeW91IHNwZWNpZnkgIm5vbmUuIgotQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzE9Q1NTIFByb2ZpbGU6CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ODg2NjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QuY3NzLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5Q1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWFkMzI0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmF1dG9lZGl0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lDU1MgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQotCWNsYXNzIENvbXBvdW5kUmVnaW9uIHsKLQotCQlDb21wb3VuZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCQlzdXBlcigpOwotCQkJdGhpcy5kb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uOwotCQkJdGhpcy50ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RG9jdW1lbnRSZWdpb24oKSB7Ci0JCQlyZXR1cm4gZG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBnZXRUZXh0UmVnaW9uKCkgewotCQkJcmV0dXJuIHRleHRSZWdpb247Ci0JCX0KLQotCQlpbnQgZ2V0U3RhcnQoKSB7Ci0JCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRTdGFydCgpOwotCQl9Ci0KLQkJaW50IGdldEVuZCgpIHsKLQkJCXJldHVybiB0ZXh0UmVnaW9uLmdldEVuZCgpOwotCQl9Ci0KLQkJU3RyaW5nIGdldFR5cGUoKSB7Ci0JCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCX0KLQotCQlTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJCXJldHVybiBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KHRleHRSZWdpb24pOwotCQl9Ci0KLQkJaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQkJcmV0dXJuIGRvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRleHRSZWdpb24pOwotCQl9Ci0KLQkJaW50IGdldEVuZE9mZnNldCgpIHsKLQkJCXJldHVybiBkb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCX0KLQotCQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb247Ci0JCXByaXZhdGUgSVRleHRSZWdpb24gdGV4dFJlZ2lvbjsKLQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGF1dG9JbmRlbnRBZnRlckNsb3NlKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlpZiAoIXNldFJhbmdlRm9yQ2xvc2UoY29tbWFuZCkpCi0JCQlyZXR1cm47Ci0KLQkJaW50IHBvc2l0aW9uID0gY29tbWFuZC5vZmZzZXQgKyBjb21tYW5kLmxlbmd0aDsKLQotCQlpZiAocG9zaXRpb24gPT0gLTEgfHwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGdldCBvcGVuIGJyYWNlIHJlZ2lvbgotCQlDb21wb3VuZFJlZ2lvbiByZWdpb24gPSBwcmV2Q29ycmVzcG9uZGVuY2UocG9zaXRpb24sIHJlZ2lvblR5cGUpOwotCi0JCS8vIGdldCBpbmRlbnRhdGlvbgotCQlTdHJpbmcgc3RyID0gZ2V0SW5kZW50Rm9yKHJlZ2lvbiwgZmFsc2UpOwotCi0JCS8vIGFwcGVuZCB0byBpbnB1dAotCQlpZiAoc3RyICE9IG51bGwpCi0JCQljb21tYW5kLnRleHQgPSBzdHIgKyBjb21tYW5kLnRleHQ7Ci0JfQotCi0JLyoqCi0JICogQ29waWVzIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGluZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhdXRvSW5kZW50QWZ0ZXJOZXdMaW5lKERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCS8vIHNlbGVjdCBuZWFyZXN0IHdoaXRlIHNwYWNlcyB0byByZXBsYWNlIHdpdGggbmV3LWxpbmUKLQkJc2V0UmFuZ2VGb3JOZXdMaW5lKGNvbW1hbmQpOwotCi0JCS8vIGdldCBwb3NpdGlvbgotCQlpbnQgcG9zaXRpb24gPSBjb21tYW5kLm9mZnNldDsKLQotCQlpZiAocG9zaXRpb24gPT0gLTEgfHwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGdldCBjdXJyZW50IHJlZ2lvbgotCQlDb21wb3VuZFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gZ2V0UmVnaW9uKGNvbW1hbmQub2Zmc2V0ICsgY29tbWFuZC5sZW5ndGgpOwotCi0JCS8vIGdldCBrZXkgcmVnaW9uCi0JCUNvbXBvdW5kUmVnaW9uIGtleVJlZ2lvbiA9IGdldFByZXZLZXlSZWdpb24ocG9zaXRpb24sIGN1cnJlbnRSZWdpb24pOwotCi0JCS8vIGdldCBpbmRlbnQgc3RyaW5nCi0JCVN0cmluZyBzdHIgPSBnZXRJbmRlbnRGb3Ioa2V5UmVnaW9uLCB0cnVlKTsKLQotCQkvLyBjaGVjayBhbm90aGVyIGluZGVudGF0aW9uCi0JCWludCBzaGlmdCA9IG5lZWRTaGlmdChrZXlSZWdpb24sIGNvbW1hbmQub2Zmc2V0ICsgY29tbWFuZC5sZW5ndGgpOwotCi0JCS8vIGNyZWF0ZSB0ZXh0IHRvIHJlcGxhY2UKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoY29tbWFuZC50ZXh0KTsKLQkJaWYgKHN0ciAhPSBudWxsKQotCQkJYnVmLmFwcGVuZChzdHIpOwotCQl3aGlsZSAoc2hpZnQtLSAhPSAwKQotCQkJYnVmLmFwcGVuZChnZXRJbmRlbnRTdHJpbmcoKSk7Ci0JCWNvbW1hbmQudGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJT2JqZWN0IHRleHRFZGl0b3IgPSBnZXRBY3RpdmVUZXh0RWRpdG9yKCk7Ci0JCWlmICghKHRleHRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvckV4dGVuc2lvbjMgJiYgKChJVGV4dEVkaXRvckV4dGVuc2lvbjMpIHRleHRFZGl0b3IpLmdldEluc2VydE1vZGUoKSA9PSBJVGV4dEVkaXRvckV4dGVuc2lvbjMuU01BUlRfSU5TRVJUKSkKLQkJCXJldHVybjsKLQotCQkvLyByZXR1cm47Ci0JCS8vIC8qCi0JCXN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQotCQlpZiAoY29tbWFuZC5sZW5ndGggPT0gMCAmJiBjb21tYW5kLnRleHQgIT0gbnVsbCkgewotCQkJaWYgKGVuZHNXaXRoKGRvY3VtZW50LmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgY29tbWFuZC50ZXh0KSAhPSAtMSkgewotCQkJCWF1dG9JbmRlbnRBZnRlck5ld0xpbmUoY29tbWFuZCk7Ci0JCQl9IGVsc2UgaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIn0iKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlhdXRvSW5kZW50QWZ0ZXJDbG9zZShjb21tYW5kLCBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiXSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCWF1dG9JbmRlbnRBZnRlckNsb3NlKGNvbW1hbmQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKTsKLQkJCX0gZWxzZSBpZiAoY29tbWFuZC50ZXh0LmVxdWFscygiKSIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCWF1dG9JbmRlbnRBZnRlckNsb3NlKGNvbW1hbmQsIENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSk7Ci0JCQl9Ci0JCX0KLQkJLy8gKi8KLQkJCi0JCS8vIHNwYWNlcyBmb3IgdGFiIGNoYXJhY3RlcgotCQlpZiAoY29tbWFuZC50ZXh0ICE9IG51bGwgJiYgY29tbWFuZC50ZXh0Lmxlbmd0aCgpID4gMCAmJiBjb21tYW5kLnRleHQuY2hhckF0KDApID09ICdcdCcpCi0JCQlzbWFydEluc2VydEZvclRhYihjb21tYW5kLCBkb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmRlbnRGb3IoQ29tcG91bmRSZWdpb24gcmVnaW9uLCBib29sZWFuIGluZGVudEZvck5leHRSZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSByZWdpb24uZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0cnkgewotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJLy8gZ2V0IG1lYW5mdWwgZmxhdCBub2RlCi0JCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZmxhdE5vZGUsIHJlZ2lvbi5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCWl0LnByZXYoKTsKLQkJCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHIgPSBpdC5wcmV2KCk7Ci0JCQkJCXJlZ2lvbiA9IG5ldyBDb21wb3VuZFJlZ2lvbihpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TKQotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWZsYXROb2RlID0gcmVnaW9uLmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJLy8gZ2V0IGluZGVudCBzdHJpbmcKLQkJCQlpbnQgcG9zaXRpb24gPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbik7Ci0JCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQkJaW50IGVuZCA9IGZpbmRFbmRPZldoaXRlU3BhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydCwgcG9zaXRpb24pOwotCQkJCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCB8fAotCQkJLy8gcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFSRU5USEVTSVNfT1BFTiB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04gfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSB7Ci0JCQkJaW50IHBvc2l0aW9uID0gZmxhdE5vZGUuZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCWludCBsaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbik7Ci0JCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSk7Ci0JCQkJaW50IGVuZCA9IGZpbmRFbmRPZldoaXRlU3BhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydCwgcG9zaXRpb24pOwotCQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudC5nZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KSk7Ci0JCQkJcG9zaXRpb24gKz0gcmVnaW9uLmdldFRleHQoKS5sZW5ndGgoKTsKLQkJCQlpZiAoaW5kZW50Rm9yTmV4dFJlZ2lvbikgewotCQkJCQlpbnQgdG9rZW5TdGFydCA9IGZpbmRFbmRPZldoaXRlU3BhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbiwgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobGluZSkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZUxlbmd0aChsaW5lKSAtIDEpOwotCQkJCQlpZiAodG9rZW5TdGFydCA8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpICsgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVMZW5ndGgobGluZSkgLSAxKSB7Ci0JCQkJCQlwb3NpdGlvbiA9IHRva2VuU3RhcnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJd2hpbGUgKHBvc2l0aW9uIC0gZW5kID4gMCkgewotCQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCQllbmQrKzsKLQkJCQl9Ci0JCQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCQkJfSBlbHNlCi0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjcCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tcG91bmRSZWdpb24gZ2V0UHJldktleVJlZ2lvbihpbnQgcG9zaXRpb24sIENvbXBvdW5kUmVnaW9uIGN1cnJlbnRSZWdpb24pIHsKLQkJaWYgKGN1cnJlbnRSZWdpb24gPT0gbnVsbCkgewotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWlmIChjdXJyZW50UmVnaW9uICE9IG51bGwgJiYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQgfHwgY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKSkgewotCQkJcmV0dXJuIHByZXZDb3JyZXNwb25kZW5jZShjdXJyZW50UmVnaW9uKTsKLQkJfQotCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgcG9zaXRpb24gLSAxKTsKLQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJSVRleHRSZWdpb24gciA9IGl0LnByZXYoKTsKLQkJCUNvbXBvdW5kUmVnaW9uIHJlZ2lvbiA9IG5ldyBDb21wb3VuZFJlZ2lvbihpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgcik7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8Ci0JCQkvLyByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwKLQkJCQkJCXJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9TVEFSVCB8fAotCQkJCQkJLy8gcmVnaW9uLmdldFR5cGUoKSA9PQotCQkJCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0JSQUNLRVRfQ0xPU0UgfHwKLQkJCQkJCS8vIC8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0KLQkJCQkJCS8vIENTU1JlZ2lvbkNvbnRleHRzLkNTU19QQVJFTlRIRVNJU19PUEVOIHx8Ci0JCQkJCQkvLyByZWdpb24uZ2V0VHlwZSgpID09Ci0JCQkJCQkvLyBDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFSRU5USEVTSVNfQ0xPU0UgfHwKLQkJCQkJCXJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgfHwKLQkJCQkJCS8vIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTE9OIHx8Ci0JCQkJCQkvLyByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UCi0JCQkJCQkvLyB8fAotCQkJCQkJcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT04pIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfSBlbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJCS8vIHNraXAgdG8gTEJSQUNFCi0JCQkJQ29tcG91bmRSZWdpb24gcGMgPSBwcmV2Q29ycmVzcG9uZGVuY2UocmVnaW9uKTsKLQkJCQkvLyBndWFyZCBmb3IgTlBFCi0JCQkJLy9odHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMzE4Ci0JCQkJaWYgKHBjID09IG51bGwpIGJyZWFrOwotCQkJCWl0LnJlc2V0KHBjLmdldERvY3VtZW50UmVnaW9uKCksIHBjLmdldFRleHRSZWdpb24oKSk7Ci0JCQkJaXQucHJldigpOwotCQkJfSBlbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TVFJJTkcpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdFRtcCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uKTsKLQkJCQlpZiAocmVnaW9uID09IGl0VG1wLnByZXYoKSkKLQkJCQkJcmV0dXJuIHJlZ2lvbjsgLy8gcG9zaXRpb24gaXMgaW5zaWRlIG9mIHN0cmluZwotCQkJfSBlbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5UKSB7Ci0JCQkJUmVnaW9uSXRlcmF0b3IgaXRUbXAgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbik7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBpdFRtcC5wcmV2KCkpCi0JCQkJCXJldHVybiByZWdpb247IC8vIHBvc2l0aW9uIGlzIGluc2lkZSBvZiBjb21tZW50Ci0JCQl9IGVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04pIHsKLQkJCQlTdHJpbmcgc3RyID0gcmVnaW9uLmdldFRleHQoKTsKLQkJCQlpZiAoc3RyLmNoYXJBdChzdHIubGVuZ3RoKCkgLSAxKSA9PSAnXFwnKQotCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfSBlbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQlSZWdpb25JdGVyYXRvciBpdFByZXYgPSBuZXcgUmVnaW9uSXRlcmF0b3IocmVnaW9uLmdldERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbi5nZXRUZXh0UmVnaW9uKCkpOwotCQkJCXdoaWxlIChpdFByZXYuaGFzUHJldigpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvblByZXYgPSBpdFByZXYucHJldigpOwotCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0gZWxzZSBpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJCQl9IGVsc2UgaWYgKHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpIHsKLQkJCQkJCXdoaWxlIChpdFByZXYuaGFzUHJldigpKSB7Ci0JCQkJCQkJcmVnaW9uUHJldiA9IGl0UHJldi5wcmV2KCk7Ci0JCQkJCQkJaWYgKHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQSkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UgfHwgcmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSB8fCByZWdpb25QcmV2LmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHJlZ2lvblByZXYuZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpCi0JCQkJCQkJCXJldHVybiByZWdpb247Ci0JCQkJCQl9Ci0JCQkJCQlpZiAocmVnaW9uUHJldi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElBKQotCQkJCQkJCWJyZWFrOwotCQkJCQkJZWxzZQotCQkJCQkJCXJldHVybiByZWdpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uIGdldFJlZ2lvbihpbnQgcG9zaXRpb24pIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbik7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBDb21wb3VuZFJlZ2lvbihmbGF0Tm9kZSwgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zaXRpb24pKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGludCBuZWVkU2hpZnQoQ29tcG91bmRSZWdpb24gcmVnaW9uLCBpbnQgcG9zaXRpb24pIHsKLQkJaW50IHNoaWZ0ID0gMDsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSB7Ci0JCQkvLyBnZXQgbm9uIHNwYWNlIHJlZ2lvbgotCQkJQ29tcG91bmRSZWdpb24gY3IgPSBnZXRSZWdpb24ocG9zaXRpb24gLSAxKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGNyLmdldERvY3VtZW50UmVnaW9uKCksIGNyLmdldFRleHRSZWdpb24oKSk7Ci0JCQlJVGV4dFJlZ2lvbiBuZWFyZXN0UmVnaW9uID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQluZWFyZXN0UmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmIChuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUyAmJiBuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVhcmVzdFJlZ2lvbiAhPSBudWxsICYmIChuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFIHx8IG5lYXJlc3RSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgbmVhcmVzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUiB8fCBuZWFyZXN0UmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSkKLQkJCQlzaGlmdC0tOwotCQkJZWxzZSBpZiAocmVnaW9uID09IG51bGwpCi0JCQkJc2hpZnQtLTsKLQkJCXNoaWZ0Kys7Ci0JCX0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkgewotCQkJUmVnaW9uSXRlcmF0b3IgaXQgPSBuZXcgUmVnaW9uSXRlcmF0b3Ioc3RydWN0dXJlZERvY3VtZW50LCBwb3NpdGlvbik7Ci0JCQlpZiAoIWl0Lmhhc1ByZXYoKSB8fCBpdC5wcmV2KCkuZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpCi0JCQkJc2hpZnQrKzsKLQkJCWVsc2UKLQkJCQlzaGlmdCA9IDA7Ci0JCX0KLQkJcmV0dXJuIHNoaWZ0OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDb21wb3VuZFJlZ2lvbiBwcmV2Q29ycmVzcG9uZGVuY2UoaW50IHBvc2l0aW9uLCBTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlSZWdpb25JdGVyYXRvciBpdCA9IG5ldyBSZWdpb25JdGVyYXRvcihzdHJ1Y3R1cmVkRG9jdW1lbnQsIHBvc2l0aW9uIC0gMSk7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCWludCBuZXN0ID0gMTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkgewotCQkJLy8gc2tpcCB0byBMQlJBQ0UKLQkJCXdoaWxlIChpdC5oYXNQcmV2KCkpIHsKLQkJCQlyZWdpb24gPSBpdC5wcmV2KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkKLQkJCQkJbmVzdC0tOwotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkKLQkJCQkJbmVzdCsrOwotCQkJCWlmIChuZXN0IDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG5lc3QgPT0gMCkKLQkJCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByZWdpb24pOwotCQl9Ci0JCWlmIChyZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EKSB7Ci0JCQkvLyBza2lwIHRvIEJSQUNLRVRfT1BFTgotCQkJd2hpbGUgKGl0Lmhhc1ByZXYoKSkgewotCQkJCXJlZ2lvbiA9IGl0LnByZXYoKTsKLQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUKQotCQkJCQluZXN0LS07Ci0JCQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORCkKLQkJCQkJbmVzdCsrOwotCQkJCWlmIChuZXN0IDw9IDApCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKG5lc3QgPT0gMCkKLQkJCQlyZXR1cm4gbmV3IENvbXBvdW5kUmVnaW9uKGl0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLCByZWdpb24pOwotCQl9Ci0JCWlmIChyZWdpb25UeXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSkgewotCQkJLy8gc2tpcCB0byBQQVJFTlRIRVNJU19PUEVOCi0JCQl3aGlsZSAoaXQuaGFzUHJldigpKSB7Ci0JCQkJcmVnaW9uID0gaXQucHJldigpOwotCQkJCWlmICgvLyByZWdpb24uZ2V0VHlwZSgpID09Ci0JCQkJLy8gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBUkVOVEhFU0lTX09QRU4gfHwKLQkJCQlyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9GVU5DVElPTikKLQkJCQkJbmVzdC0tOwotCQkJCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFKQotCQkJCQluZXN0Kys7Ci0JCQkJaWYgKG5lc3QgPD0gMCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAobmVzdCA9PSAwKQotCQkJCXJldHVybiBuZXcgQ29tcG91bmRSZWdpb24oaXQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIHJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENvbXBvdW5kUmVnaW9uIHByZXZDb3JyZXNwb25kZW5jZShDb21wb3VuZFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHJlZ2lvbi5nZXREb2N1bWVudFJlZ2lvbigpOwotCQlpbnQgcG9zaXRpb24gPSBmbGF0Tm9kZS5nZXRTdGFydCgpICsgcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBwcmV2Q29ycmVzcG9uZGVuY2UocG9zaXRpb24sIHJlZ2lvbi5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzZXRSYW5nZUZvckNsb3NlKERvY3VtZW50Q29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBwb3NpdGlvbiA9IGNvbW1hbmQub2Zmc2V0OwotCi0JCWlmIChwb3NpdGlvbiA9PSAtMSB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCS8vIGZpbmQgc3RhcnQgb2YgbGluZQotCQkJaW50IHAgPSAocG9zaXRpb24gPT0gc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID8gcG9zaXRpb24gLSAxIDogcG9zaXRpb24pOwotCi0JCQlpbnQgbGluZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocCk7Ci0JCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQpOwotCQkJYm9vbGVhbiBhbGxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0JCQkvLyBjaGVjayB3aGV0aGVyIHRoZSB0ZXh0IGZyb20gbFN0YXJ0IHRvIHBvc2l0aW9uIGlzIHdoaXRlIHNwYWNlCi0JCQkvLyBvciBub3QKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChpdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKSA+IHApIHsKLQkJCQkJYWxsV2hpdGVTcGFjZSA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChhbGxXaGl0ZVNwYWNlKSB7Ci0JCQkJY29tbWFuZC5sZW5ndGggPSBjb21tYW5kLmxlbmd0aCAtIChzdGFydCAtIGNvbW1hbmQub2Zmc2V0KTsKLQkJCQljb21tYW5kLm9mZnNldCA9IHN0YXJ0OwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNwKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y3ApOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRSYW5nZUZvck5ld0xpbmUoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJaW50IHBvc2l0aW9uID0gY29tbWFuZC5vZmZzZXQ7Ci0KLQkJaWYgKHBvc2l0aW9uID09IC0xIHx8IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0cnkgewotCQkJLy8gYWRkIHByZS1uZWFyZXN0IHdoaXRlIHNwYWNlcyB0byByZXBsYWNlIHRhcmdldAotCQkJaWYgKHBvc2l0aW9uID4gMCkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zaXRpb24gLSAxKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbiAtIDEpOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQkJaW50IGVuZCA9IGNvbW1hbmQub2Zmc2V0ICsgY29tbWFuZC5sZW5ndGg7Ci0JCQkJCQlpbnQgbkxpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHBvc2l0aW9uKTsKLQkJCQkJCWludCBuU3RhcnRQb3MgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZU9mZnNldChuTGluZSk7Ci0JCQkJCQlpZiAoblN0YXJ0UG9zIDwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkKLQkJCQkJCQluU3RhcnRQb3MgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pOwotCQkJCQkJY29tbWFuZC5vZmZzZXQgPSBuU3RhcnRQb3M7Ci0JCQkJCQljb21tYW5kLmxlbmd0aCA9IGVuZCAtIGNvbW1hbmQub2Zmc2V0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBhZGQgcG9zdC1uZWFyZXN0IHdoaXRlIHNwYWNlcyB0byByZXBsYWNlIHRhcmdldAotCQkJaWYgKHBvc2l0aW9uIDwgc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3NpdGlvbik7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocG9zaXRpb24pOwotCQkJCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUykgewotCQkJCQkJaW50IG5MaW5lID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZk9mZnNldChwb3NpdGlvbik7Ci0JCQkJCQlTdHJpbmcgY3VycmVudExpbmVEZWxpbSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lRGVsaW1pdGVyKG5MaW5lKTsKLQkJCQkJCWludCBuRW5kUG9zID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVPZmZzZXQobkxpbmUpICsgc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVMZW5ndGgobkxpbmUpIC0gKChjdXJyZW50TGluZURlbGltICE9IG51bGwpID8gY3VycmVudExpbmVEZWxpbS5sZW5ndGgoKSA6IDApOwotCQkJCQkJaWYgKG5FbmRQb3MgPiBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSkKLQkJCQkJCQluRW5kUG9zID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCQljb21tYW5kLmxlbmd0aCA9IG5FbmRQb3MgLSBjb21tYW5kLm9mZnNldDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90IGN1c3RvbWl6ZSBjb21tYW5kCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIGludCBlbmRzV2l0aChTdHJpbmdbXSBzZWFyY2hTdHJpbmdzLCBTdHJpbmcgdGV4dCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0ZXh0LmVuZHNXaXRoKHNlYXJjaFN0cmluZ3NbaV0pKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZmluZEVuZE9mV2hpdGVTcGFjZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBlbmQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChvZmZzZXQgPCBlbmQpIHsKLQkJCWNoYXIgYyA9IGRvY3VtZW50LmdldENoYXIob2Zmc2V0KTsKLQkJCWlmIChjICE9ICcgJyAmJiBjICE9ICdcdCcpIHsKLQkJCQlyZXR1cm4gb2Zmc2V0OwotCQkJfQotCQkJb2Zmc2V0Kys7Ci0JCX0KLQkJcmV0dXJuIGVuZDsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudFN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQljaGFyIGluZGVudENoYXIgPSAnICc7Ci0JCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJaW5kZW50Q2hhciA9ICdcdCc7Ci0JCQl9Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGkrKykgewotCQkJCWluZGVudC5hcHBlbmQoaW5kZW50Q2hhcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm4gdGhlIGFjdGl2ZSB0ZXh0IGVkaXRvciBpZiBwb3NzaWJsZSwgb3RoZXJ3aXNlIHRoZSBhY3RpdmUgZWRpdG9yCi0JICogcGFydC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0QWN0aXZlVGV4dEVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCQkJCXJldHVybiB0ZXh0RWRpdG9yOwotCQkJCQlyZXR1cm4gZWRpdG9yOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoqCi0JICogSW5zZXJ0IHNwYWNlcyBmb3IgdGFicwotCSAqIAotCSAqIEBwYXJhbSBjb21tYW5kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yVGFiKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gdGFiIGtleSB3YXMgcHJlc3NlZC4gbm93IGNoZWNrIHByZWZlcmVuY2VzIHRvIHNlZSBpZiBuZWVkIHRvIGluc2VydAotCQkvLyBzcGFjZXMgaW5zdGVhZCBvZiB0YWIKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCi0JCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaWYgKGluZGVudGF0aW9uV2lkdGggIT0gMCkgewotCQkJCWludCBpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aDsKLQkJCQl0cnkgewotCQkJCQlJUmVnaW9uIGZpcnN0TGluZSA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGNvbW1hbmQub2Zmc2V0KTsKLQkJCQkJaW50IG9mZnNldEluTGluZSA9IGNvbW1hbmQub2Zmc2V0IC0gZmlyc3RMaW5lLmdldE9mZnNldCgpOwotCQkJCQlpbnQgcmVtYWluZGVyID0gb2Zmc2V0SW5MaW5lICUgaW5kZW50YXRpb25XaWR0aDsKLQotCQkJCQlpbmRlbnRTaXplID0gaW5kZW50YXRpb25XaWR0aCAtIHJlbWFpbmRlcjsKLQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykKLQkJCQkJaW5kZW50LmFwcGVuZCgnICcpOwotCQkJfQotCi0JCQkvLyByZXBsYWNlIFx0IGNoYXJhY3RlcnMgd2l0aCBzcGFjZXMKLQkJCWNvbW1hbmQudGV4dCA9IGluZGVudC50b1N0cmluZygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ0FDYW5kaWRhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU0NBQ2FuZGlkYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTU1ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ0FDYW5kaWRhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci0KLWNsYXNzIENTU0NBQ2FuZGlkYXRlIHsKLQotCXByaXZhdGUgU3RyaW5nIGZSZXBsYWNlbWVudFN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkN1cnNvclBvc2l0aW9uID0gMDsKLQlwcml2YXRlIFN0cmluZyBmRGlzcGxheVN0cmluZyA9IG51bGw7Ci0JcHJpdmF0ZSBDU1NJbWFnZVR5cGUgZkltYWdlVHlwZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NDQUNhbmRpZGF0ZSBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUNTU0NBQ2FuZGlkYXRlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlpbnQgZ2V0Q3Vyc29yUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmQ3Vyc29yUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCVN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlyZXR1cm4gZkRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCUNTU0ltYWdlVHlwZSBnZXRJbWFnZVR5cGUoKSB7Ci0JCXJldHVybiBmSW1hZ2VUeXBlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlTdHJpbmcgZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBmUmVwbGFjZW1lbnRTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgc2V0Q3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCWZDdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIHNldERpc3BsYXlTdHJpbmcoU3RyaW5nIGRpc3BsYXlTdHJpbmcpIHsKLQkJZkRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIHNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlKSB7Ci0JCWZJbWFnZVR5cGUgPSBpbWFnZVR5cGU7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgc2V0UmVwbGFjZW1lbnRTdHJpbmcoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nKSB7Ci0JCWZSZXBsYWNlbWVudFN0cmluZyA9IHJlcGxhY2VtZW50U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBTdHJpbmcgdGhhdCByZXByZXNlbnRzIHRoZSB2YWx1ZSBvZiB0aGlzIG9iamVjdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZWNlaXZlcgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSk7Ci0JCWJ1Zi5hcHBlbmQoIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKGdldERpc3BsYXlTdHJpbmcoKSk7Ci0JCWJ1Zi5hcHBlbmQoIlwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCIoIik7Ly8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKGdldEN1cnNvclBvc2l0aW9uKCkpOwotCQlidWYuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdENvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU0NvbnRlbnRBc3Npc3RDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZGI2NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdENvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWNsYXNzIENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IHsKLQotCXByaXZhdGUgaW50IGZSZXBsYWNlQmVnaW4gPSAtMTsKLQlwcml2YXRlIFN0cmluZyBmVGV4dFRvUmVwbGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZlRleHRUb0NvbXBhcmUgPSBudWxsOwotCXByaXZhdGUgaW50IGZUYXJnZXRQb3MgPSAtMTsKLQlwcml2YXRlIElDU1NOb2RlIGZUYXJnZXROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCBmQ3Vyc29yUG9zID0gLTE7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgaW50IGZEb2N1bWVudE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBjaGFyIGZRdW90ZSA9IDA7Ci0JcHJpdmF0ZSBJQ1NTTW9kZWwgZk1vZGVsID0gbnVsbDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENTU0NvbnRlbnRBc3Npc3RDb250ZXh0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlDU1NDb250ZW50QXNzaXN0Q29udGV4dChpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSUNTU05vZGUgbm9kZSwgaW50IGRvY3VtZW50T2Zmc2V0LCBjaGFyIHF1b3RlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDdXJzb3JQb3MgPSBkb2N1bWVudFBvc2l0aW9uOwotCQlmRG9jdW1lbnRPZmZzZXQgPSBkb2N1bWVudE9mZnNldDsKLQkJZlF1b3RlID0gcXVvdGU7Ci0JCWluaXRpYWxpemUobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldEN1cnNvclBvcygpIHsKLQkJcmV0dXJuIGZDdXJzb3JQb3M7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0RG9jdW1lbnRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRPZmZzZXQ7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCUlDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElDU1NOb2RlIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAoSUNTU05vZGUpICgoZk1vZGVsICE9IG51bGwpID8gZk1vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gY2hhcgotCSAqLwotCWNoYXIgZ2V0UXVvdGVPZlN0eWxlQXR0cmlidXRlKCkgewotCQlyZXR1cm4gZlF1b3RlOwotCX0KLQotCUlUZXh0UmVnaW9uIGdldFJlZ2lvbkJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQkvLwlTdHJpbmcgZ2V0UmVnaW9uVGV4dCgpIHsKLQkvLwkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JLy8JCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCkgewotCS8vCQkJcmV0dXJuIHRhcmdldFJlZ2lvbi5nZXRUZXh0KCk7Ci0JLy8JCX0gZWxzZSB7Ci0JLy8JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkvLwkJfQotCS8vCX0KLQkvKioKLQkgKiAgCi0JICovCi0JaW50IGdldFJlcGxhY2VCZWdpbigpIHsKLQkJcmV0dXJuIGZSZXBsYWNlQmVnaW47Ci0JfQotCi0JSUNTU05vZGUgZ2V0VGFyZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZUYXJnZXROb2RlOwotCX0KLQotCXByaXZhdGUgaW50IGdldFRhcmdldFBvcygpIHsKLQkJcmV0dXJuIGZUYXJnZXRQb3M7Ci0JfQotCi0JSVRleHRSZWdpb24gZ2V0VGFyZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9uQnlPZmZzZXQoZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRUYXJnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldERvY3VtZW50UmVnaW9uQnlPZmZzZXQoZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbkJ5T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJcmV0dXJuIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpID8gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpIDogbnVsbDsKLQl9Ci0KLQlJVGV4dFJlZ2lvbiBnZXRUYXJnZXRSZWdpb25QcmV2aW91cygpIHsKLQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBnZXRUYXJnZXRSZWdpb24oKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBudWxsOwotCQlpZiAodGFyZ2V0UmVnaW9uID09IG51bGwpIHsKLQkJCWlmICgwIDwgZkN1cnNvclBvcykgewotCQkJCWl0ZXJhdG9yID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZDdXJzb3JQb3MgLSAxKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWl0ZXJhdG9yID0gZ2V0UmVnaW9uSXRlcmF0b3IoKTsKLQkJCWlmIChpdGVyYXRvci5oYXNQcmV2KCkpIHsKLQkJCQlpdGVyYXRvci5wcmV2KCk7Ci0JCQl9IGVsc2UgewotCQkJCWl0ZXJhdG9yID0gbnVsbDsKLQkJCX0KLQkJfQotCQlpZiAoaXRlcmF0b3IgIT0gbnVsbCkgewotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc1ByZXYoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXJhdG9yLnByZXYoKTsKLQkJCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ09NTUVOVCAmJiB0eXBlICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19DRE8gJiYgdHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDKSB7Ci0JCQkJCXByZXZpb3VzUmVnaW9uID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcHJldmlvdXNSZWdpb247Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JU3RyaW5nIGdldFRleHRUb0NvbXBhcmUoKSB7Ci0JCXJldHVybiBmVGV4dFRvQ29tcGFyZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JU3RyaW5nIGdldFRleHRUb1JlcGxhY2UoKSB7Ci0JCXJldHVybiBmVGV4dFRvUmVwbGFjZTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoSUNTU0RvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJQ1NTTW9kZWwgbW9kZWwgPSBkb2MuZ2V0TW9kZWwoKTsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlpbml0aWFsaXplVGFyZ2V0UG9zKCk7Ci0JCWluaXRpYWxpemVUYXJnZXRUZXh0KCk7Ci0JCWluaXRpYWxpemVUYXJnZXROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVGFyZ2V0Tm9kZSgpIHsKLQkJaWYgKGZDdXJzb3JQb3MgPT0gMCkgewotCQkJZlRhcmdldE5vZGUgPSBmTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGZpbmQgZWRnZSBvZiB0cmVlIG5vZGUKLQkJSUNTU05vZGUgY3Vyc29yTm9kZSA9IGdldE5vZGVBdChmQ3Vyc29yUG9zKTsKLQkJaWYgKGN1cnNvck5vZGUgPT0gbnVsbCkgeyAvLyBlbmQgb2YgZG9jdW1lbnQKLQkJCWN1cnNvck5vZGUgPSBmTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlJQ1NTTm9kZSBub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZkN1cnNvclBvcyAtIDEpOwotCQl3aGlsZSAoZmxhdE5vZGUgIT0gbnVsbCAmJiAobm9kZSA9IGdldE5vZGVBdChmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpKSkgPT0gY3Vyc29yTm9kZSAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCkgIT0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJZmxhdE5vZGUgPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpOwotCQl9Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKSB7IC8vIHRvcCBvZiBkb2N1bWVudAotCQkJZlRhcmdldE5vZGUgPSAobm9kZSA9PSBudWxsKSA/IGZNb2RlbC5nZXREb2N1bWVudCgpIDogbm9kZTsKLQkJCXJldHVybjsKLQkJfQotCQkvLyAgIHY8LS18Ci0JCS8vICAgQUFBQUFBCi0JCS8vIEJCQkJCQkJCQkIgY3Vyc29yTm9kZTpBICwgbm9kZTpCIC0+IHRhcmdldCBpcyBBCi0JCWlmIChjdXJzb3JOb2RlICE9IG51bGwpIHsKLQkJCWZvciAoSUNTU05vZGUgcGFyZW50ID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHBhcmVudCA9PSBjdXJzb3JOb2RlKSB7Ci0JCQkJCWZUYXJnZXROb2RlID0gY3Vyc29yTm9kZTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyAgICAgdjwtLXwKLQkJLy8gICBBQUEKLQkJLy8gQkJCQkJCQkJCQiBjdXJzb3JOb2RlOkIgLCBub2RlOkEgLT4gZGVwZW5kIG9uIEEncyBub2RlIHR5cGUKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgfHwgbm9kZVR5cGUgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUpIHsKLQkJCVN0cmluZyB0eXBlID0gQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJZlRhcmdldE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZlRhcmdldE5vZGUgPSBub2RlOwotCQkJfQotCQkJLy8JCQlmVGFyZ2V0Tm9kZSA9IChiT3ZlclNlbWlDb2xvbikgPyBub2RlLmdldFBhcmVudE5vZGUoKSA6IG5vZGU7Ci0JCX0gZWxzZSBpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKGZsYXROb2RlKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFKSB7Ci0JCQlmVGFyZ2V0Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9IGVsc2UgewotCQkJZlRhcmdldE5vZGUgPSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFBvcygpIHsKLQkJaWYgKGZDdXJzb3JQb3MgPT0gMCB8fCBpc1NwZWNpYWxEZWxpbWl0ZXJSZWdpb24oZkN1cnNvclBvcyAtIDEpKSB7Ci0JCQlmVGFyZ2V0UG9zID0gZkN1cnNvclBvczsKLQkJfSBlbHNlIHsKLQkJCWZUYXJnZXRQb3MgPSBmQ3Vyc29yUG9zIC0gMTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVRhcmdldFRleHQoKSB7Ci0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IGdldFRhcmdldFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZ2V0VGFyZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlmUmVwbGFjZUJlZ2luID0gZkN1cnNvclBvczsKLQkJCWZUZXh0VG9SZXBsYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZUZXh0VG9Db21wYXJlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIHsKLQkJCVN0cmluZyByZWdpb25UZXh0ID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dCh0YXJnZXRSZWdpb24pOwotCQkJaW50IHJlZ2lvblN0YXJ0ID0gZG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGFyZ2V0UmVnaW9uKTsKLQkJCWlmIChyZWdpb25TdGFydCA9PSBmQ3Vyc29yUG9zIHx8IHJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgcmVnaW9uU3RhcnQgKyByZWdpb25UZXh0Lmxlbmd0aCgpIC0gMSA8IGZUYXJnZXRQb3MpIHsKLQkJCQkvLyB0byBpbnNlcnRpb24KLQkJCQlmUmVwbGFjZUJlZ2luID0gZkN1cnNvclBvczsKLQkJCQlmVGV4dFRvUmVwbGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJZlRleHRUb0NvbXBhcmUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvLyB0byByZXBsYWNlCi0JCQkJZlJlcGxhY2VCZWdpbiA9IHJlZ2lvblN0YXJ0OwotCQkJCWZUZXh0VG9SZXBsYWNlID0gcmVnaW9uVGV4dDsKLQkJCQlmVGV4dFRvQ29tcGFyZSA9IHJlZ2lvblRleHQuc3Vic3RyaW5nKDAsIGZDdXJzb3JQb3MgLSBmUmVwbGFjZUJlZ2luKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWFsRGVsaW1pdGVyUmVnaW9uKGludCBwb3MpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9uQnlPZmZzZXQocG9zKTsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlyZXR1cm4gKHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiB8fCB0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIgfHwgdHlwZSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlib29sZWFuIGlzVGFyZ2V0UG9zQWZ0ZXJPZihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlpbnQgc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIGZUYXJnZXROb2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPCAwIHx8ICgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldE5vZGUpLmdldEVuZE9mZnNldCgpIDw9IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCVJlZ2lvbkl0ZXJhdG9yIGlSZWdpb24gPSBuZXcgUmVnaW9uSXRlcmF0b3IoZlN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnQpOwotCQl3aGlsZSAoaVJlZ2lvbi5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGlSZWdpb24ubmV4dCgpOwotCQkJaWYgKGZUYXJnZXRQb3MgPCBpUmVnaW9uLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlib29sZWFuIGlzVGFyZ2V0UG9zQmVmb3JlT2YoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJcmV0dXJuICFpc1RhcmdldFBvc0FmdGVyT2YocmVnaW9uVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHJlZ2lvblR5cGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlib29sZWFuIHRhcmdldEZvbGxvd3MoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaVJlZ2lvbjsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPD0gZlRhcmdldFBvcykgewotCQkJaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCX0gZWxzZSB7Ci0JCQlpUmVnaW9uID0gbmV3IFJlZ2lvbkl0ZXJhdG9yKGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZUYXJnZXRQb3MpOwotCQkJdHJ5IHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDaGFyKGZUYXJnZXRQb3MpKSAmJiBpUmVnaW9uLmhhc1ByZXYoKSkgewotCQkJCQlyZWdpb24gPSBpUmVnaW9uLnByZXYoKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKGlSZWdpb24uaGFzUHJldigpKSB7Ci0JCQlyZWdpb24gPSBpUmVnaW9uLnByZXYoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TIHx8IHR5cGUgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NPTU1FTlQpIHsKLQkJCQljb250aW51ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JYm9vbGVhbiB0YXJnZXRIYXMoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBmVGFyZ2V0Tm9kZSkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGVuZCA9ICgoSW5kZXhlZFJlZ2lvbikgZlRhcmdldE5vZGUpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPCAwIHx8IGVuZCA8PSAwKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJUmVnaW9uSXRlcmF0b3IgaVJlZ2lvbiA9IG5ldyBSZWdpb25JdGVyYXRvcihmU3RydWN0dXJlZERvY3VtZW50LCBzdGFydCk7Ci0JCXdoaWxlIChpUmVnaW9uLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaVJlZ2lvbi5uZXh0KCk7Ci0JCQlpZiAoZW5kIDw9IGlSZWdpb24uZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gcmVnaW9uVHlwZSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlSZWdpb25JdGVyYXRvciBnZXRSZWdpb25JdGVyYXRvcigpIHsKLQkJcmV0dXJuIG5ldyBSZWdpb25JdGVyYXRvcihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgZ2V0VGFyZ2V0UG9zKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlDU1NNZXRhTW9kZWwgZ2V0TWV0YU1vZGVsKCkgewotCQlDU1NNZXRhTW9kZWxGaW5kZXIgZmluZGVyID0gQ1NTTWV0YU1vZGVsRmluZGVyLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiBmaW5kZXIuZmluZE1ldGFNb2RlbEZvcihnZXRNb2RlbCgpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTNhN2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklDU1NNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByaXZhdGUgaW50IGZEb2N1bWVudE9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBjaGFyIGZRdW90ZSA9IDA7Ci0JcHJpdmF0ZSBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZlRlbXBsYXRlUHJvY2Vzc29yID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYSBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb2RlLWFzc2lzdCBpdGVtcwotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUgPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiArIGZEb2N1bWVudE9mZnNldCk7Ci0JCUlET01Ob2RlIHhOb2RlID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50ID0gbnVsbDsKLQkJQ1NTUHJvcG9zYWxBcnJhbmdlciBhcnJhbmdlciA9IG51bGw7Ci0JCWJvb2xlYW4gaXNFbXB0eURvY3VtZW50ID0gZmFsc2U7Ci0KLQkJLy8gYmFpbCBpZiB3ZSBjb3VsZG4ndCBnZXQgYW4gaW5kZXhlZCBub2RlCi0JCS8vIGlmKGluZGV4ZWROb2RlID09IG51bGwpIHJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCXhOb2RlID0gKElET01Ob2RlKSBpbmRleGVkTm9kZTsKLQkJCXBhcmVudCA9IChJRE9NTm9kZSkgeE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCS8vIG5lZWQgdG8gZ2V0IGluIGhlcmUgaWYgdGhlcmUgaW4gdGhlIG5vIDAgcmVnaW9uIDxzdHlsZT58PC9zdHlsZT4KLQkJLy8gY2FzZQotCQlpZiAoKHhOb2RlICE9IG51bGwpICYmIHhOb2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkvLyBub3cgd2Uga25vdyB0aGUgY3Vyc29yIGlzIGluIGEgPHN0eWxlPiB0YWcgdy9vdXQgcmVnaW9uCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwoeE5vZGUpOwotCQkJaWYgKGNzc01vZGVsICE9IG51bGwpIHsKLQkJCQkvLyBhZGp1c3Qgb2Zmc2V0cyBmb3IgZW1iZWRkZWQgc3R5bGUKLQkJCQlpbnQgb2Zmc2V0ID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJCQlpbnQgcG9zID0gMDsKLQkJCQlJbmRleGVkUmVnaW9uIGtleUluZGV4ZWROb2RlID0gY3NzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihwb3MpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJYXJyYW5nZXIgPSBuZXcgQ1NTUHJvcG9zYWxBcnJhbmdlcihwb3MsIChJQ1NTTm9kZSkga2V5SW5kZXhlZE5vZGUsIG9mZnNldCwgKGNoYXIpIDApOwotCQkJfQotCQl9IGVsc2UgaWYgKChwYXJlbnQgIT0gbnVsbCkgJiYgcGFyZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpKSB7Ci0JCQkvLyBub3cgd2Uga25vdyB0aGUgY3Vyc29yIGlzIGluIGEgPHN0eWxlPiB0YWcgd2l0aCBhIHJlZ2lvbgotCQkJLy8gdXNlIHRoZSBwYXJlbnQgYmVjYXVzZSB0aGF0IHdpbGwgYmUgdGhlIDxzdHlsZT4gdGFnCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwocGFyZW50KTsKLQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRqdXN0IG9mZnNldHMgZm9yIGVtYmVkZGVkIHN0eWxlCi0JCQkJaW50IG9mZnNldCA9IGluZGV4ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IHBvcyA9IGRvY3VtZW50UG9zaXRpb24gLSBvZmZzZXQ7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBrZXlJbmRleGVkTm9kZSA9IGNzc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocG9zKTsKLQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQlrZXlJbmRleGVkTm9kZSA9IChJbmRleGVkUmVnaW9uKSAoKElDU1NNb2RlbCkgY3NzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIocG9zLCAoSUNTU05vZGUpIGtleUluZGV4ZWROb2RlLCBvZmZzZXQsIChjaGFyKSAwKTsKLQkJCX0KLQkJfSBlbHNlIGlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkvLyBnZXQgbW9kZWwgZm9yIG5vZGUgdy8gc3R5bGUgYXR0cmlidXRlCi0JCQlJU3RydWN0dXJlZE1vZGVsIGNzc01vZGVsID0gZ2V0Q1NTTW9kZWwoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkgewotCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24gLSBmRG9jdW1lbnRPZmZzZXQpOwotCQkJCWlmIChrZXlJbmRleGVkTm9kZSA9PSBudWxsKSB7Ci0JCQkJCWtleUluZGV4ZWROb2RlID0gKEluZGV4ZWRSZWdpb24pICgoSUNTU01vZGVsKSBjc3NNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJaWYgKGtleUluZGV4ZWROb2RlIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCQkJLy8gaW5saW5lIHN0eWxlIGZvciBhIHRhZywgbm90IGVtYmVkZGVkCi0JCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgZkRvY3VtZW50T2Zmc2V0LCBmUXVvdGUpOwotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIGlmIChpbmRleGVkTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkvLyB3aGVuIGVkaXRpbmcgZXh0ZXJuYWwgQ1NTIHVzaW5nIENTUyBEZXNpZ25lciwgSUNTU05vZGUgaXMKLQkJCS8vIHBhc3NlZC4KLQkJCUlDU1NEb2N1bWVudCBjc3Nkb2MgPSAoKElDU1NOb2RlKSBpbmRleGVkTm9kZSkuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGNzc2RvYyAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBjc3NNb2RlbCA9IGNzc2RvYy5nZXRNb2RlbCgpOwotCQkJCWlmIChjc3NNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24gLSBmRG9jdW1lbnRPZmZzZXQpOwotCQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJa2V5SW5kZXhlZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChJQ1NTTW9kZWwpIGNzc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCQkvLyBpbmxpbmUgc3R5bGUgZm9yIGEgdGFnLCBub3QgZW1iZWRkZWQKLQkJCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgZkRvY3VtZW50T2Zmc2V0LCBmUXVvdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKChpbmRleGVkTm9kZSA9PSBudWxsKSAmJiBpc1ZpZXdlckVtcHR5KHZpZXdlcikpIHsKLQkJCWlzRW1wdHlEb2N1bWVudCA9IHRydWU7Ci0JCQkvLyB0aGUgdG9wIG9mIGVtcHR5IENTUyBEb2N1bWVudAotCQkJSVN0cnVjdHVyZWRNb2RlbCBjc3NNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWNzc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJaWYgKGNzc01vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24ga2V5SW5kZXhlZE5vZGUgPSBjc3NNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24gLSBmRG9jdW1lbnRPZmZzZXQpOwotCQkJCQlpZiAoa2V5SW5kZXhlZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJa2V5SW5kZXhlZE5vZGUgPSAoSW5kZXhlZFJlZ2lvbikgKChJQ1NTTW9kZWwpIGNzc01vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQl9Ci0JCQkJCWlmIChrZXlJbmRleGVkTm9kZSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCQkvLyBpbmxpbmUgc3R5bGUgZm9yIGEgdGFnLCBub3QgZW1iZWRkZWQKLQkJCQkJCWFycmFuZ2VyID0gbmV3IENTU1Byb3Bvc2FsQXJyYW5nZXIoZG9jdW1lbnRQb3NpdGlvbiwgKElDU1NOb2RlKSBrZXlJbmRleGVkTm9kZSwgZkRvY3VtZW50T2Zmc2V0LCBmUXVvdGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoY3NzTW9kZWwgIT0gbnVsbCkKLQkJCQkJY3NzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCWlmIChhcnJhbmdlciAhPSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRPZmZzZXQgPSAwOwotCQkJcHJvcG9zYWxzID0gYXJyYW5nZXIuZ2V0UHJvcG9zYWxzKCk7Ci0KLQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBuZXdmaWxlcHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gYW55cHJvcG9zYWxzID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCQkvLyBhZGQgdGVtcGxhdGUgcHJvcG9zYWxzCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWlmIChpc0VtcHR5RG9jdW1lbnQpIHsKLQkJCQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5ORVcpOwotCQkJCQluZXdmaWxlcHJvcG9zYWxzID0gZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5BTEwpOwotCQkJCWFueXByb3Bvc2FscyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBlbmQgdGFnIGlmIHBhcmVudCBpcyBub3QgY2xvc2VkCi0JCQlJQ29tcGxldGlvblByb3Bvc2FsIGVuZFRhZyA9IFhNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuY29tcHV0ZVhNTEVuZFRhZ1Byb3Bvc2FsKHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbiwgaW5kZXhlZE5vZGUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSwgU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9UQUdfR0VORVJJQyk7IAotCi0JCQkvLyBhZGQgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWxzCi0JCQlpbnQgYWRkaXRpb25hbExlbmd0aCA9IG5ld2ZpbGVwcm9wb3NhbHMubGVuZ3RoICsgYW55cHJvcG9zYWxzLmxlbmd0aDsKLQkJCWFkZGl0aW9uYWxMZW5ndGggPSAoZW5kVGFnICE9IG51bGwpID8gKythZGRpdGlvbmFsTGVuZ3RoIDogYWRkaXRpb25hbExlbmd0aDsKLQkJCWlmIChhZGRpdGlvbmFsTGVuZ3RoID4gMCkgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwbHVzT25lcyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5sZW5ndGggKyBhZGRpdGlvbmFsTGVuZ3RoXTsKLQkJCQlpbnQgYXBwZW5kUG9zID0gcHJvcG9zYWxzLmxlbmd0aDsKLQkJCQkvLyBhZGQgZW5kIHRhZyBwcm9wb3NhbAotCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb3Bvc2FscywgMCwgcGx1c09uZXMsIDEsIHByb3Bvc2Fscy5sZW5ndGgpOwotCQkJCQlwbHVzT25lc1swXSA9IGVuZFRhZzsKLQkJCQkJKythcHBlbmRQb3M7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShwcm9wb3NhbHMsIDAsIHBsdXNPbmVzLCAwLCBwcm9wb3NhbHMubGVuZ3RoKTsKLQkJCQl9Ci0JCQkJLy8gYWRkIGl0ZW1zIGluIG5ld2ZpbGVwcm9wb3NhbHMKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld2ZpbGVwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJcGx1c09uZXNbYXBwZW5kUG9zICsgaV0gPSBuZXdmaWxlcHJvcG9zYWxzW2ldOwotCQkJCX0KLQkJCQkvLyBhZGQgaXRlbXMgaW4gYW55cHJvcG9zYWxzCi0JCQkJYXBwZW5kUG9zID0gYXBwZW5kUG9zICsgbmV3ZmlsZXByb3Bvc2Fscy5sZW5ndGg7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbnlwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJcGx1c09uZXNbYXBwZW5kUG9zICsgaV0gPSBhbnlwcm9wb3NhbHNbaV07Ci0JCQkJfQotCQkJCXByb3Bvc2FscyA9IHBsdXNPbmVzOwotCQkJfQotCQl9Ci0JCXJldHVybiBwcm9wb3NhbHM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG5vIHRleHQgb3IgaXQncyBhbGwgd2hpdGUgc3BhY2UsIG90aGVyd2lzZQotCSAqIHJldHVybnMgZmFsc2UKLQkgKiAKLQkgKiBAcGFyYW0gdHJlZU5vZGUKLQkgKiBAcGFyYW0gdGV4dFZpZXdlcgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZpZXdlckVtcHR5KElUZXh0Vmlld2VyIHRleHRWaWV3ZXIpIHsKLQkJYm9vbGVhbiBpc0VtcHR5ID0gZmFsc2U7Ci0JCVN0cmluZyB0ZXh0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCQlpZiAoKHRleHQgPT0gbnVsbCkgfHwgKCh0ZXh0ICE9IG51bGwpICYmIHRleHQudHJpbSgpLmVxdWFscygiIikpKSAvLyROT04tTkxTLTEkCi0JCQlpc0VtcHR5ID0gdHJ1ZTsKLQkJcmV0dXJuIGlzRW1wdHk7Ci0JfQotCi0JLyoqCi0JICogR2V0IENTU01vZGVsIGZvciBhbiBpbmRleGVkIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhlZE5vZGUKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQkvLyBwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q1NTTW9kZWwoSW5kZXhlZFJlZ2lvbiBpbmRleGVkTm9kZSkgewotCS8vIGlmIChpbmRleGVkTm9kZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyBOb2RlIG5vZGUgPSAoTm9kZSlpbmRleGVkTm9kZTsKLQkvLyBJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JLy8gaWYgKG5vdGlmaWVyID09IG51bGwpIHJldHVybiBudWxsOwotCS8vIElOb2RlQWRhcHRlciBhZGFwdGVyID0KLQkvLyBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuYWRhcHQobm90aWZpZXIpOwotCS8vIGlmIChhZGFwdGVyID09IG51bGwgfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgQ1NTTW9kZWxBZGFwdGVyKSkgcmV0dXJuCi0JLy8gbnVsbDsKLQkvLyBDU1NNb2RlbEFkYXB0ZXIgbW9kZWxBZGFwdGVyID0gKENTU01vZGVsQWRhcHRlcilhZGFwdGVyOwotCS8vIHJldHVybiBtb2RlbEFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQkvLyB9Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgQ1NTbW9kZWwgZm9yIGEgZ2l2ZW4gWE1MIG5vZGUuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0Q1NTTW9kZWwoSURPTU5vZGUgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gU3R5bGVBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmFkYXB0KGVsZW1lbnQpOwotCQlpZiAoKGFkYXB0ZXIgPT0gbnVsbCkgfHwgIShhZGFwdGVyIGluc3RhbmNlb2YgSUNTU01vZGVsQWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU01vZGVsQWRhcHRlciBtb2RlbEFkYXB0ZXIgPSAoSUNTU01vZGVsQWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIG1vZGVsQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgcG9zc2libGUgY29udGV4dHMgYmFzZWQgb24gdGhlIHNwZWNpZmllZAotCSAqIGxvY2F0aW9uIHdpdGhpbiB0aGUgZG9jdW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY3VycmVudCBjdXJzb3IKLQkgKiBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwb3NzaWJsZQotCSAqICAgICAgICAgICAgY29udGV4dHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZG9jdW1lbnQgZm9yIHdoaWNoIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIHNob3VsZCBiZSBjb21wdXRlZAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY29udGV4dCBpbmZvcm1hdGlvbiBvYmplY3RzIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiBubyBjb250ZXh0IGNvdWxkIGJlIGZvdW5kCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIHBvc3NpYmxlIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXJzIHdoaWNoIHdoZW4gZW50ZXJlZCBieSB0aGUgdXNlciBzaG91bGQKLQkgKiBhdXRvbWF0aWNhbGx5IHRyaWdnZXIgdGhlIHByZXNlbnRhdGlvbiBvZiBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGF1dG8gYWN0aXZhdGlvbiBpcwotCSAqICAgICAgICAgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsaWRhdG9yIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZW4gZGlzcGxheWVkIGNvbnRleHQKLQkgKiBpbmZvcm1hdGlvbiBzaG91bGQgYmUgZGlzbWlzc2VkLiBNYXkgb25seSByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4gaWYKLQkgKiB0aGUgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqICAgICAgICAgcHJvY2Vzc29yIGlzIGluY2FwYWJsZSBvZiBjb21wdXRpbmcgY29udGV4dCBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gYW4gZXJyb3IgbWVzc2FnZSBvciBudWxsIGlmIG5vIGVycm9yIG9jY3VycmVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDIwMDEvMDUvMjIKLQkgKiAxMDozNzowNSkKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCWZEb2N1bWVudE9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcXVvdGUKLQkgKiAgICAgICAgICAgIGNoYXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRRdW90ZUNoYXJPZlN0eWxlQXR0cmlidXRlKGNoYXIgcXVvdGUpIHsKLQkJZlF1b3RlID0gcXVvdGU7Ci0JfQotCi0JcHJpdmF0ZSBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKTsKLQkJfQotCQlyZXR1cm4gZlRlbXBsYXRlUHJvY2Vzc29yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEFycmFuZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEFycmFuZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyOWZhNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxBcnJhbmdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUGFnZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVTaGVldDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi1jbGFzcyBDU1NQcm9wb3NhbEFycmFuZ2VyIHsKLQotCXByaXZhdGUgTGlzdCBmUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgQ1NTQ29udGVudEFzc2lzdENvbnRleHQgZkNvbnRleHQgPSBudWxsOwotCi0JLyoqCi0JICogQ1NTUHJvcG9zYWxBcnJhbmdlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTUHJvcG9zYWxBcnJhbmdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEFycmFuZ2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JQ1NTUHJvcG9zYWxBcnJhbmdlcihpbnQgZG9jdW1lbnRQb3NpdGlvbiwgSUNTU05vZGUgbm9kZSwgaW50IGRvY3VtZW50T2Zmc2V0LCBjaGFyIHF1b3RlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZDb250ZXh0ID0gbmV3IENTU0NvbnRlbnRBc3Npc3RDb250ZXh0KGRvY3VtZW50UG9zaXRpb24sIG5vZGUsIGRvY3VtZW50T2Zmc2V0LCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXZvaWQgYnVpbGRQcm9wb3NhbHMoKSB7Ci0JCWZQcm9wb3NhbHMuY2xlYXIoKTsKLQotCQkvKgotCQkgKiBTdHJpbmcgdGV4dDsgSUNvbXBsZXRpb25Qcm9wb3NhbCBpdGVtOyB0ZXh0ID0gIi0tLS0gVGVzdAotCQkgKiBJbmZvcm1hdGlvbiAtLS0tIjsgaXRlbSA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsCi0JCSAqIGZDb250ZXh0LmdldFJlcGxhY2VCZWdpbigpLCAwLCAwLCBudWxsLCB0ZXh0LCBudWxsLCBudWxsKTsKLQkJICogZlByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCSAqIAotCQkgKiB0ZXh0ID0gIlRhcmdldDogXCIiICsgZkNvbnRleHQuZ2V0UmVnaW9uVGV4dCgpICsgIlwiIjsKLQkJICogCi0JCSAqIGl0ZW0gPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCBmQ29udGV4dC5nZXRSZXBsYWNlQmVnaW4oKSwgMCwgMCwKLQkJICogbnVsbCwgdGV4dCwgbnVsbCwgbnVsbCk7IGZQcm9wb3NhbHMuYWRkKGl0ZW0pOwotCQkgKiAKLQkJICogdGV4dCA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKS5nZXRDbGFzcygpLnRvU3RyaW5nKCk7IGludAotCQkgKiBsYXN0UGVyaW9kUG9zID0gdGV4dC5sYXN0SW5kZXhPZignLicpOyB0ZXh0ID0gIk5vZGU6ICIgKwotCQkgKiB0ZXh0LnN1YnN0cmluZyhsYXN0UGVyaW9kUG9zICsgMSk7IGl0ZW0gPSBuZXcKLQkJICogQ29tcGxldGlvblByb3Bvc2FsKCIiLCBmQ29udGV4dC5nZXRSZXBsYWNlQmVnaW4oKSwgMCwgMCwgbnVsbCwKLQkJICogdGV4dCwgbnVsbCwgbnVsbCk7IGZQcm9wb3NhbHMuYWRkKGl0ZW0pOwotCQkgKi8KLQotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQkvL2ludCB0YXJnZXRQb3MgPSBmQ29udGV4dC5nZXRUYXJnZXRQb3MoKTsKLQkJaWYgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJYnVpbGRQcm9wb3NhbHNGb3JBbnlSdWxlKCk7Ci0JCX0gZWxzZSBpZiAoKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTTWVkaWFSdWxlICYmIGZDb250ZXh0LmlzVGFyZ2V0UG9zQWZ0ZXJPZihDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkgfHwgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlICYmIGZDb250ZXh0LmlzVGFyZ2V0UG9zQmVmb3JlT2YoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpKSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckFueVJ1bGUoKTsKLQkJCS8vCQlidWlsZFByb3Bvc2Fsc0ZvclN0eWxlUnVsZSgpOwotCQl9IGVsc2UgaWYgKCh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1BhZ2VSdWxlICYmIGZDb250ZXh0LmlzVGFyZ2V0UG9zQmVmb3JlT2YoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSkpKSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvclBhZ2VSdWxlUHNldWRvQ2xhc3MoKTsKLQkJfSBlbHNlIGlmICgodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZSB8fCB0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1BhZ2VSdWxlIHx8IHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbikgJiYgKHRhcmdldE5vZGUuZ2V0T3duZXJEb2N1bWVudCgpIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24gfHwgZkNvbnRleHQudGFyZ2V0Rm9sbG93cyhDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB8fCBmQ29udGV4dC50YXJnZXRGb2xsb3dzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSkgewotCQkJYnVpbGRQcm9wb3NhbHNGb3JEZWNsYXJhdGlvbk5hbWUoKTsKLQkJfSBlbHNlIGlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCWlmIChmQ29udGV4dC5pc1RhcmdldFBvc0FmdGVyT2YoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikpIHsKLQkJCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uVmFsdWUoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnVpbGRQcm9wb3NhbHNGb3JEZWNsYXJhdGlvbk5hbWUoKTsKLQkJCX0KLQkJfSBlbHNlIGlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlKSB7Ci0JCQlidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uVmFsdWUoKTsKLQkJfQotCQkvKgotCQkgKiBlbHNlIGlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1ByaW1pdGl2ZVZhbHVlIHx8ICgodGFyZ2V0Tm9kZQotCQkgKiBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUgfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZSB8fAotCQkgKiB0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbGFyYXRpb24gfHwgdGFyZ2V0Tm9kZSBpbnN0YW5jZW9mCi0JCSAqIElDU1NTdHlsZURlY2xJdGVtKSAmJgotCQkgKiBmQ29udGV4dC5pc1RhcmdldFBvc0FmdGVyT2YoQ1NTUmVnaW9uQ29udGV4dHMuQ09MT04pKSkgewotCQkgKiBidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uVmFsdWUoKTsgfQotCQkgKi8KLQotCQkvLyBmb3IgVGVzdAotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yQW55UnVsZSgpIHsKLQkJQ1NTUHJvcG9zYWxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyhmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBidWlsZFByb3Bvc2Fsc0ZvckRlY2xhcmF0aW9uTmFtZSgpIHsKLQkJQ1NTUHJvcG9zYWxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yRGVjbGFyYXRpb25WYWx1ZSgpIHsKLQkJQ1NTUHJvcG9zYWxHZW5lcmF0b3IgZ2VuZXJhdG9yOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvblZhbHVlKGZDb250ZXh0KTsKLQkJZlByb3Bvc2Fscy5hZGRBbGwoZ2VuZXJhdG9yLmdldFByb3Bvc2FscygpKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0Jdm9pZCBidWlsZFByb3Bvc2Fsc0ZvclBhZ2VSdWxlUHNldWRvQ2xhc3MoKSB7Ci0JCUNTU1Byb3Bvc2FsR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQkJZ2VuZXJhdG9yID0gbmV3IENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQl2b2lkIGJ1aWxkUHJvcG9zYWxzRm9yU3R5bGVSdWxlKCkgewotCQlDU1NQcm9wb3NhbEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0JCWdlbmVyYXRvciA9IG5ldyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckhUTUxUYWcoZkNvbnRleHQpOwotCQlmUHJvcG9zYWxzLmFkZEFsbChnZW5lcmF0b3IuZ2V0UHJvcG9zYWxzKCkpOwotCQlnZW5lcmF0b3IgPSBuZXcgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvcihmQ29udGV4dCk7Ci0JCWZQcm9wb3NhbHMuYWRkQWxsKGdlbmVyYXRvci5nZXRQcm9wb3NhbHMoKSk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wb3NhbHMoKSB7Ci0JCWJ1aWxkUHJvcG9zYWxzKCk7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbEFycmF5ID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbFtmUHJvcG9zYWxzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGlJdGVtID0gZlByb3Bvc2Fscy5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaUl0ZW0uaGFzTmV4dCgpOyBpKyspIHsKLQkJCXByb3Bvc2FsQXJyYXlbaV0gPSAoSUNvbXBsZXRpb25Qcm9wb3NhbCkgaUl0ZW0ubmV4dCgpOwotCQl9Ci0JCXJldHVybiBwcm9wb3NhbEFycmF5OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA0YjU2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi1hYnN0cmFjdCBjbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBTdHJpbmdBbmRPZmZzZXQgewotCQlTdHJpbmdBbmRPZmZzZXQoU3RyaW5nIHN0cmluZywgaW50IG9mZnNldCkgewotCQkJdGhpcy5mU3RyaW5nID0gc3RyaW5nOwotCQkJdGhpcy5mT2Zmc2V0ID0gb2Zmc2V0OwotCQl9Ci0KLQkJU3RyaW5nIGZTdHJpbmc7Ci0JCWludCBmT2Zmc2V0OwotCX0KLQotCXByb3RlY3RlZCBDU1NDb250ZW50QXNzaXN0Q29udGV4dCBmQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEdlbmVyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgQ1NTUHJvcG9zYWxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JQ1NTUHJvcG9zYWxHZW5lcmF0b3IoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcigpOwotCQlmQ29udGV4dCA9IGNvbnRleHQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNoZWNrTGVhZGluZ0NvbG9uKCkgewotCQlib29sZWFuIGhhc0xlYWRpbmdDb2xvbiA9IGZhbHNlOwotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsICYmIDAgPCBmQ29udGV4dC5nZXRDdXJzb3JQb3MoKSkgewotCQkJdGFyZ2V0UmVnaW9uID0gZkNvbnRleHQuZ2V0UmVnaW9uQnlPZmZzZXQoZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCkgLSAxKTsKLQkJCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCAmJiB0YXJnZXRSZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHsKLQkJCQloYXNMZWFkaW5nQ29sb24gPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlSZWdpb25JdGVyYXRvciBpdGVyYXRvciA9IGZDb250ZXh0LmdldFJlZ2lvbkl0ZXJhdG9yKCk7Ci0JCQlpZiAoaXRlcmF0b3IuaGFzUHJldigpKSB7Ci0JCQkJaXRlcmF0b3IucHJldigpOwotCQkJCWlmIChpdGVyYXRvci5oYXNQcmV2KCkgJiYgaXRlcmF0b3IucHJldigpLmdldFR5cGUoKSA9PSBDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPKSB7Ci0JCQkJCWhhc0xlYWRpbmdDb2xvbiA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoYXNMZWFkaW5nQ29sb247Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVCcmFjZXMoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZkNvbnRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGluZURlbGltaXRlcigpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBpbmRlbnRTdHIgPSBnZXRJbmRlbnRTdHJpbmcoKTsKLQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19ORVdMSU5FX09OX09QRU5fQlJBQ0UpKSB7Ci0JCQlidWYuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoInsiKTsvLyROT04tTkxTLTEkCi0JCWlmIChwcmVmZXJlbmNlcy5nZXRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FKSkgewotCQkJYnVmLmFwcGVuZChsaW5lRGVsaW1pdGVyKTsKLQkJCWJ1Zi5hcHBlbmQoaW5kZW50U3RyKTsKLQkJfSBlbHNlIHsKLQkJCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IG9mZnNldCA9IGJ1Zi5sZW5ndGgoKTsKLQkJaWYgKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpKSB7Ci0JCQlidWYuYXBwZW5kKGxpbmVEZWxpbWl0ZXIpOwotCQl9IGVsc2UgewotCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlidWYuYXBwZW5kKCJ9Iik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZVBhcmVudGhlc2lzKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgb2Zmc2V0OwotCQlidWYuYXBwZW5kKCIoIik7Ly8kTk9OLU5MUy0xJAotCQlvZmZzZXQgPSAxOwotCQlidWYuYXBwZW5kKCIpIik7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFN0cmluZ0FuZE9mZnNldChidWYudG9TdHJpbmcoKSwgb2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZVF1b3RlcygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciBxdW90ZUNoYXIgPSBnZXRRdW90ZUNoYXIoKTsKLQkJYnVmLmFwcGVuZChxdW90ZUNoYXIpOwotCQlidWYuYXBwZW5kKHF1b3RlQ2hhcik7Ci0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCAxKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZ0FuZE9mZnNldCBnZW5lcmF0ZVNlbWljb2xvbigpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IG9mZnNldDsKLQkJYnVmLmFwcGVuZCgiOyIpOy8vJE5PTi1OTFMtMSQKLQkJb2Zmc2V0ID0gMDsKLQkJcmV0dXJuIG5ldyBTdHJpbmdBbmRPZmZzZXQoYnVmLnRvU3RyaW5nKCksIG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdBbmRPZmZzZXQgZ2VuZXJhdGVVUkkoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQotCQlib29sZWFuIGlzUXVvdGVJblVSSSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9RVU9URV9JTl9VUkkpOwotCQljaGFyIHF1b3RlQ2hhciA9IGdldFF1b3RlQ2hhcigpOwotCQlidWYuYXBwZW5kKCJ1cmwoIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoaXNRdW90ZUluVVJJKSB7Ci0JCQlidWYuYXBwZW5kKHF1b3RlQ2hhcik7Ci0JCX0KLQkJaW50IG9mZnNldCA9IGJ1Zi5sZW5ndGgoKTsKLQkJaWYgKGlzUXVvdGVJblVSSSkgewotCQkJYnVmLmFwcGVuZChxdW90ZUNoYXIpOwotCQl9Ci0JCWJ1Zi5hcHBlbmQoIikiKTsvLyROT04tTkxTLTEkCi0JCXJldHVybiBuZXcgU3RyaW5nQW5kT2Zmc2V0KGJ1Zi50b1N0cmluZygpLCBvZmZzZXQpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCk7Ci0KLQlMaXN0IGdldFByb3Bvc2FscygpIHsKLQkJTGlzdCBwcm9wb3NhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQ1NTSW1hZ2VIZWxwZXIgaW1hZ2VIZWxwZXIgPSBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gZ2V0Q2FuZGlkYXRlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGNhbmRpZGF0ZSA9IChDU1NDQUNhbmRpZGF0ZSkgaS5uZXh0KCk7Ci0JCQlJbWFnZSBpbWFnZSA9IGltYWdlSGVscGVyLmdldEltYWdlKGNhbmRpZGF0ZS5nZXRJbWFnZVR5cGUoKSk7Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsIGl0ZW0gPSBuZXcgQ29tcGxldGlvblByb3Bvc2FsKGNhbmRpZGF0ZS5nZXRSZXBsYWNlbWVudFN0cmluZygpLCBmQ29udGV4dC5nZXRSZXBsYWNlQmVnaW4oKSArIGZDb250ZXh0LmdldERvY3VtZW50T2Zmc2V0KCksIGZDb250ZXh0LmdldFRleHRUb1JlcGxhY2UoKS5sZW5ndGgoKSwgY2FuZGlkYXRlLmdldEN1cnNvclBvc2l0aW9uKCksIGltYWdlLCBjYW5kaWRhdGUuZ2V0RGlzcGxheVN0cmluZygpLCBudWxsLCBudWxsKTsKLQkJCXByb3Bvc2Fscy5hZGQoaXRlbSk7Ci0JCX0KLQotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gY2hhcgotCSAqLwotCXByaXZhdGUgY2hhciBnZXRRdW90ZUNoYXIoKSB7Ci0KLQkJU3RyaW5nIHF1b3RlU3RyID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUVVPVEUpOwotCQljaGFyIHF1b3RlQ2hhciA9IChxdW90ZVN0ciAhPSBudWxsICYmIDAgPCBxdW90ZVN0ci5sZW5ndGgoKSkgPyBxdW90ZVN0ci5jaGFyQXQoMCkgOiAnIic7Ci0JCWNoYXIgYXR0clF1b3RlID0gZkNvbnRleHQuZ2V0UXVvdGVPZlN0eWxlQXR0cmlidXRlKCk7Ci0JCWlmIChhdHRyUXVvdGUgIT0gMCkgewotCQkJaWYgKGF0dHJRdW90ZSA9PSAnIicgJiYgcXVvdGVDaGFyID09ICciJykgewotCQkJCXF1b3RlQ2hhciA9ICdcJyc7Ci0JCQl9IGVsc2UgaWYgKGF0dHJRdW90ZSA9PSAnXCcnICYmIHF1b3RlQ2hhciA9PSAnXCcnKSB7Ci0JCQkJcXVvdGVDaGFyID0gJyInOwotCQkJfQotCQl9Ci0JCXJldHVybiBxdW90ZUNoYXI7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2goU3RyaW5nIHRleHQpIHsKLQkJU3RyaW5nIHRleHRUb0NvbXBhcmUgPSBmQ29udGV4dC5nZXRUZXh0VG9Db21wYXJlKCk7Ci0JCWlmICh0ZXh0VG9Db21wYXJlLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgewotCQkJcmV0dXJuICh0ZXh0LnRvVXBwZXJDYXNlKCkuaW5kZXhPZih0ZXh0VG9Db21wYXJlLnRvVXBwZXJDYXNlKCkpID09IDApOwotCQl9Ci0JCS8qCi0JCSAqIFN0cmluZyB0ZXh0VG9SZXBsYWNlID0gZkNvbnRleHQuZ2V0VGV4dFRvUmVwbGFjZSgpOyBpZgotCQkgKiAodGV4dFRvUmVwbGFjZS5sZW5ndGgoKSA9PSAwKSB7IHJldHVybiB0cnVlOyB9IGVsc2UgeyByZXR1cm4KLQkJICogKHRleHQudG9VcHBlckNhc2UoKS5pbmRleE9mKHRleHRUb1JlcGxhY2UudG9VcHBlckNhc2UoKSkgPT0gMCk7IH0KLQkJICovCi0JfQotCQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0SW5kZW50U3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCVN0cmluZyBpbmRlbnRDaGFyUHJlZiA9IHByZWZlcmVuY2VzLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQkJaWYgKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhpbmRlbnRDaGFyUHJlZikpIHsKLQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCX0KLQkJCWludCBpbmRlbnRhdGlvbldpZHRoID0gcHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZW50LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yQXRtYXJrUnVsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NmM4OTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JBdG1hcmtSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01ldGFNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5TZWxlY3Rpb25Db2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yQXRtYXJrUnVsZSBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCXByaXZhdGUgYm9vbGVhbiBmVXNlVXBwZXJDYXNlID0gZmFsc2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVQgPSAiQGNoYXJzZXQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9OVF9GQUNFID0gIkBmb250LWZhY2UiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUID0gIkBpbXBvcnQiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUEgPSAiQG1lZGlhIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBR0UgPSAiQHBhZ2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENTU0F0bWFya1J1bGVQcm9wb3NhbEdlbmVyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yQXRtYXJrUnVsZShDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKGNvbnRleHQpOwotCQlmVXNlVXBwZXJDYXNlID0gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVI7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgQ1NTQ0FDYW5kaWRhdGUgZ2V0Q2FuZGlkYXRlQ2hhcnNldFJ1bGUoKSB7Ci0JCS8vIGNoZWNrIGNvbnRlbnQgbW9kZWwKLQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQlpZiAoIXV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX0NIQVJTRVRfUlVMRSkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGNoZWNrIGlmIGVtYmVkZGVkIG9yIG5vdAotCQlpZiAoZkNvbnRleHQuZ2V0TW9kZWwoKS5nZXRTdHlsZVNoZWV0VHlwZSgpID09IElDU1NNb2RlbC5FTUJFRERFRCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBjaGVjayBpZiBjYXJldCBwcmVjZWRlIGFsbCBvdGhlciBydWxlcy4KLQkJaW50IG9mZnNldCA9IGZDb250ZXh0LmdldEN1cnNvclBvcygpOwotCQlpZiAoMCA8IG9mZnNldCkgewotCQkJU2VsZWN0aW9uQ29sbGVjdG9yIHRyYXYgPSBuZXcgU2VsZWN0aW9uQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LnNldFJlZ2lvbigwLCBvZmZzZXQgLSAxKTsKLQkJCXRyYXYuYXBwbHkoZkNvbnRleHQuZ2V0TW9kZWwoKS5nZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGkgPSB0cmF2LmdldFNlbGVjdGVkTm9kZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTTm9kZSAmJiAhKG9iaiBpbnN0YW5jZW9mIElDU1NEb2N1bWVudCkpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZyBpZGVudCA9IChmVXNlVXBwZXJDYXNlKSA/IENIQVJTRVQudG9VcHBlckNhc2UoKSA6IENIQVJTRVQudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVRdW90ZXMoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQkJc2FvID0gZ2VuZXJhdGVTZW1pY29sb24oKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyhpZGVudCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuUlVMRV9DSEFSU0VUKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVGb250RmFjZVJ1bGUoKSB7Ci0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9GT05UX0ZBQ0VfUlVMRSkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBGT05UX0ZBQ0UudG9VcHBlckNhc2UoKSA6IEZPTlRfRkFDRS50b0xvd2VyQ2FzZSgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGlkZW50KTsKLQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJY3Vyc29yUG9zID0gYnVmLmxlbmd0aCgpOwotCQlTdHJpbmdBbmRPZmZzZXQgc2FvOwotCQlzYW8gPSBnZW5lcmF0ZUJyYWNlcygpOwotCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJY3Vyc29yUG9zICs9IHNhby5mT2Zmc2V0OwotCi0JCVN0cmluZyB0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0KLQkJaWYgKGlzTWF0Y2godGV4dCkpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKGlkZW50KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5SVUxFX0ZPTlRGQUNFKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBDU1NDQUNhbmRpZGF0ZSBnZXRDYW5kaWRhdGVJbXBvcnRSdWxlKCkgewotCQkvLyBjaGVjayBjb250ZW50IG1vZGVsCi0JCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJaWYgKCF1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZShDU1NNTU5vZGUuVFlQRV9JTVBPUlRfUlVMRSkuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGNoYXJzZXQgYW5kIGltcG9ydCBjYW4gcHJlY2VkZSBpbXBvcnQgcnVsZS4KLQkJaW50IG9mZnNldCA9IGZDb250ZXh0LmdldEN1cnNvclBvcygpOwotCQlpZiAoMCA8IG9mZnNldCkgewotCQkJU2VsZWN0aW9uQ29sbGVjdG9yIHRyYXYgPSBuZXcgU2VsZWN0aW9uQ29sbGVjdG9yKCk7Ci0JCQl0cmF2LnNldFJlZ2lvbigwLCBvZmZzZXQgLSAxKTsKLQkJCXRyYXYuYXBwbHkoZkNvbnRleHQuZ2V0TW9kZWwoKS5nZXREb2N1bWVudCgpKTsKLQkJCUl0ZXJhdG9yIGkgPSB0cmF2LmdldFNlbGVjdGVkTm9kZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBJQ1NTTm9kZSAmJiAhKG9iaiBpbnN0YW5jZW9mIElDU1NEb2N1bWVudCB8fCBvYmogaW5zdGFuY2VvZiBJQ1NTQ2hhcnNldFJ1bGUgfHwgb2JqIGluc3RhbmNlb2YgSUNTU0ltcG9ydFJ1bGUpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmcgaWRlbnQgPSAoZlVzZVVwcGVyQ2FzZSkgPyBJTVBPUlQudG9VcHBlckNhc2UoKSA6IElNUE9SVC50b0xvd2VyQ2FzZSgpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKGlkZW50KTsKLQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJY3Vyc29yUG9zID0gYnVmLmxlbmd0aCgpOwotCQlTdHJpbmdBbmRPZmZzZXQgc2FvOwotCQlzYW8gPSBnZW5lcmF0ZVVSSSgpOwotCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJY3Vyc29yUG9zICs9IHNhby5mT2Zmc2V0OwotCQlzYW8gPSBnZW5lcmF0ZVNlbWljb2xvbigpOwotCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQotCQlTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JCWlmIChpc01hdGNoKHRleHQpKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyhpZGVudCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuUlVMRV9JTVBPUlQpOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENTU0NBQ2FuZGlkYXRlIGdldENhbmRpZGF0ZU1lZGlhUnVsZSgpIHsKLQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQlpZiAoIXV0aWwuY29sbGVjdE5vZGVzQnlUeXBlKENTU01NTm9kZS5UWVBFX01FRElBX1JVTEUpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJU3RyaW5nIGlkZW50ID0gKGZVc2VVcHBlckNhc2UpID8gTUVESUEudG9VcHBlckNhc2UoKSA6IE1FRElBLnRvTG93ZXJDYXNlKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoaWRlbnQpOwotCQlidWYuYXBwZW5kKCIgICIpOy8vJE5PTi1OTFMtMSQKLQkJY3Vyc29yUG9zID0gYnVmLmxlbmd0aCgpIC0gMTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVCcmFjZXMoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0KLQkJU3RyaW5nIHRleHQgPSBidWYudG9TdHJpbmcoKTsKLQotCQlpZiAoaXNNYXRjaCh0ZXh0KSkgewotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcoaWRlbnQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlJVTEVfTUVESUEpOwotCQkJcmV0dXJuIGl0ZW07Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIENTU0NBQ2FuZGlkYXRlIGdldENhbmRpZGF0ZVBhZ2VSdWxlKCkgewotCQlDU1NNZXRhTW9kZWxVdGlsIHV0aWwgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChmQ29udGV4dC5nZXRNZXRhTW9kZWwoKSk7Ci0JCWlmICghdXRpbC5jb2xsZWN0Tm9kZXNCeVR5cGUoQ1NTTU1Ob2RlLlRZUEVfUEFHRV9SVUxFKS5oYXNOZXh0KCkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJaW50IGN1cnNvclBvcyA9IDA7Ci0JCVN0cmluZyBpZGVudCA9IChmVXNlVXBwZXJDYXNlKSA/IFBBR0UudG9VcHBlckNhc2UoKSA6IFBBR0UudG9Mb3dlckNhc2UoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmLmFwcGVuZChpZGVudCk7Ci0JCWJ1Zi5hcHBlbmQoIiAiKTsvLyROT04tTkxTLTEkCi0JCWN1cnNvclBvcyA9IGJ1Zi5sZW5ndGgoKTsKLQkJU3RyaW5nQW5kT2Zmc2V0IHNhbzsKLQkJc2FvID0gZ2VuZXJhdGVCcmFjZXMoKTsKLQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCWN1cnNvclBvcyArPSBzYW8uZk9mZnNldDsKLQotCQlTdHJpbmcgdGV4dCA9IGJ1Zi50b1N0cmluZygpOwotCi0JCWlmIChpc01hdGNoKHRleHQpKSB7Ci0JCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKGJ1Zi50b1N0cmluZygpKTsKLQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zKTsKLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyhpZGVudCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuUlVMRV9QQUdFKTsKLQkJCXJldHVybiBpdGVtOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZkNvbnRleHQuZ2V0VGFyZ2V0UmVnaW9uUHJldmlvdXMoKTsKLQkJLy8JSVRleHRSZWdpb24gcmVnaW9uID0gZkNvbnRleHQuZ2V0U2lnbmlmaWNhbnRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAodHlwZSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFICYmIHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFTElNSVRFUikgewotCQkJCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JCQl9Ci0JCX0KLQotCQlDU1NDQUNhbmRpZGF0ZSBpdGVtOwotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVJbXBvcnRSdWxlKCkpICE9IG51bGwpIHsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JCWlmICgoaXRlbSA9IGdldENhbmRpZGF0ZUNoYXJzZXRSdWxlKCkpICE9IG51bGwpIHsKLQkJCWNhbmRpZGF0ZXMuYWRkKGl0ZW0pOwotCQl9Ci0JCWlmICgoaXRlbSA9IGdldENhbmRpZGF0ZU1lZGlhUnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVQYWdlUnVsZSgpKSAhPSBudWxsKSB7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCQlpZiAoKGl0ZW0gPSBnZXRDYW5kaWRhdGVGb250RmFjZVJ1bGUoKSkgIT0gbnVsbCkgewotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQkJcmV0dXJuIGNhbmRpZGF0ZXMuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZjQwYjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbk5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci0KLWNsYXNzIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25OYW1lIGV4dGVuZHMgQ1NTUHJvcG9zYWxHZW5lcmF0b3IgewotCi0JLyoqCi0JICogQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JEZWNsYXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25OYW1lKENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2FuZGlkYXRlcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpIHsKLQkJTGlzdCBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBwcmVEZWxpbSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QUkVfREVMSU0pOyBpKyspIHsKLQkJCXByZURlbGltICs9ICcgJzsvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIHBvc3REZWxpbSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmZXJlbmNlcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfUFJPUF9QT1NUX0RFTElNKTsgaSsrKSB7Ci0JCQlwb3N0RGVsaW0gKz0gJyAnOy8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWJvb2xlYW4gYkZvbnRSdWxlID0gZmFsc2U7Ci0JCWZvciAoSUNTU05vZGUgbm9kZSA9IHRhcmdldE5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIG9yZy53M2MuZG9tLmNzcy5DU1NGb250RmFjZVJ1bGUpIHsKLQkJCQliRm9udFJ1bGUgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ1NTTWV0YU1vZGVsVXRpbCB1dGlsID0gbmV3IENTU01ldGFNb2RlbFV0aWwoZkNvbnRleHQuZ2V0TWV0YU1vZGVsKCkpOwotCQlJdGVyYXRvciBpTmFtZXMgPSB1dGlsLmNvbGxlY3ROb2Rlc0J5VHlwZSgoYkZvbnRSdWxlKSA/IENTU01NTm9kZS5UWVBFX0RFU0NSSVBUT1IgOiBDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSk7Ci0JCXdoaWxlIChpTmFtZXMuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGlOYW1lcy5uZXh0KCk7Ci0JCQluYW1lcy5hZGQobm9kZSk7Ci0JCX0KLQkJc29ydE5hbWVzKG5hbWVzKTsKLQkJLy8gQ29sbGVjdGlvbnMuc29ydChuYW1lcyk7Ci0KLQkJYm9vbGVhbiBiQWRkQ29sb24gPSB0cnVlOwotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtICYmIGZDb250ZXh0LnRhcmdldEhhcyhDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SKSkgewotCQkJYkFkZENvbG9uID0gZmFsc2U7Ci0JCX0KLQotCQlJdGVyYXRvciBpID0gbmFtZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIHRleHQgPSBub2RlLmdldE5hbWUoKTsKLQkJCXRleHQgPSAocHJlZmVyZW5jZXMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKSA/IHRleHQudG9VcHBlckNhc2UoKSA6IHRleHQudG9Mb3dlckNhc2UoKTsKLQkJCWlmICghaXNNYXRjaCh0ZXh0KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlidWYuYXBwZW5kKHRleHQpOwotCQkJYnVmLmFwcGVuZChwcmVEZWxpbSk7Ci0JCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCQlpZiAoYkFkZENvbG9uKSB7Ci0JCQkJYnVmLmFwcGVuZCgnOicpOy8vJE5PTi1OTFMtMSQKLQkJCQlidWYuYXBwZW5kKHBvc3REZWxpbSk7Ci0JCQkJY3Vyc29yUG9zICs9IDEgKyBwb3N0RGVsaW0ubGVuZ3RoKCk7Ci0JCQl9Ci0JCQkvLyBpZiAoISAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSkgewotCQkJLy8gYnVmLmFwcGVuZCgnOycpOy8vJE5PTi1OTFMtMSQKLQkJCS8vIH0KLQotCQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCQlpdGVtLnNldERpc3BsYXlTdHJpbmcodGV4dCk7Ci0JCQlpdGVtLnNldEltYWdlVHlwZShnZXRDYXRlZ29yeUltYWdlVHlwZShub2RlKSk7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCi0JCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0Jdm9pZCBzb3J0TmFtZXMoTGlzdCBuYW1lcykgewotCQlDb2xsZWN0aW9ucy5zb3J0KG5hbWVzLCBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCUNTU01NTm9kZSBub2RlMSA9IChDU1NNTU5vZGUpIG8xOwotCQkJCUNTU01NTm9kZSBub2RlMiA9IChDU1NNTU5vZGUpIG8yOwotCQkJCWlmIChub2RlMSA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAxOwotCQkJCX0gZWxzZSBpZiAobm9kZTIgPT0gbnVsbCkgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCWludCBkaWZmID0gMDsKLQkJCQlTdHJpbmcgY2F0ZWdvcnkxID0gbm9kZTEuZ2V0QXR0cmlidXRlKCJjYXRlZ29yeSIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGNhdGVnb3J5MiA9IG5vZGUyLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChjYXRlZ29yeTEgPT0gbnVsbCkgewotCQkJCQlpZiAoY2F0ZWdvcnkyID09IG51bGwpIHsKLQkJCQkJCWRpZmYgPSAwOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmV0dXJuIDE7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKGNhdGVnb3J5MiA9PSBudWxsKSB7Ci0JCQkJCXJldHVybiAtMTsKLQkJCQl9IGVsc2UgewotCQkJCQlkaWZmID0gY2F0ZWdvcnkxLmNvbXBhcmVUbyhjYXRlZ29yeTIpOwotCQkJCX0KLQkJCQlpZiAoZGlmZiA9PSAwKSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gbm9kZTEuZ2V0TmFtZSgpOwotCQkJCQlpZiAobmFtZSA9PSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gMTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXJldHVybiBuYW1lLmNvbXBhcmVUbyhub2RlMi5nZXROYW1lKCkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmV0dXJuIGRpZmY7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKgotCSAqIHJldHJpZXZlIGRlZmF1bHQgY2F0ZWdvcnkgaWNvbiBuYW1lIFRPRE86IGlmIG5vZGUgaGFzICJpY29uIig/KSwgdXNlCi0JICogaXQuCi0JICovCi0JQ1NTSW1hZ2VUeXBlIGdldENhdGVnb3J5SW1hZ2VUeXBlKENTU01NTm9kZSBub2RlKSB7Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSBudWxsOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2F0ZWdvcnkgPSBub2RlLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGNhdGVnb3J5ICE9IG51bGwpIHsKLQkJCQlpbWFnZVR5cGUgPSBDU1NJbWFnZVR5cGUuZ2V0SW1hZ2VUeXBlKGNhdGVnb3J5KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKGltYWdlVHlwZSA9PSBudWxsKSA/IENTU0ltYWdlVHlwZS5DQVRFR09SWV9ERUZBVUxUIDogaW1hZ2VUeXBlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmYwMjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yRGVjbGFyYXRpb25WYWx1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuQ1NTQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NRnVuY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU51bWJlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVVuaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU0Z1bmN0aW9uSUQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC51dGlsLkNTU01ldGFNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotCi1jbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QT1JUQU5UID0gIiFpbXBvcnRhbnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGZVc2VVcHBlckNhc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZBcHBlbmRTZW1pQ29sb247Ci0KLQkvKioKLQkgKiBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NQcm9wb3NhbEdlbmVyYXRvckZvckRlY2xhcmF0aW9uVmFsdWUoQ1NTQ29udGVudEFzc2lzdENvbnRleHQgY29udGV4dCkgewotCQlzdXBlcihjb250ZXh0KTsKLQkJZlVzZVVwcGVyQ2FzZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEZ1bmN0aW9uKExpc3QgY2FuZGlkYXRlcywgQ1NTTU1GdW5jdGlvbiBwcm9wKSB7Ci0JCVN0cmluZyB0ZXh0ID0gcHJvcC50b1N0cmluZygpOwotCQlpZiAoIWlzTWF0Y2godGV4dCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBjdXJzb3JQb3MgPSAwOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAocHJvcC5nZXROYW1lKCkuZXF1YWxzKENTU0Z1bmN0aW9uSUQuRl9VUkkpKSB7Ci0JCQlTdHJpbmdBbmRPZmZzZXQgc2FvID0gZ2VuZXJhdGVVUkkoKTsKLQkJCWJ1Zi5hcHBlbmQoc2FvLmZTdHJpbmcpOwotCQkJY3Vyc29yUG9zID0gc2FvLmZPZmZzZXQ7Ci0JCX0gZWxzZSB7Ci0JCQlidWYuYXBwZW5kKHByb3AudG9TdHJpbmcoKSk7Ci0JCQljdXJzb3JQb3MgPSBidWYubGVuZ3RoKCk7Ci0JCQlTdHJpbmdBbmRPZmZzZXQgc2FvID0gZ2VuZXJhdGVQYXJlbnRoZXNpcygpOwotCQkJYnVmLmFwcGVuZChzYW8uZlN0cmluZyk7Ci0JCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCX0KLQotCQl0ZXh0ID0gYnVmLnRvU3RyaW5nKCk7Ci0JCXRleHQgPSAoZlVzZVVwcGVyQ2FzZSkgPyB0ZXh0LnRvVXBwZXJDYXNlKCkgOiB0ZXh0LnRvTG93ZXJDYXNlKCk7Ci0KLQkJQ1NTQ0FDYW5kaWRhdGUgaXRlbSA9IG5ldyBDU1NDQUNhbmRpZGF0ZSgpOwotCQlpdGVtLnNldFJlcGxhY2VtZW50U3RyaW5nKHRleHQpOwotCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKGN1cnNvclBvcyk7Ci0JCWl0ZW0uc2V0RGlzcGxheVN0cmluZyh0ZXh0KTsKLQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlZBTFVFX0ZVTkNUSU9OKTsKLQkJYXBwZW5kU2VtaUNvbG9uKGl0ZW0pOwotCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZE51bWJlcihMaXN0IGNhbmRpZGF0ZXMsIENTU01NTnVtYmVyIHByb3ApIHsKLQkJU3RyaW5nIGZ1bGxUZXh0ID0gZkNvbnRleHQuZ2V0VGV4dFRvUmVwbGFjZSgpOwotCQkvLyBza2lwIG51bWJlcgotCQlpbnQgdW5pdEluZGV4ID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFRleHQubGVuZ3RoKCk7IGkrKykgewotCQkJaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGZ1bGxUZXh0LmNoYXJBdChpKSkpIHsKLQkJCQl1bml0SW5kZXggPSBpICsgMTsKLQkJCX0gZWxzZSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgdW5pdFN1YlRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbnVtU3ViVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmICgwIDw9IHVuaXRJbmRleCkgewotCQkJbnVtU3ViVGV4dCA9IGZ1bGxUZXh0LnN1YnN0cmluZygwLCB1bml0SW5kZXgpOwotCQkJaWYgKHVuaXRJbmRleCA8IGZ1bGxUZXh0Lmxlbmd0aCgpKSB7Ci0JCQkJdW5pdFN1YlRleHQgPSBmdWxsVGV4dC5zdWJzdHJpbmcodW5pdEluZGV4KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXVuaXRTdWJUZXh0ID0gZnVsbFRleHQ7Ci0JCX0KLQotCQlJdGVyYXRvciBpID0gcHJvcC5nZXREZXNjZW5kYW50cygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NVW5pdCB1bml0ID0gKENTU01NVW5pdCkgaS5uZXh0KCk7Ci0JCQlTdHJpbmcgdW5pdFN0cmluZyA9IHVuaXQuZ2V0VW5pdFN0cmluZygpOwotCQkJaWYgKCgwIDwgdW5pdFN1YlRleHQubGVuZ3RoKCkgJiYgdW5pdFN0cmluZy5pbmRleE9mKHVuaXRTdWJUZXh0KSAhPSAwKSB8fCAoMCA8IG51bVN1YlRleHQubGVuZ3RoKCkgJiYgdW5pdFN0cmluZy5lcXVhbHMoIiMiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlTdHJpbmcgdGV4dCA9IG51bVN1YlRleHQgKyB1bml0U3RyaW5nOwotCQkJdGV4dCA9IChmVXNlVXBwZXJDYXNlKSA/IHRleHQudG9VcHBlckNhc2UoKSA6IHRleHQudG9Mb3dlckNhc2UoKTsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCQlpZiAoMCA8IG51bVN1YlRleHQubGVuZ3RoKCkgfHwgdGV4dC5lcXVhbHMoIiMiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbih0ZXh0Lmxlbmd0aCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbigwKTsKLQkJCX0KLQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyh0ZXh0KTsKLQkJCWl0ZW0uc2V0SW1hZ2VUeXBlKENTU0ltYWdlVHlwZS5WQUxVRV9OVU1CRVIpOwotCQkJYXBwZW5kU2VtaUNvbG9uKGl0ZW0pOwotCQkJY2FuZGlkYXRlcy5hZGQoaXRlbSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU2VtaUNvbG9uKCkgewotCQlmQXBwZW5kU2VtaUNvbG9uID0gZmFsc2U7Ci0KLQkJSVRleHRSZWdpb24gdGFyZ2V0UmVnaW9uID0gZkNvbnRleHQuZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JCWlmICh0YXJnZXRSZWdpb24gIT0gbnVsbCAmJiB0YXJnZXRSZWdpb24uZ2V0VHlwZSgpICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCS8vIGZpbmQgdHJhaWxpbmcgIjoiIG9yICI7IgotCQkJLy8gaWYgIjoiIGJlZm9yZSAiOyIgaXMgZm91bmQsIGFkZCAiOyIKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXJhdG9yID0gZkNvbnRleHQuZ2V0UmVnaW9uSXRlcmF0b3IoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyID0gaXRlcmF0b3IuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBjb250YWluZXIpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9TRVBBUkFUT1IpIHsKLQkJCQkJZkFwcGVuZFNlbWlDb2xvbiA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZkFwcGVuZFNlbWlDb2xvbikgewotCQkJCS8vIHNlY29uZCBjaGFuY2U6Ci0JCQkJLy8gbGVhZGluZyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIG5vdCAiOyIKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBDU1NVdGlsLmZpbmROZXh0U2lnbmlmaWNhbnROb2RlKGNvbnRhaW5lcik7Ci0JCQkJaWYgKENTU1V0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVHlwZShuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSAhPSBDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0JCQkJCWZBcHBlbmRTZW1pQ29sb24gPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXBwZW5kU2VtaUNvbG9uKENTU0NBQ2FuZGlkYXRlIGl0ZW0pIHsKLQkJaWYgKGZBcHBlbmRTZW1pQ29sb24pIHsKLQkJCVN0cmluZyByZXBsYWNlbWVudFN0cmluZyA9IGl0ZW0uZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcocmVwbGFjZW1lbnRTdHJpbmcgKyAiOyIpOyAvLyROT04tTkxTLTEkCi0JCQlpbnQgY3Vyc29yUG9zaXRpb24gPSBpdGVtLmdldEN1cnNvclBvc2l0aW9uKCk7Ci0JCQlpZiAocmVwbGFjZW1lbnRTdHJpbmcubGVuZ3RoKCkgPD0gY3Vyc29yUG9zaXRpb24pIHsKLQkJCQkvLyBjdXJzb3Jwb3MgaXMgdGFpbCBvZiBzdHJpbmcKLQkJCQljdXJzb3JQb3NpdGlvbisrOwotCQkJCWl0ZW0uc2V0Q3Vyc29yUG9zaXRpb24oY3Vyc29yUG9zaXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTZW1pQ29sb24oTGlzdCBjYW5kaWRhdGVzKSB7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCWlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCUlDU1NOb2RlIGZpcnN0Q2hpbGQgPSB0YXJnZXROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChmaXJzdENoaWxkID09IG51bGwpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoZmlyc3RDaGlsZCBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGZpcnN0Q2hpbGQpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaWYgKGZDb250ZXh0LmdldEN1cnNvclBvcygpIDw9IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGJBZGRDbG9zZXIgPSBmYWxzZTsKLQotCQlJVGV4dFJlZ2lvbiB0YXJnZXRSZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJaWYgKHRhcmdldFJlZ2lvbiAhPSBudWxsICYmIHRhcmdldFJlZ2lvbi5nZXRUeXBlKCkgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX0RFTElNSVRFUikgewotCQkJLy8gZmluZCB0cmFpbGluZyAiOiIgb3IgIjsiCi0JCQkvLyBpZiAiOiIgYmVmb3JlICI7IiBpcyBmb3VuZCwgYWRkICI7IgotCQkJUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IgPSBmQ29udGV4dC5nZXRSZWdpb25JdGVyYXRvcigpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250YWluZXIgPSBpdGVyYXRvci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJaWYgKGl0ZXJhdG9yLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IGNvbnRhaW5lcikgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUikgewotCQkJCQliQWRkQ2xvc2VyID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFiQWRkQ2xvc2VyKSB7Ci0JCQkJLy8gc2Vjb25kIGNoYW5jZToKLQkJCQkvLyBsZWFkaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgbm90ICI7IgotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IENTU1V0aWwuZmluZE5leHRTaWduaWZpY2FudE5vZGUoY29udGFpbmVyKTsKLQkJCQlpZiAoQ1NTVXRpbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UeXBlKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pICE9IENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIpIHsKLQkJCQkJYkFkZENsb3NlciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGJBZGRDbG9zZXIpIHsKLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCVN0cmluZyB0ZXh0ID0gZkNvbnRleHQuZ2V0VGV4dFRvUmVwbGFjZSgpICsgIjsiOy8vJE5PTi1OTFMtMSQKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcodGV4dCk7Ci0JCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKHRleHQubGVuZ3RoKCkpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKCI7Iik7Ly8kTk9OLU5MUy0xJAotCQkJaXRlbS5zZXRJbWFnZVR5cGUobnVsbCk7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU3RyaW5nKExpc3QgY2FuZGlkYXRlcywgU3RyaW5nIHRleHQpIHsKLQkJaWYgKCFpc01hdGNoKHRleHQpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQl0ZXh0ID0gKGZVc2VVcHBlckNhc2UpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCi0JCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyh0ZXh0KTsKLQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbih0ZXh0Lmxlbmd0aCgpKTsKLQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRleHQpOwotCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuVkFMVUVfU1RSSU5HKTsKLQkJYXBwZW5kU2VtaUNvbG9uKGl0ZW0pOwotCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkSW1wb3J0YW50KExpc3QgY2FuZGlkYXRlcykgewotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQl3aGlsZSAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmICghKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQkvLyAxLiBoYXMgbm8gcHJpb3JpdHkgcmVnaW9uCi0JCS8vIDIuIGN1cnNvciBwb3NpdGlvbiBpcyBhZnRlciBvZiBsYXN0IGNoaWxkCi0JCS8vIDMuIG5vcm1hbCBpc01hdGNoIG1ldGhvZAotCQlTdHJpbmcgcHJpb3JpdHkgPSAoKElDU1NTdHlsZURlY2xJdGVtKSB0YXJnZXROb2RlKS5nZXRQcmlvcml0eSgpOwotCQlpZiAocHJpb3JpdHkgPT0gbnVsbCB8fCBwcmlvcml0eS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlJQ1NTTm9kZSBsYXN0Q2hpbGQgPSB0YXJnZXROb2RlLmdldExhc3RDaGlsZCgpOwotCQkJaWYgKGxhc3RDaGlsZCBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAoKEluZGV4ZWRSZWdpb24pIGxhc3RDaGlsZCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkvLwlpbnQgZW5kT2Zmc2V0ID0gKChJbmRleGVkUmVnaW9uKWxhc3RDaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJaWYgKHN0YXJ0T2Zmc2V0IDwgZkNvbnRleHQuZ2V0Q3Vyc29yUG9zKCkgJiYgaXNNYXRjaChJTVBPUlRBTlQpKSB7Ci0JCQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhJTVBPUlRBTlQpOwotCQkJCQlpdGVtLnNldEN1cnNvclBvc2l0aW9uKElNUE9SVEFOVC5sZW5ndGgoKSk7Ci0JCQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyhJTVBPUlRBTlQpOwotCQkJCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuVkFMVUVfU1RSSU5HKTsKLQkJCQkJYXBwZW5kU2VtaUNvbG9uKGl0ZW0pOwotCQkJCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRDYW5kaWRhdGVzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRDYW5kaWRhdGVzKCkgewotCQlMaXN0IGNhbmRpZGF0ZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJY2hlY2tTZW1pQ29sb24oKTsgLy8gY2hlY2sgc2hvdWxkIGFkZCBzZW1pLWNvbG9uIG9yIG5vdAotCi0JCVN0cmluZyBuYW1lID0gZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCUNTU01ldGFNb2RlbFV0aWwgdXRpbCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKGZDb250ZXh0LmdldE1ldGFNb2RlbCgpKTsKLQkJCUl0ZXJhdG9yIGkgPSBDb2xsZWN0aW9ucy5FTVBUWV9MSVNULml0ZXJhdG9yKCk7Ci0JCQlpZiAoaXNGb250RmFjZVJ1bGUoKSkgewotCQkJCUNTU01NRGVzY3JpcHRvciBkZXNjID0gdXRpbC5nZXREZXNjcmlwdG9yKG5hbWUpOwotCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJaSA9IGRlc2MuZ2V0VmFsdWVzKCk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlDU1NNTVByb3BlcnR5IHByb3AgPSB1dGlsLmdldFByb3BlcnR5KG5hbWUpOwotCQkJCWlmIChwcm9wICE9IG51bGwpIHsKLQkJCQkJaSA9IHByb3AuZ2V0VmFsdWVzKCk7Ci0JCQkJfQotCQkJfQotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ1NTTU1Ob2RlIHZhbCA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJCVN0cmluZyB2YWx1ZVR5cGUgPSB2YWwuZ2V0VHlwZSgpOwotCQkJCWlmICh2YWx1ZVR5cGUgPT0gQ1NTTU1Ob2RlLlRZUEVfS0VZV09SRCkgewotCQkJCQlhZGRTdHJpbmcoY2FuZGlkYXRlcywgdmFsLnRvU3RyaW5nKCkpOwotCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IENTU01NTm9kZS5UWVBFX05VTUJFUikgewotCQkJCQlhZGROdW1iZXIoY2FuZGlkYXRlcywgKENTU01NTnVtYmVyKSB2YWwpOwotCQkJCX0gZWxzZSBpZiAodmFsdWVUeXBlID09IENTU01NTm9kZS5UWVBFX0ZVTkNUSU9OKSB7Ci0JCQkJCWFkZEZ1bmN0aW9uKGNhbmRpZGF0ZXMsIChDU1NNTUZ1bmN0aW9uKSB2YWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWFkZEltcG9ydGFudChjYW5kaWRhdGVzKTsKLQkJYWRkU2VtaUNvbG9uKGNhbmRpZGF0ZXMpOwotCi0JCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkgewotCQlJQ1NTTm9kZSB0YXJnZXROb2RlID0gZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpOwotCQl3aGlsZSAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NQcmltaXRpdmVWYWx1ZSkgewotCQkJdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCXJldHVybiAoKElDU1NTdHlsZURlY2xJdGVtKSB0YXJnZXROb2RlKS5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZvbnRGYWNlUnVsZSgpIHsKLQkJSUNTU05vZGUgdGFyZ2V0Tm9kZSA9IGZDb250ZXh0LmdldFRhcmdldE5vZGUoKTsKLQkJd2hpbGUgKHRhcmdldE5vZGUgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpIHsKLQkJCXRhcmdldE5vZGUgPSB0YXJnZXROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKSB7Ci0JCQl0YXJnZXROb2RlID0gdGFyZ2V0Tm9kZS5nZXRQYXJlbnROb2RlKCk7IC8vIGdldCBEZWNsYXJhdGlvbgotCQkJaWYgKHRhcmdldE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGlubGluZSBzdHlsZSBoYXMgbm8gcnVsZSBub2RlCi0JCQkJdGFyZ2V0Tm9kZSA9IHRhcmdldE5vZGUuZ2V0UGFyZW50Tm9kZSgpOyAvLyBnZXQgcnVsZQotCQkJfQotCQl9Ci0JCXJldHVybiAodGFyZ2V0Tm9kZSBpbnN0YW5jZW9mIENTU0ZvbnRGYWNlUnVsZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNjhmNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JIVE1MVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1jbGFzcyBDU1NQcm9wb3NhbEdlbmVyYXRvckZvckhUTUxUYWcgZXh0ZW5kcyBDU1NQcm9wb3NhbEdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBDU1NTdHlsZVJ1bGVQcm9wb3NhbEdlbmVyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqLwotCUNTU1Byb3Bvc2FsR2VuZXJhdG9yRm9ySFRNTFRhZyhDU1NDb250ZW50QXNzaXN0Q29udGV4dCBjb250ZXh0KSB7Ci0JCXN1cGVyKGNvbnRleHQpOwotCi0JCWlmIChmSFRNTFRhZ3MgPT0gbnVsbCkgewotCQkJZkhUTUxUYWdzID0gc2V0dXBIVE1MVGFncygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2FuZGlkYXRlcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpIHsKLQkJTGlzdCBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChjaGVja0xlYWRpbmdDb2xvbigpKSB7Ci0JCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCQl9Ci0KLQkJLy8gWEhUTUwgcmVxdWlyZXMgbG93ZXIgY2FzZQotCQlib29sZWFuIGJMb3dlckNhc2UgPSBmYWxzZTsKLQkJaWYgKGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRU1CRURERUQpIHsKLQkJCU5vZGUgZG9tTm9kZSA9IGZDb250ZXh0LmdldE1vZGVsKCkuZ2V0T3duZXJET01Ob2RlKCk7Ci0JCQlpZiAoZG9tTm9kZSAhPSBudWxsICYmICEoZG9tTm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSkgewotCQkJCWRvbU5vZGUgPSBkb21Ob2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9tTm9kZSBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkgewotCQkJCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgKChJRE9NRG9jdW1lbnQpIGRvbU5vZGUpLmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCQliTG93ZXJDYXNlID0gKGFkYXB0ZXIuZ2V0VGFnTmFtZUNhc2UoKSA9PSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0UpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0KLQkJaW50IGxlbmd0aCA9IGZIVE1MVGFncy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0YWdUZXh0ID0gZkhUTUxUYWdzW2ldOwotCQkJaWYgKGJMb3dlckNhc2UpIHsKLQkJCQl0YWdUZXh0ID0gdGFnVGV4dC50b0xvd2VyQ2FzZSgpOwotCQkJfQotCQkJaWYgKCFpc01hdGNoKHRhZ1RleHQpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWludCBjdXJzb3JQb3MgPSAwOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWJ1Zi5hcHBlbmQodGFnVGV4dCk7Ci0JCQljdXJzb3JQb3MgKz0gdGFnVGV4dC5sZW5ndGgoKTsKLQkJCWJvb2xlYW4gaW5SdWxlID0gKGZDb250ZXh0LmdldFRhcmdldE5vZGUoKSBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpOwotCQkJaWYgKCFpblJ1bGUgfHwgZkNvbnRleHQuZ2V0VGV4dFRvUmVwbGFjZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQlidWYuYXBwZW5kKCIgIik7Ly8kTk9OLU5MUy0xJAotCQkJCWN1cnNvclBvcyArPSAxOwotCQkJfQotCQkJaWYgKCFpblJ1bGUpIHsKLQkJCQlTdHJpbmdBbmRPZmZzZXQgc2FvID0gZ2VuZXJhdGVCcmFjZXMoKTsKLQkJCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJCQljdXJzb3JQb3MgKz0gc2FvLmZPZmZzZXQ7Ci0JCQl9Ci0KLQkJCUNTU0NBQ2FuZGlkYXRlIGl0ZW0gPSBuZXcgQ1NTQ0FDYW5kaWRhdGUoKTsKLQkJCWl0ZW0uc2V0UmVwbGFjZW1lbnRTdHJpbmcoYnVmLnRvU3RyaW5nKCkpOwotCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJaXRlbS5zZXREaXNwbGF5U3RyaW5nKHRhZ1RleHQpOwotCQkJaXRlbS5zZXRJbWFnZVR5cGUoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX1RBRyk7Ci0JCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJfQotCi0JCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNldHVwSFRNTFRhZ3MoKSB7Ci0JCUNNRG9jdW1lbnQgY21kb2MgPSBIVE1MQ01Eb2N1bWVudEZhY3RvcnkuZ2V0Q01Eb2N1bWVudChDTURvY1R5cGUuSFRNTF9ET0NfVFlQRSk7Ci0JCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRzID0gY21kb2MuZ2V0RWxlbWVudHMoKTsKLQkJVmVjdG9yIG5hbWVzID0gbmV3IFZlY3RvcigpOwotCQlpbnQgbkVsZW1lbnRzID0gZWxlbWVudHMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbkVsZW1lbnRzOyBpKyspIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLml0ZW0oaSk7Ci0JCQlpZiAoaXNBdHRyRGVmaW5lZChlZGVjLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKSkgewotCQkJCW5hbWVzLmFkZChlZGVjLmdldEVsZW1lbnROYW1lKCkpOwotCQkJfQotCQl9Ci0JCUNvbGxlY3Rpb25zLnNvcnQobmFtZXMpOwotCQlTdHJpbmdbXSB0YWdzID0gbmV3IFN0cmluZ1tuYW1lcy5zaXplKCldOwotCQlJdGVyYXRvciBpTmFtZXMgPSBuYW1lcy5pdGVyYXRvcigpOwotCQlmb3IgKGludCBpID0gMDsgaU5hbWVzLmhhc05leHQoKTsgaSsrKSB7Ci0JCQl0YWdzW2ldID0gKFN0cmluZykgaU5hbWVzLm5leHQoKTsKLQkJfQotCQlyZXR1cm4gdGFnczsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0F0dHJEZWZpbmVkKENNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMsIFN0cmluZyBhdHRyTmFtZSkgewotCQlpZiAoZWRlYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJQ01OYW1lZE5vZGVNYXAgYXR0cnMgPSBlZGVjLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJzID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRycy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGF0dHIuZ2V0QXR0ck5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmSFRNTFRhZ3MgPSBudWxsOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwYzQ1Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NNTVNlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNTVR5cGVDb2xsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlci5DU1NSZWdpb25VdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2UuQ1NTSW1hZ2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0vKioKLSAqICAKLSAqLwotY2xhc3MgQ1NTUHJvcG9zYWxHZW5lcmF0b3JGb3JQc2V1ZG9TZWxlY3RvciBleHRlbmRzIENTU1Byb3Bvc2FsR2VuZXJhdG9yIHsKLQotCS8qKgotCSAqIENTU1Byb3Bvc2FsR2VuZXJhdG9yRm9yUHNldWRvU2VsZWN0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKi8KLQlDU1NQcm9wb3NhbEdlbmVyYXRvckZvclBzZXVkb1NlbGVjdG9yKENTU0NvbnRlbnRBc3Npc3RDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIoY29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Q2FuZGlkYXRlcyBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0Q2FuZGlkYXRlcygpIHsKLQkJTGlzdCBjYW5kaWRhdGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWJvb2xlYW4gaGFzTGVhZGluZ0NvbG9uID0gY2hlY2tMZWFkaW5nQ29sb24oKTsKLQkJU3RyaW5nIHRleHRUb1JlcGxhY2UgPSBmQ29udGV4dC5nZXRUZXh0VG9SZXBsYWNlKCk7Ci0JCWlmICghaGFzTGVhZGluZ0NvbG9uICYmIDAgPCB0ZXh0VG9SZXBsYWNlLmxlbmd0aCgpICYmICF0ZXh0VG9SZXBsYWNlLmVxdWFscyhmQ29udGV4dC5nZXRUZXh0VG9Db21wYXJlKCkpKSB7Ci0JCQkvLyBjdXJzb3IgcGxhY2VkIG1pZHBvaW50IG9mIHRoZSByZWdpb24KLQkJCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JCX0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZkNvbnRleHQuZ2V0VGFyZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgIT0gQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1MgJiYgIUNTU1JlZ2lvblV0aWwuaXNTZWxlY3RvckJlZ2dpbmluZ1R5cGUodHlwZSkpIHsKLQkJCQlyZXR1cm4gY2FuZGlkYXRlcy5pdGVyYXRvcigpOwotCQkJfQotCQl9Ci0KLQkJYm9vbGVhbiB1c2VVcHBlckNhc2UgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUjsKLQotCQlMaXN0IHRhZ3MgPSBnZXRTZWxlY3RvclRhZ3MoKTsKLQkJQ29sbGVjdGlvbnMuc29ydCh0YWdzKTsKLQkJSXRlcmF0b3IgaSA9IHRhZ3MuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJaWYgKGhhc0xlYWRpbmdDb2xvbiAmJiAhaXNNYXRjaCh0ZXh0KSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJdGV4dCA9ICh1c2VVcHBlckNhc2UpID8gdGV4dC50b1VwcGVyQ2FzZSgpIDogdGV4dC50b0xvd2VyQ2FzZSgpOwotCi0JCQlpbnQgY3Vyc29yUG9zID0gMDsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoaGFzTGVhZGluZ0NvbG9uKSB7Ci0JCQkJYnVmLmFwcGVuZCh0ZXh0LnN1YnN0cmluZygxKSk7Ci0JCQl9IGVsc2UgewotCQkJCWJ1Zi5hcHBlbmQodGV4dFRvUmVwbGFjZSk7Ci0JCQkJYnVmLmFwcGVuZCh0ZXh0KTsKLQkJCX0KLQkJCWN1cnNvclBvcyArPSBidWYubGVuZ3RoKCk7Ci0KLQkJCWlmICgwIDwgYnVmLmxlbmd0aCgpKSB7Ci0JCQkJYm9vbGVhbiBpblJ1bGUgPSAoZkNvbnRleHQuZ2V0VGFyZ2V0Tm9kZSgpIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSB8fCBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCkgaW5zdGFuY2VvZiBJQ1NTUGFnZVJ1bGUpOwotCQkJCWlmICghaW5SdWxlIHx8ICh0ZXh0VG9SZXBsYWNlLmxlbmd0aCgpID09IDAgJiYgIWhhc0xlYWRpbmdDb2xvbikpIHsKLQkJCQkJYnVmLmFwcGVuZCgiICIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJY3Vyc29yUG9zICs9IDE7Ci0JCQkJfQotCQkJCWlmICghaW5SdWxlKSB7Ci0JCQkJCVN0cmluZ0FuZE9mZnNldCBzYW8gPSBnZW5lcmF0ZUJyYWNlcygpOwotCQkJCQlidWYuYXBwZW5kKHNhby5mU3RyaW5nKTsKLQkJCQkJY3Vyc29yUG9zICs9IHNhby5mT2Zmc2V0OwotCQkJCX0KLQkJCQlDU1NDQUNhbmRpZGF0ZSBpdGVtID0gbmV3IENTU0NBQ2FuZGlkYXRlKCk7Ci0JCQkJaXRlbS5zZXRSZXBsYWNlbWVudFN0cmluZyhidWYudG9TdHJpbmcoKSk7Ci0JCQkJaXRlbS5zZXRDdXJzb3JQb3NpdGlvbihjdXJzb3JQb3MpOwotCQkJCWl0ZW0uc2V0RGlzcGxheVN0cmluZyh0ZXh0KTsKLQkJCQlpdGVtLnNldEltYWdlVHlwZShDU1NJbWFnZVR5cGUuU0VMRUNUT1JfUFNFVURPKTsKLQkJCQljYW5kaWRhdGVzLmFkZChpdGVtKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCUxpc3QgZ2V0U2VsZWN0b3JUYWdzKCkgewotCQlMaXN0IHRhZ0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDU1NOb2RlIHRhcmdldE5vZGUgPSBmQ29udGV4dC5nZXRUYXJnZXROb2RlKCk7Ci0JCVN0cmluZyByb290VHlwZSA9ICh0YXJnZXROb2RlIGluc3RhbmNlb2YgSUNTU1BhZ2VSdWxlKSA/IENTU01NTm9kZS5UWVBFX1BBR0VfUlVMRSA6IENTU01NTm9kZS5UWVBFX1NUWUxFX1JVTEU7Ci0KLQkJQ1NTTU1UeXBlQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDU1NNTVR5cGVDb2xsZWN0b3IoKTsKLQkJY29sbGVjdG9yLmNvbGxlY3ROZXN0ZWRUeXBlKGZhbHNlKTsKLQkJY29sbGVjdG9yLmFwcGx5KGZDb250ZXh0LmdldE1ldGFNb2RlbCgpLCByb290VHlwZSk7Ci0JCUl0ZXJhdG9yIGk7Ci0JCWkgPSBjb2xsZWN0b3IuZ2V0Tm9kZXMoKTsKLQkJaWYgKCFpLmhhc05leHQoKSkgewotCQkJcmV0dXJuIHRhZ0xpc3Q7Ci0JCX0KLQkJQ1NTTU1Ob2RlIG5vZGUgPSAoQ1NTTU1Ob2RlKSBpLm5leHQoKTsKLQkJaSA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU01NTm9kZSBjaGlsZCA9IChDU1NNTU5vZGUpIGkubmV4dCgpOwotCQkJaWYgKGNoaWxkLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9TRUxFQ1RPUikgewotCQkJCVN0cmluZyBzZWxUeXBlID0gKChDU1NNTVNlbGVjdG9yKSBjaGlsZCkuZ2V0U2VsZWN0b3JUeXBlKCk7Ci0JCQkJaWYgKHNlbFR5cGUgPT0gQ1NTTU1TZWxlY3Rvci5UWVBFX1BTRVVET19DTEFTUyB8fCBzZWxUeXBlID09IENTU01NU2VsZWN0b3IuVFlQRV9QU0VVRE9fRUxFTUVOVCkgewotCQkJCQl0YWdMaXN0LmFkZCgoKENTU01NU2VsZWN0b3IpIGNoaWxkKS5nZXRTZWxlY3RvclN0cmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRhZ0xpc3Q7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTWF0Y2goU3RyaW5nIHRleHQpIHsKLQkJaWYgKCFzdXBlci5pc01hdGNoKHRleHQpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmQ29udGV4dC5nZXRUYXJnZXRSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9QU0VVRE8pIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ1NTVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4MDU4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuQ29udGV4dFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLkNTU0VkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlSGVscGVyOwotCi0KLS8qKgotICogQ29tcGxldGlvbiBwcm9jZXNzb3IgZm9yIENTUyBUZW1wbGF0ZXMuIE1vc3Qgb2YgdGhlIHdvcmsgaXMgYWxyZWFkeSBkb25lCi0gKiBieSB0aGUgQ1NTIENvbnRlbnQgQXNzaXN0IHByb2Nlc3Nvciwgc28gYnkgdGhlIHRpbWUgdGhlCi0gKiBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgaXMgYXNrZWQgZm9yIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FscywgdGhlCi0gKiBDU1MgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIGhhcyBhbHJlYWR5IHNldCB0aGUgY29udGV4dCB0eXBlIGZvcgotICogdGVtcGxhdGVzLgotICovCi1jbGFzcyBDU1NUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZXh0ZW5kcyBUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgewotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCXByb3RlY3RlZCBUZW1wbGF0ZUNvbnRleHRUeXBlIGdldENvbnRleHRUeXBlKElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24pIHsKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlID0gbnVsbDsKLQotCQlDb250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQkJaWYgKHJlZ2lzdHJ5ICE9IG51bGwpCi0JCQl0eXBlID0gcmVnaXN0cnkuZ2V0Q29udGV4dFR5cGUoZkNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0eXBlOwotCX0KLQotCXByb3RlY3RlZCBJbWFnZSBnZXRJbWFnZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgewotCQkvLyBqdXN0IHJldHVybiB0aGUgc2FtZSBpbWFnZSBmb3Igbm93Ci0JCXJldHVybiBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RFTVBMQVRFKTsKLQl9Ci0KLQlwcml2YXRlIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpOwotCX0KLQotCXZvaWQgc2V0Q29udGV4dFR5cGUoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJZkNvbnRleHRUeXBlSWQgPSBjb250ZXh0VHlwZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUw0ME5hbWVzcGFjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTDQwTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMDk0MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTDQwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi0vKioKLSAqIFByb3ZpZGUgYWxsIG5hbWVzIGRlZmluZWQgaW4gdGhlIEhUTUwgNC4wPyBzcGVjaWZpY2F0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUw0ME5hbWVzcGFjZSB7Ci0KLQkvLyBFbGVtZW50IG5hbWVzCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRWxlbWVudE5hbWUgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBID0gIkEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCQlIgPSAiQUJCUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNST05ZTSA9ICJBQ1JPTllNIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTID0gIkFERFJFU1MiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUExFVCA9ICJBUFBMRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFSRUEgPSAiQVJFQSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQiA9ICJCIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVNFID0gIkJBU0UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VGT05UID0gIkJBU0VGT05UIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRE8gPSAiQkRPIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCR1NPVU5EID0gIkJHU09VTkQiOyAvLyBEMjA1NTEzCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQklHID0gIkJJRyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxJTksgPSAiQkxJTksiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJMT0NLUVVPVEUgPSAiQkxPQ0tRVU9URSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9EWSA9ICJCT0RZIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUiA9ICJCUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVUVE9OID0gIkJVVFRPTiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FQVElPTiA9ICJDQVBUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRU5URVIgPSAiQ0VOVEVSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSVRFID0gIkNJVEUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREUgPSAiQ09ERSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MID0gIkNPTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MR1JPVVAgPSAiQ09MR1JPVVAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEREID0gIkREIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUwgPSAiREVMIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERk4gPSAiREZOIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVIgPSAiRElSIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVYgPSAiRElWIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBETCA9ICJETCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFQgPSAiRFQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNID0gIkVNIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTUJFRCA9ICJFTUJFRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERTRVQgPSAiRklFTERTRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTlQgPSAiRk9OVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STSA9ICJGT1JNIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFNRSA9ICJGUkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJBTUVTRVQgPSAiRlJBTUVTRVQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgxID0gIkgxIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMiA9ICJIMiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDMgPSAiSDMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg0ID0gIkg0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINSA9ICJINSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDYgPSAiSDYiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQUQgPSAiSEVBRCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFIgPSAiSFIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUwgPSAiSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSSA9ICJJIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRlJBTUUgPSAiSUZSQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUcgPSAiSU1HIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTlBVVCA9ICJJTlBVVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TID0gIklOUyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNJTkRFWCA9ICJJU0lOREVYIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQkQgPSAiS0JEIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTCA9ICJMQUJFTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVHRU5EID0gIkxFR0VORCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEkgPSAiTEkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTksgPSAiTElOSyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQID0gIk1BUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVOVSA9ICJNRU5VIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBID0gIk1FVEEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PQlIgPSAiTk9CUiI7IC8vIEQyMDU1MTMgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT0VNQkVEID0gIk5PRU1CRUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PRlJBTUVTID0gIk5PRlJBTUVTIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1NDUklQVCA9ICJOT1NDUklQVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0JKRUNUID0gIk9CSkVDVCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0wgPSAiT0wiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVEdST1VQID0gIk9QVEdST1VQIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT04gPSAiT1BUSU9OIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQID0gIlAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNID0gIlBBUkFNIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkUgPSAiUFJFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRID0gIlEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFMgPSAiUyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FNUCA9ICJTQU1QIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFQgPSAiU0NSSVBUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1QgPSAiU0VMRUNUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTTUFMTCA9ICJTTUFMTCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBTiA9ICJTUEFOIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJS0UgPSAiU1RSSUtFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJPTkcgPSAiU1RST05HIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFlMRSA9ICJTVFlMRSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VCID0gIlNVQiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQID0gIlNVUCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFCTEUgPSAiVEFCTEUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRCT0RZID0gIlRCT0RZIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURCA9ICJURCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVEFSRUEgPSAiVEVYVEFSRUEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRGT09UID0gIlRGT09UIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSCA9ICJUSCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhFQUQgPSAiVEhFQUQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gIlRJVExFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUiA9ICJUUiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFQgPSAiVFQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFUgPSAiVSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUwgPSAiVUwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBUiA9ICJWQVIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdCUiA9ICJXQlIiOyAvLyBEMjA1NTEzIC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFSUVVFRSA9ICJNQVJRVUVFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfQ09ORklHID0gIlNTSTpDT05GSUciOyAvLyBEMjEwMzkzCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0VDSE8gPSAiU1NJOkVDSE8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9FWEVDID0gIlNTSTpFWEVDIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRlNJWkUgPSAiU1NJOkZTSVpFIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRkxBU1RNT0QgPSAiU1NJOkZMQVNUTU9EIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfSU5DTFVERSA9ICJTU0k6SU5DTFVERSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1BSSU5URU5WID0gIlNTSTpQUklOVEVOViI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1NFVCA9ICJTU0k6U0VUIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfV01MID0gIndtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0NBUkQgPSAiY2FyZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX1RFTVBMQVRFID0gInRlbXBsYXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQUNDRVNTID0gImFjY2VzcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0RPID0gImRvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfT05FVkVOVCA9ICJvbmV2ZW50IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfVElNRVIgPSAidGltZXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BTkNIT1IgPSAiYW5jaG9yIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfUFJFViA9ICJwcmV2IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfUkVGUkVTSCA9ICJyZWZyZXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfR08gPSAiZ28iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9OT09QID0gIm5vb3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9TRVRWQVIgPSAic2V0dmFyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfUE9TVEZJRUxEID0gInBvc3RmaWVsZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyBDaGFyYWN0ZXIgRW50aXRpZXMKLQlwdWJsaWMgc3RhdGljIGludGVyZmFjZSBFbnRpdHlOYW1lIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUFDVVRFX1UgPSAiQWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQUNVVEVfTCA9ICJhYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDSVJDX1UgPSAiQWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDSVJDX0wgPSAiYWNpcmMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVVRFID0gImFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRUxJR19VID0gIkFFbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRUxJR19MID0gImFlbGlnIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBR1JBVkVfVSA9ICJBZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFHUkFWRV9MID0gImFncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxFRlNZTSA9ICJhbGVmc3ltIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFBIQV9VID0gIkFscGhhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTFBIQV9MID0gImFscGhhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTVAgPSAiYW1wIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkQgPSAiYW5kIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTkcgPSAiYW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUklOR19VID0gIkFyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUklOR19MID0gImFyaW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1lNUCA9ICJhc3ltcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRJTERFX1UgPSAiQXRpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVElMREVfTCA9ICJhdGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVTUxfVSA9ICJBdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVU1MX0wgPSAiYXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkRRVU8gPSAiYmRxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJFVEFfVSA9ICJCZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCRVRBX0wgPSAiYmV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJWQkFSID0gImJydmJhciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVMTCA9ICJidWxsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVAgPSAiY2FwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQ0VESUxfVSA9ICJDY2VkaWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENDRURJTF9MID0gImNjZWRpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0VESUwgPSAiY2VkaWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENFTlQgPSAiY2VudCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hJX1UgPSAiQ2hpIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElfTCA9ICJjaGkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENJUkMgPSAiY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xVQlMgPSAiY2x1YnMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTkcgPSAiY29uZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09QWSA9ICJjb3B5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkFSUiA9ICJjcmFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VQID0gImN1cCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VSUkVOID0gImN1cnJlbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREFHR0VSX1UgPSAiRGFnZ2VyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQUdHRVJfTCA9ICJkYWdnZXIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBUlJfVSA9ICJkQXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEQVJSX0wgPSAiZGFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVHID0gImRlZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMVEFfVSA9ICJEZWx0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMVEFfTCA9ICJkZWx0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElBTVMgPSAiZGlhbXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJVklERSA9ICJkaXZpZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVBQ1VURV9VID0gIkVhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUFDVVRFX0wgPSAiZWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0lSQ19VID0gIkVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFQ0lSQ19MID0gImVjaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFR1JBVkVfVSA9ICJFZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVHUkFWRV9MID0gImVncmF2ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFkgPSAiZW1wdHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVNU1AgPSAiZW1zcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5TUCA9ICJlbnNwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUFNJTE9OX1UgPSAiRXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVBTSUxPTl9MID0gImVwc2lsb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUlWID0gImVxdWl2IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVEFfVSA9ICJFdGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVUQV9MID0gImV0YSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVRIX1UgPSAiRVRIIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVEhfTCA9ICJldGgiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVVTUxfVSA9ICJFdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVU1MX0wgPSAiZXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVVSTyA9ICJldXJvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWElTVCA9ICJleGlzdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk5PRiA9ICJmbm9mIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JBTEwgPSAiZm9yYWxsIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFDMTIgPSAiZnJhYzEyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFDMTQgPSAiZnJhYzE0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFDMzQgPSAiZnJhYzM0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGUkFTTCA9ICJmcmFzbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0FNTUFfVSA9ICJHYW1tYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0FNTUFfTCA9ICJnYW1tYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0UgPSAiZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdUID0gImd0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIQVJSX1UgPSAiaEFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFSUl9MID0gImhhcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQVJUUyA9ICJoZWFydHMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTExJUCA9ICJoZWxsaXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElBQ1VURV9VID0gIklhY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUFDVVRFX0wgPSAiaWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ0lSQ19VID0gIkljaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJQ0lSQ19MID0gImljaXJjIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRVhDTCA9ICJpZXhjbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUdSQVZFX1UgPSAiSWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJR1JBVkVfTCA9ICJpZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNQUdFID0gImltYWdlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTkZJTiA9ICJpbmZpbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5UID0gImludCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9UQV9VID0gIklvdGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElPVEFfTCA9ICJpb3RhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJUVVFU1QgPSAiaXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU0lOID0gImlzaW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElVTUxfVSA9ICJJdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJVU1MX0wgPSAiaXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0FQUEFfVSA9ICJLYXBwYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0FQUEFfTCA9ICJrYXBwYSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFNQkRBX1UgPSAiTGFtYmRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU1CREFfTCA9ICJsYW1iZGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBTkcgPSAibGFuZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFRVU8gPSAibGFxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBUlJfVSA9ICJsQXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVJSX0wgPSAibGFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTENFSUwgPSAibGNlaWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExEUVVPID0gImxkcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRSA9ICJsZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEZMT09SID0gImxmbG9vciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9XQVNUID0gImxvd2FzdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9aID0gImxveiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFJNID0gImxybSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNBUVVPID0gImxzYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTFNRVU8gPSAibHNxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExUID0gImx0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUNSID0gIm1hY3IiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1EQVNIID0gIm1kYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNSUNSTyA9ICJtaWNybyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlERE9UID0gIm1pZGRvdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUlOVVMgPSAibWludXMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VX1UgPSAiTXUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1VX0wgPSAibXUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BQkxBID0gIm5hYmxhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQlNQID0gIm5ic3AiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5EQVNIID0gIm5kYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORSA9ICJuZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkkgPSAibmkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVCA9ICJub3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVElOID0gIm5vdGluIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOU1VCID0gIm5zdWIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5USUxERV9VID0gIk50aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlRJTERFX0wgPSAibnRpbGRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVV9VID0gIk51IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOVV9MID0gIm51IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPQUNVVEVfVSA9ICJPYWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9BQ1VURV9MID0gIm9hY3V0ZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0NJUkNfVSA9ICJPY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0NJUkNfTCA9ICJvY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0VMSUdfVSA9ICJPRWxpZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0VMSUdfTCA9ICJvZWxpZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0dSQVZFX1UgPSAiT2dyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPR1JBVkVfTCA9ICJvZ3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9MSU5FID0gIm9saW5lIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUVHQV9VID0gIk9tZWdhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUVHQV9MID0gIm9tZWdhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlDUk9OX1UgPSAiT21pY3JvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JQ1JPTl9MID0gIm9taWNyb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QTFVTID0gIm9wbHVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUiA9ICJvciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JERiA9ICJvcmRmIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUkRNID0gIm9yZG0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9TTEFTSF9VID0gIk9zbGFzaCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1NMQVNIX0wgPSAib3NsYXNoIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPVElMREVfVSA9ICJPdGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9USUxERV9MID0gIm90aWxkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RJTUVTID0gIm90aW1lcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VNTF9VID0gIk91bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VTUxfTCA9ICJvdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBID0gInBhcmEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUlQgPSAicGFydCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSTUlMID0gInBlcm1pbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEVSUCA9ICJwZXJwIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQSElfVSA9ICJQaGkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBISV9MID0gInBoaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfVSA9ICJQaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfTCA9ICJwaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElWID0gInBpdiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVU01OID0gInBsdXNtbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9VTkQgPSAicG91bmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1FX1UgPSAiUHJpbWUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU1FX0wgPSAicHJpbWUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0QgPSAicHJvZCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUCA9ICJwcm9wIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQU0lfVSA9ICJQc2kiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBTSV9MID0gInBzaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVCA9ICJxdW90IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQURJQyA9ICJyYWRpYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFORyA9ICJyYW5nIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQVFVTyA9ICJyYXF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkFSUl9VID0gInJBcnIiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJBUlJfTCA9ICJyYXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSQ0VJTCA9ICJyY2VpbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkRRVU8gPSAicmRxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUwgPSAicmVhbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVHID0gInJlZyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkZMT09SID0gInJmbG9vciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkhPX1UgPSAiUmhvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSSE9fTCA9ICJyaG8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJMTSA9ICJybG0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJTQVFVTyA9ICJyc2FxdW8iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJTUVVPID0gInJzcXVvIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQlFVTyA9ICJzYnF1byI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NBUk9OX1UgPSAiU2Nhcm9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ0FST05fTCA9ICJzY2Fyb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNET1QgPSAic2RvdCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDVCA9ICJzZWN0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSFkgPSAic2h5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdNQV9VID0gIlNpZ21hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdNQV9MID0gInNpZ21hIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdNQUYgPSAic2lnbWFmIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU0gPSAic2ltIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFERVMgPSAic3BhZGVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUIgPSAic3ViIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJFID0gInN1YmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVTSA9ICJzdW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUCA9ICJzdXAiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUDEgPSAic3VwMSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQMiA9ICJzdXAyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVAzID0gInN1cDMiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEUgPSAic3VwZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1pMSUcgPSAic3psaWciOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBVV9VID0gIlRhdSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFVX0wgPSAidGF1IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVSRTQgPSAidGhlcmU0IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVUQV9VID0gIlRoZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVUQV9MID0gInRoZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUSEVUQVNZTSA9ICJ0aGV0YXN5bSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhJTlNQID0gInRoaW5zcCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhPUk5fVSA9ICJUSE9STiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhPUk5fTCA9ICJ0aG9ybiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElMREUgPSAidGlsZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTID0gInRpbWVzIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFERSA9ICJ0cmFkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUFDVVRFX1UgPSAiVWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQUNVVEVfTCA9ICJ1YWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVBUlJfVSA9ICJ1QXJyIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVQVJSX0wgPSAidWFyciI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUNJUkNfVSA9ICJVY2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUNJUkNfTCA9ICJ1Y2lyYyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUdSQVZFX1UgPSAiVWdyYXZlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVR1JBVkVfTCA9ICJ1Z3JhdmUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVNTCA9ICJ1bWwiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVQU0lIID0gInVwc2loIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVUFNJTE9OX1UgPSAiVXBzaWxvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVBTSUxPTl9MID0gInVwc2lsb24iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVVTUxfVSA9ICJVdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVVU1MX0wgPSAidXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VJRVJQID0gIndlaWVycCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWElfVSA9ICJYaSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWElfTCA9ICJ4aSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWUFDVVRFX1UgPSAiWWFjdXRlIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZQUNVVEVfTCA9ICJ5YWN1dGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlFTiA9ICJ5ZW4iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFlVTUxfVSA9ICJZdW1sIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBZVU1MX0wgPSAieXVtbCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVUQV9VID0gIlpldGEiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFVEFfTCA9ICJ6ZXRhIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaV0ogPSAiendqIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaV05KID0gInp3bmoiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTDQwX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL2ZyYW1lc2V0LmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MNDBfVEFHX1BSRUZJWCA9ICIiOyAvLyROT04tTkxTLTEkCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSBuYW1lcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JRCA9ICJpZCI7IC8vICVjb3JlYXR0cnM7Ci0JCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTUyA9ICJjbGFzcyI7IC8vICVjb3JlYXR0cnM7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVFlMRSA9ICJzdHlsZSI7IC8vICVjb3JlYXR0cnM7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9USVRMRSA9ICJ0aXRsZSI7IC8vICVjb3JlYXR0cnM7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HID0gImxhbmciOyAvLyAlaTE4bjsKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ESVIgPSAiZGlyIjsgLy8gJWkxOG47IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05DTElDSyA9ICJvbmNsaWNrIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkRCTENMSUNLID0gIm9uZGJsY2xpY2siOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VET1dOID0gIm9ubW91c2Vkb3duIjsgLy8gJWV2ZW50czsKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTU9VU0VVUCA9ICJvbm1vdXNldXAiOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTk1PVVNFT1ZFUiA9ICJvbm1vdXNlb3ZlciI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTk1PVVNFTU9WRSA9ICJvbm1vdXNlbW92ZSI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTk1PVVNFT1VUID0gIm9ubW91c2VvdXQiOyAvLyAlZXZlbnRzOwotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OS0VZUFJFU1MgPSAib25rZXlwcmVzcyI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05LRVlET1dOID0gIm9ua2V5ZG93biI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OS0VZVVAgPSAib25rZXl1cCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05IRUxQID0gIm9uaGVscCI7IC8vICVldmVudHM7Ci0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JHQ09MT1IgPSAiYmdjb2xvciI7IC8vICVib2R5Y29sb3I7LAotCQkJCQkJCQkJCQkJCQkJICAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RFWFQgPSAidGV4dCI7IC8vICVib2R5Y29sb3I7Ci0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTElOSyA9ICJsaW5rIjsgLy8gJWJvZHljb2xvcjsKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WTElOSyA9ICJ2bGluayI7IC8vICVib2R5Y29sb3I7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTElOSyA9ICJhbGluayI7IC8vICVib2R5Y29sb3I7Ci0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyBIVE1MCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJPRklMRSA9ICJwcm9maWxlIjsgLy8gSEVBRAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OTE9BRCA9ICJvbmxvYWQiOyAvLyBCT0RZCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OVU5MT0FEID0gIm9udW5sb2FkIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsgLy8gQk9EWSwKLQkJCQkJCQkJCQkJCQkJCQkJLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TUkMgPSAic3JjIjsgLy8gSU1HIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxUID0gImFsdCI7IC8vIElNRyxBUkVBCi0JCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xPTkdERVNDID0gImxvbmdkZXNjIjsgLy8gSU1HCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gIm5hbWUiOyAvLyBJTUcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IRUlHSFQgPSAiaGVpZ2h0IjsgLy8gSU1HLCBUQUJMRQotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9ICJ3aWR0aCI7IC8vIElNRywgVEFCTEUsSFIKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1VTRU1BUCA9ICJ1c2VtYXAiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNNQVAgPSAiaXNtYXAiOyAvLyBJTUcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BTElHTiA9ICJhbGlnbiI7IC8vIElNRywgVEFCTEUsSFIKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0JPUkRFUiA9ICJib3JkZXIiOyAvLyBJTUcsIFRBQkxFCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9ICJoc3BhY2UiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVlNQQUNFID0gInZzcGFjZSI7IC8vIElNRwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVBGSUxFID0gIm1hcGZpbGUiOyAvLyBJTUcKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TVU1NQVJZID0gInN1bW1hcnkiOyAvLyBUQUJMRQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZSQU1FID0gImZyYW1lIjsgLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JVTEVTID0gInJ1bGVzIjsgLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NFTExTUEFDSU5HID0gImNlbGxzcGFjaW5nIjsgLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NFTExQQURESU5HID0gImNlbGxwYWRkaW5nIjsgLy8gVEFCTEUKLQkJCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RBVEFQQUdFU0laRSA9ICJkYXRhcGFnZXNpemUiOyAvLyBUQUJMRSxIUgotCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0xPUiA9ICJjb2xvciI7IC8vIEJBU0VGT05ULEZPTlQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZBQ0UgPSAiZmFjZSI7IC8vIEJBU0VGT05ULEZPTlQKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TSVpFID0gInNpemUiOyAvLyBCQVNFRk9OVCxGT05UCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xFQVIgPSAiY2xlYXIiOyAvLyBCUiAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NIQVBFID0gInNoYXBlIjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09PUkRTID0gImNvb3JkcyI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFJFRiA9ICJocmVmIjsgLy8gQVJFQSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RBUkdFVCA9ICJ0YXJnZXQiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PSFJFRiA9ICJub2hyZWYiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RBQklOREVYID0gInRhYmluZGV4IjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUNDRVNTS0VZID0gImFjY2Vzc2tleSI7IC8vIEFSRUEKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfT05GT0NVUyA9ICJvbmZvY3VzIjsgLy8gQVJFQQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OQkxVUiA9ICJvbmJsdXIiOyAvLyBBUkVBCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIQVJTRVQgPSAiY2hhcnNldCI7IC8vIExJTksKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IUkVGTEFORyA9ICJocmVmbGFuZyI7IC8vIExJTksKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1RZUEUgPSAidHlwZSI7IC8vIExJTksgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9SRUwgPSAicmVsIjsgLy8gTElOSyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JFViA9ICJyZXYiOyAvLyBMSU5LIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUVESUEgPSAibWVkaWEiOyAvLyBMSU5LCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9ICJ2YWx1ZSI7IC8vIFBBUkFNCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRVRZUEUgPSAidmFsdWV0eXBlIjsgLy8gUEFSQU0KLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTk9TSEFERSA9ICJub3NoYWRlIjsgLy8gSFIKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DSEVDS0VEID0gImNoZWNrZWQiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RJU0FCTEVEID0gImRpc2FibGVkIjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JFQURPTkxZID0gInJlYWRvbmx5IjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01BWExFTkdUSCA9ICJtYXhsZW5ndGgiOyAvLyBJTlBVVAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTlNFTEVDVCA9ICJvbnNlbGVjdCI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTkNIQU5HRSA9ICJvbmNoYW5nZSI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BQ0NFUFQgPSAiYWNjZXB0IjsgLy8gSU5QVVQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNUWUxFID0gImlzdHlsZSI7IC8vIElOUFVUCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIQVIgPSAiY2hhciI7IC8vIENPTCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NIQVJPRkYgPSAiY2hhcm9mZiI7IC8vIENPTAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZBTElHTiA9ICJ2YWxpZ24iOyAvLyBDT0wKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU1BBTiA9ICJzcGFuIjsgLy8gQ09MIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRlJBTUVCT1JERVIgPSAiZnJhbWVib3JkZXIiOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFSR0lOV0lEVEggPSAibWFyZ2lud2lkdGgiOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFSR0lOSEVJR0hUID0gIm1hcmdpbmhlaWdodCI7IC8vIEZSQU1FCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX05PUkVTSVpFID0gIm5vcmVzaXplIjsgLy8gRlJBTUUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDUk9MTElORyA9ICJzY3JvbGxpbmciOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QUk9NUFQgPSAicHJvbXB0IjsgLy8gSVNJTkRFWAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IVFRQX0VRVUlWID0gImh0dHAtZXF1aXYiOyAvLyBNRVRBCi0JCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVEVOVCA9ICJjb250ZW50IjsgLy8gTUVUQQotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDSEVNRSA9ICJzY2hlbWUiOyAvLyBNRVRBCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk1TRyA9ICJlcnJtc2ciOyAvLyBzc2k6Y29uZmlnCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NJWkVGTVQgPSAic2l6ZWZtdCI7IC8vIHNzaTpjb25maWcKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9USU1FRk1UID0gInRpbWVmbXQiOyAvLyBzc2k6Y29uZmlnCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFSID0gInZhciI7IC8vIHNzaTplY2hvCi0JCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NHSSA9ICJjZ2kiOyAvLyBzc2k6ZXhlYwotCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTUQgPSAiY21kIjsgLy8gc3NpOmV4ZWMKLQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRklMRSA9ICJmaWxlIjsgLy8gc3NpOmZzaXplCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVklSVFVBTCA9ICJ2aXJ0dWFsIjsgLy8gc3NpOmZzaXplCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0VMRUNURUQgPSAic2VsZWN0ZWQiOyAvLyBPUFRJT04KLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xBQkVMID0gImxhYmVsIjsgLy8gT1BUSU9OCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ST1dTID0gInJvd3MiOyAvLyBURVhUQVJFQQotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTFMgPSAiY29scyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOyAvLyBTQ1JJUFQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RFRkVSID0gImRlZmVyIjsgLy8gU0NSSVBUCi0JCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FVkVOVCA9ICJldmVudCI7IC8vIFNDUklQVAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRk9SID0gImZvciI7IC8vIFNDUklQVCAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTVBBQ1QgPSAiY29tcGFjdCI7IC8vIE9ML1VMCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU1RBUlQgPSAic3RhcnQiOyAvLyBPTC9VTAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRElSRUNUS0VZID0gImRpcmVjdGtleSI7IC8vIEEKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERUJBU0UgPSAiY29kZWJhc2UiOyAvLyBBUFBMRVQKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPREUgPSAiY29kZSI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09CSkVDVCA9ICJvYmplY3QiOyAvLyBBUFBMRVQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFZU0NSSVBUID0gIm1heXNjcmlwdCI7IC8vIEFQUExFVAotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DSVRFID0gImNpdGUiOyAvLyBCTE9DS1FVT1RFCi0JCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTUFDUk8gPSAibWFjcm8iOyAvLyBEMlcgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9EQVRFVElNRSA9ICJkYXRldGltZSI7IC8vIElOUy9ERUwKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0xPT1AgPSAibG9vcCI7IC8vIEVNQkVEIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSElEREVOID0gImhpZGRlbiI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1ZPTFVNRSA9ICJ2b2x1bWUiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BVVRPU1RBUlQgPSAiYXV0b3N0YXJ0IjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT1BMQVkgPSAiYXV0b3BsYXkiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT1NJWkUgPSAiYXV0b3NpemUiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09OVFJPTExFUiA9ICJjb250cm9sbGVyIjsvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0NBTEUgPSAic2NhbGUiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0hPV0NPTlRST0xTID0gInNob3djb250cm9scyI7Ly8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QTEFZQ09VTlQgPSAicGxheWNvdW50IjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUkVQRUFUID0gInJlcGVhdCI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBTkVMID0gInBhbmVsIjsgLy8gRU1CRUQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBTEVUVEUgPSAicGFsZXR0ZSI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVEVYVEZPQ1VTID0gInRleHRmb2N1cyI7IC8vIEVNQkVECi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDVElPTiA9ICJhY3Rpb24iOyAvLyBGT1JNCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX01FVEhPRCA9ICJtZXRob2QiOyAvLyBGT1JNCi0JCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VOQ1RZUEUgPSAiZW5jdHlwZSI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9PTlNVQk1JVCA9ICJvbnN1Ym1pdCI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX09OUkVTRVQgPSAib25yZXNldCI7IC8vIEZPUk0KLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVCA9ICJhY2NlcHQtY2hhcnNldCI7Ly8gRk9STQotCQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9CRUhBVklPUiA9ICJiZWhhdmlvciI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0RJUkVDVElPTiA9ICJkaXJlY3Rpb24iOyAvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCA9ICJzY3JvbGxhbW91bnQiOy8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TQ1JPTExERUxBWSA9ICJzY3JvbGxkZWxheSI7Ly8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UUlVFU1BFRUQgPSAidHJ1ZXNwZWVkIjsgLy8gTUFSUVVFRQotCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9ERUNMQVJFID0gImRlY2xhcmUiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTU0lEID0gImNsYXNzaWQiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9EQVRBID0gImRhdGEiOyAvLyBPQkpFQ1QKLQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFVFlQRSA9ICJjb2RldHlwZSI7IC8vIE9CSkVDVAotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU1RBTkRCWSA9ICJzdGFuZGJ5IjsgLy8gT0JKRUNUCi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTVVMVElQTEUgPSAibXVsdGlwbGUiOyAvLyBTRUxFQ1QKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FCQlIgPSAiYWJiciI7IC8vIFRIL1REIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVhJUyA9ICJheGlzIjsgLy8gVEgvVEQgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9IRUFERVJTID0gImhlYWRlcnMiOyAvLyBUSC9URAotCQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDT1BFID0gInNjb3BlIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JPV1NQQU4gPSAicm93c3BhbiI7IC8vIFRIL1RECi0JCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09MU1BBTiA9ICJjb2xzcGFuIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OT1dSQVAgPSAibm93cmFwIjsgLy8gVEgvVEQKLQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQkvLyA8PEQyMDU1MTQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVE9QTUFSR0lOID0gInRvcG1hcmdpbiI7IC8vIEJPRFkKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9UVE9NTUFSR0lOID0gImJvdHRvbW1hcmdpbiI7IC8vIEJPRFkKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTEVGVE1BUkdJTiA9ICJsZWZ0bWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JJR0hUTUFSR0lOID0gInJpZ2h0bWFyZ2luIjsgLy8gQk9EWQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9SREVSQ09MT1IgPSAiYm9yZGVyY29sb3IiOyAvLyBUQUJMRS9UUi9USC9URC9GUkFNRVNFVC9GUkFNRQotCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBmb3IgV01MCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV01MX0FUVFJfTkFNRV9USVRMRSA9ICJ0aXRsZSI7IC8vIGNhcmQKLQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfRE9NQUlOID0gImRvbWFpbiI7IC8vIGFjY2VzcwotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX1BBVEggPSAicGF0aCI7IC8vIGFjY2VzcwotCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05FTlRFUkZPUldBUkQgPSAib25lbnRlcmZvcndhcmQiOyAvLyB0ZW1wbGF0ZSxjYXJkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX09ORU5URVJCQUNLV0FSRCA9ICJvbmVudGVyYmFja3dhcmQiOyAvLyB0ZW1wbGF0ZSxjYXJkCi0JCQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfT05QSUNLID0gIm9ucGljayI7IC8vIG9wdGlvbgotCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX09OVElNRVIgPSAib250aW1lciI7IC8vIHRlbXBsYXRlLGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX05FV0NPTlRFWFQgPSAibmV3Y29udGV4dCI7IC8vIGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX09SREVSRUQgPSAib3JkZXJlZCI7IC8vIGNhcmQKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX09QVElPTkFMID0gIm9wdGlvbmFsIjsgLy8gZG8KLQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfQ0FDSEVfQ09OVFJPTCA9ICJjYWNoZS1jb250cm9sIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX1NFTkRSRUZFUkVSID0gInNlbmRyZWZlcmVyIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkJCSAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfTUVUSE9EID0gIm1ldGhvZCI7IC8vIGdvCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfRU5DVFlQRSA9ICJlbmN0eXBlIjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXTUxfQVRUUl9OQU1FX0FDQ0VQVF9DSEFSU0VUID0gImFjY2VwdC1jaGFyc2V0IjsgLy8gZ28KLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdNTF9BVFRSX05BTUVfQ09MVU1OUyA9ICJjb2x1bW5zIjsgLy8gdGFibGUKLQkJCQkJCQkJCQkJCQkJCQkgIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyBEMjA1NTE0Ci0JLy88PEQyMTU2ODQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRlJBTUVTUEFDSU5HID0gImZyYW1lc3BhY2luZyI7IC8vIEZSQU1FU0VUCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JLy9EMjE1Njg0Ci0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSB2YWx1ZXM7IG1haW5seSB1c2VkIGluIGVudW1lcmF0aW9uLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVkVSU0lPTl9UUkFOU0lUSU9OQUwgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WRVJTSU9OX0ZSQU1FU0VUID0gIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MVFIgPSAibHRyIjsgLy8gZGlyIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JUTCA9ICJydGwiOyAvLyBkaXIgLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gInRvcCI7IC8vIGFsaWduIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX01JRERMRSA9ICJtaWRkbGUiOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JPVFRPTSA9ICJib3R0b20iOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0xFRlQgPSAibGVmdCI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DRU5URVIgPSAiY2VudGVyIjsgLy8gYWxpZ24KLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSUdIVCA9ICJyaWdodCI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0pVU1RJRlkgPSAianVzdGlmeSI7IC8vIGFsaWduCi0JCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DSEFSID0gImNoYXIiOyAvLyBhbGlnbgotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHZhbGlnbiAoYmFzZWxpbmUpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CQVNFTElORSA9ICJiYXNlbGluZSI7IC8vIHZhbGlnbgotCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgY2xlYXIgKGxlZnR8YWxsfHJpZ2h0fG5vbmUpOiBsZWZ0IGFuZCByaWdodCBhcmUgYWxyZWFkeSBkZWZpbmVkCi0JLy8gYWJvdmUuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BTEwgPSAiYWxsIjsgLy8gY2xlYXIgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTk9ORSA9ICJub25lIjsgLy8gY2xlYXIKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBzaGFwZSAocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVDVCA9ICJyZWN0IjsgLy8gc2hhcGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0NJUkNMRSA9ICJjaXJjbGUiOyAvLyBzaGFwZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BPTFkgPSAicG9seSI7IC8vIHNoYXBlCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyBzaGFwZQotCQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHZhbHVldHlwZSAoZGF0YXxyZWZ8b2JqZWN0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfREFUQSA9ICJkYXRhIjsgLy8gdmFsdWV0eXBlCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRUYgPSAicmVmIjsgLy8gdmFsdWV0eXBlCi0JCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfT0JKRUNUID0gIm9iamVjdCI7IC8vIHZhbHVldHlwZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciB0eXBlIG9mIElOUFVUCi0JLy8gICAgICAgKHRleHQgfCBwYXNzd29yZCB8IGNoZWNrYm94IHwgcmFkaW8gfCBzdWJtaXQgfCByZXNldCB8Ci0JLy8gICAgICAgIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1RFWFQgPSAidGV4dCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1BBU1NXT1JEID0gInBhc3N3b3JkIjsgLy8gSU5QVVQ6dHlwZQotCQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DSEVDS0JPWCA9ICJjaGVja2JveCI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkFESU8gPSAicmFkaW8iOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1NVQk1JVCA9ICJzdWJtaXQiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVTRVQgPSAicmVzZXQiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0ZJTEUgPSAiZmlsZSI7IC8vIElOUFVUOnR5cGUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0hJRERFTiA9ICJoaWRkZW4iOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSU1BR0UgPSAiaW1hZ2UiOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0JVVFRPTiA9ICJidXR0b24iOyAvLyBJTlBVVDp0eXBlCi0JCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHNwYW4sIGNvbHNwYW4sIHJvd3NwYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzEgPSAiMSI7IC8vIHNwYW4gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGZyYW1lYm9yZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV8wID0gIjAiOyAvLyBGUkFNRSAvLyROT04tTkxTLTEkCi0JLy8gICBmb3Igc2Nyb2xsaW5nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ZRVMgPSAieWVzIjsgLy8gRlJBTUUgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTk8gPSAibm8iOyAvLyBGUkFNRSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BVVRPID0gImF1dG8iOyAvLyBGUkFNRQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIFVMCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ESVNDID0gImRpc2MiOyAvLyBVTDp0eXBlCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TUVVBUkUgPSAic3F1YXJlIjsgLy8gVUw6dHlwZQotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQkvLyAgIGZvciBmcmFtZSBvZiBUQUJMRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVk9JRCA9ICJ2b2lkIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FCT1ZFID0gImFib3ZlIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQkVMT1cgPSAiYmVsb3ciOyAvLyBUQUJMRTpmcmFtZQotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9IU0lERVMgPSAiaHNpZGVzIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MSFMgPSAibGhzIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSFMgPSAicmhzIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9WU0lERVMgPSAidnNpZGVzIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1ggPSAiYm94IjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1JERVIgPSAiYm9yZGVyIjsgLy8gVEFCTEU6ZnJhbWUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgcnVsZXMgb2YgVEFCTEUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0dST1VQUyA9ICJncm91cHMiOyAvLyBUQUJMRTpydWxlcwotCQkJCQkJCQkJCQkJCQkJIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JPV1MgPSAicm93cyI7IC8vIFRFWFRBUkVBCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DT0xTID0gImNvbHMiOyAvLyBURVhUQVJFQQotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIG1ldGhvZCBvZiBGT1JNCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9HRVQgPSAiZ2V0IjsgLy8gRk9STSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QT1NUID0gInBvc3QiOyAvLyBGT1JNIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQgPSAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIHNjb3BlIG9mIChUSCB8IFREKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUk9XID0gInJvdyI7IC8vIChUSHxURCk6c2NvcGUKLQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DT0wgPSAiY29sIjsgLy8gKFRIfFREKTpzY29wZQotCQkJCQkJCQkJCQkJCSAgIC8vIC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JPV0dST1VQID0gInJvd2dyb3VwIjsvLyAoVEh8VEQpOnNjb3BlCi0JCQkJCQkJCQkJCQkJCQkJLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ09MR1JPVVAgPSAiY29sZ3JvdXAiOy8vIChUSHxURCk6c2NvcGUKLQkJCQkJCQkJCQkJCQkJCQkvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYXV0bz8/IG9mIEVNQkVECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9UUlVFID0gInRydWUiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyBFTUJFRAotCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgYmVoYXZpcm8gb2YgTUFSUVVFRQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU0NST0xMID0gInNjcm9sbCI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TTElERSA9ICJzbGlkZSI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJICAgLy8gLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUxURVJOQVRFID0gImFsdGVybmF0ZSI7IC8vIE1BUlFVRUUKLQkJCQkJCQkJCQkJCQkJCQkgICAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgZGlyZWN0aW9uIG9mIE1BUlFVRUUKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1VQID0gInVwIjsgLy8gTUFSUVVFRSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9ET1dOID0gImRvd24iOyAvLyBNQVJRVUVFCi0JCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi0JLy8gICBmb3IgdHlwZSBvZiBMSSAoRDE5OTI0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTlVNQkVSID0gIjEiOyAvLyBMSSAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9MT1dFUl9BTFBIQSA9ICJhIjsgLy8gTEkKLQkJCQkJCQkJCQkJCQkJCSAvLyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NTU05vZGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ1NTTm9kZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2YWVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvQ1NTTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTWVkaWFSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTUHJpbWl0aXZlVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZS5DU1NJbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU0ltcG9ydFJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1J1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuTWVkaWFMaXN0OwotCi0vKioKLSAqIEFkYXB0cyB0aGUgQ1NTIERPTSBub2RlIHRvIGEgSkZhY2Ugdmlld2VyLgotICovCi1jbGFzcyBDU1NOb2RlQWRhcHRlciBpbXBsZW1lbnRzIElKRmFjZU5vZGVBZGFwdGVyLCBJTm9kZUFkYXB0ZXIsIFJ1bm5hYmxlIHsKLQljbGFzcyBOb3RpZnlDb250ZXh0IHsKLQkJTm90aWZ5Q29udGV4dChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbm90aWZpZXI7Ci0JCQl0aGlzLmV2ZW50VHlwZSA9IGV2ZW50VHlwZTsKLQkJCXRoaXMuY2hhbmdlZEZlYXR1cmUgPSBjaGFuZ2VkRmVhdHVyZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJCXRoaXMucG9zID0gcG9zOwotCQl9Ci0KLQkJdm9pZCBmaXJlKCkgewotCQkJaW50ZXJuYWxOb3RpZnlDaGFuZ2VkKG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCX0KLQotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyOwotCQlpbnQgZXZlbnRUeXBlOwotCQlPYmplY3QgY2hhbmdlZEZlYXR1cmU7Ci0JCU9iamVjdCBvbGRWYWx1ZTsKLQkJT2JqZWN0IG5ld1ZhbHVlOwotCQlpbnQgcG9zOwotCX0KLQotCWNsYXNzIFN0eWxlVmlld1VwZGF0ZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWlmIChsYXN0VXBkYXRlciA9PSB0aGlzKSB7Ci0JCQkJaW50ZXJuYWxBY3Rpb25QZXJmb3JtZWQoKTsKLQkJCQlsYXN0VXBkYXRlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyRmFjdG9yeSBhZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIFZlY3RvciBub3RpZnlRdWV1ZTsKLQlTdHlsZVZpZXdVcGRhdGVyIGxhc3RVcGRhdGVyOwotCXByb3RlY3RlZCBpbnQgZGVsYXlNU2VjcyA9IDUwMDsKLQlmaW5hbCBzdGF0aWMgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSkZhY2VOb2RlQWRhcHRlci5jbGFzczsKLQotCXB1YmxpYyBDU1NOb2RlQWRhcHRlcihJTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuYWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxBY3Rpb25QZXJmb3JtZWQoKSB7Ci0JCWlmIChub3RpZnlRdWV1ZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJYm9vbGVhbiByZWZyZXNoX2FsbCA9IGZhbHNlOwotCQlib29sZWFuIHJlZnJlc2hfcnVsZSA9IGZhbHNlOwotCQlpbnQgcG9zX2FsbCA9IDA7Ci0JCUxpc3QgdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlRdWV1ZS5zaXplKCk7IGkrKykgewotCQkJTm90aWZ5Q29udGV4dCBjb250ZXh0ID0gKE5vdGlmeUNvbnRleHQpIG5vdGlmeVF1ZXVlLmdldChpKTsKLQkJCWlmIChjb250ZXh0Lm5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlyZWZyZXNoX2FsbCA9IHRydWU7Ci0JCQkJcG9zX2FsbCA9IGk7Ci0JCQl9Ci0JCQlpZiAoY29udGV4dC5ub3RpZmllciBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQkJcmVmcmVzaF9ydWxlID0gdHJ1ZTsKLQkJCQl0YXJnZXRzLmFkZChjb250ZXh0KTsKLQkJCQkvLyBwb3NfcnVsZSA9IGk7Ci0JCQl9Ci0JCQkvLyAoKE5vdGlmeUNvbnRleHQpIG5vdGlmeVF1ZXVlLmdldChpKSkuZmlyZSgpOwotCQl9Ci0JCWlmIChyZWZyZXNoX2FsbCkgewotCQkJKChOb3RpZnlDb250ZXh0KSBub3RpZnlRdWV1ZS5nZXQocG9zX2FsbCkpLmZpcmUoKTsKLQkJfQotCQllbHNlIGlmIChyZWZyZXNoX3J1bGUpIHsKLQkJCUl0ZXJhdG9yIGkgPSB0YXJnZXRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQkoKE5vdGlmeUNvbnRleHQpIGkubmV4dCgpKS5maXJlKCk7Ci0JCQl9Ci0JCQkvLyBlbHNlIGlmIChyZWZyZXNoX3J1bGUpIGludGVybmFsUmVmcmVzaEFsbCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub3RpZnlRdWV1ZS5zaXplKCk7IGkrKykgewotCQkJCSgoTm90aWZ5Q29udGV4dCkgbm90aWZ5UXVldWUuZ2V0KGkpKS5maXJlKCk7Ci0JCQl9Ci0JCX0KLQkJbm90aWZ5UXVldWUuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIG9iamVjdCBiZWluZyBhZGFwdGVyICh0aGUgbm90aWZpZXIpIHdoZW4gc29tZXRoaW5nIGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgaW50ZXJuYWxOb3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgYWRhcHRlckZhY3RvcnkpLmdldExpc3RlbmVycygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQlub3RpZnlDaGFuZ2VkRm9yU3RydWN0dXJlZFZpZXdlcigoU3RydWN0dXJlZFZpZXdlcikgbGlzdGVuZXIsIG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFByb3BlcnR5U2hlZXRQYWdlKSB7Ci0JCQkJbm90aWZ5Q2hhbmdlZEZvclByb3BlcnR5U2hlZXRQYWdlKChQcm9wZXJ0eVNoZWV0UGFnZSkgbGlzdGVuZXIsIG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5Q2hhbmdlZEZvclByb3BlcnR5U2hlZXRQYWdlKFByb3BlcnR5U2hlZXRQYWdlIHBhZ2UsIElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKHBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQlwYWdlLnJlZnJlc2goKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBub3RpZnlDaGFuZ2VkRm9yU3RydWN0dXJlZFZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciwgSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAodmlld2VyLmdldENvbnRyb2woKSA9PSBudWxsIHx8IHZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKGNoYW5nZWRGZWF0dXJlICE9IG51bGwpID8gKElDU1NOb2RlKSBjaGFuZ2VkRmVhdHVyZSA6IChJQ1NTTm9kZSkgbmV3VmFsdWU7Ci0JCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKDs7KSB7Ci0JCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0ZW1wID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAodGVtcCA9PSBudWxsIHx8IHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUNTU05vZGUgdGVtcCA9IChJQ1NTTm9kZSkgbm90aWZpZXI7Ci0JCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmICh0ZW1wID09IG51bGwgfHwgdGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpIHsKLQkJCQlJQ1NTTm9kZSB0ZW1wID0gKGNoYW5nZWRGZWF0dXJlICE9IG51bGwpID8gKElDU1NOb2RlKSBjaGFuZ2VkRmVhdHVyZSA6IChJQ1NTTm9kZSkgbmV3VmFsdWU7Ci0JCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmb3IgKDs7KSB7Ci0JCQkJCQlpZiAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVJ1bGUpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJCXRlbXAgPSB0ZW1wLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmICh0ZW1wID09IG51bGwpIHsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodGVtcCA9PSBudWxsIHx8ICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV3VmFsdWUgIT0gbnVsbCAmJiAobmV3VmFsdWUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCQkJdmlld2VyLnJlZnJlc2goKChJQ1NTTm9kZSkgbmV3VmFsdWUpLmdldFBhcmVudE5vZGUoKSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJQ1NTTm9kZSB0ZW1wID0gKElDU1NOb2RlKSBub3RpZmllcjsKLQkJCQkJaWYgKHRlbXAgIT0gbnVsbCkgewotCQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQl9Ci0JCQkJCWlmICh0ZW1wID09IG51bGwgfHwgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVTaGVldCkpIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCWlmIChub3RpZmllciBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSB7Ci0JCQkJSUNTU05vZGUgdGVtcCA9IChjaGFuZ2VkRmVhdHVyZSAhPSBudWxsKSA/IChJQ1NTTm9kZSkgY2hhbmdlZEZlYXR1cmUgOiAoSUNTU05vZGUpIG5ld1ZhbHVlOwotCQkJCWlmICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9yICg7OykgewotCQkJCQkJaWYgKHRlbXAgaW5zdGFuY2VvZiBJQ1NTU3R5bGVSdWxlKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQl0ZW1wID0gdGVtcC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAodGVtcCA9PSBudWxsKSB7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKHRlbXAgPT0gbnVsbCB8fCAodGVtcCBpbnN0YW5jZW9mIElDU1NTdHlsZVNoZWV0KSkgewotCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXZpZXdlci5yZWZyZXNoKHRlbXApOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdmlld2VyLnJlZnJlc2gobm90aWZpZXIpOwotCQkJCUlDU1NOb2RlIHRlbXAgPSAoSUNTU05vZGUpIG5vdGlmaWVyOwotCQkJCWlmICh0ZW1wICE9IG51bGwpIHsKLQkJCQkJdGVtcCA9IHRlbXAuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCQlpZiAodGVtcCA9PSBudWxsIHx8ICh0ZW1wIGluc3RhbmNlb2YgSUNTU1N0eWxlU2hlZXQpKSB7Ci0JCQkJCXZpZXdlci5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl2aWV3ZXIucmVmcmVzaCh0ZW1wKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gfQotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGludGVybmFsUmVmcmVzaEFsbCgpIHsKLQkJQ29sbGVjdGlvbiBsaXN0ZW5lcnMgPSAoKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKSBhZGFwdGVyRmFjdG9yeSkuZ2V0TGlzdGVuZXJzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChsaXN0ZW5lciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBsaXN0ZW5lcjsKLQkJCQlpZiAodmlld2VyLmdldENvbnRyb2woKSAhPSBudWxsICYmICF2aWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQl2aWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RlbmVyIGluc3RhbmNlb2YgUHJvcGVydHlTaGVldFBhZ2UpIHsKLQkJCQlQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlID0gKFByb3BlcnR5U2hlZXRQYWdlKSBsaXN0ZW5lcjsKLQkJCQlpZiAocGFnZS5nZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhcGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCXBhZ2UucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoQURBUFRFUl9LRVkpOwotCX0KLQotCS8qKgotCSAqIENhbGxlZCBieSB0aGUgb2JqZWN0IGJlaW5nIGFkYXB0ZXIgKHRoZSBub3RpZmllcikgd2hlbiBzb21ldGhpbmcgaGFzCi0JICogY2hhbmdlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKG5vdGlmeVF1ZXVlID09IG51bGwpCi0JCQlub3RpZnlRdWV1ZSA9IG5ldyBWZWN0b3IoKTsKLQkJbm90aWZ5UXVldWUuYWRkKG5ldyBOb3RpZnlDb250ZXh0KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcykpOwotCQkvLyBUT0RPLWZ1dHVyZTogdGhlcmUncyBwcm9iYWJseSBhIGJldHRlciB3YXkgdGhhbiByZWx5aW5nIG9uIGFzeW5jCi0JCS8vIGV4ZWMKLQkJaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpKQotCQkJZ2V0RGlzcGxheSgpLnRpbWVyRXhlYyhkZWxheU1TZWNzLCB0aGlzKTsKLQkJZWxzZQotCQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0RGlzcGxheSgpICE9IG51bGwpIHsKLQkJCQkJCWdldERpc3BsYXkoKS50aW1lckV4ZWMoZGVsYXlNU2VjcywgdGhpcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQl9Ci0KLQlEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiB0aGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBvbmx5IGZvciB0aW1lckV4ZWMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbGFzdFVwZGF0ZXIgPSBuZXcgU3R5bGVWaWV3VXBkYXRlcigpOwotCQlnZXREaXNwbGF5KCkuYXN5bmNFeGVjKGxhc3RVcGRhdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIGNvbnRhaW5pbmcgYWxsIGNoaWxkIG5vZGVzIG9mIHRoZSBnaXZlbiBlbGVtZW50LAotCSAqIHdoaWNoIHJlcHJlc2VudHMgYSBub2RlIGluIGEgdHJlZS4gVGhlIGRpZmZlcmVuY2UgdG8KLQkgKiA8Y29kZT5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlci5nZXRFbGVtZW50cyhPYmplY3QpPC9jb2RlPiBpcyBhcwotCSAqIGZvbGxvd3M6IDxjb2RlPmdldEVsZW1lbnRzPC9jb2RlPiBpcyBjYWxsZWQgdG8gb2J0YWluIHRoZSB0cmVlCi0JICogdmlld2VyJ3Mgcm9vdCBlbGVtZW50cy4gTWV0aG9kIDxjb2RlPmdldENoaWxkcmVuPC9jb2RlPiBpcyB1c2VkIHRvCi0JICogb2J0YWluIHRoZSBjaGlsZHJlbiBvZiBhIGdpdmVuIG5vZGUgaW4gdGhlIHRyZWUsIHdoaWNoIGNhbiBjYW4gYmUgYQotCSAqIHJvb3Qgbm9kZSwgdG9vLgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgb2JqZWN0OwotCi0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSA9PSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSB8fCBub2RlVHlwZSA9PSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIHx8IG5vZGVUeXBlID09IElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFKSB7Ci0JCQkJZm9yIChub2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsYXJhdGlvbik7IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCQkvLyBub3AKLQkJCQl9Ci0JCQl9Ci0JCQlMaXN0IGNoaWxkcmVuID0gbmV3IEFycmF5TGlzdCgpOwotCQkJSUNTU05vZGUgY2hpbGQgPSAobm9kZSAhPSBudWxsKSA/IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpIDogbnVsbDsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKCEoY2hpbGQgaW5zdGFuY2VvZiBJQ1NTUHJpbWl0aXZlVmFsdWUpICYmICEoY2hpbGQgaW5zdGFuY2VvZiBNZWRpYUxpc3QpKSB7Ci0JCQkJCWNoaWxkcmVuLmFkZChjaGlsZCk7Ci0JCQkJfQotCQkJCS8qCi0JCQkJICogUmVxdWlyZWQgdG8gY29ycmVjdGx5IGNvbm5lY3QgdGhlIHJlZnJlc2hpbmcgYmVoYXZpb3IgdG8KLQkJCQkgKiB0aGUgdHJlZQotCQkJCSAqLwotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJKChJTm9kZU5vdGlmaWVyKSBjaGlsZCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJfQotCQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBPYmplY3RbMF07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiB3aXRoIHRoZSBlbGVtZW50cyBiZWxvbmdpbmcgdG8gdGhlIHBhc3NlZAotCSAqIGVsZW1lbnQuIFRoZXNlIGVsZW1lbnRzIGNhbiBiZSBwcmVzZW50ZWQgYXMgcm93cyBpbiBhIHRhYmxlLCBpdGVtcyBpbiBhCi0JICogbGlzdCBldGMuCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gVGhlIHJvb3QgaXMgdXN1YWxseSBhbiBpbnN0YW5jZSBvZiBhbiBYTUxTdHJ1Y3R1cmVkTW9kZWwgaW4KLQkJLy8gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIGV4dHJhY3QgdGhlIGRvY3VtZW50LgotCi0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTW9kZWwpIHsKLQkJCUFycmF5TGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy8gaW50ZXJuYWxHZXRFbGVtZW50cyhvYmplY3QsIHYpOwotCQkJYWRkRWxlbWVudHMob2JqZWN0LCB2KTsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gdi50b0FycmF5KCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkvKgotCQkJCSAqIFJlcXVpcmVkIHRvIGNvcnJlY3RseSBjb25uZWN0IHRoZSByZWZyZXNoaW5nIGJlaGF2aW9yIHRvCi0JCQkJICogdGhlIHRyZWUKLQkJCQkgKi8KLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCSgoSU5vZGVOb3RpZmllcikgZWxlbWVudHNbaV0pLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UuIEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIG5vIGlucHV0IG9iamVjdCBpcyBzZXQKLQkgKiAgICAgICAgICAgIHRvIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJQ1NTSW1hZ2VIZWxwZXIgaGVscGVyID0gQ1NTSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCXJldHVybiBoZWxwZXIuZ2V0SW1hZ2UoQ1NTSW1hZ2VUeXBlLmdldEltYWdlVHlwZSgoSUNTU05vZGUpIGVsZW1lbnQpKTsKLQkJCS8vIEltYWdlIGltYWdlID0gZ2V0Q1NTTm9kZUltYWdlKGVsZW1lbnQpOwotCQkJLy8gcmV0dXJuIGltYWdlOwotCQkJLy8gcmV0dXJuIGdldEFkYXB0ZXIoZWxlbWVudCkuZ2V0TGFiZWxJbWFnZSgoSUNTU05vZGUpIGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dC4gRWxlbWVudCBjYW4KLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldCB0bwotCSAqICAgICAgICAgICAgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3QgZWxlbWVudCkgewotCQkvLyBUaGlzIHdhcyByZXR1cm5pbmcgbnVsbCwgb24gb2NjYXNpb24gLi4uIHByb2JhYmx5IHNob3VsZCBub3QgYmUsCi0JCS8vIGJ1dAotCQkvLyB0b29rIHRoZSBxdWljayBhbmQgZWFzeSB3YXkgb3V0IGZvciBub3cuIChkbXcgMy84LzAxKQotCi0JCVN0cmluZyByZXN1bHQgPSAiIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBtZWRpYVRleHQ7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCXN3aXRjaCAoKChJQ1NTTm9kZSkgZWxlbWVudCkuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgSUNTU05vZGUuU1RZTEVSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKElDU1NTdHlsZVJ1bGUpIGVsZW1lbnQpLmdldFNlbGVjdG9ycygpLmdldFN0cmluZygpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIDoKLQkJCQkJcmVzdWx0ID0gIkBmb250LWZhY2UiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5JTVBPUlRSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKENTU0ltcG9ydFJ1bGUpIGVsZW1lbnQpLmdldEhyZWYoKTsKLQkJCQkJbWVkaWFUZXh0ID0gZ2V0TWVkaWFUZXh0KChDU1NJbXBvcnRSdWxlKSBlbGVtZW50KTsKLQkJCQkJaWYgKG1lZGlhVGV4dCAhPSBudWxsICYmIDAgPCBtZWRpYVRleHQubGVuZ3RoKCkpIHsKLQkJCQkJCXJlc3VsdCArPSAiICgiICsgbWVkaWFUZXh0ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlBBR0VSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAiQHBhZ2UiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUgOgotCQkJCQlyZXN1bHQgPSAicHJvcGVydGllcyI7Ly8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlNUWUxFREVDTElURU1fTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIGVsZW1lbnQpLmdldFByb3BlcnR5TmFtZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLlBSSU1JVElWRVZBTFVFX05PREUgOgotCQkJCQlyZXN1bHQgPSAoKElDU1NQcmltaXRpdmVWYWx1ZSkgZWxlbWVudCkuZ2V0U3RyaW5nVmFsdWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICJAbWVkaWEiOy8vJE5PTi1OTFMtMSQKLQkJCQkJbWVkaWFUZXh0ID0gZ2V0TWVkaWFUZXh0KChJQ1NTTWVkaWFSdWxlKSBlbGVtZW50KTsKLQkJCQkJaWYgKG1lZGlhVGV4dCAhPSBudWxsICYmIDAgPCBtZWRpYVRleHQubGVuZ3RoKCkpIHsKLQkJCQkJCXJlc3VsdCArPSAiICgiICsgbWVkaWFUZXh0ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIElDU1NOb2RlLkNIQVJTRVRSVUxFX05PREUgOgotCQkJCQlyZXN1bHQgPSAiQGNoYXJzZXQiOy8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ1NTTm9kZS5NRURJQUxJU1RfTk9ERSA6Ci0JCQkJCXJlc3VsdCA9ICgoTWVkaWFMaXN0KSBlbGVtZW50KS5nZXRNZWRpYVRleHQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8gaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkvLyBJQ1NTTm9kZSBub2RlID0gKChJQ1NTTm9kZSllbGVtZW50KTsKLQkJLy8gcmVzdWx0ID0gZ2V0QWRhcHRlcihlbGVtZW50KS5nZXRMYWJlbFRleHQoKElDU1NOb2RlKSBlbGVtZW50KTsKLQkJLy8gfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcmVudCBmb3IgdGhlIGdpdmVuIGVsZW1lbnQuIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIHRoYXQgdGhlIHBhcmVudCBjYW4ndCBiZSBjb21wdXRlZC4gSW4KLQkgKiB0aGlzIGNhc2UgdGhlIHRyZWUgdmlld2VyIGNhbid0IGV4cGFuZCBhIGdpdmVuIG5vZGUgY29ycmVjdGx5IGlmCi0JICogcmVxdWVzdGVkLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBub2RlID0gKChJQ1NTTm9kZSkgb2JqZWN0KS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUpIHsKLQkJCQkvKgotCQkJCSAqIFJlcXVpcmVkIHRvIGFsc28gY29ycmVjdGx5IGNvbm5lY3Qgc3R5bGUgZGVjbGFyYXRpb24gdG8gdGhlCi0JCQkJICogcmVmcmVzaGluZyBiZWhhdmlvciBpbiB0aGUgdHJlZQotCQkJCSAqLwotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkoKElOb2RlTm90aWZpZXIpIG5vZGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCX0KLQkJCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGlsZHJlbi4KLQkgKiBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gcmV0dXJuIGdldEFkYXB0ZXIob2JqZWN0KS5oYXNDaGlsZHJlbigoSUNTU05vZGUpIG9iamVjdCk7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJLyoKLQkJCSAqIFJlcXVpcmVkIHRvIGNvcnJlY3RseSBjb25uZWN0IHRoZSByZWZyZXNoaW5nIGJlaGF2aW9yIHRvIHRoZQotCQkJICogdHJlZQotCQkJICovCi0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NTdHlsZURlY2xJdGVtKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChJQ1NTTm9kZSkgb2JqZWN0KS5oYXNDaGlsZE5vZGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRFbGVtZW50cyhPYmplY3QgZWxlbWVudCwgQXJyYXlMaXN0IHYpIHsKLQotCQlJQ1NTTm9kZSBub2RlOwotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoSUNTU01vZGVsKSBlbGVtZW50OwotCQkJSUNTU0RvY3VtZW50IGRvYyA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQlub2RlID0gZG9jLmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoKElDU1NOb2RlKSBlbGVtZW50KS5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuOwotCi0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ1NTUnVsZSkgewotCQkJCXYuYWRkKG5vZGUpOwotCQkJfQotCi0JCQlub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRNZWRpYVRleHQoQ1NTUnVsZSBydWxlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJQ1NTTm9kZSBjaGlsZCA9IChydWxlICE9IG51bGwpID8gKChJQ1NTTm9kZSkgcnVsZSkuZ2V0Rmlyc3RDaGlsZCgpIDogbnVsbDsKLQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gKChNZWRpYUxpc3QpIGNoaWxkKS5nZXRNZWRpYVRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmJjYzRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MgZXh0ZW5kcyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTKCkgewotCQl0aGlzKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IENTU05vZGVBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBzaW5nbGV0b25BZGFwdGVyOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEyYzJjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuQ29tYm9MaXN0OwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgY2xhc3Mgb25seSBjb250YWlucyBoZWxwZXIgbWV0aG9kcyB0aGF0IHlvdSBzaG91bGQKLSAqICAgICAgICAgICAgIGFjdHVhbGx5IGltcGxlbWVudCB5b3Vyc2VsZi4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9ORSA9IENTU1VJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJY29tYm8uYWRkKG5hbWUsIGlkKTsKLQkJfQotCQljb21iby5zb3J0QnlLZXkoMSk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDhkMDYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3RPblByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGluc3RlYWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSB7Ci0KLQlwcml2YXRlIGZpbmFsIGludCBOX0NTU19QUk9GSUxFID0gMDsKLQotCi0KLQlwdWJsaWMgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQludW1iZXJPZkNvbWJvID0gMTsKLQkJbnVtQ29scyA9IDI7Ci0JCW51bVJvd3MgPSAxOwotCQljb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZVtzdXBlci5udW1iZXJPZkNvbWJvXTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKGNvbWJvW05fQ1NTX1BST0ZJTEVdKTsKLQkJaWYgKGNvbWJvW05fQ1NTX1BST0ZJTEVdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX0NTU19QUk9GSUxFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2V0dGluZ3NQYWdlR1VJKCkgewotCi0JCWludCB0eXBlID0gKChJUmVzb3VyY2UpIGdldEVsZW1lbnQoKSkuZ2V0VHlwZSgpOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgSVJlc291cmNlLkZJTEUgOgotCQkJCS8vY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZUNTU0NvbWJvQm94KCk7Ci0JCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwcm9wZXJ0eVBhZ2UsIElIZWxwQ29udGV4dElkcy5DU1NfQ09OVEVOVF9TRVRUSU5HU19IRUxQSUQpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgRklMRSIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHZhbHVlSW5Db21ibywgaW50IGluZGV4KSB7Ci0KLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBDU1NDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU5vbmVQcm9wZXJ0eShpbnQgaW5kZXgpIHsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gZGVsZXRlTm9uZVByb3BlcnR5KCkgaW4gY2xhc3MgQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9DU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ2NWZhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ1NTQ29udGVudFByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDU1NXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRUxFQ1RfTk9ORSA9IENTU1VJTWVzc2FnZXMuVUlfbm9uZTsKLQotCXByaXZhdGUgQ29tYm8gZlByb2ZpbGVDb21ibzsKLQlwcml2YXRlIExpc3QgZlByb2ZpbGVJZHM7Ci0KLQlwdWJsaWMgQ1NTV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzdXBlcigpOwotCQlzZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLkNTU0NvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHByb3BlcnR5UGFnZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDIpOwotCi0JCS8vIENTUyBQcm9maWxlIGNvbnRyb2wKLQkJVGV4dCBsYW5ndWFnZUxhYmVsID0gbmV3IFRleHQocHJvcGVydHlQYWdlLCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQ1NTQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzEpOwotCQlmUHJvZmlsZUNvbWJvID0gbmV3IENvbWJvKHByb3BlcnR5UGFnZSwgU1dULlJFQURfT05MWSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCwgR3JpZERhdGEuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlmUHJvZmlsZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcG9wdWxhdGVWYWx1ZXMoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuQ1NTX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEKTsKLQkJcmV0dXJuIHByb3BlcnR5UGFnZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHJlc291cmNlIHRoaXMgcHJvcGVydGllcyBwYWdlIGlzIGZvcgotCSAqIAotCSAqIEByZXR1cm4gSVJlc291cmNlIGZvciB0aGlzIHByb3BlcnRpZXMgcGFnZSBvciBudWxsIGlmIHRoZXJlIGlzIG5vCi0JICogICAgICAgICBJUmVzb3VyY2UKLQkgKi8KLQlwcml2YXRlIElSZXNvdXJjZSBnZXRSZXNvdXJjZSgpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQkJaWYgKGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbnQgaW5kZXggPSAwOwotCQlTdHJpbmcgcHJvZmlsZSA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChwcm9maWxlICE9IG51bGwgJiYgcHJvZmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8qCi0JCQkgKiBJZiBpdGVtIGlzIGFscmVhZHkgcGFydCBvZiBjb21ibywgc2VsZWN0IGl0LiBPdGhlcndpc2UsIHNlbGVjdAotCQkJICogbm9uZS4KLQkJCSAqLwotCQkJaW5kZXggPSBmUHJvZmlsZUlkcy5pbmRleE9mKHByb2ZpbGUpOwotCQl9Ci0JCWluZGV4ID0gaW5kZXggPj0gMCA/IGluZGV4IDogMDsKLQkJZlByb2ZpbGVDb21iby5zZWxlY3QoaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwb3B1bGF0ZVZhbHVlcygpIHsKLQkJZlByb2ZpbGVJZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIGFkZCBub25lIGZpcnN0Ci0JCWZQcm9maWxlQ29tYm8uYWRkKFNFTEVDVF9OT05FKTsKLQkJZlByb2ZpbGVJZHMuYWRkKG51bGwpOwotCi0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaSA9IHJlZy5nZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IHByb2ZpbGUuZ2V0UHJvZmlsZUlEKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2ZpbGUuZ2V0UHJvZmlsZU5hbWUoKTsKLQkJCWZQcm9maWxlQ29tYm8uYWRkKG5hbWUpOwotCQkJZlByb2ZpbGVJZHMuYWRkKGlkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJaW50IGluZGV4ID0gZlByb2ZpbGVDb21iby5pbmRleE9mKFNFTEVDVF9OT05FKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmUHJvZmlsZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlpbnQgaW5kZXggPSBmUHJvZmlsZUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpbmRleCA+IC0xKSB7Ci0JCQlTdHJpbmcgaWQgPSAoU3RyaW5nKSBmUHJvZmlsZUlkcy5nZXQoaW5kZXgpOwotCQkJaWYgKGlkID09IG51bGwgfHwgaWQubGVuZ3RoKCkgPT0gMCB8fCBpZC5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVF9OT05FKSkgewotCQkJCS8vIGlmIG5vbmUsIHVzZSBudWxsCi0JCQkJaWQgPSBudWxsOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlDU1NDb250ZW50UHJvcGVydGllcy5zZXRQcm9wZXJ0eShDU1NDb250ZW50UHJvcGVydGllcy5DU1NfUFJPRklMRSwgZ2V0UmVzb3VyY2UoKSwgaWQpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIG1heWJlIGluIGZ1dHVyZSwgbGV0IHVzZXIga25vdyB0aGVyZSB3YXMgYSBwcm9ibGVtIHNhdmluZwotCQkJCS8vIGZpbGUKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnBlcmZvcm1PaygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBBY3Rpb25DU1NEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjFhZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkNTU0RlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkNsZWFudXBQcm9jZXNzb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLS8qKgotICogQ2xlYW51cCBhY3Rpb24gZGVsZWdhdGUgZm9yIENTUyBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIENsZWFudXBBY3Rpb25DU1NEZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGZDbGVhbnVwUHJvY2Vzc29yOwotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElBY3Rpb24gYWN0aW9uLCBJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJZkVkaXRvciA9IHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBudWxsaW5nIG91dCBqdXN0IGluIGNhc2UKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZDbGVhbnVwUHJvY2Vzc29yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KENTU1VJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKENTU1VJTWVzc2FnZXMuQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChJQWN0aW9uIGFjdGlvbiwgRXZlbnQgZXZlbnQpIHsKLQkJcnVuKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCWZpbmFsIElUZXh0RWRpdG9yIGVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCURpYWxvZyBjbGVhbnVwRGlhbG9nID0gbmV3IENsZWFudXBEaWFsb2dDU1MoZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nLm9wZW4oKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvLyBzZXR1cCBydW5uYWJsZQotCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciA9IGdldENsZWFudXBQcm9jZXNzb3IoKTsKLQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpIHsKLQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQl0cnkgewotCQkJCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKG1vZGVsKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluYWxseSB7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfTsKLQotCQkJCS8vIFRPRE86IG1ha2UgaW5kZXBlbmRlbnQgb2YgJ21vZGVsJy4KLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgU1NFVUlNZXNzYWdlcy5DbGVhbnVwX0RvY3VtZW50X1VJXywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZwotCQkJCQkJLy8gbW9kZWwgY2hhbmdlCi0JCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCQkJLy8gcnVuCi0JCQkJCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShmRWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLmdldERpc3BsYXkoKSwgcnVubmFibGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcKLQkJCQkJCS8vIG1vZGVsCi0JCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCi0JCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJbW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMsIHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCkgewotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3IgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29yID0gbmV3IENsZWFudXBQcm9jZXNzb3JDU1MoKTsKLQotCQlyZXR1cm4gZkNsZWFudXBQcm9jZXNzb3I7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0NTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0NTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzFjMjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0L3VpL0NsZWFudXBEaWFsb2dDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DU1NDbGVhbnVwU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNsZWFudXAuQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi1wdWJsaWMgY2xhc3MgQ2xlYW51cERpYWxvZ0NTUyBleHRlbmRzIERpYWxvZyB7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW1iZWRkZWRDU1M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uSWRlbnRDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25JZGVudENhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveFF1b3RlVmFsdWVzOwotCXByb3RlY3RlZCBCdXR0b24gZkNoZWNrQm94Rm9ybWF0U291cmNlOwotCi0JLyoqCi0JICogQ1NTQ2xlYW51cERpYWxvZyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnRTaGVsbAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGwKLQkgKi8KLQlwdWJsaWMgQ2xlYW51cERpYWxvZ0NTUyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlCi0JICovCi0JcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChpc0VtYmVkZGVkQ1NTKCkpCi0JCQlnZXRTaGVsbCgpLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5DU1NfQ2xlYW51cF9VSV8pOwotCQllbHNlCi0JCQlnZXRTaGVsbCgpLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5DbGVhbnVwX1VJXyk7Ci0KLQkJQ29tcG9zaXRlIHBhbmVsID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQlwYW5lbC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhbmVsLCBJSGVscENvbnRleHRJZHMuQ1NTX0NMRUFOVVBfSEVMUElEKTsKLQotCQkvLyBDb252ZXJ0IGlkZW50IGNhc2UKLQkJLy8gQUNDOiBHcm91cCByYWRpbyBidXR0b25zIHRvZ2V0aGVyIHNvIGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQkvLwkJTGFiZWwgaWRlbnRDYXNlTGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OVUxMKTsKLQkJLy8JCWlkZW50Q2FzZUxhYmVsLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiSWRlbnRpZmllcl9jYXNlX19VSV8iKSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQgPSAiSWRlbnRpZmllciBjYXNlOiIKLQkJLy8JCUNhbnZhcyBpZGVudENhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCUdyb3VwIGlkZW50Q2FzZSA9IG5ldyBHcm91cChwYW5lbCwgU1dULk5VTEwpOwotCQlpZGVudENhc2Uuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLklkZW50aWZpZXJfY2FzZV9fVUlfKTsKLQkJR3JpZExheW91dCBoTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJaWRlbnRDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlQXNpcyA9IG5ldyBCdXR0b24oaWRlbnRDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlciA9IG5ldyBCdXR0b24oaWRlbnRDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25JZGVudENhc2VMb3dlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKGlkZW50Q2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0KLQkJLy8gQ29udmVydCBwcm9wZXJ0eSBuYW1lIGNhc2UKLQkJLy8gQUNDOiBHcm91cCByYWRpbyBidXR0b25zIHRvZ2V0aGVyIHNvIGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQkvLwkJTGFiZWwgcHJvcE5hbWVDYXNlTGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OVUxMKTsKLQkJLy8JCXByb3BOYW1lQ2FzZUxhYmVsLnNldFRleHQoUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiUHJvcGVydHlfbmFtZV9jYXNlX19VSV8iKSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQgPSAiUHJvcGVydHkgbmFtZSBjYXNlOiIKLQkJLy8JCUNhbnZhcyBwcm9wTmFtZUNhc2UgPSBuZXcgQ2FudmFzKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCUdyb3VwIHByb3BOYW1lQ2FzZSA9IG5ldyBHcm91cChwYW5lbCwgU1dULk5VTEwpOwotCQlwcm9wTmFtZUNhc2Uuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByb3BlcnR5X25hbWVfY2FzZV9fVUlfKTsKLQkJaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCXByb3BOYW1lQ2FzZS5zZXRMYXlvdXQoaExheW91dCk7Ci0JCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMgPSBuZXcgQnV0dG9uKHByb3BOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlQXNpcy5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQXNfaXNfVUlfKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlTG93ZXIgPSBuZXcgQnV0dG9uKHByb3BOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uUHJvcE5hbWVDYXNlTG93ZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkxvd2VyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihwcm9wTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZVVwcGVyLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5VcHBlcl9VSV8pOwotCi0JCS8vIENvbnZlcnQgcHJvcGVydHkgVmFsdWUgY2FzZQotCQkvLyBBQ0M6IEdyb3VwIHJhZGlvIGJ1dHRvbnMgdG9nZXRoZXIgc28gYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCS8vCQlMYWJlbCBwcm9wVmFsdWVDYXNlTGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OVUxMKTsKLQkJLy8JCXByb3BWYWx1ZUNhc2VMYWJlbC5zZXRUZXh0KFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlByb3BlcnR5X3ZhbHVlX2Nhc2VfX1VJXyIpKTsKLQkJLy8gLy8kTk9OLU5MUy0xJCA9ICJQcm9wZXJ0eSB2YWx1ZSBjYXNlOiIKLQkJLy8JCUNhbnZhcyBwcm9wVmFsdWVDYXNlID0gbmV3IENhbnZhcyhwYW5lbCwgU1dULk5VTEwpOwotCQlHcm91cCBwcm9wVmFsdWVDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCXByb3BWYWx1ZUNhc2Uuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByb3BlcnR5X3ZhbHVlX2Nhc2VfX1VJXyk7Ci0JCWhMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQloTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQlwcm9wVmFsdWVDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUFzaXMgPSBuZXcgQnV0dG9uKHByb3BWYWx1ZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VBc2lzLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5Bc19pc19VSV8pOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlTG93ZXIgPSBuZXcgQnV0dG9uKHByb3BWYWx1ZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VMb3dlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTG93ZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihwcm9wVmFsdWVDYXNlLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlVXBwZXIuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlVwcGVyX1VJXyk7Ci0KLQkJaWYgKCFpc0VtYmVkZGVkQ1NTKCkpIHsKLQkJCS8vIENvbnZlcnQgc2VsZWN0b3IgdGFnIGNhc2UKLQkJCS8vIEFDQzogR3JvdXAgcmFkaW8gYnV0dG9ucyB0b2dldGhlciBzbyBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJCS8vCQkJTGFiZWwgc2VsZWN0b3JUYWdDYXNlTGFiZWwgPSBuZXcgTGFiZWwocGFuZWwsIFNXVC5OVUxMKTsKLQkJCS8vCQkJc2VsZWN0b3JUYWdDYXNlTGFiZWwuc2V0VGV4dChSZXNvdXJjZUhhbmRsZXIuZ2V0U3RyaW5nKCJTZWxlY3Rvcl90YWdfbmFtZV9jYXNlX19VSV8iKSk7Ci0JCQkvLyAvLyROT04tTkxTLTEkID0gIlNlbGVjdG9yIHRhZyBuYW1lIGNhc2U6IgotCQkJLy8JCQlDYW52YXMgc2VsZWN0b3JUYWdDYXNlID0gbmV3IENhbnZhcyhwYW5lbCwgU1dULk5VTEwpOwotCQkJR3JvdXAgc2VsZWN0b3JUYWdDYXNlID0gbmV3IEdyb3VwKHBhbmVsLCBTV1QuTlVMTCk7Ci0JCQlzZWxlY3RvclRhZ0Nhc2Uuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlNlbGVjdG9yX3RhZ19uYW1lX2Nhc2VfX1VJXyk7Ci0JCQloTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCQlzZWxlY3RvclRhZ0Nhc2Uuc2V0TGF5b3V0KGhMYXlvdXQpOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcyA9IG5ldyBCdXR0b24oc2VsZWN0b3JUYWdDYXNlLCBTV1QuUkFESU8pOwotCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcy5zZXRUZXh0KENTU1VJTWVzc2FnZXMuQXNfaXNfVUlfKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihzZWxlY3RvclRhZ0Nhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VMb3dlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTG93ZXJfVUlfKTsKLQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZVVwcGVyID0gbmV3IEJ1dHRvbihzZWxlY3RvclRhZ0Nhc2UsIFNXVC5SQURJTyk7Ci0JCQlmUmFkaW9CdXR0b25TZWxlY3RvclRhZ0Nhc2VVcHBlci5zZXRUZXh0KENTU1VJTWVzc2FnZXMuVXBwZXJfVUlfKTsKLQkJfQotCi0JCS8vIFF1b3RlIGF0dHJpYnV0ZSB2YWx1ZXMKLQkJZkNoZWNrQm94UXVvdGVWYWx1ZXMgPSBuZXcgQnV0dG9uKHBhbmVsLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hRdW90ZVZhbHVlcy5zZXRUZXh0KENTU1VJTWVzc2FnZXMuUXVvdGVfdmFsdWVzX1VJXyk7Ci0KLQkJaWYgKCFpc0VtYmVkZGVkQ1NTKCkpIHsKLQkJCS8vIEZvcm1hdCBzb3VyY2UKLQkJCWZDaGVja0JveEZvcm1hdFNvdXJjZSA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5DSEVDSyk7Ci0JCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkZvcm1hdF9zb3VyY2VfVUlfKTsKLQkJfQotCi0JCXNldENsZWFudXBPcHRpb25zKCk7Ci0KLQkJcmV0dXJuIHBhbmVsOwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtYmVkZGVkQ1NTKCkgewotCQlyZXR1cm4gZW1iZWRkZWRDU1M7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJdXBkYXRlQ2xlYW51cE9wdGlvbnMoKTsKLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldENsZWFudXBPcHRpb25zKCkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IENTU0NsZWFudXBTdHJhdGVneUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCQlpZiAoZlJhZGlvQnV0dG9uSWRlbnRDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZSBpZiAoc3RneS5nZXRJZGVudENhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uSWRlbnRDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvbklkZW50Q2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMgIT0gbnVsbCkgewotCQkJaWYgKHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UgaWYgKHN0Z3kuZ2V0UHJvcE5hbWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LkxPV0VSKQotCQkJCWZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUxvd2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UKLQkJCQlmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRQcm9wVmFsdWVDYXNlKCkgPT0gQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKQotCQkJCWZSYWRpb0J1dHRvblByb3BWYWx1ZUNhc2VVcHBlci5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlIGlmIChzdGd5LmdldFByb3BWYWx1ZUNhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UKLQkJCQlmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RneS5nZXRTZWxlY3RvclRhZ0Nhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZSBpZiAoc3RneS5nZXRTZWxlY3RvclRhZ0Nhc2UoKSA9PSBDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpCi0JCQkJZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlTG93ZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJZWxzZQotCQkJCWZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJaWYgKGZDaGVja0JveFF1b3RlVmFsdWVzICE9IG51bGwpCi0JCQlmQ2hlY2tCb3hRdW90ZVZhbHVlcy5zZXRTZWxlY3Rpb24oc3RneS5pc1F1b3RlVmFsdWVzKCkpOwotCi0JCWlmIChmQ2hlY2tCb3hGb3JtYXRTb3VyY2UgIT0gbnVsbCkKLQkJCWZDaGVja0JveEZvcm1hdFNvdXJjZS5zZXRTZWxlY3Rpb24oc3RneS5pc0Zvcm1hdFNvdXJjZSgpKTsKLQotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmV3RW1iZWRkZWRDU1MKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbWJlZGRlZENTUyhib29sZWFuIG5ld0VtYmVkZGVkQ1NTKSB7Ci0JCWVtYmVkZGVkQ1NTID0gbmV3RW1iZWRkZWRDU1M7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNsZWFudXBPcHRpb25zKCkgewotCQlDU1NDbGVhbnVwU3RyYXRlZ3kgc3RneSA9IENTU0NsZWFudXBTdHJhdGVneUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCQlpZiAoZlJhZGlvQnV0dG9uSWRlbnRDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uSWRlbnRDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRJZGVudENhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKTsKLQkJCWVsc2UgaWYgKGZSYWRpb0J1dHRvbklkZW50Q2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0SWRlbnRDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRJZGVudENhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpOwotCQl9Ci0KLQkJaWYgKGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZUFzaXMgIT0gbnVsbCkgewotCQkJaWYgKGZSYWRpb0J1dHRvblByb3BOYW1lQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0UHJvcE5hbWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5VUFBFUik7Ci0JCQllbHNlIGlmIChmUmFkaW9CdXR0b25Qcm9wTmFtZUNhc2VMb3dlci5nZXRTZWxlY3Rpb24oKSkKLQkJCQlzdGd5LnNldFByb3BOYW1lQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpOwotCQkJZWxzZQotCQkJCXN0Z3kuc2V0UHJvcE5hbWVDYXNlKENTU0NsZWFudXBTdHJhdGVneS5BU0lTKTsKLQkJfQotCi0JCWlmIChmUmFkaW9CdXR0b25Qcm9wVmFsdWVDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0UHJvcFZhbHVlQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuVVBQRVIpOwotCQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uUHJvcFZhbHVlQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0UHJvcFZhbHVlQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuTE9XRVIpOwotCQkJZWxzZQotCQkJCXN0Z3kuc2V0UHJvcFZhbHVlQ2FzZShDU1NDbGVhbnVwU3RyYXRlZ3kuQVNJUyk7Ci0JCX0KLQotCQlpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlQXNpcyAhPSBudWxsKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uU2VsZWN0b3JUYWdDYXNlVXBwZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQkJc3RneS5zZXRTZWxlY3RvclRhZ0Nhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LlVQUEVSKTsKLQkJCWVsc2UgaWYgKGZSYWRpb0J1dHRvblNlbGVjdG9yVGFnQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKQotCQkJCXN0Z3kuc2V0U2VsZWN0b3JUYWdDYXNlKENTU0NsZWFudXBTdHJhdGVneS5MT1dFUik7Ci0JCQllbHNlCi0JCQkJc3RneS5zZXRTZWxlY3RvclRhZ0Nhc2UoQ1NTQ2xlYW51cFN0cmF0ZWd5LkFTSVMpOwotCQl9Ci0KLQkJaWYgKGZDaGVja0JveFF1b3RlVmFsdWVzICE9IG51bGwpCi0JCQlzdGd5LnNldFF1b3RlVmFsdWVzKGZDaGVja0JveFF1b3RlVmFsdWVzLmdldFNlbGVjdGlvbigpKTsKLQotCQlpZiAoZkNoZWNrQm94Rm9ybWF0U291cmNlICE9IG51bGwpCi0JCQlzdGd5LnNldEZvcm1hdFNvdXJjZShmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCS8vIHNhdmUgdGhlc2UgdmFsdWVzIHRvIHByZWZlcmVuY2VzCi0JCSgoQ1NTQ2xlYW51cFN0cmF0ZWd5SW1wbCkgc3RneSkuc2F2ZU9wdGlvbnMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9DU1NFZGl0b3JQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9lZGl0b3IvQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMjM2NjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9DU1NFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgQ1NTIFNvdXJjZSBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIENTU0VkaXRvclBsdWdpbkltYWdlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TT1JUID0gImljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NUWUxFU0hFRVQgPSAiaWNvbnMvZnVsbC9vYmoxNi9zdHlsZXNoZWV0LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1JVTEVfQ0hBUlNFVCA9ICJpY29ucy9mdWxsL29iajE2L2NoYXJzZXRfcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX0ZPTlRGQUNFID0gImljb25zL2Z1bGwvb2JqMTYvZm9udGZhY2VfcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX0lNUE9SVCA9ICJpY29ucy9mdWxsL29iajE2L2xpbmtfcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX01FRElBID0gImljb25zL2Z1bGwvb2JqMTYvbWVkaWFfcnVsZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9SVUxFX1BBR0UgPSAiaWNvbnMvZnVsbC9vYmoxNi9wYWdlX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9TVFlMRSA9ICJpY29ucy9mdWxsL29iajE2L3N0eWxlX3J1bGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUlVMRV9VTktOT1dOID0gImljb25zL2Z1bGwvb2JqMTYvdW5rbm93bl9ydWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfQ0xBU1MgPSAiaWNvbnMvZnVsbC9vYmoxNi9jbGFzc19zZWxlY3Rvci5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9JRCA9ICJpY29ucy9mdWxsL29iajE2L2lkX3NlbGVjdG9yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1NFTEVDVE9SX1BTRVVETyA9ICJpY29ucy9mdWxsL29iajE2L3BzZXVkby5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TRUxFQ1RPUl9UQUcgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWdfc2VsZWN0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfTElOSyA9ICJpY29ucy9mdWxsL29iajE2L2xpbmtfc2VsZWN0b3IuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfU0VMRUNUT1JfREVGQVVMVCA9ICJpY29ucy9mdWxsL29iajE2L3RhZ19zZWxlY3Rvci5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1ZBTFVFX0ZVTkNUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfZnVuY3Rpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVkFMVUVfTlVNQkVSID0gImljb25zL2Z1bGwvb2JqMTYvY3NzX3Byb3BlcnR5dmFsdWVfdW5pdC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WQUxVRV9TVFJJTkcgPSAiaWNvbnMvZnVsbC9vYmoxNi9jc3NfcHJvcGVydHl2YWx1ZV9pZGVudGlmaWVyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfQVVSQUwgPSAiaWNvbnMvZnVsbC9vYmoxNi9hdXJhbF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9CT1ggPSAiaWNvbnMvZnVsbC9vYmoxNi9ib3htb2RlbF9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQgPSAiaWNvbnMvZnVsbC9vYmoxNi9jb2xiYWNrX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0NPTlRFTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9jb250ZW50X3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0ZPTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9mb250X3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX1BBR0UgPSAiaWNvbnMvZnVsbC9vYmoxNi9wYWdlZG1lZGlhX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX1RBQkxFUyA9ICJpY29ucy9mdWxsL29iajE2L3RhYmxlX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX1RFWFQgPSAiaWNvbnMvZnVsbC9vYmoxNi90ZXh0X3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX1VJID0gImljb25zL2Z1bGwvb2JqMTYvdWlfcHJvcHMuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0FURUdPUllfVklTVUFMID0gImljb25zL2Z1bGwvb2JqMTYvdmlzdWFsX3Byb3BzLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NBVEVHT1JZX0RFRkFVTFQgPSAiaWNvbnMvZnVsbC9vYmoxNi9vdGhlcl9wcm9wcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9URU1QTEFURSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX1dJWkJBTl9ORVdDU1NGSUxFID0gImljb25zL2Z1bGwvd2l6YmFuL25ld2Nzc2ZpbGVfd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwYzRmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIENTUyBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBDU1NVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIENTUyBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1MgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIENTUyBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIENTUyBTb3VyY2UgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMTEiOyAvLyROT04tTkxTLTEkCi0JLy8gQ1NTIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAxMiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDU1MgVGVtcGxhdGUgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1NTX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMTMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgQ2xlYW51cCBkaWFsb2cKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDU1NfQ0xFQU5VUF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEzMDAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBDU1MgQ29udGVudCBTZXR0aW5ncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19DT05URU5UX1NFVFRJTkdTX0hFTFBJRCA9IFBSRUZJWCArICJtaXNjMDE4MCI7IC8vJE5PTi1OTFMtMSQKLQkKLQkvLyBDU1MgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENTU19ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEID0gUFJFRklYICsgImNzc3cwMDEwIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YjRkMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5pbWFnZTsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBDU1NJbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ1NTSW1hZ2VIZWxwZXIgZkluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIHNpbmdsZXRvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENTU0ltYWdlSGVscGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDU1NJbWFnZUhlbHBlcigpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7CS8vIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBNYXAgZlR5cGVNYXAgPSBudWxsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDU1NJbWFnZUhlbHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDU1NVSVBsdWdpbi5JRCwgcmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgPT0gbnVsbCkgewotCQkJZGVzYyA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlID0gZGVzYy5jcmVhdGVJbWFnZSgpOwotCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDU1NVSVBsdWdpbi5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIGJ5IHR5cGUKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoQ1NTSW1hZ2VUeXBlIHR5cGUpIHsKLQkJaWYgKGZUeXBlTWFwID09IG51bGwpIHsKLQkJCWZUeXBlTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU1RZTEVTSEVFVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU1RZTEVTSEVFVCk7Ci0KLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9DSEFSU0VULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX0NIQVJTRVQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5SVUxFX0ZPTlRGQUNFLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9SVUxFX0ZPTlRGQUNFKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9JTVBPUlQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1JVTEVfSU1QT1JUKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9NRURJQSwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9NRURJQSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfUEFHRSwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9QQUdFKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuUlVMRV9TVFlMRSwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9TVFlMRSk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlJVTEVfVU5LTk9XTiwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUlVMRV9VTktOT1dOKTsKLQotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9DTEFTUywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfQ0xBU1MpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9JRCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfSUQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5TRUxFQ1RPUl9QU0VVRE8sIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NFTEVDVE9SX1BTRVVETyk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX1RBRywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfVEFHKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuU0VMRUNUT1JfTElOSywgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU0VMRUNUT1JfTElOSyk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlNFTEVDVE9SX0RFRkFVTFQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1NFTEVDVE9SX0RFRkFVTFQpOwotCi0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlZBTFVFX0ZVTkNUSU9OLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9WQUxVRV9GVU5DVElPTik7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLlZBTFVFX05VTUJFUiwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVkFMVUVfTlVNQkVSKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuVkFMVUVfU1RSSU5HLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9WQUxVRV9TVFJJTkcpOwotCi0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0FVUkFMLCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9BVVJBTCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0JPWCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfQk9YKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5ELCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9DT0xPUkFOREJBQ0tHUk9VTkQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9DT05URU5ULCBDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DQVRFR09SWV9DT05URU5UKTsKLQkJCWZUeXBlTWFwLnB1dChDU1NJbWFnZVR5cGUuQ0FURUdPUllfRk9OVCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfRk9OVCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1BBR0UsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX1BBR0UpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9UQUJMRVMsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX1RBQkxFUyk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX1RFWFQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX1RFWFQpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9VSSwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0FURUdPUllfVUkpOwotCQkJZlR5cGVNYXAucHV0KENTU0ltYWdlVHlwZS5DQVRFR09SWV9WSVNVQUwsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX1ZJU1VBTCk7Ci0JCQlmVHlwZU1hcC5wdXQoQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0RFRkFVTFQsIENTU0VkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NBVEVHT1JZX0RFRkFVTFQpOwotCQl9Ci0JCXJldHVybiBnZXRJbWFnZSgoU3RyaW5nKSBmVHlwZU1hcC5nZXQodHlwZSkpOwotCX0KLQotCS8qKgotCSAqIGJ5IHJlbGF0aXZlIHBhdGgoZnJvbSBoZXJlKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL2ltYWdlL0NTU0ltYWdlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjgzNWNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9pbWFnZS9DU1NJbWFnZVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuaW1hZ2U7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1Qcm9wZXJ0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2VsZWN0b3JMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU2ltcGxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NDaGFyc2V0UnVsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTRm9udEZhY2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NJbXBvcnRSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NNZWRpYVJ1bGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1BhZ2VSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NQcmltaXRpdmVWYWx1ZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVSdWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NWYWx1ZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NJbWFnZVR5cGUgewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZk5hbWU7Ci0KLQlwcml2YXRlIENTU0ltYWdlVHlwZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLmZOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZk5hbWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgU1RZTEVTSEVFVCA9IG5ldyBDU1NJbWFnZVR5cGUoIlNUWUxFU0hFRVQiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9DSEFSU0VUID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9DSEFSU0VUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBSVUxFX0ZPTlRGQUNFID0gbmV3IENTU0ltYWdlVHlwZSgiUlVMRV9GT05URkFDRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9JTVBPUlQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJSVUxFX0lNUE9SVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9NRURJQSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfTUVESUEiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFJVTEVfUEFHRSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfUEFHRSIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgUlVMRV9TVFlMRSA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfU1RZTEUiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFJVTEVfVU5LTk9XTiA9IG5ldyBDU1NJbWFnZVR5cGUoIlJVTEVfVU5LTk9XTiIpOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9DTEFTUyA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX0NMQVNTIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9JRCA9IG5ldyBDU1NJbWFnZVR5cGUoIlNFTEVDVE9SX0lEIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9ERUZBVUxUID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfREVGQVVMVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgU0VMRUNUT1JfUFNFVURPID0gbmV3IENTU0ltYWdlVHlwZSgiU0VMRUNUT1JfUFNFVURPIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBTRUxFQ1RPUl9UQUcgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9UQUciKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFNFTEVDVE9SX0xJTksgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJTRUxFQ1RPUl9MSU5LIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFZBTFVFX0ZVTkNUSU9OID0gbmV3IENTU0ltYWdlVHlwZSgiVkFMVUVfRlVOQ1RJT04iKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIFZBTFVFX05VTUJFUiA9IG5ldyBDU1NJbWFnZVR5cGUoIlZBTFVFX05VTUJFUiIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgVkFMVUVfU1RSSU5HID0gbmV3IENTU0ltYWdlVHlwZSgiVkFMVUVfU1RSSU5HIik7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0FVUkFMID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQVVSQUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0JPWCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX0JPWCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQ09MT1JBTkRCQUNLR1JPVU5EIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9DT05URU5UID0gbmV3IENTU0ltYWdlVHlwZSgiQ0FURUdPUllfQ09OVEVOVCIpOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBDU1NJbWFnZVR5cGUgQ0FURUdPUllfRk9OVCA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX0ZPTlQiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1BBR0UgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9QQUdFIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9UQUJMRVMgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9UQUJMRVMiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX1RFWFQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9URVhUIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9VSSA9IG5ldyBDU1NJbWFnZVR5cGUoIkNBVEVHT1JZX1VJIik7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIENTU0ltYWdlVHlwZSBDQVRFR09SWV9WSVNVQUwgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9WSVNVQUwiKTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ1NTSW1hZ2VUeXBlIENBVEVHT1JZX0RFRkFVTFQgPSBuZXcgQ1NTSW1hZ2VUeXBlKCJDQVRFR09SWV9ERUZBVUxUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIGJ5IG5vZGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENTU0ltYWdlVHlwZSBnZXRJbWFnZVR5cGUoSUNTU05vZGUgbm9kZSkgewotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NDaGFyc2V0UnVsZSkgewotCQkJaW1hZ2VUeXBlID0gUlVMRV9DSEFSU0VUOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NGb250RmFjZVJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfRk9OVEZBQ0U7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU0ltcG9ydFJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfSU1QT1JUOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NNZWRpYVJ1bGUpIHsKLQkJCWltYWdlVHlwZSA9IFJVTEVfTUVESUE7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1BhZ2VSdWxlKSB7Ci0JCQlpbWFnZVR5cGUgPSBSVUxFX1BBR0U7Ci0JCX0gZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENTU1N0eWxlUnVsZSkgewotCQkJaW1hZ2VUeXBlID0gZ2V0SW1hZ2VUeXBlKCgoSUNTU1N0eWxlUnVsZSkgbm9kZSkuZ2V0U2VsZWN0b3JzKCkpOwotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NTdHlsZURlY2xhcmF0aW9uKSB7Ci0JCQlJQ1NTTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRJbWFnZVR5cGUocGFyZW50KTsKLQkJCX0KLQkJfSBlbHNlIGlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pIHsKLQkJCVN0cmluZyBuYW1lID0gKChJQ1NTU3R5bGVEZWNsSXRlbSkgbm9kZSkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0JCQlJQ1NTRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoZG9jICE9IG51bGwpID8gZG9jLmdldE1vZGVsKCkgOiBudWxsOwotCQkJQ1NTTWV0YU1vZGVsRmluZGVyIGZpbmRlciA9IENTU01ldGFNb2RlbEZpbmRlci5nZXRJbnN0YW5jZSgpOwotCQkJQ1NTTWV0YU1vZGVsIG1ldGFNb2RlbCA9IGZpbmRlci5maW5kTWV0YU1vZGVsRm9yKG1vZGVsKTsKLQkJCS8vIGlzIGZvbnQtZmFjZSBydWxlID8KLQkJCUlDU1NOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50IGluc3RhbmNlb2YgQ1NTRm9udEZhY2VSdWxlKSB7Ci0JCQkJCWltYWdlVHlwZSA9IENTU0ltYWdlVHlwZS5DQVRFR09SWV9GT05UOwotCQkJCX0KLQkJCX0KLQkJCWlmIChpbWFnZVR5cGUgPT0gbnVsbCkgewotCQkJCUNTU01NUHJvcGVydHkgcHJvcCA9IG5ldyBDU1NNZXRhTW9kZWxVdGlsKG1ldGFNb2RlbCkuZ2V0UHJvcGVydHkobmFtZSk7Ci0JCQkJaWYgKHByb3AgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgY2F0ZWdvcnkgPSBwcm9wLmdldEF0dHJpYnV0ZSgiY2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpbWFnZVR5cGUgPSBnZXRJbWFnZVR5cGUoY2F0ZWdvcnkpOwotCQkJCX0KLQkJCQlpZiAoaW1hZ2VUeXBlID09IG51bGwpIHsKLQkJCQkJaW1hZ2VUeXBlID0gQ1NTSW1hZ2VUeXBlLkNBVEVHT1JZX0RFRkFVTFQ7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBDU1NWYWx1ZSkgewotCQkJc3dpdGNoICgoKENTU1ZhbHVlKSBub2RlKS5nZXRDc3NWYWx1ZVR5cGUoKSkgewotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX05VTUJFUiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEVSQ0VOVEFHRSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRU1TIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19FWFMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1BYIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19DTSA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfTU0gOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0lOIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19QVCA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUEMgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0RFRyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19HUkFEIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19NUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfUyA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSFogOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0tIWiA6Ci0JCQkJY2FzZSBDU1NQcmltaXRpdmVWYWx1ZS5DU1NfRElNRU5TSU9OIDoKLQkJCQljYXNlIElDU1NQcmltaXRpdmVWYWx1ZS5DU1NfSU5URUdFUiA6Ci0JCQkJY2FzZSBJQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0hBU0ggOgotCQkJCQlpbWFnZVR5cGUgPSBWQUxVRV9OVU1CRVI7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0FUVFIgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX0NPVU5URVIgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JFQ1QgOgotCQkJCWNhc2UgQ1NTUHJpbWl0aXZlVmFsdWUuQ1NTX1JHQkNPTE9SIDoKLQkJCQljYXNlIENTU1ByaW1pdGl2ZVZhbHVlLkNTU19VUkkgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19GT1JNQVQgOgotCQkJCWNhc2UgSUNTU1ByaW1pdGl2ZVZhbHVlLkNTU19MT0NBTCA6Ci0JCQkJCWltYWdlVHlwZSA9IFZBTFVFX0ZVTkNUSU9OOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJaW1hZ2VUeXBlID0gVkFMVUVfU1RSSU5HOwotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZShJQ1NTU2VsZWN0b3JMaXN0IHNlbGVjdG9yTGlzdCkgewotCQlpZiAoc2VsZWN0b3JMaXN0ID09IG51bGwgfHwgc2VsZWN0b3JMaXN0LmdldExlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBTRUxFQ1RPUl9ERUZBVUxUOwotCQl9Ci0JCUNTU0ltYWdlVHlwZSBpbWFnZVR5cGUgPSBudWxsOwotCQlpbnQgblNlbGVjdG9ycyA9IHNlbGVjdG9yTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuU2VsZWN0b3JzOyBpKyspIHsKLQkJCUNTU0ltYWdlVHlwZSBjYW5kaWRhdGUgPSBnZXRJbWFnZVR5cGUoc2VsZWN0b3JMaXN0LmdldFNlbGVjdG9yKGkpKTsKLQkJCWlmIChpbWFnZVR5cGUgPT0gbnVsbCkgewotCQkJCWltYWdlVHlwZSA9IGNhbmRpZGF0ZTsKLQkJCX0gZWxzZSBpZiAoaW1hZ2VUeXBlICE9IGNhbmRpZGF0ZSkgewotCQkJCWltYWdlVHlwZSA9IG51bGw7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKGltYWdlVHlwZSA9PSBudWxsKSA/IFNFTEVDVE9SX0RFRkFVTFQgOiBpbWFnZVR5cGU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDU1NJbWFnZVR5cGUgZ2V0SW1hZ2VUeXBlKElDU1NTZWxlY3RvciBzZWxlY3RvcikgewotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gU0VMRUNUT1JfREVGQVVMVDsKLQkJaWYgKHNlbGVjdG9yID09IG51bGwgfHwgc2VsZWN0b3IuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIGltYWdlVHlwZTsKLQkJfQotCQlJQ1NTU2VsZWN0b3JJdGVtIGl0ZW0gPSBzZWxlY3Rvci5nZXRJdGVtKHNlbGVjdG9yLmdldExlbmd0aCgpIC0gMSk7Ci0JCWlmIChpdGVtLmdldEl0ZW1UeXBlKCkgPT0gSUNTU1NlbGVjdG9ySXRlbS5TSU1QTEUpIHsKLQkJCUlDU1NTaW1wbGVTZWxlY3RvciBzcyA9IChJQ1NTU2ltcGxlU2VsZWN0b3IpIGl0ZW07Ci0JCQlpZiAoMCA8IHNzLmdldE51bU9mSURzKCkpIHsKLQkJCQlpbWFnZVR5cGUgPSBTRUxFQ1RPUl9JRDsKLQkJCX0gZWxzZSBpZiAoMCA8IHNzLmdldE51bU9mQ2xhc3NlcygpKSB7Ci0JCQkJaW1hZ2VUeXBlID0gU0VMRUNUT1JfQ0xBU1M7Ci0JCQl9IGVsc2UgaWYgKDAgPCBzcy5nZXROdW1PZlBzZXVkb05hbWVzKCkpIHsKLQkJCQlpbWFnZVR5cGUgPSBTRUxFQ1RPUl9QU0VVRE87Ci0JCQl9IGVsc2UgewotCQkJCWltYWdlVHlwZSA9IFNFTEVDVE9SX1RBRzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW1hZ2VUeXBlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgQ1NTSW1hZ2VUeXBlIGdldEltYWdlVHlwZShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKGZDYXRlZ29yeU1hcCA9PSBudWxsKSB7Ci0JCQlmQ2F0ZWdvcnlNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZkNhdGVnb3J5TWFwLnB1dCgiYXVyYWwiLCBDQVRFR09SWV9BVVJBTCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImJveCIsIENBVEVHT1JZX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImNvbG9yYW5kYmFja2dyb3VuZCIsIENBVEVHT1JZX0NPTE9SQU5EQkFDS0dST1VORCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoImNvbnRlbnQiLCBDQVRFR09SWV9DT05URU5UKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgiZm9udCIsIENBVEVHT1JZX0ZPTlQpOyAvLyROT04tTkxTLTEkCi0JCQlmQ2F0ZWdvcnlNYXAucHV0KCJwYWdlIiwgQ0FURUdPUllfUEFHRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInRhYmxlcyIsIENBVEVHT1JZX1RBQkxFUyk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInRleHQiLCBDQVRFR09SWV9URVhUKTsgLy8kTk9OLU5MUy0xJAotCQkJZkNhdGVnb3J5TWFwLnB1dCgidWkiLCBDQVRFR09SWV9VSSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZDYXRlZ29yeU1hcC5wdXQoInZpc3VhbCIsIENBVEVHT1JZX1ZJU1VBTCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlDU1NJbWFnZVR5cGUgaW1hZ2VUeXBlID0gKENTU0ltYWdlVHlwZSkgZkNhdGVnb3J5TWFwLmdldChjYXRlZ29yeSk7Ci0JCXJldHVybiAoaW1hZ2VUeXBlID09IG51bGwpID8gQ0FURUdPUllfREVGQVVMVCA6IGltYWdlVHlwZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBNYXAgZkNhdGVnb3J5TWFwID0gbnVsbDsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWI0NzEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgQ1NTIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NVSVByZWZlcmVuY2VJbml0aWFsaXplciBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyIHsKLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkvLyBDU1MgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNjMsIDEyNywgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFLCBzdHlsZVZhbHVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg0MiwgMCwgMjI1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNjMsIDk1LCAxOTEpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDEyNywgMCwgMTI3KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg0MiwgMCwgMjI1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuVVJJLCBzdHlsZVZhbHVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTiwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04sIHN0eWxlVmFsdWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDE5MSwgNjMsIDYzKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SLCBzdHlsZVZhbHVlKTsKLQkJCi0JCS8vIHNldCBkZWZhdWx0IG5ldyBjc3MgZmlsZSB0ZW1wbGF0ZSB0byB1c2UgaW4gbmV3IGZpbGUgd2l6YXJkCi0JCS8qCi0JCSAqIE5lZWQgdG8gZmluZCB0ZW1wbGF0ZSBuYW1lIHRoYXQgZ29lcyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgaWQgKG5hbWUKLQkJICogbWF5IGNoYW5nZSBmb3IgZGlmZmVybnQgbGFuZ3VhZ2UpCi0JCSAqLwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVTdG9yZSgpLmZpbmRUZW1wbGF0ZUJ5SWQoIm9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGVtcGxhdGVzLm5ld2NzcyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KENTU1VJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvQ1NTVUlQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiNzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9DU1NVSVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByZWZlcmVuY2Uga2V5cyBmb3IgQ1NTIFVJCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NVSVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBDU1NVSVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBpbnN0YW5jZQotCX0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIGN1c3RvbWl6ZWQgdGVtcGxhdGVzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTX0tFWSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmN1c3RvbV90ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gbmV3IENTUyBmaWxlIHdpemFyZC4KLQkgKiBUZW1wbGF0ZSBuYW1lIGlzIHN0b3JlZCBpbnN0ZWFkIG9mIHRlbXBsYXRlIGlkIGJlY2F1c2UgdXNlci1jcmVhdGVkCi0JICogdGVtcGxhdGVzIGRvIG5vdCBoYXZlIHRlbXBsYXRlIGlkcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1RFTVBMQVRFX05BTUUgPSAibmV3RmlsZVRlbXBsYXRlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NDb2xvclBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NDb2xvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRmOTEyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTQ29sb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0NTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0eWxlZFRleHRDb2xvclBpY2tlcjsKLQotcHVibGljIGNsYXNzIENTU0NvbG9yUGFnZSBleHRlbmRzIEFic3RyYWN0Q29sb3JQYWdlIHsKLQotCS8qKgotCSAqIFNldCB1cCBhbGwgdGhlIHN0eWxlIHByZWZlcmVuY2Uga2V5cyBpbiB0aGUgb3ZlcmxheSBzdG9yZQotCSAqLwotCXByb3RlY3RlZCBPdmVybGF5S2V5W10gY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpIHsKLQkJQXJyYXlMaXN0IG92ZXJsYXlLZXlzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUFycmF5TGlzdCBzdHlsZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWluaXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQkJSXRlcmF0b3IgaSA9IHN0eWxlTGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuU1RSSU5HLCAoU3RyaW5nKSBpLm5leHQoKSkpOwotCQl9Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkoKEdyaWREYXRhKSBwYWdlQ29tcG9uZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLQotCQlzdXBlci5jcmVhdGVDb250ZW50cyhwYWdlQ29tcG9uZW50KTsKLQotCQkvLyBhc3NpZ25pbmcgb25lIGhlbHAgZm9yIHdob2xlIGdyb3VwCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFnZUNvbXBvbmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19QUkVGV0VCWF9TVFlMRVNfSEVMUElEKTsKLQotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZUNvbG9yaW5nQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbG9yaW5nQ29tcG9zaXRlID0gc3VwZXIuY3JlYXRlQ29sb3JpbmdDb21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBhc3NpZ25pbmcgb25lIGhlbHAgZm9yIHdob2xlIGdyb3VwCi0JCXJldHVybiBjb2xvcmluZ0NvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTYW1wbGVUZXh0IG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvclNhbXBsZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0U3R5bGVNYXAKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5ULCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NETywgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DREMsIElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0xCUkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNVUkxZX0JSQUNFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0lNUE9SVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0ZPTlRfRkFDRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0hBUlNFVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLkFUTUFSS19SVUxFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JELCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NUUklORywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VSSSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElVTSwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUFfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRV9TRUxFQ1RPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX1VOSVZFUlNBTCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9DTEFTUywgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfSUQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ09NQklOQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfU0VQQVJBVE9SLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfU1RBUlQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9QUk9QRVJUWSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9JREVOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVIsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9QQVJFTlRIRVNJU19DTE9TRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0gsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fREVMSU1JVEVSLCBJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfVU5LTk9XTiwgSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb25zCi0JICogICAgICAgICAgICBqYXZhLnV0aWwuRGljdGlvbmFyeQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlsaWdodGluZyB0eXBlcwotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvck5vcm1hbCk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yQXRtYXJrUnVsZSk7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUiwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU2VsZWN0b3IpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvck1lZGlhKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckNvbW1lbnQpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yUHJvcGVydHlOYW1lKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JQcm9wZXJ0eVZhbHVlKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yVXJpKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLlNUUklORywgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0NvbG9yU3RyaW5nKTsvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JDb2xvbik7Ly8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ29sb3JTZW1pQ29sb24pOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckN1cmx5QnJhY2UpOy8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNDU1MuRVJST1IsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9Db2xvckVycm9yKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGxpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5BcnJheUxpc3QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuQ09MT04pOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNDU1MuU0VNSV9DT0xPTik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUik7Ci0JfQotCi0JLyoqCi0JICogc2V0dXBQaWNrZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcikgewotCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcGlja2VyLnNldFBhcnNlcihtbWFuYWdlci5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUykuZ2V0UGFyc2VyKCkpOwotCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJcGlja2VyLnNldENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlwaWNrZXIuc2V0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCXBpY2tlci5zZXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU0ZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ3OWYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZTsKLQotcHVibGljIGNsYXNzIENTU0ZpbGVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlIHsKLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUNTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBzY3JvbGxlZENvbXBvc2l0ZSA9IGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjcm9sbGVkQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuQ1NTX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0JCQotCQlzZXRTaXplKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzY3JvbGxlZENvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUyk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JDcmVhdGluZ09yU2F2aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwZXJmb3JtRGVmYXVsdHNGb3JDcmVhdGluZ09yU2F2aW5nR3JvdXAoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQ3JlYXRpbmdHcm91cCgpOwotCi0gICAgICAgIHVwZGF0ZUFwcGx5QnV0dG9uKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdG9yZVZhbHVlc0ZvckNyZWF0aW5nT3JTYXZpbmdHcm91cCgpOwotCQlzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1NvdXJjZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNhYjIyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ1NTU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU3Bpbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkNTU0NvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NTb3VyY2VQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCS8vIENvbnRlbnQgQXNzaXN0Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQXV0b1Byb3Bvc2U7Ci0JcHJvdGVjdGVkIExhYmVsIGZBdXRvUHJvcG9zZUxhYmVsOwotCi0JcHJvdGVjdGVkIFRleHQgZkF1dG9Qcm9wb3NlVGV4dDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmSWRlbnRMb3dlcjsKLQkvLyBjYXNlIG9mIG91dHB1dCBjaGFyYWN0ZXIKLQkvLyBjYXNlIG9mIGlkZW50aWZpZXIKLQlwcm90ZWN0ZWQgQnV0dG9uIGZJZGVudFVwcGVyOwotCXByaXZhdGUgU3Bpbm5lciBmSW5kZW50YXRpb25TaXplOwotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1NwYWNlczsKLQkKLQlwcml2YXRlIEJ1dHRvbiBmSW5kZW50VXNpbmdUYWJzOwotCS8vIEZvcm1hdHRpbmcKLQlwcm90ZWN0ZWQgTGFiZWwgZkxpbmVXaWR0aExhYmVsOwotCQotCXByb3RlY3RlZCBUZXh0IGZMaW5lV2lkdGhUZXh0OwotCS8vIHByb2hpYml0IHdyYXBwaW5nIGlmIHN0eWxlIGF0dHJpYnV0ZQotCXByb3RlY3RlZCBCdXR0b24gZk5vd3JhcEF0dHI7Ci0JLy8gb25lIHByb3BlcnR5IHBlciBvbmUgbGluZQotCXByb3RlY3RlZCBCdXR0b24gZlByb3BlcnR5UGVyTGluZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wTmFtZUxvd2VyOwotCi0JLy8gY2FzZSBvZiBwcm9wZXJ0eSBuYW1lCi0JcHJvdGVjdGVkIEJ1dHRvbiBmUHJvcE5hbWVVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZQcm9wVmFsdWVMb3dlcjsKLQkvLyBjYXNlIG9mIHByb3BlcnR5IHZhbHVlCi0JcHJvdGVjdGVkIEJ1dHRvbiBmUHJvcFZhbHVlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmU3BsaXRNdWx0aUF0dHJzOwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9JTkRFTlRBVElPTl9TSVpFID0gMTY7Ci0JcHJpdmF0ZSBmaW5hbCBpbnQgTUlOX0lOREVOVEFUSU9OX1NJWkUgPSAwOwotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuQ1NTX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQpOwotCi0JCWNyZWF0ZUNvbnRlbnRzRm9yRm9ybWF0dGluZ0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yQ29udGVudEFzc2lzdEdyb3VwKGNvbXBvc2l0ZSk7Ci0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDb250ZW50QXNzaXN0R3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBub3QgY29udGVudCBhc3Npc3QsIGJ1dCBwcmVmZXJyZWQgY2FzZQotCQlHcm91cCBjYXNlR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDMpOwotCQljYXNlR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZUdyb3VwKTsKLQotCQkvLyB1c2UgZ3JvdXAgZm9yIHJhZGlvIGJ1dHRvbnMgc28gdGhhdCBhc3NvY2lhdGVkIGxhYmVsIGlzIHJlYWQKLQkJR3JvdXAgaWRlbnRHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCWlkZW50R3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZUlkZW50KTsKLQkJZklkZW50VXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihpZGVudEdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZUlkZW50VXBwZXIpOwotCQlmSWRlbnRMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKGlkZW50R3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9DYXNlSWRlbnRMb3dlcik7Ci0KLQkJLy8gdXNlIGdyb3VwIGZvciByYWRpbyBidXR0b25zIHNvIHRoYXQgYXNzb2NpYXRlZCBsYWJlbCBpcyByZWFkCi0JCUdyb3VwIHByb3BOYW1lR3JvdXAgPSBjcmVhdGVHcm91cChjYXNlR3JvdXAsIDEpOwotCQlwcm9wTmFtZUdyb3VwLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZSk7Ci0JCWZQcm9wTmFtZVVwcGVyID0gY3JlYXRlUmFkaW9CdXR0b24ocHJvcE5hbWVHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VQcm9wTmFtZVVwcGVyKTsKLQkJZlByb3BOYW1lTG93ZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihwcm9wTmFtZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BOYW1lTG93ZXIpOwotCi0JCS8vIHVzZSBncm91cCBmb3IgcmFkaW8gYnV0dG9ucyBzbyB0aGF0IGFzc29jaWF0ZWQgbGFiZWwgaXMgcmVhZAotCQlHcm91cCBwcm9wVmFsdWVHcm91cCA9IGNyZWF0ZUdyb3VwKGNhc2VHcm91cCwgMSk7Ci0JCXByb3BWYWx1ZUdyb3VwLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VQcm9wVmFsdWUpOwotCQlmUHJvcFZhbHVlVXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihwcm9wVmFsdWVHcm91cCwgQ1NTVUlNZXNzYWdlcy5QcmVmc0xhYmVsX0Nhc2VQcm9wVmFsdWVVcHBlcik7Ci0JCWZQcm9wVmFsdWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKHByb3BWYWx1ZUdyb3VwLCBDU1NVSU1lc3NhZ2VzLlByZWZzTGFiZWxfQ2FzZVByb3BWYWx1ZUxvd2VyKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBmb3JtYXR0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQlmb3JtYXR0aW5nR3JvdXAuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLkZvcm1hdHRpbmdfVUlfKTsKLQotCQlmTGluZVdpZHRoTGFiZWwgPSBjcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuTGluZV93aWR0aF9fVUlfKTsKLQkJZkxpbmVXaWR0aFRleHQgPSBuZXcgVGV4dChmb3JtYXR0aW5nR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlnRGF0YS53aWR0aEhpbnQgPSAyNTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWZMaW5lV2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCWZQcm9wZXJ0eVBlckxpbmUgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9XcmFwcGluZ0luc2VydExpbmVCcmVhayk7Ci0JCSgoR3JpZERhdGEpIGZQcm9wZXJ0eVBlckxpbmUuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJZk5vd3JhcEF0dHIgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIENTU1VJTWVzc2FnZXMuUHJlZnNMYWJlbF9XcmFwcGluZ1dpdGhvdXRBdHRyKTsKLQkJKChHcmlkRGF0YSkgZk5vd3JhcEF0dHIuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQotCQlmSW5kZW50VXNpbmdUYWJzID0gY3JlYXRlUmFkaW9CdXR0b24oZm9ybWF0dGluZ0dyb3VwLCBDU1NVSU1lc3NhZ2VzLkluZGVudF91c2luZ190YWJzXyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1RhYnMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZJbmRlbnRVc2luZ1NwYWNlcyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGZvcm1hdHRpbmdHcm91cCwgQ1NTVUlNZXNzYWdlcy5JbmRlbnRfdXNpbmdfc3BhY2VzKTsKLQkJKChHcmlkRGF0YSkgZkluZGVudFVzaW5nU3BhY2VzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkKLQkJY3JlYXRlTGFiZWwoZm9ybWF0dGluZ0dyb3VwLCBDU1NVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemUpOwotCQlmSW5kZW50YXRpb25TaXplID0gbmV3IFNwaW5uZXIoZm9ybWF0dGluZ0dyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlmSW5kZW50YXRpb25TaXplLnNldExheW91dERhdGEoZ2QpOwotCQlmSW5kZW50YXRpb25TaXplLnNldFRvb2xUaXBUZXh0KENTU1VJTWVzc2FnZXMuSW5kZW50YXRpb25fc2l6ZV90aXApOwotCQlmSW5kZW50YXRpb25TaXplLnNldE1pbmltdW0oTUlOX0lOREVOVEFUSU9OX1NJWkUpOwotCQlmSW5kZW50YXRpb25TaXplLnNldE1heGltdW0oTUFYX0lOREVOVEFUSU9OX1NJWkUpOwotCQlmSW5kZW50YXRpb25TaXplLnNldEluY3JlbWVudCgxKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRQYWdlSW5jcmVtZW50KDQpOwotCQlmSW5kZW50YXRpb25TaXplLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjZG9HZXRQcmVmZXJlbmNlU3RvcmUoKQotCSAqLwotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUNTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gQ1NTQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0aWFsaXplVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JDb250ZW50QXNzaXN0R3JvdXAoKSB7Ci0JCS8vIG5vdCBjb250ZW50IGFzc2lzdCwgYnV0IHByZWZlcnJlZCBjYXNlCi0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQlmSWRlbnRVcHBlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZklkZW50TG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfSURFTlRJRklFUikgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWZQcm9wTmFtZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX05BTUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmUHJvcE5hbWVMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZlByb3BWYWx1ZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlByb3BWYWx1ZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChwcmVmcy5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCWZQcm9wZXJ0eVBlckxpbmUuc2V0U2VsZWN0aW9uKHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpKTsKLQkJZk5vd3JhcEF0dHIuc2V0U2VsZWN0aW9uKHByZWZzLmdldEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIpKTsKLQkJCi0JCWlmIChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpKSkgewotCQkJZkluZGVudFVzaW5nVGFicy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdTcGFjZXMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfSBlbHNlIHsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJCQotCQlmSW5kZW50YXRpb25TaXplLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlwZXJmb3JtRGVmYXVsdHNGb3JDb250ZW50QXNzaXN0R3JvdXAoKTsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCWZJZGVudFVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZklkZW50TG93ZXIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRJbnQoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX0lERU5USUZJRVIpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlmUHJvcE5hbWVVcHBlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZQcm9wTmFtZUxvd2VyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9OQU1FKSA9PSBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZlByb3BWYWx1ZVVwcGVyLnNldFNlbGVjdGlvbihwcmVmcy5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9QUk9QRVJUWV9WQUxVRSkgPT0gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZQcm9wVmFsdWVMb3dlci5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEludChDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfVkFMVUUpID09IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCWZMaW5lV2lkdGhUZXh0LnNldFRleHQocHJlZnMuZ2V0RGVmYXVsdFN0cmluZyhDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgpKTsKLQkJZlByb3BlcnR5UGVyTGluZS5zZXRTZWxlY3Rpb24ocHJlZnMuZ2V0RGVmYXVsdEJvb2xlYW4oQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19PTkVfUEVSX0xJTkUpKTsKLQkJZk5vd3JhcEF0dHIuc2V0U2VsZWN0aW9uKHByZWZzLmdldERlZmF1bHRCb29sZWFuKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfUFJPSElCSVRfV1JBUF9PTl9BVFRSKSk7Ci0JCQotCQlpZiAoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9IGVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQkJCi0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0SW50KENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdG9yZVZhbHVlc0ZvckZvcm1hdHRpbmdHcm91cCgpOwotCQlzdG9yZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzdG9yZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gbm90IGNvbnRlbnQgYXNzaXN0LCBidXQgcHJlZmVycmVkIGNhc2UKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuQ0FTRV9JREVOVElGSUVSLCAoZklkZW50VXBwZXIuZ2V0U2VsZWN0aW9uKCkpID8gQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUiA6IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkNBU0VfUFJPUEVSVFlfTkFNRSwgKGZQcm9wTmFtZVVwcGVyLmdldFNlbGVjdGlvbigpKSA/IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIgOiBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5DQVNFX1BST1BFUlRZX1ZBTFVFLCAoZlByb3BWYWx1ZVVwcGVyLmdldFNlbGVjdGlvbigpKSA/IENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIgOiBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCVByZWZlcmVuY2VzIHByZWZzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQlwcmVmcy5zZXRWYWx1ZShDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIGZMaW5lV2lkdGhUZXh0LmdldFRleHQoKSk7Ci0JCXByZWZzLnNldFZhbHVlKENTU0NvcmVQcmVmZXJlbmNlTmFtZXMuV1JBUFBJTkdfT05FX1BFUl9MSU5FLCBmUHJvcGVydHlQZXJMaW5lLmdldFNlbGVjdGlvbigpKTsKLQkJcHJlZnMuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5XUkFQUElOR19QUk9ISUJJVF9XUkFQX09OX0FUVFIsIGZOb3dyYXBBdHRyLmdldFNlbGVjdGlvbigpKTsKLQkJCi0JCWlmIChmSW5kZW50VXNpbmdUYWJzLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQik7Ci0JCX0gZWxzZSB7Ci0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBDU1NDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFKTsKLQkJfQotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFLCBmSW5kZW50YXRpb25TaXplLmdldFNlbGVjdGlvbigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9DU1NUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNmQzMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIENTUyB0ZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIENTU1RlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyBDU1NUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlDU1NVSVBsdWdpbiBjc3NVSVBsdWdpbiA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKTsKLQotCQlzZXRQcmVmZXJlbmNlU3RvcmUoY3NzVUlQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXRUZW1wbGF0ZVN0b3JlKGNzc1VJUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoY3NzVUlQbHVnaW4uZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaG93Rm9ybWF0dGVyU2V0dGluZygpIHsKLQkJLy8gdGVtcGxhdGUgZm9ybWF0dGluZyBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuQ1NTX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uQ1NTKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGVJRCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1MTA4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci0KLS8qKgotICogQ29udGFpbnMgYSBzZXQgb2YgcHJvamVjdGlvbiBtb2RlbCBhZGRpdGlvbnMvZGVsZXRpb25zL21vZGlmaWNhdGlvbnMKLSAqLwotY2xhc3MgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIGNoYW5nZSBOb2RlIHRvIElDU1NOb2RlCi0JcHJpdmF0ZSBJQ1NTTm9kZSBmTm9kZTsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmRGVsZXRpb25zOwotCXByaXZhdGUgTWFwIGZBZGRpdGlvbnM7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uW10gZk1vZGlmaWNhdGlvbnM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMoSUNTU05vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJZk5vZGUgPSBub2RlOwotCQlmRGVsZXRpb25zID0gZGVsZXRpb25zOwotCQlmQWRkaXRpb25zID0gYWRkaXRpb25zOwotCQlmTW9kaWZpY2F0aW9ucyA9IG1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE1hcCBnZXRBZGRpdGlvbnMoKSB7Ci0JCXJldHVybiBmQWRkaXRpb25zOwotCX0KLQotCXB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0RGVsZXRpb25zKCkgewotCQlyZXR1cm4gZkRlbGV0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldE1vZGlmaWNhdGlvbnMoKSB7Ci0JCXJldHVybiBmTW9kaWZpY2F0aW9uczsKLQl9Ci0KLQlwdWJsaWMgSUNTU05vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGY5ZTAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuY3NzLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiRcCi0KLQlwcml2YXRlIGNsYXNzIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4dGVuZHMgUHJvamVjdGlvbkFubm90YXRpb24gewotCQlwcml2YXRlIGJvb2xlYW4gZklzVmlzaWJsZSA9IGZhbHNlOyAvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQlwcml2YXRlIElDU1NOb2RlIGZOb2RlOwotCi0JCXB1YmxpYyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihJQ1NTTm9kZSBub2RlLCBib29sZWFuIGlzQ29sbGFwc2VkKSB7Ci0JCQlzdXBlcihpc0NvbGxhcHNlZCk7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgSUNTU05vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBmTm9kZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5vZGUoSUNTU05vZGUgbm9kZSkgewotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERvZXMgbm90IHBhaW50IGhpZGRlbiBhbm5vdGF0aW9ucy4gQW5ub3RhdGlvbnMgYXJlIGhpZGRlbiB3aGVuIHRoZXkKLQkJICogb25seSBzcGFuIG9uZSBsaW5lLgotCQkgKiAKLQkJICogQHNlZSBQcm9qZWN0aW9uQW5ub3RhdGlvbiNwYWludChvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0MsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGUpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHJlY3RhbmdsZSkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8qCi0JCQkgKiBvbmx5IG5lZWQgdG8gY2hlY2sgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZXhwYW5kZWQgYmVjYXVzZSBoaWRkZW4KLQkJCSAqIGFubm90YXRpb25zIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZ2l2ZW4gdGhlIGNoYW5jZSB0bwotCQkJICogY29sbGFwc2UuCi0JCQkgKi8KLQkJCWlmICghaXNDb2xsYXBzZWQoKSkgewotCQkJCS8vIHdvcmtpbmcgd2l0aCByZWN0YW5nbGUsIHNvIGxpbmUgaGVpZ2h0Ci0JCQkJRm9udE1ldHJpY3MgbWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCQkJaWYgKG1ldHJpY3MgIT0gbnVsbCkgewotCQkJCQkvLyBkbyBub3QgZHJhdyBhbm5vdGF0aW9ucyB0aGF0IG9ubHkgc3BhbiBvbmUgbGluZSBhbmQKLQkJCQkJLy8gbWFyayB0aGVtIGFzIG5vdCB2aXNpYmxlCi0JCQkJCWlmICgocmVjdGFuZ2xlLmhlaWdodCAvIG1ldHJpY3MuZ2V0SGVpZ2h0KCkpIDw9IDEpIHsKLQkJCQkJCWZJc1Zpc2libGUgPSBmYWxzZTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZJc1Zpc2libGUgPSB0cnVlOwotCQkJc3VwZXIucGFpbnQoZ2MsIGNhbnZhcywgcmVjdGFuZ2xlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbiNtYXJrQ29sbGFwc2VkKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1hcmtDb2xsYXBzZWQoKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLy8gZG8gbm90IG1hcmsgY29sbGFwc2VkIGlmIGFubm90YXRpb24gaXMgbm90IHZpc2libGUKLQkJCWlmIChmSXNWaXNpYmxlKQotCQkJCXN1cGVyLm1hcmtDb2xsYXBzZWQoKTsKLQkJfQotCX0KLQotCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBmQWRhcHRlckZhY3Rvcnk7Ci0JcHJpdmF0ZSBNYXAgZlRhZ0Fubm90YXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSkgewotCQlmQWRhcHRlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihJQ1NTTm9kZSBub2RlKSB7Ci0JCVBvc2l0aW9uIHBvcyA9IG51bGw7Ci0JCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSAmJiBub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKHN0YXJ0ID49IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCQkvLyByZWdpb24tYmFzZWQKLQkJCQkvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uIGluY3JlYXNlIHdoZW4KLQkJCQkvLyBhZGQgbmV3bGluZQotCQkJCXBvcyA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyAvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gSVJlZ2lvbiBzdGFydExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBJUmVnaW9uIGVuZExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnRMaW5lUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBlbmRMaW5lUmVnaW9uLmdldE9mZnNldCgpICsKLQkJCQkvLyBlbmRMaW5lUmVnaW9uLmdldExlbmd0aCgpOwotCQkJCS8vIGlmIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0KLQkJCQkvLyBzdGFydE9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vCi0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIG5vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCByZWdpb24gaW5jcmVhc2UKLQkJCQkvLyAvLyB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpZiAoZW5kTGluZSArIDEgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkpIHsKLQkJCQkvLyBpbnQgb2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzdGFydExpbmUpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGVuZExpbmUgKyAxKTsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBudWxsLCB4KTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCQkvLyB9Ci0JCX0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGZvciBub2RlIGluIHRoZSBjdXJyZW50IGxpc3Qgb2YgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb25zIGZvciB0aGlzIGFkYXB0ZXIKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gVGFnUHJvamVjdGlvbkFubm90YXRpb24KLQkgKi8KLQlwcml2YXRlIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGdldEV4aXN0aW5nQW5ub3RhdGlvbihJQ1NTTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJSUNTU05vZGUgbiA9IGEuZ2V0Tm9kZSgpOwotCQkJCWlmIChub2RlLmVxdWFscyhuKSkgewotCQkJCQlhbm5vID0gYTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm87Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05vZGVQcm9qZWN0YWJsZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IHR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCQlpZiAodHlwZSA9PSBJQ1NTTm9kZS5TVFlMRVJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLlBBR0VSVUxFX05PREUgfHwgdHlwZSA9PSBJQ1NTTm9kZS5NRURJQVJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLklNUE9SVFJVTEVfTk9ERSB8fCB0eXBlID09IElDU1NOb2RlLkZPTlRGQUNFUlVMRV9OT0RFIHx8IHR5cGUgPT0gSUNTU05vZGUuQ0hBUlNFVFJVTEVfTk9ERSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIHdvcmthcm91bmQgZm9yIEJ1Zzg1MzQyIC0gU1RSVUNUUkVfQ0hBTkdFRCBpcyBuZXZlciBmaXJlZCBzbyBuZWVkCi0JCS8vIHRvIGxpc3RlbiBmb3IgZXZlcnkgQURELCBSRU1PVkUKLQkJLy8gaWYgKChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkgJiYgKG5vdGlmaWVyCi0JCS8vIGluc3RhbmNlb2YgSUNTU05vZGUpKSB7Ci0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgJiYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSUNTU05vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChJQ1NTTm9kZSkgbm90aWZpZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihJQ1NTTm9kZSBub2RlKSB7Ci0JCXVwZGF0ZUFkYXB0ZXIobm9kZSwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gb2YgYWxsIHRoZSBub2RlcyB0aGF0IGFyZSBjaGlsZHJlbiBvZgotCSAqIG5vZGUgYW5kIGFkZHMgYWxsIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgdG8gdmlld2VyIChmb3IgbmV3bHkgYWRkZWQKLQkgKiB2aWV3ZXJzKQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgdXBkYXRlQWRhcHRlcihJQ1NTTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSUNTU05vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAoY2hpbGROb2RlICE9IG51bGwpIHsKLQkJCQlQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24oY2hpbGROb2RlKTsKLQkJCQlpZiAobmV3UG9zICE9IG51bGwpIHsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ldyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihjaGlsZE5vZGUsIGZhbHNlKTsKLQkJCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXhpc3RpbmcgPSBnZXRFeGlzdGluZ0Fubm90YXRpb24oY2hpbGROb2RlKTsKLQkJCQkJaWYgKGV4aXN0aW5nID09IG51bGwpIHsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgZm9yIHRoaXMKLQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCXByb2plY3Rpb25Bbm5vdGF0aW9ucy5wdXQobmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBhZGQKLQkJCQkJCWFkZGl0aW9ucy5wdXQobmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbGwgYW5ub3RhdGlvbnMgZm9yIHRoaXMKLQkJCQkJCS8vIGFkYXB0ZXIKLQkJCQkJCXByb2plY3Rpb25Bbm5vdGF0aW9ucy5wdXQoZXhpc3RpbmcsIG5ld1Bvcyk7Ci0JCQkJCQkvLyByZW1vdmUgZnJvbSBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBkZWxldGUKLQkJCQkJCWZUYWdBbm5vdGF0aW9ucy5yZW1vdmUoZXhpc3RpbmcpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCi0JCQkvLyBpbiB0aGUgZW5kLCB3YW50IHRvIGRlbGV0ZSBhbnl0aGluZyBsZWZ0b3ZlciBpbiBvbGQgbGlzdCwgYWRkCi0JCQkvLyBldmVyeXRoaW5nIGluIGFkZGl0aW9ucywgYW5kIHVwZGF0ZSBldmVyeXRoaW5nIGluCi0JCQkvLyBwcm9qZWN0aW9uQW5ub3RhdGlvbnMKLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gb2xkTGlzdCA9IG51bGw7Ci0JCQlpZiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQlvbGRMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbltdIG1vZGlmeUxpc3QgPSBudWxsOwotCQkJaWYgKCFwcm9qZWN0aW9uQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJbW9kaWZ5TGlzdCA9IChQcm9qZWN0aW9uQW5ub3RhdGlvbltdKSBwcm9qZWN0aW9uQW5ub3RhdGlvbnMua2V5U2V0KCkudG9BcnJheShuZXcgUHJvamVjdGlvbkFubm90YXRpb25bMF0pOwotCQkJfQotCi0JCQkvLyBzcGVjaWZpY2FsbHkgYWRkIGFsbCBhbm5vdGF0aW9ucyB0byB2aWV3ZXIKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCAmJiAhcHJvamVjdGlvbkFubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCWZBZGFwdGVyRmFjdG9yeS5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgbnVsbCwgcHJvamVjdGlvbkFubm90YXRpb25zLCBudWxsLCB2aWV3ZXIpOwotCQkJfQotCi0JCQkvLyBvbmx5IHVwZGF0ZSB3aGVuIHRoZXJlIGlzIHNvbWV0aGluZyB0byB1cGRhdGUKLQkJCWlmICgob2xkTGlzdCAhPSBudWxsICYmIG9sZExpc3QubGVuZ3RoID4gMCkgfHwgKCFhZGRpdGlvbnMuaXNFbXB0eSgpKSB8fCAobW9kaWZ5TGlzdCAhPSBudWxsICYmIG1vZGlmeUxpc3QubGVuZ3RoID4gMCkpCi0JCQkJZkFkYXB0ZXJGYWN0b3J5LnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBvbGRMaXN0LCBhZGRpdGlvbnMsIG1vZGlmeUxpc3QpOwotCQl9Ci0KLQkJLy8gc2F2ZSBuZXcgbGlzdCBvZiBhbm5vdGF0aW9ucwotCQlmVGFnQW5ub3RhdGlvbnMgPSBwcm9qZWN0aW9uQW5ub3RhdGlvbnM7Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTdHJpbmcgbm9kZU5hbWUgPSBub2RlICE9IG51bGwgPyBub2RlLnRvU3RyaW5nKCkgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MudXBkYXRlQWRhcHRlciAoIiArIG5vZGVOYW1lICsgIik6IiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4YTI4NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLyoqCi0JICogTGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiBtb2RlbCBub2RlIGFkYXB0ZXIgZmFjdG9yeS4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZlByb2plY3Rpb25WaWV3ZXJzOwotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUygpIHsKLQkJdGhpcyhQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUy5jbGFzcyk7Ci0JfQotCi0JcHVibGljIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyhPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJc3VwZXIoYWRhcHRlcktleSk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTIGFkYXB0ZXIgPSBudWxsOwotCi0JCWlmICgoaXNBY3RpdmUoKSkgJiYgKHRhcmdldCBpbnN0YW5jZW9mIElDU1NOb2RlKSkgewotCQkJSUNTU05vZGUgbm9kZSA9IChJQ1NTTm9kZSkgdGFyZ2V0OwotCQkJc2hvcnQgdHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCS8vIG9ubHkgYWRkIGZvciB0b3Agc3R5bGVzaGVldCBub2RlCi0JCQlpZiAodHlwZSA9PSBJQ1NTTm9kZS5TVFlMRVNIRUVUX05PREUpIHsKLQkJCQlhZGFwdGVyID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTKHRoaXMpOwotCQkJCWFkYXB0ZXIudXBkYXRlQWRhcHRlcihub2RlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0cnVlIGlmIHRoaXMgZmFjdG9yeSBpcyBjdXJyZW50bHkgYWN0aXZlbHkgbWFuYWdpbmcgcHJvamVjdGlvbgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzQWN0aXZlKCkgewotCQlyZXR1cm4gKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsICYmICFmUHJvamVjdGlvblZpZXdlcnMuaXNFbXB0eSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBpZiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4KLQkgKiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICovCi0Jdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoSUNTU05vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMpIHsKLQkJcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIGRlbGV0aW9ucywgYWRkaXRpb25zLCBtb2RpZmljYXRpb25zLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBmb3IgYSBzcGVjaWZpYyBwcm9qZWN0aW9uIHZpZXdlciBpZgotCSAqIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LiBPdGhlcndpc2UsIHF1ZXVlcyB1cCB0aGUgY2hhbmdlcyB0byBiZSBhcHBsaWVkCi0JICogd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0Jdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoSUNTU05vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGNyZWF0ZSBhIGNoYW5nZSBvYmplY3QgZm9yIGxhdGVzdCBjaGFuZ2UgYW5kIGFkZCB0byBxdWV1ZQotCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UgPSBuZXcgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLmdldCh2aWV3ZXIpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBldmVyeSBwcm9qZWN0aW9udmlld2VyIGFuZCBjYWxsCi0JCS8vIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJCWluZm9zLnJlbW92ZSgpOwotCQkJfQotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB2aWV3ZXIgdG8gbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcyBmYWN0b3J5IGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHZpZXdlcidzIGRvY3VtZW50IGFuZCBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkgKiAgICAgICAgICAgIGFyZSBub3QgbnVsbAotCSAqLwotCXZvaWQgYWRkUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyByZW1vdmUgb2xkIGVudHJ5IGlmIGl0IGV4aXN0cwotCQlyZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0KLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyA9PSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIG5ldyBvYmplY3QgY29udGFpbmluZyBwcm9qZWN0aW9uIHZpZXdlciBhbmQgaXRzIGluZm8KLQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSBuZXcgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKHZpZXdlcik7Ci0JCWZQcm9qZWN0aW9uVmlld2Vycy5wdXQodmlld2VyLCBpbmZvKTsKLQkJaW5mby5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdmlld2VyIGZyb20gdGhlIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMKLQkgKiBmYWN0b3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3Qgb2Ygdmlld2VycwotCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMucmVtb3ZlKHZpZXdlcik7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkvLyBpZiByZW1vdmluZyBsYXN0IHByb2plY3Rpb24gdmlld2VyLCBjbGVhciBvdXQgZXZlcnl0aGluZwotCQkJaWYgKGZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1OGZkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGFsc28gbWFuYWdlcyB1cGRhdGluZwotICogdGhlIHZpZXdlcidzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotICovCi1jbGFzcyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb2N1bWVudCB0byBiZSBhd2FyZSBvZiB3aGVuIHRvIHVwZGF0ZSB0aGUgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyByZWdpc3RlciBhIHBvc3Qgbm90aWZpY2F0aW9uIHJlcGxhY2Ugc28gdGhhdCBwcm9qZWN0aW9uCi0JCQkvLyBhbm5vdGF0aW9uIG1vZGVsIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBhbGwgZG9jdW1lbnRDaGFuZ2VkCi0JCQkvLyBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uICYmIGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCQlpZiAoZkluZm8uaGFzQ2hhbmdlc1F1ZXVlZCgpKQotCQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbikgZG9jdW1lbnQpLnJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UodGhpcywgbmV3IFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW5mbykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXNzZW50aWFsbHkgYSBwb3N0IGRvY3VtZW50IGNoYW5nZWQgbGlzdGVuZXIgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYWZ0ZXIKLQkgKiBkb2N1bWVudGNoYW5nZWQgaGFzIGJlZW4gZmlyZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtKElEb2N1bWVudCBkb2N1bWVudCwgSURvY3VtZW50TGlzdGVuZXIgb3duZXIpIHsKLQkJCWZJbmZvLmFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjdXJyZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci0JLyoqCi0JICogRG9jdW1lbnQgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKgotCSAqIExpc3RlbmVyIHRvIGZQcm9qZWN0aW9uVmlld2VyJ3MgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGZEb2N1bWVudExpc3RlbmVyOwotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBkb2N1bWVudCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0RvY3VtZW50Q2hhbmdpbmcgPSBmYWxzZTsKLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24oUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJZkRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsID0gdmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKLQl9Ci0KLQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID09IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCX0KLQotCXZvaWQgc2V0SXNEb2N1bWVudENoYW5naW5nKGJvb2xlYW4gY2hhbmdpbmcpIHsKLQkJZklzRG9jdW1lbnRDaGFuZ2luZyA9IGNoYW5naW5nOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Q2hhbmdpbmcoKSB7Ci0JCXJldHVybiBmSXNEb2N1bWVudENoYW5naW5nOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIHBlbmRpbmcgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdG8gdGhlCi0JICogcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCXZvaWQgYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCkgewotCQlMaXN0IHF1ZXVlZENoYW5nZXMgPSBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpOwotCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcGVuZGluZyBhbm5vdGF0aW9uIGNoYW5nZXMgYW5kIGFwcGx5Ci0JCS8vIHRoZW0gdG8KLQkJLy8gdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCQl3aGlsZSAoIXF1ZXVlZENoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBjaGFuZ2VzID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKSBxdWV1ZWRDaGFuZ2VzLnJlbW92ZSgwKTsKLQkJCXRyeSB7Ci0JCQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwubW9kaWZ5QW5ub3RhdGlvbnMoY2hhbmdlcy5nZXREZWxldGlvbnMoKSwgY2hhbmdlcy5nZXRBZGRpdGlvbnMoKSwgY2hhbmdlcy5nZXRNb2RpZmljYXRpb25zKCkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgbG9nIGl0IGJlIGNvbnRpbnVlCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbm5vdGF0aW9uIGNoYW5nZXMgcXVldWVkIHVwLCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZXNRdWV1ZWQoKSB7Ci0JCXJldHVybiAhZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UpIHsKLQkJLyoKLQkJICogZnV0dXJlX1RPRE86IG1heWJlIGltcHJvdmUgYnkgY2hlY2tpbmcgaWYgYW5ub3RhdGlvbiBwcm9qZWN0aW9uCi0JCSAqIG1vZGVsIGNoYW5nZSBhbHJlYWR5IGV4aXN0cyBmb3Igbm9kZS4gaWYgc28sIHRocm93IG91dCBvbGQgY2hhbmdlLgotCQkgKi8KLQkJZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5hZGQobmV3Q2hhbmdlKTsKLQotCQkvLyBpZiBkb2N1bWVudCBpc24ndCBjaGFuZ2luZywgZ28gYWhlYWQgYW5kIGFwcGx5IGl0Ci0JCWlmICghaXNEb2N1bWVudENoYW5naW5nKCkpIHsKLQkJCWFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gYWRkIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWdldERvY3VtZW50KCkuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gcmVtb3ZlIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXREb2N1bWVudCgpLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGxpc3Qgb2YgcXVldWVkIGNoYW5nZXMgc2luY2UgaXQgbWF5IG5vIGxvbmdlcgotCQkvLyBiZSBhY2N1cmF0ZQotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzICE9IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcy5jbGVhcigpOwotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDk5MjIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci0KLS8qKgotICogVXBkYXRlcyB0aGUgcHJvamVjdGlvbiBtb2RlbCBvZiBhIHN0cnVjdHVyZWQgbW9kZWwgZm9yIENTUy4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLCBJUHJvamVjdGlvbkxpc3RlbmVyLCBJVGV4dElucHV0TGlzdGVuZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuY3NzLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiRcCi0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VyIGZWaWV3ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogSnVzdCBhZGQgYWRhcHRlciB0byB0b3Agc3R5bGVzaGVldCBub2RlLiBUaGlzIGFkYXB0ZXIgd2lsbCB0cmFjawotCSAqIGNoaWxkcmVuIGFkZGl0aW9uL2RlbGV0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBbGxBZGFwdGVycygpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJCQlJQ1NTTW9kZWwgY3NzTW9kZWwgPSAoSUNTU01vZGVsKSBzTW9kZWw7Ci0JCQkJCUlDU1NEb2N1bWVudCBjc3NEb2MgPSBjc3NNb2RlbC5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoY3NzRG9jIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBjc3NEb2M7Ci0JCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckNTUyBhZGFwdGVyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MuY2xhc3MpOwotCQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCWFkYXB0ZXIudXBkYXRlQWRhcHRlcihjc3NEb2MsIGZWaWV3ZXIpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8ganVzdCBjYWxsIGdldGFkYXB0ZXIgc28gdGhlIGFkYXB0ZXIgaXMgY3JlYXRlZAotCQkJCQkJCS8vIGFuZAotCQkJCQkJCS8vIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQKLQkJCQkJCQlub3RpZmllci5nZXRBZGFwdGVyRm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyQ1NTLmFkZEFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIHRvIHVzZSB3aXRoIHRoaXMgcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBnZXRBZGFwdGVyRmFjdG9yeShib29sZWFuIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUyBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MuY2xhc3MpICYmIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgbmV3RmFjdG9yeSA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUNTUykgZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJDU1MuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm92aWRlciB3aXRoIHRoZSBjb3JyZWN0IGRvY3VtZW50LiBBc3N1bWVzIHByb2plY3Rpb24KLQkgKiBpcyBlbmFibGVkLiAob3RoZXJ3aXNlLCBvbmx5IGluc3RhbGwgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gY2xlYXIgb3V0IG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkvLyBzZXQgcHJvamVjdGlvbiB2aWV3ZXIgb24gbmV3IGRvY3VtZW50J3MgYWRhcHRlciBmYWN0b3J5Ci0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlDU1MgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KHRydWUpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQotCQkJYWRkQWxsQWRhcHRlcnMoKTsKLQkJfQotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGUgYSBQcm9qZWN0aW9uVmlld2VyIHdpdGggdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHVuaW5zdGFsbCBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbGwgbmV3IHZpZXdlcgotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJdW5pbnN0YWxsKCk7Ci0JCX0KLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeShmYWxzZSk7Ci0JCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCWZhY3RvcnkucmVtb3ZlUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBhbGwgYW5ub3RhdGlvbnMKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpCi0JCQlmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5yZW1vdmVBbGxBbm5vdGF0aW9ucygpOwotCi0JCXJlbW92ZUFsbEFkYXB0ZXJzKCk7Ci0KLQkJZkRvY3VtZW50ID0gbnVsbDsKLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkVuYWJsZWQoKSB7Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGFkYXB0ZXIgZnJvbSB0b3Agc3R5bGVzaGVldCBub2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQkJCUlDU1NNb2RlbCBjc3NNb2RlbCA9IChJQ1NTTW9kZWwpIHNNb2RlbDsKLQkJCQkJSUNTU0RvY3VtZW50IGNzc0RvYyA9IGNzc01vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJCWlmIChjc3NEb2MgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGNzc0RvYzsKLQkJCQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyQ1NTLmNsYXNzKTsKLQkJCQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlub3RpZmllci5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJDU1MuYWRkQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgZm9sZGluZyBpcyBlbmFibGVkIGFuZCBuZXcgZG9jdW1lbnQgaXMgZ29pbmcgdG8gYmUgYSB0b3RhbGx5Ci0JCS8vIGRpZmZlcmVudCBkb2N1bWVudCwgZGlzYWJsZSBwcm9qZWN0aW9uCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBmRG9jdW1lbnQgIT0gbmV3SW5wdXQpIHsKLQkJCS8vIGRpc2FibGUgcHJvamVjdGlvbiBhbmQgZGlzY29ubmVjdCBldmVyeXRoaW5nCi0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBwcm9qZWN0aW9uIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgYmVmb3JlIGlucHV0IGRvY3VtZW50IGNoYW5nZWQKLQkJLy8gYW5kIG5ldyBkb2N1bWVudCBpcyBkaWZmZXJlbnQgdGhhbiBvbGQgZG9jdW1lbnQKLQkJaWYgKGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCAmJiBmRG9jdW1lbnQgPT0gbnVsbCAmJiBuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0aW9uRW5hYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZyb20gcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DU1NQcm9wZXJ0eVNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTUHJvcGVydHlTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVmZTNjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DU1NQcm9wZXJ0eVNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTTU1DYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU01ldGFNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLnV0aWwuQ1NTTWV0YU1vZGVsRmluZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwudXRpbC5DU1NNZXRhTW9kZWxVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLS8qKgotICogQSBJUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50YXRpb24gZm9yIGEgSkZhY2Ugdmlld2VyIHVzZWQgdG8gZGlzcGxheQotICogcHJvcGVydGllcyBvZiBDU1Mgbm9kZXMuCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZSB7Ci0JcHJvdGVjdGVkIElDU1NOb2RlIGZOb2RlID0gbnVsbDsKLQkvLyBmb3IgcGVyZm9ybWFuY2UuLi4KLQlmaW5hbCBzdGF0aWMgQ2xhc3MgQURBUFRFUl9LRVkgPSBJUHJvcGVydHlTb3VyY2UuY2xhc3M7Ci0JZmluYWwgYm9vbGVhbiBQRVJGX0dFVERFU0NSSVBUT1JTID0gZmFsc2U7Ci0JcHJpdmF0ZSBsb25nIHRpbWUwOwotCi0JcHVibGljIENTU1Byb3BlcnR5U291cmNlKElDU1NOb2RlIHRhcmdldCkgewotCQlzdXBlcigpOwotCQlmTm9kZSA9ICB0YXJnZXQ7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQkvLyB0aGUgZGlzcGxheU5hbWUgTVVTVCBiZSBzZXQKLQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZSwgZk5vZGUpOwotCQkvLyBJUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcKLQkJLy8gVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lKTsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKENTU01NTm9kZSBub2RlLCBTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihub2RlLmdldE5hbWUoKSwgY2F0ZWdvcnkpOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgbmFtZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChuYW1lICE9IG51bGwgJiYgMCA8IG5hbWUubGVuZ3RoKCkpIHsKLQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotCQkJCWNhdGVnb3J5ID0gQ1NTVUlNZXNzYWdlcy5JTkZPX05vdF9DYXRlZ29yaXplZF8xOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlkZXNjcmlwdG9yID0gbmV3IENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbmFtZSwgZk5vZGUsIGNhdGVnb3J5KTsKLQkJCS8vIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0JCQkvLyBkZXNjcmlwdG9yID0gbmV3IENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbmFtZSwgZk5vZGUpOwotCQkJLy8gfSBlbHNlIHsKLQkJCS8vIGRlc2NyaXB0b3IgPSBuZXcgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihuYW1lLCBuYW1lLCBmTm9kZSwKLQkJCS8vIGNhdGVnb3J5KTsKLQkJCS8vIH0KLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgdmFsdWUgZm9yIHRoaXMgb2JqZWN0IHRoYXQgY2FuIGJlIGVkaXR0ZWQgaW4gYSBwcm9wZXJ0eQotCSAqIHNoZWV0LgotCSAqIAotCSAqIEByZXR1cm4gYSB2YWx1ZSB0aGF0IGNhbiBiZSBlZGl0dGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMuCi0JICogCi0JICogQHJldHVybiBhIHZlY3RvciBjb250YWluaW5nIGFsbCBkZXNjcmlwdG9ycy4KLQkgKi8KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvcltdIGdldFByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCXRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJQ1NTTWV0YU1vZGVsIG1ldGFtb2RlbCA9IENTU01ldGFNb2RlbEZpbmRlci5nZXRJbnN0YW5jZSgpLmZpbmRNZXRhTW9kZWxGb3IoZk5vZGUpOwotCQlJdGVyYXRvciBpUHJvcGVydGllcyA9IENvbGxlY3Rpb25zLkVNUFRZX0xJU1QuaXRlcmF0b3IoKTsKLQkJc3dpdGNoIChmTm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIElDU1NOb2RlLlNUWUxFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuRk9OVEZBQ0VSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5QQUdFUlVMRV9OT0RFIDoKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQlDU1NNTU5vZGUgbW1QYXJlbnQgPSBuZXcgQ1NTTWV0YU1vZGVsVXRpbChtZXRhbW9kZWwpLmdldE1ldGFNb2RlbE5vZGVGb3IoZk5vZGUpOwotCQkJCWlmIChtbVBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCWlQcm9wZXJ0aWVzID0gbW1QYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQlDU1NNTU5vZGUgbW1Ob2RlID0gbmV3IENTU01ldGFNb2RlbFV0aWwobWV0YW1vZGVsKS5nZXRNZXRhTW9kZWxOb2RlRm9yKGZOb2RlKTsKLQkJCQlpZiAobW1Ob2RlICE9IG51bGwpIHsKLQkJCQkJaVByb3BlcnRpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG1tTm9kZSkuaXRlcmF0b3IoKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIHNldHVwIGNhdGVnb3JpZXMKLQkJTWFwIGNhdGVnb3JpZXMgPSBuZXcgSGFzaE1hcCgpOwotCQlJdGVyYXRvciBpQ2F0ZWdvcmllcyA9IG1ldGFtb2RlbC5nZXRDYXRlZ29yaWVzKCk7Ci0JCXdoaWxlIChpQ2F0ZWdvcmllcy5oYXNOZXh0KCkpIHsKLQkJCUNTU01NQ2F0ZWdvcnkgY2F0ZWdvcnkgPSAoQ1NTTU1DYXRlZ29yeSkgaUNhdGVnb3JpZXMubmV4dCgpOwotCQkJY2F0ZWdvcmllcy5wdXQoY2F0ZWdvcnkuZ2V0TmFtZSgpLCBjYXRlZ29yeS5nZXRDYXB0aW9uKCkpOwotCQl9Ci0KLQkJLy8gY29sbGVjdCBwcm9wZXJ0eSBuYW1lcwotCQlTZXQgZGVjbGFyZWRQcm9wZXJ0aWVzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYgKGlQcm9wZXJ0aWVzLmhhc05leHQoKSkgewotCQkJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGdldERlY2xhcmF0aW9uTm9kZSgpOwotCQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQlJQ1NTTm9kZUxpc3Qgbm9kZUxpc3QgPSAoKElDU1NOb2RlKSBkZWNsYXJhdGlvbikuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWludCBuUHJvcHMgPSAobm9kZUxpc3QgIT0gbnVsbCkgPyBub2RlTGlzdC5nZXRMZW5ndGgoKSA6IDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHJvcHM7IGkrKykgewotCQkJCQlJQ1NTTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkgewotCQkJCQkJU3RyaW5nIG5hbWUgPSAoKElDU1NTdHlsZURlY2xJdGVtKSBub2RlKS5nZXRQcm9wZXJ0eU5hbWUoKTsKLQkJCQkJCWlmIChuYW1lICE9IG51bGwgJiYgMCA8IG5hbWUubGVuZ3RoKCkpIHsKLQkJCQkJCQlkZWNsYXJlZFByb3BlcnRpZXMuYWRkKG5hbWUudG9Mb3dlckNhc2UoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlMaXN0IGRlc2NyaXB0b3JzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCS8vIGZpcnN0OiBwcm9wZXJ0aWVzIGZyb20gY29udGVudCBtb2RlbAotCQl3aGlsZSAoaVByb3BlcnRpZXMuaGFzTmV4dCgpKSB7Ci0JCQlDU1NNTU5vZGUgbm9kZSA9IChDU1NNTU5vZGUpIGlQcm9wZXJ0aWVzLm5leHQoKTsKLQkJCWlmIChub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9QUk9QRVJUWSB8fCBub2RlLmdldFR5cGUoKSA9PSBDU1NNTU5vZGUuVFlQRV9ERVNDUklQVE9SKSB7Ci0JCQkJU3RyaW5nIGNhdGVnb3J5ID0gKFN0cmluZykgY2F0ZWdvcmllcy5nZXQobm9kZS5nZXRBdHRyaWJ1dGUoImNhdGVnb3J5IikpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIG5hbWUgPSBub2RlLmdldE5hbWUoKS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChkZWNsYXJlZFByb3BlcnRpZXMuY29udGFpbnMobmFtZSkpIHsKLQkJCQkJZGVjbGFyZWRQcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKLQkJCQl9Ci0JCQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKG5hbWUsIGNhdGVnb3J5KTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBzZWNvbmQ6IGV4aXN0aW5nIHByb3BlcnRpZXMgYnV0IG5vdCBpbiBjb250ZW50IG1vZGVsCi0JCUl0ZXJhdG9yIGlSZW1haW5zID0gZGVjbGFyZWRQcm9wZXJ0aWVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpUmVtYWlucy5oYXNOZXh0KCkpIHsKLQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcigoU3RyaW5nKSBpUmVtYWlucy5uZXh0KCksIG51bGwpOwotCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCWRlc2NyaXB0b3JzLmFkZChkZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCi0JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSByZXN1bHRBcnJheSA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2Rlc2NyaXB0b3JzLnNpemUoKV07Ci0JCWlmIChQRVJGX0dFVERFU0NSSVBUT1JTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiLmdldFByb3BlcnR5RGVzY3JpcHRvcnM6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIChJUHJvcGVydHlEZXNjcmlwdG9yW10pIGRlc2NyaXB0b3JzLnRvQXJyYXkocmVzdWx0QXJyYXkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgZm9yIHRoZSBuYW1lZCBwcm9wZXJ0eS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IGFzIG5hbWVkIGJ5IGl0cyBwcm9wZXJ0eSBkZXNjcmlwdG9yCi0JICogQHJldHVybiB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgdmFsdWVTdHJpbmcgPSBudWxsOwotCQlTdHJpbmcgbmFtZVN0cmluZyA9IG5hbWUudG9TdHJpbmcoKTsKLQotCQlDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2xhcmF0aW9uID0gbnVsbDsKLQotCQlzd2l0Y2ggKGZOb2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMSVRFTV9OT0RFIDoKLQkJCQl2YWx1ZVN0cmluZyA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIGZOb2RlKS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5GT05URkFDRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLlBBR0VSVUxFX05PREUgOgotCQkJCWRlY2xhcmF0aW9uID0gKENTU1N0eWxlRGVjbGFyYXRpb24pIGZOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoZGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQl2YWx1ZVN0cmluZyA9IGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUobmFtZVN0cmluZyk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xBUkFUSU9OX05PREUgOgotCQkJCXZhbHVlU3RyaW5nID0gKChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZSkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lU3RyaW5nKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSA6Ci0JCQkJSUNTU05vZGUgcGFyZW50ID0gZk5vZGU7Ci0JCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgSUNTU1N0eWxlRGVjbEl0ZW0pKSB7Ci0JCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJfQotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCQl2YWx1ZVN0cmluZyA9ICgoSUNTU1N0eWxlRGVjbEl0ZW0pIHBhcmVudCkuZ2V0Q1NTVmFsdWVUZXh0KCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlpZiAodmFsdWVTdHJpbmcgPT0gbnVsbCkgewotCQkJdmFsdWVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmV0dXJuIHZhbHVlU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgcHJvcGVydHkgdmFsdWUgaGFzIGNoYW5nZWQgZnJvbSB0aGUgZGVmYXVsdC4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGhhcwotCSAqICAgICAgICAgY2hhbmdlZCBmcm9tIGl0cyBvcmlnaW5hbCBkZWZhdWx0IHZhbHVlOyA8Y29kZT5mYWxzZTwvY29kZT4KLQkgKiAgICAgICAgIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBwcm9wZXJ0eSkgewotCQlpZiAocHJvcGVydHkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBnZXREZWNsYXJhdGlvbk5vZGUoKTsKLQkJaWYgKGRlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IGRlY2xhcmF0aW9uLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkudG9TdHJpbmcoKSk7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCAmJiAwIDwgdmFsdWUubGVuZ3RoKCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSdzIHZhbHVlIHRvIGl0cyBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBwcm9wZXJ0eQotCSAqICAgICAgICAgICAgdGhlIHByb3BlcnR5IHRvIHJlc2V0Ci0JICovCi0JcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBzdHIpIHsKLQkJaWYgKHN0ciA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGdldERlY2xhcmF0aW9uTm9kZSgpOwotCQlpZiAoZGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJZGVjbGFyYXRpb24ucmVtb3ZlUHJvcGVydHkoc3RyLnRvU3RyaW5nKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbmFtZWQgcHJvcGVydHkgdG8gdGhlIGdpdmVuIHZhbHVlLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgc2V0Ci0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIGZvciB0aGUgcHJvcGVydHkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9ICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsOwotCQlTdHJpbmcgbmFtZVN0cmluZyA9IG5hbWUudG9TdHJpbmcoKTsKLQkJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IGdldERlY2xhcmF0aW9uTm9kZSgpOwotCQlpZiAoZGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZiAodmFsdWVTdHJpbmcgPT0gbnVsbCB8fCB2YWx1ZVN0cmluZy5sZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCWRlY2xhcmF0aW9uLnJlbW92ZVByb3BlcnR5KG5hbWVTdHJpbmcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVjbGFyYXRpb24uc2V0UHJvcGVydHkobmFtZVN0cmluZywgdmFsdWVTdHJpbmcsICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJCQlTdHJpbmcgdGl0bGUgPSBDU1NVSU1lc3NhZ2VzLlRpdGxlX0ludmFsaWRWYWx1ZTsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBtZXNzYWdlID0gQ1NTVUlNZXNzYWdlcy5NZXNzYWdlX0ludmFsaWRWYWx1ZTsgLy8kTk9OLU5MUy0xJAotCQkJCU1lc3NhZ2VEaWFsb2cub3Blbldhcm5pbmcod2luZG93LmdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbk5vZGUoKSB7Ci0JCUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbGFyYXRpb24gPSBudWxsOwotCi0JCXN3aXRjaCAoZk5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUgOgotCQkJCWRlY2xhcmF0aW9uID0gKENTU1N0eWxlRGVjbGFyYXRpb24pIGZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVSVUxFX05PREUgOgotCQkJY2FzZSBJQ1NTTm9kZS5GT05URkFDRVJVTEVfTk9ERSA6Ci0JCQljYXNlIElDU1NOb2RlLlBBR0VSVUxFX05PREUgOgotCQkJCWRlY2xhcmF0aW9uID0gKENTU1N0eWxlRGVjbGFyYXRpb24pIGZOb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuU1RZTEVERUNMQVJBVElPTl9OT0RFIDoKLQkJCQlkZWNsYXJhdGlvbiA9IChDU1NTdHlsZURlY2xhcmF0aW9uKSBmTm9kZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUNTU05vZGUuUFJJTUlUSVZFVkFMVUVfTk9ERSA6Ci0JCQkJSUNTU05vZGUgcGFyZW50ID0gZk5vZGU7Ci0JCQkJd2hpbGUgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgQ1NTU3R5bGVEZWNsYXJhdGlvbikpIHsKLQkJCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQl9Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCWRlY2xhcmF0aW9uID0gKENTU1N0eWxlRGVjbGFyYXRpb24pIHBhcmVudDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBkZWNsYXJhdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiYjk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklGaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU1BhdGhTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUZXh0UHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgVGV4dFByb3BlcnR5RGVzY3JpcHRvciB7Ci0JcHJpdmF0ZSBmaW5hbCBJQ1NTTm9kZSBmTm9kZTsKLQotCS8qKgotCSAqIENTU1RleHRQcm9wZXJ0eURlc2NyaXB0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgSUNTU05vZGUgbm9kZSkgewotCQlzdXBlcihpZCwgZGlzcGxheU5hbWUpOwotCQl0aGlzLmZOb2RlID0gbm9kZTsKLQl9Ci0KLQlwdWJsaWMgQ1NTVGV4dFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgaWQsIFN0cmluZyBkaXNwbGF5TmFtZSwgSUNTU05vZGUgbm9kZSwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCXN1cGVyKGlkLCBkaXNwbGF5TmFtZSk7Ci0JCXRoaXMuZk5vZGUgPSBub2RlOwotCQlzZXRDYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3IKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUKLQkgKi8KLQlwdWJsaWMgQ2VsbEVkaXRvciBjcmVhdGVQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKS5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAobW9kZWwuZ2V0U3R5bGVTaGVldFR5cGUoKSA9PSBJQ1NTTW9kZWwuRVhURVJOQUwgJiYgZmluZEVkaXRvcihtb2RlbCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBjaGVjayB3aGV0aGVyIElGaWxlIGlzIHJlYWRvbmx5IHRvIHByb2hpYml0IGVkaXRpbmcgYmVmb3JlCi0JCS8vIHZhbGlkYXRlRWRpdCgpCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbW9kZWw7Ci0JCWlmIChtb2RlbC5nZXRTdHlsZVNoZWV0VHlwZSgpICE9IElDU1NNb2RlbC5FWFRFUk5BTCkgewotCQkJc3RydWN0dXJlZE1vZGVsID0gKChJRE9NTm9kZSkgbW9kZWwuZ2V0T3duZXJET01Ob2RlKCkpLmdldE1vZGVsKCk7Ci0JCQlpZiAoc3RydWN0dXJlZE1vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJSUZpbGUgZmlsZSA9IENTU1BhdGhTZXJ2aWNlLmxvY2F0aW9uMkZpbGUoc3RydWN0dXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCB8fCBmaWxlLmlzUmVhZE9ubHkoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCXJldHVybiBzdXBlci5jcmVhdGVQcm9wZXJ0eUVkaXRvcihwYXJlbnQpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIElFZGl0b3JQYXJ0IGZpbmRFZGl0b3IoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSVdvcmtiZW5jaFdpbmRvd1tdIHdpbmRvd3MgPSB3b3JrYmVuY2guZ2V0V29ya2JlbmNoV2luZG93cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd3MubGVuZ3RoOyBpKyspIHsKLQkJCUlXb3JrYmVuY2hQYWdlW10gcGFnZXMgPSB3aW5kb3dzW2ldLmdldFBhZ2VzKCk7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IHBhZ2VzLmxlbmd0aDsgaisrKSB7Ci0JCQkJSUVkaXRvclJlZmVyZW5jZVtdIGVkaXRvcnMgPSBwYWdlc1tqXS5nZXRFZGl0b3JSZWZlcmVuY2VzKCk7Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBlZGl0b3JzLmxlbmd0aDsgaysrKSB7Ci0JCQkJCUlFZGl0b3JQYXJ0IGVkaXRQYXJ0ID0gZWRpdG9yc1trXS5nZXRFZGl0b3IoZmFsc2UpOwotCQkJCQlpZiAoZWRpdFBhcnQgIT0gbnVsbCkgewotCQkJCQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdFBhcnQuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJCQkJCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCQkJCQlJRmlsZSBmaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBlZGl0b3JJbnB1dCkuZ2V0RmlsZSgpOwotCQkJCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJCQkJLy9UT0RPIFVyZ2VudCBuZWVkcyB0byBiZSBmaXhlZAotCQkJCQkJCQkvLyBJIHRoaW5rIHdlIG5lZWQgJ2VxdWFscycgKG9yICdlcXVpdmFsZW50JwotCQkJCQkJCQkvLyBvbiBtb2RlbCkgZm9yIGNhc2VzIGxpa2UgdGhpcwotCQkJCQkJCQlpZiAoU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jYWxjdWxhdGVJZChmaWxlKS5lcXVhbHMobW9kZWwuZ2V0SWQoKSkpIHsKLQkJCQkJCQkJCXJldHVybiBlZGl0UGFydDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkMTA4YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckNTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Q1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJDU1MgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckNTUyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBhZGQgdGhlIG5vcm1hbCBjb250ZW50IGJhc2VkIGZhY3RvcmllcyB0byBtb2RlbCdzIHJlZ2lzdHJ5Ci0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlDU1MoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ0NTU0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTFhNzIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ0NTU0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlOwotCi0vKioKLSAqIFNlbGVjdHMgZW5jbG9zaW5nIENTUyBlbGVtZW50Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nQ1NTQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gKElDU1NOb2RlKSBpbmRleGVkUmVnaW9uOwotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlpbnQgY3VycmVudE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgY3VycmVudEVuZE9mZnNldCA9IGN1cnJlbnRPZmZzZXQgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPj0gY3VycmVudE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA8PSBjdXJyZW50RW5kT2Zmc2V0KSB7Ci0JCQkJSUNTU05vZGUgbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3ROZXh0Q1NTQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTEyMmFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdE5leHRDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLQotLyoqCi0gKiBTZWxlY3RzIG5leHQgQ1NTIGVsZW1lbnQKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3ROZXh0Q1NTQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJaW50IG9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpIC0gMTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlvZmZzZXQgPSAwOwotCi0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIG9mZnNldCk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCi0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCUlDU1NOb2RlIGN1cnNvck5vZGUgPSAoSUNTU05vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBpbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaW50IGN1cnJlbnRPZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJaW50IGN1cnJlbnRFbmRPZmZzZXQgPSBjdXJyZW50T2Zmc2V0ICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50RW5kT2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IGN1cnJlbnRPZmZzZXQgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gY3VycmVudEVuZE9mZnNldCkgewotCQkJCUlDU1NOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKG5ld05vZGUgPT0gbnVsbCkgewotCQkJCQluZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKG5ld05vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlJbmRleGVkUmVnaW9uIG5ld0luZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgbmV3Tm9kZTsKLQkJCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24oY3VycmVudE9mZnNldCwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGN1cnJlbnRPZmZzZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNDU1NBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODI4OWEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzQ1NTQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2VsZWN0cyBwcmV2aW91cyBDU1MgZWxlbWVudAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzQ1NTQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbmRleGVkUmVnaW9uID0gZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uLCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCVJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQlpZiAoaW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlJQ1NTTm9kZSBjdXJzb3JOb2RlID0gKElDU1NOb2RlKSBpbmRleGVkUmVnaW9uOwotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQlJQ1NTTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCQlpZiAobmV3Tm9kZSA9PSBudWxsKSB7Ci0JCQkJCW5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIG5ld0luZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCUluZGV4ZWRSZWdpb24gbmV3SW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBuZXdOb2RlOwotCQkJCQkJbmV3UmVnaW9uID0gbmV3IFJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnJlbnRFbmRPZmZzZXQgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoQ1NTVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihDU1NVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0NTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0NTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTI4MGQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZTsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgc3ltYm9saWMgbmFtZSBvZiBzdHlsZXMgdXNlZCBieSBMaW5lU3R5bGVQcm92aWRlciwKLSAqIENvbG9yTWFuYWdlciwgYW5kIGFueSBvdGhlcnMgd2hvIG1heSBiZSBpbnRlcmVzdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzQ1NTIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1JNQUwgPSAiTk9STUFMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUTUFSS19SVUxFID0gIkFUTUFSS19SVUxFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVE9SID0gIlNFTEVDVE9SIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBID0gIk1FRElBIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlQgPSAiQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gIlBST1BFUlRZX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVkFMVUUgPSAiUFJPUEVSVFlfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVJJID0gIlVSSSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFJJTkcgPSAiU1RSSU5HIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTE9OID0gIkNPTE9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTUlfQ09MT04gPSAiU0VNSV9DT0xPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVJMWV9CUkFDRSA9ICJDVVJMWV9CUkFDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUiA9ICJFUlJPUiI7IC8vJE5PTi1OTFMtMSQKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjNiMTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQkvKiogQ29udGFpbnMgcmVnaW9uIHRvIHN0eWxlIG1hcHBpbmcgKi8KLQlwcml2YXRlIE1hcCBmQ29sb3JUeXBlczsKLQotCS8qKgotCSAqIExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlRm9yKHR5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0JfQotCi0JLyoqCi0JICogTG9vayB1cCB0aGUgVGV4dEF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIHJlZ2lvbiBjb250ZXh0LiBNaWdodCByZXR1cm4KLQkgKiBudWxsIGZvciB1bnVzdWFsIHRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoZkNvbG9yVHlwZXMuZ2V0KHR5cGUpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChmQ29sb3JUeXBlcyA9PSBudWxsKSB7Ci0JCQlmQ29sb3JUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DT01NRU5ULCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RPLCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQ0RDLCBJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVCk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUywgSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTCk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UsIElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUkJSQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfSU1QT1JULCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1BBR0UsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfTUVESUEsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfRk9OVF9GQUNFLCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0NIQVJTRVQsIElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfQVRLRVlXT1JELCBJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU1RSSU5HLCBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19VUkksIElTdHlsZUNvbnN0YW50c0NTUy5VUkkpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX01FRElVTSwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19NRURJQV9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5NRURJQSk7Ci0KLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19DSEFSU0VUX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfUEFHRV9TRUxFQ1RPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRSwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9VTklWRVJTQUwsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfUFNFVURPLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0NMQVNTLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0lELCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCi0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQ09NQklOQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19TRUxFQ1RPUl9TRVBBUkFUT1IsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJULCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFLCBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTEVDVE9SKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1BST1BFUlRZLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfRElNRU5TSU9OLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0UsIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfTlVNQkVSLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1NUUklORywgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VUkksIElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9WQUxVRSk7Ci0JCWZDb2xvclR5cGVzLnB1dChDU1NSZWdpb25Db250ZXh0cy5DU1NfREVDTEFSQVRJT05fVkFMVUVfSEFTSCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9VTklDT0RFX1JBTkdFLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVCwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9PUEVSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9WQUxVRV9TLCBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiwgSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OKTsKLQkJZkNvbG9yVHlwZXMucHV0KENTU1JlZ2lvbkNvbnRleHRzLkNTU19ERUNMQVJBVElPTl9ERUxJTUlURVIsIElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OKTsKLQotCQlmQ29sb3JUeXBlcy5wdXQoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1VOS05PV04sIElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHN0eWxlS2V5ID0gbnVsbDsKLQotCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZLZXkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCQkJLy8gY2hlY2sgaWYgcHJlZmVyZW5jZSBjaGFuZ2VkIGlzIGEgc3R5bGUgcHJlZmVyZW5jZQotCQkJaWYgKElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5BVE1BUktfUlVMRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTE9OOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuQ09NTUVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5DT01NRU5UOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0UuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuQ1VSTFlfQlJBQ0U7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0NTUy5FUlJPUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLk1FRElBOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuTk9STUFMLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLk5PUk1BTDsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfTkFNRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlBST1BFUlRZX1ZBTFVFOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1IuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuU0VMRUNUT1I7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5TRU1JX0NPTE9OLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT047Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNDU1MuU1RSSU5HOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNDU1MuVVJJLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzQ1NTLlVSSTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIHRoaXMgaXMgYXJvdW5kIGZvciBvbGQgZGVwcmVjYXRlZCBwcmVmZXJlbmNlc0NoYW5nZWQoKSBtZXRob2QKLQkJCS8vIFRPRE8gcmVtb3ZlIHdoZW4gcHJlZmVyZW5jZXNDaGFuZ2VkKCkgaXMgcmVtb3ZlZAotCQkJbG9hZENvbG9ycygpOwotCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0KLQkJaWYgKHN0eWxlS2V5ICE9IG51bGwpIHsKLQkJCS8vIG92ZXJ3cml0ZSBzdHlsZSBwcmVmZXJlbmNlIHdpdGggbmV3IHZhbHVlCi0JCQlhZGRUZXh0QXR0cmlidXRlKHN0eWxlS2V5KTsKLQkJCXN1cGVyLmhhbmRsZVByb3BlcnR5Q2hhbmdlKGV2ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChmQ29sb3JUeXBlcyAhPSBudWxsKSB7Ci0JCQlmQ29sb3JUeXBlcy5jbGVhcigpOwotCQkJZkNvbG9yVHlwZXMgPSBudWxsOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlpbml0QXR0cmlidXRlcygpOwotCQkKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuQVRNQVJLX1JVTEUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5DT0xPTik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkNPTU1FTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5DVVJMWV9CUkFDRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLkVSUk9SKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuTUVESUEpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5OT1JNQUwpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5QUk9QRVJUWV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNDU1MuUFJPUEVSVFlfVkFMVUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5TRUxFQ1RPUik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzQ1NTLlNFTUlfQ09MT04pOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5TVFJJTkcpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0NTUy5VUkkpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjkwM2E1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTVGV4dFBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2Vyei5DU1NUZXh0VG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MgZXh0ZW5kcyBMaW5lU3R5bGVQcm92aWRlckZvckNTUyB7Ci0KLQlwdWJsaWMgYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24sIGludCBsaW5lUmVxdWVzdFN0YXJ0LCBpbnQgbGluZVJlcXVlc3RMZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJaW50IHJlZ2lvblN0YXJ0ID0gdHlwZWRSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCByZWdpb25FbmQgPSByZWdpb25TdGFydCArIHR5cGVkUmVnaW9uLmdldExlbmd0aCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHdob2xlUmVnaW9uID0gZ2V0RG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZWdpb25TdGFydCk7Ci0KLQkJTGlzdCB0b2tlbnM7Ci0JCWludCBvZmZzZXQ7Ci0KLQkJUGFyc2VyQ2FjaGUgY2FjaGUgPSBnZXRDYWNoZWRQYXJzaW5nUmVzdWx0KHdob2xlUmVnaW9uKTsKLQkJaWYgKGNhY2hlID09IG51bGwpIHsKLQkJCW9mZnNldCA9IHdob2xlUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlTdHJpbmcgY29udGVudDsKLQkJCWNvbnRlbnQgPSB3aG9sZVJlZ2lvbi5nZXRUZXh0KCk7Ci0KLQkJCUNTU1RleHRQYXJzZXIgcGFyc2VyID0gbmV3IENTU1RleHRQYXJzZXIoQ1NTVGV4dFBhcnNlci5NT0RFX1NUWUxFU0hFRVQsIGNvbnRlbnQpOwotCQkJdG9rZW5zID0gcGFyc2VyLmdldFRva2VuTGlzdCgpOwotCQkJY2FjaGVQYXJzaW5nUmVzdWx0KHdob2xlUmVnaW9uLCBuZXcgUGFyc2VyQ2FjaGUob2Zmc2V0LCB0b2tlbnMpKTsKLQkJfSBlbHNlIHsKLQkJCXRva2VucyA9IGNhY2hlLnRva2VuczsKLQkJCW9mZnNldCA9IGNhY2hlLm9mZnNldDsKLQkJfQotCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKDAgPCB0b2tlbnMuc2l6ZSgpKSB7Ci0JCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCQlJdGVyYXRvciBpID0gdG9rZW5zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlDU1NUZXh0VG9rZW4gdG9rZW4gPSAoQ1NTVGV4dFRva2VuKSBpLm5leHQoKTsKLQkJCQlpZiAocmVnaW9uU3RhcnQgPD0gc3RhcnQgJiYgc3RhcnQgPCByZWdpb25FbmQpIHsKLQkJCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGVGb3IodG9rZW4ua2luZCk7Ci0JCQkJCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJaG9sZFJlc3VsdHMuYWRkKG5ldyBTdHlsZVJhbmdlKHN0YXJ0LCB0b2tlbi5sZW5ndGgsIGF0dHJpYnV0ZS5nZXRGb3JlZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRCYWNrZ3JvdW5kKCksIGF0dHJpYnV0ZS5nZXRTdHlsZSgpKSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlob2xkUmVzdWx0cy5hZGQobmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIHRva2VuLmxlbmd0aCwgbnVsbCwgbnVsbCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXN0YXJ0ICs9IHRva2VuLmxlbmd0aDsKLQkJCX0KLQkJCXJlc3VsdCA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBUZXh0QXR0cmlidXRlIGdldEF0dHJpYnV0ZUZvcihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBDYWNoZSgpIHsKLQkJZkNhY2hlS2V5ID0gLTE7Ci0JCWZDYWNoZVJlc3VsdCA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBQYXJzZXJDYWNoZSBnZXRDYWNoZWRQYXJzaW5nUmVzdWx0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmQ2FjaGVLZXkgPT0gcmVnaW9uLmdldFRleHQoKS5oYXNoQ29kZSgpKSB7Ci0JCQlyZXR1cm4gZkNhY2hlUmVzdWx0OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVBhcnNpbmdSZXN1bHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIFBhcnNlckNhY2hlIHJlc3VsdCkgewotCQlmQ2FjaGVLZXkgPSByZWdpb24uZ2V0VGV4dCgpLmhhc2hDb2RlKCk7Ci0JCWZDYWNoZVJlc3VsdCA9IHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlzdXBlci5yZWxlYXNlKCk7Ci0JCWNsZWFudXBDYWNoZSgpOwotCX0KLQotCXByaXZhdGUgY2xhc3MgUGFyc2VyQ2FjaGUgewotCQlQYXJzZXJDYWNoZShpbnQgbmV3T2Zmc2V0LCBMaXN0IG5ld1Rva2VucykgewotCQkJb2Zmc2V0ID0gbmV3T2Zmc2V0OwotCQkJdG9rZW5zID0gbmV3VG9rZW5zOwotCQl9Ci0KLQkJaW50IG9mZnNldDsKLQkJTGlzdCB0b2tlbnM7Ci0JfQotCi0JaW50IGZDYWNoZUtleSA9IC0xOwotCVBhcnNlckNhY2hlIGZDYWNoZVJlc3VsdCA9IG51bGw7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTdkYTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5TaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLQotcHVibGljIGNsYXNzIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyQ1NTIGV4dGVuZHMgU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVFlQRSA9IGdldEVuY29kaW5nVHlwZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVuY29kaW5nVHlwZSgpIHsKLQkJcmV0dXJuICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVuY29kaW5nIHZhcmlhYmxlCi0JICovCi0JcHVibGljIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyQ1NTKCkgewotCQlzdXBlcihFTkNPRElOR19UWVBFLCBDU1NVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoVGVtcGxhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTk4MWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUNTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgQ1NTIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBDU1MgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZUNTUyBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgewotCi0JcHVibGljIFRlbXBsYXRlQ29udGV4dFR5cGVDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckNTUygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGExMzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSAiY3NzX2FsbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVyA9ICJjc3NfbmV3IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RleHQvQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3RleHQvQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmQwNTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC90ZXh0L0NTU0RvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi1wdWJsaWMgY2xhc3MgQ1NTRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciBpbXBsZW1lbnRzIElDaGFyYWN0ZXJQYWlyTWF0Y2hlciB7Ci0KLQlwcml2YXRlIGludCBmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLkxFRlQ7Ci0KLQkvKioKLQkgKiBAcGFyYW0gdmFsaWRDb250ZXh0cwotCSAqIEBwYXJhbSBuZXh0TWF0Y2hlcgotCSAqLwotCXB1YmxpYyBDU1NEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2dldEFuY2hvcigpCi0JICovCi0JcHVibGljIGludCBnZXRBbmNob3IoKSB7Ci0JCXJldHVybiBmQW5jaG9yOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIG1hdGNoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHIgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKHIgIT0gbnVsbCkgewotCQkJCWlmIChyLmdldFByZXZpb3VzKCkgIT0gbnVsbCAmJiByLmdldFN0YXJ0T2Zmc2V0KCkgPT0gb2Zmc2V0ICYmIHIuZ2V0UHJldmlvdXMoKS5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19SQlJBQ0UpKSB7Ci0JCQkJCXIgPSByLmdldFByZXZpb3VzKCk7Ci0JCQkJfQotCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkpIHsKLQkJCQkJd2hpbGUgKHIgIT0gbnVsbCAmJiAhci5nZXRUeXBlKCkuZXF1YWxzKENTU1JlZ2lvbkNvbnRleHRzLkNTU19MQlJBQ0UpKSB7Ci0JCQkJCQlyID0gci5nZXRQcmV2aW91cygpOwotCQkJCQl9Ci0JCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBuZXcgUmVnaW9uKHIuZ2V0U3RhcnRPZmZzZXQoKSwgMSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgaWYgKHIuZ2V0VHlwZSgpLmVxdWFscyhDU1NSZWdpb25Db250ZXh0cy5DU1NfTEJSQUNFKSkgewotCQkJCQl3aGlsZSAociAhPSBudWxsICYmICFyLmdldFR5cGUoKS5lcXVhbHMoQ1NTUmVnaW9uQ29udGV4dHMuQ1NTX1JCUkFDRSkpIHsKLQkJCQkJCXIgPSByLmdldE5leHQoKTsKLQkJCQkJfQotCQkJCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihyLmdldEVuZE9mZnNldCgpIC0gMSwgMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvTmV3Q1NTRmlsZVdpemFyZFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvTmV3Q1NTRmlsZVdpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM3MzA2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU0ZpbGVXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuQ29tcG9uZW50Q29yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvbXBvbmVudGNvcmUuaW50ZXJuYWwudXRpbC5JTW9kdWxlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5yZXNvdXJjZXMuSVZpcnR1YWxDb21wb25lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuSUZhY2V0ZWRQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24ucHJvamVjdC5mYWNldC5jb3JlLlByb2plY3RGYWNldHNNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5DU1NDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5DU1NDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yQ1NTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkxvZ2dlcjsKLQotY2xhc3MgTmV3Q1NTRmlsZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZTsKLQlwcml2YXRlIExpc3QgZlZhbGlkRXh0ZW5zaW9ucyA9IG51bGw7Ci0JCi0JcHVibGljIE5ld0NTU0ZpbGVXaXphcmRQYWdlKFN0cmluZyBwYWdlTmFtZSwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0gICAgICAgIHN1cGVyKHBhZ2VOYW1lLCBzZWxlY3Rpb24pOwotICAgIH0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IHRoZSBzZWxlY3RlZCBmb2xkZXIgdG8gd2ViIGNvbnRlbnRzIAotCSAqIGZvbGRlciBpZiB0aGUgY3VycmVudCBzZWxlY3Rpb24gaXMgb3V0c2lkZSB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlci4gCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCkgewotCQlzdXBlci5pbml0aWFsUG9wdWxhdGVDb250YWluZXJOYW1lRmllbGQoKTsKLQkJCi0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3RGcm9tUGF0aChmdWxsUGF0aCk7Ci0JCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQotCQlpZiAod2ViQ29udGVudFBhdGggIT0gbnVsbCAmJiAhd2ViQ29udGVudFBhdGguaXNQcmVmaXhPZihmdWxsUGF0aCkpIHsKLQkJCXNldENvbnRhaW5lckZ1bGxQYXRoKHdlYkNvbnRlbnRQYXRoKTsKLQkJfQotCX0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBvdmVycmlkZW4gdG8gc2V0IGFkZGl0aW9uYWwgdmFsaWRhdGlvbiBzcGVjaWZpYyB0byAKLQkgKiBjc3MgZmlsZXMuIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJc2V0TWVzc2FnZShudWxsKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkKLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCQotCQlTdHJpbmcgZmlsZU5hbWUgPSBnZXRGaWxlTmFtZSgpOwotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCWlmICgoZnVsbFBhdGggIT0gbnVsbCkgJiYgKGZ1bGxQYXRoLmlzRW1wdHkoKSA9PSBmYWxzZSkgJiYgKGZpbGVOYW1lICE9IG51bGwpKSB7Ci0JCQkvLyBjaGVjayB0aGF0IGZpbGVuYW1lIGRvZXMgbm90IGNvbnRhaW4gaW52YWxpZCBleHRlbnNpb24KLQkJCWlmICghZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShmaWxlTmFtZSkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoQ1NTVUlNZXNzYWdlcy5fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfQ1NTLCBnZXRWYWxpZEV4dGVuc2lvbnMoKS50b1N0cmluZygpKSk7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGNoZWNrIGFkZGluZyBkZWZhdWx0Ci0JCQkvLyBleHRlbnNpb24gZG9lc24ndCBlcXVhbCBhIGZpbGUgdGhhdCBhbHJlYWR5IGV4aXN0cwotCQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBhZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCQlJUGF0aCByZXNvdXJjZVBhdGggPSBmdWxsUGF0aC5hcHBlbmQobmV3RmlsZU5hbWUpOwotCi0JCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJSVN0YXR1cyByZXN1bHQgPSB3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHJlc291cmNlUGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuRk9MREVSKTsKLQkJCQlpZiAoIXJlc3VsdC5pc09LKCkpIHsKLQkJCQkJLy8gcGF0aCBpbnZhbGlkCi0JCQkJCXNldEVycm9yTWVzc2FnZShyZXN1bHQuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCWlmICgod29ya3NwYWNlLmdldFJvb3QoKS5nZXRGb2xkZXIocmVzb3VyY2VQYXRoKS5leGlzdHMoKSB8fCB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZpbGUocmVzb3VyY2VQYXRoKS5leGlzdHMoKSkpIHsKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKENTU1VJTWVzc2FnZXMuUmVzb3VyY2VHcm91cF9uYW1lRXhpc3RzKTsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJLy8gZ2V0IHRoZSBJUHJvamVjdCBmb3IgdGhlIHNlbGVjdGlvbiBwYXRoCi0JCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdEZyb21QYXRoKGZ1bGxQYXRoKTsKLQkJCS8vIGlmIGluc2lkZSB3ZWIgcHJvamVjdCwgY2hlY2sgaWYgaW5zaWRlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQlpZiAocHJvamVjdCAhPSBudWxsICYmIGlzV2ViUHJvamVjdChwcm9qZWN0KSkgewotCQkJCS8vIGNoZWNrIHRoYXQgdGhlIHBhdGggaXMgaW5zaWRlIHRoZSB3ZWJDb250ZW50IGZvbGRlcgotCQkJCUlQYXRoIHdlYkNvbnRlbnRQYXRoID0gZ2V0V2ViQ29udGVudFBhdGgocHJvamVjdCk7Ci0JCQkJaWYgKCF3ZWJDb250ZW50UGF0aC5pc1ByZWZpeE9mKGZ1bGxQYXRoKSkgewotCQkJCQlzZXRNZXNzYWdlKENTU1VJTWVzc2FnZXMuX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5ULCBXQVJOSU5HKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yQ1NTLkNvbnRlbnRUeXBlSURfQ1NTKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBDU1MgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIGlmIGZpbGVOYW1lIGlzIHZhbGlkIG5hbWUgZm9yIGNvbnRlbnQgdHlwZS4gVGFrZXMgYmFzZSBjb250ZW50Ci0JICogdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGFuIGV4dGVuc2lvbgotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBleHRlbnNpb24KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCQl2YWxpZCA9IHR5cGVzW2ldLmlzS2luZE9mKHR5cGUpOwotCQkJCSsraTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBkZWZhdWx0IGV4dGVuc2lvbiB0byB0aGUgZmlsZW5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZW5hbWUpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBDU1NDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlTdHJpbmcgZXh0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ1NTQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0KLQkJbmV3RmlsZU5hbWUuYXBwZW5kKCIuIik7IC8vJE5PTi1OTFMtMSQKLQkJbmV3RmlsZU5hbWUuYXBwZW5kKGV4dCk7Ci0KLQkJcmV0dXJuIG5ld0ZpbGVOYW1lLnRvU3RyaW5nKCk7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCB3aGljaCBwcm9qZWN0IGlzIG5lZWRlZAotCSAqIEByZXR1cm4gSVByb2plY3Qgb2JqZWN0LiBJZiBwYXRoIGlzIDxjb2RlPm51bGw8L2NvZGU+IHRoZSByZXR1cm4gdmFsdWUgCi0JICogCQkgICBpcyBhbHNvIDxjb2RlPm51bGw8L2NvZGU+LiAKLQkgKi8KLQlwcml2YXRlIElQcm9qZWN0IGdldFByb2plY3RGcm9tUGF0aChJUGF0aCBwYXRoKSB7Ci0JCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlJUHJvamVjdCBwcm9qZWN0ID0gbnVsbDsKLQkJCi0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWlmICh3b3Jrc3BhY2UudmFsaWRhdGVQYXRoKHBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLlBST0pFQ1QpLmlzT0soKSkgewotCQkJCXByb2plY3QgPSB3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldFByb2plY3QocGF0aC50b1N0cmluZygpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKS5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBwcm9qZWN0OwotCX0KLQkKLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBwcm9qZWN0IGlzIGEgd2ViIHByb2plY3QuIAotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3QgdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvamVjdCBpcyB3ZWIgcHJvamVjdCwgb3RoZXJ3aXNlIGZhbHNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzV2ViUHJvamVjdChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlGYWNldGVkUHJvamVjdCBmYWNldGVkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWZhY2V0ZWQgPSBQcm9qZWN0RmFjZXRzTWFuYWdlci5jcmVhdGUocHJvamVjdCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCQotCQlpZiAoZmFjZXRlZCAhPSBudWxsICYmIAotCQkJKGZhY2V0ZWQuaGFzUHJvamVjdEZhY2V0KFByb2plY3RGYWNldHNNYW5hZ2VyLmdldFByb2plY3RGYWNldChJTW9kdWxlQ29uc3RhbnRzLldTVF9XRUJfTU9EVUxFKSkgfHwgCi0JCQkgZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuSlNUX1dFQl9NT0RVTEUpKSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIgb2YgdGhlIHNwZWNpZmllZCBwcm9qZWN0Ci0JICogCi0JICogQHBhcmFtIHByb2plY3QgdGhlIHByb2plY3Qgd2hpY2ggd2ViIGNvbnRlbnRzIHBhdGggaXMgbmVlZGVkCi0JICogQHJldHVybiBJUGF0aCBvZiB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlcgotCSAqLwotCXByaXZhdGUgSVBhdGggZ2V0V2ViQ29udGVudFBhdGgoSVByb2plY3QgcHJvamVjdCkgewotCQlJUGF0aCBwYXRoID0gbnVsbDsKLQkJCi0JCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgaXNXZWJQcm9qZWN0KHByb2plY3QpKSB7CQkJCi0JCQlJVmlydHVhbENvbXBvbmVudCBjb21wb25lbnQgPSBDb21wb25lbnRDb3JlLmNyZWF0ZUNvbXBvbmVudChwcm9qZWN0KTsKLQkJCXBhdGggPSBjb21wb25lbnQuZ2V0Um9vdEZvbGRlcigpLmdldFdvcmtzcGFjZVJlbGF0aXZlUGF0aCgpOwotCQl9Ci0JCQotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS9pbnRlcm5hbC93aXphcmQvTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDBjNzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLndpemFyZDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuQ1NTVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0NTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIHsKLQotCS8qKgotCSAqIENvbnRlbnQgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcwotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciB7Ci0JCS8qKiBUaGUgdGVtcGxhdGUgc3RvcmUuICovCi0JCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmU3RvcmU7Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2Rpc3Bvc2UoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCWZTdG9yZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXQpIHsKLQkJCXJldHVybiBmU3RvcmUuZ2V0VGVtcGxhdGVzKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNpbnB1dENoYW5nZWQoVmlld2VyLCBPYmplY3QsIE9iamVjdCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJZlN0b3JlID0gKFRlbXBsYXRlU3RvcmUpIG5ld0lucHV0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGFiZWwgcHJvdmlkZXIgZm9yIHRlbXBsYXRlcy4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlciNnZXRDb2x1bW5JbWFnZShqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtblRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkJICogICAgICBpbnQpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IGVsZW1lbnQsIGludCBjb2x1bW5JbmRleCkgewotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSAoVGVtcGxhdGUpIGVsZW1lbnQ7Ci0KLQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQljYXNlIDAgOgotCQkJCQlyZXR1cm4gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJCWNhc2UgMSA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXREZXNjcmlwdGlvbigpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKiBMYXN0IHNlbGVjdGVkIHRlbXBsYXRlIG5hbWUgKi8KLQlwcml2YXRlIFN0cmluZyBmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lOwotCS8qKiBUaGUgdmlld2VyIGRpc3BsYXlzIHRoZSBwYXR0ZXJuIG9mIHNlbGVjdGVkIHRlbXBsYXRlLiAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGZQYXR0ZXJuVmlld2VyOwotCS8qKiBUaGUgdGFibGUgcHJlc2VudGluZyB0aGUgdGVtcGxhdGVzLiAqLwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZlRhYmxlVmlld2VyOwotCS8qKiBUZW1wbGF0ZSBzdG9yZSB1c2VkIGJ5IHRoaXMgd2l6YXJkIHBhZ2UgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0JLyoqIENoZWNrYm94IGZvciB1c2luZyB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBCdXR0b24gZlVzZVRlbXBsYXRlQnV0dG9uOwotCi0JcHVibGljIE5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlIiwgQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgQ1NTIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChDU1NVSU1lc3NhZ2VzLk5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfNCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSBjb21wb3NpdGUgZm9yIFRlbXBsYXRlcyB0YWJsZQotCQlDb21wb3NpdGUgaW5uZXJQYXJlbnQgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGlubmVyTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaW5uZXJMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWlubmVyTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0KGlubmVyTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJaW5uZXJQYXJlbnQuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gQ3JlYXRlIGxpbmtlZCB0ZXh0IHRvIGp1c3QgdG8gdGVtcGxhdGVzIHByZWZlcmVuY2UgcGFnZQotCQlMaW5rIGxpbmsgPSBuZXcgTGluayhpbm5lclBhcmVudCwgU1dULk5PTkUpOwotCQlsaW5rLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzYpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpOwotCQlsaW5rLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWxpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJbGlua0NsaWNrZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHRhYmxlIHRoYXQgZGlzcGxheXMgdGVtcGxhdGVzCi0JCVRhYmxlIHRhYmxlID0gbmV3IFRhYmxlKGlubmVyUGFyZW50LCBTV1QuQk9SREVSIHwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEud2lkdGhIaW50ID0gY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKDIpOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDEwKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXRhYmxlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgdGFibGVMYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJdGFibGUuc2V0TGF5b3V0KHRhYmxlTGF5b3V0KTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4xID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjEuc2V0VGV4dChDU1NVSU1lc3NhZ2VzLk5ld0NTU1RlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoQ1NTVUlNZXNzYWdlcy5OZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlXzMpOwotCi0JCWZUYWJsZVZpZXdlciA9IG5ldyBUYWJsZVZpZXdlcih0YWJsZSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUZW1wbGF0ZUxhYmVsUHJvdmlkZXIoKSk7Ci0JCWZUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IFRlbXBsYXRlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZUYWJsZVZpZXdlci5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpIHsKLQkJCXB1YmxpYyBpbnQgY29tcGFyZShWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2JqZWN0MSwgT2JqZWN0IG9iamVjdDIpIHsKLQkJCQlpZiAoKG9iamVjdDEgaW5zdGFuY2VvZiBUZW1wbGF0ZSkgJiYgKG9iamVjdDIgaW5zdGFuY2VvZiBUZW1wbGF0ZSkpIHsKLQkJCQkJVGVtcGxhdGUgbGVmdCA9IChUZW1wbGF0ZSkgb2JqZWN0MTsKLQkJCQkJVGVtcGxhdGUgcmlnaHQgPSAoVGVtcGxhdGUpIG9iamVjdDI7Ci0JCQkJCWludCByZXN1bHQgPSBsZWZ0LmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldE5hbWUoKSk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gMCkKLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCXJldHVybiBsZWZ0LmdldERlc2NyaXB0aW9uKCkuY29tcGFyZVRvSWdub3JlQ2FzZShyaWdodC5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHN1cGVyLmNvbXBhcmUodmlld2VyLCBvYmplY3QxLCBvYmplY3QyKTsKLQkJCX0KLQotCQkJcHVibGljIGJvb2xlYW4gaXNTb3J0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0pOwotCi0JCWZUYWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBlKSB7Ci0JCQkJdXBkYXRlVmlld2VySW5wdXQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIHZpZXdlciB0aGF0IGRpc3BsYXlzIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZSdzIGNvbnRlbnRzCi0JCWZQYXR0ZXJuVmlld2VyID0gZG9DcmVhdGVWaWV3ZXIocGFyZW50KTsKLQotCQlmVGVtcGxhdGVTdG9yZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkNTU19ORVdXSVpBUkRfVEVNUExBVEVfSEVMUElEKTsKLQkJRGlhbG9nLmFwcGx5RGlhbG9nRm9udChwYXJlbnQpOwotCQlzZXRDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyBhIHNvdXJjZSB2aWV3ZXIgdG8gcHJlc2VudCB0aGUgdGVtcGxhdGUKLQkgKiBwYXR0ZXJuIG9uIHRoZSBwcmVmZXJlbmNlIHBhZ2UuIENsaWVudHMgbWF5IG92ZXJyaWRlIHRvIHByb3ZpZGUgYQotCSAqIGN1c3RvbSBzb3VyY2Ugdmlld2VyIGZlYXR1cmluZyBlLmcuIHN5bnRheCBjb2xvcmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogICAgICAgICAgICB0aGUgcGFyZW50IGNvbnRyb2wKLQkgKiBAcmV0dXJuIGEgY29uZmlndXJlZCBzb3VyY2Ugdmlld2VyCi0JICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25DU1MoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGVJRCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBkb0NyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQlsYWJlbC5zZXRUZXh0KENTU1VJTWVzc2FnZXMuTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnByZWZlcmVuY2VzLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGNzcyIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBDU1MgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IENTU1VJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IENTUyBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlDU1NVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoQ1NTVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNDU1MuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL2ludGVybmFsL3dpemFyZC9OZXdDU1NXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFhNjA0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0NTU1dpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLkNTU0NvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLkNTU0VkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmltYWdlLkNTU0ltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotcHVibGljIGNsYXNzIE5ld0NTU1dpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgTmV3Q1NTRmlsZVdpemFyZFBhZ2UgZk5ld0ZpbGVQYWdlOwotCXByaXZhdGUgTmV3Q1NTVGVtcGxhdGVzV2l6YXJkUGFnZSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2U7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZFNlbGVjdGlvbiBmU2VsZWN0aW9uOwotCi0JcHVibGljIHZvaWQgYWRkUGFnZXMoKSB7Ci0JCWZOZXdGaWxlUGFnZSA9IG5ldyBOZXdDU1NGaWxlV2l6YXJkUGFnZSgiQ1NTV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSIsIG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKElERS5jb21wdXRlU2VsZWN0ZWRSZXNvdXJjZXMoZlNlbGVjdGlvbikpKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0VGl0bGUoQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19IRUFESU5HKTsgLy8kTk9OLU5MUy0xJAotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19ERVNDUklQVElPTik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkUGFnZShmTmV3RmlsZVBhZ2UpOwotCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZSA9IG5ldyBOZXdDU1NUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoQ1NTVUlNZXNzYWdlcy5fVUlfV0laQVJEX05FV19USVRMRSk7IC8vJE5PTi1OTFMtMSQKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBDU1NJbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihDU1NFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9ORVdDU1NGSUxFKTsKLQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG9wZW5FZGl0b3IoZmluYWwgSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQlnZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJCUlERS5vcGVuRWRpdG9yKHBhZ2UsIGZpbGUsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcGVyZm9ybWVkT0sgPSBmYWxzZTsKLQotCQkvLyBzYXZlIHVzZXIgb3B0aW9ucyBmb3IgbmV4dCB1c2UKLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlLnNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBhZGQgZGVmYXVsdCBleHRlbnNpb24KLQkJU3RyaW5nIGZpbGVOYW1lID0gZk5ld0ZpbGVQYWdlLmdldEZpbGVOYW1lKCk7Ci0JCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQlTdHJpbmcgbmV3RmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQlmTmV3RmlsZVBhZ2Uuc2V0RmlsZU5hbWUobmV3RmlsZU5hbWUpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgbmV3IGVtcHR5IGZpbGUKLQkJSUZpbGUgZmlsZSA9IGZOZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJLy8gaWYgdGhlcmUgd2FzIHByb2JsZW0gd2l0aCBjcmVhdGluZyBmaWxlLCBpdCB3aWxsIGJlIG51bGwsIHNvIG1ha2UKLQkJLy8gc3VyZSB0byBjaGVjawotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBwdXQgdGVtcGxhdGUgY29udGVudHMgaW50byBmaWxlCi0JCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2UuZ2V0VGVtcGxhdGVTdHJpbmcoKTsKLQkJCWlmICh0ZW1wbGF0ZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IENTU0NvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBDU1MgZmlsZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9DU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjOWQ4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvY29udGVudG91dGxpbmUvQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNzcy51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTVmFsdWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5DU1NVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBDU1MgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1VUTElORV9TT1JUX1BSRUYgPSAib3V0bGluZS1zb3J0IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIG5ldyBpbnN0YW5jZSBvZiBDU1NDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBzdXBlci5jcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCi0JCVNvcnRBY3Rpb24gc29ydEFjdGlvbiA9IG5ldyBTb3J0QWN0aW9uKHZpZXdlciwgQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX1NPUlRfUFJFRik7Ci0JCUlDb250cmlidXRpb25JdGVtIHNvcnRJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShzb3J0QWN0aW9uKTsKLQotCQlpZiAoaXRlbXMgPT0gbnVsbCkgewotCQkJaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bMV07Ci0JCQlpdGVtc1swXSA9IHNvcnRJdGVtOwotCQl9Ci0JCWVsc2UgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb21iaW5lZEl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2l0ZW1zLmxlbmd0aCArIDFdOwotCQkJY29tYmluZWRJdGVtc1swXSA9IHNvcnRJdGVtOwotCQkJU3lzdGVtLmFycmF5Y29weShpdGVtcywgMCwgY29tYmluZWRJdGVtcywgMSwgaXRlbXMubGVuZ3RoKTsKLQkJCWl0ZW1zID0gY29tYmluZWRJdGVtczsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpCi0JCQlmQ29udGVudFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUygpOwotCQlyZXR1cm4gZkNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdCBnZXRGaWx0ZXJlZE5vZGUoT2JqZWN0IG8pIHsKLQkJSUNTU05vZGUgbm9kZSA9IG51bGw7Ci0JCWlmIChvIGluc3RhbmNlb2YgSUNTU05vZGUpIHsKLQkJCW5vZGUgPSAoSUNTU05vZGUpIG87Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1ZhbHVlKSB7Ci0JCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiAhKG5vZGUgaW5zdGFuY2VvZiBJQ1NTU3R5bGVEZWNsSXRlbSkpIHsKLQkJCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLlNUWUxFREVDTEFSQVRJT05fTk9ERSkgewotCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGVUeXBlID09IElDU1NOb2RlLk1FRElBTElTVF9OT0RFKSB7Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgT2JqZWN0W10gZ2V0RmlsdGVyZWROb2RlcyhPYmplY3RbXSBvYmplY3RzKSB7Ci0JCU9iamVjdFtdIGZpbHRlcmVkID0gbmV3IE9iamVjdFtvYmplY3RzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsdGVyZWQubGVuZ3RoOyBpKyspIHsKLQkJCWZpbHRlcmVkW2ldID0gZ2V0RmlsdGVyZWROb2RlKG9iamVjdHNbaV0pOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZDsKLQl9Ci0KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWZMYWJlbFByb3ZpZGVyID0gbmV3IEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MoKTsKLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5TdHJ1Y3R1cmVkQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gQ1NTVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbihUcmVlVmlld2VyIHZpZXdlciwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVNlbGVjdGlvbiBmaWx0ZXJlZFNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSBmaWx0ZXJlZE5vZGVzID0gZ2V0RmlsdGVyZWROb2RlcygoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSk7Ci0JCQlmaWx0ZXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZpbHRlcmVkTm9kZXMpOwotCQl9Ci0JCXJldHVybiBmaWx0ZXJlZFNlbGVjdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlckNTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDU4OTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU0RvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTUnVsZTsKLQotLyoqCi0gKiBBIENvbnRlbnQgcHJvdmlkZXIgZm9yIGEgSkZhY2Ugdmlld2VyIHVzZWQgdG8gZGlzcGxheSBDU1Mgbm9kZXMuIFRoaXMKLSAqIGNvbnRlbnQgcHJvdmlkZXIgZG9lcyBub3QgdXNlIGFkYXB0ZXJzLgotICovCi1jbGFzcyBKRmFjZU5vZGVDb250ZW50UHJvdmlkZXJDU1MgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyQ1NTKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRWxlbWVudHMoT2JqZWN0IGVsZW1lbnQsIEFycmF5TGlzdCB2KSB7Ci0KLQkJSUNTU05vZGUgbm9kZTsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJSUNTU01vZGVsIG1vZGVsID0gKElDU1NNb2RlbCkgZWxlbWVudDsKLQkJCUlDU1NEb2N1bWVudCBkb2MgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQkJbm9kZSA9IGRvYy5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQlub2RlID0gKChJQ1NTTm9kZSkgZWxlbWVudCkuZ2V0Rmlyc3RDaGlsZCgpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybjsKLQotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENTU1J1bGUpIHsKLQkJCQl2LmFkZChub2RlKTsKLQkJCX0KLQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhlIHZpc3VhbCBwYXJ0IHRoYXQgaXMgdXNpbmcgdGhpcyBjb250ZW50IHByb3ZpZGVyIGlzIGFib3V0IHRvIGJlCi0JICogZGlzcG9zZWQuIERlYWxsb2NhdGUgYWxsIGFsbG9jYXRlZCBTV1QgcmVzb3VyY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBjb250YWluaW5nIGFsbCBjaGlsZCBub2RlcyBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwKLQkgKiB3aGljaCByZXByZXNlbnRzIGEgbm9kZSBpbiBhIHRyZWUuIFRoZSBkaWZmZXJlbmNlIHRvCi0JICogPGNvZGU+SVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIuZ2V0RWxlbWVudHMoT2JqZWN0KTwvY29kZT4gaXMgYXMKLQkgKiBmb2xsb3dzOiA8Y29kZT5nZXRFbGVtZW50czwvY29kZT4gaXMgY2FsbGVkIHRvIG9idGFpbiB0aGUgdHJlZQotCSAqIHZpZXdlcidzIHJvb3QgZWxlbWVudHMuIE1ldGhvZCA8Y29kZT5nZXRDaGlsZHJlbjwvY29kZT4gaXMgdXNlZCB0bwotCSAqIG9idGFpbiB0aGUgY2hpbGRyZW4gb2YgYSBnaXZlbiBub2RlIGluIHRoZSB0cmVlLCB3aGljaCBjYW4gY2FuIGJlIGEKLQkgKiByb290IG5vZGUsIHRvby4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihvYmplY3QpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIHdpdGggdGhlIGVsZW1lbnRzIGJlbG9uZ2luZyB0byB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gVGhlc2UgZWxlbWVudHMgY2FuIGJlIHByZXNlbnRlZCBhcyByb3dzIGluIGEgdGFibGUsIGl0ZW1zIGluIGEKLQkgKiBsaXN0IGV0Yy4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihvYmplY3QpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RWxlbWVudHMob2JqZWN0KTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZm9yIHRoZSBnaXZlbiBlbGVtZW50LiBUaGlzIG1ldGhvZCBjYW4gcmV0dXJuCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaW5kaWNhdGluZyB0aGF0IHRoZSBwYXJlbnQgY2FuJ3QgYmUgY29tcHV0ZWQuIEluCi0JICogdGhpcyBjYXNlIHRoZSB0cmVlIHZpZXdlciBjYW4ndCBleHBhbmQgYSBnaXZlbiBub2RlIGNvcnJlY3RseSBpZgotCSAqIHJlcXVlc3RlZC4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgb2JqZWN0KSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyKG9iamVjdCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5nZXRQYXJlbnQob2JqZWN0KTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBnaXZlbiBlbGVtZW50IGhhcyBjaGlsZHJlbi4KLQkgKiBPdGhlcndpc2UgPGNvZGU+ZmFsc2U8L2NvZGU+IGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmhhc0NoaWxkcmVuKG9iamVjdCk7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlciwKLQkgKiAgICAgIGphdmEubGFuZy5PYmplY3QsIGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCWlmIChvbGRJbnB1dCAhPSBudWxsICYmIG9sZElucHV0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRNb2RlbCkgewotCQkJSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KSAoKElTdHJ1Y3R1cmVkTW9kZWwpIG9sZElucHV0KS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LnJlbW92ZUxpc3RlbmVyKHZpZXdlcik7Ci0JCQl9Ci0JCX0KLQkJaWYgKG5ld0lucHV0ICE9IG51bGwgJiYgbmV3SW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgbmV3SW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBlbGVtZW50IGlzIGRlbGV0ZWQgb3Igbm90LgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByaXZhdGUgSUpGYWNlTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlcihPYmplY3QgYWRhcHRhYmxlKSB7Ci0JCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSUNTU01vZGVsKSB7Ci0JCQlhZGFwdGFibGUgPSAoKElDU1NNb2RlbCkgYWRhcHRhYmxlKS5nZXREb2N1bWVudCgpOwotCQl9Ci0JCWlmIChhZGFwdGFibGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZUFkYXB0ZXIgbm9kZUFkYXB0ZXIgPSAoKElOb2RlTm90aWZpZXIpIGFkYXB0YWJsZSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAobm9kZUFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikKLQkJCQlhZGFwdGVyID0gKElKRmFjZU5vZGVBZGFwdGVyKSBub2RlQWRhcHRlcjsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNjEzOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jc3MudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotCi1jbGFzcyBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyQ1NTIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0KLQkvKioKLQkgKiBKRmFjZU5vZGVMYWJlbFByb3ZpZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXJDU1MoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSkZhY2UgYWRhcHRlciBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGFkYXB0YWJsZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdCBUaGUgb2JqZWN0IHRvIGdldCB0aGUgYWRhcHRlciBmb3IKLQkgKi8KLQlwcml2YXRlIElKRmFjZU5vZGVBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElDU1NNb2RlbCkgewotCQkJYWRhcHRhYmxlID0gKChJQ1NTTW9kZWwpIGFkYXB0YWJsZSkuZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVBZGFwdGVyIG5vZGVBZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKG5vZGVBZGFwdGVyIGluc3RhbmNlb2YgSUpGYWNlTm9kZUFkYXB0ZXIpCi0JCQkJYWRhcHRlciA9IChJSkZhY2VOb2RlQWRhcHRlcikgbm9kZUFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgaW1hZ2UuIEVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNhbiBiZSA8Y29kZT5udWxsPC9jb2RlPiBpbmRpY2F0aW5nIG5vIGlucHV0IG9iamVjdCBpcyBzZXQKLQkgKiAgICAgICAgICAgIHRvIHRoZSB2aWV3ZXIuCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIoZWxlbWVudCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlpbWFnZSA9IGFkYXB0ZXIuZ2V0TGFiZWxJbWFnZShlbGVtZW50KTsKLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgZm9yIHRoZSBsYWJlbCBvZiB0aGUgZ2l2ZW4gZWxlbWVudCwgZm9yIHVzZSBpbiB0aGUKLQkgKiBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgVGhlIHZpZXdlciB0aGF0IGRpc3BsYXlzIHRoZSBlbGVtZW50LgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBUaGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dC4gRWxlbWVudCBjYW4KLQkgKiAgICAgICAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGluZGljYXRpbmcgbm8gaW5wdXQgb2JqZWN0IGlzIHNldCB0bwotCSAqICAgICAgICAgICAgdGhlIHZpZXdlci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihlbGVtZW50KTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJdGV4dCA9IGFkYXB0ZXIuZ2V0TGFiZWxUZXh0KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoaXMgbGFiZWwgcHJvdmlkZXIgaXMgYWZmZWN0ZWQgYnkgdGhlIGdpdmVuIGRvbWFpbgotCSAqIGV2ZW50LgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZmZlY3RlZChPYmplY3QgZHVtbXkpIHsvLyBEb21haW5FdmVudCBldmVudCkgewotCQkvLyByZXR1cm4gZXZlbnQuaXNNb2RpZmllcihEb21haW5FdmVudC5OT05fU1RSVUNUVVJFX0NIQU5HRSk7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCBieSBhIGNoYW5nZSB0byB0aGUgZ2l2ZW4KLQkgKiBwcm9wZXJ0eSBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBvcHRpbWl6ZSBhCi0JICogbm9uLXN0cnVjdHVyYWwgdmlld2VyIHVwZGF0ZS4gSWYgdGhlIHByb3BlcnR5IG1lbnRpb25lZCBpbiB0aGUgdXBkYXRlCi0JICogZG9lcyBub3QgYWZmZWN0IHRoZSBsYWJlbCwgdGhlbiB0aGUgdmlld2VyIG5lZWQgbm90IHVwZGF0ZSB0aGUgbGFiZWwuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHBhcmFtIHByb3BlcnR5Ci0JICogICAgICAgICAgICB0aGUgcHJvcGVydHkKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBsYWJlbCB3b3VsZCBiZSBhZmZlY3RlZCwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gaWYgaXQgd291bGQgYmUgdW5hZmZlY3RlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9jb250ZW50b3V0bGluZS9Tb3J0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkYTMxODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvY3NzL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuQ1NTVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLkNTU1VJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuZWRpdG9yLkNTU0VkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uOwotCi0vKgotICogQmFzZWQgb24gRFREQ29udGVudE91dGxpbmVQYWdlI1NvcnRBY3Rpb24KLSAqLwotY2xhc3MgU29ydEFjdGlvbiBleHRlbmRzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIHsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcjsKLQotCXB1YmxpYyBTb3J0QWN0aW9uKFRyZWVWaWV3ZXIgdmlld2VyLCBJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZUtleSkgewotCQlzdXBlcihDU1NVSU1lc3NhZ2VzLlNvcnRBY3Rpb25fMCwgc3RvcmUsIHByZWZlcmVuY2VLZXksIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihDU1NVSVBsdWdpbi5JRCwgQ1NTRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfU09SVCk7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihkZXNjKTsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJdHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJaWYgKGlzQ2hlY2tlZCgpKSB7Ci0JCQl0cmVlVmlld2VyLnNldENvbXBhcmF0b3IobmV3IFZpZXdlckNvbXBhcmF0b3IoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQlPYmplY3RbXSBleHBhbmRlZEVsZW1lbnRzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZEVsZW1lbnRzKCk7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG51bGwpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQodHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkRWxlbWVudHMpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvdWkvdmlld3MvcHJvcGVydGllcy9DU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGMxZmE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS92aWV3cy9wcm9wZXJ0aWVzL0NTU1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb3BlcnRpZXMuQ1NTUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIHByb3BlcnR5IHNoZWV0IHBhZ2Ugd2hpY2ggc2hvd3MgQ1NTIGNvbnRlbnQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBleHRlbmRzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIGNsYXNzIENTU1Byb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSAhPSBudWxsKSB7Ci0JCQkJZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKS5hZGRQcm9wZXJ0eVNoZWV0UGFnZShmUHJvcGVydHlTaGVldFBhZ2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDU1NQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgewotCQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZSBmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQlwcml2YXRlIElDU1NOb2RlIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZTb3VyY2UgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJQ1NTTm9kZSlvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbmV3IENTU1Byb3BlcnR5U291cmNlKGZTb3VyY2UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlNvdXJjZSA9IG51bGw7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJCX0KLQkJCXJldHVybiBmUHJvcGVydHlTb3VyY2U7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFByb3BlcnRpZXNSZWZyZXNoSm9iIGV4dGVuZHMgVUlKb2IgewotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVUERBVEVfREVMQVkgPSAyMDA7Ci0KLQkJcHJpdmF0ZSBTZXQgcHJvcGVydHlTaGVldFBhZ2VzID0gbnVsbDsKLQotCQlwdWJsaWMgUHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCQlzdXBlcihYTUxVSU1lc3NhZ2VzLkpGYWNlTm9kZUFkYXB0ZXJfMSk7Ci0JCQlzZXRTeXN0ZW0odHJ1ZSk7Ci0JCQlzZXRQcmlvcml0eShKb2IuU0hPUlQpOwotCQkJcHJvcGVydHlTaGVldFBhZ2VzID0gbmV3IEhhc2hTZXQoMSk7Ci0JCX0KLQotCQl2b2lkIGFkZFByb3BlcnR5U2hlZXRQYWdlKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKSB7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuYWRkKHBhZ2UpOwotCQkJc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlPYmplY3RbXSBwYWdlcyA9IHByb3BlcnR5U2hlZXRQYWdlcy50b0FycmF5KCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMuY2xlYXIoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UgPSAoUHJvcGVydHlTaGVldFBhZ2UpIHBhZ2VzW2ldOwotCQkJCWlmIChwYWdlLmdldENvbnRyb2woKSAhPSBudWxsICYmICFwYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJcGFnZS5yZWZyZXNoKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCX0KLQotCXByaXZhdGUgUHJvcGVydGllc1JlZnJlc2hKb2IgZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbnVsbDsKLQotCUlQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbnVsbDsKLQotCXByaXZhdGUgSU5vZGVBZGFwdGVyIGZSZWZyZXNoQWRhcHRlciA9IG5ldyBDU1NQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIoKTsKLQotCXByaXZhdGUgSU5vZGVOb3RpZmllcltdIGZTZWxlY3RlZE5vdGlmaWVyczsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ1NTUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gcmVtb3ZlIFVJIHJlZnJlc2ggYWRhcHRlcnMKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzdXBlci5nZXRJbnB1dFNlbGVjdGlvbihzZWxlY3RpbmdQYXJ0LCBzZWxlY3Rpb24pOwotCQlpZiAocHJlZmVycmVkU2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCU9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cyA9IG5ldyBPYmplY3RbKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCldOwotCQkJU3lzdGVtLmFycmF5Y29weSgoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKSwgMCwgc2VsZWN0ZWRPYmplY3RzLCAwLCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElDU1NOb2RlKSB7Ci0JCQkJCUlDU1NOb2RlIG5vZGUgPSAoSUNTU05vZGUpIHNlbGVjdGVkT2JqZWN0c1tpXTsKLQkJCQkJd2hpbGUgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5QUklNSVRJVkVWQUxVRV9OT0RFIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBJQ1NTTm9kZS5TVFlMRURFQ0xJVEVNX05PREUpIHsKLQkJCQkJCW5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCXNlbGVjdGVkT2JqZWN0c1tpXSA9IG5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8qCi0JCQkgKiBBZGQgVUkgcmVmcmVzaCBhZGFwdGVycyBhbmQgcmVtZW1iZXIgbm90aWZpZXJzIGZvciBsYXRlcgotCQkJICogcmVtb3ZhbAotCQkJICovCi0JCQlpZiAoc2VsZWN0ZWRPYmplY3RzLmxlbmd0aCA+IDApIHsKLQkJCQlMaXN0IHNlbGVjdGVkTm90aWZpZXJzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHNlbGVjdGVkT2JqZWN0cy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoc2VsZWN0ZWRPYmplY3RzW2ldIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJc2VsZWN0ZWROb3RpZmllcnMuYWRkKHNlbGVjdGVkT2JqZWN0c1tpXSk7Ci0JCQkJCQkoKElOb2RlTm90aWZpZXIpIHNlbGVjdGVkT2JqZWN0c1tpXSkuYWRkQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZTZWxlY3RlZE5vdGlmaWVycyA9IChJTm9kZU5vdGlmaWVyW10pIHNlbGVjdGVkTm90aWZpZXJzLnRvQXJyYXkobmV3IElOb2RlTm90aWZpZXJbc2VsZWN0ZWROb3RpZmllcnMuc2l6ZSgpXSk7Ci0JCQl9Ci0JCQlwcmVmZXJyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE9iamVjdHMpOwotCQl9Ci0JCXJldHVybiBwcmVmZXJyZWRTZWxlY3Rpb247Ci0JfQotCi0JUHJvcGVydGllc1JlZnJlc2hKb2IgZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUHJvcGVydGllc1JlZnJlc2hKb2IgPT0gbnVsbCkgewotCQkJZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbmV3IFByb3BlcnRpZXNSZWZyZXNoSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYjsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlpZiAoZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPSBuZXcgQ1NTUHJvcGVydHlTb3VyY2VQcm92aWRlcigpOwotCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gcGFnZTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWlmIChmU2VsZWN0ZWROb3RpZmllcnMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWROb3RpZmllcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlmU2VsZWN0ZWROb3RpZmllcnNbaV0ucmVtb3ZlQWRhcHRlcihmUmVmcmVzaEFkYXB0ZXIpOwotCQkJfQotCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gbnVsbDsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5jc3MudWkvdGVtcGxhdGVzL2Nzc2RlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjgyZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVRlbXBsYXRlcy5uZXdjc3MubmFtZT1OZXcgQ1NTIEZpbGUKLVRlbXBsYXRlcy5uZXdjc3MuZGVzYz1uZXcgY3NzIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmNzcy51aS90ZW1wbGF0ZXMvY3NzZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjcyMGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuY3NzLnVpL3RlbXBsYXRlcy9jc3NkZWZhdWx0LXRlbXBsYXRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08dGVtcGxhdGVzPgotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMubmV3Y3NzLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLm5ld2Nzcy5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC50ZW1wbGF0ZXMubmV3Y3NzIiBjb250ZXh0PSJjc3NfbmV3IiBlbmFibGVkPSJ0cnVlIj5AQ0hBUlNFVCAiJHtlbmNvZGluZ30iOzwvdGVtcGxhdGU+Ci08L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTYxMDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMvIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9InNyYyIgcGF0aD0iY29udGVudG1vZGVsLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9ImVtZm1vZGVsLyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNheHBhcnNlci8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMtdmFsaWRhdGlvbiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJjb24iIHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJvdXRwdXQiIHBhdGg9ImJpbiIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDZhMTM5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXJ1bnRpbWUKLWR0ZGNvcmUuamFyCi0qLnppcAotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotQGRvdAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYyNDllNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJjNDMwZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjozMTo0MyBFRFQgMjAwNg0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjINCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDANCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFjZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNg0KLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MA0KLWNvbXBpbGVycy5wLmJ1aWxkPTANCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTENCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wDQotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTANCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MA0KLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wDQotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTANCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MA0KLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlDQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUzMGQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjEwMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50b2tlbml6ZXI7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQsCi0gcm9zZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb247YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzMzNDNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBjb250ZW50bW9kZWwvLFwKLSAgICAgICAgICAgZW1mbW9kZWwvLFwKLSAgICAgICAgICAgc2F4cGFyc2VyLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRjMTJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QuZHRkIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL2R0ZC9vdmVydmlldy5odG1sIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkRURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudEZhY3RvcnlEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRGYWN0b3J5RFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjVmMTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudEZhY3RvcnlEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeS5DTURvY3VtZW50RmFjdG9yeTsKLQotLyoqCi0gKiBUaGlzIGJ1aWxkZXIgaGFuZGxlcyBidWlsZGluZyAuZHRkIGdyYW1tYXIgZmlsZXMKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRGYWN0b3J5RFREIGltcGxlbWVudHMgQ01Eb2N1bWVudEZhY3RvcnkgewotCXB1YmxpYyBDTURvY3VtZW50RmFjdG9yeURURCgpIHsKLQl9Ci0KLQotCXB1YmxpYyBDTURvY3VtZW50IGNyZWF0ZUNNRG9jdW1lbnQoU3RyaW5nIHVyaSkgewotCQkvLyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBvdXIgcGFyc2VycwotCQkvLyB0b2RvLi4uIHJldmlzaXQgdGhpcwotCQkvLwotLy8JCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDA0ODEKLS8vCQlTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6IjsgLy8kTk9OLU5MUy0xJAotLy8JCWlmICh1cmkuc3RhcnRzV2l0aChmaWxlUHJvdG9jb2wpKSB7Ci0vLwkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoZmlsZVByb3RvY29sLmxlbmd0aCgpKTsKLS8vCQl9Ci0KLQkJQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gRFRESW1wbC5idWlsZENNRG9jdW1lbnQodXJpKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImNvdWxkIG5vdCBjcmVhdGUgY29udGVudCBtb2RlbCBmb3IgVVJJOiAiICsgdXJpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjVkMjE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGVJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBDTU5vZGUgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT04gPSAiZG9jdW1lbnRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ET0NVTUVOVEFUSU9OX1NPVVJDRSA9ICJkb2N1bWVudGF0aW9uU291cmNlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UgPSAiZG9jdW1lbnRhdGlvbkxhbmd1YWdlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX01PRl9OT1RJRklFUiA9ICJrZXkiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uSW5mbyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERUZJTklUSU9OID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIGFic3RyYWN0IE9iamVjdCBnZXRLZXkoKTsKLQotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTU9GX05PVElGSUVSKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IG9iamVjdCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RUREltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2NvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RUREltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM4OTFkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9EVERJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuaW1wbC5BZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERCYXNpY1R5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFRETWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRGF0YVR5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbnRpdHlEZWNsYXJhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci0KLQotcHVibGljIGNsYXNzIERUREltcGwgewotCXN0YXRpYyB7Ci0JCS8vIENhbGwgaW5pdCBvbiB0aGUgRFREIHBhY2thZ2UgdG8gYXZvaWQgc3RyYW5nZSBpbml0aWFsaXphdGlvbiBidWdzCi0JCS8vCi0JCURURFBhY2thZ2VJbXBsLmluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIERUREFkYXB0ZXJGYWN0b3J5SW1wbCBkdGRBZGFwdGVyRmFjdG9yeUltcGwgPSBuZXcgRFREQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JcHJvdGVjdGVkIHN0YXRpYyBDTURhdGFUeXBlSW5mb1RhYmxlIGNtRGF0YVR5cGVJbmZvVGFibGUgPSBuZXcgQ01EYXRhVHlwZUluZm9UYWJsZSgpOwotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGJ1aWxkQ01Eb2N1bWVudChTdHJpbmcgdXJpKSB7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGJ1aWxkRFRETW9kZWwodXJpKTsKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZHRkRmlsZSk7Ci0JCQotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERUREZpbGUgYnVpbGREVERNb2RlbChTdHJpbmcgdXJpKSB7Ci0JCURURFV0aWwgZHRkVXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JCWR0ZFV0aWwuc2V0ZXhwYW5kRW50aXR5UmVmZXJlbmNlcyh0cnVlKTsKLQkJZHRkVXRpbC5wYXJzZShuZXcgUmVzb3VyY2VTZXRJbXBsKCksIHVyaSk7Ci0JCXJldHVybiBkdGRVdGlsLmdldERUREZpbGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KERUREZpbGUgZHRkRmlsZSkgewotCQlyZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoZHRkRmlsZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTU5vZGUgZ2V0QWRhcHRlcihOb3RpZmllciBvKSB7Ci0JCXJldHVybiAoQ01Ob2RlKSBkdGRBZGFwdGVyRmFjdG9yeUltcGwuYWRhcHQobyk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgZ2V0TWluT2NjdXJIZWxwZXIoRFREUmVwZWF0YWJsZUNvbnRlbnQgY29udGVudCkgewotCQlpbnQgb2NjdXJlbmNlID0gY29udGVudC5nZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKTsKLQkJYm9vbGVhbiBpc09wdGlvbmFsID0gKG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTCB8fCBvY2N1cmVuY2UgPT0gRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJcmV0dXJuIGlzT3B0aW9uYWwgPyAwIDogMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBnZXRNYXhPY2N1ckhlbHBlcihEVERSZXBlYXRhYmxlQ29udGVudCBjb250ZW50KSB7Ci0JCWludCBvY2N1cmVuY2UgPSBjb250ZW50LmdldE9jY3VycmVuY2UoKS5nZXRWYWx1ZSgpOwotCQlib29sZWFuIGlzTXVsdGkgPSAob2NjdXJlbmNlID09IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFIHx8IG9jY3VyZW5jZSA9PSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkUpOwotCQlyZXR1cm4gaXNNdWx0aSA/IC0xIDogMTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCQlBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAodGFyZ2V0ICE9IG51bGwpIHsKLQkJCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFREQXR0cmlidXRlKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBEVERBdHRyaWJ1dGVBZGFwdGVyKChEVERBdHRyaWJ1dGUpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREVsZW1lbnQpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREVsZW1lbnRBZGFwdGVyKChEVERFbGVtZW50KSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodGFyZ2V0IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRERmlsZUFkYXB0ZXIoKERUREZpbGUpIHRhcmdldCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHRhcmdldCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJCQlyZXN1bHQgPSBuZXcgRFRER3JvdXBDb250ZW50QWRhcHRlcigoRFRER3JvdXBDb250ZW50KSB0YXJnZXQpOwotCQkJCX0KLQkJCQllbHNlIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCQkJcmVzdWx0ID0gbmV3IERUREVudGl0eUFkYXB0ZXIoKERUREVudGl0eSkgdGFyZ2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCQlyZXR1cm4gYWRhcHQodGFyZ2V0LCB0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIERUREJhc2VBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBEVERCYXNlQWRhcHRlciBleHRlbmRzIENNTm9kZUltcGwgewotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gdHlwZSA9PSBkdGRBZGFwdGVyRmFjdG9yeUltcGw7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoIkNNRG9jdW1lbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudCgpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSkgewotCQkJCXJlc3VsdCA9IGdldERvY3VtZW50YXRpb24oKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSkgewotCQkJCXJlc3VsdCA9IGdldERlZmluaXRpb25JbmZvKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0RGVmaW5pdGlvbigpOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0S2V5KCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJzcGVjIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdldFNwZWMoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoKTsKLQkJCQkJaWYgKGNtRG9jdW1lbnQgaW5zdGFuY2VvZiBEVERGaWxlQWRhcHRlcikgewotCQkJCQkJQW5ub3RhdGlvbk1hcCBtYXAgPSAoKERUREZpbGVBZGFwdGVyKSBjbURvY3VtZW50KS5hbm5vdGF0aW9uTWFwOwotCQkJCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJCQkJU3RyaW5nIHNwZWMgPSBnZXRTcGVjKCk7Ci0JCQkJCQkJaWYgKHNwZWMgIT0gbnVsbCkgewotCQkJCQkJCQlyZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoZ2V0U3BlYygpLCBwcm9wZXJ0eU5hbWUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCQkJCU1hcCBnbG9iYWxQcm9wZXJ0eU1hcCA9ICgoRFRERmlsZUFkYXB0ZXIpIGNtRG9jdW1lbnQpLmdsb2JhbFByb3BlcnR5TWFwOwotCQkJCQkJCXJlc3VsdCA9IGdsb2JhbFByb3BlcnR5TWFwLmdldChwcm9wZXJ0eU5hbWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKSB7Ci0JCQlyZXR1cm4gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpIHsKLQkJCXJldHVybiBnZXROb2RlTmFtZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRFREQXR0cmlidXRlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFREQXR0cmlidXRlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBEVERBdHRyaWJ1dGUgYXR0cmlidXRlOwotCQlwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLQotCQlwdWJsaWMgRFREQXR0cmlidXRlQWRhcHRlcihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCQl0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKLQkJCWRhdGFUeXBlID0gbmV3IERhdGFUeXBlSW1wbCgpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRTcGVjKCkgewotCQkJcmV0dXJuIGF0dHJpYnV0ZS5nZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpICsgIi9AIiArIGF0dHJpYnV0ZS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQVRUUklCVVRFX0RFQ0xBUkFUSU9OOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCQlyZXR1cm4gZGF0YVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCX0KLQotCQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCQlyZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oYXR0cmlidXRlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQkJaW50IHVzYWdlID0gT1BUSU9OQUw7Ci0JCQlzd2l0Y2ggKGF0dHJpYnV0ZS5nZXREZWZhdWx0S2luZCgpLmdldFZhbHVlKCkpIHsKLQkJCQljYXNlIERURERlZmF1bHRLaW5kLlJFUVVJUkVEIDogewotCQkJCQl1c2FnZSA9IFJFUVVJUkVEOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEVEREZWZhdWx0S2luZC5GSVhFRCA6IHsKLQkJCQkJdXNhZ2UgPSBGSVhFRDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHVzYWdlOwotCQl9Ci0KLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJCURUREZpbGUgZHRkRmlsZSA9IGF0dHJpYnV0ZS5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpOwotCQkJcmV0dXJuIGR0ZEZpbGUgIT0gbnVsbCA/IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBjbGFzcyBEYXRhVHlwZUltcGwgaW1wbGVtZW50cyBDTURhdGFUeXBlIHsKLQkJCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQkJcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQkJcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCi0JCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaXNWYWxpZEVtcHR5VmFsdWUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZyBkYXRhVHlwZU5hbWUgPSBnZXREYXRhVHlwZU5hbWUoKTsKLQkJCQkJcmVzdWx0ID0gKGRhdGFUeXBlTmFtZSA9PSBudWxsIHx8IGRhdGFUeXBlTmFtZS5lcXVhbHMoQ01EYXRhVHlwZS5DREFUQSkpID8gInRydWUiIDogImZhbHNlIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQkJCXJldHVybiBjbURhdGFUeXBlSW5mb1RhYmxlLmdldERhdGFUeXBlTmFtZShhdHRyaWJ1dGUuZ2V0RFREVHlwZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKSB7Ci0JCQkJcmV0dXJuIGNtRGF0YVR5cGVJbmZvVGFibGUuZ2V0SW5zdGFuY2VWYWx1ZShhdHRyaWJ1dGUuZ2V0RFREVHlwZSgpKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkgewotCQkJCWludCByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW50IGRlZmF1bHRWYWx1ZUtpbmQgPSBhdHRyaWJ1dGUuZ2V0RGVmYXVsdEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChkZWZhdWx0VmFsdWVLaW5kID09IERURERlZmF1bHRLaW5kLk5PRklYRUQpIHsKLQkJCQkJcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9ERUZBVUxUOwotCQkJCX0KLQkJCQllbHNlIGlmIChkZWZhdWx0VmFsdWVLaW5kID09IERURERlZmF1bHRLaW5kLkZJWEVEKSB7Ci0JCQkJCXJlc3VsdCA9IElNUExJRURfVkFMVUVfRklYRUQ7Ci0JCQkJfQotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkgewotCQkJCXJldHVybiBhdHRyaWJ1dGUuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQkJCU9iamVjdFtdIG9iamVjdExpc3QgPSBhdHRyaWJ1dGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpLnRvQXJyYXkoKTsKLQkJCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW29iamVjdExpc3QubGVuZ3RoXTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdExpc3QubGVuZ3RoOyBpKyspIHsKLQkJCQkJcmVzdWx0W2ldID0gb2JqZWN0TGlzdFtpXS50b1N0cmluZygpOwotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBEVERFbGVtZW50QmFzZUFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIERUREVsZW1lbnRCYXNlQWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCQlwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLQotCQlwcm90ZWN0ZWQgYWJzdHJhY3QgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkJcHJvdGVjdGVkIENNRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uID0gbnVsbDsKLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIEVMRU1FTlRfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCk7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJCUNNTmFtZWROb2RlTWFwSW1wbCByZXN1bHQgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQlMaXN0IGF0dHJpYnV0ZUxpc3QgPSBnZXREVERFbGVtZW50KCkuZ2V0RFREQXR0cmlidXRlKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCURUREF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCQlyZXN1bHQuZ2V0SGFzaHRhYmxlKCkucHV0KGF0dHJpYnV0ZS5nZXROYW1lKCksIGdldEFkYXB0ZXIoYXR0cmlidXRlKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQkJcmV0dXJuIChDTUNvbnRlbnQpIGdldEFkYXB0ZXIoZ2V0RFRERWxlbWVudCgpLmdldENvbnRlbnQoKSk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQkJLy8gdG9kbwotCQkJaW50IHJlc3VsdCA9IEVMRU1FTlQ7Ci0JCQlEVERFbGVtZW50Q29udGVudCBkdGRFbGVtZW50Q29udGVudCA9IGdldERUREVsZW1lbnQoKS5nZXRDb250ZW50KCk7Ci0JCQlpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50KSB7Ci0JCQkJcmVzdWx0ID0gUENEQVRBOwotCQkJfQotCQkJZWxzZSBpZiAoZHRkRWxlbWVudENvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQlEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gKERUREdyb3VwQ29udGVudCkgZHRkRWxlbWVudENvbnRlbnQ7Ci0JCQkJaW50IGdyb3VwS2luZCA9IGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpOwotCQkJCWlmIChncm91cEtpbmQgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSkgewotCQkJCQlMaXN0IGxpc3QgPSBncm91cENvbnRlbnQuZ2V0Q29udGVudCgpOwotCQkJCQlpZiAobGlzdC5zaXplKCkgPiAwICYmIGxpc3QuZ2V0KDApIGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJCQkJcmVzdWx0ID0gTUlYRUQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCQlyZXN1bHQgPSBBTlk7Ci0JCQl9Ci0JCQllbHNlIGlmIChkdGRFbGVtZW50Q29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJCXJlc3VsdCA9IEVNUFRZOwotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBnZXREVERFbGVtZW50KCkuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKSB7Ci0JCQlpbnQgY29udGVudFR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJYm9vbGVhbiBoYXNEYXRhVHlwZSA9IGNvbnRlbnRUeXBlID09IFBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBNSVhFRDsKLQkJCXJldHVybiBoYXNEYXRhVHlwZSA/IGRhdGFUeXBlIDogbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIENNTmFtZWROb2RlTWFwSW1wbC5FTVBUWV9OQU1FRF9OT0RFX01BUDsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCQlEVERGaWxlIGR0ZEZpbGUgPSBnZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpOwotCQkJcmV0dXJuIGR0ZEZpbGUgIT0gbnVsbCA/IChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGR0ZEZpbGUpIDogbnVsbDsKLQkJfQotCi0JCXByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKSB7Ci0JCQlDTU5vZGVMaXN0SW1wbCBub2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJaWYgKGRvY3VtZW50YXRpb24gPT0gbnVsbCkgewotCQkJCVN0cmluZyBjb21tZW50ID0gZ2V0RFRERWxlbWVudCgpLmdldENvbW1lbnQoKTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29tbWVudCwgIlxuIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotCQkJCQkJdmFsdWUgKz0gc3QubmV4dFRva2VuKCkudHJpbSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWRvY3VtZW50YXRpb24gPSBuZXcgQ01Eb2N1bWVudGF0aW9uSW1wbCh2YWx1ZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRvY3VtZW50YXRpb24gIT0gbnVsbCkgewotCQkJCW5vZGVMaXN0LmdldExpc3QoKS5hZGQoZG9jdW1lbnRhdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ01Eb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbiB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLQkJcHVibGljIENNRG9jdW1lbnRhdGlvbkltcGwoU3RyaW5nIHZhbHVlKSB7Ci0JCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQkJcmV0dXJuIERPQ1VNRU5UQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJCXJldHVybiB2YWx1ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREVsZW1lbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbGVtZW50QWRhcHRlciBleHRlbmRzIERUREVsZW1lbnRCYXNlQWRhcHRlciB7Ci0JCXByb3RlY3RlZCBEVERFbGVtZW50IGVsZW1lbnQ7Ci0KLQkJcHVibGljIERUREVsZW1lbnRBZGFwdGVyKERUREVsZW1lbnQgZWxlbWVudCkgewotCQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJCWRhdGFUeXBlID0gbmV3IENNRGF0YVR5cGVJbXBsKCIjUENEQVRBIiwgZ2V0RFRERWxlbWVudCgpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCkgewotCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIDE7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkgewotCQkJcmV0dXJuICJnbG9iYWwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKSB7Ci0JCQlyZXR1cm4gdGhpczsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBjbGFzcyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIgZXh0ZW5kcyBEVERFbGVtZW50QmFzZUFkYXB0ZXIgewotCQlwcm90ZWN0ZWQgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY29udGVudDsKLQotCQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGNvbnRlbnQpIHsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCQlkYXRhVHlwZSA9IG5ldyBDTURhdGFUeXBlSW1wbCgiI1BDREFUQSIsIGdldERUREVsZW1lbnQoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHJvdGVjdGVkIERUREVsZW1lbnQgZ2V0RFRERWxlbWVudCgpIHsKLQkJCXJldHVybiBjb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1pbk9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJCXJldHVybiBnZXRNYXhPY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0KLQkJcHVibGljIENNTm9kZSBnZXREZWZpbml0aW9uKCkgewotCQkJcmV0dXJuIGdldEFkYXB0ZXIoZ2V0RFRERWxlbWVudCgpKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRFRERW50aXR5QWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERW50aXR5QWRhcHRlciBleHRlbmRzIERUREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01FbnRpdHlEZWNsYXJhdGlvbiB7Ci0JCXByb3RlY3RlZCBEVERFbnRpdHkgZHRkRW50aXR5OwotCi0JCXB1YmxpYyBEVERFbnRpdHlBZGFwdGVyKERUREVudGl0eSBkdGRFbnRpdHkpIHsKLQkJCXRoaXMuZHRkRW50aXR5ID0gZHRkRW50aXR5OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBFTlRJVFlfREVDTEFSQVRJT047Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBkdGRFbnRpdHk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCQlyZXR1cm4gZHRkRW50aXR5LmdldE5hbWUoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCQlTdHJpbmcgdmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGR0ZEVudGl0eS5nZXRDb250ZW50KCkgaW5zdGFuY2VvZiBEVERJbnRlcm5hbEVudGl0eSkgewotCQkJCURUREludGVybmFsRW50aXR5IGNvbnRlbnQgPSAoRFRESW50ZXJuYWxFbnRpdHkpIGR0ZEVudGl0eS5nZXRDb250ZW50KCk7Ci0JCQkJdmFsdWUgPSBjb250ZW50LmdldFZhbHVlKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIERUREdyb3VwQ29udGVudEFkYXB0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIERUREdyb3VwQ29udGVudEFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNR3JvdXAgewotCQlwcm90ZWN0ZWQgRFRER3JvdXBDb250ZW50IGNvbnRlbnQ7Ci0KLQkJcHVibGljIERUREdyb3VwQ29udGVudEFkYXB0ZXIoRFRER3JvdXBDb250ZW50IGNvbnRlbnQpIHsKLQkJCXRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldEtleSgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBHUk9VUDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlDTURlc2NyaXB0aW9uQnVpbGRlciBkZXNjcmlwdGlvbkJ1aWxkZXIgPSBuZXcgQ01EZXNjcmlwdGlvbkJ1aWxkZXIoKTsKLQkJCXJldHVybiBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCQlMaXN0IGxpc3QgPSBjb250ZW50LmdldENvbnRlbnQoKTsKLQkJCUNNTm9kZUxpc3RJbXBsIHJlc3VsdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlDTU5vZGUgbm9kZSA9IGdldEFkYXB0ZXIoKE5vdGlmaWVyKSBpLm5leHQoKSk7Ci0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQuZ2V0TGlzdCgpLmFkZChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQotCQlwdWJsaWMgaW50IGdldE1heE9jY3VyKCkgewotCQkJcmV0dXJuIGdldE1heE9jY3VySGVscGVyKGNvbnRlbnQpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJCXJldHVybiBnZXRNaW5PY2N1ckhlbHBlcihjb250ZW50KTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCQkvLyB0b2RvLi4uIGhhbmRsZSBBTE9ORSBjYXNlIGJ5IGNoZWNraWcgaWYgY2hpbGQgY291bnQgPT0gMQotCQkJaW50IGdyb3VwS2luZCA9IGNvbnRlbnQuZ2V0R3JvdXBLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJCXJldHVybiAoZ3JvdXBLaW5kID09IERUREdyb3VwS2luZC5DSE9JQ0UpID8gQ0hPSUNFIDogU0VRVUVOQ0U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEVERGaWxlQWRhcHRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgY2xhc3MgRFRERmlsZUFkYXB0ZXIgZXh0ZW5kcyBEVERCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQgewotCQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9PVF9OQU1FID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZhdWx0Um9vdE5hbWUiOyAvLyROT04tTkxTLTEkCi0KLQkJcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQkJcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBuYW1lZE5vZGVNYXA7Ci0JCXByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgZW50aXR5Tm9kZU1hcDsKLQotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwID0gbmV3IEFubm90YXRpb25NYXAoKTsKLQkJcHJvdGVjdGVkIE1hcCBnbG9iYWxQcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHVibGljIERUREZpbGVBZGFwdGVyKERUREZpbGUgZHRkRmlsZSkgewotCQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgewotCQkJcmV0dXJuIGR0ZEZpbGU7Ci0JCX0KLQotCQlwdWJsaWMgQW5ub3RhdGlvbk1hcCBnZXRBbm5vdGF0aW9uTWFwKCkgewotCQkJcmV0dXJuIGFubm90YXRpb25NYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCQlpZiAobmFtZWROb2RlTWFwID09IG51bGwpIHsKLQkJCQluYW1lZE5vZGVNYXAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KSB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IChEVERFbGVtZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCW5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoZHRkRWxlbWVudC5nZXROYW1lKCksIGdldEFkYXB0ZXIoZHRkRWxlbWVudCkpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuYW1lZE5vZGVNYXA7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCQlpZiAoZW50aXR5Tm9kZU1hcCA9PSBudWxsKSB7Ci0JCQkJZW50aXR5Tm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkJCS8vIGFkZCB0aGUgYnVpbHQgaW4gZW50aXR5IGRlY2xhcmF0aW9ucwotCQkJCS8vCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImFtcCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYW1wIiwgIiYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoImx0IiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJsdCIsICI8IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCWVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJndCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiZ3QiLCAiPiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgicXVvdCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgicXVvdCIsICJcIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgiYXBvcyIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiYXBvcyIsICInIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCQkJZm9yIChJdGVyYXRvciBpID0gZHRkRmlsZS5saXN0RFRERW50aXR5KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCURUREVudGl0eSBkdGRFbnRpdHkgPSAoRFRERW50aXR5KSBpLm5leHQoKTsKLQkJCQkJaWYgKCFkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBkdGRFbnRpdHkuZ2V0TmFtZSgpICE9IG51bGwpIHsKLQkJCQkJCS8vIGZvciBub3cuLi4ganVzdCBoYW5kbGUgRFRESW50ZXJuYWxFbnRpdHkKLQkJCQkJCS8vCi0JCQkJCQlpZiAoZHRkRW50aXR5LmdldENvbnRlbnQoKSBpbnN0YW5jZW9mIERUREludGVybmFsRW50aXR5KSB7Ci0JCQkJCQkJZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoZHRkRW50aXR5LmdldE5hbWUoKSwgZ2V0QWRhcHRlcihkdGRFbnRpdHkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBlbnRpdHlOb2RlTWFwOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBET0NVTUVOVDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gZHRkRmlsZS5nZXROYW1lKCkgKyAiLmR0ZCI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhERUZBVUxUX1JPT1RfTkFNRSkpIHsKLQkJCQlEVERNZXRyaWNzIG1ldHJpY3MgPSBuZXcgRFRETWV0cmljcyhkdGRGaWxlKTsKLQkJCQlEVERFbGVtZW50IGR0ZEVsZW1lbnQgPSBtZXRyaWNzLmdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnQoKTsKLQkJCQlpZiAoZHRkRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IGR0ZEVsZW1lbnQuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFubm90YXRpb25NYXAiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmVzdWx0ID0gYW5ub3RhdGlvbk1hcDsKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImdsb2JhbFByb3BlcnR5TWFwIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGdsb2JhbFByb3BlcnR5TWFwOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgQ01EYXRhVHlwZUluZm9UYWJsZSB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBpbnN0YW5jZVZhbHVlVGFibGU7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBkYXRhVHlwZU5hbWVUYWJsZTsKLQotCQlwdWJsaWMgQ01EYXRhVHlwZUluZm9UYWJsZSgpIHsKLQkJCS8vIGhhc2h0YWJsZS5wdXQoRFREVHlwZS5DREFUQSwgbnVsbCkpOwotCQkJaW5zdGFuY2VWYWx1ZVRhYmxlID0gbmV3IFN0cmluZ1tEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZUtpbmRzLmxlbmd0aF07Ci0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5FTlRJVFldID0gImVudGl0eSI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTXSA9ICJlbnRpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQkJCWluc3RhbmNlVmFsdWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5dID0gIm5tdG9rZW4iOyAvLyROT04tTkxTLTEkCi0JCQlpbnN0YW5jZVZhbHVlVGFibGVbRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOU10gPSAibm10b2tlbnMiOyAvLyROT04tTkxTLTEkCi0KLQkJCWRhdGFUeXBlTmFtZVRhYmxlID0gbmV3IFN0cmluZ1tEVERCYXNpY1R5cGVJbXBsLmJhc2ljVHlwZUtpbmRzLmxlbmd0aF07Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkNEQVRBXSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEXSA9IENNRGF0YVR5cGUuSUQ7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLklEUkVGXSA9IENNRGF0YVR5cGUuSURSRUY7Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLkVOVElUWV0gPSBDTURhdGFUeXBlLkVOVElUWTsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuRU5USVRJRVNdID0gQ01EYXRhVHlwZS5FTlRJVElFUzsKLQkJCWRhdGFUeXBlTmFtZVRhYmxlW0RUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl0gPSBDTURhdGFUeXBlLk5NVE9LRU47Ci0JCQlkYXRhVHlwZU5hbWVUYWJsZVtEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5TXSA9IENNRGF0YVR5cGUuTk1UT0tFTlM7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldEluc3RhbmNlVmFsdWUoRFREVHlwZSBkdGRUeXBlKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJaW50IGtpbmQgPSAoKERUREJhc2ljVHlwZSkgZHRkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtpbmQgPj0gMCAmJiBraW5kIDwgRFREQmFzaWNUeXBlSW1wbC5iYXNpY1R5cGVEZXNjcmlwdGlvbnMubGVuZ3RoKSB7Ci0JCQkJCXJlc3VsdCA9IGluc3RhbmNlVmFsdWVUYWJsZVtraW5kXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoRFREVHlwZSBkdGRUeXBlKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChkdGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKSB7Ci0JCQkJaW50IGtpbmQgPSAoKERUREJhc2ljVHlwZSkgZHRkVHlwZSkuZ2V0S2luZCgpLmdldFZhbHVlKCk7Ci0JCQkJaWYgKGtpbmQgPj0gMCAmJiBraW5kIDwgRFREQmFzaWNUeXBlSW1wbC5iYXNpY1R5cGVEZXNjcmlwdGlvbnMubGVuZ3RoKSB7Ci0JCQkJCXJlc3VsdCA9IGRhdGFUeXBlTmFtZVRhYmxlW2tpbmRdOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGR0ZFR5cGUgaW5zdGFuY2VvZiBEVERFbnVtZXJhdGlvblR5cGUpIHsKLQkJCQlyZXN1bHQgPSBDTURhdGFUeXBlLkVOVU07Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBbnlDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREFueUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA2NTM5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREFueUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFueSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQW55Q29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERBbnlDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotfSAvLyBEVERBbnlDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREF0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljNWFlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5BdHRyaWJ1dGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRWYWx1ZVN0cmluZyA8ZW0+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50IDxlbT5EVEQgRWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERBdHRyaWJ1dGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREQXR0cmlidXRlIGV4dGVuZHMgRUF0dHJpYnV0ZSwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCS8vIE5PTi1HRU4gaW50ZXJmYWNlcyBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldAotCi0JcHVibGljIERURFR5cGUgZ2V0RFREVHlwZSgpOwotCi0JcHVibGljIHZvaWQgc2V0RFREVHlwZShEVERUeXBlIHR5cGUpOwotCi0JcHVibGljIHZvaWQgc2V0RFREQmFzaWNUeXBlKGludCB2YWx1ZSk7Ci0KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKFN0cmluZ1tdIGVudW1WYWx1ZXMsIGludCBlbnVtS2luZCk7Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBUaGUgbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmR9LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgS2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kCi0JICogQHNlZSAjc2V0RGVmYXVsdEtpbmQoRFRERGVmYXVsdEtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERGVmYXVsdEtpbmQgZ2V0RGVmYXVsdEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQKLQkgKiBAc2VlICNnZXREZWZhdWx0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RGVmYXVsdEtpbmQoRFRERGVmYXVsdEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZQotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXREZWZhdWx0VmFsdWVTdHJpbmcoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0VmFsdWVTdHJpbmcgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT4nCi0JICogICAgICAgICAgICBhdHRyaWJ1dGUuCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXREZWZhdWx0VmFsdWVTdHJpbmcoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogcmVmZXJlbmNlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQXR0cmlidXRlX0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBOYW1lIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqIHJlZmVyZW5jZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9lbT4nCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnRpdHkgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSA8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgRWxlbWVudDwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RFRERWxlbWVudChEVERFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9IkRUREF0dHJpYnV0ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREVERFbGVtZW50IDxlbT5EVEQgRWxlbWVudDwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVsZW1lbnQ8L2VtPicgY29udGFpbmVyCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RFRERWxlbWVudChEVERFbGVtZW50IHZhbHVlKTsKLQotfSAvLyBEVERBdHRyaWJ1dGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREJhc2ljVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDk5ODVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkJhc2ljIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREJhc2ljVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERCYXNpY1R5cGUgZXh0ZW5kcyBFQ2xhc3MsIERURFR5cGUgewotCS8vIE5PTi1HRU4gaW50ZXJmYWNlcyBEVERUeXBlCi0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVEZXNjcmlwdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlLiBUaGUKLQkgKiBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kfS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAc2VlICNzZXRLaW5kKERUREJhc2ljVHlwZUtpbmQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREQmFzaWNUeXBlX0tpbmQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERCYXNpY1R5cGVLaW5kIGdldEtpbmQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+S2luZDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRLaW5kKERUREJhc2ljVHlwZUtpbmQgdmFsdWUpOwotfSAvLyBEVERCYXNpY1R5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQmFzaWNUeXBlS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGVLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODIxNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERCYXNpY1R5cGVLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkJhc2ljIFR5cGUgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREJhc2ljVHlwZUtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERCYXNpY1R5cGVLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PTkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Q0RBVEE8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQ0RBVEFfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENEQVRBID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5JRFJFRjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJRFJFRl9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURSRUYgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SURSRUZTPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEUkVGU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURSRUZTID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOVElUWTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNFTlRJVFlfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWSA9IDU7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTlRJVElFUzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNFTlRJVElFU19MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRJRVMgPSA2OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk1UT0tFTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOTVRPS0VOX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOTVRPS0VOID0gNzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5NVE9LRU5TPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05NVE9LRU5TX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOTVRPS0VOUyA9IDg7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9ORQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBOT05FX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChOT05FLCAiTk9ORSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DREFUQTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkNEQVRBPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0NEQVRBCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIENEQVRBX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChDREFUQSwgIkNEQVRBIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIElEX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChJRCwgIklEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklEUkVGPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SURSRUY8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSURSRUYKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgSURSRUZfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKElEUkVGLCAiSURSRUYiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SURSRUZTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+SURSRUZTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lEUkVGUwotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBJRFJFRlNfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKElEUkVGUywgIklEUkVGUyIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5FTlRJVFk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5FTlRJVFk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRU5USVRZCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIEVOVElUWV9MSVRFUkFMID0gbmV3IERUREJhc2ljVHlwZUtpbmQoRU5USVRZLCAiRU5USVRZIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkVOVElUSUVTPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RU5USVRJRVM8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRU5USVRJRVMKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERUREJhc2ljVHlwZUtpbmQgRU5USVRJRVNfTElURVJBTCA9IG5ldyBEVERCYXNpY1R5cGVLaW5kKEVOVElUSUVTLCAiRU5USVRJRVMiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk1UT0tFTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5NVE9LRU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk1UT0tFTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBOTVRPS0VOX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChOTVRPS0VOLCAiTk1UT0tFTiIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OTVRPS0VOUzwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5NVE9LRU5TPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05NVE9LRU5TCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kIE5NVE9LRU5TX0xJVEVSQUwgPSBuZXcgRFREQmFzaWNUeXBlS2luZChOTVRPS0VOUywgIk5NVE9LRU5TIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5CYXNpYyBUeXBlIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERCYXNpY1R5cGVLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IERUREJhc2ljVHlwZUtpbmRbXXtOT05FX0xJVEVSQUwsIENEQVRBX0xJVEVSQUwsIElEX0xJVEVSQUwsIElEUkVGX0xJVEVSQUwsIElEUkVGU19MSVRFUkFMLCBFTlRJVFlfTElURVJBTCwgRU5USVRJRVNfTElURVJBTCwgTk1UT0tFTl9MSVRFUkFMLCBOTVRPS0VOU19MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREJhc2ljVHlwZUtpbmQgZ2V0KFN0cmluZyBuYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVkFMVUVTX0FSUkFZLmxlbmd0aDsgKytpKSB7Ci0JCQlEVERCYXNpY1R5cGVLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+QmFzaWMgVHlwZSBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVERCYXNpY1R5cGVLaW5kIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOT05FIDoKLQkJCQlyZXR1cm4gTk9ORV9MSVRFUkFMOwotCQkJY2FzZSBDREFUQSA6Ci0JCQkJcmV0dXJuIENEQVRBX0xJVEVSQUw7Ci0JCQljYXNlIElEIDoKLQkJCQlyZXR1cm4gSURfTElURVJBTDsKLQkJCWNhc2UgSURSRUYgOgotCQkJCXJldHVybiBJRFJFRl9MSVRFUkFMOwotCQkJY2FzZSBJRFJFRlMgOgotCQkJCXJldHVybiBJRFJFRlNfTElURVJBTDsKLQkJCWNhc2UgRU5USVRZIDoKLQkJCQlyZXR1cm4gRU5USVRZX0xJVEVSQUw7Ci0JCQljYXNlIEVOVElUSUVTIDoKLQkJCQlyZXR1cm4gRU5USVRJRVNfTElURVJBTDsKLQkJCWNhc2UgTk1UT0tFTiA6Ci0JCQkJcmV0dXJuIE5NVE9LRU5fTElURVJBTDsKLQkJCWNhc2UgTk1UT0tFTlMgOgotCQkJCXJldHVybiBOTVRPS0VOU19MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVERCYXNpY1R5cGVLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBEVERCYXNpY1R5cGVLaW5kCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWExYTlhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLXB1YmxpYyBjbGFzcyBEVERDb25zdGFudHMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURF9FUlJPUl9MSU5FX1BSRUZJWCA9ICI8IS0tRVJST1IgIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURF9FUlJPUl9MSU5FX1NVRkZJWCA9ICIgLS0+IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9FWFRFTlNJT04gPSAiZHRkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FWFRFTlNJT04gPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNSV9FWFRFTlNJT04gPSAieG1pIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9YTUlfRVhURU5TSU9OID0gImR0ZC54bWkiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURENvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzczYmNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREQ29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Db250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURENvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURENvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEZpbGU8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RFRERmlsZShEVERGaWxlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURENvbnRlbnRfRFRERmlsZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iRFREQ29udGVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmlsZSBnZXREVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFREQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEREZWZhdWx0S2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEREZWZhdWx0S2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjYzNzhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERGVmYXVsdEtpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JywKLSAqIGFuZCB1dGlsaXR5IG1ldGhvZHMgZm9yIHdvcmtpbmcgd2l0aCB0aGVtLiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERGVmYXVsdEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVEREZWZhdWx0S2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU1QTElFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJTVBMSUVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTVBMSUVEID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlJFUVVJUkVEPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1JFUVVJUkVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRVFVSVJFRCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNGSVhFRF9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRklYRUQgPSAzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNOT0ZJWEVEX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT0ZJWEVEID0gNDsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPklNUExJRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5JTVBMSUVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0lNUExJRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIElNUExJRURfTElURVJBTCA9IG5ldyBEVEREZWZhdWx0S2luZChJTVBMSUVELCAiSU1QTElFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRVFVSVJFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJFUVVJUkVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1JFUVVJUkVECi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBSRVFVSVJFRF9MSVRFUkFMID0gbmV3IERURERlZmF1bHRLaW5kKFJFUVVJUkVELCAiUkVRVUlSRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5GSVhFRDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNGSVhFRAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmQgRklYRURfTElURVJBTCA9IG5ldyBEVEREZWZhdWx0S2luZChGSVhFRCwgIkZJWEVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5PRklYRUQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT0ZJWEVEPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PRklYRUQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURERlZmF1bHRLaW5kIE5PRklYRURfTElURVJBTCA9IG5ldyBEVEREZWZhdWx0S2luZChOT0ZJWEVELCAiTk9GSVhFRCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBlbnVtZXJhdG9ycy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgRFRERGVmYXVsdEtpbmRbXSBWQUxVRVNfQVJSQVkgPSBuZXcgRFRERGVmYXVsdEtpbmRbXXtJTVBMSUVEX0xJVEVSQUwsIFJFUVVJUkVEX0xJVEVSQUwsIEZJWEVEX0xJVEVSQUwsIE5PRklYRURfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicKLQkgKiBlbnVtZXJhdG9ycy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdCBWQUxVRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoVkFMVUVTX0FSUkFZKSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkRlZmF1bHQgS2luZDwvYj48L2VtPicgbGl0ZXJhbCB3aXRoIHRoZQotCSAqIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVEREZWZhdWx0S2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURURERlZmF1bHRLaW5kIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+RGVmYXVsdCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBEVEREZWZhdWx0S2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgSU1QTElFRCA6Ci0JCQkJcmV0dXJuIElNUExJRURfTElURVJBTDsKLQkJCWNhc2UgUkVRVUlSRUQgOgotCQkJCXJldHVybiBSRVFVSVJFRF9MSVRFUkFMOwotCQkJY2FzZSBGSVhFRCA6Ci0JCQkJcmV0dXJuIEZJWEVEX0xJVEVSQUw7Ci0JCQljYXNlIE5PRklYRUQgOgotCQkJCXJldHVybiBOT0ZJWEVEX0xJVEVSQUw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogT25seSB0aGlzIGNsYXNzIGNhbiBjb25zdHJ1Y3QgaW5zdGFuY2VzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERURERlZmF1bHRLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBEVEREZWZhdWx0S2luZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIyMmVmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0RFREQXR0cmlidXRlIDxlbT5EVEQgQXR0cmlidXRlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERWxlbWVudCBleHRlbmRzIEVDbGFzcywgRFREQ29udGVudCwgRFRET2JqZWN0LCBEVERTb3VyY2VPZmZzZXQgewotCi0JcHVibGljIHZvaWQgYWRkRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpOwotCi0JLy8gcmV0dXJucyBhbGwgcmVmZXJlbmNlcyBpbiB0aGUgc2FtZSBEVERGaWxlIHRoYXQgcmVmZXJlbmNlIHRoaXMgZWxlbWVudAotCXB1YmxpYyBDb2xsZWN0aW9uIGdldFJlZmVyZW5jZXMoKTsKLQotCS8vIHJldHVybiBhIGJyaWVmIHN0cmluZyBsaXN0aW5nIHRoZSBhdHRyaWJ1dGVzCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVEZXRhaWwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0Q29tbWVudChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudF9Db21tZW50KCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldENvbW1lbnQoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRfQ29udGVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEVsZW1lbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVsZW1lbnQiIGNvbnRhaW5tZW50PSJ0cnVlIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERWxlbWVudENvbnRlbnQgZ2V0Q29udGVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudAotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RFREIEF0dHJpYnV0ZTwvYj48L2VtPicKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUKLQkgKiB7QGxpbmsgRFREQXR0cmlidXRlfS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudCA8ZW0+RFREIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYQotCSAqIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEF0dHJpYnV0ZTwvZW0+JyBjb250YWlubWVudAotCSAqICAgICAgICAgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RFRERWxlbWVudAotCSAqIEBtb2RlbCB0eXBlPSJEVERBdHRyaWJ1dGUiIG9wcG9zaXRlPSJEVERFbGVtZW50IiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RFREQXR0cmlidXRlKCk7Ci0KLX0gLy8gRFRERWxlbWVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50Q29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbGVtZW50Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGNlNGZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudENvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU9iamVjdDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50Q29udGVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERWxlbWVudENvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0KLQkvLyBmb3Igc2hvd2luZyBuYW1lcyB0byBiZSB1c2VkIGluIHRoZSB0cmVlCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpOwotCi0JLy8gZm9yIHNob3dpbmcgaXRlbXMgaW4gdGhlIHRhYmxlCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50RGV0YWlsKCk7Ci0KLQlwdWJsaWMgRFRERWxlbWVudCBnZXREVERFbGVtZW50KCk7Ci0KLQkvLyBnZXQgdGhlIG1vc3Qgb3V0ZXIgRFRER3JvdXBDb250ZW50Ci0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXREVERHcm91cENvbnRlbnQoKTsKLQotCS8vIHJldHVybnMgdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgY29udGVudCBpcyB0aGUgZmlyc3QKLQkvLyBpbiB0aGUgZWxlbWVudAotCS8vIGVnIDwhRUxFTUVOVCBibGFoIGZpcnN0RWxlbWVudD4KLQkvLyA8IUVMRU1FTlQgYmxhaCAoKGZpcnN0RWxlbWVudCwgc2Vjb25kRWxlbWVudCkgfCBsYXN0RWxlbWVudCkKLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXA8L2VtPicgY29udGFpbmVyIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0R3JvdXAoRFRER3JvdXBDb250ZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRDb250ZW50X0dyb3VwKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREdyb3VwQ29udGVudCBnZXRHcm91cCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEdyb3VwKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRHcm91cChEVERHcm91cENvbnRlbnQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0RWxlbWVudChEVERFbGVtZW50KQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRDb250ZW50X0VsZW1lbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImNvbnRlbnQiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVsZW1lbnQgZ2V0RWxlbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRFbGVtZW50IDxlbT5FbGVtZW50PC9lbT59JwotCSAqIGNvbnRhaW5lciByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbGVtZW50PC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRFRERWxlbWVudCB2YWx1ZSk7Ci0KLX0gLy8gRFRERWxlbWVudENvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlYjI1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCA8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGV4dGVuZHMgRFREUmVwZWF0YWJsZUNvbnRlbnQgewotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlJlZmVyZW5jZWQgRWxlbWVudDwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nIHJlZmVyZW5jZSBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlJlZmVyZW5jZWQgRWxlbWVudDwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0UmVmZXJlbmNlZEVsZW1lbnQoRFRERWxlbWVudCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudF9SZWZlcmVuY2VkRWxlbWVudCgpCi0JICogQG1vZGVsIHJlcXVpcmVkPSJ0cnVlIgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50IGdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50I2dldFJlZmVyZW5jZWRFbGVtZW50IDxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nCi0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldFJlZmVyZW5jZWRFbGVtZW50KERUREVsZW1lbnQgdmFsdWUpOwotCi19IC8vIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVtcHR5Q29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbXB0eUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYwZDVjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVtcHR5Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW1wdHkgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVtcHR5Q29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbXB0eUNvbnRlbnQgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudCB7Ci19IC8vIERUREVtcHR5Q29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmM3NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjaXNQYXJhbWV0ZXJFbnRpdHkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFbnRpdHkgZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERDb250ZW50LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29tbWVudDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNzZXRDb21tZW50KFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnRpdHlfQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcmFtZXRlciBFbnRpdHk8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicgYXR0cmlidXRlIGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2lzUGFyYW1ldGVyRW50aXR5IDxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgICAgIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNpc1BhcmFtZXRlckVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCNnZXREVERFbnRpdHkgPGVtPkRURCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRDb250ZW50KERUREVudGl0eUNvbnRlbnQpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5X0NvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iRFRERW50aXR5IiBjb250YWlubWVudD0idHJ1ZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eUNvbnRlbnQgZ2V0Q29udGVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogICAgICAgICAgICByZWZlcmVuY2UuCi0JICogQHNlZSAjZ2V0Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Q29udGVudChEVERFbnRpdHlDb250ZW50IHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlBhcm0gRW50aXR5IFJlZjwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eQotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iZW50aXR5IiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGdldFBhcm1FbnRpdHlSZWYoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRQYXJtRW50aXR5UmVmKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRQYXJtRW50aXR5UmVmKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZQotCSAqIHtAbGluayBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50fS4gSXQgaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzCi0JICogb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+JyByZWZlcmVuY2UgbGlzdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlCi0JICogICAgICAgICBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5Ci0JICogQG1vZGVsIHR5cGU9IkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQiCi0JICogICAgICAgIG9wcG9zaXRlPSJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RW50aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERBdHRyaWJ1dGV9LiBJdAotCSAqIGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2U8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5Ci0JICogQG1vZGVsIHR5cGU9IkRUREF0dHJpYnV0ZSIgb3Bwb3NpdGU9ImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIFRoZSBsaXN0IGNvbnRlbnRzIGFyZSBvZiB0eXBlIHtAbGluayBEVERBdHRyaWJ1dGV9LiBJdAotCSAqIGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdCBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2U8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5Ci0JICogQG1vZGVsIHR5cGU9IkRUREF0dHJpYnV0ZSIgb3Bwb3NpdGU9ImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFTGlzdCBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCk7Ci0KLX0gLy8gRFRERW50aXR5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVudGl0eUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5Q29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTRjMmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5Q29udGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IENvbnRlbnQ8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eUNvbnRlbnQoKQotICogQG1vZGVsIGFic3RyYWN0PSJ0cnVlIgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudGl0eUNvbnRlbnQgZXh0ZW5kcyBFT2JqZWN0LCBEVERPYmplY3QgewotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlCi0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29udGVudAotCSAqIEBtb2RlbCBvcHBvc2l0ZT0iY29udGVudCIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldERUREVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSA8ZW0+RFREIEVudGl0eTwvZW0+fScKLQkgKiBjb250YWluZXIgcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVudGl0eTwvZW0+JyBjb250YWluZXIKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi19IC8vIERUREVudGl0eUNvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNGFiOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UgPGVtPkVudGl0eSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+JwotCSAqIHJlZmVyZW5jZSBpc24ndCBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24KLQkgKiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2UKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVudGl0eVJlZmVyZW5jZSIgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eSBnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50I2dldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5IDxlbT5FbGVtZW50IFJlZmVyZW5jZWQgRW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicKLQkgKiAgICAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IHZhbHVlKTsKLQotfSAvLyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bUdyb3VwS2luZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtR3JvdXBLaW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlMGI4ZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtR3JvdXBLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuQWJzdHJhY3RFbnVtZXJhdG9yOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxpdGVyYWxzIG9mIHRoZSBlbnVtZXJhdGlvbiAnPGVtPjxiPkVudW0gR3JvdXAgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudW1Hcm91cEtpbmQoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVERFbnVtR3JvdXBLaW5kIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OQU1FIFRPS0VOIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05BTUVfVE9LRU5fR1JPVVBfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5BTUVfVE9LRU5fR1JPVVAgPSAxOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9UQVRJT04gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTk9UQVRJT05fR1JPVVBfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEFUSU9OX0dST1VQID0gMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk5BTUUgVE9LRU4gR1JPVVA8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OQU1FIFRPS0VOIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsCi0JICogb2JqZWN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjTkFNRV9UT0tFTl9HUk9VUAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRERW51bUdyb3VwS2luZCBOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUwgPSBuZXcgRFRERW51bUdyb3VwS2luZChOQU1FX1RPS0VOX0dST1VQLCAiTkFNRV9UT0tFTl9HUk9VUCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT1RBVElPTiBHUk9VUDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPk5PVEFUSU9OIEdST1VQPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdAotCSAqIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PVEFUSU9OX0dST1VQCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERFbnVtR3JvdXBLaW5kIE5PVEFUSU9OX0dST1VQX0xJVEVSQUwgPSBuZXcgRFRERW51bUdyb3VwS2luZChOT1RBVElPTl9HUk9VUCwgIk5PVEFUSU9OX0dST1VQIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEFuIGFycmF5IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nIGVudW1lcmF0b3JzLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBEVERFbnVtR3JvdXBLaW5kW10gVkFMVUVTX0FSUkFZID0gbmV3IERUREVudW1Hcm91cEtpbmRbXXtOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUwsIE5PVEFUSU9OX0dST1VQX0xJVEVSQUwsfTsKLQotCS8qKgotCSAqIEEgcHVibGljIHJlYWQtb25seSBsaXN0IG9mIGFsbCB0aGUgJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgbmFtZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFRERW51bUdyb3VwS2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURUREVudW1Hcm91cEtpbmQgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5FbnVtIEdyb3VwIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREVudW1Hcm91cEtpbmQgZ2V0KGludCB2YWx1ZSkgewotCQlzd2l0Y2ggKHZhbHVlKSB7Ci0JCQljYXNlIE5BTUVfVE9LRU5fR1JPVVAgOgotCQkJCXJldHVybiBOQU1FX1RPS0VOX0dST1VQX0xJVEVSQUw7Ci0JCQljYXNlIE5PVEFUSU9OX0dST1VQIDoKLQkJCQlyZXR1cm4gTk9UQVRJT05fR1JPVVBfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRERW51bUdyb3VwS2luZChpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFRERW51bUdyb3VwS2luZApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtZXJhdGlvblR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRERW51bWVyYXRpb25UeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkMGVmNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFbnVtZXJhdGlvblR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkVudW1lcmF0aW9uIFR5cGU8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREVudW1lcmF0aW9uVHlwZSBleHRlbmRzIEVFbnVtLCBEVERUeXBlIHsKLQotCXB1YmxpYyBFTGlzdCBnZXRFbnVtTGl0ZXJhbHMoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW51bWVyYXRpb25UeXBlRGVzY3JpcHRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gVGhlCi0JICogbGl0ZXJhbHMgYXJlIGZyb20gdGhlIGVudW1lcmF0aW9uCi0JICoge0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZH0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5LaW5kPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwgdGhlcmUKLQkgKiByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQHNlZSAjc2V0S2luZChEVERFbnVtR3JvdXBLaW5kKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW51bUdyb3VwS2luZCBnZXRLaW5kKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXRLaW5kIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPktpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0S2luZChEVERFbnVtR3JvdXBLaW5kIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIEl0IGlzIGJpZGlyZWN0aW9uYWwgYW5kIGl0cyBvcHBvc2l0ZSBpcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lciByZWZlcmVuY2UgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5EVEQgRmlsZTwvZW0+JyBjb250YWluZXIgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldERUREZpbGUoRFRERmlsZSkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFRERW51bWVyYXRpb25UeXBlCi0JICogQG1vZGVsIG9wcG9zaXRlPSJEVERFbnVtZXJhdGlvblR5cGUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgZ2V0RFRERmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nCi0JICogY29udGFpbmVyIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkRURCBGaWxlPC9lbT4nIGNvbnRhaW5lcgotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFRERW51bWVyYXRpb25UeXBlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVycm9yTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFcnJvck1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxNTA1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREVycm9yTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLXB1YmxpYyBjbGFzcyBEVERFcnJvck1lc3NhZ2UgewotCXB1YmxpYyBTdHJpbmcgZXJyb3JLZXk7Ci0JcHVibGljIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0JcHVibGljIFN0cmluZyBsaW5lTm87Ci0JcHVibGljIFN0cmluZyBjaGFyT2ZmU2V0OwotCXB1YmxpYyBTdHJpbmcgZGVjbGFyYXRpb25UeXBlOwotCXB1YmxpYyBTdHJpbmcgZGVjbGFyYXRpb25OYW1lOwotCXB1YmxpYyBTdHJpbmcgc291cmNlTGluZTsKLQotCi0JcHVibGljIERUREVycm9yTWVzc2FnZShTdHJpbmcgZGVjbGFyYXRpb25UeXBlLCBTdHJpbmcgZGVjbGFyYXRpb25OYW1lLCBTdHJpbmcgbGluZU5vLCBTdHJpbmcgY2hhck9mZlNldCwgU3RyaW5nIGVycm9yS2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlKSB7Ci0JCXRoaXMoZGVjbGFyYXRpb25UeXBlLCBkZWNsYXJhdGlvbk5hbWUsIGxpbmVObywgY2hhck9mZlNldCwgZXJyb3JLZXksIGVycm9yTWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIERUREVycm9yTWVzc2FnZShTdHJpbmcgZGVjbGFyYXRpb25UeXBlLCBTdHJpbmcgZGVjbGFyYXRpb25OYW1lLCBTdHJpbmcgbGluZU5vLCBTdHJpbmcgY2hhck9mZlNldCwgU3RyaW5nIGVycm9yS2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgc3JjTGluZSkgewotCQl0aGlzLmRlY2xhcmF0aW9uVHlwZSA9IGRlY2xhcmF0aW9uVHlwZTsKLQkJdGhpcy5kZWNsYXJhdGlvbk5hbWUgPSBkZWNsYXJhdGlvbk5hbWU7Ci0JCXRoaXMubGluZU5vID0gbGluZU5vOwotCQl0aGlzLmNoYXJPZmZTZXQgPSBjaGFyT2ZmU2V0OwotCQl0aGlzLmVycm9yS2V5ID0gZXJyb3JLZXk7Ci0JCXRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCQl0aGlzLnNvdXJjZUxpbmUgPSBzcmNMaW5lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiKCIgKyBkZWNsYXJhdGlvblR5cGUgKyAiOiIgKyBkZWNsYXJhdGlvbk5hbWUgKyAiKSAiICsgbGluZU5vICsgIjoiICsgY2hhck9mZlNldCArICIgIiArIGVycm9yTWVzc2FnZTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgdG9TdHJpbmdHZW4oKSB7Ci0KLQkJcmV0dXJuICIoIiArIGRlY2xhcmF0aW9uVHlwZSArICI6IiArIGRlY2xhcmF0aW9uTmFtZSArICIpICIgKyBsaW5lTm8gKyAiOiIgKyBjaGFyT2ZmU2V0ICsgIiAiICsgZXJyb3JNZXNzYWdlOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVuZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVuZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZjQwNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlbmRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBhbiBJRG9tYWluTW9kZWwgdG8gYXVnbWVudAotICogZ2V0RWxlbWVudFByb3BlcnR5IGZvciBhbnkgRFREIG9iamVjdC4KLSAqLwotcHVibGljIGludGVyZmFjZSBEVERFeHRlbmRlciB7Ci0JcHVibGljIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoRFRET2JqZWN0IGR0ZE9iamVjdCwgT2JqZWN0IG9iamVjdCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVybmFsRW50aXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREV4dGVybmFsRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNWNhMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERFeHRlcm5hbEVudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FeHRlcm5hbCBFbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgc3VwcG9ydGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERXh0ZXJuYWxFbnRpdHkgZXh0ZW5kcyBEVERFbnRpdHlDb250ZW50IHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN5c3RlbSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3lzdGVtSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREV4dGVybmFsRW50aXR5X1N5c3RlbUlEKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN5c3RlbUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeXN0ZW1JRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1YmxpYyBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVibGljSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREV4dGVybmFsRW50aXR5X1B1YmxpY0lEKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1YmxpY0lEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+JyByZWZlcmVuY2UuIEl0Ci0JICogaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Ob3RhdGlvbjwvZW0+JyByZWZlcmVuY2UuCi0JICogQHNlZSAjc2V0Tm90YXRpb24oRFRETm90YXRpb24pCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkKLQkgKiBAbW9kZWwgb3Bwb3NpdGU9ImVudGl0eSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRETm90YXRpb24gZ2V0Tm90YXRpb24oKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0Tm90YXRpb24oRFRETm90YXRpb24gdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2VkIEZyb20gQW5vdGhlciBGaWxlPC9lbT4nCi0JICogcmVmZXJlbmNlIGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbgotCSAqIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPicKLQkgKiAgICAgICAgIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKERUREZpbGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRERXh0ZXJuYWxFbnRpdHlfRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZpbGUgZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIDxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvZW0+JwotCSAqICAgICAgICAgICAgcmVmZXJlbmNlLgotCSAqIEBzZWUgI2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoRFRERmlsZSB2YWx1ZSk7Ci0KLX0gLy8gRFRERXh0ZXJuYWxFbnRpdHkKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzgzZDI2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUZhY3Rvcnk7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gVGhlIDxiPkZhY3Rvcnk8L2I+IGZvciB0aGUgbW9kZWwuIEl0IHByb3ZpZGVzIGEKLSAqIGNyZWF0ZSBtZXRob2QgZm9yIGVhY2ggbm9uLWFic3RyYWN0IGNsYXNzIG9mIHRoZSBtb2RlbC4gPCEtLSBlbmQtdXNlci1kb2MKLSAqIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREZhY3RvcnkgZXh0ZW5kcyBFRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERGYWN0b3J5IGVJTlNUQU5DRSA9IG5ldyBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFRERmFjdG9yeUltcGwoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+R3JvdXAgQ29udGVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkdyb3VwIENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREdyb3VwQ29udGVudCBjcmVhdGVEVERHcm91cENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXR0cmlidXRlPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QXR0cmlidXRlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERBdHRyaWJ1dGUgY3JlYXRlRFREQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50IGNyZWF0ZURUREVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RW1wdHkgQ29udGVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVtcHR5IENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVtcHR5Q29udGVudCBjcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+QW55IENvbnRlbnQ8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5BbnkgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREQW55Q29udGVudCBjcmVhdGVEVERBbnlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBDIERhdGEgQ29udGVudDwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPlBDIERhdGEgQ29udGVudDwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUENEYXRhQ29udGVudCBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5GaWxlPC9lbT4nLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+RmlsZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERmlsZSBjcmVhdGVEVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkJhc2ljIFR5cGU8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5CYXNpYyBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERCYXNpY1R5cGUgY3JlYXRlRFREQmFzaWNUeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnVtZXJhdGlvbiBUeXBlPC9lbT4nLgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPk5vdGF0aW9uPC9lbT4nLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+Tm90YXRpb248L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURE5vdGF0aW9uIGNyZWF0ZURURE5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGNyZWF0ZURUREVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPicuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREV4dGVybmFsRW50aXR5IGNyZWF0ZURUREV4dGVybmFsRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVybmFsIEVudGl0eTwvZW0+Jy4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IG9iamVjdCBvZiBjbGFzcyAnPGVtPkludGVybmFsIEVudGl0eTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRESW50ZXJuYWxFbnRpdHkgY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgYSBuZXcgb2JqZWN0IG9mIGNsYXNzICc8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiBhIG5ldyBvYmplY3Qgb2YgY2xhc3MgJzxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFja2FnZSBzdXBwb3J0ZWQgYnkgdGhpcyBmYWN0b3J5LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhY2thZ2Ugc3VwcG9ydGVkIGJ5IHRoaXMgZmFjdG9yeS4KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFREUGFja2FnZSBnZXREVERQYWNrYWdlKCk7Ci0KLX0gLy8gRFRERmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERGaWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZpbGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzYzM3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREZpbGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5GaWxlPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjaXNQYXJzZUVycm9yIDxlbT5QYXJzZSBFcnJvcjwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERDb250ZW50IDxlbT5EVEQgQ29udGVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUgPGVtPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGUoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRERmlsZSBleHRlbmRzIEVOYW1lZEVsZW1lbnQsIERURE9iamVjdCB7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RFRET2JqZWN0KCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERWxlbWVudCgpOwotCi0JcHVibGljIExpc3QgbGlzdERURE5vdGF0aW9uKCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERW50aXR5KCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFRERWxlbWVudEFuZERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JcHVibGljIERUREVsZW1lbnQgZmluZEVsZW1lbnQoU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIERUREVudGl0eSBmaW5kRW50aXR5KFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBEVEROb3RhdGlvbiBmaW5kTm90YXRpb24oU3RyaW5nIG5hbWUpOwotCi0JcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBmaW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFN0cmluZyBuYW1lKTsKLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZShib29sZWFuIGluY2x1ZGVFcnJvcik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGVfQ29tbWVudCgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRDb21tZW50KCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5QYXJzZSBFcnJvcjwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UGFyc2UgRXJyb3I8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLAotCSAqIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+UGFyc2UgRXJyb3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFBhcnNlRXJyb3IoYm9vbGVhbikKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERGaWxlX1BhcnNlRXJyb3IoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlib29sZWFuIGlzUGFyc2VFcnJvcigpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvciA8ZW0+UGFyc2UgRXJyb3I8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UGFyc2UgRXJyb3I8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2lzUGFyc2VFcnJvcigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UGFyc2VFcnJvcihib29sZWFuIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBDb250ZW50PC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZSB7QGxpbmsgRFREQ29udGVudH0uIEl0Ci0JICogaXMgYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkRURCBDb250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZQotCSAqIGxpc3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIENvbnRlbnQ8L2VtPicgY29udGFpbm1lbnQKLQkgKiAgICAgICAgIHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGVfRFREQ29udGVudCgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZQotCSAqIEBtb2RlbCB0eXBlPSJEVERDb250ZW50IiBvcHBvc2l0ZT0iRFRERmlsZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERURENvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkRURCBFbnVtZXJhdGlvbiBUeXBlPC9iPjwvZW0+JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LiBUaGUgbGlzdCBjb250ZW50cyBhcmUgb2YgdHlwZQotCSAqIHtAbGluayBEVERFbnVtZXJhdGlvblR5cGV9LiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZSNnZXREVERGaWxlIDxlbT5EVEQgRmlsZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0IGlzbid0IGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYQotCSAqIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPicKLQkgKiAgICAgICAgIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0LgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUKLQkgKiBAbW9kZWwgdHlwZT0iRFRERW51bWVyYXRpb25UeXBlIiBvcHBvc2l0ZT0iRFRERmlsZSIgY29udGFpbm1lbnQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldERUREVudW1lcmF0aW9uVHlwZSgpOwotCi19IC8vIERUREZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI0N2QzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+R3JvdXAgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldENvbnRlbnQgPGVtPkNvbnRlbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBDb250ZW50KCkKLSAqIEBtb2RlbAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERUREdyb3VwQ29udGVudCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFBvc2l0aW9uKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmR9LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+R3JvdXAgS2luZDwvZW0+JyBhdHRyaWJ1dGUgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5Hcm91cCBLaW5kPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kCi0JICogQHNlZSAjc2V0R3JvdXBLaW5kKERUREdyb3VwS2luZCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERHcm91cENvbnRlbnRfR3JvdXBLaW5kKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRER3JvdXBLaW5kIGdldEdyb3VwS2luZCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0R3JvdXBLaW5kIDxlbT5Hcm91cCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkdyb3VwIEtpbmQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQKLQkgKiBAc2VlICNnZXRHcm91cEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEdyb3VwS2luZChEVERHcm91cEtpbmQgdmFsdWUpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERUREVsZW1lbnRDb250ZW50fS4KLQkgKiBJdCBpcyBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db250ZW50PC9lbT4nIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+Q29udGVudDwvZW0+JyBjb250YWlubWVudCByZWZlcmVuY2UKLQkgKiAgICAgICAgIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRER3JvdXBDb250ZW50X0NvbnRlbnQoKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudCNnZXRHcm91cAotCSAqIEBtb2RlbCB0eXBlPSJEVERFbGVtZW50Q29udGVudCIgb3Bwb3NpdGU9Imdyb3VwIiBjb250YWlubWVudD0idHJ1ZSIKLQkgKiAgICAgICAgcmVxdWlyZWQ9InRydWUiCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVMaXN0IGdldENvbnRlbnQoKTsKLQotfSAvLyBEVERHcm91cENvbnRlbnQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBLaW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREdyb3VwS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjEwZGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRER3JvdXBLaW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicsCi0gKiBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB3b3JraW5nIHdpdGggdGhlbS4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERUREdyb3VwS2luZCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERUREdyb3VwS2luZCBleHRlbmRzIEFic3RyYWN0RW51bWVyYXRvciB7Ci0JLyoqCi0JICogVGhlICc8ZW0+PGI+U0VRVUVOQ0U8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjU0VRVUVOQ0VfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUVVFTkNFID0gMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkNIT0lDRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNDSE9JQ0VfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENIT0lDRSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TRVFVRU5DRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlNFUVVFTkNFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1NFUVVFTkNFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmQgU0VRVUVOQ0VfTElURVJBTCA9IG5ldyBEVERHcm91cEtpbmQoU0VRVUVOQ0UsICJTRVFVRU5DRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5DSE9JQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5DSE9JQ0U8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQ0hPSUNFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERHcm91cEtpbmQgQ0hPSUNFX0xJVEVSQUwgPSBuZXcgRFRER3JvdXBLaW5kKENIT0lDRSwgIkNIT0lDRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgZW51bWVyYXRvcnMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERUREdyb3VwS2luZFtdIFZBTFVFU19BUlJBWSA9IG5ldyBEVERHcm91cEtpbmRbXXtTRVFVRU5DRV9MSVRFUkFMLCBDSE9JQ0VfTElURVJBTCx9OwotCi0JLyoqCi0JICogQSBwdWJsaWMgcmVhZC1vbmx5IGxpc3Qgb2YgYWxsIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5Hcm91cCBLaW5kPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREdyb3VwS2luZCBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCURUREdyb3VwS2luZCByZXN1bHQgPSBWQUxVRVNfQVJSQVlbaV07Ci0JCQlpZiAocmVzdWx0LnRvU3RyaW5nKCkuZXF1YWxzKG5hbWUpKSB7Ci0JCQkJcmV0dXJuIHJlc3VsdDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAnPGVtPjxiPkdyb3VwIEtpbmQ8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERUREdyb3VwS2luZCBnZXQoaW50IHZhbHVlKSB7Ci0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgU0VRVUVOQ0UgOgotCQkJCXJldHVybiBTRVFVRU5DRV9MSVRFUkFMOwotCQkJY2FzZSBDSE9JQ0UgOgotCQkJCXJldHVybiBDSE9JQ0VfTElURVJBTDsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IHRoaXMgY2xhc3MgY2FuIGNvbnN0cnVjdCBpbnN0YW5jZXMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0KLQkgKiBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRFRER3JvdXBLaW5kKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKLQkJc3VwZXIodmFsdWUsIG5hbWUpOwotCX0KLQotfSAvLyBEVERHcm91cEtpbmQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRESW50ZXJuYWxFbnRpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRESW50ZXJuYWxFbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE4NGExMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RUREludGVybmFsRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+SW50ZXJuYWwgRW50aXR5PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIHN1cHBvcnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRESW50ZXJuYWxFbnRpdHkoKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRESW50ZXJuYWxFbnRpdHkgZXh0ZW5kcyBEVERFbnRpdHlDb250ZW50IHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5WYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlIGlzbid0IGNsZWFyLCB0aGVyZQotCSAqIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldFZhbHVlKFN0cmluZykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERJbnRlcm5hbEVudGl0eV9WYWx1ZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZXRWYWx1ZSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSNnZXRWYWx1ZSA8ZW0+VmFsdWU8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+VmFsdWU8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpOwotCi19IC8vIERUREludGVybmFsRW50aXR5CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURExleGljYWxJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURExleGljYWxJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MmQyM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERMZXhpY2FsSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgY2xhc3MgRFRETGV4aWNhbEluZm8gaW1wbGVtZW50cyBEVERTb3VyY2VPZmZzZXQgewotCS8vIEJlZ2luIFVzZXIgRGVmaW5lZCBNZXRob2RzCi0JaW50IHN0YXJ0T2Zmc2V0OwotCWludCBlbmRPZmZzZXQ7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gdjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGVuZE9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQotCQl0aGlzLmVuZE9mZnNldCA9IHY7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0U3RhcnRPZmZzZXRHZW4oKSB7Ci0KLQkJcmV0dXJuIHN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTdGFydE9mZnNldEdlbihpbnQgdikgewotCi0JCXRoaXMuc3RhcnRPZmZzZXQgPSB2OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0RW5kT2Zmc2V0R2VuKCkgewotCi0JCXJldHVybiBlbmRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5kT2Zmc2V0R2VuKGludCB2KSB7Ci0KLQotCQl0aGlzLmVuZE9mZnNldCA9IHY7Ci0JfQotfS8vIERURFNvdXJjZU9mZnNldApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEROb3RhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVEROb3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDIzZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRETm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0U3lzdGVtSUQgPGVtPlN5c3RlbSBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb24oKQotICogQG1vZGVsCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRETm90YXRpb24gZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERDb250ZW50LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5Db21tZW50PC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI3NldENvbW1lbnQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uX0NvbW1lbnQoKQotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0Q29tbWVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSAnPGVtPkNvbW1lbnQ8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldENvbW1lbnQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlN5c3RlbSBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlN5c3RlbSBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0U3lzdGVtSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uX1N5c3RlbUlEKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFN5c3RlbUlEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+U3lzdGVtIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRTeXN0ZW1JRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0U3lzdGVtSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPlB1YmxpYyBJRDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlB1YmxpYyBJRDwvZW0+JyBhdHRyaWJ1dGUuCi0JICogQHNlZSAjc2V0UHVibGljSUQoU3RyaW5nKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURE5vdGF0aW9uX1B1YmxpY0lEKCkKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdldFB1YmxpY0lEKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+UHVibGljIElEPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXZvaWQgc2V0UHVibGljSUQoU3RyaW5nIHZhbHVlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogVGhlIGxpc3QgY29udGVudHMgYXJlIG9mIHR5cGUge0BsaW5rIERUREV4dGVybmFsRW50aXR5fS4gSXQgaXMKLQkgKiBiaWRpcmVjdGlvbmFsIGFuZCBpdHMgb3Bwb3NpdGUgaXMgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldE5vdGF0aW9uIDxlbT5Ob3RhdGlvbjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlIGxpc3QgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFRETm90YXRpb25fRW50aXR5KCkKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24KLQkgKiBAbW9kZWwgdHlwZT0iRFRERXh0ZXJuYWxFbnRpdHkiIG9wcG9zaXRlPSJub3RhdGlvbiIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUxpc3QgZ2V0RW50aXR5KCk7Ci0KLX0gLy8gRFRETm90YXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2JqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURE9iamVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM4NGJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFRET2JqZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8vIFJlZiBwYWNrYWdlCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRFRET2JqZWN0IGV4dGVuZHMgRU9iamVjdCB7Ci0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpOwotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpOwotCi19IC8vIERURE9iamVjdApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPY2N1cnJlbmNlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPY2N1cnJlbmNlVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDM5YWExMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERPY2N1cnJlbmNlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkFic3RyYWN0RW51bWVyYXRvcjsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBsaXRlcmFscyBvZiB0aGUgZW51bWVyYXRpb24gJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERPY2N1cnJlbmNlVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERURE9jY3VycmVuY2VUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT05FX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPTkUgPSA0OTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9QVElPTkFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI09QVElPTkFMX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDYzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T05FIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT05FX09SX01PUkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9ORV9PUl9NT1JFID0gNDM7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5aRVJPIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjWkVST19PUl9NT1JFX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBaRVJPX09SX01PUkUgPSA0MjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PTkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT05FCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPTkVfTElURVJBTCA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZShPTkUsICJPTkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+T1BUSU9OQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5PUFRJT05BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNPUFRJT05BTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRFRET2NjdXJyZW5jZVR5cGUgT1BUSU9OQUxfTElURVJBTCA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZShPUFRJT05BTCwgIk9QVElPTkFMIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPk9ORSBPUiBNT1JFPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+T05FIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjT05FX09SX01PUkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlIE9ORV9PUl9NT1JFX0xJVEVSQUwgPSBuZXcgRFRET2NjdXJyZW5jZVR5cGUoT05FX09SX01PUkUsICJPTkVfT1JfTU9SRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5aRVJPIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5aRVJPIE9SIE1PUkU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjWkVST19PUl9NT1JFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBaRVJPX09SX01PUkVfTElURVJBTCA9IG5ldyBEVERPY2N1cnJlbmNlVHlwZShaRVJPX09SX01PUkUsICJaRVJPX09SX01PUkUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQW4gYXJyYXkgb2YgYWxsIHRoZSAnPGVtPjxiPk9jY3VycmVuY2UgVHlwZTwvYj48L2VtPicgZW51bWVyYXRvcnMuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIERURE9jY3VycmVuY2VUeXBlW10gVkFMVUVTX0FSUkFZID0gbmV3IERURE9jY3VycmVuY2VUeXBlW117T05FX0xJVEVSQUwsIE9QVElPTkFMX0xJVEVSQUwsIE9ORV9PUl9NT1JFX0xJVEVSQUwsIFpFUk9fT1JfTU9SRV9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JwotCSAqIGVudW1lcmF0b3JzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0IFZBTFVFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChWQUxVRVNfQVJSQVkpKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZSBUeXBlPC9iPjwvZW0+JyBsaXRlcmFsIHdpdGggdGhlCi0JICogc3BlY2lmaWVkIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURE9jY3VycmVuY2VUeXBlIGdldChTdHJpbmcgbmFtZSkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IFZBTFVFU19BUlJBWS5sZW5ndGg7ICsraSkgewotCQkJRFRET2NjdXJyZW5jZVR5cGUgcmVzdWx0ID0gVkFMVUVTX0FSUkFZW2ldOwotCQkJaWYgKHJlc3VsdC50b1N0cmluZygpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiByZXN1bHQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURE9jY3VycmVuY2VUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBPTkUgOgotCQkJCXJldHVybiBPTkVfTElURVJBTDsKLQkJCWNhc2UgT1BUSU9OQUwgOgotCQkJCXJldHVybiBPUFRJT05BTF9MSVRFUkFMOwotCQkJY2FzZSBPTkVfT1JfTU9SRSA6Ci0JCQkJcmV0dXJuIE9ORV9PUl9NT1JFX0xJVEVSQUw7Ci0JCQljYXNlIFpFUk9fT1JfTU9SRSA6Ci0JCQkJcmV0dXJuIFpFUk9fT1JfTU9SRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBEVERPY2N1cnJlbmNlVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gRFRET2NjdXJyZW5jZVR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUENEYXRhQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQQ0RhdGFDb250ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2U1NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERQQ0RhdGFDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+UEMgRGF0YSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiA8cD4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUENEYXRhQ29udGVudCgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERQQ0RhdGFDb250ZW50IGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnQgewotfSAvLyBEVERQQ0RhdGFDb250ZW50CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhY2thZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFja2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzM2YTU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFja2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRW51bTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBUaGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoZSBtb2RlbC4gSXQgY29udGFpbnMKLSAqIGFjY2Vzc29ycyBmb3IgdGhlIG1ldGEgb2JqZWN0cyB0byByZXByZXNlbnQKLSAqIDx1bD4KLSAqIDxsaT5lYWNoIGNsYXNzLDwvbGk+Ci0gKiA8bGk+ZWFjaCBmZWF0dXJlIG9mIGVhY2ggY2xhc3MsPC9saT4KLSAqIDxsaT5lYWNoIGVudW0sPC9saT4KLSAqIDxsaT5hbmQgZWFjaCBkYXRhIHR5cGU8L2xpPgotICogPC91bD4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeQotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERURFBhY2thZ2UgZXh0ZW5kcyBFUGFja2FnZSB7Ci0KLQkvKioKLQkgKiBUaGUgcGFja2FnZSBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGVOQU1FID0gImR0ZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBwYWNrYWdlIG5hbWVzcGFjZSBVUkkuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfVVJJID0gImh0dHA6Ly8vY29tL2libS9ldG9vbHMvZHRkLmVjb3JlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIHBhY2thZ2UgbmFtZXNwYWNlIG5hbWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBlTlNfUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSBwYWNrYWdlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tCi0JICogZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlEVERQYWNrYWdlIGVJTlNUQU5DRSA9IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbC5EVERQYWNrYWdlSW1wbC5pbml0KCk7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50Q29udGVudEltcGwgPGVtPkVsZW1lbnQgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudENvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERWxlbWVudENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfQ09OVEVOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQID0gMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UID0gMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RWxlbWVudCBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSAyOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsIDxlbT5SZXBlYXRhYmxlIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFJlcGVhdGFibGVDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURFJlcGVhdGFibGVDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlQgPSA4OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk9jY3VycmVuY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlJlcGVhdGFibGUgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREdyb3VwQ29udGVudEltcGwgPGVtPkdyb3VwIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREdyb3VwQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERHcm91cENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fRUxFTUVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fT0NDVVJSRU5DRSA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0U7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXAgS2luZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9HUk9VUF9DT05URU5UX19DT05URU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+R3JvdXAgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0dST1VQX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsIDxlbT5BdHRyaWJ1dGU8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURSA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFubm90YXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX05BTUUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTkFNRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FVHlwZTwvYj48L2VtPicgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19FVFlQRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5DaGFuZ2VhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0NIQU5HRUFCTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fQ0hBTkdFQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Wb2xhdGlsZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19WT0xBVElMRSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19WT0xBVElMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5UcmFuc2llbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVFJBTlNJRU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1RSQU5TSUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbmlxdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fVU5JUVVFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX1VOSVFVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlIExpdGVyYWw8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9MSVRFUkFMID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fREVGQVVMVF9WQUxVRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Mb3dlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19MT1dFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19MT1dFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VcHBlciBCb3VuZDwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19VUFBFUl9CT1VORDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5NYW55PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX01BTlkgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fTUFOWTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZXF1aXJlZDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19SRVFVSVJFRCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19SRVFVSVJFRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQ29udGFpbmluZyBDbGFzczwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUyA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19FQ09OVEFJTklOR19DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5VbnNldHRhYmxlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9fVU5TRVRUQUJMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19JRCA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX19JRDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlIFR5cGU8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0NPTU1FTlQgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IEtpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZSBTdHJpbmc8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgPSBFY29yZVBhY2thZ2UuRUFUVFJJQlVURV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA9IEVjb3JlUGFja2FnZS5FQVRUUklCVVRFX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZWQgRW50aXR5PC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRURfRU5USVRZID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkF0dHJpYnV0ZTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FUVFJJQlVURV9GRUFUVVJFX0NPVU5UID0gRWNvcmVQYWNrYWdlLkVBVFRSSUJVVEVfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50SW1wbCA8ZW0+RWxlbWVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbGVtZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTEVNRU5UID0gMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQW5ub3RhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFOTk9UQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFOTk9UQVRJT05TOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPk5hbWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19JTlNUQU5DRV9DTEFTU19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRlZmF1bHQgVmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0RFRkFVTFRfVkFMVUUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUEFDS0FHRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5BYnN0cmFjdDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fQUJTVFJBQ1QgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19BQlNUUkFDVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5JbnRlcmZhY2U8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOVEVSRkFDRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FU3VwZXIgVHlwZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVNVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVPcGVyYXRpb25zPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRU9QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBBdHRyaWJ1dGVzPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFJlZmVyZW5jZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFMTF9SRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9SRUZFUkVOQ0VTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVSZWZlcmVuY2VzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRVJFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUF0dHJpYnV0ZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRUFUVFJJQlVURVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQVRUUklCVVRFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIENvbnRhaW5tZW50czwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX0NPTlRBSU5NRU5UUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfQ09OVEFJTk1FTlRTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgT3BlcmF0aW9uczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX19FQUxMX09QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX09QRVJBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBTdHJ1Y3R1cmFsIEZlYXR1cmVzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN1cGVyIFR5cGVzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VBTExfU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1NVUEVSX1RZUEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVJRCBBdHRyaWJ1dGU8L2I+PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0VJRF9BVFRSSUJVVEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FSURfQVRUUklCVVRFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBGaWxlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRFREX0ZJTEUgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbW1lbnQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0NPTU1FTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkNvbnRlbnQ8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfX0NPTlRFTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBBdHRyaWJ1dGU8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVsZW1lbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW1wdHlDb250ZW50SW1wbCA8ZW0+RW1wdHkgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW1wdHlDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVtcHR5Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU1QVFlfQ09OVEVOVCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTVBUWV9DT05URU5UX19HUk9VUCA9IERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTVBUWV9DT05URU5UX19FTEVNRU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW1wdHkgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VNUFRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IERURF9FTEVNRU5UX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBbnlDb250ZW50SW1wbCA8ZW0+QW55IENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREFueUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREQW55Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQU5ZX0NPTlRFTlQgPSA1OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkdyb3VwPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQU5ZX0NPTlRFTlRfX0dST1VQID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RWxlbWVudDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0FOWV9DT05URU5UX19FTEVNRU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+QW55IENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9BTllfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBDRGF0YUNvbnRlbnRJbXBsIDxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBDRGF0YUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFREUENEYXRhQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfUENfREFUQV9DT05URU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgPSBEVERfRUxFTUVOVF9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UID0gRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUENfREFUQV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfRUxFTUVOVF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsIDxlbT5FbGVtZW50IFJlZmVyZW5jZSBDb250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVCA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+R3JvdXA8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQ8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5SZWZlcmVuY2VkIEVsZW1lbnQ8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwgPGVtPkZpbGU8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRklMRSA9IDk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRklMRV9fQ09NTUVOVCA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyc2UgRXJyb3I8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0ZJTEVfX1BBUlNFX0VSUk9SID0gMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgQ29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX19EVERfQ09OVEVOVCA9IDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEVudW1lcmF0aW9uIFR5cGU8L2I+PC9lbT4nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkZpbGU8L2VtPicgY2xhc3MuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9GSUxFX0ZFQVRVUkVfQ09VTlQgPSA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQmFzaWNUeXBlSW1wbCA8ZW0+QmFzaWMgVHlwZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQmFzaWNUeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREJhc2ljVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRSA9IDEwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQU5OT1RBVElPTlM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+TmFtZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3MgTmFtZTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5TVEFOQ0VfQ0xBU1M7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RGVmYXVsdCBWYWx1ZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fREVGQVVMVF9WQUxVRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0RFRkFVTFRfVkFMVUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVBhY2thZ2U8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkFic3RyYWN0PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19BQlNUUkFDVCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0FCU1RSQUNUOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkludGVyZmFjZTwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fSU5URVJGQUNFID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fSU5URVJGQUNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVTdXBlciBUeXBlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FU1VQRVJfVFlQRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RU9wZXJhdGlvbnM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIEF0dHJpYnV0ZXM8L2I+PC9lbT4nIHJlZmVyZW5jZQotCSAqIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9BVFRSSUJVVEVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9BVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgUmVmZXJlbmNlczwvYj48L2VtPicgcmVmZXJlbmNlCi0JICogbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQUxMX1JFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FQUxMX1JFRkVSRU5DRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RVJlZmVyZW5jZXM8L2I+PC9lbT4nIGNvbnRhaW5tZW50Ci0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgPSBFY29yZVBhY2thZ2UuRUNMQVNTX19FUkVGRVJFTkNFUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQXR0cmlidXRlczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBVFRSSUJVVEVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgQ29udGFpbm1lbnRzPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfQ09OVEFJTk1FTlRTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9DT05UQUlOTUVOVFM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUFsbCBPcGVyYXRpb25zPC9iPjwvZW0+JyByZWZlcmVuY2UKLQkgKiBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0JBU0lDX1RZUEVfX0VBTExfT1BFUkFUSU9OUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfT1BFUkFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FQWxsIFN0cnVjdHVyYWwgRmVhdHVyZXM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTID0gRWNvcmVQYWNrYWdlLkVDTEFTU19fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbGwgU3VwZXIgVHlwZXM8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUyA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VBTExfU1VQRVJfVFlQRVM7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUlEIEF0dHJpYnV0ZTwvYj48L2VtPicgcmVmZXJlbmNlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fRUlEX0FUVFJJQlVURSA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfX0VJRF9BVFRSSUJVVEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+S2luZDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfQkFTSUNfVFlQRV9fS0lORCA9IEVjb3JlUGFja2FnZS5FQ0xBU1NfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkJhc2ljIFR5cGU8L2VtPicKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX0ZFQVRVUkVfQ09VTlQgPSBFY29yZVBhY2thZ2UuRUNMQVNTX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW51bWVyYXRpb25UeXBlSW1wbCA8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW51bWVyYXRpb25UeXBlSW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRSA9IDExOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVBbm5vdGF0aW9uczwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0VBTk5PVEFUSU9OUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5OYW1lPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FID0gRWNvcmVQYWNrYWdlLkVFTlVNX19OQU1FOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkluc3RhbmNlIENsYXNzIE5hbWU8L2I+PC9lbT4nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0lOU1RBTkNFX0NMQVNTX05BTUU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+SW5zdGFuY2UgQ2xhc3M8L2I+PC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTID0gRWNvcmVQYWNrYWdlLkVFTlVNX19JTlNUQU5DRV9DTEFTUzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EZWZhdWx0IFZhbHVlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19ERUZBVUxUX1ZBTFVFID0gRWNvcmVQYWNrYWdlLkVFTlVNX19ERUZBVUxUX1ZBTFVFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVQYWNrYWdlPC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UgPSBFY29yZVBhY2thZ2UuRUVOVU1fX0VQQUNLQUdFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlNlcmlhbGl6YWJsZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5VTUVSQVRJT05fVFlQRV9fU0VSSUFMSVpBQkxFID0gRWNvcmVQYWNrYWdlLkVFTlVNX19TRVJJQUxJWkFCTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RUxpdGVyYWxzPC9iPjwvZW0+JyBjb250YWlubWVudAotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA9IEVjb3JlUGFja2FnZS5FRU5VTV9fRUxJVEVSQUxTOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPktpbmQ8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQgPSBFY29yZVBhY2thZ2UuRUVOVU1fRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA9IEVjb3JlUGFja2FnZS5FRU5VTV9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RW51bWVyYXRpb24gVHlwZTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVU1FUkFUSU9OX1RZUEVfRkVBVFVSRV9DT1VOVCA9IEVjb3JlUGFja2FnZS5FRU5VTV9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURENvbnRlbnRJbXBsIDxlbT5Db250ZW50PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERDb250ZW50SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0NPTlRFTlQgPSAxOTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0NPTlRFTlRfX0RURF9GSUxFID0gMDsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+Q29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwgPGVtPk5vdGF0aW9uPC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVEROb3RhdGlvbkltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfTk9UQVRJT04gPSAxMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX05PVEFUSU9OX19EVERfRklMRSA9IERURF9DT05URU5UX19EVERfRklMRTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Db21tZW50PC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fQ09NTUVOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAwOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN5c3RlbSBJRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX1NZU1RFTV9JRCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlB1YmxpYyBJRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fX1BVQkxJQ19JRCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAyOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eTwvYj48L2VtPicgcmVmZXJlbmNlIGxpc3QuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9OT1RBVElPTl9fRU5USVRZID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDM7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPk5vdGF0aW9uPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfTk9UQVRJT05fRkVBVFVSRV9DT1VOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyA0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCA8ZW0+RW50aXR5PC9lbT59JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlRJVFkgPSAxMzsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRmlsZTwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fRFREX0ZJTEUgPSBEVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29tbWVudDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19DT01NRU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFyYW1ldGVyIEVudGl0eTwvYj48L2VtPicKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDE7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+Q29udGVudDwvYj48L2VtPicgY29udGFpbm1lbnQKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19DT05URU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDI7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UGFybSBFbnRpdHkgUmVmPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAzOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVudGl0eSBSZWZlcmVuY2U8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9iPjwvZW0+JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDY7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudGl0eTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDc7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERFbnRpdHlDb250ZW50SW1wbCA8ZW0+RW50aXR5IENvbnRlbnQ8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUNvbnRlbnRJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRERW50aXR5Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfRU5USVRZX0NPTlRFTlQgPSAxNDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgPSAwOwotCi0JLyoqCi0JICogVGhlIG51bWJlciBvZiBzdHJ1Y3R1cmFsIGZlYXR1cmVzIG9mIHRoZSB0aGUgJzxlbT5FbnRpdHkgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgPSAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERXh0ZXJuYWxFbnRpdHlJbXBsIDxlbT5FeHRlcm5hbCBFbnRpdHk8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREV4dGVybmFsRW50aXR5SW1wbAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFkgPSAxNTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5EVEQgRW50aXR5PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZID0gRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPlN5c3RlbSBJRDwvYj48L2VtPicgYXR0cmlidXRlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+UHVibGljIElEPC9iPjwvZW0+JyBhdHRyaWJ1dGUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Ob3RhdGlvbjwvYj48L2VtPicgcmVmZXJlbmNlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMjsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbnRpdHkgUmVmZXJlbmNlZCBGcm9tIEFub3RoZXIgRmlsZTwvYj48L2VtPicKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFRF9GUk9NX0FOT1RIRVJfRklMRSA9IERURF9FTlRJVFlfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMzsKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2Ygc3RydWN0dXJhbCBmZWF0dXJlcyBvZiB0aGUgdGhlICc8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRVhURVJOQUxfRU5USVRZX0ZFQVRVUkVfQ09VTlQgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDQ7Ci0KLQkvKioKLQkgKiBUaGUgbWV0YSBvYmplY3QgaWQgZm9yIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERJbnRlcm5hbEVudGl0eUltcGwgPGVtPkludGVybmFsIEVudGl0eTwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRESW50ZXJuYWxFbnRpdHlJbXBsCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFja2FnZUltcGwjZ2V0RFRESW50ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX0lOVEVSTkFMX0VOVElUWSA9IDE2OwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkRURCBFbnRpdHk8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgPSBEVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFk7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+VmFsdWU8L2I+PC9lbT4nIGF0dHJpYnV0ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUgPSBEVERfRU5USVRZX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkludGVybmFsIEVudGl0eTwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0lOVEVSTkFMX0VOVElUWV9GRUFUVVJFX0NPVU5UID0gRFREX0VOVElUWV9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCA8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPn0nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlpbnQgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFID0gMTc7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RFREIEZpbGU8L2I+PC9lbT4nIGNvbnRhaW5lcgotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgPSBEVERfQ09OVEVOVF9fRFREX0ZJTEU7Ci0KLQkvKioKLQkgKiBUaGUgZmVhdHVyZSBpZCBmb3IgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZID0gRFREX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nCi0JICogY2xhc3MuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfRkVBVFVSRV9DT1VOVCA9IERURF9DT05URU5UX0ZFQVRVUkVfQ09VTlQgKyAxOwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwgPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+fScKLQkgKiBjbGFzcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlQgPSAxODsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5Hcm91cDwvYj48L2VtPicgY29udGFpbmVyCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5FbGVtZW50PC9iPjwvZW0+JyBjb250YWluZXIKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCWludCBEVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVDsKLQotCS8qKgotCSAqIFRoZSBmZWF0dXJlIGlkIGZvciB0aGUgJzxlbT48Yj5PY2N1cnJlbmNlPC9iPjwvZW0+JyBhdHRyaWJ1dGUuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JaW50IERURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgPSBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFOwotCi0JLyoqCi0JICogVGhlIGZlYXR1cmUgaWQgZm9yIHRoZSAnPGVtPjxiPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2I+PC9lbT4nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA9IERURF9SRVBFQVRBQkxFX0NPTlRFTlRfRkVBVFVSRV9DT1VOVCArIDA7Ci0KLQkvKioKLQkgKiBUaGUgbnVtYmVyIG9mIHN0cnVjdHVyYWwgZmVhdHVyZXMgb2YgdGhlIHRoZSAnPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+JwotCSAqIGNsYXNzLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlpbnQgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9GRUFUVVJFX0NPVU5UID0gRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9GRUFUVVJFX0NPVU5UICsgMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZSA8ZW0+T2NjdXJyZW5jZSBUeXBlPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURE9jY3VycmVuY2VUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9PQ0NVUlJFTkNFX1RZUEUgPSAyMDsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59JwotCSAqIGVudW0uIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERURERlZmF1bHRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9ERUZBVUxUX0tJTkQgPSAyMTsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kIDxlbT5CYXNpYyBUeXBlIEtpbmQ8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERCYXNpY1R5cGVLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9CQVNJQ19UWVBFX0tJTkQgPSAyMjsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kIDxlbT5FbnVtIEdyb3VwIEtpbmQ8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXREVERFbnVtR3JvdXBLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JaW50IERURF9FTlVNX0dST1VQX0tJTkQgPSAyMzsKLQotCS8qKgotCSAqIFRoZSBtZXRhIG9iamVjdCBpZCBmb3IgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn0nCi0JICogZW51bS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURFBhY2thZ2VJbXBsI2dldERUREdyb3VwS2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBEVERfR1JPVVBfS0lORCA9IDI0OwotCi0JLyoqCi0JICogVGhlIG1ldGEgb2JqZWN0IGlkIGZvciB0aGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLlhNTFNjaGVtYURlZmluZWRUeXBlIDxlbT5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvZW0+fScKLQkgKiBlbnVtLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGUKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYWNrYWdlSW1wbCNnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCWludCBYTUxfU0NIRU1BX0RFRklORURfVFlQRSA9IDI1OwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50IDxlbT5FbGVtZW50IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVsZW1lbnRDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwIDxlbT5Hcm91cDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+R3JvdXA8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50I2dldEdyb3VwKCkKLQkgKiBAc2VlICNnZXREVERFbGVtZW50Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudENvbnRlbnRfR3JvdXAoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWluZXIgcmVmZXJlbmNlICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQjZ2V0RWxlbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRDb250ZW50X0VsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50IDxlbT5Hcm91cCBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Hcm91cCBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREdyb3VwQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRHcm91cEtpbmQgPGVtPkdyb3VwIEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+R3JvdXAgS2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50I2dldEdyb3VwS2luZCgpCi0JICogQHNlZSAjZ2V0RFRER3JvdXBDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERHcm91cENvbnRlbnRfR3JvdXBLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudCNnZXRDb250ZW50KCkKLQkgKiBAc2VlICNnZXREVERHcm91cENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREdyb3VwQ29udGVudF9Db250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSA8ZW0+QXR0cmlidXRlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5BdHRyaWJ1dGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFREQXR0cmlidXRlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+Q29tbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREQXR0cmlidXRlX0NvbW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdEtpbmQgPGVtPkRlZmF1bHQgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXREZWZhdWx0S2luZCgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfRGVmYXVsdEtpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGUjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfRGVmYXVsdFZhbHVlU3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAc2VlICNnZXREVERBdHRyaWJ1dGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZSNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFREQXR0cmlidXRlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EVEQgRWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlI2dldERUREVsZW1lbnQoKQotCSAqIEBzZWUgI2dldERUREF0dHJpYnV0ZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCA8ZW0+RWxlbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RWxlbWVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERWxlbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbW1lbnQoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREVsZW1lbnRfQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQjZ2V0Q29udGVudCA8ZW0+Q29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldENvbnRlbnQoKQotCSAqIEBzZWUgI2dldERUREVsZW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRfQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudCNnZXREVERBdHRyaWJ1dGUgPGVtPkRURCBBdHRyaWJ1dGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EVEQgQXR0cmlidXRlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50I2dldERUREF0dHJpYnV0ZSgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50IDxlbT5FbXB0eSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5FbXB0eSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREVtcHR5Q29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50IDxlbT5BbnkgQ29udGVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QW55IENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREFueUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudCA8ZW0+UEMgRGF0YSBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5QQyBEYXRhIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURFBDRGF0YUNvbnRlbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVsZW1lbnQgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50I2dldFJlZmVyZW5jZWRFbGVtZW50IDxlbT5SZWZlcmVuY2VkIEVsZW1lbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+UmVmZXJlbmNlZCBFbGVtZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCNnZXRSZWZlcmVuY2VkRWxlbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50X1JlZmVyZW5jZWRFbGVtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50IDxlbT5SZXBlYXRhYmxlIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlJlcGVhdGFibGUgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURFJlcGVhdGFibGVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSA8ZW0+T2NjdXJyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudCNnZXRPY2N1cnJlbmNlKCkKLQkgKiBAc2VlICNnZXREVERSZXBlYXRhYmxlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlIDxlbT5GaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5GaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPkNvbW1lbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9Db21tZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNpc1BhcnNlRXJyb3IgPGVtPlBhcnNlIEVycm9yPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlBhcnNlIEVycm9yPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2lzUGFyc2VFcnJvcigpCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9QYXJzZUVycm9yKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERURENvbnRlbnQgPGVtPkRURCBDb250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICc8ZW0+RFREIENvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGUjZ2V0RFREQ29udGVudCgpCi0JICogQHNlZSAjZ2V0RFRERmlsZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERmlsZV9EVERDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlI2dldERUREVudW1lcmF0aW9uVHlwZSA8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QgJzxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZSNnZXREVERFbnVtZXJhdGlvblR5cGUoKQotCSAqIEBzZWUgI2dldERUREZpbGUoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZSA8ZW0+QmFzaWMgVHlwZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+QmFzaWMgVHlwZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERCYXNpY1R5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUjZ2V0S2luZCA8ZW0+S2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5LaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGUjZ2V0S2luZCgpCi0JICogQHNlZSAjZ2V0RFREQmFzaWNUeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERCYXNpY1R5cGVfS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGUgPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudW1lcmF0aW9uIFR5cGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldEtpbmQgPGVtPktpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+S2luZDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldEtpbmQoKQotCSAqIEBzZWUgI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERW51bWVyYXRpb25UeXBlX0tpbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUgPGVtPkRURCBGaWxlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EVEQgRmlsZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlI2dldERUREZpbGUoKQotCSAqIEBzZWUgI2dldERUREVudW1lcmF0aW9uVHlwZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Ob3RhdGlvbjwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24KLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURE5vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRDb21tZW50KCkKLQkgKiBAc2VlICNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFN5c3RlbUlEIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+U3lzdGVtIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRTeXN0ZW1JRCgpCi0JICogQHNlZSAjZ2V0RFRETm90YXRpb24oKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1N5c3RlbUlEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb24jZ2V0UHVibGljSUQgPGVtPlB1YmxpYyBJRDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QdWJsaWMgSUQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldFB1YmxpY0lEKCkKLQkgKiBAc2VlICNnZXREVEROb3RhdGlvbigpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRETm90YXRpb25fUHVibGljSUQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlIGxpc3QgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbiNnZXRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERURE5vdGF0aW9uKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVEROb3RhdGlvbl9FbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCA8ZW0+Q29tbWVudDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5Db21tZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0Q29tbWVudCgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfQ29tbWVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNpc1BhcmFtZXRlckVudGl0eSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJzxlbT5QYXJhbWV0ZXIgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjaXNQYXJhbWV0ZXJFbnRpdHkoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVBdHRyaWJ1dGUgZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBjb250YWlubWVudCByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5tZW50IHJlZmVyZW5jZSAnPGVtPkNvbnRlbnQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRDb250ZW50KCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9Db250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldFBhcm1FbnRpdHlSZWYgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5QYXJtIEVudGl0eSBSZWY8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmKCkKLQkgKiBAc2VlICNnZXREVERFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEVudGl0eVJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSBsaXN0ICc8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgbGlzdCAnPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5I2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKQotCSAqIEBzZWUgI2dldERUREVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudCA8ZW0+RW50aXR5IENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudGl0eSBDb250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERFbnRpdHlDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQjZ2V0RFRERW50aXR5IDxlbT5EVEQgRW50aXR5PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJzxlbT5EVEQgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50I2dldERUREVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkgPGVtPkV4dGVybmFsIEVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICc8ZW0+RXh0ZXJuYWwgRW50aXR5PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlN5c3RlbSBJRDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0U3lzdGVtSUQoKQotCSAqIEBzZWUgI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9TeXN0ZW1JRCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSBhdHRyaWJ1dGUgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldFB1YmxpY0lEIDxlbT5QdWJsaWMgSUQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgYXR0cmlidXRlICc8ZW0+UHVibGljIElEPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXRQdWJsaWNJRCgpCi0JICogQHNlZSAjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREV4dGVybmFsRW50aXR5X1B1YmxpY0lEKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0Tm90YXRpb24gPGVtPk5vdGF0aW9uPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAnPGVtPk5vdGF0aW9uPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eSNnZXROb3RhdGlvbigpCi0JICogQHNlZSAjZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X05vdGF0aW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIHJlZmVyZW5jZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERXh0ZXJuYWxFbnRpdHkjZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RW50aXR5IFJlZmVyZW5jZWQgRnJvbSBBbm90aGVyIEZpbGU8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5I2dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKQotCSAqIEBzZWUgI2dldERUREV4dGVybmFsRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRVJlZmVyZW5jZSBnZXREVERFeHRlcm5hbEVudGl0eV9FbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5IDxlbT5JbnRlcm5hbCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkludGVybmFsIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERUREludGVybmFsRW50aXR5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRESW50ZXJuYWxFbnRpdHkjZ2V0VmFsdWUgPGVtPlZhbHVlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGF0dHJpYnV0ZSAnPGVtPlZhbHVlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eSNnZXRWYWx1ZSgpCi0JICogQHNlZSAjZ2V0RFRESW50ZXJuYWxFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQXR0cmlidXRlIGdldERUREludGVybmFsRW50aXR5X1ZhbHVlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSA8ZW0+UGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2U8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPlBhcmFtZXRlciBFbnRpdHkgUmVmZXJlbmNlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUNsYXNzIGdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJzxlbT5FbnRpdHk8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSNnZXRFbnRpdHkoKQotCSAqIEBzZWUgI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IDxlbT5FbnRpdHkgUmVmZXJlbmNlIENvbnRlbnQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBjbGFzcyAnPGVtPkVudGl0eSBSZWZlcmVuY2UgQ29udGVudDwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFQ2xhc3MgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIHRoZSByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQjZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPGVtPkVsZW1lbnQgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgcmVmZXJlbmNlICc8ZW0+RWxlbWVudCBSZWZlcmVuY2VkIEVudGl0eTwvZW0+Jy4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCNnZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpCi0JICogQHNlZSAjZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqLwotCUVSZWZlcmVuY2UgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGNsYXNzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50IDxlbT5Db250ZW50PC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgY2xhc3MgJzxlbT5Db250ZW50PC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50Ci0JICogQGdlbmVyYXRlZAotCSAqLwotCUVDbGFzcyBnZXREVERDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgdGhlIGNvbnRhaW5lciByZWZlcmVuY2UgJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQjZ2V0RFRERmlsZSA8ZW0+RFREIEZpbGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciB0aGUgY29udGFpbmVyIHJlZmVyZW5jZSAnPGVtPkRURCBGaWxlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50I2dldERUREZpbGUoKQotCSAqIEBzZWUgI2dldERURENvbnRlbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFUmVmZXJlbmNlIGdldERURENvbnRlbnRfRFRERmlsZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlIDxlbT5PY2N1cnJlbmNlIFR5cGU8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+T2NjdXJyZW5jZSBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVERPY2N1cnJlbmNlVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nLgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1ldGEgb2JqZWN0IGZvciBlbnVtICc8ZW0+RGVmYXVsdCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEREZWZhdWx0S2luZAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXREVEREZWZhdWx0S2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQgPGVtPkJhc2ljIFR5cGUgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5CYXNpYyBUeXBlIEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFREQmFzaWNUeXBlS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQgPGVtPkVudW0gR3JvdXAgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5FbnVtIEdyb3VwIEtpbmQ8L2VtPicuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFRERW51bUdyb3VwS2luZCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJ3tAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwS2luZCA8ZW0+R3JvdXAgS2luZDwvZW0+fScuCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgbWV0YSBvYmplY3QgZm9yIGVudW0gJzxlbT5Hcm91cCBLaW5kPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRUVudW0gZ2V0RFRER3JvdXBLaW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGUgPGVtPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtZXRhIG9iamVjdCBmb3IgZW51bSAnPGVtPlhNTCBTY2hlbWEgRGVmaW5lZCBUeXBlPC9lbT4nLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlFRW51bSBnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHJldHVybiB0aGUgZmFjdG9yeSB0aGF0IGNyZWF0ZXMgdGhlIGluc3RhbmNlcyBvZiB0aGUgbW9kZWwuCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURUREZhY3RvcnkgZ2V0RFRERmFjdG9yeSgpOwotCi19IC8vIERURFBhY2thZ2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjY4NjJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlI2dldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZXh0ZW5kcyBFTmFtZWRFbGVtZW50LCBEVERDb250ZW50LCBEVERPYmplY3QsIERURFNvdXJjZU9mZnNldCB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+RW50aXR5PC9iPjwvZW0+JyByZWZlcmVuY2UuIEl0IGlzCi0JICogYmlkaXJlY3Rpb25hbCBhbmQgaXRzIG9wcG9zaXRlIGlzICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHkjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59Jy4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mIHRoZSAnPGVtPkVudGl0eTwvZW0+JyByZWZlcmVuY2UgaXNuJ3QgY2xlYXIsCi0JICogdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJzxlbT5FbnRpdHk8L2VtPicgcmVmZXJlbmNlLgotCSAqIEBzZWUgI3NldEVudGl0eShEVERFbnRpdHkpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eSNnZXRQYXJtRW50aXR5UmVmCi0JICogQG1vZGVsIG9wcG9zaXRlPSJwYXJtRW50aXR5UmVmIiByZXF1aXJlZD0idHJ1ZSIKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JRFRERW50aXR5IGdldEVudGl0eSgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlICd7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UjZ2V0RW50aXR5IDxlbT5FbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgdmFsdWUgb2YgdGhlICc8ZW0+RW50aXR5PC9lbT4nIHJlZmVyZW5jZS4KLQkgKiBAc2VlICNnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQl2b2lkIHNldEVudGl0eShEVERFbnRpdHkgdmFsdWUpOwotCi19IC8vIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXBlYXRhYmxlQ29udGVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXBlYXRhYmxlQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzljZDQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVwZWF0YWJsZUNvbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPlJlcGVhdGFibGUgQ29udGVudDwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIAotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBzdXBwb3J0ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSA8ZW0+T2NjdXJyZW5jZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXREVERSZXBlYXRhYmxlQ29udGVudCgpCi0gKiBAbW9kZWwgYWJzdHJhY3Q9InRydWUiCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVwZWF0YWJsZUNvbnRlbnQgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudCB7Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+T2NjdXJyZW5jZTwvYj48L2VtPicgYXR0cmlidXRlLgotCSAqIFRoZSBsaXRlcmFscyBhcmUgZnJvbSB0aGUgZW51bWVyYXRpb24KLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZX0uIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiB0aGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nIGF0dHJpYnV0ZSBpc24ndCBjbGVhciwKLQkgKiB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPk9jY3VycmVuY2U8L2VtPicgYXR0cmlidXRlLgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZQotCSAqIEBzZWUgI3NldE9jY3VycmVuY2UoRFRET2NjdXJyZW5jZVR5cGUpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqLwotCURURE9jY3VycmVuY2VUeXBlIGdldE9jY3VycmVuY2UoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSAne0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQjZ2V0T2NjdXJyZW5jZSA8ZW0+T2NjdXJyZW5jZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIG5ldyB2YWx1ZSBvZiB0aGUgJzxlbT5PY2N1cnJlbmNlPC9lbT4nIGF0dHJpYnV0ZS4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGUKLQkgKiBAc2VlICNnZXRPY2N1cnJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0Jdm9pZCBzZXRPY2N1cnJlbmNlKERURE9jY3VycmVuY2VUeXBlIHZhbHVlKTsKLQotfSAvLyBEVERSZXBlYXRhYmxlQ29udGVudApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjI3OTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVzb3VyY2UgewotCS8vIEVudW1lcmF0aW9uIENvbnN0YW50cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWUlDT04gPSAiaWNvbnMvYW55LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5USUNPTiA9ICJpY29ucy9lbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlJQ09OID0gImljb25zL2VudGl0eS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFSUNPTiA9ICJpY29ucy9hdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OSUNPTiA9ICJpY29ucy9ub3RhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlJQ09OID0gImljb25zL2VtcHR5Y29udGVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENEQVRBSUNPTiA9ICJpY29ucy9vbmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWVJFRkVSRU5DRUlDT04gPSAiaWNvbnMvZW50aXR5X3JlZmVyZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVJQ09OID0gImljb25zL29uZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxJQ09OID0gImljb25zL29wdGlvbmFsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVPUk1PUkVJQ09OID0gImljb25zL29uZW9ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRUlDT04gPSAiaWNvbnMvemVyb29ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVTRVFVRU5DRUlDT04gPSAiaWNvbnMvb25lc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMU0VRVUVOQ0VJQ09OID0gImljb25zL29wdGlvbmFsc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRVNFUVVFTkNFSUNPTiA9ICJpY29ucy9vbmVvcm1vcmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRVNFUVVFTkNFSUNPTiA9ICJpY29ucy96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FQ0hPSUNFSUNPTiA9ICJpY29ucy9vbmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMQ0hPSUNFSUNPTiA9ICJpY29ucy9vcHRpb25hbGNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT05FT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy9vbmVvcm1vcmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVDSE9JQ0VJQ09OID0gImljb25zL3plcm9vcm1vcmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFRERklMRUlDT04gPSAiaWNvbnMvRFRERmlsZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdEVEQgPSAiaWNvbnMvbmV3ZHRkX3dpei5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXSFRNTEZPUk0gPSAiaWNvbnMvZ2VuaHRtZm9ybV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERTb3VyY2VPZmZzZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvRFREU291cmNlT2Zmc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzJiMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERTb3VyY2VPZmZzZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgaW50ZXJmYWNlIERURFNvdXJjZU9mZnNldCB7Ci0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdik7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KTsKLQotfS8vIERURFNvdXJjZU9mZnNldApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9EVERUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ4ZmRjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL0RURFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mOwotCi1wdWJsaWMgaW50ZXJmYWNlIERURFR5cGUgZXh0ZW5kcyBEVERPYmplY3QgewotCS8vIGNvbnN0YW50IHN0cmluZ3MgZm9yIGR0ZCBhdHRyaWJ1dGUgdHlwZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT05FID0gIk5vbmUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQSA9ICJDaGFyYWN0ZXIgRGF0YSAoQ0RBVEEpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIklkZW50aWZpZXIgKElEKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRiA9ICJJRCBSZWZlcmVuY2UgKElEUkVGKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSAiSUQgUmVmZXJlbmNlcyAoSURSRUZTKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiRW50aXR5IE5hbWUgKEVOVElUWSkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVMgPSAiRW50aXR5IE5hbWVzIChFTlRJVElFUykiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9ICJOYW1lIFRva2VuIChOTVRPS0VOKSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOTVRPS0VOUyA9ICJOYW1lIFRva2VucyAoTk1UT0tFTlMpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1fTkFNRV9UT0tFTl9HUk9VUCA9ICJFbnVtZXJhdGVkIE5hbWUgVG9rZW5zIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1fTk9UQVRJT05fR1JPVVAgPSAiRW51bWVyYXRlZCBOT1RBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9YTUxTY2hlbWFEZWZpbmVkVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9YTUxTY2hlbWFEZWZpbmVkVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDEzOGY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvWE1MU2NoZW1hRGVmaW5lZFR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5BYnN0cmFjdEVudW1lcmF0b3I7Ci0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGl0ZXJhbHMgb2YgdGhlIGVudW1lcmF0aW9uICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nLAotICogYW5kIHV0aWxpdHkgbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIHRoZW0uIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZSNnZXRYTUxTY2hlbWFEZWZpbmVkVHlwZSgpCi0gKiBAbW9kZWwKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTFNjaGVtYURlZmluZWRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbnVtZXJhdG9yIHsKLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PTkVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PTkUgPSAtMTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlNUUklORzwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNTVFJJTkdfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUUklORyA9IDE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5CT09MRUFOPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0JPT0xFQU5fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPT0xFQU4gPSAyOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+RkxPQVQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRkxPQVRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZMT0FUID0gMzsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRPVUJMRTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNET1VCTEVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVUJMRSA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ERUNJTUFMPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RFQ0lNQUxfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFQ0lNQUwgPSA1OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRUlOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRUlOU1RBTlRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVJTlNUQU5UID0gNjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVEVVJBVElPTjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNUSU1FRFVSQVRJT05fTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRJTUVEVVJBVElPTiA9IDc7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5SRUNVUlJJTkdJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1JFQ1VSUklOR0lOU1RBTlRfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFQ1VSUklOR0lOU1RBTlQgPSA4OwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QklOQVJZPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0JJTkFSWV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQklOQVJZID0gOTsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNVUklfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVSSSA9IDEwOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URUdFUjwvYj48L2VtPicgbGl0ZXJhbCB2YWx1ZS4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNJTlRFR0VSX0xJVEVSQUwKLQkgKiBAbW9kZWwKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTlRFR0VSID0gMTE7Ci0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5EQVRFPC9iPjwvZW0+JyBsaXRlcmFsIHZhbHVlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0RBVEVfTElURVJBTAotCSAqIEBtb2RlbAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERBVEUgPSAxMjsKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUU8L2I+PC9lbT4nIGxpdGVyYWwgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRV9MSVRFUkFMCi0JICogQG1vZGVsCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVElNRSA9IDEzOwotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Tk9ORTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5OT05FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI05PTkUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIE5PTkVfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShOT05FLCAiTk9ORSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5TVFJJTkc8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjU1RSSU5HCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBTVFJJTkdfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShTVFJJTkcsICJTVFJJTkciKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+Qk9PTEVBTjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkJPT0xFQU48L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjQk9PTEVBTgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgQk9PTEVBTl9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKEJPT0xFQU4sICJCT09MRUFOIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkZMT0FUPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+RkxPQVQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRkxPQVQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIEZMT0FUX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoRkxPQVQsICJGTE9BVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5ET1VCTEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jCi0JICogLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5ET1VCTEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjRE9VQkxFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBET1VCTEVfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShET1VCTEUsICJET1VCTEUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+REVDSU1BTDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPkRFQ0lNQUw8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjREVDSU1BTAotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgREVDSU1BTF9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKERFQ0lNQUwsICJERUNJTUFMIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlRJTUVJTlNUQU5UPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLQotCSAqIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+VElNRUlOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRUlOU1RBTlQKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFRJTUVJTlNUQU5UX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoVElNRUlOU1RBTlQsICJUSU1FSU5TVEFOVCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgJzxlbT48Yj5USU1FRFVSQVRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5USU1FRFVSQVRJT048L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0Ci0JICogaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVElNRURVUkFUSU9OCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBUSU1FRFVSQVRJT05fTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShUSU1FRFVSQVRJT04sICJUSU1FRFVSQVRJT04iKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+UkVDVVJSSU5HSU5TVEFOVDwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPlJFQ1VSUklOR0lOU1RBTlQ8L2I+PC9lbT4nIGxpdGVyYWwKLQkgKiBvYmplY3QgaXNuJ3QgY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uCi0JICogaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNSRUNVUlJJTkdJTlNUQU5UCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBSRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoUkVDVVJSSU5HSU5TVEFOVCwgIlJFQ1VSUklOR0lOU1RBTlQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+QklOQVJZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdC4gPCEtLSBiZWdpbi11c2VyLWRvYwotCSAqIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+QklOQVJZPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI0JJTkFSWQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgQklOQVJZX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoQklOQVJZLCAiQklOQVJZIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPlVSSTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5VUkk8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjVVJJCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBVUklfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShVUkksICJVUkkiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+SU5URUdFUjwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4KLQkgKiA8cD4KLQkgKiBJZiB0aGUgbWVhbmluZyBvZiAnPGVtPjxiPklOVEVHRVI8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0IGlzbid0Ci0JICogY2xlYXIsIHRoZXJlIHJlYWxseSBzaG91bGQgYmUgbW9yZSBvZiBhIGRlc2NyaXB0aW9uIGhlcmUuLi4KLQkgKiA8L3A+Ci0JICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjSU5URUdFUgotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgWE1MU2NoZW1hRGVmaW5lZFR5cGUgSU5URUdFUl9MSVRFUkFMID0gbmV3IFhNTFNjaGVtYURlZmluZWRUeXBlKElOVEVHRVIsICJJTlRFR0VSIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSAnPGVtPjxiPkRBVEU8L2I+PC9lbT4nIGxpdGVyYWwgb2JqZWN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPgotCSAqIDxwPgotCSAqIElmIHRoZSBtZWFuaW5nIG9mICc8ZW0+PGI+REFURTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QgaXNuJ3QKLQkgKiBjbGVhciwgdGhlcmUgcmVhbGx5IHNob3VsZCBiZSBtb3JlIG9mIGEgZGVzY3JpcHRpb24gaGVyZS4uLgotCSAqIDwvcD4KLQkgKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNEQVRFCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZSBEQVRFX0xJVEVSQUwgPSBuZXcgWE1MU2NoZW1hRGVmaW5lZFR5cGUoREFURSwgIkRBVEUiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlICc8ZW0+PGI+VElNRTwvYj48L2VtPicgbGl0ZXJhbCBvYmplY3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+Ci0JICogPHA+Ci0JICogSWYgdGhlIG1lYW5pbmcgb2YgJzxlbT48Yj5USU1FPC9iPjwvZW0+JyBsaXRlcmFsIG9iamVjdCBpc24ndAotCSAqIGNsZWFyLCB0aGVyZSByZWFsbHkgc2hvdWxkIGJlIG1vcmUgb2YgYSBkZXNjcmlwdGlvbiBoZXJlLi4uCi0JICogPC9wPgotCSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI1RJTUUKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFhNTFNjaGVtYURlZmluZWRUeXBlIFRJTUVfTElURVJBTCA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZShUSU1FLCAiVElNRSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBbiBhcnJheSBvZiBhbGwgdGhlICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBYTUxTY2hlbWFEZWZpbmVkVHlwZVtdIFZBTFVFU19BUlJBWSA9IG5ldyBYTUxTY2hlbWFEZWZpbmVkVHlwZVtde05PTkVfTElURVJBTCwgU1RSSU5HX0xJVEVSQUwsIEJPT0xFQU5fTElURVJBTCwgRkxPQVRfTElURVJBTCwgRE9VQkxFX0xJVEVSQUwsIERFQ0lNQUxfTElURVJBTCwgVElNRUlOU1RBTlRfTElURVJBTCwgVElNRURVUkFUSU9OX0xJVEVSQUwsIFJFQ1VSUklOR0lOU1RBTlRfTElURVJBTCwgQklOQVJZX0xJVEVSQUwsIFVSSV9MSVRFUkFMLCBJTlRFR0VSX0xJVEVSQUwsIERBVEVfTElURVJBTCwgVElNRV9MSVRFUkFMLH07Ci0KLQkvKioKLQkgKiBBIHB1YmxpYyByZWFkLW9ubHkgbGlzdCBvZiBhbGwgdGhlICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nCi0JICogZW51bWVyYXRvcnMuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIExpc3QgVkFMVUVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KFZBTFVFU19BUlJBWSkpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgJzxlbT48Yj5YTUwgU2NoZW1hIERlZmluZWQgVHlwZTwvYj48L2VtPicgbGl0ZXJhbCB3aXRoCi0JICogdGhlIHNwZWNpZmllZCBuYW1lLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBYTUxTY2hlbWFEZWZpbmVkVHlwZSBnZXQoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBWQUxVRVNfQVJSQVkubGVuZ3RoOyArK2kpIHsKLQkJCVhNTFNjaGVtYURlZmluZWRUeXBlIHJlc3VsdCA9IFZBTFVFU19BUlJBWVtpXTsKLQkJCWlmIChyZXN1bHQudG9TdHJpbmcoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlICc8ZW0+PGI+WE1MIFNjaGVtYSBEZWZpbmVkIFR5cGU8L2I+PC9lbT4nIGxpdGVyYWwgd2l0aAotCSAqIHRoZSBzcGVjaWZpZWQgdmFsdWUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTFNjaGVtYURlZmluZWRUeXBlIGdldChpbnQgdmFsdWUpIHsKLQkJc3dpdGNoICh2YWx1ZSkgewotCQkJY2FzZSBOT05FIDoKLQkJCQlyZXR1cm4gTk9ORV9MSVRFUkFMOwotCQkJY2FzZSBTVFJJTkcgOgotCQkJCXJldHVybiBTVFJJTkdfTElURVJBTDsKLQkJCWNhc2UgQk9PTEVBTiA6Ci0JCQkJcmV0dXJuIEJPT0xFQU5fTElURVJBTDsKLQkJCWNhc2UgRkxPQVQgOgotCQkJCXJldHVybiBGTE9BVF9MSVRFUkFMOwotCQkJY2FzZSBET1VCTEUgOgotCQkJCXJldHVybiBET1VCTEVfTElURVJBTDsKLQkJCWNhc2UgREVDSU1BTCA6Ci0JCQkJcmV0dXJuIERFQ0lNQUxfTElURVJBTDsKLQkJCWNhc2UgVElNRUlOU1RBTlQgOgotCQkJCXJldHVybiBUSU1FSU5TVEFOVF9MSVRFUkFMOwotCQkJY2FzZSBUSU1FRFVSQVRJT04gOgotCQkJCXJldHVybiBUSU1FRFVSQVRJT05fTElURVJBTDsKLQkJCWNhc2UgUkVDVVJSSU5HSU5TVEFOVCA6Ci0JCQkJcmV0dXJuIFJFQ1VSUklOR0lOU1RBTlRfTElURVJBTDsKLQkJCWNhc2UgQklOQVJZIDoKLQkJCQlyZXR1cm4gQklOQVJZX0xJVEVSQUw7Ci0JCQljYXNlIFVSSSA6Ci0JCQkJcmV0dXJuIFVSSV9MSVRFUkFMOwotCQkJY2FzZSBJTlRFR0VSIDoKLQkJCQlyZXR1cm4gSU5URUdFUl9MSVRFUkFMOwotCQkJY2FzZSBEQVRFIDoKLQkJCQlyZXR1cm4gREFURV9MSVRFUkFMOwotCQkJY2FzZSBUSU1FIDoKLQkJCQlyZXR1cm4gVElNRV9MSVRFUkFMOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIE9ubHkgdGhpcyBjbGFzcyBjYW4gY29uc3RydWN0IGluc3RhbmNlcy4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBYTUxTY2hlbWFEZWZpbmVkVHlwZShpbnQgdmFsdWUsIFN0cmluZyBuYW1lKSB7Ci0JCXN1cGVyKHZhbHVlLCBuYW1lKTsKLQl9Ci0KLX0gLy8gWE1MU2NoZW1hRGVmaW5lZFR5cGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBbnlDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREFueUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YmUzMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREFueUNvbnRlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkFueSBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREFueUNvbnRlbnRJbXBsIGV4dGVuZHMgRFRERWxlbWVudENvbnRlbnRJbXBsIGltcGxlbWVudHMgRFREQW55Q29udGVudCB7Ci0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuICJBTlkiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERBbnlDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERBbnlDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQU5ZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBdHRyaWJ1dGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQXR0cmlidXRlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGY4MGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERBdHRyaWJ1dGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3NpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZUZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVjb3JlUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVBdHRyaWJ1dGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURERlZmF1bHRLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1Hcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERUeXBlOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkF0dHJpYnV0ZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldENvbW1lbnQgPGVtPkNvbW1lbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFREQXR0cmlidXRlSW1wbCNnZXREZWZhdWx0S2luZCA8ZW0+RGVmYXVsdCBLaW5kPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREF0dHJpYnV0ZUltcGwjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgTmFtZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5IDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERBdHRyaWJ1dGVJbXBsI2dldERUREVsZW1lbnQgPGVtPkRURCBFbGVtZW50PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREF0dHJpYnV0ZUltcGwgZXh0ZW5kcyBFQXR0cmlidXRlSW1wbCBpbXBsZW1lbnRzIERUREF0dHJpYnV0ZSB7Ci0KLQlwdWJsaWMgRFREQXR0cmlidXRlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRFREVHlwZSBnZXREVERUeXBlKCkgewotCQlyZXR1cm4gKERURFR5cGUpIGdldEVUeXBlKCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREVERUeXBlKERURFR5cGUgdHlwZSkgewotCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpIHR5cGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERUREJhc2ljVHlwZShpbnQgdmFsdWUpIHsKLQkJRFRERmFjdG9yeUltcGwgZmFjdG9yeSA9IChEVERGYWN0b3J5SW1wbCkgRFRERmFjdG9yeUltcGwuaW5zdGFuY2UoKTsKLQkJLy8gc2V0IGF0dHJpYnV0ZSB0eXBlCi0JCXN3aXRjaCAodmFsdWUpIHsKLQkJCWNhc2UgMCA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9OT05FKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAxIDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAyIDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0lEKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSAzIDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSA0IDoKLQkJCQlzZXREVERUeXBlKGZhY3RvcnkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGUygpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNSA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9FTlRJVFkoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDYgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfRU5USVRJRVMoKSk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDcgOgotCQkJCXNldERURFR5cGUoZmFjdG9yeS5nZXREVERCYXNpY1R5cGVfTk1UT0tFTigpKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgOCA6Ci0JCQkJc2V0RFREVHlwZShmYWN0b3J5LmdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpKTsKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZSgpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoMTI4KTsKLQotCi0JCXJlc3VsdC5hcHBlbmQoZ2V0TmFtZSgpKTsKLQotCi0JCVN0cmluZ0J1ZmZlciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJc3dpdGNoIChnZXREZWZhdWx0S2luZCgpLmdldFZhbHVlKCkpIHsKLQkJCWNhc2UgRFRERGVmYXVsdEtpbmQuSU1QTElFRCA6Ci0JCQkJdmFsdWUuYXBwZW5kKCIjSU1QTElFRCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIERURERlZmF1bHRLaW5kLlJFUVVJUkVEIDoKLQkJCQl2YWx1ZS5hcHBlbmQoIiNSRVFVSVJFRCIpOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIERURERlZmF1bHRLaW5kLkZJWEVEIDoKLQkJCQlTdHJpbmcgdHlwZSA9IGdldERURFR5cGUoKS50b1N0cmluZygpOwotCQkJCWlmICghKHR5cGUuZXF1YWxzKERURFR5cGUuSUQpIHx8IHR5cGUuZXF1YWxzKERURFR5cGUuSURSRUYpIHx8IHR5cGUuZXF1YWxzKERURFR5cGUuRU5VTV9OQU1FX1RPS0VOX0dST1VQKSB8fCB0eXBlLmVxdWFscyhEVERUeXBlLklEUkVGUykpKSB7Ci0JCQkJCXZhbHVlLmFwcGVuZCgiI0ZJWEVEIFwiIikuYXBwZW5kKGdldERlZmF1bHRWYWx1ZVN0cmluZygpKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRFRERGVmYXVsdEtpbmQuTk9GSVhFRCA6Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZVN0cmluZygpOwotCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkKLQkJCQkJdmFsdWUuYXBwZW5kKCJcIiIpLmFwcGVuZChkZWZhdWx0VmFsdWUpLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCi0JCS8vIEdldCB0aGUgYXR0cmlidXRlIHR5cGUKLQkJRFRERW50aXR5IHR5cGVFbnQgPSBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCQlpZiAodHlwZUVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYXBwZW5kKCIgJSIgKyB0eXBlRW50LmdldE5hbWUoKSArICI7ICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJRFREVHlwZSBkdGRUeXBlID0gZ2V0RFREVHlwZSgpOwotCQkJaWYgKGR0ZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpIHsKLQkJCQlzd2l0Y2ggKCgoRFREQmFzaWNUeXBlKSBkdGRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSkgewotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuQ0RBVEEgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIENEQVRBICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuSUQgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIElEICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuSURSRUYgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIElEUkVGICIpLmFwcGVuZCh2YWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIERUREJhc2ljVHlwZUtpbmQuSURSRUZTIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBJRFJFRlMgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5FTlRJVFkgOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIEVOVElUWSAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTIDoKLQkJCQkJCXJlc3VsdC5hcHBlbmQoIiBFTlRJVElFUyAiKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU4gOgotCQkJCQkJcmVzdWx0LmFwcGVuZCgiIE5NVE9LRU4gIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCWNhc2UgRFREQmFzaWNUeXBlS2luZC5OTVRPS0VOUyA6Ci0JCQkJCQlyZXN1bHQuYXBwZW5kKCIgTk1UT0tFTlMgIikuYXBwZW5kKHZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZHRkVHlwZSBpbnN0YW5jZW9mIERUREVudW1lcmF0aW9uVHlwZSkgewotCQkJCXJlc3VsdC5hcHBlbmQoIiAiKS5hcHBlbmQoYnVpbGRFbnVtU3RyaW5nKChEVERFbnVtZXJhdGlvblR5cGUpIGR0ZFR5cGUpKS5hcHBlbmQodmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCi0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIGJ1aWxkRW51bVN0cmluZyhEVERFbnVtZXJhdGlvblR5cGUgZW51bVR5cGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQotCQlpZiAoZW51bVR5cGUuZ2V0S2luZCgpLmdldFZhbHVlKCkgPT0gRFRERW51bUdyb3VwS2luZC5OT1RBVElPTl9HUk9VUCkKLQkJCXJlc3VsdCArPSAiTk9UQVRJT04gIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkJSXRlcmF0b3IgaSA9IGVudW1UeXBlLmdldEVudW1MaXRlcmFscygpLml0ZXJhdG9yKCk7Ci0JCWlmIChpLmhhc05leHQoKSkgewotCQkJcmVzdWx0ICs9ICIoIiArICgoRUVudW1MaXRlcmFsKSBpLm5leHQoKSkudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJcmVzdWx0ICs9ICIgfCAiICsgKChFRW51bUxpdGVyYWwpIGkubmV4dCgpKS50b1N0cmluZygpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXN1bHQgKz0gIikgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb24oU3RyaW5nW10gZW51bVZhbHVlcywgaW50IGVudW1LaW5kKSB7Ci0JCURUREVudW1lcmF0aW9uVHlwZSBlbnVtZXJhdGlvbiA9IERUREZhY3RvcnlJbXBsLmluc3RhbmNlKCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JCS8vIGVudW0uc2V0SUQoIkVudW1fIiArICgoRFRERWxlbWVudClnZXRNT0ZEb21haW4oKSkuZ2V0TmFtZSgpICsgIl8iICsKLQkJLy8gZ2V0TmFtZSgpKTsKLQkJRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JCWVudW1lcmF0aW9uLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCWlmIChlbnVtVmFsdWVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW51bVZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJCUVjb3JlUGFja2FnZSBlUGFja2FnZSA9IChFY29yZVBhY2thZ2UpIEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKEVjb3JlUGFja2FnZS5lTlNfVVJJKTsKLQkJCQlFRW51bUxpdGVyYWwgZW51bUxpdGVyYWwgPSAoKEVjb3JlRmFjdG9yeSkgZVBhY2thZ2UuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkJCQkvLyBNT0YyRU1GIFBvcnQKLQkJCQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKGVudW1WYWx1ZXNbaV0pOwotCQkJCWVudW1MaXRlcmFsLnNldE5hbWUoZW51bVZhbHVlc1tpXSk7Ci0JCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkJLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbChpKTsKLQkJCQllbnVtTGl0ZXJhbC5zZXRWYWx1ZShpKTsKLQotCQkJCWVudW1lcmF0aW9uLmdldEVudW1MaXRlcmFscygpLmFkZChlbnVtTGl0ZXJhbCk7Ci0JCQl9Ci0JCX0KLQkJZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bWVyYXRpb24pOwotCQlyZXR1cm4gZW51bWVyYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JCS8vIFRPRE86IGZpbmlzaCBwb3J0Ci0JCS8vIHJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgoZ2V0RFRERWxlbWVudCgpLmdldFBhdGhuYW1lKCksCi0JCS8vICJBdHRyIiwgZ2V0TmFtZSgpLCAtMSk7Ci0JfQotCi0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gVE9ETzogZmluaXNoIHBvcnQKLQkJLyoKLQkJICogT2JqZWN0W10gcmVzdWx0ID0gRFREUGF0aG5hbWVVdGlsLnBhcnNlUGF0aENvbXBvbmVudChyZWxhdGl2ZVBhdGgpOwotCQkgKiAKLQkJICogCi0JCSAqIFN0cmluZyB0eXBlID0gKFN0cmluZylyZXN1bHRbMF07Ci0JCSAqIAotCQkgKiAKLQkJICogaWYgKHR5cGUgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JCSAqIAotCQkgKiAKLQkJICogRFRET2JqZWN0IG9iaiA9IG51bGw7IGlmICh0eXBlLmVxdWFscygiVHlwZSIpKSB7IG9iaiA9Ci0JCSAqIGdldERhdGFUeXBlKCk7IH0gZWxzZSB7IHJldHVybiBudWxsOyB9Ci0JCSAqIAotCQkgKiAKLQkJICogU3RyaW5nIHJlc3RQYXRoID0gKFN0cmluZylyZXN1bHRbM107Ci0JCSAqIAotCQkgKiBpZiAoKHJlc3RQYXRoID09IG51bGwpIHx8IChvYmogPT0gbnVsbCkpIHsgcmV0dXJuIG9iajsgfSBlbHNlIHsKLQkJICogcmV0dXJuIG9iai5maW5kT2JqZWN0KHJlc3RQYXRoKTsgfQotCQkgKi8KLQl9Ci0KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQlDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCi0JCURURFR5cGUgdHlwZSA9IGdldERURFR5cGUoKTsKLQkJaWYgKHR5cGUgaW5zdGFuY2VvZiBEVERFbnVtZXJhdGlvblR5cGUpIHsKLQkJCURUREVudW1lcmF0aW9uVHlwZSBlbnVtVHlwZSA9IChEVERFbnVtZXJhdGlvblR5cGUpIHR5cGU7Ci0JCQlJdGVyYXRvciBpID0gZW51bVR5cGUuZ2V0RW51bUxpdGVyYWxzKCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCXJlc3VsdC5hZGQoKChFRW51bUxpdGVyYWwpIGkubmV4dCgpKS50b1N0cmluZygpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBsZXhJbmZvLmdldEVuZE9mZnNldCgpOwotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0S2luZCgpIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREZWZhdWx0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVEREZWZhdWx0S2luZCBERUZBVUxUX0tJTkRfRURFRkFVTFQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREZWZhdWx0S2luZCgpIDxlbT5EZWZhdWx0IEtpbmQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREZWZhdWx0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERURERlZmF1bHRLaW5kIGRlZmF1bHRLaW5kID0gREVGQVVMVF9LSU5EX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpIDxlbT5EZWZhdWx0IFZhbHVlIFN0cmluZzwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldERlZmF1bHRWYWx1ZVN0cmluZygpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9WQUxVRV9TVFJJTkdfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgPGVtPkRlZmF1bHQgVmFsdWUgU3RyaW5nPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGRlZmF1bHRWYWx1ZVN0cmluZyA9IERFRkFVTFRfVkFMVUVfU1RSSU5HX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlZCBFbnRpdHk8L2VtPn0nCi0JICogcmVmZXJlbmNlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eSBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpIDxlbT5BdHRyaWJ1dGUgVHlwZSBSZWZlcmVuY2VkIEVudGl0eTwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREF0dHJpYnV0ZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBuZXdDb21tZW50KSB7Ci0JCVN0cmluZyBvbGRDb21tZW50ID0gY29tbWVudDsKLQkJY29tbWVudCA9IG5ld0NvbW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERGVmYXVsdEtpbmQgZ2V0RGVmYXVsdEtpbmQoKSB7Ci0JCXJldHVybiBkZWZhdWx0S2luZDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEtpbmQoRFRERGVmYXVsdEtpbmQgbmV3RGVmYXVsdEtpbmQpIHsKLQkJRFRERGVmYXVsdEtpbmQgb2xkRGVmYXVsdEtpbmQgPSBkZWZhdWx0S2luZDsKLQkJZGVmYXVsdEtpbmQgPSBuZXdEZWZhdWx0S2luZCA9PSBudWxsID8gREVGQVVMVF9LSU5EX0VERUZBVUxUIDogbmV3RGVmYXVsdEtpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5ELCBvbGREZWZhdWx0S2luZCwgZGVmYXVsdEtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSB7Ci0JCXJldHVybiBkZWZhdWx0VmFsdWVTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZVN0cmluZyhTdHJpbmcgbmV3RGVmYXVsdFZhbHVlU3RyaW5nKSB7Ci0JCVN0cmluZyBvbGREZWZhdWx0VmFsdWVTdHJpbmcgPSBkZWZhdWx0VmFsdWVTdHJpbmc7Ci0JCWRlZmF1bHRWYWx1ZVN0cmluZyA9IG5ld0RlZmF1bHRWYWx1ZVN0cmluZzsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORywgb2xkRGVmYXVsdFZhbHVlU3RyaW5nLCBkZWZhdWx0VmFsdWVTdHJpbmcpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJaWYgKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwgJiYgYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkuZUlzUHJveHkoKSkgewotCQkJRFRERW50aXR5IG9sZEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ID0gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHk7Ci0JCQlhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSA9IChEVERFbnRpdHkpIEVjb3JlVXRpbC5yZXNvbHZlKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCB0aGlzKTsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBvbGRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eSBiYXNpY0dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCkgewotCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERFbnRpdHkgb2xkQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPSBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eTsKLQkJYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgPSBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJaWYgKG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFksIG5ld0F0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5LCBuZXdBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KCkgewotCQlpZiAoYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCAmJiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgPSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eTsKLQkJCWF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIHRoaXMpOwotCQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG9sZEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGJhc2ljR2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoRFRERW50aXR5IG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVudGl0eSBvbGRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA9IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5OwotCQlhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSA9IG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSwgb2xkQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkgewotCQlpZiAobmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5LCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSwgbmV3QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHksIG5ld0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChEVERFbGVtZW50KSBlQ29udGFpbmVyOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERFbGVtZW50KERUREVsZW1lbnQgbmV3RFRERWxlbWVudCkgewotCQlpZiAobmV3RFRERWxlbWVudCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgJiYgbmV3RFRERWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0RUREVsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdEVERFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFLCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERWxlbWVudCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQsIG5ld0RUREVsZW1lbnQsIG5ld0RUREVsZW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJaWYgKGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKERUREVudGl0eSkgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCWlmIChhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJCXJldHVybiBiYXNpY1NldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19OQU1FIDoKLQkJCQlyZXR1cm4gZ2V0TmFtZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VUWVBFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RVR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlyZXR1cm4gaXNDaGFuZ2VhYmxlKCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1ZPTEFUSUxFIDoKLQkJCQlyZXR1cm4gaXNWb2xhdGlsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19UUkFOU0lFTlQgOgotCQkJCXJldHVybiBpc1RyYW5zaWVudCgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXJldHVybiBpc1VuaXF1ZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWVMaXRlcmFsKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlyZXR1cm4gbmV3IEludGVnZXIoZ2V0TG93ZXJCb3VuZCgpKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJcmV0dXJuIG5ldyBJbnRlZ2VyKGdldFVwcGVyQm91bmQoKSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTUFOWSA6Ci0JCQkJcmV0dXJuIGlzTWFueSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19SRVFVSVJFRCA6Ci0JCQkJcmV0dXJuIGlzUmVxdWlyZWQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUNPTlRBSU5JTkdfQ0xBU1MgOgotCQkJCXJldHVybiBnZXRFQ29udGFpbmluZ0NsYXNzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJcmV0dXJuIGlzVW5zZXR0YWJsZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19JRCA6Ci0JCQkJcmV0dXJuIGlzSUQoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFUVFJJQlVURV9UWVBFIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVBdHRyaWJ1dGVUeXBlKCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RUF0dHJpYnV0ZVR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRLaW5kKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWVTdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpOwotCQkJCXJldHVybiBiYXNpY0dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJCQlyZXR1cm4gYmFzaWNHZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RURF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RFRERWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRUFOTk9UQVRJT05TIDoKLQkJCQlnZXRFQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVBbm5vdGF0aW9ucygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19OQU1FIDoKLQkJCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRVRZUEUgOgotCQkJCXNldEVUeXBlKChFQ2xhc3NpZmllcikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlzZXRDaGFuZ2VhYmxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVk9MQVRJTEUgOgotCQkJCXNldFZvbGF0aWxlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVFJBTlNJRU5UIDoKLQkJCQlzZXRUcmFuc2llbnQoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXNldFVuaXF1ZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfTElURVJBTCA6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlTGl0ZXJhbCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlzZXRMb3dlckJvdW5kKCgoSW50ZWdlcikgbmV3VmFsdWUpLmludFZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJc2V0VXBwZXJCb3VuZCgoKEludGVnZXIpIG5ld1ZhbHVlKS5pbnRWYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJc2V0VW5zZXR0YWJsZSgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0lEIDoKLQkJCQlzZXRJRCgoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX0tJTkQgOgotCQkJCXNldERlZmF1bHRLaW5kKChEVEREZWZhdWx0S2luZCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyA6Ci0JCQkJc2V0RGVmYXVsdFZhbHVlU3RyaW5nKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCXNldERUREVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VUWVBFIDoKLQkJCQlzZXRFVHlwZSgoRUNsYXNzaWZpZXIpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19DSEFOR0VBQkxFIDoKLQkJCQlzZXRDaGFuZ2VhYmxlKENIQU5HRUFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19WT0xBVElMRSA6Ci0JCQkJc2V0Vm9sYXRpbGUoVk9MQVRJTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19UUkFOU0lFTlQgOgotCQkJCXNldFRyYW5zaWVudChUUkFOU0lFTlRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VTklRVUUgOgotCQkJCXNldFVuaXF1ZShVTklRVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXNldERlZmF1bHRWYWx1ZUxpdGVyYWwoREVGQVVMVF9WQUxVRV9MSVRFUkFMX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTE9XRVJfQk9VTkQgOgotCQkJCXNldExvd2VyQm91bmQoTE9XRVJfQk9VTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJc2V0VXBwZXJCb3VuZChVUFBFUl9CT1VORF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1VOU0VUVEFCTEUgOgotCQkJCXNldFVuc2V0dGFibGUoVU5TRVRUQUJMRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0lEIDoKLQkJCQlzZXRJRChJRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCA6Ci0JCQkJc2V0RGVmYXVsdEtpbmQoREVGQVVMVF9LSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9WQUxVRV9TVFJJTkcgOgotCQkJCXNldERlZmF1bHRWYWx1ZVN0cmluZyhERUZBVUxUX1ZBTFVFX1NUUklOR19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkgOgotCQkJCXNldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCA6Ci0JCQkJc2V0RFRERWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFnZXRFQW5ub3RhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19FVFlQRSA6Ci0JCQkJcmV0dXJuIGVUeXBlICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQ0hBTkdFQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQ0hBTkdFQUJMRV9FRkxBRykgIT0gMCkgIT0gQ0hBTkdFQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19WT0xBVElMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVk9MQVRJTEVfRUZMQUcpICE9IDApICE9IFZPTEFUSUxFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1RSQU5TSUVOVCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVFJBTlNJRU5UX0VGTEFHKSAhPSAwKSAhPSBUUkFOU0lFTlRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5JUVVFIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBVTklRVUVfRUZMQUcpICE9IDApICE9IFVOSVFVRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX0xJVEVSQUwgOgotCQkJCXJldHVybiBERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZUxpdGVyYWwgIT0gbnVsbCA6ICFERUZBVUxUX1ZBTFVFX0xJVEVSQUxfRURFRkFVTFQuZXF1YWxzKGRlZmF1bHRWYWx1ZUxpdGVyYWwpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUUgOgotCQkJCXJldHVybiBnZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0xPV0VSX0JPVU5EIDoKLQkJCQlyZXR1cm4gbG93ZXJCb3VuZCAhPSBMT1dFUl9CT1VORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19VUFBFUl9CT1VORCA6Ci0JCQkJcmV0dXJuIHVwcGVyQm91bmQgIT0gVVBQRVJfQk9VTkRfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fTUFOWSA6Ci0JCQkJcmV0dXJuIGlzTWFueSgpICE9IGZhbHNlOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX1JFUVVJUkVEIDoKLQkJCQlyZXR1cm4gaXNSZXF1aXJlZCgpICE9IGZhbHNlOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VDT05UQUlOSU5HX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0RUNvbnRhaW5pbmdDbGFzcygpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fVU5TRVRUQUJMRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgVU5TRVRUQUJMRV9FRkxBRykgIT0gMCkgIT0gVU5TRVRUQUJMRV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19JRCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSURfRUZMQUcpICE9IDApICE9IElEX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0VBVFRSSUJVVEVfVFlQRSA6Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RUF0dHJpYnV0ZVR5cGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gZGVmYXVsdEtpbmQgIT0gREVGQVVMVF9LSU5EX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0RFRkFVTFRfVkFMVUVfU1RSSU5HIDoKLQkJCQlyZXR1cm4gREVGQVVMVF9WQUxVRV9TVFJJTkdfRURFRkFVTFQgPT0gbnVsbCA/IGRlZmF1bHRWYWx1ZVN0cmluZyAhPSBudWxsIDogIURFRkFVTFRfVkFMVUVfU1RSSU5HX0VERUZBVUxULmVxdWFscyhkZWZhdWx0VmFsdWVTdHJpbmcpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEVfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5ICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fRFREX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXREVERFbGVtZW50KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBkZWZhdWx0S2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChkZWZhdWx0S2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgZGVmYXVsdFZhbHVlU3RyaW5nOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGRlZmF1bHRWYWx1ZVN0cmluZyk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERBdHRyaWJ1dGVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREJhc2ljVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5MThjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQmFzaWNUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUNsYXNzSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+QmFzaWMgVHlwZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERCYXNpY1R5cGVJbXBsI2dldEtpbmQgPGVtPktpbmQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREQmFzaWNUeXBlSW1wbCBleHRlbmRzIEVDbGFzc0ltcGwgaW1wbGVtZW50cyBEVERCYXNpY1R5cGUsIEVDbGFzcyB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBiYXNpY1R5cGVTdHJpbmdzW10gPSB7RFREVHlwZS5OT05FLCBEVERUeXBlLkNEQVRBLCBEVERUeXBlLklELCBEVERUeXBlLklEUkVGLCBEVERUeXBlLklEUkVGUywgRFREVHlwZS5FTlRJVFksIERURFR5cGUuRU5USVRJRVMsIERURFR5cGUuTk1UT0tFTiwgRFREVHlwZS5OTVRPS0VOU307Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBiYXNpY1R5cGVEZXNjcmlwdGlvbnNbXSA9IHtEVERDb3JlTWVzc2FnZXMuX1VJX05PTkVfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9DSEFSQUNURVJfREFUQV9ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0lERU5USUZJRVJfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9JRF9SRUZFUkVOQ0VfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9JRF9SRUZFUkVOQ0VTX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfRU5USVRZX05BTUVfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9FTlRJVFlfTkFNRVNfREVTQywgRFREQ29yZU1lc3NhZ2VzLl9VSV9OQU1FX1RPS0VOX0RFU0MsIERURENvcmVNZXNzYWdlcy5fVUlfTkFNRV9UT0tFTlNfREVTQ307IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkIC8vJE5PTi1OTFMtNyQgLy8kTk9OLU5MUy04JCAvLyROT04tTkxTLTkkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBiYXNpY1R5cGVLaW5kc1tdID0ge0RUREJhc2ljVHlwZUtpbmQuTk9ORSwgRFREQmFzaWNUeXBlS2luZC5DREFUQSwgRFREQmFzaWNUeXBlS2luZC5JRCwgRFREQmFzaWNUeXBlS2luZC5JRFJFRiwgRFREQmFzaWNUeXBlS2luZC5JRFJFRlMsIERUREJhc2ljVHlwZUtpbmQuRU5USVRZLCBEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTLCBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU4sIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlN9OwotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlyZXR1cm4gZ2V0VHlwZVN0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZVN0cmluZygpIHsKLQkJaW50IGtpbmQgPSBnZXRLaW5kKCkuZ2V0VmFsdWUoKTsKLQkJaWYgKGtpbmQgPj0gMCAmJiBraW5kIDwgYmFzaWNUeXBlU3RyaW5ncy5sZW5ndGgpIHsKLQkJCXJldHVybiBiYXNpY1R5cGVTdHJpbmdzW2tpbmRdOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBnZXRUeXBlRGVzY3JpcHRpb24oZ2V0S2luZCgpLmdldFZhbHVlKCkpOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZURlc2NyaXB0aW9uKGludCB0eXBlS2luZCkgewotCQlpZiAodHlwZUtpbmQgPj0gMCAmJiB0eXBlS2luZCA8IGJhc2ljVHlwZURlc2NyaXB0aW9ucy5sZW5ndGgpIHsKLQkJCXJldHVybiBiYXNpY1R5cGVEZXNjcmlwdGlvbnNbdHlwZUtpbmRdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCS8vIFRCRAotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEtpbmQoKSA8ZW0+S2luZDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldEtpbmQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgRFREQmFzaWNUeXBlS2luZCBLSU5EX0VERUZBVUxUID0gRFREQmFzaWNUeXBlS2luZC5OT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRLaW5kKCkgPGVtPktpbmQ8L2VtPn0nIGF0dHJpYnV0ZS4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlS2luZCBraW5kID0gS0lORF9FREVGQVVMVDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERCYXNpY1R5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREJhc2ljVHlwZUtpbmQgZ2V0S2luZCgpIHsKLQkJcmV0dXJuIGtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEtpbmQoRFREQmFzaWNUeXBlS2luZCBuZXdLaW5kKSB7Ci0JCURUREJhc2ljVHlwZUtpbmQgb2xkS2luZCA9IGtpbmQ7Ci0JCWtpbmQgPSBuZXdLaW5kID09IG51bGwgPyBLSU5EX0VERUZBVUxUIDogbmV3S2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCwgb2xkS2luZCwga2luZCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFT3BlcmF0aW9ucygpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VPUEVSQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFUmVmZXJlbmNlcygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBdHRyaWJ1dGVzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRWNvcmVQYWNrYWdlLkVQQUNLQUdFX19FQ0xBU1NJRklFUlMsIEVQYWNrYWdlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fTkFNRSA6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3NOYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgOgotCQkJCXJldHVybiBpc0Fic3RyYWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlRFUkZBQ0UgOgotCQkJCXJldHVybiBpc0ludGVyZmFjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRU9QRVJBVElPTlMgOgotCQkJCXJldHVybiBnZXRFT3BlcmF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX0FUVFJJQlVURVMgOgotCQkJCXJldHVybiBnZXRFQWxsQXR0cmlidXRlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1JFRkVSRU5DRVMgOgotCQkJCXJldHVybiBnZXRFQWxsUmVmZXJlbmNlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGdldEVSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFMgOgotCQkJCXJldHVybiBnZXRFQWxsQ29udGFpbm1lbnRzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxTdXBlclR5cGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VJRF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fS0lORCA6Ci0JCQkJcmV0dXJuIGdldEtpbmQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19OQU1FIDoKLQkJCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKChDbGFzcykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fQUJTVFJBQ1QgOgotCQkJCXNldEFic3RyYWN0KCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA6Ci0JCQkJc2V0SW50ZXJmYWNlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCWdldEVTdXBlclR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVPcGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FUkVGRVJFTkNFUyA6Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCWdldEVSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQVRUUklCVVRFUyA6Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEVBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5EIDoKLQkJCQlzZXRLaW5kKChEVERCYXNpY1R5cGVLaW5kKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX05BTUUgOgotCQkJCXNldE5hbWUoTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTU19OQU1FIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzTmFtZShJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKElOU1RBTkNFX0NMQVNTX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0FCU1RSQUNUIDoKLQkJCQlzZXRBYnN0cmFjdChBQlNUUkFDVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlRFUkZBQ0UgOgotCQkJCXNldEludGVyZmFjZShJTlRFUkZBQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVNVUEVSX1RZUEVTIDoKLQkJCQlnZXRFU3VwZXJUeXBlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgOgotCQkJCWdldEVSZWZlcmVuY2VzKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBVFRSSUJVVEVTIDoKLQkJCQlnZXRFQXR0cmlidXRlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19LSU5EIDoKLQkJCQlzZXRLaW5kKEtJTkRfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQlyZXR1cm4gZUFubm90YXRpb25zICE9IG51bGwgJiYgIWdldEVBbm5vdGF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fTkFNRSA6Ci0JCQkJcmV0dXJuIE5BTUVfRURFRkFVTFQgPT0gbnVsbCA/IG5hbWUgIT0gbnVsbCA6ICFOQU1FX0VERUZBVUxULmVxdWFscyhuYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQgPT0gbnVsbCA/IGluc3RhbmNlQ2xhc3NOYW1lICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVC5lcXVhbHMoaW5zdGFuY2VDbGFzc05hbWUpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJcmV0dXJuIElOU1RBTkNFX0NMQVNTX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzICE9IG51bGwgOiAhSU5TVEFOQ0VfQ0xBU1NfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3MpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVBBQ0tBR0UgOgotCQkJCXJldHVybiBnZXRFUGFja2FnZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0FCU1RSQUNUIDoKLQkJCQlyZXR1cm4gKChlRmxhZ3MgJiBBQlNUUkFDVF9FRkxBRykgIT0gMCkgIT0gQUJTVFJBQ1RfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0lOVEVSRkFDRSA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgSU5URVJGQUNFX0VGTEFHKSAhPSAwKSAhPSBJTlRFUkZBQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGVTdXBlclR5cGVzICE9IG51bGwgJiYgIWdldEVTdXBlclR5cGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVPcGVyYXRpb25zICE9IG51bGwgJiYgIWdldEVPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX0FUVFJJQlVURVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbEF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0VBTExfUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRVJFRkVSRU5DRVMgOgotCQkJCXJldHVybiBlUmVmZXJlbmNlcyAhPSBudWxsICYmICFnZXRFUmVmZXJlbmNlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFUVFJJQlVURVMgOgotCQkJCXJldHVybiBlQXR0cmlidXRlcyAhPSBudWxsICYmICFnZXRFQXR0cmlidXRlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9DT05UQUlOTUVOVFMgOgotCQkJCXJldHVybiAhZ2V0RUFsbENvbnRhaW5tZW50cygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9PUEVSQVRJT05TIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxPcGVyYXRpb25zKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFX19FQUxMX1NUUlVDVFVSQUxfRkVBVFVSRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFN0cnVjdHVyYWxGZWF0dXJlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUFMTF9TVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9fRUlEX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGdldEVJREF0dHJpYnV0ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfX0tJTkQgOgotCQkJCXJldHVybiBraW5kICE9IEtJTkRfRURFRkFVTFQ7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGtpbmQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoa2luZCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfSAvLyBEVERCYXNpY1R5cGVJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM5YjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOYW1lZEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi1wdWJsaWMgY2xhc3MgRFREQ29udGVudEltcGwgZXh0ZW5kcyBFTmFtZWRFbGVtZW50SW1wbCBpbXBsZW1lbnRzIERURENvbnRlbnQsIEVPYmplY3QgewotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERmlsZSkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIG5ld0RUREZpbGUpIHsKLQkJaWYgKG5ld0RUREZpbGUgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSAmJiBuZXdEVERGaWxlICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RFRERmlsZSkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0RUREZpbGUgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld0RUREZpbGUpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERmlsZSwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSwgbmV3RFRERmlsZSwgbmV3RFRERmlsZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQ09OVEVOVF9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi19IC8vIERURENvbnRlbnRJbXBsCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudENvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudENvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODFkYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RWxlbWVudCBDb250ZW50PC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVsZW1lbnRDb250ZW50SW1wbCNnZXRHcm91cCA8ZW0+R3JvdXA8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERWxlbWVudENvbnRlbnRJbXBsI2dldEVsZW1lbnQgPGVtPkVsZW1lbnQ8L2VtPn08L2xpPgotICogPC91bD4KLSAqIDwvcD4KLSAqIAotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFRERWxlbWVudENvbnRlbnRJbXBsIGV4dGVuZHMgRU9iamVjdEltcGwgaW1wbGVtZW50cyBEVERFbGVtZW50Q29udGVudCB7Ci0KLQlwdWJsaWMgRFRERWxlbWVudENvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEVERFbGVtZW50IGdldERUREVsZW1lbnQoKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IGMgPSBnZXREVERHcm91cENvbnRlbnQoKTsKLQkJaWYgKGMgIT0gbnVsbCkKLQkJCXJldHVybiBjLmdldEVsZW1lbnQoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQl9Ci0KLQkvLyBnZXQgdGhlIG1vc3Qgb3V0ZXIgRFRER3JvdXBDb250ZW50Ci0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXREVERHcm91cENvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IGMgPSB0aGlzOwotCQl3aGlsZSAoYy5nZXRHcm91cCgpICE9IG51bGwpIHsKLQkJCWMgPSBjLmdldEdyb3VwKCk7Ci0JCX0KLQkJcmV0dXJuICgoYyBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgPyAoRFRER3JvdXBDb250ZW50KSBjIDogbnVsbCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpIHsKLQkJaW50IGNudCA9IDA7Ci0JCURURE9iamVjdCBwYXJlbnQgPSBnZXRHcm91cCgpOwotCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCXBhcmVudCA9IGdldEVsZW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCURUREdyb3VwQ29udGVudCBncm91cCA9IChEVERHcm91cENvbnRlbnQpIHBhcmVudDsKLQkJCUl0ZXJhdG9yIGkgPSBncm91cC5nZXRDb250ZW50KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCURUREVsZW1lbnRDb250ZW50IGNvbnRlbnQgPSAoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpOwotCQkJCWlmIChjb250ZW50ID09IHRoaXMpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWlmICgoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB8fCAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpKSB7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljbnQrKzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKCgocGFyZW50ID09IG51bGwpID8gIk5VTExfUEFSRU5UIiA6IHBhcmVudC5nZXRQYXRobmFtZSgpKSwgIkNvbnRlbnQiLCBudWxsLCBjbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0ZpcnN0RWxlbWVudENvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQotCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkvLyBUaGlzIG1lYW5zIHRoaXMgaXMgdGhlIG9ubHkgZWxlbWVudCBjb250ZW50IGluIHRoZSBlbGVtZW50Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlEVERHcm91cENvbnRlbnQgZ3JvdXAgPSBnZXRHcm91cCgpOwotCQlpbnQgcG9zID0gZ3JvdXAuZ2V0Q29udGVudFBvc2l0aW9uKHRoaXMpOwotCQlpZiAocG9zID09IDApIHsKLQkJCS8vIG5vdyByZWN1cnNlIGFuZCBlbnN1cmUgdGhpcyBncm91cCBpcyB0aGUgZmlyc3QgZ3JvdXAKLQkJCXJldHVybiBncm91cC5pc0ZpcnN0RWxlbWVudENvbnRlbnQoKTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnREZXRhaWwoKSB7Ci0JCS8vIG1vc3QgdGltZXMsIGNvbnRlbnQgbmFtZSBpcyBmaW5lLiBIb3dldmVyIGZvciBncm91cHMsCi0JCS8vIHdlIGRpZG4ndCB3YW50IGEgbG9uZyBuYW1lIHRvIHNob3cgdXAgaW4gdGhlIHRyZWUsCi0JCS8vIHNvIHdlIGNyZWF0ZWQgYSBnZXQgY29udGVudGRldGFpbCB0byBnZXQgdG8gdGhlIGxvbmcKLQkJLy8gbmFtZSAoZ2V0Q29udGVudE5hbWUgd2lsbCBnZXQgdGhlIHNob3J0IG9uZS4KLQkJcmV0dXJuIGdldENvbnRlbnROYW1lKCk7Ci0JfQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbGVtZW50Q29udGVudCNnZXRDb250ZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudENvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREdyb3VwQ29udGVudCBnZXRHcm91cCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREdyb3VwQ29udGVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0R3JvdXAoRFRER3JvdXBDb250ZW50IG5ld0dyb3VwKSB7Ci0JCWlmIChuZXdHcm91cCAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgJiYgbmV3R3JvdXAgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdHcm91cCkpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUmVjdXJzaXZlIGNvbnRhaW5tZW50IG5vdCBhbGxvd2VkIGZvciAiICsgdG9TdHJpbmcoKSArICIuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJaWYgKG5ld0dyb3VwICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdHcm91cCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3R3JvdXAsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBuZXdHcm91cCwgbmV3R3JvdXApKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERWxlbWVudCkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChEVERFbGVtZW50IG5ld0VsZW1lbnQpIHsKLQkJaWYgKG5ld0VsZW1lbnQgIT0gZUNvbnRhaW5lciB8fCAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgJiYgbmV3RWxlbWVudCAhPSBudWxsKSkgewotCQkJaWYgKEVjb3JlVXRpbC5pc0FuY2VzdG9yKHRoaXMsIG5ld0VsZW1lbnQpKQotCQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlY3Vyc2l2ZSBjb250YWlubWVudCBub3QgYWxsb3dlZCBmb3IgIiArIHRvU3RyaW5nKCkgKyAiLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbGVtZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RWxlbWVudCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCWlmIChtc2dzICE9IG51bGwpCi0JCQkJbXNncy5kaXNwYXRjaCgpOwotCQl9Ci0JCWVsc2UgaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBuZXdFbGVtZW50LCBuZXdFbGVtZW50KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERFbGVtZW50Q29udGVudEltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbGVtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0ZDEzZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uQ2hhaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FY29yZVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FQ2xhc3NJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFZpc2l0b3I7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbGVtZW50SW1wbCBleHRlbmRzIEVDbGFzc0ltcGwgaW1wbGVtZW50cyBEVERFbGVtZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9FREVGQVVMVCA9IG51bGw7Ci0KLQlwdWJsaWMgRFRERWxlbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERWxlbWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERUREF0dHJpYnV0ZShEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0JCWdldERUREF0dHJpYnV0ZSgpLmFkZChhdHRyaWJ1dGUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCXJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgobnVsbCwgIkVsZW0iLCBnZXROYW1lKCksIC0xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBEVERPYmplY3QgZmluZE9iamVjdChTdHJpbmcgcmVsYXRpdmVQYXRoKSB7Ci0JCU9iamVjdFtdIHJlc3VsdCA9IERURFBhdGhuYW1lVXRpbC5wYXJzZVBhdGhDb21wb25lbnQocmVsYXRpdmVQYXRoKTsKLQotCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHJlc3VsdFswXTsKLQotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRFRET2JqZWN0IG9iaiA9IG51bGw7Ci0JCWlmICh0eXBlLmVxdWFscygiQXR0ciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIFRPRE86IGZpeCBwb3J0Ci0JCQkvLyBvYmogPSBmaW5kQXR0cmlidXRlKG5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKCh0eXBlLmVxdWFscygiQ29udGVudCIpKSB8fCAodHlwZS5lcXVhbHMoIkVsZW1SZWYiKSkgfHwgKHR5cGUuZXF1YWxzKCJFbnRSZWYiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCW9iaiA9IGdldENvbnRlbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIHJlc3RQYXRoID0gKFN0cmluZykgcmVzdWx0WzNdOwotCi0JCWlmICgocmVzdFBhdGggPT0gbnVsbCkgfHwgKG9iaiA9PSBudWxsKSkgewotCQkJcmV0dXJuIG9iajsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiBvYmouZmluZE9iamVjdChyZXN0UGF0aCk7Ci0JCX0KLQl9Ci0KLQkvLyByZXR1cm5zIGFsbCByZWZlcmVuY2VzIGluIHRoZSBzYW1lIERUREZpbGUgdGhhdCByZWZlcmVuY2UgdGhpcyBlbGVtZW50Ci0JcHVibGljIENvbGxlY3Rpb24gZ2V0UmVmZXJlbmNlcygpIHsKLQkJRFRERmlsZSBmaWxlID0gZ2V0RFRERmlsZSgpOwotCQlmaW5hbCBDb2xsZWN0aW9uIHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlEVERWaXNpdG9yIHZpc2l0UmVmcyA9IG5ldyBEVERWaXNpdG9yKCkgewotCQkJcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudChEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCWlmIChlbGVtZW50UmVmZXJlbmNlQ29udGVudC5nZXRSZWZlcmVuY2VkRWxlbWVudCgpID09IERUREVsZW1lbnRJbXBsLnRoaXMpIHsKLQkJCQkJcmVzdWx0LmFkZChlbGVtZW50UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCX0KLQkJfTsKLQkJdmlzaXRSZWZzLnZpc2l0RFRERmlsZShmaWxlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZURldGFpbCgpIHsKLQkJU3RyaW5nIGF0dHJpYnV0ZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUNvbGxlY3Rpb24gYXR0cmlidXRlcyA9IGdldERUREF0dHJpYnV0ZSgpOwotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHNlZW5PbmUgPSBmYWxzZTsKLQkJCWZvciAoamF2YS51dGlsLkl0ZXJhdG9yIGkgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCWlmIChzZWVuT25lKSB7Ci0JCQkJCWF0dHJpYnV0ZVN0cmluZyA9IGF0dHJpYnV0ZVN0cmluZyArICIsICI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNlZW5PbmUgPSB0cnVlOwotCQkJCX0gLy8gZW5kIG9mIGVsc2UKLQotCQkJCWF0dHJpYnV0ZVN0cmluZyA9IGF0dHJpYnV0ZVN0cmluZyArICgoRFREQXR0cmlidXRlKSBpLm5leHQoKSkuZ2V0TmFtZSgpOwotCQkJfQotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQlyZXR1cm4gYXR0cmlidXRlU3RyaW5nOwotCX0KLQotCi0JLy8gdWdseSBoYWNrIGZvciBub3cgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBtdWx0aXBsZSBpbmhlcml0YW5jZS4KLQkvLyBXb3VsZCByYXRoZXIgaGF2ZSBhbGwgdGhpcyBzdHVmZiBpbiBhIGJhc2UgY2xhc3MgYnV0IHRoZXNlCi0JLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLQlEVERMZXhpY2FsSW5mbyBsZXhJbmZvID0gbmV3IERURExleGljYWxJbmZvKCk7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9FREVGQVVMVDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERWxlbWVudENvbnRlbnQgY29udGVudCA9IG51bGw7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGR0ZEF0dHJpYnV0ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRTdGFydE9mZnNldCh2KTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGxleEluZm8uZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBlbmRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBlbmRPZmZzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kT2Zmc2V0KGludCB2KSB7Ci0JCWxleEluZm8uc2V0RW5kT2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBuZXdDb21tZW50KSB7Ci0JCVN0cmluZyBvbGRDb21tZW50ID0gY29tbWVudDsKLQkJY29tbWVudCA9IG5ld0NvbW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50Q29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0Q29udGVudChEVERFbGVtZW50Q29udGVudCBuZXdDb250ZW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVsZW1lbnRDb250ZW50IG9sZENvbnRlbnQgPSBjb250ZW50OwotCQljb250ZW50ID0gbmV3Q29udGVudDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIG9sZENvbnRlbnQsIG5ld0NvbnRlbnQpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG5ld0NvbnRlbnQpIHsKLQkJaWYgKG5ld0NvbnRlbnQgIT0gY29udGVudCkgewotCQkJTm90aWZpY2F0aW9uQ2hhaW4gbXNncyA9IG51bGw7Ci0JCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgY29udGVudCkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBEVERFbGVtZW50Q29udGVudC5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3Q29udGVudCAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3Q29udGVudCkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9DT05URU5UX19FTEVNRU5ULCBEVERFbGVtZW50Q29udGVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250ZW50KG5ld0NvbnRlbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBuZXdDb250ZW50LCBuZXdDb250ZW50KSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RFREQXR0cmlidXRlKCkgewotCQlpZiAoZHRkQXR0cmlidXRlID09IG51bGwpIHsKLQkJCWR0ZEF0dHJpYnV0ZSA9IG5ldyBFT2JqZWN0Q29udGFpbm1lbnRXaXRoSW52ZXJzZUVMaXN0KERUREF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEF0dHJpYnV0ZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFQW5ub3RhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VPUEVSQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RU9wZXJhdGlvbnMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBjb250ZW50KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgbnVsbCwgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFREQXR0cmlidXRlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFT3BlcmF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVSZWZlcmVuY2VzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUF0dHJpYnV0ZXMoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRDb250ZW50KG51bGwsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERUREF0dHJpYnV0ZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUNMQVNTSUZJRVJTLCBFUGFja2FnZS5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fTkFNRSA6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3NOYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQUJTVFJBQ1QgOgotCQkJCXJldHVybiBpc0Fic3RyYWN0KCkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlRFUkZBQ0UgOgotCQkJCXJldHVybiBpc0ludGVyZmFjZSgpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRVNVUEVSX1RZUEVTIDoKLQkJCQlyZXR1cm4gZ2V0RVN1cGVyVHlwZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCXJldHVybiBnZXRFT3BlcmF0aW9ucygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX0FUVFJJQlVURVMgOgotCQkJCXJldHVybiBnZXRFQWxsQXR0cmlidXRlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1JFRkVSRU5DRVMgOgotCQkJCXJldHVybiBnZXRFQWxsUmVmZXJlbmNlcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA6Ci0JCQkJcmV0dXJuIGdldEVSZWZlcmVuY2VzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZ2V0RUF0dHJpYnV0ZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9DT05UQUlOTUVOVFMgOgotCQkJCXJldHVybiBnZXRFQWxsQ29udGFpbm1lbnRzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxPcGVyYXRpb25zKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfU1RSVUNUVVJBTF9GRUFUVVJFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9TVVBFUl9UWVBFUyA6Ci0JCQkJcmV0dXJuIGdldEVBbGxTdXBlclR5cGVzKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VJRF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTU1FTlQgOgotCQkJCXJldHVybiBnZXRDb21tZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXRDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBnZXREVERBdHRyaWJ1dGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFnZXRFQW5ub3RhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX05BTUUgOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzTmFtZSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3NOYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzcyAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VQQUNLQUdFIDoKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19BQlNUUkFDVCA6Ci0JCQkJcmV0dXJuICgoZUZsYWdzICYgQUJTVFJBQ1RfRUZMQUcpICE9IDApICE9IEFCU1RSQUNUX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlRFUkZBQ0UgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIElOVEVSRkFDRV9FRkxBRykgIT0gMCkgIT0gSU5URVJGQUNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiBlU3VwZXJUeXBlcyAhPSBudWxsICYmICFnZXRFU3VwZXJUeXBlcygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCXJldHVybiBlT3BlcmF0aW9ucyAhPSBudWxsICYmICFnZXRFT3BlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9BVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxBdHRyaWJ1dGVzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQUxMX1JFRkVSRU5DRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQlyZXR1cm4gZVJlZmVyZW5jZXMgIT0gbnVsbCAmJiAhZ2V0RVJlZmVyZW5jZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBVFRSSUJVVEVTIDoKLQkJCQlyZXR1cm4gZUF0dHJpYnV0ZXMgIT0gbnVsbCAmJiAhZ2V0RUF0dHJpYnV0ZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfQ09OVEFJTk1FTlRTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxDb250YWlubWVudHMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfT1BFUkFUSU9OUyA6Ci0JCQkJcmV0dXJuICFnZXRFQWxsT3BlcmF0aW9ucygpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRUFMTF9TVFJVQ1RVUkFMX0ZFQVRVUkVTIDoKLQkJCQlyZXR1cm4gIWdldEVBbGxTdHJ1Y3R1cmFsRmVhdHVyZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VBTExfU1VQRVJfVFlQRVMgOgotCQkJCXJldHVybiAhZ2V0RUFsbFN1cGVyVHlwZXMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VJRF9BVFRSSUJVVEUgOgotCQkJCXJldHVybiBnZXRFSURBdHRyaWJ1dGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gQ09NTUVOVF9FREVGQVVMVCA9PSBudWxsID8gY29tbWVudCAhPSBudWxsIDogIUNPTU1FTlRfRURFRkFVTFQuZXF1YWxzKGNvbW1lbnQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQlyZXR1cm4gY29udGVudCAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfQVRUUklCVVRFIDoKLQkJCQlyZXR1cm4gZHRkQXR0cmlidXRlICE9IG51bGwgJiYgIWdldERUREF0dHJpYnV0ZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBpbnQgZUJhc2VTdHJ1Y3R1cmFsRmVhdHVyZUlEKGludCBkZXJpdmVkRmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MpIHsKLQkJaWYgKGJhc2VDbGFzcyA9PSBEVERDb250ZW50LmNsYXNzKSB7Ci0JCQlzd2l0Y2ggKGRlcml2ZWRGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVCYXNlU3RydWN0dXJhbEZlYXR1cmVJRChkZXJpdmVkRmVhdHVyZUlELCBiYXNlQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgaW50IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChpbnQgYmFzZUZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzKSB7Ci0JCWlmIChiYXNlQ2xhc3MgPT0gRFREQ29udGVudC5jbGFzcykgewotCQkJc3dpdGNoIChiYXNlRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9DT05URU5UX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5lRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoYmFzZUZlYXR1cmVJRCwgYmFzZUNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19OQU1FIDoKLQkJCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKChDbGFzcykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQUJTVFJBQ1QgOgotCQkJCXNldEFic3RyYWN0KCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0lOVEVSRkFDRSA6Ci0JCQkJc2V0SW50ZXJmYWNlKCgoQm9vbGVhbikgbmV3VmFsdWUpLmJvb2xlYW5WYWx1ZSgpKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCWdldEVTdXBlclR5cGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FT1BFUkFUSU9OUyA6Ci0JCQkJZ2V0RU9wZXJhdGlvbnMoKS5jbGVhcigpOwotCQkJCWdldEVPcGVyYXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FUkVGRVJFTkNFUyA6Ci0JCQkJZ2V0RVJlZmVyZW5jZXMoKS5jbGVhcigpOwotCQkJCWdldEVSZWZlcmVuY2VzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQVRUUklCVVRFUyA6Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCWdldEVBdHRyaWJ1dGVzKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5UIDoKLQkJCQlzZXRDb250ZW50KChEVERFbGVtZW50Q29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSA6Ci0JCQkJZ2V0RFREQXR0cmlidXRlKCkuY2xlYXIoKTsKLQkJCQlnZXREVERBdHRyaWJ1dGUoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19OQU1FIDoKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcyhJTlNUQU5DRV9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19BQlNUUkFDVCA6Ci0JCQkJc2V0QWJzdHJhY3QoQUJTVFJBQ1RfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fSU5URVJGQUNFIDoKLQkJCQlzZXRJbnRlcmZhY2UoSU5URVJGQUNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VTVVBFUl9UWVBFUyA6Ci0JCQkJZ2V0RVN1cGVyVHlwZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRU9QRVJBVElPTlMgOgotCQkJCWdldEVPcGVyYXRpb25zKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0VSRUZFUkVOQ0VTIDoKLQkJCQlnZXRFUmVmZXJlbmNlcygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19FQVRUUklCVVRFUyA6Ci0JCQkJZ2V0RUF0dHJpYnV0ZXMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudChDT01NRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQgOgotCQkJCXNldENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9BVFRSSUJVVEUgOgotCQkJCWdldERUREF0dHJpYnV0ZSgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERmlsZSkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgbmV3RFRERmlsZSkgewotCQlpZiAobmV3RFRERmlsZSAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFICYmIG5ld0RUREZpbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdEVERGaWxlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RFRERmlsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RFRERmlsZSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19EVERfRklMRSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0RURF9GSUxFLCBuZXdEVERGaWxlLCBuZXdEVERGaWxlKSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMmI4ODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRJbXBsIGV4dGVuZHMgRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsIGltcGxlbWVudHMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgewotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREVsZW1lbnQgcmVmZXJlbmNlZEVsZW1lbnQgPSBudWxsOwotCi0JcHVibGljIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlyZXR1cm4gZ2V0Q29udGVudE5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlEVERFbGVtZW50IGUgPSBnZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQlpZiAoZSA9PSBudWxsKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlLmdldE5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERFbGVtZW50IGdldFJlZmVyZW5jZWRFbGVtZW50KCkgewotCQlpZiAocmVmZXJlbmNlZEVsZW1lbnQgIT0gbnVsbCAmJiByZWZlcmVuY2VkRWxlbWVudC5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbGVtZW50IG9sZFJlZmVyZW5jZWRFbGVtZW50ID0gcmVmZXJlbmNlZEVsZW1lbnQ7Ci0JCQlyZWZlcmVuY2VkRWxlbWVudCA9IChEVERFbGVtZW50KSBFY29yZVV0aWwucmVzb2x2ZShyZWZlcmVuY2VkRWxlbWVudCwgdGhpcyk7Ci0JCQlpZiAocmVmZXJlbmNlZEVsZW1lbnQgIT0gb2xkUmVmZXJlbmNlZEVsZW1lbnQpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQsIG9sZFJlZmVyZW5jZWRFbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWZlcmVuY2VkRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVsZW1lbnQgYmFzaWNHZXRSZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJcmV0dXJuIHJlZmVyZW5jZWRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbGVtZW50KERUREVsZW1lbnQgbmV3UmVmZXJlbmNlZEVsZW1lbnQpIHsKLQkJRFRERWxlbWVudCBvbGRSZWZlcmVuY2VkRWxlbWVudCA9IHJlZmVyZW5jZWRFbGVtZW50OwotCQlyZWZlcmVuY2VkRWxlbWVudCA9IG5ld1JlZmVyZW5jZWRFbGVtZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQsIG9sZFJlZmVyZW5jZWRFbGVtZW50LCByZWZlcmVuY2VkRWxlbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXRSZWZlcmVuY2VkRWxlbWVudCgpOwotCQkJCXJldHVybiBiYXNpY0dldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCXJldHVybiByZWZlcmVuY2VkRWxlbWVudCAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZSgoRFRET2NjdXJyZW5jZVR5cGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX1JFRkVSRU5DRURfRUxFTUVOVCA6Ci0JCQkJc2V0UmVmZXJlbmNlZEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQgOgotCQkJCXNldFJlZmVyZW5jZWRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW1wdHlDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVtcHR5Q29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3N2RiMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW1wdHlDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVtcHR5Q29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERFbXB0eUNvbnRlbnQgewotCi0JcHVibGljIERUREVtcHR5Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW1wdHlDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlzZXRFbGVtZW50KChEVERFbGVtZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VNUFRZX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5Q29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlDb250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGNhZGUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU9iamVjdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFBhdGhuYW1lVXRpbDsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBEVERFbnRpdHlDb250ZW50SW1wbCBleHRlbmRzIEVPYmplY3RJbXBsIGltcGxlbWVudHMgRFRERW50aXR5Q29udGVudCB7Ci0KLQlwdWJsaWMgRFRERW50aXR5Q29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5Q29udGVudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCXJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgoZ2V0RFRERW50aXR5KCkuZ2V0UGF0aG5hbWUoKSwgIkNvbnRlbnQiLCBudWxsLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgZ2V0RFRERW50aXR5KCkgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCAhPSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKERUREVudGl0eSkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERFbnRpdHkoRFRERW50aXR5IG5ld0RUREVudGl0eSkgewotCQlpZiAobmV3RFRERW50aXR5ICE9IGVDb250YWluZXIgfHwgKGVDb250YWluZXJGZWF0dXJlSUQgIT0gRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgJiYgbmV3RFRERW50aXR5ICE9IG51bGwpKSB7Ci0JCQlpZiAoRWNvcmVVdGlsLmlzQW5jZXN0b3IodGhpcywgbmV3RFRERW50aXR5KSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RFRERW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERFbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCW1zZ3MgPSBlQmFzaWNTZXRDb250YWluZXIoKEludGVybmFsRU9iamVjdCkgbmV3RFRERW50aXR5LCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBuZXdEVERFbnRpdHksIG5ld0RUREVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZIDoKLQkJCQlyZXR1cm4gZ2V0RFRERW50aXR5KCkgIT0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkgOgotCQkJCXNldERUREVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERUREVudGl0eUNvbnRlbnQjdW5wYXJzZSgpCi0JICovCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWViMDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRU5hbWVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkludGVybmFsRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5FbnRpdHk8L2I+PC9lbT4nLgotICogPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkOgotICogPHVsPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjaXNQYXJhbWV0ZXJFbnRpdHkgPGVtPlBhcmFtZXRlciBFbnRpdHk8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERW50aXR5SW1wbCNnZXRDb250ZW50IDxlbT5Db250ZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0UGFybUVudGl0eVJlZiA8ZW0+UGFybSBFbnRpdHkgUmVmPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0RW50aXR5UmVmZXJlbmNlIDxlbT5FbnRpdHkgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREVudGl0eUltcGwjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSA8ZW0+QXR0cmlidXRlIFR5cGUgUmVmZXJlbmNlPC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREVudGl0eUltcGwgZXh0ZW5kcyBEVERDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVudGl0eSwgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJFbnQiLCBnZXROYW1lKCksIC0xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gRFREUGF0aG5hbWVVdGlsLnBhcnNlUGF0aENvbXBvbmVudChyZWxhdGl2ZVBhdGgpOwotCi0KLQkJU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSByZXN1bHRbMF07Ci0KLQotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQotCQlEVERPYmplY3Qgb2JqID0gbnVsbDsKLQkJaWYgKHR5cGUuZXF1YWxzKCJDb250ZW50IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb2JqID0gZ2V0Q29udGVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCi0JCVN0cmluZyByZXN0UGF0aCA9IChTdHJpbmcpIHJlc3VsdFszXTsKLQotCQlpZiAoKHJlc3RQYXRoID09IG51bGwpIHx8IChvYmogPT0gbnVsbCkpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gb2JqLmZpbmRPYmplY3QocmVzdFBhdGgpOwotCQl9Ci0JfQotCi0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJhbWV0ZXJFbnRpdHkoKSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2lzUGFyYW1ldGVyRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVCA9IGZhbHNlOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJhbWV0ZXJFbnRpdHkoKSA8ZW0+UGFyYW1ldGVyIEVudGl0eTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2lzUGFyYW1ldGVyRW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwYXJhbWV0ZXJFbnRpdHkgPSBQQVJBTUVURVJfRU5USVRZX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29udGVudCgpIDxlbT5Db250ZW50PC9lbT59JwotCSAqIGNvbnRhaW5tZW50IHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29udGVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIERUREVudGl0eUNvbnRlbnQgY29udGVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQYXJtRW50aXR5UmVmKCkgPGVtPlBhcm0gRW50aXR5IFJlZjwvZW0+fScKLQkgKiByZWZlcmVuY2UuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFBhcm1FbnRpdHlSZWYoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZiA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHlSZWZlcmVuY2UoKSA8ZW0+RW50aXR5IFJlZmVyZW5jZTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RW50aXR5UmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZW50aXR5UmVmZXJlbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSA8ZW0+QXR0cmlidXRlIE5hbWUgUmVmZXJlbmNlPC9lbT59JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlTmFtZVJlZmVyZW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgPGVtPkF0dHJpYnV0ZSBUeXBlIFJlZmVyZW5jZTwvZW0+fScKLQkgKiByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBuZXdDb21tZW50KSB7Ci0JCVN0cmluZyBvbGRDb21tZW50ID0gY29tbWVudDsKLQkJY29tbWVudCA9IG5ld0NvbW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eSgpIHsKLQkJcmV0dXJuIHBhcmFtZXRlckVudGl0eTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gbmV3UGFyYW1ldGVyRW50aXR5KSB7Ci0JCWJvb2xlYW4gb2xkUGFyYW1ldGVyRW50aXR5ID0gcGFyYW1ldGVyRW50aXR5OwotCQlwYXJhbWV0ZXJFbnRpdHkgPSBuZXdQYXJhbWV0ZXJFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSwgb2xkUGFyYW1ldGVyRW50aXR5LCBwYXJhbWV0ZXJFbnRpdHkpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREVudGl0eUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIGNvbnRlbnQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldENvbnRlbnQoRFRERW50aXR5Q29udGVudCBuZXdDb250ZW50LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVudGl0eUNvbnRlbnQgb2xkQ29udGVudCA9IGNvbnRlbnQ7Ci0JCWNvbnRlbnQgPSBuZXdDb250ZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBvbGRDb250ZW50LCBuZXdDb250ZW50KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoRFRERW50aXR5Q29udGVudCBuZXdDb250ZW50KSB7Ci0JCWlmIChuZXdDb250ZW50ICE9IGNvbnRlbnQpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGNvbnRlbnQpLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9DT05URU5UX19EVERfRU5USVRZLCBEVERFbnRpdHlDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCWlmIChuZXdDb250ZW50ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdDb250ZW50KS5lSW52ZXJzZUFkZCh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfQ09OVEVOVF9fRFREX0VOVElUWSwgRFRERW50aXR5Q29udGVudC5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRDb250ZW50KG5ld0NvbnRlbnQsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTlRFTlQsIG5ld0NvbnRlbnQsIG5ld0NvbnRlbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBnZXRQYXJtRW50aXR5UmVmKCkgewotCQlpZiAocGFybUVudGl0eVJlZiAhPSBudWxsICYmIHBhcm1FbnRpdHlSZWYuZUlzUHJveHkoKSkgewotCQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIG9sZFBhcm1FbnRpdHlSZWYgPSBwYXJtRW50aXR5UmVmOwotCQkJcGFybUVudGl0eVJlZiA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIEVjb3JlVXRpbC5yZXNvbHZlKHBhcm1FbnRpdHlSZWYsIHRoaXMpOwotCQkJaWYgKHBhcm1FbnRpdHlSZWYgIT0gb2xkUGFybUVudGl0eVJlZikgewotCQkJCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlJFU09MVkUsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBvbGRQYXJtRW50aXR5UmVmLCBwYXJtRW50aXR5UmVmKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcm1FbnRpdHlSZWY7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgYmFzaWNHZXRQYXJtRW50aXR5UmVmKCkgewotCQlyZXR1cm4gcGFybUVudGl0eVJlZjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGJhc2ljU2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgbmV3UGFybUVudGl0eVJlZiwgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2Ugb2xkUGFybUVudGl0eVJlZiA9IHBhcm1FbnRpdHlSZWY7Ci0JCXBhcm1FbnRpdHlSZWYgPSBuZXdQYXJtRW50aXR5UmVmOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpIHsKLQkJCWlmIChtc2dzID09IG51bGwpCi0JCQkJbXNncyA9IG5ldyBOb3RpZmljYXRpb25DaGFpbkltcGwoNCk7Ci0JCQltc2dzLmFkZChuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIG9sZFBhcm1FbnRpdHlSZWYsIG5ld1Bhcm1FbnRpdHlSZWYpKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFybUVudGl0eVJlZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgbmV3UGFybUVudGl0eVJlZikgewotCQlpZiAobmV3UGFybUVudGl0eVJlZiAhPSBwYXJtRW50aXR5UmVmKSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChwYXJtRW50aXR5UmVmICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBwYXJtRW50aXR5UmVmKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld1Bhcm1FbnRpdHlSZWYgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5ld1Bhcm1FbnRpdHlSZWYpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgbXNncyk7Ci0JCQltc2dzID0gYmFzaWNTZXRQYXJtRW50aXR5UmVmKG5ld1Bhcm1FbnRpdHlSZWYsIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgbmV3UGFybUVudGl0eVJlZiwgbmV3UGFybUVudGl0eVJlZikpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUxpc3QgZ2V0RW50aXR5UmVmZXJlbmNlKCkgewotCQlpZiAoZW50aXR5UmVmZXJlbmNlID09IG51bGwpIHsKLQkJCWVudGl0eVJlZmVyZW5jZSA9IG5ldyBFT2JqZWN0V2l0aEludmVyc2VSZXNvbHZpbmdFTGlzdChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50LmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCX0KLQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKSB7Ci0JCWlmIChhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlID09IG51bGwpIHsKLQkJCWF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoRFREQXR0cmlidXRlLmNsYXNzLCB0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSwgRFREUGFja2FnZS5EVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCX0KLQkJcmV0dXJuIGF0dHJpYnV0ZU5hbWVSZWZlcmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgewotCQlpZiAoYXR0cmlidXRlVHlwZVJlZmVyZW5jZSA9PSBudWxsKSB7Ci0JCQlhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlID0gbmV3IEVPYmplY3RXaXRoSW52ZXJzZVJlc29sdmluZ0VMaXN0KERUREF0dHJpYnV0ZS5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UsIERURFBhY2thZ2UuRFREX0FUVFJJQlVURV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFRF9FTlRJVFkpOwotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgY29udGVudCkuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgbnVsbCwgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbnRlbnQoKERUREVudGl0eUNvbnRlbnQpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGIDoKLQkJCQkJaWYgKHBhcm1FbnRpdHlSZWYgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgcGFybUVudGl0eVJlZikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSwgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFbnRpdHlSZWZlcmVuY2UoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJCXJldHVybiBiYXNpY1NldENvbnRlbnQobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJCXJldHVybiBiYXNpY1NldFBhcm1FbnRpdHlSZWYobnVsbCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFbnRpdHlSZWZlcmVuY2UoKSkuYmFzaWNSZW1vdmUob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbW1lbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlyZXR1cm4gaXNQYXJhbWV0ZXJFbnRpdHkoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0UGFybUVudGl0eVJlZigpOwotCQkJCXJldHVybiBiYXNpY0dldFBhcm1FbnRpdHlSZWYoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0RW50aXR5UmVmZXJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9UWVBFX1JFRkVSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZIDoKLQkJCQlzZXRQYXJhbWV0ZXJFbnRpdHkoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQlzZXRDb250ZW50KChEVERFbnRpdHlDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJc2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCWdldEVudGl0eVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RW50aXR5UmVmZXJlbmNlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UgOgotCQkJCWdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKS5jbGVhcigpOwotCQkJCWdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKS5hZGRBbGwoKENvbGxlY3Rpb24pIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkgOgotCQkJCXNldFBhcmFtZXRlckVudGl0eShQQVJBTUVURVJfRU5USVRZX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCA6Ci0JCQkJc2V0Q29udGVudCgoRFRERW50aXR5Q29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJc2V0UGFybUVudGl0eVJlZigoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRSA6Ci0JCQkJZ2V0RW50aXR5UmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFIDoKLQkJCQlnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQlnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gQ09NTUVOVF9FREVGQVVMVCA9PSBudWxsID8gY29tbWVudCAhPSBudWxsIDogIUNPTU1FTlRfRURFRkFVTFQuZXF1YWxzKGNvbW1lbnQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFkgOgotCQkJCXJldHVybiBwYXJhbWV0ZXJFbnRpdHkgIT0gUEFSQU1FVEVSX0VOVElUWV9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UIDoKLQkJCQlyZXR1cm4gY29udGVudCAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiA6Ci0JCQkJcmV0dXJuIHBhcm1FbnRpdHlSZWYgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gZW50aXR5UmVmZXJlbmNlICE9IG51bGwgJiYgIWdldEVudGl0eVJlZmVyZW5jZSgpLmlzRW1wdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlICE9IG51bGwgJiYgIWdldEF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFIDoKLQkJCQlyZXR1cm4gYXR0cmlidXRlVHlwZVJlZmVyZW5jZSAhPSBudWxsICYmICFnZXRBdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkuaXNFbXB0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChjb21tZW50OiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGNvbW1lbnQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHBhcmFtZXRlckVudGl0eTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwYXJhbWV0ZXJFbnRpdHkpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gRFRERW50aXR5SW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLwotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVERFbnRpdHlJbXBsIGV4dGVuZHMgRU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cyBEVERFbnRpdHksCi0vLyBFTmFtZXNwYWNlLCBEVERDb250ZW50ewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEJvb2xlYW4gcGFyYW1ldGVyRW50aXR5ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFRERW50aXR5Q29udGVudCBjb250ZW50ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBlbnRpdHlSZWZlcmVuY2UgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBFTGlzdCBhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgYXR0cmlidXRlVHlwZVJlZmVyZW5jZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFBhcmFtZXRlckVudGl0eSA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldENvbnRlbnQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRQYXJtRW50aXR5UmVmID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJpdmF0ZSBEVERDb250ZW50SW1wbCBkdGRDb250ZW50RGVsZWdhdGUgPSBudWxsOwotCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVPYmplY3QgaW5pdEluc3RhbmNlKCkgewotLy8gc2V0RU1ldGFPYmooZUNsYXNzRFRERW50aXR5KCkpOwotLy8gaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLyByZXR1cm4gdGhpczsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgdm9pZCBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKSB7Ci0vLyBzdXBlci5pbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vCi0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5yZWZTZXREZWxlZ2F0ZU93bmVyKHRoaXMpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERQYWNrYWdlIGVQYWNrYWdlRFREKCkgewotLy8gcmV0dXJuCi0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFRERW50aXR5KCkgewotLy8gcmV0dXJuCi0vLyAoKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKSkuZ2V0RFRERW50aXR5KCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0vLyBpZiAodGhpcy5zZXRDb21tZW50KSByZXR1cm4gdGhpcy5jb21tZW50OwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29tbWVudCgpLHRoaXMuY29tbWVudCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRDb21tZW50KCkgewotLy8gZU5vdGlmeShyZWZCYXNpY1Vuc2V0VmFsdWUoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X0NvbW1lbnQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29tbWVudCgpIHsKLS8vIHJldHVybiBzZXRDb21tZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEJvb2xlYW4gZ2V0UGFyYW1ldGVyRW50aXR5KCkgewotLy8gaWYgKHRoaXMuc2V0UGFyYW1ldGVyRW50aXR5KSByZXR1cm4gdGhpcy5wYXJhbWV0ZXJFbnRpdHk7Ci0vLyBlbHNlIHJldHVybgotLy8gKEJvb2xlYW4pRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpLmdldERlZmF1bHRWYWx1ZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0vLyBCb29sZWFuIHJlc3VsdCA9IGdldFBhcmFtZXRlckVudGl0eSgpOwotLy8gcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0LmJvb2xlYW5WYWx1ZSgpIDogZmFsc2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KEJvb2xlYW4gdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpLHRoaXMucGFyYW1ldGVyRW50aXR5LHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQYXJhbWV0ZXJFbnRpdHkoYm9vbGVhbiB2YWx1ZSkgewotLy8gc2V0UGFyYW1ldGVyRW50aXR5KHZhbHVlP0Jvb2xlYW4uVFJVRTpCb29sZWFuLkZBTFNFKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldFBhcmFtZXRlckVudGl0eSgpIHsKLS8vIGVOb3RpZnkocmVmQmFzaWNVbnNldFZhbHVlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0UGFyYW1ldGVyRW50aXR5KCkgewotLy8gcmV0dXJuIHNldFBhcmFtZXRlckVudGl0eTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBEVERFbnRpdHlDb250ZW50IGdldENvbnRlbnQoKSB7Ci0vLyB0cnkgewotLy8gaWYgKHRoaXMuY29udGVudCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIHRoaXMuY29udGVudCA9IChEVERFbnRpdHlDb250ZW50KQotLy8gKChJbnRlcm5hbEVPYmplY3QpdGhpcy5jb250ZW50KS5yZXNvbHZlKHRoaXMpOwotLy8gaWYgKHRoaXMuY29udGVudD09bnVsbCkgdGhpcy5zZXRDb250ZW50ID0gZmFsc2U7Ci0vLyByZXR1cm4gdGhpcy5jb250ZW50OwotLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBudWxsOwotLy8gfQotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldENvbnRlbnQoRFRERW50aXR5Q29udGVudCBsKSB7Ci0vLyByZWZTZXRWYWx1ZUZvclJlZk9iamVjdFNGKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db250ZW50KCksdGhpcy5jb250ZW50LGwpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0Q29udGVudCgpIHsKLS8vIHJlZlVuc2V0VmFsdWVGb3JSZWZPYmplY3RTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLHRoaXMuY29udGVudCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRDb250ZW50KCkgewotLy8gcmV0dXJuIHNldENvbnRlbnQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGdldFBhcm1FbnRpdHlSZWYoKSB7Ci0vLyB0cnkgewotLy8gaWYgKHRoaXMucGFybUVudGl0eVJlZiA9PSBudWxsKSByZXR1cm4gbnVsbDsKLS8vIHRoaXMucGFybUVudGl0eVJlZiA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpCi0vLyAoKEludGVybmFsRU9iamVjdCl0aGlzLnBhcm1FbnRpdHlSZWYpLnJlc29sdmUodGhpcywKLS8vIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCkpOwotLy8gaWYgKHRoaXMucGFybUVudGl0eVJlZj09bnVsbCkgdGhpcy5zZXRQYXJtRW50aXR5UmVmID0gZmFsc2U7Ci0vLyByZXR1cm4gdGhpcy5wYXJtRW50aXR5UmVmOwotLy8gfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBudWxsOwotLy8gfQotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFBhcm1FbnRpdHlSZWYoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGwpIHsKLS8vIHJlZlNldFZhbHVlRm9yU1ZSZWZlcmVuY2UoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSx0aGlzLnBhcm1FbnRpdHlSZWYsbCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQYXJtRW50aXR5UmVmKCkgewotLy8gcmVmVW5zZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksdGhpcy5wYXJtRW50aXR5UmVmKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFBhcm1FbnRpdHlSZWYoKSB7Ci0vLyByZXR1cm4gc2V0UGFybUVudGl0eVJlZjsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXRFbnRpdHlSZWZlcmVuY2UoKSB7Ci0vLyBpZiAodGhpcy5lbnRpdHlSZWZlcmVuY2U9PW51bGwpIHsKLS8vIHRoaXMuZW50aXR5UmVmZXJlbmNlPW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfRW50aXR5UmVmZXJlbmNlKCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmVudGl0eVJlZmVyZW5jZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCkgewotLy8gaWYgKHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZT09bnVsbCkgewotLy8gdGhpcy5hdHRyaWJ1dGVOYW1lUmVmZXJlbmNlPW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVOYW1lUmVmZXJlbmNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEVMaXN0IGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSB7Ci0vLyBpZiAodGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlPT1udWxsKSB7Ci0vLyB0aGlzLmF0dHJpYnV0ZVR5cGVSZWZlcmVuY2U9bmV3Q29sbGVjdGlvbih0aGlzLERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmF0dHJpYnV0ZVR5cGVSZWZlcmVuY2U7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogcmV0dXJuIGdldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiByZXR1cm4gZ2V0UGFyYW1ldGVyRW50aXR5KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogcmV0dXJuIGdldENvbnRlbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHJldHVybiBnZXRQYXJtRW50aXR5UmVmKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRTogcmV0dXJuIGdldEVudGl0eVJlZmVyZW5jZSgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRTogcmV0dXJuCi0vLyBnZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX1RZUEVfUkVGRVJFTkNFOiByZXR1cm4KLS8vIGdldEF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19EVERfRklMRTogcmV0dXJuIGdldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IHJlZkJhc2ljVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRERW50aXR5KCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT01NRU5UOgotLy8gcmV0dXJuIHRoaXMuc2V0Q29tbWVudD8gdGhpcy5jb21tZW50IDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOgotLy8gcmV0dXJuIHRoaXMuc2V0UGFyYW1ldGVyRW50aXR5PyB0aGlzLnBhcmFtZXRlckVudGl0eSA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDoKLS8vIGlmICghdGhpcy5zZXRDb250ZW50fHx0aGlzLmNvbnRlbnQ9PW51bGwpIHJldHVybiBudWxsOwotLy8gaWYgKCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMuY29udGVudCkucmVmSXNEZWxldGVkKCkpIHt0aGlzLmNvbnRlbnQ9bnVsbDsKLS8vIHRoaXMuc2V0Q29udGVudD1mYWxzZTt9Ci0vLyByZXR1cm4gdGhpcy5jb250ZW50OwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRjoKLS8vIGlmICghdGhpcy5zZXRQYXJtRW50aXR5UmVmfHx0aGlzLnBhcm1FbnRpdHlSZWY9PW51bGwpIHJldHVybiBudWxsOwotLy8gaWYgKCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMucGFybUVudGl0eVJlZikucmVmSXNEZWxldGVkKCkpCi0vLyB7dGhpcy5wYXJtRW50aXR5UmVmPW51bGw7IHRoaXMuc2V0UGFybUVudGl0eVJlZj1mYWxzZTt9Ci0vLyByZXR1cm4gdGhpcy5wYXJtRW50aXR5UmVmOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0U6Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHlSZWZlcmVuY2U7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQVRUUklCVVRFX05BTUVfUkVGRVJFTkNFOgotLy8gcmV0dXJuIHRoaXMuYXR0cmlidXRlTmFtZVJlZmVyZW5jZTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0U6Ci0vLyByZXR1cm4gdGhpcy5hdHRyaWJ1dGVUeXBlUmVmZXJlbmNlOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiByZXR1cm4KLS8vICgoSW50ZXJuYWxFT2JqZWN0KWdldER0ZENvbnRlbnREZWxlZ2F0ZSgpKS5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogcmV0dXJuIGlzU2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUkFNRVRFUl9FTlRJVFk6IHJldHVybgotLy8gaXNTZXRQYXJhbWV0ZXJFbnRpdHkoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOiByZXR1cm4gaXNTZXRDb250ZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiByZXR1cm4gaXNTZXRQYXJtRW50aXR5UmVmKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fRFREX0ZJTEU6IHJldHVybiBpc1NldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIHNldENvbW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gc2V0UGFyYW1ldGVyRW50aXR5KChuZXdWYWx1ZSBpbnN0YW5jZW9mCi0vLyBTdHJpbmcpP0Jvb2xlYW4udmFsdWVPZigoU3RyaW5nKW5ld1ZhbHVlKTooQm9vbGVhbiluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gc2V0Q29udGVudCgoRFRERW50aXR5Q29udGVudCluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyBzZXRQYXJtRW50aXR5UmVmKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiB7Ci0vLyBzZXREVERGaWxlKChEVERGaWxlKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IChTdHJpbmcpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29tbWVudCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJBTUVURVJfRU5USVRZOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcmFtZXRlckVudGl0eTsKLS8vIHRoaXMucGFyYW1ldGVyRW50aXR5ID0gKEJvb2xlYW4pbmV3VmFsdWU7Ci0vLyB0aGlzLnNldFBhcmFtZXRlckVudGl0eSA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb250ZW50OwotLy8gdGhpcy5jb250ZW50ID0gKERUREVudGl0eUNvbnRlbnQpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldENvbnRlbnQgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29udGVudCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMucGFybUVudGl0eVJlZjsKLS8vIHRoaXMucGFybUVudGl0eVJlZiA9IChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldFBhcm1FbnRpdHlSZWYgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUJhc2ljU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREVudGl0eSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09NTUVOVDogewotLy8gdW5zZXRDb21tZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gdW5zZXRQYXJhbWV0ZXJFbnRpdHkoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5UOiB7Ci0vLyB1bnNldENvbnRlbnQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUY6IHsKLS8vIHVuc2V0UGFybUVudGl0eVJlZigpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0RURF9GSUxFOiB7Ci0vLyB1bnNldERUREZpbGUoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiByZWZCYXNpY1Vuc2V0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERFbnRpdHkoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0NPTU1FTlQ6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuY29tbWVudDsKLS8vIHRoaXMuY29tbWVudCA9IG51bGw7Ci0vLyB0aGlzLnNldENvbW1lbnQgPSBmYWxzZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uVU5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnRpdHlfQ29tbWVudCgpLG9sZFZhbHVlLGdldENvbW1lbnQoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWTogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJhbWV0ZXJFbnRpdHk7Ci0vLyB0aGlzLnBhcmFtZXRlckVudGl0eSA9IG51bGw7Ci0vLyB0aGlzLnNldFBhcmFtZXRlckVudGl0eSA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9QYXJhbWV0ZXJFbnRpdHkoKSxvbGRWYWx1ZSxnZXRQYXJhbWV0ZXJFbnRpdHkoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb250ZW50OwotLy8gdGhpcy5jb250ZW50ID0gbnVsbDsKLS8vIHRoaXMuc2V0Q29udGVudCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eV9Db250ZW50KCksb2xkVmFsdWUsbnVsbCk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcm1FbnRpdHlSZWY7Ci0vLyB0aGlzLnBhcm1FbnRpdHlSZWYgPSBudWxsOwotLy8gdGhpcy5zZXRQYXJtRW50aXR5UmVmID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSxvbGRWYWx1ZSxudWxsKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBEVERDb250ZW50SW1wbCBnZXREdGRDb250ZW50RGVsZWdhdGUoKSB7Ci0vLyBpZiAoZHRkQ29udGVudERlbGVnYXRlID09IG51bGwpIHsKLS8vIERURFBhY2thZ2UgcGtnID0KLS8vIChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGU9KERURENvbnRlbnRJbXBsKXBrZy5lQ3JlYXRlSW5zdGFuY2UocGtnLkRURF9DT05URU5UKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZS5pbml0SW5zdGFuY2UoKTsKLS8vIH0KLS8vIHJldHVybiBkdGRDb250ZW50RGVsZWdhdGU7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIEVDbGFzcyBlQ2xhc3NEVERDb250ZW50KCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmVDbGFzcygpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZ2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldERUREZpbGUoRFRERmlsZSB2YWx1ZSkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuc2V0RFRERmlsZSh2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXREVERGaWxlKCkgewotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkudW5zZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmlzU2V0RFRERmlsZSgpOwotLy8gfQotLy8gfQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QyNmE1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uQ2hhaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgewotCi0JcHVibGljIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnROYW1lKCkgewotCQlEVERFbnRpdHkgZSA9IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCWlmIChlID09IG51bGwpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGUuZ2V0TmFtZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkgewotCQlEVERFbnRpdHkgZW50aXR5UmVmID0gZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJaWYgKGVudGl0eVJlZi5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQlyZXR1cm4gIiUiICsgZ2V0Q29udGVudE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gIiYiICsgZ2V0Q29udGVudE5hbWUoKSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5IGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gbnVsbDsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCkgewotCQlpZiAoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCAmJiBlbGVtZW50UmVmZXJlbmNlZEVudGl0eS5lSXNQcm94eSgpKSB7Ci0JCQlEVERFbnRpdHkgb2xkRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgPSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eTsKLQkJCWVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gKERUREVudGl0eSkgRWNvcmVVdGlsLnJlc29sdmUoZWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIHRoaXMpOwotCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KSB7Ci0JCQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uUkVTT0xWRSwgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZLCBvbGRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSwgZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgYmFzaWNHZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gYmFzaWNTZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShEVERFbnRpdHkgbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJRFRERW50aXR5IG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JCWVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ID0gbmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHk7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFksIG9sZEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkpOwotCQl9Ci0JCXJldHVybiBtc2dzOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KERUREVudGl0eSBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkgewotCQlpZiAobmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkgIT0gZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkpIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBlbGVtZW50UmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkobmV3RWxlbWVudFJlZmVyZW5jZWRFbnRpdHksIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlRfUkVGRVJFTkNFRF9FTlRJVFksIG5ld0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5LCBuZXdFbGVtZW50UmVmZXJlbmNlZEVudGl0eSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJaWYgKGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0UsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KChEVERFbnRpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfX0NPTlRFTlQsIERUREVsZW1lbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJcmV0dXJuIGdldE9jY3VycmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCk7Ci0JCQkJcmV0dXJuIGJhc2ljR2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXJldHVybiBnZXRHcm91cCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBvY2N1cnJlbmNlICE9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VkRW50aXR5ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKChEVERPY2N1cnJlbmNlVHlwZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFlfUkVGRVJFTkNFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlzZXRPY2N1cnJlbmNlKE9DQ1VSUkVOQ0VfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UX19FTEVNRU5UX1JFRkVSRU5DRURfRU5USVRZIDoKLQkJCQlzZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW51bWVyYXRpb25UeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREVudW1lcmF0aW9uVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBhNmQyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERW51bWVyYXRpb25UeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRUVudW1JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtR3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFbnVtZXJhdGlvblR5cGVJbXBsIGV4dGVuZHMgRUVudW1JbXBsIGltcGxlbWVudHMgRFRERW51bWVyYXRpb25UeXBlIHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0S2luZCgpIDxlbT5LaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0S2luZCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERFbnVtR3JvdXBLaW5kIEtJTkRfRURFRkFVTFQgPSBEVERFbnVtR3JvdXBLaW5kLk5BTUVfVE9LRU5fR1JPVVBfTElURVJBTDsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uc1tdID0ge0RURENvcmVNZXNzYWdlcy5fVUlfRU5VTV9OQU1FX1RPS0VOU19ERVNDLCBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTk9UQVRJT05fREVTQ307IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgZW51bWVyYXRpb25UeXBlS2luZHNbXSA9IHtEVERFbnVtR3JvdXBLaW5kLk5BTUVfVE9LRU5fR1JPVVAsIERUREVudW1Hcm91cEtpbmQuTk9UQVRJT05fR1JPVVB9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERUREVudW1Hcm91cEtpbmQga2luZCA9IEtJTkRfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERFbnVtZXJhdGlvblR5cGUoKTsKLQl9Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RW51bUxpdGVyYWxzKCkgewotCQlyZXR1cm4gZ2V0RUxpdGVyYWxzKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGdldEVudW1lcmF0aW9uVHlwZURlc2NyaXB0aW9uKGdldEtpbmQoKS5nZXRWYWx1ZSgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRFbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbihpbnQga2luZCkgewotCQkvLyBpdCBjYW4gb25seSBiZSAxIG9yIDIsIGJ1dCBtYXliZSBsYXRlci4uLgotCQlpZiAoa2luZCA+PSAxICYmIGtpbmQgPD0gMikgewotCQkJLy8gd2Ugc3VidHJhY3QgMSBzaW5jZSB0aGUga2luZCBpcyAxIC0gYmFzZWQgbm90IHplcm8gYmFzZWQKLQkJCXJldHVybiBlbnVtZXJhdGlvblR5cGVEZXNjcmlwdGlvbnNba2luZCAtIDFdOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCS8vIFRCRAotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERFbnVtR3JvdXBLaW5kIGdldEtpbmQoKSB7Ci0JCXJldHVybiBraW5kOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRLaW5kKERUREVudW1Hcm91cEtpbmQgbmV3S2luZCkgewotCQlEVERFbnVtR3JvdXBLaW5kIG9sZEtpbmQgPSBraW5kOwotCQlraW5kID0gbmV3S2luZCA9PSBudWxsID8gS0lORF9FREVGQVVMVCA6IG5ld0tpbmQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQsIG9sZEtpbmQsIGtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoRFRERmlsZSkgZUNvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgbmV3RFRERmlsZSkgewotCQlpZiAobmV3RFRERmlsZSAhPSBlQ29udGFpbmVyIHx8IChlQ29udGFpbmVyRmVhdHVyZUlEICE9IERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFICYmIG5ld0RUREZpbGUgIT0gbnVsbCkpIHsKLQkJCWlmIChFY29yZVV0aWwuaXNBbmNlc3Rvcih0aGlzLCBuZXdEVERGaWxlKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZWN1cnNpdmUgY29udGFpbm1lbnQgbm90IGFsbG93ZWQgZm9yICIgKyB0b1N0cmluZygpICsgIi4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQlpZiAobmV3RFRERmlsZSAhPSBudWxsKQotCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgbmV3RFRERmlsZSkuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUsIERUREZpbGUuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGVCYXNpY1NldENvbnRhaW5lcigoSW50ZXJuYWxFT2JqZWN0KSBuZXdEVERGaWxlLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFLCBuZXdEVERGaWxlLCBuZXdEVERGaWxlKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUFOTk9UQVRJT05TIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUFubm90YXRpb25zKCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRFTGl0ZXJhbHMoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVBbm5vdGF0aW9ucygpKS5iYXNpY1JlbW92ZShvdGhlckVuZCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRVBBQ0tBR0UsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RUxpdGVyYWxzKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FUEFDS0FHRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVjb3JlUGFja2FnZS5FUEFDS0FHRV9fRUNMQVNTSUZJRVJTLCBFUGFja2FnZS5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFLCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCXJldHVybiBnZXRFQW5ub3RhdGlvbnMoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fTkFNRSA6Ci0JCQkJcmV0dXJuIGdldE5hbWUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJcmV0dXJuIGdldEluc3RhbmNlQ2xhc3NOYW1lKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlyZXR1cm4gZ2V0SW5zdGFuY2VDbGFzcygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19ERUZBVUxUX1ZBTFVFIDoKLQkJCQlyZXR1cm4gZ2V0RGVmYXVsdFZhbHVlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fU0VSSUFMSVpBQkxFIDoKLQkJCQlyZXR1cm4gaXNTZXJpYWxpemFibGUoKSA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VMSVRFUkFMUyA6Ci0JCQkJcmV0dXJuIGdldEVMaXRlcmFscygpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EIDoKLQkJCQlyZXR1cm4gZ2V0S2luZCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VBTk5PVEFUSU9OUyA6Ci0JCQkJcmV0dXJuIGVBbm5vdGF0aW9ucyAhPSBudWxsICYmICFnZXRFQW5ub3RhdGlvbnMoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX05BTUUgOgotCQkJCXJldHVybiBOQU1FX0VERUZBVUxUID09IG51bGwgPyBuYW1lICE9IG51bGwgOiAhTkFNRV9FREVGQVVMVC5lcXVhbHMobmFtZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19OQU1FX0VERUZBVUxUID09IG51bGwgPyBpbnN0YW5jZUNsYXNzTmFtZSAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX05BTUVfRURFRkFVTFQuZXF1YWxzKGluc3RhbmNlQ2xhc3NOYW1lKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1MgOgotCQkJCXJldHVybiBJTlNUQU5DRV9DTEFTU19FREVGQVVMVCA9PSBudWxsID8gaW5zdGFuY2VDbGFzcyAhPSBudWxsIDogIUlOU1RBTkNFX0NMQVNTX0VERUZBVUxULmVxdWFscyhpbnN0YW5jZUNsYXNzKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fREVGQVVMVF9WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldERlZmF1bHRWYWx1ZSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0VQQUNLQUdFIDoKLQkJCQlyZXR1cm4gZ2V0RVBhY2thZ2UoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgOgotCQkJCXJldHVybiAoKGVGbGFncyAmIFNFUklBTElaQUJMRV9FRkxBRykgIT0gMCkgIT0gU0VSSUFMSVpBQkxFX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FTElURVJBTFMgOgotCQkJCXJldHVybiBlTGl0ZXJhbHMgIT0gbnVsbCAmJiAhZ2V0RUxpdGVyYWxzKCkuaXNFbXB0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19LSU5EIDoKLQkJCQlyZXR1cm4ga2luZCAhPSBLSU5EX0VERUZBVUxUOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKSAhPSBudWxsOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJZ2V0RUFubm90YXRpb25zKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FIDoKLQkJCQlzZXROYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTX05BTUUgOgotCQkJCXNldEluc3RhbmNlQ2xhc3NOYW1lKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0lOU1RBTkNFX0NMQVNTIDoKLQkJCQlzZXRJbnN0YW5jZUNsYXNzKChDbGFzcykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fU0VSSUFMSVpBQkxFIDoKLQkJCQlzZXRTZXJpYWxpemFibGUoKChCb29sZWFuKSBuZXdWYWx1ZSkuYm9vbGVhblZhbHVlKCkpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQlnZXRFTGl0ZXJhbHMoKS5jbGVhcigpOwotCQkJCWdldEVMaXRlcmFscygpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCA6Ci0JCQkJc2V0S2luZCgoRFRERW51bUdyb3VwS2luZCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19FQU5OT1RBVElPTlMgOgotCQkJCWdldEVBbm5vdGF0aW9ucygpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19OQU1FIDoKLQkJCQlzZXROYW1lKE5BTUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fSU5TVEFOQ0VfQ0xBU1NfTkFNRSA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzc05hbWUoSU5TVEFOQ0VfQ0xBU1NfTkFNRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19JTlNUQU5DRV9DTEFTUyA6Ci0JCQkJc2V0SW5zdGFuY2VDbGFzcyhJTlNUQU5DRV9DTEFTU19FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19TRVJJQUxJWkFCTEUgOgotCQkJCXNldFNlcmlhbGl6YWJsZShTRVJJQUxJWkFCTEVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fRUxJVEVSQUxTIDoKLQkJCQlnZXRFTGl0ZXJhbHMoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRV9fS0lORCA6Ci0JCQkJc2V0S2luZChLSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKGVJc1Byb3h5KCkpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQotCQlTdHJpbmdCdWZmZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1ZmZlcihzdXBlci50b1N0cmluZygpKTsKLQkJcmVzdWx0LmFwcGVuZCgiIChraW5kOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKGtpbmQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFeHRlcm5hbEVudGl0eUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERFeHRlcm5hbEVudGl0eUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyNWEzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERXh0ZXJuYWxFbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLk5vdGlmaWNhdGlvbkNoYWluSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERFeHRlcm5hbEVudGl0eUltcGwgZXh0ZW5kcyBEVERFbnRpdHlDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREV4dGVybmFsRW50aXR5IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0U3lzdGVtSUQoKSA8ZW0+U3lzdGVtIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0U3lzdGVtSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9JRF9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlEID0gU1lTVEVNX0lEX0VERUZBVUxUOwotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRQdWJsaWNJRCgpIDxlbT5QdWJsaWMgSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRQdWJsaWNJRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSUQgPSBQVUJMSUNfSURfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIERURE5vdGF0aW9uIG5vdGF0aW9uID0gbnVsbDsKLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRERmlsZSBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlID0gbnVsbDsKLQotCXB1YmxpYyBEVERFeHRlcm5hbEVudGl0eUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERXh0ZXJuYWxFbnRpdHkoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoKSB7Ci0JCVN0cmluZ0J1ZmZlciB0ZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcigxMDApOwotCQlpZiAoZ2V0UHVibGljSUQoKSA9PSBudWxsIHx8IGdldFB1YmxpY0lEKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQl0ZXh0LmFwcGVuZCgiU1lTVEVNICIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQl0ZXh0LmFwcGVuZCgiUFVCTElDIFwiIikuYXBwZW5kKGdldFB1YmxpY0lEKCkpLmFwcGVuZCgiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IGdldFN5c3RlbUlEKCk7Ci0KLQkJdGV4dC5hcHBlbmQoIlwiIikuYXBwZW5kKHN5c3RlbUlkKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCURURE5vdGF0aW9uIG5vdGF0aW9uID0gZ2V0Tm90YXRpb24oKTsKLQkJaWYgKG5vdGF0aW9uICE9IG51bGwpCi0JCQl0ZXh0LmFwcGVuZCgiIE5EQVRBICIpLmFwcGVuZChub3RhdGlvbi5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSUQoKSB7Ci0JCXJldHVybiBzeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgbmV3U3lzdGVtSUQpIHsKLQkJU3RyaW5nIG9sZFN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JCXN5c3RlbUlEID0gbmV3U3lzdGVtSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lELCBvbGRTeXN0ZW1JRCwgc3lzdGVtSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSUQoKSB7Ci0JCXJldHVybiBwdWJsaWNJRDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgbmV3UHVibGljSUQpIHsKLQkJU3RyaW5nIG9sZFB1YmxpY0lEID0gcHVibGljSUQ7Ci0JCXB1YmxpY0lEID0gbmV3UHVibGljSUQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lELCBvbGRQdWJsaWNJRCwgcHVibGljSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVEROb3RhdGlvbiBnZXROb3RhdGlvbigpIHsKLQkJaWYgKG5vdGF0aW9uICE9IG51bGwgJiYgbm90YXRpb24uZUlzUHJveHkoKSkgewotCQkJRFRETm90YXRpb24gb2xkTm90YXRpb24gPSBub3RhdGlvbjsKLQkJCW5vdGF0aW9uID0gKERURE5vdGF0aW9uKSBFY29yZVV0aWwucmVzb2x2ZShub3RhdGlvbiwgdGhpcyk7Ci0JCQlpZiAobm90YXRpb24gIT0gb2xkTm90YXRpb24pIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OLCBvbGROb3RhdGlvbiwgbm90YXRpb24pKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVEROb3RhdGlvbiBiYXNpY0dldE5vdGF0aW9uKCkgewotCQlyZXR1cm4gbm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldE5vdGF0aW9uKERURE5vdGF0aW9uIG5ld05vdGF0aW9uLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURURE5vdGF0aW9uIG9sZE5vdGF0aW9uID0gbm90YXRpb247Ci0JCW5vdGF0aW9uID0gbmV3Tm90YXRpb247Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkgewotCQkJaWYgKG1zZ3MgPT0gbnVsbCkKLQkJCQltc2dzID0gbmV3IE5vdGlmaWNhdGlvbkNoYWluSW1wbCg0KTsKLQkJCW1zZ3MuYWRkKG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OLCBvbGROb3RhdGlvbiwgbmV3Tm90YXRpb24pKTsKLQkJfQotCQlyZXR1cm4gbXNnczsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbihEVEROb3RhdGlvbiBuZXdOb3RhdGlvbikgewotCQlpZiAobmV3Tm90YXRpb24gIT0gbm90YXRpb24pIHsKLQkJCU5vdGlmaWNhdGlvbkNoYWluIG1zZ3MgPSBudWxsOwotCQkJaWYgKG5vdGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBub3RhdGlvbikuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFRETm90YXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJaWYgKG5ld05vdGF0aW9uICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdOb3RhdGlvbikuZUludmVyc2VBZGQodGhpcywgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSwgRFRETm90YXRpb24uY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0Tm90YXRpb24obmV3Tm90YXRpb24sIG1zZ3MpOwotCQkJaWYgKG1zZ3MgIT0gbnVsbCkKLQkJCQltc2dzLmRpc3BhdGNoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OLCBuZXdOb3RhdGlvbiwgbmV3Tm90YXRpb24pKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBEVERGaWxlIGdldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKSB7Ci0JCWlmIChlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlICE9IG51bGwgJiYgZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZS5lSXNQcm94eSgpKSB7Ci0JCQlEVERGaWxlIG9sZEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUgPSBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlOwotCQkJZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IChEVERGaWxlKSBFY29yZVV0aWwucmVzb2x2ZShlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlLCB0aGlzKTsKLQkJCWlmIChlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlICE9IG9sZEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFLCBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlLCBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERGaWxlIGJhc2ljR2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpIHsKLQkJcmV0dXJuIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZShEVERGaWxlIG5ld0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUpIHsKLQkJRFRERmlsZSBvbGRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlID0gZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZTsKLQkJZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSA9IG5ld0VudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUsIG9sZEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUsIGVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX05PVEFUSU9OIDoKLQkJCQkJaWYgKG5vdGF0aW9uICE9IG51bGwpCi0JCQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIG5vdGF0aW9uKS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZLCBEVEROb3RhdGlvbi5jbGFzcywgbXNncyk7Ci0JCQkJCXJldHVybiBiYXNpY1NldE5vdGF0aW9uKChEVEROb3RhdGlvbikgb3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFksIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJCXJldHVybiBiYXNpY1NldE5vdGF0aW9uKG51bGwsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19DT05URU5ULCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRU9QUE9TSVRFX0ZFQVRVUkVfQkFTRSAtIGVDb250YWluZXJGZWF0dXJlSUQsIG51bGwsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBib29sZWFuIHJlc29sdmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIGdldFN5c3RlbUlEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lEIDoKLQkJCQlyZXR1cm4gZ2V0UHVibGljSUQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJaWYgKHJlc29sdmUpCi0JCQkJCXJldHVybiBnZXROb3RhdGlvbigpOwotCQkJCXJldHVybiBiYXNpY0dldE5vdGF0aW9uKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUgOgotCQkJCWlmIChyZXNvbHZlKQotCQkJCQlyZXR1cm4gZ2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGdldERUREVudGl0eSgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lEIDoKLQkJCQlyZXR1cm4gU1lTVEVNX0lEX0VERUZBVUxUID09IG51bGwgPyBzeXN0ZW1JRCAhPSBudWxsIDogIVNZU1RFTV9JRF9FREVGQVVMVC5lcXVhbHMoc3lzdGVtSUQpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJcmV0dXJuIFBVQkxJQ19JRF9FREVGQVVMVCA9PSBudWxsID8gcHVibGljSUQgIT0gbnVsbCA6ICFQVUJMSUNfSURfRURFRkFVTFQuZXF1YWxzKHB1YmxpY0lEKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJcmV0dXJuIG5vdGF0aW9uICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUgOgotCQkJCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fU1lTVEVNX0lEIDoKLQkJCQlzZXRTeXN0ZW1JRCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1BVQkxJQ19JRCA6Ci0JCQkJc2V0UHVibGljSUQoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJc2V0Tm90YXRpb24oKERURE5vdGF0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFIDoKLQkJCQlzZXRFbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKChEVERGaWxlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FWFRFUk5BTF9FTlRJVFlfX1NZU1RFTV9JRCA6Ci0JCQkJc2V0U3lzdGVtSUQoU1lTVEVNX0lEX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fUFVCTElDX0lEIDoKLQkJCQlzZXRQdWJsaWNJRChQVUJMSUNfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTiA6Ci0JCQkJc2V0Tm90YXRpb24oKERURE5vdGF0aW9uKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fRU5USVRZX1JFRkVSRU5DRURfRlJPTV9BTk9USEVSX0ZJTEUgOgotCQkJCXNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUoKERUREZpbGUpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHN5c3RlbUlEOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHN5c3RlbUlEKTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwdWJsaWNJRDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChwdWJsaWNJRCk7Ci0JCXJlc3VsdC5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZhY3RvcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUwMmM2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmFjdG9yeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5YTUxTY2hlbWFEZWZpbmVkVHlwZTsKLQotLyoqCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERGYWN0b3J5SW1wbCBleHRlbmRzIEVGYWN0b3J5SW1wbCBpbXBsZW1lbnRzIERUREZhY3RvcnkgewotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05PTkU7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfQ0RBVEE7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSUQ7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSURSRUY7Ci0JcHJvdGVjdGVkIERUREJhc2ljVHlwZSBkdGRCYXNpY1R5cGVfSURSRUZTOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX0VOVElUWTsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9FTlRJVElFUzsKLQlwcm90ZWN0ZWQgRFREQmFzaWNUeXBlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOOwotCXByb3RlY3RlZCBEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlX05NVE9LRU5TOwotCi0KLQotCXB1YmxpYyBzdGF0aWMgRFRERmFjdG9yeSBpbnN0YW5jZSgpIHsKLQkJcmV0dXJuIChEVERGYWN0b3J5KSBnZXRQYWNrYWdlKCkuZ2V0RUZhY3RvcnlJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OT05FLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk9ORSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OT05FID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk9ORSA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuQ0RBVEFfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OT05FOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9DREFUQS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkgewotCQlpZiAoZHRkQmFzaWNUeXBlX0NEQVRBID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfQ0RBVEEgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkNEQVRBX0xJVEVSQUwpOwotCQl9Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVfQ0RBVEE7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0lELgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfSUQoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSUQgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9JRCA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuSURfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfSURSRUYuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRFJFRigpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9JRFJFRiA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0lEUkVGID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRFJFRl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0lEUkVGOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9JRFJFRlMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9JRFJFRlMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfSURSRUZTID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfSURSRUZTID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5JRFJFRlNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9JRFJFRlM7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX0VOVElUWS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBEVERUeXBlCi0JICovCi0JcHVibGljIERURFR5cGUgZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9FTlRJVFkgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9FTlRJVFkgPSBjcmVhdGVEVERCYXNpY1R5cGUoKSkuc2V0S2luZChEVERCYXNpY1R5cGVLaW5kLkVOVElUWV9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0VOVElUWTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBkdGRCYXNpY1R5cGVfRU5USVRJRVMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgRFREVHlwZQotCSAqLwotCXB1YmxpYyBEVERUeXBlIGdldERUREJhc2ljVHlwZV9FTlRJVElFUygpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9FTlRJVElFUyA9PSBudWxsKSB7Ci0JCQkoZHRkQmFzaWNUeXBlX0VOVElUSUVTID0gY3JlYXRlRFREQmFzaWNUeXBlKCkpLnNldEtpbmQoRFREQmFzaWNUeXBlS2luZC5FTlRJVElFU19MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX0VOVElUSUVTOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGR0ZEJhc2ljVHlwZV9OTVRPS0VOLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk1UT0tFTigpIHsKLQkJaWYgKGR0ZEJhc2ljVHlwZV9OTVRPS0VOID09IG51bGwpIHsKLQkJCShkdGRCYXNpY1R5cGVfTk1UT0tFTiA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTl9MSVRFUkFMKTsKLQkJfQotCQlyZXR1cm4gZHRkQmFzaWNUeXBlX05NVE9LRU47Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgZHRkQmFzaWNUeXBlX05NVE9LRU5TLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERURFR5cGUKLQkgKi8KLQlwdWJsaWMgRFREVHlwZSBnZXREVERCYXNpY1R5cGVfTk1UT0tFTlMoKSB7Ci0JCWlmIChkdGRCYXNpY1R5cGVfTk1UT0tFTlMgPT0gbnVsbCkgewotCQkJKGR0ZEJhc2ljVHlwZV9OTVRPS0VOUyA9IGNyZWF0ZURUREJhc2ljVHlwZSgpKS5zZXRLaW5kKERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlNfTElURVJBTCk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEJhc2ljVHlwZV9OTVRPS0VOUzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuZCBpbnN0YW5jZSBvZiB0aGUgZmFjdG9yeS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLQotCSAqIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIERUREZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBjcmVhdGUoRUNsYXNzIGVDbGFzcykgewotCQlzd2l0Y2ggKGVDbGFzcy5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FUVFJJQlVURSA6Ci0JCQkJcmV0dXJuIGNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTEVNRU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTVBUWV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0FOWV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQW55Q29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlRfUkVGRVJFTkNFX0NPTlRFTlQgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFREQmFzaWNUeXBlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT04gOgotCQkJCXJldHVybiBjcmVhdGVEVEROb3RhdGlvbigpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9FTlRJVFkgOgotCQkJCXJldHVybiBjcmVhdGVEVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRVhURVJOQUxfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCXJldHVybiBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UIDoKLQkJCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNyZWF0ZUZyb21TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgU3RyaW5nIGluaXRpYWxWYWx1ZSkgewotCQlzd2l0Y2ggKGVEYXRhVHlwZS5nZXRDbGFzc2lmaWVySUQoKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9PQ0NVUlJFTkNFX1RZUEUgOgotCQkJCXJldHVybiBEVERPY2N1cnJlbmNlVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gRFRERGVmYXVsdEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0JBU0lDX1RZUEVfS0lORCA6Ci0JCQkJcmV0dXJuIERUREJhc2ljVHlwZUtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0VOVU1fR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIERUREVudW1Hcm91cEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBEVERHcm91cEtpbmQuZ2V0KGluaXRpYWxWYWx1ZSk7Ci0JCQljYXNlIERURFBhY2thZ2UuWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgOgotCQkJCXJldHVybiBYTUxTY2hlbWFEZWZpbmVkVHlwZS5nZXQoaW5pdGlhbFZhbHVlKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBjb252ZXJ0VG9TdHJpbmcoRURhdGFUeXBlIGVEYXRhVHlwZSwgT2JqZWN0IGluc3RhbmNlVmFsdWUpIHsKLQkJc3dpdGNoIChlRGF0YVR5cGUuZ2V0Q2xhc3NpZmllcklEKCkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfT0NDVVJSRU5DRV9UWVBFIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfREVGQVVMVF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfQkFTSUNfVFlQRV9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTV9HUk9VUF9LSU5EIDoKLQkJCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZSA9PSBudWxsID8gbnVsbCA6IGluc3RhbmNlVmFsdWUudG9TdHJpbmcoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfS0lORCA6Ci0JCQkJcmV0dXJuIGluc3RhbmNlVmFsdWUgPT0gbnVsbCA/IG51bGwgOiBpbnN0YW5jZVZhbHVlLnRvU3RyaW5nKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuWE1MX1NDSEVNQV9ERUZJTkVEX1RZUEUgOgotCQkJCXJldHVybiBpbnN0YW5jZVZhbHVlID09IG51bGwgPyBudWxsIDogaW5zdGFuY2VWYWx1ZS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRER3JvdXBDb250ZW50IGNyZWF0ZURUREdyb3VwQ29udGVudCgpIHsKLQkJRFRER3JvdXBDb250ZW50SW1wbCBkdGRHcm91cENvbnRlbnQgPSBuZXcgRFRER3JvdXBDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkR3JvdXBDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQXR0cmlidXRlIGNyZWF0ZURUREF0dHJpYnV0ZSgpIHsKLQkJRFREQXR0cmlidXRlSW1wbCBkdGRBdHRyaWJ1dGUgPSBuZXcgRFREQXR0cmlidXRlSW1wbCgpOwotCQlyZXR1cm4gZHRkQXR0cmlidXRlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudCBjcmVhdGVEVERFbGVtZW50KCkgewotCQlEVERFbGVtZW50SW1wbCBkdGRFbGVtZW50ID0gbmV3IERUREVsZW1lbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbGVtZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW1wdHlDb250ZW50IGNyZWF0ZURUREVtcHR5Q29udGVudCgpIHsKLQkJRFRERW1wdHlDb250ZW50SW1wbCBkdGRFbXB0eUNvbnRlbnQgPSBuZXcgRFRERW1wdHlDb250ZW50SW1wbCgpOwotCQlyZXR1cm4gZHRkRW1wdHlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQW55Q29udGVudCBjcmVhdGVEVERBbnlDb250ZW50KCkgewotCQlEVERBbnlDb250ZW50SW1wbCBkdGRBbnlDb250ZW50ID0gbmV3IERUREFueUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRBbnlDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUENEYXRhQ29udGVudCBjcmVhdGVEVERQQ0RhdGFDb250ZW50KCkgewotCQlEVERQQ0RhdGFDb250ZW50SW1wbCBkdGRwY0RhdGFDb250ZW50ID0gbmV3IERURFBDRGF0YUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRwY0RhdGFDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgY3JlYXRlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKSB7Ci0JCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50SW1wbCBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudCA9IG5ldyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEltcGwoKTsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmlsZSBjcmVhdGVEVERGaWxlKCkgewotCQlEVERGaWxlSW1wbCBkdGRGaWxlID0gbmV3IERUREZpbGVJbXBsKCk7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREQmFzaWNUeXBlIGNyZWF0ZURUREJhc2ljVHlwZSgpIHsKLQkJRFREQmFzaWNUeXBlSW1wbCBkdGRCYXNpY1R5cGUgPSBuZXcgRFREQmFzaWNUeXBlSW1wbCgpOwotCQlyZXR1cm4gZHRkQmFzaWNUeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlSW1wbCBkdGRFbnVtZXJhdGlvblR5cGUgPSBuZXcgRFRERW51bWVyYXRpb25UeXBlSW1wbCgpOwotCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRETm90YXRpb24gY3JlYXRlRFRETm90YXRpb24oKSB7Ci0JCURURE5vdGF0aW9uSW1wbCBkdGROb3RhdGlvbiA9IG5ldyBEVEROb3RhdGlvbkltcGwoKTsKLQkJcmV0dXJuIGR0ZE5vdGF0aW9uOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eSgpIHsKLQkJRFRERW50aXR5SW1wbCBkdGRFbnRpdHkgPSBuZXcgRFRERW50aXR5SW1wbCgpOwotCQlyZXR1cm4gZHRkRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERXh0ZXJuYWxFbnRpdHkgY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKSB7Ci0JCURUREV4dGVybmFsRW50aXR5SW1wbCBkdGRFeHRlcm5hbEVudGl0eSA9IG5ldyBEVERFeHRlcm5hbEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEV4dGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRESW50ZXJuYWxFbnRpdHkgY3JlYXRlRFRESW50ZXJuYWxFbnRpdHkoKSB7Ci0JCURUREludGVybmFsRW50aXR5SW1wbCBkdGRJbnRlcm5hbEVudGl0eSA9IG5ldyBEVERJbnRlcm5hbEVudGl0eUltcGwoKTsKLQkJcmV0dXJuIGR0ZEludGVybmFsRW50aXR5OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgPSBuZXcgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlSW1wbCgpOwotCQlyZXR1cm4gZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBjcmVhdGVEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCkgewotCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50SW1wbCBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50ID0gbmV3IERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRJbXBsKCk7Ci0JCXJldHVybiBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFREUGFja2FnZSBnZXREVERQYWNrYWdlKCkgewotCQlyZXR1cm4gKERURFBhY2thZ2UpIGdldEVQYWNrYWdlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREUGFja2FnZSBnZXRQYWNrYWdlKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREZpbGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0NmU4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRERmlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOYW1lZEVsZW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bWVyYXRpb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQcmludGVyOwotCi0KLQotLyoqCi0gKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICc8ZW0+PGI+RmlsZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERGaWxlSW1wbCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRUREZpbGVJbXBsI2lzUGFyc2VFcnJvciA8ZW0+UGFyc2UgRXJyb3I8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwjZ2V0RFREQ29udGVudCA8ZW0+RFREIENvbnRlbnQ8L2VtPn08L2xpPgotICogPGxpPntAbGluayBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmludGVybmFsLmltcGwuRFRERmlsZUltcGwjZ2V0RFRERW51bWVyYXRpb25UeXBlIDxlbT5EVEQgRW51bWVyYXRpb24gVHlwZTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERGaWxlSW1wbCBleHRlbmRzIEVOYW1lZEVsZW1lbnRJbXBsIGltcGxlbWVudHMgRFRERmlsZSwgRU5hbWVkRWxlbWVudCB7Ci0KLQlwdWJsaWMgRUxpc3QgZ2V0RFRET2JqZWN0KCkgewotCQlyZXR1cm4gZ2V0RFREQ29udGVudCgpOwotCX0KLQotCi0JcHVibGljIExpc3QgbGlzdERUREVsZW1lbnQoKSB7Ci0JCXJldHVybiBnZXRDb250ZW50TGlzdE9mKERUREVsZW1lbnQuY2xhc3MsIG51bGwpOwotCX0KLQotCi0JcHVibGljIExpc3QgbGlzdERURE5vdGF0aW9uKCkgewotCQlyZXR1cm4gZ2V0Q29udGVudExpc3RPZihEVEROb3RhdGlvbi5jbGFzcywgbnVsbCk7Ci0JfQotCi0JcHVibGljIExpc3QgbGlzdERUREVudGl0eSgpIHsKLQkJcmV0dXJuIGdldENvbnRlbnRMaXN0T2YoRFRERW50aXR5LmNsYXNzLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBsaXN0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0Q29udGVudExpc3RPZihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMaXN0IGxpc3REVERFbGVtZW50QW5kRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkgewotCQlyZXR1cm4gZ2V0Q29udGVudExpc3RPZihEVERFbGVtZW50LmNsYXNzLCBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRDb250ZW50TGlzdE9mKENsYXNzIGNsYXNzMSwgQ2xhc3MgY2xhc3MyKSB7Ci0JCUxpc3QgdiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3IgaSA9IGdldERURENvbnRlbnQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCWlmIChjbGFzczEuaXNJbnN0YW5jZShvYmopKSB7Ci0JCQkJdi5hZGQob2JqKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChjbGFzczIgIT0gbnVsbCkgJiYgKGNsYXNzMi5pc0luc3RhbmNlKG9iaikpKSB7Ci0JCQkJdi5hZGQob2JqKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQlwdWJsaWMgRFRERWxlbWVudCBmaW5kRWxlbWVudChTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0RFRERWxlbWVudCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFRERWxlbWVudCBlID0gKERUREVsZW1lbnQpIGkubmV4dCgpOwotCQkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVERFbnRpdHkgZmluZEVudGl0eShTdHJpbmcgbmFtZSkgewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0RFRERW50aXR5KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERFbnRpdHkgZSA9IChEVERFbnRpdHkpIGkubmV4dCgpOwotCQkJaWYgKGUuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotCQkJCXJldHVybiBlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVEROb3RhdGlvbiBmaW5kTm90YXRpb24oU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdERURE5vdGF0aW9uKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVEROb3RhdGlvbiBlID0gKERURE5vdGF0aW9uKSBpLm5leHQoKTsKLQkJCWlmIChlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGZpbmRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIG5hbWUpIHsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIGUgPSAoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBpLm5leHQoKTsKLQkJCWlmIChlLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQlyZXR1cm4gZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHVucGFyc2UoYm9vbGVhbiBpbmNsdWRlKSB7Ci0JCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKHRydWUpOwotCQlwcmludGVyLnZpc2l0RFRERmlsZSh0aGlzKTsKLQkJcmV0dXJuIHByaW50ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gRFREUGF0aG5hbWVVdGlsLnBhcnNlUGF0aENvbXBvbmVudChyZWxhdGl2ZVBhdGgpOwotCi0KLQkJU3RyaW5nIHR5cGUgPSAoU3RyaW5nKSByZXN1bHRbMF07Ci0KLQotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQotCQlTdHJpbmcgbmFtZSA9IChTdHJpbmcpIHJlc3VsdFsxXTsKLQotCQlEVERPYmplY3Qgb2JqID0gbnVsbDsKLQkJaWYgKHR5cGUuZXF1YWxzKCJFbGVtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb2JqID0gZmluZEVsZW1lbnQobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoIkVudCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW9iaiA9IGZpbmRFbnRpdHkobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZS5lcXVhbHMoIlBFbnQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlvYmogPSBmaW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUuZXF1YWxzKCJOb3RhIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJb2JqID0gZmluZE5vdGF0aW9uKG5hbWUpOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCi0JCVN0cmluZyByZXN0UGF0aCA9IChTdHJpbmcpIHJlc3VsdFszXTsKLQotCQlpZiAoKHJlc3RQYXRoID09IG51bGwpIHx8IChvYmogPT0gbnVsbCkpIHsKLQkJCXJldHVybiBvYmo7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gb2JqLmZpbmRPYmplY3QocmVzdFBhdGgpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRDb21tZW50KCkgPGVtPkNvbW1lbnQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRDb21tZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tbWVudCA9IENPTU1FTlRfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjaXNQYXJzZUVycm9yKCkgPGVtPlBhcnNlIEVycm9yPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjaXNQYXJzZUVycm9yKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gUEFSU0VfRVJST1JfRURFRkFVTFQgPSBmYWxzZTsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2lzUGFyc2VFcnJvcigpIDxlbT5QYXJzZSBFcnJvcjwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2lzUGFyc2VFcnJvcigpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VFcnJvciA9IFBBUlNFX0VSUk9SX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0RFREQ29udGVudCgpIDxlbT5EVEQgQ29udGVudDwvZW0+fScKLQkgKiBjb250YWlubWVudCByZWZlcmVuY2UgbGlzdC4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MKLQkgKiAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXREVERDb250ZW50KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZHRkQ29udGVudCA9IG51bGw7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXREVERFbnVtZXJhdGlvblR5cGUoKSA8ZW0+RFREIEVudW1lcmF0aW9uIFR5cGU8L2VtPn0nCi0JICogY29udGFpbm1lbnQgcmVmZXJlbmNlIGxpc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jCi0JICogLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RFRERW51bWVyYXRpb25UeXBlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUxpc3QgZHRkRW51bWVyYXRpb25UeXBlID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERmlsZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZSgpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50KFN0cmluZyBuZXdDb21tZW50KSB7Ci0JCVN0cmluZyBvbGRDb21tZW50ID0gY29tbWVudDsKLQkJY29tbWVudCA9IG5ld0NvbW1lbnQ7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQsIG9sZENvbW1lbnQsIGNvbW1lbnQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzZUVycm9yKCkgewotCQlyZXR1cm4gcGFyc2VFcnJvcjsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyc2VFcnJvcihib29sZWFuIG5ld1BhcnNlRXJyb3IpIHsKLQkJYm9vbGVhbiBvbGRQYXJzZUVycm9yID0gcGFyc2VFcnJvcjsKLQkJcGFyc2VFcnJvciA9IG5ld1BhcnNlRXJyb3I7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SLCBvbGRQYXJzZUVycm9yLCBwYXJzZUVycm9yKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXREVERDb250ZW50KCkgewotCQlpZiAoZHRkQ29udGVudCA9PSBudWxsKSB7Ci0JCQlkdGRDb250ZW50ID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRFREQ29udGVudC5jbGFzcywgdGhpcywgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQsIERURFBhY2thZ2UuRFREX0NPTlRFTlRfX0RURF9GSUxFKTsKLQkJfQotCQlyZXR1cm4gZHRkQ29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldERUREVudW1lcmF0aW9uVHlwZSgpIHsKLQkJaWYgKGR0ZEVudW1lcmF0aW9uVHlwZSA9PSBudWxsKSB7Ci0JCQlkdGRFbnVtZXJhdGlvblR5cGUgPSBuZXcgRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdChEVERFbnVtZXJhdGlvblR5cGUuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFLCBEVERQYWNrYWdlLkRURF9FTlVNRVJBVElPTl9UWVBFX19EVERfRklMRSk7Ci0JCX0KLQkJcmV0dXJuIGR0ZEVudW1lcmF0aW9uVHlwZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldERURENvbnRlbnQoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERFbnVtZXJhdGlvblR5cGUoKSkuYmFzaWNBZGQob3RoZXJFbmQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlQWRkKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VSZW1vdmUoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGJhc2VDbGFzcyA9PSBudWxsID8gZmVhdHVyZUlEIDogZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXREVERDb250ZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RFRERW51bWVyYXRpb25UeXBlKCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUiA6Ci0JCQkJcmV0dXJuIGlzUGFyc2VFcnJvcigpID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQgOgotCQkJCXJldHVybiBnZXREVERDb250ZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERW51bWVyYXRpb25UeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudCgoU3RyaW5nKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUiA6Ci0JCQkJc2V0UGFyc2VFcnJvcigoKEJvb2xlYW4pIG5ld1ZhbHVlKS5ib29sZWFuVmFsdWUoKSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJZ2V0RFREQ29udGVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0RFREQ29udGVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0VOVU1FUkFUSU9OX1RZUEUgOgotCQkJCWdldERUREVudW1lcmF0aW9uVHlwZSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQgOgotCQkJCXNldENvbW1lbnQoQ09NTUVOVF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUiA6Ci0JCQkJc2V0UGFyc2VFcnJvcihQQVJTRV9FUlJPUl9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCA6Ci0JCQkJZ2V0RFREQ29udGVudCgpLmNsZWFyKCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSA6Ci0JCQkJZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0NPTU1FTlQgOgotCQkJCXJldHVybiBDT01NRU5UX0VERUZBVUxUID09IG51bGwgPyBjb21tZW50ICE9IG51bGwgOiAhQ09NTUVOVF9FREVGQVVMVC5lcXVhbHMoY29tbWVudCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SIDoKLQkJCQlyZXR1cm4gcGFyc2VFcnJvciAhPSBQQVJTRV9FUlJPUl9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQgOgotCQkJCXJldHVybiBkdGRDb250ZW50ICE9IG51bGwgJiYgIWdldERURENvbnRlbnQoKS5pc0VtcHR5KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFIDoKLQkJCQlyZXR1cm4gZHRkRW51bWVyYXRpb25UeXBlICE9IG51bGwgJiYgIWdldERUREVudW1lcmF0aW9uVHlwZSgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAoY29tbWVudDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChjb21tZW50KTsKLQkJcmVzdWx0LmFwcGVuZCgiLCBwYXJzZUVycm9yOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHBhcnNlRXJyb3IpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0gLy8gRFRERmlsZUltcGwKLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8KLQotLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotLy8gLy9wdWJsaWMgY2xhc3MgRFRERmlsZUltcGwgZXh0ZW5kcyBFTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzIERUREZpbGUsCi0vLyBFTmFtZXNwYWNlewotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLUdFTkVSSUNSVUxFUy5KU0VELS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBjb3B5cmlnaHQgPSAiKGMpIENvcHlyaWdodCBJQk0gQ29ycG9yYXRpb24KLS8vIDIwMDIuIjsKLS8vCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgQm9vbGVhbiBwYXJzZUVycm9yID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgZHRkQ29udGVudCA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIEVMaXN0IGR0ZEVudW1lcmF0aW9uVHlwZSA9IG51bGw7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldFBhcnNlRXJyb3IgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRU9iamVjdCBpbml0SW5zdGFuY2UoKSB7Ci0vLyBzZXRFTWV0YU9iaihlQ2xhc3NEVERGaWxlKCkpOwotLy8gaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLyByZXR1cm4gdGhpczsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFREUGFja2FnZSBlUGFja2FnZURURCgpIHsKLS8vIHJldHVybgotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RUREZpbGUoKSB7Ci0vLyByZXR1cm4KLS8vICgoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpKS5nZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0vLyBpZiAodGhpcy5zZXRDb21tZW50KSByZXR1cm4gdGhpcy5jb21tZW50OwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9Db21tZW50KCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9Db21tZW50KCksdGhpcy5jb21tZW50LHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldENvbW1lbnQoKSB7Ci0vLyBlTm90aWZ5KHJlZkJhc2ljVW5zZXRWYWx1ZShEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0NvbW1lbnQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0Q29tbWVudCgpIHsKLS8vIHJldHVybiBzZXRDb21tZW50OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIEJvb2xlYW4gZ2V0UGFyc2VFcnJvcigpIHsKLS8vIGlmICh0aGlzLnNldFBhcnNlRXJyb3IpIHJldHVybiB0aGlzLnBhcnNlRXJyb3I7Ci0vLyBlbHNlIHJldHVybgotLy8gKEJvb2xlYW4pRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9QYXJzZUVycm9yKCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1BhcnNlRXJyb3IoKSB7Ci0vLyBCb29sZWFuIHJlc3VsdCA9IGdldFBhcnNlRXJyb3IoKTsKLS8vIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdC5ib29sZWFuVmFsdWUoKSA6IGZhbHNlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFBhcnNlRXJyb3IoQm9vbGVhbiB2YWx1ZSkgewotLy8gcmVmU2V0VmFsdWVGb3JTaW1wbGVTRihEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKSx0aGlzLnBhcnNlRXJyb3IsdmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHNldFBhcnNlRXJyb3IoYm9vbGVhbiB2YWx1ZSkgewotLy8gc2V0UGFyc2VFcnJvcih2YWx1ZT9Cb29sZWFuLlRSVUU6Qm9vbGVhbi5GQUxTRSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRQYXJzZUVycm9yKCkgewotLy8gZU5vdGlmeShyZWZCYXNpY1Vuc2V0VmFsdWUoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9QYXJzZUVycm9yKCkpKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldFBhcnNlRXJyb3IoKSB7Ci0vLyByZXR1cm4gc2V0UGFyc2VFcnJvcjsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXREVERDb250ZW50KCkgewotLy8gaWYgKHRoaXMuZHRkQ29udGVudD09bnVsbCkgewotLy8gdGhpcy5kdGRDb250ZW50PW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0RURENvbnRlbnQoKSwKLS8vIHRydWUpOwotLy8gfQotLy8gcmV0dXJuIHRoaXMuZHRkQ29udGVudDsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBFTGlzdCBnZXREVERFbnVtZXJhdGlvblR5cGUoKSB7Ci0vLyBpZiAodGhpcy5kdGRFbnVtZXJhdGlvblR5cGU9PW51bGwpIHsKLS8vIHRoaXMuZHRkRW51bWVyYXRpb25UeXBlPW5ld0NvbGxlY3Rpb24odGhpcyxEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX0RUREVudW1lcmF0aW9uVHlwZSgpLAotLy8gdHJ1ZSk7Ci0vLyB9Ci0vLyByZXR1cm4gdGhpcy5kdGRFbnVtZXJhdGlvblR5cGU7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVHZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiByZXR1cm4gZ2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjogcmV0dXJuIGdldFBhcnNlRXJyb3IoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQ6IHJldHVybiBnZXREVERDb250ZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9FTlVNRVJBVElPTl9UWVBFOiByZXR1cm4KLS8vIGdldERUREVudW1lcmF0aW9uVHlwZSgpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgcmVmQmFzaWNWYWx1ZShFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1ZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERGaWxlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVDoKLS8vIHJldHVybiB0aGlzLnNldENvbW1lbnQ/IHRoaXMuY29tbWVudCA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOgotLy8gcmV0dXJuIHRoaXMuc2V0UGFyc2VFcnJvcj8gdGhpcy5wYXJzZUVycm9yIDogbnVsbDsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fRFREX0NPTlRFTlQ6Ci0vLyByZXR1cm4gdGhpcy5kdGRDb250ZW50OwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRToKLS8vIHJldHVybiB0aGlzLmR0ZEVudW1lcmF0aW9uVHlwZTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERGaWxlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVDogcmV0dXJuIGlzU2V0Q29tbWVudCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjogcmV0dXJuIGlzU2V0UGFyc2VFcnJvcigpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiB7Ci0vLyBzZXRDb21tZW50KChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjogewotLy8gc2V0UGFyc2VFcnJvcigobmV3VmFsdWUgaW5zdGFuY2VvZgotLy8gU3RyaW5nKT9Cb29sZWFuLnZhbHVlT2YoKFN0cmluZyluZXdWYWx1ZSk6KEJvb2xlYW4pbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLS8vIH0KLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gZUJhc2ljU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0vLyB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RUREZpbGUoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRDb21tZW50ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9Db21tZW50KCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFX19QQVJTRV9FUlJPUjogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wYXJzZUVycm9yOwotLy8gdGhpcy5wYXJzZUVycm9yID0gKEJvb2xlYW4pbmV3VmFsdWU7Ci0vLyB0aGlzLnNldFBhcnNlRXJyb3IgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERGaWxlX1BhcnNlRXJyb3IoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERGaWxlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVDogewotLy8gdW5zZXRDb21tZW50KCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiB7Ci0vLyB1bnNldFBhcnNlRXJyb3IoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lVW5zZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIE5vdGlmaWNhdGlvbiByZWZCYXNpY1Vuc2V0VmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERGaWxlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfRklMRV9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gbnVsbDsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREZpbGVfQ29tbWVudCgpLG9sZFZhbHVlLGdldENvbW1lbnQoKSk7Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX0ZJTEVfX1BBUlNFX0VSUk9SOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnBhcnNlRXJyb3I7Ci0vLyB0aGlzLnBhcnNlRXJyb3IgPSBudWxsOwotLy8gdGhpcy5zZXRQYXJzZUVycm9yID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRERmlsZV9QYXJzZUVycm9yKCksb2xkVmFsdWUsZ2V0UGFyc2VFcnJvcigpKTsKLS8vIH0KLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNVbnNldFZhbHVlKGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0vLyBTdHJpbmcgb3V0PSIoIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIGJvb2xlYW4gZmlyc3Q9dHJ1ZTsKLS8vIGJvb2xlYW4gZW1wdHlMaXN0PXRydWU7Ci0vLyBpZihpc1NldENvbW1lbnQoKSkgewotLy8gaWYoIWVtcHR5TGlzdCkgb3V0Kz0iLCAiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gb3V0Kz0iY29tbWVudDogIit0aGlzLmNvbW1lbnQ7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBmaXJzdD1mYWxzZTsKLS8vIGVtcHR5TGlzdD1mYWxzZTsKLS8vIH0KLS8vIGlmKGlzU2V0UGFyc2VFcnJvcigpKSB7Ci0vLyBpZighZW1wdHlMaXN0KSBvdXQrPSIsICI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0vLyBvdXQrPSJwYXJzZUVycm9yOiAiK3RoaXMucGFyc2VFcnJvcjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLS8vIGZpcnN0PWZhbHNlOwotLy8gZW1wdHlMaXN0PWZhbHNlOwotLy8gfQotLy8gb3V0Kz0iKSI7Ci0vLyBpZiAoIWZpcnN0KSByZXR1cm4gc3VwZXIudG9TdHJpbmcoKSArICIgIiArb3V0OyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotLy8gcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0vLyB9Ci0vLyB9Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRER3JvdXBDb250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREdyb3VwQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwMTFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRER3JvdXBDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdENvbnRhaW5tZW50V2l0aEludmVyc2VFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5JbnRlcm5hbEVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQcmludGVyOwotCi0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFRER3JvdXBDb250ZW50SW1wbCBleHRlbmRzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBpbXBsZW1lbnRzIERUREdyb3VwQ29udGVudCB7Ci0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldEdyb3VwS2luZCgpIDxlbT5Hcm91cCBLaW5kPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0R3JvdXBLaW5kKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIERUREdyb3VwS2luZCBHUk9VUF9LSU5EX0VERUZBVUxUID0gRFRER3JvdXBLaW5kLlNFUVVFTkNFX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRER3JvdXBLaW5kIGdyb3VwS2luZCA9IEdST1VQX0tJTkRfRURFRkFVTFQ7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHJvdGVjdGVkIEVMaXN0IGNvbnRlbnQgPSBudWxsOwotCi0JcHVibGljIERUREdyb3VwQ29udGVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRER3JvdXBDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50UG9zaXRpb24oRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQlFTGlzdCBsaXN0ID0gZ2V0Q29udGVudCgpOwotCQlyZXR1cm4gbGlzdC5pbmRleE9mKGNvbnRlbnQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudERldGFpbCgpIHsKLQkJRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIoZmFsc2UpOwotCQlwcmludGVyLnZpc2l0RFRER3JvdXBDb250ZW50KHRoaXMpOwotCi0JCXJldHVybiBwcmludGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0JICovCi0JcHVibGljIERUREdyb3VwS2luZCBnZXRHcm91cEtpbmQoKSB7Ci0JCXJldHVybiBncm91cEtpbmQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEdyb3VwS2luZChEVERHcm91cEtpbmQgbmV3R3JvdXBLaW5kKSB7Ci0JCURUREdyb3VwS2luZCBvbGRHcm91cEtpbmQgPSBncm91cEtpbmQ7Ci0JCWdyb3VwS2luZCA9IG5ld0dyb3VwS2luZCA9PSBudWxsID8gR1JPVVBfS0lORF9FREVGQVVMVCA6IG5ld0dyb3VwS2luZDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVBfS0lORCwgb2xkR3JvdXBLaW5kLCBncm91cEtpbmQpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBFTGlzdCBnZXRDb250ZW50KCkgewotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQljb250ZW50ID0gbmV3IEVPYmplY3RDb250YWlubWVudFdpdGhJbnZlcnNlRUxpc3QoRFRERWxlbWVudENvbnRlbnQuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERURFBhY2thZ2UuRFREX0VMRU1FTlRfQ09OVEVOVF9fR1JPVVApOwotCQl9Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDb250ZW50KCkpLmJhc2ljQWRkKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCQlyZXR1cm4gKChJbnRlcm5hbEVMaXN0KSBnZXRDb250ZW50KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCwgRFRER3JvdXBDb250ZW50LmNsYXNzLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBnZXRHcm91cEtpbmQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGdldENvbnRlbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBvY2N1cnJlbmNlICE9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQgOgotCQkJCXJldHVybiBncm91cEtpbmQgIT0gR1JPVVBfS0lORF9FREVGQVVMVDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCA6Ci0JCQkJcmV0dXJuIGNvbnRlbnQgIT0gbnVsbCAmJiAhZ2V0Q29udGVudCgpLmlzRW1wdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fR1JPVVAgOgotCQkJCXNldEdyb3VwKChEVERHcm91cENvbnRlbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoKERURE9jY3VycmVuY2VUeXBlKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EIDoKLQkJCQlzZXRHcm91cEtpbmQoKERUREdyb3VwS2luZCkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fQ09OVEVOVCA6Ci0JCQkJZ2V0Q29udGVudCgpLmNsZWFyKCk7Ci0JCQkJZ2V0Q29udGVudCgpLmFkZEFsbCgoQ29sbGVjdGlvbikgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfR1JPVVBfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZShPQ0NVUlJFTkNFX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0dST1VQX0tJTkQgOgotCQkJCXNldEdyb3VwS2luZChHUk9VUF9LSU5EX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQgOgotCQkJCWdldENvbnRlbnQoKS5jbGVhcigpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGdyb3VwS2luZDogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChncm91cEtpbmQpOwotCQlyZXN1bHQuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERJZEhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURElkSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDcwMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURElkSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci0KLXB1YmxpYyBjbGFzcyBEVERJZEhlbHBlciB7Ci0JcHVibGljIERURElkSGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUNvbnRlbnRJZChEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JCVN0cmluZyBpZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCWlkID0gIiNQQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJaWQgPSAiI0VNUFRZIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJaWQgPSAiIyIgKyAoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRSZWZlcmVuY2VkRWxlbWVudCgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCkuZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKS5nZXROYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KSB7Ci0JCQlpZCA9IGNvbXB1dGVHcm91cElkKChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVHcm91cElkKERUREdyb3VwQ29udGVudCBncnApIHsKLQkJU3RyaW5nIGdyb3VwSWQgPSAiXyI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGdyb3VwSWQ7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZUNvbnRlbnRJZEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJU3RyaW5nIGlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbXB0eUNvbnRlbnQpIHsKLQkJCWlkID0gIiNFTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJaWQgPSAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQlpZCA9ICIjRU1QVFkiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlpZCA9ICIjIiArICgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpLmdldFJlZmVyZW5jZWRFbGVtZW50KCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCWlkID0gIiMiICsgKChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KS5nZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpLmdldE5hbWUoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCWlkID0gY29tcHV0ZUdyb3VwSWQoKERUREdyb3VwQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVHcm91cElkR2VuKERUREdyb3VwQ29udGVudCBncnApIHsKLQotCQlTdHJpbmcgZ3JvdXBJZCA9ICJfIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZ3JvdXBJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRESW50ZXJuYWxFbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMjAwZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RUREludGVybmFsRW50aXR5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnRleHQuQ2hhcmFjdGVySXRlcmF0b3I7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5TdHJpbmdDaGFyYWN0ZXJJdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FTm90aWZpY2F0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLQotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERUREludGVybmFsRW50aXR5SW1wbCBleHRlbmRzIERUREVudGl0eUNvbnRlbnRJbXBsIGltcGxlbWVudHMgRFRESW50ZXJuYWxFbnRpdHkgewotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRWYWx1ZSgpIDxlbT5WYWx1ZTwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFZhbHVlKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9FREVGQVVMVCA9IG51bGw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHZhbHVlID0gVkFMVUVfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRFRESW50ZXJuYWxFbnRpdHlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERUREludGVybmFsRW50aXR5KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDY0KTsKLQkJaWYgKGdldFZhbHVlKCkgPT0gbnVsbCkKLQkJCXNiLmFwcGVuZCgiXCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJcIiIpLmFwcGVuZChyZXBsYWNlRG91YmxlUXVvdGVzKGdldFZhbHVlKCkpKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8vIHRoaXMgbWV0aG9kIHJlcGxhY2VzIGFueSBvY2N1cnJlbmNlIG9mICcgIiAnIHdpdGggdGhlIGVxdWl2YWxlbnQgdmFsdWUKLQkvLyBvZiAmIzM0OwotCXByaXZhdGUgU3RyaW5nIHJlcGxhY2VEb3VibGVRdW90ZXMoU3RyaW5nIGlucHV0KSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdWYWx1ZSA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlTdHJpbmdDaGFyYWN0ZXJJdGVyYXRvciBjaGFyYWN0ZXJzID0gbmV3IFN0cmluZ0NoYXJhY3Rlckl0ZXJhdG9yKGlucHV0KTsKLQotCQl3aGlsZSAoY2hhcmFjdGVycy5jdXJyZW50KCkgIT0gQ2hhcmFjdGVySXRlcmF0b3IuRE9ORSkgewotCQkJY2hhciBjdXJyZW50ID0gY2hhcmFjdGVycy5jdXJyZW50KCk7Ci0KLQkJCWlmIChjdXJyZW50ID09ICciJykgewotCQkJCW5ld1ZhbHVlLmFwcGVuZCgiJiMzNDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3VmFsdWUuYXBwZW5kKGN1cnJlbnQpOwotCQkJfQotCQkJY2hhcmFjdGVycy5uZXh0KCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3VmFsdWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmV3VmFsdWUpIHsKLQkJU3RyaW5nIG9sZFZhbHVlID0gdmFsdWU7Ci0JCXZhbHVlID0gbmV3VmFsdWU7Ci0JCWlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUsIG9sZFZhbHVlLCB2YWx1ZSkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUludmVyc2VBZGQoSW50ZXJuYWxFT2JqZWN0IG90aGVyRW5kLCBpbnQgZmVhdHVyZUlELCBDbGFzcyBiYXNlQ2xhc3MsIE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fQ09OVEVOVCwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA6Ci0JCQkJcmV0dXJuIGdldFZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX0RURF9FTlRJVFkgOgotCQkJCXJldHVybiBnZXREVERFbnRpdHkoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9JTlRFUk5BTF9FTlRJVFlfX1ZBTFVFIDoKLQkJCQlyZXR1cm4gVkFMVUVfRURFRkFVTFQgPT0gbnVsbCA/IHZhbHVlICE9IG51bGwgOiAhVkFMVUVfRURFRkFVTFQuZXF1YWxzKHZhbHVlKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNJc1NldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIE9iamVjdCBuZXdWYWx1ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19EVERfRU5USVRZIDoKLQkJCQlzZXREVERFbnRpdHkoKERUREVudGl0eSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA6Ci0JCQkJc2V0VmFsdWUoKFN0cmluZykgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1NldChlRmVhdHVyZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWV9fRFREX0VOVElUWSA6Ci0JCQkJc2V0RFRERW50aXR5KChEVERFbnRpdHkpIG51bGwpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfSU5URVJOQUxfRU5USVRZX19WQUxVRSA6Ci0JCQkJc2V0VmFsdWUoVkFMVUVfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKHZhbHVlOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHZhbHVlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRETm90YXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFRETm90YXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZTMyMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURE5vdGF0aW9uSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb25DaGFpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuSW50ZXJuYWxFTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERMZXhpY2FsSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUGF0aG5hbWVVdGlsOwotCi0KLS8qKgotICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPk5vdGF0aW9uPC9iPjwvZW0+Jy4KLSAqIDwhLS0gZW5kLXVzZXItZG9jIC0tPgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIGZlYXR1cmVzIGFyZSBpbXBsZW1lbnRlZDoKLSAqIDx1bD4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURE5vdGF0aW9uSW1wbCNnZXRDb21tZW50IDxlbT5Db21tZW50PC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURE5vdGF0aW9uSW1wbCNnZXRTeXN0ZW1JRCA8ZW0+U3lzdGVtIElEPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURE5vdGF0aW9uSW1wbCNnZXRQdWJsaWNJRCA8ZW0+UHVibGljIElEPC9lbT59PC9saT4KLSAqIDxsaT57QGxpbmsgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbnRlcm5hbC5pbXBsLkRURE5vdGF0aW9uSW1wbCNnZXRFbnRpdHkgPGVtPkVudGl0eTwvZW0+fTwvbGk+Ci0gKiA8L3VsPgotICogPC9wPgotICogCi0gKiBAZ2VuZXJhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBEVEROb3RhdGlvbkltcGwgZXh0ZW5kcyBEVERDb250ZW50SW1wbCBpbXBsZW1lbnRzIERURE5vdGF0aW9uLCBEVERDb250ZW50IHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGF0aG5hbWUoKSB7Ci0JCXJldHVybiBEVERQYXRobmFtZVV0aWwubWFrZVBhdGgobnVsbCwgIk5vdGEiLCBnZXROYW1lKCksIC0xKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldENvbW1lbnQoKSA8ZW0+Q29tbWVudDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldENvbW1lbnQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0Q29tbWVudCgpIDxlbT5Db21tZW50PC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0Q29tbWVudCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gQ09NTUVOVF9FREVGQVVMVDsKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRTeXN0ZW1JRCgpIDxlbT5TeXN0ZW0gSUQ8L2VtPn0nCi0JICogYXR0cmlidXRlLiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRTeXN0ZW1JRCgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEX0VERUZBVUxUID0gbnVsbDsKLQotCS8qKgotCSAqIFRoZSBjYWNoZWQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFN5c3RlbUlEKCkgPGVtPlN5c3RlbSBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFN5c3RlbUlEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlEID0gU1lTVEVNX0lEX0VERUZBVUxUOwotCi0JLyoqCi0JICogVGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlICd7QGxpbmsgI2dldFB1YmxpY0lEKCkgPGVtPlB1YmxpYyBJRDwvZW0+fScKLQkgKiBhdHRyaWJ1dGUuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2dldFB1YmxpY0lEKCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQVUJMSUNfSURfRURFRkFVTFQgPSBudWxsOwotCi0JLyoqCi0JICogVGhlIGNhY2hlZCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0UHVibGljSUQoKSA8ZW0+UHVibGljIElEPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0UHVibGljSUQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSUQgPSBQVUJMSUNfSURfRURFRkFVTFQ7Ci0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHkoKSA8ZW0+RW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZSBsaXN0LiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAc2VlICNnZXRFbnRpdHkoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKiBAb3JkZXJlZAotCSAqLwotCXByb3RlY3RlZCBFTGlzdCBlbnRpdHkgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVEROb3RhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgewotCQlyZXR1cm4gY29tbWVudDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgbmV3Q29tbWVudCkgewotCQlTdHJpbmcgb2xkQ29tbWVudCA9IGNvbW1lbnQ7Ci0JCWNvbW1lbnQgPSBuZXdDb21tZW50OwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCwgb2xkQ29tbWVudCwgY29tbWVudCkpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotCQlyZXR1cm4gc3lzdGVtSUQ7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlEKFN0cmluZyBuZXdTeXN0ZW1JRCkgewotCQlTdHJpbmcgb2xkU3lzdGVtSUQgPSBzeXN0ZW1JRDsKLQkJc3lzdGVtSUQgPSBuZXdTeXN0ZW1JRDsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKQotCQkJZU5vdGlmeShuZXcgRU5vdGlmaWNhdGlvbkltcGwodGhpcywgTm90aWZpY2F0aW9uLlNFVCwgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRCwgb2xkU3lzdGVtSUQsIHN5c3RlbUlEKSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSUQoKSB7Ci0JCXJldHVybiBwdWJsaWNJRDsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSUQoU3RyaW5nIG5ld1B1YmxpY0lEKSB7Ci0JCVN0cmluZyBvbGRQdWJsaWNJRCA9IHB1YmxpY0lEOwotCQlwdWJsaWNJRCA9IG5ld1B1YmxpY0lEOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lELCBvbGRQdWJsaWNJRCwgcHVibGljSUQpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVMaXN0IGdldEVudGl0eSgpIHsKLQkJaWYgKGVudGl0eSA9PSBudWxsKSB7Ci0JCQllbnRpdHkgPSBuZXcgRU9iamVjdFdpdGhJbnZlcnNlUmVzb2x2aW5nRUxpc3QoRFRERXh0ZXJuYWxFbnRpdHkuY2xhc3MsIHRoaXMsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFksIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWV9fTk9UQVRJT04pOwotCQl9Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSA6Ci0JCQkJCXJldHVybiAoKEludGVybmFsRUxpc3QpIGdldEVudGl0eSgpKS5iYXNpY0FkZChvdGhlckVuZCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZIDoKLQkJCQkJcmV0dXJuICgoSW50ZXJuYWxFTGlzdCkgZ2V0RW50aXR5KCkpLmJhc2ljUmVtb3ZlKG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0ZJTEVfX0RURF9DT05URU5ULCBEVERGaWxlLmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXJldHVybiBnZXREVERGaWxlKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UIDoKLQkJCQlyZXR1cm4gZ2V0Q29tbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEIDoKLQkJCQlyZXR1cm4gZ2V0U3lzdGVtSUQoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCA6Ci0JCQkJcmV0dXJuIGdldFB1YmxpY0lEKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCXJldHVybiBnZXRFbnRpdHkoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRFREX0ZJTEUgOgotCQkJCXNldERUREZpbGUoKERUREZpbGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UIDoKLQkJCQlzZXRDb21tZW50KChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQgOgotCQkJCXNldFN5c3RlbUlEKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQgOgotCQkJCXNldFB1YmxpY0lEKChTdHJpbmcpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFkgOgotCQkJCWdldEVudGl0eSgpLmNsZWFyKCk7Ci0JCQkJZ2V0RW50aXR5KCkuYWRkQWxsKChDb2xsZWN0aW9uKSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljU2V0KGVGZWF0dXJlLCBuZXdWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVVbnNldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJc2V0Q29tbWVudChDT01NRU5UX0VERUZBVUxUKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQgOgotCQkJCXNldFN5c3RlbUlEKFNZU1RFTV9JRF9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEIDoKLQkJCQlzZXRQdWJsaWNJRChQVUJMSUNfSURfRURFRkFVTFQpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSA6Ci0JCQkJZ2V0RW50aXR5KCkuY2xlYXIoKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVCA6Ci0JCQkJcmV0dXJuIENPTU1FTlRfRURFRkFVTFQgPT0gbnVsbCA/IGNvbW1lbnQgIT0gbnVsbCA6ICFDT01NRU5UX0VERUZBVUxULmVxdWFscyhjb21tZW50KTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRCA6Ci0JCQkJcmV0dXJuIFNZU1RFTV9JRF9FREVGQVVMVCA9PSBudWxsID8gc3lzdGVtSUQgIT0gbnVsbCA6ICFTWVNURU1fSURfRURFRkFVTFQuZXF1YWxzKHN5c3RlbUlEKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRCA6Ci0JCQkJcmV0dXJuIFBVQkxJQ19JRF9FREVGQVVMVCA9PSBudWxsID8gcHVibGljSUQgIT0gbnVsbCA6ICFQVUJMSUNfSURfRURFRkFVTFQuZXF1YWxzKHB1YmxpY0lEKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0VOVElUWSA6Ci0JCQkJcmV0dXJuIGVudGl0eSAhPSBudWxsICYmICFnZXRFbnRpdHkoKS5pc0VtcHR5KCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlpZiAoZUlzUHJveHkoKSkKLQkJCXJldHVybiBzdXBlci50b1N0cmluZygpOwotCi0JCVN0cmluZ0J1ZmZlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHN1cGVyLnRvU3RyaW5nKCkpOwotCQlyZXN1bHQuYXBwZW5kKCIgKGNvbW1lbnQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoY29tbWVudCk7Ci0JCXJlc3VsdC5hcHBlbmQoIiwgc3lzdGVtSUQ6ICIpOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdC5hcHBlbmQoc3lzdGVtSUQpOwotCQlyZXN1bHQuYXBwZW5kKCIsIHB1YmxpY0lEOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQuYXBwZW5kKHB1YmxpY0lEKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi19IC8vIERURE5vdGF0aW9uSW1wbAotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLwotCi0vLyArKysrKysrKysrKysrKysrKysrR0VORVJJQ1JVTEVTLkpTRUQrKysrKysrKysrKysrKysrKysrCi0vLyAvL3B1YmxpYyBjbGFzcyBEVEROb3RhdGlvbkltcGwgZXh0ZW5kcyBFTmFtZXNwYWNlSW1wbCBpbXBsZW1lbnRzCi0vLyBEVEROb3RhdGlvbiwgRU5hbWVzcGFjZSwgRFREQ29udGVudHsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29weXJpZ2h0ID0gIihjKSBDb3B5cmlnaHQgSUJNIENvcnBvcmF0aW9uCi0vLyAyMDAyLiI7Ci0vLwotLy8gcHVibGljIERURE5vdGF0aW9uSW1wbCgpCi0vLyB7Ci0vLyBzdXBlcigpOwotLy8gfQotLy8gcHVibGljIFN0cmluZyBnZXRQYXRobmFtZSgpCi0vLyB7Ci0vLyByZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJOb3RhIiwgZ2V0TmFtZSgpLCAtMSk7Ci0vLyB9Ci0vLwotLy8gcHVibGljIERURE9iamVjdCBmaW5kT2JqZWN0KFN0cmluZyByZWxhdGl2ZVBhdGgpCi0vLyB7Ci0vLyByZXR1cm4gbnVsbDsKLS8vIH0KLS8vCi0vLyAvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotLy8gLy8gV291bGQgcmF0aGVyIGhhdmUgYWxsIHRoaXMgc3R1ZmYgaW4gYSBiYXNlIGNsYXNzIGJ1dCB0aGVzZQotLy8gLy8gY2xhc3NlcyBhcmUgaW5oZXJpdGluZyBmcm9tIHNvbWV0aW1lcyBkaWZmZXJlbnQgbW9mIGNsYXNzZXMKLS8vIERURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIHN5c3RlbUlEID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lEID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRUxpc3QgZW50aXR5ID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRDb21tZW50ID0gZmFsc2U7Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2V0U3lzdGVtSUQgPSBmYWxzZTsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgYm9vbGVhbiBzZXRQdWJsaWNJRCA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByaXZhdGUgRFREQ29udGVudEltcGwgZHRkQ29udGVudERlbGVnYXRlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBHZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotLy8gKiBAcmV0dXJuIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotLy8gKi8KLS8vIHB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKQotLy8gewotLy8gcmV0dXJuIGxleEluZm8uZ2V0U3RhcnRPZmZzZXQoKTsKLS8vIH0KLS8vICAKLS8vIC8qKgotLy8gKiBTZXQgdGhlIHZhbHVlIG9mIHN0YXJ0T2Zmc2V0LgotLy8gKiBAcGFyYW0gdiBWYWx1ZSB0byBhc3NpZ24gdG8gc3RhcnRPZmZzZXQuCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0U3RhcnRPZmZzZXQoaW50IHYpCi0vLyB7Ci0vLyBsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotLy8gfQotLy8gIAotLy8gLyoqCi0vLyAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotLy8gKiBAcmV0dXJuIHZhbHVlIG9mIGVuZE9mZnNldC4KLS8vICovCi0vLyBwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpCi0vLyB7Ci0vLyByZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLS8vIH0KLS8vICAKLS8vIC8qKgotLy8gKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLS8vICogQHBhcmFtIHYgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpCi0vLyB7Ci0vLyBsZXhJbmZvLnNldEVuZE9mZnNldCh2KTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRU9iamVjdCBpbml0SW5zdGFuY2UoKSB7Ci0vLyBzZXRFTWV0YU9iaihlQ2xhc3NEVEROb3RhdGlvbigpKTsKLS8vIGluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8gcmV0dXJuIHRoaXM7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIHZvaWQgaW5pdEluc3RhbmNlRGVsZWdhdGVzKCkgewotLy8gc3VwZXIuaW5pdEluc3RhbmNlRGVsZWdhdGVzKCk7Ci0vLwotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkucmVmU2V0RGVsZWdhdGVPd25lcih0aGlzKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFREUGFja2FnZSBlUGFja2FnZURURCgpIHsKLS8vIHJldHVybgotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RURE5vdGF0aW9uKCkgewotLy8gcmV0dXJuCi0vLyAoKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKSkuZ2V0RFRETm90YXRpb24oKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbgotLy8gKi8KLS8vIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLS8vIGlmICh0aGlzLnNldENvbW1lbnQpIHJldHVybiB0aGlzLmNvbW1lbnQ7Ci0vLyBlbHNlIHJldHVybgotLy8gKFN0cmluZylEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVEROb3RhdGlvbl9Db21tZW50KCkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLHRoaXMuY29tbWVudCx2YWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgdW5zZXRDb21tZW50KCkgewotLy8gZU5vdGlmeShyZWZCYXNpY1Vuc2V0VmFsdWUoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fQ29tbWVudCgpKSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRDb21tZW50KCkgewotLy8gcmV0dXJuIHNldENvbW1lbnQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlEKCkgewotLy8gaWYgKHRoaXMuc2V0U3lzdGVtSUQpIHJldHVybiB0aGlzLnN5c3RlbUlEOwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSx0aGlzLnN5c3RlbUlELHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldFN5c3RlbUlEKCkgewotLy8gZU5vdGlmeShyZWZCYXNpY1Vuc2V0VmFsdWUoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0U3lzdGVtSUQoKSB7Ci0vLyByZXR1cm4gc2V0U3lzdGVtSUQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotLy8gaWYgKHRoaXMuc2V0UHVibGljSUQpIHJldHVybiB0aGlzLnB1YmxpY0lEOwotLy8gZWxzZSByZXR1cm4KLS8vIChTdHJpbmcpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fUHVibGljSUQoKS5nZXREZWZhdWx0VmFsdWUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRQdWJsaWNJRChTdHJpbmcgdmFsdWUpIHsKLS8vIHJlZlNldFZhbHVlRm9yU2ltcGxlU0YoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fUHVibGljSUQoKSx0aGlzLnB1YmxpY0lELHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldFB1YmxpY0lEKCkgewotLy8gZU5vdGlmeShyZWZCYXNpY1Vuc2V0VmFsdWUoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fUHVibGljSUQoKSkpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0UHVibGljSUQoKSB7Ci0vLyByZXR1cm4gc2V0UHVibGljSUQ7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLS8vICovCi0vLyBwdWJsaWMgRUxpc3QgZ2V0RW50aXR5KCkgewotLy8gaWYgKHRoaXMuZW50aXR5PT1udWxsKSB7Ci0vLyB0aGlzLmVudGl0eT1uZXdDb2xsZWN0aW9uKHRoaXMsRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fRW50aXR5KCksCi0vLyB0cnVlKTsKLS8vIH0KLS8vIHJldHVybiB0aGlzLmVudGl0eTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IGVHZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogcmV0dXJuIGdldENvbW1lbnQoKTsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogcmV0dXJuIGdldFN5c3RlbUlEKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHJldHVybiBnZXRQdWJsaWNJRCgpOwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fRU5USVRZOiByZXR1cm4gZ2V0RW50aXR5KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRTogcmV0dXJuIGdldERUREZpbGUoKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IHJlZkJhc2ljVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDoKLS8vIHJldHVybiB0aGlzLnNldENvbW1lbnQ/IHRoaXMuY29tbWVudCA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6Ci0vLyByZXR1cm4gdGhpcy5zZXRTeXN0ZW1JRD8gdGhpcy5zeXN0ZW1JRCA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6Ci0vLyByZXR1cm4gdGhpcy5zZXRQdWJsaWNJRD8gdGhpcy5wdWJsaWNJRCA6IG51bGw7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19FTlRJVFk6Ci0vLyByZXR1cm4gdGhpcy5lbnRpdHk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRTogcmV0dXJuCi0vLyAoKEludGVybmFsRU9iamVjdClnZXREdGRDb250ZW50RGVsZWdhdGUoKSkucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiByZXR1cm4gaXNTZXRDb21tZW50KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHJldHVybiBpc1NldFN5c3RlbUlEKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19QVUJMSUNfSUQ6IHJldHVybiBpc1NldFB1YmxpY0lEKCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRTogcmV0dXJuIGlzU2V0RFRERmlsZSgpOwotLy8KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURE5vdGF0aW9uKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0NPTU1FTlQ6IHsKLS8vIHNldENvbW1lbnQoKFN0cmluZyluZXdWYWx1ZSk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19TWVNURU1fSUQ6IHsKLS8vIHNldFN5c3RlbUlEKChTdHJpbmcpbmV3VmFsdWUpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiB7Ci0vLyBzZXRQdWJsaWNJRCgoU3RyaW5nKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX0RURF9GSUxFOiB7Ci0vLyBzZXREVERGaWxlKChEVERGaWxlKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0vLyB9Ci0vLyBzdXBlci5lU2V0KGZlYXR1cmUsIG5ld1ZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgTm90aWZpY2F0aW9uIGVCYXNpY1NldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKQotLy8gewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lQmFzaWNTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLmNvbW1lbnQ7Ci0vLyB0aGlzLmNvbW1lbnQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRDb21tZW50ID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLG9sZFZhbHVlLG5ld1ZhbHVlKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5zeXN0ZW1JRDsKLS8vIHRoaXMuc3lzdGVtSUQgPSAoU3RyaW5nKW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRTeXN0ZW1JRCA9IHRydWU7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1N5c3RlbUlEKCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnB1YmxpY0lEOwotLy8gdGhpcy5wdWJsaWNJRCA9IChTdHJpbmcpbmV3VmFsdWU7Ci0vLyB0aGlzLnNldFB1YmxpY0lEID0gdHJ1ZTsKLS8vIHJldHVybiBuZXcKLS8vIEVOb3RpZmljYXRpb25JbXBsKChJbnRlcm5hbEVPYmplY3QpdGhpcyxOb3RpZmljYXRpb24uU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fUHVibGljSUQoKSxvbGRWYWx1ZSxuZXdWYWx1ZSk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVEROb3RhdGlvbigpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19DT01NRU5UOiB7Ci0vLyB1bnNldENvbW1lbnQoKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1NZU1RFTV9JRDogewotLy8gdW5zZXRTeXN0ZW1JRCgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fUFVCTElDX0lEOiB7Ci0vLyB1bnNldFB1YmxpY0lEKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX05PVEFUSU9OX19EVERfRklMRTogewotLy8gdW5zZXREVERGaWxlKCk7Ci0vLyByZXR1cm47Ci0vLyB9Ci0vLwotLy8gfQotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gcmVmQmFzaWNVbnNldFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFRETm90YXRpb24oKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fQ09NTUVOVDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5jb21tZW50OwotLy8gdGhpcy5jb21tZW50ID0gbnVsbDsKLS8vIHRoaXMuc2V0Q29tbWVudCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX0NvbW1lbnQoKSxvbGRWYWx1ZSxnZXRDb21tZW50KCkpOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTl9fU1lTVEVNX0lEOiB7Ci0vLyBPYmplY3Qgb2xkVmFsdWUgPSB0aGlzLnN5c3RlbUlEOwotLy8gdGhpcy5zeXN0ZW1JRCA9IG51bGw7Ci0vLyB0aGlzLnNldFN5c3RlbUlEID0gZmFsc2U7Ci0vLyByZXR1cm4gbmV3Ci0vLyBFTm90aWZpY2F0aW9uSW1wbCgoSW50ZXJuYWxFT2JqZWN0KXRoaXMsTm90aWZpY2F0aW9uLlVOU0VULChFU3RydWN0dXJhbEZlYXR1cmUpRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSxvbGRWYWx1ZSxnZXRTeXN0ZW1JRCgpKTsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfTk9UQVRJT05fX1BVQkxJQ19JRDogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5wdWJsaWNJRDsKLS8vIHRoaXMucHVibGljSUQgPSBudWxsOwotLy8gdGhpcy5zZXRQdWJsaWNJRCA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURE5vdGF0aW9uX1B1YmxpY0lEKCksb2xkVmFsdWUsZ2V0UHVibGljSUQoKSk7Ci0vLyB9Ci0vLwotLy8gfQotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwcm90ZWN0ZWQgRFREQ29udGVudEltcGwgZ2V0RHRkQ29udGVudERlbGVnYXRlKCkgewotLy8gaWYgKGR0ZENvbnRlbnREZWxlZ2F0ZSA9PSBudWxsKSB7Ci0vLyBEVERQYWNrYWdlIHBrZyA9Ci0vLyAoRFREUGFja2FnZSlFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShEVERQYWNrYWdlLmVOU19VUkkpOwotLy8gZHRkQ29udGVudERlbGVnYXRlPShEVERDb250ZW50SW1wbClwa2cuZUNyZWF0ZUluc3RhbmNlKHBrZy5EVERfQ09OVEVOVCk7Ci0vLyBkdGRDb250ZW50RGVsZWdhdGUuaW5pdEluc3RhbmNlKCk7Ci0vLyB9Ci0vLyByZXR1cm4gZHRkQ29udGVudERlbGVnYXRlOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBFQ2xhc3MgZUNsYXNzRFREQ29udGVudCgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5lQ2xhc3MoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotLy8gcmV0dXJuIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLmdldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXREVERGaWxlKERUREZpbGUgdmFsdWUpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnNldERUREZpbGUodmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0RFRERmlsZSgpIHsKLS8vIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpLnVuc2V0RFRERmlsZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBib29sZWFuIGlzU2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5pc1NldERUREZpbGUoKTsKLS8vIH0KLS8vIH0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBDRGF0YUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUENEYXRhQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0MGY1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUENEYXRhQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci0KLS8qKgotICogQGdlbmVyYXRlZAotICovCi1wdWJsaWMgY2xhc3MgRFREUENEYXRhQ29udGVudEltcGwgZXh0ZW5kcyBEVERFbGVtZW50Q29udGVudEltcGwgaW1wbGVtZW50cyBEVERQQ0RhdGFDb250ZW50IHsKLQotCXB1YmxpYyBEVERQQ0RhdGFDb250ZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEVDbGFzcyBlU3RhdGljQ2xhc3MoKSB7Ci0JCXJldHVybiBEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQQ0RhdGFDb250ZW50KCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCwgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VBZGQob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlpZiAoZUNvbnRhaW5lciAhPSBudWxsKQotCQkJbXNncyA9IGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIobXNncyk7Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIob3RoZXJFbmQsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZVJlbW92ZShJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoYmFzZUNsYXNzID09IG51bGwgPyBmZWF0dXJlSUQgOiBlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZVJlbW92ZShvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVCYXNpY1JlbW92ZUZyb21Db250YWluZXIoTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZUNvbnRhaW5lckZlYXR1cmVJRCA+PSAwKSB7Ci0JCQlzd2l0Y2ggKGVDb250YWluZXJGZWF0dXJlSUQpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UX19DT05URU5ULCBEVERHcm91cENvbnRlbnQuY2xhc3MsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVDb250YWluZXIuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRUxFTUVOVF9fQ09OVEVOVCwgRFRERWxlbWVudC5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCk7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BDX0RBVEFfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJcmV0dXJuIGdldEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gZUR5bmFtaWNHZXQoZUZlYXR1cmUsIHJlc29sdmUpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJc2V0R3JvdXAoKERUREdyb3VwQ29udGVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG51bGwpOwotCQkJCXJldHVybjsKLQkJfQotCQllRHluYW1pY1Vuc2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gZUlzU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19HUk9VUCA6Ci0JCQkJcmV0dXJuIGdldEdyb3VwKCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUENfREFUQV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudE5hbWUoKSB7Ci0JCXJldHVybiAiI1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUGFja2FnZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYWNrYWdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmMxOGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYWNrYWdlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVQYWNrYWdlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuaW1wbC5FY29yZVBhY2thZ2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQW55Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREJhc2ljVHlwZUtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuWE1MU2NoZW1hRGVmaW5lZFR5cGU7Ci0KLQotLyoqCi0gKiBAbGFzdGdlbiBjbGFzcyBEVERQYWNrYWdlSW1wbCBleHRlbmRzIEVQYWNrYWdlSW1wbCBpbXBsZW1lbnRzIERURFBhY2thZ2UsCi0gKiAgICAgICAgICBFUGFja2FnZSB7fQotICovCi1wdWJsaWMgY2xhc3MgRFREUGFja2FnZUltcGwgZXh0ZW5kcyBFUGFja2FnZUltcGwgaW1wbGVtZW50cyBEVERQYWNrYWdlIHsKLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEdyb3VwQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkQXR0cmlidXRlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbGVtZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbXB0eUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEFueUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZHBjRGF0YUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVsZW1lbnRSZWZlcmVuY2VDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkRmlsZUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkQmFzaWNUeXBlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZE5vdGF0aW9uRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbnRpdHlFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MgPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUNsYXNzIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRJbnRlcm5hbEVudGl0eUVDbGFzcyA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFQ2xhc3MgZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVDbGFzcyBkdGRDb250ZW50RUNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZE9jY3VycmVuY2VUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkRGVmYXVsdEtpbmRFRW51bSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBFRW51bSBkdGRCYXNpY1R5cGVLaW5kRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgRUVudW0gZHRkRW51bUdyb3VwS2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIGR0ZEdyb3VwS2luZEVFbnVtID0gbnVsbDsKLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIEVFbnVtIHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0gPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgbW9kZWwgPGI+UGFja2FnZTwvYj4sIHJlZ2lzdGVyZWQgd2l0aAotCSAqIHtAbGluayBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVBhY2thZ2UuUmVnaXN0cnkgRVBhY2thZ2UuUmVnaXN0cnl9IGJ5Ci0JICogdGhlIHBhY2thZ2UgcGFja2FnZSBVUkkgdmFsdWUuCi0JICogPHA+Ci0JICogTm90ZTogdGhlIGNvcnJlY3Qgd2F5IHRvIGNyZWF0ZSB0aGUgcGFja2FnZSBpcyB2aWEgdGhlIHN0YXRpYyBmYWN0b3J5Ci0JICogbWV0aG9kIHtAbGluayAjaW5pdCBpbml0KCl9LCB3aGljaCBhbHNvIHBlcmZvcm1zIGluaXRpYWxpemF0aW9uIG9mIHRoZQotCSAqIHBhY2thZ2UsIG9yIHJldHVybnMgdGhlIHJlZ2lzdGVyZWQgcGFja2FnZSwgaWYgb25lIGFscmVhZHkgZXhpc3RzLiA8IS0tCi0JICogYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVQYWNrYWdlLlJlZ2lzdHJ5Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2UjZU5TX1VSSQotCSAqIEBzZWUgI2luaXQoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcml2YXRlIERURFBhY2thZ2VJbXBsKCkgewotCQlzdXBlcihlTlNfVVJJLCBEVERGYWN0b3J5LmVJTlNUQU5DRSk7Ci0JfQotCi0JLy8gcHVibGljIERURFBhY2thZ2VJbXBsKCkKLQkvLyB7Ci0JLy8gc3VwZXIoZU5TX1VSSSk7Ci0JLy8gaW5pdGlhbGl6ZVBhY2thZ2UobnVsbCk7Ci0JLy8gfQotCi0KLQkvKioKLQkgKiBDcmVhdGVzLCByZWdpc3RlcnMsIGFuZCBpbml0aWFsaXplcyB0aGUgPGI+UGFja2FnZTwvYj4gZm9yIHRoaXMgbW9kZWwsCi0JICogYW5kIGZvciBhbnkgb3RoZXJzIHVwb24gd2hpY2ggaXQgZGVwZW5kcy4gU2ltcGxlIGRlcGVuZGVuY2llcyBhcmUKLQkgKiBzYXRpc2ZpZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBvbiBhbGwgZGVwZW5kZW50IHBhY2thZ2VzIGJlZm9yZSBkb2luZwotCSAqIGFueXRoaW5nIGVsc2UuIFRoaXMgbWV0aG9kIGRyaXZlcyBpbml0aWFsaXphdGlvbiBmb3IgaW50ZXJkZXBlbmRlbnQKLQkgKiBwYWNrYWdlcyBkaXJlY3RseSwgaW4gcGFyYWxsZWwgd2l0aCB0aGlzIHBhY2thZ2UsIGl0c2VsZi4KLQkgKiA8cD4KLQkgKiBPZiB0aGlzIHBhY2thZ2UgYW5kIGl0cyBpbnRlcmRlcGVuZGVuY2llcywgYWxsIHBhY2thZ2VzIHdoaWNoIGhhdmUgbm90Ci0JICogeWV0IGJlZW4gcmVnaXN0ZXJlZCBieSB0aGVpciBVUkkgdmFsdWVzIGFyZSBmaXJzdCBjcmVhdGVkIGFuZAotCSAqIHJlZ2lzdGVyZWQuIFRoZSBwYWNrYWdlcyBhcmUgdGhlbiBpbml0aWFsaXplZCBpbiB0d28gc3RlcHM6IG1ldGEtbW9kZWwKLQkgKiBvYmplY3RzIGZvciBhbGwgb2YgdGhlIHBhY2thZ2VzIGFyZSBjcmVhdGVkIGJlZm9yZSBhbnkgYXJlIGluaXRpYWxpemVkLAotCSAqIHNpbmNlIG9uZSBwYWNrYWdlJ3MgbWV0YS1tb2RlbCBvYmplY3RzIG1heSByZWZlciB0byB0aG9zZSBvZiBhbm90aGVyLgotCSAqIDxwPgotCSAqIEludm9jYXRpb24gb2YgdGhpcyBtZXRob2Qgd2lsbCBub3QgYWZmZWN0IGFueSBwYWNrYWdlcyB0aGF0IGhhdmUKLQkgKiBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQuIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBzZWUgI2VOU19VUkkKLQkgKiBAc2VlICNjcmVhdGVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBzZWUgI2luaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKQotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIERURFBhY2thZ2UgaW5pdCgpIHsKLQkJLy8gT2J0YWluIG9yIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgcGFja2FnZSBhbmQgaW50ZXJkZXBlbmRlbmNpZXMKLQkJRFREUGFja2FnZUltcGwgdGhlRFREUGFja2FnZSA9IChEVERQYWNrYWdlSW1wbCkgKEVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldChlTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KGVOU19VUkkpIDogbmV3IERURFBhY2thZ2VJbXBsKCkpOwotCQlFY29yZVBhY2thZ2VJbXBsIHRoZUVjb3JlUGFja2FnZSA9IChFY29yZVBhY2thZ2VJbXBsKSAoRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KEVjb3JlUGFja2FnZS5lTlNfVVJJKSBpbnN0YW5jZW9mIEVQYWNrYWdlID8gRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0KEVjb3JlUGFja2FnZS5lTlNfVVJJKSA6IEVjb3JlUGFja2FnZS5lSU5TVEFOQ0UpOwotCi0JCS8vIFN0ZXAgMTogY3JlYXRlIG1ldGEtbW9kZWwgb2JqZWN0cwotCQl0aGVEVERQYWNrYWdlLmNyZWF0ZVBhY2thZ2VDb250ZW50cygpOwotCQl0aGVFY29yZVBhY2thZ2UuY3JlYXRlUGFja2FnZUNvbnRlbnRzKCk7Ci0KLQkJLy8gU3RlcCAyOiBjb21wbGV0ZSBpbml0aWFsaXphdGlvbgotCQl0aGVEVERQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQkJdGhlRWNvcmVQYWNrYWdlLmluaXRpYWxpemVQYWNrYWdlQ29udGVudHMoKTsKLQotCQlyZXR1cm4gdGhlRFREUGFja2FnZTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbGVtZW50Q29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRDb250ZW50RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50Q29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbGVtZW50Q29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERHcm91cENvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRHcm91cENvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREdyb3VwQ29udGVudF9Hcm91cEtpbmQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkR3JvdXBDb250ZW50RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERHcm91cENvbnRlbnRfQ29udGVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRHcm91cENvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREQXR0cmlidXRlKCkgewotCQlyZXR1cm4gZHRkQXR0cmlidXRlRUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERBdHRyaWJ1dGVfQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9EZWZhdWx0S2luZCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREF0dHJpYnV0ZV9EZWZhdWx0VmFsdWVTdHJpbmcoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkQXR0cmlidXRlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERBdHRyaWJ1dGVfRFRERWxlbWVudCgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRBdHRyaWJ1dGVFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMik7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERWxlbWVudCgpIHsKLQkJcmV0dXJuIGR0ZEVsZW1lbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREVsZW1lbnRfQ29tbWVudCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFbGVtZW50RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbGVtZW50X0NvbnRlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRWxlbWVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRWxlbWVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbXB0eUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbXB0eUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREQW55Q29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEFueUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREUENEYXRhQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZHBjRGF0YUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRfUmVmZXJlbmNlZEVsZW1lbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERmlsZV9Db21tZW50KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEZpbGVFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREZpbGVfUGFyc2VFcnJvcigpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRGaWxlRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERGaWxlX0RURENvbnRlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRmlsZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRmlsZUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERCYXNpY1R5cGUoKSB7Ci0JCXJldHVybiBkdGRCYXNpY1R5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREJhc2ljVHlwZV9LaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEJhc2ljVHlwZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbnVtZXJhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREVudW1lcmF0aW9uVHlwZV9LaW5kKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW51bWVyYXRpb25UeXBlX0RUREZpbGUoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURE5vdGF0aW9uKCkgewotCQlyZXR1cm4gZHRkTm90YXRpb25FQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkTm90YXRpb25FQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERURE5vdGF0aW9uX1N5c3RlbUlEKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZE5vdGF0aW9uRUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGROb3RhdGlvbkVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgyKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRETm90YXRpb25fRW50aXR5KCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZE5vdGF0aW9uRUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREVudGl0eSgpIHsKLQkJcmV0dXJuIGR0ZEVudGl0eUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERW50aXR5X0NvbW1lbnQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFbnRpdHlfUGFyYW1ldGVyRW50aXR5KCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgxKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5X0NvbnRlbnQoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfUGFybUVudGl0eVJlZigpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDIpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRFbnRpdHlFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eV9BdHRyaWJ1dGVUeXBlUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEVudGl0eUVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCg0KTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFbnRpdHlDb250ZW50KCkgewotCQlyZXR1cm4gZHRkRW50aXR5Q29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5Q29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERFeHRlcm5hbEVudGl0eSgpIHsKLQkJcmV0dXJuIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUF0dHJpYnV0ZSBnZXREVERFeHRlcm5hbEVudGl0eV9TeXN0ZW1JRCgpIHsKLQkJcmV0dXJuIChFQXR0cmlidXRlKSBkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFQXR0cmlidXRlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVBdHRyaWJ1dGUgZ2V0RFRERXh0ZXJuYWxFbnRpdHlfUHVibGljSUQoKSB7Ci0JCXJldHVybiAoRUF0dHJpYnV0ZSkgZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MuZ2V0RUF0dHJpYnV0ZXMoKS5nZXQoMSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREV4dGVybmFsRW50aXR5X05vdGF0aW9uKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRVJlZmVyZW5jZSBnZXREVERFeHRlcm5hbEVudGl0eV9FbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLmdldEVSZWZlcmVuY2VzKCkuZ2V0KDEpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERUREludGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZHRkSW50ZXJuYWxFbnRpdHlFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQXR0cmlidXRlIGdldERUREludGVybmFsRW50aXR5X1ZhbHVlKCkgewotCQlyZXR1cm4gKEVBdHRyaWJ1dGUpIGR0ZEludGVybmFsRW50aXR5RUNsYXNzLmdldEVBdHRyaWJ1dGVzKCkuZ2V0KDApOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUNsYXNzIGdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLQkJcmV0dXJuIGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpIHsKLQkJcmV0dXJuIChFUmVmZXJlbmNlKSBkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFQ2xhc3MgZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpIHsKLQkJcmV0dXJuIGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFUmVmZXJlbmNlIGdldERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRfRWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSB7Ci0JCXJldHVybiAoRVJlZmVyZW5jZSkgZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFUmVmZXJlbmNlcygpLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVDbGFzcyBnZXREVERDb250ZW50KCkgewotCQlyZXR1cm4gZHRkQ29udGVudEVDbGFzczsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVSZWZlcmVuY2UgZ2V0RFREQ29udGVudF9EVERGaWxlKCkgewotCQlyZXR1cm4gKEVSZWZlcmVuY2UpIGR0ZENvbnRlbnRFQ2xhc3MuZ2V0RVJlZmVyZW5jZXMoKS5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVERPY2N1cnJlbmNlVHlwZSgpIHsKLQkJcmV0dXJuIGR0ZE9jY3VycmVuY2VUeXBlRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVEREZWZhdWx0S2luZCgpIHsKLQkJcmV0dXJuIGR0ZERlZmF1bHRLaW5kRUVudW07Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBFRW51bSBnZXREVERCYXNpY1R5cGVLaW5kKCkgewotCQlyZXR1cm4gZHRkQmFzaWNUeXBlS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0RFRERW51bUdyb3VwS2luZCgpIHsKLQkJcmV0dXJuIGR0ZEVudW1Hcm91cEtpbmRFRW51bTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIEVFbnVtIGdldERUREdyb3VwS2luZCgpIHsKLQkJcmV0dXJuIGR0ZEdyb3VwS2luZEVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRUVudW0gZ2V0WE1MU2NoZW1hRGVmaW5lZFR5cGUoKSB7Ci0JCXJldHVybiB4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgRFRERmFjdG9yeSBnZXREVERGYWN0b3J5KCkgewotCQlyZXR1cm4gKERUREZhY3RvcnkpIGdldEVGYWN0b3J5SW5zdGFuY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQ3JlYXRlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgbWV0YS1tb2RlbCBvYmplY3RzIGZvciB0aGUgcGFja2FnZS4gVGhpcyBtZXRob2QgaXMgZ3VhcmRlZAotCSAqIHRvIGhhdmUgbm8gYWZmZWN0IG9uIGFueSBpbnZvY2F0aW9uIGJ1dCBpdHMgZmlyc3QuIDwhLS0gYmVnaW4tdXNlci1kb2MKLQkgKiAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzQ3JlYXRlZCkKLQkJCXJldHVybjsKLQkJaXNDcmVhdGVkID0gdHJ1ZTsKLQotCQkvLyBDcmVhdGUgY2xhc3NlcyBhbmQgdGhlaXIgZmVhdHVyZXMKLQkJZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VMRU1FTlRfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MsIERURF9FTEVNRU5UX0NPTlRFTlRfX0dST1VQKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50Q29udGVudEVDbGFzcywgRFREX0VMRU1FTlRfQ09OVEVOVF9fRUxFTUVOVCk7Ci0KLQkJZHRkR3JvdXBDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9HUk9VUF9DT05URU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRHcm91cENvbnRlbnRFQ2xhc3MsIERURF9HUk9VUF9DT05URU5UX19HUk9VUF9LSU5EKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRHcm91cENvbnRlbnRFQ2xhc3MsIERURF9HUk9VUF9DT05URU5UX19DT05URU5UKTsKLQotCQlkdGRBdHRyaWJ1dGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0FUVFJJQlVURSk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19DT01NRU5UKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGVFQ2xhc3MsIERURF9BVFRSSUJVVEVfX0RFRkFVTFRfS0lORCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19ERUZBVUxUX1ZBTFVFX1NUUklORyk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19BVFRSSUJVVEVfTkFNRV9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkQXR0cmlidXRlRUNsYXNzLCBEVERfQVRUUklCVVRFX19EVERfRUxFTUVOVCk7Ci0KLQkJZHRkRWxlbWVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRUxFTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRWxlbWVudEVDbGFzcywgRFREX0VMRU1FTlRfX0NPTU1FTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVsZW1lbnRFQ2xhc3MsIERURF9FTEVNRU5UX19DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbGVtZW50RUNsYXNzLCBEVERfRUxFTUVOVF9fRFREX0FUVFJJQlVURSk7Ci0KLQkJZHRkRW1wdHlDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FTVBUWV9DT05URU5UKTsKLQotCQlkdGRBbnlDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9BTllfQ09OVEVOVCk7Ci0KLQkJZHRkcGNEYXRhQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfUENfREFUQV9DT05URU5UKTsKLQotCQlkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MsIERURF9FTEVNRU5UX1JFRkVSRU5DRV9DT05URU5UX19SRUZFUkVOQ0VEX0VMRU1FTlQpOwotCi0JCWR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9SRVBFQVRBQkxFX0NPTlRFTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZFJlcGVhdGFibGVDb250ZW50RUNsYXNzLCBEVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFKTsKLQotCQlkdGRGaWxlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9GSUxFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRGaWxlRUNsYXNzLCBEVERfRklMRV9fQ09NTUVOVCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkRmlsZUVDbGFzcywgRFREX0ZJTEVfX1BBUlNFX0VSUk9SKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRGaWxlRUNsYXNzLCBEVERfRklMRV9fRFREX0NPTlRFTlQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEZpbGVFQ2xhc3MsIERURF9GSUxFX19EVERfRU5VTUVSQVRJT05fVFlQRSk7Ci0KLQkJZHRkQmFzaWNUeXBlRUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9CQVNJQ19UWVBFKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRCYXNpY1R5cGVFQ2xhc3MsIERURF9CQVNJQ19UWVBFX19LSU5EKTsKLQotCQlkdGRFbnVtZXJhdGlvblR5cGVFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VOVU1FUkFUSU9OX1RZUEUpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcywgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0tJTkQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcywgRFREX0VOVU1FUkFUSU9OX1RZUEVfX0RURF9GSUxFKTsKLQotCQlkdGROb3RhdGlvbkVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfTk9UQVRJT04pOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVERfTk9UQVRJT05fX0NPTU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZE5vdGF0aW9uRUNsYXNzLCBEVERfTk9UQVRJT05fX1NZU1RFTV9JRCk7Ci0JCWNyZWF0ZUVBdHRyaWJ1dGUoZHRkTm90YXRpb25FQ2xhc3MsIERURF9OT1RBVElPTl9fUFVCTElDX0lEKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGROb3RhdGlvbkVDbGFzcywgRFREX05PVEFUSU9OX19FTlRJVFkpOwotCi0JCWR0ZEVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0NPTU1FTlQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEVudGl0eUVDbGFzcywgRFREX0VOVElUWV9fUEFSQU1FVEVSX0VOVElUWSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19FTlRJVFlfUkVGRVJFTkNFKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlFQ2xhc3MsIERURF9FTlRJVFlfX0FUVFJJQlVURV9OQU1FX1JFRkVSRU5DRSk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5RUNsYXNzLCBEVERfRU5USVRZX19BVFRSSUJVVEVfVFlQRV9SRUZFUkVOQ0UpOwotCi0JCWR0ZEVudGl0eUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VOVElUWV9DT05URU5UKTsKLQkJY3JlYXRlRVJlZmVyZW5jZShkdGRFbnRpdHlDb250ZW50RUNsYXNzLCBEVERfRU5USVRZX0NPTlRFTlRfX0RURF9FTlRJVFkpOwotCi0JCWR0ZEV4dGVybmFsRW50aXR5RUNsYXNzID0gY3JlYXRlRUNsYXNzKERURF9FWFRFUk5BTF9FTlRJVFkpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERfRVhURVJOQUxfRU5USVRZX19TWVNURU1fSUQpOwotCQljcmVhdGVFQXR0cmlidXRlKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERfRVhURVJOQUxfRU5USVRZX19QVUJMSUNfSUQpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERfRVhURVJOQUxfRU5USVRZX19OT1RBVElPTik7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRXh0ZXJuYWxFbnRpdHlFQ2xhc3MsIERURF9FWFRFUk5BTF9FTlRJVFlfX0VOVElUWV9SRUZFUkVOQ0VEX0ZST01fQU5PVEhFUl9GSUxFKTsKLQotCQlkdGRJbnRlcm5hbEVudGl0eUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfSU5URVJOQUxfRU5USVRZKTsKLQkJY3JlYXRlRUF0dHJpYnV0ZShkdGRJbnRlcm5hbEVudGl0eUVDbGFzcywgRFREX0lOVEVSTkFMX0VOVElUWV9fVkFMVUUpOwotCi0JCWR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0UpOwotCQljcmVhdGVFUmVmZXJlbmNlKGR0ZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUVDbGFzcywgRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkpOwotCi0JCWR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MgPSBjcmVhdGVFQ2xhc3MoRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFREX0VOVElUWV9SRUZFUkVOQ0VfQ09OVEVOVF9fRUxFTUVOVF9SRUZFUkVOQ0VEX0VOVElUWSk7Ci0KLQkJZHRkQ29udGVudEVDbGFzcyA9IGNyZWF0ZUVDbGFzcyhEVERfQ09OVEVOVCk7Ci0JCWNyZWF0ZUVSZWZlcmVuY2UoZHRkQ29udGVudEVDbGFzcywgRFREX0NPTlRFTlRfX0RURF9GSUxFKTsKLQotCQkvLyBDcmVhdGUgZW51bXMKLQkJZHRkT2NjdXJyZW5jZVR5cGVFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9PQ0NVUlJFTkNFX1RZUEUpOwotCQlkdGREZWZhdWx0S2luZEVFbnVtID0gY3JlYXRlRUVudW0oRFREX0RFRkFVTFRfS0lORCk7Ci0JCWR0ZEJhc2ljVHlwZUtpbmRFRW51bSA9IGNyZWF0ZUVFbnVtKERURF9CQVNJQ19UWVBFX0tJTkQpOwotCQlkdGRFbnVtR3JvdXBLaW5kRUVudW0gPSBjcmVhdGVFRW51bShEVERfRU5VTV9HUk9VUF9LSU5EKTsKLQkJZHRkR3JvdXBLaW5kRUVudW0gPSBjcmVhdGVFRW51bShEVERfR1JPVVBfS0lORCk7Ci0JCXhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0gPSBjcmVhdGVFRW51bShYTUxfU0NIRU1BX0RFRklORURfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0luaXRpYWxpemVkID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBDb21wbGV0ZSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIHBhY2thZ2UgYW5kIGl0cyBtZXRhLW1vZGVsLiBUaGlzCi0JICogbWV0aG9kIGlzIGd1YXJkZWQgdG8gaGF2ZSBubyBhZmZlY3Qgb24gYW55IGludm9jYXRpb24gYnV0IGl0cyBmaXJzdC4KLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhY2thZ2VDb250ZW50cygpIHsKLQkJaWYgKGlzSW5pdGlhbGl6ZWQpCi0JCQlyZXR1cm47Ci0JCWlzSW5pdGlhbGl6ZWQgPSB0cnVlOwotCi0JCS8vIEluaXRpYWxpemUgcGFja2FnZQotCQlzZXROYW1lKGVOQU1FKTsKLQkJc2V0TnNQcmVmaXgoZU5TX1BSRUZJWCk7Ci0JCXNldE5zVVJJKGVOU19VUkkpOwotCi0JCS8vIE9idGFpbiBvdGhlciBkZXBlbmRlbnQgcGFja2FnZXMKLQkJRWNvcmVQYWNrYWdlSW1wbCB0aGVFY29yZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlSW1wbCkgRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCi0JCS8vIEFkZCBzdXBlcnR5cGVzIHRvIGNsYXNzZXMKLQkJZHRkR3JvdXBDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnQoKSk7Ci0JCWR0ZEF0dHJpYnV0ZUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUF0dHJpYnV0ZSgpKTsKLQkJZHRkRWxlbWVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGVFY29yZVBhY2thZ2UuZ2V0RUNsYXNzKCkpOwotCQlkdGRFbGVtZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREQ29udGVudCgpKTsKLQkJZHRkRW1wdHlDb250ZW50RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSk7Ci0JCWR0ZEFueUNvbnRlbnRFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERFbGVtZW50Q29udGVudCgpKTsKLQkJZHRkcGNEYXRhQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCkpOwotCQlkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURFJlcGVhdGFibGVDb250ZW50KCkpOwotCQlkdGRSZXBlYXRhYmxlQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCkpOwotCQlkdGRCYXNpY1R5cGVFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhlRWNvcmVQYWNrYWdlLmdldEVDbGFzcygpKTsKLQkJZHRkRW51bWVyYXRpb25UeXBlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoZUVjb3JlUGFja2FnZS5nZXRFRW51bSgpKTsKLQkJZHRkTm90YXRpb25FQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFbnRpdHlFQ2xhc3MuZ2V0RVN1cGVyVHlwZXMoKS5hZGQodGhpcy5nZXREVERDb250ZW50KCkpOwotCQlkdGRFeHRlcm5hbEVudGl0eUVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERUREVudGl0eUNvbnRlbnQoKSk7Ci0JCWR0ZEludGVybmFsRW50aXR5RUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFRERW50aXR5Q29udGVudCgpKTsKLQkJZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRUNsYXNzLmdldEVTdXBlclR5cGVzKCkuYWRkKHRoaXMuZ2V0RFREQ29udGVudCgpKTsKLQkJZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudEVDbGFzcy5nZXRFU3VwZXJUeXBlcygpLmFkZCh0aGlzLmdldERURFJlcGVhdGFibGVDb250ZW50KCkpOwotCi0JCS8vIEluaXRpYWxpemUgY2xhc3NlcyBhbmQgZmVhdHVyZXM7IGFkZCBvcGVyYXRpb25zIGFuZCBwYXJhbWV0ZXJzCi0JCWluaXRFQ2xhc3MoZHRkRWxlbWVudENvbnRlbnRFQ2xhc3MsIERUREVsZW1lbnRDb250ZW50LmNsYXNzLCAiRFRERWxlbWVudENvbnRlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudENvbnRlbnRfR3JvdXAoKSwgdGhpcy5nZXREVERHcm91cENvbnRlbnQoKSwgdGhpcy5nZXREVERHcm91cENvbnRlbnRfQ29udGVudCgpLCAiZ3JvdXAiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpLCB0aGlzLmdldERUREVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50X0NvbnRlbnQoKSwgImVsZW1lbnQiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEdyb3VwQ29udGVudEVDbGFzcywgRFRER3JvdXBDb250ZW50LmNsYXNzLCAiRFRER3JvdXBDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERHcm91cENvbnRlbnRfR3JvdXBLaW5kKCksIHRoaXMuZ2V0RFRER3JvdXBLaW5kKCksICJncm91cEtpbmQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREdyb3VwQ29udGVudF9Db250ZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnQoKSwgdGhpcy5nZXREVERFbGVtZW50Q29udGVudF9Hcm91cCgpLCAiY29udGVudCIsIG51bGwsIDEsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEF0dHJpYnV0ZUVDbGFzcywgRFREQXR0cmlidXRlLmNsYXNzLCAiRFREQXR0cmlidXRlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERBdHRyaWJ1dGVfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREQXR0cmlidXRlX0RlZmF1bHRLaW5kKCksIHRoaXMuZ2V0RFRERGVmYXVsdEtpbmQoKSwgImRlZmF1bHRLaW5kIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERBdHRyaWJ1dGVfRGVmYXVsdFZhbHVlU3RyaW5nKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJkZWZhdWx0VmFsdWVTdHJpbmciLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlKCksICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHkoKSwgdGhpcy5nZXREVERFbnRpdHlfQXR0cmlidXRlVHlwZVJlZmVyZW5jZSgpLCAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREQXR0cmlidXRlX0RUREVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudF9EVERBdHRyaWJ1dGUoKSwgIkRUREVsZW1lbnQiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVsZW1lbnRFQ2xhc3MsIERUREVsZW1lbnQuY2xhc3MsICJEVERFbGVtZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbGVtZW50X0NvbW1lbnQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgImNvbW1lbnQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVsZW1lbnRfQ29udGVudCgpLCB0aGlzLmdldERUREVsZW1lbnRDb250ZW50KCksIHRoaXMuZ2V0RFRERWxlbWVudENvbnRlbnRfRWxlbWVudCgpLCAiY29udGVudCIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbGVtZW50X0RUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZV9EVERFbGVtZW50KCksICJEVERBdHRyaWJ1dGUiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCBJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbXB0eUNvbnRlbnRFQ2xhc3MsIERUREVtcHR5Q29udGVudC5jbGFzcywgIkRUREVtcHR5Q29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEFueUNvbnRlbnRFQ2xhc3MsIERUREFueUNvbnRlbnQuY2xhc3MsICJEVERBbnlDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkcGNEYXRhQ29udGVudEVDbGFzcywgRFREUENEYXRhQ29udGVudC5jbGFzcywgIkRURFBDRGF0YUNvbnRlbnQiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbGVtZW50UmVmZXJlbmNlQ29udGVudEVDbGFzcywgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQuY2xhc3MsICJEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnRfUmVmZXJlbmNlZEVsZW1lbnQoKSwgdGhpcy5nZXREVERFbGVtZW50KCksIG51bGwsICJyZWZlcmVuY2VkRWxlbWVudCIsIG51bGwsIDEsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkUmVwZWF0YWJsZUNvbnRlbnRFQ2xhc3MsIERURFJlcGVhdGFibGVDb250ZW50LmNsYXNzLCAiRFREUmVwZWF0YWJsZUNvbnRlbnQiLCBJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFREUmVwZWF0YWJsZUNvbnRlbnRfT2NjdXJyZW5jZSgpLCB0aGlzLmdldERURE9jY3VycmVuY2VUeXBlKCksICJvY2N1cnJlbmNlIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkRmlsZUVDbGFzcywgRFRERmlsZS5jbGFzcywgIkRUREZpbGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREZpbGVfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERmlsZV9QYXJzZUVycm9yKCksIGVjb3JlUGFja2FnZS5nZXRFQm9vbGVhbigpLCAicGFyc2VFcnJvciIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERmlsZV9EVERDb250ZW50KCksIHRoaXMuZ2V0RFREQ29udGVudCgpLCB0aGlzLmdldERURENvbnRlbnRfRFRERmlsZSgpLCAiRFREQ29udGVudCIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERmlsZV9EVERFbnVtZXJhdGlvblR5cGUoKSwgdGhpcy5nZXREVERFbnVtZXJhdGlvblR5cGUoKSwgdGhpcy5nZXREVERFbnVtZXJhdGlvblR5cGVfRFRERmlsZSgpLCAiRFRERW51bWVyYXRpb25UeXBlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgSVNfQ09NUE9TSVRFLCAhSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCi0JCWluaXRFQ2xhc3MoZHRkQmFzaWNUeXBlRUNsYXNzLCBEVERCYXNpY1R5cGUuY2xhc3MsICJEVERCYXNpY1R5cGUiLCAhSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREJhc2ljVHlwZV9LaW5kKCksIHRoaXMuZ2V0RFREQmFzaWNUeXBlS2luZCgpLCAia2luZCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudW1lcmF0aW9uVHlwZUVDbGFzcywgRFRERW51bWVyYXRpb25UeXBlLmNsYXNzLCAiRFRERW51bWVyYXRpb25UeXBlIiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbnVtZXJhdGlvblR5cGVfS2luZCgpLCB0aGlzLmdldERUREVudW1Hcm91cEtpbmQoKSwgImtpbmQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudW1lcmF0aW9uVHlwZV9EVERGaWxlKCksIHRoaXMuZ2V0RFRERmlsZSgpLCB0aGlzLmdldERUREZpbGVfRFRERW51bWVyYXRpb25UeXBlKCksICJEVERGaWxlIiwgbnVsbCwgMCwgMSwgSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsICFJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGROb3RhdGlvbkVDbGFzcywgRFRETm90YXRpb24uY2xhc3MsICJEVEROb3RhdGlvbiIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRETm90YXRpb25fQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRETm90YXRpb25fU3lzdGVtSUQoKSwgZWNvcmVQYWNrYWdlLmdldEVTdHJpbmcoKSwgInN5c3RlbUlEIiwgbnVsbCwgMCwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfVU5TRVRUQUJMRSwgIUlTX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVEROb3RhdGlvbl9QdWJsaWNJRCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAicHVibGljSUQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERURE5vdGF0aW9uX0VudGl0eSgpLCB0aGlzLmdldERUREV4dGVybmFsRW50aXR5KCksIHRoaXMuZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKSwgImVudGl0eSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudGl0eUVDbGFzcywgRFRERW50aXR5LmNsYXNzLCAiRFRERW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFbnRpdHlfQ29tbWVudCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAiY29tbWVudCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVBdHRyaWJ1dGUoZ2V0RFRERW50aXR5X1BhcmFtZXRlckVudGl0eSgpLCBlY29yZVBhY2thZ2UuZ2V0RUJvb2xlYW4oKSwgInBhcmFtZXRlckVudGl0eSIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X0NvbnRlbnQoKSwgdGhpcy5nZXREVERFbnRpdHlDb250ZW50KCksIHRoaXMuZ2V0RFRERW50aXR5Q29udGVudF9EVERFbnRpdHkoKSwgImNvbnRlbnQiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsIElTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X1Bhcm1FbnRpdHlSZWYoKSwgdGhpcy5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSwgdGhpcy5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksICJwYXJtRW50aXR5UmVmIiwgbnVsbCwgMSwgMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERUREVudGl0eV9FbnRpdHlSZWZlcmVuY2UoKSwgdGhpcy5nZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KCksIHRoaXMuZ2V0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudF9FbGVtZW50UmVmZXJlbmNlZEVudGl0eSgpLCAiZW50aXR5UmVmZXJlbmNlIiwgbnVsbCwgMCwgLTEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgSVNfUkVTT0xWRV9QUk9YSUVTKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlfQXR0cmlidXRlTmFtZVJlZmVyZW5jZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZSgpLCB0aGlzLmdldERUREF0dHJpYnV0ZV9BdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSgpLCAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZSIsIG51bGwsIDAsIC0xLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERW50aXR5X0F0dHJpYnV0ZVR5cGVSZWZlcmVuY2UoKSwgdGhpcy5nZXREVERBdHRyaWJ1dGUoKSwgdGhpcy5nZXREVERBdHRyaWJ1dGVfQXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoKSwgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiLCBudWxsLCAwLCAtMSwgIUlTX1RSQU5TSUVOVCwgIUlTX1ZPTEFUSUxFLCBJU19DSEFOR0VBQkxFLCAhSVNfQ09NUE9TSVRFLCBJU19SRVNPTFZFX1BST1hJRVMpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRFbnRpdHlDb250ZW50RUNsYXNzLCBEVERFbnRpdHlDb250ZW50LmNsYXNzLCAiRFRERW50aXR5Q29udGVudCIsIElTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlDb250ZW50X0RUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9Db250ZW50KCksICJEVERFbnRpdHkiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEV4dGVybmFsRW50aXR5RUNsYXNzLCBEVERFeHRlcm5hbEVudGl0eS5jbGFzcywgIkRUREV4dGVybmFsRW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERFeHRlcm5hbEVudGl0eV9TeXN0ZW1JRCgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAic3lzdGVtSUQiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFQXR0cmlidXRlKGdldERUREV4dGVybmFsRW50aXR5X1B1YmxpY0lEKCksIGVjb3JlUGFja2FnZS5nZXRFU3RyaW5nKCksICJwdWJsaWNJRCIsIG51bGwsIDAsIDEsICFJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX1VOU0VUVEFCTEUsICFJU19JRCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERXh0ZXJuYWxFbnRpdHlfTm90YXRpb24oKSwgdGhpcy5nZXREVEROb3RhdGlvbigpLCB0aGlzLmdldERURE5vdGF0aW9uX0VudGl0eSgpLCAibm90YXRpb24iLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFRERXh0ZXJuYWxFbnRpdHlfRW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSgpLCB0aGlzLmdldERUREZpbGUoKSwgbnVsbCwgImVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEludGVybmFsRW50aXR5RUNsYXNzLCBEVERJbnRlcm5hbEVudGl0eS5jbGFzcywgIkRUREludGVybmFsRW50aXR5IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RUF0dHJpYnV0ZShnZXREVERJbnRlcm5hbEVudGl0eV9WYWx1ZSgpLCBlY29yZVBhY2thZ2UuZ2V0RVN0cmluZygpLCAidmFsdWUiLCBudWxsLCAwLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19VTlNFVFRBQkxFLCAhSVNfSUQpOyAvLyROT04tTkxTLTEkCi0KLQkJaW5pdEVDbGFzcyhkdGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VFQ2xhc3MsIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5jbGFzcywgIkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSIsICFJU19BQlNUUkFDVCwgIUlTX0lOVEVSRkFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdEVSZWZlcmVuY2UoZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLCB0aGlzLmdldERUREVudGl0eSgpLCB0aGlzLmdldERUREVudGl0eV9QYXJtRW50aXR5UmVmKCksICJlbnRpdHkiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnRFQ2xhc3MsIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQuY2xhc3MsICJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IiwgIUlTX0FCU1RSQUNULCAhSVNfSU5URVJGQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlpbml0RVJlZmVyZW5jZShnZXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50X0VsZW1lbnRSZWZlcmVuY2VkRW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5KCksIHRoaXMuZ2V0RFRERW50aXR5X0VudGl0eVJlZmVyZW5jZSgpLCAiZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiLCBudWxsLCAxLCAxLCAhSVNfVFJBTlNJRU5ULCAhSVNfVk9MQVRJTEUsIElTX0NIQU5HRUFCTEUsICFJU19DT01QT1NJVEUsIElTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQlpbml0RUNsYXNzKGR0ZENvbnRlbnRFQ2xhc3MsIERURENvbnRlbnQuY2xhc3MsICJEVERDb250ZW50IiwgSVNfQUJTVFJBQ1QsICFJU19JTlRFUkZBQ0UpOyAvLyROT04tTkxTLTEkCi0JCWluaXRFUmVmZXJlbmNlKGdldERURENvbnRlbnRfRFRERmlsZSgpLCB0aGlzLmdldERUREZpbGUoKSwgdGhpcy5nZXREVERGaWxlX0RURENvbnRlbnQoKSwgIkRUREZpbGUiLCBudWxsLCAwLCAxLCBJU19UUkFOU0lFTlQsICFJU19WT0xBVElMRSwgSVNfQ0hBTkdFQUJMRSwgIUlTX0NPTVBPU0lURSwgIUlTX1JFU09MVkVfUFJPWElFUyk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBJbml0aWFsaXplIGVudW1zIGFuZCBhZGQgZW51bSBsaXRlcmFscwotCQlpbml0RUVudW0oZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuY2xhc3MsICJEVERPY2N1cnJlbmNlVHlwZSIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5PTkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRPY2N1cnJlbmNlVHlwZUVFbnVtLCBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZE9jY3VycmVuY2VUeXBlRUVudW0sIERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkT2NjdXJyZW5jZVR5cGVFRW51bSwgRFRET2NjdXJyZW5jZVR5cGUuWkVST19PUl9NT1JFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bShkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5jbGFzcywgIkRURERlZmF1bHRLaW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLklNUExJRURfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGREZWZhdWx0S2luZEVFbnVtLCBEVEREZWZhdWx0S2luZC5SRVFVSVJFRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZERlZmF1bHRLaW5kRUVudW0sIERURERlZmF1bHRLaW5kLkZJWEVEX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkRGVmYXVsdEtpbmRFRW51bSwgRFRERGVmYXVsdEtpbmQuTk9GSVhFRF9MSVRFUkFMKTsKLQotCQlpbml0RUVudW0oZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLmNsYXNzLCAiRFREQmFzaWNUeXBlS2luZCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuTk9ORV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5DREFUQV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5JRF9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5JRFJFRl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEJhc2ljVHlwZUtpbmRFRW51bSwgRFREQmFzaWNUeXBlS2luZC5JRFJFRlNfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuRU5USVRZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLkVOVElUSUVTX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoZHRkQmFzaWNUeXBlS2luZEVFbnVtLCBEVERCYXNpY1R5cGVLaW5kLk5NVE9LRU5fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRCYXNpY1R5cGVLaW5kRUVudW0sIERUREJhc2ljVHlwZUtpbmQuTk1UT0tFTlNfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGR0ZEVudW1Hcm91cEtpbmRFRW51bSwgRFRERW51bUdyb3VwS2luZC5jbGFzcywgIkRUREVudW1Hcm91cEtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkRW51bUdyb3VwS2luZEVFbnVtLCBEVERFbnVtR3JvdXBLaW5kLk5BTUVfVE9LRU5fR1JPVVBfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbChkdGRFbnVtR3JvdXBLaW5kRUVudW0sIERUREVudW1Hcm91cEtpbmQuTk9UQVRJT05fR1JPVVBfTElURVJBTCk7Ci0KLQkJaW5pdEVFbnVtKGR0ZEdyb3VwS2luZEVFbnVtLCBEVERHcm91cEtpbmQuY2xhc3MsICJEVERHcm91cEtpbmQiKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFRW51bUxpdGVyYWwoZHRkR3JvdXBLaW5kRUVudW0sIERUREdyb3VwS2luZC5TRVFVRU5DRV9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKGR0ZEdyb3VwS2luZEVFbnVtLCBEVERHcm91cEtpbmQuQ0hPSUNFX0xJVEVSQUwpOwotCi0JCWluaXRFRW51bSh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5jbGFzcywgIlhNTFNjaGVtYURlZmluZWRUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLk5PTkVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5TVFJJTkdfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5CT09MRUFOX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuRkxPQVRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5ET1VCTEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5ERUNJTUFMX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuVElNRUlOU1RBTlRfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5USU1FRFVSQVRJT05fTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5SRUNVUlJJTkdJTlNUQU5UX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuQklOQVJZX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuVVJJX0xJVEVSQUwpOwotCQlhZGRFRW51bUxpdGVyYWwoeG1sU2NoZW1hRGVmaW5lZFR5cGVFRW51bSwgWE1MU2NoZW1hRGVmaW5lZFR5cGUuSU5URUdFUl9MSVRFUkFMKTsKLQkJYWRkRUVudW1MaXRlcmFsKHhtbFNjaGVtYURlZmluZWRUeXBlRUVudW0sIFhNTFNjaGVtYURlZmluZWRUeXBlLkRBVEVfTElURVJBTCk7Ci0JCWFkZEVFbnVtTGl0ZXJhbCh4bWxTY2hlbWFEZWZpbmVkVHlwZUVFbnVtLCBYTUxTY2hlbWFEZWZpbmVkVHlwZS5USU1FX0xJVEVSQUwpOwotCi0JCS8vIENyZWF0ZSByZXNvdXJjZQotCQljcmVhdGVSZXNvdXJjZShlTlNfVVJJKTsKLQl9Ci0KLQotfSAvLyBEVERQYWNrYWdlSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvaW1wbC9EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwOTcxNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWNhdGlvbkNoYWluOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuTm90aWZpY2F0aW9uQ2hhaW5JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5pbXBsLkVOb3RpZmljYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS51dGlsLkVjb3JlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETGV4aWNhbEluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbC5EVERQYXRobmFtZVV0aWw7Ci0KLQotCi0vKioKLSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtb2RlbCBvYmplY3QgJzxlbT48Yj5QYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZTwvYj48L2VtPicuCi0gKiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBmZWF0dXJlcyBhcmUgaW1wbGVtZW50ZWQ6Ci0gKiA8dWw+Ci0gKiA8bGk+e0BsaW5rIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuaW50ZXJuYWwuaW1wbC5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsI2dldEVudGl0eSA8ZW0+RW50aXR5PC9lbT59PC9saT4KLSAqIDwvdWw+Ci0gKiA8L3A+Ci0gKiAKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGNsYXNzIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwgZXh0ZW5kcyBEVERDb250ZW50SW1wbCBpbXBsZW1lbnRzIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSwgRU5hbWVkRWxlbWVudCwgRFREQ29udGVudCB7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCURUREVudGl0eSBlbnRpdHkgPSBnZXRFbnRpdHkoKTsKLQkJaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0RW50aXR5KCkuZ2V0TmFtZSgpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhdGhuYW1lKCkgewotCQlyZXR1cm4gRFREUGF0aG5hbWVVdGlsLm1ha2VQYXRoKG51bGwsICJQRW50IiwgZ2V0TmFtZSgpLCAtMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgRFRET2JqZWN0IGZpbmRPYmplY3QoU3RyaW5nIHJlbGF0aXZlUGF0aCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyB1Z2x5IGhhY2sgZm9yIG5vdyBzaW5jZSB3ZSBkb24ndCBoYXZlIG11bHRpcGxlIGluaGVyaXRhbmNlLgotCS8vIFdvdWxkIHJhdGhlciBoYXZlIGFsbCB0aGlzIHN0dWZmIGluIGEgYmFzZSBjbGFzcyBidXQgdGhlc2UKLQkvLyBjbGFzc2VzIGFyZSBpbmhlcml0aW5nIGZyb20gc29tZXRpbWVzIGRpZmZlcmVudCBtb2YgY2xhc3NlcwotCURURExleGljYWxJbmZvIGxleEluZm8gPSBuZXcgRFRETGV4aWNhbEluZm8oKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRTdGFydE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3RhcnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzdGFydE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgdikgewotCQlsZXhJbmZvLnNldFN0YXJ0T2Zmc2V0KHYpOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgZW5kT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbGV4SW5mby5nZXRFbmRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGVuZE9mZnNldC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIGVuZE9mZnNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRPZmZzZXQoaW50IHYpIHsKLQkJbGV4SW5mby5zZXRFbmRPZmZzZXQodik7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGUgY2FjaGVkIHZhbHVlIG9mIHRoZSAne0BsaW5rICNnZXRFbnRpdHkoKSA8ZW0+RW50aXR5PC9lbT59JwotCSAqIHJlZmVyZW5jZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0RW50aXR5KCkKLQkgKiBAZ2VuZXJhdGVkCi0JICogQG9yZGVyZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRERW50aXR5IGVudGl0eSA9IG51bGw7Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBFQ2xhc3MgZVN0YXRpY0NsYXNzKCkgewotCQlyZXR1cm4gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgZ2V0RW50aXR5KCkgewotCQlpZiAoZW50aXR5ICE9IG51bGwgJiYgZW50aXR5LmVJc1Byb3h5KCkpIHsKLQkJCURUREVudGl0eSBvbGRFbnRpdHkgPSBlbnRpdHk7Ci0JCQllbnRpdHkgPSAoRFRERW50aXR5KSBFY29yZVV0aWwucmVzb2x2ZShlbnRpdHksIHRoaXMpOwotCQkJaWYgKGVudGl0eSAhPSBvbGRFbnRpdHkpIHsKLQkJCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5SRVNPTFZFLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZLCBvbGRFbnRpdHksIGVudGl0eSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBEVERFbnRpdHkgYmFzaWNHZXRFbnRpdHkoKSB7Ci0JCXJldHVybiBlbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBiYXNpY1NldEVudGl0eShEVERFbnRpdHkgbmV3RW50aXR5LCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCURUREVudGl0eSBvbGRFbnRpdHkgPSBlbnRpdHk7Ci0JCWVudGl0eSA9IG5ld0VudGl0eTsKLQkJaWYgKGVOb3RpZmljYXRpb25SZXF1aXJlZCgpKSB7Ci0JCQlpZiAobXNncyA9PSBudWxsKQotCQkJCW1zZ3MgPSBuZXcgTm90aWZpY2F0aW9uQ2hhaW5JbXBsKDQpOwotCQkJbXNncy5hZGQobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIG9sZEVudGl0eSwgbmV3RW50aXR5KSk7Ci0JCX0KLQkJcmV0dXJuIG1zZ3M7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVudGl0eShEVERFbnRpdHkgbmV3RW50aXR5KSB7Ci0JCWlmIChuZXdFbnRpdHkgIT0gZW50aXR5KSB7Ci0JCQlOb3RpZmljYXRpb25DaGFpbiBtc2dzID0gbnVsbDsKLQkJCWlmIChlbnRpdHkgIT0gbnVsbCkKLQkJCQltc2dzID0gKChJbnRlcm5hbEVPYmplY3QpIGVudGl0eSkuZUludmVyc2VSZW1vdmUodGhpcywgRFREUGFja2FnZS5EVERfRU5USVRZX19QQVJNX0VOVElUWV9SRUYsIERUREVudGl0eS5jbGFzcywgbXNncyk7Ci0JCQlpZiAobmV3RW50aXR5ICE9IG51bGwpCi0JCQkJbXNncyA9ICgoSW50ZXJuYWxFT2JqZWN0KSBuZXdFbnRpdHkpLmVJbnZlcnNlQWRkKHRoaXMsIERURFBhY2thZ2UuRFREX0VOVElUWV9fUEFSTV9FTlRJVFlfUkVGLCBEVERFbnRpdHkuY2xhc3MsIG1zZ3MpOwotCQkJbXNncyA9IGJhc2ljU2V0RW50aXR5KG5ld0VudGl0eSwgbXNncyk7Ci0JCQlpZiAobXNncyAhPSBudWxsKQotCQkJCW1zZ3MuZGlzcGF0Y2goKTsKLQkJfQotCQllbHNlIGlmIChlTm90aWZpY2F0aW9uUmVxdWlyZWQoKSkKLQkJCWVOb3RpZnkobmV3IEVOb3RpZmljYXRpb25JbXBsKHRoaXMsIE5vdGlmaWNhdGlvbi5TRVQsIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFksIG5ld0VudGl0eSwgbmV3RW50aXR5KSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlSW52ZXJzZUFkZChJbnRlcm5hbEVPYmplY3Qgb3RoZXJFbmQsIGludCBmZWF0dXJlSUQsIENsYXNzIGJhc2VDbGFzcywgTm90aWZpY2F0aW9uQ2hhaW4gbXNncykgewotCQlpZiAoZmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGZlYXR1cmVJRCwgYmFzZUNsYXNzKSkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJCWlmIChlbnRpdHkgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSAoKEludGVybmFsRU9iamVjdCkgZW50aXR5KS5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTlRJVFlfX1BBUk1fRU5USVRZX1JFRiwgRFRERW50aXR5LmNsYXNzLCBtc2dzKTsKLQkJCQkJcmV0dXJuIGJhc2ljU2V0RW50aXR5KChEVERFbnRpdHkpIG90aGVyRW5kLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJCXJldHVybiBlQmFzaWNTZXRDb250YWluZXIobnVsbCwgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCQlyZXR1cm4gYmFzaWNTZXRFbnRpdHkobnVsbCwgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0ludmVyc2VSZW1vdmUob3RoZXJFbmQsIGZlYXR1cmVJRCwgYmFzZUNsYXNzLCBtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIGZlYXR1cmVJRCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBOb3RpZmljYXRpb25DaGFpbiBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKE5vdGlmaWNhdGlvbkNoYWluIG1zZ3MpIHsKLQkJaWYgKGVDb250YWluZXJGZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlQ29udGFpbmVyRmVhdHVyZUlEKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEUgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9GSUxFX19EVERfQ09OVEVOVCwgRFRERmlsZS5jbGFzcywgbXNncyk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiBlRHluYW1pY0Jhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBFT1BQT1NJVEVfRkVBVFVSRV9CQVNFIC0gZUNvbnRhaW5lckZlYXR1cmVJRCwgbnVsbCwgbXNncyk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUsIGJvb2xlYW4gcmVzb2x2ZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQlyZXR1cm4gZ2V0RFRERmlsZSgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQlpZiAocmVzb2x2ZSkKLQkJCQkJcmV0dXJuIGdldEVudGl0eSgpOwotCQkJCXJldHVybiBiYXNpY0dldEVudGl0eSgpOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0dldChlRmVhdHVyZSwgcmVzb2x2ZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIGVTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJc2V0RFRERmlsZSgoRFRERmlsZSkgbmV3VmFsdWUpOwotCQkJCXJldHVybjsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWSA6Ci0JCQkJc2V0RW50aXR5KChEVERFbnRpdHkpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSkgewotCQlzd2l0Y2ggKGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChlRmVhdHVyZS5nZXRGZWF0dXJlSUQoKSwgZUZlYXR1cmUuZ2V0Q29udGFpbmVyQ2xhc3MoKSkpIHsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFIDoKLQkJCQlzZXREVERGaWxlKChEVERGaWxlKSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFkgOgotCQkJCXNldEVudGl0eSgoRFRERW50aXR5KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNVbnNldChlRmVhdHVyZSk7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVJc1NldChFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmUpIHsKLQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZUZlYXR1cmUuZ2V0RmVhdHVyZUlEKCksIGVGZWF0dXJlLmdldENvbnRhaW5lckNsYXNzKCkpKSB7Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRSA6Ci0JCQkJcmV0dXJuIGdldERUREZpbGUoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZIDoKLQkJCQlyZXR1cm4gZW50aXR5ICE9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljSXNTZXQoZUZlYXR1cmUpOwotCX0KLQotfSAvLyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VJbXBsCi0KLS8vICsrKysrKysrKysrKysrKysrKytHRU5FUklDUlVMRVMuSlNFRCsrKysrKysrKysrKysrKysrKysKLS8vIC8vcHVibGljIGNsYXNzIERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUltcGwgZXh0ZW5kcyBFTmFtZXNwYWNlSW1wbAotLy8gaW1wbGVtZW50cyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UsIEVOYW1lc3BhY2UsIERURENvbnRlbnR7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERUREVudGl0eSBlbnRpdHkgPSBudWxsOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCBib29sZWFuIHNldEVudGl0eSA9IGZhbHNlOwotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByaXZhdGUgRFREQ29udGVudEltcGwgZHRkQ29udGVudERlbGVnYXRlID0gbnVsbDsKLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRU9iamVjdCBpbml0SW5zdGFuY2UoKSB7Ci0vLyBzZXRFTWV0YU9iaihlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKSk7Ci0vLyBpbml0SW5zdGFuY2VEZWxlZ2F0ZXMoKTsKLS8vIHJldHVybiB0aGlzOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHByb3RlY3RlZCB2b2lkIGluaXRJbnN0YW5jZURlbGVnYXRlcygpIHsKLS8vIHN1cGVyLmluaXRJbnN0YW5jZURlbGVnYXRlcygpOwotLy8KLQotLy8gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkucmVmU2V0RGVsZWdhdGVPd25lcih0aGlzKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRFREUGFja2FnZSBlUGFja2FnZURURCgpIHsKLS8vIHJldHVybgotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpIHsKLS8vIHJldHVybgotLy8gKChEVERQYWNrYWdlKUVQYWNrYWdlLlJlZ2lzdHJ5LklOU1RBTkNFLmdldEVQYWNrYWdlKERURFBhY2thZ2UuZU5TX1VSSSkpLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uCi0vLyAqLwotLy8gcHVibGljIERUREVudGl0eSBnZXRFbnRpdHkoKSB7Ci0vLyB0cnkgewotLy8gaWYgKHRoaXMuZW50aXR5ID09IG51bGwpIHJldHVybiBudWxsOwotLy8gdGhpcy5lbnRpdHkgPSAoRFRERW50aXR5KSAoKEludGVybmFsRU9iamVjdCl0aGlzLmVudGl0eSkucmVzb2x2ZSh0aGlzLAotLy8gRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpKTsKLS8vIGlmICh0aGlzLmVudGl0eT09bnVsbCkgdGhpcy5zZXRFbnRpdHkgPSBmYWxzZTsKLS8vIHJldHVybiB0aGlzLmVudGl0eTsKLS8vIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gbnVsbDsKLS8vIH0KLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCBzZXRFbnRpdHkoRFRERW50aXR5IGwpIHsKLS8vIHJlZlNldFZhbHVlRm9yU1ZSZWZlcmVuY2UoRFREUGFja2FnZS5lSU5TVEFOQ0UuZ2V0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlX0VudGl0eSgpLHRoaXMuZW50aXR5LGwpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyB2b2lkIHVuc2V0RW50aXR5KCkgewotLy8gcmVmVW5zZXRWYWx1ZUZvclNWUmVmZXJlbmNlKERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSx0aGlzLmVudGl0eSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIGJvb2xlYW4gaXNTZXRFbnRpdHkoKSB7Ci0vLyByZXR1cm4gc2V0RW50aXR5OwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBPYmplY3QgZUdldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSkgewotLy8gRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlPW51bGw7Ci0vLyB0cnkgewotLy8gZUZlYXR1cmU9KEVTdHJ1Y3R1cmFsRmVhdHVyZSlmZWF0dXJlOwotLy8gfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLS8vIHJldHVybiBzdXBlci5lR2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiByZXR1cm4gZ2V0RW50aXR5KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRTogcmV0dXJuCi0vLyBnZXREVERGaWxlKCk7Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIuZUdldChmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgT2JqZWN0IHJlZkJhc2ljVmFsdWUoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWToKLS8vIGlmICghdGhpcy5zZXRFbnRpdHl8fHRoaXMuZW50aXR5PT1udWxsKSByZXR1cm4gbnVsbDsKLS8vIGlmICgoKEludGVybmFsRU9iamVjdCl0aGlzLmVudGl0eSkucmVmSXNEZWxldGVkKCkpIHt0aGlzLmVudGl0eT1udWxsOwotLy8gdGhpcy5zZXRFbnRpdHk9ZmFsc2U7fQotLy8gcmV0dXJuIHRoaXMuZW50aXR5OwotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHJldHVybgotLy8gKChJbnRlcm5hbEVPYmplY3QpZ2V0RHRkQ29udGVudERlbGVnYXRlKCkpLnJlZkJhc2ljVmFsdWUoZmVhdHVyZSk7Ci0vLwotCi0vLyB9Ci0vLyByZXR1cm4gc3VwZXIucmVmQmFzaWNWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGZlYXR1cmUpIHsKLS8vIEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZT1udWxsOwotLy8gdHJ5IHsKLS8vIGVGZWF0dXJlPShFU3RydWN0dXJhbEZlYXR1cmUpZmVhdHVyZTsKLS8vIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7Ci0vLyByZXR1cm4gc3VwZXIuZUlzU2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiByZXR1cm4KLS8vIGlzU2V0RW50aXR5KCk7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19EVERfRklMRTogcmV0dXJuCi0vLyBpc1NldERUREZpbGUoKTsKLS8vCi0KLS8vIH0KLS8vIHJldHVybiBzdXBlci5lSXNTZXQoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVNldChFU3RydWN0dXJhbEZlYXR1cmUgZmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVNldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHsKLS8vIHNldEVudGl0eSgoRFRERW50aXR5KW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0RURF9GSUxFOiB7Ci0vLyBzZXREVERGaWxlKChEVERGaWxlKW5ld1ZhbHVlKTsKLS8vIHJldHVybjsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHN1cGVyLmVTZXQoZmVhdHVyZSwgbmV3VmFsdWUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gZUJhc2ljU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlLCBPYmplY3QgbmV3VmFsdWUpCi0vLyB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyBzd2l0Y2ggKGVDbGFzc0RURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpLmdldEVGZWF0dXJlSWQoZUZlYXR1cmUpKSB7Ci0vLyBjYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFX19FTlRJVFk6IHsKLS8vIE9iamVjdCBvbGRWYWx1ZSA9IHRoaXMuZW50aXR5OwotLy8gdGhpcy5lbnRpdHkgPSAoRFRERW50aXR5KW5ld1ZhbHVlOwotLy8gdGhpcy5zZXRFbnRpdHkgPSB0cnVlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5TRVQsKEVTdHJ1Y3R1cmFsRmVhdHVyZSlEVERQYWNrYWdlLmVJTlNUQU5DRS5nZXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VfRW50aXR5KCksb2xkVmFsdWUsbmV3VmFsdWUpOwotLy8gfQotLy8KLQotLy8gfQotLy8gcmV0dXJuIHN1cGVyLmVCYXNpY1NldChmZWF0dXJlLCBuZXdWYWx1ZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgZVVuc2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gc3dpdGNoIChlQ2xhc3NEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKS5nZXRFRmVhdHVyZUlkKGVGZWF0dXJlKSkgewotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRU5USVRZOiB7Ci0vLyB1bnNldEVudGl0eSgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8gY2FzZSBEVERQYWNrYWdlLkRURF9QQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRV9fRFREX0ZJTEU6IHsKLS8vIHVuc2V0RFRERmlsZSgpOwotLy8gcmV0dXJuOwotLy8gfQotLy8KLQotLy8gfQotLy8gc3VwZXIuZVVuc2V0KGZlYXR1cmUpOwotLy8gfQotLy8gLyoqCi0vLyAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotLy8gKi8KLS8vIHB1YmxpYyBOb3RpZmljYXRpb24gcmVmQmFzaWNVbnNldFZhbHVlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBmZWF0dXJlKSB7Ci0vLyBFU3RydWN0dXJhbEZlYXR1cmUgZUZlYXR1cmU9bnVsbDsKLS8vIHRyeSB7Ci0vLyBlRmVhdHVyZT0oRVN0cnVjdHVyYWxGZWF0dXJlKWZlYXR1cmU7Ci0vLyB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotLy8gcmV0dXJuIHN1cGVyLnJlZkJhc2ljVW5zZXRWYWx1ZShmZWF0dXJlKTsKLS8vIH0KLS8vIHN3aXRjaCAoZUNsYXNzRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCkuZ2V0RUZlYXR1cmVJZChlRmVhdHVyZSkpIHsKLS8vIGNhc2UgRFREUGFja2FnZS5EVERfUEFSQU1FVEVSX0VOVElUWV9SRUZFUkVOQ0VfX0VOVElUWTogewotLy8gT2JqZWN0IG9sZFZhbHVlID0gdGhpcy5lbnRpdHk7Ci0vLyB0aGlzLmVudGl0eSA9IG51bGw7Ci0vLyB0aGlzLnNldEVudGl0eSA9IGZhbHNlOwotLy8gcmV0dXJuIG5ldwotLy8gRU5vdGlmaWNhdGlvbkltcGwoKEludGVybmFsRU9iamVjdCl0aGlzLE5vdGlmaWNhdGlvbi5VTlNFVCwoRVN0cnVjdHVyYWxGZWF0dXJlKURURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZV9FbnRpdHkoKSxvbGRWYWx1ZSxudWxsKTsKLS8vIH0KLS8vCi0KLS8vIH0KLS8vIHJldHVybiBzdXBlci5yZWZCYXNpY1Vuc2V0VmFsdWUoZmVhdHVyZSk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHJvdGVjdGVkIERURENvbnRlbnRJbXBsIGdldER0ZENvbnRlbnREZWxlZ2F0ZSgpIHsKLS8vIGlmIChkdGRDb250ZW50RGVsZWdhdGUgPT0gbnVsbCkgewotLy8gRFREUGFja2FnZSBwa2cgPQotLy8gKERURFBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRFREUGFja2FnZS5lTlNfVVJJKTsKLS8vIGR0ZENvbnRlbnREZWxlZ2F0ZT0oRFREQ29udGVudEltcGwpcGtnLmVDcmVhdGVJbnN0YW5jZShwa2cuRFREX0NPTlRFTlQpOwotLy8gZHRkQ29udGVudERlbGVnYXRlLmluaXRJbnN0YW5jZSgpOwotLy8gfQotLy8gcmV0dXJuIGR0ZENvbnRlbnREZWxlZ2F0ZTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgRUNsYXNzIGVDbGFzc0RURENvbnRlbnQoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuZUNsYXNzKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLS8vIHJldHVybiBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5nZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyAvKioKLS8vICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0vLyAqLwotLy8gcHVibGljIHZvaWQgc2V0RFRERmlsZShEVERGaWxlIHZhbHVlKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS5zZXREVERGaWxlKHZhbHVlKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgdm9pZCB1bnNldERUREZpbGUoKSB7Ci0vLyBnZXREdGRDb250ZW50RGVsZWdhdGUoKS51bnNldERUREZpbGUoKTsKLS8vIH0KLS8vIC8qKgotLy8gKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLS8vICovCi0vLyBwdWJsaWMgYm9vbGVhbiBpc1NldERUREZpbGUoKSB7Ci0vLyByZXR1cm4gZ2V0RHRkQ29udGVudERlbGVnYXRlKCkuaXNTZXREVERGaWxlKCk7Ci0vLyB9Ci0vLyB9Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL2ltcGwvRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNDcwZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi9pbXBsL0RURFJlcGVhdGFibGVDb250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmljYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpY2F0aW9uQ2hhaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5JbnRlcm5hbEVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLmltcGwuRU5vdGlmaWNhdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE9jY3VycmVuY2VUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0vKioKLSAqIEBnZW5lcmF0ZWQKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERURFJlcGVhdGFibGVDb250ZW50SW1wbCBleHRlbmRzIERUREVsZW1lbnRDb250ZW50SW1wbCBpbXBsZW1lbnRzIERURFJlcGVhdGFibGVDb250ZW50IHsKLQkvKioKLQkgKiBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgJ3tAbGluayAjZ2V0T2NjdXJyZW5jZSgpIDxlbT5PY2N1cnJlbmNlPC9lbT59JwotCSAqIGF0dHJpYnV0ZS4gPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQHNlZSAjZ2V0T2NjdXJyZW5jZSgpCi0JICogQGdlbmVyYXRlZAotCSAqIEBvcmRlcmVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBEVERPY2N1cnJlbmNlVHlwZSBPQ0NVUlJFTkNFX0VERUZBVUxUID0gRFRET2NjdXJyZW5jZVR5cGUuT05FX0xJVEVSQUw7Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZSA9IE9DQ1VSUkVOQ0VfRURFRkFVTFQ7Ci0KLQlwdWJsaWMgRFREUmVwZWF0YWJsZUNvbnRlbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRUNsYXNzIGVTdGF0aWNDbGFzcygpIHsKLQkJcmV0dXJuIERURFBhY2thZ2UuZUlOU1RBTkNFLmdldERURFJlcGVhdGFibGVDb250ZW50KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyB1bnBhcnNlKCkgewotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKDEyOCk7Ci0JCWlmIChnZXRPY2N1cnJlbmNlKCkuZ2V0VmFsdWUoKSAhPSBEVERPY2N1cnJlbmNlVHlwZS5PTkUpIHsKLQkJCWlmICh0aGlzIGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXNiLmFwcGVuZCgiKCIpLmFwcGVuZCh1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSkuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2IuYXBwZW5kKHVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkJCX0KLQotCQkJLy8gTU9GMkVNRiBQb3J0Ci0JCQkvLyBFRW51bUxpdGVyYWwgbGl0ID0gZ2V0T2NjdXJyZW5jZSgpOwotCQkJRFRET2NjdXJyZW5jZVR5cGUgbGl0ID0gZ2V0T2NjdXJyZW5jZSgpOwotCQkJaWYgKGxpdCAhPSBudWxsKSB7Ci0JCQkJc2IuYXBwZW5kKChjaGFyKSBsaXQuZ2V0VmFsdWUoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQodW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpOwotCQl9Ci0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24KLQkgKiAgICAgICAgICAgIEpVU1RfT05FPSAtMSBPTkVfT1JfTU9SRT00MyBPUFRJT05BTD02MyBaRVJPX09SX01PUkU9NDIKLQkgKi8KLQlwdWJsaWMgRFRET2NjdXJyZW5jZVR5cGUgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJcmV0dXJuIG9jY3VycmVuY2U7Ci0JfQotCi0JLyoqCi0JICogPCEtLSBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoRFRET2NjdXJyZW5jZVR5cGUgbmV3T2NjdXJyZW5jZSkgewotCQlEVERPY2N1cnJlbmNlVHlwZSBvbGRPY2N1cnJlbmNlID0gb2NjdXJyZW5jZTsKLQkJb2NjdXJyZW5jZSA9IG5ld09jY3VycmVuY2UgPT0gbnVsbCA/IE9DQ1VSUkVOQ0VfRURFRkFVTFQgOiBuZXdPY2N1cnJlbmNlOwotCQlpZiAoZU5vdGlmaWNhdGlvblJlcXVpcmVkKCkpCi0JCQllTm90aWZ5KG5ldyBFTm90aWZpY2F0aW9uSW1wbCh0aGlzLCBOb3RpZmljYXRpb24uU0VULCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UsIG9sZE9jY3VycmVuY2UsIG9jY3VycmVuY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlQWRkKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChlRGVyaXZlZFN0cnVjdHVyYWxGZWF0dXJlSUQoZmVhdHVyZUlELCBiYXNlQ2xhc3MpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQkJaWYgKGVDb250YWluZXIgIT0gbnVsbCkKLQkJCQkJCW1zZ3MgPSBlQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG90aGVyRW5kLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQLCBtc2dzKTsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQkJCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5ULCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljSW52ZXJzZUFkZChvdGhlckVuZCwgZmVhdHVyZUlELCBiYXNlQ2xhc3MsIG1zZ3MpOwotCQkJfQotCQl9Ci0JCWlmIChlQ29udGFpbmVyICE9IG51bGwpCi0JCQltc2dzID0gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihtc2dzKTsKLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihvdGhlckVuZCwgZmVhdHVyZUlELCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE5vdGlmaWNhdGlvbkNoYWluIGVJbnZlcnNlUmVtb3ZlKEludGVybmFsRU9iamVjdCBvdGhlckVuZCwgaW50IGZlYXR1cmVJRCwgQ2xhc3MgYmFzZUNsYXNzLCBOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChmZWF0dXJlSUQgPj0gMCkgewotCQkJc3dpdGNoIChiYXNlQ2xhc3MgPT0gbnVsbCA/IGZlYXR1cmVJRCA6IGVEZXJpdmVkU3RydWN0dXJhbEZlYXR1cmVJRChmZWF0dXJlSUQsIGJhc2VDbGFzcykpIHsKLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAgOgotCQkJCQlyZXR1cm4gZUJhc2ljU2V0Q29udGFpbmVyKG51bGwsIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fR1JPVVAsIG1zZ3MpOwotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQsIG1zZ3MpOwotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZUR5bmFtaWNJbnZlcnNlUmVtb3ZlKG90aGVyRW5kLCBmZWF0dXJlSUQsIGJhc2VDbGFzcywgbXNncyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVCYXNpY1NldENvbnRhaW5lcihudWxsLCBmZWF0dXJlSUQsIG1zZ3MpOwotCX0KLQotCS8qKgotCSAqIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwdWJsaWMgTm90aWZpY2F0aW9uQ2hhaW4gZUJhc2ljUmVtb3ZlRnJvbUNvbnRhaW5lcihOb3RpZmljYXRpb25DaGFpbiBtc2dzKSB7Ci0JCWlmIChlQ29udGFpbmVyRmVhdHVyZUlEID49IDApIHsKLQkJCXN3aXRjaCAoZUNvbnRhaW5lckZlYXR1cmVJRCkgewotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19HUk9VUCA6Ci0JCQkJCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIERURFBhY2thZ2UuRFREX0dST1VQX0NPTlRFTlRfX0NPTlRFTlQsIERUREdyb3VwQ29udGVudC5jbGFzcywgbXNncyk7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCQlyZXR1cm4gZUNvbnRhaW5lci5lSW52ZXJzZVJlbW92ZSh0aGlzLCBEVERQYWNrYWdlLkRURF9FTEVNRU5UX19DT05URU5ULCBEVERFbGVtZW50LmNsYXNzLCBtc2dzKTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGVEeW5hbWljQmFzaWNSZW1vdmVGcm9tQ29udGFpbmVyKG1zZ3MpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlQ29udGFpbmVyLmVJbnZlcnNlUmVtb3ZlKHRoaXMsIEVPUFBPU0lURV9GRUFUVVJFX0JBU0UgLSBlQ29udGFpbmVyRmVhdHVyZUlELCBudWxsLCBtc2dzKTsKLQl9Ci0KLQkvKioKLQkgKiA8IS0tIGJlZ2luLXVzZXItZG9jIC0tPiA8IS0tIGVuZC11c2VyLWRvYyAtLT4KLQkgKiAKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHVibGljIE9iamVjdCBlR2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgYm9vbGVhbiByZXNvbHZlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKTsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19FTEVNRU5UIDoKLQkJCQlyZXR1cm4gZ2V0RWxlbWVudCgpOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXJldHVybiBnZXRPY2N1cnJlbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGVEeW5hbWljR2V0KGVGZWF0dXJlLCByZXNvbHZlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlSXNTZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlyZXR1cm4gZ2V0R3JvdXAoKSAhPSBudWxsOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbDsKLQkJCWNhc2UgRFREUGFja2FnZS5EVERfUkVQRUFUQUJMRV9DT05URU5UX19PQ0NVUlJFTkNFIDoKLQkJCQlyZXR1cm4gb2NjdXJyZW5jZSAhPSBPQ0NVUlJFTkNFX0VERUZBVUxUOwotCQl9Ci0JCXJldHVybiBlRHluYW1pY0lzU2V0KGVGZWF0dXJlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlU2V0KEVTdHJ1Y3R1cmFsRmVhdHVyZSBlRmVhdHVyZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBuZXdWYWx1ZSk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0VMRU1FTlQgOgotCQkJCXNldEVsZW1lbnQoKERUREVsZW1lbnQpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fT0NDVVJSRU5DRSA6Ci0JCQkJc2V0T2NjdXJyZW5jZSgoRFRET2NjdXJyZW5jZVR5cGUpIG5ld1ZhbHVlKTsKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZUR5bmFtaWNTZXQoZUZlYXR1cmUsIG5ld1ZhbHVlKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlVW5zZXQoRVN0cnVjdHVyYWxGZWF0dXJlIGVGZWF0dXJlKSB7Ci0JCXN3aXRjaCAoZURlcml2ZWRTdHJ1Y3R1cmFsRmVhdHVyZUlEKGVGZWF0dXJlLmdldEZlYXR1cmVJRCgpLCBlRmVhdHVyZS5nZXRDb250YWluZXJDbGFzcygpKSkgewotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX0dST1VQIDoKLQkJCQlzZXRHcm91cCgoRFRER3JvdXBDb250ZW50KSBudWxsKTsKLQkJCQlyZXR1cm47Ci0JCQljYXNlIERURFBhY2thZ2UuRFREX1JFUEVBVEFCTEVfQ09OVEVOVF9fRUxFTUVOVCA6Ci0JCQkJc2V0RWxlbWVudCgoRFRERWxlbWVudCkgbnVsbCk7Ci0JCQkJcmV0dXJuOwotCQkJY2FzZSBEVERQYWNrYWdlLkRURF9SRVBFQVRBQkxFX0NPTlRFTlRfX09DQ1VSUkVOQ0UgOgotCQkJCXNldE9jY3VycmVuY2UoT0NDVVJSRU5DRV9FREVGQVVMVCk7Ci0JCQkJcmV0dXJuOwotCQl9Ci0JCWVEeW5hbWljVW5zZXQoZUZlYXR1cmUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChlSXNQcm94eSgpKQotCQkJcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7Ci0KLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIudG9TdHJpbmcoKSk7Ci0JCXJlc3VsdC5hcHBlbmQoIiAob2NjdXJyZW5jZTogIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0LmFwcGVuZChvY2N1cnJlbmNlKTsKLQkJcmVzdWx0LmFwcGVuZCgnKScpOwotCQlyZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERURFJlcGVhdGFibGVDb250ZW50I3VucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpCi0JICovCi0JcHVibGljIFN0cmluZyB1bnBhcnNlUmVwZWF0YWJsZUNvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBEVERFbGVtZW50Q29udGVudCNnZXRDb250ZW50TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTA2Y2RmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5Lk5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FQ2xhc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzc2lmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVFbnVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTW9kZWxFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FTmFtZWRFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FU3RydWN0dXJhbEZlYXR1cmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVUeXBlZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBbnlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQmFzaWNUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW1wdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnVtZXJhdGlvblR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFeHRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUENEYXRhQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhY2thZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbCB7Ci0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERURFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIERUREFkYXB0ZXJGYWN0b3J5KCkgewotCQlpZiAobW9kZWxQYWNrYWdlID09IG51bGwpIHsKLQkJCW1vZGVsUGFja2FnZSA9IERURFBhY2thZ2UuZUlOU1RBTkNFOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgPT0gbW9kZWxQYWNrYWdlKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRU9iamVjdCkgewotCQkJcmV0dXJuICgoRU9iamVjdCkgb2JqZWN0KS5lQ2xhc3MoKS5nZXRFUGFja2FnZSgpID09IG1vZGVsUGFja2FnZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHN3aXRjaCB0aGUgZGVsZWdhdGVzIHRvIHRoZSA8Y29kZT5jcmVhdGVYWFg8L2NvZGU+IG1ldGhvZHMuIDwhLS0KLQkgKiBiZWdpbi11c2VyLWRvYyAtLT4gPCEtLSBlbmQtdXNlci1kb2MgLS0+Ci0JICogCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERTd2l0Y2ggbW9kZWxTd2l0Y2ggPSBuZXcgRFREU3dpdGNoKCkgewotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50Q29udGVudChEVERFbGVtZW50Q29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbGVtZW50Q29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREdyb3VwQ29udGVudChEVERHcm91cENvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRER3JvdXBDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERBdHRyaWJ1dGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50KERUREVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVtcHR5Q29udGVudChEVERFbXB0eUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW1wdHlDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREQW55Q29udGVudChEVERBbnlDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREFueUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERQQ0RhdGFDb250ZW50KERURFBDRGF0YUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREUENEYXRhQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoRFREUmVwZWF0YWJsZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREUmVwZWF0YWJsZUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERGaWxlKERUREZpbGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERmlsZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREJhc2ljVHlwZShEVERCYXNpY1R5cGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFREQmFzaWNUeXBlQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW51bWVyYXRpb25UeXBlKERUREVudW1lcmF0aW9uVHlwZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFbnVtZXJhdGlvblR5cGVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVEROb3RhdGlvbihEVEROb3RhdGlvbiBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVEROb3RhdGlvbkFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eShEVERFbnRpdHkgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5Q29udGVudChEVERFbnRpdHlDb250ZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREVudGl0eUNvbnRlbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERFeHRlcm5hbEVudGl0eUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURUREludGVybmFsRW50aXR5KERUREludGVybmFsRW50aXR5IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZURUREludGVybmFsRW50aXR5QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZURURENvbnRlbnQoRFREQ29udGVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVEVERDb250ZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRU1vZGVsRWxlbWVudChFTW9kZWxFbGVtZW50IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFTmFtZWRFbGVtZW50KEVOYW1lZEVsZW1lbnQgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRU5hbWVkRWxlbWVudEFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVUeXBlZEVsZW1lbnQoRVR5cGVkRWxlbWVudCBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFVHlwZWRFbGVtZW50QWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFU3RydWN0dXJhbEZlYXR1cmVBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gY3JlYXRlRUF0dHJpYnV0ZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVDbGFzc2lmaWVyKEVDbGFzc2lmaWVyIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVDbGFzc2lmaWVyQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBjYXNlRUNsYXNzKEVDbGFzcyBvYmplY3QpIHsKLQkJCXJldHVybiBjcmVhdGVFQ2xhc3NBZGFwdGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGNhc2VFRGF0YVR5cGUoRURhdGFUeXBlIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVEYXRhVHlwZUFkYXB0ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgY2FzZUVFbnVtKEVFbnVtIG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVFbnVtQWRhcHRlcigpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBkZWZhdWx0Q2FzZShFT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIGNyZWF0ZUVPYmplY3RBZGFwdGVyKCk7Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpIHsKLQkJcmV0dXJuIChBZGFwdGVyKSBtb2RlbFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLQl9Ci0KLQotCS8qKgotCSAqIEJ5IGRlZmF1bHQgY3JlYXRlIG1ldGhvZHMgcmV0dXJuIG51bGwgc28gdGhhdCB3ZSBjYW4gZWFzaWx5IGlnbm9yZQotCSAqIGNhc2VzLiBJdCdzIHVzZWZ1bCB0byBpZ25vcmUgYSBjYXNlIHdoZW4gaW5oZXJpdGFuY2Ugd2lsbCBjYXRjaCBhbGwgdGhlCi0JICogY2FzZXMgYW55d2F5LgotCSAqLwotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREZpbGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVEROb3RhdGlvbkFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURENvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERFbnRpdHlDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHlBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERJbnRlcm5hbEVudGl0eUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERSZXBlYXRhYmxlQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERWxlbWVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVsZW1lbnRDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFRERW1wdHlDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQnkgZGVmYXVsdCBjcmVhdGUgbWV0aG9kcyByZXR1cm4gbnVsbCBzbyB0aGF0IHdlIGNhbiBlYXNpbHkgaWdub3JlCi0JICogY2FzZXMuIEl0J3MgdXNlZnVsIHRvIGlnbm9yZSBhIGNhc2Ugd2hlbiBpbmhlcml0YW5jZSB3aWxsIGNhdGNoIGFsbCB0aGUKLQkgKiBjYXNlcyBhbnl3YXkuCi0JICovCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVEVERBbnlDb250ZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRFREUENEYXRhQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREdyb3VwQ29udGVudEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREF0dHJpYnV0ZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREVudW1lcmF0aW9uVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZURUREJhc2ljVHlwZUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVDbGFzc0FkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVBdHRyaWJ1dGVBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFRW51bUFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVNb2RlbEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFTmFtZWRFbGVtZW50QWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRVN0cnVjdHVyYWxGZWF0dXJlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRURhdGFUeXBlQWRhcHRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIEFkYXB0ZXIgY3JlYXRlRU9iamVjdEFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBBZGFwdGVyIGNyZWF0ZUVUeXBlZEVsZW1lbnRBZGFwdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgQWRhcHRlciBjcmVhdGVFQ2xhc3NpZmllckFkYXB0ZXIoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBEVERBZGFwdGVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1ldHJpY3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERNZXRyaWNzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzA2ZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1ldHJpY3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLQotCi1wdWJsaWMgY2xhc3MgRFRETWV0cmljcyB7Ci0JcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQlwcm90ZWN0ZWQgSGFzaHRhYmxlIGVsZW1lbnRSZWZlcmVuY2VNYXA7Ci0KLQlwdWJsaWMgRFRETWV0cmljcyhEVERGaWxlIGR0ZEZpbGUpIHsKLQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRSZWZlcmVuY2VzKCkgewotCQlpZiAoZWxlbWVudFJlZmVyZW5jZU1hcCA9PSBudWxsKSB7Ci0JCQllbGVtZW50UmVmZXJlbmNlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJbmV3IERURFZpc2l0b3IoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCQkJCU9iamVjdCB2aXNpdGF0aW9uID0gZWxlbWVudFJlZmVyZW5jZU1hcC5nZXQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmICh2aXNpdGF0aW9uID09IG51bGwpIHsKLQkJCQkJCWVsZW1lbnRSZWZlcmVuY2VNYXAucHV0KGR0ZEVsZW1lbnQsIHZpc2l0YXRpb24gPSBuZXcgVmVjdG9yKCkpOwotCQkJCQl9Ci0JCQkJCSgoVmVjdG9yKSB2aXNpdGF0aW9uKS5hZGRFbGVtZW50KGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQl9Ci0JCQl9LnZpc2l0RFRERmlsZShkdGRGaWxlKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlTWFwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RWxlbWVudFJlZmVyZW5jZUNvdW50KERUREVsZW1lbnQgZHRkRWxlbWVudCkgewotCQlPYmplY3QgZWxlbWVudFJlZmVyZW5jZXMgPSBnZXRFbGVtZW50UmVmZXJlbmNlcygpLmdldChkdGRFbGVtZW50KTsKLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VzID09IG51bGwgPyAwIDogKChWZWN0b3IpIGVsZW1lbnRSZWZlcmVuY2VzKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIERUREVsZW1lbnQgZ2V0TGVhc3RSZWZlcmVuY2VkRWxlbWVudCgpIHsKLQkJRFRERWxlbWVudCByZXN1bHQgPSBudWxsOwotCQlpbnQgbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURUREVsZW1lbnQgZWxlbWVudCA9IChEVERFbGVtZW50KSBpLm5leHQoKTsKLQkJCWludCBjb3VudCA9IGdldEVsZW1lbnRSZWZlcmVuY2VDb3VudChlbGVtZW50KTsKLQkJCWlmIChjb3VudCA8IGxvd2VzdFJlZmVyZW5jZUNvdW50KSB7Ci0JCQkJcmVzdWx0ID0gZWxlbWVudDsKLQkJCQlsb3dlc3RSZWZlcmVuY2VDb3VudCA9IGNvdW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXRFbGVtZW50UmVmZXJlbmNlc0dlbigpIHsKLQotCQlpZiAoZWxlbWVudFJlZmVyZW5jZU1hcCA9PSBudWxsKSB7Ci0JCQllbGVtZW50UmVmZXJlbmNlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQkJbmV3IERURFZpc2l0b3IoKSB7Ci0KLQkJCQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IGVsZW1lbnRSZWZlcmVuY2VDb250ZW50LmdldFJlZmVyZW5jZWRFbGVtZW50KCk7Ci0JCQkJCU9iamVjdCB2aXNpdGF0aW9uID0gZWxlbWVudFJlZmVyZW5jZU1hcC5nZXQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmICh2aXNpdGF0aW9uID09IG51bGwpIHsKLQkJCQkJCWVsZW1lbnRSZWZlcmVuY2VNYXAucHV0KGR0ZEVsZW1lbnQsIHZpc2l0YXRpb24gPSBuZXcgVmVjdG9yKCkpOwotCQkJCQl9Ci0JCQkJCSgoVmVjdG9yKSB2aXNpdGF0aW9uKS5hZGRFbGVtZW50KGVsZW1lbnRSZWZlcmVuY2VDb250ZW50KTsKLQkJCQl9Ci0JCQl9LnZpc2l0RFRERmlsZShkdGRGaWxlKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50UmVmZXJlbmNlTWFwOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGdldEVsZW1lbnRSZWZlcmVuY2VDb3VudEdlbihEVERFbGVtZW50IGR0ZEVsZW1lbnQpIHsKLQotCQlPYmplY3QgZWxlbWVudFJlZmVyZW5jZXMgPSBnZXRFbGVtZW50UmVmZXJlbmNlcygpLmdldChkdGRFbGVtZW50KTsKLQkJcmV0dXJuIGVsZW1lbnRSZWZlcmVuY2VzID09IG51bGwgPyAwIDogKChWZWN0b3IpIGVsZW1lbnRSZWZlcmVuY2VzKS5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBEVERFbGVtZW50IGdldExlYXN0UmVmZXJlbmNlZEVsZW1lbnRHZW4oKSB7Ci0KLQkJRFRERWxlbWVudCByZXN1bHQgPSBudWxsOwotCQlpbnQgbG93ZXN0UmVmZXJlbmNlQ291bnQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotCQlDb2xsZWN0aW9uIGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURUREVsZW1lbnQgZWxlbWVudCA9IChEVERFbGVtZW50KSBpLm5leHQoKTsKLQkJCWludCBjb3VudCA9IGdldEVsZW1lbnRSZWZlcmVuY2VDb3VudChlbGVtZW50KTsKLQkJCWlmIChjb3VudCA8IGxvd2VzdFJlZmVyZW5jZUNvdW50KSB7Ci0JCQkJcmVzdWx0ID0gZWxlbWVudDsKLQkJCQlsb3dlc3RSZWZlcmVuY2VDb3VudCA9IGNvdW50OwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETW9kZWxCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRETW9kZWxCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZGM3NmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURE1vZGVsQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW1MaXRlcmFsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRWNvcmVQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGVLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERGVmYXVsdEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlSZWZlcmVuY2VDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW51bUdyb3VwS2luZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERJbnRlcm5hbEVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURE5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2NjdXJyZW5jZVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLmltcGwuRFRERmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5BdHROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQXR0bGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlci5DTU5vZGVUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01SZWZlcmVuY2VOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuQ01SZXBlYXRhYmxlTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkRURFNheEFydGlmYWN0VmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVsZW1lbnREZWNsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRW50aXR5RGVjbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLkVycm9yTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyLk5vdGF0aW9uRGVjbDsKLQotcHVibGljIGNsYXNzIERURE1vZGVsQnVpbGRlciBleHRlbmRzIERURFNheEFydGlmYWN0VmlzaXRvciB7Ci0JRFREIGR0ZDsKLQlEVERVdGlsIGR0ZFV0aWw7Ci0JRFRERmlsZSBkdGRGaWxlOwotCVJlc291cmNlU2V0IHJlc291cmNlczsKLQotCXB1YmxpYyBEVERNb2RlbEJ1aWxkZXIoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVERVdGlsIGR0ZFV0aWwsIERURCBkdGQsIERUREZpbGUgZHRkRmlsZSkgewotCQl0aGlzLnJlc291cmNlcyA9IHJlc291cmNlczsKLQkJdGhpcy5kdGRVdGlsID0gZHRkVXRpbDsKLQkJdGhpcy5kdGQgPSBkdGQ7Ci0JCXRoaXMuZHRkRmlsZSA9IGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIERUREZhY3RvcnlJbXBsIGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiAoRFRERmFjdG9yeUltcGwpIGR0ZFV0aWwuZ2V0RmFjdG9yeSgpOwotCX0KLQotCXB1YmxpYyBEVERGaWxlIGdldERUREZpbGUoKSB7Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREKERURCBkdGQpIHsKLQkJc3VwZXIudmlzaXREVEQoZHRkKTsKLQotCQkvLyAtIDJuZCBwYXNzIC0KLQkJLy8gZG8gZmluYWwgcHJvY2Vzc2luZyBmb3IgQXR0bGlzdHMgYW5kIGFkZGluZyBjb250ZW50TW9kZWwKLQkJYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChkdGQsIGR0ZEZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2woRWxlbWVudERlY2wgZWxlbWVudCkgewotCQkvLyBFbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCQlTdHJpbmcgZGVjbE5hbWUgPSBlbGVtZW50LmdldE5vZGVOYW1lKCk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbDoiICsgZGVjbE5hbWUgKTsKLQkJRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoZGVjbE5hbWUpOwotCQlpZiAoZHRkZWxlbWVudCA9PSBudWxsKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInByb2Nlc3MgRWxlbWVudERlY2wgLSBub3QgZm91bmQgLSBjcmVhdGUiCi0JCQkvLyApOwotCQkJZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JCQlkdGRlbGVtZW50LnNldE5hbWUoZGVjbE5hbWUpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JCQlkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KGRlY2xOYW1lLCBkdGRlbGVtZW50KTsKLQkJfQotCi0JCXN1cGVyLnZpc2l0RWxlbWVudERlY2woZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXROb3RhdGlvbkRlY2woTm90YXRpb25EZWNsIG5vdGF0aW9uKSB7Ci0JCS8vIE5vdGF0aW9uIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCQkvLyBieSBhbiBlbnRpdHkKLQkJRFRETm90YXRpb24gZHRkbm90ID0gZHRkRmlsZS5maW5kTm90YXRpb24obm90YXRpb24uZ2V0Tm9kZU5hbWUoKSk7Ci0JCWlmIChkdGRub3QgPT0gbnVsbCkgewotCQkJZHRkbm90ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JCQlkdGRGaWxlLmdldERURE9iamVjdCgpLmFkZChkdGRub3QpOwotCQl9Ci0JCWR0ZG5vdC5zZXROYW1lKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCi0JCWlmIChub3RhdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpCi0JCQlkdGRub3Quc2V0U3lzdGVtSUQobm90YXRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0JCWlmIChub3RhdGlvbi5nZXRQdWJsaWNJZCgpICE9IG51bGwpCi0JCQlkdGRub3Quc2V0UHVibGljSUQobm90YXRpb24uZ2V0UHVibGljSWQoKSk7Ci0KLQkJaWYgKG5vdGF0aW9uLmdldENvbW1lbnQoKSAhPSBudWxsKQotCQkJZHRkbm90LnNldENvbW1lbnQobm90YXRpb24uZ2V0Q29tbWVudCgpKTsKLQkJaWYgKG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkbm90KTsKLQkJfQotCi0JCXN1cGVyLnZpc2l0Tm90YXRpb25EZWNsKG5vdGF0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJLy8gVGhpcyBpcyBhIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlLgotCQkvLyBBZGQgdGhlIGxpbmsgdG8gdGhlIHJlYWwgZW50aXR5IHRoYXQgaXQgcmVmZXJlbmNlcwotCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudFJlZiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQocGFybUVudFJlZik7Ci0KLQkJU3RyaW5nIGVudGl0eU5hbWUgPSBlbnRpdHkuZ2V0Tm9kZU5hbWUoKTsKLQotCQkvLyBBZGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgRFRERW50aXR5Ci0JCURUREVudGl0eSBkdGRlbnRpdHkgPSBnZXREVERGaWxlKCkuZmluZEVudGl0eShlbnRpdHlOYW1lKTsKLQkJaWYgKGR0ZGVudGl0eSAhPSBudWxsKSB7Ci0JCQlwYXJtRW50UmVmLnNldEVudGl0eShkdGRlbnRpdHkpOwotCQl9Ci0JCWlmIChlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCkgIT0gbnVsbCkgewotCQkJYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkZW50aXR5KTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBQRSByZWZlcmVuY2U6ICIgKyBkZWNsTmFtZSk7Ci0KLQkJc3VwZXIudmlzaXRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VEZWNsKGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbEVudGl0eURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImFkZGluZyBlbnRpdHk6ICIgKyBkZWNsTmFtZSk7Ci0JCURUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFeHRlcm5hbEVudGl0eSgpOwotCQlkdGRFbnRpdHkuc2V0Q29udGVudChleHRFbnRpdHkpOwotCi0JCWZpbmlzaEV4dGVybmFsRW50aXR5KGV4dEVudGl0eSwgZW50aXR5KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXh0IGVudGl0eSB0b01vZjogIiApOwotCQlpZiAoZHRkRW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpIHsKLQotCQkJZHRkVXRpbC5nZXRQRVBvb2woKS5wdXQoIiUiICsgZW50aXR5LmdldE5vZGVOYW1lKCkgKyAiOyIsIGR0ZEVudGl0eSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJc3VwZXIudmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEludGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlEVERFbnRpdHkgZHRkRW50aXR5ID0gY3JlYXRlRFRERW50aXR5KGVudGl0eSk7Ci0KLQkJRFRESW50ZXJuYWxFbnRpdHkgaW50RW50aXR5ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREludGVybmFsRW50aXR5KCk7Ci0JCWR0ZEVudGl0eS5zZXRDb250ZW50KGludEVudGl0eSk7Ci0JCWludEVudGl0eS5zZXRWYWx1ZShlbnRpdHkuZ2V0VmFsdWUoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGludCBlbnRpdHkgdG9Nb2Y6ICIgKTsKLQkJaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQlkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIgKyBlbnRpdHkuZ2V0Tm9kZU5hbWUoKSArICI7IiwgZHRkRW50aXR5KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlzdXBlci52aXNpdEludGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRBdHRsaXN0QW5kQ29udGVudE1vZGVsKERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRBdHRMaXN0QW5kQ290ZW50TW9kZWwgLSBkdGQ6IiArCi0JCS8vIGR0ZC5nZXROYW1lKCkpOwotCQlFbnVtZXJhdGlvbiBlbiA9IGR0ZC5leHRlcm5hbEVsZW1lbnRzKCk7Ci0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCkgewotCQkJCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KCgoRWxlbWVudERlY2wpIGUpLmdldE5vZGVOYW1lKCkpOwotCQkJCWlmIChkdGRlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JCQkJCWR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCQkJCX0KLQkJCQlmaW5pc2hFbGVtZW50RGVjbChkdGRlbGVtZW50LCAoRWxlbWVudERlY2wpIGUpOwotCQkJfQotCQkJZWxzZSBpZiAoZSBpbnN0YW5jZW9mIEF0dGxpc3QpIHsKLQkJCQlwcm9jZXNzQXR0TGlzdCgoQXR0bGlzdCkgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQXR0TGlzdChBdHRsaXN0IGF0dExpc3QpIHsKLQkJRFRERWxlbWVudCBlID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJLy8gRWxlbWVudCBoYXMgYmVlbiBhZGRlZC4gQWRkIHRoZSBhdHRyaWJ1dGVzCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBwcm9jZXNzQXR0bGlzdCAtIGFkZGluZyBBdHRsaXN0OiIgKwotCQkJLy8gYXR0TGlzdC5nZXROb2RlTmFtZSgpKTsKLQkJCWNyZWF0ZUF0dHJpYnV0ZXMoZSwgYXR0TGlzdCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISEhISEhISBlbGVtZW50IGlzIG51bGwgIik7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8KLQkvLyBNZXRob2RzIGZvciBmaW5pc2hpbmcgdGhlIGltcG9ydCBvZiBhIERUREV4dGVybmFsRW50aXR5Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0Jdm9pZCBmaW5pc2hFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHksIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCQl1cGRhdGVTeXN0ZW1JRChleHRFbnRpdHksIGVudGl0eURlY2wpOwotCQlleHRFbnRpdHkuc2V0UHVibGljSUQoZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpKTsKLQotCQlTdHJpbmcgbm90YXRpb25OYW1lID0gZW50aXR5RGVjbC5nZXROb3RhdGlvbk5hbWUoKTsKLQkJaWYgKG5vdGF0aW9uTmFtZSAhPSBudWxsKSB7Ci0JCQlEVEROb3RhdGlvbiBkdGROb3RhdGlvbiA9IGNyZWF0ZU9yRmluZE5vdGF0aW9uKGV4dEVudGl0eSwgbm90YXRpb25OYW1lLCB0cnVlKTsKLQkJCWV4dEVudGl0eS5zZXROb3RhdGlvbihkdGROb3RhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm90YXRpb24gY3JlYXRlT3JGaW5kTm90YXRpb24oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkJRFRETm90YXRpb24gYU5vdGF0aW9uID0gZXh0RW50aXR5LmdldERUREVudGl0eSgpLmdldERUREZpbGUoKS5maW5kTm90YXRpb24obmFtZSk7Ci0JCWlmIChhTm90YXRpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGFOb3RhdGlvbjsKLQkJfQotCi0JCS8vCi0JCS8vIENyZWF0ZSBhIG5vdGF0aW9uIGZvciB0aGUgcmVmZXJlbmNlCi0JCS8vCi0JCWlmIChjcmVhdGUpIHsKLQkJCWFOb3RhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoYU5vdGF0aW9uKTsKLQkJCWFOb3RhdGlvbi5zZXROYW1lKG5hbWUpOwotCQl9Ci0JCXJldHVybiBhTm90YXRpb247Ci0JfQotCi0JLyoqCi0JICogVGhlIFN5c3RlbUlEIGF0dHJpYnV0ZSBpcyBzZXQgdG8gd2hhdGV2ZXIgdGhlIHVzZXIgZW50ZXJzIGUuZy4KLQkgKiBjb20vaWJtL2IyYi94bWltb2RlbHMveHh4LmR0ZC54bWkKLQkgKiAKLQkgKiBJbiB0aGUgdW5wYXJzZSgpIG1ldGhvZCwgcGFyc2Ugb3V0IHRoZSBEVEQgZmlsZSBuYW1lIGZyb20gdGhlIGNsYXNzcGF0aAotCSAqIG5hbWUuIGUuZy4gcmV0dXJucyB4eHguZHRkCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN5c3RlbUlEKERUREV4dGVybmFsRW50aXR5IGV4dEVudGl0eSwgRW50aXR5RGVjbCBlbnRpdHlEZWNsKSB7Ci0JCVN0cmluZyBzeXN0ZW1JZCA9IGVudGl0eURlY2wuZ2V0U3lzdGVtSWQoKTsKLQkJU3RyaW5nIHB1YmxpY0lkID0gZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCQlTdHJpbmcgdXJpID0gaWRSZXNvbHZlci5yZXNvbHZlKGR0ZC5nZXROYW1lKCksIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQlFeHRlcm5hbERURE1vZGVsIGVkID0gZHRkVXRpbC5nZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywgdXJpKTsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJRFRERmlsZSByZWZlcmVuY2VEdGRGaWxlID0gZWQuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JCQkJZXh0RW50aXR5LnNldEVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUocmVmZXJlbmNlRHRkRmlsZSk7Ci0JCQkJZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbnRpdHlEZWNsLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpIHsKLQkJCQkJRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCQkJCQlkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFICsgIiAnIiArIHN5c3RlbUlkICsgIiciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yLCBleHRFbnRpdHkuZ2V0RFRERW50aXR5KCkpOwotCQkJCX0KLQotCQkJCWlmIChzeXN0ZW1JZCAhPSBudWxsKSB7Ci0JCQkJCWV4dEVudGl0eS5zZXRTeXN0ZW1JRChzeXN0ZW1JZCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIHsKLQkJCS8vIHNldCB0aGUgc3lzdGVtIGlkIHRvIGJlICIiCi0JCQlleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRERW50aXR5IGNyZWF0ZURUREVudGl0eShFbnRpdHlEZWNsIGVudGl0eSkgewotCQkvLyBjcmVhdGUgYW5kIGRvIHdoYXQgd2UgY2FuIHRvIGZpbGwgaW4gc29tZSBiYXNpYyB0aGluZ3MKLQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnRpdHkoKTsKLQkJZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkRW50aXR5KTsKLQotCQlkdGRFbnRpdHkuc2V0TmFtZShlbnRpdHkuZ2V0Tm9kZU5hbWUoKSk7Ci0JCWR0ZEVudGl0eS5zZXRQYXJhbWV0ZXJFbnRpdHkoZW50aXR5LmlzUGFyYW1ldGVyKCkpOwotCQlpZiAoZW50aXR5LmdldENvbW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlkdGRFbnRpdHkuc2V0Q29tbWVudChlbnRpdHkuZ2V0Q29tbWVudCgpKTsKLQkJfQotCQlpZiAoZW50aXR5LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVudGl0eSk7Ci0JCX0KLQotCQlyZXR1cm4gZHRkRW50aXR5OwotCX0KLQotCi0JLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCS8vCi0JLy8gTWV0aG9kcyBmb3IgZmluaXNoaW5nIHRoZSBpbXBvcnQgb2YgYSBEVERFbGVtZW50Ci0JLy8KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JcHVibGljIHZvaWQgZmluaXNoRWxlbWVudERlY2woRFRERWxlbWVudCBkdGRFbGVtZW50LCBFbGVtZW50RGVjbCBlZCkgewotCQlkdGRFbGVtZW50LnNldE5hbWUoZWQuZ2V0Tm9kZU5hbWUoKSk7Ci0KLQkJQ01Ob2RlIGNtTm9kZSA9IGVkLmdldENvbnRlbnRNb2RlbE5vZGUoKTsKLQotCQlpZiAoZWQuZ2V0Q29tbWVudCgpICE9IG51bGwpIHsKLQkJCWR0ZEVsZW1lbnQuc2V0Q29tbWVudChlZC5nZXRDb21tZW50KCkpOwotCQl9Ci0JCWlmIChlZC5nZXRFcnJvck1lc3NhZ2UoKSAhPSBudWxsKSB7Ci0JCQlhZGRFcnJvck1lc3NhZ2UoZWQuZ2V0RXJyb3JNZXNzYWdlKCksIGR0ZEVsZW1lbnQpOwotCQl9Ci0KLQkJaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQlDTUJhc2ljTm9kZSBibiA9IChDTUJhc2ljTm9kZSkgY21Ob2RlOwotCQkJc3dpdGNoIChibi5nZXRUeXBlKCkpIHsKLQkJCQljYXNlIENNTm9kZVR5cGUuRU1QVFkgOgotCQkJCQlEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJCQlkdGRFbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIENNTm9kZVR5cGUuQU5ZIDoKLQkJCQkJRFREQW55Q29udGVudCBhbnlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREFueUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGFueUNvbnRlbnQpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQ01Ob2RlVHlwZS5QQ0RBVEEgOgotCQkJCQlEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JCQkJCWR0ZEVsZW1lbnQuc2V0Q29udGVudChwY0RhdGEpOwotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKSB7Ci0JCQlDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbU5vZGU7Ci0JCQlpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSkgewotCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQotCQkJCURUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCQkJCWlmIChhbkVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCS8vCi0JCQkJCS8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkvLyBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCQkJCQllblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0KLQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJZW5SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVuUmVmKTsKLQkJCQl9Ci0JCQkJZWxzZSB7IC8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRlbnQKLQkJCQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkJCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8KLQkJCQkvLyBGaW5kIHRoZSByZWFsIGVsZW1lbnQgZm9yIHRoaXMgZWxlbWVudCByZWZlcmVuY2VzCi0JCQkJLy8gSWYgdGhlIHJlYWwgZWxlbWVudCBkb2VzIG5vdCB5ZXQgZXhpc3QsIGNyZWF0ZSBpdAotCQkJCS8vCi0JCQkJRFRERWxlbWVudCBhbkVsZW1lbnQgPSBjcmVhdGVPckZpbmRFbGVtZW50KHJuLmdldE5hbWUoKSwgZHRkRWxlbWVudCk7Ci0KLQkJCQkvLwotCQkJCS8vIENyZWF0ZSBhbiBEVERFbGVtZW50UmVmZXJlbmNlIGFuZCBzZXQgaXRzIHJlZmVyZW5jZWQKLQkJCQkvLyBlbGVtZW50Ci0JCQkJLy8KLQkJCQlEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JCQkJZWxlbVJlZi5zZXRSZWZlcmVuY2VkRWxlbWVudChhbkVsZW1lbnQpOwotCi0JCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQllbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJLy8gc2V0Q29udGVudCB0byBEVERFbGVtZW50UmVmZXJlbmNlCi0JCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVsZW1SZWYpOwotCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCUNNR3JvdXBOb2RlIGdycE5vZGUgPSAoQ01Hcm91cE5vZGUpIGNtTm9kZTsKLQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRER3JvdXBDb250ZW50KCk7Ci0JCQlEVERHcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRER3JvdXBLaW5kLmdldChjb21wdXRlTW9mR3JvdXBLaW5kKGdycE5vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkJCWdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkJCURURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdycE5vZGUpKTsKLQkJCWdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQotCQkJLy8ganVzdCB1c2UgdGhlIGxvY2F0b3IgZm9yIHRoZSBlbGVtZW50IGFzIHRoZSBjbG9zZXN0IGd1ZXNzCi0JCQlwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCwgZ3JwTm9kZSk7Ci0JCQlkdGRFbGVtZW50LnNldENvbnRlbnQoZ3JvdXBDb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjbU5vZGUgPT0gbnVsbCkgewotCQkJLy8gYmFkIHRoaW5nIGhhcHBlbmVkIGhlcmUsIGp1c3QgY3JlYXRlIGEgcGNkYXRhCi0JCQlEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCQkJZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JCX0KLQotCi0JfQotCi0KLQkvKioKLQkgKiBBZGQgYSBuZXcgZ3JvdXAgdG8gdGhlIGN1cnJlbnQgZ3JvdXAKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgbm9kZSBmb3IgdGhpcyBncm91cCBlbGVtZW50Ci0JICogQHBhcmFtIG9wMU5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIGdyb3VwIGUuZy4gKGEsYikKLQkgKiBAcGFyYW0gb3AyTm9kZSAtCi0JICogICAgICAgICAgICBzZXQgb25seSBpZiBjYWxsZWQgYnkgcHJvY2Vzc0NNMW9wIGUuZy4gKGEsYikrCi0JICovCi0Jdm9pZCBwcm9jZXNzR3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBwYXJlbnQsIENNR3JvdXBOb2RlIGdycE5vZGUpIHsKLQkJRW51bWVyYXRpb24gY2hpbGRyZW4gPSBncnBOb2RlLmdldENoaWxkcmVuKCkuZWxlbWVudHMoKTsKLQkJRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCQl3aGlsZSAoY2hpbGRyZW4uaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUNNTm9kZSBjbm9kZSA9IChDTU5vZGUpIGNoaWxkcmVuLm5leHRFbGVtZW50KCk7Ci0KLQkJCWlmIChjbm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgZ05vZGUgPSAoQ01Hcm91cE5vZGUpIGNub2RlOwotCQkJCURUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCQkJCURUREdyb3VwS2luZCBncm91cEtpbmQgPSBEVERHcm91cEtpbmQuZ2V0KGNvbXB1dGVNb2ZHcm91cEtpbmQoZ05vZGUuZ2V0R3JvdXBLaW5kKCkpKTsKLQkJCQlncm91cENvbnRlbnQuc2V0R3JvdXBLaW5kKGdyb3VwS2luZCk7Ci0JCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2UoZ05vZGUpKTsKLQkJCQlncm91cENvbnRlbnQuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0KLQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChncm91cENvbnRlbnQpOwotCQkJCXByb2Nlc3NHcm91cENvbnRlbnQoZ3JvdXBDb250ZW50LCBnTm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJQ01CYXNpY05vZGUgbiA9IChDTUJhc2ljTm9kZSkgY25vZGU7Ci0JCQkJaWYgKG4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuUENEQVRBKSB7Ci0JCQkJCS8vIENyZWF0ZSBhIERURFBDRGF0YUNvbnRlbnQgZm9yIGEgbGVhZiBQQ0RhdGEgbm9kZQotCQkJCQkvLwotCQkJCQlEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGZhY3RvcnkuY3JlYXRlRFREUENEYXRhQ29udGVudCgpOwotCQkJCQkvLyBBZGQgI1BDREFUQSB0byB0aGUgR3JvdXAsIGkuZSBNaXhlZCBjb250ZW50IG1vZGVsCi0JCQkJCXBhcmVudC5nZXRDb250ZW50KCkuYWRkKHBjRGF0YSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoY25vZGUgaW5zdGFuY2VvZiBDTVJlZmVyZW5jZU5vZGUpIHsKLQkJCQlDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbm9kZTsKLQkJCQlpZiAocm4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJDTSBFbGVtZW50IFJlZiBuYW1lOiAiICsKLQkJCQkJLy8gcm4uZ2V0TmFtZSgpKTsKLQkJCQkJLy8KLQkJCQkJLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkvLyBlbGVtZW50Ci0JCQkJCS8vCi0JCQkJCURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1SZWYgPSBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0KLQkJCQkJLy8KLQkJCQkJLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCQkJCQkvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JCQkJCS8vCi0JCQkJCURUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGVsZW1SZWYpOwotCi0JCQkJCWVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQotCQkJCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCQkJCQllbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCS8vIEFkZCBEVERFbGVtZW50UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCQkJCQlwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlbGVtUmVmKTsKLQkJCQl9Ci0JCQkJZWxzZSAvLyBQRSBSZWZlcmVuY2UKLQkJCQl7Ci0JCQkJCVN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIFBFIFJlZiBuYW1lOiAiICsgZW50aXR5TmFtZSk7Ci0JCQkJCURUREVudGl0eSBhbkVudGl0eSA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KGVudGl0eU5hbWUpOwotCQkJCQlpZiAoYW5FbnRpdHkgIT0gbnVsbCkgewotCQkJCQkJLy8KLQkJCQkJCS8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZAotCQkJCQkJLy8gZWxlbWVudAotCQkJCQkJLy8KLQkJCQkJCURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQgZW5SZWYgPSBmYWN0b3J5LmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkJCQkJCWVuUmVmLnNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KGFuRW50aXR5KTsKLQotCQkJCQkJRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPSBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkJCQkJCWVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCi0JCQkJCQkvLyBBZGQgRFRERW50aXR5UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCQkJCQkJcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZW5SZWYpOwotCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSByZWFsIGVsZW1lbnQgdGhhdCBpcyByZWZlcmVuY2VkIGJ5IHRoZSBjdXJyZW50IGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIERUREVsZW1lbnQgY3JlYXRlT3JGaW5kRWxlbWVudChTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgewotCQkvLyBEVERFbGVtZW50IGFFbGVtZW50ID0gZ2V0RFRERmlsZSgpLmZpbmRFbGVtZW50KG5hbWUpOwotCi0JCURUREVsZW1lbnQgYUVsZW1lbnQgPSAoRFRERWxlbWVudCkgZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChuYW1lKTsKLQotCQlpZiAoYUVsZW1lbnQgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFFbGVtZW50OwotCQl9Ci0KLQkJU3RyaW5nIGVycm9yTXNnID0gRFREQ29yZU1lc3NhZ2VzLl9FUlJPUl9VTkRFQ0xBUkVEX0VMRU1FTlRfMTsgLy8kTk9OLU5MUy0xJAotCQllcnJvck1zZyArPSAiXCIiICsgbmFtZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQllcnJvck1zZyArPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9VTkRFQ0xBUkVEX0VMRU1FTlRfMjsgLy8kTk9OLU5MUy0xJAotCi0JCUVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQotCQlkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCQlhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIG9iaik7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvck1zZyk7Ci0JCS8vIHNldERUREVycm9yTWVzc2FnZShlcnJvck1zZyk7Ci0JCWdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCi0JCS8vCi0JCS8vIENyZWF0ZSBhbiBlbXB0eSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIHRvIG1ha2UgaXQgdmFsaWQKLQkJLy8KLQotCQlEVERGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JCURUREVsZW1lbnQgZHRkZWxlbWVudCA9IGZhY3RvcnkuY3JlYXRlRFRERWxlbWVudCgpOwotCQlkdGRlbGVtZW50LnNldE5hbWUobmFtZSk7Ci0KLQkJRFRERW1wdHlDb250ZW50IGVtcHR5Q29udGVudCA9IGZhY3RvcnkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JCWR0ZGVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCi0JCWdldERUREZpbGUoKS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JCWR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5wdXQobmFtZSwgZHRkZWxlbWVudCk7Ci0JCXJldHVybiBkdGRlbGVtZW50OwotCX0KLQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgTU9GIG9jY3VycmVuY2UgZnJvbSB0aGUgeG1sNGogb2NjdXJyZW5jZQotCSAqLwotCXByaXZhdGUgaW50IGNvbXB1dGVNb2ZPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUgcm5vZGUpIHsKLQkJaW50IG9jY3VycmVuY2UgPSBybm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JCWludCBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORTsKLQotCQlpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5aRVJPX09SX01PUkU7Ci0JCX0KLQkJZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKSB7Ci0JCQltb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFOwotCQl9Ci0JCWVsc2UgaWYgKG9jY3VycmVuY2UgPT0gQ01Ob2RlVHlwZS5PUFRJT05BTCkgewotCQkJbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PUFRJT05BTDsKLQkJfQotCQlyZXR1cm4gbW9mb2NjdXI7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSB0aGUgTU9GIG1vZGVsIGdyb3VwIGZyb20gdGhlIHhtbDRqIG1vZGVsIGdyb3VwCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZU1vZkdyb3VwS2luZChpbnQgdHlwZSkgewotCQlpZiAodHlwZSA9PSBDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSkgewotCQkJcmV0dXJuIERUREdyb3VwS2luZC5DSE9JQ0U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gRFRER3JvdXBLaW5kLlNFUVVFTkNFOwotCQl9Ci0JfQotCi0KLQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JLy8KLQkvLyBNZXRob2RzIGZvciBjcmVhdGluZyB0aGUgYXR0cmlidXRlcyBvZiBhIERUREVsZW1lbnQKLQkvLwotCS8vIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQlwdWJsaWMgdm9pZCBjcmVhdGVBdHRyaWJ1dGVzKERUREVsZW1lbnQgZWxlbWVudCwgQXR0bGlzdCBhdHRMaXN0KSB7Ci0JCWlmIChhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpICE9IG51bGwpIHsKLQkJCWFkZEVycm9yTWVzc2FnZShhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpLCBlbGVtZW50KTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0TGlzdC5zaXplKCk7IGkrKykgewotCQkJQXR0Tm9kZSBhZCA9IGF0dExpc3QuZWxlbWVudEF0KGkpOwotCQkJLy8gRFREQXR0cmlidXRlRWxlbWVudCBkdGRBdHQ9Ci0JCQkvLyBnZXREVERBdHRyaWJ1dGVFbGVtZW50KGEuZ2V0TmFtZSgpKTsKLQotCQkJLy8gb25seSBhZGQgdGhlIEF0dERlZiBpZiBpdCBpcyBub3QgYWRkZWQgeWV0Ci0JCQkvLyBpZ25vcmUgdGhlIGR1cCBBdHREZWYgYXMgZG9jdW1lbnRlZCBpbiB0aGUgWE1MIDEuMCBzcGVjcwotCQkJLy8gaWYoIGR0ZEF0dD09bnVsbCkKLQkJCWFkZEF0dHJpYnV0ZShlbGVtZW50LCBhZCk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIERUREF0dHJpYnV0ZSBmcm9tIHRoZSB4bWw0aiBhdHRyaWJ1dGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBdHRyaWJ1dGUoRFRERWxlbWVudCBkdGRlbGVtZW50LCBBdHROb2RlIGFkKSB7Ci0JCURUREF0dHJpYnV0ZSBkdGRhdHRyID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCQlkdGRlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpLmFkZChkdGRhdHRyKTsKLQkJZmluaXNoQXR0cmlidXRlKGR0ZGF0dHIsIGFkKTsKLQl9Ci0KLQkvLyBTdHVmZiBmb3IgcG9wdWxhdGluZyBhdHRyaWJ1dGUKLQlwdWJsaWMgdm9pZCBmaW5pc2hBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGR0ZGF0dHIsIEF0dE5vZGUgYXR0ZGVmKSB7Ci0JCWJvb2xlYW4gcGFyc2VFcnJvciA9IGZhbHNlOwotCi0JCWlmIChhdHRkZWYubmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi5uYW1lLnRyaW0oKTsKLQkJCURUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JCQlpZiAoZW4gIT0gbnVsbCkgewotCQkJCWR0ZGF0dHIuc2V0QXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCQkJfQotCQl9Ci0KLQkJZHRkYXR0ci5zZXROYW1lKGF0dGRlZi5uYW1lKTsKLQotCQlpbnQgYXR0clR5cGUgPSBhdHRkZWYuZ2V0RGVjbGFyZWRUeXBlKCk7Ci0KLQkJaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuUEVSRUZFUkVOQ0UgJiYgYXR0ZGVmLnR5cGUgIT0gbnVsbCkgewotCQkJU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi50eXBlLnRyaW0oKTsKLQkJCURUREVudGl0eSBlbiA9IChEVERFbnRpdHkpIGR0ZFV0aWwuZ2V0UEVQb29sKCkuZ2V0KHBlTmFtZSk7Ci0JCQlpZiAoZW4gIT0gbnVsbCkgewotCQkJCWR0ZGF0dHIuc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7IC8vIGhhY2ssCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHNvCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHdlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNhbgotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBnZXQKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYmFjawotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gZGVmYXVsdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyB2YWx1ZQotCQkJfQotCQkJZWxzZQotCQkJCS8vIHNldCBkZWZhdWx0IHR5cGUKLQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0NEQVRBKCkpOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlzd2l0Y2ggKGF0dHJUeXBlKSB7Ci0JCQkJY2FzZSBBdHROb2RlLkNEQVRBIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuRU5USVRJRVMgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5FTlRJVFkgOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUWSgpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQljYXNlIEF0dE5vZGUuSUQgOgotCQkJCQkvLyBjaGVjayBmb3IgZHVwbGljYXRlIElEIGF0dHJpYnV0ZQotCQkJCQlpZiAoaGFzSURBdHRyaWJ1dGUoZHRkYXR0cikpIHsKLQkJCQkJCVN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJZXJyTXNnICs9IGF0dGRlZi5uYW1lICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yOyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXRJRWxlbWVudCgpLnNldERUREVycm9yTWVzc2FnZShlcnJNc2cpOwotCQkJCQkJLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JCQkJCQlwYXJzZUVycm9yID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5JRFJFRiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUYoKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLklEUkVGUyA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUZTKCkpOwotCQkJCQlicmVhazsKLQotCQkJCWNhc2UgQXR0Tm9kZS5FTlVNRVJBVElPTiA6Ci0JCQkJCXNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGNyZWF0ZURUREVudW1lcmF0aW9uKGR0ZGF0dHIsIGF0dGRlZiwgRFRERW51bUdyb3VwS2luZC5OQU1FX1RPS0VOX0dST1VQKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5PVEFUSU9OIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLCBEVERFbnVtR3JvdXBLaW5kLk5PVEFUSU9OX0dST1VQKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5NVE9LRU4gOgotCQkJCQlzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX05NVE9LRU4oKSk7Ci0JCQkJCWJyZWFrOwotCi0JCQkJY2FzZSBBdHROb2RlLk5NVE9LRU5TIDoKLQkJCQkJc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpKTsKLQkJCQkJYnJlYWs7Ci0KLQkJCQlkZWZhdWx0IDoKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJ1Vua25vd24KLQkJCS8vIHR5cGUuLi4iICsgYXR0clR5cGUpOwotCQkJfQotCQl9Ci0KLQkJaW50IGF0dHJEZWZhdWx0ID0gYXR0ZGVmLmdldERlZmF1bHRUeXBlKCk7Ci0JCWludCBkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLklNUExJRUQ7Ci0JCXN3aXRjaCAoYXR0ckRlZmF1bHQpIHsKLQkJCWNhc2UgQXR0Tm9kZS5GSVhFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5GSVhFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLklNUExJRUQgOgotCQkJCWRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRDsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBBdHROb2RlLlJFUVVJUkVEIDoKLQkJCQlkZWZhdWx0S2luZCA9IERURERlZmF1bHRLaW5kLlJFUVVJUkVEOwotCQkJCWJyZWFrOwotCi0JCQljYXNlIEF0dE5vZGUuTk9GSVhFRCA6Ci0JCQkJZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5OT0ZJWEVEOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBVFRSICciICthdHRkZWYubmFtZSArICInIFVua25vd24gZGVmYXVsdAotCQkvLyB0eXBlLi4uICIgKyBhdHRyRGVmYXVsdCk7Ci0JCX0KLQotCQlEVEREZWZhdWx0S2luZCBkZWZhdWx0S2luZE9iaiA9IERURERlZmF1bHRLaW5kLmdldChkZWZhdWx0S2luZCk7Ci0JCWR0ZGF0dHIuc2V0RGVmYXVsdEtpbmQoZGVmYXVsdEtpbmRPYmopOwotCi0JCWlmIChwYXJzZUVycm9yKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlTdHJpbmcgZGVmYXVsdFZhbHVlID0gYXR0ZGVmLmRlZmF1bHRWYWx1ZTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlpZiAoYXR0clR5cGUgPT0gQXR0Tm9kZS5FTlVNRVJBVElPTiB8fCBhdHRyVHlwZSA9PSBBdHROb2RlLk5PVEFUSU9OKSB7Ci0JCQkJaWYgKCFpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZChhdHRkZWYsIGRlZmF1bHRWYWx1ZSkpIHsKLQkJCQkJU3RyaW5nIHR5cGVTdHJpbmcgPSAoYXR0clR5cGUgPT0gQXR0Tm9kZS5FTlVNRVJBVElPTiA/ICJlbnVtZXJhdGlvbiIgOiAibm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCVN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuX0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzE7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZXJyTXNnICs9IHR5cGVTdHJpbmcgKyBEVERDb3JlTWVzc2FnZXMuX1VJX0VSUk9SUEFSVF9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yOyAvLyROT04tTkxTLTEkCi0JCQkJCWVyck1zZyArPSBhdHRkZWYubmFtZSArICInIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JCQkJCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZHRkYXR0ci5zZXREZWZhdWx0VmFsdWVTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLQkJfQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREF0dHIgLSB0b01vZiBnZXREZWZhdWx0VmFsdWVTdHJpbmcgIiArCi0JCS8vIGdldERlZmF1bHRWYWx1ZVN0cmluZygpKTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlOiAiICsKLQkJLy8gZ2V0RGVmYXVsdFZhbHVlKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0lEQXR0cmlidXRlKERUREF0dHJpYnV0ZSBkdGRhdHRyKSB7Ci0JCWJvb2xlYW4gaGFzSUQgPSBmYWxzZTsKLQotCQlEVERFbGVtZW50IGVsZW1lbnQgPSBkdGRhdHRyLmdldERUREVsZW1lbnQoKTsKLQkJRUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCi0JCUl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCURUREF0dHJpYnV0ZSBhdHRyID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JCQlEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JCQlpZiAoZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpIHsKLQkJCQlpZiAoKChEVERCYXNpY1R5cGUpIGRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKSB7Ci0JCQkJCWhhc0lEID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoYXNJRDsKLQl9Ci0KLQlwdWJsaWMgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBTdHJpbmdbXSBlbnVtVmFsdWVzLCBpbnQgZW51bUtpbmQpIHsKLQkJRFRERW51bWVyYXRpb25UeXBlIGVudW1lcmF0aW9uID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVudW1lcmF0aW9uVHlwZSgpOwotCQlEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkJZW51bWVyYXRpb24uc2V0S2luZChncm91cEtpbmQpOwotCQkvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkJaWYgKGVudW1WYWx1ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCQkJLy8gZW51bVZhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCQkJCS8vIE1PRjJFTUYgUG9ydAotCQkJCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwoZW51bVZhbHVlc1tpXSk7Ci0JCQkJZW51bUxpdGVyYWwuc2V0TmFtZShlbnVtVmFsdWVzW2ldKTsKLQotCQkJCS8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKTsKLQkJCQllbnVtZXJhdGlvbi5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCQkJfQotCQl9Ci0JCWR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bWVyYXRpb24pOwotCQlyZXR1cm4gZW51bWVyYXRpb247Ci0JfQotCi0JcHJpdmF0ZSBFRW51bUxpdGVyYWwgY3JlYXRlRUVudW1MaXRlcmFsKCkgewotCQlFY29yZVBhY2thZ2UgZVBhY2thZ2UgPSAoRWNvcmVQYWNrYWdlKSBFUGFja2FnZS5SZWdpc3RyeS5JTlNUQU5DRS5nZXRFUGFja2FnZShFY29yZVBhY2thZ2UuZU5TX1VSSSk7Ci0JCS8vIE1PRjJFTUYgUG9ydAotCQkvLyByZXR1cm4gKChFY29yZUZhY3RvcnkpZVBhY2thZ2UuZ2V0RmFjdG9yeSgpKS5jcmVhdGVFRW51bUxpdGVyYWwoKTsKLQkJcmV0dXJuIGVQYWNrYWdlLmdldEVjb3JlRmFjdG9yeSgpLmNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCX0KLQotCXByaXZhdGUgRFRERW51bWVyYXRpb25UeXBlIGNyZWF0ZURUREVudW1lcmF0aW9uKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZiwgaW50IGVudW1LaW5kKSB7Ci0JCURUREVudW1lcmF0aW9uVHlwZSBlbnVtZXJhdGlvbiA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkJRFRERW51bUdyb3VwS2luZCBncm91cEtpbmQgPSBEVERFbnVtR3JvdXBLaW5kLmdldChlbnVtS2luZCk7Ci0JCWVudW1lcmF0aW9uLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkJZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLmdldERUREVudW1lcmF0aW9uVHlwZSgpLmFkZChlbnVtZXJhdGlvbik7Ci0KLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCUVudW1lcmF0aW9uIHRva2VuSXRlciA9IGF0dGRlZi5lbGVtZW50cygpOwotCQlpZiAodG9rZW5JdGVyICE9IG51bGwpIHsKLQkJCXdoaWxlICh0b2tlbkl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlTdHJpbmcgdmFsID0gKFN0cmluZykgdG9rZW5JdGVyLm5leHRFbGVtZW50KCk7Ci0JCQkJRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JCQkJLy8gZW51bUxpdGVyYWwuc2V0WE1JRG9jdW1lbnQoZHRkYXR0ci5nZXRYTUlEb2N1bWVudCgpKTsKLQkJCQkvLyBNT0YyRU1GIFBvcnQKLQkJCQkvLyBlbnVtTGl0ZXJhbC5yZWZTZXRMaXRlcmFsKHZhbCk7Ci0JCQkJZW51bUxpdGVyYWwuc2V0TmFtZSh2YWwpOwotCi0KLQkJCQkvLyBlbnVtTGl0ZXJhbC5zZXROdW1iZXIoaSsrKTsKLQkJCQllbnVtZXJhdGlvbi5nZXRFbnVtTGl0ZXJhbHMoKS5hZGQoZW51bUxpdGVyYWwpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGVudW1lcmF0aW9uOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZChBdHROb2RlIGF0dGRlZiwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgewotCQlib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JCWJvb2xlYW4gY29udGFpbnNQZXJjZW50ID0gZmFsc2U7Ci0KLQkJLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JCUVudW1lcmF0aW9uIGVudW1WYWx1ZXMgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkJd2hpbGUgKGVudW1WYWx1ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCVN0cmluZyB2YWwgPSAoU3RyaW5nKSBlbnVtVmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JCQlpZiAodmFsLmVxdWFscyhkZWZhdWx0VmFsdWUpKSB7Ci0JCQkJdmFsaWQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHZhbC5pbmRleE9mKCclJykgPj0gMCkgewotCQkJCWNvbnRhaW5zUGVyY2VudCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkIHx8IGNvbnRhaW5zUGVyY2VudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyRFREVHlwZShEVERBdHRyaWJ1dGUgZHRkYXR0ciwgRFREVHlwZSB0eXBlKSB7Ci0JCWR0ZGF0dHIuc2V0RFREVHlwZSh0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIGVyck1zZywgT2JqZWN0IG9iaikgewotCQllcnJNc2cuc2V0T2JqZWN0KG9iaik7Ci0JCWR0ZFV0aWwuYWRkRXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmFjdG9yeUltcGwgZ2V0RmFjdG9yeUdlbigpIHsKLQkvLwotCS8vIHJldHVybiAoRFRERmFjdG9yeUltcGwpZHRkVXRpbC5nZXRGYWN0b3J5KCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREZpbGUgZ2V0RFRERmlsZUdlbigpIHsKLQkvLwotCS8vIHJldHVybiBkdGRGaWxlOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRER2VuKERURCBkdGQpIHsKLQkvLwotCS8vIHN1cGVyLnZpc2l0RFREKGR0ZCk7Ci0JLy8KLQkvLwotCS8vIC8vIC0gMm5kIHBhc3MgLQotCS8vIC8vIGRvIGZpbmFsIHByb2Nlc3NpbmcgZm9yIEF0dGxpc3RzIGFuZCBhZGRpbmcgY29udGVudE1vZGVsCi0JLy8gYWRkQXR0bGlzdEFuZENvbnRlbnRNb2RlbChkdGQsZHRkRmlsZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRFbGVtZW50RGVjbEdlbihFbGVtZW50RGVjbCBlbGVtZW50KSB7Ci0JLy8KLQkvLyAvLyBFbGVtZW50IG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCBlYXJsaWVyIGJlY2F1c2UgaXQgaXMgcmVmZXJlbmNlZAotCS8vIFN0cmluZyBkZWNsTmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSA7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcm9jZXNzIEVsZW1lbnREZWNsOiIgKyBkZWNsTmFtZSApOwotCS8vIERUREVsZW1lbnQgZHRkZWxlbWVudCA9IChEVERFbGVtZW50KQotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoZGVjbE5hbWUpOwotCS8vIGlmIChkdGRlbGVtZW50ID09IG51bGwpCi0JLy8gewotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigicHJvY2VzcyBFbGVtZW50RGVjbCAtIG5vdCBmb3VuZCAtIGNyZWF0ZSIgKTsKLQkvLyBkdGRlbGVtZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVsZW1lbnQoKTsKLQkvLyBkdGRlbGVtZW50LnNldE5hbWUoZGVjbE5hbWUpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZGVsZW1lbnQpOwotCS8vIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5wdXQoZGVjbE5hbWUsZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdEVsZW1lbnREZWNsKGVsZW1lbnQpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0Tm90YXRpb25EZWNsR2VuKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCS8vCi0JLy8gLy8gTm90YXRpb24gbWlnaHQgaGF2ZSBiZWVuIGFkZGVkIGVhcmxpZXIgYmVjYXVzZSBpdCBpcyByZWZlcmVuY2VkCi0JLy8gLy8gYnkgYW4gZW50aXR5Ci0JLy8gRFRETm90YXRpb24gZHRkbm90ID0gZHRkRmlsZS5maW5kTm90YXRpb24oIG5vdGF0aW9uLmdldE5vZGVOYW1lKCkgKTsKLQkvLyBpZiAoZHRkbm90ID09IG51bGwpCi0JLy8gewotCS8vIGR0ZG5vdCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVEROb3RhdGlvbigpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKGR0ZG5vdCk7Ci0JLy8gfQotCS8vIGR0ZG5vdC5zZXROYW1lKG5vdGF0aW9uLmdldE5vZGVOYW1lKCkpOwotCS8vCi0JLy8KLQkvLyBpZiAobm90YXRpb24uZ2V0U3lzdGVtSWQoKSE9IG51bGwgKQotCS8vIGR0ZG5vdC5zZXRTeXN0ZW1JRChub3RhdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkvLyBpZiAobm90YXRpb24uZ2V0UHVibGljSWQoKSE9IG51bGwgKQotCS8vIGR0ZG5vdC5zZXRQdWJsaWNJRChub3RhdGlvbi5nZXRQdWJsaWNJZCgpKTsKLQkvLwotCS8vCi0JLy8gaWYgKG5vdGF0aW9uLmdldENvbW1lbnQoKSE9bnVsbCkKLQkvLyBkdGRub3Quc2V0Q29tbWVudChub3RhdGlvbi5nZXRDb21tZW50KCkpOwotCS8vIGlmIChub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKG5vdGF0aW9uLmdldEVycm9yTWVzc2FnZSgpLCBkdGRub3QpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXROb3RhdGlvbkRlY2wobm90YXRpb24pOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0UGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlRGVjbEdlbihFbnRpdHlEZWNsIGVudGl0eSkKLQkvLyB7Ci0JLy8KLQkvLyAvLyBUaGlzIGlzIGEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UuCi0JLy8gLy8gQWRkIHRoZSBsaW5rIHRvIHRoZSByZWFsIGVudGl0eSB0aGF0IGl0IHJlZmVyZW5jZXMKLQkvLyBEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudFJlZiA9Ci0JLy8gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgpOwotCS8vIGR0ZEZpbGUuZ2V0RFRET2JqZWN0KCkuYWRkKHBhcm1FbnRSZWYpOwotCS8vCi0JLy8KLQkvLyBTdHJpbmcgZW50aXR5TmFtZSA9IGVudGl0eS5nZXROb2RlTmFtZSgpOwotCS8vCi0JLy8KLQkvLyAvLyBBZGQgdGhlIHJlZmVyZW5jZSB0byB0aGUgRFRERW50aXR5Ci0JLy8gRFRERW50aXR5IGR0ZGVudGl0eSA9IGdldERUREZpbGUoKS5maW5kRW50aXR5KGVudGl0eU5hbWUpOwotCS8vIGlmIChkdGRlbnRpdHkgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcGFybUVudFJlZi5zZXRFbnRpdHkoZHRkZW50aXR5KTsKLQkvLyB9Ci0JLy8gaWYgKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkZW50aXR5KTsKLQkvLyB9Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJhZGRpbmcgUEUgcmVmZXJlbmNlOiAiICsgZGVjbE5hbWUpOwotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdEV4dGVybmFsRW50aXR5RGVjbEdlbihFbnRpdHlEZWNsIGVudGl0eSkgewotCS8vCi0JLy8gRFRERW50aXR5IGR0ZEVudGl0eSA9IGNyZWF0ZURUREVudGl0eShlbnRpdHkpOwotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiYWRkaW5nIGVudGl0eTogIiArIGRlY2xOYW1lKTsKLQkvLyBEVERFeHRlcm5hbEVudGl0eSBleHRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERXh0ZXJuYWxFbnRpdHkoKTsKLQkvLyBkdGRFbnRpdHkuc2V0Q29udGVudChleHRFbnRpdHkpOwotCS8vCi0JLy8KLQkvLyBmaW5pc2hFeHRlcm5hbEVudGl0eShleHRFbnRpdHksIGVudGl0eSk7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCIgZXh0IGVudGl0eSB0b01vZjogIiApOwotCS8vIGlmIChkdGRFbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkKLQkvLyB7Ci0JLy8KLQkvLwotCS8vIGR0ZFV0aWwuZ2V0UEVQb29sKCkucHV0KCIlIitlbnRpdHkuZ2V0Tm9kZU5hbWUoKSsiOyIsIGR0ZEVudGl0eSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBzdXBlci52aXNpdEV4dGVybmFsRW50aXR5RGVjbChlbnRpdHkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsR2VuKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JLy8KLQkvLyBEVERFbnRpdHkgZHRkRW50aXR5ID0gY3JlYXRlRFRERW50aXR5KGVudGl0eSk7Ci0JLy8KLQkvLwotCS8vIERUREludGVybmFsRW50aXR5IGludEVudGl0eSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERJbnRlcm5hbEVudGl0eSgpOwotCS8vIGR0ZEVudGl0eS5zZXRDb250ZW50KGludEVudGl0eSk7Ci0JLy8gaW50RW50aXR5LnNldFZhbHVlKGVudGl0eS5nZXRWYWx1ZSgpKTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBpbnQgZW50aXR5IHRvTW9mOiAiICk7Ci0JLy8gaWYgKGR0ZEVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCS8vIHsKLQkvLyBkdGRVdGlsLmdldFBFUG9vbCgpLnB1dCgiJSIrZW50aXR5LmdldE5vZGVOYW1lKCkrIjsiLCBkdGRFbnRpdHkpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gc3VwZXIudmlzaXRJbnRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBhZGRBdHRsaXN0QW5kQ29udGVudE1vZGVsR2VuKERURCBkdGQsIERUREZpbGUgZEZpbGUpIHsKLQkvLwotCS8vIC8vU3lzdGVtLm91dC5wcmludGxuKCJhZGRBdHRMaXN0QW5kQ290ZW50TW9kZWwgLSBkdGQ6IiArCi0JLy8gZHRkLmdldE5hbWUoKSk7Ci0JLy8gRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCS8vIHdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCS8vIGlmICggZSBpbnN0YW5jZW9mIEVsZW1lbnREZWNsICkKLQkvLyB7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gKERUREVsZW1lbnQpIGR0ZFV0aWwuZ2V0RWxlbWVudFBvb2woKS5nZXQoCi0JLy8gKChFbGVtZW50RGVjbCllKS5nZXROb2RlTmFtZSgpICk7Ci0JLy8gaWYgKGR0ZGVsZW1lbnQgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkZWxlbWVudCA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkZWxlbWVudCk7Ci0JLy8gfQotCS8vIGZpbmlzaEVsZW1lbnREZWNsKGR0ZGVsZW1lbnQsIChFbGVtZW50RGVjbCkgZSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKCBlIGluc3RhbmNlb2YgQXR0bGlzdCApCi0JLy8gewotCS8vIHByb2Nlc3NBdHRMaXN0KChBdHRsaXN0KSBlKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NBdHRMaXN0R2VuKEF0dGxpc3QgYXR0TGlzdCkgewotCS8vCi0JLy8gRFRERWxlbWVudCBlID0gKERUREVsZW1lbnQpCi0JLy8gZHRkVXRpbC5nZXRFbGVtZW50UG9vbCgpLmdldChhdHRMaXN0LmdldE5vZGVOYW1lKCkpOwotCS8vIGlmICggZSAhPSBudWxsICkKLQkvLyB7Ci0JLy8gLy8gRWxlbWVudCBoYXMgYmVlbiBhZGRlZC4gQWRkIHRoZSBhdHRyaWJ1dGVzCi0JLy8gLy9TeXN0ZW0ub3V0LnByaW50bG4oIiBwcm9jZXNzQXR0bGlzdCAtIGFkZGluZyBBdHRsaXN0OiIgKwotCS8vIGF0dExpc3QuZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8gY3JlYXRlQXR0cmlidXRlcyhlLCBhdHRMaXN0KTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyAvL1N5c3RlbS5vdXQucHJpbnRsbigiISEhISEhISEhIGVsZW1lbnQgaXMgbnVsbCAiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoRXh0ZXJuYWxFbnRpdHlHZW4oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LAotCS8vIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCS8vCi0JLy8gdXBkYXRlU3lzdGVtSUQoZXh0RW50aXR5LCBlbnRpdHlEZWNsKTsKLQkvLyBleHRFbnRpdHkuc2V0UHVibGljSUQoZW50aXR5RGVjbC5nZXRQdWJsaWNJZCgpKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIG5vdGF0aW9uTmFtZSA9IGVudGl0eURlY2wuZ2V0Tm90YXRpb25OYW1lKCk7Ci0JLy8gaWYgKG5vdGF0aW9uTmFtZSAhPSBudWxsKQotCS8vIHsKLQkvLyBEVEROb3RhdGlvbiBkdGROb3RhdGlvbiA9IGNyZWF0ZU9yRmluZE5vdGF0aW9uKGV4dEVudGl0eSwKLQkvLyBub3RhdGlvbk5hbWUsdHJ1ZSk7Ci0JLy8gZXh0RW50aXR5LnNldE5vdGF0aW9uKGR0ZE5vdGF0aW9uKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERURE5vdGF0aW9uIGNyZWF0ZU9yRmluZE5vdGF0aW9uR2VuKERUREV4dGVybmFsRW50aXR5Ci0JLy8gZXh0RW50aXR5LCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBjcmVhdGUpIHsKLQkvLwotCS8vIERURE5vdGF0aW9uIGFOb3RhdGlvbiA9Ci0JLy8gZXh0RW50aXR5LmdldERUREVudGl0eSgpLmdldERUREZpbGUoKS5maW5kTm90YXRpb24obmFtZSk7Ci0JLy8gaWYgKGFOb3RhdGlvbiAhPSBudWxsKQotCS8vIHsKLQkvLyByZXR1cm4gYU5vdGF0aW9uOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYSBub3RhdGlvbiBmb3IgdGhlIHJlZmVyZW5jZQotCS8vIC8vCi0JLy8gaWYgKGNyZWF0ZSkKLQkvLyB7Ci0JLy8gYU5vdGF0aW9uID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURURE5vdGF0aW9uKCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoYU5vdGF0aW9uKTsKLQkvLyBhTm90YXRpb24uc2V0TmFtZShuYW1lKTsKLQkvLyB9Ci0JLy8gcmV0dXJuIGFOb3RhdGlvbjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBUaGUgU3lzdGVtSUQgYXR0cmlidXRlIGlzIHNldCB0byB3aGF0ZXZlciB0aGUgdXNlciBlbnRlcnMKLQkvLyAqIGUuZy4gY29tL2libS9iMmIveG1pbW9kZWxzL3h4eC5kdGQueG1pCi0JLy8gKgotCS8vICogSW4gdGhlIHVucGFyc2UoKSBtZXRob2QsIHBhcnNlIG91dCB0aGUgRFREIGZpbGUgbmFtZSBmcm9tCi0JLy8gKiB0aGUgY2xhc3NwYXRoIG5hbWUuCi0JLy8gKiBlLmcuIHJldHVybnMgeHh4LmR0ZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3lzdGVtSURHZW4oRFRERXh0ZXJuYWxFbnRpdHkgZXh0RW50aXR5LAotCS8vIEVudGl0eURlY2wgZW50aXR5RGVjbCkgewotCS8vCi0JLy8gU3RyaW5nIHN5c3RlbUlkID0gZW50aXR5RGVjbC5nZXRTeXN0ZW1JZCgpOwotCS8vIFN0cmluZyBwdWJsaWNJZCA9IGVudGl0eURlY2wuZ2V0UHVibGljSWQoKTsKLQkvLyBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gSWRSZXNvbHZlciBpZFJlc29sdmVyID0gbmV3IElkUmVzb2x2ZXJJbXBsKGR0ZC5nZXROYW1lKCkpOwotCS8vIFN0cmluZyB1cmkgPSBpZFJlc29sdmVyLnJlc29sdmVJZChwdWJsaWNJZCwgc3lzdGVtSWQpOwotCS8vIEV4dGVybmFsRFRETW9kZWwgZWQgPSBkdGRVdGlsLmdldEV4dGVybmFsRFRETW9kZWwocmVzb3VyY2VzLCB1cmkpOwotCS8vIGlmIChlZCAhPSBudWxsKQotCS8vIHsKLQkvLyBEVERGaWxlIHJlZmVyZW5jZUR0ZEZpbGUgPSBlZC5nZXRFeHRlcm5hbERUREZpbGUoKTsKLQkvLyBleHRFbnRpdHkuc2V0RW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZShyZWZlcmVuY2VEdGRGaWxlKTsKLQkvLyBleHRFbnRpdHkuc2V0U3lzdGVtSUQoc3lzdGVtSWQpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIGlmIChlbnRpdHlEZWNsLmdldEVycm9yTWVzc2FnZSgpID09IG51bGwpCi0JLy8gewotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoRFREQ29yZU1lc3NhZ2VzLmdldFN0cmluZygiX0VSUk9SX0lOQ0xfRklMRV9MT0FEX0ZBSUxVUkUiKQotCS8vICsgIiAnIiArIHN5c3RlbUlkICsgIiciKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIGV4dEVudGl0eS5nZXREVERFbnRpdHkoKSk7Ci0JLy8gfQotCS8vICAgICAgICAKLQkvLyBpZiAoc3lzdGVtSWQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKHN5c3RlbUlkKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBleHRFbnRpdHkuc2V0U3lzdGVtSUQoIiIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyBlbHNlCi0JLy8gewotCS8vIC8vIHNldCB0aGUgc3lzdGVtIGlkIHRvIGJlICIiCi0JLy8gZXh0RW50aXR5LnNldFN5c3RlbUlEKCIiKTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREVudGl0eSBjcmVhdGVEVERFbnRpdHlHZW4oRW50aXR5RGVjbCBlbnRpdHkpIHsKLQkvLwotCS8vIC8vIGNyZWF0ZSBhbmQgZG8gd2hhdCB3ZSBjYW4gdG8gZmlsbCBpbiBzb21lIGJhc2ljIHRoaW5ncwotCS8vIERUREVudGl0eSBkdGRFbnRpdHkgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5KCk7Ci0JLy8gZHRkRmlsZS5nZXREVERPYmplY3QoKS5hZGQoZHRkRW50aXR5KTsKLQkvLwotCS8vCi0JLy8gZHRkRW50aXR5LnNldE5hbWUoZW50aXR5LmdldE5vZGVOYW1lKCkpOwotCS8vIGR0ZEVudGl0eS5zZXRQYXJhbWV0ZXJFbnRpdHkoZW50aXR5LmlzUGFyYW1ldGVyKCkpOwotCS8vIGlmIChlbnRpdHkuZ2V0Q29tbWVudCgpIT1udWxsKQotCS8vIHsKLQkvLyBkdGRFbnRpdHkuc2V0Q29tbWVudChlbnRpdHkuZ2V0Q29tbWVudCgpKTsKLQkvLyB9Ci0JLy8gaWYgKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSE9bnVsbCkKLQkvLyB7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGVudGl0eS5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkRW50aXR5KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIHJldHVybiBkdGRFbnRpdHk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoRWxlbWVudERlY2xHZW4oRFRERWxlbWVudCBkdGRFbGVtZW50LCBFbGVtZW50RGVjbAotCS8vIGVkKSB7Ci0JLy8KLQkvLyBkdGRFbGVtZW50LnNldE5hbWUoZWQuZ2V0Tm9kZU5hbWUoKSk7Ci0JLy8KLQkvLwotCS8vIENNTm9kZSBjbU5vZGUgPSBlZC5nZXRDb250ZW50TW9kZWxOb2RlKCk7Ci0JLy8KLQkvLwotCS8vIGlmIChlZC5nZXRDb21tZW50KCkhPW51bGwpCi0JLy8gewotCS8vIGR0ZEVsZW1lbnQuc2V0Q29tbWVudChlZC5nZXRDb21tZW50KCkpOwotCS8vIH0KLQkvLyBpZiAoZWQuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlZC5nZXRFcnJvck1lc3NhZ2UoKSwgZHRkRWxlbWVudCk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpCi0JLy8gewotCS8vIENNQmFzaWNOb2RlIGJuID0gKENNQmFzaWNOb2RlKWNtTm9kZTsKLQkvLyBzd2l0Y2ggKGJuLmdldFR5cGUoKSkKLQkvLyB7Ci0JLy8gY2FzZSBDTU5vZGVUeXBlLkVNUFRZIDoKLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIENNTm9kZVR5cGUuQU5ZIDoKLQkvLyBEVERBbnlDb250ZW50IGFueUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFREQW55Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChhbnlDb250ZW50KTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBDTU5vZGVUeXBlLlBDREFUQToKLQkvLyBEVERQQ0RhdGFDb250ZW50IHBjRGF0YSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KHBjRGF0YSk7Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY21Ob2RlIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKQotCS8vIHsKLQkvLyBDTVJlZmVyZW5jZU5vZGUgcm4gPSAoQ01SZWZlcmVuY2VOb2RlKSBjbU5vZGU7Ci0JLy8gaWYgKHJuLmdldFR5cGUoKSA9PSBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpCi0JLy8gewotCS8vIFN0cmluZyBlbnRpdHlOYW1lID0gcm4uZ2V0TmFtZSgpLnRyaW0oKTsKLQkvLwotCS8vCi0JLy8gRFRERW50aXR5IGFuRW50aXR5ID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQoZW50aXR5TmFtZSk7Ci0JLy8gaWYgKGFuRW50aXR5IT1udWxsKQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0KLQkvLyBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgpOwotCS8vIGVuUmVmLnNldEVsZW1lbnRSZWZlcmVuY2VkRW50aXR5KGFuRW50aXR5KTsKLQkvLwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlblJlZi5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlblJlZik7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7IC8vIGNyZWF0ZSBkZWZhdWx0IGNvbnRlbnQKLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREVtcHR5Q29udGVudCgpOwotCS8vIGR0ZEVsZW1lbnQuc2V0Q29udGVudChlbXB0eUNvbnRlbnQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIEZpbmQgdGhlIHJlYWwgZWxlbWVudCBmb3IgdGhpcyBlbGVtZW50IHJlZmVyZW5jZXMKLQkvLyAvLyBJZiB0aGUgcmVhbCBlbGVtZW50IGRvZXMgbm90IHlldCBleGlzdCwgY3JlYXRlIGl0Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50IGFuRWxlbWVudCA9IGNyZWF0ZU9yRmluZEVsZW1lbnQocm4uZ2V0TmFtZSgpLCBkdGRFbGVtZW50KTsKLQkvLwotCS8vCi0JLy8gLy8KLQkvLyAvLyBDcmVhdGUgYW4gRFRERWxlbWVudFJlZmVyZW5jZSBhbmQgc2V0IGl0cyByZWZlcmVuY2VkIGVsZW1lbnQKLQkvLyAvLwotCS8vIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IGVsZW1SZWYgPQotCS8vIGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgpOwotCS8vIGVsZW1SZWYuc2V0UmVmZXJlbmNlZEVsZW1lbnQoYW5FbGVtZW50KTsKLQkvLwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2Uocm4pKTsKLQkvLyBlbGVtUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gLy8gc2V0Q29udGVudCB0byBEVERFbGVtZW50UmVmZXJlbmNlCi0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVsZW1SZWYpOwotCS8vCi0JLy8KLQkvLyB9Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNtTm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKQotCS8vIHsKLQkvLyBDTUdyb3VwTm9kZSBncnBOb2RlID0gKENNR3JvdXBOb2RlKWNtTm9kZTsKLQkvLyBEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50ID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCS8vIERUREdyb3VwS2luZCBncm91cEtpbmQgPQotCS8vIERUREdyb3VwS2luZC5nZXQoY29tcHV0ZU1vZkdyb3VwS2luZChncnBOb2RlLmdldEdyb3VwS2luZCgpKSk7Ci0JLy8gZ3JvdXBDb250ZW50LnNldEdyb3VwS2luZChncm91cEtpbmQpOwotCS8vIERURE9jY3VycmVuY2VUeXBlIG9jY3VycmVuY2VUeXBlID0KLQkvLyBEVERPY2N1cnJlbmNlVHlwZS5nZXQoY29tcHV0ZU1vZk9jY3VycmVuY2UoZ3JwTm9kZSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRPY2N1cnJlbmNlKG9jY3VycmVuY2VUeXBlKTsKLQkvLwotCS8vIC8vIGp1c3QgdXNlIHRoZSBsb2NhdG9yIGZvciB0aGUgZWxlbWVudCBhcyB0aGUgY2xvc2VzdCBndWVzcwotCS8vIHByb2Nlc3NHcm91cENvbnRlbnQoZ3JvdXBDb250ZW50LCBncnBOb2RlKTsKLQkvLyBkdGRFbGVtZW50LnNldENvbnRlbnQoZ3JvdXBDb250ZW50KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoY21Ob2RlID09IG51bGwpCi0JLy8gewotCS8vIC8vIGJhZCB0aGluZyBoYXBwZW5lZCBoZXJlLCBqdXN0IGNyZWF0ZSBhIHBjZGF0YQotCS8vIERUREVtcHR5Q29udGVudCBlbXB0eUNvbnRlbnQgPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW1wdHlDb250ZW50KCk7Ci0JLy8gZHRkRWxlbWVudC5zZXRDb250ZW50KGVtcHR5Q29udGVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEFkZCBhIG5ldyBncm91cCB0byB0aGUgY3VycmVudCBncm91cAotCS8vICogQHBhcmFtIHBhcmVudCAtIHRoZSBwYXJlbnQgbm9kZSBmb3IgdGhpcyBncm91cCBlbGVtZW50Ci0JLy8gKiBAcGFyYW0gb3AxTm9kZSAtIHRoZSBncm91cAotCS8vICogZS5nLiAoYSxiKQotCS8vICogQHBhcmFtIG9wMk5vZGUgLSBzZXQgb25seSBpZiBjYWxsZWQgYnkgcHJvY2Vzc0NNMW9wCi0JLy8gKiBlLmcuIChhLGIpKwotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0dyb3VwQ29udGVudEdlbihEVERHcm91cENvbnRlbnQgcGFyZW50LAotCS8vIENNR3JvdXBOb2RlIGdycE5vZGUpIHsKLQkvLwotCS8vIEVudW1lcmF0aW9uIGNoaWxkcmVuID0gZ3JwTm9kZS5nZXRDaGlsZHJlbigpLmVsZW1lbnRzKCk7Ci0JLy8gRFRERmFjdG9yeSBmYWN0b3J5ID0gZ2V0RmFjdG9yeSgpOwotCS8vIHdoaWxlIChjaGlsZHJlbi5oYXNNb3JlRWxlbWVudHMoKSkKLQkvLyB7Ci0JLy8gQ01Ob2RlIGNub2RlID0gKENNTm9kZSkgY2hpbGRyZW4ubmV4dEVsZW1lbnQoKTsKLQkvLwotCS8vCi0JLy8gaWYgKGNub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpCi0JLy8gewotCS8vIENNR3JvdXBOb2RlIGdOb2RlID0gKENNR3JvdXBOb2RlKWNub2RlOwotCS8vIERUREdyb3VwQ29udGVudCBncm91cENvbnRlbnQgPSBmYWN0b3J5LmNyZWF0ZURUREdyb3VwQ29udGVudCgpOwotCS8vIERUREdyb3VwS2luZCBncm91cEtpbmQgPQotCS8vIERUREdyb3VwS2luZC5nZXQoY29tcHV0ZU1vZkdyb3VwS2luZChnTm9kZS5nZXRHcm91cEtpbmQoKSkpOwotCS8vIGdyb3VwQ29udGVudC5zZXRHcm91cEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyBEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUuZ2V0KGNvbXB1dGVNb2ZPY2N1cnJlbmNlKGdOb2RlKSk7Ci0JLy8gZ3JvdXBDb250ZW50LnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8gcGFyZW50LmdldENvbnRlbnQoKS5hZGQoZ3JvdXBDb250ZW50KTsKLQkvLyBwcm9jZXNzR3JvdXBDb250ZW50KGdyb3VwQ29udGVudCxnTm9kZSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNub2RlIGluc3RhbmNlb2YgQ01CYXNpY05vZGUpCi0JLy8gewotCS8vIENNQmFzaWNOb2RlIG4gPSAoQ01CYXNpY05vZGUpY25vZGU7Ci0JLy8gaWYgKG4uZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuUENEQVRBKQotCS8vIHsKLQkvLyAvLyBDcmVhdGUgYSBEVERQQ0RhdGFDb250ZW50IGZvciBhIGxlYWYgUENEYXRhIG5vZGUKLQkvLyAvLwotCS8vIERURFBDRGF0YUNvbnRlbnQgcGNEYXRhID0gZmFjdG9yeS5jcmVhdGVEVERQQ0RhdGFDb250ZW50KCk7Ci0JLy8gLy8gQWRkICNQQ0RBVEEgdG8gdGhlIEdyb3VwLCBpLmUgTWl4ZWQgY29udGVudCBtb2RlbAotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKHBjRGF0YSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIGlmIChjbm9kZSBpbnN0YW5jZW9mIENNUmVmZXJlbmNlTm9kZSkKLQkvLyB7Ci0JLy8gQ01SZWZlcmVuY2VOb2RlIHJuID0gKENNUmVmZXJlbmNlTm9kZSljbm9kZTsKLQkvLyBpZiAocm4uZ2V0VHlwZSgpPT1DTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKQotCS8vIHsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIEVsZW1lbnQgUmVmIG5hbWU6ICIgKyBybi5nZXROYW1lKCkpOwotCS8vIC8vCi0JLy8gLy8gQ3JlYXRlIGFuIERUREVsZW1lbnRSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtUmVmID0KLQkvLyBmYWN0b3J5LmNyZWF0ZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KCk7Ci0JLy8KLQkvLwotCS8vIC8vCi0JLy8gLy8gRmluZCB0aGUgcmVhbCBlbGVtZW50IGZvciB0aGlzIGVsZW1lbnQgcmVmZXJlbmNlcwotCS8vIC8vIElmIHRoZSByZWFsIGVsZW1lbnQgZG9lcyBub3QgeWV0IGV4aXN0LCBjcmVhdGUgaXQKLQkvLyAvLwotCS8vIERUREVsZW1lbnQgYW5FbGVtZW50ID0gY3JlYXRlT3JGaW5kRWxlbWVudChybi5nZXROYW1lKCksIGVsZW1SZWYpOwotCS8vCi0JLy8KLQkvLyBlbGVtUmVmLnNldFJlZmVyZW5jZWRFbGVtZW50KGFuRWxlbWVudCk7Ci0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCS8vIGVsZW1SZWYuc2V0T2NjdXJyZW5jZShvY2N1cnJlbmNlVHlwZSk7Ci0JLy8KLQkvLyAvLyBBZGQgRFRERWxlbWVudFJlZmVyZW5jZSB0byB0aGUgR3JvdXAKLQkvLyBwYXJlbnQuZ2V0Q29udGVudCgpLmFkZChlbGVtUmVmKTsKLQkvLyB9Ci0JLy8gZWxzZSAvLyBQRSBSZWZlcmVuY2UKLQkvLyB7Ci0JLy8gU3RyaW5nIGVudGl0eU5hbWUgPSBybi5nZXROYW1lKCkudHJpbSgpOwotCS8vCi0JLy8KLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNNIFBFIFJlZiBuYW1lOiAiICsgZW50aXR5TmFtZSk7Ci0JLy8gRFRERW50aXR5IGFuRW50aXR5ID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQoZW50aXR5TmFtZSk7Ci0JLy8gaWYgKGFuRW50aXR5IT1udWxsKQotCS8vIHsKLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBEVERFbnRpdHlSZWZlcmVuY2UgYW5kIHNldCBpdHMgcmVmZXJlbmNlZCBlbGVtZW50Ci0JLy8gLy8KLQkvLyBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVuUmVmID0KLQkvLyBmYWN0b3J5LmNyZWF0ZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoKTsKLQkvLyBlblJlZi5zZXRFbGVtZW50UmVmZXJlbmNlZEVudGl0eShhbkVudGl0eSk7Ci0JLy8gICAgICAgICAgICAgCi0JLy8gRFRET2NjdXJyZW5jZVR5cGUgb2NjdXJyZW5jZVR5cGUgPQotCS8vIERURE9jY3VycmVuY2VUeXBlLmdldChjb21wdXRlTW9mT2NjdXJyZW5jZShybikpOwotCS8vIGVuUmVmLnNldE9jY3VycmVuY2Uob2NjdXJyZW5jZVR5cGUpOwotCS8vCi0JLy8KLQkvLyAvLyBBZGQgRFRERW50aXR5UmVmZXJlbmNlIHRvIHRoZSBHcm91cAotCS8vIHBhcmVudC5nZXRDb250ZW50KCkuYWRkKGVuUmVmKTsKLQkvLwotCS8vCi0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEZpbmQgdGhlIHJlYWwgZWxlbWVudCB0aGF0IGlzIHJlZmVyZW5jZWQgYnkgdGhlIGN1cnJlbnQgZWxlbWVudAotCS8vICovCi0JLy8gcHJvdGVjdGVkIERUREVsZW1lbnQgY3JlYXRlT3JGaW5kRWxlbWVudEdlbihTdHJpbmcgbmFtZSwgT2JqZWN0IG9iaikgewotCS8vCi0JLy8gLy8gRFRERWxlbWVudCBhRWxlbWVudCA9IGdldERUREZpbGUoKS5maW5kRWxlbWVudChuYW1lKTsKLQkvLwotCS8vCi0JLy8gRFRERWxlbWVudCBhRWxlbWVudCA9IChEVERFbGVtZW50KSBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkuZ2V0KG5hbWUpOwotCS8vCi0JLy8KLQkvLyBpZiAoYUVsZW1lbnQgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gcmV0dXJuIGFFbGVtZW50OwotCS8vIH0KLQkvLwotCS8vCi0JLy8gU3RyaW5nIGVycm9yTXNnID0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEiKTsKLQkvLyBlcnJvck1zZyArPSAiXCIiICsgbmFtZSArICJcIiI7Ci0JLy8gZXJyb3JNc2cgKz0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX1VOREVDTEFSRURfRUxFTUVOVF8yIik7Ci0JLy8KLQkvLwotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyAgICAgCi0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JNZXNzYWdlKGVycm9yTXNnKTsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZHRkRXJyb3IsIG9iaik7Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKGVycm9yTXNnKTsKLQkvLyAvLyBzZXREVERFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCS8vIGdldERUREZpbGUoKS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vCi0JLy8KLQkvLyAvLwotCS8vIC8vIENyZWF0ZSBhbiBlbXB0eSBlbGVtZW50IGZvciB0aGUgcmVmZXJlbmNlIHRvIG1ha2UgaXQgdmFsaWQKLQkvLyAvLwotCS8vCi0JLy8KLQkvLyBEVERGYWN0b3J5IGZhY3RvcnkgPSBnZXRGYWN0b3J5KCk7Ci0JLy8gRFRERWxlbWVudCBkdGRlbGVtZW50ID0gZmFjdG9yeS5jcmVhdGVEVERFbGVtZW50KCk7Ci0JLy8gZHRkZWxlbWVudC5zZXROYW1lKG5hbWUpOwotCS8vCi0JLy8KLQkvLyBEVERFbXB0eUNvbnRlbnQgZW1wdHlDb250ZW50ID0gZmFjdG9yeS5jcmVhdGVEVERFbXB0eUNvbnRlbnQoKTsKLQkvLyBkdGRlbGVtZW50LnNldENvbnRlbnQoZW1wdHlDb250ZW50KTsKLQkvLwotCS8vCi0JLy8gZ2V0RFRERmlsZSgpLmdldERURE9iamVjdCgpLmFkZChkdGRlbGVtZW50KTsKLQkvLyBkdGRVdGlsLmdldEVsZW1lbnRQb29sKCkucHV0KG5hbWUsZHRkZWxlbWVudCk7Ci0JLy8gcmV0dXJuIGR0ZGVsZW1lbnQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQ29tcHV0ZSB0aGUgTU9GIG9jY3VycmVuY2UgZnJvbSB0aGUgeG1sNGogb2NjdXJyZW5jZQotCS8vICovCi0JLy8gcHJvdGVjdGVkIGludCBjb21wdXRlTW9mT2NjdXJyZW5jZUdlbihDTVJlcGVhdGFibGVOb2RlIHJub2RlKSB7Ci0JLy8KLQkvLyBpbnQgb2NjdXJyZW5jZSA9IHJub2RlLmdldE9jY3VycmVuY2UoKTsKLQkvLyBpbnQgbW9mb2NjdXIgPSBEVERPY2N1cnJlbmNlVHlwZS5PTkU7Ci0JLy8KLQkvLwotCS8vIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuWkVST19PUl9NT1JFKQotCS8vIHsKLQkvLyBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLlpFUk9fT1JfTU9SRTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAob2NjdXJyZW5jZSA9PSBDTU5vZGVUeXBlLk9ORV9PUl9NT1JFKQotCS8vIHsKLQkvLyBtb2ZvY2N1ciA9IERURE9jY3VycmVuY2VUeXBlLk9ORV9PUl9NT1JFOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvY2N1cnJlbmNlID09IENNTm9kZVR5cGUuT1BUSU9OQUwpCi0JLy8gewotCS8vIG1vZm9jY3VyID0gRFRET2NjdXJyZW5jZVR5cGUuT1BUSU9OQUw7Ci0JLy8gfQotCS8vIHJldHVybiBtb2ZvY2N1cjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDb21wdXRlIHRoZSBNT0YgbW9kZWwgZ3JvdXAgZnJvbSB0aGUgeG1sNGogbW9kZWwgZ3JvdXAKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBpbnQgY29tcHV0ZU1vZkdyb3VwS2luZEdlbihpbnQgdHlwZSkgewotCS8vCi0JLy8gaWYgKHR5cGUgPT0gQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UpCi0JLy8gewotCS8vIHJldHVybiBEVERHcm91cEtpbmQuQ0hPSUNFOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHJldHVybiBEVERHcm91cEtpbmQuU0VRVUVOQ0U7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZXNHZW4oRFRERWxlbWVudCBlbGVtZW50LCBBdHRsaXN0IGF0dExpc3QpCi0JLy8gewotCS8vCi0JLy8gaWYgKGF0dExpc3QuZ2V0RXJyb3JNZXNzYWdlKCkhPW51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShhdHRMaXN0LmdldEVycm9yTWVzc2FnZSgpLCBlbGVtZW50KTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGZvciAoaW50IGk9MDtpPGF0dExpc3Quc2l6ZSgpO2krKykKLQkvLyB7Ci0JLy8gQXR0Tm9kZSBhZCA9IChBdHROb2RlKSBhdHRMaXN0LmVsZW1lbnRBdChpKTsKLQkvLyAvLyBEVERBdHRyaWJ1dGVFbGVtZW50IGR0ZEF0dD0gZ2V0RFREQXR0cmlidXRlRWxlbWVudChhLmdldE5hbWUoKSk7Ci0JLy8KLQkvLwotCS8vIC8vIG9ubHkgYWRkIHRoZSBBdHREZWYgaWYgaXQgaXMgbm90IGFkZGVkIHlldAotCS8vIC8vIGlnbm9yZSB0aGUgZHVwIEF0dERlZiBhcyBkb2N1bWVudGVkIGluIHRoZSBYTUwgMS4wIHNwZWNzCi0JLy8gLy9pZiggZHRkQXR0PT1udWxsKQotCS8vIGFkZEF0dHJpYnV0ZShlbGVtZW50LCBhZCk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIENyZWF0ZSBhIERUREF0dHJpYnV0ZSBmcm9tIHRoZSB4bWw0aiBhdHRyaWJ1dGUKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZUdlbihEVERFbGVtZW50IGR0ZGVsZW1lbnQsIEF0dE5vZGUgYWQpIHsKLQkvLwotCS8vIERUREF0dHJpYnV0ZSBkdGRhdHRyID0gZ2V0RmFjdG9yeSgpLmNyZWF0ZURUREF0dHJpYnV0ZSgpOwotCS8vIGR0ZGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkuYWRkKGR0ZGF0dHIpOwotCS8vIGZpbmlzaEF0dHJpYnV0ZShkdGRhdHRyLCBhZCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgZmluaXNoQXR0cmlidXRlR2VuKERUREF0dHJpYnV0ZSBkdGRhdHRyLCBBdHROb2RlIGF0dGRlZikKLQkvLyB7Ci0JLy8KLQkvLyBib29sZWFuIHBhcnNlRXJyb3IgPSBmYWxzZTsKLQkvLwotCS8vCi0JLy8gaWYgKGF0dGRlZi5uYW1lLnN0YXJ0c1dpdGgoIiUiKSkKLQkvLyB7Ci0JLy8gU3RyaW5nIHBlTmFtZSA9IGF0dGRlZi5uYW1lLnRyaW0oKTsKLQkvLyBEVERFbnRpdHkgZW4gPSAoRFRERW50aXR5KSBkdGRVdGlsLmdldFBFUG9vbCgpLmdldChwZU5hbWUpOwotCS8vIGlmIChlbiE9bnVsbCkKLQkvLyB7Ci0JLy8gZHRkYXR0ci5zZXRBdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eShlbik7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gZHRkYXR0ci5zZXROYW1lKGF0dGRlZi5uYW1lKTsKLQkvLwotCS8vCi0JLy8gaW50IGF0dHJUeXBlID0gYXR0ZGVmLmdldERlY2xhcmVkVHlwZSgpOwotCS8vCi0JLy8KLQkvLyBpZiAoYXR0clR5cGU9PUF0dE5vZGUuUEVSRUZFUkVOQ0UgJiYgYXR0ZGVmLnR5cGUhPW51bGwpCi0JLy8gewotCS8vIFN0cmluZyBwZU5hbWUgPSBhdHRkZWYudHlwZS50cmltKCk7Ci0JLy8gRFRERW50aXR5IGVuID0gKERUREVudGl0eSkgZHRkVXRpbC5nZXRQRVBvb2woKS5nZXQocGVOYW1lKTsKLQkvLyBpZiAoZW4hPW51bGwpCi0JLy8gewotCS8vIGR0ZGF0dHIuc2V0QXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkoZW4pOwotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7IC8vIGhhY2ssCi0JLy8gc28gd2UgY2FuIGdldCBiYWNrIHRoZSBkZWZhdWx0IHZhbHVlCi0JLy8gfQotCS8vIGVsc2UgLy9zZXQgZGVmYXVsdCB0eXBlCi0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9DREFUQSgpKTsKLQkvLwotCS8vCi0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gc3dpdGNoIChhdHRyVHlwZSkKLQkvLyB7Ci0JLy8gY2FzZSBBdHROb2RlLkNEQVRBOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfQ0RBVEEoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5FTlRJVElFUzoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0VOVElUSUVTKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuRU5USVRZOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfRU5USVRZKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSUQ6Ci0JLy8gLy8gY2hlY2sgZm9yIGR1cGxpY2F0ZSBJRCBhdHRyaWJ1dGUKLQkvLyBpZiAoaGFzSURBdHRyaWJ1dGUoZHRkYXR0cikpCi0JLy8gewotCS8vIFN0cmluZyBlcnJNc2cgPSBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xIik7Ci0JLy8gZXJyTXNnICs9IGF0dGRlZi5uYW1lICsKLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX0RVUF9JRF9BVFRSSUJVVEVfMiIpOwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gcGFyc2VFcnJvciA9IHRydWU7Ci0JLy8gfQotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSUQoKSk7Ci0JLy8gYnJlYWs7Ci0JLy8KLQkvLwotCS8vIGNhc2UgQXR0Tm9kZS5JRFJFRjoKLQkvLyBzZXRBdHRyRFREVHlwZShkdGRhdHRyLCBnZXRGYWN0b3J5KCkuZ2V0RFREQmFzaWNUeXBlX0lEUkVGKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuSURSRUZTOgotCS8vIHNldEF0dHJEVERUeXBlKGR0ZGF0dHIsIGdldEZhY3RvcnkoKS5nZXREVERCYXNpY1R5cGVfSURSRUZTKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuRU5VTUVSQVRJT046Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLAotCS8vIERUREVudW1Hcm91cEtpbmQuTkFNRV9UT0tFTl9HUk9VUCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuTk9UQVRJT046Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgY3JlYXRlRFRERW51bWVyYXRpb24oZHRkYXR0ciwgYXR0ZGVmLAotCS8vIERUREVudW1Hcm91cEtpbmQuTk9UQVRJT05fR1JPVVApKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5NVE9LRU46Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOKCkpOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuTk1UT0tFTlM6Ci0JLy8gc2V0QXR0ckRURFR5cGUoZHRkYXR0ciwgZ2V0RmFjdG9yeSgpLmdldERUREJhc2ljVHlwZV9OTVRPS0VOUygpKTsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gZGVmYXVsdDoKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREFUVFIgJyIgK2F0dGRlZi5uYW1lICsgIidVbmtub3duIHR5cGUuLi4iICsKLQkvLyBhdHRyVHlwZSk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gaW50IGF0dHJEZWZhdWx0ID0gYXR0ZGVmLmdldERlZmF1bHRUeXBlKCk7Ci0JLy8gaW50IGRlZmF1bHRLaW5kID0gRFRERGVmYXVsdEtpbmQuSU1QTElFRDsKLQkvLyBzd2l0Y2ggKGF0dHJEZWZhdWx0KQotCS8vIHsKLQkvLyBjYXNlIEF0dE5vZGUuRklYRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5GSVhFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLklNUExJRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5JTVBMSUVEOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBjYXNlIEF0dE5vZGUuUkVRVUlSRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5SRVFVSVJFRDsKLQkvLyBicmVhazsKLQkvLwotCS8vCi0JLy8gY2FzZSBBdHROb2RlLk5PRklYRUQ6Ci0JLy8gZGVmYXVsdEtpbmQgPSBEVEREZWZhdWx0S2luZC5OT0ZJWEVEOwotCS8vIGJyZWFrOwotCS8vCi0JLy8KLQkvLyBkZWZhdWx0OgotCS8vIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiRFREQVRUUiAnIiArYXR0ZGVmLm5hbWUgKyAiJyBVbmtub3duIGRlZmF1bHQKLQkvLyB0eXBlLi4uICIgKyBhdHRyRGVmYXVsdCk7Ci0JLy8gfQotCS8vCi0JLy8gRFRERGVmYXVsdEtpbmQgZGVmYXVsdEtpbmRPYmogPSBEVEREZWZhdWx0S2luZC5nZXQoZGVmYXVsdEtpbmQpOwotCS8vIGR0ZGF0dHIuc2V0RGVmYXVsdEtpbmQoZGVmYXVsdEtpbmRPYmopOwotCS8vCi0JLy8gaWYgKHBhcnNlRXJyb3IpCi0JLy8gewotCS8vIHJldHVybjsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIFN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRkZWYuZGVmYXVsdFZhbHVlOwotCS8vIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkKLQkvLyB7Ci0JLy8gaWYgKGF0dHJUeXBlID09IEF0dE5vZGUuRU5VTUVSQVRJT04gfHwgYXR0clR5cGUgPT0gQXR0Tm9kZS5OT1RBVElPTikKLQkvLyB7Ci0JLy8gaWYgKCEgaXNEZWZhdWx0RW51bVZhbHVlVmFsaWQoYXR0ZGVmLGRlZmF1bHRWYWx1ZSkpCi0JLy8gewotCS8vIFN0cmluZyB0eXBlU3RyaW5nID0KLQkvLyAoYXR0clR5cGU9PUF0dE5vZGUuRU5VTUVSQVRJT04/ImVudW1lcmF0aW9uIjoibm90YXRpb24iKTsKLQkvLyBTdHJpbmcgZXJyTXNnID0KLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfRVJST1JfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMSIpOwotCS8vIGVyck1zZyArPSB0eXBlU3RyaW5nICsKLQkvLyBEVERDb3JlTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfRVJST1JQQVJUX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIiKTsKLQkvLyBlcnJNc2cgKz0gYXR0ZGVmLm5hbWUgKyAiJyI7Ci0JLy8KLQkvLwotCS8vIC8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldElFbGVtZW50KCkuc2V0RFRERXJyb3JNZXNzYWdlKGVyck1zZyk7Ci0JLy8gLy8gZHRkYXR0ci5nZXREVERFbGVtZW50KCkuZ2V0RFRERmlsZSgpLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gcmV0dXJuOwotCS8vIH0KLQkvLyB9Ci0JLy8gZHRkYXR0ci5zZXREZWZhdWx0VmFsdWVTdHJpbmcoZGVmYXVsdFZhbHVlKTsKLQkvLyB9Ci0JLy8gLy8gU3lzdGVtLm91dC5wcmludGxuKCJEVERBdHRyIC0gdG9Nb2YgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nICIgKwotCS8vIGdldERlZmF1bHRWYWx1ZVN0cmluZygpKTsKLQkvLyAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkRUREF0dHIgLSB0b01vZiBnZXREZWZhdWx0VmFsdWU6ICIgKwotCS8vIGdldERlZmF1bHRWYWx1ZSgpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNJREF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgZHRkYXR0cikgewotCS8vCi0JLy8gYm9vbGVhbiBoYXNJRCA9IGZhbHNlOwotCS8vCi0JLy8KLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSBkdGRhdHRyLmdldERUREVsZW1lbnQoKTsKLQkvLyBFTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCk7Ci0JLy8KLQkvLwotCS8vIEl0ZXJhdG9yIGkgPSBhdHRycy5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFREQXR0cmlidXRlIGF0dHIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkvLyBEVERUeXBlIGRUeXBlID0gYXR0ci5nZXREVERUeXBlKCk7Ci0JLy8gaWYgKGRUeXBlIGluc3RhbmNlb2YgRFREQmFzaWNUeXBlKQotCS8vIHsKLQkvLyBpZiAoICgoRFREQmFzaWNUeXBlKWRUeXBlKS5nZXRLaW5kKCkuZ2V0VmFsdWUoKSA9PSBEVERCYXNpY1R5cGVLaW5kLklEKQotCS8vIHsKLQkvLyBoYXNJRCA9IHRydWU7Ci0JLy8gYnJlYWs7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIGhhc0lEOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25HZW4oRFREQXR0cmlidXRlCi0JLy8gZHRkYXR0ciwgU3RyaW5nW10gZW51bVZhbHVlcywgaW50IGVudW1LaW5kKSB7Ci0JLy8KLQkvLyBEVERFbnVtZXJhdGlvblR5cGUgZW51bSA9IGdldEZhY3RvcnkoKS5jcmVhdGVEVERFbnVtZXJhdGlvblR5cGUoKTsKLQkvLyAvLyBUaGlzIGlzIGdyb3NzLCBidXQgdGhpcyBpcyB3aGF0IHdhcyBkb25lIGJlZm9yZS4KLQkvLyBEVERBdHRyaWJ1dGVJbXBsIGR0ZGF0dHJpbXBsID0gKERUREF0dHJpYnV0ZUltcGwpIGR0ZGF0dHI7Ci0JLy8gLy8gZW51bS5zZXRJRCgiRW51bV8iICsKLQkvLyAoKERUREVsZW1lbnQpZHRkYXR0cmltcGwuZ2V0TU9GRG9tYWluKCkpLmdldE5hbWUoKSArICJfIiArCi0JLy8gZHRkYXR0ci5nZXROYW1lKCkpOwotCS8vIERUREVudW1Hcm91cEtpbmQgZ3JvdXBLaW5kID0gRFRERW51bUdyb3VwS2luZC5nZXQoZW51bUtpbmQpOwotCS8vIGVudW0uc2V0S2luZChncm91cEtpbmQpOwotCS8vIC8vIEVudW1lcmF0aW9uIHZhbHVlcwotCS8vIGlmIChlbnVtVmFsdWVzIT1udWxsKQotCS8vIHsKLQkvLyBmb3IoaW50IGk9MDtpPGVudW1WYWx1ZXMubGVuZ3RoO2krKykKLQkvLyB7Ci0JLy8gRUVudW1MaXRlcmFsIGVudW1MaXRlcmFsID0gY3JlYXRlRUVudW1MaXRlcmFsKCk7Ci0JLy8gLy8gZW51bVZhbC5zZXRYTUlEb2N1bWVudChkdGRhdHRyLmdldFhNSURvY3VtZW50KCkpOwotCS8vIGVudW1MaXRlcmFsLnJlZlNldExpdGVyYWwoZW51bVZhbHVlc1tpXSk7Ci0JLy8gLy8gZW51bUxpdGVyYWwuc2V0TnVtYmVyKGkpOwotCS8vIGVudW0uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkvLyB9Ci0JLy8gfQotCS8vIGR0ZGF0dHIuZ2V0RFRERWxlbWVudCgpLmdldERUREZpbGUoKS5nZXREVERFbnVtZXJhdGlvblR5cGUoKS5hZGQoZW51bSk7Ci0JLy8gcmV0dXJuIGVudW07Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEVFbnVtTGl0ZXJhbCBjcmVhdGVFRW51bUxpdGVyYWxHZW4oKSB7Ci0JLy8KLQkvLyBFY29yZVBhY2thZ2UgZVBhY2thZ2UgPQotCS8vIChFY29yZVBhY2thZ2UpRVBhY2thZ2UuUmVnaXN0cnkuSU5TVEFOQ0UuZ2V0RVBhY2thZ2UoRWNvcmVQYWNrYWdlLmVOU19VUkkpOwotCS8vIHJldHVybiAoKEVjb3JlRmFjdG9yeSllUGFja2FnZS5nZXRGYWN0b3J5KCkpLmNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERFbnVtZXJhdGlvblR5cGUgY3JlYXRlRFRERW51bWVyYXRpb25HZW4oRFREQXR0cmlidXRlCi0JLy8gZHRkYXR0ciwgQXR0Tm9kZSBhdHRkZWYsIGludCBlbnVtS2luZCkgewotCS8vCi0JLy8gRFRERW51bWVyYXRpb25UeXBlIGVudW0gPSBnZXRGYWN0b3J5KCkuY3JlYXRlRFRERW51bWVyYXRpb25UeXBlKCk7Ci0JLy8gLy8gVGhpcyBpcyBncm9zcywgYnV0IHRoaXMgaXMgd2hhdCB3YXMgZG9uZSBiZWZvcmUuCi0JLy8gRFREQXR0cmlidXRlSW1wbCBkdGRhdHRyaW1wbCA9IChEVERBdHRyaWJ1dGVJbXBsKSBkdGRhdHRyOwotCS8vIC8vIGVudW0uc2V0SUQoIkVudW1fIiArCi0JLy8gKChEVERFbGVtZW50KWR0ZGF0dHJpbXBsLmdldE1PRkRvbWFpbigpKS5nZXROYW1lKCkgKyAiXyIgKwotCS8vIGR0ZGF0dHIuZ2V0TmFtZSgpKTsKLQkvLyBEVERFbnVtR3JvdXBLaW5kIGdyb3VwS2luZCA9IERUREVudW1Hcm91cEtpbmQuZ2V0KGVudW1LaW5kKTsKLQkvLyBlbnVtLnNldEtpbmQoZ3JvdXBLaW5kKTsKLQkvLyBkdGRhdHRyLmdldERUREVsZW1lbnQoKS5nZXREVERGaWxlKCkuZ2V0RFRERW51bWVyYXRpb25UeXBlKCkuYWRkKGVudW0pOwotCS8vCi0JLy8KLQkvLyAvLyBFbnVtZXJhdGlvbiB2YWx1ZXMKLQkvLyBFbnVtZXJhdGlvbiB0b2tlbkl0ZXIgPSBhdHRkZWYuZWxlbWVudHMoKTsKLQkvLyBpZiAodG9rZW5JdGVyICE9IG51bGwpIHsKLQkvLyBpbnQgaT0wOwotCS8vIHdoaWxlICh0b2tlbkl0ZXIuaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIFN0cmluZyB2YWwgPSAoU3RyaW5nKXRva2VuSXRlci5uZXh0RWxlbWVudCgpOwotCS8vIEVFbnVtTGl0ZXJhbCBlbnVtTGl0ZXJhbCA9IGNyZWF0ZUVFbnVtTGl0ZXJhbCgpOwotCS8vIC8vIGVudW1MaXRlcmFsLnNldFhNSURvY3VtZW50KGR0ZGF0dHIuZ2V0WE1JRG9jdW1lbnQoKSk7Ci0JLy8gICAgICAgIAotCS8vCi0JLy8gZW51bUxpdGVyYWwucmVmU2V0TGl0ZXJhbCh2YWwpOwotCS8vIC8vIGVudW1MaXRlcmFsLnNldE51bWJlcihpKyspOwotCS8vIGVudW0uZ2V0RW51bUxpdGVyYWxzKCkuYWRkKGVudW1MaXRlcmFsKTsKLQkvLyB9Ci0JLy8gfQotCS8vCi0JLy8KLQkvLyByZXR1cm4gZW51bTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlZmF1bHRFbnVtVmFsdWVWYWxpZEdlbihBdHROb2RlIGF0dGRlZiwgU3RyaW5nCi0JLy8gZGVmYXVsdFZhbHVlKSB7Ci0JLy8KLQkvLyBib29sZWFuIHZhbGlkID0gZmFsc2U7Ci0JLy8gYm9vbGVhbiBjb250YWluc1BlcmNlbnQgPSBmYWxzZTsKLQkvLwotCS8vCi0JLy8gLy8gRW51bWVyYXRpb24gdmFsdWVzCi0JLy8gRW51bWVyYXRpb24gZW51bVZhbHVlcyA9IGF0dGRlZi5lbGVtZW50cygpOwotCS8vIHdoaWxlIChlbnVtVmFsdWVzLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBTdHJpbmcgdmFsID0gKFN0cmluZyllbnVtVmFsdWVzLm5leHRFbGVtZW50KCk7Ci0JLy8gaWYgKHZhbC5lcXVhbHMoZGVmYXVsdFZhbHVlKSkKLQkvLyB7Ci0JLy8gdmFsaWQgPSB0cnVlOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyBpZiAodmFsLmluZGV4T2YoJyUnKSA+PSAwKQotCS8vIHsKLQkvLyBjb250YWluc1BlcmNlbnQgPSB0cnVlOwotCS8vIH0KLQkvLyB9Ci0JLy8gcmV0dXJuIHZhbGlkIHx8IGNvbnRhaW5zUGVyY2VudDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRBdHRyRFREVHlwZUdlbihEVERBdHRyaWJ1dGUgZHRkYXR0ciwgRFREVHlwZSB0eXBlKSB7Ci0JLy8KLQkvLyBkdGRhdHRyLnNldERURFR5cGUodHlwZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgYWRkRXJyb3JNZXNzYWdlR2VuKEVycm9yTWVzc2FnZSBlcnJNc2csIE9iamVjdCBvYmopIHsKLQkvLwotCS8vIGVyck1zZy5zZXRPYmplY3Qob2JqKTsKLQkvLyBkdGRVdGlsLmFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERPYmplY3RGaW5kZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERPYmplY3RGaW5kZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiMzZiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFRET2JqZWN0RmluZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERTb3VyY2VPZmZzZXQ7Ci0KLXB1YmxpYyBjbGFzcyBEVERPYmplY3RGaW5kZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQlwdWJsaWMgY2xhc3MgU291cmNlT2Zmc2V0IHsKLQkJLy8gQ29udmVuaWVuY2UgY2xhc3MgdG8gZmluZCBjb250YWlubWVudCBvZiBvYmplY3QKLQkJcHJpdmF0ZSBpbnQgc3RhcnQsIGVuZDsKLQotCQlwdWJsaWMgU291cmNlT2Zmc2V0KGludCBzdGFydCwgaW50IGVuZCkgewotCQkJdGhpcy5zdGFydCA9IHN0YXJ0OwotCQkJdGhpcy5lbmQgPSBlbmQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhTb3VyY2VPZmZzZXQgb3RoZXIpIHsKLQkJCWlmICh0aGlzLnN0YXJ0IDw9IG90aGVyLnN0YXJ0ICYmIG90aGVyLnN0YXJ0IDw9IHRoaXMuZW5kKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlTb3VyY2VPZmZzZXQgc2VhcmNoTG9jYXRpb247Ci0KLQlwcml2YXRlIFNvdXJjZU9mZnNldCBvZmZzZXRPYmplY3RGb3IoRFREU291cmNlT2Zmc2V0IHMpIHsKLQkJcmV0dXJuIG5ldyBTb3VyY2VPZmZzZXQocy5nZXRTdGFydE9mZnNldCgpLCBzLmdldEVuZE9mZnNldCgpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tDb250YWlubWVudChEVERPYmplY3QgbykgewotCQlpZiAob2Zmc2V0T2JqZWN0Rm9yKChEVERTb3VyY2VPZmZzZXQpIG8pLmNvbnRhaW5zKHNlYXJjaExvY2F0aW9uKSkgewotCQkJY2xvc2VzdE9iamVjdCA9IG87Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHVibGljIERURE9iamVjdEZpbmRlcihpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQkJc2VhcmNoTG9jYXRpb24gPSBuZXcgU291cmNlT2Zmc2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRETm90YXRpb24oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQkJY2hlY2tDb250YWlubWVudChub3RhdGlvbik7Ci0JCXN1cGVyLnZpc2l0RFRETm90YXRpb24obm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5KERUREVudGl0eSBlbnRpdHkpIHsKLQkJY2hlY2tDb250YWlubWVudChlbnRpdHkpOwotCQlzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudChEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkJY2hlY2tDb250YWlubWVudChlbGVtZW50KTsKLQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKLQkJY2hlY2tDb250YWlubWVudChhdHRyaWJ1dGUpOwotCQlzdXBlci52aXNpdERUREF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0JCWNoZWNrQ29udGFpbm1lbnQocGFybUVudGl0eSk7Ci0JCXN1cGVyLnZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHBhcm1FbnRpdHkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQljaGVja0NvbnRhaW5tZW50KGNvbnRlbnQpOwotCQlzdXBlci52aXNpdERUREVsZW1lbnRDb250ZW50KGNvbnRlbnQpOwotCX0KLQotCXByaXZhdGUgRFRET2JqZWN0IGNsb3Nlc3RPYmplY3QgPSBudWxsOwotCi0JcHVibGljIERURE9iamVjdCBnZXRDbG9zZXN0T2JqZWN0KCkgewotCQlyZXR1cm4gY2xvc2VzdE9iamVjdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIFNvdXJjZU9mZnNldCBvZmZzZXRPYmplY3RGb3JHZW4oRFREU291cmNlT2Zmc2V0IHMpIHsKLQotCQlyZXR1cm4gbmV3IFNvdXJjZU9mZnNldChzLmdldFN0YXJ0T2Zmc2V0KCksIHMuZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja0NvbnRhaW5tZW50R2VuKERURE9iamVjdCBvKSB7Ci0KLQkJaWYgKG9mZnNldE9iamVjdEZvcigoRFREU291cmNlT2Zmc2V0KSBvKS5jb250YWlucyhzZWFyY2hMb2NhdGlvbikpIHsKLQkJCWNsb3Nlc3RPYmplY3QgPSBvOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURE5vdGF0aW9uR2VuKERURE5vdGF0aW9uIG5vdGF0aW9uKSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChub3RhdGlvbik7Ci0JCXN1cGVyLnZpc2l0RFRETm90YXRpb24obm90YXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eUdlbihEVERFbnRpdHkgZW50aXR5KSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChlbnRpdHkpOwotCQlzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRHZW4oRFRERWxlbWVudCBlbGVtZW50KSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChlbGVtZW50KTsKLQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0KLQkJY2hlY2tDb250YWlubWVudChhdHRyaWJ1dGUpOwotCQlzdXBlci52aXNpdERUREF0dHJpYnV0ZShhdHRyaWJ1dGUpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUdlbihEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eSkgewotCi0JCWNoZWNrQ29udGFpbm1lbnQocGFybUVudGl0eSk7Ci0JCXN1cGVyLnZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHBhcm1FbnRpdHkpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50R2VuKERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQotCQljaGVja0NvbnRhaW5tZW50KGNvbnRlbnQpOwotCQlzdXBlci52aXNpdERUREVsZW1lbnRDb250ZW50KGNvbnRlbnQpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgRFRET2JqZWN0IGdldENsb3Nlc3RPYmplY3RHZW4oKSB7Ci0KLQkJcmV0dXJuIGNsb3Nlc3RPYmplY3Q7Ci0JfQotfS8vIERURE9iamVjdEZpbmRlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFBhdGhuYW1lVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFBhdGhuYW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWFiZDJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQYXRobmFtZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi0KLQotcHVibGljIGNsYXNzIERURFBhdGhuYW1lVXRpbCB7Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgbWFrZVBhdGgoU3RyaW5nIHBhcmVudFBhdGgsIFN0cmluZyB0eXBlLCBTdHJpbmcgbmFtZSwgaW50IGNudCkgewotCQlTdHJpbmcgcG4gPSBudWxsOwotCQluYW1lID0gZW5jb2RlKG5hbWUpOwotCQlpZiAoKG5hbWUgPT0gbnVsbCkgJiYgKGNudCA8PSAwKSkgewotCQkJcG4gPSB0eXBlOwotCQl9Ci0JCWVsc2UgaWYgKGNudCA8PSAwKSB7Ci0JCQlwbiA9IHR5cGUgKyAiOiIgKyAoKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIHsKLQkJCXBuID0gdHlwZSArICI6IiArICgobmFtZSA9PSBudWxsKSA/ICIiIDogbmFtZSkgKyAiOiIgKyBjbnQ7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQotCQlpZiAocGFyZW50UGF0aCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gcGFyZW50UGF0aCArICIuIiArIHBuOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gcG47Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHVibGljIE9iamVjdFtdIHBhcnNlUGF0aENvbXBvbmVudChTdHJpbmcgcGF0aCkgewotCQkvKgotCQkgKiBUaGlzIHJvdXRpbmUgcGFyc2UgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUgcGF0aCBhbmQgcmV0dXJucyB0aGUKLQkJICogcmVzdWx0IGluIGFuIGFycnJheSBvZiBTdHJpbmdzLiByZXN1bHRbMF0gPSB0eXBlIChTdHJpbmcpIHJlc3VsdFsxXSA9Ci0JCSAqIG5hbWUgKFN0cmluZykgcmVzdWx0WzJdID0gY291bnQgKEludGVnZXIpIHJlc3VsdFszXSA9IHRoZSByZXN0IG9mCi0JCSAqIHRoZSBwYXRoIChTdHJpbmcpCi0JCSAqIAotCQkgKiBFLmcuIFBhdGhDb21wb25lbnQgcmVzdWx0WzBdIHJlc3VsdFsxXSByZXN1bHRbMl0gcmVzdWx0WzNdCi0JCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZQotCQkgKiB0eXBlIDxudWxsPiA8bnVsbD4gPG51bGw+IHR5cGUucmVzdCB0eXBlIDxudWxsPiA8bnVsbD4gcmVzdAotCQkgKiB0eXBlOm5hbWUgdHlwZSBuYW1lIDxudWxsPiA8bnVsbD4gdHlwZTpuYW1lLnJlc3QgdHlwZSBuYW1lIDxudWxsPgotCQkgKiByZXN0IHR5cGU6Om4gdHlwZSA8bnVsbD4gbiA8bnVsbD4gdHlwZTo6bi5yZXN0IHR5cGUgPG51bGw+IG4gcmVzdAotCQkgKiB0eXBlOm5hbWU6biB0eXBlIG5hbWUgbiA8bnVsbD4gdHlwZTpuYW1lOm4ucmVzdCB0eXBlIG5hbWUgbiByZXN0Ci0JCSAqLwotCi0JCU9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbNF07Ci0JCWlmIChwYXRoID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0OwotCi0JCWludCBpID0gcGF0aC5pbmRleE9mKCcuJyk7Ci0JCWludCBsZW5ndGggPSBwYXRoLmxlbmd0aCgpOwotCi0JCWlmIChpIDwgMCkgewotCQkJaSA9IGxlbmd0aDsKLQkJfQotCi0JCVN0cmluZyB0eXBlID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlJbnRlZ2VyIG4gPSBudWxsOwotCQlTdHJpbmcgcmVzdCA9IG51bGw7Ci0KLQkJLy8gZ2V0IHRoZSB0eXBlCi0JCWludCBqID0gcGF0aC5pbmRleE9mKCc6Jyk7Ci0JCWlmIChqID4gaSkKLQkJCWogPSAtMTsKLQkJaWYgKGogPCAwKSB7Ci0JCQl0eXBlID0gcGF0aC5zdWJzdHJpbmcoMCwgaSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0eXBlID0gcGF0aC5zdWJzdHJpbmcoMCwgaik7Ci0KLQkJCS8vIGdldCB0aGUgbmFtZQotCQkJaW50IGsgPSBwYXRoLmluZGV4T2YoJzonLCBqICsgMSk7Ci0JCQlpZiAoayA+IGkpCi0JCQkJayA9IC0xOwotCQkJaWYgKGsgPCAwKSB7Ci0JCQkJbmFtZSA9IHBhdGguc3Vic3RyaW5nKGogKyAxLCBpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5hbWUgPSBwYXRoLnN1YnN0cmluZyhqICsgMSwgayk7Ci0KLQkJCQkvLyBnZXQgdGhlIGNvdW50Ci0JCQkJdHJ5IHsKLQkJCQkJbiA9IG5ldyBJbnRlZ2VyKHBhdGguc3Vic3RyaW5nKGsgKyAxLCBpKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQkJfQotCQkJCWlmICgobiAhPSBudWxsKSAmJiAobi5pbnRWYWx1ZSgpIDwgMCkpIHsKLQkJCQkJbiA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKChuYW1lICE9IG51bGwpICYmIChuYW1lLmxlbmd0aCgpID09IDApKSB7Ci0JCQluYW1lID0gbnVsbDsKLQkJfQotCi0JCWlmIChpIDwgbGVuZ3RoKSB7Ci0JCQlyZXN0ID0gcGF0aC5zdWJzdHJpbmcoaSArIDEpOwotCQl9Ci0KLQkJcmVzdWx0WzBdID0gdHlwZTsKLQkJcmVzdWx0WzFdID0gZGVjb2RlKG5hbWUpOwotCQlyZXN1bHRbMl0gPSBuOwotCQlyZXN1bHRbM10gPSByZXN0OwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwcml2YXRlIFN0cmluZyBlbmNvZGUoU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgbyA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpIHx8IChjID09ICctJykpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBpZiAoKGMgPT0gJy4nKSB8fCAoYyA9PSAnOicpIHx8IChjID09ICdfJykgfHwgLi4uKQotCQkJCS8vIGNvbnZlcnQgdGhlIGNoYXJhY3RlciB0byBhIDQgZGlnaXQgaGV4IGNvZGUgcHJlZml4ZWQgYnkgIl8iCi0JCQkJU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcoYyk7Ci0JCQkJaW50IGwgPSBoZXgubGVuZ3RoKCk7Ci0JCQkJaWYgKGwgPT0gMSkgewotCQkJCQlvLmFwcGVuZCgiXzAwMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMikgewotCQkJCQlvLmFwcGVuZCgiXzAwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobCA9PSAzKSB7Ci0JCQkJCW8uYXBwZW5kKCJfMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvLmFwcGVuZCgnXycpOwotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCX0KLQkJfSAvLyBmb3IKLQkJcmV0dXJuIG8udG9TdHJpbmcoKTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZGVjb2RlKFN0cmluZyBzKSB7Ci0JCWlmIChzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIG8gPSBuZXcgU3RyaW5nQnVmZmVyKHMubGVuZ3RoKCkpOwotCQlpbnQgbGVuID0gcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJY2hhciBjID0gcy5jaGFyQXQoaSk7Ci0JCQlpZiAoYyAhPSAnXycpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBuZXh0IDQgY2hhcmFjdGVycyBhcmUgdGhlIGhleCBjb2RlCi0JCQkJU3RyaW5nIGhleDsKLQkJCQlpZiAobGVuID4gaSArIDQpIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEsIGkgKyA1KTsKLQkJCQkJaSArPSA0OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaGV4ID0gcy5zdWJzdHJpbmcoaSArIDEpOwotCQkJCQlpID0gbGVuIC0gMTsKLQkJCQl9Ci0JCQkJby5hcHBlbmQoKGNoYXIpIEludGVnZXIucGFyc2VJbnQoaGV4LCAxNikpOwotCQkJfQotCQl9IC8vIGZvcgotCQlyZXR1cm4gby50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBtYWtlUGF0aEdlbihTdHJpbmcgcGFyZW50UGF0aCwgU3RyaW5nIHR5cGUsIFN0cmluZyBuYW1lLCBpbnQgY250KSB7Ci0KLQkJU3RyaW5nIHBuID0gbnVsbDsKLQkJbmFtZSA9IGVuY29kZShuYW1lKTsKLQkJaWYgKChuYW1lID09IG51bGwpICYmIChjbnQgPD0gMCkpIHsKLQkJCXBuID0gdHlwZTsKLQkJfQotCQllbHNlIGlmIChjbnQgPD0gMCkgewotCQkJcG4gPSB0eXBlICsgIjoiICsgKChuYW1lID09IG51bGwpID8gIiIgOiBuYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQlwbiA9IHR5cGUgKyAiOiIgKyAoKG5hbWUgPT0gbnVsbCkgPyAiIiA6IG5hbWUpICsgIjoiICsgY250OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJaWYgKHBhcmVudFBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhcmVudFBhdGggKyAiLiIgKyBwbjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIHBuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgT2JqZWN0W10gcGFyc2VQYXRoQ29tcG9uZW50R2VuKFN0cmluZyBwYXRoKSB7Ci0KLQkJLyoKLQkJICogVGhpcyByb3V0aW5lIHBhcnNlIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgdGhlIHBhdGggYW5kIHJldHVybnMgdGhlCi0JCSAqIHJlc3VsdCBpbiBhbiBhcnJyYXkgb2YgU3RyaW5ncy4gcmVzdWx0WzBdID0gdHlwZSAoU3RyaW5nKSByZXN1bHRbMV0gPQotCQkgKiBuYW1lIChTdHJpbmcpIHJlc3VsdFsyXSA9IGNvdW50IChJbnRlZ2VyKSByZXN1bHRbM10gPSB0aGUgcmVzdCBvZgotCQkgKiB0aGUgcGF0aCAoU3RyaW5nKQotCQkgKiAKLQkJICogRS5nLiBQYXRoQ29tcG9uZW50IHJlc3VsdFswXSByZXN1bHRbMV0gcmVzdWx0WzJdIHJlc3VsdFszXQotCQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHR5cGUKLQkJICogdHlwZSA8bnVsbD4gPG51bGw+IDxudWxsPiB0eXBlLnJlc3QgdHlwZSA8bnVsbD4gPG51bGw+IHJlc3QKLQkJICogdHlwZTpuYW1lIHR5cGUgbmFtZSA8bnVsbD4gPG51bGw+IHR5cGU6bmFtZS5yZXN0IHR5cGUgbmFtZSA8bnVsbD4KLQkJICogcmVzdCB0eXBlOjpuIHR5cGUgPG51bGw+IG4gPG51bGw+IHR5cGU6Om4ucmVzdCB0eXBlIDxudWxsPiBuIHJlc3QKLQkJICogdHlwZTpuYW1lOm4gdHlwZSBuYW1lIG4gPG51bGw+IHR5cGU6bmFtZTpuLnJlc3QgdHlwZSBuYW1lIG4gcmVzdAotCQkgKi8KLQotCQlPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzRdOwotCQlpZiAocGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIHJlc3VsdDsKLQotCQlpbnQgaSA9IHBhdGguaW5kZXhPZignLicpOwotCQlpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKLQotCQlpZiAoaSA8IDApIHsKLQkJCWkgPSBsZW5ndGg7Ci0JCX0KLQotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSW50ZWdlciBuID0gbnVsbDsKLQkJU3RyaW5nIHJlc3QgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgdHlwZQotCQlpbnQgaiA9IHBhdGguaW5kZXhPZignOicpOwotCQlpZiAoaiA+IGkpCi0JCQlqID0gLTE7Ci0JCWlmIChqIDwgMCkgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHlwZSA9IHBhdGguc3Vic3RyaW5nKDAsIGopOwotCi0JCQkvLyBnZXQgdGhlIG5hbWUKLQkJCWludCBrID0gcGF0aC5pbmRleE9mKCc6JywgaiArIDEpOwotCQkJaWYgKGsgPiBpKQotCQkJCWsgPSAtMTsKLQkJCWlmIChrIDwgMCkgewotCQkJCW5hbWUgPSBwYXRoLnN1YnN0cmluZyhqICsgMSwgaSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluYW1lID0gcGF0aC5zdWJzdHJpbmcoaiArIDEsIGspOwotCi0JCQkJLy8gZ2V0IHRoZSBjb3VudAotCQkJCXRyeSB7Ci0JCQkJCW4gPSBuZXcgSW50ZWdlcihwYXRoLnN1YnN0cmluZyhrICsgMSwgaSkpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4YykgewotCQkJCX0KLQkJCQlpZiAoKG4gIT0gbnVsbCkgJiYgKG4uaW50VmFsdWUoKSA8IDApKSB7Ci0JCQkJCW4gPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICgobmFtZSAhPSBudWxsKSAmJiAobmFtZS5sZW5ndGgoKSA9PSAwKSkgewotCQkJbmFtZSA9IG51bGw7Ci0JCX0KLQotCQlpZiAoaSA8IGxlbmd0aCkgewotCQkJcmVzdCA9IHBhdGguc3Vic3RyaW5nKGkgKyAxKTsKLQkJfQotCi0JCXJlc3VsdFswXSA9IHR5cGU7Ci0JCXJlc3VsdFsxXSA9IGRlY29kZShuYW1lKTsKLQkJcmVzdWx0WzJdID0gbjsKLQkJcmVzdWx0WzNdID0gcmVzdDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZW5jb2RlR2VuKFN0cmluZyBzKSB7Ci0KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgbyA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpIHx8IChjID09ICctJykpIHsKLQkJCQlvLmFwcGVuZChjKTsKLQkJCX0KLQkJCWVsc2UgeyAvLyBpZiAoKGMgPT0gJy4nKSB8fCAoYyA9PSAnOicpIHx8IChjID09ICdfJykgfHwgLi4uKQotCQkJCS8vIGNvbnZlcnQgdGhlIGNoYXJhY3RlciB0byBhIDQgZGlnaXQgaGV4IGNvZGUgcHJlZml4ZWQgYnkgIl8iCi0JCQkJU3RyaW5nIGhleCA9IEludGVnZXIudG9IZXhTdHJpbmcoYyk7Ci0JCQkJaW50IGwgPSBoZXgubGVuZ3RoKCk7Ci0JCQkJaWYgKGwgPT0gMSkgewotCQkJCQlvLmFwcGVuZCgiXzAwMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGwgPT0gMikgewotCQkJCQlvLmFwcGVuZCgiXzAwIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJby5hcHBlbmQoaGV4KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobCA9PSAzKSB7Ci0JCQkJCW8uYXBwZW5kKCJfMCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW8uYXBwZW5kKGhleCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvLmFwcGVuZCgnXycpOwotCQkJCQlvLmFwcGVuZChoZXgpOwotCQkJCX0KLQkJCX0KLQkJfSAvLyBmb3IKLQkJcmV0dXJuIG8udG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZGVjb2RlR2VuKFN0cmluZyBzKSB7Ci0KLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgbyA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0JCWludCBsZW4gPSBzLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQljaGFyIGMgPSBzLmNoYXJBdChpKTsKLQkJCWlmIChjICE9ICdfJykgewotCQkJCW8uYXBwZW5kKGMpOwotCQkJfQotCQkJZWxzZSB7IC8vIG5leHQgNCBjaGFyYWN0ZXJzIGFyZSB0aGUgaGV4IGNvZGUKLQkJCQlTdHJpbmcgaGV4OwotCQkJCWlmIChsZW4gPiBpICsgNCkgewotCQkJCQloZXggPSBzLnN1YnN0cmluZyhpICsgMSwgaSArIDUpOwotCQkJCQlpICs9IDQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQloZXggPSBzLnN1YnN0cmluZyhpICsgMSk7Ci0JCQkJCWkgPSBsZW4gLSAxOwotCQkJCX0KLQkJCQlvLmFwcGVuZCgoY2hhcikgSW50ZWdlci5wYXJzZUludChoZXgsIDE2KSk7Ci0JCQl9Ci0JCX0gLy8gZm9yCi0JCXJldHVybiBvLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFByaW50ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERQcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZjRmYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFByaW50ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPY2N1cnJlbmNlVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBDRGF0YUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERSZXBlYXRhYmxlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFNvdXJjZU9mZnNldDsKLQotCi1wdWJsaWMgY2xhc3MgRFREUHJpbnRlciBleHRlbmRzIERURFZpc2l0b3IgewotCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQlib29sZWFuIHVwZGF0ZU9mZnNldCA9IHRydWU7Ci0KLQlwdWJsaWMgRFREUHJpbnRlcihib29sZWFuIHVwZGF0ZU9mZnNldCkgewotCQl0aGlzLnVwZGF0ZU9mZnNldCA9IHVwZGF0ZU9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlcigpIHsKLQkJcmV0dXJuIHNiOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERmlsZShEVERGaWxlIGZpbGUpIHsKLQkJc3VwZXIudmlzaXREVERGaWxlKGZpbGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRETm90YXRpb24oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQkJZ2VuZXJhdGVDb21tZW50KG5vdGF0aW9uKTsKLQkJdXBkYXRlU3RhcnRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCI8IU5PVEFUSU9OICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChub3RhdGlvbi5nZXROYW1lKCkpLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIHB1YmxpY0lEID0gbm90YXRpb24uZ2V0UHVibGljSUQoKTsKLQkJU3RyaW5nIHN5c3RlbUlEID0gbm90YXRpb24uZ2V0U3lzdGVtSUQoKTsKLQkJaWYgKHB1YmxpY0lEID09IG51bGwgfHwgcHVibGljSUQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzYi5hcHBlbmQoIlNZU1RFTSAiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJc2IuYXBwZW5kKCJQVUJMSUMgXCIiKS5hcHBlbmQocHVibGljSUQpLmFwcGVuZCgiXCIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJaWYgKHN5c3RlbUlEID09IG51bGwpIHsKLQkJCXNiLmFwcGVuZCgiXCJcIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIlwiIikuYXBwZW5kKHN5c3RlbUlEKS5hcHBlbmQoIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVuZFRhZygpOwotCQl1cGRhdGVFbmRPZmZzZXQobm90YXRpb24sIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JCXN1cGVyLnZpc2l0RFRETm90YXRpb24obm90YXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5KERUREVudGl0eSBlbnRpdHkpIHsKLQkJZ2VuZXJhdGVDb21tZW50KGVudGl0eSk7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KGVudGl0eSwgc2IubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoIjwhRU5USVRZICIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJc2IuYXBwZW5kKCIlICIpOyAvLyROT04tTkxTLTEkCi0KLQkJc2IuYXBwZW5kKGVudGl0eS5nZXROYW1lKCkpLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCXNiLmFwcGVuZChlbnRpdHkuZ2V0Q29udGVudCgpLnVucGFyc2UoKSk7Ci0KLQkJZW5kVGFnKCk7Ci0JCXVwZGF0ZUVuZE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpIC0gMSk7IC8vIC0xIGZvciB0aGUgbmV3bGluZSBjaGFyCi0JCXN1cGVyLnZpc2l0RFRERW50aXR5KGVudGl0eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERFbGVtZW50KERUREVsZW1lbnQgZWxlbWVudCkgewotCQlnZW5lcmF0ZUNvbW1lbnQoZWxlbWVudCk7Ci0JCXVwZGF0ZVN0YXJ0T2Zmc2V0KGVsZW1lbnQsIHNiLmxlbmd0aCgpKTsKLQkJc2IuYXBwZW5kKCI8IUVMRU1FTlQgIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCB8fCBjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQkJCXNiLmFwcGVuZCgiICgiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCQkJc2IuYXBwZW5kKCIpIik7IC8vJE5PTi1OTFMtMSQKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSB7Ci0JCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCQl9IC8vIGVuZCBvZiBlbHNlCi0JCWVuZFRhZygpOwotCQl1cGRhdGVFbmRPZmZzZXQoZWxlbWVudCwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkJdmlzaXRBdHRyaWJ1dGVzKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0JCWdlbmVyYXRlQ29tbWVudChwYXJtRW50aXR5KTsKLQkJdXBkYXRlU3RhcnRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkpOwotCQlzYi5hcHBlbmQoIiUiICsgcGFybUVudGl0eS5nZXROYW1lKCkgKyAiO1xuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl1cGRhdGVFbmRPZmZzZXQocGFybUVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lCi0JCQkJCQkJCQkJCQkJCS8vIGNoYXIKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IGNvbnRlbnQpIHsKLQkJdXBkYXRlU3RhcnRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCQlTdHJpbmcgdHJhaWxpbmdDaGFycyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUmVwZWF0YWJsZUNvbnRlbnQpIHsKLQkJCURURFJlcGVhdGFibGVDb250ZW50IHJlcGVhdENvbnRlbnQgPSAoRFREUmVwZWF0YWJsZUNvbnRlbnQpIGNvbnRlbnQ7Ci0JCQlEVERPY2N1cnJlbmNlVHlwZSBvY2N1cnJlbmNlVHlwZSA9IHJlcGVhdENvbnRlbnQuZ2V0T2NjdXJyZW5jZSgpOwotCQkJLy8gSW50ZWdlciBvY2N1cnJlbmNlID0gcmVwZWF0Q29udGVudC5nZXRPY2N1cnJlbmNlKCk7Ci0JCQlpZiAob2NjdXJyZW5jZVR5cGUgIT0gbnVsbCkgewotCQkJCWludCBvY2N1clR5cGUgPSBvY2N1cnJlbmNlVHlwZS5nZXRWYWx1ZSgpOwotCQkJCWlmIChvY2N1clR5cGUgIT0gRFRET2NjdXJyZW5jZVR5cGUuT05FKSB7Ci0JCQkJCWlmIChyZXBlYXRDb250ZW50IGluc3RhbmNlb2YgRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgewotCQkJCQkJc2IuYXBwZW5kKCIoIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXRyYWlsaW5nQ2hhcnMgPSAiKSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQl0cmFpbGluZ0NoYXJzICs9IChjaGFyKSBvY2N1clR5cGU7Ci0JCQkJfQotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJc3VwZXIudmlzaXREVERFbGVtZW50Q29udGVudChjb250ZW50KTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHx8IGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQlzYi5hcHBlbmQoKChEVERSZXBlYXRhYmxlQ29udGVudCkgY29udGVudCkudW5wYXJzZVJlcGVhdGFibGVDb250ZW50KCkpOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCQllbHNlIHsKLQkJCS8vIGhhbmRsZSBEVERQQ0RhdGFDb250ZW50LCBEVERBbnlDb250ZW50IGFuZCBEVERFbXB0eUNvbnRlbnQgaGVyZQotCQkJc2IuYXBwZW5kKGNvbnRlbnQuZ2V0Q29udGVudE5hbWUoKSk7Ci0JCX0gLy8gZW5kIG9mIGVsc2UKLQkJc2IuYXBwZW5kKHRyYWlsaW5nQ2hhcnMpOwotCQl1cGRhdGVFbmRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBncm91cCkgewotCQlzYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotCQlEVERHcm91cEtpbmQga2luZCA9IGdyb3VwLmdldEdyb3VwS2luZCgpOwotCQkvLyBNT0YyRU1GIFBvcnQKLQkJLy8gSW50ZWdlciBncm91cEtpbmQgPSBncm91cC5nZXRHcm91cEtpbmQoKTsKLQkJaWYgKGtpbmQgPT0gbnVsbCkgewotCQkJZ3JvdXAuc2V0R3JvdXBLaW5kKERUREdyb3VwS2luZC5nZXQoRFRER3JvdXBLaW5kLlNFUVVFTkNFKSk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0KLQkJU3RyaW5nIGNvbiA9IGdyb3VwLmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSA/ICIgfCAiIDogIiwgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJLy8gTG9vcCB0aHJ1IHRoZSBjaGlsZHJlbiBvZiB0aGUgY3VycmVudCBncm91cAotCQlDb2xsZWN0aW9uIGNvbnRlbnQgPSBncm91cC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpIHsKLQkJCWJvb2xlYW4gZmlyc3RDb250ZW50ID0gdHJ1ZTsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnQuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJaWYgKCFmaXJzdENvbnRlbnQpIHsKLQkJCQkJc2IuYXBwZW5kKGNvbik7Ci0JCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCQllbHNlIHsKLQkJCQkJZmlyc3RDb250ZW50ID0gZmFsc2U7Ci0JCQkJfSAvLyBlbmQgb2YgZWxzZQotCQkJCXZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlzYi5hcHBlbmQoIikiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCB2aXNpdEF0dHJpYnV0ZXMoRFRERWxlbWVudCBlbGVtKSB7Ci0JCUNvbGxlY3Rpb24gYXR0cnMgPSBlbGVtLmdldERUREF0dHJpYnV0ZSgpOwotCQlJdGVyYXRvciBpID0gYXR0cnMuaXRlcmF0b3IoKTsKLQkJaWYgKGF0dHJzICE9IG51bGwgJiYgaS5oYXNOZXh0KCkpIHsKLQkJCURUREF0dHJpYnV0ZSBhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBjb21tZW50ID0gYXR0cmliLmdldENvbW1lbnQoKTsKLQkJCWlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5sZW5ndGgoKSA+IDApCi0JCQkJc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXNiLmFwcGVuZCgiPCFBVFRMSVNUICIgKyBlbGVtLmdldE5hbWUoKSArICJcbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXNiLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQl1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCXNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkJCXVwZGF0ZUVuZE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkJCXNiLmFwcGVuZCgiXG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yICg7IGkuaGFzTmV4dCgpOykgewotCQkJCWF0dHJpYiA9IChEVERBdHRyaWJ1dGUpIGkubmV4dCgpOwotCQkJCWNvbW1lbnQgPSBhdHRyaWIuZ2V0Q29tbWVudCgpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwgJiYgY29tbWVudC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJc2IuYXBwZW5kKCI+XG4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29tbWVudCAhPSBudWxsICYmIGNvbW1lbnQubGVuZ3RoKCkgPiAwKQotCQkJCQkJc2IuYXBwZW5kKCI8IS0tXG4gIikuYXBwZW5kKGNvbW1lbnQpLmFwcGVuZCgiXG4tLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlzYi5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXVwZGF0ZVN0YXJ0T2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCQkJCXNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkJCQl1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JCQkJc2IuYXBwZW5kKCJcbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzYi5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kVGFnKCkgewotCQlzYi5hcHBlbmQoIj5cbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0YXJ0T2Zmc2V0KERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh1cGRhdGVPZmZzZXQpIHsKLQkJCW8uc2V0U3RhcnRPZmZzZXQob2Zmc2V0KTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5kT2Zmc2V0KERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICh1cGRhdGVPZmZzZXQpIHsKLQkJCW8uc2V0RW5kT2Zmc2V0KG9mZnNldCk7Ci0JCX0gLy8gZW5kIG9mIGlmICgpCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGdlbmVyYXRlQ29tbWVudChEVERPYmplY3QgZHRkT2JqZWN0KSB7Ci0JCVN0cmluZyBjb21tZW50U3RyaW5nID0gbnVsbDsKLQotCQlpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkJCWNvbW1lbnRTdHJpbmcgPSAoKERUREVsZW1lbnQpIGR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCQllbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVERFbnRpdHkpCi0JCQljb21tZW50U3RyaW5nID0gKChEVERFbnRpdHkpIGR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCQllbHNlIGlmIChkdGRPYmplY3QgaW5zdGFuY2VvZiBEVEROb3RhdGlvbikKLQkJCWNvbW1lbnRTdHJpbmcgPSAoKERURE5vdGF0aW9uKSBkdGRPYmplY3QpLmdldENvbW1lbnQoKTsKLQotCQlpZiAoY29tbWVudFN0cmluZyAhPSBudWxsICYmIGNvbW1lbnRTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlzYi5hcHBlbmQoIjwhLS0iKS5hcHBlbmQoY29tbWVudFN0cmluZykuYXBwZW5kKCItLT5cbiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLQotCi0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIGdldEJ1ZmZlckdlbigpIHsKLQkvLwotCS8vIHJldHVybiBzYjsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREZpbGVHZW4oRFRERmlsZSBmaWxlKSB7Ci0JLy8KLQkvLyBzdXBlci52aXNpdERUREZpbGUoZmlsZSk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVEROb3RhdGlvbkdlbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCS8vCi0JLy8gZ2VuZXJhdGVDb21tZW50KG5vdGF0aW9uKTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChub3RhdGlvbiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiPCFOT1RBVElPTiAiKTsKLQkvLyBzYi5hcHBlbmQobm90YXRpb24uZ2V0TmFtZSgpKS5hcHBlbmQoIiAiKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIHB1YmxpY0lEID0gbm90YXRpb24uZ2V0UHVibGljSUQoKTsKLQkvLyBTdHJpbmcgc3lzdGVtSUQgPSBub3RhdGlvbi5nZXRTeXN0ZW1JRCgpOwotCS8vIGlmIChwdWJsaWNJRCA9PSBudWxsIHx8IHB1YmxpY0lELmVxdWFscygiIikpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiU1lTVEVNICIpOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiUFVCTElDIFwiIikuYXBwZW5kKHB1YmxpY0lEKS5hcHBlbmQoIlwiICIpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gaWYgKHN5c3RlbUlEPT1udWxsKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlwiXCIiKTsKLQkvLyB9Ci0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIlwiIikuYXBwZW5kKHN5c3RlbUlEKS5hcHBlbmQoIlwiIik7Ci0JLy8gfQotCS8vIGVuZFRhZygpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChub3RhdGlvbiwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkvLyBzdXBlci52aXNpdERURE5vdGF0aW9uKG5vdGF0aW9uKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eUdlbihEVERFbnRpdHkgZW50aXR5KSB7Ci0JLy8KLQkvLyBnZW5lcmF0ZUNvbW1lbnQoZW50aXR5KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChlbnRpdHksIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoIjwhRU5USVRZICIpOwotCS8vCi0JLy8KLQkvLyBpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JLy8gc2IuYXBwZW5kKCIlICIpOwotCS8vCi0JLy8KLQkvLyBzYi5hcHBlbmQoZW50aXR5LmdldE5hbWUoKSkuYXBwZW5kKCIgIik7Ci0JLy8gc2IuYXBwZW5kKGVudGl0eS5nZXRDb250ZW50KCkudW5wYXJzZSgpKTsKLQkvLwotCS8vCi0JLy8gZW5kVGFnKCk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGVudGl0eSwgc2IubGVuZ3RoKCkgLSAxKTsgLy8gLTEgZm9yIHRoZSBuZXdsaW5lIGNoYXIKLQkvLyBzdXBlci52aXNpdERUREVudGl0eShlbnRpdHkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRERWxlbWVudEdlbihEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChlbGVtZW50KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCI8IUVMRU1FTlQgIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsKLQkvLyBEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gZWxlbWVudC5nZXRDb250ZW50KCk7Ci0JLy8gaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERQQ0RhdGFDb250ZW50IHx8Ci0JLy8gY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIiAoIik7Ci0JLy8gc3VwZXIudmlzaXREVERFbGVtZW50KGVsZW1lbnQpOwotCS8vIHNiLmFwcGVuZCgiKSIpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIiAiKTsKLQkvLyBzdXBlci52aXNpdERUREVsZW1lbnQoZWxlbWVudCk7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIGVuZFRhZygpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChlbGVtZW50LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUgY2hhcgotCS8vIHZpc2l0QXR0cmlidXRlcyhlbGVtZW50KTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZAotCS8vIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlR2VuKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZQotCS8vIHBhcm1FbnRpdHkpIHsKLQkvLwotCS8vIGdlbmVyYXRlQ29tbWVudChwYXJtRW50aXR5KTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChwYXJtRW50aXR5LCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCIlIiArIHBhcm1FbnRpdHkuZ2V0TmFtZSgpICsgIjtcbiIpOwotCS8vIHVwZGF0ZUVuZE9mZnNldChwYXJtRW50aXR5LCBzYi5sZW5ndGgoKSAtIDEpOyAvLyAtMSBmb3IgdGhlIG5ld2xpbmUKLQkvLyBjaGFyCi0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0JLy8KLQkvLyB1cGRhdGVTdGFydE9mZnNldChjb250ZW50LCBzYi5sZW5ndGgoKSk7Ci0JLy8gU3RyaW5nIHRyYWlsaW5nQ2hhcnMgPSAiIjsKLQkvLyBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50ICkKLQkvLyB7Ci0JLy8gRFREUmVwZWF0YWJsZUNvbnRlbnQgcmVwZWF0Q29udGVudCA9IChEVERSZXBlYXRhYmxlQ29udGVudCkgY29udGVudDsKLQkvLyBJbnRlZ2VyIG9jY3VycmVuY2UgPSByZXBlYXRDb250ZW50LmdldE9jY3VycmVuY2UoKTsKLQkvLyBpZiAob2NjdXJyZW5jZSAhPSBudWxsKQotCS8vIHsKLQkvLyBpbnQgb2NjdXJUeXBlID0gb2NjdXJyZW5jZS5pbnRWYWx1ZSgpOwotCS8vIGlmIChvY2N1clR5cGUgIT0gRFRET2NjdXJyZW5jZVR5cGUuT05FKQotCS8vIHsKLQkvLyBpZiAocmVwZWF0Q29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiKCIpOwotCS8vIHRyYWlsaW5nQ2hhcnMgPSAiKSI7Ci0JLy8gfQotCS8vIHRyYWlsaW5nQ2hhcnMgKz0gKGNoYXIpIG9jY3VyVHlwZTsKLQkvLyB9Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vICAgIAotCS8vIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRER3JvdXBDb250ZW50KQotCS8vIHsKLQkvLyBzdXBlci52aXNpdERUREVsZW1lbnRDb250ZW50KGNvbnRlbnQpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IHx8Ci0JLy8gY29udGVudCBpbnN0YW5jZW9mIERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHNiLmFwcGVuZCgoKERURFJlcGVhdGFibGVDb250ZW50KWNvbnRlbnQpLnVucGFyc2VSZXBlYXRhYmxlQ29udGVudCgpKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gLy8gaGFuZGxlIERURFBDRGF0YUNvbnRlbnQsIERUREFueUNvbnRlbnQgYW5kIERUREVtcHR5Q29udGVudCBoZXJlCi0JLy8gc2IuYXBwZW5kKGNvbnRlbnQuZ2V0Q29udGVudE5hbWUoKSk7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIHNiLmFwcGVuZCh0cmFpbGluZ0NoYXJzKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoY29udGVudCwgc2IubGVuZ3RoKCkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHZpc2l0RFRER3JvdXBDb250ZW50R2VuKERUREdyb3VwQ29udGVudCBncm91cCkgewotCS8vCi0JLy8gc2IuYXBwZW5kKCIoIik7Ci0JLy8gICAgCi0JLy8gSW50ZWdlciBncm91cEtpbmQgPSBncm91cC5nZXRHcm91cEtpbmQoKTsKLQkvLyBpZiAoZ3JvdXBLaW5kID09IG51bGwpCi0JLy8gewotCS8vIGdyb3VwLnNldEdyb3VwS2luZChEVERHcm91cEtpbmQuU0VRVUVOQ0UpOwotCS8vIH0gLy8gZW5kIG9mIGlmICgpCi0JLy8gICAgCi0JLy8gU3RyaW5nIGNvbiA9IGdyb3VwLmdldEdyb3VwS2luZCgpLmludFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLkNIT0lDRSA/ICIKLQkvLyB8ICIgOiAiLCAiOwotCS8vCi0JLy8KLQkvLyAvLyBMb29wIHRocnUgdGhlIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IGdyb3VwCi0JLy8gQ29sbGVjdGlvbiBjb250ZW50ID0gZ3JvdXAuZ2V0Q29udGVudCgpOwotCS8vIGlmIChjb250ZW50ICE9IG51bGwpCi0JLy8gewotCS8vIGJvb2xlYW4gZmlyc3RDb250ZW50ID0gdHJ1ZTsKLQkvLyBmb3IgKEl0ZXJhdG9yIGkgPSBjb250ZW50Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JLy8gewotCS8vIGlmICghZmlyc3RDb250ZW50KQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoY29uKTsKLQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gZmlyc3RDb250ZW50ID0gZmFsc2U7Ci0JLy8gfSAvLyBlbmQgb2YgZWxzZQotCS8vIHZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gc2IuYXBwZW5kKCIpIik7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgdmlzaXRBdHRyaWJ1dGVzR2VuKERUREVsZW1lbnQgZWxlbSkgewotCS8vCi0JLy8gQ29sbGVjdGlvbiBhdHRycyA9IGVsZW0uZ2V0RFREQXR0cmlidXRlKCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0JLy8gaWYgKGF0dHJzICE9IG51bGwgJiYgaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIERUREF0dHJpYnV0ZSBhdHRyaWIgPSAoRFREQXR0cmlidXRlKSBpLm5leHQoKTsKLQkvLyBTdHJpbmcgY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JLy8gaWYgKGNvbW1lbnQhPW51bGwgJiYgY29tbWVudC5sZW5ndGgoKT4wKQotCS8vIHNiLmFwcGVuZCgiPCEtLVxuICIpLmFwcGVuZChjb21tZW50KS5hcHBlbmQoIlxuLS0+XG4iKTsKLQkvLyBzYi5hcHBlbmQoIjwhQVRUTElTVCAiICsgZWxlbS5nZXROYW1lKCkgKyAiXG4iKTsKLQkvLyBzYi5hcHBlbmQoIiAiKTsKLQkvLyB1cGRhdGVTdGFydE9mZnNldChhdHRyaWIsIHNiLmxlbmd0aCgpKTsKLQkvLyBzYi5hcHBlbmQoYXR0cmliLnVucGFyc2UoKSk7Ci0JLy8gdXBkYXRlRW5kT2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZCgiXG4iKTsKLQkvLyBmb3IgKDsgaS5oYXNOZXh0KCk7ICkKLQkvLyB7Ci0JLy8gYXR0cmliID0gKERUREF0dHJpYnV0ZSkgaS5uZXh0KCk7Ci0JLy8gY29tbWVudCA9IGF0dHJpYi5nZXRDb21tZW50KCk7Ci0JLy8gaWYgKGNvbW1lbnQhPW51bGwgJiYgY29tbWVudC5sZW5ndGgoKT4wKQotCS8vIHsKLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIGlmIChjb21tZW50IT1udWxsICYmIGNvbW1lbnQubGVuZ3RoKCk+MCkKLQkvLyBzYi5hcHBlbmQoIjwhLS1cbiAiKS5hcHBlbmQoY29tbWVudCkuYXBwZW5kKCJcbi0tPlxuIik7Ci0JLy8gc2IuYXBwZW5kKCI8IUFUVExJU1QgIiArIGVsZW0uZ2V0TmFtZSgpICsgIlxuIik7Ci0JLy8gfQotCS8vIHNiLmFwcGVuZCgiICIpOwotCS8vIHVwZGF0ZVN0YXJ0T2Zmc2V0KGF0dHJpYiwgc2IubGVuZ3RoKCkpOwotCS8vIHNiLmFwcGVuZChhdHRyaWIudW5wYXJzZSgpKTsKLQkvLyB1cGRhdGVFbmRPZmZzZXQoYXR0cmliLCBzYi5sZW5ndGgoKSk7Ci0JLy8gc2IuYXBwZW5kKCJcbiIpOwotCS8vIH0KLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBlbmRUYWdHZW4oKSB7Ci0JLy8KLQkvLyBzYi5hcHBlbmQoIj5cbiIpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXJ0T2Zmc2V0R2VuKERURFNvdXJjZU9mZnNldCBvLCBpbnQgb2Zmc2V0KSB7Ci0JLy8KLQkvLyBpZiAodXBkYXRlT2Zmc2V0KQotCS8vIHsKLQkvLyBvLnNldFN0YXJ0T2Zmc2V0KG9mZnNldCk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFbmRPZmZzZXRHZW4oRFREU291cmNlT2Zmc2V0IG8sIGludCBvZmZzZXQpIHsKLQkvLwotCS8vIGlmICh1cGRhdGVPZmZzZXQpCi0JLy8gewotCS8vIG8uc2V0RW5kT2Zmc2V0KG9mZnNldCk7Ci0JLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUNvbW1lbnRHZW4oRFRET2JqZWN0IGR0ZE9iamVjdCkgewotCS8vCi0JLy8gU3RyaW5nIGNvbW1lbnRTdHJpbmcgPSBudWxsOwotCS8vCi0JLy8KLQkvLyBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkKLQkvLyBjb21tZW50U3RyaW5nID0gKChEVERFbGVtZW50KWR0ZE9iamVjdCkuZ2V0Q29tbWVudCgpOwotCS8vIGVsc2UgaWYgKGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVudGl0eSkKLQkvLyBjb21tZW50U3RyaW5nID0gKChEVERFbnRpdHkpZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JLy8gZWxzZSBpZiAoZHRkT2JqZWN0IGluc3RhbmNlb2YgRFRETm90YXRpb24pCi0JLy8gY29tbWVudFN0cmluZyA9ICgoRFRETm90YXRpb24pZHRkT2JqZWN0KS5nZXRDb21tZW50KCk7Ci0JLy8KLQkvLwotCS8vIGlmICggY29tbWVudFN0cmluZyE9bnVsbCAmJiBjb21tZW50U3RyaW5nLmxlbmd0aCgpPjApCi0JLy8gewotCS8vIHNiLmFwcGVuZCgiPCEtLSIpLmFwcGVuZChjb21tZW50U3RyaW5nKS5hcHBlbmQoIi0tPlxuIik7Ci0JLy8gfQotCS8vIH0KLX0vLyBEVERQcmludGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFJlc291cmNlRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFlMmFhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VGYWN0b3J5SW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgRFREUmVzb3VyY2VGYWN0b3J5SW1wbCBleHRlbmRzIFJlc291cmNlRmFjdG9yeUltcGwgewotCXB1YmxpYyBEVERSZXNvdXJjZUZhY3RvcnlJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShTdHJpbmcgZmlsZW5hbWUpIHsKLQkJcmV0dXJuIG5ldyBEVERSZXNvdXJjZUltcGwoZmlsZW5hbWUpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShVUkkgdXJpKSB7Ci0JCXJldHVybiBuZXcgRFREUmVzb3VyY2VJbXBsKHVyaSk7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKFJlc291cmNlU2V0IHJlc291cmNlcywgVVJJIHVyaSkgewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBEVERSZXNvdXJjZUltcGwodXJpKTsKLQkJcmVzb3VyY2VzLmdldFJlc291cmNlcygpLmFkZChyZXNvdXJjZSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JCVJlc291cmNlIHJlc291cmNlID0gbmV3IERURFJlc291cmNlSW1wbCh1cmkpOwotCQlyZXNvdXJjZXMuZ2V0UmVzb3VyY2VzKCkuYWRkKHJlc291cmNlKTsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24gewotCQlSZXNvdXJjZSByZXNvdXJjZSA9IGNyZWF0ZVJlc291cmNlKHVyaSk7Ci0JCXJlc291cmNlLmxvYWQobmV3IEhhc2hNYXAoKSk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChVUkkgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZSh1cmkpOwotCQlyZXNvdXJjZS5sb2FkKG5ldyBIYXNoTWFwKCkpOwotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHVibGljIFJlc291cmNlIGxvYWQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGxvYWQocmVzb3VyY2VzLCB1cmksIG5ldyBIYXNoTWFwKCkpOwotCX0KLQotCXB1YmxpYyBSZXNvdXJjZSBsb2FkKFJlc291cmNlU2V0IHJlc291cmNlcywgVVJJIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXJldHVybiBsb2FkKHJlc291cmNlcywgdXJpLCBuZXcgSGFzaE1hcCgpKTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmksIE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZXMsIHVyaSk7Ci0JCXJlc291cmNlLmxvYWQob3B0aW9ucyk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgbG9hZChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFVSSSB1cmksIE1hcCBvcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJUmVzb3VyY2UgcmVzb3VyY2UgPSBjcmVhdGVSZXNvdXJjZShyZXNvdXJjZXMsIHVyaSk7Ci0JCXJlc291cmNlLmxvYWQob3B0aW9ucyk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci19IC8vIERURFJlc291cmNlRmFjdG9yeUltcGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERSZXNvdXJjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5ZGE0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREUmVzb3VyY2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC56aXAuWmlwT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLkVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRET2JqZWN0OwotCi0KLXB1YmxpYyBjbGFzcyBEVERSZXNvdXJjZUltcGwgZXh0ZW5kcyBSZXNvdXJjZUltcGwgewotCi0JcHVibGljIERURFJlc291cmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRFREUmVzb3VyY2VJbXBsKFN0cmluZyBmaWxlbmFtZSkgewotCQlzdXBlcihVUkkuY3JlYXRlVVJJKGZpbGVuYW1lKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+PiBEVERSZXNvdXJjZUltcGwgY3RvciAxIik7Ci0JfQotCi0JcHVibGljIERURFJlc291cmNlSW1wbChVUkkgdXJpKSB7Ci0JCXN1cGVyKHVyaSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiPj4+PiBEVERSZXNvdXJjZUltcGwgY3RvciAyIik7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVzb2x2ZWQgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gVVJJCi0JICoge0BsaW5rIFVSSSNmcmFnbWVudCBmcmFnbWVudH0uCi0JICogPHA+Ci0JICogVGhlIGZyYWdtZW50IGVuY29kaW5nIHdpbGwgdHlwaWNhbGx5IGJlIHRoYXQgcHJvZHVjZWQgYnkKLQkgKiB7QGxpbmsgI2dldFVSSUZyYWdtZW50IGdldFVSSUZyYWdtZW50fS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHVyaUZyYWdtZW50Ci0JICogICAgICAgICAgICB0aGUgZnJhZ21lbnQgdG8gcmVzb2x2ZS4KLQkgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBvYmplY3QgZm9yIHRoZSBnaXZlbiBmcmFnbWVudC4KLQkgKiBAc2VlICNnZXRVUklGcmFnbWVudChFT2JqZWN0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0I2dldEVPYmplY3QoVVJJLCBib29sZWFuKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnV0aWwuRWNvcmVVdGlsI3Jlc29sdmUoRU9iamVjdCwgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0KQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlT2JqZWN0Rm9yVVJJRnJhZ21lbnRTZWdtZW50KFN0cmluZykKLQkgKiBAdGhyb3dzIG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5XcmFwcGVkRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBuYXZpZ2F0aW5nIHRoZSBmcmFnbWVudC4KLQkgKi8KLQlwdWJsaWMgRU9iamVjdCBnZXRFT2JqZWN0KGphdmEubGFuZy5TdHJpbmcgdXJpRnJhZ21lbnQpIHsKLQkJRUxpc3QgY29udGVudHMgPSBnZXRDb250ZW50cygpOwotCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCQkJLy8gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIERUREZpbGUgaW4gYSBEVEQgZXh0ZW50Ci0JCQkJCUVPYmplY3QgcmVzdWx0ID0gKChEVERGaWxlKSBvYmopLmZpbmRPYmplY3QodXJpRnJhZ21lbnQpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIj4+PiBEVERLZXkgRXJyb3I6IGNhbm5vdCBmaW5kIG9iamVjdCAiICsgdXJpRnJhZ21lbnQpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBzdXBlci5nZXRFT2JqZWN0KHVyaUZyYWdtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBVUkkge0BsaW5rIFVSSSNmcmFnbWVudCBmcmFnbWVudH0gdGhhdCwgd2hlbiBwYXNzZWQgdG8KLQkgKiB7QGxpbmsgI2dldEVPYmplY3QgZ2V0RU9iamVjdH0gd2lsbCByZXR1cm4gdGhlIGdpdmVuIG9iamVjdC4KLQkgKiA8cD4KLQkgKiBJbiBvdGhlciB3b3JkcywgdGhlIGZvbGxvd2luZyBpcyA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYW55IG9iamVjdAotCSAqIGNvbnRhaW5lZCBieSBhIHJlc291cmNlOgotCSAqIAotCSAqIDxwcmU+Ci0JICogCi0JICogICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBlT2JqZWN0LmVSZXNvdXJjZSgpOwotCSAqICAgIGVPYmplY3QgPT0gcmVzb3VyY2UuZ2V0RU9iamVjdChyZXNvdXJjZS5nZXRVUklGcmFnbWVudChlT2JqZWN0KSkKLQkgKiAKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiBBbiBpbXBsZW1lbnRhdGlvbiBtYXkgY2hvb3NlIHRvIHVzZSBJRHMgb3IgdG8gdXNlIHN0cnVjdHVyZWQgVVJJCi0JICogZnJhZ21lbnRzLCBhcyBzdXBwb3J0ZWQgYnkKLQkgKiB7QGxpbmsgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkludGVybmFsRU9iamVjdCNlVVJJRnJhZ21lbnRTZWdtZW50IGVVUklGcmFnbWVudFNlZ21lbnR9LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZU9iamVjdAotCSAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBpZGVudGlmeS4KLQkgKiBAcmV0dXJuIHRoZSBVUkkge0BsaW5rIFVSSSNmcmFnbWVudCBmcmFnbWVudH0gZm9yIHRoZSBvYmplY3QuCi0JICogQHNlZSAjZ2V0RU9iamVjdChTdHJpbmcpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuSW50ZXJuYWxFT2JqZWN0I2VVUklGcmFnbWVudFNlZ21lbnQob3JnLmVjbGlwc2UuZW1mLmNvcmUuRVN0cnVjdHVyYWxGZWF0dXJlLAotCSAqICAgICAgRU9iamVjdCkKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRVUklGcmFnbWVudChFT2JqZWN0IGVPYmplY3QpIHsKLQkJaWYgKGVPYmplY3QgaW5zdGFuY2VvZiBEVERPYmplY3QpIHsKLQkJCXJldHVybiAoKERURE9iamVjdCkgZU9iamVjdCkuZ2V0UGF0aG5hbWUoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0VVJJRnJhZ21lbnQoZU9iamVjdCk7Ci0JfQotCi0JcHJpdmF0ZSBEVERVdGlsIGR0ZFV0aWw7Ci0KLQlwdWJsaWMgRFREVXRpbCBnZXREVERVdGlsKCkgewotCQlyZXR1cm4gZHRkVXRpbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREVERVdGlsKERURFV0aWwgZHRkVXRpbCkgewotCQl0aGlzLmR0ZFV0aWwgPSBkdGRVdGlsOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoTWFwIG9wdGlvbnMpIHsKLQotCQlTdHJpbmcgdXJpU3RyaW5nID0gZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCURURFV0aWwgZHRkVXRpbCA9IG5ldyBEVERVdGlsKCk7Ci0JCQlkdGRVdGlsLnBhcnNlKGdldFJlc291cmNlU2V0KCksIHVyaVN0cmluZyk7Ci0JCQlkdGRVdGlsLnNldFJlc291cmNlKHRoaXMpOwotCQkJc2V0RFREVXRpbChkdGRVdGlsKTsKLQkJCWdldENvbnRlbnRzKCkuYWRkKGR0ZFV0aWwuZ2V0RFRERmlsZSgpKTsKLQotCQkJLy8gUmVzZXQgdGhlIGRpcnR5IGZsYWcgYWZ0ZXIgdGhlIHJlc291cmNlIGlzIGxvYWRlZAotCQkJc2V0TW9kaWZpZWQoZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZXhjKSB7Ci0JCQlleGMucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvcywgT2JqZWN0IG9wdGlvbnMpIHRocm93cyBFeGNlcHRpb24gewotCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IGNvbnRlbnRzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCURURFByaW50ZXIgcHJpbnRlciA9IG5ldyBEVERQcmludGVyKHRydWUpOwotCQkJCQkJcHJpbnRlci52aXNpdERUREZpbGUoKERUREZpbGUpIG9iaik7Ci0KLQkJCQkJCVN0cmluZyBzID0gcHJpbnRlci5nZXRCdWZmZXIoKS50b1N0cmluZygpOwotCQkJCQkJb3Mud3JpdGUocy5nZXRCeXRlcygpKTsKLQkJCQkJCS8vIFJlc2V0IHRoZSBkaXJ0eSBmbGFnIGFmdGVyIHRoZSByZXNvdXJjZSBpcyBzYXZlZAotCQkJCQkJc2V0TW9kaWZpZWQoZmFsc2UpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmUoWmlwT3V0cHV0U3RyZWFtIHpvcywgU3RyaW5nIGVudHJ5LCBTdHJpbmcgbWV0YU1vZGVsTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBFeGNlcHRpb24oRFREQ29yZU1lc3NhZ2VzLl9FWENfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFN3aXRjaC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFN3aXRjaC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzdiMTI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERTd2l0Y2guamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVDbGFzczsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUNsYXNzaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVEYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRUVudW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVNb2RlbEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVOYW1lZEVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVTdHJ1Y3R1cmFsRmVhdHVyZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuRVR5cGVkRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERCYXNpY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbXB0eUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbnRpdHlDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudW1lcmF0aW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREV4dGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREdyb3VwQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREludGVybmFsRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFja2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlcGVhdGFibGVDb250ZW50OwotCi0KLQotcHVibGljIGNsYXNzIERURFN3aXRjaCB7Ci0JLyoqCi0JICogVGhlIGNhY2hlZCBtb2RlbCBwYWNrYWdlIDwhLS0gYmVnaW4tdXNlci1kb2MgLS0+IDwhLS0gZW5kLXVzZXItZG9jIC0tPgotCSAqIAotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIERURFBhY2thZ2UgbW9kZWxQYWNrYWdlOwotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIERURFN3aXRjaCgpIHsKLQkJaWYgKG1vZGVsUGFja2FnZSA9PSBudWxsKSB7Ci0JCQltb2RlbFBhY2thZ2UgPSBEVERQYWNrYWdlLmVJTlNUQU5DRTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgZG9Td2l0Y2goRU9iamVjdCB0aGVFT2JqZWN0KSB7Ci0JCUVDbGFzcyB0aGVFQ2xhc3MgPSB0aGVFT2JqZWN0LmVDbGFzcygpOwotCQlpZiAodGhlRUNsYXNzLmVDb250YWluZXIoKSA9PSBtb2RlbFBhY2thZ2UpIHsKLQkJCXN3aXRjaCAodGhlRUNsYXNzLmdldENsYXNzaWZpZXJJRCgpKSB7Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9HUk9VUF9DT05URU5UIDogewotCQkJCQlEVERHcm91cENvbnRlbnQgZHRkR3JvdXBDb250ZW50ID0gKERUREdyb3VwQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERHcm91cENvbnRlbnQoZHRkR3JvdXBDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURFJlcGVhdGFibGVDb250ZW50KGR0ZEdyb3VwQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRHcm91cENvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BVFRSSUJVVEUgOiB7Ci0JCQkJCURUREF0dHJpYnV0ZSBkdGRBdHRyaWJ1dGUgPSAoRFREQXR0cmlidXRlKSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREF0dHJpYnV0ZShkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUF0dHJpYnV0ZShkdGRBdHRyaWJ1dGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFVHlwZWRFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTW9kZWxFbGVtZW50KGR0ZEF0dHJpYnV0ZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VMRU1FTlQgOiB7Ci0JCQkJCURUREVsZW1lbnQgZHRkRWxlbWVudCA9IChEVERFbGVtZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURUREVsZW1lbnQoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3MoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoZHRkRWxlbWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFTmFtZWRFbGVtZW50KGR0ZEVsZW1lbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRFbGVtZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU1QVFlfQ09OVEVOVCA6IHsKLQkJCQkJRFRERW1wdHlDb250ZW50IGR0ZEVtcHR5Q29udGVudCA9IChEVERFbXB0eUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW1wdHlDb250ZW50KGR0ZEVtcHR5Q29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRFbXB0eUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9BTllfQ09OVEVOVCA6IHsKLQkJCQkJRFREQW55Q29udGVudCBkdGRBbnlDb250ZW50ID0gKERUREFueUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFREQW55Q29udGVudChkdGRBbnlDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURUREVsZW1lbnRDb250ZW50KGR0ZEFueUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9QQ19EQVRBX0NPTlRFTlQgOiB7Ci0JCQkJCURURFBDRGF0YUNvbnRlbnQgZHRkcGNEYXRhQ29udGVudCA9IChEVERQQ0RhdGFDb250ZW50KSB0aGVFT2JqZWN0OwotCQkJCQlPYmplY3QgcmVzdWx0ID0gY2FzZURURFBDRGF0YUNvbnRlbnQoZHRkcGNEYXRhQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRwY0RhdGFDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRUxFTUVOVF9SRUZFUkVOQ0VfQ09OVEVOVCA6IHsKLQkJCQkJRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgPSAoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERWxlbWVudENvbnRlbnQoZHRkRWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9GSUxFIDogewotCQkJCQlEVERGaWxlIGR0ZEZpbGUgPSAoRFRERmlsZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERGaWxlKGR0ZEZpbGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9CQVNJQ19UWVBFIDogewotCQkJCQlEVERCYXNpY1R5cGUgZHRkQmFzaWNUeXBlID0gKERUREJhc2ljVHlwZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERCYXNpY1R5cGUoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVDbGFzcyhkdGRCYXNpY1R5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRUNsYXNzaWZpZXIoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVOYW1lZEVsZW1lbnQoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZUVNb2RlbEVsZW1lbnQoZHRkQmFzaWNUeXBlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5VTUVSQVRJT05fVFlQRSA6IHsKLQkJCQkJRFRERW51bWVyYXRpb25UeXBlIGR0ZEVudW1lcmF0aW9uVHlwZSA9IChEVERFbnVtZXJhdGlvblR5cGUpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW51bWVyYXRpb25UeXBlKGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFRW51bShkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRURhdGFUeXBlKGR0ZEVudW1lcmF0aW9uVHlwZSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VFQ2xhc3NpZmllcihkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU5hbWVkRWxlbWVudChkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRU1vZGVsRWxlbWVudChkdGRFbnVtZXJhdGlvblR5cGUpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBkZWZhdWx0Q2FzZSh0aGVFT2JqZWN0KTsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQkJY2FzZSBEVERQYWNrYWdlLkRURF9OT1RBVElPTiA6IHsKLQkJCQkJRFRETm90YXRpb24gZHRkTm90YXRpb24gPSAoRFRETm90YXRpb24pIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRETm90YXRpb24oZHRkTm90YXRpb24pOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREQ29udGVudChkdGROb3RhdGlvbik7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VOVElUWSA6IHsKLQkJCQkJRFRERW50aXR5IGR0ZEVudGl0eSA9IChEVERFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERW50aXR5KGR0ZEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERDb250ZW50KGR0ZEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0VYVEVSTkFMX0VOVElUWSA6IHsKLQkJCQkJRFRERXh0ZXJuYWxFbnRpdHkgZHRkRXh0ZXJuYWxFbnRpdHkgPSAoRFRERXh0ZXJuYWxFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRERXh0ZXJuYWxFbnRpdHkoZHRkRXh0ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERW50aXR5Q29udGVudChkdGRFeHRlcm5hbEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX0lOVEVSTkFMX0VOVElUWSA6IHsKLQkJCQkJRFRESW50ZXJuYWxFbnRpdHkgZHRkSW50ZXJuYWxFbnRpdHkgPSAoRFRESW50ZXJuYWxFbnRpdHkpIHRoZUVPYmplY3Q7Ci0JCQkJCU9iamVjdCByZXN1bHQgPSBjYXNlRFRESW50ZXJuYWxFbnRpdHkoZHRkSW50ZXJuYWxFbnRpdHkpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFRERW50aXR5Q29udGVudChkdGRJbnRlcm5hbEVudGl0eSk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCQljYXNlIERURFBhY2thZ2UuRFREX1BBUkFNRVRFUl9FTlRJVFlfUkVGRVJFTkNFIDogewotCQkJCQlEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlID0gKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gY2FzZURURENvbnRlbnQoZHRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWNhc2UgRFREUGFja2FnZS5EVERfRU5USVRZX1JFRkVSRU5DRV9DT05URU5UIDogewotCQkJCQlEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQgPSAoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgdGhlRU9iamVjdDsKLQkJCQkJT2JqZWN0IHJlc3VsdCA9IGNhc2VEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KGR0ZEVudGl0eVJlZmVyZW5jZUNvbnRlbnQpOwotCQkJCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQkJCQlyZXN1bHQgPSBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoZHRkRW50aXR5UmVmZXJlbmNlQ29udGVudCk7Ci0JCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCXJlc3VsdCA9IGNhc2VEVERFbGVtZW50Q29udGVudChkdGRFbnRpdHlSZWZlcmVuY2VDb250ZW50KTsKLQkJCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJCQkJcmVzdWx0ID0gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOgotCQkJCQlyZXR1cm4gZGVmYXVsdENhc2UodGhlRU9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlZmF1bHRDYXNlKHRoZUVPYmplY3QpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREZpbGUoRFRERmlsZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRETm90YXRpb24oRFRETm90YXRpb24gb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURENvbnRlbnQoRFREQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5KERUREVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW50aXR5Q29udGVudChEVERFbnRpdHlDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFeHRlcm5hbEVudGl0eShEVERFeHRlcm5hbEVudGl0eSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRESW50ZXJuYWxFbnRpdHkoRFRESW50ZXJuYWxFbnRpdHkgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2Ugb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREUmVwZWF0YWJsZUNvbnRlbnQoRFREUmVwZWF0YWJsZUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbGVtZW50KERUREVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURUREVsZW1lbnRDb250ZW50KERUREVsZW1lbnRDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERFbXB0eUNvbnRlbnQoRFRERW1wdHlDb250ZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VEVERBbnlDb250ZW50KERUREFueUNvbnRlbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZURURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRER3JvdXBDb250ZW50KERUREdyb3VwQ29udGVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQXR0cmlidXRlKERUREF0dHJpYnV0ZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFRERW51bWVyYXRpb25UeXBlKERUREVudW1lcmF0aW9uVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRFREQmFzaWNUeXBlKERUREJhc2ljVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vIC8vIHB1YmxpYyBPYmplY3QgY2FzZUVOYW1lc3BhY2UoRU5hbWVzcGFjZSBvYmplY3QpIHsKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3MoRUNsYXNzIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQXR0cmlidXRlKEVBdHRyaWJ1dGUgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVFbnVtKEVFbnVtIG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFTW9kZWxFbGVtZW50KEVNb2RlbEVsZW1lbnQgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQgVGhpcyBmaWVsZC9tZXRob2Qgd2lsbCBiZSByZXBsYWNlZCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLgotCSAqLwotCXB1YmxpYyBPYmplY3QgY2FzZUVOYW1lZEVsZW1lbnQoRU5hbWVkRWxlbWVudCBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVN0cnVjdHVyYWxGZWF0dXJlKEVTdHJ1Y3R1cmFsRmVhdHVyZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRURhdGFUeXBlKEVEYXRhVHlwZSBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JcHVibGljIE9iamVjdCBjYXNlRVR5cGVkRWxlbWVudChFVHlwZWRFbGVtZW50IG9iamVjdCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGNhc2VFQ2xhc3NpZmllcihFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZCBUaGlzIGZpZWxkL21ldGhvZCB3aWxsIGJlIHJlcGxhY2VkIGR1cmluZyBjb2RlIGdlbmVyYXRpb24uCi0JICovCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vCi0JLy8gKysrKysrKysrKysrKysrKysrK0dFTkVSSUNSVUxFUy5KU0VEKysrKysrKysrKysrKysrKysrKwotCS8vIC8vIHB1YmxpYyBPYmplY3QgY2FzZUludGVybmFsRUNsYXNzaWZpZXIoSW50ZXJuYWxFQ2xhc3NpZmllciBvYmplY3QpIHsKLQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tR0VORVJJQ1JVTEVTLkpTRUQtLS0tLS0tLS0tLS0tLS0tLS0tCi0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS1HRU5FUklDUlVMRVMuSlNFRC0tLS0tLS0tLS0tLS0tLS0tLS0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkIFRoaXMgZmllbGQvbWV0aG9kIHdpbGwgYmUgcmVwbGFjZWQgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGRlZmF1bHRDYXNlKEVPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotfSAvLyBEVERTd2l0Y2gKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVW5pcXVlTmFtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTJmNmIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbWYvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVEROb3RhdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERVbmlxdWVOYW1lSGVscGVyIHsKLQlwdWJsaWMgRFREVW5pcXVlTmFtZUhlbHBlcigpIHsKLQotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IGVsZW1lbnRzID0gZHRkRmlsZS5saXN0RFRERWxlbWVudCgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbGVtZW50cywgIk5ld0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVudGl0eU5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZW50aXRpZXMgPSBkdGRGaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZW50aXRpZXMsICJOZXdFbnRpdHkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5vdGF0aW9uTmFtZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJTGlzdCBub3RhdGlvbnMgPSBkdGRGaWxlLmxpc3REVEROb3RhdGlvbigpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShub3RhdGlvbnMsICJOZXdOb3RhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlQXR0cmlidXRlTmFtZShEVERFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGF0dHJzLCAiTmV3QXR0cmlidXRlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOYW1lKExpc3Qgb2JqcywgU3RyaW5nIHRva2VuKSB7Ci0JCWludCBjb3VudGVyID0gMTsKLQotCQlib29sZWFuIHVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKCF1bmlxdWVOYW1lKSB7Ci0JCQlTdHJpbmcgbmV3TmFtZSA9IHRva2VuICsgbmV3IEludGVnZXIoY291bnRlcisrKTsKLQkJCXVuaXF1ZU5hbWUgPSB0cnVlOwotCQkJSXRlcmF0b3IgaXRlciA9IG9ianMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpdGVyLm5leHQoKTsKLQkJCQlTdHJpbmcgb2JqTmFtZSA9IGdldE5hbWUob2JqKTsKLQkJCQlpZiAob2JqTmFtZS5lcXVhbHMobmV3TmFtZSkpIHsKLQkJCQkJdW5pcXVlTmFtZSA9IGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodW5pcXVlTmFtZSkgewotCQkJCXJldHVybiBuZXdOYW1lOwotCQkJfQotCQl9Ci0JCS8vIHdlIHNob3VsZG4ndCBnZXQgaGVyZQotCQlyZXR1cm4gIk5vIE5hbWUgZm91bmQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZShPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQlyZXR1cm4gKChEVERFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCXJldHVybiAoKERUREVudGl0eSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRETm90YXRpb24pIHsKLQkJCXJldHVybiAoKERURE5vdGF0aW9uKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERBdHRyaWJ1dGUpIHsKLQkJCXJldHVybiAoKERUREF0dHJpYnV0ZSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRWxlbWVudE5hbWVHZW4oRFRERmlsZSBkdGRGaWxlKSB7Ci0KLQkJTGlzdCBlbGVtZW50cyA9IGR0ZEZpbGUubGlzdERUREVsZW1lbnQoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZWxlbWVudHMsICJOZXdFbGVtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlRW50aXR5TmFtZUdlbihEVERGaWxlIGR0ZEZpbGUpIHsKLQotCQlMaXN0IGVudGl0aWVzID0gZHRkRmlsZS5saXN0RFRERW50aXR5KCk7Ci0JCXJldHVybiBnZXRVbmlxdWVOYW1lKGVudGl0aWVzLCAiTmV3RW50aXR5Iik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0VW5pcXVlTm90YXRpb25OYW1lR2VuKERUREZpbGUgZHRkRmlsZSkgewotCi0JCUxpc3Qgbm90YXRpb25zID0gZHRkRmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUobm90YXRpb25zLCAiTmV3Tm90YXRpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVbmlxdWVBdHRyaWJ1dGVOYW1lR2VuKERUREVsZW1lbnQgZWxlbWVudCkgewotCi0JCUxpc3QgYXR0cnMgPSBlbGVtZW50LmdldERUREF0dHJpYnV0ZSgpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShhdHRycywgIk5ld0F0dHJpYnV0ZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldFVuaXF1ZU5hbWVHZW4oTGlzdCBvYmpzLCBTdHJpbmcgdG9rZW4pIHsKLQotCQlpbnQgY291bnRlciA9IDE7Ci0KLQkJYm9vbGVhbiB1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCXdoaWxlICghdW5pcXVlTmFtZSkgewotCQkJU3RyaW5nIG5ld05hbWUgPSB0b2tlbiArIG5ldyBJbnRlZ2VyKGNvdW50ZXIrKyk7Ci0JCQl1bmlxdWVOYW1lID0gdHJ1ZTsKLQkJCUl0ZXJhdG9yIGl0ZXIgPSBvYmpzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlci5uZXh0KCk7Ci0JCQkJU3RyaW5nIG9iak5hbWUgPSBnZXROYW1lKG9iaik7Ci0JCQkJaWYgKG9iak5hbWUuZXF1YWxzKG5ld05hbWUpKSB7Ci0JCQkJCXVuaXF1ZU5hbWUgPSBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVuaXF1ZU5hbWUpIHsKLQkJCQlyZXR1cm4gbmV3TmFtZTsKLQkJCX0KLQkJfQotCQkvLyB3ZSBzaG91bGRuJ3QgZ2V0IGhlcmUKLQkJcmV0dXJuICJObyBOYW1lIGZvdW5kIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXROYW1lR2VuKE9iamVjdCBvYmopIHsKLQotCQlpZiAob2JqIGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJcmV0dXJuICgoRFRERWxlbWVudCkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFRERW50aXR5KSB7Ci0JCQlyZXR1cm4gKChEVERFbnRpdHkpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERURE5vdGF0aW9uKSB7Ci0JCQlyZXR1cm4gKChEVEROb3RhdGlvbikgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRFREQXR0cmlidXRlKSB7Ci0JCQlyZXR1cm4gKChEVERBdHRyaWJ1dGUpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLX0vLyBEVERVbmlxdWVOYW1lSGVscGVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MwYWIzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5CYXNpY0VMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5FTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuUmVzb3VyY2VTZXRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVsZW1lbnRDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERHcm91cEtpbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRUREZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRFREUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXIuRXJyb3JNZXNzYWdlOwotCi0vKioKLSAqIENyZWF0ZSBNT0Ygb2JqZWN0cyBmcm9tIHRoZSBwYXJzZWQgRFREIElmIG5vIERURCBmaWxlIGlzIHNwZWNpZmVkLCBjcmVhdGUKLSAqIHRoZSByb290IE1PRiBvYmplY3QKLSAqLwotcHVibGljIGNsYXNzIERURFV0aWwgewotCURUREZhY3RvcnkgZmFjdG9yeTsKLQlFTGlzdCBleHRlbnQ7Ci0JUmVzb3VyY2UgcmVzb3VyY2U7Ci0JRFRERmlsZSBkdGRGaWxlOwotCVN0cmluZyBkdGRNb2RlbEZpbGU7Ci0JYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCi0JcHJpdmF0ZSBIYXNodGFibGUgZXh0ZXJuYWxEVERNb2RlbHMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBIYXNodGFibGUgcGVQb29sID0gbmV3IEhhc2h0YWJsZSgpOwotCXByaXZhdGUgSGFzaHRhYmxlIGVsZW1lbnRQb29sID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJpdmF0ZSBEVERQYXJzZXIgcGFyc2VyOwotCi0JcHJpdmF0ZSBWZWN0b3IgZXJyb3JNc2dzID0gbmV3IFZlY3RvcigpOwotCi0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIHV0aWxDYWNoZSA9IG5ldyBIYXNodGFibGUoKTsKLQotCXN0YXRpYyBwdWJsaWMgRFREVXRpbCBnZXREVERVdGlsRm9yKFN0cmluZyBmaWxlbmFtZSkgewotCQlEVERVdGlsIHV0aWwgPSAoRFREVXRpbCkgdXRpbENhY2hlLmdldChmaWxlbmFtZSk7Ci0JCWlmICh1dGlsID09IG51bGwpIHsKLQkJCXV0aWwgPSBuZXcgRFREVXRpbCgpOwotCQkJdXRpbENhY2hlLnB1dChmaWxlbmFtZSwgdXRpbCk7Ci0JCX0KLQotCQlyZXR1cm4gdXRpbDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyB1cmkpIHsKLQkJcGFyc2UobmV3IFJlc291cmNlU2V0SW1wbCgpLCB1cmkpOwotCX0KLQotCS8qKgotCSAqIEludm9rZSBwYXJzZSB0byBwYXJzZSBhIC5kdGQgZmlsZSBpbnRvIGEgTU9GIG9iamVjdCBtb2RlbCBUaGlzIGlzCi0JICogaW52b2tlZCBieSB0aGUgUmVnaXN0ZXJlZERURFBhcnNlciB0aGF0IHJlZ2lzdGVycyB0aGlzIHBhcnNlciBmb3IgTU9GCi0JICogdG8gdXNlIGFnYWluc3QgdGhlIC5kdGQgdHlwZQotCSAqIAotCSAqIEBwYXJhbSBmaWxlbmFtZSAtCi0JICogICAgICAgICAgICB0aGUgZnVsbHkgcXVhbGlmZWQgbmFtZSBvZiBhIC5kdGQgZmlsZQotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCS8vIEdldCB0aGUgZHRkIG5hbWUgZnJvbSB0aGUgZmlsZSBuYW1lCi0JCVBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVuYW1lKTsKLQkJSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJU3RyaW5nIGR0ZE5hbWUgPSBpUGF0aC50b0ZpbGUoKS5nZXROYW1lKCk7Ci0KLQkJdHJ5IHsKLQkJCXBhcnNlciA9IG5ldyBEVERQYXJzZXIoZmFsc2UpOwotCQkJaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkJCQlwYXJzZXIuc2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcyhleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQkJCX0KLQkJCXBhcnNlci5wYXJzZShmaWxlbmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCQlleC5wcmludFN0YWNrVHJhY2UoU3lzdGVtLmVycik7Ci0JCX0KLQotCQlkdGRNb2RlbEZpbGUgPSBmaWxlbmFtZTsKLQotCQlmYWN0b3J5ID0gRFRERmFjdG9yeUltcGwuaW5zdGFuY2UoKTsKLQotCQlleHRlbnQgPSBuZXcgQmFzaWNFTGlzdCgpOwotCi0JCWR0ZEZpbGUgPSBmYWN0b3J5LmNyZWF0ZURUREZpbGUoKTsKLQkJZXh0ZW50LmFkZChkdGRGaWxlKTsKLQotCQlkdGRGaWxlLnNldE5hbWUoZHRkTmFtZSk7Ci0KLQkJcG9wdWxhdGVEVEQocmVzb3VyY2VzLCBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKTsKLQl9Ci0KLQlwdWJsaWMgRFRERmFjdG9yeSBnZXRGYWN0b3J5KCkgewotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwdWJsaWMgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldFBFUG9vbCgpIHsKLQkJcmV0dXJuIHBlUG9vbDsKLQl9Ci0KLQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRQb29sKCkgewotCQlyZXR1cm4gZWxlbWVudFBvb2w7Ci0JfQotCi0JcHVibGljIEVMaXN0IGdldENvbnRlbnRzKCkgewotCQlyZXR1cm4gZXh0ZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlKFJlc291cmNlIHJlc291cmNlKSB7Ci0JCXRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJcmV0dXJuIHJlc291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldGV4cGFuZEVudGl0eVJlZmVyZW5jZXMoYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCXRoaXMuZXhwYW5kRW50aXR5UmVmZXJlbmNlcyA9IGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RXhwYW5kRW50aXR5UmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGhhcyBiZWVuIG1vZGlmaWVkCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbERpcnR5KCkgewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJcmV0dXJuIHJlc291cmNlLmlzTW9kaWZpZWQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0aGUgLmR0ZCBmaWxlCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2F2ZSgpIHsKLQkJdHJ5IHsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXJlc291cmNlLnNhdmUob3B0aW9ucyk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNhdmUgbW9kZWwgZXhjZXB0aW9uICIgKyBleCk7IC8vJE5PTi1OTFMtMSQKLQkJCWV4LnByaW50U3RhY2tUcmFjZSgpOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2F2ZUFzKFN0cmluZyBuZXdGaWxlbmFtZSkgewotCQlyZXNvdXJjZS5zZXRVUkkoVVJJLmNyZWF0ZVVSSShuZXdGaWxlbmFtZSkpOwotCQlib29sZWFuIG9rID0gc2F2ZSgpOwotCi0JCWlmIChvaykgewotCQkJUGF0aCBwYXRoID0gbmV3IFBhdGgobmV3RmlsZW5hbWUpOwotCQkJSVBhdGggaVBhdGggPSBwYXRoLnJlbW92ZUZpbGVFeHRlbnNpb24oKTsKLQkJCVN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCi0JCQlkdGRGaWxlLnNldE5hbWUoZHRkTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIG9rOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhdmVEVERGaWxlKFN0cmluZyBmaWxlbmFtZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCXRyeSB7Ci0JCQlQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihuZXcgRmlsZVdyaXRlcihmaWxlbmFtZSksIHRydWUpOwotCQkJRFREUHJpbnRlciBwcmludGVyID0gbmV3IERURFByaW50ZXIodHJ1ZSk7Ci0JCQlwcmludGVyLnZpc2l0RFRERmlsZShkdGRGaWxlKTsKLQotCQkJU3RyaW5nIHMgPSBwcmludGVyLmdldEJ1ZmZlcigpLnRvU3RyaW5nKCk7Ci0JCQlwdy5wcmludGxuKHMpOwotCQkJcHcuY2xvc2UoKTsKLQkJfQotCi0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERURFNvdXJjZShib29sZWFuIGluY2x1ZGVFcnJvcikgewotCQlyZXR1cm4gZHRkRmlsZS51bnBhcnNlKGluY2x1ZGVFcnJvcik7IC8vIHRydWUgPSBpbmNsdWRlIGVycm9yIGxpbmVzCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRFREKFJlc291cmNlU2V0IHJlc291cmNlcywgYm9vbGVhbiBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JCVZlY3RvciBkdGRMaXN0ID0gcGFyc2VyLmdldERURExpc3QoKTsKLQotCQkvLyBjcmVhdGUgWE1JTW9kZWwgZm9yIHRoZSBpbmNsdWRlZCBEVERzCi0JCWlmIChkdGRMaXN0LnNpemUoKSA+IDApIHsKLQkJCWlmICghZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQkJCWZvciAoaW50IGkgPSBkdGRMaXN0LnNpemUoKSAtIDE7IGkgPiAwOyBpLS0pIHsKLQkJCQkJRFREIGR0ZCA9IChEVEQpIGR0ZExpc3QuZWxlbWVudEF0KGkpOwotCQkJCQlsb2FkSW5jbHVkZWREVEQocmVzb3VyY2VzLCBkdGQpOwotCQkJCX0KLQotCQkJCURURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdCgwKTsKLQkJCQlwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7IC8vIHBvcHVsYXRlIHRoZSBtYWluCi0JCQkJCQkJCQkJCQkJCS8vIERURAotCQkJCS8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmb3IgKGludCBpID0gZHRkTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQlEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoaSk7Ci0JCQkJCXBvcHVsYXRlRFREKHJlc291cmNlcywgZHRkLCBkdGRGaWxlKTsKLQkJCQkJLy8gdmFsaWRhdGVXaXRoTW9kZWwoZHRkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGluc3RhbmNlIHVuaXF1ZSB0byB0aGlzIERURFV0aWwgZmlsZSB0aGF0IHJlcHJlc2VudHMgYW4KLQkvLyBleHRlcm5hbGx5IGxvYWRlZCBkdGQgKHdpbGwgY3JlYXRlIGlmIG9uZSBkb2Vzbid0IGV4aXN0IHlldCkKLQlwdWJsaWMgRXh0ZXJuYWxEVERNb2RlbCBnZXRFeHRlcm5hbERURE1vZGVsKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIHVyaSkgewotCQlpZiAoZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBEZWZhdWx0TXNnTG9nZ2VyLndyaXRlKCJFeHRlcm5hbCBEVEQgbmFtZTogIiArIHVyaSk7Ci0KLQkJaWYgKGV4dGVybmFsRFRETW9kZWxzLmNvbnRhaW5zS2V5KHVyaSkpIHsKLQkJCXJldHVybiAoRXh0ZXJuYWxEVERNb2RlbCkgZXh0ZXJuYWxEVERNb2RlbHMuZ2V0KHVyaSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFeHRlcm5hbERURE1vZGVsIGV4dE1vZGVsID0gbmV3IEV4dGVybmFsRFRETW9kZWwoKTsKLQkJCWlmIChleHRNb2RlbC5sb2FkTW9kZWwocmVzb3VyY2VzLCB1cmkpKSB7Ci0JCQkJZXh0ZXJuYWxEVERNb2RlbHMucHV0KHVyaSwgZXh0TW9kZWwpOwotCQkJCXJldHVybiBleHRNb2RlbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBsb2FkIHhtaU1vZGVscyBmb3IgaW5jbHVkZWQgRFREcwotCXByaXZhdGUgdm9pZCBsb2FkSW5jbHVkZWREVEQoUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVEQgZHRkKSB7Ci0JCUV4dGVybmFsRFRETW9kZWwgZXh0TW9kZWwgPSBnZXRFeHRlcm5hbERURE1vZGVsKHJlc291cmNlcywgZHRkLmdldE5hbWUoKSk7Ci0JCWlmIChleHRNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBub3cgZmlsbCBvdXIgaGFzaCB0YWJsZXMgZm9yIGVsZW1lbnRzIGFuZCBwYXJhbWV0ZXIgZW50aXRpZXMKLQkJCS8vIHNvIHRoYXQgd2Uga25vdyB3aGF0IGNhbiBiZSByZWZlcmVuY2VkIGJ5IG91ciBtYWluIGR0ZAotCQkJRFRERmlsZSBmaWxlID0gZXh0TW9kZWwuZ2V0RXh0ZXJuYWxEVERGaWxlKCk7Ci0JCQlDb2xsZWN0aW9uIGVsZW1lbnRMaXN0ID0gZmlsZS5saXN0RFRERWxlbWVudCgpOwotCQkJQ29sbGVjdGlvbiBlbnRpdHlMaXN0ID0gZmlsZS5saXN0RFRERW50aXR5KCk7Ci0KLQkJCUl0ZXJhdG9yIGkgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJRFRET2JqZWN0IG9iamVjdCA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCQkJCWVsZW1lbnRQb29sLnB1dChnZXRCYXNlTmFtZShvYmplY3QpLCBvYmplY3QpOwotCQkJfQotCi0JCQlpID0gZW50aXR5TGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJRFRERW50aXR5IGVudGl0eSA9IChEVERFbnRpdHkpIGkubmV4dCgpOwotCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJCQlwZVBvb2wucHV0KGdldEJhc2VOYW1lKGVudGl0eSksIGVudGl0eSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JICogCi0JICogMSkgd2lsbCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRFREIE1vZiBvYmplY3QgZm9yIEVudGl0eURlY2wsCi0JICogTm90YXRpb25EZWNsIGFuZCBFbGVtZW50RGVjbCBkZWNsYXJhdGlvbnMgZHVyaW5nIHRoZSAxc3QgcGFzcyAyKSBEdXJpbmcKLQkgKiB0aGUgMm5kIHBhc3MsIGl0IHdpbGwgYWRkIHRoZSBjb250ZW50TW9kZWwgYW5kIEF0dGxpc3QgdG8gYWxsCi0JICogRWxlbWVudERlY2wuCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRFREKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCwgRFRERmlsZSBkRmlsZSkgewotCQlEVERNb2RlbEJ1aWxkZXIgbW9kZWxCdWlsZGVyID0gbmV3IERURE1vZGVsQnVpbGRlcihyZXNvdXJjZXMsIHRoaXMsIGR0ZCwgZEZpbGUpOwotCi0JCW1vZGVsQnVpbGRlci52aXNpdERURChkdGQpOwotCX0KLQotCi0JcHVibGljIHZvaWQgZW1wdHlFcnJvck1lc3NhZ2VzKCkgewotCQllcnJvck1zZ3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2UoRXJyb3JNZXNzYWdlIGVycm9yKSB7Ci0JCWludCB2ZWN0b3JTaXplID0gZXJyb3JNc2dzLnNpemUoKTsKLQkJYm9vbGVhbiBhZGQgPSB0cnVlOwotCi0JCWlmICh2ZWN0b3JTaXplICE9IDApIHsKLQkJCWludCBpbmRleCA9IDA7Ci0KLQkJCXdoaWxlIChhZGQgPT0gdHJ1ZSAmJiBpbmRleCA8IHZlY3RvclNpemUpIHsKLQkJCQlpZiAoKChFcnJvck1lc3NhZ2UpIGVycm9yTXNncy5lbGVtZW50QXQoaW5kZXgpKS5lcXVhbHMoZXJyb3IpKSB7Ci0JCQkJCWFkZCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoYWRkKSB7Ci0JCQllcnJvck1zZ3MuYWRkRWxlbWVudChlcnJvcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgVmVjdG9yIGdldEVycm9ycygpIHsKLQkJcmV0dXJuIGVycm9yTXNnczsKLQl9Ci0KLQkvLyBUaGlzIGdldHMgdGhlIG5hbWUgd2l0aG91dCBhbnkgcHNldWRvIG5hbWVzcGFjZSBwcmVmaXgKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRCYXNlTmFtZShEVERPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBnZXROYW1lKG9iaiwgbnVsbCk7Ci0JfQotCi0JLy8gVGhpcyBnZXRzIHRoZSBuYW1lIHdpdGggcHNldWRvIG5hbWVzcGFjZSBwcmVmaXhlcyBpZiBkdGRGaWxlIGlzIG5vdAotCS8vIG51bGwKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKERURE9iamVjdCBvYmosIERUREZpbGUgZHRkRmlsZSkgewotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWlmIChvYmogaW5zdGFuY2VvZiBEVERFbnRpdHkpIHsKLQkJCURUREVudGl0eSBlbnRpdHkgPSAoRFRERW50aXR5KSBvYmo7Ci0JCQlpZiAoZHRkRmlsZSAhPSBudWxsICYmICFlbnRpdHkuZ2V0RFRERmlsZSgpLmVxdWFscyhkdGRGaWxlKSkgewotCQkJCW5hbWUgPSBuZXcgUGF0aChlbnRpdHkuZ2V0RFRERmlsZSgpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW5hbWUgKz0gIiUiICsgKChEVERFbnRpdHkpIG9iaikuZ2V0TmFtZSgpICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQlEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgb2JqOwotCQkJaWYgKGR0ZEZpbGUgIT0gbnVsbCAmJiAhZWxlbWVudC5nZXREVERGaWxlKCkuZXF1YWxzKGR0ZEZpbGUpKSB7Ci0JCQkJbmFtZSA9IG5ldyBQYXRoKGVsZW1lbnQuZ2V0RFRERmlsZSgpLmdldE5hbWUoKSkubGFzdFNlZ21lbnQoKSArICI6ICI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCW5hbWUgKz0gKChEVERFbGVtZW50KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50Q29udGVudCkgewotCQkJcmV0dXJuICgoRFRERWxlbWVudENvbnRlbnQpIG9iaikuZ2V0Q29udGVudE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRHcm91cFR5cGUoaW50IGdyb3VwS2luZCwgaW50IG9jY3VycmVuY2UpIHsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JCXN3aXRjaCAoZ3JvdXBLaW5kKSB7Ci0JCQljYXNlIERUREdyb3VwS2luZC5TRVFVRU5DRSA6Ci0JCQkJdHlwZSA9ICJEVERTZXF1ZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgRFRER3JvdXBLaW5kLkNIT0lDRSA6Ci0JCQkJdHlwZSA9ICJEVERDaG9pY2UiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQl0eXBlICs9IGdldFJlcGVhdGFibGVUeXBlU3VmZml4KG9jY3VycmVuY2UpOwotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlKGludCBvY2N1cnJlbmNlKSB7Ci0JCVN0cmluZyB0eXBlID0gIkRURFJlZmVyZW5jZSI7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZSArPSBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChvY2N1cnJlbmNlKTsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlcGVhdGFibGVUeXBlU3VmZml4KGludCBvY2N1cnJlbmNlKSB7Ci0JCXJldHVybiAiKCIgKyAoY2hhcikgb2NjdXJyZW5jZSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuU3RhcnRpbmcgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoYXJncy5sZW5ndGggIT0gMSkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigidXNhZ2U6IER0ZFV0aWwgaW5wdXRmaWxlLmR0ZCIpOyAvLyROT04tTkxTLTEkCi0KLQkJamF2YS5pby5GaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKGFyZ3NbMF0pOwotCi0JCVN0cmluZyBkdGRGaWxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlkdGRGaWxlTmFtZSA9IGlucHV0RmlsZS5nZXRDYW5vbmljYWxQYXRoKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQotCQlTdHJpbmcgZHRkTW9kZWxOYW1lID0gZHRkRmlsZU5hbWU7Ci0KLQkJaWYgKERURENvbnN0YW50cy5EVERfRVhURU5TSU9OLmVxdWFscyhuZXcgUGF0aChkdGRGaWxlTmFtZSkuZ2V0RmlsZUV4dGVuc2lvbigpKSkgewotCQkJZHRkTW9kZWxOYW1lID0gbmV3IFBhdGgoZHRkRmlsZU5hbWUpLnJlbW92ZUZpbGVFeHRlbnNpb24oKS5sYXN0U2VnbWVudCgpOwotCQl9Ci0JCURURFV0aWwgZDJtID0gbmV3IERURFV0aWwoKTsKLQkJLy8gVE9ETzogZml4IHBvcnQKLQkJLy8gZDJtLnBhcnNlKGR0ZEZpbGVOYW1lKTsKLQkJdHJ5IHsKLQkJCWQybS5zYXZlQXMoZHRkTW9kZWxOYW1lICsgIi4iICsgRFREQ29uc3RhbnRzLkRURF9YTUlfRVhURU5TSU9OKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gdGhyb3duIGR1cmluZyBtb2RlbCBzYXZlOiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUuIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoIGdldFBhdGgoKSB7Ci0JCVBhdGggY3VycmVudERURFBhdGggPSBuZXcgUGF0aChkdGRNb2RlbEZpbGUpOwotCQlpZiAoY3VycmVudERURFBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlyZXR1cm4gY3VycmVudERURFBhdGgucmVtb3ZlTGFzdFNlZ21lbnRzKDEpLmFkZFRyYWlsaW5nU2VwYXJhdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IFBhdGgoIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIERURFV0aWwgZ2V0RFREVXRpbEZvckdlbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkvLwotCS8vIERURFV0aWwgdXRpbCA9IChEVERVdGlsKSB1dGlsQ2FjaGUuZ2V0KGZpbGVuYW1lKTsKLQkvLyBpZiAodXRpbCA9PSBudWxsKQotCS8vIHsKLQkvLyB1dGlsID0gbmV3IERURFV0aWwoKTsKLQkvLyB1dGlsQ2FjaGUucHV0KGZpbGVuYW1lLCB1dGlsKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gcmV0dXJuIHV0aWw7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgcGFyc2VHZW4oU3RyaW5nIHVyaSkgewotCS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JLy8gcGFyc2UobmV3IFJlc291cmNlU2V0SW1wbCgpLCB1cmkpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEludm9rZSBwYXJzZSB0byBwYXJzZSBhIC5kdGQgZmlsZSBpbnRvIGEgTU9GIG9iamVjdCBtb2RlbAotCS8vICogVGhpcyBpcyBpbnZva2VkIGJ5IHRoZSBSZWdpc3RlcmVkRFREUGFyc2VyIHRoYXQgcmVnaXN0ZXJzIHRoaXMgcGFyc2VyCi0JLy8gZm9yIE1PRiB0byB1c2UKLQkvLyAqIGFnYWluc3QgdGhlIC5kdGQgdHlwZQotCS8vICogQHBhcmFtIGZpbGVuYW1lIC0gdGhlIGZ1bGx5IHF1YWxpZmVkIG5hbWUgb2YgYSAuZHRkIGZpbGUKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBhcnNlR2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgU3RyaW5nIGZpbGVuYW1lKSB7Ci0JLy8KLQkvLyAvLyBHZXQgdGhlIGR0ZCBuYW1lIGZyb20gdGhlIGZpbGUgbmFtZQotCS8vIFBhdGggcGF0aCA9IG5ldyBQYXRoKGZpbGVuYW1lKTsKLQkvLyBJUGF0aCBpUGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCS8vIFN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCS8vCi0JLy8KLQkvLyB0cnkKLQkvLyB7Ci0JLy8gcGFyc2VyID0gbmV3IERURFBhcnNlcihmYWxzZSk7Ci0JLy8gaWYgKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpCi0JLy8gewotCS8vIHBhcnNlci5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCS8vIH0KLQkvLyBwYXJzZXIucGFyc2UoZmlsZW5hbWUpOwotCS8vIH0KLQkvLyBjYXRjaChJT0V4Y2VwdGlvbiBleCkKLQkvLyB7Ci0JLy8gZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gZHRkTW9kZWxGaWxlID0gZmlsZW5hbWU7Ci0JLy8KLQkvLwotCS8vIGZhY3RvcnkgPSBEVERGYWN0b3J5SW1wbC5pbnN0YW5jZSgpOwotCS8vCi0JLy8KLQkvLyBleHRlbnQgPSBuZXcgQmFzaWNFTGlzdCgpOwotCS8vCi0JLy8KLQkvLyBkdGRGaWxlID0gZmFjdG9yeS5jcmVhdGVEVERGaWxlKCk7Ci0JLy8gZXh0ZW50LmFkZChkdGRGaWxlKTsKLQkvLwotCS8vCi0JLy8gZHRkRmlsZS5zZXROYW1lKGR0ZE5hbWUpOwotCS8vCi0JLy8KLQkvLyBwb3B1bGF0ZURURChyZXNvdXJjZXMsIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBEVERGYWN0b3J5IGdldEZhY3RvcnlHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZmFjdG9yeTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRFRERmlsZSBnZXREVERGaWxlR2VuKCkgewotCS8vCi0JLy8gcmV0dXJuIGR0ZEZpbGU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEhhc2h0YWJsZSBnZXRQRVBvb2xHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gcGVQb29sOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBIYXNodGFibGUgZ2V0RWxlbWVudFBvb2xHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZWxlbWVudFBvb2w7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIEVMaXN0IGdldEV4dGVudEdlbigpIHsKLQkvLwotCS8vIHJldHVybiBleHRlbnQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgc2V0UmVzb3VyY2VHZW4oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkvLwotCS8vIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgUmVzb3VyY2UgZ2V0UmVzb3VyY2VHZW4oUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkvLwotCS8vIHJldHVybiByZXNvdXJjZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBzZXRleHBhbmRFbnRpdHlSZWZlcmVuY2VzR2VuKGJvb2xlYW4KLQkvLyBleHBhbmRFbnRpdHlSZWZlcmVuY2VzKSB7Ci0JLy8KLQkvLyB0aGlzLmV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSBleHBhbmRFbnRpdHlSZWZlcmVuY2VzOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIGdldEV4cGFuZEVudGl0eVJlZmVyZW5jZXNHZW4oKSB7Ci0JLy8KLQkvLyByZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kZWwgaGFzIGJlZW4gbW9kaWZpZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBib29sZWFuIGlzTW9kZWxEaXJ0eUdlbigpIHsKLQkvLwotCS8vIGlmIChyZXNvdXJjZSAhPSBudWxsKQotCS8vIHsKLQkvLyByZXR1cm4gcmVzb3VyY2UuaXNNb2RpZmllZCgpOwotCS8vIH0KLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogU2F2ZSB0aGUgLmR0ZCBmaWxlCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlR2VuKCkgewotCS8vCi0JLy8gdHJ5Ci0JLy8gewotCS8vIHJlc291cmNlLnNhdmUoKTsKLQkvLyByZXR1cm4gdHJ1ZTsKLQkvLyB9Ci0JLy8gY2F0Y2ggKEV4Y2VwdGlvbiBleCkKLQkvLyB7Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJTYXZlIG1vZGVsIGV4Y2VwdGlvbiAiICsgZXgpOwotCS8vIGV4LnByaW50U3RhY2tUcmFjZSgpOwotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gc2F2ZUFzR2VuKFN0cmluZyBuZXdGaWxlbmFtZSkgewotCS8vCi0JLy8gcmVzb3VyY2Uuc2V0VVJJKG5ld0ZpbGVuYW1lKTsKLQkvLyBib29sZWFuIG9rID0gc2F2ZSgpOwotCS8vCi0JLy8KLQkvLyBpZiAob2spCi0JLy8gewotCS8vIFBhdGggcGF0aCA9IG5ldyBQYXRoKG5ld0ZpbGVuYW1lKTsKLQkvLyBJUGF0aCBpUGF0aCA9IHBhdGgucmVtb3ZlRmlsZUV4dGVuc2lvbigpOwotCS8vIFN0cmluZyBkdGROYW1lID0gaVBhdGgudG9GaWxlKCkuZ2V0TmFtZSgpOwotCS8vCi0JLy8KLQkvLyBkdGRGaWxlLnNldE5hbWUoZHRkTmFtZSk7Ci0JLy8gfQotCS8vIHJldHVybiBvazsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlRFRERmlsZUdlbihTdHJpbmcgZmlsZW5hbWUpIHsKLQkvLwotCS8vIGJvb2xlYW4gcmVzdWx0PXRydWU7Ci0JLy8gdHJ5Ci0JLy8gewotCS8vIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKGZpbGVuYW1lKSx0cnVlKTsKLQkvLyBEVERQcmludGVyIHByaW50ZXIgPSBuZXcgRFREUHJpbnRlcih0cnVlKTsKLQkvLyBwcmludGVyLnZpc2l0RFRERmlsZShkdGRGaWxlKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIHMgPSBwcmludGVyLmdldEJ1ZmZlcigpLmdldE5hbWUoKS50b1N0cmluZygpOwotCS8vIHB3LnByaW50bG4ocyk7Ci0JLy8gcHcuY2xvc2UoKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIGNhdGNoIChFeGNlcHRpb24gZSkKLQkvLyB7Ci0JLy8gcmVzdWx0ID0gZmFsc2U7Ci0JLy8gfQotCS8vIHJldHVybiByZXN1bHQ7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIFN0cmluZyBnZXREVERTb3VyY2VHZW4oYm9vbGVhbiBpbmNsdWRlRXJyb3IpIHsKLQkvLwotCS8vIHJldHVybiBkdGRGaWxlLnVucGFyc2UoaW5jbHVkZUVycm9yKTsgLy8gdHJ1ZSA9IGluY2x1ZGUgZXJyb3IgbGluZXMKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBDcmVhdGUgTU9GIG9iamVjdHMgZnJvbSBEVEQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRFRER2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgYm9vbGVhbgotCS8vIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMpIHsKLQkvLwotCS8vIFZlY3RvciBkdGRMaXN0ID0gcGFyc2VyLmdldERURExpc3QoKTsKLQkvLwotCS8vCi0JLy8gLy8gY3JlYXRlIFhNSU1vZGVsIGZvciB0aGUgaW5jbHVkZWQgRFREcwotCS8vIGlmICggZHRkTGlzdC5zaXplKCkgPiAwKQotCS8vIHsKLQkvLyBpZiAoIWV4cGFuZEVudGl0eVJlZmVyZW5jZXMpCi0JLy8gewotCS8vIGZvciAoaW50IGk9ZHRkTGlzdC5zaXplKCkgLSAxOyBpID4gMDsgaS0tKQotCS8vIHsKLQkvLyBEVEQgZHRkID0gKERURCkgZHRkTGlzdC5lbGVtZW50QXQoaSk7Ci0JLy8gbG9hZEluY2x1ZGVkRFREKHJlc291cmNlcywgZHRkKTsKLQkvLyB9Ci0JLy8KLQkvLwotCS8vIERURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdCgwKTsKLQkvLyBwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7IC8vIHBvcHVsYXRlIHRoZSBtYWluIERURAotCS8vIC8vIHZhbGlkYXRlV2l0aE1vZGVsKGR0ZCk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gZm9yIChpbnQgaSA9IGR0ZExpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0JLy8gewotCS8vIERURCBkdGQgPSAoRFREKSBkdGRMaXN0LmVsZW1lbnRBdChpKTsKLQkvLyBwb3B1bGF0ZURURChyZXNvdXJjZXMsIGR0ZCwgZHRkRmlsZSk7Ci0JLy8gLy8gdmFsaWRhdGVXaXRoTW9kZWwoZHRkKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgRXh0ZXJuYWxEVERNb2RlbCBnZXRFeHRlcm5hbERURE1vZGVsR2VuKFJlc291cmNlU2V0Ci0JLy8gcmVzb3VyY2VzLCBTdHJpbmcgdXJpKSB7Ci0JLy8KLQkvLyBpZiAoZXhwYW5kRW50aXR5UmVmZXJlbmNlcykKLQkvLyB7Ci0JLy8gcmV0dXJuIG51bGw7Ci0JLy8gfQotCS8vICAgICAgIAotCS8vIERlZmF1bHRNc2dMb2dnZXIud3JpdGUoIkV4dGVybmFsIERURCBuYW1lOiAiICsgdXJpKTsKLQkvLwotCS8vCi0JLy8gaWYgKGV4dGVybmFsRFRETW9kZWxzLmNvbnRhaW5zS2V5KHVyaSkpCi0JLy8gewotCS8vIHJldHVybiAoRXh0ZXJuYWxEVERNb2RlbCkgZXh0ZXJuYWxEVERNb2RlbHMuZ2V0KHVyaSk7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gRXh0ZXJuYWxEVERNb2RlbCBleHRNb2RlbCA9IG5ldyBFeHRlcm5hbERURE1vZGVsKCk7Ci0JLy8gaWYgKGV4dE1vZGVsLmxvYWRNb2RlbChyZXNvdXJjZXMsIHVyaSkpCi0JLy8gewotCS8vIGV4dGVybmFsRFRETW9kZWxzLnB1dCh1cmksIGV4dE1vZGVsKTsKLQkvLyByZXR1cm4gZXh0TW9kZWw7Ci0JLy8gfQotCS8vIH0KLQkvLyByZXR1cm4gbnVsbDsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBsb2FkSW5jbHVkZWREVERHZW4oUmVzb3VyY2VTZXQgcmVzb3VyY2VzLCBEVEQgZHRkKSB7Ci0JLy8KLQkvLyBFeHRlcm5hbERURE1vZGVsIGV4dE1vZGVsID0gZ2V0RXh0ZXJuYWxEVERNb2RlbChyZXNvdXJjZXMsCi0JLy8gZHRkLmdldE5hbWUoKSk7Ci0JLy8gaWYgKGV4dE1vZGVsICE9IG51bGwpCi0JLy8gewotCS8vIC8vIG5vdyBmaWxsIG91ciBoYXNoIHRhYmxlcyBmb3IgZWxlbWVudHMgYW5kIHBhcmFtZXRlciBlbnRpdGllcwotCS8vIC8vIHNvIHRoYXQgd2Uga25vdyB3aGF0IGNhbiBiZSByZWZlcmVuY2VkIGJ5IG91ciBtYWluIGR0ZAotCS8vIERUREZpbGUgZmlsZSA9IGV4dE1vZGVsLmdldEV4dGVybmFsRFRERmlsZSgpOwotCS8vIENvbGxlY3Rpb24gZWxlbWVudExpc3QgPSBmaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JLy8gQ29sbGVjdGlvbiBlbnRpdHlMaXN0ID0gZmlsZS5saXN0RFRERW50aXR5KCk7Ci0JLy8KLQkvLwotCS8vIEl0ZXJhdG9yIGkgPSBlbGVtZW50TGlzdC5pdGVyYXRvcigpOwotCS8vIHdoaWxlIChpLmhhc05leHQoKSkKLQkvLyB7Ci0JLy8gRFRET2JqZWN0IG9iamVjdCA9IChEVERPYmplY3QpIGkubmV4dCgpOwotCS8vIGVsZW1lbnRQb29sLnB1dChnZXRCYXNlTmFtZShvYmplY3QpLCBvYmplY3QpOwotCS8vIH0KLQkvLyAgICAgIAotCS8vIGkgPSBlbnRpdHlMaXN0Lml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERFbnRpdHkgZW50aXR5ID0gKERUREVudGl0eSkgaS5uZXh0KCk7Ci0JLy8gaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCS8vIHsKLQkvLyBwZVBvb2wucHV0KGdldEJhc2VOYW1lKGVudGl0eSksIGVudGl0eSk7Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQ3JlYXRlIE1PRiBvYmplY3RzIGZyb20gRFRECi0JLy8gKgotCS8vICogMSkgd2lsbCBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgRFREIE1vZiBvYmplY3QgZm9yIEVudGl0eURlY2wsCi0JLy8gTm90YXRpb25EZWNsCi0JLy8gKiBhbmQgRWxlbWVudERlY2wgZGVjbGFyYXRpb25zIGR1cmluZyB0aGUgMXN0IHBhc3MKLQkvLyAqIDIpIER1cmluZyB0aGUgMm5kIHBhc3MsIGl0IHdpbGwgYWRkIHRoZSBjb250ZW50TW9kZWwgYW5kIEF0dGxpc3QgdG8KLQkvLyBhbGwKLQkvLyAqIEVsZW1lbnREZWNsLgotCS8vICoKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHBvcHVsYXRlRFRER2VuKFJlc291cmNlU2V0IHJlc291cmNlcywgRFREIGR0ZCwgRFRERmlsZQotCS8vIGRGaWxlKSB7Ci0JLy8KLQkvLyBEVERNb2RlbEJ1aWxkZXIgbW9kZWxCdWlsZGVyID0gbmV3IERURE1vZGVsQnVpbGRlcihyZXNvdXJjZXMsIHRoaXMsCi0JLy8gZHRkLCBkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIG1vZGVsQnVpbGRlci52aXNpdERURChkdGQpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGVtcHR5RXJyb3JNZXNzYWdlc0dlbigpIHsKLQkvLwotCS8vIGVycm9yTXNncy5yZW1vdmVBbGxFbGVtZW50cygpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIGFkZEVycm9yTWVzc2FnZUdlbihFcnJvck1lc3NhZ2UgZXJyb3IpIHsKLQkvLwotCS8vIGludCB2ZWN0b3JTaXplID0gZXJyb3JNc2dzLnNpemUoKTsKLQkvLyBib29sZWFuIGFkZCA9IHRydWU7Ci0JLy8KLQkvLwotCS8vIGlmICh2ZWN0b3JTaXplICE9IDApCi0JLy8gewotCS8vIGludCBpbmRleCA9IDA7Ci0JLy8KLQkvLwotCS8vIHdoaWxlIChhZGQgPT0gdHJ1ZSAmJiBpbmRleCA8IHZlY3RvclNpemUpCi0JLy8gewotCS8vIGlmICgoKEVycm9yTWVzc2FnZSkgZXJyb3JNc2dzLmVsZW1lbnRBdChpbmRleCkpLmVxdWFscyhlcnJvcikpCi0JLy8gewotCS8vIGFkZCA9ZmFsc2U7Ci0JLy8gfQotCS8vIGVsc2UKLQkvLyB7Ci0JLy8gaW5kZXgrKzsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gaWYgKGFkZCkKLQkvLyB7Ci0JLy8gZXJyb3JNc2dzLmFkZEVsZW1lbnQoZXJyb3IpOwotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgVmVjdG9yIGdldEVycm9yc0dlbigpIHsKLQkvLwotCS8vIHJldHVybiBlcnJvck1zZ3M7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVEVERHZW4oKSB7Ci0JLy8KLQkvLyBTdHJpbmcgdGVtcERUREZpbGU9Z2V0UGF0aCgpLnRvT1NTdHJpbmcoKSsidGVtcFZhbGlkYXRpbmdGaWxlTmFtZS5kdGQiOwotCS8vIHRyeQotCS8vIHsKLQkvLyBzYXZlRFRERmlsZSh0ZW1wRFRERmlsZSk7Ci0JLy8KLQkvLwotCS8vIHBhcnNlciA9IG5ldyBEVERQYXJzZXIoZmFsc2UpOwotCS8vIGlmIChGaWxlVXRpbGl0eS5maWxlRXhpc3RzKHRlbXBEVERGaWxlKSkKLQkvLyB7Ci0JLy8gcGFyc2VyLnBhcnNlKHRlbXBEVERGaWxlKTsKLQkvLyB9Ci0JLy8gVmVjdG9yIGR0ZExpc3QgPSBwYXJzZXIuZ2V0RFRETGlzdCgpOwotCS8vIGlmICggZHRkTGlzdC5zaXplKCkgPiAwKQotCS8vIHsKLQkvLyAvLyByZXNldCB0aGUgZXJyb3JzIGFuZCB1cGRhdGUgd2hhdCB3ZSBoYXZlIGluIHRoZSBlbGVtZW50IHBvb2wKLQkvLyBlbXB0eUVycm9yTWVzc2FnZXMoKTsKLQkvLyB1cGRhdGVFbGVtZW50SGFzaHRhYmxlKCk7Ci0JLy8KLQkvLwotCS8vIC8vIFRPRE86IGRvIHdlIGp1c3QgdmFsaWRhdGUgdGhlIGN1cnJlbnQgb25lPwotCS8vIHZhbGlkYXRlV2l0aE1vZGVsKChEVEQpZHRkTGlzdC5lbGVtZW50QXQoMCkpOwotCS8vIH0KLQkvLyB9Ci0JLy8gY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0JLy8gewotCS8vIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKLQkvLyBGaWxlVXRpbGl0eS5kZWxldGUodGVtcERUREZpbGUpOwotCS8vIH0KLQkvLyBGaWxlVXRpbGl0eS5kZWxldGUodGVtcERUREZpbGUpOwotCS8vCi0JLy8KLQkvLyByZXR1cm4gZHRkRmlsZS5pc1BhcnNlRXJyb3IoKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB2YWxpZGF0ZVdpdGhNb2RlbEdlbihEVEQgZHRkKSB7Ci0JLy8KLQkvLyBFbnVtZXJhdGlvbiBlbiA9IGR0ZC5leHRlcm5hbEVsZW1lbnRzKCk7Ci0JLy8gd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKQotCS8vIHsKLQkvLyBPYmplY3QgZSA9IGVuLm5leHRFbGVtZW50KCk7Ci0JLy8KLQkvLwotCS8vIGlmICggZSBpbnN0YW5jZW9mIEVudGl0eURlY2wgKQotCS8vIHsKLQkvLyBFbnRpdHlEZWNsIGVudGl0eSA9IChFbnRpdHlEZWNsKSBlOwotCS8vIEVycm9yTWVzc2FnZSBlcnJNc2cgPSBlbnRpdHkuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyAvLyBkdGRGaWxlLnNldFBhcnNlRXJyb3IodHJ1ZSk7Ci0JLy8gfQotCS8vIH0KLQkvLyBlbHNlIGlmICggZSBpbnN0YW5jZW9mIEVsZW1lbnREZWNsICkKLQkvLyB7Ci0JLy8gRWxlbWVudERlY2wgZWxlbSA9IChFbGVtZW50RGVjbCkgZTsKLQkvLyBFcnJvck1lc3NhZ2UgZXJyTXNnID0gZWxlbS5nZXRFcnJvck1lc3NhZ2UoKTsKLQkvLyBEVERFbGVtZW50IGR0ZGVsZW1lbnQgPSAoRFRERWxlbWVudCkKLQkvLyBnZXRFbGVtZW50UG9vbCgpLmdldChlbGVtLmdldE5vZGVOYW1lKCkpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGVyck1zZyE9IG51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIH0KLQkvLyBjaGVja0Zvck1pc3NpbmdFbGVtZW50UmVmZXJlbmNlcyhkdGRlbGVtZW50KTsKLQkvLyB9Ci0JLy8gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBOb3RhdGlvbkRlY2wgKQotCS8vIHsKLQkvLyBOb3RhdGlvbkRlY2wgbm90YXRpb24gPSAoTm90YXRpb25EZWNsKSBlOwotCS8vIEVycm9yTWVzc2FnZSBlcnJNc2cgPSBub3RhdGlvbi5nZXRFcnJvck1lc3NhZ2UoKTsKLQkvLyBpZiAoIGVyck1zZyE9IG51bGwpCi0JLy8gewotCS8vIGFkZEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIH0KLQkvLyB9Ci0JLy8gZWxzZSBpZiAoIGUgaW5zdGFuY2VvZiBBdHRsaXN0ICkKLQkvLyB7Ci0JLy8gQXR0bGlzdCBhdHRMaXN0ID0gKEF0dGxpc3QpIGU7Ci0JLy8gRXJyb3JNZXNzYWdlIGVyck1zZyA9IGF0dExpc3QuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JLy8gaWYgKCBlcnJNc2chPSBudWxsKQotCS8vIHsKLQkvLyBhZGRFcnJvck1lc3NhZ2UoZXJyTXNnKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLwotCS8vCi0JLy8gY2hlY2tGb3JEdXBsaWNhdGVJREF0dHJpYnV0ZSgpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVsZW1lbnRIYXNodGFibGVHZW4oKSB7Ci0JLy8KLQkvLyBlbGVtZW50UG9vbC5jbGVhcigpOwotCS8vIENyZWF0ZUxpc3RJdGVtcyBpdGVtc0hlbHBlciA9IG5ldyBDcmVhdGVMaXN0SXRlbXMoZHRkRmlsZSk7Ci0JLy8KLQkvLwotCS8vIFZlY3RvciBhbGxFbGVtZW50cyA9IGl0ZW1zSGVscGVyLmdldEVsZW1lbnRzKCk7Ci0JLy8gLy8gZ28gdGhyb3VnaCBhbGwgdGhlIGR0ZEZpbGVzIGFuZCBsaXN0IHRoZSBlbGVtZW50cwotCS8vIGludCBudW1FbGVtZW50cyA9IGFsbEVsZW1lbnRzLnNpemUoKTsKLQkvLwotCS8vCi0JLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSsrKQotCS8vIHsKLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgYWxsRWxlbWVudHMuZWxlbWVudEF0KGkpOwotCS8vIGVsZW1lbnRQb29sLnB1dChnZXRCYXNlTmFtZShlbGVtZW50KSwgZWxlbWVudCk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUVudGl0eUhhc2h0YWJsZUdlbigpIHsKLQkvLwotCS8vIHVwZGF0ZUhhc2hUYWJsZShwZVBvb2wsIGR0ZEZpbGUubGlzdERUREVudGl0eSgpKTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVIYXNoVGFibGVHZW4oSGFzaHRhYmxlIGgsIENvbGxlY3Rpb24gZHRkT2JqZWN0cykgewotCS8vCi0JLy8gaC5jbGVhcigpOwotCS8vIEl0ZXJhdG9yIGkgPSBkdGRPYmplY3RzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBTdHJpbmcgbmFtZSA9ICIiOwotCS8vIERURE9iamVjdCBvID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JLy8gbmFtZSA9IGdldEJhc2VOYW1lKG8pOwotCS8vIGgucHV0KG5hbWUsbyk7Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEJhc2VOYW1lR2VuKERURE9iamVjdCBvYmopIHsKLQkvLwotCS8vIHJldHVybiBnZXROYW1lKG9iaiwgbnVsbCk7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0TmFtZUdlbihEVERPYmplY3Qgb2JqLCBEVERGaWxlIGR0ZEZpbGUpIHsKLQkvLwotCS8vIFN0cmluZyBuYW1lID0gIiI7Ci0JLy8gaWYgKG9iaiBpbnN0YW5jZW9mIERUREVudGl0eSkKLQkvLyB7Ci0JLy8gRFRERW50aXR5IGVudGl0eSA9IChEVERFbnRpdHkpIG9iajsKLQkvLyBpZiAoZHRkRmlsZSAhPSBudWxsICYmCi0JLy8gIWVudGl0eS5nZXREVERGaWxlKCkuZXF1YWxzKGR0ZEZpbGUpKQotCS8vIHsKLQkvLyBuYW1lID0gbmV3IFBhdGgoZW50aXR5LmdldERUREZpbGUoKS5nZXROYW1lKCkpLmxhc3RTZWdtZW50KCkgKyAiOiAiOwotCS8vIH0KLQkvLyBuYW1lICs9ICIlIiArICgoRFRERW50aXR5KW9iaikuZ2V0TmFtZSgpICsgIjsiOwotCS8vIH0KLQkvLyBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBEVERFbGVtZW50KQotCS8vIHsKLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgb2JqOwotCS8vIGlmIChkdGRGaWxlICE9IG51bGwgJiYKLQkvLyAhZWxlbWVudC5nZXREVERGaWxlKCkuZXF1YWxzKGR0ZEZpbGUpKQotCS8vIHsKLQkvLyBuYW1lID0gbmV3IFBhdGgoZWxlbWVudC5nZXREVERGaWxlKCkuZ2V0TmFtZSgpKS5sYXN0U2VnbWVudCgpICsgIjogIjsKLQkvLyB9Ci0JLy8gbmFtZSArPSAoKERUREVsZW1lbnQpb2JqKS5nZXROYW1lKCk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERUREVsZW1lbnRDb250ZW50KQotCS8vIHsKLQkvLyByZXR1cm4gKChEVERFbGVtZW50Q29udGVudCkgb2JqKS5nZXRDb250ZW50TmFtZSgpOwotCS8vIH0KLQkvLyByZXR1cm4gbmFtZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBjaGVja0Zvck1pc3NpbmdFbGVtZW50UmVmZXJlbmNlc0dlbihEVERFbGVtZW50IGVsZW1lbnQpCi0JLy8gewotCS8vCi0JLy8gU3RyaW5nIGR0ZFN0cmluZyA9IG51bGw7Ci0JLy8gaWYgKCBlbGVtZW50ID09IG51bGwgKQotCS8vIHJldHVybjsKLQkvLwotCS8vCi0JLy8gVmVjdG9yIGVsZW1lbnRSZWZzID0gbmV3IFZlY3RvcigpOwotCS8vIGZpbmRFbGVtZW50UmVmZXJlbmNlcyhlbGVtZW50LmdldENvbnRlbnQoKSxlbGVtZW50UmVmcyk7Ci0JLy8KLQkvLwotCS8vIEVudW1lcmF0aW9uIGVuID0gZWxlbWVudFJlZnMuZWxlbWVudHMoKTsKLQkvLyB3aGlsZSAoZW4uaGFzTW9yZUVsZW1lbnRzKCkpCi0JLy8gewotCS8vIFN0cmluZyBlbGVtZW50UmVmTmFtZSA9ICIiOwotCS8vIERURE9iamVjdCBkdGRPYmplY3QgPSAoRFRET2JqZWN0KSBlbi5uZXh0RWxlbWVudCgpOwotCS8vCi0JLy8KLQkvLyBpZiAoIGR0ZE9iamVjdCBpbnN0YW5jZW9mIERUREVsZW1lbnQpCi0JLy8gewotCS8vIGVsZW1lbnRSZWZOYW1lID0gKChEVERFbGVtZW50KWR0ZE9iamVjdCkuZ2V0TmFtZSgpOwotCS8vIGlmICggZ2V0RWxlbWVudFBvb2woKS5nZXQoZWxlbWVudFJlZk5hbWUpID09IG51bGwpCi0JLy8gewotCS8vIGlmIChkdGRTdHJpbmcgPT0gbnVsbCkKLQkvLyB7Ci0JLy8gZHRkU3RyaW5nID0gZ2V0RFREU291cmNlKGZhbHNlKTsKLQkvLyB9Ci0JLy8gU3RyaW5nIGVycm9yTXNnID0gIkVsZW1lbnQgXCIiICsgZWxlbWVudC5nZXROYW1lKCkgKyAiXCIsIHJlZmVycyB0bwotCS8vIHVuZGVjbGFyZWQgZWxlbWVudCAiCi0JLy8gKyAiXCIiICsgZWxlbWVudFJlZk5hbWUgKyAiXCIsIGluIGNvbnRlbnQgbW9kZWwuXG4iOwotCS8vIEVycm9yTWVzc2FnZSBkdGRFcnJvciA9IG5ldyBFcnJvck1lc3NhZ2UoKTsKLQkvLyBkdGRFcnJvci5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNc2cpOwotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLkxpbmVDb2x1bW4gbGluZUNvbHVtbiA9Ci0JLy8gU291cmNlTG9jYXRpb25IZWxwZXIub2Zmc2V0VG9MaW5lQ29sdW1uKGR0ZFN0cmluZywKLQkvLyBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yTGluZShsaW5lQ29sdW1uLmdldExpbmUoKSk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JDb2x1bW4obGluZUNvbHVtbi5nZXRDb2x1bW4oKSk7Ci0JLy8gYWRkRXJyb3JNZXNzYWdlKGR0ZEVycm9yKTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgdm9pZCBmaW5kRWxlbWVudFJlZmVyZW5jZXNHZW4oRFRERWxlbWVudENvbnRlbnQgY29udGVudCwKLQkvLyBWZWN0b3IgcmVzdWx0KSB7Ci0JLy8KLQkvLwotCS8vIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpCi0JLy8gewotCS8vIHJlc3VsdC5hZGRFbGVtZW50KCgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpY29udGVudCkuZ2V0UmVmZXJlbmNlZEVsZW1lbnQoKSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KQotCS8vIHsKLQkvLyByZXN1bHQuYWRkRWxlbWVudCgoKERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQpY29udGVudCkuZ2V0RWxlbWVudFJlZmVyZW5jZWRFbnRpdHkoKSk7Ci0JLy8gfQotCS8vIGVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpCi0JLy8gewotCS8vIERUREdyb3VwQ29udGVudCBncm91cCA9IChEVERHcm91cENvbnRlbnQpY29udGVudDsKLQkvLyBFTGlzdCBjb250ZW50cyA9IGdyb3VwLmdldENvbnRlbnQoKTsKLQkvLyBJdGVyYXRvciBpID0gY29udGVudHMuaXRlcmF0b3IoKTsKLQkvLyB3aGlsZSAoaS5oYXNOZXh0KCkpCi0JLy8gewotCS8vIGZpbmRFbGVtZW50UmVmZXJlbmNlcygoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpLCByZXN1bHQpOwotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHZvaWQgY2hlY2tGb3JEdXBsaWNhdGVJREF0dHJpYnV0ZUdlbigpIHsKLQkvLwotCS8vIFN0cmluZyBkdGRTdHJpbmcgPSBudWxsOwotCS8vIENvbGxlY3Rpb24gZWxlbWVudHMgPSBkdGRGaWxlLmxpc3REVERFbGVtZW50KCk7Ci0JLy8gSXRlcmF0b3IgaSA9IGVsZW1lbnRzLml0ZXJhdG9yKCk7Ci0JLy8gd2hpbGUgKGkuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERFbGVtZW50IGVsZW1lbnQgPSAoRFRERWxlbWVudCkgaS5uZXh0KCk7Ci0JLy8gSXRlcmF0b3IgayA9IGVsZW1lbnQuZ2V0RFREQXR0cmlidXRlKCkuaXRlcmF0b3IoKTsKLQkvLyBib29sZWFuIHNhdzFzdElEID0gZmFsc2U7Ci0JLy8gd2hpbGUgKGsuaGFzTmV4dCgpKQotCS8vIHsKLQkvLyBEVERBdHRyaWJ1dGUgYXR0ciA9IChEVERBdHRyaWJ1dGUpIGsubmV4dCgpOwotCS8vIERURFR5cGUgZFR5cGUgPSBhdHRyLmdldERURFR5cGUoKTsKLQkvLyBpZiAoZFR5cGUgaW5zdGFuY2VvZiBEVERCYXNpY1R5cGUpCi0JLy8gewotCS8vIGlmICggKChEVERCYXNpY1R5cGUpZFR5cGUpLmdldEtpbmQoKS5pbnRWYWx1ZSgpID09IERUREJhc2ljVHlwZUtpbmQuSUQpCi0JLy8gewotCS8vIGlmIChzYXcxc3RJRCkKLQkvLyB7Ci0JLy8gaWYgKGR0ZFN0cmluZyA9PSBudWxsKQotCS8vIHsKLQkvLyBkdGRTdHJpbmcgPSBnZXREVERTb3VyY2UoZmFsc2UpOwotCS8vIH0KLQkvLyBTdHJpbmcgZXJyTXNnID0gRFREUGx1Z2luLmdldERURFN0cmluZygiX0VSUk9SX0RVUF9JRF9BVFRSSUJVVEVfMSIpOwotCS8vIGVyck1zZyArPSBhdHRyLmdldE5hbWUoKSArCi0JLy8gRFREUGx1Z2luLmdldERURFN0cmluZygiX1VJX0VSUk9SUEFSVF9EVVBfSURfQVRUUklCVVRFXzIiKTsKLQkvLyAgICAgICAgICAgICAgCi0JLy8gRXJyb3JNZXNzYWdlIGR0ZEVycm9yID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yTWVzc2FnZShlcnJNc2cpOwotCS8vIFNvdXJjZUxvY2F0aW9uSGVscGVyLkxpbmVDb2x1bW4gbGluZUNvbHVtbiA9Ci0JLy8gU291cmNlTG9jYXRpb25IZWxwZXIub2Zmc2V0VG9MaW5lQ29sdW1uKGR0ZFN0cmluZywKLQkvLyBhdHRyLmdldFN0YXJ0T2Zmc2V0KCkpOwotCS8vIGR0ZEVycm9yLnNldEVycm9yTGluZShsaW5lQ29sdW1uLmdldExpbmUoKSk7Ci0JLy8gZHRkRXJyb3Iuc2V0RXJyb3JDb2x1bW4obGluZUNvbHVtbi5nZXRDb2x1bW4oKSk7Ci0JLy8gZHRkRXJyb3Iuc2V0T2JqZWN0KGF0dHIpOwotCS8vIGFkZEVycm9yTWVzc2FnZShkdGRFcnJvcik7Ci0JLy8gLy8gZHRkRmlsZS5zZXRQYXJzZUVycm9yKHRydWUpOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLyBlbHNlCi0JLy8gewotCS8vIHNhdzFzdElEID0gdHJ1ZTsKLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyB9Ci0JLy8gfQotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIGdldEdyb3VwVHlwZUdlbihpbnQgZ3JvdXBLaW5kLCBpbnQgb2NjdXJyZW5jZSkKLQkvLyB7Ci0JLy8KLQkvLyBTdHJpbmcgdHlwZSA9IG51bGw7Ci0JLy8KLQkvLwotCS8vIHN3aXRjaCAoZ3JvdXBLaW5kKQotCS8vIHsKLQkvLyBjYXNlIERUREdyb3VwS2luZC5TRVFVRU5DRToKLQkvLyB0eXBlID0gIkRURFNlcXVlbmNlIjsKLQkvLyBicmVhazsKLQkvLyBjYXNlIERUREdyb3VwS2luZC5DSE9JQ0U6Ci0JLy8gdHlwZSA9ICJEVERDaG9pY2UiOwotCS8vIGJyZWFrOwotCS8vIH0KLQkvLwotCS8vCi0JLy8gdHlwZSArPSBnZXRSZXBlYXRhYmxlVHlwZVN1ZmZpeChvY2N1cnJlbmNlKTsKLQkvLyByZXR1cm4gdHlwZTsKLQkvLyB9Ci0JLy8gLyoqCi0JLy8gKiBAZ2VuZXJhdGVkCi0JLy8gKi8KLQkvLyBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRSZWZlcmVuY2VUeXBlR2VuKGludCBvY2N1cnJlbmNlKSB7Ci0JLy8KLQkvLyBTdHJpbmcgdHlwZSA9ICJEVERSZWZlcmVuY2UiOwotCS8vIHR5cGUgKz0gZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXgob2NjdXJyZW5jZSk7Ci0JLy8gcmV0dXJuIHR5cGU7Ci0JLy8gfQotCS8vIC8qKgotCS8vICogQGdlbmVyYXRlZAotCS8vICovCi0JLy8gcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UmVwZWF0YWJsZVR5cGVTdWZmaXhHZW4oaW50IG9jY3VycmVuY2UpIHsKLQkvLwotCS8vIHJldHVybiAiKCIgKyAoY2hhcilvY2N1cnJlbmNlICsgIikiOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBtYWluR2VuKFN0cmluZ1tdIGFyZ3MpIHsKLQkvLwotCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiXG5TdGFydGluZyAuLi4iKTsKLQkvLwotCS8vCi0JLy8gaWYgKGFyZ3MubGVuZ3RoICE9IDEpCi0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJ1c2FnZTogRHRkVXRpbCBpbnB1dGZpbGUuZHRkIik7Ci0JLy8KLQkvLwotCS8vIGphdmEuaW8uRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKLQkvLwotCS8vCi0JLy8gU3RyaW5nIGR0ZEZpbGVOYW1lID0gIiI7Ci0JLy8gdHJ5Ci0JLy8gewotCS8vIGR0ZEZpbGVOYW1lID0gaW5wdXRGaWxlLmdldENhbm9uaWNhbFBhdGgoKTsKLQkvLyB9Ci0JLy8gY2F0Y2goSU9FeGNlcHRpb24gZXgpCi0JLy8ge30KLQkvLwotCS8vCi0JLy8gU3RyaW5nIGR0ZE1vZGVsTmFtZSA9IGR0ZEZpbGVOYW1lOwotCS8vCi0JLy8KLQkvLyBpZiAoRFREQ29uc3RhbnRzLkRURF9FWFRFTlNJT04uZXF1YWxzKG5ldwotCS8vIFBhdGgoZHRkRmlsZU5hbWUpLmdldEZpbGVFeHRlbnNpb24oKSkpCi0JLy8gewotCS8vIGR0ZE1vZGVsTmFtZT0gbmV3Ci0JLy8gUGF0aChkdGRGaWxlTmFtZSkucmVtb3ZlRmlsZUV4dGVuc2lvbigpLmxhc3RTZWdtZW50KCk7Ci0JLy8gfQotCS8vIERURFV0aWwgZDJtID0gbmV3IERURFV0aWwoKTsKLQkvLyAvLyBUT0RPOiBmaXggcG9ydAotCS8vIC8vIGQybS5wYXJzZShkdGRGaWxlTmFtZSk7Ci0JLy8gdHJ5Ci0JLy8gewotCS8vIGQybS5zYXZlQXMoZHRkTW9kZWxOYW1lICsgIi4iICsgRFREQ29uc3RhbnRzLkRURF9YTUlfRVhURU5TSU9OKTsKLQkvLyB9Ci0JLy8gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCS8vIHsKLQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIG1vZGVsIHNhdmU6ICIgKyBlKTsKLQkvLyB9Ci0JLy8gU3lzdGVtLm91dC5wcmludGxuKCJEb25lLiIpOwotCS8vIH0KLQkvLyAvKioKLQkvLyAqIEBnZW5lcmF0ZWQKLQkvLyAqLwotCS8vIHByb3RlY3RlZCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGggZ2V0UGF0aEdlbigpIHsKLQkvLwotCS8vIFBhdGggY3VycmVudERURFBhdGggPSBuZXcgUGF0aChkdGRNb2RlbEZpbGUpOwotCS8vIGlmIChjdXJyZW50RFREUGF0aC5zZWdtZW50Q291bnQoKSA+IDEpCi0JLy8gewotCS8vIHJldHVybiBjdXJyZW50RFREUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSkuYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkvLyB9Ci0JLy8gICAgCi0JLy8gcmV0dXJuIG5ldyBQYXRoKCIiKTsKLQkvLyB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0RURFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY1YTQyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRFREVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREFueUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERWxlbWVudENvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERFbGVtZW50UmVmZXJlbmNlQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVtcHR5Q29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRER3JvdXBLaW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRETm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5EVERQQ0RhdGFDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFREUmVwZWF0YWJsZUNvbnRlbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRFREVmlzaXRvciB7Ci0KLQlwdWJsaWMgRFREVmlzaXRvcigpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREZpbGUoRFRERmlsZSBmaWxlKSB7Ci0JCUNvbGxlY3Rpb24gbm90YXRpb25zID0gZmlsZS5saXN0RFRETm90YXRpb24oKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbm90YXRpb25zLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVEROb3RhdGlvbigoRFRETm90YXRpb24pIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gZW50aXRpZXMgPSBmaWxlLmxpc3REVERFbnRpdHkoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZW50aXRpZXMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERUREVudGl0eSgoRFRERW50aXR5KSBpLm5leHQoKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIG9iamVjdHMgPSBmaWxlLmxpc3REVERFbGVtZW50QW5kRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IG9iamVjdHMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlEVERPYmplY3Qgb2JqZWN0ID0gKERURE9iamVjdCkgaS5uZXh0KCk7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudCgoRFRERWxlbWVudCkgb2JqZWN0KTsKLQkJCX0gLy8gZW5kIG9mIGlmICgpCi0JCQllbHNlIHsKLQkJCQl2aXNpdERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVEROb3RhdGlvbihEVEROb3RhdGlvbiBub3RhdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW50aXR5KERUREVudGl0eSBlbnRpdHkpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVsZW1lbnQoRFRERWxlbWVudCBlbGVtZW50KSB7Ci0JCXZpc2l0RFRERWxlbWVudENvbnRlbnQoZWxlbWVudC5nZXRDb250ZW50KCkpOwotCQl2aXNpdERUREF0dHJpYnV0ZUxpc3QoZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoRFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHkpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudENvbnRlbnQoRFRERWxlbWVudENvbnRlbnQgY29udGVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInZpc2l0RFRERWxlbWVudENvbnRlbnQgOiAiICsgY29udGVudCk7Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgRFRERW1wdHlDb250ZW50KSB7Ci0JCQl2aXNpdERUREVtcHR5Q29udGVudCgoRFRERW1wdHlDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREQW55Q29udGVudCkgewotCQkJdmlzaXREVERBbnlDb250ZW50KChEVERBbnlDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50IGluc3RhbmNlb2YgRFREUENEYXRhQ29udGVudCkgewotCQkJdmlzaXREVERQQ0RhdGFDb250ZW50KChEVERQQ0RhdGFDb250ZW50KSBjb250ZW50KTsKLQkJfQotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFJlcGVhdGFibGVDb250ZW50KSB7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREdyb3VwQ29udGVudCkgewotCQkJCXZpc2l0RFRER3JvdXBDb250ZW50KChEVERHcm91cENvbnRlbnQpIGNvbnRlbnQpOwotCQkJfQotCQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSB7Ci0JCQkJdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCgoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIGNvbnRlbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdmlzaXREVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KChEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0gLy8gZW5kIG9mIGVsc2UKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJvY2N1cnJlbmNlOiAiICsKLQkJCS8vIChjaGFyKSgoRFREUmVwZWF0YWJsZUNvbnRlbnQpY29udGVudCkuZ2V0T2NjdXJyZW5jZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERW1wdHlDb250ZW50KERUREVtcHR5Q29udGVudCBkdGRFbXB0eUNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBFTVBUWSIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFREQW55Q29udGVudChEVERBbnlDb250ZW50IGR0ZEFueUNvbnRlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBBTlkiKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERURFBDRGF0YUNvbnRlbnQoRFREUENEYXRhQ29udGVudCBwY0RhdGFDb250ZW50KSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogUENEQVRBIik7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERHcm91cENvbnRlbnQoRFRER3JvdXBDb250ZW50IGdyb3VwQ29udGVudCkgewotCQlpZiAoZ3JvdXBDb250ZW50LmdldEdyb3VwS2luZCgpLmdldFZhbHVlKCkgPT0gRFRER3JvdXBLaW5kLlNFUVVFTkNFKSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFNlcXVlbmNlIik7Ci0JCX0KLQkJZWxzZSAvLyBpZiAoY29udGVudGdldEdyb3VwS2luZCgpID09IERUREdyb3VwS2luZC5DSE9JQ0UpCi0JCXsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQ2hvaWNlIik7Ci0JCX0KLQotCQlDb2xsZWN0aW9uIGdyb3VwQ29udGVudHMgPSBncm91cENvbnRlbnQuZ2V0Q29udGVudCgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBncm91cENvbnRlbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJdmlzaXREVERFbGVtZW50Q29udGVudCgoRFRERWxlbWVudENvbnRlbnQpIGkubmV4dCgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQgZWxlbWVudFJlZmVyZW5jZUNvbnRlbnQpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdERUREVudGl0eVJlZmVyZW5jZUNvbnRlbnQoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCBlbnRpdHlSZWZlcmVuY2VDb250ZW50KSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBdHRyaWJ1dGVMaXN0KExpc3QgYXR0cnMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGF0dHJzLml0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQl2aXNpdERUREF0dHJpYnV0ZSgoRFREQXR0cmlidXRlKSBpdGVyLm5leHQoKSk7Ci0JCX0gLy8gZW5kIG9mIHdoaWxlICgpCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXREVERBdHRyaWJ1dGUoRFREQXR0cmlidXRlIGF0dHJpYnV0ZSkgewotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREZpbGVHZW4oRFRERmlsZSBmaWxlKSB7Ci0KLQkJQ29sbGVjdGlvbiBub3RhdGlvbnMgPSBmaWxlLmxpc3REVEROb3RhdGlvbigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBub3RhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQl2aXNpdERURE5vdGF0aW9uKChEVEROb3RhdGlvbikgaS5uZXh0KCkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBlbnRpdGllcyA9IGZpbGUubGlzdERUREVudGl0eSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBlbnRpdGllcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERW50aXR5KChEVERFbnRpdHkpIGkubmV4dCgpKTsKLQkJfQotCi0JCUNvbGxlY3Rpb24gb2JqZWN0cyA9IGZpbGUubGlzdERUREVsZW1lbnRBbmREVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gb2JqZWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCURURE9iamVjdCBvYmplY3QgPSAoRFRET2JqZWN0KSBpLm5leHQoKTsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBEVERFbGVtZW50KSB7Ci0JCQkJdmlzaXREVERFbGVtZW50KChEVERFbGVtZW50KSBvYmplY3QpOwotCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCWVsc2UgewotCQkJCXZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG9iamVjdCk7Ci0JCQl9IC8vIGVuZCBvZiBpZiAoKQotCQl9Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRETm90YXRpb25HZW4oRFRETm90YXRpb24gbm90YXRpb24pIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREVudGl0eUdlbihEVERFbnRpdHkgZW50aXR5KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50R2VuKERUREVsZW1lbnQgZWxlbWVudCkgewotCi0JCXZpc2l0RFRERWxlbWVudENvbnRlbnQoZWxlbWVudC5nZXRDb250ZW50KCkpOwotCQl2aXNpdERUREF0dHJpYnV0ZUxpc3QoZWxlbWVudC5nZXREVERBdHRyaWJ1dGUoKSk7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlR2VuKERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5KSB7Ci0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50Q29udGVudEdlbihEVERFbGVtZW50Q29udGVudCBjb250ZW50KSB7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJ2aXNpdERUREVsZW1lbnRDb250ZW50IDogIiArIGNvbnRlbnQpOwotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkgewotCQkJdmlzaXREVERFbXB0eUNvbnRlbnQoKERUREVtcHR5Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERUREFueUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREQW55Q29udGVudCgoRFREQW55Q29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGVudCBpbnN0YW5jZW9mIERURFBDRGF0YUNvbnRlbnQpIHsKLQkJCXZpc2l0RFREUENEYXRhQ29udGVudCgoRFREUENEYXRhQ29udGVudCkgY29udGVudCk7Ci0JCX0KLQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERSZXBlYXRhYmxlQ29udGVudCkgewotCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERHcm91cENvbnRlbnQpIHsKLQkJCQl2aXNpdERUREdyb3VwQ29udGVudCgoRFRER3JvdXBDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCQkJCXZpc2l0RFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQoKERUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50KSBjb250ZW50KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudCgoRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCkgY29udGVudCk7Ci0JCQl9IC8vIGVuZCBvZiBlbHNlCi0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigib2NjdXJyZW5jZTogIiArCi0JCQkvLyAoY2hhcikoKERURFJlcGVhdGFibGVDb250ZW50KWNvbnRlbnQpLmdldE9jY3VycmVuY2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbXB0eUNvbnRlbnRHZW4oRFRERW1wdHlDb250ZW50IGR0ZEVtcHR5Q29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogRU1QVFkiKTsKLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERBbnlDb250ZW50R2VuKERUREFueUNvbnRlbnQgZHRkQW55Q29udGVudCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGVudDogQU5ZIik7Ci0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFREUENEYXRhQ29udGVudEdlbihEVERQQ0RhdGFDb250ZW50IHBjRGF0YUNvbnRlbnQpIHsKLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IFBDREFUQSIpOwotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREdyb3VwQ29udGVudEdlbihEVERHcm91cENvbnRlbnQgZ3JvdXBDb250ZW50KSB7Ci0KLQkJaWYgKGdyb3VwQ29udGVudC5nZXRHcm91cEtpbmQoKS5nZXRWYWx1ZSgpID09IERUREdyb3VwS2luZC5TRVFVRU5DRSkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjb250ZW50OiBTZXF1ZW5jZSIpOwotCQl9Ci0JCWVsc2UgLy8gaWYgKGNvbnRlbnRnZXRHcm91cEtpbmQoKSA9PSBEVERHcm91cEtpbmQuQ0hPSUNFKQotCQl7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNvbnRlbnQ6IENob2ljZSIpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbiBncm91cENvbnRlbnRzID0gZ3JvdXBDb250ZW50LmdldENvbnRlbnQoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gZ3JvdXBDb250ZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCXZpc2l0RFRERWxlbWVudENvbnRlbnQoKERUREVsZW1lbnRDb250ZW50KSBpLm5leHQoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAZ2VuZXJhdGVkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdmlzaXREVERFbGVtZW50UmVmZXJlbmNlQ29udGVudEdlbihEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCBlbGVtZW50UmVmZXJlbmNlQ29udGVudCkgewotCi0JfQotCi0JLyoqCi0JICogQGdlbmVyYXRlZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHZpc2l0RFRERW50aXR5UmVmZXJlbmNlQ29udGVudEdlbihEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IGVudGl0eVJlZmVyZW5jZUNvbnRlbnQpIHsKLQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUxpc3RHZW4oTGlzdCBhdHRycykgewotCi0JCUl0ZXJhdG9yIGl0ZXIgPSBhdHRycy5pdGVyYXRvcigpOwotCi0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJdmlzaXREVERBdHRyaWJ1dGUoKERUREF0dHJpYnV0ZSkgaXRlci5uZXh0KCkpOwotCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCX0KLQotCS8qKgotCSAqIEBnZW5lcmF0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2aXNpdERUREF0dHJpYnV0ZUdlbihEVERBdHRyaWJ1dGUgYXR0cmlidXRlKSB7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRXh0ZXJuYWxEVERNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VtZi91dGlsL0V4dGVybmFsRFRETW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ3NjUzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9lbWZtb2RlbC9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW1mL3V0aWwvRXh0ZXJuYWxEVERNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi51dGlsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlU2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbWYuRFRERmlsZTsKLQotCi0vKioKLSAqIExvYWQgYW5vdGhlciBEVEQgbW9kZWwgLSB1c2Ugd2hlbiB0aGVyZSBpcyBleHRlcm5hbCBlbnRpdHkgcmVmZXJlbmNlcyBmcm9tCi0gKiBhbm90aGVyIG1vZGVsCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlcm5hbERURE1vZGVsIHsKLQlEVERGaWxlIGR0ZEZpbGUgPSBudWxsOwotCi0JcHVibGljIEV4dGVybmFsRFRETW9kZWwoKSB7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RXh0ZXJuYWxEVERGaWxlKCkgewotCQlyZXR1cm4gZHRkRmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBEVEQgbW9kZWwgc3BlY2lmaWVkIGJ5IHRoZSB1cmkgZS5nLgotCSAqIGZpbGU6QzovZWNsaXBzZS9leGFtcGxlcy9wdXJjaGFzZW9yZGVyLmR0ZAotCSAqLwotCXB1YmxpYyBib29sZWFuIGxvYWRNb2RlbChSZXNvdXJjZVNldCByZXNvdXJjZXMsIFN0cmluZyB1cmkpIHsKLQkJYm9vbGVhbiByYyA9IHRydWU7Ci0KLQkJaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyB0b2RvLi4uIEludmVzdGlnYXRlIHdoeSB3ZSBjYW4gbm90IGNyZWF0ZSBhIG5ldyBEVERVdGlsIHRvIGxvYWQKLQkJCS8vIHRoZSBleHRlcm5hbAotCQkJLy8gd2l0aG91dCBicmVha2luZyB0aGUgYnZ0IHRlc3QgYnVja2V0IG9uIHRoZSBvYWdpcyBjYXNlcy4KLQkJCS8vIEFyZSBkZXBlbmRpbmcgb24gbW9mJ3MgYnVpbHQgaW4gY2FjaGluZyB2aWEKLQkJCS8vIHJlc291cmNlcy5sb2FkKHVyaSk/Ci0JCQkvLwotCQkJVVJJIHVyaU9iaiA9IFVSSS5jcmVhdGVVUkkodXJpKTsKLQkJCVJlc291cmNlIHIgPSByZXNvdXJjZXMuY3JlYXRlUmVzb3VyY2UodXJpT2JqKTsKLQkJCU1hcCBvcHRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQkJCXIubG9hZChvcHRpb25zKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VzLmdldFJlc291cmNlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCURUREZpbGUgY3VycmVudEZpbGUgPSAoRFRERmlsZSkgKChSZXNvdXJjZSkgaS5uZXh0KCkpLmdldENvbnRlbnRzKCkuZ2V0KDApOwotCQkJCVN0cmluZyBjdXJyZW50VVJJID0gY3VycmVudEZpbGUuZVJlc291cmNlKCkuZ2V0VVJJKCkudG9TdHJpbmcoKTsKLQkJCQkvLyBub3RlIDogbW9mIHN0b3JlcyBhIHNsaWdodGx5IGRpZmZlcmVudCB1cmkgdGhhbiB0aGUgb25lIHdlCi0JCQkJLy8gcGFzc2VkIGluIHRvIHJlc291cmNlcy5sb2FkKHVyaSkKLQkJCQkvLyBJbiB0aGUgJ2ZpbGU6JyBwcm90b2NvbCBjYXNlLCB0aGUgY2FsbAotCQkJCS8vIHJlc291cmNlLmxvYWQoImZpbGU6RDpceC5kdGQiKSB3aWxsIHN0b3JlIGEgcmVzb3VyY2Ugd2l0aAotCQkJCS8vIHVyaSAiRDpceC5kdGQiLgotCQkJCS8vIFRoaXMgaXMgd2h5IHdlIHVzZSAnZW5kc3dpdGgoKScgaW5zdGVhZCBvZiAnZXF1YWxzKCknIHRvCi0JCQkJLy8gY29tcGFyZS4KLQkJCQlpZiAodXJpLmVuZHNXaXRoKGN1cnJlbnRVUkkpKSB7Ci0JCQkJCWR0ZEZpbGUgPSBjdXJyZW50RmlsZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGR0ZEZpbGUgPT0gbnVsbCkgewotCQkJCXJjID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJcmMgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9EVEQuY2F0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9EVEQuY2F0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDk3Mjc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvRFRELmNhdAorKysgL2Rldi9udWxsCkBAIC0xLDM4MTIgKzAsMCBAQAotDQotKG9iamVjdCBQZXRhbA0KLSAgICB2ZXJzaW9uICAgIAk0NQ0KLSAgICBfd3JpdHRlbiAgIAkiUm9zZSA3LjUuMDEwMy4xOTIwIg0KLSAgICBjaGFyU2V0ICAgIAkwKQ0KLQ0KLShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgImR0ZCINCi0gICAgaXNfdW5pdCAgICAJVFJVRQ0KLSAgICBpc19sb2FkZWQgIAlUUlVFDQotICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJJREwiDQotCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZDU3MzAtODUwYi0xMWUxLTAwMDAtMDA1Y2Y0NjkxYzRjOjEiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJwYWNrYWdlTmFtZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJkdGQiKSkNCi0JKG9iamVjdCBBdHRyaWJ1dGUNCi0JICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JICAgIG5hbWUgICAgICAgCSJiYXNlUGFja2FnZSINCi0JICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJvcmcuZWNsaXBzZS53c3QuZHRkIikpDQotCShvYmplY3QgQXR0cmlidXRlDQotCSAgICB0b29sICAgICAgIAkiRWNvcmUiDQotCSAgICBuYW1lICAgICAgIAkicHJlZml4Ig0KLQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRURCIpKSkNCi0gICAgcXVpZCAgICAgICAJIjM4NTdCMUMwMDI5MyINCi0gICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0gICAgbG9naWNhbF9tb2RlbHMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JKG9iamVjdCBDbGFzcyAiRFRERWxlbWVudENvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVkNTczMC04NTBiLTExZTEtMDAwMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NCRUFDRjAyMTMiDQotCSAgICBhYnN0cmFjdCAgIAlUUlVFKQ0KLQkob2JqZWN0IENsYXNzICJEVERHcm91cENvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NCRUFFRjAyMzIiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAwMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFEOTIwMzYzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUmVwZWF0YWJsZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDRDMDFEMSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImdyb3VwS2luZCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZDOUVDMDE4OSINCi0JCSAgICB0eXBlICAgICAgIAkiRFRER3JvdXBLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGQ0E1NTAyMTYiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREQXR0cmlidXRlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMTU5MDFEQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyMzg0NzIwMzlEIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQzlBMDEzQiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiZGVmYXVsdEtpbmQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0UxNDRCRjAyNjEiDQotCQkgICAgdHlwZSAgICAgICAJIkRURERlZmF1bHRLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDREQzAzQUQiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJkZWZhdWx0VmFsdWVTdHJpbmciDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA3LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOTZCOUJCRjAwNkIiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERPY2N1cnJlbmNlVHlwZSINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDA4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0MxOUFGMDA3RCINCi0JICAgIGRvY3VtZW50YXRpb24gCQ0KLXxPTkU9NDkgDQotfE9QVElPTkFMPTYzIE9ORV9PUl9NT1JFPTQzIFpFUk9fT1JfTU9SRT00Mg0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbGVtZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMDktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMEFGMDJBOCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCODMwMjlCIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQzgxMDA2MiINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRUREVtcHR5Q29udGVudCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBjLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RDlBQjQ3MDM3QSINCi0JICAgIHN1cGVyY2xhc3NlcyAJKGxpc3QgaW5oZXJpdGFuY2VfcmVsYXRpb25zaGlwX2xpc3QNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDBkLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUJGMzAzMjciDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBQ0YwMjEzIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERBbnlDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFCNTAwMzA0Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM1ZWRkZDAtODUwYi0xMWUxLTAwMGYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQkVFMDIwNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURFBDRGF0YUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUI1QzAxMzUiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFCRTkwMjc4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERWxlbWVudFJlZmVyZW5jZUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUI3RDAwMTAiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFEOEMwM0FBIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUmVwZWF0YWJsZUNvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRDRDMDFEMSIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFREUmVwZWF0YWJsZUNvbnRlbnQiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUQ0QzAxRDEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdEOUFEQjcwM0MwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgIm9jY3VycmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNWVkZGQwLTg1MGItMTFlMS0wMDE2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0NDMThBOTAxNDgiDQotCQkgICAgZG9jdW1lbnRhdGlvbiAJIkpVU1RfT05FPSAtMSAgT05FX09SX01PUkU9NDMgT1BUSU9OQUw9NjMgWkVST19PUl9NT1JFPTQyIg0KLQkJICAgIHR5cGUgICAgICAgCSJEVERPY2N1cnJlbmNlVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE5QUYwMDdEIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkNCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQ2xhc3MgIkRUREZpbGUiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxNy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwN0YwMTE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJjb21tZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxOS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzgzOURCRUYwMTJCIg0KLQkJICAgIHR5cGUgICAgICAgCSJTdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpDQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJwYXJzZUVycm9yIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzVlZGRkMC04NTBiLTExZTEtMDAxYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg4Qzk5NUYwMjVCIg0KLQkJICAgIHR5cGUgICAgICAgCSJib29sZWFuIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKSkpDQotCShvYmplY3QgQ2xhc3MgIkRURERlZmF1bHRLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ0REMwM0FEIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIklNUExJRUQ9MSBSRVFVSVJFRD0yIEZJWEVEPTMgTk9GSVhFRD00Ig0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFREQmFzaWNUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ2NEYwMERBIg0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMjgwMDMxNSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiKSkNCi0JICAgIGNsYXNzX2F0dHJpYnV0ZXMgCShsaXN0IGNsYXNzX2F0dHJpYnV0ZV9saXN0DQotCQkob2JqZWN0IENsYXNzQXR0cmlidXRlICJraW5kIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFMTQ2OEEwMDE2Ig0KLQkJICAgIHR5cGUgICAgICAgCSJEVERCYXNpY1R5cGVLaW5kIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDkwNTAyMkMiDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW51bWVyYXRpb25UeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ2NjgwMzA2Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMjgxMDMwMiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6RUVudW0iDQotCQkgICAgcXVpZHUgICAgICAJIjM5QTQ3M0U5MDFENCIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImtpbmQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA2LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0UxNDZBQzAzQjgiDQotCQkgICAgdHlwZSAgICAgICAJIkRUREVudW1Hcm91cEtpbmQiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RTE0OUIyMDFBRCINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERCYXNpY1R5cGVLaW5kIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMDctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ5MDUwMjJDIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJIk5PTkU9MCBDREFUQT0xIElEPTIgSURSRUY9MyBJRFJFRlM9NCBFTlRJVFk9NSBFTlRJVElFUz02IE5NVE9LRU49NyBOTVRPS0VOUz04Ig0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFRERW51bUdyb3VwS2luZCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA4LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RTE0OUIyMDFBRCINCi0JICAgIGRvY3VtZW50YXRpb24gCSJOQU1FX1RPS0VOX0dST1VQPTEgTk9UQVRJT05fR1JPVVA9MiINCi0JICAgIHN0ZXJlb3R5cGUgCSJlbnVtZXJhdGlvbiIpDQotCShvYmplY3QgQ2xhc3MgIkRUREdyb3VwS2luZCINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDA5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZDQTU1MDIxNiINCi0JICAgIGRvY3VtZW50YXRpb24gCSJTRVFVRU5DRT0xIENIT0lDRT0yIg0KLQkgICAgc3RlcmVvdHlwZSAJImVudW1lcmF0aW9uIikNCi0JKG9iamVjdCBDbGFzcyAiRFRETm90YXRpb24iDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDBFRjAwQzkiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwYi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwRTMwMjM0Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCODUwMTE4Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAiY29tbWVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4MzlEQzBBMDI0QyINCi0JCSAgICB0eXBlICAgICAgIAkiU3RyaW5nIg0KLQkJICAgIGV4cG9ydENvbnRyb2wgCSJQdWJsaWMiKQ0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSUQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDBkLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDEwMjAzOTciDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lEIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAwZS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxMEUwMThDIg0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERW50aXR5Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMGYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQxMkIwM0M4Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTAtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM5QjdGMEU3MDFFQSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q0RUUwMDE0IikNCi0JCShvYmplY3QgSW5oZXJpdGFuY2VfUmVsYXRpb25zaGlwDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjg2MDMwNCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiDQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjVFMDJERSIpKQ0KLQkgICAgY2xhc3NfYXR0cmlidXRlcyAJKGxpc3QgY2xhc3NfYXR0cmlidXRlX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgImNvbW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjFlYjEwLTg1MGItMTFlMS0wMDExLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODM5REMzNzAwOEUiDQotCQkgICAgdHlwZSAgICAgICAJIlN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInBhcmFtZXRlckVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RUZEMTNDMDE3RSINCi0JCSAgICB0eXBlICAgICAgIAkiYm9vbGVhbiINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnRpdHlDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MWViMTAtODUwYi0xMWUxLTAwMTMtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQxOUQwMDgzIg0KLQkgICAgYWJzdHJhY3QgICAJVFJVRSkNCi0JKG9iamVjdCBDbGFzcyAiRFRERXh0ZXJuYWxFbnRpdHkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDFGODAzRTEiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYxZWIxMC04NTBiLTExZTEtMDAxNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQzMjQwMEYzIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxOUQwMDgzIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAic3lzdGVtSUQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDAwLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDJFNTAxNjEiDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikNCi0JCShvYmplY3QgQ2xhc3NBdHRyaWJ1dGUgInB1YmxpY0lEIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwMS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQyRUMwMUY3Ig0KLQkJICAgIHR5cGUgICAgICAgCSJzdHJpbmciDQotCQkgICAgZXhwb3J0Q29udHJvbCAJIlB1YmxpYyIpKSkNCi0JKG9iamVjdCBDbGFzcyAiRFRESW50ZXJuYWxFbnRpdHkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0VGRDJCQTAyNkUiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwMy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQzMkIwMzJFIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxOUQwMDgzIikpDQotCSAgICBjbGFzc19hdHRyaWJ1dGVzIAkobGlzdCBjbGFzc19hdHRyaWJ1dGVfbGlzdA0KLQkJKG9iamVjdCBDbGFzc0F0dHJpYnV0ZSAidmFsdWUiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDA0LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0VGRDJDQjAyNjgiDQotCQkgICAgdHlwZSAgICAgICAJInN0cmluZyINCi0JCSAgICBleHBvcnRDb250cm9sIAkiUHVibGljIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyODdDQTAxNjMiDQotCSAgICBzdXBlcmNsYXNzZXMgCShsaXN0IGluaGVyaXRhbmNlX3JlbGF0aW9uc2hpcF9saXN0DQotCQkob2JqZWN0IEluaGVyaXRhbmNlX1JlbGF0aW9uc2hpcA0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwNi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzlCN0YwRDEwMDc2Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiKQ0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJCOEEwMjg3Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREQ29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCNUUwMkRFIikpKQ0KLQkob2JqZWN0IENsYXNzICJEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1MjkwMEUwMTI3Ig0KLQkgICAgc3VwZXJjbGFzc2VzIAkobGlzdCBpbmhlcml0YW5jZV9yZWxhdGlvbnNoaXBfbGlzdA0KLQkJKG9iamVjdCBJbmhlcml0YW5jZV9SZWxhdGlvbnNoaXANCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDgtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5MDQ0MDExQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFJlcGVhdGFibGVDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ0QzAxRDEiKSkpDQotCShvYmplY3QgQ2xhc3MgIlhNTFNjaGVtYURlZmluZWRUeXBlIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMDktMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg5RjBDNkQwMTBFIg0KLQkgICAgZG9jdW1lbnRhdGlvbiAJDQotfE5PTkU9LTENCi18U1RSSU5HPTENCi18Qk9PTEVBTj0yDQotfEZMT0FUPTMNCi18RE9VQkxFPTQNCi18REVDSU1BTD01DQotfFRJTUVJTlNUQU5UPTYNCi18VElNRURVUkFUSU9OPTcNCi18UkVDVVJSSU5HSU5TVEFOVD04DQotfEJJTkFSWT05DQotfFVSST0xMA0KLXxJTlRFR0VSPTExDQotfERBVEU9MTINCi18VElNRT0xMw0KLQkgICAgDQotCSAgICBzdGVyZW90eXBlIAkiZW51bWVyYXRpb24iKQ0KLQkob2JqZWN0IENsYXNzICJEVERDb250ZW50Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5RkUyQjVFMDJERSINCi0JICAgIGFic3RyYWN0ICAgCVRSVUUpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDAiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAwYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0NCRUI2RjAwNUQiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiY29udGVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGItMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3Q0JFQjcwMDA2RCINCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEuLm4iKQ0KLQkJICAgIENvbnN0cmFpbnRzIAkib3JkZXJlZCINCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZ3JvdXAiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBjLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0NCRUI3MDAwQUIiDQotCQkgICAgbGFiZWwgICAgICAJImdyb3VwIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRER3JvdXBDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFFRjAyMzIiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdEOUFDMEUwMENEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImVsZW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDBlLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUMwRjAzOUYiDQotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiY29udGVudCINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMGYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBQzBGMDNBOSINCi0JCSAgICBsYWJlbCAgICAgIAkiY29udGVudCINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUFDRjAyMTMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDIiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxMC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzN0Q5QUYxMTAwMUEiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudFJlZmVyZW5jZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM3RDlBRjFCMDIwOSINCi0JCSAgICBsYWJlbCAgICAgIAkiZWxlbWVudFJlZmVyZW5jZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnRSZWZlcmVuY2VDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUI3RDAwMTAiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKSkNCi0JCShvYmplY3QgUm9sZSAicmVmZXJlbmNlZEVsZW1lbnQiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDEyLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzN0Q5QUYxQjAyMEEiDQotCQkgICAgbGFiZWwgICAgICAJInJlZmVyZW5jZWRFbGVtZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkMyINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDEzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM3RUZEMUM5MDJERiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQ0Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxNC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxQ0EwMzFEIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFDQotCQkgICAgaXNfYWdncmVnYXRlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJjb250ZW50Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxNS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQxQ0EwMzI3Ig0KLQkJICAgIGxhYmVsICAgICAgCSJjb250ZW50Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Q29udGVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxOUQwMDgzIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIxIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ1Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMTYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzdFRkQzNDQwMEU1Ig0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgIm5vdGF0aW9uIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxNy0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJlQ29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJFY29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQzNDUwMjA5Ig0KLQkJICAgIGxhYmVsICAgICAgCSJub3RhdGlvbiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRURE5vdGF0aW9uIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDBFRjAwQzkiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxOC0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzdFRkQzNDUwMjEzIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFeHRlcm5hbEVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxRjgwM0UxIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUpKSkNCi0JKG9iamVjdCBBc3NvY2lhdGlvbiAiJFVOTkFNRUQkNiINCi0JICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCShvYmplY3QgQXR0cmlidXRlDQotCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDE5LTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkgICAgcXVpZCAgICAgICAJIjM4NTI4OTc5MDA1RiINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICJwYXJtRW50aXR5UmVmIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxYS0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjg5N0MwMzUyIg0KLQkJICAgIGxhYmVsICAgICAgCSJwYXJtRW50aXR5UmVmIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFREUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIg0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyODdDQTAxNjMiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5Ig0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxYi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjg5N0MwMzUzIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDciDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxYy0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzODUyOTRFQjAyNDMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5UmVmZXJlbmNlIg0KLQkJICAgIGF0dHJpYnV0ZXMgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJCSAgICBuYW1lICAgICAgIAkidXVpZCINCi0JCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAxZC0wMDVjZjQ2OTFjNGM6MSIpKQ0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJlQ29yZSINCi0JCQkgICAgbmFtZSAgICAgICAJImlzVHJhbnNpZW50Ig0KLQkJCSAgICB2YWx1ZSAgICAgIAlUUlVFKSkNCi0JCSAgICBxdWlkICAgICAgIAkiMzg1Mjk0RUYwM0JCIg0KLQkJICAgIGxhYmVsICAgICAgCSJlbnRpdHlSZWZlcmVuY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTAwRTAxMjciDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiZWxlbWVudFJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDFlLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTRFRjAzQkMiDQotCQkgICAgbGFiZWwgICAgICAJImVsZW1lbnRSZWZlcmVuY2VkRW50aXR5Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDEyQjAzQzgiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjEiKQ0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQ4Ig0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMWYtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzg1Mjk3MkQwMkNCIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDIwLTAwNWNmNDY5MWM0YzoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzODUyOTczNjAyOTEiDQotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjEtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4NTI5NzM2MDI5QiINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDkiDQotCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkgICAgdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIkRDRTo5MzYzNzFiMC04NTBiLTExZTEtMDAyMi0wMDVjZjQ2OTFjNGM6MSIpKSkNCi0JICAgIHF1aWQgICAgICAgCSIzOEI2OEE3MzAyQjgiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTAiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDIzLTAwNWNmNDY5MWM0YzoxIikpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEI2OEE3ODAwODQiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFeHRlcm5hbEVudGl0eSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxRjgwM0UxIikNCi0JCShvYmplY3QgUm9sZSAiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjQtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QjY4QTc4MDA4RSINCi0JCSAgICBsYWJlbCAgICAgIAkiZW50aXR5UmVmZXJlbmNlZEZyb21Bbm90aGVyRmlsZSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDExIg0KLQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCSAgICB0b29sICAgICAgIAkiSURMIg0KLQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjUtMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCSAgICBxdWlkICAgICAgIAkiMzhCRDQ5MDgwMTNEIg0KLQkgICAgcm9sZXMgICAgICAJKGxpc3Qgcm9sZV9saXN0DQotCQkob2JqZWN0IFJvbGUgImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiDQotCQkgICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCShvYmplY3QgQXR0cmlidXRlDQotCQkJICAgIHRvb2wgICAgICAgCSJJREwiDQotCQkJICAgIG5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCSAgICB2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiRENFOjkzNjM3MWIwLTg1MGItMTFlMS0wMDI2LTAwNWNmNDY5MWM0YzoxIikpDQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCSAgICBuYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJICAgIHZhbHVlICAgICAgCVRSVUUpKQ0KLQkJICAgIHF1aWQgICAgICAgCSIzOEJENDkxNDAxMzAiDQotCQkgICAgbGFiZWwgICAgICAJImF0dHJpYnV0ZVR5cGVSZWZlcmVuY2UiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4ubiIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKQ0KLQkJKG9iamVjdCBSb2xlICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSINCi0JCSAgICBhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkgICAgdG9vbCAgICAgICAJIklETCINCi0JCQkgICAgbmFtZSAgICAgICAJInV1aWQiDQotCQkJICAgIHZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICJEQ0U6OTM2MzcxYjAtODUwYi0xMWUxLTAwMjctMDA1Y2Y0NjkxYzRjOjEiKSkpDQotCQkgICAgcXVpZCAgICAgICAJIjM4QkQ0OTE0MDE0RSINCi0JCSAgICBsYWJlbCAgICAgIAkiYXR0cmlidXRlVHlwZVJlZmVyZW5jZWRFbnRpdHkiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHkiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjbGllbnRfY2FyZGluYWxpdHkgCSh2YWx1ZSBjYXJkaW5hbGl0eSAiMC4uMSIpDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDEyIg0KLQkgICAgcXVpZCAgICAgICAJIjM5RkUyQTk1MDBDQyINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxMyINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTJBOTUwMzExIg0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudCINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTQiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQTk1MDMxQiINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQzE4NzkwMEVBIg0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKQ0KLQkob2JqZWN0IEFzc29jaWF0aW9uICIkVU5OQU1FRCQxNSINCi0JICAgIHF1aWQgICAgICAgCSIzOUZFMkJCRTAyREMiDQotCSAgICByb2xlcyAgICAgIAkobGlzdCByb2xlX2xpc3QNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMTYiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUyQkJGMDFCMSINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREZpbGUiDQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlCMDhFMDE4RiINCi0JCSAgICBpc19uYXZpZ2FibGUgCVRSVUUNCi0JCSAgICBpc19hZ2dyZWdhdGUgCVRSVUUpDQotCQkob2JqZWN0IFJvbGUgIiRVTk5BTUVEJDE3Ig0KLQkJICAgIHF1aWQgICAgICAgCSIzOUZFMkJCRjAxQkIiDQotCQkgICAgc3VwcGxpZXIgICAJIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERDb250ZW50Ig0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiDQotCQkgICAgY2xpZW50X2NhcmRpbmFsaXR5IAkodmFsdWUgY2FyZGluYWxpdHkgIjAuLm4iKQ0KLQkJICAgIENvbnRhaW5tZW50IAkiQnkgVmFsdWUiDQotCQkgICAgaXNfbmF2aWdhYmxlIAlUUlVFKSkpDQotCShvYmplY3QgQXNzb2NpYXRpb24gIiRVTk5BTUVEJDE4Ig0KLQkgICAgcXVpZCAgICAgICAJIjM5RkUzMEQ4MDMzRSINCi0JICAgIHJvbGVzICAgICAgCShsaXN0IHJvbGVfbGlzdA0KLQkJKG9iamVjdCBSb2xlICIkVU5OQU1FRCQxOSINCi0JCSAgICBxdWlkICAgICAgIAkiMzlGRTMwRDkwMTA1Ig0KLQkJICAgIHN1cHBsaWVyICAgCSJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERmlsZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUIwOEUwMThGIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRQ0KLQkJICAgIGlzX2FnZ3JlZ2F0ZSAJVFJVRSkNCi0JCShvYmplY3QgUm9sZSAiJFVOTkFNRUQkMjAiDQotCQkgICAgcXVpZCAgICAgICAJIjM5RkUzMEQ5MDEzNyINCi0JCSAgICBzdXBwbGllciAgIAkiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudW1lcmF0aW9uVHlwZSINCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ2NjgwMzA2Ig0KLQkJICAgIGNsaWVudF9jYXJkaW5hbGl0eSAJKHZhbHVlIGNhcmRpbmFsaXR5ICIwLi5uIikNCi0JCSAgICBDb250YWlubWVudCAJIkJ5IFZhbHVlIg0KLQkJICAgIGlzX25hdmlnYWJsZSAJVFJVRSkpKSkNCi0gICAgbG9naWNhbF9wcmVzZW50YXRpb25zIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCShvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkgICAgcXVpZCAgICAgICAJIjM3Q0FCMEU2MDE3NyINCi0JICAgIHRpdGxlICAgICAgCSJNYWluIg0KLQkgICAgem9vbSAgICAgICAJOTgNCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgTm90ZVZpZXcgQDENCi0JCSAgICBsb2NhdGlvbiAgIAkoMzI2NCwgMjQwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDENCi0JCQlsb2NhdGlvbiAgIAkoMjkxMCwgNjUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAk3DQotCQkJbWF4X3dpZHRoICAJNjczDQotCQkJbGFiZWwgICAgICAJDQotfERUREVsZW1lbnQncywgDQotfERURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSdzLCBEVERFbnRpdHkncywgYW5kIERURE5vdGF0aW9uJ3MgYXJlIGFkZGVkIHRvIERUREZpbGUncyB1c2luZyB0aGUNCi18b3duZWRFbGVtZW50IHJlbGF0aW9uc2hpcA0KLXxiZXR3ZWVuIE1PRk5hbWVzcGFjZQ0KLXxhbmQgTU9GT2JqZWN0DQotCQkJKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHdpZHRoICAgICAgCTczMw0KLQkJICAgIGhlaWdodCAgICAgCTM2MykNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERJbnRlcm5hbEVudGl0eSIgQDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTgyNCwgMTg3MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyDQotCQkJbG9jYXRpb24gICAJKDE2NDcsIDE4MTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzU0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERJbnRlcm5hbEVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMkJBMDI2RSINCi0JCSAgICB3aWR0aCAgICAgIAkzNzINCi0JCSAgICBoZWlnaHQgICAgIAkxMzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50IiBAMw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg1OTIsIDEyMDApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMw0KLQkJCWxvY2F0aW9uICAgCSg0MTcsIDExNDUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMzUwDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFBRjcwMDcxIg0KLQkJICAgIGNvbXBhcnRtZW50IAkob2JqZWN0IENvbXBhcnRtZW50DQotCQkJUGFyZW50X1ZpZXcgCUAzDQotCQkJbG9jYXRpb24gICAJKDQxNywgMTIwNCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3MSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNjgNCi0JCSAgICBoZWlnaHQgICAgIAkxMzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlDb250ZW50IiBANA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxNDg4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANA0KLQkJCWxvY2F0aW9uICAgCSgxMzQxLCAxNDM4KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW50aXR5Q29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTlEMDA4MyINCi0JCSAgICB3aWR0aCAgICAgIAkzNzYNCi0JCSAgICBoZWlnaHQgICAgIAkxMjQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFRyZWVWaWV3ICIiIEA1DQotCQkgICAgbG9jYXRpb24gICAJKDE1MjAsIDE2NDApDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDQNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTUyMCwgMTY0MCkNCi0JCQkoMTUyMCwgMTU1MCkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSIgQDYNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjQ4MCwgMTIxNikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2DQotCQkJbG9jYXRpb24gICAJKDIxODYsIDExNjYpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTg4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyODdDQTAxNjMiDQotCQkgICAgd2lkdGggICAgICAJNjA2DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERW50aXR5IiBANw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNTIwLCAxMjE2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDcNCi0JCQlsb2NhdGlvbiAgIAkoMTI3MCwgMTEzNykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1MDANCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICBjb21wYXJ0bWVudCAJKG9iamVjdCBDb21wYXJ0bWVudA0KLQkJCVBhcmVudF9WaWV3IAlANw0KLQkJCWxvY2F0aW9uICAgCSgxMjcwLCAxMTk2KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlmaWxsX2NvbG9yIAkxNjc3NzIxNQ0KLQkJCWFuY2hvciAgICAgCTINCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJNTI1KQ0KLQkJICAgIHdpZHRoICAgICAgCTUxOA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDMiIEA4DQotCQkgICAgbG9jYXRpb24gICAJKDE1NDYsIDEzNjYpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxQzkwMkRGIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDQiIEA5DQotCQkJICAgIFBhcmVudF9WaWV3IAlAOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU0LCAyNDYpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxQ0EwMzFEIg0KLQkJCSAgICBjbGllbnQgICAgIAlAOA0KLQkJCSAgICBzdXBwbGllciAgIAlANw0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTU0NiwgMTM2NikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE1NDYsIDEzMDcpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImNvbnRlbnQiIEAxMA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NCwgMjQ2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDExDQotCQkJCVBhcmVudF9WaWV3IAlAMTANCi0JCQkJbG9jYXRpb24gICAJKDE0NDMsIDE0MDcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxOTENCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2NvbnRlbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNjk5MjQ4DQotCQkJCWhlaWdodCAgICAgCTEwNA0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDFDQTAzMjciDQotCQkJICAgIGNsaWVudCAgICAgCUA4DQotCQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNTQ2LCAxMzY2KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTU0NiwgMTQyNikNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU2OCwgMTQwOCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzIxODA0DQotCQkJCWhlaWdodCAgICAgCTIyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDYiIEAxMw0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTc4LCAxMjU2KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI4OTc5MDA1RiINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJwYXJtRW50aXR5UmVmIiBAMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoNjAyLCA0ODgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxNA0KLQkJCQlsb2NhdGlvbiAgIAkoMjAzOCwgMTI5OSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMyOA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrcGFybUVudGl0eVJlZiINCi0JCQkJcGN0RGlzdCAgICAJMC4zMDU0MTkNCi0JCQkJaGVpZ2h0ICAgICAJNDMNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg5N0MwMzUyIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NzgsIDEyNTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTc3LCAxMjU2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxNg0KLQkJCQlQYXJlbnRfVmlldyAJQDE0DQotCQkJCWxvY2F0aW9uICAgCSgyMTQxLCAxMjI4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC44MjY0ODQNCi0JCQkJaGVpZ2h0ICAgICAJMjkNCi0JCQkJb3JpZW50YXRpb24gCTApKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eSIgQDE3DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDYwMiwgNDg4KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTcNCi0JCQkJbG9jYXRpb24gICAJKDE4NjIsIDEyMTcpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC41ODkxMDkNCi0JCQkJaGVpZ2h0ICAgICAJNDANCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjg5N0MwMzUzIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE5NzgsIDEyNTYpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzc5LCAxMjU2KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDE3DQotCQkJCWxvY2F0aW9uICAgCSgxODIzLCAxMzA5KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMSINCi0JCQkJcGN0RGlzdCAgICAJMC43NzY5MjMNCi0JCQkJaGVpZ2h0ICAgICAJNTMNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmVjb3JlOjplTmFtZWRFbGVtZW50IiBAMjANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDg4LCAxNzYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAyMA0KLQkJCWxvY2F0aW9uICAgCSgxMzUyLCAxMzEpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJMjcyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJlTmFtZWRFbGVtZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5MDNENEVFMDAxNCINCi0JCSAgICB3aWR0aCAgICAgIAkyOTANCi0JCSAgICBoZWlnaHQgICAgIAkxMTUNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZWNvcmU6OkVDbGFzcyIgQDIxDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoNTc2LCA5NjApDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjENCi0JCQlsb2NhdGlvbiAgIAkoNDkyLCA4NjMpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIg0KLQkJICAgIHdpZHRoICAgICAgCTE4Ng0KLQkJICAgIGhlaWdodCAgICAgCTIxOA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjINCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwQUYwMkE4Ig0KLQkJICAgIGNsaWVudCAgICAgCUAzDQotCQkgICAgc3VwcGxpZXIgICAJQDIxDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoNTcxLCAxMTMyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1NzEsIDEwNjkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6ZU5hbWVkRWxlbWVudCIgQDIzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2MCwgODY0KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJVFJVRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjMNCi0JCQlsb2NhdGlvbiAgIAkoMjQyNCwgODE5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTI3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiZU5hbWVkRWxlbWVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDRFRTAwMTQiDQotCQkgICAgd2lkdGggICAgICAJMjkwDQotCQkgICAgaGVpZ2h0ICAgICAJMTE1DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMjQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjU2MCwgMTAzNikNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJKDI1NjAsIDEwMzYpDQotCQkJKDI1NjAsIDkyMSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMjUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwRTcwMUVBIg0KLQkJICAgIGNsaWVudCAgICAgCUA3DQotCQkgICAgc3VwcGxpZXIgICAJQDIzDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTY2OSwgMTEyNSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTY2OSwgMTAzNikNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAyNCkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDI2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEQxMDA3NiINCi0JCSAgICBjbGllbnQgICAgIAlANg0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI2MTgsIDExNTMpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDI2MTgsIDEwMzYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjQpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRETm90YXRpb24iIEAyNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5OTIsIDEyMzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjcNCi0JCQlsb2NhdGlvbiAgIAkoODE3LCAxMTI5KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM1MA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRETm90YXRpb24iKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDBFRjAwQzkiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDI3DQotCQkJbG9jYXRpb24gICAJKDgxNywgMTE4OCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMw0KLQkJCW1heF93aWR0aCAgCTM3MSkNCi0JCSAgICB3aWR0aCAgICAgIAkzNjgNCi0JCSAgICBoZWlnaHQgICAgIAkyMzANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFeHRlcm5hbEVudGl0eSIgQDI4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEzNDQsIDE4NzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMjgNCi0JCQlsb2NhdGlvbiAgIAkoMTE1OCwgMTc5MykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzNzINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREV4dGVybmFsRW50aXR5IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQxRjgwM0UxIg0KLQkJICAgIHdpZHRoICAgICAgCTM5MA0KLQkJICAgIGhlaWdodCAgICAgCTE4Mg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDUiIEAyOQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5NjksIDE2NzcpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzNDQwMEU1Ig0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIm5vdGF0aW9uIiBAMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyOQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI0NywgMjA1KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDMxDQotCQkJCVBhcmVudF9WaWV3IAlAMzANCi0JCQkJbG9jYXRpb24gICAJKDgzNCwgMTM5MCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTIwMw0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrbm90YXRpb24iDQotCQkJCXBjdERpc3QgICAgCTAuODcwNzM0DQotCQkJCWhlaWdodCAgICAgCTEzNg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDM0NTAyMDkiDQotCQkJICAgIGNsaWVudCAgICAgCUAyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjcNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk2OSwgMTY3NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk2OSwgMTM0NykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzINCi0JCQkJUGFyZW50X1ZpZXcgCUAzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTA0MCwgMTM4OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuODc3OTM0DQotCQkJCWhlaWdodCAgICAgCTcxDQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbnRpdHkiIEAzMw0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDI5DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjQ3LCAyMDUpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMzQNCi0JCQkJUGFyZW50X1ZpZXcgCUAzMw0KLQkJCQlsb2NhdGlvbiAgIAkoMTA4MiwgMTc4NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1MA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgwMDAwMA0KLQkJCQloZWlnaHQgICAgIAk0Mg0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDM0NTAyMTMiDQotCQkJICAgIGNsaWVudCAgICAgCUAyOQ0KLQkJCSAgICBzdXBwbGllciAgIAlAMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSg5NjksIDE2NzcpDQotCQkJCSg5NjksIDE4MjcpDQotCQkJCSgxMTQ5LCAxODI3KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDk2OSwgMTY3NykNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNDksIDE4MjcpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDM1DQotCQkJCVBhcmVudF9WaWV3IAlAMzMNCi0JCQkJbG9jYXRpb24gICAJKDExMDQsIDE4NTMpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi5uIg0KLQkJCQlwY3REaXN0ICAgIAkwLjg2MzUwMQ0KLQkJCQloZWlnaHQgICAgIAkyNg0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDM2DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFRkQzMjQwMEYzIg0KLQkJICAgIGNsaWVudCAgICAgCUAyOA0KLQkJICAgIHN1cHBsaWVyICAgCUA0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTI3NCwgMTc4MSkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3NCwgMTY0MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRURENvbnRlbnQiIEAzNw0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0NzIsIDgwMCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCVRSVUUNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDM3DQotCQkJbG9jYXRpb24gICAJKDEzNDQsIDc1MCkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkyNTYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRURENvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI1RTAyREUiDQotCQkgICAgd2lkdGggICAgICAJMjc0DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBAMzgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ3MiwgOTkwKQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCSgxNDcyLCA5OTApDQotCQkJKDE0NzIsIDg2MikpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMzkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI4MzAyOUIiDQotCQkgICAgY2xpZW50ICAgICAJQDMNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg3MTksIDExMzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDcxOSwgOTkwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM4KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANDANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkI4NjAzMDQiDQotCQkgICAgY2xpZW50ICAgICAJQDcNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDUyLCAxMTI0KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDUyLCA5OTApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMzgpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA0MQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjhBMDI4NyINCi0JCSAgICBjbGllbnQgICAgIAlANg0KLQkJICAgIHN1cHBsaWVyICAgCUAzNw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDIzNDcsIDExNTQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDIzNDcsIDk5MCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUAzOCkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERGaWxlIiBANDINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgNDQ4KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJbG9jYXRpb24gICAJKDEyODEsIDM2OSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0MTQNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREZpbGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QjA4RTAxOEYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDQyDQotCQkJbG9jYXRpb24gICAJKDEyODEsIDQyOCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTQyNSkNCi0JCSAgICB3aWR0aCAgICAgIAk0MzINCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ5IiBANDMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMzU0LCAxMDQ5KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM4QjY4QTczMDJCOCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMCIgQDQ0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANDMNCi0JCQkgICAgbG9jYXRpb24gICAJKC0xMDksIDIwNykNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEI2OEE3ODAwODQiDQotCQkJICAgIGNsaWVudCAgICAgCUA0Mw0KLQkJCSAgICBzdXBwbGllciAgIAlAMjgNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgzNTQsIDEwNDkpDQotCQkJCSgzNTQsIDE3ODEpDQotCQkJCSgxMTQ5LCAxNzgxKSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDM1NCwgMTA0OSkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDExNDksIDE3ODEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImVudGl0eVJlZmVyZW5jZWRGcm9tQW5vdGhlckZpbGUiIEA0NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQzDQotCQkJICAgIGxvY2F0aW9uICAgCSgtMTA5LCAyMDcpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANDYNCi0JCQkJUGFyZW50X1ZpZXcgCUA0NQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjk2LCA0NTM3KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNzMyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitlbnRpdHlSZWZlcmVuY2VkRnJvbUFub3RoZXJGaWxlIg0KLQkJCQlwY3REaXN0ICAgIAktMi4yODMzMzMNCi0JCQkJaGVpZ2h0ICAgICAJNTkNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhCNjhBNzgwMDhFIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMzU0LCAxMDQ5KQ0KLQkJCQkoMzU0LCA0MzkpDQotCQkJCSgxMjcyLCA0MzkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMzU0LCAxMDQ5KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTI3MiwgNDM5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA0Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDQ1DQotCQkJCWxvY2F0aW9uICAgCSgxMjA2LCA1MDApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjk1NzEyOQ0KLQkJCQloZWlnaHQgICAgIAk2MQ0KLQkJCQlvcmllbnRhdGlvbiAJMSkpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDQ4DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMDdGMDExOCINCi0JCSAgICBjbGllbnQgICAgIAlANDINCi0JCSAgICBzdXBwbGllciAgIAlAMjANCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDg4LCAzNTcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0ODgsIDIzMykpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTUiIEA0OQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxNDcyLCA2MzgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCQkUwMkRDIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDE2IiBANTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA0OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMCwgLTE2MikNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMkJCRjAxQjEiDQotCQkJICAgIGNsaWVudCAgICAgCUA0OQ0KLQkJCSAgICBzdXBwbGllciAgIAlANDINCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NzIsIDYzOCkNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzIsIDUzOSkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTciIEA1MQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDQ5DQotCQkJICAgIGxvY2F0aW9uICAgCSgwLCAtMTYyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTJCQkYwMUJCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANDkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDM3DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDcyLCA2MzgpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNDcyLCA3MzgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDUyDQotCQkJCVBhcmVudF9WaWV3IAlANTENCi0JCQkJbG9jYXRpb24gICAJKDE1MjYsIDcxMikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzM2MjQ4DQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudW1lcmF0aW9uVHlwZSIgQDUzDQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDI0NDgsIDQ2NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA1Mw0KLQkJCWxvY2F0aW9uICAgCSgyMTg0LCAzODUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTI4DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnVtZXJhdGlvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDY2ODAzMDYiDQotCQkgICAgY29tcGFydG1lbnQgCShvYmplY3QgQ29tcGFydG1lbnQNCi0JCQlQYXJlbnRfVmlldyAJQDUzDQotCQkJbG9jYXRpb24gICAJKDIxODQsIDQ0NCkNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJZmlsbF9jb2xvciAJMTY3NzcyMTUNCi0JCQlhbmNob3IgICAgIAkyDQotCQkJbmxpbmVzICAgICAJMg0KLQkJCW1heF93aWR0aCAgCTU0NikNCi0JCSAgICB3aWR0aCAgICAgIAk1NDYNCi0JCSAgICBoZWlnaHQgICAgIAkxODINCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQxOCIgQDU0DQotCQkgICAgbG9jYXRpb24gICAJKDE5MzksIDQ0OSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUZFMzBEODAzM0UiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTkiIEA1NQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDU0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtNDYxLCAtMzEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTMwRDkwMTA1Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDQyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM5LCA0NDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNzA0LCA0NDkpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgIiRVTk5BTUVEJDIwIiBANTYNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA1NA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTQ2MSwgLTMxKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzlGRTMwRDkwMTM3Ig0KLQkJCSAgICBjbGllbnQgICAgIAlANTQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDUzDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTM5LCA0NDkpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTc1LCA0NDkpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDU3DQotCQkJCVBhcmVudF9WaWV3IAlANTYNCi0JCQkJbG9jYXRpb24gICAJKDIxMjAsIDQ4NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLm4iDQotCQkJCXBjdERpc3QgICAgCTAuNzY3ODM3DQotCQkJCWhlaWdodCAgICAgCTM3DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANTgNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YwRTMwMjM0Ig0KLQkJICAgIGNsaWVudCAgICAgCUAyNw0KLQkJICAgIHN1cHBsaWVyICAgCUAyMw0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEwNjQsIDExMTYpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwNjQsIDEwMzYpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAMjQpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA1OQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQjg1MDExOCINCi0JCSAgICBjbGllbnQgICAgIAlAMjcNCi0JCSAgICBzdXBwbGllciAgIAlAMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5NDEsIDExMTcpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDk0MSwgOTkwKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDM4KQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0VGRDMyQjAzMkUiDQotCQkgICAgY2xpZW50ICAgICAJQDINCi0JCSAgICBzdXBwbGllciAgIAlANA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE3ODIsIDE4MDUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE3ODIsIDE2NDApDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANSkpKQ0KLQkob2JqZWN0IENsYXNzRGlhZ3JhbSAiRWxlbWVudERlZmluaXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQzMzAwMzJGIg0KLQkgICAgdGl0bGUgICAgICAJIkVsZW1lbnREZWZpbml0aW9uIg0KLQkgICAgem9vbSAgICAgICAJMTAwDQotCSAgICBtYXhfaGVpZ2h0IAkyODM1MA0KLQkgICAgbWF4X3dpZHRoICAJMjE2MDANCi0JICAgIG9yaWdpbl94ICAgCTANCi0JICAgIG9yaWdpbl95ICAgCTQyNg0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbXB0eUNvbnRlbnQiIEA2MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg0NjcsIDE0NDgpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjENCi0JCQlsb2NhdGlvbiAgIAkoMjgxLCAxNDAzKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM3Mg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW1wdHlDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCNDcwMzdBIg0KLQkJICAgIHdpZHRoICAgICAgCTM5MA0KLQkJICAgIGhlaWdodCAgICAgCTExNA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREFueUNvbnRlbnQiIEA2Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg4ODYsIDE0NDUpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlANjINCi0JCQlsb2NhdGlvbiAgIAkoNzI4LCAxNDAwKQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTMxNg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQW55Q29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjUwMDMwNCINCi0JCSAgICB3aWR0aCAgICAgIAkzMzQNCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERQQ0RhdGFDb250ZW50IiBANjMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI5OCwgMTQ1MSkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Mw0KLQkJCWxvY2F0aW9uICAgCSgxMDk5LCAxNDA2KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTM5OA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREUENEYXRhQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjVDMDEzNSINCi0JCSAgICB3aWR0aCAgICAgIAk0MTYNCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERSZXBlYXRhYmxlQ29udGVudCIgQDY0DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE4ODgsIDE0NTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2NA0KLQkJCWxvY2F0aW9uICAgCSgxNTcyLCAxNDA0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTYzMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREUmVwZWF0YWJsZUNvbnRlbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ0QzAxRDEiDQotCQkgICAgd2lkdGggICAgICAJNjUwDQotCQkgICAgaGVpZ2h0ICAgICAJMTI4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEluaGVyaXRUcmVlVmlldyAiIiBANjUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTg3OCwgMTYxOCkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlANjQNCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoMTg3OCwgMTYxOCkNCi0JCQkoMTg3OCwgMTUyMCkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUF0dHJpYnV0ZSIgQDY2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkzNiwgNDAwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDY2DQotCQkJbG9jYXRpb24gICAJKDE4NTUsIDMyNSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyMzg0NzIwMzlEIg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBANjcNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MjgsIDM4NCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2Nw0KLQkJCWxvY2F0aW9uICAgCSg4NDcsIDMwOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVDbGFzcyIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBmaWxsX2NvbG9yIAkxNjc3NzE3NQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOTAzRDVCRjAwMEEiDQotCQkgICAgaGVpZ2h0ICAgICAJMTc0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRER3JvdXBDb250ZW50IiBANjgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjE5MiwgMTc3NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA2OA0KLQkJCWxvY2F0aW9uICAgCSgxOTMxLCAxNzI3KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUyMg0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRER3JvdXBDb250ZW50IikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdDQkVBRUYwMjMyIg0KLQkJICAgIHdpZHRoICAgICAgCTU0MA0KLQkJICAgIGhlaWdodCAgICAgCTEyMg0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBANjkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUQ5MjAzNjMiDQotCQkgICAgY2xpZW50ICAgICAJQDY4DQotCQkgICAgc3VwcGxpZXIgICAJQDY0DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMjIyMSwgMTcxNCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjIyMSwgMTYxOCkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA2NSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbnRpdHlSZWZlcmVuY2VDb250ZW50IiBANzANCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIFN1cHByZXNzT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4OCwgMTc2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3MA0KLQkJCWxvY2F0aW9uICAgCSgxMjIzLCAxNzE1KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTUzMA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFRERW50aXR5UmVmZXJlbmNlQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM4NTI5MDBFMDEyNyINCi0JCSAgICB3aWR0aCAgICAgIAk1NDgNCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDcxDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1MjkwNDQwMTFCIg0KLQkJICAgIGNsaWVudCAgICAgCUA3MA0KLQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDE0NzQsIDE3MDIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE0NzQsIDE2MTgpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlANjUpDQotCQkob2JqZWN0IENsYXNzVmlldyAiQ2xhc3MiICJMb2dpY2FsIFZpZXc6OmR0ZDo6RFRERWxlbWVudENvbnRlbnQiIEA3Mg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDEwNTYpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlUUlVFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA3Mg0KLQkJCWxvY2F0aW9uICAgCSg3MDQsIDEwMDgpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNDE2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbGVtZW50Q29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0JFQUNGMDIxMyINCi0JCSAgICB3aWR0aCAgICAgIAk0MzQNCi0JCSAgICBoZWlnaHQgICAgIAkxMjANCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQwIiBANzMNCi0JCSAgICBsb2NhdGlvbiAgIAkoMjI4OSwgMTA0OCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0NCRUI2RjAwNUQiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDc0DQotCQkJICAgIFBhcmVudF9WaWV3IAlANzMNCi0JCQkgICAgbG9jYXRpb24gICAJKDEwMjUsIDgpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzUNCi0JCQkJUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTIyMywgMTAwMSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE2OA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrY29udGVudCINCi0JCQkJcGN0RGlzdCAgICAJMC45MTk0MjQNCi0JCQkJaGVpZ2h0ICAgICAJNDgNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdDQkVCNzAwMDZEIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg5LCAxMDQ4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTEyOSwgMTA0OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBANzYNCi0JCQkJUGFyZW50X1ZpZXcgCUA3NA0KLQkJCQlsb2NhdGlvbiAgIAkoMTE4NiwgMTA4MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTcyDQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTUxMzgxDQotCQkJCWhlaWdodCAgICAgCTM1DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3Nw0KLQkJCQlQYXJlbnRfVmlldyAJQDc0DQotCQkJCWxvY2F0aW9uICAgCSgxMjQ2LCA5NDEpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkzDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNTkNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkie29yZGVyZWR9Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjkwMDAwMA0KLQkJCQloZWlnaHQgICAgIAkxMDgNCi0JCQkJb3JpZW50YXRpb24gCTEpKQ0KLQkJCShvYmplY3QgUm9sZVZpZXcgImdyb3VwIiBANzgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA3Mw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTAyNSwgOCkNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA3OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDc4DQotCQkJCWxvY2F0aW9uICAgCSgyNTM1LCAxNzQ1KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTQ0DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitncm91cCINCi0JCQkJcGN0RGlzdCAgICAJMC45Mzc3NDQNCi0JCQkJaGVpZ2h0ICAgICAJNDENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdDQkVCNzAwMEFCIg0KLQkJCSAgICBjbGllbnQgICAgIAlANzMNCi0JCQkgICAgc3VwcGxpZXIgICAJQDY4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjI4OSwgMTA0OCkNCi0JCQkJKDI1ODcsIDEwNDgpDQotCQkJCSgyNTg3LCAxNzg1KQ0KLQkJCQkoMjQ2MiwgMTc4NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyMjg5LCAxMDQ4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjQ2MiwgMTc4NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAODANCi0JCQkJUGFyZW50X1ZpZXcgCUA3OA0KLQkJCQlsb2NhdGlvbiAgIAkoMjUyNiwgMTgyNykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTQ1MDg1DQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VHJlZVZpZXcgIiIgQDgxDQotCQkgICAgbG9jYXRpb24gICAJKDkxMCwgMTI5MSkNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkoOTEwLCAxMjkxKQ0KLQkJCSg5MTAsIDExMTYpKSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDgyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCRTkwMjc4Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2Mw0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEyOTcsIDEzOTQpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyOTcsIDEyOTEpDQotCQkgICAgZHJhd1N1cHBsaWVyIAlAODEpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEA4Mw0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQkYzMDMyNyINCi0JCSAgICBjbGllbnQgICAgIAlANjENCi0JCSAgICBzdXBwbGllciAgIAlANzINCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg0NjYsIDEzOTEpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDQ2NiwgMTI5MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg0DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFCRUUwMjA3Ig0KLQkJICAgIGNsaWVudCAgICAgCUA2Mg0KLQkJICAgIHN1cHBsaWVyICAgCUA3Mg0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDg4MSwgMTM4OCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoODgxLCAxMjkxKQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDgxKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAODUNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QURCNzAzQzAiDQotCQkgICAgY2xpZW50ICAgICAJQDY0DQotCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkwMywgMTM5MikNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTkwMywgMTI5MSkNCi0JCSAgICBkcmF3U3VwcGxpZXIgCUA4MSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCIgQDg2DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDc4NCwgMTc2MCkNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA4Ng0KLQkJCWxvY2F0aW9uICAgCSg0OTIsIDE3MTUpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTg0DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbGVtZW50UmVmZXJlbmNlQ29udGVudCIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQjdEMDAxMCINCi0JCSAgICB3aWR0aCAgICAgIAk2MDINCi0JCSAgICBoZWlnaHQgICAgIAkxMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDg3DQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdEOUFEOEMwM0FBIg0KLQkJICAgIGNsaWVudCAgICAgCUA4Ng0KLQkJICAgIHN1cHBsaWVyICAgCUA2NA0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDY1MCwgMTcwMykNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNjUwLCAxNjE4KQ0KLQkJICAgIGRyYXdTdXBwbGllciAJQDY1KQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudGl0eSIgQDg4DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBTdXBwcmVzc09wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDE0ODgsIDIwNjQpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAODgNCi0JCQlsb2NhdGlvbiAgIAkoMTI0NCwgMTk5MikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk0ODgNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVudGl0eSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RUZEMTJCMDNDOCINCi0JCSAgICB3aWR0aCAgICAgIAk1MDYNCi0JCSAgICBoZWlnaHQgICAgIAkxNjgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ3IiBAODkNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTQ4MCwgMTg5OCkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzODUyOTRFQjAyNDMiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiZW50aXR5UmVmZXJlbmNlIiBAOTANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA4OQ0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMzEyLCAtNzApDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTENCi0JCQkJUGFyZW50X1ZpZXcgCUA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTI4MCwgMTg0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTMxMg0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrZW50aXR5UmVmZXJlbmNlIg0KLQkJCQlwY3REaXN0ICAgIAkwLjY5Mzc1MA0KLQkJCQloZWlnaHQgICAgIAkyMDENCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk0RUYwM0JCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcwDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDgwLCAxODk4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MCwgMTgxNykNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTINCi0JCQkJUGFyZW50X1ZpZXcgCUA5MA0KLQkJCQlsb2NhdGlvbiAgIAkoMTUzNCwgMTg0MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuNjkzNzUwDQotCQkJCWhlaWdodCAgICAgCTU0DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50UmVmZXJlbmNlZEVudGl0eSIgQDkzDQotCQkJICAgIFBhcmVudF9WaWV3IAlAODkNCi0JCQkgICAgbG9jYXRpb24gICAJKDMxMiwgLTcwKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDk0DQotCQkJCVBhcmVudF9WaWV3IAlAOTMNCi0JCQkJbG9jYXRpb24gICAJKDEyMjAsIDE5NTQpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0ODANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnRSZWZlcmVuY2VkRW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY4NTMxNQ0KLQkJCQloZWlnaHQgICAgIAkyNjENCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk0RUYwM0JDIg0KLQkJCSAgICBjbGllbnQgICAgIAlAODkNCi0JCQkgICAgc3VwcGxpZXIgICAJQDg4DQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxNDgwLCAxODk4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQ4MCwgMTk4MCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAOTUNCi0JCQkJUGFyZW50X1ZpZXcgCUA5Mw0KLQkJCQlsb2NhdGlvbiAgIAkoMTUyNCwgMTk1OCkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNzM0MjM0DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVsZW1lbnQiIEA5Ng0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSg5MTIsIDc1MikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUA5Ng0KLQkJCWxvY2F0aW9uICAgCSg3NDQsIDcwMikNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAkzMzYNCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREVsZW1lbnQiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUFGNzAwNzEiDQotCQkgICAgd2lkdGggICAgICAJMzU0DQotCQkgICAgaGVpZ2h0ICAgICAJMTI0DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMSIgQDk3DQotCQkgICAgbG9jYXRpb24gICAJKDkxMiwgOTA0KQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBQzBFMDBDRCINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50IiBAOTgNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUA5Nw0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTI1LCA5NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEA5OQ0KLQkJCQlQYXJlbnRfVmlldyAJQDk4DQotCQkJCWxvY2F0aW9uICAgCSgxMDE0LCA4NjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnQiDQotCQkJCXBjdERpc3QgICAgCTAuNDI4NTcxDQotCQkJCWhlaWdodCAgICAgCTEwMg0KLQkJCQlvcmllbnRhdGlvbiAJMSkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUMwRjAzOUYiDQotCQkJICAgIGNsaWVudCAgICAgCUA5Nw0KLQkJCSAgICBzdXBwbGllciAgIAlAOTYNCi0JCQkgICAgbGluZV9zdHlsZSAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDANCi0JCQkJUGFyZW50X1ZpZXcgCUA5OA0KLQkJCQlsb2NhdGlvbiAgIAkoODU3LCA4NTApDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkyDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkxNQ0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIwLi4xIg0KLQkJCQlwY3REaXN0ICAgIAkwLjU5ODIxNA0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiY29udGVudCIgQDEwMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDk3DQotCQkJICAgIGxvY2F0aW9uICAgCSgtMjUsIDk2KQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwMg0KLQkJCQlQYXJlbnRfVmlldyAJQDEwMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMTAxNCwgOTY0KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTY4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIitjb250ZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjY2NDA2Mw0KLQkJCQloZWlnaHQgICAgIAkxMDINCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzdEOUFDMEYwM0E5Ig0KLQkJCSAgICBjbGllbnQgICAgIAlAOTcNCi0JCQkgICAgc3VwcGxpZXIgICAJQDcyDQotCQkJICAgIGxpbmVfc3R5bGUgCTANCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTAzDQotCQkJCVBhcmVudF9WaWV3IAlAMTAxDQotCQkJCWxvY2F0aW9uICAgCSg4NzEsIDk2MikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuNjQwNjI1DQotCQkJCWhlaWdodCAgICAgCTQyDQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBBc3NvY2lhdGlvblZpZXdOZXcgIiRVTk5BTUVEJDIiIEAxMDQNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTIzLCAxMTIyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRjExMDAxQSINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJlbGVtZW50UmVmZXJlbmNlIiBAMTA1DQotCQkJICAgIFBhcmVudF9WaWV3IAlAMTA0DQotCQkJICAgIGxvY2F0aW9uICAgCSgtOTgxLCA2NDIpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTA2DQotCQkJCVBhcmVudF9WaWV3IAlAMTA1DQotCQkJCWxvY2F0aW9uICAgCSgzMjEsIDE4MjUpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNDgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2VsZW1lbnRSZWZlcmVuY2UiDQotCQkJCXBjdERpc3QgICAgCTAuODQwMDM1DQotCQkJCWhlaWdodCAgICAgCTU2DQotCQkJCW9yaWVudGF0aW9uIAkxKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM3RDlBRjFCMDIwOSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEwNA0KLQkJCSAgICBzdXBwbGllciAgIAlAODYNCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgxMjMsIDExMjIpDQotCQkJCSgxMjMsIDE3NjkpDQotCQkJCSg0ODMsIDE3NjkpKQ0KLQkJCSAgICBsaW5lX3N0eWxlIAkzDQotCQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTIzLCAxMTIyKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoNDgzLCAxNzY5KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMDcNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMDUNCi0JCQkJbG9jYXRpb24gICAJKDQyMiwgMTcyNikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTQwNTU5DQotCQkJCWhlaWdodCAgICAgCTQ0DQotCQkJCW9yaWVudGF0aW9uIAkwKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJyZWZlcmVuY2VkRWxlbWVudCIgQDEwOA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEwNA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTk4MSwgNjQyKQ0KLQkJCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJc2l6ZSAgICAgICAJMTANCi0JCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQljb2xvciAgICAgIAkwDQotCQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEwOQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEwOA0KLQkJCQlsb2NhdGlvbiAgIAkoNTMyLCA2ODYpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAkzNjANCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK3JlZmVyZW5jZWRFbGVtZW50Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjc5OTY1MA0KLQkJCQloZWlnaHQgICAgIAk0Mw0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzN0Q5QUYxQjAyMEEiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMDQNCi0JCQkgICAgc3VwcGxpZXIgICAJQDk2DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMTIzLCAxMTIyKQ0KLQkJCQkoMTIzLCA3MjgpDQotCQkJCSg3MzUsIDcyOCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjMsIDExMjIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg3MzUsIDcyOCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTEwDQotCQkJCVBhcmVudF9WaWV3IAlAMTA4DQotCQkJCWxvY2F0aW9uICAgCSg3MDEsIDc3MykNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjEiDQotCQkJCXBjdERpc3QgICAgCTAuOTY2OTY1DQotCQkJCWhlaWdodCAgICAgCTQ1DQotCQkJCW9yaWVudGF0aW9uIAkxKSkpKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTExDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMEFGMDJBOCINCi0JCSAgICBjbGllbnQgICAgIAlAOTYNCi0JCSAgICBzdXBwbGllciAgIAlANjcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSg5MjMsIDY5MCkNCi0JCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoOTIzLCA0NzApKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREF0dHJpYnV0ZSIgQDExMg0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgU3VwcHJlc3NPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBJbmNsdWRlQXR0cmlidXRlIAlUUlVFDQotCQkgICAgSW5jbHVkZU9wZXJhdGlvbiAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxODg4LCA3NTIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTEyDQotCQkJbG9jYXRpb24gICAJKDE2MTIsIDY1NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICB3aWR0aCAgICAgIAk1NzANCi0JCSAgICBoZWlnaHQgICAgIAkyMTQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQXNzb2NpYXRpb25WaWV3TmV3ICIkVU5OQU1FRCQ4IiBAMTEzDQotCQkgICAgbG9jYXRpb24gICAJKDI3NzUsIDE2MjgpDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk3MkQwMkNCIg0KLQkJICAgIHJvbGV2aWV3X2xpc3QgCShsaXN0IFJvbGVWaWV3cw0KLQkJCShvYmplY3QgUm9sZVZpZXcgImF0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiIEAxMTQNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1OTEsIC01NjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE1DQotCQkJCVBhcmVudF9WaWV3IAlAMTE0DQotCQkJCWxvY2F0aW9uICAgCSgyNDIyLCA4MDgpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk0NjgNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZU5hbWVSZWZlcmVuY2UiDQotCQkJCXBjdERpc3QgICAgCTAuODI5NjMwDQotCQkJCWhlaWdodCAgICAgCTM5DQotCQkJCW9yaWVudGF0aW9uIAkwKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM4NTI5NzM2MDI5MSINCi0JCQkgICAgY2xpZW50ICAgICAJQDExMw0KLQkJCSAgICBzdXBwbGllciAgIAlAMTEyDQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjc3NSwgMTYyOCkNCi0JCQkJKDI3NzUsIDc2OCkNCi0JCQkJKDIxNzMsIDc2OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzc1LCAxNjI4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMjE3MywgNzY4KQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMTYNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMTQNCi0JCQkJbG9jYXRpb24gICAJKDIyMjIsIDg3MSkNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTINCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTE1DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIjAuLioiDQotCQkJCXBjdERpc3QgICAgCTAuOTY2NjQ5DQotCQkJCWhlaWdodCAgICAgCTEwMg0KLQkJCQlvcmllbnRhdGlvbiAJMCkpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlTmFtZVJlZmVyZW5jZWRFbnRpdHkiIEAxMTcNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMTMNCi0JCQkgICAgbG9jYXRpb24gICAJKDE1OTEsIC01NjQpDQotCQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQlzaXplICAgICAgIAkxMA0KLQkJCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJCWNvbG9yICAgICAgCTANCi0JCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE4DQotCQkJCVBhcmVudF9WaWV3IAlAMTE3DQotCQkJCWxvY2F0aW9uICAgCSgyMDc2LCAyMDkwKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMQ0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJNTg4DQotCQkJCWp1c3RpZnkgICAgCTANCi0JCQkJbGFiZWwgICAgICAJIithdHRyaWJ1dGVOYW1lUmVmZXJlbmNlZEVudGl0eSINCi0JCQkJcGN0RGlzdCAgICAJMC43NzE0NjkNCi0JCQkJaGVpZ2h0ICAgICAJMzUNCi0JCQkJb3JpZW50YXRpb24gCTApDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzg1Mjk3MzYwMjlCIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTEzDQotCQkJICAgIHN1cHBsaWVyICAgCUA4OA0KLQkJCSAgICB2ZXJ0aWNlcyAgIAkobGlzdCBQb2ludHMNCi0JCQkJKDI3NzUsIDE2MjgpDQotCQkJCSgyNzc1LCAyMDU1KQ0KLQkJCQkoMTc0MSwgMjA1NSkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyNzc1LCAxNjI4KQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTc0MSwgMjA1NSkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTE5DQotCQkJCVBhcmVudF9WaWV3IAlAMTE3DQotCQkJCWxvY2F0aW9uICAgCSgxODEzLCAyMDE4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45NTE0NDINCi0JCQkJaGVpZ2h0ICAgICAJMzgNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTEiIEAxMjANCi0JCSAgICBsb2NhdGlvbiAgIAkoMjk0NSwgMTg5MSkNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzOEJENDkwODAxM0QiDQotCQkgICAgcm9sZXZpZXdfbGlzdCAJKGxpc3QgUm9sZVZpZXdzDQotCQkJKG9iamVjdCBSb2xlVmlldyAiYXR0cmlidXRlVHlwZVJlZmVyZW5jZSIgQDEyMQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4OSwgLTY3NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjINCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjENCi0JCQkJbG9jYXRpb24gICAJKDI0MzUsIDY1NikNCi0JCQkJZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCQkgICAgYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCQkgICAgc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJCWFuY2hvciAgICAgCTENCi0JCQkJYW5jaG9yX2xvYyAJMQ0KLQkJCQlubGluZXMgICAgIAkxDQotCQkJCW1heF93aWR0aCAgCTQ0NA0KLQkJCQlqdXN0aWZ5ICAgIAkwDQotCQkJCWxhYmVsICAgICAgCSIrYXR0cmlidXRlVHlwZVJlZmVyZW5jZSINCi0JCQkJcGN0RGlzdCAgICAJMC44NjYwMjYNCi0JCQkJaGVpZ2h0ICAgICAJNTQNCi0JCQkJb3JpZW50YXRpb24gCTEpDQotCQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCSAgICBxdWlkdSAgICAgIAkiMzhCRDQ5MTQwMTMwIg0KLQkJCSAgICBjbGllbnQgICAgIAlAMTIwDQotCQkJICAgIHN1cHBsaWVyICAgCUAxMTINCi0JCQkgICAgdmVydGljZXMgICAJKGxpc3QgUG9pbnRzDQotCQkJCSgyOTQ1LCAxODkxKQ0KLQkJCQkoMjk0NSwgNzA4KQ0KLQkJCQkoMjE3MywgNzA4KSkNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDI5NDUsIDE4OTEpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgyMTczLCA3MDgpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEyMw0KLQkJCQlQYXJlbnRfVmlldyAJQDEyMQ0KLQkJCQlsb2NhdGlvbiAgIAkoMjM0NSwgNjAzKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC45MTI1MzgNCi0JCQkJaGVpZ2h0ICAgICAJMTA3DQotCQkJCW9yaWVudGF0aW9uIAkxKSkNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICJhdHRyaWJ1dGVUeXBlUmVmZXJlbmNlZEVudGl0eSIgQDEyNA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyMA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoMTQ4OSwgLTY3NikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IFNlZ0xhYmVsIEAxMjUNCi0JCQkJUGFyZW50X1ZpZXcgCUAxMjQNCi0JCQkJbG9jYXRpb24gICAJKDE2NzksIDIyOTkpDQotCQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkJICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCQlhbmNob3IgICAgIAkxDQotCQkJCWFuY2hvcl9sb2MgCTENCi0JCQkJbmxpbmVzICAgICAJMQ0KLQkJCQltYXhfd2lkdGggIAk1NzYNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiK2F0dHJpYnV0ZVR5cGVSZWZlcmVuY2VkRW50aXR5Ig0KLQkJCQlwY3REaXN0ICAgIAkwLjgyODYwMQ0KLQkJCQloZWlnaHQgICAgIAk1Ng0KLQkJCQlvcmllbnRhdGlvbiAJMCkNCi0JCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJICAgIHF1aWR1ICAgICAgCSIzOEJENDkxNDAxNEUiDQotCQkJICAgIGNsaWVudCAgICAgCUAxMjANCi0JCQkgICAgc3VwcGxpZXIgICAJQDg4DQotCQkJICAgIHZlcnRpY2VzICAgCShsaXN0IFBvaW50cw0KLQkJCQkoMjk0NSwgMTg5MSkNCi0JCQkJKDI5NDUsIDIyNDMpDQotCQkJCSgxNDM4LCAyMjQzKQ0KLQkJCQkoMTQzOCwgMjE0OCkpDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgyOTQ1LCAxODkxKQ0KLQkJCSAgICB0ZXJtaW5hbF9hdHRhY2htZW50IAkoMTQzOCwgMjE0OCkNCi0JCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBTZWdMYWJlbCBAMTI2DQotCQkJCVBhcmVudF9WaWV3IAlAMTI0DQotCQkJCWxvY2F0aW9uICAgCSgxMzY1LCAyMTc4KQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uMSINCi0JCQkJcGN0RGlzdCAgICAJMC45ODQ3NzQNCi0JCQkJaGVpZ2h0ICAgICAJNzQNCi0JCQkJb3JpZW50YXRpb24gCTApKSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxMjcNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YxNTkwMURBIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMTINCi0JCSAgICBzdXBwbGllciAgIAlANjYNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxOTUwLCA2NDUpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDE5NTAsIDQ4NikpDQotCQkob2JqZWN0IEFzc29jaWF0aW9uVmlld05ldyAiJFVOTkFNRUQkMTIiIEAxMjgNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTM0NiwgNzUyKQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQTk1MDBDQyINCi0JCSAgICByb2xldmlld19saXN0IAkobGlzdCBSb2xlVmlld3MNCi0JCQkob2JqZWN0IFJvbGVWaWV3ICIkVU5OQU1FRCQxMyIgQDEyOQ0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDEyOA0KLQkJCSAgICBsb2NhdGlvbiAgIAkoLTU0MiwgLTE2KQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQTk1MDMxMSINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyOA0KLQkJCSAgICBzdXBwbGllciAgIAlAOTYNCi0JCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDEzNDYsIDc1MikNCi0JCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEwODksIDc1MikpDQotCQkJKG9iamVjdCBSb2xlVmlldyAiJFVOTkFNRUQkMTQiIEAxMzANCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAxMjgNCi0JCQkgICAgbG9jYXRpb24gICAJKC01NDIsIC0xNikNCi0JCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJCXNpemUgICAgICAgCTEwDQotCQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQkJY29sb3IgICAgICAJMA0KLQkJCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCQkgICAgcXVpZHUgICAgICAJIjM5RkUyQTk1MDMxQiINCi0JCQkgICAgY2xpZW50ICAgICAJQDEyOA0KLQkJCSAgICBzdXBwbGllciAgIAlAMTEyDQotCQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMzQ2LCA3NTIpDQotCQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxNjAzLCA3NTIpDQotCQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgU2VnTGFiZWwgQDEzMQ0KLQkJCQlQYXJlbnRfVmlldyAJQDEzMA0KLQkJCQlsb2NhdGlvbiAgIAkoMTU0NCwgNzkxKQ0KLQkJCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkJICAgIHNpemUgICAgICAgCTEwDQotCQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCQkgICAgaXRhbGljcyAgICAJRkFMU0UNCi0JCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCQkgICAgY29sb3IgICAgICAJMA0KLQkJCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQkJYW5jaG9yICAgICAJMg0KLQkJCQlhbmNob3JfbG9jIAkxDQotCQkJCW5saW5lcyAgICAgCTENCi0JCQkJbWF4X3dpZHRoICAJMTUNCi0JCQkJanVzdGlmeSAgICAJMA0KLQkJCQlsYWJlbCAgICAgIAkiMC4uKiINCi0JCQkJcGN0RGlzdCAgICAJMC43NzMzOTANCi0JCQkJaGVpZ2h0ICAgICAJMzkNCi0JCQkJb3JpZW50YXRpb24gCTEpKSkpKSkNCi0JKG9iamVjdCBDbGFzc0RpYWdyYW0gIkF0dHJpYnV0ZURlZmluaXRpb24iDQotCSAgICBxdWlkICAgICAgIAkiMzdFMTQ0NTcwMjU3Ig0KLQkgICAgdGl0bGUgICAgICAJIkF0dHJpYnV0ZURlZmluaXRpb24iDQotCSAgICB6b29tICAgICAgIAkxMDANCi0JICAgIG1heF9oZWlnaHQgCTI4MzUwDQotCSAgICBtYXhfd2lkdGggIAkyMTYwMA0KLQkgICAgb3JpZ2luX3ggICAJMA0KLQkgICAgb3JpZ2luX3kgICAJMA0KLQkgICAgaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERBdHRyaWJ1dGUiIEAxMzINCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDUxMiwgNjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzMg0KLQkJCWxvY2F0aW9uICAgCSgyMzYsIDUzOSkNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTENCi0JCQltYXhfd2lkdGggIAk1NTINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkRUREF0dHJpYnV0ZSIpDQotCQkgICAgaWNvbl9zdHlsZSAJIkljb24iDQotCQkgICAgbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJICAgIGZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkgICAgcXVpZHUgICAgICAJIjM3Q0MxODc5MDBFQSINCi0JCSAgICB3aWR0aCAgICAgIAk1NzANCi0JCSAgICBoZWlnaHQgICAgIAkyNTgNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgQ2xhc3NWaWV3ICJDbGFzcyIgIkxvZ2ljYWwgVmlldzo6ZHRkOjpEVERCYXNpY1R5cGUiIEAxMzMNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIEluY2x1ZGVBdHRyaWJ1dGUgCVRSVUUNCi0JCSAgICBJbmNsdWRlT3BlcmF0aW9uIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDEyNjQsIDY1NikNCi0JCSAgICBmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQlzaXplICAgICAgIAkxMA0KLQkJCWZhY2UgICAgICAgCSJBcmlhbCINCi0JCQlib2xkICAgICAgIAlGQUxTRQ0KLQkJCWl0YWxpY3MgICAgCUZBTFNFDQotCQkJdW5kZXJsaW5lICAJRkFMU0UNCi0JCQlzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCWNvbG9yICAgICAgCTANCi0JCQlkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQkJICAgIGxhYmVsICAgICAgCShvYmplY3QgSXRlbUxhYmVsDQotCQkJUGFyZW50X1ZpZXcgCUAxMzMNCi0JCQlsb2NhdGlvbiAgIAkoMTAxNywgNTg0KQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJbmxpbmVzICAgICAJMQ0KLQkJCW1heF93aWR0aCAgCTQ5NA0KLQkJCWp1c3RpZnkgICAgCTANCi0JCQlsYWJlbCAgICAgIAkiRFREQmFzaWNUeXBlIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCSAgICBxdWlkdSAgICAgIAkiMzdFMTQ2NEYwMERBIg0KLQkJICAgIHdpZHRoICAgICAgCTUxMg0KLQkJICAgIGhlaWdodCAgICAgCTE2OA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjpkdGQ6OkRUREVudW1lcmF0aW9uVHlwZSIgQDEzNA0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgSW5jbHVkZUF0dHJpYnV0ZSAJVFJVRQ0KLQkJICAgIEluY2x1ZGVPcGVyYXRpb24gCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTkwNCwgNjU2KQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzNA0KLQkJCWxvY2F0aW9uICAgCSgxNjQ2LCA1ODQpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkxDQotCQkJbWF4X3dpZHRoICAJNTE2DQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJEVERFbnVtZXJhdGlvblR5cGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTMzNDI0ODkNCi0JCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJICAgIHF1aWR1ICAgICAgCSIzN0UxNDY2ODAzMDYiDQotCQkgICAgd2lkdGggICAgICAJNTM0DQotCQkgICAgaGVpZ2h0ICAgICAJMTY4DQotCQkgICAgYW5ub3RhdGlvbiAJOA0KLQkJICAgIGF1dG9SZXNpemUgCVRSVUUpDQotCQkob2JqZWN0IE5vdGVWaWV3IEAxMzUNCi0JCSAgICBsb2NhdGlvbiAgIAkoOTEyLCAxMTIwKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzNQ0KLQkJCWxvY2F0aW9uICAgCSg0OTIsIDkyNikNCi0JCQlubGluZXMgICAgIAk5DQotCQkJbWF4X3dpZHRoICAJODA1DQotCQkJbGFiZWwgICAgICAJDQotfEEgRFREIGF0dHJpYnV0ZSdzIHR5cGUgYW5kIGluaXRpYWwNCi18dmFsdWUgYXJlIHJlcHJlc2VudGVkIHVzaW5nIHRoZSBlVHlwZSBhbmQgZGVmYXVsdCB2YWx1ZSBzdG9yZWQgaW4gZUF0dHJpYnV0ZS4gVGhlIGVUeXBlIHdpbGwgYWx3YXlzIGJlIGVpdGhlciBEVERCYXNpY1R5cGUgKHN1YmNsYXNzIG9mIGVDbGFzcykgb3IgRFRERW51bWVyYXRpb25UeXBlIChzdWJjbGFzcyBvZiBlRW51bSkuDQotCQkJKQ0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MjE1DQotCQkgICAgd2lkdGggICAgICAJODY1DQotCQkgICAgaGVpZ2h0ICAgICAJNDAwKQ0KLQkJKG9iamVjdCBBdHRhY2hWaWV3ICIiIEAxMzYNCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgY2xpZW50ICAgICAJQDEzMg0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzUNCi0JCSAgICBsaW5lX3N0eWxlIAkwKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUNsYXNzIiBAMTM3DQotCQkgICAgU2hvd0NvbXBhcnRtZW50U3RlcmVvdHlwZXMgCVRSVUUNCi0JCSAgICBsb2NhdGlvbiAgIAkoMTI2NCwgMjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDEzNw0KLQkJCWxvY2F0aW9uICAgCSgxMTgzLCAxOTcpDQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlubGluZXMgICAgIAkyDQotCQkJbWF4X3dpZHRoICAJMTYyDQotCQkJanVzdGlmeSAgICAJMA0KLQkJCWxhYmVsICAgICAgCSJFQ2xhc3MiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkwM0Q1QkYwMDBBIg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUVudW0iIEAxMzgNCi0JCSAgICBTaG93Q29tcGFydG1lbnRTdGVyZW90eXBlcyAJVFJVRQ0KLQkJICAgIGxvY2F0aW9uICAgCSgxOTA0LCAyNzIpDQotCQkgICAgZm9udCAgICAgICAJKG9iamVjdCBGb250DQotCQkJc2l6ZSAgICAgICAJMTANCi0JCQlmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJYm9sZCAgICAgICAJRkFMU0UNCi0JCQlpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCXVuZGVybGluZSAgCUZBTFNFDQotCQkJc3RyaWtlICAgICAJRkFMU0UNCi0JCQljb2xvciAgICAgIAkwDQotCQkJZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCSAgICBsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCVBhcmVudF9WaWV3IAlAMTM4DQotCQkJbG9jYXRpb24gICAJKDE4MjMsIDE5NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVFbnVtIikNCi0JCSAgICBpY29uX3N0eWxlIAkiSWNvbiINCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIGZpbGxfY29sb3IgCTE2Nzc3MTc1DQotCQkgICAgcXVpZHUgICAgICAJIjM5QTQ3M0U5MDFENCINCi0JCSAgICBoZWlnaHQgICAgIAkxNzQNCi0JCSAgICBhbm5vdGF0aW9uIAk4DQotCQkgICAgYXV0b1Jlc2l6ZSAJVFJVRSkNCi0JCShvYmplY3QgSW5oZXJpdFZpZXcgIiIgQDEzOQ0KLQkJICAgIHN0ZXJlb3R5cGUgCVRSVUUNCi0JCSAgICBsaW5lX2NvbG9yIAkxMjYxNTY4MA0KLQkJICAgIHF1aWR1ICAgICAgCSIzOUI3RjI4MDAzMTUiDQotCQkgICAgY2xpZW50ICAgICAJQDEzMw0KLQkJICAgIHN1cHBsaWVyICAgCUAxMzcNCi0JCSAgICBsaW5lX3N0eWxlIAkzDQotCQkgICAgb3JpZ2luX2F0dGFjaG1lbnQgCSgxMjYwLCA1NzIpDQotCQkgICAgdGVybWluYWxfYXR0YWNobWVudCAJKDEyNjAsIDM1OSkpDQotCQkob2JqZWN0IEluaGVyaXRWaWV3ICIiIEAxNDANCi0JCSAgICBzdGVyZW90eXBlIAlUUlVFDQotCQkgICAgbGluZV9jb2xvciAJMTI2MTU2ODANCi0JCSAgICBxdWlkdSAgICAgIAkiMzlCN0YyODEwMzAyIg0KLQkJICAgIGNsaWVudCAgICAgCUAxMzQNCi0JCSAgICBzdXBwbGllciAgIAlAMTM4DQotCQkgICAgbGluZV9zdHlsZSAJMw0KLQkJICAgIG9yaWdpbl9hdHRhY2htZW50IAkoMTkwMywgNTcyKQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSgxOTAzLCAzNTkpKQ0KLQkJKG9iamVjdCBDbGFzc1ZpZXcgIkNsYXNzIiAiTG9naWNhbCBWaWV3OjplY29yZTo6RUF0dHJpYnV0ZSIgQDE0MQ0KLQkJICAgIFNob3dDb21wYXJ0bWVudFN0ZXJlb3R5cGVzIAlUUlVFDQotCQkgICAgbG9jYXRpb24gICAJKDUyOCwgMjcyKQ0KLQkJICAgIGZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCXNpemUgICAgICAgCTEwDQotCQkJZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCWJvbGQgICAgICAgCUZBTFNFDQotCQkJaXRhbGljcyAgICAJRkFMU0UNCi0JCQl1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCXN0cmlrZSAgICAgCUZBTFNFDQotCQkJY29sb3IgICAgICAJMA0KLQkJCWRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkgICAgbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQlQYXJlbnRfVmlldyAJQDE0MQ0KLQkJCWxvY2F0aW9uICAgCSg0NDcsIDE5NykNCi0JCQlmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCW5saW5lcyAgICAgCTINCi0JCQltYXhfd2lkdGggIAkxNjINCi0JCQlqdXN0aWZ5ICAgIAkwDQotCQkJbGFiZWwgICAgICAJIkVBdHRyaWJ1dGUiKQ0KLQkJICAgIGljb25fc3R5bGUgCSJJY29uIg0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgZmlsbF9jb2xvciAJMTY3NzcxNzUNCi0JCSAgICBxdWlkdSAgICAgIAkiMzkyMzg0NzIwMzlEIg0KLQkJICAgIGhlaWdodCAgICAgCTE3NA0KLQkJICAgIGFubm90YXRpb24gCTgNCi0JCSAgICBhdXRvUmVzaXplIAlUUlVFKQ0KLQkJKG9iamVjdCBJbmhlcml0VmlldyAiIiBAMTQyDQotCQkgICAgc3RlcmVvdHlwZSAJVFJVRQ0KLQkJICAgIGxpbmVfY29sb3IgCTEyNjE1NjgwDQotCQkgICAgcXVpZHUgICAgICAJIjM5QjdGMTU5MDFEQSINCi0JCSAgICBjbGllbnQgICAgIAlAMTMyDQotCQkgICAgc3VwcGxpZXIgICAJQDE0MQ0KLQkJICAgIGxpbmVfc3R5bGUgCTMNCi0JCSAgICBvcmlnaW5fYXR0YWNobWVudCAJKDUyMCwgNTI3KQ0KLQkJICAgIHRlcm1pbmFsX2F0dGFjaG1lbnQgCSg1MjAsIDM1OSkpKSkpKQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2VtZm1vZGVsL3Jvc2UvZHRkbW9kZWwubWRsIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9kdGRtb2RlbC5tZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNTYyN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvZW1mbW9kZWwvcm9zZS9kdGRtb2RlbC5tZGwKKysrIC9kZXYvbnVsbApAQCAtMSw3NTI2ICswLDAgQEAKLQ0KLShvYmplY3QgUGV0YWwNCi0gICAgdmVyc2lvbiAgICAJNDUNCi0gICAgX3dyaXR0ZW4gICAJIlJvc2UgNy41LjAxMDMuMTkyMCINCi0gICAgY2hhclNldCAgICAJMCkNCi0NCi0ob2JqZWN0IERlc2lnbiAiTG9naWNhbCBWaWV3Ig0KLSAgICBpc191bml0ICAgIAlUUlVFDQotICAgIGlzX2xvYWRlZCAgCVRSVUUNCi0gICAgYXR0cmlidXRlcyAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkob2JqZWN0IEF0dHJpYnV0ZQ0KLQkgICAgdG9vbCAgICAgICAJIkphdmEiDQotCSAgICBuYW1lICAgICAgIAkiSURFIg0KLQkgICAgdmFsdWUgICAgICAJIkludGVybmFsIEVkaXRvciIpKQ0KLSAgICBxdWlkICAgICAgIAkiM0UzNkJFQjYwMTMzIg0KLSAgICBkZWZhdWx0cyAgIAkob2JqZWN0IGRlZmF1bHRzDQotCXJpZ2h0TWFyZ2luIAkwLjI1MDAwMA0KLQlsZWZ0TWFyZ2luIAkwLjI1MDAwMA0KLQl0b3BNYXJnaW4gIAkwLjI1MDAwMA0KLQlib3R0b21NYXJnaW4gCTAuNTAwMDAwDQotCXBhZ2VPdmVybGFwIAkwLjI1MDAwMA0KLQljbGlwSWNvbkxhYmVscyAJVFJVRQ0KLQlhdXRvUmVzaXplIAlUUlVFDQotCXNuYXBUb0dyaWQgCVRSVUUNCi0JZ3JpZFggICAgICAJMTYNCi0JZ3JpZFkgICAgICAJMTYNCi0JZGVmYXVsdEZvbnQgCShvYmplY3QgRm9udA0KLQkgICAgc2l6ZSAgICAgICAJMTANCi0JICAgIGZhY2UgICAgICAgCSJBcmlhbCINCi0JICAgIGJvbGQgICAgICAgCUZBTFNFDQotCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkgICAgdW5kZXJsaW5lICAJRkFMU0UNCi0JICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCSAgICBjb2xvciAgICAgIAkwDQotCSAgICBkZWZhdWx0X2NvbG9yIAlUUlVFKQ0KLQlzaG93TWVzc2FnZU51bSAJMQ0KLQlzaG93Q2xhc3NPZk9iamVjdCAJVFJVRQ0KLQlub3RhdGlvbiAgIAkiVW5pZmllZCIpDQotICAgIHJvb3RfdXNlY2FzZV9wYWNrYWdlIAkob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJVc2UgQ2FzZSBWaWV3Ig0KLQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMUY3Ig0KLQlleHBvcnRDb250cm9sIAkiUHVibGljIg0KLQlnbG9iYWwgICAgIAlUUlVFDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0KQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgVXNlQ2FzZURpYWdyYW0gIk1haW4iDQotCQlxdWlkICAgICAgIAkiM0EwQzc1RjQwMjBCIg0KLQkJdGl0bGUgICAgICAJIk1haW4iDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHJvb3RfY2F0ZWdvcnkgCShvYmplY3QgQ2xhc3NfQ2F0ZWdvcnkgIkxvZ2ljYWwgVmlldyINCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGNiINCi0JZXhwb3J0Q29udHJvbCAJIlB1YmxpYyINCi0JZ2xvYmFsICAgICAJVFJVRQ0KLQlzdWJzeXN0ZW0gIAkiQ29tcG9uZW50IFZpZXciDQotCXF1aWR1ICAgICAgCSIzQTBDNzVGNDAxRjgiDQotCWxvZ2ljYWxfbW9kZWxzIAkobGlzdCB1bml0X3JlZmVyZW5jZV9saXN0DQotCSAgICAob2JqZWN0IENsYXNzX0NhdGVnb3J5ICJlY29yZSINCi0JCWlzX3VuaXQgICAgCVRSVUUNCi0JCWlzX2xvYWRlZCAgCUZBTFNFDQotCQlmaWxlX25hbWUgIAkiJFZBQkFTRV9QTFVHSU5TX1BBVEhcXG9yZy5lY2xpcHNlLmVtZi5lY29yZVxcc3JjXFxtb2RlbFxcb3JnLmVjbGlwc2UuZW1mLkVDb3JlLmNhdCINCi0JCXF1aWQgICAgICAgCSIzOUE1RUQwNDAwNEUiKQ0KLQkgICAgKG9iamVjdCBDbGFzc19DYXRlZ29yeSAiZHRkIg0KLQkJaXNfdW5pdCAgICAJVFJVRQ0KLQkJaXNfbG9hZGVkICAJRkFMU0UNCi0JCWZpbGVfbmFtZSAgCSIkVkFCQVNFX1BMVUdJTlNfUEFUSFxcb3JnLmVjbGlwc2Uud3N0LmR0ZFxcc3JjXFxyb3NlXFxEVEQuY2F0Ig0KLQkJcXVpZCAgICAgICAJIjM4NTdCMUMwMDI5MyIpKQ0KLQlsb2dpY2FsX3ByZXNlbnRhdGlvbnMgCShsaXN0IHVuaXRfcmVmZXJlbmNlX2xpc3QNCi0JICAgIChvYmplY3QgQ2xhc3NEaWFncmFtICJNYWluIg0KLQkJcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGRiINCi0JCXRpdGxlICAgICAgCSJNYWluIg0KLQkJem9vbSAgICAgICAJMTAwDQotCQltYXhfaGVpZ2h0IAkyODM1MA0KLQkJbWF4X3dpZHRoICAJMjE2MDANCi0JCW9yaWdpbl94ICAgCTANCi0JCW9yaWdpbl95ICAgCTANCi0JCWl0ZW1zICAgICAgCShsaXN0IGRpYWdyYW1faXRlbV9saXN0DQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZWNvcmUiIEAxDQotCQkJbG9jYXRpb24gICAJKDk2MCwgMzA0KQ0KLQkJCWZvbnQgICAgICAgCShvYmplY3QgRm9udA0KLQkJCSAgICBzaXplICAgICAgIAkxMA0KLQkJCSAgICBmYWNlICAgICAgIAkiQXJpYWwiDQotCQkJICAgIGJvbGQgICAgICAgCUZBTFNFDQotCQkJICAgIGl0YWxpY3MgICAgCUZBTFNFDQotCQkJICAgIHVuZGVybGluZSAgCUZBTFNFDQotCQkJICAgIHN0cmlrZSAgICAgCUZBTFNFDQotCQkJICAgIGNvbG9yICAgICAgCTANCi0JCQkgICAgZGVmYXVsdF9jb2xvciAJVFJVRSkNCi0JCQlsYWJlbCAgICAgIAkob2JqZWN0IEl0ZW1MYWJlbA0KLQkJCSAgICBQYXJlbnRfVmlldyAJQDENCi0JCQkgICAgbG9jYXRpb24gICAJKDgxNiwgMjIwKQ0KLQkJCSAgICBmaWxsX2NvbG9yIAkxMzQzNDg3OQ0KLQkJCSAgICBubGluZXMgICAgIAkyDQotCQkJICAgIG1heF93aWR0aCAgCTI4OA0KLQkJCSAgICBqdXN0aWZ5ICAgIAkwDQotCQkJICAgIGxhYmVsICAgICAgCSJlY29yZSIpDQotCQkJaWNvbl9zdHlsZSAJIkljb24iDQotCQkJbGluZV9jb2xvciAJMzM0MjQ4OQ0KLQkJCWZpbGxfY29sb3IgCTEzNDM0ODc5DQotCQkJcXVpZHUgICAgICAJIjM5QTVFRDA0MDA0RSINCi0JCQl3aWR0aCAgICAgIAkzMDANCi0JCQloZWlnaHQgICAgIAkxODApDQotCQkgICAgKG9iamVjdCBDYXRlZ29yeVZpZXcgIkxvZ2ljYWwgVmlldzo6ZHRkIiBAMg0KLQkJCWxvY2F0aW9uICAgCSgzNjgsIDI1NikNCi0JCQlmb250ICAgICAgIAkob2JqZWN0IEZvbnQNCi0JCQkgICAgc2l6ZSAgICAgICAJMTANCi0JCQkgICAgZmFjZSAgICAgICAJIkFyaWFsIg0KLQkJCSAgICBib2xkICAgICAgIAlGQUxTRQ0KLQkJCSAgICBpdGFsaWNzICAgIAlGQUxTRQ0KLQkJCSAgICB1bmRlcmxpbmUgIAlGQUxTRQ0KLQkJCSAgICBzdHJpa2UgICAgIAlGQUxTRQ0KLQkJCSAgICBjb2xvciAgICAgIAkwDQotCQkJICAgIGRlZmF1bHRfY29sb3IgCVRSVUUpDQotCQkJbGFiZWwgICAgICAJKG9iamVjdCBJdGVtTGFiZWwNCi0JCQkgICAgUGFyZW50X1ZpZXcgCUAyDQotCQkJICAgIGxvY2F0aW9uICAgCSgyMjQsIDE3MikNCi0JCQkgICAgZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQkgICAgbmxpbmVzICAgICAJMg0KLQkJCSAgICBtYXhfd2lkdGggIAkyODgNCi0JCQkgICAganVzdGlmeSAgICAJMA0KLQkJCSAgICBsYWJlbCAgICAgIAkiZHRkIikNCi0JCQlpY29uX3N0eWxlIAkiSWNvbiINCi0JCQlsaW5lX2NvbG9yIAkzMzQyNDg5DQotCQkJZmlsbF9jb2xvciAJMTM0MzQ4NzkNCi0JCQlxdWlkdSAgICAgIAkiMzg1N0IxQzAwMjkzIg0KLQkJCXdpZHRoICAgICAgCTMwMA0KLQkJCWhlaWdodCAgICAgCTE4MCkpKSkpDQotICAgIHJvb3Rfc3Vic3lzdGVtIAkob2JqZWN0IFN1YlN5c3RlbSAiQ29tcG9uZW50IFZpZXciDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRjgiDQotCXBoeXNpY2FsX21vZGVscyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdCkNCi0JcGh5c2ljYWxfcHJlc2VudGF0aW9ucyAJKGxpc3QgdW5pdF9yZWZlcmVuY2VfbGlzdA0KLQkgICAgKG9iamVjdCBNb2R1bGVfRGlhZ3JhbSAiTWFpbiINCi0JCXF1aWQgICAgICAgCSIzQTBDNzVGNDAyMEEiDQotCQl0aXRsZSAgICAgIAkiTWFpbiINCi0JCXpvb20gICAgICAgCTEwMA0KLQkJbWF4X2hlaWdodCAJMjgzNTANCi0JCW1heF93aWR0aCAgCTIxNjAwDQotCQlvcmlnaW5feCAgIAkwDQotCQlvcmlnaW5feSAgIAkwDQotCQlpdGVtcyAgICAgIAkobGlzdCBkaWFncmFtX2l0ZW1fbGlzdCkpKSkNCi0gICAgcHJvY2Vzc19zdHJ1Y3R1cmUgCShvYmplY3QgUHJvY2Vzc2VzDQotCXF1aWQgICAgICAgCSIzQTBDNzVGNDAxRjkiDQotCVByb2NzTkRldnMgCShsaXN0DQotCSAgICAob2JqZWN0IFByb2Nlc3NfRGlhZ3JhbSAiRGVwbG95bWVudCBWaWV3Ig0KLQkJcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGQiINCi0JCXRpdGxlICAgICAgCSJEZXBsb3ltZW50IFZpZXciDQotCQl6b29tICAgICAgIAkxMDANCi0JCW1heF9oZWlnaHQgCTI4MzUwDQotCQltYXhfd2lkdGggIAkyMTYwMA0KLQkJb3JpZ2luX3ggICAJMA0KLQkJb3JpZ2luX3kgICAJMA0KLQkJaXRlbXMgICAgICAJKGxpc3QgZGlhZ3JhbV9pdGVtX2xpc3QpKSkpDQotICAgIHByb3BlcnRpZXMgCShvYmplY3QgUHJvcGVydGllcw0KLQlhdHRyaWJ1dGVzIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFCYXNlIg0KLQkJCXZhbHVlICAgICAgCSgiRGF0YUJhc2VTZXQiIDgwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRERMIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhQmFzZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJBTlNJIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJPcmFjbGUiDQotCQkJCXZhbHVlICAgICAgCTgwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQkJbmFtZSAgICAgICAJIlNRTFNlcnZlciINCi0JCQkJdmFsdWUgICAgICAJODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiRERMIg0KLQkJCQluYW1lICAgICAgIAkiU3liYXNlIg0KLQkJCQl2YWx1ZSAgICAgIAk4MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJCW5hbWUgICAgICAgCSJXYXRjb20iDQotCQkJCXZhbHVlICAgICAgCTgwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIklkIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlDb2x1bW5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSJOVU1CRVIoNSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiVmlld05hbWUiDQotCQkJdmFsdWUgICAgICAJIlZfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVF8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdFN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiX1YiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiRHJvcENsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkJhc2VWaWV3cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkRETFNjcmlwdEZpbGVuYW1lIg0KLQkJCXZhbHVlICAgICAgCSJEREwxLlNRTCIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRERMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIlZBUkNIQVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNPSyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRETCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIlVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEREwiDQotCQkJbmFtZSAgICAgICAJIkNoZWNrQ29uc3RyYWludCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByZXNlcnZlUmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0U3BlY2lmaWVyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMRWxlbWVudCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSURMU3BlY2lmaWNhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJJRExTcGVjU2V0IiAyMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJRExTcGVjU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkludGVyZmFjZSINCi0JCQkJdmFsdWUgICAgICAJMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJUeXBlZGVmIg0KLQkJCQl2YWx1ZSAgICAgIAk1NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTcxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSURMIg0KLQkJCQluYW1lICAgICAgIAkiRXhjZXB0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk2MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIklETCINCi0JCQkJbmFtZSAgICAgICAJIlN0cnVjdCINCi0JCQkJdmFsdWUgICAgICAJNTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJVbmlvbiINCi0JCQkJdmFsdWUgICAgICAJODEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJRExNb2R1bGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlQnlTaW1wbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIklETCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc09uZVdheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNvbnRleHQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJSYWlzZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSURMIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiQ29uc3RWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSGFzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSXNSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkJvdW5kZWRIYXNSZWxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiSGFzUmVsVHlwZVNldCIgNDcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyRzdXBwbGllciIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSURMIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkUm9sZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJBc3NvY1R5cGVTZXQiIDQ3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJCW5hbWUgICAgICAgCSJTZXF1ZW5jZSINCi0JCQkJdmFsdWUgICAgICAJNDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJJREwiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRm9yd2FyZFJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fU3Vic3lzdGVtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIklETCINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJJREwiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJTQ0MiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlZ2VuIE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImVDb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1RyYW5zaWVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNDaGFuZ2VhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJlQ29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiZUNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiU3luY2hyb25pemUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiUm9vdFBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIkMrKyBSZXZlcnNlIEVuZ2luZWVyZWQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbEhlYWRlckluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxCb2R5SW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQkJbmFtZSAgICAgICAJIklubGluZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJTeW5jaHJvbml6ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJTb3VyY2VGaWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQm9keVNvdXJjZUZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NhdGVnb3J5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNwbHVzcGx1cyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ3BsdXNwbHVzIg0KLQkJCW5hbWUgICAgICAgCSJJc05hbWVzcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDcGx1c3BsdXMiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBTlNJIEMrKyBFdmVudCBXYXRjaGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQU5TSUNvbnZlcnQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgzODMyNjIwMCIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNwZWNGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIxLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkYSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkfiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkJvZHlGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSIyLmFkIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUJvZGllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc29yT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0YW5kYXJkT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29kZUJvZHkiDQotCQkJdmFsdWUgICAgICAJIltzdGF0ZW1lbnRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW1wbGljaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29tbWVudFdpZHRoIg0KLQkJCXZhbHVlICAgICAgCTYwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVXNlRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiJFJPU0VBREE4M19TT1VSQ0UiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0FjY2VzcyINCi0JCQl2YWx1ZSAgICAgIAkoIkltcGxlbWVudGF0aW9uU2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzU3VidHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUG9seW1vcnBoaWNVbml0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJIYW5kbGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVBY2Nlc3MiDQotCQkJdmFsdWUgICAgICAJKCJJbXBsZW1lbnRhdGlvblNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEaXNjcmltaW5hbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkVudW1lcmF0aW9uTGl0ZXJhbFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiQV8iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNsYXNzUGFyYW1ldGVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3RvcktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJDb25zdHJ1Y3RvcktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yS2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnN0cnVjdG9yS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc0VxdWFsaXR5T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJIYW5kbGVFcXVhbGl0eU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRXF1YWxpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzVGFzayINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJMaW1pdGVkUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cnVjdG9yS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmljRm9ybWFsUGFyYW1ldGVycyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxXaXRocyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhODMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXJhbWV0ZXJNb2RlIg0KLQkJCXZhbHVlICAgICAgCSgiUGFyYW1ldGVyTW9kZVNldCIgMjAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMjI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb25SZXR1cm4iDQotCQkJCXZhbHVlICAgICAgCTIwNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7c3VwcGxpZXJ9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke3JlbGF0aW9uc2hpcH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVHZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0YW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbml0aWFsVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlZhcmlhbnQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdlbmVyaWMiDQotCQkJdmFsdWUgICAgICAJIkxpc3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJEZWNsYXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7YXR0cmlidXRlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiVmFyaWFudCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0Fzc29jaWF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7YXNzb2NpYXRpb259IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkFzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIklubGluZUFzc29jaWF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlzc29jaWF0ZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkRpc3NvY2lhdGUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEaXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmVLaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiUHJvY2VkdXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRnVuY3Rpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3RhcmdldENsYXNzfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIlNldF8ke3RhcmdldH0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhODMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTgzIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1N1YnN5c3RlbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE4MyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODM4MzI2MjAwIikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3BlY0ZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjEuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWRhIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVCYWNrdXBFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWR+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQm9keUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJIjIuYWQjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlVzZUNvbG9uTm90YXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVCb2RpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3Nvck9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdGFuZGFyZE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdENvZGVCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSJbc3RhdGVtZW50XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbW1lbnRXaWR0aCINCi0JCQl2YWx1ZSAgICAgIAk2MCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVycm9yTGltaXQiDQotCQkJdmFsdWUgICAgICAJMzApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlVzZUZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQURBOTVfU09VUkNFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJPYmplY3QiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVWaXNpYmlsaXR5U2V0IiA0MykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlR5cGVJbXBsZW1lbnRhdGlvblNldCIgMjA4KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2wiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlQ29udHJvbFNldCIgMjI1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUNvbnRyb2xOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJDb250cm9sbGVkXyR7dHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlRGVmaW5pdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiUmVjb3JkSW1wbGVtZW50YXRpb25TZXQiIDIwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEtpbmRQYWNrYWdlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtjbGFzc31fUmVjb3JkX0tpbmRzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNMaW1pdGVkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnR5cGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlQWNjZXNzVHlwZVNldCIgMjMwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkhhbmRsZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFjY2Vzc1R5cGVWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVHlwZVZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzVHlwZURlZmluaXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NDbGFzc1dpZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiTWF5YmVBbGlhc2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJQYXJhbWV0ZXJpemVkSW1wbGVtZW50YXRpb25TZXQiIDExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUGFyZW50Q2xhc3NOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTdXBlcmNsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRW51bWVyYXRpb25MaXRlcmFsUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJBXyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSJUaGVfIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlPZlR5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBcnJheV9PZl8ke3R5cGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQWNjZXNzQXJyYXlPZlR5cGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSJBY2Nlc3NfQXJyYXlfT2ZfJHt0eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5T2ZBY2Nlc3NUeXBlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXJyYXlfT2ZfJHthY2Nlc3NfdHlwZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBY2Nlc3NBcnJheU9mQWNjZXNzVHlwZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFjY2Vzc19BcnJheV9PZl8ke2FjY2Vzc190eXBlfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkFycmF5SW5kZXhEZWZpbml0aW9uIg0KLQkJCXZhbHVlICAgICAgCSJQb3NpdGl2ZSByYW5nZSA8PiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzb3JPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhbmRhcmRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiVGhpcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUtpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRDb25zdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkNyZWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJKCJTdWJwcm9ncmFtS2luZFNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29weUNvbnN0cnVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQ29weSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3Rvck5hbWUiDQotCQkJdmFsdWUgICAgICAJIkZyZWUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVR5cGVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZUVxdWFsaXR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHtxdW90ZX09JHtxdW90ZX0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVFcXVhbGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVwcmVzZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJUYWdnZWQiDQotCQkJCXZhbHVlICAgICAgCTIwOCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiUmVjb3JkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIk1peGluIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlRhc2siDQotCQkJCXZhbHVlICAgICAgCTIxMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlNpbmdsZVR5cGUiDQotCQkJCXZhbHVlICAgICAgCTIwOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlwbGVUeXBlcyINCi0JCQkJdmFsdWUgICAgICAJMjEzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlcml6ZWRJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJVbmNvbnN0cmFpbmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiVHlwZVZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTdWJwcm9ncmFtS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlR5cGVDb250cm9sU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMjI1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbml0aWFsaXphdGlvbk9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIyNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQXNzaWdubWVudEZpbmFsaXphdGlvbk9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIyNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjgpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWx3YXlzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkF1dG8iDQotCQkJCXZhbHVlICAgICAgCTIzMCkpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1TcGVjIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJpY0Zvcm1hbFBhcmFtZXRlcnMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1ByaXZhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsV2l0aHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc1N1YnVuaXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSgiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVuYW1lcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVPdmVycmlkaW5nIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyTW9kZSINCi0JCQl2YWx1ZSAgICAgIAkoIlBhcmFtZXRlck1vZGVTZXQiIDIwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkltcGxpY2l0UGFyYW1ldGVyQ2xhc3NXaWRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc09wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFbnRyeUNvZGUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJFeGl0Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxDb2RlQm9keSINCi0JCQl2YWx1ZSAgICAgIAkiJHtkZWZhdWx0fSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkVudHJ5QmFycmllckNvbmRpdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiVHJ1ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlcHJlc2VudGF0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU3VicHJvZ3JhbUltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiU3BlYyINCi0JCQkJdmFsdWUgICAgICAJMjI0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJCb2R5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZyINCi0JCQkJdmFsdWUgICAgICAJMjIyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJSZW5hbWluZ0FzQm9keSINCi0JCQkJdmFsdWUgICAgICAJMjMxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJTZXBhcmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlBhcmFtZXRlck1vZGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJJbiINCi0JCQkJdmFsdWUgICAgICAJMjA0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJPdXQiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiSW5PdXQiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQWNjZXNzIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJIlRoZV8ke3N1cHBsaWVyfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0IiAyMTYpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFjY2Vzc0dldCINCi0JCQl2YWx1ZSAgICAgIAkoIkZ1bmN0aW9uS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiR2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkoIlByb2NlZHVyZUtpbmRTZXQiIDIwMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiU2V0XyR7cmVsYXRpb25zaGlwfSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJc0FsaWFzZWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQ29uc3RhbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVySW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCIgMjE3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyR2VuZXJpYyINCi0JCQl2YWx1ZSAgICAgIAkiTGlzdCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckRlY2xhcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlNlbGVjdG9yTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthdHRyaWJ1dGV9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZXByZXNlbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJDb21wb25lbnQiDQotCQkJCXZhbHVlICAgICAgCTIxNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRGlzY3JpbWluYW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFjY2Vzc0Rpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE5KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIkdldF8ke2Fzc29jaWF0aW9ufSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHthc3NvY2lhdGlvbn0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lQXNzb2NpYXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJEaXNzb2NpYXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRGlzc29jaWF0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklubGluZURpc3NvY2lhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbktpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJEb05vdENyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkiVGhlXyR7dGFyZ2V0Q2xhc3N9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiUmVjb3JkRmllbGRJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIlJlY29yZEZpZWxkSW1wbGVtZW50YXRpb25TZXQiIDIxNikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlJlY29yZEZpZWxkTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVHZXQiDQotCQkJdmFsdWUgICAgICAJKCJGdW5jdGlvbktpbmRTZXQiIDE5OSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWNjZXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiRnVuY3Rpb25LaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJHZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0Ig0KLQkJCXZhbHVlICAgICAgCSgiUHJvY2VkdXJlS2luZFNldCIgMjAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBY2Nlc3NTZXQiDQotCQkJdmFsdWUgICAgICAJKCJQcm9jZWR1cmVLaW5kU2V0IiAyMDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJTZXRfJHt0YXJnZXR9IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIklzQWxpYXNlZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSXNDb25zdGFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkoIkNvbnRhaW5lckltcGxlbWVudGF0aW9uU2V0IiAyMTcpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJHZW5lcmljIg0KLQkJCXZhbHVlICAgICAgCSJMaXN0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyRGVjbGFyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3RDcmVhdGUiDQotCQkJCXZhbHVlICAgICAgCTIwMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJSZWNvcmRGaWVsZEltcGxlbWVudGF0aW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCQluYW1lICAgICAgIAkiQ29tcG9uZW50Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRpc2NyaW1pbmFudCINCi0JCQkJdmFsdWUgICAgICAJMjE4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJCW5hbWUgICAgICAgCSJBY2Nlc3NEaXNjcmltaW5hbnQiDQotCQkJCXZhbHVlICAgICAgCTIxOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkFkYTk1Ig0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJJbXBsZW1lbnRhdGlvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTcpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkdlbmVyaWMiDQotCQkJCXZhbHVlICAgICAgCTExKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkZ1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTkpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCQkJbmFtZSAgICAgICAJIkRvTm90Q3JlYXRlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJBZGE5NSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQWRhOTUiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlUGF0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiU3RvcE9uRXJyb3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkJ1aWx0SW4iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiV2luZG93c1NoZWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDEpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQXJyYXlEaW1lbnNpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFkZGl0aW9uYWxJbmNsdWRlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdXNpb25Qcm90ZWN0aW9uU3ltYm9sIg0KLQkJCXZhbHVlICAgICAgCSJBVVRPIEdFTkVSQVRFIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQWRkaXRpb25hbEluY2x1ZGVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiICAlWCUgIEAoIykgcGx1Z2lucy9vcmcuZWNsaXBzZS53c3QuZHRkL3NyYy9yb3NlL2R0ZG1vZGVsLm1kbCwgb3JnLmVjbGlwc2Uud3N0LmR0ZCwgd3RwTTEsIDIwMDQxMTIyIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNvcHlyaWdodE5vdGljZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkluY2x1c2lvblByb3RlY3Rpb25TeW1ib2wiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiT3BlcmF0aW9uSXNPbmVXYXkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJBcnJheURpbWVuc2lvbnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkNhc2VTcGVjaWZpZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIklzUmVhZE9ubHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIk9yZGVyIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFycmF5RGltZW5zaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQ2FzZVNwZWNpZmllciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWRPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCW5hbWUgICAgICAgCSJPcmRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZFJvbGVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQXNzb2NUeXBlU2V0IiA0NykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQkJbmFtZSAgICAgICAJIkFzc29jVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09SQkEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fVXNlcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT1JCQSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGb3J3YXJkUmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPUkJBIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiODA5MTM1OTY2IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJwcm9qZWN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJWaWV3Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRG9tYWluQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU1BQYWNrYWdlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVHJpZ2dlckNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkluZGV4Q291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29uc3RyYWludENvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlN0b3JlUHJvY2VkdXJlQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvcmVpZ25LZXlDb3VudGVyIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJKb2luQ291bnRlciINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImNPTlRBSU5FUkNvdW50ZXIiDQotCQkJdmFsdWUgICAgICAJMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVmlld1ByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRvbWFpblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJbmRleFByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnRQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yZVByb2NlZHVyZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGb3JlaWduS2V5UHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RhdGFiYXNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFyZ2V0RGF0YWJhc2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGVTcGFjZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEZWF1bHQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJCdWZmZXJQb29sIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRXh0ZW50U2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkxKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJlZmV0Y2hTaXplIg0KLQkJCXZhbHVlICAgICAgCTEpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYWdlU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAk0KQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTWFuYWdlZEJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyTGlzdCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2F0ZWdvcnkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbVNjaGVtYSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtRG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEb21haW5QYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290U2NoZW1hIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNSb290RG9tYWluUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU2NoZW1hUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRhdGFiYXNlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEQk1TIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1ZpZXciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RvbWFpbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzU1BQYWNrYWdlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU3lub255bW5zIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiVGFibGVTcGFjZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29ycmVsYXRpb25OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0Q2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNVcGRhdGVhYmxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGVja09wdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiTm9uZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1NuYXBTaG90Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNEaXN0aW5jdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlBlcnNpc3RUb1NlcnZlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUGFja2FnZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiZG1JdGVtIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRE1OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJZGVudGl0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTY2FsZSINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ29sdW1uVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiTmF0aXZlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkZvckJpdERhdGEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWVUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT0lEIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Bc3NvY2lhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUmVsYXRpb25zaGlwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiU291cmNlSWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJTb3VyY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUklNZXRob2QiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnRVcGRhdGVSdWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50VXBkYXRlUnVsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJlbnREZWxldGVSdWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUGFyZW50RGVsZXRlUnVsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZEluc2VydFJlc3RyaWN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hpbGRJbnNlcnRSZXN0cmljdE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDaGlsZE11bHRpcGxpY2l0eSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNoaWxkTXVsdGlwbGljaXR5TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkNvbnN0cmFpbnROYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJkbUl0ZW0iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJETU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW50VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1RyaWdnZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0b3JlZFByb2NlZHVyZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzQ2x1c3RlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlU3BhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJGaWxsRmFjdG9yIg0KLQkJCXZhbHVlICAgICAgCTApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJLZXlMaXN0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tQcmVkaWNhdGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc1VuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmVyYWxNb2RlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbENoZWNrVGltZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiSXNJbnNlcnRFdmVudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzVXBkYXRlRXZlbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RlbGV0ZUV2ZW50Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUmVmT2xkVGFibGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJSZWZOZXdUYWJsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk9sZFJvdyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJlZk5ld1JvdyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzUm93Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiV2hlbkNsYXVzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxhbmd1YWdlIg0KLQkJCXZhbHVlICAgICAgCSJTUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiUHJvY1R5cGUiDQotCQkJdmFsdWUgICAgICAJIlByb2NlZHVyZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJJc0RldGVybWluaXN0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJTdHlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlJldHVybmVkTnVsbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkV4dGVybmFsTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtZXRlciINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJImRtSXRlbSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRNTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzSW5QYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIklzT3V0UGFyYW1ldGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiT3JkaW5hbCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkxlbmd0aCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIlNjYWxlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkRhdGEgTW9kZWxlciINCi0JCQluYW1lICAgICAgIAkiRm9yQml0RGF0YSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRWYWx1ZVR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0VmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRGF0YSBNb2RlbGVyIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25JRCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJEYXRhIE1vZGVsZXIgQ29tbXVuaWNhdG9yIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiZnJhbWV3b3JrIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSb290RGlyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVByZWZpeGVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkF1dG9TeW5jIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk5vdFNob3dSb3NlSUREbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2hvd0NvZGVnZW5EbGciDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSb3NlSUQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRSZXR1cm5MaW5lIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRBdXRob3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0RlZmF1bHRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkphdmFkb2NEZWZhdWx0U2luY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ05hbWUxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdBcHBseTEiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ1RleHQxIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdOYW1lMiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnQXBwbHkyIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZXJEZWZpbmVUYWdUZXh0MiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnTmFtZTMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVXNlckRlZmluZVRhZ0FwcGx5MyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VyRGVmaW5lVGFnVGV4dDMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY051bUFzdGVyaXNrcyINCi0JCQl2YWx1ZSAgICAgIAkwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1heE51bUNoYXJzIg0KLQkJCXZhbHVlICAgICAgCTgwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVkaXRvciINCi0JCQl2YWx1ZSAgICAgIAkoIkVkaXRvclR5cGUiIDEwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk0iDQotCQkJdmFsdWUgICAgICAJKCJWTVR5cGUiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ2xhc3NQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIuO0M6XFxJQk1cXFNRTExJQlxcamF2YVxcZGIyamF2YS56aXA7QzpcXElCTVxcU1FMTElCXFxqYXZhXFxkYjJqY2MuamFyO0M6XFxJQk1cXFNRTExJQlxcamF2YVxcc3Fsai56aXA7QzpcXElCTVxcU1FMTElCXFxiaW47QzpcXElCTVxcU1FMTElCXFxqYXZhXFxjb21tb24uamFyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWZlcmVuY2VDbGFzc3BhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVk1UeXBlIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdW4iDQotCQkJCXZhbHVlICAgICAgCTIwMCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlZBSmF2YVdvcmtpbmdGb2xkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VWYXJpYWJsZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbGFzc1ZhcmlhYmxlUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRBdHRyaWJ1dGVEYXRhVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0T3BlcmF0aW9uUmV0dXJuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkidm9pZCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTm9DbGFzc0N1c3RvbURsZyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHbG9iYWxJbXBvcnRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJPcGVuQnJhY2VDbGFzc1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiT3BlbkJyYWNlTWV0aG9kU3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJVc2VUYWJzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlVzZVNwYWNlcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNwYWNpbmdJdGVtcyINCi0JCQl2YWx1ZSAgICAgIAkzKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJvc2VEZWZhdWx0Q29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQXN0ZXJpc2tDb21tZW50U3R5bGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhQ29tbWVudFN0eWxlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY0F1dGhvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJKYXZhZG9jU2luY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSmF2YWRvY1ZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQmVhblByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJCZWFuU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlbW90ZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZW1vdGVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSG9tZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJIb21lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlByaW1hcnlLZXlQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJEVERMb2NhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RFRETG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdEVKQlZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdFNlcnZsZXRWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3JJcyINCi0JCQl2YWx1ZSAgICAgIAkoIkN0b3JfU2V0IiA2MikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ3Rvcl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJInB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkicHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk2MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJwYWNrYWdlIg0KLQkJCQl2YWx1ZSAgICAgIAk2NSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRmluYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RhdGljSW5pdGlhbGl6ZXIiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVJbnN0YW5jZUluaXRpYWxpemVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkRpc2FibGVBdXRvU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJSZWFkT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkRlZmF1bHRfU2VydmxldF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldE5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldENvbnRleHRSZWYiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNTaW5nbGVUaHJlYWQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEluaXRQYXJhbWV0ZXJOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0SXNTZWN1cmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFJlcXVlc3REaXNwYXRjaGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRSZXF1ZXN0RGlzcGF0Y2hlclBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckluY2x1ZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRGlzcGF0Y2hlckZvcndhcmQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFNlY3VyaXR5Um9sZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldGdldEluZm8iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldFhNTEZpbGVQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiSHR0cF9TZXJ2bGV0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXNOYW1lcyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RGb3JSZXF1ZXN0QXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0UmVxdWVzdFBhcmFtZXRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvclJlcXVlc3RQYXJhbWV0ZXJzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlNlcnZsZXRIZWFkZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEhlYWRlck5hbWVzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckhlYWRlcnMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiU2VydmxldEludEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0RGF0ZUhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29va2llIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEZvckNvb2tpZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTZXJ2bGV0Q29udGVudFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVIVE1MIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiRGVmYXVsdF9FSkJfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlX1hNTF9ERCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkNtcEZpZWxkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQkVudmlyb25tZW50UHJvcGVydGllcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJDbnhGYWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZmVyZW5jZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2VjdXJpdHlSb2xlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJOYW1lSW5KQVIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJTZXNzaW9uVHlwZV9TZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCU2Vzc2lvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSIiDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWxlc3MiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTdGF0ZWZ1bCINCi0JCQkJdmFsdWUgICAgICAJMjAyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVHJhbnNhY3Rpb25UeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVHJhbnNhY3Rpb25UeXBlX1NldCIgMjExKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJUcmFuc2FjdGlvblR5cGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIxMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJCZWFuIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJQZXJzaXN0ZW5jZVR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJFSkJQZXJzaXN0ZW5jZVR5cGVfU2V0IiAyMjApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlBlcnNpc3RlbmNlVHlwZV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIiINCi0JCQkJdmFsdWUgICAgICAJMjIwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJlYW4iDQotCQkJCXZhbHVlICAgICAgCTIyMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb250YWluZXIiDQotCQkJCXZhbHVlICAgICAgCTIyMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkVKQlJlZW50cmFudCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJTZXNzaW9uU3luYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJFSkJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCSgiRUpCVmVyc2lvbl9TZXQiIDIzMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCVmVyc2lvbl9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjIuMCINCi0JCQkJdmFsdWUgICAgICAJMjMwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIjEueCINCi0JCQkJdmFsdWUgICAgICAJMjMxKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRUpCWE1MRmlsZVBhdGgiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkphdmEiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLUJvZHkiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ21JZGVudGlmaWNhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiRmluYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiTmF0aXZlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlN5bmNocm9uaXplZCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkUmV0dXJuIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlcGxhY2VFeGlzdGluZ0NvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiSmF2YSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckNsYXNzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJGaW5hbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlUeXBlIg0KLQkJCXZhbHVlICAgICAgCSgiQmVhblByb3BlcnR5X1NldCIgNzEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIkJlYW5Qcm9wZXJ0eV9TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIk5vdCBBIFByb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAk3MSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJTaW1wbGUiDQotCQkJCXZhbHVlICAgICAgCTcyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIkJvdW5kIg0KLQkJCQl2YWx1ZSAgICAgIAk3MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJDb25zdHJhaW5lZCINCi0JCQkJdmFsdWUgICAgICAJNzQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpdmlkdWFsQ2hhbmdlTWd0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGUiDQotCQkJdmFsdWUgICAgICAJKCJSZWFkL1dyaXRlX1NldCIgODEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJbmFtZSAgICAgICAJIlJlYWQvV3JpdGVfU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkphdmEiDQotCQkJCW5hbWUgICAgICAgCSJSZWFkICYgV3JpdGUiDQotCQkJCXZhbHVlICAgICAgCTgxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQkJbmFtZSAgICAgICAJIlJlYWQgT25seSINCi0JCQkJdmFsdWUgICAgICAJODIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCQluYW1lICAgICAgIAkiV3JpdGUgT25seSINCi0JCQkJdmFsdWUgICAgICAJODMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZ1bGx5UXVhbGlmaWVkVHlwZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiSmF2YSINCi0JCQluYW1lICAgICAgIAkiSXNOYXZpZ2FibGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJKYXZhIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjM2MDAwMDAwMiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJERExTY3JpcHRGaWxlbmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiRERMMS5TUUwiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkRyb3BDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtbk5hbWUiDQotCQkJdmFsdWUgICAgICAJIl9JRCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiUHJpbWFyeUtleUNvbHVtblR5cGUiDQotCQkJdmFsdWUgICAgICAJIk5VTUJFUig1LDApIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJTY2hlbWFOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlNjaGVtYU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUeXBlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWaWV3TmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJWYXJyYXlOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlZhcnJheU5hbWVTdWZmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTmVzdGVkVGFibGVOYW1lUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk5lc3RlZFRhYmxlTmFtZVN1ZmZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPYmplY3RUYWJsZU5hbWVQcmVmaXgiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT2JqZWN0VGFibGVOYW1lU3VmZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNTY2hlbWEiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiV2hlcmVDbGF1c2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ2hlY2tDb25zdHJhaW50Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlUHJlY2lzaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbGxlY3Rpb25UeXBlU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiQ29sbGVjdGlvbk9mUkVGUyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJNZXRob2RLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiTWV0aG9kS2luZFNldCIgMTkwMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3ZlcmxvYWRJRCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJPcmRlck51bWJlciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb0RhdGFTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1JlYWROb1Byb2Nlc3NTdGF0ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJJc1dyaXRlTm9EYXRhU3RhdGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNXcml0ZU5vUHJvY2Vzc1N0YXRlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzU2VsZmlzaCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIlRyaWdnZXJUeXBlU2V0IiAxODAxKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRXZlbnQiDQotCQkJdmFsdWUgICAgICAJKCJUcmlnZ2VyRXZlbnRTZXQiIDE2MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJUZXh0Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJSZWZlcmVuY2luZ05hbWVzIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJGb3JFYWNoIg0KLQkJCXZhbHVlICAgICAgCSgiVHJpZ2dlckZvckVhY2hTZXQiIDE3MDEpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJXaGVuQ2xhdXNlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIk1ldGhvZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIk1hcE1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJPcmRlck1ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJMTkwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJGdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTkwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJQcm9jZWR1cmUiDQotCQkJCXZhbHVlICAgICAgCTE5MDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiT3BlcmF0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQ29uc3RydWN0b3IiDQotCQkJCXZhbHVlICAgICAgCTE5MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvciINCi0JCQkJdmFsdWUgICAgICAJMTkwNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyIg0KLQkJCQl2YWx1ZSAgICAgIAkxOTA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIkNhbGN1bGF0ZWQiDQotCQkJCXZhbHVlICAgICAgCTE5MDkpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQUZURVIiDQotCQkJCXZhbHVlICAgICAgCTE4MDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiQkVGT1JFIg0KLQkJCQl2YWx1ZSAgICAgIAkxODAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIklOU1RFQUQgT0YiDQotCQkJCXZhbHVlICAgICAgCTE4MDMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJUcmlnZ2VyRm9yRWFjaFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiUk9XIg0KLQkJCQl2YWx1ZSAgICAgIAkxNzAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlNUQVRFTUVOVCINCi0JCQkJdmFsdWUgICAgICAJMTcwMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlRyaWdnZXJFdmVudFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSINCi0JCQkJdmFsdWUgICAgICAJMTYwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJCW5hbWUgICAgICAgCSJJTlNFUlQgT1IgREVMRVRFIg0KLQkJCQl2YWx1ZSAgICAgIAkxNjA1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQkJbmFtZSAgICAgICAJIlVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCQluYW1lICAgICAgIAkiSU5TRVJUIE9SIFVQREFURSBPUiBERUxFVEUiDQotCQkJCXZhbHVlICAgICAgCTE2MDcpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiT3JkZXJOdW1iZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNVbmlxdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTnVsbHNBbGxvd2VkIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiTGVuZ3RoIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIlByZWNpc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiMiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiU2NhbGUiDQotCQkJdmFsdWUgICAgICAJIjYiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIklzSW5kZXgiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCQluYW1lICAgICAgIAkiSXNQcmltYXJ5S2V5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk9yYWNsZTgiDQotCQkJbmFtZSAgICAgICAJIkNvbXBvc2l0ZVVuaXF1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJPcmFjbGU4Ig0KLQkJCW5hbWUgICAgICAgCSJDaGVja0NvbnN0cmFpbnQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiT3JhY2xlOCINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNvbXBvbmVudFRlc3QiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJBbm5vdGF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dHZW5lcmF0ZU92ZXJOZXdlclZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVzZU1TVkMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJofiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkhlYWRlckZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImgjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwcCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlQmFja3VwRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZVRlbXBvcmFyeUV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3AjIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ3JlYXRlTWlzc2luZ0RpcmVjdG9yaWVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcnJvckxpbWl0Ig0KLQkJCXZhbHVlICAgICAgCTMwKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEaXJlY3RvcnkiDQotCQkJdmFsdWUgICAgICAJIiRST1NFQ1BQX1NPVVJDRSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlBhdGhTZXBhcmF0b3IiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpbGVOYW1lRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSIxMjh2eF9iIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9vbGVhblR5cGUiDQotCQkJdmFsdWUgICAgICAJImludCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93VGVtcGxhdGVzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb21tZW50V2lkdGgiDQotCQkJdmFsdWUgICAgICAJNjApDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMi4xX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXhwbGljaXRJbnN0YW50aWF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dQcm90ZWN0ZWRJbmhlcml0YW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT25lQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJPcHRpb25hbEJ5VmFsdWUoc2l6ZW9mKCR0YXJnZXRDbGFzcykpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uYWxCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICoiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkRml4ZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3NbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKlskbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSwkbGltaXQpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpLCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRMaXN0QnlSZWZlcmVuY2UoJGxpbWl0KSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZFNldEJ5UmVmZXJlbmNlKCRsaW1pdCkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZShzaXplb2YoJHRhcmdldENsYXNzKSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRTZXRCeVZhbHVlKHNpemVvZigkdGFyZ2V0Q2xhc3MpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVuYm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlSZWZlcmVuY2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRVbmJvdW5kZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlSZWZlcmVuY2UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWUoc2l6ZW9mKCRxdWFsdHlwZSksIHNpemVvZigkcXVhbGNvbnQpKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZFF1YWxpZmllZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVZhbHVlKHNpemVvZigkcXVhbHR5cGUpLCBzaXplb2YoJHF1YWxjb250KSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQXNzb2NpYXRpb25CeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZShzaXplb2YoJHF1YWx0eXBlKSwgc2l6ZW9mKCRxdWFsY29udCkpIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUGF0aFNlcGFyYXRvciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJIjEyOHZ4X2IiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbHdheXNLZWVwT3JwaGFuZWRDb2RlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImNvbXBpbGVyMy4wX19Qcm9qZWN0Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0dlbmVyYXRlT3Zlck5ld2VyQW5ub3RhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93R2VuZXJhdGVPdmVyTmV3ZXJWZXJzaW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGVhZGVyRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiaH4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJIZWFkZXJGaWxlVGVtcG9yYXJ5RXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJoIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVGaWxlRXh0ZW5zaW9uIg0KLQkJCXZhbHVlICAgICAgCSJjcHAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlRmlsZUJhY2t1cEV4dGVuc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiY3B+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZUZpbGVUZW1wb3JhcnlFeHRlbnNpb24iDQotCQkJdmFsdWUgICAgICAJImNwIyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNyZWF0ZU1pc3NpbmdEaXJlY3RvcmllcyINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9wT25FcnJvciINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRXJyb3JMaW1pdCINCi0JCQl2YWx1ZSAgICAgIAkzMCkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGlyZWN0b3J5Ig0KLQkJCXZhbHVlICAgICAgCSIkUk9TRUNQUF9TT1VSQ0UiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb29sZWFuVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiaW50IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dUZW1wbGF0ZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQWxsb3dFeHBsaWNpdEluc3RhbnRpYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd1Byb3RlY3RlZEluaGVyaXRhbmNlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9uZUJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiT3B0aW9uYWxCeVZhbHVlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcHRpb25hbEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSIkdGFyZ2V0Q2xhc3MgKiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZpeGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbm9yZGVyZWRGaXhlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzc1skbGltaXRdIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRml4ZWRCeVJlZmVyZW5jZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiJHRhcmdldENsYXNzICpbJGxpbWl0XSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlVub3JkZXJlZEZpeGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXRDbGFzcyAqWyRsaW1pdF0iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiQm91bmRlZExpc3RCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5VmFsdWVDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkJvdW5kZWRTZXRCeVZhbHVlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkTGlzdEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcywkbGltaXQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkQm91bmRlZEJ5UmVmZXJlbmNlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJCb3VuZGVkU2V0QnlSZWZlcmVuY2U8JHRhcmdldENsYXNzLCRsaW1pdD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJVbmJvdW5kZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJVbmJvdW5kZWRMaXN0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiVW5ib3VuZGVkU2V0QnlWYWx1ZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZExpc3RCeVJlZmVyZW5jZTwkdGFyZ2V0Q2xhc3M+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkVW5ib3VuZGVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIlVuYm91bmRlZFNldEJ5UmVmZXJlbmNlPCR0YXJnZXRDbGFzcz4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRCeVZhbHVlQ29udGFpbmVyIg0KLQkJCXZhbHVlICAgICAgCSJBc3NvY2lhdGlvbkJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlWYWx1ZUNvbnRhaW5lciINCi0JCQl2YWx1ZSAgICAgIAkiRGljdGlvbmFyeUJ5VmFsdWU8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkFzc29jaWF0aW9uQnlSZWZlcmVuY2U8JHF1YWx0eXBlLCAkcXVhbGNvbnQ+IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVW5vcmRlcmVkUXVhbGlmaWVkQnlSZWZlcmVuY2VDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIkRpY3Rpb25hcnlCeVJlZmVyZW5jZTwkcXVhbHR5cGUsICRxdWFsY29udD4iKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQYXRoU2VwYXJhdG9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZUZvcm1hdCINCi0JCQl2YWx1ZSAgICAgIAkiMTI4dnhfYiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsd2F5c0tlZXBPcnBoYW5lZENvZGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQ2xhc3MiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvZGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvblR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNsYXNzS2V5Ig0KLQkJCXZhbHVlICAgICAgCSJjbGFzcyIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUHV0Qm9kaWVzSW5TcGVjIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlZmF1bHRDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZWZhdWx0Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZWZhdWx0Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0RGVmYXVsdENvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNvcHlDb25zdHJ1Y3RvciINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5Q29uc3RydWN0b3JWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVDb3B5Q29uc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4cGxpY2l0Q29weUNvbnN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURlc3RydWN0b3IiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVzdHJ1Y3RvclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlc3RydWN0b3JLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVEZXN0cnVjdG9yIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUFzc2lnbm1lbnRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZVNldCIgMTk5KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzaWdubWVudFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc2lnbm1lbnRLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NpZ25tZW50T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlU2V0IiAxOTkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJFcXVhbGl0eVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVxdWFsaXR5S2luZCINCi0JCQl2YWx1ZSAgICAgIAkoIkZyaWVuZEtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUVxdWFsaXR5T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVSZWxhdGlvbmFsT3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUmVsYXRpb25hbFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlJlbGF0aW9uYWxLaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiRnJpZW5kS2luZFNldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUmVsYXRpb25hbE9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU3RvcmFnZU1nbXRPcGVyYXRpb25zIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTdG9yYWdlTWdtdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0b3JhZ2VNZ210T3BlcmF0aW9ucyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVTdWJzY3JpcHRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdEtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN1YnNjcmlwdFJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN1YnNjcmlwdE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEZXJlZmVyZW5jZU9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGVyZWZlcmVuY2VWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiVmlzaWJpbGl0eVNldCIgNDUpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEZXJlZmVyZW5jZUtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUaHJlZUtpbmRTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRlcmVmZXJlbmNlUmVzdWx0VHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lRGVyZWZlcmVuY2VPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5kaXJlY3Rpb25PcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGlyZWN0aW9uVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIlZpc2liaWxpdHlTZXQiIDQ1KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5kaXJlY3Rpb25LaW5kIg0KLQkJCXZhbHVlICAgICAgCSgiVGhyZWVLaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmRpcmVjdGlvblJlc3VsdFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUluZGlyZWN0aW9uT3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlN0cmVhbVZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJWaXNpYmlsaXR5U2V0IiA0NSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVN0cmVhbU9wZXJhdGlvbnMiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlRocmVlS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiS2luZFNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZyaWVuZEtpbmRTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkRlY2xhcmVBbmREZWZpbmUiDQotCQkJCXZhbHVlICAgICAgCTE5OSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRGVjbGFyZU9ubHkiDQotCQkJCXZhbHVlICAgICAgCTIwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRG9Ob3REZWNsYXJlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDYpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDbUlkZW50aWZpY2F0aW9uIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIgICVYJSAgQCgjKSBwbHVnaW5zL29yZy5lY2xpcHNlLndzdC5kdGQvc3JjL3Jvc2UvZHRkbW9kZWwubWRsLCBvcmcuZWNsaXBzZS53c3QuZHRkLCB3dHBNMSwgMjAwNDExMjIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29weXJpZ2h0Tm90aWNlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRmlsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIkFVVE8gR0VORVJBVEUiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBbGxvd0V4dGVuc2lvbmxlc3NGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVzaW9uUHJvdGVjdGlvblN5bWJvbCINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVGb3JtYXQiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgDQotfC8vICRwYWNrYWdlDQotfCNpbmNsdWRlICIkZmlsZSINCi18DQotCQkJKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUJ5U2ltcGxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZVByZWNvbXBpbGVkSGVhZGVyIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX01vZHVsZS1Cb2R5Ig0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9ucyINCi0JCQl2YWx1ZSAgICAgIAkoIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiIDMpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWxsIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNtSWRlbnRpZmljYXRpb24iDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiAgJVglICBAKCMpIHBsdWdpbnMvb3JnLmVjbGlwc2Uud3N0LmR0ZC9zcmMvcm9zZS9kdGRtb2RlbC5tZGwsIG9yZy5lY2xpcHNlLndzdC5kdGQsIHd0cE0xLCAyMDA0MTEyMiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb3B5cmlnaHROb3RpY2UiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGaWxlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFsbG93RXh0ZW5zaW9ubGVzc0ZpbGVOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlRm9ybWF0Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0IA0KLXwvLyAkcGFja2FnZQ0KLXwjaW5jbHVkZSAiJGZpbGUiDQotfA0KLQkJCSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVCeVNpbXBsZU5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluY2x1ZGVQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmNsdWRlT3JkZXIiDQotCQkJdmFsdWUgICAgICAJIkFNSVIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBZGRpdGlvbmFsSW5jbHVkZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmluZ1N0eWxlIg0KLQkJCXZhbHVlICAgICAgCSgiSW5saW5pbmdTdHlsZVNldCIgMjA3KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5pbmdTdHlsZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkluQ2xhc3NEZWNsYXJhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMjA4KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGb2xsb3dpbmdDbGFzc0RlY2xhcmF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDcpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiVHlwZXNEZWZpbmVkIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5jbHVkZUNsb3N1cmUiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9wZXJhdGlvbktpbmQiDQotCQkJdmFsdWUgICAgICAJKCJPcGVyYXRpb25LaW5kU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25LaW5kU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQWJzdHJhY3RCb2R5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUZyaWVuZEJvZHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRnJpZW5kRGVjbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU3BlY2lhbERlY2xSZXR1cm5UeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJPcGVyYXRpb25Jc0V4cGxpY2l0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkVudHJ5Q29kZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkV4aXRDb2RlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ0NSZWdpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25zIg0KLQkJCXZhbHVlICAgICAgCSgiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCIgMykpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRW1wdHlSZWdpb25TZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJOb25lIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucHJlc2VydmVkIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBbGwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQm9keUFubm90YXRpb25zIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0hhcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk9yZGVyZWQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiTmFtZUlmVW5sYWJlbGVkIg0KLQkJCXZhbHVlICAgICAgCSJ0aGVfJHN1cHBsaWVyIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhTWVtYmVyIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIkcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlVucmVzdHJpY3RlZCINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiTXV0YWJsZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29uc3QiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlcklzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJGaWVsZFNpemUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlR2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldE5hbWUiDQotCQkJdmFsdWUgICAgICAJImdldF8kcmVsYXRpb25zaGlwIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyRyZWxhdGlvbnNoaXAiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kcyINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFNldEtpbmRzU2V0IiAyMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRLaW5kc1NldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbW1vbiINCi0JCQkJdmFsdWUgICAgICAJMjAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJWaXJ0dWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFic3RyYWN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlN0YXRpYyINCi0JCQkJdmFsdWUgICAgICAJMjAzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGcmllbmQiDQotCQkJCXZhbHVlICAgICAgCTIwNCkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb250YWluZXJDbGFzcyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2VsZWN0b3JOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZWxlY3RvclR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZUdldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJTZXRSZXR1cm5zVmFsdWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIklubGluZVNldCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSGFzUmVsVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFycmF5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2VxdWVuY2UiDQotCQkJCXZhbHVlICAgICAgCTQ3KSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXNzb2NpYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIk5hbWVJZlVubGFiZWxlZCINCi0JCQl2YWx1ZSAgICAgIAkidGhlXyR0YXJnZXRDbGFzcyIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fSW5oZXJpdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2VBcmd1bWVudHMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJOYW1lSWZVbmxhYmVsZWQiDQotCQkJdmFsdWUgICAgICAJInRoZV8kdGFyZ2V0Q2xhc3MiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURhdGFNZW1iZXIiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0IiAxNCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljIg0KLQkJCQl2YWx1ZSAgICAgIAk0NSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJvdGVjdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAk0NCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJNDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkltcGxlbWVudGF0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQXRSZWxhdGlvbnNoaXBWaXNpYmlsaXR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMTApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyTXV0YWJpbGl0eVNldCIgMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5yZXN0cmljdGVkIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJNdXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb25zdCINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlckZpZWxkU2l6ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5pdGlhbFZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29udGFpbmVyQ2xhc3MiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lckdldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuZ2V0KCRrZXlzKSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNvbnRhaW5lclNldCINCi0JCQl2YWx1ZSAgICAgIAkiJGRhdGEuc2V0KCRrZXlzLCR2YWx1ZSkiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NDb250YWluZXIiDQotCQkJdmFsdWUgICAgICAJIiRzdXBwbGllciAqIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0luaXRpYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEtpbmRzU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQ29tbW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWwiDQotCQkJCXZhbHVlICAgICAgCTIwMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiQWJzdHJhY3QiDQotCQkJCXZhbHVlICAgICAgCTIwMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU3RhdGljIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkZyaWVuZCINCi0JCQkJdmFsdWUgICAgICAJMjA0KSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFNldEJ5UmVmZXJlbmNlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJHRhcmdldCIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0U2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJdmFsdWUgICAgICAJKCJRdWFsaWZpZWRHZXRTZXRCeVJlZmVyZW5jZVNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFNldEJ5UmVmZXJlbmNlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRmFsc2UiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlRydWUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNhbWVfQXNfR2V0U2V0QnlSZWZlcmVuY2UiDQotCQkJCXZhbHVlICAgICAgCTIpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVRdWFsaWZpZWRHZXRPcGVyYXRpb24iDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJRdWFsaWZpZWRHZXRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZEdldFJlc3VsdElzQ29uc3QiDQotCQkJdmFsdWUgICAgICAJKCJHZXRSZXN1bHRJc0NvbnN0U2V0IiAyKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lUXVhbGlmaWVkR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlUXVhbGlmaWVkU2V0T3BlcmF0aW9uIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlF1YWxpZmllZFNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kdGFyZ2V0IikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiUXVhbGlmaWVkU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVRdWFsaWZpZWRTZXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVBc3NvY0NsYXNzRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzRGF0YU1lbWJlclZpc2liaWxpdHkiDQotCQkJdmFsdWUgICAgICAJKCJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCIgMTQpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyVmlzaWJpbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlB1YmxpYyINCi0JCQkJdmFsdWUgICAgICAJNDUpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByb3RlY3RlZCINCi0JCQkJdmFsdWUgICAgICAJNDQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByaXZhdGUiDQotCQkJCXZhbHVlICAgICAgCTQzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRhdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkF0UmVsYXRpb25zaGlwVmlzaWJpbGl0eSINCi0JCQkJdmFsdWUgICAgICAJMjEwKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NEYXRhTWVtYmVySXNWb2xhdGlsZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQXNzb2NDbGFzc0dldFNldEtpbmRzIg0KLQkJCXZhbHVlICAgICAgCSgiR2V0U2V0S2luZHNTZXQiIDIwMCkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc0dldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiZ2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzR2V0UmVzdWx0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAkoIkdldFJlc3VsdElzQ29uc3RTZXQiIDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQXNzb2NDbGFzc1NldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0TmFtZSINCi0JCQl2YWx1ZSAgICAgIAkic2V0XyR0YXJnZXQiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY0NsYXNzU2V0UmV0dXJuc1ZhbHVlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJJbmxpbmVBc3NvY0NsYXNzU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkFzc29jQ2xhc3NGb3J3YXJkUmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJBc3NvY1R5cGVTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBcnJheSINCi0JCQkJdmFsdWUgICAgICAJMjQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlNlcXVlbmNlIg0KLQkJCQl2YWx1ZSAgICAgIAk0NykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiQ29kZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGF0YU1lbWJlciINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJWaXNpYmlsaXR5Ig0KLQkJCXZhbHVlICAgICAgCSgiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiIDE0KSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlclZpc2liaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQdWJsaWMiDQotCQkJCXZhbHVlICAgICAgCTQ1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcm90ZWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTQ0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJQcml2YXRlIg0KLQkJCQl2YWx1ZSAgICAgIAk0MykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiSW1wbGVtZW50YXRpb24iDQotCQkJCXZhbHVlICAgICAgCTE0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBdEF0dHJpYnV0ZVZpc2liaWxpdHkiDQotCQkJCXZhbHVlICAgICAgCTIxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyTXV0YWJpbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkRhdGFNZW1iZXJNdXRhYmlsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiRGF0YU1lbWJlck11dGFiaWxpdHlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJVbnJlc3RyaWN0ZWQiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk11dGFibGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkNvbnN0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRhdGFNZW1iZXJJc1ZvbGF0aWxlIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJEYXRhTWVtYmVyRmllbGRTaXplIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUdldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVNldE9wZXJhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXROYW1lIg0KLQkJCXZhbHVlICAgICAgCSJnZXRfJGF0dHJpYnV0ZSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldE5hbWUiDQotCQkJdmFsdWUgICAgICAJInNldF8kYXR0cmlidXRlIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHMiDQotCQkJdmFsdWUgICAgICAJKCJHZXRTZXRLaW5kc1NldCIgMjAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0U2V0S2luZHNTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJDb21tb24iDQotCQkJCXZhbHVlICAgICAgCTIwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVmlydHVhbCINCi0JCQkJdmFsdWUgICAgICAJMjAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJBYnN0cmFjdCINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJTdGF0aWMiDQotCQkJCXZhbHVlICAgICAgCTIwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiRnJpZW5kIg0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2V0SXNDb25zdCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRSZXN1bHRJc0NvbnN0Ig0KLQkJCXZhbHVlICAgICAgCSgiR2V0UmVzdWx0SXNDb25zdFNldCIgMikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkdldFJlc3VsdElzQ29uc3RTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiY2ciDQotCQkJCW5hbWUgICAgICAgCSJGYWxzZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVHJ1ZSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiU2FtZV9Bc19GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMikpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJHZXRTZXRCeVJlZmVyZW5jZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lR2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIlNldFJldHVybnNWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSW5saW5lU2V0Ig0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkNDUmVnaW9uIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJImNnIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1VzZXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkZvcndhcmRSZWZlcmVuY2VPbmx5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJCb2R5UmVmZXJlbmNlT25seSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19TdWJzeXN0ZW0iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkiQVVUTyBHRU5FUkFURSIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkRpcmVjdG9yeUlzT25TZWFyY2hMaXN0Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJQcmVjb21waWxlZEhlYWRlciINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJjZyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiSXNOYW1lc3BhY2UiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiY2ciDQotCQkJbmFtZSAgICAgICAJIkluZGVudCINCi0JCQl2YWx1ZSAgICAgIAkyKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCW5hbWUgICAgICAgCSJDb2RlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvbnMiDQotCQkJdmFsdWUgICAgICAJKCJHZW5lcmF0ZUVtcHR5UmVnaW9uU2V0IiAzKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFbXB0eVJlZ2lvblNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIlByZXNlcnZlZCINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJImNnIg0KLQkJCQluYW1lICAgICAgIAkiVW5wcmVzZXJ2ZWQiDQotCQkJCXZhbHVlICAgICAgCTIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJjZyINCi0JCQkJbmFtZSAgICAgICAJIkFsbCINCi0JCQkJdmFsdWUgICAgICAJMykpKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQluYW1lICAgICAgIAkicHJvcGVydHlJZCINCi0JCXZhbHVlICAgICAgCSI4MDkxMzU5NjYiKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1Byb2plY3QiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiNS4wIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlR5cGUiDQotCQkJdmFsdWUgICAgICAJKCJNU1ZDQ2xhc3NUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQ2xhc3NUeXBlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJOb3JtYWwiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiSW50ZXJmYWNlX1BhcnQiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQ29ubmVjdGlvbl9QYXJ0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkNsYXNzX0ZhY3RvcnkiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eSINCi0JCQl2YWx1ZSAgICAgIAkoIkNPYmplY3RGdW5jdGlvbmFsaXR5U2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT2JqZWN0RnVuY3Rpb25hbGl0eVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9uZSINCi0JCQkJdmFsdWUgICAgICAJMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJEeW5hbWljIg0KLQkJCQl2YWx1ZSAgICAgIAkxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkR5bmNyZWF0ZSINCi0JCQkJdmFsdWUgICAgICAJMikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTZXJpYWwiDQotCQkJCXZhbHVlICAgICAgCTMpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU92ZXJyaWRlR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVEYXRhR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0RBVEFfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVGaWVsZEdyb3VwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9GSUVMRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VHcm91cCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZU1lc3NhZ2VNYXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX01TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUVTU0FHRV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFRmFjdG9yeSINCi0JCQl2YWx1ZSAgICAgIAkoIk9MRUZhY3RvcnlTZXQiIDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUZhY3RvcnlTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk5vbmUiDQotCQkJCXZhbHVlICAgICAgCTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRfaW4iDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU2ltcGxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkxpY2Vuc2VkIg0KLQkJCQl2YWx1ZSAgICAgIAkzKSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDbGFzc0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFQ3RsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVDdGxUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlT0xFVHlwZUxpYiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJPTEVUeXBlTGliSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiT0xFVHlwZUxpYk1ham9yIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVR5cGVMaWJNaW5vciINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRVByb3BQYWdlSURzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZURpc3BhdGNoTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnRpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIlN0b2NrRnVuY3Rpb25zIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEaXNwYXRjaERlZlZhbHVlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRGlzcElkRW51bSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUF9JRF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUludGVyZmFjZU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJJTlRFUkZBQ0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkluaXRJbnRlcmZhY2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVFdmVudE1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRVZFTlRfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJFVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiU3RvY2tFdmVudHMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlRXZlbnRTaW5rTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0VWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRTSU5LX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wTm90aWZ5U2lua3MiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvbk1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT05ORUNUSU9OX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDb25uZWN0aW9uUG9pbnRJSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiSW5oZXJpdGFuY2VUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRlY2xTcGVjIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk9MRUNvbW1hbmRzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNRkNEZWNsYXJlcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiTUZDSW1wbGVtZW50cyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQVRMX0RlY2xhcmVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUNPTU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDT01fTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlQ29ubmVjdGlvblBvaW50TWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkNPTk5FQ1RJT05fUE9JTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlTXNnTWFwIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1TR19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGVQcm9wZXJ0eU1hcCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQUk9QRVJUWV9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19PcGVyYXRpb24iDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNPcGVyYXRpb25UeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDT3BlcmF0aW9uVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlZpcnR1YWxfT3ZlcnJpZGUiDQotCQkJCXZhbHVlICAgICAgCTEpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWVzc2FnZV9IYW5kbGVyIg0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpc3BhdGNoX0hhbmRsZXIiDQotCQkJCXZhbHVlICAgICAgCTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiRXZlbnRfRmlyaW5nX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk0KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkV2ZW50X1NpbmtfSGFuZGxlciINCi0JCQkJdmFsdWUgICAgICAJNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJTdGRfT0xFX01ldGhvZCINCi0JCQkJdmFsdWUgICAgICAJNikNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJDb21tYW5kX1BhcnNlciINCi0JCQkJdmFsdWUgICAgICAJNykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eV9HZXRfRnVuY3Rpb24iDQotCQkJCXZhbHVlICAgICAgCTgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiUHJvcGVydHlfU2V0X0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAk5KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIlByb3BlcnR5X05vdGlmeV9GdW5jdGlvbiINCi0JCQkJdmFsdWUgICAgICAJMTApDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTWFjcm9fR2VuZXJhdGVkX0Z1bmN0aW9uIg0KLQkJCQl2YWx1ZSAgICAgIAkxMSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9NU0dfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIk1FU1NBR0VfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9ESVNQQVRDSF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVF9NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRVZFTlRfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkFGWF9FVkVOVFNJTktfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkVWRU5UU0lOS19NQVBfRW50cmllcyINCi0JCQl2YWx1ZSAgICAgIAkodmFsdWUgVGV4dCAiIikpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQ2FsbFR5cGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiRGVjbFNwZWMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQm9keUltYWdlIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1JvbGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19IYXMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkoIk1TVkNBdHRyaWJ1dGVUeXBlU2V0IiAwKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJNU1ZDQXR0cmlidXRlVHlwZVNldCINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiTm9ybWFsIg0KLQkJCQl2YWx1ZSAgICAgIAkwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIk1lbWJlcl9Qcm9wZXJ0eSINCi0JCQkJdmFsdWUgICAgICAJMSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJCW5hbWUgICAgICAgCSJHZXRfU2V0X1Byb3BlcnR5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkRpYWxvZ19EYXRhIg0KLQkJCQl2YWx1ZSAgICAgIAkzKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQkJbmFtZSAgICAgICAJIkZpZWxkX0RhdGEiDQotCQkJCXZhbHVlICAgICAgCTQpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCQluYW1lICAgICAgIAkiU3RvY2tfUHJvcGVydHkiDQotCQkJCXZhbHVlICAgICAgCTUpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJBRlhfRElTUEFUQ0hfTUFQX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkRJU1BBVENIX01BUF9FbnRyaWVzIg0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJEZWNsU3BlYyINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJQb2ludGVyQmFzZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJDYWxsVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJTdG9ja1Byb3BlcnR5SW1wbGVtZW50YXRpb24iDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtU3BlYyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiTVNWQyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Nb2R1bGUtQm9keSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJNU1ZDIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZUluY2x1ZGVzR3JvdXAiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiTVNWQyINCi0JCQluYW1lICAgICAgIAkiQUZYX0lOQ0xVREVTX0VudHJpZXMiDQotCQkJdmFsdWUgICAgICAJKHZhbHVlIFRleHQgIiIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIk1TVkMiDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlSW5zZXJ0TG9jYXRpb24iDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiY2ciDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIE1vZGVsIEludGVncmF0b3IiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJSb3NlIFdlYiBQdWJsaXNoZXIiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJUb3BMaW5rIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiVHlwZUtpbmRzIg0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImVudW0iDQotCQkJCXZhbHVlICAgICAgCTEwMCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJInJlY29yZCINCi0JCQkJdmFsdWUgICAgICAJMTAxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibW9kdWxlIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwMykNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImRpc3BpbnRlcmZhY2UiDQotCQkJCXZhbHVlICAgICAgCTEwNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImNvY2xhc3MiDQotCQkJCXZhbHVlICAgICAgCTEwNSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQkJbmFtZSAgICAgICAJImFsaWFzIg0KLQkJCQl2YWx1ZSAgICAgIAkxMDYpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSJ1bmlvbiINCi0JCQkJdmFsdWUgICAgICAJMTA3KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCQluYW1lICAgICAgIAkibWF4Ig0KLQkJCQl2YWx1ZSAgICAgIAkxMDgpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJCW5hbWUgICAgICAgCSIobm9uZSkiDQotCQkJCXZhbHVlICAgICAgCTEwOSkpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiR2VuZXJhdGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImtpbmQiDQotCQkJdmFsdWUgICAgICAJKCJUeXBlS2luZHMiIDEwOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJ1dWlkIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidmVyc2lvbiINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJkbGxuYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYWxpYXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX09wZXJhdGlvbiINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJIkdlbmVyYXRlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImhlbHBzdHJpbmciDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlcyINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJDT00iDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJHZW5lcmF0ZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiZmlsZW5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJsaWJyYXJ5Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkidXVpZCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJInZlcnNpb24iDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwc3RyaW5nIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkNPTSINCi0JCQluYW1lICAgICAgIAkiaGVscGZpbGUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJoZWxwY29udGV4dCINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImxjaWQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiQ09NIg0KLQkJCW5hbWUgICAgICAgCSJhdHRyaWJ1dGVzIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkNPTSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19QYXJhbSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJDT00iDQotCQkJbmFtZSAgICAgICAJImF0dHJpYnV0ZXMiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiQ09NIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmVyc2lvbiBDb250cm9sIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJInByb3BlcnR5SWQiDQotCQl2YWx1ZSAgICAgIAkiNzgzNjA2Mzc4IikNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0NsYXNzIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlTW9kZWwiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkluc3RhbmNpbmdTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHJpdmF0ZSINCi0JCQkJdmFsdWUgICAgICAJMjIxKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiUHVibGljTm90Q3JlYXRhYmxlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMTMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJTaW5nbGVVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxNCkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbFNpbmdsZVVzZSINCi0JCQkJdmFsdWUgICAgICAJMjE1KQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiTXVsdGlVc2UiDQotCQkJCXZhbHVlICAgICAgCTIxOSkNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIkdsb2JhbE11bHRpVXNlIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjApKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkJhc2VTZXQiDQotCQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiKG5vbmUpIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjIpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIwIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSIxIg0KLQkJCQl2YWx1ZSAgICAgIAkyMjQpKSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkJhc2UiDQotCQkJdmFsdWUgICAgICAJKCJCYXNlU2V0IiAyMjIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiT3B0aW9uRXhwbGljaXQiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbkNvbXBhcmUiDQotCQkJdmFsdWUgICAgICAJKCJDb21wYXJlU2V0IiAyMDIpKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW5zdGFuY2luZyINCi0JCQl2YWx1ZSAgICAgIAkoIkluc3RhbmNpbmdTZXQiIDIxOSkpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJDb21wYXJlU2V0Ig0KLQkJCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQkJbmFtZSAgICAgICAJIihub25lKSINCi0JCQkJdmFsdWUgICAgICAJMjAyKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCQluYW1lICAgICAgIAkiQmluYXJ5Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDMpDQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJCW5hbWUgICAgICAgCSJUZXh0Ig0KLQkJCQl2YWx1ZSAgICAgIAkyMDQpKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTGlicmFyeU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJBbGlhc05hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJc1N0YXRpYyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUmVwbGFjZUV4aXN0aW5nQm9keSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkRlZmF1bHRCb2R5Ig0KLQkJCXZhbHVlICAgICAgCSh2YWx1ZSBUZXh0ICIiKSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fQXR0cmlidXRlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlByb2NlZHVyZUlEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvcGVydHlOYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiU3Vic2NyaXB0Ig0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19Sb2xlIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiVXBkYXRlQ29kZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiTmV3Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiV2l0aEV2ZW50cyINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIkZ1bGxOYW1lIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUHJvY2VkdXJlSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9wZXJ0eU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJTdWJzY3JpcHQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0luaGVyaXQiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBsZW1lbnRzRGVsZWdhdGlvbiINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiRnVsbE5hbWUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX1BhcmFtIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiQnlWYWwiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJCeVJlZiINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIk9wdGlvbmFsIg0KLQkJCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiUGFyYW1BcnJheSINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJQcm9qZWN0RmlsZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZUNvZGUiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJWaXN1YWwgQmFzaWMiDQotCQkJbmFtZSAgICAgICAJIlVwZGF0ZU1vZGVsIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJJbXBvcnRSZWZlcmVuY2VzIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiVmlzdWFsIEJhc2ljIg0KLQkJCW5hbWUgICAgICAgCSJRdWlja0ltcG9ydCINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCQluYW1lICAgICAgIAkiSW1wb3J0QmluYXJ5Ig0KLQkJCXZhbHVlICAgICAgCUZBTFNFKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbCBCYXNpYyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlZpc3VhbFN0dWRpbyINCi0JCW5hbWUgICAgICAgCSJIaWRkZW5Ub29sIg0KLQkJdmFsdWUgICAgICAJRkFMU0UpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIldlYiBNb2RlbGVyIg0KLQkJbmFtZSAgICAgICAJIkhpZGRlblRvb2wiDQotCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJwcm9wZXJ0eUlkIg0KLQkJdmFsdWUgICAgICAJIjgwOTEzNTk2NiIpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUHJvamVjdCINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDcmVhdGVNaXNzaW5nRGlyZWN0b3JpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFZGl0b3IiDQotCQkJdmFsdWUgICAgICAJKCJFZGl0b3JUeXBlIiAxMDApKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIlN0b3BPbkVycm9yIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRWRpdG9yVHlwZSINCi0JCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCQluYW1lICAgICAgIAkiQnVpbHRJbiINCi0JCQkJdmFsdWUgICAgICAJMTAwKQ0KLQkJCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQkJbmFtZSAgICAgICAJIldpbmRvd3NTaGVsbCINCi0JCQkJdmFsdWUgICAgICAJMTAxKSkpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJFbnRpdHlfU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRW50aXR5X1B1YmxpY0lEIg0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQkJbmFtZSAgICAgICAJIk5vdGF0aW9uVmFsdWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiSW50ZXJuYWxWYWx1ZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJQYXJhbWV0ZXJFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRXh0ZXJuYWxFbnRpdHkiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fU3lzdGVtSUQiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiTm90YXRpb25fUHVibGljSUQiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19BdHRyaWJ1dGUiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiRGVmYXVsdERlY2xUeXBlIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fTW9kdWxlLVNwZWMiDQotCQl2YWx1ZSAgICAgIAkobGlzdCBBdHRyaWJ1dGVfU2V0DQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiWE1MX0RURCINCi0JCQluYW1lICAgICAgIAkiQXNzaWduIEFsbCINCi0JCQl2YWx1ZSAgICAgIAlGQUxTRSkNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJYTUxfRFREIg0KLQkJCW5hbWUgICAgICAgCSJDb21wb25lbnRQYXRoIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIlhNTF9EVEQiDQotCQluYW1lICAgICAgIAkiSGlkZGVuVG9vbCINCi0JCXZhbHVlICAgICAgCUZBTFNFKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DYXRlZ29yeSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicGFja2FnZU5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJIm5zUHJlZml4Ig0KLQkJCXZhbHVlICAgICAgCSIiKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJuc1VSSSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYmFzZVBhY2thZ2UiDQotCQkJdmFsdWUgICAgICAJIiIpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJInByZWZpeCINCi0JCQl2YWx1ZSAgICAgIAkiIikpKQ0KLQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCXRvb2wgICAgICAgCSJFY29yZSINCi0JCW5hbWUgICAgICAgCSJkZWZhdWx0X19DbGFzcyINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiY2xhc3NpZmllck5hbWUiDQotCQkJdmFsdWUgICAgICAJIiIpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fT3BlcmF0aW9uIg0KLQkJdmFsdWUgICAgICAJKGxpc3QgQXR0cmlidXRlX1NldA0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJvcGVyYXRpb25OYW1lIg0KLQkJCXZhbHVlICAgICAgCSIiKSkpDQotCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJbmFtZSAgICAgICAJImRlZmF1bHRfX0F0dHJpYnV0ZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiYXR0cmlidXRlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVW5pcXVlIg0KLQkJCXZhbHVlICAgICAgCVRSVUUpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzSUQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpKSkNCi0JICAgIChvYmplY3QgQXR0cmlidXRlDQotCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQluYW1lICAgICAgIAkiZGVmYXVsdF9fUm9sZSINCi0JCXZhbHVlICAgICAgCShsaXN0IEF0dHJpYnV0ZV9TZXQNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkicmVmZXJlbmNlTmFtZSINCi0JCQl2YWx1ZSAgICAgIAkiIikNCi0JCSAgICAob2JqZWN0IEF0dHJpYnV0ZQ0KLQkJCXRvb2wgICAgICAgCSJFY29yZSINCi0JCQluYW1lICAgICAgIAkiaXNUcmFuc2llbnQiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzVm9sYXRpbGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzQ2hhbmdlYWJsZSINCi0JCQl2YWx1ZSAgICAgIAlUUlVFKQ0KLQkJICAgIChvYmplY3QgQXR0cmlidXRlDQotCQkJdG9vbCAgICAgICAJIkVjb3JlIg0KLQkJCW5hbWUgICAgICAgCSJpc1Vuc2V0dGFibGUiDQotCQkJdmFsdWUgICAgICAJRkFMU0UpDQotCQkgICAgKG9iamVjdCBBdHRyaWJ1dGUNCi0JCQl0b29sICAgICAgIAkiRWNvcmUiDQotCQkJbmFtZSAgICAgICAJImlzUmVzb2x2ZVByb3hpZXMiDQotCQkJdmFsdWUgICAgICAJVFJVRSkpKSkNCi0JcXVpZCAgICAgICAJIjNBMEM3NUY0MDFGQSIpKQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGVlNTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2FueS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2FueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTdkOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGJiN2I0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NWViNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGVfbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMmNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZjQ4ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9yZWYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X3JlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFjZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X3JlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VtcHR5Y29udGVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VtcHR5Y29udGVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOGU2NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbXB0eWNvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTkxODg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBiMjZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxYzEzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiMmNhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZmxkcl9ub3QuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX25vdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MDk2NjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX25vdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfdW5yZWMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mbGRyX3VucmVjLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZkODJlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZsZHJfdW5yZWMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfYXR0bGlzdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODQ5Yzc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2NvbW1lbnRzX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2ZvbGRlcl9jb21tZW50c19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWYwOTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2NvbW1lbnRzX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjU0NzAyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvZ2VuaHRtZm9ybV93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U5ZGY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L25vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjk0YzI2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZWNob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxM2JhMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVjaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjJiMzU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3JlY2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYzOThjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZWNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZW9ybW9yZXNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFkYjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb25lb3Jtb3Jlc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vbmVzZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZXNlcXVlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5NjU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29uZXNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDIyZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L29wdGlvbmFsY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRmOWJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxjaG9pY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZDUyODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbHNlcXVlbmNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdHh0ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhN2EzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3VucmVjb2duaXplZF9jb250ZW50LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTg5OTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvdW5yZWNvZ25pemVkX2NvbnRlbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZjUxNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3JlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVjaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFjMTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL2ljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZWNob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVzZXF1ZW5jZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9pY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVzZXF1ZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZDRjYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvaWNvbnMvZnVsbC9vYmoxNi96ZXJvb3Jtb3Jlc2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1NTdkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9U3RydWN0dXJlZCBTb3VyY2UgRFREIENvcmUKLSMKLVN0cnVjdHVyZWRfRFREX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBEVEQgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLURURF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1EVEQKLV9EVERfVkFMSURBVE9SX05BTUUgICAgICAgICAgICAgICA9IERURCBWYWxpZGF0b3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmIwZWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yRFREIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRhc2tzY2FubmVyIj4KLQkJPHNjYW5uZXIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGFza3MuRFRERmlsZVRhc2tTY2FubmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50YXNrcy5EVERGaWxlVGFza1NjYW5uZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfRFREX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudGVhbS5jb3JlLmZpbGVUeXBlcyI+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249ImR0ZCIgLz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ibW9kIiAvPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJlbnQiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJkdGQsbW9kLGVudCIKLQkJCXByaW9yaXR5PSJub3JtYWwiCi0JCQluYW1lPSIlRFREX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9ImR0ZHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnRleHQiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04Ij4KLQkJCTxkZXNjcmliZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmNvbnRlbnQuQ29udGVudERlc2NyaWJlckZvckRURCIgLz4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZXh0ZW5zaW9uX3BhcnNlciI+Ci0JCTxwYXJzZXIKLQkJCXR5cGU9ImR0ZCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLnV0aWwuRFREUmVzb3VyY2VGYWN0b3J5SW1wbCI+Ci0JCTwvcGFyc2VyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuZW1mLmVjb3JlLmV4dGVuc2lvbl9wYXJzZXIiPgotCQk8cGFyc2VyCi0JCQl0eXBlPSJlbnQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi51dGlsLkRURFJlc291cmNlRmFjdG9yeUltcGwiPgotCQk8L3BhcnNlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmVtZi5lY29yZS5nZW5lcmF0ZWRfcGFja2FnZSI+Ci0JCTxwYWNrYWdlCi0JCQl1cmk9IkRURC54bWkiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVtZi5pbXBsLkRURFBhY2thZ2VJbXBsIj4KLQkJPC9wYWNrYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmRvY3VtZW50RmFjdG9yaWVzIj4KLQkJPGZhY3RvcnkKLQkJCXR5cGU9ImR0ZCwgZW50LCBtb2QsIHhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnRGYWN0b3J5RFREIj4KLQkJPC9mYWN0b3J5PgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBpbml0aWFsaXplIGR0ZCBjb3JlIHByZWZlcmVuY2VzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcyI+Ci0JCTxpbml0aWFsaXplcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIERURCB2YWxpZGF0b3Igd2l0aCB0aGUgdmFsaWRhdGlvbiAJCS0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24KLQkJaWQ9ImR0ZERURFZhbGlkYXRvciIKLQkJbmFtZT0iJV9EVERfVkFMSURBVE9SX05BTUUiCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotCQk8dmFsaWRhdG9yPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQljYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLQkJCQluYW1lRmlsdGVyPSIqLmR0ZCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxoZWxwZXIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5IZWxwZXIiPgotCQkJPC9oZWxwZXI+Ci0JCQk8cnVuCi0gICAgICAgICBhc3luYz0idHJ1ZSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgIGVuYWJsZWQ9InRydWUiCi0gICAgICAgICBmdWxsQnVpbGQ9InRydWUiCi0gICAgICAgICBpbmNyZW1lbnRhbD0idHJ1ZSI+Ci0JCQk8L3J1bj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIERURCBhcyB5b3UgdHlwZSB2YWxpZGF0aW9uCQkJCQkJCQktLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0idG90YWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZS5WYWxpZGF0b3IiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5kdGRzb3VyY2V2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllcgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5ERUZBVUxUIj4KLQkJCQk8L3BhcnRpdGlvblR5cGU+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0F0dE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0F0dE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg2ZGRmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHROb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXR0Tm9kZSB7Ci0JLy8KLQkvLyBhdHRUeXBlCi0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDREFUQSA9IDAsIElEID0gMSwgSURSRUYgPSAyLCBJRFJFRlMgPSAzLCBFTlRJVFkgPSA0LCBFTlRJVElFUyA9IDUsIE5NVE9LRU4gPSA2LCBOTVRPS0VOUyA9IDcsIE5PVEFUSU9OID0gOCwgRU5VTUVSQVRJT04gPSA5LCBQRVJFRkVSRU5DRSA9IDEwOwotCi0JLy8KLQkvLyBLZWVwIHRoaXMgYXJyYXkgaW4tc3luYyB3aXRoIHRoZSBBVFRUWVBFIGRlZmluaXRpb25zCi0JLy8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBmZ0F0dFR5cGVTdHJpbmcgPSB7IkNEQVRBIiwgLy8gMCAvLyROT04tTkxTLTEkCi0JCQkJIklEIiwgLy8gMSAvLyROT04tTkxTLTEkCi0JCQkJIklEUkVGIiwgLy8gMiAvLyROT04tTkxTLTEkCi0JCQkJIklEUkVGUyIsIC8vIDMgLy8kTk9OLU5MUy0xJAotCQkJCSJFTlRJVFkiLCAvLyA0IC8vJE5PTi1OTFMtMSQKLQkJCQkiRU5USVRJRVMiLCAvLyA1IC8vJE5PTi1OTFMtMSQKLQkJCQkiTk1UT0tFTiIsIC8vIDYgLy8kTk9OLU5MUy0xJAotCQkJCSJOTVRPS0VOUyIsIC8vIDcgLy8kTk9OLU5MUy0xJAotCQkJCSJOT1RBVElPTiIsIC8vIDggLy8kTk9OLU5MUy0xJAotCQkJCSJFTlVNRVJBVElPTiIsIC8vIDkgKHJlcGxhY2VkIHdpdGggIk5NVE9LRU4iIGJ5IFNBWCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCS8vIEF0dHJpYnV0ZUxpc3QgaGFuZGxlcikKLQkJCQkiJUVOVElUWVJFRkVSRU5DRTsifTsgLy8kTk9OLU5MUy0xJAotCi0JLy8KLQkvLyBhdHREZWZhdWx0VHlwZQotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9GSVhFRCA9IDEsIC8vIEF0dFZhbHVlCi0JCQkJUkVRVUlSRUQgPSAyLCAvLyAjUkVRVUlSRUQKLQkJCQlJTVBMSUVEID0gMywgLy8gI0lNUExJRUQKLQkJCQlGSVhFRCA9IDQ7IC8vICNGSVhFRCBBdHRWYWx1ZQotCi0JcHVibGljIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwdWJsaWMgU3RyaW5nIHR5cGUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFR5cGUgPSBudWxsOwotCXB1YmxpYyBTdHJpbmcgZGVmYXVsdFZhbHVlID0gbnVsbDsKLQlwdWJsaWMgVmVjdG9yIGVudW1MaXN0ID0gbnVsbDsgLy8gbGlzdCBvZiBOb3RhdGlvbnMgb3IgRW51bSB2YWx1ZXMKLQotCXB1YmxpYyBpbnQgZ2V0RGVjbGFyZWRUeXBlKCkgewotCQlpbnQgdCA9IC0xOwotCQlpZiAodHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIHQ7Ci0KLQkJaWYgKHR5cGUuc3RhcnRzV2l0aCgiJSIpICYmIHR5cGUuZW5kc1dpdGgoIjsiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gUEVSRUZFUkVOQ0U7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmZ0F0dFR5cGVTdHJpbmcubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0eXBlLmVxdWFscyhmZ0F0dFR5cGVTdHJpbmdbaV0pKSB7Ci0JCQkJdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHQ7Ci0JfQotCi0JcHVibGljIEVudW1lcmF0aW9uIGVsZW1lbnRzKCkgewotCQlpZiAoZW51bUxpc3QgPT0gbnVsbCkKLQkJCWVudW1MaXN0ID0gbmV3IFZlY3RvcigpOwotCQlyZXR1cm4gZW51bUxpc3QuZWxlbWVudHMoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldERlZmF1bHRUeXBlKCkgewotCQlpZiAoZGVmYXVsdFR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAoZGVmYXVsdFR5cGUuc3RhcnRzV2l0aCgiJSIpICYmIGRlZmF1bHRUeXBlLmVuZHNXaXRoKCI7IikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJcmV0dXJuIFBFUkVGRVJFTkNFOwotCQllbHNlIGlmIChkZWZhdWx0VHlwZS5lcXVhbHMoIiNSRVFVSVJFRCIpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gUkVRVUlSRUQ7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI0lNUExJRUQiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIElNUExJRUQ7Ci0JCWVsc2UgaWYgKGRlZmF1bHRUeXBlLmVxdWFscygiI0ZJWEVEIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBGSVhFRDsKLQkJZWxzZQotCQkJcmV0dXJuIE5PRklYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJBdHQgTmFtZTogIiArIG5hbWUgKyAiIFR5cGU6ICIgKyB0eXBlICsgIiBkZWZhdWx0VHlwZTogIiArIGRlZmF1bHRUeXBlICsgIiBkZWZhdWx0VmFsdWU6ICIgKyBkZWZhdWx0VmFsdWU7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9BdHRsaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MmU0MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQXR0bGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBdHRsaXN0IGV4dGVuZHMgQmFzZU5vZGUgewotCVZlY3RvciBhdHREZWZzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoaXMgYXR0cmlidXRlIGxpc3QncyBuYW1lOyB0aGlzIHZhbHVlIGlzIGFsc28ga25vd24gYXMgdGhlCi0JICogICAgICAgICAgICBFbGVtZW50IHR5cGUuCi0JICovCi0JcHVibGljIEF0dGxpc3QoU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCkgewotCQl0aGlzKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQXR0bGlzdChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgY29tbWVudCwgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSkgewotCQlzdXBlcihuYW1lLCBvd25lckRURCwgY29tbWVudCwgZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQotCS8qKgotCSAqIEFkZHMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZGVmaW5pdGlvbiB0byB0aGUgZW5kIG9mIHRoaXMgYXR0cmlidXRlCi0JICogbGlzdCAuCi0JICogCi0JICogQHBhcmFtIGF0dERlZgotCSAqICAgICAgICAgICAgQXR0cmlidXRlIGRlZmluaXRpb24gdG8gYWRkIHRvIHRoaXMgYXRyaWJ1dGUgbGlzdC4KLQkgKiBAcmV0dXJuID10cnVlIGlmIHRoZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IGluCi0JICogICAgICAgICB0aGlzIGF0dHJpYnV0ZSBsaXN0OyBvdGhlcndpc2UsID1mYWxzZS4KLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNjb250YWlucwotCSAqIEBzZWUgI3NpemUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRFbGVtZW50KEF0dE5vZGUgYXR0RGVmKSB7Ci0JCWlmIChjb250YWlucyhhdHREZWYubmFtZSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXRoaXMuYXR0RGVmcy5hZGRFbGVtZW50KGF0dERlZik7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIGF0IHRoZSBzcGVjaWZpZWQgPHZhcj5pbmRleDwvdmFyPiBpbgotCSAqIHRoaXMgYXR0cmlidXRlIGxpc3QKLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIEluZGV4IGludG8gdGhpcyBsaXN0IG9mIGF0dHJpYnV0ZSBkZWZpbml0aW9ucy4KLQkgKiBAcmV0dXJuIEF0dHJpYnV0ZSBkZWZpbml0aW9uIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXgsIG9yIDx2YXI+bnVsbDwvdmFyPgotCSAqICAgICAgICAgaWYgYW4gaW52YWxpZCBpbmRleC4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjY29udGFpbnMKLQkgKiBAc2VlICNzaXplCi0JICovCi0JcHVibGljIEF0dE5vZGUgZWxlbWVudEF0KGludCBpbmRleCkgewotCQlyZXR1cm4gKEF0dE5vZGUpIHRoaXMuYXR0RGVmcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZQotCSAqIGRlZmluaXRpb24gbmFtZSBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBhdHREZWZOYW1lCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgZGVmaW5pdGlvbiBuYW1lIHRvIG1hdGNoIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogQHJldHVybiBUaGUgbWF0Y2hpbmcgYXR0cmlidXRlIGRlZmluaXRpb24sIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiB0aGUKLQkgKiAgICAgICAgIGF0dHJpYnV0ZSBpcyBub3QgY3VycmVudGx5IGRlZmluZWQuCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2NvbnRhaW5zCi0JICogQHNlZSAjc2l6ZQotCSAqIEBzZWUgI2VsZW1lbnRzCi0JICovCi0JcHVibGljIEF0dE5vZGUgZ2V0QXR0RGVmKFN0cmluZyBhdHREZWZOYW1lKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLQkJCUF0dE5vZGUgYWQgPSBlbGVtZW50QXQoaSk7Ci0JCQlpZiAoYXR0RGVmTmFtZS5lcXVhbHMoYWQubmFtZSkpCi0JCQkJcmV0dXJuIGFkOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBkZWZpbml0aW9uIG5hbWUgaXMgY3VycmVudGx5Ci0JICogZGVmaW5lZCBpbiB0aGlzIGF0dHJpYnV0ZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSBhdHREZWZOYW1lCi0JICogICAgICAgICAgICBBdHRyaWJ1dGUgZGVmaW5pdGlvbiBuYW1lIHRvIG1hdGNoIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogQHJldHVybiA9dHJ1ZSBpZiA8dmFyPmF0dERlZk5hbWU8L3Zhcj4gaXMgZGVmaW5lZDsgb3RoZXJ3aXNlLCA9ZmFsc2UuCi0JICogQHNlZSAjYWRkRWxlbWVudAotCSAqIEBzZWUgI2VsZW1lbnRBdAotCSAqIEBzZWUgI2dldEF0dERlZgotCSAqIEBzZWUgI3NpemUKLQkgKiBAc2VlICNlbGVtZW50cwotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBhdHREZWZOYW1lKSB7Ci0JCXJldHVybiBudWxsICE9IGdldEF0dERlZihhdHREZWZOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXR0cmlidXRlIGRlZmluaXRpb25zIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCi0JICogCi0JICogQHJldHVybiBOdW1iZXIgb2YgYXR0cmlidXRlIGxpc3QgZGVmaW5pdGlvbnMsIG9yIDx2YXI+bnVsbDwvdmFyPiBpZiBubwotCSAqICAgICAgICAgZGVmaW5pdGlvbnMgZGVmaW5lZC4KLQkgKiBAc2VlICNhZGRFbGVtZW50Ci0JICogQHNlZSAjZWxlbWVudEF0Ci0JICogQHNlZSAjZ2V0QXR0RGVmCi0JICogQHNlZSAjY29udGFpbnMKLQkgKi8KLQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCXJldHVybiB0aGlzLmF0dERlZnMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gb2YgYWxsIGF0dHJpYnV0ZSBkZWZpbml0aW9ucyBpbiB0aGlzIGF0dHJpYnV0ZQotCSAqIGxpc3QuCi0JICogCi0JICogQHJldHVybiBBbiBlbnVtZXJhdGlvbiBvZiBhbGwgYXR0cmlidXRlIGRlZmluaXRpb25zLCBvciA8dmFyPm51bGw8L3Zhcj4KLQkgKiAgICAgICAgIGlmIG5vbmUgc3BlY2lmaWVkLgotCSAqIEBzZWUgI2FkZEVsZW1lbnQKLQkgKiBAc2VlICNlbGVtZW50QXQKLQkgKiBAc2VlICNnZXRBdHREZWYKLQkgKiBAc2VlICNjb250YWlucwotCSAqIEBzZWUgI3NpemUKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCXJldHVybiB0aGlzLmF0dERlZnMuZWxlbWVudHMoKTsKLQl9Ci0KLQl2b2lkIHNldEF0dERlZnMoVmVjdG9yIGF0dHJzKSB7Ci0JCWF0dERlZnMgPSBhdHRyczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9CYXNlTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQmFzZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0NGIzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9CYXNlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByb3RlY3RlZCBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkvLyBwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBjb21tZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RyaW5nIG93bmVyRFREID0gbnVsbDsKLQotCS8qKiBEZWZhdWx0IGNvbnN0cnVjdG9yLiAqLwotCXB1YmxpYyBCYXNlTm9kZShTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXRoaXMobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBCYXNlTm9kZShTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgY29tbWVudCwgRXJyb3JNZXNzYWdlIGVycm9yTWVzc2FnZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCQl0aGlzLm93bmVyRFREID0gb3duZXJEVEQ7Ci0JCXRoaXMuY29tbWVudCA9IGNvbW1lbnQ7Ci0JCXRoaXMuZXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vZGVOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRPd25lckRURCgpIHsKLQkJcmV0dXJuIG93bmVyRFREOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE93bmVyRFREKFN0cmluZyBvd25lcikgewotCQlvd25lckRURCA9IG93bmVyOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKLQkJcmV0dXJuIGNvbW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29tbWVudChTdHJpbmcgY29tbWVudCkgewotCQl0aGlzLmNvbW1lbnQgPSBjb21tZW50OwotCX0KLQotCXB1YmxpYyBFcnJvck1lc3NhZ2UgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVycm9yTWVzc2FnZShFcnJvck1lc3NhZ2UgbWVzc2FnZSkgewotCQllcnJvck1lc3NhZ2UgPSBtZXNzYWdlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01CYXNpY05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNQmFzaWNOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzBmZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01CYXNpY05vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ01CYXNpY05vZGUgZXh0ZW5kcyBDTU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkVNUFRZOyAvLyBwb3NzaWJsZSB0eXBlcyA6Ci0KLQkvLyBDTU5vZGVUeXBlLkVNUFRZCi0JLy8gQ01Ob2RlVHlwZS5BTlkKLQkvLyBDTU5vZGVUeXBlLlBDREFUQQotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIENNQmFzaWNOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCX0KLQotCXB1YmxpYyBDTUJhc2ljTm9kZShTdHJpbmcgcmVmTmFtZSwgaW50IHR5cGUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICIgQmFzaWNOb2RlTmFtZTogIiArIGdldE5hbWUoKSArICIgVHlwZTogIiArIGdldFR5cGUoKSArICJcbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNR3JvdXBOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyM2IyY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Hcm91cE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLXB1YmxpYyBjbGFzcyBDTUdyb3VwTm9kZSBleHRlbmRzIENNUmVwZWF0YWJsZU5vZGUgewotCXByaXZhdGUgaW50IHR5cGUgPSBDTU5vZGVUeXBlLkdST1VQOwotCXByaXZhdGUgaW50IGdyb3VwS2luZCA9IENNTm9kZVR5cGUuR1JPVVBfU0VRVUVOQ0U7Ci0JcHJpdmF0ZSBWZWN0b3IgY2hpbGRyZW4gPSBuZXcgVmVjdG9yKCk7Ci0KLQlwdWJsaWMgQ01Hcm91cE5vZGUoKSB7Ci0JCXN1cGVyKCJHUk9VUCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvLyBpbXBsZW1lbnQgc3VwZXIgY2xhc3MKLQlwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKSB7Ci0JCS8vIGNhbid0IGNoYW5nZSAtIG9ubHkgb25lIHR5cGUgYWxsb3dzCi0JfQotCi0JcHVibGljIGludCBnZXRHcm91cEtpbmQoKSB7Ci0JCXJldHVybiBncm91cEtpbmQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JvdXBLaW5kKGludCBraW5kKSB7Ci0JCWdyb3VwS2luZCA9IGtpbmQ7Ci0JfQotCi0JcHVibGljIFZlY3RvciBnZXRDaGlsZHJlbigpIHsKLQkJcmV0dXJuIGNoaWxkcmVuOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENoaWxkKENNTm9kZSBjaGlsZCkgewotCQljaGlsZHJlbi5hZGRFbGVtZW50KGNoaWxkKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gIkdyb3VwICggLSBraW5kOiAiICsgZ2V0R3JvdXBLaW5kKCkgKyAiIE9jY1R5cGU6ICIgKyBnZXRPY2N1cnJlbmNlKCkgKyAiXG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCi0JCUVudW1lcmF0aW9uIGVuID0gY2hpbGRyZW4uZWxlbWVudHMoKTsKLQkJd2hpbGUgKGVuLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlyZXN1bHQgKz0gIiAiICsgZW4ubmV4dEVsZW1lbnQoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcmVzdWx0ICs9ICJHcm91cCApIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ODJhMjdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGUgewotCXByaXZhdGUgU3RyaW5nIHJlZk5hbWU7Ci0KLQkvKiogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gKi8KLQlwdWJsaWMgQ01Ob2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXRoaXMucmVmTmFtZSA9IHJlZk5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gcmVmTmFtZTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgaW50IGdldFR5cGUoKTsKLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIHNldFR5cGUoaW50IHR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTU5vZGVUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlODVkYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01Ob2RlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlVHlwZSB7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgRU1QVFkgPSAxOwotCXN0YXRpYyBwdWJsaWMgaW50IEFOWSA9IDI7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgUENEQVRBID0gMzsKLQlzdGF0aWMgcHVibGljIGludCBFTEVNRU5UX1JFRkVSRU5DRSA9IDQ7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgRU5USVRZX1JFRkVSRU5DRSA9IDU7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgR1JPVVAgPSA2OwotCi0Jc3RhdGljIHB1YmxpYyBpbnQgT05FID0gNzsKLQlzdGF0aWMgcHVibGljIGludCBPUFRJT05BTCA9IDg7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgT05FX09SX01PUkUgPSA5OwotCXN0YXRpYyBwdWJsaWMgaW50IFpFUk9fT1JfTU9SRSA9IDEwOwotCi0Jc3RhdGljIHB1YmxpYyBpbnQgR1JPVVBfQ0hPSUNFID0gMTE7Ci0Jc3RhdGljIHB1YmxpYyBpbnQgR1JPVVBfU0VRVUVOQ0UgPSAxMjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvQ01SZWZlcmVuY2VOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlZmVyZW5jZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI1OWI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlZmVyZW5jZU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQ01SZWZlcmVuY2VOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0JcHJpdmF0ZSBpbnQgdHlwZSA9IENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0U7Ci0KLQlwdWJsaWMgQ01SZWZlcmVuY2VOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXRoaXMocmVmTmFtZSwgQ01Ob2RlVHlwZS5FTEVNRU5UX1JFRkVSRU5DRSk7Ci0JfQotCi0JcHVibGljIENNUmVmZXJlbmNlTm9kZShTdHJpbmcgcmVmTmFtZSwgaW50IHR5cGUpIHsKLQkJc3VwZXIocmVmTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIiBSZWZOYW1lOiAiICsgZ2V0TmFtZSgpICsgIiBUeXBlOiAiICsgZ2V0VHlwZSgpICsgIiBPY2NUeXBlOiAiICsgZ2V0T2NjdXJyZW5jZSgpICsgIlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVwZWF0YWJsZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0NNUmVwZWF0YWJsZU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2ZTExMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9DTVJlcGVhdGFibGVOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNUmVwZWF0YWJsZU5vZGUgZXh0ZW5kcyBDTU5vZGUgewotCXByaXZhdGUgaW50IG9jY1R5cGUgPSBDTU5vZGVUeXBlLk9ORTsKLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKFN0cmluZyByZWZOYW1lKSB7Ci0JCXN1cGVyKHJlZk5hbWUpOwotCX0KLQotCXB1YmxpYyBDTVJlcGVhdGFibGVOb2RlKFN0cmluZyByZWZOYW1lLCBpbnQgb2NjVHlwZSkgewotCQlzdXBlcihyZWZOYW1lKTsKLQkJdGhpcy5vY2NUeXBlID0gb2NjVHlwZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9jY3VycmVuY2UoKSB7Ci0JCXJldHVybiBvY2NUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE9jY3VycmVuY2UoaW50IG9jY1R5cGUpIHsKLQkJdGhpcy5vY2NUeXBlID0gb2NjVHlwZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4NmY5YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgRFREIHsKLQkvLwotCS8vIENvbnN0YW50cwotCS8vCi0KLQlWZWN0b3IgZXh0ZXJuYWxFbGVtZW50cyA9IG5ldyBWZWN0b3IoKTsKLQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQlib29sZWFuIGlzRXhjZXB0aW9uRHVyaW5nUGFyc2UgPSBmYWxzZTsKLQotCS8vCi0JLy8gQ29uc3RydWN0b3JzCi0JLy8KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLgotCSAqLwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBmaWxlIG5hbWUgb2YgdGhpcyBEVEQuCi0JICogQHNlZSAjZ2V0TmFtZQotCSAqIEBzZWUgI3NldE5hbWUKLQkgKi8KLQlwdWJsaWMgRFREKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIERURCdzIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoaXMgRFREJ3MgZmlsZSBuYW1lLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgbm8gbmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGlzIERURCdzIGZpbGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgVGhpcyBEVEQncyBuYW1lLgotCSAqIEBzZWUgI2dldE5hbWUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXRoaXMubmFtZSA9IG5hbWU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbiBFbnVtZXJhdGlvbiBpbnN0YW5jZSBvZiBhbGwgZXh0ZXJuYWwgc3Vic2V0IGNoaWxkcmVuIG9mIHRoaXMKLQkgKiBEVEQuCi0JICogCi0JICogQHJldHVybiBBbiBlbnVtZXJhdGlvbiBvZiBhbGwgZXh0ZXJuYWwgc3Vic2V0IGNoaWxkcmVuIG9mIHRoaXMgRFRELgotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBleHRlcm5hbEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZXh0ZXJuYWxFbGVtZW50cy5lbGVtZW50cygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERlY2woQmFzZU5vZGUgZGVjbCkgewotCQlleHRlcm5hbEVsZW1lbnRzLmFkZEVsZW1lbnQoZGVjbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXNFeGNlcHRpb25EdXJpbmdQYXJzZShib29sZWFuIG9uKSB7Ci0JCWlzRXhjZXB0aW9uRHVyaW5nUGFyc2UgPSBvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKCkgewotCQlyZXR1cm4gaXNFeGNlcHRpb25EdXJpbmdQYXJzZTsKLQl9Ci0KLX0gLy8gY2xhc3MgRFRECmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9EVERQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ0MjE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkxhenlVUkxJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcueG1sLnNheC5Db250ZW50SGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5EVERIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLWltcG9ydCBvcmcueG1sLnNheC5Mb2NhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi1wdWJsaWMgY2xhc3MgRFREUGFyc2VyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBDb250ZW50SGFuZGxlciwgRFRESGFuZGxlciwgRXJyb3JIYW5kbGVyLCBEZWNsSGFuZGxlciwgTGV4aWNhbEhhbmRsZXIgewotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGRlY2xTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ2Fub25pY2FsIG91dHB1dC4gKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5vbmljYWw7Ci0KLQlwcm90ZWN0ZWQgWE1MUmVhZGVyIHJlYWRlcjsKLQlpbnQgZW50aXR5RGVwdGg7Ci0KLQkvLyBkbXcgMTEvMTUgcHJpdmF0ZSBmaWVsZCBuZXZlciByZWFkIGxvY2FsbHkKLQkvLyBwcml2YXRlIFZlY3RvciBkZWNsRWxlbWVudHM7Ci0JcHJpdmF0ZSBTdHJpbmcgY29tbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZXJyb3JNZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcml2YXRlIERlY2xOb2RlIHByZXZpb3VzRGVjbE5vZGUgPSBudWxsOwotCXByaXZhdGUgRGVjbE5vZGUgY3VycmVudERlY2xOb2RlID0gbnVsbDsKLQlwcml2YXRlIEJhc2VOb2RlIGxhc3RCYXNlTm9kZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW50aXR5RW5kID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgbGluZU51bWJlcjsKLQotCXByaXZhdGUgRFREIGN1cnJlbnREVEQgPSBudWxsOwotCXByaXZhdGUgVmVjdG9yIGR0ZExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQlwcml2YXRlIFN0YWNrIGR0ZFN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdGFjayBwZVJlZlN0YWNrID0gbmV3IFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdGFjayBwYXJzaW5nUEVSZWZTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHJpdmF0ZSBFbnRpdHlQb29sIGVudGl0eVBvb2wgPSBuZXcgRW50aXR5UG9vbCgpOwotCXByaXZhdGUgU3RyaW5nIGV4cGFuZGVkRW50aXR5VmFsdWUgPSBudWxsOwotCXByaXZhdGUgSGFzaHRhYmxlIGVsZW1lbnRQb29sID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JYm9vbGVhbiBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9IGZhbHNlOwotCXByb3RlY3RlZCBib29sZWFuIGV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSB0cnVlOwotCi0JcHJpdmF0ZSBMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotCi0JcHJpdmF0ZSBMb2NhdG9yIGdldExvY2F0b3IoKSB7Ci0JCXJldHVybiBsb2NhdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50TG9jYXRvcihMb2NhdG9yIGxvY2F0b3IpIHsKLQkJdGhpcy5sb2NhdG9yID0gbG9jYXRvcjsKLQl9Ci0KLQlwdWJsaWMgRFREUGFyc2VyKGJvb2xlYW4gY2Fub25pY2FsKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCXRoaXMobnVsbCwgY2Fub25pY2FsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFREUGFyc2VyKFN0cmluZyBlbmNvZGluZywgYm9vbGVhbiBjYW5vbmljYWwpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLQotCQlpZiAoZW5jb2RpbmcgPT0gbnVsbCkKLQkJCWVuY29kaW5nID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCi0JCXRoaXMuY2Fub25pY2FsID0gY2Fub25pY2FsOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHNwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0JCQlyZWFkZXIgPSBzcGFyc2VyLmdldFhNTFJlYWRlcigpOwotCQkJcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvbGV4aWNhbC1oYW5kbGVyIiwgdGhpcyk7IC8vJE5PTi1OTFMtMSQKLQkJCXJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXREVERIYW5kbGVyKHRoaXMpOwotCQkJcmVhZGVyLnNldEVycm9ySGFuZGxlcih0aGlzKTsKLQkJCXJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcih0aGlzKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCX0KLQotCS8qIFByaW50cyB0aGUgb3V0cHV0IGZyb20gdGhlIFNBWCBjYWxsYmFja3MuICovCi0JcHVibGljIHZvaWQgcGFyc2UoU3RyaW5nIGxvZ2ljYWxVUkkpIHsKLQkJdHJ5IHsJCQkKLQkJCS8vIENTIGVuc3VyZSB0aGF0IHRoZSBwaHlzaWNhbCBVUkkgaXMgY29uc2lkZXJlZCB3aGVyZSBzdHJlYW1zIGFyZSByZXF1aXJlZAotCQkJLy8gYW5kIHRoZSBsb2dpY2FsVVJJIGlzIHVzZWQgYXMgdGhlIERURCdzIGJhc2VMb2NhdGlvbgotCQkJU3RyaW5nIHBoeXNpY2FsVVJJID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigiIiwgIiIsIGxvZ2ljYWxVUkkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWJvb2xlYW4gaXNSZWFkYWJsZSA9IFVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHBoeXNpY2FsVVJJLCB0cnVlKTsKLQkJCWlmICghaXNSZWFkYWJsZSkgewotCQkJCXRocm93IG5ldyBFeGNlcHRpb24oIkRURCBwYXJzZSBlcnJvci4gQ2FuIG5vdCByZWFkIHRoZSBzcGVjaWZpZWQgVVJJIDogIiArIGxvZ2ljYWxVUkkpOyAvLyROT04tTkxTLTEkCi0JCQl9CQkJCi0JCQlTdHJpbmcgZG9jdW1lbnQgPSAiPCFET0NUWVBFIHJvb3QgU1lTVEVNIFwiIiArIGxvZ2ljYWxVUkkgKyAiXCI+PHJvb3QvPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJZW50aXR5RGVwdGggPSAwOwotCQkJY3VycmVudERURCA9IG5ldyBEVEQobG9naWNhbFVSSSk7Ci0JCQlJbnB1dFNvdXJjZSBpbnB1dFNvdXJjZSA9IG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKGRvY3VtZW50KSk7Ci0JCQlpbnB1dFNvdXJjZS5zZXRTeXN0ZW1JZChsb2dpY2FsVVJJICsgIi54bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsKLQkJfQotCQljYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gc2UpIHsKLQkJCWlmIChjdXJyZW50RFREICE9IG51bGwpCi0JCQkJY3VycmVudERURC5zZXRJc0V4Y2VwdGlvbkR1cmluZ1BhcnNlKHRydWUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJaWYgKGN1cnJlbnREVEQgIT0gbnVsbCkKLQkJCQljdXJyZW50RFRELnNldElzRXhjZXB0aW9uRHVyaW5nUGFyc2UodHJ1ZSk7Ci0JCX0KLQotCX0KLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgRW50aXR5IHJlZmVyZW5jZXMgYXJlIGFsd2F5cyBleHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcykgewotCQl0aGlzLmV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSB0cnVlOwotCX0KLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgRW50aXR5IHJlZmVyZW5jZXMgYXJlIGFsd2F5cyBleHBhbmRlZC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gZXhwYW5kRW50aXR5UmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgVmVjdG9yIGdldERURExpc3QoKSB7Ci0JCXJldHVybiBkdGRMaXN0OwotCX0KLQotCXB1YmxpYyBIYXNodGFibGUgZ2V0RWxlbWVudFBvb2woKSB7Ci0JCXJldHVybiBlbGVtZW50UG9vbDsKLQl9Ci0KLQlwdWJsaWMgRW50aXR5UG9vbCBnZXRFbnRpdHlQb29sKCkgewotCQlyZXR1cm4gZW50aXR5UG9vbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFcnJvck1lc3NhZ2VzKCkgewotCQlyZXR1cm4gZXJyb3JNZXNzYWdlczsKLQl9Ci0KLQkvLwotCS8vIERvY3VtZW50SGFuZGxlciBtZXRob2RzCi0JLy8KLQotCXB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvY2Vzc2luZ0luc3RydWN0aW9uKFN0cmluZyB0YXJnZXQsIFN0cmluZyBkYXRhKSB7Ci0JfQotCi0JLy8KLQkvLyBEVERIYW5kbGVyIG1ldGhvZHMKLQkvLwotCi0JcHVibGljIHZvaWQgdW5wYXJzZWRFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIG5vdGF0aW9uTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90YXRpb25EZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCXN0YXJ0RGVjbGFyYXRpb24oRGVjbE5vZGUuTk9UQVRJT04pOwotCQlkZWNsU3RyaW5nID0gIjwhTk9UQVRJT04iOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAxIHx8IHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSB7Ci0JCQlTdHJpbmcgeHMgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCXhzICs9IG5hbWU7Ci0JCQlpZiAocHVibGljSWQgPT0gbnVsbCkKLQkJCQl4cyArPSAiIFNZU1RFTSAiICsgIlwiIiArIHN5c3RlbUlkICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCWVsc2UKLQkJCQl4cyArPSAiIFBVQkxJQyAiICsgIlwiIiArIHB1YmxpY0lkICsgIlwiICIgKyAiXCIiICsgc3lzdGVtSWQgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCQl9Ci0JfQotCi0JLy8KLQkvLyBEZWNsSGFuZGxlciBtZXRob2RzCi0JLy8KLQotCXB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZWwpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLkVMRU1FTlQpOwotCQlkZWNsU3RyaW5nID0gIjwhRUxFTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBLQjogV2l0aCBlYXJseSB2ZXJzaW9ucyBvZiBYZXJjZXMgMi54LCBzdGFydEVudGl0eSgiW2R0ZF0iKSB1c2VkIHRvCi0JCS8vIGJlIGNhbGxlZCBiZWZvcmUgdGhpcyBtZXRob2QKLQkJLy8gc28gZW50aXR5RGVwdGggd2FzIDEuIFVzaW5nIEpBWFAgY2hhbmdlZCB0aGF0IGFuZCBzdGFydEVudGl0eSgpIGlzCi0JCS8vIG5vdCBjYWxsZWQgYmFjayBhbnltb3JlLgotCQkvLyBCZWNhdXNlIG9mIHRoaXMsIHdlIG5lZWQgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIGVudGl0eURlcHRoID09IDAKLQkJLy8gYXMgd2VsbC4KLQkJaWYgKGVudGl0eURlcHRoID09IDAgfHwgZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkKLQkJCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uSGVscGVyKG5hbWUgKyAiICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZVN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKFN0cmluZyBlTmFtZSwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlRGVmYXVsdCwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5BVFRMSVNUKTsKLQkJZGVjbFN0cmluZyA9ICI8IUFUVExJU1QiOyAvLyROT04tTkxTLTEkCi0KLQkJYXR0cmlidXRlU3RyaW5nICs9ICIgIiArIGFOYW1lOyAvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVTdHJpbmcgKz0gIiAiICsgdHlwZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodmFsdWVEZWZhdWx0ICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVTdHJpbmcgKz0gIiAiICsgdmFsdWVEZWZhdWx0OyAvLyROT04tTkxTLTEkCi0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJYXR0cmlidXRlU3RyaW5nICs9ICIgJyIgKyB2YWx1ZSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJYXR0cmlidXRlU3RyaW5nID0gZU5hbWUgKyAiICIgKyBhdHRyaWJ1dGVTdHJpbmcgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihhdHRyaWJ1dGVTdHJpbmcpOwotCQlhdHRyaWJ1dGVTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGludGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5JTlRFUk5BTF9FTlRJVFkpOwotCQlkZWNsU3RyaW5nID0gIjwhRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAxIHx8IHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSB7Ci0JCQkvLyBidWlsZCB1cCBhIHN0cmluZzogZS5nLiAiICUgU1RSRE9NICIoI1BDREFUQSkiPiIKLQkJCVN0cmluZyB4cyA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl4cyArPSAiJSAiOyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJeHMgKz0gbmFtZTsKLQotCQkJeHMgKz0gIiBcIiIgKyB2YWx1ZSArICJcIj4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJY29udGVudFN0cmluZyArPSB4czsKLQkJCS8vIHNhdmUgZXhwYW5kZWQgZW50aXR5IHZhbHVlCi0JCQlleHBhbmRlZEVudGl0eVZhbHVlID0gdmFsdWU7Ci0JCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBleHRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FWFRFUk5BTF9FTlRJVFkpOwotCQlkZWNsU3RyaW5nID0gIjwhRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbnRpdHlEZXB0aCA9PSAxIHx8IHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSB7Ci0JCQkvLyBidWlsZCB1cCBhIHN0cmluZzoKLQkJCS8vIGV4MSkgIiAlIEZJRUxEIFNZU1RFTSAib2FnaXNfZmllbGRzLmR0ZCI+IgotCQkJLy8gZXgyKSAiICUgRklFTEQgUFVCTElDICJGT08iPiIKLQkJCVN0cmluZyB4cyA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiJSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQl4cyArPSAiJSAiOyAvLyROT04tTkxTLTEkCi0JCQkJeHMgKz0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJeHMgKz0gbmFtZTsKLQotCQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQkJeHMgKz0gIiBTWVNURU0gXCIiICsgc3lzdGVtSWQgKyAiXCI+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQllbHNlIGlmIChwdWJsaWNJZCAhPSBudWxsKQotCQkJCXhzICs9ICIgUFVCTElDIFwiIiArIHB1YmxpY0lkICsgIlwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQljb250ZW50U3RyaW5nICs9IHhzOwotCQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb24oKTsKLQkJfQotCX0KLQotCS8vCi0JLy8gTGV4aWNhbEhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQlwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kQ0RBVEEoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlkdGRMaXN0LnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0JCWR0ZExpc3QuYWRkRWxlbWVudChjdXJyZW50RFREKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgdGhlIGVuZCBvZiBEVEQgZGVjbGFyYXRpb25zLgotCSAqIAotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0JICogQHNlZSAjc3RhcnREVEQKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJc3RhcnREZWNsYXJhdGlvbihEZWNsTm9kZS5FTkRfRFREKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgdGhlIGJlZ2lubmluZyBvZiBhbiBlbnRpdHkuCi0JICogCi0JICogVGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGRvY3VtZW50IGVudGl0eSBhcmUgbm90IHJlcG9ydGVkLiBUaGUgc3RhcnQKLQkgKiBhbmQgZW5kIG9mIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IGFyZSByZXBvcnRlZCB1c2luZyB0aGUgcHNldWRvLW5hbWUKLQkgKiAiW2R0ZF0iLiBBbGwgb3RoZXIgZXZlbnRzIG11c3QgYmUgcHJvcGVybHkgbmVzdGVkIHdpdGhpbiBzdGFydC9lbmQKLQkgKiBlbnRpdHkgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZW50aXR5LiBJZiBpdCBpcyBhIHBhcmFtZXRlciBlbnRpdHksIHRoZQotCSAqICAgICAgICAgICAgbmFtZSB3aWxsIGJlZ2luIHdpdGggJyUnLgotCSAqIEBleGNlcHRpb24gU0FYRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgVGhlIGFwcGxpY2F0aW9uIG1heSByYWlzZSBhbiBleGNlcHRpb24uCi0JICogQHNlZSAjZW5kRW50aXR5Ci0JICovCi0KLQlwdWJsaWMgdm9pZCBzdGFydEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lLmVxdWFscygiW2R0ZF0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLlNUQVJUX0VOVElUWV9EVEQpOwotCQl9Ci0JCWVsc2UgaWYgKGN1cnJlbnREZWNsTm9kZSA9PSBudWxsKSB7Ci0JCQkvLyBQRSByZWZlcmVuY2UgaW4gbWFya3VwZGVjbCBzZWN0aW9uCi0JCQlpZiAobmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBwZU5hbWUgPSBuYW1lLnN1YnN0cmluZygxKTsKLQkJCQlFbnRpdHlEZWNsIGVuID0gZW50aXR5UG9vbC5yZWZlclBhcmEocGVOYW1lKTsKLQotCQkJCXBlUmVmU3RhY2sucHVzaChuYW1lKTsKLQkJCQlwYXJzaW5nUEVSZWZTdGFjay5wdXNoKG5ldyBCb29sZWFuKHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSk7Ci0KLQkJCQlTdHJpbmcgc3lzdGVtSWQgPSBlbi5nZXRTeXN0ZW1JZCgpOwotCQkJCVN0cmluZyBwdWJsaWNJZCA9IGVuLmdldFB1YmxpY0lkKCk7Ci0JCQkJaWYgKHN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJcGFyc2luZ0V4dGVybmFsUEVSZWZlcmVuY2UgPSBmYWxzZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOwotCQkJCQlTdHJpbmcgdXJpID0gaWRSZXNvbHZlci5yZXNvbHZlKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJCQlpZiAoIWlzRFRETG9hZGVkKHVyaSkpIHsKLQkJCQkJCS8vIG5vdCBsb2FkZWQKLQkJCQkJCS8vIG91dC5wcmludGxuKCIgRFREIG5vdCBsb2FkZWQgLi4gY3JlYXRlIG5ldyBEVEQ6ICIKLQkJCQkJCS8vICk7Ci0JCQkJCQlkdGRTdGFjay5wdXNoKGN1cnJlbnREVEQpOwotCQkJCQkJRFREIG5ld0RURCA9IG5ldyBEVEQodXJpKTsKLQkJCQkJCWR0ZExpc3QuYWRkRWxlbWVudChuZXdEVEQpOwotCQkJCQkJY3VycmVudERURCA9IG5ld0RURDsKLQkJCQkJCXBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIG91dC5wcmludGxuKCIgRFREIGFscmVhZHkgbG9hZGVkIC4uICIgKTsKLQkJCQkJCXBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJU3RyaW5nIHhzID0gKFN0cmluZykgcmVhZGVyLmdldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy94bWwtc3RyaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCX0KLQkJZW50aXR5RGVwdGgrKzsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgdGhlIGVuZCBvZiBhbiBlbnRpdHkuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgdGhhdCBpcyBlbmRpbmcuCi0JICogQGV4Y2VwdGlvbiBTQVhFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbi4KLQkgKiBAc2VlICNzdGFydEVudGl0eQotCSAqLwotCXB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lLmVxdWFscygiW2R0ZF0iKSkgeyAvLyROT04tTkxTLTEkCi0JCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLkVORF9FTlRJVFlfRFREKTsKLQkJfQotCQllbHNlIGlmICghcGVSZWZTdGFjay5lbXB0eSgpKSB7Ci0JCQlwYXJzZUV4dGVybmFsUEVSZWZlcmVuY2UobmFtZSk7Ci0JCX0KLQkJZWxzZSBpZiAoZW50aXR5RGVwdGggPT0gMSB8fCBwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSkgewotCQkJaWYgKCFjb250ZW50U3RyaW5nLmVuZHNXaXRoKG5hbWUgKyAiOyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgeHMgPSAoU3RyaW5nKSByZWFkZXIuZ2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL3htbC1zdHJpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRlbnRTdHJpbmcgKz0geHM7Ci0JCQl9Ci0JCX0KLQkJZW50aXR5RGVwdGgtLTsKLQkJZW50aXR5RW5kID0gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZUV4dGVybmFsUEVSZWZlcmVuY2UoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKCFwZVJlZlN0YWNrLmVtcHR5KCkpIHsKLQkJCWlmICgoKFN0cmluZykgcGVSZWZTdGFjay5wZWVrKCkpLmVxdWFscyhuYW1lKSkgewotCQkJCXBlUmVmU3RhY2sucG9wKCk7Ci0JCQkJaWYgKHBhcnNpbmdFeHRlcm5hbFBFUmVmZXJlbmNlKSB7Ci0JCQkJCWN1cnJlbnREVEQgPSAoRFREKSBkdGRTdGFjay5wb3AoKTsKLQkJCQkJYWRkUEVSZWZlcmVuY2VOb2RlKG5hbWUpOwotCQkJCX0KLQkJCQlwYXJzaW5nRXh0ZXJuYWxQRVJlZmVyZW5jZSA9ICgoQm9vbGVhbikgcGFyc2luZ1BFUmVmU3RhY2sucG9wKCkpLmJvb2xlYW5WYWx1ZSgpOwotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBvcnQgYW4gWE1MIGNvbW1lbnQgYW55d2hlcmUgaW4gdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSB1c2VkIGZvciBjb21tZW50cyBpbnNpZGUgb3Igb3V0c2lkZSB0aGUgZG9jdW1lbnQKLQkgKiBlbGVtZW50LCBpbmNsdWRpbmcgY29tbWVudHMgaW4gdGhlIGV4dGVybmFsIERURCBzdWJzZXQgKGlmIHJlYWQpLgotCSAqIAotCSAqIEBwYXJhbSBjaAotCSAqICAgICAgICAgICAgQW4gYXJyYXkgaG9sZGluZyB0aGUgY2hhcmFjdGVycyBpbiB0aGUgY29tbWVudC4KLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIFRoZSBzdGFydGluZyBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgVGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHVzZSBmcm9tIHRoZSBhcnJheS4KLQkgKiBAZXhjZXB0aW9uIFNBWEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBtYXkgcmFpc2UgYW4gZXhjZXB0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbW1lbnQoY2hhciBjaFtdLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlzdGFydERlY2xhcmF0aW9uKERlY2xOb2RlLkNPTU1FTlQpOwotCi0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQljb21tZW50ID0gbmV3IFN0cmluZyhjaCwgc3RhcnQsIGxlbmd0aCk7Ci0JCWVsc2UKLQkJCWNvbW1lbnQgKz0gIlxuIiArIG5ldyBTdHJpbmcoY2gpOyAvLyBhcHBlbmQgYWxsIGNvbW1lbnRzLiAvLyROT04tTkxTLTEkCi0JCS8vIFRoZSBjb21tZW50IHdpbGwgZ2V0IHJlc2V0IGFmdGVyCi0JCS8vIGl0IGhhcyBiZWVuIGF0dGFjaGVkIHRvIHRoZSBmb2xsb3dpbmcKLQkJLy8gZGVjbGFyYXRpb24uCi0JfQotCi0JLy8KLQkvLyBFcnJvckhhbmRsZXIgbWV0aG9kcwotCS8vCi0KLQkvKiBXYXJuaW5nLiAqLwotCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIGVycm9yID0gIltTb3VyY2UgTGluZV0gIiArIGRlY2xTdHJpbmcgKyBjb250ZW50U3RyaW5nICsgIlxuIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWVycm9yICs9ICJbV2FybmluZyAgICBdICIgKyBnZXRMb2NhdGlvblN0cmluZyhleCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgIndhcm5pbmciKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyogRXJyb3IuICovCi0JcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nIGVycm9yID0gIltTb3VyY2UgTGluZV0gIiArIGRlY2xTdHJpbmcgKyBjb250ZW50U3RyaW5nICsgIlxuIjsgIC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCWVycm9yICs9ICJbRXJyb3IgICBdICIgKyBnZXRMb2NhdGlvblN0cmluZyhleCkgKyAiOiAiICsgZXguZ2V0TWVzc2FnZSgpOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJc2V0RXJyb3JJbmZvcm1hdGlvbihleCwgImVycm9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQlwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qIEZhdGFsIGVycm9yLiAqLwotCXB1YmxpYyB2b2lkIGZhdGFsRXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQlTdHJpbmcgZXJyb3IgPSAiW1NvdXJjZSBMaW5lXSAiICsgZGVjbFN0cmluZyArIGNvbnRlbnRTdHJpbmcgKyAiXG4iOyAgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJZXJyb3IgKz0gIltGYXRhbCBFcnJvcl0gIiArIGdldExvY2F0aW9uU3RyaW5nKGV4KSArICI6ICIgKyBleC5nZXRNZXNzYWdlKCk7ICAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlzZXRFcnJvckluZm9ybWF0aW9uKGV4LCAiZmF0YWwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCXBhcnNlQ3VycmVudERlY2xhcmF0aW9uKCk7Ci0JfQotCi0JLyogUmV0dXJucyBhIHN0cmluZyBvZiB0aGUgbG9jYXRpb24uICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25TdHJpbmcoU0FYUGFyc2VFeGNlcHRpb24gZXgpIHsKLQkJU3RyaW5nQnVmZmVyIHN0ciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlTdHJpbmcgc3lzdGVtSWQgPSBleC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAoc3lzdGVtSWQgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gc3lzdGVtSWQubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChpbmRleCAhPSAtMSkKLQkJCQlzeXN0ZW1JZCA9IHN5c3RlbUlkLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQkJc3RyLmFwcGVuZChzeXN0ZW1JZCk7Ci0JCX0KLQkJc3RyLmFwcGVuZCgnOicpOwotCQlzdHIuYXBwZW5kKGV4LmdldExpbmVOdW1iZXIoKSk7Ci0JCXN0ci5hcHBlbmQoJzonKTsKLQkJc3RyLmFwcGVuZChleC5nZXRDb2x1bW5OdW1iZXIoKSk7Ci0KLQkJcmV0dXJuIHN0ci50b1N0cmluZygpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0RGVjbGFyYXRpb24oaW50IHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gRGVjbE5vZGUuRU5EX0RURCB8fCB0eXBlID09IERlY2xOb2RlLkVORF9FTlRJVFlfRFREIHx8IHR5cGUgPT0gRGVjbE5vZGUuQ09NTUVOVCB8fCB0eXBlID09IERlY2xOb2RlLkVSUk9SKSB7Ci0JCQlwcmV2aW91c0RlY2xOb2RlID0gY3VycmVudERlY2xOb2RlOwotCQkJY3VycmVudERlY2xOb2RlID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWN1cnJlbnREZWNsTm9kZSA9IG5ldyBEZWNsTm9kZSh0eXBlKTsKLQkJCWNvbnRlbnRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZGVjbFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlleHBhbmRlZEVudGl0eVZhbHVlID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUN1cnJlbnREZWNsYXJhdGlvbigpIHsKLQkJcGFyc2VDdXJyZW50RGVjbGFyYXRpb25IZWxwZXIoY29udGVudFN0cmluZyk7Ci0JCWNvbnRlbnRTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgdm9pZCBwYXJzZUN1cnJlbnREZWNsYXJhdGlvbkhlbHBlcihTdHJpbmcgZGVjbGFyYXRpb25TdHJpbmcpIHsKLQkJRFREU2Nhbm5lciBzY2FubmVyOwotCQlTdHJpbmcgbmFtZTsKLQotCQlpZiAoY3VycmVudERlY2xOb2RlID09IG51bGwgJiYgcHJldmlvdXNEZWNsTm9kZSAhPSBudWxsICYmIGVudGl0eUVuZCkgewotCQkJY3VycmVudERlY2xOb2RlID0gcHJldmlvdXNEZWNsTm9kZTsKLQkJfQotCi0JCS8vIHNhdmUgdGhlIHByZXZpb3VzIGRlY2xOb2RlCi0JCWlmIChjdXJyZW50RGVjbE5vZGUgIT0gbnVsbCkgewotCQkJQmFzZU5vZGUgYmFzZU5vZGUgPSBudWxsOwotCQkJLy8gc3RyaXAgb3V0IHRoZSBlbmRpbmcgbWFya3VwIHN5bWJvbCAiPiIKLQkJCWlmIChkZWNsYXJhdGlvblN0cmluZy5lbmRzV2l0aCgiPiIpKSAvLyROT04tTkxTLTEkCi0JCQkJZGVjbGFyYXRpb25TdHJpbmcgPSBkZWNsYXJhdGlvblN0cmluZy5zdWJzdHJpbmcoMCwgZGVjbGFyYXRpb25TdHJpbmcubGVuZ3RoKCkgLSAxKTsKLQotCQkJaW50IHNJbmRleDsKLQkJCVN0cmluZyBjU3RyaW5nOwotCQkJaW50IHR5cGUgPSBjdXJyZW50RGVjbE5vZGUuZ2V0VHlwZSgpOwotCQkJc3dpdGNoICh0eXBlKSB7Ci0JCQkJY2FzZSBEZWNsTm9kZS5FTEVNRU5UIDogewotCQkJCQluYW1lID0gVFN0cmluZy53b3JkKGRlY2xhcmF0aW9uU3RyaW5nLCAxKTsKLQotCQkJCQkvLyBzdHJpcCBvdXQgdGhlIG5hbWUKLQkJCQkJc0luZGV4ID0gZGVjbGFyYXRpb25TdHJpbmcuaW5kZXhPZihuYW1lKSArIG5hbWUubGVuZ3RoKCk7Ci0JCQkJCWNTdHJpbmcgPSBkZWNsYXJhdGlvblN0cmluZy5zdWJzdHJpbmcoc0luZGV4KTsKLQotCQkJCQliYXNlTm9kZSA9IG5ldyBFbGVtZW50RGVjbChuYW1lLCBjdXJyZW50RFRELmdldE5hbWUoKSk7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgY1N0cmluZyk7Ci0JCQkJCUNNTm9kZSBjb250ZW50TW9kZWwgPSBzY2FubmVyLnNjYW5Db250ZW50TW9kZWwoKTsKLQkJCQkJaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsICYmIGVycm9yTWVzc2FnZSA9PSBudWxsKSB7Ci0JCQkJCQljcmVhdGVFcnJvck1lc3NhZ2UoIkV4cGVjdGluZyAnKCcgaW4gY29udGVudCBtb2RlbCIsICJlcnJvciIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCi0JCQkJCSgoRWxlbWVudERlY2wpIGJhc2VOb2RlKS5zZXRDb250ZW50TW9kZWxOb2RlKGNvbnRlbnRNb2RlbCk7Ci0JCQkJCWVsZW1lbnRQb29sLnB1dChuYW1lLCBiYXNlTm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIERlY2xOb2RlLklOVEVSTkFMX0VOVElUWSA6Ci0JCQkJY2FzZSBEZWNsTm9kZS5FWFRFUk5BTF9FTlRJVFkgOiB7Ci0JCQkJCWlmICghcGFyc2VFeHRlcm5hbFBFUmVmZXJlbmNlKGRlY2xhcmF0aW9uU3RyaW5nKSkgewotCQkJCQkJc2Nhbm5lciA9IG5ldyBEVERTY2FubmVyKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBkZWNsYXJhdGlvblN0cmluZyk7Ci0JCQkJCQliYXNlTm9kZSA9IHNjYW5uZXIuc2NhbkVudGl0eURlY2woKTsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLWJhc2VOb2RlICgiICsKLQkJCQkJCS8vIGRlY2xhcmF0aW9uU3RyaW5nICsgIikiICsgYmFzZU5vZGUpOwotCQkJCQkJaWYgKHR5cGUgPT0gRGVjbE5vZGUuSU5URVJOQUxfRU5USVRZICYmIGV4cGFuZGVkRW50aXR5VmFsdWUgIT0gbnVsbCkgewotCQkJCQkJCSgoRW50aXR5RGVjbCkgYmFzZU5vZGUpLmV4cGFuZGVkVmFsdWUgPSBleHBhbmRlZEVudGl0eVZhbHVlOwotCQkJCQkJfQotCQkJCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJCQllbnRpdHlQb29sLmFkZCgoRW50aXR5RGVjbCkgYmFzZU5vZGUpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgRGVjbE5vZGUuTk9UQVRJT04gOiB7Ci0JCQkJCXNjYW5uZXIgPSBuZXcgRFREU2Nhbm5lcihjdXJyZW50RFRELmdldE5hbWUoKSwgZGVjbGFyYXRpb25TdHJpbmcpOwotCQkJCQliYXNlTm9kZSA9IHNjYW5uZXIuc2Nhbk5vdGF0aW9uRGVjbCgpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBEZWNsTm9kZS5BVFRMSVNUIDogewotCQkJCQluYW1lID0gVFN0cmluZy53b3JkKGRlY2xhcmF0aW9uU3RyaW5nLCAxKTsKLQotCQkJCQkvLyBzdHJpcCBvdXQgdGhlIG5hbWUKLQkJCQkJc0luZGV4ID0gZGVjbGFyYXRpb25TdHJpbmcuaW5kZXhPZihuYW1lKSArIG5hbWUubGVuZ3RoKCk7Ci0JCQkJCWNTdHJpbmcgPSBkZWNsYXJhdGlvblN0cmluZy5zdWJzdHJpbmcoc0luZGV4KTsKLQotCQkJCQliYXNlTm9kZSA9IG5ldyBBdHRsaXN0KG5hbWUsIGN1cnJlbnREVEQuZ2V0TmFtZSgpKTsKLQkJCQkJc2Nhbm5lciA9IG5ldyBEVERTY2FubmVyKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBjU3RyaW5nLnRyaW0oKSk7Ci0JCQkJCVZlY3RvciBhdHRycyA9IHNjYW5uZXIuc2NhbkF0dGxpc3REZWNsKGVudGl0eVBvb2wpOwotCQkJCQlTdHJpbmcgZXJyb3JTdHJpbmcgPSBzY2FubmVyLmdldEVycm9yU3RyaW5nKCk7Ci0KLQkJCQkJaWYgKGF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJCSgoQXR0bGlzdCkgYmFzZU5vZGUpLnNldEF0dERlZnMoYXR0cnMpOwotCQkJCQl9Ci0JCQkJCWlmIChlcnJvclN0cmluZyAhPSBudWxsKSB7Ci0JCQkJCQljcmVhdGVFcnJvck1lc3NhZ2UoZXJyb3JTdHJpbmcsICJlcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOiB7Ci0JCQkJCWN1cnJlbnREZWNsTm9kZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYmFzZU5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChjb21tZW50ICE9IG51bGwpIHsKLQkJCQkJYmFzZU5vZGUuc2V0Q29tbWVudChjb21tZW50KTsKLQkJCQkJY29tbWVudCA9IG51bGw7Ci0JCQkJfQotCi0JCQkJaWYgKGVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJCWJhc2VOb2RlLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCQkJCX0KLQotCQkJCWlmIChjdXJyZW50RGVjbE5vZGUgIT0gbnVsbCkgewotCQkJCQljdXJyZW50RFRELmFkZERlY2woYmFzZU5vZGUpOwotCQkJCX0KLQkJCQlsYXN0QmFzZU5vZGUgPSBiYXNlTm9kZTsKLQkJCX0KLQotCQkJY3VycmVudERlY2xOb2RlID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChsYXN0QmFzZU5vZGUgIT0gbnVsbCAmJiBlcnJvck1lc3NhZ2UgIT0gbnVsbCAmJiBsYXN0QmFzZU5vZGUuZ2V0RXJyb3JNZXNzYWdlKCkgPT0gbnVsbCkgewotCQkJCWxhc3RCYXNlTm9kZS5zZXRFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZFBFUmVmZXJlbmNlTm9kZShTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZS5zdGFydHNXaXRoKCIlIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOyAvLyBzdHJpcCBvdXQgdGhlICUgZnJvbSBlbnRpdHkgbmFtZQotCQl9Ci0JCUVudGl0eURlY2wgZSA9IG5ldyBFbnRpdHlEZWNsKG5hbWUsIGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBudWxsLCB0cnVlKTsKLQkJZS5zZXRFbnRpdHlSZWZlcmVuY2VkKHRydWUpOwotCQllLnNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCQljdXJyZW50RFRELmFkZERlY2woZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRFRETG9hZGVkKFN0cmluZyB1cmkpIHsKLQkJYm9vbGVhbiBsb2FkZWQgPSBmYWxzZTsKLQkJU3RyaW5nIGxpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZHRkTGlzdCAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBlbiA9IGR0ZExpc3QuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCURURCBkdGQgPSAoRFREKSBlbi5uZXh0RWxlbWVudCgpOwotCQkJCWxpc3QgKz0gZHRkLmdldE5hbWUoKTsKLQkJCQlsaXN0ICs9ICIsIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChkdGQuZ2V0TmFtZSgpLmVxdWFscyh1cmkpKSB7Ci0JCQkJCWxvYWRlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbG9hZGVkOwotCX0KLQotCXB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJSW5wdXRTb3VyY2UgcmVzdWx0ID0gbnVsbDsKLQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCVN0cmluZyBsb2dpY2FsVVJJID0gaWRSZXNvbHZlci5yZXNvbHZlKGN1cnJlbnREVEQuZ2V0TmFtZSgpLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgICAvLyBidWcgMTEzNTM3LCBlbnN1cmUgcGh5c2ljYWwgcmVzb2x1dGlvbiBnZXRzIGRvbmUgaGVyZQotCQkvLyByaWdodCBiZWZvcmUgd2UgYXR0ZW1wdCB0byBvcGVuIGEgc3RyZWFtCi0JCVN0cmluZyBwaHlzaWNhbFVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oY3VycmVudERURC5nZXROYW1lKCksIHB1YmxpY0lkLCBsb2dpY2FsVVJJKTsKLQkJcmVzdWx0ID0gbmV3IElucHV0U291cmNlKGxvZ2ljYWxVUkkpOwotCQlpZighKHBoeXNpY2FsVVJJID09IG51bGwgfHwgcGh5c2ljYWxVUkkuZXF1YWxzKCIiKSB8fCBVUklIZWxwZXIuaGFzUHJvdG9jb2wocGh5c2ljYWxVUkkpKSkgLy8kTk9OLU5MUy0xJAotCQl7Ci0JCSAgcGh5c2ljYWxVUkkgPSAiZmlsZTovLy8iICsgcGh5c2ljYWxVUkk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXN1bHQuc2V0Qnl0ZVN0cmVhbShuZXcgTGF6eVVSTElucHV0U3RyZWFtKHBoeXNpY2FsVVJJKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8KLQkvLyBNYWluCi0JLy8KLQotCS8qKiBNYWluIHByb2dyYW0gZW50cnkgcG9pbnQuICovCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3ZbXSkgewotCi0JCS8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotCQlpZiAoYXJndi5sZW5ndGggPT0gMCkgewotCQkJcHJpbnRVc2FnZSgpOwotCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCX0KLQotCQkvLyB2YXJzCi0JCWJvb2xlYW4gY2Fub25pY2FsID0gZmFsc2U7Ci0JCWJvb2xlYW4gZXhwYW5kRW50aXR5UmVmZXJlbmNlcyA9IGZhbHNlOwotCQlEVERQYXJzZXIgcGFyc2VyOwotCi0JCS8vIGNoZWNrIHBhcmFtZXRlcnMKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgYXJnID0gYXJndltpXTsKLQotCQkJLy8gb3B0aW9ucwotCQkJaWYgKGFyZy5zdGFydHNXaXRoKCItIikpIHsgLy8kTk9OLU5MUy0xJAotCi0JCQkJaWYgKGFyZy5lcXVhbHMoIi1jIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQljYW5vbmljYWwgPSB0cnVlOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoYXJnLmVxdWFscygiLXgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCWV4cGFuZEVudGl0eVJlZmVyZW5jZXMgPSB0cnVlOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAoYXJnLmVxdWFscygiLWgiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCXByaW50VXNhZ2UoKTsKLQkJCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQkJfQotCQkJfQotCQkJdHJ5IHsKLQkJCQlwYXJzZXIgPSBuZXcgRFREUGFyc2VyKGNhbm9uaWNhbCk7Ci0JCQkJcGFyc2VyLnNldEV4cGFuZEVudGl0eVJlZmVyZW5jZXMoZXhwYW5kRW50aXR5UmVmZXJlbmNlcyk7Ci0JCQkJcGFyc2VyLnBhcnNlKGFyZyk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQl9IC8vIG1haW4oU3RyaW5nW10pCi0KLQkvKiogUHJpbnRzIHRoZSB1c2FnZS4gKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50VXNhZ2UoKSB7Ci0KLQkJU3lzdGVtLmVyci5wcmludGxuKCJ1c2FnZTogamF2YSBzYXguRFREUGFyc2VyIChvcHRpb25zKSB1cmkgLi4uIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCk7Ci0JCVN5c3RlbS5lcnIucHJpbnRsbigib3B0aW9uczoiKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgLWMgICAgICAgQ2Fub25pY2FsIFhNTCBvdXRwdXQuIik7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLmVyci5wcmludGxuKCIgIC14ICAgICAgIEV4cGFuZCBlbnRpdHkgcmVmZXJlbmNlcy4iKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0uZXJyLnByaW50bG4oIiAgLWggICAgICAgVGhpcyBoZWxwIHNjcmVlbi4iKTsgLy8kTk9OLU5MUy0xJAotCi0JfSAvLyBwcmludFVzYWdlKCkKLQotCXByaXZhdGUgdm9pZCBzZXRFcnJvckluZm9ybWF0aW9uKFNBWFBhcnNlRXhjZXB0aW9uIGV4LCBTdHJpbmcgc2V2ZXJpdHkpIHsKLQkJZXJyb3JNZXNzYWdlID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCi0JCWlmIChleC5nZXRMaW5lTnVtYmVyKCkgPT0gLTEpIHsKLQkJCWVycm9yTWVzc2FnZS5zZXRFcnJvckxpbmUobGluZU51bWJlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JMaW5lKGV4LmdldExpbmVOdW1iZXIoKSk7Ci0JCX0KLQotCi0JCWVycm9yTWVzc2FnZS5zZXRFcnJvck1lc3NhZ2UoZXguZ2V0TWVzc2FnZSgpKTsKLQkJZXJyb3JNZXNzYWdlLnNldEVycm9yQ29sdW1uKGV4LmdldENvbHVtbk51bWJlcigpKTsKLQkJZXJyb3JNZXNzYWdlLnNldFNldmVyaXR5KHNldmVyaXR5KTsKLQkJZXJyb3JNZXNzYWdlcy5hZGQoZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRXJyb3JNZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgc2V2ZXJpdHkpIHsKLQkJZXJyb3JNZXNzYWdlID0gbmV3IEVycm9yTWVzc2FnZSgpOwotCi0JCUxvY2F0b3IgbG9jYXRvciA9IGdldExvY2F0b3IoKTsKLQotCQllcnJvck1lc3NhZ2Uuc2V0RXJyb3JMaW5lKGxvY2F0b3IuZ2V0TGluZU51bWJlcigpKTsKLQkJZXJyb3JNZXNzYWdlLnNldEVycm9yQ29sdW1uKGxvY2F0b3IuZ2V0Q29sdW1uTnVtYmVyKCkpOwotCi0JCWVycm9yTWVzc2FnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCWVycm9yTWVzc2FnZS5zZXRTZXZlcml0eShzZXZlcml0eSk7Ci0KLQkJZXJyb3JNZXNzYWdlcy5hZGQoZXJyb3JNZXNzYWdlKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNheEFydGlmYWN0VmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2F4QXJ0aWZhY3RWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkOTZiYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2F4QXJ0aWZhY3RWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotCi0KLXB1YmxpYyBjbGFzcyBEVERTYXhBcnRpZmFjdFZpc2l0b3IgewotCXB1YmxpYyB2b2lkIHZpc2l0RFREKERURCBkdGQpIHsKLQkJRW51bWVyYXRpb24gZW4gPSBkdGQuZXh0ZXJuYWxFbGVtZW50cygpOwotCi0JCXdoaWxlIChlbi5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJT2JqZWN0IGUgPSBlbi5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGUgaW5zdGFuY2VvZiBFbnRpdHlEZWNsKSB7Ci0JCQkJdmlzaXRFbnRpdHlEZWNsKChFbnRpdHlEZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBFbGVtZW50RGVjbCkgewotCQkJCXZpc2l0RWxlbWVudERlY2woKEVsZW1lbnREZWNsKSBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGUgaW5zdGFuY2VvZiBOb3RhdGlvbkRlY2wpIHsKLQkJCQl2aXNpdE5vdGF0aW9uRGVjbCgoTm90YXRpb25EZWNsKSBlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsKE5vdGF0aW9uRGVjbCBub3RhdGlvbikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2woRWxlbWVudERlY2wgZWxlbWVudCkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCQlpZiAoZW50aXR5LmlzRW50aXR5UmVmZXJlbmNlZCgpKSB7Ci0JCQl2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woZW50aXR5KTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChlbnRpdHkuaXNFeHRlcm5hbCgpKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbEVudGl0eURlY2woZW50aXR5KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKGVudGl0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZURlY2woRW50aXR5RGVjbCBlbnRpdHkpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsRW50aXR5RGVjbChFbnRpdHlEZWNsIGVudGl0eSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0SW50ZXJuYWxFbnRpdHlEZWNsKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRFREU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI3MDU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RURFNjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vKioKLSAqIFNjYW5uaW5nIC8gcGFyc2luZyB0aGUgY29udGVudCBzdHJpbmcgZnJvbSB0aGUgRGVjbCBzdGF0ZW1lbnQKLSAqIAotICogQHZlcnNpb24KLSAqLwotcHVibGljIGNsYXNzIERURFNjYW5uZXIgewotCS8vIGVsZW1lbnQgY29udGVudCBtb2RlbCBzdHJpbmdzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGVtcHR5X3N0cmluZyA9IHsnRScsICdNJywgJ1AnLCAnVCcsICdZJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGFueV9zdHJpbmcgPSB7J0EnLCAnTicsICdZJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHBjZGF0YV9zdHJpbmcgPSB7JyMnLCAnUCcsICdDJywgJ0QnLCAnQScsICdUJywgJ0EnfTsKLQotCS8vIGF0dHJpYnV0ZSB0eXBlIGFuZCBkZWZhdWx0IHR5cGUgc3RyaW5ncwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBjZGF0YV9zdHJpbmcgPSB7J0MnLCAnRCcsICdBJywgJ1QnLCAnQSd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBpZF9zdHJpbmcgPSB7J0knLCAnRCd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSByZWZfc3RyaW5nID0geydSJywgJ0UnLCAnRid9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBlbnRpdF9zdHJpbmcgPSB7J0UnLCAnTicsICdUJywgJ0knLCAnVCd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBpZXNfc3RyaW5nID0geydJJywgJ0UnLCAnUyd9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBubXRva2VuX3N0cmluZyA9IHsnTicsICdNJywgJ1QnLCAnTycsICdLJywgJ0UnLCAnTid9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBub3RhdGlvbl9zdHJpbmcgPSB7J04nLCAnTycsICdUJywgJ0EnLCAnVCcsICdJJywgJ08nLCAnTid9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSByZXF1aXJlZF9zdHJpbmcgPSB7JyMnLCAnUicsICdFJywgJ1EnLCAnVScsICdJJywgJ1InLCAnRScsICdEJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIGltcGxpZWRfc3RyaW5nID0geycjJywgJ0knLCAnTScsICdQJywgJ0wnLCAnSScsICdFJywgJ0QnfTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyW10gZml4ZWRfc3RyaW5nID0geycjJywgJ0YnLCAnSScsICdYJywgJ0UnLCAnRCd9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHN5c3RlbV9zdHJpbmcgPSB7J1MnLCAnWScsICdTJywgJ1QnLCAnRScsICdNJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIHB1YmxpY19zdHJpbmcgPSB7J1AnLCAnVScsICdCJywgJ0wnLCAnSScsICdDJ307Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIG5kYXRhX3N0cmluZyA9IHsnTicsICdEJywgJ0EnLCAnVCcsICdBJ307Ci0KLQlwcml2YXRlIGludFtdIGZPcFN0YWNrID0gbnVsbDsKLQlwcml2YXRlIENNR3JvdXBOb2RlW10gZkdycFN0YWNrID0gbnVsbDsKLQotCXByaXZhdGUgRW50aXR5UG9vbCBlbnRpdHlQb29sOwotCi0JLyogQXR0cmlidXRlIERlZiBzY2FubmVyIHN0YXRlICovCi0Jc3RhdGljIGZpbmFsIGludCBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lID0gMSwgQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSA9IDIsIEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlID0gMywgQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFZhbHVlID0gNDsKLQotCXByaXZhdGUgU3RyaW5nUGFyc2VyIGNvbnRlbnRTdHJpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgY0RhdGE7Ci0JcHJpdmF0ZSBpbnQgcHJldk5vZGVPZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IG5vZGVPZmZzZXQgPSAxOwotCXByaXZhdGUgU3RyaW5nIG93bmVyRFREOwotCi0JcHJpdmF0ZSBTdHJpbmcgZXJyb3JTdHJpbmc7Ci0KLQlwdWJsaWMgRFREU2Nhbm5lcihTdHJpbmcgb3duZXJEVEQsIFN0cmluZyBjbSkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkNtOiAiICsgY20pOwotCQljb250ZW50U3RyaW5nID0gbmV3IFN0cmluZ1BhcnNlcihjbSk7Ci0JCWNEYXRhID0gY207Ci0JCXRoaXMub3duZXJEVEQgPSBvd25lckRURDsKLQl9Ci0KLQkvLwotCS8vIFs0Nl0gY29udGVudHNwZWMgOjo9ICdFTVBUWScgfCAnQU5ZJyB8IE1peGVkIHwgY2hpbGRyZW4KLQkvLwotCS8vIFNwZWNpZmljIHRvIFZpc3VhbERURCA6IGFsc28gYWxsb3dzICVQRVJlZmVyZW5jZTsKLQkvLwotCXB1YmxpYyBDTU5vZGUgc2NhbkNvbnRlbnRNb2RlbCgpIHsKLQkJQ01Ob2RlIGNtTm9kZSA9IG51bGw7Ci0JCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhlbXB0eV9zdHJpbmcpKSB7Ci0JCQljbU5vZGUgPSBuZXcgQ01CYXNpY05vZGUoIkVNUFRZIiwgQ01Ob2RlVHlwZS5FTVBUWSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoYW55X3N0cmluZykpIHsKLQkJCWNtTm9kZSA9IG5ldyBDTUJhc2ljTm9kZSgiQU5ZIiwgQ01Ob2RlVHlwZS5BTlkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCWNtTm9kZSA9IG5ldyBDTVJlZmVyZW5jZU5vZGUoY29udGVudFN0cmluZy5nZXREYXRhKCksIENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSk7Ci0JCX0KLQkJZWxzZSBpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnRtb2RlbCBzdHJpbmcgaXMgYmFkLi4uCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiEhISBleGNlcHRpb24gLSBubyAoIik7Ci0JCQlyZXR1cm4gY21Ob2RlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJSZW1haW5pbmcgU3RyaW5nID0gIiArCi0JCQkvLyBjb250ZW50U3RyaW5nLmdldFJlbWFpbmluZ1N0cmluZygpKTsKLQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJYm9vbGVhbiBza2lwcGVkUENEQVRBID0gY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHBjZGF0YV9zdHJpbmcpOwotCQkJaWYgKHNraXBwZWRQQ0RBVEEpIHsKLQkJCQljbU5vZGUgPSBzY2FuTWl4ZWQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWNtTm9kZSA9IHNjYW5DaGlsZHJlbigpOwotCQkJfQotCi0JCX0KLQkJcmV0dXJuIGNtTm9kZTsKLQl9Ci0KLQkvLwotCS8vIFs1MV0gTWl4ZWQgOjo9ICcoJyBTPyAnI1BDREFUQScgKFM/ICd8JyBTPyBOYW1lKSogUz8gJykqJyB8ICcoJyBTPwotCS8vICcjUENEQVRBJyBTPyAnKScKLQkvLwotCS8vIENhbGxlZCBhZnRlciBzY2FubmluZyBwYXN0ICcoJyBTPyAnI1BDREFUQScKLQkvLwotCXByaXZhdGUgQ01Ob2RlIHNjYW5NaXhlZCgpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTY2FuTWl4ZWQuLi4iKTsKLQkJQ01Hcm91cE5vZGUgY21Ob2RlID0gbmV3IENNR3JvdXBOb2RlKCk7Ci0JCWNtTm9kZS5zZXRHcm91cEtpbmQoQ01Ob2RlVHlwZS5HUk9VUF9DSE9JQ0UpOwotCQljbU5vZGUuYWRkQ2hpbGQobmV3IENNQmFzaWNOb2RlKCIjUENEQVRBIiwgQ01Ob2RlVHlwZS5QQ0RBVEEpKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIGludCBwcmV2Tm9kZUluZGV4ID0gLTE7Ci0JCWJvb2xlYW4gc3RhclJlcXVpcmVkID0gZmFsc2U7Ci0KLQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQl9Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignfCcsIHRydWUpKSB7Ci0JCQkJaWYgKCFjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyknLCB0cnVlKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKicsIHRydWUpKSB7Ci0JCQkJCWNtTm9kZS5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoc3RhclJlcXVpcmVkKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiICogaXMgcmVxdWlyZWQgLi4uICIpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQl9Ci0KLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWlmIChub2RlT2Zmc2V0ICE9IC0xKSB7Ci0JCQkJLy8gc2tpcCBwYXNzICJ8IgotCQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQkJCX0KLQotCQkJc3RhclJlcXVpcmVkID0gdHJ1ZTsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lQW5kUEVSZWZlcmVuY2UoJyknKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJaWYgKG5vZGVPZmZzZXQgPT0gLTEpCi0JCQkJYnJlYWs7Ci0KLQkJCS8vIGFkZCBsZWF2ZSBub2RlCi0JCQlpbnQgbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJU3RyaW5nIHJlZk5hbWUgPSBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQkJCWlmIChyZWZOYW1lLnN0YXJ0c1dpdGgoIiUiKSkgLy8kTk9OLU5MUy0xJAotCQkJCWNtTm9kZS5hZGRDaGlsZChuZXcgQ01SZWZlcmVuY2VOb2RlKHJlZk5hbWUsIENNTm9kZVR5cGUuRU5USVRZX1JFRkVSRU5DRSkpOwotCQkJZWxzZQotCQkJCWNtTm9kZS5hZGRDaGlsZChuZXcgQ01SZWZlcmVuY2VOb2RlKHJlZk5hbWUsIENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpKTsKLQotCQl9IC8vIGVuZCB3aGlsZQotCi0KLQkJaWYgKGNtTm9kZS5nZXRDaGlsZHJlbigpLnNpemUoKSA9PSAxKSB7Ci0JCQkvLyBzaW1wbGlmeSB0aGUgY29udGVudE1vZGVsIGlmIHRoZSBDTUdyb3VwTm9kZSBvbmx5IGhhcyBvbmUgY2hpbGQKLQkJCS8vIG5vZGUuCi0JCQlyZXR1cm4gKENNQmFzaWNOb2RlKSBjbU5vZGUuZ2V0Q2hpbGRyZW4oKS5lbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlyZXR1cm4gY21Ob2RlOwotCX0KLQotCS8vCi0JLy8gWzQ3XSBjaGlsZHJlbiA6Oj0gKGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/Ci0JLy8gWzQ5XSBjaG9pY2UgOjo9ICcoJyBTPyBjcCAoIFM/ICd8JyBTPyBjcCApKiBTPyAnKScKLQkvLyBbNTBdIHNlcSA6Oj0gJygnIFM/IGNwICggUz8gJywnIFM/IGNwICkqIFM/ICcpJwotCS8vIFs0OF0gY3AgOjo9IChOYW1lIHwgY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8KLQkvLwotCS8vIENhbGxlZCBhZnRlciBzY2FubmluZyBwYXN0ICcoJwotCi0JcHJpdmF0ZSBDTU5vZGUgc2NhbkNoaWxkcmVuKCkgewotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbkNoaWxkcmVuLi4uIik7Ci0KLQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJfQotCi0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJaW50IGRlcHRoID0gMTsKLQkJaW5pdGlhbGl6ZUNvbnRlbnRNb2RlbFN0YWNrKGRlcHRoKTsKLQkJaW50IGxlbjsKLQotCQlTdHJpbmcgbm9kZU5hbWU7Ci0JCUNNR3JvdXBOb2RlIGNtTm9kZSA9IG5ldyBDTUdyb3VwTm9kZSgpOwotCQlmR3JwU3RhY2tbZGVwdGhdID0gY21Ob2RlOwotCi0JCXdoaWxlICh0cnVlKSB7Ci0KLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIEJlZ2luIG91dHRlciB3aGlsZSBsb29wIC4uLiIgKTsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJCS8vIHNraXAgcGFzdCBhbnkgd2hpdGUgc3BhY2VzIGFmdGVyIHRoZSAnKCcKLQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCX0KLQotCQkJCWRlcHRoKys7Ci0JCQkJaW5pdGlhbGl6ZUNvbnRlbnRNb2RlbFN0YWNrKGRlcHRoKTsKLQkJCQlmR3JwU3RhY2tbZGVwdGhdID0gbmV3IENNR3JvdXBOb2RlKCk7Ci0JCQkJZkdycFN0YWNrW2RlcHRoIC0gMV0uYWRkQ2hpbGQoZkdycFN0YWNrW2RlcHRoXSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZUFuZFBFUmVmZXJlbmNlKCcpJyk7Ci0JCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCS8qCi0JCQkgKiBTeXN0ZW0ub3V0LnByaW50bG4oIiBwcmV2Tm9kZU9GZnNldCAiICsgcHJldk5vZGVPZmZzZXQpOwotCQkJICogU3lzdGVtLm91dC5wcmludGxuKCIgY3VycmVudE5vZGVPRmZzZXQgIiArIG5vZGVPZmZzZXQpOwotCQkJICovCi0KLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQotCQkJaWYgKG5vZGVPZmZzZXQgPT0gLTEgfHwgbGVuIDwgMSkgewotCQkJCWJyZWFrOwotCQkJfQotCi0JCQlub2RlTmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCi0JCQlDTVJlcGVhdGFibGVOb2RlIHJuOwotCQkJaWYgKG5vZGVOYW1lLnN0YXJ0c1dpdGgoIiUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcm4gPSBuZXcgQ01SZWZlcmVuY2VOb2RlKG5vZGVOYW1lLCBDTU5vZGVUeXBlLkVOVElUWV9SRUZFUkVOQ0UpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcm4gPSBuZXcgQ01SZWZlcmVuY2VOb2RlKG5vZGVOYW1lLCBDTU5vZGVUeXBlLkVMRU1FTlRfUkVGRVJFTkNFKTsKLQkJCX0KLQotCQkJZkdycFN0YWNrW2RlcHRoXS5hZGRDaGlsZChybik7Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignPycsIHRydWUpKSB7Ci0JCQkJcm4uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLk9QVElPTkFMKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKicsIHRydWUpKSB7Ci0JCQkJcm4uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLlpFUk9fT1JfTU9SRSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJysnLCB0cnVlKSkgewotCQkJCXJuLnNldE9jY3VycmVuY2UoQ01Ob2RlVHlwZS5PTkVfT1JfTU9SRSk7Ci0JCQl9Ci0KLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKSB7Ci0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJfQotCi0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCi0JCQl3aGlsZSAodHJ1ZSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIEJlZ2luIGlubmVyIHdoaWxlIGxvb3AgLi4uIGRlcHRoICIgKwotCQkJCS8vIGRlcHRoICk7Ci0JCQkJaWYgKGZPcFN0YWNrW2RlcHRoXSAhPSBDTU5vZGVUeXBlLkdST1VQX1NFUVVFTkNFICYmIGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignfCcsIHRydWUpKSB7Ci0JCQkJCWZPcFN0YWNrW2RlcHRoXSA9IENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFOwotCQkJCQlmR3JwU3RhY2tbZGVwdGhdLnNldEdyb3VwS2luZChDTU5vZGVUeXBlLkdST1VQX0NIT0lDRSk7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZk9wU3RhY2tbZGVwdGhdICE9IENNTm9kZVR5cGUuR1JPVVBfQ0hPSUNFICYmIGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignLCcsIHRydWUpKSB7Ci0JCQkJCWZPcFN0YWNrW2RlcHRoXSA9IENNTm9kZVR5cGUuR1JPVVBfU0VRVUVOQ0U7Ci0JCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0R3JvdXBLaW5kKENNTm9kZVR5cGUuR1JPVVBfU0VRVUVOQ0UpOwotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQl9Ci0JCQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcpJywgdHJ1ZSkpIHsKLQkJCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIGVycm9yICkgbm90IGZvdW5kIik7Ci0JCQkJCX0KLQkJCQkJLy8gZW5kIG9mIHRoZSBjdXJlbnQgZ3JvdXAgbm9kZQotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCc/JywgdHJ1ZSkpIHsKLQkJCQkJCWZHcnBTdGFja1tkZXB0aF0uc2V0T2NjdXJyZW5jZShDTU5vZGVUeXBlLk9QVElPTkFMKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyonLCB0cnVlKSkgewotCQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuWkVST19PUl9NT1JFKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJysnLCB0cnVlKSkgewotCQkJCQkJZkdycFN0YWNrW2RlcHRoXS5zZXRPY2N1cnJlbmNlKENNTm9kZVR5cGUuT05FX09SX01PUkUpOwotCQkJCQl9Ci0JCQkJCWRlcHRoLS07Ci0JCQkJCWlmIChkZXB0aCA9PSAwKSB7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQotCQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBFbmQgZW5kIGlubmVyIHdoaWxlIGxvb3AgLi4uIGRlcHRoCi0JCQkJCS8vICIgKyBkZXB0aCApOwotCi0JCQkJfQotCQkJfSAvLyBpbm5lciB3aGlsZQotCi0JCQlpZiAoZGVwdGggPT0gMCkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9IC8vIG91dGVyIHdoaWxlCi0KLQkJaWYgKGNtTm9kZS5nZXRDaGlsZHJlbigpLnNpemUoKSA9PSAxKSB7Ci0JCQkvLyBzaW1wbGlmeSB0aGUgY29udGVudE1vZGVsIGlmIHRoZSBDTUdyb3VwTm9kZSBvbmx5IGhhcyBvbmUgY2hpbGQKLQkJCS8vIG5vZGUgYW5kIHRoYXQgbm9kZSBpcyBhbiBlbGVtZW50IHJlZi4KLQkJCUNNUmVwZWF0YWJsZU5vZGUgcm4gPSAoQ01SZXBlYXRhYmxlTm9kZSkgY21Ob2RlLmdldENoaWxkcmVuKCkuZWxlbWVudEF0KDApOwotCQkJaWYgKHJuIGluc3RhbmNlb2YgQ01SZWZlcmVuY2VOb2RlKSB7Ci0JCQkJQ01SZWZlcmVuY2VOb2RlIHJlZiA9IChDTVJlZmVyZW5jZU5vZGUpIHJuOwotCQkJCWlmIChyZWYuZ2V0VHlwZSgpID09IENNTm9kZVR5cGUuRUxFTUVOVF9SRUZFUkVOQ0UpIHsKLQkJCQkJaWYgKHJlZi5nZXRPY2N1cnJlbmNlKCkgPT0gQ01Ob2RlVHlwZS5PTkUpIHsKLQkJCQkJCXJlZi5zZXRPY2N1cnJlbmNlKGNtTm9kZS5nZXRPY2N1cnJlbmNlKCkpOwotCQkJCQkJcmV0dXJuIHJlZjsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjbU5vZGUuZ2V0T2NjdXJyZW5jZSgpID09IENNTm9kZVR5cGUuT05FKSB7Ci0JCQkJCQlyZXR1cm4gcmVmOwotCQkJCQl9Ci0JCQkJfSAvLyBlbmQgb2YgaWYgKCkKLQkJCX0KLQkJfQotCi0JCXJldHVybiBjbU5vZGU7Ci0JfQotCi0JLy8KLQkvLyBbNTJdIEF0dGxpc3REZWNsIDo6PSAnPCFBVFRMSVNUJyBTIE5hbWUgQXR0RGVmKiBTPyAnPicKLQkvLyBbNTNdIEF0dERlZiA6Oj0gUyBOYW1lIFMgQXR0VHlwZSBTIERlZmF1bHREZWNsCi0JLy8gWzYwXSBEZWZhdWx0RGVjbCA6Oj0gJyNSRVFVSVJFRCcgfCAnI0lNUExJRUQnIHwgKCgnI0ZJWEVEJyBTKT8KLQkvLyBBdHRWYWx1ZSkKLQkvLwotCi0JcHVibGljIFZlY3RvciBzY2FuQXR0bGlzdERlY2woRW50aXR5UG9vbCBlbnRpdHlQb29sKSB7Ci0JCVZlY3RvciBhdHRMaXN0ID0gbmV3IFZlY3RvcigpOwotCQl0aGlzLmVudGl0eVBvb2wgPSBlbnRpdHlQb29sOwotCi0JCWludCBzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lOwotCQkKLQkJQXR0Tm9kZSBhdHROb2RlOwotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQlhdHROb2RlID0gbmV3IEF0dE5vZGUoKTsKLQotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgc2Nhbm5lciBzdGF0ZTogIiArIHNjYW5uZXJTdGF0ZSk7Ci0KLQkJCS8vIHNjYW5uaW5nIGF0dCBuYW1lCi0JCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX05hbWUpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNjYW4gYXR0IE5hbWUuLi4iKTsKLQkJCQlzY2FubmVyU3RhdGUgPSBjaGVja0ZvckF0dHJpYnV0ZVdpdGhQRVJlZmVyZW5jZShhdHROb2RlLCBzY2FubmVyU3RhdGUpOwotCQkJCWlmIChzY2FubmVyU3RhdGUgPT0gLTEpIHsKLQkJCQkJcmV0dXJuIGF0dExpc3Q7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzY2FubmluZyBhdHQgdHlwZQotCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlKSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzY2FuIGF0dCB0eXBlLi4uIik7Ci0KLQkJCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGNkYXRhX3N0cmluZykpIHsKLQkJCQkJYXR0Tm9kZS50eXBlID0gbmV3IFN0cmluZyhjZGF0YV9zdHJpbmcpOwotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGlkX3N0cmluZykpIHsKLQkJCQkJaWYgKCFjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocmVmX3N0cmluZykpIHsKLQkJCQkJCWF0dE5vZGUudHlwZSA9IG5ldyBTdHJpbmcoaWRfc3RyaW5nKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdTJywgdHJ1ZSkpIHsKLQkJCQkJCWF0dE5vZGUudHlwZSA9ICJJRFJFRiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWF0dE5vZGUudHlwZSA9ICJJRFJFRlMiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcuc2tpcHBlZFN0cmluZyhlbnRpdF9zdHJpbmcpKSB7Ci0JCQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1knLCB0cnVlKSkgewotCQkJCQkJYXR0Tm9kZS50eXBlID0gIkVOVElUWSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoaWVzX3N0cmluZykpIHsKLQkJCQkJCWF0dE5vZGUudHlwZSA9ICJFTlRJVElFUyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlzY2FubmVyU3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKG5tdG9rZW5fc3RyaW5nKSkgewotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdTJywgdHJ1ZSkpIHsKLQkJCQkJCWF0dE5vZGUudHlwZSA9ICJOTVRPS0VOUyI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWF0dE5vZGUudHlwZSA9ICJOTVRPS0VOIjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcobm90YXRpb25fc3RyaW5nKSkgewotCQkJCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQl9Ci0JCQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCcoJywgdHJ1ZSkpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIG1pc3NpbmcgKCBpbiBub3RhdGlvbiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWF0dE5vZGUudHlwZSA9ICJOT1RBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXR0Tm9kZS5lbnVtTGlzdCA9IHNjYW5FbnVtZXJhdGlvbihjb250ZW50U3RyaW5nLCB0cnVlKTsKLQkJCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkJCWF0dE5vZGUudHlwZSA9ICJFTlVNRVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYXR0Tm9kZS5lbnVtTGlzdCA9IHNjYW5FbnVtZXJhdGlvbihjb250ZW50U3RyaW5nLCBmYWxzZSk7Ci0JCQkJCXNjYW5uZXJTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2Nhbm5lclN0YXRlID0gY2hlY2tGb3JBdHRyaWJ1dGVXaXRoUEVSZWZlcmVuY2UoYXR0Tm9kZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQkJaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlKSB7Ci0JCQkJCQlzZXRFcnJvclN0cmluZygiRmFpbGVkIHRvIGZpbmQgdHlwZSBmb3IgYXR0cmlidXRlICciICsgYXR0Tm9kZS5uYW1lICsgIicuICBQbGVhc2UgcmVmZXIgdG8gdGhlIG9yaWdpbmFsIERURCBmaWxlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCS8vIHdlIGZhaWxlZCB0byBmaW5kIGEgdHlwZSBmb3IgdGhpcyBhdHRyaWJ1dGUKLQkJCQkJCXJldHVybiBhdHRMaXN0OwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoc2Nhbm5lclN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlKSB7Ci0JCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbiBkZWZhdWx0IHR5cGUuLi4iKTsKLQkJCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHJlcXVpcmVkX3N0cmluZykpIHsKLQkJCQkJYXR0Tm9kZS5kZWZhdWx0VHlwZSA9IG5ldyBTdHJpbmcocmVxdWlyZWRfc3RyaW5nKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGltcGxpZWRfc3RyaW5nKSkgewotCQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gbmV3IFN0cmluZyhpbXBsaWVkX3N0cmluZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKGZpeGVkX3N0cmluZykpIHsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSBuZXcgU3RyaW5nKGZpeGVkX3N0cmluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJLy8gImRlZmF1bHQiCi0JCQkJCQlhdHROb2RlLmRlZmF1bHRUeXBlID0gIk5PRklYRUQiOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCWF0dE5vZGUuZGVmYXVsdFZhbHVlID0gc2NhbkRlZmF1bHRBdHRWYWx1ZShjb250ZW50U3RyaW5nKTsKLQkJCQl9Ci0JCQkJc2Nhbm5lclN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZTsgLy8gbmV4dAotCQkJfQotCi0KLQkJCWF0dExpc3QuYWRkRWxlbWVudChhdHROb2RlKTsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJaWYgKG5vZGVPZmZzZXQgPj0gY0RhdGEubGVuZ3RoKCkpCi0JCQkJcmV0dXJuIGF0dExpc3Q7Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJfS8vIGVuZCB3aGlsZSBsb29wCi0JfQotCi0JLy8KLQkvLyBjb250ZW50IG1vZGVsIHN0YWNrCi0JLy8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNvbnRlbnRNb2RlbFN0YWNrKGludCBkZXB0aCkgewotCQlpZiAoZk9wU3RhY2sgPT0gbnVsbCkgewotCQkJZk9wU3RhY2sgPSBuZXcgaW50WzhdOwotCQkJZkdycFN0YWNrID0gbmV3IENNR3JvdXBOb2RlWzhdOwotCQl9Ci0JCWVsc2UgaWYgKGRlcHRoID09IGZPcFN0YWNrLmxlbmd0aCkgewotCQkJaW50W10gbmV3U3RhY2sgPSBuZXcgaW50W2RlcHRoICogMl07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGZPcFN0YWNrLCAwLCBuZXdTdGFjaywgMCwgZGVwdGgpOwotCQkJZk9wU3RhY2sgPSBuZXdTdGFjazsKLQotCQkJQ01Hcm91cE5vZGVbXSBuZXdHcnBTdGFjayA9IG5ldyBDTUdyb3VwTm9kZVtkZXB0aCAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weShmR3JwU3RhY2ssIDAsIG5ld0dycFN0YWNrLCAwLCBkZXB0aCk7Ci0JCQlmR3JwU3RhY2sgPSBuZXdHcnBTdGFjazsKLQkJfQotCQlmT3BTdGFja1tkZXB0aF0gPSAtMTsKLQkJZkdycFN0YWNrW2RlcHRoXSA9IG51bGw7Ci0JfQotCi0JLy8KLQlwcml2YXRlIGludCBjaGVja0ZvckF0dHJpYnV0ZVdpdGhQRVJlZmVyZW5jZShBdHROb2RlIGF0dE5vZGUsIGludCBzY2FubmVyU3RhdGUpIHsKLQkJaW50IHN0YXRlID0gLTE7Ci0JCWludCBsZW47Ci0JCVN0cmluZyByYXdUZXh0OwotCQlFbnRpdHlEZWNsIHBFbnRpdHk7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCIgY2hlY2tmb3JBVFRQRVJSZWZlcmVuY2UtIHN0YXJ0IHNjYW5uZXJTdGF0ZTogIgotCQkvLyArIHNjYW5uZXJTdGF0ZSk7Ci0JCWlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZSkgewotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZSgnICcpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCi0JCQlyYXdUZXh0ID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQlhdHROb2RlLm5hbWUgPSByYXdUZXh0OwotCi0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXRlX25hbWUgOiAiICsgcmF3VGV4dCk7Ci0KLQkJCWlmIChyYXdUZXh0LnN0YXJ0c1dpdGgoIiUiKSAmJiByYXdUZXh0LmVuZHNXaXRoKCI7IikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJU3RyaW5nIHBlID0gcmF3VGV4dC5zdWJzdHJpbmcoMSwgcmF3VGV4dC5sZW5ndGgoKSAtIDEpOwotCi0JCQkJcEVudGl0eSA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHBlKTsKLQkJCQlpZiAocEVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG5hbWUgOiIgKyByYXdUZXh0ICsiIGV4cGFuZFRvOiIgKwotCQkJCQkvLyBwRW50aXR5LmV4cGFuZGVkVmFsdWUpOwotCQkJCQlzdGF0ZSA9IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjaGVja0ZvckF0dHJ3aXRoUEVSIC0gbmV4dHN0YXRlOiAiCi0JCQkJCS8vICsgc3RhdGUpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX1R5cGU7Ci0KLQkJfQotCQllbHNlIGlmIChzY2FubmVyU3RhdGUgPT0gQXR0X1NjYW5uZXJfU3RhdGVfVHlwZSkgewotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJcmF3VGV4dCA9IGdldFBFTmFtZSgpOwotCQkJCWF0dE5vZGUudHlwZSA9ICIlIiArIHJhd1RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgcGVOYW1lID0gcmF3VGV4dC5zdWJzdHJpbmcoMCwgcmF3VGV4dC5sZW5ndGgoKSAtIDEpOwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGVfdHlwZSA6IHBlLSAiICsgcGVOYW1lKTsKLQkJCQlwRW50aXR5ID0gZW50aXR5UG9vbC5yZWZlclBhcmEocGVOYW1lKTsKLQkJCQlpZiAocEVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCXN0YXRlID0gd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUocEVudGl0eS5leHBhbmRlZFZhbHVlLCBzY2FubmVyU3RhdGUpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9UeXBlOwotCQl9Ci0JCWVsc2UgaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VHlwZSkgewotCQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignJScsIHRydWUpKSB7Ci0JCQkJcmF3VGV4dCA9IGdldFBFTmFtZSgpOwotCQkJCWF0dE5vZGUuZGVmYXVsdFR5cGUgPSByYXdUZXh0OwotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhdGVfZGVmYXVsdFR5cGUgOiAiICsgcmF3VGV4dCk7Ci0JCQkJcEVudGl0eSA9IGVudGl0eVBvb2wucmVmZXJQYXJhKHJhd1RleHQuc3Vic3RyaW5nKDEsIHJhd1RleHQubGVuZ3RoKCkgLSAxKSk7Ci0JCQkJaWYgKHBFbnRpdHkgIT0gbnVsbCkgewotCQkJCQlzdGF0ZSA9IHdoYXRJc1RoZU5leHRBdHRyaWJ1dGVTY2FubmluZ1N0YXRlKHBFbnRpdHkuZXhwYW5kZWRWYWx1ZSwgc2Nhbm5lclN0YXRlKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRWYWx1ZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQlzdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQl9Ci0JCWVsc2UgaWYgKHNjYW5uZXJTdGF0ZSA9PSBBdHRfU2Nhbm5lcl9TdGF0ZV9EZWZhdWx0VmFsdWUpIHsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJyUnLCB0cnVlKSkgewotCQkJCXJhd1RleHQgPSBnZXRQRU5hbWUoKTsKLQkJCQlhdHROb2RlLmRlZmF1bHRWYWx1ZSA9IHJhd1RleHQ7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdGF0ZV9kZWZhdWx0VmFsdWUgOiAiICsgcmF3VGV4dCk7Ci0KLQkJCQlwRW50aXR5ID0gZW50aXR5UG9vbC5yZWZlclBhcmEocmF3VGV4dC5zdWJzdHJpbmcoMSwgcmF3VGV4dC5sZW5ndGgoKSAtIDEpKTsKLQkJCQlpZiAocEVudGl0eSAhPSBudWxsKSB7Ci0JCQkJCXN0YXRlID0gd2hhdElzVGhlTmV4dEF0dHJpYnV0ZVNjYW5uaW5nU3RhdGUocEVudGl0eS5leHBhbmRlZFZhbHVlLCBzY2FubmVyU3RhdGUpOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFZhbHVlOwotCQkJfQotCQkJZWxzZQotCQkJCXN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFZhbHVlOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCXJldHVybiBzdGF0ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRQRU5hbWUoKSB7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWNvbnRlbnRTdHJpbmcuc2tpcFRvQ2hhcignOycsIHRydWUpOwotCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWludCBsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCXJldHVybiBjb250ZW50U3RyaW5nLmdldFN0cmluZyhwcmV2Tm9kZU9mZnNldCwgbGVuKTsKLQl9Ci0KLQlwcml2YXRlIGludCB3aGF0SXNUaGVOZXh0QXR0cmlidXRlU2Nhbm5pbmdTdGF0ZShTdHJpbmcgYXR0ckNvbnRlbnRTdHJpbmcsIGludCBjdXJyZW50U3RhdGUpIHsKLQkJU3RyaW5nUGFyc2VyIHNwID0gbmV3IFN0cmluZ1BhcnNlcihhdHRyQ29udGVudFN0cmluZy50cmltKCkpOwotCi0KLQkJaW50IG5leHRTdGF0ZSA9IGN1cnJlbnRTdGF0ZTsKLQkJaW50IG5PZmZzZXQgPSAwOwotCi0JCS8qCi0JCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiV2hhdGlzdGhlTmV4dCBBdHRDb250ZW50U3RyaW5ndCA6ICIgKwotCQkgKiBhdHRyQ29udGVudFN0cmluZyk7IFN5c3RlbS5vdXQucHJpbnRsbigiV2hhdGlzdGhlTmV4dAotCQkgKiBBdHRDb250ZW50U3RyaW5nTCA6ICIgKyBhdHRyQ29udGVudFN0cmluZy5sZW5ndGgoKSk7Ci0JCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiV2hhdGlzdGhlTmV4dCBjdXJyZW50c3RhdGUgOiAiICsgY3VycmVudFN0YXRlKTsKLQkJICovCi0KLQkJd2hpbGUgKHRydWUpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiV2hhdGlzdGhlTmV4dCBpbnNpZGUgd2hpbCBuZXh0c3RhdGUgOiAiICsKLQkJCS8vIG5leHRTdGF0ZSk7Ci0JCQlpZiAobmV4dFN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX05hbWUpIHsgLy8gdGhlIGN1cnJlbnQKLQkJCQkJCQkJCQkJCQkJLy8gc2Nhbm5pbmcgc3RhdGUgaXMKLQkJCQkJCQkJCQkJCQkJLy8gQXR0ciBOYW1lLCBpcyB0aGUKLQkJCQkJCQkJCQkJCQkJLy8gbmV4dCBwYXJ0IEF0dHIgVHlwZQotCQkJCQkJCQkJCQkJCQkvLyA/Ci0JCQkJaWYgKGlzQXR0ck5hbWUoc3ApKSB7Ci0JCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX1R5cGU7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobmV4dFN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX1R5cGUpIHsgLy8gdGhlIGN1cnJlbnQKLQkJCQkJCQkJCQkJCQkJCS8vIHNjYW5uaW5nIHN0YXRlCi0JCQkJCQkJCQkJCQkJCQkvLyBpcyBBdHRyIFR5cGUsCi0JCQkJCQkJCQkJCQkJCQkvLyBpcyB0aGUgbmV4dAotCQkJCQkJCQkJCQkJCQkJLy8gcGFydCBEZWZhdWx0Ci0JCQkJCQkJCQkJCQkJCQkvLyBBdHRyIFR5cGUgPwotCi0JCQkJaWYgKGlzQXR0clR5cGUoc3ApKSB7Ci0JCQkJCW5leHRTdGF0ZSA9IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlOwotCQkJCX0KLQkJCQllbHNlCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2hhdGlzdGhlTmV4dCBBdHRyIFBhcnQgLSBpcyBub3QgYW4gQXR0ciBUeXBlIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJfQotCi0JCQlpZiAobmV4dFN0YXRlID09IEF0dF9TY2FubmVyX1N0YXRlX0RlZmF1bHRUeXBlKSB7Ci0KLQkJCQlpbnQgZFR5cGUgPSBpc0F0dHJEZWZhdWx0VHlwZShzcCk7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJXaGF0aXN0aGVOZXh0IGluc2lkZSBkVHlwZSA6ICIgKwotCQkJCS8vIGRUeXBlKTsKLQkJCQlpZiAoZFR5cGUgPT0gMSkgLy8gI1JFUVVJUkVEIG9yICNJTVBMSUVECi0JCQkJewotCQkJCQluZXh0U3RhdGUgPSBBdHRfU2Nhbm5lcl9TdGF0ZV9OYW1lOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGRUeXBlID09IDIpIC8vICNGSVhFRAotCQkJCQl7Ci0JCQkJCQkvLyBuZWVkIHRvIGxvb2sgYXQgdGhpcyBhZ2FpbgotCQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfRGVmYXVsdFR5cGU7Ci0JCQkJCX0KLQotCQkJCQlpZiAoc2NhbkRlZmF1bHRBdHRWYWx1ZShzcCkgIT0gbnVsbCkgewotCQkJCQkJbmV4dFN0YXRlID0gQXR0X1NjYW5uZXJfU3RhdGVfTmFtZTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlzcC5za2lwUGFzdFNwYWNlcygpOwotCi0JCQlpZiAobk9mZnNldCA9PSBzcC5nZXRDdXJyZW50T2Zmc2V0KCkpCi0JCQkJYnJlYWs7Ci0KLQkJCW5PZmZzZXQgPSBzcC5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJCWlmIChuT2Zmc2V0ID49IGF0dHJDb250ZW50U3RyaW5nLmxlbmd0aCgpIHx8IG5PZmZzZXQgPT0gLTEpCi0JCQkJYnJlYWs7Ci0KLQkJfSAvLyBlbmQgd2hpbGUKLQotCQlyZXR1cm4gbmV4dFN0YXRlOwotCX0KLQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0ck5hbWUoU3RyaW5nUGFyc2VyIHNwKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaXNBdHRyTmFtZSAtIHNwOiIgKyBzcC5mRGF0YSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaXNBdHRyTmFtZSAtIGN1cnJlbnRPZmZzZXQ6IiArCi0JCS8vIHNwLmdldEN1cnJlbnRPZmZzZXQoKSk7Ci0JCWJvb2xlYW4gaXNBdHRyTmFtZSA9IGZhbHNlOwotCQlpbnQgcHJldiA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJc3Auc2tpcFBhc3ROYW1lKCcgJyk7Ci0JCWlmICgoc3AuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldikgPiAwKQotCQkJaXNBdHRyTmFtZSA9IHRydWU7Ci0JCXJldHVybiBpc0F0dHJOYW1lOwotCi0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQXR0clR5cGUoU3RyaW5nUGFyc2VyIHNwKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaXNBdHRyVHlwZSAtIHNwOiIgKyBzcC5mRGF0YSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaXNBdHRyVHlwZSAtIGN1cnJlbnRPZmZzZXQ6IiArCi0JCS8vIHNwLmdldEN1cnJlbnRPZmZzZXQoKSk7Ci0JCWJvb2xlYW4gaXNBdHRyVHlwZSA9IGZhbHNlOwotCQlpZiAoc3Auc2tpcHBlZFN0cmluZyhjZGF0YV9zdHJpbmcpKSB7Ci0JCQlpc0F0dHJUeXBlID0gdHJ1ZTsKLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKGlkX3N0cmluZykpIHsKLQkJCWlmICghc3Auc2tpcHBlZFN0cmluZyhyZWZfc3RyaW5nKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBJRAotCQkJfQotCQkJZWxzZSBpZiAoIXNwLmxvb2tpbmdBdENoYXIoJ1MnLCB0cnVlKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBJRFJFRlMKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBJRFJFRgotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoZW50aXRfc3RyaW5nKSkgewotCQkJaWYgKHNwLmxvb2tpbmdBdENoYXIoJ1knLCB0cnVlKSkgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBFTlRJVFkKLQkJCX0KLQkJCWVsc2UgaWYgKHNwLnNraXBwZWRTdHJpbmcoaWVzX3N0cmluZykpIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gRU5USVRJVEVTCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhubXRva2VuX3N0cmluZykpIHsKLQkJCWlmIChzcC5sb29raW5nQXRDaGFyKCdTJywgdHJ1ZSkpIHsKLQkJCQlpc0F0dHJUeXBlID0gdHJ1ZTsgLy8gTk1UT0tFTlMKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlzQXR0clR5cGUgPSB0cnVlOyAvLyBOTVRPS0VOCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoc3Auc2tpcHBlZFN0cmluZyhub3RhdGlvbl9zdHJpbmcpKSB7Ci0JCQlpZiAoIXNwLmxvb2tpbmdBdENoYXIoJygnLCB0cnVlKSkgewotCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIG1pc3NpbmcgKCBpbiBub3RhdGlvbiAiKTsKLQkJCX0KLQkJCVZlY3RvciBlbnVtTGlzdCA9IHNjYW5FbnVtZXJhdGlvbihzcCwgdHJ1ZSk7Ci0JCQlpZiAoZW51bUxpc3QgPT0gbnVsbCB8fCBlbnVtTGlzdC5zaXplKCkgPT0gMCkKLQkJCQlpc0F0dHJUeXBlID0gZmFsc2U7Ci0JCQllbHNlCi0JCQkJaXNBdHRyVHlwZSA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoc3AubG9va2luZ0F0Q2hhcignKCcsIHRydWUpKSB7Ci0JCQkvLyAiRU5VTUVSQVRJT04iOwotCQkJVmVjdG9yIGVudW1MaXN0ID0gc2NhbkVudW1lcmF0aW9uKHNwLCBmYWxzZSk7Ci0JCQlpZiAoZW51bUxpc3QgPT0gbnVsbCB8fCBlbnVtTGlzdC5zaXplKCkgPT0gMCkKLQkJCQlpc0F0dHJUeXBlID0gZmFsc2U7Ci0JCQllbHNlCi0JCQkJaXNBdHRyVHlwZSA9IHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gaXNBdHRyVHlwZTsKLQotCX0KLQotCS8qCi0JICogcmV0dXJuIDAgLSBub3QgZGVmYXVsdCB0eXBlIDEgLSAjUkVRVUlSRUQgb3IgI0lNUExJRUQgMiAtICNGSVhFRAotCSAqLwotCi0JcHJpdmF0ZSBpbnQgaXNBdHRyRGVmYXVsdFR5cGUoU3RyaW5nUGFyc2VyIHNwKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaXNBdHRyRGVmYXVsdFR5cGUgLSBzcDoiICsgc3AuZkRhdGEpOwotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKHNwLnNraXBwZWRTdHJpbmcocmVxdWlyZWRfc3RyaW5nKSkgewotCQkJcmVzdWx0ID0gMTsKLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKGltcGxpZWRfc3RyaW5nKSkgewotCQkJcmVzdWx0ID0gMTsKLQkJfQotCQllbHNlIGlmIChzcC5za2lwcGVkU3RyaW5nKGZpeGVkX3N0cmluZykpIHsKLQkJCXJlc3VsdCA9IDI7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLwotCS8vIFs1OF0gTm90YXRpb25UeXBlIDo6PSAnTk9UQVRJT04nIFMgJygnIFM/IE5hbWUgKFM/ICd8JyBTPyBOYW1lKSogUz8gJyknCi0JLy8gWzU5XSBFbnVtZXJhdGlvbiA6Oj0gJygnIFM/IE5tdG9rZW4gKFM/ICd8JyBTPyBObXRva2VuKSogUz8gJyknCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgJygnCi0JLy8KLQlwcml2YXRlIFZlY3RvciBzY2FuRW51bWVyYXRpb24oU3RyaW5nUGFyc2VyIHNwLCBib29sZWFuIGlzTm90YXRpb25UeXBlKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIHNjYW5FbnVtIC4uLiIpOwotCQlWZWN0b3IgZW51bUxpc3QgPSBudWxsOwotCQlpbnQgbGVuOwotCi0JCWlmIChzcC5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJaW50IHByZXZOb2RlT2Zmc2V0ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlpbnQgbm9kZU9mZnNldDsKLQotCQlTdHJpbmcgbm9kZU5hbWU7Ci0KLQkJd2hpbGUgKHRydWUpIHsKLQotCQkJaWYgKGlzTm90YXRpb25UeXBlKQotCQkJCXNwLnNraXBQYXN0TmFtZUFuZFBFUmVmZXJlbmNlKCcpJyk7Ci0JCQllbHNlCi0JCQkJc3Auc2tpcFBhc3RObXRva2VuQW5kUEVSZWZlcmVuY2UoJyknKTsKLQotCQkJbm9kZU9mZnNldCA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJaWYgKG5vZGVPZmZzZXQgPT0gLTEpIHsKLQkJCQlyZXR1cm4gZW51bUxpc3Q7Ci0JCQl9Ci0KLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCW5vZGVOYW1lID0gc3AuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCi0JCQlpZiAoZW51bUxpc3QgPT0gbnVsbCkKLQkJCQllbnVtTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCQkJZW51bUxpc3QuYWRkRWxlbWVudChub2RlTmFtZSk7Ci0KLQkJCWlmIChzcC5sb29raW5nQXRTcGFjZSh0cnVlKSkKLQkJCQlzcC5za2lwUGFzdFNwYWNlcygpOwotCi0JCQlpZiAoIXNwLmxvb2tpbmdBdENoYXIoJ3wnLCB0cnVlKSkgewotCQkJCWlmICghc3AubG9va2luZ0F0Q2hhcignKScsIHRydWUpKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2Nhbm5pbmcgZW51bSB2YWx1ZXMgLSBlcnJvciBtaXNzaW5nICcpJyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKHNwLmxvb2tpbmdBdFNwYWNlKHRydWUpKQotCQkJCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCQl9Ci0JCXJldHVybiBlbnVtTGlzdDsKLQl9Ci0KLQkvLwotCS8vIFsxMF0gQXR0VmFsdWUgOjo9ICciJyAoW148JiJdIHwgUmVmZXJlbmNlKSogJyInCi0JLy8gfCAiJyIgKFtePCYnXSB8IFJlZmVyZW5jZSkqICInIgotCS8vCi0JLyoqCi0JICogU2NhbiB0aGUgZGVmYXVsdCB2YWx1ZSBpbiBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudFR5cGUKLQkgKiAgICAgICAgICAgIGhhbmRsZSB0byB0aGUgZWxlbWVudCB0aGF0IG93bnMgdGhlIGF0dHJpYnV0ZQotCSAqIEBwYXJhbSBhdHRyTmFtZQotCSAqICAgICAgICAgICAgaGFuZGxlIGluIHRoZSBzdHJpbmcgcG9vbCBmb3IgdGhlIGF0dHJpYnV0ZSBuYW1lCi0JICogQHJldHVybiBoYW5kbGUgaW4gdGhlIHN0cmluZyBwb29sIGZvciB0aGUgZGVmYXVsdCBhdHRyaWJ1dGUgdmFsdWUKLQkgKiBAZXhjZXB0aW9uIGphdmEubGFuZy5FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHNjYW5EZWZhdWx0QXR0VmFsdWUoU3RyaW5nUGFyc2VyIHNwKSB7Ci0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic2NhbiBkZWZhdWx0IEFUVCBWYWx1ZS4uLiBzcDoiICsgc3AuZkRhdGEpOwotCi0JCXNwLnNraXBQYXN0U3BhY2VzKCk7Ci0KLQkJYm9vbGVhbiBzaW5nbGU7Ci0JCWlmICghKHNpbmdsZSA9IHNwLmxvb2tpbmdBdENoYXIoJ1wnJywgdHJ1ZSkpICYmICFzcC5sb29raW5nQXRDaGFyKCdcIicsIHRydWUpKSB7Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQljaGFyIHFjaGFyID0gc2luZ2xlID8gJ1wnJyA6ICdcIic7Ci0JCWludCBzT2Zmc2V0ID0gc3AuZ2V0Q3VycmVudE9mZnNldCgpOwotCQlzcC5za2lwVG9DaGFyKHFjaGFyLCB0cnVlKTsKLQkJaW50IGxlbiA9IHNwLmdldEN1cnJlbnRPZmZzZXQoKSAtIHNPZmZzZXQgLSAxOwotCQlpZiAobGVuID09IDApCi0JCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCXZhbHVlID0gc3AuZ2V0U3RyaW5nKHNPZmZzZXQsIGxlbik7Ci0KLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8vCi0JLy8gWzcwXSBFbnRpdHlEZWNsIDo6PSBHRURlY2wgfCBQRURlY2wKLQkvLyBbNzFdIEdFRGVjbCA6Oj0gJzwhRU5USVRZJyBTIE5hbWUgUyBFbnRpdHlEZWYgUz8gJz4nCi0JLy8gWzcyXSBQRURlY2wgOjo9ICc8IUVOVElUWScgUyAnJScgUyBOYW1lIFMgUEVEZWYgUz8gJz4nCi0JLy8gWzczXSBFbnRpdHlEZWYgOjo9IEVudGl0eVZhbHVlIHwgKEV4dGVybmFsSUQgTkRhdGFEZWNsPykKLQkvLyBbNzRdIFBFRGVmIDo6PSBFbnRpdHlWYWx1ZSB8IEV4dGVybmFsSUQKLQkvLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbAotCS8vIHwgJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwgUyBTeXN0ZW1MaXRlcmFsCi0JLy8gWzc2XSBORGF0YURlY2wgOjo9IFMgJ05EQVRBJyBTIE5hbWUKLQkvLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyIKLQkvLwotCS8vIENhbGxlZCBhZnRlciBzY2FubmluZyAnRU5USVRZJwotCS8vCi0JcHVibGljIEVudGl0eURlY2wgc2NhbkVudGl0eURlY2woKSB7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gMTsKLQkJbm9kZU9mZnNldCA9IDE7Ci0JCWludCBsZW47Ci0JCWJvb2xlYW4gaXNQRURlY2wgPSBmYWxzZTsKLQkJRW50aXR5RGVjbCBlbnRpdHlEZWNsID0gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCVN0cmluZyBuZGF0YSA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCclJywgdHJ1ZSkpIHsKLQkJCQlpc1BFRGVjbCA9IGZhbHNlOyAvLyA8IUVOVElUWSB4ICJ4Ij4KLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlpc1BFRGVjbCA9IHRydWU7IC8vIDwhRU5USVRZICUgeCAieCI+Ci0JCQl9Ci0JCQlwcmV2Tm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJY29udGVudFN0cmluZy5za2lwUGFzdE5hbWUoJyAnKTsKLQkJCW5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCWxlbiA9IG5vZGVPZmZzZXQgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJbmFtZSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCXByZXZOb2RlT2Zmc2V0ID0gbm9kZU9mZnNldDsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0KLQkJYm9vbGVhbiBzaW5nbGU7Ci0JCWlmICgoc2luZ2xlID0gY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKSB8fCBjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHNjYW5FbnRpdHlWYWx1ZShzaW5nbGUpOwotCQkJZW50aXR5RGVjbCA9IG5ldyBFbnRpdHlEZWNsKG5hbWUsIG93bmVyRFRELCB2YWx1ZSwgaXNQRURlY2wpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZXh0ZXJuYWwgZW50aXR5Ci0JCQlFeHRlcm5hbElEIHhJRCA9IHNjYW5FeHRlcm5hbElEKCk7Ci0JCQlpZiAoeElEICE9IG51bGwpIHsKLQkJCQlpZiAoIWlzUEVEZWNsKSAvLyBnZW5lcmFsIGVudGl0eQotCQkJCXsKLQkJCQkJYm9vbGVhbiB1bnBhcnNlZCA9IGZhbHNlOwotCQkJCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQkJCXVucGFyc2VkID0gY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKG5kYXRhX3N0cmluZyk7Ci0JCQkJCWlmICh1bnBhcnNlZCkgewotCQkJCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQkJCQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3ROYW1lKCcgJyk7Ci0JCQkJCQlub2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQkJCQlsZW4gPSBub2RlT2Zmc2V0IC0gcHJldk5vZGVPZmZzZXQ7Ci0JCQkJCQluZGF0YSA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVudGl0eURlY2wgPSBuZXcgRW50aXR5RGVjbChuYW1lLCBvd25lckRURCwgeElELCBpc1BFRGVjbCwgbmRhdGEpOwotCQkJfQotCQl9Ci0JCXJldHVybiBlbnRpdHlEZWNsOwotCX0KLQotCi0JLy8KLQkvLyBbODJdIE5vdGF0aW9uRGVjbCA6Oj0gJzwhTk9UQVRJT04nIFMgTmFtZSBTIChFeHRlcm5hbElEIHwgUHVibGljSUQpIFM/Ci0JLy8gJz4nCi0JLy8gWzc1XSBFeHRlcm5hbElEIDo6PSAnU1lTVEVNJyBTIFN5c3RlbUxpdGVyYWwKLQkvLyB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbAotCS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsCi0JLy8KLQkvLyBDYWxsZWQgYWZ0ZXIgc2Nhbm5pbmcgJ05PVEFUSU9OJwotCS8vCi0JcHVibGljIE5vdGF0aW9uRGVjbCBzY2FuTm90YXRpb25EZWNsKCkgewotCQlwcmV2Tm9kZU9mZnNldCA9IDE7Ci0JCW5vZGVPZmZzZXQgPSAxOwotCQlpbnQgbGVuOwotCQlOb3RhdGlvbkRlY2wgbm90YXRpb25EZWNsID0gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IG51bGw7Ci0KLQkJaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0TmFtZSgnICcpOwotCQkJbm9kZU9mZnNldCA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpOwotCQkJbGVuID0gbm9kZU9mZnNldCAtIHByZXZOb2RlT2Zmc2V0OwotCQkJaWYgKGxlbiA+IDApIHsKLQkJCQluYW1lID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQkJcHJldk5vZGVPZmZzZXQgPSBub2RlT2Zmc2V0OwotCQkJfQotCQl9Ci0KLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQlub3RhdGlvbkRlY2wgPSBuZXcgTm90YXRpb25EZWNsKG5hbWUsIG93bmVyRFREKTsKLQotCQlFeHRlcm5hbElEIHhJRCA9IHNjYW5FeHRlcm5hbElEKCk7Ci0JCWlmICh4SUQgIT0gbnVsbCkgewotCQkJaWYgKHhJRC5nZXRTeXN0ZW1MaXRlcmFsKCkgIT0gbnVsbCkgewotCQkJCW5vdGF0aW9uRGVjbC5zZXRTeXN0ZW1JZCh4SUQuZ2V0U3lzdGVtTGl0ZXJhbCgpKTsKLQkJCX0KLQkJCWlmICh4SUQuZ2V0UHViSWRMaXRlcmFsKCkgIT0gbnVsbCkgewotCQkJCW5vdGF0aW9uRGVjbC5zZXRQdWJsaWNJZCh4SUQuZ2V0UHViSWRMaXRlcmFsKCkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5vdGF0aW9uRGVjbDsKLQl9Ci0KLQotCXByaXZhdGUgU3RyaW5nIHNjYW5FbnRpdHlWYWx1ZShib29sZWFuIHNpbmdsZSkgewotCQljaGFyIHFjaGFyID0gc2luZ2xlID8gJ1wnJyA6ICdcIic7Ci0JCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCWNvbnRlbnRTdHJpbmcuc2tpcFRvQ2hhcihxY2hhciwgZmFsc2UpOwotCQlpbnQgbGVuID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2Tm9kZU9mZnNldDsKLQkJU3RyaW5nIHZhbHVlID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvLwotCS8vIFs3NV0gRXh0ZXJuYWxJRCA6Oj0gJ1NZU1RFTScgUyBTeXN0ZW1MaXRlcmFsCi0JLy8gfCAnUFVCTElDJyBTIFB1YmlkTGl0ZXJhbCBTIFN5c3RlbUxpdGVyYWwKLQlwcml2YXRlIEV4dGVybmFsSUQgc2NhbkV4dGVybmFsSUQoKSB7Ci0JCUV4dGVybmFsSUQgeElEID0gbnVsbDsKLQkJY2hhciBxY2hhciA9ICdcIic7Ci0JCWlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcoc3lzdGVtX3N0cmluZykpIHsKLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCi0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wnJzsKLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcIic7Ci0KLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIHRydWUpOwotCQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQgLSAxOwotCQkJU3RyaW5nIHN5c3RlbUlkID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInN5c3RlbWlkLi4uIiArIHN5c3RlbUlkKTsKLQkJCXhJRCA9IG5ldyBFeHRlcm5hbElEKHN5c3RlbUlkKTsKLQkJfQotCQllbHNlIGlmIChjb250ZW50U3RyaW5nLnNraXBwZWRTdHJpbmcocHVibGljX3N0cmluZykpIHsKLQkJCWlmICghY29udGVudFN0cmluZy5sb29raW5nQXRTcGFjZSh0cnVlKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQljb250ZW50U3RyaW5nLnNraXBQYXN0U3BhY2VzKCk7Ci0JCQlpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcJycsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wnJzsKLQkJCWVsc2UgaWYgKGNvbnRlbnRTdHJpbmcubG9va2luZ0F0Q2hhcignXCInLCB0cnVlKSkKLQkJCQlxY2hhciA9ICdcIic7Ci0KLQkJCS8vIHB1YmxpY0xpdGVyYWwKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIHRydWUpOwotCQkJaW50IGxlbiA9IGNvbnRlbnRTdHJpbmcuZ2V0Q3VycmVudE9mZnNldCgpIC0gcHJldk5vZGVPZmZzZXQgLSAxOwotCQkJU3RyaW5nIHB1YmxpY0lkID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0KLQkJCS8vIHN5c3RlbUxpdGVyYWwKLQkJCWNvbnRlbnRTdHJpbmcuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCWlmIChjb250ZW50U3RyaW5nLmxvb2tpbmdBdENoYXIoJ1wnJywgdHJ1ZSkpCi0JCQkJcWNoYXIgPSAnXCcnOwotCQkJZWxzZSBpZiAoY29udGVudFN0cmluZy5sb29raW5nQXRDaGFyKCdcIicsIHRydWUpKQotCQkJCXFjaGFyID0gJ1wiJzsKLQkJCXByZXZOb2RlT2Zmc2V0ID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCk7Ci0JCQljb250ZW50U3RyaW5nLnNraXBUb0NoYXIocWNoYXIsIHRydWUpOwotCQkJbGVuID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2Tm9kZU9mZnNldCAtIDE7Ci0KLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJU3RyaW5nIHN5c3RlbUlkID0gY29udGVudFN0cmluZy5nZXRTdHJpbmcocHJldk5vZGVPZmZzZXQsIGxlbik7Ci0JCQkJeElEID0gbmV3IEV4dGVybmFsSUQocHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXhJRCA9IG5ldyBFeHRlcm5hbElEKHB1YmxpY0lkLCBudWxsKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geElEOwotCX0KLQotCS8vCi0JLy8gWzgzXSBQdWJsaWNJRCA6Oj0gJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwKLQkvLwotCi0JLy8gZG13IDExLzE1IHByaXZhdGUgbWV0aG9kIG5ldmVyIHJlYWQgbG9jYWxseQotCS8vIFRPRE86IGNoYW5nZSB0byBwcml2YXRlIGlmIHVzZWQsIG90aGVyd2lzZSBzaG91bGQgYmUgcmVtb3ZlZAotCVN0cmluZyBzY2FuUHVibGljSUQoKSB7Ci0JCVN0cmluZyBwSUQgPSBudWxsOwotCQlpZiAoY29udGVudFN0cmluZy5za2lwcGVkU3RyaW5nKHB1YmxpY19zdHJpbmcpKSB7Ci0JCQlpZiAoIWNvbnRlbnRTdHJpbmcubG9va2luZ0F0U3BhY2UodHJ1ZSkpIHsKLQkJCQlyZXR1cm4gcElEOwotCQkJfQotCQkJY29udGVudFN0cmluZy5za2lwUGFzdFNwYWNlcygpOwotCQkJcHJldk5vZGVPZmZzZXQgPSBjb250ZW50U3RyaW5nLmdldEN1cnJlbnRPZmZzZXQoKTsKLQotCQkJY29udGVudFN0cmluZy5za2lwVG9DaGFyKCcgJywgdHJ1ZSk7Ci0JCQlpbnQgbGVuID0gY29udGVudFN0cmluZy5nZXRDdXJyZW50T2Zmc2V0KCkgLSBwcmV2Tm9kZU9mZnNldDsKLQkJCXBJRCA9IGNvbnRlbnRTdHJpbmcuZ2V0U3RyaW5nKHByZXZOb2RlT2Zmc2V0LCBsZW4pOwotCQl9Ci0KLQkJcmV0dXJuIHBJRDsKLQl9Ci0KLQkvLwotCS8vIE1haW4KLQkvLwotCi0JLyoqIE1haW4gcHJvZ3JhbSBlbnRyeSBwb2ludC4gKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0KLQkJLy8gaXMgdGhlcmUgYW55dGhpbmcgdG8gZG8/Ci0JCWlmIChhcmd2Lmxlbmd0aCA9PSAwKSB7Ci0JCQlTeXN0ZW0uZXhpdCgxKTsKLQkJfQotCi0JCS8vIERURFNjYW5uZXIgc2MgPSBuZXcgRFREU2Nhbm5lcihhcmd2WzBdKTsKLQkJRFREU2Nhbm5lciBzYyA9IG5ldyBEVERTY2FubmVyKCJoZWxsby5kdGQiLCAiIGdpZiBTWVNURU0gXCJHSUYgRmlsZVwiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlOb3RhdGlvbkRlY2wgbiA9IHNjLnNjYW5Ob3RhdGlvbkRlY2woKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJOb2F0aW9uIE5hbWU6ICIgKyBuLmdldE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiU3lzdGVtSWQ6ICIgKyBuLmdldFN5c3RlbUlkKCkpOyAvLyROT04tTkxTLTEkCi0KLQotCQkvLyBBdHRyaWJ1dGVzCi0JCS8vIFZlY3RvciBsaXN0cyA9IHNjLnNjYW5BdHRsaXN0RGVjbCgpOwotCQkvLyBzYy5wcmludEF0dExpc3QobGlzdHMpOwotCi0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiQ006ICIgKyBzYy5zY2FuQ29udGVudE1vZGVsKCkpOwotCi0JfSAvLyBtYWluKFN0cmluZ1tdKQotCi0JLyoqCi0JICogR2V0cyB0aGUgZXJyb3JTdHJpbmcKLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yU3RyaW5nKCkgewotCQlyZXR1cm4gZXJyb3JTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZXJyb3JTdHJpbmcKLQkgKiAKLQkgKiBAcGFyYW0gZXJyb3JTdHJpbmcKLQkgKiAgICAgICAgICAgIFRoZSBlcnJvclN0cmluZyB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvclN0cmluZyhTdHJpbmcgZXJyb3JTdHJpbmcpIHsKLQkJdGhpcy5lcnJvclN0cmluZyA9IGVycm9yU3RyaW5nOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRGVjbE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0RlY2xOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1NzIwYjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRGVjbE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIERlY2xOb2RlIHsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQVRUTElTVCA9IDI7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5USVRZID0gMzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBJTlRFUk5BTF9FTlRJVFkgPSA0OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX0VOVElUWSA9IDU7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgSU5URVJOQUxfR0VORVJBTF9FTlRJVFkgPSA2OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IElOVEVSTkFMX1BBUkFNRVRFUl9FTlRJVFkgPSA3OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVYVEVSTkFMX0dFTkVSQUxfRU5USVRZID0gODsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFWFRFUk5BTF9QQVJBTUVURVJfRU5USVRZID0gOTsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBQQVJBTUVURVJfRU5USVRZX1JFRkVSRU5DRSA9IDEwOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IE5PVEFUSU9OID0gMTE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgQ09NTUVOVCA9IDEyOwotCi0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgU1RBUlRfRFREID0gMjE7Ci0Jc3RhdGljIHB1YmxpYyBmaW5hbCBpbnQgRU5EX0RURCA9IDIyOwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IFNUQVJUX0VOVElUWV9EVEQgPSAyMzsKLQlzdGF0aWMgcHVibGljIGZpbmFsIGludCBFTkRfRU5USVRZX0RURCA9IDI0OwotCXN0YXRpYyBwdWJsaWMgZmluYWwgaW50IEVSUk9SID0gMjU7Ci0KLQlwdWJsaWMgaW50IHR5cGUgPSBJTlZBTElEOwotCXByaXZhdGUgU3RyaW5nIGRlY2xOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBjb250ZW50U3RyaW5nID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGNvbW1lbnQgPSBudWxsOwotCi0JLy8KLQkvLyBDb25zdGFudHMKLQkvLwotCi0JLyoqIERlZmF1bHQgY29uc3RydWN0b3IuICovCi0JcHVibGljIERlY2xOb2RlKGludCB0eXBlKSB7Ci0JCXRoaXMobnVsbCwgdHlwZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIERlY2xOb2RlKFN0cmluZyBuYW1lLCBpbnQgdHlwZSwgU3RyaW5nIGNvbnRlbnRTdHJpbmcpIHsKLQkJdGhpcy5kZWNsTmFtZSA9IG5hbWU7Ci0JCXRoaXMudHlwZSA9IHR5cGU7Ci0JCXRoaXMuY29udGVudFN0cmluZyA9IGNvbnRlbnRTdHJpbmc7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWNsTmFtZSgpIHsKLQkJcmV0dXJuIGRlY2xOYW1lOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlY2xOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWRlY2xOYW1lID0gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFR5cGUoKSB7Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoaW50IHR5cGUpIHsKLQkJdGhpcy50eXBlID0gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZXJyb3JNZXNzYWdlID0gbWVzc2FnZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRTdHJpbmcoKSB7Ci0JCXJldHVybiBjb250ZW50U3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRTdHJpbmcoU3RyaW5nIGNvbnRlbnQpIHsKLQkJdGhpcy5jb250ZW50U3RyaW5nID0gY29udGVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbW1lbnQoKSB7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKLQkJdGhpcy5jb21tZW50ID0gY29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLQotCXsKLQkJcmV0dXJuICJOb2RlIE5hbWU6ICIgKyBkZWNsTmFtZSArICIgVHlwZTogIiArIHR5cGUgKyAiIENvbnRlbnRTdHJpbmc6ICIgKyBjb250ZW50U3RyaW5nOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRWxlbWVudERlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U4NzE2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbGVtZW50RGVjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBFbGVtZW50RGVjbCBleHRlbmRzIEJhc2VOb2RlIHsKLQlDTU5vZGUgY29udGVudE1vZGVsTm9kZSA9IG51bGw7Ci0KLQlwdWJsaWMgRWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCkgewotCQl0aGlzKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBvd25lckRURCwgU3RyaW5nIGNvbW1lbnQsIEVycm9yTWVzc2FnZSBlcnJvck1lc3NhZ2UpIHsKLQkJc3VwZXIobmFtZSwgb3duZXJEVEQsIGNvbW1lbnQsIGVycm9yTWVzc2FnZSk7Ci0JfQotCi0JcHVibGljIENNTm9kZSBnZXRDb250ZW50TW9kZWxOb2RlKCkgewotCQlyZXR1cm4gY29udGVudE1vZGVsTm9kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb250ZW50TW9kZWxOb2RlKENNTm9kZSBjbW5vZGUpIHsKLQkJY29udGVudE1vZGVsTm9kZSA9IGNtbm9kZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eURlY2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eURlY2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczYzk5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlEZWNsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBFbnRpdHlEZWNsIGV4dGVuZHMgQmFzZU5vZGUgewotCWJvb2xlYW4gaXNQYXJhbWV0ZXIgPSBmYWxzZTsKLQlTdHJpbmcgZXhwYW5kZWRWYWx1ZSA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGV4dGVybmFsCi0JCQkJCQkJCQkvLyBFbnRpdGllcwotCVN0cmluZyB2YWx1ZSA9IG51bGw7IC8vIEFsd2F5cyA8dmFyPm51bGw8L3Zhcj4gZm9yIGV4dGVybmFsIEVudGl0aWVzCi0JRXh0ZXJuYWxJRCBleHRlcm5hbElEID0gbnVsbDsgLy8gQWx3YXlzIDx2YXI+bnVsbDwvdmFyPiBmb3IgaW50ZXJuYWwKLQkJCQkJCQkJCS8vIEVudGl0aWVzCi0JU3RyaW5nIG5kYXRhID0gbnVsbDsgLy8gQWx3YXlzIDx2YXI+bnVsbDwvdmFyPiBmb3IgaW50ZXJuYWwgRW50aXRpZXMKLQotCWJvb2xlYW4gcGFyc2VkID0gZmFsc2U7Ci0JRFREUGFyc2VyIGR0ZCA9IG51bGw7IC8vIEFsd2F5cyBudWxsLCBleGNlcHQgd2hlbiBpdCBoYXMgYmVlbiBwYXJzZWQuCi0KLQlib29sZWFuIGVudGl0eVJlZmVyZW5jZWQgPSBmYWxzZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBpbnRlcm5hbCBFbnRpdGllcy4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgTmFtZSBvZiB0aGlzIEVudGl0eS4KLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIFRoZSBYTUwtZW5jb2RlZCB2YWx1ZSB0aGF0IHdhcyBkaXJlY3RseSBhc3NpZ25lZCB0byB0aGUKLQkgKiAgICAgICAgICAgIEVudGl0eS4KLQkgKiBAcGFyYW0gaXNQYXJhbWV0ZXIKLQkgKiAgICAgICAgICAgID10cnVlIGlmIGEgcGFyYW1ldGVyIEVudGl0eTsgb3RoZXJ3aXNlID1mYWxzZS4KLQkgKi8KLQlwdWJsaWMgRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFRELCBTdHJpbmcgdmFsdWUsIGJvb2xlYW4gaXNQYXJhbWV0ZXIpIHsKLQkJc3VwZXIobmFtZSwgb3duZXJEVEQsIG51bGwsIG51bGwpOwotCQl0aGlzLnZhbHVlID0gdmFsdWU7Ci0JCXRoaXMuaXNQYXJhbWV0ZXIgPSBpc1BhcmFtZXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgZXh0ZXJuYWwgRW50aXRpZXMuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIE5hbWUgb2YgdGhlIEVudGl0eS4KLQkgKiBAcGFyYW0gZXh0ZXJuYWxJRAotCSAqICAgICAgICAgICAgVGhlIHJlZmVyZW5jZShzKSB0byB0aGUgZXh0ZXJuYWwgZW50aXR5IHRvIHJldHJpZXZlLgotCSAqIEBwYXJhbSBpc1BhcmFtZXRlcgotCSAqICAgICAgICAgICAgPXRydWUgaWYgYSBwYXJhbWV0ZXIgRW50aXR5OyBvdGhlcndpc2UgPWZhbHNlLgotCSAqIEBwYXJhbSBuZGF0YQotCSAqICAgICAgICAgICAgVGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYmluYXJ5IEVudGl0eSwgb3IgPHZhcj5udWxsPC92YXI+Ci0JICogICAgICAgICAgICBpZiB0aGUgRW50aXR5IGlzIGEgdGV4dCBFbnRpdHkuCi0JICogQHNlZSBzYXguRXh0ZXJuYWxJRAotCSAqLwotCXB1YmxpYyBFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgb3duZXJEVEQsIEV4dGVybmFsSUQgZXh0ZXJuYWxJRCwgYm9vbGVhbiBpc1BhcmFtZXRlciwgU3RyaW5nIG5kYXRhKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFRELCBudWxsLCBudWxsKTsKLQkJdGhpcy5leHRlcm5hbElEID0gZXh0ZXJuYWxJRDsKLQkJdGhpcy5pc1BhcmFtZXRlciA9IGlzUGFyYW1ldGVyOwotCQl0aGlzLm5kYXRhID0gbmRhdGE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgRW50aXR5IGlzIGEgcGFyYW1ldGVyIEVudGl0eS4KLQkgKiAKLQkgKiBAcmV0dXJuID10cnVlIGlmIGFuIGludGVybmFsIHBhcmFtZXRlciBFbnRpdHk7IG90aGVyd2lzZSA9ZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXIoKSB7Ci0JCXJldHVybiB0aGlzLmlzUGFyYW1ldGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoaXMgRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIFhNTC1lbmNvZGVkIHZhbHVlIHRoYXQgd2FzIGRpcmVjdGx5IGFzc2lnbmVkIHRvIHRoZQotCSAqICAgICAgICAgaW50ZXJuYWwgRW50aXR5OyBvdGhlcndpc2UsIDx2YXI+bnVsbDwvdmFyPi4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VudGl0eVJlZmVyZW5jZWQoKSB7Ci0JCXJldHVybiBlbnRpdHlSZWZlcmVuY2VkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVudGl0eVJlZmVyZW5jZWQoYm9vbGVhbiByZWZlcmVuY2UpIHsKLQkJZW50aXR5UmVmZXJlbmNlZCA9IHJlZmVyZW5jZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoZSBOb3RhdGlvbi4gQSBzeXN0ZW0gaWRlbnRpZmllciBpcyBhCi0JICogVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncyBjb250ZW50LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHN5c3RlbSBpZGVudGlmaWVyLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgdGhlIGlkZW50aWZpZXIgaXMKLQkgKiAgICAgICAgIG5vdCBkZWZpbmVkLgotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkV4dGVybmFsSUQjZ2V0U3lzdGVtTGl0ZXJhbAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCWlmIChleHRlcm5hbElEID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJZWxzZQotCQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRC5nZXRTeXN0ZW1MaXRlcmFsKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgdGhlIE5vdGF0aW9uLiBBIHN5c3RlbSBpZGVudGlmaWVyIGlzIGEKLQkgKiBVUkksIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzIGNvbnRlbnQuCi0JICogPHA+Ci0JICogVGhpcyBtZXRob2QgaXMgZGVmaW5lZCBieSBET00uCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlkZW50aWZpZXIKLQkgKiAgICAgICAgICAgIFRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSWQoU3RyaW5nIHN5c3RlbUlkZW50aWZpZXIpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzZXRTWXN0ZW1JZCAtIGV4dGVybmFsSWQ6ICIgKyBleHRlcm5hbElEKTsKLQkJdGhpcy5leHRlcm5hbElEID0gbmV3IEV4dGVybmFsSUQodGhpcy5leHRlcm5hbElELmdldFB1YklkTGl0ZXJhbCgpLCBzeXN0ZW1JZGVudGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZiB0aGUgTm90YXRpb24uIFRoaXMgdmFsdWUgaXMgb25seSB2YWxpZAotCSAqIGlmIHRoZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXMgPHZhcj5wdWJsaWM8L3Zhcj4gKGFzIG9wcG9zZWQgdG8KLQkgKiA8dmFyPnN5c3RlbTwvdmFyPikuIFB1YmxpYyBpZGVudGlmaWVycyBtYXkgYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUKLQkgKiBhbiBhbHRlcm5hdGl2ZSBVUkkgaW4gb3JkZXIgdG8gcmV0cmlldmUgdGhlIGFuIGV4dGVybmFsIGVudGl0aWVzCi0JICogY29udGVudC4gSWYgcmV0cmlldmFsIGZhaWxzIHVzaW5nIHRoZSBwdWJsaWMgaWRlbnRpZmllciwgYW4gYXR0ZW1wdAotCSAqIG11c3QgYmUgbWFkZSB0byByZXRyaWV2ZSBjb250ZW50IHVzaW5nIHRoZSBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBwdWJsaWMgaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJaWYgKGV4dGVybmFsSUQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQllbHNlCi0JCQlyZXR1cm4gdGhpcy5leHRlcm5hbElELmdldFB1YklkTGl0ZXJhbCgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoZSBOb3RhdGlvbi4gVGhpcyB2YWx1ZSBpcyBvbmx5IHZhbGlkIGlmCi0JICogdGhlIGlkZW50aWZpZXIgaXMgZGVmaW5lZCBhcyA8dmFyPnB1YmxpYzwvdmFyPiAoYXMgb3Bwb3NlZCB0bwotCSAqIDx2YXI+c3lzdGVtPC92YXI+KS4gUHVibGljIGlkZW50aWZpZXJzIG1heSBiZSB1c2VkIHRvIHRyeSB0byBnZW5lcmF0ZQotCSAqIGFuIGFsdGVybmF0aXZlIFVSSSBpbiBvcmRlciB0byByZXRyaWV2ZSB0aGUgYW4gZXh0ZXJuYWwgZW50aXRpZXMKLQkgKiBjb250ZW50LiBJZiByZXRyaWV2YWwgZmFpbHMgdXNpbmcgdGhlIHB1YmxpYyBpZGVudGlmaWVyLCBhbiBhdHRlbXB0Ci0JICogbXVzdCBiZSBtYWRlIHRvIHJldHJpZXZlIGNvbnRlbnQgdXNpbmcgdGhlIHN5c3RlbSBpZGVudGlmaWVyLgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZGVudGlmaWVyCi0JICogICAgICAgICAgICBUaGUgcHVibGljIGlkZW50aWZpZXIuCi0JICogQHNlZSAjZ2V0UHVibGljSWQKLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkZW50aWZpZXIpIHsKLQkJdGhpcy5leHRlcm5hbElEID0gbmV3IEV4dGVybmFsSUQocHVibGljSWRlbnRpZmllciwgdGhpcy5leHRlcm5hbElELmdldFN5c3RlbUxpdGVyYWwoKSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZXh0ZXJuYWwgSUQgb2YgdGhpcyBFbnRpdHkuCi0JICogCi0JICogQHJldHVybiBUaGUgcmVmZXJlbmNlKHMpIHRvIHRoZSBleHRlcm5hbCBlbnRpdHkgdG8gcmV0cmlldmU7IG90aGVyd2lzZSwKLQkgKiAgICAgICAgIDx2YXI+bnVsbDwvdmFyPi4KLQkgKiBAc2VlIG9yZy5lY2xpcGNzZS53c3QuZHRkLnBhcnNlci5FeHRlcm5hbElECi0JICovCi0JcHVibGljIEV4dGVybmFsSUQgZ2V0RXh0ZXJuYWxJRCgpIHsKLQkJcmV0dXJuIHRoaXMuZXh0ZXJuYWxJRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBlbnRpdHkgdmFsdWUgaXMgZXh0ZXJuYWwuCi0JICogCi0JICogQHJldHVybiA9dHJ1ZSBpZiBlbnRpdHkgaXMgZXh0ZXJuYWw7IG90aGVyd2lzZSwgPWZhbHNlLgotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkV4dGVybmFsSUQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsKCkgewotCQlyZXR1cm4gdGhpcy5leHRlcm5hbElEICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZXJuYWwgYmluYXJ5IEVudGl0eSwKLQkgKiAgICAgICAgIG90aGVyd2lzZSwgPHZhcj5udWxsPC92YXI+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb24oKSB7Ci0JCXJldHVybiB0aGlzLm5kYXRhOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uKFN0cmluZyBuZGF0YSkgewotCQl0aGlzLm5kYXRhID0gbmRhdGE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbm90YXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgRW50aXR5LgotCSAqIDxwPgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlZmluZWQgYnkgRE9NLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIG5vdGF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgZXh0ZXJuYWwgYmluYXJ5IEVudGl0eSwKLQkgKiAgICAgICAgIG90aGVyd2lzZSwgPHZhcj5udWxsPC92YXI+LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlyZXR1cm4gdGhpcy5uZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBkZWZpbmVkIGJ5IERPTS4KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoU3RyaW5nIGFyZykgeyB0aGlzLm5kYXRhID0gYXJnOyB9Ci0JICovCi0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhlcmUgaXMgYSBub3RhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRpdHkgdmFsdWUuCi0JICogCi0JICogQHJldHVybiA9dHJ1ZSBpZiB0aGUgZXh0ZXJuYWwgYmluYXJ5IGVudGl0eSBjb250YWlucyBhIG5vdGF0aW9uOwotCSAqICAgICAgICAgb3RoZXJ3aXNlLCA9ZmFsc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOb3RhdGlvbigpIHsKLQkJcmV0dXJuIHRoaXMubmRhdGEgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgcykgewotCQl0aGlzLnZhbHVlID0gczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJzZWQoYm9vbGVhbiBwKSB7Ci0JCXRoaXMucGFyc2VkID0gcDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRQYXJzZWQoKSB7Ci0JCXJldHVybiB0aGlzLnBhcnNlZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eVBvb2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0VudGl0eVBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzZTQxNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9FbnRpdHlQb29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5UG9vbCB7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbV9lbnRpdHkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbV9wYXJhID0gbmV3IEhhc2h0YWJsZSgpOyAvLyBwYXJhbWV0ZXIgcmVmZXJlbmNlcwotCi0JcHVibGljIEVudGl0eVBvb2woKSB7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gYWRkKEVudGl0eURlY2wgZW50aXR5KSB7Ci0JCVN0cmluZyBuYW1lID0gZW50aXR5LmdldE5vZGVOYW1lKCk7Ci0JCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXIoKSkgewotCQkJaWYgKG1fcGFyYS5jb250YWluc0tleShuYW1lKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQltX3BhcmEucHV0KG5hbWUsIGVudGl0eSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobV9lbnRpdHkuY29udGFpbnNLZXkobmFtZSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJbV9lbnRpdHkucHV0KG5hbWUsIGVudGl0eSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIEVudGl0eURlY2wgcmVmZXIoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChFbnRpdHlEZWNsKSBtX2VudGl0eS5nZXQobmFtZSk7Ci0JfQotCi0JcHVibGljIEVudGl0eURlY2wgcmVmZXJQYXJhKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoRW50aXR5RGVjbCkgbV9wYXJhLmdldChuYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gPENPREU+RW51bWVyYXRpb248L0NPREU+IG9mIDxDT0RFPkVudGl0eURlY2w8L0NPREU+LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkVudGl0eURlY2wKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCXJldHVybiBtX2VudGl0eS5lbGVtZW50cygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhbiA8Q09ERT5FbnVtZXJhdGlvbjwvQ09ERT4gb2YgPENPREU+RW50aXR5RGVjbDwvQ09ERT4gZm9yCi0JICogcGFyYW1ldGVyIGVudGl0aWVzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwY3NlLndzdC5kdGQucGFyc2VyLkVudGl0eURlY2wKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gcGFyYW1ldGVyRW50aXR5RWxlbWVudHMoKSB7Ci0JCXJldHVybiBtX3BhcmEuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgRFREI2dldEVudGl0aWVzKCk7Ci0JICovCi0JSGFzaHRhYmxlIGdldEVudGl0eUhhc2goKSB7Ci0JCXJldHVybiB0aGlzLm1fZW50aXR5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0Vycm9yTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5OTVlOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXJyb3JNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLQotCi1wdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlIHsKLQlwcml2YXRlIGludCBlcnJvckxpbmUsIGVycm9yQ29sdW1uLCBzZXZlcml0eTsKLQlwcml2YXRlIFN0cmluZyBlcnJvclN0cmluZzsKLQotCi0JcHVibGljIEVycm9yTWVzc2FnZSgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yKSB7Ci0JCWVycm9yU3RyaW5nID0gZXJyb3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldmVyaXR5KSB7Ci0JCXRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZXZlcml0eShTdHJpbmcgc2V2ZXJpdHkpIHsKLQkJaWYgKHNldmVyaXR5ID09ICJ3YXJuaW5nIikgeyAvLyROT04tTkxTLTEkCi0JCQl0aGlzLnNldmVyaXR5ID0gMDsKLQkJfQotCQllbHNlIGlmIChzZXZlcml0eSA9PSAiZXJyb3IiKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXRoaXMuc2V2ZXJpdHkgPSAxOwotCQl9Ci0JCWVsc2UgaWYgKHNldmVyaXR5ID09ICJmYXRhbCIpIHsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5zZXZlcml0eSA9IDI7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvckxpbmUoaW50IGxpbmUpIHsKLQkJZXJyb3JMaW5lID0gbGluZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFcnJvckNvbHVtbihpbnQgY29sdW1uKSB7Ci0JCWVycm9yQ29sdW1uID0gY29sdW1uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZXJyb3JTdHJpbmc7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJcmV0dXJuIHNldmVyaXR5OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXJyb3JMaW5lKCkgewotCQlyZXR1cm4gZXJyb3JMaW5lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXJyb3JDb2x1bW4oKSB7Ci0JCXJldHVybiBlcnJvckNvbHVtbjsKLQl9Ci0KLQlwcml2YXRlIGludCBzdGFydE9mZnNldCA9IC0xOwotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JTdGFydE9mZnNldChpbnQgc3RhcnQpIHsKLQkJc3RhcnRPZmZzZXQgPSBzdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVycm9yU3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBzdGFydE9mZnNldDsKLQl9Ci0KLQlwcml2YXRlIGludCBlbmRPZmZzZXQgPSAtMTsKLQotCXB1YmxpYyB2b2lkIHNldEVycm9yRW5kT2Zmc2V0KGludCBlbmQpIHsKLQkJZW5kT2Zmc2V0ID0gZW5kOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RXJyb3JFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBlbmRPZmZzZXQ7Ci0JfQotCi0KLQlPYmplY3Qgb2JqZWN0OwotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgY2xvc2VzdCBvYmplY3QgdG8gdGhlIGVycm9yLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygb2JqZWN0LgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0T2JqZWN0KCkgewotCQlyZXR1cm4gb2JqZWN0OwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgY2xvc2VzdCBvYmplY3QgdG8gdGhlIGVycm9yLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9iamVjdChPYmplY3QgdikgewotCQl0aGlzLm9iamVjdCA9IHY7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGROZXdFcnJvck1lc3NhZ2VMaW5lKFN0cmluZyBuZXdMaW5lKSB7Ci0JCWVycm9yU3RyaW5nICs9ICJcbiIgKyBuZXdMaW5lOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXh0ZXJuYWxJRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvRXh0ZXJuYWxJRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWIwOTg4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL0V4dGVybmFsSUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEV4dGVybmFsSUQgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUX1NZU1RFTSA9IDA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRfUFVCTElDID0gMTsKLQotCWludCB0eXBlID0gVF9QVUJMSUM7Ci0JU3RyaW5nIHB1YmxpY0lEID0gbnVsbDsKLQlTdHJpbmcgc3lzdGVtSUQgPSBudWxsOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIHN5c3RlbSBJRHMuCi0JICogCi0JICogQHBhcmFtIHN5c3RlbUlECi0JICogICAgICAgICAgICBVUkksIHdoaWNoIG1heSBiZSB1c2VkIHRvIHJldHJpZXZlIGFuIGV4dGVybmFsIGVudGl0eSdzCi0JICogICAgICAgICAgICBjb250ZW50LgotCSAqLwotCXB1YmxpYyBFeHRlcm5hbElEKFN0cmluZyBzeXN0ZW1JRCkgewotCQl0aGlzLnR5cGUgPSBUX1NZU1RFTTsKLQkJdGhpcy5wdWJsaWNJRCA9IG51bGw7Ci0JCXRoaXMuc3lzdGVtSUQgPSBzeXN0ZW1JRDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgcHVibGljIGFuZCBzeXN0ZW0gSURzLgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJRAotCSAqICAgICAgICAgICAgSWRlbnRpZmllciB0byBiZSB1c2VkIHRvIHRyeSB0byBnZW5lcmF0ZSBhbiBhbHRlcm5hdGl2ZSBVUkkKLQkgKiAgICAgICAgICAgIGluIG9yZGVyIHRvIHJldHJpZXZlIHRoZSBleHRlcm5hbCBlbnRpdHkncyBjb250ZW50LCBvcgotCSAqICAgICAgICAgICAgPHZhcj5udWxsPC92YXI+IGlmIGEgc3lzdGVtIGlkZW50aXRpZXIgaXMgdG8gYmUKLQkgKiAgICAgICAgICAgIGNvbnN0cnVjdGVkLgotCSAqIEBwYXJhbSBzeXN0ZW1JRAotCSAqICAgICAgICAgICAgVVJJLCB3aGljaCBtYXkgYmUgdXNlZCB0byByZXRyaWV2ZSBhbiBleHRlcm5hbCBlbnRpdHkncwotCSAqICAgICAgICAgICAgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgRXh0ZXJuYWxJRChTdHJpbmcgcHVibGljSUQsIFN0cmluZyBzeXN0ZW1JRCkgewotCQl0aGlzLnR5cGUgPSBUX1BVQkxJQzsKLQkJdGhpcy5wdWJsaWNJRCA9IHB1YmxpY0lEOwotCQl0aGlzLnN5c3RlbUlEID0gc3lzdGVtSUQ7Ci0JCWlmIChudWxsID09IHRoaXMucHVibGljSUQpCi0JCQl0aGlzLnR5cGUgPSBUX1NZU1RFTTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGlmIHRoaXMgZXh0ZXJuYWwgSUQgaXMgYSBzeXN0ZW0gSUQgKG9yIHB1YmxpYyBJRCkuCi0JICogCi0JICogQHJldHVybiBTeXN0ZW0gSUQ9dHJ1ZSwgUHVibGljIElEPWZhbHNlLgotCSAqIEBzZWUgI2lzUHVibGljCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTeXN0ZW0oKSB7Ci0JCXJldHVybiB0aGlzLnR5cGUgPT0gVF9TWVNURU07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpZiB0aGlzIGV4dGVybmFsIElEIGlzIGEgcHVibGljIElEIChvciBzeXN0ZW0gSUQpLgotCSAqIAotCSAqIEByZXR1cm4gUHVibGljIElEPXRydWUsIFN5c3RlbSBJRD1mYWxzZS4KLQkgKiBAc2VlICNpc1N5c3RlbQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHVibGljKCkgewotCQlyZXR1cm4gdGhpcy50eXBlID09IFRfUFVCTElDOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIHRoaXMgZXh0ZXJuYWwgSUQuIEEgc3lzdGVtIGlkZW50aWZpZXIKLQkgKiBpcyBhIFVSSSwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciwgb3IgPHZhcj5udWxsPC92YXI+IGlmIHRoZSBpZGVudGlmaWVyIGlzCi0JICogICAgICAgICBub3QgZGVmaW5lZC4KLQkgKiBAc2VlICNnZXRQdWJpZExpdGVyYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUxpdGVyYWwoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlEOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHB1YmxpYyBpZGVudGlmaWVyIG9mIHRoaXMgZXh0ZXJuYWwgSUQuIFRoaXMgdmFsdWUgaXMgb25seQotCSAqIHZhbGlkIGlmIHRoZSBpZGVudGlmaWVyIGlzIGRlZmluZWQgYXMgPHZhcj5wdWJsaWM8L3Zhcj4gKGFzIG9wcG9zZWQgdG8KLQkgKiA8dmFyPnN5c3RlbTwvdmFyPikuIFB1YmxpYyBpZGVudGlmaWVycyBtYXkgYmUgdXNlZCB0byB0cnkgdG8gZ2VuZXJhdGUKLQkgKiBhbiBhbHRlcm5hdGl2ZSBVUkkgaW4gb3JkZXIgdG8gcmV0cmlldmUgYW4gZXh0ZXJuYWwgZW50aXR5J3MgY29udGVudC4KLQkgKiBJZiByZXRyaWV2YWwgZmFpbHMgdXNpbmcgdGhlIHB1YmxpYyBpZGVudGlmaWVyLCBhbiBhdHRlbXB0IG11c3QgYmUgbWFkZQotCSAqIHRvIHJldHJpZXZlIGNvbnRlbnQgdXNpbmcgdGhlIHN5c3RlbSBpZGVudGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIHB1YmxpYyBpZGVudGlmaWVyLCBvciA8dmFyPm51bGw8L3Zhcj4gaWYgdGhlIGlkZW50aWZpZXIgaXMKLQkgKiAgICAgICAgIG5vdCBkZWZpbmVkLgotCSAqIEBzZWUgI2dldFN5c3RlbUxpdGVyYWwKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YklkTGl0ZXJhbCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSUQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGlzIGV4dGVybmFsIElEIGluIHRoZSBmb3JtYXQgaXQgd2FzIGRlY2xhcmVkOiA8Q09ERT5TWVNURU0KLQkgKiAmcXVvdDs8VkFSPnN5c3RlbUlEPC9WQVI+JnF1b3Q7PC9DT0RFPiBvciA8Q09ERT5QVUJMSUMgJnF1b3Q7PFZBUj5wdWJsaWNJRDwvVkFSPiZxdW90OwotCSAqICZxdW90OzxWQVI+c3lzdGVtSUQ8L1ZBUj4mcXVvdDs8L0NPREU+LgotCSAqIAotCSAqIEByZXR1cm4gWE1MIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIGV4dGVybmFsIElEIChuZXZlcgotCSAqICAgICAgICAgPHZhcj5udWxsPC92YXI+KS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgcmV0OwotCQlpZiAoaXNTeXN0ZW0oKSkgewotCQkJcmV0ID0gIlNZU1RFTSBcIiIgKyBnZXRTeXN0ZW1MaXRlcmFsKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQllbHNlIGlmIChudWxsICE9IGdldFN5c3RlbUxpdGVyYWwoKSkgewotCQkJcmV0ID0gIlBVQkxJQyBcIiIgKyBnZXRQdWJJZExpdGVyYWwoKSArICJcIiBcIiIgKyBnZXRTeXN0ZW1MaXRlcmFsKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0JCWVsc2UgewotCQkJcmV0ID0gIlBVQkxJQyBcIiIgKyBnZXRQdWJJZExpdGVyYWwoKSArICJcIiI7IC8vIGZvciBOT1RBVElPTiAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gcmV0OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEob2JqIGluc3RhbmNlb2YgRXh0ZXJuYWxJRCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUV4dGVybmFsSUQgZWlkID0gKEV4dGVybmFsSUQpIG9iajsKLQkJaWYgKCEoKGVpZC5wdWJsaWNJRCA9PSBudWxsICYmIHRoaXMucHVibGljSUQgPT0gbnVsbCkgfHwgZWlkLnB1YmxpY0lEICE9IG51bGwgJiYgZWlkLnB1YmxpY0lELmVxdWFscyh0aGlzLnB1YmxpY0lEKSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghKChlaWQuc3lzdGVtSUQgPT0gbnVsbCAmJiB0aGlzLnN5c3RlbUlEID09IG51bGwpIHx8IGVpZC5zeXN0ZW1JRCAhPSBudWxsICYmIGVpZC5zeXN0ZW1JRC5lcXVhbHModGhpcy5zeXN0ZW1JRCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCWludCByZXR2YWwgPSAwOwotCQlpZiAocHVibGljSUQgIT0gbnVsbCkKLQkJCXJldHZhbCA9IHB1YmxpY0lELmhhc2hDb2RlKCk7Ci0JCWlmIChzeXN0ZW1JRCAhPSBudWxsKQotCQkJcmV0dmFsICs9IHN5c3RlbUlELmhhc2hDb2RlKCk7Ci0JCXJldHVybiByZXR2YWw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9Ob3RhdGlvbkRlY2wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL05vdGF0aW9uRGVjbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q0ZTJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL05vdGF0aW9uRGVjbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5zYXhwYXJzZXI7Ci0KLS8qKgotICogTm90YXRpb25zIGFyZSBob3cgdGhlIERvY3VtZW50IFR5cGUgRGVzY3JpcHRpb24gKERURCkgcmVjb3JkcyBoaW50cyBhYm91dAotICogdGhlIGZvcm1hdCBvZiBhbiBYTUwgInVucGFyc2VkIGVudGl0eSIgLS0gaW4gb3RoZXIgd29yZHMsIG5vbi1YTUwgZGF0YQotICogYm91bmQgdG8gdGhpcyBkb2N1bWVudCB0eXBlLCB3aGljaCBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBjb25zdWx0Ci0gKiB3aGVuIG1hbmlwdWxhdGluZyB0aGUgZG9jdW1lbnQuIEEgTm90YXRpb24gcmVwcmVzZW50cyBhIG5hbWUtdmFsdWUgcGFpciwKLSAqIHdpdGggaXRzIG5vZGVOYW1lIGJlaW5nIHNldCB0byB0aGUgZGVjbGFyZWQgbmFtZSBvZiB0aGUgbm90YXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbkRlY2wgZXh0ZW5kcyBCYXNlTm9kZSB7Ci0JLyoqIFB1YmxpYyBpZGVudGlmaWVyLiAqLwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCi0JLyoqIFN5c3RlbSBpZGVudGlmaWVyLiAqLwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLy8KLQkvLyBDb25zdHJ1Y3RvcnMKLQkvLwotCi0JLyoqIEZhY3RvcnkgY29uc3RydWN0b3IuICovCi0JcHVibGljIE5vdGF0aW9uRGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG93bmVyRFREKSB7Ci0JCXN1cGVyKG5hbWUsIG93bmVyRFREKTsKLQl9Ci0KLQkvLwotCS8vIE5vdGF0aW9uIG1ldGhvZHMKLQkvLwotCi0JLyoqCi0JICogVGhlIFB1YmxpYyBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBwdWJsaWMgaWRlbnRpZmllciB3YXMKLQkgKiBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9IC8vIGdldFB1YmxpY0lkKCk6U3RyaW5nCi0KLQkvKioKLQkgKiBUaGUgU3lzdGVtIElkZW50aWZpZXIgZm9yIHRoaXMgTm90YXRpb24uIElmIG5vIHN5c3RlbSBpZGVudGlmaWVyIHdhcwotCSAqIHNwZWNpZmllZCwgdGhpcyB3aWxsIGJlIG51bGwuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHN5c3RlbUlkOwotCX0gLy8gZ2V0U3lzdGVtSWQoKTpTdHJpbmcKLQotCS8vCi0JLy8gUHVibGljIG1ldGhvZHMKLQkvLwotCi0JLyoqCi0JICogTk9OLURPTTogVGhlIFB1YmxpYyBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBwdWJsaWMKLQkgKiBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBpZCkgewotCQlwdWJsaWNJZCA9IGlkOwotCX0gLy8gc2V0UHVibGljSWQoU3RyaW5nKQotCi0JLyoqCi0JICogTk9OLURPTTogVGhlIFN5c3RlbSBJZGVudGlmaWVyIGZvciB0aGlzIE5vdGF0aW9uLiBJZiBubyBzeXN0ZW0KLQkgKiBpZGVudGlmaWVyIHdhcyBzcGVjaWZpZWQsIHRoaXMgd2lsbCBiZSBudWxsLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBpZCkgewotCQlzeXN0ZW1JZCA9IGlkOwotCX0gLy8gc2V0U3lzdGVtSWQoU3RyaW5nKQotCi19IC8vIGNsYXNzIE5vdGF0aW9uSW1wbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvU3RyaW5nUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE1MWNkYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9TdHJpbmdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotLyoqCi0gKiBSZWFkZXIgZm9yIHByb2Nlc3NpbmcvcGFyc2luZyB4bWwgc3RyaW5nCi0gKiAKLSAqIEB2ZXJzaW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJpbmdQYXJzZXIgewotCVN0cmluZyBmRGF0YSA9IG51bGw7Ci0JaW50IGZFbmRPZmZzZXQ7Ci0JaW50IGZNb3N0UmVjZW50Q2hhcjsKLQlpbnQgZkN1cnJlbnRPZmZzZXQ7Ci0JYm9vbGVhbiBmQ2FsbGVkQ2hhclByb3BJbml0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgU3RyaW5nUGFyc2VyKFN0cmluZyBkYXRhKSB7Ci0JCWZEYXRhID0gZGF0YTsKLQkJZkN1cnJlbnRPZmZzZXQgPSAwOwotCQlmRW5kT2Zmc2V0ID0gZkRhdGEubGVuZ3RoKCk7Ci0JCWZNb3N0UmVjZW50Q2hhciA9IGZFbmRPZmZzZXQgPT0gMCA/IC0xIDogZkRhdGEuY2hhckF0KDApOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmRGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLQkJcmV0dXJuIGZEYXRhOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVtYWluaW5nU3RyaW5nKCkgewotCQlyZXR1cm4gZkRhdGEuc3Vic3RyaW5nKGdldEN1cnJlbnRPZmZzZXQoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDdXJyZW50T2Zmc2V0KCkgewotCQlyZXR1cm4gZkN1cnJlbnRPZmZzZXQ7Ci0JfQotCi0JLy8KLQkvLwotCXB1YmxpYyBpbnQgbG9hZE5leHRDaGFyKCkgewotCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJfQotCQllbHNlIHsKLQkJCWZNb3N0UmVjZW50Q2hhciA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIGZNb3N0UmVjZW50Q2hhcjsKLQl9Ci0KLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gbG9va2luZ0F0Q2hhcihjaGFyIGNociwgYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggIT0gY2hyKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKHNraXBQYXN0Q2hhcikgewotCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCWZNb3N0UmVjZW50Q2hhciA9IC0xOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gZkRhdGEuY2hhckF0KGZDdXJyZW50T2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBsb29raW5nQXRWYWxpZENoYXIoYm9vbGVhbiBza2lwUGFzdENoYXIpIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlpZiAoY2ggPCAweEQ4MDApIHsKLQkJCWlmIChjaCA8IDB4MjAgJiYgY2ggIT0gMHgwOSAmJiBjaCAhPSAweDBBICYmIGNoICE9IDB4MEQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJaWYgKCsrZkN1cnJlbnRPZmZzZXQgPj0gZkVuZE9mZnNldCkgewotCQkJCQlmTW9zdFJlY2VudENoYXIgPSAtMTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZNb3N0UmVjZW50Q2hhciA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGNoID4gMHhGRkZEKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJaWYgKGNoIDwgMHhEQzAwKSB7Ci0JCQlpZiAoZkN1cnJlbnRPZmZzZXQgKyAxID49IGZFbmRPZmZzZXQpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQljaCA9IGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCArIDEpOwotCQkJaWYgKGNoIDwgMHhEQzAwIHx8IGNoID49IDB4RTAwMCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgaWYgKCFza2lwUGFzdENoYXIpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZDdXJyZW50T2Zmc2V0Kys7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2ggPCAweEUwMDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJZk1vc3RSZWNlbnRDaGFyID0gLTE7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIGxvb2tpbmdBdFNwYWNlKGJvb2xlYW4gc2tpcFBhc3RDaGFyKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoID4gMHgyMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGNoID09IDB4MjAgfHwgY2ggPT0gMHgwQSB8fCBjaCA9PSAweDBEIHx8IGNoID09IDB4MDkpIHsKLQkJCWlmIChza2lwUGFzdENoYXIpIHsKLQkJCQlsb2FkTmV4dENoYXIoKTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgdm9pZCBza2lwVG9DaGFyKGNoYXIgY2hyLCBib29sZWFuIHNraXBQYXN0Q2hhcikgewotCQkvLwotCQkvLyBSRVZJU0lUIC0gdGhpcyB3aWxsIHNraXAgaW52YWxpZCBjaGFyYWN0ZXJzIHdpdGhvdXQgcmVwb3J0aW5nIHRoZW0uCi0JCS8vCi0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChjaCA9PSBjaHIpIHsKLQkJCQlpZiAoc2tpcFBhc3RDaGFyKSB7Ci0JCQkJCWxvYWROZXh0Q2hhcigpOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIHZvaWQgc2tpcFBhc3RTcGFjZXMoKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoID09IC0xKSB7Ci0JCQkvLyBjaGFuZ2VSZWFkZXJzKCkuc2tpcFBhc3RTcGFjZXMoKTsKLQkJCXJldHVybjsKLQkJfQotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGNoID4gMHgyMCB8fCAoY2ggIT0gMHgyMCAmJiBjaCAhPSAweDBBICYmIGNoICE9IDB4MDkgJiYgY2ggIT0gMHgwRCkpIHsKLQkJCQlmTW9zdFJlY2VudENoYXIgPSBjaDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOwotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5hbWVBbmRQRVJlZmVyZW5jZShjaGFyIGZhc3RjaGVjaykgewotCQlpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0KLQkJaWYgKGNoICE9ICclJykgewotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlJbml0aWFsTmFtZUNoYXJbY2hdID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJCQkJZkNhbGxlZENoYXJQcm9wSW5pdCA9IHRydWU7Ci0JCQkJfQotCQkJCWlmICgoWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0NoYXJGbGFnc1tjaF0gJiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLkVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPT0gJyUnIHx8IGNoID09ICc7JykgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2tpcFBhc3ROYW1lKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJza2lwcGFzdE5hbWUgY2g6ICIgK2NoKTsKLQotCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQlpZiAoY2ggPT0gLTEgfHwgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5mZ0FzY2lpSW5pdGlhbE5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCQllbHNlIHsKLQkJCWlmICghZkNhbGxlZENoYXJQcm9wSW5pdCkgewotCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJfQotCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9Jbml0aWFsTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCXJldHVybjsKLQkJfQotCi0JCXdoaWxlICh0cnVlKSB7Ci0JCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0KLQlwdWJsaWMgdm9pZCBza2lwUGFzdE5tdG9rZW4oY2hhciBmYXN0Y2hlY2spIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKGZhc3RjaGVjayA9PSBjaCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoY2ggPCAweDgwKSB7Ci0JCQkJaWYgKGNoID09IC0xIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKQotCQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIWZDYWxsZWRDaGFyUHJvcEluaXQpIHsKLQkJCQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCQkJCWZDYWxsZWRDaGFyUHJvcEluaXQgPSB0cnVlOwotCQkJCX0KLQkJCQlpZiAoKFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdDaGFyRmxhZ3NbY2hdICYgWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5FX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJY2ggPSBsb2FkTmV4dENoYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNraXBQYXN0Tm10b2tlbkFuZFBFUmVmZXJlbmNlKGNoYXIgZmFzdGNoZWNrKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChmYXN0Y2hlY2sgPT0gY2gpCi0JCQkJcmV0dXJuOwotCQkJaWYgKGNoID09ICclJyB8fCBjaCA9PSAnOycpIHsKLQkJCQljaCA9IGxvYWROZXh0Q2hhcigpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoIDwgMHg4MCkgewotCQkJCWlmIChjaCA9PSAtMSB8fCBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKCFmQ2FsbGVkQ2hhclByb3BJbml0KSB7Ci0JCQkJCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQkJCQlmQ2FsbGVkQ2hhclByb3BJbml0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJaWYgKChYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmZnQ2hhckZsYWdzW2NoXSAmIFhNTENoYXJhY3RlclByb3BlcnRpZXMuRV9OYW1lQ2hhckZsYWcpID09IDApCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWNoID0gbG9hZE5leHRDaGFyKCk7Ci0JCX0KLQl9Ci0KLQkvLwotCS8vCi0JLy8KLQlwdWJsaWMgYm9vbGVhbiBza2lwcGVkU3RyaW5nKGNoYXJbXSBzKSB7Ci0JCWludCBjaCA9IGZNb3N0UmVjZW50Q2hhcjsKLQkJaWYgKGNoICE9IHNbMF0pIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlpZiAoZkN1cnJlbnRPZmZzZXQgKyBzLmxlbmd0aCA+IGZFbmRPZmZzZXQpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgcy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGZEYXRhLmNoYXJBdChmQ3VycmVudE9mZnNldCArIGkpICE9IHNbaV0pCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZDdXJyZW50T2Zmc2V0ICs9IChzLmxlbmd0aCAtIDEpOwotCQlsb2FkTmV4dENoYXIoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLy8KLQkvLwotCS8vCi0JcHVibGljIGludCBzY2FuSW52YWxpZENoYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaW50IGNoID0gZk1vc3RSZWNlbnRDaGFyOwotCQlsb2FkTmV4dENoYXIoKTsKLQkJcmV0dXJuIGNoOwotCX0KLQotCS8vCi0JLy8KLQkvLwotCS8qCi0JICogcHVibGljIGludCBzY2FuQ2hhclJlZihib29sZWFuIGhleCkgdGhyb3dzIEV4Y2VwdGlvbiB7IGludCBjaCA9Ci0JICogZk1vc3RSZWNlbnRDaGFyOyBpZiAoY2ggPT0gLTEpIC8vIHJldHVybgotCSAqIGNoYW5nZVJlYWRlcnMoKS5zY2FuQ2hhclJlZihoZXgpOyByZXR1cm4gY2g7IGludCBudW0gPSAwOyBpZiAoaGV4KSB7IGlmCi0JICogKGNoID4gJ2YnIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaVhEaWdpdENoYXJbY2hdID09IDApIHJldHVybgotCSAqIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfSU5WQUxJRF9DSEFSOyBudW0gPSBjaCAtIChjaCA8ICdBJyA/Ci0JICogJzAnIDogKGNoIDwgJ2EnID8gJ0EnIDogJ2EnKSAtIDEwKTsgfSBlbHNlIHsgaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKQotCSAqIHJldHVybiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX0lOVkFMSURfQ0hBUjsgbnVtID0gY2ggLSAnMCc7IH0KLQkgKiBib29sZWFuIHRvb2JpZyA9IGZhbHNlOyB3aGlsZSAodHJ1ZSkgeyBjaCA9IGxvYWROZXh0Q2hhcigpOyBpZiAoY2ggPT0KLQkgKiAtMSkgcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfU0VNSUNPTE9OX1JFUVVJUkVEOyBpZiAoaGV4KSB7Ci0JICogaWYgKGNoID4gJ2YnIHx8IFhNTENoYXJhY3RlclByb3BlcnRpZXMuZmdBc2NpaVhEaWdpdENoYXJbY2hdID09IDApCi0JICogYnJlYWs7IH0gZWxzZSB7IGlmIChjaCA8ICcwJyB8fCBjaCA+ICc5JykgYnJlYWs7IH0gaWYgKGhleCkgeyBpbnQgZGlnID0KLQkgKiBjaCAtIChjaCA8ICdBJyA/ICcwJyA6IChjaCA8ICdhJyA/ICdBJyA6ICdhJykgLSAxMCk7IG51bSA9IChudW0gPDwgNCkgKwotCSAqIGRpZzsgfSBlbHNlIHsgaW50IGRpZyA9IGNoIC0gJzAnOyBudW0gPSAobnVtICogMTApICsgZGlnOyB9IGlmIChudW0gPgotCSAqIDB4MTBGRkZGKSB7IHRvb2JpZyA9IHRydWU7IG51bSA9IDA7IH0gfSBpZiAoY2ggIT0gJzsnKSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkNIQVJSRUZfUkVTVUxUX1NFTUlDT0xPTl9SRVFVSVJFRDsgbG9hZE5leHRDaGFyKCk7IGlmCi0JICogKHRvb2JpZykgcmV0dXJuIFhNTEVudGl0eUhhbmRsZXIuQ0hBUlJFRl9SRVNVTFRfT1VUX09GX1JBTkdFOyByZXR1cm4KLQkgKiBudW07IH0KLQkgKi8KLQkvLwotCS8vCi0JLy8KLQkvKgotCSAqIHB1YmxpYyBpbnQgc2NhblN0cmluZ0xpdGVyYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsgYm9vbGVhbiBzaW5nbGU7IGlmCi0JICogKCEoc2luZ2xlID0gbG9va2luZ0F0Q2hhcignXCcnLCB0cnVlKSkgJiYgIWxvb2tpbmdBdENoYXIoJ1wiJywgdHJ1ZSkpIHsKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5TVFJJTkdMSVRfUkVTVUxUX1FVT1RFX1JFUVVJUkVEOyB9IGludCBvZmZzZXQgPQotCSAqIGZDdXJyZW50T2Zmc2V0OyBjaGFyIHFjaGFyID0gc2luZ2xlID8gJ1wnJyA6ICdcIic7IHdoaWxlCi0JICogKCFsb29raW5nQXRDaGFyKHFjaGFyLCBmYWxzZSkpIHsgaWYgKCFsb29raW5nQXRWYWxpZENoYXIodHJ1ZSkpIHsKLQkgKiByZXR1cm4gWE1MRW50aXR5SGFuZGxlci5TVFJJTkdMSVRfUkVTVUxUX0lOVkFMSURfQ0hBUjsgfSB9IC8vIGludAotCSAqIHN0cmluZ0luZGV4ID0gYWRkU3RyaW5nKG9mZnNldCwgZkN1cnJlbnRPZmZzZXQgLSBvZmZzZXQpOyBpbnQKLQkgKiBzdHJpbmdJbmRleCA9IGFkZFN0cmluZyhvZmZzZXQsIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0KTsKLQkgKiBsb29raW5nQXRDaGFyKHFjaGFyLCB0cnVlKTsgLy8gbW92ZSBwYXN0IHFjaGFyIHJldHVybiBzdHJpbmdJbmRleDsgfQotCSAqLwotCi0JLy8KLQkvLwotCXB1YmxpYyBib29sZWFuIHNjYW5BdHRWYWx1ZShjaGFyIHFjaGFyKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJd2hpbGUgKHRydWUpIHsKLQkJCWlmIChsb29raW5nQXRDaGFyKHFjaGFyLCBmYWxzZSkpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChsb29raW5nQXRDaGFyKCcgJywgdHJ1ZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghbG9va2luZ0F0VmFsaWRDaGFyKHRydWUpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJbG9va2luZ0F0Q2hhcihxY2hhciwgdHJ1ZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8KLQkvLyBbOV0gRW50aXR5VmFsdWUgOjo9ICciJyAoW14lJiJdIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAnIicKLQkvLyB8ICInIiAoW14lJiddIHwgUEVSZWZlcmVuY2UgfCBSZWZlcmVuY2UpKiAiJyIKLQkvLwotCS8vIFRoZSB2YWx1ZXMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZSBhcmUgZGVmaW5lZCBhczoKLQkvLwotCS8vIDAgLSBub3Qgc3BlY2lhbAotCS8vIDEgLSBxdW90ZSBjaGFyYWN0ZXIKLQkvLyAyIC0gcmVmZXJlbmNlCi0JLy8gMyAtIHBlcmVmCi0JLy8gNCAtIGludmFsaWQKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpRW50aXR5VmFsdWVDaGFyW10gPSB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwgMCwgNCwgNCwgMCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMCwgMCwgMSwgMCwgMCwgMywgMiwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJ1wiJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICclJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcmJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICdcJycKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQotCS8qCi0JICogcHVibGljIGludCBzY2FuRW50aXR5VmFsdWUoaW50IHFjaGFyLCBib29sZWFuIGNyZWF0ZVN0cmluZykgdGhyb3dzCi0JICogRXhjZXB0aW9uIHsgaW50IG9mZnNldCA9IGZDdXJyZW50T2Zmc2V0OyBpbnQgY2ggPSBmTW9zdFJlY2VudENoYXI7Ci0JICogd2hpbGUgKHRydWUpIHsgaWYgKGNoID09IC0xKSB7IGNoYW5nZVJlYWRlcnMoKTsgLy8gZG8gbm90IGNhbGwgbmV4dAotCSAqIHJlYWRlciwgb3VyIGNhbGxlciBtYXkgbmVlZCB0byBjaGFuZ2UgdGhlIHBhcmFtZXRlcnMgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfRU5EX09GX0lOUFVUOyB9IGlmIChjaCA8IDB4ODApIHsKLQkgKiBzd2l0Y2ggKGZnQXNjaWlFbnRpdHlWYWx1ZUNoYXJbY2hdKSB7IGNhc2UgMTogLy8gcXVvdGUgY2hhciBpZiAoY2ggPT0KLQkgKiBxY2hhcikgeyBpZiAoIWNyZWF0ZVN0cmluZykgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfRklOSVNIRUQ7IGludCBsZW5ndGggPQotCSAqIGZDdXJyZW50T2Zmc2V0IC0gb2Zmc2V0OyBpbnQgcmVzdWx0ID0gbGVuZ3RoID09IDAgPwotCSAqIFN0cmluZ1Bvb2wuRU1QVFlfU1RSSU5HIDogYWRkU3RyaW5nKG9mZnNldCwgbGVuZ3RoKTsgbG9hZE5leHRDaGFyKCk7Ci0JICogcmV0dXJuIHJlc3VsdDsgfSAvLyB0aGUgb3RoZXIgcXVvdGUgY2hhcmFjdGVyIGlzIG5vdCBzcGVjaWFsIC8vIGZhbGwKLQkgKiB0aHJvdWdoIGNhc2UgMDogLy8gbm9uLXNwZWNpYWwgY2hhciBpZiAoKytmQ3VycmVudE9mZnNldCA+PSBmRW5kT2Zmc2V0KSB7Ci0JICogaWYgKG93ZVRyYWlsaW5nU3BhY2UpIHsgb3dlVHJhaWxpbmdTcGFjZSA9IGZhbHNlOyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9ICcgJzsgfQotCSAqIGVsc2UgeyBjaCA9IGZNb3N0UmVjZW50Q2hhciA9IC0xOyB9IH0gZWxzZSB7IGNoID0gZk1vc3RSZWNlbnRDaGFyID0KLQkgKiBmRGF0YS5jaGFyQXQoZkN1cnJlbnRPZmZzZXQpOyB9IGNvbnRpbnVlOyBjYXNlIDI6IC8vIHJlZmVyZW5jZSByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9SRUZFUkVOQ0U7IGNhc2UgMzogLy8gcGVyZWYgcmV0dXJuCi0JICogWE1MRW50aXR5SGFuZGxlci5FTlRJVFlWQUxVRV9SRVNVTFRfUEVSRUY7IGNhc2UgNDogLy8gaW52YWxpZCByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSBlbHNlIGlmIChjaCA8Ci0JICogMHhEODAwKSB7IGNoID0gbG9hZE5leHRDaGFyKCk7IH0gZWxzZSBpZiAoY2ggPj0gMHhFMDAwICYmIChjaCA8PSAweEZGRkQgfHwKLQkgKiAoY2ggPj0gMHgxMDAwMCAmJiBjaCA8PSAweDEwRkZGRikpKSB7IC8vIC8vIFJFVklTSVQgLSBuZWVkcyBtb3JlIGNvZGUKLQkgKiB0byBjaGVjayBzdXJyb2dhdGVzLiAvLyBjaCA9IGxvYWROZXh0Q2hhcigpOyB9IGVsc2UgeyByZXR1cm4KLQkgKiBYTUxFbnRpdHlIYW5kbGVyLkVOVElUWVZBTFVFX1JFU1VMVF9JTlZBTElEX0NIQVI7IH0gfSB9Ci0JICovCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc2F4cGFyc2VyL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9zYXhwYXJzZXIvVFN0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDFmMDIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1RTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnNheHBhcnNlcjsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgc3RhdGljIG1ldGhvZHMgZm9yIHNvbWUgb2YgdGhlIHZlcnkgdXNlZCBJU3RyaW5nCi0gKiBvcGVyYXRpb25zCi0gKi8KLQotcHVibGljIGNsYXNzIFRTdHJpbmcgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTFBIQUJFVCA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTFBIQU5VTUVSSUMgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXpBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NTY3ODkiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5VTUVSSUMgPSAiMDEyMzQ1Njc4OSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGNoYW5nZSBhbGwgb2NjdXJyZW5jZXMgb2Ygb2xkUGF0IHRvIG5ld1BhdAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNoYW5nZShTdHJpbmcgaW4sIFN0cmluZyBvbGRQYXQsIFN0cmluZyBuZXdQYXQpIHsKLQkJaWYgKG9sZFBhdC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGluOwotCQlpZiAob2xkUGF0Lmxlbmd0aCgpID09IDEgJiYgbmV3UGF0Lmxlbmd0aCgpID09IDEpCi0JCQlyZXR1cm4gaW4ucmVwbGFjZShvbGRQYXQuY2hhckF0KDApLCBuZXdQYXQuY2hhckF0KDApKTsKLQotCQlpbnQgbGFzdEluZGV4ID0gMDsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJU3RyaW5nQnVmZmVyIG5ld1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yICg7OykgewotCQkJbmV3SW5kZXggPSBpbi5pbmRleE9mKG9sZFBhdCwgbGFzdEluZGV4KTsKLQkJCWlmIChuZXdJbmRleCAhPSAtMSkgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCwgbmV3SW5kZXgpICsgbmV3UGF0KTsKLQkJCQlsYXN0SW5kZXggPSBuZXdJbmRleCArIG9sZFBhdC5sZW5ndGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCW5ld1N0cmluZy5hcHBlbmQoaW4uc3Vic3RyaW5nKGxhc3RJbmRleCkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQkvLyBjaGFuZ2UgdGhlIG9jY3VycmVuY2VzIG9mIG9sZFBhdCB0byBuZXdQYXQgc3RhcnRpbmcgYXQgc3RhcnRQb3NpdGlvbgotCS8vIGZvciBudW1iZXIgb2YgbnVtQ2hhbmdlcwotCS8vIE5vdGU6IHRoZSAxc3QgY2hhciBpbiB0aGUgc3RyaW5nIGhhcyBwb3NpdGlvbiBvZiAwCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjaGFuZ2UoU3RyaW5nIGluLCBTdHJpbmcgb2xkUGF0LCBTdHJpbmcgbmV3UGF0LCBpbnQgc3RhcnRQb3MsIGludCBudW1DaGFuZ2VzKSB7Ci0JCWlmIChvbGRQYXQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBpbjsKLQkJaWYgKG9sZFBhdC5sZW5ndGgoKSA9PSAxICYmIG5ld1BhdC5sZW5ndGgoKSA9PSAxKQotCQkJcmV0dXJuIGluLnJlcGxhY2Uob2xkUGF0LmNoYXJBdCgwKSwgbmV3UGF0LmNoYXJBdCgwKSk7Ci0KLQkJaW50IGluTGVuID0gaW4ubGVuZ3RoKCk7Ci0KLQkJaWYgKHN0YXJ0UG9zID49IGluTGVuKQotCQkJcmV0dXJuIGluOwotCi0JCWludCBsYXN0SW5kZXggPSBzdGFydFBvczsKLQkJaW50IG5ld0luZGV4ID0gMDsKLQkJaW50IGNvdW50Q2hhbmdlcyA9IDA7Ci0KLQotCQlTdHJpbmdCdWZmZXIgbmV3U3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWZvciAoOzspIHsKLQkJCW5ld0luZGV4ID0gaW4uaW5kZXhPZihvbGRQYXQsIGxhc3RJbmRleCk7Ci0JCQlpZiAobmV3SW5kZXggIT0gLTEpIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgsIG5ld0luZGV4KSArIG5ld1BhdCk7Ci0JCQkJbGFzdEluZGV4ID0gbmV3SW5kZXggKyBvbGRQYXQubGVuZ3RoKCk7Ci0JCQkJY291bnRDaGFuZ2VzKys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdTdHJpbmcuYXBwZW5kKGluLnN1YnN0cmluZyhsYXN0SW5kZXgpKTsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJaWYgKGNvdW50Q2hhbmdlcyA9PSBudW1DaGFuZ2VzKSB7Ci0JCQkJbmV3U3RyaW5nLmFwcGVuZChpbi5zdWJzdHJpbmcobGFzdEluZGV4KSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3U3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29yZChTdHJpbmcgaW4sIGludCBpKSB7Ci0JCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW4pOwotCQlpZiAoaSA8PSAwIHx8IGkgPiBzdC5jb3VudFRva2VucygpKQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCWVsc2UgewotCQkJU3RyaW5nIHJldCA9IG5ldyBTdHJpbmcoKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlyZXQgPSBzdC5uZXh0VG9rZW4oKTsKLQkJCQlpZiAoLS1pID09IDApCi0JCQkJCXJldHVybiByZXQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgd29yZHMoU3RyaW5nIGluLCBpbnQgaSkgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGluKTsKLQkJaWYgKGkgPD0gMCB8fCBpID4gc3QuY291bnRUb2tlbnMoKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQllbHNlIHsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlpZiAoLS1pID09IDApCi0JCQkJCWJyZWFrOwotCQkJCXN0Lm5leHRUb2tlbigpOwotCQkJfQotCQkJaWYgKHN0Lmhhc01vcmVUb2tlbnMoKSkKLQkJCQlyZXR1cm4gc3QubmV4dFRva2VuKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJZWxzZQotCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYXBwZW5kU3BhY2VzKFN0cmluZyBpbiwgaW50IGxlbikgewotCQlpZiAobGVuIDwgMSkKLQkJCXJldHVybiBpbjsKLQotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKGluKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJc2IuYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc2IudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBudW1Xb3JkcyhTdHJpbmcgaW4pIHsKLQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihpbik7Ci0JCXJldHVybiBzdC5jb3VudFRva2VucygpOwotCX0KLQotCS8vIHJldHVybiB0aGUgZmlyc3QgaW5kZXggd2l0aGluIHNyY1N0cmluZyB0aGF0IGlzIG5vdCBpbiB0aGUgdmFsaWRTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJhYmNkZWZnIgotCS8vIHZhbGlkU3RyaW5nID0gImJjZmciCi0JLy8gcmV0dXJuID0gMCAoaS5lLiBjaGFyIGEgaXMgbm90IGluICJiY2ZnIikgLSAxc3QgaW5kZXggPSAwCi0KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mQW55QnV0KFN0cmluZyBzcmNTdHJpbmcsIFN0cmluZyB2YWxpZFN0cmluZykgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBzcmNMZW4gPSBzcmNTdHJpbmcubGVuZ3RoKCk7Ci0KLQkJLy8gd2FsayBiYWNrd2FyZCB0byBmaW5kIGlmIGEgY2hhciB3aXRoaW4gc3JjU3RyaW5nIGlzIGluIHZhbGlkU3RyaW5nCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3JjTGVuOyBpKyspIHsKLQkJCS8vIG5vdCBmb3VuZCwgc3RvcCBpdAotCQkJaWYgKHZhbGlkU3RyaW5nLmluZGV4T2Yoc3JjU3RyaW5nLmNoYXJBdChpKSkgPT0gLTEpIHsKLQkJCQlyZXN1bHQgPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHJldHVybiB0aGUgbGFzdCBpbmRleCB3aXRoaW4gc3JjU3RyaW5nIHRoYXQgaXMgbm90IGluIHRoZSB2YWxpZFN0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImFiY2RlZmciCi0JLy8gdmFsaWRTdHJpbmcgPSAiYmNmZyIKLQkvLyByZXR1cm4gPSA0IChpLmUuIGNoYXIgZSBpcyBub3QgaW4gImJjZmciKSAtIDFzdCBpbmRleCA9IDAKLQotCXB1YmxpYyBzdGF0aWMgaW50IGxhc3RJbmRleE9mQW55QnV0KFN0cmluZyBzcmNTdHJpbmcsIFN0cmluZyB2YWxpZFN0cmluZykgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBzcmNMZW4gPSBzcmNTdHJpbmcubGVuZ3RoKCk7Ci0KLQkJLy8gd2FsayBiYWNrd2FyZCB0byBmaW5kIGlmIGEgY2hhciB3aXRoaW4gc3JjU3RyaW5nIGlzIGluIHZhbGlkU3RyaW5nCi0JCWZvciAoaW50IGkgPSBzcmNMZW4gLSAxOyBpID49IDA7IGktLSkgewotCQkJLy8gbm90IGZvdW5kLCBzdG9wIGl0Ci0JCQlpZiAodmFsaWRTdHJpbmcuaW5kZXhPZihzcmNTdHJpbmcuY2hhckF0KGkpKSA9PSAtMSkgewotCQkJCXJlc3VsdCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gcmV0dXJuIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBzZWFyY2hDaGFyIHdpdGhpbiBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICI6OmY6OmY6OmciCi0JLy8gc2VhY2hyQ2hhciA9ICc6JwotCS8vIHJldHVybiA9IDYKLQotCXB1YmxpYyBzdGF0aWMgaW50IG9jY3VycmVuY2VPZihTdHJpbmcgc3JjU3RyaW5nLCBjaGFyIHNlYXJjaENoYXIpIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCS8vIHdhbGsgYmFja3dhcmQgdG8gZmluZCBpZiBhIGNoYXIgd2l0aGluIHNyY1N0cmluZyBpcyBpbiB2YWxpZFN0cmluZwotCQlpZiAoc3JjU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHNyY1N0cmluZy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQkJLy8gZm91bmQsIGluY3JlbWVudCB0aGUgY291bnQKLQkJCQlpZiAoc2VhcmNoQ2hhciA9PSBzcmNTdHJpbmcuY2hhckF0KGkpKQotCQkJCQlyZXN1bHQrKzsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8gc3RyaXAgdGhlIGxlYWRpbmcgcFN0cmluZyBpbiB0aGUgc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiOjpmOjpmOjpnIgotCS8vIHBTdHJpbmcgIjo6IgotCS8vIHJldHVybiA9ICJmOjpmOjpnIgotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBMZWFkaW5nKFN0cmluZyBzcmNTdHJpbmcsIFN0cmluZyBwU3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0KLQkJaWYgKHNyY1N0cmluZy5zdGFydHNXaXRoKHBTdHJpbmcpKSAvLyBsZWFkaW5nIHBhdFN0cmluZyBmb3VuZAotCQkJcmVzdWx0ID0gc3JjU3RyaW5nLnN1YnN0cmluZyhwU3RyaW5nLmxlbmd0aCgpLCBzcmNTdHJpbmcubGVuZ3RoKCkpOwotCQllbHNlCi0JCQkvLyBub3QgZm91bmQKLQkJCXJlc3VsdCA9IHNyY1N0cmluZzsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHN0cmlwIHRoZSB0cmFpbGluZyBwU3RyaW5nIGluIHRoZSBzcmNTdHJpbmcKLQkvLyBleGFtcGxlOgotCS8vIHNyY1N0cmluZyA9ICJmOjpmOjpnOjoiCi0JLy8gcFN0cmluZyAiOjoiCi0JLy8gcmV0dXJuID0gImY6OmY6OmciCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFRyYWlsaW5nKFN0cmluZyBzcmNTdHJpbmcsIFN0cmluZyBwU3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQ7Ci0KLQkJaWYgKHNyY1N0cmluZy5lbmRzV2l0aChwU3RyaW5nKSkgLy8gbGVhZGluZyBwYXRTdHJpbmcgZm91bmQKLQkJCXJlc3VsdCA9IHNyY1N0cmluZy5zdWJzdHJpbmcoMCwgc3JjU3RyaW5nLmxhc3RJbmRleE9mKHBTdHJpbmcpKTsKLQkJZWxzZQotCQkJLy8gbm90IGZvdW5kCi0JCQlyZXN1bHQgPSBzcmNTdHJpbmc7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBzdHJpcCB0aGUgdHJhaWxpbmcgYmxhbmtzIGluIHRoZSBzcmMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpcFRyYWlsaW5nQmxhbmtzKFN0cmluZyBzcmMpIHsKLQotCQlpZiAoc3JjICE9IG51bGwpIHsKLQkJCXdoaWxlIChzcmMubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJaWYgKHNyYy5lbmRzV2l0aCgiICIpKSAvLyROT04tTkxTLTEkCi0JCQkJCXNyYyA9IHNyYy5zdWJzdHJpbmcoMCwgc3JjLmxlbmd0aCgpIC0gMSk7Ci0JCQkJZWxzZQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBzcmM7Ci0JfQotCi0KLQotCS8vIHJldHVybiBhIHN0cmluZyB0aGF0IGNvbnRhaW5zIG51bWJlciBvZiBjb3BpZXMgb2Ygc3JjU3RyaW5nCi0JLy8gZXhhbXBsZToKLQkvLyBzcmNTdHJpbmcgPSAiYWJjIgotCS8vIG51bWJlck9mQ29waWVzID0gMgotCS8vIHJldHVybiBzdHJpbmcgPSAiYWJjYWJjIgotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29weShTdHJpbmcgc3JjU3RyaW5nLCBpbnQgbnVtYmVyT2ZDb3BpZXMpIHsKLQkJU3RyaW5nQnVmZmVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAobnVtYmVyT2ZDb3BpZXMgPiAwKSB7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8PSBudW1iZXJPZkNvcGllczsgaSsrKQotCQkJCXJlc3VsdC5hcHBlbmQoc3JjU3RyaW5nKTsKLQkJfQotCQllbHNlCi0JCQlyZXN1bHQgPSBuZXcgU3RyaW5nQnVmZmVyKHNyY1N0cmluZyk7Ci0KLQkJcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotCX0KLQotCS8vCi0JLy8gcmV0dXJuIHRydWUgaWYgYWxsIGNoYXJzIGluIHNyY1N0cmluZyBhcmUgaW4ge2EuLi56fSBvciB7QS4uLlp9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBbHBoYWJldGljKFN0cmluZyBzcmNTdHJpbmcpIHsKLQkJcmV0dXJuIChsYXN0SW5kZXhPZkFueUJ1dChzcmNTdHJpbmcsIEFMUEhBQkVUKSA9PSAtMSk7Ci0JfQotCi0JLy8KLQkvLyByZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcnMgaW4gc3JjU3RyaW5nIGFyZSBpbiB7YS4uLnosfSBvciB7QS4uLlp9Ci0JLy8gezAuLi45fQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWxwaGFudW1lcmljKFN0cmluZyBzcmNTdHJpbmcpIHsKLQkJcmV0dXJuIChsYXN0SW5kZXhPZkFueUJ1dChzcmNTdHJpbmcsIEFMUEhBTlVNRVJJQykgPT0gLTEpOwotCX0KLQotCi0JLy8KLQkvLyByZXR1cm4gdHJ1ZSBpZiBhbGwgY2hhcnMgYXJlIGluICcwJyAtICc5JwotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGlnaXRzKFN0cmluZyBzcmNTdHJpbmcpIHsKLQkJcmV0dXJuIChsYXN0SW5kZXhPZkFueUJ1dChzcmNTdHJpbmcsIE5VTUVSSUMpID09IC0xKTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0VtcHR5T3JOdWxsKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyA9PSBudWxsIHx8IHN0cmluZy5sZW5ndGgoKSA9PSAwOwotCX0KLQotCi0JLy8KLQkvLyByZXR1cm4gdGhlIHN0cmluZyBhZnRlciB0aGUgbWF0Y2hpbmcgdG9rZW4gaXMgcmVtb3ZlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1hdGNoKFN0cmluZyBpbiwgU3RyaW5nIHRva2VuKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJaWYgKGluID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbiA9IGluLnRyaW0oKTsKLQkJaWYgKGluLnN0YXJ0c1dpdGgodG9rZW4pKQotCQkJcmV0dXJuIGluLnN1YnN0cmluZyh0b2tlbi5sZW5ndGgoKSwgaW4ubGVuZ3RoKCkpOwotCQllbHNlCi0JCQl0aHJvdyBuZXcgRXhjZXB0aW9uKCJFeHBlY3RlZDogIiArIHRva2VuICsgIiBidXQgZ290OiIgKyB3b3JkKGluLCAxKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgbG9uZyBnZXRMb25nKFN0cmluZyBzdHIpIHsKLQkJdHJ5IHsKLQkJCXJldHVybiBMb25nLnBhcnNlTG9uZyhzdHIpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gbSkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQl9Ci0KLQkvLyByZXR1cm4gdHJ1ZSBpZiB0aGUgIiAiIGFwcGVhcnMgd2l0aGluIHNyY1N0cmluZwotCS8vIGV4YW1wbGU6Ci0JLy8gc3JjU3RyaW5nID0gImEgbSIKLQkvLyByZXR1cm4gPSB0cnVlCi0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNEb3VibGVCbGFua3MoU3RyaW5nIHNyY1N0cmluZykgewotCQlTdHJpbmcgYmIgPSAiICAiOyAvLyROT04tTkxTLTEkCi0JCWNoYXIgYiA9IGJiLmNoYXJBdCgwKTsKLQotCQlpZiAoc3JjU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAoc3JjU3RyaW5nLmxlbmd0aCgpIC0gMSk7IGkrKykgewotCQkJCWlmICgoYiA9PSBzcmNTdHJpbmcuY2hhckF0KGkpKSAmIChiID09IHNyY1N0cmluZy5jaGFyQXQoaSArIDEpKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1hNTENoYXJhY3RlclByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NheHBhcnNlci9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvc2F4cGFyc2VyL1hNTENoYXJhY3RlclByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdkMmYzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zYXhwYXJzZXIvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3NheHBhcnNlci9YTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuc2F4cGFyc2VyOwotCi0vKioKLSAqIEEgY2xhc3MgcmVwcmVzZW50aW5nIHByb3BlcnRpZXMgb2YgY2hhcmFjdGVycyBhY2NvcmRpbmcgdG8gdmFyaW91cyBXM0MKLSAqIHJlY29tbWVuZGF0aW9ucwotICogCi0gKiBYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzIHByb3ZpZGVzIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNvbW1vbmx5IHVzZWQKLSAqIGNoYXJhY3RlciB0ZXN0cy4KLSAqIAotICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHRoZSB0YWJsZXMgdXNlZCBieSB0aGUgY29udmVuaWVuY2UgbWV0aG9kcyBhcmUKLSAqIGFsc28gcHVibGljLCBhbmQgYXJlIGRpcmVjdGx5IGFjY2Vzc2VkIGJ5IHBlcmZvcm1hbmNlIGNyaXRpY2FsIHJvdXRpbmVzLgotICogCi0gKi8KLQotcHVibGljIGZpbmFsIGNsYXNzIFhNTENoYXJhY3RlclByb3BlcnRpZXMgewotCS8qCi0JICogWzI2XSBWZXJzaW9uTnVtIDo6PSAoW2EtekEtWjAtOV8uOl0gfCAnLScpKwotCSAqIAotCSAqIE5vdGU6IFRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGFzY2lpIHBvcnRpb24gb2YgdGhlIE5hbWVDaGFyIGRlZmluaXRpb24uCi0JICovCi0JLyoqCi0JICogQ2hlY2sgdG8gc2VlIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgdmVyc2lvbiBzdHJpbmcgYWNjb3JkaW5nIHRvIFsyNl0gaW4KLQkgKiB0aGUgWE1MIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgdmVyc2lvbiBpcyBhIHZhbGlkIHZlcnNpb24gc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkVmVyc2lvbk51bShTdHJpbmcgdmVyc2lvbikgewotCQlpZiAodmVyc2lvbi5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZlcnNpb24ubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHZlcnNpb24uY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onIHx8IGZnQXNjaWlOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoKLQkgKiBbODFdIEVuY05hbWUgOjo9IFtBLVphLXpdIChbQS1aYS16MC05Ll9dIHwgJy0nKSoKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBlbmNvZGluZyBuYW1lIGFjY29yZGluZyB0byBbODFdIGluCi0JICogdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiAgICAgICAgICAgIHN0cmluZyB0byBjaGVjawotCSAqIEByZXR1cm4gdHJ1ZSBpZiBlbmNvZGluZyBpcyBhIHZhbGlkIGVuY29kaW5nIG5hbWUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRFbmNOYW1lKFN0cmluZyBlbmNvZGluZykgewotCQlpZiAoZW5jb2RpbmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjaCA9IGVuY29kaW5nLmNoYXJBdCgwKTsKLQkJaWYgKGNoID4gJ3onIHx8IGZnQXNjaWlBbHBoYUNoYXJbY2hdID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgZW5jb2RpbmcubGVuZ3RoKCk7IGkrKykgewotCQkJY2ggPSBlbmNvZGluZy5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPiAneicgfHwgZmdBc2NpaUVuY05hbWVDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgI3hEIHwgI3hBIHwgW2EtekEtWjAtOV0gfAotCSAqIFstJygpKywuLzo9PzshKiNAJF8lXQotCSAqLwotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIHB1YmxpYyBpZGVudGlmaWVyIGFjY29yZGluZyB0byBbMTNdCi0JICogaW4gdGhlIFhNTCAxLjAgUmVjb21tZW5kYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIHN0cmluZyB0byBjaGVjawotCSAqIEByZXR1cm4gdHJ1ZSBpZiBwdWJsaWNJZCBpcyBhIHZhbGlkIHB1YmxpYyBpZGVudGlmaWVyCi0JICovCi0JcHVibGljIHN0YXRpYyBpbnQgdmFsaWRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKHB1YmxpY0lkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHVibGljSWQubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IHB1YmxpY0lkLmNoYXJBdChpKTsKLQkJCWlmIChjaCA+ICd6JyB8fCBmZ0FzY2lpUHViaWRDaGFyW2NoXSA9PSAwKQotCQkJCXJldHVybiBpOwotCQl9Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIFs1XSBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSAoTmFtZUNoYXIpKgotCSAqLwotCS8qKgotCSAqIENoZWNrIHRvIHNlZSBpZiBhIHN0cmluZyBpcyBhIHZhbGlkIE5hbWUgYWNjb3JkaW5nIHRvIFs1XSBpbiB0aGUgWE1MCi0JICogMS4wIFJlY29tbWVuZGF0aW9uCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIHN0cmluZyB0byBjaGVjawotCSAqIEByZXR1cm4gdHJ1ZSBpZiBuYW1lIGlzIGEgdmFsaWQgTmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJWE1MQ2hhcmFjdGVyUHJvcGVydGllcy5pbml0Q2hhckZsYWdzKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWNoYXIgY2ggPSBuYW1lLmNoYXJBdCgwKTsKLQkJaWYgKGNoID4gJ3onKSB7Ci0JCQlpZiAoKGZnQ2hhckZsYWdzW2NoXSAmIEVfSW5pdGlhbE5hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSBpZiAoZmdBc2NpaUluaXRpYWxOYW1lQ2hhcltjaF0gPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLQkJCWNoID0gbmFtZS5jaGFyQXQoaSk7Ci0JCQlpZiAoY2ggPiAneicpIHsKLQkJCQlpZiAoKGZnQ2hhckZsYWdzW2NoXSAmIEVfTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIGlmIChmZ0FzY2lpTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogZnJvbSB0aGUgbmFtZXNwYWNlIHJlYyBbNV0gTkNOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKQotCSAqIChOYW1lTkNDaGFyKSoKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBOQ05hbWUgYWNjb3JkaW5nIHRvIFs1XSBmcm9tIHRoZQotCSAqIFhNTCBOYW1lc3BhY2VzIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRydWUgaWYgbmFtZSBpcyBhIHZhbGlkIE5DTmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZE5DTmFtZShTdHJpbmcgbmFtZSkgewotCQlYTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzLmluaXRDaGFyRmxhZ3MoKTsKLQkJaWYgKG5hbWUubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjaCA9IG5hbWUuY2hhckF0KDApOwotCQlpZiAoY2ggPiAneicpIHsKLQkJCWlmICgoZmdDaGFyRmxhZ3NbY2hdICYgRV9Jbml0aWFsTmFtZUNoYXJGbGFnKSA9PSAwKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIGlmIChmZ0FzY2lpSW5pdGlhbE5DTmFtZUNoYXJbY2hdID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0JCQljaCA9IG5hbWUuY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onKSB7Ci0JCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZmdBc2NpaU5DTmFtZUNoYXJbY2hdID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCi0JLyoKLQkgKiBbN10gTm10b2tlbiA6Oj0gKE5hbWVDaGFyKSsKLQkgKi8KLQkvKioKLQkgKiBDaGVjayB0byBzZWUgaWYgYSBzdHJpbmcgaXMgYSB2YWxpZCBObXRva2VuIGFjY29yZGluZyB0byBbN10gaW4gdGhlIFhNTAotCSAqIDEuMCBSZWNvbW1lbmRhdGlvbgotCSAqIAotCSAqIEBwYXJhbSBubXRva2VuCi0JICogICAgICAgICAgICBzdHJpbmcgdG8gY2hlY2oKLQkgKiBAcmV0dXJuIHRydWUgaWYgbm10b2tlbiBpcyBhIHZhbGlkIE5tdG9rZW4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmFsaWRObXRva2VuKFN0cmluZyBubXRva2VuKSB7Ci0JCVhNTENoYXJhY3RlclByb3BlcnRpZXMuaW5pdENoYXJGbGFncygpOwotCQlpZiAobm10b2tlbi5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5tdG9rZW4ubGVuZ3RoKCk7IGkrKykgewotCQkJY2hhciBjaCA9IG5tdG9rZW4uY2hhckF0KGkpOwotCQkJaWYgKGNoID4gJ3onKSB7Ci0JCQkJaWYgKChmZ0NoYXJGbGFnc1tjaF0gJiBFX05hbWVDaGFyRmxhZykgPT0gMCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJZWxzZSBpZiAoZmdBc2NpaU5hbWVDaGFyW2NoXSA9PSAwKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogSGVyZSBhcmUgdGFibGVzIHVzZWQgdG8gYnVpbGQgY2hhcmFjdGVyIHByb3BlcnRpZXMuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlYRGlnaXRDaGFyW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJzAnCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gLQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICc5JwotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICdBJyAtICdGJwotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICdhJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnZicKLQkJCQkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaUFscGhhQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIC0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAvLyAnUCcgLSAnWicKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlFbmNOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIC8vICctJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDJECi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnLicKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRQotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcwJyAtICc5JwotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJyAtICdPJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC8vICdQJyAtICdaJwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnXycgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDVGCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpUHViaWRDaGFyW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMCwgMCwgMSwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJyAnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICchJywKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAnIycsCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJyQnLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICclJywKLQkJCQkvLyAnXCcnLCAnKCcsICcpJywgJyonLCAnKycsICcsJywgJy0nLCAnLicsICcvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDEsIDAsIDEsIC8vICcwJyAtICc5JywKLQkJCQkJCQkJCQkJCQkJCQkvLyAnOicsICc7JywKLQkJCQkJCQkJCQkJCQkJCQkvLyAnPScsICc/JwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdAJywgJ0EnIC0KLQkJCQkJCQkJCQkJCQkJCQkvLyAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaUluaXRpYWxOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDAsIDAsIC8vICc6JwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIDB4M0EKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaU5hbWVDaGFyW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMSwgMSwgMCwgLy8gJy0nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDJECi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gYW5kCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gJy4nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDJFCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCwgLy8gJzAnIC0gJzknCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICc6JyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4M0EKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnQScgLSAnTycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAxLCAvLyAnUCcgLSAnWicKLQkJCQkJCQkJCQkJCQkJCQkvLyBhbmQgJ18nIGlzCi0JCQkJCQkJCQkJCQkJCQkJLy8gMHg1RgotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdhJyAtICdvJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAgLy8gJ3AnIC0gJ3onCi0JfTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGUgZmdBc2NpaUluaXRpYWxOQ05hbWVDaGFyW10gPSB7MCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJzonCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpcwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgzQQotCQkJCTAsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIC8vICdBJyAtICdPJwotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC8vICdQJyAtICdaJwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnXycgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDVGCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ2EnIC0gJ28nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMCAvLyAncCcgLSAneicKLQl9OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBmZ0FzY2lpTkNOYW1lQ2hhcltdID0gezAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDEsIDAsIC8vICctJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGFuZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcuJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyRQotCQkJCTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcwJyAtICc5JwotCQkJCQkJCQkJCQkJCQkJCS8vIGFuZCAnOicgaXMKLQkJCQkJCQkJCQkJCQkJCQkvLyAweDNBCi0JCQkJMCwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgLy8gJ0EnIC0gJ08nCi0JCQkJMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMCwgMCwgMCwgMCwgMSwgLy8gJ1AnIC0gJ1onCi0JCQkJCQkJCQkJCQkJCQkJLy8gYW5kICdfJyBpcwotCQkJCQkJCQkJCQkJCQkJCS8vIDB4NUYKLQkJCQkwLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAvLyAnYScgLSAnbycKLQkJCQkxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwIC8vICdwJyAtICd6JwotCX07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlDaGFyRGF0YVtdID0gezQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDAsIDQsIDQsIDQsIDQsIDQsIDQsIC8vIHRhYgotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgwOQotCQkJCTQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDAsIDAsIDAsIDAsIDAsIDAsIDIsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIC8vICcmJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyNgotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIC8vICc8JyBpcyAweDNDCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgMCwgLy8gJ10nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDVECi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIGZnQXNjaWlXU0NoYXJEYXRhW10gPSB7NCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwgNSwgNCwgNCwgNSwgNCwgNCwgLy8gdGFiCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDA5LAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIExGCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDBBLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIENSCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDBECi0JCQkJNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNSwgMCwgMCwgMCwgMCwgMCwgMiwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgLy8gJyAnCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDIwLAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vICcmJwotCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGlzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gMHgyNgotCQkJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIC8vICc8JyBpcyAweDNDCi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMywgMCwgMCwgLy8gJ10nCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gaXMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyAweDVECi0JCQkJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMH07Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVfQ2hhckRhdGFGbGFnID0gMSA8PCAwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZSBFX0luaXRpYWxOYW1lQ2hhckZsYWcgPSAxIDw8IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBieXRlIEVfTmFtZUNoYXJGbGFnID0gMSA8PCAyOwotCXB1YmxpYyBzdGF0aWMgYnl0ZVtdIGZnQ2hhckZsYWdzID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIHZvaWQgaW5pdENoYXJGbGFncygpIHsKLQkJaWYgKGZnQ2hhckZsYWdzID09IG51bGwpIHsKLQkJCWZnQ2hhckZsYWdzID0gbmV3IGJ5dGVbMHgxMDAwMF07Ci0JCQlzZXRGbGFnRm9yUmFuZ2UoZmdDaGFyRGF0YVJhbmdlcywgRV9DaGFyRGF0YUZsYWcpOwotCQkJc2V0RmxhZ0ZvclJhbmdlKGZnSW5pdGlhbE5hbWVDaGFyUmFuZ2VzLCAoYnl0ZSkgKEVfSW5pdGlhbE5hbWVDaGFyRmxhZyB8IEVfTmFtZUNoYXJGbGFnKSk7Ci0JCQlzZXRGbGFnRm9yUmFuZ2UoZmdOYW1lQ2hhclJhbmdlcywgRV9OYW1lQ2hhckZsYWcpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRGbGFnRm9yUmFuZ2UoY2hhcltdIHJhbmdlcywgYnl0ZSBmbGFnKSB7Ci0JCWludCBpOwotCQlpbnQgY2g7Ci0JCWZvciAoaSA9IDA7IChjaCA9IHJhbmdlc1tpXSkgIT0gMDsgaSArPSAyKSB7Ci0JCQlpbnQgZW5kY2ggPSByYW5nZXNbaSArIDFdOwotCQkJd2hpbGUgKGNoIDw9IGVuZGNoKQotCQkJCWZnQ2hhckZsYWdzW2NoKytdIHw9IGZsYWc7Ci0JCX0KLQkJZm9yIChpKys7IChjaCA9IHJhbmdlc1tpXSkgIT0gMDsgaSsrKQotCQkJZmdDaGFyRmxhZ3NbY2hdIHw9IGZsYWc7Ci0JfQotCi0JLyoKLQkgKiBbMl0gQ2hhciA6Oj0gI3g5IHwgI3hBIHwgI3hEIHwgWyN4MjAtI3hEN0ZGXSAvLyBhbnkgVW5pY29kZSBjaGFyYWN0ZXIsCi0JICogZXhjbHVkaW5nIHRoZSB8IFsjeEUwMDAtI3hGRkZEXSB8IFsjeDEwMDAwLSN4MTBGRkZGXSAvLyBzdXJyb2dhdGUKLQkgKiBibG9ja3MsIEZGRkUsIGFuZCBGRkZGLiBbMTRdIENoYXJEYXRhIDo6PSBbXjwmXSogLSAoW148Jl0qICddXT4nIFtePCZdKikKLQkgKiAKLQkgKiBXZSB3aWxsIHVzZSBDaGFyIC0gKCBbXjwmXSB8ICddJyB8ICN4QSB8ICN4RCApIGFuZCBoYW5kbGUgdGhlIHNwZWNpYWwKLQkgKiBjYXNlcyBpbmxpbmUuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBmZ0NoYXJEYXRhUmFuZ2VzW10gPSB7MHgwMDIwLCAweDAwMjUsIC8vICcmJyBpcwotCQkJCQkJCQkJCQkJCQkJCQkvLyAweDAwMjYKLQkJCQkweDAwMjcsIDB4MDAzQiwgLy8gJzwnIGlzIDB4MDAzQwotCQkJCTB4MDAzRCwgMHgwMDVDLCAvLyAnXScgaXMgMHgwMDVECi0JCQkJMHgwMDVFLCAweEQ3RkYsIDB4RTAwMCwgMHhGRkZELCAweDAwMDAsIDB4MDAwOSwgLy8gdGFiCi0JCQkJMHgwMDAwfTsKLQkvKgotCSAqIFs1XSBOYW1lIDo6PSAoTGV0dGVyIHwgJ18nIHwgJzonKSAoTmFtZUNoYXIpKiBbNF0gTmFtZUNoYXIgOjo9IExldHRlciB8Ci0JICogRGlnaXQgfCAnLicgfCAnLScgfCAnXycgfCAnOicgfCBDb21iaW5pbmdDaGFyIHwgRXh0ZW5kZXIgWzg0XSBMZXR0ZXIKLQkgKiA6Oj0gQmFzZUNoYXIgfCBJZGVvZ3JhcGhpYyBbODVdIEJhc2VDaGFyIDo6PSA8c2VlIHN0YW5kYXJkPiBbODZdCi0JICogSWRlb2dyYXBoaWMgOjo9IDxzZWUgc3RhbmRhcmQ+IFs4N10gQ29tYmluaW5nQ2hhciA6Oj0gPHNlZSBzdGFuZGFyZD4KLQkgKiBbODhdIERpZ2l0IDo6PSA8c2VlIHN0YW5kYXJkPiBbODldIEV4dGVuZGVyIDo6PSA8c2VlIHN0YW5kYXJkPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgZmdJbml0aWFsTmFtZUNoYXJSYW5nZXNbXSA9IHsKLQkvLwotCQkJCS8vIFJhbmdlczoKLQkJCQkvLwotCQkJCS8vIEJhc2VDaGFyIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgwMDQxLCAweDAwNUEsIDB4MDA2MSwgMHgwMDdBLCAweDAwQzAsIDB4MDBENiwgMHgwMEQ4LCAweDAwRjYsIDB4MDBGOCwgMHgwMTMxLCAweDAxMzQsIDB4MDEzRSwgMHgwMTQxLCAweDAxNDgsIDB4MDE0QSwgMHgwMTdFLCAweDAxODAsIDB4MDFDMywgMHgwMUNELCAweDAxRjAsIDB4MDFGNCwgMHgwMUY1LCAweDAxRkEsIDB4MDIxNywgMHgwMjUwLCAweDAyQTgsIDB4MDJCQiwgMHgwMkMxLCAweDAzODgsIDB4MDM4QSwgMHgwMzhFLCAweDAzQTEsIDB4MDNBMywgMHgwM0NFLCAweDAzRDAsIDB4MDNENiwgMHgwM0UyLCAweDAzRjMsIDB4MDQwMSwgMHgwNDBDLCAweDA0MEUsIDB4MDQ0RiwgMHgwNDUxLCAweDA0NUMsIDB4MDQ1RSwgMHgwNDgxLCAweDA0OTAsIDB4MDRDNCwgMHgwNEM3LCAweDA0QzgsIDB4MDRDQiwgMHgwNENDLCAweDA0RDAsIDB4MDRFQiwgMHgwNEVFLCAweDA0RjUsIDB4MDRGOCwgMHgwNEY5LCAweDA1MzEsIDB4MDU1NiwgMHgwNTYxLCAweDA1ODYsIDB4MDVEMCwgMHgwNUVBLCAweDA1RjAsIDB4MDVGMiwgMHgwNjIxLCAweDA2M0EsIDB4MDY0MSwgMHgwNjRBLCAweDA2NzEsIDB4MDZCNywgMHgwNkJBLCAweDA2QkUsIDB4MDZDMCwgMHgwNkNFLCAweDA2RDAsIDB4MDZEMywgMHgwNkU1LCAweDA2RTYsIDB4MDkwNSwgMHgwOTM5LCAweDA5NTgsIDB4MDk2MSwgMHgwOTg1LCAweDA5OEMsIDB4MDk4RiwgMHgwOTkwLCAweDA5OTMsIDB4MDlBOCwgMHgwOUFBLCAweDA5QjAsIDB4MDlCNiwgMHgwOUI5LCAweDA5REMsIDB4MDlERCwgMHgwOURGLCAweDA5RTEsIDB4MDlGMCwgMHgwOUYxLCAweDBBMDUsIDB4MEEwQSwgMHgwQTBGLCAweDBBMTAsIDB4MEExMywgMHgwQTI4LCAweDBBMkEsIDB4MEEzMCwgMHgwQTMyLCAweDBBMzMsIDB4MEEzNSwgMHgwQTM2LCAweDBBMzgsIDB4MEEzOSwgMHgwQTU5LCAweDBBNUMsIDB4MEE3MiwgMHgwQTc0LCAweDBBODUsIDB4MEE4QiwgMHgwQThGLCAweDBBOTEsCi0JCQkJMHgwQTkzLCAweDBBQTgsIDB4MEFBQSwgMHgwQUIwLCAweDBBQjIsIDB4MEFCMywgMHgwQUI1LCAweDBBQjksIDB4MEIwNSwgMHgwQjBDLCAweDBCMEYsIDB4MEIxMCwgMHgwQjEzLCAweDBCMjgsIDB4MEIyQSwgMHgwQjMwLCAweDBCMzIsIDB4MEIzMywgMHgwQjM2LCAweDBCMzksIDB4MEI1QywgMHgwQjVELCAweDBCNUYsIDB4MEI2MSwgMHgwQjg1LCAweDBCOEEsIDB4MEI4RSwgMHgwQjkwLCAweDBCOTIsIDB4MEI5NSwgMHgwQjk5LCAweDBCOUEsIDB4MEI5RSwgMHgwQjlGLCAweDBCQTMsIDB4MEJBNCwgMHgwQkE4LCAweDBCQUEsIDB4MEJBRSwgMHgwQkI1LCAweDBCQjcsIDB4MEJCOSwgMHgwQzA1LCAweDBDMEMsIDB4MEMwRSwgMHgwQzEwLCAweDBDMTIsIDB4MEMyOCwgMHgwQzJBLCAweDBDMzMsIDB4MEMzNSwgMHgwQzM5LCAweDBDNjAsIDB4MEM2MSwgMHgwQzg1LCAweDBDOEMsIDB4MEM4RSwgMHgwQzkwLCAweDBDOTIsIDB4MENBOCwgMHgwQ0FBLCAweDBDQjMsIDB4MENCNSwgMHgwQ0I5LCAweDBDRTAsIDB4MENFMSwgMHgwRDA1LCAweDBEMEMsIDB4MEQwRSwgMHgwRDEwLCAweDBEMTIsIDB4MEQyOCwgMHgwRDJBLCAweDBEMzksIDB4MEQ2MCwgMHgwRDYxLCAweDBFMDEsIDB4MEUyRSwgMHgwRTMyLCAweDBFMzMsIDB4MEU0MCwgMHgwRTQ1LCAweDBFODEsIDB4MEU4MiwgMHgwRTg3LCAweDBFODgsIDB4MEU5NCwgMHgwRTk3LCAweDBFOTksIDB4MEU5RiwgMHgwRUExLCAweDBFQTMsIDB4MEVBQSwgMHgwRUFCLCAweDBFQUQsIDB4MEVBRSwgMHgwRUIyLCAweDBFQjMsIDB4MEVDMCwgMHgwRUM0LCAweDBGNDAsIDB4MEY0NywgMHgwRjQ5LCAweDBGNjksIDB4MTBBMCwgMHgxMEM1LCAweDEwRDAsIDB4MTBGNiwgMHgxMTAyLCAweDExMDMsIDB4MTEwNSwgMHgxMTA3LCAweDExMEIsIDB4MTEwQywgMHgxMTBFLCAweDExMTIsIDB4MTE1NCwgMHgxMTU1LCAweDExNUYsIDB4MTE2MSwgMHgxMTZELCAweDExNkUsCi0JCQkJMHgxMTcyLCAweDExNzMsIDB4MTFBRSwgMHgxMUFGLCAweDExQjcsIDB4MTFCOCwgMHgxMUJDLCAweDExQzIsIDB4MUUwMCwgMHgxRTlCLCAweDFFQTAsIDB4MUVGOSwgMHgxRjAwLCAweDFGMTUsIDB4MUYxOCwgMHgxRjFELCAweDFGMjAsIDB4MUY0NSwgMHgxRjQ4LCAweDFGNEQsIDB4MUY1MCwgMHgxRjU3LCAweDFGNUYsIDB4MUY3RCwgMHgxRjgwLCAweDFGQjQsIDB4MUZCNiwgMHgxRkJDLCAweDFGQzIsIDB4MUZDNCwgMHgxRkM2LCAweDFGQ0MsIDB4MUZEMCwgMHgxRkQzLCAweDFGRDYsIDB4MUZEQiwgMHgxRkUwLCAweDFGRUMsIDB4MUZGMiwgMHgxRkY0LCAweDFGRjYsIDB4MUZGQywgMHgyMTJBLCAweDIxMkIsIDB4MjE4MCwgMHgyMTgyLCAweDMwNDEsIDB4MzA5NCwgMHgzMEExLCAweDMwRkEsIDB4MzEwNSwgMHgzMTJDLCAweEFDMDAsIDB4RDdBMywKLQkJCQkvLwotCQkJCS8vIElkZW9ncmFwaGljIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgzMDIxLCAweDMwMjksIDB4NEUwMCwgMHg5RkE1LAotCQkJCS8vCi0JCQkJLy8gUmFuZ2VzIGVuZCBtYXJrZXIKLQkJCQkvLwotCQkJCTB4MDAwMCwKLQkJCQkvLwotCQkJCS8vIFNpbmdsZSBjaGFyIHZhbHVlcwotCQkJCS8vCi0JCQkJMHgwMDNBLCAvLyAnOicKLQkJCQkweDAwNUYsIC8vICdfJwotCQkJCS8vCi0JCQkJLy8gQmFzZUNoYXIgc2luZ2xlcwotCQkJCS8vCi0JCQkJMHgwMzg2LCAweDAzOEMsIDB4MDNEQSwgMHgwM0RDLCAweDAzREUsIDB4MDNFMCwgMHgwNTU5LCAweDA2RDUsIDB4MDkzRCwgMHgwOUIyLCAweDBBNUUsIDB4MEE4RCwgMHgwQUJELCAweDBBRTAsIDB4MEIzRCwgMHgwQjlDLCAweDBDREUsIDB4MEUzMCwgMHgwRTg0LCAweDBFOEEsIDB4MEU4RCwgMHgwRUE1LCAweDBFQTcsIDB4MEVCMCwgMHgwRUJELCAweDExMDAsIDB4MTEwOSwgMHgxMTNDLCAweDExM0UsIDB4MTE0MCwgMHgxMTRDLCAweDExNEUsIDB4MTE1MCwgMHgxMTU5LCAweDExNjMsIDB4MTE2NSwgMHgxMTY3LCAweDExNjksIDB4MTE3NSwgMHgxMTlFLCAweDExQTgsIDB4MTFBQiwgMHgxMUJBLCAweDExRUIsIDB4MTFGMCwgMHgxMUY5LCAweDFGNTksIDB4MUY1QiwgMHgxRjVELCAweDFGQkUsIDB4MjEyNiwgMHgyMTJFLAotCQkJCS8vCi0JCQkJLy8gSWRlb2dyYXBoaWMgc2luZ2xlcwotCQkJCS8vCi0JCQkJMHgzMDA3LAotCQkJCS8vCi0JCQkJLy8gU2luZ2xlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDB9OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgZmdOYW1lQ2hhclJhbmdlc1tdID0gewotCS8vCi0JCQkJLy8gUmFuZ2VzOgotCQkJCS8vCi0JCQkJMHgwMDJELCAweDAwMkUsIC8vICctJyBhbmQgJy4nCi0JCQkJLy8KLQkJCQkvLyBDb21iaW5pbmdDaGFyIHJhbmdlcwotCQkJCS8vCi0JCQkJMHgwMzAwLCAweDAzNDUsIDB4MDM2MCwgMHgwMzYxLCAweDA0ODMsIDB4MDQ4NiwgMHgwNTkxLCAweDA1QTEsIDB4MDVBMywgMHgwNUI5LCAweDA1QkIsIDB4MDVCRCwgMHgwNUMxLCAweDA1QzIsIDB4MDY0QiwgMHgwNjUyLCAweDA2RDYsIDB4MDZEQywgMHgwNkRELCAweDA2REYsIDB4MDZFMCwgMHgwNkU0LCAweDA2RTcsIDB4MDZFOCwgMHgwNkVBLCAweDA2RUQsIDB4MDkwMSwgMHgwOTAzLCAweDA5M0UsIDB4MDk0QywgMHgwOTUxLCAweDA5NTQsIDB4MDk2MiwgMHgwOTYzLCAweDA5ODEsIDB4MDk4MywgMHgwOUMwLCAweDA5QzQsIDB4MDlDNywgMHgwOUM4LCAweDA5Q0IsIDB4MDlDRCwgMHgwOUUyLCAweDA5RTMsIDB4MEE0MCwgMHgwQTQyLCAweDBBNDcsIDB4MEE0OCwgMHgwQTRCLCAweDBBNEQsIDB4MEE3MCwgMHgwQTcxLCAweDBBODEsIDB4MEE4MywgMHgwQUJFLCAweDBBQzUsIDB4MEFDNywgMHgwQUM5LCAweDBBQ0IsIDB4MEFDRCwgMHgwQjAxLCAweDBCMDMsIDB4MEIzRSwgMHgwQjQzLCAweDBCNDcsIDB4MEI0OCwgMHgwQjRCLCAweDBCNEQsIDB4MEI1NiwgMHgwQjU3LCAweDBCODIsIDB4MEI4MywgMHgwQkJFLCAweDBCQzIsIDB4MEJDNiwgMHgwQkM4LCAweDBCQ0EsIDB4MEJDRCwgMHgwQzAxLCAweDBDMDMsIDB4MEMzRSwgMHgwQzQ0LCAweDBDNDYsIDB4MEM0OCwgMHgwQzRBLCAweDBDNEQsIDB4MEM1NSwgMHgwQzU2LCAweDBDODIsIDB4MEM4MywgMHgwQ0JFLCAweDBDQzQsIDB4MENDNiwgMHgwQ0M4LCAweDBDQ0EsIDB4MENDRCwgMHgwQ0Q1LCAweDBDRDYsIDB4MEQwMiwgMHgwRDAzLCAweDBEM0UsIDB4MEQ0MywgMHgwRDQ2LCAweDBENDgsIDB4MEQ0QSwgMHgwRDRELCAweDBFMzQsIDB4MEUzQSwgMHgwRTQ3LCAweDBFNEUsIDB4MEVCNCwgMHgwRUI5LCAweDBFQkIsIDB4MEVCQywgMHgwRUM4LCAweDBFQ0QsIDB4MEYxOCwgMHgwRjE5LCAweDBGNzEsIDB4MEY4NCwgMHgwRjg2LCAweDBGOEIsCi0JCQkJMHgwRjkwLCAweDBGOTUsIDB4MEY5OSwgMHgwRkFELCAweDBGQjEsIDB4MEZCNywgMHgyMEQwLCAweDIwREMsIDB4MzAyQSwgMHgzMDJGLAotCQkJCS8vCi0JCQkJLy8gRGlnaXQgcmFuZ2VzCi0JCQkJLy8KLQkJCQkweDAwMzAsIDB4MDAzOSwgMHgwNjYwLCAweDA2NjksIDB4MDZGMCwgMHgwNkY5LCAweDA5NjYsIDB4MDk2RiwgMHgwOUU2LCAweDA5RUYsIDB4MEE2NiwgMHgwQTZGLCAweDBBRTYsIDB4MEFFRiwgMHgwQjY2LCAweDBCNkYsIDB4MEJFNywgMHgwQkVGLCAweDBDNjYsIDB4MEM2RiwgMHgwQ0U2LCAweDBDRUYsIDB4MEQ2NiwgMHgwRDZGLCAweDBFNTAsIDB4MEU1OSwgMHgwRUQwLCAweDBFRDksIDB4MEYyMCwgMHgwRjI5LAotCQkJCS8vCi0JCQkJLy8gRXh0ZW5kZXIgcmFuZ2VzCi0JCQkJLy8KLQkJCQkweDMwMzEsIDB4MzAzNSwgMHgzMDlELCAweDMwOUUsIDB4MzBGQywgMHgzMEZFLAotCQkJCS8vCi0JCQkJLy8gUmFuZ2VzIGVuZCBtYXJrZXIKLQkJCQkvLwotCQkJCTB4MDAwMCwKLQkJCQkvLwotCQkJCS8vIFNpbmdsZSBjaGFyIHZhbHVlcwotCQkJCS8vCi0JCQkJLy8gQ29tYmluaW5nQ2hhciBzaW5nbGVzCi0JCQkJLy8KLQkJCQkweDA1QkYsIDB4MDVDNCwgMHgwNjcwLCAweDA5M0MsIDB4MDk0RCwgMHgwOUJDLCAweDA5QkUsIDB4MDlCRiwgMHgwOUQ3LCAweDBBMDIsIDB4MEEzQywgMHgwQTNFLCAweDBBM0YsIDB4MEFCQywgMHgwQjNDLCAweDBCRDcsIDB4MEQ1NywgMHgwRTMxLCAweDBFQjEsIDB4MEYzNSwgMHgwRjM3LCAweDBGMzksIDB4MEYzRSwgMHgwRjNGLCAweDBGOTcsIDB4MEZCOSwgMHgyMEUxLCAweDMwOTksIDB4MzA5QSwKLQkJCQkvLwotCQkJCS8vIEV4dGVuZGVyIHNpbmdsZXMKLQkJCQkvLwotCQkJCTB4MDBCNywgMHgwMkQwLCAweDAyRDEsIDB4MDM4NywgMHgwNjQwLCAweDBFNDYsIDB4MEVDNiwgMHgzMDA1LAotCQkJCS8vCi0JCQkJLy8gU2luZ2xlcyBlbmQgbWFya2VyCi0JCQkJLy8KLQkJCQkweDAwMDB9OwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvbk1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0MzEyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0aW9uTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgRFREIFZhbGlkYXRpb24KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9SRUZfRUxFTUVOVF9VTkRFRklORUQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX0RURF9JTlZBTElEX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19EVERfSU5WQUxJRF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRElBTE9HX0RURF9WQUxJRF9URVhUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ESUFMT0dfRFREX1ZBTElEX1RJVExFOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5EVERWYWxpZGF0aW9uUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19yZXF1aXJlZF9maWxlc18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNaXNzaW5nX3JlcXVpcmVkX2ZpbGVzXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19yZXF1aXJlZF9maWxlc180OwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIERURFZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdGlvblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg2YTNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0RURFZhbGlkYXRpb25SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIQotISBWYWxpZGF0ZSBEVEQKLSEKLV9VSV9ESUFMT0dfRFREX0lOVkFMSURfVElUTEUgID0gVmFsaWRhdGlvbiBGYWlsZWQKLV9VSV9ESUFMT0dfRFREX1ZBTElEX1RJVExFICAgID0gVmFsaWRhdGlvbiBTdWNjZWVkZWQKLV9VSV9ESUFMT0dfRFREX1ZBTElEX1RFWFQgICAgID0gVGhlIERURCBmaWxlIGlzIHZhbGlkLgotX1VJX0RJQUxPR19EVERfSU5WQUxJRF9URVhUICAgPSBUaGUgRFREIGZpbGUgaXMgbm90IHZhbGlkLiBTZWUgdGhlIFByb2JsZW1zIHZpZXcgZm9yIGVycm9yIG1lc3NhZ2VzLgotCi0hCi0hIFJlZmVyZW5jZWQgRWxlbWVudCBWYWxpZGF0aW9uCi0hCi1fRVJST1JfUkVGX0VMRU1FTlRfVU5ERUZJTkVEID0gVGhlIGVsZW1lbnQgezB9IGhhcyBub3QgYmVlbiBkZWNsYXJlZC4KLU1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMT1SZXF1aXJlZCBmaWxlcyB4ZXJjZXNJbXBsLmphciBhbmQgeG1sUGFyc2VyQVBJcy5qYXIgY2Fubm90IGJlIGZvdW5kLlxuXG4KLU1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMj1Eb3dubG9hZCBYZXJjZXMgMi42LjIgYW5kIHBsYWNlIHhlcmNlc0ltcGwuamFyIGFuZCB4bWxQYXJzZXJBUElzLmphciBpbiBhIGZvbGRlciBlbnRpdGxlZCBqYXJzIGluIHRoZSBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24gcGx1Z2luLlxuXG4KLU1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfMz1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL3htbC94ZXJjZXNJbmZvLnhtbC4KLU1pc3NpbmdfcmVxdWlyZWRfZmlsZXNfND1NaXNzaW5nIFhlcmNlcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vRFREVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFmZjFjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9EVERWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5MYXp5VVJMSW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LkxvY2F0b3I7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogRFREIHZhbGlkYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERWYWxpZGF0b3IgewotCS8qKgotCSAqIEFuIGVudGl0eSByZXNvbHZlciB0aGF0IHdyYXBzIGEgVVJJIHJlc29sdmVyLgotCSAqLwotCWNsYXNzIERUREVudGl0eVJlc29sdmVyIGltcGxlbWVudHMgRW50aXR5UmVzb2x2ZXIgewotCQlwcml2YXRlIFN0cmluZyBmQmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJcHJpdmF0ZSBVUklSZXNvbHZlciBmVVJJUmVzb2x2ZXIgPSBudWxsOwotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3Rvci4KLQkJICogCi0JCSAqIEBwYXJhbSBpZHJlc29sdmVyCi0JCSAqICAgICAgICAgICAgVGhlIGlkcmVzb2x2ZXIgdGhpcyBlbnRpdHkgcmVzb2x2ZXIgd3JhcHMuCi0JCSAqIEBwYXJhbSBiYXNlbG9jYXRpb24KLQkJICogICAgICAgICAgICBUaGUgYmFzZSBsb2NhdGlvbiB0byByZXNvbHZlIHdpdGguCi0JCSAqLwotCQlwdWJsaWMgRFRERW50aXR5UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpcmVzb2x2ZXIsIFN0cmluZyBiYXNlbG9jYXRpb24pIHsKLQkJCXRoaXMuZlVSSVJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIFRPRE8gY3M6IHdlIG5ldmVyIHNlZW0gdG8gc2V0IGEgVVJJUmVzb2x2ZXIKLSAgICAgICAgICAgIC8vIEkgY3JlYXRlIG9uZSBoZXJlIHVwIGZyb250IGp1c3QgaW5jYXNlCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGZVUklSZXNvbHZlciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBmVVJJUmVzb2x2ZXIgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpOyAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAKLQkJCXRoaXMuZkJhc2VMb2NhdGlvbiA9IGJhc2Vsb2NhdGlvbjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkJU3RyaW5nIGxvY2F0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgCi0JCQlpZiAoZkJhc2VMb2NhdGlvbi5lcXVhbHMoc3lzdGVtSWQpKSB7Ci0JCQkJbG9jYXRpb24gPSBzeXN0ZW1JZDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWxvY2F0aW9uID0gZlVSSVJlc29sdmVyLnJlc29sdmUoZkJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCUlucHV0U291cmNlIGlzID0gbnVsbDsKLQkJCWlmIChsb2NhdGlvbiAhPSBudWxsICYmICFsb2NhdGlvbi5lcXVhbHMoIiIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkgIC8vIENTIDogd2hpbGUgd29ya2luZyBvbiBidWcgMTEzNTM3IEkgbm90aWNlZCB3ZSdyZSBub3QgdXNpbmcgdGhlIExhenlVUkxJbnB1dFN0cmVhbQotCQkgICAgICAvLyBzbyBmaXhlZCB0aGlzIHRvIGF2b2lkIGxlYWtpbmcgZmlsZSBoYW5kbGVzCi0JCQkgIC8vCi0gICAgICAgICAgICAgIFN0cmluZyBwaHlzaWNhbCA9IGZVUklSZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihmQmFzZUxvY2F0aW9uLCBwdWJsaWNJZCwgbG9jYXRpb24pOyAKLQkJCSAgaXMgPSBuZXcgSW5wdXRTb3VyY2UobG9jYXRpb24pOwotCQkJICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsKLQkJCX0KLQkJCXJldHVybiBpczsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFuIGVycm9yIGhhbmRsZXIgZm9yIERURCB2YWxpZGF0aW9uLgotCSAqIAotCSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLQkgKi8KLQljbGFzcyBEVERFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBFcnJvckhhbmRsZXIgewotCi0JCXByaXZhdGUgZmluYWwgaW50IEVSUk9SID0gMDsKLQkJcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uSW5mbyBmVmFsaWRhdGlvbkluZm87Ci0KLQkJcHJpdmF0ZSBmaW5hbCBpbnQgV0FSTklORyA9IDE7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdG9yLgotCQkgKiAKLQkJICogQHBhcmFtIHZhbGluZm8KLQkJICogICAgICAgICAgICBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byB1c2UgdG8gcmVnaXN0ZXIgdmFsaWRhdGlvbgotCQkgKiAgICAgICAgICAgIG1lc3NhZ2VzLgotCQkgKi8KLQkJcHVibGljIERUREVycm9ySGFuZGxlcihWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKSB7Ci0JCQl0aGlzLmZWYWxpZGF0aW9uSW5mbyA9IHZhbGluZm87Ci0JCX0KLQotCQkvKioKLQkJICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotCQkgKiAKLQkJICogQHBhcmFtIGV4Y2VwdGlvbgotCQkgKiAgICAgICAgICAgIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi0JCSAqICAgICAgICAgICAgbWVzc2FnZS4KLQkJICogQHBhcmFtIHNldmVyaXR5Ci0JCSAqICAgICAgICAgICAgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0JCSAqLwotCQlwcm90ZWN0ZWQgdm9pZCBhZGRWYWxpZGF0aW9uTWVzc2FnZShTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24sIGludCBzZXZlcml0eSkgewotCQkJaWYgKGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpICE9IG51bGwpIHsKLQkJCQlpZiAoc2V2ZXJpdHkgPT0gV0FSTklORykgewotCQkJCQlmVmFsaWRhdGlvbkluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZWYWxpZGF0aW9uSW5mby5hZGRFcnJvcihleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3Iob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI3dhcm5pbmcob3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb24pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCB3YXJuaW5nKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIFdBUk5JTkcpOwotCQl9Ci0JfQotCi0JY2xhc3MgTXVsdGlIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5EVERIYW5kbGVyLCBDb250ZW50SGFuZGxlciwgTGV4aWNhbEhhbmRsZXIsIERlY2xIYW5kbGVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRfTU9ESUZJRVJTID0gIiorPyI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfREVMSU1JVEVSUyA9ICIsKCl8ICI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIExpc3QgZkVsZW1EZWNscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIEhhc2h0YWJsZSBmRWxlbVJlZnMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZJZ25vcmVFbGVtTW9kZWwgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHJpdmF0ZSBMaXN0IGZJZ25vcmVFbGVtUmVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlwcml2YXRlIExvY2F0b3IgZkxvY2F0b3IgPSBudWxsOwotCi0JCXB1YmxpYyBNdWx0aUhhbmRsZXIoKSB7Ci0JCQlmSWdub3JlRWxlbVJlZnMuYWRkKCIjUENEQVRBIik7IC8vJE5PTi1OTFMtMSQKLQkJCWZJZ25vcmVFbGVtTW9kZWwuYWRkKCJBTlkiKTsgLy8kTk9OLU5MUy0xJAotCQkJZklnbm9yZUVsZW1Nb2RlbC5hZGQoIkVNUFRZIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2F0dHJpYnV0ZURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhdHRyaWJ1dGVEZWNsKFN0cmluZyBlTmFtZSwgU3RyaW5nIGFOYW1lLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlRGVmYXVsdCwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjY29tbWVudChjaGFyW10sIGludCwgaW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgY29tbWVudChjaGFyW10gYXJnMCwgaW50IGFyZzEsIGludCBhcmcyKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZWxlbWVudERlY2woU3RyaW5nIG5hbWUsIFN0cmluZyBtb2RlbCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBBZGQgdGhpcyBlbGVtZW50IHRvIHRoZSBsaXN0IG9mIGRlY2xhcmVkIGVsZW1lbnRzLgotCQkJZkVsZW1EZWNscy5hZGQobmFtZSk7Ci0KLQkJCS8vIFJldHVybiBpZiB0aGUgZWxlbWVudCBtb2RlbCBzaG91bGQgYmUgaWdub3JlZC4gVGhlIG1vZGVsIHNob3VsZAotCQkJLy8gYmUKLQkJCS8vIGlnbm9yZWQgaW4gc3VjaCBjYXNlcyBhcyB3aGVuIGl0IGlzIGVxdWFsIHRvIEVNUFRZIG9yIEFOWS4KLQkJCWlmIChmSWdub3JlRWxlbU1vZGVsLmNvbnRhaW5zKG1vZGVsKSkgewotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIEFkZCBlYWNoIHJlZmVyZW5jZWQgZWxlbWVudCB0byB0aGUgbGlzdCBvZiByZWZlcmVuY2VkIGVsZW1lbnRzCi0JCQlpbnQgbGluZSA9IGZMb2NhdG9yLmdldExpbmVOdW1iZXIoKTsKLQkJCWludCBjb2x1bW4gPSBmTG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKTsKLQkJCVN0cmluZyB1cmkgPSBmTG9jYXRvci5nZXRTeXN0ZW1JZCgpOwotCi0JCQlTdHJpbmdUb2tlbml6ZXIgc3RydG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RlbCwgTU9ERUxfREVMSU1JVEVSUyk7Ci0JCQl3aGlsZSAoc3RydG9rLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyB0b2tlbiA9IHN0cnRvay5uZXh0VG9rZW4oKTsKLQkJCQlpbnQgdG9rZW5sZW5ndGggPSB0b2tlbi5sZW5ndGgoKTsKLQkJCQlpZiAoRUxFTUVOVF9NT0RJRklFUlMuaW5kZXhPZih0b2tlbi5jaGFyQXQodG9rZW5sZW5ndGggLSAxKSkgIT0gLTEpIHsKLQkJCQkJdG9rZW4gPSB0b2tlbi5zdWJzdHJpbmcoMCwgdG9rZW5sZW5ndGggLSAxKTsKLQkJCQkJLy8gSWYgdGhlIHRva2VuIGlzIG5vdyBlbXB0eSAoaXQgd2FzIG9ubHkgPywqIG9yICspIHRoZW4KLQkJCQkJLy8gY29udGludWUuCi0JCQkJCWlmICh0b2tlbi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoZklnbm9yZUVsZW1SZWZzLmNvbnRhaW5zKHRva2VuKSkgewotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJRWxlbWVudFJlZkxvY2F0aW9uIGVsZW1Mb2MgPSAoRWxlbWVudFJlZkxvY2F0aW9uKSBmRWxlbVJlZnMuZ2V0KHRva2VuKTsKLQkJCQlFbGVtZW50UmVmTG9jYXRpb24gdG9rZW5Mb2MgPSBuZXcgRWxlbWVudFJlZkxvY2F0aW9uKGxpbmUsIGNvbHVtbiwgdXJpLCBlbGVtTG9jKTsKLQkJCQlmRWxlbVJlZnMucHV0KHRva2VuLCB0b2tlbkxvYyk7Ci0JCQl9Ci0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZENEQVRBKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGVuZENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI2VuZERURCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIE5vIG1ldGhvZCBpbXBsLgotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcueG1sLnNheC5leHQuTGV4aWNhbEhhbmRsZXIjZW5kRW50aXR5KGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBlbmRFbnRpdHkoU3RyaW5nIGFyZzApIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNleHRlcm5hbEVudGl0eURlY2woamF2YS5sYW5nLlN0cmluZywKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZXh0ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qKgotCQkgKiBHZXQgdGhlIGxpc3Qgb2YgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JCSAqIAotCQkgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGVsZW1lbnQgZGVjbGFyYXRpb25zLgotCQkgKi8KLQkJcHVibGljIExpc3QgZ2V0RWxlbWVudERlY2xhcmF0aW9ucygpIHsKLQkJCXJldHVybiBmRWxlbURlY2xzOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldCB0aGUgZWxlbWVudCByZWZlcmVuY2VzIGhhc2h0YWJsZS4KLQkJICogCi0JCSAqIEByZXR1cm4gVGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBoYXNodGFibGUuCi0JCSAqLwotCQlwdWJsaWMgSGFzaHRhYmxlIGdldEVsZW1lbnRSZWZlcmVuY2VzKCkgewotCQkJcmV0dXJuIGZFbGVtUmVmczsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2ludGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnRlcm5hbEVudGl0eURlY2woU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQkvLyBObyBtZXRob2QgaW1wbC4KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc2V0RG9jdW1lbnRMb2NhdG9yKG9yZy54bWwuc2F4LkxvY2F0b3IpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2NhdG9yKSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudExvY2F0b3IobG9jYXRvcik7Ci0JCQl0aGlzLmZMb2NhdG9yID0gbG9jYXRvcjsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyI3N0YXJ0Q0RBVEEoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydERURChqYXZhLmxhbmcuU3RyaW5nLAotCQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydERURChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5MZXhpY2FsSGFuZGxlciNzdGFydEVudGl0eShqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgc3RhcnRFbnRpdHkoU3RyaW5nIG5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJLy8gTm8gbWV0aG9kIGltcGwuCi0JCX0KLQl9Ci0KLQkKLQotCXByaXZhdGUgVVJJUmVzb2x2ZXIgZlJlc29sdmVyID0gbnVsbDsKLQotCXB1YmxpYyBEVERWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggWFNEIHZhbGlkYXRpb24uCi0JICogCi0JICogQHBhcmFtIHVyaXJlc29sdmVyCi0JICogICAgICAgICAgICBUaGUgVVJJIHJlc29sdmVyIHRvIHVzZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlcikgewotCQl0aGlzLmZSZXNvbHZlciA9IHVyaXJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIFZhbGlkYXRlIHRoZSBEVEQgZmlsZSBsb2NhdGVkIGF0IHRoZSBVUkkuCi0JICogCi0JICogQHBhcmFtIHVyaQotCSAqICAgICAgICAgICAgVGhlIFVSSSBvZiB0aGUgZmlsZSB0byB2YWxpZGF0ZS4KLQkgKiBAcmV0dXJuIEEgdmFsaWRhdGlvbiByZXBvcnQgZm9yIHRoZSB2YWxpZGF0aW9uLgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmkpIHsKLQkJVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG5ldyBWYWxpZGF0aW9uSW5mbyh1cmkpOwotCQl0cnkgewotCQkJU0FYUGFyc2VyIHBhcnNlciA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdTQVhQYXJzZXIoKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0JCQlNdWx0aUhhbmRsZXIgZHRkSGFuZGxlciA9IG5ldyBNdWx0aUhhbmRsZXIoKTsKLQkJCXJlYWRlci5zZXRQcm9wZXJ0eSgiaHR0cDovL3htbC5vcmcvc2F4L3Byb3BlcnRpZXMvZGVjbGFyYXRpb24taGFuZGxlciIsIGR0ZEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGR0ZEhhbmRsZXIpOyAvLyROT04tTkxTLTEkCi0JCQlyZWFkZXIuc2V0Q29udGVudEhhbmRsZXIoZHRkSGFuZGxlcik7Ci0JCQlyZWFkZXIuc2V0RFRESGFuZGxlcihkdGRIYW5kbGVyKTsKLQkJCXJlYWRlci5zZXRFcnJvckhhbmRsZXIobmV3IERUREVycm9ySGFuZGxlcih2YWxpbmZvKSk7Ci0JCQlyZWFkZXIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IERUREVudGl0eVJlc29sdmVyKGZSZXNvbHZlciwgdXJpKSk7Ci0JCQlTdHJpbmcgZG9jdW1lbnQgPSAiPCFET0NUWVBFIHJvb3QgU1lTVEVNIFwiIiArIHVyaSArICJcIj48cm9vdC8+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCXJlYWRlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihkb2N1bWVudCkpKTsKLQotCQkJTGlzdCBlbGVtRGVjbHMgPSBkdGRIYW5kbGVyLmdldEVsZW1lbnREZWNsYXJhdGlvbnMoKTsKLQkJCUhhc2h0YWJsZSBlbGVtUmVmcyA9IGR0ZEhhbmRsZXIuZ2V0RWxlbWVudFJlZmVyZW5jZXMoKTsKLQkJCXZhbGlkYXRlRWxlbWVudFJlZmVyZW5jZXMoZWxlbURlY2xzLCBlbGVtUmVmcywgdmFsaW5mbyk7Ci0JCX0KLQkJY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCi0JCX0KLQkJcmV0dXJuIHZhbGluZm87Ci0JfQotCi0JLyoqCi0JICogVmFsaWRhdGUgdGhlIGVsZW1lbnQgcmVmZXJlbmNlcyBpbiB0aGUgRFRELiBBbiBlbGVtZW50IHJlZmVyZW5jZSBpcwotCSAqIDwhRUxFTUVOVCBlbGVtIChlbGVtZW50UmVmZXJlbmNlKT4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbURlY2xzCi0JICogICAgICAgICAgICBBIGxpc3Qgb2YgdmFsaWQgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0JICogQHBhcmFtIGVsZW1SZWZzCi0JICogICAgICAgICAgICBBIGhhc2h0YWJsZSBjb250YWluaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyBhcyBrZXlzIGFuZAotCSAqICAgICAgICAgICAgbG9jYXRpb25zIGluIHRoZSBkb2N1bWVudCBhcyB2YWx1ZXMuCi0JICogQHBhcmFtIHZhbGluZm8KLQkgKiAgICAgICAgICAgIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIHN0b3JlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlRWxlbWVudFJlZmVyZW5jZXMoTGlzdCBlbGVtRGVjbHMsIEhhc2h0YWJsZSBlbGVtUmVmcywgVmFsaWRhdGlvbkluZm8gdmFsaW5mbykgewotCQlFbnVtZXJhdGlvbiBrZXlzID0gZWxlbVJlZnMua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIGVsZW1SZWYgPSAoU3RyaW5nKSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQkvLyBJZiB0aGUgZWxlbWVudCBoYXNuJ3QgYmVlbiBkZWNsYXJlZCBjcmVhdGUgYW4gZXJyb3IuCi0JCQlpZiAoIWVsZW1EZWNscy5jb250YWlucyhlbGVtUmVmKSkgewotCQkJCUVsZW1lbnRSZWZMb2NhdGlvbiBlbGVtTG9jID0gKEVsZW1lbnRSZWZMb2NhdGlvbikgZWxlbVJlZnMuZ2V0KGVsZW1SZWYpOwotCQkJCWRvIHsKLQkJCQkJdmFsaW5mby5hZGRFcnJvcihOTFMuYmluZChEVERWYWxpZGF0aW9uTWVzc2FnZXMuX0VSUk9SX1JFRl9FTEVNRU5UX1VOREVGSU5FRCwgIiciICsgZWxlbVJlZiArICInIiksIGVsZW1Mb2MuZ2V0TGluZSgpLCBlbGVtTG9jLmdldENvbHVtbigpLCBlbGVtTG9jLmdldFVSSSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWVsZW1Mb2MgPSBlbGVtTG9jLmdldE5leHQoKTsKLQkJCQl9Ci0JCQkJd2hpbGUgKGVsZW1Mb2MgIT0gbnVsbCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9FbGVtZW50UmVmTG9jYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTk4ZGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL0VsZW1lbnRSZWZMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEFuIGVsZW1lbnQgcmVmZXJlbmNlcyBsb2NhdGlvbiBob2xkcyB0aGUgbG9jYXRpb24gb2YgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gKiBBbiBlbGVtZW50IHJlZmVyZW5jZSBpcyBkZWNsYXJlZCBpbiBhIERURCBlbGVtZW50IGRlY2xhcmF0aW9uIHN1Y2ggYXMKLSAqIDwhRUxFTUVOVCBteWVsZW0gKGVsZW1lbnRyZWYpPiBBbiBlbGVtZW50IHJlZmVyZW5jZSBtYXkgYmUgcGFydCBvZiBhIGxpbmtlZAotICogbGlzdCBhbmQgY2FuIGNvbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIG5leHQgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIGxpc3QuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotY2xhc3MgRWxlbWVudFJlZkxvY2F0aW9uIHsKLQlwcml2YXRlIGludCBjb2x1bW4gPSAtMTsKLQotCXByaXZhdGUgaW50IGxpbmUgPSAtMTsKLQotCXByaXZhdGUgRWxlbWVudFJlZkxvY2F0aW9uIG5leHQgPSBudWxsOwotCi0JcHJpdmF0ZSBTdHJpbmcgdXJpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIGxpbmUKLQkgKiAgICAgICAgICAgIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gY29sdW1uCi0JICogICAgICAgICAgICBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKiBAcGFyYW0gdXJpCi0JICogICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIEBwYXJhbSBuZXh0Ci0JICogICAgICAgICAgICBUaGUgbmV4dCBlbGVtZW50IHJlZmVyZW5jZSBpbiB0aGUgbGlzdC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudFJlZkxvY2F0aW9uKGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBFbGVtZW50UmVmTG9jYXRpb24gbmV4dCkgewotCQl0aGlzLmxpbmUgPSBsaW5lOwotCQl0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLQkJdGhpcy51cmkgPSB1cmk7Ci0JCXRoaXMubmV4dCA9IG5leHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIGludCBnZXRDb2x1bW4oKSB7Ci0JCXJldHVybiBjb2x1bW47Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmUoKSB7Ci0JCXJldHVybiBsaW5lOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgbmV4dCBlbGVtZW50IHJlZmVyZW5jZSBpbiB0aGUgbGlua2VkIGxpc3QuCi0JICogCi0JICogQHJldHVybiBUaGUgbmV4dCBlbGVtZW50IHJlZmVyZW5jZSBpbiB0aGUgbGlua2VkIGxpc3QuCi0JICovCi0JcHVibGljIEVsZW1lbnRSZWZMb2NhdGlvbiBnZXROZXh0KCkgewotCQlyZXR1cm4gbmV4dDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBlbGVtZW50IHJlZmVyZW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgZWxlbWVudCByZWZlcmVuY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCXJldHVybiB1cmk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9EVERWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRFREVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNDRhNjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9EVERWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLS8qKgotICogQW4gRFREIHZhbGlkYXRvciBzcGVjaWZpYyB0byBFY2xpcHNlLiBUaGlzIHZhbGlkYXRvciB3aWxsIHdyYXAgdGhlIGludGVybmFsCi0gKiBEVEQgdmFsaWRhdG9yIHRvIHByb3ZpZGUgYXV0b21hdGljIFVSSSByZXNvbHV0aW9uIHN1cHBvcnQuCi0gKiBVc2luZyB0aGlzIGNsYXNzIGlzIGVxdWl2YWxlbnQgdG8gdXNpbmcgdGhlIGludGVybmFsIERURCB2YWxpZGF0b3IgYW5kIHJlZ2lzdGVyaW5nCi0gKiB0aGUgVVJJIHJlc29sdmVyIGZyb20gdGhlIFVSSSByZXNvbHV0aW9uIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIERURFZhbGlkYXRvciBleHRlbmRzCi0JCW9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLkRURFZhbGlkYXRvciAKLXsKLSAgcHJpdmF0ZSBzdGF0aWMgRFREVmFsaWRhdG9yIF9pbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuIFJlZ2lzdGVycyBVUkkgcmVzb2x1dGlvbiBmcmFtZXdvcmsgd2l0aCB0aGUgRFREIHZhbGlkYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBEVERWYWxpZGF0b3IoKQotICB7Ci0Jc3VwZXIoKTsKLQlzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgRWNsaXBzZSBzcGVjaWZpYyBEVEQgdmFsaWRhdG9yLgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIEVjbGlwc2Ugc3BlY2lmaWMgRFREIHZhbGlkYXRvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRFREVmFsaWRhdG9yIGdldEluc3RhbmNlKCkgCi0gIHsKLQlpZiAoX2luc3RhbmNlID09IG51bGwpIAotCXsKLQkgIF9pbnN0YW5jZSA9IG5ldyBEVERWYWxpZGF0b3IoKTsKLQl9Ci0JcmV0dXJuIF9pbnN0YW5jZTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IzOTQwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLQotLyoqCi0gKiBEVEQgdmFsaWRhdG9yIHRoYXQgaXMgY29udHJpYnV0ZWQgdG8gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IgCi17Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLQlEVERWYWxpZGF0b3IgdmFsaWRhdG9yID0gRFREVmFsaWRhdG9yLmdldEluc3RhbmNlKCk7Ci0KLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IG51bGw7Ci0JdmFscmVwb3J0ID0gdmFsaWRhdG9yLnZhbGlkYXRlKHVyaSk7Ci0JCi0JcmV0dXJuIHZhbHJlcG9ydDsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRkOWZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gYmFzZSBjbGFzcyBmb3IgYW4gRWxlbWVudCdzIGNvbnRlbnRtb2RlbAotcHVibGljIGNsYXNzIEF0dHJpYnV0ZSBleHRlbmRzIERURE5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEEgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVElFUyA9IERURENvcmVNZXNzYWdlcy5fVUlfRU5USVRZX05BTUVTX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVElUWV9OQU1FX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNRVJBVEVEX05BTUUgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTkFNRV9UT0tFTlNfREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVU1FUkFURURfTk9UQVRJT04gPSBEVERDb3JlTWVzc2FnZXMuX1VJX0VOVU1fTk9UQVRJT05fREVTQzsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZJWEVEID0gIiNGSVhFRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9IERURENvcmVNZXNzYWdlcy5fVUlfSURFTlRJRklFUl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0lEX1JFRkVSRU5DRV9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9JRF9SRUZFUkVOQ0VTX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNUExJRUQgPSAiI0lNUExJRUQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTiA9IERURENvcmVNZXNzYWdlcy5fVUlfTkFNRV9UT0tFTl9ERVNDOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlMgPSBEVERDb3JlTWVzc2FnZXMuX1VJX05BTUVfVE9LRU5TX0RFU0M7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRCA9ICIjUkVRVUlSRUQiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEhhc2h0YWJsZSB0eXBlSGFzaCA9IG5ldyBIYXNodGFibGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gdHlwZXMgPSB7Q0RBVEEsIElELCBJRFJFRiwgSURSRUZTLCBFTlRJVFksIEVOVElUSUVTLCBOTVRPS0VOLCBOTVRPS0VOUywgRU5VTUVSQVRFRF9OQU1FLCBFTlVNRVJBVEVEX05PVEFUSU9OfTsKLQotCXsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQsIENEQVRBKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQsIElEKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElEUkVGKTsKLQkJdHlwZUhhc2gucHV0KERURFJlZ2lvblR5cGVzLklEUkVGU19LRVlXT1JELCBJRFJFRlMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIEVOVElUWSk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVElFU19LRVlXT1JELCBFTlRJVElFUyk7Ci0JCXR5cGVIYXNoLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIE5NVE9LRU4pOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgTk1UT0tFTlMpOwotCQl0eXBlSGFzaC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCwgRU5VTUVSQVRFRF9OT1RBVElPTik7Ci0JCS8vIHRoaXMgb25lJ3MgYSBzcGVjaWFsIGNhc2Ugc2luY2UgdGhlcmUgaXMgbm8ga2V5d29yZCBmb3IKLQkJLy8gZW51bWVyYXRlZCBuYW1lIHRva2VucwotCQl0eXBlSGFzaC5wdXQoIigpIiwgRU5VTUVSQVRFRF9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG5vdyBwdXQgdGhlIHJldmVyc2UgaW4gcGxhY2UuIFRoaXMgZ2l2ZXMgdXMgYSAyIHdheSBsb29rdXAKLQkJLy8gZm9yIHdoZW4gd2Ugd2FudCB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYW5kIHdoZW4gd2Ugd2FudCB0byBzZXQgaXQKLQkJdHlwZUhhc2gucHV0KENEQVRBLCAiQ0RBVEEiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoSUQsICJJRCIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChJRFJFRiwgIklEUkVGIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KElEUkVGUywgIklEUkVGUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlRJVFksICJFTlRJVFkiKTsgLy8kTk9OLU5MUy0xJAotCQl0eXBlSGFzaC5wdXQoRU5USVRJRVMsICJFTlRJVElFUyIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChOTVRPS0VOLCAiTk1UT0tFTiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChOTVRPS0VOUywgIk5NVE9LRU5TIik7IC8vJE5PTi1OTFMtMSQKLQkJdHlwZUhhc2gucHV0KEVOVU1FUkFURURfTkFNRSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXR5cGVIYXNoLnB1dChFTlVNRVJBVEVEX05PVEFUSU9OLCAiTk9UQVRJT04iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBudWxsOwotCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRCA9ICJJTVBMSUVEIjsKLQotCXB1YmxpYyBBdHRyaWJ1dGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRLaW5kKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChkZWZhdWx0S2luZFJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVmYXVsdEtpbmRSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUkVRVUlSRURfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUVudW1MaXN0IGdldEVudW1MaXN0KCkgewotCQlyZXR1cm4gZW51bUxpc3Q7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFUVFJJQlVURUlDT04pOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5BVFRSSUJVVEVfTkFNRSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRRdW90ZWRMaXRlcmFsKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldE9mZnNldEFmdGVyVHlwZSgpIHsKLQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQotCQlTdHJpbmcgdHlwZSA9IGdldFR5cGUoKTsKLQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJaWYgKGlzRW51bWVyYXRpb24pIHsKLQkJCS8vIG5vdyBjaGVjayBpZiBtYXliZSB0aGlzIGlzIGFuIGVudW1lcmF0aW9uCi0JCQlpZiAoZ2V0RW51bUxpc3QoKSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGdldEVudW1MaXN0KCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHR5cGVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCh0eXBlUmVnaW9uKTsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pOwotCQkJLy8gLy8gY3JlYXRlIG9uZQotCQkJLy8gdHlwZVJlZ2lvbiA9Ci0JCQkvLyBmaW5kT3JDcmVhdGVUeXBlUmVnaW9uKChTdHJpbmcpdHlwZUhhc2guZ2V0KENEQVRBKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IChTdHJpbmcpIHR5cGVIYXNoLmdldChyZWdpb24uZ2V0VHlwZSgpKTsKLQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkvLyBqdXN0IHJldHVybiB0aGUgdGV4dCBvZiB0aGUgdHlwZSByZWdpb24gc2luY2UgdGhpcyBtYXkgYmUKLQkJCQkvLyBhbiBlbnRpdHkgcmVwcmVzZW50aW5nIHRoZSB0eXBlOwotCQkJCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCQllbHNlIGlmIChnZXRFbnVtTGlzdCgpICE9IG51bGwpIHsKLQkJCS8vIGVudW1lcmF0ZWQgbmFtZSB0b2tlbnMgZG9uJ3QgaGF2ZSBhIHR5cGUga2V5d29yZC4ganVzdAotCQkJLy8gdGhlIGV4aXN0ZW5jZSBvZiB0aGUgbGVmdCBwYXJlbiBpcyBlbm91Z2gKLQkJCXJldHVybiAoU3RyaW5nKSB0eXBlSGFzaC5nZXQoIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRUeXBlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCB8fCByZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLlBBUk1fRU5USVRZX1RZUEUpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlLmVxdWFscyhEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCkgfHwgdHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpKSB7Ci0JCQlTdHJpbmcgdGV4dCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygxLCB0ZXh0Lmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCXJlbW92ZUNoaWxkTm9kZXMoKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0KLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJZW51bUxpc3QgPSBuZXcgQXR0cmlidXRlRW51bUxpc3QoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQl9Ci0JCQlpZiAoZW51bUxpc3QgIT0gbnVsbCkgewotCQkJCWVudW1MaXN0LmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdEtpbmQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGtpbmQpIHsKLQotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCVN0cmluZyBvbGREZWZhdWx0S2luZCA9IGRlZmF1bHRLaW5kUmVnaW9uID09IG51bGwgPyAiIiA6IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoZGVmYXVsdEtpbmRSZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCWlmICgha2luZC5lcXVhbHMob2xkRGVmYXVsdEtpbmQpKSB7Ci0JCQlTdHJpbmcgbmV3VGV4dCA9IGtpbmQ7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQlpZiAoZGVmYXVsdEtpbmRSZWdpb24gIT0gbnVsbCkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoZGVmYXVsdEtpbmRSZWdpb24pOwotCQkJCWxlbmd0aCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChkZWZhdWx0S2luZFJlZ2lvbikgLSBzdGFydE9mZnNldDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0T2Zmc2V0QWZ0ZXJUeXBlKCk7Ci0JCQkJbmV3VGV4dCA9ICIgIiArIG5ld1RleHQ7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJSVRleHRSZWdpb24gZGVmYXVsdFZhbHVlID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0KLQkJCWlmIChraW5kLmVxdWFscyhBdHRyaWJ1dGUuRklYRUQpIHx8IGtpbmQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGRlZmF1bHRWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCS8vIHdlIGFyZSBjaGFuZ2luZyB0byBmaXhlZCBhbmQgd2VoYXZlIG5vIHF1b3RlZCByZWdpb24uCi0JCQkJCS8vIHB1dCBpbiBhbiBlbXB0eSB2YWx1ZQotCQkJCQluZXdUZXh0ICs9ICIgXCJcIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSkgLSBzdGFydE9mZnNldDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsIG5ld1RleHQpOwotCQkJLy8gZG8gc29tZXRoaW5nIGlmIHRoZXJlIGlzIG5vICJraW5kIiByZWdpb24KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRLaW5kKFN0cmluZyBraW5kKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX0tJTkQpOyAvLyROT04tTkxTLTEkCi0JCXNldERlZmF1bHRLaW5kKHRoaXMsIGtpbmQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiBmaXhlZCkgewotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0VmFsdWUgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJU3RyaW5nIHF1b3RlQ2hhciA9IHZhbHVlLmluZGV4T2YoIlwiIikgPT0gLTEgPyAiXCIiIDogIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQlpbnQgc3RhcnRPZmZzZXQgPSAwOwotCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBvbGRWYWx1ZSA9IGdldERlZmF1bHRWYWx1ZSgpOwotCQlib29sZWFuIG9sZEtpbmRJc0ZpeGVkID0gZ2V0RGVmYXVsdEtpbmQoKS5lcXVhbHMoQXR0cmlidXRlLkZJWEVEKTsKLQkJaWYgKG9sZFZhbHVlLmVxdWFscyh2YWx1ZSkgJiYgZml4ZWQgPT0gb2xkS2luZElzRml4ZWQpIHsKLQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgewotCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChkZWZhdWx0VmFsdWUpOwotCQkJZW5kT2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRWYWx1ZSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiBkZWZhdWx0S2luZFJlZ2lvbiA9IGdldERlZmF1bHRLaW5kUmVnaW9uKCk7Ci0JCWlmIChkZWZhdWx0S2luZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGVuZE9mZnNldCA9PSAwID8gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGRlZmF1bHRLaW5kUmVnaW9uKSA6IGVuZE9mZnNldDsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSBnZXRPZmZzZXRBZnRlclR5cGUoKTsKLQkJCQluZXdUZXh0ICs9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJSVRleHRSZWdpb24gdHlwZVJlZ2lvbiA9IGdldFR5cGVSZWdpb24oKTsKLQkJCWlmICh0eXBlUmVnaW9uID09IG51bGwgJiYgZ2V0RW51bUxpc3QoKSA9PSBudWxsKSB7Ci0JCQkJLy8gdGFjayBvbiBhIGRlZmF1bHQgdHlwZQotCQkJCS8vIG5ld1RleHQgKz0gIkNEQVRBICI7Ci0JCQl9Ci0JCX0KLQkJaWYgKGZpeGVkKSB7Ci0JCQluZXdUZXh0ICs9ICIjRklYRUQgIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldERlZmF1bHRLaW5kKCkuZXF1YWxzKCIiKSAmJiB2YWx1ZS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIGlmIG5vdCBmaXhlZCBhbmQgdmFsdWUgaXMgIiIgdGhlbiByZXNldCB0aGUgZGVmYXVsdCBraW5kIHRvCi0JCQkJLy8gaW1wbGllZAotCQkJCW5ld1RleHQgKz0gIiNJTVBMSUVEIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKCIiKSAmJiAhdmFsdWUuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1RleHQgKz0gcXVvdGVDaGFyICsgdmFsdWUgKyBxdW90ZUNoYXI7Ci0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZShTdHJpbmcgdmFsdWUsIGJvb2xlYW4gZml4ZWQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfVkFMKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZWZhdWx0VmFsdWUodGhpcywgdmFsdWUsIGZpeGVkKTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHR5cGUpIHsKLQkJU3RyaW5nIG9sZFR5cGUgPSBnZXRUeXBlKCk7Ci0JCWlmICghdHlwZS5lcXVhbHMob2xkVHlwZSkpIHsKLQkJCWJvb2xlYW4gd2FzRW51bWVyYXRpb24gPSBvbGRUeXBlLmVxdWFscyhFTlVNRVJBVEVEX05BTUUpIHx8IG9sZFR5cGUuZXF1YWxzKEVOVU1FUkFURURfTk9UQVRJT04pOwotCQkJYm9vbGVhbiBpc0VudW1lcmF0aW9uID0gdHlwZS5lcXVhbHMoRU5VTUVSQVRFRF9OQU1FKSB8fCB0eXBlLmVxdWFscyhFTlVNRVJBVEVEX05PVEFUSU9OKTsKLQkJCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gMDsKLQotCQkJaWYgKHdhc0VudW1lcmF0aW9uICYmICFpc0VudW1lcmF0aW9uKSB7Ci0JCQkJLy8gZ2V0IHJpZCBvZiB0aGUgb2xkIGVudW1saXN0Ci0JCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBnZXRFbnVtTGlzdCgpOwotCQkJCWlmIChlbnVtTGlzdCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZW51bUxpc3QuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJZW5kT2Zmc2V0ID0gZW51bUxpc3QuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJfQotCi0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRUeXBlUmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJaWYgKGVuZE9mZnNldCA9PSAwKSB7Ci0JCQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXJ0T2Zmc2V0ID09IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJCW5ld1RleHQgKz0gIiAiOyAvLyROT04tTkxTLTEkCi0JCQkJZW5kT2Zmc2V0ID0gc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQl9Ci0KLQkJCVN0cmluZyBuZXdUeXBlV29yZCA9IChTdHJpbmcpIHR5cGVIYXNoLmdldCh0eXBlKTsKLQkJCWlmIChuZXdUeXBlV29yZCA9PSBudWxsKSB7Ci0JCQkJLy8gdGhlbiB0aGlzIG11c3QgYmUgYSBwYXJtIGVudGl0eSBiZWluZyB1c2VkIGluIHRoZSB0eXBlCi0JCQkJLy8gdXNlIHRoZSB0eXBlIHRleHQgZGlyZWN0bHkKLQkJCQluZXdUeXBlV29yZCA9IHR5cGU7Ci0JCQl9Ci0KLQkJCW5ld1RleHQgKz0gbmV3VHlwZVdvcmQ7Ci0KLQkJCWlmIChpc0VudW1lcmF0aW9uICYmICF3YXNFbnVtZXJhdGlvbikgewotCQkJCS8vIHB1dCBpbiBhIG5ldyBudW1saXN0Ci0JCQkJYm9vbGVhbiBpc1NwYWNlTmVlZGVkID0gIXR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSk7Ci0JCQkJbmV3VGV4dCArPSBpc1NwYWNlTmVlZGVkID8gIiAiIDogIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCW5ld1RleHQgKz0gIigpIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQkJaWYgKG5ld1R5cGVXb3JkLmVxdWFscygiIikgJiYgIXR5cGUuZXF1YWxzKEVOVU1FUkFURURfTkFNRSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIHRoZSBzZXQgdGhlIGRlZmF1bHRraW5kIHRvICIiCi0JCQkJLy8gc2V0RGVmYXVsdEtpbmQocmVxdWVzdG9yLCAiIik7Ci0JCQkJc2V0RGVmYXVsdFZhbHVlKHJlcXVlc3RvciwgIiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9UWVBFKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUeXBlKHRoaXMsIHR5cGUpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9BdHRyaWJ1dGVFbnVtTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTBlMTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlRW51bUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUVudW1MaXN0IGV4dGVuZHMgRFRETm9kZSB7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIEF0dHJpYnV0ZUVudW1MaXN0KERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkvLyBuZXZlciBleHBvc2VkIGluIHRyZWUKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcmV0dXJuIHRoZSBpdGVtcyB0aGF0IGFyZSBpbiB0aGlzIGVudW1lcmF0ZWQgbGlzdAotCXB1YmxpYyBMaXN0IGdldEl0ZW1zKCkgewotCQlsaXN0LmNsZWFyKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWUgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLk5BTUUpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCkgewotCQkJCWxpc3QuYWRkKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQobmFtZSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEl0ZW1zKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdGV4dCA9ICIoIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChpID4gMCkgewotCQkJCQl0ZXh0ICs9ICIgfCAiICsgaXRlbXNbaV07IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXRleHQgKz0gaXRlbXNbaV07Ci0JCQkJfQotCQkJfQotCQkJdGV4dCArPSAiKSI7IC8vJE5PTi1OTFMtMSQKLQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0Tm9kZUxlbmd0aCgpLCB0ZXh0KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIGl0ZW1zKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9FTlVNX0lURU1TKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRJdGVtcyh0aGlzLCBpdGVtcyk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0F0dHJpYnV0ZUxpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTIyYjZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQXR0cmlidXRlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUxpc3QgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0JcHVibGljIEF0dHJpYnV0ZUxpc3QoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQVRUUl9MSVNUX0FERCk7IC8vJE5PTi1OTFMtMSQKLQotCQlEVEROb2RlIGxhc3RBdHRyaWJ1dGUgPSAoRFRETm9kZSkgZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChsYXN0QXR0cmlidXRlICE9IG51bGwpIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGxhc3RBdHRyaWJ1dGUuZ2V0RW5kT2Zmc2V0KCksIDAsICJcblx0IiArIG5hbWUgKyAiIENEQVRBICNJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbiksIDAsICJcblx0IiArIG5hbWUgKyAiIENEQVRBICNJTVBMSUVEIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCX0KLQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkFUVFJJQlVURUxJU1RJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRJbnRvTW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgQXR0cmlidXRlIHJlZmVyZW5jZSwgQXR0cmlidXRlIG5vZGUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbm9kZVRleHQgPSBub2RlLmdldEZ1bGxOb2RlVGV4dCgpOwotCQlpZiAoIWlzQWZ0ZXIpIHsKLQkJCW9mZnNldCA9IHJlZmVyZW5jZS5nZXRTdGFydE9mZnNldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdHJ5IGFuZCBnZXQgbmV4dCBjaGlsZAotCQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSByZWZlcmVuY2UuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlvZmZzZXQgPSBhdHRyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IHVzZSB0aGUgZW5kIG9mZnNldAotCQkJCW9mZnNldCA9IHJlZmVyZW5jZS5nZXRXaGl0ZXNwYWNlRW5kT2Zmc2V0KCk7Ci0JCQl9Ci0JCX0KLQkJbmV3VGV4dCArPSBub2RlVGV4dDsvLyArIChpc0xhc3RDaGlsZCA/ICJcbiIgOiAiXG5cdCIpOwotCQlpZiAoIW5vZGUuaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkpIHsKLQkJCW5ld1RleHQgKz0gIlxuXHQiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIDAsIG5ld1RleHQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc29sdmVSZWdpb25zKCkgewotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCWlmIChnZXROYW1lUmVnaW9uKCkgIT0gbnVsbCkgewotCQkJLy8gd2Ugc2tpcCBwYXN0IHRoZSBuYW1lIHRva2VuIGlzIG91ciBuYW1lCi0JCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCX0KLQotCQlBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBudWxsOwotCQlib29sZWFuIHRyYWlsaW5nV2hpdGVzcGFjZSA9IGZhbHNlOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQVRUUklCVVRFX05BTUUpKSB7Ci0JCQkJYXR0cmlidXRlID0gbmV3IEF0dHJpYnV0ZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQljaGlsZHJlbi5hZGQoYXR0cmlidXRlKTsKLQkJCQlhcHBlbmRDaGlsZChhdHRyaWJ1dGUpOwotCQkJCXRyYWlsaW5nV2hpdGVzcGFjZSA9IGZhbHNlOwotCQkJfQotCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsICYmIGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpICE9IERURFJlZ2lvblR5cGVzLkVORF9UQUcpIHsKLQkJCQlpZiAoIXRyYWlsaW5nV2hpdGVzcGFjZSkgewotCQkJCQlhdHRyaWJ1dGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpIHsKLQkJCQkJCWF0dHJpYnV0ZS5hZGRXaGl0ZXNwYWNlUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJLy8gdGhlIGZvbGxvd2luZyBwcmV2ZW50cyBleHRyYSB3aGl0ZXNwYWNlIGZyb20gYmVpbmcgcGlja2VkCi0JCQkJLy8gdXAgYnkgdGhlIGF0dHJpYnV0ZQotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEIHx8IGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCB8fCBjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkgewotCQkJCQl0cmFpbGluZ1doaXRlc3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpbnQgbnVtS2lkcyA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1LaWRzOyBpKyspIHsKLQkJCSgoQXR0cmlidXRlKSBjaGlsZHJlbi5nZXQoaSkpLnJlc29sdmVSZWdpb25zKCk7Ci0JCX0gLy8gZW5kIG9mIGZvciAoKQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01CYXNpY05vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01CYXNpY05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyN2YwMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNQmFzaWNOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qCi0gKiBDTUJhc2ljTm9kZSBjb21iaW5lcyBhbGwgdGhlIGRpZmZlcmVudCBjb250ZW50IHR5cGVzIGludG8gb25lLiBUaGUgaWRlYQotICogYmVoaW5kIHRoaXMgaXMgdG8gYWxsb3cgYXJiaXRyYXJ5IG5hbWUgY2hhbmdlcyB0byBub3QgcmVxdWlyZSBhIHRyZWUKLSAqIHVwZGF0ZS4KLSAqLwotcHVibGljIGNsYXNzIENNQmFzaWNOb2RlIGV4dGVuZHMgQ01SZXBlYXRhYmxlTm9kZSB7Ci0KLQkvLyBzdGF0aWMgZmluYWwgaW50IEVNUFRZID0gMDsKLQkvLyBzdGF0aWMgZmluYWwgaW50IEFOWSA9IDE7Ci0JLy8gc3RhdGljIGZpbmFsIGludCBQQ0RBVEEgPSAyOwotCi0JcHVibGljIENNQmFzaWNOb2RlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5QQ0RBVEFJQ09OKTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoRU1QVFkpKSB7Ci0JCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTVBUWUlDT04pOwotCQkJfQotCQkJZWxzZSBpZiAobmFtZS5lcXVhbHMoQU5ZKSkgewotCQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuQU5ZSUNPTik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBPdGhlcndpc2UgdGhpcyBpcyBqdXN0IGFuIGVsZW1lbnQgcmVmZXJlbmNlIG5vZGUuIEp1c3QgcmV0dXJuCi0JCS8vIHdoYXQgQ01SZXBlYXRhYmxlTm9kZSB3b3VsZCBnaXZlIHVzCi0JCXJldHVybiBzdXBlci5nZXRJbWFnZSgpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLk5BTUUgfHwgcmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXRva2VuLCBvciB0aGUgdG9rZW4gd2hlcmUgdGhlIG9jY3VycmVuY2UgdG9rZW4KLQkvLyBzaG91bGQgYXBwZWFyIGFmdGVyCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE9jY3VycmVuY2VSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZ2V0TmFtZVJlZ2lvbigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJSVRleHRSZWdpb24gcGNkYXRhID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7Ci0JCWlmIChwY2RhdGEgIT0gbnVsbCkgewotCQkJcmV0dXJuIFBDREFUQTsKLQkJfQotCi0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlmaW5hbCBTdHJpbmcgbmFtZSA9IGdldE5hbWUoKTsKLQkJCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSkgewotCQkJCQlyZXR1cm4gRU1QVFk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzKEFOWSkpIHsKLQkJCQkJcmV0dXJuIEFOWTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIG90aGVyd2lzZSBqdXN0IHJldHVybiBpdCdzIG5hbWUgYXMgdGhlIHR5cGUKLQkJCQkJcmV0dXJuIG5hbWU7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eUFueU9yUENEYXRhKCkgewotCQlpZiAoaXNQQ0RhdGEoKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKG5hbWUuZXF1YWxzKEVNUFRZKSB8fCBuYW1lLmVxdWFscyhBTlkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUENEYXRhKCkgewotCQlJVGV4dFJlZ2lvbiBwY2RhdGEgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKTsKLQkJaWYgKHBjZGF0YSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gcHVibGljIE5vZGUgaW5zZXJ0UmVnaW9uKFJlZ2lvbiB0b2tlbikKLQkvLyB7Ci0JLy8gaWYgKCF0b2tlblN0cmVhbS5jb250YWluc1Rva2VuKHRva2VuKSAmJiB0b2tlbi5nZXRUeXBlKCkgPT0KLQkvLyBUb2tlbi5PQ0NVUl9UWVBFKQotCS8vIHsKLQkvLyAvLyB0aGVuIGFkZCBpdCBzbyB0aGF0IG91ciByYW5nZSBjb250YWlucyBpdAotCS8vIGluc2VydEludG9Ub2tlblN0cmVhbSh0b2tlbik7Ci0JLy8gfQotCS8vIHJldHVybiB0aGlzOwotCS8vIH0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVmZXJlbmNlKCkgewotCQlyZXR1cm4gIWlzRW1wdHlBbnlPclBDRGF0YSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJLy8gYmVnaW5SZWNvcmRpbmcocmVxdWVzdG9yLCAiTmFtZSBDaGFuZ2UiKTsKLQotCQlzdXBlci5zZXROYW1lKHJlcXVlc3RvciwgbmFtZSk7Ci0JCWlmICghaXNSZWZlcmVuY2UoKSkgewotCQkJLy8gaWYgaXQgaXMgbm8gbG9uZ2VyIGEgcmVmZXJlbmNlIG5vZGUsIHJlbW92ZSB0aGUgb2NjdXJyZW5jZQotCQkJLy8gdG9rZW4KLQkJCXNldE9jY3VycmVuY2UocmVxdWVzdG9yLCBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpOwotCQl9Ci0KLQkJLy8gZW5kUmVjb3JkaW5nKHJlcXVlc3Rvcik7Ci0JfQotCi0JLyoKLQkgKiBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXROYW1lKGludCB0eXBlKSB7IHN3aXRjaCAodHlwZSkgeyBjYXNlIEVNUFRZOgotCSAqIHJldHVybiBlbXB0eVN0cmluZzsgY2FzZSBBTlk6IHJldHVybiBhbnlTdHJpbmc7IGNhc2UgUENEQVRBOiByZXR1cm4KLQkgKiBwY2RhdGFTdHJpbmc7IGRlZmF1bHQ6IGJyZWFrOyB9IC8vIGVuZCBvZiBzd2l0Y2ggKCkgcmV0dXJuICIiOyB9Ci0JICovCi0KLX0vLyBDTUJhc2ljTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTUdyb3VwTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTUxZmQ3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01Hcm91cE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFREVW5pcXVlTmFtZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDTUdyb3VwTm9kZSBleHRlbmRzIENNUmVwZWF0YWJsZU5vZGUgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIENIT0lDRSA9ICd8JzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgU0VRVUVOQ0UgPSAnLCc7Ci0KLQlwcm90ZWN0ZWQgY2hhciBjb25uZWN0b3IgPSBTRVFVRU5DRTsKLQotCS8vIHByb3RlY3RlZCBBcnJheUxpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwdWJsaWMgQ01Hcm91cE5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfQ0hJTEQpOyAvLyROT04tTkxTLTEkCi0JCURURE5vZGUgbGFzdE5vZGUgPSAoRFRETm9kZSkgZ2V0TGFzdENoaWxkKCk7Ci0JCVN0cmluZyBlbGVtZW50TmFtZSA9IERURFVuaXF1ZU5hbWVIZWxwZXIuZ2V0VW5pcXVlTmFtZShnZXRDaGlsZHJlbkxpc3QoKSwgIkNoaWxkTm9kZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBsYXN0Tm9kZS5nZXRFbmRPZmZzZXQoKSwgMCwgU3RyaW5nLnZhbHVlT2YoZ2V0Q29ubmVjdG9yKCkpICsgZWxlbWVudE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpICsgMSwgMCwgZWxlbWVudE5hbWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkR3JvdXAoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0dSUCk7IC8vJE5PTi1OTFMtMSQKLQkJRFRETm9kZSBsYXN0Tm9kZSA9IChEVEROb2RlKSBnZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGxhc3ROb2RlLmdldEVuZE9mZnNldCgpLCAwLCBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyAiICgpIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCkgKyAxLCAwLCAiKCkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIGNoaWxkKSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID09IDEgJiYgZ2V0Rmlyc3RDaGlsZCgpID09IGNoaWxkKSB7Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCksIGNoaWxkLmdldE5vZGVMZW5ndGgoKSwgbnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkrKykgewotCQkJRFRETm9kZSBjaGlsZEEgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQlEVEROb2RlIGNoaWxkQiA9IChEVEROb2RlKSBjaGlsZHJlbltpICsgMV07Ci0KLQkJCWJvb2xlYW4gY2hpbGRBRGVsZXRlZCA9IGNoaWxkQSA9PSBjaGlsZDsKLQkJCWJvb2xlYW4gY2hpbGRCRGVsZXRlZCA9IGNoaWxkQiA9PSBjaGlsZDsKLQkJCWlmIChjaGlsZEFEZWxldGVkIHx8IGNoaWxkQkRlbGV0ZWQpIHsKLQkJCQkvLyB3ZSBmb3VuZCB0aGUgY2hpbGQKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSBjaGlsZEFEZWxldGVkID8gY2hpbGRBLmdldFN0YXJ0T2Zmc2V0KCkgOiBjaGlsZEEuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJaW50IGVuZE9mZnNldCA9IGNoaWxkQURlbGV0ZWQgPyBjaGlsZEIuZ2V0U3RhcnRPZmZzZXQoKSA6IGNoaWxkQi5nZXRFbmRPZmZzZXQoKTsKLQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSB2YWx1ZSBvZiBjb25uZWN0b3IuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBjb25uZWN0b3IuCi0JICovCi0JcHVibGljIGNoYXIgZ2V0Q29ubmVjdG9yKCkgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQlEVEROb2RlIGNoaWxkQSA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCURURE5vZGUgY2hpbGRCID0gKERURE5vZGUpIGNoaWxkcmVuW2kgKyAxXTsKLQotCQkJLy8gY3JlYXRlIGEgc3RyZWFtIGJldHdlZW4gdGhlIHR3byBzaWJsaW5ncyBhbmQgd2FsayBpdAotCQkJLy8gbm90ZSB0aGF0IHRoaXMgc3RyZWFtIGluY2x1ZGVzIHRoZSBsYXN0IHJlZ2lvbiBvZiB0aGUgZmlyc3QKLQkJCS8vIHNpYmxpbmcgYW5kIHRoZSBmaXJzdCByZWdpb24gb2YgdGhlIG5leHQgc2libGluZy4KLQkJCS8vIGJvdGggdGhlc2Ugc2hvdWxkIGJlIGlnbm9yZWQKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBuZXcgUmVnaW9uSXRlcmF0b3IoZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCksIGNoaWxkQS5nZXRFbmRPZmZzZXQoKSwgY2hpbGRCLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJLy8gc3RyZWFtLnNldEZpcnN0UmVnaW9uKGNoaWxkQS5nZXRMYXN0UmVnaW9uKCkpOwotCQkJLy8gc3RyZWFtLnNldExhc3RSZWdpb24oY2hpbGRCLmdldEZpcnN0UmVnaW9uKCkpOwotCQkJLy8gSXRlcmF0b3IgaXRlciA9IHN0cmVhbS5pdGVyYXRvcigpOwotCQkJLy8gc2tpcCB0aGUgZmlyc3QgcmVnaW9uIHdoaWNoIGlzIHRoZSBsYXN0IHJlZ2lvbiBvZiBjaGlsZEEKLQkJCS8vIGRvIHdlIG5lZWQgdGhpcyBub3cgPwotCQkJLy8gaXRlci5uZXh0KCk7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gbnVsbDsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBjdXJyZW50UmVnaW9uICE9IGNoaWxkQi5nZXRTdGFydFJlZ2lvbigpKSB7Ci0JCQkJY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpIHsKLQkJCQkJY29ubmVjdG9yID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChjdXJyZW50UmVnaW9uKS5jaGFyQXQoMCk7Ci0JCQkJCXJldHVybiBjb25uZWN0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb25uZWN0b3I7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlEVERDb3JlUGx1Z2luIHJlc291cmNlUGx1Z2luID0gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpOwotCQlzd2l0Y2ggKGdldENvbm5lY3RvcigpKSB7Ci0JCQljYXNlIFNFUVVFTkNFIDoKLQkJCQlyZXR1cm4gcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FU0VRVUVOQ0VJQ09OKTsKLQkJCS8qCi0JCQkgKiBzd2l0Y2ggKGdldE9jY3VycmVuY2UoKSkgeyBjYXNlIE9OQ0UgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORVNFUVVFTkNFSUNPTik7IGNhc2UKLQkJCSAqIE9QVElPTkFMIDogcmV0dXJuCi0JCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PUFRJT05BTFNFUVVFTkNFSUNPTik7IGNhc2UKLQkJCSAqIE9ORV9PUl9NT1JFIDogcmV0dXJuCi0JCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVPUk1PUkVTRVFVRU5DRUlDT04pOwotCQkJICogY2FzZSBaRVJPX09SX01PUkUgOiByZXR1cm4KLQkJCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLlpFUk9PUk1PUkVTRVFVRU5DRUlDT04pOyB9Ci0JCQkgKi8KLQkJCWNhc2UgQ0hPSUNFIDoKLQkJCQlyZXR1cm4gcmVzb3VyY2VQbHVnaW4uZ2V0SW1hZ2UoRFREUmVzb3VyY2UuT05FQ0hPSUNFSUNPTik7Ci0JCS8qCi0JCSAqIHN3aXRjaCAoZ2V0T2NjdXJyZW5jZSgpKSB7IGNhc2UgT05DRSA6IHJldHVybgotCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PTkVDSE9JQ0VJQ09OKTsgY2FzZSBPUFRJT05BTCA6Ci0JCSAqIHJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5PUFRJT05BTENIT0lDRUlDT04pOwotCQkgKiBjYXNlIE9ORV9PUl9NT1JFIDogcmV0dXJuCi0JCSAqIHJlc291cmNlUGx1Z2luLmdldEltYWdlKERURFJlc291cmNlLk9ORU9STU9SRUNIT0lDRUlDT04pOyBjYXNlCi0JCSAqIFpFUk9fT1JfTU9SRSA6IHJldHVybgotCQkgKiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5aRVJPT1JNT1JFQ0hPSUNFSUNPTik7IH0KLQkJICovCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvLyByZXR1cm5zIHRoZSBvY2N1cnJlbmNlcmVnaW9uLCBvciB0aGUgbGFzdCByZWdpb24gd2hlcmUgdGhlIG9jY3VycmVuY2UKLQkvLyByZWdpb24gc2hvdWxkIGFwcGVhciBhZnRlcgotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRPY2N1cnJlbmNlUmVnaW9uKCkgewotCQlpbnQgbmVzdGluZyA9IDA7Ci0KLQkJLy8gd2Ugc2tpcCBwYXN0IHRoZSBmaXJzdCBsZWZ0IHBhcmVuIHdlIHNlZSBzaW5jZSB0aGF0IGlzIHRoZQotCQkvLyBiZWdpbm5pbmcgb2Ygb3VyIG93biBub2RlCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkvLyB3ZSBhc3N1bWUgdGhlIGZpcnN0IHJlZ2lvbiBpcyB0aGUgJygnCi0JCWl0ZXIubmV4dCgpOwotCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIG5lc3RpbmcgPj0gMCkgewotCQkJY3VycmVudFJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pIHsKLQkJCQluZXN0aW5nKys7Ci0JCQl9Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pIHsKLQkJCQluZXN0aW5nLS07Ci0JCQl9Ci0JCX0KLQkJaWYgKG5lc3RpbmcgPCAwKSB7Ci0JCQkvLyBUaGlzIG1lYW5zIHdlIGhhdmUgcGFzc2VkIG92ZXIgdGhlIHJpZ2h0IHBhcmVuIHRoYXQgbWFya3MgdGhlCi0JCQkvLyBlbmQgb2Ygb3VyIGdyb3VwaW5nLgotCQkJLy8gTG9vayBmb3IgYW4gb2NjdXJyZW5jZSByZWdpb24KLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCWN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkgewotCQkJCQlyZXR1cm4gY3VycmVudFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UncmUgaGVyZSwgdGhpcyBtZWFucyB0aGF0IHRoZXJlIGlzIG5vIG9jY3VyIHJlZ2lvbi4gcmV0dXJuIHRoZQotCQkvLyBsYXN0IHJlZ2lvbgotCQlyZXR1cm4gaXRlci5wcmV2aW91cygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJaWYgKGlzUm9vdEVsZW1lbnRDb250ZW50KCkpIHsKLQkJCWlmIChnZXRGaXJzdENoaWxkKCkgIT0gbnVsbCkgewotCQkJCUNNTm9kZSBub2RlID0gKENNTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChub2RlLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQlyZXR1cm4gTUlYRUQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gQ0hJTERSRU47Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydENoaWxkTm9kZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbm9kZVRleHQsIGludCBwb3NpdGlvbikgewotCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0KLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJU3RyaW5nIG5ld1RleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAocG9zaXRpb24gPCBjaGlsZHJlbi5sZW5ndGgpIHsKLQkJCURURE5vZGUgcmVmZXJlbmNlID0gKERURE5vZGUpIGNoaWxkcmVuW3Bvc2l0aW9uXTsKLQkJCXN0YXJ0T2Zmc2V0ID0gcmVmZXJlbmNlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQluZXdUZXh0ID0gbm9kZVRleHQgKyAiICIgKyBTdHJpbmcudmFsdWVPZihnZXRDb25uZWN0b3IoKSkgKyAiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgaWYgKHBvc2l0aW9uID09IGNoaWxkcmVuLmxlbmd0aCkgewotCQkJLy8gYWRkIHRvIGVuZAotCQkJRFRETm9kZSByZWZlcmVuY2UgPSAoRFRETm9kZSkgY2hpbGRyZW5bcG9zaXRpb24gLSAxXTsKLQkJCXN0YXJ0T2Zmc2V0ID0gcmVmZXJlbmNlLmdldEVuZE9mZnNldCgpOwotCQkJbmV3VGV4dCA9ICIgIiArIFN0cmluZy52YWx1ZU9mKGdldENvbm5lY3RvcigpKSArICIgIiArIG5vZGVUZXh0OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCAwLCBuZXdUZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRDaGlsZE5vZGUoU3RyaW5nIG5vZGVUZXh0LCBpbnQgcG9zaXRpb24pIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9JTlNFUlRfRUxFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJaW5zZXJ0Q2hpbGROb2RlKHRoaXMsIG5vZGVUZXh0LCBwb3NpdGlvbik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnNlcnRJbnRvTW9kZWwoT2JqZWN0IHJlcXVlc3RvciwgQ01Ob2RlIHJlZmVyZW5jZSwgQ01Ob2RlIG5vZGUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlTdHJpbmcgbm9kZVRleHQgPSBub2RlLmdldE5vZGVUZXh0KCk7Ci0JCUxpc3QgY2hpbGRyZW4gPSBnZXRDaGlsZHJlbkxpc3QoKTsKLQotCQlpbnQgaW5kZXggPSBjaGlsZHJlbi5pbmRleE9mKHJlZmVyZW5jZSk7Ci0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJLy8gbm8gcmVmZXJlbmNlIG5vZGUsIGFkZCBpdCB0byB0aGUgZW5kPz8KLQkJCWluZGV4ID0gY2hpbGRyZW4uc2l6ZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZ290IGFuIGluZGV4LiBpZiB3ZSB3YW50IHRvIGFkZCBhZnRlciwgaW5jcmVhc2UgYnkgMQotCQkJaW5kZXggPSBpc0FmdGVyID8gaW5kZXggKyAxIDogaW5kZXg7Ci0JCX0KLQkJaW5zZXJ0Q2hpbGROb2RlKHJlcXVlc3Rvciwgbm9kZVRleHQsIGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNvbHZlUmVnaW9ucygpIHsKLQkJaW50IG5lc3RpbmcgPSAwOwotCQkvLyBjaGlsZHJlbi5jbGVhcigpOwotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCURURE5vZGUgY3VycmVudEdyb3VwTm9kZSA9IG51bGw7Ci0JCUNNQmFzaWNOb2RlIGN1cnJlbnRSZWZlcmVuY2VOb2RlID0gbnVsbDsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHdlIGFzc3VtZSB0aGUgZmlyc3QgcmVnaW9uIGlzIHRoZSAnKCcKLQkJaXRlci5uZXh0KCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSAmJiBuZXN0aW5nID49IDApIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChuZXN0aW5nID09IDApIHsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSkgewotCQkJCQljdXJyZW50R3JvdXBOb2RlID0gY3VycmVudFJlZmVyZW5jZU5vZGUgPSBudWxsOwotCQkJCQlEVEROb2RlIHBjRGF0YSA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQkJcGNEYXRhLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJYXBwZW5kQ2hpbGQocGNEYXRhKTsKLQkJCQkJLy8gY2hpbGRyZW4uYWRkKHBjRGF0YSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OQU1FKSkgewotCQkJCQkvLyB3ZSBoYXZlIGhpdCBhIG5ldyByZWZlcmVuY2Ugbm9kZS4gTWFrZSBzdXJlIHdlIHJlc2V0Ci0JCQkJCS8vIHRoZSBncm91cG5vZGUgdmFyIHNvIGl0IGRvZXNuJ3QgY29sbGVjdCBtb3JlIHJlZ2lvbnMKLQkJCQkJY3VycmVudEdyb3VwTm9kZSA9IG51bGw7Ci0JCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlID0gbmV3IENNQmFzaWNOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCQljdXJyZW50UmVmZXJlbmNlTm9kZS5hZGRSZWdpb24oY3VycmVudFJlZ2lvbik7Ci0JCQkJCWFwcGVuZENoaWxkKGN1cnJlbnRSZWZlcmVuY2VOb2RlKTsKLQkJCQkJLy8gY2hpbGRyZW4uYWRkKGN1cnJlbnRSZWZlcmVuY2VOb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpKSB7Ci0JCQkJCS8vIHdlIGNvdWxkIHBvdGVudGlhbGx5IGZsYWcgYW4gZXJyb3IgaGVyZSBpZiB3ZSBoaXQgYW4KLQkJCQkJLy8gb2NjdXJyZW5jZSB0eXBlIGFuZCBjdXJyZW50UmVmTm9kZSBhbmQgY3VycmVudEdyb3VwTm9kZQotCQkJCQkvLyBhcmUgbnVsbAotCQkJCQlpZiAoY3VycmVudFJlZmVyZW5jZU5vZGUgIT0gbnVsbCkgewotCQkJCQkJLy8gY3VycmVudFJlZmVyZW5jZU5vZGUuc2V0T2NjdXJyZW5jZShjdXJyZW50UmVnaW9uLmdldFRleHQoKS50b0NoYXJBcnJheSgpWzBdKTsKLQkJCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlLmFkZFJlZ2lvbihjdXJyZW50UmVnaW9uKTsKLQkJCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlID0gbnVsbDsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SKSkgewotCQkJCQkvLyBub3RlIHRoYXQgaWYgY29ubmVjdG9yIGlzIGFscmVhZHkgc2V0IGFuZCBpdCBpcwotCQkJCQkvLyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBjb25uZWN0b3IgcmVnaW9uLCB0aGVuIHdlCi0JCQkJCS8vIGhhdmUgYW4gZXJyb3IhCi0JCQkJCS8vIHNldENvbm5lY3RvcihjdXJyZW50UmVnaW9uLmdldFRleHQoKS50b0NoYXJBcnJheSgpWzBdKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkxFRlRfUEFSRU4pKSB7Ci0JCQkJCWlmIChjdXJyZW50R3JvdXBOb2RlID09IG51bGwpIHsKLQkJCQkJCS8vIHdlIGhhdmUgaGl0IGEgbmV3IGdyb3VwLiBNYWtlIHN1cmUgd2UgcmVzZXQgdGhlCi0JCQkJCQkvLyByZWZlcmVuY2Vub2RlIHZhciBzbyBpdCBkb2Vzbid0IGNvbGxlY3QgYW55IG1vcmUKLQkJCQkJCS8vIHJlZ2lvbnMKLQkJCQkJCWN1cnJlbnRSZWZlcmVuY2VOb2RlID0gbnVsbDsKLQkJCQkJCWN1cnJlbnRHcm91cE5vZGUgPSBuZXcgQ01Hcm91cE5vZGUoZ2V0RFRERmlsZSgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJCQlhcHBlbmRDaGlsZChjdXJyZW50R3JvdXBOb2RlKTsKLQkJCQkJCS8vIGNoaWxkcmVuLmFkZChjdXJyZW50R3JvdXBOb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKSkgewotCQkJCW5lc3RpbmcrKzsKLQkJCX0KLQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pKSB7Ci0JCQkJbmVzdGluZy0tOwotCQkJCWlmIChuZXN0aW5nID09IDAgJiYgY3VycmVudEdyb3VwTm9kZSAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRHcm91cE5vZGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCQkvLyBwZWVrIGF0IG5leHQgcmVnaW9uIHRvIHNlZSBpZiBpdCBpcyBhbiBvY2N1ciByZWdpb24uIGlmCi0JCQkJCS8vIHNvLCBhZGQgaXQgdG8gdGhlIGdyb3Vwbm9kZQotCQkJCQlpZiAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQkJCWlmIChuZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSkpIHsKLQkJCQkJCQljdXJyZW50R3JvdXBOb2RlLmFkZFJlZ2lvbihuZXh0UmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIE90aGVyd2lzZSwgcHVzaCBpdCBiYWNrIGFzIHRoZSBuZXh0IGl0ZW0gdG8gYmUKLQkJCQkJCQkvLyByZXRyaWV2ZWQgYnkgYSBmdXR1cmUgbmV4dCgpIGNhbGwKLQkJCQkJCQlpdGVyLnByZXZpb3VzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudEdyb3VwTm9kZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGN1cnJlbnRHcm91cE5vZGUgIT0gbnVsbCkgewotCQkJCWN1cnJlbnRHcm91cE5vZGUuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5lc3RpbmcgPCAwKSB7Ci0JCQkvLyBUaGlzIG1lYW5zIHdlIGhhdmUgcGFzc2VkIG92ZXIgdGhlIHJpZ2h0IHBhcmVuIHRoYXQgbWFya3MgdGhlCi0JCQkvLyBlbmQgb2Ygb3VyIGdyb3VwaW5nLgotCQkJLy8gTG9vayBmb3IgYW4gb2NjdXJyZW5jZSByZWdpb24KLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpKSB7Ci0JCQkJCS8vIHNldE9jY3VycmVuY2UoY3VycmVudFJlZ2lvbi5nZXRUZXh0KCkudG9DaGFyQXJyYXkoKVswXSk7Ci0JCQkJfQotCQkJfSAvLyBlbmQgb2Ygd2hpbGUgKCkKLQkJfQotCi0JCS8vIGZvciAob3JnLnczYy5kb20uTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQKLQkJLy8gPSBjaGlsZC5nZXROZXh0U2libGluZygpKQotCQkvLyB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY2hpbGQgZm91bmQgPSAiICsgY2hpbGQpOwotCQkvLyB9Ci0KLQkJT2JqZWN0W10gY2hpbGRyZW4gPSBnZXRDaGlsZHJlbigpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImNoaWxkcmVuIGxlZ250aCA9ICIgKyBjaGlsZHJlbi5sZW5ndGgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgY2hpbGRyZW5baV07Ci0JCQljdXJyZW50Tm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBjb25uZWN0b3IuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBjb25uZWN0b3IuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29ubmVjdG9yKGNoYXIgdikgewotCQlpZiAoY29ubmVjdG9yICE9IHYpIHsKLQkJCWNvbm5lY3RvciA9IHY7Ci0JCQkvLyB3YWxrIHRocm91Z2ggb3VyIGtpZHMgYW5kIHNlZSBpZiB0aGVyZSBpcyBhIGNvbm5lY3RvciBiZXR3ZWVuCi0JCQkvLyBlYWNoIHNpYmxpbmcuIGlmIG5vdCwgY3JlYXRlIG9uZSBhbmQgc2V0IHRoZSBjb25uZWN0b3IuIGlmCi0JCQkvLyB0aGVyZSBpcwotCQkJLy8gdGhlbiBqdXN0IGNoYW5nZSB0aGUgdGV4dCBvZiB0aGUgY29ubmVjdG9yCi0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQlpZiAoY2hpbGRyZW4ubGVuZ3RoIDw9IDEpIHsKLQkJCQkvLyB0aGVyZSB3b24ndCBiZSBhbnkgY29ubmVjdG9yIGV4aXN0aW5nIGJldHdlZW4gdGhlIGNoaWxkcmVuCi0JCQkJLy8ganVzdCBub3RpZnkgYSBjaGFuZ2UgaW4gdGhlIG5vZGUgYW5kIHJldHVybjsKLQkJCQlnZXREVERGaWxlKCkubm90aWZ5Tm9kZUNoYW5nZWQodGhpcyk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9HUlBfTk9ERV9DT05ORUNUT1IpOyAvLyROT04tTkxTLTEkCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkrKykgewotCQkJCURURE5vZGUgY2hpbGRBID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJCURURE5vZGUgY2hpbGRCID0gKERURE5vZGUpIGNoaWxkcmVuW2kgKyAxXTsKLQotCQkJCS8vIGNyZWF0ZSBhIHN0cmVhbSBiZXR3ZWVuIHRoZSB0d28gc2libGluZ3MgYW5kIHdhbGsgaXQKLQkJCQkvLyBub3RlIHRoYXQgdGhpcyBzdHJlYW0gaW5jbHVkZXMgdGhlIGxhc3QgcmVnaW9uIG9mIHRoZSBmaXJzdAotCQkJCS8vIHNpYmxpbmcgYW5kIHRoZSBmaXJzdCByZWdpb24gb2YgdGhlIG5leHQgc2libGluZy4KLQkJCQkvLyBib3RoIHRoZXNlIHNob3VsZCBiZSBpZ25vcmVkCi0JCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcihnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSwgY2hpbGRBLmdldEVuZE9mZnNldCgpLCBjaGlsZEIuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJLy8gc2tpcCB0aGUgZmlyc3QgcmVnaW9uIHdoaWNoIGlzIHRoZSBsYXN0IHJlZ2lvbiBvZiBjaGlsZEEKLQotCQkJCS8vIGRvIHdlIHN0aWxsIG5lZWQgdGhpcwotCQkJCS8vIGl0ZXIubmV4dCgpOwotCQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBudWxsOwotCQkJCWJvb2xlYW4gZm91bmRDb25uZWN0b3IgPSBmYWxzZTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkgJiYgY3VycmVudFJlZ2lvbiAhPSBjaGlsZEIuZ2V0U3RhcnRSZWdpb24oKSkgewotCQkJCQljdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpIHsKLQkJCQkJCWZvdW5kQ29ubmVjdG9yID0gdHJ1ZTsKLQkJCQkJCS8vIFJlZ2lvbiBvbGRSZWdpb24gPSBjdXJyZW50UmVnaW9uLmNyZWF0ZUNvcHkoKTsKLQkJCQkJCS8vIGZvdW5kIGEgY29ubmVjdG9yISBvbiB0byB0aGUgbmV4dCBzaWJsaW5nIHBhaXIKLQkJCQkJCS8vIGN1cnJlbnRSZWdpb24udXBkYXRlVGV4dChTdHJpbmcudmFsdWVPZih2KSk7Ci0JCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgMSwgU3RyaW5nLnZhbHVlT2YoY29ubmVjdG9yKSk7Ci0JCQkJCQkvLyBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnQob2xkUmVnaW9uLCBjdXJyZW50UmVnaW9uKTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFmb3VuZENvbm5lY3RvcikgewotCQkJCQkvLyBpZiB3ZSdyZSBoZXJlLCB0aGF0IG1lYW5zIHdlIG5lZWQgdG8gaW5zZXJ0IGEgbmV3Ci0JCQkJCS8vIGNvbm5lY3RvciByZWdpb24gYWZ0ZXIgY2hpbGRBCi0JCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGNoaWxkQS5nZXRFbmRPZmZzZXQoKSwgMCwgU3RyaW5nLnZhbHVlT2YoY29ubmVjdG9yKSk7Ci0JCQkJCS8vIERURFJlZ2lvbiBjb25uZWN0b3JSZWdpb24gPSBuZXcKLQkJCQkJLy8gRFREUmVnaW9uKERURFJlZ2lvblR5cGVzLkNPTk5FQ1RPUiwKLQkJCQkJLy8gY2hpbGRBLmdldEVuZE9mZnNldCgpLCAxKTsKLQkJCQkJLy8gaW5zZXJ0SW50b1N0cnVjdHVyZWREb2N1bWVudChjb25uZWN0b3JSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCS8vIHB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbigpCi0JLy8gewotCS8vIHJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JLy8gfQotfS8vIENNR3JvdXBOb2RlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9DTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM5M2M1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotLy8gYmFzZSBjbGFzcyBmb3IgYW4gRWxlbWVudCdzIGNvbnRlbnRtb2RlbAotcHVibGljIGFic3RyYWN0IGNsYXNzIENNTm9kZSBleHRlbmRzIERURE5vZGUgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9BTlk7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSElMRFJFTiA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9DSElMRF9DT05URU5UOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9FTVBUWTsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1JWEVEID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX01JWF9DT05URU5UOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENEQVRBID0gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX1BDREFUQTsgLy8kTk9OLU5MUy0xJAotCi0KLQlib29sZWFuIHJvb3RFbGVtZW50Q29udGVudDsKLQotCXB1YmxpYyBDTU5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQkvLyB0aGlzIGlzIG9ubHkgdmFsaWQgdG8gYXNrIGlmIHRoZSBjb250ZW50IGlzIGEgcm9vdCBlbGVtZW50IGNvbnRlbnQKLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygcm9vdEVsZW1lbnRDb250ZW50LiBUaGlzIHRlbGxzIHVzIHdoZXRoZXIgdGhpcyBlbGVtZW50Ci0JICogY29udGVudCdzIHBhcmVudCBpcyBhIGRpcmVjdCBkZWNlbmRlbnQgb2YgdGhlIGNvbnRhaW5pbmcgZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygcm9vdEVsZW1lbnRDb250ZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUm9vdEVsZW1lbnRDb250ZW50KCkgewotCQlyZXR1cm4gcm9vdEVsZW1lbnRDb250ZW50OwotCX0KLQotCS8vIGlmIHRoaXMgaXMgYSByb290IGVsZW1lbnQsIGNoYW5nZSB0aGUgY29udGVudCB0byBjaGlsZHJlbgotCS8vIGllIC4gKGNoaWxkMSkKLQlwdWJsaWMgdm9pZCBzZXRDaGlsZHJlbkNvbnRlbnQoU3RyaW5nIG5ld0NoaWxkKSB7Ci0JCWlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKSB7Ci0JCQlpZiAoIW5ld0NoaWxkLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIoIiArIG5ld0NoaWxkICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKENISUxEUkVOKSkgewotCQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVRfQ0hJTERfQ09OVEVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAodGhpcyBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCksIGdldE5vZGVMZW5ndGgoKSwgIihuZXdDaGlsZCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm93IG11c3QgY29udmVydCBmcm9tIG1peGVkIGNvbnRlbnQgdG8gdGhpcyBvbmUuIG11c3QKLQkJCQkJLy8gcHJlc2VydmUgdGhlIHJlbWFpbmluZyBjaGlsZHJlbgotCQkJCQlDTUdyb3VwTm9kZSBncm91cCA9IChDTUdyb3VwTm9kZSkgdGhpczsKLQkJCQkJQ01Ob2RlIGZpcnN0Q2hpbGQgPSAoQ01Ob2RlKSBncm91cC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCWlmIChmaXJzdENoaWxkLmdldFR5cGUoKS5lcXVhbHMoUENEQVRBKSkgewotCQkJCQkJZ3JvdXAuZGVsZXRlKGZpcnN0Q2hpbGQpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9OT0RFX1NFVCArICIgIiArIGNvbnRlbnQgKyAiICIgKyBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0NNX05PREVfQ09OVEVOVCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0YXJ0T2Zmc2V0KCksIGdldE5vZGVMZW5ndGgoKSwgY29udGVudCk7Ci0JCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvLyBpZiB0aGlzIGlzIGEgcm9vdCBlbGVtZW50LCBjaGFuZ2UgdGhlIGNvbnRlbnQgdG8gbWl4ZWQKLQkvLyBpZSAuICgjUENEQVRBLCBjaGlsZDEpCi0JcHVibGljIHZvaWQgc2V0TWl4ZWRDb250ZW50KCkgewotCQlpZiAoaXNSb290RWxlbWVudENvbnRlbnQoKSkgewotCQkJaWYgKCFnZXRUeXBlKCkuZXF1YWxzKE1JWEVEKSkgewotCQkJCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfQ01fTk9ERV9TRVRfTUlYX0NPTlRFTlQpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHRoaXMgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBnZXRTdGFydE9mZnNldCgpLCBnZXROb2RlTGVuZ3RoKCksICIoI1BDREFUQSB8IG5ld0NoaWxkKSoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm93IG11c3QgY29udmVydCBmcm9tIGNoaWxkcmVuIGNvbnRlbnQgdG8gdGhpcyBvbmUuCi0JCQkJCS8vIG11c3QKLQkJCQkJLy8gcHJlc2VydmUgdGhlIGNoaWxkcmVuCi0JCQkJCUNNR3JvdXBOb2RlIGdyb3VwID0gKENNR3JvdXBOb2RlKSB0aGlzOwotCQkJCQlncm91cC5zZXRDb25uZWN0b3IoQ01Hcm91cE5vZGUuQ0hPSUNFKTsKLQkJCQkJZ3JvdXAuc2V0T2NjdXJyZW5jZShDTVJlcGVhdGFibGVOb2RlLlpFUk9fT1JfTU9SRSk7Ci0JCQkJCUNNTm9kZSBmaXJzdENoaWxkID0gKENNTm9kZSkgZ3JvdXAuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAoIWZpcnN0Q2hpbGQuZ2V0VHlwZSgpLmVxdWFscyhQQ0RBVEEpKSB7Ci0JCQkJCQlncm91cC5pbnNlcnRDaGlsZE5vZGUoIiNQQ0RBVEEiLCAwKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygcm9vdEVsZW1lbnRDb250ZW50LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gcm9vdEVsZW1lbnRDb250ZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJvb3RFbGVtZW50Q29udGVudChib29sZWFuIHYpIHsKLQkJdGhpcy5yb290RWxlbWVudENvbnRlbnQgPSB2OwotCX0KLQotCS8vIHB1YmxpYyB2b2lkIGRlbGV0ZSgpCi0JLy8gewotCS8vIGlmIChpc1Jvb3RFbGVtZW50Q29udGVudCgpKQotCS8vIHsKLQkvLyAvLyB0aGVuIHRoZSBzdXBlcmNsYXNzZXMgZGVsZXRlIHdpbGwgYmUgZmluZQotCS8vIHN1cGVyLmRlbGV0ZSgpOwotCS8vIHJldHVybjsKLQkvLyB9Ci0KLQkvLyBDTUdyb3VwTm9kZSBwYXJlbnQgPSAoQ01Hcm91cE5vZGUpIGdldFBhcmVudE5vZGUoKTsKLQkvLyBwYXJlbnQucmVtb3ZlQ2hpbGROb2RlKHRoaXMpOwotCS8vIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NNUmVwZWF0YWJsZU5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01SZXBlYXRhYmxlTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWNlMTEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvQ01SZXBlYXRhYmxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTVJlcGVhdGFibGVOb2RlIGV4dGVuZHMgQ01Ob2RlIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPTkNFID0gJzEnOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgY2hhciBPTkVfT1JfTU9SRSA9ICcrJzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGNoYXIgT1BUSU9OQUwgPSAnPyc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBjaGFyIFpFUk9fT1JfTU9SRSA9ICcqJzsKLQotCi0JcHVibGljIENNUmVwZWF0YWJsZU5vZGUoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCURURENvcmVQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCk7Ci0JCXJldHVybiByZXNvdXJjZVBsdWdpbi5nZXRJbWFnZShEVERSZXNvdXJjZS5FTEVNRU5UUkVGSUNPTik7Ci0JfQotCi0JcHVibGljIGNoYXIgZ2V0T2NjdXJyZW5jZSgpIHsKLQkJSVRleHRSZWdpb24gb2NjdXJSZWdpb24gPSBnZXRPY2N1cnJlbmNlUmVnaW9uKCk7Ci0JCWlmIChvY2N1clJlZ2lvbiAhPSBudWxsICYmIG9jY3VyUmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChvY2N1clJlZ2lvbikuY2hhckF0KDApOwotCQl9Ci0JCXJldHVybiBDTVJlcGVhdGFibGVOb2RlLk9OQ0U7Ci0JfQotCi0JLy8gcmV0dXJucyB0aGUgb2NjdXJyZW5jZXJlZ2lvbiwgb3IgdGhlIGxhc3QgcmVnaW9uIHdoZXJlIHRoZSBvY2N1cnJlbmNlCi0JLy8gcmVnaW9uIHNob3VsZCBhcHBlYXIgYWZ0ZXIKLQlhYnN0cmFjdCBwdWJsaWMgSVRleHRSZWdpb24gZ2V0T2NjdXJyZW5jZVJlZ2lvbigpOwotCi0JcHVibGljIHZvaWQgc2V0T2NjdXJyZW5jZShjaGFyIG9jY3VycmVuY2UpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DTV9SRVBfTk9ERV9DSEdfT0NDVVIpOyAvLyROT04tTkxTLTEkCi0JCXNldE9jY3VycmVuY2UodGhpcywgb2NjdXJyZW5jZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRPY2N1cnJlbmNlKE9iamVjdCByZXF1ZXN0b3IsIGNoYXIgb2NjdXJyZW5jZSkgewotCQlpZiAoZ2V0T2NjdXJyZW5jZSgpICE9IG9jY3VycmVuY2UpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE9jY3VycmVuY2VSZWdpb24oKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSkgewotCQkJCQlpZiAob2NjdXJyZW5jZSA9PSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJCS8vIHdlIG5lZWQgdG8gcmVtb3ZlIHRoZSBvY2N1ciByZWdpb24gZnJvbSB0aGUgZmxhdAotCQkJCQkJLy8gbW9kZWw7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIFJlZ2lvbiBvbGRPY2N1ciA9IHJlZ2lvbi5jcmVhdGVDb3B5KCk7Ci0JCQkJCQlnZXREVERGaWxlKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZWdpb24pLCAxLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJCQkvLyBjaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnQob2xkT2NjdXIsIHJlZ2lvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2NjdXJyZW5jZSAhPSBDTVJlcGVhdGFibGVOb2RlLk9OQ0UpIHsKLQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKGdldFN0cmluZygpKTsKLQkJCQkJLy8gd2UgbmVlZCB0byBjcmVhdGUgYW4gb2NjdXJyZW5jZVJlZ2lvbgotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChyZWdpb24pLCAwLCBTdHJpbmcudmFsdWVPZihvY2N1cnJlbmNlKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi19Ly8gQ01SZXBlYXRhYmxlTm9kZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Db21tZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1ZmY1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0NvbW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWVudCBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCXB1YmxpYyBjbGFzcyBTdGFydEVuZFBhaXIgewotCQlwdWJsaWMgaW50IHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQ7Ci0JfQotCi0JcHVibGljIENvbW1lbnQoRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuQ09NTUVOVElDT04pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRUZXh0KCk7Ci0JCWlmICh0ZXh0Lmxlbmd0aCgpIDw9IDMwKSB7Ci0JCQlyZXR1cm4gdGV4dDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0ZXh0LnN1YnN0cmluZygwLCAyOSkgKyAiLi4uIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChTdGFydEVuZFBhaXIgcGFpcikgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJSVRleHRSZWdpb24gY29tbWVudFN0YXJ0VGFnID0gZ2V0U3RhcnRUYWcoaXRlcik7Ci0JCUlUZXh0UmVnaW9uIGVuZENvbW1lbnRUYWcgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKTsKLQkJcGFpci5lbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKGNvbW1lbnRTdGFydFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLnN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGNvbW1lbnRTdGFydFRhZyk7Ci0JCX0KLQkJaWYgKGVuZENvbW1lbnRUYWcgIT0gbnVsbCkgewotCQkJcGFpci5lbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChlbmRDb21tZW50VGFnKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCWludCBmbGF0Tm9kZVN0YXJ0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHBhaXIuc3RhcnRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0LCBwYWlyLmVuZE9mZnNldCAtIGZsYXROb2RlU3RhcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIG5ld1RleHQpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9DT01NRU5UX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmVwbGFjZVRleHQodGhpcywgcGFpci5zdGFydE9mZnNldCwgcGFpci5lbmRPZmZzZXQgLSBwYWlyLnN0YXJ0T2Zmc2V0LCBuZXdUZXh0KTsKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTJmOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IERURCBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURENvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT05FX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0NIQVJBQ1RFUl9EQVRBX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lERU5USUZJRVJfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSURfUkVGRVJFTkNFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0lEX1JFRkVSRU5DRVNfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRU5USVRZX05BTUVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRU5USVRZX05BTUVTX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05BTUVfVE9LRU5fREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTkFNRV9UT0tFTlNfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRU5VTV9OQU1FX1RPS0VOU19ERVNDOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlVNX05PVEFUSU9OX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJfREVGQVVMVF9WQUw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJfREVGQVVMVF9LSU5EOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9BVFRSX1RZUEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0FUVFJfRU5VTV9JVEVNUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUl9MSVNUX0FERDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fR1JQX05PREVfQ09OTkVDVE9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9HUlBfTk9ERV9JTlNFUlRfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0dSUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fR1JQX05PREVfQUREX0NISUxEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX01JWF9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX0NISUxEX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfU0VUX01JWF9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX1NFVF9DSElMRF9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX1NFVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9DT05URU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DTV9OT0RFX1BDREFUQTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ01fTk9ERV9BTlk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX05PREVfRU1QVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0NNX1JFUF9OT0RFX0NIR19PQ0NVUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQ09NTUVOVF9DSEc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX1BBUk1fRU5USVRZX1JFRjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfQUREX05PVEFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9BRERfQVRUUl9MSVNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0RURF9OT0RFX05BTUVfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9EVERfTk9ERV9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VMRU1FTlRfQUREX0FUVFI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VMRU1FTlRfQUREX0dSUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9BRERfQ0hJTEQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9TRVRfUEFSTV9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9TRVRfRVhUX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1NFVF9JTlRfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfVkFMVUVfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FWFRfTk9ERV9QVUJMSUNfSURfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FWFRfTk9ERV9TWVNURU1fSURfQ0hHOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfRUxFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9FTlRJVElFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX05PVEFUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9ERV9MSVNUX0NPTU1FTlRTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9OT0RFX0xJU1RfT1RIRVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05PREVfTElTVF9BVFRSSUJVVEVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBUk1fRU5USVRZX1JFRl9DT01NRU5UX0NIRzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfVE9QX0xFVkVMX05PREVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9VTkRFQ0xBUkVEX0VMRU1FTlRfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRVJST1JQQVJUX1VOREVDTEFSRURfRUxFTUVOVF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9EVVBfSURfQVRUUklCVVRFXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SUEFSVF9EVVBfSURfQVRUUklCVVRFXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0VSUk9SUEFSVF9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FWENfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQ7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRFREQ29yZU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2I1NWM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBEVERDb3JlUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHJpdmF0ZSBzdGF0aWMgRFREQ29yZVBsdWdpbiBpbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0RFRESW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmdldEltYWdlKGljb25OYW1lKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXREVERJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGljb25OYW1lKSB7Ci0JCVN0cmluZyB0aGlzSUQgPSBnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKHRoaXNJRCwgaWNvbk5hbWUpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIERURENvcmVQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIERURENvcmVQbHVnaW4gZ2V0UGx1Z2luKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIERURENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKSB7Ci0JCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IGdldEltYWdlUmVnaXN0cnkoKTsKLQkJSW1hZ2UgaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0KLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCVN0cmluZyB0aGlzSUQgPSBnZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpOwotCQkJaW1hZ2VSZWdpc3RyeS5wdXQoaWNvbk5hbWUsIGltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4odGhpc0lELCBpY29uTmFtZSkpOwotCQkJaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhYzNkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0hIFN0cmluZ3MgZm9yIERUREJhc2ljVHlwZUltcGwgdHlwZSBkZXNjcmlwdGlvbnMKLV9VSV9OT05FX0RFU0M9Tm9uZQotCi0hISBOT1RFIFRPIFRSQU5TTEFUT1I6IERvIG5vdCB0cmFuc2xhdGUgZm9sbG93aW5nIHRleHQgaW4gcGFyZW50aGVzZXMgb24gZm9sbG93aW5nIDEwIGxpbmVzIGkuZS4oQ0RBVEEpCi1fVUlfQ0hBUkFDVEVSX0RBVEFfREVTQz1DaGFyYWN0ZXIgRGF0YSAoQ0RBVEEpCi1fVUlfSURFTlRJRklFUl9ERVNDPUlkZW50aWZpZXIgKElEKQotX1VJX0lEX1JFRkVSRU5DRV9ERVNDPUlEIFJlZmVyZW5jZSAoSURSRUYpCi1fVUlfSURfUkVGRVJFTkNFU19ERVNDPUlEIFJlZmVyZW5jZXMgKElEUkVGUykKLV9VSV9FTlRJVFlfTkFNRV9ERVNDPUVudGl0eSBOYW1lIChFTlRJVFkpCi1fVUlfRU5USVRZX05BTUVTX0RFU0M9RW50aXR5IE5hbWVzIChFTlRJVElFUykKLV9VSV9OQU1FX1RPS0VOX0RFU0M9TmFtZSBUb2tlbiAoTk1UT0tFTikKLV9VSV9OQU1FX1RPS0VOU19ERVNDPU5hbWUgVG9rZW5zIChOTVRPS0VOUykKLV9VSV9FTlVNX05BTUVfVE9LRU5TX0RFU0M9RW51bWVyYXRlZCBOYW1lIFRva2VucwotX1VJX0VOVU1fTk9UQVRJT05fREVTQz1FbnVtZXJhdGVkIE5PVEFUSU9OCi0KLSEgU3RyaW5ncyBmcm9tIHNlZC9tb2RlbAotCi0hIEF0dHJpYnV0ZS5qYXZhCi1fVUlfTEFCRUxfQVRUUl9ERUZBVUxUX1ZBTD1BdHRyaWJ1dGUgRGVmYXVsdCBDaGFuZ2UgVmFsdWUKLV9VSV9MQUJFTF9BVFRSX0RFRkFVTFRfS0lORD1DaGFuZ2UgQXR0cmlidXRlIERlZmF1bHQgVmFsdWUKLV9VSV9MQUJFTF9BVFRSX1RZUEU9Q2hhbmdlIEF0dHJpYnV0ZSBUeXBlCi0KLSEgQXR0cmlidXRlRW51bUxpc3QKLV9VSV9MQUJFTF9BVFRSX0VOVU1fSVRFTVM9Q2hhbmdlIEF0dHJpYnV0ZSBFbnVtZXJhdGlvbiBWYWx1ZQotCi0hIEF0dHJpYnV0ZUxpc3QKLV9VSV9MQUJFTF9BVFRSX0xJU1RfQUREPUFkZCBBdHRyaWJ1dGUKLQotISBDTUdyb3VwTm9kZQotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0NPTk5FQ1RPUj1DaGFuZ2UgQ29ubmVjdG9yCi1fVUlfTEFCRUxfQ01fR1JQX05PREVfSU5TRVJUX0VMRU1FTlQ9SW5zZXJ0IEVsZW1lbnQKLV9VSV9MQUJFTF9DTV9HUlBfTk9ERV9BRERfR1JQPUFkZCBHcm91cAotX1VJX0xBQkVMX0NNX0dSUF9OT0RFX0FERF9DSElMRD1BZGQgQ2hpbGQgRWxlbWVudAotCi0hIENNTm9kZQotX1VJX0xBQkVMX0NNX05PREVfTUlYX0NPTlRFTlQ9TWl4ZWQgQ29udGVudAotX1VJX0xBQkVMX0NNX05PREVfQ0hJTERfQ09OVEVOVD1DaGlsZHJlbiBDb250ZW50Ci1fVUlfTEFCRUxfQ01fTk9ERV9TRVRfTUlYX0NPTlRFTlQ9U2V0IE1peGVkIENvbnRlbnQKLV9VSV9MQUJFTF9DTV9OT0RFX1NFVF9DSElMRF9DT05URU5UPVNldCBDaGlsZHJlbiBDb250ZW50Ci0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIFVTQUdFOiAiU2V0IDx2YXJpYWJsZSBjb250ZW50PiBDb250ZW50IgotX1VJX0xBQkVMX0NNX05PREVfU0VUPVNldAotX1VJX0xBQkVMX0NNX05PREVfQ09OVEVOVD1Db250ZW50Ci0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIERPIE5PVCBUUkFOU0xBVEUgRk9MTE9XSU5HIDMgTElORVMKLV9VSV9MQUJFTF9DTV9OT0RFX1BDREFUQT0oI1BDREFUQSkKLV9VSV9MQUJFTF9DTV9OT0RFX0FOWT1BTlkKLV9VSV9MQUJFTF9DTV9OT0RFX0VNUFRZPUVNUFRZCi0KLSEgQ01SZXBlYXRhYmxlTm9kZQotX1VJX0xBQkVMX0NNX1JFUF9OT0RFX0NIR19PQ0NVUj1DaGFuZ2UgT2NjdXJyZW5jZQotCi0hIENvbW1lbnQKLV9VSV9MQUJFTF9DT01NRU5UX0NIRz1Db21tZW50IENoYW5nZQotCi0hIERUREZpbGUKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfRUxFTUVOVD1BZGQgRWxlbWVudAotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFk9QWRkIEVudGl0eQotX1VJX0xBQkVMX0RURF9GSUxFX0FERF9DT01NRU5UPUFkZCBDb21tZW50Ci1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX1BBUk1fRU5USVRZX1JFRj1BZGQgUGFyYW1ldGVyIEVudGl0eSBSZWZlcmVuY2UKLV9VSV9MQUJFTF9EVERfRklMRV9BRERfTk9UQVRJT049QWRkIE5vdGF0aW9uCi1fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0FUVFJfTElTVD1BZGQgQXR0cmlidXRlIExpc3QKLV9VSV9MQUJFTF9EVERfRklMRV9ERUxFVEU9RGVsZXRlCi0KLSEgRFRETm9kZQotX1VJX0xBQkVMX0RURF9OT0RFX05BTUVfQ0hHPU5hbWUgQ2hhbmdlCi1fVUlfTEFCRUxfRFREX05PREVfREVMRVRFPURlbGV0ZQotCi0hIEVsZW1lbnQKLV9VSV9MQUJFTF9FTEVNRU5UX0FERF9BVFRSPUFkZCBBdHRyaWJ1dGUKLV9VSV9MQUJFTF9FTEVNRU5UX0FERF9HUlA9QWRkIEdyb3VwCi1fVUlfTEFCRUxfRUxFTUVOVF9BRERfQ0hJTEQ9QWRkIENoaWxkIEVsZW1lbnQKLQotISBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX1BBUk1fRU5USVRZPVNldCBQYXJhbWV0ZXIgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1NFVF9HRU5FUkFMX0VOVElUWT1TZXQgR2VuZXJhbCBFbnRpdHkKLV9VSV9MQUJFTF9FTlRJVFlfU0VUX0VYVF9FTlRJVFk9U2V0IEV4dGVybmFsIEVudGl0eQotX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWT1TZXQgSW50ZXJuYWwgRW50aXR5Ci1fVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRz1FbnRpdHkgVmFsdWUgQ2hhbmdlCi0KLSEhIE5PVEUgVE8gVFJBTlNMQVRPUiAtIFVTQUdFOiAiTkRBVEEgQ2hhbmdlIgotX1VJX0xBQkVMX0VOVElUWV9OREFUQV9DSEFOR0U9Q2hhbmdlCi0KLSEgRXh0ZXJuYWxOb2RlCi1fVUlfTEFCRUxfRVhUX05PREVfUFVCTElDX0lEX0NIRz1QdWJsaWMgSUQgQ2hhbmdlCi1fVUlfTEFCRUxfRVhUX05PREVfU1lTVEVNX0lEX0NIRz1TeXN0ZW0gSUQgQ2hhbmdlCi0KLSEgTm9kZUxpc3QKLV9VSV9MQUJFTF9OT0RFX0xJU1RfRUxFTUVOVFM9RWxlbWVudHMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfRU5USVRJRVM9RW50aXRpZXMKLV9VSV9MQUJFTF9OT0RFX0xJU1RfTk9UQVRJT05TPU5vdGF0aW9ucwotX1VJX0xBQkVMX05PREVfTElTVF9DT01NRU5UUz1Db21tZW50cwotX1VJX0xBQkVMX05PREVfTElTVF9PVEhFUj1PdGhlcgotX1VJX0xBQkVMX05PREVfTElTVF9BVFRSSUJVVEVTPUF0dHJpYnV0ZXMKLQotISBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UKLV9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUY9Q2hhbmdlIEVudGl0eSBSZWZlcmVuY2UKLV9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ09NTUVOVF9DSEc9Q29tbWVudCBDaGFuZ2UKLQotISBUb3BMZXZlbE5vZGUKLV9VSV9MQUJFTF9UT1BfTEVWRUxfTk9ERV9ERUxFVEU9RGVsZXRlCi0KLV9FUlJPUl9JTkNMX0ZJTEVfTE9BRF9GQUlMVVJFICAgICAgID0gRmFpbGVkIHRvIGxvYWQgaW5jbHVkZWQgZmlsZQotCi0hIHVzYWdlOiBfRVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzEgICsgPGVsZW1lbnROYW1lPiArIF9QQVJURVJST1JfVU5ERUNMQVJFRF9FTEVNRU5UXzIKLV9FUlJPUl9VTkRFQ0xBUkVEX0VMRU1FTlRfMSAgICAgICAgID0gUmVmZXJlbmNlIHRvIHVuZGVjbGFyZWQgZWxlbWVudCAnCi1fVUlfRVJST1JQQVJUX1VOREVDTEFSRURfRUxFTUVOVF8yICA9JyBpbiBjb250ZW50IG1vZGVsLgotCi0hIHVzYWdlOiBfRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xICArIDxhdHRyaWJ1dGVOYW1lPiArIF9QQVJURVJST1JfRFVQX0lEX0FUVFJJQlVURV8yCi1fRVJST1JfRFVQX0lEX0FUVFJJQlVURV8xICAgICAgICAgPSBEdXBsaWNhdGUgSUQgYXR0cmlidXRlICcKLV9VSV9FUlJPUlBBUlRfRFVQX0lEX0FUVFJJQlVURV8yICA9ICcuIE9ubHkgb25lIElEIGF0dHJpYnV0ZSBjYW4gYmUgc3BlY2lmaWVkIHBlciBFTEVNRU5UIHR5cGUuCi0KLSEgdXNhZ2U6X0VSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzEgKyA8dHlwZVN0cmluZz4gKyBfUEFSVEVSUk9SX0lOVkFMSURfREVGQVVMVF9BVFRSX1ZBTFVFXzIgKyA8YXR0cmlidXRlTmFtZT4KLV9FUlJPUl9JTlZBTElEX0RFRkFVTFRfQVRUUl9WQUxVRV8xICAgICAgICAgPSBJbnZhbGlkIGRlZmF1bHQKLV9VSV9FUlJPUlBBUlRfSU5WQUxJRF9ERUZBVUxUX0FUVFJfVkFMVUVfMiAgPSAgdmFsdWUgZm9yIGF0dHJpYnV0ZSAnCi0KLV9FWENfT1BFUkFUSU9OX05PVF9TVVBQT1JURUQgID0gT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFRERmlsZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERGaWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViY2YwMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERGaWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudC5JRFRERmlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudC5Ob2Rlc0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFRERXh0ZXJuYWxSZWZlcmVuY2VSZW1vdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkRURE1vZGVsVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi1wdWJsaWMgY2xhc3MgRFRERmlsZSBpbXBsZW1lbnRzIEluZGV4ZWRSZWdpb24gewotCXByaXZhdGUgTm9kZUxpc3QgYXR0bGlzdExpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCXByaXZhdGUgTm9kZUxpc3QgY29tbWVudExpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0KLQlib29sZWFuIGNyZWF0aW5nTmV3TW9kZWwgPSBmYWxzZTsKLQlwcml2YXRlIERURE1vZGVsSW1wbCBmRFRETW9kZWw7Ci0KLQlwcml2YXRlIE5vZGVMaXN0IGVsZW1lbnRMaXN0ID0gbmV3IE5vZGVMaXN0KHRoaXMsIERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKTsKLQlwcml2YXRlIE5vZGVMaXN0IGVudGl0eUxpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyk7Ci0KLQlwcml2YXRlIExpc3QgZm9sZGVyTGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNNb3ZpbmdOb2RlID0gZmFsc2U7Ci0KLQlwcml2YXRlIExpc3QgbW9kZWxMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcml2YXRlIExpc3Qgbm9kZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJpdmF0ZSBOb2RlTGlzdCBub3RhdGlvbkxpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKTsKLQlwcml2YXRlIE5vZGVMaXN0IHVucmVjb2duaXplZExpc3QgPSBuZXcgTm9kZUxpc3QodGhpcywgRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsKLQotCXB1YmxpYyBEVERGaWxlKERURE1vZGVsSW1wbCBkdGRNb2RlbCkgewotCQl0aGlzLmZEVERNb2RlbCA9IGR0ZE1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERUREZpbGVMaXN0ZW5lcihJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCW1vZGVsTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJYWRkTm9kZShub2RlTGlzdC5zaXplKCksIG5vZGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5vZGUoaW50IGluZGV4LCBEVEROb2RlIG5vZGUpIHsKLQkJbm9kZUxpc3QuYWRkKGluZGV4LCBub2RlKTsKLQkJLyoKLQkJICogaWYgKGluZGV4IDwgbm9kZUxpc3Quc2l6ZSgpKSB7IGluc2VydEJlZm9yZShub2RlLCAoRFRETm9kZSkKLQkJICogbm9kZUxpc3QuZ2V0KGluZGV4KSk7IH0gZWxzZSB7IGFwcGVuZENoaWxkKG5vZGUpOyB9Ci0JCSAqLwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGJ1aWxkTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCS8vIElUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlEVEROb2RlIG5vZGUgPSBudWxsOwotCQlpZiAoaXNFbGVtZW50KGZsYXROb2RlKSkgewotCQkJLy8gdGhlbiB0aGlzIGlzIGFuIGVsZW1lbnQKLQkJCW5vZGUgPSBuZXcgRWxlbWVudCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNFbnRpdHkoZmxhdE5vZGUpKSB7Ci0JCQlub2RlID0gbmV3IEVudGl0eSh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNOb3RhdGlvbihmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgTm90YXRpb24odGhpcywgZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKGlzQXR0cmlidXRlTGlzdChmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgQXR0cmlidXRlTGlzdCh0aGlzLCBmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNDb21tZW50KGZsYXROb2RlKSkgewotCQkJbm9kZSA9IG5ldyBDb21tZW50KHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChpc1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZShmbGF0Tm9kZSkpIHsKLQkJCW5vZGUgPSBuZXcgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmICghZmxhdE5vZGUuZ2V0VGV4dCgpLnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCW5vZGUgPSBuZXcgVW5yZWNvZ25pemVkKHRoaXMsIGZsYXROb2RlKTsKLQkJfQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlpbnNlcnROb2RlKG5vZGUpOwotCQkJbm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXB1YmxpYyB2b2lkIGJ1aWxkTm9kZXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbGlzdCkgewotCQlOb2Rlc0V2ZW50IGFkZGVkRFRETm9kZXMgPSBuZXcgTm9kZXNFdmVudCgpOwotCi0JCVRvcExldmVsTm9kZSBwcmV2aW91c05vZGUgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGxpc3QuaXRlbShpKTsKLQkJCVRvcExldmVsTm9kZSBub2RlID0gKFRvcExldmVsTm9kZSkgYnVpbGROb2RlKGZsYXROb2RlKTsKLQkJCS8vIGlmIHdlIGRvbid0IGNyZWF0ZSBhIG5vZGUsIHRoZW4gd2UgYXNzdW1lIHRoYXQgdGhlIGZsYXQKLQkJCS8vIG5vZGUgd2FzIHdoaXRlc3BhY2UuIFRhY2sgaXQgb24gdG8gYSBwcmV2aW91cyB0b3BsZXZlbAotCQkJLy8gbm9kZQotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCXByZXZpb3VzTm9kZSA9IG5vZGU7Ci0JCQkJYWRkZWREVEROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAocHJldmlvdXNOb2RlICE9IG51bGwpIHsKLQkJCQkJcHJldmlvdXNOb2RlLmFkZFdoaXRlc3BhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChhZGRlZERURE5vZGVzLmdldE5vZGVzKCkuc2l6ZSgpID4gMCkvLyAmJgotCQkvLyBjcmVhdGluZ05ld01vZGVsID09IGZhbHNlKQotCQl7Ci0JCQkvLyBub3cgdGVsbCBwZW9wbGUgYWJvdXQgdGhlIGFkZGl0aW9ucwotCQkJbm90aWZ5Tm9kZXNBZGRlZChhZGRlZERURE5vZGVzKTsKLQkJfQotCX0KLQotCS8vIEltcGxlbWVudHMgSW5kZXhlZFJlZ2lvbgotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSA8PSB0ZXN0UG9zaXRpb24gJiYgdGVzdFBvc2l0aW9uIDw9IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUF0dHJpYnV0ZUxpc3QoRFRETm9kZSBub2RlLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0FmdGVyKSB7Ci0JCWdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9EVERfRklMRV9BRERfQVRUUl9MSVNUKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhQVRUTElTVCAiICsgbmFtZSArICI+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb21tZW50KERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0NPTU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSAiPCEtLSAiICsgbmFtZSArICIgLS0+XG4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaW50IG9mZnNldCA9IGdldEluc2VydE9mZnNldChub2RlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCAwLCBuZXdTdHJlYW0pOwotCQlnZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVFbGVtZW50KERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX0VMRU1FTlQpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSAiPCFFTEVNRU5UICIgKyBuYW1lICsgIiBFTVBUWT5cbiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVudGl0eShEVEROb2RlIG5vZGUsIFN0cmluZyBuYW1lLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0FERF9FTlRJVFkpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBuZXdTdHJlYW0gPSAiPCFFTlRJVFkgIiArIG5hbWUgKyAiIFwiXCI+XG4iOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQlpbnQgb2Zmc2V0ID0gZ2V0SW5zZXJ0T2Zmc2V0KG5vZGUsIGlzQWZ0ZXIpOwotCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dCh0aGlzLCBvZmZzZXQsIDAsIG5ld1N0cmVhbSk7Ci0JCWdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZU5vdGF0aW9uKERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX05PVEFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbmV3U3RyZWFtID0gIjwhTk9UQVRJT04gIiArIG5hbWUgKyAiIFNZU1RFTSBcIlwiPlxuIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERURE5vZGUgbm9kZSwgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlnZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfQUREX1BBUk1fRU5USVRZX1JFRik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld1N0cmVhbSA9IG5hbWUgKyAiXG4iOyAvLyROT04tTkxTLTEkCi0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgaXNBZnRlcik7Ci0JCWdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIG9mZnNldCwgMCwgbmV3U3RyZWFtKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJZ2V0RFRETW9kZWwoKS5iZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0RURF9GSUxFX0RFTEVURSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlTm9kZSh0aGlzLCBub2RlKTsKLQkJZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlTm9kZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIG5vZGUpIHsKLQkJRFRETm9kZSBwYXJlbnQgPSAoRFRETm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJcGFyZW50LmRlbGV0ZShyZXF1ZXN0b3IsIG5vZGUpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFpc01vdmluZ05vZGUpIHsKLQkJCQlEVERNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IG5ldyBEVERNb2RlbFVwZGF0ZXIoKTsKLQkJCQl1cGRhdGVyLm9iamVjdEFib3V0VG9CZURlbGV0ZWQocmVxdWVzdG9yLCBub2RlKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkgewotCQkJCQlFbnRpdHkgcmVmZXJlbmNlZEVudGl0eSA9ICgoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBub2RlKS5nZXRFbnRpdHlPYmplY3QoKTsKLQkJCQkJaWYgKHJlZmVyZW5jZWRFbnRpdHkgIT0gbnVsbCkgewotCQkJCQkJLy8gcmVtb3ZlIHJlZmVyZW5jZXMgdG8gYWxsIGVsZW1lbnRzIGFuZCBwYXJtIGVudGl0aWVzCi0JCQkJCQkvLyBjb250YWluZWQgaW4gb3VyIGN1cnJlbnQgbW9kZWwKLQkJCQkJCURUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlciByZW1vdmVyID0gbmV3IERUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcigpOwotCQkJCQkJcmVtb3Zlci5leHRlcm5hbFJlZmVyZW5jZUFib3V0VG9DaGFuZ2UocmVxdWVzdG9yLCByZWZlcmVuY2VkRW50aXR5KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCQkJTm90YXRpb24gbm90YXRpb24gPSAoKE5vdGF0aW9uKSBub2RlKTsKLQkJCQkJRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyIHJlbW92ZXIgPSBuZXcgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyKCk7Ci0JCQkJCXJlbW92ZXIubm90YXRpb25BYm91dFRvQmVEZWxldGVkKHJlcXVlc3Rvciwgbm90YXRpb24pOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gbm8gcGFyZW50PyB0aGVuIGRlbGV0ZSB1cCB1bnRpbCB0aGUgc3RhcnQgb2YgdGhlIG5leHQgbm9kZQotCQkJLy8gaWYgaXQgaXMgYSB0b3AgbGV2ZWwgbm9kZQotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZE9mZnNldCA9IG5vZGUuZ2V0V2hpdGVzcGFjZUVuZE9mZnNldCgpOwotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpIHsKLQkJCQllbmRPZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQobm9kZSwgdHJ1ZSk7Ci0JCQl9Ci0JCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0Q29tbWVudHMoKSB7Ci0JCXJldHVybiBjb21tZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgRFRETW9kZWxJbXBsIGdldERURE1vZGVsKCkgewotCQlyZXR1cm4gZkRURE1vZGVsOwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBlbGVtZW50TGlzdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpbnQgc3RhcnQgPSBnZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RhcnQgPj0gMCkgewotCQkJaW50IGVuZCA9IGdldEVuZE9mZnNldCgpOwotCQkJaWYgKGVuZCA+PSAwKSB7Ci0JCQkJcmVzdWx0ID0gZW5kIC0gc3RhcnQ7Ci0JCQkJaWYgKHJlc3VsdCA8IC0xKSB7Ci0JCQkJCXJlc3VsdCA9IC0xOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIGVudGl0eUxpc3Q7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkRUREZJTEVJQ09OKTsKLQl9Ci0KLQotCi0JcHVibGljIGludCBnZXRJbnNlcnRPZmZzZXQoRFRETm9kZSBub2RlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChpc0FmdGVyKSB7Ci0JCQkJLy8gdGhlbiBnZXQgdGhlIG5leHQgbm9kZSBhbmQgdXNlIGl0J3Mgc3RhcnQgb2Zmc2V0Ci0JCQkJaW50IGluZGV4ID0gZ2V0Tm9kZXMoKS5pbmRleE9mKGdldE5vZGUobm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSkpOwotCi0JCQkJRFRETm9kZSBhZnRlck5vZGUgPSBudWxsOwotCQkJCWlmIChpbmRleCArIDEgPCBnZXROb2RlcygpLnNpemUoKSkgewotCQkJCQlhZnRlck5vZGUgPSAoRFRETm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaW5kZXggKyAxKTsKLQkJCQl9Ci0JCQkJaWYgKGFmdGVyTm9kZSAhPSBudWxsKSB7Ci0JCQkJCW9mZnNldCA9IGFmdGVyTm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYWRkIHRvIGVuZAotCQkJCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQkJCW9mZnNldCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW9mZnNldCA9IG5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIGFkZCB0byBlbmQKLQkJCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCW9mZnNldCA9IGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2Zmc2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGggcGF0aCA9IG5ldyBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aChnZXREVERNb2RlbCgpLmdldElkKCkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiBwYXRoLmxhc3RTZWdtZW50KCk7Ci0JfQotCi0JcHVibGljIERURE5vZGUgZ2V0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2RlTGlzdC5nZXQoaSk7Ci0JCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSA9PSBmbGF0Tm9kZSkgewotCQkJCXJldHVybiBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldFRvcExldmVsTm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBub2RlLmdldERlZXBlc3ROb2RlKG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIEluZGV4ZWRSZWdpb24gZ2V0Tm9kZUF0KGludCBzdGFydE9mZnNldCwgaW50IGVuZE9mZnNldCkgewotCQlEVEROb2RlIG5vZGUgPSBnZXRUb3BMZXZlbE5vZGVBdChzdGFydE9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBub2RlLmdldERlZXBlc3ROb2RlKHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vZGVMaXN0cygpIHsKLQkJaWYgKGZvbGRlckxpc3QgPT0gbnVsbCkgewotCQkJZm9sZGVyTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvbGRlckxpc3QuYWRkKG5vdGF0aW9uTGlzdCk7Ci0JCQlmb2xkZXJMaXN0LmFkZChlbnRpdHlMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKGVsZW1lbnRMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKGF0dGxpc3RMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKGNvbW1lbnRMaXN0KTsKLQkJCWZvbGRlckxpc3QuYWRkKHVucmVjb2duaXplZExpc3QpOwotCQl9Ci0JCXJldHVybiBmb2xkZXJMaXN0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5vZGVzKCkgewotCQlyZXR1cm4gbm9kZUxpc3Q7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldE5vdGF0aW9ucygpIHsKLQkJcmV0dXJuIG5vdGF0aW9uTGlzdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEVERNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBnZXRUb3BMZXZlbE5vZGVBdChpbnQgb2Zmc2V0KSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2RlTGlzdC5nZXQoaSk7Ci0JCQlpZiAobm9kZS5jb250YWlucyhvZmZzZXQpKSB7Ci0JCQkJcmV0dXJuIG5vZGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE5vZGVMaXN0IGdldFVucmVjb2duaXplZCgpIHsKLQkJcmV0dXJuIHVucmVjb2duaXplZExpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zZXJ0SW50b01vZGVsKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgcmVmZXJlbmNlLCBEVEROb2RlIG5vZGUsIGJvb2xlYW4gaXNBZnRlcikgewotCQlTdHJpbmcgbm9kZVRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkgewotCQkJbm9kZVRleHQgPSAoKFRvcExldmVsTm9kZSkgbm9kZSkuZ2V0RnVsbFRleHQoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5vZGVUZXh0ID0gbm9kZS5nZXROb2RlVGV4dCgpOwotCQl9Ci0JCWludCBvZmZzZXQgPSBnZXRJbnNlcnRPZmZzZXQocmVmZXJlbmNlLCBpc0FmdGVyKTsKLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQocmVxdWVzdG9yLCBvZmZzZXQsIDAsIG5vZGVUZXh0KTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCWludCBzdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGluc2VydEluZGV4ID0gLTE7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigic3RhcnRvZmZzZXQgPSAiICsgc3RhcnRPZmZzZXQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGdldE5vZGVzKCkuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgZ2V0Tm9kZXMoKS5nZXQoaSk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImN1cnJlbnROb2RlIGVuZE9mZnNldCA9ICIKLQkJCS8vICtjdXJyZW50Tm9kZS5nZXRFbmRPZmZzZXQoKSk7Ci0KLQkJCWlmIChjdXJyZW50Tm9kZS5nZXRFbmRPZmZzZXQoKSA+IHN0YXJ0T2Zmc2V0KSB7Ci0JCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJlbmRvZmZzZXQgIiArCi0JCQkJLy8gY3VycmVudE5vZGUuZ2V0RW5kT2Zmc2V0KCkgKyAiID4gIiArIHN0YXJ0T2Zmc2V0KTsKLQkJCQlpbnNlcnRJbmRleCA9IGk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluc2VydEluZGV4ID09IC0xKSB7Ci0JCQlpbnNlcnRJbmRleCA9IGdldE5vZGVzKCkuc2l6ZSgpOwotCQl9Ci0KLQotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImluc2VydCBpbmRleCA9ICIgKyBpbnNlcnRJbmRleCk7Ci0KLQkJYWRkTm9kZShpbnNlcnRJbmRleCwgbm9kZSk7Ci0JfQotCi0JLy8gaXQgaXMgYXNzdW1lZCB0aGF0IGZsYXRub2RlIGNvbnRhaW5zIGF0IGxlYXN0IDMgcmVnaW9ucwotCXB1YmxpYyBib29sZWFuIGlzQXR0cmlidXRlTGlzdChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCUlUZXh0UmVnaW9uIHNlY29uZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiB0aGlyZCA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMik7Ci0JCQlpZiAoc2Vjb25kLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pICYmIHRoaXJkLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAyKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlQpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvLyBpdCBpcyBhc3N1bWVkIHRoYXQgZmxhdG5vZGUgY29udGFpbnMgYXQgbGVhc3QgMyByZWdpb25zCi0JcHVibGljIGJvb2xlYW4gaXNFbnRpdHkoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUuZ2V0UmVnaW9ucygpLnNpemUoKSA+PSAzKSB7Ci0JCQlJVGV4dFJlZ2lvbiBzZWNvbmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCQkJSVRleHRSZWdpb24gdGhpcmQgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KDIpOwotCQkJaWYgKHNlY29uZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OKSAmJiB0aGlyZC5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc05vdGF0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPj0gMykgewotCQkJSVRleHRSZWdpb24gc2Vjb25kID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgxKTsKLQkJCUlUZXh0UmVnaW9uIHRoaXJkID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgyKTsKLQkJCWlmIChzZWNvbmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTikgJiYgdGhpcmQuZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8vIGl0IGlzIGFzc3VtZWQgdGhhdCBmbGF0bm9kZSBjb250YWlucyBhdCBsZWFzdCAzIHJlZ2lvbnMKLQlwdWJsaWMgYm9vbGVhbiBpc1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpID09IDEpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoMCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCWJvb2xlYW4gaXNTYW1lVG9wTGV2ZWxUeXBlKERURE5vZGUgYWZmZWN0ZWROb2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBhZmZlY3RlZE5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIHJldHVybiB0cnVlIGlmIHRoZSBmbGF0bm9kZSBzdGlsbCBtYXRjaGVzIHdoYXQgdGhlIGFmZmVjdGVkTm9kZQotCQkvLyBpcyByZXByZXNlbnRpbmcKLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgaXNFbGVtZW50KGZsYXROb2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiBpc0VudGl0eShmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBDb21tZW50ICYmIGlzQ29tbWVudChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0ICYmIGlzQXR0cmlidXRlTGlzdChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWlmIChhZmZlY3RlZE5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbiAmJiBpc05vdGF0aW9uKGZsYXROb2RlKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKGFmZmVjdGVkTm9kZSBpbnN0YW5jZW9mIFVucmVjb2duaXplZCAmJiBpc1VucmVjb2duaXplZChmbGF0Tm9kZSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1VucmVjb2duaXplZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXJldHVybiAhaXNFbGVtZW50KGZsYXROb2RlKSAmJiAhaXNFbnRpdHkoZmxhdE5vZGUpICYmICFpc05vdGF0aW9uKGZsYXROb2RlKSAmJiAhaXNQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoZmxhdE5vZGUpICYmICFpc0F0dHJpYnV0ZUxpc3QoZmxhdE5vZGUpICYmICFpc0NvbW1lbnQoZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1vdmVOb2RlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgcmVmZXJlbmNlTm9kZSwgRFRETm9kZSBub2RlVG9Nb3ZlLCBib29sZWFuIGlzQWZ0ZXIpIHsKLQkJaXNNb3ZpbmdOb2RlID0gdHJ1ZTsKLQotCQlkZWxldGVOb2RlKHJlcXVlc3Rvciwgbm9kZVRvTW92ZSk7Ci0JCWluc2VydEludG9Nb2RlbChyZXF1ZXN0b3IsIHJlZmVyZW5jZU5vZGUsIG5vZGVUb01vdmUsIGlzQWZ0ZXIpOwotCQlpc01vdmluZ05vZGUgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWNyZWF0aW5nTmV3TW9kZWwgPSB0cnVlOwotCQlub2RlTGlzdC5jbGVhcigpOwotCQlOb2Rlc0V2ZW50IHJlbW92ZUV2ZW50ID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJcmVtb3ZlRXZlbnQuZ2V0Tm9kZXMoKS5hZGRBbGwobm9kZUxpc3QpOwotCQlub3RpZnlOb2Rlc1JlbW92ZWQocmVtb3ZlRXZlbnQpOwotCQkvKiByZW1vdmVDaGlsZE5vZGVzKCk7ICovCi0KLQkJaWYgKGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpICE9IG51bGwgJiYgZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uTGlzdCgpICE9IG51bGwpIHsKLQkJCWJ1aWxkTm9kZXMoZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uTGlzdCgpKTsKLQkJfQotCQljcmVhdGluZ05ld01vZGVsID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGROb2RlcyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJTm9kZXNFdmVudCByZW1vdmVkRFRETm9kZXMgPSBuZXcgTm9kZXNFdmVudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZE5vZGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBvbGROb2Rlcy5pdGVtKGkpOwotCi0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBnZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSA9PSBmbGF0Tm9kZSkgewotCQkJCQlyZW1vdmVkRFRETm9kZXMuYWRkKG5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWJ1aWxkTm9kZXMoZXZlbnQuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpKTsKLQotCQlpZiAocmVtb3ZlZERURE5vZGVzLmdldE5vZGVzKCkuc2l6ZSgpID4gMCkgewotCQkJbm90aWZ5Tm9kZXNSZW1vdmVkKHJlbW92ZWREVEROb2Rlcyk7Ci0JCQlyZW1vdmVOb2RlcyhyZW1vdmVkRFRETm9kZXMuZ2V0Tm9kZXMoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlOb2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZGVsTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRFRERmlsZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vZGVDaGFuZ2VkKG5vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Tm9kZXNBZGRlZChOb2Rlc0V2ZW50IGFkZGVkTm9kZXMpIHsKLQkJSXRlcmF0b3IgaXRlciA9IG1vZGVsTGlzdGVuZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSURUREZpbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJRFRERmlsZUxpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWxpc3RlbmVyLm5vZGVzQWRkZWQoYWRkZWROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOb2Rlc1JlbW92ZWQoTm9kZXNFdmVudCBldmVudCkgewotCQlJdGVyYXRvciBpdGVyID0gbW9kZWxMaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJRFRERmlsZUxpc3RlbmVyIGxpc3RlbmVyID0gKElEVERGaWxlTGlzdGVuZXIpIGl0ZXIubmV4dCgpOwotCQkJbGlzdGVuZXIubm9kZXNSZW1vdmVkKGV2ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlYnVpbGROb2RlcyhMaXN0IG5vZGVzKSB7Ci0JCS8vIHJlbW92ZSB0aGUgb2xkIG5vZGVzCi0JCXJlbW92ZU5vZGVzKG5vZGVzKTsKLQotCQkvLyBub3cgcmVidWlsZCB0aGVtCi0JCU5vZGVzRXZlbnQgYWRkZWREVEROb2RlcyA9IG5ldyBOb2Rlc0V2ZW50KCk7Ci0JCUl0ZXJhdG9yIGR0ZE5vZGVzID0gbm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGR0ZE5vZGVzLmhhc05leHQoKSkgewotCQkJRFRETm9kZSBkdGROb2RlID0gKERURE5vZGUpIGR0ZE5vZGVzLm5leHQoKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVidWlsZGluZyAiICsKLQkJCS8vIGR0ZE5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpKTsKLQotCQkJRFRETm9kZSBub2RlID0gYnVpbGROb2RlKGR0ZE5vZGUuZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCWFkZGVkRFRETm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWlmIChhZGRlZERURE5vZGVzLmdldE5vZGVzKCkuc2l6ZSgpID4gMCkgewotCQkJLy8gbm93IHRlbGwgcGVvcGxlIGFib3V0IHRoZSBhZGRpdGlvbnMKLQkJCW5vdGlmeU5vZGVzQWRkZWQoYWRkZWREVEROb2Rlcyk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlJVGV4dFJlZ2lvbiBjaGFuZ2VkUmVnaW9uID0gZXZlbnQuZ2V0UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJRFRETm9kZSBhZmZlY3RlZE5vZGUgPSAoRFRETm9kZSkgZ2V0Tm9kZUF0KGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGNoYW5nZWRSZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoY2hhbmdlZFJlZ2lvbikpOwotCQlpZiAoYWZmZWN0ZWROb2RlICE9IG51bGwpIHsKLQkJCS8vIG5vIG5lZWQgdG8gcmVzb2x2ZSByZWdpb25zIGFzIGl0IGlzIGp1c3QgYSBjaGFuZ2UKLQkJCS8vIGFmZmVjdGVkTm9kZS5yZXNvbHZlUmVnaW9ucygpOwotCQkJbm90aWZ5Tm9kZUNoYW5nZWQoYWZmZWN0ZWROb2RlKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlMaXN0IG5vZGVzVG9SZWJ1aWxkID0gbmV3IEFycmF5TGlzdCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCURURE5vZGUgYWZmZWN0ZWROb2RlID0gZ2V0Tm9kZShmbGF0Tm9kZSk7Ci0KLQkJaWYgKCFpc1NhbWVUb3BMZXZlbFR5cGUoYWZmZWN0ZWROb2RlKSkgewotCQkJLy8gQnVnIDExMTEwMCAtIEZpcmUgb2ZmIGEgbm9kZSByZW1vdmFsIGV2ZW50Ci0JCQkvLyB0byByZW1vdmUgdGhlIG5vZGUgZnJvbSB0aGUgdHJlZSB2aWV3ZXIKLQkJCU5vZGVzRXZlbnQgcmVtb3ZlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJCXJlbW92ZWREVEROb2Rlcy5hZGQoYWZmZWN0ZWROb2RlKTsKLQkJCW5vdGlmeU5vZGVzUmVtb3ZlZChyZW1vdmVkRFRETm9kZXMpOwotCQkJbm9kZXNUb1JlYnVpbGQuYWRkKGFmZmVjdGVkTm9kZSk7Ci0JCQlyZWJ1aWxkTm9kZXMobm9kZXNUb1JlYnVpbGQpOwotCQl9Ci0JCWVsc2UgewotCQkJYWZmZWN0ZWROb2RlLnJlc29sdmVSZWdpb25zKCk7Ci0JCQlub3RpZnlOb2RlQ2hhbmdlZChhZmZlY3RlZE5vZGUpOwotCQkJLy8gbm93IHRyeSBhbmQgZGV0ZXJtaW5lIHdoaWNoIG9uZXMgd2VyZSBhZGRlZAotCQkJTm9kZXNFdmVudCBhZGRlZERURE5vZGVzID0gbmV3IE5vZGVzRXZlbnQoKTsKLQkJCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gZXZlbnQuZ2V0TmV3UmVnaW9ucygpOwotCQkJaW50IHNpemUgPSBuZXdSZWdpb25zLnNpemUoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoaSk7Ci0JCQkJRFRETm9kZSBkZWVwZXN0Tm9kZSA9IGFmZmVjdGVkTm9kZS5nZXREZWVwZXN0Tm9kZShmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSk7Ci0JCQkJLy8gQnVnIDExMTEwMCAtIFdlIGRvIG5vdCBuZWVkIHRvIGZpcmUgYSBub2RlIGFkZGVkIGV2ZW50Ci0JCQkJLy8gZm9yIHRoZSBhZmZlY3RlZE5vZGUgYmVjYXVzZSB0aGF0IGlzIGFscmVhZHkgaGFuZGxlZCBieQotCQkJCS8vIHRoZSBub2RlIGNoYW5nZWQgZXZlbnQgYWJvdmUKLQkJCQlpZiAoZGVlcGVzdE5vZGUgIT0gYWZmZWN0ZWROb2RlICYmICFhZGRlZERURE5vZGVzLmdldE5vZGVzKCkuY29udGFpbnMoZGVlcGVzdE5vZGUpKSB7Ci0JCQkJCWFkZGVkRFRETm9kZXMuYWRkKGRlZXBlc3ROb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoYWRkZWREVEROb2Rlcy5nZXROb2RlcygpLnNpemUoKSA+IDApIHsKLQkJCQlub3RpZnlOb2Rlc0FkZGVkKGFkZGVkRFRETm9kZXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRFRERmlsZUxpc3RlbmVyKElEVERGaWxlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJbW9kZWxMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVOb2RlcyhMaXN0IG5vZGVzKSB7Ci0JCWdldE5vZGVzKCkucmVtb3ZlQWxsKG5vZGVzKTsKLQkJLyoKLQkJICogZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkgKiByZW1vdmVDaGlsZCgoRFRETm9kZSlub2Rlcy5nZXQoaSkpOyB9IC8vIGVuZCBvZiBmb3IgKCkKLQkJICovCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVEROb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE1MDM3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0RURE5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuVGV4dFJlZ2lvbkxpc3RJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Ob2RlQ29udGFpbmVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIERURE5vZGUgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgSW5kZXhlZFJlZ2lvbiB7Ci0KLQkvLyB0aGVzZSBhcmUgY2hhcmFjdGVyb2Zmc2V0cwotCXByb3RlY3RlZCBEVERGaWxlIGR0ZEZpbGU7Ci0KLQkvLyBmbGF0IG5vZGUgdGhhdCBjb250YWlucyB0aGlzIG5vZGUKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZTsKLQotCXByb3RlY3RlZCBUZXh0UmVnaW9uTGlzdEltcGwgcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCXByb3RlY3RlZCBUZXh0UmVnaW9uTGlzdEltcGwgd2hpdGVzcGFjZSA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCXB1YmxpYyBEVEROb2RlKERUREZpbGUgZHRkRmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCQl0aGlzLmZsYXROb2RlID0gZmxhdE5vZGU7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKgotCQkgKiBpZiAoc3RhcnRSZWdpb24gPT0gbnVsbCkgeyBzdGFydFJlZ2lvbiA9IHJlZ2lvbjsgfSBlbmRSZWdpb24gPQotCQkgKiByZWdpb247Ci0JCSAqLwotCQlyZWdpb25zLmFkZChyZWdpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFdoaXRlc3BhY2VSZWdpb24oSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXdoaXRlc3BhY2UuYWRkKHJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWdldERUREZpbGUoKS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RvciwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXBlc3QpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHRlc3RQb3NpdGlvbikgewotCQlyZXR1cm4gY29udGFpbnNSYW5nZSh0ZXN0UG9zaXRpb24sIHRlc3RQb3NpdGlvbik7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNSYW5nZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgPD0gc3RhcnQgJiYgZW5kIDw9IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlbGV0ZShEVEROb2RlIGNoaWxkKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX05PREVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQlkZWxldGUodGhpcywgY2hpbGQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKE9iamVjdCByZXF1ZXN0b3IsIERURE5vZGUgY2hpbGQpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBjaGlsZC5nZXRTdGFydE9mZnNldCgpLCBjaGlsZC5nZXRGdWxsTm9kZUxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RvcikgewotCQlnZXREVERGaWxlKCkuZ2V0RFRETW9kZWwoKS5lbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBnZXRDaGlsZHJlbkxpc3QoKS50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Q2hpbGRyZW5MaXN0KCkgewotCQlOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWZvciAoOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQljaGlsZHJlbi5hZGQoY2hpbGQpOwotCQkJfQotCQkJcmV0dXJuIGNoaWxkcmVuOwotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRFRETm9kZSBnZXREZWVwZXN0Tm9kZShpbnQgb2Zmc2V0KSB7Ci0JCWlmIChjb250YWlucyhvZmZzZXQpKSB7Ci0JCQkvLyBub3cgc2VlIGlmIGEgY2hpbGQgY29udGFpbnMgdGhpcyBvZmZzZXQKLQkJCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQlEVEROb2RlIGNoaWxkID0gKERURE5vZGUpIGNoaWxkcmVuW2ldOwotCQkJCURURE5vZGUgZGVlcGVzdCA9IGNoaWxkLmdldERlZXBlc3ROb2RlKG9mZnNldCk7Ci0JCQkJaWYgKGRlZXBlc3QgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZGVlcGVzdDsKLQkJCQl9Ci0JCQl9IC8vIGVuZCBvZiBmb3IgKCkKLQkJCXJldHVybiB0aGlzOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBEVEROb2RlIGdldERlZXBlc3ROb2RlKGludCBzdGFydCwgaW50IGVuZCkgewotCQlpZiAoY29udGFpbnNSYW5nZShzdGFydCwgZW5kKSkgewotCQkJLy8gbm93IHNlZSBpZiBhIGNoaWxkIGNvbnRhaW5zIHRoaXMgb2Zmc2V0Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9IGdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJRFRETm9kZSBjaGlsZCA9IChEVEROb2RlKSBjaGlsZHJlbltpXTsKLQkJCQlEVEROb2RlIGRlZXBlc3QgPSBjaGlsZC5nZXREZWVwZXN0Tm9kZShzdGFydCwgZW5kKTsKLQkJCQlpZiAoZGVlcGVzdCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZWVwZXN0OwotCQkJCX0KLQkJCX0gLy8gZW5kIG9mIGZvciAoKQotCQkJcmV0dXJuIHRoaXM7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGR0ZEZpbGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZ2V0RW5kUmVnaW9uKCkpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFbmRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOy8vIGVuZFJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJRFRETW9kZWxJbXBsIG1vZGVsID0gZHRkRmlsZS5nZXREVERNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZyA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQkJaWYgKHJlZyAhPSBudWxsKQotCQkJCXJldHVybiByZWc7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXRGdWxsTm9kZUxlbmd0aCgpIHsKLQkJcmV0dXJuIGdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKSAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsTm9kZVRleHQoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0Tm9kZVRleHQoKTsKLQkJaWYgKHdoaXRlc3BhY2Uuc2l6ZSgpID4gMCkgewotCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IG5ldyBSZWdpb25JdGVyYXRvcih3aGl0ZXNwYWNlKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCXRleHQgKz0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpOwotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBEVERSZWdpb25UeXBlcy5OQU1FKSB7Ci0JCQkJcmV0dXJuIHJlZ2lvbjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZXR1cm4gdGhlIGZpcnN0IHRva2VuIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCB0b2tlbiB0eXBlCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5leHRSZWdpb24oUmVnaW9uSXRlcmF0b3IgaXRlciwgU3RyaW5nIHR5cGUpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyh0eXBlKSkgewotCQkJCXJldHVybiByZWdpb247Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGludCBnZXROb2RlTGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0RW5kT2Zmc2V0KCkgLSBnZXRTdGFydE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXROYW1lKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROb2RlVGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJc2IuYXBwZW5kKGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQocmVnaW9uKSk7Ci0JCX0KLQkJcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KGdldFN0YXJ0UmVnaW9uKCkpOwotCX0KLQotCS8vIHByaXZhdGUgUmVnaW9uIHN0YXJ0UmVnaW9uLGVuZFJlZ2lvbjsKLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0U3RhcnRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb25zLmdldCgwKTsKLQkJLy8gcmV0dXJuIHN0YXJ0UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZmxhdE5vZGUuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBmbGF0Tm9kZS4KLQkgKiAKLQkgKiBJU1NVRTpuYW1lZCBjaGFuZ2VkIG5vdCB0byBiZSBjb25mdXNlZCB3aXRoIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZAotCSAqIHN1cGVyIGNsYXNzIG1ldGhvZCwgYnV0IHNob3VsZCByZS10aGluayBpZiB0aGlzIGlzIGNvcnJlY3QgdGVjaG5pcXVlLgotCSAqIFBlcmhhcHMgZ2V0Rmlyc3RSZWdpb24/Ci0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLy8gcmV0dXJuIGVuZCBvZmZzZXQgaW5jbHVkaW5nIHdoaXRlc3BhY2UKLQkvLyBvciBqdXN0IHRoZSBlbmQgb2Zmc2V0IGlmIHRoZXJlIGlzIG5vIHdoaXRlc3BhY2UKLQlwdWJsaWMgaW50IGdldFdoaXRlc3BhY2VFbmRPZmZzZXQoKSB7Ci0JCWlmICh3aGl0ZXNwYWNlLnNpemUoKSA+IDApIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHdoaXRlc3BhY2UuZ2V0KHdoaXRlc3BhY2Uuc2l6ZSgpIC0gMSk7Ci0JCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHJlZ2lvbik7Ci0JCX0KLQotCQlyZXR1cm4gZ2V0RW5kT2Zmc2V0KCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzVHJhaWxpbmdXaGl0ZXNwYWNlKCkgewotCQlyZXR1cm4gd2hpdGVzcGFjZS5zaXplKCkgPiAwOwotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJjcmVhdGUgcmVnaW9uIGl0ZXIgIiArIHRoaXMuZ2V0Q2xhc3MoKSArICIgd2l0aAotCQkvLyBzdGFydCAsIGVuZCA9ICIgKyBnZXRTdGFydE9mZnNldCgpICsgIiwgIiArZ2V0RW5kT2Zmc2V0KCkpOwotCQlyZXR1cm4gbmV3IFJlZ2lvbkl0ZXJhdG9yKHJlZ2lvbnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0b3IsIGludCBzdGFydCwgaW50IGxlbmd0aCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJZ2V0RFRERmlsZSgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnQsIGxlbmd0aCwgbmV3VGV4dCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmFtZSkgewotCQlpZiAoIWdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gbmFtZVRva2VuLnVwZGF0ZVRleHQobmFtZSk7Ci0JCQkJZ2V0RFRERmlsZSgpLmdldERURE1vZGVsKCkuZ2V0UmVmZXJlbmNlVXBkYXRlcigpLm5hbWVBYm91dFRvQ2hhbmdlKHJlcXVlc3RvciwgdGhpcywgbmFtZSk7Ci0JCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRMZW5ndGgoKSwgbmFtZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRFREX05PREVfTkFNRV9DSEcpOyAvLyROT04tTkxTLTEkCi0JCXNldE5hbWUodGhpcywgbmFtZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGZsYXROb2RlLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZmxhdE5vZGUuIElTU1VFOm5hbWVkIGNoYW5nZWQgbm90IHRvIGJlCi0JICogICAgICAgICAgICBjb25mdXNlZCB3aXRoIGRlZmF1bHQgYWNjZXNzIHByb3RlY3RlZCBzdXBlciBjbGFzcyBtZXRob2QsCi0JICogICAgICAgICAgICBidXQgc2hvdWxkIHJlLXRoaW5rIGlmIHRoaXMgaXMgY29ycmVjdCB0ZWNobmlxdWUKLQkgKi8KLQl2b2lkIHNldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHYpIHsKLQkJdGhpcy5mbGF0Tm9kZSA9IHY7Ci0JfQotCi0JLy8gc2tpcHMgcGFzdCBuZXh0IG5hbWUgdG9rZW4gaW4gdGhlIGl0ZXJhdG9yCi0JcHJvdGVjdGVkIHZvaWQgc2tpcFBhc3ROYW1lKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjdXJyZW50UmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkgPT0gRFREUmVnaW9uVHlwZXMuTkFNRSkgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoamF2YS5sYW5nLlN0cmluZyBmZWF0dXJlLCBqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9EVERSZXNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2QyNDQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRFREUmVzb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgRFREUmVzb3VyY2UgewotCS8vIEVudW1lcmF0aW9uIENvbnN0YW50cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFOWUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9hbnkuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9hdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURUxJU1RJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX2xpc3QuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvY29tbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERGSUxFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L0RUREZpbGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVMRU1FTlRJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvZWxlbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRUxFTUVOVFJFRklDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X3JlZi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvZW1wdHljb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlSRUZFUkVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxEUl9BVFRMSVNUID0gImljb25zL2Z1bGwvb2JqMTYvZm9sZGVyX2F0dGxpc3Rfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX0NPTU0gPSAiaWNvbnMvZnVsbC9vYmoxNi9mb2xkZXJfY29tbWVudHNfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMRFJfRUwgPSAiaWNvbnMvZnVsbC9vYmoxNi9mbGRyX2VsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX0VOVCA9ICJpY29ucy9mdWxsL29iajE2L2ZsZHJfZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX05PVCA9ICJpY29ucy9mdWxsL29iajE2L2ZsZHJfbm90LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTERSX1VOUkVDID0gImljb25zL2Z1bGwvb2JqMTYvZmxkcl91bnJlYy5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVdIVE1MRk9STSA9ICJpY29ucy9mdWxsL29iajE2L2dlbmh0bWZvcm1fd2l6LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTklDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTkVDSE9JQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb25lY2hvaWNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRUNIT0lDRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vbmVvcm1vcmUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORU9STU9SRVNFUVVFTkNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZW9ybW9yZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9ORVNFUVVFTkNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L29uZXNlcXVlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPUFRJT05BTENIT0lDRUlDT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9vcHRpb25hbGNob2ljZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1BUSU9OQUxJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTkFMU0VRVUVOQ0VJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvb3B0aW9uYWxzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUENEQVRBSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5SRUNPR05JWkVESUNPTiA9ICJpY29ucy9mdWxsL29iajE2L3VucmVjb2duaXplZF9jb250ZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaRVJPT1JNT1JFQ0hPSUNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVjaG9pY2UuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpFUk9PUk1PUkVJQ09OID0gImljb25zL2Z1bGwvb2JqMTYvemVyb29ybW9yZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWkVST09STU9SRVNFUVVFTkNFSUNPTiA9ICJpY29ucy9mdWxsL29iajE2L3plcm9vcm1vcmVzZXF1ZW5jZS5naWYiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDkwNGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGV4dC5SZWdpb25JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIEVsZW1lbnQgZXh0ZW5kcyBOYW1lZFRvcExldmVsTm9kZSB7Ci0KLQlMaXN0IGF0dExpc3RMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JTGlzdCBhdHRyaWJ1dGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIENNTm9kZSBmQ29udGVudE1vZGVsOwotCi0JcHVibGljIEVsZW1lbnQoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGR0ZEZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQXR0cmlidXRlKFN0cmluZyBuYW1lKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9BRERfQVRUUik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCk7Ci0JCWlmIChhdHRMaXN0cy5zaXplKCkgPT0gMCkgewotCQkJZ2V0RFRERmlsZSgpLmNyZWF0ZUF0dHJpYnV0ZUxpc3QodGhpcywgZ2V0TmFtZSgpLCB0cnVlKTsKLQkJCWF0dExpc3RzID0gZ2V0QXR0cmlidXRlTGlzdHMoKTsKLQkJfQotCQlpZiAoYXR0TGlzdHMuc2l6ZSgpID4gMCkgewotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIGF0dExpc3RzLmdldChhdHRMaXN0cy5zaXplKCkgLSAxKTsKLQkJCWF0dExpc3QuYWRkQXR0cmlidXRlKG5hbWUpOwotCQl9Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDaGlsZCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5UX0FERF9DSElMRCk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQ29udGVudCh0aGlzLCAiIEVNUFRZIik7IC8vJE5PTi1OTFMtMSQKLQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIGNvbnRlbnQpIHsKLQkJSVRleHRSZWdpb24gd2hpdGVzcGFjZSA9IGdldFdoaXRlc3BhY2VBZnRlck5hbWUoKTsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmICh3aGl0ZXNwYWNlICE9IG51bGwpIHsKLQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQod2hpdGVzcGFjZSk7Ci0JCQlsZW5ndGggPSB3aGl0ZXNwYWNlLmdldExlbmd0aCgpID49IDIgPyAxIDogMDsKLQkJfQotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmFtZVJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbiBlbGVtZW50VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyk7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoZWxlbWVudFRhZyk7Ci0JCQl9Ci0JCX0KLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgbGVuZ3RoLCBjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRHcm91cCgpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTEVNRU5UX0FERF9HUlApOyAvLyROT04tTkxTLTEkCi0JCWFkZENvbnRlbnQodGhpcywgIiAoKSIpOyAvLyROT04tTkxTLTEkCi0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCXJldHVybiBuZXcgRWxlbWVudChkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXR0cmlidXRlTGlzdHMoKSB7Ci0JCWF0dExpc3RMaXN0LmNsZWFyKCk7Ci0JCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldE5hbWUoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGR0ZEZpbGUuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCAmJiBub2RlLmdldE5hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJYXR0TGlzdExpc3QuYWRkKG5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRMaXN0TGlzdDsKLQl9Ci0KLQotCi0JcHVibGljIENNTm9kZSBnZXRDb250ZW50TW9kZWwoKSB7Ci0JCS8vIE9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oKQotCQlyZXR1cm4gKENNTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOy8vIGNvbnRlbnRNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRFbGVtZW50QXR0cmlidXRlcygpIHsKLQkJYXR0cmlidXRlcy5jbGVhcigpOwotCQlJdGVyYXRvciBhdHRMaXN0cyA9IGdldEF0dHJpYnV0ZUxpc3RzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGF0dExpc3RzLmhhc05leHQoKSkgewotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIGF0dExpc3RzLm5leHQoKTsKLQotCQkJT2JqZWN0W10gY2hpbGRyZW4gPSBhdHRMaXN0LmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYXR0cmlidXRlcy5hZGQoY2hpbGRyZW5baV0pOwotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTEVNRU5USUNPTik7Ci0JfQotCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gTm9kZS5FTEVNRU5UX05PREU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVwbGFjZUNvbnRlbnRNb2RlbChPYmplY3QgcmVxdWVzdG9yLCBDTU5vZGUgbm9kZSkgewotCQlyZXBsYWNlQ29udGVudE1vZGVsKHJlcXVlc3Rvciwgbm9kZS5nZXROb2RlVGV4dCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlQ29udGVudE1vZGVsKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBub2RlVGV4dCkgewotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCUNNTm9kZSBjb250ZW50TW9kZWwgPSBnZXRDb250ZW50TW9kZWwoKTsKLQkJaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBjb250ZW50TW9kZWwuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IGNvbnRlbnRNb2RlbC5nZXRXaGl0ZXNwYWNlRW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIG9mZnNldCwgbGVuZ3RoLCBub2RlVGV4dCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRDb250ZW50KHJlcXVlc3Rvciwgbm9kZVRleHQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzb2x2ZVJlZ2lvbnMoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZWxlbWVudCBub2RlIHN0cmVhbSA9ICIgKwotCQkvLyB0b2tlblN0cmVhbS5nZXRTdHJpbmcoKSk7Ci0JCWZDb250ZW50TW9kZWwgPSBudWxsOwotCQlyZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCWlmIChnZXROYW1lUmVnaW9uKCkgIT0gbnVsbCkgewotCQkJLy8gd2Ugc2tpcCBwYXN0IHRoZSBuYW1lIHRva2VuIGlzIG91ciBuYW1lCi0JCQlza2lwUGFzdE5hbWUoaXRlcik7Ci0JCX0KLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIGN1cnJlbnRSZWdpb24gPSBpdGVyLm5leHQoKTsKLQotCQkJaWYgKGZDb250ZW50TW9kZWwgPT0gbnVsbCkgewotCQkJCWlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCQkJZkNvbnRlbnRNb2RlbCA9IG5ldyBDTUJhc2ljTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTlRFTlRfUENEQVRBKSkgewotCQkJCQlmQ29udGVudE1vZGVsID0gbmV3IENNQmFzaWNOb2RlKGdldERUREZpbGUoKSwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChjdXJyZW50UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTikpIHsKLQkJCQkJZkNvbnRlbnRNb2RlbCA9IG5ldyBDTUdyb3VwTm9kZShnZXREVERGaWxlKCksIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChmQ29udGVudE1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoIWN1cnJlbnRSZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5FTkRfVEFHKSkgewotCQkJCQkvLyBjb250ZW50IG1vZGVsIGdldHMgYWxsIHJlZ2lvbnMgZXhjZXB0IGZvciB0aGUgJz4nCi0JCQkJCWZDb250ZW50TW9kZWwuYWRkUmVnaW9uKGN1cnJlbnRSZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gaWYgaXQgaXMgZXF1YWwgdG8gdGhlIGVuZCB0YWcsIHRoZW4gZG9uJ3QgYWRkIGFueW1vcmUKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyBmb3IgdGhlIGNvbnRlbnQgbW9kZWwKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQl9Ci0KLQkJfQotCQlpZiAoZkNvbnRlbnRNb2RlbCAhPSBudWxsKSB7Ci0JCQlhcHBlbmRDaGlsZChmQ29udGVudE1vZGVsKTsKLQkJCS8vIHRoaXMgaXMgdGhlIHJvb3QgZWxlbWVudCBjb250ZW50IHNvIHNldCBpdCB0cnVlCi0JCQlmQ29udGVudE1vZGVsLnNldFJvb3RFbGVtZW50Q29udGVudCh0cnVlKTsKLQkJCS8vIG5vdyB0ZWxsIHRoZSBjb250ZW50IG1vZGVsIHRvIHJlc29sdmUgaXQncyByZWdpb25zCi0JCQlmQ29udGVudE1vZGVsLnJlc29sdmVSZWdpb25zKCk7Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRNb2RlbChDTU5vZGUgY29udGVudE1vZGVsKSB7Ci0JCXRoaXMuZkNvbnRlbnRNb2RlbCA9IGNvbnRlbnRNb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9FbnRpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVkMmY0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0VudGl0eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuUmVnaW9uSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vLyBleHRlcm5hbCBub2RlIGNvbnRhaW5zIGNvZGUgdG8gaGVscCBzZXQgYW5kIGdldCBwdWJsaWMgaWRzCi1wdWJsaWMgY2xhc3MgRW50aXR5IGV4dGVuZHMgRXh0ZXJuYWxOb2RlIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBzZXRFeHRlcm5hbEVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9FWFRfRU5USVRZOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldEdlbmVyYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfR0VORVJBTF9FTlRJVFk7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2V0SW50ZXJuYWxFbnRpdHkgPSBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9TRVRfSU5UX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNldFBhcmFtZXRlckVudGl0eSA9IERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1NFVF9QQVJNX0VOVElUWTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIEVudGl0eShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUsIERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5FTlRJVFlJQ09OKTsKLQl9Ci0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm90YXRpb25OYW1lKCkgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUpOwotCQlpZiAobmRhdGFSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFRleHQobmRhdGFSZWdpb24pOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRQZXJjZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHZhbHVlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgdmFsdWUuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJaWYgKCFpc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcmF0b3IoKSk7Ci0JCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRWYWx1ZUZyb21RdW90ZWRSZWdpb24odmFsdWVSZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgZXh0ZXJuYWxFbnRpdHkuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBleHRlcm5hbEVudGl0eS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KCkgewotCQlyZXR1cm4gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKSAhPSBudWxsIHx8IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHkoKSB7Ci0JCXJldHVybiBnZXRQZXJjZW50UmVnaW9uKCkgIT0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlTkRhdGEoT2JqZWN0IHJlcXVlc3RvcikgewotCQlJVGV4dFJlZ2lvbiBuZGF0YVJlZ2lvbiA9IG51bGw7Ci0KLQkJLy8gc2VlIGlmIHdlIGhhdmUgYW4gTkRBVEEga2V5d29yZAotCQluZGF0YVJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuTkRBVEFfS0VZV09SRCk7Ci0JCWludCBzdGFydE9mZnNldCA9IDAsIGVuZE9mZnNldCA9IDA7Ci0JCWlmIChuZGF0YVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KG5kYXRhUmVnaW9uKTsKLQkJCWVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuZGF0YVJlZ2lvbik7Ci0JCX0KLQkJSVRleHRSZWdpb24gdmFsdWUgPSBnZXROZXh0UmVnaW9uKGl0ZXJhdG9yKCksIERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCWlmIChzdGFydE9mZnNldCA9PSAwKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCh2YWx1ZSk7Ci0JCQl9Ci0JCQllbmRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQodmFsdWUpOwotCQl9Ci0JCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGV4dGVybmFsRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gZXh0ZXJuYWxFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RXh0ZXJuYWxFbnRpdHkoYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5KSB7Ci0JCWlmIChpc0V4dGVybmFsRW50aXR5KCkgIT0gaXNFeHRlcm5hbEVudGl0eSkgewotCQkJLy8gZXh0ZXJuYWxFbnRpdHkgPSB2OwotCQkJYmVnaW5SZWNvcmRpbmcodGhpcywgaXNFeHRlcm5hbEVudGl0eSA/IHNldEV4dGVybmFsRW50aXR5IDogc2V0SW50ZXJuYWxFbnRpdHkpOwotCQkJaWYgKGlzRXh0ZXJuYWxFbnRpdHkpIHsKLQkJCQkvLyB3ZSBuZWVkIHRvIGdldCByaWQgb2YgdGhlIHZhbHVlIGxpdGVyYWwKLQkJCQlJVGV4dFJlZ2lvbiBxdW90ZSA9IGdldE5leHRSZWdpb24oaXRlcmF0b3IoKSwgRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpOwotCQkJCWlmIChxdW90ZSA9PSBudWxsKSB7Ci0JCQkJCXF1b3RlID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7Ci0JCQkJfQotCQkJCWlmIChxdW90ZSAhPSBudWxsKSB7Ci0JCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHF1b3RlKSwgcXVvdGUuZ2V0TGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlzZXRTeXN0ZW1JRCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG5lZWQgdG8gZ2V0IHJpZCBvZiB0ZXh0IGJldHdlZW4gZW5kIG9mIG5hbWUgcmVnaW9uIGFuZAotCQkJCS8vIHRoZSBsYXN0IGRvdWJsZSBxdW90ZWQgbGl0ZXJhbAotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIGtleXdvcmQgPSBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJaW50IGxlbmd0aCA9IDA7Ci0JCQkJaWYgKGtleXdvcmQgPT0gbnVsbCkgewotCQkJCQkvLyByZXNldCB0aGUgaXRlcmF0b3IKLQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCWtleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXIpOwotCQkJCX0KLQkJCQlpZiAoa2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoa2V5d29yZCk7Ci0JCQkJCS8vIHN0YXJ0IHdpdGggYSBsZW5ndGgganVzdCBlcXVhbCB0byB0aGUga2V5d29yZCBmb3Igbm93Ci0JCQkJCWxlbmd0aCA9IGtleXdvcmQuZ2V0TGVuZ3RoKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyByZXNldCB0aGUgaXRlcmF0b3Igc2luY2Ugd2UgZGlkbid0IGZpbmQgdGhlIGtleXdvcmQKLQkJCQkJaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCS8vIGp1c3QgZ28gZnJvbSBhZnRlciB0aGUgbmFtZQotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChnZXROYW1lUmVnaW9uKCkpOwotCQkJCX0KLQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIHN0YXJ0LCBsb29rIGZvciB0aGUgZW5kCi0JCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IG51bGw7Ci0KLQkJCQlpZiAobGFzdFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIHRoZW4gbG9vayBmb3IgbGFzdCBxdW90ZWQgbGl0ZXJhbAotCQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCWlmIChsaXRlcmFsICE9IG51bGwpIHsKLQkJCQkJCQlsYXN0UmVnaW9uID0gbGl0ZXJhbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJbGVuZ3RoID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RSZWdpb24pIC0gc3RhcnRPZmZzZXQ7Ci0JCQkJfQotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIHN0YXJ0T2Zmc2V0LCBsZW5ndGgsICJcIlwiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZW1vdmVORGF0YSh0aGlzKTsKLQkJCX0KLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgbmV3Tm90YXRpb24pIHsKLQkJaWYgKCFnZXROb3RhdGlvbk5hbWUoKS5lcXVhbHMobmV3Tm90YXRpb24pKSB7Ci0JCQlpZiAoIW5ld05vdGF0aW9uLmVxdWFscygiIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIAotCQkJCUlUZXh0UmVnaW9uIG5kYXRhUmVnaW9uID0gZ2V0TmV4dFJlZ2lvbihpdGVyYXRvcigpLCBEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7Ci0JCQkJaWYgKG5kYXRhUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChuZGF0YVJlZ2lvbiksIG5kYXRhUmVnaW9uLmdldExlbmd0aCgpLCBuZXdOb3RhdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBvbmUKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJU3RyaW5nIHN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCQlJVGV4dFJlZ2lvbiBuZGF0YUtleXdvcmQgPSBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOwotCQkJCQlpZiAobmRhdGFLZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCS8vIHdlJ2xsIG5lZWQgdG8gY3JlYXRlIG9uZSBhZnRlciB0aGUgbGFzdCBxdW90ZWQKLQkJCQkJCS8vIGxpdGVyYWwKLQkJCQkJCS8vIFJlc2V0IGl0ZXJhdG9yCi0JCQkJCQlzdHJpbmcgKz0gIiBOREFUQSAiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQkJCUlUZXh0UmVnaW9uIGxhc3RRdW90ZWRMaXRlcmFsID0gbnVsbDsKLQkJCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQkJCUlUZXh0UmVnaW9uIGxpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCQkJCQlpZiAobGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkJCWxhc3RRdW90ZWRMaXRlcmFsID0gbGl0ZXJhbDsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAobGFzdFF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCQkJCXN0YXJ0T2Zmc2V0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KGxhc3RRdW90ZWRMaXRlcmFsKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNyZWF0ZWQgYWZ0ZXIgdGhlIHN5c3RlbSBvciBwdWJsaWMga2V5d29yZAotCQkJCQkJCUlUZXh0UmVnaW9uIGtleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJCQkJCWlmIChrZXl3b3JkID09IG51bGwpIHsKLQkJCQkJCQkJa2V5d29yZCA9IGdldFN5c3RlbUtleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHdlIHNob3VsZG4ndCBiZSBudWxsIGhlcmUgc2luY2Ugd2UgY2hlY2sgaWYgd2UKLQkJCQkJCQkvLyB3ZXJlIGV4dGVybmFsIGFscmVhZHkKLQkJCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChrZXl3b3JkKTsKLQkJCQkJCX0KLQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQobmRhdGFLZXl3b3JkKTsKLQkJCQkJfQotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIHN0YXJ0T2Zmc2V0LCAwLCBzdHJpbmcgKyBuZXdOb3RhdGlvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbmVlZCB0byByZW1vdmUgdGhlIG5kYXRhIHN0dWZmCi0JCQkJcmVtb3ZlTkRhdGEocmVxdWVzdG9yKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygbm90YXRpb25OYW1lLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb3RhdGlvbgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIG5vdGF0aW9uTmFtZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb3RhdGlvbk5hbWUoU3RyaW5nIG5ld05vdGF0aW9uKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsICJOREFUQSAiICsgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfTkRBVEFfQ0hBTkdFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXNldE5vdGF0aW9uTmFtZSh0aGlzLCBuZXdOb3RhdGlvbik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIGlzUGFyYW1ldGVyRW50aXR5LgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gaXNQYXJhbWV0ZXJFbnRpdHkuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyRW50aXR5KGJvb2xlYW4gdikgewotCQlpZiAoaXNQYXJhbWV0ZXJFbnRpdHkoKSAhPSB2KSB7Ci0JCQliZWdpblJlY29yZGluZyh0aGlzLCB2ID8gc2V0UGFyYW1ldGVyRW50aXR5IDogc2V0R2VuZXJhbEVudGl0eSk7Ci0JCQlpZiAodikgewotCQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJCUlUZXh0UmVnaW9uIHN0YXJ0VGFnID0gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsKLQkJCQlpbnQgc3RhcnRPZmZzZXQgPSAwLCBsZW5ndGggPSAwOwotCi0JCQkJaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCQlzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0JCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UgJiYgcmVnaW9uLmdldExlbmd0aCgpID4gMSkgewotCQkJCQkJbGVuZ3RoID0gMTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoc3RhcnRUYWcpOwotCQkJCX0KLQkJCQlyZXBsYWNlVGV4dCh0aGlzLCBzdGFydE9mZnNldCwgbGVuZ3RoLCAiICUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIG5vdyBnZXQgcmlkIG9mIGFueSBORGF0YSBzaW5jZSBpdCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlCi0JCQkJLy8gZW50aXR5IGlzIGEgZ2VuZXJhbCBlbnRpdHkgYW5kIG5vdCBhIHBhcmFtZXRlciBlbnRpdHkKLQkJCQlyZW1vdmVORGF0YSh0aGlzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGdldCByaWQgb2YgcGVyY2VudCByZWdpb24KLQkJCQlJVGV4dFJlZ2lvbiBwZXJjZW50UmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCXJlcGxhY2VUZXh0KHRoaXMsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHBlcmNlbnRSZWdpb24pLCBwZXJjZW50UmVnaW9uLmdldExlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJZW5kUmVjb3JkaW5nKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyB2KSB7Ci0JCWlmICghaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQlpZiAoIWdldFZhbHVlKCkuZXF1YWxzKHYpKSB7Ci0JCQkJLy8gdGhlbiBpdCBtYWtlcyBzZW5zZSB0byBjaGFuZ2UgdGhlIHZhbHVlCi0JCQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyYXRvcigpKTsKLQkJCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSwgdmFsdWVSZWdpb24uZ2V0TGVuZ3RoKCksIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuTkFNRSk7Ci0JCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gY3JlYXRlIGl0IGFmdGVyIHRoZSBwZXJjZW50IGlmIHRoZXJlIGlzIG9uZQotCQkJCQkJcmVnaW9uID0gZ2V0UGVyY2VudFJlZ2lvbigpOwotCQkJCQl9Ci0JCQkJCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJCQkJLy8gaWYgc3RpbGwgbnVsbCwgdGhlbiBjcmVhdGUgaXQgYWZ0ZXIgdGhlIGVsZW1lbnQgdGFnCi0JCQkJCQlyZWdpb24gPSBnZXRTdGFydFRhZyhpdGVyYXRvcigpKTsKLQkJCQkJfQotCi0JCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQkJc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQocmVnaW9uKTsKLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3Rvciwgc3RhcnRPZmZzZXQsIDAsIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiB2YWx1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHZhbHVlLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VmFsdWUodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL0V4dGVybmFsTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2Y3MDlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvRXh0ZXJuYWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gYmFzZSBjbGFzcyBmb3Igbm9kZXMgdGhhdCBjYW4gY29udGFpbiBleHRlcm5hbCBjb250ZW50Ci1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgRXh0ZXJuYWxOb2RlIGV4dGVuZHMgTmFtZWRUb3BMZXZlbE5vZGUgewotCi0JU3RyaW5nIHB1YmxpY0lEOwotCi0JU3RyaW5nIHN5c3RlbUlEOwotCi0JcHVibGljIEV4dGVybmFsTm9kZShEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIFN0cmluZyB0YWdUeXBlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCB0YWdUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmV4dFF1b3RlZExpdGVyYWwoUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKSB8fCByZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgcHVibGljSUQuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lEKCkgewotCQlJVGV4dFJlZ2lvbiBwdWJsaWNWYWx1ZSA9IGdldFB1YmxpY1ZhbHVlUmVnaW9uKCk7Ci0JCWlmIChwdWJsaWNWYWx1ZSAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gZ2V0VmFsdWVGcm9tUXVvdGVkUmVnaW9uKHB1YmxpY1ZhbHVlKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UHVibGljS2V5d29yZFJlZ2lvbihSZWdpb25JdGVyYXRvciBpdGVyKSB7Ci0JCXJldHVybiBnZXROZXh0UmVnaW9uKGl0ZXIsIERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JEKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UHVibGljVmFsdWVSZWdpb24oKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCi0JCUlUZXh0UmVnaW9uIHB1YmxpY0tleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXIpOwotCi0JCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHF1b3RlZExpdGVyYWwgPSBnZXROZXh0UXVvdGVkTGl0ZXJhbChpdGVyKTsKLQkJCWlmIChxdW90ZWRMaXRlcmFsICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gcXVvdGVkTGl0ZXJhbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHN5c3RlbUlELgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JRCgpIHsKLQkJSVRleHRSZWdpb24gc3lzdGVtVmFsdWUgPSBnZXRTeXN0ZW1WYWx1ZVJlZ2lvbigpOwotCQlpZiAoc3lzdGVtVmFsdWUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbihzeXN0ZW1WYWx1ZSk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN5c3RlbUtleXdvcmRSZWdpb24oUmVnaW9uSXRlcmF0b3IgaXRlcikgewotCQlyZXR1cm4gZ2V0TmV4dFJlZ2lvbihpdGVyLCBEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN5c3RlbVZhbHVlUmVnaW9uKCkgewotCQlSZWdpb25JdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQotCQlJVGV4dFJlZ2lvbiBzeXN0ZW1LZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyKTsKLQkJaWYgKHN5c3RlbUtleXdvcmQgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCkgewotCQkJCXJldHVybiBxdW90ZWRMaXRlcmFsOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdHJ5IGFuZCBzZWUgaWYgdGhlcmUgaXMgYSBzZWNvbmQgcXVvdGVkIGxpdGVyYWwgYWZ0ZXIgYSBwdWJsaWMKLQkJCS8vIGtleXdvcmQKLQkJCWl0ZXIgPSBpdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcik7Ci0KLQkJCWlmIChwdWJsaWNLZXl3b3JkICE9IG51bGwgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiBxdW90ZWRMaXRlcmFsID0gZ2V0TmV4dFF1b3RlZExpdGVyYWwoaXRlcik7Ci0JCQkJaWYgKHF1b3RlZExpdGVyYWwgIT0gbnVsbCAmJiBpdGVyLmhhc05leHQoKSkgewotCQkJCQkvLyBub3cgZ2V0IHRoZSBzZWNvbmQgcXVvdGVkIGxpdGVyYWwKLQkJCQkJcXVvdGVkTGl0ZXJhbCA9IGdldE5leHRRdW90ZWRMaXRlcmFsKGl0ZXIpOwotCQkJCQlpZiAocXVvdGVkTGl0ZXJhbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBnb3QgaXQhCi0JCQkJCQlyZXR1cm4gcXVvdGVkTGl0ZXJhbDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlRnJvbVF1b3RlZFJlZ2lvbihJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQlpZiAodHlwZS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuU0lOR0xFUVVPVEVEX0xJVEVSQUwpIHx8IHR5cGUuZXF1YWxzKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKSkgewotCQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMSwgdGV4dC5sZW5ndGgoKSAtIDEpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgcHVibGljSUQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBwdWJsaWNJRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJRChPYmplY3QgcmVxdWVzdG9yLCBTdHJpbmcgdikgewotCQlpZiAoIXYuZXF1YWxzKHB1YmxpY0lEKSkgewotCQkJcHVibGljSUQgPSB2OwotCQkJSVRleHRSZWdpb24gcHVibGljVmFsdWUgPSBnZXRQdWJsaWNWYWx1ZVJlZ2lvbigpOwotCQkJSVRleHRSZWdpb24gcHVibGljS2V5d29yZCA9IGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSk7Ci0JCQlJVGV4dFJlZ2lvbiBzeXN0ZW1LZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQkJCUlUZXh0UmVnaW9uIHN5c3RlbVZhbHVlID0gZ2V0U3lzdGVtVmFsdWVSZWdpb24oKTsKLQotCQkJaWYgKHYuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHB1YmxpY0tleXdvcmQgIT0gbnVsbCkgewotCQkJCQkvLyB0aW1lIHRvIGdldCByaWQgb2YgdGhlIHB1YmxpYyBrZXl3b3JkIGFuZCB2YWx1ZQotCQkJCQkvLyBhbmQgcmVwbGFjZSBpdCB3aXRoIHRoZSBzeXN0ZW0gb25lCi0JCQkJCWludCBzdGFydE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KHB1YmxpY0tleXdvcmQpOwotCQkJCQlTdHJpbmcgbmV3U3RyaW5nID0gIlNZU1RFTSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKHN5c3RlbVZhbHVlID09IG51bGwpIHsKLQkJCQkJCW5ld1N0cmluZyArPSAiIFwiXCIiOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBzdGFydE9mZnNldCwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHB1YmxpY1ZhbHVlKSAtIHN0YXJ0T2Zmc2V0LCBuZXdTdHJpbmcpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGhlcmUgd2VyZSBzZXR0aW5nIGEgbm9uIGVtcHR5IHZhbHVlCi0JCQkJU3RyaW5nIHF1b3RlQ2hhciA9IHYuaW5kZXhPZigiXCIiKSA9PSAtMSA/ICJcIiIgOiAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJaWYgKHB1YmxpY1ZhbHVlICE9IG51bGwpIHsKLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChwdWJsaWNWYWx1ZSksIHB1YmxpY1ZhbHVlLmdldExlbmd0aCgpLCBxdW90ZUNoYXIgKyBwdWJsaWNJRCArIHF1b3RlQ2hhcik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aW1lIHRvIGNyZWF0ZSBzdHVmZgotCQkJCQlpZiAocHVibGljS2V5d29yZCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0aGVuIGp1c3QgcHV0IG91ciBuZXcgdmFsdWUgYWZ0ZXIgdGhlIGtleXdvcmQKLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHB1YmxpY0tleXdvcmQpLCAwLCAiICIgKyBxdW90ZUNoYXIgKyB2ICsgcXVvdGVDaGFyKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gd2UgbmVlZCB0aGUgcHVibGljIGtleXdvcmQgYXMgd2VsbAotCQkJCQkJaWYgKHN5c3RlbUtleXdvcmQgIT0gbnVsbCkgewotCQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoc3lzdGVtS2V5d29yZCksIHN5c3RlbUtleXdvcmQuZ2V0TGVuZ3RoKCksICJQVUJMSUMgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KG5hbWVSZWdpb24pLCAwLCAiIFBVQkxJQyAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBwdWJsaWNJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdgotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHB1YmxpY0lELgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lEKFN0cmluZyB2KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfRVhUX05PREVfUFVCTElDX0lEX0NIRyk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0UHVibGljSUQodGhpcywgdik7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHZhbHVlIG9mIHN5c3RlbUlELgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gc3lzdGVtSUQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3lzdGVtSUQoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIHYpIHsKLQkJaWYgKCF2LmVxdWFscyhzeXN0ZW1JRCkgfHwgKGdldFB1YmxpY0tleXdvcmRSZWdpb24oaXRlcmF0b3IoKSkgPT0gbnVsbCAmJiBnZXRTeXN0ZW1LZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpID09IG51bGwpKSB7Ci0JCQlzeXN0ZW1JRCA9IHY7Ci0JCQlTdHJpbmcgcXVvdGVDaGFyID0gdi5pbmRleE9mKCJcIiIpID09IC0xID8gIlwiIiA6ICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCUlUZXh0UmVnaW9uIHN5c3RlbVZhbHVlID0gZ2V0U3lzdGVtVmFsdWVSZWdpb24oKTsKLQkJCWlmIChzeXN0ZW1WYWx1ZSAhPSBudWxsKSB7Ci0JCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChzeXN0ZW1WYWx1ZSksIHN5c3RlbVZhbHVlLmdldExlbmd0aCgpLCBxdW90ZUNoYXIgKyBzeXN0ZW1JRCArIHF1b3RlQ2hhcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJVGV4dFJlZ2lvbiBzeXN0ZW1LZXl3b3JkID0gZ2V0U3lzdGVtS2V5d29yZFJlZ2lvbihpdGVyYXRvcigpKTsKLQotCQkJCS8vIHRpbWUgdG8gY3JlYXRlIHN0dWZmCi0JCQkJaWYgKHN5c3RlbUtleXdvcmQgIT0gbnVsbCkgewotCQkJCQkvLyB0aGVuIGp1c3QgcHV0IG91ciBuZXcgdmFsdWUgYWZ0ZXIgdGhlIGtleXdvcmQKLQkJCQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoc3lzdGVtS2V5d29yZCksIDAsICIgIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBzZWUgaWYgd2UgaGF2ZSBhIHB1YmxpYyBrZXl3b3JkCi0JCQkJCUlUZXh0UmVnaW9uIHB1YmxpY0tleXdvcmQgPSBnZXRQdWJsaWNLZXl3b3JkUmVnaW9uKGl0ZXJhdG9yKCkpOwotCQkJCQlpZiAocHVibGljS2V5d29yZCA9PSBudWxsKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gZ2V0TmFtZVJlZ2lvbigpOwotCi0JCQkJCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChuYW1lUmVnaW9uKSwgMCwgIiBTWVNURU0gIiArIHF1b3RlQ2hhciArIHYgKyBxdW90ZUNoYXIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBwdXQgaXQgYWZ0ZXIgdGhlIHB1YmxpYyB2YWx1ZSByZWdpb24KLQkJCQkJCUlUZXh0UmVnaW9uIHB1YmxpY1ZhbHVlUmVnaW9uID0gZ2V0UHVibGljVmFsdWVSZWdpb24oKTsKLQkJCQkJCXJlcGxhY2VUZXh0KHJlcXVlc3RvciwgZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KHB1YmxpY1ZhbHVlUmVnaW9uKSwgMCwgIiAiICsgcXVvdGVDaGFyICsgdiArIHF1b3RlQ2hhcik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2Ygc3lzdGVtSUQuCi0JICogCi0JICogQHBhcmFtIHYKLQkgKiAgICAgICAgICAgIFZhbHVlIHRvIGFzc2lnbiB0byBzeXN0ZW1JRC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JRChTdHJpbmcgdikgewotCQliZWdpblJlY29yZGluZyh0aGlzLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX0VYVF9OT0RFX1NZU1RFTV9JRF9DSEcpOyAvLyROT04tTkxTLTEkCi0JCXNldFN5c3RlbUlEKHRoaXMsIHYpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3M2JhZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTmFtZWRUb3BMZXZlbE5vZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTmFtZWRUb3BMZXZlbE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzMGNkMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05hbWVkVG9wTGV2ZWxOb2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gaW50ZXJmYWNlIGZvciBub2RlcyB0aGF0IGNhbiBleGlzdCBhdCB0aGUgdG9wIGxldmVsIGluIGEgZHRkZmlsZQotLy8gZWcuIGVudGl0eSwgbm90YXRpb24sIGVsZW1lbnQsIGNvbW1lbnQsIGF0dGxpc3QsIG9yIHVucmVjb2duaXplZCBzdHVmZiAoaWUKLS8vIDxqdW5rIGRrZmpkbD4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBOYW1lZFRvcExldmVsTm9kZSBleHRlbmRzIFRvcExldmVsTm9kZSB7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWdTdGFydFR5cGU7Ci0KLQlwdWJsaWMgTmFtZWRUb3BMZXZlbE5vZGUoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlcihkdGRGaWxlLCBmbGF0Tm9kZSk7Ci0JCXRhZ1N0YXJ0VHlwZSA9IHR5cGU7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oKSB7Ci0JCS8vIG5hbWUgcmVnaW9uIGlzIGxvY2F0ZWQgYWZ0ZXIgdGhlIHdoaXRlc3BhY2UgKHdoaWNoIGlzIGFmdGVyCi0JCS8vIHRoZSBlbGVtZW50dGFnCi0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlnZXROZXh0UmVnaW9uKGl0ZXIsIHRhZ1N0YXJ0VHlwZSk7Ci0KLQkJaWYgKCFpdGVyLmhhc05leHQoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJaWYgKCFyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQotCQkvLyB3ZSBub3JtYWxseSBzdG9wIGhlcmUsIGJ1dCBmb3IgZW50aXRpZXMsIHdlIGhhdmUgdG8gc2VlIGlmIHdlIGFyZQotCQkvLyBhdCBhICclJy4gaWYgc28sIHdlIHNraXAgdGhhdCBhbmQgZmluZCB0aGUgbmFtZSBhZnRlciB0aGUKLQkJLy8gd2hpdGVzcGFjZSBhZ2FpbgotCQlpZiAodGFnU3RhcnRUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcgJiYgcmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCkgJiYgaXRlci5oYXNOZXh0KCkpIHsKLQkJCXJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCi0JCQlpZiAoIXJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCWlmICghaXRlci5oYXNOZXh0KCkpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJcmVnaW9uID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuTkFNRSkpIHsKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFN0YXJ0VGFnKFJlZ2lvbkl0ZXJhdG9yIGl0ZXIpIHsKLQkJcmV0dXJuIGdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0V2hpdGVzcGFjZUFmdGVyTmFtZSgpIHsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGdldE5hbWVSZWdpb24oKTsKLQkJUmVnaW9uSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCS8vIHNraXAgcGFzdCB0aGUgZWxlbWVudCB0YWcgcmVnaW9uCi0JCWdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQkJYm9vbGVhbiBmb3VuZE5hbWUgPSBmYWxzZTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBpdGVyLm5leHQoKTsKLQkJCWlmICghZm91bmROYW1lICYmIG5hbWVSZWdpb24gIT0gbnVsbCAmJiByZWdpb24gPT0gbmFtZVJlZ2lvbikgewotCQkJCWZvdW5kTmFtZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCS8vIHRoZXJlIGlzIG5vIG5hbWUgcmVnaW9uIG9yIHdlIGhhdmUgYWxyZWFkeSBwYXNzZWQgaXQKLQkJCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsIHx8IGZvdW5kTmFtZSkgewotCQkJCQlyZXR1cm4gcmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lKE9iamVjdCByZXF1ZXN0b3IsIFN0cmluZyBuYW1lKSB7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBnZXROYW1lUmVnaW9uKCk7Ci0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXN1cGVyLnNldE5hbWUocmVxdWVzdG9yLCBuYW1lKTsKLQkJfQotCQllbHNlIHsKLQkJCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gZWxlbWVudFRhZ1JlZ2lvbiA9IGdldE5leHRSZWdpb24oaXRlciwgdGFnU3RhcnRUeXBlKTsKLQkJCWludCByZXBsYWNlTGVuZ3RoID0gMDsKLQkJCWlmIChpdGVyLmhhc05leHQoKSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGl0ZXIubmV4dCgpOwotCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpLmVxdWFscyhEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKSkgewotCQkJCQlpZiAocmVnaW9uLmdldExlbmd0aCgpID49IDIpIHsKLQkJCQkJCS8vIHRoZXJlIGFyZSAyIHNwYWNlcyBiZXR3ZWVuICdFTEVNRU5UJyBhbmQgdGhlCi0JCQkJCQkvLyBjb250ZW50Ci0JCQkJCQkvLyBDaGFuZ2UgcmVwbGFjZSBsZW5ndGggdG8gMSBzbyB0aGF0IHRoZSBuZXcgbmFtZSBhbmQKLQkJCQkJCS8vIHRoZSBjb250ZW50IGFyZSBzZXBhcmF0ZWQgYnkgYSBzaW5nbGUgc3BhY2UKLQkJCQkJCXJlcGxhY2VMZW5ndGggPSAxOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBiZWdpblJlY29yZGluZyhyZXF1ZXN0b3IsICJOYW1lIENoYW5nZSIpOwotCQkJU3RyaW5nIG5ld1RleHQgPSAiICIgKyBuYW1lOyAvLyROT04tTkxTLTEkCi0JCQlyZXBsYWNlVGV4dChyZXF1ZXN0b3IsIGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbGVtZW50VGFnUmVnaW9uKSwgcmVwbGFjZUxlbmd0aCwgbmV3VGV4dCk7Ci0JCQkvLyBlbmRSZWNvcmRpbmcocmVxdWVzdG9yKTsKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob2RlTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTg0MTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvTm9kZUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci0KLQotcHVibGljIGNsYXNzIE5vZGVMaXN0IHsKLQlwcm90ZWN0ZWQgRFRERmlsZSBkdGRGaWxlOwotCi0JQXJyYXlMaXN0IGxpc3ROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBTdHJpbmcgbGlzdFR5cGU7Ci0KLQlwdWJsaWMgTm9kZUxpc3QoRFRERmlsZSBkdGRGaWxlLCBTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWxpc3RUeXBlID0gdG9rZW5UeXBlOwotCQl0aGlzLmR0ZEZpbGUgPSBkdGRGaWxlOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfRUwpOwotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRkxEUl9FTlQpOwotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX05PVCk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCkgewotCQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5GTERSX0NPTU0pOwotCQl9Ci0JCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfQVRUTElTVCk7Ci0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKSB7Ci0JCQlyZXR1cm4gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKERURFJlc291cmNlLkZMRFJfVU5SRUMpOwotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGlzdFR5cGUoKSB7Ci0JCXJldHVybiBsaXN0VHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRykgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX0VMRU1FTlRTOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRykgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX0VOVElUSUVTOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfTk9UQVRJT05TOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCkgewotCQkJcmV0dXJuIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfTk9ERV9MSVNUX0NPTU1FTlRTOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpIHsKLQkJCXJldHVybiBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX05PREVfTElTVF9BVFRSSUJVVEVTOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKSB7Ci0JCQlyZXR1cm4gRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9OT0RFX0xJU1RfT1RIRVI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgQXJyYXlMaXN0IGdldE5vZGVzKCkgewotCQlsaXN0Tm9kZXMuY2xlYXIoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGR0ZEZpbGUuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTEVNRU5UX1RBRyAmJiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcgJiYgbm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyAmJiBub2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJbGlzdE5vZGVzLmFkZChub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxpc3RUeXBlID09IERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyAmJiBub2RlIGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCQlsaXN0Tm9kZXMuYWRkKG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobGlzdFR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCAmJiBub2RlIGluc3RhbmNlb2YgQ29tbWVudCkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChsaXN0VHlwZSA9PSBEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQgJiYgbm9kZSBpbnN0YW5jZW9mIFVucmVjb2duaXplZCkgewotCQkJCWxpc3ROb2Rlcy5hZGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGxpc3ROb2RlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL05vdGF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5YTFhYzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ob3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBOb3RhdGlvbiBleHRlbmRzIEV4dGVybmFsTm9kZSB7Ci0KLQlwdWJsaWMgTm90YXRpb24oRFRERmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGZpbGUsIGZsYXROb2RlLCBEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5OT1RBVElPTklDT04pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1BhcmFtZXRlckVudGl0eVJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDUxYTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBleHRlbmRzIE5hbWVkVG9wTGV2ZWxOb2RlIHsKLQotCi0KLQlwdWJsaWMgY2xhc3MgU3RhcnRFbmRQYWlyIHsKLQkJcHVibGljIGludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCX0KLQotCXByaXZhdGUgRW50aXR5IGNhY2hlZEVudGl0eSA9IG51bGw7Ci0KLQlwdWJsaWMgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKERUREZpbGUgZmlsZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlcihmaWxlLCBmbGF0Tm9kZSwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCk7Ci0JfQotCi0JcHVibGljIEVudGl0eSBnZXRFbnRpdHlPYmplY3QoKSB7Ci0JCWlmIChjYWNoZWRFbnRpdHkgIT0gbnVsbCAmJiAhY2FjaGVkRW50aXR5LmdldE5hbWUoKS5lcXVhbHMoZ2V0UmVmZXJlbmNlZEVudGl0eSgpKSkgewotCQkJLy8gaWYgd2UgaGF2ZSBhIGNhY2hlZCBlbnRpdHksIGJ1dCB0aGUgbmFtZSBkb2VzbnQgbWF0Y2gsCi0JCQkvLyBudWxsIGl0IG5vdywgc28gd2UgcGVyZm9ybSBhIGxvb2t1cAotCQkJY2FjaGVkRW50aXR5ID0gbnVsbDsKLQkJfQotCi0JCWlmIChjYWNoZWRFbnRpdHkgPT0gbnVsbCkgewotCQkJTGlzdCBub2RlcyA9IGdldERUREZpbGUoKS5nZXROb2RlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIG5vZGU7Ci0JCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuZ2V0TmFtZSgpLmVxdWFscyhnZXRSZWZlcmVuY2VkRW50aXR5KCkpKSB7Ci0JCQkJCQljYWNoZWRFbnRpdHkgPSBlbnRpdHk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlZEVudGl0eTsKLQl9Ci0KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBEVERDb3JlUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoRFREUmVzb3VyY2UuRU5USVRZUkVGRVJFTkNFSUNPTik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UmVmZXJlbmNlZEVudGl0eSgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXROYW1lKCk7Ci0JCXJldHVybiBnZXROYW1lKCkuc3Vic3RyaW5nKDEsIHRleHQubGVuZ3RoKCkgLSAxKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KFN0YXJ0RW5kUGFpciBwYWlyKSB7Ci0JCVJlZ2lvbkl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQlJVGV4dFJlZ2lvbiBjb21tZW50U3RhcnRUYWcgPSBnZXRTdGFydFRhZyhpdGVyKTsKLQkJSVRleHRSZWdpb24gZW5kQ29tbWVudFRhZyA9IGdldE5leHRSZWdpb24oaXRlciwgRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOwotCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQlpZiAoY29tbWVudFN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXBhaXIuc3RhcnRPZmZzZXQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoY29tbWVudFN0YXJ0VGFnKTsKLQkJfQotCQlpZiAoZW5kQ29tbWVudFRhZyAhPSBudWxsKSB7Ci0JCQlwYWlyLmVuZE9mZnNldCA9IGdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldChlbmRDb21tZW50VGFnKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHRleHQgPSBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0KCk7Ci0JCWludCBmbGF0Tm9kZVN0YXJ0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJU3RhcnRFbmRQYWlyIHBhaXIgPSBuZXcgU3RhcnRFbmRQYWlyKCk7Ci0JCWdldFN0YXJ0QW5kRW5kT2Zmc2V0Rm9yVGV4dChwYWlyKTsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHBhaXIuc3RhcnRPZmZzZXQgLSBmbGF0Tm9kZVN0YXJ0LCBwYWlyLmVuZE9mZnNldCAtIGZsYXROb2RlU3RhcnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoT2JqZWN0IHJlcXVlc3RvciwgU3RyaW5nIG5hbWUpIHsKLQkJcmVwbGFjZVRleHQocmVxdWVzdG9yLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldCgpLCBnZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKS5nZXRMZW5ndGgoKSwgIiUiICsgbmFtZSArICI7Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZmVyZW5jZWRFbnRpdHkoU3RyaW5nIG5hbWUpIHsKLQkJYmVnaW5SZWNvcmRpbmcodGhpcywgRFREQ29yZU1lc3NhZ2VzLl9VSV9MQUJFTF9QQVJNX0VOVElUWV9SRUZfQ0hHX0VOVElUWV9SRUYpOyAvLyROT04tTkxTLTEkCi0JCXNldFJlZmVyZW5jZWRFbnRpdHkodGhpcywgbmFtZSk7Ci0JCWVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBuZXdUZXh0KSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHRoaXMsIERURENvcmVNZXNzYWdlcy5fVUlfTEFCRUxfUEFSTV9FTlRJVFlfUkVGX0NPTU1FTlRfQ0hHKTsgLy8kTk9OLU5MUy0xJAotCQlTdGFydEVuZFBhaXIgcGFpciA9IG5ldyBTdGFydEVuZFBhaXIoKTsKLQkJZ2V0U3RhcnRBbmRFbmRPZmZzZXRGb3JUZXh0KHBhaXIpOwotCQlyZXBsYWNlVGV4dCh0aGlzLCBwYWlyLnN0YXJ0T2Zmc2V0LCBwYWlyLmVuZE9mZnNldCAtIHBhaXIuc3RhcnRPZmZzZXQsIG5ld1RleHQpOwotCQllbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9Ub3BMZXZlbE5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWZmMmM4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1RvcExldmVsTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC50ZXh0LlJlZ2lvbkl0ZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLy8gaW50ZXJmYWNlIGZvciBub2RlcyB0aGF0IGNhbiBleGlzdCBhdCB0aGUgdG9wIGxldmVsIGluIGEgZHRkZmlsZQotLy8gZWcuIGVudGl0eSwgbm90YXRpb24sIGVsZW1lbnQsIGNvbW1lbnQsIGF0dGxpc3QsIG9yIHVucmVjb2duaXplZCBzdHVmZiAoaWUKLS8vIDxqdW5rIGRrZmpkbD4KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBUb3BMZXZlbE5vZGUgZXh0ZW5kcyBEVEROb2RlIHsKLQotCXByaXZhdGUgQXJyYXlMaXN0IGZsYXROb2RlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBUb3BMZXZlbE5vZGUoRFRERmlsZSBkdGRGaWxlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXN1cGVyKGR0ZEZpbGUsIGZsYXROb2RlKTsKLQkJZmxhdE5vZGVzLmFkZChmbGF0Tm9kZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkV2hpdGVzcGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJZmxhdE5vZGVzLmFkZChub2RlKTsKLQl9Ci0KLQkvLyBzcGVjaWFsaXplIHRoaXMgc28gd2UgZGVsZXRlIHRoZSBvYmplY3RzIGZsYXQgbm9kZSByYW5nZQotCS8vIEFORCBhbnkgd2hpdGVzcGFjZQotCXB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKLQkJYmVnaW5SZWNvcmRpbmcoZ2V0RFRERmlsZSgpLCBEVERDb3JlTWVzc2FnZXMuX1VJX0xBQkVMX1RPUF9MRVZFTF9OT0RFX0RFTEVURSk7IC8vJE5PTi1OTFMtMSQKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBmbGF0Tm9kZXMuZ2V0KDApOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZmxhdE5vZGVzLmdldChmbGF0Tm9kZXMuc2l6ZSgpIC0gMSk7Ci0JCWludCBzdGFydE9mZnNldCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBlbmRPZmZzZXQgPSBsYXN0LmdldEVuZE9mZnNldCgpOwotCi0JCXJlcGxhY2VUZXh0KGdldERUREZpbGUoKSwgc3RhcnRPZmZzZXQsIGVuZE9mZnNldCAtIHN0YXJ0T2Zmc2V0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZW5kUmVjb3JkaW5nKGdldERUREZpbGUoKSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEVuZFJlZ2lvbigpIHsKLQkJaW50IHNpemUgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuc2l6ZSgpOwotCQlpZiAoc2l6ZSA+IDApIHsKLQkJCXJldHVybiBmbGF0Tm9kZS5nZXRSZWdpb25zKCkuZ2V0KHNpemUgLSAxKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBpbmNsdWRlcyB3aGF0IGdldHRleHQgZ2l2ZXMgdXMgcGx1cyBhbnkgd2hpdGVzcGFjZQotCS8vIHRyYWlsaW5nIGl0Ci0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dCgpIHsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlJdGVyYXRvciBpdGVyID0gZmxhdE5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmTm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCXNiLmFwcGVuZChmTm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRTdGFydFJlZ2lvbigpIHsKLQkJaWYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlyZXR1cm4gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIHJlZ2lvbiBpdGVyICIgKyB0aGlzLmdldENsYXNzKCkgKyAiIHdpdGgKLQkJLy8gc3RhcnQgLCBlbmQgPSAiICsgZ2V0U3RhcnRPZmZzZXQoKSArICIsICIgK2dldEVuZE9mZnNldCgpKTsKLQkJcmV0dXJuIG5ldyBSZWdpb25JdGVyYXRvcihmbGF0Tm9kZSwgZ2V0U3RhcnRPZmZzZXQoKSwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvVW5yZWNvZ25pemVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL1VucmVjb2duaXplZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ0YjRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvVW5yZWNvZ25pemVkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBVbnJlY29nbml6ZWQgZXh0ZW5kcyBUb3BMZXZlbE5vZGUgewotCi0JcHVibGljIFVucmVjb2duaXplZChEVERGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoZmlsZSwgZmxhdE5vZGUpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShEVERSZXNvdXJjZS5VTlJFQ09HTklaRURJQ09OKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gZ2V0U3RydWN0dXJlZERURERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCQlpZiAodGV4dC5sZW5ndGgoKSA8PSAzMCkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gdGV4dC5zdWJzdHJpbmcoMCwgMjkpICsgIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50L0NvbnRlbnREZXNjcmliZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvY29udGVudC9Db250ZW50RGVzY3JpYmVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmYWQ5MzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9jb250ZW50L0NvbnRlbnREZXNjcmliZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5jb250ZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JVGV4dENvbnRlbnREZXNjcmliZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yRFREIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgcmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2FsY3VsYXRlU3VwcG9ydGVkT3B0aW9ucyhJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRzCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCWhhbmRsZUNhbGN1bGF0aW9ucyhkZXNjcmlwdGlvbiwgZGV0ZWN0b3IpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVZhbGlkaXR5KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCS8vIGN1cnJlbnRseSBubyBzcGVjaWZpYyBjaGVjayBmb3IgdmFsaWRpbHR5Ci0JCS8vIGJhc2VkIG9uIGNvbnRlbnRzLgotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlVmFsaWRpdHkoUmVhZGVyIHJlYWRlcikgewotCQkvLyBjdXJyZW50bHkgbm8gc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkaWx0eQotCQkvLyBiYXNlZCBvbiBjb250ZW50cy4KLQkJcmV0dXJuIElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0JfQotCi0JLy8gc2FtZSBydWxlcyBhcyBmb3IgWE1MCi0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZ2V0RGV0ZWN0b3IoKSB7Ci0JCWlmIChyZXNvdXJjZUNoYXJzZXREZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlyZXNvdXJjZUNoYXJzZXREZXRlY3RvciA9IG5ldyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKTsKLQkJfQotCQlyZXR1cm4gcmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogQHBhcmFtIGRldGVjdG9yCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVDYWxjdWxhdGlvbnMoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiwgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RlOiBpZiB3ZSdyZSBhc2tlZCBmb3Igb25lLCB3ZSBzZXQgdGhlbSBhbGwuIEkgbmVlZCB0byBiZSBzdXJlIGlmCi0JCS8vIGNhbGxlZAotCQkvLyBtdWxpdGlwbGUgdGltZXMgKG9uZSBmb3IgZWFjaCwgc2F5KSB0aGF0IHdlIGRvbid0IHdhc3RlIHRpbWUKLQkJLy8gcHJvY2Vzc2luZyBzYW1lCi0JCS8vIGNvbnRlbnQgYWdhaW4uCi0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSAoKFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYKLQkJCS8vIGludmFsaWQKLQkJCS8vIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJLy8gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQudGhlCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZ2V0RGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMgbmVlZCB0bwotCQkJCQkvLyBhZGQsIEknbSBhc3N1bWluZwotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIE9iamVjdCBkZXRlY3RlZENoYXJzZXQsIE9iamVjdCBqYXZhQ2hhcnNldCkgewotCQkvLyBzaW5jZSBlcXVhbCwgd2UgZG9uJ3QgbmVlZCB0byBhZGQsIGJ1dCBpZiBvdXIgZGV0ZWN0ZWQgdmVyc2lvbiBpcwotCQkvLyBkaWZmZXJlbnQgdGhhbgotCQkvLyBqYXZhQ2hhcnNldCwgdGhlbiB3ZSBzaG91bGQgYWRkIGl0LiBUaGlzIHdpbGwgaGFwcGVuLCBmb3IgZXhhbXBsZSwKLQkJLy8gaWYgdGhlcmUncwotCQkvLyBkaWZmZXJlbmNlcyBpbiBjYXNlLCBvciBkaWZmZXJlbmNlcyBkdWUgdG8gb3ZlcnJpZGUgcHJvcGVydGllcwotCQlpZiAoZGV0ZWN0ZWRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCS8vIGlmICghZGV0ZWN0ZWRDaGFyc2V0LmVxdWFscyhqYXZhQ2hhcnNldCkpIHsKLQkJCS8vIGRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VULAotCQkJLy8gZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJCS8vIH0KLQotCQkJLy8gT25jZSB3ZSBkZXRlY3RlZCBhIGNoYXJzZXQsIHdlIHNob3VsZCBzZXQgdGhlIHByb3BlcnR5IGV2ZW4KLQkJCS8vIHRob3VnaCBpdCdzIHRoZSBzYW1lIGFzIGphdmFDaGFyc2V0Ci0JCQkvLyBiZWNhdXNlIHRoZXJlIGFyZSBjbGllbnRzIHRoYXQgcmVseSBvbiB0aGlzIHByb3BlcnR5IHRvCi0JCQkvLyBkZXRlcm1pbmUgaWYgdGhlIGNoYXJzZXQgaXMgYWN0dWFsbHkgZGV0ZWN0ZWQgaW4gZmlsZSBvciBub3QuCi0JCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwgZGV0ZWN0ZWRDaGFyc2V0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNSZWxldmVudChJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKGRlc2NyaXB0aW9uLmlzUmVxdWVzdGVkKElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCkpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRFRETW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RURE1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTllYjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRFRETW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuRFRETW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFREUmVmZXJlbmNlVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5MYWJlbFZhbHVlUGFpcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERURE1vZGVsSW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLCBEVERNb2RlbCB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGVsZXRlRmlsZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQkvLyBjcmVhdGUgdGhlIHRlbXAgRmlsZSBvYmplY3QKLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOwotCQlpZiAoZmlsZS5leGlzdHMoKSkKLQkJCXJlc3VsdCA9IGZpbGUuZGVsZXRlKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBEVERGaWxlIGRvY3VtZW50OwotCi0JLy8gcHJpdmF0ZSBMaXN0IGVycm9yTWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyBlbnRpdHkgcmVmZXJlbmNlIG5hbWVzIGZvdW5kIGluIHRoZSBjb25kaXRpb25hbCBJR05PUkUgc2VjdGlvbnMKLQlwcml2YXRlIFZlY3RvciBpZ25vcmVkRW50aXR5UmVmczsKLQotCXByaXZhdGUgYm9vbGVhbiByZWZyZXNoUmVxdWlyZWQgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBEVERSZWZlcmVuY2VVcGRhdGVyIHJlZlVwZGF0ZXIgPSBuZXcgRFREUmVmZXJlbmNlVXBkYXRlcigpOwotCi0JcHVibGljIERURE1vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJZG9jdW1lbnQgPSBuZXcgRFRERmlsZSh0aGlzKTsKLQkJZG9jdW1lbnQuYWRkRFRERmlsZUxpc3RlbmVyKG5ldyBJRFRERmlsZUxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpIHsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgbm9kZTsKLQkJCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpICYmIGVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCQkJCS8vIGp1c3Qgc2F5IHRoZXkgaGF2ZSBjaGFuZ2VkIGZvciBub3cKLQkJCQkJCXNldFJlZmVyZW5jZWRNb2RlbHNDaGFuZ2VkKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCkgewotCQkJCWNoZWNrSWZFeHRlcm5hbFJlZmVyZW5jZXNDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgbm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJCQljaGVja0lmRXh0ZXJuYWxSZWZlcmVuY2VzQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlci5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsKTsKLQkJLy8gY2xlYXIgcmVmZXJlbmNlIHVwZGF0ZXIgY2FjaGUKLQkJZ2V0UmVmZXJlbmNlVXBkYXRlcigpLmNsZWFyQ2FjaGUoKTsKLQl9Ci0KLQl2b2lkIGNoZWNrSWZFeHRlcm5hbFJlZmVyZW5jZXNDaGFuZ2VkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBub2RlOwotCQkJCWlmIChlbnRpdHkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiBlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCS8vIGp1c3Qgc2F5IHRoZXkgaGF2ZSBjaGFuZ2VkIGZvciBub3cKLQkJCQkJc2V0UmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvLwotCS8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaGVscHMgZGV0ZXJtaW5lIHRoZSBsaXN0IG9mIHRoaW5ncyB0aGF0Ci0JLy8gY2FuIGJlIHVzZWQgaW4gYSBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZSBjb250ZW50Ci0JLy8gT3B0aW9uYWwgcGFyYW1ldGVyIGlzIHRvIGFsbG93IHRoZSBjdXJyZW50bHkgdXNlZCBEVERFbnRpdHkgdG8KLQkvLyBiZSBpbmNsdWRlZCBpbiB0aGUgY29tYm9ib3guCi0JLy8KLQlwdWJsaWMgTGFiZWxWYWx1ZVBhaXJbXSBjcmVhdGVQYXJtRW50aXR5Q29udGVudEl0ZW1zKEVudGl0eSBlbnRpdHkpIHsKLQkJTm9kZUxpc3QgZW50aXRpZXMgPSBnZXREVERGaWxlKCkuZ2V0RW50aXRpZXMoKTsKLQotCQlWZWN0b3IgaXRlbXMgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJaWYgKGVudGl0eSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmFtZSA9ICIlIiArIGVudGl0eS5nZXROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaXRlbXMuYWRkRWxlbWVudChuZXcgTGFiZWxWYWx1ZVBhaXIobmFtZSwgbmFtZSkpOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gZW50aXRpZXMuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCUVudGl0eSBlbnRpdHlBdCA9IChFbnRpdHkpIGkubmV4dCgpOwotCQkJaWYgKGVudGl0eUF0LmlzUGFyYW1ldGVyRW50aXR5KCkgJiYgZW50aXR5QXQuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAiJSIgKyBlbnRpdHlBdC5nZXROYW1lKCkgKyAiOyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWl0ZW1zLmFkZEVsZW1lbnQobmV3IExhYmVsVmFsdWVQYWlyKG5hbWUsIG5hbWUpKTsKLQkJCX0KLQkJfQotCQlMYWJlbFZhbHVlUGFpcltdIGNvbWJvQXJyYXkgPSBuZXcgTGFiZWxWYWx1ZVBhaXJbaXRlbXMuc2l6ZSgpXTsKLQkJaXRlbXMuY29weUludG8oY29tYm9BcnJheSk7Ci0JCXJldHVybiBjb21ib0FycmF5OwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCXN1cGVyLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIpOwotCQkvLyBjbGVhciByZWZlcmVuY2UgdXBkYXRlciBjYWNoZQotCQlnZXRSZWZlcmVuY2VVcGRhdGVyKCkuY2xlYXJDYWNoZSgpOwotCX0KLQotCi0JcHVibGljIERUREZpbGUgZ2V0RFRERmlsZSgpIHsKLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8vIFJldHVybnMgZW50aXR5IHJlZmVyZW5jZSBuYW1lcyB0aGF0IGFyZSBpbgotCS8vIHRoZSBjb25kaXRpb25hbCBJR05PUkUgc2VjdGlvbnMuCi0JcHVibGljIFZlY3RvciBnZXRJZ25vcmVkRW50aXR5UmVmcygpIHsKLQkJaWYgKGlnbm9yZWRFbnRpdHlSZWZzID09IG51bGwpCi0JCQlpZ25vcmVkRW50aXR5UmVmcyA9IG5ldyBWZWN0b3IoKTsKLQkJcmV0dXJuIGlnbm9yZWRFbnRpdHlSZWZzOwotCX0KLQotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0Tm9kZSBhdCAiICsgb2Zmc2V0ICsgIiByZXR1cm5pbmcgPSAiICsKLQkJLy8gdGhpcy5kb2N1bWVudC5nZXROb2RlQXQob2Zmc2V0KSk7Ci0KLQkJcmV0dXJuIHRoaXMuZG9jdW1lbnQuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JfQotCi0JcHVibGljIERURFJlZmVyZW5jZVVwZGF0ZXIgZ2V0UmVmZXJlbmNlVXBkYXRlcigpIHsKLQkJcmV0dXJuIHJlZlVwZGF0ZXI7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNSZWZlcmVuY2VkTW9kZWxzQ2hhbmdlZCgpIHsKLQkJcmV0dXJuIHJlZnJlc2hSZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1JlZnJlc2hSZXF1aXJlZCgpIHsKLQkJcmV0dXJuIHJlZnJlc2hSZXF1aXJlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGZsYXRNb2RlbEV2ZW50KSB7Ci0JCWRvY3VtZW50Lm5ld01vZGVsKGZsYXRNb2RlbEV2ZW50KTsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbm5ld21vZGVsIik7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlxubm9jaGFuZ2UiKTsKLQkJb3V0cHV0U3RydWN0dXJlZERvY3VtZW50KGZsYXRNb2RlbEV2ZW50KTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbm5vZGVzcmVwbGFjZWQiKTsKLQkJZG9jdW1lbnQubm9kZXNSZXBsYWNlZChmbGF0TW9kZWxFdmVudCk7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RydWN0dXJlZERvY3VtZW50RXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnQgc291cmNlID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRUZXh0KCkgKyAiJyIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBTdHJpbmcgPSAnIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldE9yaWdpbmFsQ2hhbmdlcygpICsiJyIpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImRlbGV0ZWQgU3RyaW5nID0gJyIgKwotCQkvLyBmbGF0TW9kZWxFdmVudC5nZXREZWxldGVkVGV4dCgpICsiJyIpOwotCQkvLyBFbnVtZXJhdGlvbiBlID0KLQkJLy8gZmxhdE1vZGVsRXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Tm9kZXMoKS5lbGVtZW50cygpOwotCQkvLyBpbnQgaSA9IDA7Ci0JCS8vIGZvciAoOyBlLmhhc01vcmVFbGVtZW50cygpOyBpKyspCi0JCS8vIHsKLQkJLy8gQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9Ci0JCS8vIChCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkvLyBvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obm9kZSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiICIgKyBpICsiLiAiICsgbm9kZS5oYXNoQ29kZSgpICsgIiAnIgotCQkvLyArbm9kZS5nZXRUZXh0KCkgKyAiJyIpOwotCQkvLyB9Ci0JfQotCi0JcHVibGljIHZvaWQgb3V0cHV0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJLy8gaW50IHNpemUgPSBmbGF0Tm9kZS5nZXROdW1iZXJPZlJlZ2lvbnMoKTsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCS8vIHsKLQkJLy8gUmVnaW9uIHJlZ2lvbiA9IChSZWdpb24pIGZsYXROb2RlLmdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbihpICsgIi4gIiArIHJlZ2lvbi5nZXRUeXBlKCkpOwotCi0JCS8vIH0gLy8gZW5kIG9mIGZvciAoKQotCi0JfQotCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZmxhdE1vZGVsRXZlbnQpIHsKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJcbnJlZ2lvbiBjaGFuZ2VkIik7Ci0JCWRvY3VtZW50LnJlZ2lvbkNoYW5nZWQoZmxhdE1vZGVsRXZlbnQpOwotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIj0gIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHQoKSk7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigicmVnaW9uIGNoYW5nZWQgIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFJlZ2lvbigpLmhhc2hDb2RlKCkgKyAiID0gIiArCi0JCS8vIGZsYXRNb2RlbEV2ZW50LmdldFJlZ2lvbigpKTsKLQotCQlvdXRwdXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZmxhdE1vZGVsRXZlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBmbGF0TW9kZWxFdmVudCkgewotCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIlxucmVnaW9uIHJlcGxhY2VkIik7Ci0JCWRvY3VtZW50LnJlZ2lvbnNSZXBsYWNlZChmbGF0TW9kZWxFdmVudCk7Ci0JCW91dHB1dFN0cnVjdHVyZWREb2N1bWVudChmbGF0TW9kZWxFdmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmZXJlbmNlZE1vZGVsc0NoYW5nZWQoKSB7Ci0JCXJlZnJlc2hSZXF1aXJlZCA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVmcmVzaFJlcXVpcmVkKGJvb2xlYW4gdmFsdWUpIHsKLQkJcmVmcmVzaFJlcXVpcmVkID0gdmFsdWU7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbmV3U3RydWN0dXJlZERvY3VtZW50Ci0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gc3VwZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50KQotCQkJcmV0dXJuOyAvLyBub3RpbmcgdG8gZG8KLQotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQlvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQobmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlpZiAobmV3U3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpID4gMCkgewotCQkJCW5ld01vZGVsKG5ldyBOZXdEb2N1bWVudEV2ZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCwgdGhpcykpOwotCQkJfQotCQkJbmV3U3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc5MzdlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTBhNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhZTlmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiAyOC1BdWctMDMKLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yOwotCi0KLS8qKgotICogQGF1dGhvciBrYm9vCi0gKiAKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93Jmd0O1ByZWZlcmVuY2VzJmd0O0phdmEmZ3Q7Q29kZSBHZW5lcmF0aW9uJmd0O0NvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJLy8gYnkgZGVmYXVsdCwgVVRGLTggYXMgcGVyIFhNTCBzcGVjCi0JCWZpbmFsIFN0cmluZyBlbmMgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQlkb2N1bWVudEVuY29kaW5nRGV0ZWN0b3Iuc2V0KGZSZWFkZXIpOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gKChYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpZG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0KG5ldyBEb2N1bWVudFJlYWRlcihkb2N1bWVudCwgMCkpOwotCi0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRFRERG9jdW1lbnRMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFiYjJjNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0RURERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIERURERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgRFRERG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBEVEREb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IERURFJlZ2lvblBhcnNlcigpOwotCX0KLQkKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUgZmlsZSkgewotCQlTdHJpbmcgZGVsaW1pdGVyID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JCWlmIChkZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWRlbGltaXRlciA9IHN1cGVyLmdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoZmlsZSk7Ci0JCXJldHVybiBkZWxpbWl0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoZ2V0UGFyc2VyKCkpOwotCQlEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlciByZVBhcnNlciA9IG5ldyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCQlyZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnNldFJlUGFyc2VyKHJlUGFyc2VyKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2VuY29kaW5nL051bGxNZW1lbnRvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZDAxZmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9OdWxsTWVtZW50by5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzOwotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIGFuIEVuY29kaW5nTWVtZW50byAoaXRzIHN1cGVyIGNsYXNzKSwKLSAqIHdoZW4gdGhlcmUgaXMgbm90IGluIGZhY3QgQU5ZIGVuY29kaW5nIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgd2hlbiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY3JlYXRlZCBkaXJlY3RseSBmcm9tIGEgU3RyaW5nCi0gKi8KLXB1YmxpYyBjbGFzcyBOdWxsTWVtZW50byBleHRlbmRzIEVuY29kaW5nTWVtZW50byB7Ci0JLyoqCi0JICogCi0JICovCi0JcHVibGljIE51bGxNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9JRFRERmlsZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L0lEVERGaWxlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUyOWZiNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL2V2ZW50L0lEVERGaWxlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURUREZpbGVMaXN0ZW5lciB7Ci0KLQlwdWJsaWMgdm9pZCBub2RlQ2hhbmdlZChEVEROb2RlIG5vZGUpOwotCi0JcHVibGljIHZvaWQgbm9kZXNBZGRlZChOb2Rlc0V2ZW50IGV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvZXZlbnQvTm9kZXNFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9Ob2Rlc0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5OTc0ZTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9ldmVudC9Ob2Rlc0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5ldmVudDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgTm9kZXNFdmVudCB7Ci0JcHJpdmF0ZSBBcnJheUxpc3QgY2hhbmdlZE5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIHZvaWQgYWRkKERURE5vZGUgY2hhbmdlZE5vZGUpIHsKLQkJY2hhbmdlZE5vZGVzLmFkZChjaGFuZ2VkTm9kZSk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0Tm9kZXMoKSB7Ci0JCXJldHVybiBjaGFuZ2VkTm9kZXM7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRFRETW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGRiMzFmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9EVERNb2RlbExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRFRERG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLQotcHVibGljIGZpbmFsIGNsYXNzIERURE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0JcHVibGljIERURE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKSB7Ci0JCWlmIChkb2N1bWVudExvYWRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBuZXcgRFRERG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IERURE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXcgRFRETW9kZWxJbXBsKCk7Ci0JCS8vIG5vdyBkb25lIGluIGNyZWF0ZQotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkvLyBtb2RlbC5zZXRGYWN0b3J5UmVnaXN0cnkoZGVmYXVsdEZhY3RvcnlSZWdpc3RyeSgpKTsKLQkJcmV0dXJuIG1vZGVsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxN2E1NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRFRERG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmVuY29kaW5nLkRURERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxMb2FkZXI7Ci0KLQotcHVibGljIGZpbmFsIGNsYXNzIE1vZGVsSGFuZGxlckZvckRURCBleHRlbmRzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlkID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIE1vZGVsSGFuZGxlcklEID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTW9kZWxIYW5kbGVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IERURERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IERURERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBEVERNb2RlbExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjAxOGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIERURFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBzdGF0aWMgSVRleHRSZWdpb24gY3JlYXRlUmVnaW9uKFN0cmluZyB0b2tlbktpbmQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpZiAodG9rZW5LaW5kICE9IG51bGwpIHsKLQkJCS8vIElTU1VFOiBEVEQgcmVnaW9ucyBkb24ndCBkaXN0aW5ndWlzaCB0ZXh0IGZyb20gd2hpdGUgc3BhY2UKLQkJCXJlZ2lvbiA9IG5ldyBDb250ZXh0UmVnaW9uKHRva2VuS2luZCwgc3RhcnQsIGxlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUzZWE1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3BhcnNlci9EVERSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQuRFREU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyLkRURFRva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyLlRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERSZWdpb25QYXJzZXIgaW1wbGVtZW50cyBSZWdpb25QYXJzZXIgewotCXByaXZhdGUgVmVjdG9yIGNhY2hlZFJlZ2lvbnMgPSBudWxsOwotCXByaXZhdGUgRFREVG9rZW5pemVyIHRva2VuaXplciA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNhY2hlZE5vZGUgPSBudWxsOyAvLyB0b3Agb2Ygbm9kZQotCQkJCQkJCQkJCQkJCQkJLy8gY2hhaW4KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRFREUmVnaW9uUGFyc2VyKCk7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFkZE5ld05vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUsIFZlY3RvciByZWdpb25zKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGVhZGluZ1NwYWNlTm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRyYWlsaW5nU3BhY2VOb2RlID0gbnVsbDsKLQkJTGlua2VkTGlzdCBub2RlU2VlZHMgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlpbnQgblJlZ2lvbnMgPSByZWdpb25zLnNpemUoKTsKLQkJaW50IGxlYWRpbmdTcGFjZUVuZCA9IC0xOwotCQlpbnQgdHJhaWxpbmdTcGFjZUJlZ2luID0gblJlZ2lvbnM7Ci0KLQkJLy8gZmluZCBsZWFkaW5nIHNwYWNlCi0JCW5vZGVTZWVkcy5jbGVhcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWdpb25zOyBpKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXQoaSk7Ci0JCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNCbGFua1JlZ2lvbih0eXBlKSkgewotCQkJCWxlYWRpbmdTcGFjZUVuZCA9IGk7Ci0JCQkJbm9kZVNlZWRzLmFkZExhc3QocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSkgewotCQkJbGVhZGluZ1NwYWNlTm9kZSA9IGNyZWF0ZU5vZGUobm9kZVNlZWRzKTsKLQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJbGFzdE5vZGUuc2V0TmV4dChsZWFkaW5nU3BhY2VOb2RlKTsKLQkJCQlsZWFkaW5nU3BhY2VOb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCX0KLQkJCWxhc3ROb2RlID0gbGVhZGluZ1NwYWNlTm9kZTsKLQkJfQotCi0JCS8vIGZpbmQgdHJhaWxpbmcgc3BhY2UKLQkJaWYgKGxlYWRpbmdTcGFjZUVuZCA8IG5SZWdpb25zIC0gMSkgewotCQkJbm9kZVNlZWRzLmNsZWFyKCk7Ci0JCQlmb3IgKGludCBpID0gblJlZ2lvbnMgLSAxOyAwIDw9IGk7IGktLSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXQoaSk7Ci0JCQkJU3RyaW5nIHR5cGUgPSAoKElUZXh0UmVnaW9uKSByZWdpb25zLmdldChpKSkuZ2V0VHlwZSgpOwotCQkJCWlmIChpc0JsYW5rUmVnaW9uKHR5cGUpKSB7Ci0JCQkJCXRyYWlsaW5nU3BhY2VCZWdpbiA9IGk7Ci0JCQkJCW5vZGVTZWVkcy5hZGRGaXJzdChyZWdpb24pOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpKSB7Ci0JCQkJdHJhaWxpbmdTcGFjZU5vZGUgPSBjcmVhdGVOb2RlKG5vZGVTZWVkcyk7Ci0JCQl9Ci0KLQkJCW5vZGVTZWVkcy5jbGVhcigpOwotCQkJZm9yIChpbnQgaSA9IGxlYWRpbmdTcGFjZUVuZCArIDE7IGkgPCB0cmFpbGluZ1NwYWNlQmVnaW47IGkrKykgewotCQkJCW5vZGVTZWVkcy5hZGRMYXN0KHJlZ2lvbnMuZ2V0KGkpKTsKLQkJCX0KLQkJCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSkgewotCQkJCWNvbnRlbnROb2RlID0gY3JlYXRlTm9kZShub2RlU2VlZHMpOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY29udGVudE5vZGUpOwotCQkJCQljb250ZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJfQotCQkJCWxhc3ROb2RlID0gY29udGVudE5vZGU7Ci0JCQl9Ci0JCQlpZiAodHJhaWxpbmdTcGFjZU5vZGUgIT0gbnVsbCkgewotCQkJCWxhc3ROb2RlLnNldE5leHQodHJhaWxpbmdTcGFjZU5vZGUpOwotCQkJCXRyYWlsaW5nU3BhY2VOb2RlLnNldFByZXZpb3VzKGxhc3ROb2RlKTsKLQkJCQlsYXN0Tm9kZSA9IHRyYWlsaW5nU3BhY2VOb2RlOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGxhc3ROb2RlOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVOb2RlKExpbmtlZExpc3QgcmVnaW9ucykgewotCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LkRURF9HRU5FUklDKTsKLQkJaW50IHN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXRGaXJzdCgpKS5nZXRTdGFydCgpOwotCQlpbnQgbGVuZ3RoID0gKChJVGV4dFJlZ2lvbikgcmVnaW9ucy5nZXRMYXN0KCkpLmdldEVuZCgpIC0gc3RhcnQ7Ci0JCW5vZGUuc2V0U3RhcnQoc3RhcnQpOwotCQlub2RlLnNldExlbmd0aChsZW5ndGgpOwotCQlmb3IgKExpc3RJdGVyYXRvciBpID0gcmVnaW9ucy5saXN0SXRlcmF0b3IoMCk7IGkuaGFzTmV4dCgpOykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBpLm5leHQoKTsKLQkJCW5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQlyZWdpb24uYWRqdXN0U3RhcnQoLXN0YXJ0KTsKLQkJfQotCQlub2RlLnNldEVuZGVkKHRydWUpOwotCi0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVOb2RlQ2hhaW4oTGlzdCByZWdpb25zKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3ROb2RlID0gbnVsbDsKLQkJVmVjdG9yIG5vZGVTZWVkcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlmb3IgKEl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7IGUuaGFzTmV4dCgpOykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCS8vIElmIHRoZSBmb2xsb3dpbmcgcmVnaW9ucyBhcHBlYXIsCi0JCQkvLyBhIHByZXZpb3VzIG5vZGUgaXMgY2xvc2VkIGluIGZyb250IG9mIGl0LgotCQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpICYmIGlzQmVnaW5uaW5nUmVnaW9uKHR5cGUpKSB7Ci0JCQkJbGFzdE5vZGUgPSBhZGROZXdOb2RlcyhsYXN0Tm9kZSwgbm9kZVNlZWRzKTsKLQkJCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJCX0KLQkJCW5vZGVTZWVkcy5hZGRFbGVtZW50KHJlZ2lvbik7Ci0KLQkJCS8vIFRoZSBmb2xsb3dpbmcgcmVnaW9ucyBjbG9zZSB0aGUgY3VycmVudCBub2RlLgotCQkJaWYgKCFub2RlU2VlZHMuaXNFbXB0eSgpICYmIGlzRW5kaW5nUmVnaW9uKHR5cGUpKSB7Ci0JCQkJbGFzdE5vZGUgPSBhZGROZXdOb2RlcyhsYXN0Tm9kZSwgbm9kZVNlZWRzKTsKLQkJCQlub2RlU2VlZHMuY2xlYXIoKTsKLQkJCX0KLQotCQkJaWYgKGhlYWROb2RlID09IG51bGwgJiYgbGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCWhlYWROb2RlID0gZmluZEZpcnN0Tm9kZShsYXN0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbG9zZSBjdXJyZW50IG5vZGUgZm9yY2libHkuCi0JCWlmICghbm9kZVNlZWRzLmlzRW1wdHkoKSkgewotCQkJbGFzdE5vZGUgPSBhZGROZXdOb2RlcyhsYXN0Tm9kZSwgbm9kZVNlZWRzKTsKLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGxhc3ROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGZpbmRGaXJzdE5vZGUobGFzdE5vZGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmluZEZpcnN0Tm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5vZGUgPSBub2RlOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZOb2RlID0gbnVsbDsKLQkJd2hpbGUgKChwcmV2Tm9kZSA9IGZpcnN0Tm9kZS5nZXRQcmV2aW91cygpKSAhPSBudWxsKSB7Ci0JCQlmaXJzdE5vZGUgPSBwcmV2Tm9kZTsKLQkJfQotCQlyZXR1cm4gZmlyc3ROb2RlOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpIHsKLQkJaWYgKGNhY2hlZE5vZGUgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNhY2hlZE5vZGU7Ci0JCX0KLQotCQlMaXN0IHJlZ2lvbnMgPSBnZXRSZWdpb25zKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUgPSBjcmVhdGVOb2RlQ2hhaW4ocmVnaW9ucyk7Ci0JCWNhY2hlZE5vZGUgPSBoZWFkTm9kZTsKLQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0UmVnaW9ucygpIHsKLQkJaWYgKGNhY2hlZFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJcmV0dXJuIGNhY2hlZFJlZ2lvbnM7Ci0JCX0KLQotCQlWZWN0b3IgcmVnaW9ucyA9IG5ldyBWZWN0b3IoKTsKLQkJVG9rZW4gY3VycmVudFRva2VuID0gbnVsbDsKLQkJZG8gewotCQkJdHJ5IHsKLQkJCQljdXJyZW50VG9rZW4gPSAoVG9rZW4pIHRva2VuaXplci55eWxleCgpOwotCQkJCWlmIChjdXJyZW50VG9rZW4gIT0gbnVsbCkgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBEVERSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjdXJyZW50VG9rZW4uZ2V0VHlwZSgpLCBjdXJyZW50VG9rZW4uZ2V0U3RhcnRPZmZzZXQoKSwgY3VycmVudFRva2VuLmdldExlbmd0aCgpKTsKLQkJCQkJcmVnaW9ucy5hZGQocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQl3aGlsZSAoY3VycmVudFRva2VuICE9IG51bGwpOwotCi0JCWNhY2hlZFJlZ2lvbnMgPSByZWdpb25zOwotCQlyZXR1cm4gcmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCWlmICh0b2tlbml6ZXIgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0b2tlbml6ZXIgPSBuZXcgRFREVG9rZW5pemVyKHJlYWRlcik7Ci0JCQl9Ci0JCQljYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBEVERUb2tlbml6ZXIgPGlucHV0ZmlsZT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQl0b2tlbml6ZXIueXlyZXNldChyZWFkZXIpOwotCQkJfQotCQkJY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWNhY2hlZE5vZGUgPSBudWxsOwotCQljYWNoZWRSZWdpb25zID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBBbiBhZGRpdGlvbmFsIG9mZnNldCBmb3IgdXNlIHdpdGggYW55IHBvc2l0aW9uLWRlcGVuZGFudCBwYXJzaW5nIHJ1bGVzCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoUmVhZGVyIHJlYWRlciwgaW50IG9mZnNldCkgewotCQlyZXNldChyZWFkZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBpbnB1dCkgewotCQlyZXNldChuZXcgU3RyaW5nUmVhZGVyKGlucHV0KSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoU3RyaW5nIGlucHV0LCBpbnQgb2Zmc2V0KSB7Ci0JCXJlc2V0KGlucHV0KTsKLQl9Ci0KLQkvLyBuZXZlciB1c2VkCi0JRFREVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJcmV0dXJuIHRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNCZWdpbm5pbmdSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERURFJlZ2lvblR5cGVzLlNUQVJUX1RBRykgfHwgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0JsYW5rUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRpbmdSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERURFJlZ2lvblR5cGVzLkVORF9UQUcpIHx8ICh0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUWV9QQVJNKSB8fCAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0RURFJlZ2lvblR5cGVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZWNkNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wYXJzZXIvRFREUmVnaW9uVHlwZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBEVERSZWdpb25UeXBlcyB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVnaW9uUHJlZml4ID0gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLnBhcnNlci5EVERSZWdpb25UeXBlcy4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gcmVnaW9uUHJlZml4ICsgIk5BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHID0gcmVnaW9uUHJlZml4ICsgIlNUQVJUX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHID0gcmVnaW9uUHJlZml4ICsgIkVORF9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVGVF9QQVJFTiA9IHJlZ2lvblByZWZpeCArICJMRUZUX1BBUkVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJJR0hUX1BBUkVOID0gcmVnaW9uUHJlZml4ICsgIlJJR0hUX1BBUkVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdISVRFU1BBQ0UgPSByZWdpb25QcmVmaXggKyAiV0hJVEVTUEFDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUT1IgPSByZWdpb25QcmVmaXggKyAiQ09OTkVDVE9SIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0NDVVJfVFlQRSA9IHJlZ2lvblByZWZpeCArICJPQ0NVUl9UWVBFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0xBTUFUSU9OID0gcmVnaW9uUHJlZml4ICsgIkVYQ0xBTUFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBFUkNFTlQgPSByZWdpb25QcmVmaXggKyAiUEVSQ0VOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRU1JQ09MT04gPSByZWdpb25QcmVmaXggKyAiU0VNSUNPTE9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfU1RBUlQgPSByZWdpb25QcmVmaXggKyAiQ09NTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiQ09NTUVOVF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfRU5EID0gcmVnaW9uUHJlZml4ICsgIkNPTU1FTlRfRU5EIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9UQVRJT05fVEFHID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTl9DT05URU5UID0gcmVnaW9uUHJlZml4ICsgIk5PVEFUSU9OX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfVEFHID0gcmVnaW9uUHJlZml4ICsgIkVOVElUWV9UQUciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX1BBUk0gPSByZWdpb25QcmVmaXggKyAiRU5USVRZX1BBUk0iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiRU5USVRZX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkRBVEFfVkFMVUUgPSByZWdpb25QcmVmaXggKyAiTkRBVEFfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX1RBRyA9IHJlZ2lvblByZWZpeCArICJFTEVNRU5UX1RBRyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTEVNRU5UX0NPTlRFTlQgPSByZWdpb25QcmVmaXggKyAiRUxFTUVOVF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfRU1QVFkgPSByZWdpb25QcmVmaXggKyAiQ09OVEVOVF9FTVBUWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX0FOWSA9IHJlZ2lvblByZWZpeCArICJDT05URU5UX0FOWSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UX1BDREFUQSA9IHJlZ2lvblByZWZpeCArICJDT05URU5UX1BDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVExJU1RfVEFHID0gcmVnaW9uUHJlZml4ICsgIkFUVExJU1RfVEFHIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiU1lTVEVNX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFVCTElDX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiUFVCTElDX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkRBVEFfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJOREFUQV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRVFVT1RFRF9MSVRFUkFMID0gcmVnaW9uUHJlZml4ICsgIlNJTkdMRVFVT1RFRF9MSVRFUkFMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRVFVT1RFRF9MSVRFUkFMID0gcmVnaW9uUHJlZml4ICsgIkRPVUJMRVFVT1RFRF9MSVRFUkFMIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQ09OVEVOVCA9IHJlZ2lvblByZWZpeCArICJVTktOT1dOX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEVfTkFNRSA9IHJlZ2lvblByZWZpeCArICJBVFRSSUJVVEVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGF0dHJpYnV0ZSB0eXBlIGtleXdvcmRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJDREFUQV9LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiSURfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRl9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklEUkVGX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUZTX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiSURSRUZTX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiRU5USVRZX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVNfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJFTlRJVElFU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5fS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJOTVRPS0VOX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk1UT0tFTlNfS0VZV09SRCA9IHJlZ2lvblByZWZpeCArICJOTVRPS0VOU19LRVlXT1JEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVEFUSU9OX0tFWVdPUkQgPSByZWdpb25QcmVmaXggKyAiTk9UQVRJT05fS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNX0NIT0lDRSA9IHJlZ2lvblByZWZpeCArICJFTlVNX0NIT0lDRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJNX0VOVElUWV9UWVBFID0gcmVnaW9uUHJlZml4ICsgIlBBUk1fRU5USVRZX1RZUEUiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBhdHRyaWJ1dGUgZGVmYXVsdHMga2V5d29yZHMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVSVJFRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIlJFUVVJUkVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElFRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIklNUExJRURfS0VZV09SRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSVhFRF9LRVlXT1JEID0gcmVnaW9uUHJlZml4ICsgIkZJWEVEX0tFWVdPUkQiOyAvLyROT04tTkxTLTEkCi19Ly8gRFREUmVnaW9uVHlwZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZmI2NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIERURCBDb3JlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sICJkdGQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzNDhlMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCBieSBEVEQgY29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIERURENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgRFREQ29yZVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVmYXVsdCBleHRlbnNpb24gdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQgaW4gdGhlIE5ldyBGaWxlCi0JICogV2l6YXJkLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9FWFRFTlNJT04gPSAiZGVmYXVsdEV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTU1MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBjbGFzcywgd2l0aCBpdHMgb25lIGZpZWxkLCBpcyBhIGNvbnZlbmllbmNlIHRvIHByb3ZpZGUgY29tcGlsZS10aW1lCi0gKiBzYWZldHkgd2hlbiByZWZlcnJpbmcgdG8gdGhlIERURCBjb250ZW50VHlwZSBJRC4KLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIG5vdCBtZWFudCB0byBiZSBpbnN0YW50aWF0ZWQgb3Igc3ViY2xhc3NlZC4KLSAqIDwvcD4KLSAqLwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFR5cGVJZEZvckRURCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBDb250ZW50VHlwZUlEX0RURCBpZCBmaWVsZCB3aWxsIG1hdGNoIHdoYXQgaXMKLQkgKiBzcGVjaWZpZWQgaW4gb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3BsdWdpbi54bWwgZm9yIHRoZSBEVEQgY29udGVudAotCSAqIHR5cGUuCi0JICogCi0JICogVGhpcyB2YWx1ZSBpcyBpbnRlbnRpb25hbGx5IHNldCB0aHJvdWdoIGEgZGVmYXVsdCBwcm90ZWN0ZWQgbWV0aG9kIHNvCi0JICogdGhhdCBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRFREID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBEVEQgQ29udGVudCBUeXBlIElkZW50aWZpZXIgSUQgYXMgYSBTdHJpbmcKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9EVERNb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjNjYTQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvRFRETW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLS8qKgotICogPHA+Ci0gKiBBbiBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhlIFNTRS1iYXNlZCBEVEQgbW9kZWwuCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRFRETW9kZWwgZXh0ZW5kcyBJU3RydWN0dXJlZE1vZGVsewotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JRFREUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JRFREUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM2ZDM0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSURURFBhcnRpdGlvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBEVEQuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLnRleHQuSURURFBhcnRpdGlvbnMKLSAqLwotcHVibGljIGludGVyZmFjZSBJRFREUGFydGl0aW9uVHlwZXMgewotCQotCVN0cmluZyBEVERfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90YXNrcy9EVERGaWxlVGFza1NjYW5uZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzMjY5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rhc2tzL0RUREZpbGVUYXNrU2Nhbm5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXI7Ci0KLXB1YmxpYyBjbGFzcyBEVERGaWxlVGFza1NjYW5uZXIgZXh0ZW5kcyBTdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyIHsKLQlwdWJsaWMgRFRERmlsZVRhc2tTY2FubmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbikgewotCQlyZXR1cm4gdGV4dFJlZ2lvbi5nZXRUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxYjViNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvRFREU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci0KLQotcHVibGljIGNsYXNzIERURFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Cb3VuZHJ5Q2FzZXMoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmU3RhcnQpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZE5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxKTsKLQkJcmV0dXJuIHJlcGFyc2Uoc3RhcnROb2RlLmdldFN0YXJ0KCksIGVuZE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIjbmV3SW5zdGFuY2UoKQotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlTdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eUVuZCkgewotCQlyZXR1cm4gc3VwZXIucmVwYXJzZShkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9EVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWIwZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L0RURFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBEVERTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25GYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBEVERfR0VORVJJQyA9IDU7Ci0KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCB0eXBlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2UgPSBudWxsOwotCQlzd2l0Y2ggKHR5cGUpIHsKLQkJCWNhc2UgRFREX0dFTkVSSUMgOgotCQkJCWluc3RhbmNlID0gbmV3IEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1JlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y3ZGNmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3RleHQvUmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLXB1YmxpYyBjbGFzcyBSZWdpb25JdGVyYXRvciB7Ci0KLQlwcml2YXRlIGludCBjdXJyZW50SW5kZXg7Ci0KLQkvLyBwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uczsKLQkvLyBwcml2YXRlIGludCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0OwotCXByaXZhdGUgSVRleHRSZWdpb24gc3RhcnRSZWdpb24sIGVuZFJlZ2lvbjsKLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJdGhpcyhub2RlLCBub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCXB1YmxpYyBSZWdpb25JdGVyYXRvcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIGludCBzdGFydE9mZnNldCwgaW50IGVuZE9mZnNldCkgewotCQlyZWdpb25zID0gbm9kZS5nZXRSZWdpb25zKCk7Ci0JCXN0YXJ0UmVnaW9uID0gbm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydE9mZnNldCk7Ci0JCWVuZFJlZ2lvbiA9IG5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZW5kT2Zmc2V0IC0gMSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChzdGFydFJlZ2lvbiA9PSByZWdpb24pIHsKLQkJCQljdXJyZW50SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIFJlZ2lvbkl0ZXJhdG9yKElUZXh0UmVnaW9uTGlzdCByZWdpb25zKSB7Ci0JCXRoaXMucmVnaW9ucyA9IHJlZ2lvbnM7Ci0JCXN0YXJ0UmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCWVuZFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCWN1cnJlbnRJbmRleCA9IDA7Ci0JCS8vIHRoaXMobm9kZSwgbm9kZS5nZXRTdGFydCgpLCBub2RlLmdldEVuZCgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQlpZiAoY3VycmVudEluZGV4IDwgcmVnaW9ucy5zaXplKCkpIHsKLQkJCXJldHVybiBjdXJyZW50SW5kZXggPD0gcmVnaW9ucy5pbmRleE9mKGVuZFJlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotCQlpZiAoY3VycmVudEluZGV4ID49IDApIHsKLQkJCXJldHVybiBjdXJyZW50SW5kZXggPj0gcmVnaW9ucy5pbmRleE9mKHN0YXJ0UmVnaW9uKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIG5leHQoKSB7Ci0JCWlmIChoYXNOZXh0KCkpIHsKLQkJCXJldHVybiByZWdpb25zLmdldChjdXJyZW50SW5kZXgrKyk7Ci0JCX0KLQkJdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gcHJldmlvdXMoKSB7Ci0JCWlmIChoYXNQcmV2aW91cygpKSB7Ci0JCQlyZXR1cm4gcmVnaW9ucy5nZXQoLS1jdXJyZW50SW5kZXgpOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3OTM0MjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUudGV4dC5JRFREUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JEVEQgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciNnZXREZWZhdWx0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkgewotCQlyZXR1cm4gSURURFBhcnRpdGlvbnMuRFREX0RFRkFVTFQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyI2luaXRMZWdhbENvbnRlbnRUeXBlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlmU3VwcG9ydGVkVHlwZXMgPSBuZXcgU3RyaW5nW117SURURFBhcnRpdGlvbnMuRFREX0RFRkFVTFQsIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTn07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvRFREVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9EVERUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyMDZiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9EVERUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOTEgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4zLjUgb24gMy8xNC8wNSA5OjM3IFBNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci0KLS8qKiAKLSAqIEdlbmVyYXRlIHdpdGggImR0ZHNrZWxldG9uIi4KLSAqCi0gKiBJdCByZW1vdmVzIHNvbWUgdW51c2VkIGZpZWxkcyBhbmQgYXZvaWRzIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgCi0gKi8KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS4zLjUKLSAqIG9uIDMvMTQvMDUgOTozNyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZC5mbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIERURFRva2VuaXplciB7Ci0KLSAgLyoqIFRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfQlVGRkVSU0laRSA9IDE2Mzg0OwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRSSUJVVEVfRU5VTUVSQVRJT04gPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgTk9UQVRJT05fTkFNRSA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfQ0hJTEQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTlRJVFlfQ09OVEVOVCA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IENPTU1FTlRfQ09OVEVOVCA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEFUVExJU1RfTkFNRSA9IDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVYVEVSTkFMSURfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfQ09OVEVOVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IEVMRU1FTlRfTUlYRUQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX01JWEVEX09SX0NISUxEID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUUklCVVRFX0NPTlRFTlQgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgRU5USVRZX05BTUUgPSAzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBBVFRSSUJVVEVfREVGQVVMVCA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBFTEVNRU5UX05BTUUgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBOREFUQV9DT05URU5UID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQVRUTElTVF9DT05URU5UID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IE5PREUgPSAxOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTBcMFwxXDBcMVw1XDFcM1wxXDBcMVwwXDFcMlwyMlwwXDFcNVwxXDYiKwotICAgICJcMVwxXDFcMzdcMVwwXDFcMjNcMVwwXDFcNDZcMVw0MlwxXDQzXDFcNFwxXDciKwotICAgICJcMVw0NVwxXDEyXDFcMFwxXDBcMTJcMFwxXDBcMVwxMFwxXDExXDFcMFwxXDEzIisKLSAgICAiXDFcNFwxXDBcMVwyNVwxXDMxXDFcMzJcMVwzM1wxXDE0XDFcMzVcMlwwXDFcMjEiKwotICAgICJcMVwwXDFcMzZcMVwxNVwxXDE2XDFcMTdcMVwyNFwxXDI3XDFcNDBcMVwzNFwxXDI2IisKLSAgICAiXDFcMjBcMVwzMFwyXDBcMVw0MVwxXDIyXDFcMFwxXDBcMVwwXDJcMFwxXDAiKwotICAgICJcMVwwXDMyXDBcMVwwXDFcNDRcdWZmODNcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICAzOSwgICAgNzgsICAgMTE3LCAgIDE1NiwgICAxOTUsICAgMjM0LCAgIDI3MywgICAzMTIsICAgMzUxLCAKLSAgICAgIDM5MCwgICA0MjksICAgNDY4LCAgIDUwNywgICA1NDYsICAgNTg1LCAgIDYyNCwgICAgMzksICAgIDM5LCAgICAzOSwgCi0gICAgICA2NjMsICAgNzAyLCAgIDc0MSwgICA3ODAsICAgODE5LCAgICAzOSwgICAgMzksICAgODU4LCAgIDg5NywgICAgMzksIAotICAgICAgIDM5LCAgIDkzNiwgICA5MzYsICAgOTc1LCAgMTAxNCwgIDEwNTMsICAxMDkyLCAgMTEzMSwgIDExNzAsICAxMjA5LCAKLSAgICAgMTI0OCwgIDEyODcsICAxMzI2LCAgMTM2NSwgIDE0MDQsICAxNDQzLCAgICAzOSwgIDE0ODIsICAxNTIxLCAgMTU2MCwgCi0gICAgIDE1OTksICAxNjM4LCAgICAzOSwgIDE2NzcsICAxNzE2LCAgMTc1NSwgIDE3OTQsICAxODMzLCAgMTg3MiwgICAgMzksIAotICAgICAgIDM5LCAgMTkxMSwgIDE5NTAsICAxOTg5LCAgMjAyOCwgIDIwNjcsICAyMTA2LCAgICAzOSwgICAgMzksICAgIDM5LCAKLSAgICAgMjE0NSwgIDIxODQsICAyMjIzLCAgMjI2MiwgIDIzMDEsICAyMzQwLCAgMjM3OSwgICA4OTcsICAyNDE4LCAgIDk3NSwgCi0gICAgIDI0NTcsICAyNDk2LCAgMjUzNSwgIDI1NzQsICAgOTc1LCAgMjYxMywgIDI2NTIsICAyNjkxLCAgMjczMCwgIDE1NjAsIAotICAgICAyNzY5LCAgMjgwOCwgIDI4NDcsICAyODg2LCAgMjkyNSwgIDI5NjQsICAzMDAzLCAgMzA0MiwgIDMwODEsICAzMTIwLCAKLSAgICAgMTk1MCwgIDMxNTksICAzMTk4LCAgMzIzNywgIDMyNzYsICAzMzE1LCAgMTk1MCwgICAgMzksICAzMzU0LCAgMzM5MywgCi0gICAgIDM0MzIsICAgIDM5LCAgMzQ3MSwgIDM1MTAsICAzNTQ5LCAgICAzOSwgIDM1ODgsICAzNjI3LCAgICAzOSwgIDM2NjYsIAotICAgICAzNzA1LCAgMzc0NCwgICAgMzksICAgIDM5LCAgMzc4MywgIDM4MjIsICAzODYxLCAgMzkwMCwgIDM5MzksICAzOTc4LCAKLSAgICAgNDAxNywgIDQwNTYsICAgIDM5LCAgNDA5NSwgIDQxMzQsICA0MTczLCAgICAzOSwgIDQyMTIsICA0MjUxLCAgNDI5MCwgCi0gICAgIDQzMjksICA0MzY4LCAgNDQwNywgIDQ0NDYsICA0NDg1LCAgNDUyNCwgIDQ1NjMsICA0NjAyLCAgNDY0MSwgIDQ2ODAsIAotICAgICA0NzE5LCAgNDc1OCwgIDQ3OTcsICA0ODM2LCAgNDg3NSwgIDQ5MTQsICA0OTUzLCAgNDk5MiwgIDUwMzEsICA1MDcwLCAKLSAgICAgNTEwOSwgIDUxNDgsICA1MTg3LCAgNTIyNiwgIDUyNjUsICA1MzA0LCAgNTM0MywgICA5NzUsICA1MzgyLCAgNTQyMSwgCi0gICAgIDU0NjAsICA1NDk5LCAgNTUzOCwgIDU1NzcsICAxNTYwLCAgNTYxNiwgIDU2NTUsICA1Njk0LCAgNTczMywgIDU3NzIsIAotICAgICA1ODExLCAgNTg1MCwgICA1NDYsICA1ODg5LCAgNTkyOCwgIDU5NjcsICA2MDA2LCAgIDk3NSwgICA5NzUsICAgOTc1LCAKLSAgICAgNjA0NSwgIDE1NjAsICA2MDg0LCAgNjEyMywgIDE1NjAsICA2MTYyLCAgNjIwMSwgIDYyNDAsICAxOTUwLCAgIDU0NiwgCi0gICAgIDYyNzksICAgNTQ2LCAgIDgxOSwgIDYzMTgsICA2MzU3LCAgNjM5NiwgIDY0MzUsICA2NDc0LCAgNjUxMywgICA1NDYsIAotICAgICA2NTUyLCAgMTU2MCwgIDE1NjAsICAxNTYwLCAgMTk1MCwgIDY1OTEsICAgIDM5LCAgMTk1MAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEgKHBhcnQgMCkKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQwID0gCi0gICAgIlwyXDE3XDJcMjBcMVwxN1wxXDIwXDFcMjFcMVwxN1wxXDIyXDFcMjMiKwotICAgICJcMVwxN1wxXDI0XDFcMjVcMlwxN1wxXDI2XDNcMTdcMVwyN1wxXDE3IisKLSAgICAiXDFcMzBcMjFcMTdcNDdcMFwyXDMxXDJcMjBcMVwzMlwxXDIwXDFcMCIrCi0gICAgIlwxXDMyXDFcMzFcMVwzM1wxXDMxXDFcMzNcMjNcMzFcMVwzNFwyXDMxIisKLSAgICAiXDFcMzVcMVwzNlwyXDM3XDFcMzFcMlw0MFwyXDIwXDFcMFwxXDIwIisKLSAgICAiXDNcNDBcMVwzM1wxXDQwXDFcMzNcN1w0MFwxXDQxXDE2XDQwXDRcMCIrCi0gICAgIlwxXDQwXDFcNDJcMVw0M1wyXDIwXDFcNDJcMVwyMFwzXDQyXDFcMzMiKwotICAgICJcMVw0MlwxXDMzXDEyXDQyXDFcNDRcMVw0NVwxNlw0MlwxXDQ2XDJcNDciKwotICAgICJcMlwyMFwxXDQ3XDFcMjBcM1w0N1wxXDMzXDFcNDdcMVwzM1wzM1w0NyIrCi0gICAgIlwyXDUwXDJcMjBcMVwwXDFcMjBcMlwwXDFcNTBcMVwzM1wxXDUwIisKLSAgICAiXDFcMzNcMjZcNTBcNFwwXDFcNTBcMVw0MlwxXDQzXDJcMjBcMVw0MiIrCi0gICAgIlwxXDIwXDNcNDJcMVwzM1wxXDQyXDFcMzNcM1w0MlwxXDUxXDZcNDIiKwotICAgICJcMVw1MlwxXDUzXDE2XDQyXDFcNDZcMlw1NFwyXDU1XDFcNTRcMVw1NSIrCi0gICAgIlw0XDU0XDFcNTZcMVw1N1wzM1w1NFwyXDYwXDJcMjBcMVw0MlwxXDIwIisKLSAgICAiXDJcNDJcMVw2MFwxXDMzXDFcNjBcMVwzM1wyNlw2MFw0XDQyXDFcNjAiKwotICAgICJcMlw2MVwyXDIwXDFcNDJcMVwyMFwyXDQyXDFcNjFcMVwzM1wxXDYxIisKLSAgICAiXDFcMzNcMjZcNjFcNFw0MlwxXDYxXDFcNjJcMVw2M1wxXDY0XDFcNjUiKwotICAgICJcMVw2MlwxXDY2XDNcNjJcMVwzM1wxXDYyXDFcMzNcMVw2N1wyXDYyIisKLSAgICAiXDFcNzBcMVw2MlwxXDcxXDEwXDYyXDFcNzJcNFw2MlwxXDczXDJcNjIiKwotICAgICJcMVw3NFwyXDc1XDFcNjJcMVw3NlwxXDc3XDFcMTAwXDJcMjBcMVw3NyIrCi0gICAgIlwxXDIwXDNcNzdcMVwzM1wxXDc3XDFcMzNcMjNcNzdcMVwxMDFcNlw3NyIrCi0gICAgIlwxXDEwMlwyXDEwM1wyXDIwXDFcMTAzXDFcMjBcM1wxMDNcMVwzM1wxXDEwMyIrCi0gICAgIlwxXDMzXDI2XDEwM1wxXDEwNFwxXDEwNVwxXDEwNlwyXDEwM1wyXDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwyM1wxN1wyXDBcMlwyMFwxXDBcMVwyMFw1M1wwXDFcMTA3XDM0XDAiKwotICAgICJcMlwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDAiKwotICAgICJcMVwxN1wxXDExMFwxXDE3XDFcMTExXDNcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwxXDExMlwyMlwxN1wyXDExM1wyXDBcMVwxMTNcMlwwXDFcMTEzXDJcMCIrCi0gICAgIlwxXDExM1wxXDBcN1wxMTNcMVwwXDIzXDExM1wyXDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMTE0XDJcMTciKwotICAgICJcMVwwXDIzXDE3XDJcMzFcNlwwXDFcMzFcMVwwXDFcMzFcMVwwIisKLSAgICAiXDI2XDMxXDRcMFwzXDMxXDZcMFwxXDMxXDFcMFwxXDMxXDFcMCIrCi0gICAgIlwxM1wzMVwxXDExNVwxMlwzMVw0XDBcMVwzMVwyXDBcMlwxMTZcMVwwIisKLSAgICAiXDFcMTE2XDMxXDBcMVwxMTdcN1wwXDJcNDBcNFwwXDNcNDBcMVwwIisKLSAgICAiXDFcNDBcMVwwXDI2XDQwXDRcMFwxXDQwXDJcNDJcMlwwXDFcNDIiKwotICAgICJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDMzXDQyXDFcNDNcMVwxMjAiKwotICAgICJcMlwxMjFcMVw0M1wxXDEyMVwzXDQzXDFcMTIxXDFcNDNcMVwxMjFcMzNcNDMiKwotICAgICJcMlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDAiKwotICAgICJcNlw0MlwxXDEyMlwyNlw0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDAiKwotICAgICJcMVw0MlwxXDBcMTRcNDJcMVwxMjNcMTZcNDJcMlw0NlwyXDEyNFwxXDQ2IisKLSAgICAiXDFcMTI0XDNcNDZcMVwxMjRcMVw0NlwxXDEyNFwzMlw0NlwxXDEyNVwyXDQ3IisKLSAgICAiXDJcMFwxXDQ3XDFcMFwzXDQ3XDFcMFwxXDQ3XDFcMFwzM1w0NyIrCi0gICAgIlwyXDUwXDZcMFwxXDUwXDFcMFwxXDUwXDFcMFwyNlw1MFw0XDAiKwotICAgICJcMVw1MFwyXDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyIisKLSAgICAiXDFcMFwxN1w0MlwxXDEyNlwxNVw0MlwyXDBcMVw0MlwxXDBcM1w0MiIrCi0gICAgIlwxXDBcMVw0MlwxXDBcNlw0MlwxXDEyN1wyNlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTRcNDJcMVwxMzBcMTZcNDIiKwotICAgICJcMTJcNTRcMlwwXDM1XDU0XDJcNTVcMVw1NFwxXDU1XDRcNTRcMlwwIisKLSAgICAiXDMzXDU0XDEyXDBcMVwxMzFcMzRcMFwyXDYwXDJcMFwxXDQyXDFcMCIrCi0gICAgIlwyXDQyXDFcNjBcMVwwXDFcNjBcMVwwXDI2XDYwXDRcNDJcMVw2MCIrCi0gICAgIlwyXDYxXDJcMFwxXDQyXDFcMFwyXDQyXDFcNjFcMVwwXDFcNjEiKwotICAgICJcMVwwXDI2XDYxXDRcNDJcMVw2MVwyXDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwyNlw2MlwzXDBcMlw2MlwxXDYzIisKLSAgICAiXDFcMTMyXDJcMTMzXDFcNjNcMVwxMzNcM1w2M1wxXDEzM1wxXDYzXDFcMTMzIisKLSAgICAiXDI2XDYzXDNcMTMzXDJcNjNcM1wwXDFcNjVcNTBcMFwxXDY2XDQxXDAiKwotICAgICJcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDEzNFwyMlw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMlw2MlwxXDEzNVw1XDYyXDFcMTM2IisKLSAgICAiXDE1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFwxN1w2MlwxXDEzN1w2XDYyXDNcMFw0XDYyXDJcMCIrCi0gICAgIlwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxN1w2MlwxXDE0MCIrCi0gICAgIlw2XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFw1XDYyXDFcMTQxXDEyXDYyXDFcMTQyXDFcMTQzXDRcNjIiKwotICAgICJcM1wwXDJcNjJcMlw3NlwyXDE0NFwxXDc2XDFcMTQ0XDNcNzZcMVwxNDQiKwotICAgICJcMVw3NlwxXDE0NFwyNlw3NlwzXDE0NFwxXDc2XDFcMTMyXDJcNzdcMlwwIisKLSAgICAiXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzdcMVwwXDMzXDc3XDFcMTAwIisKLSAgICAiXDFcMTQ1XDJcMTQ2XDFcMTAwXDFcMTQ2XDNcMTAwXDFcMTQ2XDFcMTAwXDFcMTQ2IisKLSAgICAiXDMzXDEwMFwyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3IisKLSAgICAiXDFcMFw1XDc3XDFcMTQ3XDEyXDc3XDFcMTUwXDFcMTUxXDExXDc3XDJcMTAyIisKLSAgICAiXDJcMTUyXDFcMTAyXDFcMTUyXDNcMTAyXDFcMTUyXDFcMTAyXDFcMTUyXDMyXDEwMiIrCi0gICAgIlwxXDE1M1wyXDEwM1wyXDBcMVwxMDNcMVwwXDNcMTAzXDFcMFwxXDEwMyIrCi0gICAgIlwxXDBcMjZcMTAzXDNcMFwyXDEwM1wxMlwwXDFcMTU0XDM0XDBcMlwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcMVwxNTUiKwotICAgICJcNlwxN1wxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDRcMTdcMVwxNTZcMlwxN1wxXDBcMjVcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwxNTciKwotICAgICJcMlwxN1wxXDBcMjNcMTdcMlwxMTNcMlwwXDFcMTEzXDJcMFwxXDExMyIrCi0gICAgIlwxXDE2MFwxXDBcMVwxMTNcMVwwXDdcMTEzXDFcMFwyM1wxMTNcMlwxNyIrCi0gICAgIlwyXDBcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxNyIrCi0gICAgIlwxXDE2MVwyXDE3XDFcMFwyM1wxN1wyXDMxXDZcMFwxXDMxXDFcMCIrCi0gICAgIlwxXDMxXDFcMFwxNlwzMVwxXDE2Mlw3XDMxXDRcMFwxXDMxXDI3XDAiKwotICAgICJcMVwxNjNcMTdcMFwxXDEyMVwxXDE2NFw0NVwxMjFcMlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTJcNDJcMVwxNjVcMjJcNDIiKwotICAgICJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwXDE1XDQyIisKLSAgICAiXDFcMTY2XDE1XDQyXDQ2XDEyNFwxXDE2N1wyXDQyXDJcMFwxXDQyXDFcMCIrCi0gICAgIlwzXDQyXDFcMFwxXDQyXDFcMFwxMVw0MlwxXDE3MFwyM1w0MlwyXDAiKwotICAgICJcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTJcNDJcMVwxNzEiKwotICAgICJcMjJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDJcMVwwIisKLSAgICAiXDE1XDQyXDFcMTcyXDE1XDQyXDEzXDBcMVwxNzNcMzNcMFwxXDEzM1wxXDE3NCIrCi0gICAgIlw0NVwxMzNcMlw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcNFw2MlwxXDE3NVwyMVw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcNFw2MlwxXDE3NlwyMVw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcNFw2MlwxXDE3N1wyMVw2MlwzXDBcNFw2MlwyXDBcMVw2MiIrCi0gICAgIlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMjBcNjJcMVwyMDBcNVw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMTFcNjJcMVwyMDFcMTRcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDJcNjJcMVwyMDJcMjNcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcMjAzXDI1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFw1XDYyXDFcMjA0XDIwXDYyXDNcMCIrCi0gICAgIlwyXDYyXDQ2XDE0NFwxXDE3NFwxXDE0NlwxXDIwNVw0NVwxNDZcMlw3N1wyXDAiKwotICAgICJcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMlw3N1wxXDIwNiIrCi0gICAgIlwzMlw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDAiKwotICAgICJcMVwyMDdcMzRcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDVcNzdcMVwyMTBcMjVcNzdcNDZcMTUyXDFcMjExXDJcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDJcMTdcMVwyMTIiKwotICAgICJcNFwxN1wxXDBcMjVcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDVcMTdcMVwyMTNcMVwxN1wxXDBcMjVcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDdcMTdcMVwwIisKLSAgICAiXDFcMTdcMVwyMTRcMjNcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMlwwIisKLSAgICAiXDFcMTdcMVwwXDFcMTdcMVwyMTVcNVwxN1wxXDBcMjNcMTdcMlwzMSIrCi0gICAgIlw2XDBcMVwzMVwxXDBcMVwzMVwxXDBcMTdcMzFcMVwyMTZcNlwzMSIrCi0gICAgIlw0XDBcMVwzMVwzMlwwXDFcMjE3XDE0XDBcMlw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcNFw0MlwxXDIyMFwzMFw0MiIrCi0gICAgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDIyMVwzM1w0MlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MiIrCi0gICAgIlwxXDBcNFw0MlwxXDIyMlwzMFw0MlwyXDBcMVw0MlwxXDBcM1w0MiIrCi0gICAgIlwxXDBcMVw0MlwxXDBcNFw0MlwxXDIyM1wzMFw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMVw0MlwxXDIyNFwzMVw0MiIrCi0gICAgIlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMCIrCi0gICAgIlw1XDYyXDFcMjI1XDIwXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwxMFw2MlwxXDIyNlwxNVw2MlwzXDAiKwotICAgICJcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcMTFcNjJcMVwyMjdcMTRcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwIisKLSAgICAiXDNcNjJcMVwwXDFcNjJcMVwwXDFcMjMwXDI1XDYyXDNcMFw0XDYyIisKLSAgICAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFw0XDYyIisKLSAgICAiXDFcMjMxXDIxXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwxM1w2MlwxXDIzMlwxMlw2MlwzXDBcNFw2MiIrCi0gICAgIlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMjRcNjIiKwotICAgICJcMVwyMzNcMVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMjVcNjJcMVwyMzRcM1wwXDJcNjJcMlw3NyIrCi0gICAgIlwyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMTNcNzciKwotICAgICJcMVwyMzVcMjFcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDI0XDc3XDFcMjM2XDEwXDc3XDJcMFwxXDc3XDFcMFwzXDc3IisKLSAgICAiXDFcMFwxXDc3XDFcMFwyNVw3N1wxXDIzN1w1XDc3XDJcMTdcMlwwIisKLSAgICAiXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDFcMjQwXDZcMTciKwotICAgICJcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3IisKLSAgICAiXDFcMFw0XDE3XDFcMjQxXDJcMTdcMVwwXDI1XDE3XDJcMFwxXDE3IisKLSAgICAiXDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw0XDE3XDFcMjQyXDJcMTciKwotICAgICJcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3IisKLSAgICAiXDFcMFw1XDE3XDFcMjQzXDFcMTdcMVwwXDIzXDE3XDJcMzFcNlwwIisKLSAgICAiXDFcMzFcMVwwXDFcMzFcMVwwXDExXDMxXDFcMjQ0XDE0XDMxXDRcMCIrCi0gICAgIlwxXDMxXDMzXDBcMVwyNDVcMTNcMFwyXDQyXDJcMFwxXDQyXDFcMCIrCi0gICAgIlwzXDQyXDFcMFwxXDQyXDFcMFwxXDI0NlwzNFw0MlwyXDBcMVw0MiIrCi0gICAgIlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcNVw0MlwxXDI0N1wyN1w0MiIrCi0gICAgIlwyXDBcMVw0MlwxXDBcM1w0MlwxXDBcMVw0MlwxXDBcMTFcNDIiKwotICAgICJcMVwyNTBcMjNcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiKwotICAgICJcMVwwXDFcMjUxXDM0XDQyXDJcMFwxXDQyXDFcMFwzXDQyXDFcMCIrCi0gICAgIlwxXDQyXDFcMFw1XDQyXDFcMjUyXDI1XDQyXDJcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDRcNjJcMVwyNTNcMjFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDIyXDYyXDFcMjU0XDNcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDRcNjJcMVwyNTVcMjFcNjIiKwotICAgICJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcMVwwXDIxXDYyXDFcMjU2XDRcNjJcM1wwXDRcNjJcMlwwXDFcNjIiKwotICAgICJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDExXDYyXDFcMjU3XDE0XDYyIisKLSAgICAiXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMjYwXDI0XDYyXDNcMFw0XDYyXDJcMFwxXDYyIisKLSAgICAiXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxNFw2MlwxXDI2MVwxMVw2MiIrCi0gICAgIlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MiIrCi0gICAgIlwxXDBcMVwyNjJcMjVcNjJcM1wwXDJcNjJcMlw3N1wyXDBcMVw3NyIrCi0gICAgIlwxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMVw3N1wxXDI2M1wzM1w3NyIrCi0gICAgIlwyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcMTRcNzciKwotICAgICJcMVwyNjRcMjBcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDFcMjY1XDMyXDc3XDJcMTdcMlwwXDFcMTdcMlwwXDFcMTciKwotICAgICJcMlwwXDFcMTdcMVwwXDNcMTdcMVwyNjZcM1wxN1wxXDBcMjVcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDZcMTciKwotICAgICJcMVwyNjdcMVwwXDI1XDE3XDJcMFwxXDE3XDJcMFwxXDE3XDJcMCIrCi0gICAgIlwxXDE3XDFcMFw1XDE3XDFcMjcwXDFcMTdcMVwwXDI1XDE3XDJcMCIrCi0gICAgIlwxXDE3XDJcMFwxXDE3XDJcMFwxXDE3XDFcMFw3XDE3XDFcMCIrCi0gICAgIlwyXDE3XDFcMjcxXDIwXDE3XDJcMzFcNlwwXDFcMzFcMVwwXDFcMzEiKwotICAgICJcMVwwXDRcMzFcMVwyNzJcMjFcMzFcNFwwXDFcMzFcMjVcMFwxXDI3MyIrCi0gICAgIlwyMVwwXDJcNDJcMlwwXDFcNDJcMVwwXDNcNDJcMVwwXDFcNDIiKwotICAgICJcMVwwXDJcNDJcMVwyNzRcMzJcNDJcMlwwXDFcNDJcMVwwXDNcNDIiKwotICAgICJcMVwwXDFcNDJcMVwwXDE2XDQyXDFcMjc0XDE2XDQyXDJcMFwxXDQyIisKLSAgICAiXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwyXDQyXDFcMjc1XDMyXDQyIisKLSAgICAiXDJcMFwxXDQyXDFcMFwzXDQyXDFcMFwxXDQyXDFcMFwxNlw0MiIrCi0gICAgIlwxXDI3NlwxNFw0MlwyXDYyXDJcMFwxXDYyXDFcMFwzXDYyXDFcMCIrCi0gICAgIlwxXDYyXDFcMFw1XDYyXDFcMjc3XDFcMzAwXDE3XDYyXDNcMFw0XDYyIisKLSAgICAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxXDMwMSIrCi0gICAgIlwyNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcNVw2MlwxXDMwMlwyMFw2MlwzXDBcNFw2MlwyXDAiKwotICAgICJcMVw2MlwxXDBcM1w2MlwxXDBcMVw2MlwxXDBcMTJcNjJcMVwzMDMiKwotICAgICJcMTNcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDVcNjJcMVwyMzRcMjBcNjJcM1wwXDRcNjJcMlwwIisKLSAgICAiXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwXDVcNjJcMVwzMDQiKwotICAgICJcMjBcNjJcM1wwXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDE3XDYyXDFcMTMyXDZcNjJcM1wwXDJcNjJcMlw3NyIrCi0gICAgIlwyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3N1wxXDBcNVw3NyIrCi0gICAgIlwxXDMwNVwyN1w3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcNVw3N1wxXDMwNlwyN1w3N1wyXDBcMVw3N1wxXDBcM1w3NyIrCi0gICAgIlwxXDBcMVw3N1wxXDBcMTdcNzdcMVwzMDdcMTNcNzdcMlwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wxXDBcNFwxN1wxXDMxMCIrCi0gICAgIlwyXDE3XDFcMFwyNVwxN1wyXDBcMVwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wxXDBcN1wxN1wxXDBcMVwzMTFcMjRcMTdcMlwwXDFcMTciKwotICAgICJcMlwwXDFcMTdcMlwwXDFcMTdcMVwwXDRcMTdcMVwzMTJcMlwxNyIrCi0gICAgIlwxXDBcMjNcMTdcMlwzMVw2XDBcMVwzMVwxXDBcMVwzMVwxXDAiKwotICAgICJcMTFcMzFcMVwzMTNcMTRcMzFcNFwwXDFcMzFcMjBcMFwxXDMxNFwyNlwwIisKLSAgICAiXDJcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDFcMzE1XDI1XDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMFwzXDYyIisKLSAgICAiXDFcMFwxXDYyXDFcMFwzXDYyXDFcMzE2XDIyXDYyXDNcMFw0XDYyIisKLSAgICAiXDJcMFwxXDYyXDFcMFwzXDYyXDFcMFwxXDYyXDFcMFwxMFw2MiIrCi0gICAgIlwxXDMxN1wxNVw2MlwzXDBcNFw2MlwyXDBcMVw2MlwxXDBcM1w2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMjBcNjJcMVwyMzRcNVw2MlwzXDBcMlw2MiIrCi0gICAgIlwyXDc3XDJcMFwxXDc3XDFcMFwzXDc3XDFcMFwxXDc3XDFcMCIrCi0gICAgIlwxXDMyMFwzNFw3N1wyXDBcMVw3N1wxXDBcM1w3N1wxXDBcMVw3NyIrCi0gICAgIlwxXDBcMjBcNzdcMVwzMjFcMTJcNzdcMlwxN1wyXDBcMVwxN1wyXDAiKwotICAgICJcMVwxN1wyXDBcMVwxN1wxXDBcM1wxN1wxXDMyMlwzXDE3XDFcMCIrCi0gICAgIlwyM1wxN1wyNVwwXDFcMzIzXDIxXDBcMlw2MlwyXDBcMVw2MlwxXDAiKwotICAgICJcM1w2MlwxXDBcMVw2MlwxXDBcMTJcNjJcMVwzMjRcMTNcNjJcM1wwIisKLSAgICAiXDRcNjJcMlwwXDFcNjJcMVwwXDNcNjJcMVwwXDFcNjJcMVwwIisKLSAgICAiXDEyXDYyXDFcMzI1XDEzXDYyXDNcMFw0XDYyXDJcMFwxXDYyXDFcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDFcMFwzXDYyXDFcMzI2XDIyXDYyXDNcMCIrCi0gICAgIlwyXDYyXDJcNzdcMlwwXDFcNzdcMVwwXDNcNzdcMVwwXDFcNzciKwotICAgICJcMVwwXDE3XDc3XDFcMzI3XDE1XDc3XDJcMFwxXDc3XDFcMFwzXDc3IisKLSAgICAiXDFcMFwxXDc3XDFcMFwxXDMzMFwzMlw3N1wyXDBcMlwzMjNcMVwwIisKLSAgICAiXDFcMzIzXDM1XDBcMVwzMzFcM1wwXDJcNzdcMlwwXDFcNzdcMVwwIisKLSAgICAiXDNcNzdcMVwwXDFcNzdcMVwwXDE3XDc3XDFcMzMyXDEzXDc3IjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMCwgIDgsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDksICA5LCAgOSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICAxLCAgMCwgIDksICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbWVlfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlpbnQgbm9kZV9jb3VudCA9IDA7Ci0JU3RyaW5nIGN1cnJlbnRTdHJpbmc7Ci0KLQlwcml2YXRlIFRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgVG9rZW4odHlwZSwgeXl0ZXh0KCksIHl5bGluZSwgeXljaGFyICsgc3RhcnRPZmZzZXQsIHl5bGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZShpbnQgbGluZSkgewotCQl0aGlzLnl5bGluZSA9IGxpbmU7Ci0JfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIERURFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBEVERUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgc3BsaXQsIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFs2NjMwXTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB5eV91bnBhY2soeXlfcGFja2VkMCwgb2Zmc2V0LCB0cmFucyk7Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgaW5kZXggb2YgdGhlIGxhc3QgZW50cnkKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHRyYW5zKSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzMCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X3JlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7ICAKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHl5X3JlYWRlciAhPSBudWxsKQotICAgICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGN1cnJlbnQgc3RyZWFtLCBhbmQgcmVzZXRzIHRoZQotICAgKiBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WVlfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eXJlc2V0KGphdmEuaW8uUmVhZGVyIHJlYWRlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5Y2xvc2UoKTsKLSAgICB5eV9yZWFkZXIgPSByZWFkZXI7Ci0gICAgeXlfYXRFT0YgID0gZmFsc2U7Ci0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsKLSAgICByZXR1cm4geXlfbGV4aWNhbF9zdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBmaW5hbCBwdWJsaWMgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQrcG9zXTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgU3RyaW5nIG1lc3NhZ2U7Ci0gICAgdHJ5IHsKLSAgICAgIG1lc3NhZ2UgPSBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBtZXNzYWdlID0gWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdOwotICAgIH0KLQotICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlKTsKLSAgfSAKLQotCi0gIC8qKgotICAgKiBQdXNoZXMgdGhlIHNwZWNpZmllZCBhbW91bnQgb2YgY2hhcmFjdGVycyBiYWNrIGludG8gdGhlIGlucHV0IHN0cmVhbS4KLSAgICoKLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotICAgKgotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgWXl0b2tlbiB5eWxleCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHl5X2N1cnJlbnRQb3NfbDsKLSAgICBpbnQgeXlfbWFya2VkUG9zX2w7Ci0gICAgaW50IHl5X2VuZFJlYWRfbCA9IHl5X2VuZFJlYWQ7Ci0gICAgY2hhciBbXSB5eV9idWZmZXJfbCA9IHl5X2J1ZmZlcjsKLSAgICBjaGFyIFtdIHl5Y21hcF9sID0geXljbWFwOwotCi0gICAgaW50IFtdIHl5dHJhbnNfbCA9IHl5dHJhbnM7Ci0gICAgaW50IFtdIHl5X3Jvd01hcF9sID0geXlfcm93TWFwOwotICAgIGJ5dGUgW10geXlfYXR0cl9sID0gWVlfQVRUUklCVVRFOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHl5X21hcmtlZFBvc19sID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eWNoYXIrPSB5eV9tYXJrZWRQb3NfbC15eV9zdGFydFJlYWQ7Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zX2wgPSB5eV9jdXJyZW50UG9zID0gCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvc19sOwotICAKLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICBpZiAoeXlfY3VycmVudFBvc19sIDwgeXlfZW5kUmVhZF9sKQotICAgICAgICAgICAgeXlfaW5wdXQgPSB5eV9idWZmZXJfbFt5eV9jdXJyZW50UG9zX2wrK107Ci0gICAgICAgICAgZWxzZSBpZiAoeXlfYXRFT0YpIHsKLSAgICAgICAgICAgIHl5X2lucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb25zCi0gICAgICAgICAgICB5eV9jdXJyZW50UG9zICA9IHl5X2N1cnJlbnRQb3NfbDsKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyAgID0geXlfbWFya2VkUG9zX2w7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHl5X3JlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB5eV9jdXJyZW50UG9zX2wgID0geXlfY3VycmVudFBvczsKLSAgICAgICAgICAgIHl5X21hcmtlZFBvc19sICAgPSB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICB5eV9idWZmZXJfbCAgICAgID0geXlfYnVmZmVyOwotICAgICAgICAgICAgeXlfZW5kUmVhZF9sICAgICA9IHl5X2VuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHl5X2lucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICB5eV9pbnB1dCA9IHl5X2J1ZmZlcl9sW3l5X2N1cnJlbnRQb3NfbCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zX2xbIHl5X3Jvd01hcF9sW3l5X3N0YXRlXSArIHl5Y21hcF9sW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSB5eV9hdHRyX2xbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAxKSA9PSAxICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zX2wgPSB5eV9jdXJyZW50UG9zX2w7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID09IDggKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHl5X21hcmtlZFBvcyA9IHl5X21hcmtlZFBvc19sOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgewotCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgIH0KLSAgICAgICAgY2FzZSAyMTk6IGJyZWFrOwotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyAgfQotICAgICAgICBjYXNlIDIyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICBjYXNlIDEzNDogCi0gICAgICAgIGNhc2UgMTM1OiAKLSAgICAgICAgY2FzZSAxNTY6IAotICAgICAgICBjYXNlIDE1NzogCi0gICAgICAgIGNhc2UgMTU4OiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE3OTogCi0gICAgICAgIGNhc2UgMTgwOiAKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMDg6IAotICAgICAgICBjYXNlIDIxNTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTE6IAotICAgICAgICBjYXNlIDUyOiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjIyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk1UT0tFTl9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDE5NDogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5JRFJFRlNfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjI0OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDIyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKENPTU1FTlRfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKTsgIH0KLSAgICAgICAgY2FzZSAyMjY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVFJJQlVURV9OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEVYVEVSTkFMSURfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNjogCi0gICAgICAgIGNhc2UgMTM2OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjI5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDA6IAotICAgICAgICBjYXNlIDEzMjogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwpOyAgfQotICAgICAgICBjYXNlIDIzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgY2FzZSAyMTY6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7ICB9Ci0gICAgICAgIGNhc2UgMjMxOiBicmVhazsKLSAgICAgICAgY2FzZSAxODk6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjMyOiBicmVhazsKLSAgICAgICAgY2FzZSAxODg6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TWVNURU1fS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgNzE6IAotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICBjYXNlIDEwODogCi0gICAgICAgIGNhc2UgMTA5OiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgY2FzZSAxMzg6IAotICAgICAgICBjYXNlIDEzOTogCi0gICAgICAgIGNhc2UgMTQwOiAKLSAgICAgICAgY2FzZSAxNTk6IAotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMTYxOiAKLSAgICAgICAgY2FzZSAxNjI6IAotICAgICAgICBjYXNlIDE4MTogCi0gICAgICAgIGNhc2UgMTgzOiAKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM0OiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICBjYXNlIDE0MzogCi0gICAgICAgIGNhc2UgMTQ0OiAKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM1OiBicmVhazsKLSAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICBjYXNlIDEyMDogCi0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgY2FzZSAxNDU6IAotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgIGNhc2UgMTQ3OiAKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICBjYXNlIDE2OTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjM2OiBicmVhazsKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzc6IGJyZWFrOwotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgIH0KLSAgICAgICAgY2FzZSAyMzg6IGJyZWFrOwotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDIzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyAgfQotICAgICAgICBjYXNlIDI0MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk4OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRklYRURfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjQxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklNUExJRURfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjQyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjQzOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjQ0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oTk9UQVRJT05fTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OT1RBVElPTl9UQUcpOyAgfQotICAgICAgICBjYXNlIDI0NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5BVFRMSVNUX1RBRyk7ICB9Ci0gICAgICAgIGNhc2UgMjQ2OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRUxFTUVOVF9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyNDc6IGJyZWFrOwotICAgICAgICBjYXNlIDE4MjogCi0gICAgICAgICAgeyAgeXliZWdpbihFTlRJVFlfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyNDg6IGJyZWFrOwotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgICAgeyAgeXliZWdpbihOREFUQV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI0OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pOyAgfQotICAgICAgICBjYXNlIDI1MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCk7ICB9Ci0gICAgICAgIGNhc2UgMjUxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpOyAgfQotICAgICAgICBjYXNlIDI1MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTik7ICB9Ci0gICAgICAgIGNhc2UgMjUzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyAgfQotICAgICAgICBjYXNlIDI1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgY2FzZSA1MDogCi0gICAgICAgIGNhc2UgNTQ6IAotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMTI1OiAKLSAgICAgICAgY2FzZSAxMjY6IAotICAgICAgICBjYXNlIDEyNzogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICBjYXNlIDEzMDogCi0gICAgICAgIGNhc2UgMTMxOiAKLSAgICAgICAgY2FzZSAxNDg6IAotICAgICAgICBjYXNlIDE0OTogCi0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgY2FzZSAxNTE6IAotICAgICAgICBjYXNlIDE1MjogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAxNTQ6IAotICAgICAgICBjYXNlIDE1NTogCi0gICAgICAgIGNhc2UgMTcwOiAKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICBjYXNlIDE3MjogCi0gICAgICAgIGNhc2UgMTc1OiAKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICBjYXNlIDE3NzogCi0gICAgICAgIGNhc2UgMTkwOiAKLSAgICAgICAgY2FzZSAxOTI6IAotICAgICAgICBjYXNlIDE5MzogCi0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICBjYXNlIDIwNjogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QQVJNX0VOVElUWV9UWVBFKTsgIH0KLSAgICAgICAgY2FzZSAyNTU6IGJyZWFrOwotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTik7ICB9Ci0gICAgICAgIGNhc2UgMjU2OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlJJR0hUX1BBUkVOKTsgIH0KLSAgICAgICAgY2FzZSAyNTc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7ICB9Ci0gICAgICAgIGNhc2UgMjU4OiBicmVhazsKLSAgICAgICAgY2FzZSA1MzogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyAgfQotICAgICAgICBjYXNlIDI1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUUklCVVRFX0VOVU1FUkFUSU9OKTsgIH0KLSAgICAgICAgY2FzZSAyNjA6IGJyZWFrOwotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTik7ICB9Ci0gICAgICAgIGNhc2UgMjYxOiBicmVhazsKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgICAgeyAgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7ICB9Ci0gICAgICAgIGNhc2UgMjYyOiBicmVhazsKLSAgICAgICAgY2FzZSA2OTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVU1fQ0hPSUNFKTsgIH0KLSAgICAgICAgY2FzZSAyNjM6IGJyZWFrOwotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEVOVElUWV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyAgfQotICAgICAgICBjYXNlIDI2NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyAgfQotICAgICAgICBjYXNlIDI2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg3OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEVYVEVSTkFMSURfQ09OVEVOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjY2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oQVRUUklCVVRFX0VOVU1FUkFUSU9OKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkNEQVRBX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI2ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTczOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQpOyAgfQotICAgICAgICBjYXNlIDI2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEKTsgIH0KLSAgICAgICAgY2FzZSAyNzA6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMjogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOyAgfQotICAgICAgICBjYXNlIDI3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICBjYXNlIDExODogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgIH0KLSAgICAgICAgY2FzZSAyNzI6IGJyZWFrOwotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSAxMTU6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5ET1VCTEVRVU9URURfTElURVJBTCk7ICB9Ci0gICAgICAgIGNhc2UgMjczOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDc2OiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDE0MTogCi0gICAgICAgIGNhc2UgMTYzOiAKLSAgICAgICAgY2FzZSAxODU6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyNzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OREFUQV9WQUxVRSk7ICB9Ci0gICAgICAgIGNhc2UgMjc1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgIH0KLSAgICAgICAgY2FzZSAyNzY6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHKTsgIH0KLSAgICAgICAgY2FzZSAyNzc6IGJyZWFrOwotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU0VNSUNPTE9OKTsgIH0KLSAgICAgICAgY2FzZSAyNzg6IGJyZWFrOwotICAgICAgICBjYXNlIDMwOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SKTsgIH0KLSAgICAgICAgY2FzZSAyNzk6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7ICByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEVSQ0VOVCk7ICB9Ci0gICAgICAgIGNhc2UgMjgwOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgICAgeyAgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVORF9UQUcpOyAgfQotICAgICAgICBjYXNlIDI4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgIHsgIHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgIH0KLSAgICAgICAgY2FzZSAyODI6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9Ub2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhkYmFiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudG9rZW5pemVyOwotCi1wdWJsaWMgY2xhc3MgVG9rZW4gZXh0ZW5kcyBZeXRva2VuIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01NRU5UX1NUQVJUID0gOTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUT1IgPSA2OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfQU5ZID0gNDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9FTVBUWSA9IDQyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRFTlRfUENEQVRBID0gNDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9DT05URU5UID0gNDE7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX1RBRyA9IDQwOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVORF9UQUcgPSAyOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9DT05URU5UID0gMzI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5USVRZX1BBUk0gPSAzMTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVElUWV9UQUcgPSAzMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFWENMQU1BVElPTiA9IDg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9QQVJFTiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9IDA7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9UQVRJT05fQ09OVEVOVCA9IDIxOwotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RBVElPTl9UQUcgPSAyMDsKLQotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RfQ0hPSUNFID0gNTsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUX1NFUVVFTkNFID0gNjsKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQ0NVUl9PUFRJT05BTCA9IDc7Ci0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfT05FX09SX01PUkUgPSA4OwotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9DQ1VSX1pFUk9fT1JfTU9SRSA9IDk7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0NDVVJfVFlQRSA9IDc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUklHSFRfUEFSRU4gPSA0OwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVJUX1RBRyA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0hJVEVTUEFDRSA9IDU7Ci0KLQotCXB1YmxpYyBUb2tlbihTdHJpbmcgdHlwZSkgewotCQlzdXBlcih0eXBlKTsKLQl9Ci0KLQlwdWJsaWMgVG9rZW4oU3RyaW5nIHR5cGUsIFN0cmluZyB0ZXh0LCBpbnQgbGluZSwgaW50IGNoYXJCZWdpbiwgaW50IGxlbmd0aCkgewotCQlzdXBlcih0eXBlLCB0ZXh0LCBsaW5lLCBjaGFyQmVnaW4sIGxlbmd0aCk7Ci0JfQotCi0JcHVibGljIFRva2VuIGNyZWF0ZUNvcHkoKSB7Ci0JCVRva2VuIGNvcHkgPSBuZXcgVG9rZW4oZ2V0VHlwZSgpLCBnZXRUZXh0KCksIGdldFN0YXJ0TGluZSgpLCBnZXRTdGFydE9mZnNldCgpLCBnZXRMZW5ndGgoKSk7Ci0JCXJldHVybiBjb3B5OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvWXl0b2tlbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvWXl0b2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjBkYTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL1l5dG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotY2xhc3MgWXl0b2tlbiB7Ci0JcHVibGljIGludCBtX2NoYXJCZWdpbjsKLQlwdWJsaWMgaW50IG1fbGVuZ3RoOwotCXB1YmxpYyBpbnQgbV9saW5lOwotCXB1YmxpYyBTdHJpbmcgbV90ZXh0OwotCXB1YmxpYyBTdHJpbmcgbV90eXBlOwotCi0JWXl0b2tlbihTdHJpbmcgdHlwZSkgewotCQltX3R5cGUgPSB0eXBlOwotCX0KLQotCVl5dG9rZW4oU3RyaW5nIHR5cGUsIFN0cmluZyB0ZXh0LCBpbnQgbGluZSwgaW50IGNoYXJCZWdpbiwgaW50IGxlbmd0aCkgewotCQltX3R5cGUgPSB0eXBlOwotCQltX3RleHQgPSBuZXcgU3RyaW5nKHRleHQpOwotCQltX2xpbmUgPSBsaW5lOwotCQltX2NoYXJCZWdpbiA9IGNoYXJCZWdpbjsKLQkJbV9sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVsZXRlKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlpbnQgc3RyaW5nU3RhcnQgPSBzdGFydCAtIG1fY2hhckJlZ2luOwotCQlTdHJpbmcgb2xkU3RyaW5nID0gbV90ZXh0OwotCQltX3RleHQgPSBvbGRTdHJpbmcuc3Vic3RyaW5nKDAsIHN0cmluZ1N0YXJ0KTsKLQkJbV90ZXh0ICs9IG9sZFN0cmluZy5zdWJzdHJpbmcoc3RyaW5nU3RhcnQgKyBsZW5ndGgpOwotCi0JCW1fbGVuZ3RoID0gbV90ZXh0Lmxlbmd0aCgpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5ldyBzdHJpbmcgPSAiICsgbV90ZXh0KTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKFl5dG9rZW4gb3RoZXIpIHsKLQkJcmV0dXJuIG1fdHlwZSA9PSBvdGhlci5nZXRUeXBlKCkgJiYgbV90ZXh0LmVxdWFscyhvdGhlci5nZXRUZXh0KCkpICYmIG1fbGluZSA9PSBvdGhlci5nZXRTdGFydExpbmUoKSAmJiBtX2NoYXJCZWdpbiA9PSBvdGhlci5nZXRTdGFydE9mZnNldCgpICYmIG1fbGVuZ3RoID09IG90aGVyLmdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gbV9jaGFyQmVnaW4gKyBtX2xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIG1fbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRMaW5lKCkgewotCQlyZXR1cm4gbV9saW5lOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBtX2NoYXJCZWdpbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBtX3RleHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gbV90eXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBzdGFydE9mZnNldCkgewotCQltX2NoYXJCZWdpbiA9IHN0YXJ0T2Zmc2V0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiVGV4dCAgIDogIiArIG1fdGV4dCArICJcbnR5cGUgOiAiICsgbV90eXBlICsgIlxubGluZSAgOiAiICsgbV9saW5lICsgIlxuY0JlZy4gOiAiICsgbV9jaGFyQmVnaW4gKyAiXG5jRW5kLiA6ICIgKyBnZXRFbmRPZmZzZXQoKSArICJcbmNMZW5ndGguIDogIiArIG1fbGVuZ3RoOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9mZnNldChpbnQgZGVsdGEpIHsKLQkJbV9jaGFyQmVnaW4gKz0gZGVsdGE7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlVGV4dChTdHJpbmcgbmV3VGV4dCkgewotCQltX3RleHQgPSBuZXdUZXh0OwotCQltX2xlbmd0aCA9IG5ld1RleHQubGVuZ3RoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkLmZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNhMTRhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3Rva2VuaXplci9kdGQuZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnRva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci0KLS8qKiAKLSAqIEdlbmVyYXRlIHdpdGggImR0ZHNrZWxldG9uIi4KLSAqCi0gKiBJdCByZW1vdmVzIHNvbWUgdW51c2VkIGZpZWxkcyBhbmQgYXZvaWRzIHNvbWUgY29tcGlsZXIgd2FybmluZ3MgCi0gKi8KLQotJSUKLQotJXsKLQlpbnQgbm9kZV9jb3VudCA9IDA7Ci0JU3RyaW5nIGN1cnJlbnRTdHJpbmc7Ci0KLQlwcml2YXRlIFRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBuZXcgVG9rZW4odHlwZSwgeXl0ZXh0KCksIHl5bGluZSwgeXljaGFyICsgc3RhcnRPZmZzZXQsIHl5bGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQlwdWJsaWMgdm9pZCBzZXRTdGFydE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRoaXMuc3RhcnRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZShpbnQgbGluZSkgewotCQl0aGlzLnl5bGluZSA9IGxpbmU7Ci0JfQotJX0KLQotJWNsYXNzIERURFRva2VuaXplcgotJXB1YmxpYwotJXVuaWNvZGUKLSVjaGFyCi0KLSVzdGF0ZSBOT0RFCi0lc3RhdGUgRUxFTUVOVF9OQU1FCi0lc3RhdGUgRUxFTUVOVF9DT05URU5UCi0lc3RhdGUgRUxFTUVOVF9NSVhFRF9PUl9DSElMRAotJXN0YXRlIEVMRU1FTlRfTUlYRUQKLSVzdGF0ZSBFTEVNRU5UX0NISUxECi0lc3RhdGUgRU5USVRZX05BTUUKLSVzdGF0ZSBFTlRJVFlfQ09OVEVOVAotJXN0YXRlIE5EQVRBX0NPTlRFTlQKLQotJXN0YXRlIE5PVEFUSU9OX05BTUUKLSVzdGF0ZSBFWFRFUk5BTElEX0NPTlRFTlQKLQotJXN0YXRlIENPTU1FTlRfQ09OVEVOVAotJXN0YXRlIEFUVExJU1RfTkFNRQotJXN0YXRlIEFUVExJU1RfQ09OVEVOVAotJXN0YXRlIEFUVFJJQlVURV9DT05URU5UCi0lc3RhdGUgQVRUUklCVVRFX0RFRkFVTFQKLSVzdGF0ZSBBVFRSSUJVVEVfRU5VTUVSQVRJT04KLQotCi1BTFBIQT1bQS1aYS16XQotRElHSVQ9WzAtOV0KLU5PTk5FV0xJTkVfV0hJVEVfU1BBQ0VfQ0hBUj1bXCBcdFxiXDAxMl0KLVNUUklOR19URVhUPShcXFwifFteXG5cclwiXXxcXHtXSElURV9TUEFDRV9DSEFSfStcXCkqCi1DT01NRU5UX1RFWFQ9KFteKi9cbl18W14qXG5dIi8iW14qXG5dfFteL1xuXSIqIlteL1xuXXwiKiJbXi9cbl18Ii8iW14qXG5dKSoKLUlkZW50ID0ge0FMUEhBfSh7QUxQSEF9fHtESUdJVH18XykqCi1JbnB1dENoYXJhY3RlciA9IFteXHJcbl0KLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbnxcclxuCi0KLS8qIDMgLSBXaGl0ZSBTcGFjZSAqLwotUyAgICAgICAgICAgICAgPSAgICAoXHgyMCB8IFx4MDkgfCBceDBEIHwgXHgwQSkrCi1Ob25MaW5lVGVybWluYXRvcldoaXRlc3BhY2UgPSAoXHgyMCB8IFx4MDkpKwotCi1XaGl0ZVNwYWNlICAgICA9IHtMaW5lVGVybWluYXRvcn0gfCBbIFx0XGZdCi0KLS8qIDg0ICovCi0vKkxldHRlciAgICAgICAgID0gICAge0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30KLQotLyogODUgKi8KLUJhc2VDaGFyICAgICAgID0gICAgW1x1MDA0MS1cdTAwNUFdIHwgW1x1MDA2MS1cdTAwN0FdIHwgW1x1MDBDMC1cdTAwRDZdIHwgW1x1MDBEOC1cdTAwRjZdIHwgW1x1MDBGOC1cdTAwRkZdIHwgW1x1MDEwMC1cdTAxMzFdIHwgW1x1MDEzNC1cdTAxM0VdIHwgW1x1MDE0MS1cdTAxNDhdIHwgW1x1MDE0QS1cdTAxN0VdIHwgW1x1MDE4MC1cdTAxQzNdIHwgW1x1MDFDRC1cdTAxRjBdIHwgW1x1MDFGNC1cdTAxRjVdIHwgW1x1MDFGQS1cdTAyMTddIHwgW1x1MDI1MC1cdTAyQThdIHwgW1x1MDJCQi1cdTAyQzFdIHwgXHUwMzg2IHwgW1x1MDM4OC1cdTAzOEFdIHwgXHUwMzhDIHwgW1x1MDM4RS1cdTAzQTFdIHwgW1x1MDNBMy1cdTAzQ0VdIHwgW1x1MDNEMC1cdTAzRDZdIHwgXHUwM0RBIHwgXHUwM0RDIHwgXHUwM0RFIHwgXHUwM0UwIHwgW1x1MDNFMi1cdTAzRjNdIHwgW1x1MDQwMS1cdTA0MENdIHwgW1x1MDQwRS1cdTA0NEZdIHwgW1x1MDQ1MS1cdTA0NUNdIHwgW1x1MDQ1RS1cdTA0ODFdIHwgW1x1MDQ5MC1cdTA0QzRdIHwgW1x1MDRDNy1cdTA0QzhdIHwgW1x1MDRDQi1cdTA0Q0NdIHwgW1x1MDREMC1cdTA0RUJdIHwgW1x1MDRFRS1cdTA0RjVdIHwgW1x1MDRGOC1cdTA0RjldIHwgW1x1MDUzMS1cdTA1NTZdIHwgXHUwNTU5IHwgW1x1MDU2MS1cdTA1ODZdIHwgW1x1MDVEMC1cdTA1RUFdIHwgW1x1MDVGMC1cdTA1RjJdIHwgW1x1MDYyMS1cdTA2M0FdIHwgW1x1MDY0MS1cdTA2NEFdIHwgW1x1MDY3MS1cdTA2QjddIHwgW1x1MDZCQS1cdTA2QkVdIHwgW1x1MDZDMC1cdTA2Q0VdIHwgW1x1MDZEMC1cdTA2RDNdIHwgXHUwNkQ1IHwgW1x1MDZFNS1cdTA2RTZdIHwgW1x1MDkwNS1cdTA5MzldIHwgXHUwOTNEIHwgW1x1MDk1OC1cdTA5NjFdIHwgW1x1MDk4NS1cdTA5OENdIHwgW1x1MDk4Ri1cdTA5OTBdIHwgW1x1MDk5My1cdTA5QThdIHwgW1x1MDlBQS1cdTA5QjBdIHwgXHUwOUIyIHwgW1x1MDlCNi1cdTA5QjldIHwgW1x1MDlEQy1cdTA5RERdIHwgW1x1MDlERi1cdTA5RTFdIHwgW1x1MDlGMC1cdTA5RjFdIHwgW1x1MEEwNS1cdTBBMEFdIHwgW1x1MEEwRi1cdTBBMTBdIHwgW1x1MEExMy1cdTBBMjhdIHwgW1x1MEEyQS1cdTBBMzBdIHwgW1x1MEEzMi1cdTBBMzNdIHwgW1x1MEEzNS1cdTBBMzZdIHwgW1x1MEEzOC1cdTBBMzldIHwgW1x1MEE1OS1cdTBBNUNdIHwgXHUwQTVFIHwgW1x1MEE3Mi1cdTBBNzRdIHwgW1x1MEE4NS1cdTBBOEJdIHwgXHUwQThEIHwgW1x1MEE4Ri1cdTBBOTFdIHwgW1x1MEE5My1cdTBBQThdIHwgW1x1MEFBQS1cdTBBQjBdIHwgW1x1MEFCMi1cdTBBQjNdIHwgW1x1MEFCNS1cdTBBQjldIHwgXHUwQUJEIHwgXHUwQUUwIHwgW1x1MEIwNS1cdTBCMENdIHwgW1x1MEIwRi1cdTBCMTBdIHwgW1x1MEIxMy1cdTBCMjhdIHwgW1x1MEIyQS1cdTBCMzBdIHwgW1x1MEIzMi1cdTBCMzNdIHwgW1x1MEIzNi1cdTBCMzldIHwgXHUwQjNEIHwgW1x1MEI1Qy1cdTBCNURdIHwgW1x1MEI1Ri1cdTBCNjFdIHwgW1x1MEI4NS1cdTBCOEFdIHwgW1x1MEI4RS1cdTBCOTBdIHwgW1x1MEI5Mi1cdTBCOTVdIHwgW1x1MEI5OS1cdTBCOUFdIHwgXHUwQjlDIHwgW1x1MEI5RS1cdTBCOUZdIHwgW1x1MEJBMy1cdTBCQTRdIHwgW1x1MEJBOC1cdTBCQUFdIHwgW1x1MEJBRS1cdTBCQjVdIHwgW1x1MEJCNy1cdTBCQjldIHwgW1x1MEMwNS1cdTBDMENdIHwgW1x1MEMwRS1cdTBDMTBdIHwgW1x1MEMxMi1cdTBDMjhdIHwgW1x1MEMyQS1cdTBDMzNdIHwgW1x1MEMzNS1cdTBDMzldIHwgW1x1MEM2MC1cdTBDNjFdIHwgW1x1MEM4NS1cdTBDOENdIHwgW1x1MEM4RS1cdTBDOTBdIHwgW1x1MEM5Mi1cdTBDQThdIHwgW1x1MENBQS1cdTBDQjNdIHwgW1x1MENCNS1cdTBDQjldIHwgXHUwQ0RFIHwgW1x1MENFMC1cdTBDRTFdIHwgW1x1MEQwNS1cdTBEMENdIHwgW1x1MEQwRS1cdTBEMTBdIHwgW1x1MEQxMi1cdTBEMjhdIHwgW1x1MEQyQS1cdTBEMzldIHwgW1x1MEQ2MC1cdTBENjFdIHwgW1x1MEUwMS1cdTBFMkVdIHwgXHUwRTMwIHwgW1x1MEUzMi1cdTBFMzNdIHwgW1x1MEU0MC1cdTBFNDVdIHwgW1x1MEU4MS1cdTBFODJdIHwgXHUwRTg0IHwgW1x1MEU4Ny1cdTBFODhdIHwgXHUwRThBIHwgXHUwRThEIHwgW1x1MEU5NC1cdTBFOTddIHwgW1x1MEU5OS1cdTBFOUZdIHwgW1x1MEVBMS1cdTBFQTNdIHwgXHUwRUE1IHwgXHUwRUE3IHwgW1x1MEVBQS1cdTBFQUJdIHwgW1x1MEVBRC1cdTBFQUVdIHwgXHUwRUIwIHwgW1x1MEVCMi1cdTBFQjNdIHwgXHUwRUJEIHwgW1x1MEVDMC1cdTBFQzRdIHwgW1x1MEY0MC1cdTBGNDddIHwgW1x1MEY0OS1cdTBGNjldIHwgW1x1MTBBMC1cdTEwQzVdIHwgW1x1MTBEMC1cdTEwRjZdIHwgXHUxMTAwIHwgW1x1MTEwMi1cdTExMDNdIHwgW1x1MTEwNS1cdTExMDddIHwgXHUxMTA5IHwgW1x1MTEwQi1cdTExMENdIHwgW1x1MTEwRS1cdTExMTJdIHwgXHUxMTNDIHwgXHUxMTNFIHwgXHUxMTQwIHwgXHUxMTRDIHwgXHUxMTRFIHwgXHUxMTUwIHwgW1x1MTE1NC1cdTExNTVdIHwgXHUxMTU5IHwgW1x1MTE1Ri1cdTExNjFdIHwgXHUxMTYzIHwgXHUxMTY1IHwgXHUxMTY3IHwgXHUxMTY5IHwgW1x1MTE2RC1cdTExNkVdIHwgW1x1MTE3Mi1cdTExNzNdIHwgXHUxMTc1IHwgXHUxMTlFIHwgXHUxMUE4IHwgXHUxMUFCIHwgW1x1MTFBRS1cdTExQUZdIHwgW1x1MTFCNy1cdTExQjhdIHwgXHUxMUJBIHwgW1x1MTFCQy1cdTExQzJdIHwgXHUxMUVCIHwgXHUxMUYwIHwgXHUxMUY5IHwgW1x1MUUwMC1cdTFFOUJdIHwgW1x1MUVBMC1cdTFFRjldIHwgW1x1MUYwMC1cdTFGMTVdIHwgW1x1MUYxOC1cdTFGMURdIHwgW1x1MUYyMC1cdTFGNDVdIHwgW1x1MUY0OC1cdTFGNERdIHwgW1x1MUY1MC1cdTFGNTddIHwgXHUxRjU5IHwgXHUxRjVCIHwgXHUxRjVEIHwgW1x1MUY1Ri1cdTFGN0RdIHwgW1x1MUY4MC1cdTFGQjRdIHwgW1x1MUZCNi1cdTFGQkNdIHwgXHUxRkJFIHwgW1x1MUZDMi1cdTFGQzRdIHwgW1x1MUZDNi1cdTFGQ0NdIHwgW1x1MUZEMC1cdTFGRDNdIHwgW1x1MUZENi1cdTFGREJdIHwgW1x1MUZFMC1cdTFGRUNdIHwgW1x1MUZGMi1cdTFGRjRdIHwgW1x1MUZGNi1cdTFGRkNdIHwgXHUyMTI2IHwgW1x1MjEyQS1cdTIxMkJdIHwgXHUyMTJFIHwgW1x1MjE4MC1cdTIxODJdIHwgW1x1MzA0MS1cdTMwOTRdIHwgW1x1MzBBMS1cdTMwRkFdIHwgW1x1MzEwNS1cdTMxMkNdIHwgW1x1QUMwMC1cdUQ3QTNdICAKLQotLyogODYgKi8KLUlkZW9ncmFwaGljICAgID0gICAgW1x1NEUwMC1cdTlGQTVdIHwgXHUzMDA3IHwgW1x1MzAyMS1cdTMwMjldICAKLQotLyogNCAqLyAgLyogaXMgJy4nIHRvIGJlIGVzY2FwZWQ/PyAqLwotTmFtZUNoYXIgICAgICAgPSAgICB7TGV0dGVyfSB8IHtEaWdpdH0gfCAuIHwgLSB8IF8gfCA6IHwge0NvbWJpbmluZ0NoYXJ9IHwge0V4dGVuZGVyfQotCi0vKiA1ICovCi1OYW1lICAgICAgICAgICA9ICh7TGV0dGVyfSB8IF8gfCA6KSB7TmFtZUNoYXJ9KiAKLQotLyogODcgKi8KLUNvbWJpbmluZ0NoYXIgID0gICAgW1x1MDMwMC1cdTAzNDVdIHwgW1x1MDM2MC1cdTAzNjFdIHwgW1x1MDQ4My1cdTA0ODZdIHwgW1x1MDU5MS1cdTA1QTFdIHwgW1x1MDVBMy1cdTA1QjldIHwgW1x1MDVCQi1cdTA1QkRdIHwgXHUwNUJGIHwgW1x1MDVDMS1cdTA1QzJdIHwgXHUwNUM0IHwgW1x1MDY0Qi1cdTA2NTJdIHwgXHUwNjcwIHwgW1x1MDZENi1cdTA2RENdIHwgW1x1MDZERC1cdTA2REZdIHwgW1x1MDZFMC1cdTA2RTRdIHwgW1x1MDZFNy1cdTA2RThdIHwgW1x1MDZFQS1cdTA2RURdIHwgW1x1MDkwMS1cdTA5MDNdIHwgXHUwOTNDIHwgW1x1MDkzRS1cdTA5NENdIHwgXHUwOTREIHwgW1x1MDk1MS1cdTA5NTRdIHwgW1x1MDk2Mi1cdTA5NjNdIHwgW1x1MDk4MS1cdTA5ODNdIHwgXHUwOUJDIHwgXHUwOUJFIHwgXHUwOUJGIHwgW1x1MDlDMC1cdTA5QzRdIHwgW1x1MDlDNy1cdTA5QzhdIHwgW1x1MDlDQi1cdTA5Q0RdIHwgXHUwOUQ3IHwgW1x1MDlFMi1cdTA5RTNdIHwgXHUwQTAyIHwgXHUwQTNDIHwgXHUwQTNFIHwgXHUwQTNGIHwgW1x1MEE0MC1cdTBBNDJdIHwgW1x1MEE0Ny1cdTBBNDhdIHwgW1x1MEE0Qi1cdTBBNERdIHwgW1x1MEE3MC1cdTBBNzFdIHwgW1x1MEE4MS1cdTBBODNdIHwgXHUwQUJDIHwgW1x1MEFCRS1cdTBBQzVdIHwgW1x1MEFDNy1cdTBBQzldIHwgW1x1MEFDQi1cdTBBQ0RdIHwgW1x1MEIwMS1cdTBCMDNdIHwgXHUwQjNDIHwgW1x1MEIzRS1cdTBCNDNdIHwgW1x1MEI0Ny1cdTBCNDhdIHwgW1x1MEI0Qi1cdTBCNERdIHwgW1x1MEI1Ni1cdTBCNTddIHwgW1x1MEI4Mi1cdTBCODNdIHwgW1x1MEJCRS1cdTBCQzJdIHwgW1x1MEJDNi1cdTBCQzhdIHwgW1x1MEJDQS1cdTBCQ0RdIHwgXHUwQkQ3IHwgW1x1MEMwMS1cdTBDMDNdIHwgW1x1MEMzRS1cdTBDNDRdIHwgW1x1MEM0Ni1cdTBDNDhdIHwgW1x1MEM0QS1cdTBDNERdIHwgW1x1MEM1NS1cdTBDNTZdIHwgW1x1MEM4Mi1cdTBDODNdIHwgW1x1MENCRS1cdTBDQzRdIHwgW1x1MENDNi1cdTBDQzhdIHwgW1x1MENDQS1cdTBDQ0RdIHwgW1x1MENENS1cdTBDRDZdIHwgW1x1MEQwMi1cdTBEMDNdIHwgW1x1MEQzRS1cdTBENDNdIHwgW1x1MEQ0Ni1cdTBENDhdIHwgW1x1MEQ0QS1cdTBENERdIHwgXHUwRDU3IHwgXHUwRTMxIHwgW1x1MEUzNC1cdTBFM0FdIHwgW1x1MEU0Ny1cdTBFNEVdIHwgXHUwRUIxIHwgW1x1MEVCNC1cdTBFQjldIHwgW1x1MEVCQi1cdTBFQkNdIHwgW1x1MEVDOC1cdTBFQ0RdIHwgW1x1MEYxOC1cdTBGMTldIHwgXHUwRjM1IHwgXHUwRjM3IHwgXHUwRjM5IHwgXHUwRjNFIHwgXHUwRjNGIHwgW1x1MEY3MS1cdTBGODRdIHwgW1x1MEY4Ni1cdTBGOEJdIHwgW1x1MEY5MC1cdTBGOTVdIHwgXHUwRjk3IHwgW1x1MEY5OS1cdTBGQURdIHwgW1x1MEZCMS1cdTBGQjddIHwgXHUwRkI5IHwgW1x1MjBEMC1cdTIwRENdIHwgXHUyMEUxIHwgW1x1MzAyQS1cdTMwMkZdIHwgXHUzMDk5IHwgXHUzMDlBICAKLQotLyogODggKi8KLURpZ2l0ICAgICAgICAgID0gICAgW1x1MDAzMC1cdTAwMzldIHwgW1x1MDY2MC1cdTA2NjldIHwgW1x1MDZGMC1cdTA2RjldIHwgW1x1MDk2Ni1cdTA5NkZdIHwgW1x1MDlFNi1cdTA5RUZdIHwgW1x1MEE2Ni1cdTBBNkZdIHwgW1x1MEFFNi1cdTBBRUZdIHwgW1x1MEI2Ni1cdTBCNkZdIHwgW1x1MEJFNy1cdTBCRUZdIHwgW1x1MEM2Ni1cdTBDNkZdIHwgW1x1MENFNi1cdTBDRUZdIHwgW1x1MEQ2Ni1cdTBENkZdIHwgW1x1MEU1MC1cdTBFNTldIHwgW1x1MEVEMC1cdTBFRDldIHwgW1x1MEYyMC1cdTBGMjldICAKLQotLyogODkgKi8KLUV4dGVuZGVyICAgICAgID0gICAgXHUwMEI3IHwgXHUwMkQwIHwgXHUwMkQxIHwgXHUwMzg3IHwgXHUwNjQwIHwgXHUwRTQ2IHwgXHUwRUM2IHwgXHUzMDA1IHwgW1x1MzAzMS1cdTMwMzVdIHwgW1x1MzA5RC1cdTMwOUVdIHwgW1x1MzBGQy1cdTMwRkVdICAKLSovCi0KLUxldHRlciAgICAgICAgID0gW2EtekEtWl0KLU5hbWVDaGFyICAgICAgID0ge0xldHRlcn0gfCBbMC05XQotLy9OYW1lICAgICAgICAgICA9ICh7TGV0dGVyfSB8IF8gfCA6KSB7TmFtZUNoYXJ9KiAKLS8vTmFtZSAgICAgICAgICAgPSBbXlx4MjBceDA5XHgwRFx4MEFdKwotTmFtZSAgICAgICAgICAgPSBbXlx4MjBceDA5XHgwRFx4MEFcfCxcIVw/XCtcKlwoXCk8Pl0rCi1FbGVtZW50UmVmTmFtZSA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFw/XCtcKlwoXCk8Pl0rCi1FbnRpdHlOYW1lICAgICA9IFteXHgyMFx4MDlceDBEXHgwQVx8LFw/XCpcKFwpPD5dKwotUGFybUVudGl0eU5hbWUgPSBbXlx4MjBceDA5XHgwRFx4MEFcISU7PD5dKwotCi1Db21tZW50U3RhcnQgICA9IFwhLS0KLUNvbW1lbnRDb250ZW50ID0gW14tPl0rCi1Db21tZW50RW5kICAgICA9IC0tPgotRWxlbWVudFN0YXJ0ICAgPSBFTEVNRU5UCi1FbGVtZW50Q29udGVudCA9IFtePD5dKgotCi1FbnRpdHlTdGFydCAgICA9IEVOVElUWQotRW50aXR5X1Bhcm0gICAgPSAle1N9Ci1FbnRpdHlDb250ZW50ICA9IHtTfVtePD5dKgotCi1Ob3RhdGlvblN0YXJ0ICA9IE5PVEFUSU9OCi1Ob3RhdGlvbkNvbnRlbnQgPSB7U31bXjw+XSoKLUF0dExpc3QgICAgICAgID0gQVRUTElTVAotRXh0ZXJuYWxQYXJtRW50aXR5UmVmID0gJXtQYXJtRW50aXR5TmFtZX07Ci1FbmRUYWcgICAgICAgICA9ID4KLVN0YXJ0VGFnICAgICAgID0gPAotU3lzdGVtICAgICAgICAgPSBTWVNURU0KLVB1YmxpYyAgICAgICAgID0gUFVCTElDCi1ORGF0YSAgICAgICAgICA9IE5EQVRBCi0KLS8vIHRoZXNlIGFyZSBhdHRyaWJ1dGUgdHlwZSBrZXl3b3JkcwotLy8gICB3ZSByZXVzZSBOT1RBVElPTiBmcm9tIE5vdGF0aW9uU3RhcnQKLS8vICAgd2UgcmV1c2UgRU5USVRZIGZyb20gRW50aXR5U3RhcnQKLUNEYXRhICAgICAgICAgID0gQ0RBVEEKLUlEICAgICAgICAgICAgID0gSUQKLUlEUmVmICAgICAgICAgID0gSURSRUYKLUlEUmVmcyAgICAgICAgID0gSURSRUZTCi1FbnRpdGllcyAgICAgICA9IEVOVElUSUVTCi1OTVRva2VuICAgICAgICA9IE5NVE9LRU4KLU5NVG9rZW5zICAgICAgID0gTk1UT0tFTlMKLQotLy8gdGhlc2UgYXJlIGF0dHJpYnV0ZSBkZWZhdWx0cyBrZXl3b3JkcwotUmVxdWlyZWQgICAgICAgPSAjUkVRVUlSRUQKLUltcGxpZWQgICAgICAgID0gI0lNUExJRUQKLUZpeGVkICAgICAgICAgID0gI0ZJWEVECi0KLQotRW1wdHkgICAgICAgICAgPSBFTVBUWQotQW55ICAgICAgICAgICAgPSBBTlkKLVBjRGF0YSAgICAgICAgID0gI1BDREFUQQotTGVmdFBhcmVuICAgICAgPSBcKAotUmlnaHRQYXJlbiAgICAgPSBcKQotCi1QZXJjZW50ICAgICAgICA9ICUKLVNlbWljb2xvbiAgICAgID0gOwotUGx1cyAgICAgICAgICAgPSBcKwotQ2hvaWNlICA9IFx8Ci1TZXF1ZW5jZSA9ICwKLUNvbm5lY3RvciAgICAgID0ge0Nob2ljZX18e1NlcXVlbmNlfQotT2NjdXJPcHRpb25hbCAgPSBcPwotT2NjdXJPbmVPck1vcmUgPSBcKwotT2NjdXJaZXJvT3JNb3JlID0gXCoKLU9jY3VyVHlwZSAgICAgID0ge09jY3VyT3B0aW9uYWx9fHtPY2N1ck9uZU9yTW9yZX18e09jY3VyWmVyb09yTW9yZX0KLUV4Y2xhbWF0aW9uICAgPSBcIQotU2luZ2xlUXVvdGVkTGl0ZXJhbCA9ICdbXiddKicKLURvdWJsZVF1b3RlZExpdGVyYWwgPSBcIlteXCJdKlwiCi1Ob25UYWdDb250ZW50ID0gW15ceDIwXHgwOVx4MERceDBBPD5dKgotTm9uRW51bUNvbnRlbnQgPSBbXlx4MjBceDA5XHgwRFx4MEE8PlwoXClcfF0qCi0KLSUlCi0KLTxZWUlOSVRJQUw+IHsKLSAge1N0YXJ0VGFnfSAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcpOyB9Ci0gIHtFbmRUYWd9ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5EX1RBRyk7IH0KLSAge0V4Y2xhbWF0aW9ufSAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FWENMQU1BVElPTik7IH0KLSAge1BlcmNlbnR9ICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgfQotICB7U2VtaWNvbG9ufSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNFTUlDT0xPTik7IH0KLQotICB7RWxlbWVudFN0YXJ0fSAgIHsgeXliZWdpbihFTEVNRU5UX05BTUUpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRUxFTUVOVF9UQUcpOyB9Ci0gIHtDb21tZW50U3RhcnR9ICAgeyB5eWJlZ2luKENPTU1FTlRfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJUKTsgfQotICB7RW50aXR5U3RhcnR9ICAgIHsgeXliZWdpbihFTlRJVFlfTkFNRSk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5FTlRJVFlfVEFHKTsgfQotICB7Tm90YXRpb25TdGFydH0gIHsgeXliZWdpbihOT1RBVElPTl9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRyk7IH0KLSAge0F0dExpc3R9ICAgICAgICB7IHl5YmVnaW4oQVRUTElTVF9OQU1FKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHKTsgfQotCi0gIHtFeHRlcm5hbFBhcm1FbnRpdHlSZWZ9ICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pOyB9Ci0vLyBqdXN0IGEgcGFybWVudGl0eW5hbWUgYnkgaXRzZWxmIGlzIG5vIGdvb2QuICB3ZSB1c2UgdGhpcwotLy8gdG8gY2FwdHVyZSBnYXJiYWdlIGNvbnRlbnQgYXQgdGhlIHRvcCBsZXZlbAotICB7UGFybUVudGl0eU5hbWV9ICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLQotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci19Ci0KLTxFTEVNRU5UX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7UGNEYXRhfXxcKHtTfSp7UGNEYXRhfXtTfSpcKSB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05URU5UX1BDREFUQSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotCi0gIHtMZWZ0UGFyZW59ICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTEVGVF9QQVJFTik7IH0KLSAge0Nvbm5lY3Rvcn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DT05ORUNUT1IpOyB9ICAgIAotICB7T2NjdXJUeXBlfSAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk9DQ1VSX1RZUEUpOyB9Ci0gIHtSaWdodFBhcmVufSAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUklHSFRfUEFSRU4pOyB9Ci0KLSAge1N0YXJ0VGFnfSAgICAgICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotICB7RW5kVGFnfSAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLS8vICoqKioqKioqIDwhQVRUTElTVC4uLj4KLTxBVFRMSVNUX05BTUU+IHsKLSAge1N9ICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7TmFtZX0gICAgICAgICAgIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTkFNRSk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUTElTVF9DT05URU5UPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05hbWV9ICAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQVRUUklCVVRFX05BTUUpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuVU5LTk9XTl9DT05URU5UKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEFUVFJJQlVURV9DT05URU5UPiB7Ci0gIHtMaW5lVGVybWluYXRvcn0geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IH0KLSAge05vbkxpbmVUZXJtaW5hdG9yV2hpdGVzcGFjZX0KLSAgICAgICAgICAgICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5XSElURVNQQUNFKTsgfQotICB7Q0RhdGF9ICAgICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5DREFUQV9LRVlXT1JEKTsgfSAgCi0KLSAge0lEfSAgICAgICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURfS0VZV09SRCk7IH0gICAgICAgCi0gIHtJRFJlZn0gICAgICAgICAgeyB5eWJlZ2luKEFUVFJJQlVURV9ERUZBVUxUKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQpOyB9ICAKLSAge0lEUmVmc30gICAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQpOyB9ICAKLSAge0VudGl0eVN0YXJ0fSAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQpOyB9ICAKLSAge0VudGl0aWVzfSAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCk7IH0gIAotICB7Tk1Ub2tlbn0gICAgICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQpOyB9ICAKLSAge05NVG9rZW5zfSAgICAgICB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCk7IH0gIAotICB7Tm90YXRpb25TdGFydH0gIHsgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCk7IH0gIAotCi0gIHtSZXF1aXJlZH0gfCB7SW1wbGllZH0gfCB7Rml4ZWR9IHwge1NpbmdsZVF1b3RlZExpdGVyYWx9IHwgeyBEb3VibGVRdW90ZWRMaXRlcmFsfQotICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IH0KLQotICB7TGVmdFBhcmVufSAgICAgIHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihBVFRSSUJVVEVfRU5VTUVSQVRJT04pOyB9ICAKLSAge05vbkVudW1Db250ZW50fSB7IHl5YmVnaW4oQVRUUklCVVRFX0RFRkFVTFQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuUEFSTV9FTlRJVFlfVFlQRSk7IH0KLSAge05vbkVudW1Db250ZW50fXx7UmlnaHRQYXJlbn18e0Nob2ljZX0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxBVFRSSUJVVEVfREVGQVVMVD4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtSZXF1aXJlZH0gICAgICAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SRVFVSVJFRF9LRVlXT1JEKTsgfQotICB7SW1wbGllZH0gICAgICAgIHsgeXliZWdpbihBVFRMSVNUX0NPTlRFTlQpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JEKTsgfQotICB7Rml4ZWR9ICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQpOyB9Ci0gIHtTaW5nbGVRdW90ZWRMaXRlcmFsfSAgeyB5eWJlZ2luKEFUVExJU1RfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCk7IH0KLSAge0RvdWJsZVF1b3RlZExpdGVyYWx9ICB7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7Tm9uVGFnQ29udGVudH0gICB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oQVRUTElTVF9DT05URU5UKTsgfSAvL3JldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi08QVRUUklCVVRFX0VOVU1FUkFUSU9OPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge0xlZnRQYXJlbn0gICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5MRUZUX1BBUkVOKTsgfQotICB7Q2hvaWNlfSAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkVOVU1fQ0hPSUNFKTsgfQotICB7UmlnaHRQYXJlbn0gICAgIHsgeXliZWdpbihBVFRSSUJVVEVfREVGQVVMVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5SSUdIVF9QQVJFTik7IH0KLSAge05vbkVudW1Db250ZW50fSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5BTUUpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi0KLS8vICoqKioqKioqIDwhRU5USVRZLi4uPgotPEVOVElUWV9OQU1FPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1BlcmNlbnR9ICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QRVJDRU5UKTsgfQotICB7RW50aXR5TmFtZX0gICAgIHsgeXliZWdpbihFTlRJVFlfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEVOVElUWV9DT05URU5UPiB7Ci0vLyAge0VudGl0eUNvbnRlbnR9IHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuRU5USVRZX0NPTlRFTlQpOyB9Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge1N5c3RlbX0gfCB7UHVibGljfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oRVhURVJOQUxJRF9DT05URU5UKTsgfQotICB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7RG91YmxlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7Tm9uVGFnQ29udGVudH0gICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5VTktOT1dOX0NPTlRFTlQpOyB9Ci0gIHtTdGFydFRhZ30gfCB7RW5kVGFnfSB7IHl5cHVzaGJhY2soeXlsZW5ndGgoKSk7IHl5YmVnaW4oWVlJTklUSUFMKTsgfQotfQotCi0KLS8vICoqKioqKioqIDwhTk9UQVRJT04uLi4+Ci08Tk9UQVRJT05fTkFNRT4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtOYW1lfSAgICAgICAgICAgeyB5eWJlZ2luKEVYVEVSTkFMSURfQ09OVEVOVCk7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5OQU1FKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLQotPEVYVEVSTkFMSURfQ09OVEVOVD4gewotICB7U30gICAgICAgICAgICAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLldISVRFU1BBQ0UpOyB9Ci0gIHtTeXN0ZW19ICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuU1lTVEVNX0tFWVdPUkQpOyB9ICAKLSAge1B1YmxpY30gICAgICAgICB7IHJldHVybiBjcmVhdGVUb2tlbihEVERSZWdpb25UeXBlcy5QVUJMSUNfS0VZV09SRCk7IH0gIAotICB7U2luZ2xlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7RG91YmxlUXVvdGVkTGl0ZXJhbH0gIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKTsgfQotICB7TkRhdGF9ICAgICAgICAgIHsgeXliZWdpbihOREFUQV9DT05URU5UKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQpOyB9Ci0gIHtOb25UYWdDb250ZW50fSAgIHsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLlVOS05PV05fQ09OVEVOVCk7IH0KLSAge1N0YXJ0VGFnfSB8IHtFbmRUYWd9IHsgeXlwdXNoYmFjayh5eWxlbmd0aCgpKTsgeXliZWdpbihZWUlOSVRJQUwpOyB9Ci19Ci0KLTxOREFUQV9DT05URU5UPiB7Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge05vblRhZ0NvbnRlbnR9ICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIGNyZWF0ZVRva2VuKERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKTsgfQotICB7U3RhcnRUYWd9IHwge0VuZFRhZ30geyB5eXB1c2hiYWNrKHl5bGVuZ3RoKCkpOyB5eWJlZ2luKFlZSU5JVElBTCk7IH0KLX0KLSAgCi0KLS8vICoqKioqKioqIDwhLS0gLi4uPgotPENPTU1FTlRfQ09OVEVOVD4gewotICB7Q29tbWVudEVuZH0gIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9FTkQpOyB9Ci0gIHtTfSAgICAgICAgICAgICAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuV0hJVEVTUEFDRSk7IH0KLSAge0NvbW1lbnRDb250ZW50fSB8ICItIiB8ICI+IiAgeyByZXR1cm4gY3JlYXRlVG9rZW4oRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9DT05URU5UKTsgfQotfQotCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdG9rZW5pemVyL2R0ZHNrZWxldG9uIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkc2tlbGV0b24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYmUwODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC90b2tlbml6ZXIvZHRkc2tlbGV0b24KKysrIC9kZXYvbnVsbApAQCAtMSwzMTcgKzAsMCBAQAotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBpbml0aWFsIHNpemUgb2YgdGhlIGxvb2thaGVhZCBidWZmZXIgKi8KLS0tLSBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfQlVGRkVSU0laRSA9IC4uLjsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLS0tLSAgbGV4aWNhbCBzdGF0ZXMsIGNoYXJtYXAKLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHN0YXRpYyBpbnQgWVlfSUxMRUdBTF9TVEFURSA9IDE7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9QVVNIQkFDS18yQklHID0gMzsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCi0gICAgIkVycm9yOiBjb3VsZCBub3QgbWF0Y2ggaW5wdXQiLAotICAgICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSIKLSAgfTsKLQotLS0tIGlzRmluYWwgbGlzdAotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbWVlfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0tLS0gdXNlciBjbGFzcyBjb2RlCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLS0tLSBjb25zdHJ1Y3RvciBkZWNsYXJhdGlvbgotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9yZWZpbGwoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOyAgCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLQotICAgIGlmICh5eV9yZWFkZXIgIT0gbnVsbCkKLSAgICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBjdXJyZW50IHN0cmVhbSwgYW5kIHJlc2V0cyB0aGUKLSAgICogc2Nhbm5lciB0byByZWFkIGZyb20gYSBuZXcgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PllZX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICB5eWNsb3NlKCk7Ci0gICAgeXlfcmVhZGVyID0gcmVhZGVyOwotICAgIHl5X2F0RU9GICA9IGZhbHNlOwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQgPSAwOwotICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgPSB5eV9wdXNoYmFja1BvcyA9IDA7Ci0gICAgeXlsaW5lID0geXljaGFyID0geXljb2x1bW4gPSAwOwotICAgIHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBFbnRlcnMgYSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKgotICAgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHl5X2xleGljYWxfc3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLSAgZmluYWwgcHVibGljIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotICAgIHJldHVybiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkOwotICB9Ci0KLQotICAvKioKLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcuCi0gICAqCi0gICAqIEluIGEgd2VsbGZvcm1lZCBzY2FubmVyIChubyBvciBvbmx5IGNvcnJlY3QgdXNhZ2Ugb2YgCi0gICAqIHl5cHVzaGJhY2soaW50KSBhbmQgYSBtYXRjaC1hbGwgZmFsbGJhY2sgcnVsZSkgdGhpcyBtZXRob2QgCi0gICAqIHdpbGwgb25seSBiZSBjYWxsZWQgd2l0aCB0aGluZ3MgdGhhdCAiQ2FuJ3QgUG9zc2libHkgSGFwcGVuIi4KLSAgICogSWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkLCBzb21ldGhpbmcgaXMgc2VyaW91c2x5IHdyb25nCi0gICAqIChlLmcuIGEgSkZsZXggYnVnIHByb2R1Y2luZyBhIGZhdWx0eSBzY2FubmVyIGV0Yy4pLgotICAgKgotICAgKiBVc3VhbCBzeW50YXgvc2Nhbm5lciBsZXZlbCBlcnJvciBoYW5kbGluZyBzaG91bGQgYmUgZG9uZQotICAgKiBpbiBlcnJvciBmYWxsYmFjayBydWxlcy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0tLS0geXlfU2NhbkVycm9yIGRlY2xhcmF0aW9uICAKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFlZX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0tLS0gdGhyb3dzIGNsYXVzZQotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0tLS0geXlwdXNoYmFjayBkZWNsIChjb250YWlucyB5eV9TY2FuRXJyb3IgZXhjZXB0aW9uKQotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotLS0tIHl5X2RvRW9mCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0tLS0geXlsZXggZGVjbGFyYXRpb24KLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHl5X2N1cnJlbnRQb3NfbDsKLSAgICBpbnQgeXlfbWFya2VkUG9zX2w7Ci0gICAgaW50IHl5X2VuZFJlYWRfbCA9IHl5X2VuZFJlYWQ7Ci0gICAgY2hhciBbXSB5eV9idWZmZXJfbCA9IHl5X2J1ZmZlcjsKLSAgICBjaGFyIFtdIHl5Y21hcF9sID0geXljbWFwOwotCi0tLS0gbG9jYWwgZGVjbGFyYXRpb25zCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeXlfbWFya2VkUG9zX2wgPSB5eV9tYXJrZWRQb3M7Ci0KLS0tLSBzdGFydCBhZG1pbiAobGluZSwgY2hhciwgY29sIGNvdW50KQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3NfbCA9IHl5X2N1cnJlbnRQb3MgPSAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zX2w7Ci0gIAotLS0tIHN0YXJ0IGFkbWluIChsZXhzdGF0ZSBldGMpCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotLS0tIG5leHQgaW5wdXQsIGxpbmUsIGNvbCwgY2hhciBjb3VudCwgbmV4dCB0cmFuc2l0aW9uLCBpc0ZpbmFsIGFjdGlvbgotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zX2wgPSB5eV9jdXJyZW50UG9zX2w7IAotLS0tIGxpbmUgY291bnQgdXBkYXRlCi0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHl5X21hcmtlZFBvcyA9IHl5X21hcmtlZFBvc19sOwotLS0tIGNoYXIgY291bnQgdXBkYXRlCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7Ci0KLS0tLSBhY3Rpb25zCi0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotLS0tIGVvZnZhbHVlCi0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLS0tLSBubyBtYXRjaAotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotLS0tIG1haW4KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREJhdGNoTm9kZURlbGV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTZlOThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERCYXRjaE5vZGVEZWxldGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci0KLQotcHVibGljIGNsYXNzIERUREJhdGNoTm9kZURlbGV0ZSB7Ci0JcHJvdGVjdGVkIERUREZpbGUgZHRkRmlsZTsKLQotCXByb3RlY3RlZCBMaXN0IG5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIERUREJhdGNoTm9kZURlbGV0ZShEVERGaWxlIGR0ZEZpbGUpIHsKLQkJdGhpcy5kdGRGaWxlID0gZHRkRmlsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGROb2RlKERURE5vZGUgbm9kZSkgewotCQkvLyBmaXJzdCBjaGVjayBpZiB0aGUgbm9kZSBpcyBjb250YWluZWQgYnkgYW55b25lCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCi0JCQlpZiAoY3VycmVudE5vZGUuY29udGFpbnNSYW5nZShub2RlLmdldFN0YXJ0T2Zmc2V0KCksIG5vZGUuZ2V0RW5kT2Zmc2V0KCkpKSB7Ci0JCQkJLy8gdGhlbiBubyBuZWVkIHRvIGFkZCB0aGUgbm9kZSB0byB0aGUgbGlzdCB0byBiZSBkZWxldGVkCi0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAobm9kZS5nZXRTdGFydE9mZnNldCgpIDwgY3VycmVudE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSAmJiBub2RlLmdldEVuZE9mZnNldCgpIDw9IGN1cnJlbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCQlub2Rlcy5hZGQoaSwgbm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCS8vIGlmIHdlIGdldCBoZXJlLCB0aGVuIGFkZCBpdCB0byB0aGUgZW5kCi0JCW5vZGVzLmFkZChub2RlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZWxldGVOb2RlcyhPYmplY3QgcmVxdWVzdG9yKSB7Ci0JCWZvciAoaW50IGkgPSBub2Rlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIG5vZGVzLmdldChpKTsKLQkJCWR0ZEZpbGUuZGVsZXRlTm9kZShyZXF1ZXN0b3IsIG5vZGUpOwotCQl9Ci0JCW5vZGVzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREV4dGVybmFsUmVmZXJlbmNlUmVtb3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RUREV4dGVybmFsUmVmZXJlbmNlUmVtb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzFhYmEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci0KLQotLyoKLSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSBtb2RlbCB3aGVuIGl0ZW1zIGFyZSBkZWxldGVkIG9yCi0gKiBzbyB0aGF0IGl0ZW1zIHJlZmVyZW5jZWQgYnkgaXQgYXJlIGNsZWFuZWQgdXAgbm90ZSB0aGF0IHRvcCBsZXZlbCBub2RlcyBhcmUKLSAqIHF1ZXVlZCB1cCBmb3IgZGVsZXRpb24gc28gdGhhdCBpdGVyYXRpb24gb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBmcm9tIHRoZQotICogZHRkZmlsZSBpcyBub3QgbWVzc2VkIHVwLiBOb3RlIHRoYXQgd2hlbiBhbiBleHRlcm5hbCBwYXJtZXRlciBlbnRpdHkKLSAqIGNoYW5nZXMsIHRoZSBjbGllbnQgb2YgdGhlIG1vZGVsIChlLmcuIGVkaXRvcikgbXVzdCBiZSBhIERUREZpbGVMaXN0ZW5lcgotICogaW1wbGVtZW50aW5nIHRoZSBsaXN0ZW5lcidzIGludGVyZmFjZSB0byBrZWVwIHRoZSBtb2RlbCdzIHJlZmVyZW50aWFsCi0gKiBpbnRlZ3JpdHkgKFNlZSBEVERNb2RlbEltcGwgZm9yIGV4YW1wbGUpLgotICovCi0KLXB1YmxpYyBjbGFzcyBEVERFeHRlcm5hbFJlZmVyZW5jZVJlbW92ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQotCXByb3RlY3RlZCBEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGU7Ci0JcHJvdGVjdGVkIExpc3QgZXh0ZXJuYWxFbGVtZW50c0FuZFBhcm1FbnRpdGllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFybUVudGl0eSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCXByb3RlY3RlZCBEVEROb2RlIG5vZGVUb0RlbGV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG9sZFJlZk5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBPYmplY3QgcmVxdWVzdG9yOwotCi0JcHVibGljIERUREV4dGVybmFsUmVmZXJlbmNlUmVtb3ZlcigpIHsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBleHRlcm5hbFJlZmVyZW5jZUFib3V0VG9DaGFuZ2UoT2JqZWN0IHJlcXVlc3RvciwgRW50aXR5IGVudGl0eSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkgfHwgIWVudGl0eS5pc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCS8vIGlmIGl0IGlzIG5vdCBhbiBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCi0JCURUREZpbGUgZHRkRmlsZSA9IGVudGl0eS5nZXREVERGaWxlKCk7Ci0JCWlmIChiYXRjaERlbGV0ZSA9PSBudWxsKSB7Ci0JCQliYXRjaERlbGV0ZSA9IG5ldyBEVERCYXRjaE5vZGVEZWxldGUoZHRkRmlsZSk7Ci0JCX0KLQotCQkvLyBTZWUgdGhlIGNvbW1lbnQgYXQgdGhlIGhlYWQgb2YgdGhpcyBmaWxlIHJlZ2FyZGluZwotCQkvLyBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMuCi0JCS8vIGV4dGVybmFsRWxlbWVudHNBbmRQYXJtRW50aXRpZXMgPQotCQkvLyBkdGRGaWxlLmdldERURE1vZGVsKCkuZ2V0RXh0ZXJuYWxNb2RlbHMoKS5nZXRFbGVtZW50Q29udGVudE5hbWVzKGVudGl0eS5nZXRQdWJsaWNJRCgpLAotCQkvLyBkdGRGaWxlLmdldERURE1vZGVsKCkucmVzb2x2ZUlEKGVudGl0eS5nZXRQdWJsaWNJRCgpLAotCQkvLyBlbnRpdHkuZ2V0U3lzdGVtSUQoKSkpOwotCi0JCXZpc2l0KGR0ZEZpbGUpOwotCi0JCWJhdGNoRGVsZXRlLmRlbGV0ZU5vZGVzKHJlcXVlc3Rvcik7Ci0KLQkJaXNVcGRhdGluZyA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTWF0Y2hpbmdOYW1lKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBleHRlcm5hbEVsZW1lbnRzQW5kUGFybUVudGl0aWVzLmNvbnRhaW5zKG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJU3RyaW5nIGF0dHJUeXBlID0gYXR0ci5nZXRUeXBlKCk7Ci0KLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dHJOYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dHJOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGF0dHJUeXBlKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGF0dHJUeXBlKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIEF0dHJpYnV0ZS5DREFUQSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlTGlzdChhdHRMaXN0KTsKLQkJU3RyaW5nIGF0dExpc3ROYW1lID0gYXR0TGlzdC5nZXROYW1lKCk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihhdHRMaXN0TmFtZSkpIHsKLQkJCWlmIChpc01hdGNoaW5nTmFtZShhdHRMaXN0TmFtZSkpIHsKLQkJCQlhdHRMaXN0LnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgZWxlbWVudE5hbWUgPSBlbGVtZW50LmdldE5hbWUoKTsKLQkJaWYgKGlzUGFyYW1ldGVyRW50aXR5UmVmKGVsZW1lbnROYW1lKSkgewotCQkJaWYgKGlzTWF0Y2hpbmdOYW1lKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQuc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0JCVN0cmluZyByZWZOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCWlmIChpc01hdGNoaW5nTmFtZShyZWZOYW1lKSkgewotCQkJYmF0Y2hEZWxldGUuYWRkTm9kZShub2RlKTsKLQkJfQotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETW9kZWxVcGRhdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFRETW9kZWxVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmY0NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCi0KLS8vIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIHRoZSBtb2RlbCB3aGVuIGl0ZW1zCi0vLyBhcmUgZGVsZXRlZCBvciBhIGV4dGVybmFsIHBhcm0gZW50aXR5IGNoYW5nZXMgc28gdGhhdAotLy8gaXRlbXMgcmVmZXJlbmNlZCBieSBpdCBhcmUgY2xlYW5lZCB1cAotLy8gbm90ZSB0aGF0IHRvcCBsZXZlbCBub2RlcyBhcmUgcXVldWVkIHVwIGZvciBkZWxldGlvbiBzbyB0aGF0Ci0vLyBpdGVyYXRpb24gb3ZlciB0aGUgbGlzdCBvZiBub2RlcyBmcm9tIHRoZSBkdGRmaWxlIGlzIG5vdCBtZXNzZWQgdXAKLXB1YmxpYyBjbGFzcyBEVERNb2RlbFVwZGF0ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzUGFybUVudGl0eSA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNVcGRhdGluZyA9IGZhbHNlOwotCi0JcHJvdGVjdGVkIExpc3Qgbm9kZXNUb0RlbGV0ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgRFRETm9kZSBub2RlVG9EZWxldGU7Ci0JcHJvdGVjdGVkIFN0cmluZyBvbGRSZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgT2JqZWN0IHJlcXVlc3RvcjsKLQotCXB1YmxpYyBEVERNb2RlbFVwZGF0ZXIoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb2JqZWN0QWJvdXRUb0JlRGVsZXRlZChPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIG5vZGUpIHsKLQkJaWYgKGlzVXBkYXRpbmcpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgRW50aXR5IHx8IG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaXQgaXMgbm90IG9uZSBvZiB0aGVzZQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5ICYmICEoKEVudGl0eSkgbm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSkgewotCQkJLy8gaWYgaXQgaXMgbm90IGEgcGFyYW1ldGVyIGVudGl0eSwgaWdub3JlIGFzIHdlbGwKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQl0aGlzLm5vZGVUb0RlbGV0ZSA9IG5vZGU7Ci0JCW9sZFJlZk5hbWUgPSBub2RlLmdldE5hbWUoKTsKLQkJaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0JCW5vZGVzVG9EZWxldGUuY2xlYXIoKTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJaXNQYXJtRW50aXR5ID0gdHJ1ZTsKLQkJCW9sZFJlZk5hbWUgPSAiJSIgKyBvbGRSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCURUREZpbGUgZHRkRmlsZSA9IG5vZGUuZ2V0RFRERmlsZSgpOwotCQl2aXNpdChkdGRGaWxlKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzVG9EZWxldGUuc2l6ZSgpOyBpKyspIHsKLQkJCWR0ZEZpbGUuZGVsZXRlTm9kZShyZXF1ZXN0b3IsIChEVEROb2RlKSBub2Rlc1RvRGVsZXRlLmdldChpKSk7Ci0JCX0KLQotCQlpc1VwZGF0aW5nID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCWlmIChhdHRyLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCQlhdHRyLnNldE5hbWUocmVxdWVzdG9yLCAiVGVtcE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIEF0dHJpYnV0ZS5DREFUQSk7Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2sgdGhlIGF0dHIgbmFtZSBhbmQgdGhlIGF0dHIgdHlwZSB0byBzZWUgaWYgaXQKLQkJLy8gbmVlZHMgdXBkYXRpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZUxpc3QoQXR0cmlidXRlTGlzdCBhdHRMaXN0KSB7Ci0JCXN1cGVyLnZpc2l0QXR0cmlidXRlTGlzdChhdHRMaXN0KTsKLQkJaWYgKGF0dExpc3QuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJaWYgKGlzUGFybUVudGl0eSkgewotCQkJCWF0dExpc3Quc2V0TmFtZShyZXF1ZXN0b3IsICJUZW1wTmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBzYXZlIHVwIGZvciBsYXRlciBkZWxldGlvbgotCQkJCW5vZGVzVG9EZWxldGUuYWRkKGF0dExpc3QpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXROYW1lKHJlcXVlc3RvciwgIlRlbXBOYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzdXBlci52aXNpdEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UgcGFybUVudGl0eVJlZikgewotCQlzdXBlci52aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKHBhcm1FbnRpdHlSZWYpOwotCQlpZiAoaXNQYXJtRW50aXR5ICYmIHBhcm1FbnRpdHlSZWYuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJbm9kZXNUb0RlbGV0ZS5hZGQocGFybUVudGl0eVJlZik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdFJlZmVyZW5jZShDTUJhc2ljTm9kZSBub2RlKSB7Ci0JCXN1cGVyLnZpc2l0UmVmZXJlbmNlKG5vZGUpOwotCi0JCWlmIChub2RlLmdldE5hbWUoKS5lcXVhbHMob2xkUmVmTmFtZSkpIHsKLQkJCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJcGFyZW50LmRlbGV0ZShyZXF1ZXN0b3IsIG5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURE5vdGF0aW9uUmVmZXJlbmNlUmVtb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWNiZjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVFbnVtTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFRETm90YXRpb25SZWZlcmVuY2VSZW1vdmVyIHsKLQlwcm90ZWN0ZWQgTm90YXRpb24gbm90YXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyBub3RhdGlvbk5hbWU7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IHJlcXVlc3RvcjsKLQotCXB1YmxpYyBEVEROb3RhdGlvblJlZmVyZW5jZVJlbW92ZXIoKSB7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RhdGlvbkFib3V0VG9CZURlbGV0ZWQoT2JqZWN0IHJlcXVlc3RvciwgTm90YXRpb24gbm90YXRpb24pIHsKLQkJdGhpcy5yZXF1ZXN0b3IgPSByZXF1ZXN0b3I7Ci0JCXRoaXMubm90YXRpb24gPSBub3RhdGlvbjsKLQkJbm90YXRpb25OYW1lID0gbm90YXRpb24uZ2V0TmFtZSgpOwotCi0JCXZpc2l0KG5vdGF0aW9uLmdldERUREZpbGUoKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXQoRFRERmlsZSBmaWxlKSB7Ci0JCUxpc3Qgbm9kZXMgPSBmaWxlLmdldE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZXMuc2l6ZSgpOyBpKyspIHsKLQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgbm9kZXMuZ2V0KGkpOwotCQkJaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJdmlzaXRFbnRpdHkoKEVudGl0eSkgY3VycmVudE5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJdmlzaXRBdHRyaWJ1dGVMaXN0KChBdHRyaWJ1dGVMaXN0KSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgewotCQlpZiAoYXR0ci5nZXRUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05PVEFUSU9OKSkgewotCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBhdHRyLmdldEVudW1MaXN0KCk7Ci0JCQlMaXN0IG5vdGF0aW9uTmFtZXMgPSBlbnVtTGlzdC5nZXRJdGVtcygpOwotCQkJSXRlcmF0b3IgaXRlciA9IG5vdGF0aW9uTmFtZXMuaXRlcmF0b3IoKTsKLQkJCWJvb2xlYW4gdXBkYXRlUmVxdWlyZWQgPSBmYWxzZTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCVN0cmluZyBub3RhdGlvbiA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChub3RhdGlvbi5lcXVhbHMobm90YXRpb25OYW1lKSkgewotCQkJCQl1cGRhdGVSZXF1aXJlZCA9IHRydWU7Ci0JCQkJCWl0ZXIucmVtb3ZlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVwZGF0ZVJlcXVpcmVkKSB7Ci0JCQkJU3RyaW5nW10gbmV3SXRlbXMgPSBuZXcgU3RyaW5nW25vdGF0aW9uTmFtZXMuc2l6ZSgpXTsKLQkJCQlub3RhdGlvbk5hbWVzLnRvQXJyYXkobmV3SXRlbXMpOwotCQkJCWVudW1MaXN0LnNldEl0ZW1zKHJlcXVlc3RvciwgbmV3SXRlbXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVMaXN0KEF0dHJpYnV0ZUxpc3QgYXR0TGlzdCkgewotCQlBdHRyaWJ1dGUgYXR0ciA9IChBdHRyaWJ1dGUpIGF0dExpc3QuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoYXR0ciAhPSBudWxsKSB7Ci0JCQl2aXNpdEF0dHJpYnV0ZShhdHRyKTsKLQkJCWF0dHIgPSAoQXR0cmlidXRlKSBhdHRyLmdldE5leHRTaWJsaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEVudGl0eShFbnRpdHkgZW50aXR5KSB7Ci0JCWlmIChlbnRpdHkuZ2V0Tm90YXRpb25OYW1lKCkuZXF1YWxzKG5vdGF0aW9uTmFtZSkpIHsKLQkJCWVudGl0eS5zZXROb3RhdGlvbk5hbWUocmVxdWVzdG9yLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotfS8vIERURE5vdGF0aW9uUmVtb3ZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFJlZmVyZW5jZVVwZGF0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERSZWZlcmVuY2VVcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2OTMxZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFJlZmVyZW5jZVVwZGF0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUVudW1MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlOwotCi0KLS8vIHRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHVwZGF0aW5nIGFueSBkdGQgbm9kZSBpbgotLy8gcmVzcG9uc2UgdG8gYSBjaGFuZ2UgaW4gdGhlIG5vZGUgdGhhdCB0aGV5IHJlZmVyZW5jZQotcHVibGljIGNsYXNzIERURFJlZmVyZW5jZVVwZGF0ZXIgZXh0ZW5kcyBEVERWaXNpdG9yIHsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGF0aW9uID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Bhcm1FbnRpdHkgPSBmYWxzZTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzVXBkYXRpbmcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG5ld05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgb2xkUmVmTmFtZSA9ICIiLCBuZXdSZWZOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXByb3RlY3RlZCBEVEROb2RlIHJlZmVyZW5jZWROb2RlID0gbnVsbDsKLQotCS8vIHRoZSByZWZlcmVuY2VzIExpc3QgaXMgYSBjYWNoZSBvZiB0aGUgRFRETm9kZXMgdGhhdCBhcmUgY2hhbmdlZAotCS8vIGFzIGEgcmVzdWx0IG9mIGEgY2FsbCB0byBuYW1lQWJvdXRUb0NoYW5nZSgpLiBUaGUgaWRlYSBpcyB0aGF0Ci0JLy8gaWYgYSBzdWJzZXF1ZW50IGNhbGwgY29tZXMgaW4gdGhhdCBjaGFuZ2VzIHRoZSBuYW1lIG9mIHRoZSBzYW1lCi0JLy8gb2JqZWN0IGZvciB3aGljaCB0aGlzIGNhY2hlIGV4aXN0cyBmb3IsIHRoZW4gd2Ugb3B0aW1pemUgdGhlCi0JLy8gcGF0aCBieSBqdXN0IHdhbGtpbmcgdGhlIGNhY2hlCi0JcHJpdmF0ZSBMaXN0IHJlZmVyZW5jZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIE9iamVjdCByZXF1ZXN0b3I7Ci0KLQlwdWJsaWMgRFREUmVmZXJlbmNlVXBkYXRlcigpIHsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyQ2FjaGUoKSB7Ci0JCXJlZmVyZW5jZWROb2RlID0gbnVsbDsKLQkJcmVmZXJlbmNlcy5jbGVhcigpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBuYW1lQWJvdXRUb0NoYW5nZShPYmplY3QgcmVxdWVzdG9yLCBEVEROb2RlIHJlZmVyZW5jZWROb2RlLCBTdHJpbmcgbmV3TmFtZSkgewotCQlpZiAoaXNVcGRhdGluZykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICghKHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRW50aXR5IHx8IHJlZmVyZW5jZWROb2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uKSkgewotCQkJLy8ganVzdCBpZ25vcmUgaWYgaXQgaXMgbm90IG9uZSBvZiB0aGVzZQotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAhKChFbnRpdHkpIHJlZmVyZW5jZWROb2RlKS5pc1BhcmFtZXRlckVudGl0eSgpKSB7Ci0JCQkvLyBpZiBpdCBpcyBub3QgYSBwYXJhbWV0ZXIgZW50aXR5LCBpZ25vcmUgYXMgd2VsbAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaXNVcGRhdGluZyA9IHRydWU7Ci0JCXRoaXMucmVxdWVzdG9yID0gcmVxdWVzdG9yOwotCQlvbGRSZWZOYW1lID0gcmVmZXJlbmNlZE5vZGUuZ2V0TmFtZSgpOwotCQl0aGlzLm5ld05hbWUgPSBuZXdSZWZOYW1lID0gbmV3TmFtZTsKLQkJaXNQYXJtRW50aXR5ID0gZmFsc2U7Ci0JCWlzTm90YXRpb24gPSByZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIE5vdGF0aW9uOwotCi0JCWlmIChyZWZlcmVuY2VkTm9kZSBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJaXNQYXJtRW50aXR5ID0gdHJ1ZTsKLQkJCW9sZFJlZk5hbWUgPSAiJSIgKyBvbGRSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCW5ld1JlZk5hbWUgPSAiJSIgKyBuZXdSZWZOYW1lICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmICh0aGlzLnJlZmVyZW5jZWROb2RlICE9IG51bGwpIHsKLQkJCS8vIGNoZWNrIGlmIHRoZSBwcmV2aW91cyByZWZlcmVuY2VkIG5vZGUgdGhhdCB3YXMgY2hhbmdlZAotCQkJLy8gaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSB0aGF0IGlzIGNvbWluZyBpbi4gaWYgc28sIGp1c3QKLQkJCS8vIGNoYW5nZSB0aGUgcHJldmlvdXMgcmVnaW9ucwotCQkJaWYgKHRoaXMucmVmZXJlbmNlZE5vZGUgPT0gcmVmZXJlbmNlZE5vZGUpIHsKLQkJCQlxdWlja1VwZGF0ZSgpOwotCQkJCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjbGVhciB0aGUgY2FjaGUgaWYgd2UgZ2V0IGhlcmUKLQkJdGhpcy5yZWZlcmVuY2VkTm9kZSA9IHJlZmVyZW5jZWROb2RlOwotCQlyZWZlcmVuY2VzLmNsZWFyKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZWROb2RlLmdldERUREZpbGUoKTsKLQkJdmlzaXQoZHRkRmlsZSk7Ci0JCWlzVXBkYXRpbmcgPSBmYWxzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBxdWlja1VwZGF0ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWZlcmVuY2VzLnNpemUoKTsgaSsrKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgcmVmZXJlbmNlcy5nZXQoaSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQl2aXNpdEVsZW1lbnQoKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZUxpc3QoKEF0dHJpYnV0ZUxpc3QpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCXZpc2l0QXR0cmlidXRlKChBdHRyaWJ1dGUpIG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQkJdmlzaXRSZWZlcmVuY2UoKENNQmFzaWNOb2RlKSBub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIHsKLQkJCQl2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKChQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKLQkJc3VwZXIudmlzaXRBdHRyaWJ1dGUoYXR0cik7Ci0JCWlmIChpc1Bhcm1FbnRpdHkpIHsKLQkJCS8vIGNoZWNrIHRoZSBhdHRyIG5hbWUgYW5kIHRoZSBhdHRyIHR5cGUgdG8gc2VlIGlmIGl0Ci0JCQkvLyBuZWVkcyB1cGRhdGluZwotCQkJaWYgKGF0dHIuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0TmFtZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGF0dHIpOwotCQkJfQotCQkJaWYgKGF0dHIuZ2V0VHlwZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCWF0dHIuc2V0VHlwZShyZXF1ZXN0b3IsIG5ld1JlZk5hbWUpOwotCQkJCXJlZmVyZW5jZXMuYWRkKGF0dHIpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGlzTm90YXRpb24gJiYgYXR0ci5nZXRUeXBlKCkuZXF1YWxzKEF0dHJpYnV0ZS5FTlVNRVJBVEVEX05PVEFUSU9OKSkgewotCQkJQXR0cmlidXRlRW51bUxpc3QgZW51bUxpc3QgPSBhdHRyLmdldEVudW1MaXN0KCk7Ci0JCQlMaXN0IGl0ZW1zID0gZW51bUxpc3QuZ2V0SXRlbXMoKTsKLQkJCWJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5vdGF0aW9uTmFtZSA9IChTdHJpbmcpIGl0ZW1zLmdldChpKTsKLQkJCQlpZiAobm90YXRpb25OYW1lLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJCQl1cGRhdGVOZWVkZWQgPSB0cnVlOwotCQkJCQlpdGVtcy5zZXQoaSwgbmV3TmFtZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHVwZGF0ZU5lZWRlZCkgewotCQkJCVN0cmluZ1tdIG5ld0l0ZW1zID0gbmV3IFN0cmluZ1tpdGVtcy5zaXplKCldOwotCi0JCQkJZW51bUxpc3Quc2V0SXRlbXMoKFN0cmluZ1tdKSBpdGVtcy50b0FycmF5KG5ld0l0ZW1zKSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJaWYgKCFpc05vdGF0aW9uICYmIGF0dExpc3QuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJYXR0TGlzdC5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChhdHRMaXN0KTsKLQkJfQotCQlzdXBlci52aXNpdEF0dHJpYnV0ZUxpc3QoYXR0TGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoaXNQYXJtRW50aXR5KSB7Ci0JCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXROYW1lKHJlcXVlc3RvciwgbmV3UmVmTmFtZSk7Ci0JCQkJcmVmZXJlbmNlcy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2UoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlIHBhcm1FbnRpdHlSZWYpIHsKLQkJc3VwZXIudmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShwYXJtRW50aXR5UmVmKTsKLQkJaWYgKHBhcm1FbnRpdHlSZWYuZ2V0TmFtZSgpLmVxdWFscyhvbGRSZWZOYW1lKSkgewotCQkJcGFybUVudGl0eVJlZi5zZXRSZWZlcmVuY2VkRW50aXR5KHJlcXVlc3RvciwgbmV3TmFtZSk7Ci0JCQlyZWZlcmVuY2VzLmFkZChwYXJtRW50aXR5UmVmKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQkJc3VwZXIudmlzaXRSZWZlcmVuY2Uobm9kZSk7Ci0JCWlmIChpc1BhcmFtZXRlckVudGl0eVJlZihvbGRSZWZOYW1lKSAmJiAhaXNQYXJtRW50aXR5KSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROYW1lKCkuZXF1YWxzKG9sZFJlZk5hbWUpKSB7Ci0JCQlub2RlLnNldE5hbWUocmVxdWVzdG9yLCBuZXdSZWZOYW1lKTsKLQkJCXJlZmVyZW5jZXMuYWRkKG5vZGUpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERVbmlxdWVOYW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzM5ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0RURFVuaXF1ZU5hbWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgRFREVW5pcXVlTmFtZUhlbHBlciB7Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXROYW1lKE9iamVjdCBvYmopIHsKLQkJaWYgKG9iaiBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXJldHVybiAoKEVsZW1lbnQpIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJcmV0dXJuICgoRW50aXR5KSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJcmV0dXJuICgoTm90YXRpb24pIG9iaikuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJcmV0dXJuICgoQXR0cmlidXRlKSBvYmopLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgLy8gTW9kZWwgR3JvdXAgQ29udGVudAotCQl7Ci0JCQlyZXR1cm4gKChDTUJhc2ljTm9kZSkgb2JqKS5nZXROYW1lKCk7Ci0JCX0KLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VW5pcXVlQXR0cmlidXRlTmFtZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCBhdHRycyA9IGVsZW1lbnQuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoYXR0cnMsICJOZXdBdHRyaWJ1dGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVsZW1lbnROYW1lKERUREZpbGUgZHRkRmlsZSkgewotCQlMaXN0IGVsZW1lbnRzID0gZHRkRmlsZS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKS5nZXROb2RlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShlbGVtZW50cywgIk5ld0VsZW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZUVudGl0eU5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3QgZW50aXRpZXMgPSBkdGRGaWxlLmdldEVudGl0aWVzKCkuZ2V0Tm9kZXMoKTsKLQkJcmV0dXJuIGdldFVuaXF1ZU5hbWUoZW50aXRpZXMsICJOZXdFbnRpdHkiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldFVuaXF1ZU5hbWUoTGlzdCBvYmpzLCBTdHJpbmcgdG9rZW4pIHsKLQkJaW50IGNvdW50ZXIgPSAxOwotCi0JCWJvb2xlYW4gdW5pcXVlTmFtZSA9IGZhbHNlOwotCQl3aGlsZSAoIXVuaXF1ZU5hbWUpIHsKLQkJCVN0cmluZyBuZXdOYW1lID0gdG9rZW4gKyBuZXcgSW50ZWdlcihjb3VudGVyKyspOwotCQkJdW5pcXVlTmFtZSA9IHRydWU7Ci0JCQlJdGVyYXRvciBpdGVyID0gb2Jqcy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGl0ZXIubmV4dCgpOwotCQkJCVN0cmluZyBvYmpOYW1lID0gZ2V0TmFtZShvYmopOwotCQkJCWlmIChvYmpOYW1lLmVxdWFscyhuZXdOYW1lKSkgewotCQkJCQl1bmlxdWVOYW1lID0gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmICh1bmlxdWVOYW1lKSB7Ci0JCQkJcmV0dXJuIG5ld05hbWU7Ci0JCQl9Ci0JCX0KLQkJLy8gd2Ugc2hvdWxkbid0IGdldCBoZXJlCi0JCXJldHVybiAiTm8gTmFtZSBmb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlzdGF0aWMgcHVibGljIFN0cmluZyBnZXRVbmlxdWVOb3RhdGlvbk5hbWUoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxpc3Qgbm90YXRpb25zID0gZHRkRmlsZS5nZXROb3RhdGlvbnMoKS5nZXROb2RlcygpOwotCQlyZXR1cm4gZ2V0VW5pcXVlTmFtZShub3RhdGlvbnMsICJOZXdOb3RhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIERURFVuaXF1ZU5hbWVIZWxwZXIoKSB7Ci0JfQotCi19IC8vIERURFVuaXF1ZU5hbWVIZWxwZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvRFREVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2U2ZDAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvaW50ZXJuYWwvdXRpbC9EVERWaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlBhcmFtZXRlckVudGl0eVJlZmVyZW5jZTsKLQotCi1wdWJsaWMgY2xhc3MgRFREVmlzaXRvciB7Ci0KLQlwdWJsaWMgRFREVmlzaXRvcigpIHsKLQotCX0KLQotCS8vIHV0aWxpdHkgbWV0aG9kCi0JcHVibGljIGJvb2xlYW4gaXNQYXJhbWV0ZXJFbnRpdHlSZWYoU3RyaW5nIHJlZmVyZW5jZSkgewotCQlpZiAocmVmZXJlbmNlLmxlbmd0aCgpID4gMCkgewotCQkJcmV0dXJuIHJlZmVyZW5jZS5jaGFyQXQoMCkgPT0gJyUnICYmIHJlZmVyZW5jZS5jaGFyQXQocmVmZXJlbmNlLmxlbmd0aCgpIC0gMSkgPT0gJzsnOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdChEVERGaWxlIGZpbGUpIHsKLQkJTGlzdCBub2RlcyA9IGZpbGUuZ2V0Tm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5zaXplKCk7IGkrKykgewotCQkJRFRETm9kZSBjdXJyZW50Tm9kZSA9IChEVEROb2RlKSBub2Rlcy5nZXQoaSk7Ci0JCQlpZiAoY3VycmVudE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJdmlzaXRFbGVtZW50KChFbGVtZW50KSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQl2aXNpdEF0dHJpYnV0ZUxpc3QoKEF0dHJpYnV0ZUxpc3QpIGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB7Ci0JCQkJdmlzaXRFeHRlcm5hbFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSgoUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSBjdXJyZW50Tm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgewotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlTGlzdChBdHRyaWJ1dGVMaXN0IGF0dExpc3QpIHsKLQkJLy8gbm90ZSB0aGF0IHdlIGRvbid0IHZpc2l0IGF0dHJpYnV0ZXMgaGVyZSBiZWNhdXNlIHdlCi0JCS8vIHdhbnQgdGhlIGVsZW1lbnQgdG8gdmlzaXQgdGhlbSB3aXRoIGl0J3MgY29uc29saWRhdGVkIGxpc3QKLQkJLy8gdGhhdCBpdCBjcmVhdGVzIGJ5IGdhdGhlcmluZyBhbGwgYXR0cmlidXRlIGxpc3RzIHRvZ2V0aGVyCi0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVzKExpc3QgYXR0cmlidXRlcykgewotCQlpbnQgc2l6ZSA9IGF0dHJpYnV0ZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJQXR0cmlidXRlIGF0dHIgPSAoQXR0cmlidXRlKSBhdHRyaWJ1dGVzLmdldChpKTsKLQkJCXZpc2l0QXR0cmlidXRlKGF0dHIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRDb250ZW50Tm9kZShDTU5vZGUgY29udGVudCkgewotCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKSB7Ci0JCQlDTUJhc2ljTm9kZSBiYXNpY05vZGUgPSAoQ01CYXNpY05vZGUpIGNvbnRlbnQ7Ci0JCQlpZiAoYmFzaWNOb2RlLmlzUmVmZXJlbmNlKCkpIHsKLQkJCQl2aXNpdFJlZmVyZW5jZShiYXNpY05vZGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJdmlzaXRHcm91cE5vZGUoKENNR3JvdXBOb2RlKSBjb250ZW50KTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01Ob2RlIGNvbnRlbnQgPSBlbGVtZW50LmdldENvbnRlbnRNb2RlbCgpOwotCQl2aXNpdENvbnRlbnROb2RlKGNvbnRlbnQpOwotCQl2aXNpdEF0dHJpYnV0ZXMoZWxlbWVudC5nZXRFbGVtZW50QXR0cmlidXRlcygpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2aXNpdEV4dGVybmFsUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSBwYXJtRW50aXR5UmVmKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgdmlzaXRHcm91cE5vZGUoQ01Hcm91cE5vZGUgZ3JvdXApIHsKLQkJTGlzdCBjaGlsZHJlbiA9IGdyb3VwLmdldENoaWxkcmVuTGlzdCgpOwotCQlpbnQgc2l6ZSA9IGNoaWxkcmVuLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCXZpc2l0Q29udGVudE5vZGUoKENNTm9kZSkgY2hpbGRyZW4uZ2V0KGkpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0UmVmZXJlbmNlKENNQmFzaWNOb2RlIG5vZGUpIHsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS9pbnRlcm5hbC91dGlsL0xhYmVsVmFsdWVQYWlyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvTGFiZWxWYWx1ZVBhaXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxZDg3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC9jb3JlL2ludGVybmFsL3V0aWwvTGFiZWxWYWx1ZVBhaXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLQotcHVibGljIGNsYXNzIExhYmVsVmFsdWVQYWlyIHsKLQotCXB1YmxpYyBTdHJpbmcgZkxhYmVsOwotCXB1YmxpYyBPYmplY3QgZlZhbHVlOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBuYW1lL3ZhbHVlIGl0ZW0KLQkgKi8KLQlwdWJsaWMgTGFiZWxWYWx1ZVBhaXIoU3RyaW5nIGxhYmVsLCBPYmplY3QgdmFsdWUpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShsYWJlbCAhPSBudWxsKTsKLQkJZkxhYmVsID0gbGFiZWw7Ci0JCWZWYWx1ZSA9IHZhbHVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL2NvcmUvdGV4dC9JRFREUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90ZXh0L0lEVERQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OTBmMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvY29yZS90ZXh0L0lEVERQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4KLSAqIEl0IGRlZmluZXMgdGhlIHBhcnRpdGlvbiB0eXBlcyBEVEQuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURURFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBEVERfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QuZHRkLkRFRkFVTFQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQzNTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYyIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYy1wcm9wZXJ0aWVzIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIiBraW5kPSJjb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiBraW5kPSJjb24iPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJiaW4iIGtpbmQ9Im91dHB1dCIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDQ1NjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4KLXJ1bnRpbWUKLWR0ZHVpLmphcgotKi56aXAKLWJ1aWxkLnhtbAotdGVtcC5mb2xkZXIKLUBkb3QKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUxNzNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3Byb2plY3Rpb25wZXJmPWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YjIwOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LmR0ZC51aTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjdiYWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjozMTo0MyBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDdkMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5kdGQudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5yZWdpc3RyeTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MucHJvcGVydGllczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZQotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS5pZGU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDEsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWk7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQwMDcxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNvdXJjZS4uID0gc3JjLyxcCi0gICAgICAgICAgIHNyYy1wcm9wZXJ0aWVzLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL0RUREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL0RUREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGVlNTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9EVERGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9icm93c2VidXR0b24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzZGFlNTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Jyb3dzZWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYjdiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfRWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmNDg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2N0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4MjM2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2OGZiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfQXR0cmlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZmI3ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfQXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTVlNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNThlMTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MjVhMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZHRkX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2R0ZF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2Y2MzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3ZHRkX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiYjdiNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmNDg4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvQUREX0VsZW1lbnRUb0Nvbk1vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE4MjM2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2OGZiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9nZW5lcmF0ZV94bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9nZW5lcmF0ZV94bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmQ1ZGQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvZ2VuZXJhdGVfeG1sLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZHRkX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGIxYTc3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3ZHRkX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfQ29tbWVudC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfQ29tbWVudC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjExZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0NvbW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0MTUwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmYTliOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfTm90YXRpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvQUREX05vdGF0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdhZDA4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9BRERfTm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExYzQzNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9EVERGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L25ld2R0ZF93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvbmV3ZHRkX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMTE1ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvbmV3ZHRkX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTNjNmJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNjNWQwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi9zb3VyY2VFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi92YWxpZGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvaWNvbnMvZnVsbC9vYmoxNi92YWxpZGF0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MTk2ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvb2JqMTYvdmFsaWRhdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2R0ZGZpbGVfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdkdGRmaWxlX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjYzc5NzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL2ljb25zL2Z1bGwvd2l6YmFuL25ld2R0ZGZpbGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUwZDYwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNRFREIC0gWE1MIFRvb2xzIERURCBFZGl0b3IKLSEgUGFja2FnZWQgZm9yIHRyYW5zbGF0aW9uIGluOiAgeG1sLnppcAotCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9U1NFIERURCBTb3VyY2UgRWRpdG9yCi0KLURURF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1EVEQgRWRpdG9yCi1fVUlfTEFCRUxfRFREX0ZJTEVTPURURCBGaWxlcwotRFREX1RlbXBsYXRlcy5uYW1lPURURCBUZW1wbGF0ZXMKLV9VSV9MQUJFTF9EVERfU1RZTEVTPURURCBTdHlsZXMKLV9VSV9XSVpBUkRfTkVXX0RURD1EVEQgRmlsZQotX1VJX0NSRUFURV9ORVdfRFREX0ZJTEU9Q3JlYXRlIGEgbmV3IERURCBmaWxlCi0jIwotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9UHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD1SZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA9UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotIyMKLUFkZFRhc2subGFiZWw9QWRkICZUYXNrLi4uCi1BZGRUYXNrLnRvb2x0aXA9QWRkIFRhc2suLi4KLUFkZEJvb2ttYXJrLmxhYmVsPUFkZCBCb28ma21hcmsuLi4KLUFkZEJvb2ttYXJrLnRvb2x0aXA9QWRkIEJvb2ttYXJrLi4uCi1TZWxlY3RSdWxlci5sYWJlbD1TZWxlY3QgUnVsZXIKLSMjCi1fVUlfTUVOVV9WQUxJREFURV9EVEQgICAgICAgICAgICAgICA9ICZWYWxpZGF0ZSBEVEQgRmlsZQotCi1EVERfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPU5ldyBEVEQKLV9VSV9MQUJFTF9HRU5FUkFMPUdlbmVyYWwKLV9VSV9MQUJFTF9PVEhFUj1PdGhlcgotX1VJX0xBQkVMX0FUVFJJQlVURVM9QXR0cmlidXRlcwotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT049RG9jdW1lbnRhdGlvbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDM2ZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPCEtLSBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIgLS0+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVEVERfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvRFRERmlsZS5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5BY3Rpb25Db250cmlidXRvckRURCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRUREVkaXRvciIKLQkJCXN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCTwvZWRpdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPGNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmUuRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFREIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRleHQuRFRERG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPCEtLSBjb21tZW50IG91dCB0aWxsIGFibGUgdG8gaW1wcm92ZSBkdGQgZm9sZGluZwotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb2plY3Rpb24uU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiIC8+Ci0JCS0tPgotCQk8cHJvdmlzaW9uYWxEZWZpbml0aW9uCi0JCQl0eXBlPSJwcmVmZXJlbmNlcGFnZXMiCi0JCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQuc3R5bGVzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlIiAvPgotCQk8IS0tIHByb3ZpZGUgc3ludGF4IGhpZ2hsaWdodGluZyBmb3IgRFREIHN1YnNldCB3aXRoaW4gWE1MIC0tPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJsaW5lc3R5bGVwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0IgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JBY3Rpb25zIj4KLQkJPGVkaXRvckNvbnRyaWJ1dGlvbgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEVuY2xvc2luZ1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdE5leHRYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0TmV4dCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5wcmV2aW91cyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RIaXN0b3J5QWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiPgotCQkJPC9hY3Rpb24+Ci0JCTwvZWRpdG9yQ29udHJpYnV0aW9uPgotICAgICAgICA8ZWRpdG9yQ29udHJpYnV0aW9uCi0gICAgICAgICAgICB0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIHVzZSBhIHNwZWNpZmljIGFubm90YXRpb24gbW9kZWwgd2l0aCBGaWxlQnVmZmVycyAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLmFubm90YXRpb25Nb2RlbENyZWF0aW9uIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBSZWdpc3RlciB0aGUgVUkgYWRhcHRlciBmYWN0b3J5IHByb3ZpZGVyIC0tPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI+Ci0JCTxhZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZSIgLz4KLQkJPC9hZGFwdGVyRmFjdG9yeURlc2NyaXB0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBFZGl0b3IgYWN0aW9uc2V0cyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIiAvPgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSIgLz4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8cGFnZQotCQkJbmFtZT0iJV9VSV9MQUJFTF9EVERfRklMRVMiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkRUREZpbGVzUHJlZmVyZW5jZVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlRFREX1RlbXBsYXRlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmR0ZC50ZW1wbGF0ZXMiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlX1VJX0xBQkVMX0RURF9TVFlMRVMiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERDb2xvclBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy5kdGQuc3R5bGVzIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSBOZXcgRFREIHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkLk5ld0RURFdpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05FV19EVEQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQuTmV3RFREV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2R0ZF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4lX1VJX0NSRUFURV9ORVdfRFREX0ZJTEU8L2Rlc2NyaXB0aW9uPgotCQkJPHNlbGVjdGlvbiBjbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIiAvPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSBEVEQgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnBvcHVwTWVudXMiPgotCQk8dmlld2VyQ29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UuUnVsZXJDb250ZXh0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IucnVsZXIuY29udGV4dC5hY3Rpb25zIj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZFRhc2subGFiZWwiCi0JCQkJaGVscENvbnRleHRJZD0ib3JnLmVjbGlwc2UudWkuQWRkVGFza19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZFRhc2sudG9vbHRpcCIKLQkJCQltZW51YmFyUGF0aD0iYWRkaXRpb25zIgotCQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRhc2tSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJUFkZEJvb2ttYXJrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0JCQkJdG9vbHRpcD0iJUFkZEJvb2ttYXJrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIj4KLQkJCTwvYWN0aW9uPgotCQk8L3ZpZXdlckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlRFREX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlRFREIgotCQkJaWQ9ImR0ZF9uZXciPgotCQk8L2NvbnRleHRUeXBlPgotCTwvZXh0ZW5zaW9uPgotCi0gICA8ZXh0ZW5zaW9uCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5wcm9wZXJ0eUNvbnRyaWJ1dG9yIgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5Q29udHJpYnV0b3IiPgotICAgICAgPHByb3BlcnR5Q29udHJpYnV0b3IKLSAgICAgICAgICAgIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIgotICAgICAgICAgICAgbGFiZWxQcm92aWRlcj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIiCi0gICAgICAgICAgICB0eXBlTWFwcGVyPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERUeXBlTWFwcGVyIj4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmdlbmVyYWwiLz4KLSAgICAgICAgIDxwcm9wZXJ0eUNhdGVnb3J5Ci0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLm90aGVyIi8+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5hdHRyaWJ1dGVzIi8+Ci0gICAgICAgICA8cHJvcGVydHlDYXRlZ29yeQotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5kb2N1bWVudGF0aW9uIi8+Ci0gICAgICA8L3Byb3BlcnR5Q29udHJpYnV0b3I+Ci0gICA8L2V4dGVuc2lvbj4KLSAgIAotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLnByb3BlcnR5VGFicyI+Ci0gICAgICA8cHJvcGVydHlUYWJzCi0gICAgICAgICAgICBjb250cmlidXRvcklkPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuZHRkc291cmNlLnNvdXJjZSI+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGxhYmVsPSIlX1VJX0xBQkVMX0dFTkVSQUwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmdlbmVyYWwiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIi8+Ci0gICAgICAgICA8cHJvcGVydHlUYWIKLSAgICAgICAgICAgICAgIGFmdGVyVGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiCi0gICAgICAgICAgICAgICBjYXRlZ29yeT0iZHRkLnVpLmF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfQVRUUklCVVRFUyIvPgotICAgICAgICAgPHByb3BlcnR5VGFiCi0gICAgICAgICAgICAgICBhZnRlclRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIgotICAgICAgICAgICAgICAgY2F0ZWdvcnk9ImR0ZC51aS5vdGhlciIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLm90aGVyIgotICAgICAgICAgICAgICAgbGFiZWw9IiVfVUlfTEFCRUxfT1RIRVIiLz4KLSAgICAgICAgIDxwcm9wZXJ0eVRhYgotICAgICAgICAgICAgICAgYWZ0ZXJUYWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIKLSAgICAgICAgICAgICAgIGNhdGVnb3J5PSJkdGQudWkuZG9jdW1lbnRhdGlvbiIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmRvY3VtZW50YXRpb24iCi0gICAgICAgICAgICAgICBsYWJlbD0iJV9VSV9MQUJFTF9ET0NVTUVOVEFUSU9OIi8+Ci0gICAgICA8L3Byb3BlcnR5VGFicz4KLSAgIDwvZXh0ZW5zaW9uPiAgIAotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5wcm9wZXJ0eVNlY3Rpb25zIj4KLSAgIDxwcm9wZXJ0eVNlY3Rpb25zIGNvbnRyaWJ1dG9ySWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5kdGRzb3VyY2Uuc291cmNlIj4KLQkgPHByb3BlcnR5U2VjdGlvbgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uTmFtZVNlY3Rpb24iCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbiIKLSAgICAgICAgdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0Ii8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnV0ZURlZmF1bHRTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmdlbmVyYWwiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29tbWVudFNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db21tZW50U2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxHcm91cFNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxHcm91cFNlY3Rpb24iPgotCSAgICAJPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZSIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxOYW1lU2VjdGlvbiIKLSAgICAgICAgZmlsdGVyPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxOYW1lRmlsdGVyIgotICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZVNlY3Rpb24iCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkub3RoZXIiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsVHlwZVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxUeXBlU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlIi8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAJCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmRvY3VtZW50YXRpb24iIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRG9jdW1lbnRTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRG9jdW1lbnRTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudCIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHkiLz4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdCIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbiIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVtcHR5U2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVtcHR5U2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLlBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSIvPgotCQkgCTxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbiIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8IS0tCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5vdGhlciIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbiIgIAotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkVudGl0eVR5cGVTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5Ii8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCi0JIDxwcm9wZXJ0eVNlY3Rpb24gdGFiPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmF0dHJpYnV0ZXMiIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VmFsdWVTZWN0aW9uIiAgCi0JIAlpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VmFsdWVTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5Ii8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotCSAtLT4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5nZW5lcmFsIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk5ld0VudGl0eVNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZSIvPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHkiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0JIAkKLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuZ2VuZXJhbCIgCi0gICAgICAgIGVuYWJsZXNGb3I9IjEiCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Ob3RhdGlvblNlY3Rpb24iICAKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Ob3RhdGlvblNlY3Rpb24iPgotCQkgICAgPGlucHV0IHR5cGU9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ob3RhdGlvbiIvPgotCSA8L3Byb3BlcnR5U2VjdGlvbj4KLQkgCQotCSA8cHJvcGVydHlTZWN0aW9uIHRhYj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5hdHRyaWJ1dGVzIiAKLSAgICAgICAgZW5hYmxlc0Zvcj0iMSIKLSAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLk9jY3VycmVuY2VTZWN0aW9uIiAgCi0gICAgICAgIGZpbHRlcj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZUZpbHRlciIKLQkgCWlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlU2VjdGlvbiI+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlIi8+Ci0JCSAgICA8aW5wdXQgdHlwZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNUmVwZWF0YWJsZU5vZGUiLz4KLQkgPC9wcm9wZXJ0eVNlY3Rpb24+Ci0KLQkgPHByb3BlcnR5U2VjdGlvbiB0YWI9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuYXR0cmlidXRlcyIgCi0gICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbiIgIAotICAgICAgICBlbmFibGVzRm9yPSIxIgotCSAJaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLlR5cGVTZWN0aW9uIj4KLQkJICAgIDxpbnB1dCB0eXBlPSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlIi8+Ci0JIDwvcHJvcGVydHlTZWN0aW9uPgotICA8L3Byb3BlcnR5U2VjdGlvbnM+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFRERWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhZDdmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFnZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvcjsKLQotLyoqCi0gKiBBIERURCBFZGl0b3Igc3ViY2xhc3MgU3RydWN0dXJlZFRleHRFZGl0b3IsIHJlcXVpcmVkIHRvIHN1cHBseSBhIGNvbXBsZXRlCi0gKiByZXBsYWNlbWVudCBmb3IgdGhlIHByb3BlcnR5IHNoZWV0IHBhZ2UuIFdoZW4gYSBiZXR0ZXIgc29sdXRpb24gaXMgZm91bmQsCi0gKiB0aGlzIGNsYXNzIHdpbGwgYmUgcmVtb3ZlZC4KLSAqLwotcHVibGljIGNsYXNzIERUREVkaXRvciBleHRlbmRzIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHsKLQljbGFzcyBEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IgewotCQlEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IjZ2V0Q29udHJpYnV0b3JJZCgpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldENvbnRyaWJ1dG9ySWQoKSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdG9yU2l0ZSgpLmdldElkKCk7Ci0JCX0KLQl9Ci0KLQlUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0KLQlwdWJsaWMgRFRERWRpdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBJQWRhcHRhYmxlI2dldEFkYXB0ZXIoQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKSB7Ci0JCWlmIChJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJaWYgKGZQcm9wZXJ0eVNoZWV0UGFnZSA9PSBudWxsKSB7Ci0JCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gbmV3IERURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlKG5ldyBEVERQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKCkpOwotCQkJCS8qCi0JCQkJICogQWRkIHRoZSBwcm9wZXJ0eSBzaGVldCBwYWdlIGFzIGEgZGlyZWN0IHBvc3Qgc2VsZWN0aW9uCi0JCQkJICogbGlzdGVuZXIgc28gc3RhbmRhcmQgY3Vyc29yIG5hdmlnYXRpb24gdHJpZ2dlcnMgYSBzZWxlY3Rpb24KLQkJCQkgKiBub3RpZmljYXRpb24uIFRoZSBkZWZhdWx0IHRhYmJlZCBwcm9wZXJ0eSBzaGVldCBkb2VzIG5vdAotCQkJCSAqIGxpc3RlbiB0byBwb3N0IHNlbGVjdGlvbi4KLQkJCQkgKi8KLQkJCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpZiAoZlByb3BlcnR5U2hlZXRQYWdlICE9IG51bGwgJiYgIWZQcm9wZXJ0eVNoZWV0UGFnZS5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJZlByb3BlcnR5U2hlZXRQYWdlLnNlbGVjdGlvbkNoYW5nZWQoRFRERWRpdG9yLnRoaXMsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlyZXR1cm4gZlByb3BlcnR5U2hlZXRQYWdlOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElFZGl0b3JTaXRlIHNpdGUsIElFZGl0b3JJbnB1dCBlZGl0b3JJbnB1dCkgdGhyb3dzIFBhcnRJbml0RXhjZXB0aW9uIHsKLQkJc3VwZXIuaW5pdChzaXRlLCBlZGl0b3JJbnB1dCk7Ci0KLQkJSVdvcmtiZW5jaFdpbmRvdyBkdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBkdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCXRyeSB7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJcGFnZS5zaG93VmlldyhJUGFnZUxheW91dC5JRF9QUk9QX1NIRUVUKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERQcm9wZXJ0aWVzTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhmOTBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIERURFByb3BlcnRpZXNNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXMiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5PY2N1cnJlbmNlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09OQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX09ORV9PUl9NT1JFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9PUFRJT05BTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfWkVST19PUl9NT1JFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PQ0NVUlJFTkNFOwotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkF0dHJpYnVlRGVmYXVsdFNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9ERUZBVUxUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9VU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfREVGQVVMVF9WQUxVRTsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbEdyb3VwU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NFUVVFTkNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DSE9JQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX01PREVMX0dST1VQOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05URU5UX01PREVMOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQ29udGVudE1vZGVsVHlwZVNlY3Rpb24uamF2YQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9DT05URU5UX1RZUEU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RZUEU7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VOVElUWV9UWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9FWFRFUk5BTF9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZOwotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRU5USVRZX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCS8vIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVF9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DSE9JQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9TRVFVRU5DRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVFJJQlVURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVExJU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfTk9UQVRJT047Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfRklMRURJQUxPR19TRUxFQ1RfRFREX0RFU0M7Ci0KLQkvLyBOZXcgcHJvcGVydHkgdGFicwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9HRU5FUkFMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9PVEhFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRE9DVU1FTlRBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERFZGl0b3JfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERTZWN0aW9uTGFiZWxQcm92aWRlcl83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOTsKLQotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXRyeSB7Ci0JCQlpZiAoZlJlc291cmNlQnVuZGxlID09IG51bGwpCi0JCQkJZlJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKEJVTkRMRV9OQU1FKTsKLQkJfQotCQljYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIHgpIHsKLQkJCWZSZXNvdXJjZUJ1bmRsZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGZSZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQlwcml2YXRlIERURFByb3BlcnRpZXNNZXNzYWdlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFByb3BlcnRpZXNNZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzZDUzMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREUHJvcGVydGllc01lc3NhZ2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0hIFByb3BlcnRpZXMgZmlsZSBmb3IgY29tcG9uZW50OiBYTUwgdG9vbHMgRFREIEVkaXRvcgotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uT2NjdXJyZW5jZVNlY3Rpb24uamF2YQotX1VJX09OQ0UgICAgICAgICAgICAgPSBKdXN0IG9uY2UgKDEpCi1fVUlfT05FX09SX01PUkUgICAgICA9IE9uZSBvciBtb3JlICgrKQotX1VJX09QVElPTkFMICAgICAgICAgPSBPcHRpb25hbCAoPykKLV9VSV9aRVJPX09SX01PUkUgICAgID0gWmVybyBvciBtb3JlICgqKQotX1VJX0xBQkVMX09DQ1VSUkVOQ0UgPSBPY2N1cnJlbmNlCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24uamF2YQotX1VJX0RFRkFVTFQgICAgICAgICAgICAgPSBEZWZhdWx0Ci1fVUlfTEFCRUxfVVNBR0UgICAgICAgICA9IFVzYWdlCi1fVUlfTEFCRUxfREVGQVVMVF9WQUxVRSA9IERlZmF1bHQgVmFsdWUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQotX1VJX1NFUVVFTkNFICAgICAgICAgID0gU2VxdWVuY2UgKCwpCi1fVUlfQ0hPSUNFICAgICAgICAgICAgPSBDaG9pY2UgKHwpCi1fVUlfTEFCRUxfTU9ERUxfR1JPVVAgPSBNb2RlbCBHcm91cAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbE5hbWVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9DT05URU5UX01PREVMID0gQ29udGVudCBNb2RlbAotCi0hIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uLkNvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9DT05URU5UX1RZUEUgPSBDb250ZW50IFR5cGUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OYW1lU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfTkFNRSA9IE5hbWUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5UeXBlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfVFlQRSA9IFR5cGUKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCi1fVUlfTEFCRUxfRU5USVRZX1RZUEUgICAgICA9IEVudGl0eSBUeXBlCi1fVUlfTEFCRUxfRVhURVJOQUxfRU5USVRZICA9IEV4dGVybmFsCi1fVUlfTEFCRUxfUEFSQU1FVEVSX0VOVElUWSA9IFBhcmFtZXRlcgotX1VJX0xBQkVMX0dFTkVSQUxfRU5USVRZICAgPSBHZW5lcmFsCi0KLSEgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb24uRW50aXR5VmFsdWVTZWN0aW9uLmphdmEKLV9VSV9MQUJFTF9FTlRJVFlfVkFMVUUgPSBFbnRpdHkgVmFsdWUKLV9VSV9MQUJFTF9QVUJMSUNfSUQgICAgPSBQdWJsaWMgSUQKLV9VSV9MQUJFTF9TWVNURU1fSUQgICAgPSBTeXN0ZW0gSUQKLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5EVERTZWN0aW9uTGFiZWxQcm92aWRlcgotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UICAgICA9IGVsZW1lbnQKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfRUxFTUVOVF9SRUYgPSBlbGVtZW50IHJlZmVyZW5jZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9DSE9JQ0UgICAgICA9IGNob2ljZQotX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9TRVFVRU5DRSAgICA9IHNlcXVlbmNlCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVFJJQlVURSAgID0gYXR0cmlidXRlCi1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0FUVExJU1QgICAgID0gYXR0cmlidXRlIGxpc3QKLV9VSV9QUk9QRVJUSUVTX1ZJRVdfVElUTEVfQ09NTUVOVCAgICAgPSBjb21tZW50Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX0VOVElUWSAgICAgID0gZW50aXR5Ci1fVUlfUFJPUEVSVElFU19WSUVXX1RJVExFX05PVEFUSU9OICAgID0gbm90YXRpb24KLQotISBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbi5OZXdFbnRpdHlTZWN0aW9uCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfRFREID0gU2VsZWN0IERURCBmaWxlCi1fVUlfRklMRURJQUxPR19TRUxFQ1RfRFREX0RFU0MgICA9IFNlbGVjdCBhIERURCBmaWxlIGZyb20gdGhlIFdvcmtiZW5jaCBwcm9qZWN0cwotCi0hIE5ldyBwcm9wZXJ0eSB0YWJzCi1fVUlfTEFCRUxfR0VORVJBTCAgICAgICA9IEdlbmVyYWwKLV9VSV9MQUJFTF9PVEhFUiAgICAgICAgID0gT3RoZXIKLV9VSV9MQUJFTF9BVFRSSUJVVEVTICAgID0gQXR0cmlidXRlcwotX1VJX0xBQkVMX0RPQ1VNRU5UQVRJT04gPSBEb2N1bWVudGF0aW9uCi0hIGVuZAotRFRERWRpdG9yXzA9Z2VuZXJhbAotRFRERWRpdG9yXzE9b3RoZXIKLURUREVkaXRvcl8yPWF0dHJpYnV0ZXMKLURUREVkaXRvcl8zPWRvY3VtZW50YXRpb24KLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzA9Y2hvaWNlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xPXNlcXVlbmNlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl82PWVsZW1lbnQKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzc9YXR0cmlidXRlCi1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl84PWF0dHJpYnV0ZSBsaXN0Ci1EVERTZWN0aW9uTGFiZWxQcm92aWRlcl85PWNvbW1lbnQKLURURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzEwPWVudGl0eQotRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE9bm90YXRpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGNhODVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZTsKLQotY2xhc3MgRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UgZXh0ZW5kcyBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB7Ci0KLQlwcml2YXRlIElTZWxlY3Rpb24gb2xkU2VsZWN0aW9uID0gbnVsbDsKLQotCXB1YmxpYyBEVERUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZShJVGFiYmVkUHJvcGVydHlTaGVldFBhZ2VDb250cmlidXRvciB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZUNvbnRyaWJ1dG9yKSB7Ci0JCXN1cGVyKHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlQ29udHJpYnV0b3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3b3JrYmVuY2hXaW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yID0gYWN0aXZlUGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJLy8gbWFrZSBzdXJlIHRoZSBjb3JyZWN0IGVkaXRvciBpcyBhY3RpdmUKLQkJCQkJaWYgKGFjdGl2ZUVkaXRvci5nZXRBZGFwdGVyKElQcm9wZXJ0eVNoZWV0UGFnZS5jbGFzcykgPT0gRFREVGFiYmVkUHJvcGVydHlTaGVldFBhZ2UudGhpcykgewotCQkJCQkJaWYgKG9sZFNlbGVjdGlvbiA9PSBudWxsIHx8ICFvbGRTZWxlY3Rpb24uZXF1YWxzKHNlbGVjdGlvbikpIHsKLQkJCQkJCQlvbGRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCQkJCQkJc3VwZXIuc2VsZWN0aW9uQ2hhbmdlZChwYXJ0LCBzZWxlY3Rpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0Fic3RyYWN0U2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjc0NzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BYnN0cmFjdFNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklTZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50SW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgQWJzdHJhY3RTZWN0aW9uIGltcGxlbWVudHMgSVNlY3Rpb24sIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyLCBMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIgewotCXByaXZhdGUgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeTsKLQlwcm90ZWN0ZWQgSVdvcmtiZW5jaFBhcnQgZldvcmtiZW5jaFBhcnQ7Ci0JcHJvdGVjdGVkIElTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQlwcm90ZWN0ZWQgT2JqZWN0IGZJbnB1dDsKLQlwcm90ZWN0ZWQgaW50IHJpZ2h0TWFyZ2luU3BhY2U7Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSB0YWJiZWRQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQljcmVhdGVDb250cm9scyhwYXJlbnQsIHRhYmJlZFByb3BlcnR5U2hlZXRQYWdlLmdldFdpZGdldEZhY3RvcnkoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGFGYWN0b3J5KSB7Ci0JCXRoaXMuZmFjdG9yeSA9IGFGYWN0b3J5OwotCQlHQyBnYyA9IG5ldyBHQyhwYXJlbnQpOwotCQlQb2ludCBleHRlbnQgPSBnYy50ZXh0RXh0ZW50KCIgIC4uLiAgIik7IC8vJE5PTi1OTFMtMSQKLQkJcmlnaHRNYXJnaW5TcGFjZSA9IGV4dGVudC54OwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5wdXQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWwpIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzZWwgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbiwgInNlbGVjdGlvbiAiICsgc2VsLmdldENsYXNzKCkgKyAiaXMgbm90IHN0cnVjdHVyZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRoaXMuZldvcmtiZW5jaFBhcnQgPSBwYXJ0OwotCQl0aGlzLmZTZWxlY3Rpb24gPSBzZWw7Ci0JCXRoaXMuZklucHV0ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCS8qCi0JCSAqIGlmIChmSW5wdXQgaW5zdGFuY2VvZiBYU0RDb25jcmV0ZUNvbXBvbmVudCkgeyB4c2RTY2hlbWEgPQotCQkgKiAoKFhTRENvbmNyZXRlQ29tcG9uZW50KWZJbnB1dCkuZ2V0U2NoZW1hKCk7IH0KLQkJICovCi0KLQkJLy8gcmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZVNob3duKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQmVTaG93bigpIHsKLQkJcmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Fib3V0VG9CZUhpZGRlbigpCi0JICovCi0JcHVibGljIHZvaWQgYWJvdXRUb0JlSGlkZGVuKCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jZ2V0TWluaW11bUhlaWdodCgpCi0JICovCi0JcHVibGljIGludCBnZXRNaW5pbXVtSGVpZ2h0KCkgewotCQlyZXR1cm4gU1dULkRFRkFVTFQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldElucHV0KCkgewotCQlpZiAoZklucHV0IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJLy8gZklucHV0ID0geHNkU2NoZW1hLmdldENvcnJlc3BvbmRpbmdDb21wb25lbnQoKEVsZW1lbnQpZklucHV0KTsKLQkJfQotCQlyZXR1cm4gZklucHV0OwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICogCi0JICogQHJldHVybiB0aGUgd2lkZ2V0IGZhY3RvcnkuCi0JICovCi0JcHVibGljIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGdldFdpZGdldEZhY3RvcnkoKSB7Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJcmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRvV2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb1dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIjd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmIGdldElucHV0KCkgIT0gbnVsbCAmJiAhaXNJbkRvSGFuZGxlKSB7Ci0JCQlpc0luRG9IYW5kbGUgPSB0cnVlOwotCQkJZG9XaWRnZXREZWZhdWx0U2VsZWN0ZWQoZSk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyI3dpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGlzTGlzdGVuZXJFbmFibGVkKCkgJiYgZ2V0SW5wdXQoKSAhPSBudWxsICYmICFpc0luRG9IYW5kbGUpIHsKLQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQlkb1dpZGdldFNlbGVjdGVkKGUpOwotCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCX0KLQotCX0KLQotCWJvb2xlYW4gbGlzdGVuZXJFbmFibGVkID0gdHJ1ZTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTGlzdGVuZXJFbmFibGVkKCkgewotCQlyZXR1cm4gbGlzdGVuZXJFbmFibGVkOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgdmFsdWUgb2YgbGlzdGVuZXJFbmFibGVkLgotCSAqIAotCSAqIEBwYXJhbSB2Ci0JICogICAgICAgICAgICBWYWx1ZSB0byBhc3NpZ24gdG8gbGlzdGVuZXJFbmFibGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExpc3RlbmVyRW5hYmxlZChib29sZWFuIHYpIHsKLQkJdGhpcy5saXN0ZW5lckVuYWJsZWQgPSB2OwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChpc0xpc3RlbmVyRW5hYmxlZCgpICYmICFpc0luRG9IYW5kbGUpIHsKLQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQlzdGFydERlbGF5ZWRFdmVudChldmVudCk7Ci0JCQlpc0luRG9IYW5kbGUgPSBmYWxzZTsKLQkJfSAvLyBlbmQgb2YgaWYgKCkKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgRGVsYXllZEV2ZW50IGRlbGF5ZWRUYXNrOwotCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnREZWxheWVkRXZlbnQoRXZlbnQgZSkgewotCQlpZiAoZGVsYXllZFRhc2sgPT0gbnVsbCB8fCBkZWxheWVkVGFzay5nZXRFdmVudCgpID09IG51bGwpIHsKLQkJCWRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotCQkJZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFdmVudCBkZWxheWVkRXZlbnQgPSBkZWxheWVkVGFzay5nZXRFdmVudCgpOwotCi0JCQlpZiAoZS53aWRnZXQgPT0gZGVsYXllZEV2ZW50LndpZGdldCAmJiBlLnR5cGUgPT0gZGVsYXllZEV2ZW50LnR5cGUpIHsKLQkJCQkvLyBzYW1lIGV2ZW50LCBqdXN0IGRpZmZlcmVudCBkYXRhLCBkZWxheSBuZXcgZXZlbnQKLQkJCQlkZWxheWVkVGFzay5zZXRFdmVudChudWxsKTsKLQkJCX0KLQkJCWRlbGF5ZWRUYXNrID0gbmV3IERlbGF5ZWRFdmVudCgpOwotCQkJZGVsYXllZFRhc2suc2V0RXZlbnQoZSk7Ci0JCQlEaXNwbGF5LmdldERlZmF1bHQoKS50aW1lckV4ZWMoNTAwLCBkZWxheWVkVGFzayk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBEZWxheWVkRXZlbnQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0JCXByb3RlY3RlZCBFdmVudCBldmVudDsKLQotCQkvKgotCQkgKiBAc2VlIFJ1bm5hYmxlI3J1bigpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlpZiAoZXZlbnQgIT0gbnVsbCkgewotCQkJCWlzSW5Eb0hhbmRsZSA9IHRydWU7Ci0JCQkJZG9IYW5kbGVFdmVudChldmVudCk7Ci0JCQkJaXNJbkRvSGFuZGxlID0gZmFsc2U7Ci0JCQkJZXZlbnQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIEdldHMgdGhlIGV2ZW50LgotCQkgKiAKLQkJICogQHJldHVybiBSZXR1cm5zIGEgRXZlbnQKLQkJICovCi0JCXB1YmxpYyBFdmVudCBnZXRFdmVudCgpIHsKLQkJCXJldHVybiBldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBTZXRzIHRoZSBldmVudC4KLQkJICogCi0JCSAqIEBwYXJhbSBldmVudAotCQkgKiAgICAgICAgICAgIFRoZSBldmVudCB0byBzZXQKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldEV2ZW50KEV2ZW50IGUpIHsKLQkJCXRoaXMuZXZlbnQgPSBlOwotCQl9Ci0KLQl9Ci0KLQlib29sZWFuIGlzSW5Eb0hhbmRsZTsKLQotCS8qKgotCSAqIEdldCB0aGUgdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotCSAqIAotCSAqIEByZXR1cm4gdmFsdWUgb2YgaXNJbkRvSGFuZGxlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5Eb0hhbmRsZSgpIHsKLQkJcmV0dXJuIGlzSW5Eb0hhbmRsZTsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIElFZGl0b3JQYXJ0IGdldEFjdGl2ZUVkaXRvcigpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0V29ya2JlbmNoKCk7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gd29ya2JlbmNoV2luZG93LmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLQotCQlyZXR1cm4gZWRpdG9yUGFydDsKLQl9Ci0KLQlzdGF0aWMgcHJvdGVjdGVkIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcihJRWRpdG9yUGFydCBlZGl0b3JQYXJ0KSB7Ci0JCUlTdGF0dXNMaW5lTWFuYWdlciByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udHJpYnV0b3IgPSAoRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIGVkaXRvclBhcnQuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQlyZXN1bHQgPSBjb250cmlidXRvci5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCURvY3VtZW50SW1wbCBnZXREb2N1bWVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIChEb2N1bWVudEltcGwpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBkZXNjcmlwdGlvbiwgRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50SW1wbCBkb2MgPSBnZXREb2N1bWVudChlbGVtZW50KTsKLQkJZG9jLmdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZGVzY3JpcHRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvYyA9IGdldERvY3VtZW50KGVsZW1lbnQpOwotCi0JCWRvYy5nZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZU5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVMYW5ndWFnZShTdHJpbmcgbGFuZykgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9BdHRyaWJ1dGVEZWZhdWx0U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MWJiNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0F0dHJpYnV0ZURlZmF1bHRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlRGVmYXVsdFNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSU1QTElFRCA9IEF0dHJpYnV0ZS5JTVBMSUVEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFJFUVVJUkVEID0gQXR0cmlidXRlLlJFUVVJUkVEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEZJWEVEID0gQXR0cmlidXRlLkZJWEVEOwotCi0JcHJpdmF0ZSBDQ29tYm8gdXNhZ2VDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHVzYWdlQ29tYm9WYWx1ZXMgPSB7SU1QTElFRCwgUkVRVUlSRUQsIEZJWEVELCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFR9OwotCXByaXZhdGUgVGV4dCBkZWZhdWx0VmFsdWVUZXh0OwotCXByaXZhdGUgQ0xhYmVsIGRlZmF1bHRWYWx1ZUxhYmVsOwotCXByaXZhdGUgRm9udE1ldHJpY3MgZkZvbnRNZXRyaWNzOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIHVzYWdlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9VU0FHRSk7Ci0JCWluaXRpYWxpemVGb250TWV0cmljcyh1c2FnZUxhYmVsKTsKLQkJaW50IGxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKHVzYWdlTGFiZWwuZ2V0VGV4dCgpKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXVzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl1c2FnZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl1c2FnZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXVzYWdlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXVzYWdlQ29tYm8uc2V0SXRlbXModXNhZ2VDb21ib1ZhbHVlcyk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJZGVmYXVsdFZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9ERUZBVUxUX1ZBTFVFKTsKLQkJbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoZGVmYXVsdFZhbHVlTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWRlZmF1bHRWYWx1ZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChkZWZhdWx0VmFsdWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGRlZmF1bHRWYWx1ZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlkZWZhdWx0VmFsdWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlTdHJpbmcga2luZCA9ICgoQXR0cmlidXRlKSBpbnB1dCkuZ2V0RGVmYXVsdEtpbmQoKTsKLQkJCQlpZiAoIiIuZXF1YWxzKGtpbmQpKSAvLyROT04tTkxTLTEkCi0JCQkJCXVzYWdlQ29tYm8uc2V0VGV4dChEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFQpOwotCQkJCWVsc2UKLQkJCQkJdXNhZ2VDb21iby5zZXRUZXh0KGtpbmQpOwotCi0JCQkJaWYgKCIiLmVxdWFscyhraW5kKSB8fCBGSVhFRC5lcXVhbHMoa2luZCkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldFZpc2libGUodHJ1ZSk7Ci0JCQkJCWRlZmF1bHRWYWx1ZVRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRUZXh0KCgoQXR0cmlidXRlKSBpbnB1dCkuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHVzYWdlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlTdHJpbmcgdXNhZ2UgPSB1c2FnZUNvbWJvLmdldFRleHQoKTsKLQkJCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaW5wdXQ7Ci0JCQkJaWYgKHVzYWdlLmVxdWFscyhEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0RFRkFVTFQpKQotCQkJCQlhdHRyaWJ1dGUuc2V0RGVmYXVsdEtpbmQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJZWxzZQotCQkJCQlhdHRyaWJ1dGUuc2V0RGVmYXVsdEtpbmQodXNhZ2UpOwotCi0JCQkJaWYgKERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfREVGQVVMVC5lcXVhbHModXNhZ2UpIHx8IEZJWEVELmVxdWFscyh1c2FnZSkpIHsKLQkJCQkJZGVmYXVsdFZhbHVlTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCQkJCQlkZWZhdWx0VmFsdWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWZhdWx0VmFsdWVMYWJlbC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJCQkJZGVmYXVsdFZhbHVlVGV4dC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJaWYgKGV2ZW50LndpZGdldCA9PSBkZWZhdWx0VmFsdWVUZXh0KSB7Ci0JCQkJU3RyaW5nIG5ld1ZhbHVlID0gZGVmYXVsdFZhbHVlVGV4dC5nZXRUZXh0KCk7Ci0JCQkJKChBdHRyaWJ1dGUpIGlucHV0KS5zZXREZWZhdWx0VmFsdWUobmV3VmFsdWUsIHVzYWdlQ29tYm8uZ2V0VGV4dCgpLmVxdWFscyhGSVhFRCkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlsaXplIGZvbnQgbWV0cmljcwotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb250TWV0cmljcyhDb250cm9sIGNvbnRyb2wpIHsKLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0JCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCQlmRm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGxhYmVsIHdpZHRoCi0JICogCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRMYWJlbFdpZHRoKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJaW50IGxhYmVsV2lkdGggPSA5ODsKLQotCQlpbnQgcGl4ZWxzID0gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGxhYmVsVGV4dC5sZW5ndGgoKSArIDUpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocGl4ZWxzLCBsYWJlbFdpZHRoKTsKLQkJcmV0dXJuIGxhYmVsV2lkdGg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db21tZW50U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWYyZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbW1lbnRTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb21tZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBUZXh0IGNvbW1lbnRUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJY29tbWVudFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTVVMVEkgfCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJY29tbWVudFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgQ29tbWVudFNlY3Rpb24udGhpcyk7Ci0KLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbW1lbnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJY29tbWVudFRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJY29tbWVudFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENvbW1lbnQpCi0JCQkJY29tbWVudFRleHQuc2V0VGV4dCgoKENvbW1lbnQpIGlucHV0KS5nZXRUZXh0KCkpOwotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IGNvbW1lbnRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChuZXdWYWx1ZS5sZW5ndGgoKSA+IDAgJiYgaW5wdXQgaW5zdGFuY2VvZiBDb21tZW50KSB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gKENvbW1lbnQpIGlucHV0OwotCQkJCWNvbW1lbnQuc2V0VGV4dChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxHcm91cFNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhODhkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsR3JvdXBTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTRVFVRU5DRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfU0VRVUVOQ0U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ0hPSUNFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9DSE9JQ0U7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTU9ERUxfR1JPVVAgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX01PREVMX0dST1VQOwotCi0JcHJpdmF0ZSBDQ29tYm8gbW9kZWxHcm91cENvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gbW9kZWxHcm91cENvbWJvVmFsdWVzID0ge1NFUVVFTkNFLCBDSE9JQ0V9OwotCXByaXZhdGUgRm9udE1ldHJpY3MgZkZvbnRNZXRyaWNzOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBNT0RFTF9HUk9VUCk7Ci0JCWluaXRpYWxpemVGb250TWV0cmljcyhjTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoY0xhYmVsLmdldFRleHQoKSk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQltb2RlbEdyb3VwQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQltb2RlbEdyb3VwQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbW9kZWxHcm91cENvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQltb2RlbEdyb3VwQ29tYm8uc2V0SXRlbXMobW9kZWxHcm91cENvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCQlDTUdyb3VwTm9kZSBub2RlID0gKENNR3JvdXBOb2RlKSBpbnB1dDsKLQkJCQljaGFyIG1vZGVsVHlwZSA9IG5vZGUuZ2V0Q29ubmVjdG9yKCk7Ci0JCQkJaWYgKENNR3JvdXBOb2RlLkNIT0lDRSA9PSBtb2RlbFR5cGUpCi0JCQkJCW1vZGVsR3JvdXBDb21iby5zZXRUZXh0KENIT0lDRSk7Ci0JCQkJZWxzZSBpZiAoQ01Hcm91cE5vZGUuU0VRVUVOQ0UgPT0gbW9kZWxUeXBlKQotCQkJCQltb2RlbEdyb3VwQ29tYm8uc2V0VGV4dChTRVFVRU5DRSk7Ci0JCQl9Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IG1vZGVsR3JvdXBDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJQ01Hcm91cE5vZGUgbm9kZSA9IChDTUdyb3VwTm9kZSkgaW5wdXQ7Ci0JCQkJaWYgKENIT0lDRS5lcXVhbHMobW9kZWxHcm91cENvbWJvLmdldFRleHQoKSkpCi0JCQkJCW5vZGUuc2V0Q29ubmVjdG9yKENNR3JvdXBOb2RlLkNIT0lDRSk7Ci0JCQkJZWxzZSBpZiAoU0VRVUVOQ0UuZXF1YWxzKG1vZGVsR3JvdXBDb21iby5nZXRUZXh0KCkpKQotCQkJCQlub2RlLnNldENvbm5lY3RvcihDTUdyb3VwTm9kZS5TRVFVRU5DRSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbml0aWxpemUgZm9udCBtZXRyaWNzCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgbGFiZWwgd2lkdGgKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldExhYmVsV2lkdGgoU3RyaW5nIGxhYmVsVGV4dCkgewotCQlpbnQgbGFiZWxXaWR0aCA9IDk4OwotCi0JCWludCBwaXhlbHMgPSBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgbGFiZWxUZXh0Lmxlbmd0aCgpICsgNSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwaXhlbHMsIGxhYmVsV2lkdGgpOwotCQlyZXR1cm4gbGFiZWxXaWR0aDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lRmlsdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZUZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTUwYmZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLQotcHVibGljIGNsYXNzIENvbnRlbnRNb2RlbE5hbWVGaWx0ZXIgaW1wbGVtZW50cyBJRmlsdGVyIHsKLQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoT2JqZWN0IHRvVGVzdCkgewotCQlyZXR1cm4gdG9UZXN0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUgJiYgISgoQ01CYXNpY05vZGUpIHRvVGVzdCkuaXNSb290RWxlbWVudENvbnRlbnQoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsTmFtZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQ2OTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxOYW1lU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxOYW1lU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09OVEVOVF9NT0RFTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfQ09OVEVOVF9NT0RFTDsKLQotCXByaXZhdGUgQ0NvbWJvIHR5cGVDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIHR5cGVDb21ib1ZhbHVlcyA9IHtDTU5vZGUuUENEQVRBfTsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBjTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgQ09OVEVOVF9NT0RFTCk7Ci0JCWluaXRpYWxpemVGb250TWV0cmljcyhjTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoY0xhYmVsLmdldFRleHQoKSk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdHlwZUNvbWJvLnNldEl0ZW1zKHR5cGVDb21ib1ZhbHVlcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQl0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuUENEQVRBKTsKLQkJCQkvLyBOb2RlTGlzdCBsaXN0ID0KLQkJCQkvLyAoKENNQmFzaWNOb2RlKWZJbnB1dCkuZ2V0RFRERmlsZSgpLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpOwotCQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gKChDTUJhc2ljTm9kZSkgaW5wdXQpLmdldERUREZpbGUoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJYm9vbGVhbiBpc0ZvclJvb3RDb250ZW50ID0gKChDTUJhc2ljTm9kZSkgaW5wdXQpLmlzUm9vdEVsZW1lbnRDb250ZW50KCk7Ci0JCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlcmF0b3IubmV4dCgpOwotCQkJCQlpZiAoIWlzRm9yUm9vdENvbnRlbnQgJiYgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKG5vZGUuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBFbnRpdHkgJiYgKChFbnRpdHkpIG5vZGUpLmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKCIlIiArIG5vZGUuZ2V0TmFtZSgpICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCi0JCQkJdHlwZUNvbWJvLnNldFRleHQoKChDTUJhc2ljTm9kZSkgaW5wdXQpLmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCUNNQmFzaWNOb2RlIG5vZGUgPSAoQ01CYXNpY05vZGUpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJLy8gaWYgKENNTm9kZS5QQ0RBVEEuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQlub2RlLnNldE5hbWUoc2VsZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZkYWM4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vQ29udGVudE1vZGVsVHlwZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotCi1wdWJsaWMgY2xhc3MgQ29udGVudE1vZGVsVHlwZUZpbHRlciBpbXBsZW1lbnRzIElGaWx0ZXIgewotCXB1YmxpYyBib29sZWFuIHNlbGVjdChPYmplY3QgdG9UZXN0KSB7Ci0JCWlmICh0b1Rlc3QgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSAmJiAhKChDTUJhc2ljTm9kZSkgdG9UZXN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0b1Rlc3QgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSAmJiAoKENNR3JvdXBOb2RlKSB0b1Rlc3QpLmlzUm9vdEVsZW1lbnRDb250ZW50KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Db250ZW50TW9kZWxUeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliODRjNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0NvbnRlbnRNb2RlbFR5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNQmFzaWNOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxUeXBlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9DT05URU5UX1RZUEU7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7Q01Ob2RlLkFOWSwgQ01Ob2RlLkVNUFRZLCBDTU5vZGUuUENEQVRBLCBDTU5vZGUuQ0hJTERSRU4sIENNTm9kZS5NSVhFRH07Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIENPTlRFTlRfVFlQRSk7Ci0JCWluaXRpYWxpemVGb250TWV0cmljcyhjTGFiZWwpOwotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoY0xhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQl0eXBlQ29tYm8gPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0NvbWJvKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl0eXBlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdHlwZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQl0eXBlQ29tYm8uc2V0SXRlbXModHlwZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQl0eXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuQU5ZKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5FTVBUWSk7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuUENEQVRBKTsKLQkJCQl0eXBlQ29tYm8uYWRkKENNTm9kZS5DSElMRFJFTik7Ci0JCQkJdHlwZUNvbWJvLmFkZChDTU5vZGUuTUlYRUQpOwotCi0JCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSAoKENNTm9kZSkgaW5wdXQpLmdldERUREZpbGUoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJU3RyaW5nIG5vZGVOYW1lID0gbnVsbDsKLQkJCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCW5vZGVOYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQkJCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCAmJiB0eXBlQ29tYm8uaW5kZXhPZihub2RlTmFtZSkgPT0gLTEpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKG5vZGVOYW1lKTsKLQkJCQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIEVudGl0eSAmJiAoKEVudGl0eSkgbm9kZSkuaXNQYXJhbWV0ZXJFbnRpdHkoKSAmJiB0eXBlQ29tYm8uaW5kZXhPZihub2RlTmFtZSkgPT0gLTEpCi0JCQkJCQl0eXBlQ29tYm8uYWRkKCIlIiArIG5vZGVOYW1lICsgIjsiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKENNR3JvdXBOb2RlKSBpbnB1dCkuZ2V0VHlwZSgpKTsKLQkJCQllbHNlIGlmIChpbnB1dCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKENNQmFzaWNOb2RlKSBpbnB1dCkuZ2V0VHlwZSgpKTsKLQkJCX0KLQkJfSAvLyBlbmQgaWYgKGZJbnB1dCAhPSBudWxsKQotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIENNR3JvdXBOb2RlIHx8IGlucHV0IGluc3RhbmNlb2YgQ01CYXNpY05vZGUpIHsKLQkJCQlDTU5vZGUgbm9kZSA9IChDTU5vZGUpIGlucHV0OwotCQkJCVN0cmluZyBzZWxlY3RlZCA9IHR5cGVDb21iby5nZXRUZXh0KCk7Ci0JCQkJaWYgKENNTm9kZS5NSVhFRC5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldE1peGVkQ29udGVudCgpOwotCQkJCWVsc2UgaWYgKENNTm9kZS5DSElMRFJFTi5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldENoaWxkcmVuQ29udGVudCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQllbHNlIGlmIChDTU5vZGUuRU1QVFkuZXF1YWxzKHNlbGVjdGVkKSB8fCBDTU5vZGUuQU5ZLmVxdWFscyhzZWxlY3RlZCkgfHwgQ01Ob2RlLlBDREFUQS5lcXVhbHMoc2VsZWN0ZWQpKQotCQkJCQlub2RlLnNldENvbnRlbnQoc2VsZWN0ZWQpOwotCQkJCWVsc2UKLQkJCQkJbm9kZS5zZXRDaGlsZHJlbkNvbnRlbnQoc2VsZWN0ZWQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREU2VjdGlvbkxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQzN2FjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWN0aW9uTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNR3JvdXBOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTVJlcGVhdGFibGVOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Db21tZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBEVERTZWN0aW9uTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyI2dldEltYWdlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSW1hZ2UgcmVzdWx0ID0gbnVsbDsKLQotCQlPYmplY3Qgc2VsZWN0ZWQgPSBvYmplY3Q7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJc2VsZWN0ZWQgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBvYmplY3QpLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiBudWxsOyAvLyAoKERUREZpbGUpIHNlbGVjdGVkKS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuICgoRFRETm9kZSkgc2VsZWN0ZWQpLmdldEltYWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBvcmcudzNjLmRvbS5FbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsIHx8IG9iamVjdC5lcXVhbHMoU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWSkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJT2JqZWN0IHNlbGVjdGVkID0gb2JqZWN0OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCXNlbGVjdGVkID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgb2JqZWN0KS5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCi0JCWlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCXJldHVybiAoKERUREZpbGUpIHNlbGVjdGVkKS5nZXROYW1lKCk7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJaWYgKCgoQ01CYXNpY05vZGUpIHNlbGVjdGVkKS5pc1JlZmVyZW5jZSgpKQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX1BST1BFUlRJRVNfVklFV19USVRMRV9FTEVNRU5UX1JFRjsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChDTUJhc2ljTm9kZSkgc2VsZWN0ZWQpLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpIHsKLQkJCUNNUmVwZWF0YWJsZU5vZGUgbm9kZSA9IChDTVJlcGVhdGFibGVOb2RlKSBzZWxlY3RlZDsKLQkJCVN0cmluZyBuYW1lID0gbm9kZS5nZXROYW1lKCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNR3JvdXBOb2RlKSB7Ci0JCQkJaWYgKCgoQ01Hcm91cE5vZGUpIG5vZGUpLmdldENvbm5lY3RvcigpID09IENNR3JvdXBOb2RlLkNIT0lDRSkKLQkJCQkJbmFtZSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8wOwotCQkJCWVsc2UKLQkJCQkJbmFtZSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl8xOwotCQkJfQotCQkJY2hhciBvY2N1cnJlbmNlID0gbm9kZS5nZXRPY2N1cnJlbmNlKCk7Ci0JCQlzd2l0Y2ggKG9jY3VycmVuY2UpIHsKLQkJCQljYXNlIENNUmVwZWF0YWJsZU5vZGUuT05DRSA6Ci0JCQkJCW5hbWUgKz0gIiBbMS4uMV0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5PUFRJT05BTCA6Ci0JCQkJCW5hbWUgKz0gIiBbMC4uMV0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSA6Ci0JCQkJCW5hbWUgKz0gIiBbMS4uKl0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUgOgotCQkJCQluYW1lICs9ICIgWzAuLipdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBuYW1lOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRWxlbWVudCkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzY7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkKLQkJCQlyZXR1cm4gRFREUHJvcGVydGllc01lc3NhZ2VzLkRURFNlY3Rpb25MYWJlbFByb3ZpZGVyXzc7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpCi0JCQkJcmV0dXJuIERURFByb3BlcnRpZXNNZXNzYWdlcy5EVERTZWN0aW9uTGFiZWxQcm92aWRlcl84OwotCQkJZWxzZSBpZiAoc2VsZWN0ZWQgaW5zdGFuY2VvZiBDb21tZW50KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfOTsKLQkJCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2YgRW50aXR5KQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTA7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIE5vdGF0aW9uKQotCQkJCXJldHVybiBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuRFREU2VjdGlvbkxhYmVsUHJvdmlkZXJfMTE7Ci0JCQllbHNlIGlmIChzZWxlY3RlZCBpbnN0YW5jZW9mIFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZSkKLQkJCQkvLyByZXR1cm4gInBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIjsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gKChEVEROb2RlKSBzZWxlY3RlZCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKHNlbGVjdGVkIGluc3RhbmNlb2Ygb3JnLnczYy5kb20uRWxlbWVudCkgewotCQkJcmV0dXJuICgob3JnLnczYy5kb20uRWxlbWVudCkgc2VsZWN0ZWQpLmdldExvY2FsTmFtZSgpOwotCQl9Ci0JCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlCi0JCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9EVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMTUzMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZW1mLkRURFJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci0KLS8qKgotICogRXh0ZW5kIHRoZSBiYXNlIHdpemFyZCB0byBzZWxlY3QgYSBmaWxlIGZyb20gdGhlIHByb2plY3Qgb3Igb3V0c2lkZSB0aGUKLSAqIHdvcmtiZW5jaCBhbmQgYWRkIGVycm9yIGhhbmRsaW5nCi0gKi8KLWNsYXNzIERURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkIGV4dGVuZHMgV2l6YXJkIGltcGxlbWVudHMgSU5ld1dpemFyZCB7Ci0JRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZmlsZVBhZ2U7Ci0KLQlJRmlsZSByZXN1bHRGaWxlOwotCi0JcHVibGljIERURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkKFN0cmluZyB0aXRsZSwgU3RyaW5nIGRlc2MsIFZpZXdlckZpbHRlciBmaWx0ZXIsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlzdXBlcigpOwotCQlzZXRXaW5kb3dUaXRsZSh0aXRsZSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIERURFJlc291cmNlLk5FV0RURCkpOwotCi0JCS8vIFNlbGVjdCBGaWxlIFBhZ2UKLQkJZmlsZVBhZ2UgPSBuZXcgRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKSwgc2VsZWN0aW9uLCB0cnVlKTsKLQkJZmlsZVBhZ2Uuc2V0VGl0bGUodGl0bGUpOwotCQlmaWxlUGFnZS5zZXREZXNjcmlwdGlvbihkZXNjKTsKLQkJZmlsZVBhZ2UuYWRkRmlsdGVyKGZpbHRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJYWRkUGFnZShmaWxlUGFnZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRmluaXNoKCkgewotCQlyZXR1cm4gZmlsZVBhZ2UuaXNQYWdlQ29tcGxldGUoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlyZXN1bHRGaWxlID0gZmlsZVBhZ2UuZ2V0RmlsZSgpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGUgZ2V0UmVzdWx0RmlsZSgpIHsKLQkJcmV0dXJuIHJlc3VsdEZpbGU7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IERURCBGaWxlCi0JICovCi0JY2xhc3MgRFREU2VsZWN0U2luZ2xlRmlsZVBhZ2UgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlUGFnZSB7Ci0JCXB1YmxpYyBEVERTZWxlY3RTaW5nbGVGaWxlUGFnZShJV29ya2JlbmNoIHcsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiwgYm9vbGVhbiBpc0ZpbGVNYW5kYXRvcnkpIHsKLQkJCXN1cGVyKHcsIHNlbGVjdGlvbiwgaXNGaWxlTWFuZGF0b3J5KTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJcmV0dXJuIHN1cGVyLmlzUGFnZUNvbXBsZXRlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREVHlwZU1hcHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RURFR5cGVNYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlMzVkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRFREVHlwZU1hcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUeXBlTWFwcGVyOwotCi1wdWJsaWMgY2xhc3MgRFREVHlwZU1hcHBlciBpbXBsZW1lbnRzIElUeXBlTWFwcGVyIHsKLQlwdWJsaWMgRFREVHlwZU1hcHBlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgbWFwVHlwZShPYmplY3Qgb2JqZWN0KSB7Ci0JCXJldHVybiBvYmplY3QuZ2V0Q2xhc3MoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRTZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRG9jdW1lbnRTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzIwZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0RvY3VtZW50U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ29tbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLQotcHVibGljIGNsYXNzIERvY3VtZW50U2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBUZXh0IGNvbW1lbnRUZXh0OwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJY29tbWVudFRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChjb21wb3NpdGUsICIiLCBTV1QuTVVMVEkgfCBTV1QuTk9ORSk7IC8vJE5PTi1OTFMtMSQKLQkJY29tbWVudFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbW1lbnRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC52aWV3LklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jcmVmcmVzaCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJY29tbWVudFRleHQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJY29tbWVudFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlDb21tZW50IGNvbW1lbnQgPSBnZXRDb21tZW50Tm9kZSgoRFRETm9kZSkgaW5wdXQpOwotCQkJCWlmIChjb21tZW50ICE9IG51bGwpCi0JCQkJCWNvbW1lbnRUZXh0LnNldFRleHQoY29tbWVudC5nZXRUZXh0KCkpOwotCQkJfQotCQl9Ci0JCXNldExpc3RlbmVyRW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBjb21tZW50VGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJQ29tbWVudCBjb21tZW50ID0gZ2V0Q29tbWVudE5vZGUoKERURE5vZGUpIGlucHV0KTsKLQkJCQlpZiAoY29tbWVudCAhPSBudWxsKQotCQkJCQljb21tZW50LnNldFRleHQobmV3VmFsdWUpOwotCQkJCWVsc2UgewotCQkJCQkvLyBDcmVhdGUgYSBuZXcgY29tbWVudCBub2RlLgotCQkJCQkoKERURE5vZGUpIGlucHV0KS5nZXREVERGaWxlKCkuY3JlYXRlQ29tbWVudCgoRFRETm9kZSkgaW5wdXQsIG5ld1ZhbHVlLCBmYWxzZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIENvbW1lbnQgZ2V0Q29tbWVudE5vZGUoRFRETm9kZSBub2RlKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gbm9kZS5nZXREVERGaWxlKCkuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOwotCQlEVEROb2RlIGN1cnJlbnROb2RlID0gbnVsbDsKLQkJRFRETm9kZSBwcmV2Tm9kZSA9IG51bGw7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCWN1cnJlbnROb2RlID0gKERURE5vZGUpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChub2RlID09IGN1cnJlbnROb2RlICYmIHByZXZOb2RlICE9IG51bGwgJiYgcHJldk5vZGUgaW5zdGFuY2VvZiBDb21tZW50KQotCQkJCXJldHVybiAoQ29tbWVudCkgcHJldk5vZGU7Ci0JCQllbHNlCi0JCQkJcHJldk5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbXB0eVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbXB0eVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhmNDI5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW1wdHlTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgRW1wdHlTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmRvSGFuZGxlRXZlbnQoZXZlbnQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzdXBlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQkKLQlwdWJsaWMgaW50IGdldE1pbmltdW1IZWlnaHQoKSB7Ci0JCXJldHVybiAwOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vRW50aXR5VHlwZVNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjY3NmUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlUeXBlU2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5VHlwZVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVOVElUWV9UWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9FTlRJVFlfVFlQRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBFWFRFUk5BTF9FTlRJVFkgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VYVEVSTkFMX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQQVJBTUVURVIgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BBUkFNRVRFUl9FTlRJVFk7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VORVJBTCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfR0VORVJBTF9FTlRJVFk7Ci0KLQlwcml2YXRlIENDb21ibyB0eXBlQ29tYm87Ci0JcHJpdmF0ZSBTdHJpbmdbXSB0eXBlQ29tYm9WYWx1ZXMgPSB7UEFSQU1FVEVSLCBHRU5FUkFMfTsKLQlwcml2YXRlIEJ1dHRvbiBjaGVja0JveDsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0V4dGVybmFsRW50aXR5ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIEVOVElUWV9UWVBFKTsKLQkJaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKGNMYWJlbCk7Ci0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aChjTGFiZWwuZ2V0VGV4dCgpKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCi0JCWNoZWNrQm94ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihjb21wb3NpdGUsIEVYVEVSTkFMX0VOVElUWSwgU1dULkNIRUNLKTsKLQkJbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoY2hlY2tCb3guZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCg5NSwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQljaGVja0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJaWYgKGVudGl0eS5pc1BhcmFtZXRlckVudGl0eSgpKQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChQQVJBTUVURVIpOwotCQkJCWVsc2UKLQkJCQkJdHlwZUNvbWJvLnNldFRleHQoR0VORVJBTCk7Ci0KLQkJCQlpZiAoZW50aXR5LmlzRXh0ZXJuYWxFbnRpdHkoKSkgewotCQkJCQljaGVja0JveC5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQkJCWlzRXh0ZXJuYWxFbnRpdHkgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY2hlY2tCb3guc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gdHlwZUNvbWJvKSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IG5vZGUgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlTdHJpbmcgc2VsZWN0ZWQgPSB0eXBlQ29tYm8uZ2V0VGV4dCgpOwotCQkJCWlmIChQQVJBTUVURVIuZXF1YWxzKHNlbGVjdGVkKSkKLQkJCQkJbm9kZS5zZXRQYXJhbWV0ZXJFbnRpdHkodHJ1ZSk7Ci0JCQkJZWxzZQotCQkJCQlub2RlLnNldFBhcmFtZXRlckVudGl0eShmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gY2hlY2tCb3gpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgbm9kZSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWJvb2xlYW4gc2VsZWN0ZWQgPSBjaGVja0JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoc2VsZWN0ZWQpIHsKLQkJCQkJbm9kZS5zZXRFeHRlcm5hbEVudGl0eSh0cnVlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IHRydWU7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlub2RlLnNldEV4dGVybmFsRW50aXR5KGZhbHNlKTsKLQkJCQkJaXNFeHRlcm5hbEVudGl0eSA9IGZhbHNlOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWxpemUgZm9udCBtZXRyaWNzCi0JICogCi0JICogQHBhcmFtIGNvbnRyb2wKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKENvbnRyb2wgY29udHJvbCkgewotCQlHQyBnYyA9IG5ldyBHQyhjb250cm9sKTsKLQkJZ2Muc2V0Rm9udChjb250cm9sLmdldEZvbnQoKSk7Ci0JCWZGb250TWV0cmljcyA9IGdjLmdldEZvbnRNZXRyaWNzKCk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgYXBwcm9wcmlhdGUgbGFiZWwgd2lkdGgKLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWxUZXh0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgaW50IGdldExhYmVsV2lkdGgoU3RyaW5nIGxhYmVsVGV4dCkgewotCQlpbnQgbGFiZWxXaWR0aCA9IDk4OwotCi0JCWludCBwaXhlbHMgPSBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZGb250TWV0cmljcywgbGFiZWxUZXh0Lmxlbmd0aCgpICsgNSk7Ci0JCWxhYmVsV2lkdGggPSBNYXRoLm1heChwaXhlbHMsIGxhYmVsV2lkdGgpOwotCQlyZXR1cm4gbGFiZWxXaWR0aDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVZhbHVlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL0VudGl0eVZhbHVlU2VjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWRlMDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9FbnRpdHlWYWx1ZVNlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJvcGVydGllcy5zZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNMYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLklUYWJiZWRQcm9wZXJ0eUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRW50aXR5VmFsdWVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBWQUxVRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNZU1RFTV9JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEOwotCi0JcHJpdmF0ZSBUZXh0IHZhbHVlVGV4dDsKLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwcml2YXRlIENMYWJlbCB2YWx1ZUxhYmVsOwotCXByaXZhdGUgQ0xhYmVsIHB1YmxpY0lkTGFiZWw7Ci0JcHJpdmF0ZSBDTGFiZWwgc3lzdGVtSWRMYWJlbDsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSB2YWx1ZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRWYWx1ZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IHB1YmxpY0lkVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IHB1YmxpY0lkVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFB1YmxpY0lEKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gc3lzdGVtSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gc3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0U3lzdGVtSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJdmFsdWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBWQUxVRSk7Ci0JCWluaXRpYWxpemVGb250TWV0cmljcyh2YWx1ZUxhYmVsKTsKLQkJaW50IGxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKHZhbHVlTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCXZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBFbnRpdHkgVmFsdWUKLQkJdmFsdWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodmFsdWVMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHZhbHVlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQl2YWx1ZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdmFsdWVUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXB1YmxpY0lkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgUFVCTElDX0lEKTsKLQkJbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgocHVibGljSWRMYWJlbC5nZXRUZXh0KCkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCh2YWx1ZUxhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXB1YmxpY0lkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBQdWJsaWMgSUQKLQkJcHVibGljSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHVibGljSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCXN5c3RlbUlkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGNvbXBvc2l0ZSwgU1lTVEVNX0lEKTsKLQkJbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoc3lzdGVtSWRMYWJlbC5nZXRUZXh0KCkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCArSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCXN5c3RlbUlkTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBTeXN0ZW0gSUQKLQkJc3lzdGVtSWRUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlzeXN0ZW1JZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCWlmIChpc0V4dGVybmFsRW50aXR5KCkpIHsKLQkJCXZhbHVlTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQl2YWx1ZVRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlwdWJsaWNJZExhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQlwdWJsaWNJZFRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXN5c3RlbUlkTGFiZWwuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXN5c3RlbUlkVGV4dC5zZXRWaXNpYmxlKHRydWUpOwotCi0JCQlwdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJcHVibGljSWRUZXh0LnNldFRleHQoKGVudGl0eSkuZ2V0UHVibGljSUQoKSk7Ci0JCQkJc3lzdGVtSWRUZXh0LnNldFRleHQoKGVudGl0eSkuZ2V0U3lzdGVtSUQoKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZUxhYmVsLnNldFZpc2libGUodHJ1ZSk7Ci0JCQl2YWx1ZVRleHQuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCXB1YmxpY0lkTGFiZWwuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlwdWJsaWNJZFRleHQuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQlzeXN0ZW1JZExhYmVsLnNldFZpc2libGUoZmFsc2UpOwotCQkJc3lzdGVtSWRUZXh0LnNldFZpc2libGUoZmFsc2UpOwotCi0JCQl2YWx1ZVRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChpbnB1dCAhPSBudWxsICYmIGlucHV0IGluc3RhbmNlb2YgRW50aXR5KQotCQkJCXZhbHVlVGV4dC5zZXRUZXh0KCgoRW50aXR5KSBpbnB1dCkuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklTZWN0aW9uI3Nob3VsZFVzZUV4dHJhU3BhY2UoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFVzZUV4dHJhU3BhY2UoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFeHRlcm5hbEVudGl0eSgpIHsKLQkJcmV0dXJuIEVudGl0eVR5cGVTZWN0aW9uLmlzRXh0ZXJuYWxFbnRpdHk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlsaXplIGZvbnQgbWV0cmljcwotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb250TWV0cmljcyhDb250cm9sIGNvbnRyb2wpIHsKLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0JCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCQlmRm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGxhYmVsIHdpZHRoCi0JICogCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRMYWJlbFdpZHRoKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJaW50IGxhYmVsV2lkdGggPSA5ODsKLQotCQlpbnQgcGl4ZWxzID0gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGxhYmVsVGV4dC5sZW5ndGgoKSArIDUpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocGl4ZWxzLCBsYWJlbFdpZHRoKTsKLQkJcmV0dXJuIGxhYmVsV2lkdGg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9OYW1lU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2YjMzMDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05hbWVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBOYW1lU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTkFNRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRTsKLQlwcml2YXRlIFRleHQgbmFtZVRleHQ7Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQlwdWJsaWMgdm9pZCBkb0hhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC53aWRnZXQgPT0gbmFtZVRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBuYW1lVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAobmV3VmFsdWUubGVuZ3RoKCkgPiAwICYmIGlucHV0IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJCURURE5vZGUgZHRkTm9kZSA9IChEVEROb2RlKSBpbnB1dDsKLQkJCQlkdGROb2RlLnNldE5hbWUobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJRm9ybURhdGEgZGF0YTsKLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIG5hbWVMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBOQU1FKTsKLQkJaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKG5hbWVMYWJlbCk7Ci0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aChuYW1lTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoY29tcG9zaXRlLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobmFtZUxhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJbmFtZVRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbmFtZVRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJLy8gbGlzdGVuZXIuc3RhcnRMaXN0ZW5pbmdGb3JFbnRlcihuYW1lVGV4dCk7Ci0JCS8vIGxpc3RlbmVyLnN0YXJ0TGlzdGVuaW5nVG8obmFtZVRleHQpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCXNldExpc3RlbmVyRW5hYmxlZChmYWxzZSk7Ci0JCW5hbWVUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCW5hbWVUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBEVEROb2RlKQotCQkJCW5hbWVUZXh0LnNldFRleHQoKChEVEROb2RlKSBpbnB1dCkuZ2V0TmFtZSgpKTsKLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmV3RW50aXR5U2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL05ld0VudGl0eVNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZhZmIyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTmV3RW50aXR5U2VjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLnNlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0NvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQ0xhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMudGFiYmVkLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5SZXNvdXJjZUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIE5ld0VudGl0eVNlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdFNlY3Rpb24gewotCXByaXZhdGUgZmluYWwgU3RyaW5nIE5BTUUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX05BTUU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgRU5USVRZX1RZUEUgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX0VOVElUWV9UWVBFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0VOVElUWSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRVhURVJOQUxfRU5USVRZOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBBUkFNRVRFUiA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUEFSQU1FVEVSX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBHRU5FUkFMID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9HRU5FUkFMX0VOVElUWTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBWQUxVRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfRU5USVRZX1ZBTFVFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNZU1RFTV9JRCA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfU1lTVEVNX0lEOwotCi0JcHJpdmF0ZSBUZXh0IHN5c3RlbUlkVGV4dDsKLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBuYW1lVGV4dDsKLQlwcml2YXRlIEJ1dHRvbiB3aXphcmRCdXR0b247Ci0KLQlwcml2YXRlIFRleHQgZW50aXR5VmFsdWVUZXh0OwotCXByaXZhdGUgQnV0dG9uIGNoZWNrQm94OwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge1BBUkFNRVRFUiwgR0VORVJBTH07Ci0JcHJpdmF0ZSBQYWdlQm9vayBwYWdlQm9vazsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLklUYWJiZWRQcm9wZXJ0eVNlY3Rpb24jY3JlYXRlQ29udHJvbHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLlRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5KQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQsIFRhYmJlZFByb3BlcnR5U2hlZXRXaWRnZXRGYWN0b3J5IGZhY3RvcnkpIHsKLQkJc3VwZXIuY3JlYXRlQ29udHJvbHMocGFyZW50LCBmYWN0b3J5KTsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVGbGF0Rm9ybUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCWNyZWF0ZUVudGl0eUNvbW1vbkNvbXBvc2l0ZShjb21wb3NpdGUpOwotCi0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKGNvbXBvc2l0ZSwgU1dULkZMQVQpOwotCQlGb3JtRGF0YSBkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlDb21tb25Db21wb3NpdGUsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWNyZWF0ZUV4dGVybmFsRW50aXR5Q29tcG9zaXRlKHBhZ2VCb29rKTsKLQkJY3JlYXRlSW50ZXJuYWxFbnRpdHlDb21wb3NpdGUocGFnZUJvb2spOwotCi0JCXBhZ2VCb29rLnNob3dQYWdlKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBlbnRpdHlDb21tb25Db21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVFbnRpdHlDb21tb25Db21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQllbnRpdHlDb21tb25Db21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWVudGl0eUNvbW1vbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBuYW1lTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgTkFNRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKG5hbWVMYWJlbCk7Ci0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aChuYW1lTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCW5hbWVMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCW5hbWVUZXh0ID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZVRleHQoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkICAgIAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChuYW1lTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQluYW1lVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQluYW1lVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgY0xhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChlbnRpdHlDb21tb25Db21wb3NpdGUsIEVOVElUWV9UWVBFKTsKLQkJbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgoY0xhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KG5hbWVMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBDcmVhdGUgQ2hlY2tib3gKLQkJY2hlY2tCb3ggPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQnV0dG9uKGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgRVhURVJOQUxfRU5USVRZLCBTV1QuQ0hFQ0spOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQljaGVja0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQljaGVja0JveC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBDcmVhdGUgQ0NvbWJvCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oZW50aXR5Q29tbW9uQ29tcG9zaXRlLCBTV1QuRkxBVCB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChjTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFIC0gMik7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY2hlY2tCb3gsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoY0xhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJdHlwZUNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJdHlwZUNvbWJvLnNldEl0ZW1zKHR5cGVDb21ib1ZhbHVlcyk7Ci0JCXR5cGVDb21iby5zZXRUZXh0KFBBUkFNRVRFUik7Ci0KLQkJcmV0dXJuIGVudGl0eUNvbW1vbkNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZTsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUludGVybmFsRW50aXR5Q29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaW50ZXJuYWxFbnRpdHlDb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5Q29tbW9uQ29tcG9zaXRlLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLlZTUEFDRSk7Ci0JCWludGVybmFsRW50aXR5Q29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGVudGl0eVZhbHVlTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGludGVybmFsRW50aXR5Q29tcG9zaXRlLCBWQUxVRSk7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKGVudGl0eVZhbHVlTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWVudGl0eVZhbHVlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQllbnRpdHlWYWx1ZVRleHQgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlVGV4dChpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudChlbnRpdHlWYWx1ZUxhYmVsLCAtSVRhYmJlZFByb3BlcnR5Q29uc3RhbnRzLkhTUEFDRSk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoZW50aXR5VmFsdWVMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCWVudGl0eVZhbHVlVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQllbnRpdHlWYWx1ZVRleHQuc2V0RWRpdGFibGUodHJ1ZSk7Ci0JCWVudGl0eVZhbHVlVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQlyZXR1cm4gaW50ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGU7Ci0KLQlwcml2YXRlIENvbXBvc2l0ZSBjcmVhdGVFeHRlcm5hbEVudGl0eUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWV4dGVybmFsRW50aXR5Q29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGVudGl0eUNvbW1vbkNvbXBvc2l0ZSwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlleHRlcm5hbEVudGl0eUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCUNMYWJlbCBwdWJsaWNJZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgUFVCTElDX0lEKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGFiZWxXaWR0aCA9IGdldExhYmVsV2lkdGgocHVibGljSWRMYWJlbC5nZXRUZXh0KCkpOwotCQlkYXRhID0gbmV3IEZvcm1EYXRhKGxhYmVsV2lkdGgsIFNXVC5ERUZBVUxUKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJcHVibGljSWRMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXB1YmxpY0lkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGV4dGVybmFsRW50aXR5Q29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpY0lkVGV4dC5zZXRFZGl0YWJsZSh0cnVlKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHVibGljSWRUZXh0LmFkZExpc3RlbmVyKFNXVC5Nb2RpZnksIHRoaXMpOwotCi0JCS8vIENyZWF0ZSBsYWJlbCBmaXJzdCB0aGVuIGF0dGFjaCBvdGhlciBjb250cm9sIHRvIGl0Ci0JCS8vIENyZWF0ZSBTeXN0ZW0gSUQgTGFiZWwKLQkJQ0xhYmVsIHN5c3RlbUlkTGFiZWwgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlQ0xhYmVsKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlLCBTWVNURU1fSUQpOyAvLyROT04tTkxTLTEkCi0JCWxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKHN5c3RlbUlkTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlzeXN0ZW1JZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gQ3JlYXRlIFdpemFyZCBCdXR0b24KLQkJd2l6YXJkQnV0dG9uID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUJ1dHRvbihleHRlcm5hbEVudGl0eUNvbXBvc2l0ZSwgIiIsIFNXVC5OT05FKTsgLy8kTk9OLU5MUy0xJAotCQl3aXphcmRCdXR0b24uc2V0SW1hZ2UoQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSwgImljb25zL2Jyb3dzZWJ1dHRvbi5naWYiKS5jcmVhdGVJbWFnZSgpKTsgLy8kTk9OLU5MUy0xJAotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEucmlnaHQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXdpemFyZEJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl3aXphcmRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ3JlYXRlIFN5c3RlbSBJRCBUZXh0Ci0JCXN5c3RlbUlkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGV4dGVybmFsRW50aXR5Q29tcG9zaXRlLCAiIiwgU1dULk5PTkUpOyAvLyROT04tTkxTLTEkCi0JCS8vIHN5c3RlbUlkVGV4dC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCh3aXphcmRCdXR0b24sIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoc3lzdGVtSWRMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeXN0ZW1JZFRleHQuYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0KLQkJcmV0dXJuIGV4dGVybmFsRW50aXR5Q29tcG9zaXRlOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHR5cGVDb21ibykgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBub2RlID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJU3RyaW5nIHNlbGVjdGVkID0gdHlwZUNvbWJvLmdldFRleHQoKTsKLQkJCQlpZiAoUEFSQU1FVEVSLmVxdWFscyhzZWxlY3RlZCkpCi0JCQkJCW5vZGUuc2V0UGFyYW1ldGVyRW50aXR5KHRydWUpOwotCQkJCWVsc2UKLQkJCQkJbm9kZS5zZXRQYXJhbWV0ZXJFbnRpdHkoZmFsc2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGUud2lkZ2V0ID09IGNoZWNrQm94KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IG5vZGUgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQlib29sZWFuIHNlbGVjdGVkID0gY2hlY2tCb3guZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaWYgKHNlbGVjdGVkKSB7Ci0JCQkJCW5vZGUuc2V0RXh0ZXJuYWxFbnRpdHkodHJ1ZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKGV4dGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5vZGUuc2V0RXh0ZXJuYWxFbnRpdHkoZmFsc2UpOwotCQkJCQlwYWdlQm9vay5zaG93UGFnZShpbnRlcm5hbEVudGl0eUNvbXBvc2l0ZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGUud2lkZ2V0ID09IHdpemFyZEJ1dHRvbikgewotCQkJU2hlbGwgc2hlbGwgPSBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQkJSUZpbGUgY3VycmVudElGaWxlID0gKChJRmlsZUVkaXRvcklucHV0KSBnZXRBY3RpdmVFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQlWaWV3ZXJGaWx0ZXIgZmlsdGVyID0gbmV3IFJlc291cmNlRmlsdGVyKG5ldyBTdHJpbmdbXXsiLmR0ZCJ9LCBuZXcgSUZpbGVbXXtjdXJyZW50SUZpbGV9LCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlEVERTZWxlY3RJbmNsdWRlRmlsZVdpemFyZCBmaWxlU2VsZWN0V2l6YXJkID0gbmV3IERURFNlbGVjdEluY2x1ZGVGaWxlV2l6YXJkKERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfRklMRURJQUxPR19TRUxFQ1RfRFRELCBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0ZJTEVESUFMT0dfU0VMRUNUX0RURF9ERVNDLCBmaWx0ZXIsIChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlNlbGVjdGlvbik7Ci0KLQkJCVdpemFyZERpYWxvZyB3aXphcmREaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCBmaWxlU2VsZWN0V2l6YXJkKTsKLQkJCXdpemFyZERpYWxvZy5jcmVhdGUoKTsKLQkJCXdpemFyZERpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWludCByZXN1bHQgPSB3aXphcmREaWFsb2cub3BlbigpOwotCQkJaWYgKHJlc3VsdCA9PSBXaW5kb3cuT0spIHsKLQkJCQlTdHJpbmcgdmFsdWUgPSBzeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQkJCUlGaWxlIHNlbGVjdGVkSUZpbGUgPSBmaWxlU2VsZWN0V2l6YXJkLmdldFJlc3VsdEZpbGUoKTsKLQkJCQlTdHJpbmcgZHRkRmlsZVN0cmluZyA9IHZhbHVlOwotCQkJCWlmIChzZWxlY3RlZElGaWxlICE9IG51bGwpIHsKLQkJCQkJZHRkRmlsZVN0cmluZyA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShzZWxlY3RlZElGaWxlLmdldEZ1bGxQYXRoKCksIGN1cnJlbnRJRmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJCQl9Ci0JCQkJc3lzdGVtSWRUZXh0LnNldFRleHQoZHRkRmlsZVN0cmluZyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQluYW1lVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCW5hbWVUZXh0LnNldFRleHQoZW50aXR5LmdldE5hbWUoKSk7Ci0KLQkJCQlpZiAoZW50aXR5LmlzUGFyYW1ldGVyRW50aXR5KCkpCi0JCQkJCXR5cGVDb21iby5zZXRUZXh0KFBBUkFNRVRFUik7Ci0JCQkJZWxzZQotCQkJCQl0eXBlQ29tYm8uc2V0VGV4dChHRU5FUkFMKTsKLQotCQkJCWlmIChlbnRpdHkuaXNFeHRlcm5hbEVudGl0eSgpKSB7Ci0JCQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoZXh0ZXJuYWxFbnRpdHlDb21wb3NpdGUpOwotCQkJCQlwdWJsaWNJZFRleHQuc2V0VGV4dChlbnRpdHkuZ2V0UHVibGljSUQoKSk7Ci0JCQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KGVudGl0eS5nZXRTeXN0ZW1JRCgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWNoZWNrQm94LnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCQkJCXBhZ2VCb29rLnNob3dQYWdlKGludGVybmFsRW50aXR5Q29tcG9zaXRlKTsKLQkJCQkJZW50aXR5VmFsdWVUZXh0LnNldFRleHQoZW50aXR5LmdldFZhbHVlKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9IYW5kbGVFdmVudChFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQud2lkZ2V0ID09IG5hbWVUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gbmFtZVRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKG5ld1ZhbHVlLmxlbmd0aCgpID4gMCAmJiBpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0TmFtZShuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoZXZlbnQud2lkZ2V0ID09IGVudGl0eVZhbHVlVGV4dCkgewotCQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJCVN0cmluZyBuZXdWYWx1ZSA9IGVudGl0eVZhbHVlVGV4dC5nZXRUZXh0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBFbnRpdHkpIHsKLQkJCQlFbnRpdHkgZW50aXR5ID0gKEVudGl0eSkgaW5wdXQ7Ci0JCQkJZW50aXR5LnNldFZhbHVlKG5ld1ZhbHVlKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChldmVudC53aWRnZXQgPT0gcHVibGljSWRUZXh0KSB7Ci0JCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQkJU3RyaW5nIG5ld1ZhbHVlID0gcHVibGljSWRUZXh0LmdldFRleHQoKTsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEVudGl0eSkgewotCQkJCUVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBpbnB1dDsKLQkJCQllbnRpdHkuc2V0UHVibGljSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBzeXN0ZW1JZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBzeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQkJRW50aXR5IGVudGl0eSA9IChFbnRpdHkpIGlucHV0OwotCQkJCWVudGl0eS5zZXRTeXN0ZW1JRChuZXdWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Ob3RhdGlvblNlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9Ob3RhdGlvblNlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVlMTNlYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vTm90YXRpb25TZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1BdHRhY2htZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREUHJvcGVydGllc01lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgTm90YXRpb25TZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQVUJMSUNfSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1BVQkxJQ19JRDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTWVNURU1fSUQgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX0xBQkVMX1NZU1RFTV9JRDsKLQotCXByaXZhdGUgVGV4dCBwdWJsaWNJZFRleHQ7Ci0JcHJpdmF0ZSBUZXh0IHN5c3RlbUlkVGV4dDsKLQotCXByaXZhdGUgQ0xhYmVsIHB1YmxpY0lkTGFiZWw7Ci0JcHJpdmF0ZSBDTGFiZWwgc3lzdGVtSWRMYWJlbDsKLQlwcml2YXRlIEZvbnRNZXRyaWNzIGZGb250TWV0cmljczsKLQotCXB1YmxpYyB2b2lkIGRvSGFuZGxlRXZlbnQoRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LndpZGdldCA9PSBwdWJsaWNJZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBwdWJsaWNJZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCQlOb3RhdGlvbiBub3RhdGlvbiA9IChOb3RhdGlvbikgaW5wdXQ7Ci0JCQkJbm90YXRpb24uc2V0UHVibGljSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGV2ZW50LndpZGdldCA9PSBzeXN0ZW1JZFRleHQpIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSBzeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQkJaWYgKGlucHV0IGluc3RhbmNlb2YgTm90YXRpb24pIHsKLQkJCQlOb3RhdGlvbiBub3RhdGlvbiA9IChOb3RhdGlvbikgaW5wdXQ7Ci0JCQkJbm90YXRpb24uc2V0U3lzdGVtSUQobmV3VmFsdWUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJcHVibGljSWRMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBQVUJMSUNfSUQpOwotCQlpbml0aWFsaXplRm9udE1ldHJpY3MocHVibGljSWRMYWJlbCk7Ci0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aChwdWJsaWNJZExhYmVsLmdldFRleHQoKSk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlwdWJsaWNJZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gUHVibGljIElECi0JCXB1YmxpY0lkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHB1YmxpY0lkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChwdWJsaWNJZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJcHVibGljSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0lkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlzeXN0ZW1JZExhYmVsID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNMYWJlbChjb21wb3NpdGUsIFNZU1RFTV9JRCk7Ci0JCWxhYmVsV2lkdGggPSBnZXRMYWJlbFdpZHRoKHN5c3RlbUlkTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQocHVibGljSWRMYWJlbCwgK0lUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5WU1BBQ0UpOwotCQlzeXN0ZW1JZExhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gU3lzdGVtIElECi0JCXN5c3RlbUlkVGV4dCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVUZXh0KGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KHN5c3RlbUlkTGFiZWwsIC1JVGFiYmVkUHJvcGVydHlDb25zdGFudHMuSFNQQUNFKTsKLQkJZGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudChzeXN0ZW1JZExhYmVsLCAwLCBTV1QuQ0VOVEVSKTsKLQkJc3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCXN5c3RlbUlkVGV4dC5hZGRMaXN0ZW5lcihTV1QuTW9kaWZ5LCB0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlwdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJTm90YXRpb24gbm90YXRpb24gPSAoTm90YXRpb24pIGlucHV0OwotCQkJcHVibGljSWRUZXh0LnNldFRleHQoKG5vdGF0aW9uKS5nZXRQdWJsaWNJRCgpKTsKLQkJCXN5c3RlbUlkVGV4dC5zZXRUZXh0KChub3RhdGlvbikuZ2V0U3lzdGVtSUQoKSk7Ci0JCX0KLQotCQlzZXRMaXN0ZW5lckVuYWJsZWQodHJ1ZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVNlY3Rpb24jc2hvdWxkVXNlRXh0cmFTcGFjZSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gc2hvdWxkVXNlRXh0cmFTcGFjZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEluaXRpbGl6ZSBmb250IG1ldHJpY3MKLQkgKiAKLQkgKiBAcGFyYW0gY29udHJvbAotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRm9udE1ldHJpY3MoQ29udHJvbCBjb250cm9sKSB7Ci0JCUdDIGdjID0gbmV3IEdDKGNvbnRyb2wpOwotCQlnYy5zZXRGb250KGNvbnRyb2wuZ2V0Rm9udCgpKTsKLQkJZkZvbnRNZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZSBhcHByb3ByaWF0ZSBsYWJlbCB3aWR0aAotCSAqIAotCSAqIEBwYXJhbSBsYWJlbFRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TGFiZWxXaWR0aChTdHJpbmcgbGFiZWxUZXh0KSB7Ci0JCWludCBsYWJlbFdpZHRoID0gOTg7Ci0KLQkJaW50IHBpeGVscyA9IERpYWxvZy5jb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoZkZvbnRNZXRyaWNzLCBsYWJlbFRleHQubGVuZ3RoKCkgKyA1KTsKLQkJbGFiZWxXaWR0aCA9IE1hdGgubWF4KHBpeGVscywgbGFiZWxXaWR0aCk7Ci0JCXJldHVybiBsYWJlbFdpZHRoOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZUZpbHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI1N2UwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjLXByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL3NlY3Rpb24vT2NjdXJyZW5jZUZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01CYXNpY05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNUmVwZWF0YWJsZU5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlRmlsdGVyIGltcGxlbWVudHMgSUZpbHRlciB7Ci0JcHVibGljIGJvb2xlYW4gc2VsZWN0KE9iamVjdCB0b1Rlc3QpIHsKLQkJaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNQmFzaWNOb2RlICYmICgoQ01CYXNpY05vZGUpIHRvVGVzdCkuaXNFbXB0eUFueU9yUENEYXRhKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UgaWYgKHRvVGVzdCBpbnN0YW5jZW9mIENNUmVwZWF0YWJsZU5vZGUpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9PY2N1cnJlbmNlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNDQ5YmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL09jY3VycmVuY2VTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNUmVwZWF0YWJsZU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERQcm9wZXJ0aWVzTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlU2VjdGlvbiBleHRlbmRzIEFic3RyYWN0U2VjdGlvbiB7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT05DRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfT05DRTsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBPTkVfT1JfTU9SRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfT05FX09SX01PUkU7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgT1BUSU9OQUwgPSBEVERQcm9wZXJ0aWVzTWVzc2FnZXMuX1VJX09QVElPTkFMOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFpFUk9fT1JfTU9SRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfWkVST19PUl9NT1JFOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9DQ1VSRU5DRSA9IERURFByb3BlcnRpZXNNZXNzYWdlcy5fVUlfTEFCRUxfT0NDVVJSRU5DRTsKLQotCXByaXZhdGUgQ0NvbWJvIG9jY3VycmVuY2VDb21ibzsKLQlwcml2YXRlIFN0cmluZ1tdIG9jY3VycmVuY2VDb21ib1ZhbHVlcyA9IHtPTkNFLCBPTkVfT1JfTU9SRSwgT1BUSU9OQUwsIFpFUk9fT1JfTU9SRX07Ci0JcHJpdmF0ZSBGb250TWV0cmljcyBmRm9udE1ldHJpY3M7Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI2NyZWF0ZUNvbnRyb2xzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkucHJvcGVydGllcy5pbnRlcm5hbC5wcm92aXNpb25hbC5UYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9scyhDb21wb3NpdGUgcGFyZW50LCBUYWJiZWRQcm9wZXJ0eVNoZWV0V2lkZ2V0RmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2xzKHBhcmVudCwgZmFjdG9yeSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBnZXRXaWRnZXRGYWN0b3J5KCkuY3JlYXRlRmxhdEZvcm1Db21wb3NpdGUocGFyZW50KTsKLQotCQkvLyBDcmVhdGUgbGFiZWwgZmlyc3QgdGhlbiBhdHRhY2ggb3RoZXIgY29udHJvbCB0byBpdAotCQlDTGFiZWwgdXNhZ2VMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBPQ0NVUkVOQ0UpOwotCQlpbml0aWFsaXplRm9udE1ldHJpY3ModXNhZ2VMYWJlbCk7Ci0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aCh1c2FnZUxhYmVsLmdldFRleHQoKSk7Ci0JCUZvcm1EYXRhIGRhdGEgPSBuZXcgRm9ybURhdGEobGFiZWxXaWR0aCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQl1c2FnZUxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJb2NjdXJyZW5jZUNvbWJvID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUNDb21ibyhjb21wb3NpdGUsIFNXVC5GTEFUKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodXNhZ2VMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHVzYWdlTGFiZWwsIDAsIFNXVC5DRU5URVIpOwotCQlvY2N1cnJlbmNlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJb2NjdXJyZW5jZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlvY2N1cnJlbmNlQ29tYm8uc2V0SXRlbXMob2NjdXJyZW5jZUNvbWJvVmFsdWVzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5wcm9wZXJ0aWVzLmludGVybmFsLnByb3Zpc2lvbmFsLnZpZXcuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNyZWZyZXNoKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoKCkgewotCQlzZXRMaXN0ZW5lckVuYWJsZWQoZmFsc2UpOwotCQlPYmplY3QgaW5wdXQgPSBnZXRJbnB1dCgpOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBDTVJlcGVhdGFibGVOb2RlKSB7Ci0JCQljaGFyIG9jY3VyZW5jZSA9ICgoQ01SZXBlYXRhYmxlTm9kZSkgaW5wdXQpLmdldE9jY3VycmVuY2UoKTsKLQkJCWlmIChDTVJlcGVhdGFibGVOb2RlLk9OQ0UgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KE9OQ0UpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSA9PSBvY2N1cmVuY2UpCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT05FX09SX01PUkUpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5PUFRJT05BTCA9PSBvY2N1cmVuY2UpCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT1BUSU9OQUwpOwotCQkJZWxzZSBpZiAoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUgPT0gb2NjdXJlbmNlKQotCQkJCW9jY3VycmVuY2VDb21iby5zZXRUZXh0KFpFUk9fT1JfTU9SRSk7Ci0JCQllbHNlCi0JCQkJb2NjdXJyZW5jZUNvbWJvLnNldFRleHQoT05DRSk7Ci0JCX0KLQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJT2JqZWN0IGlucHV0ID0gZ2V0SW5wdXQoKTsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgQ01SZXBlYXRhYmxlTm9kZSkgewotCQkJc2V0TGlzdGVuZXJFbmFibGVkKGZhbHNlKTsKLQkJCUNNUmVwZWF0YWJsZU5vZGUgbm9kZSA9IChDTVJlcGVhdGFibGVOb2RlKSBpbnB1dDsKLQkJCVN0cmluZyBvY2N1cnJlbmNlID0gb2NjdXJyZW5jZUNvbWJvLmdldFRleHQoKTsKLQkJCWlmIChPTkNFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5PTkNFKTsKLQkJCWVsc2UgaWYgKE9ORV9PUl9NT1JFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5PTkVfT1JfTU9SRSk7Ci0JCQllbHNlIGlmIChPUFRJT05BTC5lcXVhbHMob2NjdXJyZW5jZSkpCi0JCQkJbm9kZS5zZXRPY2N1cnJlbmNlKENNUmVwZWF0YWJsZU5vZGUuT1BUSU9OQUwpOwotCQkJZWxzZSBpZiAoWkVST19PUl9NT1JFLmVxdWFscyhvY2N1cnJlbmNlKSkKLQkJCQlub2RlLnNldE9jY3VycmVuY2UoQ01SZXBlYXRhYmxlTm9kZS5aRVJPX09SX01PUkUpOwotCQkJc2V0TGlzdGVuZXJFbmFibGVkKHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5pdGlsaXplIGZvbnQgbWV0cmljcwotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb250TWV0cmljcyhDb250cm9sIGNvbnRyb2wpIHsKLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0JCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCQlmRm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGxhYmVsIHdpZHRoCi0JICogCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRMYWJlbFdpZHRoKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJaW50IGxhYmVsV2lkdGggPSA5ODsKLQotCQlpbnQgcGl4ZWxzID0gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGxhYmVsVGV4dC5sZW5ndGgoKSArIDUpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocGl4ZWxzLCBsYWJlbFdpZHRoKTsKLQkJcmV0dXJuIGxhYmVsV2lkdGg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMtcHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvc2VjdGlvbi9UeXBlU2VjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVTZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YzA4YzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy1wcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9zZWN0aW9uL1R5cGVTZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb3BlcnRpZXMuc2VjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5DTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLnRhYmJlZC5JVGFiYmVkUHJvcGVydHlDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy50YWJiZWQuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFByb3BlcnRpZXNNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFR5cGVTZWN0aW9uIGV4dGVuZHMgQWJzdHJhY3RTZWN0aW9uIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBUWVBFID0gRFREUHJvcGVydGllc01lc3NhZ2VzLl9VSV9MQUJFTF9UWVBFOwotCi0JcHJpdmF0ZSBDQ29tYm8gdHlwZUNvbWJvOwotCXByaXZhdGUgU3RyaW5nW10gdHlwZUNvbWJvVmFsdWVzID0ge0F0dHJpYnV0ZS5DREFUQSwgQXR0cmlidXRlLklELCBBdHRyaWJ1dGUuSURSRUYsIEF0dHJpYnV0ZS5JRFJFRlMsIEF0dHJpYnV0ZS5FTlRJVFksIEF0dHJpYnV0ZS5FTlRJVElFUywgQXR0cmlidXRlLk5NVE9LRU4sIEF0dHJpYnV0ZS5OTVRPS0VOUywgQXR0cmlidXRlLkVOVU1FUkFURURfTkFNRSwgQXR0cmlidXRlLkVOVU1FUkFURURfTk9UQVRJT059OwotCXByaXZhdGUgRm9udE1ldHJpY3MgZkZvbnRNZXRyaWNzOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVRhYmJlZFByb3BlcnR5U2VjdGlvbiNjcmVhdGVDb250cm9scyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwuVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbHMoQ29tcG9zaXRlIHBhcmVudCwgVGFiYmVkUHJvcGVydHlTaGVldFdpZGdldEZhY3RvcnkgZmFjdG9yeSkgewotCQlzdXBlci5jcmVhdGVDb250cm9scyhwYXJlbnQsIGZhY3RvcnkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gZ2V0V2lkZ2V0RmFjdG9yeSgpLmNyZWF0ZUZsYXRGb3JtQ29tcG9zaXRlKHBhcmVudCk7Ci0JCUZvcm1EYXRhIGRhdGE7Ci0KLQkJLy8gQ3JlYXRlIGxhYmVsIGZpcnN0IHRoZW4gYXR0YWNoIG90aGVyIGNvbnRyb2wgdG8gaXQKLQkJQ0xhYmVsIGNMYWJlbCA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDTGFiZWwoY29tcG9zaXRlLCBUWVBFKTsKLQkJaW5pdGlhbGl6ZUZvbnRNZXRyaWNzKGNMYWJlbCk7Ci0JCWludCBsYWJlbFdpZHRoID0gZ2V0TGFiZWxXaWR0aChjTGFiZWwuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IG5ldyBGb3JtRGF0YShsYWJlbFdpZHRoLCBTV1QuREVGQVVMVCk7Ci0JCWRhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCWNMYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXR5cGVDb21ibyA9IGdldFdpZGdldEZhY3RvcnkoKS5jcmVhdGVDQ29tYm8oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgLUlUYWJiZWRQcm9wZXJ0eUNvbnN0YW50cy5IU1BBQ0UpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGNMYWJlbCwgMCwgU1dULkNFTlRFUik7Ci0JCXR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0eXBlQ29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXR5cGVDb21iby5zZXRJdGVtcyh0eXBlQ29tYm9WYWx1ZXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLnByb3BlcnRpZXMuaW50ZXJuYWwucHJvdmlzaW9uYWwudmlldy5JVGFiYmVkUHJvcGVydHlTZWN0aW9uI3JlZnJlc2goKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0KLQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkKLQkJCQl0eXBlQ29tYm8uc2V0VGV4dCgoKEF0dHJpYnV0ZSkgaW5wdXQpLmdldFR5cGUoKSk7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lciN3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSB0eXBlQ29tYm8pIHsKLQkJCU9iamVjdCBpbnB1dCA9IGdldElucHV0KCk7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlBdHRyaWJ1dGUgYXR0cmlidXRlID0gKEF0dHJpYnV0ZSkgaW5wdXQ7Ci0JCQkJYXR0cmlidXRlLnNldFR5cGUodHlwZUNvbWJvLmdldFRleHQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRVc2VFeHRyYVNwYWNlKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlsaXplIGZvbnQgbWV0cmljcwotCSAqIAotCSAqIEBwYXJhbSBjb250cm9sCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVGb250TWV0cmljcyhDb250cm9sIGNvbnRyb2wpIHsKLQkJR0MgZ2MgPSBuZXcgR0MoY29udHJvbCk7Ci0JCWdjLnNldEZvbnQoY29udHJvbC5nZXRGb250KCkpOwotCQlmRm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lIGFwcHJvcHJpYXRlIGxhYmVsIHdpZHRoCi0JICogCi0JICogQHBhcmFtIGxhYmVsVGV4dAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGludCBnZXRMYWJlbFdpZHRoKFN0cmluZyBsYWJlbFRleHQpIHsKLQkJaW50IGxhYmVsV2lkdGggPSA5ODsKLQotCQlpbnQgcGl4ZWxzID0gRGlhbG9nLmNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhmRm9udE1ldHJpY3MsIGxhYmVsVGV4dC5sZW5ndGgoKSArIDUpOwotCQlsYWJlbFdpZHRoID0gTWF0aC5tYXgocGl4ZWxzLCBsYWJlbFdpZHRoKTsKLQkJcmV0dXJuIGxhYmVsV2lkdGg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUyYzFlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LklEVERQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvck5vT3A7Ci0KLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBhIHNvdXJjZSB2aWV3ZXIgd2hpY2ggc2hvd3MgRFREIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCBleHRlbmRzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiB7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24gYmVjYXVzZSBub3Qgc291cmNldmlld2VyLXNwZWNpZmljIGFuZAotCSAqIGl0J3MgYSBTdHJpbmcgYXJyYXkKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1tdIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBmTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQ7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvck5vb3A7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1tde0lEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxULCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04sIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTn07Ci0JCX0KLQkJcmV0dXJuIGZDb25maWd1cmVkQ29udGVudFR5cGVzOwotCX0KLQotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJTGluZVN0eWxlUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBudWxsOwotCi0JCWlmIChwYXJ0aXRpb25UeXBlID09IElEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxUIHx8IHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckNTUygpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTikgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JOb29wKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9yQ1NTKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9yRFREID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvckRURCA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckRURCgpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQ7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvck5vb3AoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JOb29wID09IG51bGwpIHsKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvck5vb3AgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JOb09wKCk7Ci0JCX0KLQkJcmV0dXJuIGZMaW5lU3R5bGVQcm92aWRlckZvck5vb3A7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9EVERVSU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NzY1NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBEVEQgVUkKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERVSU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFTElTVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9EVERfTk9UQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfRFREX0VOVElUWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9EVERfRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0FERF9EVERfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQUNUSU9OX0RURF9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FDVElPTl9BRERfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fR1JPVVBfQUREX0dST1VQOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9HUk9VUF9JVEVNU19MT0dJQ0FMTFk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0JVVFRPTl9TT1JUX0lURU1TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9BQ1RJT05fQUREX1BBUkFNX0VOVElUWV9SRUY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01PVkVfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NT1ZFX0NPTlRFTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01PVkVfTk9ERTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTU9WRV9OT0RFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfRFREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERUREZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25FcnJvcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERDb2xvclBhZ2VfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9DUkVBVEVfTkVXX0RURF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RURF9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19EVERfRVhQTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlR3JvdXBfbmFtZUV4aXN0czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgRFREVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M3YWIyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkRURFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCS8vIFRoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgRFREVUlQbHVnaW4gcGx1Z2luOwotCQotCS8qKgotCSAqIFRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGR0ZCB1aS4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0KLQkvKioKLQkgKiBUaGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciBkdGQgdWkuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRFREVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB3b3Jrc3BhY2UgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIERURFVJUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGR0ZCBlZGl0b3IgdGVtcGxhdGVzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgZHRkIGVkaXRvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwdWJsaWMgVGVtcGxhdGVTdG9yZSBnZXRUZW1wbGF0ZVN0b3JlKCkgewotCQlpZiAoZlRlbXBsYXRlU3RvcmUgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlU3RvcmUgPSBuZXcgQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZShnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwgRFREVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGR0ZCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgZHRkIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELk5FVyk7Ci0KLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0RURFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ0NzZjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvRFREVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFTElTVD1BZGQgQXR0cmlidXRlICZMaXN0Ci0KLSFEVERPdXRsaW5lcgotX1VJX0FDVElPTl9BRERfRFREX05PVEFUSU9OPUFkZCAmTm90YXRpb24KLV9VSV9BQ1RJT05fQUREX0RURF9FTlRJVFk9QWRkICZFbnRpdHkKLV9VSV9BQ1RJT05fQUREX0RURF9FTEVNRU5UPUFkZCBFbGUmbWVudAotX1VJX0FDVElPTl9BRERfRFREX0NPTU1FTlQ9QWRkICZDb21tZW50Ci1fVUlfQUNUSU9OX0RURF9ERUxFVEU9JkRlbGV0ZQotX1VJX0FDVElPTl9BRERfQVRUUklCVVRFPUFkZCAmQXR0cmlidXRlCi1fVUlfQUNUSU9OX0dST1VQX0FERF9HUk9VUD1BZGQgR3JvdXAgdG8gQ29uJnRlbnQgTW9kZWwKLV9VSV9BQ1RJT05fQUREX0VMRU1FTlQ9QWRkIEVsZW1lbnQgdG8gQyZvbnRlbnQgTW9kZWwKLQotIURURENvbnRlbnRPdXRsaW5lUGFnZQotX1VJX0JVVFRPTl9HUk9VUF9JVEVNU19MT0dJQ0FMTFk9R3JvdXAgaXRlbXMgbG9naWNhbGx5LgotX1VJX0JVVFRPTl9TT1JUX0lURU1TPVNvcnQgaXRlbXMgYWxwaGFiZXRpY2FsbHkuCi0KLSFEVERDb250ZXh0Q29udHJpYnV0ZXIKLV9VSV9BQ1RJT05fQUREX1BBUkFNX0VOVElUWV9SRUY9QWRkICZQYXJhbWV0ZXIgRW50aXR5IFJlZmVyZW5jZQotCi0hRHJhZ0F0dHJpYnV0ZUNvbW1hbmQKLV9VSV9NT1ZFX0FUVFJJQlVURT1Nb3ZlIEF0dHJpYnV0ZQotCi0hRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQKLV9VSV9NT1ZFX0NPTlRFTlQ9TW92ZSBDb250ZW50Ci0KLSFEcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQKLV9VSV9NT1ZFX05PREU9TW92ZSBOb2RlCi1fVUlfTU9WRV9OT0RFUz1Nb3ZlIE5vZGVzCi0KLV9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9EVEQ9VGhlIGZpbGUgbmFtZSBtdXN0IGVuZCBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBleHRlbnNpb25zIHswfS4KLQotI0RURCBGaWxlIHBhZ2UKLUNyZWF0aW5nX2ZpbGVzPUNyZWF0aW5nIGZpbGVzCi1EVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsPUFkZCB0aGlzIHN1ZmZpeCAoaWYgbm90IHNwZWNpZmllZCk6Ci1EVERGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkVycm9yPVN1ZmZpeCBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHswfS4KLQotI0RURCBTdHlsZSBwYWdlCi1EVERDb2xvclBhZ2VfMD08IUVMRU1FTlQgTWFpbiAoT25lLFR3byspPlxyXG48IUVMRU1FTlQgT25lIChUaHJlZSxGb3VyKT5cclxuPCFBVFRMSVNUIE9uZVxyXG4gb25lb25lIENEQVRBICNSRVFVSVJFRFxyXG4+XHJcbjwhLS0gWW91IG5lZWQgdGhpcyAtLT5cclxuPCFFTEVNRU5UIFR3byAobW9yZW1vcmUqKT5cclxuPCFBVFRMSVNUIFR3b1xyXG4gdHdvdHdvIENEQVRBICNSRVFVSVJFRFxyXG4gdHdvdGhyZWUgKGFhYSB8IGJiYikgImFhYSJcclxuPlxyXG4KLURURENvbG9yUGFnZV8xPUNvbW1lbnRzCi1EVERDb2xvclBhZ2VfMj1EYXRhCi1EVERDb2xvclBhZ2VfMz1EZWZhdWx0Ci1EVERDb2xvclBhZ2VfND1LZXl3b3JkcwotRFREQ29sb3JQYWdlXzU9U3RyaW5ncwotRFREQ29sb3JQYWdlXzY9U3ltYm9scwotRFREQ29sb3JQYWdlXzc9VGFnIERlbGltaXRlcnMKLURURENvbG9yUGFnZV84PVRhZyBOYW1lcwotRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA9TmFtZQotRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzE9Q29udGVudHMKLURURFByb3BlcnR5U291cmNlQWRhcHRlcl8yPUF0dHJpYnV0ZXMKLQotISBOZXdEVERXaXphcmQuamF2YQotX1VJX0NSRUFURV9ORVdfRFREX0ZJTEUgICAgICA9IENyZWF0ZSBhIG5ldyBEVEQgZmlsZS4KLV9VSV9XSVpBUkRfTkVXX0RURF9USVRMRSAgICAgPSBDcmVhdGUgRFRECi1fVUlfV0laQVJEX05FV19EVERfRVhQTCAgICAgID0gQ3JlYXRlIGEgbmV3IERURCBmaWxlLiBTcGVjaWZ5IHRoZSBmb2xkZXIgYW5kIG5hbWUgZm9yIHRoZSBmaWxlLgotCi0jIGNvcGllZCBmcm9tIGR0ZCBjb3JlCi1fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFPURlbGV0ZQotIyMKLVJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyA9IFRoZSBzYW1lIG5hbWUgYWxyZWFkeSBleGlzdHMuCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IERURCBUZW1wbGF0ZQotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8xPVNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBpbiB0aGUgRFREIHBhZ2UuCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8zPURlc2NyaXB0aW9uCi1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIERURCBUZW1wbGF0ZQotTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV81PVByZXZpZXc6Ci1OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IERURCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5EVEQgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0KLVNvdXJjZU1lbnVfbGFiZWw9U291cmNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTdiMzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5kdGQudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCQkJaWYgKGJ1bmRsZSAhPSBudWxsKQotCQkJCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RURERyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EVEREcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZlNmY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RURERyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EcmFnQW5kRHJvcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5Ub3BMZXZlbE5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBEVEREcmFnQW5kRHJvcE1hbmFnZXIgaW1wbGVtZW50cyBEcmFnQW5kRHJvcE1hbmFnZXIgewotCi0JcHVibGljIERyYWdBbmREcm9wQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2UpIHsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0KLQkJCWlmIChub2RlIGluc3RhbmNlb2YgVG9wTGV2ZWxOb2RlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2UpOwotCQkJfQotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKLQkJCQlyZXR1cm4gbmV3IERyYWdBdHRyaWJ1dGVDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlKTsKLQkJCX0KLQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQkJcmV0dXJuIG5ldyBEcmFnQ29udGVudE1vZGVsQ29tbWFuZCh0YXJnZXQsIGxvY2F0aW9uLCBvcGVyYXRpb25zLCBvcGVyYXRpb24sIHNvdXJjZSk7Ci0JCQl9Ci0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0F0dHJpYnV0ZUNvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0F0dHJpYnV0ZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2MGVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdBdHRyaWJ1dGVDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLQotCi0KLXB1YmxpYyBjbGFzcyBEcmFnQXR0cmlidXRlQ29tbWFuZCBleHRlbmRzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgewotCi0JcHVibGljIERyYWdBdHRyaWJ1dGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2VzKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuRXhlY3V0ZSgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3Qgc291cmNlID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoIShzb3VyY2UgaW5zdGFuY2VvZiBBdHRyaWJ1dGUpKSB7Ci0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0JCURUREZpbGUgZHRkRmlsZSA9IHJlZmVyZW5jZU5vZGUuZ2V0RFRERmlsZSgpOwotCQlpZiAocmVmZXJlbmNlTm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURFVJTWVzc2FnZXMuX1VJX01PVkVfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQkJQXR0cmlidXRlTGlzdCBhdHRMaXN0ID0gKEF0dHJpYnV0ZUxpc3QpIHJlZmVyZW5jZU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCQlhdHRMaXN0Lmluc2VydEludG9Nb2RlbCh0aGlzLCAoQXR0cmlidXRlKSByZWZlcmVuY2VOb2RlLCAoQXR0cmlidXRlKSBub2RlLCBpc0FmdGVyKCkpOwotCQkJCQlkdGRGaWxlLmRlbGV0ZU5vZGUodGhpcywgbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiMDU3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZG5kL0RyYWdDb250ZW50TW9kZWxDb21tYW5kLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EZWZhdWx0RHJhZ0FuZERyb3BDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUJhc2ljTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIERyYWdDb250ZW50TW9kZWxDb21tYW5kIGV4dGVuZHMgRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZCB7Ci0KLQlwdWJsaWMgRHJhZ0NvbnRlbnRNb2RlbENvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMpIHsKLQkJc3VwZXIodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2VzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBDTU5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyID0gc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKHNvdXJjZSBpbnN0YW5jZW9mIENNTm9kZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJRFRETm9kZSByZWZlcmVuY2VOb2RlID0gKERURE5vZGUpIHRhcmdldDsKLQotCQlpZiAocmVmZXJlbmNlTm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJRFRERmlsZSBkdGRGaWxlID0gcmVmZXJlbmNlTm9kZS5nZXREVERGaWxlKCk7Ci0KLQkJCURURE5vZGUgcGFyZW50ID0gKERURE5vZGUpIHJlZmVyZW5jZU5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIERURFVJTWVzc2FnZXMuX1VJX01PVkVfQ09OVEVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJCWJvb2xlYW4gcGFyZW50SXNFbGVtZW50ID0gZmFsc2U7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSBudWxsOwotCQkJQ01Hcm91cE5vZGUgZ3JvdXAgPSBudWxsOwotCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlwYXJlbnRJc0VsZW1lbnQgPSB0cnVlOwotCQkJCWVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ3JvdXAgPSAoQ01Hcm91cE5vZGUpIHBhcmVudDsKLQkJCX0KLQotCQkJaWYgKGVsZW1lbnQgPT0gbnVsbCAmJiBncm91cCA9PSBudWxsKSB7Ci0JCQkJLy8gbm8gcGFyZW50IHRvIGFkZCB0bwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdGVyLm5leHQoKTsKLQkJCQlpZiAobm9kZSBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCQlpZiAocGFyZW50SXNFbGVtZW50KSB7Ci0JCQkJCQlpZiAoZWxlbWVudC5nZXRDb250ZW50TW9kZWwoKSA9PSBub2RlKSB7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQllbGVtZW50LnJlcGxhY2VDb250ZW50TW9kZWwodGhpcywgKENNTm9kZSkgbm9kZSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocmVmZXJlbmNlTm9kZSA9PSBub2RlIHx8IChpc0FmdGVyKCkgJiYgcmVmZXJlbmNlTm9kZS5nZXROZXh0U2libGluZygpID09IG5vZGUpIHx8ICghaXNBZnRlcigpICYmIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSByZWZlcmVuY2VOb2RlKSkgewotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCi0JCQkJCQlncm91cC5pbnNlcnRJbnRvTW9kZWwodGhpcywgKENNTm9kZSkgcmVmZXJlbmNlTm9kZSwgKENNTm9kZSkgbm9kZSwgaXNBZnRlcigpKTsKLQotCQkJCQl9Ci0JCQkJCURURE5vZGUgbm9kZVBhcmVudCA9IChEVEROb2RlKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJbm9kZVBhcmVudC5kZWxldGUodGhpcywgbm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJfQotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RmVlZGJhY2soKSB7Ci0JCURURE5vZGUgcmVmZXJlbmNlTm9kZSA9IChEVEROb2RlKSB0YXJnZXQ7Ci0JCWlmIChyZWZlcmVuY2VOb2RlIGluc3RhbmNlb2YgQ01Ob2RlKSB7Ci0JCQlDTU5vZGUgY21Ob2RlID0gKENNTm9kZSkgcmVmZXJlbmNlTm9kZTsKLQkJCWlmIChjbU5vZGUuaXNSb290RWxlbWVudENvbnRlbnQoKSAmJiBjbU5vZGUgaW5zdGFuY2VvZiBDTUJhc2ljTm9kZSkgewotCQkJCXJldHVybiBETkQuRkVFREJBQ0tfU0VMRUNUOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEZlZWRiYWNrKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9kbmQvRHJhZ1RvcExldmVsTm9kZXNDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzYzNjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2RuZC9EcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZG5kOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuRGVmYXVsdERyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuVG9wTGV2ZWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIERyYWdUb3BMZXZlbE5vZGVzQ29tbWFuZCBleHRlbmRzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgewotCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIG1vdmVOb2RlID0gRFREVUlNZXNzYWdlcy5fVUlfTU9WRV9OT0RFOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIG1vdmVOb2RlcyA9IERURFVJTWVzc2FnZXMuX1VJX01PVkVfTk9ERVM7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEcmFnVG9wTGV2ZWxOb2Rlc0NvbW1hbmQoT2JqZWN0IHRhcmdldCwgZmxvYXQgbG9jYXRpb24sIGludCBvcGVyYXRpb25zLCBpbnQgb3BlcmF0aW9uLCBDb2xsZWN0aW9uIHNvdXJjZXMpIHsKLQkJc3VwZXIodGFyZ2V0LCBsb2NhdGlvbiwgb3BlcmF0aW9ucywgb3BlcmF0aW9uLCBzb3VyY2VzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5FeGVjdXRlKCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlJdGVyYXRvciBpdGVyID0gc291cmNlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBzb3VyY2UgPSBpdGVyLm5leHQoKTsKLQkJCWlmICghKHNvdXJjZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgZXhlY3V0ZSgpIHsKLQkJRFRETm9kZSByZWZlcmVuY2VOb2RlID0gKERURE5vZGUpIHRhcmdldDsKLQotCQlEVERGaWxlIGR0ZEZpbGUgPSByZWZlcmVuY2VOb2RlLmdldERUREZpbGUoKTsKLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmJlZ2luUmVjb3JkaW5nKHRoaXMsIHNvdXJjZXMuc2l6ZSgpID4gMSA/IG1vdmVOb2RlcyA6IG1vdmVOb2RlKTsKLQkJSXRlcmF0b3IgaXRlciA9IHNvdXJjZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIFRvcExldmVsTm9kZSkgewotCQkJCWR0ZEZpbGUubW92ZU5vZGUodGhpcywgcmVmZXJlbmNlTm9kZSwgbm9kZSwgaXNBZnRlcigpKTsKLQkJCX0KLQkJfQotCQlkdGRGaWxlLmdldERURE1vZGVsKCkuZW5kUmVjb3JkaW5nKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JEVEQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvQWN0aW9uQ29udHJpYnV0b3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjMjBkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0FjdGlvbkNvbnRyaWJ1dG9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yOwotCi0vKioKLSAqIFhNTEVkaXRvckFjdGlvbkNvbnRyaWJ1dG9yCi0gKiAKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBtdWx0aSBwYWdlIGVkaXRvcidzCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciwgc2luY2UgY2FzY2FkZWQgaW5pdCgpIGNhbGwgZnJvbSB0aGUKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yIHdpbGwgY2F1c2VzIGV4Y2VwdGlvbiBhbmQgaXQgbGVhZHMgdG8gbG9zZSB3aG9sZQotICogdG9vbGJhcnMuCi0gKiAKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yIG9mCi0gKiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkNvbnRyaWJ1dG9yRFREIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3IgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmR0ZHNvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuQWN0aW9uQ29udHJpYnV0b3IjZ2V0RXh0ZW5zaW9uSURzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlcik7Ci0JCX0KLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJU3RyaW5nIHNvdXJjZU1lbnVMYWJlbCA9IERURFVJTWVzc2FnZXMuU291cmNlTWVudV9sYWJlbDsKLQkJU3RyaW5nIHNvdXJjZU1lbnVJZCA9ICJzb3VyY2VNZW51SWQiOyAvLyROT04tTkxTLTEkCi0JCUlNZW51TWFuYWdlciBzb3VyY2VNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHNvdXJjZU1lbnVMYWJlbCwgc291cmNlTWVudUlkKTsKLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgc291cmNlTWVudSk7Ci0JCWlmIChzb3VyY2VNZW51ICE9IG51bGwpIHsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTdmYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8vIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZQotCQkJLy8gcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpCi0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvZWRpdG9yL0RUREVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMxMTU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvRFRERWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yOwotCi0vKioKLSAqIEJ1bmRsZSBvZiBtb3N0IGltYWdlcyB1c2VkIGJ5IHRoZSBEVEQgU291cmNlIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgRFRERWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfQUREX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0F0dHJpYnV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfQUREX0VMRU1FTlQgPSAiaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19DVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9jdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0xfQUREX0dST1VQVE9DT05NT0RFTCA9ICJpY29ucy9mdWxsL2N0b29sMTYvQUREX0dyb3VwVG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9BVFRSSUJVVEUgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9BdHRyaWJ1dGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9BRERfRUxFTUVOVCA9ICJpY29ucy9mdWxsL2R0b29sMTYvQUREX0VsZW1lbnQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9FbGVtZW50VG9Db25Nb2RlbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L0FERF9Hcm91cFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfQVRUUklCVVRFID0gImljb25zL2Z1bGwvZXRvb2wxNi9BRERfQXR0cmlidXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQUREX0VMRU1FTlQgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L0FERF9FbGVtZW50LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMID0gImljb25zL2Z1bGwvZXRvb2wxNi9BRERfRWxlbWVudFRvQ29uTW9kZWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMID0gImljb25zL2Z1bGwvZXRvb2wxNi9BRERfR3JvdXBUb0Nvbk1vZGVsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQUREX0NPTU1FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9BRERfQ29tbWVudC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BRERfRU5USVRZID0gImljb25zL2Z1bGwvb2JqMTYvQUREX0VudGl0eS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9BRERfRU5USVRZX1JFRkVSRU5DRSA9ICJpY29ucy9mdWxsL29iajE2L0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9OT1RBVElPTiA9ICJpY29ucy9mdWxsL29iajE2L0FERF9Ob3RhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9PUkdBTklaRV9EVERfTE9HSUNBTExZID0gImljb25zL2Z1bGwvb2JqMTYvb3JnYW5pemVfZHRkX2xvZ2ljYWxseS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9TT1JUID0gImljb25zL2Z1bGwvb2JqMTYvc29ydC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9WQUxJREFURSA9ICJpY29ucy9mdWxsL29iajE2L3ZhbGlkYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX05FV0RUREZJTEUgPSAiaWNvbnMvZnVsbC93aXpiYW4vbmV3ZHRkZmlsZV93aXouZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGRkOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotCi0vKioKLSAqIEhlbHAgY29udGV4dCBpZHMgZm9yIHRoZSBEVEQgU291cmNlIEVkaXRvci4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJSGVscENvbnRleHRJZHMgewotCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCkgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBEVEQgRmlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAyMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBEVEQgU3R5bGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDIxIjsgLy8kTk9OLU5MUy0xJAotCS8vIERURCBUZW1wbGF0ZSBQcmVmZXJlbmNlIHBhZ2UgKG5vIGlkIGZvciB0aGlzIHlldCkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAyMiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIC8vIGZpZ3VyZWQgb3V0IG9uIHRoZSBmbHkKLQkvLyAvLyBEVEQgU291cmNlIHBhZ2UgZWRpdG9yCi0JLy8gcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1NPVVJDRVZJRVdfSEVMUElEID0KLQkvLyBDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREICsgIl9zb3VyY2VfSGVscElkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gRFREIE5ldyBGaWxlIFdpemFyZCAtIFRlbXBsYXRlIFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCA9IFBSRUZJWCArICJkdGR3MDAxMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb2xvclBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERDb2xvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyYTNlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREQ29sb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5TdHlsZWRUZXh0Q29sb3JQaWNrZXI7Ci0KLXB1YmxpYyBjbGFzcyBEVERDb2xvclBhZ2UgZXh0ZW5kcyBBYnN0cmFjdENvbG9yUGFnZSB7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBwYWdlQ29tcG9uZW50ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCSgoR3JpZERhdGEpIHBhZ2VDb21wb25lbnQuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCi0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhZ2VDb21wb25lbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhZ2VDb21wb25lbnQsIElIZWxwQ29udGV4dElkcy5EVERfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0KLQkJcmV0dXJuIHBhZ2VDb21wb25lbnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCQlJdGVyYXRvciBpID0gc3R5bGVMaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIChTdHJpbmcpIGkubmV4dCgpKSk7Ci0JCX0KLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNhbXBsZVRleHQoKSB7Ci0JCXJldHVybiBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTlRFTlRfRU1QVFksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9BTlksIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkRBVEFfVkFMVUUsIElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTkFNRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5FTlRJVFlfUEFSTSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVOVElUWV9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcsIElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ09OTkVDVE9SLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuT0NDVVJfVFlQRSwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0wpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuU1RBUlRfVEFHLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5EX1RBRywgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkVYQ0xBTUFUSU9OLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRyk7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX1NUQVJULCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5DT01NRU5UX0VORCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNJTkdMRVFVT1RFRF9MSVRFUkFMLCBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRE9VQkxFUVVPVEVEX0xJVEVSQUwsIElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlBVQkxJQ19LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLk5EQVRBX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5JRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLklEUkVGX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRZX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuRU5USVRJRVNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuTk1UT0tFTlNfS0VZV09SRCwgSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChEVERSZWdpb25UeXBlcy5OT1RBVElPTl9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRFREUmVnaW9uVHlwZXMuSU1QTElFRF9LRVlXT1JELCBJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERURFJlZ2lvblR5cGVzLkZJWEVEX0tFWVdPUkQsIElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfMSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzIpOyAvLyROT04tTkxTLTEkCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxULCBEVERVSU1lc3NhZ2VzLkRURENvbG9yUGFnZV8zKTsgLy8kTk9OLU5MUy0xJAotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNCk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCwgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNik7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRywgRFREVUlNZXNzYWdlcy5EVERDb2xvclBhZ2VfNyk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUsIERURFVJTWVzc2FnZXMuRFREQ29sb3JQYWdlXzgpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFN0eWxlTGlzdChBcnJheUxpc3QgbGlzdCkgewotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0NPTU1FTlQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RBVEEpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX0tFWVdPUkQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldHVwUGlja2VyKFN0eWxlZFRleHRDb2xvclBpY2tlciBwaWNrZXIpIHsKLQkJSU1vZGVsTWFuYWdlciBtbWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXBpY2tlci5zZXRQYXJzZXIobW1hbmFnZXIuY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKENvbnRlbnRUeXBlSWRGb3JEVEQuQ29udGVudFR5cGVJRF9EVEQpLmdldFBhcnNlcigpKTsKLQotCQlEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucyA9IG5ldyBIYXNodGFibGUoKTsKLQkJaW5pdERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlI3NhdmVQcmVmZXJlbmNlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RUREZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZmZmZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RUREZpbGVzUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci0KLQotcHVibGljIGNsYXNzIERUREZpbGVzUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIHsKLQlwcml2YXRlIFRleHQgZkRlZmF1bHRTdWZmaXggPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuRFREX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCk7Ci0KLQkJR3JvdXAgY3JlYXRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKGNvbXBvc2l0ZSwgMik7Ci0JCWNyZWF0aW5nR3JvdXAuc2V0VGV4dChEVERVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzKTsKLQotCQkvLyBEZWZhdWx0IGV4dGVuc2lvbiBmb3IgTmV3IGZpbGUgV2l6YXJkCi0JCWNyZWF0ZUxhYmVsKGNyZWF0aW5nR3JvdXAsIERURFVJTWVzc2FnZXMuRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbCk7Ci0JCWZEZWZhdWx0U3VmZml4ID0gY3JlYXRlVGV4dEZpZWxkKGNyZWF0aW5nR3JvdXApOwotCQlmRGVmYXVsdFN1ZmZpeC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZkRlZmF1bHRTdWZmaXgucmVtb3ZlTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCURURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gbW9kZWwKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zCi0JICogCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSNnZXRNb2RlbFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCQlmRGVmYXVsdFN1ZmZpeC5zZXRUZXh0KHN1ZmZpeCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlTdHJpbmcgc3VmZml4ID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoRFREQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0JCWZEZWZhdWx0U3VmZml4LnNldFRleHQoc3VmZml4KTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGZEZWZhdWx0U3VmZml4LmdldFRleHQoKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKERURENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04sIHN1ZmZpeCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpID0gZ2V0VmFsaWRFeHRlbnNpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpICYmICFpc1ZhbGlkKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpc1ZhbGlkID0gZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoZkRlZmF1bHRTdWZmaXguZ2V0VGV4dCgpKTsKLQkJfQotCi0JCWlmICghaXNWYWxpZCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKERURFVJTWVzc2FnZXMuRFRERmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25FcnJvciwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJc2V0VmFsaWQoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM4M2UxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi0vKioKLSAqIFByZWZlcmVuY2UgcGFnZSBmb3IgRFREIHRlbXBsYXRlcwotICovCi1wdWJsaWMgY2xhc3MgRFREVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgewotCi0JcHVibGljIERURFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCURURFVJUGx1Z2luIGR0ZFVJUGx1Z2luID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCi0JCXNldFByZWZlcmVuY2VTdG9yZShkdGRVSVBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoZHRkVUlQbHVnaW4uZ2V0VGVtcGxhdGVTdG9yZSgpKTsKLQkJc2V0Q29udGV4dFR5cGVSZWdpc3RyeShkdGRVSVBsdWdpbi5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCURURFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIG9rOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgYW5jZXN0b3IpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQ29udGVudHMoYW5jZXN0b3IpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5EVERfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNjcmVhdGVWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURDsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25EVEQoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkxFRlRfVE9fUklHSFQgfCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YmE5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0RURFVJUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZS5JU3R5bGVDb25zdGFudHNEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBEVEQgVUkgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIERURFVJUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQkvLyBEVEQgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDAsIDApICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQsIHN0eWxlVmFsdWUpOyAvLyBibGFjawotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgNjMsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHLCBzdHlsZVZhbHVlKTsgLy8gYmx1ZQotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSwgc3R5bGVWYWx1ZSk7IC8vIGJsdWUKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTI3LCAxMjcsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCwgc3R5bGVWYWx1ZSk7IC8vIGdyZXkKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTI4LCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JELCBzdHlsZVZhbHVlKTsgLy8gZGFyawotCQkvLyByZWQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNjMsIDE1OSwgOTUpICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORywgc3R5bGVWYWx1ZSk7IC8vIGdyZWVuCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDE5MSwgOTUsIDk1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBLCBzdHlsZVZhbHVlKTsgLy8gbGlnaHQKLQkJLy8gcmVkCi0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDEyOCwgMCwgMCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MLCBzdHlsZVZhbHVlKTsgLy8gZGFyawotCQkvLyByZWQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRFREVUlQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2YyZjcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9EVERVSVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByZWZlcmVuY2Uga2V5cyBmb3IgRFREIFVJCi0gKi8KLXB1YmxpYyBjbGFzcyBEVERVSVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBEVERVSVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBpbnN0YW5jZQotCX0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIGN1c3RvbWl6ZWQgdGVtcGxhdGVzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTX0tFWSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmN1c3RvbV90ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gbmV3IERURCBmaWxlIHdpemFyZC4KLQkgKiBUZW1wbGF0ZSBuYW1lIGlzIHN0b3JlZCBpbnN0ZWFkIG9mIHRlbXBsYXRlIGlkIGJlY2F1c2UgdXNlci1jcmVhdGVkCi0JICogdGVtcGxhdGVzIGRvIG5vdCBoYXZlIHRlbXBsYXRlIGlkcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1RFTVBMQVRFX05BTUUgPSAibmV3RmlsZVRlbXBsYXRlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckRURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjZiMzExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uSVByb2plY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuVG9wTGV2ZWxOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50LklEVERGaWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmV2ZW50Lk5vZGVzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9qZWN0aW9uLklTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIHByb2plY3Rpb24gbW9kZWwgb2YgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciBEVEQuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckRURCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciwgSVByb2plY3Rpb25MaXN0ZW5lciwgSURUREZpbGVMaXN0ZW5lciwgSVRleHRJbnB1dExpc3RlbmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnUHJvamVjdGlvblBlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIGNsYXNzIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGV4dGVuZHMgUHJvamVjdGlvbkFubm90YXRpb24gewotCQlwcml2YXRlIGJvb2xlYW4gZklzVmlzaWJsZSA9IGZhbHNlOyAvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQlwcml2YXRlIE5vZGUgZk5vZGU7Ci0KLQkJcHVibGljIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKE5vZGUgbm9kZSwgYm9vbGVhbiBpc0NvbGxhcHNlZCkgewotCQkJc3VwZXIoaXNDb2xsYXBzZWQpOwotCQkJZk5vZGUgPSBub2RlOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJCXJldHVybiBmTm9kZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldE5vZGUoTm9kZSBub2RlKSB7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQkvKioKLQkJICogRG9lcyBub3QgcGFpbnQgaGlkZGVuIGFubm90YXRpb25zLiBBbm5vdGF0aW9ucyBhcmUgaGlkZGVuIHdoZW4gdGhleQotCQkgKiBvbmx5IHNwYW4gb25lIGxpbmUuCi0JCSAqIAotCQkgKiBAc2VlIFByb2plY3Rpb25Bbm5vdGF0aW9uI3BhaW50KG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXMsCi0JCSAqICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZSkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhaW50KEdDIGdjLCBDYW52YXMgY2FudmFzLCBSZWN0YW5nbGUgcmVjdGFuZ2xlKSB7Ci0JCQkvKiB3b3JrYXJvdW5kIGZvciBCVUc4NTg3NCAqLwotCQkJLyoKLQkJCSAqIG9ubHkgbmVlZCB0byBjaGVjayBhbm5vdGF0aW9ucyB0aGF0IGFyZSBleHBhbmRlZCBiZWNhdXNlIGhpZGRlbgotCQkJICogYW5ub3RhdGlvbnMgc2hvdWxkIG5ldmVyIGhhdmUgYmVlbiBnaXZlbiB0aGUgY2hhbmNlIHRvCi0JCQkgKiBjb2xsYXBzZS4KLQkJCSAqLwotCQkJaWYgKCFpc0NvbGxhcHNlZCgpKSB7Ci0JCQkJLy8gd29ya2luZyB3aXRoIHJlY3RhbmdsZSwgc28gbGluZSBoZWlnaHQKLQkJCQlGb250TWV0cmljcyBtZXRyaWNzID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKTsKLQkJCQlpZiAobWV0cmljcyAhPSBudWxsKSB7Ci0JCQkJCS8vIGRvIG5vdCBkcmF3IGFubm90YXRpb25zIHRoYXQgb25seSBzcGFuIG9uZSBsaW5lIGFuZAotCQkJCQkvLyBtYXJrIHRoZW0gYXMgbm90IHZpc2libGUKLQkJCQkJaWYgKChyZWN0YW5nbGUuaGVpZ2h0IC8gbWV0cmljcy5nZXRIZWlnaHQoKSkgPD0gMSkgewotCQkJCQkJZklzVmlzaWJsZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZklzVmlzaWJsZSA9IHRydWU7Ci0JCQlzdXBlci5wYWludChnYywgY2FudmFzLCByZWN0YW5nbGUpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uI21hcmtDb2xsYXBzZWQoKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWFya0NvbGxhcHNlZCgpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvLyBkbyBub3QgbWFyayBjb2xsYXBzZWQgaWYgYW5ub3RhdGlvbiBpcyBub3QgdmlzaWJsZQotCQkJaWYgKGZJc1Zpc2libGUpCi0JCQkJc3VwZXIubWFya0NvbGxhcHNlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb2N1bWVudCB0byBiZSBhd2FyZSBvZiB3aGVuIHRvIHVwZGF0ZSB0aGUgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0JY2xhc3MgRG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCWlmIChmRG9jdW1lbnQgPT0gZXZlbnQuZ2V0RG9jdW1lbnQoKSkKLQkJCQlmSXNEb2N1bWVudENoYW5naW5nID0gdHJ1ZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyByZWdpc3RlciBhIHBvc3Qgbm90aWZpY2F0aW9uIHJlcGxhY2Ugc28gdGhhdCBwcm9qZWN0aW9uCi0JCQkvLyBhbm5vdGF0aW9uIG1vZGVsIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBhbGwgZG9jdW1lbnRDaGFuZ2VkCi0JCQkvLyBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uICYmIGZEb2N1bWVudCA9PSBkb2N1bWVudCkgewotCQkJCWlmIChmVmlld2VyICE9IG51bGwgJiYgZlF1ZXVlZE5vZGVDaGFuZ2VzICE9IG51bGwgJiYgIWZRdWV1ZWROb2RlQ2hhbmdlcy5pc0VtcHR5KCkpIHsKLQkJCQkJKChJRG9jdW1lbnRFeHRlbnNpb24pIGRvY3VtZW50KS5yZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKHRoaXMsIG5ldyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXNzZW50aWFsbHkgYSBwb3N0IGRvY3VtZW50IGNoYW5nZWQgbGlzdGVuZXIgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYWZ0ZXIKLQkgKiBkb2N1bWVudGNoYW5nZWQgaGFzIGJlZW4gZmlyZWQuCi0JICovCi0JY2xhc3MgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlIHsKLQkJcHVibGljIHZvaWQgcGVyZm9ybShJRG9jdW1lbnQgZG9jdW1lbnQsIElEb2N1bWVudExpc3RlbmVyIG93bmVyKSB7Ci0JCQlhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJCWZJc0RvY3VtZW50Q2hhbmdpbmcgPSBmYWxzZTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbnRhaW5zIG5vZGUgYW5kIGFuIGluZGljYXRpb24gb24gaG93IGl0IGNoYW5nZWQKLQkgKi8KLQljbGFzcyBOb2RlQ2hhbmdlIHsKLQkJc3RhdGljIGZpbmFsIGludCBBREQgPSAxOwotCQlzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDI7Ci0KLQkJcHJpdmF0ZSBOb2RlIGZOb2RlOwotCQlwcml2YXRlIGludCBmQ2hhbmdlVHlwZTsKLQotCQlwdWJsaWMgTm9kZUNoYW5nZShOb2RlIG5vZGUsIGludCBjaGFuZ2VUeXBlKSB7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCQlmQ2hhbmdlVHlwZSA9IGNoYW5nZVR5cGU7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIGZOb2RlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDaGFuZ2VUeXBlKCkgewotCQkJcmV0dXJuIGZDaGFuZ2VUeXBlOwotCQl9Ci0JfQotCi0JSURvY3VtZW50IGZEb2N1bWVudDsKLQlQcm9qZWN0aW9uVmlld2VyIGZWaWV3ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCS8qKgotCSAqIExpc3RlbmVyIHRvIGZQcm9qZWN0aW9uVmlld2VyJ3MgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGZEb2N1bWVudExpc3RlbmVyOwotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBkb2N1bWVudCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nCi0JICovCi0JYm9vbGVhbiBmSXNEb2N1bWVudENoYW5naW5nID0gZmFsc2U7Ci0JLyoqCi0JICogTGlzdCBvZiBjaGFuZ2VkIG5vZGVzIHRoYXQgbmVlZCB0byBiZSByZWNhbGN1bGF0ZWQKLQkgKi8KLQlMaXN0IGZRdWV1ZWROb2RlQ2hhbmdlcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgYWxsIHRoZSBxdWV1ZWQgbm9kZSBjaGFuZ2VzIGFuZCB1cGRhdGVzIHByb2plY3Rpb24gYW5ub3RhdGlvbgotCSAqIG1vZGVsLgotCSAqLwotCXZvaWQgYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCkgewotCQlpZiAoZlZpZXdlciAhPSBudWxsICYmIGZRdWV1ZWROb2RlQ2hhbmdlcyAhPSBudWxsICYmICFmUXVldWVkTm9kZUNoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpOwotCi0JCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcGVuZGluZyBhbm5vdGF0aW9uIGNoYW5nZXMgYW5kIGFwcGx5IHRoZW0gdG8KLQkJCS8vIHRoZSBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkJCXdoaWxlICghZlF1ZXVlZE5vZGVDaGFuZ2VzLmlzRW1wdHkoKSkgewotCQkJCU5vZGVDaGFuZ2UgY2hhbmdlcyA9IChOb2RlQ2hhbmdlKSBmUXVldWVkTm9kZUNoYW5nZXMucmVtb3ZlKDApOwotCQkJCWlmIChjaGFuZ2VzLmdldENoYW5nZVR5cGUoKSA9PSBOb2RlQ2hhbmdlLkFERCkgewotCQkJCQkvLyBhZGQKLQkJCQkJTm9kZSBub2RlID0gY2hhbmdlcy5nZXROb2RlKCk7Ci0JCQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihub2RlKTsKLQkJCQkJaWYgKG5ld1BvcyAhPSBudWxsKSB7Ci0JCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKG5vZGUsIGZhbHNlKTsKLQkJCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBhZGQKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJYW5ub3RhdGlvbk1vZGVsLmFkZEFubm90YXRpb24obmV3QW5ub3RhdGlvbiwgbmV3UG9zKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGxvZyBpdCBhbmQgY29udGludWUKLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY2hhbmdlcy5nZXRDaGFuZ2VUeXBlKCkgPT0gTm9kZUNoYW5nZS5SRU1PVkUpIHsKLQkJCQkJLy8gcmVtb3ZlCi0JCQkJCU5vZGUgbm9kZSA9IGNoYW5nZXMuZ2V0Tm9kZSgpOwotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gZmluZEV4aXN0aW5nQW5ub3RhdGlvbihub2RlKTsKLQkJCQkJaWYgKGFubm8gIT0gbnVsbCkgewotCQkJCQkJdHJ5IHsKLQkJCQkJCQlhbm5vdGF0aW9uTW9kZWwucmVtb3ZlQW5ub3RhdGlvbihhbm5vKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJCS8vIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIGxvZyBpdCBhbmQgY29udGludWUKLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmUXVldWVkTm9kZUNoYW5nZXMgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgY3JlYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gaWYgbmVlZGVkCi0JICogCi0JICogQHBhcmFtIERUREZpbGUKLQkgKiAgICAgICAgICAgIGFzc3VtZXMgZmlsZSBpcyBub3QgbnVsbAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRBbGxBbm5vdGF0aW9ucyhEVERGaWxlIGZpbGUpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCUxpc3Qgbm9kZXMgPSBmaWxlLmdldE5vZGVzKCk7Ci0JCUl0ZXJhdG9yIGl0ID0gbm9kZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0Lm5leHQoKTsKLQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihub2RlKTsKLQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIG5ld0Fubm90YXRpb24gPSBuZXcgVGFnUHJvamVjdGlvbkFubm90YXRpb24obm9kZSwgZmFsc2UpOwotCQkJCS8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBhZGQKLQkJCQlmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5hZGRBbm5vdGF0aW9uKG5ld0Fubm90YXRpb24sIG5ld1Bvcyk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQuYWRkQWxsQW5ub3RhdGlvbnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJvamVjdGlvbiBwb3NpdGlvbiBmcm9tIHRoZSBnaXZlbiBub2RlLiBBYmxlIHRvIGdldAotCSAqIHByb2plY3Rpb24gcG9zaXRpb24gaWYgbm9kZSBpc05vZGVQcm9qZWN0YWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gbnVsbCBpZiBubyBwcm9qZWN0aW9uIHBvc2l0aW9uIHBvc3NpYmxlLCBhIFBvc2l0aW9uIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgUG9zaXRpb24gY3JlYXRlUHJvamVjdGlvblBvc2l0aW9uKE5vZGUgbm9kZSkgewotCQlQb3NpdGlvbiBwb3MgPSBudWxsOwotCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkgJiYgbm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IChJbmRleGVkUmVnaW9uKSBub2RlOwotCQkJCWludCBzdGFydCA9IGlub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJCWlmIChzdGFydCA+PSAwICYmIHN0YXJ0IDwgZW5kKSB7Ci0JCQkJCXBvcyA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qKgotCSAqIFNlYXJjaGVzIHRocm91Z2ggcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGFuZCByZXRyaWV2ZXMKLQkgKiBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmb3Igbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmb3Igbm9kZSBvciBudWxsIGlmIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZmluZEV4aXN0aW5nQW5ub3RhdGlvbihOb2RlIG5vZGUpIHsKLQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYW5ubyA9IG51bGw7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKS5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgYW5ubyA9PSBudWxsKSB7Ci0JCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYSA9IChUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbikgaXQubmV4dCgpOwotCQkJCWlmIChub2RlLmVxdWFscyhhLmdldE5vZGUoKSkpCi0JCQkJCWFubm8gPSBhOwotCQkJfQotCQl9Ci0JCXJldHVybiBhbm5vOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgZHRkIGZpbGUgZm9yIHRoZSBmRG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIERUREZpbGUgaWYgaXQgZXhpc3RzLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgRFRERmlsZSBnZXREVERGaWxlKCkgewotCQlEVERGaWxlIGR0ZEZpbGUgPSBudWxsOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCBpbnN0YW5jZW9mIERURE1vZGVsSW1wbCkgewotCQkJCQlkdGRGaWxlID0gKChEVERNb2RlbEltcGwpIHNNb2RlbCkuZ2V0RFRERmlsZSgpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBkdGRGaWxlOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm92aWRlciB3aXRoIHRoZSBjb3JyZWN0IGRvY3VtZW50LiBBc3N1bWVzIHByb2plY3Rpb24KLQkgKiBpcyBlbmFibGVkLiAob3RoZXJ3aXNlLCBvbmx5IGluc3RhbGwgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCkgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gcmVtb3ZlIG9sZCBpbmZvCi0JCXByb2plY3Rpb25EaXNhYmxlZCgpOwotCi0JCWZEb2N1bWVudCA9IGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJRFRERmlsZSBmaWxlID0gZ2V0RFRERmlsZSgpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBmaWxlICE9IG51bGwgJiYgZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudExpc3RlbmVyID09IG51bGwpCi0JCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcigpOwotCi0JCQlmRG9jdW1lbnQuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0KLQkJCS8vIGFkZCBkdGQgZmlsZSBsaXN0ZW5lciB0byBuZXcgZHRkIGZpbGUKLQkJCWZpbGUuYWRkRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCi0JCQlhZGRBbGxBbm5vdGF0aW9ucyhmaWxlKTsKLQkJfQotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGUgYSBQcm9qZWN0aW9uVmlld2VyIHdpdGggdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyB1bmluc3RhbGwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIG5ldyB2aWV3ZXIKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXVuaW5zdGFsbCgpOwotCQl9Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBpcyBhIG5vZGUgdHlwZSBhYmxlIHRvIGZvbGQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEByZXR1cm4gYm9vbGVhbiB0cnVlIGlmIG5vZGUgaXMgcHJvamVjdGFibGUsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05vZGVQcm9qZWN0YWJsZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBUb3BMZXZlbE5vZGUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVDaGFuZ2VkKERURE5vZGUgbm9kZSkgewotCQkvKgotCQkgKiBEb24ndCBiZWxpZXZlIHRoaXMgaXMgbmVjZXNzYXJ5ICh1c2VkIHRvIG5lZWQgaXQgdG8gb25seSBhZGQKLQkJICogcHJvamVjdGlvbiBhbm5vdGF0aW9ucyB0byBlbGVtZW50cyB0aGF0IHNwYW4gbW9yZSB0aGFuIG9uZSBsaW5lLAotCQkgKiBidXQgbm93IGp1c3QgYWx3YXlzIGFkZCBwcm9qZWN0aW9uIGFubm90YXRpb24pCi0JCSAqLwotCQkvLyBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCS8vIC8vIHJlY2FsY3VsYXRlIHByb2plY3Rpb24gYW5ub3RhdGlvbnMgZm9yIG5vZGUKLQkJLy8gLy8gY2hlY2sgaWYgdGhpcyB3YXMgZXZlbiBhIHByb2plY3RhYmxlIG5vZGUgdG8gc3RhcnQgd2l0aAotCQkvLyBpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkpIHsKLQkJLy8gLy8gZmluZCB0aGUgZXhpc3RpbmcgYW5ub3RhdGlvbgotCQkvLyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gZmluZEV4aXN0aW5nQW5ub3RhdGlvbihub2RlKTsKLQkJLy8gLy8gaWYgYWJsZSB0byBwcm9qZWN0IG5vZGUgc2VlIGlmIHByb2plY3Rpb24gYW5ub3RhdGlvbiB3YXMKLQkJLy8gLy8gYWxyZWFkeSBjcmVhdGVkIGFuZCBjcmVhdGUgbmV3IGlmIG5lZWRlZAotCQkvLyBQb3NpdGlvbiBuZXdQb3MgPSBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24obm9kZSk7Ci0JCS8vIGlmIChuZXdQb3MgIT0gbnVsbCAmJiBhbm5vID09IG51bGwpIHsKLQkJLy8gVGFnUHJvamVjdGlvbkFubm90YXRpb24gbmV3QW5ub3RhdGlvbiA9IG5ldwotCQkvLyBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbihub2RlLCBmYWxzZSk7Ci0JCS8vIC8vIGFkZCB0byBtYXAgY29udGFpbmluZyBhbm5vdGF0aW9ucyB0byBhZGQKLQkJLy8gZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkuYWRkQW5ub3RhdGlvbihuZXdBbm5vdGF0aW9uLAotCQkvLyBuZXdQb3MpOwotCQkvLyB9Ci0JCS8vIC8vIGlmIG5vdCBhYmxlIHRvIHByb2plY3Qgbm9kZSBzZWUgaWYgcHJvamVjdGlvbiBhbm5vdGF0aW9uIHdhcwotCQkvLyAvLyBhbHJlYWR5IGNyZWF0ZWQgYW5kIHJlbW92ZSBpdAotCQkvLyBpZiAobmV3UG9zID09IG51bGwgJiYgYW5ubyAhPSBudWxsKSB7Ci0JCS8vIGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpLnJlbW92ZUFubm90YXRpb24oYW5ubyk7Ci0JCS8vIH0KLQkJLy8gfQotCQkvLwotCQkvLyBsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkvLyBpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkvLyBTdHJpbmcgbm9kZU5hbWUgPSBub2RlICE9IG51bGwgPyBub2RlLmdldE5vZGVOYW1lKCkgOiAibnVsbCI7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckRURC5ub2RlQ2hhbmdlZCAoIgotCQkvLyArIG5vZGVOYW1lICsgIik6IiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJLy8gfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJcHJvY2Vzc05vZGVzRXZlbnQoZXZlbnQsIE5vZGVDaGFuZ2UuQUREKTsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJEVEQubm9kZXNBZGRlZDogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgY2hhbmdlZCBub2RlIGluIGV2ZW50IGFuZCBhZGQgdG8gcXVldWUgb2Ygbm9kZQotCSAqIGNoYW5nZXMgdGhhdCB3aWxsIGJlIHJlY2FsY3VsYXRlZCBmb3IgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqIEBwYXJhbSBjaGFuZ2VUeXBlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NOb2Rlc0V2ZW50KE5vZGVzRXZlbnQgZXZlbnQsIGludCBjaGFuZ2VUeXBlKSB7Ci0JCUxpc3Qgbm9kZXMgPSBldmVudC5nZXROb2RlcygpOwotCQlJdGVyYXRvciBpdCA9IG5vZGVzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCURURE5vZGUgbm9kZSA9IChEVEROb2RlKSBpdC5uZXh0KCk7Ci0JCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkpIHsKLQkJCQlpZiAoZlF1ZXVlZE5vZGVDaGFuZ2VzID09IG51bGwpIHsKLQkJCQkJZlF1ZXVlZE5vZGVDaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCX0KLQotCQkJCWludCBleGlzdGluZ0luZGV4ID0gZlF1ZXVlZE5vZGVDaGFuZ2VzLmluZGV4T2Yobm9kZSk7Ci0JCQkJaWYgKGV4aXN0aW5nSW5kZXggPiAtMSkgewotCQkJCQkvLyBub2RlIGlzIGFscmVhZHkgcXVldWVkIHVwCi0JCQkJCU5vZGVDaGFuZ2UgZXhpc3RpbmdDaGFuZ2UgPSAoTm9kZUNoYW5nZSkgZlF1ZXVlZE5vZGVDaGFuZ2VzLnJlbW92ZShleGlzdGluZ0luZGV4KTsKLQkJCQkJLy8gZG9uJ3QgYWRkIGlmIGFkZGVkIHRoZW4gcmVtb3ZlZCBub2RlIG9yIHZpY2UgdmVyc2EKLQkJCQkJaWYgKGV4aXN0aW5nQ2hhbmdlLmdldENoYW5nZVR5cGUoKSA9PSBjaGFuZ2VUeXBlKSB7Ci0JCQkJCQlOb2RlQ2hhbmdlIG5ld0NoYW5nZSA9IG5ldyBOb2RlQ2hhbmdlKG5vZGUsIGNoYW5nZVR5cGUpOwotCQkJCQkJZlF1ZXVlZE5vZGVDaGFuZ2VzLmFkZChuZXdDaGFuZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBub3QgcXVldWVkIHVwIHlldCwgc28gcXVldWUgbm9kZQotCQkJCQlOb2RlQ2hhbmdlIG5ld0NoYW5nZSA9IG5ldyBOb2RlQ2hhbmdlKG5vZGUsIGNoYW5nZVR5cGUpOwotCQkJCQlmUXVldWVkTm9kZUNoYW5nZXMuYWRkKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIGRvY3VtZW50IGlzbid0IGNoYW5naW5nLCBnbyBhaGVhZCBhbmQgYXBwbHkgaXQKLQkJaWYgKCFmSXNEb2N1bWVudENoYW5naW5nKSB7Ci0JCQlhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzUmVtb3ZlZChOb2Rlc0V2ZW50IGV2ZW50KSB7Ci0JCWxvbmcgc3RhcnQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQotCQlwcm9jZXNzTm9kZXNFdmVudChldmVudCwgTm9kZUNoYW5nZS5SRU1PVkUpOwotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckRURC5ub2Rlc1JlbW92ZWQ6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvamVjdGlvbkRpc2FibGVkKCkgewotCQlEVERGaWxlIGZpbGUgPSBnZXREVERGaWxlKCk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWZpbGUucmVtb3ZlRFRERmlsZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJLy8gcmVtb3ZlIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciAhPSBudWxsICYmIGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlmRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JCQlmRG9jdW1lbnQgPSBudWxsOwotCi0JCQkvLyBjbGVhciBvdXQgbGlzdCBvZiBxdWV1ZWQgY2hhbmdlcyBzaW5jZSBpdCBtYXkgbm8gbG9uZ2VyIGJlCi0JCQkvLyBhY2N1cmF0ZQotCQkJaWYgKGZRdWV1ZWROb2RlQ2hhbmdlcyAhPSBudWxsKSB7Ci0JCQkJZlF1ZXVlZE5vZGVDaGFuZ2VzLmNsZWFyKCk7Ci0JCQkJZlF1ZXVlZE5vZGVDaGFuZ2VzID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgZm9sZGluZyBpcyBlbmFibGVkIGFuZCBuZXcgZG9jdW1lbnQgaXMgZ29pbmcgdG8gYmUgYSB0b3RhbGx5Ci0JCS8vIGRpZmZlcmVudCBkb2N1bWVudCwgZGlzYWJsZSBwcm9qZWN0aW9uCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBmRG9jdW1lbnQgIT0gbmV3SW5wdXQpIHsKLQkJCS8vIGRpc2FibGUgcHJvamVjdGlvbiBhbmQgZGlzY29ubmVjdCBldmVyeXRoaW5nCi0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBwcm9qZWN0aW9uIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgYmVmb3JlIGlucHV0IGRvY3VtZW50IGNoYW5nZWQKLQkJLy8gYW5kIG5ldyBkb2N1bWVudCBpcyBkaWZmZXJlbnQgdGhhbiBvbGQgZG9jdW1lbnQKLQkJaWYgKGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCAmJiBmRG9jdW1lbnQgPT0gbnVsbCAmJiBuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0aW9uRW5hYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZyb20gcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcyYjU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckRURC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JEVEQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqIAotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgdHlwZSBjb21tZW50IGdvIHRvCi0gKiBXaW5kb3cmZ3Q7UHJlZmVyZW5jZXMmZ3Q7SmF2YSZndDtDb2RlIEdlbmVyYXRpb24mZ3Q7Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcHVibGljIGNsYXNzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JEVEQgaW1wbGVtZW50cyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yRFREKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2FkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZmFjdG9yeVJlZ2lzdHJ5LCAiUHJvZ3JhbSBFcnJvcjogY2xpZW50IGNhbGxlciBtdXN0IGVuc3VyZSBtb2RlbCBoYXMgZmFjdG9yeSByZWdpc3RyeSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3IoSURvY3VtZW50VHlwZUhhbmRsZXIgY29udGVudFR5cGVEZXNjcmlwdGlvbikgewotCQlyZXR1cm4gKGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gaW5zdGFuY2VvZiBNb2RlbEhhbmRsZXJGb3JEVEQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c0RURC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmNhZGVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5zdHlsZTsKLQotLyoqCi0gKiBDb250YWlucyB0aGUgc3ltYm9saWMgbmFtZSBvZiBzdHlsZXMgdXNlZCBieSBMaW5lU3R5bGVQcm92aWRlciwKLSAqIENvbG9yTWFuYWdlciwgYW5kIGFueSBvdGhlcnMgd2hvIG1heSBiZSBpbnRlcmVzdGVkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0eWxlQ29uc3RhbnRzRFREIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9DT01NRU5UID0gImR0ZENvbW1lbnQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBEYXRhIGFyZSB2YXJpYWJsZXMKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfREFUQSA9ICJkdGREYXRhIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERURF9ERUZBVUxUID0gImR0ZERlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBrZXl3b3JkcyBhcmUgY29uc3RhbnRzIGxpa2UgSU1QTElFRCBvciBQQ0RBVEEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVERfS0VZV09SRCA9ICJkdGRLZXl3b3JkIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gc3RyaW5ncyBhcmUgYW55dGhpbmcgaW4gcXVvdGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1NUUklORyA9ICJkdGRTdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvLyBBbGwgdGhlIHJlbWFpbmluZyBzeW1ib2xzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1NZTUJPTCA9ICJkdGRTeW1ib2wiOyAvLyROT04tTkxTLTEkCi0KLQkvLyB0YWdzIGFyZSAnPCcsICchJywgb3IgJz4nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1RBRyA9ICJkdGRUYWciOyAvLyROT04tTkxTLTEkCi0KLQkvLyB0YWduYW1lcyBhcmUgbGlrZSBFTEVNRU5ULCBBVFRMSVNULCBldGMuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFREX1RBR05BTUUgPSAiZHRkVGFnTmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvckRURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOGQ3MTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnBhcnNlci5EVERSZWdpb25UeXBlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JEVEQgZXh0ZW5kcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlckZvckRURCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8qKgotCQkgKiBhIG1ldGhvZCB0byBjZW50cmFsaXplIGFsbCB0aGUgImZvcm1hdCBydWxlcyIgZm9yIHJlZ2lvbnMKLQkJICogc3BlY2lmaWNhbGx5IGFzc29jaWF0ZWQgZm9yIGhvdyB0byAib3BlbiIgdGhlIHJlZ2lvbi4KLQkJICovCi0JCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGlzIGNvbWluZyB0aHJvdWdoIG51bGwsIGJ1dCBqdXN0IHRvIGNhdGNoIGl0Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9FTVBUWSB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTlRFTlRfQU5ZIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09OVEVOVF9QQ0RBVEEpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRyB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkFUVExJU1RfVEFHIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fVEFHKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHTkFNRSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5DT05ORUNUT1IgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5PQ0NVUl9UWVBFKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLk5EQVRBX1ZBTFVFKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQSk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTkRfVEFHIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRVhDTEFNQVRJT04pIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUcpOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ09NTUVOVF9TVEFSVCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfQ09OVEVOVCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkNPTU1FTlRfRU5EKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5TSU5HTEVRVU9URURfTElURVJBTCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkRPVUJMRVFVT1RFRF9MSVRFUkFMKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfU1RSSU5HKTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IERURFJlZ2lvblR5cGVzLlNZU1RFTV9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuUFVCTElDX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5OREFUQV9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuQ0RBVEFfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLklEX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5JRFJFRl9LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuSURSRUZTX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5FTlRJVFlfS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLkVOVElUSUVTX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5OTVRPS0VOU19LRVlXT1JEIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuTk9UQVRJT05fS0VZV09SRCB8fCB0eXBlID09IERURFJlZ2lvblR5cGVzLlJFUVVJUkVEX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5JTVBMSUVEX0tFWVdPUkQgfHwgdHlwZSA9PSBEVERSZWdpb25UeXBlcy5GSVhFRF9LRVlXT1JEKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c0RURC5EVERfS0VZV09SRCk7Ci0JCX0KLQkJZWxzZSBpZiAodHlwZSA9PSBEVERSZWdpb25UeXBlcy5OQU1FIHx8IHR5cGUgPT0gRFREUmVnaW9uVHlwZXMuRU5USVRZX1BBUk0pIHsKLQkJCS8vIGlmIChyZWdpb24gaW5zdGFuY2VvZiBEVERSZWdpb24pIHsKLQkJCS8vIERURFJlZ2lvbiBkdGRSZWdpb24gPSAoRFREUmVnaW9uKSByZWdpb247Ci0JCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZHRkUmVnaW9uLmdldFBhcmVudCgpOwotCQkJLy8gU3RyaW5nIHJlZ2lvblRleHQgPSBmbGF0Tm9kZS5nZXRUZXh0KGR0ZFJlZ2lvbik7Ci0JCQkvLyBpZiAocmVnaW9uVGV4dC5lcXVhbHMoIkFOWSIpIHx8IHJlZ2lvblRleHQuZXF1YWxzKCJFTVBUWSIpKSB7Ci0JCQkvLyByZXR1cm4gbmV3IFRleHRBdHRyaWJ1dGUoRFREQ29sb3JzLkRURF9LRVlXT1JEKTsKLQkJCS8vIH0KLQkJCS8vIH0KLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJfQotCi0JCS8vIGRlZmF1bHQsIHJldHVybiBudWxsIHRvIHNpZ25hbCAibm90IGhhbmRsZWQiCi0JCS8vIGluIHdoaWNoIGNhc2UsIG90aGVyIGZhY3RvcmllcyBzaG91bGQgYmUgdHJpZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHlsZUtleSA9IG51bGw7Ci0KLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQ7Ci0JCQl9Ci0JCQllbHNlIGlmIChJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBRy5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9UQUdOQU1FOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5ULmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9DT01NRU5UOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JELmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEOwotCQkJfQotCQkJZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TVFJJTkcuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORzsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c0RURC5EVERfREFUQTsKLQkJCX0KLQkJCWVsc2UgaWYgKElTdHlsZUNvbnN0YW50c0RURC5EVERfU1lNQk9MLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzRFRELkRURF9TWU1CT0w7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoc3R5bGVLZXkgIT0gbnVsbCkgewotCQkJLy8gb3ZlcndyaXRlIHN0eWxlIHByZWZlcmVuY2Ugd2l0aCBuZXcgdmFsdWUKLQkJCWFkZFRleHRBdHRyaWJ1dGUoc3R5bGVLZXkpOwotCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX0RFRkFVTFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfVEFHKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX1RBR05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0RURC5EVERfQ09NTUVOVCk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9LRVlXT1JEKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX1NUUklORyk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9EQVRBKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNEVEQuRFREX1NZTUJPTCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkOGYwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS50ZXh0LklEVERQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQ29sb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JEVERTdWJTZXQgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBIaWdobGlnaHRlciBmSGlnaGxpZ2h0ZXIgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmSW50ZXJuYWxNb2RlbCA9IG51bGw7Ci0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlckZvckRURCBmSW50ZXJuYWxQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHlsZVJhbmdlW10gZkludGVybmFsUmFuZ2VzOwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmcgPSBudWxsOwotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyRm9yRFREU3ViU2V0KCkgewotCQlzdXBlcigpOwotCQlmSW50ZXJuYWxQcm92aWRlciA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckRURCgpOwotCQlmSW50ZXJuYWxSYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVswXTsKLQkJZlBhcnRpdGlvbmluZyA9IElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JfQotCi0KLQkvKioKLQkgKiBAcGFyYW0gbGluZVJlcXVlc3RTdGFydAotCSAqIEBwYXJhbSBsaW5lUmVxdWVzdExlbmd0aAotCSAqIEBwYXJhbSBob2xkUmVzdWx0cwotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHlsZVJhbmdlcyhpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzLCBpbnQgYWRqdXN0bWVudCkgewotCQlpbnQgbGluZVJlcXVlc3RFbmQgPSBsaW5lUmVxdWVzdFN0YXJ0ICsgbGluZVJlcXVlc3RMZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkludGVybmFsUmFuZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQgPSBhZGp1c3RtZW50ICsgZkludGVybmFsUmFuZ2VzW2ldLnN0YXJ0OwotCQkJaW50IGFkanVzdGVkU3R5bGVSYW5nZUVuZCA9IGFkanVzdGVkU3R5bGVSYW5nZVN0YXJ0ICsgZkludGVybmFsUmFuZ2VzW2ldLmxlbmd0aDsKLQkJCWlmIChhZGp1c3RlZFN0eWxlUmFuZ2VFbmQgPCBsaW5lUmVxdWVzdFN0YXJ0IHx8IGxpbmVSZXF1ZXN0RW5kIDwgYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQpCi0JCQkJY29udGludWU7Ci0JCQlpbnQgZW5kID0gTWF0aC5taW4oYWRqdXN0ZWRTdHlsZVJhbmdlRW5kLCBsaW5lUmVxdWVzdEVuZCk7Ci0JCQlTdHlsZVJhbmdlIHJhbmdlID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJCXJhbmdlLnN0YXJ0ID0gTWF0aC5tYXgoYWRqdXN0ZWRTdHlsZVJhbmdlU3RhcnQsIGxpbmVSZXF1ZXN0U3RhcnQpOwotCQkJcmFuZ2UubGVuZ3RoID0gZW5kIC0gcmFuZ2Uuc3RhcnQ7Ci0JCQlyYW5nZS5mb250U3R5bGUgPSBmSW50ZXJuYWxSYW5nZXNbaV0uZm9udFN0eWxlOwotCQkJcmFuZ2UuZm9yZWdyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5mb3JlZ3JvdW5kOwotCQkJcmFuZ2UuYmFja2dyb3VuZCA9IGZJbnRlcm5hbFJhbmdlc1tpXS5iYWNrZ3JvdW5kOwotCQkJaG9sZFJlc3VsdHMuYWRkKHJhbmdlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgVGV4dEF0dHJpYnV0ZSBjcmVhdGVUZXh0QXR0cmlidXRlKFJHQiBmb3JlZ3JvdW5kLCBSR0IgYmFja2dyb3VuZCwgYm9vbGVhbiBib2xkKSB7Ci0JCXJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBib2xkID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlUZXh0QXR0cmlidXRlIHRhID0gbnVsbDsKLQotCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldENvbG9yUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoSVN0eWxlQ29uc3RhbnRzRFRELkRURF9ERUZBVUxUKTsKLQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCVJHQiBmb3JlZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1swXSk7Ci0JCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCQkJYm9vbGVhbiBib2xkID0gQm9vbGVhbi52YWx1ZU9mKHN0eWxlUHJlZnNbMl0pLmJvb2xlYW5WYWx1ZSgpOwotCQkJdGEgPSBjcmVhdGVUZXh0QXR0cmlidXRlKGZvcmVncm91bmQsIGJhY2tncm91bmQsIGJvbGQpOwotCQl9Ci0JCXJldHVybiB0YTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0SW50ZXJuYWxEb2N1bWVudCgpIHsKLQkJaWYgKGZJbnRlcm5hbE1vZGVsID09IG51bGwpIHsKLQkJCWZJbnRlcm5hbE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoQ29udGVudFR5cGVJZEZvckRURC5Db250ZW50VHlwZUlEX0RURCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnRlcm5hbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgSGlnaGxpZ2h0ZXIgaGlnaGxpZ2h0ZXIpIHsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZIaWdobGlnaHRlciA9IGhpZ2hsaWdodGVyOwotCX0KLQkKLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyI3ByZXBhcmVSZWdpb25zKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uLAotCSAqICAgICAgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiB0eXBlZFJlZ2lvbiwgaW50IGxpbmVSZXF1ZXN0U3RhcnQsIGludCBsaW5lUmVxdWVzdExlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlpZiAoIUlEVERQYXJ0aXRpb25zLkRURF9ERUZBVUxULmVxdWFscyh0eXBlZFJlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkvLyBjb21wdXRlIGFuIGludGVybmFsIERURCBtb2RlbCBhbmQgcmV0dXJuIGxpbmVzdHlsZXMgZm9yIGl0Ci0JCQlJVGV4dFJlZ2lvbiBkdGRDb250ZW50UmVnaW9uID0gbnVsbDsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdHlwZSA9IGZEb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0eXBlZFJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoZG9jdHlwZSAhPSBudWxsKQotCQkJCWR0ZENvbnRlbnRSZWdpb24gPSBkb2N0eXBlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHR5cGVkUmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCVN0cmluZyBjb250ZW50cyA9IGR0ZENvbnRlbnRSZWdpb24gIT0gbnVsbCA/IGRvY3R5cGUuZ2V0RnVsbFRleHQoZHRkQ29udGVudFJlZ2lvbikgOiBudWxsOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCA9IGdldEludGVybmFsRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJdXBkYXRlU3R5bGVSYW5nZXMoZG9jdW1lbnQsIGNvbnRlbnRzKTsKLQotCQkJYWRkU3R5bGVSYW5nZXMobGluZVJlcXVlc3RTdGFydCwgbGluZVJlcXVlc3RMZW5ndGgsIGhvbGRSZXN1bHRzLCBkb2N0eXBlLmdldFN0YXJ0T2Zmc2V0KGR0ZENvbnRlbnRSZWdpb24pKTsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZkludGVybmFsUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZkludGVybmFsUHJvdmlkZXIucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0eWxlUmFuZ2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBjb250ZW50cykgewotCQlpZiAoIWRvY3VtZW50LmdldCgpLmVxdWFscyhjb250ZW50cykpIHsKLQkJCWRvY3VtZW50LnNldChjb250ZW50cyk7Ci0JCQl0cnkgewotCQkJCUlUeXBlZFJlZ2lvbiByZWdpb25zW10gPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmUGFydGl0aW9uaW5nLCAwLCBkb2N1bWVudC5nZXRMZW5ndGgoKSwgZmFsc2UpOwotCQkJCUxpc3QgcmFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCWZJbnRlcm5hbFByb3ZpZGVyLmluaXQoZ2V0SW50ZXJuYWxEb2N1bWVudCgpLCBmSGlnaGxpZ2h0ZXIpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlmSW50ZXJuYWxQcm92aWRlci5wcmVwYXJlUmVnaW9ucyhyZWdpb25zW2ldLCByZWdpb25zW2ldLmdldE9mZnNldCgpLCByZWdpb25zW2ldLmdldExlbmd0aCgpLCByYW5nZXMpOwotCQkJCX0KLQkJCQlmSW50ZXJuYWxSYW5nZXMgPSAoU3R5bGVSYW5nZVtdKSByYW5nZXMudG9BcnJheShuZXcgU3R5bGVSYW5nZVswXSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCWZJbnRlcm5hbFJhbmdlcyA9IG5ldyBTdHlsZVJhbmdlWzBdOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlRFRELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAzYzNhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVEVEQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5HbG9iYWxUZW1wbGF0ZVZhcmlhYmxlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIERURCB0ZW1wbGF0ZSBjb250ZXh0IHR5cGVzLiBUZW1wbGF0ZXMgb2YgdGhpcyBjb250ZXh0IHR5cGUKLSAqIGFwcGx5IHRvIGFueSBwbGFjZSB3aXRoaW4gRFREIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVEVEQgZXh0ZW5kcyBUZW1wbGF0ZUNvbnRleHRUeXBlIHsKLQotCXB1YmxpYyBUZW1wbGF0ZUNvbnRleHRUeXBlRFREKCkgewotCQlzdXBlcigpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuQ3Vyc29yKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRGF0ZSgpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkRvbGxhcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLkxpbmVTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5UaW1lKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuVXNlcigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLldvcmRTZWxlY3Rpb24oKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5ZZWFyKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTRlZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3RlbXBsYXRlcy9UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFRELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSAiZHRkX25ldyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC90ZXh0L0RURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJlYmQ4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdGV4dC9EVEREb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5wYXJzZXIuRFREUmVnaW9uVHlwZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0LkRvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXI7Ci0KLQotcHVibGljIGNsYXNzIERURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIERURERvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXIoKSB7Ci0JCXN1cGVyKG5ldyBTdHJpbmdbXXtEVERSZWdpb25UeXBlcy5TVEFSVF9UQUcsIERURFJlZ2lvblR5cGVzLkNPTU1FTlRfU1RBUlR9LCBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRBdHRyaWJ1dGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjQ5MzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRBdHRyaWJ1dGVBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRBdHRyaWJ1dGVBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQkJU3RyaW5nIG5ld05hbWUgPSAiTmV3QXR0cmlidXRlIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2VsZWN0ZWROb2RlIGluc3RhbmNlb2YgQXR0cmlidXRlTGlzdCkgewotCQkJKChBdHRyaWJ1dGVMaXN0KSBzZWxlY3RlZE5vZGUpLmFkZEF0dHJpYnV0ZShuZXdOYW1lKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkoKEVsZW1lbnQpIHNlbGVjdGVkTm9kZSkuYWRkQXR0cmlidXRlKG5ld05hbWUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHJjID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJhdHRyaWJ1dGUgc2V0IHRvIHRydWUiKTsKLQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImF0dHJpYnV0ZSBzZXQgdG8gZmFsc2UiKTsKLQkJCXNldEVuYWJsZWQoZmFsc2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJjOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlTGlzdEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQXR0cmlidXRlTGlzdEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODQyNTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRBdHRyaWJ1dGVMaXN0QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCURUREZpbGUgZHRkRmlsZSA9IGdldE1vZGVsKCkuZ2V0RFRERmlsZSgpOwotCQlTdHJpbmcgYXR0TGlzdE5hbWUgPSAiTmV3QXR0TGlzdCI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHNlbGVjdGVkTm9kZSAhPSBudWxsKSB7Ci0JCQlEVEROb2RlIHRvcExldmVsTm9kZSA9IGR0ZEZpbGUuZ2V0VG9wTGV2ZWxOb2RlQXQoc2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJaWYgKHRvcExldmVsTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQlhdHRMaXN0TmFtZSA9ICgoRWxlbWVudCkgdG9wTGV2ZWxOb2RlKS5nZXROYW1lKCk7Ci0JCQl9Ci0JCX0KLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVBdHRyaWJ1dGVMaXN0KHNlbGVjdGVkTm9kZSwgYXR0TGlzdE5hbWUsIHRydWUpOwotCQkvLyBuZXdFbGVtZW50LnNldE5hbWUoRFREVW5pcXVlTmFtZUhlbHBlci5nZXRVbmlxdWVFbGVtZW50TmFtZShkdGRGaWxlKSk7Ci0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRDb21tZW50QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YzY5NzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkQ29tbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRDb21tZW50QWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkQ29tbWVudEFjdGlvbihEVERNb2RlbEltcGwgbW9kZWwsIFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihtb2RlbCwgbGFiZWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJRFRETm9kZSBzZWxlY3RlZE5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZCgpOwotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVDb21tZW50KHNlbGVjdGVkTm9kZSwgIk5ld0NvbW1lbnQiLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTA4YTM2YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbGVtZW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuRFREVW5pcXVlTmFtZUhlbHBlcjsKLQotCi1wdWJsaWMgY2xhc3MgQWRkRWxlbWVudEFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIEFkZEVsZW1lbnRBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQkJRFRERmlsZSBkdGRGaWxlID0gZ2V0TW9kZWwoKS5nZXREVERGaWxlKCk7Ci0JCVN0cmluZyBlbGVtZW50TmFtZSA9IERURFVuaXF1ZU5hbWVIZWxwZXIuZ2V0VW5pcXVlRWxlbWVudE5hbWUoZHRkRmlsZSk7Ci0JCWR0ZEZpbGUuY3JlYXRlRWxlbWVudChzZWxlY3RlZE5vZGUsIGVsZW1lbnROYW1lLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMzAyNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5DTUdyb3VwTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRFRETW9kZWxJbXBsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBBZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJKChDTUdyb3VwTm9kZSkgbm9kZSkuYWRkQ2hpbGQoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBub2RlKS5hZGRDaGlsZCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gdXBkYXRlU2VsZWN0aW9uKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHJjID0gc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKHNlbGVjdGlvbik7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgQ01Hcm91cE5vZGUpIHsKLQkJCXNldEVuYWJsZWQodHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRFbmFibGVkKGZhbHNlKTsKLQkJfQotCQlyZXR1cm4gcmM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkRW50aXR5QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIxNGJmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRFbnRpdHlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkRW50aXR5QWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkRW50aXR5QWN0aW9uKERURE1vZGVsSW1wbCBtb2RlbCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKG1vZGVsLCBsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVEROb2RlIHNlbGVjdGVkTm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0KLQkJZ2V0TW9kZWwoKS5nZXREVERGaWxlKCkuY3JlYXRlRW50aXR5KHNlbGVjdGVkTm9kZSwgIk5ld0VudGl0eSIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCS8vIG5ld0VsZW1lbnQuc2V0TmFtZShEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZUVsZW1lbnROYW1lKGR0ZEZpbGUpKTsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJlNmU4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCi0JcHVibGljIEFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0KLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJKChDTUdyb3VwTm9kZSkgbm9kZSkuYWRkR3JvdXAoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJKChFbGVtZW50KSBub2RlKS5hZGRHcm91cCgpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkTm90YXRpb25BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0FkZE5vdGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMWYwNzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkTm90YXRpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLQotcHVibGljIGNsYXNzIEFkZE5vdGF0aW9uQWN0aW9uIGV4dGVuZHMgQmFzZUFjdGlvbiB7Ci0KLQlwdWJsaWMgQWRkTm90YXRpb25BY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQotCQlnZXRNb2RlbCgpLmdldERUREZpbGUoKS5jcmVhdGVOb3RhdGlvbihzZWxlY3RlZE5vZGUsICJOZXdOb3RhdGlvbiIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gbmV3Tm90YXRpb24uc2V0TmFtZShEVERVbmlxdWVOYW1lSGVscGVyLmdldFVuaXF1ZU5vdGF0aW9uTmFtZShkdGRGaWxlKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzODg5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVERGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLnV0aWwuTGFiZWxWYWx1ZVBhaXI7Ci0KLQotcHVibGljIGNsYXNzIEFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbiBleHRlbmRzIEJhc2VBY3Rpb24gewotCXB1YmxpYyBBZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZpcnN0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHkoRFRERmlsZSBkdGRGaWxlKSB7Ci0JCUxhYmVsVmFsdWVQYWlyW10gZnJlZUV4dGVybmFsRW50aXRpZXMgPSBkdGRGaWxlLmdldERURE1vZGVsKCkuY3JlYXRlUGFybUVudGl0eUNvbnRlbnRJdGVtcyhudWxsKTsKLQotCQlpZiAoZnJlZUV4dGVybmFsRW50aXRpZXMubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIChTdHJpbmcpIGZyZWVFeHRlcm5hbEVudGl0aWVzWzBdLmZWYWx1ZTsKLQkJCS8vIHJldHVybiAoRW50aXR5KSBmcmVlRXh0ZXJuYWxFbnRpdGllc1swXS5mVmFsdWU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlEVERGaWxlIGR0ZEZpbGUgPSBnZXRNb2RlbCgpLmdldERUREZpbGUoKTsKLQkJU3RyaW5nIGV4dEVudGl0eSA9IGdldEZpcnN0RXh0ZXJuYWxQYXJhbWV0ZXJFbnRpdHkoZHRkRmlsZSk7Ci0JCURURE5vZGUgc2VsZWN0ZWROb2RlID0gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoKTsKLQkJaWYgKGV4dEVudGl0eSAhPSBudWxsKSB7Ci0JCQlkdGRGaWxlLmNyZWF0ZVBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShzZWxlY3RlZE5vZGUsIGV4dEVudGl0eSwgdHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlkdGRGaWxlLmNyZWF0ZVBhcmFtZXRlckVudGl0eVJlZmVyZW5jZShzZWxlY3RlZE5vZGUsICIlTmV3RW50aXR5UmVmZXJlbmNlOyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9CYXNlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ODczN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvQmFzZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQmFzZUFjdGlvbiBleHRlbmRzIFNlbGVjdGlvbkxpc3RlbmVyQWN0aW9uIHsKLQotCXByb3RlY3RlZCBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgY29udGV4dENvbnRyaWJ1dG9yOwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0KLQlwdWJsaWMgQmFzZUFjdGlvbihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKG1vZGVsLCB0ZXh0LCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgQmFzZUFjdGlvbihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcgdGV4dCwgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzYykgewotCQlzdXBlcih0ZXh0KTsKLQkJZk1vZGVsID0gbW9kZWw7Ci0JCXNldEltYWdlRGVzY3JpcHRvcihpbWFnZURlc2MpOwotCX0KLQotCXByb3RlY3RlZCBEVEROb2RlIGdldEZpcnN0Tm9kZVNlbGVjdGVkKCkgewotCQlyZXR1cm4gZ2V0Rmlyc3ROb2RlU2VsZWN0ZWQoZ2V0U3RydWN0dXJlZFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRFRETm9kZSBnZXRGaXJzdE5vZGVTZWxlY3RlZChJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQkvLyBEVEROb2RlIHJlZmVyZW5jZVBvaW50ID0gbnVsbDsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgZWxlbWVudCA9IGl0ZXIubmV4dCgpOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJcmV0dXJuIChEVEROb2RlKSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBEVERNb2RlbEltcGwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiAoRFRETW9kZWxJbXBsKSBmTW9kZWw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dENvbnRyaWJ1dG9yKElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvcikgewotCQljb250ZXh0Q29udHJpYnV0b3IgPSBjb250cmlidXRvcjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9jb250ZW50b3V0bGluZS9hY3Rpb25zL0RlbGV0ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmMDk0YjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvRGVsZXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuU2VsZWN0aW9uTGlzdGVuZXJBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwudXRpbC5EVERCYXRjaE5vZGVEZWxldGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBEZWxldGVBY3Rpb24gZXh0ZW5kcyBTZWxlY3Rpb25MaXN0ZW5lckFjdGlvbiB7Ci0KLQlwdWJsaWMgRGVsZXRlQWN0aW9uKFN0cmluZyBsYWJlbCkgewotCQlzdXBlcihsYWJlbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRTdHJ1Y3R1cmVkU2VsZWN0aW9uKCk7Ci0KLQkJSXRlcmF0b3IgaXRlciA9IHNlbGVjdGlvbi5pdGVyYXRvcigpOwotCQlEVERCYXRjaE5vZGVEZWxldGUgYmF0Y2hEZWxldGUgPSBudWxsOwotCQlEVERGaWxlIGR0ZEZpbGUgPSBudWxsOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCU9iamVjdCBlbGVtZW50ID0gaXRlci5uZXh0KCk7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERURE5vZGUpIHsKLQkJCQlEVEROb2RlIG5vZGUgPSAoRFRETm9kZSkgZWxlbWVudDsKLQkJCQlkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCQkJaWYgKGJhdGNoRGVsZXRlID09IG51bGwpIHsKLQkJCQkJYmF0Y2hEZWxldGUgPSBuZXcgRFREQmF0Y2hOb2RlRGVsZXRlKGR0ZEZpbGUpOwotCQkJCX0KLQkJCQliYXRjaERlbGV0ZS5hZGROb2RlKChEVEROb2RlKSBlbGVtZW50KTsKLQkJCX0KLQkJfQotCQlkdGRGaWxlLmdldERURE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgRFREVUlNZXNzYWdlcy5fVUlfTEFCRUxfRFREX0ZJTEVfREVMRVRFKTsgLy8kTk9OLU5MUy0xJAotCQliYXRjaERlbGV0ZS5kZWxldGVOb2Rlcyh0aGlzKTsKLQkJZHRkRmlsZS5nZXREVERNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiB1cGRhdGVTZWxlY3Rpb24oSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsKSB7Ci0JCWlmICghc3VwZXIudXBkYXRlU2VsZWN0aW9uKHNlbCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gc2VsLmdldEZpcnN0RWxlbWVudCgpOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVEROb2RlICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUgJiYgKChDTU5vZGUpIHNlbGVjdGVkT2JqZWN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKSkgewotCQkJc2V0RW5hYmxlZCh0cnVlKTsKLQkJCXJldHVybiB0cnVlOyAvLyBlbmFibGUgZGVsZXRlIG1lbnUgaXRlbQotCQl9Ci0JCWVsc2UgewotCQkJc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm4gZmFsc2U7IC8vIGRpc2FibGUgaXQgLSBncmV5IG91dAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL2FjdGlvbnMvUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUyMzk2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvY29udGVudG91dGxpbmUvYWN0aW9ucy9SZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5EVEROb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24gZXh0ZW5kcyBCYXNlQWN0aW9uIHsKLQotCXB1YmxpYyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24oRFRETW9kZWxJbXBsIG1vZGVsLCBTdHJpbmcgbGFiZWwpIHsKLQkJc3VwZXIobW9kZWwsIGxhYmVsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCURURE5vZGUgbm9kZSA9IGdldEZpcnN0Tm9kZVNlbGVjdGVkKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJQ01Ob2RlIGNvbnRlbnRNb2RlbCA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0Q29udGVudE1vZGVsKCk7Ci0JCQlpZiAoQ01Ob2RlLkVNUFRZLmVxdWFscyhjb250ZW50TW9kZWwuZ2V0VHlwZSgpKSkgewotCQkJCWdldE1vZGVsKCkuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VGV4dCgpKTsKLQkJCQkoKEVsZW1lbnQpIG5vZGUpLnJlcGxhY2VDb250ZW50TW9kZWwodGhpcywgIigpIik7IC8vJE5PTi1OTFMtMSQKLQkJCQlnZXRNb2RlbCgpLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHVwZGF0ZVNlbGVjdGlvbihJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJYm9vbGVhbiByYyA9IHN1cGVyLnVwZGF0ZVNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQlEVEROb2RlIG5vZGUgPSBnZXRGaXJzdE5vZGVTZWxlY3RlZChzZWxlY3Rpb24pOwotCQlzZXRFbmFibGVkKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KTsKLQkJcmV0dXJuIHJjOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS9pbnRlcm5hbC92aWV3cy9wcm9wZXJ0aWVzL0RURFByb3BlcnR5U291cmNlQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmOTAwOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkN1c3RvbVByb3BlcnR5RGVzY3JpcHRvcjsKLQotCi0vKioKLSAqIEFuIElQcm9wZXJ0eVNvdXJjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYSBKRmFjZSB2aWV3ZXIgdXNlZCB0byBkaXNwbGF5Ci0gKiBwcm9wZXJ0aWVzIG9mIERPTSBub2Rlcy4gUmVxdWlyZXMgYW4gYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBKRmFjZQotICogYWRhcHRlcnMgZm9yIHRoZSBub2RlcyBpbiB0aGUgdHJlZS4KLSAqLwotcHVibGljIGNsYXNzIERURFByb3BlcnR5U291cmNlQWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciwgSVByb3BlcnR5U291cmNlIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBDQVRFR09SWV9BVFRSSUJVVEVTID0gIkF0dHJpYnV0ZXMiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfTkFNRSA9IERURFVJTWVzc2FnZXMuRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSURfVEVYVCA9IERURFVJTWVzc2FnZXMuRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyXzE7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yW10gZkRlc2NyaXB0b3JzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSU5vZGVOb3RpZmllciBmTm9kZSA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RhY2sgZlZhbHVlc0JlaW5nU2V0ID0gbmV3IFN0YWNrKCk7Ci0KLQlwdWJsaWMgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCXN1cGVyKCk7Ci0JCWZOb2RlID0gdGFyZ2V0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IgbmFtZURlc2NyaXB0b3IgPSBuZXcgQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yKElEX05BTUUsIElEX05BTUUsIG51bGwpOwotCQluYW1lRGVzY3JpcHRvci5zZXRDYXRlZ29yeShEVERVSU1lc3NhZ2VzLkRURFByb3BlcnR5U291cmNlQWRhcHRlcl8yKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IgY29udGVudERlc2NyaXB0b3IgPSBuZXcKLQkJLy8gQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yKElEX1RFWFQsIElEX1RFWFQsIG51bGwpOwotCQkvLyBjb250ZW50RGVzY3JpcHRvci5zZXRDYXRlZ29yeSgiQXR0cmlidXRlcyIpOwotCQlyZXR1cm4gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3JbXXtuYW1lRGVzY3JpcHRvcn07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHZhbHVlIGZvciB0aGlzIE5vZGUgdGhhdCBjYW4gYmUgZWRpdHRlZCBpbiBhIHByb3BlcnR5IHNoZWV0LgotCSAqIAotCSAqIEByZXR1cm4gYSB2YWx1ZSB0aGF0IGNhbiBiZSBlZGl0dGVkCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRFZGl0YWJsZVZhbHVlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gb2YgcHJvcGVydHkgZGVzY3JpcHRvcnMuCi0JICogCi0JICogQHJldHVybiBhbGwgdmFsaWQgZGVzY3JpcHRvcnMuCi0JICovCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlpZiAoZkRlc2NyaXB0b3JzID09IG51bGwgfHwgZkRlc2NyaXB0b3JzLmxlbmd0aCA9PSAwKSB7Ci0JCQlmRGVzY3JpcHRvcnMgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCk7Ci0JCX0KLQkJcmV0dXJuIGZEZXNjcmlwdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2dldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKSB7Ci0JCU9iamVjdCB2YWx1ZSA9IG51bGw7Ci0JCWlmIChpZC5lcXVhbHMoSURfTkFNRSkgJiYgZk5vZGUgaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQl2YWx1ZSA9ICgoRFRETm9kZSkgZk5vZGUpLmdldE5hbWUoKTsKLQkJfQotCQlpZiAoaWQuZXF1YWxzKElEX1RFWFQpICYmIGZOb2RlIGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJdmFsdWUgPSAoKERURE5vZGUpIGZOb2RlKS5nZXRGdWxsTm9kZVRleHQoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IElQcm9wZXJ0eVNvdXJjZS5jbGFzczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlI2lzUHJvcGVydHlTZXQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZSNyZXNldFByb3BlcnR5VmFsdWUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZU9iamVjdCwgT2JqZWN0IHZhbHVlKSB7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvdmlld3MvcHJvcGVydGllcy9EVERQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NjA2YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3ZpZXdzL3Byb3BlcnRpZXMvRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLnByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotCi1wdWJsaWMgY2xhc3MgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCi0JcHVibGljIERURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKElQcm9wZXJ0eVNvdXJjZS5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIERURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXksIGJvb2xlYW4gcmVnaXN0ZXJBZGFwdGVycykgewotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IERURFByb3BlcnR5U291cmNlQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJLy8gYXQgdGhlIG1vbWVudCwgb25seSBvbmUgaW1wbGVtZW50YXRpb24gZXhpc3RzCi0JCXJldHVybiBuZXcgRFREUHJvcGVydHlTb3VyY2VBZGFwdGVyKHRhcmdldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVkNzE1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5wZXJzaXN0ZW5jZS5UZW1wbGF0ZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VzVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5EVERVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzRFREOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLQotLyoqCi0gKiBUZW1wbGF0ZXMgcGFnZSBpbiBuZXcgZmlsZSB3aXphcmQuIEFsbG93cyB1c2VycyB0byBzZWxlY3QgYSBuZXcgZmlsZQotICogdGVtcGxhdGUgdG8gYmUgYXBwbGllZCBpbiBuZXcgZmlsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0RURC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMCwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0RGVzY3JpcHRpb24oRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzEpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSByZXNpemVzIHRoZSB0YWJsZSBzbyBubyBwaGFudG9tIGNvbHVtbnMgYXBwZWFyCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIGJ1dHRvbnMKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b25zCi0JICogQHBhcmFtIHRhYmxlCi0JICogICAgICAgICAgICB0aGUgdGFibGUKLQkgKiBAcGFyYW0gY29sdW1uMQotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4yCi0JICogICAgICAgICAgICB0aGUgc2Vjb25kIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4zCi0JICogICAgICAgICAgICB0aGUgdGhpcmQgY29sdW1uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgVGFibGUgdGFibGUsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIpIHsKLQkJcGFyZW50LmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBhcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQkJaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uCi0JCQkJCS8vIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0KLQkJCQlQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJCWlmIChvbGRTaXplLnggPiB3aWR0aCkgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucwotCQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGFuY2VzdG9yLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlIGNoZWNrYm94IGZvciB1c2VyIHRvIHVzZSBEVEQgVGVtcGxhdGUKLQkJZlVzZVRlbXBsYXRlQnV0dG9uID0gbmV3IEJ1dHRvbihwYXJlbnQsIFNXVC5DSEVDSyk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRUZXh0KERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgbGlua2VkIHRleHQgdG8ganVzdCB0byB0ZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfNik7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWxpbmsuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJbGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdGFibGUgdGhhdCBkaXNwbGF5cyB0ZW1wbGF0ZXMKLQkJVGFibGUgdGFibGUgPSBuZXcgVGFibGUoaW5uZXJQYXJlbnQsIFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS53aWR0aEhpbnQgPSBjb252ZXJ0V2lkdGhJbkNoYXJzVG9QaXhlbHMoMik7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMTApOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJdGFibGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQlUYWJsZUxheW91dCB0YWJsZUxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCQl0YWJsZS5zZXRMYXlvdXQodGFibGVMYXlvdXQpOwotCi0JCVRhYmxlQ29sdW1uIGNvbHVtbjEgPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIFNXVC5OT05FKTsKLQkJY29sdW1uMS5zZXRUZXh0KERURFVJTWVzc2FnZXMuTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZV8yKTsKLQotCQlUYWJsZUNvbHVtbiBjb2x1bW4yID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCWNvbHVtbjIuc2V0VGV4dChEVERVSU1lc3NhZ2VzLk5ld0RURFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iamVjdDEsIG9iamVjdDIpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVWaWV3ZXJJbnB1dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdmlld2VyIHRoYXQgZGlzcGxheXMgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlJ3MgY29udGVudHMKLQkJZlBhdHRlcm5WaWV3ZXIgPSBkb0NyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCWZUZW1wbGF0ZVN0b3JlID0gRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKTsKLQkJZlRhYmxlVmlld2VyLnNldElucHV0KGZUZW1wbGF0ZVN0b3JlKTsKLQotCQljb25maWd1cmVUYWJsZVJlc2l6aW5nKGlubmVyUGFyZW50LCB0YWJsZSwgY29sdW1uMSwgY29sdW1uMik7Ci0JCWxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuRFREX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXNldENvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCBjb25maWd1cmVzIGFuZCByZXR1cm5zIGEgc291cmNlIHZpZXdlciB0byBwcmVzZW50IHRoZSB0ZW1wbGF0ZQotCSAqIHBhdHRlcm4gb24gdGhlIHByZWZlcmVuY2UgcGFnZS4gQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhCi0JICogY3VzdG9tIHNvdXJjZSB2aWV3ZXIgZmVhdHVyaW5nIGUuZy4gc3ludGF4IGNvbG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gYSBjb25maWd1cmVkIHNvdXJjZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREOwotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkRURCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoRFREVUlNZXNzYWdlcy5OZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlXzUpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBjcmVhdGVWaWV3ZXIocGFyZW50KTsKLQkJdmlld2VyLnNldEVkaXRhYmxlKGZhbHNlKTsKLQotCQlDb250cm9sIGNvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLmhlaWdodEhpbnQgPSBjb252ZXJ0SGVpZ2h0SW5DaGFyc1RvUGl4ZWxzKDUpOwotCQljb250cm9sLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBFbmFibGUvZGlzYWJsZSBjb250cm9scyBpbiBwYWdlIGJhc2VkIG9uIGZVc2VUZW1wbGF0ZUJ1dHRvbidzIGN1cnJlbnQKLQkgKiBzdGF0ZS4KLQkgKi8KLQl2b2lkIGVuYWJsZVRlbXBsYXRlcygpIHsKLQkJYm9vbGVhbiBlbmFibGVkID0gZlVzZVRlbXBsYXRlQnV0dG9uLmdldFNlbGVjdGlvbigpOwotCi0JCWlmICghZW5hYmxlZCkgewotCQkJLy8gc2F2ZSBsYXN0IHNlbGVjdGVkIHRlbXBsYXRlCi0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQllbHNlCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCWZUYWJsZVZpZXdlci5zZXRTZWxlY3Rpb24obnVsbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzZXRTZWxlY3RlZFRlbXBsYXRlKGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUpOwotCQl9Ci0KLQkJZlRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmUGF0dGVyblZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIHRlbXBsYXRlIHByZWZlcmVuY2UgcGFnZSBpZAotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlkKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMuZHRkLnRlbXBsYXRlcyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0ZW1wbGF0ZS4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZSBnZXRTZWxlY3RlZFRlbXBsYXRlKCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgZlRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCXRlbXBsYXRlID0gKFRlbXBsYXRlKSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIHRlbXBsYXRlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGVtcGxhdGUgc3RyaW5nIHRvIGluc2VydC4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0byBpbnNlcnQgb3IgbnVsbCBpZiBub25lIGlzIHRvIGJlIGluc2VydGVkCi0JICovCi0JU3RyaW5nIGdldFRlbXBsYXRlU3RyaW5nKCkgewotCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBudWxsOwotCi0JCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLmdldENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGR0ZCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdGVtcGxhdGVTdHJpbmc7Ci0JfQotCi0Jdm9pZCBsaW5rQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHBhZ2VJZCA9IGdldFByZWZlcmVuY2VQYWdlSWQoKTsKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCQlmVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qKgotCSAqIExvYWQgdGhlIGxhc3QgdGVtcGxhdGUgbmFtZSB1c2VkIGluIE5ldyBEVEQgRmlsZSB3aXphcmQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9IERURFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoRFREVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSk7Ci0JCWlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCB8fCB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPT0gMCkgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZU5hbWU7Ci0JCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZVRlbXBsYXRlcygpOwotCX0KLQotCS8qKgotCSAqIFNhdmUgdGVtcGxhdGUgbmFtZSB1c2VkIGZvciBuZXh0IGNhbGwgdG8gTmV3IERURCBGaWxlIHdpemFyZC4KLQkgKi8KLQl2b2lkIHNhdmVMYXN0U2F2ZWRQcmVmZXJlbmNlcygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQl0ZW1wbGF0ZU5hbWUgPSB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCX0KLQotCQlEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoRFREVUlQcmVmZXJlbmNlTmFtZXMuTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSwgdGVtcGxhdGVOYW1lKTsKLQkJRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCBhIHRlbXBsYXRlIGluIHRoZSB0YWJsZSB2aWV3ZXIgZ2l2ZW4gdGhlIHRlbXBsYXRlIG5hbWUuIElmCi0JICogdGVtcGxhdGUgbmFtZSBjYW5ub3QgYmUgZm91bmQgb3IgdGVtcGxhdGVOYW1lIGlzIG51bGwsIGp1c3Qgc2VsZWN0Ci0JICogZmlyc3QgaXRlbSBpbiB0YWJsZS4gSWYgbm8gaXRlbXMgaW4gdGFibGUgc2VsZWN0IG5vdGhpbmcuCi0JICogCi0JICogQHBhcmFtIHRlbXBsYXRlTmFtZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFRlbXBsYXRlKFN0cmluZyB0ZW1wbGF0ZU5hbWUpIHsKLQkJT2JqZWN0IHRlbXBsYXRlID0gbnVsbDsKLQotCQlpZiAodGVtcGxhdGVOYW1lICE9IG51bGwgJiYgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCkgewotCQkJLy8gcGljayB0aGUgbGFzdCB1c2VkIHRlbXBsYXRlCi0JCQl0ZW1wbGF0ZSA9IGZUZW1wbGF0ZVN0b3JlLmZpbmRUZW1wbGF0ZSh0ZW1wbGF0ZU5hbWUsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNEVEQuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL2ludGVybmFsL3dpemFyZC9OZXdEVERXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGUwOTc4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0RURFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLldpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFREQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuRFREQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckRURDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotcHVibGljIGNsYXNzIE5ld0RURFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCXByaXZhdGUgV2l6YXJkTmV3RmlsZUNyZWF0aW9uUGFnZSBmTmV3RmlsZVBhZ2U7Ci0JcHJpdmF0ZSBOZXdEVERUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGUgZkNvbnRlbnRUeXBlOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIEFkZHMgZGVmYXVsdCBleHRlbnNpb24gdG8gdGhlIGZpbGVuYW1lCi0JICogCi0JICogQHBhcmFtIGZpbGVuYW1lCi0JICogQHJldHVybgotCSAqLwotCVN0cmluZyBhZGREZWZhdWx0RXh0ZW5zaW9uKFN0cmluZyBmaWxlbmFtZSkgewotCQlTdHJpbmdCdWZmZXIgbmV3RmlsZU5hbWUgPSBuZXcgU3RyaW5nQnVmZmVyKGZpbGVuYW1lKTsKLQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gRFREQ29yZVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhEVERDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgY29udGVudCB0eXBlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5ldyBmaWxlIHdpemFyZAotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRUeXBlCi0JICovCi0JSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yRFRELkNvbnRlbnRUeXBlSURfRFREKTsKLQkJcmV0dXJuIGZDb250ZW50VHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zIGZvciBEVEQgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCUxpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCQlmVmFsaWRFeHRlbnNpb25zID0gbmV3IEFycmF5TGlzdChBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RmlsZVNwZWNzKElDb250ZW50VHlwZS5GSUxFX0VYVEVOU0lPTl9TUEVDKSkpOwotCQl9Ci0JCXJldHVybiBmVmFsaWRFeHRlbnNpb25zOwotCX0KLQotCS8qKgotCSAqIFZlcmlmaWVzIGlmIGZpbGVOYW1lIGlzIHZhbGlkIG5hbWUgZm9yIGNvbnRlbnQgdHlwZS4gVGFrZXMgYmFzZSBjb250ZW50Ci0JICogdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkgKi8KLQlib29sZWFuIGV4dGVuc2lvblZhbGlkRm9yQ29udGVudFR5cGUoU3RyaW5nIGZpbGVOYW1lKSB7Ci0JCWJvb2xlYW4gdmFsaWQgPSBmYWxzZTsKLQotCQlJQ29udGVudFR5cGUgdHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0JCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCS8vIGNoZWNrIHdoYXQgY29udGVudCB0eXBlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgZXh0ZW5zaW9uCi0JCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZU5hbWUpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQkJdmFsaWQgPSB0eXBlc1tpXS5pc0tpbmRPZih0eXBlKTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJdmFsaWQgPSB0cnVlOyAvLyBubyBleHRlbnNpb24gc28gdmFsaWQKLQkJcmV0dXJuIHZhbGlkOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UoIkRURFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UiLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJREUuY29tcHV0ZVNlbGVjdGVkUmVzb3VyY2VzKGZTZWxlY3Rpb24pKSkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm90ZWN0ZWQgYm9vbGVhbiB2YWxpZGF0ZVBhZ2UoKSB7Ci0JCQkJU3RyaW5nIGZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpIHsKLQkJCQkJLy8gY2hlY2sgdGhhdCBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGludmFsaWQgZXh0ZW5zaW9uCi0JCQkJCWlmICghZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShmaWxlTmFtZSkpIHsKLQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChEVERVSU1lc3NhZ2VzLl9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9EVEQsIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCQkJCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gY2hlY2sgYWRkaW5nIGRlZmF1bHQKLQkJCQkJLy8gZXh0ZW5zaW9uIGRvZXNuJ3QgZXF1YWwgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMKLQkJCQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGFkZERlZmF1bHRFeHRlbnNpb24oZmlsZU5hbWUpOwotCQkJCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZnVsbFBhdGguYXBwZW5kKG5ld0ZpbGVOYW1lKTsKLQotCQkJCQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCQkJCQlJU3RhdHVzIHJlc3VsdCA9IHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocmVzb3VyY2VQYXRoLnRvU3RyaW5nKCksIElSZXNvdXJjZS5GT0xERVIpOwotCQkJCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCQkJLy8gcGF0aCBpbnZhbGlkCi0JCQkJCQkJc2V0RXJyb3JNZXNzYWdlKHJlc3VsdC5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKCh3b3Jrc3BhY2UuZ2V0Um9vdCgpLmdldEZvbGRlcihyZXNvdXJjZVBhdGgpLmV4aXN0cygpIHx8IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0RmlsZShyZXNvdXJjZVBhdGgpLmV4aXN0cygpKSkgewotCQkJCQkJCXNldEVycm9yTWVzc2FnZShEVERVSU1lc3NhZ2VzLlJlc291cmNlR3JvdXBfbmFtZUV4aXN0cyk7Ci0JCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlyZXR1cm4gc3VwZXIudmFsaWRhdGVQYWdlKCk7Ci0JCQl9Ci0JCX07Ci0JCWZOZXdGaWxlUGFnZS5zZXRUaXRsZShEVERVSU1lc3NhZ2VzLl9VSV9DUkVBVEVfTkVXX0RURF9GSUxFKTsKLQkJZk5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKERURFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfRFREX0VYUEwpOwotCi0JCWFkZFBhZ2UoZk5ld0ZpbGVQYWdlKTsKLQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2UgPSBuZXcgTmV3RFREVGVtcGxhdGVzV2l6YXJkUGFnZSgpOwotCQlhZGRQYWdlKGZOZXdGaWxlVGVtcGxhdGVzUGFnZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIGFXb3JrYmVuY2gsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGFTZWxlY3Rpb24pIHsKLQkJZlNlbGVjdGlvbiA9IGFTZWxlY3Rpb247Ci0JCXNldFdpbmRvd1RpdGxlKERURFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfRFREX1RJVExFKTsgLy8kTk9OLU5MUy0xJAotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19XSVpCQU5fTkVXRFRERklMRSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlib29sZWFuIHBlcmZvcm1lZE9LID0gZmFsc2U7Ci0KLQkJLy8gc2F2ZSB1c2VyIG9wdGlvbnMgZm9yIG5leHQgdXNlCi0JCWZOZXdGaWxlVGVtcGxhdGVzUGFnZS5zYXZlTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBubyBmaWxlIGV4dGVuc2lvbiBzcGVjaWZpZWQgc28gYWRkIGRlZmF1bHQgZXh0ZW5zaW9uCi0JCVN0cmluZyBmaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5nZXRGaWxlTmFtZSgpOwotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSA9PSAtMSkgewotCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQlmTmV3RmlsZVBhZ2Uuc2V0RmlsZU5hbWUobmV3RmlsZU5hbWUpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIGEgbmV3IGVtcHR5IGZpbGUKLQkJSUZpbGUgZmlsZSA9IGZOZXdGaWxlUGFnZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLQkJLy8gaWYgdGhlcmUgd2FzIHByb2JsZW0gd2l0aCBjcmVhdGluZyBmaWxlLCBpdCB3aWxsIGJlIG51bGwsIHNvIG1ha2UKLQkJLy8gc3VyZSB0byBjaGVjawotCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkvLyBwdXQgdGVtcGxhdGUgY29udGVudHMgaW50byBmaWxlCi0JCQlTdHJpbmcgdGVtcGxhdGVTdHJpbmcgPSBmTmV3RmlsZVRlbXBsYXRlc1BhZ2UuZ2V0VGVtcGxhdGVTdHJpbmcoKTsKLQkJCWlmICh0ZW1wbGF0ZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoZSBlbmNvZGluZyBmb3IgdGhlIG5ldyBmaWxlCi0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IERURENvcmVQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkJCVN0cmluZyBjaGFyU2V0ID0gcHJlZmVyZW5jZS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCi0JCQkJdHJ5IHsKLQkJCQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLQkJCQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG51bGw7Ci0JCQkJCWlmIChjaGFyU2V0ID09IG51bGwgfHwgY2hhclNldC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkvLyBqdXN0IHVzZSBkZWZhdWx0IGVuY29kaW5nCi0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgY2hhclNldCk7Ci0JCQkJCX0KLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKHRlbXBsYXRlU3RyaW5nKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5jbG9zZSgpOwotCQkJCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCQkJCWZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIGZhbHNlLCBudWxsKTsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIGNvbnRlbnRzIGZvciBuZXcgRFREIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U4NzE3My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLk9iamVjdFRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLlZpZXdlckRyYWdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLlZpZXdlckRyb3BBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5EVERNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmRuZC5EVEREcmFnQW5kRHJvcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBDb25maWd1cmF0aW9uIGZvciBvdXRsaW5lIHZpZXcgcGFnZSB3aGljaCBzaG93cyBEVEQgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIElDb250ZW50UHJvdmlkZXIgZkNvbnRlbnRQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTGFiZWxQcm92aWRlciBmTGFiZWxQcm92aWRlciA9IG51bGw7Ci0KLQlwcml2YXRlIERURENvbnRleHRNZW51SGVscGVyIGZNZW51SGVscGVyOwotCXByaXZhdGUgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXSBmVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzOwotCXByaXZhdGUgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCXByaXZhdGUgTWFwIGZWaWV3ZXJDb250cmlidXRpb25zOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9VVExJTkVfT1JERVJfUFJFRiA9ICJvdXRsaW5lLW9yZGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9VVExJTkVfU09SVF9QUkVGID0gIm91dGxpbmUtc29ydCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIERURENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCQlmVmlld2VyQ29udHJpYnV0aW9ucyA9IG5ldyBIYXNoTWFwKDIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jY3JlYXRlVG9vbGJhckNvbnRyaWJ1dGlvbnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUFzc2VydC5pc1RydWUoZ2V0Q29udGVudFByb3ZpZGVyKHZpZXdlcikgaW5zdGFuY2VvZiBEVERUcmVlQ29udGVudFByb3ZpZGVyLCAiaW52YWxpZCBjb250ZW50IHByb3ZpZGVyIG9uIHZpZXdlciIpOyAvLyROT04tTkxTLTEkCi0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBzdXBlci5jcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCi0JCVNvcnRBY3Rpb24gc29ydEFjdGlvbiA9IG5ldyBTb3J0QWN0aW9uKHZpZXdlciwgRFREVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX1NPUlRfUFJFRik7Ci0JCU9yZGVyQWN0aW9uIG9yZGVyQWN0aW9uID0gbmV3IE9yZGVyQWN0aW9uKHZpZXdlciwgKERURFRyZWVDb250ZW50UHJvdmlkZXIpIGdldENvbnRlbnRQcm92aWRlcih2aWV3ZXIpLCBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfT1JERVJfUFJFRik7Ci0JCUlDb250cmlidXRpb25JdGVtIHNvcnRJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShzb3J0QWN0aW9uKTsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gb3JkZXJJdGVtID0gbmV3IFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbShvcmRlckFjdGlvbik7Ci0KLQkJaWYgKGl0ZW1zID09IG51bGwpIHsKLQkJCWl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtWzJdOwotCQkJaXRlbXNbMF0gPSBzb3J0SXRlbTsKLQkJCWl0ZW1zWzFdID0gb3JkZXJJdGVtOwotCQl9Ci0JCWVsc2UgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjb21iaW5lZEl0ZW1zID0gbmV3IElDb250cmlidXRpb25JdGVtW2l0ZW1zLmxlbmd0aCArIDJdOwotCQkJY29tYmluZWRJdGVtc1swXSA9IHNvcnRJdGVtOwotCQkJY29tYmluZWRJdGVtc1sxXSA9IG9yZGVySXRlbTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaXRlbXMsIDAsIGNvbWJpbmVkSXRlbXMsIDIsIGl0ZW1zLmxlbmd0aCk7Ci0JCQlpdGVtcyA9IGNvbWJpbmVkSXRlbXM7Ci0JCX0KLQkJcmV0dXJuIGl0ZW1zOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0Q29udGVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZDb250ZW50UHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkNvbnRlbnRQcm92aWRlciA9IG5ldyBEVERUcmVlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJLy8gcmV0dXJuIHN1cGVyLmdldENvbnRlbnRQcm92aWRlcih2aWV3ZXIpOwotCQlyZXR1cm4gZkNvbnRlbnRQcm92aWRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldExhYmVsUHJvdmlkZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJTGFiZWxQcm92aWRlciBnZXRMYWJlbFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmTGFiZWxQcm92aWRlciA9PSBudWxsKSB7Ci0JCQlmTGFiZWxQcm92aWRlciA9IG5ldyBEVERMYWJlbFByb3ZpZGVyKCk7Ci0JCX0KLQkJLy8gcmV0dXJuIHN1cGVyLmdldExhYmVsUHJvdmlkZXIodmlld2VyKTsKLQkJcmV0dXJuIGZMYWJlbFByb3ZpZGVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0TWVudUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSU1lbnVMaXN0ZW5lciBnZXRNZW51TGlzdGVuZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJSU1lbnVMaXN0ZW5lciBsaXN0ZW5lciA9IG51bGw7Ci0JCWlmIChmTWVudUhlbHBlciA9PSBudWxsICYmIHZpZXdlci5nZXRJbnB1dCgpIGluc3RhbmNlb2YgRFRETW9kZWxJbXBsKSB7Ci0JCQlmTWVudUhlbHBlciA9IG5ldyBEVERDb250ZXh0TWVudUhlbHBlcigoRFRETW9kZWxJbXBsKSB2aWV3ZXIuZ2V0SW5wdXQoKSk7Ci0JCQlmTWVudUhlbHBlci5jcmVhdGVNZW51TGlzdGVuZXJzRm9yKHZpZXdlcik7Ci0JCX0KLQkJaWYgKGZNZW51SGVscGVyICE9IG51bGwpIHsKLQkJCWxpc3RlbmVyID0gZk1lbnVIZWxwZXIuZ2V0TWVudUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3RlbmVyOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBEVERVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyhUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJLy8gZW11bGF0ZSB0aGUgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyCi0JCQlmaW5hbCBWaWV3ZXJEcmFnQWRhcHRlciBkcmFnQWRhcHRlciA9IG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih0cmVlVmlld2VyKTsKLQkJCWZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPSBuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXXtuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlkcmFnQWRhcHRlci5kcmFnRmluaXNoZWQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlkcmFnQWRhcHRlci5kcmFnU2V0RGF0YShldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlkcmFnQWRhcHRlci5kcmFnU3RhcnQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLQkJCQkJcmV0dXJuIE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQkJfQotCQkJfX07Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkvLyBlbXVsYXRlIHRoZSBYTUxEcmFnQW5Ecm9wTWFuYWdlcgotCQkJZmluYWwgVmlld2VyRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIgPSBuZXcgVmlld2VyRHJvcEFkYXB0ZXIodHJlZVZpZXdlciwgbmV3IERURERyYWdBbmREcm9wTWFuYWdlcigpKTsKLQkJCWZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMgPSBuZXcgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXXtuZXcgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlkcm9wQWRhcHRlci5kcmFnRW50ZXIoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJhZ0xlYXZlKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJhZ09wZXJhdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlkcm9wQWRhcHRlci5kcmFnT3ZlcihldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJvcChldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJvcEFjY2VwdChldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQkJCQlyZXR1cm4gT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBnZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpOwotCQkJCX0KLQkJCX19OwotCQl9Ci0JCXJldHVybiBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jdW5jb25maWd1cmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKHZpZXdlcik7Ci0JCWZWaWV3ZXJDb250cmlidXRpb25zLnJlbW92ZSh2aWV3ZXIpOwotCQlpZiAoZk1lbnVIZWxwZXIgIT0gbnVsbCkgewotCQkJZk1lbnVIZWxwZXIucmVtb3ZlTWVudUxpc3RlbmVyc0Zvcih2aWV3ZXIpOwotCQkJZk1lbnVIZWxwZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURENvbnRleHRNZW51SGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGV4dE1lbnVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmYzZiYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREQ29udGV4dE1lbnVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuQ01Hcm91cE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwucGFyc2VyLkRURFJlZ2lvblR5cGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC51dGlsLkxhYmVsVmFsdWVQYWlyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuRFREVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLmVkaXRvci5EVERFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEF0dHJpYnV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkQXR0cmlidXRlTGlzdEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkQ29tbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkRWxlbWVudEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuQWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRFbnRpdHlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkFkZE5vdGF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwudmlld3MuY29udGVudG91dGxpbmUuYWN0aW9ucy5BZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC52aWV3cy5jb250ZW50b3V0bGluZS5hY3Rpb25zLkRlbGV0ZUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLnZpZXdzLmNvbnRlbnRvdXRsaW5lLmFjdGlvbnMuUmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uOwotCi0vKioKLSAqIE1lbnUgaGVscGVyIGZvciBDb250ZW50IE91dGxpbmUgcGFnZS4gVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgZWxzZXdoZXJlLgotICovCi1jbGFzcyBEVERDb250ZXh0TWVudUhlbHBlciB7Ci0JY2xhc3MgRFRETWVudUxpc3RlbmVyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJLy8gdXBkYXRlIHRoZSBhY3Rpb24gc2VsZWN0aW9uIG5vdwotCQkJYWRkTm90YXRpb25BY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEVudGl0eUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJYWRkRWxlbWVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJYWRkQ29tbWVudEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlkZWxldGVBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQkJCWFkZEF0dHJpYnV0ZUFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJYWRkQXR0cmlidXRlTGlzdEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZWxlY3Rpb25DaGFuZ2VkKGZWaWV3ZXJTZWxlY3Rpb24pOwotCQkJYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLnNlbGVjdGlvbkNoYW5nZWQoZlZpZXdlclNlbGVjdGlvbik7Ci0JCQlyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24uc2VsZWN0aW9uQ2hhbmdlZChmVmlld2VyU2VsZWN0aW9uKTsKLQotCi0JCQlpZiAoIWZWaWV3ZXJTZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJYWRkQWN0aW9uSXRlbXNGb3JTZWxlY3Rpb24oZlZpZXdlclNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKSwgbWFuYWdlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBWaWV3ZXJTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJX3NlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JQWRkQXR0cmlidXRlQWN0aW9uIGFkZEF0dHJpYnV0ZUFjdGlvbjsKLQotCUFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24gYWRkQXR0cmlidXRlTGlzdEFjdGlvbjsKLQlBZGRDb21tZW50QWN0aW9uIGFkZENvbW1lbnRBY3Rpb247Ci0JQWRkRWxlbWVudEFjdGlvbiBhZGRFbGVtZW50QWN0aW9uOwotCUFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbiBhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb247Ci0JQWRkRW50aXR5QWN0aW9uIGFkZEVudGl0eUFjdGlvbjsKLQlBZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uIGFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb247Ci0JQWRkTm90YXRpb25BY3Rpb24gYWRkTm90YXRpb25BY3Rpb247Ci0JQWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uIGFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbjsKLQlEZWxldGVBY3Rpb24gZGVsZXRlQWN0aW9uOwotCXByaXZhdGUgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBmSW50ZXJuYWxTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgVmlld2VyU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKTsKLQotCXByaXZhdGUgSU1lbnVMaXN0ZW5lciBmTWVudUxpc3RlbmVyOwotCXByaXZhdGUgRFRETW9kZWxJbXBsIGZNb2RlbDsKLQlwcml2YXRlIExpc3QgZlZpZXdlckxpc3Q7Ci0KLQlJU3RydWN0dXJlZFNlbGVjdGlvbiBmVmlld2VyU2VsZWN0aW9uID0gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQotCVJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbiByZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb247Ci0KLQlwdWJsaWMgRFREQ29udGV4dE1lbnVIZWxwZXIoRFRETW9kZWxJbXBsIG1vZGVsKSB7Ci0JCWZNb2RlbCA9IG1vZGVsOwotCQlmVmlld2VyTGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZNZW51TGlzdGVuZXIgPSBuZXcgRFRETWVudUxpc3RlbmVyKCk7Ci0KLQkJYWRkTm90YXRpb25BY3Rpb24gPSBuZXcgQWRkTm90YXRpb25BY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfRFREX05PVEFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQlhZGRFbnRpdHlBY3Rpb24gPSBuZXcgQWRkRW50aXR5QWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RURF9FTlRJVFkpOyAvLyROT04tTkxTLTEkCi0JCWFkZEVsZW1lbnRBY3Rpb24gPSBuZXcgQWRkRWxlbWVudEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9EVERfRUxFTUVOVCk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQ29tbWVudEFjdGlvbiA9IG5ldyBBZGRDb21tZW50QWN0aW9uKG1vZGVsLCBEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fQUREX0RURF9DT01NRU5UKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbiA9IG5ldyBBZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9BRERfUEFSQU1fRU5USVRZX1JFRik7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlQWN0aW9uID0gbmV3IERlbGV0ZUFjdGlvbihEVERVSU1lc3NhZ2VzLl9VSV9BQ1RJT05fRFREX0RFTEVURSk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQXR0cmlidXRlQWN0aW9uID0gbmV3IEFkZEF0dHJpYnV0ZUFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEUpOyAvLyROT04tTkxTLTEkCi0JCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24gPSBuZXcgQWRkQXR0cmlidXRlTGlzdEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9BVFRSSUJVVEVMSVNUKTsgLy8kTk9OLU5MUy0xJAotCi0JCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24gPSBuZXcgQWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0dST1VQX0FERF9HUk9VUCk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uID0gbmV3IEFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbihtb2RlbCwgRFREVUlNZXNzYWdlcy5fVUlfQUNUSU9OX0FERF9FTEVNRU5UKTsgLy8kTk9OLU5MUy0xJAotCi0JCXJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbiA9IG5ldyBSZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24obW9kZWwsIERURFVJTWVzc2FnZXMuX1VJX0FDVElPTl9HUk9VUF9BRERfR1JPVVApOyAvLyROT04tTkxTLTEkCi0KLQkJYWRkTm90YXRpb25BY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9OT1RBVElPTikpOwotCQlhZGRFbnRpdHlBY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FERF9FTlRJVFkpKTsKLQkJYWRkQ29tbWVudEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQUREX0NPTU1FTlQpKTsKLQkJYWRkUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfRU5USVRZX1JFRkVSRU5DRSkpOwotCi0JCS8vIFRyaS1zdGF0ZSBpbWFnZXMKLQkJYWRkRWxlbWVudEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfRUxFTUVOVCkpOwotCQlhZGRFbGVtZW50QWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0VMRU1FTlQpKTsKLQkJYWRkRWxlbWVudEFjdGlvbi5zZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0FERF9FTEVNRU5UKSk7Ci0KLQkJYWRkQXR0cmlidXRlQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0FERF9BVFRSSUJVVEUpKTsKLQkJYWRkQXR0cmlidXRlQWN0aW9uLnNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfQ1RPT0xfQUREX0FUVFJJQlVURSkpOwotCQlhZGRBdHRyaWJ1dGVBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0KLQkJYWRkQXR0cmlidXRlTGlzdEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0JCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0JCWFkZEF0dHJpYnV0ZUxpc3RBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfQVRUUklCVVRFKSk7Ci0KLQkJYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0JCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0JCWFkZEdyb3VwVG9Db250ZW50TW9kZWxBY3Rpb24uc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0KLQkJYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0FERF9FTEVNRU5UVE9DT05NT0RFTCkpOwotCQlhZGRFbGVtZW50VG9Db250ZW50TW9kZWxBY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19DVE9PTF9BRERfRUxFTUVOVFRPQ09OTU9ERUwpKTsKLQkJYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0VMRU1FTlRUT0NPTk1PREVMKSk7Ci0KLQkJLy8gdXNlIHRoZSBzYW1lIGltYWdlcyBhcyBhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uCi0JCXJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRFRERWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9BRERfR1JPVVBUT0NPTk1PREVMKSk7Ci0JCXJlcGxhY2VFbXB0eUNvbnRlbnRNb2RlbFdpdGhHcm91cEFjdGlvbi5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0NUT09MX0FERF9HUk9VUFRPQ09OTU9ERUwpKTsKLQkJcmVwbGFjZUVtcHR5Q29udGVudE1vZGVsV2l0aEdyb3VwQWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQUREX0dST1VQVE9DT05NT0RFTCkpOwotCX0KLQotCXZvaWQgX3NlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCS8qCi0JCSAqIFNhdmUgdGhlIHNlbGVjdGlvbiBzbyB3ZSBvbmx5IG5vdGlmeSB0aGUgYWN0aW9ucyB3aGVuIHRoZSBtZW51IGlzCi0JCSAqIHNob3duCi0JCSAqLwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZWaWV3ZXJTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJfQotCQllbHNlIHsKLQkJCWZWaWV3ZXJTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0JfQotCi0Jdm9pZCBhZGRBY3Rpb25JdGVtc0ZvclNlbGVjdGlvbihPYmplY3Qgc2VsZWN0ZWRPYmplY3QsIElNZW51TWFuYWdlciBtZW51KSB7Ci0JCWlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQkvLyBhZGQgYXBwcm9wcmlhdGUgbWVudSB0byBsb2dpY2FsIHZpZXcKLQkJCU5vZGVMaXN0IGZvbGRlciA9IChOb2RlTGlzdCkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQlpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLk5PVEFUSU9OX1RBRykpIHsKLQkJCQltZW51LmFkZChhZGROb3RhdGlvbkFjdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChmb2xkZXIuZ2V0TGlzdFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuRU5USVRZX1RBRykpIHsKLQkJCQltZW51LmFkZChhZGRFbnRpdHlBY3Rpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoZm9sZGVyLmdldExpc3RUeXBlKCkuZXF1YWxzKERURFJlZ2lvblR5cGVzLkVMRU1FTlRfVEFHKSkgewotCQkJCUxhYmVsVmFsdWVQYWlyW10gYXZhaWxhYmxlRW50aXRpZXMgPSBmTW9kZWwuY3JlYXRlUGFybUVudGl0eUNvbnRlbnRJdGVtcyhudWxsKTsKLQkJCQlhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24uc2V0RW5hYmxlZChhdmFpbGFibGVFbnRpdGllcy5sZW5ndGggPiAwKTsKLQotCQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRBY3Rpb24pOwotCQkJCW1lbnUuYWRkKGFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChmb2xkZXIuZ2V0TGlzdFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpKSB7Ci0JCQkJbWVudS5hZGQoYWRkQXR0cmlidXRlQWN0aW9uKTsKLQkJCX0KLQkJfQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVERGaWxlIHx8IHNlbGVjdGVkT2JqZWN0ID09IG51bGwpIHsKLQkJCUxhYmVsVmFsdWVQYWlyW10gYXZhaWxhYmxlRW50aXRpZXMgPSBmTW9kZWwuY3JlYXRlUGFybUVudGl0eUNvbnRlbnRJdGVtcyhudWxsKTsKLQkJCWFkZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZUFjdGlvbi5zZXRFbmFibGVkKGF2YWlsYWJsZUVudGl0aWVzLmxlbmd0aCA+IDApOwotCi0JCQltZW51LmFkZChhZGRFbGVtZW50QWN0aW9uKTsKLQkJCW1lbnUuYWRkKGFkZEVudGl0eUFjdGlvbik7Ci0JCQltZW51LmFkZChhZGROb3RhdGlvbkFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRQYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2VBY3Rpb24pOwotCQkJbWVudS5hZGQoYWRkQ29tbWVudEFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRBdHRyaWJ1dGVMaXN0QWN0aW9uKTsKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQlFbGVtZW50IGR0ZEVsZW1lbnQgPSAoRWxlbWVudCkgc2VsZWN0ZWRPYmplY3Q7Ci0KLQkJCUNNTm9kZSBjb250ZW50TW9kZWwgPSBkdGRFbGVtZW50LmdldENvbnRlbnRNb2RlbCgpOwotCQkJaWYgKGNvbnRlbnRNb2RlbCA9PSBudWxsKSB7Ci0JCQkJbWVudS5hZGQoYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCQkJbWVudS5hZGQoYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNvbnRlbnRNb2RlbCAhPSBudWxsICYmIENNTm9kZS5FTVBUWS5lcXVhbHMoY29udGVudE1vZGVsLmdldFR5cGUoKSkpIHsKLQkJCQltZW51LmFkZChyZXBsYWNlRW1wdHlDb250ZW50TW9kZWxXaXRoR3JvdXBBY3Rpb24pOwotCQkJfQotCQkJLy8gaWYgKCEoKChFbGVtZW50KXNlbGVjdGVkT2JqZWN0KS5nZXRDb250ZW50TW9kZWwoKSBpbnN0YW5jZW9mCi0JCQkvLyBDTUdyb3VwTm9kZSkpCi0JCQkvLyB7Ci0JCQkvLyBtZW51LmFkZChhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJCS8vIH0KLQkJCS8vIGFkZEF0dHJpYnV0ZUFjdGlvbi5zZXRFbGVtZW50KHNlbGVjdGVkT2JqZWN0KTsKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUFjdGlvbik7Ci0JCX0KLQkJZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTUdyb3VwTm9kZSkgewotCQkJLy8gYWRkRWxlbWVudFRvQ29udGVudE1vZGVsQWN0aW9uLnNldEVsZW1lbnQoc2VsZWN0ZWRPYmplY3QpOwotCQkJLy8gYWRkR3JvdXBUb0NvbnRlbnRNb2RlbEFjdGlvbi5zZXRFbGVtZW50KHNlbGVjdGVkT2JqZWN0KTsKLQkJCW1lbnUuYWRkKGFkZEVsZW1lbnRUb0NvbnRlbnRNb2RlbEFjdGlvbik7Ci0JCQltZW51LmFkZChhZGRHcm91cFRvQ29udGVudE1vZGVsQWN0aW9uKTsKLQkJfQotCQllbHNlIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCW1lbnUuYWRkKGFkZEF0dHJpYnV0ZUFjdGlvbik7Ci0JCX0KLQotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQlhZGRFZGl0QWN0aW9ucyhtZW51KTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBEVEROb2RlICYmICEoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBDTU5vZGUgJiYgKChDTU5vZGUpIHNlbGVjdGVkT2JqZWN0KS5pc1Jvb3RFbGVtZW50Q29udGVudCgpKSkgewotCQkJbWVudS5hZGQoZGVsZXRlQWN0aW9uKTsKLQkJCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJLy8gaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgRFRERWxlbWVudENvbnRlbnQpCi0JCQkvLyB7Ci0JCQkvLyBEVERFbGVtZW50Q29udGVudCBjb250ZW50ID0gKERUREVsZW1lbnRDb250ZW50KSBzZWxlY3RlZE9iamVjdDsKLQkJCS8vIGlmIChjb250ZW50LmdldEVsZW1lbnQoKSAhPSBudWxsICYmIChjb250ZW50IGluc3RhbmNlb2YKLQkJCS8vIERURFBDRGF0YUNvbnRlbnQgfHwgY29udGVudCBpbnN0YW5jZW9mIERUREVtcHR5Q29udGVudCkpCi0JCQkvLyB7Ci0JCQkvLyBkZWxldGVBY3Rpb24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQkvLyB9IC8vIGVuZCBvZiBpZiAoKQotCQkJLy8gfSAvLyBlbmQgb2YgaWYgKCkKLQkJfQotCX0KLQotCXZvaWQgYWRkRWRpdEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gbWVudS5hZGQodW5kb0FjdGlvbik7Ci0JCS8vIG1lbnUuYWRkKHJlZG9BY3Rpb24pOwotCQkvLyBtZW51LmFkZChuZXcgU2VwYXJhdG9yKCkpOwotCQkvLyBtZW51LmFkZChjdXRBY3Rpb24pOwotCQkvLyBtZW51LmFkZChjb3B5QWN0aW9uKTsKLQkJLy8gbWVudS5hZGQocGFzdGVBY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZU1lbnVMaXN0ZW5lcnNGb3IoVmlld2VyIHZpZXdlcikgewotCQl2aWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZJbnRlcm5hbFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCWZWaWV3ZXJTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJfQotCQllbHNlIHsKLQkJCWZWaWV3ZXJTZWxlY3Rpb24gPSBTdHJ1Y3R1cmVkU2VsZWN0aW9uLkVNUFRZOwotCQl9Ci0KLQkJZlZpZXdlckxpc3QuYWRkKHZpZXdlcik7Ci0JfQotCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKCkgewotCQlyZXR1cm4gZk1lbnVMaXN0ZW5lcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNZW51TGlzdGVuZXJzRm9yKFZpZXdlciB2aWV3ZXIpIHsKLQkJdmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmSW50ZXJuYWxTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQlmVmlld2VyTGlzdC5yZW1vdmUodmlld2VyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFRETGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0RURExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMwZDg3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFRETGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRERmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuRFRETm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci0KLWNsYXNzIERURExhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQotCXB1YmxpYyBEVERMYWJlbFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGZvciB0aGUgbGFiZWwgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IGZvciB3aGljaCB0byBwcm92aWRlIHRoZSBsYWJlbCBpbWFnZQotCSAqIEByZXR1cm4gdGhlIGltYWdlIHVzZWQgdG8gbGFiZWwgdGhlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICB0aGVzZSBpcyBubyBpbWFnZSBmb3IgdGhlIGdpdmVuIG9iamVjdAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJaW1hZ2UgPSAoKERURE5vZGUpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGVMaXN0KSB7Ci0JCQlpbWFnZSA9ICgoTm9kZUxpc3QpIGVsZW1lbnQpLmdldEltYWdlKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIERUREZpbGUpIHsKLQkJCWltYWdlID0gKChEVERGaWxlKSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2UgPSBzdXBlci5nZXRJbWFnZShlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBmb3IgdGhlIGxhYmVsIG9mIHRoZSBnaXZlbiBlbGVtZW50LgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gcHJvdmlkZSB0aGUgbGFiZWwgdGV4dAotCSAqIEByZXR1cm4gdGhlIHRleHQgc3RyaW5nIHVzZWQgdG8gbGFiZWwgdGhlIGVsZW1lbnQsIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGVzZSBpcyBubyB0ZXh0IGxhYmVsIGZvciB0aGUgZ2l2ZW4gb2JqZWN0Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJU3RyaW5nIG5hbWUgPSAoKERURE5vZGUpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQotCQkJLy8gc3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlICh1c2VmdWwgZm9yIG11bHRpLWxpbmUgY29tbWVudHMpCi0JCQlpbnQgZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA9IDA7Ci0JCQlpbnQgbGFzdFZpc2libGVDaGFyYWN0ZXIgPSBuYW1lLmxlbmd0aCgpIC0gMTsKLQkJCWZvciAoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA9IDA7IGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgPCBuYW1lLmxlbmd0aCgpOyBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyKyspIHsKLQkJCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UobmFtZS5jaGFyQXQoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlcikpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCS8vIGtlZXAgb25seSB0aGUgZmlyc3QgbGluZSBvZiB0ZXh0IGluIGEgbXVsdGktbGluZSBuYW1lCi0JCQlpZiAoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciA8IGxhc3RWaXNpYmxlQ2hhcmFjdGVyKSB7Ci0JCQkJZm9yIChsYXN0VmlzaWJsZUNoYXJhY3RlciA9IGZpcnN0U2lnbmlmaWNhbnRDaGFyYWN0ZXIgKyAxOyBsYXN0VmlzaWJsZUNoYXJhY3RlciA8IG5hbWUubGVuZ3RoKCk7IGxhc3RWaXNpYmxlQ2hhcmFjdGVyKyspIHsKLQkJCQkJY2hhciBjaGFyYWN0ZXIgPSBuYW1lLmNoYXJBdChsYXN0VmlzaWJsZUNoYXJhY3Rlcik7Ci0JCQkJCWlmIChjaGFyYWN0ZXIgPT0gJ1xyJyB8fCBjaGFyYWN0ZXIgPT0gJ1xuJykKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWlmIChmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyID4gMCAmJiBmaXJzdFNpZ25pZmljYW50Q2hhcmFjdGVyIDwgbmFtZS5sZW5ndGgoKSAtIDEpIHsKLQkJCQluYW1lID0gbmFtZS5zdWJzdHJpbmcoZmlyc3RTaWduaWZpY2FudENoYXJhY3RlciwgbGFzdFZpc2libGVDaGFyYWN0ZXIpOwotCQkJfQotCi0JCQlyZXR1cm4gbmFtZTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCS8vIHJldHVybiAoKE5vZGVMaXN0KSBlbGVtZW50KS5nZXRMaXN0VHlwZSgpOwotCQkJcmV0dXJuICgoTm9kZUxpc3QpIGVsZW1lbnQpLmdldE5hbWUoKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJcmV0dXJuICgoRFRERmlsZSkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvRFREVHJlZUNvbnRlbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2JmNTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9EVERUcmVlQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BYnN0cmFjdFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5BdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRUREZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkRURE5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLkVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLk5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZS5pbnRlcm5hbC5QYXJhbWV0ZXJFbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRURE1vZGVsSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuSURUREZpbGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUuaW50ZXJuYWwuZXZlbnQuTm9kZXNFdmVudDsKLQotY2xhc3MgRFREVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJRFRERmlsZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgT2JqZWN0IGZJbnB1dE9iamVjdDsKLQlwcm90ZWN0ZWQgVmlld2VyIGZWaWV3ZXI7Ci0KLQkvLyBBIGNhY2hlZCBzZXQgb2YgSW5kZXhlZE5vZGVMaXN0cywgcmVxdWlyZWQgZm9yIGdldFBhcmVudCB0byByZXR1cm4gdGhlCi0JLy8gY29ycmVjdCBpbnN0YW5jZXMgbWFwcGluZyB0byBUcmVlSXRlbXMKLQlwcm90ZWN0ZWQgT2JqZWN0W10gbG9naWNhbE5vZGVMaXN0cyA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvd0xvZ2ljYWxPcmRlciA9IGZhbHNlOwotCi0JcHVibGljIERURFRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZlZpZXdlciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGV4cGFuZFRvTm9kZShEVEROb2RlIG5vZGUpIHsKLQkJRFRERmlsZSBkdGRGaWxlID0gbm9kZS5nZXREVERGaWxlKCk7Ci0JCS8vIGZpcnN0IGV4cGFuZCB0aGUgcm9vdAotCQlBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyID0gKEFic3RyYWN0VHJlZVZpZXdlcikgZlZpZXdlcjsKLQkJdmlld2VyLmV4cGFuZFRvTGV2ZWwoZHRkRmlsZSwgMSk7Ci0JCU5vZGVMaXN0IGxpc3RUb0V4cGFuZCA9IG51bGw7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCB8fCBub2RlIGluc3RhbmNlb2YgUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlKSB7Ci0JCQlsaXN0VG9FeHBhbmQgPSBkdGRGaWxlLmdldEVsZW1lbnRzQW5kUGFyYW1ldGVyRW50aXR5UmVmZXJlbmNlcygpOwotCQl9Ci0JCWVsc2UgaWYgKG5vZGUgaW5zdGFuY2VvZiBOb3RhdGlvbikgewotCQkJbGlzdFRvRXhwYW5kID0gZHRkRmlsZS5nZXROb3RhdGlvbnMoKTsKLQkJfQotCQllbHNlIGlmIChub2RlIGluc3RhbmNlb2YgRW50aXR5KSB7Ci0JCQlsaXN0VG9FeHBhbmQgPSBkdGRGaWxlLmdldEVudGl0aWVzKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZSBpbnN0YW5jZW9mIENvbW1lbnQpIHsKLQkJCWxpc3RUb0V4cGFuZCA9IGR0ZEZpbGUuZ2V0Q29tbWVudHMoKTsKLQkJfQotCQlpZiAobGlzdFRvRXhwYW5kICE9IG51bGwpIHsKLQkJCXZpZXdlci5leHBhbmRUb0xldmVsKGxpc3RUb0V4cGFuZCwgMSk7Ci0JCX0KLQkJdmlld2VyLmV4cGFuZFRvTGV2ZWwobm9kZSwgMCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBwYXJlbnRFbGVtZW50KSB7Ci0JCS8vIHJldHVybiB0aGUgbGlzdHMgb2Ygbm9kZXMgd2hlbiBpbiBsb2dpY2FsIG9yZGVyIG1vZGUsIGFsbCB0aGUgTm9kZXMKLQkJLy8gb3RoZXJ3aXNlCi0JCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRFRERmlsZSkgewotCQkJaWYgKGlzU2hvd0xvZ2ljYWxPcmRlcigpKSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSB2aXNpYmxlIG5vZGUgbGlzdHMKLQkJCQlpZiAobG9naWNhbE5vZGVMaXN0cyA9PSBudWxsKSB7Ci0JCQkJCUl0ZXJhdG9yIG5vZGVMaXN0cyA9ICgoRFRERmlsZSkgcGFyZW50RWxlbWVudCkuZ2V0Tm9kZUxpc3RzKCkuaXRlcmF0b3IoKTsKLQkJCQkJTGlzdCB2aXNpYmxlTGlzdHMgPSBuZXcgQXJyYXlMaXN0KDcpOwotCQkJCQl3aGlsZSAobm9kZUxpc3RzLmhhc05leHQoKSkgewotCQkJCQkJTm9kZUxpc3QgbGlzdCA9IChOb2RlTGlzdCkgbm9kZUxpc3RzLm5leHQoKTsKLQkJCQkJCWlmIChpc1Zpc2libGVOb2RlTGlzdChsaXN0KSkgewotCQkJCQkJCXZpc2libGVMaXN0cy5hZGQobGlzdCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJbG9naWNhbE5vZGVMaXN0cyA9IHZpc2libGVMaXN0cy50b0FycmF5KCk7Ci0JCQkJfQotCQkJCXJldHVybiBsb2dpY2FsTm9kZUxpc3RzOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcmV0dXJuIHRoZSB2aXNpYmxlIG5vZGVzCi0JCQkJTGlzdCBhbGxOb2RlcyA9ICgoRFRERmlsZSkgcGFyZW50RWxlbWVudCkuZ2V0Tm9kZXMoKTsKLQkJCQlMaXN0IHZpc2libGVOb2RlcyA9IG5ldyBBcnJheUxpc3QoYWxsTm9kZXMuc2l6ZSgpKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE5vZGVzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCU9iamVjdCBvID0gYWxsTm9kZXMuZ2V0KGkpOwotCQkJCQlpZiAoaXNWaXNpYmxlTm9kZShvKSkgewotCQkJCQkJdmlzaWJsZU5vZGVzLmFkZChvKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gdmlzaWJsZU5vZGVzLnRvQXJyYXkoKTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgTm9kZUxpc3QpIHsKLQkJCXJldHVybiAoKE5vZGVMaXN0KSBwYXJlbnRFbGVtZW50KS5nZXROb2RlcygpLnRvQXJyYXkoKTsKLQkJfQotCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJLy8gYWx3YXlzIGdyb3VwIHRoZSBhdHRyaWJ1dGVzIGRpcmVjdGx5IHVuZGVyIHRoZSBlbGVtZW50Ci0JCQlPYmplY3RbXSBjaGlsZHJlbiA9ICgoRFRETm9kZSkgcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJCUxpc3QgYXR0cmlidXRlcyA9ICgoRWxlbWVudCkgcGFyZW50RWxlbWVudCkuZ2V0RWxlbWVudEF0dHJpYnV0ZXMoKTsKLQkJCU9iamVjdFtdIGxvZ2ljYWxDaGlsZHJlbiA9IG5ldyBPYmplY3RbY2hpbGRyZW4ubGVuZ3RoICsgYXR0cmlidXRlcy5zaXplKCldOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNoaWxkcmVuLmxlbmd0aDsgaW5kZXgrKykgewotCQkJCWxvZ2ljYWxDaGlsZHJlbltpbmRleF0gPSBjaGlsZHJlbltpbmRleF07Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCWxvZ2ljYWxDaGlsZHJlbltpbmRleCsrXSA9IGl0ZXIubmV4dCgpOwotCQkJfQotCQkJcmV0dXJuIGxvZ2ljYWxDaGlsZHJlbjsKLQkJfQotCQllbHNlIGlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJcmV0dXJuICgoRFRETm9kZSkgcGFyZW50RWxlbWVudCkuZ2V0Q2hpbGRyZW4oKTsKLQkJfQotCQlyZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVC50b0FycmF5KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCU9iamVjdFtdIGVsZW1lbnRzID0gbnVsbDsKLQkJLy8gQWx3YXlzIHNob3cgdGhlIERUREZpbGUgIm5vZGUiCi0JCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IE9iamVjdFtdeygoRFRETW9kZWxJbXBsKSBpbnB1dEVsZW1lbnQpLmdldERUREZpbGUoKX07Ci0JCX0KLQkJaWYgKGVsZW1lbnRzID09IG51bGwpIHsKLQkJCWVsZW1lbnRzID0gbmV3IE9iamVjdFswXTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0IHBhcmVudCA9IG51bGw7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRFRETm9kZSkgewotCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGVsZW1lbnQ7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZSkgewotCQkJCS8vIHRoZW4gd2UgbXVzdCBzYXkgdGhhdCB0aGUgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUKLQkJCQkvLyBhcyBvdXIgYXR0cmlidXRlJ3MgcGFyZW50IGF0dHJpYnV0ZWxpc3QgaXMgb3VyIHBhcmVudAotCQkJCXBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQgaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQkJCXJldHVybiBnZXRQYXJlbnQocGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QpIHsKLQkJCQkvLyB0aGVuIHdlIG11c3Qgc2F5IHRoYXQgdGhlIGVsZW1lbnQgd2l0aCB0aGUgc2FtZSBuYW1lCi0JCQkJLy8gYXMgb3VyIGF0dHJpYnV0ZWxpc3QgaXMgb3VyIHBhcmVudAotCQkJCVN0cmluZyBhdHRMaXN0TmFtZSA9ICgoQXR0cmlidXRlTGlzdCkgZWxlbWVudCkuZ2V0TmFtZSgpOwotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldERUREZpbGUoKS5nZXRFbGVtZW50c0FuZFBhcmFtZXRlckVudGl0eVJlZmVyZW5jZXMoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpICYmIHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgY3VycmVudE5vZGUuZ2V0TmFtZSgpLmVxdWFscyhhdHRMaXN0TmFtZSkpIHsKLQkJCQkJCXBhcmVudCA9IGN1cnJlbnROb2RlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQlwYXJlbnQgPSAoKERURE5vZGUpIGVsZW1lbnQpLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQotCQkJLy8gaWYgc2hvd2luZyBpbiB0aGUgbG9naWNhbCBvcmRlciwgcmV0dXJuIHRoZSBJbmRleGVkTm9kZUxpc3QKLQkJCS8vIGFjdGluZyBhcyB0aGUgcGFyZW50IGluIHRoZSB0cmVlCi0JCQlpZiAocGFyZW50ID09IG51bGwpIHsKLQkJCQlpZiAoaXNTaG93TG9naWNhbE9yZGVyKCkpIHsKLQkJCQkJT2JqZWN0W10gaW5kZXhlZE5vZGVMaXN0cyA9IGdldENoaWxkcmVuKCgoRFRETW9kZWxJbXBsKSBmSW5wdXRPYmplY3QpLmdldERUREZpbGUoKSk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5kZXhlZE5vZGVMaXN0cy5sZW5ndGggJiYgcGFyZW50ID09IG51bGw7IGkrKykgewotCQkJCQkJaWYgKGluZGV4ZWROb2RlTGlzdHNbaV0gaW5zdGFuY2VvZiBOb2RlTGlzdCkgewotCQkJCQkJCWlmICgoKE5vZGVMaXN0KSBpbmRleGVkTm9kZUxpc3RzW2ldKS5nZXROb2RlcygpLmNvbnRhaW5zKGVsZW1lbnQpKQotCQkJCQkJCQlwYXJlbnQgPSBpbmRleGVkTm9kZUxpc3RzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwYXJlbnQgPSAoKERURE1vZGVsSW1wbCkgZklucHV0T2JqZWN0KS5nZXREVERGaWxlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlTGlzdCAmJiBmSW5wdXRPYmplY3QgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCXBhcmVudCA9ICgoRFRETW9kZWxJbXBsKSBmSW5wdXRPYmplY3QpLmdldERUREZpbGUoKTsKLQkJfQotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCU9iamVjdFtdIGNoaWxkcmVuID0gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiBjaGlsZHJlbi5sZW5ndGggPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQlmVmlld2VyID0gdmlld2VyOwotCi0JCWlmIChmSW5wdXRPYmplY3QgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCSgoRFRETW9kZWxJbXBsKSBmSW5wdXRPYmplY3QpLmdldERUREZpbGUoKS5yZW1vdmVEVERGaWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJZklucHV0T2JqZWN0ID0gbmV3SW5wdXQ7Ci0JCWlmIChmSW5wdXRPYmplY3QgaW5zdGFuY2VvZiBEVERNb2RlbEltcGwpIHsKLQkJCSgoRFRETW9kZWxJbXBsKSBmSW5wdXRPYmplY3QpLmdldERUREZpbGUoKS5hZGREVERGaWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHZhbHVlIG9mIHNob3dMb2dpY2FsT3JkZXIuCi0JICogCi0JICogQHJldHVybiB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hvd0xvZ2ljYWxPcmRlcigpIHsKLQkJcmV0dXJuIHNob3dMb2dpY2FsT3JkZXI7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZU5vZGUoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBBdHRyaWJ1dGVMaXN0KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmlzaWJsZU5vZGVMaXN0KE5vZGVMaXN0IG5vZGVMaXN0KSB7Ci0JCS8qCi0JCSAqIEFsbCBOb2Rlc0xpc3RzIHNob3VsZCBiZSB2aXNpYmxlIGJlY2F1c2UgeW91IGNhbiBtb21lbnRhcmlseSBoYXZlCi0JCSAqIGFuIEFUVExJU1QgKGZvciBleGFtcGxlKSB3aXRob3V0IGEgY29ycmVzcG9uZGluZyBFTEVNRU5UCi0JCSAqIGRlY2xhcmF0aW9uCi0JCSAqLwotCQlyZXR1cm4gdHJ1ZTsvLyAhbm9kZUxpc3QuZ2V0TGlzdFR5cGUoKS5lcXVhbHMoRFREUmVnaW9uVHlwZXMuQVRUTElTVF9UQUcpOwotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVDaGFuZ2VkKERURE5vZGUgbm9kZSkgewotCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRWaWV3ZXIpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigibm9kZSBjaGFuZ2VkIG5vdGlmaWVkIik7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiBiZWZvcmUgPSAiICsKLQkJCS8vICgoU3RydWN0dXJlZFZpZXdlcil2aWV3KS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIEF0dHJpYnV0ZUxpc3QgJiYgaXNTaG93TG9naWNhbE9yZGVyKCkpIHsKLQkJCQkvLyBpbiB0aGlzIGNhc2UsIHdlIGFyZSBzaG93aW5nIGF0dHJpYnV0ZXMgdW5kZXIgdGhlIGVsZW1lbnQuCi0JCQkJLy8gcmVmcmVzaCB0aGUgZWxlbWVudCBvYmplY3QgaW5zdGVhZAotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBub2RlLmdldERUREZpbGUoKS5nZXROb2RlcygpLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCURURE5vZGUgY3VycmVudE5vZGUgPSAoRFRETm9kZSkgaXRlci5uZXh0KCk7Ci0JCQkJCWlmIChjdXJyZW50Tm9kZS5nZXROYW1lKCkuZXF1YWxzKG5vZGUuZ2V0TmFtZSgpKSAmJiBjdXJyZW50Tm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJCSgoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcikucmVmcmVzaChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQl9IC8vIGVuZCBvZiB3aGlsZSAoKQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gZG8gc3RhbmRhcmQgc3R1ZmYKLQkJCQkoKFN0cnVjdHVyZWRWaWV3ZXIpIGZWaWV3ZXIpLnJlZnJlc2gobm9kZSk7Ci0JCQl9Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oInNlbGVjdGlvbiBhZnRlciA9ICIgKwotCQkJLy8gKChTdHJ1Y3R1cmVkVmlld2VyKXZpZXcpLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIG5vZGVzQWRkZWQoTm9kZXNFdmVudCBldmVudCkgewotCQlpZiAoZlZpZXdlciBpbnN0YW5jZW9mIEFic3RyYWN0VHJlZVZpZXdlcikgewotCQkJU3RydWN0dXJlZFZpZXdlciB2aWV3ZXIgPSAoU3RydWN0dXJlZFZpZXdlcikgZlZpZXdlcjsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdmlld2VyLmdldFNlbGVjdGlvbigpOwotCi0JCQlPYmplY3QgZmlyc3RPYmogPSAoIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0JCQlEVEROb2RlIG9sZFNlbGVjdGVkTm9kZSA9IG51bGw7Ci0JCQlpZiAoZmlyc3RPYmogaW5zdGFuY2VvZiBEVEROb2RlKSB7Ci0JCQkJb2xkU2VsZWN0ZWROb2RlID0gKERURE5vZGUpIGZpcnN0T2JqOwotCQkJfQotCi0JCQlBYnN0cmFjdFRyZWVWaWV3ZXIgYWJzdHJhY3RUcmVlVmlld2VyID0gKEFic3RyYWN0VHJlZVZpZXdlcikgZlZpZXdlcjsKLQkJCWZvciAoSXRlcmF0b3IgaXQgPSBldmVudC5nZXROb2RlcygpLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgbm9kZSA9IGl0Lm5leHQoKTsKLQkJCQlPYmplY3QgcGFyZW50ID0gZ2V0UGFyZW50KG5vZGUpOwotCQkJCS8vIEJ1ZyAxMTExMDAgLSBJZiBpdCBpcyBhIHRvcCBsZXZlbCBub2RlIChpZS4gcGFyZW50IGlzIGEKLQkJCQkvLyBEVERGaWxlKSwKLQkJCQkvLyBpbnNlcnQgdGhlIG5vZGUgZGlyZWN0bHkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZQotCQkJCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBEVERGaWxlKSB7Ci0JCQkJCU9iamVjdFtdIG9ianMgPSBnZXRDaGlsZHJlbihwYXJlbnQpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChvYmpzW2ldID09IG5vZGUpIHsKLQkJCQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIuaW5zZXJ0KHBhcmVudCwgbm9kZSwgaSk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gSWYgdGhlIHBhcmVudCBub2RlIGlzIG5vdCBhIERUREZpbGUsIGp1c3QgcmVmcmVzaCB0aGUKLQkJCQkvLyBwYXJlbnQgZm9yIG5vdwotCQkJCWVsc2UgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCWFic3RyYWN0VHJlZVZpZXdlci5yZWZyZXNoKHBhcmVudCk7Ci0JCQkJfQotCQkJCS8vIFlvdSBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaywgaWYgeW91IGRvLCBqdXN0IHJlZnJlc2gKLQkJCQkvLyB0aGUgd2hvbGUgdHJlZQotCQkJCWVsc2UgewotCQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIucmVmcmVzaCgpOwotCQkJCX0KLQkJCX0KLQotCQkJSXRlcmF0b3IgaXRlciA9IGV2ZW50LmdldE5vZGVzKCkuaXRlcmF0b3IoKTsKLQkJCUxpc3QgbmV3U2VsZWN0aW9uID0gbmV3IEFycmF5TGlzdCgpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJRFRETm9kZSBub2RlID0gKERURE5vZGUpIGl0ZXIubmV4dCgpOwotCQkJCWlmIChvbGRTZWxlY3RlZE5vZGUgPT0gbnVsbCB8fCBub2RlLmdldFN0cnVjdHVyZWREVEREb2N1bWVudFJlZ2lvbigpICE9IG9sZFNlbGVjdGVkTm9kZS5nZXRTdHJ1Y3R1cmVkRFRERG9jdW1lbnRSZWdpb24oKSB8fCBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgIT0gb2xkU2VsZWN0ZWROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgfHwgbm9kZS5nZXRFbmRPZmZzZXQoKSAhPSBvbGRTZWxlY3RlZE5vZGUuZ2V0RW5kT2Zmc2V0KCkpIHsKLQkJCQkJLy8gYWRkIHRvIHNlbGVjdGlvbgotCQkJCQluZXdTZWxlY3Rpb24uYWRkKG5vZGUpOwotCQkJCQlleHBhbmRUb05vZGUobm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG5ld1NlbGVjdGlvbi5zaXplKCkgPiAwKSB7Ci0JCQkJdmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuZXdTZWxlY3Rpb24pKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbm9kZXNSZW1vdmVkKE5vZGVzRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZWaWV3ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFRyZWVWaWV3ZXIpIHsKLQkJCUFic3RyYWN0VHJlZVZpZXdlciBhYnN0cmFjdFRyZWVWaWV3ZXIgPSAoQWJzdHJhY3RUcmVlVmlld2VyKSBmVmlld2VyOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gZXZlbnQuZ2V0Tm9kZXMoKS5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspIHsKLQkJCQlhYnN0cmFjdFRyZWVWaWV3ZXIucmVtb3ZlKGl0ZXIubmV4dCgpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogU2V0IHRoZSB2YWx1ZSBvZiBzaG93TG9naWNhbE9yZGVyLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVmFsdWUgdG8gYXNzaWduIHRvIHNob3dMb2dpY2FsT3JkZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U2hvd0xvZ2ljYWxPcmRlcihib29sZWFuIHZhbHVlKSB7Ci0JCXRoaXMuc2hvd0xvZ2ljYWxPcmRlciA9IHZhbHVlOwotCQlpZiAoIXZhbHVlKSB7Ci0JCQkvLyBpZiBub3QgdXNpbmcgbG9naWNhbCBvcmRlciwgbG9zZSB0aGUgY2FjaGVkIGxpc3RzCi0JCQlsb2dpY2FsTm9kZUxpc3RzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2R0ZC91aS92aWV3cy9jb250ZW50b3V0bGluZS9PcmRlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL09yZGVyQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMDhlM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL09yZGVyQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKgotICogQ3JlYXRlZCBvbiBKYW4gMjIsIDIwMDQKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3cgLSBQcmVmZXJlbmNlcyAtIEphdmEgLSBDb2RlIEdlbmVyYXRpb24gLSBDb2RlIGFuZCBDb21tZW50cwotICovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5kdGQudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmludGVybmFsLkRURFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5lZGl0b3IuRFRERWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb247Ci0KLWNsYXNzIE9yZGVyQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCXByaXZhdGUgRFREVHJlZUNvbnRlbnRQcm92aWRlciBjb250ZW50UHJvdmlkZXI7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIHRyZWVWaWV3ZXI7Ci0KLQlwdWJsaWMgT3JkZXJBY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIsIERURFRyZWVDb250ZW50UHJvdmlkZXIgcHJvdmlkZXIsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCXN1cGVyKERURFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9HUk9VUF9JVEVNU19MT0dJQ0FMTFksIHN0b3JlLCBwcmVmZXJlbmNlS2V5LCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKERUREVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX09SR0FOSVpFX0RURF9MT0dJQ0FMTFkpKTsKLQkJdHJlZVZpZXdlciA9IHZpZXdlcjsKLQkJY29udGVudFByb3ZpZGVyID0gcHJvdmlkZXI7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCWNvbnRlbnRQcm92aWRlci5zZXRTaG93TG9naWNhbE9yZGVyKGlzQ2hlY2tlZCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQlzZXRDaGVja2VkKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oZ2V0UHJlZmVyZW5jZUtleSgpKSk7Ci0JCU9iamVjdFtdIGV4cGFuZGVkRWxlbWVudHMgPSB0cmVlVmlld2VyLmdldEV4cGFuZGVkRWxlbWVudHMoKTsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0cmVlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQljb250ZW50UHJvdmlkZXIuc2V0U2hvd0xvZ2ljYWxPcmRlcihpc0NoZWNrZWQoKSk7Ci0KLQkJLy8gdHJlZVZpZXdlci5zZXRJbnB1dCh0cmVlVmlld2VyLmdldElucHV0KCkpOwotCQl0cmVlVmlld2VyLnJlZnJlc2godHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLQotCQl0cmVlVmlld2VyLnNldEV4cGFuZGVkRWxlbWVudHMoZXhwYW5kZWRFbGVtZW50cyk7Ci0JCXRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldFJlZHJhdyh0cnVlKTsKLQkJdHJlZVZpZXdlci5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvZHRkL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1NvcnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4OTMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5kdGQudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9kdGQvdWkvdmlld3MvY29udGVudG91dGxpbmUvU29ydEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckNvbXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbnRlcm5hbC5EVERVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW50ZXJuYWwuZWRpdG9yLkRUREVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uOwotCi1jbGFzcyBTb3J0QWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCXByaXZhdGUgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHVibGljIFNvcnRBY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBwcmVmZXJlbmNlS2V5KSB7Ci0JCXN1cGVyKERURFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9TT1JUX0lURU1TLCBzdG9yZSwgcHJlZmVyZW5jZUtleSwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0JCXNldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihEVERFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9TT1JUKSk7Ci0JCXNldFRvb2xUaXBUZXh0KGdldFRleHQoKSk7Ci0JCXRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCXN1cGVyLnVwZGF0ZSgpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcoZmFsc2UpOwotCQlPYmplY3RbXSBleHBhbmRlZEVsZW1lbnRzID0gdHJlZVZpZXdlci5nZXRFeHBhbmRlZEVsZW1lbnRzKCk7Ci0JCWlmIChpc0NoZWNrZWQoKSkgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG5ldyBWaWV3ZXJDb21wYXJhdG9yKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJdHJlZVZpZXdlci5zZXRDb21wYXJhdG9yKG51bGwpOwotCQl9Ci0JCXRyZWVWaWV3ZXIuc2V0SW5wdXQodHJlZVZpZXdlci5nZXRJbnB1dCgpKTsKLQkJdHJlZVZpZXdlci5zZXRFeHBhbmRlZEVsZW1lbnRzKGV4cGFuZGVkRWxlbWVudHMpOwotCQl0cmVlVmlld2VyLmdldENvbnRyb2woKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ0YTUyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy8iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiBraW5kPSJjb24iPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS91aS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL3VpLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY29tbW9uLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2E2Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotaHRtbG1vZGVsLmphcgotdGVtcC5mb2xkZXIKLWRldi5wcm9wZXJ0aWVzCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2YTU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGVidWc9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kZWJ1Zy90cmFjZWZpbHRlcj0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnByb2plY3QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTlmYWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWxpbmUuc2VwYXJhdG9yPVxyXG4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjdiYWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU2F0IEF1ZyAxOSAxNjozMTo0MyBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjFjZDUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYNCi1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTANCi1jb21waWxlcnMucC5idWlsZD0wDQotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xDQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MA0KLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wDQotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTANCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTANCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MA0KLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MA0KLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wDQotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTANCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQ0KLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDk0NWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMS5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmhhbmRsZXJzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnNzaTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIgotRWNsaXBzZS1MYXp5U3RhcnQ6IHRydWU7IGV4Y2VwdGlvbnM9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYWJvdXQuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI2MjJiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGRhdGEvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMKLXNvdXJjZS4uID0gc3JjLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvY29tcG9uZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2NWFlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5odG1sIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5zdGFuZGFyZC5kdGRzIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8ZGVzY3JpcHRpb24gdXJsPSJodHRwOi8vZWNsaXBzZS5vcmcvd2VidG9vbHMvd3N0L2NvbXBvbmVudHMvaHRtbC9vdmVydmlldy5odG1sIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IkhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcCIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotPC9jb21wb25lbnQ+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvZGF0YS9odG1yZWYucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2Q0NjBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLUFUYWdJbmZvPUEgbGluayBpZiB0aGUgaHJlZiBhdHRyaWJ1dGUgaXMgcHJlc2VudCwgYW5kIHRoZSB0YXJnZXQgZm9yIGEgbGluayBpZiB0aGUgbmFtZSBhdHRyaWJ1dGUgaXMgcHJlc2VudAotQUJCUlRhZ0luZm89QW4gYWJicmV2aWF0aW9uIChmb3IgZXhhbXBsZSwgV1dXLCBIVFRQKQotQUNST05ZTVRhZ0luZm89QW4gYWNyb255bSAoZm9yIGV4YW1wbGUsIFNDVUJBKQotQUREUkVTU1RhZ0luZm89QWRkcmVzcyBpbmZvcm1hdGlvbiBmb3IgdGhlIGF1dGhvciBvZiB0aGUgcGFnZQotQVBQTEVUVGFnSW5mbz1BIEphdmEgYXBwbGV0Ci1BUkVBVGFnSW5mbz1EZWZpbmVzIGEgY2xpZW50LXNpZGUgaW1hZ2UgbWFwIGFyZWEKLUJUYWdJbmZvPURpc3BsYXlzIGNvbnRhaW5lZCB0ZXh0IGFzIGJvbGQKLUJBU0VUYWdJbmZvPVRoZSBiYXNlIFVSSSBmb3IgdGhlIHBhZ2UsIHRvIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyByZWxhdGl2ZSBwYXRocwotQkFTRUZPTlRUYWdJbmZvPVRoZSBiYXNlIGZvbnQgc2l6ZSBmb3IgdGhlIHBhZ2UKLUJET1RhZ0luZm89T3ZlcnJpZGVzIGRlZmF1bHQgYmlkaXJlY3Rpb25hbCBkaXNwbGF5LiBGb3IgdXNlIHdpdGggYmlkaXJlY3Rpb25hbCBsYW5ndWFnZXMuCi1CSUdUYWdJbmZvPURpc3BsYXlzIGNvbnRhaW5lZCB0ZXh0IGFzIGxhcmdlCi1CR1NPVU5EVGFnSW5mbz1EZWZpbmVzIGEgc291bmQgZmlsZSBmb3IgdGhlIHBhZ2UuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLUJMSU5LVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIGJsaW5raW5nLiBOb3Qgc3VwcG9ydGVkIGJ5IFczQyBIVE1MIDQuMDEuCi1CTE9DS1FVT1RFVGFnSW5mbz1BIGxvbmcgcXVvdGF0aW9uCi1CT0RZVGFnSW5mbz1UaGUgZG9jdW1lbnQgYm9keS4gQ29udGFpbnMgYWxsIHRoZSBjb250ZW50IGZvciB0aGUgcGFnZS4KLUJSVGFnSW5mbz1Gb3JjZXMgYSBsaW5lIGJyZWFrCi1CVVRUT05UYWdJbmZvPURlZmluZXMgYSBwdXNoIGJ1dHRvbgotQ0FQVElPTlRhZ0luZm89RGVmaW5lcyBhIHRhYmxlIGNhcHRpb24KLUNFTlRFUlRhZ0luZm89RGlzcGxheXMgY29udGFpbmVkIHRleHQgY2VudGVyZWQuIEVxdWl2YWxlbnQgdG8gRElWIHdpdGggYWxpZ249Y2VudGVyLgotQ0lURVRhZ0luZm89QSBjaXRhdGlvbgotQ09ERVRhZ0luZm89QSBjb21wdXRlciBjb2RlIGZyYWdtZW50Ci1DT0xUYWdJbmZvPUEgdGFibGUgY29sdW1uCi1DT0xHUk9VUFRhZ0luZm89QSBncm91cCBvZiB0YWJsZSBjb2x1bW5zCi1ERFRhZ0luZm89QSBkZWZpbml0aW9uIG9yIGRlc2NyaXB0aW9uIGluIGEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBsaXN0Ci1ERUxUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgZGVsZXRlZAotREZOVGFnSW5mbz1BIGRlZmluaXRpb24KLURJUlRhZ0luZm89QSBkaXJlY3RvcnkgbGlzdGluZwotRElWVGFnSW5mbz1BIGdlbmVyaWMgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVmaW5pbmcgbGFuZ3VhZ2Ugb3Igc3R5bGUgZm9yIHRoZSBjb250ZW50cwotRExUYWdJbmZvPUEgZGVmaW5pdGlvbiBvciBkZXNjcmlwdGlvbiBsaXN0Ci1EVFRhZ0luZm89QSB0ZXJtIG9yIHN1YmplY3QgaW4gYSBkZWZpbml0aW9uIG9yIGRlc2NyaXB0aW9uIGxpc3QKLUVNVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGVtcGhhc2l6ZWQgKGdlbmVyYWxseSBpdGFsaWNpemVkKQotRU1CRURUYWdJbmZvPURlZmluZXMgYW4gZW1iZWRkZWQgcGx1Zy1pbi4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotRklFTERTRVRUYWdJbmZvPURlZmluZXMgYSBmb3JtIGNvbnRyb2wgZ3JvdXAKLUZPTlRUYWdJbmZvPURpc3BsYXlzIHRleHQgaW4gdGhlIGdpdmVuIGZvbnQKLUZPUk1UYWdJbmZvPURlZmluZXMgYW4gaW50ZXJhY3RpdmUgZm9ybQotRlJBTUVUYWdJbmZvPURlZmluZXMgYSBmcmFtZSB3aXRoaW4gdGhlIGN1cnJlbnQgd2luZG93Ci1GUkFNRVNFVFRhZ0luZm89RGVmaW5lcyBhIGZyYW1lc2V0IHRoYXQgZGl2aWRlcyB0aGUgd2luZG93IGludG8gZnJhbWVzCi1IMVRhZ0luZm89QSB0b3AtbGV2ZWwgaGVhZGluZwotSDJUYWdJbmZvPUEgc2Vjb25kLWxldmVsIGhlYWRpbmcKLUgzVGFnSW5mbz1BIHRoaXJkLWxldmVsIGhlYWRpbmcKLUg0VGFnSW5mbz1BIGZvdXJ0aC1sZXZlbCBoZWFkaW5nCi1INVRhZ0luZm89QSBmaWZ0aC1sZXZlbCBoZWFkaW5nCi1INlRhZ0luZm89QSBzaXh0aC1sZXZlbCBoZWFkaW5nCi1IRUFEVGFnSW5mbz1Db250YWlucyBtZXRhZGF0YSBhbmQgd2luZG93IHRpdGxlIGluZm9ybWF0aW9uIGZvciB0aGUgZG9jdW1lbnQKLUhSVGFnSW5mbz1BIGhvcml6b250YWwgcnVsZQotSFRNTFRhZ0luZm89VGhlIHJvb3QgZWxlbWVudCBmb3IgdGhlIGRvY3VtZW50LgotSVRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBpdGFsaWMKLUlGUkFNRVRhZ0luZm89RGVmaW5lcyBhbiBpbmxpbmUgc3Vid2luZG93Ci1JTUdUYWdJbmZvPURpc3BsYXlzIHRoZSByZWZlcmVuY2VkIGltYWdlIGFzIGVtYmVkZGVkIGNvbnRlbnQKLUlOUFVUVGFnSW5mbz1EZWZpbmVzIGEgZm9ybSBjb250cm9sIGZvciB1c2VyIGlucHV0Ci1JTlNUYWdJbmZvPURlZmluZXMgaW5zZXJ0ZWQgdGV4dAotSVNJTkRFWFRhZ0luZm89RGVmaW5lcyBhIHNpbmdsZSBsaW5lIHByb21wdAotS0JEVGFnSW5mbz1EZWZpbmVzIHRleHQgdG8gYmUgZW50ZXJlZCBieSB0aGUgdXNlcgotTEFCRUxUYWdJbmZvPURlZmluZXMgdGhlIGxhYmVsIGZvciBhIGZvcm0gZmllbGQKLUxFR0VORFRhZ0luZm89RGVmaW5lcyB0aGUgbGFiZWwgZm9yIGEgc2V0IG9mIGZvcm0gZmllbGRzCi1MSVRhZ0luZm89RGVmaW5lcyBhIGxpc3QgaXRlbSB3aXRoaW4gYSBsaXN0Ci1MSU5LVGFnSW5mbz1BIG1lZGlhLWluZGVwZW5kZW50IGxpbmsKLU1BUFRhZ0luZm89RGVmaW5lcyBhIGNsaWVudC1zaWRlIGltYWdlIG1hcAotTUFSUVVFRVRhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBzY3JvbGxpbmcuIE5vdCBzdXBwb3J0ZWQgYnkgVzNDIEhUTUwgNC4wMS4KLU1FTlVUYWdJbmZvPURlZmluZXMgYSBtZW51IGxpc3QKLU1FVEFUYWdJbmZvPURlZmluZXMgbWV0YWRhdGEgaW5mb3JtYXRpb24gZm9yIHRoZSBkb2N1bWVudAotTk9CUlRhZ0luZm89T3ZlcnJpZGVzIGFuZCBwcmV2ZW50cyBsaW5lIGJyZWFrcy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgotTk9GUkFNRVNUYWdJbmZvPVByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IGZyYW1lcwotTk9TQ1JJUFRUYWdJbmZvPVByb3ZpZGVzIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgaWYgdGhlIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IHNjcmlwdGluZwotT0JKRUNUVGFnSW5mbz1EZWZpbmVzIGEgZ2VuZXJpYyBlbWJlZGRlZCBvYmplY3QKLU9MVGFnSW5mbz1BbiBvcmRlcmVkIGxpc3QKLU9QVEdST1VQVGFnSW5mbz1BbiBvcHRpb24gZ3JvdXAKLU9QVElPTlRhZ0luZm89QSBzZWxlY3RhYmxlIGNob2ljZQotUFRhZ0luZm89QSBwYXJhZ3JhcGgKLVBBUkFNVGFnSW5mbz1BIG5hbWVkIHByb3BlcnR5IHZhbHVlCi1QUkVUYWdJbmZvPVByZWZvcm1hdHRlZCB0ZXh0Ci1RVGFnSW5mbz1BIHNob3J0IGlubGluZSBxdW90YXRpb24KLVNUYWdJbmZvPURpc3BsYXkgdGV4dCBpbiBzdHJpa2UtdGhyb3VnaCBzdHlsZQotU0FNUFRhZ0luZm89U2FtcGxlIHByb2dyYW0gb3V0cHV0LCBzY3JpcHRzLCBldGMuIERpc3BsYXlzIGluIG1vbm9zcGFjZSBmb250LgotU0NSSVBUVGFnSW5mbz1TY3JpcHQgc3RhdGVtZW50cwotU0VMRUNUVGFnSW5mbz1BbiBvcHRpb24gc2VsZWN0b3IKLVNNQUxMVGFnSW5mbz1EaXNwbGF5cyB0ZXh0IGFzIHNtYWxsCi1TUEFOVGFnSW5mbz1BIGdlbmVyaWMgY29udGFpbmVyLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgZGVmaW5pbmcgbGFuZ3VhZ2Ugb3Igc3R5bGUgZm9yIHRoZSBjb250ZW50cwotU1RSSUtFVGFnSW5mbz1EaXNwbGF5IHRleHQgaW4gc3RyaWtlLXRocm91Z2ggc3R5bGUKLVNUUk9OR1RhZ0luZm89RGlzcGxheXMgdGV4dCBhcyBzdHJvbmdseSBlbXBoYXNpemVkIChnZW5lcmFsbHkgYm9sZCkKLVNUWUxFVGFnSW5mbz1EZWZpbmVzIGEgc3R5bGUgZm9yIHRoZSBjb250YWluZWQgaW5mb3JtYXRpb24KLVNVQlRhZ0luZm89RGlzcGxheSBhcyBzdWJzY3JpcHQKLVNVUFRhZ0luZm89RGlzcGxheSBhcyBzdXBlcnNjcmlwdAotVEFCTEVUYWdJbmZvPURlZmluZXMgYSB0YWJsZQotVEJPRFlUYWdJbmZvPVRoZSBib2R5IG9mIHRoZSB0YWJsZQotVERUYWdJbmZvPUEgY2VsbCB3aXRoaW4gYSB0YWJsZQotVEVYVEFSRUFUYWdJbmZvPUEgbXVsdGktbGluZSB0ZXh0IGZpZWxkCi1URk9PVFRhZ0luZm89QSB0YWJsZSBmb290ZXIKLVRIVGFnSW5mbz1BIHRhYmxlIGhlYWRlciBjZWxsCi1USEVBRFRhZ0luZm89QSB0YWJsZSBoZWFkZXIKLVRJVExFVGFnSW5mbz1UaGUgZG9jdW1lbnQgdGl0bGUsIGRpc3BsYXllZCBpbiB0aGUgYnJvd3NlcidzIHRpdGxlIGJhcgotVFJUYWdJbmZvPUEgdGFibGUgcm93Ci1UVFRhZ0luZm89RGlzcGxheXMgdGV4dCBpbiB0ZWxldHlwZSBvciBtb25vc3BhY2VkIHRleHQgc3R5bGUKLVVUYWdJbmZvPURpc3BsYXlzIHRleHQgYXMgdW5kZXJsaW5lZAotVUxUYWdJbmZvPUFuIHVub3JkZXJlZCBsaXN0Ci1WQVJUYWdJbmZvPUFuIGluc3RhbmNlIG9mIGEgdmFyaWFibGUgb3IgcHJvZ3JhbSBhcmd1bWVudAotV0JSVGFnSW5mbz1BbGxvd3MgYSBsaW5lIGJyZWFrIHdpdGhpbiA8Qj4mbHQ7Tk9CUiZndDs8L0I+IHRhZy4gTm90IHN1cHBvcnRlZCBieSBXM0MgSFRNTCA0LjAxLgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9kYXRhL2h0bXJlZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNWI3NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL2RhdGEvaHRtcmVmLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGFic3RyYWN0R3JhbW1hckFubm90YXRpb25zIHByb3BlcnRpZXNMb2NhdGlvbj0iaHRtcmVmIiBjYXNlU2Vuc2l0aXZlPSJmYWxzZSI+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBQkJSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBQkJSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkFDUk9OWU0iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFDUk9OWU1UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQUREUkVTUyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQUREUkVTU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBUFBMRVQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUFQUExFVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJBUkVBIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVBUkVBVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkIiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkFTRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkFTRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCQVNFRk9OVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkFTRUZPTlRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkRPIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCRE9UYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkdTT1VORCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkdTT1VORFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCSUciPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJJR1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCTElOSyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkxJTktUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQkxPQ0tRVU9URSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQkxPQ0tRVU9URVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCT0RZIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCT0RZVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkJSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVCUlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJCVVRUT04iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUJVVFRPTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDQVBUSU9OIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVDQVBUSU9OVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNFTlRFUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ0VOVEVSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkNJVEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNJVEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iQ09ERSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ09ERVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDT0wiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUNPTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJDT0xHUk9VUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lQ09MR1JPVVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iREQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUREVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRFTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lREVMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRGTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lREZOVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRJUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRElSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRJViI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRElWVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkRMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVETFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJEVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRU0iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUVNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkVNQkVEIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVFTUJFRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGSUVMRFNFVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRklFTERTRVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iRk9OVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRk9OVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGT1JNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGT1JNVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkZSQU1FIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVGUkFNRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJGUkFNRVNFVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lRlJBTUVTRVRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUgxVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkgyIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVIMlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIMyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSDQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUg0VGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ikg1Ij4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVINVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJINiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSDZUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSEVBRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSEVBRFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJIUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSFJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iSFRNTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSFRNTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklGUkFNRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSUZSQU1FVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklNRyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lSU1HVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IklOUFVUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJTlBVVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJTlMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUlOU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJJU0lOREVYIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVJU0lOREVYVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IktCRCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lS0JEVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IkxBQkVMIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVMQUJFTFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMRUdFTkQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JUxFR0VORFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJMSSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTElUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTElOSyI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTElOS1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNQVAiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1BUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJNQVJRVUVFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVNQVJRVUVFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik1FTlUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU1FTlVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iTUVUQSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTUVUQVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJOT0JSIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVOT0JSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik5PRlJBTUVTIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVOT0ZSQU1FU1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJOT1NDUklQVCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lTk9TQ1JJUFRUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT0JKRUNUIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPQkpFQ1RUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iT0wiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU9MVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9Ik9QVEdST1VQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVPUFRHUk9VUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJPUFRJT04iPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JU9QVElPTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVQVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlBBUkFNIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVQQVJBTVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJQUkUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVBSRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJRIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVRVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlMiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU0FNUCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU0FNUFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTQ1JJUFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNDUklQVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTRUxFQ1QiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNFTEVDVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTTUFMTCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU01BTExUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1BBTiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1BBTlRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFJJS0UiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUUklLRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFJPTkciPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVNUUk9OR1RhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJTVFlMRSI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lU1RZTEVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1VCIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVUJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iU1VQIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVTVVBUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEFCTEUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRBQkxFVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRCT0RZIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUQk9EWVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJURCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVERUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEVYVEFSRUEiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRFWFRBUkVBVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRGT09UIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVURk9PVFRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUSCI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVEhUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVEhFQUQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRIRUFEVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlRJVExFIj4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhZ0luZm8iPiVUSVRMRVRhZ0luZm88L3Byb3BlcnR5PgotICAgIDwvYW5ub3RhdGlvbj4KLSAgICA8YW5ub3RhdGlvbiBzcGVjPSJUUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVFJUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVFQiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVRUVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlUiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVVUYWdJbmZvPC9wcm9wZXJ0eT4KLSAgICA8L2Fubm90YXRpb24+Ci0gICAgPGFubm90YXRpb24gc3BlYz0iVUwiPgotICAgICAgICA8cHJvcGVydHkgbmFtZT0idGFnSW5mbyI+JVVMVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IlZBUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lVkFSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotICAgIDxhbm5vdGF0aW9uIHNwZWM9IldCUiI+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWdJbmZvIj4lV0JSVGFnSW5mbzwvcHJvcGVydHk+Ci0gICAgPC9hbm5vdGF0aW9uPgotPC9hYnN0cmFjdEdyYW1tYXJBbm5vdGF0aW9ucz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTVhMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBIVE1MIE1vZGVsCi1TdHJ1Y3R1cmVkX0hUTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIEhUTUwgRG9jdW1lbnQgRmFjdG9yeSBFeHRlbnNpb24KLUhUTUxfQ29udGVudF9UeXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SFRNTApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ2ZmMyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5tb2RlbEhhbmRsZXIiPgotCQk8bW9kZWxIYW5kbGVyCi0JCQlkZWZhdWx0PSJubyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJGb3JIVE1MIgotCQkJYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlciI+Ci0JCTwvbW9kZWxIYW5kbGVyPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmVtYmVkZGVkVHlwZUhhbmRsZXIiPgotCQk8ZW1iZWRkZWRUeXBlSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLkVtYmVkZGVkSFRNTCI+Ci0JCTwvZW1iZWRkZWRUeXBlSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50YXNrc2Nhbm5lciI+Ci0JCTxzY2FubmVyCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50YXNrcy5IVE1MRmlsZVRhc2tTY2FubmVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXIiCi0JCQljb250ZW50VHlwZUlkcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIgotCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfSFRNTF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvbW1lbnRFbGVtZW50SGFuZGxlciI+Ci0JCTxoYW5kbGVyLWN1c3RvbQotCQkJY29tbWVudHR5cGU9InhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmhhbmRsZXJzLkNvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSSI+Ci0JCQk8c3RhcnR3aXRoIHByZWZpeD0iIyI+PC9zdGFydHdpdGg+Ci0JCTwvaGFuZGxlci1jdXN0b20+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iaHRtbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJodG0iPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieGh0bWwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iaHRwbCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ3bWwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ic2h0bWwiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ic2h0bSI+Ci0JCTwvZmlsZVR5cGVzPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGwiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiPgotCQk8L3Byb2Nlc3Nvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRXh0ZW5zaW9uIHBvaW50IGZvciB0YWdoZWxwIGRvY3VtZW50YXRpb24gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmFubm90YXRpb25GaWxlcyI+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQkJbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLQkJCXB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQkJbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLQkJCXB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQkJbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLQkJCXB1YmxpY0lkPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQkJPGFubm90YXRpb25GaWxlCi0JCQlsb2NhdGlvbj0iZGF0YS9odG1yZWYueG1sIgotCQkJcHVibGljSWQ9Ii0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iPgotCQk8L2Fubm90YXRpb25GaWxlPgotCQk8YW5ub3RhdGlvbkZpbGUKLQkJCWxvY2F0aW9uPSJkYXRhL2h0bXJlZi54bWwiCi0JCQlwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiI+Ci0JCTwvYW5ub3RhdGlvbkZpbGU+Ci0JCTxhbm5vdGF0aW9uRmlsZQotCQkJbG9jYXRpb249ImRhdGEvaHRtcmVmLnhtbCIKLQkJCXB1YmxpY0lkPSItLy9XQVBGT1JVTS8vRFREIFhIVE1MIE1vYmlsZSAxLjAvL0VOIj4KLQkJPC9hbm5vdGF0aW9uRmlsZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9Imh0bWwsaHRtLHhodG1sLGh0cGwsd21sLHNodG1sLHNodG0iCi0JCQlwcmlvcml0eT0iaGlnaCIKLQkJCW5hbWU9IiVIVE1MX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9Imh0bWxzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0Ij4KLQkJCTwhLS0gbm90ZTogbm8gZGVmYXVsdC1jaGFyc2V0IGZvciBIVE1MLCBzaG91bGQgdXNlICdwbGF0Zm9ybScgLS0+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuQ29udGVudERlc2NyaWJlckZvckhUTUwiIC8+Ci0JCTwvY29udGVudC10eXBlPgotCTwvZXh0ZW5zaW9uPgotCi08IS0tIG1vdmVkIHRvIHdoZXJlIHRoZSBkdGQncyBhcmUgY29udHJpYnV0ZWQKLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5kb2N1bWVudFR5cGVzIj4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgMS4wIFN0cmljdCIKLQkJCW5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQkJCWlzWEhUTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0iZmFsc2UiCi0JCQlwdWJsaWNJRD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCAxLjAgVHJhbnNpdGlvbmFsIgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIKLQkJCWRlZmF1bHRYSFRNTD0idHJ1ZSIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIDEuMCBGcmFtZXNldCIKLQkJCW5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQkJCWlzWEhUTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0idHJ1ZSIKLQkJCXB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCAxLjAgRnJhbWVzZXQvL0VOIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCQk8ZG9jdW1lbnRUeXBlCi0JCQllbGVtZW50TmFtZT0iaHRtbCIKLQkJCWRpc3BsYXlOYW1lPSJYSFRNTCBCYXNpYyAxLjAiCi0JCQluYW1lc3BhY2VVUkk9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiCi0JCQlpc1hIVE1MPSJ0cnVlIgotCQkJaGFzRnJhbWVzZXQ9ImZhbHNlIgotCQkJcHVibGljSUQ9Ii0vL1czQy8vRFREIFhIVE1MIEJhc2ljIDEuMC8vRU4iCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwtYmFzaWMveGh0bWwtYmFzaWMxMC5kdGQiPgotCQk8L2RvY3VtZW50VHlwZT4KLQkJPGRvY3VtZW50VHlwZQotCQkJZWxlbWVudE5hbWU9Imh0bWwiCi0JCQlkaXNwbGF5TmFtZT0iWEhUTUwgMS4xIgotCQkJbmFtZXNwYWNlVVJJPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIgotCQkJaXNYSFRNTD0idHJ1ZSIKLQkJCWhhc0ZyYW1lc2V0PSJmYWxzZSIKLQkJCXB1YmxpY0lEPSItLy9XM0MvL0RURCBYSFRNTCAxLjEvL0VOIgotCQkJc3lzdGVtSUQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMTEvRFREL3hodG1sMTEuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJodG1sIgotCQkJZGlzcGxheU5hbWU9IlhIVE1MIE1QIDEuMCIKLQkJCW5hbWVzcGFjZVVSST0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIKLQkJCWlzWEhUTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0iZmFsc2UiCi0JCQlwdWJsaWNJRD0iLS8vV0FQRk9SVU0vL0RURCBYSFRNTCBNb2JpbGUgMS4wLy9FTiIKLQkJCXN5c3RlbUlEPSJodHRwOi8vd3d3LndhcGZvcnVtLm9yZy9EVEQveGh0bWwtbW9iaWxlMTAuZHRkIj4KLQkJPC9kb2N1bWVudFR5cGU+Ci0JCTxkb2N1bWVudFR5cGUKLQkJCWVsZW1lbnROYW1lPSJ3bWwiCi0JCQlkaXNwbGF5TmFtZT0iV01MIDEuMyIKLQkJCW5hbWVzcGFjZVVSST0iIgotCQkJaXNXTUw9InRydWUiCi0JCQloYXNGcmFtZXNldD0iZmFsc2UiCi0JCQlwdWJsaWNJRD0iLS8vV0FQRk9SVU0vL0RURCBXTUwgMS4zLy9FTiIKLQkJCWRlZmF1bHRXTUw9InRydWUiCi0JCQlzeXN0ZW1JRD0iaHR0cDovL3d3dy53YXBmb3J1bS5vcmcvRFREL3dtbDEzLmR0ZCI+Ci0JCTwvZG9jdW1lbnRUeXBlPgotCTwvZXh0ZW5zaW9uPgotLS0+Ci0JPCEtLSBpbml0aWFsaXplIGh0bWwgY29yZSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29udGVudEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y2MTJmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvbnRlbnRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxDb250ZW50QnVpbGRlciBleHRlbmRzIERPTUNvbnRlbnRCdWlsZGVySW1wbCB7Ci0KLQlwcml2YXRlIGludCBmVGFnQ2FzZTsKLQlwcml2YXRlIGludCBmQXR0ckNhc2U7Ci0KLQkvKioKLQkgKiBET01Db250ZW50QnVpbGRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBkb2N1bWVudCBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBIVE1MQ29udGVudEJ1aWxkZXIoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc3VwZXIoZG9jdW1lbnQpOwotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlmVGFnQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKTsKLQkJZkF0dHJDYXNlID0gcHJlZnMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKTsKLQkJLy8JRWxlbWVudCBjYXNlU2V0dGluZ3MgPSBIVE1MUHJlZmVyZW5jZU1hbmFnZXIuZ2V0SFRNTEluc3RhbmNlKCkuZ2V0RWxlbWVudChQcmVmZXJlbmNlTmFtZXMuUFJFRkVSUkVEX0NBU0UpOwotCQkvLwlmVGFnQ2FzZSA9IGNhc2VTZXR0aW5ncy5nZXRBdHRyaWJ1dGUoUHJlZmVyZW5jZU5hbWVzLlRBR05BTUUpOwotCQkvLwlmQXR0ckNhc2UgPSBjYXNlU2V0dGluZ3MuZ2V0QXR0cmlidXRlKFByZWZlcmVuY2VOYW1lcy5BVFRSSUJVVEVOQU1FKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVOYW1lKENNTm9kZSBjbW5vZGUsIE5vZGUgcGFyZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gc3VwZXIuY29tcHV0ZU5hbWUoY21ub2RlLCBwYXJlbnQpOwotCQkvLyBkb24ndCBjaGFuZ2UgdGhlIGNhc2UgdW5sZXNzIHdlJ3JlIGNlcnRhaW4gaXQgaXMgbWVhbmluZ2xlc3MKLQkJLy8JaWYgKGNtbm9kZSBpbnN0YW5jZW9mIEhUTUxDTU5vZGUgJiYgKChIVE1MQ01Ob2RlKSBjbW5vZGUpLnNob3VsZElnbm9yZUNhc2UoKSkgewotCQlpZiAoc2hvdWxkSWdub3JlQ2FzZShjbW5vZGUpKSB7Ci0JCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQlpZiAoZlRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZlRhZ0Nhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCQllbHNlIGlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZBdHRyQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQllbHNlIGlmIChmQXR0ckNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJLy8gZWxzZSBkbyBub3RoaW5nCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICghY21ub2RlLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzE2NTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgSFRNTCBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvcmVNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vX2Vycm9yX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kZWZpbmVkX2F0dHJpYnV0ZV9uYW1lX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuZGVmaW5lZF9hdHRyaWJ1dGVfdmFsdWVfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aXBsZV92YWx1ZXNfc3BlY2lmaWVkX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVfX18wX19fdXNlc19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfYXR0cmlidXRlX25hbWVfX18wX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2F0dHJpYnV0ZV9fXzBfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfbG9jYXRpb25fb2ZfdGFnX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEdXBsaWNhdGVfdGFnX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fc3RhcnRfdGFnX19fXzBfX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19lbmRfdGFnX19fX18wX19fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3RhZ19fX19fMF9fX19ub3RfbmVlZGVfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVua25vd25fdGFnX19fMF9fX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX25hbWVfX18wX19fdXNlc193cm9uZ19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfdGFnX25hbWVfX18wX19fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX0pTUF9kaXJlY3RpdmVfX18wX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF90ZXh0X3N0cmluZ19fXzBfX19fRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX3VzZWRfaW5fX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duX2Vycm9yX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RhcnRfdGFnX19fXzBfX19fbm90X2Nsb3NfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF90YWdfX19fXzBfX19fbm90X2Nsb3NlX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfdmFsdWVfX18wX19fdXNlc19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tbWVudF9ub3RfY2xvc2VkX19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRE9DVFlQRV9kZWNsYXJhdGlvbl9ub3RfY2xfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fbm90X0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDREFUQV9zZWN0aW9uX25vdF9jbG9zZWRfX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfRVJST1JfVGFnX19fMF9fX3Nob3VsZF9iZV9hbl9lbXB0eV9lbGVtZW50X3RhZ18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9BdHRyaWJ1dGVfdmFsdWVfX18wX19fbm90X2Nsb3NlZF9fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgSFRNTENvcmVNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSFRNTENvcmVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjk5YzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9IVE1MQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBIVE1MQ29yZVBsdWdpbiBwbHVnaW47Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEhUTUxDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEhUTUxDb3JlUGx1Z2luIGdldERlZmF1bHQoKSB7Ci0JCXJldHVybiBwbHVnaW47Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd29ya3NwYWNlIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSVdvcmtzcGFjZSBnZXRXb3Jrc3BhY2UoKSB7Ci0JCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc3VwZXIuc3RhcnQoY29udGV4dCk7Ci0KLQkJLy8gbGlzdGVuIGZvciByZXNvdXJjZSBjaGFuZ2VzIHRvIHVwZGF0ZSBjb250ZW50IHByb3BlcnRpZXMga2V5cwotCQlIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyLnN0YXJ0dXAoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCS8vIHN0b3AgbGlzdGVubmluZyBmb3IgcmVzb3VyY2UgY2hhbmdlcyB0byB1cGRhdGUgY29udGVudCBwcm9wZXJ0aWVzCi0JCS8vIGtleXMKLQkJSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5zaHV0ZG93bigpOwotCi0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL0hUTUxDb3JlUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JjMmZhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvSFRNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU5vX2Vycm9yX19VSV89Tm8gZXJyb3IuCi1VbmRlZmluZWRfYXR0cmlidXRlX25hbWVfX19FUlJPUl89VW5kZWZpbmVkIGF0dHJpYnV0ZSBuYW1lICh7MH0pLgotVW5kZWZpbmVkX2F0dHJpYnV0ZV92YWx1ZV9fRVJST1JfPVVuZGVmaW5lZCBhdHRyaWJ1dGUgdmFsdWUgKHswfSkuCi1NdWx0aXBsZV92YWx1ZXNfc3BlY2lmaWVkX19FUlJPUl89TXVsdGlwbGUgdmFsdWVzIHNwZWNpZmllZCBmb3IgYW4gYXR0cmlidXRlICh7MH0pLgotQXR0cmlidXRlX25hbWVfX18wX19fdXNlc19fRVJST1JfPUF0dHJpYnV0ZSBuYW1lICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuCi1JbnZhbGlkX2F0dHJpYnV0ZV9uYW1lX19fMF9FUlJPUl89SW52YWxpZCBhdHRyaWJ1dGUgbmFtZSAoezB9KS4KLUludmFsaWRfYXR0cmlidXRlX19fMF9fX19FUlJPUl89SW52YWxpZCBhdHRyaWJ1dGUgKHswfSkuCi1JbnZhbGlkX2xvY2F0aW9uX29mX3RhZ19fX19FUlJPUl89SW52YWxpZCBsb2NhdGlvbiBvZiB0YWcgKHswfSkuCi1EdXBsaWNhdGVfdGFnX19fMF9fX19FUlJPUl89RHVwbGljYXRlIHRhZyAoezB9KS4KLU5vX3N0YXJ0X3RhZ19fX18wX19fX19FUlJPUl89Tm8gc3RhcnQgdGFnICg8ezB9PikuCi1Ob19lbmRfdGFnX19fX18wX19fX19FUlJPUl89Tm8gZW5kIHRhZyAoPC97MH0+KS4KLUVuZF90YWdfX19fXzBfX19fbm90X25lZWRlX0VSUk9SXz1FbmQgdGFnICg8L3swfT4pIG5vdCBuZWVkZWQuCi1Vbmtub3duX3RhZ19fXzBfX19fRVJST1JfPVVua25vd24gdGFnICh7MH0pLgotVGFnX25hbWVfX18wX19fdXNlc193cm9uZ19fRVJST1JfPVRhZyBuYW1lICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuCi1JbnZhbGlkX3RhZ19uYW1lX19fMF9fX19FUlJPUl89SW52YWxpZCB0YWcgbmFtZSAoezB9KS4KLUludmFsaWRfSlNQX2RpcmVjdGl2ZV9fXzBfX0VSUk9SXz1JbnZhbGlkIEpTUCBkaXJlY3RpdmUgKHswfSkuCi1JbnZhbGlkX3RleHRfc3RyaW5nX19fMF9fX19FUlJPUl89SW52YWxpZCB0ZXh0IHN0cmluZyAoezB9KS4KLUludmFsaWRfY2hhcmFjdGVyX3VzZWRfaW5fX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciB1c2VkIGluIHRleHQgc3RyaW5nICh7MH0pLgotVW5rbm93bl9lcnJvcl9fRVJST1JfPVVua25vd24gZXJyb3IuCi1TdGFydF90YWdfX19fMF9fX19ub3RfY2xvc19FUlJPUl89U3RhcnQgdGFnICg8ezB9Pikgbm90IGNsb3NlZC4KLUVuZF90YWdfX19fXzBfX19fbm90X2Nsb3NlX0VSUk9SXz1FbmQgdGFnICg8L3swfT4pIG5vdCBjbG9zZWQuCi1BdHRyaWJ1dGVfdmFsdWVfX18wX19fdXNlc19FUlJPUl89QXR0cmlidXRlIHZhbHVlICh7MH0pIHVzZXMgd3JvbmcgY2FzZSBjaGFyYWN0ZXIuCi1Db21tZW50X25vdF9jbG9zZWRfX0VSUk9SXz1Db21tZW50IG5vdCBjbG9zZWQuCi1ET0NUWVBFX2RlY2xhcmF0aW9uX25vdF9jbF9FUlJPUl89RE9DVFlQRSBkZWNsYXJhdGlvbiBub3QgY2xvc2VkLgotUHJvY2Vzc2luZ19pbnN0cnVjdGlvbl9ub3RfRVJST1JfPVByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm90IGNsb3NlZC4KLUNEQVRBX3NlY3Rpb25fbm90X2Nsb3NlZF9fRVJST1JfPUNEQVRBIHNlY3Rpb24gbm90IGNsb3NlZC4KLSMgRnJvbSBoZXJlLCB0aGUgbmV3IG1lc3NhZ2VzIGFyZSBhZGRlZCBmb3IgVjUKLV9FUlJPUl9UYWdfX18wX19fc2hvdWxkX2JlX2FuX2VtcHR5X2VsZW1lbnRfdGFnXzE9VGFnICh7MH0pIHNob3VsZCBiZSBhbiBlbXB0eS1lbGVtZW50IHRhZy4KLV9FUlJPUl9BdHRyaWJ1dGVfdmFsdWVfX18wX19fbm90X2Nsb3NlZF9fMT1BdHRyaWJ1dGUgdmFsdWUgKHswfSkgbm90IGNsb3NlZC4KLSMKLUhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmc9VXBkYXRpbmcgV2ViIENvbnRlbnQgU2V0dGluZ3MKLUhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmc9UHJvYmxlbSBzYXZpbmcgV2ViIENvbnRlbnQgU2V0dGluZ3MgZm9yIHswfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjYTA4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYgZGVzaXJlZCwKLSAqIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzIHBsdWdpbi4gT3RoZXIKLSAqIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiBAcGFyYW0gbGV2ZWwgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiBAcGFyYW0gbWVzc2FnZSB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5IGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9BYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2ZmMzBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0Fic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgewotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGZDbGVhbnVwUHJlZmVyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCi0JcHVibGljIHZvaWQgc2V0Q2xlYW51cFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcykgewotCi0JCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBjbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkNsZWFudXBQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQkKLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldFRhZ05hbWVDYXNlKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEF0dHJOYW1lQ2FzZShwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX1JFUVVJUkVEX0FUVFJTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRNaXNzaW5nVGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9NSVNTSU5HX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldFF1b3RlQXR0clZhbHVlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRDb252ZXJ0RU9MQ29kZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0RU9MQ29kZShwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQotCQlmUHJvZ3Jlc3NNb25pdG9yID0gcHJvZ3Jlc3NNb25pdG9yOwotCX0KLQotCXN0YXRpYyBwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVNvdXJjZShJRE9NTW9kZWwgbW9kZWwsIE9iamVjdCByZXF1ZXN0ZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzb3VyY2UpIHsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudC5jb250YWluc1JlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKSkKLQkJCXJldHVybiByZXN1bHQ7Ci0JCWlmIChyZXF1ZXN0ZXIgPT0gbnVsbCkgewotCQkJcmVxdWVzdGVyID0gc3RydWN0dXJlZERvY3VtZW50OwotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQocmVxdWVzdGVyLCBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9DU1NUZXh0Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODAwNmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ1NTVGV4dE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZQotCi1wdWJsaWMgY2xhc3MgQ1NTVGV4dE5vZGVDbGVhbnVwSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Tm9kZUNsZWFudXBIYW5kbGVyIHsKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQkJSURPTU1vZGVsIG1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbm9kZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0KLQkJU3RyaW5nIGNvbnRlbnQgPSBnZXRDU1NDb250ZW50KG5vZGUpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5vZGU7Ci0KLQkJaW50IG9mZnNldCA9ICgoSURPTU5vZGUpIG5vZGUpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSAoKElET01Ob2RlKSBub2RlKS5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQkJcmVwbGFjZVNvdXJjZShtb2RlbCwgdGhpcywgb2Zmc2V0LCBsZW5ndGgsIGNvbnRlbnQpOwotCQlyZXR1cm4gKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKG9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q1NTQ29udGVudChOb2RlIHRleHQpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0Q1NTTW9kZWwodGV4dCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlDU1NOb2RlIGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJQ1NTU291cmNlRm9ybWF0dGVyIGZvcm1hdHRlciA9IChDU1NTb3VyY2VGb3JtYXR0ZXIpIGFkYXB0ZXI7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBmb3JtYXR0ZXIuY2xlYW51cChkb2N1bWVudCk7Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgZ2V0Q1NTTW9kZWwoTm9kZSB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEoYWRhcHRlciBpbnN0YW5jZW9mIElTdHlsZVNoZWV0QWRhcHRlcikpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0eWxlU2hlZXRBZGFwdGVyIHN0eWxlQWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCXJldHVybiBzdHlsZUFkYXB0ZXIuZ2V0TW9kZWwoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmQyMGRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLkluc2VydEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5NdWx0aVRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5mb3JtYXQuQ1NTU291cmNlRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotcHVibGljIGNsYXNzIEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQkvKiogTm9uLU5MUyBzdHJpbmdzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHX09QRU4gPSAiPCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFTkRfVEFHX09QRU4gPSAiPC8iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0NMT1NFID0gIj4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfVEFHX0NMT1NFID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URVMgPSAiJyciOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9VQkxFX1FVT1RFUyA9ICJcIlwiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2hhciBTSU5HTEVfUVVPVEUgPSAnXCcnOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIHJlbmFtZWROb2RlID0gKElET01Ob2RlKSBjbGVhbnVwQ2hpbGRyZW4obm9kZSk7Ci0KLQkJLy8gY2FsbCBxdW90ZUF0dHJWYWx1ZSgpIGZpcnN0IHNvIGl0IHdpbGwgY2xvc2UgYW55IHVuY2xvc2VkIGF0dHIKLQkJLy8gcXVvdGVBdHRyVmFsdWUoKSB3aWxsIHJldHVybiB0aGUgbmV3IHN0YXJ0IHRhZyBpZiB0aGVyZSBpcyBhCi0JCS8vIHN0cnVjdHVyZSBjaGFuZ2UKLQkJcmVuYW1lZE5vZGUgPSBxdW90ZUF0dHJWYWx1ZShyZW5hbWVkTm9kZSk7Ci0KLQkJLy8gaW5zZXJ0IHRhZyBjbG9zZSBpZiBtaXNzaW5nCi0JCS8vIGlmIG5vZGUgaXMgbm90IGNvbW1lbnQgdGFnCi0JCS8vIGFuZCBub3QgaW1wbGljaXQgdGFnCi0JCWlmICghKChJRE9NRWxlbWVudCkgcmVuYW1lZE5vZGUpLmlzQ29tbWVudFRhZygpICYmIChyZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpKSB7Ci0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gcmVuYW1lZE5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJLy8gc2F2ZSBzdGFydCBvZmZzZXQgYmVmb3JlIGluc2VydFRhZ0Nsb3NlKCkKLQkJCS8vIG9yIGVsc2UgcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSB3aWxsIGJlIHplcm8gaWYKLQkJCS8vIHJlbmFtZWROb2RlIHJlcGxhY2VkIGJ5IGluc2VydFRhZ0Nsb3NlKCkKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZm9yIHN0YXJ0IHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJLy8gdXBkYXRlIHJlbmFtZWROb2RlIGFuZCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZnRlcgotCQkJLy8gaW5zZXJ0VGFnQ2xvc2UoKQotCQkJcmVuYW1lZE5vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCQkJc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQkvLyBmb3IgZW5kIHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0KLQkJLy8gY2FsbCBpbnNlcnRNaXNzaW5nVGFncygpIG5leHQsIGl0IHdpbGwgZ2VuZXJhdGUgaW1wbGljaXQgdGFncyBpZgotCQkvLyB0aGVyZSBhcmUgYW55Ci0JCS8vIGluc2VydE1pc3NpbmdUYWdzKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBtaXNzaW5nIHN0YXJ0IHRhZyBpZiBvbmUgaXMKLQkJLy8gbWlzc2luZwotCQkvLyBhcHBseVRhZ05hbWVDYXNlKCkgd2lsbCByZXR1cm4gdGhlIHJlbmFtZWQgbm9kZS4KLQkJLy8gVGhlIHJlbmFtZWQvbmV3IG5vZGUgd2lsbCBiZSBzYXZlZCBhbmQgcmV0dXJuZWQgdG8gY2FsbGVyIHdoZW4gYWxsCi0JCS8vIGNsZWFudXAgaXMgZG9uZS4KLQkJcmVuYW1lZE5vZGUgPSBpbnNlcnRNaXNzaW5nVGFncyhyZW5hbWVkTm9kZSk7Ci0JCXJlbmFtZWROb2RlID0gaW5zZXJ0UmVxdWlyZWRBdHRycyhyZW5hbWVkTm9kZSk7Ci0JCXJlbmFtZWROb2RlID0gYXBwbHlUYWdOYW1lQ2FzZShyZW5hbWVkTm9kZSk7Ci0JCWFwcGx5QXR0ck5hbWVDYXNlKHJlbmFtZWROb2RlKTsKLQkJY2xlYW51cENTU0F0dHJWYWx1ZShyZW5hbWVkTm9kZSk7Ci0KLQkJcmV0dXJuIHJlbmFtZWROb2RlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiBjbGVhbnVwIHNob3VsZCBtb2RpZnkgY2FzZS4gUmV0dXJucyB0cnVlIGNhc2Ugc2hvdWxkIGJlCi0JICogcHJlc2VydmVkLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCBpcyBjYXNlIHNlbnNpdGl2ZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFByZXNlcnZlQ2FzZShJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGNhc2Ugb3B0aW9uIGNhbiBiZSBhcHBsaWVkIHRvIG5vIG5hbWVzcGFjZSB0YWdzCi0JCXJldHVybiAhZWxlbWVudC5pc0dsb2JhbFRhZygpOwotCQkvKgotCQkgKiBNb2RlbFF1ZXJ5QWRhcHRlciBtcWFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpCi0JCSAqIGVsZW1lbnQuZ2V0QWRhcHRlckZvcihNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcyk7IE1vZGVsUXVlcnkgbXEgPQotCQkgKiBudWxsOyBDTU5vZGUgbm9kZWRlY2wgPSBudWxsOyBpZiAobXFhZGFwdGVyICE9IG51bGwpIG1xID0KLQkJICogbXFhZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsgaWYgKG1xICE9IG51bGwpIG5vZGVkZWNsID0KLQkJICogbXEuZ2V0Q01Ob2RlKG5vZGUpOyAvLyBpZiBhIE5vZGUgaXNuJ3QgcmVjb2duaXplZCBhcyBIVE1MIG9yIGlzIGFuZAotCQkgKiBjYXJlcyBhYm91dCBjYXNlLCBkbyBub3QgYWx0ZXIgaXQgLy8gaWYgKG5vZGVkZWNsID09IG51bGwgfHwKLQkJICogKG5vZGVkZWNsIGluc3RhbmNlb2YgSFRNTENNTm9kZSAmJiAoKEhUTUxDTU5vZGUpCi0JCSAqIG5vZGVkZWNsKS5zaG91bGRJZ25vcmVDYXNlKCkpKSBpZiAoIQotCQkgKiBub2RlZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHJldHVybgotCQkgKiBmYWxzZTsgcmV0dXJuCi0JCSAqICgoQm9vbGVhbiljbW5vZGUuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKS5ib29sZWFuVmFsdWUoKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGNsZWFudXAgc2hvdWxkIGZvcmNlIG1vZGlmeWluZyBlbGVtZW50IG5hbWUgdG8gYWxsIGxvd2VyY2FzZS4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBjbGVhbnVwIHNob3VsZCBsb3dlcmNhc2UgZWxlbWVudCBuYW1lLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gZWxlbWVudC5pc1hNTFRhZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFwcGx5QXR0ck5hbWVDYXNlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm47IC8vIGRvIG5vdGhpbmcKLQotCQlpbnQgYXR0ck5hbWVDYXNlID0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUzsKLQkJaWYgKCFzaG91bGRQcmVzZXJ2ZUNhc2UoZWxlbWVudCkpIHsKLQkJCWlmIChpc1hNTFRhZyhlbGVtZW50KSkKLQkJCQlhdHRyTmFtZUNhc2UgPSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUjsKLQkJCWVsc2UKLQkJCQlhdHRyTmFtZUNhc2UgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRBdHRyTmFtZUNhc2UoKTsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBhdHRyaWJ1dGVzTGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJSURPTU5vZGUgZWFjaEF0dHIgPSAoSURPTU5vZGUpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCVN0cmluZyBvbGRBdHRyTmFtZSA9IGVhY2hBdHRyLmdldE5vZGVOYW1lKCk7Ci0JCQlTdHJpbmcgbmV3QXR0ck5hbWUgPSBvbGRBdHRyTmFtZTsKLQkJCS8qCi0JCQkgKiAyNTQ5NjEgLSBhbGwgSFRNTCB0YWcgbmFtZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcyBzaG91bGQgYmUgaW4KLQkJCSAqIEVuZ2xpc2ggZXZlbiBmb3IgSFRNTCBmaWxlcyBpbiBvdGhlciBsYW5ndWFnZXMgbGlrZSBKYXBhbmVzZSBvcgotCQkJICogVHVya2lzaC4gRW5nbGlzaCBsb2NhbGUgc2hvdWxkIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuCi0JCQkgKiB1cHBlcmNhc2UgYW5kIGxvd2VyY2FzZSAob3RoZXJ3aXNlICJsaW5rIiB3b3VsZCBiZSBjb252ZXJ0ZWQgdG8KLQkJCSAqIFR1cmtpc2ggIkkgT3ZlcmRvdCBDYXBpdGFsIikuCi0JCQkgKi8KLQkJCWlmIChhdHRyTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJbmV3QXR0ck5hbWUgPSBvbGRBdHRyTmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotCQkJZWxzZSBpZiAoYXR0ck5hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCW5ld0F0dHJOYW1lID0gb2xkQXR0ck5hbWUudG9VcHBlckNhc2UoTG9jYWxlLlVTKTsKLQotCQkJaWYgKG5ld0F0dHJOYW1lLmNvbXBhcmVUbyhvbGRBdHRyTmFtZSkgIT0gMCkgewotCQkJCWludCBhdHRyTmFtZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlpbnQgYXR0ck5hbWVMZW5ndGggPSBvbGRBdHRyTmFtZS5sZW5ndGgoKTsKLQotCQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgYXR0ck5hbWVTdGFydE9mZnNldCwgYXR0ck5hbWVMZW5ndGgsIG5ld0F0dHJOYW1lKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBhcHBseVRhZ05hbWVDYXNlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWludCB0YWdOYW1lQ2FzZSA9IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVM7Ci0KLQkJaWYgKCFzaG91bGRQcmVzZXJ2ZUNhc2UoZWxlbWVudCkpIHsKLQkJCWlmIChpc1hNTFRhZyhlbGVtZW50KSkKLQkJCQl0YWdOYW1lQ2FzZSA9IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSOwotCQkJZWxzZQotCQkJCXRhZ05hbWVDYXNlID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0VGFnTmFtZUNhc2UoKTsKLQkJfQotCi0JCVN0cmluZyBvbGRUYWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgbmV3VGFnTmFtZSA9IG9sZFRhZ05hbWU7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCS8qCi0JCSAqIDI1NDk2MSAtIGFsbCBIVE1MIHRhZyBuYW1lcyBhbmQgYXR0cmlidXRlIG5hbWVzIHNob3VsZCBiZSBpbgotCQkgKiBFbmdsaXNoIGV2ZW4gZm9yIEhUTUwgZmlsZXMgaW4gb3RoZXIgbGFuZ3VhZ2VzIGxpa2UgSmFwYW5lc2Ugb3IKLQkJICogVHVya2lzaC4gRW5nbGlzaCBsb2NhbGUgc2hvdWxkIGJlIHVzZWQgdG8gY29udmVydCBiZXR3ZWVuIHVwcGVyY2FzZQotCQkgKiBhbmQgbG93ZXJjYXNlIChvdGhlcndpc2UgImxpbmsiIHdvdWxkIGJlIGNvbnZlcnRlZCB0byBUdXJraXNoICJJCi0JCSAqIE92ZXJkb3QgQ2FwaXRhbCIpLgotCQkgKi8KLQkJaWYgKHRhZ05hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJbmV3VGFnTmFtZSA9IG9sZFRhZ05hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLQkJZWxzZSBpZiAodGFnTmFtZUNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpCi0JCQluZXdUYWdOYW1lID0gb2xkVGFnTmFtZS50b1VwcGVyQ2FzZShMb2NhbGUuVVMpOwotCi0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQkJSVRleHRSZWdpb24gc3RhcnRUYWdOYW1lUmVnaW9uID0gcmVnaW9ucy5nZXQoMSk7Ci0JCQkJaW50IHN0YXJ0VGFnTmFtZVN0YXJ0T2Zmc2V0ID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoc3RhcnRUYWdOYW1lUmVnaW9uKTsKLQkJCQlpbnQgc3RhcnRUYWdOYW1lTGVuZ3RoID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChzdGFydFRhZ05hbWVSZWdpb24pIC0gc3RhcnRUYWdOYW1lU3RhcnRPZmZzZXQ7Ci0KLQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFRhZ05hbWVTdGFydE9mZnNldCwgc3RhcnRUYWdOYW1lTGVuZ3RoLCBuZXdUYWdOYW1lKTsKLQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ05hbWVTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJCQkvLyBuZXcKLQkJCQkvLyBub2RlCi0JCQl9Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHJlZ2lvbnMgIT0gbnVsbCAmJiByZWdpb25zLnNpemUoKSA+IDApIHsKLQkJCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gcmVnaW9ucy5nZXQoMSk7Ci0JCQkJaW50IGVuZFRhZ05hbWVTdGFydE9mZnNldCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChlbmRUYWdOYW1lUmVnaW9uKTsKLQkJCQlpbnQgZW5kVGFnTmFtZUxlbmd0aCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGVuZFRhZ05hbWVSZWdpb24pIC0gZW5kVGFnTmFtZVN0YXJ0T2Zmc2V0OwotCi0JCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgZW5kVGFnTmFtZVN0YXJ0T2Zmc2V0LCBlbmRUYWdOYW1lTGVuZ3RoLCBuZXdUYWdOYW1lKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGNsZWFudXBDaGlsZHJlbihOb2RlIG5vZGUpIHsKLQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZTsKLQotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSBmYWN0b3J5ID0gSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJd2hpbGUgKGNoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJLy8gY2xlYW51cCB0aGlzIGNoaWxkIG5vZGUKLQkJCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZmFjdG9yeS5jcmVhdGVIYW5kbGVyKGNoaWxkTm9kZSwgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkpOwotCQkJCWNoaWxkTm9kZSA9IGNsZWFudXBIYW5kbGVyLmNsZWFudXAoY2hpbGROb2RlKTsKLQotCQkJCS8vIGdldCBuZXcgcGFyZW50IG5vZGUKLQkJCQlwYXJlbnROb2RlID0gY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCS8vIGdldCBuZXh0IGNoaWxkIG5vZGUKLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFudXBDU1NBdHRyVmFsdWUoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybjsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkpCi0JCQlyZXR1cm47Ci0KLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB2YWx1ZSA9IGdldENTU1ZhbHVlKGF0dHIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG9sZFZhbHVlID0gKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkKLQkJCXJldHVybjsKLQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgZ2V0Q1NTTW9kZWwoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENTU1ZhbHVlKEF0dHIgYXR0cikgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbChhdHRyKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgYWRhcHRlcjsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5jbGVhbnVwKGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eUVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIGluc2VydEVuZFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0KLQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBudWxsOwotCi0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQkJZWxzZSBpZiAoaXNFbXB0eUVsZW1lbnQoZWxlbWVudCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChsYXN0UmVnaW9uKSwgbGFzdFJlZ2lvbi5nZXRMZW5ndGgoKSwgRU1QVFlfVEFHX0NMT1NFKTsKLQotCQkJaWYgKHJlZ2lvbnMuc2l6ZSgpID4gMSkgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbkJlZm9yZVRhZ0Nsb3NlID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxIC0gMSk7Ci0KLQkJCQkvLyBpbnNlcnQgYSBzcGFjZSBzZXBhcmF0b3IgYmVmb3JlIHRhZyBjbG9zZSBpZiB0aGUgcHJldmlvdXMKLQkJCQkvLyByZWdpb24gZG9lcyBub3QgaGF2ZSBleHRyYSBzcGFjZXMKLQkJCQlpZiAocmVnaW9uQmVmb3JlVGFnQ2xvc2UuZ2V0VGV4dExlbmd0aCgpID09IHJlZ2lvbkJlZm9yZVRhZ0Nsb3NlLmdldExlbmd0aCgpKQotCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChsYXN0UmVnaW9uKSwgMCwgIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlTdHJpbmcgZW5kVGFnID0gRU5EX1RBR19PUEVOLmNvbmNhdCh0YWdOYW1lKS5jb25jYXQoVEFHX0NMT1NFKTsKLQotCQkJSURPTU5vZGUgbGFzdENoaWxkID0gKElET01Ob2RlKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaW50IGVuZFRhZ1N0YXJ0T2Zmc2V0ID0gMDsKLQkJCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCQkvLyBpZiB0aGlzIG5vZGUgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcgYWZ0ZXIgdGhlCi0JCQkJLy8gbGFzdCBjaGlsZAotCQkJCWVuZFRhZ1N0YXJ0T2Zmc2V0ID0gbGFzdENoaWxkLmdldEVuZE9mZnNldCgpOwotCQkJZWxzZQotCQkJCS8vIGlmIHRoaXMgbm9kZSBkb2VzIG5vdCBoYXMgY2hpbGRyZW4sIGluc2VydCB0aGUgZW5kIHRhZwotCQkJCS8vIGFmdGVyIHRoZSBzdGFydCB0YWcKLQkJCQllbmRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJcmVwbGFjZVNvdXJjZShzdHJ1Y3R1cmVkTW9kZWwsIHN0cnVjdHVyZWREb2N1bWVudCwgZW5kVGFnU3RhcnRPZmZzZXQsIDAsIGVuZFRhZyk7Ci0JCX0KLQotCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsgLy8gc2F2ZQotCQkvLyBuZXcKLQkJLy8gbm9kZQotCi0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBpbnNlcnRNaXNzaW5nVGFncyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MgPSBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKS5nZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkJCS8vIGltcGxpY2l0IHN0YXJ0IHRhZzsgZ2VuZXJhdGUgdGFnIGZvciBpdAotCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhub2RlKTsKLQkJCQlzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXdOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHJlZ2lvbkxpc3QgIT0gbnVsbCAmJiByZWdpb25MaXN0LmdldChyZWdpb25MaXN0LnNpemUoKSAtIDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gc3RhcnQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzU3RhcnRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhuZXdOb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gZW5kIHRhZyBtaXNzaW5nCi0JCQkJCWlmIChpc0VuZFRhZ1JlcXVpcmVkKG5ld05vZGUpKQotCQkJCQkJbmV3Tm9kZSA9IGluc2VydEVuZFRhZyhuZXdOb2RlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgaW5zZXJ0U3RhcnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG51bGw7Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCVN0cmluZyBzdGFydFRhZyA9IFNUQVJUX1RBR19PUEVOLmNvbmNhdCh0YWdOYW1lKS5jb25jYXQoVEFHX0NMT1NFKTsKLQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIHN0YXJ0VGFnU3RhcnRPZmZzZXQsIDAsIHN0YXJ0VGFnKTsKLQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJLy8gbmV3Ci0JCS8vIG5vZGUKLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnNlcnRUYWdDbG9zZShJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmICgoZmxhdE5vZGUgIT0gbnVsbCkgJiYgKGZsYXROb2RlLmdldFJlZ2lvbnMoKSAhPSBudWxsKSkgewotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gcmVnaW9uTGlzdC5nZXQocmVnaW9uTGlzdC5zaXplKCkgLSAxKTsKLQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGxhc3RSZWdpb24uZ2V0VHlwZSgpOwotCQkJCWlmICgocmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpICYmIChyZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0KLQkJCQkJLy8gaW5zZXJ0ICI+IiBhZnRlciBsYXN0UmVnaW9uIG9mIGZsYXROb2RlCi0JCQkJCS8vIGFzIGluICI8YTwvYT4iIGlmIGZsYXROb2RlIGlzIGZvciBzdGFydCB0YWcsIG9yIGluCi0JCQkJCS8vICI8YT48L2EiIGlmIGZsYXROb2RlIGlzIGZvciBlbmQgdGFnCi0JCQkJCXJlcGxhY2VTb3VyY2Uoc3RydWN0dXJlZE1vZGVsLCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuZFRhZ1JlcXVpcmVkKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5vZGUuaXNDb250YWluZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIHRhZ3Mgb2YgSFRNTCBFTVBUWSBjb250ZW50IHR5cGUsIHN1Y2ggYXMgSU1HLCBhbmQgSFRNTAotCSAqIHVuZGVmaW5lZCB0YWdzIGFyZSBwYXJzZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBzdGFydCB0YWdzLiBTbyBpbnNlcnRpbmcKLQkgKiB0aGUgbWlzc2luZyBzdGFydCB0YWcgaXMgdXNlbGVzcyBhbmQgZXZlbiBoYXJtZnVsLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU3RhcnRUYWdSZXF1aXJlZChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYTUxUeXBlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwgJiYgc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXREb2N1bWVudCgpOwotCi0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBkb2N1bWVudC5pc1hNTFR5cGUoKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIElET01Ob2RlIHF1b3RlQXR0clZhbHVlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChxdW90ZUF0dHJWYWx1ZXMpIHsKLQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzTGVuZ3RoOyBpKyspIHsKLQkJCQlhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJSURPTUF0dHIgZWFjaEF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkvLyBJVGV4dFJlZ2lvbiBvbGRBdHRyVmFsdWVSZWdpb24gPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCVN0cmluZyBvbGRBdHRyVmFsdWUgPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQlpZiAob2xkQXR0clZhbHVlID09IG51bGwpIHsKLQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKGlzWE1MVHlwZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkvLyBUT0RPOiBLaXQsIHBsZWFzZSBjaGVjay4gSXMgdGhlcmUgYW55IHdheSB0byBub3QKLQkJCQkJCS8vIHJlbHkgb24gZ2V0dGluZyByZWdpb25zIGZyb20gYXR0cmlidXRlcz8KLQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSAiPVwiIiArIGVhY2hBdHRyLmdldE5hbWVSZWdpb25UZXh0KCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBlYWNoQXR0ci5nZXROYW1lUmVnaW9uRW5kT2Zmc2V0KCksIDAsIG5ld0F0dHJWYWx1ZSk7Ci0JCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOyAvLyBzYXZlCi0JCQkJCQkvLyBuZXcKLQkJCQkJCS8vIG5vZGUKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQotCQkJCQljaGFyIHF1b3RlID0gU3RyaW5nVXRpbHMuaXNRdW90ZWQob2xkQXR0clZhbHVlKSA/IG9sZEF0dHJWYWx1ZS5jaGFyQXQoMCkgOiBET1VCTEVfUVVPVEU7Ci0JCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoZWFjaEF0dHIsIHF1b3RlKTsKLQotCQkJCQkvLyBUaGVyZSBpcyBhIHByb2JsZW0gaW4KLQkJCQkJLy8gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoSVRleHRSZWdpb24pCi0JCQkJCS8vIHdoZW4gdGhlIHJlZ2lvbiBpcyBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24uCi0JCQkJCS8vIFdvcmthcm91bmQgZm9yIG5vdy4uLgotCQkJCQlpZiAob2xkQXR0clZhbHVlLmxlbmd0aCgpID09IDEpIHsKLQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gb2xkQXR0clZhbHVlLmNoYXJBdCgwKTsKLQkJCQkJCWlmIChmaXJzdENoYXIgPT0gU0lOR0xFX1FVT1RFKQotCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IFNJTkdMRV9RVU9URVM7Ci0JCQkJCQllbHNlIGlmIChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKQotCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IERPVUJMRV9RVU9URVM7Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV3QXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkJCWlmIChuZXdBdHRyVmFsdWUuY29tcGFyZVRvKG9sZEF0dHJWYWx1ZSkgIT0gMCkgewotCQkJCQkJCWludCBhdHRyVmFsdWVTdGFydE9mZnNldCA9IGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlpbnQgYXR0clZhbHVlTGVuZ3RoID0gb2xkQXR0clZhbHVlLmxlbmd0aCgpOwotCQkJCQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCQkJCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQlyZXBsYWNlU291cmNlKHN0cnVjdHVyZWRNb2RlbCwgc3RydWN0dXJlZERvY3VtZW50LCBhdHRyVmFsdWVTdGFydE9mZnNldCwgYXR0clZhbHVlTGVuZ3RoLCBuZXdBdHRyVmFsdWUpOwotCQkJCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJCQkJLy8gbmV3Ci0JCQkJCQkJLy8gbm9kZQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRSZXF1aXJlZEF0dHJzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0UmVxdWlyZWRBdHRycykgewotCQkJTGlzdCByZXF1aXJlZEF0dHJzID0gZ2V0UmVxdWlyZWRBdHRycyhuZXdOb2RlKTsKLQkJCWlmIChyZXF1aXJlZEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQlOYW1lZE5vZGVNYXAgY3VycmVudEF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJTGlzdCBpbnNlcnRBdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY3VycmVudEF0dHJzLmdldExlbmd0aCgpID09IDApCi0JCQkJCWluc2VydEF0dHJzLmFkZEFsbChyZXF1aXJlZEF0dHJzKTsKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyTmFtZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVxdWlyZWRBdHRycy5nZXQoaSkpLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJU3RyaW5nIGN1cnJlbnRBdHRyTmFtZSA9IGN1cnJlbnRBdHRycy5pdGVtKGopLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJaWYgKHJlcXVpcmVkQXR0ck5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjdXJyZW50QXR0ck5hbWUpID09IDApIHsKLQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJCWluc2VydEF0dHJzLmFkZChyZXF1aXJlZEF0dHJzLmdldChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGluc2VydEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaW50IGluZGV4ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4LS07Ci0JCQkJCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4ID0gaW5kZXggLSAyOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0KLQkJCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoaW50IGkgPSBpbnNlcnRBdHRycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5zZXJ0QXR0cnMuZ2V0KGkpOwotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyRGVjbC5nZXREZWZhdWx0VmFsdWUoKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpCi0JCQkJCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG5hbWVBbmREZWZhdWx0VmFsdWUgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoaSA9PSAwICYmIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCkgPiBsYXN0UmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSArPSByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgKyAiPVwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoaW5kZXgsIG5hbWVBbmREZWZhdWx0VmFsdWUpKTsKLQkJCQkJCQkvLyBCVUczMzgxOiBNdWx0aVRleHRFZGl0IGFwcGxpZXMgYWxsIGNoaWxkCi0JCQkJCQkJLy8gVGV4dEVkaXQncyBiYXNpbmcgb24gb2Zmc2V0cwotCQkJCQkJCS8vIGluIHRoZSBkb2N1bWVudCBiZWZvcmUgdGhlIGZpcnN0IFRleHRFZGl0LCBub3QKLQkJCQkJCQkvLyBhZnRlciBlYWNoCi0JCQkJCQkJLy8gY2hpbGQgVGV4dEVkaXQuIFRoZXJlZm9yZSwgZG8gbm90IG5lZWQgdG8KLQkJCQkJCQkvLyBhZHZhbmNlIHRoZSBpbmRleC4KLQkJCQkJCQkvLyBpbmRleCArPSBuYW1lQW5kRGVmYXVsdFZhbHVlLmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQkJbXVsdGlUZXh0RWRpdC5hcHBseShuZXdOb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIG9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KE5vZGUgbm9kZSkgewotCQlNb2RlbFF1ZXJ5IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KChEb2N1bWVudCkgbm9kZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGdldFJlcXVpcmVkQXR0cnMoTm9kZSBub2RlKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IGdldE1vZGVsUXVlcnkobm9kZSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJSXRlcmF0b3IgaXQgPSBhdHRyTWFwLml0ZXJhdG9yKCk7Ci0JCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gbnVsbDsKLQkJCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJCWF0dHIgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaXQubmV4dCgpOwotCQkJCQlpZiAoYXR0ci5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJCXJlc3VsdC5hZGQoYXR0cik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxZWE2OGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vLyBuYWthbW9yaV9UT0RPOiBjaGVjayBhbmQgcmVtb3ZlIENTUyBmb3JtYXR0aW5nCi0KLWNsYXNzIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgewotCi0KLQotCXByaXZhdGUgc3RhdGljIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkgZkluc3RhbmNlID0gbnVsbDsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgSFRNTENsZWFudXBIYW5kbGVyRmFjdG9yeSgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBIVE1MQ2xlYW51cEhhbmRsZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY3JlYXRlSGFuZGxlcihOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcykgewotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBoYW5kbGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlpZiAoaXNKU1BUYWcobm9kZSkpCi0JCQkJCWhhbmRsZXIgPSBuZXcgSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWVsc2UKLQkJCQkJaGFuZGxlciA9IG5ldyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCWlmIChpc1BhcmVudFN0eWxlVGFnKG5vZGUpKQotCQkJCQloYW5kbGVyID0gbmV3IENTU1RleHROb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQllbHNlCi0JCQkJCWhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQl9Ci0JCX0KLQotCQloYW5kbGVyLnNldENsZWFudXBQcmVmZXJlbmNlcyhjbGVhbnVwUHJlZmVyZW5jZXMpOwotCi0JCXJldHVybiBoYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcoTm9kZSBub2RlKSB7Ci0KLQkJZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCS8vIGluIHNvbWUgY2FzZXMsIHRoZSBub2RlcyBleGlzdHMsIGJ1dCBoYXNuJ3QgYmVlbiBhc3NvY2lhdGVkCi0JCQkvLyB3aXRoCi0JCQkvLyBhIGZsYXRub2RlIHlldCAodGhlIHNjcmVlbiB1cGRhdGVzIGNhbiBiZSBpbml0aWF0ZWQgb24gYQotCQkJLy8gZGlmZmVyZW50IHRocmVhZCwKLQkJCS8vIHNvIHRoZSByZXF1ZXN0IGZvciBhIGZsYXRub2RlIGNhbiBjb21lIGluIGJlZm9yZSB0aGUgbm9kZSBpcwotCQkJLy8gZnVsbHkgZm9ybWVkLgotCQkJLy8gaWYgdGhlIGZsYXRub2RlIGlzIG51bGwsIHdlJ2xsIGp1c3QgYWxsb3cgdGhlIGRlZmF1bHRzIHRvCi0JCQkvLyBhcHBseS4KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZsYXROb2RlVHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCQkvLyBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBqdXN0IHRvIGJlIHN1cmUKLQkJCQlpZiAoZmxhdE5vZGVUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DT05URU5UKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0VYUFJFU1NJT05fT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9TQ1JJUFRMRVRfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ERUNMQVJBVElPTl9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfTkFNRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DTE9TRSkpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNQYXJlbnRTdHlsZVRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9ICgoSURPTU5vZGUpIG5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZmxhdE5vZGUuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBjaGVjayBpZiB0aGUgcGFyZW50IGlzIFNUWUxFIGVsZW1lbnQKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuYW1lID0gcGFyZW50LmdldE5vZGVOYW1lKCk7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghbmFtZS5lcXVhbHNJZ25vcmVDYXNlKCJTVFlMRSIpKS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cFByb2Nlc3NvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI3NjVjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9IVE1MQ2xlYW51cFByb2Nlc3NvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQuSFRNTEZvcm1hdFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLkFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxDbGVhbnVwUHJvY2Vzc29ySW1wbCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgewotCXByaXZhdGUgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIEhUTUxDbGVhbnVwSGFuZGxlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVIYW5kbGVyKG5vZGUsIGdldENsZWFudXBQcmVmZXJlbmNlcygpKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkNsZWFudXBQcmVmZXJlbmNlcyA9PSBudWxsKSB7Ci0JCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCk7Ci0JCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0VGFnTmFtZUNhc2UocHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSkpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0QXR0ck5hbWVDYXNlKHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydFJlcXVpcmVkQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUykpOwotCQkJCWZDbGVhbnVwUHJlZmVyZW5jZXMuc2V0UXVvdGVBdHRyVmFsdWVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuUVVPVEVfQVRUUl9WQUxVRVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEZvcm1hdFNvdXJjZShwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRFT0xDb2RlKHByZWZlcmVuY2VzLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkNsZWFudXBQcmVmZXJlbmNlczsKLQl9Ci0JCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMoKSB7Ci0JCWZDbGVhbnVwUHJlZmVyZW5jZXMgPSBudWxsOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9KU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9KU1BFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMGE3ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvSlNQRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEpTUEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJiNjEwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9Ob2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBOb2RlQ2xlYW51cEhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0KLQlwdWJsaWMgTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2hhbmRsZXJzL0NvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzg4MzI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9oYW5kbGVycy9Db21tZW50RWxlbWVudEhhbmRsZXJGb3JTU0kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaGFuZGxlcnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50SGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbC5Db21tZW50RWxlbWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWwuVGFnU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotcHVibGljIGNsYXNzIENvbW1lbnRFbGVtZW50SGFuZGxlckZvclNTSSBpbXBsZW1lbnRzIENvbW1lbnRFbGVtZW50SGFuZGxlciB7Ci0KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZykgewotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ01Eb2N1bWVudCBjbSA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoY20gPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gY20uZ2V0RWxlbWVudHMoKTsKLQkJaWYgKG1hcCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCVRhZ1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBUYWdTY2FubmVyKGRhdGEsIDEpOwotCQlTdHJpbmcgbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobmFtZS5sZW5ndGgoKSArIDQpOwotCQlidWZmZXIuYXBwZW5kKFNTSV9QUkVGSVgpOwotCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCVN0cmluZyB0YWdOYW1lID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCS8vIGNoZWNrIGlmIHZhbGlkIChkZWZpbmVkKSBTU0kgdGFnIG9yIG5vdAotCQlpZiAobWFwLmdldE5hbWVkSXRlbSh0YWdOYW1lKSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUNvbW1lbnRFbGVtZW50RmFjdG9yeSBmYWN0b3J5ID0gbmV3IENvbW1lbnRFbGVtZW50RmFjdG9yeShkb2N1bWVudCwgaXNKU1BUYWcsIHRoaXMpOwotCQlFbGVtZW50IGVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZSh0YWdOYW1lLCBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfU1RBUlQpOwotCi0JCS8vIHNldCBhdHRyaWJ1dGVzCi0JCVN0cmluZyBhdHRyTmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJd2hpbGUgKGF0dHJOYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBzY2FubmVyLm5leHRWYWx1ZSgpOwotCQkJQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGF0dHJOYW1lKTsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlpZiAoYXR0clZhbHVlICE9IG51bGwpCi0JCQkJCWF0dHIuc2V0VmFsdWUoYXR0clZhbHVlKTsKLQkJCQllbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCQlhdHRyTmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBlbGVtZW50LmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnVmZmVyLmFwcGVuZCgnIycpOwotCQlidWZmZXIuYXBwZW5kKGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCkpOwotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0ck5hbWUoYXR0cik7Ci0JCQlpZiAoYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0ck5hbWUpOwotCQkJfQotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCS8vIGF0dHIgbmFtZSBvbmx5IGZvciBIVE1MIGJvb2xlYW4gYW5kIEpTUAotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsgLy8gYWx3YXlzIGVtcHR5Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCUNNRG9jdW1lbnQgY20gPSBtb2RlbFF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGRvY3VtZW50KTsKLQkJaWYgKGNtID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbS5nZXRFbGVtZW50cygpOwotCQlpZiAobWFwID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLQkJaWYgKHByZWZpeCA9PSBudWxsIHx8ICFwcmVmaXguZXF1YWxzKFNTSV9QUkVGSVgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUubGVuZ3RoKCkgPD0gNCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWlmIChtYXAuZ2V0TmFtZWRJdGVtKHRhZ05hbWUpID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9QUkVGSVggPSAic3NpIjsvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRlNjM0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgQXR0cmlidXRlQ29sbGVjdGlvbiBleHRlbmRzIENNTmFtZWROb2RlTWFwSW1wbCBpbXBsZW1lbnRzIEhUTUw0ME5hbWVzcGFjZSB7Ci0KLQkvKiogYm9keWNvbG9ycy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBCT0RZQ09MT1JTID0ge0FUVFJfTkFNRV9CR0NPTE9SLCBBVFRSX05BTUVfVEVYVCwgQVRUUl9OQU1FX0xJTkssIEFUVFJfTkFNRV9WTElOSywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElOS307Ci0JLyoqIGNvcmVhdHRycy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDT1JFID0ge0FUVFJfTkFNRV9JRCwgQVRUUl9OQU1FX0NMQVNTLCBBVFRSX05BTUVfU1RZTEUsIEFUVFJfTkFNRV9USVRMRX07Ci0JLyoqIGV2ZW50cy4gKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFVkVOVFMgPSB7QVRUUl9OQU1FX09OQ0xJQ0ssIEFUVFJfTkFNRV9PTkRCTENMSUNLLCBBVFRSX05BTUVfT05NT1VTRURPV04sIEFUVFJfTkFNRV9PTk1PVVNFVVAsIEFUVFJfTkFNRV9PTk1PVVNFT1ZFUiwgQVRUUl9OQU1FX09OTU9VU0VNT1ZFLCBBVFRSX05BTUVfT05NT1VTRU9VVCwgQVRUUl9OQU1FX09OS0VZUFJFU1MsIEFUVFJfTkFNRV9PTktFWURPV04sIEFUVFJfTkFNRV9PTktFWVVQLCBBVFRSX05BTUVfT05IRUxQfTsKLQkvKiogaTE4bi4gbGFuZywgZGlyICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSTE4TiA9IHtBVFRSX05BTUVfTEFORywgQVRUUl9OQU1FX0RJUn07Ci0JLyoqIGNlbGxoYWxpZ2guICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gQ0VMTEhBTElHTiA9IHtBVFRSX05BTUVfQ0hBUiwgQVRUUl9OQU1FX0NIQVJPRkZ9OwotCi0JLyoqCi0JICogY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlKFN0cmluZyBhdHRyTmFtZSkgewotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCi0JCWlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQkJSKSkgewotCQkJLy8gKGFiYnIgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQkJSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFUFQpKSB7Ci0JCQkvLyAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VQVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNDRVBUX0NIQVJTRVQpKSB7Ci0JCQkvLyAoYWNjZXB0LWNoYXJzZXQgJUNoYXJzZXRzOzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQ0NFUFRfQ0hBUlNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUNUSU9OKSkgewotCQkJLy8gKGFjdGlvbiAlVVJJICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDVElPTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVJDSElWRSkpIHsKLQkJCS8vIChhcmNoaXZlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BUkNISVZFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BQ0NFU1NLRVkpKSB7Ci0JCQkvLyAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNIQVJBQ1RFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FDQ0VTU0tFWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQUxJTkspKSB7Ci0JCQkvLyAoYWxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSU5LLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BTFQpKSB7Ci0JCQkvLyAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVVUT1NUQVJUKSkgewotCQkJLy8gKGF1dG9zdGFydCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPU1RBUlQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FVVE9QTEFZKSkgewotCQkJLy8gKGF1dG9wbGF5ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FVVE9QTEFZLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9BVVRPU0laRSkpIHsKLQkJCS8vIChhdXRvc2l6ZSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BVVRPU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQVhJUykpIHsKLQkJCS8vIChheGlzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BWElTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CQUNLR1JPVU5EKSkgewotCQkJLy8gKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CQUNLR1JPVU5ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CRUhBVklPUikpIHsKLQkJCS8vIChiZWhhdmlvciAoc2Nyb2xsfHNsaWRlfGFsdGVybmF0ZSkgc2Nyb2xsKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9TQ1JPTEwsIEFUVFJfVkFMVUVfU0xJREUsIEFUVFJfVkFMVUVfQUxURVJOQVRFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9TQ1JPTEwpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CRUhBVklPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQkdDT0xPUikpIHsKLQkJCS8vIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9CR0NPTE9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1JERVIpKSB7Ci0JCQkvLyAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0VMTFNQQUNJTkcpKSB7Ci0JCQkvLyAoY2VsbHNwYWNpbmcgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0VMTFNQQUNJTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NFTExQQURESU5HKSkgewotCQkJLy8gKGNlbGxwYWRkaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NFTExQQURESU5HLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DR0kpKSB7Ci0JCQkvLyAoY2dpICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0dJLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DSEFSKSkgewotCQkJLy8gKGNoYXIgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUkFDVEVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hBUk9GRikpIHsKLQkJCS8vIChjaGFyb2ZmICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJPRkYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIQVJTRVQpKSB7Ci0JCQkvLyAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ0hBUlNFVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIQVJTRVQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NJVEUpKSB7Ci0JCQkvLyAoY2l0ZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NJVEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMQVNTKSkgewotCQkJLy8gKGNsYXNzIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEFTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xBU1NJRCkpIHsKLQkJCS8vIChjbGFzc2lkICVVUkkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEFTU0lELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DTUQpKSB7Ci0JCQkvLyAoY21kIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NIRUNLRUQpKSB7Ci0JCQkvLyAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfQ0hFQ0tFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NIRUNLRUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NMRUFSKSkgewotCQkJLy8gKGNsZWFyIChsZWZ0IHwgYWxsIHwgcmlnaHQgfCBub25lKSBub25lKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0FMTCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9OT05FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9OT05FKTsKLQotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DTEVBUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09ERSkpIHsKLQkJCS8vIChjb2RlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0RFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFQkFTRSkpIHsKLQkJCS8vIChjb2RlYmFzZSAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPREVCQVNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0RFVFlQRSkpIHsKLQkJCS8vIChjb2RldHlwZSAlQ290ZW50VHlwZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09ERVRZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0NPTE9SKSkgewotCQkJLy8gKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xPUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09NUEFDVCkpIHsKLQkJCS8vIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DT01QQUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ09NUEFDVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ09MUykpIHsKLQkJCS8vIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTUEFOKSkgewotCQkJLy8gKGNvbHNwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT0xTUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05URU5UKSkgewotCQkJLy8gKGNvbnRlbnQgQ0RBVEEgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05URU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT05UUk9MTEVSKSkgewotCQkJLy8gKGNvbnRyb2xsZXIgKHRydWV8ZmFsc2UpIHRydWUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9DT05UUk9MTEVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT09SRFMpKSB7Ci0JCQkvLyAoY29vcmRzICVDb29yZHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPT1JEUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPT1JEUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREFUQSkpIHsKLQkJCS8vIChkYXRhICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfREFUQSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfREFURVRJTUUpKSB7Ci0JCQkvLyAoZGF0ZXRpbWUgJURhdGV0aW1lOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5EQVRFVElNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RBVEVUSU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUpKSB7Ci0JCQkvLyAoZGF0YXBhZ2VzaXplIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9EQVRBUEFHRVNJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RFQ0xBUkUpKSB7Ci0JCQkvLyAoZGVjbGFyZSAoZGVjbGFyZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfREVDTEFSRX07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RFQ0xBUkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RFRkVSKSkgewotCQkJLy8gKGRlZmVyIChkZWZlcikgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfREVGRVJ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ERUZFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElSKSkgewotCQkJLy8gKGRpciAobHRyfHJ0bCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xUUiwgQVRUUl9WQUxVRV9SVEx9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ESVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0RJUkVDVElPTikpIHsKLQkJCS8vIChkaXJlY3Rpb24gKGxlZnR8cmlnaHR8dXB8ZG93bikgbGVmdCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9VUCwgQVRUUl9WQUxVRV9ET1dOfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRElSRUNUSU9OLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ESVJFQ1RLRVkpKSB7Ci0JCQkvLyAoZGlyZWN0a2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNIQVJBQ1RFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJUkVDVEtFWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRElTQUJMRUQpKSB7Ci0JCQkvLyAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJLy8gYm9vbGVhbiBhdHRyaWJ1dGUgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlIGFzIGl0cyBuYW1lLgotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9ESVNBQkxFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0RJU0FCTEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FTkNUWVBFKSkgewotCQkJLy8gKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1dXV19GT1JNX1VSTEVOQ09ERUQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FTkNUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9FUlJNU0cpKSB7Ci0JCQkvLyAoZXJybXNnIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FUlJNU0csIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VWRU5UKSkgewotCQkJLy8gKGV2ZW50IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9FVkVOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRkFDRSkpIHsKLQkJCS8vIChmYWNlIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GSUxFKSkgewotCQkJLy8gKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GT1IpKSB7Ci0JCQkvLyAoZm9yICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9GUkFNRSkpIHsKLQkJCS8vIChmcmFtZSAlVEZyYW1lOyAjSU1QTElFRCkKLQkJCS8vICVURnJhbWU7IGlzCi0JCQkvLyAodm9pZHxhYm92ZXxiZWxvd3xoc2lkZXN8bGhzfHJoc3x2c2lkZXN8Ym94fGJvcmRlcikuCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1ZPSUQsIEFUVFJfVkFMVUVfQUJPVkUsIEFUVFJfVkFMVUVfQkVMT1csIEFUVFJfVkFMVUVfSFNJREVTLCBBVFRSX1ZBTFVFX0xIUywgQVRUUl9WQUxVRV9SSFMsIEFUVFJfVkFMVUVfVlNJREVTLCBBVFRSX1ZBTFVFX0JPWCwgQVRUUl9WQUxVRV9CT1JERVJ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9GUkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRlJBTUVCT1JERVIpKSB7Ci0JCQkvLyAoZnJhbWVib3JkZXIgKDF8MCkgMSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfMSwgQVRUUl9WQUxVRV8wfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV8xKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQkJLy8gPDxEMjE1Njg0Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfRlJBTUVTUEFDSU5HKSkgewotCQkJLy8gKGZyYW1lc3BhY2luZyBDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0ZSQU1FU1BBQ0lORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQkJLy8gRDIxNTY4NAotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFQURFUlMpKSB7Ci0JCQkvLyAoSEVBREVSUyBJRFJFRlM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLklEUkVGUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hFQURFUlMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFSUdIVCkpIHsKLQkJCS8vIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9ISURERU4pKSB7Ci0JCQkvLyAoaGlkZGVuIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ISURERU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUYpKSB7Ci0JCQkvLyAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hSRUZMQU5HKSkgewotCQkJLy8gKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxBTkdVQUdFX0NPREUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IUkVGTEFORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFNQQUNFKSkgewotCQkJLy8gKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hUVFBfRVFVSVYpKSB7Ci0JCQkvLyAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk5BTUUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IVFRQX0VRVUlWLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9JRCkpIHsKLQkJCS8vIChpZCBJRCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0lTTUFQKSkgewotCQkJLy8gKGlzbWFwIChpc21hcCkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfSVNNQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9JU01BUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSVNUWUxFKSkgewotCQkJLy8gKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSVNUWUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MQUJFTCkpIHsKLQkJCS8vIChsYWJlbCAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBQkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MQU5HKSkgewotCQkJLy8gKGxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEFOR1VBR0VfQ09ERSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBTkcsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xBTkdVQUdFKSkgewotCQkJLy8gKGxhbmd1YWdlICVDREFUQTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xBTkdVQUdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MSU5LKSkgewotCQkJLy8gKGxpbmsgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0xJTkssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPTkdERVNDKSkgewotCQkJLy8gKGxvbmdkZXNjICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTE9OR0RFU0MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0xPT1ApKSB7Ci0JCQkvLyAobG9vcCBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTE9PUCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFDUk8pKSB7Ci0JCQkvLyAobWFjcm8gQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BQ1JPLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVBGSUxFKSkgewotCQkJLy8gKG1hcGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVBGSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVJHSU5XSURUSCkpIHsKLQkJCS8vIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUFSR0lOSEVJR0hUKSkgewotCQkJLy8gKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWExFTkdUSCkpIHsKLQkJCS8vIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFYTEVOR1RILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NQVlTQ1JJUFQpKSB7Ci0JCQkvLyAobWF5c2NyaXB0IChtYXlzY3JpcHQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01BWVNDUklQVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01BWVNDUklQVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTUVESUEpKSB7Ci0JCQkvLyAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTUVESUFfREVTQyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX01FRElBLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRVRIT0QpKSB7Ci0JCQkvLyAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9HRVQsIEFUVFJfVkFMVUVfUE9TVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVUSE9ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NVUxUSVBMRSkpIHsKLQkJCS8vIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01VTFRJUExFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTVVMVElQTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05BTUUpKSB7Ci0JCQkvLyAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9IUkVGKSkgewotCQkJLy8gKG5vaHJlZiAobm9ocmVmKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT0hSRUZ9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT0hSRUYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05PUkVTSVpFKSkgewotCQkJLy8gKG5vcmVzaXplIChub3Jlc2l6ZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfTk9SRVNJWkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1JFU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9TSEFERSkpIHsKLQkJCS8vIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1NIQURFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTk9TSEFERSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9XUkFQKSkgewotCQkJLy8gKG5vd3JhcCAobm93cmFwKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1dSQVB9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9OT1dSQVAsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09CSkVDVCkpIHsKLQkJCS8vIChvYmplY3QgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX05BTUVfT0JKRUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT0JKRUNULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkJMVVIpKSB7Ci0JCQkvLyAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQkxVUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05DTElDSykpIHsKLQkJCS8vIChvbmNsaWNrICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0xJQ0ssIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OQ0hBTkdFKSkgewotCQkJLy8gKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OQ0hBTkdFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkRCTENMSUNLKSkgewotCQkJLy8gKG9uZGJsY2xpY2sgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05EQkxDTElDSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05GT0NVUykpIHsKLQkJCS8vIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09ORk9DVVMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OSEVMUCkpIHsKLQkJCS8vIChvbmhlbHAgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05IRUxQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTktFWVBSRVNTKSkgewotCQkJLy8gKG9ua2V5cHJlc3MgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05LRVlQUkVTUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05LRVlET1dOKSkgewotCQkJLy8gKG9ua2V5ZG93biAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWURPV04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OS0VZVVApKSB7Ci0JCQkvLyAob25reWV1cCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTktFWVVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTkxPQUQpKSB7Ci0JCQkvLyAob25sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRURPV04pKSB7Ci0JCQkvLyAob25tb3VzZWRvd24gJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRURPV04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VVUCkpIHsKLQkJCS8vIChvbm1vdXNldXAgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRVVQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTk1PVVNFT1ZFUikpIHsKLQkJCS8vIChvbm1vdXNlb3ZlciAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFT1ZFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05NT1VTRU1PVkUpKSB7Ci0JCQkvLyAob25tb3VzZW1vdmUgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05NT1VTRU1PVkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OTU9VU0VPVVQpKSB7Ci0JCQkvLyAob25tb3VzZW91dCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTk1PVVNFT1VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlJFU0VUKSkgewotCQkJLy8gKG9ucmVzZXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05SRVNFVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfT05TRUxFQ1QpKSB7Ci0JCQkvLyAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuU0NSSVBUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfT05TRUxFQ1QsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX09OU1VCTUlUKSkgewotCQkJLy8gKG9uc3VibWl0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNDUklQVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX09OU1VCTUlULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9PTlVOTE9BRCkpIHsKLQkJCS8vIChvbnVubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5TQ1JJUFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9PTlVOTE9BRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUEFMRVRURSkpIHsKLQkJCS8vIChwYWxldHRlIENEQVRBOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUEFMRVRURSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUEFORUwpKSB7Ci0JCQkvLyAocGFuZWwgQ0RBVEE7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QQU5FTCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUExBWUNPVU5UKSkgewotCQkJLy8gKHBsYXljb3VudCBOVU1CRVI7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUExBWUNPVU5ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QUk9GSUxFKSkgewotCQkJLy8gKHByb2ZpbGUgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9QUk9GSUxFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9QUk9NUFQpKSB7Ci0JCQkvLyAocHJvbXB0ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUFJPTVBULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRUFET05MWSkpIHsKLQkJCS8vIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1JFQURPTkxZfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVBRE9OTFksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JFUEVBVCkpIHsKLQkJCS8vIChyZXBlYXQgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JFUEVBVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUkVMKSkgewotCQkJLy8gKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MSU5LX1RZUEVTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9SRVYpKSB7Ci0JCQkvLyAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJTktfVFlQRVMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9SRVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1JPV1MpKSB7Ci0JCQkvLyAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XU1BBTikpIHsKLQkJCS8vIChyb3dzcGFuIE5VTUJFUiAxKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV8xKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUk9XU1BBTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUlVMRVMpKSB7Ci0JCQkvLyAocnVsZXMgJVRSdWxlczsgI0lNUExJRUQpCi0JCQkvLyAlVFJ1bGVzOyBpcyAobm9uZSB8IGdyb3VwcyB8IHJvd3MgfCBjb2xzIHwgYWxsKS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTk9ORSwgQVRUUl9WQUxVRV9HUk9VUFMsIEFUVFJfVkFMVUVfUk9XUywgQVRUUl9WQUxVRV9DT0xTLCBBVFRSX1ZBTFVFX0FMTH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1JVTEVTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ0FMRSkpIHsKLQkJCS8vIChzY2FsZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NBTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDSEVNRSkpIHsKLQkJCS8vIChzY2hlbWUgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDSEVNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0VMRUNURUQpKSB7Ci0JCQkvLyAoc2VsZWN0ZWQgKHNlbGVjdGVkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9TRUxFQ1RFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NFTEVDVEVELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ09QRSkpIHsKLQkJCS8vIChTQ09QRSAlU2NvcGU7ICNJTVBMSUVEKQotCQkJLy8gJVNjb3BlOyBpcyAocm93fGNvbHxyb3dncm91cHxjb2xncm91cCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUk9XLCBBVFRSX1ZBTFVFX0NPTCwgQVRUUl9WQUxVRV9ST1dHUk9VUCwgQVRUUl9WQUxVRV9DT0xHUk9VUH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDT1BFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TQ1JPTExBTU9VTlQpKSB7Ci0JCQkvLyAoc2Nyb2xsYW1vdW50IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0NST0xMREVMQVkpKSB7Ci0JCQkvLyAoc2Nyb2xsZGVsYXkgTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0NST0xMREVMQVksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NDUk9MTElORykpIHsKLQkJCS8vIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9ZRVMsIEFUVFJfVkFMVUVfTk8sIEFUVFJfVkFMVUVfQVVUT307Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQVVUTyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NDUk9MTElORywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0hBUEUpKSB7Ci0JCQkvLyAoc2hhcGUgJVNoYXBlOyByZWN0KTogJVNoYXBlOyBpcyAocmVjdHxjaXJjbGV8cG9seXxkZWZhdWx0KS4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfUkVDVCwgQVRUUl9WQUxVRV9DSVJDTEUsIEFUVFJfVkFMVUVfUE9MWSwgQVRUUl9WQUxVRV9ERUZBVUxUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9SRUNUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0hBUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NIT1dDT05UUk9MUykpIHsKLQkJCS8vIChzaG93Y29udHJvbHMgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UUlVFLCBBVFRSX1ZBTFVFX0ZBTFNFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0hPV0NPTlRST0xTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TSVpFKSkgewotCQkJLy8gKHNpemUgJVBpeGVsczsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuUElYRUxTKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU0laRUZNVCkpIHsKLQkJCS8vIChzaXplZm10IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFRk1ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUEFOKSkgewotCQkJLy8gKHNwYW4gTlVNQkVSIDEpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFXzEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TUEFOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUkMpKSB7Ci0JCQkvLyAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkJLy8gTk9URTogInNyYyIgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiBzZXZlcmFsIGVsZW1lbnRzLgotCQkJLy8gVGhlIGRlZmluaXRpb24gb2YgSU1HIGlzIGRpZmZlcmVudCBmcm9tIG90aGVycy4KLQkJCS8vIFNvLCBpdCBzaG91bGQgYmUgbG9jYWxseSBkZWZpbmVkLgotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TVEFSVCkpIHsKLQkJCS8vIChzdGFydCBOVU1CRVIgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TVEFSVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1RBTkRCWSkpIHsKLQkJCS8vIChzdGFuZGJ5ICVUZXh0OyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1RBTkRCWSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfU1RZTEUpKSB7Ci0JCQkvLyAoc3R5bGUgJVN0eWxlU2hlZXQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlNUWUxFX1NIRUVUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU1RZTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NVTU1BUlkpKSB7Ci0JCQkvLyAoc3VtbWFyeSAlVGV4dDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuVEVYVCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NVTU1BUlksIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RBQklOREVYKSkgewotCQkJLy8gKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RBQklOREVYLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UQVJHRVQpKSB7Ci0JCQkvLyAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuRlJBTUVfVEFSR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVEFSR0VULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9URVhUKSkgewotCQkJLy8gKHRleHQgJUNvbG9yOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT0xPUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RFWFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1RFWFRGT0NVUykpIHsKLQkJCS8vICh0ZXh0Zm9jdXMgQ0RBVEEgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RFWFRGT0NVUywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVElUTEUpKSB7Ci0JCQkvLyAodGl0bGUgJVRleHQ7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9USVRMRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVElNRUZNVCkpIHsKLQkJCS8vICh0aW1lZm10IENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9USU1FRk1ULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9UUlVFU1BFRUQpKSB7Ci0JCQkvLyAodHJ1ZXNwZWVkICh0cnVlc3BlZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1RSVUVTUEVFRH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1RSVUVTUEVFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVFlQRSkpIHsKLQkJCS8vICh0eXBlICVDb3RlbnRUeXBlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9VU0VNQVApKSB7Ci0JCQkvLyAodXNlbWFwICVVUkk7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVVNFTUFQLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxJR04pKSB7Ci0JCQkvLyAodmFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxiYXNlbGluZSkgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0JBU0VMSU5FfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxVRSkpIHsKLQkJCS8vICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZBTFVFVFlQRSkpIHsKLQkJCS8vICh2YWx1ZXR5cGUgKERBVEF8UkVGfE9CSkVDVCkgREFUQSkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfREFUQSwgQVRUUl9WQUxVRV9SRUYsIEFUVFJfVkFMVUVfT0JKRUNUfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9EQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUVUWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQVIpKSB7Ci0JCQkvLyAodmFyIENEQVRBICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WQVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZFUlNJT04pKSB7Ci0JCQkvLyAodmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCwgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZFUlNJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLkZJWEVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZJUlRVQUwpKSB7Ci0JCQkvLyAodmlydHVhbCAlVVJJOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZJUlRVQUwsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZMSU5LKSkgewotCQkJLy8gKHZsaW5rICVDb2xvcjsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09MT1IpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WTElOSywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVk9MVU1FKSkgewotCQkJLy8gKHZvbHVtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVk9MVU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9XSURUSCkpIHsKLQkJCS8vICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5MRU5HVEgpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVlNQQUNFKSkgewotCQkJLy8gKHZzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9WU1BBQ0UsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQkJLy8gPDxEMjA1NTE0Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVE9QTUFSR0lOKSkgewotCQkJLy8gKHRvcG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UT1BNQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPVFRPTU1BUkdJTikpIHsKLQkJCS8vIChib3R0b21tYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9UVE9NTUFSR0lOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9MRUZUTUFSR0lOKSkgewotCQkJLy8gKGxlZnRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTEVGVE1BUkdJTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUklHSFRNQVJHSU4pKSB7Ci0JCQkvLyAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfUklHSFRNQVJHSU4sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0JPUkRFUkNPTE9SKSkgewotCQkJLy8gKGJvcmRlcmNvbG9yLCAlQ29sb3I7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTE9SKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQk9SREVSQ09MT1IsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJCS8vIEQyMDU1MTQKLQotCQl9Ci0JCWVsc2UgewotCQkJLy8gdW5rbm93biBhdHRyaWJ1dGU7IG1heWJlIGVycm9yLgotCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQlhdHRyID0gbnVsbDsKLQkJfQotCi0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVDQWxpZ247IGFzIHZhbHVlcy4uIEF0IHRoaXMgdGltZQotCSAqICg0LzE5LzIwMDEpLCBpdCBpcyBpZGVudGljYWwgdG8gJUxBbGlnbjsuCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9yQ2FwdGlvbigpIHsKLQkJLy8gYWxpZ24gKGxvY2FsKQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9UT1AsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIEdldCBhbGlnbiBhdHRyaWJ1dGUgd2hpY2ggaGFzICVJQWxpZ247IGFzIHZhbHVlcy4uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBIVE1MQXR0ckRlY2xJbXBsIGNyZWF0ZUFsaWduRm9ySW1hZ2UoKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0IGFsaWduIGF0dHJpYnV0ZSB3aGljaCBoYXMgJUxBbGlnbjsgYXMgdmFsdWVzLi4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JMZWdlbmQoKSB7Ci0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXMKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX0JPVFRPTSwgQVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BTElHTiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uIGZvciA8Y29kZT5hbGlnbjwvY29kZT4gaW4gc2V2ZXJhbAotCSAqIGVsZW1lbnRzLCBsaWtlIDxjb2RlPlA8L2NvZGU+LCA8Y29kZT5ESVY8L2NvZGU+LiBUaGUgdmFsdWVzIGFyZQotCSAqIGRpZmZlcmVudCBmcm9tIGF0dHJpYnV0ZXMgdGhvc2UgaGF2ZSB0aGUgc2FtZSBuYW1lIGluIG90aGVyIGVsZW1lbnRzICg8Y29kZT5JTUc8L2NvZGU+Ci0JICogYW5kIDxjb2RlPlRBQkxFPC9jb2RlPikuIFNvLCBpdCBjYW4ndCB0cmVhdCBhcyBnbG9iYWwgYXR0cmlidXRlcy4KLQkgKiA8c3Ryb25nPk5PVEU6IFRoZXNlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBoYXMgbm8gb3duZXIgQ01Eb2N1bWVudAotCSAqIGluc3RhbmNlLjwvc3Ryb25nPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpIHsKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkvLyBzZXQgZW51bSB2YWx1ZXM6IGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkKLQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9DRU5URVIsIEFUVFJfVkFMVUVfUklHSFQsIEFUVFJfVkFMVUVfSlVTVElGWX07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVhdHRyczsgZGVjbGFyYXRpb25zLiAlYXR0cnM7IGNvbnNpc3RzIG9mICVjb3JlYXR0cnM7LCAlaTE4biwgYW5kCi0JICogJWV2ZW50czsuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QXR0cnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQkvLyAlY29yZWF0dHJzOwotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ09SRSkuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCQkvLyAlaTE4bjsKLQkJbmFtZXMgPSBBcnJheXMuYXNMaXN0KEkxOE4pLml0ZXJhdG9yKCk7Ci0JCWdldERlY2xhcmF0aW9ucyhkZWNsYXJhdGlvbnMsIG5hbWVzKTsKLQkJLy8gJWV2ZW50czsKLQkJbmFtZXMgPSBBcnJheXMuYXNMaXN0KEVWRU5UUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlYm9keWNvbG9yczsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEJvZHljb2xvcnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQk9EWUNPTE9SUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlY2VsbGhhbGlnbjsgZGVjbGFyYXRpb25zLiAlY2VsbGhhbGlnaDsgY29uc2lzdHMgb2Y6IC0gKGFsaWduCi0JICogKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnl8Y2hhcikgI0lNUExJRUQpIC0gKGNoYXIgJUNoYXJhY3RlcjsKLQkgKiAjSU1QTElFRCkgLSAoY2hhcm9mZiAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDZWxsaGFsaWduKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5fGNoYXIpICNJTVBMSUVEKSBzaG91bGQgYmUgZGVmaW5lZAotCQkvLyBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCS8vIHNldCBlbnVtIHZhbHVlcwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9MRUZULCBBVFRSX1ZBTFVFX0NFTlRFUiwgQVRUUl9WQUxVRV9SSUdIVCwgQVRUUl9WQUxVRV9KVVNUSUZZLCBBVFRSX1ZBTFVFX0NIQVJ9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCUl0ZXJhdG9yIG5hbWVzID0gQXJyYXlzLmFzTGlzdChDRUxMSEFMSUdOKS5pdGVyYXRvcigpOwotCQlnZXREZWNsYXJhdGlvbnMoZGVjbGFyYXRpb25zLCBuYW1lcyk7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVjZWxsdmFsaWduOyBkZWNsYXJhdGlvbnMuICVjZWxsaGFsaWdoOyBpczogLSAodmFsaWduCi0JICogKHRvcHxtaWRkbGV8Ym90dG9tfGJhc2VsaW5lKSAjSU1QTElFRCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRDZWxsdmFsaWduKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGRlYyA9IGdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMSUdOKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTElHTiwgZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWNvcmVhdHRyczsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldENvcmUoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoQ09SRSkuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCBhIGdsb2JhbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGF0dHJOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJQ01Ob2RlIGNtbm9kZSA9IGdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCWlmIChjbW5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCi0JCUhUTUxBdHRyRGVjbEltcGwgZGVjID0gY3JlYXRlKGF0dHJOYW1lKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJcHV0TmFtZWRJdGVtKGF0dHJOYW1lLCBkZWMpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotCi0JLyoqCi0JICogR2V0IGRlY2xhcmF0aW9ucyB3aGljaCBhcmUgc3BlY2lmaWVkIGJ5IG5hbWVzLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lcwotCSAqICAgICAgICAgICAgamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBkZWMgPSBnZXREZWNsYXJhdGlvbihhdHRyTmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCAlZXZlbnRzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RXZlbnRzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQkJSXRlcmF0b3IgbmFtZXMgPSBBcnJheXMuYXNMaXN0KEVWRU5UUykuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLQotCS8qKgotCSAqIEdldCAlaTE4bjsgZGVjbGFyYXRpb25zLgotCSAqLwotCXB1YmxpYyB2b2lkIGdldEkxOG4oQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCQlJdGVyYXRvciBuYW1lcyA9IEFycmF5cy5hc0xpc3QoSTE4TikuaXRlcmF0b3IoKTsKLQkJZ2V0RGVjbGFyYXRpb25zKGRlY2xhcmF0aW9ucywgbmFtZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQ29udGVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWM3YzgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotCi0KLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBDTUNvbnRlbnQgZm9yIEhUTUwgQ00uCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNQ29udGVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Db250ZW50IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOQk9VTkRFRCA9IC0xOwotCS8qKiAgLTE6IGl0J3MgVU5CT1VOREVELiAqLwotCXByaXZhdGUgaW50IG1heE9jY3VyID0gVU5CT1VOREVEOwotCS8qKiAgMDogaXQncyBPUFRJT05BTCwgMSwgaXQncyBSRVFVSVJFRC4gKi8KLQlwcml2YXRlIGludCBtaW5PY2N1ciA9IDA7Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBjb25zdHVyY3Rvci4KLQkgKiBVc2UgdGhpcyBvbmUgZm9yIHVzdWFsIGNhc2VzLjxicj4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50SW1wbChTdHJpbmcgbmFtZSwgaW50IG1pbiwgaW50IG1heCkgewotCQlzdXBlcihuYW1lKTsKLQkJbWluT2NjdXIgPSBtaW47Ci0JCW1heE9jY3VyID0gbWF4OwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJcmV0dXJuIG1heE9jY3VyOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBJZiAwLCBpdCdzIE9QVElPTkFMLgotCSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0JICovCi0JcHVibGljIGludCBnZXRNaW5PY2N1cigpIHsKLQkJcmV0dXJuIG1pbk9jY3VyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWIzNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0vKioKLSAqLwotY2xhc3MgQ01Hcm91cEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01Hcm91cCB7Ci0KLQlwcml2YXRlIGludCBvcGVyYXRvciA9IENNR3JvdXAuU0VRVUVOQ0U7Ci0JcHJpdmF0ZSBDTU5vZGVMaXN0SW1wbCBjaGlsZHJlbiA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTUdyb3VwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTUdyb3VwSW1wbChpbnQgb3AsIGludCBtaW5PY2N1ciwgaW50IG1heE9jY3VyKSB7Ci0JCXN1cGVyKG51bGwsIG1pbk9jY3VyLCBtYXhPY2N1cik7Ci0JCXN3aXRjaCAob3ApIHsKLQkJCWNhc2UgQ01Hcm91cC5BTEwgOgotCQkJY2FzZSBDTUdyb3VwLkNIT0lDRSA6Ci0JCQljYXNlIENNR3JvdXAuU0VRVUVOQ0UgOgotCQkJCW9wZXJhdG9yID0gb3A7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgd2Fybi4KLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZENoaWxkKENNTm9kZSBjaGlsZCkgewotCQlpZiAoY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCWNoaWxkcmVuID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0JCXJldHVybiBjaGlsZHJlbi5hcHBlbmROb2RlKGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgR1JPVVAsIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkdST1VQOwotCX0KLQotCS8qKgotCSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEFMT05FIChhKSwgU0VRVUVOQ0UgKGEsYiksIENIT0lDRSAoYXxiKSwgQUxMIChhJmIpLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T3BlcmF0b3IoKSB7Ci0JCXJldHVybiBvcGVyYXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxY2UxYjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVkTm9kZU1hcEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDTU5hbWVkTm9kZU1hcCBpbnRlcmZhY2UuCi0gKiBUaGlzIGNsYXNzIGlzIGludGVudGVkIHRvIGJlIHVzZWQgYXMgYSBjb250YWluZXIgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLSAqIElmIHNvbWVvbmUgd2FudHMgdG8gdXNlIHRoaXMgY2xhc3MgZm9yIG90aGVyIHB1cnBvc2UsIGhlIG11c3QgcGF5IGF0dGVudGlvbgotICogdG8gdGhlIGZhY3QgdGhhdCB0aGlzIGNsYXNzIGlzIHRvbGVyYW50IG9mIHRoZSBrZXkgbmFtZSBjYXNlLiAgVGhhdCBpcywgdGhpcwotICogY2xhc3MgZG9lcyBub3QgZGlzdGluZ3Vpc2ggIm5hbWUiLCAiTkFNRSIsIGFuZCAiTmFtZSIgYXMgYSBrZXkgbmFtZS4KLSAqLwotY2xhc3MgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0JcHJpdmF0ZSBIYXNodGFibGUgaXRlbXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaXRlbXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBpdGVtcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZWRJdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlIDxjb2RlPm51bGw8L2NvZGU+IGZvciB1bmtub3duIGtleXMuCi0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBjb29rZWROYW1lID0gbWFrZUNhbm9uaWNhbEZvcm0obmFtZSk7Ci0JCWlmICghaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTU5vZGUpIGl0ZW1zLmdldChjb29rZWROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01Ob2RlIG5vZGUgPSAoQ01Ob2RlKSBpdGVyLm5leHQoKTsKLQkJCWlmICgtLWluZGV4IDwgMCkKLQkJCQlyZXR1cm4gbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIGl0ZW1zLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHJhd0Zvcm0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIG1ha2VDYW5vbmljYWxGb3JtKFN0cmluZyByYXdGb3JtKSB7Ci0JCXJldHVybiByYXdGb3JtLnRvVXBwZXJDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGtleSBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGl0ZW0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXZvaWQgcHV0TmFtZWRJdGVtKFN0cmluZyBuYW1lLCBDTU5vZGUgaXRlbSkgewotCQlTdHJpbmcgY29va2VkTmFtZSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpOwotCQlpZiAoaXRlbXMuY29udGFpbnNLZXkoY29va2VkTmFtZSkpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgcmVnaXN0ZXJlZC4KLQkJaXRlbXMucHV0KGNvb2tlZE5hbWUsIGl0ZW0pOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5hbWVzcGFjZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBmNGMyOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENNTmFtZXNwYWNlIGltcGxlbWVudGF0aW9uLgotICovCi1jbGFzcyBDTU5hbWVzcGFjZUltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01OYW1lc3BhY2UgewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0KLQkvKioKLQkgKiBDTU5hbWVzcGFjZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2VJbXBsKFN0cmluZyB1cmksIFN0cmluZyBwZngpIHsKLQkJc3VwZXIodXJpKTsKLQkJcHJlZml4ID0gcGZ4OwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICoKLQkgKiBSZXR1cm5zIG9uZSBvZiA6Ci0JICoKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLk5BTUVfU1BBQ0U7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJlZml4IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gcHJlZml4OwotCX0KLQotCS8qKgotCSAqIGdldFVSSSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2Q3NWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTU5vZGUgewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIG5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBDTU5vZGVJbXBsKFN0cmluZyBubSkgewotCQlzdXBlcigpOwotCQluYW1lID0gbm07Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICoKLQkgKiBSZXR1cm5zIHRoZSBvYmplY3QgcHJvcGVydHkgZGVzY2lwZWQgYnkgdGhlIHByb3BlcnR5TmFtZQotCSAqCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogQHJldHVybiBib29sZWFuCi0JICoKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIENNTm9kZSBzdXBwb3J0cyBhIHNwZWNpZmllZCBwcm9wZXJ0eQotCSAqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjZGIxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotLyoqCi0gKiBBbmFsb2cgb2YgZG9tLk5vZGVMaXN0IGZvciBDTS4KLSAqIFNvLCB0aGUgaW1wbGVtZW50YXRpb24gaXMgdmVyeSBzaW1pbGFyIHRvCi0gKiBOb2RlTGlzdEltcGw8YnI+Ci0gKi8KLWNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5WZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogQ01Ob2RlTGlzdEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCW5vZGVzID0gbmV3IGphdmEudXRpbC5WZWN0b3IoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG5vZGUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Ob2RlIGFwcGVuZE5vZGUoQ01Ob2RlIG5vZGUpIHsKLQkJbm9kZXMuYWRkRWxlbWVudChub2RlKTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBub2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db21wbGV4VHlwZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFiNjY1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotICogaW4gWE1MIFNjaGVtYS48YnI+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQljb2xsZWN0aW9uID0gZWxlbWVudENvbGxlY3Rpb247Ci0JCWNyZWF0ZUNvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWN0dWFsIGNvbnRlbnQgbW9kZWwuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFuZCBvbmx5IG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yLjxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUdyb3VwIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCS8qIE5PVEU6IERvIHdlIG5lZWQgTE9HSUNBTCB0eXBlPwotCSAqIC0tIDMvNy8yMDAxCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRDb250ZW50VHlwZSgpOwotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgaGludC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRQcmltYXJ5Q2FuZGlkYXRlKCkgewotCQlpZiAocHJpbWFyeUNhbmRpZGF0ZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKHByaW1hcnlDYW5kaWRhdGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGZkZWYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEZhY3Rvcnkgb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotICovCi1maW5hbCBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBkZWZpbml0aW9ucyA9IG51bGw7Ci0JLy8gY29uc3RhbnRzIGZvciBjb21wbGV4IHR5cGUgbmFtZQotCS8qKiBmb3IgQUREUkVTUy4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9BRERSRVNTID0gIkNUWVBFX0FERFJFU1MiOy8vJE5PTi1OTFMtMSQKLQkvKiogQ0RBVEEgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNodWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQ0RBVEEgPSAiQ1RZUEVfQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogY29sIGdyb3VwIGNvbnRlbnQuIENPTCogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DT0xVTU5fR1JPVVAgPSAiQ1RZUEVfQ09MVU1OX0dST1VQIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBETC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9ERUZJTklUSU9OX0xJU1QgPSAiQ1RZUEVfREVGSU5JVElPTl9MSVNUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBFTUJFRC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTUJFRCA9ICJDVFlQRV9FTUJFRCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBlbXB0eSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRU1QVFkgPSAiQ1RZUEVfRU1QVFkiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZJRUxEU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZJRUxEU0VUID0gIkNUWVBFX0ZJRUxEU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBGUkFNRVNFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GUkFNRVNFVCA9ICJDVFlQRV9GUkFNRVNFVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmbG93IGNvbnRlbnQuICglZmxvdzspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZMT1dfQ09OVEFJTkVSID0gIkNUWVBFX0ZMT1dfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGh0bWwgY29udGVudC4gSEVBRCwgKEZSQU1FU0VUfEJPRFkpICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSFRNTCA9ICJDVFlQRV9IVE1MIjsvLyROT04tTkxTLTEkCi0JLyoqIGhlYWQgY29udGVudC4gVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/ICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSEVBRCA9ICJDVFlQRV9IRUFEIjsvLyROT04tTkxTLTEkCi0JLyoqIGlubGluZSBjb250ZW50LiAoJWlubGluZTspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0lOTElORV9DT05UQUlORVIgPSAiQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBsaXN0IGl0ZW0gY29udGFpbmVyLiAoTEkpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0xJX0NPTlRBSU5FUiA9ICJDVFlQRV9MSV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE1BUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9NQVAgPSAiQ1RZUEVfTUFQIjsvLyROT04tTkxTLTEkCi0JLyoqIG5vZnJhbWVzIGNvbnRlbnQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCA9ICJDVFlQRV9OT0ZSQU1FU19DT05URU5UIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBPUFRHUk9VUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9PUFRJT05fQ09OVEFJTkVSID0gIkNUWVBFX09QVElPTl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogcGFyYW0gY29udGFpbmVyLiBGb3IgT0JKRUNUL0FQUExFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQVJBTV9DT05UQUlORVIgPSAiQ1RZUEVfUEFSQU1fQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIFBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQ0RBVEEgPSAiQ1RZUEVfUENEQVRBIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBTRUxFQ1QuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfU0VMRUNUID0gIkNUWVBFX1NFTEVDVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSBjb250ZW50LiBDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RBQkxFID0gIkNUWVBFX1RBQkxFIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNlbGwgY29udGFpZXIuIChUSHxURCkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVENFTExfQ09OVEFJTkVSID0gIkNUWVBFX1RDRUxMX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSByZWNvcmQgY29udGFpbmVyLiAoVFIpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RSX0NPTlRBSU5FUiA9ICJDVFlQRV9UUl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRlZmluaXRpb25zID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCBmb3IgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotCSAqIEVhY2ggaW5zdGFuY2UgY3JlYXRlZCBpbiB0aGlzIG1ldGhvZCBtdXN0IGJlIHJlZ2lzdGVyZWQgaW50bwotCSAqIHRoZSBtYXAgd2l0aCBpdHMgbmFtZS4KLQkgKiBAcGFyYW0gZGVmaW5pdGlvbk5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlVHlwZURlZmluaXRpb24oU3RyaW5nIGRlZmluaXRpb25OYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlpZiAoZGVmaW5pdGlvbnMuY29udGFpbnNLZXkoZGVmaW5pdGlvbk5hbWUpKSB7Ci0JCQlyZXR1cm4gKENvbXBsZXhUeXBlRGVmaW5pdGlvbikgZGVmaW5pdGlvbnMuZ2V0KGRlZmluaXRpb25OYW1lKTsKLQkJfQotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBudWxsOwotCQlpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfQUREUkVTUykgewotCQkJZGVmID0gbmV3IEN0ZEFkZHJlc3MoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfQ09MVU1OX0dST1VQKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkQ29sdW1uR3JvdXAoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfREVGSU5JVElPTl9MSVNUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRGwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfRU1CRUQpIHsKLQkJCWRlZiA9IG5ldyBDdGRFbWJlZChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9GSUVMRFNFVCkgewotCQkJZGVmID0gbmV3IEN0ZEZpZWxkc2V0KGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0ZMT1dfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRmxvd0NvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9GUkFNRVNFVCkgewotCQkJZGVmID0gbmV3IEN0ZEZyYW1lc2V0KGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0hFQUQpIHsKLQkJCWRlZiA9IG5ldyBDdGRIZWFkKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0hUTUwpIHsKLQkJCWRlZiA9IG5ldyBDdGRIdG1sKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0lOTElORV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRJbmxpbmVDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfTElfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkTGlDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfTUFQKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkTWFwKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX05PRlJBTUVTX0NPTlRFTlQpIHsKLQkJCWRlZiA9IG5ldyBDdGROb2ZyYW1lc0NvbnRlbnQoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUikgewotCQkJZGVmID0gbmV3IEN0ZE9wdGlvbkNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9QQVJBTV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRQYXJhbUNvbnRhaW5lcihlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9TRUxFQ1QpIHsKLQkJCWRlZiA9IG5ldyBDdGRTZWxlY3QoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfVEFCTEUpIHsKLQkJCWRlZiA9IG5ldyBDdGRUYWJsZShlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9UQ0VMTF9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRUYWJsZUNlbGxDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfVFJfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkVHJDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSB7Ci0JCQlkZWYgPSBudWxsOwotCQl9Ci0JCWlmIChkZWYgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZS4KLQkJZGVmaW5pdGlvbnMucHV0KGRlZmluaXRpb25OYW1lLCBkZWYpOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEZvciBzaW5nbGV0b24uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmU4ZGRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgQUREUkVTUy4KLSAqLwotZmluYWwgY2xhc3MgQ3RkQWRkcmVzcyBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkQWRkcmVzcyhFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCglaW5saW5lKSB8IFApKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gKCVpbmxpbmUpCi0JCUNNR3JvdXBJbXBsIGlubGluZXMgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoaW5saW5lcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldElubGluZShpbmxpbmVzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChpbmxpbmVzKTsKLQkJLy8gUAotCQlDTU5vZGUgcCA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QKTsKLQkJaWYgKHAgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQocCk7Ci0JfQotCi0JLyoqCi0JICogKCglaW5saW5lKSB8IFApKi4KLQkgKiBCZWNhdXNlICVpbmxpbmU7IGNvbnRhaW5zICNQQ0RBVEEsIHRoZSB0eXBlIGlzIE1JWEVELgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9BRERSRVNTOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZENvbHVtbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZENvbHVtbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MTc3MDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRDb2x1bW5Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDT0wgZ3JvdXAuCi0gKiAoQ09MKSoKLSAqLwotZmluYWwgY2xhc3MgQ3RkQ29sdW1uR3JvdXAgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZENvbHVtbkdyb3VwKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoQ09MKSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApKgotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gQ09MCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChDT0wpKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQ09MVU1OX0dST1VQOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZERsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZERsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNGEzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGREbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgREwuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZERsIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGREbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gRFQKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gREQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChEVCB8IEREKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfREVGSU5JVElPTl9MSVNUOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEVtYmVkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEVtYmVkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTkxODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRFbWJlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgRU1CRUQuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEVtYmVkIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRFbWJlZChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PRU1CRUQ7Ci0JfQotCi0JLyoqCi0JICogKE5PRU1CRUQpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJLy8gTk9FTUJFRAotCQlDTU5vZGUgbm9lbWJlZCA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVEKTsKLQkJaWYgKG5vZW1iZWQgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQobm9lbWJlZCk7Ci0JfQotCi0JLyoqCi0JICogKE5PRU1CRUQpLgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNQkVEOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZpZWxkc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOWVkMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGaWVsZHNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgRklFTERTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEZpZWxkc2V0IGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRGaWVsZHNldChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxFR0VORDsKLQl9Ci0KLQkvKioKLQkgKiAoI1BDREFUQSwgTEVHRU5ELCAoJWZsb3c7KSopCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggLCAsICkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJLy8gI1BDREFUQQotCQkvLyAuLi4/PwotCi0JCS8vIExFR0VORAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxFR0VORCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gKCVmbG93OykqCi0JCUNNR3JvdXBJbXBsIGZsb3dzID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmIChmbG93cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldEZsb3coZmxvd3MpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGZsb3dzKTsKLQl9Ci0KLQkvKioKLQkgKiAoI1BDREFUQSwgTEVHRU5ELCAoJWZsb3c7KSopCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZJRUxEU0VUOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZsb3dDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTMxMzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgY29udGFpbmVycyBvZiA8Y29kZT4lZmxvdzs8L2NvZGU+LgotICovCi1maW5hbCBjbGFzcyBDdGRGbG93Q29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRGbG93Q29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWZsb3c7KSoKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldEZsb3coY29udGVudCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZMT1dfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZyYW1lc2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEZyYW1lc2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZDEwNzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRGcmFtZXNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgRlJBTUVTRVQuCi0gKiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIE5PRlJBTUVTPykKLSAqLwotZmluYWwgY2xhc3MgQ3RkRnJhbWVzZXQgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZEZyYW1lc2V0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUU7Ci0JfQotCi0JLyoqCi0JICogKChGUkFNRVNFVCB8IEZSQU1FKSsgJiBOT0ZSQU1FUz8pLgotCSAqIC0tPiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIChOT0ZSQU1FUyk/KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICYgKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQUxMLCAxLCAxKTsKLQotCQkvLyAoIHwgKSsKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZ3JvdXApOwotCi0JCS8vIEZSQU1FU0VUCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBGUkFNRQotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUUpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vICggKT8KLQkJZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBOT0ZSQU1FUwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqICgoRlJBTUVTRVQgfCBGUkFNRSkrICYgTk9GUkFNRVM/KQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRlJBTUVTRVQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSGVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhNjgxNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBoZWFkIGNvbnRlbnQuCi0gKiBDb250ZW50IE1vZGVsOiAoVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/KQotICovCi1maW5hbCBjbGFzcyBDdGRIZWFkIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIZWFkKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVElUTEU7Ci0JfQotCi0JLyoqCi0JICogZm9yIEhFQUQuCi0JICogVG8gYXZvaWQgdXNpbmcgaW5jbHVzaW9uLCB0aGUgY29udGVudCBtb2RlbCBjb21lcyBmcm9tIHRoZSBYSFRNTCAxLjAuCi0JICoKLQkgKiAoJWhlYWQubWlzYzssICgodGl0bGUsICVoZWFkLm1pc2M7LCAoYmFzZSwgJWhlYWQubWlzYzspPykgfCAoYmFzZSwgJWhlYWQubWlzYzssICh0aXRsZSwgJWhlYWQubWlzYzspKSkpCi0JICogQW5kICVoZWFkLm1pc2M7IGlzOgotCSAqIChzY3JpcHR8c3R5bGV8bWV0YXxsaW5rfG9iamVjdHxpc2luZGV4KSoKLQkgKgotCSAqIDA6ICglaGVhZC5taXNjLCBBKQotCSAqIEE6IChCIHwgQykKLQkgKiBCOiAodGl0bGUsICVoZWFkLm1pc2M7LCBEKQotCSAqIEM6IChiYXNlLCAlaGVhZC5taXNjOywgRSkKLQkgKiBEOiAoYmFzZSwgJWhlYWQubWlzYzspPwotCSAqIEU6ICh0aXRsZSwgJWhlYWQubWlzYzspCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEF0IDFzdCwgY3JlYXRlICVoZWFkLm1pc2M7IGNvbnRlbnQuCi0JCS8vICVoZWFkLm1pc2M7Ci0JCS8vICAgKCB8ICkqCi0JCUNNR3JvdXBJbXBsIG1pc2MgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKG1pc2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkssIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobWlzYywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vIDJuZCwgZ2V0IGEgdGl0bGUKLQkJQ01Ob2RlIHRpdGxlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFKTsKLQkJLy8gM3JkLCBnZXQgYSBiYXNlCi0JCUNNTm9kZSBiYXNlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UpOwotCQlpZiAodGl0bGUgPT0gbnVsbCB8fCBiYXNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gVG9wIGxldmVsIGNvbnRlbnQgaXMgYSBzZXF1ZW5jZSBvZiAlaGVhZC5taXNjOyBhbmQgQS4KLQkJLy8gMDogKCVoZWFkLm1pc2M7LCBBKQotCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCS8vICAgY3JlYXRlIEEgYW5kIGFwcGVuZCBpdCB0byB0aGUgdG9wIGxldmVsLgotCQl7Ci0JCQkvLyBBIGlzIGEgY2hvaWNlIG9mIEIgYW5kIEMuCi0JCQkvLyBBOiAoQiB8IEMpCi0JCQkvLyAgIGNyZWF0ZSBhIGNob2ljZQotCQkJQ01Hcm91cEltcGwgZ0EgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQkJaWYgKGdBID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJLy8gICBhcHBlbmQgQSB0byB0aGUgdG9wIGxldmVsLgotCQkJY29udGVudC5hcHBlbmRDaGlsZChnQSk7Ci0KLQkJCS8vIGNyZWF0ZSBCIGFuZCBhcHBlbmQgaXQgdG8gQQotCQkJewotCQkJCS8vIEIgaXMgYSBzZXF1ZW5jZSBvZiB0aXRsZSwgJWhlYWQubWlzYzssIGFuZCBELgotCQkJCS8vIEI6ICh0aXRsZSwgJWhlYWQubWlzYzssIEQpCi0JCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCUNNR3JvdXBJbXBsIGdCID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCWlmIChnQiA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gICBhcHBlbmQgQiB0byBBLgotCQkJCWdBLmFwcGVuZENoaWxkKGdCKTsKLQotCQkJCS8vICAgYXBwZW5kIHRpdGxlIHRvIEIKLQkJCQlnQi5hcHBlbmRDaGlsZCh0aXRsZSk7Ci0JCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gQgotCQkJCWdCLmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCS8vICAgY3JlYXRlIEQgYW5kIGFwcGVuZCBpdCB0byBCLgotCQkJCXsKLQkJCQkJLy8gRCBpcyBhIHNlcXVlbmNlIG9mIGJhc2UsICVoZWFkLm1pc2M7LgotCQkJCQkvLyBEOiAoYmFzZSwgJWhlYWQubWlzYzspPwotCQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJCUNNR3JvdXBJbXBsIGdEID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQkJCQlpZiAoZ0QgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJLy8gICBhcHBlbmQgRCB0byBCLgotCQkJCQlnQi5hcHBlbmRDaGlsZChnRCk7Ci0KLQkJCQkJLy8gICBhcHBlbmQgYmFzZSB0byBECi0JCQkJCWdELmFwcGVuZENoaWxkKGJhc2UpOwotCQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBELgotCQkJCQlnRC5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBjcmVhdGUgQyBhbmQgYXBwZW5kIGl0IHRvIEEKLQkJCXsKLQkJCQkvLyBDIGlzIGEgc2VxdWVuY2Ugb2YgYmFzZSwgJWhlYWQubWlzYzssIGFuZCBFCi0JCQkJLy8gQzogKGJhc2UsICVoZWFkLm1pc2M7LCBFKQotCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQlDTUdyb3VwSW1wbCBnQyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQlpZiAoZ0MgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCS8vICAgYXBwZW5kIEMgdG8gQS4KLQkJCQlnQS5hcHBlbmRDaGlsZChnQyk7Ci0KLQkJCQkvLyAgIGFwcGVuZCBiYXNlIHRvIEMKLQkJCQlnQy5hcHBlbmRDaGlsZChiYXNlKTsKLQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBDCi0JCQkJZ0MuYXBwZW5kQ2hpbGQobWlzYyk7Ci0KLQkJCQkvLyAgIGNyZWF0ZSBFIGFuZCBhcHBlbmQgaXQgdG8gQy4KLQkJCQl7Ci0JCQkJCS8vIEUgaXMgYSBzZXF1ZW5jZSBvZiB0aXRsZSBhbmQgJWhlYWQubWlzYzsuCi0JCQkJCS8vIEU6ICh0aXRsZSwgJWhlYWQubWlzYzspCi0JCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQkJQ01Hcm91cEltcGwgZ0UgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJCWlmIChnRSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkvLyAgIGFwcGVuZCBFIHRvIEMuCi0JCQkJCWdDLmFwcGVuZENoaWxkKGdFKTsKLQotCQkJCQkvLyAgIGFwcGVuZCB0aXRsZSB0byBFCi0JCQkJCWdFLmFwcGVuZENoaWxkKHRpdGxlKTsKLQkJCQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsgdG8gRS4KLQkJCQkJZ0UuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRWxlbWVudCBjb250ZW50LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRIdG1sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEh0bWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNjZWFhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZEh0bWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgPGNvZGU+SFRNTDwvY29kZT4uPGJyPgotICogQ29udGVudCBNb2RlbDoKLSAqIEhFQUQsIChGUkFNRVNFVHxCT0RZKTxicj4KLSAqLwotZmluYWwgY2xhc3MgQ3RkSHRtbCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ3RkSHRtbChFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQ7Ci0JfQotCi0JLyoqCi0JICogKCVodG1sLmNvbnRlbnQ7KS4KLQkgKiAlaHRtbC5jb250ZW50OyBpcyBIRUFELCAoRlJBTUVTRVQgfCBCT0RZKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gSEVBRAotCQlDTU5vZGUgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkJLy8gKCB8ICkKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBGUkFNRVNFVCwgQk9EWQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRlJBTUVTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIHNpbmNlIEJPRFkgc3RhcnQgYW5kIGVuZCBhcmUgb21pc3NhYmxlCi0JCS8vIGFkZGluZyB2YWxpZCBjaGlsZHJlbiBvZiBCT0RZIGhlcmUgdW5kZXIgSFRNTAotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTczNDIKLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NQVApOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkRPKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9TQ1JJUFQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkkpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlUpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg2KTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0VGT05UKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RSSUtFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFCQlIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJJRyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDEpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUNST05ZTSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVMKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUyk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUEpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgyKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GT05UKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLktCRCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSUZSQU1FKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUik7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0FNUCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5TKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1VQKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERk4pOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5WQVIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZJRUxEU0VUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRUKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkJZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUFBMRVQpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9MKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0lURSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGVkZWMpOwotCi0JICAgIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0RFKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TUEFOKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVUIpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQotCSAgICBlZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVNKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkgICAgZWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFJPTkcpOwotCQlpZiAoZWRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChlZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSFRNTDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRJbmxpbmVDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkSW5saW5lQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTJjOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRJbmxpbmVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yICglaW5saW5lOykqLgotICovCi1maW5hbCBjbGFzcyBDdGRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZElubGluZUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCVpbmxpbmUpKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQljb2xsZWN0aW9uLmdldElubGluZShjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRMaUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRMaUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWU2OGFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTGlDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogTGlzdCBpdGVtIGNvbnRhaW5lci4KLSAqIChMSSkrCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZExpQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW5Db2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZExpQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEk7Ci0JfQotCi0JLyoqCi0JICogKExJKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIChMSSkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlDTU5vZGUgbGkgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEkpOwotCQlpZiAobGkgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQobGkpOwotCX0KLQotCS8qKgotCSAqIEVMRU1FTlQgY29udGVudC48YnI+Ci0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9MSV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE1hcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y5YjcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBNQVAuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZE1hcCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTWFwKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQVJFQTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVibG9jazspIHwgQVJFQSkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyAoJWJsb2NrOykKLQkJQ01Hcm91cEltcGwgYmxvY2tzID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJaWYgKGJsb2NrcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldEJsb2NrKGJsb2Nrcyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoYmxvY2tzKTsKLQkJLy8gQVJFQQotCQlDTU5vZGUgYXJlYSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUkVBKTsKLQkJaWYgKGFyZWEgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoYXJlYSk7Ci0JfQotCi0JLyoqCi0JICogKCglYmxvY2s7KSB8IEFSRUEpKy4KLQkgKiBCZWNhdXNlICVibG9jazsgY29uc2lzdHMgb2YgZWxlbWVudHMgb25seSwgdGhlIHR5cGUgaXMgRUxFTUVOVC4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9NQVA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTm9mcmFtZXNDb250ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE5vZnJhbWVzQ29udGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FjMDliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkTm9mcmFtZXNDb250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBOT0ZSQU1FUy4KLSAqLwotZmluYWwgY2xhc3MgQ3RkTm9mcmFtZXNDb250ZW50IGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGROb2ZyYW1lc0NvbnRlbnQoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZOwotCX0KLQotCS8qKgotCSAqIChCT0RZKS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCApCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCS8vIEJPRFkKLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChCT0RZKQotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX05PRlJBTUVTX0NPTlRFTlQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzcyZjE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIE9QVElPTiBjb250YWluZXIuCi0gKiAoT1BUSU9OKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkT3B0aW9uQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRPcHRpb25Db250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JfQotCi0JLyoqCi0JICogKE9QVElPTikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBPUFRJT04KLQkJQ01Ob2RlIGRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKE9QVElPTikrCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9PUFRJT05fQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFBhcmFtQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFBhcmFtQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MmFmYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRQYXJhbUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBQQVJBTSBjb250YWluZXIuICBGb3IgT0JKRUNUIGFuZCBBUFBMRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFBhcmFtQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRQYXJhbUNvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKFBBUkFNIHwgJWZsb3c7KSouCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKgotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIFBBUkFNCi0JCUNNTm9kZSBwYXJhbSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7Ci0JCWlmIChwYXJhbSAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChwYXJhbSk7Ci0JCS8vICVmbG93OwotCQlDTUdyb3VwSW1wbCBmbG93cyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChmbG93cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldElubGluZShmbG93cyk7Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZmxvd3MpOwotCX0KLQotCS8qKgotCSAqIChQQVJBTSB8ICVmbG93OykqLgotCSAqIEJlY2F1c2UgJWZsb3c7IGNvbnRhaW5zICNQQ0RBVEEsIHRoZSB0eXBlIGlzIE1JWEVELgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQVJBTV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkU2VsZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFNlbGVjdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiN2Y2YzA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkU2VsZWN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBTRUxFQ1QuCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZFNlbGVjdCBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkU2VsZWN0KEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OOwotCX0KLQotCS8qKgotCSAqIChPUFRHUk9VUCB8IE9QVElPTikrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoIHwgKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBPUFRHUk9VUAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVEdST1VQKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBPUFRJT04KLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUR1JPVVAgfCBPUFRJT04pKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9TRUxFQ1Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1NmM4ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgVEFCTEUuCi0gKiAoQ0FQVElPTj8sIChDT0wqfENPTEdST1VQKiksIFRIRUFEPywgVEZPT1Q/LCBUQk9EWSssIFRSKykKLSAqLwotZmluYWwgY2xhc3MgQ3RkVGFibGUgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFRhYmxlKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEJPRFk7Ci0JfQotCi0JLyoqCi0JICogKENBUFRJT04/LCAoQ09MKnxDT0xHUk9VUCopLCBUSEVBRD8sIFRGT09UPywgVEJPRFkrKQotCSAqIC0tPiAoKENBUFRJT04pPywgKChDT0wpKiB8IChDT0xHUk9VUCkqKSwgKFRIRUFEKT8sIChURk9PVCk/LCAoVEJPRFkpKywgKFRSKSspCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggLCAsICwgLCkKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQotCQkvLyAoQ0FQVElPTik/Ci0JCS8vICAgICAoICk/Ci0JCUNNR3JvdXBJbXBsIHdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCS8vICAgICBDQVBUSU9OCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoKENPTCkqIHwgKENPTEdST1VQKSopCi0JCS8vICAgICAoIHwgKQotCQlDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQkJLy8gICAgICAgICAoQ09MKSoKLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdyb3VwLmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyAgICAgICAgIChDT0xHUk9VUCkqCi0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlncm91cC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTEdST1VQKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vIChUSEVBRCk/Ci0JCXdyYXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQotCQkvLyAoVEZPT1QpPwotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIDEpOwotCQlpZiAod3JhcCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb250ZW50LmFwcGVuZENoaWxkKHdyYXApOwotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1QpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQl3cmFwLmFwcGVuZENoaWxkKGRlYyk7Ci0KLQkJLy8gKFRCT0RZKSsKLQkJLy8gVEJPRFkgaGFzIG9wdGlvbmFsIHN0YXJ0IGFuZCBlbmQgdGFncwotCQl3cmFwID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJaWYgKHdyYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJY29udGVudC5hcHBlbmRDaGlsZCh3cmFwKTsKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJd3JhcC5hcHBlbmRDaGlsZChkZWMpOwotCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NjEwMQotCQkvLyBUQk9EWSBzdGFydCBhbmQgZW5kIHRhZyBhcmUgb3B0aW9uYWwsIHNvIFRSIHNob3VsZCBiZSBhbGxvd2VkIGhlcmUKLQkJLy8gKFRSKSsKLQkJd3JhcCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWlmICh3cmFwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWNvbnRlbnQuYXBwZW5kQ2hpbGQod3JhcCk7Ci0JCWRlYyA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUik7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXdyYXAuYXBwZW5kQ2hpbGQoZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiAoKEZSQU1FU0VUIHwgRlJBTUUpKyAmIE5PRlJBTUVTPykKLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1RBQkxFOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGVDZWxsQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRhYmxlQ2VsbENvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGRkYmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ3RkVGFibGVDZWxsQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIFRhYmxlIGNlbGwgY29udGFpbmVyLgotICogKFRIIHwgVEQpKwotICovCi1maW5hbCBjbGFzcyBDdGRUYWJsZUNlbGxDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFRhYmxlQ2VsbENvbnRhaW5lcihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JCXByaW1hcnlDYW5kaWRhdGVOYW1lID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlREOwotCX0KLQotCS8qKgotCSAqIChUSCB8IFREKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkvLyBUSAotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCQkvLyBURAotCQlkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKFRIIHwgVEQpKwotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVENFTExfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0N0ZFRyQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYWRmYzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DdGRUckNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBUYWJsZSByZWNvcmQgY29udGFpbmVyLgotICogKFRSKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkVHJDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZFRyQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFI7Ci0JfQotCi0JLyoqCi0JICogKFRSKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIChUUikrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlDTU5vZGUgdHIgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVFIpOwotCQlpZiAodHIgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQodHIpOwotCX0KLQotCS8qKgotCSAqIEVMRU1FTlQgY29udGVudC48YnI+Ci0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UUl9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRGVjbENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRGVjbENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdkZGVlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0RlY2xDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBEdWFsTWFwIHsKLQkJcHVibGljIER1YWxNYXAoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIER1YWxNYXAoT2JqZWN0W10gb2JqZWN0cykgewotCQkJc3VwZXIoKTsKLQkJCWluaXRpYWxpemUob2JqZWN0cyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQlyZXR1cm4gdGFibGUubGVuZ3RoOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRWYWx1ZShpbnQga2V5KSB7Ci0JCQlpZiAoIWlzVmFsaWRJbmRleChrZXkpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHRhYmxlW2tleV07Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEtleShPYmplY3QgdmFsdWUpIHsKLQkJCUludGVnZXIga2V5T2JqID0gKEludGVnZXIpIG1hcC5nZXQodmFsdWUpOwotCQkJaWYgKGtleU9iaiA9PSBudWxsKQotCQkJCXJldHVybiBJRF9VTktOT1dOOwotCQkJcmV0dXJuIGtleU9iai5pbnRWYWx1ZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZShPYmplY3RbXSBvYmplY3RzKSB7Ci0JCQlpZiAob2JqZWN0cyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXRhYmxlID0gb2JqZWN0czsKLQkJCW1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBrZXkgPSAwOyBrZXkgPCBvYmplY3RzLmxlbmd0aDsga2V5KyspIHsKLQkJCQlPYmplY3QgdmFsdWUgPSB0YWJsZVtrZXldOwotCQkJCW1hcC5wdXQodmFsdWUsIG5ldyBJbnRlZ2VyKGtleSkpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBPYmplY3RbXSB0YWJsZSA9IG51bGw7Ci0JCXByaXZhdGUgSGFzaE1hcCBtYXAgPSBudWxsOwotCi0JCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSW5kZXgoaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gaW5kZXggPj0gMCAmJiBpbmRleCA8IHRhYmxlLmxlbmd0aDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBUb2xlcmFudFN0cmluZ0R1YWxNYXAgZXh0ZW5kcyBEdWFsTWFwIHsKLQkJcHVibGljIFRvbGVyYW50U3RyaW5nRHVhbE1hcChTdHJpbmdbXSBuYW1lcykgewotCQkJc3VwZXIoKTsKLQkJCU9iamVjdFtdIG9iamVjdHMgPSBuZXcgT2JqZWN0W25hbWVzLmxlbmd0aF07Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJb2JqZWN0c1tpXSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWVzW2ldKTsKLQkJCX0KLQkJCWluaXRpYWxpemUob2JqZWN0cyk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldEtleShPYmplY3QgdmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSB2YWx1ZTsKLQkJCQlyZXR1cm4gc3VwZXIuZ2V0S2V5KG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpKTsKLQkJCX0KLQkJCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgewotCQkJCXJldHVybiBJRF9VTktOT1dOOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJpbmcgbWFrZUNhbm9uaWNhbEZvcm0oU3RyaW5nIHJhdykgewotCQkJcmV0dXJuIHJhdy50b1VwcGVyQ2FzZSgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBEZWNsSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvciB7Ci0JCXB1YmxpYyBEZWNsSXRlcmF0b3IoKSB7Ci0JCQltYXhpZCA9IGZEZWNscy5sZW5ndGggLSAxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBpZCA8IG1heGlkOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJaWYgKCFoYXNOZXh0KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gaXRlbSgrK2lkKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZSgpIHsgLyogbm90aGluZyBzaG91bGQgYmUgZG9uZS4gKi8KLQkJfQotCi0JCXByaXZhdGUgaW50IGlkID0gLTE7Ci0JCXByaXZhdGUgaW50IG1heGlkID0gLTE7Ci0JfQotCi0JQ01Ob2RlW10gZkRlY2xzID0gbnVsbDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gU1RSSUNUX0NBU0UgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gVE9MRVJBTlRfQ0FTRSA9IHRydWU7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgSURfVU5LTk9XTiA9IC0xOwotCXByaXZhdGUgRHVhbE1hcCBmTWFwID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBEZWNsQ29sbGVjdGlvbihTdHJpbmdbXSBuYW1lcywgYm9vbGVhbiB0b2xlcmFudCkgewotCQlzdXBlcigpOwotCQlmRGVjbHMgPSBuZXcgQ01Ob2RlW25hbWVzLmxlbmd0aF07Ci0JCWlmICh0b2xlcmFudCkgewotCQkJZk1hcCA9IG5ldyBUb2xlcmFudFN0cmluZ0R1YWxNYXAobmFtZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJZk1hcCA9IG5ldyBEdWFsTWFwKG5hbWVzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gaWQgaW50Ci0JICovCi0JcHJvdGVjdGVkIGFic3RyYWN0IENNTm9kZSBjcmVhdGUoU3RyaW5nIG5hbWUpOwotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldERlY2xhcmF0aW9ucyhTdHJpbmdbXSBuYW1lcykgewotCQlDTU5hbWVkTm9kZU1hcEltcGwgbWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IG5hbWVzW2ldOwotCQkJQ01Ob2RlIG5vZGUgPSBnZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJbWFwLnB1dE5hbWVkSXRlbShuYW1lLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuYW1lcyBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXREZWNsYXJhdGlvbnMoQ01Hcm91cEltcGwgZ3JvdXAsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOwotCQkJQ01Ob2RlIGRlYyA9IGdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwIG5hbWUgdG8gaWQuCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJRChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZk1hcC5nZXRLZXkobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoaW50IGlkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBmTWFwLmdldFZhbHVlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQobmFtZSk7Ci0JCWlmICghaXNWYWxpZElEKGlkKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaXRlbShpZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSUQoaW50IGlkKSB7Ci0JCXJldHVybiBpZCA+PSAwICYmIGlkIDwgZkRlY2xzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1ZhbGlkSUQoaW5kZXgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNTm9kZSBkZWNsID0gZkRlY2xzW2luZGV4XTsKLQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCXJldHVybiBkZWNsOyAvLyBhbHJlYWR5IGV4aXN0LgotCi0JCWRlY2wgPSBjcmVhdGUoZ2V0TmFtZShpbmRleCkpOwotCQlmRGVjbHNbaW5kZXhdID0gZGVjbDsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IERlY2xJdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MGJkMzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9FbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEVsZW1lbnRDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZSB7Ci0KLQotCS8vIEVsZW1lbnQgSURzCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQSA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FCQlIgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ1JPTllNID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUREUkVTUyA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FQUExFVCA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSRUEgPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CID0gNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkFTRSA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JBU0VGT05UID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkRPID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQklHID0gMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JMSU5LID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JMT0NLUVVPVEUgPSAxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQk9EWSA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CUiA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CVVRUT04gPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0FQVElPTiA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRU5URVIgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0lURSA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT0RFID0gMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPTCA9IDIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT0xHUk9VUCA9IDIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERCA9IDIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUwgPSAyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREZOID0gMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUiA9IDI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVYgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREwgPSAyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRFQgPSAyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU0gPSAyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU1CRUQgPSAzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRklFTERTRVQgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9OVCA9IDMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JNID0gMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQU1FID0gMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQU1FU0VUID0gMzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gxID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gyID0gMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0gzID0gMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g0ID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g1ID0gNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0g2ID0gNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFQUQgPSA0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSFIgPSA0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSFRNTCA9IDQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JID0gNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lGUkFNRSA9IDQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JTUcgPSA0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5QVVQgPSA0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5TID0gNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lTSU5ERVggPSA1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfS0JEID0gNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBQkVMID0gNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xFR0VORCA9IDUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MSSA9IDU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MSU5LID0gNTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01BUCA9IDU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NRU5VID0gNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01FVEEgPSA1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9FTUJFRCA9IDU5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT0ZSQU1FUyA9IDYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1NDUklQVCA9IDYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQkpFQ1QgPSA2MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0wgPSA2MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1BUR1JPVVAgPSA2NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1BUSU9OID0gNjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1AgPSA2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSQU0gPSA2NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJFID0gNjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1EgPSA2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUyA9IDcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQU1QID0gNzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDUklQVCA9IDcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUxFQ1QgPSA3MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU01BTEwgPSA3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1BBTiA9IDc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVFJJS0UgPSA3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1RST05HID0gNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NUWUxFID0gNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQiA9IDc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAgPSA4MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFCTEUgPSA4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEJPRFkgPSA4MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEQgPSA4MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEVYVEFSRUEgPSA4NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEZPT1QgPSA4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEggPSA4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFQUQgPSA4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElUTEUgPSA4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVFIgPSA4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVFQgPSA5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVSA9IDkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTCA9IDkyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9WQVIgPSA5MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFSUVVFRSA9IDk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfQ09ORklHID0gOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9FQ0hPID0gOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9FWEVDID0gOTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9GU0laRSA9IDk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfRkxBU1RNT0QgPSA5OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0lOQ0xVREUgPSAxMDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9QUklOVEVOViA9IDEwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX1NFVCA9IDEwMjsKLQkJLy8gPDxEMjA1NTEzCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JHU09VTkQgPSAxMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PQlIgPSAxMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1dCUiA9IDEwNTsKLQotCQkvLyBEMjA1NTEzCi0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAxMDUuCi0JCQkvLyAtLSA1LzI1LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQkvKiogJWZvbnRzdHlsZTsuIFRUIHwgSSB8IEIgfCBVIHwgUyB8IFNUUklLRSB8IEJJRyB8IFNNQUxMIHwgQkxJTksgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBGT05UU1RZTEUgPSB7VFQsIEksIEIsIFUsIFMsIFNUUklLRSwgQklHLCBTTUFMTCwgQkxJTkt9OwotCS8qKiAlZm9ybWN0bDsuIElOUFVUIHwgU0VMRUNUIHwgVEVYVEFSRUEgfCBMQUJFTCB8IEJVVFRPTiAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZPUk1DVEwgPSB7SU5QVVQsIFNFTEVDVCwgVEVYVEFSRUEsIExBQkVMLCBCVVRUT059OwotCS8qKiAlcGhyYXNlOy4KLQkgKiBFTSB8IFNUUk9ORyB8IERGTiB8IENPREUgfCBTQU1QIHwgS0JEIHwgVkFSIHwgQ0lURSB8IEFCQlIgfCBBQ1JPTllNCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEhSQVNFID0ge0VNLCBTVFJPTkcsIERGTiwgQ09ERSwgU0FNUCwgS0JELCBWQVIsIENJVEUsIEFCQlIsIEFDUk9OWU19OwotCS8qKiAlc3BlY2lhbDsuCi0JICogQSB8IElNRyB8IEFQUExFVCB8IE9CSkVDVCB8IEZPTlQgfCBCQVNFRk9OVCB8IEJSIHwgU0NSSVBUIHwKLQkgKiBNQVAgfCBRIHwgU1VCIHwgU1VQIHwgU1BBTiB8IEJETyB8IElGUkFNRSB8IEVNQkVEIHwgTUFSUVVFRSB8Ci0JICogRDJXIHwgU1VCTUlUCi0JICogV0JSIHwgTk9CUiB8IEJHU09VTkQKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTUEVDSUFMID0ge0EsIElNRywgQVBQTEVULCBPQkpFQ1QsIEZPTlQsIEJBU0VGT05ULCBCUiwgV0JSLCAvLyBEMjA1NTEzCi0JCQkJU0NSSVBULCBNQVAsIFEsIFNVQiwgU1VQLCBTUEFOLCBCRE8sIElGUkFNRSwgRU1CRUQsIEJHU09VTkQsIC8vIEQyMDU1MTMKLQkJCQlNQVJRVUVFLCBOT0JSIC8vIEQyMDU1MTMKLQl9OwotCS8qKiAlaGVhZGluZzsuIEhbMS02XSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhFQURJTkcgPSB7SDEsIEgyLCBIMywgSDQsIEg1LCBINn07Ci0JLyoqICVsaXN0Oy4gVUwgfCBPTCB8IERJUiB8IE1FTlUgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMSVNUID0ge1VMLCBPTCwgRElSLCBNRU5VfTsKLQkvKiogJXByZWZvcm1hdHRlZDsuIFBSRSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFBSRUZPUk1BVFRFRCA9IHtQUkV9OwotCXByaXZhdGUgQXR0cmlidXRlQ29sbGVjdGlvbiBhdHRyaWJ1dGVDb2xsZWN0aW9uID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSBmTmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJZk5hbWVzID0gbmV3IFN0cmluZ1tJZHMuZ2V0TnVtT2ZJZHMoKV07Ci0JCWZOYW1lc1tJZHMuSURfQV0gPSBBOwotCQlmTmFtZXNbSWRzLklEX0FCQlJdID0gQUJCUjsKLQkJZk5hbWVzW0lkcy5JRF9BQ1JPTllNXSA9IEFDUk9OWU07Ci0JCWZOYW1lc1tJZHMuSURfQUREUkVTU10gPSBBRERSRVNTOwotCQlmTmFtZXNbSWRzLklEX0FQUExFVF0gPSBBUFBMRVQ7Ci0JCWZOYW1lc1tJZHMuSURfQVJFQV0gPSBBUkVBOwotCQlmTmFtZXNbSWRzLklEX0JdID0gQjsKLQkJZk5hbWVzW0lkcy5JRF9CQVNFXSA9IEJBU0U7Ci0JCWZOYW1lc1tJZHMuSURfQkFTRUZPTlRdID0gQkFTRUZPTlQ7Ci0JCWZOYW1lc1tJZHMuSURfQkRPXSA9IEJETzsKLQkJZk5hbWVzW0lkcy5JRF9CSUddID0gQklHOwotCQlmTmFtZXNbSWRzLklEX0JMSU5LXSA9IEJMSU5LOwotCQlmTmFtZXNbSWRzLklEX0JMT0NLUVVPVEVdID0gQkxPQ0tRVU9URTsKLQkJZk5hbWVzW0lkcy5JRF9CT0RZXSA9IEJPRFk7Ci0JCWZOYW1lc1tJZHMuSURfQlJdID0gQlI7Ci0JCWZOYW1lc1tJZHMuSURfQlVUVE9OXSA9IEJVVFRPTjsKLQkJZk5hbWVzW0lkcy5JRF9DQVBUSU9OXSA9IENBUFRJT047Ci0JCWZOYW1lc1tJZHMuSURfQ0VOVEVSXSA9IENFTlRFUjsKLQkJZk5hbWVzW0lkcy5JRF9DSVRFXSA9IENJVEU7Ci0JCWZOYW1lc1tJZHMuSURfQ09ERV0gPSBDT0RFOwotCQlmTmFtZXNbSWRzLklEX0NPTF0gPSBDT0w7Ci0JCWZOYW1lc1tJZHMuSURfQ09MR1JPVVBdID0gQ09MR1JPVVA7Ci0JCWZOYW1lc1tJZHMuSURfRERdID0gREQ7Ci0JCWZOYW1lc1tJZHMuSURfREVMXSA9IERFTDsKLQkJZk5hbWVzW0lkcy5JRF9ERk5dID0gREZOOwotCQlmTmFtZXNbSWRzLklEX0RJUl0gPSBESVI7Ci0JCWZOYW1lc1tJZHMuSURfRElWXSA9IERJVjsKLQkJZk5hbWVzW0lkcy5JRF9ETF0gPSBETDsKLQkJZk5hbWVzW0lkcy5JRF9EVF0gPSBEVDsKLQkJZk5hbWVzW0lkcy5JRF9FTV0gPSBFTTsKLQkJZk5hbWVzW0lkcy5JRF9FTUJFRF0gPSBFTUJFRDsKLQkJZk5hbWVzW0lkcy5JRF9GSUVMRFNFVF0gPSBGSUVMRFNFVDsKLQkJZk5hbWVzW0lkcy5JRF9GT05UXSA9IEZPTlQ7Ci0JCWZOYW1lc1tJZHMuSURfRk9STV0gPSBGT1JNOwotCQlmTmFtZXNbSWRzLklEX0ZSQU1FXSA9IEZSQU1FOwotCQlmTmFtZXNbSWRzLklEX0ZSQU1FU0VUXSA9IEZSQU1FU0VUOwotCQlmTmFtZXNbSWRzLklEX0gxXSA9IEgxOwotCQlmTmFtZXNbSWRzLklEX0gyXSA9IEgyOwotCQlmTmFtZXNbSWRzLklEX0gzXSA9IEgzOwotCQlmTmFtZXNbSWRzLklEX0g0XSA9IEg0OwotCQlmTmFtZXNbSWRzLklEX0g1XSA9IEg1OwotCQlmTmFtZXNbSWRzLklEX0g2XSA9IEg2OwotCQlmTmFtZXNbSWRzLklEX0hFQURdID0gSEVBRDsKLQkJZk5hbWVzW0lkcy5JRF9IUl0gPSBIUjsKLQkJZk5hbWVzW0lkcy5JRF9IVE1MXSA9IEhUTUw7Ci0JCWZOYW1lc1tJZHMuSURfSV0gPSBJOwotCQlmTmFtZXNbSWRzLklEX0lGUkFNRV0gPSBJRlJBTUU7Ci0JCWZOYW1lc1tJZHMuSURfSU1HXSA9IElNRzsKLQkJZk5hbWVzW0lkcy5JRF9JTlBVVF0gPSBJTlBVVDsKLQkJZk5hbWVzW0lkcy5JRF9JTlNdID0gSU5TOwotCQlmTmFtZXNbSWRzLklEX0lTSU5ERVhdID0gSVNJTkRFWDsKLQkJZk5hbWVzW0lkcy5JRF9LQkRdID0gS0JEOwotCQlmTmFtZXNbSWRzLklEX0xBQkVMXSA9IExBQkVMOwotCQlmTmFtZXNbSWRzLklEX0xFR0VORF0gPSBMRUdFTkQ7Ci0JCWZOYW1lc1tJZHMuSURfTEldID0gTEk7Ci0JCWZOYW1lc1tJZHMuSURfTElOS10gPSBMSU5LOwotCQlmTmFtZXNbSWRzLklEX01BUF0gPSBNQVA7Ci0JCWZOYW1lc1tJZHMuSURfTUVOVV0gPSBNRU5VOwotCQlmTmFtZXNbSWRzLklEX01FVEFdID0gTUVUQTsKLQkJZk5hbWVzW0lkcy5JRF9OT0VNQkVEXSA9IE5PRU1CRUQ7Ci0JCWZOYW1lc1tJZHMuSURfTk9GUkFNRVNdID0gTk9GUkFNRVM7Ci0JCWZOYW1lc1tJZHMuSURfTk9TQ1JJUFRdID0gTk9TQ1JJUFQ7Ci0JCWZOYW1lc1tJZHMuSURfT0JKRUNUXSA9IE9CSkVDVDsKLQkJZk5hbWVzW0lkcy5JRF9PTF0gPSBPTDsKLQkJZk5hbWVzW0lkcy5JRF9PUFRHUk9VUF0gPSBPUFRHUk9VUDsKLQkJZk5hbWVzW0lkcy5JRF9PUFRJT05dID0gT1BUSU9OOwotCQlmTmFtZXNbSWRzLklEX1BdID0gUDsKLQkJZk5hbWVzW0lkcy5JRF9QQVJBTV0gPSBQQVJBTTsKLQkJZk5hbWVzW0lkcy5JRF9QUkVdID0gUFJFOwotCQlmTmFtZXNbSWRzLklEX1FdID0gUTsKLQkJZk5hbWVzW0lkcy5JRF9TXSA9IFM7Ci0JCWZOYW1lc1tJZHMuSURfU0FNUF0gPSBTQU1QOwotCQlmTmFtZXNbSWRzLklEX1NDUklQVF0gPSBTQ1JJUFQ7Ci0JCWZOYW1lc1tJZHMuSURfU0VMRUNUXSA9IFNFTEVDVDsKLQkJZk5hbWVzW0lkcy5JRF9TTUFMTF0gPSBTTUFMTDsKLQkJZk5hbWVzW0lkcy5JRF9TUEFOXSA9IFNQQU47Ci0JCWZOYW1lc1tJZHMuSURfU1RSSUtFXSA9IFNUUklLRTsKLQkJZk5hbWVzW0lkcy5JRF9TVFJPTkddID0gU1RST05HOwotCQlmTmFtZXNbSWRzLklEX1NUWUxFXSA9IFNUWUxFOwotCQlmTmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCWZOYW1lc1tJZHMuSURfU1VQXSA9IFNVUDsKLQkJZk5hbWVzW0lkcy5JRF9UQUJMRV0gPSBUQUJMRTsKLQkJZk5hbWVzW0lkcy5JRF9UQk9EWV0gPSBUQk9EWTsKLQkJZk5hbWVzW0lkcy5JRF9URF0gPSBURDsKLQkJZk5hbWVzW0lkcy5JRF9URVhUQVJFQV0gPSBURVhUQVJFQTsKLQkJZk5hbWVzW0lkcy5JRF9URk9PVF0gPSBURk9PVDsKLQkJZk5hbWVzW0lkcy5JRF9USF0gPSBUSDsKLQkJZk5hbWVzW0lkcy5JRF9USEVBRF0gPSBUSEVBRDsKLQkJZk5hbWVzW0lkcy5JRF9USVRMRV0gPSBUSVRMRTsKLQkJZk5hbWVzW0lkcy5JRF9UUl0gPSBUUjsKLQkJZk5hbWVzW0lkcy5JRF9UVF0gPSBUVDsKLQkJZk5hbWVzW0lkcy5JRF9VXSA9IFU7Ci0JCWZOYW1lc1tJZHMuSURfVUxdID0gVUw7Ci0JCWZOYW1lc1tJZHMuSURfVkFSXSA9IFZBUjsKLQkJZk5hbWVzW0lkcy5JRF9NQVJRVUVFXSA9IE1BUlFVRUU7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0NPTkZJR10gPSBTU0lfQ09ORklHOwotCQlmTmFtZXNbSWRzLklEX1NTSV9FQ0hPXSA9IFNTSV9FQ0hPOwotCQlmTmFtZXNbSWRzLklEX1NTSV9FWEVDXSA9IFNTSV9FWEVDOwotCQlmTmFtZXNbSWRzLklEX1NTSV9GU0laRV0gPSBTU0lfRlNJWkU7Ci0JCWZOYW1lc1tJZHMuSURfU1NJX0ZMQVNUTU9EXSA9IFNTSV9GTEFTVE1PRDsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfSU5DTFVERV0gPSBTU0lfSU5DTFVERTsKLQkJZk5hbWVzW0lkcy5JRF9TU0lfUFJJTlRFTlZdID0gU1NJX1BSSU5URU5WOwotCQlmTmFtZXNbSWRzLklEX1NTSV9TRVRdID0gU1NJX1NFVDsKLQkJZk5hbWVzW0lkcy5JRF9CR1NPVU5EXSA9IEJHU09VTkQ7Ci0JCWZOYW1lc1tJZHMuSURfTk9CUl0gPSBOT0JSOwotCQlmTmFtZXNbSWRzLklEX1dCUl0gPSBXQlI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnRDb2xsZWN0aW9uKEF0dHJpYnV0ZUNvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihmTmFtZXMsIFRPTEVSQU5UX0NBU0UpOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBY3R1YWxseSBjcmVhdGVzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaW5zdGFuY2UuCi0JICogQHJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCUhUTUxFbGVtRGVjbEltcGwgZWRlYyA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQSh0aGlzKTsKLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFCQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShBQkJSLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQUNST05ZTSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEFDUk9OWU0sIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBRERSRVNTKSkgewotCQkJZWRlYyA9IG5ldyBIZWRBRERSRVNTKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShBUFBMRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEFQUExFVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVJFQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQVJFQSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKEIsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCQVNFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCQVNFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCQVNFRk9OVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkFTRUZPTlQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJETykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkRPKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCSUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZvbnRTdHlsZShCSUcsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCTElOSykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKEJMSU5LLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQkxPQ0tRVU9URSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQkxPQ0tRVU9URSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQk9EWSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQk9EWSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCVVRUT04pKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJVVFRPTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ0FQVElPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkQ0FQVElPTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ0VOVEVSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDRU5URVIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKENJVEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShDSVRFLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09ERSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKENPREUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShDT0wpKSB7Ci0JCQllZGVjID0gbmV3IEhlZENPTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ09MR1JPVVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZENPTEdST1VQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShERCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkREQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERFTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTWFya0NoYW5nZXMoREVMLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoREZOKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoREZOLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRElSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRU5VKERJUiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERJVikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRElWKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShETCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkREwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERUKSkgewotCQkJZWRlYyA9IG5ldyBIZWREVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRU0pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShFTSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEVNQkVEKSkgewotCQkJZWRlYyA9IG5ldyBIZWRFTUJFRCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRklFTERTRVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEZJRUxEU0VUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGT05UKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGT05UKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGT1JNKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGT1JNKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShGUkFNRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRlJBTUUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEZSQU1FU0VUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGUkFNRVNFVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDEsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgzKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgzLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg2KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg2LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSEVBRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSEVBRCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIVE1MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoSSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElGUkFNRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSUZSQU1FKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElNRyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU5QVVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElOUFVUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTlMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1hcmtDaGFuZ2VzKElOUywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKElTSU5ERVgpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElTSU5ERVgodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEtCRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKEtCRCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExBQkVMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMQUJFTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTEVHRU5EKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMRUdFTkQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKExJKSkgewotCQkJZWRlYyA9IG5ldyBIZWRMSSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTElOSykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTElOSyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTUFQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNQVAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1BUlFVRUUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1BUlFVRUUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1FTlUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FTlUoTUVOVSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FVEEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PRU1CRUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE5PRU1CRUQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE5PRlJBTUVTKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT0ZSQU1FUyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoTk9TQ1JJUFQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE5PU0NSSVBUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPQkpFQ1QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9CSkVDVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT0wpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE9MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShPUFRHUk9VUCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT1BUR1JPVVAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9QVElPTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkT1BUSU9OKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShQQVJBTSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUEFSQU0odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFBSRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUFJFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShRKSkgewotCQkJZWRlYyA9IG5ldyBIZWRRKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoUywgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNBTVApKSB7Ci0JCQllZGVjID0gbmV3IEhlZFBocmFzZShTQU1QLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU0NSSVBUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTQ1JJUFQodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNFTEVDVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU0VMRUNUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTTUFMTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFNNQUxMLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1BBTikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1BBTih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1RSSUtFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRGb250U3R5bGUoU1RSSUtFLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1RST05HKSkgewotCQkJZWRlYyA9IG5ldyBIZWRQaHJhc2UoU1RST05HLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1RZTEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNUWUxFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVUIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNjcmlwdHMoU1VCLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1VQKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTY3JpcHRzKFNVUCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRBQkxFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUQUJMRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEJPRFkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQm9keShUQk9EWSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFREKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUNlbGwoVEQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShURVhUQVJFQSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVEVYVEFSRUEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRGT09UKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUYWJsZUJvZHkoVEZPT1QsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUSCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVGFibGVDZWxsKFRILCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEhFQUQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRhYmxlQm9keShUSEVBRCwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFRJVExFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRUSVRMRSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVFIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFRULCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRm9udFN0eWxlKFUsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShVTCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVUwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFZBUikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUGhyYXNlKFZBUiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9DT05GSUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUNvbmZpZyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0VDSE8pKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUVjaG8odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9FWEVDKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lFeGVjKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRlNJWkUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZzaXplKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRkxBU1RNT0QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUZsYXN0bW9kKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfSU5DTFVERSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJSW5jbHVkZSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1BSSU5URU5WKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lQcmludGVudih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX1NFVCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJU2V0KHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShCR1NPVU5EKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCR1NPVU5EKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShOT0JSKSkgewotCQkJZWRlYyA9IG5ldyBIZWROT0JSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShXQlIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFdCUih0aGlzKTsKLQotCQl9IC8vIHVua25vd24KLQkJZWxzZSB7Ci0JCQkvLyBOT1RFOiBXZSBkb24ndCBkZWZpbmUgdGhlIFVOS05PV04gZWxlbWVudCBkZWNsYXJhdGlvbi4KLQkJCS8vIDxjb2RlPm51bGw8L2NvZGU+IGZvciBhIGRlY2xhcmF0aW9uIGlzIGEgc2lnbiBvZgotCQkJLy8gdGhlIHRhcmdldCBlbGVtZW50IGlzIHVua25vd24uCi0JCQkvLyAtLSAzLzkvMjAwMQotCQkJZWRlYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVkZWM7Ci0JfQotCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24gZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZUNvbGxlY3Rpb247Ci0JfQotCi0JcHVibGljIGZpbmFsIENvbGxlY3Rpb24gZ2V0TmFtZXNPZkJsb2NrKCkgewotCQkvLyBQLCBETCwgRElWLCBDRU5URVIsIE5PU0NSSVBULCBOT0ZSQU1FUywgQkxPQ0tRVU9URSwgRk9STSwgSVNJTkRFWCwgSFIsCi0JCS8vIFRBQkxFLCBGSUVMRFNFVCwgQUREUkVTUwotCQlTdHJpbmdbXSBibG9ja01pc2MgPSB7UCwgREwsIERJViwgQ0VOVEVSLCBOT1NDUklQVCwgTk9GUkFNRVMsIEJMT0NLUVVPVEUsIEZPUk0sIElTSU5ERVgsIEhSLCBUQUJMRSwgRklFTERTRVQsIEFERFJFU1N9OwotCQlWZWN0b3IgbmFtZXMgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QoYmxvY2tNaXNjKSk7Ci0JCS8vICVoZWFkaW5nOwotCQluYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChIRUFESU5HKSk7Ci0JCS8vICVsaXN0OwotCQluYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChMSVNUKSk7Ci0JCS8vICVwcmVmb3JtYXR0ZWQ7Ci0JCW5hbWVzLmFkZEFsbChBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkpOwotCi0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQkvKioKLQkgKiAlYmxvY2s7LgotCSAqICVibG9jazsgaXM6Ci0JICogUCB8ICVoZWFkaW5nOyB8ICVsaXN0OyB8ICVwcmVmb3JtYXR0ZWQ7IHwgREwgfCBESVYgfCBDRU5URVIgfAotCSAqIE5PU0NSSVBUIHwgTk9GUkFNRVMgfCBCTE9DS1FVT1RFIHwgRk9STSB8IElTSU5ERVggfCBIUiB8Ci0JICogVEFCTEUgfCBGSUVMRFNFVCB8IEFERFJFU1MuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEJsb2NrKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIGdldE5hbWVzT2ZCbG9jaygpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbQotCSAqIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4gaW5zdGFuY2UuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0RmxvdyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0QmxvY2soZ3JvdXApOwotCQlnZXRJbmxpbmUoZ3JvdXApOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZvbnRzdHlsZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEZPTlRTVFlMRSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0Rm9ybWN0cmwoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChGT1JNQ1RMKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiAlaGVhZGluZzsuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0SGVhZGluZyhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoSEVBRElORykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtCi0JICogaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPiBpbnN0YW5jZS4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRJbmxpbmUoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEZvbnRzdHlsZShncm91cCk7Ci0JCWdldFBocmFzZShncm91cCk7Ci0JCWdldFNwZWNpYWwoZ3JvdXApOwotCQlnZXRGb3JtY3RybChncm91cCk7Ci0JfQotCi0JLyoqCi0JICogJWxpc3Q7LgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldExpc3QoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KExJU1QpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFBocmFzZShDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFBIUkFTRSkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogJXByZWZvcm1hdHRlZDsKLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRQcmVmb3JtYXR0ZWQoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFBSRUZPUk1BVFRFRCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGVsZW1lbnQgZGVjbGFyYXRpb25zIGFuZCBzdG9yZSB0aGVtIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4KLQkgKiBpbnN0YW5jZS48YnI+Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0U3BlY2lhbChDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KFNQRUNJQUwpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0VudGl0eUNvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA1OTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvRW50aXR5Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGYWN0b3J5IGZvciBlbnRpdHkgZGVjbGFyYXRpb25zLgotICovCi1maW5hbCBjbGFzcyBFbnRpdHlDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5FbnRpdHlOYW1lIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX0wgPSAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQUNVVEVfVSA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDSVJDX0wgPSAyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19VID0gMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNVVEUgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BRUxJR19MID0gNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfVSA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9MID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUdSQVZFX1UgPSA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTEVGU1lNID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfTCA9IDEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTFBIQV9VID0gMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FNUCA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTkQgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5HID0gMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX0wgPSAxNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVJJTkdfVSA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BU1lNUCA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfTCA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVElMREVfVSA9IDE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BVU1MX0wgPSAyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9VID0gMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JEUVVPID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JFVEFfTCA9IDIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX1UgPSAyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQlJWQkFSID0gMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JVTEwgPSAyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0FQID0gMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9MID0gMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NDRURJTF9VID0gMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFRElMID0gMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlQgPSAzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX0wgPSAzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0hJX1UgPSAzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0lSQyA9IDM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DTFVCUyA9IDM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT05HID0gMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NPUFkgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1JBUlIgPSAzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ1VQID0gMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUlJFTiA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfTCA9IDQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQUdHRVJfVSA9IDQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9EQVJSX0wgPSA0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9VID0gNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFRyA9IDQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9MID0gNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFTFRBX1UgPSA0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElBTVMgPSA0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWSURFID0gNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9MID0gNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VBQ1VURV9VID0gNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX0wgPSA1MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUNJUkNfVSA9IDUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfTCA9IDU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FR1JBVkVfVSA9IDU1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVBUWSA9IDU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTVNQID0gNTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VOU1AgPSA1ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVBTSUxPTl9MID0gNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fVSA9IDYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUVVJViA9IDYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfTCA9IDYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEFfVSA9IDYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfTCA9IDY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVEhfVSA9IDY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVU1MX0wgPSA2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9VID0gNjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVUk8gPSA2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhJU1QgPSA2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk5PRiA9IDcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JBTEwgPSA3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzEyID0gNzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxNCA9IDczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMzQgPSA3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBU0wgPSA3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfTCA9IDc2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HQU1NQV9VID0gNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dFID0gNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dUID0gNzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hBUlJfTCA9IDgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX1UgPSA4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEVBUlRTID0gODI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFTExJUCA9IDgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfTCA9IDg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQUNVVEVfVSA9IDg1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19MID0gODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lDSVJDX1UgPSA4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUVYQ0wgPSA4ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX0wgPSA4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUdSQVZFX1UgPSA5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1BR0UgPSA5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5GSU4gPSA5MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU5UID0gOTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lPVEFfTCA9IDk0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX1UgPSA5NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVFVRVNUID0gOTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lTSU4gPSA5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSVVNTF9MID0gOTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfVSA9IDk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9MID0gMTAwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9LQVBQQV9VID0gMTAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU1CREFfTCA9IDEwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX1UgPSAxMDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTkcgPSAxMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUVVPID0gMTA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX0wgPSAxMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBUlJfVSA9IDEwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTENFSUwgPSAxMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xEUVVPID0gMTA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRSA9IDExMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEZMT09SID0gMTExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1dBU1QgPSAxMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xPWiA9IDExMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFJNID0gMTE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU0FRVU8gPSAxMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xTUVVPID0gMTE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MVCA9IDExNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUFDUiA9IDExODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTURBU0ggPSAxMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JQ1JPID0gMTIwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSURET1QgPSAxMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01JTlVTID0gMTIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9MID0gMTIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NVV9VID0gMTI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OQUJMQSA9IDEyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkJTUCA9IDEyNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkRBU0ggPSAxMjc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05FID0gMTI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OSSA9IDEyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9UID0gMTMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OT1RJTiA9IDEzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlNVQiA9IDEzMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlRJTERFX0wgPSAxMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9VID0gMTM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9MID0gMTM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVV9VID0gMTM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQUNVVEVfTCA9IDEzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX1UgPSAxMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX0wgPSAxMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09DSVJDX1UgPSAxNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX0wgPSAxNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09FTElHX1UgPSAxNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09HUkFWRV9MID0gMTQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfVSA9IDE0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0xJTkUgPSAxNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX0wgPSAxNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NRUdBX1UgPSAxNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fTCA9IDE0ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT01JQ1JPTl9VID0gMTQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUExVUyA9IDE1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1IgPSAxNTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SREYgPSAxNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SRE0gPSAxNTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09TTEFTSF9MID0gMTU0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfVSA9IDE1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTERFX0wgPSAxNTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9VID0gMTU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElNRVMgPSAxNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfTCA9IDE1OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1VNTF9VID0gMTYwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBID0gMTYxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJUID0gMTYyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJNSUwgPSAxNjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BFUlAgPSAxNjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BISV9MID0gMTY1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfVSA9IDE2NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElWID0gMTY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9MID0gMTY4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSV9VID0gMTY5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QTFVTTU4gPSAxNzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BPVU5EID0gMTcxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9MID0gMTcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUklNRV9VID0gMTczOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9EID0gMTc0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUk9QID0gMTc1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QU0lfTCA9IDE3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX1UgPSAxNzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1FVT1QgPSAxNzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBRElDID0gMTc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQU5HID0gMTgwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVFVTyA9IDE4MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9MID0gMTgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQVJSX1UgPSAxODM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JDRUlMID0gMTg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRFFVTyA9IDE4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVBTCA9IDE4NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkVHID0gMTg3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SRkxPT1IgPSAxODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JIT19MID0gMTg5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fVSA9IDE5MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkxNID0gMTkxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU0FRVU8gPSAxOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JTUVVPID0gMTkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQlFVTyA9IDE5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NBUk9OX0wgPSAxOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9VID0gMTk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRE9UID0gMTk3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TRUNUID0gMTk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSFkgPSAxOTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BRiA9IDIwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfTCA9IDIwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lHTUFfVSA9IDIwMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0lNID0gMjAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TUEFERVMgPSAyMDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQiA9IDIwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VCRSA9IDIwNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VNID0gMjA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAgPSAyMDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDEgPSAyMDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDIgPSAyMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUDMgPSAyMTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVUEUgPSAyMTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NaTElHID0gMjEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UQVVfTCA9IDIxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX1UgPSAyMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVJFNCA9IDIxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhFVEFTWU0gPSAyMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX0wgPSAyMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBX1UgPSAyMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RISU5TUCA9IDIyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fTCA9IDIyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEhPUk5fVSA9IDIyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVElMREUgPSAyMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTUVTID0gMjI0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9UUkFERSA9IDIyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFDVVRFX0wgPSAyMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9VID0gMjI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX0wgPSAyMjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBUlJfVSA9IDIyOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfTCA9IDIzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUNJUkNfVSA9IDIzMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUdSQVZFX0wgPSAyMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9VID0gMjMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VTUwgPSAyMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lIID0gMjM1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX0wgPSAyMzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VQU0lMT05fVSA9IDIzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9MID0gMjM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VVU1MX1UgPSAyMzk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1dFSUVSUCA9IDI0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfTCA9IDI0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWElfVSA9IDI0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUFDVVRFX0wgPSAyNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9VID0gMjQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZRU4gPSAyNDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfTCA9IDI0NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWVVNTF9VID0gMjQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX0wgPSAyNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pFVEFfVSA9IDI0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldKID0gMjUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aV05KID0gMjUxOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMjUyLgotCQkJLy8gLS0gNS8yNC8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9MXSA9IEFBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfQUFDVVRFX1VdID0gQUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19MXSA9IEFDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9BQ0lSQ19VXSA9IEFDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9BQ1VURV0gPSBBQ1VURTsKLQkJbmFtZXNbSWRzLklEX0FFTElHX0xdID0gQUVMSUdfTDsKLQkJbmFtZXNbSWRzLklEX0FFTElHX1VdID0gQUVMSUdfVTsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9MXSA9IEFHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfQUdSQVZFX1VdID0gQUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTEVGU1lNXSA9IEFMRUZTWU07Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9MXSA9IEFMUEhBX0w7Ci0JCW5hbWVzW0lkcy5JRF9BTFBIQV9VXSA9IEFMUEhBX1U7Ci0JCW5hbWVzW0lkcy5JRF9BTVBdID0gQU1QOwotCQluYW1lc1tJZHMuSURfQU5EXSA9IEFORDsKLQkJbmFtZXNbSWRzLklEX0FOR10gPSBBTkc7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19MXSA9IEFSSU5HX0w7Ci0JCW5hbWVzW0lkcy5JRF9BUklOR19VXSA9IEFSSU5HX1U7Ci0JCW5hbWVzW0lkcy5JRF9BU1lNUF0gPSBBU1lNUDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9MXSA9IEFUSUxERV9MOwotCQluYW1lc1tJZHMuSURfQVRJTERFX1VdID0gQVRJTERFX1U7Ci0JCW5hbWVzW0lkcy5JRF9BVU1MX0xdID0gQVVNTF9MOwotCQluYW1lc1tJZHMuSURfQVVNTF9VXSA9IEFVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0JEUVVPXSA9IEJEUVVPOwotCQluYW1lc1tJZHMuSURfQkVUQV9MXSA9IEJFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0JFVEFfVV0gPSBCRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9CUlZCQVJdID0gQlJWQkFSOwotCQluYW1lc1tJZHMuSURfQlVMTF0gPSBCVUxMOwotCQluYW1lc1tJZHMuSURfQ0FQXSA9IENBUDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9MXSA9IENDRURJTF9MOwotCQluYW1lc1tJZHMuSURfQ0NFRElMX1VdID0gQ0NFRElMX1U7Ci0JCW5hbWVzW0lkcy5JRF9DRURJTF0gPSBDRURJTDsKLQkJbmFtZXNbSWRzLklEX0NFTlRdID0gQ0VOVDsKLQkJbmFtZXNbSWRzLklEX0NISV9MXSA9IENISV9MOwotCQluYW1lc1tJZHMuSURfQ0hJX1VdID0gQ0hJX1U7Ci0JCW5hbWVzW0lkcy5JRF9DSVJDXSA9IENJUkM7Ci0JCW5hbWVzW0lkcy5JRF9DTFVCU10gPSBDTFVCUzsKLQkJbmFtZXNbSWRzLklEX0NPTkddID0gQ09ORzsKLQkJbmFtZXNbSWRzLklEX0NPUFldID0gQ09QWTsKLQkJbmFtZXNbSWRzLklEX0NSQVJSXSA9IENSQVJSOwotCQluYW1lc1tJZHMuSURfQ1VQXSA9IENVUDsKLQkJbmFtZXNbSWRzLklEX0NVUlJFTl0gPSBDVVJSRU47Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfTF0gPSBEQUdHRVJfTDsKLQkJbmFtZXNbSWRzLklEX0RBR0dFUl9VXSA9IERBR0dFUl9VOwotCQluYW1lc1tJZHMuSURfREFSUl9MXSA9IERBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0RBUlJfVV0gPSBEQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9ERUddID0gREVHOwotCQluYW1lc1tJZHMuSURfREVMVEFfTF0gPSBERUxUQV9MOwotCQluYW1lc1tJZHMuSURfREVMVEFfVV0gPSBERUxUQV9VOwotCQluYW1lc1tJZHMuSURfRElBTVNdID0gRElBTVM7Ci0JCW5hbWVzW0lkcy5JRF9ESVZJREVdID0gRElWSURFOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX0xdID0gRUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQUNVVEVfVV0gPSBFQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX0xdID0gRUNJUkNfTDsKLQkJbmFtZXNbSWRzLklEX0VDSVJDX1VdID0gRUNJUkNfVTsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9MXSA9IEVHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfRUdSQVZFX1VdID0gRUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FTVBUWV0gPSBFTVBUWTsKLQkJbmFtZXNbSWRzLklEX0VNU1BdID0gRU1TUDsKLQkJbmFtZXNbSWRzLklEX0VOU1BdID0gRU5TUDsKLQkJbmFtZXNbSWRzLklEX0VQU0lMT05fTF0gPSBFUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gRVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfRVFVSVZdID0gRVFVSVY7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfTF0gPSBFVEFfTDsKLQkJbmFtZXNbSWRzLklEX0VUQV9VXSA9IEVUQV9VOwotCQluYW1lc1tJZHMuSURfRVRIX0xdID0gRVRIX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEhfVV0gPSBFVEhfVTsKLQkJbmFtZXNbSWRzLklEX0VVTUxfTF0gPSBFVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX1VdID0gRVVNTF9VOwotCQluYW1lc1tJZHMuSURfRVVST10gPSBFVVJPOwotCQluYW1lc1tJZHMuSURfRVhJU1RdID0gRVhJU1Q7Ci0JCW5hbWVzW0lkcy5JRF9GTk9GXSA9IEZOT0Y7Ci0JCW5hbWVzW0lkcy5JRF9GT1JBTExdID0gRk9SQUxMOwotCQluYW1lc1tJZHMuSURfRlJBQzEyXSA9IEZSQUMxMjsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxNF0gPSBGUkFDMTQ7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMzRdID0gRlJBQzM0OwotCQluYW1lc1tJZHMuSURfRlJBU0xdID0gRlJBU0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9MXSA9IEdBTU1BX0w7Ci0JCW5hbWVzW0lkcy5JRF9HQU1NQV9VXSA9IEdBTU1BX1U7Ci0JCW5hbWVzW0lkcy5JRF9HRV0gPSBHRTsKLQkJbmFtZXNbSWRzLklEX0dUXSA9IEdUOwotCQluYW1lc1tJZHMuSURfSEFSUl9MXSA9IEhBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfVV0gPSBIQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9IRUFSVFNdID0gSEVBUlRTOwotCQluYW1lc1tJZHMuSURfSEVMTElQXSA9IEhFTExJUDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9MXSA9IElBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfSUFDVVRFX1VdID0gSUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19MXSA9IElDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9JQ0lSQ19VXSA9IElDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9JRVhDTF0gPSBJRVhDTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9MXSA9IElHUkFWRV9MOwotCQluYW1lc1tJZHMuSURfSUdSQVZFX1VdID0gSUdSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9JTUFHRV0gPSBJTUFHRTsKLQkJbmFtZXNbSWRzLklEX0lORklOXSA9IElORklOOwotCQluYW1lc1tJZHMuSURfSU5UXSA9IElOVDsKLQkJbmFtZXNbSWRzLklEX0lPVEFfTF0gPSBJT1RBX0w7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX1VdID0gSU9UQV9VOwotCQluYW1lc1tJZHMuSURfSVFVRVNUXSA9IElRVUVTVDsKLQkJbmFtZXNbSWRzLklEX0lTSU5dID0gSVNJTjsKLQkJbmFtZXNbSWRzLklEX0lVTUxfTF0gPSBJVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX1VdID0gSVVNTF9VOwotCQluYW1lc1tJZHMuSURfS0FQUEFfTF0gPSBLQVBQQV9MOwotCQluYW1lc1tJZHMuSURfS0FQUEFfVV0gPSBLQVBQQV9VOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX0xdID0gTEFNQkRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQU1CREFfVV0gPSBMQU1CREFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTkddID0gTEFORzsKLQkJbmFtZXNbSWRzLklEX0xBUVVPXSA9IExBUVVPOwotCQluYW1lc1tJZHMuSURfTEFSUl9MXSA9IExBUlJfTDsKLQkJbmFtZXNbSWRzLklEX0xBUlJfVV0gPSBMQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQ0VJTF0gPSBMQ0VJTDsKLQkJbmFtZXNbSWRzLklEX0xEUVVPXSA9IExEUVVPOwotCQluYW1lc1tJZHMuSURfTEVdID0gTEU7Ci0JCW5hbWVzW0lkcy5JRF9MRkxPT1JdID0gTEZMT09SOwotCQluYW1lc1tJZHMuSURfTE9XQVNUXSA9IExPV0FTVDsKLQkJbmFtZXNbSWRzLklEX0xPWl0gPSBMT1o7Ci0JCW5hbWVzW0lkcy5JRF9MUk1dID0gTFJNOwotCQluYW1lc1tJZHMuSURfTFNBUVVPXSA9IExTQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xTUVVPXSA9IExTUVVPOwotCQluYW1lc1tJZHMuSURfTFRdID0gTFQ7Ci0JCW5hbWVzW0lkcy5JRF9NQUNSXSA9IE1BQ1I7Ci0JCW5hbWVzW0lkcy5JRF9NREFTSF0gPSBNREFTSDsKLQkJbmFtZXNbSWRzLklEX01JQ1JPXSA9IE1JQ1JPOwotCQluYW1lc1tJZHMuSURfTUlERE9UXSA9IE1JRERPVDsKLQkJbmFtZXNbSWRzLklEX01JTlVTXSA9IE1JTlVTOwotCQluYW1lc1tJZHMuSURfTVVfTF0gPSBNVV9MOwotCQluYW1lc1tJZHMuSURfTVVfVV0gPSBNVV9VOwotCQluYW1lc1tJZHMuSURfTkFCTEFdID0gTkFCTEE7Ci0JCW5hbWVzW0lkcy5JRF9OQlNQXSA9IE5CU1A7Ci0JCW5hbWVzW0lkcy5JRF9OREFTSF0gPSBOREFTSDsKLQkJbmFtZXNbSWRzLklEX05FXSA9IE5FOwotCQluYW1lc1tJZHMuSURfTkldID0gTkk7Ci0JCW5hbWVzW0lkcy5JRF9OT1RdID0gTk9UOwotCQluYW1lc1tJZHMuSURfTk9USU5dID0gTk9USU47Ci0JCW5hbWVzW0lkcy5JRF9OU1VCXSA9IE5TVUI7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfTF0gPSBOVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX05USUxERV9VXSA9IE5USUxERV9VOwotCQluYW1lc1tJZHMuSURfTlVfTF0gPSBOVV9MOwotCQluYW1lc1tJZHMuSURfTlVfVV0gPSBOVV9VOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX0xdID0gT0FDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQUNVVEVfVV0gPSBPQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX09DSVJDX0xdID0gT0NJUkNfTDsKLQkJbmFtZXNbSWRzLklEX09DSVJDX1VdID0gT0NJUkNfVTsKLQkJbmFtZXNbSWRzLklEX09FTElHX0xdID0gT0VMSUdfTDsKLQkJbmFtZXNbSWRzLklEX09FTElHX1VdID0gT0VMSUdfVTsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9MXSA9IE9HUkFWRV9MOwotCQluYW1lc1tJZHMuSURfT0dSQVZFX1VdID0gT0dSQVZFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTElORV0gPSBPTElORTsKLQkJbmFtZXNbSWRzLklEX09NRUdBX0xdID0gT01FR0FfTDsKLQkJbmFtZXNbSWRzLklEX09NRUdBX1VdID0gT01FR0FfVTsKLQkJbmFtZXNbSWRzLklEX09NSUNST05fTF0gPSBPTUlDUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gT01JQ1JPTl9VOwotCQluYW1lc1tJZHMuSURfT1BMVVNdID0gT1BMVVM7Ci0JCW5hbWVzW0lkcy5JRF9PUl0gPSBPUjsKLQkJbmFtZXNbSWRzLklEX09SREZdID0gT1JERjsKLQkJbmFtZXNbSWRzLklEX09SRE1dID0gT1JETTsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9MXSA9IE9TTEFTSF9MOwotCQluYW1lc1tJZHMuSURfT1NMQVNIX1VdID0gT1NMQVNIX1U7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfTF0gPSBPVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX09USUxERV9VXSA9IE9USUxERV9VOwotCQluYW1lc1tJZHMuSURfT1RJTUVTXSA9IE9USU1FUzsKLQkJbmFtZXNbSWRzLklEX09VTUxfTF0gPSBPVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX1VdID0gT1VNTF9VOwotCQluYW1lc1tJZHMuSURfUEFSQV0gPSBQQVJBOwotCQluYW1lc1tJZHMuSURfUEFSVF0gPSBQQVJUOwotCQluYW1lc1tJZHMuSURfUEVSTUlMXSA9IFBFUk1JTDsKLQkJbmFtZXNbSWRzLklEX1BFUlBdID0gUEVSUDsKLQkJbmFtZXNbSWRzLklEX1BISV9MXSA9IFBISV9MOwotCQluYW1lc1tJZHMuSURfUEhJX1VdID0gUEhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9QSVZdID0gUElWOwotCQluYW1lc1tJZHMuSURfUElfTF0gPSBQSV9MOwotCQluYW1lc1tJZHMuSURfUElfVV0gPSBQSV9VOwotCQluYW1lc1tJZHMuSURfUExVU01OXSA9IFBMVVNNTjsKLQkJbmFtZXNbSWRzLklEX1BPVU5EXSA9IFBPVU5EOwotCQluYW1lc1tJZHMuSURfUFJJTUVfTF0gPSBQUklNRV9MOwotCQluYW1lc1tJZHMuSURfUFJJTUVfVV0gPSBQUklNRV9VOwotCQluYW1lc1tJZHMuSURfUFJPRF0gPSBQUk9EOwotCQluYW1lc1tJZHMuSURfUFJPUF0gPSBQUk9QOwotCQluYW1lc1tJZHMuSURfUFNJX0xdID0gUFNJX0w7Ci0JCW5hbWVzW0lkcy5JRF9QU0lfVV0gPSBQU0lfVTsKLQkJbmFtZXNbSWRzLklEX1FVT1RdID0gUVVPVDsKLQkJbmFtZXNbSWRzLklEX1JBRElDXSA9IFJBRElDOwotCQluYW1lc1tJZHMuSURfUkFOR10gPSBSQU5HOwotCQluYW1lc1tJZHMuSURfUkFRVU9dID0gUkFRVU87Ci0JCW5hbWVzW0lkcy5JRF9SQVJSX0xdID0gUkFSUl9MOwotCQluYW1lc1tJZHMuSURfUkFSUl9VXSA9IFJBUlJfVTsKLQkJbmFtZXNbSWRzLklEX1JDRUlMXSA9IFJDRUlMOwotCQluYW1lc1tJZHMuSURfUkRRVU9dID0gUkRRVU87Ci0JCW5hbWVzW0lkcy5JRF9SRUFMXSA9IFJFQUw7Ci0JCW5hbWVzW0lkcy5JRF9SRUddID0gUkVHOwotCQluYW1lc1tJZHMuSURfUkZMT09SXSA9IFJGTE9PUjsKLQkJbmFtZXNbSWRzLklEX1JIT19MXSA9IFJIT19MOwotCQluYW1lc1tJZHMuSURfUkhPX1VdID0gUkhPX1U7Ci0JCW5hbWVzW0lkcy5JRF9STE1dID0gUkxNOwotCQluYW1lc1tJZHMuSURfUlNBUVVPXSA9IFJTQVFVTzsKLQkJbmFtZXNbSWRzLklEX1JTUVVPXSA9IFJTUVVPOwotCQluYW1lc1tJZHMuSURfU0JRVU9dID0gU0JRVU87Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fTF0gPSBTQ0FST05fTDsKLQkJbmFtZXNbSWRzLklEX1NDQVJPTl9VXSA9IFNDQVJPTl9VOwotCQluYW1lc1tJZHMuSURfU0RPVF0gPSBTRE9UOwotCQluYW1lc1tJZHMuSURfU0VDVF0gPSBTRUNUOwotCQluYW1lc1tJZHMuSURfU0hZXSA9IFNIWTsKLQkJbmFtZXNbSWRzLklEX1NJR01BRl0gPSBTSUdNQUY7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9MXSA9IFNJR01BX0w7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQV9VXSA9IFNJR01BX1U7Ci0JCW5hbWVzW0lkcy5JRF9TSU1dID0gU0lNOwotCQluYW1lc1tJZHMuSURfU1BBREVTXSA9IFNQQURFUzsKLQkJbmFtZXNbSWRzLklEX1NVQl0gPSBTVUI7Ci0JCW5hbWVzW0lkcy5JRF9TVUJFXSA9IFNVQkU7Ci0JCW5hbWVzW0lkcy5JRF9TVU1dID0gU1VNOwotCQluYW1lc1tJZHMuSURfU1VQXSA9IFNVUDsKLQkJbmFtZXNbSWRzLklEX1NVUDFdID0gU1VQMTsKLQkJbmFtZXNbSWRzLklEX1NVUDJdID0gU1VQMjsKLQkJbmFtZXNbSWRzLklEX1NVUDNdID0gU1VQMzsKLQkJbmFtZXNbSWRzLklEX1NVUEVdID0gU1VQRTsKLQkJbmFtZXNbSWRzLklEX1NaTElHXSA9IFNaTElHOwotCQluYW1lc1tJZHMuSURfVEFVX0xdID0gVEFVX0w7Ci0JCW5hbWVzW0lkcy5JRF9UQVVfVV0gPSBUQVVfVTsKLQkJbmFtZXNbSWRzLklEX1RIRVJFNF0gPSBUSEVSRTQ7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQVNZTV0gPSBUSEVUQVNZTTsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX0xdID0gVEhFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1RIRVRBX1VdID0gVEhFVEFfVTsKLQkJbmFtZXNbSWRzLklEX1RISU5TUF0gPSBUSElOU1A7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9MXSA9IFRIT1JOX0w7Ci0JCW5hbWVzW0lkcy5JRF9USE9STl9VXSA9IFRIT1JOX1U7Ci0JCW5hbWVzW0lkcy5JRF9USUxERV0gPSBUSUxERTsKLQkJbmFtZXNbSWRzLklEX1RJTUVTXSA9IFRJTUVTOwotCQluYW1lc1tJZHMuSURfVFJBREVdID0gVFJBREU7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfTF0gPSBVQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1VBQ1VURV9VXSA9IFVBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfVUFSUl9MXSA9IFVBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1VBUlJfVV0gPSBVQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19MXSA9IFVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQ0lSQ19VXSA9IFVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfTF0gPSBVR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX1VHUkFWRV9VXSA9IFVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfVU1MXSA9IFVNTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lIXSA9IFVQU0lIOwotCQluYW1lc1tJZHMuSURfVVBTSUxPTl9MXSA9IFVQU0lMT05fTDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fVV0gPSBVUFNJTE9OX1U7Ci0JCW5hbWVzW0lkcy5JRF9VVU1MX0xdID0gVVVNTF9MOwotCQluYW1lc1tJZHMuSURfVVVNTF9VXSA9IFVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1dFSUVSUF0gPSBXRUlFUlA7Ci0JCW5hbWVzW0lkcy5JRF9YSV9MXSA9IFhJX0w7Ci0JCW5hbWVzW0lkcy5JRF9YSV9VXSA9IFhJX1U7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfTF0gPSBZQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX1lBQ1VURV9VXSA9IFlBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfWUVOXSA9IFlFTjsKLQkJbmFtZXNbSWRzLklEX1lVTUxfTF0gPSBZVU1MX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX1VdID0gWVVNTF9VOwotCQluYW1lc1tJZHMuSURfWkVUQV9MXSA9IFpFVEFfTDsKLQkJbmFtZXNbSWRzLklEX1pFVEFfVV0gPSBaRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9aV0pdID0gWldKOwotCQluYW1lc1tJZHMuSURfWldOSl0gPSBaV05KOwotCX0KLQlwcml2YXRlIHN0YXRpYyBjaGFyW10gdmFsdWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCXZhbHVlcyA9IG5ldyBjaGFyW0lkcy5nZXROdW1PZklkcygpXTsKLQkJdmFsdWVzW0lkcy5JRF9BQUNVVEVfTF0gPSAyMjU7Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX1VdID0gMTkzOwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX0xdID0gMjI2OwotCQl2YWx1ZXNbSWRzLklEX0FDSVJDX1VdID0gMTk0OwotCQl2YWx1ZXNbSWRzLklEX0FDVVRFXSA9IDE4MDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19MXSA9IDIzMDsKLQkJdmFsdWVzW0lkcy5JRF9BRUxJR19VXSA9IDE5ODsKLQkJdmFsdWVzW0lkcy5JRF9BR1JBVkVfTF0gPSAyMjQ7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX1VdID0gMTkyOwotCQl2YWx1ZXNbSWRzLklEX0FMRUZTWU1dID0gODUwMTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9MXSA9IDk0NTsKLQkJdmFsdWVzW0lkcy5JRF9BTFBIQV9VXSA9IDkxMzsKLQkJdmFsdWVzW0lkcy5JRF9BTVBdID0gMzg7Ci0JCXZhbHVlc1tJZHMuSURfQU5EXSA9IDg3NDM7Ci0JCXZhbHVlc1tJZHMuSURfQU5HXSA9IDg3MzY7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfTF0gPSAyMjk7Ci0JCXZhbHVlc1tJZHMuSURfQVJJTkdfVV0gPSAxOTc7Ci0JCXZhbHVlc1tJZHMuSURfQVNZTVBdID0gODc3NjsKLQkJdmFsdWVzW0lkcy5JRF9BVElMREVfTF0gPSAyMjc7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX1VdID0gMTk1OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfTF0gPSAyMjg7Ci0JCXZhbHVlc1tJZHMuSURfQVVNTF9VXSA9IDE5NjsKLQkJdmFsdWVzW0lkcy5JRF9CRFFVT10gPSA4MjIyOwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfTF0gPSA5NDY7Ci0JCXZhbHVlc1tJZHMuSURfQkVUQV9VXSA9IDkxNDsKLQkJdmFsdWVzW0lkcy5JRF9CUlZCQVJdID0gMTY2OwotCQl2YWx1ZXNbSWRzLklEX0JVTExdID0gODIyNjsKLQkJdmFsdWVzW0lkcy5JRF9DQVBdID0gODc0NTsKLQkJdmFsdWVzW0lkcy5JRF9DQ0VESUxfTF0gPSAyMzE7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX1VdID0gMTk5OwotCQl2YWx1ZXNbSWRzLklEX0NFRElMXSA9IDE4NDsKLQkJdmFsdWVzW0lkcy5JRF9DRU5UXSA9IDE2MjsKLQkJdmFsdWVzW0lkcy5JRF9DSElfTF0gPSA5Njc7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX1VdID0gOTM1OwotCQl2YWx1ZXNbSWRzLklEX0NJUkNdID0gNzEwOwotCQl2YWx1ZXNbSWRzLklEX0NMVUJTXSA9IDk4Mjc7Ci0JCXZhbHVlc1tJZHMuSURfQ09OR10gPSA4NzczOwotCQl2YWx1ZXNbSWRzLklEX0NPUFldID0gMTY5OwotCQl2YWx1ZXNbSWRzLklEX0NSQVJSXSA9IDg2Mjk7Ci0JCXZhbHVlc1tJZHMuSURfQ1VQXSA9IDg3NDY7Ci0JCXZhbHVlc1tJZHMuSURfQ1VSUkVOXSA9IDE2NDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfTF0gPSA4MjI0OwotCQl2YWx1ZXNbSWRzLklEX0RBR0dFUl9VXSA9IDgyMjU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9MXSA9IDg1OTU7Ci0JCXZhbHVlc1tJZHMuSURfREFSUl9VXSA9IDg2NTk7Ci0JCXZhbHVlc1tJZHMuSURfREVHXSA9IDE3NjsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9MXSA9IDk0ODsKLQkJdmFsdWVzW0lkcy5JRF9ERUxUQV9VXSA9IDkxNjsKLQkJdmFsdWVzW0lkcy5JRF9ESUFNU10gPSA5ODMwOwotCQl2YWx1ZXNbSWRzLklEX0RJVklERV0gPSAyNDc7Ci0JCXZhbHVlc1tJZHMuSURfRUFDVVRFX0xdID0gMjMzOwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9VXSA9IDIwMTsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19MXSA9IDIzNDsKLQkJdmFsdWVzW0lkcy5JRF9FQ0lSQ19VXSA9IDIwMjsKLQkJdmFsdWVzW0lkcy5JRF9FR1JBVkVfTF0gPSAyMzI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX1VdID0gMjAwOwotCQl2YWx1ZXNbSWRzLklEX0VNUFRZXSA9IDg3MDk7Ci0JCXZhbHVlc1tJZHMuSURfRU1TUF0gPSA4MTk1OwotCQl2YWx1ZXNbSWRzLklEX0VOU1BdID0gODE5NDsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gOTQ5OwotCQl2YWx1ZXNbSWRzLklEX0VQU0lMT05fVV0gPSA5MTc7Ci0JCXZhbHVlc1tJZHMuSURfRVFVSVZdID0gODgwMTsKLQkJdmFsdWVzW0lkcy5JRF9FVEFfTF0gPSA5NTE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX1VdID0gOTE5OwotCQl2YWx1ZXNbSWRzLklEX0VUSF9MXSA9IDI0MDsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfVV0gPSAyMDg7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9MXSA9IDIzNTsKLQkJdmFsdWVzW0lkcy5JRF9FVU1MX1VdID0gMjAzOwotCQl2YWx1ZXNbSWRzLklEX0VVUk9dID0gODM2NDsKLQkJdmFsdWVzW0lkcy5JRF9FWElTVF0gPSA4NzA3OwotCQl2YWx1ZXNbSWRzLklEX0ZOT0ZdID0gNDAyOwotCQl2YWx1ZXNbSWRzLklEX0ZPUkFMTF0gPSA4NzA0OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxMl0gPSAxODk7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzE0XSA9IDE4ODsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMzRdID0gMTkwOwotCQl2YWx1ZXNbSWRzLklEX0ZSQVNMXSA9IDgyNjA7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfTF0gPSA5NDc7Ci0JCXZhbHVlc1tJZHMuSURfR0FNTUFfVV0gPSA5MTU7Ci0JCXZhbHVlc1tJZHMuSURfR0VdID0gODgwNTsKLQkJdmFsdWVzW0lkcy5JRF9HVF0gPSA2MjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX0xdID0gODU5NjsKLQkJdmFsdWVzW0lkcy5JRF9IQVJSX1VdID0gODY2MDsKLQkJdmFsdWVzW0lkcy5JRF9IRUFSVFNdID0gOTgyOTsKLQkJdmFsdWVzW0lkcy5JRF9IRUxMSVBdID0gODIzMDsKLQkJdmFsdWVzW0lkcy5JRF9JQUNVVEVfTF0gPSAyMzc7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX1VdID0gMjA1OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX0xdID0gMjM4OwotCQl2YWx1ZXNbSWRzLklEX0lDSVJDX1VdID0gMjA2OwotCQl2YWx1ZXNbSWRzLklEX0lFWENMXSA9IDE2MTsKLQkJdmFsdWVzW0lkcy5JRF9JR1JBVkVfTF0gPSAyMzY7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX1VdID0gMjA0OwotCQl2YWx1ZXNbSWRzLklEX0lNQUdFXSA9IDg0NjU7Ci0JCXZhbHVlc1tJZHMuSURfSU5GSU5dID0gODczNDsKLQkJdmFsdWVzW0lkcy5JRF9JTlRdID0gODc0NzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX0xdID0gOTUzOwotCQl2YWx1ZXNbSWRzLklEX0lPVEFfVV0gPSA5MjE7Ci0JCXZhbHVlc1tJZHMuSURfSVFVRVNUXSA9IDE5MTsKLQkJdmFsdWVzW0lkcy5JRF9JU0lOXSA9IDg3MTI7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9MXSA9IDIzOTsKLQkJdmFsdWVzW0lkcy5JRF9JVU1MX1VdID0gMjA3OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX0xdID0gOTU0OwotCQl2YWx1ZXNbSWRzLklEX0tBUFBBX1VdID0gOTIyOwotCQl2YWx1ZXNbSWRzLklEX0xBTUJEQV9MXSA9IDk1NTsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfVV0gPSA5MjM7Ci0JCXZhbHVlc1tJZHMuSURfTEFOR10gPSA5MDAxOwotCQl2YWx1ZXNbSWRzLklEX0xBUVVPXSA9IDE3MTsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX0xdID0gODU5MjsKLQkJdmFsdWVzW0lkcy5JRF9MQVJSX1VdID0gODY1NjsKLQkJdmFsdWVzW0lkcy5JRF9MQ0VJTF0gPSA4OTY4OwotCQl2YWx1ZXNbSWRzLklEX0xEUVVPXSA9IDgyMjA7Ci0JCXZhbHVlc1tJZHMuSURfTEVdID0gODgwNDsKLQkJdmFsdWVzW0lkcy5JRF9MRkxPT1JdID0gODk3MDsKLQkJdmFsdWVzW0lkcy5JRF9MT1dBU1RdID0gODcyNzsKLQkJdmFsdWVzW0lkcy5JRF9MT1pdID0gOTY3NDsKLQkJdmFsdWVzW0lkcy5JRF9MUk1dID0gODIwNjsKLQkJdmFsdWVzW0lkcy5JRF9MU0FRVU9dID0gODI0OTsKLQkJdmFsdWVzW0lkcy5JRF9MU1FVT10gPSA4MjE2OwotCQl2YWx1ZXNbSWRzLklEX0xUXSA9IDYwOwotCQl2YWx1ZXNbSWRzLklEX01BQ1JdID0gMTc1OwotCQl2YWx1ZXNbSWRzLklEX01EQVNIXSA9IDgyMTI7Ci0JCXZhbHVlc1tJZHMuSURfTUlDUk9dID0gMTgxOwotCQl2YWx1ZXNbSWRzLklEX01JRERPVF0gPSAxODM7Ci0JCXZhbHVlc1tJZHMuSURfTUlOVVNdID0gODcyMjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9MXSA9IDk1NjsKLQkJdmFsdWVzW0lkcy5JRF9NVV9VXSA9IDkyNDsKLQkJdmFsdWVzW0lkcy5JRF9OQUJMQV0gPSA4NzExOwotCQl2YWx1ZXNbSWRzLklEX05CU1BdID0gMTYwOwotCQl2YWx1ZXNbSWRzLklEX05EQVNIXSA9IDgyMTE7Ci0JCXZhbHVlc1tJZHMuSURfTkVdID0gODgwMDsKLQkJdmFsdWVzW0lkcy5JRF9OSV0gPSA4NzE1OwotCQl2YWx1ZXNbSWRzLklEX05PVF0gPSAxNzI7Ci0JCXZhbHVlc1tJZHMuSURfTk9USU5dID0gODcxMzsKLQkJdmFsdWVzW0lkcy5JRF9OU1VCXSA9IDg4MzY7Ci0JCXZhbHVlc1tJZHMuSURfTlRJTERFX0xdID0gMjQxOwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9VXSA9IDIwOTsKLQkJdmFsdWVzW0lkcy5JRF9OVV9MXSA9IDk1NzsKLQkJdmFsdWVzW0lkcy5JRF9OVV9VXSA9IDkyNTsKLQkJdmFsdWVzW0lkcy5JRF9PQUNVVEVfTF0gPSAyNDM7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX1VdID0gMjExOwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX0xdID0gMjQ0OwotCQl2YWx1ZXNbSWRzLklEX09DSVJDX1VdID0gMjEyOwotCQl2YWx1ZXNbSWRzLklEX09FTElHX0xdID0gMzM5OwotCQl2YWx1ZXNbSWRzLklEX09FTElHX1VdID0gMzM4OwotCQl2YWx1ZXNbSWRzLklEX09HUkFWRV9MXSA9IDI0MjsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfVV0gPSAyMTA7Ci0JCXZhbHVlc1tJZHMuSURfT0xJTkVdID0gODI1NDsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9MXSA9IDk2OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUVHQV9VXSA9IDkzNzsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gOTU5OwotCQl2YWx1ZXNbSWRzLklEX09NSUNST05fVV0gPSA5Mjc7Ci0JCXZhbHVlc1tJZHMuSURfT1BMVVNdID0gODg1MzsKLQkJdmFsdWVzW0lkcy5JRF9PUl0gPSA4NzQ0OwotCQl2YWx1ZXNbSWRzLklEX09SREZdID0gMTcwOwotCQl2YWx1ZXNbSWRzLklEX09SRE1dID0gMTg2OwotCQl2YWx1ZXNbSWRzLklEX09TTEFTSF9MXSA9IDI0ODsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfVV0gPSAyMTY7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTERFX0xdID0gMjQ1OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9VXSA9IDIxMzsKLQkJdmFsdWVzW0lkcy5JRF9PVElNRVNdID0gODg1NTsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX0xdID0gMjQ2OwotCQl2YWx1ZXNbSWRzLklEX09VTUxfVV0gPSAyMTQ7Ci0JCXZhbHVlc1tJZHMuSURfUEFSQV0gPSAxODI7Ci0JCXZhbHVlc1tJZHMuSURfUEFSVF0gPSA4NzA2OwotCQl2YWx1ZXNbSWRzLklEX1BFUk1JTF0gPSA4MjQwOwotCQl2YWx1ZXNbSWRzLklEX1BFUlBdID0gODg2OTsKLQkJdmFsdWVzW0lkcy5JRF9QSElfTF0gPSA5NjY7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX1VdID0gOTM0OwotCQl2YWx1ZXNbSWRzLklEX1BJVl0gPSA5ODI7Ci0JCXZhbHVlc1tJZHMuSURfUElfTF0gPSA5NjA7Ci0JCXZhbHVlc1tJZHMuSURfUElfVV0gPSA5Mjg7Ci0JCXZhbHVlc1tJZHMuSURfUExVU01OXSA9IDE3NzsKLQkJdmFsdWVzW0lkcy5JRF9QT1VORF0gPSAxNjM7Ci0JCXZhbHVlc1tJZHMuSURfUFJJTUVfTF0gPSA4MjQyOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX1VdID0gODI0MzsKLQkJdmFsdWVzW0lkcy5JRF9QUk9EXSA9IDg3MTk7Ci0JCXZhbHVlc1tJZHMuSURfUFJPUF0gPSA4NzMzOwotCQl2YWx1ZXNbSWRzLklEX1BTSV9MXSA9IDk2ODsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfVV0gPSA5MzY7Ci0JCXZhbHVlc1tJZHMuSURfUVVPVF0gPSAzNDsKLQkJdmFsdWVzW0lkcy5JRF9SQURJQ10gPSA4NzMwOwotCQl2YWx1ZXNbSWRzLklEX1JBTkddID0gOTAwMjsKLQkJdmFsdWVzW0lkcy5JRF9SQVFVT10gPSAxODc7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9MXSA9IDg1OTQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFSUl9VXSA9IDg2NTg7Ci0JCXZhbHVlc1tJZHMuSURfUkNFSUxdID0gODk2OTsKLQkJdmFsdWVzW0lkcy5JRF9SRFFVT10gPSA4MjIxOwotCQl2YWx1ZXNbSWRzLklEX1JFQUxdID0gODQ3NjsKLQkJdmFsdWVzW0lkcy5JRF9SRUddID0gMTc0OwotCQl2YWx1ZXNbSWRzLklEX1JGTE9PUl0gPSA4OTcxOwotCQl2YWx1ZXNbSWRzLklEX1JIT19MXSA9IDk2MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fVV0gPSA5Mjk7Ci0JCXZhbHVlc1tJZHMuSURfUkxNXSA9IDgyMDc7Ci0JCXZhbHVlc1tJZHMuSURfUlNBUVVPXSA9IDgyNTA7Ci0JCXZhbHVlc1tJZHMuSURfUlNRVU9dID0gODIxNzsKLQkJdmFsdWVzW0lkcy5JRF9TQlFVT10gPSA4MjE4OwotCQl2YWx1ZXNbSWRzLklEX1NDQVJPTl9MXSA9IDM1MzsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fVV0gPSAzNTI7Ci0JCXZhbHVlc1tJZHMuSURfU0RPVF0gPSA4OTAxOwotCQl2YWx1ZXNbSWRzLklEX1NFQ1RdID0gMTY3OwotCQl2YWx1ZXNbSWRzLklEX1NIWV0gPSAxNzM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFGXSA9IDk2MjsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9MXSA9IDk2MzsKLQkJdmFsdWVzW0lkcy5JRF9TSUdNQV9VXSA9IDkzMTsKLQkJdmFsdWVzW0lkcy5JRF9TSU1dID0gODc2NDsKLQkJdmFsdWVzW0lkcy5JRF9TUEFERVNdID0gOTgyNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJdID0gODgzNDsKLQkJdmFsdWVzW0lkcy5JRF9TVUJFXSA9IDg4Mzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VNXSA9IDg3MjE7Ci0JCXZhbHVlc1tJZHMuSURfU1VQXSA9IDg4MzU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMV0gPSAxODU7Ci0JCXZhbHVlc1tJZHMuSURfU1VQMl0gPSAxNzg7Ci0JCXZhbHVlc1tJZHMuSURfU1VQM10gPSAxNzk7Ci0JCXZhbHVlc1tJZHMuSURfU1VQRV0gPSA4ODM5OwotCQl2YWx1ZXNbSWRzLklEX1NaTElHXSA9IDIyMzsKLQkJdmFsdWVzW0lkcy5JRF9UQVVfTF0gPSA5NjQ7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX1VdID0gOTMyOwotCQl2YWx1ZXNbSWRzLklEX1RIRVJFNF0gPSA4NzU2OwotCQl2YWx1ZXNbSWRzLklEX1RIRVRBU1lNXSA9IDk3NzsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9MXSA9IDk1MjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQV9VXSA9IDkyMDsKLQkJdmFsdWVzW0lkcy5JRF9USElOU1BdID0gODIwMTsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9MXSA9IDI1NDsKLQkJdmFsdWVzW0lkcy5JRF9USE9STl9VXSA9IDIyMjsKLQkJdmFsdWVzW0lkcy5JRF9USUxERV0gPSA3MzI7Ci0JCXZhbHVlc1tJZHMuSURfVElNRVNdID0gMjE1OwotCQl2YWx1ZXNbSWRzLklEX1RSQURFXSA9IDg0ODI7Ci0JCXZhbHVlc1tJZHMuSURfVUFDVVRFX0xdID0gMjUwOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9VXSA9IDIxODsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX0xdID0gODU5MzsKLQkJdmFsdWVzW0lkcy5JRF9VQVJSX1VdID0gODY1NzsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19MXSA9IDI1MTsKLQkJdmFsdWVzW0lkcy5JRF9VQ0lSQ19VXSA9IDIxOTsKLQkJdmFsdWVzW0lkcy5JRF9VR1JBVkVfTF0gPSAyNDk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX1VdID0gMjE3OwotCQl2YWx1ZXNbSWRzLklEX1VNTF0gPSAxNjg7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUhdID0gOTc4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fTF0gPSA5NjU7Ci0JCXZhbHVlc1tJZHMuSURfVVBTSUxPTl9VXSA9IDkzMzsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX0xdID0gMjUyOwotCQl2YWx1ZXNbSWRzLklEX1VVTUxfVV0gPSAyMjA7Ci0JCXZhbHVlc1tJZHMuSURfV0VJRVJQXSA9IDg0NzI7Ci0JCXZhbHVlc1tJZHMuSURfWElfTF0gPSA5NTg7Ci0JCXZhbHVlc1tJZHMuSURfWElfVV0gPSA5MjY7Ci0JCXZhbHVlc1tJZHMuSURfWUFDVVRFX0xdID0gMjUzOwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9VXSA9IDIyMTsKLQkJdmFsdWVzW0lkcy5JRF9ZRU5dID0gMTY1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfTF0gPSAyNTU7Ci0JCXZhbHVlc1tJZHMuSURfWVVNTF9VXSA9IDM3NjsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX0xdID0gOTUwOwotCQl2YWx1ZXNbSWRzLklEX1pFVEFfVV0gPSA5MTg7Ci0JCXZhbHVlc1tJZHMuSURfWldKXSA9IDgyMDU7Ci0JCXZhbHVlc1tJZHMuSURfWldOSl0gPSA4MjA0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbnRpdHlDb2xsZWN0aW9uKCkgewotCQlzdXBlcihuYW1lcywgU1RSSUNUX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBlbnRpdHkgZGVjbGFyYXRpb24uCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBhdHRyTmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBjcmVhdGUoU3RyaW5nIGVudGl0eU5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQoZW50aXR5TmFtZSk7Ci0JCWlmIChpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHZhbHVlID0gU3RyaW5nLnZhbHVlT2YodmFsdWVzW2lkXSk7Ci0JCUhUTUxFbnRpdHlEZWNsSW1wbCBkZWMgPSBuZXcgSFRNTEVudGl0eURlY2xJbXBsKGVudGl0eU5hbWUsIHZhbHVlKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hDTURvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSENNRG9jSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWVmNWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSENNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIEhUTUwuCi0gKi8KLWNsYXNzIEhDTURvY0ltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTENNRG9jdW1lbnQgewotCi0JLyoqIE5hbWVzcGFjZSBmb3IgYWxsIG5hbWVzIG9mIGVsZW1lbnRzLCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcy4gKi8KLQlwcml2YXRlIENNTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudHMgPSBudWxsOwotCXByaXZhdGUgRW50aXR5Q29sbGVjdGlvbiBlbnRpdGllcyA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZUltcGwgdGFyZ2V0TmFtZXNwYWNlKSB7Ci0JCXN1cGVyKGRvY1R5cGVOYW1lKTsKLQkJbmFtZXNwYWNlID0gdGFyZ2V0TmFtZXNwYWNlOwotCQlhdHRyaWJ1dGVzID0gbmV3IEF0dHJpYnV0ZUNvbGxlY3Rpb24oKTsKLQkJZWxlbWVudHMgPSBuZXcgRWxlbWVudENvbGxlY3Rpb24oYXR0cmlidXRlcyk7Ci0JCWVudGl0aWVzID0gbmV3IEVudGl0eUNvbGxlY3Rpb24oKTsKLQl9Ci0KLQlBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCXB1YmxpYyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpIHsKLQkJaWYgKGVsZW1lbnRzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChIVE1MRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50cy5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKSB7Ci0JCXJldHVybiBlbnRpdGllczsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWlmIChlbnRpdGllcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVudGl0eURlY2xhcmF0aW9uKSBlbnRpdGllcy5nZXROYW1lZEl0ZW0oZW50aXR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgQ01Ob2RlCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5ET0NVTUVOVDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQXR0ckRlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyRGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAzYjJlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyRGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIGNsYXNzIG9mIHtAbGluayA8Y29kZT5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb248L2NvZGU+fSBpbnRlcmZhY2UuPGJyPgotICovCi1jbGFzcyBIVE1MQXR0ckRlY2xJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIEhUTUxDTURhdGFUeXBlSW1wbCB0eXBlID0gbnVsbDsKLQlwcml2YXRlIGludCB1c2FnZSA9IDA7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTEF0dHJEZWNsSW1wbChTdHJpbmcgYXR0ck5hbWUsIEhUTUxDTURhdGFUeXBlSW1wbCB2YWx1ZVR5cGUsIGludCB2YWx1ZVVzYWdlKSB7Ci0JCXN1cGVyKGF0dHJOYW1lKTsKLQkJdGhpcy50eXBlID0gdmFsdWVUeXBlOwotCi0JCXN3aXRjaCAodmFsdWVVc2FnZSkgewotCQkJY2FzZSBPUFRJT05BTCA6Ci0JCQljYXNlIFJFUVVJUkVEIDoKLQkJCWNhc2UgRklYRUQgOgotCQkJY2FzZSBQUk9ISUJJVEVEIDoKLQkJCQl0aGlzLnVzYWdlID0gdmFsdWVVc2FnZTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCB3YXJuLi4uCi0JCQkJdGhpcy51c2FnZSA9IE9QVElPTkFMOyAvLyBmYWxsIGJhY2sKLQkJCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldEF0dHJOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJUeXBlIG1ldGhvZAotCSAqIEByZXR1cm4gQ01EYXRhVHlwZQotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldEF0dHJUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBieSBzdXBlcmludGVyZmFjZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlpZiAodHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgYnkgc3VwZXJpbnRlcmZhY2UKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKSB7Ci0JCVZlY3RvciB2ID0gbmV3IFZlY3RvcihBcnJheXMuYXNMaXN0KHR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpKSk7Ci0JCXJldHVybiB2LmVsZW1lbnRzKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIEdST1VQLCBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQlyZXR1cm4gdXNhZ2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NDUklQVEFCTEUpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TQ1JJUFRBQkxFKSkgewotCQkJcmV0dXJuIGdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCkgPT0gSFRNTENNRGF0YVR5cGUuU0NSSVBUID8gbmV3IEJvb2xlYW4odHJ1ZSkgOiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmZmNmY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBiZSBhIHB1YmxpYyBpbnRlcmZhY2Ugd2hpY2ggaGFzCi0gKiBpbnRlcmZhY2VzIGRlZmluZWQgaW4gYm90aCBvZiB7QGxpbmsgPGNvZGU+Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbjwvY29kZT59Ci0gKiBhbmQge0BsaW5rIDxjb2RlPkhUTUxDTU5vZGU8L2NvZGU+fS48YnI+Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGV4dGVuZHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0MzYxZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01EYXRhVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogSFRNTCBleHRlbnNpb24gZm9yIGRhdGEgdHlwZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNRGF0YVR5cGUgZXh0ZW5kcyBDTURhdGFUeXBlIHsKLQotCS8qKiBCb29sZWFuOyBpdCBzaG91bGQgYmUgZGVmaW5lZCBpbiBDTURhdGFUeXBlLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPT0xFQU4gPSAiQk9PTEVBTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUiA9ICJDT0xPUiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVCA9ICJFVkVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRFJFRlMgPSAiSURSRUZTIjsgLy8kTk9OLU5MUy0xJAotCS8qKiBOYW1lOyBpdCBzaG91bGQgYmUgZGVmaW5lZCBpbiBDTURhdGFUeXBlLiAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBGb2xsb3dpbmcgdHlwZXMgYXJlIGp1c3QgYWxpYXNlcy4KLQkvKiogJUNoYXJhY3RlcjsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSQUNURVIgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlQ2hhcnNldDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDSEFSU0VUID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNoYXJzZXRzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENIQVJTRVRTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUNvbnRlbnRUeXBlOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfVFlQRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVDb29yZHM7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09PUkRTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJURhdGV0aW1lOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERBVEVUSU1FID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJUZyYW1lVGFyZ2V0OyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZSQU1FX1RBUkdFVCA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVMYW5ndWFnZUNvZGU7ID09IE5BTUUgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HVUFHRV9DT0RFID0gTkFNRTsKLQkvKiogJUxlbmd0aDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRU5HVEggPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTGlua1R5cGVzOyA9PSBDREFUQSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJTktfVFlQRVMgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlTElTdHlsZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMSV9TVFlMRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVNZWRpYURlc2M7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVESUFfREVTQyA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVNdWx0aUxlbmd0aDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9MRU5HVEggPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlT0xTdHlsZTsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTF9TVFlMRSA9IENNRGF0YVR5cGUuQ0RBVEE7Ci0JLyoqICVQaXhsZXM7ID09IENEQVRBICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElYRUxTID0gQ01EYXRhVHlwZS5DREFUQTsKLQkvKiogJVNjcmlwdDsgPT0gRVZFTlQgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFQgPSBFVkVOVDsKLQkvKiogJVN0eWxlU2hlZXQ7ID09IEVWRU5UICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RZTEVfU0hFRVQgPSBDTURhdGFUeXBlLkNEQVRBOwotCS8qKiAlVGV4dDsgPT0gQ0RBVEEgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUID0gQ01EYXRhVHlwZS5DREFUQTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU2ZTY4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURhdGFUeXBlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLS8qKgotICovCi1jbGFzcyBIVE1MQ01EYXRhVHlwZUltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTENNRGF0YVR5cGUgewotCi0JcHJpdmF0ZSBpbnQgaW1wbGllZFZhbHVlS2luZCA9IElNUExJRURfVkFMVUVfTk9ORTsKLQlwcml2YXRlIFN0cmluZyBpbXBsaWVkVmFsdWUgPSBudWxsOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGVtcHR5QXJyYXkgPSBuZXcgU3RyaW5nWzBdOwotCXByaXZhdGUgU3RyaW5nW10gZW51bVZhbHVlcyA9IGVtcHR5QXJyYXk7Ci0JcHJpdmF0ZSBTdHJpbmcgaW5zdGFuY2VWYWx1ZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBIVE1MQ01EYXRhVHlwZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbm0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQ01EYXRhVHlwZUltcGwoU3RyaW5nIHR5cGVOYW1lKSB7Ci0JCXN1cGVyKHR5cGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MQ01EYXRhVHlwZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gbm0gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQ01EYXRhVHlwZUltcGwoU3RyaW5nIHR5cGVOYW1lLCBTdHJpbmcgaW5zdGFuY2VWYWx1ZSkgewotCQlzdXBlcih0eXBlTmFtZSk7Ci0JCXRoaXMuaW5zdGFuY2VWYWx1ZSA9IGluc3RhbmNlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICoKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgc3VpdGFibGUgZGVmYXVsdCB2YWx1ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIGRhdGEgdHlwZSBpcyBjcmVhdGVkLgotCSAqIFRoaXMgcmV0dXJucyBudWxsIG9mIGEgc3VpdGFibGUgZGVmYXVsdCBpcyBub3QgYXZhaWxhYmxlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkgewotCQlyZXR1cm4gaW5zdGFuY2VWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotCSAqCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldEVudW1lcmF0ZWRWYWx1ZXMoKSB7Ci0JCXJldHVybiBlbnVtVmFsdWVzOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyAgCi0JICoKLQkgKiBSZXR1cm5zIHRoZSBpbXBsaWVkIHZhbHVlIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKSB7Ci0JCXJldHVybiBpbXBsaWVkVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0SW1wbGllZFZhbHVlS2luZCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCwgSU1QTElFRF9WQUxVRV9ERUZBVUxULgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpIHsKLQkJcmV0dXJuIGltcGxpZWRWYWx1ZUtpbmQ7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuREFUQV9UWVBFOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RW51bVZhbHVlcyhTdHJpbmdbXSB2YWx1ZXMpIHsKLQkJZW51bVZhbHVlcyA9IG5ldyBTdHJpbmdbdmFsdWVzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQllbnVtVmFsdWVzW2ldID0gdmFsdWVzW2ldOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcGFja2FnZSBzY29wZS4KLQkgKi8KLQl2b2lkIHNldEltcGxpZWRWYWx1ZShpbnQga2luZCwgU3RyaW5nIHZhbHVlKSB7Ci0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJTVBMSUVEX1ZBTFVFX0ZJWEVEIDoKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9ERUZBVUxUIDoKLQkJCQlpbXBsaWVkVmFsdWVLaW5kID0ga2luZDsKLQkJCQlpbXBsaWVkVmFsdWUgPSB2YWx1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9OT05FIDoKLQkJCWRlZmF1bHQgOgotCQkJCWltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JCQkJaW1wbGllZFZhbHVlID0gbnVsbDsgLy8gbWF5YmUgYSBudWxsIHN0cmluZz8KLQkJCQlicmVhazsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZjVmYTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLQotCi0KLS8qKgotICogSFRNTCBleHRlbnNpb24gZm9yIENNRG9jdW1lbnQuCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBzb21lIHNob3J0IGhhbmQgbWV0aG9kcyB0byBnZXQgZGVjbGFyYXRpb25zCi0gKiBieSBhIG5hbWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTENNRG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50IHsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgYSBIVE1MIGVsZW1lbnQuPGJyPgotCSAqIEBwYXJhbSBlbGVtZW50TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKTsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGEgZW50aXR5IGRlY2xhcmF0aW9uIG9mIEhUTUwgZG9jdW1lbnRzLjxicj4KLQkgKiBAcGFyYW0gZW50aXR5TmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Eb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlOTAxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTURvY3VtZW50RmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWwuQ0hDTURvY0ltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqIElOb2RlQWRhcHRlciBmYWN0b3J5IGZvciBIVE1MIGFuZCBKU1AgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSFRNTENNRG9jdW1lbnRGYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBjbWRvY3MgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlzdGF0aWMgewotCQlDTU5hbWVzcGFjZUltcGwgaDQwbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEhUTUw0ME5hbWVzcGFjZS5IVE1MNDBfVVJJLCBIVE1MNDBOYW1lc3BhY2UuSFRNTDQwX1RBR19QUkVGSVgpOwotCQlDTU5hbWVzcGFjZUltcGwgajExbnMgPSBuZXcgQ01OYW1lc3BhY2VJbXBsKEpTUDExTmFtZXNwYWNlLkpTUDExX1VSSSwgSlNQMTFOYW1lc3BhY2UuSlNQX1RBR19QUkVGSVgpOwotCi0JCUhDTURvY0ltcGwgaHRtbDQwZG9jID0gbmV3IEhDTURvY0ltcGwoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUsIGg0MG5zKTsKLQkJQ0hDTURvY0ltcGwgY2h0bWxkb2MgPSBuZXcgQ0hDTURvY0ltcGwoQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFLCBoNDBucyk7Ci0JCUpDTURvY0ltcGwganNwMTFkb2MgPSBuZXcgSkNNRG9jSW1wbChDTURvY1R5cGUuSlNQMTFfRE9DX1RZUEUsIGoxMW5zKTsKLQotCQljbWRvY3MucHV0KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFLCBodG1sNDBkb2MpOwotCQljbWRvY3MucHV0KENNRG9jVHlwZS5DSFRNTF9ET0NfVFlQRSwgY2h0bWxkb2MpOwotCQljbWRvY3MucHV0KENNRG9jVHlwZS5KU1AxMV9ET0NfVFlQRSwganNwMTFkb2MpOwotCX0KLQotCS8qKgotCSAqIEhUTUxDTUFkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yLgotCSAqLwotCXByaXZhdGUgSFRNTENNRG9jdW1lbnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICogQHBhcmFtIGNtdHlwZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIGNtdHlwZSkgewotCQlPYmplY3Qgb2JqID0gY21kb2NzLmdldChjbXR5cGUpOwotCQlpZiAob2JqID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKENNRG9jdW1lbnQpIG9iajsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODUzODczMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxDTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotLyoqCi0gKiBJbiBIVE1MIERvY3VtZW50cywgbmFtZSBhbmQgdmFsdWUgb2YgYW4gYXR0cmlidXRlL2VsZW1lbnQvZW50aXR5Ci0gKiBzaG91bGQgYmUgdHJlYXRlZCBpZ25vcmluZyB0aGVpcnMgY2FzZS4gIEhvd2V2ZXIsIGluIFhNTCBkb2N1bWVudHMsCi0gKiB0aGV5IHNob3VsZCBiZSBkaXN0aW5ndWlzaGVkIHdpdGggc2Vuc2l0aXZlbmVzcyBvZiB0aGVpciBjYXNlLgotICogQ01Ob2RlIGlzIGJhc2ljYWxseSBkZXNpZ25lZCB0byByZXByZXNlbnQgRFREcyBvciBTY2hlbWFzIGZvciBYTUwKLSAqIGRvY3VtZW50cy4gIFNvLCBpdCBkb2Vzbid0IGhhdmUgaW50ZXJmYWNlcyB0byByZXRyaWV2ZSBzdWNoIGluZm9ybWF0aW9uLgotICogSG93ZXZlciwgZGVjbGFyYXRpb25zIGluIHRoZSBIVE1MIENNIHNob3VsZCBwcm92aWRlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBUaGlzIGludGVybWVkaWF0ZSBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSB3aGV0aGVyIGlnbm9yZSBjYXNlcwotICogb3Igbm90Ljxicj4KLSAqLwotaW50ZXJmYWNlIEhUTUxDTU5vZGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCBpZiBkZWNsYXJhdGlvbiBpcyBmb3IgSFRNTCBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkuCi0JICogT3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZElnbm9yZUNhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTNjN2Q4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIEhlZD8/Pz8gY2xhc3Nlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSFRNTEVsZW1EZWNsSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uLCBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0KLQkvLyBEVEQKLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkvKiogTmV2ZXIgYWNjZXNzIHRoaXMgZmllbGQgZGlyZWN0bHkuICBJbnN0ZWFkLCB1c2UgZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uIG1ldGhvZC4gKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGluY2x1c2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGV4Y2x1c2lvbiA9IG51bGw7Ci0JLy8gYWR2YW5jZWQgaW5mb3JtYXRpb24KLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZEFuY2VzdG9ycyA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBjb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IGZvcm1hdFR5cGUgPSBGT1JNQVRfSFRNTDsKLQlwcm90ZWN0ZWQgaW50IGxheW91dFR5cGUgPSBMQVlPVVRfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IG9taXRUeXBlID0gT01JVF9OT05FOwotCXByb3RlY3RlZCBib29sZWFuIGtlZXBTcGFjZXMgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBDTU5hbWVkTm9kZU1hcCBFTVBUWV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXAoKSB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSFRNTEVsZW1EZWNsSW1wbCBjb25zdHJ1Y3Rvci4KLQkgKiBJbiB0aGUgSFRNTCBEVEQsIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaGFzIG5vIHNwZWNpZmljYXRpb24KLQkgKiBmb3IgaXRzIG9jY3VycmVuY2UuICBPY2N1cnJlbmNlIGlzIHNwZWNpZmVkIGluIGNvbnRlbnQgbW9kZWwsIGxpa2UKLQkgKiA8Y29kZT4oTEkpKzwvY29kZT4uICBUbyBhdm9pZCBjb25mdXNpb24gKGFuZCBjb21wbGV4aXR5KSwKLQkgKiBvY2N1cnJlbmNlIG9mIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgYWx3YXlzIDEgKGl0IG1lYW5zLCBtaW4gPSAxIGFuZAotCSAqIG1heCA9IDEpLiAgSW5zdGVhZCwgb2NjdXJyZW5jZSBvZiBDTUdyb3VwIHJlcHJlc2VudHMgYWN0dWFsIG9jY3VycmVuY2UKLQkgKiBvZiB0aGUgY29udGVudC4KLQkgKiA8YnI+Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MRWxlbURlY2xJbXBsKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgMSwgMSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb24uZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFkpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsIGVycm9yLgotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBmYWN0b3J5LmNyZWF0ZVR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uTmFtZSwgZWxlbWVudENvbGxlY3Rpb24pOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZQotCQl9Ci0KLQkJQ01Ob2RlIGNtbm9kZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb24gPT0gbnVsbCkKLQkJCXR5cGVEZWZpbml0aW9uID0gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiB0eXBlRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJuIG51bGwuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyB0cmllcyB0byBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotCSAqIGluc3RhbmNlIGFuZCBhY2Nlc3MgdG8gaXQuCi0JICogPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnRUeXBlKCkgOiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29ycmVjdGlvblR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29ycmVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogSFRNTCBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YSB0eXBlLiAgU28sIHRoaXMgbWV0aG9kIGFsd2F5cwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBleGNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgZXhjbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBmb3JtYXQgdHlwZSBpcyA8Y29kZT5GT1JNQVRfSFRNTDwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIGZvcm1hdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5jbHVzaW9uLgotCSAqIEFsbW9zdCBlbGVtZW50cyBkb24ndCBoYXZlIGEgaW5jbHVzaW9uLgotCSAqIE9ubHkgY2xhc3NlcyB0aG9zZSBoYXZlIGluY2x1c2lvbiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRJbmNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGF5b3V0VHlwZSgpIHsKLQkJcmV0dXJuIGxheW91dFR5cGU7Ci0JfQotCi0JLyoqCi0JICogTGluZSBicmVhayBoaW50IGlzIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbGF5b3V0IHR5cGUuCi0JICogSW5kZWVkLCBpbiB0aGUgQysrRE9NLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gbGF5b3V0IHR5cGUgb25seS4KLQkgKiBTbywgdGhpcyBpbXBsZW1lbnRhdGlvbiwgYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBkZWNsYXJhdGlvbnMsCi0JICogYWxzbyBkZXRlcm1pbmVzIGZyb20gbGF5b3V0IHR5cGUgb25seS48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVCcmVha0hpbnQoKSB7Ci0JCXN3aXRjaCAoZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JMT0NLIDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORDsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vIEhUTUwgZWxlbWVudCBoYXMgbG9jYWwgZWxlbWVudHMuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyBhbiBlbXB0eSBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9taXRUeXBlKCkgewotCQlyZXR1cm4gb21pdFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHBwID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHBwLnN1cHBvcnRzKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldFByaW1hcnlDYW5kaWRhdGUoKSA6IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHBwLmdldCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBlbGVtZW50IG5hbWVzIHdoaWNoIHRlcm1pbmF0ZXMgdGhpcyBlbGVtZW50Ljxicj4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRydWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhIEpTUCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW4gc29tZSBlbGVtZW50cywgc3VjaCBhcyBBUFBMRVQsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgaW5kZW50IGNoaWxkCi0JICogZWxlbWVudHMgdGhhdCB0aGVpciBwYXJlbnRzLiAgVGhhdCBpcywgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZQotCSAqIHNvdXJjZSAgb2YgQVBQTEVUIGFuZCBQQVJBTVMgbGlrZSB0aGlzOgotCSAqIDxQUkU+Ci0JICogICAmbHQ7QVBQTEVUIC4uLiZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgJmx0Oy9BUFBMRVQmZ3Q7Ci0JICogPFBSRT4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJcmV0dXJuIGluZGVudENoaWxkOwotCX0KLQotCS8qKgotCSAqIE1vc3Qgb2YgZWxlbWVudHMgY2FuIGNvbXBhY3Qgc3BhY2VzIGluIHRoZWlyIGNoaWxkIHRleHQgbm9kZXMuCi0JICogU29tZSBzcGVjaWFsIGVsZW1lbnRzIHNob3VsZCBrZWVwIHRoZW0gaW4gdGhlaXIgc291cmNlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKSB7Ci0JCXJldHVybiBrZWVwU3BhY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gbmV4dEVsZW1lbnQpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFRlcm1pbmF0b3JzKCk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuZXh0TmFtZSA9IG5leHRFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKG5leHROYW1lLmVxdWFscyhpLm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmU3MWYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIGludGVyZmFjZSB3aGljaCBoYXMKLSAqIGludGVyZmFjZXMgZGVmaW5lZCBpbiBib3RoIG9mIHtAbGluayA8Y29kZT5DTUVsZW1lbnREZWNsYXJhdGlvbjwvY29kZT59Ci0gKiBhbmQge0BsaW5rIDxjb2RlPkhUTUxDTU5vZGU8L2NvZGU+fS48YnI+Ci0gKiBJbiBhZGRpdGlvbiB0byB0aGlzLCBzb21lIGludGVyZmFjZXMgYXJlIGFkZGVkIHRvIHRoaXMgaW50ZXJmYWNlLAotICogdGhvc2UgYXJlIHNwZWNpYWxseSB0byBIVE1MIGVsZW1lbnRzLjxicj4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGV4dGVuZHMgQ01FbGVtZW50RGVjbGFyYXRpb24gewotCi0JLyoqIFRhZyBvbW1pc3Npb247IE5vdCBvbW1pc2libGUuICovCi0JaW50IE9NSVRfTk9ORSA9IDA7Ci0JLyoqIFRhZyBvbW1pc3Npb247IEJvdGggdGFncyBhcmUgb21taXNpYmxlLiAqLwotCWludCBPTUlUX0JPVEggPSAxOwotCS8qKiBUYWcgb21taXNzaW9uOyBUaGUgZW5kIHRhZyBpcyBvbW1pc2libGUuICovCi0JaW50IE9NSVRfRU5EID0gMjsKLQkvKiogVGFnIG9tbWlzc2lvbjsgVGhlIGVuZCB0YWcgaXMgb21taXR0ZWQgd2hlbiBjcmVhdGVkLiAqLwotCWludCBPTUlUX0VORF9ERUZBVUxUID0gMzsKLQkvKiogVGFnIG9tbWlzc2lvbjsgVGhlIGVuZCB0YWcgbXVzdCBiZSBvbWl0dGVkLiAqLwotCWludCBPTUlUX0VORF9NVVNUID0gNDsKLQkvKiogTGluZSBCcmVhazsgTm8gYnJlYWsuICovCi0JaW50IEJSRUFLX05PTkUgPSAxMDsKLQkvKiogTGluZSBCcmVhazsgQnJlYWsgYWZ0ZXIgdGhlIHN0YXJ0IHRhZy4gKi8KLQlpbnQgQlJFQUtfQUZURVJfU1RBUlQgPSAxMTsKLQkvKiogTGluZSBCcmVhazsgQnJlYWsgYm90aCBiZWZvcmUgdGhlIHN0YXJ0IHRhZ24gYW5kIGFmdGVyIHRoZSBlbmQgdGFnLiAqLwotCWludCBCUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCA9IDEyOwotCS8qIExheW91dCAqLwotCS8qKiBpbml0aWFsIHZhbHVlOyB0aGUgdmFsdWUgc2hvdWxkIG5ldmVyIHJldHVybnMgdG8gY2xpZW50IHByb2dyYW1zLiAqLwotCWludCBMQVlPVVRfTk9ORSA9IDEwMDsKLQlpbnQgTEFZT1VUX0JMT0NLID0gMTAxOwotCWludCBMQVlPVVRfV1JBUCA9IDEwMjsKLQkvKiogTm8gd3JhcCBvYmplY3Q7IGxpa2UgSU1HLCBBUFBMRVQsLi4uICovCi0JaW50IExBWU9VVF9PQkpFQ1QgPSAxMDM7Ci0JLyoqIEJSICovCi0JaW50IExBWU9VVF9CUkVBSyA9IDEwNDsKLQkvKiogSGlkZGVuIG9iamVjdDsgbGlrZSBIVE1MIG9yIEhFQUQgKi8KLQlpbnQgTEFZT1VUX0hJRERFTiA9IDEwNTsKLQkvKiBDb3JyZWN0aW9uICovCi0JLyoqIENvcnJlY3Q7IE5vIGNvcnJlY3QuICovCi0JaW50IENPUlJFQ1RfTk9ORSA9IDEwMDA7Ci0JLyoqIENvcnJlY3Q7IE1lYW5pbmdsZXNzIHdoZW4gdGhlIGNvbnRlbnQgaXMgZW1wdHkuICovCi0JaW50IENPUlJFQ1RfRU1QVFkgPSAxMDAxOwotCS8qKiBDb3JyZWN0OyBNZWFuaW5nbGVzcyB3aGVuIG5vIGF0dHJpYnV0IGlzIHNldC4gKi8KLQlpbnQgQ09SUkVDVF9ORVVUUkFMID0gMTAwMjsKLQkvKiogQ29ycmVjdDsgTWVhbmluZ2xlc3Mgd2hlbiBzYW1lIGVsZW1lbnQgaXMgbmVzdGVkLiAqLwotCWludCBDT1JSRUNUX0RVUExJQ0FURUQgPSAxMDAzOwotCS8qKiBGb3JtYXQ7IEhUTUwgKi8KLQlpbnQgRk9STUFUX0hUTUwgPSAxMDAwMDsKLQkvKiogRm9ybWF0OyBTU0kgKi8KLQlpbnQgRk9STUFUX1NTSSA9IDEwMDAxOwotCS8qKiBGb3JtYXQ7IEpTUCBzY3JpcHQgKi8KLQlpbnQgRk9STUFUX0pTUF9TQ1JJUFQgPSAxMDAwMjsKLQkvKiogRm9ybWF0OyBKU1AgZGlyZWN0aXZlICovCi0JaW50IEZPUk1BVF9KU1BfRElSRUNUSVZFID0gMTAwMDM7Ci0JLyoqIEZvcm1hdDsgWE1MICovCi0JaW50IEZPUk1BVF9YTUwgPSAxMDAwNDsKLQkvKiogRm9ybWF0OyBNVyAqLwotCWludCBGT1JNQVRfTVcgPSAxMDAwNTsKLQotCS8qKgotCSAqIEEgc2hvcnQgaGFuZCBtZXRob2QgdG8gZ2V0IGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiBvZiBhIEhUTUwgZWxlbWVudC4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzc2NDdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIEhUTUxFbnRpdHlEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MRW50aXR5RGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCS8qKgotCSAqIENNRW50aXR5RGVjbEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gZW50aXR5TmFtZSBqYXZhLmxhbmcuU3RyaW5nOyBFbnRpdHkgbmFtZS4KLQkgKiBAcGFyYW0gZW50aXR5VmFsdWUgamF2YS5sYW5nLlN0cmluZzsgVmFsdWUgc3RyaW5nLgotCSAqLwotCXB1YmxpYyBIVE1MRW50aXR5RGVjbEltcGwoU3RyaW5nIGVudGl0eU5hbWUsIFN0cmluZyBlbnRpdHlWYWx1ZSkgewotCQlzdXBlcihlbnRpdHlOYW1lKTsKLQkJdmFsdWUgPSBlbnRpdHlWYWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IENNTm9kZSB0eXBlLjxicj4KLQkgKiBAcmV0dXJuIGludDsgQWx3YXlzIHJldHVybiBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5FTlRJVFlfREVDTEFSQVRJT047Ci0JfQotCi0JLyoqCi0JICogZ2V0VmFsdWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEVudGl0aWVzIGluIEhUTUwgZG9jdW1lbnRzIGFyZSBhbHdheXMgdHJlYXRlZCB3aXRoIGlnbm9yaW5nIGNhc2VzLgotCSAqIEJlY2F1c2Ugbm8gc3BlY2lhbCBlbnRpdGllcyBhcmUgZGVmaW5lZCBpbiBKU1AgMS4wLCB0aGlzIG1ldGhvZAotCSAqIGNhbiBhbHdheXMgcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+Ljxicj4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTEVudGl0eURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NjNlMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MRW50aXR5RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIGludGVuZGVkIHRvIGJlIGEgcHVibGljIGludGVyZmFjZSB3aGljaCBoYXMKLSAqIGludGVyZmFjZXMgZGVmaW5lZCBpbiBib3RoIG9mIHtAbGluayA8Y29kZT5DTUVudGl0eURlY2xhcmF0aW9uPC9jb2RlPn0KLSAqIGFuZCB7QGxpbmsgPGNvZGU+SFRNTENNTm9kZTwvY29kZT59Ljxicj4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MRW50aXR5RGVjbGFyYXRpb24gZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb24gewotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MUHJvcGVydHlEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IVE1MUHJvcGVydHlEZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTUzNTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSFRNTFByb3BlcnR5RGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBjb21tb25seSB1c2VkIGluIGRlY2xhcmF0aW9uIGltcGxlbWVudGF0aW9uLCBhbmQgaW50ZXJuYWwgdXNlLgotICogVXNlIGdldFByb3BlcnR5KCkgbWV0aG9kIGZvciBwdWJsaWMgdXNlLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIHsKLQkvKioKLQkgKiBUbyBkZXRlcm1pbiB0aGUgdHlwZSwgbG9vayB1cCB0aGUgZm9sbG93aW5nIGtleXdvcmRzIGluIEMrK0RPTS9EVERQYXJzZXIuY3BwOgotCSAqIDx1bD4KLQkgKiAgIDxsaT5DT1JSRUNUX0RVUExJQ0FURUQgLSA8Y29kZT5HUk9VUF9OT0RVUDwvY29kZT48L2xpPgotCSAqICAgPGxpPkNPUlJFQ1RfRU1QVFkgLSA8Y29kZT5HUk9VUF9DT01QQUNUPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+Q09SUkVDVF9ORVVUUkFMIC0gPGNvZGU+R1JPVVBfTkVVVFJBTDwvY29kZT48L2xpPgotCSAqICAgPGxpPkNPUlJFQ1RfTk9ORSAtIDxjb2RlPihOL0EpPC9jb2RlPjwvbGk+Ci0JICogPC91bD4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRDb3JyZWN0aW9uVHlwZSgpOwotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBkZWNsYXJhdGlvbnMgdGhvc2Ugc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW4gdGhlIHR5cGUsIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzIGluIHRoZSBDKytET006Ci0JICogICBFbGVtZW50VHlwZS5jcHAgLSBFbGVtZW50VHlwZSNzZXRHcm91cCgpLgotCSAqICAgRWxlbWVudC5jcHAgLSBFbGVtZW50I2dldFN0YXJ0VGFnKCkuCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0Rm9ybWF0VHlwZSgpOwotCS8qKgotCSAqIEdldCB0aGUgbGlzdCBvZiBkZWNsYXJhdGlvbnMgdGhvc2Ugc2hvdWxkIGJlIGluY2x1ZGVkIGludG8gdGhlIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlDTUNvbnRlbnQgZ2V0SW5jbHVzaW9uKCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW4gdGhlIHR5cGUsIGxvb2sgdXAgdGhlIGZvbGxvd2luZyBrZXl3b3JkcyBpbiBDKytET00vRFREUGFyc2VyLmNwcDoKLQkgKiA8dWw+Ci0JICogICA8bGk+TEFZT1VUX0JMT0NLIC0gPGNvZGU+R1JPVVBfQkxPQ0s8L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfQlJFQUsgLSA8Y29kZT5HUk9VUF9CUkVBSzwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9ISURERU4gLSA8Y29kZT5HUk9VUF9ISURERU48L2NvZGU+PC9saT4KLQkgKiAgIDxsaT5MQVlPVVRfTk9ORSAtIDxjb2RlPihOL0EpPC9jb2RlPjwvbGk+Ci0JICogICA8bGk+TEFZT1VUX09CSkVDVCAtIDxjb2RlPkdST1VQX05PV1JBUDwvY29kZT48L2xpPgotCSAqICAgPGxpPkxBWU9VVF9XUkFQIC0gPGNvZGU+KE4vQSk8L2NvZGU+PC9saT4KLQkgKiA8L3VsPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldExheW91dFR5cGUoKTsKLQkvKioKLQkgKiBUbyBkZXRlcm1pbmUgdGhlIHR5cGUsIHNlZSA8Y29kZT5FbGVtZW50Ojppc0JyZWFraW5nQmVmb3JlRWxlbWVudCgpPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5FbGVtZW50Ojppc0JyZWFraW5nQWZ0ZXJFbGVtZW50KCk8L2NvZGU+IGRlZmluZWQgaW4gQysrRE9NL0VsZW1lbnQuY3BwLjxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRMaW5lQnJlYWtIaW50KCk7Ci0JLyoqCi0JICogVG8gZGV0ZXJtaW5lIHRoZSB0eXBlLCBDaGVjayB0aGUgSFRNTCBEVEQuCi0JICogQW5kIGxvb2sgdXAgPGNvZGU+R1JPVVBfTk9FTkQ8L2NvZGU+IGluIEMrK0RPTS9EVERQYXJzZXIuY3BwLjxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRPbWl0VHlwZSgpOwotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcAotCSAqLwotCUNNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKTsKLQkvKioKLQkgKiByZXR1cm4gdHJ1ZSB3aGVuIHRoZSBlbGVtZW50IGlzIGEgSlNQIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0pTUCgpOwotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKTsKLQkvKioKLQkgKiBTb21lIGVsZW1lbnRzIHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgY2hpbGQgdGV4dCBub2Rlcy4KLQkgKiBGb3IgZXhhbXBsZSwgUFJFIGFuZCBURVhUQVJFQS4gIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSwKLQkgKiBpZiBhIHRhcmdldCBlbGVtZW50IGlzIG9uZSBvZiBzdWNoIGVsZW1lbnRzLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCWJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlcygpOwotCS8qKgotCSAqIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sIGlmIDxjb2RlPm5leHRFbGVtZW50PC9jb2RlPiB0ZXJtaW5hdGVzCi0JICogdGhlIGN1cnJlbnQgZWxlbWVudC4KLQkgKiBTb21lIGVsZW1lbnRzIGxpa2UgPGNvZGU+UDwvY29kZT4gdGVybWluYXRlcyBvdGhlciA8Y29kZT5QPC9jb2RlPi4KLQkgKiBUaGF0IGlzLCB3aGVuIDxjb2RlPiZsdDtQJmd0OzwvY29kZT4gYXBwZWFycyBhdCB0aGUgbmV4dCB0byA8Y29kZT5QPC9jb2RlPiwKLQkgKiB3aGljaCBlbmQgdGFncyBpcyBvbWl0dGVkLCBpdCByZXByZXNlbnRzIG5vdCBvbmx5IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0JICogbmV3IDxjb2RlPlA8L2NvZGU+IGVsZW1lbnQgYnV0IGFsc28gdGhlIGVuZCBvZiB0aGUgcHJldmlvdXMgPGNvZGU+UDwvY29kZT4uCi0JICovCi0JYm9vbGVhbiBzaG91bGRUZXJtaW5hdGVBdChIVE1MRWxlbWVudERlY2xhcmF0aW9uIG5leHRFbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTQyMWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBBLgotICovCi1maW5hbCBjbGFzcyBIZWRBIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqIChocmVmbGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKGRpcmVjdGtleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoc2hhcGUgJVNoYXBlOyByZWN0KQotCSAqIChjb29yZHMgJUNvb3JkczsgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIQVJTRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRkxBTkcsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFTCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJUkVDVEtFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSEFQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT09SRFMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVJ9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+QTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+QTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGEgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOwotCQlpZiAoYSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGEpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFERFJFU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQUREUkVTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjliNzNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQUREUkVTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEFERFJFU1MuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEFERFJFU1MgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBRERSRVNTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1MsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0FERFJFU1M7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUFBMRVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgyNDRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFQUExFVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBBUFBMRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEFQUExFVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEFQUExFVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUFBMRVQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX1BBUkFNX0NPTlRBSU5FUjsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqIChjb2RlYmFzZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYXJjaGl2ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoY29kZSBDREFUQSAjSU1QTElFRCkKLQkgKiAob2JqZWN0IENEQVRBICNJTVBMSUVEKQotCSAqIChhbHQgJVRleHQ7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI1JFUVVJUkVEKQotCSAqIChoZWlnaHQgJUxlbmd0aDsgI1JFUVVJUkVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkKLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG1heXNjcmlwdCAobWF5c2NyaXB0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPREVCQVNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FSQ0hJVkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09ERSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PQkpFQ1QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFZU0NSSVBUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gJWFsaWduOyAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRBUkVBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFSRUEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY3ZTZjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEFSRUEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQVJFQSBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFSRUEsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfSElEREVOLgotCQkvLyBCZWNhdXNlLCBBUkVBIGlzIEdST1VQX0hJRERFTiBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIEFSRUEuCi0JICogJWF0dHJzOwotCSAqIChzaGFwZSAlU2hhcGU7IHJlY3QpCi0JICogKGNvb3JkcyAlQ29vcmRzOyAjSU1QTElFRCkKLQkgKiAoaHJlZiAlVVJJOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKG5vaHJlZiAobm9ocmVmKSAjSU1QTElFRCkKLQkgKiAoYWx0ICVUZXh0OyAjUkVRVUlSRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0hBUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09PUkRTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkFTRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MTdkYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEJBU0UuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJBU0UgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkFTRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0hJRERFTi4KLQkJLy8gQmVjYXVzZSwgQkFTRSBpcyBHUk9VUF9ISURERU4gaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBCQVNFLgotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqICh0YXJnZXQgJUZyYW1lVGFyZ2V0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCQVNFRk9OVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNjY2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkFTRUZPTlQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLS8qKgotICogQkFTRUZPTlQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJBU0VGT05UIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJBU0VGT05UKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0VGT05ULCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX09CSkVDVCAtIEdST1VQX05PV1JBUC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogQkFTRUZPTlQuCi0JICogKGlkIElEICNJTVBMSUVEKQotCSAqIChzaXplIENEQVRBICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBsb2NhbHkgZGVmaW5lZC4KLQkgKiAoY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZmFjZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRkFDRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIChzaXplIENEQVRBICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBsb2NhbHkgZGVmaW5lZC4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkRPLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJETy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2MyNjA5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkRPLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEJETy4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkRPIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCRE8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkRPLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCX0KLQotCS8qKgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGxhbmcgJUxhbmd1YWdlQ29kZTsgI0lNUExJRUQpCi0JICogKGRpciAobHRyfHJ0bCkgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBTkd9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAgKGRpciAobHRyfHJ0bCkgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTFRSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9SVEx9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVIsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVIsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJHU09VTkQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkdTT1VORC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2IwODgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkdTT1VORC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci0KLQotCi1maW5hbCBjbGFzcyBIZWRCR1NPVU5EIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JcHVibGljIEhlZEJHU09VTkQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkdTT1VORCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIChzcmMsIENEQVRBLCAjSU1QTElFRCkKLQkgKiAobG9vcCwgQ0RBVEEsICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJLy8gc3JjCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQyk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0JCS8vIGxvb3AKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9JTkZJTklURSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPT1AsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9PUCwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQkxPQ0tRVU9URS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1ODdiMjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCTE9DS1FVT1RFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEJMT0NLUVVPVEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJMT0NLUVVPVEUgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRCTE9DS1FVT1RFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJMT0NLUVVPVEUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NJVEV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQk9EWS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCT0RZLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNTI5NjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCT0RZLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIEJPRFkuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJPRFkgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQk9EWShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVib2R5Y29sb3JzOwotCSAqIChvbmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9udW5sb2FkICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChiYWNrZ3JvdW5kICVVUkk7ICNJTVBMSUVEKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKSAuLiBEMjA1NTE0Ci0JICogKHRvcG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uLi4gRDIwNTUxNAotCSAqIChib3R0b21tYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAobGVmdG1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4uLiBEMjA1NTE0Ci0JICogKHJpZ2h0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlYm9keWNvbG9yczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRCb2R5Y29sb3JzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OVU5MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JBQ0tHUk9VTkQsCi0JCS8vIDw8RDIwNTUxNAotCQkJCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTldJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BUkdJTkhFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UT1BNQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9UVE9NTUFSR0lOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xFRlRNQVJHSU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUklHSFRNQVJHSU4KLQkJLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmNsdXNpb24uCi0JICogIkxhenkgZXZhbC4iPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEluY2x1c2lvbigpIHsKLQkJaWYgKGluY2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGluY2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIChJTlN8REVMKQotCQlpbmNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5TLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREVMfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGluY2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBpbmNsdXNpb247Ci0JfQotCi0JLyoqCi0JICogQk9EWSBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NzQ5YTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRCUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBCUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQlIgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQlIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlIsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfQlJFQUsuCi0JCS8vIEJlY2F1c2UsIEJSIGlzIEdST1VQX0JSRUFLIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CUkVBSzsKLQl9Ci0KLQkvKioKLQkgKiBCUi4KLQkgKiAlY29yZWF0dHJzOwotCSAqIChjbGVhciAobGVmdCB8IGFsbCB8IHJpZ2h0IHwgbm9uZSkgbm9uZSkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gY2xlYXIKLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0xFQVIpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEVBUiwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEJVVFRPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTEyZDI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQlVUVE9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBCVVRUT04uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJVVFRPTiBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJVVFRPTihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eS4KLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHR5cGUgKGJ1dHRvbnxzdWJtaXR8cmVzZXQpIHN1Ym1pdCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBQklOREVYLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICh0eXBlIChidXR0b258c3VibWl0fHJlc2V0KSBzdWJtaXQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NVQk1JVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkZPUk08L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPkZPUk08L2NvZGU+IGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBmYXRhbAotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5GSUVMRFNFVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklGUkFNRX07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXRGb3JtY3RybChleGNsdXNpb24pOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ0FQVElPTi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDQVBUSU9OLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2NzA4NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDQVBUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotCi0vKioKLSAqIENBUFRJT04uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENBUFRJT04gZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZENBUFRJT04oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhbGlnbiAlQ0FsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckNhcHRpb24oKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENFTlRFUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDRU5URVIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEwYTg3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENFTlRFUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIENFTlRFUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ0VOVEVSIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQ0VOVEVSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkQ09MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzODFlZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBDT0wuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZENPTCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRDT0woRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0JMT0NLLgotCQkvLyBCZWNhdXNlLCBDT0wgaXMgR1JPVVBfQkxPQ0sgaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqIENPTC4KLQkgKiAlYXR0cnM7Ci0JICogKHNwYW4gTlVNQkVSIDEpCi0JICogKHdpZHRoICVNdWx0aUxlbmd0aDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzcGFuIE5VTUJFUiAxKQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NQQU59OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTVVMVElfTEVOR1RIKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQotCQkvLyAlY2VsbGhhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsaGFsaWduKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbHZhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsdmFsaWduKGF0dHJpYnV0ZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTEdST1VQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZENPTEdST1VQLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjIyOWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRDT0xHUk9VUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLQotLyoqCi0gKiBDT0xHUk9VUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkQ09MR1JPVVAgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5DT0xHUk9VUCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNBUFRJT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEZPT1QsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUn07Ci0KLQlwdWJsaWMgSGVkQ09MR1JPVVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ09MR1JPVVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NPTFVNTl9HUk9VUDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoc3BhbiBOVU1CRVIgMSkKLQkgKiAod2lkdGggJU11bHRpTGVuZ3RoOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogJWNlbGxoYWxpZ247Ci0JICogJWNlbGx2YWxpZ247Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsaGFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGxoYWxpZ24oYXR0cmlidXRlcyk7Ci0JCS8vICVjZWxsdmFsaWduOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENlbGx2YWxpZ24oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUEFOfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHdpZHRoICVNdWx0aUxlbmd0aDsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk1VTFRJX0xFTkdUSCk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRERC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRERC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjAwMjI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIERELgotICovCi1maW5hbCBjbGFzcyBIZWRERCBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEREKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRELCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEREIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRElWLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERJVi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGFhMTlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRElWLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogRElWLgotICovCi1maW5hbCBjbGFzcyBIZWRESVYgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRESVYoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWFsaWduOwotCSAqICVyZXNlcnZlZDsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWFsaWduOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQkJLy8gJXJlc2VydmVkOyAuLi4gZW1wdHkKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2N2VlOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIERMLgotICovCi1maW5hbCBjbGFzcyBIZWRETCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERMKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhcnJheXM7Ci0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTVBBQ1R9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRFQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRFQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FjZTgyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZERULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBEVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRFQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZERUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIERUIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRU1CRUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRU1CRUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU4YTNkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEVNQkVELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEVNQkVELgotICovCi1maW5hbCBjbGFzcyBIZWRFTUJFRCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEVNQkVEKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVNQkVELCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTUJFRDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqICVldmVudHM7Ci0JICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChsb29wIENEQVRBICNJTVBMSUVEKQotCSAqIChoaWRkZW4gQ0RBVEEgI0lNUExJRUQpCi0JICogKHZvbHVtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoYXV0b3N0YXJ0ICh0cnVlfGZhbHNlKSAjSU1QTElFRCkKLQkgKiAoYXV0b3BsYXkgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCSAqIChhdXRvc2l6ZSAodHJ1ZXxmYWxzZSkgI0lNUExJRUQpCi0JICogKGNvbnRyb2xsZXIgKHRydWV8ZmFsc2UpIHRydWUpCi0JICogKHNjYWxlIENEQVRBICNJTVBMSUVEKQotCSAqIChzaG93Y29udHJvbHMgKHRydWV8ZmFsc2UpICNJTVBMSUVEKQotCSAqIChwbGF5Y291bnQgTlVNQkVSICNJTVBMSUVEKQotCSAqIChyZXBlYXQgQ0RBVEEgI0lNUExJRUQpCi0JICogKHBhbmVsIENEQVRBICNJTVBMSUVEKQotCSAqICh0ZXh0IENEQVRBICNJTVBMSUVEKQotCSAqIChwYWxldHRlIENEQVRBICNJTVBMSUVEKQotCSAqICh0ZXh0Zm9jdXMgQ0RBVEEgI0lNUExJRUQpCi0JICogKHR5cGUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCQkvLyAlZXZlbnRzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEV2ZW50cyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xPT1AsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSElEREVOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZPTFVNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BVVRPU1RBUlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVVUT1BMQVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQVVUT1NJWkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVFJPTExFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ0FMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSE9XQ09OVFJPTFMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUExBWUNPVU5ULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFUEVBVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QQU5FTCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9URVhULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1BBTEVUVEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEVYVEZPQ1VTfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJLy8gKHNyYyAlVVJJOyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0dHIpOwotCi0JCS8vIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vICh0eXBlIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRW1wdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRW1wdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY1ODk4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEVtcHR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgRU1QVFkgdHlwZSBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkRW1wdHkgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRFbXB0eShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCQkvLyBFTVBUWSB0eXBlIGhhcyBubyBlbmQgdGFnLgotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX01VU1Q7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogRU1QVFkgdHlwZSBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRklFTERTRVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRklFTERTRVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiNWUwZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZJRUxEU0VULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogRklFTERTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZJRUxEU0VUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRklFTERTRVQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0ZJRUxEU0VUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9OVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT05ULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNjEwYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGT05ULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEZPTlQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZPTlQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZPTlQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9OVCwgY29sbGVjdGlvbik7Ci0JCS8vIENPUlJFQ1RfRU1QVFkgLSBHUk9VUF9DT01QQUNUCi0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqICVpMThuOwotCSAqIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZmFjZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVjb3JlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q29yZShhdHRyaWJ1dGVzKTsKLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZBQ0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZPUk0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9STS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M2MGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRk9STS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRk9STS4KLSAqLwotZmluYWwgY2xhc3MgSGVkRk9STSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZPUk0oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChhY3Rpb24gJVVSSTsgI1JFUVVJUkVEKQotCSAqIChtZXRob2QgKEdFVHxQT1NUKSBHRVQpCi0JICogKGVuY3R5cGUgJUNvbnRlbnRUeXBlOyAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKLQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChvbnN1Ym1pdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25yZXNldCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKGFjY2VwdC1jaGFyc2V0ICVDaGFyc2V0czsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ1RJT04sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVUSE9ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0VOQ1RZUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TVUJNSVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05SRVNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQVJHRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVBUX0NIQVJTRVR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Rk9STTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Rk9STTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGZvcm0gPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0pOwotCQlpZiAoZm9ybSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGZvcm0pOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRGUkFNRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg0NGNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogRlJBTUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEZSQU1FIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZSQU1FKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0hJRERFTi4KLQkJLy8gQmVjYXVzZSwgRlJBTUUgaXMgR1JPVVBfSElEREVOIGluIHRoZSBDKytET00vRFREUGFyc2VyLmNwcC4KLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogRlJBTUUuCi0JICogJWNvcmVhdHRyczsKLQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNyYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAoZnJhbWVib3JkZXIgKDF8MCkgMSkKLQkgKiAobWFyZ2lud2lkdGggJVBpeGVsczsgI0lNUExJRUQpCi0JICogKG1hcmdpbmhlaWdodCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobm9yZXNpemUgKG5vcmVzaXplKSAjSU1QTElFRCkKLQkgKiAoc2Nyb2xsaW5nICh5ZXN8bm98YXV0bykgYXV0bykKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTE9OR0RFU0MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVCT1JERVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFSR0lOSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PUkVTSVpFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDUk9MTElORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiAvLyBEMjA1NTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUVTRVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRlJBTUVTRVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzODk2MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZSQU1FU0VULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIEZSQU1FU0VULgotICovCi1maW5hbCBjbGFzcyBIZWRGUkFNRVNFVCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEZSQU1FU0VUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9GUkFNRVNFVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqIChyb3dzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29scyAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKG9ubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob251bmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGZyYW1lYm9yZGVyICh5ZXN8bm8pICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChib3JkZXJjb2xvciAlQ29sb3IgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICogKGZyYW1lc3BhY2luZyBDREFUQSAjSU1QTElFRCkgLi4uIEQyMTU2ODQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OVU5MT0FELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiwgLy8gRDIwNTUxNAotCQkJCQlIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FU1BBQ0lORyAvLyBEMjE1Njg0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vIChyb3dzICVNdWx0aUxlbmd0aHM7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLk1VTFRJX0xFTkdUSCk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ST1dTLCBhdHRyKTsKLQotCQkvLyAoY29scyAlTXVsdGlMZW5ndGhzOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBhdHRyKTsKLQotCQkvLyAoZnJhbWVib3JkZXIgKHllc3xubykgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1lFUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTk99OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZSQU1FQk9SREVSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRlJBTUVCT1JERVIsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZsb3dDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmQ0N2UyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgKCVmbG93OykqIGNvbnRhaW5lcnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZEZsb3dDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGbG93Q29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRkxPV19DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRm9udFN0eWxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEZvbnRTdHlsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjc4N2MwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkRm9udFN0eWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogJWZvbnRzdHlsZTsKLSAqLwotZmluYWwgY2xhc3MgSGVkRm9udFN0eWxlIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGb250U3R5bGUoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJJRykgfHwgZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwpKSB7Ci0JCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCX0KLQkJZWxzZSB7IC8vIEIsIEksIFUsIC4uLgotCQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0RVUExJQ0FURUQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCVN0cmluZyBteU5hbWUgPSBnZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoIW15TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CSUcpICYmICFteU5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU01BTEwpKQotCQkJcmV0dXJuIEVNUFRZX01BUDsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIRUFELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhFQUQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjMmU4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhFQUQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhFQUQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZSQU1FU0VULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSEVBRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkhFQUQ8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4laTE4bjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD5wcm9maWxlPC90ZD48dGQ+VVJJPC90ZD48dGQ+I0lNUExJRUQ8L3RkPjx0ZD5OL0E8L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQkJLy8gcHJvZmlsZQotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9QUk9GSUxFKTsKLQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPRklMRSwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICogSEVBRCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzE1NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIUi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEhSLgotICovCi1maW5hbCBjbGFzcyBIZWRIUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzCi0JICogKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkgKiAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGNvbG9yICVDb2xvcjsgI0lNUExJRUQpIC4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGFsaWduIChsZWZ0fGNlbnRlcnxyaWdodCkgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9MRUZULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PU0hBREUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xPUiAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTUyMjM5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZEhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhUTUwgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIVE1MKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hUTUw7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SFRNTDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPjxjb2RlPiVpMThuOzwvY29kZT48L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgICA8dGQ+e0BsaW5rIFBEQ01Eb2NJbXBsI2dldEF0dHJEZWNsYXJhdGlvbnNJMThufTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+dmVyc2lvbjwvdGQ+PHRkPkNEQVRBPC90ZD48dGQ+I0ZJWEVEPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBIVE1MX1ZFUlNJT05fVFJBTlNJVElPTkFMfTwvdGQ+PHRkPmRlcGxlY2F0ZWQgaW4gSFRNTDQuMDE8L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCQkvLyB2ZXJzaW9uCi0JCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbihIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04pOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKiBIVE1MIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSGVhZGluZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMjNjZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRIZWFkaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSFsxLTZdLgotICovCi1maW5hbCBjbGFzcyBIZWRIZWFkaW5nIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRIZWFkaW5nKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SDE8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYXR0cnM7PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWFsaWduOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICogPHA+PGI+JWFsaWduOzwvYj4gbWVhbnMgPGNvZGU+YWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkpICNJTVBMSUVEPC9jb2RlPi4KLQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIDxjb2RlPmFsaWduPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSBvbmUgaW4KLQkgKiA8Y29kZT5JTUc8L2NvZGU+IG9yIDxjb2RlPlRBQkxFPC9jb2RlPi4gIFNvLCB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogb2YgPGNvZGU+YWxpZ248L2NvZGU+IHNob3VsZCBiZSBsb2NhbHkgY3JlYXRlZCBhbmQgaXQgc2hvdWxkbid0IGJlIHJlZ2lzdGVyZWQKLQkgKiBpbiBhIDxjb2RlPkhDTURvY0ltcGw8L2NvZGU+IGluc3RhbmNlLjwvcD4KLQkgKiA8cD5Ib3dldmVyLCAlYWxpZ24gaXMgdXNlZCBpbiBzZXZhcmFsIHRpbWVzLiAgSSB3b3VsZG4ndCB3cml0ZSBzYW1lIGNvZGUKLQkgKiBpbiBtYW55IHRpbWVzLiAgU28sIEkgYWRkIGEgbmV3IHV0aWxpdHkgbWV0aG9kIGludG8gPGNvZGU+Q01VdGlsPC9jb2RlPgotCSAqIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uLjwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElGUkFNRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRJRlJBTUUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzNjc0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElGUkFNRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBJRlJBTUUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElGUkFNRSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElGUkFNRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JRlJBTUUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqIChsb25nZGVzYyAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCSAqIChmcmFtZWJvcmRlciAoMXwwKSAxKQotCSAqIChtYXJnaW53aWR0aCAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAobWFyZ2luaGVpZ2h0ICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChzY3JvbGxpbmcgKHllc3xub3xhdXRvKSBhdXRvKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT05HREVTQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRUJPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVJHSU5IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NST0xMSU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU1HLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElNRy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEyOTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU1HLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSU1HLgotICovCi1maW5hbCBjbGFzcyBIZWRJTUcgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSU1HKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRywgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIElNRy4KLQkgKiAlYXR0cnM7Ci0JICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXBmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT05HREVTQywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9VU0VNQVAsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSVNNQVAsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQk9SREVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUFQRklMRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduIChsb2NhbCk7IHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU5QVVQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSU5QVVQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmNWFhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElOUFVULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElOUFVULgotICovCi1maW5hbCBjbGFzcyBIZWRJTlBVVCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJTlBVVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTlBVVCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIElOUFVULgotCSAqICVhdHRyczsKLQkgKiAodHlwZSAlSW5wdXRUeXBlOyBURVhUKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGNoZWNrZWQgKGNoZWNrZWQpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCSAqIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobWF4bGVuZ3RoIE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoc3JjICVVUkk7ICNJTVBMSUVEKQotCSAqIChhbHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh1c2VtYXAgJVVSSTsgI0lNUExJRUQpCi0JICogKGlzbWFwIChpc21hcCkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uc2VsZWN0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoYWNjZXB0ICVDb250ZW50VHlwZXM7ICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkgKiA8PEQyMTU2ODQKLQkgKiAod2lkdGggQ0RBVEE7ICNJTVBMSUVEKQotCSAqIChoZWlnaHQgQ0RBVEE7ICNJTVBMSUVEKQotCSAqIChib3JkZXIgQ0RBVEE7ICNJTVBMSUVEKQotCSAqIEQyMTU2ODQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQkvLyAodHlwZSAlSW5wdXRUeXBlOyBURVhUKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJLy8gTk9URTogJUlucHV0VHlwZSBpcyBFTlVNOwotCQkvLyAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkJLy8gIGZpbGUgfCBoaWRkZW4gfCBpbWFnZSB8IGJ1dHRvbikKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9URVhULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9QQVNTV09SRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQ0hFQ0tCT1gsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JBRElPLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TVUJNSVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JFU0VULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9GSUxFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ISURERU4sIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0lNQUdFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9CVVRUT059OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCWF0eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVCk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQotCQkvLyAoc2l6ZSBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCS8vIChhbHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgYXR0cik7Ci0KLQkJLy8gKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIRUNLRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUkVBRE9OTFksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NQVhMRU5HVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9VU0VNQVAsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSVNNQVAsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNDRVNTS0VZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09ORk9DVVMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05CTFVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OU0VMRUNULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQ0hBTkdFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VQVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEUsCi0JCS8vPDxEMjE1Njg0Ci0JCQkJCUhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUgotCQkvLzxEMjE1Njg0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJVVFRPTn07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElTSU5ERVguamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSVNJTkRFWC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2VjNzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSVNJTkRFWC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElTSU5ERVguCi0gKi8KLWZpbmFsIGNsYXNzIEhlZElTSU5ERVggZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSVNJTkRFWChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiBJU0lOREVYLgotCSAqICVjb3JlYXR0cnM7Ci0JICogJWkxOG47Ci0JICogKHByb21wdCAlVGV4dDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlY29yZWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldENvcmUoYXR0cmlidXRlcyk7Ci0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHIgPSBhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9uKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPTVBUKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUFJPTVBULCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZElubGluZUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODgxMmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkSW5saW5lQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciAoJWlubGluZTspKiBjb250YWluZXJzLgotICovCi1hYnN0cmFjdCBjbGFzcyBIZWRJbmxpbmVDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqIEhlZElubGluZUNvbnRhaW5lci4KLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEhlZElubGluZUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0lOTElORV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEFCRUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEFCRUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjYjdiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExBQkVMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIExBQkVMLgotICovCi1maW5hbCBjbGFzcyBIZWRMQUJFTCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTEFCRUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUwsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoZm9yIElEUkVGICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKGZvciBJRFJFRiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRFJFRik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRk9SLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FDQ0VTU0tFWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkZPQ1VTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX09OQkxVUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5MQUJFTDwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+TEFCRUw8L2NvZGU+IGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBsYWJlbCA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEFCRUwpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChsYWJlbCk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT04sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MQUJFTH07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExFR0VORC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMRUdFTkQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY2ZDg2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZExFR0VORC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBMRUdFTkQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZExFR0VORCBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTEVHRU5EKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxFR0VORCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUxBbGlnbjsgI0lNUExJRUQpIC4uLiBzaHVsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBhbGlnbgotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yTGVnZW5kKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDEyZGFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTEkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIExJLgotICovCi1maW5hbCBjbGFzcyBIZWRMSSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMSShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkRfREVGQVVMVDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogKHR5cGUgJUxJU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodmFsdWUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAodHlwZSAlTElTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxJX1NUWUxFKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gKHZhbHVlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUUsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIExJIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTElOSy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSU5LLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmZTUyNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMSU5LLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLS8qKgotICogTElOSy4KLSAqLwotZmluYWwgY2xhc3MgSGVkTElOSyBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMSU5LKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkssIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBMSU5LLgotCSAqICVhdHRyczsKLQkgKiAoY2hhcnNldCAlQ2hhcnNldDsgI0lNUExJRUQpCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKGhyZWZsYW5nICVMYW5ndWFnZUNvZGU7ICNJTVBMSUVEKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChyZWwgJUxpbmtUeXBlczsgI0lNUExJRUQpCi0JICogKHJldiAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0hBUlNFVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUZMQU5HLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JFTCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRVYsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTUVESUEsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFSR0VUfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQ5NzE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGxpc3QgaXRlbSBjb250YWluZXIgZGVjbGFyYXRpb25zLgotICogLSBPTCwgVUwsIE1FTlUsIERJUi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkTGlzdEl0ZW1Db250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMaXN0SXRlbUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFQLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1BUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTEwMzZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotCi0KLS8qKgotICogTUFQLgotICovCi1maW5hbCBjbGFzcyBIZWRNQVAgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNQVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUFQLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9NQVA7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChuYW1lIENEQVRBICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQkvLyAobmFtZSBDREFUQSAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1BUlFVRUUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWNhZGNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUFSUVVFRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBNQVJRVUVFLgotICovCi1maW5hbCBjbGFzcyBIZWRNQVJRVUVFIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUFSUVVFRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NQVJRVUVFLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChiZWhhdmlvciAoc2Nyb2xsfHNsaWRlfGFsdGVybmF0ZSkgc2Nyb2xsKQotCSAqIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKGRpcmVjdGlvbiAobGVmdHxyaWdodHx1cHxkb3duKSBsZWZ0KQotCSAqIChoZWlnaHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChoc3BhY2UgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobG9vcCBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2Nyb2xsYW1vdW50IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoc2Nyb2xsZGVsYXkgTlVNQkVSICNJTVBMSUVEKQotCSAqICh2c3BhY2UgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAod2lkdGggQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh0cnVlc3BlZWQgKHRydWVzcGVlZCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CRUhBVklPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CR0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJUkVDVElPTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MT09QLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NDUk9MTEFNT1VOVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TQ1JPTExERUxBWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UUlVFU1BFRUR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBudWxsOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBudWxsOwotCQkvLyAoaGVpZ2h0IENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIGF0dHIpOwotCi0JCS8vICh3aWR0aCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCi0JCS8vIChoc3BhY2UgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFLCBhdHRyKTsKLQotCQkvLyAodnNwYWNlIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVOVS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRU5VLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NTcwMzYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRNRU5VLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBNRU5VL0RJUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUVOVSBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNRU5VKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogTUVOVS9ESVIuCi0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5NRU5VL0RJUjwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWJsb2NrOzwvY29kZT4uCi0JICogJWJsb2NrOyBpczoKLQkgKiBQIHwgJWhlYWRpbmc7IHwgJWxpc3Q7IHwgJXByZWZvcm1hdHRlZDsgfCBETCB8IERJViB8IENFTlRFUiB8Ci0JICogTk9TQ1JJUFQgfCBOT0ZSQU1FUyB8IEJMT0NLUVVPVEUgfCBGT1JNIHwgSVNJTkRFWCB8IEhSIHwKLQkgKiBUQUJMRSB8IEZJRUxEU0VUIHwgQUREUkVTUy4KLQkgKiAlaGVhZGluZzsgaXM6IEgxIHwgSDIgfCBIMyB8IEg0IHwgSDUgfCBINi4KLQkgKiAlbGlzdDsgaXMgOiBVTCB8IE9MIHwgRElSIHwgTUVOVS4KLQkgKiAlcHJlZm9ybWF0dGVkOyBpcyBQUkUuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyAlYmxvY2s7Ci0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDEsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgzLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg2LCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkUsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJViwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBULCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklTSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRklFTERTRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BRERSRVNTfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1FVEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVUQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjdlMDA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTUVUQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0vKioKLSAqIE1FVEEuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE1FVEEgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTUVUQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogTUVUQS4KLQkgKiAlaTE4bjsKLQkgKiAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCSAqIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb250ZW50IENEQVRBICNSRVFVSVJFRCkKLQkgKiAoc2NoZW1lIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQkvLyAobmFtZSBOQU1FICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5OQU1FKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IVFRQX0VRVUlWLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NIRU1FfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTWFya0NoYW5nZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmZjQwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE1hcmtDaGFuZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIChJTlN8REVMKQotICovCi1maW5hbCBjbGFzcyBIZWRNYXJrQ2hhbmdlcyBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1hcmtDaGFuZ2VzKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKQotCSAqIChkYXRldGltZSAlRGF0ZXRpbWU7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NJVEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREFURVRJTUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0JSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGUzYTFhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIE5PQlIgLS0gbm90IHN0YW5kYXJkIHRhZyBidXQgaXQgaXMgY29tbW9ubHkgdXNlZC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTk9CUiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQotCXB1YmxpYyBIZWROT0JSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PQlIsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQ09SUkVDVF9EVVBMSUNBVEVEOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJLy8gTm8gYXR0cmlidXRlcyBpcyBkZWZpbmVkLgotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRU1CRUQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9FTUJFRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDVkNWZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9FTUJFRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLQotLyoqCi0gKiBOT0VNQkVELgotICovCi1maW5hbCBjbGFzcyBIZWROT0VNQkVEIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkTk9FTUJFRChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0VNQkVELCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAlY29yZWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRlJBTUVTLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE5PRlJBTUVTLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMmQwNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT0ZSQU1FUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBOT0ZSQU1FUy4KLSAqLwotZmluYWwgY2xhc3MgSGVkTk9GUkFNRVMgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWROT0ZSQU1FUyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT0ZSQU1FUywgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVDsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5OT0ZSQU1FUzwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Tk9GUkFNRVM8L2NvZGU+IGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBsYWJlbCA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVMpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWV4Y2x1c2lvbi5hcHBlbmRDaGlsZChsYWJlbCk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9GUkFNRVN9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT1NDUklQVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWROT1NDUklQVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjlhNDAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkTk9TQ1JJUFQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBOT1NDUklQVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkTk9TQ1JJUFQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWROT1NDUklQVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT1NDUklQVCwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPQkpFQ1QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0JKRUNULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMjlhYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPQkpFQ1QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogT0JKRUNULgotICovCi1maW5hbCBjbGFzcyBIZWRPQkpFQ1QgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRPQkpFQ1QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0JKRUNULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQVJBTV9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCSAqIChkZWNsYXJlIChkZWNsYXJlKSAjSU1QTElFRCkKLQkgKiAoY2xhc3NpZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoY29kZWJhc2UgJVVSSTsgI0lNUExJRUQpCi0JICogKGRhdGEgJVVSSTsgI0lNUExJRUQpCi0JICogKHR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKiAoY29kZXR5cGUgJUNvbnRlbnRUeXBlOyAjSU1QTElFRCkKLQkgKiAoYXJjaGl2ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc3RhbmRieSAlVGV4dDsgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGJvcmRlciAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqICh2c3BhY2UgJVBpeGVsczsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVyZXNlcnZlZDsgLi4uIGVtcHR5LgotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfREVDTEFSRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEFTU0lELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPREVCQVNFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RBVEEsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0RFVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BUkNISVZFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUQU5EQlksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1VTRU1BUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RBQklOREVYLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IU1BBQ0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVlNQQUNFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JCS8vICVhbGlnbjsgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IEF0dHJpYnV0ZUNvbGxlY3Rpb24uY3JlYXRlQWxpZ25Gb3JJbWFnZSgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0wuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT0wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyNmYzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBPTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkT0wgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT0woRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIE9MLgotCSAqICh0eXBlICVPTFN0eWxlOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqIChzdGFydCBOVU1CRVIgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHR5cGUgJU9MU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5PTF9TVFlMRSk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vIHRoZSByZXN0LgotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTVBBQ1QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RBUlR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUR1JPVVAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkT1BUR1JPVVAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM2NzM0NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVEdST1VQLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci0KLS8qKgotICogT1BUR1JPVVAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZE9QVEdST1VQIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT1BUR1JPVVAoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUR1JPVVAsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX09QVElPTl9DT05UQUlORVI7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChsYWJlbCAlVGV4dDsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RJU0FCTEVEfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKGxhYmVsICVUZXh0OyAjUkVRVUlSRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlRFWFQpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0xBQkVMLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFCRUwsIGF0dHIpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVElPTi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRPUFRJT04uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU2OGJkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZE9QVElPTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogT1BUSU9OLgotICovCi1maW5hbCBjbGFzcyBIZWRPUFRJT04gZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTn07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT1BUSU9OKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTiwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqIE9QVElPTi4KLQkgKiAlYXR0cnM7Ci0JICogKHNlbGVjdGVkIChzZWxlY3RlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKGxhYmVsICVUZXh0OyAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TRUxFQ1RFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQUJFTCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIE9QVElPTiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWU2MzdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFAgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiB0ZXJtaW5hdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5QLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5QPC9jb2RlPiBlbGVtZW50IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQkgKiA8dGFibGU+Ci0JICogPHRib2R5PgotCSAqICAgPHRyPgotCSAqICAgICA8dGg+TkFNRTwvdGg+PHRoPlRZUEU8L3RoPjx0aD5VU0FHRTwvdGg+PHRoPkRFRkFVTFQgKElOSVRJQUwpIFZBTFVFPC90aD48dGg+TUVNTzwvdGg+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWF0dHJzOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhbGlnbjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqIDxwPjxiPiVhbGlnbjs8L2I+IG1lYW5zIDxjb2RlPmFsaWduIChsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5KSAjSU1QTElFRDwvY29kZT4uCi0JICogVW5mb3J0dW5hdGVseSwgdGhpcyA8Y29kZT5hbGlnbjwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gb25lIGluCi0JICogPGNvZGU+SU1HPC9jb2RlPiBvciA8Y29kZT5UQUJMRTwvY29kZT4uICBTbywgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbgotCSAqIG9mIDxjb2RlPmFsaWduPC9jb2RlPiBzaG91bGQgYmUgbG9jYWx5IGNyZWF0ZWQgYW5kIGl0IHNob3VsZG4ndCBiZSByZWdpc3RlcmVkCi0JICogaW4gYSA8Y29kZT5IQ01Eb2NJbXBsPC9jb2RlPiBpbnN0YW5jZS48L3A+Ci0JICogPHA+SG93ZXZlciwgJWFsaWduIGlzIHVzZWQgaW4gc2V2YXJhbCB0aW1lcy4gIEkgd291bGRuJ3Qgd3JpdGUgc2FtZSBjb2RlCi0JICogaW4gbWFueSB0aW1lcy4gIFNvLCBJIGFkZCBhIG5ldyB1dGlsaXR5IG1ldGhvZCBpbnRvIDxjb2RlPkNNVXRpbDwvY29kZT4KLQkgKiB0byBjcmVhdGUgdGhlIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi48L3A+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhZGVjID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhZGVjKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbmFtZXMgb2YgdGVybWluYXRvcnMuCi0JICogPGNvZGU+UDwvY29kZT4gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlpZiAodGVybWluYXRvcnMgIT0gbnVsbCkKLQkJCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCQkvLzw8RDIxNzk4MgotCQl0ZXJtaW5hdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQkJdGVybWluYXRvcnMuYWRkQWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVzT2ZCbG9jaygpKTsKLQkJdGVybWluYXRvcnMuYWRkKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSSk7Ci0JCXRlcm1pbmF0b3JzLmFkZChIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQpOwotCQl0ZXJtaW5hdG9ycy5hZGQoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJLy9EMjE3OTgyCi0JCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBBUkFNLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBBUkFNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiNDRmZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQQVJBTS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBQQVJBTS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUEFSQU0gZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUEFSQU0oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUEFSQU0sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBQQVJBTS4KLQkgKiAoaWQgSUQgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHZhbHVldHlwZSAoREFUQXxSRUZ8T0JKRUNUKSBEQVRBKQotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0lELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFVFlQRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJLy8gKG5hbWUgQ0RBVEEgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUFJFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBSRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTZiMjI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUFJFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFBSRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUFJFIGV4dGVuZHMgSGVkSW5saW5lQ29udGFpbmVyIHsKLQotCS8qKgotCSAqIFBSRSBlbGVtZW50IHNob3VsZCBrZWVwIHNwYWNlcyBpbiBpdHMgc291cmNlLgotCSAqLwotCXB1YmxpYyBIZWRQUkUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCi0JCWtlZXBTcGFjZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0dHIpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5QUkU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVwcmUuZXhjbHVzaW9uOzwvY29kZT4uCi0JICogJXByZS5leGNsdXNpb24gaXM6Ci0JICogSU1HIHwgT0JKRUNUIHwgQVBQTEVUIHwgQklHIHwgU01BTEwgfCBTVUIgfCBTVVAgfCBGT05UIHwgQkFTRUZPTlQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1QsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BUFBMRVQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CSUcsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TTUFMTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVQiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNVUCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPTlQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFRk9OVH07Ci0JCWVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhleGNsdXNpb24sIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBjZGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRQY2RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UxNGMzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBjZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFBDREFUQSB0eXBlIGVsZW1lbnQgZGVjbGFyYXRpb25zLjxicj4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkUGNkYXRhIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUGNkYXRhKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUENEQVRBOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIFBDREFUQSB0eXBlIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGhyYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFBocmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTYxZTFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkUGhyYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotLyoqCi0gKiAlcGhyYXNlOwotICovCi1maW5hbCBjbGFzcyBIZWRQaHJhc2UgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFBocmFzZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQ09SUkVDVF9EVVBMSUNBVEVEOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRRLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4MjMyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogUS4KLSAqLwotZmluYWwgY2xhc3MgSGVkUSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5RLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0RVUExJQ0FURUQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaXRlICVVUkk7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSVRFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0NSSVBULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNDUklQVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjc5YTBkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU0NSSVBULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogU0NSSVBULgotICovCi1maW5hbCBjbGFzcyBIZWRTQ1JJUFQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTQ1JJUFQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9DREFUQTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogU0NSSVBULgotCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKGxhbmd1YWdlIENEQVRBICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGRlZmVyIChkZWZlcikgI0lNUExJRUQpCi0JICogKGV2ZW50IENEQVRBICNJTVBMSUVEKQotCSAqIChmb3IgJVVSSTsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NIQVJTRVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTEFOR1VBR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RFRkVSLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0VWRU5ULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZPUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsICJ0ZXh0L2phdmFzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5TQ1JJUFQ8L2NvZGU+IGlzIENEQVRBIHR5cGUuCi0JICogU28sIHRoZSBtZXRob2QgYWx3YXlzIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uCi0JICogPGJyPgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENEQVRBIGNvbnRlbnQuPGJyPgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNFTEVDVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTRUxFQ1QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUzYzNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNFTEVDVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFNFTEVDVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU0VMRUNUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU0VMRUNUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfU0VMRUNUOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNpemUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobXVsdGlwbGUgKG11bHRpcGxlKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzaXplIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTVVMVElQTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRElTQUJMRUQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVEFCSU5ERVgsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DSEFOR0V9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CVVRUT059OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTUEFOLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNQQU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhYWExNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNQQU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogU1BBTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1BBTiBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBTUEFOLgotCSAqLwotCXB1YmxpYyBIZWRTUEFOKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNQQU4sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lCYXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYzOGJlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUJhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFNTSSBkZWNsYXJhdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFNTSUJhc2UgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQmFzZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9TU0k7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wTmFtZSk7Ci0JfQotCi0JLyoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDI5MmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkNPTkZJRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJQ29uZmlnIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQ29uZmlnKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9DT05GSUcsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpDT05GSUcuCi0JICogKGVycm1zZyBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKiAodGltZWZtdCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRVJSTVNHLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkVGTVQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUVjaG8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRWNoby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGM1ZTZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRWNoby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6RUNITy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRWNobyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUVjaG8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VDSE8sIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpFQ0hPCi0JICogKHZhciBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVkFSfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRXhlYy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzNjODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lFeGVjLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpFWEVDLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFeGVjIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRXhlYyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkVYRUMKLQkgKiAoY2dpICVVUkk7ICNJTVBMSUVEKQotCSAqIChjbWQgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NHSSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DTUR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGbGFzdG1vZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTU0lGbGFzdG1vZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTgzOTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRmxhc3Rtb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogU1NJOkZMQVNUTU9ELgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lGbGFzdG1vZCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUZsYXN0bW9kKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkZMQVNUTU9ECi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRnNpemUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJRnNpemUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNmNzU0MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUZzaXplLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpGU0laRS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRnNpemUgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lGc2l6ZShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRlNJWkUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpGU0laRQotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSUluY2x1ZGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjhhNTUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJSW5jbHVkZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci0KLQotLyoqCi0gKiBTU0k6SU5DTFVERS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJSW5jbHVkZSBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUluY2x1ZGUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0lOQ0xVREUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpJTkNMVURFCi0JICogKGZpbGUgJVVSSTsgI0lNUExJRUQpCi0JICogKHZpcnR1YWwgJVVSSSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJUHJpbnRlbnYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJUHJpbnRlbnYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjMzAzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVByaW50ZW52LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogU1NJOlBSSU5URU5WLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lQcmludGVudiBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVByaW50ZW52KEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9QUklOVEVOViwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6UFJJTlRFTlYgaGFzIG5vIGF0dHJpYnV0ZXMuICBTbywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JICogYWx3YXlzIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBOb3RlOiBTaW5jZSBzb21lYm9keSBkb2Vzbid0IGV4cGVjdCBudWxsIGlzIHJldHVybmVkLCByZXR1cm4gdGhlIGVtcHR5IGF0dHJpYnV0ZQotCSAqIGxpa2UgYSBjdXN0b20gdGFnIHdoaWNoIGRvZXNuJ3QgaGF2ZSBhdHRyaWJ1dGVzCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNTSVNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDhjNDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkU1NJU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFNTSTpTRVQuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSVNldCBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVNldChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfU0VULCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6U0VUCi0JICogKHZhciBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNUWUxFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNUWUxFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ODJkNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTVFlMRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogU1RZTEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNUWUxFIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1RZTEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQl9Ci0KLQkvKioKLQkgKiBTVFlMRQotCSAqICVpMThuOwotCSAqICh0eXBlICVDb250ZW50VHlwZTsgI1JFUVVJUkVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobWVkaWEgJU1lZGlhRGVzYzsgI0lNUExJRUQpCi0JICogKHRpdGxlICVUZXh0OyAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVpMThuOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEkxOG4oYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9NRURJQSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9USVRMRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQkvLyAodHlwZSAlQ29udGVudFR5cGU7ICNSRVFVSVJFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuQ09OVEVOVF9UWVBFKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogPGNvZGU+U1RZTEU8L2NvZGU+IGlzIENEQVRBIGNvbnRlbnQgdHlwZS4gIFNvLCBpdCBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDREFUQSBjb250ZW50Ljxicj4KLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRTY3JpcHRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNjcmlwdHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiMjBlMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFNjcmlwdHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBTVUIgYW5kIFNVUC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU2NyaXB0cyBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU2NyaXB0cyhTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRBQkxFLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRBQkxFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YWVhNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUQUJMRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFRBQkxFLgotICovCi1maW5hbCBjbGFzcyBIZWRUQUJMRSBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRBQkxFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UQUJMRTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaW5kZW50Q2hpbGQgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIFRBQkxFLgotCSAqICVhdHRyczsKLQkgKiAlcmVzZXJ2ZWQ7Ci0JICogKHN1bW1hcnkgJVRleHQ7ICNJTVBMSUVEKQotCSAqICh3aWR0aCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChmcmFtZSAlVEZyYW1lOyAjSU1QTElFRCkKLQkgKiAocnVsZXMgJVRSdWxlczsgI0lNUExJRUQpCi0JICogKGNlbGxzcGFjaW5nICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChjZWxscGFkZGluZyAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJVRBbGlnbjsgI0lNUExJRUQpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAoZGF0YXBhZ2VzaXplIENEQVRBICNJTVBMSUVEKQotCSAqIChoZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJXJlc2VydmVkOwotCQkvLyAuLi4gJXJlc2VydmVkOyBpcyBlbXB0eSBpbiB0aGUgY3VycmVudCBEVEQuCi0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVU1NQVJZLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9GUkFNRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SVUxFUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DRUxMU1BBQ0lORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DRUxMUEFERElORywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CR0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0RBVEFQQUdFU0laRSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiAvLyBEMjA1NTE0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCi0JCS8vIGFsaWduIChsb2NhbCkKLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSBhbGlnblZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9MRUZULCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUfTsKLQkJYXR5cGUuc2V0RW51bVZhbHVlcyhhbGlnblZhbHVlcyk7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYWRlYyA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYWRlYyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRFWFRBUkVBLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRFWFRBUkVBLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjBmNWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRURVhUQVJFQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBURVhUQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEVYVEFSRUEgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICogVEVYVEFSRUEgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFRFWFRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRFWFRBUkVBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0KLQkJa2VlcFNwYWNlcyA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogVEVYVEFSRUEuCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsgLi4uIGVtcHR5Ci0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKHJvd3MgTlVNQkVSICNSRVFVSVJFRCkKLQkgKiAoY29scyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqIChyZWFkb25seSAocmVhZG9ubHkpICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKGFjY2Vzc2tleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbnNlbGVjdCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGlzdHlsZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OQU1FLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09MUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9ESVNBQkxFRCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9SRUFET05MWSwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UQUJJTkRFWCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ0NFU1NLRVksIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05GT0NVUywgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9PTkJMVVIsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05TRUxFQ1QsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfT05DSEFOR0UsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSVNUWUxFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQlVUVE9OfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVElUTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVElUTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4Y2YxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRJVExFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogVElUTEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRJVExFIGV4dGVuZHMgSGVkUGNkYXRhIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUSVRMRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRSwgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIFRJVExFLgotCSAqICVpMThuOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+VElUTEU8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPiVoZWFkLm1pc2M7PC9jb2RlPi4KLQkgKiAlaGVhZC5taXNjOyBpcyA8Y29kZT5TQ1JJUFR8U1RZTEV8TUVUQXxMSU5LfE9CSkVDVDwvY29kZT4uCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyAoU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QpCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkssIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PQkpFQ1R9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUUi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjE1Y2YwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkVFIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0vKioKLSAqIFRSLgotICovCi1maW5hbCBjbGFzcyBIZWRUUiBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUUihFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUiwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfVENFTExfQ09OVEFJTkVSOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqIChiZ2NvbG9yICVDb2xvcjsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKGJvcmRlcmNvbG9yICVDb2xvciAjSU1QTElFRCkgLi4uIEQyMDU1MTQKLQkgKiAoaGVpZ2h0ICVMZW5ndGggI0lNUExJRUQpIGJ1ZzIyNDYKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JHQ09MT1IsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQkFDS0dST1VORCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVJDT0xPUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQgLy8gRDIwNTUxNAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBUUiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQm9keS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUJvZHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQyZTZhNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQm9keS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogVEhFQUQvVEZPT1QvVEJPRFkKLSAqLwotZmluYWwgY2xhc3MgSGVkVGFibGVCb2R5IGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmdbXSB0ZXJtaW5hdG9ycyA9IHtIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0FQVElPTiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNPTEdST1VQLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQsIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUYWJsZUJvZHkoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9UUl9DT05UQUlORVI7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJaWYgKGVsZW1lbnROYW1lID09IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSkgewotCQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCQl9Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUQk9EWS9URk9PVC9USEVBRAotCSAqICVhdHRyczsKLQkgKiAlY2VsbGhhbGlnbjsKLQkgKiAlY2VsbHZhbGlnbjsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGxoYWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbGhhbGlnbihhdHRyaWJ1dGVzKTsKLQkJLy8gJWNlbGx2YWxpZ247Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0Q2VsbHZhbGlnbihhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBUSEVBRCwgVEZPT1QgYW5kIFRCT0RZIGhhdmUgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQ2VsbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRUYWJsZUNlbGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE3OTFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFRhYmxlQ2VsbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotCi0KLS8qKgotICogKFRIIHwgVEQpLgotICovCi1maW5hbCBjbGFzcyBIZWRUYWJsZUNlbGwgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRILCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVER9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFRhYmxlQ2VsbChTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoYWJiciAlVGV4dDsgI0lNUExJRUQpCi0JICogKGF4aXMgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlYWRlcnMgSURSRUZTICNJTVBMSUVEKQotCSAqIChzY29wZSAlU2NvcGU7ICNJTVBMSUVEKQotCSAqIChyb3dzcGFuIE5VTUJFUiAxKQotCSAqIChjb2xzcGFuIE5VTUJFUiAxKQotCSAqICVjZWxsaGFsaWduOwotCSAqICVjZWxsdmFsaWduOwotCSAqIChub3dyYXAgKG5vd3JhcCkgI0lNUExJRUQpCi0JICogKGJnY29sb3IgJUNvbG9yOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAoYmFja2dyb3VuZCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoYm9yZGVyY29sb3IgJUNvbG9yICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbGhhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsaGFsaWduKGF0dHJpYnV0ZXMpOwotCQkvLyAlY2VsbHZhbGlnbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDZWxsdmFsaWduKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUJCUiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BWElTLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFQURFUlMsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0NPUEUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfUk9XU1BBTiwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTUEFOLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX05PV1JBUCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CR0NPTE9SLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CQUNLR1JPVU5ELCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUkNPTE9SIC8vIEQyMDU1MTQKLQkJfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogVEggYW5kIFREIGhhdmUgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFVMLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0hlZFVMLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNDRlNjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRVTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFVMLgotICovCi1maW5hbCBjbGFzcyBIZWRVTCBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRVTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVUwuCi0JICogKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJLy8gJVVMU3R5bGU7IGlzIChkaXNjfHNxdWFyZXxjaXJjbGUpLgotCQlIVE1MQ01EYXRhVHlwZUltcGwgYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9ESVNDLCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TUVVBUkUsIEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NJUkNMRX07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ09NUEFDVH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7SFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSGVkV0JSLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNGU1NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9IZWRXQlIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLWZpbmFsIGNsYXNzIEhlZFdCUiBleHRlbmRzIEhlZEVtcHR5IHsKLQotCXB1YmxpYyBIZWRXQlIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuV0JSLCBjb2xsZWN0aW9uKTsKLQkJLy8gTEFZT1VUX0JSRUFLLgotCQkvLyBzYW1lIGFzIEJSLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JSRUFLOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJLy8gTm8gYXR0cmlidXRlcyBpcyBkZWZpbmVkLgotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pDTURvY0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDYwZDUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSkNNRG9jSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNRG9jdW1lbnQgZm9yIHRoZSBKU1AgMS4xLgotICovCi1jbGFzcyBKQ01Eb2NJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEpTUENNRG9jdW1lbnQgewotCi0JLyoqIE5hbWVzcGFjZSBmb3IgYWxsIG5hbWVzIG9mIGVsZW1lbnRzLCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcy4gKi8KLQlwcml2YXRlIENNTmFtZXNwYWNlSW1wbCBuYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgSlNQRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudHMgPSBudWxsOwotCi0JLyoqCi0JICogSENNRG9jSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBKQ01Eb2NJbXBsKFN0cmluZyBkb2NUeXBlTmFtZSwgQ01OYW1lc3BhY2VJbXBsIHRhcmdldE5hbWVzcGFjZSkgewotCQlzdXBlcihkb2NUeXBlTmFtZSk7Ci0JCW5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJZWxlbWVudHMgPSBuZXcgSlNQRWxlbWVudENvbGxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCWlmIChlbGVtZW50cyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudHMuZ2V0TmFtZWRJdGVtKGVsZW1lbnROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSFRNTEVudGl0eURlY2xhcmF0aW9uIGdldEVudGl0eURlY2xhcmF0aW9uKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDExTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUDExTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZmZmM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1AxMU5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotLyoqCi0gKiBKU1AgMS4xIE5hbWVzcGFjZS4gTm90ZSwgdGhpcyBpbnRlcmZhY2Ugd2FzIAotICogY29waWVkIGZvcm0gSlNQIGNvcmUgcGFja2FnZXMuIE9uZSBpbXBsaWNhdGlvbiAKLSAqIGlzIHRoYXQgZXh0cmEgY2FyZSBpcyBuZWVkZWQgaW4gdXNpbmcgJz09JyBpbnN0ZWFkIAotICogb2YgJy5lcXVhbHMnLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUDExTmFtZXNwYWNlIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIHsKLQkJLy8gRWxlbWVudCBuYW1lcwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRMRVQgPSAianNwOnNjcmlwdGxldCI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTiA9ICJqc3A6ZXhwcmVzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDTEFSQVRJT04gPSAianNwOmRlY2xhcmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfUEFHRSA9ICJqc3A6ZGlyZWN0aXZlLnBhZ2UiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJUkVDVElWRV9JTkNMVURFID0gImpzcDpkaXJlY3RpdmUuaW5jbHVkZSI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSRUNUSVZFX1RBR0xJQiA9ICJqc3A6ZGlyZWN0aXZlLnRhZ2xpYiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFQkVBTiA9ICJqc3A6dXNlQmVhbiI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUUFJPUEVSVFkgPSAianNwOnNldFByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRQUk9QRVJUWSA9ICJqc3A6Z2V0UHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVREUgPSAianNwOmluY2x1ZGUiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkQgPSAianNwOmZvcndhcmQiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTiA9ICJqc3A6cGx1Z2luIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTVMgPSAianNwOnBhcmFtcyI7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkFMTEJBQ0sgPSAianNwOmZhbGxiYWNrIjsgLy8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTSA9ICJqc3A6cGFyYW0iOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1QgPSAianNwOnJvb3QiOyAvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAianNwOnRleHQiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVVJJID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfVEFHX1BSRUZJWCA9ICJqc3AiOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIG5hbWVzCi0JLy8gICBkaXJlY3RpdmUucGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9MQU5HVUFHRSA9ICJsYW5ndWFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRVhURU5EUyA9ICJleHRlbmRzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT05URU5UX1RZUEUgPSAiY29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lNUE9SVCA9ICJpbXBvcnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NFU1NJT04gPSAic2Vzc2lvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQlVGRkVSID0gImJ1ZmZlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQVVUT0ZMVVNIID0gImF1dG9GbHVzaCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUgPSAiaXNUaHJlYWRTYWZlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JTkZPID0gImluZm8iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0VSUk9SX1BBR0UgPSAiZXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFID0gImlzRXJyb3JQYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9QQUdFX0VOQ09ESU5HID0gInBhZ2VFbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS5pbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0ZJTEUgPSAiZmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIGRpcmVjdGl2ZS50YWdsaWIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUFJFRklYID0gInByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLQkvLyAgIHVzZUJlYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1NDT1BFID0gInNjb3BlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQkVBTl9OQU1FID0gImJlYW5OYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9UWVBFID0gInR5cGUiOyAvLyROT04tTkxTLTEkCi0JLy8gICBzZXRQcm9wZXJ0eQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BST1BFUlRZID0gInByb3BlcnR5IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WQUxVRSA9ICJ2YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfUEFSQU0gPSAicGFyYW0iOyAvLyROT04tTkxTLTEkCi0JLy8gICBpbmNsdWRlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1BBR0UgPSAicGFnZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRkxVU0ggPSAiZmx1c2giOyAvLyROT04tTkxTLTEkCi0JLy8gICBwbHVnaW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ09ERSA9ICJjb2RlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DT0RFQkFTRSA9ICJjb2RlYmFzZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxJR04gPSAiYWxpZ24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FSQ0hJVkUgPSAiYXJjaGl2ZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSEVJR0hUID0gImhlaWdodCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFNQQUNFID0gImhzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSlJFVkVSU0lPTiA9ICJqcmV2ZXJzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSAidnNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9ICJ3aWR0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTlNQTFVHSU5VUkwgPSAibnNwbHVnaW51cmwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0lFUExVR0lOVVJMID0gImllcGx1Z2ludXJsIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgcm9vdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9YTUxOU19KU1AgPSAieG1sbnM6anNwIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gInZlcnNpb24iOyAvLyROT04tTkxTLTEkCi0JLy8gYXR0cmlidXRlIHZhbHVlcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRkFMU0UgPSAiZmFsc2UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KQVZBID0gImphdmEiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DVF9ERUZBVUxUID0gInRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIjsvL0QxOTUzNjYgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQgPSAiOGtiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUEFHRSA9ICJwYWdlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfU0VTU0lPTiA9ICJzZXNzaW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUkVRVUVTVCA9ICJyZXF1ZXN0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQVBQTElDQVRJT04gPSAiYXBwbGljYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CRUFOID0gImJlYW4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9BUFBMRVQgPSAiYXBwbGV0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gInRvcCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX01JRERMRSA9ICJtaWRkbGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9CT1RUT00gPSAiYm90dG9tIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9ICJsZWZ0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUklHSFQgPSAicmlnaHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9KVkVSMTEgPSAiMS4xIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfWE1MTlNfSlNQID0gImh0dHA6Ly9qYXZhLnN1bi5jb20vSlNQL1BhZ2UiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9KU1BDTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdmMzdjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUENNRG9jdW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLQotCi0vKioKLSAqIEpTUCBleHRlbnNpb24gZm9yIENNRG9jdW1lbnQuCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBzb21lIHNob3J0IGhhbmQgbWV0aG9kcyB0byBnZXQgZGVjbGFyYXRpb25zCi0gKiBieSBhIG5hbWUuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSlNQQ01Eb2N1bWVudCBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudCB7Ci0KLQkvKioKLQkgKiBBIHNob3J0IGhhbmQgbWV0aG9kIHRvIGdldCBhIGVsZW1lbnQgZGVjbGFyYXRpb24gZm9yIGEgSlNQIGVsZW1lbnQuCi0JICogSlNQIGRlY2xhcmF0aW9uIGNsYXNzIGltcGxlbWVudHMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnRlcmZhY2UuCi0JICogQHBhcmFtIGVsZW1lbnROYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlIVE1MRWxlbWVudERlY2xhcmF0aW9uIGdldEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcgZWxlbWVudE5hbWUpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQRWxlbWVudENvbGxlY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvSlNQRWxlbWVudENvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlZmEyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0pTUEVsZW1lbnRDb2xsZWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMgb2YgdGhlIEpTUCAxLjEuCi0gKi8KLWZpbmFsIGNsYXNzIEpTUEVsZW1lbnRDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZSB7Ci0KLQotCXByaXZhdGUgY2xhc3MgVHlwZVBhY2tldCB7Ci0JCXB1YmxpYyBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JCXB1YmxpYyBpbnQgY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZOwotCQlwdWJsaWMgaW50IG9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfTk9ORTsKLQkJcHVibGljIGludCBsaW5lQnJlYWsgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX05PTkU7Ci0JCXB1YmxpYyBpbnQgbGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfTk9ORTsKLQkJcHVibGljIGludCBjb3JyZWN0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5DT1JSRUNUX05PTkU7Ci0JCXB1YmxpYyBpbnQgZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfWE1MOwotCQlwdWJsaWMgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCi0JCXB1YmxpYyBUeXBlUGFja2V0KCkgewotCQl9Ci0JfQotCi0JLyoqIEpTUCBlbGVtZW50IGRlY2xhcmF0aW9uLiAqLwotCXByaXZhdGUgY2xhc3MgRWxlbURlY2wgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiwgSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gewotCQlwcml2YXRlIFR5cGVQYWNrZXQgdHlwZSA9IG51bGw7Ci0JCXByaXZhdGUgQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JCXByaXZhdGUgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JCXB1YmxpYyBFbGVtRGVjbChUeXBlUGFja2V0IHQpIHsKLQkJCXN1cGVyKHQubmFtZSwgMSwgMSk7Ci0JCQl0eXBlID0gdDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbnRlbnQoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJCWNvbnRlbnQgPSBncm91cDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJzKSB7Ci0JCQlhdHRyaWJ1dGVzID0gYXR0cnM7Ci0JCX0KLQotCQkvLyBpbXBsZW1lbnRlcyBDTU5vZGUKLQkJcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcCA9PSBudWxsKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJcmV0dXJuIHBwLnN1cHBvcnRzKHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOyAvL0QyMDg4MzkKLQkJCX0KLQkJCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQkJU3RyaW5nIG15TmFtZSA9IGdldEVsZW1lbnROYW1lKCk7Ci0JCQkJaWYgKG15TmFtZSA9PSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QTFVHSU4pIHsKLQkJCQkJcmV0dXJuIGdldE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTVMpOyAvLyBvdXRlciBjbGFzcyBtZXRob2QuCi0JCQkJfQotCQkJCWVsc2UgaWYgKG15TmFtZSA9PSBKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTVMpIHsKLQkJCQkJcmV0dXJuIGdldE5hbWVkSXRlbShKU1AxMU5hbWVzcGFjZS5FbGVtZW50TmFtZS5QQVJBTSk7IC8vIG91dGVyIGNsYXNzIG1ldGhvZC4KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJCWlmIChwcCA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQlyZXR1cm4gcHAuZ2V0KHRoaXMpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW1wbGVtZW50ZXMgQ01FbGVtZW50RGVjbGFyYXRpb24KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCQlyZXR1cm4gYXR0cmlidXRlczsKLQkJfQotCi0JCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJCXJldHVybiBjb250ZW50OwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLmNvbnRlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJCXJldHVybiBnZXROb2RlTmFtZSgpOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIGltcGxlbWVudGVzIEhUTUxFbGVtZW50RGVjbGFyYXRpb24KLQkJcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRDb3JyZWN0aW9uVHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLmNvcnJlY3Q7Ci0JCX0KLQotCQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIENNQ29udGVudCBnZXRJbmNsdXNpb24oKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQkJcmV0dXJuIEVNUFRZX01BUDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLmZvcm1hdDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGF5b3V0VHlwZSgpIHsKLQkJCXJldHVybiB0eXBlLmxheW91dDsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0TGluZUJyZWFrSGludCgpIHsKLQkJCXJldHVybiB0eXBlLmxpbmVCcmVhazsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0T21pdFR5cGUoKSB7Ci0JCQlyZXR1cm4gdHlwZS5vbWl0OwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2hvdWxkVGVybWluYXRlQXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBkZWMpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJCXJldHVybiB0eXBlLmluZGVudENoaWxkOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNKU1AoKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQotCS8vIGVsZW1lbnQgSURzCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0NSSVBUTEVUID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVhQUkVTU0lPTiA9IDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RFQ0xBUkFUSU9OID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSRUNUSVZFX1BBR0UgPSAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ESVJFQ1RJVkVfSU5DTFVERSA9IDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJUkVDVElWRV9UQUdMSUIgPSA1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VU0VCRUFOID0gNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VUUFJPUEVSVFkgPSA3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HRVRQUk9QRVJUWSA9IDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOQ0xVREUgPSA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GT1JXQVJEID0gMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BMVUdJTiA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QQVJBTVMgPSAxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRkFMTEJBQ0sgPSAxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSQU0gPSAxNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUk9PVCA9IDE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9URVhUID0gMTY7Ci0KLQkJcHVibGljIHN0YXRpYyBpbnQgZ2V0TnVtT2ZJZHMoKSB7Ci0JCQlpZiAobnVtb2ZpZHMgIT0gLTEpCi0JCQkJcmV0dXJuIG51bW9maWRzOwotCi0JCQkvLyBOT1RFOiBJZiB0aGUgcmVmbGVjdGlvbiBpcyB0b28gc2xvdywgdGhpcyBtZXRob2Qgc2hvdWxkCi0JCQkvLyBqdXN0IHJldHVybiB0aGUgbGl0ZXJhbCB2YWx1ZSwgbGlrZSAxMDUuCi0JCQkvLyAtLSA1LzI1LzIwMDEKLQkJCUNsYXNzIGNsYXp6ID0gSWRzLmNsYXNzOwotCQkJRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKLQkJCW51bW9maWRzID0gMDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBmaWVsZHNbaV0uZ2V0TmFtZSgpOwotCQkJCWlmIChuYW1lLnN0YXJ0c1dpdGgoIklEXyIpKS8vJE5PTi1OTFMtMSQKLQkJCQkJbnVtb2ZpZHMrKzsKLQkJCX0KLQkJCXJldHVybiBudW1vZmlkczsKLQkJfQotCi0JCS8vIGNoYWNoZSB0aGUgcmVzdWx0IG9mIHRoZSByZWZsZWN0aW9uLgotCQlwcml2YXRlIHN0YXRpYyBpbnQgbnVtb2ZpZHMgPSAtMTsKLQl9Ci0KLQkvLyBhdHRyaWJ1dGUgY3JlYXRlcgotCXByaXZhdGUgY2xhc3MgSkFDcmVhdGVyIGltcGxlbWVudHMgSlNQMTFOYW1lc3BhY2UgewotCQkvLyBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkJcHJpdmF0ZSBjbGFzcyBBdHRyRGVjbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gewotCQkJSFRNTENNRGF0YVR5cGVJbXBsIHR5cGUgPSBudWxsOwotCQkJaW50IHVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTDsKLQotCQkJLy8gbWV0aG9kcwotCQkJcHVibGljIEF0dHJEZWNsKFN0cmluZyBhdHRyTmFtZSkgewotCQkJCXN1cGVyKGF0dHJOYW1lKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRBdHRyTmFtZSgpIHsKLQkJCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQkJCX0KLQotCQkJcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCQkJcmV0dXJuIHR5cGU7Ci0JCQl9Ci0KLQkJCS8qKiBAZGVwcmVjYXRlZCBieSBzdXBlcmNsYXNzICovCi0JCQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJCQlpZiAodHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiB0eXBlLmdldEltcGxpZWRWYWx1ZSgpOwotCQkJfQotCi0JCQkvKiogQGRlcHJlY2F0ZWQgIGJ5IHN1cGVyY2xhc3MgKi8KLQkJCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSkpOwotCQkJCXJldHVybiB2LmVsZW1lbnRzKCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQkJcmV0dXJuIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT047Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCQkJcmV0dXJuIHVzYWdlOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJZ25vcmVDYXNlKCkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucyA9IG51bGw7Ci0KLQkJcHVibGljIEpBQ3JlYXRlcigpIHsKLQkJCWRlY2xhcmF0aW9ucyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJfQotCi0JCXB1YmxpYyBDTU5hbWVkTm9kZU1hcEltcGwgZ2V0RGVjbGFyYXRpb25zKGludCBlaWQpIHsKLQkJCXN3aXRjaCAoZWlkKSB7Ci0JCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1BBR0UgOgotCQkJCQljcmVhdGVGb3JEaXJQYWdlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9JTkNMVURFIDoKLQkJCQkJY3JlYXRlRm9yRGlySW5jbHVkZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfVEFHTElCIDoKLQkJCQkJY3JlYXRlRm9yRGlyVGFnbGliKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1VTRUJFQU4gOgotCQkJCQljcmVhdGVGb3JVc2VCZWFuKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSWRzLklEX1NFVFBST1BFUlRZIDoKLQkJCQkJY3JlYXRlRm9yU2V0UHJvcGVydHkoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfR0VUUFJPUEVSVFkgOgotCQkJCQljcmVhdGVGb3JHZXRQcm9wZXJ0eSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9JTkNMVURFIDoKLQkJCQkJY3JlYXRlRm9ySW5jbHVkZSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9GT1JXQVJEIDoKLQkJCQkJY3JlYXRlRm9yRm9yd2FyZCgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9QTFVHSU4gOgotCQkJCQljcmVhdGVGb3JQbHVnaW4oKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJZHMuSURfUEFSQU0gOgotCQkJCQljcmVhdGVGb3JQYXJhbSgpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIElkcy5JRF9ST09UIDoKLQkJCQkJY3JlYXRlRm9yUm9vdCgpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIGRlY2xhcmF0aW9uczsKLQkJfQotCi0JCXByaXZhdGUgQXR0ckRlY2wgY3JlYXRlQm9vbFR5cGUoU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZWYWx1ZSkgewotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChuYW1lKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RSVUUsIEFUVFJfVkFMVUVfRkFMU0V9OwotCQkJYWRlYy50eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIGRlZlZhbHVlKTsKLQkJCXJldHVybiBhZGVjOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclBhZ2UoKSB7Ci0JCQlBdHRyRGVjbCBhZGVjID0gbnVsbDsKLQkJCS8vICgibGFuZ3VhZ2UiIENEQVRBIERFQ0xBUkVEICJqYXZhIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0xBTkdVQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX0pBVkEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTEFOR1VBR0UsIGFkZWMpOwotCi0JCQkvLyAoImV4dGVuZHMiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9FWFRFTkRTKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9FWFRFTkRTLCBhZGVjKTsKLQotCQkJLy8gKCJjb250ZW50VHlwZSIgQ0RBVEEgREVDTEFSRUQgInRleHQvaHRtbDsgSVNPLTg4NTktMSIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT05URU5UX1RZUEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQ1RfREVGQVVMVCk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9DT05URU5UX1RZUEUsIGFkZWMpOwotCi0JCQkvLyAoImltcG9ydCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lNUE9SVCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSU1QT1JULCBhZGVjKTsKLQotCQkJLy8gKCJzZXNzaW9uIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAidHJ1ZSIpCi0JCQlhZGVjID0gY3JlYXRlQm9vbFR5cGUoQVRUUl9OQU1FX1NFU1NJT04sIEFUVFJfVkFMVUVfVFJVRSk7Ci0JCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1NFU1NJT04sIGFkZWMpOwotCi0JCQkvLyAoImJ1ZmZlciIgQ0RBVEEgREVDTEFSRUQgIjhrYiIpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9CVUZGRVIpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfQlVGU0laX0RFRkFVTFQpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQlVGRkVSLCBhZGVjKTsKLQotCQkJLy8gKCJhdXRvRmx1c2giIEVOVU0gREVDTEFSRUQgKHRydWV8ZmFsc2UpICJ0cnVlIikKLQkJCWFkZWMgPSBjcmVhdGVCb29sVHlwZShBVFRSX05BTUVfQVVUT0ZMVVNILCBBVFRSX1ZBTFVFX1RSVUUpOwotCQkJaWYgKGFkZWMgIT0gbnVsbCkKLQkJCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BVVRPRkxVU0gsIGFkZWMpOwotCi0JCQkvLyAoImlzVGhyZWFkU2FmZSIgRU5VTSBERUNMQVJFRCAodHJ1ZXxmYWxzZSkgInRydWUiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9JU19USFJFQURfU0FGRSwgQVRUUl9WQUxVRV9UUlVFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSVNfVEhSRUFEX1NBRkUsIGFkZWMpOwotCi0JCQkvLyAoImluZm8iIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9JTkZPKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JTkZPLCBhZGVjKTsKLQotCQkJLy8gKCJlcnJvclBhZ2UiIFVSSSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfRVJST1JfUEFHRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0VSUk9SX1BBR0UsIGFkZWMpOwotCi0JCQkvLyAoImlzRXJyb3JQYWdlIiBFTlVNIERFQ0xBUkVEICh0cnVlfGZhbHNlKSAiZmFsc2UiKQotCQkJYWRlYyA9IGNyZWF0ZUJvb2xUeXBlKEFUVFJfTkFNRV9JU19FUlJPUl9QQUdFLCBBVFRSX1ZBTFVFX0ZBTFNFKTsKLQkJCWlmIChhZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSVNfRVJST1JfUEFHRSwgYWRlYyk7Ci0KLQkJCS8vICgicGFnZUVuY29kaW5nIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFHRV9FTkNPRElORyk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUEFHRV9FTkNPRElORywgYWRlYyk7Ci0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVGb3JEaXJJbmNsdWRlKCkgewotCQkJLy8gKCJmaWxlIiBVUkkgUkVRVUlSRUQpOyBEZWZlY3QgVE9STzoxODUyNDEKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0ZJTEUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0ZJTEUsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckRpclRhZ2xpYigpIHsKLQkJCS8vICgidXJpIiBVUkkgUkVRVUlSRUQpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9VUkkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1VSSSwgYWRlYyk7Ci0KLQkJCS8vICgicHJlZml4IiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BSRUZJWCk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUkVGSVgsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclVzZUJlYW4oKSB7Ci0JCQkvLyAoImlkIiBJRCBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0lEKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5JRCk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0lELCBhZGVjKTsKLQotCQkJLy8gKCJzY29wZSIgRU5VTSBERUNMQVJFRCAocGFnZXxzZXNzaW9ufHJlcXVlc3R8YXBwbGljYXRpb24pICJwYWdlIikKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1NDT1BFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1BBR0UsIEFUVFJfVkFMVUVfU0VTU0lPTiwgQVRUUl9WQUxVRV9SRVFVRVNULCBBVFRSX1ZBTFVFX0FQUExJQ0FUSU9OfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhZGVjLnR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX1BBR0UpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfU0NPUEUsIGFkZWMpOwotCi0JCQkvLyAoImNsYXNzIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQ0xBU1MpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NMQVNTLCBhZGVjKTsKLQotCQkJLy8gKCJiZWFuTmFtZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0JFQU5fTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQkVBTl9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJ0eXBlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVFlQRSwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yU2V0UHJvcGVydHkoKSB7Ci0JCQkvLyAoIm5hbWUiIElEUkVGIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuSURSRUYpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJwcm9wZXJ0eSIgQ0RBVEEgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QUk9QRVJUWSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QUk9QRVJUWSwgYWRlYyk7Ci0KLQkJCS8vICgidmFsdWUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9WQUxVRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVkFMVUUsIGFkZWMpOwotCi0JCQkvLyAoInBhcmFtIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUEFSQU0pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BBUkFNLCBhZGVjKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckdldFByb3BlcnR5KCkgewotCQkJLy8gKCJuYW1lIiBJRFJFRiBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLklEUkVGKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfTkFNRSwgYWRlYyk7Ci0KLQkJCS8vICgicHJvcGVydHkiIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfUFJPUEVSVFkpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfUFJPUEVSVFksIGFkZWMpOwotCi0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9ySW5jbHVkZSgpIHsKLQkJCUF0dHJEZWNsIGFkZWMgPSBudWxsOwotCQkJLy8gKCJwYWdlIiBVUkkgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9QQUdFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9QQUdFLCBhZGVjKTsKLQotCQkJLy8gKCJmbHVzaCIgRU5VTSBSRVFVSVJFRCAodHJ1ZXxmYWxzZSkpOyBEZWZlY3QgVE9STzoxODUyNDEKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0ZMVVNIKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfVkFMVUVfVFJVRSwgQVRUUl9WQUxVRV9GQUxTRX07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfRkxVU0gsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvckZvcndhcmQoKSB7Ci0JCQkvLyAoInBhZ2UiIFVSSSBSRVFVSVJFRCkKLQkJCUF0dHJEZWNsIGFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1BBR0UpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1BBR0UsIGFkZWMpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclBsdWdpbigpIHsKLQkJCS8vICgidHlwZSIgRU5VTSBSRVFVSVJFRCAoYmVhbnxhcHBsZXQpKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVFlQRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0JFQU4sIEFUVFJfVkFMVUVfQVBQTEVUfTsKLQkJCWFkZWMudHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9UWVBFLCBhZGVjKTsKLQotCQkJLy8gKCJjb2RlIiBDREFUQSBSRVFVSVJFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX0NPREUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0NPREUsIGFkZWMpOwotCi0JCQkvLyAoImNvZGViYXNlIiBVUkkgUkVRVUlSRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9DT0RFQkFTRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJCWFkZWMudXNhZ2UgPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQ09ERUJBU0UsIGFkZWMpOwotCi0JCQkvLyAoImFsaWduIiBFTlVNIElNUExJRUQgKHRvcHxtaWRkbGV8Ym90dG9tfGxlZnR8cmlnaHQpKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfQUxJR04pOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gYWxpZ25zID0ge0FUVFJfVkFMVUVfVE9QLCBBVFRSX1ZBTFVFX01JRERMRSwgQVRUUl9WQUxVRV9CT1RUT00sIEFUVFJfVkFMVUVfTEVGVCwgQVRUUl9WQUxVRV9SSUdIVH07Ci0JCQlhZGVjLnR5cGUuc2V0RW51bVZhbHVlcyhhbGlnbnMpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfQUxJR04sIGFkZWMpOwotCi0JCQkvLyAoImFyY2hpdmUiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9BUkNISVZFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9BUkNISVZFLCBhZGVjKTsKLQotCQkJLy8gKCJoZWlnaHQiIENEQVRBIElNUExJRUQpCi0JCQlhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9IRUlHSFQpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX0hFSUdIVCwgYWRlYyk7Ci0KLQkJCS8vICgiaHNwYWNlIiBDREFUQSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSFNQQUNFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9IU1BBQ0UsIGFkZWMpOwotCi0JCQkvLyAoImpyZXZlcnNpb24iIENEQVRBIERFQ0xBUkVEICIxLjEiKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSlJFVkVSU0lPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy50eXBlLnNldEltcGxpZWRWYWx1ZShDTURhdGFUeXBlLklNUExJRURfVkFMVUVfREVGQVVMVCwgQVRUUl9WQUxVRV9KVkVSMTEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfSlJFVkVSU0lPTiwgYWRlYyk7Ci0KLQkJCS8vICgibmFtZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX05BTUUpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX05BTUUsIGFkZWMpOwotCi0JCQkvLyAoInZzcGFjZSIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZTUEFDRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShBVFRSX05BTUVfVlNQQUNFLCBhZGVjKTsKLQotCQkJLy8gKCJ3aWR0aCIgQ0RBVEEgSU1QTElFRCkKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1dJRFRIKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9XSURUSCwgYWRlYyk7Ci0KLQkJCS8vICgibnNwbHVnaW51cmwiIFVSSSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTlNQTFVHSU5VUkwpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OU1BMVUdJTlVSTCwgYWRlYyk7Ci0KLQkJCS8vICgiaWVwbHVnaW51cmwiIFVSSSBJTVBMSUVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfSUVQTFVHSU5VUkwpOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9JRVBMVUdJTlVSTCwgYWRlYyk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgY3JlYXRlRm9yUGFyYW0oKSB7Ci0JCQkvLyAoIm5hbWUiIENEQVRBIFJFUVVJUkVEKQotCQkJQXR0ckRlY2wgYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfTkFNRSk7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9OQU1FLCBhZGVjKTsKLQotCQkJLy8gKCJ2YWx1ZSIgQ0RBVEEgUkVRVUlSRUQpOyBEZWZlY3QgVE9STzoxODUyNDEKLQkJCWFkZWMgPSBuZXcgQXR0ckRlY2woQVRUUl9OQU1FX1ZBTFVFKTsKLQkJCWFkZWMudHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCQlhZGVjLnVzYWdlID0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRDsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1ZBTFVFLCBhZGVjKTsKLQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGNyZWF0ZUZvclJvb3QoKSB7Ci0JCQkvLyAoInhtbG5zOmpzcCIgQ0RBVEEgImh0dHA6Ly9qdmEuc3VuLmNvbS9KU1AvUGFnZSIpCi0JCQlBdHRyRGVjbCBhZGVjID0gbmV3IEF0dHJEZWNsKEFUVFJfTkFNRV9YTUxOU19KU1ApOwotCQkJYWRlYy50eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWFkZWMudHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfWE1MTlNfSlNQKTsKLQkJCWRlY2xhcmF0aW9ucy5wdXROYW1lZEl0ZW0oQVRUUl9OQU1FX1hNTE5TX0pTUCwgYWRlYyk7Ci0JCQkvLyAoInZlcnNpb24iIENEQVRBIFJFUVVJUkVEKQotCQkJYWRlYyA9IG5ldyBBdHRyRGVjbChBVFRSX05BTUVfVkVSU0lPTik7Ci0JCQlhZGVjLnR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYWRlYy51c2FnZSA9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQ7Ci0JCQlkZWNsYXJhdGlvbnMucHV0TmFtZWRJdGVtKEFUVFJfTkFNRV9WRVJTSU9OLCBhZGVjKTsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgc3RhdGljIENNTmFtZWROb2RlTWFwIEVNUFRZX01BUCA9IG5ldyBDTU5hbWVkTm9kZU1hcCgpIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBJdGVyYXRvcigpIHsKLQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBuZXh0KCkgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQkJfQotCQkJfTsKLQkJfQotCX07Ci0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gbmFtZXMgPSBudWxsOwotCi0Jc3RhdGljIHsKLQkJbmFtZXMgPSBuZXcgU3RyaW5nW0lkcy5nZXROdW1PZklkcygpXTsKLQkJbmFtZXNbSWRzLklEX1NDUklQVExFVF0gPSBTQ1JJUFRMRVQ7Ci0JCW5hbWVzW0lkcy5JRF9FWFBSRVNTSU9OXSA9IEVYUFJFU1NJT047Ci0JCW5hbWVzW0lkcy5JRF9ERUNMQVJBVElPTl0gPSBERUNMQVJBVElPTjsKLQkJbmFtZXNbSWRzLklEX0RJUkVDVElWRV9QQUdFXSA9IERJUkVDVElWRV9QQUdFOwotCQluYW1lc1tJZHMuSURfRElSRUNUSVZFX0lOQ0xVREVdID0gRElSRUNUSVZFX0lOQ0xVREU7Ci0JCW5hbWVzW0lkcy5JRF9ESVJFQ1RJVkVfVEFHTElCXSA9IERJUkVDVElWRV9UQUdMSUI7Ci0JCW5hbWVzW0lkcy5JRF9VU0VCRUFOXSA9IFVTRUJFQU47Ci0JCW5hbWVzW0lkcy5JRF9TRVRQUk9QRVJUWV0gPSBTRVRQUk9QRVJUWTsKLQkJbmFtZXNbSWRzLklEX0dFVFBST1BFUlRZXSA9IEdFVFBST1BFUlRZOwotCQluYW1lc1tJZHMuSURfSU5DTFVERV0gPSBJTkNMVURFOwotCQluYW1lc1tJZHMuSURfRk9SV0FSRF0gPSBGT1JXQVJEOwotCQluYW1lc1tJZHMuSURfUExVR0lOXSA9IFBMVUdJTjsKLQkJbmFtZXNbSWRzLklEX1BBUkFNU10gPSBQQVJBTVM7Ci0JCW5hbWVzW0lkcy5JRF9GQUxMQkFDS10gPSBGQUxMQkFDSzsKLQkJbmFtZXNbSWRzLklEX1BBUkFNXSA9IFBBUkFNOwotCQluYW1lc1tJZHMuSURfUk9PVF0gPSBST09UOwotCQluYW1lc1tJZHMuSURfVEVYVF0gPSBURVhUOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBKU1BFbGVtZW50Q29sbGVjdGlvbigpIHsKLQkJc3VwZXIobmFtZXMsIFRPTEVSQU5UX0NBU0UpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gZWxlbWVudE5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRWxlbURlY2woZ2V0SUQoZWxlbWVudE5hbWUpKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWlkIGludAotCSAqLwotCXByaXZhdGUgQ01Hcm91cEltcGwgY3JlYXRlQ29udGVudChpbnQgZWlkKSB7Ci0JCWlmIChlaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCUNNR3JvdXBJbXBsIGNvbnRlbnQgPSBudWxsOwotCQlDTU5vZGUgY2hpbGQgPSBudWxsOwotCi0JCXN3aXRjaCAoZWlkKSB7Ci0JCQljYXNlIElkcy5JRF9JTkNMVURFIDoKLQkJCWNhc2UgSWRzLklEX0ZPUldBUkQgOgotCQkJCS8vIChqc3A6cGFyYW0pKgotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfUEFSQU0pOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJLy8gKGpzcDpwYXJhbXMgfCBqc3A6ZmFsbGJhY2spPwotCQkJCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIDEpOwotCQkJCS8vIGpzcDpwYXJhbXMKLQkJCQljaGlsZCA9IGl0ZW0oSWRzLklEX1BBUkFNUyk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCS8vIGpzcDpmYWxsYmFjawotCQkJCWNoaWxkID0gaXRlbShJZHMuSURfRkFMTEJBQ0spOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKQotCQkJCQljb250ZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BBUkFNUyA6Ci0JCQkJLy8gKGpzcDpwYXJhbSkrCi0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCQkJY2hpbGQgPSBpdGVtKElkcy5JRF9QQVJBTSk7Ci0JCQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUk9PVCA6Ci0JCQkJLy8gJUJvZHk7Ci0JCQkJLy8gLS0+IChqc3A6dGV4dHwlRGlyZWN0aXZlczt8JVNjcmlwdHM7fCVBY3Rpb25zOykqCi0JCQkJLy8gICAgICVEaXJlY3RpdmVzIC0tPiBqc3A6ZGlyZWN0aXZlLnBhZ2V8anNwOmRpcmVjdGl2ZS5pbmNsdWRlCi0JCQkJLy8gICAgICVTY3JpcHRzOyAtLT4ganNwOnNjcmlwdGxldHxqc3A6ZGVjbGFyYXRpb258anNwOmV4cHJlc3Npb24KLQkJCQkvLyAgICAgJUFjdGlvbnMgLS0+IGpzcDp1c2VCZWFufGpzcC5zZXRQcm9wZXJ0eXxqc3A6Z2V0UHJvcGVydHkKLQkJCQkvLyAgICAgICAgICAgICAgICAgIHxqc3A6aW5jbHVkZXxqc3A6Zm9yd2FyZHxqc3A6cGx1Z2luCi0JCQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQkJCWludCB2YWxpZENoaWxkcmVuW10gPSB7SWRzLklEX1RFWFQsCi0JCQkJLy8gJURpcmVjdHZlczsKLQkJCQkJCQlJZHMuSURfRElSRUNUSVZFX1BBR0UsIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSwKLQkJCQkJCQkvLyAlU2NyaXB0czsKLQkJCQkJCQlJZHMuSURfU0NSSVBUTEVULCBJZHMuSURfREVDTEFSQVRJT04sIElkcy5JRF9FWFBSRVNTSU9OLAotCQkJCQkJCS8vICVBY3Rpb25zOwotCQkJCQkJCUlkcy5JRF9VU0VCRUFOLCBJZHMuSURfU0VUUFJPUEVSVFksIElkcy5JRF9HRVRQUk9QRVJUWSwgSWRzLklEX0lOQ0xVREUsIElkcy5JRF9GT1JXQVJELCBJZHMuSURfUExVR0lOfTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkQ2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCQkJY2hpbGQgPSBpdGVtKHZhbGlkQ2hpbGRyZW5baV0pOwotCQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlaWQgaW50Ci0JICovCi0JcHJpdmF0ZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUVsZW1EZWNsKGludCBlaWQpIHsKLQkJaWYgKGVpZCA9PSBJRF9VTktOT1dOKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVHlwZVBhY2tldCBwYWNrZXQgPSBuZXcgVHlwZVBhY2tldCgpOwotCQlzd2l0Y2ggKGVpZCkgewotCQkJY2FzZSBJZHMuSURfU0NSSVBUTEVUIDoKLQkJCQkvLyBjb250ZW50LCBvbWl0LCBsaW5lQnJlYWssIGxheW91dCwgY29ycmVjdCwgZm9ybWF0Ci0JCQkJLy8gc2NyaXB0bGV0Ci0JCQkJcGFja2V0Lm5hbWUgPSBTQ1JJUFRMRVQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfU0NSSVBUOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRVhQUkVTU0lPTiA6Ci0JCQkJLy8gZXhwcmVzc2lvbgotCQkJCXBhY2tldC5uYW1lID0gRVhQUkVTU0lPTjsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9TQ1JJUFQ7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ERUNMQVJBVElPTiA6Ci0JCQkJLy8gZGVjbGFyYXRpb24KLQkJCQlwYWNrZXQubmFtZSA9IERFQ0xBUkFUSU9OOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEE7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX1NDUklQVDsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0RJUkVDVElWRV9QQUdFIDoKLQkJCQkvLyBkaXJlY3RpdmUucGFnZQotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1BBR0U7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmZvcm1hdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uRk9STUFUX0pTUF9ESVJFQ1RJVkU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9ESVJFQ1RJVkVfSU5DTFVERSA6Ci0JCQkJLy8gZGlyZWN0aXZlLmlubGN1ZGUKLQkJCQlwYWNrZXQubmFtZSA9IERJUkVDVElWRV9JTkNMVURFOwotCQkJCXBhY2tldC5vbWl0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORDsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCXBhY2tldC5mb3JtYXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9KU1BfRElSRUNUSVZFOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRElSRUNUSVZFX1RBR0xJQiA6Ci0JCQkJLy8gZGlyZWN0aXZlLnRhZ2xpYgotCQkJCXBhY2tldC5uYW1lID0gRElSRUNUSVZFX1RBR0xJQjsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuZm9ybWF0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5GT1JNQVRfSlNQX0RJUkVDVElWRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1VTRUJFQU4gOgotCQkJCS8vIHVzZUJlYW4KLQkJCQlwYWNrZXQubmFtZSA9IFVTRUJFQU47Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfU0VUUFJPUEVSVFkgOgotCQkJCS8vIHNldFByb3BlcnR5Ci0JCQkJcGFja2V0Lm5hbWUgPSBTRVRQUk9QRVJUWTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0dFVFBST1BFUlRZIDoKLQkJCQkvLyBnZXRQcm9wZXJ0eQotCQkJCXBhY2tldC5uYW1lID0gR0VUUFJPUEVSVFk7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9JTkNMVURFIDoKLQkJCQkvLyBpbmNsdWRlCi0JCQkJcGFja2V0Lm5hbWUgPSBJTkNMVURFOwotCQkJCXBhY2tldC5jb250ZW50ID0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX09CSkVDVDsKLQkJCQlwYWNrZXQuaW5kZW50Q2hpbGQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfRk9SV0FSRCA6Ci0JCQkJLy8gZm9yd2FyZAotCQkJCXBhY2tldC5uYW1lID0gRk9SV0FSRDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0Lm9taXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BMVUdJTiA6Ci0JCQkJLy8gcGx1Z2luCi0JCQkJcGFja2V0Lm5hbWUgPSBQTFVHSU47Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1BBUkFNUyA6Ci0JCQkJLy8gcGFyYW1zCi0JCQkJcGFja2V0Lm5hbWUgPSBQQVJBTVM7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCQkJCXBhY2tldC5sYXlvdXQgPSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU47Ci0JCQkJcGFja2V0LmluZGVudENoaWxkID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX0ZBTExCQUNLIDoKLQkJCQkvLyBmYWxsYmFjawotCQkJCXBhY2tldC5uYW1lID0gRkFMTEJBQ0s7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQkJCQlwYWNrZXQubGF5b3V0ID0gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJZHMuSURfUEFSQU0gOgotCQkJCS8vIHBhcmFtCi0JCQkJcGFja2V0Lm5hbWUgPSBQQVJBTTsKLQkJCQlwYWNrZXQub21pdCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSWRzLklEX1JPT1QgOgotCQkJCXBhY2tldC5uYW1lID0gUk9PVDsKLQkJCQlwYWNrZXQuY29udGVudCA9IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JCQkJcGFja2V0LmxheW91dCA9IEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0hJRERFTjsgLy8gc2FtZSBhcyBIVE1MCi0JCQkJYnJlYWs7Ci0JCQljYXNlIElkcy5JRF9URVhUIDoKLQkJCQlwYWNrZXQubmFtZSA9IFRFWFQ7Ci0JCQkJcGFja2V0LmNvbnRlbnQgPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEE7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyB1bmtub3duIElECi0JCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlFbGVtRGVjbCBkZWMgPSBuZXcgRWxlbURlY2wocGFja2V0KTsKLQotCQlDTUdyb3VwSW1wbCBjb250ZW50ID0gY3JlYXRlQ29udGVudChlaWQpOwotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJZGVjLnNldENvbnRlbnQoY29udGVudCk7Ci0KLQkJSkFDcmVhdGVyIGNyZWF0ZXIgPSBuZXcgSkFDcmVhdGVyKCk7Ci0JCWRlYy5zZXRBdHRyaWJ1dGVzKGNyZWF0ZXIuZ2V0RGVjbGFyYXRpb25zKGVpZCkpOwotCi0JCXJldHVybiBkZWM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2JhNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0KLS8qKgotICogUHJvcGVydHlQcm92aWRlciBjbGFzcy4KLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGluc3RhbmNlcy4KLSAqLwotaW50ZXJmYWNlIFByb3BlcnR5UHJvdmlkZXIgewotCi0JYm9vbGVhbiBzdXBwb3J0cyhIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKTsKLQotCU9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Qcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGUyNjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IG9iamVjdCBvZiBQcm9wZXJ0eVByb3ZpZGVyLgotICovCi1maW5hbCBjbGFzcyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSB7Ci0KLQotCS8qKgotCSAqIERlZmF1bHRQcm92aWRlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciB1bmtub3duIHByb3BlcnRpZXMuCi0JICogSXQgYWx3YXlzIHJldHVybnMgbnVsbCB2YWx1ZSBmb3IgYW55IHByb3BlcnRpZXMuCi0JICovCi0JY2xhc3MgRGVmYXVsdFByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBEZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiAoZWRlY2wgIT0gbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlpZiAoIShlZGVjbCBpbnN0YW5jZW9mIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBnZXRFbGVtZW50UHJvcGVydHkoKEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKWVkZWNsKTsKLQkJfQotCi0JCWFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpOwotCX0KLQotCS8qCi0JICogInRhZ0luZm8iCi0JICogZ2V0cyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZWxlbWVudAotCSAqLwotCWNsYXNzIFBQVGFnSW5mbyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaHRtbEFubm90YXRpb25Mb2MgPSAiZGF0YS9odG1yZWYueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBmQW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0KLQkJcHVibGljIFBQVGFnSW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0cyB0aGUgYW5ub3RhdGlvbk1hcC4KLQkJICogQHJldHVybiBSZXR1cm5zIGEgQW5ub3RhdGlvbk1hcAotCQkgKi8KLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLQkJCWlmIChmQW5ub3RhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQkJZkFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQkJCXRyeSB7Ci0JCQkJCWZBbm5vdGF0aW9uTWFwLmxvYWQoaHRtbEFubm90YXRpb25Mb2MsIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBubyBhbm5vdGF0aW9uIGF2YWlsYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmQW5ub3RhdGlvbk1hcDsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCXJldHVybiBnZXRBbm5vdGF0aW9uTWFwKCkuZ2V0UHJvcGVydHkoKChIVE1MRWxlbWVudERlY2xhcmF0aW9uKWRlY2wpLmdldEVsZW1lbnROYW1lKCksICJ0YWdJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJzaG91bGRLZWVwU3BhY2UiCi0JICovCi0JY2xhc3MgUFBTaG91bGRLZWVwU3BhY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkS2VlcFNwYWNlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLnNob3VsZEtlZXBTcGFjZXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEluZGVudENoaWxkU291cmNlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLnNob3VsZEluZGVudENoaWxkU291cmNlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAidGVybWluYXRvcnMiCi0JICovCi0JY2xhc3MgUFBUZXJtaW5hdG9ycyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBUZXJtaW5hdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlpZiAoISAoZGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtRGVjbEltcGwpKSByZXR1cm4gbnVsbDsKLQkJCXJldHVybiAoKEhUTUxFbGVtRGVjbEltcGwpZGVjbCkuZ2V0VGVybWluYXRvcnMoKTsKLQkJfQotCX0KLQotCS8qCi0JICogInByb2hpYml0ZWRBbmNlc3RvcnMiCi0JICovCi0JY2xhc3MgUFBQcm9oaWJpdGVkQW5jZXN0b3JzIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIGRlY2wuZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNKU1AiCi0JICovCi0JY2xhc3MgUFBJc0pTUCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc0pTUCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZGVjbC5pc0pTUCgpKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzWEhUTUwiCi0JICogSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpdHNlbGYgbmV2ZXIgcmVwcmVzZW50IGFueSBYSFRNTCBlbGVtZW50IGRlY2xhcmF0aW9uLgotCSAqIFNvLCB0aGlzIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNYSFRNTCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJc1hIVE1MKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc1NTSSIKLQkgKiBFYWNoIGRlY2xhcmF0aW9uIGNsYXNzIGZvciBTU0kgZWxlbWVudHMgbXVzdCBwcm92aWRlIHRoaXMgcHJvcGVydHkgaXRzZWxmLAotCSAqIGFuZCB0aGVuIHJldHVybiB0cnVlLiAgT3RoZXIgZGVjbGFyYXRpb24gbXVzdCBhbHdheXMgcmV0dXJuIGZhbHNlLgotCSAqLwotCWNsYXNzIFBQSXNTU0kgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSXNTU0koKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qCi0JICogImxpbmVCcmVha0hpbnQiCi0JICovCi0JY2xhc3MgUFBMaW5lQnJlYWtIaW50IGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUExpbmVCcmVha0hpbnQoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIGhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExpbmVCcmVha0hpbnQoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19BRlRFUl9TVEFSVCA6Ci0JCQkJCWhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19BRlRFUl9TVEFSVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EIDoKLQkJCQkJaGludCA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBoaW50OwotCQl9Ci0JfQotCi0JLyoKLQkgKiAibGF5b3V0VHlwZSIKLQkgKi8KLQljbGFzcyBQUExheW91dFR5cGUgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQTGF5b3V0VHlwZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldExheW91dFR5cGUoKSkgewotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQkxPQ0sgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0JMT0NLOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JSRUFLIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9CUkVBSzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX0hJRERFTjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9PQkpFQ1QgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuTEFZT1VUX09CSkVDVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9XUkFQIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9XUkFQOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8uCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCQkJcmV0dXJuIHR5cGU7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJvbWl0VHlwZSIKLQkgKi8KLQljbGFzcyBQUE9taXRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUE9taXRUeXBlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyB0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FOwotCQkJc3dpdGNoIChkZWNsLmdldE9taXRUeXBlKCkpIHsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9CT1RIIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfQk9USDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfREVGQVVMVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9FTkRfTVVTVCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUOwotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uT01JVF9OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaW5jbHVzaW9uIgotCSAqLwotCWNsYXNzIFBQSW5jbHVzaW9uIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUEluY2x1c2lvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gZGVjbC5nZXRJbmNsdXNpb24oKTsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydHlQcm92aWRlciBnZXRQcm92aWRlcihTdHJpbmcgcHJvcE5hbWUpIHsKLQkJUHJvcGVydHlQcm92aWRlckZhY3RvcnkgZmFjdG9yeSA9IGdldEluc3RhbmNlKCk7Ci0JCVByb3BlcnR5UHJvdmlkZXIgcHAgPSAoUHJvcGVydHlQcm92aWRlcikgZmFjdG9yeS5yZWdpc3RyeS5nZXQocHJvcE5hbWUpOwotCQlpZiAocHAgIT0gbnVsbCkKLQkJCXJldHVybiBwcDsKLQotCQlwcCA9IGZhY3RvcnkuY3JlYXRlKHByb3BOYW1lKTsKLQkJaWYgKHBwID09IG51bGwpCi0JCQlyZXR1cm4gZmFjdG9yeS5kZWZhdWx0UHJvdmlkZXI7Ci0KLQkJZmFjdG9yeS5yZWdpc3RyeS5wdXQocHJvcE5hbWUsIHBwKTsKLQkJcmV0dXJuIHBwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgc3luY2hyb25pemVkIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IFByb3BlcnR5UHJvdmlkZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIEhhc2h0YWJsZSByZWdpc3RyeSA9IG5ldyBIYXNodGFibGUoKTsKLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgZGVmYXVsdFByb3ZpZGVyID0gbmV3IERlZmF1bHRQcm92aWRlcigpOwotCi0JcHJpdmF0ZSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFByb3BlcnR5UHJvdmlkZXIgY3JlYXRlKFN0cmluZyBwcm9wTmFtZSkgewotCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gbnVsbDsKLQkJaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpCi0JCQlwcCA9IG5ldyBQUElzSlNQKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXBwID0gbmV3IFBQSXNYSFRNTCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcHAgPSBuZXcgUFBJc1NTSSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5MQVlPVVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUExheW91dFR5cGUoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkKLQkJCXBwID0gbmV3IFBQTGluZUJyZWFrSGludCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUykpCi0JCQlwcCA9IG5ldyBQUFByb2hpYml0ZWRBbmNlc3RvcnMoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRLZWVwU3BhY2UoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UpKQotCQkJcHAgPSBuZXcgUFBTaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUykpCi0JCQlwcCA9IG5ldyBQUFRlcm1pbmF0b3JzKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlRBR0lORk8pKQotCQkJcHAgPSBuZXcgUFBUYWdJbmZvKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlwcCA9IG5ldyBQUE9taXRUeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTikpCi0JCQlwcCA9IG5ldyBQUEluY2x1c2lvbigpOwotCi0JCXJldHVybiBwcDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9BdHRyaWJ1dGVDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyODIwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0F0dHJpYnV0ZUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEZhY3RvcnkgZm9yIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEF0dHJpYnV0ZUNvbGxlY3Rpb24gZXh0ZW5kcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDSFRNTE5hbWVzcGFjZSB7Ci0JLyoqCi0JICogY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIEF0dHJpYnV0ZUNvbGxlY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByaXZhdGUgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGUoU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0KLQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FDVElPTikpIHsKLQkJCS8vIChhY3Rpb24gJVVSSSAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9BQ1RJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0FMVCkpIHsKLQkJCS8vIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5URVhUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9CT1JERVIpKSB7Ci0JCQkvLyAoYm9yZGVyICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0JPUkRFUiwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0hFQ0tFRCkpIHsKLQkJCS8vIChjaGVja2VkIChjaGVja2VkKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9DSEVDS0VEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQ0hFQ0tFRCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfQ0xFQVIpKSB7Ci0JCQkvLyAoY2xlYXIgKGxlZnQgfCBhbGwgfCByaWdodCB8IG5vbmUpIG5vbmUpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQUxMLCBBVFRSX1ZBTFVFX1JJR0hULCBBVFRSX1ZBTFVFX05PTkV9OwotCQkJYXR5cGUuc2V0RW51bVZhbHVlcyh2YWx1ZXMpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBBVFRSX1ZBTFVFX05PTkUpOwotCi0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NMRUFSLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9DT0xTKSkgewotCQkJLy8gKGNvbHMgTlVNQkVSICNSRVFVSVJFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0NPTFMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0VOQ1RZUEUpKSB7Ci0JCQkvLyAoZW5jdHlwZSAlQ29udGVudFR5cGU7ICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkNPTlRFTlRfVFlQRSk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0VOQ1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX0hFSUdIVCkpIHsKLQkJCS8vIChoZWlnaHQgJUxlbmd0aDsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTEVOR1RIKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfSEVJR0hULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IUkVGKSkgewotCQkJLy8gKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5VUkkpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9IUkVGLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9IU1BBQ0UpKSB7Ci0JCQkvLyAoaHNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfSFRUUF9FUVVJVikpIHsKLQkJCS8vIChodHRwLWVxdWl2IE5BTUUgI0lNUExJRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoSFRNTENNRGF0YVR5cGUuTkFNRSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0hUVFBfRVFVSVYsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX01BWExFTkdUSCkpIHsKLQkJCS8vIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuTlVNQkVSKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUFYTEVOR1RILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NRVRIT0QpKSB7Ci0JCQkvLyAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9WQUxVRV9HRVQsIEFUVFJfVkFMVUVfUE9TVH07Ci0JCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0JCQlhdHlwZS5zZXRJbXBsaWVkVmFsdWUoQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQsIEFUVFJfVkFMVUVfR0VUKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTUVUSE9ELCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9NVUxUSVBMRSkpIHsKLQkJCS8vIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX01VTFRJUExFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTVVMVElQTEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX05BTUUpKSB7Ci0JCQkvLyAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTkFNRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfTk9TSEFERSkpIHsKLQkJCS8vIChub3NoYWRlIChub3NoYWRlKSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQkJU3RyaW5nW10gdmFsdWVzID0ge0FUVFJfTkFNRV9OT1NIQURFfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfTk9TSEFERSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfUk9XUykpIHsKLQkJCS8vIChyb3dzIE5VTUJFUiAjUkVRVUlSRUQpCi0JCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9ST1dTLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TRUxFQ1RFRCkpIHsKLQkJCS8vIChzZWxlY3RlZCAoc2VsZWN0ZWQpICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuRU5VTSk7Ci0JCQlTdHJpbmdbXSB2YWx1ZXMgPSB7QVRUUl9OQU1FX1NFTEVDVEVEfTsKLQkJCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfU0VMRUNURUQsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1NJWkUpKSB7Ci0JCQkvLyAoc2l6ZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5QSVhFTFMpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9TUkMpKSB7Ci0JCQkvLyAoc3JjICVVUkk7ICNJTVBMSUVEKQotCQkJLy8gTk9URTogInNyYyIgYXR0cmlidXRlcyBhcmUgZGVmaW5lZCBpbiBzZXZlcmFsIGVsZW1lbnRzLgotCQkJLy8JCSBUaGUgZGVmaW5pdGlvbiBvZiBJTUcgaXMgZGlmZmVyZW50IGZyb20gb3RoZXJzLgotCQkJLy8JCSBTbywgaXQgc2hvdWxkIGJlIGxvY2FsbHkgZGVmaW5lZC4KLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLlVSSSk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1NSQywgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCX0KLQkJZWxzZSBpZiAoYXR0ck5hbWUuZXF1YWxzSWdub3JlQ2FzZShBVFRSX05BTUVfVFlQRSkpIHsKLQkJCS8vICh0eXBlICVDb3RlbnRUeXBlOyAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5DT05URU5UX1RZUEUpOwotCQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKEFUVFJfTkFNRV9UWVBFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WQUxVRSkpIHsKLQkJCS8vICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkJCWF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkNEQVRBKTsKLQkJCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfVkFMVUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1ZFUlNJT04pKSB7Ci0JCQkvLyAodmVyc2lvbiBDREFUQSAjRklYRUQgJyVIVE1MLlZlcnNpb247KQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCwgQVRUUl9WQUxVRV9WRVJTSU9OX1RSQU5TSVRJT05BTCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZFUlNJT04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLkZJWEVEKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoQVRUUl9OQU1FX1dJRFRIKSkgewotCQkJLy8gKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLkxFTkdUSCk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1dJRFRILCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0KLQkJfQotCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFUVFJfTkFNRV9WU1BBQ0UpKSB7Ci0JCQkvLyAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKEhUTUxDTURhdGFUeXBlLlBJWEVMUyk7Ci0JCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX1ZTUEFDRSwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCi0JCQkvLyA8PEQyMDU1MTQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHVua25vd24gYXR0cmlidXRlOyBtYXliZSBlcnJvci4KLQkJCS8vIHNob3VsZCB3YXJuLgotCQkJYXR0ciA9IG51bGw7Ci0JCX0KLQotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWJvZHljb2xvcnM7IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRCb2R5Y29sb3JzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYWxpZ24gYXR0cmlidXRlIHdoaWNoIGhhcyAlSUFsaWduOyBhcyB2YWx1ZXMuLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgSFRNTEF0dHJEZWNsSW1wbCBjcmVhdGVBbGlnbkZvckltYWdlKCkgewotCQkvLyBhbGlnbiAobG9jYWwpCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzCi0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX1RPUCwgQVRUUl9WQUxVRV9NSURETEUsIEFUVFJfVkFMVUVfQk9UVE9NLCBBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfUklHSFR9OwotCQlhdHlwZS5zZXRFbnVtVmFsdWVzKHZhbHVlcyk7Ci0KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gZm9yIDxjb2RlPmFsaWduPC9jb2RlPgotCSAqIGluIHNldmVyYWwgZWxlbWVudHMsIGxpa2UgPGNvZGU+UDwvY29kZT4sIDxjb2RlPkRJVjwvY29kZT4uCi0JICogVGhlIHZhbHVlcyBhcmUgZGlmZmVyZW50IGZyb20gYXR0cmlidXRlcyB0aG9zZSBoYXZlIHRoZSBzYW1lIG5hbWUKLQkgKiBpbiBvdGhlciBlbGVtZW50cyAoPGNvZGU+SU1HPC9jb2RlPiBhbmQgPGNvZGU+VEFCTEU8L2NvZGU+KS4KLQkgKiBTbywgaXQgY2FuJ3QgdHJlYXQgYXMgZ2xvYmFsIGF0dHJpYnV0ZXMuCi0JICogPHN0cm9uZz5OT1RFOiBUaGVzZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24gaGFzCi0JICogbm8gb3duZXIgQ01Eb2N1bWVudCBpbnN0YW5jZS48L3N0cm9uZz4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEhUTUxBdHRyRGVjbEltcGwgY3JlYXRlQWxpZ25Gb3JQYXJhZ3JhcGgoKSB7Ci0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJLy8gc2V0IGVudW0gdmFsdWVzOiBsZWZ0fGNlbnRlcnxyaWdodHxqdXN0aWZ5Ci0JCVN0cmluZ1tdIHZhbHVlcyA9IHtBVFRSX1ZBTFVFX0xFRlQsIEFUVFJfVkFMVUVfQ0VOVEVSLCBBVFRSX1ZBTFVFX1JJR0hULH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChBVFRSX05BTUVfQUxJR04sIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogR2V0ICVhdHRyczsgZGVjbGFyYXRpb25zLgotCSAqICVhdHRyczsgY29uc2lzdHMgb2YgJWNvcmVhdHRyczssICVpMThuLCBhbmQgJWV2ZW50czsuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0QXR0cnMoQ01OYW1lZE5vZGVNYXBJbXBsIGRlY2xhcmF0aW9ucykgewotCX0KLQotCS8qKgotCSAqIEdldCAlY29yZWF0dHJzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0Q29yZShDTU5hbWVkTm9kZU1hcEltcGwgZGVjbGFyYXRpb25zKSB7Ci0JfQotCi0JLyoqCi0JICogR2V0IGEgZ2xvYmFsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbi4KLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCUNNTm9kZSBjbW5vZGUgPSBnZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQlpZiAoY21ub2RlICE9IG51bGwpCi0JCQlyZXR1cm4gKEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbikgY21ub2RlOyAvLyBhbHJlYWR5IGV4aXN0cy4KLQotCQlIVE1MQXR0ckRlY2xJbXBsIGRlYyA9IGNyZWF0ZShhdHRyTmFtZSk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCXB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQotCQlyZXR1cm4gZGVjOwotCX0KLQotCS8qKgotCSAqIEdldCBkZWNsYXJhdGlvbnMgd2hpY2ggYXJlIHNwZWNpZmllZCBieSBuYW1lcy4KLQkgKiBAcGFyYW0gbmFtZXMgamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RGVjbGFyYXRpb25zKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHQoKTsKLQkJCUhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBkZWMgPSBnZXREZWNsYXJhdGlvbihhdHRyTmFtZSk7Ci0JCQlpZiAoZGVjICE9IG51bGwpCi0JCQkJZGVjbGFyYXRpb25zLnB1dE5hbWVkSXRlbShhdHRyTmFtZSwgZGVjKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCAlZXZlbnRzOyBkZWNsYXJhdGlvbnMuCi0JICovCi0JcHVibGljIHZvaWQgZ2V0RXZlbnRzKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgJWkxOG47IGRlY2xhcmF0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBnZXRJMThuKENNTmFtZWROb2RlTWFwSW1wbCBkZWNsYXJhdGlvbnMpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSENNRG9jSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSENNRG9jSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWJmNDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ0hDTURvY0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENNRG9jdW1lbnQgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBIVE1MLgotICovCi1wdWJsaWMgY2xhc3MgQ0hDTURvY0ltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgSFRNTENNRG9jdW1lbnQgewotCi0JLyoqIE5hbWVzcGFjZSBmb3IgYWxsIG5hbWVzIG9mIGVsZW1lbnRzLCBlbnRpdGllcyBhbmQgYXR0cmlidXRlcy4gKi8KLQlwcml2YXRlIENNTmFtZXNwYWNlIG5hbWVzcGFjZSA9IG51bGw7Ci0JcHJpdmF0ZSBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50cyA9IG51bGw7Ci0JcHJpdmF0ZSBFbnRpdHlDb2xsZWN0aW9uIGVudGl0aWVzID0gbnVsbDsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlcyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ0hDTURvY0ltcGwoU3RyaW5nIGRvY1R5cGVOYW1lLCBDTU5hbWVzcGFjZSB0YXJnZXROYW1lc3BhY2UpIHsKLQkJc3VwZXIoZG9jVHlwZU5hbWUpOwotCQluYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JCWF0dHJpYnV0ZXMgPSBuZXcgQXR0cmlidXRlQ29sbGVjdGlvbigpOwotCQllbGVtZW50cyA9IG5ldyBFbGVtZW50Q29sbGVjdGlvbihhdHRyaWJ1dGVzKTsKLQkJZW50aXRpZXMgPSBuZXcgRW50aXR5Q29sbGVjdGlvbigpOwotCX0KLQotCUF0dHJpYnV0ZUNvbGxlY3Rpb24gZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIGF0dHJpYnV0ZXM7Ci0JfQotCi0JcHVibGljIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGVsZW1lbnRzLmdldE5hbWVkSXRlbShlbGVtZW50TmFtZSk7Ci0JfQotCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gZW50aXRpZXM7Ci0JfQotCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiBnZXRFbnRpdHlEZWNsYXJhdGlvbihTdHJpbmcgZW50aXR5TmFtZSkgewotCQlpZiAoZW50aXRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbnRpdHlEZWNsYXJhdGlvbikgZW50aXRpZXMuZ2V0TmFtZWRJdGVtKGVudGl0eU5hbWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NIVE1MTmFtZXNwYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZDVjMjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DSFRNTE5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLQotCi0KLS8qKgotICogUHJvdmlkZSBhbGwgbmFtZXMgZGVmaW5lZCBpbiB0aGUgSFRNTCA0LjA/IHNwZWNpZmljYXRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ0hUTUxOYW1lc3BhY2UgewotCi0JLy8gRWxlbWVudCBuYW1lcwotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEVsZW1lbnROYW1lIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5BOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBRERSRVNTID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1M7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0UgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkxPQ0tRVU9URSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT0RZID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJSID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDRU5URVIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQ0VOVEVSOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElSID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElWID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJVjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREwgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuREw7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk07Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEgxID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIMiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDMgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEg0ID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBINSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5INTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSDYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQUQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFIgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUwgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5QVVQgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSU5QVVQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExJID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRU5VID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0wgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0w7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTiA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT047Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFAgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuUDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlBSRTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VMRUNUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNFTEVDVDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVEFSRUEgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJVExFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0NPTkZJRyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfQ09ORklHOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRUNITyA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX0VYRUMgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VYRUM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GU0laRSA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRlNJWkU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9GTEFTVE1PRCA9IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRkxBU1RNT0Q7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTSV9JTkNMVURFID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfUFJJTlRFTlYgPSBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfU0VUID0gSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9TRVQ7Ci0JfQotCi0JLy8gQ2hhcmFjdGVyIEVudGl0aWVzCi0JcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRW50aXR5TmFtZSB7Ci0JfQotCi0JLy8gZ2xvYmFsIGF0dHJpYnV0ZSBuYW1lcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WRVJTSU9OID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WRVJTSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TUkMgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQUxUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hFSUdIVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSEVJR0hUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9XSURUSCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEg7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FMSUdOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQk9SREVSID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9CT1JERVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hTUEFDRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFNQQUNFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9WU1BBQ0UgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTkFNRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0xFQVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9OT1NIQURFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9OT1NIQURFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DSEVDS0VEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9DSEVDS0VEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NQVhMRU5HVEggPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01BWExFTkdUSDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSVNUWUxFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0hUVFBfRVFVSVYgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0hUVFBfRVFVSVY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTlRFTlQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTlRFTlQ7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfSFJFRiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfTVVMVElQTEUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01VTFRJUExFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9TRUxFQ1RFRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0VMRUNURUQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX1JPV1MgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1M7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NPTFMgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NPTFM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0FDVElPTiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9NRVRIT0QgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX01FVEhPRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRU5DVFlQRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRU5DVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVFlQRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFMVUUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBTFVFOwotCi0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9FUlJNU0cgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0VSUk1TRzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfU0laRUZNVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU0laRUZNVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVElNRUZNVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVElNRUZNVDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVkFSID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9WQVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FX0NHSSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfQ0dJOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfTkFNRV9DTUQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX0NNRDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfRklMRSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfRklMRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfVklSVFVBTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVklSVFVBTDsKLQotCS8vIGdsb2JhbCBhdHRyaWJ1dGUgdmFsdWVzOyBtYWlubHkgdXNlZCBpbiBlbnVtZXJhdGlvbi4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1ZFUlNJT05fVFJBTlNJVElPTkFMID0gIi0vL1czQy8vRFREIENvbXBhY3QgSFRNTCAxLjAgRHJhZnQvL0VOIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgZm9yIGFsaWduICh0b3B8bWlkZGxlfGJvdHRvbXxsZWZ0fHJpZ2h0KQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVE9QID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfVE9QOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTUlERExFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfTUlERExFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQk9UVE9NID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQk9UVE9NOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfTEVGVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0xFRlQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9DRU5URVIgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DRU5URVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SSUdIVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JJR0hUOwotCS8vICAgZm9yIGNsZWFyIChsZWZ0fGFsbHxyaWdodHxub25lKTogbGVmdCBhbmQgcmlnaHQgYXJlIGFscmVhZHkgZGVmaW5lZCBhYm92ZS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX0FMTCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0FMTDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX05PTkUgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9OT05FOwotCS8vICAgZm9yIHR5cGUgb2YgSU5QVVQKLQkvLyAgICAgICAodGV4dCB8IHBhc3N3b3JkIHwgY2hlY2tib3ggfCByYWRpbyB8IHN1Ym1pdCB8IHJlc2V0IHwKLQkvLyAgICAgICAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfVEVYVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9QQVNTV09SRCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BBU1NXT1JEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQ0hFQ0tCT1ggPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFX1JBRElPID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkFESU87Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TVUJNSVQgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TVUJNSVQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9SRVNFVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1JFU0VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfSElEREVOID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfSElEREVOOwotCS8vICAgZm9yIHNwYW4sIGNvbHNwYW4sIHJvd3NwYW4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1ZBTFVFXzEgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV8xOwotCS8vICAgZm9yIGZyYW1lYm9yZGVyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV8wID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfMDsKLQkvLyAgIGZvciBtZXRob2Qgb2YgRk9STQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfR0VUID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfR0VUOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfUE9TVCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1BPU1Q7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9XV1dfRk9STV9VUkxFTkNPREVEID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfV1dXX0ZPUk1fVVJMRU5DT0RFRDsKLQkvLyAgIGZvciBiZWhhdmlybyBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TQ1JPTEwgPSBIVE1MNDBOYW1lc3BhY2UuQVRUUl9WQUxVRV9TQ1JPTEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9TTElERSA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1NMSURFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfQUxURVJOQVRFID0gSFRNTDQwTmFtZXNwYWNlLkFUVFJfVkFMVUVfQUxURVJOQVRFOwotCS8vICAgZm9yIGRpcmVjdGlvbiBvZiBNQVJRVUVFCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9WQUxVRV9VUCA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX1VQOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVkFMVUVfRE9XTiA9IEhUTUw0ME5hbWVzcGFjZS5BVFRSX1ZBTFVFX0RPV047Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUNvbnRlbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhiNzk2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNQ29udGVudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIENNQ29udGVudCBmb3IgSFRNTCBDTS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Db250ZW50SW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5ERUQgPSAtMTsKLQkvKiogIC0xOiBpdCdzIFVOQk9VTkRFRC4gKi8KLQlwcml2YXRlIGludCBtYXhPY2N1ciA9IFVOQk9VTkRFRDsKLQkvKiogIDA6IGl0J3MgT1BUSU9OQUwsIDEsIGl0J3MgUkVRVUlSRUQuICovCi0JcHJpdmF0ZSBpbnQgbWluT2NjdXIgPSAwOwotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgY29uc3R1cmN0b3IuCi0JICogVXNlIHRoaXMgb25lIGZvciB1c3VhbCBjYXNlcy48YnI+Ci0JICovCi0JcHVibGljIENNQ29udGVudEltcGwoU3RyaW5nIG5hbWUsIGludCBtaW4sIGludCBtYXgpIHsKLQkJc3VwZXIobmFtZSk7Ci0JCW1pbk9jY3VyID0gbWluOwotCQltYXhPY2N1ciA9IG1heDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNYXhPY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiBtYXhPY2N1cjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRNaW5PY2N1ciBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4KLQkgKiBJZiAxLCBpdCdzIFJFUVVJUkVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKSB7Ci0JCXJldHVybiBtaW5PY2N1cjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUdyb3VwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTUdyb3VwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTJiM2VkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01Hcm91cEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotLyoqCi0gKi8KLWNsYXNzIENNR3JvdXBJbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIENNR3JvdXAgewotCi0JcHJpdmF0ZSBpbnQgb3BlcmF0b3IgPSBDTUdyb3VwLlNFUVVFTkNFOwotCXByaXZhdGUgQ01Ob2RlTGlzdEltcGwgY2hpbGRyZW4gPSBudWxsOwotCi0JLyoqCi0JICogQ01Hcm91cEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Hcm91cEltcGwoaW50IG9wLCBpbnQgbWluT2NjdXIsIGludCBtYXhPY2N1cikgewotCQlzdXBlcihudWxsLCBtaW5PY2N1ciwgbWF4T2NjdXIpOwotCQlzd2l0Y2ggKG9wKSB7Ci0JCQljYXNlIENNR3JvdXAuQUxMIDoKLQkJCWNhc2UgQ01Hcm91cC5DSE9JQ0UgOgotCQkJY2FzZSBDTUdyb3VwLlNFUVVFTkNFIDoKLQkJCQlvcGVyYXRvciA9IG9wOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gc2hvdWxkIHdhcm4uCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmRDaGlsZChDTU5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQljaGlsZHJlbiA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotCQlyZXR1cm4gY2hpbGRyZW4uYXBwZW5kTm9kZShjaGlsZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3QKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gY2hpbGRyZW47Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIEdST1VQLCBFTlRJVFlfREVDTEFSQVRJT04uCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIENNTm9kZS5HUk9VUDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRPcGVyYXRpb24gbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBBTE9ORSAoYSksIFNFUVVFTkNFIChhLGIpLCBDSE9JQ0UgKGF8YiksIEFMTCAoYSZiKS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkgewotCQlyZXR1cm4gb3BlcmF0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzJjZGZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBDTU5hbWVkTm9kZU1hcCBpbnRlcmZhY2UuCi0gKiBUaGlzIGNsYXNzIGlzIGludGVudGVkIHRvIGJlIHVzZWQgYXMgYSBjb250YWluZXIgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLSAqIElmIHNvbWVvbmUgd2FudHMgdG8gdXNlIHRoaXMgY2xhc3MgZm9yIG90aGVyIHB1cnBvc2UsIGhlIG11c3QgcGF5IGF0dGVudGlvbgotICogdG8gdGhlIGZhY3QgdGhhdCB0aGlzIGNsYXNzIGlzIHRvbGVyYW50IG9mIHRoZSBrZXkgbmFtZSBjYXNlLiAgVGhhdCBpcywgdGhpcwotICogY2xhc3MgZG9lcyBub3QgZGlzdGluZ3Vpc2ggIm5hbWUiLCAiTkFNRSIsIGFuZCAiTmFtZSIgYXMgYSBrZXkgbmFtZS4KLSAqLwotY2xhc3MgQ01OYW1lZE5vZGVNYXBJbXBsIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcCB7Ci0KLQlwcml2YXRlIGphdmEudXRpbC5IYXNodGFibGUgaXRlbXMgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJaXRlbXMgPSBuZXcgamF2YS51dGlsLkhhc2h0YWJsZSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gaXRlbXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdW5rbm93biBrZXlzLgotCSAqIEBwYXJhbSBuYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQlTdHJpbmcgY29va2VkTmFtZSA9IG1ha2VDYW5vbmljYWxGb3JtKG5hbWUpOwotCQlpZiAoIWl0ZW1zLmNvbnRhaW5zS2V5KGNvb2tlZE5hbWUpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBpdGVtcy5nZXQoY29va2VkTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBpbmRleCBpbnQKLQkgKi8KLQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUNNTm9kZSBub2RlID0gKENNTm9kZSkgaXRlci5uZXh0KCk7Ci0JCQlpZiAoLS1pbmRleCA8IDApCi0JCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCXJldHVybiBpdGVtcy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSByYXdGb3JtIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBtYWtlQ2Fub25pY2FsRm9ybShTdHJpbmcgcmF3Rm9ybSkgewotCQlyZXR1cm4gcmF3Rm9ybS50b1VwcGVyQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBrZXkgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpdGVtIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQl2b2lkIHB1dE5hbWVkSXRlbShTdHJpbmcgbmFtZSwgQ01Ob2RlIGl0ZW0pIHsKLQkJU3RyaW5nIGNvb2tlZE5hbWUgPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lKTsKLQkJaWYgKGl0ZW1zLmNvbnRhaW5zS2V5KGNvb2tlZE5hbWUpKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IHJlZ2lzdGVyZWQuCi0JCWl0ZW1zLnB1dChjb29rZWROYW1lLCBpdGVtKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM4Mzg0OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci0KLQotCi0vKioKLSAqLwotYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlIHsKLQotCXByaXZhdGUgamF2YS5sYW5nLlN0cmluZyBuYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIENNTm9kZUltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Ob2RlSW1wbChTdHJpbmcgbm0pIHsKLQkJc3VwZXIoKTsKLQkJbmFtZSA9IG5tOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBuYW1lOwotCX0KLQotCS8qKgotCSAqIGdldFByb3BlcnR5IG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLk9iamVjdAotCSAqCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1cHBvcnRzIG1ldGhvZAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNDQwNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DTU5vZGVMaXN0SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBBbmFsb2cgb2YgZG9tLk5vZGVMaXN0IGZvciBDTS4KLSAqLwotY2xhc3MgQ01Ob2RlTGlzdEltcGwgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3QgewotCi0JcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIG5vZGVzID0gbnVsbDsKLQotCS8qKgotCSAqIENNTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENNTm9kZUxpc3RJbXBsKCkgewotCQlzdXBlcigpOwotCQlub2RlcyA9IG5ldyBqYXZhLnV0aWwuVmVjdG9yKCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqIEBwYXJhbSBub2RlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICovCi0JcHJvdGVjdGVkIENNTm9kZSBhcHBlbmROb2RlKENNTm9kZSBub2RlKSB7Ci0JCW5vZGVzLmFkZEVsZW1lbnQobm9kZSk7Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gbm9kZXMuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqIGl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gaW5kZXggaW50Ci0JICovCi0JcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IG5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKENNTm9kZSkgbm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwYzJkZmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9Db21wbGV4VHlwZURlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byByZXByZXNlbnQgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotICogaW4gWE1MIFNjaGVtYS48YnI+Ci0gKi8KLWFic3RyYWN0IGNsYXNzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQlwcm90ZWN0ZWQgQ01Hcm91cEltcGwgY29udGVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24gPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBudWxsOwotCi0JLyoqCi0JICogQ29tcGxleFR5cGVEZWZpbml0aW9uIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbihFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcigpOwotCQljb2xsZWN0aW9uID0gZWxlbWVudENvbGxlY3Rpb247Ci0JCWNyZWF0ZUNvbnRlbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gYWN0dWFsIGNvbnRlbnQgbW9kZWwuCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmNlIGFuZCBvbmx5IG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yLjxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVDb250ZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cAotCSAqLwotCXB1YmxpYyBDTUdyb3VwIGdldENvbnRlbnQoKSB7Ci0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCS8qIE5PVEU6IERvIHdlIG5lZWQgTE9HSUNBTCB0eXBlPwotCSAqIC0tIDMvNy8yMDAxCi0JICovCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRDb250ZW50VHlwZSgpOwotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgaGludC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBnZXRQcmltYXJ5Q2FuZGlkYXRlKCkgewotCQlpZiAocHJpbWFyeUNhbmRpZGF0ZU5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKHByaW1hcnlDYW5kaWRhdGVOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBOYW1lIG9mIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uLgotCSAqIEVhY2ggc2luZ2xldG9uIG11c3Qga25vdyBpdHMgb3duIG5hbWUuCi0JICogQWxsIG5hbWVzIHNob3VsZCBiZSBkZWZpbmVkIGluCi0JICoge0BsaW5rIDxjb2RlPkNvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3Rvcnk8L2NvZGU+fSBhcyBjb25zdGFudHMuPGJyPgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0VHlwZU5hbWUoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0NvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjM0NmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEZhY3Rvcnkgb2YgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotICovCi1maW5hbCBjbGFzcyBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5IHsKLQotCXByaXZhdGUgc3RhdGljIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgamF2YS51dGlsLkhhc2h0YWJsZSBkZWZpbml0aW9ucyA9IG51bGw7Ci0JLy8gY29uc3RhbnRzIGZvciBjb21wbGV4IHR5cGUgbmFtZQotCS8qKiBmb3IgQUREUkVTUy4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9BRERSRVNTID0gIkNUWVBFX0FERFJFU1MiOy8vJE5PTi1OTFMtMSQKLQkvKiogQ0RBVEEgY29udGVudC4gTm8gQ29tcGxleFR5cGVEZWZpbml0aW9uIGluc3RhbmNlIHNodWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfQ0RBVEEgPSAiQ1RZUEVfQ0RBVEEiOy8vJE5PTi1OTFMtMSQKLQkvKiogY29sIGdyb3VwIGNvbnRlbnQuIENPTCogKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9DT0xVTU5fR1JPVVAgPSAiQ1RZUEVfQ09MVU1OX0dST1VQIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBETC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9ERUZJTklUSU9OX0xJU1QgPSAiQ1RZUEVfREVGSU5JVElPTl9MSVNUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBFTUJFRC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9FTUJFRCA9ICJDVFlQRV9FTUJFRCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBlbXB0eSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfRU1QVFkgPSAiQ1RZUEVfRU1QVFkiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIEZJRUxEU0VULiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZJRUxEU0VUID0gIkNUWVBFX0ZJRUxEU0VUIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBGUkFNRVNFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9GUkFNRVNFVCA9ICJDVFlQRV9GUkFNRVNFVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiBmbG93IGNvbnRlbnQuICglZmxvdzspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0ZMT1dfQ09OVEFJTkVSID0gIkNUWVBFX0ZMT1dfQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIGh0bWwgY29udGVudC4gSEVBRCwgKEZSQU1FU0VUfEJPRFkpICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSFRNTCA9ICJDVFlQRV9IVE1MIjsvLyROT04tTkxTLTEkCi0JLyoqIGhlYWQgY29udGVudC4gVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/ICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfSEVBRCA9ICJDVFlQRV9IRUFEIjsvLyROT04tTkxTLTEkCi0JLyoqIGlubGluZSBjb250ZW50LiAoJWlubGluZTspKiAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0lOTElORV9DT05UQUlORVIgPSAiQ1RZUEVfSU5MSU5FX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiBsaXN0IGl0ZW0gY29udGFpbmVyLiAoTEkpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX0xJX0NPTlRBSU5FUiA9ICJDVFlQRV9MSV9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogZm9yIE1BUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9NQVAgPSAiQ1RZUEVfTUFQIjsvLyROT04tTkxTLTEkCi0JLyoqIG5vZnJhbWVzIGNvbnRlbnQuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfTk9GUkFNRVNfQ09OVEVOVCA9ICJDVFlQRV9OT0ZSQU1FU19DT05URU5UIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBPUFRHUk9VUC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9PUFRJT05fQ09OVEFJTkVSID0gIkNUWVBFX09QVElPTl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQkvKiogcGFyYW0gY29udGFpbmVyLiBGb3IgT0JKRUNUL0FQUExFVC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQVJBTV9DT05UQUlORVIgPSAiQ1RZUEVfUEFSQU1fQ09OVEFJTkVSIjsvLyROT04tTkxTLTEkCi0JLyoqIFBDREFUQSBjb250ZW50LiBObyBDb21wbGV4VHlwZURlZmluaXRpb24gaW5zdGFuY2Ugc2h1bGQgYmUgY3JlYXRlZC4gKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDVFlQRV9QQ0RBVEEgPSAiQ1RZUEVfUENEQVRBIjsvLyROT04tTkxTLTEkCi0JLyoqIGZvciBTRUxFQ1QuICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfU0VMRUNUID0gIkNUWVBFX1NFTEVDVCI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSBjb250ZW50LiBDQVBUSU9OPywgKENPTCp8Q09MR1JPVVAqKSwgVEhFQUQ/LCBURk9PVD8sIFRCT0RZKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RBQkxFID0gIkNUWVBFX1RBQkxFIjsvLyROT04tTkxTLTEkCi0JLyoqIHRhYmxlIGNlbGwgY29udGFpZXIuIChUSHxURCkrICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1RZUEVfVENFTExfQ09OVEFJTkVSID0gIkNUWVBFX1RDRUxMX0NPTlRBSU5FUiI7Ly8kTk9OLU5MUy0xJAotCS8qKiB0YWJsZSByZWNvcmQgY29udGFpbmVyLiAoVFIpKyAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIENUWVBFX1RSX0NPTlRBSU5FUiA9ICJDVFlQRV9UUl9DT05UQUlORVIiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCWRlZmluaXRpb25zID0gbmV3IGphdmEudXRpbC5IYXNodGFibGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCBmb3IgQ29tcGxleFR5cGVEZWZpbml0aW9uLgotCSAqIEVhY2ggaW5zdGFuY2UgY3JlYXRlZCBpbiB0aGlzIG1ldGhvZCBtdXN0IGJlIHJlZ2lzdGVyZWQgaW50bwotCSAqIHRoZSBtYXAgd2l0aCBpdHMgbmFtZS4KLQkgKiBAcGFyYW0gZGVmaW5pdGlvbk5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlVHlwZURlZmluaXRpb24oU3RyaW5nIGRlZmluaXRpb25OYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlpZiAoZGVmaW5pdGlvbnMuY29udGFpbnNLZXkoZGVmaW5pdGlvbk5hbWUpKSB7Ci0JCQlyZXR1cm4gKENvbXBsZXhUeXBlRGVmaW5pdGlvbikgZGVmaW5pdGlvbnMuZ2V0KGRlZmluaXRpb25OYW1lKTsKLQkJfQotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBudWxsOwotCQlpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfQUREUkVTUykgewotCQkJZGVmID0gbmV3IEN0ZEFkZHJlc3MoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfREVGSU5JVElPTl9MSVNUKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkRGwoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfRkxPV19DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRGbG93Q29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0hFQUQpIHsKLQkJCWRlZiA9IG5ldyBDdGRIZWFkKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0hUTUwpIHsKLQkJCWRlZiA9IG5ldyBDdGRIdG1sKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX0lOTElORV9DT05UQUlORVIpIHsKLQkJCWRlZiA9IG5ldyBDdGRJbmxpbmVDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0JCX0KLQkJZWxzZSBpZiAoZGVmaW5pdGlvbk5hbWUgPT0gQ1RZUEVfTElfQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkTGlDb250YWluZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCi0KLQkJfQotCQllbHNlIGlmIChkZWZpbml0aW9uTmFtZSA9PSBDVFlQRV9PUFRJT05fQ09OVEFJTkVSKSB7Ci0JCQlkZWYgPSBuZXcgQ3RkT3B0aW9uQ29udGFpbmVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGRlZmluaXRpb25OYW1lID09IENUWVBFX1NFTEVDVCkgewotCQkJZGVmID0gbmV3IEN0ZFNlbGVjdChlbGVtZW50Q29sbGVjdGlvbik7Ci0KLQkJfQotCQllbHNlIHsKLQkJCWRlZiA9IG51bGw7Ci0JCX0KLQkJaWYgKGRlZiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhaWwgdG8gY3JlYXRlLgotCQlkZWZpbml0aW9ucy5wdXQoZGVmaW5pdGlvbk5hbWUsIGRlZik7Ci0JCXJldHVybiBkZWY7Ci0JfQotCi0JLyoqCi0JICogRm9yIHNpbmdsZXRvbi48YnI+Ci0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpCi0JCQlyZXR1cm4gaW5zdGFuY2U7Ci0JCWluc3RhbmNlID0gbmV3IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEFkZHJlc3MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkQWRkcmVzcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDc5NmY0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkQWRkcmVzcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBmb3IgQUREUkVTUy4KLSAqLwotZmluYWwgY2xhc3MgQ3RkQWRkcmVzcyBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkQWRkcmVzcyhFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50Q29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogKCglaW5saW5lKSB8IFApKi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkqCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDAsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gKCVpbmxpbmUpCi0JCUNNR3JvdXBJbXBsIGlubGluZXMgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlpZiAoaW5saW5lcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQljb2xsZWN0aW9uLmdldElubGluZShpbmxpbmVzKTsKLQkJY29udGVudC5hcHBlbmRDaGlsZChpbmxpbmVzKTsKLQkJLy8gUAotCQlDTU5vZGUgcCA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlApOwotCQlpZiAocCAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChwKTsKLQl9Ci0KLQkvKioKLQkgKiAoKCVpbmxpbmUpIHwgUCkqLgotCSAqIEJlY2F1c2UgJWlubGluZTsgY29udGFpbnMgI1BDREFUQSwgdGhlIHR5cGUgaXMgTUlYRUQuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZU5hbWUoKSB7Ci0JCXJldHVybiBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0FERFJFU1M7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkRGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkRGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNmYjE1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZERsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIGZvciBETC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkRGwgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbnRDb2xsZWN0aW9uIEVsZW1lbnRDb2xsZWN0aW9uCi0JICovCi0JcHVibGljIEN0ZERsKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVDsKLQl9Ci0KLQkvKioKLQkgKiAoRFQgfCBERCkrCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggfCApKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIERUCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5EVCk7Ci0JCWlmIChkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZGVjKTsKLQkJLy8gREQKLQkJZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuREQpOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKERUIHwgREQpKy4KLQkgKiBAcmV0dXJuIGludDsgU2hvdWxkIGJlIG9uZSBvZiBBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBLCBDREFUQSwKLQkgKiB0aG9zZSBhcmUgZGVmaW5lZCBpbiBDTUVsZW1lbnREZWNsYXJhdGlvbi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9ERUZJTklUSU9OX0xJU1Q7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkRmxvd0NvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRGbG93Q29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOTRkNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRGbG93Q29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciBjb250YWluZXJzIG9mIDxjb2RlPiVmbG93OzwvY29kZT4uCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZEZsb3dDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICovCi0JcHVibGljIEN0ZEZsb3dDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqICglZmxvdzspKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWNvbGxlY3Rpb24uZ2V0Rmxvdyhjb250ZW50KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRkxPV19DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkSGVhZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIZWFkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNjFjM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIZWFkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQ29tcGxleCB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBoZWFkIGNvbnRlbnQuCi0gKiBDb250ZW50IE1vZGVsOiAoVElUTEUgJiBJU0lOREVYPyAmIEJBU0U/KQotICovCi1maW5hbCBjbGFzcyBDdGRIZWFkIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIZWFkKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5USVRMRTsKLQl9Ci0KLQkvKioKLQkgKiBmb3IgSEVBRC4KLQkgKiBUbyBhdm9pZCB1c2luZyBpbmNsdXNpb24sIHRoZSBjb250ZW50IG1vZGVsIGNvbWVzIGZyb20gdGhlIFhIVE1MIDEuMC4KLQkgKgotCSAqICglaGVhZC5taXNjOywgKCh0aXRsZSwgJWhlYWQubWlzYzssIChiYXNlLCAlaGVhZC5taXNjOyk/KSB8IChiYXNlLCAlaGVhZC5taXNjOywgKHRpdGxlLCAlaGVhZC5taXNjOykpKSkKLQkgKiBBbmQgJWhlYWQubWlzYzsgaXM6Ci0JICogKHNjcmlwdHxzdHlsZXxtZXRhfGxpbmt8b2JqZWN0fGlzaW5kZXgpKgotCSAqCi0JICogMDogKCVoZWFkLm1pc2MsIEEpCi0JICogQTogKEIgfCBDKQotCSAqIEI6ICh0aXRsZSwgJWhlYWQubWlzYzssIEQpCi0JICogQzogKGJhc2UsICVoZWFkLm1pc2M7LCBFKQotCSAqIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JICogRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gQXQgMXN0LCBjcmVhdGUgJWhlYWQubWlzYzsgY29udGVudC4KLQkJLy8gJWhlYWQubWlzYzsKLQkJLy8gICAoIHwgKSoKLQkJQ01Hcm91cEltcGwgbWlzYyA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMCwgQ01Db250ZW50SW1wbC5VTkJPVU5ERUQpOwotCQlpZiAobWlzYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLH07Ci0JCWNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG1pc2MsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCQkvLyAybmQsIGdldCBhIHRpdGxlCi0JCUNNTm9kZSB0aXRsZSA9IGNvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFKTsKLQkJLy8gM3JkLCBnZXQgYSBiYXNlCi0JCUNNTm9kZSBiYXNlID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSk7Ci0JCWlmICh0aXRsZSA9PSBudWxsIHx8IGJhc2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBUb3AgbGV2ZWwgY29udGVudCBpcyBhIHNlcXVlbmNlIG9mICVoZWFkLm1pc2M7IGFuZCBBLgotCQkvLyAwOiAoJWhlYWQubWlzYzssIEEpCi0JCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gICBhcHBlbmQgJWhlYWQubWlzYzsKLQkJY29udGVudC5hcHBlbmRDaGlsZChtaXNjKTsKLQkJLy8gICBjcmVhdGUgQSBhbmQgYXBwZW5kIGl0IHRvIHRoZSB0b3AgbGV2ZWwuCi0JCXsKLQkJCS8vIEEgaXMgYSBjaG9pY2Ugb2YgQiBhbmQgQy4KLQkJCS8vIEE6IChCIHwgQykKLQkJCS8vICAgY3JlYXRlIGEgY2hvaWNlCi0JCQlDTUdyb3VwSW1wbCBnQSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCQlpZiAoZ0EgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQkvLyAgIGFwcGVuZCBBIHRvIHRoZSB0b3AgbGV2ZWwuCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGdBKTsKLQotCQkJLy8gY3JlYXRlIEIgYW5kIGFwcGVuZCBpdCB0byBBCi0JCQl7Ci0JCQkJLy8gQiBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlLCAlaGVhZC5taXNjOywgYW5kIEQuCi0JCQkJLy8gQjogKHRpdGxlLCAlaGVhZC5taXNjOywgRCkKLQkJCQkvLyAgIGNyZWF0ZSBhIHNlcXVlbmNlCi0JCQkJQ01Hcm91cEltcGwgZ0IgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMSwgMSk7Ci0JCQkJaWYgKGdCID09IG51bGwpCi0JCQkJCXJldHVybjsKLQkJCQkvLyAgIGFwcGVuZCBCIHRvIEEuCi0JCQkJZ0EuYXBwZW5kQ2hpbGQoZ0IpOwotCi0JCQkJLy8gICBhcHBlbmQgdGl0bGUgdG8gQgotCQkJCWdCLmFwcGVuZENoaWxkKHRpdGxlKTsKLQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBCCi0JCQkJZ0IuYXBwZW5kQ2hpbGQobWlzYyk7Ci0JCQkJLy8gICBjcmVhdGUgRCBhbmQgYXBwZW5kIGl0IHRvIEIuCi0JCQkJewotCQkJCQkvLyBEIGlzIGEgc2VxdWVuY2Ugb2YgYmFzZSwgJWhlYWQubWlzYzsuCi0JCQkJCS8vIEQ6IChiYXNlLCAlaGVhZC5taXNjOyk/Ci0JCQkJCS8vICAgY3JlYXRlIGEgc2VxdWVuY2UKLQkJCQkJQ01Hcm91cEltcGwgZ0QgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5TRVFVRU5DRSwgMCwgMSk7Ci0JCQkJCWlmIChnRCA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCQkJCQkvLyAgIGFwcGVuZCBEIHRvIEIuCi0JCQkJCWdCLmFwcGVuZENoaWxkKGdEKTsKLQotCQkJCQkvLyAgIGFwcGVuZCBiYXNlIHRvIEQKLQkJCQkJZ0QuYXBwZW5kQ2hpbGQoYmFzZSk7Ci0JCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEQuCi0JCQkJCWdELmFwcGVuZENoaWxkKG1pc2MpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNyZWF0ZSBDIGFuZCBhcHBlbmQgaXQgdG8gQQotCQkJewotCQkJCS8vIEMgaXMgYSBzZXF1ZW5jZSBvZiBiYXNlLCAlaGVhZC5taXNjOywgYW5kIEUKLQkJCQkvLyBDOiAoYmFzZSwgJWhlYWQubWlzYzssIEUpCi0JCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCUNNR3JvdXBJbXBsIGdDID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQkJCWlmIChnQyA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0JCQkJLy8gICBhcHBlbmQgQyB0byBBLgotCQkJCWdBLmFwcGVuZENoaWxkKGdDKTsKLQotCQkJCS8vICAgYXBwZW5kIGJhc2UgdG8gQwotCQkJCWdDLmFwcGVuZENoaWxkKGJhc2UpOwotCQkJCS8vICAgYXBwZW5kICVoZWFkLm1pc2M7IHRvIEMKLQkJCQlnQy5hcHBlbmRDaGlsZChtaXNjKTsKLQotCQkJCS8vICAgY3JlYXRlIEUgYW5kIGFwcGVuZCBpdCB0byBDLgotCQkJCXsKLQkJCQkJLy8gRSBpcyBhIHNlcXVlbmNlIG9mIHRpdGxlIGFuZCAlaGVhZC5taXNjOy4KLQkJCQkJLy8gRTogKHRpdGxlLCAlaGVhZC5taXNjOykKLQkJCQkJLy8gICBjcmVhdGUgYSBzZXF1ZW5jZQotCQkJCQlDTUdyb3VwSW1wbCBnRSA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCAxKTsKLQkJCQkJaWYgKGdFID09IG51bGwpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCS8vICAgYXBwZW5kIEUgdG8gQy4KLQkJCQkJZ0MuYXBwZW5kQ2hpbGQoZ0UpOwotCi0JCQkJCS8vICAgYXBwZW5kIHRpdGxlIHRvIEUKLQkJCQkJZ0UuYXBwZW5kQ2hpbGQodGl0bGUpOwotCQkJCQkvLyAgIGFwcGVuZCAlaGVhZC5taXNjOyB0byBFLgotCQkJCQlnRS5hcHBlbmRDaGlsZChtaXNjKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFbGVtZW50IGNvbnRlbnQuPGJyPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfSEVBRDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRIdG1sLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEh0bWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzJiYWIxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZEh0bWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENvbXBsZXggdHlwZSBkZWZpbml0aW9uIGZvciA8Y29kZT5IVE1MPC9jb2RlPi48YnI+Ci0gKiBDb250ZW50IE1vZGVsOgotICogSEVBRCwgKEZSQU1FU0VUfEJPRFkpPGJyPgotICovCi1maW5hbCBjbGFzcyBDdGRIdG1sIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDdGRIdG1sKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQkJcHJpbWFyeUNhbmRpZGF0ZU5hbWUgPSBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEOwotCX0KLQotCS8qKgotCSAqICglaHRtbC5jb250ZW50OykuCi0JICogJWh0bWwuY29udGVudDsgaXMgSEVBRCwgKEZSQU1FU0VUIHwgQk9EWSkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIDEpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIEhFQUQKLQkJQ01Ob2RlIGVkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKTsKLQkJaWYgKGVkZWMgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQoZWRlYyk7Ci0KLQkJLy8gKCB8ICkKLQkJQ01Hcm91cEltcGwgZ3JvdXAgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQljb250ZW50LmFwcGVuZENoaWxkKGdyb3VwKTsKLQotCQkvLyBGUkFNRVNFVCwgQk9EWQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CT0RZfTsKLQkJY29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnQgY29udGVudC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IVE1MOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczOTQ0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLQotLyoqCi0gKiBDb21wbGV4IHR5cGUgZGVmaW5pdGlvbiBmb3IgKCVpbmxpbmU7KSouCi0gKi8KLWZpbmFsIGNsYXNzIEN0ZElubGluZUNvbnRhaW5lciBleHRlbmRzIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudENvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkSW5saW5lQ29udGFpbmVyKEVsZW1lbnRDb2xsZWN0aW9uIGVsZW1lbnRDb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnRDb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiAoJWlubGluZSkqLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAwLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCWNvbGxlY3Rpb24uZ2V0SW5saW5lKGNvbnRlbnQpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9JTkxJTkVfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZExpQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZExpQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlNDcxNmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRMaUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBMaXN0IGl0ZW0gY29udGFpbmVyLgotICogKExJKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkTGlDb250YWluZXIgZXh0ZW5kcyBDb21wbGV4VHlwZURlZmluaXRpb24gewotCi0JLyoqCi0JICogQHBhcmFtIGVsZW1lbkNvbGxlY3Rpb24gRWxlbWVudENvbGxlY3Rpb24KLQkgKi8KLQlwdWJsaWMgQ3RkTGlDb250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJOwotCX0KLQotCS8qKgotCSAqIChMSSkrLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnQoKSB7Ci0JCWlmIChjb250ZW50ICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyAoTEkpKwotCQljb250ZW50ID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuU0VRVUVOQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJQ01Ob2RlIGxpID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTEkpOwotCQlpZiAobGkgIT0gbnVsbCkKLQkJCWNvbnRlbnQuYXBwZW5kQ2hpbGQobGkpOwotCX0KLQotCS8qKgotCSAqIEVMRU1FTlQgY29udGVudC48YnI+Ci0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogTmFtZSBvZiBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbi4KLQkgKiBFYWNoIHNpbmdsZXRvbiBtdXN0IGtub3cgaXRzIG93biBuYW1lLgotCSAqIEFsbCBuYW1lcyBzaG91bGQgYmUgZGVmaW5lZCBpbgotCSAqIHtAbGluayA8Y29kZT5Db21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5PC9jb2RlPn0gYXMgY29uc3RhbnRzLjxicj4KLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVOYW1lKCkgewotCQlyZXR1cm4gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9MSV9DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0N0ZE9wdGlvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWUwYTU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkT3B0aW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIE9QVElPTiBjb250YWluZXIuCi0gKiAoT1BUSU9OKSsKLSAqLwotZmluYWwgY2xhc3MgQ3RkT3B0aW9uQ29udGFpbmVyIGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRPcHRpb25Db250YWluZXIoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUSU9OKSsuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudCgpIHsKLQkJaWYgKGNvbnRlbnQgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoY29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vICggKSsKLQkJY29udGVudCA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLlNFUVVFTkNFLCAxLCBDTUNvbnRlbnRJbXBsLlVOQk9VTkRFRCk7Ci0JCS8vIE9QVElPTgotCQlDTU5vZGUgZGVjID0gY29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OKTsKLQkJaWYgKGRlYyAhPSBudWxsKQotCQkJY29udGVudC5hcHBlbmRDaGlsZChkZWMpOwotCX0KLQotCS8qKgotCSAqIChPUFRJT04pKwotCSAqIEByZXR1cm4gaW50OyBTaG91bGQgYmUgb25lIG9mIEFOWSwgRU1QVFksIEVMRU1FTlQsIE1JWEVELCBQQ0RBVEEsIENEQVRBLAotCSAqIHRob3NlIGFyZSBkZWZpbmVkIGluIENNRWxlbWVudERlY2xhcmF0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UOwotCX0KLQotCS8qKgotCSAqIE5hbWUgb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICogRWFjaCBzaW5nbGV0b24gbXVzdCBrbm93IGl0cyBvd24gbmFtZS4KLQkgKiBBbGwgbmFtZXMgc2hvdWxkIGJlIGRlZmluZWQgaW4KLQkgKiB7QGxpbmsgPGNvZGU+Q29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeTwvY29kZT59IGFzIGNvbnN0YW50cy48YnI+Ci0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfT1BUSU9OX0NPTlRBSU5FUjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRTZWxlY3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvQ3RkU2VsZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGQ2MWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9DdGRTZWxlY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogZm9yIFNFTEVDVC4KLSAqLwotZmluYWwgY2xhc3MgQ3RkU2VsZWN0IGV4dGVuZHMgQ29tcGxleFR5cGVEZWZpbml0aW9uIHsKLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Q29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBDdGRTZWxlY3QoRWxlbWVudENvbGxlY3Rpb24gZWxlbWVudENvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudENvbGxlY3Rpb24pOwotCQlwcmltYXJ5Q2FuZGlkYXRlTmFtZSA9IENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTjsKLQl9Ci0KLQkvKioKLQkgKiAoT1BUR1JPVVAgfCBPUFRJT04pKy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50KCkgewotCQlpZiAoY29udGVudCAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChjb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gKCB8ICkrCi0JCWNvbnRlbnQgPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIENNQ29udGVudEltcGwuVU5CT1VOREVEKTsKLQkJLy8gT1BUSU9OCi0JCUNNTm9kZSBkZWMgPSBjb2xsZWN0aW9uLmdldE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PUFRJT04pOwotCQlpZiAoZGVjICE9IG51bGwpCi0JCQljb250ZW50LmFwcGVuZENoaWxkKGRlYyk7Ci0JfQotCi0JLyoqCi0JICogKE9QVEdST1VQIHwgT1BUSU9OKSsuCi0JICogQHJldHVybiBpbnQ7IFNob3VsZCBiZSBvbmUgb2YgQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEsCi0JICogdGhvc2UgYXJlIGRlZmluZWQgaW4gQ01FbGVtZW50RGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfU0VMRUNUOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0RlY2xDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0RlY2xDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTY1MjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9EZWNsQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgQ01OYW1lZE5vZGVNYXAgewotCi0KLQlwcm90ZWN0ZWQgY2xhc3MgRHVhbE1hcCB7Ci0JCXB1YmxpYyBEdWFsTWFwKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBEdWFsTWFwKE9iamVjdFtdIG9iamVjdHMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlpbml0aWFsaXplKG9iamVjdHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBzaXplKCkgewotCQkJcmV0dXJuIHRhYmxlLmxlbmd0aDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoaW50IGtleSkgewotCQkJaWYgKCFpc1ZhbGlkSW5kZXgoa2V5KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiB0YWJsZVtrZXldOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0JCQlJbnRlZ2VyIGtleU9iaiA9IChJbnRlZ2VyKSBtYXAuZ2V0KHZhbHVlKTsKLQkJCWlmIChrZXlPYmogPT0gbnVsbCkKLQkJCQlyZXR1cm4gSURfVU5LTk9XTjsKLQkJCXJldHVybiBrZXlPYmouaW50VmFsdWUoKTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoT2JqZWN0W10gb2JqZWN0cykgewotCQkJaWYgKG9iamVjdHMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl0YWJsZSA9IG9iamVjdHM7Ci0JCQltYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQga2V5ID0gMDsga2V5IDwgb2JqZWN0cy5sZW5ndGg7IGtleSsrKSB7Ci0JCQkJT2JqZWN0IHZhbHVlID0gdGFibGVba2V5XTsKLQkJCQltYXAucHV0KHZhbHVlLCBuZXcgSW50ZWdlcihrZXkpKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgT2JqZWN0W10gdGFibGUgPSBudWxsOwotCQlwcml2YXRlIEhhc2hNYXAgbWFwID0gbnVsbDsKLQotCQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZEluZGV4KGludCBpbmRleCkgewotCQkJcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0YWJsZS5sZW5ndGg7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVG9sZXJhbnRTdHJpbmdEdWFsTWFwIGV4dGVuZHMgRHVhbE1hcCB7Ci0JCXB1YmxpYyBUb2xlcmFudFN0cmluZ0R1YWxNYXAoU3RyaW5nW10gbmFtZXMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlPYmplY3RbXSBvYmplY3RzID0gbmV3IE9iamVjdFtuYW1lcy5sZW5ndGhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJCW9iamVjdHNbaV0gPSBtYWtlQ2Fub25pY2FsRm9ybShuYW1lc1tpXSk7Ci0JCQl9Ci0JCQlpbml0aWFsaXplKG9iamVjdHMpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRLZXkoT2JqZWN0IHZhbHVlKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBuYW1lID0gKFN0cmluZykgdmFsdWU7Ci0JCQkJcmV0dXJuIHN1cGVyLmdldEtleShtYWtlQ2Fub25pY2FsRm9ybShuYW1lKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gSURfVU5LTk9XTjsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgU3RyaW5nIG1ha2VDYW5vbmljYWxGb3JtKFN0cmluZyByYXcpIHsKLQkJCXJldHVybiByYXcudG9VcHBlckNhc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgRGVjbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgRGVjbEl0ZXJhdG9yKCkgewotCQkJbWF4aWQgPSBmRGVjbHMubGVuZ3RoIC0gMTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0JCQlyZXR1cm4gaWQgPCBtYXhpZDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCWlmICghaGFzTmV4dCgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGl0ZW0oKytpZCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7IC8qIG5vdGhpbmcgc2hvdWxkIGJlIGRvbmUuICovCi0JCX0KLQotCQlwcml2YXRlIGludCBpZCA9IC0xOwotCQlwcml2YXRlIGludCBtYXhpZCA9IC0xOwotCX0KLQotCUNNTm9kZVtdIGZEZWNscyA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFNUUklDVF9DQVNFID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIFRPTEVSQU5UX0NBU0UgPSB0cnVlOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IElEX1VOS05PV04gPSAtMTsKLQlwcml2YXRlIER1YWxNYXAgZk1hcCA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRGVjbENvbGxlY3Rpb24oU3RyaW5nW10gbmFtZXMsIGJvb2xlYW4gdG9sZXJhbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkRlY2xzID0gbmV3IENNTm9kZVtuYW1lcy5sZW5ndGhdOwotCQlpZiAodG9sZXJhbnQpIHsKLQkJCWZNYXAgPSBuZXcgVG9sZXJhbnRTdHJpbmdEdWFsTWFwKG5hbWVzKTsKLQkJfQotCQllbHNlIHsKLQkJCWZNYXAgPSBuZXcgRHVhbE1hcChuYW1lcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBDTU5vZGUgY3JlYXRlKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXREZWNsYXJhdGlvbnMoU3RyaW5nW10gbmFtZXMpIHsKLQkJQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLQkJCUNNTm9kZSBub2RlID0gZ2V0TmFtZWRJdGVtKG5hbWUpOwotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCW1hcC5wdXROYW1lZEl0ZW0obmFtZSwgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG1hcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBnZXREZWNsYXJhdGlvbnMoQ01Hcm91cEltcGwgZ3JvdXAsIEl0ZXJhdG9yIG5hbWVzKSB7Ci0JCXdoaWxlIChuYW1lcy5oYXNOZXh0KCkpIHsKLQkJCVN0cmluZyBlbnRpdHlOYW1lID0gKFN0cmluZykgbmFtZXMubmV4dCgpOwotCQkJQ01Ob2RlIGRlYyA9IGdldE5hbWVkSXRlbShlbnRpdHlOYW1lKTsKLQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQlncm91cC5hcHBlbmRDaGlsZChkZWMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwIG5hbWUgdG8gaWQuCi0JICogQHJldHVybiBpbnQKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIGludCBnZXRJRChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZk1hcC5nZXRLZXkobmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGVuZ3RoIG1ldGhvZAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmRGVjbHMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBpZCBpbnQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWUoaW50IGlkKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBmTWFwLmdldFZhbHVlKGlkKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lZEl0ZW0gbWV0aG9kCi0JICogQHJldHVybiBDTU5vZGUKLQkgKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpIHsKLQkJaW50IGlkID0gZ2V0SUQobmFtZSk7Ci0JCWlmICghaXNWYWxpZElEKGlkKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gaXRlbShpZCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIGlkIGludAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkSUQoaW50IGlkKSB7Ci0JCXJldHVybiBpZCA+PSAwICYmIGlkIDwgZkRlY2xzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBpdGVtIG1ldGhvZAotCSAqIEByZXR1cm4gQ01Ob2RlCi0JICogQHBhcmFtIGluZGV4IGludAotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJaWYgKCFpc1ZhbGlkSUQoaW5kZXgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNTm9kZSBkZWNsID0gZkRlY2xzW2luZGV4XTsKLQkJaWYgKGRlY2wgIT0gbnVsbCkKLQkJCXJldHVybiBkZWNsOyAvLyBhbHJlYWR5IGV4aXN0LgotCi0JCWRlY2wgPSBjcmVhdGUoZ2V0TmFtZShpbmRleCkpOwotCQlmRGVjbHNbaW5kZXhdID0gZGVjbDsKLQkJcmV0dXJuIGRlY2w7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQlyZXR1cm4gbmV3IERlY2xJdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VsZW1lbnRDb2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNWFkNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9FbGVtZW50Q29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gKi8KLWZpbmFsIGNsYXNzIEVsZW1lbnRDb2xsZWN0aW9uIGV4dGVuZHMgRGVjbENvbGxlY3Rpb24gaW1wbGVtZW50cyBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZSB7Ci0KLQotCS8vIEVsZW1lbnQgSURzCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWRzIHsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQSA9IDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FERFJFU1MgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CQVNFID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkxPQ0tRVU9URSA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JPRFkgPSA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CUiA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NFTlRFUiA9IDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0REID0gNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElSID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRElWID0gOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREwgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRFQgPSAxMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9STSA9IDEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMSA9IDEzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMiA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IMyA9IDE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INCA9IDE2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INSA9IDE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9INiA9IDE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUFEID0gMTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hSID0gMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hUTUwgPSAyMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU1HID0gMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOUFVUID0gMjM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xJID0gMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01FTlUgPSAyNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUVUQSA9IDI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTCA9IDI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUFRJT04gPSAyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUCA9IDI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QUkUgPSAzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VMRUNUID0gMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RFWFRBUkVBID0gMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJVExFID0gMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VMID0gMzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9DT05GSUcgPSAzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0VDSE8gPSAzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0VYRUMgPSAzNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX0ZTSVpFID0gMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NTSV9GTEFTVE1PRCA9IDM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfSU5DTFVERSA9IDQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TU0lfUFJJTlRFTlYgPSA0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1NJX1NFVCA9IDQyOwotCi0JCXB1YmxpYyBzdGF0aWMgaW50IGdldE51bU9mSWRzKCkgewotCQkJaWYgKG51bW9maWRzICE9IC0xKQotCQkJCXJldHVybiBudW1vZmlkczsKLQotCQkJLy8gTk9URTogSWYgdGhlIHJlZmxlY3Rpb24gaXMgdG9vIHNsb3csIHRoaXMgbWV0aG9kIHNob3VsZAotCQkJLy8ganVzdCByZXR1cm4gdGhlIGxpdGVyYWwgdmFsdWUsIGxpa2UgMTA1LgotCQkJLy8gLS0gNS8yNS8yMDAxCi0JCQlDbGFzcyBjbGF6eiA9IElkcy5jbGFzczsKLQkJCUZpZWxkW10gZmllbGRzID0gY2xhenouZ2V0RmllbGRzKCk7Ci0JCQludW1vZmlkcyA9IDA7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyBuYW1lID0gZmllbGRzW2ldLmdldE5hbWUoKTsKLQkJCQlpZiAobmFtZS5zdGFydHNXaXRoKCJJRF8iKSkvLyROT04tTkxTLTEkCi0JCQkJCW51bW9maWRzKys7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVtb2ZpZHM7Ci0JCX0KLQotCQkvLyBjaGFjaGUgdGhlIHJlc3VsdCBvZiB0aGUgcmVmbGVjdGlvbi4KLQkJcHJpdmF0ZSBzdGF0aWMgaW50IG51bW9maWRzID0gLTE7Ci0JfQotCi0JLyoqICVmb3JtY3RsOy4gSU5QVVQgfCBTRUxFQ1QgfCBURVhUQVJFQSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEZPUk1DVEwgPSB7SU5QVVQsIFNFTEVDVCwgVEVYVEFSRUF9OwotCS8qKiAlcGhyYXNlOy4KLQkgKiBERk4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQSFJBU0UgPSB7REZOfTsKLQkvKiogJXNwZWNpYWw7LgotCSAqIEEgfCBJTUcgfCBCUgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFNQRUNJQUwgPSB7QSwgSU1HLCBCUn07Ci0JLyoqICVoZWFkaW5nOy4gSFsxLTZdICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gSEVBRElORyA9IHtIMSwgSDIsIEgzLCBINCwgSDUsIEg2fTsKLQkvKiogJWxpc3Q7LiBVTCB8IE9MIHwgRElSIHwgTUVOVSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExJU1QgPSB7VUwsIE9MLCBESVIsIE1FTlV9OwotCS8qKiAlcHJlZm9ybWF0dGVkOy4gUFJFICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJFRk9STUFUVEVEID0ge1BSRX07Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb2xsZWN0aW9uIGF0dHJpYnV0ZUNvbGxlY3Rpb24gPSBudWxsOwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG5hbWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCW5hbWVzID0gbmV3IFN0cmluZ1tJZHMuZ2V0TnVtT2ZJZHMoKV07Ci0JCW5hbWVzW0lkcy5JRF9BXSA9IEE7Ci0JCW5hbWVzW0lkcy5JRF9BRERSRVNTXSA9IEFERFJFU1M7Ci0JCW5hbWVzW0lkcy5JRF9CQVNFXSA9IEJBU0U7Ci0JCW5hbWVzW0lkcy5JRF9CTE9DS1FVT1RFXSA9IEJMT0NLUVVPVEU7Ci0JCW5hbWVzW0lkcy5JRF9CT0RZXSA9IEJPRFk7Ci0JCW5hbWVzW0lkcy5JRF9CUl0gPSBCUjsKLQkJbmFtZXNbSWRzLklEX0NFTlRFUl0gPSBDRU5URVI7Ci0JCW5hbWVzW0lkcy5JRF9ERF0gPSBERDsKLQkJbmFtZXNbSWRzLklEX0RJUl0gPSBESVI7Ci0JCW5hbWVzW0lkcy5JRF9ESVZdID0gRElWOwotCQluYW1lc1tJZHMuSURfRExdID0gREw7Ci0JCW5hbWVzW0lkcy5JRF9EVF0gPSBEVDsKLQkJbmFtZXNbSWRzLklEX0ZPUk1dID0gRk9STTsKLQkJbmFtZXNbSWRzLklEX0gxXSA9IEgxOwotCQluYW1lc1tJZHMuSURfSDJdID0gSDI7Ci0JCW5hbWVzW0lkcy5JRF9IM10gPSBIMzsKLQkJbmFtZXNbSWRzLklEX0g0XSA9IEg0OwotCQluYW1lc1tJZHMuSURfSDVdID0gSDU7Ci0JCW5hbWVzW0lkcy5JRF9INl0gPSBINjsKLQkJbmFtZXNbSWRzLklEX0hFQURdID0gSEVBRDsKLQkJbmFtZXNbSWRzLklEX0hSXSA9IEhSOwotCQluYW1lc1tJZHMuSURfSFRNTF0gPSBIVE1MOwotCQluYW1lc1tJZHMuSURfSU1HXSA9IElNRzsKLQkJbmFtZXNbSWRzLklEX0lOUFVUXSA9IElOUFVUOwotCQluYW1lc1tJZHMuSURfTEldID0gTEk7Ci0JCW5hbWVzW0lkcy5JRF9NRU5VXSA9IE1FTlU7Ci0JCW5hbWVzW0lkcy5JRF9NRVRBXSA9IE1FVEE7Ci0JCW5hbWVzW0lkcy5JRF9PTF0gPSBPTDsKLQkJbmFtZXNbSWRzLklEX09QVElPTl0gPSBPUFRJT047Ci0JCW5hbWVzW0lkcy5JRF9QXSA9IFA7Ci0JCW5hbWVzW0lkcy5JRF9QUkVdID0gUFJFOwotCQluYW1lc1tJZHMuSURfU0VMRUNUXSA9IFNFTEVDVDsKLQkJbmFtZXNbSWRzLklEX1RFWFRBUkVBXSA9IFRFWFRBUkVBOwotCQluYW1lc1tJZHMuSURfVElUTEVdID0gVElUTEU7Ci0JCW5hbWVzW0lkcy5JRF9VTF0gPSBVTDsKLQkJbmFtZXNbSWRzLklEX1NTSV9DT05GSUddID0gU1NJX0NPTkZJRzsKLQkJbmFtZXNbSWRzLklEX1NTSV9FQ0hPXSA9IFNTSV9FQ0hPOwotCQluYW1lc1tJZHMuSURfU1NJX0VYRUNdID0gU1NJX0VYRUM7Ci0JCW5hbWVzW0lkcy5JRF9TU0lfRlNJWkVdID0gU1NJX0ZTSVpFOwotCQluYW1lc1tJZHMuSURfU1NJX0ZMQVNUTU9EXSA9IFNTSV9GTEFTVE1PRDsKLQkJbmFtZXNbSWRzLklEX1NTSV9JTkNMVURFXSA9IFNTSV9JTkNMVURFOwotCQluYW1lc1tJZHMuSURfU1NJX1BSSU5URU5WXSA9IFNTSV9QUklOVEVOVjsKLQkJbmFtZXNbSWRzLklEX1NTSV9TRVRdID0gU1NJX1NFVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudENvbGxlY3Rpb24oQXR0cmlidXRlQ29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKG5hbWVzLCBUT0xFUkFOVF9DQVNFKTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogQWN0dWFsbHkgY3JlYXRlcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uIGluc3RhbmNlLgotCSAqIEByZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlIVE1MRWxlbURlY2xJbXBsIGVkZWMgPSBudWxsOwotCi0JCWlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEFERFJFU1MpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEFERFJFU1ModGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJBU0UpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJBU0UodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJMT0NLUVVPVEUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJMT0NLUVVPVEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJPRFkpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEJPRFkodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRCUih0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoQ0VOVEVSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRDRU5URVIodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEREKSkgewotCQkJZWRlYyA9IG5ldyBIZWRERCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRElSKSkgewotCQkJZWRlYyA9IG5ldyBIZWRNRU5VKERJUiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERJVikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRElWKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShETCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkREwodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKERUKSkgewotCQkJZWRlYyA9IG5ldyBIZWREVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoRk9STSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkRk9STSh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDEsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIMikpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhIMiwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEgzKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEgzLCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSDQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhlYWRpbmcoSDQsIHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShINSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSGVhZGluZyhINSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEg2KSkgewotCQkJZWRlYyA9IG5ldyBIZWRIZWFkaW5nKEg2LCB0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSEVBRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkSEVBRCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFIpKSB7Ci0JCQllZGVjID0gbmV3IEhlZEhSKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MKSkgewotCQkJZWRlYyA9IG5ldyBIZWRIVE1MKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShJTUcpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElNRyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSU5QVVQpKSB7Ci0JCQllZGVjID0gbmV3IEhlZElOUFVUKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShMSSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkTEkodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1FTlUpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FTlUoTUVOVSwgdGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZE1FVEEodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKE9MKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoT1BUSU9OKSkgewotCQkJZWRlYyA9IG5ldyBIZWRPUFRJT04odGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFApKSB7Ci0JCQllZGVjID0gbmV3IEhlZFAodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFBSRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkUFJFKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTRUxFQ1QpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNFTEVDVCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoVEVYVEFSRUEpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFRFWFRBUkVBKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShUSVRMRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkVElUTEUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFVMKSkgewotCQkJZWRlYyA9IG5ldyBIZWRVTCh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0NPTkZJRykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJQ29uZmlnKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfRUNITykpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRWNobyh0aGlzKTsKLQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnROYW1lLmVxdWFsc0lnbm9yZUNhc2UoU1NJX0VYRUMpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSUV4ZWModGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9GU0laRSkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRnNpemUodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9GTEFTVE1PRCkpIHsKLQkJCWVkZWMgPSBuZXcgSGVkU1NJRmxhc3Rtb2QodGhpcyk7Ci0KLQkJfQotCQllbHNlIGlmIChlbGVtZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKFNTSV9JTkNMVURFKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lJbmNsdWRlKHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfUFJJTlRFTlYpKSB7Ci0JCQllZGVjID0gbmV3IEhlZFNTSVByaW50ZW52KHRoaXMpOwotCi0JCX0KLQkJZWxzZSBpZiAoZWxlbWVudE5hbWUuZXF1YWxzSWdub3JlQ2FzZShTU0lfU0VUKSkgewotCQkJZWRlYyA9IG5ldyBIZWRTU0lTZXQodGhpcyk7Ci0KLQkJfSAvLyB1bmtub3duCi0JCWVsc2UgewotCQkJLy8gTk9URTogV2UgZG9uJ3QgZGVmaW5lIHRoZSBVTktOT1dOIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0JCQkvLyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgYSBkZWNsYXJhdGlvbiBpcyBhIHNpZ24gb2YKLQkJCS8vIHRoZSB0YXJnZXQgZWxlbWVudCBpcyB1bmtub3duLgotCQkJLy8gLS0gMy85LzIwMDEKLQkJCWVkZWMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlZGVjOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVDb2xsZWN0aW9uIGdldEF0dHJpYnV0ZUNvbGxlY3Rpb24oKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVDb2xsZWN0aW9uOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBDb2xsZWN0aW9uIGdldE5hbWVzT2ZCbG9jaygpIHsKLQkJLy8gUCB8ICVsaXN0IHwgJXByZWZvcm1hdHRlZCB8IERMIHwgRElWIHwgQ0VOVEVSIHwgQkxPQ0tRVU9URSB8IEZPUk0gfCBIUgotCQlTdHJpbmdbXSBibG9ja01pc2MgPSB7UCwgREwsIERJViwgQ0VOVEVSLCBCTE9DS1FVT1RFLCBGT1JNLCBIUix9OwotCQlWZWN0b3IgYmxvY2tOYW1lcyA9IG5ldyBWZWN0b3IoQXJyYXlzLmFzTGlzdChibG9ja01pc2MpKTsKLQkJLy8gJWhlYWRpbmc7Ci0JCWJsb2NrTmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoSEVBRElORykpOwotCQkvLyAlbGlzdDsKLQkJYmxvY2tOYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChMSVNUKSk7Ci0JCS8vICVwcmVmb3JtYXR0ZWQ7Ci0JCWJsb2NrTmFtZXMuYWRkQWxsKEFycmF5cy5hc0xpc3QoUFJFRk9STUFUVEVEKSk7Ci0KLQkJcmV0dXJuIGJsb2NrTmFtZXM7Ci0JfQotCi0JLyoqCi0JICogJWJsb2NrOy4KLQkgKiAlYmxvY2s7IGlzOgotCSAqIFAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLQkgKiBOT1NDUklQVCB8IE5PRlJBTUVTIHwgQkxPQ0tRVU9URSB8IEZPUk0gfCBJU0lOREVYIHwgSFIgfAotCSAqIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRCbG9jayhDTUdyb3VwSW1wbCBncm91cCkgewotCQlpZiAoZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBnZXROYW1lc09mQmxvY2soKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0KLQkgKiBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+IGluc3RhbmNlLgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZsb3coQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldEJsb2NrKGdyb3VwKTsKLQkJZ2V0SW5saW5lKGdyb3VwKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRGb250c3R5bGUoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJcmV0dXJuOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEZvcm1jdHJsKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXREZWNsYXJhdGlvbnMoZ3JvdXAsIEFycmF5cy5hc0xpc3QoRk9STUNUTCkuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogJWhlYWRpbmc7LgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldEhlYWRpbmcoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZ2V0RGVjbGFyYXRpb25zKGdyb3VwLCBBcnJheXMuYXNMaXN0KEhFQURJTkcpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbQotCSAqIGludG8gYSA8Y29kZT5DTUdyb3VwSW1wbDwvY29kZT4gaW5zdGFuY2UuCi0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0SW5saW5lKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRGb250c3R5bGUoZ3JvdXApOwotCQlnZXRQaHJhc2UoZ3JvdXApOwotCQlnZXRTcGVjaWFsKGdyb3VwKTsKLQkJZ2V0Rm9ybWN0cmwoZ3JvdXApOwotCX0KLQotCS8qKgotCSAqICVsaXN0Oy4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRMaXN0KENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChMSVNUKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIHN0b3JlIHRoZW0gaW50byBhIDxjb2RlPkNNR3JvdXBJbXBsPC9jb2RlPgotCSAqIGluc3RhbmNlLjxicj4KLQkgKiBAcGFyYW0gZ3JvdXAgQ01Hcm91cEltcGwgUmV0dXJuIHZhbHVlcy4KLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBnZXRQaHJhc2UoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChQSFJBU0UpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqICVwcmVmb3JtYXR0ZWQ7Ci0JICogQHBhcmFtIGdyb3VwIENNR3JvdXBJbXBsIFJldHVybiB2YWx1ZXMuCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgZ2V0UHJlZm9ybWF0dGVkKENNR3JvdXBJbXBsIGdyb3VwKSB7Ci0JCWlmIChncm91cCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChQUkVGT1JNQVRURUQpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgc3RvcmUgdGhlbSBpbnRvIGEgPGNvZGU+Q01Hcm91cEltcGw8L2NvZGU+Ci0JICogaW5zdGFuY2UuPGJyPgotCSAqIEBwYXJhbSBncm91cCBDTUdyb3VwSW1wbCBSZXR1cm4gdmFsdWVzLgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGdldFNwZWNpYWwoQ01Hcm91cEltcGwgZ3JvdXApIHsKLQkJaWYgKGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldERlY2xhcmF0aW9ucyhncm91cCwgQXJyYXlzLmFzTGlzdChTUEVDSUFMKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9FbnRpdHlDb2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VudGl0eUNvbGxlY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I0NDU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0VudGl0eUNvbGxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogRmFjdG9yeSBmb3IgZW50aXR5IGRlY2xhcmF0aW9ucy4KLSAqLwotZmluYWwgY2xhc3MgRW50aXR5Q29sbGVjdGlvbiBleHRlbmRzIERlY2xDb2xsZWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2UuRW50aXR5TmFtZSB7Ci0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIElkcyB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FBQ1VURV9MID0gMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUFDVVRFX1UgPSAxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BQ0lSQ19MID0gMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUNJUkNfVSA9IDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FDVVRFID0gNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUVMSUdfTCA9IDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FFTElHX1UgPSA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BR1JBVkVfTCA9IDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FHUkFWRV9VID0gODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxFRlNZTSA9IDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FMUEhBX0wgPSAxMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQUxQSEFfVSA9IDExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BTVAgPSAxMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQU5EID0gMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FORyA9IDE0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9BUklOR19MID0gMTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FSSU5HX1UgPSAxNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVNZTVAgPSAxNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVRJTERFX0wgPSAxODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVRJTERFX1UgPSAxOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQVVNTF9MID0gMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0FVTUxfVSA9IDIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRFFVTyA9IDIyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CRVRBX0wgPSAyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQkVUQV9VID0gMjQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0JSVkJBUiA9IDI1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9CVUxMID0gMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NBUCA9IDI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQ0VESUxfTCA9IDI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DQ0VESUxfVSA9IDI5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRURJTCA9IDMwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DRU5UID0gMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NISV9MID0gMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NISV9VID0gMzM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NJUkMgPSAzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ0xVQlMgPSAzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfQ09ORyA9IDM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DT1BZID0gMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NSQVJSID0gMzg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0NVUCA9IDM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9DVVJSRU4gPSA0MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFHR0VSX0wgPSA0MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFHR0VSX1UgPSA0MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREFSUl9MID0gNDM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RBUlJfVSA9IDQ0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUcgPSA0NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfREVMVEFfTCA9IDQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ERUxUQV9VID0gNDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJQU1TID0gNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0RJVklERSA9IDQ5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQUNVVEVfTCA9IDUwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQUNVVEVfVSA9IDUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FQ0lSQ19MID0gNTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VDSVJDX1UgPSA1MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUdSQVZFX0wgPSA1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRUdSQVZFX1UgPSA1NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU1QVFkgPSA1NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRU1TUCA9IDU3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FTlNQID0gNTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VQU0lMT05fTCA9IDU5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FUFNJTE9OX1UgPSA2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVFVSVYgPSA2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRBX0wgPSA2MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRBX1UgPSA2MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRIX0wgPSA2NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVRIX1UgPSA2NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRVVNTF9MID0gNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VVTUxfVSA9IDY3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9FVVJPID0gNjg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0VYSVNUID0gNjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZOT0YgPSA3MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRk9SQUxMID0gNzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQUMxMiA9IDcyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9GUkFDMTQgPSA3MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfRlJBQzM0ID0gNzQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0ZSQVNMID0gNzU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0dBTU1BX0wgPSA3NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfR0FNTUFfVSA9IDc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HRSA9IDc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9HVCA9IDc5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IQVJSX0wgPSA4MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSEFSUl9VID0gODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0hFQVJUUyA9IDgyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9IRUxMSVAgPSA4MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUFDVVRFX0wgPSA4NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUFDVVRFX1UgPSA4NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSUNJUkNfTCA9IDg2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JQ0lSQ19VID0gODc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lFWENMID0gODg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lHUkFWRV9MID0gODk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lHUkFWRV9VID0gOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lNQUdFID0gOTE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lORklOID0gOTI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lOVCA9IDkzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JT1RBX0wgPSA5NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfSU9UQV9VID0gOTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lRVUVTVCA9IDk2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JU0lOID0gOTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0lVTUxfTCA9IDk4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9JVU1MX1UgPSA5OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfS0FQUEFfTCA9IDEwMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfS0FQUEFfVSA9IDEwMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFNQkRBX0wgPSAxMDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xBTUJEQV9VID0gMTAzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQU5HID0gMTA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVFVTyA9IDEwNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEFSUl9MID0gMTA2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MQVJSX1UgPSAxMDc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xDRUlMID0gMTA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MRFFVTyA9IDEwOTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTEUgPSAxMTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xGTE9PUiA9IDExMTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTE9XQVNUID0gMTEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MT1ogPSAxMTM7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX0xSTSA9IDExNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFNBUVVPID0gMTE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9MU1FVTyA9IDExNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTFQgPSAxMTc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01BQ1IgPSAxMTg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX01EQVNIID0gMTE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSUNSTyA9IDEyMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTUlERE9UID0gMTIxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9NSU5VUyA9IDEyMjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTVVfTCA9IDEyMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTVVfVSA9IDEyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkFCTEEgPSAxMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05CU1AgPSAxMjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05EQVNIID0gMTI3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ORSA9IDEyODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTkkgPSAxMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05PVCA9IDEzMDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTk9USU4gPSAxMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05TVUIgPSAxMzI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX05USUxERV9MID0gMTMzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9OVElMREVfVSA9IDEzNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlVfTCA9IDEzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfTlVfVSA9IDEzNjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0FDVVRFX0wgPSAxMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09BQ1VURV9VID0gMTM4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQ0lSQ19MID0gMTM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PQ0lSQ19VID0gMTQwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PRUxJR19MID0gMTQxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PRUxJR19VID0gMTQyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PR1JBVkVfTCA9IDE0MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT0dSQVZFX1UgPSAxNDQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09MSU5FID0gMTQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUVHQV9MID0gMTQ2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUVHQV9VID0gMTQ3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PTUlDUk9OX0wgPSAxNDg7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09NSUNST05fVSA9IDE0OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1BMVVMgPSAxNTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09SID0gMTUxOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUkRGID0gMTUyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PUkRNID0gMTUzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PU0xBU0hfTCA9IDE1NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1NMQVNIX1UgPSAxNTU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09USUxERV9MID0gMTU2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVElMREVfVSA9IDE1NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfT1RJTUVTID0gMTU4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9PVU1MX0wgPSAxNTk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX09VTUxfVSA9IDE2MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSQSA9IDE2MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEFSVCA9IDE2MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEVSTUlMID0gMTYzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QRVJQID0gMTY0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QSElfTCA9IDE2NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUEhJX1UgPSAxNjY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BJViA9IDE2NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElfTCA9IDE2ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUElfVSA9IDE2OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUExVU01OID0gMTcwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9QT1VORCA9IDE3MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJJTUVfTCA9IDE3MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJJTUVfVSA9IDE3MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJPRCA9IDE3NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFJPUCA9IDE3NTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUFNJX0wgPSAxNzY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1BTSV9VID0gMTc3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9RVU9UID0gMTc4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQURJQyA9IDE3OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFORyA9IDE4MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFRVU8gPSAxODE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JBUlJfTCA9IDE4MjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkFSUl9VID0gMTgzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SQ0VJTCA9IDE4NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkRRVU8gPSAxODU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JFQUwgPSAxODY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JFRyA9IDE4NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkZMT09SID0gMTg4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SSE9fTCA9IDE4OTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUkhPX1UgPSAxOTA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1JMTSA9IDE5MTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfUlNBUVVPID0gMTkyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9SU1FVTyA9IDE5MzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0JRVU8gPSAxOTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NDQVJPTl9MID0gMTk1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TQ0FST05fVSA9IDE5NjsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0RPVCA9IDE5NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0VDVCA9IDE5ODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU0hZID0gMTk5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TSUdNQUYgPSAyMDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BX0wgPSAyMDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJR01BX1UgPSAyMDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NJTSA9IDIwMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1BBREVTID0gMjA0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVUIgPSAyMDU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVQkUgPSAyMDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1NVTSA9IDIwNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfU1VQID0gMjA4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAxID0gMjA5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAyID0gMjEwOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVAzID0gMjExOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TVVBFID0gMjEyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9TWkxJRyA9IDIxMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVEFVX0wgPSAyMTQ7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RBVV9VID0gMjE1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVSRTQgPSAyMTY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIRVRBU1lNID0gMjE3OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQV9MID0gMjE4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USEVUQV9VID0gMjE5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USElOU1AgPSAyMjA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIT1JOX0wgPSAyMjE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RIT1JOX1UgPSAyMjI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1RJTERFID0gMjIzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9USU1FUyA9IDIyNDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVFJBREUgPSAyMjU7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VBQ1VURV9MID0gMjI2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQUNVVEVfVSA9IDIyNzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVUFSUl9MID0gMjI4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VQVJSX1UgPSAyMjk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VDSVJDX0wgPSAyMzA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VDSVJDX1UgPSAyMzE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VHUkFWRV9MID0gMjMyOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VR1JBVkVfVSA9IDIzMzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVU1MID0gMjM0OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJSCA9IDIzNTsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVBTSUxPTl9MID0gMjM2OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9VUFNJTE9OX1UgPSAyMzc7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1VVTUxfTCA9IDIzODsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfVVVNTF9VID0gMjM5OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9XRUlFUlAgPSAyNDA7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1hJX0wgPSAyNDE7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1hJX1UgPSAyNDI7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lBQ1VURV9MID0gMjQzOwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZQUNVVEVfVSA9IDI0NDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWUVOID0gMjQ1OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9ZVU1MX0wgPSAyNDY7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1lVTUxfVSA9IDI0NzsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWkVUQV9MID0gMjQ4OwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJRF9aRVRBX1UgPSAyNDk7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElEX1pXSiA9IDI1MDsKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSURfWldOSiA9IDI1MTsKLQotCQlwdWJsaWMgc3RhdGljIGludCBnZXROdW1PZklkcygpIHsKLQkJCWlmIChudW1vZmlkcyAhPSAtMSkKLQkJCQlyZXR1cm4gbnVtb2ZpZHM7Ci0KLQkJCS8vIE5PVEU6IElmIHRoZSByZWZsZWN0aW9uIGlzIHRvbyBzbG93LCB0aGlzIG1ldGhvZCBzaG91bGQKLQkJCS8vIGp1c3QgcmV0dXJuIHRoZSBsaXRlcmFsIHZhbHVlLCBsaWtlIDI1Mi4KLQkJCS8vIC0tIDUvMjQvMjAwMQotCQkJQ2xhc3MgY2xhenogPSBJZHMuY2xhc3M7Ci0JCQlGaWVsZFtdIGZpZWxkcyA9IGNsYXp6LmdldEZpZWxkcygpOwotCQkJbnVtb2ZpZHMgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZpZWxkc1tpXS5nZXROYW1lKCk7Ci0JCQkJaWYgKG5hbWUuc3RhcnRzV2l0aCgiSURfIikpLy8kTk9OLU5MUy0xJAotCQkJCQludW1vZmlkcysrOwotCQkJfQotCQkJcmV0dXJuIG51bW9maWRzOwotCQl9Ci0KLQkJLy8gY2hhY2hlIHRoZSByZXN1bHQgb2YgdGhlIHJlZmxlY3Rpb24uCi0JCXByaXZhdGUgc3RhdGljIGludCBudW1vZmlkcyA9IC0xOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG5hbWVzID0gbnVsbDsKLQotCXN0YXRpYyB7Ci0JCW5hbWVzID0gbmV3IFN0cmluZ1tJZHMuZ2V0TnVtT2ZJZHMoKV07Ci0JCW5hbWVzW0lkcy5JRF9BQUNVVEVfTF0gPSBBQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0FBQ1VURV9VXSA9IEFBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfQUNJUkNfTF0gPSBBQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfQUNJUkNfVV0gPSBBQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfQUNVVEVdID0gQUNVVEU7Ci0JCW5hbWVzW0lkcy5JRF9BRUxJR19MXSA9IEFFTElHX0w7Ci0JCW5hbWVzW0lkcy5JRF9BRUxJR19VXSA9IEFFTElHX1U7Ci0JCW5hbWVzW0lkcy5JRF9BR1JBVkVfTF0gPSBBR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0FHUkFWRV9VXSA9IEFHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfQUxFRlNZTV0gPSBBTEVGU1lNOwotCQluYW1lc1tJZHMuSURfQUxQSEFfTF0gPSBBTFBIQV9MOwotCQluYW1lc1tJZHMuSURfQUxQSEFfVV0gPSBBTFBIQV9VOwotCQluYW1lc1tJZHMuSURfQU1QXSA9IEFNUDsKLQkJbmFtZXNbSWRzLklEX0FORF0gPSBBTkQ7Ci0JCW5hbWVzW0lkcy5JRF9BTkddID0gQU5HOwotCQluYW1lc1tJZHMuSURfQVJJTkdfTF0gPSBBUklOR19MOwotCQluYW1lc1tJZHMuSURfQVJJTkdfVV0gPSBBUklOR19VOwotCQluYW1lc1tJZHMuSURfQVNZTVBdID0gQVNZTVA7Ci0JCW5hbWVzW0lkcy5JRF9BVElMREVfTF0gPSBBVElMREVfTDsKLQkJbmFtZXNbSWRzLklEX0FUSUxERV9VXSA9IEFUSUxERV9VOwotCQluYW1lc1tJZHMuSURfQVVNTF9MXSA9IEFVTUxfTDsKLQkJbmFtZXNbSWRzLklEX0FVTUxfVV0gPSBBVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9CRFFVT10gPSBCRFFVTzsKLQkJbmFtZXNbSWRzLklEX0JFVEFfTF0gPSBCRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9CRVRBX1VdID0gQkVUQV9VOwotCQluYW1lc1tJZHMuSURfQlJWQkFSXSA9IEJSVkJBUjsKLQkJbmFtZXNbSWRzLklEX0JVTExdID0gQlVMTDsKLQkJbmFtZXNbSWRzLklEX0NBUF0gPSBDQVA7Ci0JCW5hbWVzW0lkcy5JRF9DQ0VESUxfTF0gPSBDQ0VESUxfTDsKLQkJbmFtZXNbSWRzLklEX0NDRURJTF9VXSA9IENDRURJTF9VOwotCQluYW1lc1tJZHMuSURfQ0VESUxdID0gQ0VESUw7Ci0JCW5hbWVzW0lkcy5JRF9DRU5UXSA9IENFTlQ7Ci0JCW5hbWVzW0lkcy5JRF9DSElfTF0gPSBDSElfTDsKLQkJbmFtZXNbSWRzLklEX0NISV9VXSA9IENISV9VOwotCQluYW1lc1tJZHMuSURfQ0lSQ10gPSBDSVJDOwotCQluYW1lc1tJZHMuSURfQ0xVQlNdID0gQ0xVQlM7Ci0JCW5hbWVzW0lkcy5JRF9DT05HXSA9IENPTkc7Ci0JCW5hbWVzW0lkcy5JRF9DT1BZXSA9IENPUFk7Ci0JCW5hbWVzW0lkcy5JRF9DUkFSUl0gPSBDUkFSUjsKLQkJbmFtZXNbSWRzLklEX0NVUF0gPSBDVVA7Ci0JCW5hbWVzW0lkcy5JRF9DVVJSRU5dID0gQ1VSUkVOOwotCQluYW1lc1tJZHMuSURfREFHR0VSX0xdID0gREFHR0VSX0w7Ci0JCW5hbWVzW0lkcy5JRF9EQUdHRVJfVV0gPSBEQUdHRVJfVTsKLQkJbmFtZXNbSWRzLklEX0RBUlJfTF0gPSBEQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9EQVJSX1VdID0gREFSUl9VOwotCQluYW1lc1tJZHMuSURfREVHXSA9IERFRzsKLQkJbmFtZXNbSWRzLklEX0RFTFRBX0xdID0gREVMVEFfTDsKLQkJbmFtZXNbSWRzLklEX0RFTFRBX1VdID0gREVMVEFfVTsKLQkJbmFtZXNbSWRzLklEX0RJQU1TXSA9IERJQU1TOwotCQluYW1lc1tJZHMuSURfRElWSURFXSA9IERJVklERTsKLQkJbmFtZXNbSWRzLklEX0VBQ1VURV9MXSA9IEVBQ1VURV9MOwotCQluYW1lc1tJZHMuSURfRUFDVVRFX1VdID0gRUFDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9FQ0lSQ19MXSA9IEVDSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9FQ0lSQ19VXSA9IEVDSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9FR1JBVkVfTF0gPSBFR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0VHUkFWRV9VXSA9IEVHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfRU1QVFldID0gRU1QVFk7Ci0JCW5hbWVzW0lkcy5JRF9FTVNQXSA9IEVNU1A7Ci0JCW5hbWVzW0lkcy5JRF9FTlNQXSA9IEVOU1A7Ci0JCW5hbWVzW0lkcy5JRF9FUFNJTE9OX0xdID0gRVBTSUxPTl9MOwotCQluYW1lc1tJZHMuSURfRVBTSUxPTl9VXSA9IEVQU0lMT05fVTsKLQkJbmFtZXNbSWRzLklEX0VRVUlWXSA9IEVRVUlWOwotCQluYW1lc1tJZHMuSURfRVRBX0xdID0gRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9FVEFfVV0gPSBFVEFfVTsKLQkJbmFtZXNbSWRzLklEX0VUSF9MXSA9IEVUSF9MOwotCQluYW1lc1tJZHMuSURfRVRIX1VdID0gRVRIX1U7Ci0JCW5hbWVzW0lkcy5JRF9FVU1MX0xdID0gRVVNTF9MOwotCQluYW1lc1tJZHMuSURfRVVNTF9VXSA9IEVVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0VVUk9dID0gRVVSTzsKLQkJbmFtZXNbSWRzLklEX0VYSVNUXSA9IEVYSVNUOwotCQluYW1lc1tJZHMuSURfRk5PRl0gPSBGTk9GOwotCQluYW1lc1tJZHMuSURfRk9SQUxMXSA9IEZPUkFMTDsKLQkJbmFtZXNbSWRzLklEX0ZSQUMxMl0gPSBGUkFDMTI7Ci0JCW5hbWVzW0lkcy5JRF9GUkFDMTRdID0gRlJBQzE0OwotCQluYW1lc1tJZHMuSURfRlJBQzM0XSA9IEZSQUMzNDsKLQkJbmFtZXNbSWRzLklEX0ZSQVNMXSA9IEZSQVNMOwotCQluYW1lc1tJZHMuSURfR0FNTUFfTF0gPSBHQU1NQV9MOwotCQluYW1lc1tJZHMuSURfR0FNTUFfVV0gPSBHQU1NQV9VOwotCQluYW1lc1tJZHMuSURfR0VdID0gR0U7Ci0JCW5hbWVzW0lkcy5JRF9HVF0gPSBHVDsKLQkJbmFtZXNbSWRzLklEX0hBUlJfTF0gPSBIQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9IQVJSX1VdID0gSEFSUl9VOwotCQluYW1lc1tJZHMuSURfSEVBUlRTXSA9IEhFQVJUUzsKLQkJbmFtZXNbSWRzLklEX0hFTExJUF0gPSBIRUxMSVA7Ci0JCW5hbWVzW0lkcy5JRF9JQUNVVEVfTF0gPSBJQUNVVEVfTDsKLQkJbmFtZXNbSWRzLklEX0lBQ1VURV9VXSA9IElBQ1VURV9VOwotCQluYW1lc1tJZHMuSURfSUNJUkNfTF0gPSBJQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfSUNJUkNfVV0gPSBJQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfSUVYQ0xdID0gSUVYQ0w7Ci0JCW5hbWVzW0lkcy5JRF9JR1JBVkVfTF0gPSBJR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX0lHUkFWRV9VXSA9IElHUkFWRV9VOwotCQluYW1lc1tJZHMuSURfSU1BR0VdID0gSU1BR0U7Ci0JCW5hbWVzW0lkcy5JRF9JTkZJTl0gPSBJTkZJTjsKLQkJbmFtZXNbSWRzLklEX0lOVF0gPSBJTlQ7Ci0JCW5hbWVzW0lkcy5JRF9JT1RBX0xdID0gSU9UQV9MOwotCQluYW1lc1tJZHMuSURfSU9UQV9VXSA9IElPVEFfVTsKLQkJbmFtZXNbSWRzLklEX0lRVUVTVF0gPSBJUVVFU1Q7Ci0JCW5hbWVzW0lkcy5JRF9JU0lOXSA9IElTSU47Ci0JCW5hbWVzW0lkcy5JRF9JVU1MX0xdID0gSVVNTF9MOwotCQluYW1lc1tJZHMuSURfSVVNTF9VXSA9IElVTUxfVTsKLQkJbmFtZXNbSWRzLklEX0tBUFBBX0xdID0gS0FQUEFfTDsKLQkJbmFtZXNbSWRzLklEX0tBUFBBX1VdID0gS0FQUEFfVTsKLQkJbmFtZXNbSWRzLklEX0xBTUJEQV9MXSA9IExBTUJEQV9MOwotCQluYW1lc1tJZHMuSURfTEFNQkRBX1VdID0gTEFNQkRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9MQU5HXSA9IExBTkc7Ci0JCW5hbWVzW0lkcy5JRF9MQVFVT10gPSBMQVFVTzsKLQkJbmFtZXNbSWRzLklEX0xBUlJfTF0gPSBMQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9MQVJSX1VdID0gTEFSUl9VOwotCQluYW1lc1tJZHMuSURfTENFSUxdID0gTENFSUw7Ci0JCW5hbWVzW0lkcy5JRF9MRFFVT10gPSBMRFFVTzsKLQkJbmFtZXNbSWRzLklEX0xFXSA9IExFOwotCQluYW1lc1tJZHMuSURfTEZMT09SXSA9IExGTE9PUjsKLQkJbmFtZXNbSWRzLklEX0xPV0FTVF0gPSBMT1dBU1Q7Ci0JCW5hbWVzW0lkcy5JRF9MT1pdID0gTE9aOwotCQluYW1lc1tJZHMuSURfTFJNXSA9IExSTTsKLQkJbmFtZXNbSWRzLklEX0xTQVFVT10gPSBMU0FRVU87Ci0JCW5hbWVzW0lkcy5JRF9MU1FVT10gPSBMU1FVTzsKLQkJbmFtZXNbSWRzLklEX0xUXSA9IExUOwotCQluYW1lc1tJZHMuSURfTUFDUl0gPSBNQUNSOwotCQluYW1lc1tJZHMuSURfTURBU0hdID0gTURBU0g7Ci0JCW5hbWVzW0lkcy5JRF9NSUNST10gPSBNSUNSTzsKLQkJbmFtZXNbSWRzLklEX01JRERPVF0gPSBNSURET1Q7Ci0JCW5hbWVzW0lkcy5JRF9NSU5VU10gPSBNSU5VUzsKLQkJbmFtZXNbSWRzLklEX01VX0xdID0gTVVfTDsKLQkJbmFtZXNbSWRzLklEX01VX1VdID0gTVVfVTsKLQkJbmFtZXNbSWRzLklEX05BQkxBXSA9IE5BQkxBOwotCQluYW1lc1tJZHMuSURfTkJTUF0gPSBOQlNQOwotCQluYW1lc1tJZHMuSURfTkRBU0hdID0gTkRBU0g7Ci0JCW5hbWVzW0lkcy5JRF9ORV0gPSBORTsKLQkJbmFtZXNbSWRzLklEX05JXSA9IE5JOwotCQluYW1lc1tJZHMuSURfTk9UXSA9IE5PVDsKLQkJbmFtZXNbSWRzLklEX05PVElOXSA9IE5PVElOOwotCQluYW1lc1tJZHMuSURfTlNVQl0gPSBOU1VCOwotCQluYW1lc1tJZHMuSURfTlRJTERFX0xdID0gTlRJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9OVElMREVfVV0gPSBOVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX05VX0xdID0gTlVfTDsKLQkJbmFtZXNbSWRzLklEX05VX1VdID0gTlVfVTsKLQkJbmFtZXNbSWRzLklEX09BQ1VURV9MXSA9IE9BQ1VURV9MOwotCQluYW1lc1tJZHMuSURfT0FDVVRFX1VdID0gT0FDVVRFX1U7Ci0JCW5hbWVzW0lkcy5JRF9PQ0lSQ19MXSA9IE9DSVJDX0w7Ci0JCW5hbWVzW0lkcy5JRF9PQ0lSQ19VXSA9IE9DSVJDX1U7Ci0JCW5hbWVzW0lkcy5JRF9PRUxJR19MXSA9IE9FTElHX0w7Ci0JCW5hbWVzW0lkcy5JRF9PRUxJR19VXSA9IE9FTElHX1U7Ci0JCW5hbWVzW0lkcy5JRF9PR1JBVkVfTF0gPSBPR1JBVkVfTDsKLQkJbmFtZXNbSWRzLklEX09HUkFWRV9VXSA9IE9HUkFWRV9VOwotCQluYW1lc1tJZHMuSURfT0xJTkVdID0gT0xJTkU7Ci0JCW5hbWVzW0lkcy5JRF9PTUVHQV9MXSA9IE9NRUdBX0w7Ci0JCW5hbWVzW0lkcy5JRF9PTUVHQV9VXSA9IE9NRUdBX1U7Ci0JCW5hbWVzW0lkcy5JRF9PTUlDUk9OX0xdID0gT01JQ1JPTl9MOwotCQluYW1lc1tJZHMuSURfT01JQ1JPTl9VXSA9IE9NSUNST05fVTsKLQkJbmFtZXNbSWRzLklEX09QTFVTXSA9IE9QTFVTOwotCQluYW1lc1tJZHMuSURfT1JdID0gT1I7Ci0JCW5hbWVzW0lkcy5JRF9PUkRGXSA9IE9SREY7Ci0JCW5hbWVzW0lkcy5JRF9PUkRNXSA9IE9SRE07Ci0JCW5hbWVzW0lkcy5JRF9PU0xBU0hfTF0gPSBPU0xBU0hfTDsKLQkJbmFtZXNbSWRzLklEX09TTEFTSF9VXSA9IE9TTEFTSF9VOwotCQluYW1lc1tJZHMuSURfT1RJTERFX0xdID0gT1RJTERFX0w7Ci0JCW5hbWVzW0lkcy5JRF9PVElMREVfVV0gPSBPVElMREVfVTsKLQkJbmFtZXNbSWRzLklEX09USU1FU10gPSBPVElNRVM7Ci0JCW5hbWVzW0lkcy5JRF9PVU1MX0xdID0gT1VNTF9MOwotCQluYW1lc1tJZHMuSURfT1VNTF9VXSA9IE9VTUxfVTsKLQkJbmFtZXNbSWRzLklEX1BBUkFdID0gUEFSQTsKLQkJbmFtZXNbSWRzLklEX1BBUlRdID0gUEFSVDsKLQkJbmFtZXNbSWRzLklEX1BFUk1JTF0gPSBQRVJNSUw7Ci0JCW5hbWVzW0lkcy5JRF9QRVJQXSA9IFBFUlA7Ci0JCW5hbWVzW0lkcy5JRF9QSElfTF0gPSBQSElfTDsKLQkJbmFtZXNbSWRzLklEX1BISV9VXSA9IFBISV9VOwotCQluYW1lc1tJZHMuSURfUElWXSA9IFBJVjsKLQkJbmFtZXNbSWRzLklEX1BJX0xdID0gUElfTDsKLQkJbmFtZXNbSWRzLklEX1BJX1VdID0gUElfVTsKLQkJbmFtZXNbSWRzLklEX1BMVVNNTl0gPSBQTFVTTU47Ci0JCW5hbWVzW0lkcy5JRF9QT1VORF0gPSBQT1VORDsKLQkJbmFtZXNbSWRzLklEX1BSSU1FX0xdID0gUFJJTUVfTDsKLQkJbmFtZXNbSWRzLklEX1BSSU1FX1VdID0gUFJJTUVfVTsKLQkJbmFtZXNbSWRzLklEX1BST0RdID0gUFJPRDsKLQkJbmFtZXNbSWRzLklEX1BST1BdID0gUFJPUDsKLQkJbmFtZXNbSWRzLklEX1BTSV9MXSA9IFBTSV9MOwotCQluYW1lc1tJZHMuSURfUFNJX1VdID0gUFNJX1U7Ci0JCW5hbWVzW0lkcy5JRF9RVU9UXSA9IFFVT1Q7Ci0JCW5hbWVzW0lkcy5JRF9SQURJQ10gPSBSQURJQzsKLQkJbmFtZXNbSWRzLklEX1JBTkddID0gUkFORzsKLQkJbmFtZXNbSWRzLklEX1JBUVVPXSA9IFJBUVVPOwotCQluYW1lc1tJZHMuSURfUkFSUl9MXSA9IFJBUlJfTDsKLQkJbmFtZXNbSWRzLklEX1JBUlJfVV0gPSBSQVJSX1U7Ci0JCW5hbWVzW0lkcy5JRF9SQ0VJTF0gPSBSQ0VJTDsKLQkJbmFtZXNbSWRzLklEX1JEUVVPXSA9IFJEUVVPOwotCQluYW1lc1tJZHMuSURfUkVBTF0gPSBSRUFMOwotCQluYW1lc1tJZHMuSURfUkVHXSA9IFJFRzsKLQkJbmFtZXNbSWRzLklEX1JGTE9PUl0gPSBSRkxPT1I7Ci0JCW5hbWVzW0lkcy5JRF9SSE9fTF0gPSBSSE9fTDsKLQkJbmFtZXNbSWRzLklEX1JIT19VXSA9IFJIT19VOwotCQluYW1lc1tJZHMuSURfUkxNXSA9IFJMTTsKLQkJbmFtZXNbSWRzLklEX1JTQVFVT10gPSBSU0FRVU87Ci0JCW5hbWVzW0lkcy5JRF9SU1FVT10gPSBSU1FVTzsKLQkJbmFtZXNbSWRzLklEX1NCUVVPXSA9IFNCUVVPOwotCQluYW1lc1tJZHMuSURfU0NBUk9OX0xdID0gU0NBUk9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9TQ0FST05fVV0gPSBTQ0FST05fVTsKLQkJbmFtZXNbSWRzLklEX1NET1RdID0gU0RPVDsKLQkJbmFtZXNbSWRzLklEX1NFQ1RdID0gU0VDVDsKLQkJbmFtZXNbSWRzLklEX1NIWV0gPSBTSFk7Ci0JCW5hbWVzW0lkcy5JRF9TSUdNQUZdID0gU0lHTUFGOwotCQluYW1lc1tJZHMuSURfU0lHTUFfTF0gPSBTSUdNQV9MOwotCQluYW1lc1tJZHMuSURfU0lHTUFfVV0gPSBTSUdNQV9VOwotCQluYW1lc1tJZHMuSURfU0lNXSA9IFNJTTsKLQkJbmFtZXNbSWRzLklEX1NQQURFU10gPSBTUEFERVM7Ci0JCW5hbWVzW0lkcy5JRF9TVUJdID0gU1VCOwotCQluYW1lc1tJZHMuSURfU1VCRV0gPSBTVUJFOwotCQluYW1lc1tJZHMuSURfU1VNXSA9IFNVTTsKLQkJbmFtZXNbSWRzLklEX1NVUF0gPSBTVVA7Ci0JCW5hbWVzW0lkcy5JRF9TVVAxXSA9IFNVUDE7Ci0JCW5hbWVzW0lkcy5JRF9TVVAyXSA9IFNVUDI7Ci0JCW5hbWVzW0lkcy5JRF9TVVAzXSA9IFNVUDM7Ci0JCW5hbWVzW0lkcy5JRF9TVVBFXSA9IFNVUEU7Ci0JCW5hbWVzW0lkcy5JRF9TWkxJR10gPSBTWkxJRzsKLQkJbmFtZXNbSWRzLklEX1RBVV9MXSA9IFRBVV9MOwotCQluYW1lc1tJZHMuSURfVEFVX1VdID0gVEFVX1U7Ci0JCW5hbWVzW0lkcy5JRF9USEVSRTRdID0gVEhFUkU0OwotCQluYW1lc1tJZHMuSURfVEhFVEFTWU1dID0gVEhFVEFTWU07Ci0JCW5hbWVzW0lkcy5JRF9USEVUQV9MXSA9IFRIRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9USEVUQV9VXSA9IFRIRVRBX1U7Ci0JCW5hbWVzW0lkcy5JRF9USElOU1BdID0gVEhJTlNQOwotCQluYW1lc1tJZHMuSURfVEhPUk5fTF0gPSBUSE9STl9MOwotCQluYW1lc1tJZHMuSURfVEhPUk5fVV0gPSBUSE9STl9VOwotCQluYW1lc1tJZHMuSURfVElMREVdID0gVElMREU7Ci0JCW5hbWVzW0lkcy5JRF9USU1FU10gPSBUSU1FUzsKLQkJbmFtZXNbSWRzLklEX1RSQURFXSA9IFRSQURFOwotCQluYW1lc1tJZHMuSURfVUFDVVRFX0xdID0gVUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQUNVVEVfVV0gPSBVQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX1VBUlJfTF0gPSBVQVJSX0w7Ci0JCW5hbWVzW0lkcy5JRF9VQVJSX1VdID0gVUFSUl9VOwotCQluYW1lc1tJZHMuSURfVUNJUkNfTF0gPSBVQ0lSQ19MOwotCQluYW1lc1tJZHMuSURfVUNJUkNfVV0gPSBVQ0lSQ19VOwotCQluYW1lc1tJZHMuSURfVUdSQVZFX0xdID0gVUdSQVZFX0w7Ci0JCW5hbWVzW0lkcy5JRF9VR1JBVkVfVV0gPSBVR1JBVkVfVTsKLQkJbmFtZXNbSWRzLklEX1VNTF0gPSBVTUw7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJSF0gPSBVUFNJSDsKLQkJbmFtZXNbSWRzLklEX1VQU0lMT05fTF0gPSBVUFNJTE9OX0w7Ci0JCW5hbWVzW0lkcy5JRF9VUFNJTE9OX1VdID0gVVBTSUxPTl9VOwotCQluYW1lc1tJZHMuSURfVVVNTF9MXSA9IFVVTUxfTDsKLQkJbmFtZXNbSWRzLklEX1VVTUxfVV0gPSBVVU1MX1U7Ci0JCW5hbWVzW0lkcy5JRF9XRUlFUlBdID0gV0VJRVJQOwotCQluYW1lc1tJZHMuSURfWElfTF0gPSBYSV9MOwotCQluYW1lc1tJZHMuSURfWElfVV0gPSBYSV9VOwotCQluYW1lc1tJZHMuSURfWUFDVVRFX0xdID0gWUFDVVRFX0w7Ci0JCW5hbWVzW0lkcy5JRF9ZQUNVVEVfVV0gPSBZQUNVVEVfVTsKLQkJbmFtZXNbSWRzLklEX1lFTl0gPSBZRU47Ci0JCW5hbWVzW0lkcy5JRF9ZVU1MX0xdID0gWVVNTF9MOwotCQluYW1lc1tJZHMuSURfWVVNTF9VXSA9IFlVTUxfVTsKLQkJbmFtZXNbSWRzLklEX1pFVEFfTF0gPSBaRVRBX0w7Ci0JCW5hbWVzW0lkcy5JRF9aRVRBX1VdID0gWkVUQV9VOwotCQluYW1lc1tJZHMuSURfWldKXSA9IFpXSjsKLQkJbmFtZXNbSWRzLklEX1pXTkpdID0gWldOSjsKLQl9Ci0JcHJpdmF0ZSBzdGF0aWMgY2hhcltdIHZhbHVlcyA9IG51bGw7Ci0KLQlzdGF0aWMgewotCQl2YWx1ZXMgPSBuZXcgY2hhcltJZHMuZ2V0TnVtT2ZJZHMoKV07Ci0JCXZhbHVlc1tJZHMuSURfQUFDVVRFX0xdID0gMjI1OwotCQl2YWx1ZXNbSWRzLklEX0FBQ1VURV9VXSA9IDE5MzsKLQkJdmFsdWVzW0lkcy5JRF9BQ0lSQ19MXSA9IDIyNjsKLQkJdmFsdWVzW0lkcy5JRF9BQ0lSQ19VXSA9IDE5NDsKLQkJdmFsdWVzW0lkcy5JRF9BQ1VURV0gPSAxODA7Ci0JCXZhbHVlc1tJZHMuSURfQUVMSUdfTF0gPSAyMzA7Ci0JCXZhbHVlc1tJZHMuSURfQUVMSUdfVV0gPSAxOTg7Ci0JCXZhbHVlc1tJZHMuSURfQUdSQVZFX0xdID0gMjI0OwotCQl2YWx1ZXNbSWRzLklEX0FHUkFWRV9VXSA9IDE5MjsKLQkJdmFsdWVzW0lkcy5JRF9BTEVGU1lNXSA9IDg1MDE7Ci0JCXZhbHVlc1tJZHMuSURfQUxQSEFfTF0gPSA5NDU7Ci0JCXZhbHVlc1tJZHMuSURfQUxQSEFfVV0gPSA5MTM7Ci0JCXZhbHVlc1tJZHMuSURfQU1QXSA9IDM4OwotCQl2YWx1ZXNbSWRzLklEX0FORF0gPSA4NzQzOwotCQl2YWx1ZXNbSWRzLklEX0FOR10gPSA4NzM2OwotCQl2YWx1ZXNbSWRzLklEX0FSSU5HX0xdID0gMjI5OwotCQl2YWx1ZXNbSWRzLklEX0FSSU5HX1VdID0gMTk3OwotCQl2YWx1ZXNbSWRzLklEX0FTWU1QXSA9IDg3NzY7Ci0JCXZhbHVlc1tJZHMuSURfQVRJTERFX0xdID0gMjI3OwotCQl2YWx1ZXNbSWRzLklEX0FUSUxERV9VXSA9IDE5NTsKLQkJdmFsdWVzW0lkcy5JRF9BVU1MX0xdID0gMjI4OwotCQl2YWx1ZXNbSWRzLklEX0FVTUxfVV0gPSAxOTY7Ci0JCXZhbHVlc1tJZHMuSURfQkRRVU9dID0gODIyMjsKLQkJdmFsdWVzW0lkcy5JRF9CRVRBX0xdID0gOTQ2OwotCQl2YWx1ZXNbSWRzLklEX0JFVEFfVV0gPSA5MTQ7Ci0JCXZhbHVlc1tJZHMuSURfQlJWQkFSXSA9IDE2NjsKLQkJdmFsdWVzW0lkcy5JRF9CVUxMXSA9IDgyMjY7Ci0JCXZhbHVlc1tJZHMuSURfQ0FQXSA9IDg3NDU7Ci0JCXZhbHVlc1tJZHMuSURfQ0NFRElMX0xdID0gMjMxOwotCQl2YWx1ZXNbSWRzLklEX0NDRURJTF9VXSA9IDE5OTsKLQkJdmFsdWVzW0lkcy5JRF9DRURJTF0gPSAxODQ7Ci0JCXZhbHVlc1tJZHMuSURfQ0VOVF0gPSAxNjI7Ci0JCXZhbHVlc1tJZHMuSURfQ0hJX0xdID0gOTY3OwotCQl2YWx1ZXNbSWRzLklEX0NISV9VXSA9IDkzNTsKLQkJdmFsdWVzW0lkcy5JRF9DSVJDXSA9IDcxMDsKLQkJdmFsdWVzW0lkcy5JRF9DTFVCU10gPSA5ODI3OwotCQl2YWx1ZXNbSWRzLklEX0NPTkddID0gODc3MzsKLQkJdmFsdWVzW0lkcy5JRF9DT1BZXSA9IDE2OTsKLQkJdmFsdWVzW0lkcy5JRF9DUkFSUl0gPSA4NjI5OwotCQl2YWx1ZXNbSWRzLklEX0NVUF0gPSA4NzQ2OwotCQl2YWx1ZXNbSWRzLklEX0NVUlJFTl0gPSAxNjQ7Ci0JCXZhbHVlc1tJZHMuSURfREFHR0VSX0xdID0gODIyNDsKLQkJdmFsdWVzW0lkcy5JRF9EQUdHRVJfVV0gPSA4MjI1OwotCQl2YWx1ZXNbSWRzLklEX0RBUlJfTF0gPSA4NTk1OwotCQl2YWx1ZXNbSWRzLklEX0RBUlJfVV0gPSA4NjU5OwotCQl2YWx1ZXNbSWRzLklEX0RFR10gPSAxNzY7Ci0JCXZhbHVlc1tJZHMuSURfREVMVEFfTF0gPSA5NDg7Ci0JCXZhbHVlc1tJZHMuSURfREVMVEFfVV0gPSA5MTY7Ci0JCXZhbHVlc1tJZHMuSURfRElBTVNdID0gOTgzMDsKLQkJdmFsdWVzW0lkcy5JRF9ESVZJREVdID0gMjQ3OwotCQl2YWx1ZXNbSWRzLklEX0VBQ1VURV9MXSA9IDIzMzsKLQkJdmFsdWVzW0lkcy5JRF9FQUNVVEVfVV0gPSAyMDE7Ci0JCXZhbHVlc1tJZHMuSURfRUNJUkNfTF0gPSAyMzQ7Ci0JCXZhbHVlc1tJZHMuSURfRUNJUkNfVV0gPSAyMDI7Ci0JCXZhbHVlc1tJZHMuSURfRUdSQVZFX0xdID0gMjMyOwotCQl2YWx1ZXNbSWRzLklEX0VHUkFWRV9VXSA9IDIwMDsKLQkJdmFsdWVzW0lkcy5JRF9FTVBUWV0gPSA4NzA5OwotCQl2YWx1ZXNbSWRzLklEX0VNU1BdID0gODE5NTsKLQkJdmFsdWVzW0lkcy5JRF9FTlNQXSA9IDgxOTQ7Ci0JCXZhbHVlc1tJZHMuSURfRVBTSUxPTl9MXSA9IDk0OTsKLQkJdmFsdWVzW0lkcy5JRF9FUFNJTE9OX1VdID0gOTE3OwotCQl2YWx1ZXNbSWRzLklEX0VRVUlWXSA9IDg4MDE7Ci0JCXZhbHVlc1tJZHMuSURfRVRBX0xdID0gOTUxOwotCQl2YWx1ZXNbSWRzLklEX0VUQV9VXSA9IDkxOTsKLQkJdmFsdWVzW0lkcy5JRF9FVEhfTF0gPSAyNDA7Ci0JCXZhbHVlc1tJZHMuSURfRVRIX1VdID0gMjA4OwotCQl2YWx1ZXNbSWRzLklEX0VVTUxfTF0gPSAyMzU7Ci0JCXZhbHVlc1tJZHMuSURfRVVNTF9VXSA9IDIwMzsKLQkJdmFsdWVzW0lkcy5JRF9FVVJPXSA9IDgzNjQ7Ci0JCXZhbHVlc1tJZHMuSURfRVhJU1RdID0gODcwNzsKLQkJdmFsdWVzW0lkcy5JRF9GTk9GXSA9IDQwMjsKLQkJdmFsdWVzW0lkcy5JRF9GT1JBTExdID0gODcwNDsKLQkJdmFsdWVzW0lkcy5JRF9GUkFDMTJdID0gMTg5OwotCQl2YWx1ZXNbSWRzLklEX0ZSQUMxNF0gPSAxODg7Ci0JCXZhbHVlc1tJZHMuSURfRlJBQzM0XSA9IDE5MDsKLQkJdmFsdWVzW0lkcy5JRF9GUkFTTF0gPSA4MjYwOwotCQl2YWx1ZXNbSWRzLklEX0dBTU1BX0xdID0gOTQ3OwotCQl2YWx1ZXNbSWRzLklEX0dBTU1BX1VdID0gOTE1OwotCQl2YWx1ZXNbSWRzLklEX0dFXSA9IDg4MDU7Ci0JCXZhbHVlc1tJZHMuSURfR1RdID0gNjI7Ci0JCXZhbHVlc1tJZHMuSURfSEFSUl9MXSA9IDg1OTY7Ci0JCXZhbHVlc1tJZHMuSURfSEFSUl9VXSA9IDg2NjA7Ci0JCXZhbHVlc1tJZHMuSURfSEVBUlRTXSA9IDk4Mjk7Ci0JCXZhbHVlc1tJZHMuSURfSEVMTElQXSA9IDgyMzA7Ci0JCXZhbHVlc1tJZHMuSURfSUFDVVRFX0xdID0gMjM3OwotCQl2YWx1ZXNbSWRzLklEX0lBQ1VURV9VXSA9IDIwNTsKLQkJdmFsdWVzW0lkcy5JRF9JQ0lSQ19MXSA9IDIzODsKLQkJdmFsdWVzW0lkcy5JRF9JQ0lSQ19VXSA9IDIwNjsKLQkJdmFsdWVzW0lkcy5JRF9JRVhDTF0gPSAxNjE7Ci0JCXZhbHVlc1tJZHMuSURfSUdSQVZFX0xdID0gMjM2OwotCQl2YWx1ZXNbSWRzLklEX0lHUkFWRV9VXSA9IDIwNDsKLQkJdmFsdWVzW0lkcy5JRF9JTUFHRV0gPSA4NDY1OwotCQl2YWx1ZXNbSWRzLklEX0lORklOXSA9IDg3MzQ7Ci0JCXZhbHVlc1tJZHMuSURfSU5UXSA9IDg3NDc7Ci0JCXZhbHVlc1tJZHMuSURfSU9UQV9MXSA9IDk1MzsKLQkJdmFsdWVzW0lkcy5JRF9JT1RBX1VdID0gOTIxOwotCQl2YWx1ZXNbSWRzLklEX0lRVUVTVF0gPSAxOTE7Ci0JCXZhbHVlc1tJZHMuSURfSVNJTl0gPSA4NzEyOwotCQl2YWx1ZXNbSWRzLklEX0lVTUxfTF0gPSAyMzk7Ci0JCXZhbHVlc1tJZHMuSURfSVVNTF9VXSA9IDIwNzsKLQkJdmFsdWVzW0lkcy5JRF9LQVBQQV9MXSA9IDk1NDsKLQkJdmFsdWVzW0lkcy5JRF9LQVBQQV9VXSA9IDkyMjsKLQkJdmFsdWVzW0lkcy5JRF9MQU1CREFfTF0gPSA5NTU7Ci0JCXZhbHVlc1tJZHMuSURfTEFNQkRBX1VdID0gOTIzOwotCQl2YWx1ZXNbSWRzLklEX0xBTkddID0gOTAwMTsKLQkJdmFsdWVzW0lkcy5JRF9MQVFVT10gPSAxNzE7Ci0JCXZhbHVlc1tJZHMuSURfTEFSUl9MXSA9IDg1OTI7Ci0JCXZhbHVlc1tJZHMuSURfTEFSUl9VXSA9IDg2NTY7Ci0JCXZhbHVlc1tJZHMuSURfTENFSUxdID0gODk2ODsKLQkJdmFsdWVzW0lkcy5JRF9MRFFVT10gPSA4MjIwOwotCQl2YWx1ZXNbSWRzLklEX0xFXSA9IDg4MDQ7Ci0JCXZhbHVlc1tJZHMuSURfTEZMT09SXSA9IDg5NzA7Ci0JCXZhbHVlc1tJZHMuSURfTE9XQVNUXSA9IDg3Mjc7Ci0JCXZhbHVlc1tJZHMuSURfTE9aXSA9IDk2NzQ7Ci0JCXZhbHVlc1tJZHMuSURfTFJNXSA9IDgyMDY7Ci0JCXZhbHVlc1tJZHMuSURfTFNBUVVPXSA9IDgyNDk7Ci0JCXZhbHVlc1tJZHMuSURfTFNRVU9dID0gODIxNjsKLQkJdmFsdWVzW0lkcy5JRF9MVF0gPSA2MDsKLQkJdmFsdWVzW0lkcy5JRF9NQUNSXSA9IDE3NTsKLQkJdmFsdWVzW0lkcy5JRF9NREFTSF0gPSA4MjEyOwotCQl2YWx1ZXNbSWRzLklEX01JQ1JPXSA9IDE4MTsKLQkJdmFsdWVzW0lkcy5JRF9NSURET1RdID0gMTgzOwotCQl2YWx1ZXNbSWRzLklEX01JTlVTXSA9IDg3MjI7Ci0JCXZhbHVlc1tJZHMuSURfTVVfTF0gPSA5NTY7Ci0JCXZhbHVlc1tJZHMuSURfTVVfVV0gPSA5MjQ7Ci0JCXZhbHVlc1tJZHMuSURfTkFCTEFdID0gODcxMTsKLQkJdmFsdWVzW0lkcy5JRF9OQlNQXSA9IDE2MDsKLQkJdmFsdWVzW0lkcy5JRF9OREFTSF0gPSA4MjExOwotCQl2YWx1ZXNbSWRzLklEX05FXSA9IDg4MDA7Ci0JCXZhbHVlc1tJZHMuSURfTkldID0gODcxNTsKLQkJdmFsdWVzW0lkcy5JRF9OT1RdID0gMTcyOwotCQl2YWx1ZXNbSWRzLklEX05PVElOXSA9IDg3MTM7Ci0JCXZhbHVlc1tJZHMuSURfTlNVQl0gPSA4ODM2OwotCQl2YWx1ZXNbSWRzLklEX05USUxERV9MXSA9IDI0MTsKLQkJdmFsdWVzW0lkcy5JRF9OVElMREVfVV0gPSAyMDk7Ci0JCXZhbHVlc1tJZHMuSURfTlVfTF0gPSA5NTc7Ci0JCXZhbHVlc1tJZHMuSURfTlVfVV0gPSA5MjU7Ci0JCXZhbHVlc1tJZHMuSURfT0FDVVRFX0xdID0gMjQzOwotCQl2YWx1ZXNbSWRzLklEX09BQ1VURV9VXSA9IDIxMTsKLQkJdmFsdWVzW0lkcy5JRF9PQ0lSQ19MXSA9IDI0NDsKLQkJdmFsdWVzW0lkcy5JRF9PQ0lSQ19VXSA9IDIxMjsKLQkJdmFsdWVzW0lkcy5JRF9PRUxJR19MXSA9IDMzOTsKLQkJdmFsdWVzW0lkcy5JRF9PRUxJR19VXSA9IDMzODsKLQkJdmFsdWVzW0lkcy5JRF9PR1JBVkVfTF0gPSAyNDI7Ci0JCXZhbHVlc1tJZHMuSURfT0dSQVZFX1VdID0gMjEwOwotCQl2YWx1ZXNbSWRzLklEX09MSU5FXSA9IDgyNTQ7Ci0JCXZhbHVlc1tJZHMuSURfT01FR0FfTF0gPSA5Njk7Ci0JCXZhbHVlc1tJZHMuSURfT01FR0FfVV0gPSA5Mzc7Ci0JCXZhbHVlc1tJZHMuSURfT01JQ1JPTl9MXSA9IDk1OTsKLQkJdmFsdWVzW0lkcy5JRF9PTUlDUk9OX1VdID0gOTI3OwotCQl2YWx1ZXNbSWRzLklEX09QTFVTXSA9IDg4NTM7Ci0JCXZhbHVlc1tJZHMuSURfT1JdID0gODc0NDsKLQkJdmFsdWVzW0lkcy5JRF9PUkRGXSA9IDE3MDsKLQkJdmFsdWVzW0lkcy5JRF9PUkRNXSA9IDE4NjsKLQkJdmFsdWVzW0lkcy5JRF9PU0xBU0hfTF0gPSAyNDg7Ci0JCXZhbHVlc1tJZHMuSURfT1NMQVNIX1VdID0gMjE2OwotCQl2YWx1ZXNbSWRzLklEX09USUxERV9MXSA9IDI0NTsKLQkJdmFsdWVzW0lkcy5JRF9PVElMREVfVV0gPSAyMTM7Ci0JCXZhbHVlc1tJZHMuSURfT1RJTUVTXSA9IDg4NTU7Ci0JCXZhbHVlc1tJZHMuSURfT1VNTF9MXSA9IDI0NjsKLQkJdmFsdWVzW0lkcy5JRF9PVU1MX1VdID0gMjE0OwotCQl2YWx1ZXNbSWRzLklEX1BBUkFdID0gMTgyOwotCQl2YWx1ZXNbSWRzLklEX1BBUlRdID0gODcwNjsKLQkJdmFsdWVzW0lkcy5JRF9QRVJNSUxdID0gODI0MDsKLQkJdmFsdWVzW0lkcy5JRF9QRVJQXSA9IDg4Njk7Ci0JCXZhbHVlc1tJZHMuSURfUEhJX0xdID0gOTY2OwotCQl2YWx1ZXNbSWRzLklEX1BISV9VXSA9IDkzNDsKLQkJdmFsdWVzW0lkcy5JRF9QSVZdID0gOTgyOwotCQl2YWx1ZXNbSWRzLklEX1BJX0xdID0gOTYwOwotCQl2YWx1ZXNbSWRzLklEX1BJX1VdID0gOTI4OwotCQl2YWx1ZXNbSWRzLklEX1BMVVNNTl0gPSAxNzc7Ci0JCXZhbHVlc1tJZHMuSURfUE9VTkRdID0gMTYzOwotCQl2YWx1ZXNbSWRzLklEX1BSSU1FX0xdID0gODI0MjsKLQkJdmFsdWVzW0lkcy5JRF9QUklNRV9VXSA9IDgyNDM7Ci0JCXZhbHVlc1tJZHMuSURfUFJPRF0gPSA4NzE5OwotCQl2YWx1ZXNbSWRzLklEX1BST1BdID0gODczMzsKLQkJdmFsdWVzW0lkcy5JRF9QU0lfTF0gPSA5Njg7Ci0JCXZhbHVlc1tJZHMuSURfUFNJX1VdID0gOTM2OwotCQl2YWx1ZXNbSWRzLklEX1FVT1RdID0gMzQ7Ci0JCXZhbHVlc1tJZHMuSURfUkFESUNdID0gODczMDsKLQkJdmFsdWVzW0lkcy5JRF9SQU5HXSA9IDkwMDI7Ci0JCXZhbHVlc1tJZHMuSURfUkFRVU9dID0gMTg3OwotCQl2YWx1ZXNbSWRzLklEX1JBUlJfTF0gPSA4NTk0OwotCQl2YWx1ZXNbSWRzLklEX1JBUlJfVV0gPSA4NjU4OwotCQl2YWx1ZXNbSWRzLklEX1JDRUlMXSA9IDg5Njk7Ci0JCXZhbHVlc1tJZHMuSURfUkRRVU9dID0gODIyMTsKLQkJdmFsdWVzW0lkcy5JRF9SRUFMXSA9IDg0NzY7Ci0JCXZhbHVlc1tJZHMuSURfUkVHXSA9IDE3NDsKLQkJdmFsdWVzW0lkcy5JRF9SRkxPT1JdID0gODk3MTsKLQkJdmFsdWVzW0lkcy5JRF9SSE9fTF0gPSA5NjE7Ci0JCXZhbHVlc1tJZHMuSURfUkhPX1VdID0gOTI5OwotCQl2YWx1ZXNbSWRzLklEX1JMTV0gPSA4MjA3OwotCQl2YWx1ZXNbSWRzLklEX1JTQVFVT10gPSA4MjUwOwotCQl2YWx1ZXNbSWRzLklEX1JTUVVPXSA9IDgyMTc7Ci0JCXZhbHVlc1tJZHMuSURfU0JRVU9dID0gODIxODsKLQkJdmFsdWVzW0lkcy5JRF9TQ0FST05fTF0gPSAzNTM7Ci0JCXZhbHVlc1tJZHMuSURfU0NBUk9OX1VdID0gMzUyOwotCQl2YWx1ZXNbSWRzLklEX1NET1RdID0gODkwMTsKLQkJdmFsdWVzW0lkcy5JRF9TRUNUXSA9IDE2NzsKLQkJdmFsdWVzW0lkcy5JRF9TSFldID0gMTczOwotCQl2YWx1ZXNbSWRzLklEX1NJR01BRl0gPSA5NjI7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFfTF0gPSA5NjM7Ci0JCXZhbHVlc1tJZHMuSURfU0lHTUFfVV0gPSA5MzE7Ci0JCXZhbHVlc1tJZHMuSURfU0lNXSA9IDg3NjQ7Ci0JCXZhbHVlc1tJZHMuSURfU1BBREVTXSA9IDk4MjQ7Ci0JCXZhbHVlc1tJZHMuSURfU1VCXSA9IDg4MzQ7Ci0JCXZhbHVlc1tJZHMuSURfU1VCRV0gPSA4ODM4OwotCQl2YWx1ZXNbSWRzLklEX1NVTV0gPSA4NzIxOwotCQl2YWx1ZXNbSWRzLklEX1NVUF0gPSA4ODM1OwotCQl2YWx1ZXNbSWRzLklEX1NVUDFdID0gMTg1OwotCQl2YWx1ZXNbSWRzLklEX1NVUDJdID0gMTc4OwotCQl2YWx1ZXNbSWRzLklEX1NVUDNdID0gMTc5OwotCQl2YWx1ZXNbSWRzLklEX1NVUEVdID0gODgzOTsKLQkJdmFsdWVzW0lkcy5JRF9TWkxJR10gPSAyMjM7Ci0JCXZhbHVlc1tJZHMuSURfVEFVX0xdID0gOTY0OwotCQl2YWx1ZXNbSWRzLklEX1RBVV9VXSA9IDkzMjsKLQkJdmFsdWVzW0lkcy5JRF9USEVSRTRdID0gODc1NjsKLQkJdmFsdWVzW0lkcy5JRF9USEVUQVNZTV0gPSA5Nzc7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFfTF0gPSA5NTI7Ci0JCXZhbHVlc1tJZHMuSURfVEhFVEFfVV0gPSA5MjA7Ci0JCXZhbHVlc1tJZHMuSURfVEhJTlNQXSA9IDgyMDE7Ci0JCXZhbHVlc1tJZHMuSURfVEhPUk5fTF0gPSAyNTQ7Ci0JCXZhbHVlc1tJZHMuSURfVEhPUk5fVV0gPSAyMjI7Ci0JCXZhbHVlc1tJZHMuSURfVElMREVdID0gNzMyOwotCQl2YWx1ZXNbSWRzLklEX1RJTUVTXSA9IDIxNTsKLQkJdmFsdWVzW0lkcy5JRF9UUkFERV0gPSA4NDgyOwotCQl2YWx1ZXNbSWRzLklEX1VBQ1VURV9MXSA9IDI1MDsKLQkJdmFsdWVzW0lkcy5JRF9VQUNVVEVfVV0gPSAyMTg7Ci0JCXZhbHVlc1tJZHMuSURfVUFSUl9MXSA9IDg1OTM7Ci0JCXZhbHVlc1tJZHMuSURfVUFSUl9VXSA9IDg2NTc7Ci0JCXZhbHVlc1tJZHMuSURfVUNJUkNfTF0gPSAyNTE7Ci0JCXZhbHVlc1tJZHMuSURfVUNJUkNfVV0gPSAyMTk7Ci0JCXZhbHVlc1tJZHMuSURfVUdSQVZFX0xdID0gMjQ5OwotCQl2YWx1ZXNbSWRzLklEX1VHUkFWRV9VXSA9IDIxNzsKLQkJdmFsdWVzW0lkcy5JRF9VTUxdID0gMTY4OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lIXSA9IDk3ODsKLQkJdmFsdWVzW0lkcy5JRF9VUFNJTE9OX0xdID0gOTY1OwotCQl2YWx1ZXNbSWRzLklEX1VQU0lMT05fVV0gPSA5MzM7Ci0JCXZhbHVlc1tJZHMuSURfVVVNTF9MXSA9IDI1MjsKLQkJdmFsdWVzW0lkcy5JRF9VVU1MX1VdID0gMjIwOwotCQl2YWx1ZXNbSWRzLklEX1dFSUVSUF0gPSA4NDcyOwotCQl2YWx1ZXNbSWRzLklEX1hJX0xdID0gOTU4OwotCQl2YWx1ZXNbSWRzLklEX1hJX1VdID0gOTI2OwotCQl2YWx1ZXNbSWRzLklEX1lBQ1VURV9MXSA9IDI1MzsKLQkJdmFsdWVzW0lkcy5JRF9ZQUNVVEVfVV0gPSAyMjE7Ci0JCXZhbHVlc1tJZHMuSURfWUVOXSA9IDE2NTsKLQkJdmFsdWVzW0lkcy5JRF9ZVU1MX0xdID0gMjU1OwotCQl2YWx1ZXNbSWRzLklEX1lVTUxfVV0gPSAzNzY7Ci0JCXZhbHVlc1tJZHMuSURfWkVUQV9MXSA9IDk1MDsKLQkJdmFsdWVzW0lkcy5JRF9aRVRBX1VdID0gOTE4OwotCQl2YWx1ZXNbSWRzLklEX1pXSl0gPSA4MjA1OwotCQl2YWx1ZXNbSWRzLklEX1pXTkpdID0gODIwNDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRW50aXR5Q29sbGVjdGlvbigpIHsKLQkJc3VwZXIobmFtZXMsIFNUUklDVF9DQVNFKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW4gZW50aXR5IGRlY2xhcmF0aW9uLgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKiBAcGFyYW0gYXR0ck5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBDTU5vZGUgY3JlYXRlKFN0cmluZyBlbnRpdHlOYW1lKSB7Ci0JCWludCBpZCA9IGdldElEKGVudGl0eU5hbWUpOwotCQlpZiAoaWQgPT0gSURfVU5LTk9XTikKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyB2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKHZhbHVlc1tpZF0pOwotCQlIVE1MRW50aXR5RGVjbEltcGwgZGVjID0gbmV3IEhUTUxFbnRpdHlEZWNsSW1wbChlbnRpdHlOYW1lLCB2YWx1ZSk7Ci0KLQkJcmV0dXJuIGRlYzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQXR0ckRlY2xJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxBdHRyRGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA1ZDY2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxBdHRyRGVjbEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBjbGFzcyBvZiB7QGxpbmsgPGNvZGU+SFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uPC9jb2RlPn0gaW50ZXJmYWNlLjxicj4KLSAqLwotY2xhc3MgSFRNTEF0dHJEZWNsSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gewotCi0JcHJpdmF0ZSBIVE1MQ01EYXRhVHlwZUltcGwgdHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgdXNhZ2UgPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxBdHRyRGVjbEltcGwoU3RyaW5nIGF0dHJOYW1lLCBIVE1MQ01EYXRhVHlwZUltcGwgdmFsdWVUeXBlLCBpbnQgdmFsdWVVc2FnZSkgewotCQlzdXBlcihhdHRyTmFtZSk7Ci0JCXRoaXMudHlwZSA9IHZhbHVlVHlwZTsKLQotCQlzd2l0Y2ggKHZhbHVlVXNhZ2UpIHsKLQkJCWNhc2UgT1BUSU9OQUwgOgotCQkJY2FzZSBSRVFVSVJFRCA6Ci0JCQljYXNlIEZJWEVEIDoKLQkJCWNhc2UgUFJPSElCSVRFRCA6Ci0JCQkJdGhpcy51c2FnZSA9IHZhbHVlVXNhZ2U7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBzaG91bGQgd2Fybi4uLgotCQkJCXRoaXMudXNhZ2UgPSBPUFRJT05BTDsgLy8gZmFsbCBiYWNrCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIENNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpIHsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkgewotCQlpZiAodHlwZS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgIT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0RFRkFVTFQpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKEFycmF5cy5hc0xpc3QodHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCkpKTsKLQkJcmV0dXJuIHYuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiBAcmV0dXJuIGludAotCSAqCi0JICogUmV0dXJucyBvbmUgb2YgOgotCSAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgR1JPVVAsIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VXNhZ2UoKSB7Ci0JCXJldHVybiB1c2FnZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKQotCQkJcmV0dXJuIG5ldyBCb29sZWFuKHRydWUpOwotCQlyZXR1cm4gc3VwZXIuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTENNRGF0YVR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OTMxYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01EYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTENNRGF0YVR5cGVJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxDTURhdGFUeXBlIHsKLQotCXByaXZhdGUgaW50IGltcGxpZWRWYWx1ZUtpbmQgPSBJTVBMSUVEX1ZBTFVFX05PTkU7Ci0JcHJpdmF0ZSBTdHJpbmcgaW1wbGllZFZhbHVlID0gbnVsbDsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmdbXSBlbXB0eUFycmF5ID0gbmV3IFN0cmluZ1swXTsKLQlwcml2YXRlIFN0cmluZ1tdIGVudW1WYWx1ZXMgPSBlbXB0eUFycmF5OwotCXByaXZhdGUgU3RyaW5nIGluc3RhbmNlVmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogSFRNTENNRGF0YVR5cGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5tIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTENNRGF0YVR5cGVJbXBsKFN0cmluZyB0eXBlTmFtZSkgewotCQlzdXBlcih0eXBlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogSFRNTENNRGF0YVR5cGVJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogQHBhcmFtIG5tIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgSFRNTENNRGF0YVR5cGVJbXBsKFN0cmluZyB0eXBlTmFtZSwgU3RyaW5nIGluc3RhbmNlVmFsdWUpIHsKLQkJc3VwZXIodHlwZU5hbWUpOwotCQl0aGlzLmluc3RhbmNlVmFsdWUgPSBpbnN0YW5jZVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldFR5cGVOYW1lIG1ldGhvZAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqCi0JICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgaXMgY3JlYXRlZC4KLQkgKiBUaGlzIHJldHVybnMgbnVsbCBvZiBhIHN1aXRhYmxlIGRlZmF1bHQgaXMgbm90IGF2YWlsYWJsZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpIHsKLQkJcmV0dXJuIGluc3RhbmNlVmFsdWU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGFUeXBlTmFtZSgpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nW10KLQkgKgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzKCkgewotCQlyZXR1cm4gZW51bVZhbHVlczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUeXBlTmFtZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcgIAotCSAqCi0JICogUmV0dXJucyB0aGUgaW1wbGllZCB2YWx1ZSBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkgewotCQlyZXR1cm4gaW1wbGllZFZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldEltcGxpZWRWYWx1ZUtpbmQgbWV0aG9kCi0JICogQHJldHVybiBpbnQKLQkgKgotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiBJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQsIElNUExJRURfVkFMVUVfREVGQVVMVC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKSB7Ci0JCXJldHVybiBpbXBsaWVkVmFsdWVLaW5kOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldEVudW1WYWx1ZXMoU3RyaW5nW10gdmFsdWVzKSB7Ci0JCWVudW1WYWx1ZXMgPSBuZXcgU3RyaW5nW3ZhbHVlcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJZW51bVZhbHVlc1tpXSA9IHZhbHVlc1tpXTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHBhY2thZ2Ugc2NvcGUuCi0JICovCi0Jdm9pZCBzZXRJbXBsaWVkVmFsdWUoaW50IGtpbmQsIFN0cmluZyB2YWx1ZSkgewotCQlzd2l0Y2ggKGtpbmQpIHsKLQkJCWNhc2UgSU1QTElFRF9WQUxVRV9GSVhFRCA6Ci0JCQljYXNlIElNUExJRURfVkFMVUVfREVGQVVMVCA6Ci0JCQkJaW1wbGllZFZhbHVlS2luZCA9IGtpbmQ7Ci0JCQkJaW1wbGllZFZhbHVlID0gdmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNUExJRURfVkFMVUVfTk9ORSA6Ci0JCQlkZWZhdWx0IDoKLQkJCQlpbXBsaWVkVmFsdWVLaW5kID0gSU1QTElFRF9WQUxVRV9OT05FOwotCQkJCWltcGxpZWRWYWx1ZSA9IG51bGw7IC8vIG1heWJlIGEgbnVsbCBzdHJpbmc/Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MQ01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTU5vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFlNTU1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxDTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotLyoqCi0gKiBJbiBIVE1MIERvY3VtZW50cywgbmFtZSBhbmQgdmFsdWUgb2YgYW4gYXR0cmlidXRlL2VsZW1lbnQvZW50aXR5Ci0gKiBzaG91bGQgYmUgdHJlYXRlZCBpZ25vcmluZyB0aGVpcnMgY2FzZS4gIEhvd2V2ZXIsIGluIFhNTCBkb2N1bWVudHMsCi0gKiB0aGV5IHNob3VsZCBiZSBkaXN0aW5ndWlzaGVkIHdpdGggc2Vuc2l0aXZlbmVzcyBvZiB0aGVpciBjYXNlLgotICogQ01Ob2RlIGlzIGJhc2ljYWxseSBkZXNpZ25lZCB0byByZXByZXNlbnQgRFREcyBvciBTY2hlbWFzIGZvciBYTUwKLSAqIGRvY3VtZW50cy4gIFNvLCBpdCBkb2Vzbid0IGhhdmUgaW50ZXJmYWNlcyB0byByZXRyaWV2ZSBzdWNoIGluZm9ybWF0aW9uLgotICogSG93ZXZlciwgZGVjbGFyYXRpb25zIGluIHRoZSBIVE1MIENNIHNob3VsZCBwcm92aWRlIHN1Y2ggaW5mb3JtYXRpb24uCi0gKiBUaGlzIGludGVybWVkaWF0ZSBpbnRlcmZhY2UgaXMgaW50ZW5kZWQgdG8gcHJvdmlkZSB3aGV0aGVyIGlnbm9yZSBjYXNlcwotICogb3Igbm90Ljxicj4KLSAqLwotaW50ZXJmYWNlIEhUTUxDTU5vZGUgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+LCBpZiBkZWNsYXJhdGlvbiBpcyBmb3IgSFRNTCBhdHRyaWJ1dGUvZWxlbWVudC9lbnRpdHkuCi0JICogT3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIHNob3VsZElnbm9yZUNhc2UoKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbGVtRGVjbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTkyOTRkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSFRNTEVsZW1EZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTFByb3BlcnR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgYWxsIEhlZD8/Pz8gY2xhc3Nlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSFRNTEVsZW1EZWNsSW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBIVE1MRWxlbWVudERlY2xhcmF0aW9uLCBIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiB7Ci0KLQkvLyBEVEQKLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGF0dHJpYnV0ZXMgPSBudWxsOwotCXByb3RlY3RlZCBTdHJpbmcgdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9FTVBUWTsKLQkvKiogTmV2ZXIgYWNjZXNzIHRoaXMgZmllbGQgZGlyZWN0bHkuICBJbnN0ZWFkLCB1c2UgZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uIG1ldGhvZC4gKi8KLQlwcml2YXRlIENvbXBsZXhUeXBlRGVmaW5pdGlvbiB0eXBlRGVmaW5pdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGluY2x1c2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIENNR3JvdXBJbXBsIGV4Y2x1c2lvbiA9IG51bGw7Ci0JLy8gYWR2YW5jZWQgaW5mb3JtYXRpb24KLQlwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZEFuY2VzdG9ycyA9IG51bGw7Ci0JcHJvdGVjdGVkIGludCBjb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IGZvcm1hdFR5cGUgPSBGT1JNQVRfSFRNTDsKLQlwcm90ZWN0ZWQgaW50IGxheW91dFR5cGUgPSBMQVlPVVRfTk9ORTsKLQlwcm90ZWN0ZWQgaW50IG9taXRUeXBlID0gT01JVF9OT05FOwotCXByb3RlY3RlZCBib29sZWFuIGtlZXBTcGFjZXMgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbmRlbnRDaGlsZCA9IGZhbHNlOwotCXByb3RlY3RlZCBFbGVtZW50Q29sbGVjdGlvbiBlbGVtZW50Q29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIEF0dHJpYnV0ZUNvbGxlY3Rpb24gYXR0cmlidXRlQ29sbGVjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBDTU5hbWVkTm9kZU1hcCBFTVBUWV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXAoKSB7Ci0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJCXJldHVybiBuZXcgSXRlcmF0b3IoKSB7Ci0JCQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlKCkgewotCQkJCX0KLQkJCX07Ci0JCX0KLQl9OwotCi0JLyoqCi0JICogSFRNTEVsZW1EZWNsSW1wbCBjb25zdHJ1Y3Rvci4KLQkgKiBJbiB0aGUgSFRNTCBEVEQsIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaGFzIG5vIHNwZWNpZmljYXRpb24KLQkgKiBmb3IgaXRzIG9jY3VycmVuY2UuICBPY2N1cnJlbmNlIGlzIHNwZWNpZmVkIGluIGNvbnRlbnQgbW9kZWwsIGxpa2UKLQkgKiA8Y29kZT4oTEkpKzwvY29kZT4uICBUbyBhdm9pZCBjb25mdXNpb24gKGFuZCBjb21wbGV4aXR5KSwKLQkgKiBvY2N1cnJlbmNlIG9mIGFuIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgYWx3YXlzIDEgKGl0IG1lYW5zLCBtaW4gPSAxIGFuZAotCSAqIG1heCA9IDEpLiAgSW5zdGVhZCwgb2NjdXJyZW5jZSBvZiBDTUdyb3VwIHJlcHJlc2VudHMgYWN0dWFsIG9jY3VycmVuY2UKLQkgKiBvZiB0aGUgY29udGVudC4KLQkgKiA8YnI+Ci0JICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBIVE1MRWxlbURlY2xJbXBsKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgMSwgMSk7Ci0JCWVsZW1lbnRDb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbiA9IGNvbGxlY3Rpb24uZ2V0QXR0cmlidXRlQ29sbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpOwotCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb25OYW1lLmVxdWFscyhDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0NEQVRBKSB8fCB0eXBlRGVmaW5pdGlvbk5hbWUuZXF1YWxzKENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRU1QVFkpIHx8IHR5cGVEZWZpbml0aW9uTmFtZS5lcXVhbHMoQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9QQ0RBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeSBmYWN0b3J5ID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZmFjdG9yeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsIGVycm9yLgotCi0JCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBmYWN0b3J5LmNyZWF0ZVR5cGVEZWZpbml0aW9uKHR5cGVEZWZpbml0aW9uTmFtZSwgZWxlbWVudENvbGxlY3Rpb24pOwotCQlyZXR1cm4gZGVmOwotCX0KLQotCS8qKgotCSAqIEdldCBhbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uCi0JICovCi0JcHVibGljIEhUTUxBdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihTdHJpbmcgYXR0ck5hbWUpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkgewotCQkJY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCk7Ci0JCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOyAvLyBmYWlsIHRvIGNyZWF0ZQotCQl9Ci0KLQkJQ01Ob2RlIGNtbm9kZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJaWYgKGNtbm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJldHVybiAoSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7IC8vIGFscmVhZHkgZXhpc3RzLgotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQljcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKTsgLy8gbGF6eSBldmFsLgotCQlyZXR1cm4gYXR0cmlidXRlczsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgYW4gaW5zdGFuY2Ugb2YgY29tcGxleCB0eXBlIGRlZmluaXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb21wbGV4VHlwZURlZmluaXRpb24gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCkgewotCQlpZiAodHlwZURlZmluaXRpb24gPT0gbnVsbCkKLQkJCXR5cGVEZWZpbml0aW9uID0gY3JlYXRlQ29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCXJldHVybiB0eXBlRGVmaW5pdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50Ljxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCBhbHdheXMgcmV0dXJuIG51bGwuCi0JICogVGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsd2F5cyB0cmllcyB0byBjcmVhdGUgYSBjb21wbGV4IHR5cGUgZGVmaW5pdGlvbgotCSAqIGluc3RhbmNlIGFuZCBhY2Nlc3MgdG8gaXQuCi0JICogPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnQoKSA6IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBFbGVtZW50IGRlY2xhcmF0aW9ucyB3aGljaCB0eXBlIGlzIEVNUFRZIG9yIENEQVRBIChtYXliZSBQQ0RBVEEpCi0JICogPHN0cm9uZz5NVVNUPC9zdHJvbmc+IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYW4gYXBwcm9wcmlhdGUgdHlwZS4KLQkgKiBUaGlzIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gYWx3YXlzIHRyaWVzIHRvIGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBkZWZpbml0aW9uCi0JICogaW5zdGFuY2UgYW5kIGFjY2VzcyB0byBpdC4KLQkgKiA8YnI+Ci0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ29tcGxleFR5cGVEZWZpbml0aW9uIGRlZiA9IGdldENvbXBsZXhUeXBlRGVmaW5pdGlvbigpOyAvLyBsYXp5IGV2YWwuCi0JCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldENvbnRlbnRUeXBlKCkgOiBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24jZ2V0Q29ycmVjdGlvblR5cGUKLQkgKi8KLQlwdWJsaWMgaW50IGdldENvcnJlY3Rpb25UeXBlKCkgewotCQlyZXR1cm4gY29ycmVjdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogSFRNTCBlbGVtZW50IGRvZXNuJ3QgaGF2ZSBhbnkgZGF0YSB0eXBlLiAgU28sIHRoaXMgbWV0aG9kIGFsd2F5cwotCSAqIHJldHVybnMgPGNvZGU+bnVsbDwvY29kZT4uPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogQWxtb3N0IGVsZW1lbnRzIGRvbid0IGhhdmUgYSBleGNsdXNpb24uCi0JICogT25seSBjbGFzc2VzIHRob3NlIGhhdmUgZXhjbHVzaW9uIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBmb3JtYXQgdHlwZSBpcyA8Y29kZT5GT1JNQVRfSFRNTDwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Rm9ybWF0VHlwZSgpIHsKLQkJcmV0dXJuIGZvcm1hdFR5cGU7Ci0JfQotCi0JLyoqCi0JICogSW5jbHVzaW9uLgotCSAqIEFsbW9zdCBlbGVtZW50cyBkb24ndCBoYXZlIGEgaW5jbHVzaW9uLgotCSAqIE9ubHkgY2xhc3NlcyB0aG9zZSBoYXZlIGluY2x1c2lvbiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRJbmNsdXNpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGF5b3V0VHlwZSgpIHsKLQkJcmV0dXJuIGxheW91dFR5cGU7Ci0JfQotCi0JLyoqCi0JICogTGluZSBicmVhayBoaW50IGlzIHN0cm9uZ2x5IHJlbGF0ZWQgdG8gbGF5b3V0IHR5cGUuCi0JICogSW5kZWVkLCBpbiB0aGUgQysrRE9NLCBpdCBpcyBkZXRlcm1pbmVkIGZyb20gbGF5b3V0IHR5cGUgb25seS4KLQkgKiBTbywgdGhpcyBpbXBsZW1lbnRhdGlvbiwgYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGFsbCBkZWNsYXJhdGlvbnMsCi0JICogYWxzbyBkZXRlcm1pbmVzIGZyb20gbGF5b3V0IHR5cGUgb25seS48YnI+Ci0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVCcmVha0hpbnQoKSB7Ci0JCXN3aXRjaCAoZ2V0TGF5b3V0VHlwZSgpKSB7Ci0JCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JMT0NLIDoKLQkJCQlyZXR1cm4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORDsKLQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfQlJFQUsgOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0FGVEVSX1NUQVJUOwotCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9ISURERU4gOgotCQkJCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfTk9ORTsKLQkJfQotCX0KLQotCS8qKgotCSAqIE5vIEhUTUwgZWxlbWVudCBoYXMgbG9jYWwgZWxlbWVudHMuICBTbywgdGhpcyBtZXRob2QgYWx3YXlzCi0JICogcmV0dXJucyBhbiBlbXB0eSBtYXAuCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9taXRUeXBlKCkgewotCQlyZXR1cm4gb21pdFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCXJldHVybiBFTVBUWV9NQVA7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5DT05URU5UX0hJTlQpKSB7Ci0JCQlDb21wbGV4VHlwZURlZmluaXRpb24gZGVmID0gZ2V0Q29tcGxleFR5cGVEZWZpbml0aW9uKCk7Ci0JCQlyZXR1cm4gKGRlZiAhPSBudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCVByb3BlcnR5UHJvdmlkZXIgcHAgPSBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeS5nZXRQcm92aWRlcihwcm9wZXJ0eU5hbWUpOwotCQkJaWYgKHBwID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHBwLnN1cHBvcnRzKHRoaXMpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5TSE9VTERfSUdOT1JFX0NBU0UpKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCX0KLQkJZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkNPTlRFTlRfSElOVCkpIHsKLQkJCUNvbXBsZXhUeXBlRGVmaW5pdGlvbiBkZWYgPSBnZXRDb21wbGV4VHlwZURlZmluaXRpb24oKTsKLQkJCXJldHVybiAoZGVmICE9IG51bGwpID8gZGVmLmdldFByaW1hcnlDYW5kaWRhdGUoKSA6IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gUHJvcGVydHlQcm92aWRlckZhY3RvcnkuZ2V0UHJvdmlkZXIocHJvcGVydHlOYW1lKTsKLQkJCWlmIChwcCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIHBwLmdldCh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiBlbGVtZW50IG5hbWVzIHdoaWNoIHRlcm1pbmF0ZXMgdGhpcyBlbGVtZW50Ljxicj4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcmV0dXJuIHRydWUgd2hlbiB0aGUgZWxlbWVudCBpcyBhIEpTUCBlbGVtZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogSW4gc29tZSBlbGVtZW50cywgc3VjaCBhcyBBUFBMRVQsIGEgc291cmNlIGdlbmVyYXRvciBzaG91bGQgaW5kZW50IGNoaWxkCi0JICogZWxlbWVudHMgdGhhdCB0aGVpciBwYXJlbnRzLiAgVGhhdCBpcywgYSBzb3VyY2UgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZQotCSAqIHNvdXJjZSAgb2YgQVBQTEVUIGFuZCBQQVJBTVMgbGlrZSB0aGlzOgotCSAqIDxQUkU+Ci0JICogICAmbHQ7QVBQTEVUIC4uLiZndDsKLQkgKiAgICAgJmx0O1BBUkFNIC4uLiAmZ3Q7Ci0JICogICAgICZsdDtQQVJBTSAuLi4gJmd0OwotCSAqICAgJmx0Oy9BUFBMRVQmZ3Q7Ci0JICogPFBSRT4KLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSgpIHsKLQkJcmV0dXJuIGluZGVudENoaWxkOwotCX0KLQotCS8qKgotCSAqIE1vc3Qgb2YgZWxlbWVudHMgY2FuIGNvbXBhY3Qgc3BhY2VzIGluIHRoZWlyIGNoaWxkIHRleHQgbm9kZXMuCi0JICogU29tZSBzcGVjaWFsIGVsZW1lbnRzIHNob3VsZCBrZWVwIHRoZW0gaW4gdGhlaXIgc291cmNlLgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZEtlZXBTcGFjZXMoKSB7Ci0JCXJldHVybiBrZWVwU3BhY2VzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gbmV4dEVsZW1lbnQpIHsKLQkJSXRlcmF0b3IgaSA9IGdldFRlcm1pbmF0b3JzKCk7Ci0JCWlmIChpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBuZXh0TmFtZSA9IG5leHRFbGVtZW50LmdldEVsZW1lbnROYW1lKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJaWYgKG5leHROYW1lLmVxdWFscyhpLm5leHQoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IVE1MRW50aXR5RGVjbEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZDJhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hUTUxFbnRpdHlEZWNsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbnRpdHlEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotCi0vKioKLSAqLwotY2xhc3MgSFRNTEVudGl0eURlY2xJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIEhUTUxFbnRpdHlEZWNsYXJhdGlvbiB7Ci0KLQlwcml2YXRlIGphdmEubGFuZy5TdHJpbmcgdmFsdWUgPSBudWxsOwotCi0JLyoqCi0JICogQ01FbnRpdHlEZWNsSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIEBwYXJhbSBlbnRpdHlOYW1lIGphdmEubGFuZy5TdHJpbmc7IEVudGl0eSBuYW1lLgotCSAqIEBwYXJhbSBlbnRpdHlWYWx1ZSBqYXZhLmxhbmcuU3RyaW5nOyBWYWx1ZSBzdHJpbmcuCi0JICovCi0JcHVibGljIEhUTUxFbnRpdHlEZWNsSW1wbChTdHJpbmcgZW50aXR5TmFtZSwgU3RyaW5nIGVudGl0eVZhbHVlKSB7Ci0JCXN1cGVyKGVudGl0eU5hbWUpOwotCQl2YWx1ZSA9IGVudGl0eVZhbHVlOwotCX0KLQotCS8qKgotCSAqIGdldE5hbWUgbWV0aG9kCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgQ01Ob2RlIHR5cGUuPGJyPgotCSAqIEByZXR1cm4gaW50OyBBbHdheXMgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTi4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ01Ob2RlLkVOVElUWV9ERUNMQVJBVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBnZXRWYWx1ZSBtZXRob2QKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgewotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogRW50aXRpZXMgaW4gSFRNTCBkb2N1bWVudHMgYXJlIGFsd2F5cyB0cmVhdGVkIHdpdGggaWdub3JpbmcgY2FzZXMuCi0JICogQmVjYXVzZSBubyBzcGVjaWFsIGVudGl0aWVzIGFyZSBkZWZpbmVkIGluIEpTUCAxLjAsIHRoaXMgbWV0aG9kCi0JICogY2FuIGFsd2F5cyByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4uPGJyPgotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpCi0JCQlyZXR1cm4gbmV3IEJvb2xlYW4odHJ1ZSk7Ci0JCXJldHVybiBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTVjYTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLS8qKgotICogQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEsIGNvbGxlY3Rpb24pOwotCQkvLyBDT1JSRUNUX0VNUFRZIC0gR1JPVVBfQ09NUEFDVAotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqIChjaGFyc2V0ICVDaGFyc2V0OyAjSU1QTElFRCkKLQkgKiAodHlwZSAlQ29udGVudFR5cGU7ICNJTVBMSUVEKQotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqIChocmVmICVVUkk7ICNJTVBMSUVEKQotCSAqIChocmVmbGFuZyAlTGFuZ3VhZ2VDb2RlOyAjSU1QTElFRCkKLQkgKiAodGFyZ2V0ICVGcmFtZVRhcmdldDsgI0lNUExJRUQpCi0JICogKHJlbCAlTGlua1R5cGVzOyAjSU1QTElFRCkKLQkgKiAocmV2ICVMaW5rVHlwZXM7ICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKGRpcmVjdGtleSAlQ2hhcmFjdGVyOyAjSU1QTElFRCkKLQkgKiAoc2hhcGUgJVNoYXBlOyByZWN0KQotCSAqIChjb29yZHMgJUNvb3JkczsgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAob25mb2N1cyAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25ibHVyICVTY3JpcHQ7ICNJTVBMSUVEKSAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPkE8L2NvZGU+IGhhcyB0aGUgZXhjbHVzaW9uLgotCSAqIEl0IGlzIDxjb2RlPkE8L2NvZGU+IGl0c2VsZi4KLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldEV4Y2x1c2lvbigpIHsKLQkJaWYgKGV4Y2x1c2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGV4Y2x1c2lvbjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoZWxlbWVudENvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCUNNTm9kZSBhID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkEpOwotCQlpZiAoYSAhPSBudWxsKQotCQkJZXhjbHVzaW9uLmFwcGVuZENoaWxkKGEpOwotCi0JCXJldHVybiBleGNsdXNpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5BLH07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEFERFJFU1MuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQUREUkVTUy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTU3OWQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQUREUkVTUy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIEFERFJFU1MuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEFERFJFU1MgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRBRERSRVNTKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQUREUkVTUywgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfQUREUkVTUzsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJBU0UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkFTRS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJjODE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkFTRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIEJBU0UuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEJBU0UgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQkFTRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJBU0UsIGNvbGxlY3Rpb24pOwotCQkvLyBMQVlPVVRfSElEREVOLgotCQkvLyBCZWNhdXNlLCBCQVNFIGlzIEdST1VQX0hJRERFTiBpbiB0aGUgQysrRE9NL0RURFBhcnNlci5jcHAuCi0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCX0KLQotCS8qKgotCSAqIEJBU0UuCi0JICogKGhyZWYgJVVSSTsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hSRUYsfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQkxPQ0tRVU9URS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCTE9DS1FVT1RFLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODE1NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCTE9DS1FVT1RFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQkxPQ0tRVU9URS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQkxPQ0tRVU9URSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEJMT0NLUVVPVEUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CTE9DS1FVT1RFLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoY2l0ZSAlVVJJOyAjSU1QTElFRCkgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk1FTlV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRCT0RZLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJPRFkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyMjg4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJPRFkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQk9EWS4KLSAqLwotZmluYWwgY2xhc3MgSGVkQk9EWSBleHRlbmRzIEhlZEZsb3dDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQk9EWShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWJvZHljb2xvcnM7Ci0JICogKG9ubG9hZCAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob251bmxvYWQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKGJhY2tncm91bmQgJVVSSTsgI0lNUExJRUQpCi0JICogKG1hcmdpbndpZHRoICVQaXhlbHM7ICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChtYXJnaW5oZWlnaHQgJVBpeGVsczsgI0lNUExJRUQpIC4uIEQyMDU1MTQKLQkgKiAodG9wbWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uLiBEMjA1NTE0Ci0JICogKGJvdHRvbW1hcmdpbiwgQ0RBVEEsICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqIChsZWZ0bWFyZ2luLCBDREFUQSwgI0lNUExJRUQpIC4uLi4uIEQyMDU1MTQKLQkgKiAocmlnaHRtYXJnaW4sIENEQVRBLCAjSU1QTElFRCkgLi4uLiBEMjA1NTE0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0JCS8vICVib2R5Y29sb3JzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEJvZHljb2xvcnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBCT0RZIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQlIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQlIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlZjQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEJSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0KLQotLyoqCi0gKiBCUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkQlIgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkQlIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5CUiwgY29sbGVjdGlvbik7Ci0JCS8vIExBWU9VVF9CUkVBSy4KLQkJLy8gQmVjYXVzZSwgQlIgaXMgR1JPVVBfQlJFQUsgaW4gdGhlIEMrK0RPTS9EVERQYXJzZXIuY3BwLgotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JSRUFLOwotCX0KLQotCS8qKgotCSAqIEJSLgotCSAqICVjb3JlYXR0cnM7Ci0JICogKGNsZWFyIChsZWZ0IHwgYWxsIHwgcmlnaHQgfCBub25lKSBub25lKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWNvcmVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRDb3JlKGF0dHJpYnV0ZXMpOwotCQkvLyBjbGVhcgotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NMRUFSKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkKLQkJCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DTEVBUiwgYXR0cik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQ0VOVEVSLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZENFTlRFUi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmM2MGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkQ0VOVEVSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogQ0VOVEVSLgotICovCi1maW5hbCBjbGFzcyBIZWRDRU5URVIgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRDRU5URVIoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5DRU5URVIsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERELmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGEyOTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRERC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBERC4KLSAqLwotZmluYWwgY2xhc3MgSGVkREQgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ERCwgY29sbGVjdGlvbik7Ci0JCWNvcnJlY3Rpb25UeXBlID0gQ09SUkVDVF9FTVBUWTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBERCBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRESVYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRiNTZjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERJVi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIERJVi4KLSAqLwotZmluYWwgY2xhc3MgSGVkRElWIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRElWKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElWLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQl9Ci0KLQkvKioKLQkgKiAlYXR0cnM7Ci0JICogJWFsaWduOwotCSAqICVyZXNlcnZlZDsKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gJWFsaWduOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9yUGFyYWdyYXBoKCk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGF0dHIpOwotCQkvLyAlcmVzZXJ2ZWQ7IC4uLiBlbXB0eQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkREwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA5YzlhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERMLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogREwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZERMIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkREwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ETCwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfREVGSU5JVElPTl9MSVNUOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCWluZGVudENoaWxkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiAlYXJyYXlzOwotCSAqIChjb21wYWN0IChjb21wYWN0KSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZERULmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMmM0YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWREVC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBEVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkRFQgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRFQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWREVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRULCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX0RFRkFVTFQ7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIERUIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRW1wdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRW1wdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjMzBkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEVtcHR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgRU1QVFkgdHlwZSBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkRW1wdHkgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRFbXB0eShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0VNUFRZOwotCQkvLyBFTVBUWSB0eXBlIGhhcyBubyBlbmQgdGFnLgotCQlvbWl0VHlwZSA9IE9NSVRfRU5EX01VU1Q7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudC48YnI+Ci0JICogRU1QVFkgdHlwZSBhbHdheXMgcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICogQHJldHVybiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudAotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQ29udGVudCB0eXBlLjxicj4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgaW50IGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRk9STS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OWNhOWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRGT1JNLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKiBGT1JNLgotICovCi1maW5hbCBjbGFzcyBIZWRGT1JNIGV4dGVuZHMgSGVkRmxvd0NvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkRk9STShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkZPUk0sIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAoYWN0aW9uICVVUkk7ICNSRVFVSVJFRCkKLQkgKiAobWV0aG9kIChHRVR8UE9TVCkgR0VUKQotCSAqIChlbmN0eXBlICVDb250ZW50VHlwZTsgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCi0JICogKGFjY2VwdCAlQ29udGVudFR5cGVzOyAjSU1QTElFRCkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAob25zdWJtaXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9ucmVzZXQgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKHRhcmdldCAlRnJhbWVUYXJnZXQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQtY2hhcnNldCAlQ2hhcnNldHM7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BQ1RJT04sIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9NRVRIT0QsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9FTkNUWVBFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+Rk9STTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+Rk9STTwvY29kZT4gaXRzZWxmLgotCSAqLwotCXB1YmxpYyBDTUNvbnRlbnQgZ2V0RXhjbHVzaW9uKCkgewotCQlpZiAoZXhjbHVzaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gZXhjbHVzaW9uOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChlbGVtZW50Q29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGZhdGFsCi0KLQkJZXhjbHVzaW9uID0gbmV3IENNR3JvdXBJbXBsKENNR3JvdXAuQ0hPSUNFLCAxLCAxKTsKLQkJQ01Ob2RlIGZvcm0gPSBlbGVtZW50Q29sbGVjdGlvbi5nZXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSk7Ci0JCWlmIChmb3JtICE9IG51bGwpCi0JCQlleGNsdXNpb24uYXBwZW5kQ2hpbGQoZm9ybSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEZsb3dDb250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWYzMDdiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkRmxvd0NvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgKCVmbG93OykqIGNvbnRhaW5lcnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZEZsb3dDb250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRGbG93Q29udGFpbmVyKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfRkxPV19DT05UQUlORVI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSEVBRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIRUFELmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNjZkY2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIRUFELmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIEhUTUwuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhFQUQgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkJPRFksIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUx9OwotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhFQUQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFELCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9IRUFEOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0hJRERFTjsKLQkJb21pdFR5cGUgPSBPTUlUX0JPVEg7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPkhFQUQ8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4laTE4bjs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD5wcm9maWxlPC90ZD48dGQ+VVJJPC90ZD48dGQ+I0lNUExJRUQ8L3RkPjx0ZD5OL0E8L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogPC90Ym9keT4KLQkgKiA8L3RhYmxlPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQl9Ci0KLQkvKioKLQkgKiBIRUFEIGhhcyB0ZXJtaW5hdG9ycy4KLQkgKiBAcmV0dXJuIGphdmEudXRpbC5JdGVyYXRvcgotCSAqLwotCXByb3RlY3RlZCBJdGVyYXRvciBnZXRUZXJtaW5hdG9ycygpIHsKLQkJcmV0dXJuIEFycmF5cy5hc0xpc3QodGVybWluYXRvcnMpLml0ZXJhdG9yKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ2NWFiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhSLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogSFIuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhSIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhSKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFIsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqICVhdHRycwotCSAqIChhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAobm9zaGFkZSAobm9zaGFkZSkgI0lNUExJRUQpCi0JICogKHNpemUgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKHdpZHRoICVMZW5ndGg7ICNJTVBMSUVEKQotCSAqIChjb2xvciAlQ29sb3I7ICNJTVBMSUVEKSAuLi4gRDIwNTUxNAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChhbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHQpICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLkVOVU0pOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9MRUZULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX0NFTlRFUiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9SSUdIVH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0KLQkJLy8gdGhlIHJlc3QuCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9OT1NIQURFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0laRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2MjQzZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEF0dHJpYnV0ZURlY2xhcmF0aW9uOwotCi0KLS8qKgotICogSFRNTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkSFRNTCBleHRlbmRzIEhUTUxFbGVtRGVjbEltcGwgewotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gdGVybWluYXRvcnMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFRNTH07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkSFRNTChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0hUTUw7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfSElEREVOOwotCQlvbWl0VHlwZSA9IE9NSVRfQk9USDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuCi0JICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9uY2UgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHRoZSBzdXBlciBjbGFzcy4KLQkgKiBUaGUgPGNvZGU+SFRNTDwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPjxjb2RlPiVpMThuOzwvY29kZT48L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgICA8dGQ+e0BsaW5rIFBEQ01Eb2NJbXBsI2dldEF0dHJEZWNsYXJhdGlvbnNJMThufTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+dmVyc2lvbjwvdGQ+PHRkPkNEQVRBPC90ZD48dGQ+I0ZJWEVEPC90ZD4KLQkgKiAgICAgPHRkPntAbGluayBIVE1MX1ZFUlNJT05fVFJBTlNJVElPTkFMfTwvdGQ+PHRkPmRlcGxlY2F0ZWQgaW4gSFRNTDQuMDE8L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+PGJyPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQkJLy8gdmVyc2lvbgotCQlIVE1MQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlYyA9IGF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb24oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04pOwotCQlpZiAoYWRlYyAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZFUlNJT04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqIEhUTUwgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRIZWFkaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4ZTk3YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZEhlYWRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBIWzEtNl0uCi0gKi8KLWZpbmFsIGNsYXNzIEhlZEhlYWRpbmcgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZEhlYWRpbmcoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhbGwgYXR0cmlidXRlIGRlY2xhcmF0aW9ucy4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgb25jZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgdGhlIHN1cGVyIGNsYXNzLgotCSAqIFRoZSA8Y29kZT5IMTwvY29kZT4gZWxlbWVudCBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0JICogPHRhYmxlPgotCSAqIDx0Ym9keT4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRoPk5BTUU8L3RoPjx0aD5UWVBFPC90aD48dGg+VVNBR0U8L3RoPjx0aD5ERUZBVUxUIChJTklUSUFMKSBWQUxVRTwvdGg+PHRoPk1FTU88L3RoPgotCSAqICAgPC90cj4KLQkgKiAgIDx0cj4KLQkgKiAgICAgPHRkPiVhdHRyczs8L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYWxpZ247PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqIDwvdGJvZHk+Ci0JICogPC90YWJsZT4KLQkgKiA8cD48Yj4lYWxpZ247PC9iPiBtZWFucyA8Y29kZT5hbGlnbiAobGVmdHxjZW50ZXJ8cmlnaHR8anVzdGlmeSkgI0lNUExJRUQ8L2NvZGU+LgotCSAqIFVuZm9ydHVuYXRlbHksIHRoaXMgPGNvZGU+YWxpZ248L2NvZGU+IGlzIGRpZmZlcmVudCBmcm9tIG9uZSBpbgotCSAqIDxjb2RlPklNRzwvY29kZT4gb3IgPGNvZGU+VEFCTEU8L2NvZGU+LiAgU28sIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24KLQkgKiBvZiA8Y29kZT5hbGlnbjwvY29kZT4gc2hvdWxkIGJlIGxvY2FseSBjcmVhdGVkIGFuZCBpdCBzaG91bGRuJ3QgYmUgcmVnaXN0ZXJlZAotCSAqIGluIGEgPGNvZGU+SENNRG9jSW1wbDwvY29kZT4gaW5zdGFuY2UuPC9wPgotCSAqIDxwPkhvd2V2ZXIsICVhbGlnbiBpcyB1c2VkIGluIHNldmFyYWwgdGltZXMuICBJIHdvdWxkbid0IHdyaXRlIHNhbWUgY29kZQotCSAqIGluIG1hbnkgdGltZXMuICBTbywgSSBhZGQgYSBuZXcgdXRpbGl0eSBtZXRob2QgaW50byA8Y29kZT5DTVV0aWw8L2NvZGU+Ci0JICogdG8gY3JlYXRlIHRoZSBhdHRyaWJ1dGUgZGVjbGFyYXRpb24uPC9wPgotCSAqIDxicj4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElNRy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTUcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU5NTM4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElNRy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIElNRy4KLSAqLwotZmluYWwgY2xhc3MgSGVkSU1HIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZElNRyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLklNRywgY29sbGVjdGlvbik7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCX0KLQotCS8qKgotCSAqIElNRy4KLQkgKiAlYXR0cnM7Ci0JICogKHNyYyAlVVJJOyAjUkVRVUlSRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChhbHQgJVRleHQ7ICNSRVFVSVJFRCkKLQkgKiAobG9uZ2Rlc2MgJVVSSTsgI0lNUExJRUQpCi0JICogKG5hbWUgQ0RBVEEgI0lNUExJRUQpCi0JICogKGhlaWdodCAlTGVuZ3RoOyAjSU1QTElFRCkKLQkgKiAod2lkdGggJUxlbmd0aDsgI0lNUExJRUQpCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAoYWxpZ24gJUlBbGlnbjsgI0lNUExJRUQpOiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChib3JkZXIgJVBpeGVsczsgI0lNUExJRUQpCi0JICogKGhzcGFjZSAlUGl4ZWxzOyAjSU1QTElFRCkKLQkgKiAodnNwYWNlICVQaXhlbHM7ICNJTVBMSUVEKQotCSAqIChtYXBmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCS8vIChzcmMgJVVSSTsgI1JFUVVJUkVEKTogc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbnVsbDsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbnVsbDsKLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuVVJJKTsKLQkJYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TUkMsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NSQywgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9IRUlHSFQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUiwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hTUEFDRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZTUEFDRSx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQotCQkvLyBhbGlnbiAobG9jYWwpOyBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHRyID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvckltYWdlKCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTElHTiwgYXR0cik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoKSB7Ci0JCWlmIChwcm9oaWJpdGVkQW5jZXN0b3JzICE9IG51bGwpCi0JCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkV9OwotCQlwcm9oaWJpdGVkQW5jZXN0b3JzID0gZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKG5hbWVzKTsKLQotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTlBVVC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJTlBVVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA5NTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkSU5QVVQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIElOUFVULgotICovCi1maW5hbCBjbGFzcyBIZWRJTlBVVCBleHRlbmRzIEhlZEVtcHR5IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRJTlBVVChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLklOUFVULCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9PQkpFQ1Q7Ci0JfQotCi0JLyoqCi0JICogSU5QVVQuCi0JICogJWF0dHJzOwotCSAqICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChuYW1lIENEQVRBICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoY2hlY2tlZCAoY2hlY2tlZCkgI0lNUExJRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHNpemUgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtYXhsZW5ndGggTlVNQkVSICNJTVBMSUVEKQotCSAqIChzcmMgJVVSSTsgI0lNUExJRUQpCi0JICogKGFsdCBDREFUQSAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JICogKHVzZW1hcCAlVVJJOyAjSU1QTElFRCkKLQkgKiAoaXNtYXAgKGlzbWFwKSAjSU1QTElFRCkKLQkgKiAodGFiaW5kZXggTlVNQkVSICNJTVBMSUVEKQotCSAqIChhY2Nlc3NrZXkgJUNoYXJhY3RlcjsgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25zZWxlY3QgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uY2hhbmdlICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChhY2NlcHQgJUNvbnRlbnRUeXBlczsgI0lNUExJRUQpCi0JICogKGFsaWduICVJQWxpZ247ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqIDw8RDIxNTY4NAotCSAqICh3aWR0aCBDREFUQTsgI0lNUExJRUQpCi0JICogKGhlaWdodCBDREFUQTsgI0lNUExJRUQpCi0JICogKGJvcmRlciBDREFUQTsgI0lNUExJRUQpCi0JICogRDIxNTY4NAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG51bGw7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG51bGw7Ci0JCS8vICh0eXBlICVJbnB1dFR5cGU7IFRFWFQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQkvLyBOT1RFOiAlSW5wdXRUeXBlIGlzIEVOVU07Ci0JCS8vICh0ZXh0IHwgcGFzc3dvcmQgfCBjaGVja2JveCB8IHJhZGlvIHwgc3VibWl0IHwgcmVzZXQgfAotCQkvLyAgZmlsZSB8IGhpZGRlbiB8IGltYWdlIHwgYnV0dG9uKQotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5FTlVNKTsKLQkJU3RyaW5nW10gdmFsdWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfVEVYVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9QQVNTV09SRCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9DSEVDS0JPWCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9SQURJTywgQ0hUTUxOYW1lc3BhY2UuQVRUUl9WQUxVRV9TVUJNSVQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfUkVTRVQsIENIVE1MTmFtZXNwYWNlLkFUVFJfVkFMVUVfSElEREVOLH07Ci0JCWF0eXBlLnNldEVudW1WYWx1ZXModmFsdWVzKTsKLQkJYXR5cGUuc2V0SW1wbGllZFZhbHVlKENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9ERUZBVUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX1ZBTFVFX1RFWFQpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1RZUEUsIGF0dHIpOwotCi0JCS8vIChzaXplIENEQVRBICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJYXR5cGUgPSBuZXcgSFRNTENNRGF0YVR5cGVJbXBsKENNRGF0YVR5cGUuQ0RBVEEpOwotCQlhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1NJWkUsIGF0dHIpOwotCi0JCS8vIChhbHQgQ0RBVEEgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9BTFQsIGF0dHIpOwotCi0JCS8vIChhbGlnbiAlSUFsaWduOyAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCWF0dHIgPSBBdHRyaWJ1dGVDb2xsZWN0aW9uLmNyZWF0ZUFsaWduRm9ySW1hZ2UoKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0FMSUdOLCBhdHRyKTsKLQotCQkvLyB0aGUgcmVzdC4KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0NIRUNLRUQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTUFYTEVOR1RILCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU1JDLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxULCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9JU1RZTEUsCi0JCS8vPDxEMjE1Njg0Ci0JCQkJCUNIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9XSURUSCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hFSUdIVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0JPUkRFUgotCQkvLzxEMjE1Njg0Ci0JCX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElubGluZUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRJbmxpbmVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmMTRjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZElubGluZUNvbnRhaW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgKCVpbmxpbmU7KSogY29udGFpbmVycy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkSW5saW5lQ29udGFpbmVyIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKiBIZWRJbmxpbmVDb250YWluZXIuCi0JICogQHBhcmFtIGVsZW1lbnROYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29sbGVjdGlvbiBFbGVtZW50Q29sbGVjdGlvbgotCSAqLwotCXB1YmxpYyBIZWRJbmxpbmVDb250YWluZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKGVsZW1lbnROYW1lLCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9JTkxJTkVfQ09OVEFJTkVSOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExJLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZExJLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhM2EzNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMSS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBMSS4KLSAqLwotZmluYWwgY2xhc3MgSGVkTEkgZXh0ZW5kcyBIZWRGbG93Q29udGFpbmVyIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJfTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMSShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9CTE9DSzsKLQkJb21pdFR5cGUgPSBPTUlUX0VORF9ERUZBVUxUOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAodHlwZSAlTElTdHlsZTsgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqICh2YWx1ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JfQotCi0JLyoqCi0JICogTEkgaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlyZXR1cm4gQXJyYXlzLmFzTGlzdCh0ZXJtaW5hdG9ycykuaXRlcmF0b3IoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRMaXN0SXRlbUNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTQ1N2M3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTGlzdEl0ZW1Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIGxpc3QgaXRlbSBjb250YWluZXIgZGVjbGFyYXRpb25zLgotICogLSBPTCwgVUwsIE1FTlUsIERJUi4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkTGlzdEl0ZW1Db250YWluZXIgZXh0ZW5kcyBIVE1MRWxlbURlY2xJbXBsIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRMaXN0SXRlbUNvbnRhaW5lcihTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQl0eXBlRGVmaW5pdGlvbk5hbWUgPSBDb21wbGV4VHlwZURlZmluaXRpb25GYWN0b3J5LkNUWVBFX0xJX0NPTlRBSU5FUjsKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX0JMT0NLOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVOVS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRU5VLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWQ5NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRNRU5VLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBNRU5VL0RJUi4KLSAqLwotZmluYWwgY2xhc3MgSGVkTUVOVSBleHRlbmRzIEhlZExpc3RJdGVtQ29udGFpbmVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRNRU5VKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogTUVOVS9ESVIuCi0JICogKGNvbXBhY3QgKGNvbXBhY3QpICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWF0dHJzOwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldEF0dHJzKGF0dHJpYnV0ZXMpOwotCi0JfQotCi0JLyoqCi0JICogRXhjbHVzaW9uLgotCSAqIDxjb2RlPk1FTlUvRElSPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4lYmxvY2s7PC9jb2RlPi4KLQkgKiAlYmxvY2s7IGlzOgotCSAqIFAgfCAlaGVhZGluZzsgfCAlbGlzdDsgfCAlcHJlZm9ybWF0dGVkOyB8IERMIHwgRElWIHwgQ0VOVEVSIHwKLQkgKiBOT1NDUklQVCB8IE5PRlJBTUVTIHwgQkxPQ0tRVU9URSB8IEZPUk0gfCBJU0lOREVYIHwgSFIgfAotCSAqIFRBQkxFIHwgRklFTERTRVQgfCBBRERSRVNTLgotCSAqICVoZWFkaW5nOyBpczogSDEgfCBIMiB8IEgzIHwgSDQgfCBINSB8IEg2LgotCSAqICVsaXN0OyBpcyA6IFVMIHwgT0wgfCBESVIgfCBNRU5VLgotCSAqICVwcmVmb3JtYXR0ZWQ7IGlzIFBSRS4KLQkgKiA8YnI+Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyAlYmxvY2s7Ci0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkgxLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5IMiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDMsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkg0LCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5INSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSDYsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlVMLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5QUkUsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRMLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5ESVYsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkNFTlRFUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkxPQ0tRVU9URSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRk9STSwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuSFIsIENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkFERFJFU1N9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE1FVEEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVUQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODJlY2E5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkTUVUQS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLQotLyoqCi0gKiBNRVRBLgotICovCi1maW5hbCBjbGFzcyBIZWRNRVRBIGV4dGVuZHMgSGVkRW1wdHkgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZE1FVEEoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogTUVUQS4KLQkgKiAlaTE4bjsKLQkgKiAoaHR0cC1lcXVpdiBOQU1FICNJTVBMSUVEKQotCSAqIChuYW1lIE5BTUUgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChjb250ZW50IENEQVRBICNSRVFVSVJFRCkKLQkgKiAoc2NoZW1lIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJLy8gJWkxOG47Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0STE4bihhdHRyaWJ1dGVzKTsKLQotCQkvLyAobmFtZSBOQU1FICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChIVE1MQ01EYXRhVHlwZS5OQU1FKTsKLQkJSFRNTEF0dHJEZWNsSW1wbCBhdHRyID0gbmV3IEhUTUxBdHRyRGVjbEltcGwoQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX05BTUUsIGF0dHIpOwotCi0JCS8vIDI0OTQ5MwotCQlhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5DREFUQSk7Ci0JCWF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVCwgYXR5cGUsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVCwgYXR0cik7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0hUVFBfRVFVSVYsCi0JCS8vCQlDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQ09OVEVOVAotCQl9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRPTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjU4M2QwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT0wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBPTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkT0wgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT0woRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5PTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogT0wuCi0JICogKHR5cGUgJU9MU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICogKHN0YXJ0IE5VTUJFUiAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuRElSLCBDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRU5VfTsKLQkJcHJvaGliaXRlZEFuY2VzdG9ycyA9IGVsZW1lbnRDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhuYW1lcyk7Ci0KLQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT1BUSU9OLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZE9QVElPTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGEwODFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkT1BUSU9OLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIE9QVElPTi4KLSAqLwotZmluYWwgY2xhc3MgSGVkT1BUSU9OIGV4dGVuZHMgSGVkUGNkYXRhIHsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHRlcm1pbmF0b3JzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLk9QVElPTn07Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkT1BUSU9OKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuT1BUSU9OLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogT1BUSU9OLgotCSAqICVhdHRyczsKLQkgKiAoc2VsZWN0ZWQgKHNlbGVjdGVkKSAjSU1QTElFRCkKLQkgKiAoZGlzYWJsZWQgKGRpc2FibGVkKSAjSU1QTElFRCkKLQkgKiAobGFiZWwgJVRleHQ7ICNJTVBMSUVEKQotCSAqICh2YWx1ZSBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0VMRUNURUQsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WQUxVRX07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLQotCS8qKgotCSAqIE9QVElPTiBoYXMgdGVybWluYXRvcnMuCi0JICogQHJldHVybiBqYXZhLnV0aWwuSXRlcmF0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgSXRlcmF0b3IgZ2V0VGVybWluYXRvcnMoKSB7Ci0JCXJldHVybiBBcnJheXMuYXNMaXN0KHRlcm1pbmF0b3JzKS5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjA1NmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkUC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotCi0vKioKLSAqIFAuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFAgZXh0ZW5kcyBIZWRJbmxpbmVDb250YWluZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiB0ZXJtaW5hdG9ycyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUChFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlAsIGNvbGxlY3Rpb24pOwotCQljb3JyZWN0aW9uVHlwZSA9IENPUlJFQ1RfRU1QVFk7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfQkxPQ0s7Ci0JCW9taXRUeXBlID0gT01JVF9FTkQ7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFsbCBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmNlIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgc3VwZXIgY2xhc3MuCi0JICogVGhlIDxjb2RlPlA8L2NvZGU+IGVsZW1lbnQgbWF5IGhhdmUgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCSAqIDx0YWJsZT4KLQkgKiA8dGJvZHk+Ci0JICogICA8dHI+Ci0JICogICAgIDx0aD5OQU1FPC90aD48dGg+VFlQRTwvdGg+PHRoPlVTQUdFPC90aD48dGg+REVGQVVMVCAoSU5JVElBTCkgVkFMVUU8L3RoPjx0aD5NRU1PPC90aD4KLQkgKiAgIDwvdHI+Ci0JICogICA8dHI+Ci0JICogICAgIDx0ZD4lYXR0cnM7PC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+Ci0JICogICA8L3RyPgotCSAqICAgPHRyPgotCSAqICAgICA8dGQ+JWFsaWduOzwvdGQ+PHRkPi08L3RkPjx0ZD4tPC90ZD48dGQ+LTwvdGQ+PHRkPi08L3RkPgotCSAqICAgPC90cj4KLQkgKiA8L3Rib2R5PgotCSAqIDwvdGFibGU+Ci0JICogPHA+PGI+JWFsaWduOzwvYj4gbWVhbnMgPGNvZGU+YWxpZ24gKGxlZnR8Y2VudGVyfHJpZ2h0fGp1c3RpZnkpICNJTVBMSUVEPC9jb2RlPi4KLQkgKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIDxjb2RlPmFsaWduPC9jb2RlPiBpcyBkaWZmZXJlbnQgZnJvbSBvbmUgaW4KLQkgKiA8Y29kZT5JTUc8L2NvZGU+IG9yIDxjb2RlPlRBQkxFPC9jb2RlPi4gIFNvLCB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uCi0JICogb2YgPGNvZGU+YWxpZ248L2NvZGU+IHNob3VsZCBiZSBsb2NhbHkgY3JlYXRlZCBhbmQgaXQgc2hvdWxkbid0IGJlIHJlZ2lzdGVyZWQKLQkgKiBpbiBhIDxjb2RlPkhDTURvY0ltcGw8L2NvZGU+IGluc3RhbmNlLjwvcD4KLQkgKiA8cD5Ib3dldmVyLCAlYWxpZ24gaXMgdXNlZCBpbiBzZXZhcmFsIHRpbWVzLiAgSSB3b3VsZG4ndCB3cml0ZSBzYW1lIGNvZGUKLQkgKiBpbiBtYW55IHRpbWVzLiAgU28sIEkgYWRkIGEgbmV3IHV0aWxpdHkgbWV0aG9kIGludG8gPGNvZGU+Q01VdGlsPC9jb2RlPgotCSAqIHRvIGNyZWF0ZSB0aGUgYXR0cmlidXRlIGRlY2xhcmF0aW9uLjwvcD4KLQkgKiA8YnI+Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gYWxpZ24KLQkJSFRNTEF0dHJEZWNsSW1wbCBhZGVjID0gQXR0cmlidXRlQ29sbGVjdGlvbi5jcmVhdGVBbGlnbkZvclBhcmFncmFwaCgpOwotCQlhdHRyaWJ1dGVzLnB1dE5hbWVkSXRlbShDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfQUxJR04sIGFkZWMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQlpZiAocHJvaGliaXRlZEFuY2VzdG9ycyAhPSBudWxsKQotCQkJcmV0dXJuIHByb2hpYml0ZWRBbmNlc3RvcnM7Ci0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCQlyZXR1cm4gcHJvaGliaXRlZEFuY2VzdG9yczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gbmFtZXMgb2YgdGVybWluYXRvcnMuCi0JICogPGNvZGU+UDwvY29kZT4gaGFzIHRlcm1pbmF0b3JzLgotCSAqIEByZXR1cm4gamF2YS51dGlsLkl0ZXJhdG9yCi0JICovCi0JcHJvdGVjdGVkIEl0ZXJhdG9yIGdldFRlcm1pbmF0b3JzKCkgewotCQlpZiAodGVybWluYXRvcnMgIT0gbnVsbCkKLQkJCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCQkvLzw8RDIxNzk4MgotCQl0ZXJtaW5hdG9ycyA9IG5ldyBWZWN0b3IoKTsKLQkJdGVybWluYXRvcnMuYWRkQWxsKGVsZW1lbnRDb2xsZWN0aW9uLmdldE5hbWVzT2ZCbG9jaygpKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRUKTsKLQkJdGVybWluYXRvcnMuYWRkKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkREKTsKLQkJLy9EMjE3OTgyCi0JCXJldHVybiB0ZXJtaW5hdG9ycy5pdGVyYXRvcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBSRS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQUkUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlmNTk3NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBSRS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBQUkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFBSRSBleHRlbmRzIEhlZElubGluZUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKiBQUkUgZWxlbWVudCBzaG91bGQga2VlcCBzcGFjZXMgaW4gaXRzIHNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgSGVkUFJFKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuUFJFLCBjb2xsZWN0aW9uKTsKLQkJLy8gQ09SUkVDVF9FTVBUWSAtIEdST1VQX0NPTVBBQ1QKLQkJY29ycmVjdGlvblR5cGUgPSBDT1JSRUNUX0VNUFRZOwotCi0JCWtlZXBTcGFjZXMgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqICVhdHRyczsKLQkgKiAod2lkdGggTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQkJLy8gKHdpZHRoIE5VTUJFUiAjSU1QTElFRCkgLi4uIHNob3VsZCBiZSBkZWZpbmVkIGxvY2FsbHkuCi0JCUhUTUxDTURhdGFUeXBlSW1wbCBhdHlwZSA9IG5ldyBIVE1MQ01EYXRhVHlwZUltcGwoQ01EYXRhVHlwZS5OVU1CRVIpOwotCQlIVE1MQXR0ckRlY2xJbXBsIGF0dHIgPSBuZXcgSFRNTEF0dHJEZWNsSW1wbChDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfV0lEVEgsIGF0eXBlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLQkJYXR0cmlidXRlcy5wdXROYW1lZEl0ZW0oQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1dJRFRILCBhdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBFeGNsdXNpb24uCi0JICogPGNvZGU+UFJFPC9jb2RlPiBoYXMgdGhlIGV4Y2x1c2lvbi4KLQkgKiBJdCBpcyA8Y29kZT4lcHJlLmV4Y2x1c2lvbjs8L2NvZGU+LgotCSAqICVwcmUuZXhjbHVzaW9uIGlzOgotCSAqIElNRyB8IE9CSkVDVCB8IEFQUExFVCB8IEJJRyB8IFNNQUxMIHwgU1VCIHwgU1VQIHwgRk9OVCB8IEJBU0VGT05UCi0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlleGNsdXNpb24gPSBuZXcgQ01Hcm91cEltcGwoQ01Hcm91cC5DSE9JQ0UsIDEsIDEpOwotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5JTUcsfTsKLQkJZWxlbWVudENvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGV4Y2x1c2lvbiwgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0KLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBjZGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRQY2RhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTViMTNjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFBjZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFBDREFUQSB0eXBlIGVsZW1lbnQgZGVjbGFyYXRpb25zLjxicj4KLSAqLwotYWJzdHJhY3QgY2xhc3MgSGVkUGNkYXRhIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkUGNkYXRhKFN0cmluZyBlbGVtZW50TmFtZSwgRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihlbGVtZW50TmFtZSwgY29sbGVjdGlvbik7Ci0JCXR5cGVEZWZpbml0aW9uTmFtZSA9IENvbXBsZXhUeXBlRGVmaW5pdGlvbkZhY3RvcnkuQ1RZUEVfUENEQVRBOwotCX0KLQotCS8qKgotCSAqIENvbnRlbnQuPGJyPgotCSAqIFBDREFUQSB0eXBlIGFsd2F5cyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIDxicj4KLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb250ZW50IHR5cGUuPGJyPgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEE7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNFTEVDVC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmQwYmI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU0VMRUNULmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqIFNFTEVDVC4KLSAqLwotZmluYWwgY2xhc3MgSGVkU0VMRUNUIGV4dGVuZHMgSFRNTEVsZW1EZWNsSW1wbCB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU0VMRUNUKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0VMRUNULCBjb2xsZWN0aW9uKTsKLQkJdHlwZURlZmluaXRpb25OYW1lID0gQ29tcGxleFR5cGVEZWZpbml0aW9uRmFjdG9yeS5DVFlQRV9TRUxFQ1Q7Ci0JCWxheW91dFR5cGUgPSBMQVlPVVRfT0JKRUNUOwotCQlpbmRlbnRDaGlsZCA9IHRydWU7Ci0JfQotCi0JLyoqCi0JICogJWF0dHJzOwotCSAqICVyZXNlcnZlZDsKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAoc2l6ZSBOVU1CRVIgI0lNUExJRUQpIC4uLiBzaG91bGQgYmUgZGVmaW5lZCBsb2NhbGx5LgotCSAqIChtdWx0aXBsZSAobXVsdGlwbGUpICNJTVBMSUVEKQotCSAqIChkaXNhYmxlZCAoZGlzYWJsZWQpICNJTVBMSUVEKQotCSAqICh0YWJpbmRleCBOVU1CRVIgI0lNUExJRUQpCi0JICogKG9uZm9jdXMgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uYmx1ciAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAob25jaGFuZ2UgJVNjcmlwdDsgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQkJLy8gKHNpemUgTlVNQkVSICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkJSFRNTENNRGF0YVR5cGVJbXBsIGF0eXBlID0gbmV3IEhUTUxDTURhdGFUeXBlSW1wbChDTURhdGFUeXBlLk5VTUJFUik7Ci0JCUhUTUxBdHRyRGVjbEltcGwgYXR0ciA9IG5ldyBIVE1MQXR0ckRlY2xJbXBsKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHlwZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5PUFRJT05BTCk7Ci0JCWF0dHJpYnV0ZXMucHV0TmFtZWRJdGVtKENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9TSVpFLCBhdHRyKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX01VTFRJUExFLH07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUJhc2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJQmFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGUwYmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJQmFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotCi0KLQotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIFNTSSBkZWNsYXJhdGlvbnMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEhlZFNTSUJhc2UgZXh0ZW5kcyBIZWRFbXB0eSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJQmFzZShTdHJpbmcgZWxlbWVudE5hbWUsIEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoZWxlbWVudE5hbWUsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEZvcm1hdFR5cGUoKSB7Ci0JCXJldHVybiBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkZPUk1BVF9TU0k7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBzdXBlci5zdXBwb3J0cyhwcm9wTmFtZSk7Ci0JfQotCi0JLyoKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wTmFtZSkgewotCQlpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkKLQkJCXJldHVybiBuZXcgQm9vbGVhbih0cnVlKTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lDb25maWcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZTkyZTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lDb25maWcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6Q09ORklHLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lDb25maWcgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lDb25maWcoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfQ09ORklHLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6Q09ORklHLgotCSAqIChlcnJtc2cgQ0RBVEEgI0lNUExJRUQpCi0JICogKHNpemVmbXQgQ0RBVEEgI0lNUExJRUQpCi0JICogKHRpbWVmbXQgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfRVJSTVNHLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfU0laRUZNVCwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1RJTUVGTVR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lFY2hvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUVjaG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NmM2Y3Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUVjaG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6RUNITy4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJRWNobyBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUVjaG8oRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRUNITywgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOkVDSE8KLQkgKiAodmFyIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZBUn07Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0RGVjbGFyYXRpb25zKGF0dHJpYnV0ZXMsIEFycmF5cy5hc0xpc3QobmFtZXMpLml0ZXJhdG9yKCkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUV4ZWMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRXhlYy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTdjYjVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRXhlYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFNTSTpFWEVDLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lFeGVjIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRXhlYyhFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9FWEVDLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6RVhFQwotCSAqIChjZ2kgJVVSSTsgI0lNUExJRUQpCi0JICogKGNtZCBDREFUQSAjSU1QTElFRCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DR0ksIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DTUR9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGbGFzdG1vZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGbGFzdG1vZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWVhZjlkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRmxhc3Rtb2QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6RkxBU1RNT0QuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUZsYXN0bW9kIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRmxhc3Rtb2QoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRkxBU1RNT0QsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpGTEFTVE1PRAotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGc2l6ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lGc2l6ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmJmM2MxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJRnNpemUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6RlNJWkUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFNTSUZzaXplIGV4dGVuZHMgSGVkU1NJQmFzZSB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkU1NJRnNpemUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRlNJWkUsIGNvbGxlY3Rpb24pOwotCX0KLQotCS8qKgotCSAqIFNTSTpGU0laRQotCSAqIChmaWxlICVVUkk7ICNJTVBMSUVEKQotCSAqICh2aXJ0dWFsICVVUkkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfRklMRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1ZJUlRVQUx9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lJbmNsdWRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUluY2x1ZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc4OGI1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSUluY2x1ZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6SU5DTFVERS4KLSAqLwotZmluYWwgY2xhc3MgSGVkU1NJSW5jbHVkZSBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSUluY2x1ZGUoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfSU5DTFVERSwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU1NJOklOQ0xVREUKLQkgKiAoZmlsZSAlVVJJOyAjSU1QTElFRCkKLQkgKiAodmlydHVhbCAlVVJJICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCi0JCWF0dHJpYnV0ZXMgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX0ZJTEUsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9WSVJUVUFMfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJUHJpbnRlbnYuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJUHJpbnRlbnYuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2NGE0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFNTSVByaW50ZW52LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci0KLS8qKgotICogU1NJOlBSSU5URU5WLgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lQcmludGVudiBleHRlbmRzIEhlZFNTSUJhc2UgewotCi0JLyoqCi0JICovCi0JcHVibGljIEhlZFNTSVByaW50ZW52KEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WLCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBdHRyaWJ1dGVEZWNsYXJhdGlvbnMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm47IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGF0dHJpYnV0ZUNvbGxlY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZmF0YWwKLQotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCX0KLQotCS8qKgotCSAqIFNTSTpQUklOVEVOViBoYXMgbm8gYXR0cmlidXRlcy4gIFNvLCB0aGlzIG1ldGhvZCBzaG91bGQKLQkgKiBhbHdheXMgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIE5vdGU6IFNpbmNlIHNvbWVib2R5IGRvZXNuJ3QgZXhwZWN0IG51bGwgaXMgcmV0dXJuZWQsIHJldHVybiB0aGUgZW1wdHkgYXR0cmlidXRlCi0JICogbGlrZSBhIGN1c3RvbSB0YWcgd2hpY2ggZG9lc24ndCBoYXZlIGF0dHJpYnV0ZXMKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIHN1cGVyLmdldEF0dHJpYnV0ZXMoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkU1NJU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxYThlMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRTU0lTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTU0k6U0VULgotICovCi1maW5hbCBjbGFzcyBIZWRTU0lTZXQgZXh0ZW5kcyBIZWRTU0lCYXNlIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRTU0lTZXQoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfU0VULCBjb2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTU0k6U0VUCi0JICogKHZhciBDREFUQSAjSU1QTElFRCkKLQkgKiAodmFsdWUgQ0RBVEEgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFSLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfVkFMVUV9OwotCQlhdHRyaWJ1dGVDb2xsZWN0aW9uLmdldERlY2xhcmF0aW9ucyhhdHRyaWJ1dGVzLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRURVhUQVJFQS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRURVhUQVJFQS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWY5NTM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVEVYVEFSRUEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBURVhUQVJFQS4KLSAqLwotZmluYWwgY2xhc3MgSGVkVEVYVEFSRUEgZXh0ZW5kcyBIZWRQY2RhdGEgewotCi0JLyoqCi0JICogVEVYVEFSRUEgc2hvdWxkIGtlZXAgc3BhY2VzIGluIGl0cyBzb3VyY2UuCi0JICovCi0JcHVibGljIEhlZFRFWFRBUkVBKEVsZW1lbnRDb2xsZWN0aW9uIGNvbGxlY3Rpb24pIHsKLQkJc3VwZXIoQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEVYVEFSRUEsIGNvbGxlY3Rpb24pOwotCQlsYXlvdXRUeXBlID0gTEFZT1VUX09CSkVDVDsKLQotCQlrZWVwU3BhY2VzID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBURVhUQVJFQS4KLQkgKiAlYXR0cnM7Ci0JICogJXJlc2VydmVkOyAuLi4gZW1wdHkKLQkgKiAobmFtZSBDREFUQSAjSU1QTElFRCkKLQkgKiAocm93cyBOVU1CRVIgI1JFUVVJUkVEKQotCSAqIChjb2xzIE5VTUJFUiAjUkVRVUlSRUQpCi0JICogKGRpc2FibGVkIChkaXNhYmxlZCkgI0lNUExJRUQpCi0JICogKHJlYWRvbmx5IChyZWFkb25seSkgI0lNUExJRUQpCi0JICogKHRhYmluZGV4IE5VTUJFUiAjSU1QTElFRCkKLQkgKiAoYWNjZXNza2V5ICVDaGFyYWN0ZXI7ICNJTVBMSUVEKQotCSAqIChvbmZvY3VzICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmJsdXIgJVNjcmlwdDsgI0lNUExJRUQpCi0JICogKG9uc2VsZWN0ICVTY3JpcHQ7ICNJTVBMSUVEKQotCSAqIChvbmNoYW5nZSAlU2NyaXB0OyAjSU1QTElFRCkKLQkgKiAoaXN0eWxlIENEQVRBICNJTVBMSUVEKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUF0dHJpYnV0ZURlY2xhcmF0aW9ucygpIHsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkKLQkJCXJldHVybjsgLy8gYWxyZWFkeSBjcmVhdGVkLgotCQlpZiAoYXR0cmlidXRlQ29sbGVjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBmYXRhbAotCQlhdHRyaWJ1dGVzID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotCi0JCS8vICVhdHRyczsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRBdHRycyhhdHRyaWJ1dGVzKTsKLQotCQlTdHJpbmdbXSBuYW1lcyA9IHtDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfTkFNRSwgQ0hUTUxOYW1lc3BhY2UuQVRUUl9OQU1FX1JPV1MsIENIVE1MTmFtZXNwYWNlLkFUVFJfTkFNRV9DT0xTLCBDSFRNTE5hbWVzcGFjZS5BVFRSX05BTUVfSVNUWUxFfTsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoYXR0cmlidXRlcywgQXJyYXlzLmFzTGlzdChuYW1lcykuaXRlcmF0b3IoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVElUTEUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA3YmYzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL0hlZFRJVExFLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmNodG1sOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci0KLS8qKgotICogVElUTEUuCi0gKi8KLWZpbmFsIGNsYXNzIEhlZFRJVExFIGV4dGVuZHMgSGVkUGNkYXRhIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIZWRUSVRMRShFbGVtZW50Q29sbGVjdGlvbiBjb2xsZWN0aW9uKSB7Ci0JCXN1cGVyKENIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFLCBjb2xsZWN0aW9uKTsKLQkJbGF5b3V0VHlwZSA9IExBWU9VVF9ISURERU47Ci0JfQotCi0JLyoqCi0JICogVElUTEUuCi0JICogJWkxOG47Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlaTE4bjsKLQkJYXR0cmlidXRlQ29sbGVjdGlvbi5nZXRJMThuKGF0dHJpYnV0ZXMpOwotCX0KLQotCS8qKgotCSAqIEV4Y2x1c2lvbi4KLQkgKiA8Y29kZT5USVRMRTwvY29kZT4gaGFzIHRoZSBleGNsdXNpb24uCi0JICogSXQgaXMgPGNvZGU+JWhlYWQubWlzYzs8L2NvZGU+LgotCSAqICVoZWFkLm1pc2M7IGlzIDxjb2RlPlNDUklQVHxTVFlMRXxNRVRBfExJTkt8T0JKRUNUPC9jb2RlPi4KLQkgKiA8YnI+Ci0JICovCi0JcHVibGljIENNQ29udGVudCBnZXRFeGNsdXNpb24oKSB7Ci0JCWlmIChleGNsdXNpb24gIT0gbnVsbCkKLQkJCXJldHVybiBleGNsdXNpb247IC8vIGFscmVhZHkgY3JlYXRlZC4KLQkJaWYgKGVsZW1lbnRDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQkvLyAoU0NSSVBUfFNUWUxFfE1FVEF8TElOS3xPQkpFQ1QpCi0JCWV4Y2x1c2lvbiA9IG5ldyBDTUdyb3VwSW1wbChDTUdyb3VwLkNIT0lDRSwgMSwgMSk7Ci0KLQkJU3RyaW5nW10gbmFtZXMgPSB7Q0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVUQSx9OwotCQllbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMoZXhjbHVzaW9uLCBBcnJheXMuYXNMaXN0KG5hbWVzKS5pdGVyYXRvcigpKTsKLQkJcmV0dXJuIGV4Y2x1c2lvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRVTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9jaHRtbC9IZWRVTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWRkYmMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvSGVkVUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuY2h0bWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotLyoqCi0gKiBVTC4KLSAqLwotZmluYWwgY2xhc3MgSGVkVUwgZXh0ZW5kcyBIZWRMaXN0SXRlbUNvbnRhaW5lciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSGVkVUwoRWxlbWVudENvbGxlY3Rpb24gY29sbGVjdGlvbikgewotCQlzdXBlcihDSFRNTE5hbWVzcGFjZS5FbGVtZW50TmFtZS5VTCwgY29sbGVjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogVUwuCi0JICogKHR5cGUgJVVMU3R5bGU7ICNJTVBMSUVEKSAuLi4gc2hvdWxkIGJlIGRlZmluZWQgbG9jYWxseS4KLQkgKiAoY29tcGFjdCAoY29tcGFjdCkgI0lNUExJRUQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlRGVjbGFyYXRpb25zKCkgewotCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotCQkJcmV0dXJuOyAvLyBhbHJlYWR5IGNyZWF0ZWQuCi0JCWlmIChhdHRyaWJ1dGVDb2xsZWN0aW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGZhdGFsCi0KLQkJYXR0cmlidXRlcyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLQotCQkvLyAlYXR0cnM7Ci0JCWF0dHJpYnV0ZUNvbGxlY3Rpb24uZ2V0QXR0cnMoYXR0cmlidXRlcyk7Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0UHJvaGliaXRlZEFuY2VzdG9ycygpIHsKLQkJaWYgKHByb2hpYml0ZWRBbmNlc3RvcnMgIT0gbnVsbCkKLQkJCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCi0JCVN0cmluZ1tdIG5hbWVzID0ge0NIVE1MTmFtZXNwYWNlLkVsZW1lbnROYW1lLkRJUiwgQ0hUTUxOYW1lc3BhY2UuRWxlbWVudE5hbWUuTUVOVX07Ci0JCXByb2hpYml0ZWRBbmNlc3RvcnMgPSBlbGVtZW50Q29sbGVjdGlvbi5nZXREZWNsYXJhdGlvbnMobmFtZXMpOwotCi0JCXJldHVybiBwcm9oaWJpdGVkQW5jZXN0b3JzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZWQ1NjdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci0KLQotCi0vKioKLSAqIFByb3BlcnR5UHJvdmlkZXIgY2xhc3MuCi0gKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBpbnN0YW5jZXMuCi0gKi8KLWludGVyZmFjZSBQcm9wZXJ0eVByb3ZpZGVyIHsKLQotCWJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCk7Ci0KLQlPYmplY3QgZ2V0KEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvY2h0bWwvUHJvcGVydHlQcm92aWRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM3YjFiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2NodG1sL1Byb3BlcnR5UHJvdmlkZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5jaHRtbDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxFbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTFByb3BlcnR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotCi0vKioKLSAqIFRoZSBmYWN0b3J5IG9iamVjdCBvZiBQcm9wZXJ0eVByb3ZpZGVyLgotICovCi1maW5hbCBjbGFzcyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSB7Ci0KLQotCS8qKgotCSAqIERlZmF1bHRQcm92aWRlciBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGZvciB1bmtub3duIHByb3BlcnRpZXMuCi0JICogSXQgYWx3YXlzIHJldHVybnMgbnVsbCB2YWx1ZSBmb3IgYW55IHByb3BlcnRpZXMuCi0JICovCi0JY2xhc3MgRGVmYXVsdFByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBEZWZhdWx0UHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXQoSFRNTEVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIGltcGxlbWVudHMgUHJvcGVydHlQcm92aWRlciB7Ci0JCXByb3RlY3RlZCBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKEhUTUxFbGVtZW50RGVjbGFyYXRpb24gZWRlY2wpIHsKLQkJCXJldHVybiAoZWRlY2wgIT0gbnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldChIVE1MRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsKSB7Ci0JCQlpZiAoIShlZGVjbCBpbnN0YW5jZW9mIEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBnZXRFbGVtZW50UHJvcGVydHkoKEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uKWVkZWNsKTsKLQkJfQotCi0JCWFic3RyYWN0IHByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpOwotCX0KLQotCS8qCi0JICogInRhZ0luZm8iCi0JICogZ2V0cyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZWxlbWVudAotCSAqLwotCWNsYXNzIFBQVGFnSW5mbyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgaHRtbEFubm90YXRpb25Mb2MgPSAiZGF0YS9odG1yZWYueG1sIjsgLy8kTk9OLU5MUy0xJAotCQlwcm90ZWN0ZWQgQW5ub3RhdGlvbk1hcCBmQW5ub3RhdGlvbk1hcCA9IG51bGw7Ci0KLQkJcHVibGljIFBQVGFnSW5mbygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogR2V0cyB0aGUgYW5ub3RhdGlvbk1hcC4KLQkJICogQHJldHVybiBSZXR1cm5zIGEgQW5ub3RhdGlvbk1hcAotCQkgKi8KLQkJcHJvdGVjdGVkIEFubm90YXRpb25NYXAgZ2V0QW5ub3RhdGlvbk1hcCgpIHsKLQkJCWlmIChmQW5ub3RhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQkJZkFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotCQkJCXRyeSB7Ci0JCQkJCWZBbm5vdGF0aW9uTWFwLmxvYWQoaHRtbEFubm90YXRpb25Mb2MsIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBubyBhbm5vdGF0aW9uIGF2YWlsYWJsZQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmQW5ub3RhdGlvbk1hcDsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCWlmIChkZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCXJldHVybiBnZXRBbm5vdGF0aW9uTWFwKCkuZ2V0UHJvcGVydHkoKChIVE1MRWxlbWVudERlY2xhcmF0aW9uKWRlY2wpLmdldEVsZW1lbnROYW1lKCksICJ0YWdJbmZvIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJzaG91bGRLZWVwU3BhY2UiCi0JICovCi0JY2xhc3MgUFBTaG91bGRLZWVwU3BhY2UgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQU2hvdWxkS2VlcFNwYWNlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLnNob3VsZEtlZXBTcGFjZXMoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJzaG91bGRJbmRlbnRDaGlsZFNvdXJjZSIKLQkgKi8KLQljbGFzcyBQUFNob3VsZEluZGVudENoaWxkU291cmNlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUFNob3VsZEluZGVudENoaWxkU291cmNlKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihkZWNsLnNob3VsZEluZGVudENoaWxkU291cmNlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAidGVybWluYXRvcnMiCi0JICovCi0JY2xhc3MgUFBUZXJtaW5hdG9ycyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBUZXJtaW5hdG9ycygpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKCEgKGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbURlY2xJbXBsKSkgcmV0dXJuIG51bGw7Ci0JCQlyZXR1cm4gKChIVE1MRWxlbURlY2xJbXBsKWRlY2wpLmdldFRlcm1pbmF0b3JzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJwcm9oaWJpdGVkQW5jZXN0b3JzIgotCSAqLwotCWNsYXNzIFBQUHJvaGliaXRlZEFuY2VzdG9ycyBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBQcm9oaWJpdGVkQW5jZXN0b3JzKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBkZWNsLmdldFByb2hpYml0ZWRBbmNlc3RvcnMoKTsKLQkJfQotCX0KLQotCS8qCi0JICogImlzSlNQIgotCSAqLwotCWNsYXNzIFBQSXNKU1AgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSXNKU1AoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGRlY2wuaXNKU1AoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJpc1hIVE1MIgotCSAqIEhUTUxFbGVtZW50RGVjbGFyYXRpb24gaXRzZWxmIG5ldmVyIHJlcHJlc2VudCBhbnkgWEhUTUwgZWxlbWVudCBkZWNsYXJhdGlvbi4KLQkgKiBTbywgdGhpcyBwcm9wZXJ0eSBtdXN0IGJlIGFsd2F5cyBmYWxzZS4KLQkgKi8KLQljbGFzcyBQUElzWEhUTUwgZXh0ZW5kcyBBYnN0cmFjdEVsZW1lbnRQcm9wZXJ0eVByb3ZpZGVyIHsKLQkJcHVibGljIFBQSXNYSFRNTCgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlyZXR1cm4gbmV3IEJvb2xlYW4oZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAiaXNTU0kiCi0JICogRWFjaCBkZWNsYXJhdGlvbiBjbGFzcyBmb3IgU1NJIGVsZW1lbnRzIG11c3QgcHJvdmlkZSB0aGlzIHByb3BlcnR5IGl0c2VsZiwKLQkgKiBhbmQgdGhlbiByZXR1cm4gdHJ1ZS4gIE90aGVyIGRlY2xhcmF0aW9uIG11c3QgYWx3YXlzIHJldHVybiBmYWxzZS4KLQkgKi8KLQljbGFzcyBQUElzU1NJIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUElzU1NJKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCXJldHVybiBuZXcgQm9vbGVhbihmYWxzZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqICJsaW5lQnJlYWtIaW50IgotCSAqLwotCWNsYXNzIFBQTGluZUJyZWFrSGludCBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBMaW5lQnJlYWtIaW50KCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3QgZ2V0RWxlbWVudFByb3BlcnR5KEhUTUxQcm9wZXJ0eURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJCVN0cmluZyBoaW50ID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfTk9ORTsKLQkJCXN3aXRjaCAoZGVjbC5nZXRMaW5lQnJlYWtIaW50KCkpIHsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uQlJFQUtfQUZURVJfU1RBUlQgOgotCQkJCQloaW50ID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQUZURVJfU1RBUlQ7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORCA6Ci0JCQkJCWhpbnQgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19CRUZPUkVfU1RBUlRfQU5EX0FGVEVSX0VORDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkJSRUFLX05PTkUgOgotCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gaGludDsKLQkJfQotCX0KLQotCS8qCi0JICogImxheW91dFR5cGUiCi0JICovCi0JY2xhc3MgUFBMYXlvdXRUeXBlIGV4dGVuZHMgQWJzdHJhY3RFbGVtZW50UHJvcGVydHlQcm92aWRlciB7Ci0JCXB1YmxpYyBQUExheW91dFR5cGUoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJU3RyaW5nIHR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfTk9ORTsKLQkJCXN3aXRjaCAoZGVjbC5nZXRMYXlvdXRUeXBlKCkpIHsKLQkJCQljYXNlIEhUTUxFbGVtZW50RGVjbGFyYXRpb24uTEFZT1VUX0JMT0NLIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9CTE9DSzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9CUkVBSyA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfQlJFQUs7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfSElEREVOIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9ISURERU47Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfT0JKRUNUIDoKLQkJCQkJdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkxBWU9VVF9PQkpFQ1Q7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5MQVlPVVRfV1JBUCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5MQVlPVVRfV1JBUDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLkxBWU9VVF9OT05FIDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWRlZmF1bHQgOgotCQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiB0eXBlOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAib21pdFR5cGUiCi0JICovCi0JY2xhc3MgUFBPbWl0VHlwZSBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBPbWl0VHlwZSgpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgT2JqZWN0IGdldEVsZW1lbnRQcm9wZXJ0eShIVE1MUHJvcGVydHlEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfTk9ORTsKLQkJCXN3aXRjaCAoZGVjbC5nZXRPbWl0VHlwZSgpKSB7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfQk9USCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0JPVEg7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSFRNTEVsZW1lbnREZWNsYXJhdGlvbi5PTUlUX0VORCA6Ci0JCQkJCXR5cGUgPSBIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EX0RFRkFVTFQgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfRU5EX01VU1QgOgotCQkJCQl0eXBlID0gSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfTVVTVDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBIVE1MRWxlbWVudERlY2xhcmF0aW9uLk9NSVRfTk9ORSA6Ci0JCQkJLy8gbm90aGluZyB0byBkby4KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlyZXR1cm4gdHlwZTsKLQkJfQotCX0KLQotCS8qCi0JICogImluY2x1c2lvbiIKLQkgKi8KLQljbGFzcyBQUEluY2x1c2lvbiBleHRlbmRzIEFic3RyYWN0RWxlbWVudFByb3BlcnR5UHJvdmlkZXIgewotCQlwdWJsaWMgUFBJbmNsdXNpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIE9iamVjdCBnZXRFbGVtZW50UHJvcGVydHkoSFRNTFByb3BlcnR5RGVjbGFyYXRpb24gZGVjbCkgewotCQkJcmV0dXJuIGRlY2wuZ2V0SW5jbHVzaW9uKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFByb3BlcnR5UHJvdmlkZXIgZ2V0UHJvdmlkZXIoU3RyaW5nIHByb3BOYW1lKSB7Ci0JCVByb3BlcnR5UHJvdmlkZXJGYWN0b3J5IGZhY3RvcnkgPSBnZXRJbnN0YW5jZSgpOwotCQlQcm9wZXJ0eVByb3ZpZGVyIHBwID0gKFByb3BlcnR5UHJvdmlkZXIpIGZhY3RvcnkucmVnaXN0cnkuZ2V0KHByb3BOYW1lKTsKLQkJaWYgKHBwICE9IG51bGwpCi0JCQlyZXR1cm4gcHA7Ci0KLQkJcHAgPSBmYWN0b3J5LmNyZWF0ZShwcm9wTmFtZSk7Ci0JCWlmIChwcCA9PSBudWxsKQotCQkJcmV0dXJuIGZhY3RvcnkuZGVmYXVsdFByb3ZpZGVyOwotCi0JCWZhY3RvcnkucmVnaXN0cnkucHV0KHByb3BOYW1lLCBwcCk7Ci0JCXJldHVybiBwcDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCBzdGF0aWMgUHJvcGVydHlQcm92aWRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSAhPSBudWxsKQotCQkJcmV0dXJuIGluc3RhbmNlOwotCQlpbnN0YW5jZSA9IG5ldyBQcm9wZXJ0eVByb3ZpZGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBIYXNodGFibGUgcmVnaXN0cnkgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JcHJpdmF0ZSBQcm9wZXJ0eVByb3ZpZGVyIGRlZmF1bHRQcm92aWRlciA9IG5ldyBEZWZhdWx0UHJvdmlkZXIoKTsKLQotCXByaXZhdGUgUHJvcGVydHlQcm92aWRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBQcm9wZXJ0eVByb3ZpZGVyIGNyZWF0ZShTdHJpbmcgcHJvcE5hbWUpIHsKLQkJUHJvcGVydHlQcm92aWRlciBwcCA9IG51bGw7Ci0JCWlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19KU1ApKQotCQkJcHAgPSBuZXcgUFBJc0pTUCgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCkpCi0JCQlwcCA9IG5ldyBQUElzWEhUTUwoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuSVNfU1NJKSkKLQkJCXBwID0gbmV3IFBQSXNTU0koKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuTEFZT1VUX1RZUEUpKQotCQkJcHAgPSBuZXcgUFBMYXlvdXRUeXBlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpCi0JCQlwcCA9IG5ldyBQUExpbmVCcmVha0hpbnQoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpKQotCQkJcHAgPSBuZXcgUFBQcm9oaWJpdGVkQW5jZXN0b3JzKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9LRUVQX1NQQUNFKSkKLQkJCXBwID0gbmV3IFBQU2hvdWxkS2VlcFNwYWNlKCk7Ci0JCWVsc2UgaWYgKHByb3BOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JTkRFTlRfQ0hJTERfU09VUkNFKSkKLQkJCXBwID0gbmV3IFBQU2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UoKTsKLQkJZWxzZSBpZiAocHJvcE5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVEVSTUlOQVRPUlMpKQotCQkJcHAgPSBuZXcgUFBUZXJtaW5hdG9ycygpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5UQUdJTkZPKSkKLQkJCXBwID0gbmV3IFBQVGFnSW5mbygpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKQotCQkJcHAgPSBuZXcgUFBPbWl0VHlwZSgpOwotCQllbHNlIGlmIChwcm9wTmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5JTkNMVVNJT04pKQotCQkJcHAgPSBuZXcgUFBJbmNsdXNpb24oKTsKLQotCQlyZXR1cm4gcHA7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvc3NpL1NTSUNNRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3NzaS9TU0lDTURvY3VtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDk5NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvc3NpL1NTSUNNRG9jdW1lbnRGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5zc2k7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICogQ01Eb2N1bWVudCBmYWN0b3J5IGZvciBTU0kgZG9jdW1lbnRzLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgU1NJQ01Eb2N1bWVudEZhY3RvcnkgewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBSRUZJWCA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9DX1RZUEVfTkFNRSA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBjbGFzcyBDTU5hbWVzcGFjZUltcGwgaW1wbGVtZW50cyBDTU5hbWVzcGFjZSB7Ci0JCXB1YmxpYyBDTU5hbWVzcGFjZUltcGwoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCQlyZXR1cm4gUFJFRklYOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gRE9DX1RZUEVfTkFNRTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQ01Ob2RlLk5BTUVfU1BBQ0U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgQ01Eb2NJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudCB7Ci0JCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgaGNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCi0JCXN0YXRpYyBjbGFzcyBFbGVtZW50cyBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQkJCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG5hbWVzID0ge0hUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfQ09ORklHLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX0VDSE8sIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TU0lfRVhFQywgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GU0laRSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9GTEFTVE1PRCwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNTSV9JTkNMVURFLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1BSSU5URU5WLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1NJX1NFVH07Ci0JCQlwcml2YXRlIEhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQkJCXB1YmxpYyBFbGVtZW50cygpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBlbGVtcyA9IGhjbS5nZXRFbGVtZW50cygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBuYW1lc1tpXTsKLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtcy5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQkJCWlmIChkZWMgIT0gbnVsbCkKLQkJCQkJCW1hcC5wdXQobmFtZSwgZGVjKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiBtYXAuc2l6ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgQ01Ob2RlIGdldE5hbWVkSXRlbShTdHJpbmcgbmFtZSkgewotCQkJCVN0cmluZyBjb29rZWQgPSBnZXRDYW5vbmljYWxOYW1lKG5hbWUpOwotCQkJCWlmICghbWFwLmNvbnRhaW5zS2V5KGNvb2tlZCkpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCXJldHVybiAoQ01Ob2RlKSBtYXAuZ2V0KGNvb2tlZCk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCQlJdGVyYXRvciBpdGVyID0gaXRlcmF0b3IoKTsKLQkJCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCQkJaWYgKC0taW5kZXggPCAwKQotCQkJCQkJcmV0dXJuIChDTU5vZGUpIG5vZGU7Ci0JCQkJfQotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQlwdWJsaWMgSXRlcmF0b3IgaXRlcmF0b3IoKSB7Ci0JCQkJcmV0dXJuIG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCQlwcml2YXRlIFN0cmluZyBnZXRDYW5vbmljYWxOYW1lKFN0cmluZyByYXdOYW1lKSB7Ci0JCQkJcmV0dXJuIHJhd05hbWUudG9VcHBlckNhc2UoKTsKLQkJCX0KLQkJfQotCi0JCXN0YXRpYyBwcml2YXRlIEVsZW1lbnRzIGVsZW1lbnRzID0gbmV3IEVsZW1lbnRzKCk7Ci0KLQotCQlwdWJsaWMgQ01Eb2NJbXBsKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCQlyZXR1cm4gQ01Ob2RlLkRPQ1VNRU5UOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkgewotCQkJcmV0dXJuIGVsZW1lbnRzOwotCQl9Ci0KLQkJcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQkJcmV0dXJuIHNzaW5zOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIENNTmFtZXNwYWNlIHNzaW5zID0gbmV3IENNTmFtZXNwYWNlSW1wbCgpOwotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgbXljbSA9IG5ldyBDTURvY0ltcGwoKTsKLQotCXByaXZhdGUgU1NJQ01Eb2N1bWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBteWNtOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9IVE1MQ29udGVudFByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGM3YTQxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlByb2plY3RTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByb3BlcnRpZXMgY29uc3RhbnRzIHVzZWQgYnkgSFRNTC4gQ2xpZW50cyBzaG91bGQgb25seSByZWFkIGFuZCBtb2RpZnkgdGhlCi0gKiBIVE1MIHByb3BlcnRpZXMgcHJvZ3JhbW1hdGljYWxseSB1c2luZyB0aGlzIGNsYXNzLgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MQ29udGVudFByb3BlcnRpZXMgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTENPUkVfSUQgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0pFQ1RfS0VZID0gIjxwcm9qZWN0PiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGRvY3VtZW50IHR5cGUgdG8gdXNlIHdoZW4gbm9uZSBpcyBzcGVjaWZpZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9UWVBFID0gImRvY3VtZW50LXR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBHZW5lcmF0ZXMgYSBwcmVmZXJlbmNlIGtleSBiYXNlZCBvbiByZXNvdXJjZVBhdGgKLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2VQYXRoCi0JICogICAgICAgICAgICB0aGUgcGF0aCB0aGUga2V5IHdpbGwgYmUgYmFzZWQgb2ZmIG9mCi0JICogQHJldHVybiBwcmVmZXJlbmNlIGtleSBiYXNlZCBvbiByZXNvdXJjZVBhdGggKGJhc2ljYWxseSB0aGUKLQkgKiAgICAgICAgIHJlc291cmNlUGF0aCB3aXRob3V0IHRoZSBmaWxlbmFtZSk7IFBST0pFQ1RfS0VZIGlmIHJlc291cmNlUGF0aAotCSAqICAgICAgICAgaXMgbnVsbAotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0S2V5Rm9yKElQYXRoIHJlc291cmNlUGF0aCkgewotCQlTdHJpbmcga2V5ID0gUFJPSkVDVF9LRVk7Ci0JCWlmIChyZXNvdXJjZVBhdGggIT0gbnVsbCAmJiByZXNvdXJjZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQlrZXkgPSByZXNvdXJjZVBhdGgucmVtb3ZlRmlyc3RTZWdtZW50cygxKS50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiBrZXk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBwcmVmZXJlbmNlcyBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gcHJvamVjdCBzY29wZSBhbmQKLQkgKiBwcmVmZXJlbmNlIGtleSAoc3ViTm9kZSkgSWYgY3JlYXRlIGlzIHRydWUsIHRoZSBwcmVmZXJlbmNlIG5vZGUgd2lsbCBiZQotCSAqIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdAotCSAqICAgICAgICAgICAgdGhlIHByb2plY3QgdGhlIHByZWZlcmVuY2Ugbm9kZSBpcyB1bmRlcgotCSAqIEBwYXJhbSBwcmVmZXJlbmNlS2V5Ci0JICogICAgICAgICAgICB0aGUgc3Vibm9kZS9jYXRlZ29yeSB0aGUgcHJlZmVyZW5jZSBub2RlIGlzIGxvY2F0ZWQgaW4KLQkgKiBAcGFyYW0gY3JlYXRlCi0JICogICAgICAgICAgICBpZiB0cnVlLCBhIHByZWZlcmVuY2Ugbm9kZSB3aWxsIGJlIGNyZWF0ZWQgaWYgb25lIGRvZXMgbm90Ci0JICogICAgICAgICAgICBhbHJlYWR5IGV4aXN0Ci0JICogQHJldHVybiBQcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIHByb2plY3Qgc2NvcGUgYW5kCi0JICogICAgICAgICBwcmVmZXJlbmNlIGtleS4gbnVsbCBpZiBvbmUgY291bGQgbm90IGJlIGZvdW5kIGFuZCBjcmVhdGUgaXMKLQkgKiAgICAgICAgIGZhbHNlCi0JICovCi0Jc3RhdGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKElQcm9qZWN0IHByb2plY3QsIFN0cmluZyBwcmVmZXJlbmNlS2V5LCBib29sZWFuIGNyZWF0ZSkgewotCQlpZiAoY3JlYXRlKQotCQkJLy8gY3JlYXRlIGFsbCBub2RlcyBkb3duIHRvIHRoZSBvbmUgd2UgYXJlIGludGVyZXN0ZWQgaW4KLQkJCXJldHVybiBuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLmdldE5vZGUoSFRNTENPUkVfSUQpLm5vZGUocHJlZmVyZW5jZUtleSk7Ci0JCS8vIGJlIGNhcmVmdWwgbG9va2luZyB1cCBmb3Igb3VyIG5vZGUgc28gbm90IHRvIGNyZWF0ZSBhbnkgbm9kZXMgYXMKLQkJLy8gc2lkZSBlZmZlY3QKLQkJUHJlZmVyZW5jZXMgbm9kZSA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCkubm9kZShQcm9qZWN0U2NvcGUuU0NPUEUpOwotCQl0cnkgewotCQkJLy8gVE9ETyBvbmNlIGJ1ZyA5MDUwMCBpcyBmaXhlZCwgc2hvdWxkIGJlIGFzIHNpbXBsZSBhcyB0aGlzOgotCQkJLy8gU3RyaW5nIHBhdGggPSBwcm9qZWN0LmdldE5hbWUoKSArIElQYXRoLlNFUEFSQVRPUiArCi0JCQkvLyBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTICsgSVBhdGguU0VQQVJBVE9SICsKLQkJCS8vIEVOQ09ESU5HX1BSRUZfTk9ERTsKLQkJCS8vIHJldHVybiBub2RlLm5vZGVFeGlzdHMocGF0aCkgPyBub2RlLm5vZGUocGF0aCkgOiBudWxsOwotCQkJLy8gZm9yIG5vdywgdGFrZSB0aGUgbG9uZyB3YXkKLQkJCWlmICghbm9kZS5ub2RlRXhpc3RzKHByb2plY3QuZ2V0TmFtZSgpKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCW5vZGUgPSBub2RlLm5vZGUocHJvamVjdC5nZXROYW1lKCkpOwotCQkJaWYgKCFub2RlLm5vZGVFeGlzdHMoSFRNTENPUkVfSUQpKQotCQkJCXJldHVybiBudWxsOwotCQkJbm9kZSA9IG5vZGUubm9kZShIVE1MQ09SRV9JRCk7Ci0JCQlpZiAoIW5vZGUubm9kZUV4aXN0cyhwcmVmZXJlbmNlS2V5KSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBub2RlLm5vZGUocHJlZmVyZW5jZUtleSk7Ci0JCX0KLQkJY2F0Y2ggKEJhY2tpbmdTdG9yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBub2RlRXhpc3RzIGZhaWxlZAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCByZXRyaWV2ZSBwcmVmZXJlbmNlIG5vZGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gY29udGV4dCBpcwotCSAqICAgICAgICAgICAgYXZhaWxhYmxlIGFuZCB0aGUgd29ya3NwYWNlIHNldHRpbmcgc2hvdWxkIGJlIHRha2VuLiBOb3RlCi0JICogICAgICAgICAgICB0aGF0IHBhc3NpbmcgPGNvZGU+bnVsbDwvY29kZT4gc2hvdWxkIGJlIGF2b2lkZWQuCi0JICogQHBhcmFtIHJlY3Vyc2UKLQkgKiAgICAgICAgICAgIHdoZXRoZXIgdGhlIHBhcmVudCBzaG91bGQgYmUgcXVlcmllZCB0aWxsIHByb3BlcnR5IGlzIGZvdW5kCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIGZvciB0aGUga2V5LgotCSAqIEBzaW5jZSAxLjEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSkgewotCQlTdHJpbmcgdmFsID0gbnVsbDsKLQkJLy8gYm9vbGVhbiBwcmVmZXJlbmNlRm91bmQgPSBmYWxzZTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByZXNvdXJjZS5nZXRQcm9qZWN0KCk7Ci0JCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhwcm9qZWN0LCBrZXksIGZhbHNlKTsKLQkJCQlpZiAocHJlZmVyZW5jZXMgIT0gbnVsbCkgewotCQkJCQl2YWwgPSBpbnRlcm5hbEdldFByb3BlcnR5KHJlc291cmNlLCByZWN1cnNlLCBwcmVmZXJlbmNlcyk7Ci0JCQkJCS8vIHByZWZlcmVuY2VGb3VuZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIFdvcmtiZW5jaCBwcmVmZXJlbmNlIG1heSBub3QgYmUgbmVlZGVkIHNvIGxlYXZlIG91dCBmb3Igbm93Ci0JCS8vIC8vIG5vIHByZWZlcmVuY2VzIGZvdW5kIC0gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsCi0JCS8vIC8vIHNob3J0LWNpcmN1aXQKLQkJLy8gLy8gbG9va3VwIGJ5IGZhbGxpbmcgYmFjayB0byB3b3Jrc3BhY2UncyBkZWZhdWx0Ci0JCS8vIC8vIHNldHRpbmcKLQkJLy8gaWYgKCFwcmVmZXJlbmNlRm91bmQpCi0JCS8vIHZhbCA9IGdldFdvcmtiZW5jaFByZWZlcmVuY2Uoa2V5KTsKLQkJcmV0dXJuIHZhbDsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgaW50ZXJuYWxHZXRQcm9wZXJ0eShJUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gcmVjdXJzZSwgUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMpIHsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgbnVsbCk7Ci0JCWlmICh2YWx1ZSA9PSBudWxsICYmIHJlc291cmNlICE9IHJlc291cmNlLmdldFByb2plY3QoKSAmJiByZWN1cnNlKSB7Ci0JCQl2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChnZXRLZXlGb3IobnVsbCksIG51bGwpOwotCQl9Ci0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8gLy8gZW5zdXJlIHdlIGRlZmF1bHQgdG8gdGhlIHdvcmtzcGFjZSBwcmVmZXJlbmNlIGlmIG5vbmUgaXMgZm91bmQKLQkJLy8gcmV0dXJuIHZhbHVlID09IG51bGwgPyBnZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSkgOiB2YWx1ZTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHZhbHVlIGZvciB0aGUgZ2l2ZW4ga2V5IGluIHRoZSBnaXZlbiBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBrZXkKLQkgKiAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBrZXkKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBjdXJyZW50IGNvbnRleHQuIE5vdGUgY29udGV4dCBjYW5ub3QgYmUKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+LgotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgVGhlIHZhbHVlIHRvIHNldCBmb3IgdGhlIGtleS4gSWYgdmFsdWUgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKiAgICAgICAgICAgIHRoZSBrZXkgaXMgcmVtb3ZlZCBmcm9tIHByb3BlcnRpZXMuCi0JICogQHNpbmNlIDEuMQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCkgewotCQkJSVByb2plY3QgcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwpIHsKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldFByZWZlcmVuY2VzKHByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJCXByZWZlcmVuY2VzLnJlbW92ZShnZXRLZXlGb3IocmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSkpOwotCQkJCWVsc2UKLQkJCQkJcHJlZmVyZW5jZXMucHV0KGdldEtleUZvcihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpKSwgdmFsdWUpOwotCQkJCXRyeSB7Ci0JCQkJCS8vIHNhdmUgY2hhbmdlcwotCQkJCQlwcmVmZXJlbmNlcy5mbHVzaCgpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24obmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBIVE1MQ09SRV9JRCwgSVN0YXR1cy5FUlJPUiwgIlVuYWJsZSB0byBzZXQgcHJvcGVydHkiLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gV29ya2JlbmNoIHByZWZlcmVuY2UgbWF5IG5vdCBiZSBuZWVkZWQgc28gbGVhdmUgb3V0IGZvciBub3cKLQkJLy8ganVzdCBzZXQgYSBwcmVmZXJlbmNlIGluIHRoZSBpbnN0YW5jZSBzY29wZQotCQkvLyBpZiAoIXByZWZlcmVuY2VGb3VuZCkgewotCQkvLyBzZXRXb3JrYmVuY2hQcmVmZXJlbmNlKGtleSk7Ci0JCS8vIH0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0hUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFmMDNjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5OdWxsUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5PcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLkJhY2tpbmdTdG9yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLnByZWZzLlByZWZlcmVuY2VzOwotCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRQcm9wZXJ0aWVzTWFuYWdlciB7Ci0JcHVibGljIEhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZSZXNvdXJjZUNoYW5nZUxpc3RlbmVyID0gbmV3IFJlc291cmNlQ2hhbmdlTGlzdGVuZXIoKTsKLQkJZkpvYiA9IG5ldyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IoKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyIF9pbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciBmUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcjsKLQlDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IgZkpvYjsKLQotCS8qKgotCSAqIFRoaXMgam9iIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgdG8gYWxsb3cgdGhlIHJlc291cmNlIGNoYW5nZSBsaXN0ZW5lcgotCSAqIHRvIHNjaGVkdWxlIG9wZXJhdGlvbnMgdGhhdCBuZWVkIHRvIG1vZGlmeSB0aGUgd29ya3NwYWNlLgotCSAqLwotCXByaXZhdGUgY2xhc3MgQ29udGVudFByb3BlcnRpZXNNYW5hZ2VySm9iIGV4dGVuZHMgSm9iIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST1BFUlRJRVNfVVBEQVRFX0RFTEFZID0gNTAwOwotCQlwcml2YXRlIExpc3QgYXN5bmNDaGFuZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyBDb250ZW50UHJvcGVydGllc01hbmFnZXJKb2IoKSB7Ci0JCQlzdXBlcihIVE1MQ29yZU1lc3NhZ2VzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfVXBkYXRpbmcpOwotCQkJc2V0U3lzdGVtKHRydWUpOwotCQkJc2V0UHJpb3JpdHkoSm9iLklOVEVSQUNUSVZFKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZENoYW5nZXMoU2V0IG5ld0NoYW5nZXMpIHsKLQkJCWlmIChuZXdDaGFuZ2VzLmlzRW1wdHkoKSkKLQkJCQlyZXR1cm47Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCWFzeW5jQ2hhbmdlcy5hZGRBbGwobmV3Q2hhbmdlcyk7Ci0JCQkJYXN5bmNDaGFuZ2VzLm5vdGlmeSgpOwotCQkJfQotCQkJc2NoZWR1bGUoUFJPUEVSVElFU19VUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldE5leHRDaGFuZ2UoKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiBhc3luY0NoYW5nZXMuaXNFbXB0eSgpID8gbnVsbCA6IChJUHJvamVjdCkgYXN5bmNDaGFuZ2VzLnJlbW92ZShhc3luY0NoYW5nZXMuc2l6ZSgpIC0gMSk7Ci0JCQl9Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlNdWx0aVN0YXR1cyByZXN1bHQgPSBuZXcgTXVsdGlTdGF0dXMoSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkhUTUxDT1JFX0lELCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgSFRNTENvcmVNZXNzYWdlcy5IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBudWxsKTsKLQkJCW1vbml0b3IgPSBtb25pdG9yID09IG51bGwgPyBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpIDogbW9uaXRvcjsKLQkJCXRyeSB7Ci0JCQkJbW9uaXRvci5iZWdpblRhc2soSFRNTENvcmVNZXNzYWdlcy5IVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyX1VwZGF0aW5nLCBhc3luY0NoYW5nZXMuc2l6ZSgpKTsKLQkJCQl0cnkgewotCQkJCQlJUHJvamVjdCBuZXh0OwotCQkJCQl3aGlsZSAoKG5leHQgPSBnZXROZXh0Q2hhbmdlKCkpICE9IG51bGwpIHsKLQkJCQkJCS8vIGp1c3QgZXhpdCBpZiB0aGUgc3lzdGVtIGlzIHNodXR0aW5nIGRvd24gb3IgaGFzCi0JCQkJCQkvLyBiZWVuIHNodXQgZG93bgotCQkJCQkJLy8gaXQgaXMgdG9vIGxhdGUgdG8gY2hhbmdlIHRoZSB3b3Jrc3BhY2UgYXQgdGhpcwotCQkJCQkJLy8gcG9pbnQgYW55d2F5Ci0JCQkJCQlpZiAoUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS5vc2dpIikuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuQUNUSVZFKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl0cnkgewotCQkJCQkJCS8vIHNhdmUgdGhlIHByZWZlcmVuY2VzIG5vZGVzCi0JCQkJCQkJaWYgKG5leHQuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQkJCQkJLy8gc2F2ZSBkb2N1bWVudCB0eXBlIHByZWZlcmVuY2VzCi0JCQkJCQkJCVByZWZlcmVuY2VzIHByb2plY3RQcmVmcyA9IEhUTUxDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyhuZXh0LCBIVE1MQ29udGVudFByb3BlcnRpZXMuRE9DVU1FTlRfVFlQRSwgZmFsc2UpOwotCQkJCQkJCQlpZiAocHJvamVjdFByZWZzICE9IG51bGwpCi0JCQkJCQkJCQlwcm9qZWN0UHJlZnMuZmx1c2goKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyB3ZSBnb3QgYW4gZXJyb3Igc2F2aW5nCi0JCQkJCQkJU3RyaW5nIGRldGFpbE1lc3NhZ2UgPSBOTFMuYmluZChIVE1MQ29yZU1lc3NhZ2VzLkhUTUxDb250ZW50UHJvcGVydGllc01hbmFnZXJfUHJvYmxlbXNfVXBkYXRpbmcsIG5leHQuZ2V0RnVsbFBhdGgoKSk7Ci0JCQkJCQkJcmVzdWx0LmFkZChuZXcgU3RhdHVzKDEgPDwgKElSZXNvdXJjZVN0YXR1cy5GQUlMRURfU0VUVElOR19DSEFSU0VUICUgMTAwIC8gMzMpLCBSZXNvdXJjZXNQbHVnaW4uUElfUkVTT1VSQ0VTLCBJUmVzb3VyY2VTdGF0dXMuRkFJTEVEX1NFVFRJTkdfQ0hBUlNFVCwgZGV0YWlsTWVzc2FnZSwgZSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCQljYXRjaCAoT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotCQkJCQl0aHJvdyBlOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iI3Nob3VsZFJ1bigpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG91bGRSdW4oKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKGFzeW5jQ2hhbmdlcykgewotCQkJCXJldHVybiAhYXN5bmNDaGFuZ2VzLmlzRW1wdHkoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIFJlc291cmNlQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciB7Ci0JCXByaXZhdGUgdm9pZCBwcm9jZXNzRW50cnlDaGFuZ2VzKElSZXNvdXJjZURlbHRhIHByb2plY3REZWx0YSwgU2V0IHByb2plY3RzVG9TYXZlKSB7Ci0JCQkvLyBjaGVjayBlYWNoIHJlc291cmNlIHdpdGggd2ViIGNvbnRlbnQgc2V0dGluZyB0byBzZWUgaWYgaXQgaGFzCi0JCQkvLyBiZWVuIG1vdmVkL2RlbGV0ZWQKLQkJCWJvb2xlYW4gcmVzb3VyY2VDaGFuZ2VzID0gZmFsc2U7Ci0KLQkJCS8vIHByb2plY3QgYWZmZWN0ZWQKLQkJCUlQcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gKElQcm9qZWN0KSBwcm9qZWN0RGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCQkJcmVzb3VyY2VDaGFuZ2VzID0gcHJvY2Vzc1ByZWZlcmVuY2VzKGN1cnJlbnRQcm9qZWN0LCBIVE1MQ29udGVudFByb3BlcnRpZXMuRE9DVU1FTlRfVFlQRSwgcHJvamVjdERlbHRhLCBwcm9qZWN0c1RvU2F2ZSk7Ci0KLQkJCS8vIGlmIHRoZXJlIHdhcyBhIHByZWZlcmVuY2Uga2V5IGNoYW5nZSwgbmVlZCB0byBzYXZlIHByZWZlcmVuY2VzCi0JCQlpZiAocmVzb3VyY2VDaGFuZ2VzKQotCQkJCXByb2plY3RzVG9TYXZlLmFkZChjdXJyZW50UHJvamVjdCk7Ci0JCX0KLQotCQkvKioKLQkJICogR29lcyB0aHJvdWdoIGFsbCB0aGUgcmVzb3VyY2UtZGVwZW5kZW50IHByZWZlcmVuY2VzIGFzc29jaWF0ZWQgd2l0aAotCQkgKiBjdXJyZW50UHJvamVjdCAmIGtleSBhbmQgdXBkYXRlcyB0aGUgcHJlZmVyZW5jZSBrZXlzIGlmIG5lZWRlZAotCQkgKiBiYXNlZCBvbiBwcm9qZWN0RGVsdGEKLQkJICogCi0JCSAqIEBwYXJhbSBjdXJyZW50UHJvamVjdAotCQkgKiAgICAgICAgICAgIGN1cnJlbnQgcHJvamVjdCBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkIGF0Ci0JCSAqIEBwYXJhbSBrZXkKLQkJICogICAgICAgICAgICBjdXJyZW50IGtleS9zdWJjYXRlZ29yeSBvZiB0aGUgcHJlZmVyZW5jZXMgdG8gYmUgbG9va2VkCi0JCSAqICAgICAgICAgICAgYXQKLQkJICogQHBhcmFtIHByb2plY3REZWx0YQotCQkgKiAgICAgICAgICAgIHRoZSBjaGFuZ2VzIHRvIHByb2Nlc3MgdGhlIHByZWZlcmVuY2Uga2V5cyBhZ2FpbnN0Ci0JCSAqIEBwYXJhbSBwcm9qZWN0c1RvU2F2ZQotCQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0cyB0aGF0IG5lZWQgdG8gYmUgdXBkYXRlZC9zYXZlZAotCQkgKiBAcmV0dXJuIHRydWUgaWYgY3VycmVudFByb2plY3QncyBwcmVmZXJlbmNlcyB3ZXJlIG1vZGlmaWVkCi0JCSAqLwotCQlwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc1ByZWZlcmVuY2VzKElQcm9qZWN0IGN1cnJlbnRQcm9qZWN0LCBTdHJpbmcga2V5LCBJUmVzb3VyY2VEZWx0YSBwcm9qZWN0RGVsdGEsIFNldCBwcm9qZWN0c1RvU2F2ZSkgewotCQkJYm9vbGVhbiByZXNvdXJjZUNoYW5nZXMgPSBmYWxzZTsKLQotCQkJLy8gZ2V0IHRoZSBwcm9qZWN0LWtleSBwcmVmZXJlbmNlIG5vZGUKLQkJCVByZWZlcmVuY2VzIHByb2plY3RQcmVmcyA9IEhUTUxDb250ZW50UHJvcGVydGllcy5nZXRQcmVmZXJlbmNlcyhjdXJyZW50UHJvamVjdCwga2V5LCBmYWxzZSk7Ci0JCQlpZiAocHJvamVjdFByZWZzID09IG51bGwpCi0JCQkJLy8gbm8gcHJlZmVyZW5jZXMgZm9yIHRoaXMgcHJvamVjdC1rZXksIGp1c3QgYmFpbAotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZ1tdIGFmZmVjdGVkUmVzb3VyY2VzOwotCQkJdHJ5IHsKLQkJCQlhZmZlY3RlZFJlc291cmNlcyA9IHByb2plY3RQcmVmcy5rZXlzKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBwcm9ibGVtcyB3aXRoIHRoZSBwcm9qZWN0IHNjb3BlLi4uIHdlIGdvbm5hIG1pc3MgdGhlCi0JCQkJLy8gY2hhbmdlcyAoYnV0IHdpbGwgbG9nKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJQcm9ibGVtIHJldHJlaXZpbmcgSlNQIEZyYWdtZW50IHByZWZlcmVuY2VzIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0KLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBwcmVmZXJlbmNlIGtleSAod2hpY2ggaXMgcmVhbGx5IGEgZmlsZSBuYW1lKQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhZmZlY3RlZFJlc291cmNlcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIHNlZSBpZiBwcmVmZXJlbmNlIGtleS9maWxlIG5hbWUgd2FzIGZpbGUgdGhhdCB3YXMgY2hhbmdlZAotCQkJCUlSZXNvdXJjZURlbHRhIG1lbWJlckRlbHRhID0gcHJvamVjdERlbHRhLmZpbmRNZW1iZXIobmV3IFBhdGgoYWZmZWN0ZWRSZXNvdXJjZXNbaV0pKTsKLQkJCQkvLyBubyBjaGFuZ2VzIGZvciB0aGUgZ2l2ZW4gcmVzb3VyY2UKLQkJCQlpZiAobWVtYmVyRGVsdGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKG1lbWJlckRlbHRhLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5SRU1PVkVEKSB7Ci0JCQkJCXJlc291cmNlQ2hhbmdlcyA9IHRydWU7Ci0JCQkJCS8vIHJlbW92ZSB0aGUgc2V0dGluZyBmb3IgdGhlIG9yaWdpbmFsIGxvY2F0aW9uCi0JCQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSBwcm9qZWN0UHJlZnMuZ2V0KGFmZmVjdGVkUmVzb3VyY2VzW2ldLCBudWxsKTsKLQkJCQkJcHJvamVjdFByZWZzLnJlbW92ZShhZmZlY3RlZFJlc291cmNlc1tpXSk7Ci0JCQkJCWlmICgobWVtYmVyRGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX1RPKSAhPSAwKSB7Ci0JCQkJCQkvLyBpZiBtb3ZpbmcsIGNvcHkgdGhlIHNldHRpbmcgZm9yIHRoZSBuZXcgbG9jYXRpb24KLQkJCQkJCUlQcm9qZWN0IHRhcmdldFByb2plY3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QobWVtYmVyRGVsdGEuZ2V0TW92ZWRUb1BhdGgoKS5zZWdtZW50KDApKTsKLQkJCQkJCVByZWZlcmVuY2VzIHRhcmdldFByZWZzID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByZWZlcmVuY2VzKHRhcmdldFByb2plY3QsIGtleSwgdHJ1ZSk7Ci0JCQkJCQl0YXJnZXRQcmVmcy5wdXQoSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldEtleUZvcihtZW1iZXJEZWx0YS5nZXRNb3ZlZFRvUGF0aCgpKSwgY3VycmVudFZhbHVlKTsKLQkJCQkJCWlmICh0YXJnZXRQcm9qZWN0ICE9IGN1cnJlbnRQcm9qZWN0KQotCQkJCQkJCXByb2plY3RzVG9TYXZlLmFkZCh0YXJnZXRQcm9qZWN0KTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiByZXNvdXJjZUNoYW5nZXM7Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIGFueSBjaGFuZ2UgdG8gdGhlIGVuY29kaW5nIGZpbGUgb3IgYW55IHJlc291cmNlIHdpdGggZW5jb2RpbmcKLQkJICogc2V0LCBqdXN0IGRpc2NhcmQgdGhlIGNhY2hlIGZvciB0aGUgY29ycmVzcG9uZGluZyBwcm9qZWN0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJUmVzb3VyY2VEZWx0YVtdIHByb2plY3REZWx0YXMgPSBkZWx0YS5nZXRBZmZlY3RlZENoaWxkcmVuKCk7Ci0JCQkvLyBwcm9jZXNzIGVhY2ggcHJvamVjdCBpbiB0aGUgZGVsdGEKLQkJCVNldCBwcm9qZWN0c1RvU2F2ZSA9IG5ldyBIYXNoU2V0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHByb2plY3REZWx0YXMubGVuZ3RoOyBpKyspCi0JCQkJLy8gbm90aGluZyB0byBkbyBpZiBhIHByb2plY3QgaGFzIGJlZW4gYWRkZWQvcmVtb3ZlZC9tb3ZlZAotCQkJCWlmIChwcm9qZWN0RGVsdGFzW2ldLmdldEtpbmQoKSA9PSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEICYmIChwcm9qZWN0RGVsdGFzW2ldLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5PUEVOKSA9PSAwKQotCQkJCQlwcm9jZXNzRW50cnlDaGFuZ2VzKHByb2plY3REZWx0YXNbaV0sIHByb2plY3RzVG9TYXZlKTsKLQkJCWZKb2IuYWRkQ2hhbmdlcyhwcm9qZWN0c1RvU2F2ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyB2b2lkIHN0YXJ0dXAoKSB7Ci0JCV9pbnN0YW5jZSA9IG5ldyBIVE1MQ29udGVudFByb3BlcnRpZXNNYW5hZ2VyKCk7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5hZGRSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKF9pbnN0YW5jZS5mUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKF9pbnN0YW5jZS5mUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcik7Ci0JCV9pbnN0YW5jZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0Fic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZiNmJjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0KLQlwcm90ZWN0ZWQgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmSGVhZGVyUGFyc2VkOwotCi0JcHJvdGVjdGVkIFJlYWRlciBmUmVhZGVyOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldEphdmFDaGFyc2V0TmFtZShnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpKTsKLQkJZkVuY29kaW5nTWVtZW50by5zZXREZXRlY3RlZENoYXJzZXROYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyBUT0RPOiBpZiBkZXRlY3RlZENoYXJzZXQgYW5kIHNwZWMgZGVmYXVsdCBpcwotCQkvLyBudWxsLCBuZWVkIHRvIHVzZSAid29yawotCQkvLyBiZW5jaCBiYXNlZCIgZGVmYXVsdHMuCi0JCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqIAotCSAqIEBwYXJhbSBkZXRlY3RlZENoYXJzZXROYW1lCi0JICogQHBhcmFtIHJlYXNvbgotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbikgewotCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JfQotCi0JLyoqCi0JICogY29udmllbmNlIG1ldGhvZCBhbGwgc3ViY2xhc3NlcyBjYW4gdXNlIChidXQgbm90IG92ZXJyaWRlKQotCSAqLwotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGVuc3VyZUlucHV0U2V0KCkgewotCQlpZiAoZlJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJLy8gMS4gQ2hlY2sgZXhwbGljaXQgbWFwcGluZyBvdmVycmlkZXMgZnJvbQotCQkvLyBwcm9wZXJ0eSBmaWxlIC0tIGl0cyBoZXJlIHdlIHBpY2sgdXAgInJ1bGVzIiBmb3IgY2FzZXMKLQkJLy8gdGhhdCBhcmUgbm90IGV2ZW4gaW4gSmF2YQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphdmFDaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8gb25seSBzZXQgaW52YWxpZCwgaWYgcmVzdWx0IGlzIHNhbWUgYXMgZGV0ZWN0ZWQgLS0gdGhleSB3b24ndAotCQkJLy8gYmUgZXF1YWwgaWYKLQkJCS8vIG92ZXJyaWRkZW4KLQkJCWlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQuZXF1YWxzKGRldGVjdGVkQ2hhcnNldE5hbWUpKSB7Ci0JCQkJZkVuY29kaW5nTWVtZW50by5zZXRJbnZhbGlkRW5jb2RpbmcoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfQotCQkvLyBnaXZlIHByaW9yaXR5IHRvIGphdmEgY29ub25pY2FsIG5hbWUsIGlmIHByZXNlbnQKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJCS8vIGJ1dCBzdGlsbCBhbGxvdyBvdmVycmlkZXMKLQkJCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKHJlc3VsdCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldEVuY29kaW5nTWVtZW50bygpLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQl9Ci0KLQkvLyB0byBlbnN1cmUgY29uc2lzdCBvdmVyYWxsIHJ1bGVzIHVzZWQsIHdlJ2xsIG1hcmsgYXMKLQkvLyBmaW5hbCwKLQkvLyBhbmQgcmVxdWlyZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgY2VydGFpbiBwaWVjZXMgb2YKLQkvLyB0aGUKLQkvLyBpbXBsZW1lbnRhdGlvbgotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZW5zdXJlSW5wdXRTZXQoKTsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQlwYXJzZUlucHV0KCk7Ci0JCQkvLyB3ZSBrZWVwIHRyYWNrIG9mIGlmIGhlYWRlcidzIGFscmVhZHkgYmVlbgotCQkJLy8gcGFyc2UsIHNvIGNhbiBtYWtlCi0JCQkvLyBtdWx0aXBsZSAnZ2V0JyBjYWxscywgd2l0aG91dCBjYXVzaW5nCi0JCQkvLyByZXBhcnNpbmcuCi0JCQlmSGVhZGVyUGFyc2VkID0gdHJ1ZTsKLQkJCS8vIE5vdGU6IHRoZXJlIGlzIGEgImhpZGRlbiBhc3N1bXB0aW9uIiBoZXJlCi0JCQkvLyB0aGF0IGFuIGVtcHR5Ci0JCQkvLyBzdHJpbmcgaW4gY29udGVudCBzaG91bGQgYmUgdHJlYXRlZCBzYW1lIGFzCi0JCQkvLyBub3QgcHJlc2VudC4KLQkJfQotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQloYW5kbGVTcGVjRGVmYXVsdCgpOwotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCS8vIHNhZnR5IG5ldAotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBOdWxsTWVtZW50bygpOwotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdG8gcmV0dXJuIGEgZGVmYXVsdCBlbmNvZGluZyAtLSBhcyBzcGVjaWZpZWQgYnkgYW4gaW5kdXN0cnkKLQkgKiBjb250ZW50IHR5cGUgc3BlYyAtLSB3aGVuIG5vdCBwcmVzZW50IGluIHRoZSBzdHJlYW0sIGZvciBleGFtcGxlLCBYTUwKLQkgKiBzcGVjaWZpZXMgVVRGLTgsIEpTUCBzcGVjaWZpZXMgSVNPLTg4NTktMS4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybgotCSAqIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCAic3BlYyBkZWZhdWx0Ii4KLQkgKi8KLQlhYnN0cmFjdCBwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgZW5jID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERUZBVUxUU19BU1NVTUVEX0ZPUl9FTVBUWV9JTlBVVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmMpOwotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTcGVjRGVmYXVsdCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nTmFtZTsKLQkJZW5jb2RpbmdOYW1lID0gZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jb2RpbmdOYW1lICE9IG51bGwpIHsKLQkJCS8vIGNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmNvZGluZ05hbWUsCi0JCQkvLyBFbmNvZGluZ01lbWVudG8uVVNFRF9DT05URU5UX1RZUEVfREVGQVVMVCk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRKYXZhQ2hhcnNldE5hbWUoZW5jb2RpbmdOYW1lKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuY29kaW5nTmFtZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBFdmVyeSBzdWJjbGFzcyBtdXN0IHByb3ZpZGUgYSB3YXkgdG8gcGFyc2UgdGhlIGlucHV0LiBUaGlzIG1ldGhvZCBoYXMKLQkgKiBzZXZlcmFsIGNyaXRpY2FsIHJlc3BvbnNpYmlsaXRpZXM6Ci0JICogPGxpPnNldCB0aGUgZkVuY29kaW5nTWVtZW50byBmaWVsZCBhcHByb3ByaWF0ZWx5LCBhY2NvcmRpbmcgdG8gdGhlCi0JICogcmVzdWx0cyBvZiB0aGUgcGFyc2Ugb2YgZlJlYWRlci48L2xpPgotCSAqIDxsaT5zZXQgZkhhcmRlclBhcnNlZCB0byB0cnVlLCB0byBhdm9pZCB3YXN0ZWQgcmUtcGFyc2luZy48L2xpPgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0JCWZSZWFkZXIgPSBudWxsOwotCQlmSGVhZGVyUGFyc2VkID0gZmFsc2U7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gbmV3IEJ5dGVSZWFkZXIoaW5wdXRTdHJlYW0pOwotCQl0cnkgewotCQkJZlJlYWRlci5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlcgotCQkJLy8gc3VwcG9ydHMgbWFya2luZwotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmNhNTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci0KLS8qKgotICogVGhpcyBpcyBhbiAiYWRhcHRlciIgY2xhc3MsIHNpbXBseSB0byBnZXQgaW4gaW5wdXQgc3RyZWFtIHRvIGFjdCBsaWtlIGEKLSAqIHJlYWRlci4gV2UgY291bGQgbm90IHVzZSBJbnB1dFN0cmVhbVJlYWRlciBkaXJlY3RseSBiZWNhdXNlIGl0cyBpbnRlcm5hbAotICogYnVmZmVycyBhcmUgbm90IGNvbnRyb2xsYWJsZSwgYW5kIGl0IHNvbWV0aW1lcyBwdWxscyB0b28gbXVjaCBvdXQgb2YgaW5wdXQKLSAqIHN0cmVhbSAoZXZlbiB3aGVuIGl0IHdhc24ndCBuZWVkZWQgZm9yIG91ciBwdXJwb3NlcykuCi0gKiAKLSAqIFRoZSB1c2Ugb2YgdGhpcyBjbGFzcyBpcyBoaWdobHkgc3BlY2lhbGl6ZWQgYW5kIGJ5IG5vdCBtZWFucyBtZWFudCB0byBiZQotICogZ2VuZXJhbCBwdXJwb3NlLiBJdHMgdXNlIGlzIHJlc3RyaWN0ZWQgdG8gdGhvc2UgY2FzZXMgd2hlcmUgdGhlIGlucHV0Ci0gKiBzdHJlYW0gY2FuIGJlIHJlZ2FyZGVkIGFzIGFzY2lpIGp1c3QgbG9uZyBlbm91Z2ggdG8gZGV0ZXJtaW5lIHdoYXQgdGhlIHJlYWwKLSAqIGVuY29kaW5nIHNob3VsZCBiZS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgQnl0ZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gQ29kZWRJTy5NQVhfQlVGX1NJWkU7Ci0KLQlwcm90ZWN0ZWQgYnl0ZVtdIGZCdWZmZXI7Ci0KLQlwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHJvdGVjdGVkIEJ5dGVSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEJ5dGVSZWFkZXIoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdGhpcyhpbnB1dFN0cmVhbSwgREVGQVVMVF9CVUZGRVJfU0laRSk7Ci0JCWlmICghaW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCeXRlUmVhZGVyIGlzIHJlcXVpcmVkIHRvIGhhdmUgYSByZXNldHRhYmxlIHN0cmVhbSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgaW50IHNpemUpIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQl0aGlzLmZCdWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYXJrKGludCByZWFkQWhlYWRMaW1pdCkgewotCQl0aGlzLmZJbnB1dFN0cmVhbS5tYXJrKHJlYWRBaGVhZExpbWl0KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgYjAgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCXJldHVybiAoYjAgJiAweDAwRkYpOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNoW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChsZW5ndGggPiB0aGlzLmZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSB0aGlzLmZCdWZmZXIubGVuZ3RoOwotCQl9Ci0KLQkJaW50IGNvdW50ID0gdGhpcy5mSW5wdXRTdHJlYW0ucmVhZCh0aGlzLmZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSB0aGlzLmZCdWZmZXJbaV07Ci0JCQkvLyB0aGUgMHgwMEZGIGlzIHRvICJsb3NlIiB0aGUgbmVnYXRpdmUgYml0cyBmaWxsZWQgaW4gdGhlIGJ5dGUgdG8KLQkJCS8vIGludCBjb252ZXJzaW9uCi0JCQkvLyAoYW5kIHdoaWNoIHdvdWxkIGJlIHRoZXJlIGlmIGNhc3QgZGlyZWN0bHkgZnJvbSBieXRlIHRvIGNoYXIpLgotCQkJY2hhciBjMCA9IChjaGFyKSAoYjAgJiAweDAwRkYpOwotCQkJY2hbb2Zmc2V0ICsgaV0gPSBjMDsKLQkJfQotCQlyZXR1cm4gY291bnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkgPiAwOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuZklucHV0U3RyZWFtLnNraXAobik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQ29udGVudERlc2NyaWJlckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Njg5N2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9ySFRNTCBpbXBsZW1lbnRzIElUZXh0Q29udGVudERlc2NyaWJlciB7Ci0KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JcHJpdmF0ZSBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgcmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmVzdWx0ID0gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY29tcHV0ZVZhbGlkaXR5KGNvbnRlbnRzKTsKLQkJfQotCQllbHNlIHsKLQkJCWNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJCS8vIGFzc3VtbW1pbmcgd2Ugc2hvdWxkIHJldHVybiBzYW1lICd2YWxpZGl0eScgdmFsdWUgd2UgZGlkCi0JCQkvLyB3aGVuIGNhbGxlZCBiZWZvcmUuICh0ZWNobmljYWxseSwgY291bGQgYmUgYSBwZXJmb3JtYW5jZSBpc3N1ZQotCQkJLy8gaW4gZnV0dXJlLCBzbyBtaWdodCB3YW50IHRvIGNoZWNrIGlmIGFueSAnb2wgdmFsdWUgd291bGQKLQkJCS8vIGJlIG9rIGhlcmUuCi0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLklOREVURVJNSU5BVEU7Ci0KLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNvbXB1dGVWYWxpZGl0eShjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGNvbnRlbnRzLCBkZXNjcmlwdGlvbik7Ci0JCQkvLyBhc3N1bW1taW5nIHdlIHNob3VsZCByZXR1cm4gc2FtZSAndmFsaWRpdHknIHZhbHVlIHdlIGRpZAotCQkJLy8gd2hlbiBjYWxsZWQgYmVmb3JlLiAodGVjaG5pY2FsbHksIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2UgaXNzdWUKLQkJCS8vIGluIGZ1dHVyZSwgc28gbWlnaHQgd2FudCB0byBjaGVjayBpZiBoYXJkIGNvZGVkICd2YWxpZCcgd291bGQKLQkJCS8vIGJlIG9rIGhlcmUuCi0JCQlyZXN1bHQgPSBjb21wdXRlVmFsaWRpdHkoY29udGVudHMpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgUXVhbGlmaWVkTmFtZVtdIGdldFN1cHBvcnRlZE9wdGlvbnMoKSB7Ci0KLQkJcmV0dXJuIFNVUFBPUlRFRF9PUFRJT05TOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudHMKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNhbGN1bGF0ZVN1cHBvcnRlZE9wdGlvbnMoUmVhZGVyIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQlkZXRlY3Rvci5zZXQoY29udGVudHMpOwotCQkJaGFuZGxlQ2FsY3VsYXRpb25zKGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlVmFsaWRpdHkoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJLy8gY3VycmVudGx5IG5vIGNvbnRlbnRzIHNwZWNpZmljIGNoZWNrIGZvciB2YWxpZCBIVE1MIGNvbnRlbnRzCi0JCS8vICh0aGlzIG1heSBjaGFuZ2Ugb25jZSB3ZSBhZGQgWEhUTUwgY29udGVudCB0eXBlKQotCQlyZXR1cm4gSUNvbnRlbnREZXNjcmliZXIuSU5ERVRFUk1JTkFURTsKLQl9Ci0KLQlwcml2YXRlIGludCBjb21wdXRlVmFsaWRpdHkoUmVhZGVyIHJlYWRlcikgewotCQkvLyBjdXJyZW50bHkgbm8gY29udGVudHMgc3BlY2lmaWMgY2hlY2sgZm9yIHZhbGlkIEhUTUwgY29udGVudHMKLQkJLy8gKHRoaXMgbWF5IGNoYW5nZSBvbmNlIHdlIGFkZCBYSFRNTCBjb250ZW50IHR5cGUpCi0JCXJldHVybiBJQ29udGVudERlc2NyaWJlci5JTkRFVEVSTUlOQVRFOwotCX0KLQotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQlpZiAocmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJcmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgPSBuZXcgSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNhbGN1bGF0aW9ucyhJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGU6IGlmIHdlJ3JlIGFza2VkIGZvciBvbmUsIHdlIHNldCB0aGVtIGFsbC4gSSBuZWVkIHRvIGJlIHN1cmUgaWYKLQkJLy8gY2FsbGVkCi0JCS8vIG11bGl0aXBsZSB0aW1lcyAob25lIGZvciBlYWNoLCBzYXkpIHRoYXQgd2UgZG9uJ3Qgd2FzdGUgdGltZQotCQkvLyBwcm9jZXNzaW5nIHNhbWUKLQkJLy8gY29udGVudCBhZ2Fpbi4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3IpLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCS8vIGJ5IHRleHQgdHlwZS4KLQkJT2JqZWN0IGRldGVjdGVkQnl0ZU9yZGVyTWFyayA9IGVuY29kaW5nTWVtZW50by5nZXRVbmljb2RlQk9NKCk7Ci0JCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQnl0ZU9yZGVyTWFyayA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLKTsKLQkJCS8vIG5vdCBzdXJlIHdoeSB3b3VsZCBldmVyIGJlIGRpZmZlcmVudCwgc28gaWYgaXMgZGlmZmVyZW50LCBtYXkKLQkJCS8vIG5lZWQgdG8gInB1c2giIHVwIGludG8gYmFzZS4KLQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQllURV9PUkRFUl9NQVJLLCBkZXRlY3RlZEJ5dGVPcmRlck1hcmspOwotCQl9Ci0KLQotCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCS8vIG5vdGU6IGFmdGVyIHNldHRpbmcgaGVyZSwgaXRzIHRoZSBtZXJlIHByZXNlbmNlIG9mCi0JCQkvLyBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVAotCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYKLQkJCS8vIGludmFsaWQKLQkJCS8vIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucyBhbgotCQkJLy8gImFwcHJvcHJpYXRlIGRlZmF1bHQiIHRvIHVzZS4KLQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBlbmNvZGluZ01lbWVudG8uZ2V0SW52YWxpZEVuY29kaW5nKCkpOwotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCX0KLQotCQlPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKTsKLQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCS8vIHdlIGFsd2F5cyBpbmNsdWRlIGRldGVjdGVkLCBpZiBpdHMgZGlmZmVyZW50IHRoYW4gamF2YQotCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJT2JqZWN0IGV4aXN0aW5nQ2hhcnNldCA9IGRlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCk7Ci0JCQlpZiAoamF2YUNoYXJzZXQuZXF1YWxzKGV4aXN0aW5nQ2hhcnNldCkpIHsKLQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCS8vIGlmIGRpZmZlcmVudCBmcm9tIGRlZmF1bHQudGhlCi0JCQkJT2JqZWN0IGRlZmF1bHRDaGFyc2V0ID0gZ2V0RGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFkZWZhdWx0Q2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMgbmVlZCB0bwotCQkJCQkvLyBhZGQsIEknbSBhc3N1bWluZwotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBhdm9pZCBhZGRpbmcgYW55dGhpbmcgaWYgbm90IGFic29sdXRseSBuZWVkZWQsIHNpbmNlIGFsd2F5cwotCQkvLyAiY2FjaGVkIiBwZXIgc2Vzc2lvbgotCQkvLyBkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTywKLQkJLy8gZW5jb2RpbmdNZW1lbnRvKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBpZiAoIWRldGVjdGVkQ2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkvLyBkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwKLQkJCS8vIGRldGVjdGVkQ2hhcnNldCk7Ci0JCQkvLyB9Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJLy8gZWxzZSBpZgotCQkvLyAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkVOQ09ESU5HX01FTUVOVE8pKQotCQkvLyByZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9FbmNvZGluZ0d1ZXNzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU3ZjNhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdHdWVzc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIAotICogVGhpcyBpcyBwb3J0ZWQgZnJvbSBQYWdlRGVzaWduZXIncyBocGJjb20vS2FuamkuY3BwJ3MKLSAqIEthbmppOjpndWVzc19rYW5qaV9jb2RlKCksCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ0d1ZXNzZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0NJSSA9IDA7IC8vIEFTQ0lJCi0JLy8gSVNPLTIwMjItSlAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNDSUlfSU4gPSA4OyAvLyBUaGlzIGlzIGFmdGVyIElTTzIwMjIncyBjaGFuZ2UKLQkvLyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVVDX0hBTEZLQU5BID0gNjsgLy8gVGhpcyBpcyBIYWxmIEthbmEgaW4gRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVVQ19KUCA9IDM7IC8vIFRoaXMgaXMgRVVDLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElTTzIwMjJfSlAgPSA0OyAvLyBUaGlzIGlzIElTTy0yMDIyLUpQCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEpJU19IQUxGS0FOQSA9IDc7IC8vIFRIaXMgaXMgSGFsZiBLYW5hIGluCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9FVUMxID0gMHg0MDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0VVQzIgPSAoYnl0ZSkgMHg4MDsKLQkvLyBBU0NJSQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfSklOID0gMHgwMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pPVVQgPSAweDAyOwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUgS1RfRVNDID0gMHgwNDsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX0pJUyA9IDB4MDg7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZSBLVF9TRlQxID0gMHgxMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIEtUX1NGVDIgPSAweDIwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGUga3R5cGVbXSA9IHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAvKiAwMCAqLwotCTB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIC8qIDEwICovCi0JMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOSwgMHgwOCwgMHgwOCwgMHgwOCwgLyogISIjJCUmJyAqLy8qICIgKi8KLQkweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAweDA4LCAvKiAoKSorLC0uLyAqLwotCTB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIC8qIDAxMjM0NTY3ICovCi0JMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgLyogODk6OyA8PT4/ICovCi0JMHgyOSwgMHgyOCwgMHgyYiwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogQEFCQ0RFRkcgKi8KLQkweDJhLCAweDI4LCAweDJhLCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBISUpLTE1OTyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIC8qIFBRUlNUVVZXICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogWFlaW1xdXl8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBhYmNkZWZnICovCi0JMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgMHgyOCwgLyogaGlqa2xtbm8gKi8KLQkweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAweDI4LCAvKiBwcXJzdHV2dyAqLwotCTB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MjgsIDB4MDAsIC8qIHh5ent8fX4gKi8KLQkweDIwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAweDMwLCAvKiA4MCAqLwotCTB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIDB4MzAsIC8qIDkwICovCi0JMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgzMCwgMHgyMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEEwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEIwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEMwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIC8qIEQwICovCi0JKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhlMCwgKGJ5dGUpIDB4ZTAsIChieXRlKSAweGUwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEUwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIC8qIEYwICovCi0JKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhmMCwgKGJ5dGUpIDB4ZjAsIChieXRlKSAweGYwLCAoYnl0ZSkgMHhjMCwgKGJ5dGUpIDB4YzAsIDB4MDAsfTsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVNPODg1OV8xID0gMTsgLy8gSVNPLTEKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hJRlRfSklTID0gMjsgLy8gVGhpcyBpcyBTaGlmdC1KSVMKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0pJU19IQUxGS0FOQSA9IDU7IC8vIFRoaXMgaXMgSGFsZiBLYW5hIGluCi0KLQkvKioKLQkgKiBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgZW5jb2RpbmdzIGFyZSBzdXBwb3J0ZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOS05PV04gPSAtMTsgLy8gVW5rbm93bgotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGNvZGUKLQkgKiAgICAgICAgICAgIGludAotCSAqIAotCSAqIENvbnZlcnQgcHJpdmF0ZSBpbnQgdG8gSUFOQSBFbmNvZGluZyBuYW1lLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9JQU5BRW5jb2RpbmdOYW1lKGludCBjb2RlKSB7Ci0JCVN0cmluZyBlbmNvZGluZyA9IG51bGw7Ci0KLQkJc3dpdGNoIChjb2RlKSB7Ci0JCQljYXNlIFNISUZUX0pJUyA6Ci0JCQljYXNlIFNKSVNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIlNoaWZ0X0pJUyI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBFVUNfSlAgOgotCQkJY2FzZSBFVUNfSEFMRktBTkEgOgotCQkJCWVuY29kaW5nID0gIkVVQy1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBJU08yMDIyX0pQIDoKLQkJCWNhc2UgSklTX0hBTEZLQU5BIDoKLQkJCQllbmNvZGluZyA9ICJJU08tMjAyMi1KUCI7Ly8kTk9OLU5MUy0xJAotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQotCQlyZXR1cm4gZW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGd1ZXNzZWQgSmF2YSBFbmNvZGluZyBuYW1lIHRhcmdldDogYnl0ZXMgdG8gYmUgaW5zcGVjdGVkIGxlbmd0aDoKLQkgKiBsZW5ndGggb2YgdGFyZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ3Vlc3NFbmNvZGluZyhieXRlW10gdGFyZ2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWludCBjb2RlID0gVU5LTk9XTjsKLQotCQkvLyBDdXJyZW50bHksIG9ubHkgSmFwYW5lc2UgaXMgc3VwcG9ydGVkLgotCQlTdHJpbmcgc3lzdGVtX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5nZXREZWZhdWx0KCkuZ2V0TGFuZ3VhZ2UoKTsKLQkJU3RyaW5nIGpwX2N0eXBlID0gamF2YS51dGlsLkxvY2FsZS5KQVBBTkVTRS5nZXRMYW5ndWFnZSgpOwotCQlpZiAoc3lzdGVtX2N0eXBlLmNvbXBhcmVUbyhqcF9jdHlwZSkgPT0gMCkgewotCQkJLy8gT2ssIEknbSB1bmRlciBqYV9KUC4KLQkJCWNvZGUgPSBBU0NJSTsKLQkJCWludCBwb3MgPSAwOwotCQkJd2hpbGUgKChjb2RlID09IEFTQ0lJKSAmJiAobGVuZ3RoID4gMCkpIHsKLQkJCQlpbnQgY2gxID0gdGFyZ2V0W3Bvc107Ci0JCQkJY2gxID0gY2gxICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gyID0gKGxlbmd0aCA+PSAyKSA/IHRhcmdldFtwb3MgKyAxXSA6IDA7Ci0JCQkJY2gyID0gY2gyICYgMHgwMDAwMDBGRjsKLQkJCQlpbnQgY2gzID0gKGxlbmd0aCA+PSAzKSA/IHRhcmdldFtwb3MgKyAyXSA6IDA7Ci0JCQkJY2gzID0gY2gzICYgMHgwMDAwMDBGRjsKLQkJCQljb2RlID0gZ3Vlc3NKYXBhbmVzZUthbmppQ29kZShjaDEsIGNoMiwgY2gzLCAwKTsKLQkJCQlwb3MrKzsKLQkJCQlsZW5ndGgtLTsKLQkJCX0KLQkJCXN3aXRjaCAoY29kZSkgewotCQkJCWNhc2UgSVNPMjAyMl9KUCA6Ci0JCQkJY2FzZSBKSVNfSEFMRktBTkEgOgotCQkJCQljb2RlID0gSVNPMjAyMl9KUDsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBFVUNfSlAgOgotCQkJCQljb2RlID0gRVVDX0pQOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJY29kZSA9IFNISUZUX0pJUzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKGNvbnZlcnRUb0lBTkFFbmNvZGluZ05hbWUoY29kZSkpOwotCX0KLQotCS8qKgotCSAqIEd1ZXNzIHRoZSBlbmNvZGluZy4gaGFsZmthbmFfZmxhZyA9IDB4MDEgKCBkZXRlY3QgU0pJUyBoYWxmIGthbmEgKQotCSAqIGhhbGZrYW5hX2ZsYWcgPSAweDAyICggZGV0ZWN0IEVVQyBoYWxmIGthbmEgKQotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBndWVzc0phcGFuZXNlS2FuamlDb2RlKGludCBjaDEsIGludCBjaDIsIGludCBjaDMsIGludCBoYWxma2FuYV9mbGFnKSB7Ci0JCWJvb2xlYW4gc2ppc19oYW5rYWt1X2ZsYWcgPSAoKGhhbGZrYW5hX2ZsYWcgJiAweDAxKSAhPSAwKSA/IHRydWUgOiBmYWxzZTsKLQkJYm9vbGVhbiBldWNfaGFua2FrdV9mbGFnID0gKChoYWxma2FuYV9mbGFnICYgMHgwMikgIT0gMCkgPyB0cnVlIDogZmFsc2U7Ci0KLQkJaWYgKGNoMSA9PSAwKQotCQkJcmV0dXJuIFVOS05PV047Ci0JCWlmIChzamlzX2hhbmtha3VfZmxhZyAmJiBjaDEgPj0gMHhhMSAmJiBjaDEgPD0gMHhkZikKLQkJCXJldHVybiBTSklTX0hBTEZLQU5BOwotCQllbHNlIGlmIChldWNfaGFua2FrdV9mbGFnICYmIGNoMSA9PSAweDhlICYmIGNoMiA+PSAweGExICYmIGNoMiA8PSAweGRmKQotCQkJcmV0dXJuIEVVQ19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoKChrdHlwZVtjaDFdICYgS1RfU0ZUMSkgIT0gMCkgJiYgKChrdHlwZVtjaDJdICYgS1RfU0ZUMikgIT0gMCkpCi0JCQlyZXR1cm4gU0hJRlRfSklTOwotCQllbHNlIGlmICgoKGt0eXBlW2NoMV0gJiBLVF9FVUMxKSAhPSAwKSAmJiAoKGt0eXBlW2NoMl0gJiBLVF9FVUMyKSAhPSAwKSkKLQkJCXJldHVybiBFVUNfSlA7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmICgoa3R5cGVbY2gyXSAmIEtUX0pJTikgIT0gMCkpCi0JCQlyZXR1cm4gSVNPMjAyMl9KUDsKLQkJZWxzZSBpZiAoY2gxID49IDB4YTEgJiYgY2gxIDw9IDB4ZGYpCi0JCQlyZXR1cm4gU0pJU19IQUxGS0FOQTsKLQkJZWxzZSBpZiAoY2gxID09IDB4MWIgJiYgY2gyID09IDB4MjgvKiAnKCcgKi8mJiBjaDMgPT0gMHg0OS8qICdJJyAqLykKLQkJCXJldHVybiBKSVNfSEFMRktBTkE7Ci0JCWVsc2UgaWYgKGNoMSA9PSAweDFiICYmIGNoMiA9PSAweDI4LyogJygnICovJiYgKChrdHlwZVtjaDNdICYgS1RfSk9VVCkgIT0gMCkpCi0JCQlyZXR1cm4gQVNDSUlfSU47Ci0KLQkJcmV0dXJuIEFTQ0lJOwotCX0KLQotCXB1YmxpYyBFbmNvZGluZ0d1ZXNzZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2OGY2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS4yLjIgb24gMS8yNy8wNCA2OjQxIFBNICovCi0KLS8qbmxzWFhYKi8gIAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDEvMjcvMDQgNjo0MSBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qZmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MSGVhZFRva2VuaXplciB7Ci0KLQkvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0JLyoqIGxleGljYWwgc3RhdGVzICovCi0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVUQV9UQUcgPSA0OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0JZmluYWwgcHVibGljIHN0YXRpYyBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMjsKLQlmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDEwOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotCWZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLQotCS8qKgotCSAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0JICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotCSAqICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotCSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBZWV9MRVhTVEFURVtdID0gezAsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDd9OwotCi0JLyoqIAotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eWNtYXBfcGFja2VkID0gIlwxMVwwXDFcNlwxXDdcMlwwXDFcMTFcMjJcMFwxXDIyXDFcMFwxXDQwXDJcMCIgKyAiXDFcNDRcMVwwXDFcNDNcNVwwXDFcMzRcMVwwXDFcNDJcMTNcMFwxXDQ1XDFcMTIiICsgIlwxXDEwXDFcMzFcMVwxM1wxXDBcMVwyMVwxXDBcMVwyNFwxXDI2XDFcMTdcMVwwIiArICJcMVwzMFwxXDMyXDFcMjdcMlwwXDFcMTZcMVwxNVwxXDIzXDFcMjVcMVwzM1wxXDM1IiArICJcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0XDFcNDFcN1wwXDFcMjFcMVwwIiArICJcMVwyNFwxXDI2XDFcMTdcMVwwXDFcMzBcMVwzMlwxXDI3XDJcMFwxXDE2XDFcMTUiICsgIlwxXDIzXDFcMjVcMVwzM1wxXDM1XDJcMFwxXDIwXDFcMzZcMVwzN1wxXDBcMVwxNCIgKyAiXDFcNDFcMTAxXDBcMVw0XDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMCIgKyAiXDFcM1wxNlwwXDFcMVwxXDJcMTcwXDBcMVwyXHVmZTg3XDAiOwotCi0JLyoqIAotCSAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotCSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXJbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0JLyogZXJyb3IgY29kZXMgKi8KLQlmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotCWZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7Ci0JZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0JLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotCWZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyBZWV9FUlJPUl9NU0dbXSA9IHsiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLCAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLCAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsICJFcnJvcjogcHVzaGJhY2sgdmFsdWUgd2FzIHRvbyBsYXJnZSJ9OwotCi0JLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQlwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotCS8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLQkvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQlwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLQlwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQlwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLQlwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0JLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotCXByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkgZnJvbSBpbnB1dCAqLwotCXByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLQotCS8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQlwcml2YXRlIGludCB5eWNoYXI7Ci0KLQotCS8qKiAKLQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLQkvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotCXByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotCS8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLQlwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLQkvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCWJvb2xlYW4gZm91bmRDb250ZW50VHlwZVZhbHVlID0gZmFsc2U7Ci0KLQotCi0JcHVibGljIEhUTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KFJlYWRlciBpbikgewotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JCXl5X3JlYWRlciA9IGluOwotCi0JCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJeXlfc3RhdGUgPSAwOwotCi0JCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpIDApOwotCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLQkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0JCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQkJeXlfc3RhcnRSZWFkID0gMDsKLQotCQkvKiogCi0JCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkgKiBmcm9tIGlucHV0IAotCQkgKi8KLQkJeXlfZW5kUmVhZCA9IDA7Ci0KLQotCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQkJeXljaGFyID0gMDsKLQotCi0JCS8qKiAKLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgCi0JCSAqIG9mIGEgbGluZQotCQkgKi8KLQkJeXlfYXRCT0wgPSBmYWxzZTsKLQotCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCQlmU3RhdGVTdGFjay5jbGVhcigpOwotCi0JCWhhc01vcmUgPSB0cnVlOwotCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLQotCi0JfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLQkgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0JICoKLQkgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLQkgKi8KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLQkJdGhpcy55eV9yZWFkZXIgPSBpbjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0JICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0JICoKLQkgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotCSAqLwotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0JCXRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLQl9Ci0KLQkvKiogCi0JICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0JICoKLQkgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLQkgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotCSAqLwotCXByaXZhdGUgc3RhdGljIGNoYXJbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0JCWNoYXJbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLQkJaW50IGkgPSAwOyAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotCQlpbnQgaiA9IDA7IC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0JCXdoaWxlIChpIDwgMTc0KSB7Ci0JCQlpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0JCQljaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotCQkJZG8KLQkJCQltYXBbaisrXSA9IHZhbHVlOwotCQkJd2hpbGUgKC0tY291bnQgPiAwKTsKLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCi0JLyoqCi0JICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0JICoKLQkgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLQkgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLQkgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0JICovCi0JcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCQkvKiBzdGFuZGFyZCBjYXNlICovCi0JCWlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkKLQkJCXJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotCQkvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovCi0JCWlmICh5eV9hdEVPRikKLQkJCXJldHVybiBZWUVPRjsKLQotCQkvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotCQkvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotCQlpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfYnVmZmVyLCAwLCB5eV9lbmRSZWFkIC0geXlfc3RhcnRSZWFkKTsKLQotCQkJLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLQkJCXl5X2VuZFJlYWQgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfY3VycmVudFBvcyAtPSB5eV9zdGFydFJlYWQ7Ci0JCQl5eV9tYXJrZWRQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfcHVzaGJhY2tQb3MgLT0geXlfc3RhcnRSZWFkOwotCQkJeXlfc3RhcnRSZWFkID0gMDsKLQkJfQotCi0JCS8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLQkJaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJLyogaWYgbm90OiBibG93IGl0IHVwICovCi0JCQljaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyAqIDJdOwotCQkJU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0JCQl5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0JCX0KLQotCQkvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLQkJaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIHl5X2J1ZmZlci5sZW5ndGggLSB5eV9lbmRSZWFkKTsKLQotCQlpZiAobnVtUmVhZCA9PSAtMSkKLQkJCXJldHVybiBZWUVPRjsKLQotCQl5eV9lbmRSZWFkICs9IG51bVJlYWQ7Ci0KLQkJcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCX0KLQotCi0JLyoqCi0JICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXljbG9zZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJeXlfYXRFT0YgPSB0cnVlOyAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotCQl5eV9lbmRSZWFkID0geXlfc3RhcnRSZWFkOyAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCQl5eV9yZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0JCXJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotCX0KLQotCS8qKgotCSAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0JICoKLQkgKiBAcGFyYW0gbmV3U3RhdGUgdGhlIG5ldyBsZXhpY2FsIHN0YXRlCi0JICovCi0JZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotCX0KLQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLQkgKi8KLQlmaW5hbCBwdWJsaWMgU3RyaW5nIHl5dGV4dCgpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmcoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcyAtIHl5X3N0YXJ0UmVhZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotCSAqLwotCWZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0JCXJldHVybiB5eV9tYXJrZWRQb3MgLSB5eV9zdGFydFJlYWQ7Ci0JfQotCi0KLQkvKioKLQkgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLQkgKgotCSAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0JCXRyeSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotCQl9Ci0JCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0JCX0KLQotCQlTeXN0ZW0uZXhpdCgxKTsKLQl9Ci0KLQotCS8qKgotCSAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotCSAqCi0JICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZAotCSAqCi0JICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0JICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhCi0JICovCi0JcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotCQlpZiAobnVtYmVyID4geXlsZW5ndGgoKSkKLQkJCXl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotCQl5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotCX0KLQotCi0JLyoqCi0JICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0JICogd2hlbiB0aGUgZW5kIG9mIGZpbGUgaXMgcmVhY2hlZAotCSAqLwotCXByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0JCWlmICgheXlfZW9mX2RvbmUpIHsKLQkJCXl5X2VvZl9kb25lID0gdHJ1ZTsKLQkJCWhhc01vcmUgPSBmYWxzZTsKLQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotCSAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLQkgKgotCSAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotCSAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0JCWludCB5eV9pbnB1dDsKLQkJaW50IHl5X2FjdGlvbjsKLQotCi0JCXdoaWxlICh0cnVlKSB7Ci0KLQkJCXl5Y2hhciArPSB5eWxlbmd0aCgpOwotCi0JCQl5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MgLSAxXSA9PSAnXG4nOwotCQkJaWYgKCF5eV9hdEJPTCAmJiB5eV9idWZmZXJbeXlfbWFya2VkUG9zIC0gMV0gPT0gJ1xyJykgewotCQkJCXl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0JCQkJaWYgKCF5eV9hdEVPRikKLQkJCQkJeXlfY3VycmVudFBvcy0tOwotCQkJfQotCi0JCQl5eV9hY3Rpb24gPSAtMTsKLQotCQkJeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotCQkJaWYgKHl5X2F0Qk9MKQotCQkJCXl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSArIDFdOwotCQkJZWxzZQotCQkJCXl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZV07Ci0KLQotCQkJeXlfZm9yQWN0aW9uIDogewotCQkJCXdoaWxlICh0cnVlKSB7Ci0KLQkJCQkJeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLQkJCQkJaWYgKHl5X2lucHV0ID09IFlZRU9GKQotCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0JCQkJCXl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotCQkJCQlib29sZWFuIHl5X2lzRmluYWwgPSBmYWxzZTsKLQkJCQkJYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0JCQkJCXl5X2Zvck5leHQgOiB7Ci0JCQkJCQlzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0JCQkJCQkJY2FzZSAwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDExOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDEyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMTA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAxNDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDI2IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDE5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDIwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQljYXNlIDM0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDMyIDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDM1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzNiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQljYXNlIDI1IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzNCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQkJY2FzZSAzNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgMzcgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDI1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMzQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDEzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzNjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAxMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAzOTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTkgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMjEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyMiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9ub0xvb2tBaGVhZCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSAyMDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDI3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNSA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNDU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSAyOSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDMyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDUgOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDEwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM4OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDExIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDM5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgMzkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDEyIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDQ5OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDUwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE2IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDUxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNDQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjE7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA0NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJeXlfaXNGaW5hbCA9IHRydWU7Ci0JCQkJCQkJCQkJeXlfbm9Mb29rQWhlYWQgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gMjA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0OCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTYgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTI7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA0OSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTM7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTQ7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTU7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTcgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTY7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1MyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTQgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTc7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjIgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNTk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA1NiA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X25vTG9va0FoZWFkID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYwOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTcgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTggOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDIzIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYyOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNTkgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE1IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYzOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjEgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDYxOwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjIgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDE5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDY0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjMgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI5IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDY1OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDI0IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDY2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjUgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDMwIDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDY3OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgNjYgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDY2OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQljYXNlIDggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2NyA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMjMgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjk7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2OCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X2lzRmluYWwgPSB0cnVlOwotCQkJCQkJCQkJCXl5X3N0YXRlID0gNjg7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA2OSA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgMzEgOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJCWJyZWFrIHl5X2ZvckFjdGlvbjsKLQkJCQkJCQkJfQotCi0JCQkJCQkJY2FzZSA3MCA6Ci0JCQkJCQkJCXN3aXRjaCAoeXlfaW5wdXQpIHsKLQkJCQkJCQkJCWNhc2UgNiA6Ci0JCQkJCQkJCQljYXNlIDcgOgotCQkJCQkJCQkJY2FzZSA5IDoKLQkJCQkJCQkJCWNhc2UgMTggOgotCQkJCQkJCQkJCXl5X3N0YXRlID0gNzA7Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yTmV4dDsKLQkJCQkJCQkJCWNhc2UgOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDcxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDcyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDczIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDc0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDc1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDc2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3NzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDc3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDc4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA3OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDc5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDgwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDgxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAzMyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDgyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyNyA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDgzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4NDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDg0IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAzMiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4NjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDg1IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSAyMCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4NzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDg2IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4NTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDg3IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAyMSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4ODsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDg4IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA4OTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDg5IDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5MDsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDkwIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5MTsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDkxIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxOSA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5MjsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDkyIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSAxNiA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJZGVmYXVsdCA6Ci0JCQkJCQkJCQkJYnJlYWsgeXlfZm9yQWN0aW9uOwotCQkJCQkJCQl9Ci0KLQkJCQkJCQljYXNlIDkzIDoKLQkJCQkJCQkJc3dpdGNoICh5eV9pbnB1dCkgewotCQkJCQkJCQkJY2FzZSA2IDoKLQkJCQkJCQkJCWNhc2UgNyA6Ci0JCQkJCQkJCQljYXNlIDkgOgotCQkJCQkJCQkJY2FzZSAxOCA6Ci0JCQkJCQkJCQkJeXlfc3RhdGUgPSA5MzsKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JOZXh0OwotCQkJCQkJCQkJY2FzZSA4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWNhc2UgOTQgOgotCQkJCQkJCQlzd2l0Y2ggKHl5X2lucHV0KSB7Ci0JCQkJCQkJCQljYXNlIDYgOgotCQkJCQkJCQkJY2FzZSA3IDoKLQkJCQkJCQkJCWNhc2UgOSA6Ci0JCQkJCQkJCQljYXNlIDE4IDoKLQkJCQkJCQkJCQl5eV9pc0ZpbmFsID0gdHJ1ZTsKLQkJCQkJCQkJCQl5eV9zdGF0ZSA9IDk0OwotCQkJCQkJCQkJCWJyZWFrIHl5X2Zvck5leHQ7Ci0JCQkJCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCQkJCX0KLQotCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQl5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHl5X2lzRmluYWwpIHsKLQkJCQkJCXl5X2FjdGlvbiA9IHl5X3N0YXRlOwotCQkJCQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJCQkJCWlmICh5eV9ub0xvb2tBaGVhZCkKLQkJCQkJCQlicmVhayB5eV9mb3JBY3Rpb247Ci0JCQkJCX0KLQotCQkJCX0KLQkJCX0KLQotCi0JCQlzd2l0Y2ggKHl5X2FjdGlvbikgewotCi0JCQkJY2FzZSAyNiA6Ci0JCQkJCXsKLQkJCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLQkJCQkJfQotCQkJCWNhc2UgOTYgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIwIDoKLQkJCQljYXNlIDIxIDoKLQkJCQkJewotCQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJCXl5YmVnaW4oVW5EZWxpbWl0ZWRTdHJpbmcpOwotCQkJCQkJc3RyaW5nLnNldExlbmd0aCgwKTsKLQkJCQkJfQotCQkJCWNhc2UgOTcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDE3IDoKLQkJCQkJewotCQkJCQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQkJCQkJaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkKLQkJCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDsKLQkJCQkJfQotCQkJCWNhc2UgOTggOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDMxIDoKLQkJCQkJewotCQkJCQkJeXlwdXNoYmFjaygxKTsKLQkJCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotCQkJCQl9Ci0JCQkJY2FzZSA5OSA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDMgOgotCQkJCQl7Ci0JCQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJCQlpZiAoZm91bmRDb250ZW50VHlwZVZhbHVlKQotCQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBIVE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5NZXRhVGFnRW5kOwotCQkJCQl9Ci0JCQkJY2FzZSAxMDAgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ1IDoKLQkJCQkJewotCQkJCQkJeXlwdXNoYmFjaygyKTsKLQkJCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCQl9Ci0JCQkJY2FzZSAxMDEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDQ2IDoKLQkJCQkJewotCQkJCQkJeXlwdXNoYmFjaygyKTsKLQkJCQkJCXBvcFN0YXRlKCk7Ci0JCQkJCQl2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOwotCQkJCQl9Ci0JCQkJY2FzZSAxMDIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDYxIDoKLQkJCQkJewotCQkJCQkJaWYgKHl5Y2hhciA9PSAwKSB7Ci0JCQkJCQkJeXliZWdpbihTVF9YTUxEZWNsKTsKLQkJCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQljYXNlIDEwMyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgOCA6Ci0JCQkJY2FzZSA5IDoKLQkJCQljYXNlIDEwIDoKLQkJCQljYXNlIDExIDoKLQkJCQljYXNlIDEyIDoKLQkJCQljYXNlIDEzIDoKLQkJCQljYXNlIDE0IDoKLQkJCQljYXNlIDE1IDoKLQkJCQljYXNlIDE2IDoKLQkJCQljYXNlIDE4IDoKLQkJCQljYXNlIDE5IDoKLQkJCQljYXNlIDIyIDoKLQkJCQkJewotCQkJCQkJaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7Ci0JCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCWNhc2UgMTA0IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA2MCA6Ci0JCQkJCXsKLQkJCQkJCXl5YmVnaW4oU1RfTUVUQV9UQUcpOwotCQkJCQkJcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdTdGFydDsKLQkJCQkJfQotCQkJCWNhc2UgMTA1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSA0MCA6Ci0JCQkJCXsKLQkJCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsKLQkJCQkJCXJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7Ci0JCQkJCX0KLQkJCQljYXNlIDEwNiA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgOTQgOgotCQkJCQl7Ci0JCQkJCQlwdXNoQ3VycmVudFN0YXRlKCk7Ci0JCQkJCQl5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsKLQkJCQkJCWZvdW5kQ29udGVudFR5cGVWYWx1ZSA9IHRydWU7Ci0JCQkJCQlyZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0NvbnRlbnRUeXBlOwotCQkJCQl9Ci0JCQkJY2FzZSAxMDcgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDY4IDoKLQkJCQkJewotCQkJCQkJcHVzaEN1cnJlbnRTdGF0ZSgpOwotCQkJCQkJeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7Ci0JCQkJCQlyZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzsKLQkJCQkJfQotCQkJCWNhc2UgMTA4IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMyA6Ci0JCQkJCXsKLQkJCQkJCWhhc01vcmUgPSBmYWxzZTsKLQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFOwotCQkJCQl9Ci0JCQkJY2FzZSAxMDkgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDM0IDoKLQkJCQkJewotCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7Ci0JCQkJCX0KLQkJCQljYXNlIDExMCA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgNDcgOgotCQkJCQl7Ci0JCQkJCQloYXNNb3JlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTEgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI4IDoKLQkJCQkJewotCQkJCQkJcG9wU3RhdGUoKTsKLQkJCQkJCXZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOwotCQkJCQkJcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTIgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDI1IDoKLQkJCQljYXNlIDI3IDoKLQkJCQljYXNlIDI5IDoKLQkJCQljYXNlIDMyIDoKLQkJCQkJewotCQkJCQkJc3RyaW5nLmFwcGVuZCh5eXRleHQoKSk7Ci0JCQkJCX0KLQkJCQljYXNlIDExMyA6Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgMjQgOgotCQkJCQl7Ci0JCQkJCQl5eWJlZ2luKFNRX1NUUklORyk7Ci0JCQkJCQlzdHJpbmcuc2V0TGVuZ3RoKDApOwotCQkJCQl9Ci0JCQkJY2FzZSAxMTQgOgotCQkJCQlicmVhazsKLQkJCQljYXNlIDIzIDoKLQkJCQkJewotCQkJCQkJeXliZWdpbihEUV9TVFJJTkcpOwotCQkJCQkJc3RyaW5nLnNldExlbmd0aCgwKTsKLQkJCQkJfQotCQkJCWNhc2UgMTE1IDoKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAzMCA6Ci0JCQkJCXsKLQkJCQkJCXl5cHVzaGJhY2soMSk7Ci0JCQkJCQlwb3BTdGF0ZSgpOwotCQkJCQkJdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7Ci0JCQkJCQlyZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLQkJCQkJfQotCQkJCWNhc2UgMTE2IDoKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotCQkJCQkJeXlfYXRFT0YgPSB0cnVlOwotCQkJCQkJeXlfZG9fZW9mKCk7Ci0JCQkJCQl7Ci0JCQkJCQkJaGFzTW9yZSA9IGZhbHNlOwotCQkJCQkJCXJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotCQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotCSAqCi0JICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotCSAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotCSAqIGZpbGUgaXMgcmVhY2hlZCwgb3IgYW4gZXJyb3Igb2NjdXJlZC4KLQkgKgotCSAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLQkgKiAgICAgICAgICAgICAgIHRoZSBzY2FubmVyIG9uLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0JCQlIVE1MSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJc2Nhbm5lciA9IG5ldyBIVE1MSGVhZFRva2VuaXplcihuZXcgamF2YS5pby5GaWxlUmVhZGVyKGFyZ3ZbaV0pKTsKLQkJCX0KLQkJCWNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIiArIGFyZ3ZbaV0gKyAiXCIiKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJCWNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIEhUTUxIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0JCQkJU3lzdGVtLmV4aXQoMSk7Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJZG8gewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc2Nhbm5lci5wcmltR2V0TmV4dFRva2VuKCkpOwotCQkJCX0KLQkJCQl3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0JCQl9Ci0JCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJBbiBJL08gZXJyb3Igb2NjdXJlZCB3aGlsZSBzY2FubmluZyA6Iik7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGUpOwotCQkJCVN5c3RlbS5leGl0KDEpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCQlTeXN0ZW0uZXhpdCgxKTsKLQkJCX0KLQkJfQotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4YmNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzIHsKLQotCVN0cmluZyBNZXRhVGFnRW5kID0gIk1ldGFUYWdFbmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1ldGFUYWdTdGFydCA9ICJNZXRhVGFnU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIE1ldGFUYWdDb250ZW50VHlwZSA9ICJNZXRhVGFnQ29udGVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hUTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZmMjIxOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotCi1wdWJsaWMgY2xhc3MgSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIHsKLQotCXByaXZhdGUgSFRNTEhlYWRUb2tlbml6ZXIgZlRva2VuaXplcjsKLQotCS8qKgotCSAqIFRoZXJlIGlzIG5vIHNwZWMgZGVmaW5lZCBlbmNvZGluZyBmb3IgSFRNTCAoaGlzdG9yaWNhbGx5KSwgc28gbnVsbCBpcwotCSAqIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQllbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCVN0cmluZyBlbmMgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhlbmMsIEVuY29kaW5nTWVtZW50by5ERVRFQ1RFRF9TVEFOREFSRF9VTklDT0RFX0JZVEVTKTsKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgSFRNTEhlYWRUb2tlbml6ZXIgZ2V0VG9rZW5pemVyKCkgewotCQkvLyBUT0RPOiBuZWVkIHRvIHdvcmsgb24gJ3Jlc2V0JyBpbiB0b2tlbml6ZXIsIHNvIG5ldyBpbnN0YW5jZSBpc24ndAotCQkvLyBhbHdheXMgbmVlZGVkCi0JCS8vaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQlmVG9rZW5pemVyID0gbmV3IEhUTUxIZWFkVG9rZW5pemVyKCk7Ci0JCS8vCQl9Ci0JCXJldHVybiBmVG9rZW5pemVyOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0xlZ2FsU3RyaW5nKFN0cmluZyB2YWx1ZVRva2VuVHlwZSkgewotCQlpZiAodmFsdWVUb2tlblR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFyc2VJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWNoZWNrSW5Db250ZW50KCk7Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWNoZWNrSGV1cmlzdGljcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0hldXJpc3RpY3MoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlib29sZWFuIG5vSGV1cmlzdGljID0gZmFsc2U7Ci0JCVN0cmluZyBoZXVyaXN0aWNFbmNvZGluZyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJCWJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW0NvZGVkSU8uTUFYX01BUktfU0laRV07Ci0JCQlpbnQgblJlYWQgPSAwOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmUmVhZGVyLnJlYWR5KCkpIHsKLQkJCQkJaW50IG9uZUJ5dGUgPSBmUmVhZGVyLnJlYWQoKTsKLQkJCQkJblJlYWQrKzsKLQkJCQkJaWYgKG9uZUJ5dGUgPD0gMHhGRikgewotCQkJCQkJYnl0ZXNbaV0gPSAoYnl0ZSkgb25lQnl0ZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW5vSGV1cmlzdGljID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIW5vSGV1cmlzdGljKSB7Ci0JCQkJaGV1cmlzdGljRW5jb2RpbmcgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhieXRlcywgblJlYWQpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBhbnkgSU8gZXhjZXB0aW9uLCB0aGVuIG5vdCBhIGhldXJpc3RpYyBjYXNlCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCX0KLQkJaWYgKGhldXJpc3RpY0VuY29kaW5nICE9IG51bGwpIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhoZXVyaXN0aWNFbmNvZGluZywgRW5jb2RpbmdNZW1lbnRvLkdVRVNTRURfRU5DT0RJTkdfRlJPTV9TVFJFQU0pOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tJbkNvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlIVE1MSGVhZFRva2VuaXplciB0b2tlbml6ZXIgPSBnZXRUb2tlbml6ZXIoKTsKLQkJdG9rZW5pemVyLnJlc2V0KGZSZWFkZXIpOwotCQlIZWFkUGFyc2VyVG9rZW4gdG9rZW4gPSBudWxsOwotCQlTdHJpbmcgdG9rZW5UeXBlID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlVmFsdWUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCS8vIHNpZGUgZWZmZWN0IG9mIGNhbkhhbmRsZSBpcyB0byBjcmVhdGUgYXBwcm9wcmlhdGUKLQkJCQkvLyBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIGlmICh0b2tlblR5cGUgPT0gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0NvbnRlbnRUeXBlKSB7Ci0JCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJSGVhZFBhcnNlclRva2VuIHZhbHVlVG9rZW4gPSB0b2tlbml6ZXIuZ2V0TmV4dFRva2VuKCk7Ci0JCQkJCVN0cmluZyB2YWx1ZVRva2VuVHlwZSA9IHZhbHVlVG9rZW4uZ2V0VHlwZSgpOwotCQkJCQlpZiAoaXNMZWdhbFN0cmluZyh2YWx1ZVRva2VuVHlwZSkpIHsKLQkJCQkJCWNvbnRlbnRUeXBlVmFsdWUgPSB2YWx1ZVRva2VuLmdldFRleHQoKTsKLQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpOwotCQlpZiAoY29udGVudFR5cGVWYWx1ZSAhPSBudWxsKSB7Ci0JCQlwYXJzZUNvbnRlbnRUeXBlVmFsdWUoY29udGVudFR5cGVWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGFyc2VDb250ZW50VHlwZVZhbHVlKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlTdHJpbmcgY2hhcnNldCA9IG51bGw7Ci0JCVBhdHRlcm4gcGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZSgiO1xccypjaGFyc2V0XFxzKj1cXHMqIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nW10gcGFydHMgPSBwYXR0ZXJuLnNwbGl0KGNvbnRlbnRUeXBlKTsKLQkJaWYgKHBhcnRzLmxlbmd0aCA+IDApIHsKLQkJCS8vIGlmIG9ubHkgb25lIGl0ZW0sIGl0IGNhbiBzdGlsbCBiZSBjaGFyc2V0IGluc3RlYWQgb2YKLQkJCS8vIGNvbnRlbnRUeXBlCi0JCQlpZiAocGFydHMubGVuZ3RoID09IDEpIHsKLQkJCQlpZiAocGFydHNbMF0ubGVuZ3RoKCkgPiA2KSB7Ci0JCQkJCVN0cmluZyBjaGVja0ZvckNoYXJzZXQgPSBwYXJ0c1swXS5zdWJzdHJpbmcoMCwgNyk7Ci0JCQkJCWlmIChjaGVja0ZvckNoYXJzZXQuZXF1YWxzSWdub3JlQ2FzZSgiY2hhcnNldCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWludCBlcXBvcyA9IHBhcnRzWzBdLmluZGV4T2YoJz0nKTsKLQkJCQkJCWVxcG9zID0gZXFwb3MgKyAxOwotCQkJCQkJaWYgKGVxcG9zIDwgcGFydHNbMF0ubGVuZ3RoKCkpIHsKLQkJCQkJCQljaGFyc2V0ID0gcGFydHNbMF0uc3Vic3RyaW5nKGVxcG9zKTsKLQkJCQkJCQljaGFyc2V0ID0gY2hhcnNldC50cmltKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvL2ZDb250ZW50VHlwZSA9IHBhcnRzWzBdOwotCQkJfQotCQl9Ci0JCWlmIChwYXJ0cy5sZW5ndGggPiAxKSB7Ci0JCQljaGFyc2V0ID0gcGFydHNbMV07Ci0JCX0KLQkJCi0JCWlmIChjaGFyc2V0ICE9IG51bGwgJiYgY2hhcnNldC5sZW5ndGgoKSA+IDApIHsKLQkJCWNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0LCBFbmNvZGluZ01lbWVudG8uRk9VTkRfRU5DT0RJTkdfSU5fQ09OVEVOVCk7Ci0JCX0KLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDA0MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1wdWJsaWMgY2xhc3MgSGVhZFBhcnNlclRva2VuIHsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQlwcml2YXRlIFN0cmluZyBmVGV4dDsKLQlwcml2YXRlIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBIZWFkUGFyc2VyVG9rZW4oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEhlYWRQYXJzZXJUb2tlbihTdHJpbmcgdHlwZSwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gdHlwZTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0ID0gdGV4dDsKLQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJcmV0dXJuIGZUZXh0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAoInRleHQ6ICIgKyBmVGV4dCArICIgb2Zmc2V0OiAiICsgZlN0YXJ0ICsgIiB0eXBlOiAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDY3NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbGlzdC5sZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL051bGxNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUyMmFmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLk5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgaW4gcGxhY2Ugb2YgYW4gRW5jb2RpbmdNZW1lbnRvIChpdHMgc3VwZXIgY2xhc3MpLAotICogd2hlbiB0aGVyZSBpcyBub3QgaW4gZmFjdCBBTlkgZW5jb2RpbmcgaW5mb3JtYXRpb24uIEZvciBleGFtcGxlLCB3aGVuIGEKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBjcmVhdGVkIGRpcmVjdGx5IGZyb20gYSBTdHJpbmcKLSAqLwotcHVibGljIGNsYXNzIE51bGxNZW1lbnRvIGV4dGVuZHMgRW5jb2RpbmdNZW1lbnRvIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE51bGxNZW1lbnRvKCkgewotCQlzdXBlcigpOwotCQlTdHJpbmcgZGVmYXVsdENoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMobnVsbCk7Ci0JCXNldEphdmFDaGFyc2V0TmFtZShkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldEFwcHJvcHJpYXRlRGVmYXVsdChkZWZhdWx0Q2hhcnNldCk7Ci0JCXNldERldGVjdGVkQ2hhcnNldE5hbWUobnVsbCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NU3R5bGVNb2RlbEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01TdHlsZU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJjMjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9ET01TdHlsZU1vZGVsSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRPTU1vZGVsSW1wbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBAYXV0aG9yIGRhdmlkdwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBET01TdHlsZU1vZGVsSW1wbCBleHRlbmRzIERPTU1vZGVsSW1wbCB7Ci0JcHVibGljIERPTVN0eWxlTW9kZWxJbXBsKCkgewotCQkvLyByZW1lbWJlciwgdGhlIGRvY3VtZW50IGlzIGNyZWF0ZWQgaW4gc3VwZXIgY29uc3RydWN0b3IsIAotCQkvLyB2aWEgaW50ZXJuYWxDcmVhdGVEb2N1bWVudAotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQkJcmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJcmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCXN1cGVyLnJlbGVhc2VGcm9tUmVhZCgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWxlYXNlU3R5bGVTaGVldHMoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBEb2N1bWVudFN0eWxlSW1wbCkgewotCQkJCSgoRG9jdW1lbnRTdHlsZUltcGwpIGRvYykucmVsZWFzZVN0eWxlU2hlZXRzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudCBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50U3R5bGVJbXBsIGRvY3VtZW50ID0gbmV3IERvY3VtZW50U3R5bGVJbXBsKCk7Ci0JCWRvY3VtZW50LnNldE1vZGVsKHRoaXMpOwotCQlyZXR1cm4gZG9jdW1lbnQ7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRTdHlsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFN0eWxlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQ2MjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFN0eWxlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyoKLSAqIENyZWF0ZWQgb24gU2VwIDIsIDIwMDMKLSAqCi0gKiBUbyBjaGFuZ2UgdGhlIHRlbXBsYXRlIGZvciB0aGlzIGdlbmVyYXRlZCBmaWxlIGdvIHRvCi0gKiBXaW5kb3c+UHJlZmVyZW5jZXM+SmF2YT5Db2RlIEdlbmVyYXRpb24+Q29kZSBhbmQgQ29tbWVudHMKLSAqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5DU1NTdHlsZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLmNzcy5Eb2N1bWVudENTUzsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0TGlzdDsKLQotLyoqCi0gKiBAYXV0aG9yIGRhdmlkdwotICoKLSAqIFRvIGNoYW5nZSB0aGUgdGVtcGxhdGUgZm9yIHRoaXMgZ2VuZXJhdGVkIHR5cGUgY29tbWVudCBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFN0eWxlSW1wbCBleHRlbmRzIERvY3VtZW50SW1wbCBpbXBsZW1lbnRzIElET01Eb2N1bWVudCwgRG9jdW1lbnRDU1MgewotCXB1YmxpYyBEb2N1bWVudFN0eWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRG9jdW1lbnRTdHlsZUltcGwoRG9jdW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0JfQotCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0T3ZlcnJpZGVTdHlsZShFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBwc2V1ZG9OYW1lKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChJU3R5bGVTaGVldExpc3RBZGFwdGVyKSBhZGFwdGVyKS5nZXRPdmVycmlkZVN0eWxlKGVsZW1lbnQsIHBzZXVkb05hbWUpOwotCX0KLQotCXB1YmxpYyBTdHlsZVNoZWV0TGlzdCBnZXRTdHlsZVNoZWV0cygpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBnZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIpIGFkYXB0ZXIpLmdldFN0eWxlU2hlZXRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVN0eWxlU2hlZXRzKCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChJU3R5bGVTaGVldExpc3RBZGFwdGVyKSBhZGFwdGVyKS5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbGVtZW50IG1ldGhvZAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50KFN0cmluZyB0YWdOYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJY2hlY2tUYWdOYW1lVmFsaWRpdHkodGFnTmFtZSk7Ci0KLQkJRWxlbWVudFN0eWxlSW1wbCBlbGVtZW50ID0gbmV3IEVsZW1lbnRTdHlsZUltcGwoKTsKLQkJZWxlbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQllbGVtZW50LnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcCBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlEb2N1bWVudFN0eWxlSW1wbCBjbG9uZWQgPSBuZXcgRG9jdW1lbnRTdHlsZUltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVkLmltcG9ydENoaWxkTm9kZXModGhpcywgdHJ1ZSk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSURPTU1vZGVsIG1vZGVsKSB7Ci0JCXN1cGVyLnNldE1vZGVsKG1vZGVsKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRTdHlsZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbGVtZW50U3R5bGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MzIxOGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRTdHlsZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qCi0gKiBDcmVhdGVkIG9uIFNlcCAyLCAyMDAzCi0gKgotICogVG8gY2hhbmdlIHRoZSB0ZW1wbGF0ZSBmb3IgdGhpcyBnZW5lcmF0ZWQgZmlsZSBnbyB0bwotICogV2luZG93PlByZWZlcmVuY2VzPkphdmE+Q29kZSBHZW5lcmF0aW9uPkNvZGUgYW5kIENvbW1lbnRzCi0gKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5FbGVtZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuRWxlbWVudENTU0lubGluZVN0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLkxpbmtTdHlsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotCi1wdWJsaWMgY2xhc3MgRWxlbWVudFN0eWxlSW1wbCBleHRlbmRzIEVsZW1lbnRJbXBsIGltcGxlbWVudHMgSURPTUVsZW1lbnQsIEVsZW1lbnRDU1NJbmxpbmVTdHlsZSwgTGlua1N0eWxlIHsKLQlwdWJsaWMgRWxlbWVudFN0eWxlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRWxlbWVudFN0eWxlSW1wbChFbGVtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCXB1YmxpYyBTdHlsZVNoZWV0IGdldFNoZWV0KCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKChJU3R5bGVTaGVldEFkYXB0ZXIpIGFkYXB0ZXIpLmdldFNoZWV0KCk7Ci0JfQotCi0JcHVibGljIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0U3R5bGUoKSB7Ci0JCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlckZvcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKGFkYXB0ZXIgaW5zdGFuY2VvZiBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikgYWRhcHRlcikuZ2V0U3R5bGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJc3VwZXIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCXN1cGVyLnNldFRhZ05hbWUodGFnTmFtZSk7Ci0JfQotCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbGVtZW50SW1wbCBjbG9uZWQgPSBuZXcgRWxlbWVudFN0eWxlSW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZUNoaWxkTm9kZXMoY2xvbmVkLCBkZWVwKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTENvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3YzJmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTENvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5IVE1MQ2xlYW51cFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbnZlcnRlciB7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTENvbnZlcnRlcigpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsIHByb2Nlc3NvciA9IG5ldyBIVE1MQ2xlYW51cFByb2Nlc3NvckltcGwoKTsKLQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgcHJlZiA9IHByb2Nlc3Nvci5nZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCQkvLyBiYWNrdXAgb3B0aW9ucwotCQlib29sZWFuIGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IHByZWYuZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCk7Ci0JCWJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycyA9IHByZWYuZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCQlib29sZWFuIGluc2VydE1pc3NpbmdUYWdzID0gcHJlZi5nZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCQlib29sZWFuIHF1b3RlQXR0clZhbHVlcyA9IHByZWYuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0JCWJvb2xlYW4gZm9ybWF0U291cmNlID0gcHJlZi5nZXRGb3JtYXRTb3VyY2UoKTsKLQkJaW50IHRhZ05hbWVDYXNlID0gcHJlZi5nZXRUYWdOYW1lQ2FzZSgpOwotCQlpbnQgYXR0ck5hbWVDYXNlID0gcHJlZi5nZXRBdHRyTmFtZUNhc2UoKTsKLQotCQkvLyBzZXR1cCBvcHRpb25zCi0JCXByZWYuc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKHRydWUpOwotCQlwcmVmLnNldEluc2VydFJlcXVpcmVkQXR0cnModHJ1ZSk7Ci0JCXByZWYuc2V0SW5zZXJ0TWlzc2luZ1RhZ3ModHJ1ZSk7Ci0JCXByZWYuc2V0UXVvdGVBdHRyVmFsdWVzKHRydWUpOwotCQlwcmVmLnNldEZvcm1hdFNvdXJjZShmYWxzZSk7Ci0JCWlmIChtb2RlbC5nZXREb2N1bWVudCgpLmlzWE1MVHlwZSgpKSB7IC8vIFhIVE1MCi0JCQlwcmVmLnNldFRhZ05hbWVDYXNlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJCXByZWYuc2V0QXR0ck5hbWVDYXNlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJfQotCQllbHNlIHsKLQkJCXByZWYuc2V0VGFnTmFtZUNhc2UoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0JCQlwcmVmLnNldEF0dHJOYW1lQ2FzZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJfQotCi0JCXByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCi0JCS8vIHNldCBiYWNrIG9wdGlvbnMKLQkJcHJlZi5zZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKTsKLQkJcHJlZi5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKGluc2VydFJlcXVpcmVkQXR0cnMpOwotCQlwcmVmLnNldEluc2VydE1pc3NpbmdUYWdzKGluc2VydE1pc3NpbmdUYWdzKTsKLQkJcHJlZi5zZXRRdW90ZUF0dHJWYWx1ZXMocXVvdGVBdHRyVmFsdWVzKTsKLQkJcHJlZi5zZXRGb3JtYXRTb3VyY2UoZm9ybWF0U291cmNlKTsKLQkJcHJlZi5zZXRUYWdOYW1lQ2FzZSh0YWdOYW1lQ2FzZSk7Ci0JCXByZWYuc2V0QXR0ck5hbWVDYXNlKGF0dHJOYW1lQ2FzZSk7Ci0JfQotCi0JLyoqCi0JICogZGVjbGFyYXRvaW46ICJkYXRhIiBmb3IgWE1MIGRlY2xhcmF0aW9uLCBzdWNoIGFzICJ2ZXJzaW9uPVwiMS4wXCIiCi0JICogcHVibGljSWQ6IHB1YmxpY0lkIGZvciBET0NUWVBFIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29udmVydChJRE9NTW9kZWwgbW9kZWwsIFN0cmluZyBkZWNsYXJhdGlvbiwgU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlzZXREZWNsYXJhdGlvbihtb2RlbCwgZGVjbGFyYXRpb24sIHB1YmxpY0lkKTsKLQkJY2xlYW51cE1vZGVsKG1vZGVsKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWNsYXJhdG9pbjogImRhdGEiIGZvciBYTUwgZGVjbGFyYXRpb24sIHN1Y2ggYXMgInZlcnNpb249XCIxLjBcIiIKLQkgKiBwdWJsaWNJZDogcHVibGljSWQgZm9yIERPQ1RZUEUgZGVjbGFyYXRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb252ZXJ0KElucHV0U3RyZWFtIGlucHV0LCBPdXRwdXRTdHJlYW0gb3V0cHV0LCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gcmVhZE1vZGVsKGlucHV0KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQljb252ZXJ0KG1vZGVsLCBkZWNsYXJhdGlvbiwgcHVibGljSWQpOwotCQkJd3JpdGVNb2RlbChtb2RlbCwgb3V0cHV0KTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogZGVjbGFyYXRvaW46ICJkYXRhIiBmb3IgWE1MIGRlY2xhcmF0aW9uLCBzdWNoIGFzICJ2ZXJzaW9uPVwiMS4wXCIiCi0JICogcHVibGljSWQ6IHB1YmxpY0lkIGZvciBET0NUWVBFIGRlY2xhcmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgY29udmVydChJRmlsZSBmaWxlLCBTdHJpbmcgZGVjbGFyYXRpb24sIFN0cmluZyBwdWJsaWNJZCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gcmVhZE1vZGVsKGZpbGUpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJdHJ5IHsKLQkJCWNvbnZlcnQobW9kZWwsIGRlY2xhcmF0aW9uLCBwdWJsaWNJZCk7Ci0JCQl3cml0ZU1vZGVsKG1vZGVsLCBmaWxlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBpbnNlcnRCcmVhayhJRE9NTW9kZWwgbW9kZWwsIE5vZGUgbm9kZSkgewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZ2V0IGRlbGltaXRlciBzdHJpbmcKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgZGVsaW0gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcigpOwotCQlpZiAoZGVsaW0gPT0gbnVsbCB8fCBkZWxpbS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVRleHQgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRlbGltKTsKLQkJcGFyZW50Lmluc2VydEJlZm9yZSh0ZXh0LCBub2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElET01Nb2RlbCByZWFkTW9kZWwoSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGNyZWF0ZSB0ZW1wb3JhcnkgbW9kZWwKLQkJU3RyaW5nIGlkID0gaW5wdXQudG9TdHJpbmcoKSArICIuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGlkLCBpbnB1dCwgbnVsbCk7Ci0JCWlmICghKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgewotCQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlyZXR1cm4gKElET01Nb2RlbCkgbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJRE9NTW9kZWwgcmVhZE1vZGVsKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCQlpZiAoIShtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkpIHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRE9NTW9kZWwpIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmF0aW9uKElET01Nb2RlbCBtb2RlbCwgU3RyaW5nIGRlY2xhcmF0aW9uLCBTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG1vZGVsLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpID0gbnVsbDsKLQkJCU5vZGUgY2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCAmJiBjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJU3RyaW5nIHRhcmdldCA9IGNoaWxkLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5lcXVhbHMoInhtbCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBjaGlsZDsKLQkJCQkJY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCX0KLQkJCX0KLQkJCUlET01Eb2N1bWVudFR5cGUgZG9jVHlwZSA9IChJRE9NRG9jdW1lbnRUeXBlKSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0KLQkJCWlmIChkZWNsYXJhdGlvbiAhPSBudWxsKSB7Ci0JCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQkJcGkuc2V0RGF0YShkZWNsYXJhdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwaSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgZGVjbGFyYXRpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCWRvY3VtZW50Lmluc2VydEJlZm9yZShwaSwgY2hpbGQpOwotCQkJCQlpbnNlcnRCcmVhayhtb2RlbCwgY2hpbGQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHB1YmxpY0lkICE9IG51bGwpIHsKLQkJCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRFbnRyeShwdWJsaWNJZCk7Ci0JCQkJU3RyaW5nIG5hbWUgPSAoZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldE5hbWUoKSA6IG51bGwpOwotCQkJCWlmIChuYW1lID09IG51bGwgfHwgbmFtZS5sZW5ndGgoKSA9PSAwKQotCQkJCQluYW1lID0gIkhUTUwiOyAvLyBkZWZhdWx0IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoZG9jVHlwZSAhPSBudWxsKSB7Ci0JCQkJCWlmICghbmFtZS5lcXVhbHMoZG9jVHlwZS5nZXROYW1lKCkpKSB7IC8vIHJlcGxhY2UKLQkJCQkJCU5vZGUgcGFyZW50ID0gZG9jVHlwZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQljaGlsZCA9IGRvY1R5cGU7Ci0JCQkJCQlkb2NUeXBlID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50LmNyZWF0ZURvY3R5cGUobmFtZSk7Ci0JCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGRvY1R5cGUsIGNoaWxkKTsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRvY1R5cGUgPSAoSURPTURvY3VtZW50VHlwZSkgZG9jdW1lbnQuY3JlYXRlRG9jdHlwZShuYW1lKTsKLQkJCQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKGRvY1R5cGUsIGNoaWxkKTsKLQkJCQkJaW5zZXJ0QnJlYWsobW9kZWwsIGNoaWxkKTsKLQkJCQl9Ci0JCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCQkJaWYgKGVudHJ5ICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHN5c3RlbUlkID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJCQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQkJCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IGVudHJ5LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCQlpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpIHsKLQkJCQkJCUVsZW1lbnQgZWxlbWVudCA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlKCJ4bWxucyIsIG5hbWVzcGFjZVVSSSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHdyaXRlTW9kZWwoSURPTU1vZGVsIG1vZGVsLCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAobW9kZWwgPT0gbnVsbCB8fCBvdXRwdXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuc2F2ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB3cml0ZU1vZGVsKElET01Nb2RlbCBtb2RlbCwgSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKG1vZGVsID09IG51bGwgfHwgZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dCA9IG51bGw7Ci0JCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vb3V0cHV0ID0gbmV3Ci0JCQkvLyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oc3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJCW1vZGVsLnNhdmUoKTsKLQkJCS8vaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotCQkJLy9maWxlLnNldENvbnRlbnRzKGlucHV0LCB0cnVlLCB0cnVlLCBudWxsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vCQkJaWYgKG91dHB1dCAhPSBudWxsKQotCQkJLy8JCQkJb3V0cHV0LmNsb3NlKCk7Ci0JCQlpZiAoaW5wdXQgIT0gbnVsbCkKLQkJCQlpbnB1dC5jbG9zZSgpOwotCQl9Ci0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI5N2EyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyIGV4dGVuZHMgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwgaW1wbGVtZW50cyBIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzIHsKLQotCXByaXZhdGUgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5IGZGYWN0b3J5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzWE1MVHlwZSA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBYTUwgPSAieG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBYSFRNTCA9ICJ4aHRtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgV01MID0gIndtbCI7IC8vJE5PTi1OTFMtMSQKLQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlcihJRE9NRG9jdW1lbnQgZG9jdW1lbnQsIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCXN1cGVyKGRvY3VtZW50KTsKLQotCQl0aGlzLmZGYWN0b3J5ID0gZmFjdG9yeTsKLQotCQkvLyBpbml0aWFsaXplCi0JCWRvY3VtZW50VHlwZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCUlET01Nb2RlbCBtb2RlbCA9IGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCUlGaWxlIGZpbGUgPSBnZXRGaWxlKG1vZGVsKTsKLQotCQkvLyBmaW5kIERPQ1RZUEUgZGVsY2FyYXRpb24gYW5kIFB1YmxpYyBJRAotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlEb2N1bWVudFR5cGUgbmV3RG9jdW1lbnRUeXBlID0gZmluZERvY3VtZW50VHlwZShkb2N1bWVudCk7Ci0JCWlmIChuZXdEb2N1bWVudFR5cGUgIT0gbnVsbCkgewotCQkJcHVibGljSWQgPSBuZXdEb2N1bWVudFR5cGUuZ2V0UHVibGljSWQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGxvb2t1cCBkZWZhdWx0IHNldCBieSBjb250ZW50c2V0dGluZ3MKLQkJCXB1YmxpY0lkID0gSFRNTENvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBmaWxlLCB0cnVlKTsKLQkJfQotCi0JCS8vIGxvb2t1cCBET0NUWVBFIHJlZ2lzdHJ5Ci0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBuZXdFbnRyeSA9IG51bGw7Ci0JCWlmIChwdWJsaWNJZCAhPSBudWxsKSB7Ci0JCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEVudHJ5KHB1YmxpY0lkKTsKLQkJfQotCi0JCWJvb2xlYW4gbmV3WE1MVHlwZSA9IChuZXdFbnRyeSAhPSBudWxsID8gbmV3RW50cnkuaXNYTUxUeXBlKCkgOiBmYWxzZSk7Ci0JCWJvb2xlYW4gbmV3V01MVHlwZSA9IChuZXdFbnRyeSAhPSBudWxsID8gbmV3RW50cnkuaXNXTUxUeXBlKCkgOiBmYWxzZSk7Ci0KLQkJaWYgKCFuZXdYTUxUeXBlKSB7Ci0JCQkvLyBmaW5kIFhNTCBkZWNsYXJhdGlvbgotCQkJaWYgKGZpbmRYTUxOb2RlKGRvY3VtZW50KSAhPSBudWxsKSB7Ci0JCQkJbmV3WE1MVHlwZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGZpbGUgZXh0ZW5zaW9uCi0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGV4dCA9IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpOwotCQkJCWlmIChleHQgIT0gbnVsbCAmJiBleHQuZXF1YWxzSWdub3JlQ2FzZShYSFRNTCkpIHsKLQkJCQkJbmV3WE1MVHlwZSA9IHRydWU7Ci0JCQkJfQotCi0JCQkJaWYgKGV4dCAhPSBudWxsICYmIGV4dC5lcXVhbHNJZ25vcmVDYXNlKFdNTCkpIHsKLQkJCQkJbmV3WE1MVHlwZSA9IHRydWU7Ci0JCQkJCW5ld1dNTFR5cGUgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJaWYgKG5ld0VudHJ5ID09IG51bGwpIHsKLQkJCS8vIGxvb2t1cCBzeXN0ZW0gZGVmYXVsdAotCQkJaWYgKG5ld1hNTFR5cGUgJiYgbmV3RG9jdW1lbnRUeXBlID09IG51bGwpIHsKLQkJCQkvLyB1c2UgZGVmYXVsdCBYSFRNTCwgaWYgaXQncyBYTUwgYW5kIG5vIGRvY3VtZW50IHR5cGUKLQkJCQkvLyBkZWNsYXJlZAotCQkJCWlmIChuZXdXTUxUeXBlKQotCQkJCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRFbnRyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuREVGQVVMVF9XTUwpOwotCQkJCWVsc2UKLQkJCQkJbmV3RW50cnkgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXREZWZhdWx0RW50cnkoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkRFRkFVTFRfWEhUTUwpOwotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXdFbnRyeSA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERlZmF1bHRFbnRyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuREVGQVVMVF9IVE1MKTsKLQkJCX0KLQkJCWlmIChuZXdFbnRyeSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gZXJyb3IKLQkJfQotCi0JCWlmIChuZXdEb2N1bWVudFR5cGUgPT0gbnVsbCkgewotCQkJRG9jdW1lbnRUeXBlIG9sZERvY3VtZW50VHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQkJaWYgKG9sZERvY3VtZW50VHlwZSA9PSBudWxsIHx8IG9sZERvY3VtZW50VHlwZS5nZXROYW1lKCkgIT0gbmV3RW50cnkuZ2V0TmFtZSgpKSB7Ci0JCQkJLy8gY3JlYXRlIGltcGxpY2l0IERvY3VtZW50VHlwZQotCQkJCURPTUltcGxlbWVudGF0aW9uIGltcGwgPSBkb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQkJCWlmIChpbXBsICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG5hbWUgPSBuZXdFbnRyeS5nZXROYW1lKCk7Ci0JCQkJCXB1YmxpY0lkID0gbmV3RW50cnkuZ2V0UHVibGljSWQoKTsKLQkJCQkJU3RyaW5nIHN5c3RlbUlkID0gbmV3RW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJCQkJbmV3RG9jdW1lbnRUeXBlID0gaW1wbC5jcmVhdGVEb2N1bWVudFR5cGUobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIG5vdGlmeSA9IGZhbHNlOwotCQlpZiAodGhpcy5lbnRyeSAhPSBudWxsKSB7IC8vIGRvIG5vdCBub3RpZnkgb24gaW5pdGlhbGl6YXRpb24KLQkJCW5vdGlmeSA9IChuZXdFbnRyeSAhPSB0aGlzLmVudHJ5IHx8IG5ld1hNTFR5cGUgIT0gdGhpcy5pc1hNTFR5cGUpOwotCQl9Ci0KLQkJaWYgKG5ld0RvY3VtZW50VHlwZSAhPSBudWxsKQotCQkJc2V0RG9jdW1lbnRUeXBlKG5ld0RvY3VtZW50VHlwZSk7Ci0JCXRoaXMuZW50cnkgPSBuZXdFbnRyeTsKLQkJdGhpcy5pc1hNTFR5cGUgPSBuZXdYTUxUeXBlOwotCi0JCWlmIChub3RpZnkpCi0JCQlub3RpZnlEb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJRE9NRG9jdW1lbnRUeXBlIGZpbmREb2N1bWVudFR5cGUoSURPTURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlET01Eb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJaWYgKGRvY3VtZW50VHlwZSAhPSBudWxsICYmIGRvY3VtZW50VHlwZS5nZXRFeGlzdGluZ0FkYXB0ZXIoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJLy8gd2F0Y2ggZnV0dXJlIGNoYW5nZXMKLQkJCWRvY3VtZW50VHlwZS5hZGRBZGFwdGVyKHRoaXMpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBOb2RlIGZpbmRYTUxOb2RlKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyB0YXJnZXQgPSBjaGlsZC5nZXROb2RlTmFtZSgpOwotCQkJaWYgKHRhcmdldCAhPSBudWxsICYmIHRhcmdldC5lcXVhbHMoWE1MKSkgewotCQkJCXJldHVybiBjaGlsZDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJaWYgKGlzWE1MVHlwZSgpKQotCQkJcmV0dXJuIExPV0VSX0NBU0U7IC8vIFhIVE1MCi0JCXJldHVybiB0aGlzLmZGYWN0b3J5LmdldEF0dHJOYW1lQ2FzZSgpOwotCX0KLQotCXByaXZhdGUgSUZpbGUgZ2V0RmlsZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCUlGaWxlIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKGxvY2F0aW9uKTsKLQkJCWlmIChwYXRoLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJCXJlc3VsdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGFnTmFtZUNhc2UoKSB7Ci0JCWlmIChpc1hNTFR5cGUoKSkKLQkJCXJldHVybiBMT1dFUl9DQVNFOyAvLyBYSFRNTAotCQlyZXR1cm4gdGhpcy5mRmFjdG9yeS5nZXRUYWdOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKLQkJaWYgKGZlYXR1cmUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGZlYXR1cmUuZXF1YWxzKEhUTUwpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhTU0kpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmIChmZWF0dXJlLmVxdWFscyhGUkFNRVNFVCkpIHsKLQkJCWlmICh0aGlzLmVudHJ5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRoaXMuZW50cnkuaGFzRnJhbWVzZXQoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNYTUxUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5pc1hNTFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQkJCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKQotCQkJCXJldHVybjsKLQkJfQotCQlkb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MDI4YjAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnksIFByZWZlcmVuY2VzLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCXByaXZhdGUgaW50IHRhZ05hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCXByaXZhdGUgaW50IGF0dHJOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRTsKLQlwcml2YXRlIFByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gbnVsbDsKLQotCS8vIGZvciByZW1vdmFsIGxhdGVyIG9uIHJlbGVhc2UoKQotCXByaXZhdGUgSGFzaE1hcCBmRG9jMkFkYXB0ZXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMucHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQl1cGRhdGVDYXNlcygpOyAvLyBpbml0aWFsaXplCi0JCQl0aGlzLnByZWZlcmVuY2VzLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LiBJdAotCSAqIG1heSBiZSBhIHNpbmdsZXRvbiBvciBub3QgLi4uIGRlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgdGhlCi0JICogSU5vZGVBZGFwdGVyIC4uLiBidXQgaW4gZ2VuZXJhbCBpdCBpcyByZWNvbW1lbmRlZCBmb3IgYW4gYWRhcHRlciB0byBiZQotCSAqIHN0YXRlbGVzcywgc28gdGhlIGVmZmljaWVuY2llcyBvZiBhIHNpbmdsZXRvbiBjYW4gYmUgZ2FpbmVkLgotCSAqIAotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBzaG91bGQgY2FsbCBhZGRBZGFwdGVyIG9uIHRoZSBhZGFwdGVkCi0JICogb2JqZWN0IHdpdGggdGhlIGNvcnJlY3QgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCUlOb2RlQWRhcHRlciByZXN1bHQgPSBudWxsOwotCQkvLyBvbmx5IGFkYXB0IElET01Eb2N1bWVudAotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NRG9jdW1lbnQpIHsKLQotCQkJLy8gaWYgYWxyZWFkeSBoYXMgYW4gYWRhcHRlciwgbm8gbmVlZCB0byByZWNyZWF0ZS9pbml0aWFsaXplLgotCQkJLy8gTm90ZTogdGhpcyBtZWFucyBpZiAiZG9jdHlwZSIgZm9yIERPTSBjaGFuZ2VzLAotCQkJLy8gdGhlRG9jdW1lbnRUeXBlQWRhdHBlciBmb3IgdGhhdCBET00KLQkJCS8vIHNob3VsZCBiZSByZW1vdmVkIChhbmQgcmVsZWFzZWQpIGFuZCBpdCB3aWxsIGJlIHJlLWNyZWF0ZWQgbmV4dAotCQkJLy8gdGltZSByZXF1aXJlZC4KLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgb2xkQWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAob2xkQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gb2xkQWRhcHRlcjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCQotCQkJCS8vIGlmIHRoZXJlIGFscmVhZHkgd2FzIGFuIGFkYXB0ZXIKLQkJCQkvL2lmKGZBZGFwdGVyICE9IG51bGwpIAotCQkJCS8vCWZBZGFwdGVyLnJlbGVhc2UoKTsKLQkJCQkKLQkJCQkvLyBub3RlLCB0aGUgZmFjdG9yeSBpcyBpbmNsdWRlZCBpbiB0aGlzIGNhc2UgdG8gaGF2ZSBhIGNlbnRyYWwgcGxhY2UKLQkJCQkvLyB0byBjb21lIGJhY2sgdG8gZm9yIGNhc2UgcHJlZmVyZW5jZXMuCi0JCQkJcmVzdWx0ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyKChJRE9NRG9jdW1lbnQpIG5vdGlmaWVyLCB0aGlzKTsKLQkJCQlub3RpZmllci5hZGRBZGFwdGVyKHJlc3VsdCk7Ci0JCQkJCi0JCQkJZkRvYzJBZGFwdGVyTWFwLnB1dChub3RpZmllciwgcmVzdWx0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXR0ck5hbWVDYXNlKCkgewotCQlyZXR1cm4gdGhpcy5hdHRyTmFtZUNhc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZUNhc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNGYWN0b3J5Rm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJlZmVyZW5jZXMuUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJaWYgKHByb3BlcnR5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHByb3BlcnR5LmVxdWFscyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKSB8fCBwcm9wZXJ0eS5lcXVhbHMoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpKSB7Ci0JCQl1cGRhdGVDYXNlcygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNhc2VzKCkgewotCQl0aGlzLnRhZ05hbWVDYXNlID0gRG9jdW1lbnRUeXBlQWRhcHRlci5MT1dFUl9DQVNFOwotCQl0aGlzLmF0dHJOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRTsKLQotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCB0YWdDYXNlID0gdGhpcy5wcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSk7Ci0JCWlmICh0YWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJdGhpcy50YWdOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRTsKLQkJZWxzZSBpZiAodGFnQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXRoaXMudGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0U7Ci0JCQotCQlpbnQgYXR0Q2FzZSA9IHRoaXMucHJlZmVyZW5jZXMuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKTsKLQkJaWYgKGF0dENhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQl0aGlzLmF0dHJOYW1lQ2FzZSA9IERvY3VtZW50VHlwZUFkYXB0ZXIuTE9XRVJfQ0FTRTsKLQkJZWxzZSBpZiAoYXR0Q2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikKLQkJCXRoaXMudGFnTmFtZUNhc2UgPSBEb2N1bWVudFR5cGVBZGFwdGVyLlVQUEVSX0NBU0U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJCi0JCWlmKCFmRG9jMkFkYXB0ZXJNYXAuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBkb2NzID0gZkRvYzJBZGFwdGVyTWFwLmtleVNldCgpLnRvQXJyYXkoKTsKLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGRvY3MubGVuZ3RoOyBpKyspIHsKLQkJCQlhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpZkRvYzJBZGFwdGVyTWFwLmdldChkb2NzW2ldKTsKLQkJCQlhZGFwdGVyLnJlbGVhc2UoKTsKLQkJCQkoKElET01Eb2N1bWVudClkb2NzW2ldKS5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCQkJZkRvYzJBZGFwdGVyTWFwLmNsZWFyKCk7Ci0JCX0KLQkJCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NTk2MAotCQlpZiAodGhpcy5wcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQl0aGlzLnByZWZlcmVuY2VzLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYzMyODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotcHVibGljIGludGVyZmFjZSBIVE1MRG9jdW1lbnRUeXBlQ29uc3RhbnRzIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUwgPSAiSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGUkFNRVNFVCA9ICJGUkFNRVNFVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTU0kgPSAiU1NJIjsgLy8kTk9OLU5MUy0xJAotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzI2OGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlRW50cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFR5cGVFbnRyeSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lOwotCXByaXZhdGUgU3RyaW5nIHB1YmxpY0lkOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSTsKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxUeXBlOwotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MVHlwZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNXTUxUeXBlOwotCXByaXZhdGUgYm9vbGVhbiBoYXNGcmFtZXNldDsKLQlwcml2YXRlIFN0cmluZyBkaXNwbGF5TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0WEhUTUw7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRGVmYXVsdFdNTDsKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgWEhUTUxfTkFNRSA9ICJodG1sIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFN0cmluZyBIVE1MX05BTUUgPSAiSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGJvb2xlYW4gdXNlSW50ZXJuYWxNb2RlbCA9IGZhbHNlOwotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeShTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyBuYW1lc3BhY2VVUkksIGJvb2xlYW4gaXNYSFRNTFR5cGUsIGJvb2xlYW4gaGFzRnJhbWVzZXQsIFN0cmluZyBkaXNwbGF5TmFtZSwgYm9vbGVhbiBpc0RlZmF1bHRYSFRNTCwgYm9vbGVhbiBpc0RlZmF1bHRXTUwsIGJvb2xlYW4gaXNXTUxUeXBlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmxlbmd0aCgpID4gMCkgewotCQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChpc1hNTFR5cGUpCi0JCQkJdGhpcy5uYW1lID0gWEhUTUxfTkFNRTsvLyBuZWVkIGNvZGUgZm9yIHdtbD8KLQkJCWVsc2UKLQkJCQl0aGlzLm5hbWUgPSBIVE1MX05BTUU7Ci0JCX0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCQl0aGlzLmlzWE1MVHlwZSA9IGlzWEhUTUxUeXBlIHwgaXNXTUxUeXBlOwotCQl0aGlzLmhhc0ZyYW1lc2V0ID0gaGFzRnJhbWVzZXQ7Ci0JCXRoaXMuZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZTsKLQkJdGhpcy5pc0RlZmF1bHRYSFRNTCA9IGlzRGVmYXVsdFhIVE1MOwotCQl0aGlzLmlzRGVmYXVsdFdNTCA9IGlzRGVmYXVsdFdNTDsKLQkJdGhpcy5pc1hIVE1MVHlwZSA9IGlzWEhUTUxUeXBlOwotCQl0aGlzLmlzV01MVHlwZSA9IGlzV01MVHlwZTsKLQl9Ci0JCi0JSFRNTERvY3VtZW50VHlwZUVudHJ5KFN0cmluZyBuYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgYm9vbGVhbiBpc1hIVE1MVHlwZSwgYm9vbGVhbiBoYXNGcmFtZXNldCwgU3RyaW5nIGRpc3BsYXlOYW1lLCBib29sZWFuIGlzRGVmYXVsdFhIVE1MLCBib29sZWFuIGlzRGVmYXVsdFdNTCwgYm9vbGVhbiBpc1dNTFR5cGUsIGJvb2xlYW4gdXNlSW50ZXJuYWxNb2RlbCkgewotCQl0aGlzKG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbmFtZXNwYWNlVVJJLCBpc1hIVE1MVHlwZSwgaGFzRnJhbWVzZXQsIGRpc3BsYXlOYW1lLCBpc0RlZmF1bHRYSFRNTCwgaXNEZWZhdWx0V01MLCBpc1dNTFR5cGUpOwotCQl0aGlzLnVzZUludGVybmFsTW9kZWwgPSB1c2VJbnRlcm5hbE1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJcmV0dXJuIHRoaXMubmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRoaXMuaXNYTUxUeXBlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc0ZyYW1lc2V0KCkgewotCQlyZXR1cm4gdGhpcy5oYXNGcmFtZXNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgU3RyaW5nIGdldERpc3BsYXlOYW1lKCkgewotCQlyZXR1cm4gdGhpcy5kaXNwbGF5TmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0RlZmF1bHRYSFRNTCgpIHsKLQkJcmV0dXJuIHRoaXMuaXNEZWZhdWx0WEhUTUw7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0V01MKCkgewotCQlyZXR1cm4gdGhpcy5pc0RlZmF1bHRXTUw7Ci0JfQotCi0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1hIVE1MVHlwZSgpIHsKLQkJcmV0dXJuIGlzWEhUTUxUeXBlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzV01MVHlwZSgpIHsKLQkJcmV0dXJuIGlzV01MVHlwZTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gdXNlSW50ZXJuYWxNb2RlbCgpIHsKLQkJcmV0dXJuIHVzZUludGVybmFsTW9kZWw7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2Q3MWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNodGFibGUgZW50cmllcyA9IG51bGw7Ci0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZGVmYXVsdEVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0WEhUTUxFbnRyeSA9IG51bGw7Ci0JcHJpdmF0ZSBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZGVmYXVsdFdNTEVudHJ5ID0gbnVsbDsKLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkZWZhdWx0Q0hUTUxFbnRyeSA9IG51bGw7Ci0KLQlmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfSFRNTCA9IDA7Ci0JZmluYWwgc3RhdGljIGludCBERUZBVUxUX1hIVE1MID0gMTsKLQlmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfV01MID0gMjsKLQlmaW5hbCBzdGF0aWMgaW50IERFRkFVTFRfQ0hUTUwgPSAzOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hUTUxfUFVCTElDX0lEID0gIi0vL1czQy8vRFREIENvbXBhY3QgSFRNTCAxLjAgRHJhZnQvL0VOIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLmVudHJpZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCS8vIEhUTUwgNC4wMQotCQlTdHJpbmcgbmFtZSA9ICJIVE1MIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBwdWJsaWNJZCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3lzdGVtSWQgPSAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkaXNwbGF5TmFtZSA9ICJIVE1MIDQuMDEgVHJhbnNpdGlvbmFsIjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmRlZmF1bHRFbnRyeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBudWxsLCBmYWxzZSwgZmFsc2UsIGRpc3BsYXlOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKLQkJdGhpcy5lbnRyaWVzLnB1dChwdWJsaWNJZCwgdGhpcy5kZWZhdWx0RW50cnkpOwotCQlwdWJsaWNJZCA9ICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VOIjsvLyROT04tTkxTLTEkCi0JCXN5c3RlbUlkID0gImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L3N0cmljdC5kdGQiOy8vJE5PTi1OTFMtMSQKLQkJZGlzcGxheU5hbWUgPSAiSFRNTCA0LjAxIFN0cmljdCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5lbnRyaWVzLnB1dChwdWJsaWNJZCwgbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG51bGwsIGZhbHNlLCBmYWxzZSwgZGlzcGxheU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpKTsKLQkJcHVibGljSWQgPSAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIEZyYW1lc2V0Ly9FTiI7Ly8kTk9OLU5MUy0xJAotCQlzeXN0ZW1JZCA9ICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiOy8vJE5PTi1OTFMtMSQKLQkJZGlzcGxheU5hbWUgPSAiSFRNTCA0LjAxIEZyYW1lc2V0IjsgLy8kTk9OLU5MUy0xJAotCQl0aGlzLmVudHJpZXMucHV0KHB1YmxpY0lkLCBuZXcgSFRNTERvY3VtZW50VHlwZUVudHJ5KG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCwgbnVsbCwgZmFsc2UsIHRydWUsIGRpc3BsYXlOYW1lLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0JCS8vIENIVE1MCi0JCW5hbWUgPSAiSFRNTCI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWNJZCA9IENIVE1MX1BVQkxJQ19JRDsKLQkJZGlzcGxheU5hbWUgPSAiQ29tcGFjdCBIVE1MIDEuMCBEcmFmdCI7IC8vJE5PTi1OTFMtMSQKLQkJdGhpcy5kZWZhdWx0Q0hUTUxFbnRyeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlRW50cnkobmFtZSwgcHVibGljSWQsIG51bGwsIG51bGwsIGZhbHNlLCBmYWxzZSwgZGlzcGxheU5hbWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpOwotCQl0aGlzLmVudHJpZXMucHV0KHB1YmxpY0lkLCB0aGlzLmRlZmF1bHRDSFRNTEVudHJ5KTsKLQotCQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlcigpOwotCQlpZiAocmVhZGVyICE9IG51bGwpCi0JCQlyZWFkZXIucmVhZFJlZ2lzdHJ5KHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVnaXN0KFN0cmluZyBwaWQsIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBkb2N0eXBlKSB7Ci0JCWlmIChwaWQgPT0gbnVsbCB8fCBkb2N0eXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuZW50cmllcy5wdXQocGlkLCBkb2N0eXBlKTsKLQkJaWYgKHRoaXMuZGVmYXVsdFhIVE1MRW50cnkgPT0gbnVsbCkgewotCQkJaWYgKGRvY3R5cGUuaXNEZWZhdWx0WEhUTUwoKSkKLQkJCQl0aGlzLmRlZmF1bHRYSFRNTEVudHJ5ID0gZG9jdHlwZTsKLQkJfQotCQlpZiAodGhpcy5kZWZhdWx0V01MRW50cnkgPT0gbnVsbCkgewotCQkJaWYgKGRvY3R5cGUuaXNEZWZhdWx0V01MKCkpCi0JCQkJdGhpcy5kZWZhdWx0V01MRW50cnkgPSBkb2N0eXBlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBnZXREZWZhdWx0RW50cnkoaW50IHR5cGUpIHsKLQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIERFRkFVTFRfWEhUTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0WEhUTUxFbnRyeTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVGQVVMVF9XTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0V01MRW50cnk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIERFRkFVTFRfQ0hUTUwgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0Q0hUTUxFbnRyeTsKLQkJCQlicmVhazsKLQkJCWNhc2UgREVGQVVMVF9IVE1MIDoKLQkJCWRlZmF1bHQgOgotCQkJCWVudHJ5ID0gdGhpcy5kZWZhdWx0RW50cnk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGVudHJ5OwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRUeXBlRW50cnkgZ2V0RGVmYXVsdEVudHJ5KCkgewotCQlyZXR1cm4gdGhpcy5kZWZhdWx0RW50cnk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFR5cGVFbnRyeSBnZXRYSFRNTERlZmF1bHRFbnRyeSgpIHsKLQkJcmV0dXJuIHRoaXMuZGVmYXVsdFhIVE1MRW50cnk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVudW1lcmF0aW9uIGdldEVudHJpZXMoKSB7Ci0JCXJldHVybiB0aGlzLmVudHJpZXMuZWxlbWVudHMoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTERvY3VtZW50VHlwZUVudHJ5IGdldEVudHJ5KFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAocHVibGljSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgdGhpcy5lbnRyaWVzLmdldChwdWJsaWNJZCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRiZjZlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotCi0vKioKLSAqLwotY2xhc3MgSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5UmVhZGVyIHsKLQotCS8vCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkb2N1bWVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfTkFNRSA9ICJkb2N1bWVudFR5cGUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9QSUQgPSAicHVibGljSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9TSUQgPSAic3lzdGVtSUQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9JU19YSFRNTCA9ICJpc1hIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfV01MID0gImlzV01MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSEFTX0ZSQU1FU0VUID0gImhhc0ZyYW1lc2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfTlNVUkkgPSAibmFtZXNwYWNlVVJJIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfRU5BTUUgPSAiZWxlbWVudE5hbWUiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFUVF9ETkFNRSA9ICJkaXNwbGF5TmFtZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0lTX0RFRkFVTFRfWEhUTUwgPSAiZGVmYXVsdFhIVE1MIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSVNfREVGQVVMVF9XTUwgPSAiZGVmYXVsdFdNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRWX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRWX05VTExfU1RSSU5HID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqLwotCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHJlYWRSZWdpc3RyeShIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnKSB7Ci0JCWlmIChyZWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoUExVR0lOX0lELCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZG9jdHlwZSA9IHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCQkvLyBudWxsIGNhbiBiZSByZXR1cm5lZCBpZiB0aGVyZSdzIGFuIGVycm9yIHJlYWRpbmcgdGhlIGVsZW1lbnQKLQkJCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQkJCXJlZy5yZWdpc3QoZG9jdHlwZS5nZXRQdWJsaWNJZCgpLCBkb2N0eXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxEb2N1bWVudFR5cGVFbnRyeSByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZG9jdHlwZSA9IG51bGw7Ci0JCVN0cmluZyBwaWQgPSBudWxsOwotCQlTdHJpbmcgc2lkID0gbnVsbDsKLQkJU3RyaW5nIG5zdXJpID0gbnVsbDsKLQkJU3RyaW5nIHJvb3QgPSBudWxsOwotCQlib29sZWFuIHhodG1sID0gdHJ1ZTsKLQkJYm9vbGVhbiBmcmFtZXNldCA9IGZhbHNlOwotCQlTdHJpbmcgZG5hbWUgPSBudWxsOwotCQlib29sZWFuIGRlZmF1bHRYaHRtbCA9IGZhbHNlOwotCQlib29sZWFuIGRlZmF1bHRXTUwgPSBmYWxzZTsKLQkJYm9vbGVhbiBpc1dNTCA9IGZhbHNlOwotCi0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlwaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUElEKTsKLQkJCS8vIHB1YmxpY0lEIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkuCi0JCQlpZiAocGlkID09IG51bGwgfHwgcGlkLmVxdWFscyhBVFZfTlVMTF9TVFJJTkcpKQotCQkJCXJldHVybiBudWxsOwotCi0JCQlzaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfU0lEKTsKLQkJCW5zdXJpID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX05TVVJJKTsKLQkJCXJvb3QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRU5BTUUpOwotCQkJeGh0bWwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19YSFRNTCk7Ci0JCQlmcmFtZXNldCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0hBU19GUkFNRVNFVCk7Ci0JCQlkbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ETkFNRSk7Ci0JCQlkZWZhdWx0WGh0bWwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19ERUZBVUxUX1hIVE1MKTsKLQkJCWRlZmF1bHRXTUwgPSBnZXRCb29sZWFuKGVsZW1lbnQsIEFUVF9JU19ERUZBVUxUX1dNTCk7Ci0JCQlpc1dNTCA9IGdldEJvb2xlYW4oZWxlbWVudCwgQVRUX0lTX1dNTCk7Ci0JCQlkb2N0eXBlID0gbmV3IEhUTUxEb2N1bWVudFR5cGVFbnRyeShyb290LCBwaWQsIHNpZCwgbnN1cmksIHhodG1sLCBmcmFtZXNldCwgZG5hbWUsIGRlZmF1bHRYaHRtbCwgZGVmYXVsdFdNTCwgaXNXTUwpOwotCQl9Ci0JCXJldHVybiBkb2N0eXBlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBnZXRCb29sZWFuKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgYXR0KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dCk7Ci0JCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhBVFZfVFJVRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0hUTUxNb2RlbFBhcnNlckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzM2QwOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNNTm9kZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk1vZGVsUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBIVE1MRG9jdW1lbnRJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyIGltcGxlbWVudHMgTW9kZWxQYXJzZXJBZGFwdGVyIHsKLQkvKioKLQkgKiBub3RlOiBJIG1hZGUgcHVibGljLCB0ZW1wYXJpbHksIHNvIGNvdWxkIGJlIHVzZWQgYnkgSlNQTG9hZGVyCi0JICovCi0JcHJvdGVjdGVkIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNob3VsZFRlcm1pbmF0ZUF0KENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGQpIHsKLQkJaWYgKCFwYXJlbnQuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5URVJNSU5BVE9SUykpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWphdmEudXRpbC5JdGVyYXRvciBpID0gKGphdmEudXRpbC5JdGVyYXRvcikgcGFyZW50LmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuVEVSTUlOQVRPUlMpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgbmV4dE5hbWUgPSBjaGlsZC5nZXRFbGVtZW50TmFtZSgpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCS8vIE5PVEU6IENNRWxlbWVudERlY2xhcmF0aW9uIG9mIGNoaWxkIGlzIG5vdCBhbHdheXMgSFRNTENNRWxlbWVudERlY2xhcmF0aW9uLgotCQkJLy8gSXQgbWlnaHQgYmUgb25lIG9mIGJhc2VkIG9uIERURCAoZm9yIFhIVE1MIGVsZW1lbnQpLiAgU28sIGNvbXBhcmlzb24gbXVzdAotCQkJLy8gYmUgcGVyZm9ybWVkIGlnbm9yaW5nIGNhc2UuCi0JCQkvLyAtLSAzLzIwLzIwMDIKLQkJCVN0cmluZyB0ZXJtaW5hdG9yID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpZiAodGVybWluYXRvciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5leHROYW1lLmVxdWFsc0lnbm9yZUNhc2UodGVybWluYXRvcikpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRhaW4oRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJSURPTUVsZW1lbnQgaW1wbCA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLQotCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKCFpbXBsLmlzR2xvYmFsVGFnKCkpCi0JCQkJcmV0dXJuIHRydWU7IC8vIG5vbiBIVE1MIHRhZwotCQkJSURPTUVsZW1lbnQgY2hpbGRFbGVtZW50ID0gKElET01FbGVtZW50KSBjaGlsZDsKLQotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gbXlEZWMgPSBDTU5vZGVVdGlsLmdldEVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChteURlYyA9PSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJLy9pZiAoIShteURlYyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pKSByZXR1cm4gdHJ1ZTsKLQkJCWlmIChteURlYy5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJaWYgKCFjaGlsZEVsZW1lbnQuaXNHbG9iYWxUYWcoKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gbm9uIEhUTUwgdGFnCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZERlYyA9IENNTm9kZVV0aWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKGNoaWxkRWxlbWVudCk7Ci0JCQlpZiAoY2hpbGREZWMgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCS8vaWYgKCEoY2hpbGREZWMgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSkgcmV0dXJuIHRydWU7Ci0KLQkJCWlmIChteURlYyBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQlpZiAoKChCb29sZWFuKSAoKEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIG15RGVjKS5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCWlmIChzaG91bGRUZXJtaW5hdGVBdChteURlYywgY2hpbGREZWMpICYmICFpc1ZhbGlkQ2hpbGQobXlEZWMsIGNoaWxkRGVjKSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQotCQkJU3RyaW5nIHRhZ05hbWUgPSBpbXBsLmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlTdHJpbmcgY2hpbGROYW1lID0gY2hpbGRFbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCWlmIChjaGlsZE5hbWUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCWlmICghaW1wbC5oYXNTdGFydFRhZygpICYmICFpbXBsLmhhc0VuZFRhZygpKSB7Ci0JCQkJLy8gaW1wbGljaXQgZWxlbWVudAotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoY2hpbGRFbGVtZW50LmdldFRhZ05hbWUoKSkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IRUFEKSkgewotCQkJCQlpZiAoIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5NRVRBKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRJVExFKSAmJiAhY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkspICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpICYmICFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSkgJiYgIWNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5JU0lOREVYKSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJSURPTUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJCQlpZiAoIXBhcmVudEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiAhcGFyZW50RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJaWYgKCFjYW5Db250YWluKHBhcmVudEVsZW1lbnQsIGNoaWxkKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0KLQkJCS8vIGNvbnRleHVhbCB0ZXJtaW5hdGlvbiBmb3IgVEFCTEUgY29udGVudCB0YWdzCi0JCQlib29sZWFuIGlzVGFibGVDb250ZW50ID0gZmFsc2U7Ci0JCQlpZiAoY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB8fCBjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEhFQUQpIHx8IGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCkpIHsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlzVGFibGVDb250ZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UUikpIHsKLQkJCQlpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQk9EWSkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5USEVBRCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URk9PVCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlzVGFibGVDb250ZW50ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNoaWxkTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5URCkgfHwgY2hpbGROYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIKSkgewotCQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRSKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRCT0RZKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRIRUFEKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRGT09UKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlRBQkxFKSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJaXNUYWJsZUNvbnRlbnQgPSB0cnVlOwotCQkJfQotCQkJaWYgKGlzVGFibGVDb250ZW50KSB7Ci0JCQkJLy8gVEFCTEUgY29udGVudCB0YWdzIHNob3VsZCB0ZXJtaW5hdGUgbm9uIFRBQkxFIGNvbnRlbnQgdGFncywKLQkJCQkvLyBpZiBpbiBUQUJMRQotCQkJCWZvciAoTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJYnJlYWs7Ci0JCQkJCUlET01FbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCQkJU3RyaW5nIHBhcmVudE5hbWUgPSBwYXJlbnRFbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkJaWYgKHBhcmVudE5hbWUgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAocGFyZW50TmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRSkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuRU1CRUQpKSB7Ci0JCQkJaWYgKCFjaGlsZE5hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTk9FTUJFRCkpCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IGltcGwuZ2V0VGFnTmFtZSgpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCAmJiB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkVNQkVEKSkgewotCQkJCUlET01UZXh0IHRleHQgPSAoSURPTVRleHQpIGNoaWxkOwotCQkJCWlmICghdGV4dC5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkgewotCQkJaWYgKGltcGwuaXNJbXBsaWNpdFRhZygpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsIHx8IGRhdGEgPT0gbnVsbCB8fCBkYXRhLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gY3JlYXRlTWV0YUVsZW1lbnQoZG9jdW1lbnQsIGRhdGEsIGlzSlNQVGFnKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJvdXRpbmUgY3JlYXRlIGFuIGltcGxpY2l0IEVsZW1lbnQgZm9yIGdpdmVuIHBhcmVudCBhbmQgY2hpbGQsCi0JICogc3VjaCBhcyBIVE1MLCBCT0RZLCBIRUFELCBhbmQgVEJPRFkgZm9yIEhUTUwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlSW1wbGljaXRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgY3JlYXRlTWV0YUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKSB7Ci0JCWlmIChkYXRhID09IG51bGwgfHwgZGF0YS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoZGF0YSwgMCwgdHJ1ZSk7IC8vIG9uZSBsaW5lCi0JCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8ICFuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuTUVUQURBVEEpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlib29sZWFuIGlzU3RhcnRTcGFuID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNFbmRTcGFuID0gZmFsc2U7Ci0JCW5hbWUgPSBzY2FubmVyLm5leHROYW1lKCk7Ci0JCXdoaWxlIChuYW1lICE9IG51bGwpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IHNjYW5uZXIubmV4dFZhbHVlKCk7Ci0JCQlpZiAobmFtZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLlRZUEUpKSB7Ci0JCQkJaWYgKHZhbHVlID09IG51bGwpCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkRFU0lHTkVSX0NPTlRST0wpKSB7Ci0JCQkJCXR5cGUgPSBNZXRhRGF0YS5ERVNJR05FUl9DT05UUk9MOwotCQkJCX0KLQkJCQllbHNlIGlmICh2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKE1ldGFEYXRhLkRZTkFNSUNfREFUQSkpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkRZTkFNSUNfREFUQTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAodmFsdWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5BVVRIT1JfVElNRV9WSVNVQUwpKSB7Ci0JCQkJCXR5cGUgPSBNZXRhRGF0YS5BVVRIT1JfVElNRV9WSVNVQUw7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuQU5OT1RBVElPTikpIHsKLQkJCQkJdHlwZSA9IE1ldGFEYXRhLkFOTk9UQVRJT047Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoTWV0YURhdGEuU1RBUlRTUEFOKSkgewotCQkJCWlzU3RhcnRTcGFuID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShNZXRhRGF0YS5FTkRTUEFOKSkgewotCQkJCWlmICghaXNTdGFydFNwYW4pCi0JCQkJCWlzRW5kU3BhbiA9IHRydWU7Ci0JCQl9Ci0JCQluYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQl9Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCFpc1N0YXJ0U3BhbiAmJiAhaXNFbmRTcGFuKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBtZXRhRGF0YSA9IG51bGw7Ci0JCWludCBvZmZzZXQgPSBzY2FubmVyLmdldE5leHRPZmZzZXQoKTsgLy8gc2tpcCBuZXcgbGluZQotCQlpZiAob2Zmc2V0IDwgZGF0YS5sZW5ndGgoKSkKLQkJCW1ldGFEYXRhID0gZGF0YS5zdWJzdHJpbmcob2Zmc2V0KTsKLQkJaWYgKG1ldGFEYXRhID09IG51bGwpCi0JCQltZXRhRGF0YSA9IG5ldyBTdHJpbmcoKTsKLQotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KE1ldGFEYXRhLlBSRUZJWCArIHR5cGUpOwotCi0JCU1ldGFEYXRhQWRhcHRlciBhZGFwdGVyID0gbmV3IE1ldGFEYXRhQWRhcHRlcih0eXBlKTsKLQkJaWYgKGlzU3RhcnRTcGFuKSB7Ci0JCQlpZiAobWV0YURhdGEgIT0gbnVsbCkKLQkJCQlhZGFwdGVyLnNldERhdGEobWV0YURhdGEpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKG1ldGFEYXRhICE9IG51bGwpCi0JCQkJYWRhcHRlci5zZXRFbmREYXRhKG1ldGFEYXRhKTsKLQkJfQotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCWFkYXB0ZXIuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJZWxlbWVudC5zZXRKU1BUYWcoaXNKU1BUYWcpOwotCi0JCXJldHVybiBlbGVtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluZFJvb3ROYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gdGFnIG1hdGNoaW5nIHNob3VsZCBub3QgYmV5b25kIFRBQkxFIHRhZyBleGNlcHQgQk9EWSB0YWcKLQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWSkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5UQUJMRTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJVGFnQWRhcHRlciBhZGFwdGVyID0gKFRhZ0FkYXB0ZXIpIGVsZW1lbnQuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuaXNFbmRUYWcoKTsKLQkJcmV0dXJuIGVsZW1lbnQuaXNFbmRUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gZG8gbm90aGluZyBvbiBub3RpZml5IGNoYW5nZQotCQkvLyBUT0RPOiB0aGlzIG1lYW5zIGdvb2QgY2FuZGlkYXRlIGZvciByZWd1bGFyIHBsYXRmb3JtIGFkYXB0ZXIKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVmFsaWRDaGlsZChDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkKSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBjaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlDTUNvbnRlbnQgY29udGVudCA9IHBhcmVudC5nZXRDb250ZW50KCk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc0NoaWxkKGNvbnRlbnQsIGNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQ2hpbGQoQ01Db250ZW50IGNvbnRlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHRhcmdldCkgewotCQlzd2l0Y2ggKGNvbnRlbnQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJcmV0dXJuIGlzU2FtZURlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY29udGVudCwgdGFyZ2V0KTsKLQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gKChDTUdyb3VwKSBjb250ZW50KS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCUNNTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJCQkJaWYgKGlzU2FtZURlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQsIHRhcmdldCkpCi0JCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCQkJCWlmIChpc0NoaWxkKChDTUNvbnRlbnQpIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCWNvbnRpbnVlOyAvLyBHbyBuZXh0IGNoaWxkLgotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU2FtZURlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGFEZWMsIENNRWxlbWVudERlY2xhcmF0aW9uIG90aGVyRGVjKSB7Ci0JCXJldHVybiBhRGVjLmdldEVsZW1lbnROYW1lKCkgPT0gb3RoZXJEZWMuZ2V0RWxlbWVudE5hbWUoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTc0MTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50Lk1vZGVsUGFyc2VyQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGFkYXB0ZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBvYmplY3QuIEl0Ci0JICogbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdCAuLi4gZGVwZW5kaW5nIG9uIHRoZSBuZWVkcyBvZiB0aGUKLQkgKiBJTm9kZUFkYXB0ZXIgLi4uIGJ1dCBpbiBnZW5lcmFsIGl0IGlzIHJlY29tbWVuZGVkIGZvciBhbiBhZGFwdGVyIHRvIGJlCi0JICogc3RhdGVsZXNzLCBzbyB0aGUgZWZmaWNpZW5jaWVzIG9mIGEgc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICogCi0JICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjYWxsIGFkZEFkYXB0ZXIgb24gdGhlIGFkYXB0ZWQKLQkgKiBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnN0YW5jZSBvZiB0aGUgYWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgbm90aWZpZXIpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAobm90aWZpZXIgIT0gbnVsbCkgewotCQkJaWYgKG5vdGlmaWVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSB7Ci0JCQkJYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCQkJCWlmIChhZGFwdGVyID09IG51bGwpIHsKLQkJCQkJYWRhcHRlciA9IG5ldyBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyKCk7Ci0JCQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm8gc3RhdGUgdG8gY2xlYW51cAotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgY29weSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMyZTE4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1ldGFEYXRhIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQURBVEEgPSAiTUVUQURBVEEiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRZUEUgPSAidHlwZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRTUEFOID0gInN0YXJ0c3BhbiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EU1BBTiA9ICJlbmRzcGFuIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERVNJR05FUl9DT05UUk9MID0gIkRlc2lnbmVyQ29udHJvbCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRFlOQU1JQ19EQVRBID0gIkR5bmFtaWNEYXRhIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JfVElNRV9WSVNVQUwgPSAiQXV0aG9yVGltZVZpc3VhbCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTiA9ICJBbm5vdGF0aW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiTUVUQURBVEE6IjsvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01ldGFEYXRhQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmM0Y2E5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9NZXRhRGF0YUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuVGFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIE1ldGFEYXRhQWRhcHRlciBpbXBsZW1lbnRzIFRhZ0FkYXB0ZXIsIE1ldGFEYXRhIHsKLQotCXByaXZhdGUgSURPTUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgdHlwZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZGF0YSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZW5kRGF0YSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTWV0YURhdGFBZGFwdGVyKFN0cmluZyB0eXBlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJaWYgKHR5cGUuZXF1YWxzKEFOTk9UQVRJT04pKSB7Ci0JCQkJdGhpcy50eXBlID0gQU5OT1RBVElPTjsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUuZXF1YWxzKEFVVEhPUl9USU1FX1ZJU1VBTCkpIHsKLQkJCQl0aGlzLnR5cGUgPSBBVVRIT1JfVElNRV9WSVNVQUw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnR5cGUgPSB0eXBlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNDb21tZW50VGV4dChyZWdpb25UeXBlKSkgewotCQkJCWRhdGEgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWZvciAoOyBvZmZzZXQgPCBsZW5ndGg7IG9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSBkYXRhLmNoYXJBdChvZmZzZXQpOwotCQkJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpIHsKLQkJCQlvZmZzZXQrKzsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlmb3IgKDsgb2Zmc2V0IDwgbGVuZ3RoOyBvZmZzZXQrKykgewotCQkJY2hhciBjID0gZGF0YS5jaGFyQXQob2Zmc2V0KTsKLQkJCWlmIChjICE9ICdccicgJiYgYyAhPSAnXG4nKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudFRleHQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmVzdWx0ID0gaXNET01Db21tZW50KHJlZ2lvblR5cGUpIHx8IGlzTmVzdGVkQ29udGVudENvbW1lbnQocmVnaW9uVHlwZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkQ29udGVudENvbW1lbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJZmluYWwgU3RyaW5nIEpTUF9DT01NRU5UX1RFWFQgPSAiSlNQX0NPTU1FTlRfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9DT01NRU5UX1RFWFQpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RPTUNvbW1lbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJcmV0dXJuIHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLQkJaWYgKHRoaXMuZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLmVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMuZGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZGF0YTsKLQkJcmV0dXJuIGdldERhdGEoZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERlbGltaXRlcihJRE9NTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGRlbGltID0gbnVsbDsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpCi0JCQkJZGVsaW0gPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcigpOwotCQl9Ci0JCWlmIChkZWxpbSA9PSBudWxsKQotCQkJZGVsaW0gPSAiXHJcbiI7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZGVsaW07Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmREYXRhKCkgewotCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMuZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMuZW5kRGF0YSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMuZW5kRGF0YTsKLQkJcmV0dXJuIGdldERhdGEoZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQoIjwlLS0iKTsvLyROT04tTkxTLTEkCi0JCWVsc2UKLQkJCWJ1ZmZlci5hcHBlbmQoIjwhLS0iKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoTUVUQURBVEEpOwotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoVFlQRSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIj1cIiIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZCh0aGlzLnR5cGUpOwotCQlidWZmZXIuYXBwZW5kKCJcIiAiKTsvLyROT04tTkxTLTEkCi0JCWJ1ZmZlci5hcHBlbmQoTWV0YURhdGEuRU5EU1BBTik7Ci0JCVN0cmluZyBkYXRhID0gZ2V0RW5kRGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgZGVsaW0gPSBnZXREZWxpbWl0ZXIoZWxlbWVudC5nZXRNb2RlbCgpKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGVsaW0pOwotCQl9Ci0JCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCItLSU+Iik7Ly8kTk9OLU5MUy0xJAotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCItLT4iKTsvLyROT04tTkxTLTEkCi0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgiPCUtLSIpOy8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgiPCEtLSIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChNRVRBREFUQSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJYnVmZmVyLmFwcGVuZChUWVBFKTsKLQkJYnVmZmVyLmFwcGVuZCgiPVwiIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKHRoaXMudHlwZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoIlwiICIpOy8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChNZXRhRGF0YS5TVEFSVFNQQU4pOwotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJU3RyaW5nIGRlbGltID0gZ2V0RGVsaW1pdGVyKGVsZW1lbnQuZ2V0TW9kZWwoKSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCQlidWZmZXIuYXBwZW5kKGRlbGltKTsKLQkJfQotCQlpZiAoZWxlbWVudC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZCgiLS0lPiIpOy8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJYnVmZmVyLmFwcGVuZCgiLS0+Iik7Ly8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiB0aGlzLnR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gVGFnQWRhcHRlci5jbGFzcyB8fCB0eXBlID09IE1ldGFEYXRhQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCWlmICh0aGlzLmVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMuZWxlbWVudC5oYXNTdGFydFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5lbGVtZW50Lmhhc0VuZFRhZygpKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0aGlzLmRhdGEgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICh0aGlzLmVuZERhdGEgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSdW50aW1lQ29udGFpbmVyKCkgewotCQlyZXR1cm4gKHRoaXMudHlwZSA9PSBBTk5PVEFUSU9OIHx8IHRoaXMudHlwZSA9PSBBVVRIT1JfVElNRV9WSVNVQUwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERhdGEoU3RyaW5nIGRhdGEpIHsKLQkJdGhpcy5kYXRhID0gZGF0YTsKLQotCQlpZiAodGhpcy5lbGVtZW50ICE9IG51bGwpCi0JCQl0aGlzLmVsZW1lbnQubm90aWZ5U3RhcnRUYWdDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kRGF0YShTdHJpbmcgZGF0YSkgewotCQl0aGlzLmVuZERhdGEgPSBkYXRhOwotCi0JCWlmICh0aGlzLmVsZW1lbnQgIT0gbnVsbCkKLQkJCXRoaXMuZWxlbWVudC5ub3RpZnlFbmRUYWdDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0KLQkJaWYgKHRoaXMuZWxlbWVudCAhPSBudWxsKSB7Ci0JCQl0aGlzLmVsZW1lbnQuc2V0Q29tbWVudFRhZyh0cnVlKTsKLQkJCWlmICh0aGlzLnR5cGUgIT0gTWV0YURhdGEuQU5OT1RBVElPTikgewotCQkJCXRoaXMuZWxlbWVudC5zZXRKU1BUYWcodHJ1ZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSdW50aW1lU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5lbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc1J1bnRpbWVDb250YWluZXIoKSkKLQkJCXJldHVybjsKLQotCQlJRE9NTW9kZWwgbW9kZWwgPSB0aGlzLmVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IG9mZnNldCA9IHRoaXMuZWxlbWVudC5nZXRTdGFydEVuZE9mZnNldCgpOwotCQlpbnQgZW5kID0gdGhpcy5lbGVtZW50LmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBvZmZzZXQ7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChtb2RlbCwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2UwYmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UYWdTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIFRhZ1NjYW5uZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnID0gbnVsbDsKLQlwcml2YXRlIGludCBvZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBib29sZWFuIG9uZUxpbmUgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCVRhZ1NjYW5uZXIoU3RyaW5nIHRhZywgaW50IG9mZnNldCkgewotCQlzdXBlcigpOwotCi0JCXRoaXMudGFnID0gdGFnOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJaWYgKHRhZyAhPSBudWxsKQotCQkJdGhpcy5sZW5ndGggPSB0YWcubGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JVGFnU2Nhbm5lcihTdHJpbmcgdGFnLCBpbnQgb2Zmc2V0LCBib29sZWFuIG9uZUxpbmUpIHsKLQkJdGhpcyh0YWcsIG9mZnNldCk7Ci0KLQkJdGhpcy5vbmVMaW5lID0gb25lTGluZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0TmV4dE9mZnNldCgpIHsKLQkJZm9yICg7IHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGg7IHRoaXMub2Zmc2V0KyspIHsKLQkJCWNoYXIgYyA9IHRoaXMudGFnLmNoYXJBdCh0aGlzLm9mZnNldCk7Ci0JCQlpZiAoIWlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzRW5kKGNoYXIgYykgewotCQlyZXR1cm4gKHRoaXMub25lTGluZSAmJiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICc9Jyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyInIHx8IGMgPT0gJ1wnJyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCVN0cmluZyBuZXh0TmFtZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKG5leHRDaGFyKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBuYW1lT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpIHx8IGlzU3BhY2UoYykpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoaXNFcXVhbChjKSAmJiB0aGlzLm9mZnNldCA+IG5hbWVPZmZzZXQpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKHRoaXMub2Zmc2V0ID09IG5hbWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKG5hbWVPZmZzZXQsIHRoaXMub2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJpbmcgbmV4dFZhbHVlKCkgewotCQlpZiAodGhpcy50YWcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5vZmZzZXQgPj0gdGhpcy5sZW5ndGgpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQljaGFyIHNlcGVyYXRvciA9IG5leHRDaGFyKCk7Ci0JCWlmICghaXNFcXVhbChzZXBlcmF0b3IpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXRoaXMub2Zmc2V0Kys7IC8vIHNraXAgJz0nCi0JCWNoYXIgcXVvdGUgPSBuZXh0Q2hhcigpOwotCQlpZiAocXVvdGUgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaXNRdW90ZShxdW90ZSkpCi0JCQl0aGlzLm9mZnNldCsrOwotCQllbHNlCi0JCQlxdW90ZSA9IDA7Ci0KLQkJaW50IHZhbHVlT2Zmc2V0ID0gdGhpcy5vZmZzZXQ7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKSB7Ci0JCQkJcXVvdGUgPSAwOwotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKHF1b3RlID09IDApIHsKLQkJCQlpZiAoaXNTcGFjZShjKSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoYyA9PSBxdW90ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHZhbHVlRW5kID0gdGhpcy5vZmZzZXQ7Ci0JCWlmIChxdW90ZSAhPSAwICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGgpCi0JCQl0aGlzLm9mZnNldCsrOwotCQlpZiAodmFsdWVFbmQgPT0gdmFsdWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKHZhbHVlT2Zmc2V0LCB2YWx1ZUVuZCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Vbmtub3duVGFnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Vua25vd25UYWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZmNmNGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Vua25vd25UYWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFVua25vd25UYWdBZGFwdGVyIGltcGxlbWVudHMgVGFnQWRhcHRlciB7Ci0KLQlwcml2YXRlIFN0cmluZyBzdGFydFRhZyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZW5kVGFnID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBVbmtub3duVGFnQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB0YWcgPSBudWxsOwotCQlpZiAodGhpcy5lbmRUYWcgIT0gbnVsbCkgewotCQkJdGFnID0gdGhpcy5lbmRUYWc7Ci0JCQl0aGlzLmVuZFRhZyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHRhZzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IG51bGw7Ci0JCWlmICh0aGlzLnN0YXJ0VGFnICE9IG51bGwpIHsKLQkJCXRhZyA9IHRoaXMuc3RhcnRUYWc7Ci0JCQl0aGlzLnN0YXJ0VGFnID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gdGFnOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFRhZ0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0RW5kVGFnKFN0cmluZyBlbmRUYWcpIHsKLQkJdGhpcy5lbmRUYWcgPSBlbmRUYWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnRUYWcoU3RyaW5nIHN0YXJ0VGFnKSB7Ci0JCXRoaXMuc3RhcnRUYWcgPSBzdGFydFRhZzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDI0MmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBhcnNlcyBiZWdpbm5pbmcgcG9ydGlvbiBvZiBIVE1MIGZpbGUgdG8gZ2V0IHRoZSBlbmNvZGluZyB2YWx1ZQotICogaW4gYSBNRVRBIHRhZy4gRXhhbXBsZToKLSAqIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotICogCi0gKiBOb3RlOiBldmVuIHRob3VnaCwgdGVjaG5pY2FsbHksIGEgTUVUQSB0YWcgbXVzdCBjb21lIGluIGEgPEhFQUQ+dGFnLCB3ZQotICogZG9uJ3QgY2hlY2sgZm9yIHRoYXQsIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgd2hhdGV2ZXIsIG9yIHdoZXJlZXZlciwgdGhlCi0gKiB0aGUgZmlyc3QgPE1FVEE+dGFnIGlzLCBpdCBpcyB0aGUgb25lIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHVzZXIsIGFuZAotICogdGhleSBtYXkganVzdCBiZSB0cnlpbmcgdG8gcmVwYWlyIHRoZSBlcnJvci4gVGhlIEhUTUwgdmFsaWRhdG9yIHdpbGwgdGVsbAotICogdGhlbSBpZiBpdHMgaW4gdGhlIHdyb25nIGxvY2F0aW9uLgotICogIAotICovCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgSFRNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElEb2N1bWVudENoYXJzZXREZXRlY3RvciB7Ci0KLQotCXB1YmxpYyBIVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlzZXQobmV3IERvY3VtZW50UmVhZGVyKGRvY3VtZW50LCAwKSk7Ci0KLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViZDBhNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL0hUTUxEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdHdWVzc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTE1vZGVsUGFyc2VyQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLkhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzLlN0eWxlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnRleHQuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlByb3BhZ2F0aW5nQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQWJzdHJhY3REb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm9wYWdhdGUuUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgSFRNTERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgdGFnIG5hbWVzIHVzaW5nIEJsb2NrTWFya2VyIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhUTUxpc2hUYWcoWE1MU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ25hbWUpIHsKLQkJQmxvY2tNYXJrZXIgYm0gPSBuZXcgQmxvY2tNYXJrZXIodGFnbmFtZSwgbnVsbCwgRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBmYWxzZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBlbmNvZGluZy4gRm9yIEhUTUwsIHRoZXJlIGlzIG5vIHNwZWMuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gc3RyaW5nCi0JICogICAgICAgICAgICBieXRlW10KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICBpbnQKLQkgKiAKLQkgKiBEbyBhdXRvbWF0aWMgZW5jb2RpbmcgZGV0ZWN0aW9uIGJ5IGd1ZXNzCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbmNvZGluZ05hbWVCeUd1ZXNzKGJ5dGVbXSBzdHJpbmcsIGludCBsZW5ndGgpIHsKLQkJZmluYWwgU3RyaW5nIGlhbmFFbmMgPSBFbmNvZGluZ0d1ZXNzZXIuZ3Vlc3NFbmNvZGluZyhzdHJpbmcsIGxlbmd0aCk7Ci0JCXJldHVybiBpYW5hRW5jOwotCX0KLQotCS8qCi0JICogQHNlZSBBYnN0cmFjdExvYWRlciNjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKQotCSAqLwotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgc3RydWN0dXJlZERvY3VtZW50KS5zZXRSZVBhcnNlcihuZXcgWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIoKSk7Ci0KLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZGVsTG9hZGVyI2dldFBhcnNlcigpCi0JICovCi0JcHVibGljIFJlZ2lvblBhcnNlciBnZXRQYXJzZXIoKSB7Ci0JCVhNTFNvdXJjZVBhcnNlciBwYXJzZXIgPSBuZXcgWE1MU291cmNlUGFyc2VyKCk7Ci0JCS8vIGZvciB0aGUgInN0YXRpYyBIVE1MIiBjYXNlLCB3ZSBuZWVkIHRvIGluaXRpYWxpemUKLQkJLy8gQmxvY2t0YWdzIGhlcmUuCi0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic2NyaXB0Iik7IC8vJE5PTi1OTFMtMSQKLQkJYWRkSFRNTGlzaFRhZyhwYXJzZXIsICJzdHlsZSIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gdGhvc2UgZmFjdG9yaWVzIHdoaWNoIG11c3QgYmUgYXR0YWNoZWQgdG8gdGhlCi0JICogc3RydWN0dXJlZE1vZGVsIGJlZm9yZSBjb250ZW50IGlzIGFwcGxpZWQuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG51bGw7Ci0JCWZhY3RvcnkgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBuZXcgSFRNTERvY3VtZW50VHlwZUFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCWZhY3RvcnkgPSBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkvLwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCQlpZiAoZGVsaW1pdGVyID09IG51bGwpCi0JCQlkZWxpbWl0ZXIgPSBzdXBlci5nZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKGZpbGUpOwotCQlyZXR1cm4gZGVsaW1pdGVyOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlpZiAoZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yID0gbmV3IEhUTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByZUxvYWRBZGFwdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBETVc6IGp1c3QgYWRkZWQgdGhpcyBwcmVsb2FkIG9uIDgvMTYvMjAwMgotCQkvLyBJIG5vdGljZWQgdGhlIFByb2FnYXRpbmdBZGFwdGVyRmFjdG9yeSB3YXMgYmVpbmcgYWRkZWQsCi0JCS8vIHRoYXQgdGhhdCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJBZGFwdGVyIHdhcyBub3QgYmVpbmcKLQkJLy8gcHJlbG9hZCBhZGFwdGVkIC0tIEknbSBhc3N1aW5nIGl0IEFMV0FZUyBoYXMgdG8gYmUuCi0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9IVE1MTW9kZWxMb2FkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4NGZjOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSFRNTE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NU3R5bGVNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3MuU3R5bGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuRGVidWdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlLlByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxNb2RlbExvYWRlciBleHRlbmRzIEFic3RyYWN0TW9kZWxMb2FkZXIgewotCi0KLQlwdWJsaWMgSFRNTE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgdGFnIG5hbWVzIHVzaW5nIEJsb2NrTWFya2VyIG9iamVjdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEhUTUxpc2hUYWcoWE1MU291cmNlUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ25hbWUpIHsKLQkJQmxvY2tNYXJrZXIgYm0gPSBuZXcgQmxvY2tNYXJrZXIodGFnbmFtZSwgbnVsbCwgRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBmYWxzZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKSB7Ci0JCURPTVN0eWxlTW9kZWxJbXBsIG1vZGVsID0gbmV3IERPTVN0eWxlTW9kZWxJbXBsKCk7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJZmFjdG9yeSA9IFN0eWxlQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IG5ldyBIVE1MRG9jdW1lbnRUeXBlQWRhcHRlckZhY3RvcnkoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJZmFjdG9yeSA9IEhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCS8vCi0JCWZhY3RvcnkgPSBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCi0JCWZhY3RvcnkgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwoKTsKLQkJcmVzdWx0LmFkZChmYWN0b3J5KTsKLQkJCi0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJc3VwZXIucHJlTG9hZEFkYXB0KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCS8vIERNVzoganVzdCBhZGRlZCB0aGlzIHByZWxvYWQgb24gOC8xNi8yMDAyCi0JCS8vIEkgbm90aWNlZCB0aGUgUHJvYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHdhcyBiZWluZyBhZGRlZCwKLQkJLy8gdGhhdCB0aGF0IHRoZSBQcm9hZ2F0aW5nQWRhcHRlckFkYXB0ZXIgd2FzIG5vdCBiZWluZwotCQkvLyBwcmVsb2FkIGFkYXB0ZWQgLS0gSSdtIGFzc3VpbmcgaXQgQUxXQVlTIGhhcyB0byBiZS4KLQkJSURPTU1vZGVsIGRvbU1vZGVsID0gKElET01Nb2RlbCkgc3RydWN0dXJlZE1vZGVsOwotCQkvLyBpZiB0aGVyZSBpcyBhIG1vZGVsIGluIHRoZSBhZGFwdGVyLCB0aGlzIHdpbGwgYWRhcHQgaXQgdG8KLQkJLy8gZmlyc3Qgbm9kZS4gQWZ0ZXIgdGhhdCB0aGUgUHJvcGFnYXRpbmdBZGF0ZXIgc3ByZWFkcyBvdmVyIHRoZQotCQkvLyBjaGlsZHJlbiBiZWluZwotCQkvLyBjcmVhdGVkLiBFYWNoIHRpbWUgdGhhdCBoYXBwZW5kcywgYSBzaWRlIGVmZmVjdCBpcyB0bwotCQkvLyBhbHNvICJzcHJlYWQiIHNwcmVjaWZpYyByZWdpc3RlcmVkIGFkYXB0ZXJzLAotCQkvLyB0aGV5IHR3byBjYW4gcHJvcGlnYXRlIGlzIG5lZWRlZC4KLQkJKChJTm9kZU5vdGlmaWVyKSBkb21Nb2RlbC5nZXREb2N1bWVudCgpKS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cykgewotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkpOwotCQl9CX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgSFRNTE1vZGVsTG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBIVE1MRG9jdW1lbnRMb2FkZXIoKTsKLQkJfQotCQlyZXR1cm4gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9FbWJlZGRlZENTU0Zvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9FbWJlZGRlZENTU0Zvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQ5MDZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvRW1iZWRkZWRDU1NGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmZvcm1hdC5DU1NTb3VyY2VGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLQotLy8gbmFrYW1vcmlfVE9ETzogY2hlY2sgYW5kIHJlbW92ZQotCi1wdWJsaWMgY2xhc3MgRW1iZWRkZWRDU1NGb3JtYXR0ZXIgZXh0ZW5kcyBIVE1MRm9ybWF0dGVyIHsKLQotCS8vcHJpdmF0ZSBJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDU1NTb3VyY2VGb3JtYXR0ZXJGYWN0b3J5KENTU1NvdXJjZUZvcm1hdHRlci5jbGFzcywgdHJ1ZSk7Ci0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEVtYmVkZGVkQ1NTRm9ybWF0dGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NVGV4dCB0ZXh0ID0gKElET01UZXh0KSBub2RlOwotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRDU1NDb250ZW50KG5vZGUpOwotCQlpZiAoc291cmNlID09IG51bGwpIHsgLy8gZmFsbGJhY2sKLQkJCXNvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gdGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gdGV4dC5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQkJcmVwbGFjZVNvdXJjZSh0ZXh0LmdldE1vZGVsKCksIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCQlzZXRXaWR0aChjb250cmFpbnRzLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENTU0NvbnRlbnQoSURPTU5vZGUgdGV4dCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbCh0ZXh0KTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgYWRhcHRlcjsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5mb3JtYXQoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUNTU01vZGVsIGdldENTU01vZGVsKElET01Ob2RlIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRBZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVTaGVldEFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxFbGVtZW50Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxFbGVtZW50Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YzNhN2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRWxlbWVudEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkNTU1NvdXJjZUZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NOb2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50Rm9ybWF0dGVyIGV4dGVuZHMgSFRNTEZvcm1hdHRlciB7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTEVsZW1lbnRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbXByZXNzVGFpbGluZ1NwYWNlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCWludCBjb3VudCA9IHJlZ2lvbi5nZXRFbmQoKSAtIG9mZnNldDsKLQkJaWYgKGNvdW50ID09IDEpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBmbGF0Tm9kZS5nZXRGdWxsVGV4dChyZWdpb24pOwotCQkJaW50IHN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmNoYXJBdChvZmZzZXQgLSBzdGFydCkgPT0gJyAnKSB7Ci0JCQkJLy8gbm90aGluZyB0byBkbwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlyZXBsYWNlU291cmNlKGZsYXROb2RlLCBvZmZzZXQsIGNvdW50LCAiICIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgZm9ybWF0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJTm9kZSBsYXN0Q2hpbGQgPSBlbGVtZW50LmdldExhc3RDaGlsZCgpOwotCi0JCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCAmJiBsYXN0Q2hpbGQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCAmJiBsYXN0Q2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImpzcDpzY3JpcHRsZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbnNlcnRCcmVha0FmdGVyKChJRE9NRWxlbWVudCkgbGFzdENoaWxkLCBjb250cmFpbnRzKTsKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSB8fCBlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQlTdHJpbmcgZW5kVGFnID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChlbmRUYWcgIT0gbnVsbCAmJiBlbmRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgZW5kVGFnKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHByZXZSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRSb290VGFnKHByZXZSZWdpb24uZ2V0VHlwZSgpKSkpIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCXByZXZSZWdpb24gPSByZWdpb247Ci0JCX0KLQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRSb290VGFnKHByZXZSZWdpb24uZ2V0VHlwZSgpKSkpIHsKLQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJfQotCi0JCS8vIEJVRzEyMzg5MCAoZW5kIHRhZyBsZW5ndGggd2FzIGFscmVhZHkgcHJlZmFjdG9yZWQgaW50bwotCQkvLyBmb3JtYXRTdGFydFRhZyBzbyBubyBuZWVkIHRvIGRvIGl0IGhlcmUpCi0JCS8vIFN0cmluZyBuZXdFbmRUYWcgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkvLyBpZiAobmV3RW5kVGFnICE9IG51bGwgJiYgbmV3RW5kVGFnLmxlbmd0aCgpID4gMCkgewotCQkvLyBzZXRXaWR0aChjb250cmFpbnRzLCBuZXdFbmRUYWcpOwotCQkvLwkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdE5vZGUoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCi0JCWZvcm1hdFN0YXJ0VGFnKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCi0JCWZvcm1hdENoaWxkTm9kZXMoZWxlbWVudCwgY29udHJhaW50cyk7Ci0KLQkJZm9ybWF0RW5kVGFnKGVsZW1lbnQsIGNvbnRyYWludHMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRTdGFydFRhZyhJRE9NRWxlbWVudCBlbGVtZW50LCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0KLQkJaWYgKGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoImpzcDpzY3JpcHRsZXQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlpbnNlcnRCcmVha0JlZm9yZShlbGVtZW50LCBjb250cmFpbnRzKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIFdlIHNob3VsZCBmb3JtYXQgYXR0cmlidXRlcyBpbiBKU1BUYWc/Ci0JCS8vIGlmIChlbGVtZW50LmlzSlNQVGFnKCkgfHwgZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJU3RyaW5nIHN0YXJ0VGFnID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwgJiYgc3RhcnRUYWcubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgc3RhcnRUYWcpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZmlyc3QgcHJvY2VzcyBzdHlsZSBhdHRyaWJ1dGUKLQkJaWYgKGVsZW1lbnQuaXNHbG9iYWxUYWcoKSkgewotCQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCJzdHlsZSIpOy8vJE5PTi1OTFMtMSQKLQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJZm9ybWF0U3R5bGVBdHRyKGF0dHIpOwotCQl9Ci0JCWJvb2xlYW4gaW5zZXJ0QnJlYWsgPSBmYWxzZTsKLQkJaW5zZXJ0QnJlYWsgPSAoKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwpIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpLmdldFNwbGl0TXVsdGlBdHRycygpOwotCi0JCWlmIChpbnNlcnRCcmVhaykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzID09IG51bGwgfHwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKSA8IDIpCi0JCQkJaW5zZXJ0QnJlYWsgPSBmYWxzZTsKLQkJfQotCQlTdHJpbmcgYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhlbGVtZW50KTsKLQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudCgpOwotCQlpZiAoaW5kZW50ICE9IG51bGwgJiYgaW5kZW50Lmxlbmd0aCgpID4gMCkgewotCQkJYnJlYWtTcGFjZXMgKz0gaW5kZW50OwotCQl9Ci0JCUlUZXh0UmVnaW9uIGxhc3RCcmVha1JlZ2lvbiA9IG51bGw7Ci0KLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJY29udGludWU7Ci0KLQkJCUlUZXh0UmVnaW9uIGJyZWFrUmVnaW9uID0gbnVsbDsKLQotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWcocmVnaW9uVHlwZSkpIHsKLQkJCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQkJCXJlbW92ZVRhaWxpbmdTcGFjZXMoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZSZWdpb24pOwotCQkJCX0KLQkJCQlicmVha1JlZ2lvbiA9IHJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSkgewotCQkJCQkvLyBhdHRyaWJ1dGUgbmFtZSB3aXRob3V0IHZhbHVlCi0JCQkJCWJyZWFrUmVnaW9uID0gcHJldlJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcHJldlJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCAmJiBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCQlyZW1vdmVUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwcmV2UmVnaW9uKTsKLQkJCQl9Ci0JCQkJYnJlYWtSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykpIHsKLQkJCQkJLy8gYXR0cmlidXRlIG5hbWUgd2l0aG91dCB2YWx1ZQotCQkJCQlicmVha1JlZ2lvbiA9IHByZXZSZWdpb247Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoYnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBlbmQgPSBicmVha1JlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJaWYgKGxhc3RCcmVha1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCBvZmZzZXQgPSBsYXN0QnJlYWtSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJCWludCBjb3VudCA9IGVuZCAtIG9mZnNldDsKLQkJCQkJaWYgKGluc2VydEJyZWFrIHx8ICFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIGNvdW50ICsgMSkpIHsKLQkJCQkJCXJlcGxhY2VUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24sIGJyZWFrU3BhY2VzKTsKLQkJCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWNvbXByZXNzVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uKTsKLQkJCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCQl9Ci0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvdW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGVuZCk7Ci0JCQkJfQotCQkJCWxhc3RCcmVha1JlZ2lvbiA9IGJyZWFrUmVnaW9uOwotCQkJfQotCi0JCQlwcmV2UmVnaW9uID0gcmVnaW9uOwotCQl9Ci0JCWlmIChwcmV2UmVnaW9uICE9IG51bGwgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCBwcmV2UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykpIHsKLQkJCS8vIGF0dHJpYnV0ZSBuYW1lIHdpdGhvdXQgdmFsdWUKLQkJCWludCBlbmQgPSBwcmV2UmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCWlmIChsYXN0QnJlYWtSZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBsYXN0QnJlYWtSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJaW50IGNvdW50ID0gZW5kIC0gb2Zmc2V0OwotCQkJCWlmIChpbnNlcnRCcmVhayB8fCAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCBjb3VudCArIDEpKSB7Ci0JCQkJCXJlcGxhY2VUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24sIGJyZWFrU3BhY2VzKTsKLQkJCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29tcHJlc3NUYWlsaW5nU3BhY2VzKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBsYXN0QnJlYWtSZWdpb24pOwotCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQl9Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgY291bnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgZW5kKTsKLQkJCX0KLQkJCWxhc3RCcmVha1JlZ2lvbiA9IHByZXZSZWdpb247Ci0JCX0KLQotCQlpZiAobGFzdEJyZWFrUmVnaW9uICE9IG51bGwpIHsKLQkJCWludCBvZmZzZXQgPSBsYXN0QnJlYWtSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJaW50IGNvdW50ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkgLSBvZmZzZXQ7Ci0JCQlpZiAocHJldlJlZ2lvbiAhPSBudWxsICYmIHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCWNvbXByZXNzVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uKTsKLQkJCQljb3VudCsrOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVtb3ZlVGFpbGluZ1NwYWNlcyhzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgbGFzdEJyZWFrUmVnaW9uKTsKLQkJCQkvLyBCVUcxMjM4OTAgKHByZS1mYWN0b3IgaW4gZW5kIHRhZykKLQkJCQljb3VudCArPSBlbGVtZW50LmdldFRhZ05hbWUoKS5sZW5ndGgoKSArIDM7Ci0JCQl9Ci0JCQlhZGRXaWR0aChjb250cmFpbnRzLCBjb3VudCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRXaWR0aChjb250cmFpbnRzLCBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ESVJFQ1RJVkVfTkFNRSA9ICJKU1BfRElSRUNUSVZFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZS5lcXVhbHMoSlNQX1JPT1RfVEFHX05BTUUpIHx8IHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfTkFNRSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RlZFJvb3RUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJZmluYWwgU3RyaW5nIEpTUF9ST09UX1RBR19OQU1FID0gIkpTUF9ST09UX1RBR19OQU1FIjsgLy8kTk9OLU5MUy0xJAotCQlib29sZWFuIHJlc3VsdCA9IHJlZ2lvblR5cGUuZXF1YWxzKEpTUF9ST09UX1RBR19OQU1FKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBmb3JtYXRTdHlsZUF0dHIoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyB2YWx1ZSA9IGdldENTU1ZhbHVlKGF0dHIpOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG9sZFZhbHVlID0gKChJRE9NTm9kZSkgYXR0cikuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJaWYgKG9sZFZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkKLQkJCXJldHVybjsKLQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJQ1NTTW9kZWwgZ2V0Q1NTTW9kZWwoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIShhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgc3R5bGVBZGFwdGVyID0gKElTdHlsZURlY2xhcmF0aW9uQWRhcHRlcikgYWRhcHRlcjsKLQkJcmV0dXJuIHN0eWxlQWRhcHRlci5nZXRNb2RlbCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENTU1ZhbHVlKEF0dHIgYXR0cikgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRDU1NNb2RlbChhdHRyKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUNTU05vZGUgZG9jdW1lbnQgPSBtb2RlbC5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGRvY3VtZW50OwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoQ1NTU291cmNlRm9ybWF0dGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDU1NTb3VyY2VGb3JtYXR0ZXIgZm9ybWF0dGVyID0gKENTU1NvdXJjZUZvcm1hdHRlcikgYWRhcHRlcjsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IGZvcm1hdHRlci5mb3JtYXQoZG9jdW1lbnQpOwotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVUYWlsaW5nU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJaW50IGNvdW50ID0gcmVnaW9uLmdldEVuZCgpIC0gb2Zmc2V0OwotCQlpZiAoY291bnQgPD0gMCkKLQkJCXJldHVybjsKLQkJcmVwbGFjZVNvdXJjZShmbGF0Tm9kZSwgb2Zmc2V0LCBjb3VudCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VUYWlsaW5nU3BhY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbiwgU3RyaW5nIHNwYWNlcykgewotCQlpbnQgb2Zmc2V0ID0gcmVnaW9uLmdldFRleHRFbmQoKTsKLQkJaW50IGNvdW50ID0gcmVnaW9uLmdldEVuZCgpIC0gb2Zmc2V0OwotCQlpZiAoY291bnQgPT0gc3BhY2VzLmxlbmd0aCgpKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZmxhdE5vZGUuZ2V0RnVsbFRleHQocmVnaW9uKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCAmJiBzb3VyY2UuZW5kc1dpdGgoc3BhY2VzKSkgewotCQkJCS8vIG5vdGhpbmcgdG8gZG8KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJcmVwbGFjZVNvdXJjZShmbGF0Tm9kZSwgb2Zmc2V0LCBjb3VudCwgc3BhY2VzKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0Q29udHJhaW50c0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdENvbnRyYWludHNJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2NTAzODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MRm9ybWF0Q29udHJhaW50c0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQKLSAqIFBsZWFzZSB1bi1kZXByZWNhdGUgdGhpcyBpZiBQYWdlIERlc2lnbmVyIHRoaW5rcyB0aGV5IGFyZSBuZWVkZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRm9ybWF0Q29udHJhaW50c0ltcGwgZXh0ZW5kcyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBpbXBsZW1lbnRzIEhUTUxGb3JtYXRDb250cmFpbnRzIHsKLQlwcm90ZWN0ZWQgaW50IGZBdmFpbGFibGVMaW5lV2lkdGg7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgewotCQlyZXR1cm4gZkF2YWlsYWJsZUxpbmVXaWR0aDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEF2YWlsYWJsZUxpbmVXaWR0aChpbnQgYXZhaWxhYmxlTGluZVdpZHRoKSB7Ci0JCWZBdmFpbGFibGVMaW5lV2lkdGggPSBhdmFpbGFibGVMaW5lV2lkdGg7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdFByb2Nlc3NvckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdFByb2Nlc3NvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY2NWNjNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXRQcm9jZXNzb3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsIGV4dGVuZHMgRm9ybWF0UHJvY2Vzc29yWE1MIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oKSB7Ci0JCXJldHVybiAiaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZ2V0Rm9ybWF0dGVyKE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcihub2RlLCBnZXRGb3JtYXRQcmVmZXJlbmNlcygpKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCSgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCQl9Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzMzY2NmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRm9ybWF0dGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTkFNRSA9ICJodG1sIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJPRFlfTkFNRSA9ICJCT0RZIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRXaWR0aChIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBpbnQgd2lkdGgpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFzcGxpdExpbmVzKCkgfHwgZ2V0TGluZVdpZHRoKCkgPCAwKQotCQkJcmV0dXJuOwotCi0JCWludCBhdmFpbGFibGVXaWR0aCA9IGNvbnRyYWludHMuZ2V0QXZhaWxhYmxlTGluZVdpZHRoKCkgLSB3aWR0aDsKLQkJaWYgKGF2YWlsYWJsZVdpZHRoIDwgMCkKLQkJCWF2YWlsYWJsZVdpZHRoID0gMDsKLQkJY29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoYXZhaWxhYmxlV2lkdGgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkZvcm1hdENoaWxkKE5vZGUgbm9kZSkgewotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCXJldHVybiB0cnVlOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGRlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5DREFUQSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKSB7Ci0JCQkJCWJvb2xlYW4gc2hvdWxkS2VlcFNwYWNlID0gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0tFRVBfU1BBQ0UpKS5ib29sZWFuVmFsdWUoKTsKLQkJCQkJaWYgKHNob3VsZEtlZXBTcGFjZSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQWZ0ZXIoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlpZiAoaGludCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EKSB8fCBoaW50LmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5CUkVBS19BRlRFUl9TVEFSVCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQWZ0ZXIoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBuZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkvLyBkbyBub3QgaW5zZXJ0IGJyZWFrIGFmdGVyIHVuY2xvc2VkIHRhZwotCQkJCWlmICghKChJRE9NRWxlbWVudCkgbm9kZSkuaXNDbG9zZWQoKSkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCS8vIGRvIG5vdCBpbnNlcnQgYnJlYWsgYmVmb3JlIG1pc3NpbmcgZW5kIHRhZwotCQkJaWYgKG5leHQgPT0gbnVsbCAmJiBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpbnNlcnQgbGluZSBicmVhayB1bmRlciBub24tSFRNTCBlbGVtZW50cyBpbmNsdWRpbmcgSlNQIGVsZW1lbnRzCi0JCQlpZiAoZWxlbWVudC5nZXRQcmVmaXgoKSAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkvLyBzcGVjaWFsIGZvciBkaXJlY3QgY2hpbGRyZW4gdW5kZXIgQk9EWQotCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJPRFlfTkFNRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihkZWNsKSkgewotCQkJCS8vIHNwY2lhbCBmb3IgQlIKLQkJCQlyZXR1cm4gY2FuRm9ybWF0Q2hpbGQocGFyZW50KTsKLQkJCX0KLQkJfQotCQlpZiAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbmV4dCk7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtCZWZvcmUoZGVjbCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNhbkluc2VydEJyZWFrQmVmb3JlKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGhpbnQgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKTsKLQkJaWYgKGhpbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbnNlcnRCcmVha0JlZm9yZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCi0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmIChwcmV2ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCS8vIGRvIG5vdCBpbnNlcnQgYnJlYWsgYWZ0ZXIgbWlzc2luZyBzdGFydCB0YWcKLQkJCWlmIChwcmV2ID09IG51bGwgJiYgZWxlbWVudC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCi0JCQkvLyBpbnNlcnQgbGluZSBicmVhayB1bmRlciBub24tSFRNTCBlbGVtZW50cyBpbmNsdWRpbmcgSlNQIGVsZW1lbnRzCi0JCQlpZiAoZWxlbWVudC5nZXRQcmVmaXgoKSAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChkZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkvLyBzcGVjaWFsIGZvciBkaXJlY3QgY2hpbGRyZW4gdW5kZXIgQk9EWQotCQkJCWlmICh0YWdOYW1lICE9IG51bGwgJiYgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEJPRFlfTkFNRSkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtCZWZvcmUoZGVjbCkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBnZXRFbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIHByZXYpOwotCQkJaWYgKGNhbkluc2VydEJyZWFrQWZ0ZXIoZGVjbCkpIHsKLQkJCQkvLyBzcGNpYWwgZm9yIEJSCi0JCQkJcmV0dXJuIGNhbkZvcm1hdENoaWxkKHBhcmVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdChOb2RlIG5vZGUpIHsKLQkJZm9ybWF0KG5vZGUsIGdldEZvcm1hdENvbnRyYWludHMoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSAmJiBjb250cmFpbnRzIGluc3RhbmNlb2YgSFRNTEZvcm1hdENvbnRyYWludHMpCi0JCQlmb3JtYXQoKElET01Ob2RlKSBub2RlLCAoSFRNTEZvcm1hdENvbnRyYWludHMpIGNvbnRyYWludHMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdChJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBkbyBub3QgZm9ybWF0IHJlbW92ZWQgbm9kZQotCi0JCXNldFdpZHRoKGNvbnRyYWludHMsIG5vZGUpOwotCi0JCWlmIChjYW5JbnNlcnRCcmVha0JlZm9yZShub2RlKSkKLQkJCWluc2VydEJyZWFrQmVmb3JlKG5vZGUsIGNvbnRyYWludHMpOwotCi0JCWZvcm1hdE5vZGUobm9kZSwgY29udHJhaW50cyk7Ci0KLQkJaWYgKGNhbkluc2VydEJyZWFrQWZ0ZXIobm9kZSkpCi0JCQlpbnNlcnRCcmVha0FmdGVyKG5vZGUsIGNvbnRyYWludHMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZvcm1hdENoaWxkTm9kZXMoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIW5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuOwotCi0JCS8vIGNvbmNhdCBhZGphY2VudCB0ZXh0cwotCQlub2RlLm5vcm1hbGl6ZSgpOwotCi0JCS8vIGRpc2FibGUgc2libGluZyBpbmRlbnQgZHVyaW5nIGZvcm1hdHRpbmcgYWxsIHRoZSBjaGlsZHJlbgotCQlib29sZWFuIGluZGVudCA9IGZhbHNlOwotCQlpZiAoY29udHJhaW50cyAhPSBudWxsKSB7Ci0JCQlpbmRlbnQgPSBjb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCk7Ci0JCQljb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGZhbHNlKTsKLQkJfQotCi0JCWJvb2xlYW4gaW5zZXJ0QnJlYWsgPSB0cnVlOwotCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlpZiAoY2hpbGQuZ2V0UGFyZW50Tm9kZSgpICE9IG5vZGUpCi0JCQkJYnJlYWs7Ci0JCQlJRE9NTm9kZSBuZXh0ID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCi0JCQlpZiAoaW5zZXJ0QnJlYWsgJiYgY2FuSW5zZXJ0QnJlYWtCZWZvcmUoY2hpbGQpKSB7Ci0JCQkJaW5zZXJ0QnJlYWtCZWZvcmUoY2hpbGQsIGNvbnRyYWludHMpOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBIVE1MRm9ybWF0dGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUZvcm1hdHRlcihjaGlsZCwgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCQlpZiAoZm9ybWF0dGVyICE9IG51bGwpIHsKLQkJCQlpZiAoZm9ybWF0dGVyIGluc3RhbmNlb2YgSFRNTEZvcm1hdHRlcikgewotCQkJCQlIVE1MRm9ybWF0dGVyIGh0bWxGb3JtYXR0ZXIgPSAoSFRNTEZvcm1hdHRlcikgZm9ybWF0dGVyOwotCQkJCQlodG1sRm9ybWF0dGVyLmZvcm1hdE5vZGUoY2hpbGQsIGNvbnRyYWludHMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9ybWF0dGVyLmZvcm1hdChjaGlsZCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2FuSW5zZXJ0QnJlYWtBZnRlcihjaGlsZCkpIHsKLQkJCQlpbnNlcnRCcmVha0FmdGVyKGNoaWxkLCBjb250cmFpbnRzKTsKLQkJCQlpbnNlcnRCcmVhayA9IGZhbHNlOyAvLyBub3QgdG8gaW5zZXJ0IHR3aWNlCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpbnNlcnRCcmVhayA9IHRydWU7Ci0JCQl9Ci0KLQkJCWNoaWxkID0gbmV4dDsKLQkJfQotCi0JCWlmIChjb250cmFpbnRzICE9IG51bGwpCi0JCQljb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGluZGVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7IC8vIGNvbnRhaW5lcgotCQkJZm9ybWF0Q2hpbGROb2Rlcyhub2RlLCBjb250cmFpbnRzKTsKLQkJfQotCQllbHNlIHsgLy8gbGVhZgotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJCQlpZiAoc291cmNlICE9IG51bGwgJiYgc291cmNlLmxlbmd0aCgpID4gMCkgewotCQkJCQlzZXRXaWR0aChjb250cmFpbnRzLCBzb3VyY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QnJlYWtTcGFjZXMoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlTdHJpbmcgZGVsaW0gPSAoKElET01Ob2RlKSBub2RlKS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJaWYgKGRlbGltICE9IG51bGwgJiYgZGVsaW0ubGVuZ3RoKCkgPiAwKQotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0KLQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudCgpOwotCQlpZiAoaW5kZW50ICE9IG51bGwgJiYgaW5kZW50Lmxlbmd0aCgpID4gMCkgewotCQkJZm9yIChOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOyBwYXJlbnQgIT0gbnVsbDsgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKSkgewotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJYnJlYWs7Ci0JCQkJLy8gaWdub3JlIG9taXR0ZWQgdGFnCi0JCQkJaWYgKCgoSURPTU5vZGUpIHBhcmVudCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQotCQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHBhcmVudDsKLQkJCQlpZiAoZWxlbWVudC5nZXRQcmVmaXgoKSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCQkvLyBzcGVjaWFsIGZvciBodG1sOmh0bWwKLQkJCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmICFsb2NhbE5hbWUuZXF1YWxzKEhUTUxfTkFNRSkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoaW5kZW50KTsKLQkJCQkJfQotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJCWlmIChkZWNsICE9IG51bGwgJiYgZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JTkRFTlRfQ0hJTERfU09VUkNFKSkgewotCQkJCQlib29sZWFuIHNob3VsZEluZGVudCA9ICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JTkRFTlRfQ0hJTERfU09VUkNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChzaG91bGRJbmRlbnQpCi0JCQkJCQlidWZmZXIuYXBwZW5kKGluZGVudCk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJbmRlbnQoKSB7Ci0JCXJldHVybiBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldEluZGVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBpbnQgZ2V0TGluZVdpZHRoKCkgewotCQlyZXR1cm4gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydEJyZWFrQWZ0ZXIoSURPTU5vZGUgbm9kZSwgSFRNTEZvcm1hdENvbnRyYWludHMgY29udHJhaW50cykgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQlTdHJpbmcgc3BhY2VzID0gbnVsbDsKLQkJaWYgKG5leHQgPT0gbnVsbCkgeyAvLyBsYXN0IHNwYWNlcwotCQkJLy8gdXNlIHBhcmVudCBpbmRlbnQgZm9yIHRoZSBlbmQgdGFnCi0JCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhwYXJlbnQpOwotCQl9Ci0JCWVsc2UgaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCAmJiBjb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpIHsKLQkJCQlJRE9NTm9kZSB0ZXh0ID0gKElET01Ob2RlKSBuZXh0OwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IEhUTUxGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRm9ybWF0dGVyKHRleHQsIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQkJCWlmIChmb3JtYXR0ZXIgaW5zdGFuY2VvZiBIVE1MVGV4dEZvcm1hdHRlcikgewotCQkJCQlIVE1MVGV4dEZvcm1hdHRlciB0ZXh0Rm9ybWF0dGVyID0gKEhUTUxUZXh0Rm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCQkJCXRleHRGb3JtYXR0ZXIuZm9ybWF0VGV4dCh0ZXh0LCBjb250cmFpbnRzLCBIVE1MVGV4dEZvcm1hdHRlci5GT1JNQVRfSEVBRCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgewotCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCX0KLQkJaWYgKHNwYWNlcyA9PSBudWxsIHx8IHNwYWNlcy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTb3VyY2Uobm9kZS5nZXRNb2RlbCgpLCBub2RlLmdldEVuZE9mZnNldCgpLCAwLCBzcGFjZXMpOwotCQlzZXRXaWR0aChjb250cmFpbnRzLCBzcGFjZXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluc2VydEJyZWFrQmVmb3JlKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHByZXYgPSBub2RlLmdldFByZXZpb3VzU2libGluZygpOwotCi0JCVN0cmluZyBzcGFjZXMgPSBudWxsOwotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGNvbnRyYWludHMgIT0gbnVsbCAmJiBjb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpIHsKLQkJCQlJRE9NTm9kZSB0ZXh0ID0gKElET01Ob2RlKSBwcmV2OwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IEhUTUxGb3JtYXR0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCkuY3JlYXRlRm9ybWF0dGVyKHRleHQsIGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQkJCWlmIChmb3JtYXR0ZXIgaW5zdGFuY2VvZiBIVE1MVGV4dEZvcm1hdHRlcikgewotCQkJCQlIVE1MVGV4dEZvcm1hdHRlciB0ZXh0Rm9ybWF0dGVyID0gKEhUTUxUZXh0Rm9ybWF0dGVyKSBmb3JtYXR0ZXI7Ci0JCQkJCXRleHRGb3JtYXR0ZXIuZm9ybWF0VGV4dCh0ZXh0LCBjb250cmFpbnRzLCBIVE1MVGV4dEZvcm1hdHRlci5GT1JNQVRfVEFJTCk7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCWVsc2UgewotCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCX0KLQkJaWYgKHNwYWNlcyA9PSBudWxsIHx8IHNwYWNlcy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTb3VyY2Uobm9kZS5nZXRNb2RlbCgpLCBub2RlLmdldFN0YXJ0T2Zmc2V0KCksIDAsIHNwYWNlcyk7Ci0JCXNldFdpZHRoKGNvbnRyYWludHMsIHNwYWNlcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNXaWR0aEF2YWlsYWJsZShIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBpbnQgd2lkdGgpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoIXNwbGl0TGluZXMoKSB8fCBnZXRMaW5lV2lkdGgoKSA8IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIChjb250cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpID49IHdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBrZWVwQmxhbmtMaW5lcyhIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzKSB7Ci0JCWlmIChjb250cmFpbnRzID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuICghY29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVNvdXJjZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZsYXROb2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJc291cmNlID0gbmV3IFN0cmluZygpOwotCQlpbnQgc3RhcnRPZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkoc3RhcnRPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCkpCi0JCQlyZXR1cm47Ci0JCS8vIFdlIHVzZSAnc3RydWN0dXJlZERvY3VtZW50JyBhcyB0aGUgcmVxdWVzdGVyIG9iamVjdCBqdXN0IHNvIHRoaXMgYW5kIHRoZSBvdGhlcgotCQkvLyBmb3JtYXQtcmVsYXRlZCAncmVwYWxjZVRleHQnIChpbiByZXBsYWNlU291cmNlKSBjYW4gdXNlIHRoZSBzYW1lIHJlcXVlc3Rlci4KLQkJLy8gT3RoZXJ3aXNlLCBpZiByZXF1ZXN0ZXIgaXMgbm90IGlkZW50aWNhbCwgCi0JCS8vIHRoZSB1bmRvIGdyb3VwIGdldHMgImJyb2tlbiIgaW50byBtdWx0aXBsZSBwaWVjZXMgYmFzZWQKLQkJLy8gb24gdGhlIHJlcXVlc3RlcnMgYmVpbmcgZGlmZmVyZW50LiBUZWNobmljYWxseSwgYW55IHVuaXF1ZSwgY29tbW9uCi0JCS8vIHJlcXVlc3RlciBvYmplY3Qgd291bGQgd29yay4KLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRPZmZzZXQgKyBvZmZzZXQsIGxlbmd0aCwgc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlU291cmNlKElET01Nb2RlbCBtb2RlbCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHNvdXJjZSkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShvZmZzZXQsIGxlbmd0aCkpCi0JCQlyZXR1cm47Ci0JCS8vIFdlIHVzZSAnc3RydWN0dXJlZERvY3VtZW50JyBhcyB0aGUgcmVxdWVzdGVyIG9iamVjdCBqdXN0IHNvIHRoaXMgYW5kIHRoZSBvdGhlcgotCQkvLyBmb3JtYXQtcmVsYXRlZCAncmVwYWxjZVRleHQnIChpbiByZXBsYWNlU291cmNlKSBjYW4gdXNlIHRoZSBzYW1lIHJlcXVlc3Rlci4KLQkJLy8gT3RoZXJ3aXNlLCBpZiByZXF1ZXN0ZXIgaXMgbm90IGlkZW50aWNhbCwgCi0JCS8vIHRoZSB1bmRvIGdyb3VwIGdldHMgImJyb2tlbiIgaW50byBtdWx0aXBsZSBwaWVjZXMgYmFzZWQKLQkJLy8gb24gdGhlIHJlcXVlc3RlcnMgYmVpbmcgZGlmZmVyZW50LiBUZWNobmljYWxseSwgYW55IHVuaXF1ZSwgY29tbW9uCi0JCS8vIHJlcXVlc3RlciBvYmplY3Qgd291bGQgd29yay4gCi0JCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFdpZHRoKEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFzcGxpdExpbmVzKCkpCi0JCQlyZXR1cm47Ci0JCWludCBsaW5lV2lkdGggPSBnZXRMaW5lV2lkdGgoKTsKLQkJaWYgKGxpbmVXaWR0aCA8IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IHNvdXJjZS5sYXN0SW5kZXhPZignXG4nKTsKLQkJaW50IG9mZnNldDIgPSBzb3VyY2UubGFzdEluZGV4T2YoJ1xyJyk7Ci0JCWlmIChvZmZzZXQyID4gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gb2Zmc2V0MjsKLQkJaWYgKG9mZnNldCA+PSAwKQotCQkJb2Zmc2V0Kys7Ci0KLQkJaW50IGF2YWlsYWJsZVdpZHRoID0gMDsKLQkJaWYgKG9mZnNldCA+PSAwKSB7Ci0JCQlhdmFpbGFibGVXaWR0aCA9IGxpbmVXaWR0aCAtIChsZW5ndGggLSBvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJYXZhaWxhYmxlV2lkdGggPSBjb250cmFpbnRzLmdldEF2YWlsYWJsZUxpbmVXaWR0aCgpIC0gbGVuZ3RoOwotCQl9Ci0JCWlmIChhdmFpbGFibGVXaWR0aCA8IDApCi0JCQlhdmFpbGFibGVXaWR0aCA9IDA7Ci0JCWNvbnRyYWludHMuc2V0QXZhaWxhYmxlTGluZVdpZHRoKGF2YWlsYWJsZVdpZHRoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRXaWR0aChIVE1MRm9ybWF0Q29udHJhaW50cyBjb250cmFpbnRzLCBOb2RlIG5vZGUpIHsKLQkJaWYgKGNvbnRyYWludHMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmICghc3BsaXRMaW5lcygpKQotCQkJcmV0dXJuOwotCQlpbnQgbGluZVdpZHRoID0gZ2V0TGluZVdpZHRoKCk7Ci0JCWlmIChsaW5lV2lkdGggPCAwKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGluZSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQob2Zmc2V0KTsKLQkJaW50IGxpbmVPZmZzZXQgPSAwOwotCQl0cnkgewotCQkJbGluZU9mZnNldCA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGxpbmUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleCkgewotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQl9Ci0JCWlmIChsaW5lT2Zmc2V0ID4gb2Zmc2V0KQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBhdmFpbGFibGVXaWR0aCA9IGxpbmVXaWR0aCAtIChvZmZzZXQgLSBsaW5lT2Zmc2V0KTsKLQkJaWYgKGF2YWlsYWJsZVdpZHRoIDwgMCkKLQkJCWF2YWlsYWJsZVdpZHRoID0gMDsKLQotCQljb250cmFpbnRzLnNldEF2YWlsYWJsZUxpbmVXaWR0aChhdmFpbGFibGVXaWR0aCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3BsaXRMaW5lcygpIHsKLQkJcmV0dXJuIHRydWU7Ly9nZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldFNwbGl0TGluZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCXByb3RlY3RlZCBIVE1MRm9ybWF0Q29udHJhaW50cyBmRm9ybWF0Q29udHJhaW50cyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQkvL3B1YmxpYyB2b2lkIGZvcm1hdChYTUxOb2RlIG5vZGUsIEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCS8vCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCkpCi0JLy8JCWZvcm1hdENvbnRyYWludHMuc2V0Q3VycmVudEluZGVudChnZXRTaWJsaW5nSW5kZW50KG5vZGUpKTsKLQkvLwotCS8vCWZvcm1hdE5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JLy99Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRQcmVmZXJlbmNlcyhJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGZvcm1hdFByZWZlcmVuY2VzKSB7Ci0JCWZGb3JtYXRQcmVmZXJlbmNlcyA9IGZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCSgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCQl9Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZ2V0Rm9ybWF0Q29udHJhaW50cygpIHsKLQkJaWYgKGZGb3JtYXRDb250cmFpbnRzID09IG51bGwpIHsKLQkJCWZGb3JtYXRDb250cmFpbnRzID0gbmV3IEhUTUxGb3JtYXRDb250cmFpbnRzSW1wbCgpOwotCi0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRBdmFpbGFibGVMaW5lV2lkdGgoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKSk7Ci0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBwcm9ncmVzc01vbml0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvSFRNTEZvcm1hdHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE3YzYwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxGb3JtYXR0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8vIG5ha2Ftb3JpX1RPRE86IGNoZWNrIGFuZCByZW1vdmUgQ1NTIGZvcm1hdHRpbmcKLQotY2xhc3MgSFRNTEZvcm1hdHRlckZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIEhUTUxGb3JtYXR0ZXJGYWN0b3J5IGZJbnN0YW5jZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgSFRNTEZvcm1hdHRlckZhY3RvcnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IEhUTUxGb3JtYXR0ZXJGYWN0b3J5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgY3JlYXRlRm9ybWF0dGVyKE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyBmb3JtYXRQcmVmZXJlbmNlcykgewotCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBudWxsOwotCi0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgSFRNTEVsZW1lbnRGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCWlmIChpc0VtYmVkZGVkQ1NTKG5vZGUpKSB7Ci0JCQkJCWZvcm1hdHRlciA9IG5ldyBFbWJlZGRlZENTU0Zvcm1hdHRlcigpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9ybWF0dGVyID0gbmV3IEhUTUxUZXh0Rm9ybWF0dGVyKCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJZm9ybWF0dGVyID0gbmV3IEhUTUxGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJfQotCi0JCS8vIGluaXQgRm9ybWF0UHJlZmVyZW5jZXMKLQkJZm9ybWF0dGVyLnNldEZvcm1hdFByZWZlcmVuY2VzKGZvcm1hdFByZWZlcmVuY2VzKTsKLQotCQlyZXR1cm4gZm9ybWF0dGVyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0VtYmVkZGVkQ1NTKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG5hbWUgPSBwYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgiU1RZTEUiKTsvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwcml2YXRlIEhUTUxGb3JtYXR0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MIGdldEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlpZiAoZkZvcm1hdFByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZGb3JtYXRQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwoKTsKLQotCQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRTcGxpdE11bHRpQXR0cnMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQkJCWZGb3JtYXRQcmVmZXJlbmNlcy5zZXRDbGVhckFsbEJsYW5rTGluZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUik7Ci0JCQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBQi5lcXVhbHMoaW5kZW50Q2hhclByZWYpKSB7Ci0JCQkJCWluZGVudENoYXIgPSAnXHQnOwotCQkJCX0KLQkJCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCQl9Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxUZXh0Rm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0hUTUxUZXh0Rm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNTJmODIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9IVE1MVGV4dEZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFRleHRGb3JtYXR0ZXIgZXh0ZW5kcyBIVE1MRm9ybWF0dGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgaW50IEZPUk1BVF9BTEwgPSAwOwotCXB1YmxpYyBzdGF0aWMgaW50IEZPUk1BVF9IRUFEID0gMTsKLQlwdWJsaWMgc3RhdGljIGludCBGT1JNQVRfVEFJTCA9IDI7Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTFRleHRGb3JtYXR0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkZvcm1hdFRleHQoSURPTVRleHQgdGV4dCkgewotCQlpZiAodGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0ZXh0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCWlmIChpc1VucGFyc2VkUmVnaW9uKHR5cGUpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCU5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgcGFyZW50OwotCQkJaWYgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkgJiYgIXRleHQuaXNFbGVtZW50Q29udGVudFdoaXRlc3BhY2UoKSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gY2FuRm9ybWF0Q2hpbGQocGFyZW50KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbnBhcnNlZFJlZ2lvbihTdHJpbmcgdHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGlzTmVzdGVkU2Nhbm5lZFJlZ2lvbih0eXBlKSB8fCBpc0Jsb2NrU2Nhbm5lZFJlZ2lvbih0eXBlKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNCbG9ja1NjYW5uZWRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXN0ZWRTY2FubmVkUmVnaW9uKFN0cmluZyB0eXBlKSB7Ci0JCWZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKEpTUF9DT05URU5UKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gY2FuUmVtb3ZlSGVhZGluZ1NwYWNlcyhJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChub2RlLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBwYXJlbnQpOwotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLkxJTkVfQlJFQUtfSElOVCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgaGludCA9IChTdHJpbmcpIGRlY2wuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpOwotCQlyZXR1cm4gaGludC5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5SZW1vdmVUYWlsaW5nU3BhY2VzKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldEVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgcGFyZW50KTsKLQkJaWYgKGRlY2wgPT0gbnVsbCB8fCAoIWRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5MSU5FX0JSRUFLX0hJTlQpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIGhpbnQgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuTElORV9CUkVBS19ISU5UKTsKLQkJcmV0dXJuIGhpbnQuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLkJSRUFLX0JFRk9SRV9TVEFSVF9BTkRfQUZURVJfRU5EKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMpIHsKLQkJZm9ybWF0VGV4dChub2RlLCBjb250cmFpbnRzLCBGT1JNQVRfQUxMKTsgLy8gZnVsbCBmb3JtYXQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRUZXh0KElET01Ob2RlIG5vZGUsIEhUTUxGb3JtYXRDb250cmFpbnRzIGNvbnRyYWludHMsIGludCBtb2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJRE9NVGV4dCB0ZXh0ID0gKElET01UZXh0KSBub2RlOwotCQlTdHJpbmcgc291cmNlID0gdGV4dC5nZXRTb3VyY2UoKTsKLQotCQlpZiAoIWNhbkZvcm1hdFRleHQodGV4dCkpIHsKLQkJCXNldFdpZHRoKGNvbnRyYWludHMsIHNvdXJjZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gdGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gdGV4dC5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQotCQkvLyBmb3JtYXQgYWRqYWNlbnQgdGV4dCBhdCBvbmNlCi0JCWlmIChtb2RlID09IEZPUk1BVF9IRUFEKSB7Ci0JCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsICYmIG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCUlET01UZXh0IG5leHRUZXh0ID0gKElET01UZXh0KSBuZXh0OwotCQkJCWxlbmd0aCArPSAobmV4dFRleHQuZ2V0RW5kT2Zmc2V0KCkgLSBuZXh0VGV4dC5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQlTdHJpbmcgbmV4dFNvdXJjZSA9IG5leHRUZXh0LmdldFNvdXJjZSgpOwotCQkJCWlmIChuZXh0U291cmNlICE9IG51bGwgJiYgbmV4dFNvdXJjZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCQkJc291cmNlID0gbmV4dFNvdXJjZTsKLQkJCQkJZWxzZQotCQkJCQkJc291cmNlICs9IG5leHRTb3VyY2U7Ci0JCQkJfQotCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobW9kZSA9PSBGT1JNQVRfVEFJTCkgewotCQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCXdoaWxlIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJSURPTVRleHQgcHJldlRleHQgPSAoSURPTVRleHQpIHByZXY7Ci0JCQkJb2Zmc2V0ID0gcHJldlRleHQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQlsZW5ndGggKz0gKHByZXZUZXh0LmdldEVuZE9mZnNldCgpIC0gb2Zmc2V0KTsKLQkJCQlTdHJpbmcgcHJldlNvdXJjZSA9IHByZXZUZXh0LmdldFNvdXJjZSgpOwotCQkJCWlmIChwcmV2U291cmNlICE9IG51bGwgJiYgcHJldlNvdXJjZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJCQkJc291cmNlID0gcHJldlNvdXJjZTsKLQkJCQkJZWxzZQotCQkJCQkJc291cmNlID0gcHJldlNvdXJjZSArIHNvdXJjZTsKLQkJCQl9Ci0JCQkJcHJldiA9IHByZXYuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlTcGFjZUNvbnZlcnRlciBjb252ZXJ0ZXIgPSBuZXcgU3BhY2VDb252ZXJ0ZXIoc291cmNlLCBrZWVwQmxhbmtMaW5lcyhjb250cmFpbnRzKSk7Ci0KLQkJaW50IHdvcmRMZW5ndGggPSBjb252ZXJ0ZXIubmV4dFdvcmQoKTsKLQkJaWYgKHdvcmRMZW5ndGggPT0gMCkgeyAvLyBvbmx5IHNwYWNlcwotCQkJaWYgKCFjb252ZXJ0ZXIuaGFzU3BhY2VzKCkpCi0JCQkJcmV0dXJuOyAvLyBlbXB0eQotCQkJYm9vbGVhbiByZW1vdmVTcGFjZXMgPSBmYWxzZTsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCS8vIGNoZWNrIGlmIHRhZ3MgYXJlIG9taXR0ZWQKLQkJCQlJRE9NTm9kZSBlbGVtZW50ID0gKElET01Ob2RlKSBwYXJlbnQ7Ci0JCQkJaWYgKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgPT0gbnVsbCAmJiBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQlyZW1vdmVTcGFjZXMgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCAmJiBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJcmVtb3ZlU3BhY2VzID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocmVtb3ZlU3BhY2VzKSB7Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMobnVsbCk7Ci0JCQl9Ci0JCQllbHNlIGlmICghaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCAyKSB8fCBjYW5JbnNlcnRCcmVha0FmdGVyKG5vZGUpIHx8IGNhbkluc2VydEJyZWFrQmVmb3JlKG5vZGUpKSB7Ci0JCQkJU3RyaW5nIHNwYWNlcyA9IG51bGw7Ci0JCQkJaWYgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7IC8vIGxhc3Qgc3BhY2VzCi0JCQkJCS8vIHVzZSBwYXJlbnQgaW5kZW50IGZvciB0aGUgZW5kIHRhZwotCQkJCQlzcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhwYXJlbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCQkJfQotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKHNwYWNlcyk7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgc3BhY2VzKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNhblJlbW92ZUhlYWRpbmdTcGFjZXMobm9kZSkgfHwgY2FuUmVtb3ZlVGFpbGluZ1NwYWNlcyhub2RlKSkgewotCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKG51bGwpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udmVydGVyLmNvbXByZXNzU3BhY2VzKCk7Ci0JCQkJYWRkV2lkdGgoY29udHJhaW50cywgMSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgYnJlYWtTcGFjZXMgPSBudWxsOwotCi0JCQkvLyBmb3JtYXQgaGVhZGluZyBzcGFjZXMKLQkJCWJvb2xlYW4gaGFzU3BhY2VzID0gY29udmVydGVyLmhhc1NwYWNlcygpOwotCQkJaWYgKG1vZGUgPT0gRk9STUFUX1RBSUwpIHsKLQkJCQkvLyBrZWVwIHNwYWNlcyBhcyBpcwotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvbnZlcnRlci5nZXRTcGFjZUNvdW50KCkpOwotCQkJfQotCQkJZWxzZSBpZiAoKGhhc1NwYWNlcyAmJiAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCB3b3JkTGVuZ3RoICsgMSkpIHx8IGNhbkluc2VydEJyZWFrQmVmb3JlKG5vZGUpKSB7Ci0JCQkJYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJCQljb252ZXJ0ZXIucmVwbGFjZVNwYWNlcyhicmVha1NwYWNlcyk7Ci0JCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGhhc1NwYWNlcykgewotCQkJCQlpZiAoY2FuUmVtb3ZlSGVhZGluZ1NwYWNlcyhub2RlKSkgewotCQkJCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMobnVsbCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQljb252ZXJ0ZXIuY29tcHJlc3NTcGFjZXMoKTsKLQkJCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYWRkV2lkdGgoY29udHJhaW50cywgd29yZExlbmd0aCk7Ci0KLQkJCS8vIGZvcm1hdCBtaWRkbGUKLQkJCXdvcmRMZW5ndGggPSBjb252ZXJ0ZXIubmV4dFdvcmQoKTsKLQkJCXdoaWxlICh3b3JkTGVuZ3RoID4gMCkgewotCQkJCWlmIChtb2RlICE9IEZPUk1BVF9BTEwpIHsKLQkJCQkJLy8ga2VlcCBzcGFjZXMgYXMgaXMKLQkJCQkJYWRkV2lkdGgoY29udHJhaW50cywgY29udmVydGVyLmdldFNwYWNlQ291bnQoKSk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKCFpc1dpZHRoQXZhaWxhYmxlKGNvbnRyYWludHMsIHdvcmRMZW5ndGggKyAxKSkgewotCQkJCQlpZiAoYnJlYWtTcGFjZXMgPT0gbnVsbCkKLQkJCQkJCWJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMobm9kZSk7Ci0JCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKGJyZWFrU3BhY2VzKTsKLQkJCQkJc2V0V2lkdGgoY29udHJhaW50cywgYnJlYWtTcGFjZXMpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJY29udmVydGVyLmNvbXByZXNzU3BhY2VzKCk7Ci0JCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIDEpOwotCQkJCX0KLQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCB3b3JkTGVuZ3RoKTsKLQkJCQl3b3JkTGVuZ3RoID0gY29udmVydGVyLm5leHRXb3JkKCk7Ci0JCQl9Ci0KLQkJCS8vIGZvcm1hdCB0YWlsaW5nIHNwYWNlcwotCQkJaGFzU3BhY2VzID0gY29udmVydGVyLmhhc1NwYWNlcygpOwotCQkJaWYgKG1vZGUgPT0gRk9STUFUX0hFQUQpIHsKLQkJCQkvLyBrZWVwIHNwYWNlcyBhcyBpcwotCQkJCWFkZFdpZHRoKGNvbnRyYWludHMsIGNvbnZlcnRlci5nZXRTcGFjZUNvdW50KCkpOwotCQkJfQotCQkJZWxzZSBpZiAoKGhhc1NwYWNlcyAmJiAhaXNXaWR0aEF2YWlsYWJsZShjb250cmFpbnRzLCAyKSkgfHwgY2FuSW5zZXJ0QnJlYWtBZnRlcihub2RlKSkgewotCQkJCWlmIChub2RlLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkgeyAvLyBsYXN0IHRlc3QKLQkJCQkJLy8gdXNlIHBhcmVudCBpbmRlbnQgZm9yIHRoZSBlbmQgdGFnCi0JCQkJCWJyZWFrU3BhY2VzID0gZ2V0QnJlYWtTcGFjZXMocGFyZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChicmVha1NwYWNlcyA9PSBudWxsKQotCQkJCQkJYnJlYWtTcGFjZXMgPSBnZXRCcmVha1NwYWNlcyhub2RlKTsKLQkJCQl9Ci0JCQkJY29udmVydGVyLnJlcGxhY2VTcGFjZXMoYnJlYWtTcGFjZXMpOwotCQkJCXNldFdpZHRoKGNvbnRyYWludHMsIGJyZWFrU3BhY2VzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChoYXNTcGFjZXMpIHsKLQkJCQkJaWYgKGNhblJlbW92ZVRhaWxpbmdTcGFjZXMobm9kZSkpIHsKLQkJCQkJCWNvbnZlcnRlci5yZXBsYWNlU3BhY2VzKG51bGwpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY29udmVydGVyLmNvbXByZXNzU3BhY2VzKCk7Ci0JCQkJCQlhZGRXaWR0aChjb250cmFpbnRzLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChjb252ZXJ0ZXIuaXNNb2RpZmllZCgpKSB7Ci0JCQlzb3VyY2UgPSBjb252ZXJ0ZXIuZ2V0U291cmNlKCk7Ci0JCQlyZXBsYWNlU291cmNlKHRleHQuZ2V0TW9kZWwoKSwgb2Zmc2V0LCBsZW5ndGgsIHNvdXJjZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9TcGFjZUNvbnZlcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2Zvcm1hdC9TcGFjZUNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2I2ZjY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9mb3JtYXQvU3BhY2VDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0KLQotZmluYWwgY2xhc3MgU3BhY2VDb252ZXJ0ZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgc291cmNlID0gbnVsbDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBlbmRPZmZzZXQgPSAwOwotCXByaXZhdGUgaW50IHNwYWNlQ291bnQgPSAwOwotCXByaXZhdGUgaW50IHdvcmRDb3VudCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQlwcml2YXRlIGludCBsYXN0T2Zmc2V0ID0gMDsKLQlwcml2YXRlIGJvb2xlYW4ga2VlcEJsYW5rTGluZXMgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTcGFjZUNvbnZlcnRlcihTdHJpbmcgc291cmNlKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aGlzLnNvdXJjZSA9IG5ldyBTdHJpbmcoKTsKLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuc291cmNlID0gc291cmNlOwotCQkJdGhpcy5sZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3BhY2VDb252ZXJ0ZXIoU3RyaW5nIHNvdXJjZSwgYm9vbGVhbiBrZWVwQmxhbmtMaW5lcykgewotCQlzdXBlcigpOwotCi0JCWlmIChzb3VyY2UgPT0gbnVsbCkgewotCQkJdGhpcy5zb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnNvdXJjZSA9IHNvdXJjZTsKLQkJCXRoaXMubGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQl9Ci0JCXRoaXMua2VlcEJsYW5rTGluZXMgPSBrZWVwQmxhbmtMaW5lczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb21wcmVzc1NwYWNlcygpIHsKLQkJaWYgKHRoaXMuc3BhY2VDb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5zcGFjZUNvdW50ID09IDEgJiYgdGhpcy5zb3VyY2UuY2hhckF0KHRoaXMuc3RhcnRPZmZzZXQpID09ICcgJykKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5idWZmZXIgPT0gbnVsbCkKLQkJCXRoaXMuYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAodGhpcy5zdGFydE9mZnNldCA+IHRoaXMubGFzdE9mZnNldCkgewotCQkJdGhpcy5idWZmZXIuYXBwZW5kKHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLmxhc3RPZmZzZXQsIHRoaXMuc3RhcnRPZmZzZXQpKTsKLQkJfQotCi0JCXRoaXMuYnVmZmVyLmFwcGVuZCgnICcpOwotCi0JCXRoaXMubGFzdE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQgKyB0aGlzLnNwYWNlQ291bnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCWlmICh0aGlzLmJ1ZmZlciA9PSBudWxsKQotCQkJdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmICh0aGlzLmxlbmd0aCA+IHRoaXMubGFzdE9mZnNldCkgewotCQkJdGhpcy5idWZmZXIuYXBwZW5kKHRoaXMuc291cmNlLnN1YnN0cmluZyh0aGlzLmxhc3RPZmZzZXQsIHRoaXMubGVuZ3RoKSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTcGFjZUNvdW50KCkgewotCQlyZXR1cm4gdGhpcy5zcGFjZUNvdW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc1NwYWNlcygpIHsKLQkJcmV0dXJuICh0aGlzLnNwYWNlQ291bnQgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWVkKCkgewotCQlyZXR1cm4gKHRoaXMuYnVmZmVyICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEFkZCBudW1iZXIgb2YgdGhlIG9sZCBibGFuayBsaW5lcyB0byBuZXcgc3BhY2Ugc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1lcmdlQmxhbmtMaW5lcyhTdHJpbmcgbmV3U3BhY2VzLCBTdHJpbmcgb2xkU3BhY2VzKSB7Ci0JCWlmIChuZXdTcGFjZXMgPT0gbnVsbCB8fCBuZXdTcGFjZXMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuZXdTcGFjZXM7Ci0JCWlmIChvbGRTcGFjZXMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXdTcGFjZXM7Ci0KLQkJLy8gY291bnQgb2xkIG5ldyBsaW5lcwotCQlpbnQgbmV3TGluZUNvdW50ID0gMDsKLQkJaW50IG9sZExlbmd0aCA9IG9sZFNwYWNlcy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRMZW5ndGg7IGkrKykgewotCQkJY2hhciBjID0gb2xkU3BhY2VzLmNoYXJBdChpKTsKLQkJCWlmIChjID09ICdccicpIHsKLQkJCQluZXdMaW5lQ291bnQrKzsKLQkJCQlpZiAoaSArIDEgPCBvbGRMZW5ndGgpIHsKLQkJCQkJYyA9IG9sZFNwYWNlcy5jaGFyQXQoaSArIDEpOwotCQkJCQlpZiAoYyA9PSAnXG4nKQotCQkJCQkJaSsrOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChjID09ICdcbicpCi0JCQkJCW5ld0xpbmVDb3VudCsrOwotCQkJfQotCQl9Ci0JCWlmIChuZXdMaW5lQ291bnQgPCAyKQotCQkJcmV0dXJuIG5ld1NwYWNlczsgLy8gbm8gYmxhbmsgbGluZQotCi0JCS8vIGhlcmUgYXNzdW1pbmcgbmV3U3BhY2VzIHN0YXJ0cyB3aXRoIGEgbmV3IGxpbmUgaWYgYW55Ci0JCVN0cmluZyBkZWxpbSA9IG51bGw7Ci0JCWNoYXIgZCA9IG5ld1NwYWNlcy5jaGFyQXQoMCk7Ci0JCWlmIChkID09ICdccicpIHsKLQkJCWlmIChuZXdTcGFjZXMubGVuZ3RoKCkgPiAxICYmIG5ld1NwYWNlcy5jaGFyQXQoMSkgPT0gJ1xuJykKLQkJCQlkZWxpbSA9ICJcclxuIjsvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJZGVsaW0gPSAiXHIiOy8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWlmIChkID09ICdcbicpCi0JCQkJZGVsaW0gPSAiXG4iOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlyZXR1cm4gbmV3U3BhY2VzOyAvLyBubyBuZXcgbGluZQotCQl9Ci0KLQkJbmV3TGluZUNvdW50LS07Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKG5ld1NwYWNlcy5sZW5ndGgoKSArIG5ld0xpbmVDb3VudCAqIDIpOwotCQl3aGlsZSAobmV3TGluZUNvdW50ID4gMCkgewotCQkJYnVmZmVyLmFwcGVuZChkZWxpbSk7Ci0JCQluZXdMaW5lQ291bnQtLTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKG5ld1NwYWNlcyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IG5leHRXb3JkKCkgewotCQlpZiAodGhpcy5lbmRPZmZzZXQgPT0gdGhpcy5sZW5ndGgpIHsKLQkJCXRoaXMuc3RhcnRPZmZzZXQgPSB0aGlzLmVuZE9mZnNldDsKLQkJCXRoaXMuc3BhY2VDb3VudCA9IDA7Ci0JCQl0aGlzLndvcmRDb3VudCA9IDA7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXRoaXMuc3RhcnRPZmZzZXQgPSB0aGlzLmVuZE9mZnNldDsKLQkJaW50IGkgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQlmb3IgKDsgaSA8IHRoaXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0aGlzLnNvdXJjZS5jaGFyQXQoaSkpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXRoaXMuc3BhY2VDb3VudCA9IGkgLSB0aGlzLnN0YXJ0T2Zmc2V0OwotCi0JCWludCB3b3JkT2Zmc2V0ID0gaTsKLQkJZm9yICg7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZSh0aGlzLnNvdXJjZS5jaGFyQXQoaSkpKQotCQkJCWJyZWFrOwotCQl9Ci0JCXRoaXMud29yZENvdW50ID0gaSAtIHdvcmRPZmZzZXQ7Ci0JCXRoaXMuZW5kT2Zmc2V0ID0gaTsKLQotCQlyZXR1cm4gdGhpcy53b3JkQ291bnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZVNwYWNlcyhTdHJpbmcgc3BhY2VzKSB7Ci0JCWludCBzcGFjZUxlbmd0aCA9IChzcGFjZXMgIT0gbnVsbCA/IHNwYWNlcy5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmcgb2xkU3BhY2VzID0gbnVsbDsKLQkJaWYgKHNwYWNlTGVuZ3RoID09IHRoaXMuc3BhY2VDb3VudCkgewotCQkJaWYgKHNwYWNlTGVuZ3RoID09IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKHRoaXMuc3RhcnRPZmZzZXQgPT0gMCkgewotCQkJCWlmICh0aGlzLnNvdXJjZS5zdGFydHNXaXRoKHNwYWNlcykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgaWYgKHRoaXMuZW5kT2Zmc2V0ID09IHRoaXMubGVuZ3RoKSB7Ci0JCQkJaWYgKHRoaXMuc291cmNlLmVuZHNXaXRoKHNwYWNlcykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCB0ZXh0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCArIHRoaXMuc3BhY2VDb3VudDsKLQkJCQlvbGRTcGFjZXMgPSB0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5zdGFydE9mZnNldCwgdGV4dE9mZnNldCk7Ci0JCQkJaWYgKG9sZFNwYWNlcy5lcXVhbHMoc3BhY2VzKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmtlZXBCbGFua0xpbmVzICYmIHRoaXMuc3BhY2VDb3VudCA+IDApIHsKLQkJCWlmIChvbGRTcGFjZXMgPT0gbnVsbCkgewotCQkJCWludCB0ZXh0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCArIHRoaXMuc3BhY2VDb3VudDsKLQkJCQlvbGRTcGFjZXMgPSB0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5zdGFydE9mZnNldCwgdGV4dE9mZnNldCk7Ci0JCQl9Ci0JCQlpZiAob2xkU3BhY2VzICE9IG51bGwpIHsKLQkJCQlzcGFjZXMgPSBtZXJnZUJsYW5rTGluZXMoc3BhY2VzLCBvbGRTcGFjZXMpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHRoaXMuYnVmZmVyID09IG51bGwpCi0JCQl0aGlzLmJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHRoaXMuc3RhcnRPZmZzZXQgPiB0aGlzLmxhc3RPZmZzZXQpIHsKLQkJCXRoaXMuYnVmZmVyLmFwcGVuZCh0aGlzLnNvdXJjZS5zdWJzdHJpbmcodGhpcy5sYXN0T2Zmc2V0LCB0aGlzLnN0YXJ0T2Zmc2V0KSk7Ci0JCX0KLQotCQlpZiAoc3BhY2VMZW5ndGggPiAwKQotCQkJdGhpcy5idWZmZXIuYXBwZW5kKHNwYWNlcyk7Ci0KLQkJdGhpcy5sYXN0T2Zmc2V0ID0gdGhpcy5zdGFydE9mZnNldCArIHRoaXMuc3BhY2VDb3VudDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0Q1NTTW9kZWxBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMWJlNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5DU1NNb2RlbEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklDU1NNb2RlbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSUNTU01vZGVsQWRhcHRlciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIENTU19JRCA9IENvbnRlbnRUeXBlSWRGb3JDU1MuQ29udGVudFR5cGVJRF9DU1M7Ci0KLQlwcml2YXRlIEVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBJQ1NTTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICovCi0JQWJzdHJhY3RDU1NNb2RlbEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJLy8gY3JlYXRlIGVtYmVkZGVkIENTUyBtb2RlbCAobm90IGZvciBleHRlcm5hbCBDU1MpCi0JCWlmIChnZXRFbGVtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCA9ICgoSURPTU5vZGUpIGdldEVsZW1lbnQoKSkuZ2V0TW9kZWwoKTsKLQkJSUNTU01vZGVsIG5ld01vZGVsID0gKElDU1NNb2RlbCkgYmFzZU1vZGVsLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihDU1NfSUQpOwotCQkoKENTU01vZGVsSW1wbCkgbmV3TW9kZWwpLnNldE93bmVyRE9NTm9kZShnZXRFbGVtZW50KCkpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEVsZW1lbnQgZ2V0RWxlbWVudCgpIHsKLQkJcmV0dXJuIHRoaXMuZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSUNTU01vZGVsIGdldEV4aXN0aW5nTW9kZWwoKSB7Ci0JCXJldHVybiB0aGlzLm1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVN0eWxlQ2hhbmdlZChFbGVtZW50IHRhcmdldCkgewotCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIHRhcmdldDsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSBub3RpZmllci5nZXRBZGFwdGVycygpOwotCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSXRlcmF0b3IgaXQgPSBhZGFwdGVycy5pdGVyYXRvcigpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0eWxlTGlzdGVuZXIpIHsKLQkJCQlTdHlsZUxpc3RlbmVyIGxpc3RlbmVyID0gKFN0eWxlTGlzdGVuZXIpIGFkYXB0ZXI7Ci0JCQkJbGlzdGVuZXIuc3R5bGVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KSB7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogY2hlY2sgCi0JICogMS4gSWYgYXR0cmlidXRlcyBvZiBlbGVtZW50IGlzIHZhbGlkICh0eXBlLHJlbCAuLi4pCi0JICogMi4gSWYgY29udGVudCBtb2RlbCBzdXBwb3J0cyB0aGlzIGVsZW1lbnQgLyBhdHRyaWJ1dGUgKGZ1dHVyZSA/KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdHRyaWJ1dGUoKSB7Ci0JCXJldHVybiAoZ2V0RWxlbWVudCgpICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsKElDU1NNb2RlbCBtb2RlbCkgewotCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0Fic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1MTQ4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9BYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogCQlNYXNha2kgU2FpdG9oIChNU0FJVE9IQGpwLmlibS5jb20pCi0gKgkJU2VlIEJ1ZyAxNTMwMDAgIFN0eWxlIEFkYXB0ZXJzIHNob3VsZCBiZSBsYXppZXIKLSAqCQlodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzMDAwCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwuZXZlbnQuSUNTU1N0eWxlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRlZENvbGxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbE5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5Eb2N1bWVudFN0eWxlOwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldExpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLkRvY3VtZW50VHJhdmVyc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSUNTU1N0eWxlTGlzdGVuZXIsIElTdHlsZVNoZWV0QWRhcHRlciB7Ci0KLQkvLyB0aGlzIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNsYXNzIGlzIGp1c3QgYSBWQUphdmEgdHJpY2suCi0JLy8gaXQgaW1wcm92ZXMgcGVyZm9ybWFuY2UgaW4gVkFKYXZhIGJ5IG1pbmltaXppbmcgY2xhc3MgbG9hZGluZy4KLQlwcml2YXRlIGZpbmFsIENsYXNzIFN0eWxlU2hlZXRBZGFwdGVyQ2xhc3MgPSBJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3M7Ci0JcHJpdmF0ZSBDb2xsZWN0aW9uIHN0eWxlQ2hhbmdlZE5vZGVzOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsKHRydWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoYm9vbGVhbiBub3RpZnkpIHsKLQkJSUNTU01vZGVsIG5ld01vZGVsID0gc3VwZXIuY3JlYXRlTW9kZWwoKTsKLQkJaWYgKG5vdGlmeSAmJiBuZXdNb2RlbCAhPSBudWxsKSB7Ci0JCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJSU1vZGVsUHJvdmlkZUFkYXB0ZXIgYWRhcHRlciA9IChJTW9kZWxQcm92aWRlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBnZXRFbGVtZW50KCkpLmdldEFkYXB0ZXJGb3IoSU1vZGVsUHJvdmlkZUFkYXB0ZXIuY2xhc3MpOwotCQkJLy8gbm90aWZ5IGFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFByb3ZpZGVkKG5ld01vZGVsKTsKLQkJfQotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0eWxlU2hlZXQgZ2V0U2hlZXQoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoU3R5bGVTaGVldCkgbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IFN0eWxlU2hlZXRBZGFwdGVyQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VkKCkgewotCQlJQ1NTTW9kZWwgY3VycmVudE1vZGVsID0gZ2V0TW9kZWwoKTsKLQotCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0KLQkJc2V0RWxlbWVudChudWxsKTsKLQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChjdXJyZW50TW9kZWwpOwotCi0JCWlmIChjdXJyZW50TW9kZWwgIT0gbnVsbCkKLQkJCWN1cnJlbnRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVkKCkgewotCQlJQ1NTTW9kZWwgY3VycmVudE1vZGVsID0gZ2V0TW9kZWwoKTsKLQotCQlzZXRNb2RlbChudWxsKTsKLQotCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChjdXJyZW50TW9kZWwpOwotCi0JCWlmIChjdXJyZW50TW9kZWwgIT0gbnVsbCkKLQkJCWN1cnJlbnRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3JjTW9kZWwgY29tLmlibS5zZWQuY3NzLm1vZGVsLmludGVyZmFjZXMuSUNTU01vZGVsCi0JICogQHBhcmFtIHJlbW92ZWQgY29tLmlibS5zZWQuY3NzLm1vZGVsLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yW10KLQkgKiBAcGFyYW0gYWRkZWQgY29tLmlibS5zZWQuY3NzLm1vZGVsLmludGVyZmFjZXMuSUNTU1NlbGVjdG9yW10KLQkgKiBAcGFyYW0gbWVkaWEgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHN0eWxlQ2hhbmdlZChJQ1NTTW9kZWwgc3JjTW9kZWwsIElDU1NTZWxlY3RvcltdIHJlbW92ZWQsIElDU1NTZWxlY3RvcltdIGFkZGVkLCBTdHJpbmcgbWVkaWEpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBtaWdodCByZWxlYXNlZAotCQlEb2N1bWVudCBkb2MgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCS8vIHRvIG5vdGlmeSBHRUYgdHJlZSAKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUNvbGxlY3Rpb24gYWRhcHRlcnMgPSAoKElOb2RlTm90aWZpZXIpIGRvYykuZ2V0QWRhcHRlcnMoKTsKLQkJCWlmIChhZGFwdGVycyA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCUl0ZXJhdG9yIGl0ID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJCWlmIChpdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IChJTm9kZUFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElDU1NTdHlsZUxpc3RlbmVyKSB7Ci0JCQkJCSgoSUNTU1N0eWxlTGlzdGVuZXIpIGFkYXB0ZXIpLnN0eWxlQ2hhbmdlZChzcmNNb2RlbCwgcmVtb3ZlZCwgYWRkZWQsIG1lZGlhKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8KLQotCQlpZiAoc3R5bGVDaGFuZ2VkTm9kZXMgPT0gbnVsbCkgewotCQkJc3R5bGVDaGFuZ2VkTm9kZXMgPSBuZXcgSGFzaFNldCgpOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCWludCByZW1vdmVkU2VsTnVtID0gcmVtb3ZlZCAhPSBudWxsID8gcmVtb3ZlZC5sZW5ndGggOiAwOwotCQkJaW50IGFkZGVkU2VsTnVtID0gYWRkZWQgIT0gbnVsbCA/IGFkZGVkLmxlbmd0aCA6IDA7Ci0KLQkJCU5vZGVJdGVyYXRvciBpdGVyID0gKChEb2N1bWVudFRyYXZlcnNhbCkgZG9jKS5jcmVhdGVOb2RlSXRlcmF0b3IoZG9jLCBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCwgbnVsbCwgdHJ1ZSk7Ci0JCQlOb2RlIG5vZGU7Ci0JCQl3aGlsZSAoKG5vZGUgPSBpdGVyLm5leHROb2RlKCkpICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnQgZWxtID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJCWJvb2xlYW4gbWF0Y2ggPSBmYWxzZTsKLQkJCQkJaW50IGk7Ci0JCQkJCWZvciAoaSA9IDA7IGkgPCByZW1vdmVkU2VsTnVtICYmICFtYXRjaDsgaSsrKSB7Ci0JCQkJCQltYXRjaCA9IHJlbW92ZWRbaV0ubWF0Y2goZWxtLCBudWxsKTsKLQkJCQkJfQotCQkJCQlmb3IgKGkgPSAwOyBpIDwgYWRkZWRTZWxOdW0gJiYgIW1hdGNoOyBpKyspIHsKLQkJCQkJCW1hdGNoID0gYWRkZWRbaV0ubWF0Y2goZWxtLCBudWxsKTsKLQkJCQkJfQotCQkJCQlpZiAobWF0Y2gpIHsKLQkJCQkJCWlmICghc3R5bGVDaGFuZ2VkTm9kZXMuY29udGFpbnMoZWxtKSkKLQkJCQkJCQlzdHlsZUNoYW5nZWROb2Rlcy5hZGQoZWxtKTsKLQkJCQkJCS8vIG5vdGlmeVN0eWxlQ2hhbmdlZChlbG0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKLQkJCS8vIERvY3VtZW50IGRvZXNuJ3QgaW1wbGVtZW50IERvY3VtZW50VHJhdmVyc2FsLi4uCi0JCX0KLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzcmNNb2RlbCBjb20uaWJtLnNlZC5jc3MubW9kZWwuaW50ZXJmYWNlcy5JQ1NTTW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHlsZVVwZGF0ZShJQ1NTTW9kZWwgc3JjTW9kZWwpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTW9kZWwgbW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gbW9kZWwuZ2V0TW9kZWxOb3RpZmllcigpOwotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBiZWZvcmUgdXBkYXRpbmcsIGFsbCBzdWItbW9kZWxzIHNob3VsZCBiZSBsb2FkZWQhCi0JCURvY3VtZW50U3R5bGUgZG9jdW1lbnQgPSAoRG9jdW1lbnRTdHlsZSkgbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJU3R5bGVTaGVldExpc3Qgc3R5bGVzID0gZG9jdW1lbnQuZ2V0U3R5bGVTaGVldHMoKTsKLQkJaWYgKHN0eWxlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbiA9IHN0eWxlcy5nZXRMZW5ndGgoKTsKLQkJCUltcG9ydGVkQ29sbGVjdG9yIHRyYXYgPSBuZXcgSW1wb3J0ZWRDb2xsZWN0b3IoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQkJb3JnLnczYy5kb20uc3R5bGVzaGVldHMuU3R5bGVTaGVldCBzaGVldCA9IHN0eWxlcy5pdGVtKGkpOwotCQkJCWlmIChzaGVldCBpbnN0YW5jZW9mIElDU1NOb2RlKQotCQkJCQl0cmF2LmFwcGx5KChJQ1NTTm9kZSkgc2hlZXQpOwotCQkJfQotCQl9Ci0KLQkJLy8gZmxhc2ggc3R5bGUgY2hhbmdlZCBldmVudHMKLQkJaWYgKHN0eWxlQ2hhbmdlZE5vZGVzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGVsZW1lbnRzID0gc3R5bGVDaGFuZ2VkTm9kZXMudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGVsZW1lbnRzICE9IG51bGwgJiYgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotCQkJCW5vdGlmeVN0eWxlQ2hhbmdlZCgoRWxlbWVudCkgZWxlbWVudHNbaV0pOwotCQkJc3R5bGVDaGFuZ2VkTm9kZXMuY2xlYXIoKTsKLQkJfQotCi0JCS8vIHRvIG5vdGlmeSBHRUYgdHJlZSAKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJQ29sbGVjdGlvbiBhZGFwdGVycyA9ICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJzKCk7Ci0JCQlpZiAoYWRhcHRlcnMgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlJdGVyYXRvciBpdCA9IGFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCQlpZiAoaXQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU5vZGVBZGFwdGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJQ1NTU3R5bGVMaXN0ZW5lcikgewotCQkJCQkoKElDU1NTdHlsZUxpc3RlbmVyKSBhZGFwdGVyKS5zdHlsZVVwZGF0ZShzcmNNb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJbm90aWZpZXIucHJvcGVydHlDaGFuZ2VkKG5vZGUpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5Q29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTcyYWU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5Q29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuUHJvcENNUHJvcGVydHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZURlY2xJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1ZhbHVlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC51dGlsLkNTU0xpbmtDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb24uQ1NTUHJvcGVydHlDb250ZXh0OwotCi0vKioKLSAqLwotY2xhc3MgQ1NTUXVlcnlDb250ZXh0IGV4dGVuZHMgQ1NTUHJvcGVydHlDb250ZXh0IHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NRdWVyeUNvbnRleHQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5Q29udGV4dChJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCXN1cGVyKGRlY2wpOwotCX0KLQotCS8qKgotCSAqCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHlGdWxsKElDU1NTdHlsZURlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRW51bWVyYXRpb24ga2V5cyA9IGZQcm9wZXJ0aWVzLmtleXMoKTsKLQkJd2hpbGUgKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBrZXkgPSBrZXlzLm5leHRFbGVtZW50KCk7Ci0JCQlPYmplY3QgdmFsID0gZlByb3BlcnRpZXMuZ2V0KGtleSk7Ci0KLQkJCWlmICh2YWwgaW5zdGFuY2VvZiBDU1NRdWVyeURlY2xhcmF0aW9uRGF0YSkgewotCQkJCUlDU1NTdHlsZURlY2xJdGVtIGRlY2xJdGVtID0gKChDU1NRdWVyeURlY2xhcmF0aW9uRGF0YSkgdmFsKS5nZXREZWNsSXRlbSgpOwotCQkJCWlmIChkZWNsSXRlbS5nZXRMZW5ndGgoKSA8PSAwKSB7Ci0JCQkJCUlDU1NTdHlsZURlY2xJdGVtIGl0ZW1Ub1JlbW92ZSA9IGRlY2wuZ2V0RGVjbEl0ZW1Ob2RlKGtleS50b1N0cmluZygpKTsKLQkJCQkJaWYgKGl0ZW1Ub1JlbW92ZSAhPSBudWxsKSB7Ci0JCQkJCQlkZWNsLnJlbW92ZURlY2xJdGVtTm9kZShpdGVtVG9SZW1vdmUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlkZWNsLnNldERlY2xJdGVtTm9kZShkZWNsSXRlbSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIHZhbHVlID0gKHZhbCBpbnN0YW5jZW9mIElDU1NWYWx1ZSkgPyAoKElDU1NWYWx1ZSkgdmFsKS5nZXRDU1NWYWx1ZVRleHQoKSA6IHZhbC50b1N0cmluZygpOwotCi0JCQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPD0gMCkgewotCQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBpdGVtVG9SZW1vdmUgPSBkZWNsLmdldERlY2xJdGVtTm9kZShrZXkudG9TdHJpbmcoKSk7Ci0JCQkJCWlmIChpdGVtVG9SZW1vdmUgIT0gbnVsbCkgewotCQkJCQkJZGVjbC5yZW1vdmVEZWNsSXRlbU5vZGUoaXRlbVRvUmVtb3ZlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZGVjbC5zZXRQcm9wZXJ0eShrZXkudG9TdHJpbmcoKSwgdmFsdWUsIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVjayhTdHJpbmcgcHJvcE5hbWUsIGJvb2xlYW4gaW1wb3J0YW50LCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJT2JqZWN0IGN1cnJlbnQgPSBmUHJvcGVydGllcy5nZXQocHJvcE5hbWUpOwotCQlpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQgaW5zdGFuY2VvZiBDU1NRdWVyeVZhbHVlRGF0YSkgewotCQkJQ1NTUXVlcnlWYWx1ZURhdGEgY3VycmVudFZhbHVlID0gKENTU1F1ZXJ5VmFsdWVEYXRhKSBjdXJyZW50OwotCQkJaWYgKCghaW1wb3J0YW50ICYmIGN1cnJlbnRWYWx1ZS5pbXBvcnRhbnQpIHx8IChjdXJyZW50VmFsdWUuZ2V0U3BlY2lmaWNpdHkoKSA+IHNwZWNpZmljaXR5KSkgewotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBvdmVycmlkZVdpdGhFeHBhbmQoSUNTU1N0eWxlRGVjbGFyYXRpb24gZGVjbCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQ1NTTGlua0NvbnZlcnRlciBjb252ID0gbmV3IENTU0xpbmtDb252ZXJ0ZXIoZGVjbC5nZXRPd25lckRvY3VtZW50KCkuZ2V0TW9kZWwoKSk7Ci0KLQkJaW50IG5Qcm9wZXJ0aWVzID0gZGVjbC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUHJvcGVydGllczsgaSsrKSB7Ci0JCQlTdHJpbmcgcHJvcE5hbWUgPSBkZWNsLml0ZW0oaSk7Ci0JCQlpZiAocHJvcE5hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBwcm9wTiA9IHByb3BOYW1lLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwotCQkJCWlmIChwcm9wTi5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCVByb3BDTVByb3BlcnR5IHByb3AgPSBQcm9wQ01Qcm9wZXJ0eS5nZXRJbnN0YW5jZU9mKHByb3BOKTsKLQkJCQkJU3RyaW5nIHByaW9yaXR5ID0gZGVjbC5nZXRQcm9wZXJ0eVByaW9yaXR5KHByb3BOYW1lKTsKLQkJCQkJYm9vbGVhbiBpbXBvcnRhbnQgPSBwcmlvcml0eSAhPSBudWxsICYmIHByaW9yaXR5Lmxlbmd0aCgpID4gMDsKLQkJCQkJaWYgKHByb3AgIT0gbnVsbCAmJiBwcm9wLmlzU2hvcnRoYW5kKCkpIHsKLQkJCQkJCS8vIGV4cGFuZCBzaG9ydGhhbmQgcHJvcGVydHkKLQkJCQkJCUNTU1F1ZXJ5Q29udGV4dCBjb250ZXh0ID0gbmV3IENTU1F1ZXJ5Q29udGV4dCgpOwotCQkJCQkJZXhwYW5kVG9MZWFmKHByb3AsIGRlY2wuZ2V0UHJvcGVydHlWYWx1ZShwcm9wTmFtZSksIGNvbnRleHQpOwotCi0JCQkJCQlFbnVtZXJhdGlvbiBwcm9wZXJ0aWVzID0gY29udGV4dC5wcm9wZXJ0aWVzKCk7Ci0JCQkJCQl3aGlsZSAocHJvcGVydGllcy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCQkJCXByb3BOID0gcHJvcGVydGllcy5uZXh0RWxlbWVudCgpLnRvU3RyaW5nKCk7Ci0JCQkJCQkJaWYgKGNoZWNrKHByb3BOLCBpbXBvcnRhbnQsIHNwZWNpZmljaXR5KSkgewotCQkJCQkJCQlmUHJvcGVydGllcy5wdXQocHJvcE4sIG5ldyBDU1NRdWVyeVZhbHVlRGF0YShjb252LnRvQWJzb2x1dGUoY29udGV4dC5nZXQocHJvcE4pKSwgaW1wb3J0YW50LCBzcGVjaWZpY2l0eSkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChjaGVjayhwcm9wTiwgaW1wb3J0YW50LCBzcGVjaWZpY2l0eSkpIHsKLQkJCQkJCQlJQ1NTU3R5bGVEZWNsSXRlbSBkZWNsSXRlbSA9IChJQ1NTU3R5bGVEZWNsSXRlbSkgZGVjbC5nZXREZWNsSXRlbU5vZGUocHJvcE5hbWUpLmNsb25lTm9kZSh0cnVlKTsKLQkJCQkJCQlpbnQgblZhbHVlcyA9IGRlY2xJdGVtLmdldExlbmd0aCgpOwotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgblZhbHVlczsgaisrKSB7Ci0JCQkJCQkJCWNvbnYudG9BYnNvbHV0ZShkZWNsSXRlbS5pdGVtKGopKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZGVjbEl0ZW0uc2V0UHJpb3JpdHkobnVsbCk7Ci0JCQkJCQkJZlByb3BlcnRpZXMucHV0KHByb3BOLCBuZXcgQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEoZGVjbEl0ZW0sIGltcG9ydGFudCwgc3BlY2lmaWNpdHkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeURlY2xhcmF0aW9uRGF0YS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlEZWNsYXJhdGlvbkRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE1NmQyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9DU1NRdWVyeURlY2xhcmF0aW9uRGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbEl0ZW07Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU1F1ZXJ5RGVjbGFyYXRpb25EYXRhIGV4dGVuZHMgQ1NTUXVlcnlWYWx1ZURhdGEgewotCi0KLQlJQ1NTU3R5bGVEZWNsSXRlbSBkZWNsSXRlbTsKLQotCXB1YmxpYyBDU1NRdWVyeURlY2xhcmF0aW9uRGF0YShJQ1NTU3R5bGVEZWNsSXRlbSBkZWNsSXRlbSwgYm9vbGVhbiBpbXAsIGludCBzcGVjaWZpY2l0eSkgewotCQlzdXBlcihudWxsLCBpbXAsIHNwZWNpZmljaXR5KTsKLQkJdGhpcy5kZWNsSXRlbSA9IGRlY2xJdGVtOwotCX0KLQotCS8qKgotCSAqLwotCUlDU1NTdHlsZURlY2xJdGVtIGdldERlY2xJdGVtKCkgewotCQlyZXR1cm4gZGVjbEl0ZW07Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJaWYgKHZhbHVlID09IG51bGwgJiYgZGVjbEl0ZW0gIT0gbnVsbCkgewotCQkJdmFsdWUgPSBkZWNsSXRlbS5nZXRDU1NWYWx1ZVRleHQoKTsKLQkJfQotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlUcmF2ZXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5VHJhdmVyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZjZiNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlUcmF2ZXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU05vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1NlbGVjdG9yTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU1N0eWxlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTdHlsZVJ1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQWJzdHJhY3RDc3NUcmF2ZXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuRWxlbWVudENTU0lubGluZVN0eWxlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENTU1F1ZXJ5VHJhdmVyc2VyIGV4dGVuZHMgQWJzdHJhY3RDc3NUcmF2ZXJzZXIgewotCi0JcHJpdmF0ZSBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJpdmF0ZSBTdHJpbmcgcHNldWRvTmFtZTsKLQlwcml2YXRlIENTU1F1ZXJ5Q29udGV4dCBjb250ZXh0ID0gbnVsbDsKLQlJQ1NTU3R5bGVEZWNsYXJhdGlvbiBkZWNsID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpIHsKLQkJdHJ5IHsKLQkJCUlDU1NTdHlsZURlY2xhcmF0aW9uIGlubGluZVN0eWxlID0gKElDU1NTdHlsZURlY2xhcmF0aW9uKSAoKEVsZW1lbnRDU1NJbmxpbmVTdHlsZSkgZWxlbWVudCkuZ2V0U3R5bGUoKTsKLQkJCWlmIChpbmxpbmVTdHlsZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkJCQljb250ZXh0ID0gbmV3IENTU1F1ZXJ5Q29udGV4dCgpOwotCQkJCX0KLQkJCQljb250ZXh0Lm92ZXJyaWRlV2l0aEV4cGFuZChpbmxpbmVTdHlsZSwgMTAwMDApOwotCQkJCS8vIHN0eWxlIGF0dHJpYnV0ZSdzIHNwZWNpZmljaXR5IGlzIDEwMCAoaW4gQ1NTMiBzcGVjLikgYW5kCi0JCQkJLy8gb3VyIGltcGxlbWVudCB1c2UgMTAwIGFzIGJhc2UgbnVtYmVyIChzZWUgQ1NTU2VsZWN0b3IuamF2YSkKLQkJCX0KLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkvLyBlbGVtZW50IGlzIG5vdCBFbGVtZW50Q1NTSW5saW5lU3R5bGUgPz8/Ci0JCX0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChkZWNsID09IG51bGwpCi0JCQlkZWNsID0gQ1NTU3R5bGVEZWNsYXJhdGlvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKS5jcmVhdGVTdHlsZURlY2xhcmF0aW9uKCk7Ci0JCWNvbnRleHQuYXBwbHlGdWxsKGRlY2wpOwotCQlyZXR1cm4gZGVjbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgb3ZlcndyaXRlRGVjbGFyYXRpb24oSUNTU1N0eWxlRGVjbGFyYXRpb24gZCwgaW50IHNwZWNpZmljaXR5KSB7Ci0JCWlmIChkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQljb250ZXh0ID0gbmV3IENTU1F1ZXJ5Q29udGV4dCgpOwotCQljb250ZXh0Lm92ZXJyaWRlV2l0aEV4cGFuZChkLCBzcGVjaWZpY2l0eSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHNob3J0IHBvc3ROb2RlKElDU1NOb2RlIG5vZGUpIHsKLQkJcmV0dXJuIFRSQVZfQ09OVDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgcHJlTm9kZShJQ1NTTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgSUNTU1N0eWxlUnVsZSkgewotCQkJLy8gc3R5bGUgcnVsZQotCQkJSUNTU1N0eWxlUnVsZSBzdHlsZSA9IChJQ1NTU3R5bGVSdWxlKSBub2RlOwotCQkJSUNTU1NlbGVjdG9yTGlzdCBsaXN0ID0gc3R5bGUuZ2V0U2VsZWN0b3JzKCk7Ci0JCQlpbnQgblNlbGVjdG9ycyA9IGxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQlpbnQgbWF4U3BlY2lmaWNpdHkgPSAtMTsKLQkJCWZvciAoaW50IGlTZWxlY3RvciA9IDA7IGlTZWxlY3RvciA8IG5TZWxlY3RvcnM7IGlTZWxlY3RvcisrKSB7Ci0JCQkJLy8gQ2hlY2sgZWFjaCBTZWxlY3RvciBMaXN0cwotCQkJCUlDU1NTZWxlY3RvciBzZWxlY3RvciA9IGxpc3QuZ2V0U2VsZWN0b3IoaVNlbGVjdG9yKTsKLQkJCQlpbnQgc3BlY2lmaWNpdHkgPSBzZWxlY3Rvci5nZXRTcGVjaWZpY2l0eSgpOwotCQkJCWlmIChtYXhTcGVjaWZpY2l0eSA8IHNwZWNpZmljaXR5ICYmIHNlbGVjdG9yLm1hdGNoKGVsZW1lbnQsIHBzZXVkb05hbWUpKSB7Ci0JCQkJCW1heFNwZWNpZmljaXR5ID0gc3BlY2lmaWNpdHk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKG1heFNwZWNpZmljaXR5ID49IDApIHsKLQkJCQkvLyBhcHBseSB0aGlzIHN0eWxlIHRvIHRoZSBlbGVtZW50Ci0JCQkJb3ZlcndyaXRlRGVjbGFyYXRpb24oKElDU1NTdHlsZURlY2xhcmF0aW9uKSBzdHlsZS5nZXRTdHlsZSgpLCBtYXhTcGVjaWZpY2l0eSk7Ci0JCQl9Ci0JCQlyZXR1cm4gVFJBVl9QUlVORTsKLQkJfQotCQlyZXR1cm4gVFJBVl9DT05UOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldENvbnRleHQoKSB7Ci0JCWNvbnRleHQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVsZW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQl0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwotCQl0aGlzLnBzZXVkb05hbWUgPSBwc2V1ZG9OYW1lOwotCQlyZXNldENvbnRleHQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlWYWx1ZURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0NTU1F1ZXJ5VmFsdWVEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZDc0Y2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvQ1NTUXVlcnlWYWx1ZURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuZGVjbGFyYXRpb24uVmFsdWVEYXRhOwotCi0KLQotLyoqCi0gKi8KLWNsYXNzIENTU1F1ZXJ5VmFsdWVEYXRhIGV4dGVuZHMgVmFsdWVEYXRhIHsKLQotCXByaXZhdGUgaW50IHNwZWNpZmljaXR5OwotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5VmFsdWVEYXRhKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NRdWVyeVZhbHVlRGF0YShTdHJpbmcgdmFsLCBib29sZWFuIGltcCkgewotCQlzdXBlcih2YWwsIGltcCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENTU1F1ZXJ5VmFsdWVEYXRhKFN0cmluZyB2YWwsIGJvb2xlYW4gaW1wLCBpbnQgc3BlY2lmaWNpdHkpIHsKLQkJc3VwZXIodmFsLCBpbXApOwotCQl0aGlzLnNwZWNpZmljaXR5ID0gc3BlY2lmaWNpdHk7Ci0JfQotCi0JLyoqCi0JICovCi0JaW50IGdldFNwZWNpZmljaXR5KCkgewotCQlyZXR1cm4gc3BlY2lmaWNpdHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxEb2N1bWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxEb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJjZWIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MRG9jdW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTSW1wb3J0UnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUNTU01vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5DU1NDbGFzc1RyYXZlcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwudXRpbC5JbXBvcnRSdWxlQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkpTUDExTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5jc3MuQ1NTU3R5bGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0OwotaW1wb3J0IG9yZy53M2MuZG9tLnN0eWxlc2hlZXRzLlN0eWxlU2hlZXRMaXN0OwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRBZGFwdGVyIGltcGxlbWVudHMgSVN0eWxlU2hlZXRMaXN0QWRhcHRlciwgU3R5bGVTaGVldExpc3QgewotCi0JcHJpdmF0ZSBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBWZWN0b3Igc3R5bGVBZGFwdGVycyA9IG51bGw7Ci0JcHJpdmF0ZSBWZWN0b3Igb2xkU3R5bGVBZGFwdGVycyA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlIVE1MRG9jdW1lbnRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRTdHlsZVNoZWV0KEVsZW1lbnQgbm9kZSkgewotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlib29sZWFuIGlzQ29udGFpbmVyID0gZmFsc2U7Ci0JCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5OT1NDUklQVCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCkgfHwgKCFlbGVtZW50LmlzR2xvYmFsVGFnKCkgJiYgZWxlbWVudC5pc0NvbnRhaW5lcigpKSkgewotCQkJaXNDb250YWluZXIgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCU5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ID09IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKSB7Ci0JCQkJLy8gVGhpcyBjb25kaXRpb24gaXMgdG9vIHNldmVyZSwgYWN0dWFsbHkgZG8gbm90IHdvcmsgZm9yIEpTRiB0ZW1wbGF0ZS4KLQkJCQkvLyBCdXQgYWJvdmUgKCEgZ2xvYmFsVGFnKCkgJiYgaXNDb250YWluZXIoKSkgY292ZXIgSlNGIHRlbXBsYXRlICsgdHBsIHRlbXBsYXRlCi0JCQkJaXNDb250YWluZXIgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQl0YWdOYW1lID0gKChFbGVtZW50KSBwYXJlbnQpLmdldFRhZ05hbWUoKTsKLQkJCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCkpIHsKLQkJCQkJaXNDb250YWluZXIgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWVsc2UgewotCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQlpZiAobG9jYWxOYW1lICE9IG51bGwgJiYgbG9jYWxOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwpKSB7Ci0JCQkJLy8gdGFnbGliIGh0bWwgdGFnCi0JCQkJaXNDb250YWluZXIgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IGVsZW1lbnQ7Ci0JCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBub3RpZmllci5nZXRBZGFwdGVyRm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyIGluc3RhbmNlb2YgSVN0eWxlU2hlZXRBZGFwdGVyKSB7Ci0JCQkJCXRoaXMuc3R5bGVBZGFwdGVycy5hZGRFbGVtZW50KGFkYXB0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoaXNDb250YWluZXIpIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSBlbGVtZW50OwotCQkJaWYgKG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKSA9PSBudWxsKSB7Ci0JCQkJbm90aWZpZXIuYWRkQWRhcHRlcih0aGlzKTsKLQkJCX0KLQkJCWZvciAoTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJY29udGludWU7Ci0JCQkJYWRkU3R5bGVTaGVldCgoRWxlbWVudCkgY2hpbGQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKCkgewotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gYmFja3VwIG9sZCBhZGFwdGVycyB0byBiZSByZWxlYXNlZCBvbiB1cGRhdGluZyBpbiBnZXRTdHlsZVNoZWV0cygpCi0JCXRoaXMub2xkU3R5bGVBZGFwdGVycyA9IHRoaXMuc3R5bGVBZGFwdGVyczsKLQkJLy8gaW52YWxpZGF0ZSB0aGUgbGlzdAotCQl0aGlzLnN0eWxlQWRhcHRlcnMgPSBudWxsOwotCi0JCW5vdGlmeVN0eWxlU2hlZXRzQ2hhbmdlZCh0aGlzLmRvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRW51bWVyYXRpb24gZ2V0Q2xhc3NlcygpIHsKLQkJU3R5bGVTaGVldExpc3Qgc2hlZXRMaXN0ID0gZ2V0U3R5bGVTaGVldHMoKTsKLQkJaW50IG5TaGVldHMgPSBzaGVldExpc3QuZ2V0TGVuZ3RoKCk7Ci0KLQkJZmluYWwgQXJyYXlMaXN0IGNsYXNzZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJQ1NTQ2xhc3NUcmF2ZXJzZXIgdHJhdmVyc2VyID0gbmV3IENTU0NsYXNzVHJhdmVyc2VyKCk7Ci0JCXRyYXZlcnNlci5zZXRUcmF2ZXJzZUltcG9ydGVkKHRydWUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgblNoZWV0czsgaSsrKSB7Ci0JCQlvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0IHNoZWV0ID0gc2hlZXRMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoc2hlZXQgaW5zdGFuY2VvZiBJQ1NTTm9kZSkgewotCQkJCXRyYXZlcnNlci5hcHBseSgoSUNTU05vZGUpIHNoZWV0KTsKLQkJCX0KLQkJfQotCQljbGFzc2VzLmFkZEFsbCh0cmF2ZXJzZXIuZ2V0Q2xhc3NOYW1lcygpKTsKLQotCQlyZXR1cm4gbmV3IEVudW1lcmF0aW9uKCkgewotCQkJaW50IGkgPSAwOwotCi0JCQlwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCQkJcmV0dXJuIGkgPCBjbGFzc2VzLnNpemUoKTsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdCBuZXh0RWxlbWVudCgpIHsKLQkJCQlyZXR1cm4gY2xhc3Nlcy5nZXQoaSsrKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIExpc3QgZ2V0VmFsaWRBZGFwdGVycygpIHsKLQkJVmVjdG9yIHZhbGlkQWRhcHRlcnMgPSBuZXcgVmVjdG9yKCk7Ci0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IHRoaXMuc3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyICYmICgoQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlcikgb2JqKS5pc1ZhbGlkQXR0cmlidXRlKCkpIHsKLQkJCQkJdmFsaWRBZGFwdGVycy5hZGQob2JqKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHZhbGlkQWRhcHRlcnM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRWYWxpZEFkYXB0ZXJzKCkuc2l6ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBDU1NTdHlsZURlY2xhcmF0aW9uIGdldE92ZXJyaWRlU3R5bGUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlTdHlsZVNoZWV0TGlzdCBzc2wgPSBnZXRTdHlsZVNoZWV0cygpOwotCQlpbnQgbnVtU3R5bGVzID0gc3NsLmdldExlbmd0aCgpOwotCi0JCUNTU1F1ZXJ5VHJhdmVyc2VyIHF1ZXJ5ID0gbmV3IENTU1F1ZXJ5VHJhdmVyc2VyKCk7Ci0JCXF1ZXJ5LnNldFRyYXZlcnNlSW1wb3J0ZWQodHJ1ZSk7Ci0JCXF1ZXJ5LnNldFRyYXZlcnNlSW1wb3J0Rmlyc3QodHJ1ZSk7Ci0JCXF1ZXJ5LnNldEVsZW1lbnQoZWxlbWVudCwgcHNldWRvTmFtZSk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TdHlsZXM7IGkrKykgewotCQkJLy8gbG9vcCBmb3Igc3R5bGVzICg8c3R5bGU+IGFuZCA8bGluaz4pCi0JCQlvcmcudzNjLmRvbS5zdHlsZXNoZWV0cy5TdHlsZVNoZWV0IHNzID0gc3NsLml0ZW0oaSk7Ci0KLQkJCXRyeSB7Ci0JCQkJcXVlcnkuYXBwbHkoKElDU1NOb2RlKSBzcyk7Ci0JCQl9Ci0JCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4KSB7Ci0JCQkJLy8gSSBjYW4gaGFuZGxlIG9ubHkgQ1NTIHN0eWxlCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcXVlcnkuZ2V0RGVjbGFyYXRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldExpc3QgZ2V0U3R5bGVTaGVldHMoKSB7Ci0JCWlmICh0aGlzLnN0eWxlQWRhcHRlcnMgPT0gbnVsbCkgewotCQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJdGhpcy5zdHlsZUFkYXB0ZXJzID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChOb2RlIGNoaWxkID0gdGhpcy5kb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljb250aW51ZTsKLQkJCQlhZGRTdHlsZVNoZWV0KChFbGVtZW50KSBjaGlsZCk7Ci0JCQl9Ci0KLQkJCXJlbW92ZU9sZFN0eWxlU2hlZXRzKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBJU3R5bGVTaGVldExpc3RBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3R5bGVTaGVldCBpdGVtKGludCBpbmRleCkgewotCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlMaXN0IHZhbGlkQWRhcHRlcnMgPSBnZXRWYWxpZEFkYXB0ZXJzKCk7Ci0KLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB2YWxpZEFkYXB0ZXJzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHlsZVNoZWV0IHNoZWV0ID0gKChJU3R5bGVTaGVldEFkYXB0ZXIpIHZhbGlkQWRhcHRlcnMuZ2V0KGluZGV4KSkuZ2V0U2hlZXQoKTsKLQkJaWYgKHNoZWV0ID09IG51bGwpIHsvLyBmb3IgTElOSyBlbGVtZW50IHdob3NlIGxpbmsgaXMgYnJva2VuCi0JCQlJQ1NTTW9kZWwgbW9kZWwgPSAoKEFic3RyYWN0U3R5bGVTaGVldEFkYXB0ZXIpIHZhbGlkQWRhcHRlcnMuZ2V0KGluZGV4KSkuY3JlYXRlTW9kZWwoKTsKLQkJCXNoZWV0ID0gKChtb2RlbCAhPSBudWxsKSA/IChTdHlsZVNoZWV0KSBtb2RlbC5nZXREb2N1bWVudCgpIDogbnVsbCk7Ci0JCX0KLQkJcmV0dXJuIHNoZWV0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlOb2RlIG5vZGUgPSBudWxsOwotCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkFERCA6Ci0JCQkJbm9kZSA9IChOb2RlKSBuZXdWYWx1ZTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU5vZGVOb3RpZmllci5SRU1PVkUgOgotCQkJCW5vZGUgPSAoTm9kZSkgb2xkVmFsdWU7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElOb2RlTm90aWZpZXIuQ0hBTkdFIDoKLQkJCQlub2RlID0gKE5vZGUpIG5vdGlmaWVyOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJYnJlYWs7Ci0JCX0KLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm47Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQkFTRSkpIHsKLQkJCQlyZWZyZXNoQWRhcHRlcnMoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhUTUwpIHx8IHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuSEVBRCkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkgfHwgdGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5MSU5LKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLk5PU0NSSVBUKSB8fCB0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSlNQMTFOYW1lc3BhY2UuRWxlbWVudE5hbWUuUk9PVCkgfHwgZWxlbWVudC5pc0NvbW1lbnRUYWcoKSB8fCAoIWVsZW1lbnQuaXNHbG9iYWxUYWcoKSAmJiBlbGVtZW50LmlzQ29udGFpbmVyKCkpKSB7Ci0JCQkJY2hpbGRSZXBsYWNlZCgpOwotCQkJfQotCQkJZWxzZSBpZiAodGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5CQVNFKSkgewotCQkJCXJlZnJlc2hBZGFwdGVycygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7Ci0JCQkJaWYgKGxvY2FsTmFtZSAhPSBudWxsICYmIGxvY2FsTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MKSkgewotCQkJCQkvLyB0YWdsaWIgaHRtbCB0YWcKLQkJCQkJY2hpbGRSZXBsYWNlZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbG9hZCBMSU5LIC8gQGltcG9ydCBpZiBCQVNFIGNoYW5nZWQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVmcmVzaEFkYXB0ZXJzKCkgewotCQlJdGVyYXRvciBpQWRhcHRlciA9IHRoaXMuc3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaUFkYXB0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgYWRhcHRlciA9IGlBZGFwdGVyLm5leHQoKTsKLQkJCWlmIChhZGFwdGVyIGluc3RhbmNlb2YgTGlua0VsZW1lbnRBZGFwdGVyKSB7Ci0JCQkJKChMaW5rRWxlbWVudEFkYXB0ZXIpIGFkYXB0ZXIpLnJlZnJlc2hTaGVldCgpOwotCQkJfQotCQkJZWxzZSBpZiAoYWRhcHRlciBpbnN0YW5jZW9mIFN0eWxlRWxlbWVudEFkYXB0ZXIpIHsKLQkJCQlJQ1NTTW9kZWwgbW9kZWwgPSAoKFN0eWxlRWxlbWVudEFkYXB0ZXIpIGFkYXB0ZXIpLmdldE1vZGVsKCk7Ci0JCQkJSW1wb3J0UnVsZUNvbGxlY3RvciB0cmF2ID0gbmV3IEltcG9ydFJ1bGVDb2xsZWN0b3IoKTsKLQkJCQl0cmF2LmFwcGx5KG1vZGVsKTsKLQkJCQlJdGVyYXRvciBpUnVsZSA9IHRyYXYuZ2V0UnVsZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpUnVsZS5oYXNOZXh0KCkpIHsKLQkJCQkJSUNTU0ltcG9ydFJ1bGUgcnVsZSA9IChJQ1NTSW1wb3J0UnVsZSkgaVJ1bGUubmV4dCgpOwotCQkJCQlydWxlLnJlZnJlc2hTdHlsZVNoZWV0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVN0eWxlU2hlZXRzQ2hhbmdlZChEb2N1bWVudCB0YXJnZXQpIHsKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSB0YXJnZXQ7Ci0JCWlmIChub3RpZmllciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlDb2xsZWN0aW9uIGFkYXB0ZXJzID0gbm90aWZpZXIuZ2V0QWRhcHRlcnMoKTsKLQkJaWYgKGFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gYWRhcHRlcnMuaXRlcmF0b3IoKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKElOb2RlQWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBTdHlsZUxpc3RlbmVyKSB7Ci0JCQkJU3R5bGVMaXN0ZW5lciBsaXN0ZW5lciA9IChTdHlsZUxpc3RlbmVyKSBhZGFwdGVyOwotCQkJCWxpc3RlbmVyLnN0eWxlQ2hhbmdlZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbGVhc2VPbGRTdHlsZVNoZWV0cygpIHsKLQkJaWYgKHRoaXMub2xkU3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IHRoaXMub2xkU3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJU3R5bGVTaGVldEFkYXB0ZXIgYWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQkvLyBpZiB0aGUgc2FtZSBhZGFwdGVyIGlzIGluIHRoZSBjdXJyZW50IGxpc3QsCi0JCQkvLyBkbyBub3QgcmVsZWFzZQotCQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyAhPSBudWxsICYmIHRoaXMuc3R5bGVBZGFwdGVycy5jb250YWlucyhhZGFwdGVyKSkKLQkJCQljb250aW51ZTsKLQkJCWFkYXB0ZXIucmVsZWFzZWQoKTsKLQkJfQotCQl0aGlzLm9sZFN0eWxlQWRhcHRlcnMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VTdHlsZVNoZWV0cygpIHsKLQkJcmVsZWFzZU9sZFN0eWxlU2hlZXRzKCk7Ci0KLQkJaWYgKHRoaXMuc3R5bGVBZGFwdGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJdGVyYXRvciBpdCA9IHRoaXMuc3R5bGVBZGFwdGVycy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQlJU3R5bGVTaGVldEFkYXB0ZXIgYWRhcHRlciA9IChJU3R5bGVTaGVldEFkYXB0ZXIpIGl0Lm5leHQoKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5yZWxlYXNlZCgpOwotCQl9Ci0JCXRoaXMuc3R5bGVBZGFwdGVycyA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU9sZFN0eWxlU2hlZXRzKCkgewotCQlpZiAodGhpcy5vbGRTdHlsZUFkYXB0ZXJzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUl0ZXJhdG9yIGl0ID0gdGhpcy5vbGRTdHlsZUFkYXB0ZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCUlTdHlsZVNoZWV0QWRhcHRlciBhZGFwdGVyID0gKElTdHlsZVNoZWV0QWRhcHRlcikgaXQubmV4dCgpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCS8vIGlmIHRoZSBzYW1lIGFkYXB0ZXIgaXMgaW4gdGhlIGN1cnJlbnQgbGlzdCwKLQkJCS8vIGRvIG5vdCByZWxlYXNlCi0JCQlpZiAodGhpcy5zdHlsZUFkYXB0ZXJzICE9IG51bGwgJiYgdGhpcy5zdHlsZUFkYXB0ZXJzLmNvbnRhaW5zKGFkYXB0ZXIpKQotCQkJCWNvbnRpbnVlOwotCQkJYWRhcHRlci5yZW1vdmVkKCk7Ci0JCX0KLQkJdGhpcy5vbGRTdHlsZUFkYXB0ZXJzID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIHNldERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEzNDdjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTZWxlY3RvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NTaW1wbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIEluc2VydCB0aGUgdHlwZSdzIGRlc2NyaXB0aW9uIGhlcmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIgaW1wbGVtZW50cyBJU3R5bGVTZWxlY3RvckFkYXB0ZXIgewotCi0Jc3RhdGljIHByaXZhdGUgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyIGluc3RhbmNlOwotCXByaXZhdGUgT2JqZWN0IHRvTWF0Y2ggPSBJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3M7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSB0b01hdGNoOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hdGNoKElDU1NTaW1wbGVTZWxlY3RvciBzZWxlY3RvciwgRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHNldWRvTmFtZSkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgaTsKLQkJU3RyaW5nIGtleTsKLQotCQkvLyBQc2V1ZG9OYW1lCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZlBzZXVkb05hbWVzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJaWYgKHBzZXVkb05hbWUgPT0gbnVsbCB8fCBwc2V1ZG9OYW1lLmxlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJZm9yIChpID0gaSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJaWYgKHBzZXVkb05hbWUuZXF1YWxzSWdub3JlQ2FzZShzZWxlY3Rvci5nZXRQc2V1ZG9OYW1lKGkpKSkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaSA8IDApCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJLy8gY2hlY2sgdGFnIG5hbWUKLQkJaWYgKCFzZWxlY3Rvci5pc1VuaXZlcnNhbCgpICYmICFlbGVtZW50LmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShzZWxlY3Rvci5nZXROYW1lKCkpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCS8vIGNoZWNrIGlkCi0JCWkgPSBzZWxlY3Rvci5nZXROdW1PZklEcygpOwotCQlpZiAoaSA+IDApIHsKLQkJCWlmIChpID4gMSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlrZXkgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgiaWQiKTsvLyROT04tTkxTLTEkCi0JCQlpZiAoa2V5ID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJaWYgKCFzZWxlY3Rvci5nZXRJRCgwKS5lcXVhbHMoa2V5KSkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQkvLyBjaGVjayBjbGFzcwotCQlpID0gc2VsZWN0b3IuZ2V0TnVtT2ZDbGFzc2VzKCk7Ci0JCWlmIChpID4gMCkgewotCQkJa2V5ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNsYXNzIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKGtleSA9PSBudWxsKQotCQkJCXJldHVybiBmYWxzZTsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGtleSk7Ci0JCQlmb3IgKGkgPSBpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCQlib29sZWFuIG9rID0gZmFsc2U7Ci0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJaWYgKHNlbGVjdG9yLmdldENsYXNzKGkpLmVxdWFscyh0b2tlbml6ZXIubmV4dFRva2VuKCkpKSB7Ci0JCQkJCQlvayA9IHRydWU7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW9rKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBhdHRyaWJ1dGVzCi0JCWZvciAoaSA9IHNlbGVjdG9yLmdldE51bU9mQXR0cmlidXRlcygpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHNlbGVjdG9yLmdldEF0dHJpYnV0ZShpKSwgIj1+fCBcdFxyXG5cZiIpOy8vJE5PTi1OTFMtMSQKLQkJCWludCBjb3VudFRva2VucyA9IHRva2VuaXplci5jb3VudFRva2VucygpOwotCQkJaWYgKGNvdW50VG9rZW5zID4gMCkgewotCQkJCVN0cmluZyBhdHRyVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSh0b2tlbml6ZXIubmV4dFRva2VuKCkpOwotCQkJCWlmIChhdHRyVmFsdWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCWlmIChjb3VudFRva2VucyA+IDEpIHsKLQkJCQkJU3RyaW5nIHRva2VuID0gdG9rZW5pemVyLm5leHRUb2tlbigiPSBcdFxyXG5cZiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVG9rZW5pemVyIGF0dHJWYWx1ZVRva2VuaXplciA9IG51bGw7Ci0JCQkJCWlmICh0b2tlbi5lcXVhbHMoIn4iKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJCWF0dHJWYWx1ZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmICh0b2tlbi5lcXVhbHMoInwiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQkJCWF0dHJWYWx1ZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlLCAiLSIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCQlpZiAoYXR0clZhbHVlVG9rZW5pemVyICE9IG51bGwpIHsKLQkJCQkJCWlmICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJCQkJYm9vbGVhbiBvayA9IGZhbHNlOwotCQkJCQkJCXdoaWxlIChhdHRyVmFsdWVUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCQkJCWlmICh0b2tlbi5lcXVhbHMoYXR0clZhbHVlVG9rZW5pemVyLm5leHRUb2tlbigpKSkgewotCQkJCQkJCQkJb2sgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFvaykKLQkJCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKCFhdHRyVmFsdWUuZXF1YWxzKHRva2VuKSkKLQkJCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzY2ZmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL0hUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTZWxlY3RvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotLyoqCi0gKiBJbnNlcnQgdGhlIHR5cGUncyBkZXNjcmlwdGlvbiBoZXJlLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSBpbXBsZW1lbnRzIElOb2RlQWRhcHRlckZhY3RvcnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSBpbnN0YW5jZTsKLQlwcml2YXRlIE9iamVjdCB0b01hdGNoID0gSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzOwotCi0JLyoqCi0JICogQ1NTTW9kZWxQcm92aWRlQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgdGhhdCByZXR1cm5zIHRoZSBhZGFwdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gb2JqZWN0LgotCSAqIEl0IG1heSBiZSBhIHNpbmdsZXRvbiBvciBub3QgLi4uIGRlcGVuZGluZyBvbiB0aGUgbmVlZHMgb2YgdGhlIElOb2RlQWRhcHRlciAgLi4uCi0JICogYnV0IGluIGdlbmVyYWwgaXQgaXMgcmVjb21tZW5kZWQgZm9yIGFuIGFkYXB0ZXIgdG8gYmUgc3RhdGVsZXNzLCAKLQkgKiBzbyB0aGUgZWZmaWNpZW5jaWVzIG9mIGEgc2luZ2xldG9uIGNhbiBiZSBnYWluZWQuCi0JICoKLQkgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgYWRkQWRhcHRlciBvbiB0aGUgYWRhcHRlZAotCSAqIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVTZWxlY3RvckFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0JCWFkYXB0ZXIgPSBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXIuZ2V0SW5zdGFuY2UoKTsKLQkJbm90aWZpZXIuYWRkQWRhcHRlcihhZGFwdGVyKTsKLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFN0eWxlU2VsZWN0b3JBZGFwdGVyRmFjdG9yeSBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0ZhY3RvcnlGb3JUeXBlIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUgPT0gdG9NYXRjaDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvTGlua0VsZW1lbnRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9MaW5rRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDhmMzRlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9MaW5rRWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzczsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSU1vZGVsUHJvdmlkZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0TGlzdEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JDU1M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgTGlua0VsZW1lbnRBZGFwdGVyIGV4dGVuZHMgQWJzdHJhY3RTdHlsZVNoZWV0QWRhcHRlciB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ1NTX0lEID0gQ29udGVudFR5cGVJZEZvckNTUy5Db250ZW50VHlwZUlEX0NTUzsKLQlwcml2YXRlIGJvb2xlYW4gcmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQkvLyB0aGlzIHZhcmlhYmxlIHRvIGhvbGQgdGhlIGNsYXNzIGlzIGp1c3QgYSBWQUphdmEgdHJpY2suCi0JLy8gaXQgaW1wcm92ZXMgcGVyZm9ybWFuY2UgaW4gVkFKYXZhIGJ5IG1pbmltaXppbmcgY2xhc3MgbG9hZGluZy4KLQlwcml2YXRlIGZpbmFsIENsYXNzIE1vZGVsUHJvdmlkZUFkYXB0ZXJDbGFzcyA9IElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIExpbmtFbGVtZW50QWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgYXR0clJlcGxhY2VkKCkgewotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IHRydWU7Ci0KLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudDsKLQkJSFRNTERvY3VtZW50QWRhcHRlciBhZGFwdGVyID0gKEhUTUxEb2N1bWVudEFkYXB0ZXIpIG5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWFkYXB0ZXIuY2hpbGRSZXBsYWNlZCgpOwotCX0KLQotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoKSB7Ci0JCS8vIGNyZWF0ZSBwaGFudG9tKGJyb2tlbiBsaW5rKSBleHRlcm5hbCBDU1MgbW9kZWwKLQkJaWYgKGdldEVsZW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsID0gKChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpKS5nZXRNb2RlbCgpOwotCQlJQ1NTTW9kZWwgbmV3TW9kZWwgPSAoSUNTU01vZGVsKSBiYXNlTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKENTU19JRCk7Ci0KLQkJLy8gY2FsY3VsYXRlIGJhc2UgbG9jYXRpb24gYW5kIHNldAotCQkvLyBnZXQgcmVzb2x2ZXIgaW4gTW9kZWwKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBiYXNlTW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQotCQkvLyByZXNvbHZlIHRvIGFic29sdXRlIHVybCA6IHRoaXMgbmVlZCBub3QgZXhhY3QgbG9jYXRpb24gb2YgY3NzIGZpbGUuIEl0IGlzIGltcG9ydGFudCB0aGF0IGFic3VybCBpcyBub3QgbnVsbC4gCi0JCVN0cmluZyByZWYgPSBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9IUkVGKTsKLQkJU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsICYmIHJlZiAhPSBudWxsKSA/IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkocmVmLCB0cnVlKSA6IG51bGw7Ci0JCWlmICgoYWJzdXJsID09IG51bGwpIHx8IChhYnN1cmwubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKGJhc2VQYXRoLnJlbW92ZUxhc3RTZWdtZW50cygxKS50b1N0cmluZygpKTsKLQkJCWFic3VybCA9IGhlbHBlci50b0Fic29sdXRlKHJlZiA9PSBudWxsID8gIiIgOiByZWYpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoKGFic3VybCA9PSBudWxsKSB8fCAoYWJzdXJsLmxlbmd0aCgpID09IDApKSB7Ci0JCQlhYnN1cmwgPSByZWY7Ci0JCX0KLQkJaWYgKGFic3VybCA9PSBudWxsKSB7Ci0JCQlhYnN1cmwgPSAiIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJbmV3TW9kZWwuc2V0QmFzZUxvY2F0aW9uKGFic3VybCk7Ci0KLQkJLy8gc2V0IHN0eWxlIGxpc3RlbmVyCi0JCW5ld01vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJQ1NTTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKHRoaXMucmVwbGFjZU1vZGVsKSB7Ci0JCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBtb2RlbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSByZXRyaWV2ZU1vZGVsKCk7Ci0JCQkJc2V0TW9kZWwobW9kZWwpOwotCi0JCQkJLy8gcmVsZWFzZSBvbGQgbW9kZWwKLQkJCQlpZiAob2xkTW9kZWwgIT0gbnVsbCkgewotCQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChvbGRNb2RlbCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQkJCW9sZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQkJdGhpcy5yZXBsYWNlTW9kZWwgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5DSEFOR0UpCi0JCQlyZXR1cm47Ci0JCUF0dHIgYXR0ciA9IChBdHRyKSBjaGFuZ2VkRmVhdHVyZTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZSgicmVsIikgfHwgLy8kTk9OLU5MUy0xJAotCQkJCQluYW1lLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSB8fCAvLyROT04tTkxTLTEkCQotCQkJCQluYW1lLmVxdWFsc0lnbm9yZUNhc2UoImhyZWYiKSkgey8vJE5PTi1OTFMtMSQKLQkJCWF0dHJSZXBsYWNlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaFNoZWV0KCkgewotCQlpZiAoIXJlcGxhY2VNb2RlbCkgewotCQkJcmVtb3ZlZCgpOwotCQkJcmVwbGFjZU1vZGVsID0gdHJ1ZTsKLQotCQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCW5vZGUubm90aWZ5KElOb2RlTm90aWZpZXIuQ0hBTkdFLCBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlTm9kZShvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfSFJFRiksIG51bGwsIG51bGwsIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlZCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQotCQkJCS8vIHNldCBlbGVtZW50IHRvIG51bGwgZmlyc3QsIHNvIHRoYXQgbm8gZG9jdW1lbnQgd2lkZSB1cGRhdGVzCi0JCQkJc2V0RWxlbWVudChudWxsKTsKLQkJCQlzZXRNb2RlbChudWxsKTsKLQotCQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJCWFkYXB0ZXIubW9kZWxSZWxlYXNlZChtb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZWQoKSB7Ci0JCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJc2V0TW9kZWwobnVsbCk7Ci0KLQkJCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQkJCUlNb2RlbFByb3ZpZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSU1vZGVsUHJvdmlkZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZ2V0RWxlbWVudCgpKS5nZXRBZGFwdGVyRm9yKElNb2RlbFByb3ZpZGVBZGFwdGVyLmNsYXNzKTsKLQkJCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChtb2RlbCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzVmFsaWRBdHRyaWJ1dGUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHJlbCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJyZWwiKTsvLyROT04tTkxTLTEkCi0JCWlmIChyZWwgPT0gbnVsbCB8fCAhcmVsLmVxdWFsc0lnbm9yZUNhc2UoInN0eWxlc2hlZXQiKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoInR5cGUiKTsvLyROT04tTkxTLTEkCi0JCWlmICh0eXBlICE9IG51bGwgJiYgIXR5cGUuZXF1YWxzSWdub3JlQ2FzZSgidGV4dC9jc3MiKSkvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBocmVmID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImhyZWYiKTsvLyROT04tTkxTLTEkCi0JCWlmIChocmVmID09IG51bGwgfHwgaHJlZi5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElDU1NNb2RlbCByZXRyaWV2ZU1vZGVsKCkgewotCQlpZiAoIWlzVmFsaWRBdHRyaWJ1dGUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBudWxsLGF0dHIgY2hlY2sgaXMgZG9uZSBpbiBpc1ZhbGlkQXR0cmlidXRlKCkKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlTdHJpbmcgaHJlZiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJocmVmIik7Ly8kTk9OLU5MUy0xJAotCi0JCUlET01Nb2RlbCBiYXNlTW9kZWwgPSAoKElET01Ob2RlKSBlbGVtZW50KS5nZXRNb2RlbCgpOwotCQlpZiAoYmFzZU1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJT2JqZWN0IGlkID0gYmFzZU1vZGVsLmdldElkKCk7Ci0JCWlmICghKGlkIGluc3RhbmNlb2YgU3RyaW5nKSkKLQkJCXJldHVybiBudWxsOwotCQkvL1N0cmluZyBiYXNlID0gKFN0cmluZylpZDsKLQotCQkvLyBnZXQgTW9kZWxQcm92aWRlQWRhcHRlcgotCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihNb2RlbFByb3ZpZGVBZGFwdGVyQ2xhc3MpOwotCi0JCVVSTE1vZGVsUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgVVJMTW9kZWxQcm92aWRlcigpOwotCQl0cnkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IHByb3ZpZGVyLmdldE1vZGVsRm9yUmVhZChiYXNlTW9kZWwsIGhyZWYpOwotCQkJaWYgKG5ld01vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoIShuZXdNb2RlbCBpbnN0YW5jZW9mIElDU1NNb2RlbCkpIHsKLQkJCQluZXdNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gbm90aWZ5IGFkYXB0ZXIKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQkJYWRhcHRlci5tb2RlbFByb3ZpZGVkKG5ld01vZGVsKTsKLQotCQkJcmV0dXJuIChJQ1NTTW9kZWwpIG5ld01vZGVsOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCUlDU1NNb2RlbCBvbGRNb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG9sZE1vZGVsKQotCQkJcmV0dXJuOwotCQlzdXBlci5zZXRNb2RlbChtb2RlbCk7Ci0JCWlmICh0aGlzLnJlcGxhY2VNb2RlbCkKLQkJCXRoaXMucmVwbGFjZU1vZGVsID0gZmFsc2U7Ci0JCWlmIChvbGRNb2RlbCAhPSBudWxsKQotCQkJb2xkTW9kZWwucmVtb3ZlU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5hZGRTdHlsZUxpc3RlbmVyKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzE4ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuYWRhcHRlcnMuSVN0eWxlU2hlZXRMaXN0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHlsZUFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHlsZUFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8vCXByaXZhdGUgc3RhdGljIFN0cmluZyBDU1NfQ09OVEVOVF9UWVBFID0gInRleHQvY3NzIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHlsZUFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBub3RpZmllcjsKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRlcjsKLQkJCUhUTUxEb2N1bWVudEFkYXB0ZXIgbmV3QWRhcHRlciA9IG5ldyBIVE1MRG9jdW1lbnRBZGFwdGVyKCk7Ci0JCQluZXdBZGFwdGVyLnNldERvY3VtZW50KChEb2N1bWVudCkgbm9kZSk7Ci0JCQlub3RpZmllci5hZGRBZGFwdGVyKG5ld0FkYXB0ZXIpOwotCQkJcmV0dXJuIG5ld0FkYXB0ZXI7Ci0JCX0KLQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCWlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkgewotCQkJaWYgKCFpc1RhZ0F2YWlsYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSwgSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJLy8JCVN0cmluZyB0eXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9UWVBFKTsKLQkJCS8vCQlpZiAodHlwZSAhPSBudWxsICYmICEgdHlwZS5lcXVhbHNJZ25vcmVDYXNlKENTU19DT05URU5UX1RZUEUpKSB7Ci0JCQkvLwkJCXJldHVybiBudWxsOwotCQkJLy8JCX0KLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJU3R5bGVFbGVtZW50QWRhcHRlciBuZXdBZGFwdGVyID0gbmV3IFN0eWxlRWxlbWVudEFkYXB0ZXIoKTsKLQkJCW5ld0FkYXB0ZXIuc2V0RWxlbWVudChlbGVtZW50KTsKLQkJCW5vdGlmaWVyLmFkZEFkYXB0ZXIobmV3QWRhcHRlcik7Ci0JCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQkJfQotCQllbHNlIGlmICh0YWdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkxJTkspKSB7Ci0JCQlpZiAoIWlzVGFnQXZhaWxhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuTElOSykpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJCXJldHVybiBhZGFwdGVyOwotCQkJTGlua0VsZW1lbnRBZGFwdGVyIG5ld0FkYXB0ZXIgPSBuZXcgTGlua0VsZW1lbnRBZGFwdGVyKCk7Ci0JCQluZXdBZGFwdGVyLnNldEVsZW1lbnQoZWxlbWVudCk7Ci0JCQlub3RpZmllci5hZGRBZGFwdGVyKG5ld0FkYXB0ZXIpOwotCQkJcmV0dXJuIG5ld0FkYXB0ZXI7Ci0JCX0KLQotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXI7Ci0KLQkJaWYgKCFpc0F0dHJpYnV0ZUF2YWlsYWJsZShlbGVtZW50LCBIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3R5bGVBdHRyQWRhcHRlciBuZXdBZGFwdGVyID0gbmV3IFN0eWxlQXR0ckFkYXB0ZXIoKTsKLQkJbmV3QWRhcHRlci5zZXRFbGVtZW50KGVsZW1lbnQpOwotCQlub3RpZmllci5hZGRBZGFwdGVyKG5ld0FkYXB0ZXIpOwotCQlyZXR1cm4gbmV3QWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBTdHlsZUFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFN0eWxlQWRhcHRlckZhY3RvcnkoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyB8fCB0eXBlID09IElTdHlsZURlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyB8fCB0eXBlID09IElTdHlsZVNoZWV0TGlzdEFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGRlZmF1bHQgaXMgdG8gZG8gbm90aGluZwotCX0KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNUYWdBdmFpbGFibGUoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBlbGVtZW50TmFtZSkgewotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJQ01Eb2N1bWVudCBjbWRvYyA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJQ01OYW1lZE5vZGVNYXAgbWFwID0gY21kb2MuZ2V0RWxlbWVudHMoKTsKLQkJCWlmICgoQ01FbGVtZW50RGVjbGFyYXRpb24pIG1hcC5nZXROYW1lZEl0ZW0oZWxlbWVudE5hbWUpICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzQXR0cmlidXRlQXZhaWxhYmxlKEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJOYW1lKSB7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBkZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlpZiAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIG1hcC5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgT2JqZWN0J3MgY2xvbmUoKSBtZXRob2QKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUF0dHJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUF0dHJBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTRkMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVBdHRyQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ1NTU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklDU1NNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uY3NzLkNTU1N0eWxlRGVjbGFyYXRpb247Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVBdHRyQWRhcHRlciBleHRlbmRzIEFic3RyYWN0Q1NTTW9kZWxBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLCBJU3R5bGVEZWNsYXJhdGlvbkFkYXB0ZXIgewotCi0JcHJpdmF0ZSBib29sZWFuIGlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBTVFlMRSA9ICJzdHlsZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JU3R5bGVBdHRyQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSUNTU01vZGVsIGdldE1vZGVsKCkgewotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsICYmIGlzTW9kZWxOZWNlc3NhcnkoKSkgewotCQkJbW9kZWwgPSBjcmVhdGVNb2RlbCgpOwotCQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCVJlZ2lvblBhcnNlciBwYXJzZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCk7Ci0JCQlpZiAocGFyc2VyIGluc3RhbmNlb2YgQ1NTU291cmNlUGFyc2VyKSB7Ci0JCQkJKChDU1NTb3VyY2VQYXJzZXIpcGFyc2VyKS5zZXRQYXJzZXJNb2RlKENTU1NvdXJjZVBhcnNlci5NT0RFX0RFQ0xBUkFUSU9OKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcih0aGlzKTsKLQotCQkJc2V0TW9kZWwobW9kZWwpOyAvLyBuZWVkIHRvIHNldCBiZWZvcmUgdmFsdWVDaGFuZ2VkKCkKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmICFpc01vZGVsTmVjZXNzYXJ5KCkpIHsKLQkJCW1vZGVsID0gbnVsbDsKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQ1NTU3R5bGVEZWNsYXJhdGlvbiBnZXRTdHlsZSgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDU1NTdHlsZURlY2xhcmF0aW9uKSBtb2RlbC5nZXREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gSVN0eWxlRGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCXNldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKHRoaXMuaWdub3JlTm90aWZpY2F0aW9uKQotCQkJcmV0dXJuOwotCi0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5DSEFOR0UpCi0JCQlyZXR1cm47Ci0JCUF0dHIgYXR0ciA9IChBdHRyKSBjaGFuZ2VkRmVhdHVyZTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUuZXF1YWxzSWdub3JlQ2FzZShTVFlMRSkpIHsKLQkJCXZhbHVlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uQ2hhbmdlZChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IHRoaXMpCi0JCQlyZXR1cm47Ci0KLQkJc2V0VmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0VmFsdWUoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChmbGF0Tm9kZXMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJaWYgKGNvdW50ID4gMCkgewotCQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBmbGF0Tm9kZXMuaXRlbShpKTsKLQkJCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KCkpOwotCQkJCX0KLQkJCQl2YWx1ZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5pZ25vcmVOb3RpZmljYXRpb24gPSB0cnVlOwotCQlpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShTVFlMRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoU1RZTEUpOwotCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCSgoSURPTU5vZGUpIGF0dHIpLnNldFZhbHVlU291cmNlKHZhbHVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQkJYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZShTVFlMRSk7Ci0JCQkJKChJRE9NTm9kZSkgYXR0cikuc2V0VmFsdWVTb3VyY2UodmFsdWUpOwotCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCX0KLQkJfQotCQl0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCi0JCW5vdGlmeVN0eWxlQ2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsdWVDaGFuZ2VkKCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghaXNNb2RlbE5lY2Vzc2FyeSgpKSB7IC8vIHJlbW92ZWQKLQkJCXNldE1vZGVsKG51bGwpOwotCi0JCQlub3RpZnlTdHlsZUNoYW5nZWQoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBkZWZlcgotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9TVFlMRSk7Ci0JCWlmIChhdHRyICE9IG51bGwpCi0JCQl2YWx1ZSA9ICgoSURPTU5vZGUpIGF0dHIpLmdldFZhbHVlU291cmNlKCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXRUZXh0KHRoaXMsIHZhbHVlKTsKLQotCQlub3RpZnlTdHlsZUNoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTW9kZWxOZWNlc3NhcnkoKSB7Ci0JCXJldHVybiBnZXRFbGVtZW50KCkgIT0gbnVsbCAmJiBnZXRFbGVtZW50KCkuZ2V0QXR0cmlidXRlTm9kZShvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfU1RZTEUpICE9IG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlRWxlbWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9odG1sY3NzL1N0eWxlRWxlbWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VmOTdiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUVsZW1lbnRBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNC0yMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogCSAgICBNYXNha2kgU2FpdG9oIChNU0FJVE9IQGpwLmlibS5jb20pCi0gKgkJU2VlIEJ1ZyAxNTMwMDAgIFN0eWxlIEFkYXB0ZXJzIHNob3VsZCBiZSBsYXppZXIKLSAqCQlodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTUzMDAwCi0gKgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklNb2RlbFByb3ZpZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTaGVldExpc3RBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JQ1NTTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIFN0eWxlRWxlbWVudEFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFN0eWxlU2hlZXRBZGFwdGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCXByaXZhdGUgYm9vbGVhbiByZXBsYWNlTW9kZWwgPSB0cnVlOwotCXByaXZhdGUgYm9vbGVhbiBpZ25vcmVOb3RpZmljYXRpb24gPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHlsZUVsZW1lbnRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFByZXBhcmF0aW9uIG9mIGFwcGx5aW5nIGNoYW5nZXMgZnJvbSBDU1Mgc3ViLW1vZGVsIHRvIEhUTUwgbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldEVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCS8vIGdldCBvbGQgY29udGVudCBsZW5ndGgKLQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAoY2hpbGQgPT0gbnVsbCB8fCBjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBjb250ZW50ID0gKElET01Ob2RlKSBjaGlsZDsKLQkJaW50IG9sZExlbmd0aCA9IGNvbnRlbnQuZ2V0RW5kT2Zmc2V0KCkgLSBjb250ZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJLy8gZ2V0IG5ldyBjb250ZW50IGxlbmd0aAotCQlpbnQgbmV3TGVuZ3RoID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZmxhdE5vZGVzID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkxpc3QoKTsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgY291bnQgPSBmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0ID0gZmxhdE5vZGVzLml0ZW0oY291bnQgLSAxKTsKLQkJCQlpZiAobGFzdCAhPSBudWxsKQotCQkJCQluZXdMZW5ndGggPSBsYXN0LmdldEVuZCgpOwotCQkJfQotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWludCBlbmQgPSBmbGF0Tm9kZS5nZXRFbmQoKTsKLQkJaW50IGRpZmYgPSBvbGRMZW5ndGggLSBuZXdMZW5ndGg7Ci0JCWludCBsZW5ndGggPSBlbmQgLSBvZmZzZXQgKyBkaWZmOwotCQlTdHJpbmcgZGF0YSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQotCQlyZXBsYWNlRGF0YShvZmZzZXQsIGxlbmd0aCwgZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogQXBwbHkgY2hhbmdlcyBmcm9tIEhUTUwgbW9kZWwgdG8gQ1NTIHN1Yi1tb2RlbAotCSAqLwotCXByaXZhdGUgdm9pZCBjb250ZW50Q2hhbmdlZCgpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJQ1NTTW9kZWwgbW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIGRhdGEgPSBudWxsOwotCQlOb2RlIGNoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChjaGlsZCAhPSBudWxsICYmIGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSA9PSBudWxsKSB7Ci0JCQlkYXRhID0gY2hpbGQuZ2V0Tm9kZVZhbHVlKCk7Ci0JCX0KLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJLy8gbWluaW1pemUgcmVwbGFjZSByYW5nZQotCQlpbnQgc3RhcnQgPSAwLCBlbmQgPSAwOwotCQlTdHJpbmcgb2xkRGF0YSA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQoKTsKLQkJaWYgKG9sZERhdGEgPT0gbnVsbCkKLQkJCW9sZERhdGEgPSAiIjsvLyROT04tTkxTLTEkCi0KLQkJLy8gc2VhcmNoIGRpZmZlcmVuY3QgY2hhcmFjdGVyIHBvc2l0aW9uIGZyb20gZmlyc3QKLQkJZm9yICg7IHN0YXJ0IDwgb2xkRGF0YS5sZW5ndGgoKSAmJiBzdGFydCA8IGRhdGEubGVuZ3RoKCk7IHN0YXJ0KyspCi0JCQlpZiAob2xkRGF0YS5jaGFyQXQoc3RhcnQpICE9IGRhdGEuY2hhckF0KHN0YXJ0KSkKLQkJCQlicmVhazsKLQotCQlpZiAoc3RhcnQgPT0gb2xkRGF0YS5sZW5ndGgoKSAmJiBzdGFydCA9PSBkYXRhLmxlbmd0aCgpKQotCQkJcmV0dXJuOyAvLyBubyBjaGFuZ2UKLQkJZWxzZSBpZiAoc3RhcnQgPT0gb2xkRGF0YS5sZW5ndGgoKSkgewotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGdldFJlcXVlc3RlckgyQygpLCBzdGFydCwgMCwgZGF0YS5zdWJzdHJpbmcoc3RhcnQpKTsgLy8gYXBwZW5kIHRleHQgdG8gbGFzdAotCQl9Ci0JCWVsc2UgaWYgKHN0YXJ0ID09IGRhdGEubGVuZ3RoKCkpIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChnZXRSZXF1ZXN0ZXJIMkMoKSwgc3RhcnQsIG9sZERhdGEubGVuZ3RoKCkgLSBzdGFydCwgIiIpOyAvLyByZW1vdmUgdGV4dCBvZiBsYXN0IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBkaWZmZXJlbmN0IGNoYXJhY3RlciBwb3NpdGlvbiBmcm9tIGxhc3QKLQkJCWZvciAoOyBzdGFydCA8IG9sZERhdGEubGVuZ3RoKCkgLSBlbmQgJiYgc3RhcnQgPCBkYXRhLmxlbmd0aCgpIC0gZW5kOyBlbmQrKykgewotCQkJCWlmIChvbGREYXRhLmNoYXJBdChvbGREYXRhLmxlbmd0aCgpIC0gZW5kIC0gMSkgIT0gZGF0YS5jaGFyQXQoZGF0YS5sZW5ndGgoKSAtIGVuZCAtIDEpKQotCQkJCQlicmVhazsKLQkJCX0KLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChnZXRSZXF1ZXN0ZXJIMkMoKSwgc3RhcnQsIG9sZERhdGEubGVuZ3RoKCkgLSBlbmQgLSBzdGFydCwgZGF0YS5zdWJzdHJpbmcoc3RhcnQsIGRhdGEubGVuZ3RoKCkgLSBlbmQpKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkJSUNTU01vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbCgpOwotCQlpZiAodGhpcy5yZXBsYWNlTW9kZWwpIHsKLQkJCUlDU1NNb2RlbCBvbGRNb2RlbCA9IG1vZGVsOwotCQkJbW9kZWwgPSBjcmVhdGVNb2RlbChmYWxzZSk7Ci0KLQkJCXNldE1vZGVsKG1vZGVsLCBmYWxzZSk7IC8vIG5lZWQgdG8gc2V0IGJlZm9yZSBjb250ZW50Q2hhbmdlZCgpCi0JCQljb250ZW50Q2hhbmdlZCgpOwotCi0JCQkvLyBmcm9tIHN1cGVyLmNyZWF0ZU1vZGVsKCkKLQkJCS8vIGdldCBNb2RlbFByb3ZpZGVBZGFwdGVyCi0JCQlJTW9kZWxQcm92aWRlQWRhcHRlciBtb2RlbFByb3ZpZGVBZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkvLyBub3RpZnkgYWRhcHRlcgotCQkJaWYgKG1vZGVsUHJvdmlkZUFkYXB0ZXIgIT0gbnVsbCkKLQkJCQltb2RlbFByb3ZpZGVBZGFwdGVyLm1vZGVsUHJvdmlkZWQobW9kZWwpOwotCi0JCQkvLyBmcm9tIGNyZWF0ZU1vZGVsKCkKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIodGhpcyk7Ci0KLQkJCS8vIGZyb20gc2V0TW9kZWwoKQotCQkJaWYgKG9sZE1vZGVsICE9IG51bGwpCi0JCQkJb2xkTW9kZWwucmVtb3ZlU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLmFkZFN0eWxlTGlzdGVuZXIodGhpcyk7Ci0KLQkJCWlmIChvbGRNb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IE1vZGVsUHJvdmlkZUFkYXB0ZXIKLQkJCQlJTW9kZWxQcm92aWRlQWRhcHRlciBhZGFwdGVyID0gKElNb2RlbFByb3ZpZGVBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGdldEVsZW1lbnQoKSkuZ2V0QWRhcHRlckZvcihJTW9kZWxQcm92aWRlQWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVyLm1vZGVsUmVtb3ZlZChvbGRNb2RlbCk7Ci0JCQkJfQotCQkJfQotCi0JCQl0aGlzLnJlcGxhY2VNb2RlbCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ZhbGlkQXR0cmlidXRlKCkgewotCQlFbGVtZW50IGVsZW1lbnQgPSBnZXRFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlTdHJpbmcgdHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSk7Ci0JCWlmICh0eXBlICE9IG51bGwgJiYgdHlwZS5sZW5ndGgoKSA+IDAgJiYgIXR5cGUuZXF1YWxzSWdub3JlQ2FzZSgidGV4dC9jc3MiKSkgeyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElDU1NNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJcmV0dXJuIGNyZWF0ZU1vZGVsKHRydWUpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJQ1NTTW9kZWwgY3JlYXRlTW9kZWwoYm9vbGVhbiBhZGRMaXN0ZW5lcikgewotCQlpZiAoIWlzVmFsaWRBdHRyaWJ1dGUoKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpZiAoIWFkZExpc3RlbmVyKQotCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZU1vZGVsKGZhbHNlKTsKLQotCQlJQ1NTTW9kZWwgbW9kZWwgPSBzdXBlci5jcmVhdGVNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQkvLyAgcHVibGljIElDU1NNb2RlbCBnZXRNb2RlbCgpIHsKLQkvLyAgCUlDU1NNb2RlbCBtb2RlbCA9IGdldEV4aXN0aW5nTW9kZWwoKTsKLQkvLyAgCWlmIChtb2RlbCA9PSBudWxsKSB7Ci0JLy8gIAkJbW9kZWwgPSBjcmVhdGVNb2RlbCgpOwotCS8vICAJCWlmIChtb2RlbCA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkvLyAgCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCS8vICAJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgcmV0dXJuIG51bGw7Ci0JLy8gIAkJc3RydWN0dXJlZERvY3VtZW50LmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyKHRoaXMpOwotCS8vICAJCXNldE1vZGVsKG1vZGVsKTsgLy8gbmVlZCB0byBzZXQgYmVmb3JlIGNvbnRlbnRDaGFuZ2VkKCkKLQkvLyAgCQljb250ZW50Q2hhbmdlZCgpOwotCS8vICAJfQotCS8vICAJcmV0dXJuIG1vZGVsOwotCS8vICB9Ci0JLyoqCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UmVxdWVzdGVySDJDKCkgewotCQlyZXR1cm4gKGdldEVsZW1lbnQoKSAhPSBudWxsICYmICgoSURPTU5vZGUpIGdldEVsZW1lbnQoKSkuZ2V0TW9kZWwoKSAhPSBudWxsKSA/IChPYmplY3QpICgoSURPTU5vZGUpIGdldEVsZW1lbnQoKSkuZ2V0TW9kZWwoKSA6IHRoaXM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBPYmplY3QgZ2V0UmVxdWVzdGVyQzJIKCkgewotCQlyZXR1cm4gKGdldE1vZGVsKCkgIT0gbnVsbCkgPyAoT2JqZWN0KSBnZXRNb2RlbCgpIDogdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRpbmcgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyJ3MgbWV0aG9kCi0JICogRXZlbnQgZnJvbSBDU1MgRmxhdCBNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChldmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpID09IGdldFJlcXVlc3RlckgyQygpKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmIChmbGF0Tm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlyZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhmbGF0Tm9kZXMsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgPT0gZ2V0UmVxdWVzdGVySDJDKCkpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBldmVudC5nZXRPbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBldmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID09IG51bGwgJiYgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCX0KLQotCS8qKgotCSAqIE92ZXJyaWRpbmcgSU5vZGVBZGFwdGVyJ3MgbWV0aG9kCi0JICogRXZlbnQgZnJvbSA8U1RZTEU+IGVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJaWYgKHRoaXMuaWdub3JlTm90aWZpY2F0aW9uKQotCQkJcmV0dXJuOwotCi0JCWlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCkgewotCQkJY29udGVudENoYW5nZWQoKTsKLQkJfQotCQllbHNlIGlmIChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBjaGFuZ2VkRmVhdHVyZTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJCWlmIChuYW1lLmVxdWFsc0lnbm9yZUNhc2UoInR5cGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5yZXBsYWNlTW9kZWwgPSB0cnVlOwotCi0JCQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudCgpOwotCQkJCWlmIChlbGVtZW50ID09IG51bGwpIHsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQkJSFRNTERvY3VtZW50QWRhcHRlciBhZGFwdGVyID0gKEhUTUxEb2N1bWVudEFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoSVN0eWxlU2hlZXRMaXN0QWRhcHRlci5jbGFzcyk7Ci0JCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQlhZGFwdGVyLmNoaWxkUmVwbGFjZWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnRpbmcgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyJ3MgbWV0aG9kCi0JICogRXZlbnQgZnJvbSBDU1MgRmxhdCBNb2RlbAotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSBnZXRSZXF1ZXN0ZXJIMkMoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudGluZyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIncyBtZXRob2QKLQkgKiBFdmVudCBmcm9tIENTUyBGbGF0IE1vZGVsCi0JICovCi0JcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSA9PSBnZXRSZXF1ZXN0ZXJIMkMoKSkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqIEFwcGx5IGNoYW5nZXMgZnJvbSBDU1Mgc3ViLW1vZGVsIHRvIEhUTUwgbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwbGFjZURhdGEoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIGRhdGEpIHsKLQkJSURPTU5vZGUgZWxlbWVudCA9IChJRE9NTm9kZSkgZ2V0RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTW9kZWwgb3duZXJNb2RlbCA9IGVsZW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG93bmVyTW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBvd25lck1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBjb250ZW50T2Zmc2V0ID0gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlkYXRhID0gIiI7Ly8kTk9OLU5MUy0xJAotCi0JCXRoaXMuaWdub3JlTm90aWZpY2F0aW9uID0gdHJ1ZTsKLQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KGdldFJlcXVlc3RlckMySCgpLCBjb250ZW50T2Zmc2V0ICsgb2Zmc2V0LCBsZW5ndGgsIGRhdGEpOwotCQl0aGlzLmlnbm9yZU5vdGlmaWNhdGlvbiA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFByZXBhcmF0aW9uIG9mIGFwcGx5aW5nIGNoYW5nZXMgZnJvbSBDU1Mgc3ViLW1vZGVsIHRvIEhUTUwgbW9kZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zICE9IG51bGwpIHsKLQkJCWludCBjb3VudCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY291bnQgPiAwKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKTsKLQkJCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCQkJb2Zmc2V0ID0gZmlyc3QuZ2V0U3RhcnQoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3QgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oY291bnQgLSAxKTsKLQkJCQlpZiAobGFzdCAhPSBudWxsKQotCQkJCQlsZW5ndGggPSBsYXN0LmdldEVuZCgpIC0gb2Zmc2V0OwotCQkJfQotCQl9Ci0JCVN0cmluZyBkYXRhID0gbnVsbDsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJaW50IGNvdW50ID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IDApIHsKLQkJCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5pdGVtKGkpOwotCQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQoKSk7Ci0JCQkJCWlmIChpID09IDApCi0JCQkJCQlvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCX0KLQkJCQlkYXRhID0gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXBsYWNlRGF0YShvZmZzZXQsIGxlbmd0aCwgZGF0YSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TW9kZWwoSUNTU01vZGVsIG1vZGVsKSB7Ci0JCXNldE1vZGVsKG1vZGVsLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJQ1NTTW9kZWwgbW9kZWwsIGJvb2xlYW4gc2V0dXBMaXN0ZW5lcikgewotCQlJQ1NTTW9kZWwgb2xkTW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBvbGRNb2RlbCkKLQkJCXJldHVybjsKLQkJc3VwZXIuc2V0TW9kZWwobW9kZWwpOwotCQlpZiAoIXNldHVwTGlzdGVuZXIpCi0JCQlyZXR1cm47Ci0JCWlmIChvbGRNb2RlbCAhPSBudWxsKQotCQkJb2xkTW9kZWwucmVtb3ZlU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5hZGRTdHlsZUxpc3RlbmVyKHRoaXMpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9TdHlsZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjOGQxNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvU3R5bGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmh0bWxjc3M7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBTdHlsZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqLwotCXZvaWQgc3R5bGVDaGFuZ2VkKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvVVJMSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQxM2Q2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIAotICovCi1wdWJsaWMgY2xhc3MgVVJMSGVscGVyIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnV0aWwuVVJMSGVscGVyIHsKLQotCS8qKgotCSAqIEBwYXJhbSBiYXNlVXJsCi0JICovCi0JcHVibGljIFVSTEhlbHBlcihTdHJpbmcgYmFzZVVybCkgewotCQlzdXBlcihiYXNlVXJsKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gYmFzZVVybAotCSAqIEBwYXJhbSBkb2NSb290Ci0JICovCi0JcHVibGljIFVSTEhlbHBlcihTdHJpbmcgYmFzZVVybCwgU3RyaW5nIGRvY1Jvb3QpIHsKLQkJc3VwZXIoYmFzZVVybCwgZG9jUm9vdCk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxNb2RlbFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvaHRtbGNzcy9VUkxNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYjk3OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL2h0bWxjc3MvVVJMTW9kZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5odG1sY3NzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlBhdGhIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuUHJvamVjdFJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLy8gVE9ETyB3aGVuIHRoaXMgY2xhc3MgaXMgcmVtb3ZlZCBmcm9tIC5jb3JlLCBQYXRoSGVscGVyIGFuZCBVUkxIZWxwZXIgY2xhc3MKLS8vIGFsc28gY2FuIGJlIHJlbW92ZWQuCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVVJMTW9kZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX01PREVMX0ZPUl9SRUFEID0gMTsKLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgR0VUX05FV19NT0RFTF9GT1JfUkVBRCA9IDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9NT0RFTF9GT1JfRURJVCA9IDM7Ci0JLy8JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEdFVF9ORVdfTU9ERUxfRk9SX0VESVQgPSA0OwotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX0JVRkZFUl9TSVpFID0gNDA5NjsKLQkvLyBJTW9kZWxNYW5hZ2VyCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIG1vZGVsTWFuYWdlciA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVVJMTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQotCQkvLyBvYnRhaW4gbW9kZWwgbWFuYWdlcgotCQltb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCX0KLQotCS8qKgotCSAqIENhbGN1bGF0ZSBJRCBmcm9tIGEgZmlsZW5hbWUuIFRoaXMgbXVzdCBiZSBzYW1lIGFzCi0JICogRmlsZU1vZGVsUHJvdmlkZXIuY2FsY3VsYXRlSWQoSUZpbGUpCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElQYXRoIGZ1bGxJUGF0aCkgewotCQlyZXR1cm4gZnVsbElQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+YmFzZU1vZGVsPC9jb2RlPjogdGhlIG1vZGVsIGNvbnRhaW5pbmcgdGhlIGxpbmsKLQkgKiA8Y29kZT5yZWY8L2NvZGU+OiB0aGUgbGluayBVUkwgc3RyaW5nCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldENvbW1vbk1vZGVsRm9yKGZpbmFsIElTdHJ1Y3R1cmVkTW9kZWwgYmFzZU1vZGVsLCBmaW5hbCBTdHJpbmcgcmVmLCBmaW5hbCBpbnQgd2hpY2gpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZpcnN0LCBjcmVhdGUgYWJzb2x1dGUgdXJsCi0JCVN0cmluZyBhYnNVUkwgPSByZXNvbHZlVVJJKGJhc2VNb2RlbCwgcmVmLCB0cnVlKTsKLQkJaWYgKChhYnNVUkwgPT0gbnVsbCkgfHwgKGFic1VSTC5sZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBuZWVkIHRvIHJlbW92ZSBmaWxlOi8vIHNjaGVtZSBpZiBuZWNlc3NhcnkKLQkJdHJ5IHsKLQkJCWZpbmFsIGphdmEubmV0LlVSTCBhVVJMID0gbmV3IGphdmEubmV0LlVSTChhYnNVUkwpOwotCQkJLy8gQW4gYWN0dWFsIFVSTCB3YXMgZ2l2ZW4sIG9ubHkgZmlsZTovLy8gaXMgc3VwcG9ydGVkCi0JCQkvLyByZXNvbHZlIGl0IGJ5IGZpbmRpbmcgdGhlIGZpbGUgaXQgcG9pbnRzIHRvCi0JCQlpZiAoIWFVUkwuZ2V0UHJvdG9jb2woKS5lcXVhbHMoInBsYXRmb3JtIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikgJiYgKGFVUkwuZ2V0SG9zdCgpLmVxdWFscygibG9jYWxob3N0IikgfHwgYVVSTC5nZXRIb3N0KCkubGVuZ3RoKCkgPT0gMCkpIHsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQlhYnNVUkwgPSBhVVJMLmdldEZpbGUoKTsKLQkJCQkJZmluYWwgSVBhdGggaXBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQkJCQkvLyAgaWYgcGF0aCBoYXMgYSBkZXZpY2UsIGFuZCBpZiBpdCBiZWdpbnMgd2l0aAotCQkJCQkvLyBJUGF0aC5TRVBBUkFUT1IsIHJlbW92ZSBpdAotCQkJCQlmaW5hbCBTdHJpbmcgZGV2aWNlID0gaXBhdGguZ2V0RGV2aWNlKCk7Ci0JCQkJCWlmICgoZGV2aWNlICE9IG51bGwpICYmIChkZXZpY2UubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJaWYgKGRldmljZS5jaGFyQXQoMCkgPT0gSVBhdGguU0VQQVJBVE9SKSB7Ci0JCQkJCQkJZmluYWwgU3RyaW5nIG5ld0RldmljZSA9IGRldmljZS5zdWJzdHJpbmcoMSk7Ci0JCQkJCQkJYWJzVVJMID0gaXBhdGguc2V0RGV2aWNlKG5ld0RldmljZSkudG9TdHJpbmcoKTsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb24gbWZ1RXhjKSB7Ci0JCX0KLQotCi0JCS8vIG5leHQsIGRlY2lkZSBwcm9qZWN0Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlmaW5hbCBJUGF0aCBmdWxsSVBhdGggPSBuZXcgUGF0aChhYnNVUkwpOwotCQlJV29ya3NwYWNlUm9vdCB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IHdvcmtzcGFjZS5nZXRDb250YWluZXJGb3JMb2NhdGlvbihmdWxsSVBhdGgpOwotCQlpZiAoY29udGFpbmVyICE9IG51bGwpIHsKLQkJCS8vIGZ1bGxJUGF0aCBkb2Vzbid0IGV4aXN0IGluIHdvcmtzcGFjZQotCQkJcHJvamVjdCA9IGNvbnRhaW5lci5nZXRQcm9qZWN0KCk7Ci0JCX0KLQotCQkvLyBJZiBIVE1MIGRvY3VtZW50IGhhcyBhIGxpbmsgdG8gYW4gZXh0ZXJuIENTUyB3aGljaCBpcyBub3QgaW4KLQkJLy8gSVByb2plY3QKLQkJLy8gd29ya3NwYWNlLmdldENvbnRhaW5lckZvckxvYXRpb24oKSBtYXkgcmV0dXJuIG51bGwuIFdlIG5lZWQgdG8gdGFrZQotCQkvLyBjYXJlCi0JCS8vIG9mIHRoaXMgY2FzZQotCi0JCS8vIG5vdywgZ2V0IGFic1VSTCdzIElGaWxlCi0JCWlmICgocHJvamVjdCAhPSBudWxsKSAmJiAocHJvamVjdC5nZXRMb2NhdGlvbigpLmlzUHJlZml4T2YoZnVsbElQYXRoKSA9PSBmYWxzZSkpIHsKLQkJCS8vIGl0J3MgYXQgb3V0c2lkZSBvZiBQcm9qZWN0Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlJUGF0aCBmaWxlUGF0aCA9IGZ1bGxJUGF0aC5yZW1vdmVGaXJzdFNlZ21lbnRzKHByb2plY3QuZ2V0TG9jYXRpb24oKS5zZWdtZW50Q291bnQoKSk7Ci0JCQlJRmlsZSBmaWxlID0gKGZpbGVQYXRoICE9IG51bGwgJiYgIWZpbGVQYXRoLmlzRW1wdHkoKSkgPyBwcm9qZWN0LmdldEZpbGUoZmlsZVBhdGgpIDogbnVsbDsKLQkJCWlmIChmaWxlID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQkJLy8gb2J0YWluIG1vZGVsCi0JCQlpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9FRElUKSB7Ci0JCQkJbW9kZWwgPSBnZXRNb2RlbEZvckVkaXQoZmlsZSk7Ci0JCQl9Ci0JCQllbHNlIGlmICh3aGljaCA9PSBHRVRfTU9ERUxfRk9SX1JFQUQpIHsKLQkJCQltb2RlbCA9IGdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCX0KLQotCQkJLy8gc2V0dGluZyBzeW5jaHJvbml6YXRpb24gc3RhbXAgaXMgSU1vZGVsTWFuYWdlcidzIGNsaWVudCdzCi0JCQkvLyByZXNwb25zaWJpbGl0eQotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoKSA9PSBJUmVzb3VyY2UuTlVMTF9TVEFNUCkKLQkJCQltb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGluU3RyZWFtID0gbnVsbDsKLQkJCS8vIG9idGFpbiByZXNvbHZlcgotCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAocHJvamVjdCAhPSBudWxsKSA/IChVUklSZXNvbHZlcikgcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKSA6IG51bGw7Ci0JCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkgewotCQkJCS8vIFByb2plY3RSZXNvbHZlciBjYW4gdGFrZSBjYXJlIG9mIHRoZSBjYXNlIGlmIHByb2plY3QgaXMKLQkJCQkvLyBudWxsLgotCQkJCXJlc29sdmVyID0gbmV3IFByb2plY3RSZXNvbHZlcihwcm9qZWN0KTsKLQkJCX0KLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJCS8vIHRoZXJlIGlzIG5vIHByb2plY3QuIHdlIGNhbid0IGV4cGVjdCBJUHJvamVjdCBoZWxwIHRvIGNyZWF0ZQotCQkJLy8gaWQvaW5wdXRTdHJlYW0KLQkJCWphdmEuaW8uRmlsZSBmaWxlID0gZnVsbElQYXRoLnRvRmlsZSgpOwotCi0JCQkvLyBvYmF0aW4gaWQKLQkJCWlkID0gY2FsY3VsYXRlSWQoZnVsbElQYXRoKTsKLQotCQkJLy8gb2J0YWluIElucHV0U3RyZWFtCi0JCQl0cnkgewotCQkJCWluU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKLQkJCX0KLQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZm5mZSkgewotCQkJCS8vIHRoZSBmaWxlIGRvZXMgbm90IGV4aXN0LCBvciB3ZSBkb24ndCBoYXZlIHJlYWQgcGVybWlzc2lvbgotCQkJCXJldHVybiBudWxsOwotCQkJfQotCi0JCQkvLyBvYnRhaW4gbW9kZWwKLQkJCXRyeSB7Ci0JCQkJaWYgKHdoaWNoID09IEdFVF9NT0RFTF9GT1JfRURJVCkgewotCQkJCQltb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChpZCwgaW5TdHJlYW0sIHJlc29sdmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAod2hpY2ggPT0gR0VUX01PREVMX0ZPUl9SRUFEKSB7Ci0JCQkJCW1vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpblN0cmVhbSwgcmVzb2x2ZXIpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHVlKSB7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQkvLyBjbG9zZSBub3cgIQotCQkJCWlmIChpblN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJCWluU3RyZWFtLmNsb3NlKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQotCQkvLyBzZXQgbG9jYXRpb25pZAotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSA9PSBudWxsKSB7Ci0JCQltb2RlbC5zZXRCYXNlTG9jYXRpb24oZnVsbElQYXRoLnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvbW1vbk1vZGVsRm9yKGJhc2VNb2RlbCwgcmVmLCBHRVRfTU9ERUxfRk9SX0VESVQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQotCQkvLyBjcmVhdGUgYSBmYWtlIElucHV0U3RyZWFtCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGV4KSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvckVkaXQoZmlsZSwgRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBjZSkgewotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5iYXNlTW9kZWw8L2NvZGU+OiB0aGUgbW9kZWwgY29udGFpbmluZyB0aGUgbGluawotCSAqIDxjb2RlPnJlZjwvY29kZT46IHRoZSBsaW5rIFVSTCBzdHJpbmcKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSVN0cnVjdHVyZWRNb2RlbCBiYXNlTW9kZWwsIFN0cmluZyByZWYpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRDb21tb25Nb2RlbEZvcihiYXNlTW9kZWwsIHJlZiwgR0VUX01PREVMX0ZPUl9SRUFEKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0KLQkJLy8gY3JlYXRlIGEgZmFrZSBJbnB1dFN0cmVhbQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBleCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHsKLQkJaWYgKGlGaWxlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCWlmIChtYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gbWFuYWdlci5nZXROZXdNb2RlbEZvckVkaXQoaUZpbGUsIGZhbHNlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSByaXUpIHsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VBbHJlYWR5RXhpc3RzIHJhZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGNlKSB7Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCQlpZiAoaUZpbGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBnZXRNb2RlbE1hbmFnZXIoKTsKLQkJaWYgKG1hbmFnZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE5ld01vZGVsRm9yRWRpdChpRmlsZSwgZmFsc2UpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUluVXNlIHJpdSkgewotCQl9Ci0JCWNhdGNoIChSZXNvdXJjZUFscmVhZHlFeGlzdHMgcmFlKSB7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gY2UpIHsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVXRpbGl0eSB0byBjaGVjayB0aGUgbW9kZWwgaXMgSFRNTCBmYW1pbHkgb3Igbm90Ci0JICovCi0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpc0hUTUxGYW1pbHkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gYWRhcHRlci5oYXNGZWF0dXJlKEhUTUxEb2N1bWVudFR5cGVDb25zdGFudHMuSFRNTCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmJhc2VNb2RlbDwvY29kZT46IHRoZSBtb2RlbCBjb250YWluaW5nIHRoZSBsaW5rCi0JICogPGNvZGU+cmVmPC9jb2RlPjogdGhlIGxpbmsgVVJMIHN0cmluZwotCSAqIDxjb2RlPnJlc29sdmVDcm9zc1Byb2plY3RMaW5rczwvY29kZT46IElmIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcwotCSAqIGlzIHNldCB0byB0cnVlLCB0aGVuIHRoaXMgbWV0aG9kIHdpbGwgcHJvcGVybHkgcmVzb2x2ZSB0aGUgVVJJIGlmIGl0IGlzCi0JICogYSB2YWxpZCBVUkkgcG9pbnRpbmcgdG8gYW5vdGhlciAoYXBwcm9wcmlhdGUpIHByb2plY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVVSSShJU3RydWN0dXJlZE1vZGVsIGJhc2VNb2RlbCwgU3RyaW5nIHJlZiwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJaWYgKGJhc2VNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGZvciBIVE1MLCAnaHJlZicgYXR0cmlidXRlIHZhbHVlIG9mIEJBU0UgZWxlbWVudAotCQkvLyBzaG91bGQgYmUgdXNlZCwgaWYgZXhpc3RzIGFueQotCQlTdHJpbmcgYmFzZUhyZWYgPSBudWxsOwotCQkvLyBkbXdfVE9ETyBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIGhhbmRsZSBhIGNvbnRlbnQgbW9kZWwKLQkJLy8gb2YgSFRNTCBvciBYSFRNTAotCQlpZiAoaXNIVE1MRmFtaWx5KGJhc2VNb2RlbCkpIHsKLQkJCWZpbmFsIElET01Nb2RlbCB4bWxtb2RlbCA9IChJRE9NTW9kZWwpIGJhc2VNb2RlbDsKLQkJCWZpbmFsIElET01Eb2N1bWVudCBkb2MgPSB4bWxtb2RlbC5nZXREb2N1bWVudCgpOwotCQkJLy8gbG9vayBmb3IgPEJBU0U+IHcvIGhyZWYKLQkJCWZpbmFsIE5vZGVMaXN0IG5sID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJCQVNFIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKChubCAhPSBudWxsKSAmJiAobmwuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJCS8vIHBlciBlYWNoIDxCQVNFPgotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbmwuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlmaW5hbCBOb2RlIGJhc2VOb2RlID0gbmwuaXRlbShpKTsKLQkJCQkJaWYgKGJhc2VOb2RlICE9IG51bGwpIHsKLQkJCQkJCS8vIGdldCBhbGwgYXR0cnMKLQkJCQkJCWZpbmFsIE5hbWVkTm9kZU1hcCBhdHRyTm9kZXMgPSBiYXNlTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlpZiAoYXR0ck5vZGVzICE9IG51bGwpIHsKLQkJCQkJCQlmaW5hbCBOb2RlIGF0dHJOb2RlID0gYXR0ck5vZGVzLmdldE5hbWVkSXRlbSgiSFJFRiIpOy8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoYXR0ck5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQkvLyBmb3VuZCBocmVmPSIiCi0JCQkJCQkJCWZpbmFsIFN0cmluZyBhdHRyVmFsdWUgPSBhdHRyTm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQkJaWYgKGF0dHJWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCQkJCQliYXNlSHJlZiA9IGF0dHJWYWx1ZS50cmltKCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gd2hhdCBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgPEJBU0U+IHRhZ3MgPz8KLQkJCQkJaWYgKGJhc2VIcmVmICE9IG51bGwpIHsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gZ2V0IHJlc29sdmVyIGluIE1vZGVsCi0JCWZpbmFsIFVSSVJlc29sdmVyIHJlc29sdmVyID0gYmFzZU1vZGVsLmdldFJlc29sdmVyKCk7Ci0KLQkJLy8gcmVzb2x2ZSB0byBhYnNvbHV0ZSB1cmwKLQkJZmluYWwgU3RyaW5nIGFic3VybCA9IChyZXNvbHZlciAhPSBudWxsKSA/ICgoYmFzZUhyZWYgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgYmFzZUhyZWYsIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcykgOiByZXNvbHZlci5nZXRMb2NhdGlvbkJ5VVJJKHJlZiwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSkgOiBudWxsOwotCQlpZiAoKHJlc29sdmVyICE9IG51bGwpICYmIChhYnN1cmwgPT0gbnVsbCkgJiYgKHJlZiAhPSBudWxsKSAmJiAocmVmLnRyaW0oKS5sZW5ndGgoKSA+IDApICYmIChyZWYudHJpbSgpLmNoYXJBdCgwKSA9PSAnLycpKSB7Ci0JCQkvLyB0byByZWFjaCBoZXJlIG1lYW5zIDoKLQkJCS8vICAgIHJlZiBpcyBhIERvY3Jvb3QgcmVsYXRpdmUKLQkJCS8vICAgIHJlc29sdmVyIGNhbid0IHJlc29sdmUgcmVmCi0JCQkvLyBzbyB0aGF0IGhyZWYgaXMgYSBicm9rZW4gYW5kIHNob3VsZCBub3QgY3JlYXRlIG1vZGVsCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlpZiAoKGFic3VybCAhPSBudWxsKSAmJiAoYWJzdXJsLmxlbmd0aCgpID4gMCkpIHsKLQkJCXJldHVybiBhYnN1cmw7Ci0JCX0KLQotCQkvLyBtYXliZSByZWYgaXMgYXQgb3V0c2lkZSBvZiB0aGUgUHJvamVjdAotCQkvLyBvYnRhaW4gZG9jcm9vdDsKLQkJZmluYWwgSUNvbnRhaW5lciBjb250YWluZXIgPSAocmVzb2x2ZXIgIT0gbnVsbCkgPyByZXNvbHZlci5nZXRSb290TG9jYXRpb24oKSA6IG51bGw7Ci0JCVN0cmluZyBkb2Nyb290ID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gY29udGFpbmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJfQotCQlpZiAoZG9jcm9vdCA9PSBudWxsKSB7Ci0JCQlkb2Nyb290ID0gYmFzZU1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQl9Ci0JCWlmIChkb2Nyb290ID09IG51bGwpIHsKLQkJCS8vIHNob3VsZCBub3QgYmUKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLy8gb2J0YWluIGRvY3VtZW50IHVybAotCQlTdHJpbmcgbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCWlmICgobW9kZWxCYXNlTG9jYXRpb24gPT0gbnVsbCkgfHwgKG1vZGVsQmFzZUxvY2F0aW9uLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBmYWxsYmFjay4uLgotCQkJbW9kZWxCYXNlTG9jYXRpb24gPSBiYXNlTW9kZWwuZ2V0SWQoKTsKLQkJfQotCQlpZiAoKG1vZGVsQmFzZUxvY2F0aW9uID09IG51bGwpIHx8IChtb2RlbEJhc2VMb2NhdGlvbi5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gaSBjYW4ndCByZXNvbHZlIHVyaSAhCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8vIHJlc29sdmUgdXJsCi0JCVVSTEhlbHBlciBoZWxwZXIgPSBuZXcgVVJMSGVscGVyKFBhdGhIZWxwZXIuZ2V0Q29udGFpbmluZ0ZvbGRlclBhdGgobW9kZWxCYXNlTG9jYXRpb24pLCBQYXRoSGVscGVyLmdldENvbnRhaW5pbmdGb2xkZXJQYXRoKFBhdGhIZWxwZXIuYXBwZW5kVHJhaWxpbmdVUkxTbGFzaChkb2Nyb290KSkpOwotCQlyZXR1cm4gaGVscGVyLnRvQWJzb2x1dGUocmVmKTsKLQl9Ci0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTdmMWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZEhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5hZGFwdGVycy5JU3R5bGVTZWxlY3RvckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmFkYXB0ZXJzLklTdHlsZVNoZWV0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxNb2RlbFBhcnNlckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5IVE1MU3R5bGVTZWxlY3RvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuaHRtbGNzcy5TdHlsZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Nb2RlbFBhcnNlckFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEVtYmVkZGVkSFRNTCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZUhhbmRsZXIgewotCi0JcHVibGljIFN0cmluZyBDb250ZW50VHlwZUlEX0VtYmVkZGVkSFRNTCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVtYmVkZGVkSFRNTCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIExpc3Qgc3VwcG9ydGVkTWltZVR5cGVzOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVtYmVkZGVkSFRNTC4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgdGFnIG5hbWVzIHVzaW5nIEJsb2NrTWFya2VyIG9iamVjdAotCSAqLwotCXByaXZhdGUgdm9pZCBhZGRIVE1MaXNoVGFnKEJsb2NrVGFnUGFyc2VyIHBhcnNlciwgU3RyaW5nIHRhZ25hbWUpIHsKLQkJQmxvY2tNYXJrZXIgYm0gPSBuZXcgQmxvY2tNYXJrZXIodGFnbmFtZSwgbnVsbCwgRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhULCBmYWxzZSk7Ci0JCXBhcnNlci5hZGRCbG9ja01hcmtlcihibSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBFbWJlZGRlZENvbnRlbnRUeXBlI2dldEZhbWlseUlkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEZhbWlseUlkKCkgewotCQlyZXR1cm4gTW9kZWxIYW5kbGVyRm9ySFRNTC5Bc3NvY2lhdGVkQ29udGVudFR5cGVJRDsKLQl9Ci0KLQkvKgotCSAqIE9ubHkgIm1vZGVsIHNpZGUiIGVtYmVkZGVkIGZhY3RvcmllcyBjYW4gYmUgYWRkZWQgaGVyZS4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MKCkpOwotCQkvLyBmYWN0b3JpZXMuYWRkQWxsKFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZhY3Rvcmllcyh0aGlzKSk7Ci0JCXJldHVybiBmYWN0b3JpZXM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjaW5pdGlhbGl6ZVBhcnNlcihSZWdpb25QYXJzZXIpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQlhZGRIVE1MaXNoVGFnKHBhcnNlciwgInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JCWFkZEhUTUxpc2hUYWcocGFyc2VyLCAic3R5bGUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBMaXN0IGdldFN1cHBvcnRlZE1pbWVUeXBlcygpIHsKLQkJaWYgKHN1cHBvcnRlZE1pbWVUeXBlcyA9PSBudWxsKSB7Ci0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC94aHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJhcHBsaWNhdGlvbi94aHRtbCt4bWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJc3VwcG9ydGVkTWltZVR5cGVzLmFkZCgidGV4dC92bmQud2FwLndtbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cHBvcnRlZE1pbWVUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5KTsKLQotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gbmV3IEhUTUxEb2N1bWVudFR5cGVBZGFwdGVyRmFjdG9yeSgpOwotCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKE1vZGVsUGFyc2VyQWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSBIVE1MTW9kZWxQYXJzZXJBZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKElTdHlsZVNlbGVjdG9yQWRhcHRlci5jbGFzcykpIHsKLQotCQkJZmFjdG9yeSA9IEhUTUxTdHlsZVNlbGVjdG9yQWRhcHRlckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXJlZ2lzdHJ5LmFkZEZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhJU3R5bGVTaGVldEFkYXB0ZXIuY2xhc3MpKSB7Ci0KLQkJCWZhY3RvcnkgPSBTdHlsZUFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnkpOwotCi0JCS8vIElTU1VFOiBzaG91bGQgdGhlc2UgZmFjdG9yaWVzIGJlIHJlbGVhc2VkPyBPciBqdXN0IAotCQkvLyByZW1vdmVkIGZyb20gdGhpcyByZWdpc3RyeSwgYmVjYXVzZSB3ZSBhcmUgZ2V0dGluZyByZWFkeSB0bwotCQkvLyByZS1hZGQgdGhlbT8KLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhEb2N1bWVudFR5cGVBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQkJaWYgKCFyZWdpc3RyeS5jb250YWlucyhNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpKSB7Ci0JCQlmYWN0b3J5ID0gcmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihNb2RlbFBhcnNlckFkYXB0ZXIuY2xhc3MpOwotCQkJZmFjdG9yeS5yZWxlYXNlKCk7Ci0JCQlyZWdpc3RyeS5yZW1vdmVGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0JCWlmICghcmVnaXN0cnkuY29udGFpbnMoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKSkgewotCQkJZmFjdG9yeSA9IHJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoSVN0eWxlU2VsZWN0b3JBZGFwdGVyLmNsYXNzKTsKLQkJCWZhY3RvcnkucmVsZWFzZSgpOwotCQkJcmVnaXN0cnkucmVtb3ZlRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCQlpZiAoIXJlZ2lzdHJ5LmNvbnRhaW5zKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcykpIHsKLQkJCWZhY3RvcnkgPSByZWdpc3RyeS5nZXRGYWN0b3J5Rm9yKElTdHlsZVNoZWV0QWRhcHRlci5jbGFzcyk7Ci0JCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCXJlZ2lzdHJ5LnJlbW92ZUZhY3RvcnkoZmFjdG9yeSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZVBhcnNlcihKU1BDYXBhYmxlUGFyc2VyIHBhcnNlcikgewotCQkvLyBJJ20gYXNzdW1pbmcgYmxvY2sgbWFya2VycyBhcmUgdW5pcXVlIGJhc2VkIG9uIG5hbWUgb25seQotCQkvLyB3ZSBhZGQgdGhlc2UgYXMgZnVsbCBCbG9ja01hcmtlcnMsIGJ1dCByZW1vdmUgYmFzZWQgb24gbmFtZSBhbG9uZS4KLQkJcGFyc2VyLnJlbW92ZUJsb2NrTWFya2VyKCJzY3JpcHQiKTsgLy8kTk9OLU5MUy0xJAotCQlwYXJzZXIucmVtb3ZlQmxvY2tNYXJrZXIoInNjcmlwdCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIEVtYmVkZGVkVHlwZUhhbmRsZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgRW1iZWRkZWRIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogd2lsbCBzb21lZGF5IGJlIGNvbnRyb2xsZWQgdmlhIGV4dGVuc2lvbiBwb2ludAotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCXJldHVybiBnZXRTdXBwb3J0ZWRNaW1lVHlwZXMoKS5jb250YWlucyhtaW1lVHlwZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2Y2MxNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5IVE1MTW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvckhUTUwgZXh0ZW5kcyBBYnN0cmFjdE1vZGVsSGFuZGxlciBpbXBsZW1lbnRzIElNb2RlbEhhbmRsZXIgewotCS8qKiAKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiAKLQkgKiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4gYXQgcnVuIHRpbWUgd2l0aCAKLQkgKiB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBOZWVkcyB0byBtYXRjaCB3aGF0J3MgaW4gcGx1Z2luIHJlZ2lzdHJ5LiAKLQkgKiBJbiBmYWN0LCBjYW4gYmUgb3ZlcndyaXR0ZW4gYXQgcnVuIHRpbWUgd2l0aCAKLQkgKiB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySURfSFRNTCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHVibGljIE1vZGVsSGFuZGxlckZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldElkKE1vZGVsSGFuZGxlcklEX0hUTUwpOwotCQlzZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZChBc3NvY2lhdGVkQ29udGVudFR5cGVJRCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldEVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXJldHVybiBuZXcgSFRNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBIVE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQxZjkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHsKLQotCi0JcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25CdWRkeVN5c3RlbShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIHNlbGYsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYnVkZHksIGJvb2xlYW4gaXNYSFRNTCkgewotCQlzdXBlcihzZWxmLCBidWRkeSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQXR0cmlidXRlRGVjbGFyYXRpb24jZ2V0QXR0ck5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0QXR0ck5hbWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRBdHRyVHlwZSgpCi0JICovCi0JcHVibGljIENNRGF0YVR5cGUgZ2V0QXR0clR5cGUoKSB7Ci0JCXJldHVybiBnZXRTZWxmKCkuZ2V0QXR0clR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXREZWZhdWx0VmFsdWUoKQotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXREZWZhdWx0VmFsdWUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiNnZXRFbnVtQXR0cigpCi0JICogQGRlcHJlY2F0ZWQgaW4gc3VwZXJjbGFzcwotCSAqLwotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpIHsKLQkJcmV0dXJuIGdldFNlbGYoKS5nZXRFbnVtQXR0cigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uI2dldFVzYWdlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFVzYWdlKCkgewotCQlyZXR1cm4gZ2V0U2VsZigpLmdldFVzYWdlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldFNlbGYoKSB7Ci0JCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgc2VsZjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4ZjEzZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5zc2kuU1NJQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWwuQ01Eb2NUeXBlOwotCi0vKioKLSAqLwotY2xhc3MgQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgQ01Eb2N1bWVudCBnZXRIVE1MQ01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQl9Ci0KLQljbGFzcyBFbGVtZW50cyBleHRlbmRzIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0gewotCQlwdWJsaWMgRWxlbWVudHMoQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkJc3VwZXIoaXNYSFRNTCk7Ci0JCQltYWtlQnVkZHlTeXN0ZW0oZWxlbWVudHMpOwotCQkJYWRkU1NJRGVjbHMoKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBlZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0RGVjbChvcmlnaW5hbCk7Ci0JCQlyZXR1cm4gbmV3IENNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oZWRlY2wsIGlzWEhUTUwoKSk7Ci0JCX0KLQotCQlwcml2YXRlIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2woQ01Ob2RlIGNtbm9kZSkgewotCQkJaWYgKGNtbm9kZSA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21ub2RlOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGFkZFNTSURlY2xzKCkgewotCQkJQ01Eb2N1bWVudCBzc2kgPSBTU0lDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KCk7Ci0JCQlpZiAoc3NpID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBzc2kuZ2V0RWxlbWVudHMoKTsKLQkJCUl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0JCQkJaWYgKGRlY2wgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJcHV0KGRlY2wuZ2V0RWxlbWVudE5hbWUoKSwgZGVjbCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnRzIGVsZW1lbnRzID0gbnVsbDsKLQotCXB1YmxpYyBDTURvY3VtZW50Rm9yQnVkZHlTeXN0ZW0oQ01Eb2N1bWVudCBzZWxmLCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoc2VsZiwgZ2V0SFRNTENNRG9jdW1lbnQoKSwgaXNYSFRNTCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0RWxlbWVudHMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpIHsKLQkJaWYgKGVsZW1lbnRzICE9IG51bGwpCi0JCQlyZXR1cm4gZWxlbWVudHM7Ci0JCUNNRG9jdW1lbnQgY21kb2MgPSBnZXRTZWxmKCk7Ci0JCWlmIChjbWRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsZW1lbnRzID0gbmV3IEVsZW1lbnRzKGNtZG9jLmdldEVsZW1lbnRzKCksIGlzWEhUTUwpOwotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0RW50aXRpZXMoKQotCSAqLwotCXB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJQ01Eb2N1bWVudCBjbWRvYyA9IGdldFNlbGYoKTsKLQkJaWYgKGNtZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNtZG9jLmdldEVudGl0aWVzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRG9jdW1lbnQjZ2V0TmFtZXNwYWNlKCkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lc3BhY2UgZ2V0TmFtZXNwYWNlKCkgewotCQlDTURvY3VtZW50IGNtZG9jID0gZ2V0U2VsZigpOwotCQlpZiAoY21kb2MgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gY21kb2MuZ2V0TmFtZXNwYWNlKCk7Ci0JfQotCi0JcHJpdmF0ZSBDTURvY3VtZW50IGdldFNlbGYoKSB7Ci0JCWlmIChzZWxmLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkRPQ1VNRU5UKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Eb2N1bWVudCkgc2VsZjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01FbGVtZW50RGVjbGFyYXRpb25CdWRkeVN5c3RlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFiNGUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTENNUHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci0KLS8qKgotICovCi1jbGFzcyBDTUVsZW1lbnREZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtIGV4dGVuZHMgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgaHRtbGNtID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkhUTUxfRE9DX1RZUEUpOwotCi0JcHJpdmF0ZSBzdGF0aWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0SFRNTENNRWxlbURlY2woQ01FbGVtZW50RGVjbGFyYXRpb24gb3JpZ2luYWwpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gYnVkZHkgPSBudWxsOwotCQlpZiAoaHRtbGNtICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1zID0gaHRtbGNtLmdldEVsZW1lbnRzKCk7Ci0JCQlpZiAoZWxlbXMgIT0gbnVsbCkgewotCQkJCWJ1ZGR5ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtcy5nZXROYW1lZEl0ZW0ob3JpZ2luYWwuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZGR5OwotCX0KLQotCXByaXZhdGUgY2xhc3MgQXR0cnMgZXh0ZW5kcyBDTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtIHsKLQkJcHJpdmF0ZSBDTU5hbWVkTm9kZU1hcCBidWRkeUF0dHJzID0gbnVsbDsKLQotCQlwdWJsaWMgQXR0cnMoQ01OYW1lZE5vZGVNYXAgYXR0cnMsIENNTmFtZWROb2RlTWFwIGJ1ZGR5QXR0cnMsIGJvb2xlYW4gaXNYSFRNTCkgewotCQkJc3VwZXIoaXNYSFRNTCk7Ci0JCQl0aGlzLmJ1ZGR5QXR0cnMgPSBidWRkeUF0dHJzOwotCQkJbWFrZUJ1ZGR5U3lzdGVtKGF0dHJzKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWRlY2wgPSBnZXREZWNsKG9yaWdpbmFsKTsKLQkJCWlmIChhZGVjbCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGFkZWNsLmdldEF0dHJOYW1lKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNyZWF0ZUJ1ZGR5U3lzdGVtKENNTm9kZSBvcmlnaW5hbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjbCA9IGdldERlY2wob3JpZ2luYWwpOwotCQkJaWYgKGFkZWNsID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGJ1ZGR5ID0gbnVsbDsKLQkJCWlmIChidWRkeUF0dHJzICE9IG51bGwpIHsKLQkJCQlidWRkeSA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBidWRkeUF0dHJzLmdldE5hbWVkSXRlbShhZGVjbC5nZXRBdHRyTmFtZSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkJ1ZGR5U3lzdGVtKGFkZWNsLCBidWRkeSwgaXNYSFRNTCgpKTsKLQkJfQotCi0JCXByaXZhdGUgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXREZWNsKENNTm9kZSBjbW5vZGUpIHsKLQkJCWlmIChjbW5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEF0dHJzIGF0dHJpYnV0ZXMgPSBudWxsOwotCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uQnVkZHlTeXN0ZW0oQ01FbGVtZW50RGVjbGFyYXRpb24gc2VsZiwgYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKHNlbGYsIGdldEhUTUxDTUVsZW1EZWNsKHNlbGYpLCBpc1hIVE1MKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01FbGVtZW50RGVjbGFyYXRpb24jZ2V0QXR0cmlidXRlcygpCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0cmlidXRlczsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGh0bWxEZWNsID0gZ2V0QnVkZHkoKTsKLQkJQ01OYW1lZE5vZGVNYXAgaHRtbEF0dHJzID0gKGh0bWxEZWNsID09IG51bGwpID8gbnVsbCA6IGh0bWxEZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQkJYXR0cmlidXRlcyA9IG5ldyBBdHRycyhlZGVjbC5nZXRBdHRyaWJ1dGVzKCksIGh0bWxBdHRycywgaXNYSFRNTCk7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb250ZW50KCkKLQkgKi8KLQlwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWNsID0gZ2V0U2VsZigpOwotCQlpZiAoZWRlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZWRlY2wuZ2V0Q29udGVudCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRDb250ZW50VHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQkJcmV0dXJuIGVkZWNsLmdldENvbnRlbnRUeXBlKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldEVsZW1lbnROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGVkZWNsLmdldEVsZW1lbnROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNRWxlbWVudERlY2xhcmF0aW9uI2dldERhdGFUeXBlKCkKLQkgKi8KLQlwdWJsaWMgQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXREYXRhVHlwZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTUVsZW1lbnREZWNsYXJhdGlvbiNnZXRMb2NhbEVsZW1lbnRzKCkKLQkgKi8KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBlZGVjbC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNQ29udGVudCNnZXRNYXhPY2N1cigpCi0JICovCi0JcHVibGljIGludCBnZXRNYXhPY2N1cigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWRlY2wgPSBnZXRTZWxmKCk7Ci0JCWlmIChlZGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gZWRlY2wuZ2V0TWF4T2NjdXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Db250ZW50I2dldE1pbk9jY3VyKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjbCA9IGdldFNlbGYoKTsKLQkJaWYgKGVkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCXJldHVybiBlZGVjbC5nZXRNaW5PY2N1cigpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjc3VwcG9ydHMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKGlzWEhUTUwgJiYgcHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChpc1hIVE1MICYmIHByb3BlcnR5TmFtZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKQotCQkJcmV0dXJuIEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfTk9ORTsKLQkJcmV0dXJuIHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTZWxmKCkgewotCQlpZiAoc2VsZi5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHNlbGY7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRCdWRkeSgpIHsKLQkJaWYgKGJ1ZGR5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGJ1ZGR5LmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChDTUVsZW1lbnREZWNsYXJhdGlvbikgYnVkZHk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQzZGFhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9DTU5hbWVkTm9kZU1hcEZvckJ1ZGR5U3lzdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotLyoqCi0gKi8KLWFic3RyYWN0IGNsYXNzIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCB7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJpdmF0ZSBIYXNodGFibGUgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3Igb2YgQ01OYW1lZE5vZGVNYXBGb3JCdWRkeVN5c3RlbS4KLQkgKiBDQVVUSU9OOiBFYWNoIGRlcml2ZWQgY2xhc3MgbXVzdCBjYWxsICdtYWtlQnVkZHlTeXN0ZW0nIG1ldGhvZCBpbiBpdHMKLQkgKiBjb25zdHJ1Y3RvciB0byBidWlsZCB1cCBpdHMgY29udGVudHMuCi0JICovCi0JcHVibGljIENNTmFtZWROb2RlTWFwRm9yQnVkZHlTeXN0ZW0oYm9vbGVhbiBpc1hIVE1MKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuaXNYSFRNTCA9IGlzWEhUTUw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2dldExlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBtYXAuc2l6ZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5hbWVkTm9kZU1hcCNnZXROYW1lZEl0ZW0oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCVN0cmluZyBrZXkgPSBjYW5vbmljYWxOYW1lKG5hbWUpOwotCQlpZiAoIW1hcC5jb250YWluc0tleShrZXkpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01Ob2RlKSBtYXAuZ2V0KGtleSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTmFtZWROb2RlTWFwI2l0ZW0oaW50KQotCSAqLwotCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJSXRlcmF0b3IgaXRlciA9IGl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJT2JqZWN0IG5vZGUgPSBpdGVyLm5leHQoKTsKLQkJCWlmICgtLWluZGV4IDwgMCkKLQkJCQlyZXR1cm4gKENNTm9kZSkgbm9kZTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01OYW1lZE5vZGVNYXAjaXRlcmF0b3IoKQotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJcmV0dXJuIG1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCX0KLQotCS8qIHBhY2thZ2Ugc2NvcGUuICovCi0Jdm9pZCBwdXQoU3RyaW5nIG5hbWUsIENNTm9kZSBjbW5vZGUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBjbW5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbWFwLnB1dChjYW5vbmljYWxOYW1lKG5hbWUpLCBjbW5vZGUpOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0S2V5TmFtZShDTU5vZGUgb3JpZ2luYWwpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIENNTm9kZSBjcmVhdGVCdWRkeVN5c3RlbShDTU5vZGUgb3JpZ2luYWwpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYSFRNTCgpIHsKLQkJcmV0dXJuIGlzWEhUTUw7Ci0JfQotCi0JLyoqCi0JICogRWFjaCBkZXJpdmVkIGNsYXNzIG11c3QgY2FsbCB0aGlzIG1ldGhvZCBpbiBpdHMgY29uc3RydWN0b3IKLQkgKiB0byBidWlsZCB1cCBpdHMgY29udGVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbWFrZUJ1ZGR5U3lzdGVtKENNTmFtZWROb2RlTWFwIG9yaWdpbmFsKSB7Ci0JCUl0ZXJhdG9yIGkgPSBvcmlnaW5hbC5pdGVyYXRvcigpOwotCQlpZiAoaSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNNTm9kZSBvcmcgPSAoQ01Ob2RlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSBnZXRLZXlOYW1lKG9yZyk7Ci0JCQlDTU5vZGUgbmV3Tm9kZSA9IGNyZWF0ZUJ1ZGR5U3lzdGVtKG9yZyk7Ci0JCQlwdXQoa2V5LCBuZXdOb2RlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNhbm9uaWNhbE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIG5hbWUudG9VcHBlckNhc2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Ob2RlQnVkZHlTeXN0ZW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0NNTm9kZUJ1ZGR5U3lzdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3YThiZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvQ01Ob2RlQnVkZHlTeXN0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqLwotY2xhc3MgQ01Ob2RlQnVkZHlTeXN0ZW0gaW1wbGVtZW50cyBDTU5vZGUgewotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1hIVE1MID0gZmFsc2U7Ci0JcHJvdGVjdGVkIENNTm9kZSBzZWxmID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ01Ob2RlIGJ1ZGR5ID0gbnVsbDsKLQotCXB1YmxpYyBDTU5vZGVCdWRkeVN5c3RlbShDTU5vZGUgc2VsZiwgQ01Ob2RlIGJ1ZGR5LCBib29sZWFuIGlzWEhUTUwpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5zZWxmID0gc2VsZjsKLQkJdGhpcy5idWRkeSA9IGJ1ZGR5OwotCQl0aGlzLmlzWEhUTUwgPSBpc1hIVE1MOwotCX0KLQotCS8qCi0JICogQHNlZSBDTU5vZGUjZ2V0Tm9kZU5hbWUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBzZWxmLmdldE5vZGVOYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXROb2RlVHlwZSgpCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIHNlbGYuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgQ01Ob2RlI3N1cHBvcnRzKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkKLQkJCXJldHVybiB0cnVlOwotCQlpZiAoYnVkZHkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGJ1ZGR5LnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIENNTm9kZSNnZXRQcm9wZXJ0eShTdHJpbmcpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCWlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKCFpc1hIVE1MKTsKLQkJfQotCQlpZiAocHJvcGVydHlOYW1lLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSkgewotCQkJcmV0dXJuIG5ldyBCb29sZWFuKGlzWEhUTUwpOwotCQl9Ci0KLQkJaWYgKGJ1ZGR5ID09IG51bGwgfHwgKCFidWRkeS5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYnVkZHkuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvRG9jdW1lbnRRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzJjMjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0RvY3VtZW50UXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlOwotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBEb2N1bWVudFF1ZXJ5IHsKLQotCS8qKgotCSAqIGlzUmVuZGVyUm9vdCgpIHJldHVybnMgdHJ1ZSBpZiAtIG5vZGUgaXMgQk9EWSBlbGVtZW50IChib3RoIGV4cGxpY2l0Ci0JICogYW5kIGltcGxpY2l0KSAtIG5vZGUgaXMgcG9ydGFsaHRtbDpib2R5IGVsZW1lbnQgLSBub2RlIGlzIERvY3VtZW50IG5vZGUKLQkgKiBhbmQgdGhlIGRvY3VtZW50IGlzIHRyZWF0ZWQgYXMgZnJhZ21lbnQgKHdpdGggQk9EWSBjb250ZXh0KSBOb3RlIHRoYXQKLQkgKiBpbiBlZGl0aW5nIGEgZnJhZ21lbnQgZmlsZSwgRG9jdW1lbnQgbm9kZSBzaG91bGQgYmUgdHJlYXRlZCBhcyBhCi0JICogc3Vic3RpdHV0ZSBvZiBCT0RZIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc1JlbmRlclJvb3QoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGlzSGVhZENvcnJlc3BvbmRlbnQoKSByZXR1cm5zIHRydWUgaWYgLSBub2RlIGlzIEhFQUQgZWxlbWVudCAoYm90aAotCSAqIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCkgLSBub2RlIGlzIHBvcnRhbGh0bWw6aGVhZCBlbGVtZW50IC0gbm9kZSBpcwotCSAqIERvY3VtZW50IG5vZGUgYW5kIHRoZSBkb2N1bWVudCBpcyB0cmVhdGVkIGFzIGZyYWdtZW50ICh3aXRoIEhFQUQKLQkgKiBjb250ZXh0KSBOb3RlIHRoYXQgaW4gZWRpdGluZyBhIGZyYWdtZW50IGZpbGUgKHdpdGggSEVBRCBjb250ZXh0KSwKLQkgKiBEb2N1bWVudCBub2RlIHNob3VsZCBiZSB0cmVhdGVkIGFzIGEgc3Vic3RpdHV0ZSBvZiBIRUFEIGVsZW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0hlYWRDb3JyZXNwb25kZW50KE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBJbXBsaWNpdCBCT0RZIGVsZW1lbnQgd2lsbCBiZSBnb25lIGluIFY2IFNFRCBtb2RlbC4gU28gcGFnZSBkZXNpZ25lcgotCSAqIHByb3ZpZGVzIGFuIEFQSSB0byBnZXQgYSByYW5nZSB3aG9zZSBjb250ZW50IG5vZGVzIGFyZSByZW5kZXJlZCBpbgotCSAqIGRlc2lnbiB2aWV3LiBnZXRSZW5kZXJSb290UmFuZ2UoKSByZXR1cm5zIC0gYSByYW5nZSBmcm9tIEJPRFkncyBmaXJzdAotCSAqIHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIEJPRFkgZWxlbWVudCkgLSBhIHJhbmdlIGZvcm0KLQkgKiBEb2N1bWVudCdzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZCi0JICogY29udGV4dCkgLSBudWxsIChpZiB0aGUgZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQpIFtUaGUKLQkgKiBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSByYW5nZSBmcm9tIGEgY3VzdG9tCi0JICogdGFnJ3MgZmlyc3QgdG8gaXRzIGxhc3QgKGlmIHRoZSBkb2N1bWVudCBoYXMgYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEJPRFkgZWxlbWVudCBhdCBydW50aW1lKSAtIGEgcmFuZ2UgZnJvbSBEb2N1bWVudCdzCi0JICogYXBwcm9waXJhdGUgb2Zmc2V0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdAotCSAqIEJPRFkvSFRNTCkgLSBhIHJhbmdlIGZyb20gSFRNTCBlbGVtZW50J3MgYXBwcm9wcmlhdGUgb2Zmc2V0IHRvIGl0cyBsYXN0Ci0JICogKGlmIHRoZSBkb2N1bWVudCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0IEJPRFkgYnV0IGhhdmUgZXhwbGljaXQgSFRNTCkKLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCVJhbmdlIGdldFJlbmRlclJvb3RSYW5nZShEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogSW1wbGljaXQgSEVBRCBlbGVtZW50IHdpbGwgYmUgZ29uZSBpbiBWNiBTRUQgbW9kZWwuIFNvIHBhZ2UgZGVzaWduZXIKLQkgKiBwcm92aWRlcyBhbiBBUEkgdG8gZ2V0IGEgcmFuZ2Ugd2hvc2UgY29udGVudCBub2RlcyBhcmUgdHJlYXRlZCBhcyBIRUFECi0JICogZWxlbWVudCdzIGNoaWxkLiBnZXRIZWFkQ29ycmVzcG9uZGVudFJhbmdlKCkgcmV0dXJucyAtIGEgcmFuZ2UgZnJvbQotCSAqIEhFQUQncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGhhcyBIRUFEIGVsZW1lbnQpIC0gYSByYW5nZQotCSAqIGZvcm0gRG9jdW1lbnQncyBmaXJzdCB0byBpdHMgbGFzdCAoaWYgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGgKLQkgKiBIRUFEIGNvbnRleHQpIC0gbnVsbCAoaWYgdGhlIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0KQotCSAqIFtUaGUgZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkIHNpbmNlIFY2XSAtIGEgcmFuZ2UgZnJvbSBhCi0JICogY3VzdG9tIHRhZydzIGZpcnN0IHRvIGl0cyBsYXN0IChpZiB0aGUgZG9jdW1lbnQgaGFzIGEgY3VzdG9tIHRhZyB3aGljaAotCSAqIGdlbmVyYXRlcyBIRUFEIGVsZW1lbnQgYXQgcnVudGltZSkgLSBhIHJhbmdlIGZyb20gRG9jdW1lbnQncyBmaXJzdCB0bwotCSAqIGFwcHJvcGlyYXRlIG9mZnNldCAoaWYgdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgZXhwbGljaXQgSEVBRC9IVE1MKSAtCi0JICogYSByYW5nZSBmcm9tIEhUTUwgZWxlbWVudCdzIGZpcnN0IHRvIGFwcHJvcHJpYXRlIG9mZnNldCAoaWYgdGhlCi0JICogZG9jdW1lbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdCBIRUFEIGJ1dCBoYXZlIGV4cGxpY2l0IEhUTUwpCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlSYW5nZSBnZXRIZWFkQ29ycmVzcG9uZGVudFJhbmdlKERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBnZXRSZW5kZXJSb290Tm9kZSgpIHdpdGggW2NyZWF0ZT1mYWxzZV0gcmV0dXJucyAtIEJPRFkgZWxlbWVudCBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgQk9EWSBlbGVtZW50IC0gbnVsbCBpZiB0aGlzIGRvY3VtZW50Ci0JICogaXMgbm90IGZyYWdtZW50IGFuZCBkb2VzIG5vdCBoYXZlIEJPRFkgZWxlbWVudCAtIERvY3VtZW50IG5vZGUgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IC0gbnVsbCBpZiB0aGlzIGRvY3VtZW50IGlzCi0JICogZnJhZ21lbnQgd2l0aCBIRUFEIGNvbnRleHQgW1RoZSBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UKLQkgKiBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2ggZ2VuZXJhdGVzIEJPRFkgdGFnIGF0IHJ1bnRpbWUgLSBEb2N1bWVudCBub2RlCi0JICogb3IgSFRNTCBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlCi0JICogZXhwbGljaXQgQk9EWSBlbGVtZW50IGdldFJlbmRlclJvb3ROb2RlKCkgd2l0aCBbY3JlYXRlPXRydWVdIHJldHVybnMgLQotCSAqIEJPRFkgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgaGFzIEJPRFkgZWxlbWVudCAobm8KLQkgKiBtb2RpZmljdGF0aW9uKSAtIG5ld2x5IGNyZWF0ZWQgQk9EWSBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90Ci0JICogZnJhZ21lbnQgYnV0IGRvZXMgbm90IGhhdmUgQk9EWSBlbGVtZW50IC0gRG9jdW1lbnQgbm9kZSBpZiB0aGlzCi0JICogZG9jdW1lbnQgaXMgZnJhZ21lbnQgd2l0aCBCT0RZIGNvbnRleHQgKG5vIG1vZGlmaWN0YXRpb24pIFtUaGUKLQkgKiBmb2xsb3dpbmcgY2FzZXMgd2lsbCBiZSBzdXBwb3J0ZWQgc2luY2UgVjZdIC0gYSBjdXN0b20gdGFnIHdoaWNoCi0JICogZ2VuZXJhdGVzIEJPRFkgdGFnIGF0IHJ1bnRpbWUgKG5vIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBCT0RZCi0JICogZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdAotCSAqIEJPRFkgZWxlbWVudCBnZXRSZW5kZXJSb290Tm9kZSgpIHRocm93cyBIVE1MQ29tbWFuZEV4Y2VwdGlvbiAoc2luY2UgVjYpCi0JICogaWYgLSB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggSEVBRCBjb250ZXh0IGFuZCAtICJjcmVhdGUiCi0JICogcGFyYW1ldGVyIGlzIHRydWUgTm90ZSB0aGF0IGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlLCBEb2N1bWVudCBub2RlCi0JICogc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJzdGl0dXRlIG9mIEJPRFkgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRPckRvY3VtZW50Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGdldFJlbmRlclJvb3ROb2RlKE5vZGUgY2hpbGRPckRvY3VtZW50LCBib29sZWFuIGNyZWF0ZSk7Ci0KLQkvKioKLQkgKiBnZXRIZWFkQ29ycmVzcG9uZGVudE5vZGUoKSB3aXRoIFtjcmVhdGU9ZmFsc2VdIHJldHVybnMgLSBIRUFEIGVsZW1lbnQKLQkgKiBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgaGFzIEhFQUQgZWxlbWVudCAtIG51bGwgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBhbmQgZG9lcyBub3QgaGF2ZSBIRUFEIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlCi0JICogaWYgdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCAtIG51bGwgaWYgdGhpcyBkb2N1bWVudAotCSAqIGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IFtUaGUgZm9sbG93aW5nIGNhc2VzIHdpbGwgYmUgc3VwcG9ydGVkCi0JICogc2luY2UgVjZdIC0gYSBjdXN0b20gdGFnIHdoaWNoIGdlbmVyYXRlcyBIRUFEIHRhZyBhdCBydW50aW1lIC0gRG9jdW1lbnQKLQkgKiBub2RlIG9yIEhUTUwgZWxlbWVudCBpZiB0aGlzIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZQotCSAqIGV4cGxpY2l0IEhFQUQgZWxlbWVudCBnZXRIZWFkQ29ycmVzcG9uZGVudE5vZGUoKSB3aXRoIFtjcmVhdGU9dHJ1ZV0KLQkgKiByZXR1cm5zIC0gSEVBRCBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGFuZCBoYXMgSEVBRAotCSAqIGVsZW1lbnQgKG5vIG1vZGlmaWN0YXRpb24pIC0gbmV3bHkgY3JlYXRlZCBIRUFEIGVsZW1lbnQgaWYgdGhpcwotCSAqIGRvY3VtZW50IGlzIG5vdCBmcmFnbWVudCBidXQgZG9lcyBub3QgaGF2ZSBIRUFEIGVsZW1lbnQgLSBEb2N1bWVudCBub2RlCi0JICogaWYgdGhpcyBkb2N1bWVudCBpcyBmcmFnbWVudCB3aXRoIEhFQUQgY29udGV4dCAobm8gbW9kaWZpY3RhdGlvbikgW1RoZQotCSAqIGZvbGxvd2luZyBjYXNlcyB3aWxsIGJlIHN1cHBvcnRlZCBzaW5jZSBWNl0gLSBhIGN1c3RvbSB0YWcgd2hpY2gKLQkgKiBnZW5lcmF0ZXMgSEVBRCB0YWcgYXQgcnVudGltZSAobm8gbW9kaWZpY3RhdGlvbikgLSBuZXdseSBjcmVhdGVkIEhFQUQKLQkgKiBlbGVtZW50IGlmIHRoaXMgZG9jdW1lbnQgaXMgbm90IGZyYWdtZW50IGJ1dCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0Ci0JICogSEVBRCBlbGVtZW50IGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZSgpIHRocm93cyBIVE1MQ29tbWFuZEV4Y2VwdGlvbgotCSAqIChzaW5jZSBWNikgaWYgLSB0aGlzIGRvY3VtZW50IGlzIGZyYWdtZW50IHdpdGggQk9EWSBjb250ZXh0IGFuZCAtCi0JICogImNyZWF0ZSIgcGFyYW1ldGVyIGlzIHRydWUgTm90ZSB0aGF0IGluIGVkaXRpbmcgYSBmcmFnbWVudCBmaWxlLAotCSAqIERvY3VtZW50IG5vZGUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBzdWJzdGl0dXRlIG9mIEhFQUQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGRPckRvY3VtZW50Ci0JICogQHBhcmFtIGNyZWF0ZQotCSAqIEByZXR1cm4KLQkgKi8KLQlOb2RlIGdldEhlYWRDb3JyZXNwb25kZW50Tm9kZShOb2RlIGNoaWxkT3JEb2N1bWVudCwgYm9vbGVhbiBjcmVhdGUpOwotCi0JLyoqCi0JICogZ2V0SHRtbENvcnJlc3BvbmRlbnROb2RlKCkgdGhyb3dzIEhUTUxDb21tYW5kRXhjZXB0aW9uIChzaW5jZSBWNikgaWYgLQotCSAqIHRoaXMgZG9jdW1lbnQgaXMgZnJhZ21lbnQgYW5kICJjcmVhdGUiIHBhcmFtZXRlciBpcyB0cnVlCi0JICogCi0JICogQHBhcmFtIGNoaWxkT3JEb2N1bWVudAotCSAqIEBwYXJhbSBjcmVhdGUKLQkgKiBAcmV0dXJuCi0JICovCi0JTm9kZSBnZXRIdG1sQ29ycmVzcG9uZGVudE5vZGUoTm9kZSBjaGlsZE9yRG9jdW1lbnQsIGJvb2xlYW4gY3JlYXRlKTsKLQotCS8qKgotCSAqIFRoaXMgaW5uZXIgY2xhc3MgaXMgaW50ZW5kZWQgZm9yIGluc2VydGlvbiB0YXJnZXQuIHBsZWFzZSB1c2UgdGhpcyBsaWtlCi0JICogdGhlIGZvbGxvd2luZyA6IERvY3VtZW50UXVlcnkuSW5zZXJ0aW9uVGFyZ2V0IGluczsKLQkgKiBpbnMuZ2V0UGFyZW50KCkuaW5zZXJ0QmVmb3JlKHlvdUluc2VydGlvbk5vZGUsIGlucy5nZXRSZWYoKSk7Ci0JICovCi0JcHVibGljIGNsYXNzIEluc2VydGlvblRhcmdldCB7Ci0JCXByaXZhdGUgZmluYWwgTm9kZSBwYXJlbnQ7Ci0JCXByaXZhdGUgZmluYWwgTm9kZSByZWY7Ci0KLQkJcHVibGljIEluc2VydGlvblRhcmdldChOb2RlIHBhcmVudCwgTm9kZSByZWYpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5yZWYgPSByZWY7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKSB7Ci0JCQlyZXR1cm4gcGFyZW50OwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0UmVmKCkgewotCQkJcmV0dXJuIHJlZjsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldEhlYWRJbnNlcnRpb25UYXJnZXQoKSByZXR1cm5zIGFwcHJvcHJpYXRlIGluc2V0aW9uIHRhcmdldCBsb2NhdGlvbgotCSAqIGZvciBIRUFEIGNoaWxkIHRhZ3Mgc3VjaCBhcyA8c2NyaXB0PiwgPHN0eWxlPiwgPG1ldGE+ZXRjLiBCYXNpY2FsbHkKLQkgKiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgPEhFQUQ+dGFnJ3MgdGhlIGxhc3QgcG9zaXRpb24uIE5vdGUgdGhhdCB0aGlzCi0JICogd291bGQgbm90IGNyZWF0ZSBhY3R1YWwgPEhFQUQ+dGFnIHdoZW4gdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUgaXQuCi0JICogPEhFQUQ+aXMgb21pdHRhYmxlIHRhZyBzbyB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYXBwcm9wcmlhdGUgcG9zaXRpb24KLQkgKiB0byB3aGljaCBpbXBsaWNpdCA8SEVBRD5jYW4gYmUgaW5zZXJ0ZWQsIGlmIHRoZSBkb2N1bWVudCBoYXMgbm8KLQkgKiA8SEVBRD4uCi0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlJbnNlcnRpb25UYXJnZXQgZ2V0SGVhZEluc2VydGlvblRhcmdldChEb2N1bWVudCBkb2MpOwotCi0JLyoqCi0JICogZ2V0UGFnZUluc2VydGlvblRhcmdldCgpIHJldHVybnMgYXBwcm9wcmlhdGUgaW5zZXRpb24gdGFyZ2V0IGxvY2F0aW9uCi0JICogZm9yIHBhZ2UtbGV2ZWwgbWFya3Vwcywgc3VjaCBhcyBKU1AgZGlyZWN0aXZlcywgdXNlYmVhbiB0YWdzIG9yIDxodG1sPgotCSAqIHRhZy4gQmFzaWNhbGx5IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBqdXN0IGJlZm9yZSA8SFRNTD50YWcuIE5vdGUgdGhhdAotCSAqIHRoaXMgd291bGQgbm90IGNyZWF0ZSBhY3R1YWwgPEhUTUw+dGFnIHdoZW4gdGhlIGRvY3VtZW50IGRvZXMgbm90IGhhdmUKLQkgKiBpdC4gSW4gc3VjaCBjYXNlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb3NpdGlvbiBqdXN0IGJlZm9yZSB0aGUKLQkgKiBtZWFuaW5nZnVsIHRhZ3Mgc3VjaCBhcyBIVE1ML0pTUCBlbGVtZW50cy4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jCi0JICogQHJldHVybgotCSAqLwotCUluc2VydGlvblRhcmdldCBnZXRQYWdlSW5zZXJ0aW9uVGFyZ2V0KERvY3VtZW50IGRvYyk7Ci0KLQkvKioKLQkgKiBpc0ZyYWdtZW50KCkgcmV0dXJucyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBmcmFnbWVudCBvciBjb21wbGV0ZQotCSAqIGRvY3VtZW50Ci0JICogCi0JICogQHBhcmFtIGRvYwotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzRnJhZ21lbnQoRG9jdW1lbnQgZG9jKTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMzk2ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKTsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbGFyYXRpb24pOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9FbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDk4MWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0VsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyRmFjdG9yeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgYWRhcHQoSU5vZGVOb3RpZmllciBub3RpZmllcikgewotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyOwotCQlhZGFwdGVyID0gbmV3IEhUTUxFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKCk7Ci0JCW5vdGlmaWVyLmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5KCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBkZWZhdWx0IGlzIHRvIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBPdmVycmlkaW5nIGNvcHkgbWV0aG9kCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlckZhY3RvcnkgY29weSgpIHsKLQkJcmV0dXJuIGdldEluc3RhbmNlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hNUVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJkZGIxNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9ITVFVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBITVFVdGlsIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFZlY3RvciBudWxsVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JLyogSE1RVXRpbCBjbGFzcyBtdXN0IG5vdCBpbnN0YW50aWF0ZS4gKi8KLQlwcml2YXRlIEhNUVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyogZ2F0aGVyIGFsbCBlbGVtZW50IGRlY2xhcmF0aW9ucyBpbiBpbmNsdXNpb24gb2YgZWFjaCBwYXJlbnQgb2YgdGhlIHRhcmdldC4gCi0JICogdGhlIGluY2x1c2lvbiBvZiB0aGUgdGFyZ2V0IGlzIGFsc28gZ2F0aGVyZWQuICovCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldEluY2x1c2lvbnMoRWxlbWVudCB0YXJnZXQpIHsKLQkJaWYgKHRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGxWZWN0b3I7Ci0JCUNvbGxlY3Rpb24gaW5jbHVzaW9ucyA9IGdhdGhlckluY2x1c2lvbnMoZ2V0QW5jZXN0b3JEZWNsYXJhdGlvbnModGFyZ2V0KSk7Ci0KLQkJSGFzaHRhYmxlIGF2YWlsYWJsZXMgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSBpbmNsdXNpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01Db250ZW50IGluY2x1c2lvbiA9IChDTUNvbnRlbnQpIGl0ZXIubmV4dCgpOwotCQkJc3dpdGNoIChpbmNsdXNpb24uZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQkJZXh0cmFjdERlY2xhcmF0aW9ucyhhdmFpbGFibGVzLCAoQ01Hcm91cCkgaW5jbHVzaW9uKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0JCQkJCWFkZEluY2x1c2lvbihhdmFpbGFibGVzLCAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGluY2x1c2lvbik7Ci0JCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGF2YWlsYWJsZXMudmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnZXRBbmNlc3RvckRlY2xhcmF0aW9ucyhFbGVtZW50IHRhcmdldCkgewotCQlWZWN0b3IgYW5jZXN0b3JzID0gbmV3IFZlY3RvcigpOwotCi0JCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlhbmNlc3RvcnMuYWRkKGRlY2wpOwotCi0JCUVsZW1lbnQgcGFyZW50ID0gZ2V0UGFyZW50KHRhcmdldCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJZGVjbCA9IHF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCk7Ci0JCQlpZiAoZGVjbCAhPSBudWxsKQotCQkJCWFuY2VzdG9ycy5hZGQoZGVjbCk7Ci0JCQlwYXJlbnQgPSBnZXRQYXJlbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gYW5jZXN0b3JzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkSW5jbHVzaW9uKEhhc2h0YWJsZSBhdmFpbGFibGVzLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCVN0cmluZyBuYW1lID0gZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCQlpZiAoYXZhaWxhYmxlcy5jb250YWluc0tleShuYW1lKSkKLQkJCXJldHVybjsKLQkJYXZhaWxhYmxlcy5wdXQobmFtZSwgZGVjbCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbiBnYXRoZXJJbmNsdXNpb25zKENvbGxlY3Rpb24gYW5jZXN0b3JzKSB7Ci0JCVZlY3RvciBpbmNsdXNpb25zID0gbmV3IFZlY3RvcigpOwotCQlJdGVyYXRvciBpdGVyID0gYW5jZXN0b3JzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTikpIHsKLQkJCQlDTUNvbnRlbnQgaW5jbHVzaW9uID0gKENNQ29udGVudCkgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklOQ0xVU0lPTik7Ci0JCQkJaWYgKGluY2x1c2lvbiAhPSBudWxsKQotCQkJCQlpbmNsdXNpb25zLmFkZChpbmNsdXNpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbmNsdXNpb25zOwotCX0KLQotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgZ2V0UGFyZW50KE5vZGUgdGFyZ2V0KSB7Ci0JCU5vZGUgcGFyZW50ID0gdGFyZ2V0LmdldFBhcmVudE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuIChFbGVtZW50KSBwYXJlbnQ7Ci0JCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgZXh0cmFjdERlY2xhcmF0aW9ucyhIYXNodGFibGUgYXZhaWxhYmxlcywgQ01Hcm91cCBncm91cCkgewotCQlDTU5vZGVMaXN0IGNvbnRlbnQgPSBncm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlDTU5vZGUgY21uID0gY29udGVudC5pdGVtKGkpOwotCQkJaWYgKGNtbiA9PSBudWxsIHx8IGNtbi5nZXROb2RlVHlwZSgpICE9IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKQotCQkJCWNvbnRpbnVlOwotCQkJYWRkSW5jbHVzaW9uKGF2YWlsYWJsZXMsIChDTUVsZW1lbnREZWNsYXJhdGlvbikgY21uKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc5N2Y1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBpbXBsZW1lbnRzIEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgewotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsYXJhdGlvbiA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKCkgewotCQlyZXR1cm4gdGhpcy5kZWNsYXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUKLQkgKiBhbGxvd3MgaXQgdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2xhcmF0aW9uKSB7Ci0JCXRoaXMuZGVjbGFyYXRpb24gPSBkZWNsYXJhdGlvbjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhMGQ5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5TaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlciB7Ci0KLQkvKioKLQkgKiBAcGFyYW0gbW9kZWxRdWVyeUNNUHJvdmlkZXIgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyCi0JICovCi0JcHVibGljIEhUTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IEhUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcikpOwotCX0KLQotCS8vIE1JV0E6IFdlIGNhbm5vdCBjYWNoZSBhIENNRWxlbWVudERlY2xhcmF0aW9uIGFueSBtb3JlLiAgQmVjYXVzZSwgd2hlbiB0aGUgRE9DVFlQRQotCS8vIHdhcyBjaGFuZ2VkLCBDTURvY3VtZW50IHdvdWxkIGJlIGNoYW5nZWQuICBUaGVuLCBhIGNhY2hlZCBDTUVsZW1lbnREZWNsYXJhdGlvbgotCS8vIHdvdWxkIGJlIGludmFsaWQuICBJZiBzb21lIHBlcmZvcm1hbmNlIHByb2JsZW1zIG9jY3Vycywgd2UgY29uc2lkZXIgYSBzbWFydGVyCi0JLy8gY2FjaGUgbWVjaGFuaXNtLgotCS8vCi0JLy8JcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCS8vCQkvLyBjaGVjayBpZiBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGNhY2hlZAotCS8vCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIGVsZW1lbnQ7Ci0JLy8JCUVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoRWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5jbGFzcyk7Ci0JLy8JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JLy8JCQlyZXR1cm4gYWRhcHRlci5nZXREZWNsYXJhdGlvbigpOwotCS8vCi0JLy8JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBzdXBlci5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkvLwotCS8vCQkvLyBjYWNoZSBIVE1MIGVsZW1lbnQgZGVjbGFyYXRpb24gb25seQotCS8vCQlpZiAoZGVjbCAhPSBudWxsICYmIGRlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JLy8JCQlJQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXJGYWN0b3J5LmdldEluc3RhbmNlKCk7Ci0JLy8JCQlhZGFwdGVyID0gKEVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQobm90aWZpZXIpOwotCS8vCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkvLwkJCQlhZGFwdGVyLnNldERlY2xhcmF0aW9uKGRlY2wpOwotCS8vCQl9Ci0JLy8KLQkvLwkJcmV0dXJuIGRlY2w7Ci0JLy8JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L0hUTUxNb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZTZkM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkhUTUxDTURvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbC5DTURvY1R5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDTURvY3VtZW50IHByb3ZpZGVyIGZvciBIVE1MIGFuZCBYSFRNTCBkb2N1bWVudHMuCi0gKiAKLSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdCB3aWxsCi0gKiBjaGFuZ2UgYXMgdGhpcyBmdW5jdGlvbmFsaXR5IGJlY29tZXMgQVBJLiBTZWUKLSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTkwODQKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Q01Qcm92aWRlciB7Ci0KLQotCXByaXZhdGUgc3RhdGljIENNRG9jdW1lbnQgc3RhdGljSFRNTCA9IEhUTUxDTURvY3VtZW50RmFjdG9yeS5nZXRDTURvY3VtZW50KENNRG9jVHlwZS5IVE1MX0RPQ19UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBDTURvY3VtZW50IHN0YXRpY0NIVE1MID0gSFRNTENNRG9jdW1lbnRGYWN0b3J5LmdldENNRG9jdW1lbnQoQ01Eb2NUeXBlLkNIVE1MX0RPQ19UWVBFKTsKLQlwcml2YXRlIHN0YXRpYyBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgZG9jdHlwZVJlZ2lzdHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JcHJpdmF0ZSBzdGF0aWMgSGFzaHRhYmxlIGJ1ZGR5Q2FjaGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLQlwcml2YXRlIFhIVE1MQXNzb2NpYXRpb25Qcm92aWRlciB4aHRtbGFzc29jID0gbnVsbDsKLQotCXB1YmxpYyBIVE1MTW9kZWxRdWVyeUNNUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXhodG1sYXNzb2MgPSBuZXcgWEhUTUxBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLiBvciBudWxsIGlmIG5vCi0JICogQ01Eb2N1bWVudCBpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIERPTSBOb2RlLgotCSAqLwotCXB1YmxpYyBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSkgewotCQlJRE9NRG9jdW1lbnQgb3duZXIgPSBnZXRPd25lclhNTERvY3VtZW50KG5vZGUpOwotCQlpZiAob3duZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBwaWQgPSBnZXRQdWJsaWNJZChvd25lcik7Ci0JCWlmIChwaWQgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCi0JCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IGRvY3R5cGVSZWdpc3RyeS5nZXRFbnRyeShwaWQpOwotCQlpZiAoZW50cnkgPT0gbnVsbCkKLQkJCXJldHVybiBzdGF0aWNIVE1MOwotCQkKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1MTAwMCAtIHVzZSBpbnRlcm5hbCBjb250ZW50IG1vZGVsCi0JCWlmIChlbnRyeS51c2VJbnRlcm5hbE1vZGVsKCkpIHsKLQkJCWlmIChwaWQgIT0gbnVsbCAmJiBwaWQuZXF1YWxzKEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5DSFRNTF9QVUJMSUNfSUQpKSB7Ci0JCQkJcmV0dXJuIHN0YXRpY0NIVE1MOwotCQkJfQotCQkJcmV0dXJuIHN0YXRpY0hUTUw7Ci0JCX0KLQotCQlwaWQgPSBlbnRyeS5nZXRQdWJsaWNJZCgpOwotCQlTdHJpbmcgc2lkID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQotCQlDTURvY3VtZW50IGR0ZGNtID0geGh0bWxhc3NvYy5nZXRYSFRNTENNRG9jdW1lbnQocGlkLCBzaWQpOwotCQlpZiAoZHRkY20gPT0gbnVsbCkgewotCQkJaWYgKHBpZCAhPSBudWxsICYmIHBpZC5lcXVhbHMoSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LkNIVE1MX1BVQkxJQ19JRCkpIHsKLQkJCQlyZXR1cm4gc3RhdGljQ0hUTUw7Ci0JCQl9Ci0JCQlyZXR1cm4gc3RhdGljSFRNTDsKLQkJfQotCi0JCVN0cmluZyBncmFtbWFyVVJJID0geGh0bWxhc3NvYy5nZXRDYWNoZWRHcmFtbWVyVVJJKCk7Ci0JCUNNRG9jdW1lbnQgYnVkZHljbSA9IChDTURvY3VtZW50KSBidWRkeUNhY2hlLmdldChncmFtbWFyVVJJKTsKLQkJaWYgKGJ1ZGR5Y20gIT0gbnVsbCkKLQkJCXJldHVybiBidWRkeWNtOwotCi0JCWJ1ZGR5Y20gPSBuZXcgQ01Eb2N1bWVudEZvckJ1ZGR5U3lzdGVtKGR0ZGNtLCBlbnRyeS5pc1hNTFR5cGUoKSk7Ci0JCWJ1ZGR5Q2FjaGUucHV0KGdyYW1tYXJVUkksIGJ1ZGR5Y20pOwotCQlyZXR1cm4gYnVkZHljbTsKLQl9Ci0KLQkvLyBwcml2YXRlIG1ldGhvZHMKLQlwcml2YXRlIElET01Eb2N1bWVudCBnZXRPd25lclhNTERvY3VtZW50KE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCURvY3VtZW50IG93bmVyID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChvd25lciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghKG93bmVyIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElET01Eb2N1bWVudCkgb3duZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHVibGljSWQoSURPTURvY3VtZW50IGRvYykgewotCQlpZiAoZG9jID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBkb2MuZ2V0RG9jdHlwZSgpOwotCQlyZXR1cm4gKGRvY3R5cGUgIT0gbnVsbCkgPyBkb2N0eXBlLmdldFB1YmxpY0lkKCkgOiBkb2MuZ2V0RG9jdW1lbnRUeXBlSWQoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvSFRNTE1vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQxZDhkMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9IVE1MTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLk1vZGVsUXVlcnlJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vdmFibGVNb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGFkZGVkIGFuZC9vciBtYWRlIHB1YmxpYyBzcGVjaWZpY2FsbHkgZm9yIGV4cGVyaW1lbnRhdGlvbi4gSXQKLSAqIHdpbGwgY2hhbmdlIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBiZWNvbWVzIEFQSS4gU2VlCi0gKiBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTE5MDg0Ci0gKi8KLSAKLXB1YmxpYyBjbGFzcyBIVE1MTW9kZWxRdWVyeUltcGwgZXh0ZW5kcyBNb2RlbFF1ZXJ5SW1wbCBpbXBsZW1lbnRzIE1vdmFibGVNb2RlbFF1ZXJ5IHsKLQotCXByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgZkNhY2hlID0gbnVsbDsKLQlwcm90ZWN0ZWQgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NQcm92ID0gbnVsbDsKLQotCXB1YmxpYyBIVE1MTW9kZWxRdWVyeUltcGwoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKG5ldyBIVE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoY2FjaGUsIGlkUmVzb2x2ZXIpKTsKLQkJZkNhY2hlID0gY2FjaGU7Ci0JCXhtbEFzc29jUHJvdiA9IG5ldyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcihjYWNoZSwgaWRSZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QXZhaWxhYmxlQ29udGVudChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMpIHsKLQkJTGlzdCBvcmlnaW5hbENhbmRpZGF0ZXMgPSBzdXBlci5nZXRBdmFpbGFibGVDb250ZW50KGVsZW1lbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0JCWlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0NISUxEX05PREVTKSA9PSAwKQotCQkJcmV0dXJuIG9yaWdpbmFsQ2FuZGlkYXRlczsKLQkJLy8gV2hlbiB0aGUgdGFyZ2V0IGRvY3VtZW50IGlzIFhIVE1MLCBpdCBpcyB3YXN0ZSB0byBmaW5kIGluY2x1c2lvbnMsCi0JCS8vIHNpbmNlIGluY2x1c2lvbiBpcyBhdmFpbGFibGUgaW4gSFRNTCBvbmx5LgotCQlpZiAoIWVkLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIG9yaWdpbmFsQ2FuZGlkYXRlczsKLQkJCi0JCUJvb2xlYW4gaXNYaHRtbCA9IEJvb2xlYW4uRkFMU0U7Ci0JCWlzWGh0bWwgPSAoQm9vbGVhbikgZWQuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19YSFRNTCk7Ci0JCWlmIChpc1hodG1sICE9IG51bGwgJiYgaXNYaHRtbC5ib29sZWFuVmFsdWUoKSkKLQkJCXJldHVybiBvcmlnaW5hbENhbmRpZGF0ZXM7Ci0KLQkJLy8gT0ssIHRoZSB0YXJnZXQgaXMgc3VyZWx5IGEgSFRNTCBlbGVtZW50LCBzbyBpdCBtYXkgaGF2ZSBpbmNsdXNpb24uCi0JCS8vIFRyeSB0byBmaW5kIGl0LgotCQlWZWN0b3IgY2FuZGlkYXRlcyA9IG5ldyBWZWN0b3Iob3JpZ2luYWxDYW5kaWRhdGVzKTsKLQotCQlzd2l0Y2ggKGVkLmdldENvbnRlbnRUeXBlKCkpIHsKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZIDoKLQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIDoKLQkJCQkvLyBkbyBlbnVtZXJhdGUgaW5jbHVzaW9ucy4KLQkJCQljYW5kaWRhdGVzLmFkZEFsbChITVFVdGlsLmdldEluY2x1c2lvbnMoZWxlbWVudCkpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSA6Ci0JCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBIDoKLQkJCWRlZmF1bHQgOgotCQkJCS8vIHNob3VsZCBub3QgYWRkIGFueSBpbmNsdXNpb25zLgotCQkJCS8vIHNvLCBub3RoaW5nIHRvIGRvIGhlcmUuCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gSWYgdGhlIGN1cnJlbnQgZWxlbWVudCBkb2VzIG5vdCBhdmFpbGFibGUsIGl0IGlzIGltcG9zc2libGUKLQkJLy8gdG8gZmlsdGVyIG91dCBleGNsdXNpb24uCi0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gY2FuZGlkYXRlczsKLQotCQkvLyBOb3csIHRoZSB0aW1lIHRvIGNoZWNrIGV4Y2x1c2lvbi4KLQkJVmVjdG9yIGNvbnRlbnQgPSBuZXcgVmVjdG9yKGNhbmRpZGF0ZXMuc2l6ZSgpKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5kaWRhdGVzLnNpemUoKTsgaSsrKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjYW5kaWRhdGUgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNhbmRpZGF0ZXMuZWxlbWVudEF0KGkpOwotCQkJaWYgKGNhbmRpZGF0ZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGlzRXhjbHVkZWQoY2FuZGlkYXRlLCBlbGVtZW50KSkKLQkJCQljb250aW51ZTsKLQkJCWNvbnRlbnQuYWRkKGNhbmRpZGF0ZSk7Ci0JCX0KLQotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIE1vdmFibGVNb2RlbFF1ZXJ5I3NldElkUmVzb2x2ZXIoSWRSZXNvbHZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBuZXcgSFRNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGZDYWNoZSwgbmV3SWRSZXNvbHZlcik7Ci0JfQotCi0JLy8gdXRpbGl0aWVzCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0V4Y2x1ZGVkKENNRWxlbWVudERlY2xhcmF0aW9uIGNhbmRpZGF0ZSwgRWxlbWVudCB0YXJnZXQpIHsKLQkJQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZCA9IGdldFByb2hpYml0ZWRBbmNlc3RvcnMoY2FuZGlkYXRlKTsKLQkJaWYgKHByb2hpYml0ZWQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudCBwYXJlbnQgPSB0YXJnZXQ7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ01Ob2RlIHBkZWMgPSBwcm9oaWJpdGVkLmdldE5hbWVkSXRlbShwYXJlbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlpZiAocGRlYyAhPSBudWxsKQotCQkJCXJldHVybiB0cnVlOwotCQkJcGFyZW50ID0gZ2V0RXhwbGljaXRQYXJlbnRFbGVtZW50KHBhcmVudCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgc3RhdGljIENNTmFtZWROb2RlTWFwIGdldFByb2hpYml0ZWRBbmNlc3RvcnMoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjKSB7Ci0JCWlmICghZGVjLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01OYW1lZE5vZGVNYXApIGRlYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlBST0hJQklURURfQU5DRVNUT1JTKTsKLQl9Ci0KLQkvKiBnZXQgYW4gYW5jZXN0b3IgZWxlbWVudCBpZ25vcmluZyBpbXBsaWNpdCBvbmVzLiAqLwotCXByaXZhdGUgc3RhdGljIEVsZW1lbnQgZ2V0RXhwbGljaXRQYXJlbnRFbGVtZW50KE5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIHAgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwICE9IG51bGwpIHsKLQkJCWlmIChwLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlpZiAocCBpbnN0YW5jZW9mIElET01FbGVtZW50KSB7Ci0JCQkJCWlmICgoKElET01FbGVtZW50KSBwKS5pc0ltcGxpY2l0VGFnKCkpIHsKLQkJCQkJCXAgPSBwLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiAoRWxlbWVudCkgcDsKLQkJCX0KLQkJCXAgPSBwLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IHN1cGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQlpZiAobnVsbCAhPSByZXN1bHQpCi0JCQlyZXR1cm4gcmVzdWx0OwotCQkKLQkJcmV0dXJuIHhtbEFzc29jUHJvdi5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjdjMjYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkSFRNTCBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwgewotCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MLgotCSAqLwotCXB1YmxpYyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZEhUTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCBmYWxzZSk7Ci0JfQotCi0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRIVE1MKCk7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgImZvcmNlcyIgYSBuZXcgb25lIHRvIGFsd2F5cyBiZSBjcmVhdGVkL3JldHVybmVkLCBub3QKLQkgKiAiY2FjaGVkIiBvbiB0aGUgbm9kZS4gVGhhdCBzZWVtcyBpbmNvcnJlY3QuIFNpbXBseSB1c2luZwotCSAqIHNob3VsZFJlZ2lzdGVyRmFsc2Ugc2hvdWxkIHdvcmssIGV4Y2VwdCwgdGhlcmUgbWlnaHQgaGF2ZSBiZWVuIG9uZQotCSAqIHRoZXJlIHRoYXQgc29tZW9uZSBlbHNlIGFscmVhZHkgZXhwbGljaXRseSBwdXQgdGhlcmUsIHNvIHRoaXMgaXMgb25seQotCSAqIHdheSBJIGtub3cgdG8gb3ZlcnJpZGUgdGhhdC4gRXNwZWNpYWxseSBjb21wbGljYXRlZCBoZXJlIHNpbmNlIGEgbnVtYmVyCi0JICogb2YgYWRhcHRlcnMgYXJlIGZvciBNb2RlbFF1ZXJ5QWRhcHRlci5jbGFzcy4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgb2JqZWN0KSB7Ci0JCXJldHVybiBhZGFwdE5ldyhvYmplY3QpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWRmNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuWE1MQ2F0YWxvZ0lkUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotLyoqCi0gKiBDcmVhdGVzIGEgTW9kZWxRdWVyeUFkYXB0ZXIgZm9yIEhUTUwgbW9kZWxzCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlNb2RlbFF1ZXJ5QWRhcHRlckltcGwgbW9kZWxRdWVyeUFkYXB0ZXI7Ci0JSVN0cnVjdHVyZWRNb2RlbCBtb2RlbFN0YXRlTm90aWZpZXI7Ci0JcHJpdmF0ZSBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQotCWNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQkvLyBJU1NVRTogc2hvdWxkIHdlICJmcmVlemUiIHN0YXRlLCBvciBhbnl0aGluZz8KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJLy8gSVNTVUU6IHNob3VsZCB3ZSAiZnJlZXplIiBzdGF0ZSwgb3IgYW55dGhpbmc/Ci0KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJLy8gbm90aGluZyB0byBkbz8KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQl1cGRhdGVSZXNvbHZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQkJLy8gbm90aGluZyB0byBkbz8KLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwsCi0JCSAqICAgICAgSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCQltb2RlbFN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJbW9kZWxTdGF0ZU5vdGlmaWVyID0gbmV3TW9kZWw7Ci0JCQl1cGRhdGVSZXNvbHZlcihtb2RlbFN0YXRlTm90aWZpZXIpOwotCQkJbW9kZWxTdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB1cGRhdGVSZXNvbHZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQlJRmlsZSBiYXNlRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkpOwotCQkJaWYgKGJhc2VGaWxlICE9IG51bGwpIHsKLQkJCQliYXNlTG9jYXRpb24gPSBiYXNlRmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQltb2RlbFF1ZXJ5QWRhcHRlci5zZXRJZFJlc29sdmVyKG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG1vZGVsLmdldFJlc29sdmVyKCkpKTsKLQkJfQotCi0JfQotCi0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MIGNvbnN0cnVjdG9yIGNvbW1lbnQuIE5vdGU6IHRoaXMgaXMgYQotCSAqIGNhc2UgdGhlcmUgdGhlIGtleSBpcyBub3QgZXhhY3RseSBzYW1lIGFzIHRoZSBjbGFzcyB3ZSBhcmUgYWZ0ZXIuCi0JICovCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckhUTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBuZWVkIHRoaXMgcHJvdGVjdGVkIHZlcnNpb24gdG8gYWxsb3cgc3ViY2xhc3NlcyB0byBwYXNzIHVwIHN0YW5kYXJkCi0JICogYmVoYXZpb3VyLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyS2V5Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMKLQkgKi8KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0KLQkJcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAobW9kZWxTdGF0ZU5vdGlmaWVyICE9IG51bGwpIHsKLQkJCW1vZGVsU3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIpOwotCQl9Ci0KLQkJbW9kZWxTdGF0ZU5vdGlmaWVyID0gbnVsbDsKLQotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgIT0gbnVsbCkgewotCQkJbW9kZWxRdWVyeUFkYXB0ZXIucmVsZWFzZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKiAKLQkgKiBYWFg6IHdlIG11c3QgbWFrZSB0aGlzIG1ldGhvZCBtb3JlIGluZGVwZW5kZW50IG9mICdsb2NhdGlvbicgKGF0IGxlYXN0Ci0JICogcHJvdmlkZSBzb21lIGZhbGwtYmFjayBtZXRob2QpLgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCi0JCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbykgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTC5jcmVhdGVBZGFwdGVyIiArIHRhcmdldCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXIgPT0gbnVsbCkgewotCQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJSURPTU5vZGUgeG1sTm9kZSA9IChJRE9NTm9kZSkgdGFyZ2V0OwotCQkJCW1vZGVsU3RhdGVOb3RpZmllciA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQltb2RlbFN0YXRlTm90aWZpZXIuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCi0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHhtbE5vZGUuZ2V0TW9kZWwoKTsKLQkJCQlTdHJpbmcgYmFzZUxvY2F0aW9uID0gbnVsbDsKLQkJCQlTdHJpbmcgbW9kZWxzQmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJaWYgKG1vZGVsc0Jhc2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUZpbGUgZmlsZSA9IG5ldyBQYXRoKG1vZGVsc0Jhc2VMb2NhdGlvbikudG9GaWxlKCk7Ci0JCQkJCWlmIChmaWxlLmV4aXN0cygpKSB7Ci0JCQkJCQliYXNlTG9jYXRpb24gPSBmaWxlLmdldEFic29sdXRlUGF0aCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCQkJCQlJUGF0aCBkZXJpdmVkUGF0aCA9IG51bGw7Ci0JCQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKQotCQkJCQkJCWRlcml2ZWRQYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGJhc2VQYXRoKS5nZXRMb2NhdGlvbigpOwotCQkJCQkJZWxzZQotCQkJCQkJCWRlcml2ZWRQYXRoID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChiYXNlUGF0aCk7Ci0JCQkJCQlpZiAoZGVyaXZlZFBhdGggIT0gbnVsbCkgewotCQkJCQkJCWJhc2VMb2NhdGlvbiA9IGRlcml2ZWRQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS1Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JIVE1MLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyBiYXNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCQlDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlID0gbmV3IENNRG9jdW1lbnRDYWNoZSgpOwotCQkJCVVSSVJlc29sdmVyIGlkUmVzb2x2ZXIgPSBudWxsOwotCi0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCB8fCByZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IG5ldyBIVE1MTW9kZWxRdWVyeUltcGwoY21Eb2N1bWVudENhY2hlLCBpZFJlc29sdmVyKTsKLQkJCQltb2RlbFF1ZXJ5LnNldEVkaXRNb2RlKE1vZGVsUXVlcnkuRURJVF9NT0RFX1VOQ09OU1RSQUlORUQpOwotCQkJCW1vZGVsUXVlcnlBZGFwdGVyID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVySW1wbChjbURvY3VtZW50Q2FjaGUsIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlcjsKLQl9Ci0KLQotCi0JcHJpdmF0ZSBmaW5hbCBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBnZXRJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcigpIHsKLQkJaWYgKGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID0gbmV3IEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hIVE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTUwZWYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hIVE1MQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLlhNTEFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLQotLyoqCi0gKiBBIENsYXNzIHRvIHByb3ZpZGUgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBYSFRNTCBkb2N1bWVudHMgYW5kIERURHMgZm9yCi0gKiBYSFRNTC4gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIG9ubHkgaW4gSFRNTE1vZGVsUXVlcnlDTVByb3ZpZGVyLgotICovCi0vKgotICogVGhpcyBjbGFzcyBjbG9zZWx5IHJlc2VtYmxlIFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLgotICovCi1jbGFzcyBYSFRNTEFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBYTUxBc3NvY2lhdGlvblByb3ZpZGVyIHsKLQotCS8qKgotCSAqIHNldCBVU0VfUVVJQ0tfQ0FDSEUgdG8gZmFsc2UgdG8gdGVzdCBlZmZlY3RzIG9mIG5vdCBjYWNoaW5nIGF0IGFsbC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFVTRV9RVUlDS19DQUNIRSA9IHRydWU7Ci0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZEdyYW1tZXJVUkk7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNhY2hlZFB1YmxpY0lEOwotCXByaXZhdGUgU3RyaW5nIGZDYWNoZWRTeXN0ZW1JRDsKLQlwcml2YXRlIGJvb2xlYW4gY2FjaGVkOwotCi0JcHVibGljIFhIVE1MQXNzb2NpYXRpb25Qcm92aWRlcihDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIoY2FjaGUpOwotCQl0aGlzLmlkUmVzb2x2ZXIgPSBpZFJlc29sdmVyOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRYSFRNTENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaWYgKGlkUmVzb2x2ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgZ3JhbW1lclVSSSA9IG51bGw7Ci0JCWlmIChVU0VfUVVJQ0tfQ0FDSEUpIHsKLQkJCS8qCi0JCQkgKiBJbiBwYXJzaW5nIGEgZG9jdW1lbnQsIHdlIGdldCBtYW55IGlkZW50aWNhbCByZXF1ZXN0cyB0byB0aGlzCi0JCQkgKiBtZXRob2QsIHNvIGluc3RlYWQgb2YgbG9va2luZyB1cCAocmVzb2x2aW5nKSBncmFtbWVyVVJJIGVhY2gKLQkJCSAqIHRpbWUsIHdlJ2xsIGp1c3QgcmV0dXJuIHByZXZpb3VzbHkgY2FjaGVkIG9uZS4gUHJvYmFibHkgbm90Ci0JCQkgKiB3b3J0aCBoYXZlIGEgbW9yZSBjb21wbGV4IGNhY2hlIHRoYW4gdGhhdC4KLQkJCSAqLwotCQkJaWYgKGNhY2hlZCAmJiBzYW1lQXMoZkNhY2hlZFB1YmxpY0lELCBwdWJsaWNJZCkgJiYgc2FtZUFzKGZDYWNoZWRTeXN0ZW1JRCwgc3lzdGVtSWQpKSB7Ci0JCQkJZ3JhbW1lclVSSSA9IGZDYWNoZWRHcmFtbWVyVVJJOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZ3JhbW1lclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQkJCWZDYWNoZWRHcmFtbWVyVVJJID0gZ3JhbW1lclVSSTsKLQkJCQlmQ2FjaGVkUHVibGljSUQgPSBwdWJsaWNJZDsKLQkJCQlmQ2FjaGVkU3lzdGVtSUQgPSBzeXN0ZW1JZDsKLQkJCQljYWNoZWQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJZ3JhbW1lclVSSSA9IGlkUmVzb2x2ZXIucmVzb2x2ZShudWxsLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQl9Ci0KLQkJaWYgKGdyYW1tZXJVUkkgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8qCi0JCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD04ODg5NgotCQkgKiAKLQkJICogV2Ugb25jZSBjYWxsZWQgdGhlIGRlcHJlY2F0ZWQgMiBhcmd1bWVudCBmb3JtIG9mIGdldENNRG9jdW1lbnQuCi0JCSAqIAotCQkgKiBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwKLQkJICogZ3JhbW1lclVSSSk7Ci0JCSAqIAotCQkgKiB3aGljaCBldmVudHVhbGx5IHJlc3VsdGVkIGluIGVtcHR5IHN0cmluZyBmb3IgdHlwZSwgd2hpY2ggSSBkb24ndAotCQkgKiB0aGluayB0aGUgaW5mcmFzdHJ1Y3R1cmUgaGFuZGxlcyBhbnkgbG9uZ2VyLiBTbywgSSBkZWxldGVkCi0JCSAqIGRlcHJlY2F0ZWQgbWV0aG9kcywgYW5kIHN3aXRjaGVkIHRvIG51bGwgZm9yIHR5cGUgYXJndW1lbnQuCi0JCSAqIAotCQkgKiAnbnVsbCcgbWVhbnMgdG8gImNyZWF0ZSBiYXNlZCBvbiB1cmkiLgotCQkgKiAKLQkJICogRllJLCAnZHRkJyB3b3VsZCBtZWFuIGxvYWQgb25seSB0aG9zZSByZWdpc3RlcmVkIGFzIGR0ZCdzCi0JCSAqIAotCQkgKiBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwKLQkJICogZ3JhbW1lclVSSSk7IENNRG9jdW1lbnQgY21Eb2N1bWVudCA9Ci0JCSAqIGRvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50KHB1YmxpY0lkLCBncmFtbWVyVVJJLCAiZHRkIik7Ci0JCSAqLwotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgZ3JhbW1lclVSSSwgbnVsbCk7Ci0JCXJldHVybiBjbURvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXJldHVybiBpZFJlc29sdmVyLnJlc29sdmUobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2FtZUFzKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoYSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBiID09IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBhLmVxdWFscyhiKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWRkZWQgYW5kL29yIG1hZGUgcHVibGljIHNwZWNpZmljYWxseSBmb3IgZXhwZXJpbWVudGF0aW9uLiBJdAotCSAqIHdpbGwgY2hhbmdlIGFzIHRoaXMgZnVuY3Rpb25hbGl0eSBiZWNvbWVzIEFQSS4gU2VlCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA4NAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2FjaGVkR3JhbW1lclVSSSgpIHsKLQkJcmV0dXJuIGZDYWNoZWRHcmFtbWVyVVJJOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDIxY2M3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBIVE1MIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBub2RlID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpKTsKLQotCQkvLyBmb3JtYXR0aW5nIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFSX0FMTF9CTEFOS19MSU5FUywgZmFsc2UpOwotCQlub2RlLnB1dChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFLCAxKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTLCBmYWxzZSk7Ci0KLQkJLy8gY2xlYW51cCBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFTSVMpOwotCQlub2RlLnB1dEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0FUVFJfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BU0lTKTsKLQkJLy8gbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUywKLQkJLy8gdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMsIHRydWUpOwotCQlub2RlLnB1dEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5GT1JNQVRfU09VUkNFLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmYWxzZSk7Ci0KLQkJLy8gY29kZSBnZW5lcmF0aW9uIHByZWZlcmVuY2VzCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZGVmYXVsdEVuYyA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3lzdGVtRW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN5c3RlbUVuYyAhPSBudWxsKSB7Ci0JCQlkZWZhdWx0RW5jID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldFByZWZlcnJlZERlZmF1bHRJYW5hTmFtZShzeXN0ZW1FbmMsICJVVEYtOCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlub2RlLnB1dChDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZGVmYXVsdEVuYyk7Ci0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCW5vZGUucHV0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJbm9kZS5wdXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQkvLyB0aGlzIGNvdWxkIGJlIG1hZGUgc21hcnRlciBieSBhY3R1YWxseSBsb29raW5nIHVwIHRoZSBjb250ZW50Ci0JCS8vIHR5cGUncyB2YWxpZCBleHRlbnNpb25zCi0JCW5vZGUucHV0KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCAiaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA2NzgzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQ29tbW9uIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IEhUTUwgY29yZQotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzIHsKLQlwcml2YXRlIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEhUTUwKLQkgKiBGaWxlIFdpemFyZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfRVhURU5TSU9OID0gImRlZmF1bHRFeHRlbnNpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSB3aWR0aCBvZiBhIGxpbmUgYmVmb3JlIGEgbGluZSBzcGxpdCBpcyBuZWVkZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgYmxhbmtzIGxpbmVzIHNob3VsZCBiZSBjbGVhcmVkIGR1cmluZyBmb3JtYXR0aW5nLgotCSAqIEJsYW5rIGxpbmVzIHdpbGwgYmUga2VwdCB3aGVuIGZhbHNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgI0lOREVOVEFUSU9OX0NIQVIgZm9yIDEgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fU0laRSA9ICJpbmRlbnRhdGlvblNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RBQiwgU1BBQ0V9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX0NIQVIgPSAiaW5kZW50YXRpb25DaGFyIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiB0YWIgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNTUEFDRQotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAidGFiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogc3BhY2UgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNUQUIKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAic3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGFncyB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZAotCSAqIChzcGxpdHRpbmcgZWFjaCBhdHRyIG9uIGEgbmV3IGxpbmUpLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTElUX01VTFRJX0FUVFJTID0gInNwbGl0TXVsdGlBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGNsZWFudXAgcHJvY2Vzc29yIHNob3VsZCBmb3JtYXQgc291cmNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZW1wdHkgZWxlbWVudHMgc2hvdWxkIGJlIGNvbXByZXNzZWQgZHVyaW5nCi0JICogY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MgPSAiY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX1JFUVVJUkVEX0FUVFJTID0gImluc2VydFJlcXVpcmVkQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgbWlzc2luZyB0YWdzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IGFsbCBsaW5lIGRlbGltaXRlcnMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGxpbmUgZGVsaW1pdGVyIHRvIHVzZSBkdXJpbmcgY2xlYW51cCBpZiBjb252ZXJ0aW5nIGxpbmUKLQkgKiBkZWxpbWl0ZXJzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtDUiwgQ1JMRiwgTEYsIE5PX1RSQU5TTEFUSU9OfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgY2FzZSB0byB1c2Ugb24gYWxsIHRhZyBuYW1lcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkludGVnZXI8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge0xPV0VSLCBVUFBFUiwgQVNJU30KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9UQUdfTkFNRV9DQVNFID0gImNsZWFudXBUYWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIGNhc2UgdG8gdXNlIG9uIGFsbCBhdHRyaWJ1dGUgbmFtZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtMT1dFUiwgVVBQRVIsIEFTSVN9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfQVRUUl9OQU1FX0NBU0UgPSAiY2xlYW51cEF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUHJlZmVycmVkIG1hcmt1cCBjYXNlIGZvciB0YWcgbmFtZXMgaW4gY29kZSBnZW5lcmF0aW9uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtMT1dFUiwgVVBQRVJ9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FX0NBU0UgPSAidGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFByZWZlcnJlZCBtYXJrdXAgY2FzZSBmb3IgYXR0cmlidXRlIG5hbWVzIGluIGNvZGUgZ2VuZXJhdGlvbgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+SW50ZWdlcjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7TE9XRVIsIFVQUEVSfQotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX05BTUVfQ0FTRSA9ICJhdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFBvc3NpYmxlIHZhbHVlIGZvciB0aGUgcHJlZmVyZW5jZSAjVEFHX05BTUVfQ0FTRSBvciAjQVRUUl9OQU1FX0NBU0UuCi0JICogSW5kaWNhdGVzIHRvIGxlYXZlIGNhc2UgYXMgaXMuCi0JICogCi0JICogQHNlZSAjTE9XRVIKLQkgKiBAc2VlICNVUFBFUgotCSAqIEBzZWUgI1RBR19OQU1FX0NBU0UKLQkgKiBAc2VlICNBVFRSX05BTUVfQ0FTRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFTSVMgPSAwOwotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNUQUdfTkFNRV9DQVNFIG9yICNBVFRSX05BTUVfQ0FTRS4KLQkgKiBJbmRpY2F0ZXMgdG8gbWFrZSBuYW1lIGxvd2VyY2FzZS4KLQkgKiAKLQkgKiBAc2VlICNBU0lTCi0JICogQHNlZSAjVVBQRVIKLQkgKiBAc2VlICNUQUdfTkFNRV9DQVNFCi0JICogQHNlZSAjQVRUUl9OQU1FX0NBU0UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMT1dFUiA9IDE7Ci0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI1RBR19OQU1FX0NBU0Ugb3IgI0FUVFJfTkFNRV9DQVNFLgotCSAqIEluZGljYXRlcyB0byBtYWtlIG5hbWUgdXBwZXJjYXNlLgotCSAqIAotCSAqIEBzZWUgI0xPV0VSCi0JICogQHNlZSAjQVNJUwotCSAqIEBzZWUgI1RBR19OQU1FX0NBU0UKLQkgKiBAc2VlICNBVFRSX05BTUVfQ0FTRQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQUEVSID0gMjsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MNDBOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MNDBOYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM5NDRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTDQwTmFtZXNwYWNlLmphdmEKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTENNUHJvcGVydGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxDTVByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5NmNkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTENNUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0vKioKLSAqIEhUTUxDTVByb3BlcnRpZXMgZGVmaW5lcyBhbGwgcHJvcGVydHkgbmFtZXMgYW5kIHByZS1kZWZpbmVkIHZhbHVlcyBpbiBIVE1MIENNLgotICogQWxsIG9mIHRob3NlIHByb3BlcnRpZXMgY2FuIGJlIHJldHJlaXZlZCBmcm9tIGVsZW1lbnQgZGVjbGFyYXRpb25zIG9mIEhUTUwgQ00KLSAqIHZpYSBDTU5vZGUjZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BOYW1lKS4KLSAqLwotcHVibGljIGludGVyZmFjZSBIVE1MQ01Qcm9wZXJ0aWVzIHsKLQotCS8qKgotCSAqICJzaG91bGRJZ25vcmVDYXNlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSE9VTERfSUdOT1JFX0NBU0UgPSAic2hvdWxkSWdub3JlQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJzaG91bGRLZWVwU3BhY2UiIHJldHVybnMgamF2YS5sYW5nLkJvb2xlYW4gb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1VMRF9LRUVQX1NQQUNFID0gInNob3VsZEtlZXBTcGFjZSI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpbmRlbnRDaGlsZFNvdXJjZSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0hPVUxEX0lOREVOVF9DSElMRF9TT1VSQ0UgPSAic2hvdWxkSW5kZW50Q2hpbGRTb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAidGVybWluYXRvcnMiIHJldHVybnMgamF2YS51dGlsLkl0ZXJhdG9yIChhbiBhcnJheSBvZiBTdHJpbmcgb2JqZWN0cykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVSTUlOQVRPUlMgPSAidGVybWluYXRvcnMiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiY29udGVudEhpbnQiIHJldHVybnMgQ01FbGVtZW50RGVjbGFyYXRpb24gaW5zdG5hY2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9ISU5UID0gImNvbnRlbnRIaW50IjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogInByb2hpYml0ZWRBbmNlc3RvcnMiIHJldHVybnMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9ISUJJVEVEX0FOQ0VTVE9SUyA9ICJwcm9oaWJpdGVkQW5jZXN0b3JzIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImlzSlNQIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19KU1AgPSAiaXNKU1AiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNYSFRNTCIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfWEhUTUwgPSAiaXNYSFRNTCI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJpc1NTSSIgcmV0dXJucyBqYXZhLmxhbmcuQm9vbGVhbiBvYmplY3QuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNfU1NJID0gImlzU1NJIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogImxpbmVCcmVha0hpbnQiIHJldHVybnMgU3RyaW5nIChvbmUgb2YgcHJlLWRlZmluZWQgdmFsdWVzIGluIFZhbHVlcykuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9CUkVBS19ISU5UID0gImxpbmVCcmVha0hpbnQiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAibGF5b3V0VHlwZSIgcmV0dXJucyBTdHJpbmcgKG9uZSBvZiBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gVmFsdWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfVFlQRSA9ICJsYXlvdXRUeXBlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogInRhZ0luZm8iIHJldHVybnMgU3RyaW5nIChkb2N1bWVudGF0aW9uIGZvciB0aGlzIGVsZW1lbnQpLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR0lORk8gPSAidGFnSW5mbyI7Ly8kTk9OLU5MUy0xJAotCS8qKgotCSAqICJvbWl0VHlwZSIgcmV0dXJucyBTdHJpbmcgKG9uZSBvZiBwcmUtZGVmaW5lZCB2YWx1ZXMgaW4gVmFsdWVzKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUX1RZUEUgPSAib21pdFR5cGUiOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaW5jbHVzaW9uIiByZXR1cm5zIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOQ0xVU0lPTiA9ICJpbmNsdXNpb24iOy8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiAiaXNTY3JpcHRhYmxlIiByZXR1cm5zIGphdmEubGFuZy5Cb29sZWFuIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJU19TQ1JJUFRBQkxFID0gImlzU2NyaXB0YWJsZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbHVlcyB7Ci0JCS8qCi0JCSAqIGZvciBMSU5FX0JSRUFLX0hJTlQgPSAibGluZUJyZWFrSGludCIuCi0JCSAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkVBS19OT05FID0gImJyZWFrTm9uZSI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCUkVBS19BRlRFUl9TVEFSVCA9ICJicmVha0FmdGVyU3RhcnQiOy8vJE5PTi1OTFMtMSQKLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlJFQUtfQkVGT1JFX1NUQVJUX0FORF9BRlRFUl9FTkQgPSAiYnJlYWtCZWZvcmVTdGFydEFuZEFmdGVyRW5kIjsvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIGZvciBMQVlPVVRfVFlQRSA9ICJsYXlvdXRUeXBlIgotCQkgKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFZT1VUX0JMT0NLID0gImxheW91dEJsb2NrIjsvLyROT04tTkxTLTEkCi0JCS8qKiBCUiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfQlJFQUsgPSAibGF5b3V0QnJlYWsiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIEhpZGRlbiBvYmplY3Q7IGxpa2UgSFRNTCBvciBIRUFEICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9ISURERU4gPSAibGF5b3V0SGlkZGVuIjsvLyROT04tTkxTLTEkCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExBWU9VVF9OT05FID0gImxheW91dE5vbmUiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIE5vIHdyYXAgb2JqZWN0OyBsaWtlIElNRywgQVBQTEVULC4uLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfT0JKRUNUID0gImxheW91dE9iamVjdCI7Ly8kTk9OLU5MUy0xJAotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVlPVVRfV1JBUCA9ICJsYXlvdXRXcmFwIjsvLyROT04tTkxTLTEkCi0JCS8qCi0JCSAqIGZvciBPTUlUX1RZUEUgPSAib21pdFR5cGUiCi0JCSAqLwotCQkvKiogTm90IG9tbWlzaWJsZS4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9OT05FID0gIm9taXROb25lIjsvLyROT04tTkxTLTEkCi0JCS8qKiBCb3RoIHRhZ3MgYXJlIG9tbWlzaWJsZS4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9CT1RIID0gIm9taXRCb3RoIjsvLyROT04tTkxTLTEkCi0JCS8qKiBUaGUgZW5kIHRhZyBpcyBvbW1pc2libGUuICovCi0JCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9NSVRfRU5EID0gIm9taXRFbmQiOy8vJE5PTi1OTFMtMSQKLQkJLyoqIFRoZSBlbmQgdGFnIGlzIG9tbWl0dGVkIHdoZW4gY3JlYXRlZC4gKi8KLQkJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT01JVF9FTkRfREVGQVVMVCA9ICJvbWl0RW5kRGVmYXVsdCI7Ly8kTk9OLU5MUy0xJAotCQkvKiogVGhlIGVuZCB0YWcgbXVzdCBiZSBvbWl0dGVkLiAqLwotCQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBPTUlUX0VORF9NVVNUID0gIm9taXRFbmRNdXN0IjsvLyROT04tTkxTLTEkCi0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGaWxlc1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTJiNGVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9IVE1MRmlsZXNQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZHVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgbm90IHVzZWQgaW4gV1RQCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSFRNTEZpbGVzUHJlZmVyZW5jZU5hbWVzIHsKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9TVUZGSVggPSAiZGVmYXVsdFN1ZmZpeCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9TVUZGSVggPSAiaHRtbCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfRE9DVU1FTlRfVFlQRSA9ICJnZW5lcmF0ZURvY3VtZW50VHlwZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgR0VORVJBVEVfR0VORVJBVE9SID0gImdlbmVyYXRlR2VuZXJhdG9yIjsvLyROT04tTkxTLTEkCi0JLy8gYWRkZWQgdGhpcyBhcyBhIHBvdGVudGlhbCB3YXkgdG8gaGFuZGxlIGNoYW5naW5nCi0JLy8gcHJvZHVjdCBuYW1lcyAidXAiIHRoZSBzdGFjay4gTm90ZSwgbm90IGRlY2xhcmVkIGZpbmFsIAotCS8vIHRvIGF2b2lkIGdldHRpbmcgJ2lubGluZWQnIGJ5IGNvbXBpbGVyLgotCXN0YXRpYyBJUHJvZHVjdCBwcm9kdWN0ID0gUGxhdGZvcm0uZ2V0UHJvZHVjdCgpOwotCS8vIFBsYXRmb3JtLmdldFByb2R1Y3QoKSBpcyBzcGVjJ2Qgc28gaXQgbWlnaHQgcmV0dXJuIG51bGwuCi0JLy8gSXRzIGV4cGVjdGVkIGZvciBhbnkgZmluYWwgcHJvZHVjdCBpdCB3b3VsZCBub3QgYmUsIHNvIHdlJ2xsIHJldHVybiAKLQkvLyAiV1RQIiBmb3IgZGV2ZWxvcG1lbnQvaW50ZXJpbSBidWlsZHMuIE5vIG5lZWQgdG8gdHJhbnNsYXRlLiAKLQlzdGF0aWMgU3RyaW5nIEdFTkVSQVRPUiA9IChwcm9kdWN0ID09IG51bGwpID8gIldUUCI6IHByb2R1Y3QuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0hUTUxGb3JtYXRDb250cmFpbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTEZvcm1hdENvbnRyYWludHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRjZGU5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSFRNTEZvcm1hdENvbnRyYWludHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotCi0vKioKLSAqIEBkZXByZWNhdGVkCi0gKiBQbGVhc2UgdW4tZGVwcmVjYXRlIHRoaXMgaWYgUGFnZSBEZXNpZ25lciB0aGlua3MgdGhleSBhcmUgbmVlZGVkLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEhUTUxGb3JtYXRDb250cmFpbnRzIGV4dGVuZHMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQkvKioKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAlJdCdzIHZlcnkgaGFyZCB0byBrZWVwIHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBhY2N1cmF0ZS4KLQkgKiAJU29tZXRpbWVzIGEgbm9kZSB3YW50cyB0byBzdGFydCBvbiBhIG5ldyBsaW5lLCBzb21ldGltZXMgaXQgZG9lc24ndC4KLQkgKiAJSXQncyBiZXN0IGZvciB0aGUgbm9kZSB0byBmaWd1cmUgb3V0IHRoZSBhdmFpbGFibGUgbGluZSB3aWR0aCBvbiB0aGUgZmx5LgotCSAqLwotCWludCBnZXRBdmFpbGFibGVMaW5lV2lkdGgoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICogCUl0J3MgdmVyeSBoYXJkIHRvIGtlZXAgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIGFjY3VyYXRlLgotCSAqIAlTb21ldGltZXMgYSBub2RlIHdhbnRzIHRvIHN0YXJ0IG9uIGEgbmV3IGxpbmUsIHNvbWV0aW1lcyBpdCBkb2Vzbid0LgotCSAqIAlJdCdzIGJlc3QgZm9yIHRoZSBub2RlIHRvIGZpZ3VyZSBvdXQgdGhlIGF2YWlsYWJsZSBsaW5lIHdpZHRoIG9uIHRoZSBmbHkuCi0JICovCi0Jdm9pZCBzZXRBdmFpbGFibGVMaW5lV2lkdGgoaW50IGF2YWlsYWJsZUxpbmVXaWR0aCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzBjMjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9QcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFByZWZlcmVuY2VOYW1lcyB7Ci0KLQlTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWUVTID0gInllcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTk8gPSAibm8iOyAvLyROT04tTkxTLTEkCi0KLQotCVN0cmluZyBTRVRUSU5HUyA9ICJzZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBUUkVFVklFVyA9ICJ0cmVldmlldyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgREVGQVVMVF9ERVBUSCA9ICJkZWZhdWx0ZGVwdGgiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgQVNJUyA9ICJhcy1pcyI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTE9XRVIgPSAibG93ZXIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVQUEVSID0gInVwcGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFBSRUZFUlJFRF9DQVNFID0gInByZWZlcnJlZC1jYXNlIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQUdOQU1FID0gInRhZ25hbWUiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIEFUVFJJQlVURU5BTUUgPSAiYXR0cmlidXRlbmFtZSI7IC8vJE5PTi1OTFMtMSQKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUZhbWlseUZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUZhbWlseUZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVmMTdmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVGYW1pbHlGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0IHByb3RlY3RlZAotICogbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlRmFtaWx5Rm9ySFRNTCB7Ci0JLyoqCi0JICogVGhlIHZhbHVlIG9mIHRoZSBjb250ZW50dHlwZSBpZCBmaWVsZCBtdXN0IG1hdGNoIHdoYXQgaXMgc3BlY2lmaWVkIGluCi0JICogcGx1Z2luLnhtbCBmaWxlLiBOb3RlOiB0aGlzIHZhbHVlIGlzIGludGVudGlhbGx5IG5vdCBkZWNsYXJlZCBhcyBmaW5hbCwKLQkgKiBzbyBpdCB3aWxsIG5vdCBiZSBpbmxpbmVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUxfRkFNSUxZID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUZhbWlseUZvckhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZygpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmNvbnRlbnRmYW1pbHkuaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMTMwNGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnR0eXBlL0NvbnRlbnRUeXBlSWRGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZTsKLQotLyoqCi0gKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLSAqIHBsdWdpbi54bWwgZmlsZS4gTm90ZTogdGhpcyB2YWx1ZSBpcyBpbnRlbnRpYWxseSBzZXQgd2l0aCBkZWZhdWx0IHByb3RlY3RlZAotICogbWV0aG9kIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JIVE1MIHsKLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgbm90IGRlY2xhcmVkIGFzIGZpbmFsLAotCSAqIHNvIGl0IHdpbGwgbm90IGJlIGlubGluZWQuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ29udGVudFR5cGVJRF9IVE1MID0gZ2V0Q29uc3RhbnRTdHJpbmcoKTsKLQotCS8qKgotCSAqIERvbid0IGFsbG93IGluc3RhbnRpYXRpb24uCi0JICovCi0JcHJpdmF0ZSBDb250ZW50VHlwZUlkRm9ySFRNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lIVE1MUGFydGl0aW9uVHlwZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lIVE1MUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZhODgyMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JSFRNTFBhcnRpdGlvblR5cGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZC4gSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uCi0gKiB0eXBlcyBmb3IgSFRNTC4gQ2xpZW50cyBzaG91bGQgcmVmZXJlbmNlIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmdzIGRlZmluZWQKLSAqIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRleHQuSUhUTUxQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhUTUxQYXJ0aXRpb25UeXBlcyB7Ci0KLQlTdHJpbmcgSFRNTF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9ERUNMQVJBVElPTiA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBIVE1MX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFNDUklQVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUWUxFID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSVNTVUU6IEkgdGhpbmsgbWV0YSB0YWcgYXJlYXMgYXJlIGhlcmUgdG9vPwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjOTNkNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnBhcnNlci5Gb3JlaWduUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLklTdHJ1Y3R1cmVkVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU2NyaXB0TGFuZ3VhZ2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzLlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUw7Ci0KLS8qKgotICogRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIEhUTUwuIENsaWVudC1zaWRlIHNjcmlwdHMgb2YgdHlwZSBKYXZhU2NyaXB0IGFyZQotICogcmVwb3J0ZWQgYXMgU1RfU0NSSVBULCBhbGwgb3RoZXJzIGZvciA8c2NyaXB0IGxhbmd1YWdlPSJmb28iIHR5cGU9ImZvbzIiPgotICogYXMgU0NSSVBULmxhbmd1YWdlOkZPTyBhbmQgU0NSSVBULnR5cGU6Rk9PMi4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04sIElIVE1MUGFydGl0aW9ucy5IVE1MX0NPTU1FTlQsIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIElDU1NQYXJ0aXRpb25zLlNUWUxFfTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFTQ1JJUFQgPSAiamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVZBU0NSSVBUX0FQUExJQ0FUSU9OID0gImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9ySFRNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBzdHlwZSA9IGdldFNjcmlwdGluZ1BhcnRpdGlvblR5cGUobm9kZSk7Ci0JCQkJcmV0dXJuIHN1cGVyLmNyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgc3R5cGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVQYXJ0aXRpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCVN0cmluZyBsb2NhbFR5cGUgPSB0eXBlOwotCQlpZiAodHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbG9jYWxUeXBlID0gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShub2RlKTsKLQkJCX0KLQkJfQotCQlzdXBlci5zZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgbG9jYWxUeXBlKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTY3JpcHRpbmdQYXJ0aXRpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29yZU5vZGUpIHsKLQkJU3RyaW5nIGxhbmd1YWdlID0gbnVsbDsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gY29yZU5vZGU7Ci0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gbnVsbDsKLQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBpc1ZhbGlkU2NyaXB0aW5nUmVnaW9uVHlwZShub2RlLmdldFR5cGUoKSkpIHsKLQkJCW5vZGUgPSBub2RlLmdldFByZXZpb3VzKCk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPiA0ICYmIHJlZ2lvbnMuZ2V0KDEpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJSVRleHRSZWdpb24gcG90ZW50aWFsTGFuZ3VhZ2VSZWdpb24gPSByZWdpb25zLmdldCgxKTsKLQkJCVN0cmluZyBwb3RlbnRpYWxMYW5ndWFnZVN0cmluZyA9IG5vZGUuZ2V0VGV4dChwb3RlbnRpYWxMYW5ndWFnZVJlZ2lvbik7Ci0JCQlpZiAocG90ZW50aWFsTGFuZ3VhZ2VTdHJpbmcuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU0NSSVBUKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJCQlhdHRyTmFtZVJlZ2lvbiA9IHJlZ2lvbjsKLQkJCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBub2RlLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCQkJCQkJaWYgKGF0dHJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkFUVFJfTkFNRV9MQU5HVUFHRSkpCi0JCQkJCQkJbGFuZ3VhZ2UgPSBTdHJpbmdVdGlscy5zdHJpcChub2RlLmdldFRleHQocmVnaW9uKSk7Ci0JCQkJCQllbHNlIGlmIChhdHRyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5BVFRSX05BTUVfVFlQRSkpIHsKLQkJCQkJCQl0eXBlID0gU3RyaW5nVXRpbHMuc3RyaXAobm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJYXR0ck5hbWVSZWdpb24gPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0eXBlICE9IG51bGwpCi0JCQlyZXN1bHQgPSBsb29rdXBTY3JpcHRUeXBlKHR5cGUpOwotCQllbHNlIGlmIChsYW5ndWFnZSAhPSBudWxsKQotCQkJcmVzdWx0ID0gbG9va3VwU2NyaXB0TGFuZ3VhZ2UobGFuZ3VhZ2UpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkU2NyaXB0aW5nUmVnaW9uVHlwZShTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGxvb2t1cFNjcmlwdFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZU1tpXS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKQotCQkJCXJldHVybiBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUOwotCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCArICIudHlwZS4iICsgdHlwZS50b1VwcGVyQ2FzZShMb2NhbGUuRU5HTElTSCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBsb29rdXBTY3JpcHRMYW5ndWFnZShTdHJpbmcgbGFuZ3VhZ2UpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTLmxlbmd0aDsgaSsrKQotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZShsYW5ndWFnZSkpCi0JCQkJcmV0dXJuIElIVE1MUGFydGl0aW9ucy5TQ1JJUFQ7Ci0JCXJldHVybiBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUICsgIi5sYW5ndWFnZS4iICsgbGFuZ3VhZ2UudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVDsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OIHx8IHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fT1BFTikKLQkJCXJlc3VsdCA9IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFQ0xBUkFUSU9OOwotCQllbHNlCi0JCQlyZXN1bHQgPSBzdXBlci5nZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNOb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHROb2RlKSB7Ci0JCQotCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG5leHRFbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCi0JCUlUZXh0UmVnaW9uW10gcmVnaW9ucyA9IHByZXZpb3VzTm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJcHJldmlvdXNTdGFydFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJlZ2lvbnMgPSBuZXh0Tm9kZS5nZXRSZWdpb25zKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmKHJlZ2lvbnNbaV0uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKSB7Ci0JCQkJbmV4dEVuZFRhZ05hbWVSZWdpb24gPSByZWdpb25zW2ldOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCQotCQlpZihwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBudWxsIHx8IG5leHRFbmRUYWdOYW1lUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDsKLQkJCi0JCVN0cmluZyBuYW1lMSA9IHByZXZpb3VzTm9kZS5nZXRUZXh0KHByZXZpb3VzU3RhcnRUYWdOYW1lUmVnaW9uKTsKLQkJU3RyaW5nIG5hbWUyID0gbmV4dE5vZGUuZ2V0VGV4dChuZXh0RW5kVGFnTmFtZVJlZ2lvbik7Ci0JCWlmIChuYW1lMS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNDUklQVCkpCi0JCQkvLwkJCXJldHVybiBTVF9TQ1JJUFQ7Ci0JCQlyZXR1cm4gZ2V0U2NyaXB0aW5nUGFydGl0aW9uVHlwZShmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzTm9kZS5nZXRTdGFydE9mZnNldChwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbikpKTsKLQkJZWxzZSBpZiAobmFtZTEuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUpICYmIG5hbWUyLmVxdWFsc0lnbm9yZUNhc2UoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLlNUWUxFKSkKLQkJCXJldHVybiBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJcmV0dXJuIHN1cGVyLmdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzTm9kZSwgbmV4dE5vZGUpOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyB0YWduYW1lIHNob3VsZCBub3QgYmUgbnVsbCwKLQkJLy8gYnV0IHNlZSBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkxMQotCQlpZiAodGFnbmFtZSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRVbmtub3duKCk7Ci0JCX0KLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQpKQotCQkJcmVzdWx0ID0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVDsKLQkJZWxzZSBpZiAodGFnbmFtZS5lcXVhbHNJZ25vcmVDYXNlKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TVFlMRSkpCi0JCQlyZXN1bHQgPSBJQ1NTUGFydGl0aW9ucy5TVFlMRTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkgewotCQlyZXR1cm4gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50UGFydGl0aW9uZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckhUTUwoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gY29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQWJzdHJhY3RFcnJvckluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWI0ZDkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdEVycm9ySW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1hYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEVycm9ySW5mbyBpbXBsZW1lbnRzIEVycm9ySW5mbywgRXJyb3JTdGF0ZSB7Ci0KLQotCXByaXZhdGUgaW50IHN0YXRlID0gTk9ORV9FUlJPUjsKLQlwcml2YXRlIFNlZ21lbnQgc2VnID0gbnVsbDsKLQotCXB1YmxpYyBBYnN0cmFjdEVycm9ySW5mbyhpbnQgc3RhdGUsIFNlZ21lbnQgc2VnKSB7Ci0JCXN1cGVyKCk7Ci0JCXRoaXMuc3RhdGUgPSBzdGF0ZTsKLQkJdGhpcy5zZWcgPSBzZWc7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIFN0cmluZyBnZXRIaW50KCk7Ci0KLQlhYnN0cmFjdCBwdWJsaWMgc2hvcnQgZ2V0VGFyZ2V0VHlwZSgpOwotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiAoc2VnID09IG51bGwpID8gMCA6IHNlZy5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIChzZWcgPT0gbnVsbCkgPyAwIDogc2VnLmdldE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKSB7Ci0JCXJldHVybiB0aGlzLnN0YXRlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ01VdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvQ01VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWYyZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NNVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5LkhNUVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1maW5hbCBjbGFzcyBDTVV0aWwgewotCi0JLyoqCi0JICogTmV2ZXIgaW5zdGFudGlhdGUhCi0JICovCi0JcHJpdmF0ZSBDTVV0aWwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogWW91IGNhbm5vdCBhbHdheXMgcmV0cmlldmUgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiB2aWEgYW4gRWxlbWVudCBpbnN0YW5jZS4KLQkgKiBCZWNhdXNlLCBpdCBvY2Nhc2lvbmFsbHkgYSBKU1AgY3VzdG9tIHRhZy4gLS0gOS83LzIwMDEKLQkgKi8KLQlwdWJsaWMgc3RhdGljIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlY2xhcmF0aW9uKEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCURvY3VtZW50IGRvYyA9IHRhcmdldC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCXJldHVybiBxdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbih0YXJnZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCkgewotCQlpZiAoZGVjbCA9PSBudWxsIHx8ICghZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gISgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLlNIT1VMRF9JR05PUkVfQ0FTRSkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDaGlsZChDTUNvbnRlbnQgY29udGVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gdGFyZ2V0KSB7Ci0JCXN3aXRjaCAoY29udGVudC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNvbnRlbnQpKQotCQkJCQlpZiAoaXNDaGlsZCgoKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50KS5nZXRDb250ZW50KCksIHRhcmdldCkpCi0JCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQlyZXR1cm4gaXNTYW1lRGVjbGFyYXRpb24oKENNRWxlbWVudERlY2xhcmF0aW9uKSBjb250ZW50LCB0YXJnZXQpOwotCQkJY2FzZSBDTU5vZGUuR1JPVVAgOgotCQkJCUNNTm9kZUxpc3QgY2hpbGRyZW4gPSAoKENNR3JvdXApIGNvbnRlbnQpLmdldENoaWxkTm9kZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJCQljYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLQkJCQkJCQlpZiAoaXNXaG9sZVRhZ09taXNzaWJsZSgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkKSkKLQkJCQkJCQkJaWYgKGlzQ2hpbGQoKChDTUVsZW1lbnREZWNsYXJhdGlvbikgY2hpbGQpLmdldENvbnRlbnQoKSwgdGFyZ2V0KSkKLQkJCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkLCB0YXJnZXQpKQotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJCWNhc2UgQ01Ob2RlLkdST1VQIDoKLQkJCQkJCQlpZiAoaXNDaGlsZCgoQ01Db250ZW50KSBjaGlsZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCQkJY29udGludWU7IC8vIEdvIG5leHQgY2hpbGQuCi0JCQkJCQlkZWZhdWx0IDoKLQkJCQkJCQljb250aW51ZTsgLy8gR28gbmV4dCBjaGlsZC4KLQkJCQkJfQotCQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5kVGFnT21pc3NpYmxlKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCEoZGVjbC5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSkpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgb21pdFR5cGUgPSAoU3RyaW5nKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJcmV0dXJuICFvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9OT05FKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaG9sZVRhZ09taXNzaWJsZShDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCWlmICghKGRlY2wuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5PTUlUX1RZUEUpKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIG9taXRUeXBlID0gKFN0cmluZykgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCXJldHVybiBvbWl0VHlwZS5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9CT1RIKTsKLQl9Ci0JCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzSlNQKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgZGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1hIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJaWYgKCFkZWNsLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gKChCb29sZWFuKSBkZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgbWV0aG9kIHRvIGRpc3Rpbmd1aXNoIEhUTUwgYW5kIFhIVE1MIGZyb20gb3RoZXIgbWFyayB1cC4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBpcywKLQkgKiAoMSkgbm90IEpTUCwKLQkgKiAoMikgbm90IFNTSS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNIVE1MKENNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wpIHsKLQkJcmV0dXJuICghaXNKU1AoZGVjbCkpICYmICghaXNTU0koZGVjbCkpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTYW1lRGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gYURlYywgQ01FbGVtZW50RGVjbGFyYXRpb24gb3RoZXJEZWMpIHsKLQkJcmV0dXJuIGFEZWMuZ2V0RWxlbWVudE5hbWUoKSA9PSBvdGhlckRlYy5nZXRFbGVtZW50TmFtZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NTSShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjKSB7Ci0JCWlmIChlZGVjID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghZWRlYy5zdXBwb3J0cyhIVE1MQ01Qcm9wZXJ0aWVzLklTX1NTSSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKEJvb2xlYW4pIGVkZWMuZ2V0UHJvcGVydHkoSFRNTENNUHJvcGVydGllcy5JU19TU0kpKS5ib29sZWFuVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsIHRoaXMgbWV0aG9kIG9ubHkgd2hlbiB0aGUgcGFyZW50IGNvbnRlbnQgdHlwZSBpcyBvbmUgb2YKLQkgKiB0aGUgZm9sbG93aW5nOiBBTlksIEVMRU1FTlQsIG9yIE1JWEVELgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkQ2hpbGQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjaGlsZCkgewotCQlpZiAocGFyZW50ID09IG51bGwgfHwgY2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzSFRNTChwYXJlbnQpICYmICghaXNIVE1MKGNoaWxkKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJQ01Db250ZW50IGNvbnRlbnQgPSBwYXJlbnQuZ2V0Q29udGVudCgpOwotCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaXNDaGlsZChjb250ZW50LCBjaGlsZCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRm9yZWlnbihFbGVtZW50IHRhcmdldCkgewotCQlpZiAoISh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgdGFyZ2V0OwotCQlyZXR1cm4gIWVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCSAqICgxKSB2YWx1ZSB0eXBlIGlzIEVOVU0sCi0JICogKDIpIG9ubHkgb25lIHZhbHVlIGlzIGRlZmluZWQgaW4gdGhlIGVudW1lcmF0aW9uLAotCSAqICgzKSB0aGUgdmFsdWUgaGFzIHNhbWUgbmFtZSB0byB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzQm9vbGVhbkF0dHIoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjKSB7Ci0JCUNNRGF0YVR5cGUgYXR0cnR5cGUgPSBhZGVjLmdldEF0dHJUeXBlKCk7Ci0JCWlmIChhdHRydHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXR0cnR5cGUuZ2V0RGF0YVR5cGVOYW1lKCkgIT0gQ01EYXRhVHlwZS5FTlVNKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmdbXSB2YWx1ZXMgPSBhdHRydHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMubGVuZ3RoICE9IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB2YWx1ZXNbMF0uZXF1YWxzKGFkZWMuZ2V0QXR0ck5hbWUoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRJbmNsdXNpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCwgRWxlbWVudCBwYXJlbnQpIHsKLQkJSXRlcmF0b3IgaXRlciA9IEhNUVV0aWwuZ2V0SW5jbHVzaW9ucyhwYXJlbnQpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gaW5jbHVzaW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChpc1NhbWVEZWNsYXJhdGlvbihkZWNsLCBpbmNsdXNpb24pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NvbXBvc2l0ZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0NvbXBvc2l0ZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQyMTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Db21wb3NpdGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWFic3RyYWN0IGNsYXNzIENvbXBvc2l0ZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JcHJvdGVjdGVkIFZlY3RvciBjb21wb25lbnRzID0gbmV3IFZlY3RvcigpOwotCi0JLyoqCi0JICogQ29tcG9zaXRlVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvbXBvc2l0ZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJc3VwZXIuc2V0UmVwb3J0ZXIocmVwb3J0ZXIpOwotCi0JCUl0ZXJhdG9yIGkgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJVmFsaWRhdGlvbkFkYXB0ZXIgY29tcG9uZW50ID0gKFZhbGlkYXRpb25BZGFwdGVyKSBpLm5leHQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWNvbXBvbmVudC5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIG5vZGUpIHsKLQkJSXRlcmF0b3IgaSA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlWYWxpZGF0aW9uQ29tcG9uZW50IGNvbXBvbmVudCA9IChWYWxpZGF0aW9uQ29tcG9uZW50KSBpLm5leHQoKTsKLQkJCWlmIChjb21wb25lbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWNvbXBvbmVudC52YWxpZGF0ZShub2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgYWRkKFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yKSB7Ci0JCWNvbXBvbmVudHMuYWRkKHZhbGlkYXRvcik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgcmVnaXN0ZXJzIGFsbCBjb21wb25lbnRzIGluICd2YWxpZGF0b3JzJy4KLQkgKiBFYWNoIGRlcml2YXRpdmUgbXVzdCBjYWxsIHRoaXMgbWV0aGlkIGluIGl0cyBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWdpc3RlcihWYWxpZGF0aW9uQ29tcG9uZW50W10gdmFsaWRhdG9ycykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbGlkYXRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh2YWxpZGF0b3JzW2ldICE9IG51bGwpCi0JCQkJYWRkKHZhbGlkYXRvcnNbaV0pOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvRG9jdW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmI3YTg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9Eb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1jbGFzcyBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RQcm9wYWdhdGluZ1ZhbGlkYXRvciB7Ci0KLQotCXByaXZhdGUgVmFsaWRhdGlvbkNvbXBvbmVudCB2YWxpZGF0b3IgPSBuZXcgSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yKCk7Ci0JcHJpdmF0ZSBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IgcHJvcGFnYXRlZSA9IG5ldyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKTsKLQotCXB1YmxpYyBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlnZXRQcm9wYWdhdGVlKCkuc2V0UmVwb3J0ZXIodGhpcy5yZXBvcnRlcik7Ci0JCXN1cGVyLnZhbGlkYXRlKG5vZGUpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuY2xhc3MgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXN1cGVyLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQkJdmFsaWRhdG9yLnNldFJlcG9ydGVyKHJlcG9ydGVyKTsKLQkJcHJvcGFnYXRlZS5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRpb25Db21wb25lbnQgZ2V0UHJvcGFnYXRlZSgpIHsKLQkJcmV0dXJuIHByb3BhZ2F0ZWU7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFZhbGlkYXRpb25BZGFwdGVyIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0VsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0VsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjgzNzQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLkFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IgewotCi0KLQlwcml2YXRlIFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yID0gbmV3IEhUTUxTaW1wbGVWYWxpZGF0b3IoKTsKLQotCXB1YmxpYyBFbGVtZW50UHJvcGFnYXRpbmdWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gRWxlbWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yLmNsYXNzIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlcG9ydGVyKFZhbGlkYXRpb25SZXBvcnRlciByZXBvcnRlcikgewotCQlzdXBlci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JCXZhbGlkYXRvci5zZXRSZXBvcnRlcihyZXBvcnRlcik7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25Db21wb25lbnQgZ2V0UHJvcGFnYXRlZSgpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHJvdGVjdGVkIFZhbGlkYXRpb25BZGFwdGVyIGdldFZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIHZhbGlkYXRvcjsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGI0MzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWludGVyZmFjZSBFcnJvckluZm8gewotCi0JcHVibGljIFN0cmluZyBnZXRIaW50KCk7Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpOwotCi0JcHVibGljIGludCBnZXRPZmZzZXQoKTsKLQotCXB1YmxpYyBpbnQgZ2V0U3RhdGUoKTsKLQotCXB1YmxpYyBzaG9ydCBnZXRUYXJnZXRUeXBlKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mb0ltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvckluZm9JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMjZjMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9ySW5mb0ltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotZmluYWwgY2xhc3MgRXJyb3JJbmZvSW1wbCBleHRlbmRzIEFic3RyYWN0RXJyb3JJbmZvIHsKLQotCXByaXZhdGUgTm9kZSB0YXJnZXQgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBTZWdtZW50IHNlZyA9IG51bGw7Ci0JLyoqCi0JICovCi0JcHVibGljIEVycm9ySW5mb0ltcGwoaW50IHN0YXRlLCBTZWdtZW50IGVycm9yU2VnLCBOb2RlIHRhcmdldCkgewotCQlzdXBlcihzdGF0ZSwgZXJyb3JTZWcpOwotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhpbnQoKSB7Ci0JCXN3aXRjaCAodGFyZ2V0LmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0JCQkJc3dpdGNoIChnZXRTdGF0ZSgpKSB7Ci0JCQkJCWNhc2UgVU5ERUZJTkVEX1ZBTFVFX0VSUk9SIDoKLQkJCQkJY2FzZSBNSVNNQVRDSEVEX1ZBTFVFX0VSUk9SIDoKLQkJCQkJY2FzZSBVTkNMT1NFRF9BVFRSX1ZBTFVFIDoKLQkJCQkJCS8vRDIxMDQyMgotCQkJCQkJcmV0dXJuICgoQXR0cikgdGFyZ2V0KS5nZXRWYWx1ZSgpOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCXJldHVybiB0YXJnZXQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gKChUZXh0KSB0YXJnZXQpLmdldERhdGEoKTsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIHRhcmdldC5nZXROb2RlTmFtZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHNob3J0IGdldFRhcmdldFR5cGUoKSB7Ci0JCXJldHVybiB0YXJnZXQuZ2V0Tm9kZVR5cGUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9yU3RhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9FcnJvclN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjU5NDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Vycm9yU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWludGVyZmFjZSBFcnJvclN0YXRlIHsKLQlzdGF0aWMgZmluYWwgaW50IE5PTkVfRVJST1IgPSAwOwotCS8vIGdlbmVyaWMgZXJyb3IKLQlzdGF0aWMgZmluYWwgaW50IFVOREVGSU5FRF9OQU1FX0VSUk9SID0gMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBVTkRFRklORURfVkFMVUVfRVJST1IgPSAxMjsKLQlzdGF0aWMgZmluYWwgaW50IE1JU01BVENIRURfVkFMVUVfRVJST1IgPSAxMzsKLQkvLyBmb3JtYXQgZXJyb3IKLQlzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9FUlJPUl9MRVZFTCA9IDEwMDsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTkFNRV9FUlJPUiA9IDEwMTsKLQlzdGF0aWMgZmluYWwgaW50IElOVkFMSURfQ0hBUl9FUlJPUiA9IDEwMjsKLQlzdGF0aWMgZmluYWwgaW50IE1JU01BVENIRURfRVJST1IgPSAxMDM7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNNQVRDSEVEX0VORF9UQUdfRVJST1IgPSAxMDQ7Ci0Jc3RhdGljIGZpbmFsIGludCBNSVNTSU5HX1NUQVJUX1RBR19FUlJPUiA9IDEwNTsKLQlzdGF0aWMgZmluYWwgaW50IE1JU1NJTkdfRU5EX1RBR19FUlJPUiA9IDEwNjsKLQlzdGF0aWMgZmluYWwgaW50IFVOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IgPSAxMDc7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0FUVFJfRVJST1IgPSAxMDg7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0RJUkVDVElWRV9FUlJPUiA9IDEwOTsKLQlzdGF0aWMgZmluYWwgaW50IFVOQ0xPU0VEX1RBR19FUlJPUiA9IDExMDsKLQlzdGF0aWMgZmluYWwgaW50IFVOQ0xPU0VEX0VORF9UQUdfRVJST1IgPSAxMTE7Ci0Jc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHID0gMTEyOwotCXN0YXRpYyBmaW5hbCBpbnQgVU5DTE9TRURfQVRUUl9WQUxVRSA9IDExMzsgLy9EMjEwNDIyCi0JLy8gbGF5b3V0IGVycm9yCi0Jc3RhdGljIGZpbmFsIGludCBMQVlPVVRfRVJST1JfTEVWRUwgPSAxMDAwOwotCXN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9DT05URU5UX0VSUk9SID0gMTAwMTsKLQlzdGF0aWMgZmluYWwgaW50IERVUExJQ0FURV9FUlJPUiA9IDEwMDI7Ci0Jc3RhdGljIGZpbmFsIGludCBDT0VYSVNURU5DRV9FUlJPUiA9IDEwMDM7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0ZNVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0ZNVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY5ODRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9GTVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotZmluYWwgY2xhc3MgRk1VdGlsIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFNFR19OT05FID0gMDsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfV0hPTEVfVEFHID0gMTsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfU1RBUlRfVEFHID0gMjsKLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBTRUdfRU5EX1RBRyA9IDM7Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIEZNVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFNlZ21lbnQgZ2V0U2VnbWVudChJRE9NTm9kZSB0YXJnZXQsIGludCBzZWdUeXBlKSB7Ci0JCWlmICh0YXJnZXQgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU2VnbWVudCgwLCAwKTsKLQkJU2VnbWVudCBzZWcgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWcgPSBudWxsOwotCQlzd2l0Y2ggKHNlZ1R5cGUpIHsKLQkJCWNhc2UgU0VHX1dIT0xFX1RBRyA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQllbmRUYWcgPSB0YXJnZXQuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZywgZW5kVGFnKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IHRhcmdldC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQlpbnQgZW5kT2Zmc2V0ID0gdGFyZ2V0LmdldEVuZE9mZnNldCgpOwotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgU0VHX1NUQVJUX1RBRyA6Ci0JCQkJc3RhcnRUYWcgPSB0YXJnZXQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChzdGFydFRhZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudCh0YXJnZXQuZ2V0U3RhcnRPZmZzZXQoKSwgMCk7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBTRUdfRU5EX1RBRyA6Ci0JCQkJZW5kVGFnID0gdGFyZ2V0LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRUYWcgIT0gbnVsbCkgewotCQkJCQlzZWcgPSBuZXcgU2VnbWVudChlbmRUYWcpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VnID0gbmV3IFNlZ21lbnQodGFyZ2V0LmdldEVuZE9mZnNldCgpLCAwKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNFR19OT05FIDoKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBuZXcgU2VnbWVudCgwLCAwKTsKLQkJfQotCQlyZXR1cm4gc2VnOwotCX0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MQXR0cmlidXRlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMTI0MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxBdHRyaWJ1dGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotcHVibGljIGNsYXNzIEhUTUxBdHRyaWJ1dGVWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVHSU9OX05BTUUgPSAxOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUdJT05fVkFMVUUgPSAyOwotCS8vIDw8RDIxMDQyMgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7Ci0KLQkvLyBEMjEwNDIyCi0JLyoqCi0JICogSFRNTEF0dHJpYnV0ZVZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MQXR0cmlidXRlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU2VnbWVudCBnZXRFcnJvclNlZ21lbnQoSURPTU5vZGUgZXJyb3JOb2RlLCBpbnQgcmVnaW9uVHlwZSkgewotCQlJVGV4dFJlZ2lvbiByZ24gPSBudWxsOwotCQlzd2l0Y2ggKHJlZ2lvblR5cGUpIHsKLQkJCWNhc2UgUkVHSU9OX05BTUUgOgotCQkJCXJnbiA9IGVycm9yTm9kZS5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFJFR0lPTl9WQUxVRSA6Ci0JCQkJcmduID0gZXJyb3JOb2RlLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQkvLyBub3RoaW5nIHRvIGRvLgotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChyZ24gIT0gbnVsbCkgewotCQkJaWYgKGVycm9yTm9kZSBpbnN0YW5jZW9mIElET01BdHRyKSB7Ci0JCQkJSURPTUVsZW1lbnQgb3duZXJFbGVtZW50ID0gKElET01FbGVtZW50KSAoKElET01BdHRyKSBlcnJvck5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCWlmIChvd25lckVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRTdGFydE9mZnNldChyZ24pOwotCQkJCQlpbnQgcmVnaW9uTGVuZ3RoID0gcmduLmdldExlbmd0aCgpOwotCQkJCQlyZXR1cm4gbmV3IFNlZ21lbnQocmVnaW9uU3RhcnRPZmZzZXQsIHJlZ2lvbkxlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXcgU2VnbWVudChlcnJvck5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgMCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlIGFsbG93cyBpdAotCSAqIHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTEF0dHJpYnV0ZVZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUVsZW1lbnQgdGFyZ2V0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChDTVV0aWwuaXNGb3JlaWduKHRhcmdldCkpCi0JCQlyZXR1cm47Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJaWYgKGVkZWMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQ01OYW1lZE5vZGVNYXAgZGVjbGFyYXRpb25zID0gZWRlYy5nZXRBdHRyaWJ1dGVzKCk7Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJzID0gdGFyZ2V0LmdldEF0dHJpYnV0ZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpbnQgcmduVHlwZSA9IFJFR0lPTl9OQU1FOwotCQkJaW50IHN0YXRlID0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SOwotCQkJQXR0ciBhID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkvLyBEMjAzNjM3OyBJZiB0aGUgdGFyZ2V0IGF0dHIgaGFzIHByZWZpeCwgdGhlIHZhbGlkYXRvciBzaG91bGQKLQkJCS8vIG5vdAotCQkJLy8gd2FybiBhYm91dCBpdC4gVGhhdCBpcywganVzdCBpZ25vcmUuIEl0IGlzIGFibGUgdG8gY2hlY2sKLQkJCS8vIHdoZXRoZXIKLQkJCS8vIGFuIGF0dHIgaGFzIHByZWZpeCBvciBub3QgYnkgY2FsbGluZyBYTUxBdHRyI2lzR2xvYmFsQXR0cigpLgotCQkJLy8gV2hlbiBhIGF0dHIgaGFzIHByZWZpeCAobm90IGdsb2JhbCksIGl0IHJldHVybnMgZmFsc2UuCi0JCQlib29sZWFuIGlzWE1MQXR0ciA9IGEgaW5zdGFuY2VvZiBJRE9NQXR0cjsKLQkJCWlmIChpc1hNTEF0dHIpIHsKLQkJCQlJRE9NQXR0ciB4bWxhdHRyID0gKElET01BdHRyKSBhOwotCQkJCWlmICgheG1sYXR0ci5pc0dsb2JhbEF0dHIoKSkKLQkJCQkJY29udGludWU7IC8vIHNraXAgZnV0aGVyIHZhbGlkYXRpb24gYW5kIGJlZ2luIG5leHQgbG9vcC4KLQkJCX0KLQotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGRlY2xhcmF0aW9ucy5nZXROYW1lZEl0ZW0oYS5nZXROYW1lKCkpOwotCQkJaWYgKGFkZWMgPT0gbnVsbCkgewotCQkJCS8vIE5vIGF0dHIgZGVjbGFyYXRpb24gd2FzIGZvdW5kLiBUaGF0IGlzLCB0aGUgYXR0ciBuYW1lIGlzCi0JCQkJLy8gdW5kZWZpbmVkLgotCQkJCS8vIGJ1dCBub3QgcmVnYXJkIGl0IGFzIHVuZGVmaW5lZCBuYW1lIGlmIGl0IGluY2x1ZGVzIEpTUAotCQkJCWlmICghaGFzSlNQUmVnaW9uKCgoSURPTU5vZGUpIGEpLmdldE5hbWVSZWdpb24oKSkpIHsKLQkJCQkJcmduVHlwZSA9IFJFR0lPTl9OQU1FOwotCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuVU5ERUZJTkVEX05BTUVfRVJST1I7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gVGhlIGF0dHIgZGVjbGFyYXRpb24gd2FzIGZvdW5kLgotCQkJCS8vIEF0IDFzdCwgdGhlIG5hbWUgc2hvdWxkIGJlIGNoZWNrZWQuCi0JCQkJaWYgKENNVXRpbC5pc0hUTUwoZWRlYykgJiYgKCFDTVV0aWwuaXNYSFRNTChlZGVjKSkpIHsKLQkJCQkJLy8gSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzIHB1cmUgSFRNTCAobm90IFhIVE1MKSwgc29tZQotCQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJCS8vIG1pZ2h0IGJlIHdyaXR0ZW4gaW4gYm9vbGVhbiBmb3JtYXQuIEl0IHNob3VsZCBiZSBjaGVjawotCQkJCQkvLyBzcGVjaWZpY2FsbHkuCi0JCQkJCWlmIChDTVV0aWwuaXNCb29sZWFuQXR0cihhZGVjKSAmJiAoKElET01BdHRyKSBhKS5oYXNOYW1lT25seSgpKQotCQkJCQkJY29udGludWU7IC8vIE9LLCBrZWVwIGdvaW5nLiBObyBtb3JlIGNoZWNrIGlzIG5lZWRlZAotCQkJCQkvLyBhZ2FpbnN0IHRoaXMgYXR0ci4KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIElmIHRoZSB0YXJnZXQgaXMgb3RoZXIgdGhhbiBwdXJlIEhUTUwgKEpTUCBvciBYSFRNTCksCi0JCQkJCS8vIHRoZSBuYW1lCi0JCQkJCS8vIG11c3QgYmUgY2hlY2tlZCBleGFjdGx5IChpZSBpbiBjYXNlIHNlbnNpdGl2ZSB3YXkpLgotCQkJCQlTdHJpbmcgYWN0dWFsID0gYS5nZXROYW1lKCk7Ci0JCQkJCVN0cmluZyBkZXNpcmVkID0gYWRlYy5nZXRBdHRyTmFtZSgpOwotCQkJCQlpZiAoIWFjdHVhbC5lcXVhbHMoZGVzaXJlZCkpIHsgLy8gY2FzZSBtaXNtYXRjaAotCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9OQU1FOwotCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLk1JU01BVENIRURfRVJST1I7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gVGhlbiwgdGhlIHZhbHVlIG11c3QgYmUgY2hlY2tlZC4KLQkJCQlpZiAoc3RhdGUgPT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7IC8vIE5lZWQgbW9yZSBjaGVjay4KLQkJCQkJLy8gTm93LCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNoZWNrZWQsIGlmIHRoZSB0eXBlIGlzIEVOVU0uCi0JCQkJCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhZGVjLmdldEF0dHJUeXBlKCk7Ci0JCQkJCVN0cmluZyBhY3R1YWxWYWx1ZSA9IGEuZ2V0VmFsdWUoKTsKLQkJCQkJaWYgKGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQpIHsKLQkJCQkJCS8vIENoZWNrIEZJWEVEIHZhbHVlLgotCQkJCQkJU3RyaW5nIHZhbGlkVmFsdWUgPSBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKTsKLQkJCQkJCWlmICghYWN0dWFsVmFsdWUuZXF1YWxzKHZhbGlkVmFsdWUpKSB7Ci0JCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuVU5ERUZJTkVEX1ZBTFVFX0VSUk9SOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJU3RyaW5nW10gY2FuZGlkYXRlcyA9IGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJCQkJCWlmIChjYW5kaWRhdGVzICE9IG51bGwgJiYgY2FuZGlkYXRlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJLy8gc2V2ZXJhbCBjYW5kaWRhdGVzIGFyZSBmb3VuZC4KLQkJCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQkJZm9yIChpbnQgaW5kZXggPSAwOyBpbmRleCA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBpbmRleCsrKSB7Ci0JCQkJCQkJCVN0cmluZyBjYW5kaWRhdGUgPSBjYW5kaWRhdGVzW2luZGV4XTsKLQkJCQkJCQkJLy8gQXQgMXN0LCBjb21wYXJlIGlnbm9yaW5nIGNhc2UuCi0JCQkJCQkJCWlmIChhY3R1YWxWYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKGNhbmRpZGF0ZSkpIHsKLQkJCQkJCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJCQkJCWlmIChDTVV0aWwuaXNDYXNlU2Vuc2l0aXZlKGVkZWMpICYmICghYWN0dWFsVmFsdWUuZXF1YWxzKGNhbmRpZGF0ZSkpKSB7Ci0JCQkJCQkJCQkJcmduVHlwZSA9IFJFR0lPTl9WQUxVRTsKLQkJCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuTUlTTUFUQ0hFRF9WQUxVRV9FUlJPUjsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWJyZWFrOyAvLyBleGl0IHRoZSBsb29wLgotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZm91bmQpIHsKLQkJCQkJCQkJLy8gTm8gY2FuZGlkYXRlIHdhcyBmb3VuZC4gVGhhdCBpcywKLQkJCQkJCQkJLy8gYWN0dWFsVmFsdWUgaXMgaW52YWxpZC4KLQkJCQkJCQkJLy8gYnV0IG5vdCByZWdhcmQgaXQgYXMgdW5kZWZpbmVkIHZhbHVlIGlmIGl0Ci0JCQkJCQkJCS8vIGluY2x1ZGVzIEpTUC4KLQkJCQkJCQkJaWYgKCFoYXNKU1BSZWdpb24oKChJRE9NTm9kZSkgYSkuZ2V0VmFsdWVSZWdpb24oKSkpIHsKLQkJCQkJCQkJCXJnblR5cGUgPSBSRUdJT05fVkFMVUU7Ci0JCQkJCQkJCQlzdGF0ZSA9IEVycm9yU3RhdGUuVU5ERUZJTkVEX1ZBTFVFX0VSUk9SOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIDw8RDIxMDQyMgotCQkJCWlmIChzdGF0ZSA9PSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsgLy8gTmVlZCBtb3JlIGNoZWNrLgotCQkJCQlpZiAoaXNYTUxBdHRyKSB7Ci0JCQkJCQlTdHJpbmcgc291cmNlID0gKChJRE9NQXR0cikgYSkuZ2V0VmFsdWVSZWdpb25UZXh0KCk7Ci0JCQkJCQlpZiAoc291cmNlICE9IG51bGwpIHsKLQkJCQkJCQljaGFyIGZpcnN0Q2hhciA9IHNvdXJjZS5jaGFyQXQoMCk7Ci0JCQkJCQkJY2hhciBsYXN0Q2hhciA9IHNvdXJjZS5jaGFyQXQoc291cmNlLmxlbmd0aCgpIC0gMSk7Ci0JCQkJCQkJaWYgKGlzUXVvdGUoZmlyc3RDaGFyKSB8fCBpc1F1b3RlKGxhc3RDaGFyKSkgewotCQkJCQkJCQlpZiAobGFzdENoYXIgIT0gZmlyc3RDaGFyKSB7Ci0JCQkJCQkJCQlyZ25UeXBlID0gUkVHSU9OX1ZBTFVFOwotCQkJCQkJCQkJc3RhdGUgPSBFcnJvclN0YXRlLlVOQ0xPU0VEX0FUVFJfVkFMVUU7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gRDIxMDQyMgotCQkJfQotCQkJaWYgKHN0YXRlICE9IEVycm9yU3RhdGUuTk9ORV9FUlJPUikgewotCQkJCVNlZ21lbnQgc2VnID0gZ2V0RXJyb3JTZWdtZW50KChJRE9NTm9kZSkgYSwgcmduVHlwZSk7Ci0JCQkJaWYgKHNlZyAhPSBudWxsKQotCQkJCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgRXJyb3JJbmZvSW1wbChzdGF0ZSwgc2VnLCBhKSkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGhhc0pTUFJlZ2lvbihJVGV4dFJlZ2lvbiBjb250YWluZXIpIHsKLQkJaWYgKCEoY29udGFpbmVyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIGNvbnRhaW5lcikuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlpZiAocmVnaW9uID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCAoaXNOZXh0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0gICAgLyoqCi0gICAgICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotICAgICAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uICJuZXN0ZWRDb250ZXh0Ii4KLSAgICAgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNOZXh0ZWRUYWdOYW1lKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX09QRU4gPSAiSlNQX1NDUklQVExFVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCWZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JCWJvb2xlYW4gcmVzdWx0ID0gcmVnaW9uVHlwZS5lcXVhbHMoSlNQX1NDUklQVExFVF9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhKU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhKU1BfREVDTEFSQVRJT05fT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9PUEVOKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyA8PEQyMTQwMjIKLQlwcml2YXRlIGJvb2xlYW4gaXNRdW90ZShjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09IFNJTkdMRV9RVU9URSkgfHwgKGMgPT0gRE9VQkxFX1FVT1RFKTsKLQl9Ci0JLy8gRDIxMDQyMgotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjZlNmQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSFRNTDQwTmFtZXNwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50VHlwZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgewotCi0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBjbGFzcyBEaXZpc2lvbiB7Ci0JCXByaXZhdGUgVmVjdG9yIGV4cGxpY2l0SHRtbHMgPSBuZXcgVmVjdG9yKCk7Ci0JCXByaXZhdGUgVmVjdG9yIHJlc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJcHVibGljIERpdmlzaW9uKERvY3VtZW50IGRvY3VtZW50LCBOb2RlTGlzdCBjaGlsZHJlbikgewotCQkJU3RyaW5nIHJvb3RUYWdOYW1lID0gZ2V0Um9vdFRhZ05hbWUoZG9jdW1lbnQpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJaWYgKGlzSHRtbFRhZyhjaGlsZCwgcm9vdFRhZ05hbWUpKSB7Ci0JCQkJCWV4cGxpY2l0SHRtbHMuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3QuYWRkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNFeHBsaWNpdEh0bWxzKCkgewotCQkJcmV0dXJuIGV4cGxpY2l0SHRtbHMuc2l6ZSgpID4gMDsKLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldEV4cGxpY2l0SHRtbHMoKSB7Ci0JCQlyZXR1cm4gZXhwbGljaXRIdG1sczsKLQkJfQotCi0JCXB1YmxpYyBJdGVyYXRvciBnZXRSZXN0Tm9kZXMoKSB7Ci0JCQlyZXR1cm4gcmVzdC5pdGVyYXRvcigpOwotCQl9Ci0KLQkJLyogdXRpbGl0aWVzICovCi0JCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNIdG1sVGFnKE5vZGUgbm9kZSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJcmV0dXJuICgoRWxlbWVudCkgbm9kZSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UodGFnTmFtZSk7Ci0JCX0KLQotCQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0Um9vdFRhZ05hbWUoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgZG9jdW1lbnQpLmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBhZGFwdGVyLmdldERvY3VtZW50VHlwZSgpOwotCQkJCWlmIChkb2NUeXBlICE9IG51bGwpIHsKLQkJCQkJcmV0dXJuIGRvY1R5cGUuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQotCQkJcmV0dXJuIEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSFRNTERvY3VtZW50Q29udGVudFZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxEb2N1bWVudENvbnRlbnRWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQkvLyBpc0ZyYWdtZW50IGNoZWNrIHNob3VsZCBiZSBtb3JlIGludGVsbGlnZW50LgotCQlib29sZWFuIGlzRnJhZ21lbnQgPSB0cnVlOwotCi0JCURvY3VtZW50IHRhcmdldCA9IChEb2N1bWVudCkgbm9kZTsKLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSB0YXJnZXQuZ2V0Q2hpbGROb2RlcygpOwotCQlpZiAoY2hpbGRyZW4gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlEaXZpc2lvbiBkaXZpc2lvbiA9IG5ldyBEaXZpc2lvbih0YXJnZXQsIGNoaWxkcmVuKTsKLQkJaWYgKGRpdmlzaW9uLmhhc0V4cGxpY2l0SHRtbHMoKSkgewotCQkJaXNGcmFnbWVudCA9IGZhbHNlOwotCi0JCQlMaXN0IGV4cGxpY2l0cyA9IGRpdmlzaW9uLmdldEV4cGxpY2l0SHRtbHMoKTsKLQkJCWlmIChleHBsaWNpdHMuc2l6ZSgpID4gMSkgewotCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgZXhwbGljaXRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCUVsZW1lbnQgaHRtbCA9IChFbGVtZW50KSBleHBsaWNpdHMuZ2V0KGkpOwotCQkJCQkvLyByZXBvcnQgZXJyb3IgKGR1cGxpY2F0ZSkKLQkJCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KChJRE9NTm9kZSkgaHRtbCwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJCXJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBFcnJvckluZm9JbXBsKEVycm9yU3RhdGUuRFVQTElDQVRFX0VSUk9SLCBlcnJvclNlZywgaHRtbCkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJdmFsaWRhdGVDb250ZW50KGRpdmlzaW9uLmdldFJlc3ROb2RlcygpLCBpc0ZyYWdtZW50KTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kcyB2YWxpZGF0ZSBub2RlcyBvdGhlciB0aGFuIEhUTUwgZWxlbWVudHMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGVudChJdGVyYXRvciBjaGlsZHJlbiwgYm9vbGVhbiBpc0ZyYWdtZW50KSB7Ci0JCWJvb2xlYW4gZm91bmREb2N0eXBlID0gZmFsc2U7Ci0JCXdoaWxlIChjaGlsZHJlbi5oYXNOZXh0KCkpIHsKLQkJCUlET01Ob2RlIGNoaWxkID0gKElET01Ob2RlKSBjaGlsZHJlbi5uZXh0KCk7Ci0KLQkJCWludCBlcnJvciA9IEVycm9yU3RhdGUuTk9ORV9FUlJPUjsKLQkJCWludCBzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0KLQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCQlpZiAoIWlzRnJhZ21lbnQpIHsKLQkJCQkJCUVsZW1lbnQgY2hpbGRFbGVtID0gKEVsZW1lbnQpIGNoaWxkOwotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gY2VkID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKGNoaWxkRWxlbSk7Ci0JCQkJCQkvLyBVbmRlZmluZWQgZWxlbWVudCBpcyB2YWxpZC4KLQkJCQkJCWlmIChjZWQgPT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCS8vIEpTUCAoaW5jbHVkZXMgY3VzdG9tIHRhZ3MpIGFuZCBTU0kgYXJlIHZhbGlkLgotCQkJCQkJaWYgKENNVXRpbC5pc0ZvcmVpZ24oY2hpbGRFbGVtKSB8fCBDTVV0aWwuaXNTU0koY2VkKSkKLQkJCQkJCQljb250aW51ZTsgLy8gRGVmZWN0IDE4Njc3NAotCi0JCQkJCQkvLyByZXBvcnQgZXJyb3IgKGludmFsaWQgY29udGVudCkKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQkvLyBtYXJrIHRoZSB3aG9sZSBzdGFydCB0YWcgYXMgZXJyb3IuCi0JCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19TVEFSVF9UQUc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJCWlmICghaXNGcmFnbWVudCkgewotCQkJCQkJLy8gVEVYVCBub2RlIGlzIHZhbGlkIHdoZW4gaXQgY29udGFpbnMgd2hpdGUgc3BhY2UKLQkJCQkJCS8vIGNoYXJhY3RlcnMgb25seS4KLQkJCQkJCS8vIE90aGVyd2lzZSwgaXQgaXMgaW52YWxpZCBjb250ZW50LgotCQkJCQkJaWYgKCgoSURPTVRleHQpIGNoaWxkKS5pc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpKQotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLQkJCQkJLy8gRE9DVFlQRSBpcyBhbHNvIHZhbGlkIHdoZW4gaXQgYXBwZWFycyBvbmNlIGFuZCBvbmx5Ci0JCQkJCS8vIG9uY2UuCi0JCQkJCWlmICghZm91bmREb2N0eXBlKSB7Ci0JCQkJCQlmb3VuZERvY3R5cGUgPSB0cnVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLkRVUExJQ0FURV9FUlJPUjsKLQkJCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCQkvLyBhbHdheXMgdmFsaWQuCi0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJCWNvbnRpbnVlOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoIWlzRnJhZ21lbnQpIHsKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoZXJyb3IgIT0gRXJyb3JTdGF0ZS5OT05FX0VSUk9SKSB7Ci0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KGNoaWxkLCBzZWdUeXBlKTsKLQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJcmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UobmV3IEVycm9ySW5mb0ltcGwoZXJyb3IsIGVycm9yU2VnLCBjaGlsZCkpKTsKLQkJCX0KLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWU1ZTEzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBIVE1MRWxlbWVudEFuY2VzdG9yVmFsaWRhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEhUTUxFbGVtZW50QW5jZXN0b3JWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgZXhjbHVzaW9uIHdoaWNoIGlzIGRlZmluZWQgaW4gb25seSBIVE1MIERURCAoU0dNTCkuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUVsZW1lbnQgdGFyZ2V0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChDTVV0aWwuaXNGb3JlaWduKHRhcmdldCkpCi0JCQlyZXR1cm47Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlYyA9IENNVXRpbC5nZXREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlpZiAoZGVjID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGNhbm5vdCB2YWxpZGF0ZS4KLQkJaWYgKCFDTVV0aWwuaXNIVE1MKGRlYykpCi0JCQlyZXR1cm47IC8vIG5vIG5lZWQgdG8gdmFsaWRhdGUKLQkJaWYgKCFkZWMuc3VwcG9ydHMoSFRNTENNUHJvcGVydGllcy5QUk9ISUJJVEVEX0FOQ0VTVE9SUykpCi0JCQlyZXR1cm47IC8vIGNhbm5vdCB2YWxpZGF0ZS4KLQkJQ01OYW1lZE5vZGVNYXAgcHJvaGliaXRlZCA9IChDTU5hbWVkTm9kZU1hcCkgZGVjLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuUFJPSElCSVRFRF9BTkNFU1RPUlMpOwotCQlpZiAocHJvaGliaXRlZC5nZXRMZW5ndGgoKSA8PSAwKQotCQkJcmV0dXJuOyAvLyBubyBwcm9oaWJpdGVkIGFuY2VzdG9ycy4KLQotCQlFbGVtZW50IHBhcmVudCA9IFNNVXRpbC5nZXRQYXJlbnRFbGVtZW50KHRhcmdldCk7Ci0JCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJQ01Ob2RlIHBkZWMgPSBwcm9oaWJpdGVkLmdldE5hbWVkSXRlbShwYXJlbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQlpZiAocGRlYyAhPSBudWxsKSB7IC8vIHByb2hpYml0ZWQgZWxlbWVudCBpcyBmb3VuZCBpbiBhbmNlc3RvcnMuCi0JCQkJU2VnbWVudCBlcnJvclNlZyA9IEZNVXRpbC5nZXRTZWdtZW50KChJRE9NTm9kZSkgbm9kZSwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgRXJyb3JJbmZvSW1wbChFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUiwgZXJyb3JTZWcsIHRhcmdldCkpKTsKLQkJCQlicmVhazsgLy8gSWYgb25lIHByb2hpYml0ZWQgYW5jZXN0b3IgaXMgZm91bmQsIGl0J3MgZW5vdWdoLgotCQkJfQotCQkJcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQocGFyZW50KTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzA4MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IgZXh0ZW5kcyBQcmltZVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBIVE1MRWxlbWVudENvbnRlbnRWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxFbGVtZW50Q29udGVudFZhbGlkYXRvci5jbGFzcykgfHwgc3VwZXIuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCUVsZW1lbnQgdGFyZ2V0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChDTVV0aWwuaXNGb3JlaWduKHRhcmdldCkpCi0JCQlyZXR1cm47Ci0KLQkJdmFsaWRhdGVDb250ZW50KHRhcmdldCwgdGFyZ2V0LmdldENoaWxkTm9kZXMoKSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGVudChFbGVtZW50IHBhcmVudCwgTm9kZUxpc3QgY2hpbGRyZW4pIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCWlmIChjaGlsZCA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBwZXJmb3JtIGFjdHVhbCB2YWxpZGF0aW9uCi0JCQl2YWxpZGF0ZU5vZGUocGFyZW50LCBjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvLyBwcml2YXRlIGludCBjb3VudEV4cGxpY2l0U2libGluZ3MoRWxlbWVudCBwYXJlbnQsIFN0cmluZyB0YWdOYW1lKSB7Ci0JLy8gTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCS8vIGludCBjb3VudCA9IDA7Ci0JLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JLy8gTm9kZSBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JLy8gaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JLy8gY29udGludWU7Ci0JLy8gaWYgKHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSgoKEVsZW1lbnQpIGNoaWxkKS5nZXRUYWdOYW1lKCkpKSB7Ci0JLy8gY291bnQrKzsKLQkvLyB9Ci0JLy8gfQotCS8vIHJldHVybiBjb3VudDsKLQkvLyB9Ci0KLQkvKgotCSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZm9sbG93aW5nIG1ldGhvZCBpcyBwcmFjdGljYWwgYnV0IGFjY3VyYXRlLgotCSAqIFRoZSBhY2N1cmF0ZSBtYXhpbXVtIG9jY3VyZW5jZSBzaG91bGQgYmUgcmV0cmVpdmUgZnJvbSB0aGUgY29udGVudAotCSAqIG1vZGVsLiBIb3dldmVyLCBpdCBpcyB1c2VmdWwgZW5vdWdoLCBzaW5jZSBhbG1vc3QgaW1wbGljaXQgZWxlbWVudHMgYXJlCi0JICogSFRNTCwgSEVBRCwgb3IgQk9EWS4KLQkgKi8KLQkvLyBwcml2YXRlIGludCBnZXRNYXhPY2N1cihFbGVtZW50IHBhcmVudCwgU3RyaW5nIGNoaWxkVGFnKSB7Ci0JLy8gcmV0dXJuIDE7Ci0JLy8gfQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZU5vZGUoRWxlbWVudCB0YXJnZXQsIE5vZGUgY2hpbGQpIHsKLQkJLy8gTk9URTogSWYgdGhlIHRhcmdldCBlbGVtZW50IGlzICdVTktOT1dOJywgdGhhdCBpcywgaXQgaGFzIG5vCi0JCS8vIGVsZW1lbnQgZGVjbGFyYXRpb24sIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGVsZW1lbnQgc2hvdWxkIGJlCi0JCS8vIHJlZ2FyZGVkIGFzICdBTlknLiAtLSA5LzEwLzIwMDEKLQkJaW50IGNvbnRlbnRUeXBlID0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZGVjID0gQ01VdGlsLmdldERlY2xhcmF0aW9uKHRhcmdldCk7Ci0JCWlmIChlZGVjICE9IG51bGwpCi0JCQljb250ZW50VHlwZSA9IGVkZWMuZ2V0Q29udGVudFR5cGUoKTsKLQotCQlpbnQgZXJyb3IgPSBFcnJvclN0YXRlLk5PTkVfRVJST1I7Ci0JCWludCBzZWdUeXBlID0gRk1VdGlsLlNFR19XSE9MRV9UQUc7Ci0KLQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlFbGVtZW50IGNoaWxkRWxlbSA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkvLyBEZWZlY3QgMjAwMzIxOgotCQkJCS8vIFRoaXMgdmFsaWRhdG9yIGNhcmVzIG9ubHkgSFRNTC9YSFRNTCBlbGVtZW50cy4gSWYgYSBjaGlsZAotCQkJCS8vIGlzCi0JCQkJLy8gYW4gZWxlbWVudCBvZiBmb3JlaWduIG1hcmt1cCBsYW5ndWFnZXMsIGp1c3QgaWdub3JlIGl0LgotCQkJCWlmIChDTVV0aWwuaXNGb3JlaWduKGNoaWxkRWxlbSkpCi0JCQkJCXJldHVybjsKLQotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGNlZCA9IENNVXRpbC5nZXREZWNsYXJhdGlvbigoRWxlbWVudCkgY2hpbGQpOwotCQkJCS8vIERlZmVjdCAxODY3NzQ6IElmIGEgY2hpbGQgaXMgbm90IG9uZSBvZiBIVE1MIGVsZW1lbnRzLAotCQkJCS8vIGl0IHNob3VsZCBiZSByZWdhcmRlZCBhcyBhIHZhbGlkIGNoaWxkIHJlZ2FyZGxlc3MgdGhlCi0JCQkJLy8gdHlwZSBvZiB0aGUgcGFyZW50IGNvbnRlbnQgbW9kZWwuIC0tIDEwLzEyLzIwMDEKLQkJCQlpZiAoY2VkID09IG51bGwgfHwgQ01VdGlsLmlzU1NJKGNlZCkgfHwgKCFDTVV0aWwuaXNIVE1MKGNlZCkpKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlzd2l0Y2ggKGNvbnRlbnRUeXBlKSB7Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZIDoKLQkJCQkJCS8vIEtlZXAgZ29pbmcuCi0JCQkJCQlyZXR1cm47Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgOgotCQkJCQkJaWYgKGNlZCA9PSBudWxsKQotCQkJCQkJCXJldHVybjsKLQkJCQkJCWlmIChDTVV0aWwuaXNWYWxpZENoaWxkKGVkZWMsIGNlZCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJLy8gTm93LCBpdCBpcyB0aGUgdGltZSB0byBjaGVjayBpbmNsdXNpb24sIHVubGVzcyB0aGUKLQkJCQkJCS8vIHRhcmdldAotCQkJCQkJLy8gZG9jdW1lbnQgaXMgbm90IGEgWEhUTUwuCi0JCQkJCQlpZiAoIUNNVXRpbC5pc1hIVE1MKGVkZWMpKSB7Ci0JCQkJCQkJLy8gcHVyZSBIVE1MCi0JCQkJCQkJaWYgKENNVXRpbC5pc1ZhbGlkSW5jbHVzaW9uKGNlZCwgdGFyZ2V0KSkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgU1RBUlQgdGFnIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfU1RBUlRfVEFHOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOb2RlLlRFWFRfTk9ERSA6Ci0JCQkJc3dpdGNoIChjb250ZW50VHlwZSkgewotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgOgotCQkJCQljYXNlIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSA6Ci0JCQkJCWNhc2UgQ01FbGVtZW50RGVjbGFyYXRpb24uQ0RBVEEgOgotCQkJCQkJLy8gRDE4NDMzOQotCQkJCQkJLy8gS2VlcCBnb2luZy4KLQkJCQkJCXJldHVybjsKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UIDoKLQkJCQkJY2FzZSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSA6Ci0JCQkJCQlpZiAoKChJRE9NVGV4dCkgY2hpbGQpLmlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCkpCi0JCQkJCQkJcmV0dXJuOwotCQkJCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCQlkZWZhdWx0IDoKLQkJCQkJCWVycm9yID0gRXJyb3JTdGF0ZS5JTlZBTElEX0NPTlRFTlRfRVJST1I7Ci0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJLy8gTWFyayB0aGUgd2hvbGUgbm9kZSBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCXNlZ1R5cGUgPSBGTVV0aWwuU0VHX1dIT0xFX1RBRzsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJaWYgKGNvbnRlbnRUeXBlICE9IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJCQlyZXR1cm47Ci0JCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBub2RlIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJZXJyb3IgPSBFcnJvclN0YXRlLklOVkFMSURfQ09OVEVOVF9FUlJPUjsKLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBub2RlIGFzIGFuIGVycm9yIHNlZ21lbnQuCi0JCQkJc2VnVHlwZSA9IEZNVXRpbC5TRUdfV0hPTEVfVEFHOwotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChlcnJvciAhPSBFcnJvclN0YXRlLk5PTkVfRVJST1IpIHsKLQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudCgoSURPTU5vZGUpIGNoaWxkLCBzZWdUeXBlKTsKLQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCXJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBFcnJvckluZm9JbXBsKGVycm9yLCBlcnJvclNlZywgY2hpbGQpKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOWE5MzkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIEhUTUxTaW1wbGVEb2N1bWVudFZhbGlkYXRvciBleHRlbmRzIENvbXBvc2l0ZVZhbGlkYXRvciB7Ci0KLQkvKioKLQkgKiBIVE1MU2ltcGxlRG9jdW1lbnRWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCi0JCVZhbGlkYXRpb25Db21wb25lbnRbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRpb25Db21wb25lbnRbMl07Ci0KLQkJdmFsaWRhdG9yc1swXSA9IG5ldyBIVE1MRG9jdW1lbnRDb250ZW50VmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbMV0gPSBuZXcgU3ludGF4VmFsaWRhdG9yKCk7Ci0KLQkJcmVnaXN0ZXIodmFsaWRhdG9ycyk7Ci0JfQotCi0JLyoqCi0JICogQWxsb3dpbmcgdGhlIElOb2RlQWRhcHRlciB0byBjb21wYXJlIGl0c2VsZiBhZ2FpbnN0IHRoZSB0eXBlCi0JICogYWxsb3dzIGl0IHRvIHJldHVybiB0cnVlIGluIG1vcmUgdGhhbiBvbmUgY2FzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAoKHR5cGUgPT0gSFRNTFNpbXBsZURvY3VtZW50VmFsaWRhdG9yLmNsYXNzKSB8fCBzdXBlci5pc0FkYXB0ZXJGb3JUeXBlKHR5cGUpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9IVE1MU2ltcGxlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMmE1ZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxTaW1wbGVWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25Db21wb25lbnQ7Ci0KLWNsYXNzIEhUTUxTaW1wbGVWYWxpZGF0b3IgZXh0ZW5kcyBDb21wb3NpdGVWYWxpZGF0b3IgewotCi0JLyoqCi0JICogSFRNTFNpbXBsZVZhbGlkYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBIVE1MU2ltcGxlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCi0JCVZhbGlkYXRpb25Db21wb25lbnRbXSB2YWxpZGF0b3JzID0gbmV3IFZhbGlkYXRpb25Db21wb25lbnRbNV07Ci0KLQkJdmFsaWRhdG9yc1swXSA9IG5ldyBIVE1MQXR0cmlidXRlVmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbMV0gPSBuZXcgSFRNTEVsZW1lbnRDb250ZW50VmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbMl0gPSBuZXcgU3ludGF4VmFsaWRhdG9yKCk7Ci0JCXZhbGlkYXRvcnNbM10gPSBuZXcgSFRNTEVsZW1lbnRBbmNlc3RvclZhbGlkYXRvcigpOwotCQl2YWxpZGF0b3JzWzRdID0gbmV3IE5hbWVzcGFjZVZhbGlkYXRvcigpOwotCi0JCXJlZ2lzdGVyKHZhbGlkYXRvcnMpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZQotCSAqIGFsbG93cyBpdCB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKCh0eXBlID09IEhUTUxTaW1wbGVWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0hUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1MDg4Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoVmFsaWRhdGlvbkFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCS8qKgotCSAqIEhUTUxWYWxpZGF0aW9uQWRhcHRlckZhY3RvcnkgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiBAcGFyYW0gYWRhcHRlcktleSBqYXZhLmxhbmcuT2JqZWN0Ci0JICogQHBhcmFtIHJlZ2lzdGVyQWRhcHRlcnMgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgdGFyZ2V0KSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIG5ldyBEb2N1bWVudFByb3BhZ2F0aW5nVmFsaWRhdG9yKCk7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gbmV3IEVsZW1lbnRQcm9wYWdhdGluZ1ZhbGlkYXRvcigpOwotCQkJZGVmYXVsdCA6Ci0JCQkJcmV0dXJuIG5ldyBOdWxsVmFsaWRhdG9yKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBIVE1MVmFsaWRhdGlvbkFkYXB0ZXJGYWN0b3J5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgIT0gbnVsbCkKLQkJCXJldHVybiBpbnN0YW5jZTsKLQkJaW5zdGFuY2UgPSBuZXcgSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeSgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogT3ZlcnJpZGluZyBPYmplY3QncyBjbG9uZSgpIG1ldGhvZAotCSAqIFRoaXMgaXMgdXNlZCBpbiBJTW9kZWxNYW5hZ2VyJ3MgSVN0cnVjdHVyZWRNb2RlbCBjb3B5aW5nLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTWVzc2FnZUZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9NZXNzYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjBiNTFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9NZXNzYWdlRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotY2xhc3MgTWVzc2FnZUZhY3RvcnkgaW1wbGVtZW50cyBFcnJvclN0YXRlIHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXJyb3JUYWJsZSB7Ci0JCXByaXZhdGUgY2xhc3MgUGFja2V0IHsKLQkJCXB1YmxpYyBQYWNrZXQoU3RyaW5nIG1zZywgaW50IHNldmVyaXR5KSB7Ci0JCQkJdGhpcy5tc2cgPSBtc2c7Ci0JCQkJdGhpcy5zZXZlcml0eSA9IHNldmVyaXR5OwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCQkJcmV0dXJuIG1zZzsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRTZXZlcml0eSgpIHsKLQkJCQlyZXR1cm4gc2V2ZXJpdHk7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgU3RyaW5nIG1zZyA9IG51bGw7Ci0JCQlwcml2YXRlIGludCBzZXZlcml0eSA9IC0xOwotCQl9Ci0KLQkJcHVibGljIEVycm9yVGFibGUoKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwdXQoaW50IHN0YXRlLCBTdHJpbmcgbXNnLCBpbnQgc2V2ZXJpdHkpIHsKLQkJCVBhY2tldCBwYWNrZXQgPSBuZXcgUGFja2V0KG1zZywgc2V2ZXJpdHkpOwotCQkJbWFwLnB1dChuZXcgSW50ZWdlcihzdGF0ZSksIHBhY2tldCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoaW50IHN0YXRlKSB7Ci0JCQlyZXR1cm4gZ2V0UGFja2V0KHN0YXRlKS5nZXRNZXNzYWdlKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldFNldmVyaXR5KGludCBzdGF0ZSkgewotCQkJcmV0dXJuIGdldFBhY2tldChzdGF0ZSkuZ2V0U2V2ZXJpdHkoKTsKLQkJfQotCi0JCXByaXZhdGUgUGFja2V0IGdldFBhY2tldChpbnQgc3RhdGUpIHsKLQkJCXJldHVybiAoUGFja2V0KSBtYXAuZ2V0KG5ldyBJbnRlZ2VyKHN0YXRlKSk7Ci0JCX0KLQotCQlwcml2YXRlIEhhc2h0YWJsZSBtYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIE5vZGVUeXBlIHsKLQkJc3RhdGljIGZpbmFsIGludCBBVFRSSUJVVEUgPSAwOwotCQlzdGF0aWMgZmluYWwgaW50IEVMRU1FTlQgPSAxOwotCQlzdGF0aWMgZmluYWwgaW50IERPQ1VNRU5UX1RZUEUgPSAyOwotCQlzdGF0aWMgZmluYWwgaW50IFRFWFQgPSAzOwotCQlzdGF0aWMgZmluYWwgaW50IENPTU1FTlQgPSA0OwotCQlzdGF0aWMgZmluYWwgaW50IENEQVRBX1NFQ1RJT04gPSA1OwotCQlzdGF0aWMgZmluYWwgaW50IFBST0NFU1NJTkdfSU5TVFJVQ1RJT04gPSA2OwotCQlzdGF0aWMgZmluYWwgaW50IEVOVElUWV9SRUZFUkVOQ0UgPSA3OwotCi0JCXN0YXRpYyBmaW5hbCBpbnQgTUFYX1RZUEUgPSA4OwotCX0KLQotCS8vIGVycm9yIG1lc3NhZ2VzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19OT19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuTm9fZXJyb3JfX1VJXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOREVGSU5FRF9BVFRSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5VbmRlZmluZWRfYXR0cmlidXRlX25hbWVfX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkRFRklORURfVkFMVUVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlVuZGVmaW5lZF9hdHRyaWJ1dGVfdmFsdWVfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0RVUExJQ0FURV9BVFRSX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5NdWx0aXBsZV92YWx1ZXNfc3BlY2lmaWVkX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX19fMF9fX3VzZXNfX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfQVRUUl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9hdHRyaWJ1dGVfbmFtZV9fXzBfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfQVRUUl9OT19WQUxVRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9hdHRyaWJ1dGVfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9sb2NhdGlvbl9vZl90YWdfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfRFVQTElDQVRFX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuRHVwbGljYXRlX3RhZ19fXzBfX19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfTUlTU0lOR19TVEFSVF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLk5vX3N0YXJ0X3RhZ19fX18wX19fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNTSU5HX0VORF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLk5vX2VuZF90YWdfX19fXzBfX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkVuZF90YWdfX19fXzBfX19fbm90X25lZWRlX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOREVGSU5FRF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlVua25vd25fdGFnX19fMF9fX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNNQVRDSEVEX1RBR19FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVGFnX25hbWVfX18wX19fdXNlc193cm9uZ19fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9UQUdfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfdGFnX25hbWVfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfRElSRUNUSVZFX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5JbnZhbGlkX0pTUF9kaXJlY3RpdmVfX18wX19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19JTlZBTElEX1RFWFRfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfdGV4dF9zdHJpbmdfX18wX19fX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX0lOVkFMSURfQ0hBUl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfdXNlZF9pbl9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5LTk9XTl9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuVW5rbm93bl9lcnJvcl9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfU1RBUlRfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5TdGFydF90YWdfX19fMF9fX19ub3RfY2xvc19FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19VTkNMT1NFRF9FTkRfVEFHX0VSUk9SID0gSFRNTENvcmVNZXNzYWdlcy5FbmRfdGFnX19fX18wX19fX25vdF9jbG9zZV9FUlJPUl87Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19NSVNNQVRDSEVEX0FUVFJfVkFMVUVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkF0dHJpYnV0ZV92YWx1ZV9fXzBfX191c2VzX0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0NPTU1FTlRfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkNvbW1lbnRfbm90X2Nsb3NlZF9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfRE9DVFlQRV9FUlJPUiA9IEhUTUxDb3JlTWVzc2FnZXMuRE9DVFlQRV9kZWNsYXJhdGlvbl9ub3RfY2xfRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfVU5DTE9TRURfUElfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLlByb2Nlc3NpbmdfaW5zdHJ1Y3Rpb25fbm90X0VSUk9SXzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0NEQVRBX1NFQ1RJT05fRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLkNEQVRBX3NlY3Rpb25fbm90X2Nsb3NlZF9fRVJST1JfOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNU0dfSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRyA9IEhUTUxDb3JlTWVzc2FnZXMuX0VSUk9SX1RhZ19fXzBfX19zaG91bGRfYmVfYW5fZW1wdHlfZWxlbWVudF90YWdfMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHX1VOQ0xPU0VEX0FUVFJfVkFMVUVfRVJST1IgPSBIVE1MQ29yZU1lc3NhZ2VzLl9FUlJPUl9BdHRyaWJ1dGVfdmFsdWVfX18wX19fbm90X2Nsb3NlZF9fMTsKLQlwcml2YXRlIHN0YXRpYyBFcnJvclRhYmxlW10gZXJyVGFibGVzID0gbmV3IEVycm9yVGFibGVbTm9kZVR5cGUuTUFYX1RZUEVdOwotCi0Jc3RhdGljIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBOb2RlVHlwZS5NQVhfVFlQRTsgaSsrKSB7Ci0JCQllcnJUYWJsZXNbaV0gPSBuZXcgRXJyb3JUYWJsZSgpOwotCQl9Ci0JCS8vIE5PVEU6IFRoZSBzZXZlcml0aWVzIGFyZSBqdXN0IHN0dWIuICBUaGV5IG11c3QgYmUgcmV2aWV3ZWQuCi0JCS8vIC0tIDgvMzAvMjAwMQotCi0JCS8vIGF0dHJpYnV0ZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBhdHRyVGFibGUgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQVRUUklCVVRFXTsvLyBzaG9ydCBoYW5kCi0JCWF0dHJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJYXR0clRhYmxlLnB1dChVTkRFRklORURfTkFNRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9BVFRSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJYXR0clRhYmxlLnB1dChVTkRFRklORURfVkFMVUVfRVJST1IsIE1TR19VTkRFRklORURfVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlhdHRyVGFibGUucHV0KE1JU01BVENIRURfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlhdHRyVGFibGUucHV0KElOVkFMSURfTkFNRV9FUlJPUiwgTVNHX0lOVkFMSURfQVRUUl9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWF0dHJUYWJsZS5wdXQoSU5WQUxJRF9BVFRSX0VSUk9SLCBNU0dfQVRUUl9OT19WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWF0dHJUYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX0FUVFJfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlhdHRyVGFibGUucHV0KE1JU01BVENIRURfVkFMVUVfRVJST1IsIE1TR19NSVNNQVRDSEVEX0FUVFJfVkFMVUVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJLy88PEQyMTA0MjIKLQkJYXR0clRhYmxlLnB1dChVTkNMT1NFRF9BVFRSX1ZBTFVFLCBNU0dfVU5DTE9TRURfQVRUUl9WQUxVRV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCS8vRDIxMDQyMgotCQkvLyBlbGVtZW50IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGVsZW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsvLyBzaG9ydCBoYW5kCi0JCWVsZW1UYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJZWxlbVRhYmxlLnB1dChVTkRFRklORURfTkFNRV9FUlJPUiwgTVNHX1VOREVGSU5FRF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQllbGVtVGFibGUucHV0KElOVkFMSURfTkFNRV9FUlJPUiwgTVNHX0lOVkFMSURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCWVsZW1UYWJsZS5wdXQoTUlTTUFUQ0hFRF9FUlJPUiwgTVNHX01JU01BVENIRURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChNSVNNQVRDSEVEX0VORF9UQUdfRVJST1IsIE1TR19NSVNNQVRDSEVEX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQllbGVtVGFibGUucHV0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBNU0dfTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJZWxlbVRhYmxlLnB1dChNSVNTSU5HX0VORF9UQUdfRVJST1IsIE1TR19NSVNTSU5HX0VORF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQllbGVtVGFibGUucHV0KFVOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IsIE1TR19VTk5FQ0VTU0FSWV9FTkRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0RJUkVDVElWRV9FUlJPUiwgTVNHX0lOVkFMSURfRElSRUNUSVZFX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCWVsZW1UYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChEVVBMSUNBVEVfRVJST1IsIE1TR19EVVBMSUNBVEVfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZWxlbVRhYmxlLnB1dChDT0VYSVNURU5DRV9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWVsZW1UYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfU1RBUlRfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0JCWVsZW1UYWJsZS5wdXQoVU5DTE9TRURfRU5EX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0VORF9UQUdfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQkJZWxlbVRhYmxlLnB1dChJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHLCBNU0dfSU5WQUxJRF9FTVBUWV9FTEVNRU5UX1RBRywgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0KLQkJLy8gZG9jdW1lbnQgdHlwZSBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBkb2NUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsvLyBzaG9ydCBoYW5kCi0JCWRvY1RhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQlkb2NUYWJsZS5wdXQoRFVQTElDQVRFX0VSUk9SLCBNU0dfRFVQTElDQVRFX1RBR19FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCQlkb2NUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZG9jVGFibGUucHV0KFVOQ0xPU0VEX1RBR19FUlJPUiwgTVNHX1VOQ0xPU0VEX0RPQ1RZUEVfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLkVSUk9SKTsKLQotCQkvLyB0ZXh0IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIHRleHRUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5URVhUXTsKLQkJdGV4dFRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQl0ZXh0VGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfVEVYVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCXRleHRUYWJsZS5wdXQoSU5WQUxJRF9DSEFSX0VSUk9SLCBNU0dfSU5WQUxJRF9DSEFSX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQotCQkvLyBjb21tZW50IGVycm9yIG1hcAotCQlFcnJvclRhYmxlIGNvbW1UYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5DT01NRU5UXTsKLQkJY29tbVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQljb21tVGFibGUucHV0KElOVkFMSURfQ09OVEVOVF9FUlJPUiwgTVNHX0lOVkFMSURfQ09OVEVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyk7Ci0JCWNvbW1UYWJsZS5wdXQoVU5DTE9TRURfVEFHX0VSUk9SLCBNU0dfVU5DTE9TRURfQ09NTUVOVF9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCi0JCS8vIGNkYXRhIHNlY3Rpb24gZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgY2RhdFRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLkNEQVRBX1NFQ1RJT05dOwotCQljZGF0VGFibGUucHV0KE5PTkVfRVJST1IsIE1TR19OT19FUlJPUiwgMCk7Ci0JCWNkYXRUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJY2RhdFRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9DREFUQV9TRUNUSU9OX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUik7Ci0KLQkJLy8gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlcnJvciBtYXAKLQkJRXJyb3JUYWJsZSBwaVRhYmxlID0gZXJyVGFibGVzW05vZGVUeXBlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05dOwotCQlwaVRhYmxlLnB1dChOT05FX0VSUk9SLCBNU0dfTk9fRVJST1IsIDApOwotCQlwaVRhYmxlLnB1dChJTlZBTElEX0NPTlRFTlRfRVJST1IsIE1TR19JTlZBTElEX0NPTlRFTlRfRVJST1IsIFZhbGlkYXRpb25NZXNzYWdlLldBUk5JTkcpOwotCQlwaVRhYmxlLnB1dChVTkNMT1NFRF9UQUdfRVJST1IsIE1TR19VTkNMT1NFRF9QSV9FUlJPUiwgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IpOwotCi0JCS8vIGVudGl0eSByZWZlcmVuY2UgZXJyb3IgbWFwCi0JCUVycm9yVGFibGUgZXJUYWJsZSA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFXTsKLQkJZXJUYWJsZS5wdXQoTk9ORV9FUlJPUiwgTVNHX05PX0VSUk9SLCAwKTsKLQkJZXJUYWJsZS5wdXQoVU5ERUZJTkVEX05BTUVfRVJST1IsIE1TR19VTkRFRklORURfVEFHX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQkJZXJUYWJsZS5wdXQoSU5WQUxJRF9DT05URU5UX0VSUk9SLCBNU0dfSU5WQUxJRF9DT05URU5UX0VSUk9SLCBWYWxpZGF0aW9uTWVzc2FnZS5XQVJOSU5HKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFZhbGlkYXRpb25NZXNzYWdlIGNyZWF0ZU1lc3NhZ2UoRXJyb3JJbmZvIGluZm8pIHsKLQkJU3RyaW5nIGVycm9yTXNnID0gZ2V0RXJyb3JNZXNzYWdlKGluZm8pOwotCQlpbnQgZXJyb3JTZXZlcml0eSA9IGdldEVycm9yU2V2ZXJpdHkoaW5mbyk7Ci0JCXJldHVybiBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoZXJyb3JNc2csIGluZm8uZ2V0T2Zmc2V0KCksIGluZm8uZ2V0TGVuZ3RoKCksIGVycm9yU2V2ZXJpdHkpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoRXJyb3JJbmZvIGluZm8pIHsKLQkJRXJyb3JUYWJsZSB0YWIgPSBnZXRFcnJvclRhYmxlKGluZm8uZ2V0VGFyZ2V0VHlwZSgpKTsKLQkJaWYgKHRhYiA9PSBudWxsKQotCQkJcmV0dXJuIE1TR19VTktOT1dOX0VSUk9SOwotCi0JCVN0cmluZyB0ZW1wbGF0ZSA9IHRhYi5nZXRNZXNzYWdlKGluZm8uZ2V0U3RhdGUoKSk7Ci0JCU9iamVjdFtdIGFyZ3VtZW50cyA9IHtpbmZvLmdldEhpbnQoKX07Ci0JCVN0cmluZyBzID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXMgPSBOTFMuYmluZCh0ZW1wbGF0ZSwgYXJndW1lbnRzKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlzID0gdGVtcGxhdGUgKyAiOiIgKyBhcmd1bWVudHMudG9TdHJpbmcoKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGludCBnZXRFcnJvclNldmVyaXR5KEVycm9ySW5mbyBpbmZvKSB7Ci0JCUVycm9yVGFibGUgdGFiID0gZ2V0RXJyb3JUYWJsZShpbmZvLmdldFRhcmdldFR5cGUoKSk7Ci0JCWlmICh0YWIgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gdGFiLmdldFNldmVyaXR5KGluZm8uZ2V0U3RhdGUoKSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgRXJyb3JUYWJsZSBnZXRFcnJvclRhYmxlKHNob3J0IG5vZGV0eXBlKSB7Ci0JCUVycm9yVGFibGUgdGFiID0gbnVsbDsKLQkJc3dpdGNoIChub2RldHlwZSkgewotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLQkJCQl0YWIgPSBlcnJUYWJsZXNbTm9kZVR5cGUuQVRUUklCVVRFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTEVNRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5ET0NVTUVOVF9UWVBFXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5URVhUXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DT01NRU5UXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5DREFUQV9TRUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OXTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCXRhYiA9IGVyclRhYmxlc1tOb2RlVHlwZS5FTlRJVFlfUkVGRVJFTkNFXTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiB0YWI7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9OYW1lc3BhY2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9OYW1lc3BhY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRhNWY2Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTmFtZXNwYWNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZVZhbGlkYXRvciBleHRlbmRzIFByaW1lVmFsaWRhdG9yIGltcGxlbWVudHMgRXJyb3JTdGF0ZSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgWE1MTlNfUFJFRklYID0gInhtbG5zIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE5TX1NFUEFSQVRPUiA9ICI6IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgTmFtZXNwYWNlVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBOYW1lc3BhY2VWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKEluZGV4ZWRSZWdpb24gbm9kZSkgewotCQlFbGVtZW50IHRhcmdldCA9IChFbGVtZW50KSBub2RlOwotCQlpZiAoaXNYTUxFbGVtZW50KHRhcmdldCkgJiYgaGFzVW5rbm93blByZWZpeCh0YXJnZXQpKSB7Ci0JCQlJRE9NRWxlbWVudCBlID0gKElET01FbGVtZW50KSB0YXJnZXQ7Ci0JCQlpZiAoIWlzVmFsaWRQcmVmaXgoZS5nZXRQcmVmaXgoKSwgdGFyZ2V0KSAmJiAhZS5pc0NvbW1lbnRUYWcoKSkgewotCQkJCS8vIHJlcG9ydCB1bmtub3duIHRhZyBlcnJvci4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoZSwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCWlmIChlcnJvclNlZyAhPSBudWxsKQotCQkJCQlyZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShuZXcgRXJyb3JJbmZvSW1wbChVTkRFRklORURfTkFNRV9FUlJPUiwgZXJyb3JTZWcsIGUpKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gKDIpIGNoZWNrIHByZWZpeCBvZiBlYWNoIGF0dHIgCi0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IHRhcmdldC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJTm9kZSBuID0gYXR0cnMuaXRlbShpKTsKLQkJCWlmICghKG4gaW5zdGFuY2VvZiBJRE9NQXR0cikpCi0JCQkJY29udGludWU7Ci0JCQlJRE9NQXR0ciBhID0gKElET01BdHRyKSBuOwotCQkJU3RyaW5nIHByZWZpeCA9IGEuZ2V0UHJlZml4KCk7Ci0JCQlpZiAoKHByZWZpeCAhPSBudWxsKSAmJiBpc1Vua25vd25BdHRyKGEsIHRhcmdldCkpIHsKLQkJCQkvLyBUaGUgYXR0ciBoYXMgdW5rbm93biBwcmVmaXguICBTbywgY2hlY2sgaXQuCi0JCQkJaWYgKCFpc1ZhbGlkUHJlZml4KHByZWZpeCwgdGFyZ2V0KSkgewotCQkJCQkvLyByZXBvcnQgdW5rbm93biBhdHRyIGVycm9yLgotCQkJCQlJVGV4dFJlZ2lvbiByID0gYS5nZXROYW1lUmVnaW9uKCk7Ci0JCQkJCWlmIChyID09IG51bGwpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaW50IGFfb2Zmc2V0ID0gYS5nZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IGFfbGVuZ3RoID0gYS5nZXROYW1lUmVnaW9uKCkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCXJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKG5ldyBFcnJvckluZm9JbXBsKFVOREVGSU5FRF9OQU1FX0VSUk9SLCBuZXcgU2VnbWVudChhX29mZnNldCwgYV9sZW5ndGgpLCBhKSkpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8vIHByaXZhdGUgbWV0aG9kcwkKLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxFbGVtZW50KEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCXJldHVybiB0YXJnZXQgaW5zdGFuY2VvZiBJRE9NRWxlbWVudDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaGFzVW5rbm93blByZWZpeChFbGVtZW50IHRhcmdldCkgewotCQlyZXR1cm4gaXNVbmtub3duRWxlbWVudCh0YXJnZXQpICYmIENNVXRpbC5pc0ZvcmVpZ24odGFyZ2V0KTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNVbmtub3duRWxlbWVudChFbGVtZW50IHRhcmdldCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWMgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24odGFyZ2V0KTsKLQkJcmV0dXJuIGRlYyA9PSBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1Vua25vd25BdHRyKElET01BdHRyIGF0dHIsIEVsZW1lbnQgdGFyZ2V0KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlYyA9IENNVXRpbC5nZXREZWNsYXJhdGlvbih0YXJnZXQpOwotCQlpZiAoZGVjID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gdW5rbm93bi4KLQkJQ01OYW1lZE5vZGVNYXAgYWRlY2xzID0gZGVjLmdldEF0dHJpYnV0ZXMoKTsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZGVjID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGFkZWNscy5nZXROYW1lZEl0ZW0oYXR0ci5nZXROYW1lKCkpOwotCQlyZXR1cm4gYWRlYyA9PSBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUHJlZml4KFN0cmluZyBwcmVmaXgsIEVsZW1lbnQgZSkgewotCQlpZiAocHJlZml4LmVxdWFscyhYTUxOU19QUkVGSVgpKQotCQkJcmV0dXJuIHRydWU7IC8vICJ4bWxuczpmb28iIGF0dHIgaXMgYWx3YXlzIHZhbGlkLgotCi0JCS8vICgxKSBjaGVjayB0aGUgZWxlbWVudCBoYXMgdGhlIG5hbWVzcGFjZSBkZWZpbml0aW9uIG9yIG5vdC4KLQkJaWYgKGlzVmFsaWRQcmVmaXhXaXRoaW5FbGVtZW50KHByZWZpeCwgZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyAoMikgY2hlY2sgYW5jZXN0b3JzIG9mIHRoZSBlbGVtZW50IGhhdmUgdGhlIG5hbWVzcGFjZSBkZWZpbml0aW9uIG9yIG5vdC4KLQkJRWxlbWVudCBwYXJlbnQgPSBTTVV0aWwuZ2V0UGFyZW50RWxlbWVudChlKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAoaXNWYWxpZFByZWZpeFdpdGhpbkVsZW1lbnQocHJlZml4LCBwYXJlbnQpKQotCQkJCXJldHVybiB0cnVlOwotCQkJcGFyZW50ID0gU01VdGlsLmdldFBhcmVudEVsZW1lbnQocGFyZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRQcmVmaXhXaXRoaW5FbGVtZW50KFN0cmluZyBwcmVmaXgsIEVsZW1lbnQgZSkgewotCQlTdHJpbmcgbnMgPSBYTUxOU19QUkVGSVggKyBOU19TRVBBUkFUT1IgKyBwcmVmaXg7Ci0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IGUuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgbiA9IGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAobiA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG4uZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKG5zLmVxdWFscygoKEF0dHIpIG4pLmdldE5hbWUoKSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL051bGxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIxZjkzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvTnVsbFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkNvbXBvbmVudDsKLQotLyoqCi0gKiBOdWxsVmFsaWRhdG9yIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIGEgcmVwbGFjZW1lbnQgb2YgbnVsbAotICogZm9yIFZhbGlkYXRpb25Db21wb25lbnQgdHlwZS4KLSAqLwotZmluYWwgY2xhc3MgTnVsbFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JcHVibGljIE51bGxWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXBvcnRlcihWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJcmV0dXJuOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJpbWVWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9QcmltZVZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRmMjU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9QcmltZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQ29tcG9uZW50OwotCi1hYnN0cmFjdCBjbGFzcyBQcmltZVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRpb25Db21wb25lbnQgewotCi0JLyoqCi0JICogUHJpbWVWYWxpZGF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgUHJpbWVWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TTVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TTVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJmNmZlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU01VdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWZpbmFsIGNsYXNzIFNNVXRpbCB7Ci0KLQlwcml2YXRlIFNNVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKiBnZXQgYW4gYW5jZXN0b3IgZWxlbWVudCBpZ25vcmluZyBpbXBsaWNpdCBvbmVzLiAqLwotCXB1YmxpYyBzdGF0aWMgRWxlbWVudCBnZXRQYXJlbnRFbGVtZW50KE5vZGUgY2hpbGQpIHsKLQkJaWYgKGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlOb2RlIHAgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCXdoaWxlIChwICE9IG51bGwpIHsKLQkJCWlmIChwLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyZXR1cm4gKEVsZW1lbnQpIHA7Ci0JCQl9Ci0JCQlwID0gcC5nZXRQYXJlbnROb2RlKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TZWdtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU2VnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWZkMzdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TZWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotcHVibGljIGNsYXNzIFNlZ21lbnQgewotCi0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JLyoqCi0JICovCi0JcHVibGljIFNlZ21lbnQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIFNlZ21lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vZmZzZXQgPSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJdGhpcy5sZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogTk9URTogJ3N0YXJ0JyBhbmQgJ2VuZCcgbXVzdCBiZSB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgY29udGlndW91cyByZWdpb25zLgotCSAqIE90aGVyd2lzZSwgdGhpcyBjbGFzcyBjYW5ub3Qgd29yayBjb3JyZWN0bHkuCi0JICovCi0JcHVibGljIFNlZ21lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5vZmZzZXQgPSBzdGFydC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kT2Zmc2V0ID0gKGVuZCA9PSBudWxsKSA/IHN0YXJ0LmdldEVuZE9mZnNldCgpIDogZW5kLmdldEVuZE9mZnNldCgpOwotCQl0aGlzLmxlbmd0aCA9IGVuZE9mZnNldCAtIHRoaXMub2Zmc2V0OwotCX0KLQotCS8vcHVibGljIFNlZ21lbnQoSVRleHRSZWdpb24gc3RhcnQsIElUZXh0UmVnaW9uIGVuZCkgewotCS8vCXN1cGVyKCk7Ci0JLy8JdGhpcy5vZmZzZXQgPSBzdGFydC5nZXRTdGFydE9mZnNldCgpOwotCS8vCWludCBlbmRPZmZzZXQgPSAoZW5kID09IG51bGwpID8gc3RhcnQuZ2V0RW5kT2Zmc2V0KCkgOiBlbmQuZ2V0RW5kT2Zmc2V0KCk7Ci0JLy8JdGhpcy5sZW5ndGggPSBlbmRPZmZzZXQgLSB0aGlzLm9mZnNldDsKLQkvL30KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gdGhpcy5vZmZzZXQ7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TeW50YXhWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9TeW50YXhWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2YWM4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvU3ludGF4VmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotY2xhc3MgU3ludGF4VmFsaWRhdG9yIGV4dGVuZHMgUHJpbWVWYWxpZGF0b3IgaW1wbGVtZW50cyBFcnJvclN0YXRlIHsKLQotCi0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkUmVnaW9uKElUZXh0UmVnaW9uIHJnbikgewotCQlTdHJpbmcgdHlwZSA9IHJnbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIG5vIHR5cGUgaXMgaW52YWxpZC4KLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOIHx8IHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgdHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRhZykgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHRhZy5nZXRSZWdpb25zKCk7Ci0JCUl0ZXJhdG9yIGl0ZXIgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmduID0gKElUZXh0UmVnaW9uKSBpdGVyLm5leHQoKTsKLQkJCWlmIChyZ24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FKQotCQkJCXJldHVybiB0YWcuZ2V0VGV4dChyZ24pOwotCQl9Ci0JCXJldHVybiAiIjsvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIHByaXZhdGUgYm9vbGVhbiBpc0VtcHR5Q29udGVudChDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsKSB7Ci0JCXJldHVybiAoZGVjbCAhPSBudWxsKSAmJiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQlwdWJsaWMgU3ludGF4VmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICgodHlwZSA9PSBTeW50YXhWYWxpZGF0b3IuY2xhc3MpIHx8IHN1cGVyLmlzQWRhcHRlckZvclR5cGUodHlwZSkpOwotCX0KLQotCWNsYXNzIEVsZW1lbnRJbmZvIHsKLQkJcHVibGljIEVsZW1lbnRJbmZvKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBJRE9NRWxlbWVudCB0YXJnZXQgPSBudWxsOwotCQlwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IG51bGw7Ci0JCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnID0gbnVsbDsKLQkJcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnID0gbnVsbDsKLQkJcHVibGljIGJvb2xlYW4gaGFzU3RhcnRUYWcgPSBmYWxzZTsKLQkJcHVibGljIGJvb2xlYW4gaGFzRW5kVGFnID0gZmFsc2U7Ci0JCXB1YmxpYyBib29sZWFuIGlzWEhUTUwgPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlKSB7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBpbmRleGVkTm9kZTsKLQkJdmFsaWRhdGVDaGlsZHJlbihub2RlKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlpZiAoIShub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbmZvIGluZm8gPSBuZXcgRWxlbWVudEluZm8oKTsKLQkJaW5mby50YXJnZXQgPSAoSURPTUVsZW1lbnQpIG5vZGU7Ci0KLQkJLy8gZ2F0aGVyIGluZm9ybWF0aW9uIHRvIHZhbGlkYXRlIGZyb20gdGFyZ2V0IGF0IG9uY2UuCi0JCWdldEluZm8oaW5mbyk7Ci0KLQkJaWYgKGluZm8udGFyZ2V0LmlzR2xvYmFsVGFnKCkpIHsKLQkJCXZhbGlkYXRlVGFncyhpbmZvKTsKLQkJCXZhbGlkYXRlTmFtZXMoaW5mbyk7Ci0JCQlpZiAoaW5mby5kZWNsICE9IG51bGwgJiYgaW5mby5pc1hIVE1MKSB7Ci0JCQkJdmFsaWRhdGVUYWdDYXNlKGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdldEluZm8oRWxlbWVudEluZm8gaW5mbykgewotCQlpbmZvLmRlY2wgPSBDTVV0aWwuZ2V0RGVjbGFyYXRpb24oaW5mby50YXJnZXQpOwotCQlpbmZvLnN0YXJ0VGFnID0gaW5mby50YXJnZXQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaW5mby5lbmRUYWcgPSBpbmZvLnRhcmdldC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQlpbmZvLmhhc1N0YXJ0VGFnID0gKGluZm8uc3RhcnRUYWcgIT0gbnVsbCk7Ci0JCWluZm8uaGFzRW5kVGFnID0gKGluZm8uZW5kVGFnICE9IG51bGwpOwotCi0JCURvY3VtZW50IGRvYyA9IGluZm8udGFyZ2V0LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKCEoZG9jIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHR5cGVpZCA9ICgoSURPTURvY3VtZW50KSBkb2MpLmdldERvY3VtZW50VHlwZUlkKCk7Ci0JCWlmICh0eXBlaWQgIT0gbnVsbCkgewotCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0RW50cnkodHlwZWlkKTsKLQkJCWluZm8uaXNYSFRNTCA9IChlbnRyeSAhPSBudWxsICYmIGVudHJ5LmlzWE1MVHlwZSgpKTsKLQkJfQotCX0KLQotCWNsYXNzIFRhZ0Vycm9ySW5mb0ltcGwgZXh0ZW5kcyBBYnN0cmFjdEVycm9ySW5mbyB7Ci0JCXByaXZhdGUgU3RyaW5nIGhpbnQgPSBudWxsOwotCi0JCXB1YmxpYyBUYWdFcnJvckluZm9JbXBsKGludCBzdGF0ZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YWcsIFN0cmluZyBoaW50KSB7Ci0JCQlzdXBlcihzdGF0ZSwgbmV3IFNlZ21lbnQodGFnKSk7Ci0JCQl0aGlzLmhpbnQgPSBoaW50OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRIaW50KCkgewotCQkJcmV0dXJuIGhpbnQ7Ci0JCX0KLQotCQlwdWJsaWMgc2hvcnQgZ2V0VGFyZ2V0VHlwZSgpIHsKLQkJCXJldHVybiBOb2RlLkVMRU1FTlRfTk9ERTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VuZFRhZ0NvcnJ1cHRlZChFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gaW5mby5lbmRUYWcuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlJdGVyYXRvciBpdGVyID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJnbiA9IChJVGV4dFJlZ2lvbikgaXRlci5uZXh0KCk7Ci0JCQlpZiAoIWlzVmFsaWRSZWdpb24ocmduKSkKLQkJCQlyZXR1cm4gdHJ1ZTsgLy8gZm91bmQgaW52YWxpZCByZWdpb24gdHlwZS4KLQkJfQotCQlyZXR1cm4gZmFsc2U7IC8vIGFsbCByZWdpb25zIGFyZSB2YWxpZC4KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRFbmRUYWdGdWxsVGV4dChFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCVN0cmluZyBoaW50ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGluZm8uZW5kVGFnLmdldFJlZ2lvbnMoKTsKLQkJSXRlcmF0b3IgaXRlciA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZ24gPSAoSVRleHRSZWdpb24pIGl0ZXIubmV4dCgpOwotCQkJU3RyaW5nIHR5cGUgPSByZ24uZ2V0VHlwZSgpOwotCQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkKLQkJCQljb250aW51ZTsKLQkJCWhpbnQgKz0gaW5mby5lbmRUYWcuZ2V0RnVsbFRleHQocmduKTsKLQkJfQotCQlyZXR1cm4gaGludDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVwb3J0Q29ycnVwdGVkRW5kVGFnRXJyb3IoRWxlbWVudEluZm8gaW5mbykgewotCQlTdHJpbmcgaGludCA9IGdldEVuZFRhZ0Z1bGxUZXh0KGluZm8pOwotCQlUYWdFcnJvckluZm9JbXBsIGVycm9yID0gbmV3IFRhZ0Vycm9ySW5mb0ltcGwoVU5ERUZJTkVEX05BTUVfRVJST1IsIGluZm8uZW5kVGFnLCBoaW50KTsKLQkJdGhpcy5yZXBvcnRlci5yZXBvcnQoTWVzc2FnZUZhY3RvcnkuY3JlYXRlTWVzc2FnZShlcnJvcikpOwotCX0KLQotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZVRhZ3MoRWxlbWVudEluZm8gaW5mbykgewotCQlpZiAoaW5mby5oYXNTdGFydFRhZykgewotCQkJaWYgKCFpbmZvLnRhcmdldC5pc1N0YXJ0VGFnQ2xvc2VkKCkpIHsKLQkJCQkvLyBNYXJrIHRoZSB3aG9sZSBTVEFSVCB0YWcgYXMgYW4gZXJyb3Igc2VnbWVudC4KLQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby5zdGFydFRhZyk7Ci0JCQkJcmVwb3J0KFVOQ0xPU0VEX1RBR19FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChpbmZvLmhhc0VuZFRhZykgewotCQkJCWlmIChpbmZvLmRlY2wgIT0gbnVsbCkgewotCQkJCQlpZiAoQ01VdGlsLmlzSFRNTChpbmZvLmRlY2wpICYmICFpbmZvLnRhcmdldC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJCWlmIChpbmZvLnRhcmdldC5pc0NvbnRhaW5lcigpKSB7Ci0JCQkJCQkJLy8gU2V0IHRoZSBlcnJvciBtYXJrIHRvIHRoZSBzdGFydCBvZiB0aGUgZWxlbWVudC4KLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby50YXJnZXQuZ2V0U3RhcnRPZmZzZXQoKSwgMCk7Ci0JCQkJCQkJcmVwb3J0KE1JU1NJTkdfU1RBUlRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gTWFyayB0aGUgd2hvbGUgRU5EIHRhZyBhcyBhbiBlcnJvciBzZWdtZW50LgotCQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLmVuZFRhZyk7Ci0JCQkJCQkJcmVwb3J0KFVOTkVDRVNTQVJZX0VORF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoaW5mby5pc1hIVE1MKSB7Ci0JCQkJCQlTZWdtZW50IGVycm9yU2VnID0gbmV3IFNlZ21lbnQoaW5mby50YXJnZXQuZ2V0U3RhcnRPZmZzZXQoKSwgMCk7Ci0JCQkJCQlyZXBvcnQoTUlTU0lOR19TVEFSVF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoaW5mby5oYXNFbmRUYWcpIHsKLQkJCWlmICghaW5mby50YXJnZXQuaXNDbG9zZWQoKSkgewotCQkJCS8vIFNldCB0aGUgd2hvbGUgRU5EIHRhZyBhcyBlcnJvciBzZWdtZW50LgotCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLmVuZFRhZyk7Ci0JCQkJcmVwb3J0KFVOQ0xPU0VEX0VORF9UQUdfRVJST1IsIGVycm9yU2VnLCBpbmZvLnRhcmdldCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoaW5mby5pc1hIVE1MKSB7IC8vIFhIVE1MCi0JCQkJaWYgKCFpbmZvLnRhcmdldC5pc0VtcHR5VGFnKCkpIHsKLQkJCQkJaWYgKGlzRW1wdHlDb250ZW50KGluZm8uZGVjbCkpIHsKLQkJCQkJCS8vIEVNUFRZIGVsZW1lbnQgc2hvdWxkIGJlIHdyaXR0ZW4gaW4gPC4uLi8+IGZvcm0uCi0JCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQoaW5mby50YXJnZXQsIEZNVXRpbC5TRUdfU1RBUlRfVEFHKTsKLQkJCQkJCXJlcG9ydChJTlZBTElEX0VNUFRZX0VMRU1FTlRfVEFHLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gZW5kIHRhZyBpcyByZXF1aXJlZC4KLQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLnRhcmdldC5nZXRFbmRPZmZzZXQoKSwgMCk7Ci0JCQkJCQlyZXBvcnQoTUlTU0lOR19FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7IC8vIEhUTUwKLQkJCQlpZiAoaW5mby5oYXNTdGFydFRhZykgewotCQkJCQlpZiAoaW5mby5kZWNsICE9IG51bGwgJiYgQ01VdGlsLmlzSFRNTChpbmZvLmRlY2wpICYmICFpbmZvLnRhcmdldC5pc0VtcHR5VGFnKCkgJiYgIUNNVXRpbC5pc0VuZFRhZ09taXNzaWJsZShpbmZvLmRlY2wpKSB7Ci0JCQkJCQkvLyBTZXQgdGhlIGVycm9yIG1hcmsgdG8gdGhlIGVuZCBvZiB0aGUgZWxlbWVudC4KLQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChpbmZvLnRhcmdldC5nZXRFbmRPZmZzZXQoKSwgMCk7Ci0JCQkJCQlyZXBvcnQoTUlTU0lOR19FTkRfVEFHX0VSUk9SLCBlcnJvclNlZywgaW5mby50YXJnZXQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogcGVyZm9ybSB2YWxpZGF0aW9uIGFib3V0IHRhZyBuYW1lIGRlZmluaXRpb24uICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTmFtZXMoRWxlbWVudEluZm8gaW5mbykgewotCQlib29sZWFuIGNvcnJ1cHRlZCA9IGluZm8uaGFzRW5kVGFnICYmIGlzRW5kVGFnQ29ycnVwdGVkKGluZm8pOwotCQlpZiAoaW5mby5kZWNsID09IG51bGwpIHsKLQkJCS8vIElmIG5vIGRlY2xhcmF0aW9uIGlzIHJldHJpZXZlZCwgdGhlIHRhcmdldCBpcyByZWFsbHkKLQkJCS8vIHVua25vd24gZWxlbWVudC4KLQkJCWlmICghaW5mby5oYXNTdGFydFRhZyAmJiBjb3JydXB0ZWQpIHsKLQkJCQlyZXBvcnRDb3JydXB0ZWRFbmRUYWdFcnJvcihpbmZvKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBGTVV0aWwuZ2V0U2VnbWVudChpbmZvLnRhcmdldCwgRk1VdGlsLlNFR19TVEFSVF9UQUcpOwotCQkJCXJlcG9ydChVTkRFRklORURfTkFNRV9FUlJPUiwgZXJyb3JTZWcsIGluZm8udGFyZ2V0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIEV2ZW4gaWYgYSBkZWNsYXJhdGlvbiBjb3VsZCBiZSByZXRyaWV2ZWQsIGlmIHRoZSBlbmQKLQkJCS8vIHRhZyBpcyBjb3JydXB0ZWQsIGl0IHNob3VsZCBiZSByZXBvcnRlZCBhcyB1bmRlZmluZWQKLQkJCS8vIG5hbWUuIChEMjAyNDkzKQotCQkJaWYgKGNvcnJ1cHRlZCkgewotCQkJCXJlcG9ydENvcnJ1cHRlZEVuZFRhZ0Vycm9yKGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JLyogcGVyZm9ybSB2YWxpZGF0aW9uIHRhZyBjYXNlIG9ubHkgZm9yIFhIVE1MIGRvY3VtZW50ICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVGFnQ2FzZShFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCVN0cmluZyBkZWNsYXJlZCA9IGluZm8uZGVjbC5nZXRFbGVtZW50TmFtZSgpOwotCQlTdHJpbmcgc3RhcnRUYWdOYW1lID0gIiI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZW5kVGFnTmFtZSA9ICIiOy8vJE5PTi1OTFMtMSQKLQkJaWYgKGRlY2xhcmVkID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gc3RhcnQgdGFnCi0JCWlmIChpbmZvLmhhc1N0YXJ0VGFnKSB7Ci0JCQlzdGFydFRhZ05hbWUgPSBnZXRUYWdOYW1lKGluZm8uc3RhcnRUYWcpOwotCQkJaWYgKCFkZWNsYXJlZC5lcXVhbHMoc3RhcnRUYWdOYW1lKSkgewotCQkJCVRhZ0Vycm9ySW5mb0ltcGwgZXJyb3IgPSBuZXcgVGFnRXJyb3JJbmZvSW1wbChNSVNNQVRDSEVEX0VSUk9SLCBpbmZvLnN0YXJ0VGFnLCBzdGFydFRhZ05hbWUpOwotCQkJCXRoaXMucmVwb3J0ZXIucmVwb3J0KE1lc3NhZ2VGYWN0b3J5LmNyZWF0ZU1lc3NhZ2UoZXJyb3IpKTsKLQkJCX0KLQkJfQotCQkvLyBlbmQgdGFnCi0JCWlmIChpbmZvLmhhc0VuZFRhZykgewotCQkJZW5kVGFnTmFtZSA9IGdldFRhZ05hbWUoaW5mby5lbmRUYWcpOwotCQkJaWYgKCFpbmZvLmhhc1N0YXJ0VGFnIHx8ICghZW5kVGFnTmFtZS5lcXVhbHMoc3RhcnRUYWdOYW1lKSkpIHsKLQkJCQlpZiAoIWRlY2xhcmVkLmVxdWFscyhlbmRUYWdOYW1lKSkgewotCQkJCQlUYWdFcnJvckluZm9JbXBsIGVycm9yID0gbmV3IFRhZ0Vycm9ySW5mb0ltcGwoTUlTTUFUQ0hFRF9FUlJPUiwgaW5mby5lbmRUYWcsIGVuZFRhZ05hbWUpOwotCQkJCQl0aGlzLnJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKGVycm9yKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ2hpbGRyZW4oTm9kZSB0YXJnZXQpIHsKLQkJaWYgKCh0YXJnZXQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgJiYgQ01VdGlsLmlzRm9yZWlnbigoRWxlbWVudCkgdGFyZ2V0KSkKLQkJCXJldHVybjsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSB0YXJnZXQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCXN3aXRjaCAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOgotCQkJCQl7Ci0JCQkJCQlJRE9NTm9kZSB0ZXh0ID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCQkJCWludCBjaGFyT2Zmc2V0ID0gdmFsaWRhdGVUZXh0U291cmNlKHRleHQpOwotCQkJCQkJaWYgKGNoYXJPZmZzZXQgPj0gMCkgewotCQkJCQkJCWNoYXJPZmZzZXQgKz0gdGV4dC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCVNlZ21lbnQgZXJyb3JTZWcgPSBuZXcgU2VnbWVudChjaGFyT2Zmc2V0LCAxKTsKLQkJCQkJCQlpZiAoZXJyb3JTZWcgIT0gbnVsbCkKLQkJCQkJCQkJcmVwb3J0KElOVkFMSURfQ0hBUl9FUlJPUiwgZXJyb3JTZWcsIHRleHQpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDoKLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCQkJewotCQkJCQkJSURPTU5vZGUgdGFnID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCQkJCWlmICghdGFnLmlzQ2xvc2VkKCkpIHsKLQkJCQkJCQlTZWdtZW50IGVycm9yU2VnID0gRk1VdGlsLmdldFNlZ21lbnQodGFnLCBGTVV0aWwuU0VHX1dIT0xFX1RBRyk7Ci0JCQkJCQkJaWYgKGVycm9yU2VnICE9IG51bGwpCi0JCQkJCQkJCXJlcG9ydChVTkNMT1NFRF9UQUdfRVJST1IsIGVycm9yU2VnLCB0YWcpOwotCQkJCQkJfQotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQlkZWZhdWx0IDoKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGludCB2YWxpZGF0ZVRleHRTb3VyY2UoSURPTU5vZGUgdGV4dCkgewotCQl0cnkgewotCQkJU291cmNlVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBTb3VyY2VWYWxpZGF0b3IodGV4dCk7Ci0JCQl2YWxpZGF0b3IudmFsaWRhdGVTb3VyY2UodGV4dC5nZXRTb3VyY2UoKSk7Ci0JCX0KLQkJY2F0Y2ggKEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gZXgpIHsKLQkJCXJldHVybiBleC5nZXRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcG9ydChpbnQgc3RhdGUsIFNlZ21lbnQgZXJyb3JTZWcsIE5vZGUgbm9kZSkgewotCQlFcnJvckluZm8gaW5mbyA9IG5ldyBFcnJvckluZm9JbXBsKHN0YXRlLCBlcnJvclNlZywgbm9kZSk7Ci0JCXJlcG9ydGVyLnJlcG9ydChNZXNzYWdlRmFjdG9yeS5jcmVhdGVNZXNzYWdlKGluZm8pKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlL3RleHQvSUhUTUxQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdGV4dC9JSFRNTFBhcnRpdGlvbnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxOTA0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL2NvcmUvdGV4dC9JSFRNTFBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0OwotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24KLSAqIHR5cGVzIGZvciBIVE1MLiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZAotICogaGVyZSBkaXJlY3RseS4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIVE1MUGFydGl0aW9ucyB7Ci0KLQlTdHJpbmcgSFRNTF9ERUZBVUxUID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgSFRNTF9ERUNMQVJBVElPTiA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBIVE1MX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIFNDUklQVCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5TQ1JJUFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFNUWUxFID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLlNUWUxFIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gSVNTVUU6IEkgdGhpbmsgbWV0YSB0YWcgYXJlYXMgYXJlIGhlcmUgdG9vPwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDA5Y2U4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBraW5kPSJzcmMiIHBhdGg9InNyYy1odG1sLXZhbGlkYXRpb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiBraW5kPSJjb24iPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvY3NzL2NvcmUvKioiLz4KLQkJCTxhY2Nlc3NydWxlIGtpbmQ9ImFjY2Vzc2libGUiIHBhdHRlcm49Im9yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS91aS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3NzZS8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QveG1sL3VpLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvaHRtbC9jb3JlLyoqIi8+Ci0gICAgICAgICAgICA8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvdmFsaWRhdGlvbi8qKiIvPgotICAgICAgICAgICAgPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0L2Nzcy91aS8qKiIvPgotCQk8L2FjY2Vzc3J1bGVzPgotCTwvY2xhc3NwYXRoZW50cnk+Ci0JPGNsYXNzcGF0aGVudHJ5IGtpbmQ9Im91dHB1dCIgcGF0aD0iYmluIi8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyMzlmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbgotaHRtbGVkaXRvci5qYXIKLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDAxNWZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wcm9qZWN0aW9ucGVyZj1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YmVlNzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5odG1sLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VjNTc1MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY3YmFjNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgQXVnIDE5IDE2OjMxOjQzIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjRkN2I2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWk7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmF1dG9lZGl0O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZGVyaXZlZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWk7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3I7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5O3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc2VhcmNoO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuc3R5bGU7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzO3gtaW50ZXJuYWw6PXRydWUsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLndpemFyZDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvcjtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkuZWRpdG9ycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4xMDAsMS4xLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4wLjEwMCwxLjEuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC51aTtidW5kbGUtdmVyc2lvbj0iWzEuMC4wLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24ubW9kdWxlY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4NmVkNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBpY29ucy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgdGVtcGxhdGVzLyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc291cmNlLi4gPSBzcmMvLFwKLSAgICAgICAgICAgc3JjLWh0bWwtdmFsaWRhdGlvbi8KLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2h0bWxfd2l6LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld2h0bWxfd2l6LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3NWFhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9uZXdodG1sX3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdodG1sX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9uZXdodG1sX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NmUxOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3aHRtbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFibGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTliNDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWJsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWFuY2hvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWFuY2hvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODk5MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1ib2R5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYm9keS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNWZhOTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1ib2R5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctYnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0M2ZjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWZvbnQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJiNDBjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWZvbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb3JtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMTM5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1mb3JtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWY1MTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWh0bWwuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmIzOWJhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWh0bWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS1tYXAuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS1tYXAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMyMzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UtbWFwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ODhjMWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwODQ2MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1qc3AuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZjgxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLXRlbXBsYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctdGl0bGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10aXRsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjkwOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy10aXRsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdmYjMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9pY29ucy9mdWxsL3dpemJhbi9uZXdoZmlsZV93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDNlMWVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvaWNvbnMvZnVsbC93aXpiYW4vbmV3aGZpbGVfd2l6LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjYzZTM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNzoyMzozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYxN2Q5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1IVE1MIFVJIFNvdXJjZSBFZGl0b3IKLUhUTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9SFRNTCBFZGl0b3IKLUhUTUxfRmlsZXMubmFtZT1IVE1MIEZpbGVzCi1IVE1MX1NvdXJjZS5uYW1lPUhUTUwgU291cmNlCi1IVE1MX1RlbXBsYXRlcy5uYW1lPUhUTUwgVGVtcGxhdGVzCi1IVE1MX1N0eWxlcy5uYW1lPUhUTUwgU3R5bGVzCi1XZWJDb250ZW50U2V0dGluZ3MubmFtZT1XZWIgQ29udGVudCBTZXR0aW5ncwotRGV2aWNlX1Byb2ZpbGVfRW50cnlfUHJvdmlkZXJfRXh0ZW5zaW9uLm5hbWU9RGV2aWNlIFByb2ZpbGUgRW50cnkgUHJvdmlkZXIgRXh0ZW5zaW9uCi1BbGxfSFRNTF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1BbGwgSFRNTAotSFRNTF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9TmV3IEhUTUwKLUhUTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPUhUTUwgVGFnCi1IVE1MX0F0dHJpYnV0ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1IVE1MIEF0dHJpYnV0ZQotSFRNTF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9SFRNTCBBdHRyaWJ1dGUgdmFsdWUKLUhUTUxfU3ludGF4X1ZhbGlkYXRvci5uYW1lPUhUTUwgU3ludGF4IFZhbGlkYXRvcgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotI29yZy5lY2xpcHNlLnVpLm5ld1dpemFyZHMgZXh0ZW5zaW9uIHBvaW50Ci1fVUlfV0laQVJEX05BTUUgPSBIVE1MCi1fVUlfV0laQVJEX0NSRUFURV9ORVdfRklMRSA9IENyZWF0ZSBhIG5ldyBIVE1MIHBhZ2UKLSMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIwotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLVRvZ2dsZUNvbW1lbnRfbGFiZWw9VG9nZ2xlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotQWRkQmxvY2tDb21tZW50X2xhYmVsPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcD1BZGQgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcD1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbD1FbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPU5leHQgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPVByZXZpb3VzIEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw9UmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhMjZlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciIgbmFtZT0iJURldmljZV9Qcm9maWxlX0VudHJ5X1Byb3ZpZGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9kZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzIj4KLQkJPGVkaXRvcgotCQkJbmFtZT0iJUhUTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL2Z1bGwvb2JqMTYvc291cmNlRWRpdG9yLmdpZiIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQWN0aW9uQ29udHJpYnV0b3JIVE1MIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uIj4KLQkJPHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzb3VyY2VlZGl0aW5ndGV4dHRvb2xzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuWE1MU291cmNlRWRpdGluZ1RleHRUb29scyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJjaGFyYWN0ZXJwYWlybWF0Y2hlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0LkhUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9InN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24uU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNvcnJlY3Rpb25hc3Npc3RhbnQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJIVE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcywgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkucHJlZmVyZW5jZXMuc291cmNlLCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMsIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnN0eWxlcyIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24iPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJGb3JIVE1MIj4KLQkJCTxjb250ZW50VHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIiAvPgotCQk8L2FkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPCEtLSBIVE1MIFBSRUZFUkVOQ0UgUEFHRVMtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVIVE1MX0ZpbGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcyI+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVIVE1MX1NvdXJjZS5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkhUTUxTb3VyY2VQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy5zb3VyY2UiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9UZW1wbGF0ZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMiPgotCQk8L3BhZ2U+Ci0JCTxwYWdlCi0JCQluYW1lPSIlSFRNTF9TdHlsZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5IVE1MQ29sb3JQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnByZWZlcmVuY2VzLnN0eWxlcyI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIFdlYiBjb250ZW50IHNldHRpbmdzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByb3BlcnR5UGFnZXMiPgotCQk8IS0tIGZvciBqMmVlIHdlYiBwcm9qZWN0IC0tPgotCQk8cGFnZQotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0IgotCQkJYWRhcHRhYmxlPSJ0cnVlIgotCQkJbmFtZT0iJVdlYkNvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLlByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuZHluYW1pY3Byb2plY3Rwcm9wZXJ0eXBhZ2UiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3QiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0ianN0LndlYiIgLz4KLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0id3N0LndlYiIgLz4KLQkJCQkJCTwvb3I+Ci0JCQkJCTwvYWRhcHQ+Ci0JCQkJPC9hbmQ+IAotCQkJPC9lbmFibGVkV2hlbj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJYWRhcHRhYmxlPSJ0cnVlIgotCQkJbmFtZT0iJVdlYkNvbnRlbnRTZXR0aW5ncy5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLldlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5XZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiPgotICAgICAgICAgCTxlbmFibGVkV2hlbj4KLSAgICAgICAgICAgICAgIAk8YW5kPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiPgotCQkJCQkJPG9yPiAKLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSIgLz4KLQkJCQkJCQk8dGVzdCAKLQkJCQkJCQkJZm9yY2VQbHVnaW5BY3RpdmF0aW9uPSJ0cnVlIgotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuY29udGVudFR5cGVJZCIKLQkJCQkJCQkJdmFsdWU9Im9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCQkJCQkJPHRlc3QgCi0JCQkJCQkJCWZvcmNlUGx1Z2luQWN0aXZhdGlvbj0idHJ1ZSIKLQkJCQkJCQkJcHJvcGVydHk9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLmNvbnRlbnRUeXBlSWQiCi0JCQkJCQkJCXZhbHVlPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuY3NzanNwZnJhZ21lbnRzb3VyY2UiIC8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvYW5kPiAKLQkJCTwvZW5hYmxlZFdoZW4+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIEVkaXRvciBhY3Rpb25zZXRzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmFjdGlvblNldFBhcnRBc3NvY2lhdGlvbnMiPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuZWRpdC50ZXh0LmFjdGlvblNldC5hbm5vdGF0aW9uTmF2aWdhdGlvbiI+Ci0JCQk8cGFydCBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSI+Ci0JCQk8L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQWxsX0hUTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfYWxsIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSFRNTF9OZXdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfbmV3Ij4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSFRNTF9UYWdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfdGFnIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSFRNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfYXR0cmlidXRlIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlSFRNTF9BdHRyaWJ1dGVfdmFsdWVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIgotCQkJaWQ9Imh0bWxfYXR0cmlidXRlX3ZhbHVlIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGluY2x1ZGUKLQkJCWZpbGU9InRlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotCQkJdHJhbnNsYXRpb25zPSIkbmwkL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMucHJvcGVydGllcyI+Ci0JCTwvaW5jbHVkZT4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIGluaXRpYWxpemUgaHRtbCB1aSBwcmVmZXJlbmNlcyAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIERvY3VtZW50IHByb3ZpZGVyIGZvciBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLmRvY3VtZW50UHJvdmlkZXJzIj4KLQkJPHByb3ZpZGVyCi0JCQlpbnB1dFR5cGVzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5FeHRlcm5hbEZpbGVEb2N1bWVudFByb3ZpZGVyIj4KLQkJPC9wcm92aWRlcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTwhLS0gV29ya2JlbmNoIHZhbGlkYXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJaWQ9IkhUTUxWYWxpZGF0b3IiCi0JCW5hbWU9IiVIVE1MX1N5bnRheF9WYWxpZGF0b3IubmFtZSIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0JCTx2YWxpZGF0b3I+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouaHRtbCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5odG0iPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IioueGh0bWwiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouaHRwbCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi53bWwiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNwIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzcGYiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCW5hbWVGaWx0ZXI9IiouanNmIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQluYW1lRmlsdGVyPSIqLmpzdiI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJbmFtZUZpbHRlcj0iKi5qdHBsIj4KLQkJCTwvZmlsdGVyPgotCQkJPGhlbHBlcgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uLkhUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyIj4KLQkJCTwvaGVscGVyPgotCQkKLQkJPHJ1bgotICAgICAgICAgICAgIGFzeW5jPSJ0cnVlIgotICAgICAgICAgICAgIGZ1bGxCdWlsZD0idHJ1ZSIKLSAgICAgICAgICAgICBpbmNyZW1lbnRhbD0idHJ1ZSIKLSAgICAgICAgICAgICBlbmFibGVkPSJ0cnVlIgotCQkJIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uLkhUTUxWYWxpZGF0b3IiPgotICAgICAgICAgPC9ydW4+Ci0JCTwvdmFsaWRhdG9yPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBBcyB5b3UgdHlwZSB2YWxpZGF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkJCQkgIC0tPgotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uIj4KLQkJPHZhbGlkYXRvcgotCQkJc2NvcGU9InBhcnRpYWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbi5IVE1MVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uaHRtbHN5bnRheHZhbGlkYXRvciI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLkhUTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIi8+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIvPgotCQkJPC9jb250ZW50VHlwZUlkZW50aWZpZXI+Ci0JCTwvdmFsaWRhdG9yPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0icGFydGlhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24ubWFya3VwdmFsaWRhdG9yIj4KLQkJCTxjb250ZW50VHlwZUlkZW50aWZpZXIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCi0JPCEtLSBOZXcgSFRNTCB3aXphcmQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkubmV3V2l6YXJkcyI+Ci0JCTx3aXphcmQKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQuTmV3SFRNTFdpemFyZCIKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05BTUUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLQkJCWljb249IiRubCQvaWNvbnMvZnVsbC9ldG9vbDE2L25ld2h0bWxfd2l6LmdpZiI+Ci0JCQk8ZGVzY3JpcHRpb24+JV9VSV9XSVpBUkRfQ1JFQVRFX05FV19GSUxFPC9kZXNjcmlwdGlvbj4KLQkJCTxzZWxlY3Rpb24gY2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSIgLz4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIEFkZCBuZXcgSFRNTCB3aXphcmQgdG8gSjJFRSBQcm9qZWN0IE5hdmlnYXRvciAtLT4KLQk8ZXh0ZW5zaW9uCi0JCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb21tb25XaXphcmQubmV3SFRNTCIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLm5hdmlnYXRvci5uYXZpZ2F0b3JDb250ZW50Ij4KLQkJPGNvbW1vbldpemFyZAotICAgICAgICBtZW51R3JvdXBJZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgdHlwZT0ibmV3IgotICAgICAgICB3aXphcmRJZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkLk5ld0hUTUxXaXphcmQiPgotCQkJPGVuYWJsZW1lbnQ+Ci0JCQkJPG9yPgotCQkJCQk8YWRhcHQgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlIj4KLQkJCQkJCTxvcj4KLQkJCQkJCQk8dGVzdAotCQkJCQkJCQlwcm9wZXJ0eT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUucHJvamVjdEZhY2V0IgotCQkJCQkJCQl2YWx1ZT0id3N0LndlYiIvPgotCQkJCQkJCTx0ZXN0Ci0JCQkJCQkJCXByb3BlcnR5PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5wcm9qZWN0RmFjZXQiCi0JCQkJCQkJCXZhbHVlPSJqc3Qud2ViIi8+Ci0JCQkJCQk8L29yPgotCQkJCQk8L2FkYXB0PgotCQkJCTwvb3I+Ci0JCQk8L2VuYWJsZW1lbnQ+Ci0JCTwvY29tbW9uV2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTx2aWV3ZXJDb250cmlidXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0JCTxlZGl0b3JDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2Uuc291cmNlLmVkaXRvckFjdGlvbnMiCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnNvdXJjZSI+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkNsZWFudXBEb2N1bWVudCIKLQkJCQlsYWJlbD0iJUNsZWFudXBEb2N1bWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuY2xlYW51cC5kb2N1bWVudCIKLQkJCQl0b29sdGlwPSIlQ2xlYW51cERvY3VtZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWkuQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQ2xlYW51cERvY3VtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJUb2dnbGVDb21tZW50IgotCQkJCWxhYmVsPSIlVG9nZ2xlQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVRvZ2dsZUNvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlRvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iVG9nZ2xlQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQWRkQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlQWRkQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlQWRkQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQWRkQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW1vdmVCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkZpbmRPY2N1cnJlbmNlcyIKLQkJCQlsYWJlbD0iJUZpbmRPY2N1cnJlbmNlc19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaC5IVE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IkZpbmRPY2N1cnJlbmNlcyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LmVuY2xvc2luZyIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nIj4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0IgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdE5leHQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzIgotCQkJCWxhYmVsPSIlU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5Ij4KLQkJCTwvYWN0aW9uPgotCQk8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLSAgICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5odG1sc291cmNlLnJ1bGVyLmFjdGlvbnMiPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLSAgICAgICAgICAgICAgIGhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLmJvb2ttYXJrX2FjdGlvbl9jb250ZXh0IgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckRvdWJsZUNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiIvPgotICAgICAgICAgPGFjdGlvbgotICAgICAgICAgICAgICAgbGFiZWw9IiVTZWxlY3RSdWxlci5sYWJlbCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIgotICAgICAgICAgICAgICAgYWN0aW9uSUQ9IlJ1bGVyQ2xpY2siCi0gICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIvPgotICAgICAgICA8L2VkaXRvckNvbnRyaWJ1dGlvbj4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc2NoZW1hL2RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MmY4MmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zY2hlbWEvZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiIGlkPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciIgbmFtZT0iRGV2aWNlIFByb2ZpbGUgRW50cnkgUHJvdmlkZXIgRXh0ZW5zaW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJkZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM0ZGYxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlcG9ydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25SZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0ZXIgewotCi0JcHJpdmF0ZSBJVmFsaWRhdG9yIG93bmVyID0gbnVsbDsKLQlwcml2YXRlIElSZXBvcnRlciByZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJRmlsZSBmaWxlID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgSFRNTFZhbGlkYXRpb25SZXN1bHQgcmVzdWx0ID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvblJlcG9ydGVyKElWYWxpZGF0b3Igb3duZXIsIElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlzdXBlcigpOwotCQl0aGlzLm93bmVyID0gb3duZXI7Ci0JCXRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjsKLQkJdGhpcy5maWxlID0gZmlsZTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5maWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5yZXN1bHQgPSBudWxsOwotCi0JCWlmICh0aGlzLnJlcG9ydGVyICE9IG51bGwpIHsKLQkJCXRoaXMucmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModGhpcy5vd25lciwgdGhpcy5maWxlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHJlbW92ZSBieSBteXNlbGY/Ci0JCQlTdHJpbmcgaWQgPSBIVE1MVmFsaWRhdG9yLmNsYXNzLmdldE5hbWUoKTsKLQkJCXRyeSB7Ci0JCQkJLy8gVGFza0xpc3RIZWxwZXIgQVBJIGNoYW5nZWQKLQkJCQkvLyBUYXNrTGlzdEhlbHBlci5nZXRUYXNrTGlzdCgpLnJlbW92ZUFsbFRhc2tzKGlkLCB0aGlzLmZpbGUsCi0JCQkJLy8gbnVsbCk7Ci0JCQkJVGFza0xpc3RIZWxwZXIuZ2V0VGFza0xpc3QoKS5yZW1vdmVBbGxUYXNrcyh0aGlzLmZpbGUsIGlkLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvblJlc3VsdCBnZXRSZXN1bHQoKSB7Ci0JCWlmICh0aGlzLnJlc3VsdCA9PSBudWxsKQotCQkJdGhpcy5yZXN1bHQgPSBuZXcgSFRNTFZhbGlkYXRpb25SZXN1bHQoKTsKLQkJcmV0dXJuIHRoaXMucmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlcG9ydChWYWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCWlmIChtZXNzYWdlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmZpbGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJTWVzc2FnZSBtZXMgPSB0cmFuc2xhdGVNZXNzYWdlKG1lc3NhZ2UpOwotCi0JCWlmICh0aGlzLnJlcG9ydGVyICE9IG51bGwpIHsKLQkJCXRoaXMucmVwb3J0ZXIuYWRkTWVzc2FnZSh0aGlzLm93bmVyLCBtZXMpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYWRkIGJ5IG15c2VsZj8KLQkJCVN0cmluZyBpZCA9IEhUTUxWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotCQkJU3RyaW5nIGxvY2F0aW9uID0gSW50ZWdlci50b1N0cmluZyhtZXMuZ2V0TGluZU51bWJlcigpKTsKLQkJCVN0cmluZyBuYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCUlQYXRoIGZpbGVQYXRoID0gdGhpcy5maWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAoZmlsZVBhdGggIT0gbnVsbCkgewotCQkJCW5hbWUgPSBmaWxlUGF0aC50b1N0cmluZygpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlUYXNrTGlzdEhlbHBlci5nZXRUYXNrTGlzdCgpLmFkZFRhc2soaWQsIHRoaXMuZmlsZSwgbG9jYXRpb24sIG1lcy5nZXRJZCgpLCBtZXMuZ2V0VGV4dCgpLCBtZXMuZ2V0U2V2ZXJpdHkoKSwgbmFtZSwgbWVzLmdldEdyb3VwTmFtZSgpLCBtZXMuZ2V0T2Zmc2V0KCksIG1lcy5nZXRMZW5ndGgoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVHJhbnNsYXRlIFZhbGlkYXRpb25NZXNzYWdlIHRvIElNZXNzYWdlIGFuZCBnZW5lcmF0ZSByZXN1bHQgbG9nCi0JICovCi0JcHJpdmF0ZSBJTWVzc2FnZSB0cmFuc2xhdGVNZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIG1lc3NhZ2UpIHsKLQkJaW50IHNldmVyaXR5ID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCQlIVE1MVmFsaWRhdGlvblJlc3VsdCByZXN1bHQgPSBnZXRSZXN1bHQoKTsKLQkJc3dpdGNoIChtZXNzYWdlLmdldFNldmVyaXR5KCkpIHsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLQkJCQlyZXN1bHQuYWRkRXJyb3IoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgVmFsaWRhdGlvbk1lc3NhZ2UuV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFk7Ci0JCQkJcmVzdWx0LmFkZFdhcm5pbmcoKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXJlc3VsdC5hZGRJbmZvcm1hdGlvbigpOwotCQkJCWJyZWFrOwotCQl9Ci0KLQkJSU1lc3NhZ2UgbWVzID0gbmV3IExvY2FsaXplZE1lc3NhZ2Uoc2V2ZXJpdHksIG1lc3NhZ2UuZ2V0TWVzc2FnZSgpLCB0aGlzLmZpbGUpOwotCQltZXMuc2V0T2Zmc2V0KG1lc3NhZ2UuZ2V0T2Zmc2V0KCkpOwotCQltZXMuc2V0TGVuZ3RoKG1lc3NhZ2UuZ2V0TGVuZ3RoKCkpOwotCQlpZiAodGhpcy5tb2RlbCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGZsYXRNb2RlbCA9IHRoaXMubW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZmxhdE1vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgbGluZSA9IGZsYXRNb2RlbC5nZXRMaW5lT2ZPZmZzZXQobWVzc2FnZS5nZXRPZmZzZXQoKSk7Ci0JCQkJbWVzLnNldExpbmVObyhsaW5lICsgMSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbWVzOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vSFRNTFZhbGlkYXRpb25SZXN1bHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBjOWY3Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvblJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBIVE1MVmFsaWRhdGlvblJlc3VsdCB7Ci0JcHJpdmF0ZSBpbnQgZXJyb3JzID0gMDsKLQlwcml2YXRlIGludCB3YXJuaW5ncyA9IDA7Ci0JcHJpdmF0ZSBpbnQgaW5mb3JtYXRpb25zID0gMDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBIVE1MVmFsaWRhdGlvblJlc3VsdCgpIHsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRFcnJvcigpIHsKLQkJdGhpcy5lcnJvcnMrKzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRJbmZvcm1hdGlvbigpIHsKLQkJdGhpcy5pbmZvcm1hdGlvbnMrKzsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRXYXJuaW5nKCkgewotCQl0aGlzLndhcm5pbmdzKys7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRFcnJvcnMoKSB7Ci0JCXJldHVybiB0aGlzLmVycm9yczsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZm9ybWF0aW9ucygpIHsKLQkJcmV0dXJuIHRoaXMuaW5mb3JtYXRpb25zOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0V2FybmluZ3MoKSB7Ci0JCXJldHVybiB0aGlzLndhcm5pbmdzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0JCXJldHVybiAodGhpcy5lcnJvcnMgPT0gMCAmJiB0aGlzLndhcm5pbmdzID09IDAgJiYgdGhpcy5pbmZvcm1hdGlvbnMgPT0gMCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdGlvbldvcmtiZW5jaEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJmZGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGV4dCB7Ci0JLyoqCi0JICovCi0JcHVibGljIEhUTUxWYWxpZGF0aW9uV29ya2JlbmNoSGVscGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFdoZW4gYW4gSVZhbGlkYXRvciBhc3NvY2lhdGVzIGEgdGFyZ2V0IG9iamVjdCB3aXRoIGFuIElNZXNzYWdlLCB0aGUKLQkgKiBXb3JrYmVuY2hSZXBvcnRlciBldmVudHVhbGx5IHJlc29sdmVzIHRoYXQgdGFyZ2V0IG9iamVjdCB3aXRoIGFuCi0JICogSVJlc291cmNlLiBTb21ldGltZXMgbW9yZSB0aGFuIG9uZSB0YXJnZXQgb2JqZWN0IHJlc29sdmVzIHRvIHRoZSBzYW1lCi0JICogSVJlc291cmNlICh1c3VhbGx5IHRoZSBJUHJvamVjdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQgSVJlc291cmNlIHdoZW4gYW4KLQkgKiBJRmlsZSBjYW5ub3QgYmUgZm91bmQpLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQsIGJ5IHRoZQotCSAqIFdvcmtiZW5jaFJlcG9ydGVyLCBzbyB0aGF0IHRoZSBXb3JrYmVuY2hSZXBvcnRlciBjYW4gZGlzdGluZ3Vpc2gKLQkgKiBiZXR3ZWVuIHRoZSBJTWVzc2FnZXMgd2hpY2ggYXJlIG9uIHRoZSBzYW1lIElSZXNvdXJjZSwgYnV0IHJlZmVyIHRvCi0JICogZGlmZmVyZW50IHRhcmdldCBvYmplY3RzLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhlCi0JICogcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciwgT2JqZWN0KSBtZXRob2QsIHNvIHRoYXQgd2hlbiBvbmUgdGFyZ2V0Ci0JICogb2JqZWN0IHJlbW92ZXMgYWxsIG9mIGl0cyBtZXNzYWdlcywgdGhhdCBpdCBkb2Vzbid0IHJlbW92ZSBhbm90aGVyCi0JICogdGFyZ2V0IG9iamVjdCdzIG1lc3NhZ2VzLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBvbmx5IGlmIG9iamVjdCBpcyBudWxsLiBPdGhlcndpc2UsIGFuIGlkCi0JICogd2hpY2ggY2FuIHVuaXF1ZWx5IGlkZW50aWZ5IGEgcGFydGljdWxhciBvYmplY3QgbXVzdCBiZSByZXR1cm5lZC4gVGhlCi0JICogaWQgbmVlZHMgdG8gYmUgdW5pcXVlIG9ubHkgd2l0aGluIG9uZSBwYXJ0aWN1bGFyIElWYWxpZGF0b3IuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJRmlsZSkKLQkJCXJldHVybiBnZXRQb3J0YWJsZU5hbWUoKElGaWxlKSBvYmplY3QpOwotCQlyZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0hUTUxWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2ODA1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy1odG1sLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L2h0bWwvaW50ZXJuYWwvdmFsaWRhdGlvbi9IVE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuSVRleHRGaWxlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSVNjaGVkdWxpbmdSdWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5JV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5vcGVyYXRpb25zLldvcmtiZW5jaFJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFR5cGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi1wdWJsaWMgY2xhc3MgSFRNTFZhbGlkYXRvciBpbXBsZW1lbnRzIElWYWxpZGF0b3JKb2IsIElTb3VyY2VWYWxpZGF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBPUkdfRUNMSVBTRV9KU1RfSlNQX0NPUkVfSlNQU09VUkNFID0gIm9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9SR19FQ0xJUFNFX1dTVF9IVE1MX0NPUkVfSFRNTFNPVVJDRSA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgYm9vbGVhbiBzaG91bGRWYWxpZGF0ZShJRmlsZSBmaWxlKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IGZpbGU7Ci0JCWRvIHsKLQkJCWlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IChyZXNvdXJjZS5nZXROYW1lKCkuY2hhckF0KDApID09ICcuJyAmJiByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZPTERFUikpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCQlyZXNvdXJjZSA9IHJlc291cmNlLmdldFBhcmVudCgpOwotCQl9Ci0JCXdoaWxlICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLlBST0pFQ1QpID09IDApOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQlwdWJsaWMgSFRNTFZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciByZXBvcnRlcikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIElET01Nb2RlbCBnZXRNb2RlbChJUHJvamVjdCBwcm9qZWN0LCBJRmlsZSBmaWxlKSB7Ci0JCWlmIChwcm9qZWN0ID09IG51bGwgfHwgZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghZmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWNhbkhhbmRsZShmaWxlKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJTW9kZWxNYW5hZ2VyIG1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCi0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCW1vZGVsID0gbWFuYWdlci5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0JCQl9Ci0JCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleCkgewotCQkJCS8vIHJldHJ5IGlnbm9yaW5nIE1FVEEgY2hhcnNldCBmb3IgaW52YWxpZCBNRVRBIGNoYXJzZXQKLQkJCQkvLyBzcGVjaWZpY2F0aW9uCi0JCQkJLy8gcmVjcmVhdGUgaW5wdXQgc3RyZWFtLCBiZWNhdXNlIGl0IGlzIGFscmVhZHkgcGFydGlhbGx5IHJlYWQKLQkJCQltb2RlbCA9IG1hbmFnZXIuZ2V0TW9kZWxGb3JSZWFkKGZpbGUsIG5ldyBTdHJpbmcoKSwgbnVsbCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleCkgewotCQl9Ci0KLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKCEobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSB7Ci0JCQlyZWxlYXNlTW9kZWwobW9kZWwpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJcmV0dXJuIChJRE9NTW9kZWwpIG1vZGVsOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIVE1MVmFsaWRhdGlvblJlcG9ydGVyIGdldFJlcG9ydGVyKElSZXBvcnRlciByZXBvcnRlciwgSUZpbGUgZmlsZSwgSURPTU1vZGVsIG1vZGVsKSB7Ci0JCXJldHVybiBuZXcgSFRNTFZhbGlkYXRpb25SZXBvcnRlcih0aGlzLCByZXBvcnRlciwgZmlsZSwgbW9kZWwpOwotCX0KLQotCS8qKgotCSAqIENoZWNrIGZpbGUgZXh0ZW5zaW9uIHRvIHZhbGlkYXRlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZShJRmlsZSBmaWxlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQlJQ29udGVudFR5cGUgaHRtbENvbnRlbnRUeXBlID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKE9SR19FQ0xJUFNFX1dTVF9IVE1MX0NPUkVfSFRNTFNPVVJDRSk7Ci0JCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCUlDb250ZW50VHlwZSBmaWxlQ29udGVudFR5cGUgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKTsKLQotCQkJCQlpZiAoaHRtbENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJCWlmIChmaWxlQ29udGVudFR5cGUuaXNLaW5kT2YoaHRtbENvbnRlbnRUeXBlKSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBJU1NVRTogaGVyZSdzIGEgbGl0dGxlICJiYWNrd2FyZHMiIGRlcGVuZGFuY3kuCi0JCQkJCQkJLy8gdGhlcmUgc2hvdWxkIGJlIGEgIkpTUEVNQkVEREVESFRNTCB2YWxpZGF0b3IiCi0JCQkJCQkJLy8gY29udHJpYnV0ZWQgYnkgSlNQIHBsdWdpbi4KLQkJCQkJCQlJQ29udGVudFR5cGUganNwQ29udGVudFR5cGUgPSBjb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoT1JHX0VDTElQU0VfSlNUX0pTUF9DT1JFX0pTUFNPVVJDRSk7Ci0JCQkJCQkJaWYgKGpzcENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJCQkJcmVzdWx0ID0gZmlsZUNvbnRlbnRUeXBlLmlzS2luZE9mKGpzcENvbnRlbnRUeXBlKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoaHRtbENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gaHRtbENvbnRlbnRUeXBlLmlzQXNzb2NpYXRlZFdpdGgoZmlsZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaG91bGQgYmUgcmFyZSwgYnV0IHdpbGwgaWdub3JlIHRvIGF2b2lkIGxvZ2dpbmcgImVuY29kaW5nCi0JCQkJLy8gZXhjZXB0aW9ucyIgYW5kIHRoZSBsaWtlIGhlcmUuCi0JCQkJLy8gTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBoYXNIVE1MRmVhdHVyZShJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGRvY3VtZW50LmdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBhZGFwdGVyLmhhc0ZlYXR1cmUoIkhUTUwiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJaWYgKGhlbHBlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoKHJlcG9ydGVyICE9IG51bGwpICYmIChyZXBvcnRlci5pc0NhbmNlbGxlZCgpID09IHRydWUpKSB7Ci0JCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlTdHJpbmdbXSBkZWx0YUFycmF5ID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKGRlbHRhQXJyYXkgIT0gbnVsbCAmJiBkZWx0YUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCXZhbGlkYXRlRGVsdGEoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWxpZGF0ZUZ1bGwoaGVscGVyLCByZXBvcnRlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHZhbGlkYXRlIGNhbGwgaXMgZm9yIHRoZSBJU291cmNlVmFsaWRhdG9yIHBhcnRpYWwgZG9jdW1lbnQKLQkgKiB2YWxpZGF0aW9uIGFwcHJvYWNoCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHBhcmFtIGhlbHBlcgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJUmVnaW9uIGRpcnR5UmVnaW9uLCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQotCQlpZiAoaGVscGVyID09IG51bGwgfHwgZkRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKChyZXBvcnRlciAhPSBudWxsKSAmJiAocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSA9PSB0cnVlKSkgewotCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmRG9jdW1lbnQpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQl0cnkgewotCi0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQkJZG9jdW1lbnQgPSAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQl9Ci0KLQkJCWlmIChkb2N1bWVudCA9PSBudWxsIHx8ICFoYXNIVE1MRmVhdHVyZShkb2N1bWVudCkpCi0JCQkJcmV0dXJuOyAvLyBpZ25vcmUKLQotCQkJSVRleHRGaWxlQnVmZmVyIGZiID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcihmRG9jdW1lbnQpOwotCQkJaWYgKGZiID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGZiLmdldExvY2F0aW9uKCkpOwotCQkJaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkKLQkJCQlyZXR1cm47Ci0KLQkJCS8vIHRoaXMgd2lsbCBiZSB0aGUgd3JvbmcgcmVnaW9uIGlmIGl0J3MgVGV4dCAoaW5zdGVhZCBvZiBFbGVtZW50KQotCQkJLy8gd2UgZG9uJ3Qga25vdyBob3cgdG8gdmFsaWRhdGUgVGV4dAotCQkJSW5kZXhlZFJlZ2lvbiBpciA9IGdldENvdmVyaW5nTm9kZShkaXJ0eVJlZ2lvbik7IC8vICBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGRpcnR5UmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChpciBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQl3aGlsZSAoaXIgIT0gbnVsbCAmJiBpciBpbnN0YW5jZW9mIFRleHQpIHsKLQkJCQkJLy8gaXQncyBhc3N1bWVkIHRoYXQgdGhpcyBnZXRzIHRoZSBJbmRleGVkUmVnaW9uIHRvCi0JCQkJCS8vIHRoZSByaWdodCBvZiB0aGUgZW5kIG9mZnNldAotCQkJCQlpciA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24oaXIuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCX0KLQkJCX0KLQkJCQotCQkJaWYgKGlyIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCi0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQkJCVZhbGlkYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoVmFsaWRhdGlvbkFkYXB0ZXIpIGZhY3RvcnkuYWRhcHQoKElOb2RlTm90aWZpZXIpIGlyKTsKLQkJCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIGVycm9yCi0KLQkJCQlpZiAocmVwb3J0ZXIgIT0gbnVsbCkgewotCQkJCQlIVE1MVmFsaWRhdGlvblJlcG9ydGVyIHJlcCA9IG51bGw7Ci0JCQkJCXJlcCA9IGdldFJlcG9ydGVyKHJlcG9ydGVyLCBmaWxlLCAoSURPTU1vZGVsKSBtb2RlbCk7Ci0JCQkJCXJlcC5jbGVhcigpOwotCQkJCQlhZGFwdGVyLnNldFJlcG9ydGVyKHJlcCk7Ci0KLQkJCQkJU3RyaW5nIGZpbGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJSVBhdGggZmlsZVBhdGggPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQkJCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQkJCQlmaWxlTmFtZSA9IGZpbGVQYXRoLnRvU3RyaW5nKCk7Ci0JCQkJCX0KLQkJCQkJU3RyaW5nIGFyZ3NbXSA9IG5ldyBTdHJpbmdbXXtmaWxlTmFtZX07Ci0KLQkJCQkJTWVzc2FnZSBtZXNzID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZLCBOTFMuYmluZChIVE1MVUlNZXNzYWdlcy5NRVNTQUdFX0hUTUxfVkFMSURBVElPTl9NRVNTQUdFX1VJXywgYXJncykpOwotCQkJCQltZXNzLnNldFBhcmFtcyhhcmdzKTsKLQkJCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzcyk7Ci0JCQkJfQotCQkJCWFkYXB0ZXIudmFsaWRhdGUoaXIpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEluZGV4ZWRSZWdpb24gZ2V0Q292ZXJpbmdOb2RlKElSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJCi0JCUluZGV4ZWRSZWdpb24gbGFyZ2VzdFJlZ2lvbiA9IG51bGw7Ci0JCWlmKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCksIGRpcnR5UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCWxhcmdlc3RSZWdpb24gPSBnZXRMYXJnZXN0KHJlZ2lvbnMpOwotCQl9Ci0JCXJldHVybiBsYXJnZXN0UmVnaW9uOwotCX0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRMYXJnZXN0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBzZFJlZ2lvbnMpIHsKLQkJCi0JCWlmKHNkUmVnaW9ucyA9PSBudWxsIHx8IHNkUmVnaW9ucy5sZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQkgCi0JCUluZGV4ZWRSZWdpb24gY3VycmVudExhcmdlc3QgPSBnZXRDb3JyZXNwb25kaW5nTm9kZShzZFJlZ2lvbnNbMF0pOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNkUmVnaW9ucy5sZW5ndGg7IGkrKykgewotCQkgICAgaWYoIXNkUmVnaW9uc1tpXS5pc0RlbGV0ZWQoKSkgewotICAgIAkJCUluZGV4ZWRSZWdpb24gY29ycmVzcG9uZGluZyA9IGdldENvcnJlc3BvbmRpbmdOb2RlKHNkUmVnaW9uc1tpXSk7Ci0gICAgCQkJCi0gICAgCQkJaWYoY3VycmVudExhcmdlc3QgaW5zdGFuY2VvZiBUZXh0KQotICAgIAkJCQljdXJyZW50TGFyZ2VzdCA9IGNvcnJlc3BvbmRpbmc7Ci0gICAgCQkJCi0gICAgICAgICAgICAgICAgaWYoY29ycmVzcG9uZGluZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgCWlmKCEoY29ycmVzcG9uZGluZyBpbnN0YW5jZW9mIFRleHQpKSB7Ci0JICAgICAgICAJCQlpZiAoY29ycmVzcG9uZGluZy5nZXRTdGFydE9mZnNldCgpIDw9IGN1cnJlbnRMYXJnZXN0LmdldFN0YXJ0T2Zmc2V0KCkgIAotCSAgICAgICAgCQkJCQkJJiYgIGNvcnJlc3BvbmRpbmcuZ2V0RW5kT2Zmc2V0KCkgPj0gY3VycmVudExhcmdlc3QuZ2V0RW5kT2Zmc2V0KCkgKQotCSAgICAgICAgCQkJCWN1cnJlbnRMYXJnZXN0ID0gY29ycmVzcG9uZGluZzsKLSAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLQkJfQotCQlyZXR1cm4gY3VycmVudExhcmdlc3Q7Ci0JfQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldENvcnJlc3BvbmRpbmdOb2RlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0gICAgICAgIEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc01vZGVsICE9IG51bGwpIAotICAgICAgICAgICAgICAgIGluZGV4ZWRSZWdpb24gPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydCgpKTsgICAgCi0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoc01vZGVsICE9IG51bGwpCi0gICAgICAgICAgICAgICAgc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmRleGVkUmVnaW9uOwotICAgIH0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yLklTb3VyY2VWYWxpZGF0b3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5JU291cmNlVmFsaWRhdG9yCi0JICovCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJZkRvY3VtZW50ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgSFRNTFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGUoSURPTU1vZGVsIG1vZGVsLCBJRmlsZSBmaWxlKSB7Ci0JCUlQcm9qZWN0IHByaiA9IG51bGw7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCXByaiA9IGZpbGUuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWlmICgocHJqID09IG51bGwpICYmIChtb2RlbCAhPSBudWxsKSkgewotCQkJVVJJUmVzb2x2ZXIgcmVzID0gbW9kZWwuZ2V0UmVzb2x2ZXIoKTsKLQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCXByaiA9IHJlcy5nZXRQcm9qZWN0KCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWwgV29ya2JlbmNoUmVwb3J0ZXIgcmVwb3J0ZXIgPSBuZXcgV29ya2JlbmNoUmVwb3J0ZXIocHJqLCBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpKTsKLQkJcmV0dXJuIHZhbGlkYXRlKHJlcG9ydGVyLCBmaWxlLCBtb2RlbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBIVE1MVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0ZShJUmVwb3J0ZXIgcmVwb3J0ZXIsIElGaWxlIGZpbGUsIElET01Nb2RlbCBtb2RlbCkgewotCQlpZiAoZmlsZSA9PSBudWxsIHx8IG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJaWYgKCFoYXNIVE1MRmVhdHVyZShkb2N1bWVudCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaWdub3JlCi0KLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gSFRNTFZhbGlkYXRpb25BZGFwdGVyRmFjdG9yeS5nZXRJbnN0YW5jZSgpOwotCQlWYWxpZGF0aW9uQWRhcHRlciBhZGFwdGVyID0gKFZhbGlkYXRpb25BZGFwdGVyKSBmYWN0b3J5LmFkYXB0KGRvY3VtZW50KTsKLQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCUhUTUxWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwID0gZ2V0UmVwb3J0ZXIocmVwb3J0ZXIsIGZpbGUsIG1vZGVsKTsKLQkJcmVwLmNsZWFyKCk7Ci0JCWFkYXB0ZXIuc2V0UmVwb3J0ZXIocmVwKTsKLQkJaWYgKHJlcG9ydGVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBmaWxlTmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlJUGF0aCBmaWxlUGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJCWlmIChmaWxlUGF0aCAhPSBudWxsKSB7Ci0JCQkJZmlsZU5hbWUgPSBmaWxlUGF0aC50b1N0cmluZygpOwotCQkJfQotCQkJU3RyaW5nIGFyZ3NbXSA9IG5ldyBTdHJpbmdbXXtmaWxlTmFtZX07Ci0KLQkJCS8vIE1lc3NhZ2UgbWVzcyA9IG5ldyBNZXNzYWdlKCJIVE1MVmFsaWRhdGlvbiIsIC8vJE5PTi1OTFMtMSQKLQkJCS8vIFNldmVyaXR5RW51bS5MT1dfU0VWRVJJVFksCi0JCQkvLyAiTUVTU0FHRV9IVE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV8iLCAvLyROT04tTkxTLTEkCi0JCQkvLyBhcmdzKTsKLQkJCU1lc3NhZ2UgbWVzcyA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkxPV19TRVZFUklUWSwgTkxTLmJpbmQoSFRNTFVJTWVzc2FnZXMuTUVTU0FHRV9IVE1MX1ZBTElEQVRJT05fTUVTU0FHRV9VSV8sIGFyZ3MpKTsKLQkJCW1lc3Muc2V0UGFyYW1zKGFyZ3MpOwotCQkJcmVwb3J0ZXIuZGlzcGxheVN1YnRhc2sodGhpcywgbWVzcyk7Ci0JCX0KLQkJYWRhcHRlci52YWxpZGF0ZShkb2N1bWVudCk7Ci0JCXJldHVybiByZXAuZ2V0UmVzdWx0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlQ29udGFpbmVyKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlciwgSUNvbnRhaW5lciBjb250YWluZXIpIHsKLQkJdHJ5IHsKLQkJCUlSZXNvdXJjZVtdIHJlc291cmNlQXJyYXkgPSBjb250YWluZXIubWVtYmVycyhmYWxzZSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJlc291cmNlQXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZUFycmF5W2ldOwotCQkJCWlmIChyZXNvdXJjZSA9PSBudWxsIHx8IHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJCXZhbGlkYXRlRmlsZShoZWxwZXIsIHJlcG9ydGVyLCAoSUZpbGUpIHJlc291cmNlKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCXZhbGlkYXRlQ29udGFpbmVyKGhlbHBlciwgcmVwb3J0ZXIsIChJQ29udGFpbmVyKSByZXNvdXJjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgdmFsaWRhdGVEZWx0YShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLQkJU3RyaW5nW10gZGVsdGFBcnJheSA9IGhlbHBlci5nZXRVUklzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVsdGFBcnJheS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGRlbHRhID0gZGVsdGFBcnJheVtpXTsKLQkJCWlmIChkZWx0YSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoZGVsdGEpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIShyZXNvdXJjZSBpbnN0YW5jZW9mIElGaWxlKSkKLQkJCQljb250aW51ZTsKLQkJCXZhbGlkYXRlRmlsZShoZWxwZXIsIHJlcG9ydGVyLCAoSUZpbGUpIHJlc291cmNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUZpbGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyLCBJRmlsZSBmaWxlKSB7Ci0JCWlmICgocmVwb3J0ZXIgIT0gbnVsbCkgJiYgKHJlcG9ydGVyLmlzQ2FuY2VsbGVkKCkgPT0gdHJ1ZSkpIHsKLQkJCXRocm93IG5ldyBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JCWlmICghc2hvdWxkVmFsaWRhdGUoZmlsZSkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRNb2RlbChmaWxlLmdldFByb2plY3QoKSwgZmlsZSk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXRyeSB7Ci0JCQl2YWxpZGF0ZShyZXBvcnRlciwgZmlsZSwgbW9kZWwpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJcmVsZWFzZU1vZGVsKG1vZGVsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCB2YWxpZGF0ZUZ1bGwoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQlTdHJpbmdbXSBmaWxlRGVsdGEgPSBoZWxwZXIuZ2V0VVJJcygpOwotCQlpZiAoaGVscGVyIGluc3RhbmNlb2YgSVdvcmtiZW5jaENvbnRleHQpIHsKLQkJCUlXb3JrYmVuY2hDb250ZXh0IHdiSGVscGVyID0gKElXb3JrYmVuY2hDb250ZXh0KSBoZWxwZXI7Ci0JCQlwcm9qZWN0ID0gd2JIZWxwZXIuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gd29uJ3Qgd29yayBmb3IgcHJvamVjdCB2YWxpZGF0aW9uIChiL2Mgbm90aGluZyBpbiBmaWxlIGRlbHRhKQotCQkJcHJvamVjdCA9IGdldFJlc291cmNlKGZpbGVEZWx0YVswXSkuZ2V0UHJvamVjdCgpOwotCQl9Ci0JCWlmIChwcm9qZWN0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXZhbGlkYXRlQ29udGFpbmVyKGhlbHBlciwgcmVwb3J0ZXIsIHByb2plY3QpOwotCX0KLQotCS8qCi0JICogYWRkZWQgdG8gZ2V0IHJpZCBvciBkZXBlbmRlbmN5IG9uIElXb3JrYmVuY2hIZWxwZXIKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKFN0cmluZyBkZWx0YSkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGRlbHRhKSk7Ci0JfQotCi0JcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIEV4Y2VwdGlvbiBjYXRjaGluZyB3YXMgcmVtb3ZlZCwgc2VlCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMjM2MDAKLQkJSVN0YXR1cyBzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl2YWxpZGF0ZShoZWxwZXIsIHJlcG9ydGVyKTsKLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vTG9jYWxpemVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWJhMTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL0xvY2FsaXplZE1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci0KLS8qKgotICogY29waWVkIGZyb20gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgcHJvdmlkZWQgZm9yIHZhbGlkYXRvcnMgd2hpY2ggcnVuIG9ubHkgaW4gRWNsaXBzZSBhbmQgd2hvc2UgbWVzc2FnZXMsIGJlY2F1c2UgdGhleQotICogY29tZSBmcm9tIGFub3RoZXIgdG9vbCwgYXJlIGFscmVhZHkgbG9jYWxpemVkLiBMb2NhbGl6ZWRNZXNzYWdlIGNhbm5vdCBiZSB1c2VkIGJ5IGFueSB2YWxpZGF0b3IKLSAqIHdoaWNoIG5lZWRzIHRvIHJ1biBpbiBib3RoIFdlYlNwaGVyZSBhbmQgRWNsaXBzZS4KLSAqLwotcHVibGljIGNsYXNzIExvY2FsaXplZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHsKLQlwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgewotCQl0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIElSZXNvdXJjZSB0YXJnZXRPYmplY3QpIHsKLQkJdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIChPYmplY3QpIHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIExvY2FsaXplZE1lc3NhZ2UoaW50IHNldmVyaXR5LCBTdHJpbmcgbWVzc2FnZVRleHQsIE9iamVjdCB0YXJnZXRPYmplY3QpIHsKLQkJc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCQlzZXRMb2NhbGl6ZWRNZXNzYWdlKG1lc3NhZ2VUZXh0KTsKLQkJc2V0VGFyZ2V0T2JqZWN0KHRhcmdldE9iamVjdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TG9jYWxpemVkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgewotCQlfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgewotCQlyZXR1cm4gX21lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChDbGFzc0xvYWRlciBjbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgewotCQlyZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCwgQ2xhc3NMb2FkZXIgY2wpIHsKLQkJcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZWRlMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi0vKioKLSAqIAotICogQ2xhc3MgdG8gaGVscCB0aGlzIFByb2JsZW0ncyBsaXN0LgotICogCi0gKi8KLWNsYXNzIFRhc2tMaXN0SGVscGVyIHsKLQlwcml2YXRlIHN0YXRpYyBUYXNrTGlzdEhlbHBlciBfdGFza0xpc3RIZWxwZXIgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBUYXNrTGlzdEhlbHBlciBnZXRUYXNrTGlzdCgpIHsKLQkJaWYgKF90YXNrTGlzdEhlbHBlciA9PSBudWxsKSB7Ci0JCQlfdGFza0xpc3RIZWxwZXIgPSBuZXcgVGFza0xpc3RIZWxwZXIoKTsKLQkJfQotCQlyZXR1cm4gX3Rhc2tMaXN0SGVscGVyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFkZHMgYSBtZXNzYWdlIHRvIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRUYXNrKFN0cmluZyBwbHVnaW5JZCwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgbWFya2VyVHlwZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LmFkZFRhc2socGx1Z2luSWQsIHJlc291cmNlLCBsb2NhdGlvbiwgbWVzc2FnZUlkLCBtZXNzYWdlLCBtYXJrZXJUeXBlLCB0YXJnZXRPYmplY3ROYW1lLCBncm91cE5hbWUsIG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGFsbCBtZXNzYWdlcyBmcm9tIGEgcmVzb3VyY2UgaW4gdGhlIHRhc2sgbGlzdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBvd25lciwgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJVGFza0xpc3RVdGlsaXR5LnJlbW92ZUFsbFRhc2tzKHJlc291cmNlLCBvd25lciwgb2JqZWN0TmFtZSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjLWh0bWwtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QvaHRtbC9pbnRlcm5hbC92YWxpZGF0aW9uL1Rhc2tMaXN0VXRpbGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RVdGlsaXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYzNjNWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMtaHRtbC12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC9odG1sL2ludGVybmFsL3ZhbGlkYXRpb24vVGFza0xpc3RVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBtdXN0IGJlIGNhbGxlZCBvbmx5IGJ5IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yay4KLSAqIAotICogVGhpcyBzaW5nbGV0b24gaW50ZXJhY3RzIHdpdGggdGhlIGVjbGlwc2Ugd29ya2JlbmNoJ3MgVGFzayBsaXN0LgotICogVGFza0xpc3RVdGlsaXR5IGFkZHMgYW5kIHJlbW92ZXMgdGFza3MgZnJvbSB0aGUgbGlzdC4KLSAqIAotICogVGhpcyBjbGFzcyBtdXN0IG5vdCBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhbiBJV29ya3NwYWNlUnVubmFibGUgb3IKLSAqIElSdW5uYWJsZVdpdGhQcm9ncmVzcy4gTWFueSByZXNvdXJjZSBkZWx0YXMgY2FuIGJlIGdlbmVyYXRlZCBieSB0aGUgbWV0aG9kcwotICogaW4gdGhpcyBjbGFzcy4KLSAqIAotICogVGhpcyBjYW1lIGZyb20gVGFza0xpc3RVdGlsaXR5Ci0gKi8KLXB1YmxpYyBjbGFzcyBUYXNrTGlzdFV0aWxpdHkgewotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSBWYWxpZGF0aW9uUGx1Z2luLlBMVUdJTl9JRDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gSFRNTFVJUGx1Z2luLklEOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9IFBMVUdJTl9JRCArICIucHJvYmxlbW1hcmtlciI7IC8vJE5PTi1OTFMtMSQgLy8gVGhlIGV4dGVuc2lvbiB3aGljaCBpcyB1c2VkIHRvIGFkZCB2YWxpZGF0aW9uIG1hcmtlcnMgdG8gdGhlIHRhc2sgbGlzdAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9PV05FUiA9ICJvd25lciI7IC8vJE5PTi1OTFMtMSQgLy8gVGhlIElWYWxpZGF0b3Igd2hvIG93bnMgdGhlIElNYXJrZXIgb24gdGhlIHRhc2sgbGlzdAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWSA9ICJ2YWxpZGF0aW9uU2V2ZXJpdHkiOyAvLyROT04tTkxTLTEkIC8vIG9uZSBvZiB0aGUgSU1lc3NhZ2UgdmFsdWVzCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fTUFSS0VSX1RBUkdFVE9CSkVDVCA9ICJ0YXJnZXRPYmplY3QiOyAvLyROT04tTkxTLTEkIC8vIFdoZW4gbW9yZSB0aGFuIG9uZSB0YXJnZXQgb2JqZWN0IHJlc29sdmVzIHRvIHRoZSBzYW1lIElSZXNvdXJjZSwgdGhpcyBmaWVsZCBpZGVudGlmaWVzIHdoaWNoIHRhcmdldE9iamVjdCBvd25zIGEgcGFydGljdWxhciBtZXNzYWdlLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9HUk9VUCA9ICJncm91cE5hbWUiOyAvLyROT04tTkxTLTEkIC8vIEZvciBpbmNyZW1lbnRhbCB2YWxpZGF0aW9uLCB0aGlzIGZpZWxkIGFzc29jaWF0ZXMgYSBtZXNzYWdlIHdpdGggYSBncm91cCwgc28gdGhhdCBhIHN1YnNldCBvZiBtZXNzYWdlcyBtYXkgYmUgcmVtb3ZlZCBmcm9tIGEgZmlsZS4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMSURBVElPTl9NQVJLRVJfTUVTU0FHRUlEID0gIm1lc3NhZ2VJZCI7IC8vJE5PTi1OTFMtMSQgLy8gUGVyc2lzdCB0aGUgbWVzc2FnZSBpZCBvZiB0aGUgbWVzc2FnZSwgbm90IGp1c3QgdGhlIHRyYW5zbGF0ZWQgdGV4dC4KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVQVEhfSU5GSU5JVEUgPSBJUmVzb3VyY2UuREVQVEhfSU5GSU5JVEU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUFRIX1pFUk8gPSBJUmVzb3VyY2UuREVQVEhfWkVSTzsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBJTWFya2VyW10gTk9fTUFSS0VSUyA9IG5ldyBJTWFya2VyWzBdOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWRkcyBhIG1lc3NhZ2UgdG8gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSU1hcmtlciBhZGRUYXNrKFN0cmluZyBwbHVnaW5JZCwgSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgbG9jYXRpb24sIFN0cmluZyBtZXNzYWdlSWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgbWFya2VyVHlwZSwgU3RyaW5nIHRhcmdldE9iamVjdE5hbWUsIFN0cmluZyBncm91cE5hbWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChtZXNzYWdlID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBnZXRTZXZlcml0eShtYXJrZXJUeXBlKTsKLQotCQkvLyBBbGxvdyBkdXBsaWNhdGUgZW50cmllcyBpbiB0aGUgdGFzayBsaXN0LgotCQkvLyBQcmlvciB0byBhIGZ1bGwgdmFsaWRhdGlvbiwgdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrIHdpbGwgcmVtb3ZlCi0JCS8vIGFsbCBtZXNzYWdlcyBvd25lZAotCQkvLyBieSBhIHZhbGlkYXRvciBiZWZvcmUgaXQgaXMgZXhlY3V0ZWQuCi0JCS8vIFByaW9yIHRvIGFuIGluY3JlbWVudGFsIHZhbGlkYXRpb24sIHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayB3aWxsCi0JCS8vIHJlbW92ZSBhbGwgbWVzc2FnZXMsCi0JCS8vIG9uIGVhY2ggb2YgdGhlIGNoYW5nZWQgcmVzb3VyY2VzLCBvd25lZCBieSBhIHZhbGlkYXRvciBiZWZvcmUgaXQgaXMKLQkJLy8gaW52b2tlZC4KLQkJLy8gCi0JCS8vIEl0IGlzIHVwIHRvIHRoZSB2YWxpZGF0b3IgdG8gbWFrZSBzdXJlIHRoYXQgaXQgaXMgbm90IGFkZGluZyB0aGUKLQkJLy8gc2FtZSBtZXNzYWdlCi0JCS8vIGluIG1vcmUgdGhhbiBvbmUgcGxhY2UsIGFuZCBhbHNvIHRvIGNsZWFyIG91dCBhbnkgb2xkIG1lc3NhZ2VzCi0JCS8vIHdoaWNoIGFyZSBub3QgY2xlYXJlZAotCQkvLyBieSB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsuCi0JCUlNYXJrZXIgaXRlbSA9IHJlc291cmNlLmNyZWF0ZU1hcmtlcihWQUxJREFUSU9OX01BUktFUik7IC8vIGFkZCBhCi0JCQkJCQkJCQkJCQkJCQkJCS8vIHZhbGlkYXRpb24KLQkJCQkJCQkJCQkJCQkJCQkJLy8gbWFya2VyCi0KLQkJLy8gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHJlcGxhY2UgdGhlIG11bHRpcGxlIHNldEF0dHJpYnV0ZQotCQkvLyBjYWxscyBhYm92ZSB3aXRoIGEgc2luZ2xlIHNldEF0dHJpYnV0ZXMgY2FsbC4KLQkJYm9vbGVhbiBvZmZzZXRTZXQgPSAoKG9mZnNldCAhPSBJTWVzc2FnZS5PRkZTRVRfVU5TRVQpICYmIChsZW5ndGggIT0gSU1lc3NhZ2UuT0ZGU0VUX1VOU0VUKSk7Ci0JCWludCBzaXplID0gKG9mZnNldFNldCkgPyAxMCA6IDg7IC8vIGFkZCBDSEFSX1NUQVJULCBDSEFSX0VORCBvbmx5Ci0JCQkJCQkJCQkJCS8vIGlmIHRoZSBvZmZzZXQgaXMgc2V0LiBJZiB0aGUKLQkJCQkJCQkJCQkJLy8gb2Zmc2V0IGlzIHNldCwgaXQgdGFrZXMKLQkJCQkJCQkJCQkJLy8gcHJlY2VuZGVuY2Ugb3ZlciB0aGUgbGluZQotCQkJCQkJCQkJCQkvLyBudW1iZXIuIChlY2xpcHNlJ3MgcnVsZSwgbm90Ci0JCQkJCQkJCQkJCS8vIG1pbmUuKQotCQlTdHJpbmdbXSBhdHRyaWJOYW1lcyA9IG5ldyBTdHJpbmdbc2l6ZV07Ci0JCU9iamVjdFtdIGF0dHJpYlZhbHVlcyA9IG5ldyBPYmplY3Rbc2l6ZV07Ci0KLQkJLy8gVmVyeSBmaXJzdCB0aGluZywgYWRkIHRoZSBvd25lci4gVGhhdCB3YXksIGlmIHRoZSBjb2RlIGRpZXMKLQkJLy8gYmVmb3JlIHRoaW5ncyBhcmUgcGVyc2lzdGVkLCBob3BlZnVsbHkgdGhpcyBtYXJrZXIgd2lsbCBiZQotCQkvLyBwZXJzaXN0ZWQuCi0JCS8vIEhvcGVmdWxseSwgZWNsaXBzZSBXSUxMIHBlcnNpc3QgdGhpcyBmaWVsZCwgYXMgcmVxdWVzdGVkLgotCQlhdHRyaWJOYW1lc1swXSA9IFZBTElEQVRJT05fTUFSS0VSX09XTkVSOwotCQlhdHRyaWJWYWx1ZXNbMF0gPSBwbHVnaW5JZDsKLQkJYXR0cmliTmFtZXNbMV0gPSBWQUxJREFUSU9OX01BUktFUl9TRVZFUklUWTsgLy8gdGhpcyB2YWxpZGF0aW9uCi0JCQkJCQkJCQkJCQkJCS8vIHNldmVyaXR5IGlzIHN0b3JlZCwKLQkJCQkJCQkJCQkJCQkJLy8gaW4gYWRkaXRpb24gdG8gdGhlCi0JCQkJCQkJCQkJCQkJCS8vIG1hcmtlciBzZXZlcml0eSwgdG8KLQkJCQkJCQkJCQkJCQkJLy8gZW5hYmxlIG1vcmUgdGhhbgotCQkJCQkJCQkJCQkJCQkvLyBvbmUgc2V2ZXJpdHkgb2YKLQkJCQkJCQkJCQkJCQkJLy8gbWVzc2FnZSB0byBiZQotCQkJCQkJCQkJCQkJCQkvLyBkaXNwbGF5ZWQuIGUuZy4KLQkJCQkJCQkJCQkJCQkJLy8gRVJST1IgfCBXQVJOSU5HCi0JCQkJCQkJCQkJCQkJCS8vICh1c2luZyBiaW5hcnkgT1IpLgotCQkJCQkJCQkJCQkJCQkvLyBUaGUgSU1hcmtlcgotCQkJCQkJCQkJCQkJCQkvLyBjb25zdGFudHMgYXJlCi0JCQkJCQkJCQkJCQkJCS8vIHJlZ3VsYXIgZGVjaW1hbAotCQkJCQkJCQkJCQkJCQkvLyBjb25zdGFudHMuCi0JCWF0dHJpYlZhbHVlc1sxXSA9IG5ldyBJbnRlZ2VyKG1hcmtlclR5cGUpOwotCQlhdHRyaWJOYW1lc1syXSA9IFZBTElEQVRJT05fTUFSS0VSX1RBUkdFVE9CSkVDVDsgLy8gdG8gZGlzdGluZ3Vpc2gKLQkJCQkJCQkJCQkJCQkJCS8vIGJldHdlZW4KLQkJCQkJCQkJCQkJCQkJCS8vIG1lc3NhZ2VzIHdoaWNoCi0JCQkJCQkJCQkJCQkJCQkvLyBhcmUgcmVnaXN0ZXJlZAotCQkJCQkJCQkJCQkJCQkJLy8gb24gYW4KLQkJCQkJCQkJCQkJCQkJCS8vIElSZXNvdXJjZSwgYnV0Ci0JCQkJCQkJCQkJCQkJCQkvLyBhZ2FpbnN0Ci0JCQkJCQkJCQkJCQkJCQkvLyBkaWZmZXJlbnQKLQkJCQkJCQkJCQkJCQkJCS8vIHRhcmdldCBvYmplY3RzCi0JCWF0dHJpYlZhbHVlc1syXSA9ICgodGFyZ2V0T2JqZWN0TmFtZSA9PSBudWxsKSA/ICIiIDogdGFyZ2V0T2JqZWN0TmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXR0cmliTmFtZXNbM10gPSBWQUxJREFUSU9OX01BUktFUl9HUk9VUDsKLQkJYXR0cmliVmFsdWVzWzNdID0gKChncm91cE5hbWUgPT0gbnVsbCkgPyAiIiA6IGdyb3VwTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJYXR0cmliTmFtZXNbNF0gPSBJTWFya2VyLk1FU1NBR0U7Ci0JCWF0dHJpYlZhbHVlc1s0XSA9IG1lc3NhZ2U7Ci0JCWF0dHJpYk5hbWVzWzVdID0gVkFMSURBVElPTl9NQVJLRVJfTUVTU0FHRUlEOwotCQlhdHRyaWJWYWx1ZXNbNV0gPSBtZXNzYWdlSWQ7Ci0KLQkJYXR0cmliTmFtZXNbNl0gPSBJTWFya2VyLlNFVkVSSVRZOyAvLyBJTWFya2VyLlNFVkVSSVRZX0VSUk9SLAotCQkJCQkJCQkJCQkvLyBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkcsCi0JCQkJCQkJCQkJCS8vIElNYXJrZXIuU0VWRVJJVFlfSU5GTwotCQlhdHRyaWJWYWx1ZXNbNl0gPSBuZXcgSW50ZWdlcihzZXZlcml0eSk7Ci0JCXRyeSB7Ci0JCQkvLyBJZiB0aGUgbG9jYXRpb24gaXMgYSBsaW5lIG51bWJlciwgc3RvcmUgaXQgYXMgYSBsaW5lIG51bWJlcgotCQkJSW50ZWdlciBsaW5lTnVtYmVyID0gSW50ZWdlci52YWx1ZU9mKGxvY2F0aW9uKTsKLQkJCWF0dHJpYk5hbWVzWzddID0gSU1hcmtlci5MSU5FX05VTUJFUjsKLQkJCWF0dHJpYlZhbHVlc1s3XSA9IGxpbmVOdW1iZXI7Ci0JCX0KLQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleGMpIHsKLQkJCS8vIE90aGVyd2lzZSwgc3RvcmUgaXQgYXMgYSB0ZXh0IGxvY2F0aW9uCi0JCQlhdHRyaWJOYW1lc1s3XSA9IElNYXJrZXIuTE9DQVRJT047Ci0JCQlhdHRyaWJWYWx1ZXNbN10gPSBsb2NhdGlvbjsKLQkJfQotCi0JCWlmIChvZmZzZXRTZXQpIHsKLQkJCWF0dHJpYk5hbWVzWzhdID0gSU1hcmtlci5DSEFSX1NUQVJUOwotCQkJYXR0cmliVmFsdWVzWzhdID0gbmV3IEludGVnZXIob2Zmc2V0KTsKLQkJCWF0dHJpYk5hbWVzWzldID0gSU1hcmtlci5DSEFSX0VORDsKLQkJCWF0dHJpYlZhbHVlc1s5XSA9IG5ldyBJbnRlZ2VyKG9mZnNldCArIGxlbmd0aCk7Ci0JCX0KLQotCQlpdGVtLnNldEF0dHJpYnV0ZXMoYXR0cmliTmFtZXMsIGF0dHJpYlZhbHVlcyk7Ci0KLQkJcmV0dXJuIGl0ZW07Ci0JfQotCi0JLyoqCi0JICogR2l2ZW4gb25lIG9mIHRoZSBTZXZlcml0eUVudW0gc2V2ZXJpdGllcywgcmV0dXJuIHRoZSBJTWFya2VyIHNldmVyaXR5Ci0JICogaW50IHRoYXQgaXMgaXRzIGVxdWl2YWxlbnQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgaW50IGdldFNldmVyaXR5KGludCBzZXZlcml0eUVudW1WYWx1ZSkgewotCQlzd2l0Y2ggKHNldmVyaXR5RW51bVZhbHVlKSB7Ci0JCQljYXNlIChJTWVzc2FnZS5ISUdIX1NFVkVSSVRZKSA6IHsKLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9FUlJPUjsKLQkJCX0KLQotCQkJY2FzZSAoSU1lc3NhZ2UuTE9XX1NFVkVSSVRZKSA6IHsKLQkJCQlyZXR1cm4gSU1hcmtlci5TRVZFUklUWV9JTkZPOwotCQkJfQotCi0JCQljYXNlIChJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFkpIDogewotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCQl9Ci0KLQkJCWNhc2UgKElNZXNzYWdlLkFMTF9NRVNTQUdFUykgOgotCQkJY2FzZSAoSU1lc3NhZ2UuRVJST1JfQU5EX1dBUk5JTkcpIDoKLQkJCWRlZmF1bHQgOiB7Ci0JCQkJLy8gYXNzdW1lIGl0J3MgYSB3YXJuaW5nLgotCQkJCXJldHVybiBJTWFya2VyLlNFVkVSSVRZX1dBUk5JTkc7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBpbnQgZ2V0RGVwdGgoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gREVQVEhfSU5GSU5JVEU7IC8vIERFUFRIX0lORklOSVRFIG1lYW5zIGdldCB0aGlzIHByb2plY3QncwotCQkJCQkJCQkJLy8gbWFya2VycywgYW5kIHRoZSBtYXJrZXJzIGJlbG9uZ2luZyB0bwotCQkJCQkJCQkJLy8gdGhlIHByb2plY3QncyBjaGlsZHJlbi4KLQkJfQotCQllbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElXb3Jrc3BhY2VSb290KSB7Ci0JCQkvLyBOZWVkZWQgZm9yIHRoZSBWYWxpZGF0aW9uTWlncmF0b3Igd2hlbiBpdCBjaGVja3MgZm9yIG9ycGhhbgotCQkJLy8gdGFza3MuCi0JCQlyZXR1cm4gREVQVEhfSU5GSU5JVEU7IC8vIERFUFRIX0lORklOSVRFIG1lYW5zIGdldCBhbGwgb2YgdGhlCi0JCQkJCQkJCQkvLyBtYXJrZXJzIGluIHRoZSB3b3Jrc3BhY2UKLQkJfQotCi0JCXJldHVybiBERVBUSF9aRVJPOyAvLyBERVBUSF9aRVJPIG1lYW5zIGp1c3QgdGhpcyByZXNvdXJjZSwgbm90IGl0cwotCQkJCQkJCS8vIGNoaWxkcmVuCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSU1hcmtlcltdIGdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIGludCBzZXZlcml0eSwgaW50IGRlcHRoKSB7Ci0JCUlNYXJrZXJbXSB0ZW1wTWFya2VycyA9IG51bGw7Ci0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJdHJ5IHsKLQkJCUlNYXJrZXJbXSBhbGxNYXJrZXJzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKFZBTElEQVRJT05fTUFSS0VSLCBmYWxzZSwgZGVwdGgpOyAvLyBmYWxzZQotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbWVhbnMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9ubHkKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbnNpZGVyCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBQUk9CTEVNX01BUktFUiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5vdAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdmFyaWFudHMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIG9mCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBQUk9CTEVNX01BUktFUi4KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIFNpbmNlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhZGRUYXNrCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBvbmx5Ci0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBhZGRzCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBQUk9CTEVNX01BUktFUiwKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHdlCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBkb24ndAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gbmVlZAotCQkJCQkJCQkJCQkJCQkJCQkJCQkJLy8gdG8KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIGNvbnNpZGVyCi0JCQkJCQkJCQkJCQkJCQkJCQkJCQkvLyBpdHMKLQkJCQkJCQkJCQkJCQkJCQkJCQkJCS8vIHN1YnR5cGVzLgotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkJLy8gTG9nZ2VyIGxvZ2dlciA9Ci0JCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkvLyBMb2dFbnRyeSBlbnRyeSA9IFZhbGlkYXRpb25QbHVnaW4uZ2V0TG9nRW50cnkoKTsKLQkJCQkvLyBlbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhJUmVzb3VyY2UsCi0JCQkJLy8gaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJLy8gbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCS8vIH0KLQkJCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJCX0KLQotCQkJLy8gTm93IGZpbHRlciBpbiB0aGUgbWFya2VycywgYmFzZWQgb24gc2V2ZXJpdHkgdHlwZS4KLQkJCWlmIChhbGxNYXJrZXJzLmxlbmd0aCAhPSAwKSB7Ci0JCQkJdGVtcE1hcmtlcnMgPSBuZXcgSU1hcmtlclthbGxNYXJrZXJzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlNYXJrZXIgbWFya2VyID0gYWxsTWFya2Vyc1tpXTsKLQkJCQkJSW50ZWdlciBmaWx0ZXJTZXZlcml0eSA9IChJbnRlZ2VyKSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX1NFVkVSSVRZKTsKLQkJCQkJaWYgKGZpbHRlclNldmVyaXR5ID09IG51bGwpIHsKLQkJCQkJCS8vIG9kZC4uLm1hcmtlciB3YXNuJ3QgY3JlYXRlZCBjb3JyZWN0bHkuIEhvdyBjb3VsZAotCQkJCQkJLy8gdGhpcyBoYXBwZW4/Ci0JCQkJCQkvLyBEZWZhdWx0IHRvIHRoZSBjdXJyZW50IHNldmVyaXR5IGFuZCBhZGQgaXQgdG8gdGhlCi0JCQkJCQkvLyBsaXN0LgotCQkJCQkJdHJ5IHsKLQkJCQkJCQltYXJrZXIuc2V0QXR0cmlidXRlKElNYXJrZXIuU0VWRVJJVFksIGdldFNldmVyaXR5KHNldmVyaXR5KSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBleGMpIHsKLQkJCQkJCQkvLyBMb2dnZXIgbG9nZ2VyID0KLQkJCQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpOwotCQkJCQkJCS8vIGlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJCQkJCS8vIExvZ0VudHJ5IGVudHJ5ID0KLQkJCQkJCQkvLyBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MoaW50LAotCQkJCQkJCS8vIElSZXNvdXJjZSwgaW50KSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkJCQkJLy8gbG9nZ2VyLndyaXRlKExldmVsLlNFVkVSRSwgZW50cnkpOwotCQkJCQkJCS8vIH0KLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChUaHJvd2FibGUgZXhjKSB7Ci0JCQkJCQkJLy8gTG9nZ2VyIGxvZ2dlciA9Ci0JCQkJCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCQkJCQkvLyBpZiAobG9nZ2VyLmlzTG9nZ2luZ0xldmVsKExldmVsLlNFVkVSRSkpIHsKLQkJCQkJCQkvLyBMb2dFbnRyeSBlbnRyeSA9Ci0JCQkJCQkJLy8gVmFsaWRhdGlvblBsdWdpbi5nZXRMb2dFbnRyeSgpOwotCQkJCQkJCS8vIGVudHJ5LnNldFNvdXJjZUlEKCJUYXNrTGlzdFV0aWxpdHkuZ2V0VmFsaWRhdGlvblRhc2tzKGludCwKLQkJCQkJCQkvLyBJUmVzb3VyY2UsIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkJCQkvLyB9Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoKHNldmVyaXR5ICYgZmlsdGVyU2V2ZXJpdHkuaW50VmFsdWUoKSkgPT0gMCkgewotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJdGVtcE1hcmtlcnNbdmFsaWRDb3VudCsrXSA9IG1hcmtlcjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXhjKSB7Ci0JCQkvLyBMb2dnZXIgbG9nZ2VyID0gVmFsaWRhdGlvblBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKTsKLQkJCS8vIGlmIChsb2dnZXIuaXNMb2dnaW5nTGV2ZWwoTGV2ZWwuU0VWRVJFKSkgewotCQkJLy8gTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkvLyBlbnRyeS5zZXRTb3VyY2VJRCgiVGFza0xpc3RVdGlsaXR5LmdldFZhbGlkYXRpb25UYXNrcyhpbnQsCi0JCQkvLyBJUmVzb3VyY2UsIGludCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gZW50cnkuc2V0VGFyZ2V0RXhjZXB0aW9uKGV4Yyk7Ci0JCQkvLyBsb2dnZXIud3JpdGUoTGV2ZWwuU0VWRVJFLCBlbnRyeSk7Ci0JCQkvLyB9Ci0JCX0KLQotCQlpZiAodmFsaWRDb3VudCA9PSAwKSB7Ci0JCQlyZXR1cm4gTk9fTUFSS0VSUzsKLQkJfQotCi0JCUlNYXJrZXJbXSB2YWxpZE1hcmtlcnMgPSBuZXcgSU1hcmtlclt2YWxpZENvdW50XTsKLQkJU3lzdGVtLmFycmF5Y29weSh0ZW1wTWFya2VycywgMCwgdmFsaWRNYXJrZXJzLCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHZhbGlkTWFya2VyczsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVycywgaW50IGRlcHRoKSB7Ci0JCUlNYXJrZXJbXSBtYXJrZXJzID0gZ2V0VmFsaWRhdGlvblRhc2tzKHJlc291cmNlLCBJTWVzc2FnZS5BTExfTUVTU0FHRVMsIGRlcHRoKTsKLQkJaWYgKG1hcmtlcnMubGVuZ3RoID09IDApIHsKLQkJCXJldHVybiBOT19NQVJLRVJTOwotCQl9Ci0KLQkJSU1hcmtlcltdIHRlbXAgPSBuZXcgSU1hcmtlclttYXJrZXJzLmxlbmd0aF07Ci0JCWludCB2YWxpZENvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJTWFya2VyIG1hcmtlciA9IG1hcmtlcnNbaV07Ci0KLQkJCXRyeSB7Ci0JCQkJT2JqZWN0IG93bmVyID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9PV05FUik7Ci0JCQkJaWYgKChvd25lciA9PSBudWxsKSB8fCAhKG93bmVyIGluc3RhbmNlb2YgU3RyaW5nKSkgewotCQkJCQkvLyBUaGUgVmFsaWRhdGlvbk1pZ3JhdG9yIHdpbGwgcmVtb3ZlIGFueSAidW5vd25lZCIKLQkJCQkJLy8gdmFsaWRhdGlvbiBtYXJrZXJzLgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1lc3NhZ2VPd25lcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJU3RyaW5nIG1lc3NhZ2VPd25lciA9IG1lc3NhZ2VPd25lcnNbal07Ci0JCQkJCWlmICgoKFN0cmluZykgb3duZXIpLmVxdWFscyhtZXNzYWdlT3duZXIpKSB7Ci0JCQkJCQl0ZW1wW3ZhbGlkQ291bnQrK10gPSBtYXJrZXI7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGV4YykgewotCQkJCS8vIExvZ2dlciBsb2dnZXIgPQotCQkJCS8vIFZhbGlkYXRpb25QbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCk7Ci0JCQkJLy8gaWYgKGxvZ2dlci5pc0xvZ2dpbmdMZXZlbChMZXZlbC5TRVZFUkUpKSB7Ci0JCQkJLy8gTG9nRW50cnkgZW50cnkgPSBWYWxpZGF0aW9uUGx1Z2luLmdldExvZ0VudHJ5KCk7Ci0JCQkJLy8gZW50cnkuc2V0U291cmNlSUQoIlRhc2tMaXN0VXRpbGl0eS5nZXRWYWxpZGF0aW9uVGFza3MocHJvamVjdCwKLQkJCQkvLyBTdHJpbmdbXSkiKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIGVudHJ5LnNldFRhcmdldEV4Y2VwdGlvbihleGMpOwotCQkJCS8vIGxvZ2dlci53cml0ZShMZXZlbC5TRVZFUkUsIGVudHJ5KTsKLQkJCQkvLyB9Ci0JCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCQl9Ci0JCX0KLQotCQlJTWFya2VyW10gcmVzdWx0ID0gbmV3IElNYXJrZXJbdmFsaWRDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodGVtcCwgMCwgcmVzdWx0LCAwLCB2YWxpZENvdW50KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZXRyaWV2ZXMgYWxsIHZhbGlkYXRpb24gdGFza3MgZnJvbSB0aGUgcmVzb3VyY2UuIElmIGRlcHRoCi0JICogaXMgSU5GSU5JVEUsIGNoaWxkIHRhc2tzIGFyZSByZXR1cm5lZCBhcyB3ZWxsLiBPbmx5IHRoZSB0YXNrcyB3aGljaCBhcmUKLQkgKiBvd25lZCBieSB0aGUgc3BlY2lmaWVkIG1lc3NhZ2VPd25lciwgYW5kIGFwcGx5IHRvIHRoZSBuYW1lZCBJTWVzc2FnZSdzCi0JICogdGFyZ2V0IG9iamVjdCAob2JqZWN0TmFtZSkgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBJTWFya2VyW10gZ2V0VmFsaWRhdGlvblRhc2tzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nW10gbWVzc2FnZU93bmVyLCBTdHJpbmcgb2JqZWN0TmFtZSwgU3RyaW5nIGdyb3VwTmFtZSwgaW50IGRlcHRoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmICgobWVzc2FnZU93bmVyID09IG51bGwpIHx8IChyZXNvdXJjZSA9PSBudWxsKSkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlpbnQgdmFsaWRDb3VudCA9IDA7Ci0JCUlNYXJrZXJbXSB2YWxpZExpc3QgPSBudWxsOwotCQlJTWFya2VyW10gbWFya2VycyA9IGdldFZhbGlkYXRpb25UYXNrcyhyZXNvdXJjZSwgbWVzc2FnZU93bmVyLCBkZXB0aCk7Ci0JCWlmIChtYXJrZXJzICE9IG51bGwpIHsKLQkJCXZhbGlkTGlzdCA9IG5ldyBJTWFya2VyW21hcmtlcnMubGVuZ3RoXTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCUlNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLQotCQkJCS8vIElmIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcyB0byB0aGUgc2FtZQotCQkJCS8vIHJlc291cmNlLCByZW1vdmluZyBvbmUgdGFyZ2V0J3MKLQkJCQkvLyBtZXNzYWdlcyBzaG91bGQgbm90IHJlbW92ZSB0aGUgb3RoZXIgdGFyZ2V0IG9iamVjdCdzCi0JCQkJLy8gbWVzc2FnZXMuCi0JCQkJaWYgKG9iamVjdE5hbWUgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgdGFyZ2V0T2JqZWN0ID0gbWFya2VyLmdldEF0dHJpYnV0ZShWQUxJREFUSU9OX01BUktFUl9UQVJHRVRPQkpFQ1QpOwotCQkJCQlpZiAoKHRhcmdldE9iamVjdCA9PSBudWxsKSB8fCAhKHRhcmdldE9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgfHwgISgoKFN0cmluZykgdGFyZ2V0T2JqZWN0KS5lcXVhbHMob2JqZWN0TmFtZSkpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChncm91cE5hbWUgIT0gbnVsbCkgewotCQkJCQlPYmplY3QgZ3JvdXAgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKFZBTElEQVRJT05fTUFSS0VSX0dST1VQKTsKLQkJCQkJaWYgKChncm91cCA9PSBudWxsKSB8fCAhKGdyb3VwIGluc3RhbmNlb2YgU3RyaW5nKSB8fCAhKCgoU3RyaW5nKSBncm91cCkuZXF1YWxzKGdyb3VwTmFtZSkpKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXZhbGlkTGlzdFt2YWxpZENvdW50KytdID0gbWFya2VyOwotCQkJfQotCQl9Ci0KLQkJaWYgKHZhbGlkQ291bnQgPT0gMCkgewotCQkJcmV0dXJuIE5PX01BUktFUlM7Ci0JCX0KLQotCQlJTWFya2VyW10gcmVzdWx0ID0gbmV3IElNYXJrZXJbdmFsaWRDb3VudF07Ci0JCVN5c3RlbS5hcnJheWNvcHkodmFsaWRMaXN0LCAwLCByZXN1bHQsIDAsIHZhbGlkQ291bnQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgYWxsIG1lc3NhZ2VzIGZyb20gYSByZXNvdXJjZSBpbiB0aGUgdGFzayBsaXN0LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBvd25lciwgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG5ldyBTdHJpbmdbXXtvd25lcn0sIG9iamVjdE5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGxUYXNrcyhJUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZ1tdIG93bmVycywgU3RyaW5nIG9iamVjdE5hbWUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlQWxsVGFza3MocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ2V0RGVwdGgocmVzb3VyY2UpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgcmVtb3ZlQWxsVGFza3MoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmVtb3ZlVGFza1N1YnNldChyZXNvdXJjZSwgb3duZXJzLCBvYmplY3ROYW1lLCBudWxsLCBkZXB0aCk7IC8vIG51bGwKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG1lYW5zCi0JCQkJCQkJCQkJCQkJCQkJCQkvLyBubwotCQkJCQkJCQkJCQkJCQkJCQkJLy8gZ3JvdXAKLQkJCQkJCQkJCQkJCQkJCQkJCS8vIG5hbWUKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGEgc3Vic2V0IG9mIHRhc2tzIGZyb20gdGhlIHByb2plY3QsIGluY2x1ZGluZyBjaGlsZAotCSAqIHRhc2tzLiBFdmVyeSB0YXNrIHdoaWNoIGJlbG9uZ3MgdG8gdGhlIGdyb3VwLCBpZGVudGlmaWVkIGJ5IGdyb3VwTmFtZSwKLQkgKiB3aWxsIGJlIHJlbW92ZWQuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlbW92ZVRhc2tTdWJzZXQoSVJlc291cmNlIHJlc291cmNlLCBTdHJpbmdbXSBvd25lcnMsIFN0cmluZyBvYmplY3ROYW1lLCBTdHJpbmcgZ3JvdXBOYW1lLCBpbnQgZGVwdGgpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKChvd25lcnMgPT0gbnVsbCkgfHwgKHJlc291cmNlID09IG51bGwpKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJTWFya2VyW10gYWxsVGFza3MgPSBnZXRWYWxpZGF0aW9uVGFza3MocmVzb3VyY2UsIG93bmVycywgb2JqZWN0TmFtZSwgZ3JvdXBOYW1lLCBkZXB0aCk7Ci0JCWlmIChhbGxUYXNrcy5sZW5ndGggPiAwKSB7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZGVsZXRlTWFya2VycyhhbGxUYXNrcyk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGNiZTE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5NdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQuQXV0b0VkaXRTdHJhdGVneUZvclRhYnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluay5YTUxIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mby5IVE1MSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50YWdpbmZvLkhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW50ZXJuYWwuY29tbW9uLmNvbnRlbnRhc3Npc3QuSmF2YVNjcmlwdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW50ZXJuYWwuY29tbW9uLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YVNjcmlwdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC51aS5pbnRlcm5hbC5jb21tb24udGFnaW5mby5KYXZhU2NyaXB0SW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC51aS5pbnRlcm5hbC5jb21tb24udGFnaW5mby5KYXZhU2NyaXB0VGFnSW5mb0hvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZm9ybWF0LlN0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uVGV4dEhvdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBIVE1MIGNvbnRlbnQuCi0gKiA8cD4KLSAqIENsaWVudHMgY2FuIHN1YmNsYXNzIGFuZCBvdmVycmlkZSBqdXN0IHRob3NlIG1ldGhvZHMgd2hpY2ggbXVzdCBiZSBzcGVjaWZpYwotICogdG8gdGhlaXIgbmVlZHMuCi0gKiA8L3A+Ci0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gewotCS8qCi0JICogT25lIGluc3RhbmNlIHBlciBjb25maWd1cmF0aW9uIGJlY2F1c2Ugbm90IHNvdXJjZXZpZXdlci1zcGVjaWZpYyBhbmQKLQkgKiBpdCdzIGEgU3RyaW5nIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZkxpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1M7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckhUTUw7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvckphdmFzY3JpcHQ7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBJQXV0b0VkaXRTdHJhdGVneVtdIGdldEF1dG9FZGl0U3RyYXRlZ2llcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgYWxsU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0KLQkJSUF1dG9FZGl0U3RyYXRlZ3lbXSBzdXBlclN0cmF0ZWdpZXMgPSBzdXBlci5nZXRBdXRvRWRpdFN0cmF0ZWdpZXMoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3VwZXJTdHJhdGVnaWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhbGxTdHJhdGVnaWVzLmFkZChzdXBlclN0cmF0ZWdpZXNbaV0pOwotCQl9Ci0KLQkJaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQgfHwgY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVDTEFSQVRJT04pIHsKLQkJCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUhUTUwoKSk7Ci0JCX0KLQotCQkvLyBiZSBzdXJlIHRoaXMgaXMgYWRkZWQgbGFzdCBpbiBsaXN0LCBzbyBpdCBoYXMgYSBjaGFuZ2UgdG8gbW9kaWZ5Ci0JCS8vIHByZXZpb3VzIHJlc3VsdHMuCi0JCS8vIGFkZCBhdXRvIGVkaXQgc3RyYXRlZ3kgdGhhdCBoYW5kbGVzIHdoZW4gdGFiIGtleSBpcyBwcmVzc2VkCi0JCWFsbFN0cmF0ZWdpZXMuYWRkKG5ldyBBdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicygpKTsKLQotCQlyZXR1cm4gKElBdXRvRWRpdFN0cmF0ZWd5W10pIGFsbFN0cmF0ZWdpZXMudG9BcnJheShuZXcgSUF1dG9FZGl0U3RyYXRlZ3lbYWxsU3RyYXRlZ2llcy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoZkNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPT0gbnVsbCkgewotCQkJU3RyaW5nW10geG1sVHlwZXMgPSBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJCVN0cmluZ1tdIGh0bWxUeXBlcyA9IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JIVE1MLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoKTsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzID0gbmV3IFN0cmluZ1syICsgeG1sVHlwZXMubGVuZ3RoICsgaHRtbFR5cGVzLmxlbmd0aF07Ci0KLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzWzBdID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OOwotCQkJZkNvbmZpZ3VyZWRDb250ZW50VHlwZXNbMV0gPSBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0KLQkJCWludCBpbmRleCA9IDA7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHhtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0gMiwgeG1sVHlwZXMubGVuZ3RoKTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaHRtbFR5cGVzLCAwLCBmQ29uZmlndXJlZENvbnRlbnRUeXBlcywgaW5kZXggKz0geG1sVHlwZXMubGVuZ3RoLCBodG1sVHlwZXMubGVuZ3RoKTsKLQkJfQotCi0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCkgfHwgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCkpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgSFRNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQlwcm9jZXNzb3JzID0gbmV3IElDb250ZW50QXNzaXN0UHJvY2Vzc29yW117bmV3IEphdmFTY3JpcHRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCl9OwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUNTU1BhcnRpdGlvbnMuU1RZTEUpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgQ1NTQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTikgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MKCl9OwotCQl9Ci0KLQkJcmV0dXJuIHByb2Nlc3NvcnM7Ci0JfQotCi0JcHVibGljIElDb250ZW50Rm9ybWF0dGVyIGdldENvbnRlbnRGb3JtYXR0ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJZmluYWwgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBuZXcgTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcihnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoc291cmNlVmlld2VyKSwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0KLQkJZm9ybWF0dGVyLnNldE1hc3RlclN0cmF0ZWd5KG5ldyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KG5ldyBIVE1MRm9ybWF0UHJvY2Vzc29ySW1wbCgpKSk7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwdWJsaWMgSVRleHREb3VibGVDbGlja1N0cmF0ZWd5IGdldERvdWJsZUNsaWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlpZiAoY29udGVudFR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCkgewotCQkJLy8gdXNlIHhtbCdzIGRvdWJsZWNsaWNrIHN0cmF0ZWd5Ci0JCQlyZXR1cm4gZ2V0WE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIHN1cGVyLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIElIeXBlcmxpbmtEZXRlY3RvcltdIGdldEh5cGVybGlua0RldGVjdG9ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlpZiAoc291cmNlVmlld2VyID09IG51bGwgfHwgIWZQcmVmZXJlbmNlU3RvcmUuZ2V0Qm9vbGVhbihBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9IWVBFUkxJTktTX0VOQUJMRUQpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTGlzdCBhbGxEZXRlY3RvcnMgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlhbGxEZXRlY3RvcnMuYWRkKG5ldyBYTUxIeXBlcmxpbmtEZXRlY3RvcigpKTsKLQotCQlJSHlwZXJsaW5rRGV0ZWN0b3JbXSBzdXBlckRldGVjdG9ycyA9IHN1cGVyLmdldEh5cGVybGlua0RldGVjdG9ycyhzb3VyY2VWaWV3ZXIpOwotCQlmb3IgKGludCBtID0gMDsgbSA8IHN1cGVyRGV0ZWN0b3JzLmxlbmd0aDsgbSsrKSB7Ci0JCQlJSHlwZXJsaW5rRGV0ZWN0b3IgZGV0ZWN0b3IgPSBzdXBlckRldGVjdG9yc1ttXTsKLQkJCWlmICghYWxsRGV0ZWN0b3JzLmNvbnRhaW5zKGRldGVjdG9yKSkgewotCQkJCWFsbERldGVjdG9ycy5hZGQoZGV0ZWN0b3IpOwotCQkJfQotCQl9Ci0JCXJldHVybiAoSUh5cGVybGlua0RldGVjdG9yW10pIGFsbERldGVjdG9ycy50b0FycmF5KG5ldyBJSHlwZXJsaW5rRGV0ZWN0b3JbMF0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRJbmRlbnRQcmVmaXhlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCVZlY3RvciB2ZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJLy8gcHJlZml4WzBdIGlzIGVpdGhlciAnXHQnIG9yICcgJyB4IHRhYldpZHRoLCBkZXBlbmRpbmcgb24gcHJlZmVyZW5jZQotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQkJU3RyaW5nIGluZGVudENoYXJQcmVmID0gcHJlZmVyZW5jZXMuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX0NIQVIpOwotCQlib29sZWFuIHVzZVNwYWNlcyA9IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhpbmRlbnRDaGFyUHJlZik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBhcHBlbmRUYWIgPSBmYWxzZTsKLQotCQkJaWYgKHVzZVNwYWNlcykgewotCQkJCWZvciAoaW50IGogPSAwOyBqICsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0KLQkJCQlpZiAoaSAhPSBpbmRlbnRhdGlvbldpZHRoKQotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXBwZW5kVGFiKSB7Ci0JCQkJcHJlZml4LmFwcGVuZCgnXHQnKTsKLQkJCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJCQkvLyByZW1vdmUgdGhlIHRhYiBzbyB0aGF0IGluZGVudGF0aW9uIC0gdGFiIGlzIGFsc28gYW4gaW5kZW50Ci0JCQkJLy8gcHJlZml4Ci0JCQkJcHJlZml4LmRlbGV0ZUNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJdmVjdG9yLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKFN0cmluZ1tdKSB2ZWN0b3IudG9BcnJheShuZXcgU3RyaW5nW3ZlY3Rvci5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUluZm9ybWF0aW9uUHJvdmlkZXIgZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUluZm9ybWF0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUKSB7Ci0JCQkvLyBIVE1MCi0JCQlwcm92aWRlciA9IG5ldyBIVE1MSW5mb3JtYXRpb25Qcm92aWRlcigpOwotCQl9Ci0JCWVsc2UgaWYgKHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLlNDUklQVCkgewotCQkJLy8gSFRNTCBKYXZhU2NyaXB0Ci0JCQlwcm92aWRlciA9IG5ldyBKYXZhU2NyaXB0SW5mb3JtYXRpb25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBwcm92aWRlcjsKLQl9Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyW10gcHJvdmlkZXJzID0gbnVsbDsKLQotCQlpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuSFRNTF9ERUZBVUxUIHx8IHBhcnRpdGlvblR5cGUgPT0gSUhUTUxQYXJ0aXRpb25zLkhUTUxfQ09NTUVOVCB8fCBwYXJ0aXRpb25UeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFQ0xBUkFUSU9OKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJbXXtnZXRMaW5lU3R5bGVQcm92aWRlckZvckphdmFzY3JpcHQoKX07Ci0JCX0KLQkJZWxzZSBpZiAocGFydGl0aW9uVHlwZSA9PSBJQ1NTUGFydGl0aW9ucy5TVFlMRSkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUygpfTsKLQkJfQotCi0JCXJldHVybiBwcm92aWRlcnM7Ci0JfQotCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRMaW5lU3R5bGVQcm92aWRlckZvckVtYmVkZGVkQ1NTKCkgewotCQlpZiAoZkxpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9yRW1iZWRkZWRDU1MgPSBuZXcgTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUygpOwotCQl9Ci0JCXJldHVybiBmTGluZVN0eWxlUHJvdmlkZXJGb3JFbWJlZGRlZENTUzsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckhUTUwgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTCA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckhUTUwoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTDsKLQl9Ci0KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGdldExpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YXNjcmlwdCgpIHsKLQkJaWYgKGZMaW5lU3R5bGVQcm92aWRlckZvckphdmFzY3JpcHQgPT0gbnVsbCkgewotCQkJZkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YXNjcmlwdCA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvckphdmFTY3JpcHQoKTsKLQkJfQotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9ySmF2YXNjcmlwdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRIb3ZlciBnZXRUZXh0SG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSwgaW50IHN0YXRlTWFzaykgewotCQlJVGV4dEhvdmVyIHRleHRIb3ZlciA9IG51bGw7Ci0KLQkJLy8gbG9vayBmb3IgYXBwcm9wcmlhdGUgdGV4dCBob3ZlciBwcm9jZXNzb3IgdG8gcmV0dXJuIGJhc2VkIG9uCi0JCS8vIGNvbnRlbnQgdHlwZSBhbmQgc3RhdGUgbWFzawotCQlUZXh0SG92ZXJNYW5hZ2VyIG1hbmFnZXIgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGV4dEhvdmVyTWFuYWdlcigpOwotCQlUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3JbXSBob3ZlckRlc2NzID0gbWFuYWdlci5nZXRUZXh0SG92ZXJzKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBob3ZlckRlc2NzLmxlbmd0aCAmJiB0ZXh0SG92ZXIgPT0gbnVsbCkgewotCQkJaWYgKGhvdmVyRGVzY3NbaV0uaXNFbmFibGVkKCkgJiYgRWRpdG9yVXRpbGl0eS5jb21wdXRlU3RhdGVNYXNrKGhvdmVyRGVzY3NbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKSkgPT0gc3RhdGVNYXNrKSB7Ci0JCQkJU3RyaW5nIGhvdmVyVHlwZSA9IGhvdmVyRGVzY3NbaV0uZ2V0SWQoKTsKLQkJCQlpZiAoVGV4dEhvdmVyTWFuYWdlci5DT01CSU5BVElPTl9IT1ZFUi5lcXVhbHNJZ25vcmVDYXNlKGhvdmVyVHlwZSkpIHsKLQkJCQkJLy8gY2hlY2sgaWYgc2NyaXB0IG9yIGh0bWwgaXMgbmVlZGVkCi0JCQkJCWlmIChjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQkJCQl0ZXh0SG92ZXIgPSBtYW5hZ2VyLmNyZWF0ZUJlc3RNYXRjaEhvdmVyKG5ldyBKYXZhU2NyaXB0VGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpIHsKLQkJCQkJCXRleHRIb3ZlciA9IG1hbmFnZXIuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IEhUTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVGV4dEhvdmVyTWFuYWdlci5ET0NVTUVOVEFUSU9OX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkKLQkJCQkJLy8gY2hlY2sgaWYgc2NyaXB0IG9yIGh0bWwgaXMgbmVlZGVkCi0JCQkJCWlmIChjb250ZW50VHlwZSA9PSBJSFRNTFBhcnRpdGlvbnMuU0NSSVBUKSB7Ci0JCQkJCQl0ZXh0SG92ZXIgPSBuZXcgSmF2YVNjcmlwdFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRUeXBlID09IElIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQpIHsKLQkJCQkJCXRleHRIb3ZlciA9IG5ldyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCk7Ci0JCQkJCX0KLQkJCX0KLQkJCWkrKzsKLQkJfQotCi0JCS8vIG5vIGFwcHJvcHJpYXRlIHRleHQgaG92ZXJzIGZvdW5kLCB0cnkgc3VwZXIKLQkJaWYgKHRleHRIb3ZlciA9PSBudWxsKSB7Ci0JCQl0ZXh0SG92ZXIgPSBzdXBlci5nZXRUZXh0SG92ZXIoc291cmNlVmlld2VyLCBjb250ZW50VHlwZSwgc3RhdGVNYXNrKTsKLQkJfQotCQlyZXR1cm4gdGV4dEhvdmVyOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGdldFhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmWE1MU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwoKTsKLQkJfQotCQlyZXR1cm4gZlhNTFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjViNTM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IEhUTUwgVUkKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFJlc291cmNlQnVuZGxlIGZSZXNvdXJjZUJ1bmRsZTsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBIVE1MVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCQotCXByaXZhdGUgSFRNTFVJTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlIG9mIHRoaXMgY2xhc3MKLQl9Ci0JCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfSFRNTF9kb2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX05FV19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfTkVXX0RFU0NSSVBUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFTkFNRV9NVVNUX0VORF9IVE1MOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9XQVJOSU5HX0ZPTERFUl9NVVNUX0JFX0lOU0lERV9XRUJfQ09OVEVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZXNvdXJjZUdyb3VwX25hbWVFeGlzdHM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19maWxlc19lbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNRVNTQUdFX0hUTUxfVkFMSURBVElPTl9NRVNTQUdFX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2xhYmVsOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfdG9vbHRpcDsgLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwOyAvLyByZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIHJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbmRPY2N1cnJlbmNlc19sYWJlbDsJLy8gcmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9EZXNjcmlwdGlvbl9vZl9yb2xlX29mX2ZvbGxvd2luZ19ET0NUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9QdWJsaWNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfU3lzdGVtX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX25vbmU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQ1NTX3Byb2ZpbGVfX18yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMDsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcmVmZXJyZWRfbWFya3VwX2Nhc2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lc19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19uYW1lc19VcHBlcl9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZXNfTG93ZXJfY2FzZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVzX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX25hbWVzX1VwcGVyX2Nhc2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF0dHJpYnV0ZV9uYW1lc19Mb3dlcl9jYXNlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9jYXNlX0FzX2lzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9jYXNlX0xvd2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYWdfbmFtZV9jYXNlX1VwcGVyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9jYXNlX0FzX2lzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9jYXNlX0xvd2VyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfbmFtZV9jYXNlX1VwcGVyX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X21pc3NpbmdfdGFnc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydF9FT0xfY29kZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9XaW5kb3dzX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9Vbml4X1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9NYWNfVUk7Ci0KLQkvLyBiZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgZGVsZXRlZAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBIVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8zOwotCS8vIGFib3ZlIGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSBkZWxldGVkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9IVE1MVUlQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzczMTRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsOwotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgSFRNTFVJUGx1Z2luIGV4dGVuZHMgQWJzdHJhY3RVSVBsdWdpbiB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIEhUTUxVSVBsdWdpbiBpbnN0YW5jZSA9IG51bGw7CQotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgaHRtbCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZUZW1wbGF0ZVN0b3JlOwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgZWRpdG9yLgotCSAqLwotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBmQ29udGV4dFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBIVE1MVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEhUTUxVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnkgZ2V0QWRhcHRlckZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGh0bWwgZWRpdG9yIHRlbXBsYXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZSBzdG9yZSBmb3IgdGhlIGh0bWwgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCksIGdldFByZWZlcmVuY2VTdG9yZSgpLCBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGh0bWwgcGx1Z2luCi0JICovCi0JcHVibGljIENvbnRleHRUeXBlUmVnaXN0cnkgZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKSB7Ci0JCWlmIChmQ29udGV4dFR5cGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbmV3IENvbnRyaWJ1dGlvbkNvbnRleHRUeXBlUmVnaXN0cnkoKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQkJcmVnaXN0cnkuYWRkQ29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuVEFHKTsKLQkJCXJlZ2lzdHJ5LmFkZENvbnRleHRUeXBlKFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFUVFJJQlVURSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEVfVkFMVUUpOwotCi0JCQlmQ29udGV4dFR5cGVSZWdpc3RyeSA9IHJlZ2lzdHJ5OwotCQl9Ci0KLQkJcmV0dXJuIGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0hUTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3YmUwNTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvSFRNTFVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgYSBzYW1wbGUgSFRNTCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgSFRNTCBIaWdobGlnaHRpbmcgUHJlZmVyZW5jZXMKLSMjIHdlIG5lZWQgYSBmbGFtaW5nIGxvZ28KLVNhbXBsZV9IVE1MX2RvYz08IURPQ1RZUEUgSFRNTFxuXHRQVUJMSUMgXCItLy9XM0MvRFRELyBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTlwiXG5cdFwiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkXCI+XG48SFRNTD5cblx0PEhFQUQ+XG5cdFx0PE1FVEEgY29udGVudD1cInRleHQvaHRtbFwiPlxuXHRcdDxUSVRMRT5IVE1MIEhpZ2hsaWdodGluZyBQcmVmZXJlbmNlczwvVElUTEU+XG5cdDwvSEVBRD5cbjxCT0RZPlxuXHQ8IS0tXG5cdFx0d2UgbmVlZCBhIGZsYW1pbmcgbG9nbyFcblx0LS0+XG48L0JPRFk+XG48L0hUTUw+Ci0KLUhUTUxGaWxlc1ByZWZlcmVuY2VQYWdlXzA9TG9hZGluZyBmaWxlcy4uLgotIwotX1VJX1dJWkFSRF9ORVdfVElUTEUgPSBOZXcgSFRNTCBQYWdlCi1fVUlfV0laQVJEX05FV19IRUFESU5HID0gSFRNTCBQYWdlCi1fVUlfV0laQVJEX05FV19ERVNDUklQVElPTiA9IENyZWF0ZSBhIG5ldyBIVE1MIFBhZ2UuCi1fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSFRNTCA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi1fV0FSTklOR19GT0xERVJfTVVTVF9CRV9JTlNJREVfV0VCX0NPTlRFTlQgPSBGaWxlcyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIFdlYiBDb250ZW50IGZvbGRlciB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB5b3VyIGRlcGxveWVkIFdlYiBhcHBsaWNhdGlvbi4gCi1SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMgPSBUaGUgc2FtZSBuYW1lIGFscmVhZHkgZXhpc3RzLgotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMD1TZWxlY3QgSFRNTCBUZW1wbGF0ZQotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMT1TZWxlY3QgYSB0ZW1wbGF0ZSBhcyBpbml0aWFsIGNvbnRlbnQgaW4gdGhlIEhUTUwgcGFnZS4KLU5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMz1EZXNjcmlwdGlvbgotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfND1Vc2UgSFRNTCBUZW1wbGF0ZQotTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNT1QcmV2aWV3Ci1OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV82PVRlbXBsYXRlcyBhcmUgJ05ldyBIVE1MJyB0ZW1wbGF0ZXMgZm91bmQgaW4gdGhlIDxhPkhUTUwgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCi0jCi1DcmVhdGluZ19maWxlc19lbmNvZGluZz1DcmVhdGluZyBmaWxlcyBlbmNvZGluZyBwcmVmZXJlbmNlCi1NRVNTQUdFX0hUTUxfVkFMSURBVElPTl9NRVNTQUdFX1VJXz1IVE1MIFN5bnRheCA6IHswfQotIyBDb3BpZWQgZnJvbSBzc2UudWkKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DbGVhbnVwIERvY3VtZW50Li4uCi1DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcD1DbGVhbnVwIERvY3VtZW50Ci1DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb249Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1SZW1vdmUgQmxvY2sgQ29tbWVudAotRmluZE9jY3VycmVuY2VzX2xhYmVsPU9jY3VycmVuY2VzIGluIEZpbGUKLUNyZWF0aW5nX2ZpbGVzPUNyZWF0aW5nIGZpbGVzCi1FbmNvZGluZ19kZXNjPVRoZSBmb2xsb3dpbmcgZW5jb2Rpbmcgd2lsbCBhcHBseToKLVByZWZlcnJlZF9tYXJrdXBfY2FzZV9VSV89UHJlZmVycmVkIG1hcmt1cCBjYXNlIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGNvZGUgZ2VuZXJhdGlvbgotVGFnX25hbWVzX19VSV89VGFnIG5hbWVzOgotVGFnX25hbWVzX1VwcGVyX2Nhc2VfVUlfPSZVcHBlcmNhc2UKLVRhZ19uYW1lc19Mb3dlcl9jYXNlX1VJXz0mTG93ZXJjYXNlCi1BdHRyaWJ1dGVfbmFtZXNfX1VJXz1BdHRyaWJ1dGUgbmFtZXM6Ci1BdHRyaWJ1dGVfbmFtZXNfVXBwZXJfY2FzZV9VSV89VSZwcGVyY2FzZQotQXR0cmlidXRlX25hbWVzX0xvd2VyX2Nhc2VfVUlfPUwmb3dlcmNhc2UKLUNsZWFudXBfVUlfPUNsZWFudXAKLVRhZ19uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfPVRhZyBuYW1lIGNhc2UgZm9yIEhUTUw6Ci1UYWdfbmFtZV9jYXNlX0FzX2lzX1VJXz0mQXMtaXMKLVRhZ19uYW1lX2Nhc2VfTG93ZXJfVUlfPSZMb3dlcgotVGFnX25hbWVfY2FzZV9VcHBlcl9VSV89JlVwcGVyCi1BdHRyaWJ1dGVfbmFtZV9jYXNlX2Zvcl9IVE1MX1VJXz1BdHRyaWJ1dGUgbmFtZSBjYXNlIGZvciBIVE1MOgotQXR0cmlidXRlX25hbWVfY2FzZV9Bc19pc19VSV89QSZzLWlzCi1BdHRyaWJ1dGVfbmFtZV9jYXNlX0xvd2VyX1VJXz1MJm93ZXIKLUF0dHJpYnV0ZV9uYW1lX2Nhc2VfVXBwZXJfVUlfPVUmcHBlcgotSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfPUluc2VydCAmcmVxdWlyZWQgYXR0cmlidXRlcwotSW5zZXJ0X21pc3NpbmdfdGFnc19VSV89Jkluc2VydCBtaXNzaW5nIHRhZ3MKLVF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfPSZRdW90ZSBhdHRyaWJ1dGUgdmFsdWVzCi1Gb3JtYXRfc291cmNlX1VJXz0mRm9ybWF0IHNvdXJjZQotQ29udmVydF9FT0xfY29kZXNfVUlfPUNvbnZlcnQgbGluZSAmZGVsaW1pdGVycyB0bwotRU9MX1dpbmRvd3NfVUk9JldpbmRvd3MKLUVPTF9Vbml4X1VJPVUmTklYCi1FT0xfTWFjX1VJPSZNYWMKLQotIyB3ZWIgY29udGVudCBzZXR0aW5ncwotVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRT1Vc2UgdGhlIGZvbGxvd2luZyBkZWZhdWx0IGRvY3VtZW50IHR5cGUgd2hlbiBubyBET0NUWVBFIGlzIGRlY2xhcmVkIGluIGEgZmlsZToKLVVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMT1Eb2N1bWVudCB0eXBlOgotVUlfUHVibGljX0lEPVB1YmxpYyBJRDoKLVVJX1N5c3RlbV9JRD1TeXN0ZW0gSUQ6Ci1VSV9ub25lPW5vbmUKLVVJX0NTU19wcm9maWxlX19fMj1DU1MgcHJvZmlsZToKLVdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZV8wPVRoZSBwcm9wZXJ0aWVzIHVzZWQgdGhhdCBjYW5ub3Qgb3IgYXJlIG5vdCBzcGVjaWZpZWQgaW4gd2ViIGZpbGVzLiAgVGhlIHByb2plY3Qgc2V0dGluZyBpcyB1c2VkIGlmIHlvdSBzcGVjaWZ5ICJub25lLiIKLVByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2VfMD1UaGUgcHJvcGVydGllcyBmb3IgSjJFRSBXZWIgcHJvamVjdHMgYWN0IGFzICJwcm9qZWN0IiBkZWZhdWx0IHRvIGJlIGxvb2tlZCB1cCB3aGVuIG5vIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZCBmb3IgYSBwYXJ0aWN1bGFyIHdlYiBmaWxlLgotCi0jIGJlbG93IGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSBkZWxldGVkCi1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8xPUFkZCB0aGlzIHN1ZmZpeCAoaWYgbm90IHNwZWNpZmllZCk6Ci1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8yPUluc2VydCBET0NUWVBFIGRlY2xhcmF0aW9uCi1IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZV8zPUluc2VydCBHRU5FUkFUT1Igd2l0aCBNRVRBIHRhZwotIyBhYm92ZSBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgZGVsZXRlZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNjAwMTMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpIjsgLy8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gSVN0YXR1cy5FUlJPUjsgLy8gNAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0RFQlVHID0gMjAwICsgRVJST1I7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GTyA9IElTdGF0dXMuSU5GTzsgLy8gMQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk9fREVCVUcgPSAyMDAgKyBJTkZPOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0sgPSBJU3RhdHVzLk9LOyAvLyAwCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPS19ERUJVRyA9IDIwMCArIE9LOwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFRklMVEVSX0xPQ0FUSU9OID0gIi9kZWJ1Zy90cmFjZWZpbHRlciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HID0gSVN0YXR1cy5XQVJOSU5HOyAvLyAyCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklOR19ERUJVRyA9IDIwMCArIFdBUk5JTkc7Ci0KLQkvKioKLQkgKiBBZGRzIG1lc3NhZ2UgdG8gbG9nLgotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgc2V2ZXJpdHkgbGV2ZWwgb2YgdGhlIG1lc3NhZ2UgKE9LLCBJTkZPLCBXQVJOSU5HLCBFUlJPUiwKLQkgKiAgICAgICAgICAgIE9LX0RFQlVHLCBJTkZPX0RFQlVHLCBXQVJOSU5HX0RFQlVHLCBFUlJPUl9ERUJVRykKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBhZGQgdG8gdGhlIGxvZwotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0aHJvd24KLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2xvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChsZXZlbCA9PSBPS19ERUJVRyB8fCBsZXZlbCA9PSBJTkZPX0RFQlVHIHx8IGxldmVsID09IFdBUk5JTkdfREVCVUcgfHwgbGV2ZWwgPT0gRVJST1JfREVCVUcpIHsKLQkJCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2V2ZXJpdHkgPSBJU3RhdHVzLk9LOwotCQlzd2l0Y2ggKGxldmVsKSB7Ci0JCQljYXNlIElORk9fREVCVUcgOgotCQkJY2FzZSBJTkZPIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuSU5GTzsKLQkJCQlicmVhazsKLQkJCWNhc2UgV0FSTklOR19ERUJVRyA6Ci0JCQljYXNlIFdBUk5JTkcgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFUlJPUl9ERUJVRyA6Ci0JCQljYXNlIEVSUk9SIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuRVJST1I7Ci0JCX0KLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhzZXZlcml0eSwgUExVR0lOX0lELCBzZXZlcml0eSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGxhdGZvcm0gaXMgZGVidWdnaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzRGVidWdnaW5nKCkgewotCQlyZXR1cm4gUGxhdGZvcm0uaW5EZWJ1Z01vZGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIGlmIGN1cnJlbnRseSB0cmFjaW5nIGEgY2F0ZWdvcnkKLQkgKiAKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdHJhY2luZyBjYXRlZ29yeSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZyhTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyB0cmFjZUZpbHRlciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKFBMVUdJTl9JRCArIFRSQUNFRklMVEVSX0xPQ0FUSU9OKTsKLQkJaWYgKHRyYWNlRmlsdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRyYWNlRmlsdGVyLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJCVN0cmluZyBjYXQgPSB0b2tlbml6ZXIubmV4dFRva2VuKCkudHJpbSgpOwotCQkJCWlmIChjYXRlZ29yeS5lcXVhbHMoY2F0KSkgewotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2coRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfdHJhY2UoY2F0ZWdvcnksIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L0F1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYjM5NGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkNvbmZpZ3VyYWJsZUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEF1dG9FZGl0U3RyYXRlZ3kgdG8gaGFuZGxlIGNoYXJhY3RlcnMgaW5zZXJ0ZWQgd2hlbiBUYWIga2V5IGlzIHByZXNzZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRBQl9DSEFSQUNURVIgPSAiXHQiOwkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkKLQkJCXJldHVybjsKLQkJCi0JCS8vIHNwYWNlcyBmb3IgdGFiIGNoYXJhY3RlcgotCQlpZiAoY29tbWFuZC5sZW5ndGggPT0gMCAmJiBjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpICE9IC0xKQotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBzcGFjZXMgZm9yIHRhYnMKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvclRhYihEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHRhYiBrZXkgd2FzIHByZXNzZWQuIG5vdyBjaGVjayBwcmVmZXJlbmNlcyB0byBzZWUgaWYgbmVlZCB0byBpbnNlcnQKLQkJLy8gc3BhY2VzIGluc3RlYWQgb2YgdGFiCi0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gZ2V0SW5kZW50YXRpb25XaWR0aCgpOwotCQlpZiAoaW5kZW50YXRpb25XaWR0aCA+IC0xKSB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUZXh0ID0gY29tbWFuZC50ZXh0OwotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKG9yaWdpbmFsVGV4dCk7Ci0KLQkJCS8vIGRldGVybWluZSB3aGVyZSBpbiBsaW5lIHRoaXMgY29tbWFuZCBiZWdpbnMKLQkJCWludCBsaW5lT2Zmc2V0ID0gLTE7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChjb21tYW5kLm9mZnNldCk7Ci0JCQkJbGluZU9mZnNldCA9IGNvbW1hbmQub2Zmc2V0IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCi0JCQlJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBnZXRMaW5lVHJhY2tlcihkb2N1bWVudCwgb3JpZ2luYWxUZXh0KTsKLQotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCi0JCQkJLy8gcmVwbGFjZSBcdCBjaGFyYWN0ZXIgd2l0aCBzcGFjZXMKLQkJCQluZXdUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgaW5kZW50KTsKLQkJCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZVRyYWNrZXIucmVwbGFjZShpbmRleCwgMSwgaW5kZW50KTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCByZXBsYWNpbmcgdGV4dCwganVzdAotCQkJCQkJLy8gcmVzZXQgdG8gY3VycmVudCBzdHJpbmcKLQkJCQkJCWxpbmVUcmFja2VyLnNldChuZXdUZXh0LnRvU3RyaW5nKCkpOwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgaW5kZW50Lmxlbmd0aCgpOwotCQkJCWluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIsIHN0YXJ0SW5kZXgpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gbmV3VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAobGluZUluZm8uZ2V0T2Zmc2V0KCkgPT0gMCAmJiBsaW5lT2Zmc2V0ID4gLTEpCi0JCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCQllbHNlCi0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGxpbmVPZmZzZXQgPiAtMSkgewotCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCX0KLQkJfQotCQlpZiAob2Zmc2V0SW5MaW5lID4gLTEgJiYgaW5kZW50YXRpb25XaWR0aCA+IDApIHsKLQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCQkJaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGggLSByZW1haW5kZXI7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykKLQkJCWluZGVudC5hcHBlbmQoJyAnKTsKLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhIGxpbmUgdHJhY2tlciBmb3IgdGV4dCB3aXRoaW4gY29tbWFuZCBpZiB0ZXh0IGlzIG11bHRpLWxpbmUKLQkgKi8KLQlwcml2YXRlIElMaW5lVHJhY2tlciBnZXRMaW5lVHJhY2tlcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBvcmlnaW5hbFRleHQpIHsKLQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBudWxsOwotCQlpbnRbXSBkZWxpbXMgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBvcmlnaW5hbFRleHQsIDApOwotCQlpZiAoZGVsaW1zWzBdICE9IC0xIHx8IGRlbGltc1sxXSAhPSAtMSkgewotCQkJbGluZVRyYWNrZXIgPSBuZXcgQ29uZmlndXJhYmxlTGluZVRyYWNrZXIoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpKTsKLQkJCWxpbmVUcmFja2VyLnNldChvcmlnaW5hbFRleHQpOwotCQl9Ci0JCXJldHVybiBsaW5lVHJhY2tlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWN0aXZlIGVkaXRvciBpcyBpbiBzbWFydCBpbnNlcnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSgpIHsKLQkJYm9vbGVhbiBpc1NtYXJ0SW5zZXJ0TW9kZSA9IGZhbHNlOwotCQkKLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJCWlmIChwYWdlICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlpZiAoZWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvcjsKLQkJCQkJZWxzZQotCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcillZGl0b3IuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCQotCQkvLyBjaGVjayBpZiBzbWFydCBpbnNlcnQgbW9kZQotCQlpZiAodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpCi0JCQlpc1NtYXJ0SW5zZXJ0TW9kZSA9IHRydWU7Ci0JCXJldHVybiBpc1NtYXJ0SW5zZXJ0TW9kZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyBpbmRlbnRhdGlvbiB3aWR0aCBpZiB1c2luZyBzcGFjZXMgZm9yIGluZGVudGF0aW9uLCAtMSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZW50YXRpb25XaWR0aCgpIHsKLQkJaW50IHdpZHRoID0gLTE7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJaWYgKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhwcmVmZXJlbmNlcy5nZXRTdHJpbmcoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKQotCQkJd2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSk7Ci0KLQkJcmV0dXJuIHdpZHRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5SFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxN2Q2NzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yRXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBdXRvbWF0aWNhbGx5IGluc2VydHMgY2xvc2luZyBjb21tZW50IHRhZyBvciBlbmQgdGFnIHdoZW4gYXBwcm9wcmlhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQXV0b0VkaXRTdHJhdGVneUhUTUwgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JLyoKLQkgKiBOT1RFOiBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdHMgaW4KLQkgKiBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbW1hbmQudGV4dCAhPSBudWxsKSB7Ci0JCQkJCXNtYXJ0SW5zZXJ0Rm9yQ29tbWVudChjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCQlzbWFydEluc2VydEZvckVuZFRhZyhjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQgJiYgKChJRE9NRWxlbWVudCkgbm9kZSkuaXNDb21tZW50VGFnKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvckNvbW1lbnQoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIi0iKSAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSAzICYmIGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCAtIDMsIDMpLmVxdWFscygiPCEtIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJY29tbWFuZC50ZXh0ICs9ICIgIC0tPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljb21tYW5kLnNoaWZ0c0NhcmV0ID0gZmFsc2U7Ci0JCQkJY29tbWFuZC5jYXJldE9mZnNldCA9IGNvbW1hbmQub2Zmc2V0ICsgMjsKLQkJCQljb21tYW5kLmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yRW5kVGFnKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCIvIikgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMSAmJiBkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQgLSAxLCAxKS5lcXVhbHMoIjwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSAoKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNvbW1hbmQub2Zmc2V0IC0gMSkpLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAoaXNDb21tZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IG5vZGUgcGFyZW50Ci0JCQkJCXdoaWxlIChwYXJlbnROb2RlICE9IG51bGwgJiYgaXNDb21tZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkJcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgcGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIWlzRG9jdW1lbnROb2RlKHBhcmVudE5vZGUpKSB7Ci0JCQkJCS8vIG9ubHkgYWRkIGVuZCB0YWcgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3Qgb3IgaWYKLQkJCQkJLy8gYWRkICcvJyBkb2VzIG5vdCBjcmVhdGUgb25lIGFscmVhZHkKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBwYXJlbnROb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciB0b0FkZCA9IG5ldyBTdHJpbmdCdWZmZXIocGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCWlmICh0b0FkZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQl0b0FkZC5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBzdWZmaXggPSB0b0FkZC50b1N0cmluZygpOwotCQkJCQkJCWlmICgoZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPCBjb21tYW5kLm9mZnNldCArIHN1ZmZpeC5sZW5ndGgoKSkgfHwgKCFzdWZmaXguZXF1YWxzKGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCwgc3VmZml4Lmxlbmd0aCgpKSkpKSB7Ci0JCQkJCQkJCWNvbW1hbmQudGV4dCArPSBzdWZmaXg7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY3RpdmUgdGV4dCBlZGl0b3IgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0aGUgYWN0aXZlIGVkaXRvcgotCSAqIHBhcnQuCi0JICogCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21UZW1wbGF0ZVByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMDhmZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9DdXN0b21UZW1wbGF0ZVByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbDsKLQotLyoqCi0gKiBQdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gbWFrZSB0aGUgYWRkaXRpb25hbCBwcm9wb3NhbCBpbmZvIGludG8gY29udGVudAotICogZml0IGZvciBhbiBIVE1MIHZpZXdlciAoYnkgZXNjYXBpbmcgY2hhcmFjdGVycykKLSAqLwotY2xhc3MgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCBleHRlbmRzIFRlbXBsYXRlUHJvcG9zYWwgaW1wbGVtZW50cyBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0KLQlwdWJsaWMgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBJbWFnZSBpbWFnZSwgaW50IHJlbGV2YW5jZSkgewotCQlzdXBlcih0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBpbWFnZSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCVN0cmluZyBhZGRpdGlvbmFsSW5mbyA9IHN1cGVyLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLQkJcmV0dXJuIFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KGFkZGl0aW9uYWxJbmZvKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExYWQzMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTENNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MNDBOYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxVSVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW50ZXJuYWwuY29tbW9uLmNvbnRlbnRhc3Npc3QuSmF2YVNjcmlwdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFJlcXVlc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MUmVsZXZhbmNlQ29uc3RhbnRzOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQlwcml2YXRlIElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeUZvckNTUyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNYSFRNTCA9IGZhbHNlOwotCXByaXZhdGUgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBmVGVtcGxhdGVQcm9jZXNzb3IgPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVGVtcGxhdGVDb250ZXh0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXB1YmxpYyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpIHsKLQotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5BVFRSSUJVVEUpOwotCQlzdXBlci5hZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFUVFJJQlVURV9WQUxVRSk7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb3Bvc2FscyBmb3IgYSBjb21wbGV0ZWx5IGVtcHR5IGRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW1wdHlEb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLk5FVyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkUENEQVRBUHJvcG9zYWwoU3RyaW5nIG5vZGVOYW1lLCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlpZiAoaXNYSFRNTCkKLQkJCXN1cGVyLmFkZFBDREFUQVByb3Bvc2FsKG5vZGVOYW1lLCBjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkU3RhcnREb2N1bWVudFByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlpZiAoaXNYSFRNTCkKLQkJCWFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRhZ0luc2VydGlvblByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgaW50IGNoaWxkUG9zaXRpb24pIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5UQUcpOwotCQlzdXBlci5hZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNoaWxkUG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjb250ZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSk7Ci0JfQotCQotCS8qKgotCSAqIEFkZHMgdGVtcGxhdGVzIHRvIHRoZSBsaXN0IG9mIHByb3Bvc2FscwotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZFRlbXBsYXRlcyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydE9mZnNldCkgewotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGlmIGFscmVhZHkgYWRkaW5nIHRlbXBsYXRlIHByb3Bvc2FscyBmb3IgYSBjZXJ0YWluIGNvbnRleHQgdHlwZSwgZG8KLQkJLy8gbm90IGFkZCBhZ2FpbgotCQlpZiAoIWZUZW1wbGF0ZUNvbnRleHRzLmNvbnRhaW5zKGNvbnRleHQpKSB7Ci0JCQlmVGVtcGxhdGVDb250ZXh0cy5hZGQoY29udGV4dCk7Ci0JCQlib29sZWFuIHVzZVByb3Bvc2FsTGlzdCA9ICFjb250ZW50QXNzaXN0UmVxdWVzdC5zaG91bGRTZXBhcmF0ZSgpOwotCi0JCQlpZiAoZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgIT0gbnVsbCkgewotCQkJCWdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLnNldENvbnRleHRUeXBlKGNvbnRleHQpOwotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKS5jb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhmVGV4dFZpZXdlciwgc3RhcnRPZmZzZXQpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvcG9zYWxzLmxlbmd0aDsgKytpKSB7Ci0JCQkJCWlmICh1c2VQcm9wb3NhbExpc3QpCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbHNbaV0pOwotCQkJCQllbHNlCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRNYWNybyhwcm9wb3NhbHNbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJlZ2luc1dpdGgoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCB8fCBwcmVmaXggPT0gbnVsbCB8fCBwcmVmaXgubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiB0cnVlOwotCQlpbnQgbWluaW11bUxlbmd0aCA9IE1hdGgubWluKHByZWZpeC5sZW5ndGgoKSwgYVN0cmluZy5sZW5ndGgoKSk7Ci0JCVN0cmluZyBiZWdpbm5pbmcgPSBhU3RyaW5nLnN1YnN0cmluZygwLCBtaW5pbXVtTGVuZ3RoKTsKLQkJcmV0dXJuIGJlZ2lubmluZy5lcXVhbHNJZ25vcmVDYXNlKHByZWZpeCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlLCBJRE9NTm9kZSB4bWxub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IHJlcXVlc3QgPSBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkvLyBidWcxMTU5MjcgdXNlIG9yaWdpbmFsIGRvY3VtZW50IHBvc2l0aW9uIGZvciBhbGwvYW55IHJlZ2lvbiB0ZW1wbGF0ZXMKLQkJYWRkVGVtcGxhdGVzKHJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLkFMTCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiBhIGxpc3Qgb2YgcHJvcG9zZWQgY29kZSBjb21wbGV0aW9ucyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dC1lZGl0b3IgY29udHJvbC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgYSBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBhcnJheSBvZiBjb2RlLWFzc2lzdCBpdGVtcwotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZlRlbXBsYXRlQ29udGV4dHMuY2xlYXIoKTsKLQotCQlJbmRleGVkUmVnaW9uIHRyZWVOb2RlID0gQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgdHJlZU5vZGU7Ci0JCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQotCQkvLyBjaGVjayBpZiBpdCdzIGluIGEgY29tbWVudCBub2RlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGZuICE9IG51bGwgJiYgZm4uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCAmJiBkb2N1bWVudFBvc2l0aW9uICE9IGZuLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJfQotCi0JCS8vIENNVkMgMjQyNjk1Ci0JCS8vIGlmIGl0J3MgYSA8L3NjcmlwdD4gdGFnLCBib3VuY2UgYmFjayB0byBKUyBjYSBwcm9jZXNzb3IuLi4KLQkJaWYgKGZuICE9IG51bGwgJiYgZm4uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmIGRvY3VtZW50UG9zaXRpb24gPT0gZm4uZ2V0U3RhcnRPZmZzZXQoKSkgewotCQkJSVRleHRSZWdpb25MaXN0IHYgPSBmbi5nZXRSZWdpb25zKCk7Ci0JCQlpZiAodi5zaXplKCkgPiAxKSB7Ci0JCQkJLy8gZGV0ZXJtaW5lIHRoYXQgaXQncyBhIGNsb3NlIHRhZwotCQkJCWlmICgodi5nZXQoMCkpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQkJSXRlcmF0b3IgaXQgPSB2Lml0ZXJhdG9yKCk7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQkJCS8vIHNlYXJjaCBmb3Igc2NyaXB0IHRhZyBuYW1lCi0JCQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQkJCXJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgaXQubmV4dCgpOwotCQkJCQkJaWYgKGZuLmdldFRleHQocmVnaW9uKS5lcXVhbHNJZ25vcmVDYXNlKCJzY3JpcHQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJLy8gcmV0dXJuIEpTIGNvbnRlbnQgYXNzaXN0Li4uCi0JCQkJCQkJSmF2YVNjcmlwdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IganNQcm9jZXNzb3IgPSBuZXcgSmF2YVNjcmlwdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJCQkJCQlyZXR1cm4ganNQcm9jZXNzb3IuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpc1hIVE1MID0gZ2V0WEhUTUwobm9kZSk7Ci0KLQkJZkdlbmVyYXRvciA9IG51bGw7IC8vIGZvcmNlIHJlbG9hZCBvZiBjb250ZW50IGdlbmVyYXRvcgotCi0JCS8vIGhhbmRsZSBibGFuayBIVE1MIGRvY3VtZW50IGNhc2UKLQkJaWYgKHRyZWVOb2RlID09IG51bGwgfHwgaXNWaWV3ZXJFbXB0eSh0ZXh0Vmlld2VyKSkgewotCQkJLy8gY3Vyc29yIGlzIGF0IHRoZSBFT0YKLQkJCUlDb21wbGV0aW9uUHJvcG9zYWwgaHRtbFRhZ1Byb3Bvc2FsID0gZ2V0SFRNTFRhZ1Byb3Bzb3NhbCgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHN1cGVyUmVzdWx0cyA9IHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJaWYgKHN1cGVyUmVzdWx0cyAhPSBudWxsICYmIHN1cGVyUmVzdWx0cy5sZW5ndGggPiAwICYmIGh0bWxUYWdQcm9wb3NhbCAhPSBudWxsKSB7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGJsYW5rSFRNTERvY1Jlc3VsdHMgPSBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtzdXBlclJlc3VsdHMubGVuZ3RoICsgMV07Ci0JCQkJYmxhbmtIVE1MRG9jUmVzdWx0c1swXSA9IGh0bWxUYWdQcm9wb3NhbDsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHN1cGVyUmVzdWx0cywgMCwgYmxhbmtIVE1MRG9jUmVzdWx0cywgMSwgc3VwZXJSZXN1bHRzLmxlbmd0aCk7Ci0JCQkJcmV0dXJuIGJsYW5rSFRNTERvY1Jlc3VsdHM7Ci0JCQl9Ci0JCX0KLQotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCi0JCQkvLyBjaGVjayBlbWJlZGRlZCBDU1MgcHJvcG9zYWxzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNUWUxFIGVuZAotCQkJLy8gdGFnCi0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZWxlbWVudC5nZXRUYWdOYW1lKCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsICYmIHRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKSkgey8vJE5PTi1OTFMtMSQKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWludCBvZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWludCBwb3MgPSBkb2N1bWVudFBvc2l0aW9uIC0gb2Zmc2V0OwotCQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldENTU1Byb3Bvc2Fscyh0ZXh0Vmlld2VyLCBwb3MsIG5vZGUsIG9mZnNldCwgKGNoYXIpIDApOwotCQkJCQkJaWYgKHByb3Bvc2FscyAhPSBudWxsKQotCQkJCQkJCXJldHVybiBwcm9wb3NhbHM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNoZWNrIGlubGluZSBDU1MgcHJvcG9zYWxzCi0JCQkvLyBuZWVkIHRvIGZpbmQgYXR0ciByZWdpb24gZnJvbSBzZCByZWdpb24KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJSXRlcmF0b3IgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5pdGVyYXRvcigpOwotCQkJSVRleHRSZWdpb24gc3R5bGVOYW1lUmVnaW9uID0gbnVsbDsKLQkJCUlUZXh0UmVnaW9uIHN0eWxlVmFsdWVSZWdpb24gPSBudWxsOwotCQkJd2hpbGUgKHJlZ2lvbnMuaGFzTmV4dCgpKSB7Ci0JCQkJc3R5bGVOYW1lUmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQlpZiAoc3R5bGVOYW1lUmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSAmJiBzZFJlZ2lvbi5nZXRUZXh0KHN0eWxlTmFtZVJlZ2lvbikuZXF1YWxzSWdub3JlQ2FzZShIVE1MNDBOYW1lc3BhY2UuQVRUUl9OQU1FX1NUWUxFKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIHRoZSBuZXh0IHJlZ2lvbiBzaG91bGQgYmUgIj0iCi0JCQkJCWlmIChyZWdpb25zLmhhc05leHQoKSkgewotCQkJCQkJcmVnaW9ucy5uZXh0KCk7IC8vIHNraXAgdGhlICI9IgotCQkJCQkJLy8gbmV4dCByZWdpb24gc2hvdWxkIGJlIGF0dHIgdmFsdWUgcmVnaW9uCi0JCQkJCQlpZiAocmVnaW9ucy5oYXNOZXh0KCkpIHsKLQkJCQkJCQlzdHlsZVZhbHVlUmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25zLm5leHQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHN0eWxlVmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJCWludCBvZmZzZXQgPSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChzdHlsZVZhbHVlUmVnaW9uKTsKLQkJCQlpbnQgZW5kID0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChzdHlsZVZhbHVlUmVnaW9uKTsKLQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSBvZmZzZXQgJiYgZG9jdW1lbnRQb3NpdGlvbiA8PSBlbmQpIHsKLQkJCQkJYm9vbGVhbiBhc2tDU1MgPSB0cnVlOwotCQkJCQljaGFyIHF1b3RlID0gKGNoYXIpIDA7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gc2RSZWdpb24uZ2V0VGV4dChzdHlsZVZhbHVlUmVnaW9uKTsKLQkJCQkJaW50IGxlbmd0aCA9ICh0ZXh0ICE9IG51bGwgPyB0ZXh0Lmxlbmd0aCgpIDogMCk7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQljaGFyIGZpcnN0Q2hhciA9IHRleHQuY2hhckF0KDApOwotCQkJCQkJaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpIHsKLQkJCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBvZmZzZXQpIHsKLQkJCQkJCQkJLy8gYmVmb3JlIHF1b3RlCi0JCQkJCQkJCWFza0NTUyA9IGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJb2Zmc2V0Kys7Ci0JCQkJCQkJCXF1b3RlID0gZmlyc3RDaGFyOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID09IGVuZCkgewotCQkJCQkJCWlmIChsZW5ndGggPiAxICYmIHRleHQuY2hhckF0KGxlbmd0aCAtIDEpID09IHF1b3RlKSB7Ci0JCQkJCQkJCS8vIGFmdGVyIHF1b3RlCi0JCQkJCQkJCWFza0NTUyA9IGZhbHNlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoYXNrQ1NTKSB7Ci0JCQkJCQlpbnQgcG9zID0gZG9jdW1lbnRQb3NpdGlvbiAtIG9mZnNldDsKLQkJCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBwcm9wb3NhbHMgPSBnZXRDU1NQcm9wb3NhbHModGV4dFZpZXdlciwgcG9zLCBub2RlLCBvZmZzZXQsIHF1b3RlKTsKLQkJCQkJCWlmIChwcm9wb3NhbHMgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gcHJvcG9zYWxzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHRleHRWaWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBubyB0ZXh0IG9yIGl0J3MgYWxsIHdoaXRlIHNwYWNlLCBvdGhlcndpc2UKLQkgKiByZXR1cm5zIGZhbHNlCi0JICogCi0JICogQHBhcmFtIHRyZWVOb2RlCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWaWV3ZXJFbXB0eShJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCWJvb2xlYW4gaXNFbXB0eSA9IGZhbHNlOwotCQlTdHJpbmcgdGV4dCA9IHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCAodGV4dCAhPSBudWxsICYmIHRleHQudHJpbSgpLmVxdWFscygiIikpKSAvLyROT04tTkxTLTEkCi0JCQlpc0VtcHR5ID0gdHJ1ZTsKLQkJcmV0dXJuIGlzRW1wdHk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsCi0JICovCi0JcHJpdmF0ZSBJQ29tcGxldGlvblByb3Bvc2FsIGdldEhUTUxUYWdQcm9wc29zYWwoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQlJTW9kZWxNYW5hZ2VyIG1tID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWlmIChtbSAhPSBudWxsKSB7Ci0JCQkJbW9kZWwgPSBtbS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZCh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQlJRE9NRG9jdW1lbnQgZG9jID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCi0JCQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvYyk7Ci0JCQkJCWlmIChtcSAhPSBudWxsKSB7Ci0KLQkJCQkJCS8vIFhIVE1MIHJlcXVpcmVzIGxvd2VyY2FzZSB0YWduYW1lIGZvciBsb29rdXAKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGh0bWxEZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBtcS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2MpLmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5IVE1MLnRvTG93ZXJDYXNlKCkpOwotCQkJCQkJaWYgKGh0bWxEZWNsICE9IG51bGwpIHsKLQkJCQkJCQlTdHJpbmdCdWZmZXIgcHJvcG9zZWRUZXh0QnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQkJCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhkb2MsIGh0bWxEZWNsLCBwcm9wb3NlZFRleHRCdWZmZXIpOwotCi0JCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IHByb3Bvc2VkVGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQkJCQkJCVN0cmluZyByZXF1aXJlZE5hbWUgPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0UmVxdWlyZWROYW1lKGRvYywgaHRtbERlY2wpOwotCi0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGRvY3VtZW50UG9zaXRpb24sCi0JCQkJCQkJLyogc3RhcnQgcG9zICovCi0JCQkJCQkJMCwgLyogcmVwbGFjZSBsZW5ndGggKi8KLQkJCQkJCQlyZXF1aXJlZE5hbWUubGVuZ3RoKCkgKyAyLCAvKgotCQkJCQkJCQkJCQkJCQkgKiBjdXJzb3IgcG9zaXRpb24KLQkJCQkJCQkJCQkJCQkJICogYWZ0ZXIgKHJlbGF2dGl2ZSB0bwotCQkJCQkJCQkJCQkJCQkgKiBzdGFydCkKLQkJCQkJCQkJCQkJCQkJICovCi0JCQkJCQkJSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKSwgcmVxdWlyZWROYW1lLCBudWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9UQUdfTkFNRSk7Ci0JCQkJCQkJcmVzdWx0ID0gcHJvcG9zYWw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRlbnRHZW5lcmF0b3IoKQotCSAqLwotCXB1YmxpYyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0Q29udGVudEdlbmVyYXRvcigpIHsKLQkJaWYgKGZHZW5lcmF0b3IgPT0gbnVsbCkgewotCQkJaWYgKGlzWEhUTUwpCi0JCQkJZkdlbmVyYXRvciA9IFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5nZXRJbnN0YW5jZSgpOwotCQkJZWxzZQotCQkJCWZHZW5lcmF0b3IgPSBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiBmR2VuZXJhdG9yOwotCX0KLQotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0Q1NTUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IHBvcywgSURPTU5vZGUgZWxlbWVudCwgaW50IG9mZnNldCwgY2hhciBxdW90ZSkgewotCi0JCUNTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY3NzUHJvY2Vzc29yID0gbmV3IENTU0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJY3NzUHJvY2Vzc29yLnNldERvY3VtZW50T2Zmc2V0KG9mZnNldCk7Ci0JCWNzc1Byb2Nlc3Nvci5zZXRRdW90ZUNoYXJPZlN0eWxlQXR0cmlidXRlKHF1b3RlKTsKLQotCQlyZXR1cm4gY3NzUHJvY2Vzc29yLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgcG9zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldEVtcHR5VGFnQ2xvc2VTdHJpbmcoKSB7Ci0JCWlmIChpc1hIVE1MKQotCQkJcmV0dXJuICIgLz4iOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAiPiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIEhUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkgewotCQlpZiAoZlRlbXBsYXRlUHJvY2Vzc29yID09IG51bGwpIHsKLQkJCWZUZW1wbGF0ZVByb2Nlc3NvciA9IG5ldyBIVE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCk7Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVByb2Nlc3NvcjsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmUgaWYgdGhpcyBEb2N1bWVudCBpcyBhbiBYSFRNTCBEb2N1bWVudC4gT3ByYXRlcyBzb2xlbHkgb2ZmIG9mCi0JICogdGhlIERvY3VtZW50IFR5cGUgZGVjbGFyYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRYSFRNTChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkKLQkJCWRvYyA9IG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQllbHNlCi0JCQlkb2MgPSAoKERvY3VtZW50KSBub2RlKTsKLQotCQlpZiAoZG9jIGluc3RhbmNlb2YgSURPTURvY3VtZW50KQotCQkJcmV0dXJuICgoSURPTURvY3VtZW50KSBkb2MpLmlzWE1MVHlwZSgpOwotCi0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCU1vZGVsUXVlcnlBZGFwdGVyIGFkYXB0ZXIgPSAoTW9kZWxRdWVyeUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9jKS5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJCUNNRG9jdW1lbnQgY21kb2MgPSBudWxsOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldE1vZGVsUXVlcnkoKSAhPSBudWxsKQotCQkJCWNtZG9jID0gYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoZG9jKTsKLQkJCWlmIChjbWRvYyAhPSBudWxsKSB7Ci0JCQkJLy8gdHJlYXQgYXMgWEhUTUwgdW5sZXNzIHdlJ3ZlIGdvdCB0aGUgaW4tY29kZSBIVE1MIGNvbnRlbnQKLQkJCQkvLyBtb2RlbAotCQkJCWlmIChjbWRvYyBpbnN0YW5jZW9mIEhUTUxDTURvY3VtZW50KQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNtZG9jLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuSVNfWEhUTUwpKQotCQkJCQlyZXR1cm4gQm9vbGVhbi5UUlVFLmVxdWFscyhjbWRvYy5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX1hIVE1MKSk7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZAotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGRvYy5nZXREb2N0eXBlKCk7Ci0JCXJldHVybiBkb2NUeXBlICE9IG51bGwgJiYgZG9jVHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgJiYgZG9jVHlwZS5nZXRQdWJsaWNJZCgpLmluZGV4T2YoIi0vL1czQy8vRFREIFhIVE1MICIpID09IDA7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0KCkgewotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlyZWluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWluaXQoKSB7Ci0JCVN0cmluZyBrZXkgPSBIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFOwotCQlib29sZWFuIGRvQXV0byA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oa2V5KTsKLQkJaWYgKGRvQXV0bykgewotCQkJa2V5ID0gSFRNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFOwotCQkJY29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGtleSkudG9DaGFyQXJyYXkoKTsKLQkJfQotCQllbHNlIHsKLQkJCWNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZiAoZmFjdG9yeUZvckNTUyAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5Rm9yQ1NTLnJlbGVhc2UoKTsKLQkJfQotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3RyaW5nc0VxdWFsKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQlyZXR1cm4gYS5lcXVhbHNJZ25vcmVDYXNlKGIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQotCQlpZiAocHJvcGVydHkuY29tcGFyZVRvKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UpID09IDAgfHwgcHJvcGVydHkuY29tcGFyZVRvKEhUTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkgPT0gMCkgewotCQkJcmVpbml0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24sIEluZGV4ZWRSZWdpb24gaW5kZXhlZE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlyZXR1cm4gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHModmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9IVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2RhYTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5IVE1MRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LlhNTENvbnRlbnRNb2RlbEdlbmVyYXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgZXh0ZW5kcyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgaW5zdGFuY2UgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRhZ0Nhc2U7Ci0JcHJvdGVjdGVkIGludCBmQXR0ckNhc2U7Ci0KLQkvKioKLQkgKiBIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0JCS8vSVByZWZlcmVuY2VTdG9yZSBwcmVmcyA9IENvbW1vblByZWZlcmVuY2VzUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoQ29udGVudFR5cGUuQ29udGVudFR5cGVJRF9IVE1MKTsKLQkJUHJlZmVyZW5jZXMgcHJlZnMgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJZlRhZ0Nhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSk7Ci0JCWZBdHRyQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVFbmRUYWcoU3RyaW5nIHRhZ05hbWUsIE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCWlmICgoKEJvb2xlYW4pIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3RyaW5nIG9tbWlzc2lvbiA9IChTdHJpbmcpIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuT01JVF9UWVBFKTsKLQkJCQlpZiAob21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1QpKSB7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCXJldHVybjsKLQkJYnVmZmVyLmFwcGVuZCgiPC8iICsgdGFnTmFtZSArICI+Iik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJldHVybjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICghY21ub2RlLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBvd25lck5vZGUsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIG5hbWUgPSBzdXBlci5nZXRSZXF1aXJlZE5hbWUob3duZXJOb2RlLCBjbW5vZGUpOwotCQkvLyBkb24ndCBjaGFuZ2UgdGhlIGNhc2UgdW5sZXNzIHdlJ3JlIGNlcnRhaW4gaXQgaXMgbWVhbmluZ2xlc3MKLQkJaWYgKHNob3VsZElnbm9yZUNhc2UoY21ub2RlKSkgewotCQkJaW50IGNhc2VWYWwgPSAtMTsKLQkJCWlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLQkJCQljYXNlVmFsID0gZlRhZ0Nhc2U7Ci0JCQllbHNlIGlmIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotCQkJCWNhc2VWYWwgPSBmQXR0ckNhc2U7Ci0JCQlzd2l0Y2ggKGNhc2VWYWwpIHsKLQkJCQljYXNlIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSIDoKLQkJCQkJewotCQkJCQkJbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQljYXNlIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSIDoKLQkJCQkJewotCQkJCQkJbmFtZSA9IG5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnQ2xvc2UoTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlTdHJpbmcgb3RoZXIgPSBnZXRPdGhlckNsb3NlKHBhcmVudE5vZGUpOwotCQlpZiAob3RoZXIgIT0gbnVsbCkKLQkJCXJldHVybiBvdGhlcjsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JCWlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCWlmICgoKEJvb2xlYW4pIGVsZW1lbnREZWNsLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuSVNfSlNQKSkuYm9vbGVhblZhbHVlKCkpIHsKLQkJCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkKLQkJCQkJcmV0dXJuICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIEByZXR1cm4gUmV0dXJucyBhIEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IoKTsKLQkJaW5zdGFuY2UuaW5pdCgpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0hUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDlkNmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLS8qKgotICogQ29tcGxldGlvbiBwcm9jZXNzb3IgZm9yIEhUTUwgVGVtcGxhdGVzLiBNb3N0IG9mIHRoZSB3b3JrIGlzIGFscmVhZHkgZG9uZQotICogYnkgdGhlIEhUTUwgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIEhUTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IgaXMgYXNrZWQgZm9yIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FscywgdGhlCi0gKiBIVE1MIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciBoYXMgYWxyZWFkeSBzZXQgdGhlIGNvbnRleHQgdHlwZSBmb3IKLSAqIHRlbXBsYXRlcy4KLSAqLwotY2xhc3MgSFRNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCVN0cmluZyBwcmVmaXggPSBleHRyYWN0UHJlZml4KHZpZXdlciwgb2Zmc2V0KTsKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0IC0gcHJlZml4Lmxlbmd0aCgpLCBwcmVmaXgubGVuZ3RoKCkpOwotCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCk7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JCS8vIG5hbWUgb2YgdGhlIHNlbGVjdGlvbiB2YXJpYWJsZXMge2xpbmUsIHdvcmR9X3NlbGVjdGlvbgotCQljb250ZXh0LnNldFZhcmlhYmxlKCJzZWxlY3Rpb24iLCBzZWxlY3Rpb24uZ2V0VGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRlbXBsYXRlW10gdGVtcGxhdGVzID0gZ2V0VGVtcGxhdGVzKGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKTsKLQotCQlMaXN0IG1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcGxhdGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHRlbXBsYXRlc1tpXTsKLQkJCXRyeSB7Ci0JCQkJY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLnZhbGlkYXRlKHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCQl9Ci0JCQljYXRjaCAoVGVtcGxhdGVFeGNlcHRpb24gZSkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHRlbXBsYXRlLm1hdGNoZXMocHJlZml4LCBjb250ZXh0LmdldENvbnRleHRUeXBlKCkuZ2V0SWQoKSkpCi0JCQkJbWF0Y2hlcy5hZGQoY3JlYXRlUHJvcG9zYWwodGVtcGxhdGUsIGNvbnRleHQsIChJUmVnaW9uKSByZWdpb24sIGdldFJlbGV2YW5jZSh0ZW1wbGF0ZSwgcHJlZml4KSkpOwotCQl9Ci0KLQkJQ29sbGVjdGlvbnMuc29ydChtYXRjaGVzLCBmZ1Byb3Bvc2FsQ29tcGFyYXRvcik7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIG1hdGNoZXMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFttYXRjaGVzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb25jcmV0ZSB0ZW1wbGF0ZSBjb250ZXh0IGZvciB0aGUgZ2l2ZW4gcmVnaW9uIGluIHRoZQotCSAqIGRvY3VtZW50LiBUaGlzIGludm9sdmVzIGZpbmRpbmcgb3V0IHdoaWNoIGNvbnRleHQgdHlwZSBpcyB2YWxpZCBhdCB0aGUKLQkgKiBnaXZlbiBsb2NhdGlvbiwgYW5kIHRoZW4gY3JlYXRpbmcgYSBjb250ZXh0IG9mIHRoaXMgdHlwZS4gVGhlIGRlZmF1bHQKLQkgKiBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgPGNvZGU+U21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0PC9jb2RlPiBmb3IKLQkgKiB0aGUgY29udGV4dCB0eXBlIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4gVGhpcyB0YWtlcyB0aGUgb2Zmc2V0IGF0IHdoaWNoCi0JICogY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQgaW50byBjb25zaWRlcmF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgZm9yIHdoaWNoIHRoZSBjb250ZXh0IGlzIGNyZWF0ZWQKLQkgKiBAcGFyYW0gcmVnaW9uCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGludG8gPGNvZGU+ZG9jdW1lbnQ8L2NvZGU+IGZvciB3aGljaCB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvcmlnaW5hbCBvZmZzZXQgd2hlcmUgY29udGVudCBhc3Npc3Qgd2FzIGludm9rZWQKLQkgKiBAcmV0dXJuIGEgdGVtcGxhdGUgY29udGV4dCB0aGF0IGNhbiBoYW5kbGUgdGVtcGxhdGUgaW5zZXJ0aW9uIGF0IHRoZQotCSAqICAgICAgICAgZ2l2ZW4gbG9jYXRpb24sIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBUZW1wbGF0ZUNvbnRleHQgY3JlYXRlQ29udGV4dChJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHByZXR0eSBtdWNoIHNhbWUgY29kZSBhcyBzdXBlci5jcmVhdGVDb250ZXh0IGV4Y2VwdCBjcmVhdGUKLQkJLy8gU21hcnRSZXBsYWNlVGVtcGxhdGVDb250ZXh0Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBnZXRDb250ZXh0VHlwZSh2aWV3ZXIsIHJlZ2lvbik7Ci0JCWlmIChjb250ZXh0VHlwZSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCXJldHVybiBuZXcgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCByZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSwgb2Zmc2V0KTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbCBjcmVhdGVQcm9wb3NhbChUZW1wbGF0ZSB0ZW1wbGF0ZSwgVGVtcGxhdGVDb250ZXh0IGNvbnRleHQsIElSZWdpb24gcmVnaW9uLCBpbnQgcmVsZXZhbmNlKSB7Ci0JCXJldHVybiBuZXcgQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgcmVnaW9uLCBnZXRJbWFnZSh0ZW1wbGF0ZSksIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBsYXRlQ29udGV4dFR5cGUgZ2V0Q29udGV4dFR5cGUoSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCQlUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUNvbnRleHRUeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCQlpZiAocmVnaXN0cnkgIT0gbnVsbCkKLQkJCXR5cGUgPSByZWdpc3RyeS5nZXRDb250ZXh0VHlwZShmQ29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKFRlbXBsYXRlIHRlbXBsYXRlKSB7Ci0JCS8vIGp1c3QgcmV0dXJuIHRoZSBzYW1lIGltYWdlIGZvciBub3cKLQkJcmV0dXJuIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfVEVNUExBVEUpOwotCX0KLQotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0VGVtcGxhdGVDb250ZXh0UmVnaXN0cnkoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVbXSBnZXRUZW1wbGF0ZXMoU3RyaW5nIGNvbnRleHRUeXBlSWQpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGVzW10gPSBudWxsOwotCi0JCVRlbXBsYXRlU3RvcmUgc3RvcmUgPSBnZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWlmIChzdG9yZSAhPSBudWxsKQotCQkJdGVtcGxhdGVzID0gc3RvcmUuZ2V0VGVtcGxhdGVzKGNvbnRleHRUeXBlSWQpOwotCi0JCXJldHVybiB0ZW1wbGF0ZXM7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKTsKLQl9Ci0KLQl2b2lkIHNldENvbnRleHRUeXBlKFN0cmluZyBjb250ZXh0VHlwZUlkKSB7Ci0JCWZDb250ZXh0VHlwZUlkID0gY29udGV4dFR5cGVJZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvckZvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDUxMmYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS50ZXh0LklDU1NQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW50ZXJuYWwuY29tbW9uLmNvbnRlbnRhc3Npc3QuSmF2YVNjcmlwdENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3JGb3JIVE1MIGV4dGVuZHMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgdm9pZCBpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCQotCQlzdXBlci5pbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKTsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgaHRtbFByb2Nlc3NvciA9IG5ldyBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQlhZGRQYXJ0aXRpb25Qcm9jZXNzb3IoSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgaHRtbFByb2Nlc3Nvcik7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJSFRNTFBhcnRpdGlvbnMuSFRNTF9DT01NRU5ULCBodG1sUHJvY2Vzc29yKTsKLQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBqc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IgPSBuZXcgSmF2YVNjcmlwdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKTsKLQkJYWRkUGFydGl0aW9uUHJvY2Vzc29yKElIVE1MUGFydGl0aW9ucy5TQ1JJUFQsIGpzQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY3NzQ29udGVudEFzc2lzdFByb2Nlc3NvciA9IG5ldyBDU1NDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWFkZFBhcnRpdGlvblByb2Nlc3NvcihJQ1NTUGFydGl0aW9ucy5TVFlMRSwgY3NzQ29udGVudEFzc2lzdFByb2Nlc3Nvcik7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWVmODk2Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVFeGNlcHRpb247Ci0KLS8qKgotICogSnVzdCBsaWtlIERvY3VtZW50VGVtcGxhdGVDb250ZXh0IGV4Y2VwdCBpZiBhbiBpbnNlcnQgb2Zmc2V0IGlzIHBhc3NlZCBpbiwKLSAqIGR1cmluZyBldmFsdWF0aW9uLCB0aGUgInByZWZpeCIgYmVmb3JlIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIGNoZWNrZWQgdG8gc2VlCi0gKiBpZiBpdCBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSBuYW1lLiBJZiBzbywgb3ZlcndyaXRlIHRoZSB0ZW1wbGF0ZSBuYW1lLgotICogT3RoZXJ3aXNlLCBqdXN0IGluc2VydCB0aGUgdGVtcGxhdGUgYXQgdGhlIGluc2VydCBvZmZzZXQgbG9jYXRpb24gKGJ5IG5vdAotICogb3ZlcndyaXRpbmcgdGhlIHByZWZpeCB0ZXh0KQotICovCi1wdWJsaWMgY2xhc3MgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQgZXh0ZW5kcyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCB7Ci0JcHJpdmF0ZSBpbnQgZkluc2VydE9mZnNldCA9IC0xOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4gVGhlIHN1cHBsaWVkIDxjb2RlPlBvc2l0aW9uPC9jb2RlPgotCSAqIHdpbGwgYmUgcXVlcmllZCB0byBjb21wdXRlIHRoZSA8Y29kZT5nZXRTdGFydDwvY29kZT4gYW5kCi0JICogPGNvZGU+Z2V0RW5kPC9jb2RlPiBtZXRob2RzLCB3aGljaCB3aWxsIHRoZXJlZm9yZSBhbnN3ZXIgdXBkYXRlZAotCSAqIHBvc2l0aW9uIGRhdGEgaWYgaXQgaXMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gZGVzY3JpYmluZyB0aGUgYXJlYSBvZiB0aGUgZG9jdW1lbnQgd2hpY2ggZm9ybXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBjb250ZXh0Ci0JICogQHNpbmNlIDMuMQotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJc3VwZXIodHlwZSwgZG9jdW1lbnQsIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgZG9jdW1lbnQgdGVtcGxhdGUgY29udGV4dC4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRleHQgdHlwZQotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRoaXMgY29udGV4dCBhcHBsaWVzIHRvCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGxlbmd0aAotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uCi0JICogQHBhcmFtIGluc2VydE9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZG9jdW1lbnQgcmVnaW9uIHdoZXJlIGluc2VydCB3YXMKLQkgKiAgICAgICAgICAgIG9yaWdpbmFsbHkgcmVxdWVzdGVkCi0JICovCi0JcHVibGljIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0KFRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBpbnQgaW5zZXJ0T2Zmc2V0KSB7Ci0JCXRoaXModHlwZSwgZG9jdW1lbnQsIG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCkpOwotCQlmSW5zZXJ0T2Zmc2V0ID0gaW5zZXJ0T2Zmc2V0OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQjZXZhbHVhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGUpCi0JICovCi0JcHVibGljIFRlbXBsYXRlQnVmZmVyIGV2YWx1YXRlKFRlbXBsYXRlIHRlbXBsYXRlKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIFRlbXBsYXRlRXhjZXB0aW9uIHsKLQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gc3VwZXIuZXZhbHVhdGUodGVtcGxhdGUpOwotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChmSW5zZXJ0T2Zmc2V0ID4gLTEgJiYgZkluc2VydE9mZnNldCA+IGdldFN0YXJ0KCkpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gZ2V0RG9jdW1lbnQoKS5nZXQoZ2V0U3RhcnQoKSwgZkluc2VydE9mZnNldCAtIGdldFN0YXJ0KCkpOwotCQkJCWlmICghdGVtcGxhdGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotCQkJCQkvLyBnZW5lcmF0ZSBhIG5ldyBidWZmZXIgdGhhdCBhY3R1YWxseSBjb250YWlucyB0aGUKLQkJCQkJLy8gdGV4dCB0aGF0IHdhcyBnb2luZyB0byBiZSBvdmVyd3JpdHRlbgotCQkJCQlidWZmZXIgPSBuZXcgVGVtcGxhdGVCdWZmZXIocHJlZml4ICsgYnVmZmVyLmdldFN0cmluZygpLCBidWZmZXIuZ2V0VmFyaWFibGVzKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYnVmZmVyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmY5YWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuSFRNTEVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUxDTVByb3BlcnRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBYSFRNTE1pbmltYWxDb250ZW50TW9kZWxHZW5lcmF0b3IgZXh0ZW5kcyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGluc3RhbmNlID0gbnVsbDsKLQotCXByaXZhdGUgWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGdlbmVyYXRlRW5kVGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZWxlbWVudERlY2wgaW5zdGFuY2VvZiBIVE1MRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQlpZiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSB7Ci0JCQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQkJaWYgKG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkQpIHx8IG9tbWlzc2lvbi5lcXVhbHMoSFRNTENNUHJvcGVydGllcy5WYWx1ZXMuT01JVF9FTkRfREVGQVVMVCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9NVVNUKSkgewotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQlyZXR1cm47Ci0JCWJ1ZmZlci5hcHBlbmQoIjwvIiArIHRhZ05hbWUgKyAiPiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyZXR1cm47Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFN0YXJ0VGFnQ2xvc2UoTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCkgewotCQlTdHJpbmcgb3RoZXIgPSBnZXRPdGhlckNsb3NlKHBhcmVudE5vZGUpOwotCQlpZiAob3RoZXIgIT0gbnVsbCkKLQkJCXJldHVybiBvdGhlcjsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpCi0JCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JCS8vIEVNUFRZIHRhZywgZG8gYSBzZWxmLWNsb3NlCi0JCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSB7Ci0JCQkvLyBpZiBpdCdzIGEgSlNQIGVsZW1lbnQsIGRvbid0IGFkZCB0aGUgc3BhY2Ugc2luY2UgdGhlIEpTUCBjb250YWluZXIgZG9lc24ndC9zaG91bGRuJ3QgY2FyZQotCQkJaWYgKGVsZW1lbnREZWNsIGluc3RhbmNlb2YgSFRNTEVsZW1lbnREZWNsYXJhdGlvbiAmJiAoKChCb29sZWFuKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLklTX0pTUCkpLmJvb2xlYW5WYWx1ZSgpKSkKLQkJCQkvLyBpZiBpdCdzIG5vdCBKU1AsIGNvbmZvcm0gdG8gWEhUTUwgZ3VpZGVsaW5lcyBhbmQgYWRkIHRoZSBzcGFjZQotCQkJCXJldHVybiAiLz4iOyAvLyROT04tTkxTLTEkCi0JCQllbHNlCi0JCQkJcmV0dXJuICIgLz4iOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gbm90IGRlZmluZWQgYXMgRU1QVFksIGJ1dCBzaG91bGQgYmUgdHJlYXRlZCBhcyBzdWNoIGFueXdheQotCQllbHNlIGlmIChlbGVtZW50RGVjbCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCVN0cmluZyBvbW1pc3Npb24gPSAoU3RyaW5nKSBlbGVtZW50RGVjbC5nZXRQcm9wZXJ0eShIVE1MQ01Qcm9wZXJ0aWVzLk9NSVRfVFlQRSk7Ci0JCQlpZiAob21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORCkgfHwgb21taXNzaW9uLmVxdWFscyhIVE1MQ01Qcm9wZXJ0aWVzLlZhbHVlcy5PTUlUX0VORF9ERUZBVUxUKSB8fCBvbW1pc3Npb24uZXF1YWxzKEhUTUxDTVByb3BlcnRpZXMuVmFsdWVzLk9NSVRfRU5EX01VU1QpKSB7Ci0JCQkJcmV0dXJuICIgLz4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gIj4iOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWEhUTUxNaW5pbWFsQ29udGVudE1vZGVsR2VuZXJhdG9yIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFhIVE1MTWluaW1hbENvbnRlbnRNb2RlbEdlbmVyYXRvcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0hUTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSFRNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYTRjZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSFRNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb250ZW50QnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZm9ybWF0LkhUTUxGb3JtYXRQcm9jZXNzb3JJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5IVE1MQ01Qcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5YTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSFRNTE5vZGVBY3Rpb25NYW5hZ2VyIGV4dGVuZHMgWE1MTm9kZUFjdGlvbk1hbmFnZXIgewotCXByb3RlY3RlZCBpbnQgZlRhZ0Nhc2U7Ci0JcHJvdGVjdGVkIGludCBmQXR0ckNhc2U7Ci0KLQlwdWJsaWMgSFRNTE5vZGVBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIHZpZXdlcik7Ci0JCXVwZGF0ZUNhc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBJZiBuZWNjZXNzYXJ5LCBlbXBsb3kgYSBET01Db250ZW50QnVpbGRlciB0aGF0IHVuZGVyc3RhbmRzIGhvdyB0bwotCSAqIGNoYW5nZSB0aGUgY2FzZSBvZiBIVE1MIHRhZ3MgKGJ1dCBOT1QgdGFnbGliIGRlcml2ZWQgdGFncykuCi0JICovCi0JcHVibGljIERPTUNvbnRlbnRCdWlsZGVyIGNyZWF0ZURPTUNvbnRlbnRCdWlsZGVyKERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURPTUNvbnRlbnRCdWlsZGVyIGJ1aWxkZXIgPSBudWxsOwotCQlTdHJpbmcgb25lID0gZk1vZGVsLmdldE1vZGVsSGFuZGxlcigpLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0JCVN0cmluZyBtb2RlbENvbnRlbnRUeXBlSWQgPSBmTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCWlmIChvbmUgIT0gbW9kZWxDb250ZW50VHlwZUlkKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBlcXVhbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKG1vZGVsQ29udGVudFR5cGVJZC5lcXVhbHMoQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MKSkKLQkJCWJ1aWxkZXIgPSBuZXcgSFRNTENvbnRlbnRCdWlsZGVyKGRvY3VtZW50KTsKLQkJZWxzZQotCQkJYnVpbGRlciA9IHN1cGVyLmNyZWF0ZURPTUNvbnRlbnRCdWlsZGVyKGRvY3VtZW50KTsKLQotCQlyZXR1cm4gYnVpbGRlcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gc2hvdWxkSWdub3JlQ2FzZShDTU5vZGUgY21ub2RlKSB7Ci0JCWlmICghY21ub2RlLnN1cHBvcnRzKEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICgoQm9vbGVhbikgY21ub2RlLmdldFByb3BlcnR5KEhUTUxDTVByb3BlcnRpZXMuU0hPVUxEX0lHTk9SRV9DQVNFKSkuYm9vbGVhblZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogTW9kaWZ5IHRoZSBkaXNwbGF5ZWQgbWVudWl0ZW0gbGFiZWwgdG8gY2hhbmdlIHRoZSBjYXNlIG9mIEhUTUwgY2hpbGRyZW4KLQkgKiBidXQgbmVpdGhlciBYTUwgbm9yIHRhZ2xpYi1kZXJpdmVkIGNoaWxkcmVuLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIENNTm9kZSBjbW5vZGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCk7Ci0JCS8vIGRvbid0IGNoYW5nZSB0aGUgY2FzZSB1bmxlc3Mgd2UncmUgY2VydGFpbiBpdCBpcyBtZWFuaW5nbGVzcwotCQlpZiAoc2hvdWxkSWdub3JlQ2FzZShjbW5vZGUpKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGNtbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJaWYgKGNtbm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJaWYgKGZUYWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCQluYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpOwotCQkJCWVsc2UgaWYgKGZUYWdDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQluYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vIGVsc2UgZG8gbm90aGluZwotCQkJfQotCQkJZWxzZSBpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTikgewotCQkJCWlmIChmQXR0ckNhc2UgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpCi0JCQkJCW5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJZWxzZSBpZiAoZkF0dHJDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKQotCQkJCQluYW1lID0gbmFtZS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vIGVsc2UgZG8gbm90aGluZwotCQkJfQotCQkJcmVzdWx0ID0gbmFtZTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IHN1cGVyLmdldExhYmVsKHBhcmVudCwgY21ub2RlKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQW5vdGhlciBIVE1MIHNwZWNpZmljIGRldGFpbC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYXNlKCkgewotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQkJCVN0cmluZyBtb2RlbENvbnRlbnRUeXBlSWQgPSBmTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQlpZiAobW9kZWxDb250ZW50VHlwZUlkICE9IG51bGwpIHsKLQkJCQlpZiAobW9kZWxDb250ZW50VHlwZUlkLmVxdWFscyhDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpKSB7Ci0JCQkJCVByZWZlcmVuY2VzIHByZWZzID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZlRhZ0Nhc2UgPSBwcmVmcy5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSk7Ci0JCQkJCWZBdHRyQ2FzZSA9IHByZWZzLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmb3JtYXQoTm9kZSBuZXdFbGVtZW50LCBib29sZWFuIGRlZXApIHsKLQkJdHJ5IHsKLQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGFib3V0IHRvIG1ha2UgYSBiaWcgbW9kZWwgY2hhbmdlCi0JCQlmTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCS8vIGZvcm1hdCBzZWxlY3RlZCBub2RlCi0JCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgSFRNTEZvcm1hdFByb2Nlc3NvckltcGwoKTsKLQkJCWZvcm1hdFByb2Nlc3Nvci5mb3JtYXROb2RlKG5ld0VsZW1lbnQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgZG9uZSB3aXRoIHRoZSBiaWcgbW9kZWwgY2hhbmdlCi0JCQlmTW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg4MWIwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeUZvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLS8qKgotICogQW4gYWRhcHRlciBmYWN0b3J5IHRvIGNyZWF0ZSBKRmFjZU5vZGVBZGFwdGVycy4gIFVzZSB0aGlzCi0gKiBhZGFwdGVyIGZhY3Rvcnkgd2l0aCBhIEpGYWNlQWRhcHRlckNvbnRlbnRQcm92aWRlciB0byBkaXNwbGF5Ci0gKiBET00gbm9kZXMgaW4gYSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MIGV4dGVuZHMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgewotCi0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKCkgewotCQl0aGlzKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQkJc3VwZXIoYWRhcHRlcktleSwgcmVnaXN0ZXJBZGFwdGVycyk7Ci0JfQotCi0JcHJvdGVjdGVkIElOb2RlQWRhcHRlciBjcmVhdGVBZGFwdGVyKElOb2RlTm90aWZpZXIgbm9kZSkgewotCQlpZiAoc2luZ2xldG9uQWRhcHRlciA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgdGhlIEpGYWNlTm9kZUFkYXB0ZXIKLQkJCXNpbmdsZXRvbkFkYXB0ZXIgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZvckhUTUwodGhpcyk7Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5Rm9ySFRNTChnZXRBZGFwdGVyS2V5KCksIGlzU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKCkpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRm9ySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTE4YTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSFRNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEFkYXB0cyBhIERPTSBub2RlIHRvIGEgSkZhY2Ugdmlld2VyLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZvckhUTUwgZXh0ZW5kcyBKRmFjZU5vZGVBZGFwdGVyIHsKLQotCXByaXZhdGUgSW1hZ2UgY3JlYXRlSFRNTEltYWdlKFN0cmluZyBpbWFnZVJlc291cmNlTmFtZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlUmVzb3VyY2VOYW1lKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKQotCQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvci5jcmVhdGVJbWFnZSgpOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgSkZhY2VOb2RlQWRhcHRlckZvckhUTUwuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXJGYWN0b3J5Ci0JICovCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXJGb3JIVE1MKEpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGFkYXB0ZXJGYWN0b3J5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJGYWN0b3J5KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgY3JlYXRlSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJ0YWJsZSIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBQkxFKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJhIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0FOQ0hPUik7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiYm9keSIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19CT0RZKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJidXR0b24iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfQlVUVE9OKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmb250IikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0ZPTlQpOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImZvcm0iKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfRk9STSk7Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtbCIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19IVE1MKTsKLQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJpbWciKSkgLy8kTk9OLU5MUy0xJAotCQkJCWltYWdlID0gY3JlYXRlSFRNTEltYWdlKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfSU1BR0UpOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoIm1hcCIpKSAvLyROT04tTkxTLTEkCi0JCQkJaW1hZ2UgPSBjcmVhdGVIVE1MSW1hZ2UoSFRNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19JTUFHRV9NQVApOwotCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoInRpdGxlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX1RJVExFKTsKLQkJCWVsc2UKLQkJCQlpbWFnZSA9IGNyZWF0ZUhUTUxJbWFnZShIVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHKTsKLQkJfQotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBzdXBlci5jcmVhdGVJbWFnZShub2RlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9BYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWQwMjhkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIE5vdCBuZWVkZWQuIFNlZSBCVUcxMTgzNTkKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5IGltcGxlbWVudHMgRGV2aWNlUHJvZmlsZUVudHJ5IHsKLQotCXB1YmxpYyBBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5SWQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGYwYmM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0Fic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gIFNlZSBCVUcxMTgzNTkKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIgaW1wbGVtZW50cwotCQlEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciB7Ci0KLQlwdWJsaWMgQWJzdHJhY3REZXZpY2VQcm9maWxlRW50cnlQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RGV2aWNlUHJvZmlsZUVudHJpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc1YWQ2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db250ZW50U2V0dGluZ3NSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLm1ldGFtb2RlbC5DU1NQcm9maWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZUVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25DaGFyc2V0TmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3Q7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBvbmx5IGNvbnRhaW5zIGhlbHBlciBtZXRob2RzIHRoYXQgeW91IHNob3VsZAotICogICAgICAgICAgICAgYWN0dWFsbHkgaW1wbGVtZW50IHlvdXJzZWxmLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29udGVudFNldHRpbmdzUmVnaXN0cnkgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkUgPSBIVE1MVUlNZXNzYWdlcy5VSV9ub25lOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1heExlbmd0aFN0cmluZ0luQ2hhcmFjdGVyQ29kZVJlZ2lzdHJ5ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgQ29udGVudFNldHRpbmdzUmVnaXN0cnkoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCWNvbWJvLmFkZChOT05FLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlFbnVtZXJhdGlvbiBlID0gcmVnLmdldEVudHJpZXMoKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCVN0cmluZyBwdWJsaWNJZCA9IGVudHJ5LmdldFB1YmxpY0lkKCk7Ci0JCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBlbnRyeS5nZXREaXNwbGF5TmFtZSgpOwotCQkJaWYgKGRpc3BsYXlOYW1lICE9IG51bGwpIHsKLQkJCQljb21iby5hZGQoZGlzcGxheU5hbWUsIHB1YmxpY0lkKTsKLQkJCQlpZiAoZGlzcGxheU5hbWUubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkKLQkJCQkJbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgPSBkaXNwbGF5TmFtZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb21iby5hZGQocHVibGljSWQsIHB1YmxpY0lkKTsKLQkJCWlmIChwdWJsaWNJZC5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKQotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gcHVibGljSWQ7Ci0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOyAvLyBpZiBIVE1MIGVudHJ5Ci0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKS5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKQotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCi0JCWNvbWJvLnNvcnRCeUtleSgxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q1NTTWV0YU1vZGVsUmVnaXN0cnlJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQljb21iby5hZGQoTk9ORSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCUNTU1Byb2ZpbGVSZWdpc3RyeSByZWcgPSBDU1NQcm9maWxlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJSXRlcmF0b3IgaSA9IHJlZy5nZXRQcm9maWxlcygpOwotCQl3aGlsZSAoaS5oYXNOZXh0KCkpIHsKLQkJCUNTU1Byb2ZpbGUgcHJvZmlsZSA9IChDU1NQcm9maWxlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBpZCA9IHByb2ZpbGUuZ2V0UHJvZmlsZUlEKCk7Ci0JCQlTdHJpbmcgbmFtZSA9IHByb2ZpbGUuZ2V0UHJvZmlsZU5hbWUoKTsKLQkJCWNvbWJvLmFkZChuYW1lLCBpZCk7Ci0JCX0KLQkJY29tYm8uc29ydEJ5S2V5KDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQljb21iby5hZGQoTk9ORSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCURldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHJlZyA9IERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5nZXRFbnRyeVByb3ZpZGVyKCk7Ci0JCWlmIChyZWcgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUl0ZXJhdG9yIHByb2ZpbGVzID0gcmVnLmdldERldmljZVByb2ZpbGVFbnRyaWVzKCk7Ci0JCWlmIChwcm9maWxlcyA9PSBudWxsKSB7Ci0JCQlyZWcucmVsZWFzZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCURldmljZVByb2ZpbGVFbnRyeSBlbnRyeTsKLQkJd2hpbGUgKHByb2ZpbGVzLmhhc05leHQoKSkgewotCQkJZW50cnkgPSAoRGV2aWNlUHJvZmlsZUVudHJ5KSBwcm9maWxlcy5uZXh0KCk7Ci0JCQljb21iby5hZGQoZW50cnkuZ2V0RW50cnlOYW1lKCksIGVudHJ5LmdldEVudHJ5SWQoKSk7Ci0JCQllbnRyeS5yZWxlYXNlKCk7Ci0JCX0KLQkJcmVnLnJlbGVhc2UoKTsKLQkJY29tYm8uc29ydEJ5S2V5KDEpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbUlkRnJvbShTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKHB1YmxpY0lkID09IG51bGwgfHwgcHVibGljSWQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkgcmVnID0gSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCUVudW1lcmF0aW9uIGUgPSByZWcuZ2V0RW50cmllcygpOwotCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJSFRNTERvY3VtZW50VHlwZUVudHJ5IGVudHJ5ID0gKEhUTUxEb2N1bWVudFR5cGVFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotCQkJaWYgKGVudHJ5LmdldFB1YmxpY0lkKCkuZXF1YWxzKHB1YmxpY0lkKSkKLQkJCQlyZXR1cm4gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q29udGVudFR5cGVJbnRvKENvbWJvTGlzdCBjb21ibykgewotCQlTdHJpbmdbXSB0eXBlID0geyIiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L2h0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L3htbCIsfTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmdbXSBkaXNwbGF5TmFtZSA9IHtOT05FLCAiYXBwbGljYXRpb24veGh0bWwreG1sIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCSJhcHBsaWNhdGlvbi94bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L2h0bWwiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJ0ZXh0L3htbCIsfTsgLy8kTk9OLU5MUy0xJAotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGUubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkaXNwbGF5TmFtZVtpXSAhPSBudWxsICYmIGRpc3BsYXlOYW1lW2ldLmxlbmd0aCgpICE9IDApCi0JCQkJY29tYm8uYWRkKGRpc3BsYXlOYW1lW2ldLCB0eXBlW2ldKTsKLQkJCWVsc2UKLQkJCQljb21iby5hZGQodHlwZVtpXSwgdHlwZVtpXSk7Ci0JCX0KLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDaGFyYWN0ZXJDb2RlSW50byhDb21ib0xpc3QgY29tYm8pIHsKLQkJY29tYm8uYWRkKE5PTkUsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgbWF4ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQ29tbW9uQ2hhcnNldE5hbWVzIGVuY29kaW5nID0gbmV3IENvbW1vbkNoYXJzZXROYW1lcygpOwotCQlTdHJpbmdbXSBjaGFyQ29kZSA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRDb21tb25DaGFyc2V0TmFtZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFyQ29kZS5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldERpc3BsYXlTdHJpbmcoY2hhckNvZGVbaV0pOwotCQkJaWYgKGRpc3BsYXlOYW1lICE9IG51bGwgJiYgZGlzcGxheU5hbWUubGVuZ3RoKCkgIT0gMCkgewotCQkJCWNvbWJvLmFkZChkaXNwbGF5TmFtZSwgY2hhckNvZGVbaV0pOwotCQkJCWludCBuX2J5dGUgPSBkaXNwbGF5TmFtZS5nZXRCeXRlcygpLmxlbmd0aDsKLQkJCQlpZiAobWF4LmdldEJ5dGVzKCkubGVuZ3RoIDwgbl9ieXRlKQotCQkJCQltYXggPSBkaXNwbGF5TmFtZTsKLQkJCX0KLQkJCWVsc2UKLQkJCQljb21iby5hZGQoY2hhckNvZGVbaV0sIGNoYXJDb2RlW2ldKTsKLQkJfQotCQkvKgotCQkgKiBjaGFyQ29kZSA9IGVuY29kaW5nLmdldFN1cHBvcnRlZEphdmFFbmNvZGluZ3MoKTsgZm9yKGludCBpPTA7aTxjaGFyQ29kZS5sZW5ndGg7aSsrKXsKLQkJICogU3RyaW5nIGRpc3BsYXlOYW1lID0gZW5jb2RpbmcuZ2V0RGlzcGxheVN0cmluZyhjaGFyQ29kZVtpXSk7IGlmCi0JCSAqIChkaXNwbGF5TmFtZSE9bnVsbCAmJiBkaXNwbGF5TmFtZS5sZW5ndGgoKSE9MCkKLQkJICogY29tYm8uYWRkKGRpc3BsYXlOYW1lLGNoYXJDb2RlW2ldKTsgZWxzZQotCQkgKiBjb21iby5hZGQoY2hhckNvZGVbaV0sY2hhckNvZGVbaV0pOyB9Ci0JCSAqLwotCQkvLyBjb21iby5zb3J0QnlLZXkoMSk7Ci0JCW1heExlbmd0aFN0cmluZ0luQ2hhcmFjdGVyQ29kZVJlZ2lzdHJ5ID0gbWF4OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzZXRMYW5ndWFnZUludG8oQ29tYm9MaXN0IGNvbWJvKSB7Ci0JCVN0cmluZ1tdIGxhbmcgPSB7IiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJImphdmEiLCAvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZhc2NyaXB0Iix9OyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIGRpc3BsYXlOYW1lID0ge05PTkUsICJqYXZhIiwgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCSJqYXZhc2NyaXB0Iix9OyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGFuZy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGRpc3BsYXlOYW1lW2ldICE9IG51bGwgJiYgZGlzcGxheU5hbWVbaV0ubGVuZ3RoKCkgIT0gMCkKLQkJCQljb21iby5hZGQoZGlzcGxheU5hbWVbaV0sIGxhbmdbaV0pOwotCQkJZWxzZQotCQkJCWNvbWJvLmFkZChsYW5nW2ldLCBsYW5nW2ldKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZTc5MWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0vKioKLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMgZGlyZWN0bHkuCi0gKiBJbnN0ZWFkLCBwbGVhc2UgdXNlIGFic3RyYWN0IGNsYXNzKEFic3RyYWN0RGV2aWNlUHJvZmlsZUVudHJ5KSBpbnN0ZWFkLgotICogPC9wPgotICogCi0gKiBAZGVwcmVjYXRlZCBOb3QgbmVlZGVkLiBTZWUgQlVHMTE4MzU5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRGV2aWNlUHJvZmlsZUVudHJ5IHsKLQlwdWJsaWMgU3RyaW5nIGdldEVudHJ5SWQoKTsKLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW50cnlOYW1lKCk7Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3MjYwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9EZXZpY2VQcm9maWxlRW50cnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIGRpcmVjdGx5LgotICogSW5zdGVhZCwgcGxlYXNlIHVzZSBhYnN0cmFjdCBjbGFzcyhBYnN0cmFjdERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyKQotICogaW5zdGVhZC4KLSAqIDwvcD4KLSAqIAotICogQGRlcHJlY2F0ZWQgTm90IG5lZWRlZC4gU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgaW50ZXJmYWNlIERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIHsKLQlwdWJsaWMgSXRlcmF0b3IgZ2V0RGV2aWNlUHJvZmlsZUVudHJpZXMoKTsKLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0RldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyQnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNWFkMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBOb3QgbmVlZGVkLiAgU2VlIEJVRzExODM1OQotICovCi1wdWJsaWMgY2xhc3MgRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX1BMVUdJTklEID0gIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpIjsgIC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX05BTUUgPSAiZGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRGV2aWNlUHJvZmlsZUVudHJ5UHJvdmlkZXJCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQlzdGF0aWMgcHVibGljIERldmljZVByb2ZpbGVFbnRyeVByb3ZpZGVyIGdldEVudHJ5UHJvdmlkZXIoKSB7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoRVhURU5TSU9OX1BPSU5UX1BMVUdJTklELCBFWFRFTlNJT05fUE9JTlRfTkFNRSk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbnNbXSA9IHBvaW50LmdldEV4dGVuc2lvbnMoKTsKLQkJCWlmICgoZXh0ZW5zaW9ucyAhPSBudWxsKSAmJiAoZXh0ZW5zaW9ucy5sZW5ndGggPiAwKSkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudHNbXSA9IGV4dGVuc2lvbnNbaV0uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJCWlmICgoZWxlbWVudHMgIT0gbnVsbCkgJiYgKGVsZW1lbnRzLmxlbmd0aCA+IDApKSB7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZyA9IGVsZW1lbnRzW2pdOwotCQkJCQkJCWlmICgoY29uZmlnICE9IG51bGwpICYmIChjb25maWcuZ2V0TmFtZSgpLmVxdWFscyhFWFRFTlNJT05fUE9JTlRfTkFNRSkgPT0gdHJ1ZSkpIHsKLQkJCQkJCQkJU3RyaW5nIGNsYXNzTmFtZSA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUyk7Ci0JCQkJCQkJCWlmIChjbGFzc05hbWUgIT0gbnVsbCkgewotCQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCQlEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciBwcm92aWRlciA9IChEZXZpY2VQcm9maWxlRW50cnlQcm92aWRlciljb25maWcuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQkJCQkJCQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJCQkJCQlyZXR1cm4gcHJvdmlkZXI7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvSFRNTENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFmYjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0hUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3RPblByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGluc3RlYWQKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEhUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTl9ET0NVTUVOVF9UWVBFID0gMDsKLQlwcml2YXRlIGZpbmFsIGludCBOX0NTU19QUk9GSUxFID0gMTsKLQlwcml2YXRlIGZpbmFsIGludCBOX1RBUkdFVF9ERVZJQ0UgPSAyOwotCi0JcHJpdmF0ZSBUZXh0IHB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgc3lzdGVtSWRUZXh0OwotCi0JcHVibGljIEhUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCW51bWJlck9mQ29tYm8gPSAzOwotCQludW1Db2xzID0gMjsKLQkJbnVtUm93cyA9IDg7Ci0JCWNvbWJvID0gbmV3IENvbWJvTGlzdE9uUHJvcGVydHlQYWdlW3N1cGVyLm51bWJlck9mQ29tYm9dOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCkgewotCi0JCS8vIGNyZWF0ZSBkZXNjcmlwdGlvbiBvZiBpbXBsZWNpdCBET0NUWVBFCQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0eVBhZ2UsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9EZXNjcmlwdGlvbl9vZl9yb2xlX29mX2ZvbGxvd2luZ19ET0NUWVBFKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gbnVtQ29sczsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBjcmVhdGUgY29tYm9ib3gKLQkJc3VwZXIuY29tYm9bTl9ET0NVTUVOVF9UWVBFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoRE9DVU1FTlRfTEFCRUwpOwotCQlzdXBlci5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCS8vIHNldCBlbnRyeSBsaXN0IGludG8gQ29tYm8KLQkJQ29udGVudFNldHRpbmdzUmVnaXN0cnkuc2V0SFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5SW50byhjb21ib1tOX0RPQ1VNRU5UX1RZUEVdKTsKLQkJLy8JY3JlYXRlIFRleHRGaWVsZAotCQljcmVhdGVJRFRleHRGaWVsZCgpOwotCQlpZiAoY29tYm9bTl9ET0NVTUVOVF9UWVBFXS5nZXRJdGVtQ291bnQoKSA8PSAwKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSk7Ci0JCS8vIHdoZW4gZWl0aGVyIC5jb250ZW50c2V0dGluZ3Mgb3IgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0JCS8vIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RzLGdldFByb3BlcnR5IHJldHVybnMgZW1wdHkgc3RyaW5nLgotCQlpZiAoaW5pdFZhbHVlID09IG51bGwpCi0JCQlpbml0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgaW5pdCBzZWxlY3Rpb25JdGVtIGluIENvbWJvCi0JCXN1cGVyLnNldFNlbGVjdGlvbkl0ZW0oY29tYm9bTl9ET0NVTUVOVF9UWVBFXSwgaW5pdFZhbHVlKTsKLQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dChpbml0VmFsdWUpOwotCQlpZiAoIWluaXRWYWx1ZS5lcXVhbHMoIiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJLy8gdG9ybyBEMjEwMjYwCi0JCQlpZiAoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGluaXRWYWx1ZSkgIT0gbnVsbCkKLQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShpbml0VmFsdWUpKTsKLQkJCWVsc2UKLQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZQotCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCi0JCS8vIGNyZWF0ZSBzZXBhcmF0b3IKLQkJbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydHlQYWdlLCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSBudW1Db2xzOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDg7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ1NTQ29tYm9Cb3goKSB7Ci0JCXN1cGVyLmNvbWJvW05fQ1NTX1BST0ZJTEVdID0gc3VwZXIuY3JlYXRlQ29tYm9Cb3hPZihDU1NfTEFCRUwpOwotCi0JCUNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LnNldENTU01ldGFNb2RlbFJlZ2lzdHJ5SW50byhjb21ib1tOX0NTU19QUk9GSUxFXSk7Ci0JCWlmIChjb21ib1tOX0NTU19QUk9GSUxFXS5nZXRJdGVtQ291bnQoKSA8PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSk7Ci0JCS8vIHdoZW4gZWl0aGVyIC5jb250ZW50c2V0dGluZ3Mgb3IgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0JCS8vIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RzLGdldFByb3BlcnR5IHJldHVybnMgZW1wdHkgc3RyaW5nLgotCQlpZiAoaW5pdFZhbHVlID09IG51bGwpCi0JCQlpbml0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgaW5pdCBzZWxlY3Rpb25JdGVtIGluIENvbWJvCi0JCXN1cGVyLnNldFNlbGVjdGlvbkl0ZW0oY29tYm9bTl9DU1NfUFJPRklMRV0sIGluaXRWYWx1ZSk7Ci0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURldmljZUNvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX1RBUkdFVF9ERVZJQ0VdID0gc3VwZXIuY3JlYXRlQ29tYm9Cb3hPZihERVZJQ0VfTEFCRUwpOwotCi0JCUNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LnNldERldmljZVByb2ZpbGVSZWdpc3RyeUludG8oY29tYm9bTl9UQVJHRVRfREVWSUNFXSk7Ci0JCWlmIChjb21ib1tOX1RBUkdFVF9ERVZJQ0VdLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBpbml0VmFsdWUgPSBjb250ZW50U2V0dGluZ3MuZ2V0UHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFKTsKLQkJLy8gd2hlbiBlaXRoZXIgLmNvbnRlbnRzZXR0aW5ncyBvciBlbGVtZW50IGRvZXNuJ3QgZXhpc3QKLQkJLy8gd2hlbiBhdHRyaWJ1dGUgZG9lc24ndCBleGlzdHMsZ2V0UHJvcGVydHkgcmV0dXJucyBlbXB0eSBzdHJpbmcuCi0JCWlmIChpbml0VmFsdWUgPT0gbnVsbCkKLQkJCWluaXRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHNldCBpbml0IHNlbGVjdGlvbkl0ZW0gaW4gQ29tYm8KLQkJc3VwZXIuc2V0U2VsZWN0aW9uSXRlbShjb21ib1tOX1RBUkdFVF9ERVZJQ0VdLCBpbml0VmFsdWUpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU2V0dGluZ3NQYWdlR1VJKCkgewotCQlpbnQgdHlwZSA9ICgoSVJlc291cmNlKSBnZXRFbGVtZW50KCkpLmdldFR5cGUoKTsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkvLwljb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocHJvcGVydHlQYWdlLG51bUNvbHMsbnVtUm93cyk7Ci0JCQkJY3JlYXRlRG9jdW1lbnRUeXBlQ29tYm9Cb3goKTsKLQkJCQljcmVhdGVDU1NDb21ib0JveCgpOwotCQkJCWNyZWF0ZURldmljZUNvbWJvQm94KCk7Ci0JCQkJY29tcHV0ZU1heFdpZHRoSGludCgpOwotCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuV0VCX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEKTsKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIkhUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaXMgaW5zdGFudGlhdGVkIGJ5IHJlc291cmNlIGV4Y2VwdCBGSUxFIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oTWFwIHByb3BlcnRpZXMsIFN0cmluZyB2YWx1ZUluQ29tYm8sIGludCBpbmRleCkgewotCi0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgTl9ET0NVTUVOVF9UWVBFIDoKLQkJCQkvLyBkb2MgdHlwZQotCQkJCXByb3BlcnRpZXMucHV0KElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOX1RBUkdFVF9ERVZJQ0UgOgotCQkJCS8vIGRldmljZQotCQkJCXByb3BlcnRpZXMucHV0KElDb250ZW50U2V0dGluZ3MuREVWSUNFX1BST0ZJTEUsIHZhbHVlSW5Db21ibyk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBwdXRTZWxlY3RlZFByb3BlcnR5SW50bygpIGluIGNsYXNzIEhUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRlbGV0ZU5vbmVQcm9wZXJ0eShpbnQgaW5kZXgpIHsKLQkJc3dpdGNoIChpbmRleCkgewotCQkJY2FzZSBOX0RPQ1VNRU5UX1RZUEUgOgotCQkJCS8vIGRvYyB0eXBlCi0JCQkJY29udGVudFNldHRpbmdzLmRlbGV0ZVByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFKTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW5kZXggaXMgb3V0IG9mIHJhbmdlIGluIGRlbGV0ZU5vbmVQcm9wZXJ0eSgpIGluIGNsYXNzIEhUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UiKTsvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlSURUZXh0RmllbGQoKSB7Ci0JCS8vIHB1YmxpYyBJRCAmIFN5c3RlbSBJRAotCQlMYWJlbCBwdWJsaWNMYWJlbCA9IG5ldyBMYWJlbChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJcHVibGljTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcHVibGljTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9QdWJsaWNfSUQpOwotCQlwdWJsaWNJZFRleHQgPSBuZXcgVGV4dChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCXB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUxhYmVsIHN5c3RlbUxhYmVsID0gbmV3IExhYmVsKHN1cGVyLnByb3BlcnR5UGFnZSwgU1dULk5PTkUpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQlzeXN0ZW1MYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlzeXN0ZW1MYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX1N5c3RlbV9JRCk7Ci0JCXN5c3RlbUlkVGV4dCA9IG5ldyBUZXh0KHN1cGVyLnByb3BlcnR5UGFnZSwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0KLQkJc3lzdGVtSWRUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0KLQotCXByaXZhdGUgdm9pZCBjb21wdXRlTWF4V2lkdGhIaW50KCkgewotCQkvLyBtYXhMZW5ndGhTdHJpbmcgd2FzIHNldCB3aGVuIEhUTUxEb2N1bWVudFR5cGVFbnRyeSB3YXMgc2V0IGluIGNsYXNzIENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LgotCQlTdHJpbmcgbWF4TGVuZ3RoU3RyaW5nID0gQ29udGVudFNldHRpbmdzUmVnaXN0cnkubWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci0JCVN0cmluZyBiYWNrdXAgPSB0aGlzLnN5c3RlbUlkVGV4dC5nZXRUZXh0KCk7Ci0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQobWF4TGVuZ3RoU3RyaW5nKTsKLQkJaW50IG1heFdpZHRoSGludCA9IHRoaXMuc3lzdGVtSWRUZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChiYWNrdXApOwotCi0JCWlmICh0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5wdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLnB1YmxpY0lkVGV4dC5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMuc3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5zeXN0ZW1JZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLmNvbWJvW3RoaXMuTl9DU1NfUFJPRklMRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9DU1NfUFJPRklMRV0uZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLmNvbWJvW3RoaXMuTl9UQVJHRVRfREVWSUNFXS5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuY29tYm9bdGhpcy5OX1RBUkdFVF9ERVZJQ0VdLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBlKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudCBldmVudCkgewotCQlXaWRnZXQgc291cmNlID0gZXZlbnQud2lkZ2V0OwotCi0JCWlmICh0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5lcXVhbHMoc291cmNlKSkgewotCQkJQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UgY29tYm8gPSB0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXTsKLQkJCWlmIChjb21iby5nZXRTZWxlY3Rpb25JbmRleCgpIDwgMCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoIWNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKS5lcXVhbHMoIiIpKSB7Ly8kTk9OLU5MUy0xJAotCQkJCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoY29tYm8uZ2V0U2VsZWN0ZWRWYWx1ZSgpKTsKLQkJCQlpZiAoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSkgIT0gbnVsbCkKLQkJCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oY29tYm8uZ2V0U2VsZWN0ZWRWYWx1ZSgpKSk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KCIiKTsvLyROT04tTkxTLTEkCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTg4ZTA1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aS5Db21ib0xpc3RPblByb3BlcnR5UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2UgUHJvamVjdEhUTUxDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgaW5zdGVhZAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIgewotCi0KLQlwcml2YXRlIGZpbmFsIGludCBOX0RPQ1VNRU5UX1RZUEUgPSAwOwotCXByaXZhdGUgZmluYWwgaW50IE5fQ1NTX1BST0ZJTEUgPSAxOwotCXByaXZhdGUgZmluYWwgaW50IE5fVEFSR0VUX0RFVklDRSA9IDI7Ci0KLQlwcml2YXRlIFRleHQgcHVibGljSWRUZXh0OwotCXByaXZhdGUgVGV4dCBzeXN0ZW1JZFRleHQ7Ci0KLQlwdWJsaWMgUHJvamVjdENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJbnVtYmVyT2ZDb21ibyA9IDM7Ci0JCW51bUNvbHMgPSAyOwotCQludW1Sb3dzID0gODsKLQkJY29tYm8gPSBuZXcgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2Vbc3VwZXIubnVtYmVyT2ZDb21ib107Ci0KLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRG9jdW1lbnRUeXBlQ29tYm9Cb3goKSB7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9uIG9mIGltcGxlY2l0IERPQ1RZUEUKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocHJvcGVydHlQYWdlLCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfRGVzY3JpcHRpb25fb2Zfcm9sZV9vZl9mb2xsb3dpbmdfRE9DVFlQRSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IG51bUNvbHM7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJLy8gY3JlYXRlIGNvbWJvYm94Ci0JCXN1cGVyLmNvbWJvW05fRE9DVU1FTlRfVFlQRV0gPSBzdXBlci5jcmVhdGVDb21ib0JveE9mKERPQ1VNRU5UX0xBQkVMKTsKLQkJc3VwZXIuY29tYm9bdGhpcy5OX0RPQ1VNRU5UX1RZUEVdLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkvLyBzZXQgZW50cnkgbGlzdCBpbnRvIENvbWJvCi0JCUNvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LnNldEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeUludG8oY29tYm9bTl9ET0NVTUVOVF9UWVBFXSk7Ci0JCS8vIGNyZWF0ZSBUZXh0RmllbGQKLQkJY3JlYXRlSURUZXh0RmllbGQoKTsKLQkJaWYgKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5IVE1MX0RPQ1VNRU5UX1RZUEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fRE9DVU1FTlRfVFlQRV0sIGluaXRWYWx1ZSk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoaW5pdFZhbHVlKTsKLQkJaWYgKCFpbml0VmFsdWUuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCS8vIHRvcm8gRDIxMDI2MAotCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShpbml0VmFsdWUpICE9IG51bGwpCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dChDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5nZXRTeXN0ZW1JZEZyb20oaW5pdFZhbHVlKSk7Ci0JCQllbHNlCi0JCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UKLQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQotCQkvLyBjcmVhdGUgc2VwYXJhdG9yCi0JCWxhYmVsID0gbmV3IExhYmVsKHByb3BlcnR5UGFnZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gbnVtQ29sczsKLQkJZGF0YS52ZXJ0aWNhbFNwYW4gPSA4OwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNTU0NvbWJvQm94KCkgewotCQlzdXBlci5jb21ib1tOX0NTU19QUk9GSUxFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoQ1NTX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXRDU1NNZXRhTW9kZWxSZWdpc3RyeUludG8oY29tYm9bTl9DU1NfUFJPRklMRV0pOwotCQlpZiAoY29tYm9bTl9DU1NfUFJPRklMRV0uZ2V0SXRlbUNvdW50KCkgPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGluaXRWYWx1ZSA9IGNvbnRlbnRTZXR0aW5ncy5nZXRQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuQ1NTX1BST0ZJTEUpOwotCQkvLyB3aGVuIGVpdGhlciAuY29udGVudHNldHRpbmdzIG9yIGVsZW1lbnQgZG9lc24ndCBleGlzdAotCQkvLyB3aGVuIGF0dHJpYnV0ZSBkb2Vzbid0IGV4aXN0cyxnZXRQcm9wZXJ0eSByZXR1cm5zIGVtcHR5IHN0cmluZy4KLQkJaWYgKGluaXRWYWx1ZSA9PSBudWxsKQotCQkJaW5pdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gc2V0IGluaXQgc2VsZWN0aW9uSXRlbSBpbiBDb21ibwotCQlzdXBlci5zZXRTZWxlY3Rpb25JdGVtKGNvbWJvW05fQ1NTX1BST0ZJTEVdLCBpbml0VmFsdWUpOwotCX0KLQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEZXZpY2VDb21ib0JveCgpIHsKLQkJc3VwZXIuY29tYm9bTl9UQVJHRVRfREVWSUNFXSA9IHN1cGVyLmNyZWF0ZUNvbWJvQm94T2YoREVWSUNFX0xBQkVMKTsKLQotCQlDb250ZW50U2V0dGluZ3NSZWdpc3RyeS5zZXREZXZpY2VQcm9maWxlUmVnaXN0cnlJbnRvKGNvbWJvW05fVEFSR0VUX0RFVklDRV0pOwotCQlpZiAoY29tYm9bTl9UQVJHRVRfREVWSUNFXS5nZXRJdGVtQ291bnQoKSA8PSAwKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgaW5pdFZhbHVlID0gY29udGVudFNldHRpbmdzLmdldFByb3BlcnR5KChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgSUNvbnRlbnRTZXR0aW5ncy5ERVZJQ0VfUFJPRklMRSk7Ci0JCS8vIHdoZW4gZWl0aGVyIC5jb250ZW50c2V0dGluZ3Mgb3IgZWxlbWVudCBkb2Vzbid0IGV4aXN0Ci0JCS8vIHdoZW4gYXR0cmlidXRlIGRvZXNuJ3QgZXhpc3RzLGdldFByb3BlcnR5IHJldHVybnMgZW1wdHkgc3RyaW5nLgotCQlpZiAoaW5pdFZhbHVlID09IG51bGwpCi0JCQlpbml0VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBzZXQgaW5pdCBzZWxlY3Rpb25JdGVtIGluIENvbWJvCi0JCXN1cGVyLnNldFNlbGVjdGlvbkl0ZW0oY29tYm9bTl9UQVJHRVRfREVWSUNFXSwgaW5pdFZhbHVlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVNldHRpbmdzUGFnZUdVSSgpIHsKLQkJaW50IHR5cGUgPSAoKElSZXNvdXJjZSkgZ2V0RWxlbWVudCgpKS5nZXRUeXBlKCk7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJLy8gY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHByb3BlcnR5UGFnZSxudW1Db2xzLG51bVJvd3MpOwotCQkJCWNyZWF0ZURvY3VtZW50VHlwZUNvbWJvQm94KCk7Ci0JCQkJY3JlYXRlQ1NTQ29tYm9Cb3goKTsKLQkJCQljcmVhdGVEZXZpY2VDb21ib0JveCgpOwotCQkJCWNvbXB1dGVNYXhXaWR0aEhpbnQoKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHByb3BlcnR5UGFnZSwgSUhlbHBDb250ZXh0SWRzLldFQl9DT05URU5UX1NFVFRJTkdTX0hFTFBJRCk7Ci0JCQkJYnJlYWs7Ci0KLQkJCWRlZmF1bHQgOgotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGlzIGluc3RhbnRpYXRlZCBieSByZXNvdXJjZSBleGNlcHQgUFJPSkVDVCIpOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJfQotCi0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKE1hcCBwcm9wZXJ0aWVzLCBTdHJpbmcgdmFsdWVJbkNvbWJvLCBpbnQgaW5kZXgpIHsKLQotCQlzd2l0Y2ggKGluZGV4KSB7Ci0JCQljYXNlIE5fRE9DVU1FTlRfVFlQRSA6Ci0JCQkJLy8gZG9jIHR5cGUKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkhUTUxfRE9DVU1FTlRfVFlQRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9DU1NfUFJPRklMRSA6Ci0JCQkJLy8gY3NzCi0JCQkJcHJvcGVydGllcy5wdXQoSUNvbnRlbnRTZXR0aW5ncy5DU1NfUFJPRklMRSwgdmFsdWVJbkNvbWJvKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgTl9UQVJHRVRfREVWSUNFIDoKLQkJCQkvLyBkZXZpY2UKLQkJCQlwcm9wZXJ0aWVzLnB1dChJQ29udGVudFNldHRpbmdzLkRFVklDRV9QUk9GSUxFLCB2YWx1ZUluQ29tYm8pOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdCA6Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbmRleCBpcyBvdXQgb2YgcmFuZ2UgaW4gcHV0U2VsZWN0ZWRQcm9wZXJ0eUludG8oKSBpbiBjbGFzcyBQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkZWxldGVOb25lUHJvcGVydHkoaW50IGluZGV4KSB7Ci0JCXN3aXRjaCAoaW5kZXgpIHsKLQkJCWNhc2UgTl9ET0NVTUVOVF9UWVBFIDoKLQkJCQkvLyBkb2MgdHlwZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuSFRNTF9ET0NVTUVOVF9UWVBFKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBOX0NTU19QUk9GSUxFIDoKLQkJCQkvLyBjc3MKLQkJCQljb250ZW50U2V0dGluZ3MuZGVsZXRlUHJvcGVydHkoKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpLCBJQ29udGVudFNldHRpbmdzLkNTU19QUk9GSUxFKTsKLQkJCQlicmVhazsKLQotCQkJY2FzZSBOX1RBUkdFVF9ERVZJQ0UgOgotCQkJCS8vIGRldmljZQotCQkJCWNvbnRlbnRTZXR0aW5ncy5kZWxldGVQcm9wZXJ0eSgoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCksIElDb250ZW50U2V0dGluZ3MuREVWSUNFX1BST0ZJTEUpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkluZGV4IGlzIG91dCBvZiByYW5nZSBpbiBkZWxldGVOb25lUHJvcGVydHkoKSBpbiBjbGFzcyBQcm9qZWN0Q29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIik7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZUlEVGV4dEZpZWxkKCkgewotCQkvLyBwdWJsaWMgSUQgJiBTeXN0ZW0gSUQKLQkJTGFiZWwgcHVibGljTGFiZWwgPSBuZXcgTGFiZWwoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuTk9ORSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuR1JBQl9IT1JJWk9OVEFMIHwgR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMTA7Ci0JCXB1YmxpY0xhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXB1YmxpY0xhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfUHVibGljX0lEKTsKLQkJcHVibGljSWRUZXh0ID0gbmV3IFRleHQoc3VwZXIucHJvcGVydHlQYWdlLCBTV1QuQk9SREVSIHwgU1dULlJFQURfT05MWSk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQotCQlwdWJsaWNJZFRleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlMYWJlbCBzeXN0ZW1MYWJlbCA9IG5ldyBMYWJlbChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5OT05FKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAxMDsKLQkJc3lzdGVtTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJc3lzdGVtTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9TeXN0ZW1fSUQpOwotCQlzeXN0ZW1JZFRleHQgPSBuZXcgVGV4dChzdXBlci5wcm9wZXJ0eVBhZ2UsIFNXVC5CT1JERVIgfCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCi0JCXN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgY29tcHV0ZU1heFdpZHRoSGludCgpIHsKLQkJLy8gbWF4TGVuZ3RoU3RyaW5nIHdhcyBzZXQgd2hlbiBIVE1MRG9jdW1lbnRUeXBlRW50cnkgd2FzIHNldCBpbiBjbGFzcwotCQkvLyBDb250ZW50U2V0dGluZ3NSZWdpc3RyeS4KLQkJU3RyaW5nIG1heExlbmd0aFN0cmluZyA9IENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5Lm1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5OwotCQlTdHJpbmcgYmFja3VwID0gdGhpcy5zeXN0ZW1JZFRleHQuZ2V0VGV4dCgpOwotCQl0aGlzLnN5c3RlbUlkVGV4dC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0JCWludCBtYXhXaWR0aEhpbnQgPSB0aGlzLnN5c3RlbUlkVGV4dC5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpLng7Ci0JCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoYmFja3VwKTsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9ET0NVTUVOVF9UWVBFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKHRoaXMucHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5wdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmICh0aGlzLnN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIHRoaXMuc3lzdGVtSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgdGhpcy5jb21ib1t0aGlzLk5fQ1NTX1BST0ZJTEVdLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fVEFSR0VUX0RFVklDRV0uZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSB0aGlzLmNvbWJvW3RoaXMuTl9UQVJHRVRfREVWSUNFXS5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJV2lkZ2V0IHNvdXJjZSA9IGV2ZW50LndpZGdldDsKLQotCQlpZiAodGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV0uZXF1YWxzKHNvdXJjZSkpIHsKLQkJCUNvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvID0gdGhpcy5jb21ib1t0aGlzLk5fRE9DVU1FTlRfVFlQRV07Ci0JCQlpZiAoY29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSA8IDApCi0JCQkJcmV0dXJuOwotCQkJaWYgKCFjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkuZXF1YWxzKCIiKSkgey8vJE5PTi1OTFMtMSQKLQkJCQl0aGlzLnB1YmxpY0lkVGV4dC5zZXRUZXh0KGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSk7Ci0JCQkJaWYgKENvbnRlbnRTZXR0aW5nc1JlZ2lzdHJ5LmdldFN5c3RlbUlkRnJvbShjb21iby5nZXRTZWxlY3RlZFZhbHVlKCkpICE9IG51bGwpCi0JCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoQ29udGVudFNldHRpbmdzUmVnaXN0cnkuZ2V0U3lzdGVtSWRGcm9tKGNvbWJvLmdldFNlbGVjdGVkVmFsdWUoKSkpOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5wdWJsaWNJZFRleHQuc2V0VGV4dCgiIik7Ly8kTk9OLU5MUy0xJAotCQkJCXRoaXMuc3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXRoaXMucHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJdGhpcy5zeXN0ZW1JZFRleHQuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvUHJvamVjdFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2NiZTRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1Byb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFByb2plY3RXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgZXh0ZW5kcyBXZWJDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UgewotCXB1YmxpYyBQcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlKCkgewotCQlzZXREZXNjcmlwdGlvbihIVE1MVUlNZXNzYWdlcy5Qcm9qZWN0V2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZDk5OWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkNTU0NvbnRlbnRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5tZXRhbW9kZWwuQ1NTUHJvZmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwubWV0YW1vZGVsLkNTU1Byb2ZpbGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBleHRlbmRzIFByb3BlcnR5UGFnZSB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFTEVDVF9OT05FID0gSFRNTFVJTWVzc2FnZXMuVUlfbm9uZTsKLQlwcml2YXRlIFN0cmluZyBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGNsYXNzIENvbWJvU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQlpbnQgaW5kZXggPSBmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCVN0cmluZyBkb2N0eXBlID0gKFN0cmluZykgZkRvY3VtZW50VHlwZUlkcy5nZXQoaW5kZXgpOwotCQkJdXBkYXRlRG9jdHlwZVRleHQoaW5kZXgsIGRvY3R5cGUpOwotCQl9Ci0JfQotCi0JQ29tYm8gZkRvY3VtZW50VHlwZUNvbWJvOwotCUxpc3QgZkRvY3VtZW50VHlwZUlkczsKLQlwcml2YXRlIFRleHQgZlB1YmxpY0lkVGV4dDsKLQlwcml2YXRlIFRleHQgZlN5c3RlbUlkVGV4dDsKLQlwcml2YXRlIENvbWJvIGZQcm9maWxlQ29tYm87Ci0JcHJpdmF0ZSBMaXN0IGZQcm9maWxlSWRzOwotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZkxpc3RlbmVyOwotCi0JcHVibGljIFdlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlXzApOwotCX0KLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQotCQkvLyBHcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcHJvcGVydHlQYWdlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMik7Ci0KLQkJY3JlYXRlRG9jdHlwZUNvbnRlbnRzKHByb3BlcnR5UGFnZSk7Ci0JCWNyZWF0ZUNTU1Byb2ZpbGVDb250ZW50cyhwcm9wZXJ0eVBhZ2UpOwotCi0JCXBvcHVsYXRlVmFsdWVzKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXMoKTsKLQkJY29tcHV0ZU1heFdpZHRoSGludCgpOwotCi0JCWZMaXN0ZW5lciA9IG5ldyBDb21ib1NlbGVjdGlvbkxpc3RlbmVyKCk7Ci0JCWZEb2N1bWVudFR5cGVDb21iby5hZGRTZWxlY3Rpb25MaXN0ZW5lcihmTGlzdGVuZXIpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocHJvcGVydHlQYWdlLCBJSGVscENvbnRleHRJZHMuV0VCX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEKTsKLQkJcmV0dXJuIHByb3BlcnR5UGFnZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlQ1NTUHJvZmlsZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gQ1NTIFByb2ZpbGUKLQkJVGV4dCBsYW5ndWFnZUxhYmVsID0gbmV3IFRleHQocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJbGFuZ3VhZ2VMYWJlbC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlVJX0NTU19wcm9maWxlX19fMik7Ci0JCWZQcm9maWxlQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZQcm9maWxlQ29tYm8uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlRG9jdHlwZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9uIG9mIGltcGxpY2l0IERPQ1RZUEUKLQkJVGV4dCBkb2N0eXBlTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlkb2N0eXBlTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9EZXNjcmlwdGlvbl9vZl9yb2xlX29mX2ZvbGxvd2luZ19ET0NUWVBFKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkb2N0eXBlTGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQkvLyBkb2N1bWVudCB0eXBlCi0JCVRleHQgbGFuZ3VhZ2VMYWJlbCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSk7Ci0JCWxhbmd1YWdlTGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5VSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzEpOwotCQlmRG9jdW1lbnRUeXBlQ29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBTV1QuUkVBRF9PTkxZKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMLCBHcmlkRGF0YS5GSUxMLCB0cnVlLCBmYWxzZSk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWZEb2N1bWVudFR5cGVDb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIHB1YmxpYyBJRAotCQlUZXh0IHB1YmxpY0lkTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlwdWJsaWNJZExhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfUHVibGljX0lEKTsKLQkJZlB1YmxpY0lkVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZlB1YmxpY0lkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIHN5c3RlbSBJRAotCQlUZXh0IHN5c3RlbUlkTGFiZWwgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5SRUFEX09OTFkpOwotCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVUlfU3lzdGVtX0lEKTsKLQkJZlN5c3RlbUlkVGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlJFQURfT05MWSB8IFNXVC5CT1JERVIpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwsIEdyaWREYXRhLkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZlN5c3RlbUlkVGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCS8vIGNyZWF0ZSBzZXBhcmF0b3IKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuU0VQQVJBVE9SIHwgU1dULkhPUklaT05UQUwpOwotCQlkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkYXRhLnZlcnRpY2FsU3BhbiA9IDg7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSByZXNvdXJjZSB0aGlzIHByb3BlcnRpZXMgcGFnZSBpcyBmb3IKLQkgKiAKLQkgKiBAcmV0dXJuIElSZXNvdXJjZSBmb3IgdGhpcyBwcm9wZXJ0aWVzIHBhZ2Ugb3IgbnVsbCBpZiB0aGVyZSBpcyBubwotCSAqICAgICAgICAgSVJlc291cmNlCi0JICovCi0JcHJpdmF0ZSBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0JCWlmIChnZXRFbGVtZW50KCkgaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCXJlc291cmNlID0gKElSZXNvdXJjZSkgZ2V0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRTeXN0ZW1JZEZyb20oU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmIChwdWJsaWNJZCA9PSBudWxsIHx8IHB1YmxpY0lkLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5IHJlZyA9IEhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlFbnVtZXJhdGlvbiBlID0gcmVnLmdldEVudHJpZXMoKTsKLQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCUhUTUxEb2N1bWVudFR5cGVFbnRyeSBlbnRyeSA9IChIVE1MRG9jdW1lbnRUeXBlRW50cnkpIGUubmV4dEVsZW1lbnQoKTsKLQkJCWlmIChlbnRyeS5nZXRQdWJsaWNJZCgpLmVxdWFscyhwdWJsaWNJZCkpCi0JCQkJcmV0dXJuIGVudHJ5LmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVEb2N0eXBlVmFsdWVzKCk7Ci0JCWluaXRpYWxpemVDU1NQcm9maWxlVmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDU1NQcm9maWxlVmFsdWVzKCkgewotCQlpbnQgaW5kZXggPSAwOwotCQlTdHJpbmcgcHJvZmlsZSA9IENTU0NvbnRlbnRQcm9wZXJ0aWVzLmdldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBmYWxzZSk7Ci0JCWlmIChwcm9maWxlICE9IG51bGwgJiYgcHJvZmlsZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8qCi0JCQkgKiBJZiBpdGVtIGlzIGFscmVhZHkgcGFydCBvZiBjb21ibywgc2VsZWN0IGl0LiBPdGhlcndpc2UsIHNlbGVjdAotCQkJICogbm9uZS4KLQkJCSAqLwotCQkJaW5kZXggPSBmUHJvZmlsZUlkcy5pbmRleE9mKHByb2ZpbGUpOwotCQl9Ci0JCWluZGV4ID0gaW5kZXggPj0gMCA/IGluZGV4IDogMDsKLQkJZlByb2ZpbGVDb21iby5zZWxlY3QoaW5kZXgpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRG9jdHlwZVZhbHVlcygpIHsKLQkJaW50IGluZGV4ID0gMDsKLQkJU3RyaW5nIGRvY3R5cGUgPSBIVE1MQ29udGVudFByb3BlcnRpZXMuZ2V0UHJvcGVydHkoSFRNTENvbnRlbnRQcm9wZXJ0aWVzLkRPQ1VNRU5UX1RZUEUsIGdldFJlc291cmNlKCksIGZhbHNlKTsKLQkJaWYgKGRvY3R5cGUgIT0gbnVsbCAmJiBkb2N0eXBlLmxlbmd0aCgpID4gMCkgewotCQkJLyoKLQkJCSAqIElmIGl0ZW0gaXMgYWxyZWFkeSBwYXJ0IG9mIGNvbWJvLCBzZWxlY3QgaXQuIE90aGVyd2lzZSwgc2VsZWN0Ci0JCQkgKiBub25lLgotCQkJICovCi0JCQlpbmRleCA9IGZEb2N1bWVudFR5cGVJZHMuaW5kZXhPZihkb2N0eXBlKTsKLQkJfQotCi0JCS8vIHNldCBjb21ib2JveAotCQlpbmRleCA9IGluZGV4ID49IDAgPyBpbmRleCA6IDA7Ci0JCWZEb2N1bWVudFR5cGVDb21iby5zZWxlY3QoaW5kZXgpOwotCi0JCXVwZGF0ZURvY3R5cGVUZXh0KGluZGV4LCBkb2N0eXBlKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZURvY3R5cGVUZXh0KGludCBpbmRleCwgU3RyaW5nIGRvY3R5cGUpIHsKLQkJaWYgKGluZGV4ID4gMCkgewotCQkJLy8gc2V0IHB1YmxpYy9zeXN0ZW0gaWQgdGV4dAotCQkJZlB1YmxpY0lkVGV4dC5zZXRUZXh0KGRvY3R5cGUpOwotCQkJU3RyaW5nIHN5c3RlbUlkID0gZ2V0U3lzdGVtSWRGcm9tKGRvY3R5cGUpOwotCQkJaWYgKHN5c3RlbUlkICE9IG51bGwpCi0JCQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KHN5c3RlbUlkKTsKLQkJCWVsc2UKLQkJCQlmU3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBzZXQgcHVibGljL3N5c3RlbSBpZCB0ZXh0Ci0JCQlmUHVibGljSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQlmU3lzdGVtSWRUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVWYWx1ZXMoKSB7Ci0JCXBvcHVsYXRlRG9jdHlwZVZhbHVlcygpOwotCQlwb3B1bGF0ZUNTU1Byb2ZpbGVWYWx1ZXMoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVDU1NQcm9maWxlVmFsdWVzKCkgewotCQlmUHJvZmlsZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIG5vbmUgZmlyc3QKLQkJZlByb2ZpbGVDb21iby5hZGQoU0VMRUNUX05PTkUpOwotCQlmUHJvZmlsZUlkcy5hZGQobnVsbCk7Ci0KLQkJQ1NTUHJvZmlsZVJlZ2lzdHJ5IHJlZyA9IENTU1Byb2ZpbGVSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlJdGVyYXRvciBpID0gcmVnLmdldFByb2ZpbGVzKCk7Ci0JCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJQ1NTUHJvZmlsZSBwcm9maWxlID0gKENTU1Byb2ZpbGUpIGkubmV4dCgpOwotCQkJU3RyaW5nIGlkID0gcHJvZmlsZS5nZXRQcm9maWxlSUQoKTsKLQkJCVN0cmluZyBuYW1lID0gcHJvZmlsZS5nZXRQcm9maWxlTmFtZSgpOwotCQkJZlByb2ZpbGVDb21iby5hZGQobmFtZSk7Ci0JCQlmUHJvZmlsZUlkcy5hZGQoaWQpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcHVsYXRlRG9jdHlwZVZhbHVlcygpIHsKLQkJZkRvY3VtZW50VHlwZUlkcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gYWRkIG5vbmUgZmlyc3QKLQkJZkRvY3VtZW50VHlwZUNvbWJvLmFkZChTRUxFQ1RfTk9ORSk7Ci0JCWZEb2N1bWVudFR5cGVJZHMuYWRkKG51bGwpOwotCi0JCUhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeSByZWcgPSBIVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJRW51bWVyYXRpb24gZSA9IHJlZy5nZXRFbnRyaWVzKCk7Ci0JCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlIVE1MRG9jdW1lbnRUeXBlRW50cnkgZW50cnkgPSAoSFRNTERvY3VtZW50VHlwZUVudHJ5KSBlLm5leHRFbGVtZW50KCk7Ci0JCQlTdHJpbmcgcHVibGljSWQgPSBlbnRyeS5nZXRQdWJsaWNJZCgpOwotCQkJU3RyaW5nIGRpc3BsYXlOYW1lID0gZW50cnkuZ2V0RGlzcGxheU5hbWUoKTsKLQkJCWRpc3BsYXlOYW1lID0gZGlzcGxheU5hbWUgIT0gbnVsbCA/IGRpc3BsYXlOYW1lIDogcHVibGljSWQ7Ci0KLQkJCWZEb2N1bWVudFR5cGVDb21iby5hZGQoZGlzcGxheU5hbWUpOwotCQkJZkRvY3VtZW50VHlwZUlkcy5hZGQocHVibGljSWQpOwotCi0JCQlpZiAoZGlzcGxheU5hbWUubGVuZ3RoKCkgPiBtYXhMZW5ndGhTdHJpbmdJbkhUTUxEb2N1bWVudFR5cGVSZWdpc3RyeS5sZW5ndGgoKSkgewotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZGlzcGxheU5hbWU7Ci0JCQl9Ci0KLQkJCWlmIChlbnRyeS5nZXRTeXN0ZW1JZCgpID09IG51bGwpCi0JCQkJY29udGludWU7IC8vIGlmIEhUTUwgZW50cnkKLQotCi0JCQlpZiAoZW50cnkuZ2V0U3lzdGVtSWQoKS5sZW5ndGgoKSA+IG1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5Lmxlbmd0aCgpKQotCQkJCW1heExlbmd0aFN0cmluZ0luSFRNTERvY3VtZW50VHlwZVJlZ2lzdHJ5ID0gZW50cnkuZ2V0U3lzdGVtSWQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjb21wdXRlTWF4V2lkdGhIaW50KCkgewotCQkvLyBtYXhMZW5ndGhTdHJpbmcgd2FzIHNldCBwb3B1bGF0ZURvY3R5cGVWYWx1ZXMgd2FzIGNhbGxlZAotCQlTdHJpbmcgbWF4TGVuZ3RoU3RyaW5nID0gbWF4TGVuZ3RoU3RyaW5nSW5IVE1MRG9jdW1lbnRUeXBlUmVnaXN0cnk7Ci0JCVN0cmluZyBiYWNrdXAgPSBmU3lzdGVtSWRUZXh0LmdldFRleHQoKTsKLQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KG1heExlbmd0aFN0cmluZyk7Ci0JCWludCBtYXhXaWR0aEhpbnQgPSBmU3lzdGVtSWRUZXh0LmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCkueDsKLQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KGJhY2t1cCk7Ci0KLQkJaWYgKGZEb2N1bWVudFR5cGVDb21iby5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIGZEb2N1bWVudFR5cGVDb21iby5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQkJaWYgKGZQdWJsaWNJZFRleHQuZ2V0TGF5b3V0RGF0YSgpICE9IG51bGwpCi0JCQkoKEdyaWREYXRhKSBmUHVibGljSWRUZXh0LmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gbWF4V2lkdGhIaW50OwotCQlpZiAoZlN5c3RlbUlkVGV4dC5nZXRMYXlvdXREYXRhKCkgIT0gbnVsbCkKLQkJCSgoR3JpZERhdGEpIGZTeXN0ZW1JZFRleHQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBtYXhXaWR0aEhpbnQ7Ci0JCWlmIChmUHJvZmlsZUNvbWJvLmdldExheW91dERhdGEoKSAhPSBudWxsKQotCQkJKChHcmlkRGF0YSkgZlByb2ZpbGVDb21iby5nZXRMYXlvdXREYXRhKCkpLndpZHRoSGludCA9IG1heFdpZHRoSGludDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcGVyZm9ybUNTU1Byb2ZpbGVEZWZhdWx0cygpIHsKLQkJaW50IGluZGV4ID0gZlByb2ZpbGVDb21iby5pbmRleE9mKFNFTEVDVF9OT05FKTsKLQkJaWYgKGluZGV4ID4gLTEpCi0JCQlmUHJvZmlsZUNvbWJvLnNlbGVjdChpbmRleCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHBlcmZvcm1DU1NQcm9maWxlT2soKSB7Ci0JCWludCBpbmRleCA9IGZQcm9maWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGZQcm9maWxlSWRzLmdldChpbmRleCk7Ci0JCQlpZiAoaWQgPT0gbnVsbCB8fCBpZC5sZW5ndGgoKSA9PSAwIHx8IGlkLmVxdWFsc0lnbm9yZUNhc2UoU0VMRUNUX05PTkUpKSB7Ci0JCQkJLy8gaWYgbm9uZSwgdXNlIG51bGwKLQkJCQlpZCA9IG51bGw7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCUNTU0NvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KENTU0NvbnRlbnRQcm9wZXJ0aWVzLkNTU19QUk9GSUxFLCBnZXRSZXNvdXJjZSgpLCBpZCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JCQkJLy8gZmlsZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCi0JCXBlcmZvcm1Eb2N0eXBlRGVmYXVsdHMoKTsKLQkJcGVyZm9ybUNTU1Byb2ZpbGVEZWZhdWx0cygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwZXJmb3JtRG9jdHlwZURlZmF1bHRzKCkgewotCQlmUHVibGljSWRUZXh0LnNldFRleHQoIiIpOy8vJE5PTi1OTFMtMSQKLQkJZlN5c3RlbUlkVGV4dC5zZXRUZXh0KCIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBwZXJmb3JtRG9jdHlwZU9rKCkgewotCQlpbnQgaW5kZXggPSBmRG9jdW1lbnRUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJaWYgKGluZGV4ID4gLTEpIHsKLQkJCVN0cmluZyBpZCA9IChTdHJpbmcpIGZEb2N1bWVudFR5cGVJZHMuZ2V0KGluZGV4KTsKLQkJCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpID09IDAgfHwgaWQuZXF1YWxzSWdub3JlQ2FzZShTRUxFQ1RfTk9ORSkpIHsKLQkJCQkvLyBpZiBub25lLCB1c2UgbnVsbAotCQkJCWlkID0gbnVsbDsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJSFRNTENvbnRlbnRQcm9wZXJ0aWVzLnNldFByb3BlcnR5KEhUTUxDb250ZW50UHJvcGVydGllcy5ET0NVTUVOVF9UWVBFLCBnZXRSZXNvdXJjZSgpLCBpZCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbWF5YmUgaW4gZnV0dXJlLCBsZXQgdXNlciBrbm93IHRoZXJlIHdhcyBhIHByb2JsZW0gc2F2aW5nCi0JCQkJLy8gZmlsZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXBlcmZvcm1Eb2N0eXBlT2soKTsKLQkJcGVyZm9ybUNTU1Byb2ZpbGVPaygpOwotCi0JCXJldHVybiBzdXBlci5wZXJmb3JtT2soKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVySFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2M0NThhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5Db3JyZWN0aW9uUHJvY2Vzc29yWE1MOwotCi0vKioKLSAqIENvcnJlY3Rpb24gYXNzaXN0YW50IGZvciBIVE1MCi0gKi8KLXB1YmxpYyBjbGFzcyBDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXJIVE1MIGV4dGVuZHMgQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyIHsKLQotCXB1YmxpYyBJQ29udGVudEFzc2lzdGFudCBnZXRDb3JyZWN0aW9uQXNzaXN0YW50KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCUlDb250ZW50QXNzaXN0YW50IGNhID0gbnVsbDsKLQotCQlpZiAoc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0YW50ID0gbmV3IENvbnRlbnRBc3Npc3RhbnQoKTsKLQotCQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY29ycmVjdGlvblByb2Nlc3NvciA9IG5ldyBDb3JyZWN0aW9uUHJvY2Vzc29yWE1MKHNvdXJjZVZpZXdlcik7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0NEQVRBKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfUEkpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLkRURF9TVUJTRVQpOwotCQkJfQotCQkJY2EgPSBhc3Npc3RhbnQ7Ci0JCX0KLQotCQlyZXR1cm4gY2E7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjM4ZmIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLmNvcmV4dC5qYXZhZG9jLlNpbmdsZUNoYXJSZWFkZXIuCi0gKiBNb2RpZmljYXRpb24gd2FzIG1hZGUgdG8gZml4IHN0YXRlbWVudCB1bm5lY2Vzc2FyaWx5IG5lc3RlZCB3aXRoaW4gZWxzZQotICogY2xhdXNlIHdhcm5pbmcgaW4gcmVhZCguLikuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTaW5nbGVDaGFyUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWQoY2hhcltdLGludCxpbnQpCi0JICovCi0JcHVibGljIGludCByZWFkKGNoYXIgY2J1ZltdLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgZW5kID0gb2ZmICsgbGVuOwotCQlmb3IgKGludCBpID0gb2ZmOyBpIDwgZW5kOyBpKyspIHsKLQkJCWludCBjaCA9IHJlYWQoKTsKLQkJCWlmIChjaCA9PSAtMSkgewotCQkJCWlmIChpID09IG9mZikgewotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJCXJldHVybiBpIC0gb2ZmOwotCQkJfQotCQkJY2J1ZltpXSA9IChjaGFyKSBjaDsKLQkJfQotCQlyZXR1cm4gbGVuOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI3JlYWR5KCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGNvbnRlbnQgYXMgYSBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBjaDsKLQkJd2hpbGUgKChjaCA9IHJlYWQoKSkgIT0gLTEpIHsKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJfQotCQlyZXR1cm4gYnVmLnRvU3RyaW5nKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9BY3Rpb25Db250cmlidXRvckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQWN0aW9uQ29udHJpYnV0b3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTg3MGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9BY3Rpb25Db250cmlidXRvckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdC51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotLyoqCi0gKgotICogSW5zdGVhZCwgdXNlIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBmb3Igc291cmNlIHBhZ2UgY29udHJpYnV0b3IKLSAqIG9mIG11bHRpIHBhZ2UgZWRpdG9yLgotICogCi0gKiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzdGlsbCB2YWxpZCBmb3Igc2luZ2xlIHBhZ2UgZWRpdG9yLgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3JIVE1MIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0b3JYTUwgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEVESVRPUl9JRFMgPSB7Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZS5zb3VyY2UiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4dGVuc2lvbklEcygpIHsKLQkJcmV0dXJuIEVESVRPUl9JRFM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cEFjdGlvbkhUTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkNTUzZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5IVE1MQ2xlYW51cFByb2Nlc3NvckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLS8qKgotICogQ2xlYW51cCBhY3Rpb24gZGVsZWdhdGUgZm9yIEhUTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBDbGVhbnVwQWN0aW9uSFRNTERlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZkNsZWFudXBQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQkJZkNsZWFudXBQcm9jZXNzb3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfbGFiZWwpOwotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KEhUTUxVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF90b29sdGlwKTsKLQkJCWFjdGlvbi5zZXREZXNjcmlwdGlvbihIVE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJZmluYWwgSVRleHRFZGl0b3IgZWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJQ2xlYW51cERpYWxvZ0hUTUwgY2xlYW51cERpYWxvZyA9IG5ldyBDbGVhbnVwRGlhbG9nSFRNTChlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJY2xlYW51cERpYWxvZy5zZXRpc1hIVE1MVHlwZShpc1hIVE1MKCkpOwotCQkJaWYgKGNsZWFudXBEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCS8vIHNldHVwIHJ1bm5hYmxlCi0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gZ2V0Q2xlYW51cFByb2Nlc3NvcigpOwotCQkJCQkJaWYgKGNsZWFudXBQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJY2xlYW51cFByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJLy8gVE9ETzogbWFrZSBpbmRlcGVuZGVudCBvZiAnbW9kZWwnLgotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnCi0JCQkJCQkvLyBtb2RlbCBjaGFuZ2UKLQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJCQkvLyBydW4KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZwotCQkJCQkJLy8gbW9kZWwKLQkJCQkJCS8vIGNoYW5nZQotCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0KLQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoKSB7Ci0JCWlmIChmQ2xlYW51cFByb2Nlc3NvciA9PSBudWxsKQotCQkJZkNsZWFudXBQcm9jZXNzb3IgPSBuZXcgSFRNTENsZWFudXBQcm9jZXNzb3JJbXBsKCk7Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJvY2Vzc29yOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hIVE1MKCkgewotCQlib29sZWFuIGlzeGh0bWwgPSBmYWxzZTsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KHRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCQlpZiAobW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQkJSURPTURvY3VtZW50IGRvbURvY3VtZW50ID0gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJCQlpZiAoZG9tRG9jdW1lbnQgIT0gbnVsbCkKLQkJCQkJCWlzeGh0bWwgPSBkb21Eb2N1bWVudC5pc1hNTFR5cGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzeGh0bWw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nSFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvZWRpdC91aS9DbGVhbnVwRGlhbG9nSFRNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjI1MjYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXQvdWkvQ2xlYW51cERpYWxvZ0hUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXQudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLkhUTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLXB1YmxpYyBjbGFzcyBDbGVhbnVwRGlhbG9nSFRNTCBleHRlbmRzIERpYWxvZyBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VBc2lzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFnczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveFF1b3RlQXR0clZhbHVlczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveEZvcm1hdFNvdXJjZTsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveENvbnZlcnRFT0xDb2RlczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXg7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjOwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmSXNYSFRNTCA9IGZhbHNlOwotCXByaXZhdGUgR3JvdXAgZlRhZ05hbWVDYXNlOwotCXByaXZhdGUgR3JvdXAgZkF0dHJOYW1lQ2FzZTsKLQotCXB1YmxpYyBDbGVhbnVwRGlhbG9nSFRNTChTaGVsbCBzaGVsbCkgewotCQlzdXBlcihzaGVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWdldFNoZWxsKCkuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5DbGVhbnVwX1VJXyk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCWNyZWF0ZURpYWxvZ0FyZWFJbkNvbXBvc2l0ZShjb21wb3NpdGUpOwotCQlpbml0aWFsaXplT3B0aW9ucygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjID0gc3VwZXIuY3JlYXRlQnV0dG9uQmFyKHBhcmVudCk7Ci0JCW9rQnV0dG9uRW5hYmxlbWVudCgpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGVGb3JIVE1MKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJLy8gQ29udmVydCB0YWcgbmFtZSBjYXNlCi0JCS8vIGQyNTcwNjQgbmVlZCB0byBhc3NvY2lhdGUgZ3JvdXAgdy8gcmFkaW8gYnV0dG9ucyBzbyByYWRpbyBidXR0b25zCi0JCS8vIGhlYWRlciBjYW4gYmUgcmVhZAotCQlmVGFnTmFtZUNhc2UgPSBuZXcgR3JvdXAoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWZUYWdOYW1lQ2FzZS5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlRhZ19uYW1lX2Nhc2VfZm9yX0hUTUxfVUlfKTsKLQkJR3JpZExheW91dCBoTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJaExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJZlRhZ05hbWVDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzID0gbmV3IEJ1dHRvbihmVGFnTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpcy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlRhZ19uYW1lX2Nhc2VfQXNfaXNfVUlfKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyID0gbmV3IEJ1dHRvbihmVGFnTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZV9jYXNlX0xvd2VyX1VJXyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKGZUYWdOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLlRhZ19uYW1lX2Nhc2VfVXBwZXJfVUlfKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBDb252ZXJ0IGF0dHIgbmFtZSBjYXNlCi0JCS8vIGQyNTcwNjQgbmVlZCB0byBhc3NvY2lhdGUgZ3JvdXAgdy8gcmFkaW8gYnV0dG9ucyBzbyByYWRpbyBidXR0b25zCi0JCS8vIGhlYWRlciBjYW4gYmUgcmVhZAotCQlmQXR0ck5hbWVDYXNlID0gbmV3IEdyb3VwKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmQXR0ck5hbWVDYXNlLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQXR0cmlidXRlX25hbWVfY2FzZV9mb3JfSFRNTF9VSV8pOwotCQlmQXR0ck5hbWVDYXNlLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcyA9IG5ldyBCdXR0b24oZkF0dHJOYW1lQ2FzZSwgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lX2Nhc2VfQXNfaXNfVUlfKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlQXNpcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIgPSBuZXcgQnV0dG9uKGZBdHRyTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQXR0cmlidXRlX25hbWVfY2FzZV9Mb3dlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIgPSBuZXcgQnV0dG9uKGZBdHRyTmFtZUNhc2UsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuQXR0cmlidXRlX25hbWVfY2FzZV9VcHBlcl9VSV8pOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGUoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQljcmVhdGVEaWFsb2dBcmVhSW5Db21wb3NpdGVGb3JIVE1MKGNvbXBvc2l0ZSk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuQ0xFQU5VUF9IVE1MX0hFTFBJRCk7IC8vIHVzZQotCQkvLyBIVE1MCi0JCS8vIHNwZWNpZmljCi0JCS8vIGhlbHAKLQotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBJbnNlcnQgbWlzc2luZyByZXF1aXJlZCBhdHRycwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5JbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV8pOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIEluc2VydCBtaXNzaW5nIGJlZ2luL2VuZCB0YWdzCi0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuSW5zZXJ0X21pc3NpbmdfdGFnc19VSV8pOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBRdW90ZSBhdHRyaWJ1dGUgdmFsdWVzCi0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5RdW90ZV9hdHRyaWJ1dGVfdmFsdWVzX1VJXyk7Ci0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBGb3JtYXQgc291cmNlCi0JCWZDaGVja0JveEZvcm1hdFNvdXJjZSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5Gb3JtYXRfc291cmNlX1VJXyk7Ci0JCWZDaGVja0JveEZvcm1hdFNvdXJjZS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBDb252ZXJ0IEVPTCBjb2RlCi0JCWZDaGVja0JveENvbnZlcnRFT0xDb2RlcyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5Db252ZXJ0X0VPTF9jb2Rlc19VSV8pOwotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCUNvbXBvc2l0ZSBFT0xDb2RlcyA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCUVPTENvZGVzLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MgPSBuZXcgQnV0dG9uKEVPTENvZGVzLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkVPTF9XaW5kb3dzX1VJKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4ID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5FT0xfVW5peF9VSSk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjID0gbmV3IEJ1dHRvbihFT0xDb2RlcywgU1dULlJBRElPKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkVPTF9NYWNfVUkpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG9rUHJlc3NlZCgpIHsKLQkJc3RvcmVPcHRpb25zKCk7Ci0KLQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9wdGlvbnNGb3JIVE1MKCkgewotCQlib29sZWFuIGNhc2VTZW5zaXRpdmUgPSBpc1hIVE1MVHlwZSgpOwotCi0JCWlmIChjYXNlU2Vuc2l0aXZlKSB7Ci0JCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWludCB0YWdOYW1lQ2FzZSA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9UQUdfTkFNRV9DQVNFKTsKLQkJCWlmICh0YWdOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgewotCQkJCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuc2V0U2VsZWN0aW9uKHRydWUpOwotCQkJfSBlbHNlIGlmICh0YWdOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUikKLQkJCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UKLQkJCQlmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUFzaXMuc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0KLQkJaWYgKGNhc2VTZW5zaXRpdmUpIHsKLQkJCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCWludCBhdHRyTmFtZUNhc2UgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpOwotCQkJaWYgKGF0dHJOYW1lQ2FzZSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUikgewotCQkJCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCX0gZWxzZSBpZiAoYXR0ck5hbWVDYXNlID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKQotCQkJCWZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUxvd2VyLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UKLQkJCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VBc2lzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCi0JCWVuYWJsZUNhc2VDb250cm9scyghY2FzZVNlbnNpdGl2ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9wdGlvbnMoKSB7Ci0JCWluaXRpYWxpemVPcHRpb25zRm9ySFRNTCgpOwotCi0JCWZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUykpOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCWZDaGVja0JveEZvcm1hdFNvdXJjZS5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTKSk7Ci0JCWlmIChmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCVN0cmluZyBFT0xDb2RlID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX0VPTF9DT0RFKTsKLQkJCWlmIChFT0xDb2RlID09IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKQotCQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWVsc2UgaWYgKEVPTENvZGUgPT0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpCi0JCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCQllbHNlCi0JCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQl9Ci0JCWVuYWJsZUVPTENvZGVSYWRpb3MoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZU9wdGlvbnNGb3JIVE1MKCkgewotCQlpZiAoIWlzWEhUTUxUeXBlKCkgJiYgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBTlVQX1RBR19OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQkJZWxzZQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0KLQkJaWYgKCFpc1hIVE1MVHlwZSgpICYmIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKQotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZWxzZSBpZiAoZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuTE9XRVIpOwotCQllbHNlCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9BVFRSX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVNJUyk7Ci0KLQkJLy8gZXhwbGljaXRseSBzYXZlIHBsdWdpbiBwcmVmZXJlbmNlcyBzbyB2YWx1ZXMgYXJlIHN0b3JlZAotCQlIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVPcHRpb25zKCkgewotCQlzdG9yZU9wdGlvbnNGb3JIVE1MKCk7Ci0KLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUywgZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTLCBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UsIGZDaGVja0JveEZvcm1hdFNvdXJjZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DT05WRVJUX0VPTF9DT0RFUywgZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKTsKLQotCQlpZiAoZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlpZiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpOwotCQkJfSBlbHNlIGlmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKTsKLQkJCX0gZWxzZSB7Ci0JCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSTEYpOwotCQkJfQotCQl9Ci0KLQkJLy8gZXhwbGljaXRseSBzYXZlIHBsdWdpbiBwcmVmZXJlbmNlcyBzbyB2YWx1ZXMgYXJlIHN0b3JlZAotCQlIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQlpZiAoZS53aWRnZXQgPT0gZkNoZWNrQm94Q29udmVydEVPTENvZGVzKQotCQkJZW5hYmxlRU9MQ29kZVJhZGlvcyhmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCi0JCW9rQnV0dG9uRW5hYmxlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzWEhUTUxUeXBlKCkgewotCQlyZXR1cm4gZklzWEhUTUw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5hYmxlRU9MQ29kZVJhZGlvcyhib29sZWFuIGVuYWJsZSkgewotCQlpZiAoKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzICE9IG51bGwpICYmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYyAhPSBudWxsKSkgewotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0RW5hYmxlZChlbmFibGUpOwotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguc2V0RW5hYmxlZChlbmFibGUpOwotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0KLQkJCWlmICghZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MuZ2V0U2VsZWN0aW9uKCkgJiYgIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LmdldFNlbGVjdGlvbigpICYmICFmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpKQotCQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEVuYWJsZXMvZGlzYWJsZXMgdGhlIHRhZy9hdHRyIGNhc2UgcmFkaW8gYnV0dG9ucwotCSAqLwotCXByaXZhdGUgdm9pZCBlbmFibGVDYXNlQ29udHJvbHMoYm9vbGVhbiBlbmFibGUpIHsKLQkJZlRhZ05hbWVDYXNlLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VBc2lzLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VMb3dlci5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCWZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIuc2V0RW5hYmxlZChlbmFibGUpOwotCi0JCWZBdHRyTmFtZUNhc2Uuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VBc2lzLnNldEVuYWJsZWQoZW5hYmxlKTsKLQkJZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuc2V0RW5hYmxlZChlbmFibGUpOwotCQlmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlcy9kaXNhYmxlcyBPSyBidXR0b24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgb2tCdXR0b25FbmFibGVtZW50KCkgewotCQlib29sZWFuIHRhZ05hbWVDYXNlQ2hlY2sgPSAoKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlVXBwZXIgIT0gbnVsbCAmJiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyLmdldFNlbGVjdGlvbigpKSB8fCBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyLmdldFNlbGVjdGlvbigpKTsKLQkJYm9vbGVhbiBhdHRyTmFtZUNhc2VDaGVjayA9ICgoZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlVXBwZXIgIT0gbnVsbCAmJiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkgfHwgZlJhZGlvQnV0dG9uQXR0ck5hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQlib29sZWFuIGVvbENoZWNrID0gZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpICYmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpIHx8IGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmdldFNlbGVjdGlvbigpKTsKLQkJYm9vbGVhbiBidXR0b25FbmFibGVkID0gdGFnTmFtZUNhc2VDaGVjayB8fCBhdHRyTmFtZUNhc2VDaGVjayB8fCBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94Rm9ybWF0U291cmNlLmdldFNlbGVjdGlvbigpIHx8IGVvbENoZWNrOwotCQlnZXRCdXR0b24oSURpYWxvZ0NvbnN0YW50cy5PS19JRCkuc2V0RW5hYmxlZChidXR0b25FbmFibGVkKTsKLQl9Ci0KLQl2b2lkIHNldGlzWEhUTUxUeXBlKGJvb2xlYW4gaXNYSFRNTCkgewotCQlmSXNYSFRNTCA9IGlzWEhUTUw7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ODYzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gSFRNTFVJUGx1Z2luLklEOwotCXByaXZhdGUgc3RhdGljIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvLwkgc2F2ZSBhIGRlc2NyaXB0b3IgZm9yIGVhY2ggaW1hZ2UKLQlwcml2YXRlIEhhc2hNYXAgZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEhUTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBIVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlIHJlZ2lzdHJ5Ci0JCQlpZiAoIWRlc2MuZXF1YWxzKEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCkpKQotCQkJCWdldEltYWdlUmVnaXN0cnkoKS5wdXQocmVzb3VyY2UsIGltYWdlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbWFnZSBkZXNjcmlwdG9yIGZyb20gdGhlIGdpdmVuIGltYWdlRmlsZVBhdGggYW5kIGFkZHMgdGhlCi0JICogaW1hZ2UgZGVzY3JpcHRvciB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgYW4gaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIGNvdWxkIG5vdCBiZSBjcmVhdGVkLCB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvcgotCSAqIGlzIHJldHVybmVkIGJ1dCBub3QgYWRkZWQgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuCi0JICogCi0JICogQHBhcmFtIGltYWdlRmlsZVBhdGgKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciBpbWFnZSBkZXNjcmlwdG9yIGZvciBpbWFnZUZpbGVQYXRoIG9yIGRlZmF1bHQKLQkgKiAgICAgICAgICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIHJlc291cmNlIGNvdWxkIG5vdCBiZSBmb3VuZAotCSAqLwotCXByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcihTdHJpbmcgaW1hZ2VGaWxlUGF0aCkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFBMVUdJTklELCBpbWFnZUZpbGVQYXRoKTsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLnB1dChpbWFnZUZpbGVQYXRoLCBpbWFnZURlc2NyaXB0b3IpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKTsKLQkJfQotCi0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSFRNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmMxZTdkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9IVE1MRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgSFRNTCBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMgeyAJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUJMRSA9ICJpY29ucy9mdWxsL29iajE2L3RhYmxlLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0FOQ0hPUiA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1hbmNob3IuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfQk9EWSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1ib2R5LmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0JVVFRPTiA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1idXR0b24uZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfRk9OVCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1mb250LmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0ZPUk0gPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctZm9ybS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfSFRNTCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1odG1sLmdpZiI7CQkJLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0lNQUdFX01BUCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1pbWFnZS1tYXAuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfSU1BR0UgPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctaW1hZ2UuZ2lmIjsJCQkvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfSlNQID0gImljb25zL2Z1bGwvb2JqMTYvdGFnLWpzcC5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19URU1QTEFURSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy10ZW1wbGF0ZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19USVRMRSA9ICJpY29ucy9mdWxsL29iajE2L3RhZy10aXRsZS5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBRyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfV0laQkFOX05FV0hUTUxGSUxFID0gImljb25zL2Z1bGwvd2l6YmFuL25ld2hmaWxlX3dpei5naWYiOwkJCS8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFmZTUwNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9lZGl0b3IvSUhlbHBDb250ZXh0SWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgSFRNTCBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBIVE1MVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIC8vIGZpZ3VyZWQgb3V0IG9uIHRoZSBmbHkKLQkvLyAvLyBIVE1MIFNvdXJjZSBwYWdlIGVkaXRvcgotCS8vIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCArIl9zb3VyY2VfSGVscElkIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSFRNTCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1BSRUZXRUJYX0ZJTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAzMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBIVE1MIFNvdXJjZSBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwMzEiOyAvLyROT04tTkxTLTEkCi0JLy8gSFRNTCBTdHlsZXMgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRNTF9QUkVGV0VCWF9TVFlMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDMyIjsgLy8kTk9OLU5MUy0xJAotCS8vIEhUTUwgVGVtcGxhdGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfUFJFRldFQlhfVEVNUExBVEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAzMyI7IC8vJE5PTi1OTFMtMSQKLQkJCi0JLy8gSFRNTCBDbGVhbnVwIGRpYWxvZwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFOVVBfSFRNTF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTExMDAiOyAvLyROT04tTkxTLTEkCi0JCi0JLy8gSFRNTCBDb250ZW50IFNldHRpbmdzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX0NPTlRFTlRfU0VUVElOR1NfSEVMUElEID0gUFJFRklYICsgIm1pc2MwMTcwIjsgLy8kTk9OLU5MUy0xJAotCQotCS8vIEhUTUwgTmV3IEZpbGUgV2l6YXJkIC0gVGVtcGxhdGUgUGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUTUxfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCA9IFBSRUZJWCArICJodG1sdzAwMTAiOyAvLyROT04tTkxTLTEkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJjMjQ2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBlcnNpc3RhYmxlRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXI7Ci0KLS8qKgotICogRWRpdG9ySW5wdXQgZm9yIGV4dGVybmFsIGZpbGVzLiBDb3BpZWQgZnJvbQotICogb3JnLmVjbGlwc2UudWkuaW50ZXJuYWwuZWRpdG9ycy50ZXh0LkphdmFGaWxlRWRpdG9ySW5wdXQKLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJUGF0aEVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCQotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggYWRhcHRlciB3aGljaCBzaW1wbHkgcHJvdmlkZXMgdGhlIGxhYmVsLgotCSAqIAotCSAqIEBzZWUgIEVjbGlwc2UgMy4xCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBXb3JrYmVuY2hBZGFwdGVyIGltcGxlbWVudHMgSVdvcmtiZW5jaEFkYXB0ZXIgewotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldENoaWxkcmVuKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRJbWFnZURlc2NyaXB0b3IoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRMYWJlbChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRMYWJlbChPYmplY3QgbykgewotCQkJcmV0dXJuICgoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG8pLmdldE5hbWUoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0UGFyZW50KGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEZpbGUgZkZpbGU7Ci0JcHJpdmF0ZSBXb3JrYmVuY2hBZGFwdGVyIGZXb3JrYmVuY2hBZGFwdGVyID0gbmV3IFdvcmtiZW5jaEFkYXB0ZXIoKTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChGaWxlIGZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJZkZpbGUgPSBmaWxlOwotCQlmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNleGlzdHMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0cygpIHsKLQkJcmV0dXJuIGZGaWxlLmV4aXN0cygpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0SW1hZ2VEZXNjcmlwdG9yKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXROYW1lKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXROYW1lKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRQZXJzaXN0YWJsZSgpCi0JICovCi0JcHVibGljIElQZXJzaXN0YWJsZUVsZW1lbnQgZ2V0UGVyc2lzdGFibGUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0VG9vbFRpcFRleHQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0JCXJldHVybiBmRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJaWYgKElMb2NhdGlvblByb3ZpZGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCXJldHVybiB0aGlzOwotCQlpZiAoSVdvcmtiZW5jaEFkYXB0ZXIuY2xhc3MuZXF1YWxzKGFkYXB0ZXIpKQotCQkJcmV0dXJuIGZXb3JrYmVuY2hBZGFwdGVyOwotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXIjZ2V0UGF0aChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGlucHV0LmZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0gICAgLyoKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQjZ2V0UGF0aCgpCi0gICAgICogQHNpbmNlIDMuMQotICAgICAqLwotICAgIHB1YmxpYyBJUGF0aCBnZXRQYXRoKCkgewotICAgICAgICByZXR1cm4gUGF0aC5mcm9tT1NTdHJpbmcoZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgIH0KLQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG8gaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG87Ci0JCQlyZXR1cm4gZkZpbGUuZXF1YWxzKGlucHV0LmZGaWxlKTsKLQkJfQotCQkKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJUGF0aEVkaXRvcklucHV0KSB7Ci0gICAgICAgICAgICBJUGF0aEVkaXRvcklucHV0IGlucHV0PSAoSVBhdGhFZGl0b3JJbnB1dClvOwotICAgICAgICAgICAgcmV0dXJuIGdldFBhdGgoKS5lcXVhbHMoaW5wdXQuZ2V0UGF0aCgpKTsKLSAgICAgICAgfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJcmV0dXJuIGZGaWxlLmhhc2hDb2RlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2IxNGVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL2h5cGVybGluay9FeHRlcm5hbEZpbGVIeXBlcmxpbmsuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBleHRlcm5hbCBmaWxlcy4KLSAqLwotY2xhc3MgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCQotCXByaXZhdGUgSVJlZ2lvbiBmSHlwZXJsaW5rUmVnaW9uOwotCXByaXZhdGUgRmlsZSBmSHlwZXJsaW5rRmlsZTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIEZpbGUgZmlsZSkgewotCQlmSHlwZXJsaW5rRmlsZSA9IGZpbGU7Ci0JCWZIeXBlcmxpbmtSZWdpb24gPSByZWdpb247Ci0JfQotCQotCXB1YmxpYyBJUmVnaW9uIGdldEh5cGVybGlua1JlZ2lvbigpIHsKLQkJcmV0dXJuIGZIeXBlcmxpbmtSZWdpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlTGFiZWwoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SHlwZXJsaW5rVGV4dCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgb3BlbigpIHsKLQkJaWYgKGZIeXBlcmxpbmtGaWxlICE9IG51bGwpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChmSHlwZXJsaW5rRmlsZSk7Ci0JCQlJRWRpdG9yRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCQkJdHJ5IHsKLQkJCQlkZXNjcmlwdG9yID0gSURFLmdldEVkaXRvckRlc2NyaXB0b3IoaW5wdXQuZ2V0TmFtZSgpLCB0cnVlKTsKLQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQkJSURFLm9wZW5FZGl0b3IocGFnZSwgaW5wdXQsIGRlc2NyaXB0b3IuZ2V0SWQoKSwgdHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1dvcmtzcGFjZUZpbGVIeXBlcmxpbmsuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVlM2FjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBmaWxlcyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gKEFzIGxvbmcgYXMgdGhlcmUgaXMgYW4gSUZpbGUsCi0gKiB0aGlzIGNhbiBiZSB1c2VkKSBPcGVucyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIHRoZSBmaWxlLgotICovCi1jbGFzcyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkhpZ2hsaWdodFJhbmdlOwotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlLCBJUmVnaW9uIHJhbmdlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQkJZkhpZ2hsaWdodFJhbmdlID0gcmFuZ2U7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmRmlsZSAhPSBudWxsICYmIGZGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmRmlsZSwgdHJ1ZSk7Ci0JCQkJLy8gaGlnaGxpZ2h0IHJhbmdlIGluIGVkaXRvciBpZiBwb3NzaWJsZQotCQkJCWlmIChmSGlnaGxpZ2h0UmFuZ2UgIT0gbnVsbCAmJiBlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkoKElUZXh0RWRpdG9yKSBlZGl0b3IpLnNldEhpZ2hsaWdodFJhbmdlKGZIaWdobGlnaHRSYW5nZS5nZXRPZmZzZXQoKSwgZkhpZ2hsaWdodFJhbmdlLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL1hNTEh5cGVybGlua0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRiZTE2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwMyArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5ldC5VUkk7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuVVJMSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBEZXRlY3RzIGh5cGVybGlua3MgaW4gWE1MIHRhZ3MuIEluY2x1ZGVzIGRldGVjdGlvbiBpbiBET0NUWVBFIGFuZCBhdHRyaWJ1dGUKLSAqIHZhbHVlcy4gUmVzb2x2ZXMgcmVmZXJlbmNlcyB0byBzY2hlbWFzLCBkdGRzLCBldGMgdXNpbmcgdGhlIENvbW1vbiBVUkkKLSAqIFJlc29sdmVyLgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxIeXBlcmxpbmtEZXRlY3RvciBpbXBsZW1lbnRzIElIeXBlcmxpbmtEZXRlY3RvciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgSFRUUF9QUk9UT0NPTCA9ICJodHRwOi8vIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgTk9fTkFNRVNQQUNFX1NDSEVNQV9MT0NBVElPTiA9ICJub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFNDSEVNQV9MT0NBVElPTiA9ICJzY2hlbWFMb2NhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBYU0lfTkFNRVNQQUNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZSB0aGUgYXBwcm9wcmlhdGUgaHlwZXJsaW5rCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEBwYXJhbSBoeXBlcmxpbmtSZWdpb24KLQkgKiBAcmV0dXJuIElIeXBlcmxpbmsKLQkgKi8KLQlwcml2YXRlIElIeXBlcmxpbmsgY3JlYXRlSHlwZXJsaW5rKFN0cmluZyB1cmlTdHJpbmcsIElSZWdpb24gaHlwZXJsaW5rUmVnaW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgbm9kZSkgewotCQlJSHlwZXJsaW5rIGxpbmsgPSBudWxsOwotCi0JCWlmIChpc0h0dHAodXJpU3RyaW5nKSkgewotCQkJbGluayA9IG5ldyBVUkxIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCB1cmlTdHJpbmcpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gdHJ5IHRvIGxvY2F0ZSB0aGUgZmlsZSBpbiB0aGUgd29ya3NwYWNlCi0JCQlGaWxlIHN5c3RlbUZpbGUgPSBnZXRGaWxlRnJvbVVyaVN0cmluZyh1cmlTdHJpbmcpOwotCQkJaWYgKHN5c3RlbUZpbGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBzeXN0ZW1QYXRoID0gc3lzdGVtRmlsZS5nZXRQYXRoKCk7Ci0JCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoc3lzdGVtUGF0aCk7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIGlzIGEgV29ya3NwYWNlRmlsZUh5cGVybGluayBzaW5jZSBmaWxlIGV4aXN0cyBpbgotCQkJCQkvLyB3b3Jrc3BhY2UKLQkJCQkJbGluayA9IG5ldyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgZmlsZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0aGlzIGlzIGFuIEV4dGVybmFsRmlsZUh5cGVybGluayBzaW5jZSBmaWxlIGRvZXMgbm90Ci0JCQkJCS8vIGV4aXN0IGluIHdvcmtzcGFjZQotCQkJCQlsaW5rID0gbmV3IEV4dGVybmFsRmlsZUh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHN5c3RlbUZpbGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbGluazsKLQl9Ci0KLQlwdWJsaWMgSUh5cGVybGlua1tdIGRldGVjdEh5cGVybGlua3MoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGJvb2xlYW4gY2FuU2hvd011bHRpcGxlSHlwZXJsaW5rcykgewotCQkvLyBmb3Igbm93LCBvbmx5IGNhcGFibGUgb2YgY3JlYXRpbmcgMSBoeXBlcmxpbmsKLQkJTGlzdCBoeXBlcmxpbmtzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlpZiAocmVnaW9uICE9IG51bGwgJiYgdGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQlOb2RlIGN1cnJlbnROb2RlID0gZ2V0Q3VycmVudE5vZGUoZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCVN0cmluZyB1cmlTdHJpbmcgPSBudWxsOwotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJCS8vIGRvY3R5cGUgbm9kZXMKLQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnROb2RlLCBkb2N1bWVudCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJLy8gZWxlbWVudCBub2RlcwotCQkJCQlBdHRyIGN1cnJlbnRBdHRyID0gZ2V0Q3VycmVudEF0dHJOb2RlKGN1cnJlbnROb2RlLCByZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQlpZiAoY3VycmVudEF0dHIgIT0gbnVsbCkgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgbGluayBmb3IgY3VycmVudCBhdHRyaWJ1dGUKLQkJCQkJCS8vIHJlc29sdmUgYXR0cmlidXRlIHZhbHVlCi0JCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudEF0dHIsIGRvY3VtZW50KTsKLQkJCQkJCS8vIHZlcmlmeSB2YWxpZGl0eSBvZiB1cmkgc3RyaW5nCi0JCQkJCQlpZiAodXJpU3RyaW5nID09IG51bGwgfHwgIWlzVmFsaWRVUkkodXJpU3RyaW5nKSkKLQkJCQkJCQkvLyByZXNldCBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJCWN1cnJlbnRBdHRyID0gbnVsbDsKLQkJCQkJfQotCQkJCQlpZiAoY3VycmVudEF0dHIgPT0gbnVsbCkgewotCQkJCQkJLy8gdHJ5IHRvIGZpbmQgYSBsaW5rYWJsZSBhdHRyaWJ1dGUgd2l0aGluIGVsZW1lbnQKLQkJCQkJCWN1cnJlbnRBdHRyID0gZ2V0TGlua2FibGVBdHRyKChFbGVtZW50KSBjdXJyZW50Tm9kZSk7Ci0JCQkJCQlpZiAoY3VycmVudEF0dHIgIT0gbnVsbCkgewotCQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnROb2RlID0gY3VycmVudEF0dHI7Ci0JCQkJfQotCQkJCS8vIHRyeSB0byBjcmVhdGUgaHlwZXJsaW5rIGZyb20gaW5mb3JtYXRpb24gZ2F0aGVyZWQKLQkJCQlpZiAodXJpU3RyaW5nICE9IG51bGwgJiYgY3VycmVudE5vZGUgIT0gbnVsbCAmJiBpc1ZhbGlkVVJJKHVyaVN0cmluZykpIHsKLQkJCQkJSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24gPSBnZXRIeXBlcmxpbmtSZWdpb24oY3VycmVudE5vZGUpOwotCQkJCQlJSHlwZXJsaW5rIGh5cGVybGluayA9IGNyZWF0ZUh5cGVybGluayh1cmlTdHJpbmcsIGh5cGVybGlua1JlZ2lvbiwgZG9jdW1lbnQsIGN1cnJlbnROb2RlKTsKLQkJCQkJaWYgKGh5cGVybGluayAhPSBudWxsKSB7Ci0JCQkJCQloeXBlcmxpbmtzLmFkZChoeXBlcmxpbmspOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChoeXBlcmxpbmtzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSUh5cGVybGlua1tdKSBoeXBlcmxpbmtzLnRvQXJyYXkobmV3IElIeXBlcmxpbmtbMF0pOwotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsIChsb2NhbCBmaWxlIHN5c3RlbSkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRCYXNlTG9jYXRpb24oSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCVN0cmluZyBiYXNlTG9jID0gbnVsbDsKLQotCQkvLyBnZXQgdGhlIGJhc2UgbG9jYXRpb24gZnJvbSB0aGUgY3VycmVudCBtb2RlbAotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlQYXRoIGxvY2F0aW9uID0gbmV3IFBhdGgoc01vZGVsLmdldEJhc2VMb2NhdGlvbigpKTsKLQkJCQlpZiAobG9jYXRpb24udG9GaWxlKCkuZXhpc3RzKCkpIHsKLQkJCQkJYmFzZUxvYyA9IGxvY2F0aW9uLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAobG9jYXRpb24uc2VnbWVudENvdW50KCkgPiAxKQotCQkJCQkJYmFzZUxvYyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShsb2NhdGlvbikuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQkJCQllbHNlCi0JCQkJCQliYXNlTG9jID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRMb2NhdGlvbigpLmFwcGVuZChsb2NhdGlvbikudG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJhc2VMb2M7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBmb3IgYW4gZWxlbWVudAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBDTUVsZW1lbnREZWNsYXJhdGlvbgotCSAqLwotCXByaXZhdGUgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbnVsbDsKLQotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQllZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBlZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgbm9kZSB3aXRoaW4gbm9kZSBhdCBvZmZzZXQKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIEF0dHIKLQkgKi8KLQlwcml2YXRlIEF0dHIgZ2V0Q3VycmVudEF0dHJOb2RlKE5vZGUgbm9kZSwgaW50IG9mZnNldCkgewotCQlpZiAoKG5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSAmJiAoKEluZGV4ZWRSZWdpb24pIG5vZGUpLmNvbnRhaW5zKG9mZnNldCkgJiYgKG5vZGUuaGFzQXR0cmlidXRlcygpKSkgewotCQkJTmFtZWROb2RlTWFwIGF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkvLyBnbyB0aHJvdWdoIGVhY2ggYXR0cmlidXRlIGluIG5vZGUgYW5kIGlmIGF0dHJpYnV0ZSBjb250YWlucwotCQkJLy8gb2Zmc2V0LCByZXR1cm4gdGhhdCBhdHRyaWJ1dGUKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMuZ2V0TGVuZ3RoKCk7ICsraSkgewotCQkJCS8vIGFzc3VtcHRpb24gdGhhdCBpZiBwYXJlbnQgbm9kZSBpcyBvZiB0eXBlIEluZGV4ZWRSZWdpb24sCi0JCQkJLy8gdGhlbiBpdHMgYXR0cmlidXRlcyB3aWxsIGFsc28gYmUgb2YgdHlwZSBJbmRleGVkUmVnaW9uCi0JCQkJSW5kZXhlZFJlZ2lvbiBhdHRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgYXR0cnMuaXRlbShpKTsKLQkJCQlpZiAoYXR0UmVnaW9uLmNvbnRhaW5zKG9mZnNldCkpIHsKLQkJCQkJcmV0dXJuIChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBub2RlIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IG9uIGluIHRoZSBkb2N1bWVudC4gbnVsbCBpZiBubwotCSAqIG5vZGUgaXMgc2VsZWN0ZWQKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBOb2RlIGVpdGhlciBlbGVtZW50LCBkb2N0eXBlLCB0ZXh0LCBvciBudWxsCi0JICovCi0JcHJpdmF0ZSBOb2RlIGdldEN1cnJlbnROb2RlKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQkvLyBnZXQgdGhlIGN1cnJlbnQgbm9kZSBhdCB0aGUgb2Zmc2V0IChyZXR1cm5zIGVpdGhlcjogZWxlbWVudCwKLQkJLy8gZG9jdHlwZSwgdGV4dCkKLQkJSW5kZXhlZFJlZ2lvbiBpbm9kZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQkJaWYgKGlub2RlID09IG51bGwpCi0JCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQotCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gKE5vZGUpIGlub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIGlmIHBvc3NpYmxlLCBudWxsIGlmIGNhbm5vdCBmaW5kCi0JICogZmlsZSBmcm9tIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4gcmV0dXJucyBJRmlsZSBpZiBmaWxlU3RyaW5nIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCWlmIChmaWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKQotCQkJCWlmIChmaWxlc1tpXS5leGlzdHMoKSkKLQkJCQkJZmlsZSA9IGZpbGVzW2ldOwotCQl9Ci0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZyAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHVyaVN0cmluZyBpcyBub3QgaHR0cDovLwotCSAqIEByZXR1cm4gRmlsZSBjcmVhdGVkIGZyb20gdXJpU3RyaW5nIGlmIHBvc3NpYmxlLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgRmlsZSBnZXRGaWxlRnJvbVVyaVN0cmluZyhTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCUZpbGUgZmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBmaXJzdCBqdXN0IHRyeSB0byBjcmVhdGUgYSBmaWxlIGRpcmVjdGx5IGZyb20gdXJpU3RyaW5nIGFzCi0JCQkvLyBkZWZhdWx0IGluIGNhc2UgY3JlYXRlIGZpbGUgZnJvbSB1cmkgZG9lcyBub3Qgd29yawotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaVN0cmluZyk7Ci0KLQkJCS8vIHRyeSB0byBjcmVhdGUgZmlsZSBmcm9tIHVyaQotCQkJVVJJIHVyaSA9IG5ldyBVUkkodXJpU3RyaW5nKTsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmkpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgZXhjZXB0aW9uIGlzIHRocm93biB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIEZpbGUganVzdCBpZ25vcmUKLQkJCS8vIGFuZCBmaWxlIHdpbGwgYmUgbnVsbAotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oTm9kZSBub2RlKSB7Ci0JCUlSZWdpb24gaHlwZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZXMKLQkJCQlJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0JCQkJLy8gZG8gbm90IGluY2x1ZGUgcXVvdGVzIGluIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQlpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dC5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCByZWdMZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzUXVvdGVkKGF0dFZhbHVlKSkgewotCQkJCQkJKytyZWdPZmZzZXQ7Ci0JCQkJCQlyZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotCQkJCQl9Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoeXBlclJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBmaW5kIGFuIGF0dHJpYnV0ZSB3aXRoaW4gZWxlbWVudCB0aGF0IGlzIG9wZW5hYmxlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBBdHRyIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBvcGVuIG9uLCBudWxsIGlmIG5vCi0JICogICAgICAgICBhdHRyaWJ1dGUgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEF0dHIgZ2V0TGlua2FibGVBdHRyKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkvLyBnZXQgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhpcyBub2RlCi0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyArK2kpIHsKLQkJCS8vIGNoZWNrIGlmIHRoaXMgYXR0cmlidXRlIGlzICJvcGVuT24tYWJsZSIKLQkJCUF0dHIgYXR0ID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoaXNMaW5rYWJsZUF0dHIoYXR0LCBlZCkpIHsKLQkJCQlyZXR1cm4gYXR0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIGxvY2F0aW9uIGhpbnQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2VVUkkgaWYgaXQgZXhpc3RzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnROb2RlIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSSAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gbG9jYXRpb24gaGludCAoc3lzdGVtSWQpIGlmIGl0IHdhcyBmb3VuZCwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhdGlvbkhpbnQoRWxlbWVudCBlbGVtZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlBdHRyIHNjaGVtYUxvY05vZGUgPSBlbGVtZW50Tm9kZS5nZXRBdHRyaWJ1dGVOb2RlTlMoWFNJX05BTUVTUEFDRV9VUkksIFNDSEVNQV9MT0NBVElPTik7Ci0JCWlmIChzY2hlbWFMb2NOb2RlICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2NoZW1hTG9jTm9kZS5nZXRWYWx1ZSgpKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJU3RyaW5nIHN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCS8vIGZvdW5kIGxvY2F0aW9uIGhpbnQKLQkJCQlpZiAobmFtZXNwYWNlVVJJLmVxdWFsc0lnbm9yZUNhc2UocHVibGljSWQpKQotCQkJCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBub2RlIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVUklTdHJpbmcoTm9kZSBub2RlLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsKLQkJLy8gbmVlZCB0aGUgYmFzZSBsb2NhdGlvbiwgcHVibGljSWQsIGFuZCBzeXN0ZW1JZCBmb3IgVVJJUmVzb2x2ZXIKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCWJhc2VMb2MgPSBnZXRCYXNlTG9jYXRpb24oZG9jdW1lbnQpOwotCQkJcHVibGljSWQgPSAoKERvY3VtZW50VHlwZSkgbm9kZSkuZ2V0UHVibGljSWQoKTsKLQkJCXN5c3RlbUlkID0gKChEb2N1bWVudFR5cGUpIG5vZGUpLmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlCi0JCQlBdHRyIGF0dHJOb2RlID0gKEF0dHIpIG5vZGU7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyTm9kZS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gYXR0ck5vZGUuZ2V0VmFsdWUoKTsKLQkJCWF0dHJWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwKGF0dHJWYWx1ZSk7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwgJiYgYXR0clZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCWJhc2VMb2MgPSBnZXRCYXNlTG9jYXRpb24oZG9jdW1lbnQpOwotCi0JCQkJLy8gaGFuZGxlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZQotCQkJCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJCQlTdHJpbmcgdW5wcmVmaXhlZE5hbWUgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUoYXR0ck5hbWUpOwotCQkJCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQlwdWJsaWNJZCA9IGF0dHJWYWx1ZTsKLQkJCQkJc3lzdGVtSWQgPSBnZXRMb2NhdGlvbkhpbnQoYXR0ck5vZGUuZ2V0T3duZXJFbGVtZW50KCksIHB1YmxpY0lkKTsKLQkJCQkJaWYgKHN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyTm9kZSkpKSAmJiAoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSB7Ci0JCQkJCS8vIGZvciBub3cganVzdCB1c2UgdGhlIGZpcnN0IHBhaXIKLQkJCQkJLy8gbmVlZCB0byBsb29rIGludG8gYmVpbmcgbW9yZSBwcmVjaXNlCi0JCQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlKTsKLQkJCQkJcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJCXN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQkvLyBlbHNlIGNoZWNrIGlmIHhtbG5zIHB1YmxpY0lkID0gdmFsdWUKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXN5c3RlbUlkID0gYXR0clZhbHVlOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJlc29sdmVkVVJJID0gcmVzb2x2ZVVSSShiYXNlTG9jLCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotCQlyZXR1cm4gcmVzb2x2ZWRVUkk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoaXMgdXJpU3RyaW5nIGlzIGFuIGh0dHAgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gdHJ1ZSBpZiB1cmlTdHJpbmcgaXMgaHR0cCBzdHJpbmcsIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0h0dHAoU3RyaW5nIHVyaVN0cmluZykgewotCQlib29sZWFuIGlzSHR0cCA9IGZhbHNlOwotCQlpZiAodXJpU3RyaW5nICE9IG51bGwpIHsKLQkJCVN0cmluZyB0ZW1wU3RyaW5nID0gdXJpU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcFN0cmluZy5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKQotCQkJCWlzSHR0cCA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIGlzSHR0cDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIHRoZSBnaXZlbiBhdHRyaWJ1dGUgaXMgb3BlbmFibGUuIEF0dHJpYnV0ZSBpcyBvcGVuYWJsZQotCSAqIGlmIGl0IGlzIGEgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGF0dHJpYnV0ZSBvciBpZiB0aGUgYXR0cmlidXRlIHZhbHVlIGlzCi0JICogb2YgdHlwZSBVUkkuCi0JICogCi0JICogQHBhcmFtIGF0dHIKLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHBhcmFtIGNtRWxlbWVudAotCSAqICAgICAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgKGNhbiBiZQotCSAqICAgICAgICAgICAgbnVsbCkKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBhdHRyaWJ1dGUgaXMgIm9wZW5Pbi1hYmxlIiBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNMaW5rYWJsZUF0dHIoQXR0ciBhdHRyLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnQpIHsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHJOYW1lKTsKLQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBpcyBuYW1lc3BhY2UgZGVjbGFyYXRpb24KLQkJaWYgKChYTUxOUy5lcXVhbHMocHJlZml4KSkgfHwgKFhNTE5TLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJLy8gZGV0ZXJtaW5lIGlmIGF0dHJpYnV0ZSBjb250YWlucyBzY2hlbWEgbG9jYXRpb24KLQkJaWYgKChYU0lfTkFNRVNQQUNFX1VSSS5lcXVhbHMoRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShhdHRyKSkpICYmICgoU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpIHx8IChOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OLmVxdWFscyh1bnByZWZpeGVkTmFtZSkpKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgdmFsdWUgaXMgb2YgdHlwZSBVUkkKLQkJaWYgKGNtRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtRWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCWlmICgoYXR0ckRlY2wgIT0gbnVsbCkgJiYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgJiYgKENNRGF0YVR5cGUuVVJJLmVxdWFscyhhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldERhdGFUeXBlTmFtZSgpKSkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHVyaVN0cmluZyBpcyByZWFsbHkgcG9pbnRpbmcgdG8gYSBmaWxlCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkVVJJKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0KLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKQotCQkJaXNWYWxpZCA9IHRydWU7Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlID0gZ2V0RmlsZUZyb21VcmlTdHJpbmcodXJpU3RyaW5nKTsKLQkJCWlmIChmaWxlICE9IG51bGwpCi0JCQkJaXNWYWxpZCA9IGZpbGUuaXNGaWxlKCk7Ci0JCX0KLQkJcmV0dXJuIGlzVmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogUmVzb2x2ZXMgdGhlIGdpdmVuIFVSSSBpbmZvcm1hdGlvbgotCSAqIAotCSAqIEBwYXJhbSBiYXNlTG9jYXRpb24KLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiBAcmV0dXJuIFN0cmluZyByZXNvbHZlZCB1cmkuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcmVzb2x2ZVVSSShTdHJpbmcgYmFzZUxvY2F0aW9uLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCQkvLyBkb250IHJlc29sdmUgaWYgdGhlcmUncyBub3RoaW5nIHRvIHJlc29sdmUKLQkJaWYgKChiYXNlTG9jYXRpb24gPT0gbnVsbCkgJiYgKHB1YmxpY0lkID09IG51bGwpICYmIChzeXN0ZW1JZCA9PSBudWxsKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VMb2NhdGlvbiwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmZlZTAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0hUTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c0hUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLQotLyoqCi0gKiBTZXRzIGRlZmF1bHQgdmFsdWVzIGZvciBIVE1MIFVJIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIjaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURlZmF1bHRQcmVmZXJlbmNlcygpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBzdG9yZSA9IEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFLCB0cnVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChIVE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUsICI8Iik7Ly8kTk9OLU5MUy0xJAotCQkKLQkJLy8gSFRNTCBTdHlsZSBQcmVmZXJlbmNlcwotCQlTdHJpbmcgTk9CQUNLR1JPVU5EQk9MRCA9ICIgfCBudWxsIHwgZmFsc2UiOyAgIC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygxMjcsIDAsIDEyNykgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUsIHN0eWxlVmFsdWUpOwotCQkKLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDQyLCAwLCAyNTUpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUsIHN0eWxlVmFsdWUpOwotCQkKLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7ICAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTLCBzdHlsZVZhbHVlKTsgLy8gc3BlY2lmaWVkIHZhbHVlIGlzIGJsYWNrOyBsZWF2aW5nIGFzIHdpZGdldCBkZWZhdWx0Ci0JCQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNjMsIDk1LCAxOTEpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBzdHlsZVZhbHVlKTsKLQkJCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygwLCAxMjgsIDEyOCkgICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygwLCAwLCAxMjgpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLCBzdHlsZVZhbHVlKTsKLQkJCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygxMjgsIDEyOCwgMTI4KSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNjMsIDEyNywgOTUpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsJLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7CS8vIHNwZWNpZmllZCB2YWx1ZSBpcyBibGFjazsgbGVhdmluZyBhcyB3aWRnZXQgZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygwLCAxMjgsIDEyOCkgICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0JCQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNjMsIDEyNywgMTI3KSAgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0JCQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMTI4LCAxMjgpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0gCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOwkvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQsIHN0eWxlVmFsdWUpOwkvLyBzcGVjaWZpZWQgdmFsdWUgaXMgYmxhY2s7IGxlYXZpbmcgYXMgd2lkZ2V0IGRlZmF1bHQKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMTI4LCAxMjgpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0JCQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMCwgMCkgICsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0JCQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMTkxLCA5NSwgNjMpICArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzSFRNTC5TQ1JJUFRfQVJFQV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCQkKLQkJLy8gc2V0IGRlZmF1bHQgbmV3IGh0bWwgZmlsZSB0ZW1wbGF0ZSB0byB1c2UgaW4gbmV3IGZpbGUgd2l6YXJkCi0JCS8qCi0JCSAqIE5lZWQgdG8gZmluZCB0ZW1wbGF0ZSBuYW1lIHRoYXQgZ29lcyB3aXRoIGRlZmF1bHQgdGVtcGxhdGUgaWQgKG5hbWUKLQkJICogbWF5IGNoYW5nZSBmb3IgZGlmZmVybnQgbGFuZ3VhZ2UpCi0JCSAqLwotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKS5maW5kVGVtcGxhdGVCeUlkKCJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaHRtbCIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKQotCQkJdGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQlzdG9yZS5zZXREZWZhdWx0KEhUTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvSFRNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRmYzk2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9IVE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogUHJlZmVyZW5jZSBrZXlzIGZvciBIVE1MIFVJCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVUlQcmVmZXJlbmNlTmFtZXMgewotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIGlmIGNvZGUgYXNzaXN0IGdldHMgYXV0byBhY3RpdmF0ZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFID0gZ2V0QXV0b1Byb3Bvc2VLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZSI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlCi0JICogYXNzaXN0LgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyCi0JICogYXV0byBjb2RlIGFzc2lzdC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUT19QUk9QT1NFX0NPREUgPSBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBdXRvUHJvcG9zZUNvZGVLZXkoKSB7Ci0JCXJldHVybiAiYXV0b1Byb3Bvc2VDb2RlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIGtleSB0byBzdG9yZSBjdXN0b21pemVkIHRlbXBsYXRlcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFU19LRVkgPSBnZXRUZW1wbGF0ZXNLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZW1wbGF0ZXNLZXkoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jdXN0b21fdGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQkKLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgSFRNTCBmaWxlIHdpemFyZC4KLQkgKiBUZW1wbGF0ZSBuYW1lIGlzIHN0b3JlZCBpbnN0ZWFkIG9mIHRlbXBsYXRlIGlkIGJlY2F1c2UgdXNlci1jcmVhdGVkCi0JICogdGVtcGxhdGVzIGRvIG5vdCBoYXZlIHRlbXBsYXRlIGlkcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FV19GSUxFX1RFTVBMQVRFX05BTUUgPSAibmV3RmlsZVRlbXBsYXRlTmFtZSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxDb2xvclBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxDb2xvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNiNDYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MQ29sb3JQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLkhUTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlN0eWxlZFRleHRDb2xvclBpY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvbG9yUGFnZTsKLQotcHVibGljIGNsYXNzIEhUTUxDb2xvclBhZ2UgZXh0ZW5kcyBYTUxDb2xvclBhZ2UgewotCi0JLyoqCi0JICogU2V0IHVwIGFsbCB0aGUgc3R5bGUgcHJlZmVyZW5jZSBrZXlzIGluIHRoZSBvdmVybGF5IHN0b3JlCi0JICovCi0JcHJvdGVjdGVkIE92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JCUl0ZXJhdG9yIGkgPSBzdHlsZUxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZylpLm5leHQoKSkpOwkKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIEhUTUxVSU1lc3NhZ2VzLlNhbXBsZV9IVE1MX2RvYzsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb250ZXh0U3R5bGVNYXAoRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXApIHsKLQotCQlpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCWluaXREb2NUeXBlQ29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0JCS8vIEZJWE1FOiB0aGVzZSB3ZXJlICJicnV0ZSBmb3JjZWQiIGNvbW1lbnRlZCBvdXQgd2hlbiBtb3ZpbmcgWE1MSlNQUmVnaW9uQ29udGV4dHMKLQkJLy8gZWZmZWN0IGlzIHVua25vd24sIGJ1dCB0aG91Z2h0IGp1c3QgdG8gZWZmZWN0IHByZWZlcmVuY2UgcGFnZQotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0RJUkVDVElWRV9OQU1FLCBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJLy9jb250ZXh0U3R5bGVNYXAucHV0KFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT01NRU5UX1RFWFQsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQkvL2NvbnRleHRTdHlsZU1hcC5wdXQoWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTU1FTlRfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERlc2NyaXB0aW9ucyhEaWN0aW9uYXJ5IGRlc2NyaXB0aW9ucykgewotCi0JCWluaXRDb21tb25EZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQkJaW5pdERvY1R5cGVEZXNjcmlwdGlvbnMoZGVzY3JpcHRpb25zKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0U3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0JCWluaXRDb21tb25TdHlsZUxpc3QobGlzdCk7Ci0JCWluaXREb2NUeXBlU3R5bGVMaXN0KGxpc3QpOwotCQkvLwlsaXN0LmFkZChIVE1MQ29sb3JNYW5hZ2VyLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXR1cFBpY2tlcihTdHlsZWRUZXh0Q29sb3JQaWNrZXIgcGlja2VyKSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlwaWNrZXIuc2V0UGFyc2VyKG1tYW5hZ2VyLmNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpLmdldFBhcnNlcigpKTsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJLy8gbWFwIHJlZ2lvbiB0eXBlcyB0byBoaWxpZ2h0aW5nIHR5cGVzCi0JCURpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0Q29udGV4dFN0eWxlTWFwKGNvbnRleHRTdHlsZU1hcCk7Ci0KLQkJQXJyYXlMaXN0IHN0eWxlTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaW5pdFN0eWxlTGlzdChzdHlsZUxpc3QpOwotCi0JCXBpY2tlci5zZXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJcGlja2VyLnNldERlc2NyaXB0aW9ucyhkZXNjcmlwdGlvbnMpOwotCQlwaWNrZXIuc2V0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJLy8JdXBkYXRlUGlja2VyRm9udChwaWNrZXIpOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYywgSUhlbHBDb250ZXh0SWRzLkhUTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCk7Ci0JCXJldHVybiBjOwotCX0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI2RvR2V0UHJlZmVyZW5jZVN0b3JlKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RDb2xvclBhZ2Ujc2F2ZVByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjUxNTNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9ySFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5nczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTEZpbGVzUHJlZmVyZW5jZVBhZ2U7Ci0KLXB1YmxpYyBjbGFzcyBIVE1MRmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3MgZklucHV0RW5jb2RpbmdTZXR0aW5ncyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNkb0dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZG9HZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgc2Nyb2xsZWRDb21wb3NpdGUgPSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nT3JTYXZpbmdHcm91cChzY3JvbGxlZENvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yQ3JlYXRpbmdHcm91cChzY3JvbGxlZENvbXBvc2l0ZSk7Ci0JCWNyZWF0ZUNvbnRlbnRzRm9yTG9hZGluZ0dyb3VwKHNjcm9sbGVkQ29tcG9zaXRlKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHNjcm9sbGVkQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuSFRNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCi0JCXNldFNpemUoc2Nyb2xsZWRDb21wb3NpdGUpOwotCQlsb2FkUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gc2Nyb2xsZWRDb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JMb2FkaW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBncm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMSk7Ci0JCWdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuSFRNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfMCk7Ci0KLQkJZklucHV0RW5jb2RpbmdTZXR0aW5ncyA9IG5ldyBXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncyhncm91cCk7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50VHlwZSBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlcygpIHsKLQkJc3VwZXIuaW5pdGlhbGl6ZVZhbHVlcygpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yTG9hZGluZ0dyb3VwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUKTsKLQotCQlmSW5wdXRFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZW5jb2RpbmcpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtRGVmYXVsdHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckxvYWRpbmdHcm91cCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJU3RyaW5nIGVuY29kaW5nID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0KLQkJZklucHV0RW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGVuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlcygpIHsKLQkJc3VwZXIuc3RvcmVWYWx1ZXMoKTsKLQkJc3RvcmVWYWx1ZXNGb3JMb2FkaW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckxvYWRpbmdHcm91cCgpIHsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLklOUFVUX0NPREVTRVQsIGZJbnB1dEVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAocGFyZW50KTsKLQkJLy8gR3JvdXAgY3JlYXRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCS8vIGNyZWF0aW5nR3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5DcmVhdGluZ19maWxlcyk7Ci0JCS8vCQkKLQkJLy8gLy8gRW5jb2RpbmcuLgotCQkvLyBMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKGNyZWF0aW5nR3JvdXAsCi0JCS8vIEhUTUxVSU1lc3NhZ2VzLkVuY29kaW5nX2Rlc2MpOwotCQkvLyAoKEdyaWREYXRhKWxhYmVsLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkvLyBmRW5jb2RpbmdTZXR0aW5ncyA9IG5ldyBFbmNvZGluZ1NldHRpbmdzKGNyZWF0aW5nR3JvdXApOwotCQkvLyAoKEdyaWREYXRhKWZFbmNvZGluZ1NldHRpbmdzLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9IVE1MU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDU1NDU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5IVE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFNvdXJjZVByZWZlcmVuY2VQYWdlOwotCi1wdWJsaWMgY2xhc3MgSFRNTFNvdXJjZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgWE1MU291cmNlUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJvdGVjdGVkIEJ1dHRvbiBmVGFnTmFtZUFzSXMgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gZlRhZ05hbWVVcHBlciA9IG51bGw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmVGFnTmFtZUxvd2VyID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZBdHRyTmFtZUFzSXMgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gZkF0dHJOYW1lVXBwZXIgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gZkF0dHJOYW1lTG93ZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRlbnRzRm9yQ29udGVudEFzc2lzdEdyb3VwKHBhcmVudCk7Ci0KLQkJLy8gYWRkIG9uZSBtb3JlIGdyb3VwIG9mIHByZWZlcmVuY2VzCi0JCWNyZWF0ZUNvbnRlbnRzRm9yUHJlZmVycmVkQ2FzZUdyb3VwKHBhcmVudCwgMik7Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb250ZW50c0ZvclByZWZlcnJlZENhc2VHcm91cChDb21wb3NpdGUgcGFyZW50LCBpbnQgY29sdW1uU3BhbikgewotCQlHcm91cCBjYXNlR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIGNvbHVtblNwYW4pOwotCQljYXNlR3JvdXAuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5QcmVmZXJyZWRfbWFya3VwX2Nhc2VfVUlfKTsKLQotCQkvLyBkMjU3MDY0IG5lZWQgdG8gYXNzb2NpYXRlIGdyb3VwIHcvIHJhZGlvIGJ1dHRvbnMgc28gcmFkaW8gYnV0dG9ucyBoZWFkZXIgY2FuIGJlIHJlYWQKLQkJR3JvdXAgdGFnTmFtZUdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJdGFnTmFtZUdyb3VwLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuVGFnX25hbWVzX19VSV8pOwotCQlmVGFnTmFtZVVwcGVyID0gY3JlYXRlUmFkaW9CdXR0b24odGFnTmFtZUdyb3VwLCBIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZXNfVXBwZXJfY2FzZV9VSV8pOwotCQlmVGFnTmFtZUxvd2VyID0gY3JlYXRlUmFkaW9CdXR0b24odGFnTmFtZUdyb3VwLCBIVE1MVUlNZXNzYWdlcy5UYWdfbmFtZXNfTG93ZXJfY2FzZV9VSV8pOwotCi0JCS8vIGQyNTcwNjQgbmVlZCB0byBhc3NvY2lhdGUgZ3JvdXAgdy8gcmFkaW8gYnV0dG9ucyBzbyByYWRpbyBidXR0b25zIGhlYWRlciBjYW4gYmUgcmVhZAotCQlHcm91cCBhdHRyTmFtZUdyb3VwID0gY3JlYXRlR3JvdXAoY2FzZUdyb3VwLCAxKTsKLQkJYXR0ck5hbWVHcm91cC5zZXRUZXh0KEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lc19fVUlfKTsKLQkJZkF0dHJOYW1lVXBwZXIgPSBjcmVhdGVSYWRpb0J1dHRvbihhdHRyTmFtZUdyb3VwLCBIVE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfbmFtZXNfVXBwZXJfY2FzZV9VSV8pOwotCQlmQXR0ck5hbWVMb3dlciA9IGNyZWF0ZVJhZGlvQnV0dG9uKGF0dHJOYW1lR3JvdXAsIEhUTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9uYW1lc19Mb3dlcl9jYXNlX1VJXyk7Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJZlRhZ05hbWVVcHBlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFHX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmVGFnTmFtZUxvd2VyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWZBdHRyTmFtZVVwcGVyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSkgPT0gSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQlmQXR0ck5hbWVMb3dlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRJbnQoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlmVGFnTmFtZVVwcGVyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlRBR19OQU1FX0NBU0UpID09IEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlVQUEVSKTsKLQkJZlRhZ05hbWVMb3dlci5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEludChIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWZBdHRyTmFtZVVwcGVyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWZBdHRyTmFtZUxvd2VyLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0SW50KEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkFUVFJfTkFNRV9DQVNFKSA9PSBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0KLQkJc3VwZXIuaW5pdGlhbGl6ZVZhbHVlcygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlpZiAoZlRhZ05hbWVVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5VUFBFUik7Ci0JCWVsc2UKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUdfTkFNRV9DQVNFLCBIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MT1dFUik7Ci0JCWlmIChmQXR0ck5hbWVVcHBlci5nZXRTZWxlY3Rpb24oKSkKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShIVE1MQ29yZVByZWZlcmVuY2VOYW1lcy5BVFRSX05BTUVfQ0FTRSwgSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuVVBQRVIpOwotCQllbHNlCi0JCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoSFRNTENvcmVQcmVmZXJlbmNlTmFtZXMuQVRUUl9OQU1FX0NBU0UsIEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxPV0VSKTsKLQotCQlzdXBlci5zdG9yZVZhbHVlcygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBzdXBlci5wZXJmb3JtT2soKTsKLQotCQlkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCkgewotCQlIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBVSQotCQlIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGMgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGMsIElIZWxwQ29udGV4dElkcy5IVE1MX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0hUTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5NDZjM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSFRNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIEhUTUwgdGVtcGxhdGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgewotCQotCXB1YmxpYyBIVE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSgpIHsKLQkJSFRNTFVJUGx1Z2luIGh0bWxFZGl0b3JQbHVnaW4gPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpOwotCQkKLQkJc2V0UHJlZmVyZW5jZVN0b3JlKGh0bWxFZGl0b3JQbHVnaW4uZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCQlzZXRUZW1wbGF0ZVN0b3JlKGh0bWxFZGl0b3JQbHVnaW4uZ2V0VGVtcGxhdGVTdG9yZSgpKTsKLQkJc2V0Q29udGV4dFR5cGVSZWdpc3RyeShodG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLSAgCSAgYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotICAJICBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCSAgcmV0dXJuIG9rOwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnRlbXBsYXRlcy5UZW1wbGF0ZVByZWZlcmVuY2VQYWdlI2lzU2hvd0Zvcm1hdHRlclNldHRpbmcoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzU2hvd0Zvcm1hdHRlclNldHRpbmcoKSB7Ci0JCS8vIHRlbXBsYXRlIGZvcm1hdHRpbmcgaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuSFRNTF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEKTsKLQkJcmV0dXJuIGM7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNjcmVhdGVWaWV3ZXIob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBTb3VyY2VWaWV3ZXIgY3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJU291cmNlVmlld2VyIHZpZXdlciA9IG51bGw7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gQ29udGVudFR5cGVJZEZvckhUTUwuQ29udGVudFR5cGVJRF9IVE1MOwotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbkhUTUwoKTsKLQotCQkJcHVibGljIFN0cmluZ1tdIGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQkJfQotCi0JCQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJbXSBnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldExpbmVTdHlsZVByb3ZpZGVycyhzb3VyY2VWaWV3ZXIsIHBhcnRpdGlvblR5cGUpOwotCQkJfQotCQl9OwotCQl2aWV3ZXIgPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXIocGFyZW50LCBudWxsLCBudWxsLCBmYWxzZSwgU1dULkJPUkRFUiB8IFNXVC5WX1NDUk9MTCB8IFNXVC5IX1NDUk9MTCk7Ci0JCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuZ2V0VGV4dFdpZGdldCgpLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc2NyYXRjaE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoY29udGVudFR5cGVJRCk7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHNjcmF0Y2hNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJdmlld2VyLmNvbmZpZ3VyZShzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKTsKLQkJdmlld2VyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJcmV0dXJuIHZpZXdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNzNiYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb250YWlucyBhIHNldCBvZiBwcm9qZWN0aW9uIG1vZGVsIGFkZGl0aW9ucy9kZWxldGlvbnMvbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBOb2RlIGZOb2RlOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZEZWxldGlvbnM7Ci0JcHJpdmF0ZSBNYXAgZkFkZGl0aW9uczsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmTW9kaWZpY2F0aW9uczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYzdhMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkhUTUw0ME5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3RBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0KLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gdmlld2VycyBjdXJyZW50bHkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcHJvamVjdGlvbgotCSAqIG1vZGVsIG5vZGUgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBmUHJvamVjdGlvblZpZXdlcnM7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKE9iamVjdCBhZGFwdGVyS2V5KSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXkpOwotCX0KLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKCkgewotCQl0aGlzKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogQWN0dWFsbHkgY3JlYXRlcyBhbiBhZGFwdGVyIGZvciB0aGUgcGFyZW50IG9mIHRhcmdldCBpZiB0YXJnZXQgaXMgdGhlCi0JICogImFkYXB0LWFibGUiIG5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJaWYgKChpc0FjdGl2ZSgpKSAmJiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgJiYgKChOb2RlKSB0YXJnZXQpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSB0YXJnZXQ7Ci0JCQlpZiAoaXNOb2RlUHJvamVjdGFibGUobm9kZSkpIHsKLQotCQkJCS8vIGFjdHVhbGx5IHdvcmsgd2l0aCB0aGUgcGFyZW50IG5vZGUgdG8gbGlzdGVuIGZvciBhZGQsCi0JCQkJLy8gZGVsZXRlIGV2ZW50cwotCQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJSU5vZGVOb3RpZmllciBwYXJlbnROb3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBwYXJlbnQ7Ci0JCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBwYXJlbnRBZGFwdGVyID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCkgcGFyZW50Tm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQkJCWlmIChwYXJlbnRBZGFwdGVyID09IG51bGwpIHsKLQkJCQkJCS8vIGNyZWF0ZSBhIG5ldyBhZGFwdGVyIGZvciBwYXJlbnQKLQkJCQkJCXBhcmVudEFkYXB0ZXIgPSBuZXcgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKHRoaXMpOwotCQkJCQkJcGFyZW50Tm90aWZpZXIuYWRkQWRhcHRlcihwYXJlbnRBZGFwdGVyKTsKLQkJCQkJfQotCQkJCQkvLyBjYWxsIHVwZGF0ZSBvbiBwYXJlbnQgYmVjYXVzZSBhIG5ldyBub2RlIGhhcyBqdXN0IGJlZW4KLQkJCQkJLy8gYWRkZWQKLQkJCQkJcGFyZW50QWRhcHRlci51cGRhdGVBZGFwdGVyKHBhcmVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIG5vZGUgaXMgYSBub2RlIHR5cGUgYWJsZSB0byBmb2xkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBub2RlIGlzIHByb2plY3RhYmxlLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlib29sZWFuIGlzTm9kZVByb2plY3RhYmxlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlTdHJpbmcgdGFnTmFtZSA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCS8vIG5vZGUgaXMgb25seSBwcm9qZWN0YWJsZSBpZiBpdCBpcyBoZWFkLCBib2R5LCBzY3JpcHQsIHN0eWxlLAotCQkJLy8gdGFibGUsIHVsLCBvbCB0YWdzCi0JCQlpZiAoSFRNTDQwTmFtZXNwYWNlLkVsZW1lbnROYW1lLkhFQUQuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuQk9EWS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpIHx8IEhUTUw0ME5hbWVzcGFjZS5FbGVtZW50TmFtZS5TQ1JJUFQuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuU1RZTEUuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVEFCTEUuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuVUwuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSB8fCBIVE1MNDBOYW1lc3BhY2UuRWxlbWVudE5hbWUuT0wuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBmYWN0b3J5IGlzIGN1cnJlbnRseSBhY3RpdmVseSBtYW5hZ2luZyBwcm9qZWN0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwgJiYgIWZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCXF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgZm9yIGEgc3BlY2lmaWMgcHJvamVjdGlvbiB2aWV3ZXIgaWYKLQkgKiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4gT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZAotCSAqIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGNyZWF0ZSBhIGNoYW5nZSBvYmplY3QgZm9yIGxhdGVzdCBjaGFuZ2UgYW5kIGFkZCB0byBxdWV1ZQotCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UgPSBuZXcgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLmdldCh2aWV3ZXIpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBldmVyeSBwcm9qZWN0aW9udmlld2VyIGFuZCBjYWxsCi0JCS8vIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJCWluZm9zLnJlbW92ZSgpOwotCQkJfQotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB2aWV3ZXIgdG8gbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcyBmYWN0b3J5IGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHZpZXdlcidzIGRvY3VtZW50IGFuZCBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkgKiAgICAgICAgICAgIGFyZSBub3QgbnVsbAotCSAqLwotCXZvaWQgYWRkUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyByZW1vdmUgb2xkIGVudHJ5IGlmIGl0IGV4aXN0cwotCQlyZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0KLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyA9PSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIG5ldyBvYmplY3QgY29udGFpbmluZyBwcm9qZWN0aW9uIHZpZXdlciBhbmQgaXRzIGluZm8KLQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSBuZXcgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKHZpZXdlcik7Ci0JCWZQcm9qZWN0aW9uVmlld2Vycy5wdXQodmlld2VyLCBpbmZvKTsKLQkJaW5mby5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdmlld2VyIGZyb20gdGhlIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMKLQkgKiBmYWN0b3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3Qgb2Ygdmlld2VycwotCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMucmVtb3ZlKHZpZXdlcik7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkvLyBpZiByZW1vdmluZyBsYXN0IHByb2plY3Rpb24gdmlld2VyLCBjbGVhciBvdXQgZXZlcnl0aGluZwotCQkJaWYgKGZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDRmN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250TWV0cmljczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5DYW52YXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIHdpdGggcHJvamVjdGlvbiBhbm5vdGF0aW9ucyBmb3IgdGhpcwotICogYWRhcHRlciBub2RlJ3MgY2hpbGRyZW4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5odG1sLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgY2xhc3MgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXh0ZW5kcyBQcm9qZWN0aW9uQW5ub3RhdGlvbiB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmSXNWaXNpYmxlID0gZmFsc2U7IC8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCXByaXZhdGUgTm9kZSBmTm9kZTsKLQotCQlwdWJsaWMgVGFnUHJvamVjdGlvbkFubm90YXRpb24oTm9kZSBub2RlLCBib29sZWFuIGlzQ29sbGFwc2VkKSB7Ci0JCQlzdXBlcihpc0NvbGxhcHNlZCk7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIGZOb2RlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBEb2VzIG5vdCBwYWludCBoaWRkZW4gYW5ub3RhdGlvbnMuIEFubm90YXRpb25zIGFyZSBoaWRkZW4gd2hlbiB0aGV5Ci0JCSAqIG9ubHkgc3BhbiBvbmUgbGluZS4KLQkJICogCi0JCSAqIEBzZWUgUHJvamVjdGlvbkFubm90YXRpb24jcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIENhbnZhcyBjYW52YXMsIFJlY3RhbmdsZSByZWN0YW5nbGUpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvKgotCQkJICogb25seSBuZWVkIHRvIGNoZWNrIGFubm90YXRpb25zIHRoYXQgYXJlIGV4cGFuZGVkIGJlY2F1c2UgaGlkZGVuCi0JCQkgKiBhbm5vdGF0aW9ucyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGdpdmVuIHRoZSBjaGFuY2UgdG8KLQkJCSAqIGNvbGxhcHNlLgotCQkJICovCi0JCQlpZiAoIWlzQ29sbGFwc2VkKCkpIHsKLQkJCQkvLyB3b3JraW5nIHdpdGggcmVjdGFuZ2xlLCBzbyBsaW5lIGhlaWdodAotCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJCWlmIChtZXRyaWNzICE9IG51bGwpIHsKLQkJCQkJLy8gZG8gbm90IGRyYXcgYW5ub3RhdGlvbnMgdGhhdCBvbmx5IHNwYW4gb25lIGxpbmUgYW5kCi0JCQkJCS8vIG1hcmsgdGhlbSBhcyBub3QgdmlzaWJsZQotCQkJCQlpZiAoKHJlY3RhbmdsZS5oZWlnaHQgLyBtZXRyaWNzLmdldEhlaWdodCgpKSA8PSAxKSB7Ci0JCQkJCQlmSXNWaXNpYmxlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmSXNWaXNpYmxlID0gdHJ1ZTsKLQkJCXN1cGVyLnBhaW50KGdjLCBjYW52YXMsIHJlY3RhbmdsZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb24jbWFya0NvbGxhcHNlZCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtYXJrQ29sbGFwc2VkKCkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8vIGRvIG5vdCBtYXJrIGNvbGxhcHNlZCBpZiBhbm5vdGF0aW9uIGlzIG5vdCB2aXNpYmxlCi0JCQlpZiAoZklzVmlzaWJsZSkKLQkJCQlzdXBlci5tYXJrQ29sbGFwc2VkKCk7Ci0JCX0KLQl9Ci0KLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBsb2NhdGVkIGluOgotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLnByb2plY3Rpb24KLQotCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZkFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwIGZUYWdBbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeSkgewotCQlmQWRhcHRlckZhY3RvcnkgPSBmYWN0b3J5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByb2plY3Rpb24gcG9zaXRpb24gZnJvbSB0aGUgZ2l2ZW4gbm9kZS4gQWJsZSB0byBnZXQKLQkgKiBwcm9qZWN0aW9uIHBvc2l0aW9uIGlmIG5vZGUgaXNOb2RlUHJvamVjdGFibGUuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIG51bGwgaWYgbm8gcHJvamVjdGlvbiBwb3NpdGlvbiBwb3NzaWJsZSwgYSBQb3NpdGlvbiBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFBvc2l0aW9uIGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihOb2RlIG5vZGUpIHsKLQkJUG9zaXRpb24gcG9zID0gbnVsbDsKLQkJaWYgKGZBZGFwdGVyRmFjdG9yeS5pc05vZGVQcm9qZWN0YWJsZShub2RlKSAmJiBub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKHN0YXJ0ID49IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCQkvLyByZWdpb24tYmFzZWQKLQkJCQkvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uCi0JCQkJLy8gaW5jcmVhc2Ugd2hlbiBhZGQgbmV3bGluZQotCQkJCXBvcyA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24KLQkJCQkvLyAvLyBpbmNyZWFzZSB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gSVJlZ2lvbiBzdGFydExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBJUmVnaW9uIGVuZExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnRMaW5lUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBlbmRMaW5lUmVnaW9uLmdldE9mZnNldCgpICsKLQkJCQkvLyBlbmRMaW5lUmVnaW9uLmdldExlbmd0aCgpOwotCQkJCS8vIGlmIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0KLQkJCQkvLyBzdGFydE9mZnNldCk7Ci0JCQkJLy8gfQotCQkJCS8vCi0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIG5vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCByZWdpb24gaW5jcmVhc2UKLQkJCQkvLyAvLyB3aGVuIGFkZCBuZXdsaW5lCi0JCQkJLy8gaW50IHN0YXJ0TGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChzdGFydCk7Ci0JCQkJLy8gaW50IGVuZExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZW5kKTsKLQkJCQkvLyBpZiAoZW5kTGluZSArIDEgPCBkb2N1bWVudC5nZXROdW1iZXJPZkxpbmVzKCkpIHsKLQkJCQkvLyBpbnQgb2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzdGFydExpbmUpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KGVuZExpbmUgKyAxKTsKLQkJCQkvLyBwb3MgPSBuZXcgUG9zaXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQpOwotCQkJCS8vIH0KLQkJCQkvLyB9Ci0JCQkJLy8gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkvLyBMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBudWxsLCB4KTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQkJLy8gfQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qKgotCSAqIEZpbmQgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZm9yIG5vZGUgaW4gdGhlIGN1cnJlbnQgbGlzdCBvZiBwcm9qZWN0aW9uCi0JICogYW5ub3RhdGlvbnMgZm9yIHRoaXMgYWRhcHRlcgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbgotCSAqLwotCXByaXZhdGUgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZ2V0RXhpc3RpbmdBbm5vdGF0aW9uKE5vZGUgbm9kZSkgewotCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhbm5vID0gbnVsbDsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKCFmVGFnQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSkgewotCQkJSXRlcmF0b3IgaXQgPSBmVGFnQW5ub3RhdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkgJiYgYW5ubyA9PSBudWxsKSB7Ci0JCQkJVGFnUHJvamVjdGlvbkFubm90YXRpb24gYSA9IChUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbikgaXQubmV4dCgpOwotCQkJCU5vZGUgbiA9IGEuZ2V0Tm9kZSgpOwotCQkJCWlmIChub2RlLmVxdWFscyhuKSkgewotCQkJCQlhbm5vID0gYTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFubm87Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZSA9PSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3M7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpICYmIChub3RpZmllciBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChOb2RlKSBub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBvZiBhbGwgdGhlIG5vZGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCB1cGRhdGVBZGFwdGVyKE5vZGUgbm9kZSkgewotCQl1cGRhdGVBZGFwdGVyKG5vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlIGFuZCBhZGRzIGFsbCBwcm9qZWN0aW9uIGFubm90YXRpb25zIHRvIHZpZXdlciAoZm9yIG5ld2x5IGFkZGVkCi0JICogdmlld2VycykKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihjaGlsZE5vZGUpOwotCQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleGlzdGluZyA9IGdldEV4aXN0aW5nQW5ub3RhdGlvbihjaGlsZE5vZGUpOwotCQkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkJCQkJYWRkaXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChleGlzdGluZywgbmV3UG9zKTsKLQkJCQkJCS8vIHJlbW92ZSBmcm9tIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGRlbGV0ZQotCQkJCQkJZlRhZ0Fubm90YXRpb25zLnJlbW92ZShleGlzdGluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGluIHRoZSBlbmQsIHdhbnQgdG8gZGVsZXRlIGFueXRoaW5nIGxlZnRvdmVyIGluIG9sZCBsaXN0LCBhZGQKLQkJCS8vIGV2ZXJ5dGhpbmcgaW4gYWRkaXRpb25zLCBhbmQgdXBkYXRlIGV2ZXJ5dGhpbmcgaW4KLQkJCS8vIHByb2plY3Rpb25Bbm5vdGF0aW9ucwotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBvbGRMaXN0ID0gbnVsbDsKLQkJCWlmICghZlRhZ0Fubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW9sZExpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgZlRhZ0Fubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gbW9kaWZ5TGlzdCA9IG51bGw7Ci0JCQlpZiAoIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZnlMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIHByb2plY3Rpb25Bbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0KLQkJCS8vIHNwZWNpZmljYWxseSBhZGQgYWxsIGFubm90YXRpb25zIHRvIHZpZXdlcgotCQkJaWYgKHZpZXdlciAhPSBudWxsICYmICFwcm9qZWN0aW9uQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJZkFkYXB0ZXJGYWN0b3J5LnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBudWxsLCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMsIG51bGwsIHZpZXdlcik7Ci0JCQl9Ci0KLQkJCS8vIG9ubHkgdXBkYXRlIHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHRvIHVwZGF0ZQotCQkJaWYgKChvbGRMaXN0ICE9IG51bGwgJiYgb2xkTGlzdC5sZW5ndGggPiAwKSB8fCAoIWFkZGl0aW9ucy5pc0VtcHR5KCkpIHx8IChtb2RpZnlMaXN0ICE9IG51bGwgJiYgbW9kaWZ5TGlzdC5sZW5ndGggPiAwKSkKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG9sZExpc3QsIGFkZGl0aW9ucywgbW9kaWZ5TGlzdCk7Ci0JCX0KLQotCQkvLyBzYXZlIG5ldyBsaXN0IG9mIGFubm90YXRpb25zCi0JCWZUYWdBbm5vdGF0aW9ucyA9IHByb2plY3Rpb25Bbm5vdGF0aW9uczsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUgIT0gbnVsbCA/IG5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwudXBkYXRlQWRhcHRlciAoIiArIG5vZGVOYW1lICsgIik6IiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzVlZmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGFsc28gbWFuYWdlcyB1cGRhdGluZwotICogdGhlIHZpZXdlcidzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotICovCi1jbGFzcyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb2N1bWVudCB0byBiZSBhd2FyZSBvZiB3aGVuIHRvIHVwZGF0ZSB0aGUgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyByZWdpc3RlciBhIHBvc3Qgbm90aWZpY2F0aW9uIHJlcGxhY2Ugc28gdGhhdCBwcm9qZWN0aW9uCi0JCQkvLyBhbm5vdGF0aW9uIG1vZGVsIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBhbGwgZG9jdW1lbnRDaGFuZ2VkCi0JCQkvLyBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uICYmIGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCQlpZiAoZkluZm8uaGFzQ2hhbmdlc1F1ZXVlZCgpKQotCQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbikgZG9jdW1lbnQpLnJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UodGhpcywgbmV3IFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW5mbykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXNzZW50aWFsbHkgYSBwb3N0IGRvY3VtZW50IGNoYW5nZWQgbGlzdGVuZXIgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYWZ0ZXIKLQkgKiBkb2N1bWVudGNoYW5nZWQgaGFzIGJlZW4gZmlyZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtKElEb2N1bWVudCBkb2N1bWVudCwgSURvY3VtZW50TGlzdGVuZXIgb3duZXIpIHsKLQkJCWZJbmZvLmFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjdXJyZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci0JLyoqCi0JICogRG9jdW1lbnQgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKgotCSAqIExpc3RlbmVyIHRvIGZQcm9qZWN0aW9uVmlld2VyJ3MgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGZEb2N1bWVudExpc3RlbmVyOwotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBkb2N1bWVudCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0RvY3VtZW50Q2hhbmdpbmcgPSBmYWxzZTsKLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24oUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJZkRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsID0gdmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKLQl9Ci0KLQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID09IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCX0KLQotCXZvaWQgc2V0SXNEb2N1bWVudENoYW5naW5nKGJvb2xlYW4gY2hhbmdpbmcpIHsKLQkJZklzRG9jdW1lbnRDaGFuZ2luZyA9IGNoYW5naW5nOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Q2hhbmdpbmcoKSB7Ci0JCXJldHVybiBmSXNEb2N1bWVudENoYW5naW5nOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIHBlbmRpbmcgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdG8gdGhlCi0JICogcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCXZvaWQgYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCkgewotCQlMaXN0IHF1ZXVlZENoYW5nZXMgPSBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpOwotCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcGVuZGluZyBhbm5vdGF0aW9uIGNoYW5nZXMgYW5kIGFwcGx5Ci0JCS8vIHRoZW0gdG8KLQkJLy8gdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCQl3aGlsZSAoIXF1ZXVlZENoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBjaGFuZ2VzID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKSBxdWV1ZWRDaGFuZ2VzLnJlbW92ZSgwKTsKLQkJCXRyeSB7Ci0JCQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwubW9kaWZ5QW5ub3RhdGlvbnMoY2hhbmdlcy5nZXREZWxldGlvbnMoKSwgY2hhbmdlcy5nZXRBZGRpdGlvbnMoKSwgY2hhbmdlcy5nZXRNb2RpZmljYXRpb25zKCkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgbG9nIGl0IGFuZCBjb250aW51ZQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW5ub3RhdGlvbiBjaGFuZ2VzIHF1ZXVlZCB1cCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JYm9vbGVhbiBoYXNDaGFuZ2VzUXVldWVkKCkgewotCQlyZXR1cm4gIWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuaXNFbXB0eSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBxdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMoUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMgbmV3Q2hhbmdlKSB7Ci0JCS8qCi0JCSAqIGZ1dHVyZV9UT0RPOiBtYXliZSBpbXByb3ZlIGJ5IGNoZWNraW5nIGlmIGFubm90YXRpb24gcHJvamVjdGlvbgotCQkgKiBtb2RlbCBjaGFuZ2UgYWxyZWFkeSBleGlzdHMgZm9yIG5vZGUuIGlmIHNvLCB0aHJvdyBvdXQgb2xkIGNoYW5nZS4KLQkJICovCi0JCWdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkuYWRkKG5ld0NoYW5nZSk7Ci0KLQkJLy8gaWYgZG9jdW1lbnQgaXNuJ3QgY2hhbmdpbmcsIGdvIGFoZWFkIGFuZCBhcHBseSBpdAotCQlpZiAoIWlzRG9jdW1lbnRDaGFuZ2luZygpKSB7Ci0JCQlhcHBseUFubm90YXRpb25Nb2RlbENoYW5nZXMoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCS8vIGFkZCBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50TGlzdGVuZXIgPSBuZXcgRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQlnZXREb2N1bWVudCgpLmFkZERvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIHJlbW92ZSBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoZkRvY3VtZW50TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCi0JCS8vIGNsZWFyIG91dCBsaXN0IG9mIHF1ZXVlZCBjaGFuZ2VzIHNpbmNlIGl0IG1heSBubyBsb25nZXIKLQkJLy8gYmUgYWNjdXJhdGUKLQkJaWYgKGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyAhPSBudWxsKSB7Ci0JCQlmUXVldWVkQW5ub3RhdGlvbkNoYW5nZXMuY2xlYXIoKTsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTExN2NjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFVwZGF0ZXMgdGhlIHByb2plY3Rpb24gbW9kZWwgb2YgYSBzdHJ1Y3R1cmVkIG1vZGVsIGZvciBIVE1MLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MIGltcGxlbWVudHMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLCBJUHJvamVjdGlvbkxpc3RlbmVyLCBJVGV4dElucHV0TGlzdGVuZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS9wcm9qZWN0aW9ucGVyZiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBQcm9qZWN0aW9uVmlld2VyIGZWaWV3ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCS8qKgotCSAqIE1heGltdW0gbnVtYmVyIG9mIGNoaWxkIG5vZGVzIHRvIGFkZCBhZGFwdGVycyB0byAobGltaXQgZm9yIHBlcmZvcm1hbmNlCi0JICogc2FrZSkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBNQVhfQ0hJTERSRU4gPSAxMDsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBzaWJsaW5nIG5vZGVzIHRvIGFkZCBhZGFwdGVycyB0byAobGltaXQgZm9yCi0JICogcGVyZm9ybWFuY2Ugc2FrZSkKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBNQVhfU0lCTElOR1MgPSAxMDAwOwotCi0JLyoqCi0JICogQWRkcyBhbiBhZGFwdGVyIHRvIG5vZGUgYW5kIGl0cyBjaGlsZHJlbgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIGNoaWxkTGV2ZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkQWRhcHRlclRvTm9kZUFuZENoaWxkcmVuKE5vZGUgbm9kZSwgaW50IGNoaWxkTGV2ZWwpIHsKLQkJLy8gc3RvcCBhZGRpbmcgaW5pdGlhbCBhZGFwdGVycyBNQVhfQ0hJTERSRU4gbGV2ZWxzIGRlZXAgZm9yCi0JCS8vIHBlcmZvcm1hbmNlIHNha2UKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyICYmIGNoaWxkTGV2ZWwgPCBNQVhfQ0hJTERSRU4pIHsKLQkJCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgbm9kZTsKLQotCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGFkYXB0ZXIgZm9yIHRoZSBjdXJyZW50IG5vZGUgYW5kIHVwZGF0ZSB0aGUKLQkJCS8vIGFkYXB0ZXIgd2l0aCBwcm9qZWN0aW9uIGluZm9ybWF0aW9uCi0JCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwgYWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwpIG5vdGlmaWVyLmdldEV4aXN0aW5nQWRhcHRlcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCWFkYXB0ZXIudXBkYXRlQWRhcHRlcihub2RlLCBmVmlld2VyKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGp1c3QgY2FsbCBnZXRhZGFwdGVyIHNvIHRoZSBhZGFwdGVyIGlzIGNyZWF0ZWQgYW5kCi0JCQkJLy8gYXV0b21hdGljYWxseSBpbml0aWFsaXplZAotCQkJCW5vdGlmaWVyLmdldEFkYXB0ZXJGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJIVE1MLmNsYXNzKTsKLQkJCX0KLQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJTm9kZSBuZXh0Q2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChuZXh0Q2hpbGQgIT0gbnVsbCAmJiBzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpIHsKLQkJCQlOb2RlIGNoaWxkTm9kZSA9IG5leHRDaGlsZDsKLQkJCQluZXh0Q2hpbGQgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCWFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGNoaWxkTGV2ZWwgKyAxKTsKLQkJCQkrK3NpYmxpbmdMZXZlbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBub2RlIGFuZCBhZGRzIGFuIGFkYXB0ZXIgb250byBlYWNoIGZvciB0cmFja2luZwotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlpbnQgc2libGluZ0xldmVsID0gMDsKLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSAoTm9kZSkgc3RhcnROb2RlOwotCQkJCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG51bGwgJiYgc2libGluZ0xldmVsIDwgTUFYX1NJQkxJTkdTKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCWFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihjdXJyZW50Tm9kZSwgMCk7Ci0JCQkJCQkJKytzaWJsaW5nTGV2ZWw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJIVE1MLmFkZEFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCB0byB1c2Ugd2l0aCB0aGlzCi0JICogcHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MCi0JICovCi0JcHJpdmF0ZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MIGdldEFkYXB0ZXJGYWN0b3J5KGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeSA9IG51bGw7Ci0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkgPSBzTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0KLQkJCQkJLy8gZ2V0dGluZyB0aGUgcHJvamVjdGlvbm1vZGVsbm9kZWFkYXB0ZXIgZm9yIHRoZSBmaXJzdAotCQkJCQkvLyB0aW1lCi0JCQkJCS8vIHNvIGRvIHNvbWUgaW5pdGlhbGl6aW5nCi0JCQkJCWlmICghZmFjdG9yeVJlZ2lzdHJ5LmNvbnRhaW5zKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcykgJiYgY3JlYXRlSWZOZWVkZWQpIHsKLQkJCQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgbmV3RmFjdG9yeSA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKCk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIGZhY3RvcnkgcmVnaXN0cnkKLQkJCQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCi0JCQkJCQkvLyBhZGQgZmFjdG9yeSB0byBwcm9wb2dhdGluZyBhZGFwdGVyCi0JCQkJCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBzTW9kZWw7Ci0JCQkJCQlEb2N1bWVudCBkb2N1bWVudCA9IGRvbU1vZGVsLmdldERvY3VtZW50KCk7Ci0JCQkJCQlQcm9wYWdhdGluZ0FkYXB0ZXIgcHJvcGFnYXRpbmdBZGFwdGVyID0gKFByb3BhZ2F0aW5nQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJCQkJaWYgKHByb3BhZ2F0aW5nQWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ld0ZhY3RvcnkpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gdHJ5IGFuZCBnZXQgdGhlIGZhY3RvcnkKLQkJCQkJZmFjdG9yeSA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlIVE1MKSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckhUTUwuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVySFRNTC5nZXRBZGFwdGVyRmFjdG9yeTogIiArIChlbmQgLSBzdGFydCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGZhY3Rvcnk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZSB0aGlzIHByb3ZpZGVyIHdpdGggdGhlIGNvcnJlY3QgZG9jdW1lbnQuIEFzc3VtZXMgcHJvamVjdGlvbgotCSAqIGlzIGVuYWJsZWQuIChvdGhlcndpc2UsIG9ubHkgaW5zdGFsbCB3b3VsZCBoYXZlIGJlZW4gY2FsbGVkKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0JCWlmICghaXNJbnN0YWxsZWQoKSkKLQkJCXJldHVybjsKLQotCQkvLyBjbGVhciBvdXQgb2xkIGluZm8KLQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJZkRvY3VtZW50ID0gZlZpZXdlci5nZXREb2N1bWVudCgpOwotCi0JCS8vIHNldCBwcm9qZWN0aW9uIHZpZXdlciBvbiBuZXcgZG9jdW1lbnQncyBhZGFwdGVyIGZhY3RvcnkKLQkJaWYgKGZWaWV3ZXIuZ2V0UHJvamVjdGlvbkFubm90YXRpb25Nb2RlbCgpICE9IG51bGwpIHsKLQkJCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeUhUTUwgZmFjdG9yeSA9IGdldEFkYXB0ZXJGYWN0b3J5KHRydWUpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkuYWRkUHJvamVjdGlvblZpZXdlcihmVmlld2VyKTsKLQkJCX0KLQotCQkJYWRkQWxsQWRhcHRlcnMoKTsKLQkJfQotCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBBc3NvY2lhdGUgYSBQcm9qZWN0aW9uVmlld2VyIHdpdGggdGhpcyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIHVuaW5zdGFsbCBiZWZvcmUgdHJ5aW5nIHRvIGluc3RhbGwgbmV3IHZpZXdlcgotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJdW5pbnN0YWxsKCk7Ci0JCX0KLQkJZlZpZXdlciA9IHZpZXdlcjsKLQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCWZWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZlZpZXdlciAhPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25EaXNhYmxlZCgpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5SFRNTCBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoZmFsc2UpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5LnJlbW92ZVByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIGFubm90YXRpb25zCi0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKQotCQkJZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkucmVtb3ZlQWxsQW5ub3RhdGlvbnMoKTsKLQotCQlyZW1vdmVBbGxBZGFwdGVycygpOwotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbiBhZGFwdGVyIGZyb20gbm9kZSBhbmQgaXRzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBpbnQgbGV2ZWwpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCByZW1vdmUgaXQKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVySFRNTC5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJbm90aWZpZXIucmVtb3ZlQWRhcHRlcihhZGFwdGVyKTsKLQkJCX0KLQotCQkJTm9kZSBuZXh0Q2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCU5vZGUgY2hpbGROb2RlID0gbmV4dENoaWxkOwotCQkJCW5leHRDaGlsZCA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpOwotCi0JCQkJcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oY2hpbGROb2RlLCBsZXZlbCArIDEpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogR29lcyB0aHJvdWdoIGV2ZXJ5IG5vZGUgYW5kIHJlbW92ZXMgYWRhcHRlciBmcm9tIGVhY2ggZm9yIGNsZWFudXAKLQkgKiBwdXJwb3NlcwotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVBbGxBZGFwdGVycygpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZEb2N1bWVudCk7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWludCBzdGFydE9mZnNldCA9IDA7Ci0JCQkJCUluZGV4ZWRSZWdpb24gc3RhcnROb2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRPZmZzZXQpOwotCQkJCQlpZiAoc3RhcnROb2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQkJTm9kZSBuZXh0U2libGluZyA9IChOb2RlKSBzdGFydE5vZGU7Ci0JCQkJCQl3aGlsZSAobmV4dFNpYmxpbmcgIT0gbnVsbCkgewotCQkJCQkJCU5vZGUgY3VycmVudE5vZGUgPSBuZXh0U2libGluZzsKLQkJCQkJCQluZXh0U2libGluZyA9IGN1cnJlbnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjdXJyZW50Tm9kZSwgMCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkZWJ1Z1Byb2plY3Rpb25QZXJmKSB7Ci0JCQlsb25nIGVuZCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlckhUTUwucmVtb3ZlQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgZm9sZGluZyBpcyBlbmFibGVkIGFuZCBuZXcgZG9jdW1lbnQgaXMgZ29pbmcgdG8gYmUgYSB0b3RhbGx5Ci0JCS8vIGRpZmZlcmVudCBkb2N1bWVudCwgZGlzYWJsZSBwcm9qZWN0aW9uCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCAmJiBmRG9jdW1lbnQgIT0gbmV3SW5wdXQpIHsKLQkJCS8vIGRpc2FibGUgcHJvamVjdGlvbiBhbmQgZGlzY29ubmVjdCBldmVyeXRoaW5nCi0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBpZiBwcm9qZWN0aW9uIHdhcyBwcmV2aW91c2x5IGVuYWJsZWQgYmVmb3JlIGlucHV0IGRvY3VtZW50IGNoYW5nZWQKLQkJLy8gYW5kIG5ldyBkb2N1bWVudCBpcyBkaWZmZXJlbnQgdGhhbiBvbGQgZG9jdW1lbnQKLQkJaWYgKGZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCAmJiBmRG9jdW1lbnQgPT0gbnVsbCAmJiBuZXdJbnB1dCAhPSBudWxsKSB7Ci0JCQlwcm9qZWN0aW9uRW5hYmxlZCgpOwotCQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIGZyb20gcHJvamVjdGlvbiB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0JCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQkJZlZpZXdlci5yZW1vdmVQcm9qZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmVmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThiYjQ5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5yZWdpc3RyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9ySFRNTCBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCi0KLQlwdWJsaWMgdm9pZCBhZGRBZGFwdGVyRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJLy8gdGhlc2UgYXJlIHRoZSBub3JtYWwgZWRpdCBzaWRlIGNvbnRlbnQgYmFzZWQgZmFjdG9yaWVzCi0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCQkvLyBNdXN0IHVwZGF0ZS9hZGQgdG8gcHJvcGFnYXRpbmcgYWRhcHRlciBoZXJlIHRvbwotCQlpZiAoc3RydWN0dXJlZE1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlhZGRQcm9wYWdhdGluZ0FkYXB0ZXJzKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50QmFzZWRGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnlGb3JIVE1MKCk7Ci0JCQlmYWN0b3J5UmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFByb3BhZ2F0aW5nQWRhcHRlcnMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gbm8gcHJvcGFnYXRpbmcgdG8gYWRkCi0JfQotCi0JLyoKLQkgKiBAc2VlIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjaXNGb3IoQ29udGVudFR5cGVEZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZvcihJRG9jdW1lbnRUeXBlSGFuZGxlciBjb250ZW50VHlwZURlc2NyaXB0aW9uKSB7Ci0JCXJldHVybiAoY29udGVudFR5cGVEZXNjcmlwdGlvbiBpbnN0YW5jZW9mIE1vZGVsSGFuZGxlckZvckhUTUwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlaW5pdGlhbGl6ZUZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkvLyBub3RoaW5nIHRvIGRvLCBzaW5jZSBubyBlbWJlZGRlZCB0eXBlCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2MyYzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3NlYXJjaC9IVE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2V0cyB1cCBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBmb3IgaHRtbCBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcnMKLSAqLwotcHVibGljIGNsYXNzIEhUTUxGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIExpc3QgZlByb2Nlc3NvcnM7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRQcm9jZXNzb3JzKCkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkgewotCQkJZlByb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlIVE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcigpOwotCQkJZlByb2Nlc3NvcnMuYWRkKGh0bWxQcm9jZXNzb3IpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc2VhcmNoL0hUTUxGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyYTY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zZWFyY2gvSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLS8qKgotICogQ29uZmlndXJlcyBhIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB3aXRoIEhUTUwgcGFydGl0aW9ucyBhbmQgcmVnaW9ucwotICovCi1wdWJsaWMgY2xhc3MgSFRNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SUhUTUxQYXJ0aXRpb25zLkhUTUxfREVGQVVMVCwgSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFR9OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWdpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC9zdHlsZS9JU3R5bGVDb25zdGFudHNIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjN2M4OGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzSFRNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLCBDb2xvck1hbmFnZXIsIGFuZAotICogYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNIVE1MIGV4dGVuZHMgSVN0eWxlQ29uc3RhbnRzWE1MIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTQ1JJUFRfQVJFQV9CT1JERVIgPSAiU0NSSVBUX0FSRUFfQk9SREVSIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NSSVBUX0FSRUEgPSAiU0NSSVBUX0FSRUEiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyRm9ySFRNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyYjVlN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dEF0dHJpYnV0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLklTdHlsZUNvbnN0YW50c1hNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotCi1wdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MIGV4dGVuZHMgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgaW1wbGVtZW50cyBMaW5lU3R5bGVQcm92aWRlciB7Ci0KLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JIVE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIGEgbWV0aG9kIHRvIGNlbnRyYWxpemUgYWxsIHRoZSAiZm9ybWF0IHJ1bGVzIiBmb3IgcmVnaW9ucyAKLQkgKiBzcGVjaWZpY2FsbHkgYXNzb2NpYXRlZCBmb3IgaG93IHRvICJvcGVuIiB0aGUgcmVnaW9uLgotCSAqLwotCS8vIE5PVEU6IHRoaXMgbWV0aG9kIHdhcyBqdXN0IGNvcGllZCBkb3duIGZvcm0gTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwKLQlwdWJsaWMgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIG5vdCBzdXJlIHdoeSB0aGlzIGlzIGNvbWluZyB0aHJvdWdoIG51bGwsIGJ1dCBqdXN0IHRvIGNhdGNoIGl0Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKWdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JCX0KLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5UKTsKLQkJfQotCQkvLyBmaXJzdCB0cnkgInN0YW5kYXJkIiB0YWcgYXR0cmlidXRlcyBmcm9tIHN1cGVyIGNsYXNzCi0JCXJldHVybiBzdXBlci5nZXRBdHRyaWJ1dGVGb3IocmVnaW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkQ29sb3JzKCkgewotCQlzdXBlci5sb2FkQ29sb3JzKCk7Ci0KLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUik7Ci0JfQotCQotCQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVByb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNIVE1MLlNDUklQVF9BUkVBX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c0hUTUwuU0NSSVBUX0FSRUFfQk9SREVSKTsKLQotCQkJCS8vIHRoaXMgaXMgd2hhdCBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyLnByb3BlcnR5Q2hhbmdlKCkgZG9lcwotCQkJCWdldEhpZ2hsaWdodGVyKCkucmVmcmVzaERpc3BsYXkoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJc3VwZXIuaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCS8qIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciNnZXRDb2xvclByZWZlcmVuY2VzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRDb2xvclByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTljYjAwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogUHJvdmlkZXMgY29udGV4dCBpbmZvcm1hdGlvbiBmb3IgSFRNTCB0YWdzIChTaG93cyB0b29sdGlwIGRlc2NyaXB0aW9uKQotICovCi1wdWJsaWMgY2xhc3MgSFRNTEluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24gewotCi0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUZXh0SG92ZXIgPSBudWxsOwotCi0JcHVibGljIEhUTUxJbmZvcm1hdGlvblByb3ZpZGVyKCkgewotCQlmVGV4dEhvdmVyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXIjZ2V0U3ViamVjdChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldFN1YmplY3QoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbih0ZXh0Vmlld2VyLCBvZmZzZXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgSVJlZ2lvbiBzdWJqZWN0KSB7Ci0JCXJldHVybiAoU3RyaW5nKSBnZXRJbmZvcm1hdGlvbjIodGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uI2dldEluZm9ybWF0aW9uMihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0SW5mb3JtYXRpb24yKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gZlRleHRIb3Zlci5nZXRIb3ZlckluZm8odGV4dFZpZXdlciwgc3ViamVjdCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RhZ2luZm8vSFRNTFRhZ0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZjcxMDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9IVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLlhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcjsKLQotLyoqCi0gKiBQcm92aWRlcyBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gZm9yIEhUTUwgdGFncwotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yIHsKLQkvLwljdXJyZW50bHkgZW1wdHkgYmVjYXVzZSBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IgaGFuZGxlcyBhbGwgY2FzZXMgcmVsZXZhbnQgdG8gSFRNTAotCXB1YmxpYyBIVE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhN2QxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJIVE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci0KLQotcHVibGljIGNsYXNzIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVySFRNTCBleHRlbmRzIFNpbXBsZVRlbXBsYXRlVmFyaWFibGVSZXNvbHZlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HX1RZUEUgPSBnZXRFbmNvZGluZ1R5cGUoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFbmNvZGluZ1R5cGUoKSB7Ci0JCXJldHVybiAiZW5jb2RpbmciOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBlbmNvZGluZyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwoKSB7Ci0JCXN1cGVyKEVOQ09ESU5HX1RZUEUsIEhUTUxVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoVGVtcGxhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIEhUTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3NzVmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZTsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBIVE1MIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBIVE1MIGNvbnRlbnQgdHlwZS4KLSAqLwotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVIVE1MIGV4dGVuZHMgVGVtcGxhdGVDb250ZXh0VHlwZSB7Ci0KLQlwdWJsaWMgVGVtcGxhdGVDb250ZXh0VHlwZUhUTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlckhUTUwoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNIVE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk0YjEzZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzOwotCi0KLXB1YmxpYyBjbGFzcyBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTEwgPSBnZXRBbGwoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURSA9IGdldEF0dHJpYnV0ZSgpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFID0gZ2V0QXR0cmlidXRlVmFsdWUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5FVyA9IGdldE5ldygpOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gZ2V0VGFnKCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QWxsKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2FsbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfYXR0cmlidXRlX3ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXROZXcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfbmV3IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUYWcoKSB7Ci0JCXJldHVybiBnZXRQcmVmaXgoKSArICJfdGFnIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRQcmVmaXgoKSB7Ci0JCXJldHVybiAiaHRtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0hUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0hUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjYmNlNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9IVE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0LkRvY3VtZW50UmVnaW9uRWRnZU1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIEhUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciB7Ci0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGNoYXJbXSBCUkFDS0VUUyA9IHsneycsICd9JywgJygnLCAnKScsICdbJywgJ10nfTsKLQotCS8qKgotCSAqIEBwYXJhbSB2YWxpZENvbnRleHRzCi0JICogQHBhcmFtIG5leHRNYXRjaGVyCi0JICovCi0JcHVibGljIEhUTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKCkgewotCQlzdXBlcihuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVH0sIG5ldyBKYXZhUGFpck1hdGNoZXIoQlJBQ0tFVFMpKTsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9JSmF2YVBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSUphdmFQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDg1NjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9JSmF2YVBhcnRpdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LnVpLnRleHQ7Ci0KLS8qKgotICogRGVmaW5pdGlvbiBvZiBKYXZhIHBhcnRpdGlvbmluZyBhbmQgaXRzIHBhcnRpdGlvbnMuCi0gKiAKLSAqIEBzZWUgRWNsaXBzZSAzLjEKLSAqLwotaW50ZXJmYWNlIElKYXZhUGFydGl0aW9ucyB7Ci0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YSBwYXJ0aXRpb25pbmcuCi0JICovCi0JU3RyaW5nIEpBVkFfUEFSVElUSU9OSU5HID0gIl9fX2phdmFfcGFydGl0aW9uaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIHNpbmdsZS1saW5lIChKTFMyOiBFbmRPZkxpbmVDb21tZW50KSBlbmQgY29tbWVudAotCSAqIHBhcnRpdGlvbiBjb250ZW50IHR5cGUuCi0JICovCi0JU3RyaW5nIEpBVkFfU0lOR0xFX0xJTkVfQ09NTUVOVCA9ICJfX2phdmFfc2luZ2xlbGluZV9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgbXVsdGktbGluZSAoSkxTMjogVHJhZGl0aW9uYWxDb21tZW50KSBjb21tZW50IHBhcnRpdGlvbgotCSAqIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9NVUxUSV9MSU5FX0NPTU1FTlQgPSAiX19qYXZhX211bHRpbGluZV9jb21tZW50IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIEphdmFkb2MgKEpMUzI6IERvY3VtZW50YXRpb25Db21tZW50KSBwYXJ0aXRpb24KLQkgKiBjb250ZW50IHR5cGUuCi0JICovCi0JU3RyaW5nIEpBVkFfRE9DID0gIl9famF2YV9qYXZhZG9jIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGlkZW50aWZpZXIgb2YgdGhlIEphdmEgc3RyaW5nIHBhcnRpdGlvbiBjb250ZW50IHR5cGUuCi0JICovCi0JU3RyaW5nIEpBVkFfU1RSSU5HID0gIl9famF2YV9zdHJpbmciOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgaWRlbnRpZmllciBvZiB0aGUgSmF2YSBjaGFyYWN0ZXIgcGFydGl0aW9uIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlTdHJpbmcgSkFWQV9DSEFSQUNURVIgPSAiX19qYXZhX2NoYXJhY3RlciI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUNvZGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNjYWNlMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L0phdmFDb2RlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LnVpLnRleHQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5kZXJpdmVkLlNpbmdsZUNoYXJSZWFkZXI7Ci0KLS8qKgotICogUmVhZHMgZnJvbSBhIGRvY3VtZW50IGVpdGhlciBmb3J3YXJkcyBvciBiYWNrd2FyZHMuIE1heSBiZSBjb25maWd1cmVkIHRvCi0gKiBza2lwIGNvbW1lbnRzIGFuZCBzdHJpbmdzLgotICovCi1jbGFzcyBKYXZhQ29kZVJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCi0JLyoqIFRoZSBFT0YgY2hhcmFjdGVyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU9GID0gLTE7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZlNraXBDb21tZW50cyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFN0cmluZ3MgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcndhcmQgPSBmYWxzZTsKLQotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0JcHJpdmF0ZSBpbnQgZkVuZCA9IC0xOwotCXByaXZhdGUgaW50IGZDYWNoZWRMaW5lTnVtYmVyID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZkNhY2hlZExpbmVPZmZzZXQgPSAtMTsKLQotCi0JcHVibGljIEphdmFDb2RlUmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbGFzdCByZWFkIGNoYXJhY3Rlci4gU2hvdWxkIG9ubHkgYmUgY2FsbGVkCi0JICogYWZ0ZXIgcmVhZCBoYXMgYmVlbiBjYWxsZWQuCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmRm9yd2FyZCA/IGZPZmZzZXQgLSAxIDogZk9mZnNldDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb25maWd1cmVGb3J3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQotCQlmRm9yd2FyZCA9IHRydWU7Ci0JCWZFbmQgPSBNYXRoLm1pbihmRG9jdW1lbnQuZ2V0TGVuZ3RoKCksIGZPZmZzZXQgKyBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgYm9vbGVhbiBza2lwQ29tbWVudHMsIGJvb2xlYW4gc2tpcFN0cmluZ3MpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQlmU2tpcENvbW1lbnRzID0gc2tpcENvbW1lbnRzOwotCQlmU2tpcFN0cmluZ3MgPSBza2lwU3RyaW5nczsKLQotCQlmRm9yd2FyZCA9IGZhbHNlOwotCQl0cnkgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBmRG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oeC5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFJlYWRlciNjbG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBTaW5nbGVDaGFyUmVhZGVyI3JlYWQoKQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlyZXR1cm4gZkZvcndhcmQgPyByZWFkRm9yd2FyZHMoKSA6IHJlYWRCYWNrd2FyZHMoKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKHguZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvQ29tbWVudEVuZCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICcqJykgewotCQkJCWlmIChmT2Zmc2V0IDwgZkVuZCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJKytmT2Zmc2V0OwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdFbmQoY2hhciBkZWxpbWl0ZXIpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXdoaWxlIChmT2Zmc2V0IDwgZkVuZCkgewotCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCsrKTsKLQkJCWlmIChjdXJyZW50ID09ICdcXCcpIHsKLQkJCQkvLyBpZ25vcmUgZXNjYXBlZCBjaGFyYWN0ZXJzCi0JCQkJKytmT2Zmc2V0OwotCQkJfQotCQkJZWxzZSBpZiAoY3VycmVudCA9PSBkZWxpbWl0ZXIpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZ290b0xpbmVFbmQoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlpbnQgbGluZSA9IGZEb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoZk9mZnNldCk7Ci0JCWZPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lICsgMSk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgcmVhZEZvcndhcmRzKCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKGZPZmZzZXQgPCBmRW5kKSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KyspOwotCi0JCQlzd2l0Y2ggKGN1cnJlbnQpIHsKLQkJCQljYXNlICcvJyA6Ci0KLQkJCQkJaWYgKGZTa2lwQ29tbWVudHMgJiYgZk9mZnNldCA8IGZFbmQpIHsKLQkJCQkJCWNoYXIgbmV4dCA9IGZEb2N1bWVudC5nZXRDaGFyKGZPZmZzZXQpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgY29tbWVudCBlbmQKLQkJCQkJCQkrK2ZPZmZzZXQ7Ci0JCQkJCQkJZ290b0NvbW1lbnRFbmQoKTsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG5leHQgPT0gJy8nKSB7Ci0JCQkJCQkJLy8gJy8vJy1jb21tZW50IHN0YXJ0cywgYWR2YW5jZSB0byB0aGUgbGluZSBlbmQKLQkJCQkJCQlnb3RvTGluZUVuZCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0KLQkJCQljYXNlICciJyA6Ci0JCQkJY2FzZSAnXCcnIDoKLQotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQlnb3RvU3RyaW5nRW5kKGN1cnJlbnQpOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gY3VycmVudDsKLQkJCX0KLQotCQkJcmV0dXJuIGN1cnJlbnQ7Ci0JCX0KLQotCQlyZXR1cm4gRU9GOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCWludCBsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChmT2Zmc2V0KTsKLQkJaWYgKGxpbmUgPCBmQ2FjaGVkTGluZU51bWJlcikgewotCQkJZkNhY2hlZExpbmVOdW1iZXIgPSBsaW5lOwotCQkJZkNhY2hlZExpbmVPZmZzZXQgPSBmRG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lKTsKLQkJCWludCBvZmZzZXQgPSBmT2Zmc2V0OwotCQkJd2hpbGUgKGZDYWNoZWRMaW5lT2Zmc2V0IDwgb2Zmc2V0KSB7Ci0JCQkJY2hhciBjdXJyZW50ID0gZkRvY3VtZW50LmdldENoYXIob2Zmc2V0LS0pOwotCQkJCWlmIChjdXJyZW50ID09ICcvJyAmJiBmQ2FjaGVkTGluZU9mZnNldCA8PSBvZmZzZXQgJiYgZkRvY3VtZW50LmdldENoYXIob2Zmc2V0KSA9PSAnLycpIHsKLQkJCQkJZk9mZnNldCA9IG9mZnNldDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBnb3RvQ29tbWVudFN0YXJ0KCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0LS0pOwotCQkJaWYgKGN1cnJlbnQgPT0gJyonICYmIDAgPD0gZk9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KSA9PSAnLycpCi0JCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGdvdG9TdHJpbmdTdGFydChjaGFyIGRlbGltaXRlcikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJd2hpbGUgKDAgPCBmT2Zmc2V0KSB7Ci0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCWlmIChjdXJyZW50ID09IGRlbGltaXRlcikgewotCQkJCWlmICghKDAgPD0gZk9mZnNldCAmJiBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0IC0gMSkgPT0gJ1xcJykpCi0JCQkJCXJldHVybjsKLQkJCX0KLQkJCS0tZk9mZnNldDsKLQkJfQotCX0KLQotCXByaXZhdGUgaW50IHJlYWRCYWNrd2FyZHMoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCi0JCXdoaWxlICgwIDwgZk9mZnNldCkgewotCQkJLS1mT2Zmc2V0OwotCi0JCQloYW5kbGVTaW5nbGVMaW5lQ29tbWVudCgpOwotCi0JCQljaGFyIGN1cnJlbnQgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQkJCXN3aXRjaCAoY3VycmVudCkgewotCQkJCWNhc2UgJy8nIDoKLQotCQkJCQlpZiAoZlNraXBDb21tZW50cyAmJiBmT2Zmc2V0ID4gMSkgewotCQkJCQkJY2hhciBuZXh0ID0gZkRvY3VtZW50LmdldENoYXIoZk9mZnNldCAtIDEpOwotCQkJCQkJaWYgKG5leHQgPT0gJyonKSB7Ci0JCQkJCQkJLy8gYSBjb21tZW50IGVuZHMsIGFkdmFuY2UgdG8gdGhlIGNvbW1lbnQgc3RhcnQKLQkJCQkJCQlmT2Zmc2V0IC09IDI7Ci0JCQkJCQkJZ290b0NvbW1lbnRTdGFydCgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJcmV0dXJuIGN1cnJlbnQ7Ci0KLQkJCQljYXNlICciJyA6Ci0JCQkJY2FzZSAnXCcnIDoKLQotCQkJCQlpZiAoZlNraXBTdHJpbmdzKSB7Ci0JCQkJCQktLWZPZmZzZXQ7Ci0JCQkJCQlnb3RvU3RyaW5nU3RhcnQoY3VycmVudCk7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBjdXJyZW50OwotCQkJfQotCi0JCQlyZXR1cm4gY3VycmVudDsKLQkJfQotCi0JCXJldHVybiBFT0Y7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhSGV1cmlzdGljU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhSGV1cmlzdGljU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTYwMmEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YUhldXJpc3RpY1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwudGV4dDsKLQotLy8gdGFrZW4gZnJvbSBwYWNrYWdlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUmVnaW9uOwotCi0vKioKLSAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgaGV1cmlzdGljIGJhc2VkIEphdmEgbWFuaXB1bGF0aW9ucyBpbiBhbiBpbmNvbXBsZXRlCi0gKiBKYXZhIHNvdXJjZSBmaWxlLgotICogCi0gKiA8cD4KLSAqIEFuIGluc3RhbmNlIGhvbGRzIHNvbWUgaW50ZXJuYWwgcG9zaXRpb24gaW4gdGhlIGRvY3VtZW50IGFuZCBpcyB0aGVyZWZvcmUKLSAqIG5vdCB0aHJlYWRzYWZlLgotICogPC9wPgotICogCi0gKiBAc2VlIEVjbGlwc2UgMy4wCi0gKi8KLWZpbmFsIGNsYXNzIEphdmFIZXVyaXN0aWNTY2FubmVyIGltcGxlbWVudHMgU3ltYm9scyB7Ci0JLyoqCi0JICogUmV0dXJuZWQgYnkgYWxsIG1ldGhvZHMgd2hlbiB0aGUgcmVxdWVzdGVkIHBvc2l0aW9uIGNvdWxkIG5vdCBiZSBmb3VuZCwKLQkgKiBvciBpZiBhIHtAbGluayBCYWRMb2NhdGlvbkV4Y2VwdGlvbn0gd2FzIHRocm93biB3aGlsZSBzY2FubmluZy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT1RfRk9VTkQgPSAtMTsKLQotCS8qKgotCSAqIFNwZWNpYWwgYm91bmQgcGFyYW1ldGVyIHRoYXQgbWVhbnMgZWl0aGVyIC0xIChiYWNrd2FyZCBzY2FubmluZykgb3IKLQkgKiA8Y29kZT5mRG9jdW1lbnQuZ2V0TGVuZ3RoKCk8L2NvZGU+IChmb3J3YXJkIHNjYW5uaW5nKS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTkJPVU5EID0gLTI7Ci0KLQotCS8qIGNoYXJhY3RlciBjb25zdGFudHMgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExCUkFDRSA9ICd7JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJCUkFDRSA9ICd9JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIExQQVJFTiA9ICcoJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJQQVJFTiA9ICcpJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFNFTUlDT0xPTiA9ICc7JzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIENPTE9OID0gJzonOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgQ09NTUEgPSAnLCc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQlJBQ0tFVCA9ICdbJzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFJCUkFDS0VUID0gJ10nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgUVVFU1RJT05NQVJLID0gJz8nOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgRVFVQUwgPSAnPSc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBMQU5HTEUgPSAnPCc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBSQU5HTEUgPSAnPic7Ci0KLQkvKioKLQkgKiBTcGVjaWZpZXMgdGhlIHN0b3AgY29uZGl0aW9uLCB1cG9uIHdoaWNoIHRoZSA8Y29kZT5zY2FuWFhYPC9jb2RlPgotCSAqIG1ldGhvZHMgd2lsbCBkZWNpZGUgd2hldGhlciB0byBrZWVwIHNjYW5uaW5nIG9yIG5vdC4gVGhpcyBpbnRlcmZhY2UgbWF5Ci0JICogaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdG9wQ29uZGl0aW9uIHsKLQkJLyoqCi0JCSAqIEluc3RydWN0cyB0aGUgc2Nhbm5lciB0byByZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gY2gKLQkJICogICAgICAgICAgICB0aGUgY2hhciBhdCB0aGUgY3VycmVudCBwb3NpdGlvbgotCQkgKiBAcGFyYW0gcG9zaXRpb24KLQkJICogICAgICAgICAgICB0aGUgY3VycmVudCBwb3NpdGlvbgotCQkgKiBAcGFyYW0gZm9yd2FyZAotCQkgKiAgICAgICAgICAgIHRoZSBpdGVyYXRpb24gZGlyZWN0aW9uCi0JCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHN0b3AgY29uZGl0aW9uIGlzIG1ldC4KLQkJICovCi0JCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpOwotCi0JCS8qKgotCQkgKiBBc2tzIHRoZSBjb25kaXRpb24gdG8gcmV0dXJuIHRoZSBuZXh0IHBvc2l0aW9uIHRvIHF1ZXJ5LiBUaGUKLQkJICogZGVmYXVsdCBpcyB0byByZXR1cm4gdGhlIG5leHQvcHJldmlvdXMgcG9zaXRpb24uCi0JCSAqIAotCQkgKiBAcmV0dXJuIHRoZSBuZXh0IHBvc2l0aW9uIHRvIHNjYW4KLQkJICovCi0JCXB1YmxpYyBpbnQgbmV4dFBvc2l0aW9uKGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gZm9yd2FyZCA/IHBvc2l0aW9uICsgMSA6IHBvc2l0aW9uIC0gMTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFN0b3BzIHVwb24gYSBub24td2hpdGVzcGFjZSAoYXMgZGVmaW5lZCBieQotCSAqIHtAbGluayBDaGFyYWN0ZXIjaXNXaGl0ZXNwYWNlKGNoYXIpfSkgY2hhcmFjdGVyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIE5vbldoaXRlc3BhY2UgZXh0ZW5kcyBTdG9wQ29uZGl0aW9uIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB1cG9uIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAc2VlIE5vbldoaXRlc3BhY2UKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGNsYXNzIE5vbldoaXRlc3BhY2VEZWZhdWx0UGFydGl0aW9uIGV4dGVuZHMgTm9uV2hpdGVzcGFjZSB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdG9wKGNoYXIgY2gsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gc3VwZXIuc3RvcChjaCwgcG9zaXRpb24sIHRydWUpICYmIGlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jbmV4dFBvc2l0aW9uKGludCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQkJaWYgKGZQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvbi5nZXRUeXBlKCkpKQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCi0JCQlpZiAoZm9yd2FyZCkgewotCQkJCWludCBlbmQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQotCQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpZiAocG9zaXRpb24gPiBvZmZzZXQpCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB1cG9uIGEgbm9uLWphdmEgaWRlbnRpZmllciAoYXMgZGVmaW5lZCBieQotCSAqIHtAbGluayBDaGFyYWN0ZXIjaXNKYXZhSWRlbnRpZmllclBhcnQoY2hhcil9KSBjaGFyYWN0ZXIuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uSmF2YUlkZW50aWZpZXJQYXJ0IGV4dGVuZHMgU3RvcENvbmRpdGlvbiB7Ci0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzdG9wKGNoYXIgY2gsIGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlyZXR1cm4gIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyUGFydChjaCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB1cG9uIGEgbm9uLWphdmEgaWRlbnRpZmllciBjaGFyYWN0ZXIgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBzZWUgTm9uSmF2YUlkZW50aWZpZXJQYXJ0Ci0JICovCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBOb25KYXZhSWRlbnRpZmllclBhcnREZWZhdWx0UGFydGl0aW9uIGV4dGVuZHMgTm9uSmF2YUlkZW50aWZpZXJQYXJ0IHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI3N0b3AoY2hhcikKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHN0b3AoY2hhciBjaCwgaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCXJldHVybiBzdXBlci5zdG9wKGNoLCBwb3NpdGlvbiwgdHJ1ZSkgfHwgIWlzRGVmYXVsdFBhcnRpdGlvbihwb3NpdGlvbik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkphdmFIZXVyaXN0aWNTY2FubmVyLlN0b3BDb25kaXRpb24jbmV4dFBvc2l0aW9uKGludCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIGludCBuZXh0UG9zaXRpb24oaW50IHBvc2l0aW9uLCBib29sZWFuIGZvcndhcmQpIHsKLQkJCUlUeXBlZFJlZ2lvbiBwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQkJaWYgKGZQYXJ0aXRpb24uZXF1YWxzKHBhcnRpdGlvbi5nZXRUeXBlKCkpKQotCQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCi0JCQlpZiAoZm9yd2FyZCkgewotCQkJCWludCBlbmQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkgKyBwYXJ0aXRpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKHBvc2l0aW9uIDwgZW5kKQotCQkJCQlyZXR1cm4gZW5kOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW50IG9mZnNldCA9IHBhcnRpdGlvbi5nZXRPZmZzZXQoKTsKLQkJCQlpZiAocG9zaXRpb24gPiBvZmZzZXQpCi0JCQkJCXJldHVybiBvZmZzZXQgLSAxOwotCQkJfQotCQkJcmV0dXJuIHN1cGVyLm5leHRQb3NpdGlvbihwb3NpdGlvbiwgZm9yd2FyZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdG9wcyB1cG9uIGEgY2hhcmFjdGVyIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbiB0aGF0IG1hdGNoZXMgdGhlIGdpdmVuCi0JICogY2hhcmFjdGVyIGxpc3QuCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBjbGFzcyBDaGFyYWN0ZXJNYXRjaCBleHRlbmRzIFN0b3BDb25kaXRpb24gewotCQlwcml2YXRlIGZpbmFsIGNoYXJbXSBmQ2hhcnM7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqIAotCQkgKiBAcGFyYW0gY2gKLQkJICogICAgICAgICAgICB0aGUgc2luZ2xlIGNoYXJhY3RlciB0byBtYXRjaAotCQkgKi8KLQkJcHVibGljIENoYXJhY3Rlck1hdGNoKGNoYXIgY2gpIHsKLQkJCXRoaXMobmV3IGNoYXJbXXtjaH0pOwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCi0JCSAqIAotCQkgKiBAcGFyYW0gY2hhcnMKLQkJICogICAgICAgICAgICB0aGUgY2hhcnMgdG8gbWF0Y2guCi0JCSAqLwotCQlwdWJsaWMgQ2hhcmFjdGVyTWF0Y2goY2hhcltdIGNoYXJzKSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGNoYXJzKTsKLQkJCUFzc2VydC5pc1RydWUoY2hhcnMubGVuZ3RoID4gMCk7Ci0JCQlmQ2hhcnMgPSBjaGFyczsKLQkJCUFycmF5cy5zb3J0KGNoYXJzKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuSmF2YUhldXJpc3RpY1NjYW5uZXIuU3RvcENvbmRpdGlvbiNzdG9wKGNoYXIsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gc3RvcChjaGFyIGNoLCBpbnQgcG9zaXRpb24sIGJvb2xlYW4gZm9yd2FyZCkgewotCQkJcmV0dXJuIEFycmF5cy5iaW5hcnlTZWFyY2goZkNoYXJzLCBjaCkgPj0gMCAmJiBpc0RlZmF1bHRQYXJ0aXRpb24ocG9zaXRpb24pOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5KYXZhSGV1cmlzdGljU2Nhbm5lci5TdG9wQ29uZGl0aW9uI25leHRQb3NpdGlvbihpbnQsCi0JCSAqICAgICAgYm9vbGVhbikKLQkJICovCi0JCXB1YmxpYyBpbnQgbmV4dFBvc2l0aW9uKGludCBwb3NpdGlvbiwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCQlJVHlwZWRSZWdpb24gcGFydGl0aW9uID0gZ2V0UGFydGl0aW9uKHBvc2l0aW9uKTsKLQkJCWlmIChmUGFydGl0aW9uLmVxdWFscyhwYXJ0aXRpb24uZ2V0VHlwZSgpKSkKLQkJCQlyZXR1cm4gc3VwZXIubmV4dFBvc2l0aW9uKHBvc2l0aW9uLCBmb3J3YXJkKTsKLQotCQkJaWYgKGZvcndhcmQpIHsKLQkJCQlpbnQgZW5kID0gcGFydGl0aW9uLmdldE9mZnNldCgpICsgcGFydGl0aW9uLmdldExlbmd0aCgpOwotCQkJCWlmIChwb3NpdGlvbiA8IGVuZCkKLQkJCQkJcmV0dXJuIGVuZDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWludCBvZmZzZXQgPSBwYXJ0aXRpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJaWYgKHBvc2l0aW9uID4gb2Zmc2V0KQotCQkJCQlyZXR1cm4gb2Zmc2V0IC0gMTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5uZXh0UG9zaXRpb24ocG9zaXRpb24sIGZvcndhcmQpOwotCQl9Ci0JfQotCi0JLyoqIFRoZSBkb2N1bWVudCBiZWluZyBzY2FubmVkLiAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudDsKLQkvKiogVGhlIHBhcnRpdGlvbmluZyBiZWluZyB1c2VkIGZvciBzY2FubmluZy4gKi8KLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uaW5nOwotCS8qKiBUaGUgcGFydGl0aW9uIHRvIHNjYW4gaW4uICovCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvbjsKLQotCS8qIGludGVybmFsIHNjYW4gc3RhdGUgKi8KLQotCS8qKiB0aGUgbW9zdCByZWNlbnRseSByZWFkIGNoYXJhY3Rlci4gKi8KLQlwcml2YXRlIGNoYXIgZkNoYXI7Ci0JLyoqIHRoZSBtb3N0IHJlY2VudGx5IHJlYWQgcG9zaXRpb24uICovCi0JcHJpdmF0ZSBpbnQgZlBvczsKLQotCS8qIHByZXNldCBzdG9wIGNvbmRpdGlvbnMgKi8KLQlwcml2YXRlIGZpbmFsIFN0b3BDb25kaXRpb24gZk5vbldTRGVmYXVsdFBhcnQgPSBuZXcgTm9uV2hpdGVzcGFjZURlZmF1bHRQYXJ0aXRpb24oKTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdG9wQ29uZGl0aW9uIGZOb25XUyA9IG5ldyBOb25XaGl0ZXNwYWNlKCk7Ci0JcHJpdmF0ZSBmaW5hbCBTdG9wQ29uZGl0aW9uIGZOb25JZGVudCA9IG5ldyBOb25KYXZhSWRlbnRpZmllclBhcnREZWZhdWx0UGFydGl0aW9uKCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRvIHNjYW4KLQkgKiBAcGFyYW0gcGFydGl0aW9uaW5nCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uaW5nIHRvIHVzZSBmb3Igc2Nhbm5pbmcKLQkgKiBAcGFyYW0gcGFydGl0aW9uCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHRvIHNjYW4gaW4KLQkgKi8KLQlwdWJsaWMgSmF2YUhldXJpc3RpY1NjYW5uZXIoSURvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcGFydGl0aW9uaW5nLCBTdHJpbmcgcGFydGl0aW9uKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZG9jdW1lbnQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHBhcnRpdGlvbmluZyk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFydGl0aW9uKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JCWZQYXJ0aXRpb24gPSBwYXJ0aXRpb247Ci0JfQotCi0JLyoqCi0JICogQ2FsbHMKLQkgKiA8Y29kZT50aGlzKGRvY3VtZW50LCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHRvIHNjYW4uCi0JICovCi0JcHVibGljIEphdmFIZXVyaXN0aWNTY2FubmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzKGRvY3VtZW50LCBJSmF2YVBhcnRpdGlvbnMuSkFWQV9QQVJUSVRJT05JTkcsIElEb2N1bWVudC5ERUZBVUxUX0NPTlRFTlRfVFlQRSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgaW50ZXJuYWwgc2NhbiBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBtb3N0IHJlY2VudCBpbnRlcm5hbCBzY2FuIHBvc2l0aW9uLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5leHQgdG9rZW4gaW4gZm9yd2FyZCBkaXJlY3Rpb24sIHN0YXJ0aW5nIGF0Ci0JICogPGNvZGU+c3RhcnQ8L2NvZGU+LCBhbmQgbm90IGV4dGVuZGluZyBmdXJ0aGVyIHRoYW4KLQkgKiA8Y29kZT5ib3VuZDwvY29kZT4uIFRoZSByZXR1cm4gdmFsdWUgaXMgb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZAotCSAqIGluIHtAbGluayBTeW1ib2xzfS4gQWZ0ZXIgYSBjYWxsLCB7QGxpbmsgI2dldFBvc2l0aW9uKCl9IHdpbGwgcmV0dXJuCi0JICogdGhlIHBvc2l0aW9uIGp1c3QgYWZ0ZXIgdGhlIHNjYW5uZWQgdG9rZW4gKGkuZS4gdGhlIG5leHQgcG9zaXRpb24gdGhhdAotCSAqIHdpbGwgYmUgc2Nhbm5lZCkuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIHRoZSBkb2N1bWVudCB0byBjb25zaWRlcgotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIG5vdCB0byBjb25zaWRlciBhbnkgbW9yZQotCSAqIEByZXR1cm4gYSBjb25zdGFudCBmcm9tIHtAbGluayBTeW1ib2xzfSBkZXNjcmliaW5nIHRoZSBuZXh0IHRva2VuCi0JICovCi0JcHVibGljIGludCBuZXh0VG9rZW4oaW50IHN0YXJ0LCBpbnQgYm91bmQpIHsKLQkJaW50IHBvcyA9IHNjYW5Gb3J3YXJkKHN0YXJ0LCBib3VuZCwgZk5vbldTRGVmYXVsdFBhcnQpOwotCQlpZiAocG9zID09IE5PVF9GT1VORCkKLQkJCXJldHVybiBUb2tlbkVPRjsKLQotCQlmUG9zKys7Ci0KLQkJc3dpdGNoIChmQ2hhcikgewotCQkJY2FzZSBMQlJBQ0UgOgotCQkJCXJldHVybiBUb2tlbkxCUkFDRTsKLQkJCWNhc2UgUkJSQUNFIDoKLQkJCQlyZXR1cm4gVG9rZW5SQlJBQ0U7Ci0JCQljYXNlIExCUkFDS0VUIDoKLQkJCQlyZXR1cm4gVG9rZW5MQlJBQ0tFVDsKLQkJCWNhc2UgUkJSQUNLRVQgOgotCQkJCXJldHVybiBUb2tlblJCUkFDS0VUOwotCQkJY2FzZSBMUEFSRU4gOgotCQkJCXJldHVybiBUb2tlbkxQQVJFTjsKLQkJCWNhc2UgUlBBUkVOIDoKLQkJCQlyZXR1cm4gVG9rZW5SUEFSRU47Ci0JCQljYXNlIFNFTUlDT0xPTiA6Ci0JCQkJcmV0dXJuIFRva2VuU0VNSUNPTE9OOwotCQkJY2FzZSBDT01NQSA6Ci0JCQkJcmV0dXJuIFRva2VuQ09NTUE7Ci0JCQljYXNlIFFVRVNUSU9OTUFSSyA6Ci0JCQkJcmV0dXJuIFRva2VuUVVFU1RJT05NQVJLOwotCQkJY2FzZSBFUVVBTCA6Ci0JCQkJcmV0dXJuIFRva2VuRVFVQUw7Ci0JCQljYXNlIExBTkdMRSA6Ci0JCQkJcmV0dXJuIFRva2VuTEVTU1RIQU47Ci0JCQljYXNlIFJBTkdMRSA6Ci0JCQkJcmV0dXJuIFRva2VuR1JFQVRFUlRIQU47Ci0JCX0KLQotCQkvLyBlbHNlCi0JCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoZkNoYXIpKSB7Ci0JCQkvLyBhc3N1bWUgYW4gaWRlbnQgb3Iga2V5d29yZAotCQkJaW50IGZyb20gPSBwb3MsIHRvOwotCQkJcG9zID0gc2NhbkZvcndhcmQocG9zICsgMSwgYm91bmQsIGZOb25JZGVudCk7Ci0JCQlpZiAocG9zID09IE5PVF9GT1VORCkKLQkJCQl0byA9IGJvdW5kID09IFVOQk9VTkQgPyBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgOiBib3VuZDsKLQkJCWVsc2UKLQkJCQl0byA9IHBvczsKLQotCQkJU3RyaW5nIGlkZW50T3JLZXl3b3JkOwotCQkJdHJ5IHsKLQkJCQlpZGVudE9yS2V5d29yZCA9IGZEb2N1bWVudC5nZXQoZnJvbSwgdG8gLSBmcm9tKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIFRva2VuRU9GOwotCQkJfQotCi0JCQlyZXR1cm4gZ2V0VG9rZW4oaWRlbnRPcktleXdvcmQpOwotCi0KLQkJfQotCQllbHNlIHsKLQkJCS8vIG9wZXJhdG9ycywgbnVtYmVyIGxpdGVyYWxzIGV0YwotCQkJcmV0dXJuIFRva2VuT1RIRVI7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IHRva2VuIGluIGJhY2t3YXJkIGRpcmVjdGlvbiwgc3RhcnRpbmcgYXQKLQkgKiA8Y29kZT5zdGFydDwvY29kZT4sIGFuZCBub3QgZXh0ZW5kaW5nIGZ1cnRoZXIgdGhhbgotCSAqIDxjb2RlPmJvdW5kPC9jb2RlPi4gVGhlIHJldHVybiB2YWx1ZSBpcyBvbmUgb2YgdGhlIGNvbnN0YW50cyBkZWZpbmVkCi0JICogaW4ge0BsaW5rIFN5bWJvbHN9LiBBZnRlciBhIGNhbGwsIHtAbGluayAjZ2V0UG9zaXRpb24oKX0gd2lsbCByZXR1cm4KLQkgKiB0aGUgcG9zaXRpb24ganVzdCBiZWZvcmUgdGhlIHNjYW5uZWQgdG9rZW4gc3RhcnRzIChpLmUuIHRoZSBuZXh0Ci0JICogcG9zaXRpb24gdGhhdCB3aWxsIGJlIHNjYW5uZWQpLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiB0aGUgZG9jdW1lbnQgdG8gY29uc2lkZXIKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBub3QgdG8gY29uc2lkZXIgYW55IG1vcmUKLQkgKiBAcmV0dXJuIGEgY29uc3RhbnQgZnJvbSB7QGxpbmsgU3ltYm9sc30gZGVzY3JpYmluZyB0aGUgcHJldmlvdXMgdG9rZW4KLQkgKi8KLQlwdWJsaWMgaW50IHByZXZpb3VzVG9rZW4oaW50IHN0YXJ0LCBpbnQgYm91bmQpIHsKLQkJaW50IHBvcyA9IHNjYW5CYWNrd2FyZChzdGFydCwgYm91bmQsIGZOb25XU0RlZmF1bHRQYXJ0KTsKLQkJaWYgKHBvcyA9PSBOT1RfRk9VTkQpCi0JCQlyZXR1cm4gVG9rZW5FT0Y7Ci0KLQkJZlBvcy0tOwotCi0JCXN3aXRjaCAoZkNoYXIpIHsKLQkJCWNhc2UgTEJSQUNFIDoKLQkJCQlyZXR1cm4gVG9rZW5MQlJBQ0U7Ci0JCQljYXNlIFJCUkFDRSA6Ci0JCQkJcmV0dXJuIFRva2VuUkJSQUNFOwotCQkJY2FzZSBMQlJBQ0tFVCA6Ci0JCQkJcmV0dXJuIFRva2VuTEJSQUNLRVQ7Ci0JCQljYXNlIFJCUkFDS0VUIDoKLQkJCQlyZXR1cm4gVG9rZW5SQlJBQ0tFVDsKLQkJCWNhc2UgTFBBUkVOIDoKLQkJCQlyZXR1cm4gVG9rZW5MUEFSRU47Ci0JCQljYXNlIFJQQVJFTiA6Ci0JCQkJcmV0dXJuIFRva2VuUlBBUkVOOwotCQkJY2FzZSBTRU1JQ09MT04gOgotCQkJCXJldHVybiBUb2tlblNFTUlDT0xPTjsKLQkJCWNhc2UgQ09MT04gOgotCQkJCXJldHVybiBUb2tlbkNPTE9OOwotCQkJY2FzZSBDT01NQSA6Ci0JCQkJcmV0dXJuIFRva2VuQ09NTUE7Ci0JCQljYXNlIFFVRVNUSU9OTUFSSyA6Ci0JCQkJcmV0dXJuIFRva2VuUVVFU1RJT05NQVJLOwotCQkJY2FzZSBFUVVBTCA6Ci0JCQkJcmV0dXJuIFRva2VuRVFVQUw7Ci0JCQljYXNlIExBTkdMRSA6Ci0JCQkJcmV0dXJuIFRva2VuTEVTU1RIQU47Ci0JCQljYXNlIFJBTkdMRSA6Ci0JCQkJcmV0dXJuIFRva2VuR1JFQVRFUlRIQU47Ci0JCX0KLQotCQkvLyBlbHNlCi0JCWlmIChDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoZkNoYXIpKSB7Ci0JCQkvLyBhc3N1bWUgYW4gaWRlbnQgb3Iga2V5d29yZAotCQkJaW50IGZyb20sIHRvID0gcG9zICsgMTsKLQkJCXBvcyA9IHNjYW5CYWNrd2FyZChwb3MgLSAxLCBib3VuZCwgZk5vbklkZW50KTsKLQkJCWlmIChwb3MgPT0gTk9UX0ZPVU5EKQotCQkJCWZyb20gPSBib3VuZCA9PSBVTkJPVU5EID8gMCA6IGJvdW5kICsgMTsKLQkJCWVsc2UKLQkJCQlmcm9tID0gcG9zICsgMTsKLQotCQkJU3RyaW5nIGlkZW50T3JLZXl3b3JkOwotCQkJdHJ5IHsKLQkJCQlpZGVudE9yS2V5d29yZCA9IGZEb2N1bWVudC5nZXQoZnJvbSwgdG8gLSBmcm9tKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJcmV0dXJuIFRva2VuRU9GOwotCQkJfQotCi0JCQlyZXR1cm4gZ2V0VG9rZW4oaWRlbnRPcktleXdvcmQpOwotCi0KLQkJfQotCQllbHNlIHsKLQkJCS8vIG9wZXJhdG9ycywgbnVtYmVyIGxpdGVyYWxzIGV0YwotCQkJcmV0dXJuIFRva2VuT1RIRVI7Ci0JCX0KLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgb25lIG9mIHRoZSBrZXl3b3JkIGNvbnN0YW50cyBvciA8Y29kZT5Ub2tlbklERU5UPC9jb2RlPiBmb3IgYQotCSAqIHNjYW5uZWQgaWRlbnRpZmllci4KLQkgKiAKLQkgKiBAcGFyYW0gcwotCSAqICAgICAgICAgICAgYSBzY2FubmVkIGlkZW50aWZpZXIKLQkgKiBAcmV0dXJuIG9uZSBvZiB0aGUgY29uc3RhbnRzIGRlZmluZWQgaW4ge0BsaW5rIFN5bWJvbHN9Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0VG9rZW4oU3RyaW5nIHMpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChzKTsKLQotCQlzd2l0Y2ggKHMubGVuZ3RoKCkpIHsKLQkJCWNhc2UgMiA6Ci0JCQkJaWYgKCJpZiIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbklGOwotCQkJCWlmICgiZG8iLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5ETzsKLQkJCQlicmVhazsKLQkJCWNhc2UgMyA6Ci0JCQkJaWYgKCJmb3IiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5GT1I7Ci0JCQkJaWYgKCJ0cnkiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5UUlk7Ci0JCQkJaWYgKCJuZXciLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5ORVc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDQgOgotCQkJCWlmICgiY2FzZSIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkNBU0U7Ci0JCQkJaWYgKCJlbHNlIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuRUxTRTsKLQkJCQlpZiAoImVudW0iLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5FTlVNOwotCQkJCWlmICgiZ290byIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkdPVE87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDUgOgotCQkJCWlmICgiYnJlYWsiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5CUkVBSzsKLQkJCQlpZiAoImNhdGNoIi5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuQ0FUQ0g7Ci0JCQkJaWYgKCJjbGFzcyIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkNMQVNTOwotCQkJCWlmICgid2hpbGUiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5XSElMRTsKLQkJCQlicmVhazsKLQkJCWNhc2UgNiA6Ci0JCQkJaWYgKCJyZXR1cm4iLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5SRVRVUk47Ci0JCQkJaWYgKCJzdGF0aWMiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5TVEFUSUM7Ci0JCQkJaWYgKCJzd2l0Y2giLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5TV0lUQ0g7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDcgOgotCQkJCWlmICgiZGVmYXVsdCIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlbkRFRkFVTFQ7Ci0JCQkJaWYgKCJmaW5hbGx5Ii5lcXVhbHMocykpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIFRva2VuRklOQUxMWTsKLQkJCQlicmVhazsKLQkJCWNhc2UgOSA6Ci0JCQkJaWYgKCJpbnRlcmZhY2UiLmVxdWFscyhzKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm4gVG9rZW5JTlRFUkZBQ0U7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIDEyIDoKLQkJCQlpZiAoInN5bmNocm9uaXplZCIuZXF1YWxzKHMpKSAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBUb2tlblNZTkNIUk9OSVpFRDsKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gVG9rZW5JREVOVDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2xvc2luZyBwZWVyIGNoYXJhY3RlciAoZm9yd2FyZCBzZWFyY2gpLgotCSAqIEFueSBzY29wZXMgaW50cm9kdWNlZCBieSBvcGVuaW5nIHBlZXJzIGFyZSBza2lwcGVkLiBBbGwgcGVlcnMgYWNjb3VudGVkCi0JICogZm9yIG11c3QgcmVzaWRlIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiA8cD4KLQkgKiBOb3RlIHRoYXQgPGNvZGU+c3RhcnQ8L2NvZGU+IG11c3Qgbm90IHBvaW50IHRvIHRoZSBvcGVuaW5nIHBlZXIsIGJ1dAotCSAqIHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgYmVpbmcgc2VhcmNoZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JICogQHBhcmFtIG9wZW5pbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAneycpCi0JICogQHBhcmFtIGNsb3NpbmdQZWVyCi0JICogICAgICAgICAgICB0aGUgY2xvc2luZyBwZWVyIGNoYXJhY3RlciAoZS5nLiAnfScpCi0JICogQHJldHVybiB0aGUgbWF0Y2hpbmcgcGVlciBjaGFyYWN0ZXIgcG9zaXRpb24sIG9yIDxjb2RlPk5PVF9GT1VORDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgaW50IGZpbmRDbG9zaW5nUGVlcihpbnQgc3RhcnQsIGZpbmFsIGNoYXIgb3BlbmluZ1BlZXIsIGZpbmFsIGNoYXIgY2xvc2luZ1BlZXIpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmRG9jdW1lbnQpOwotCQlBc3NlcnQuaXNUcnVlKHN0YXJ0ID49IDApOwotCi0JCXRyeSB7Ci0JCQlpbnQgZGVwdGggPSAxOwotCQkJc3RhcnQgLT0gMTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJc3RhcnQgPSBzY2FuRm9yd2FyZChzdGFydCArIDEsIFVOQk9VTkQsIG5ldyBDaGFyYWN0ZXJNYXRjaChuZXcgY2hhcltde29wZW5pbmdQZWVyLCBjbG9zaW5nUGVlcn0pKTsKLQkJCQlpZiAoc3RhcnQgPT0gTk9UX0ZPVU5EKQotCQkJCQlyZXR1cm4gTk9UX0ZPVU5EOwotCi0JCQkJaWYgKGZEb2N1bWVudC5nZXRDaGFyKHN0YXJ0KSA9PSBvcGVuaW5nUGVlcikKLQkJCQkJZGVwdGgrKzsKLQkJCQllbHNlCi0JCQkJCWRlcHRoLS07Ci0KLQkJCQlpZiAoZGVwdGggPT0gMCkKLQkJCQkJcmV0dXJuIHN0YXJ0OwotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBOT1RfRk9VTkQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3BlbmluZyBwZWVyIGNoYXJhY3RlciAoYmFja3dhcmQgc2VhcmNoKS4KLQkgKiBBbnkgc2NvcGVzIGludHJvZHVjZWQgYnkgY2xvc2luZyBwZWVycyBhcmUgc2tpcHBlZC4gQWxsIHBlZXJzIGFjY291bnRlZAotCSAqIGZvciBtdXN0IHJlc2lkZSBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogPHA+Ci0JICogTm90ZSB0aGF0IDxjb2RlPnN0YXJ0PC9jb2RlPiBtdXN0IG5vdCBwb2ludCB0byB0aGUgY2xvc2luZyBwZWVyLCBidXQKLQkgKiB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIGJlaW5nIHNlYXJjaGVkLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHRoZSBzdGFydCBwb3NpdGlvbgotCSAqIEBwYXJhbSBvcGVuaW5nUGVlcgotCSAqICAgICAgICAgICAgdGhlIG9wZW5pbmcgcGVlciBjaGFyYWN0ZXIgKGUuZy4gJ3snKQotCSAqIEBwYXJhbSBjbG9zaW5nUGVlcgotCSAqICAgICAgICAgICAgdGhlIGNsb3NpbmcgcGVlciBjaGFyYWN0ZXIgKGUuZy4gJ30nKQotCSAqIEByZXR1cm4gdGhlIG1hdGNoaW5nIHBlZXIgY2hhcmFjdGVyIHBvc2l0aW9uLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+Ci0JICovCi0JcHVibGljIGludCBmaW5kT3BlbmluZ1BlZXIoaW50IHN0YXJ0LCBjaGFyIG9wZW5pbmdQZWVyLCBjaGFyIGNsb3NpbmdQZWVyKSB7Ci0JCUFzc2VydC5pc1RydWUoc3RhcnQgPCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCi0JCXRyeSB7Ci0JCQlpbnQgZGVwdGggPSAxOwotCQkJc3RhcnQgKz0gMTsKLQkJCXdoaWxlICh0cnVlKSB7Ci0JCQkJc3RhcnQgPSBzY2FuQmFja3dhcmQoc3RhcnQgLSAxLCBVTkJPVU5ELCBuZXcgQ2hhcmFjdGVyTWF0Y2gobmV3IGNoYXJbXXtvcGVuaW5nUGVlciwgY2xvc2luZ1BlZXJ9KSk7Ci0JCQkJaWYgKHN0YXJ0ID09IE5PVF9GT1VORCkKLQkJCQkJcmV0dXJuIE5PVF9GT1VORDsKLQotCQkJCWlmIChmRG9jdW1lbnQuZ2V0Q2hhcihzdGFydCkgPT0gY2xvc2luZ1BlZXIpCi0JCQkJCWRlcHRoKys7Ci0JCQkJZWxzZQotCQkJCQlkZXB0aC0tOwotCi0JCQkJaWYgKGRlcHRoID09IDApCi0JCQkJCXJldHVybiBzdGFydDsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlyZXR1cm4gTk9UX0ZPVU5EOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHN1cnJvdW5kaW5nIGJsb2NrIGFyb3VuZCA8Y29kZT5vZmZzZXQ8L2NvZGU+LiBUaGUKLQkgKiBzZWFyY2ggaXMgc3RhcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIDxjb2RlPm9mZnNldDwvY29kZT4sIGkuZS4gYW4KLQkgKiBvcGVuaW5nIGJyYWNlIGF0IDxjb2RlPm9mZnNldDwvY29kZT4gd2lsbCBub3QgYmUgcGFydCBvZiB0aGUKLQkgKiBzdXJyb3VuZGluZyBibG9jaywgYnV0IGEgY2xvc2luZyBicmFjZSB3aWxsLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZm9yIHdoaWNoIHRoZSBzdXJyb3VuZGluZyBibG9jayBpcyBjb21wdXRlZAotCSAqIEByZXR1cm4gYSByZWdpb24gZGVzY3JpYmluZyB0aGUgc3Vycm91bmRpbmcgYmxvY2ssIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGZpbmRTdXJyb3VuZGluZ0Jsb2NrKGludCBvZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDEgfHwgb2Zmc2V0ID49IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWludCBiZWdpbiA9IGZpbmRPcGVuaW5nUGVlcihvZmZzZXQgLSAxLCBMQlJBQ0UsIFJCUkFDRSk7Ci0JCWludCBlbmQgPSBmaW5kQ2xvc2luZ1BlZXIob2Zmc2V0LCBMQlJBQ0UsIFJCUkFDRSk7Ci0JCWlmIChiZWdpbiA9PSBOT1RfRk9VTkQgfHwgZW5kID09IE5PVF9GT1VORCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gbmV3IFJlZ2lvbihiZWdpbiwgZW5kICsgMSAtIGJlZ2luKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgc21hbGxlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5DaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZEb2N1bWVudC5nZXRDaGFyKHBvcykpPC9jb2RlPgotCSAqIGV2YWx1YXRlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdAotCSAqIHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmd0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIHNtYWxsZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIFs8Y29kZT5wb3NpdGlvbjwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5ib3VuZDwvY29kZT4pIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgZmluZE5vbldoaXRlc3BhY2VGb3J3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIGZOb25XU0RlZmF1bHRQYXJ0KTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgc21hbGxlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5DaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZEb2N1bWVudC5nZXRDaGFyKHBvcykpPC9jb2RlPgotCSAqIGV2YWx1YXRlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBwb3NpdGlvbiBvZiBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBpbiBbPGNvZGU+cG9zaXRpb248L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+Ym91bmQ8L2NvZGU+KSwgb3IgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbgotCSAqICAgICAgICAgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IGZpbmROb25XaGl0ZXNwYWNlRm9yd2FyZEluQW55UGFydGl0aW9uKGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7Ci0JCXJldHVybiBzY2FuRm9yd2FyZChwb3NpdGlvbiwgYm91bmQsIGZOb25XUyk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGhpZ2hlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmx0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmZ3Q7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5DaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZEb2N1bWVudC5nZXRDaGFyKHBvcykpPC9jb2RlPgotCSAqIGV2YWx1YXRlcyB0byA8Y29kZT5mYWxzZTwvY29kZT4gYW5kIHRoZSBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdAotCSAqIHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEByZXR1cm4gdGhlIGhpZ2hlc3QgcG9zaXRpb24gb2YgYSBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgaW4gKDxjb2RlPmJvdW5kPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPl0gdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBmaW5kTm9uV2hpdGVzcGFjZUJhY2t3YXJkKGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7Ci0JCXJldHVybiBzY2FuQmFja3dhcmQocG9zaXRpb24sIGJvdW5kLCBmTm9uV1NEZWZhdWx0UGFydCk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGxvd2VzdCBwb3NpdGlvbiA8Y29kZT5wPC9jb2RlPiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+Ci0JICogc3VjaCB0aGF0IDxjb2RlPnN0YXJ0PC9jb2RlPiAmbHQ7PSBwICZsdDsgPGNvZGU+Ym91bmQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmNvbmRpdGlvbi5zdG9wKGZEb2N1bWVudC5nZXRDaGFyKHApLCBwKTwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZndDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+U3RvcENvbmRpdGlvbjwvY29kZT4gdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBsb3dlc3QgcG9zaXRpb24gaW4gWzxjb2RlPnN0YXJ0PC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmJvdW5kPC9jb2RlPikgZm9yIHdoaWNoIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4KLQkgKiAgICAgICAgIGhvbGRzLCBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuRm9yd2FyZChpbnQgc3RhcnQsIGludCBib3VuZCwgU3RvcENvbmRpdGlvbiBjb25kaXRpb24pIHsKLQkJQXNzZXJ0LmlzVHJ1ZShzdGFydCA+PSAwKTsKLQotCQlpZiAoYm91bmQgPT0gVU5CT1VORCkKLQkJCWJvdW5kID0gZkRvY3VtZW50LmdldExlbmd0aCgpOwotCi0JCUFzc2VydC5pc1RydWUoYm91bmQgPD0gZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJZlBvcyA9IHN0YXJ0OwotCQkJd2hpbGUgKGZQb3MgPCBib3VuZCkgewotCi0JCQkJZkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihmUG9zKTsKLQkJCQlpZiAoY29uZGl0aW9uLnN0b3AoZkNoYXIsIGZQb3MsIHRydWUpKQotCQkJCQlyZXR1cm4gZlBvczsKLQotCQkJCWZQb3MgPSBjb25kaXRpb24ubmV4dFBvc2l0aW9uKGZQb3MsIHRydWUpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIE5PVF9GT1VORDsKLQl9Ci0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSBsb3dlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmd0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmbHQ7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5mRG9jdW1lbnQuZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2g8L2NvZGU+IGV2YWx1YXRlcyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGFuZCB0aGUgcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmZ3Q7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHBhcmFtIGNoCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+Y2hhcjwvY29kZT4gdG8gc2VhcmNoIGZvcgotCSAqIEByZXR1cm4gdGhlIGxvd2VzdCBwb3NpdGlvbiBvZiA8Y29kZT5jaDwvY29kZT4gaW4gKDxjb2RlPmJvdW5kPC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPl0gdGhhdCByZXNpZGVzIGluIGEgSmF2YSBwYXJ0aXRpb24sIG9yCi0JICogICAgICAgICA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuRm9yd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhciBjaCkgewotCQlyZXR1cm4gc2NhbkZvcndhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2gpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgbG93ZXN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gc3VjaCB0aGF0IHRoZQotCSAqIHBvc2l0aW9uIGlzICZndDs9IDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBhbmQgJmx0OyA8Y29kZT5ib3VuZDwvY29kZT4KLQkgKiBhbmQgPGNvZGU+ZkRvY3VtZW50LmdldENoYXIocG9zaXRpb24pID09IGNoPC9jb2RlPiBldmFsdWF0ZXMgdG8KLQkgKiA8Y29kZT50cnVlPC9jb2RlPiBmb3IgYXQgbGVhc3Qgb25lIGNoIGluIDxjb2RlPmNoYXJzPC9jb2RlPiBhbmQgdGhlCi0JICogcG9zaXRpb24gaXMgaW4gdGhlIGRlZmF1bHQgcGFydGl0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvCi0JICogICAgICAgICAgICBiZSBjb25zaWRlcmVkCi0JICogQHBhcmFtIGJvdW5kCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0byBub3QKLQkgKiAgICAgICAgICAgIGNvbnNpZGVyIGFueSBtb3JlLCB3aXRoIDxjb2RlPmJvdW5kPC9jb2RlPiAmZ3Q7Ci0JICogICAgICAgICAgICA8Y29kZT5wb3NpdGlvbjwvY29kZT4sIG9yIDxjb2RlPlVOQk9VTkQ8L2NvZGU+Ci0JICogQHBhcmFtIGNoYXJzCi0JICogICAgICAgICAgICBhbiBhcnJheSBvZiA8Y29kZT5jaGFyPC9jb2RlPiB0byBzZWFyY2ggZm9yCi0JICogQHJldHVybiB0aGUgbG93ZXN0IHBvc2l0aW9uIG9mIGEgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIGluIFs8Y29kZT5wb3NpdGlvbjwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5ib3VuZDwvY29kZT4pIHRoYXQgcmVzaWRlcyBpbiBhIEphdmEgcGFydGl0aW9uLCBvcgotCSAqICAgICAgICAgPGNvZGU+Tk9UX0ZPVU5EPC9jb2RlPiBpZiBub25lIGNhbiBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBpbnQgc2NhbkZvcndhcmQoaW50IHBvc2l0aW9uLCBpbnQgYm91bmQsIGNoYXJbXSBjaGFycykgewotCQlyZXR1cm4gc2NhbkZvcndhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2hhcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiA8Y29kZT5wPC9jb2RlPiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+Ci0JICogc3VjaCB0aGF0IDxjb2RlPmJvdW5kPC9jb2RlPiAmbHQ7IDxjb2RlPnA8L2NvZGU+ICZsdDs9Ci0JICogPGNvZGU+c3RhcnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmNvbmRpdGlvbi5zdG9wKGZEb2N1bWVudC5nZXRDaGFyKHApLCBwKTwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnN0YXJ0PC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY29uZGl0aW9uCi0JICogICAgICAgICAgICB0aGUgPGNvZGU+U3RvcENvbmRpdGlvbjwvY29kZT4gdG8gY2hlY2sKLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIGluICg8Y29kZT5ib3VuZDwvY29kZT4sCi0JICogICAgICAgICA8Y29kZT5zdGFydDwvY29kZT4gZm9yIHdoaWNoIDxjb2RlPmNvbmRpdGlvbjwvY29kZT4gaG9sZHMsCi0JICogICAgICAgICBvciA8Y29kZT5OT1RfRk9VTkQ8L2NvZGU+IGlmIG5vbmUgY2FuIGJlIGZvdW5kCi0JICovCi0JcHVibGljIGludCBzY2FuQmFja3dhcmQoaW50IHN0YXJ0LCBpbnQgYm91bmQsIFN0b3BDb25kaXRpb24gY29uZGl0aW9uKSB7Ci0JCWlmIChib3VuZCA9PSBVTkJPVU5EKQotCQkJYm91bmQgPSAtMTsKLQotCQlBc3NlcnQuaXNUcnVlKGJvdW5kID49IC0xKTsKLQkJQXNzZXJ0LmlzVHJ1ZShzdGFydCA8IGZEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0KLQkJdHJ5IHsKLQkJCWZQb3MgPSBzdGFydDsKLQkJCXdoaWxlIChmUG9zID4gYm91bmQpIHsKLQotCQkJCWZDaGFyID0gZkRvY3VtZW50LmdldENoYXIoZlBvcyk7Ci0JCQkJaWYgKGNvbmRpdGlvbi5zdG9wKGZDaGFyLCBmUG9zLCBmYWxzZSkpCi0JCQkJCXJldHVybiBmUG9zOwotCi0JCQkJZlBvcyA9IGNvbmRpdGlvbi5uZXh0UG9zaXRpb24oZlBvcywgZmFsc2UpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIE5PVF9GT1VORDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgaGlnaGVzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHN1Y2ggdGhhdCB0aGUKLQkgKiBwb3NpdGlvbiBpcyAmbHQ7PSA8Y29kZT5wb3NpdGlvbjwvY29kZT4gYW5kICZndDsgPGNvZGU+Ym91bmQ8L2NvZGU+Ci0JICogYW5kIDxjb2RlPmZEb2N1bWVudC5nZXRDaGFyKHBvc2l0aW9uKSA9PSBjaDwvY29kZT4gZXZhbHVhdGVzIHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gZm9yIGF0IGxlYXN0IG9uZSBjaCBpbiA8Y29kZT5jaGFyczwvY29kZT4gYW5kIHRoZQotCSAqIHBvc2l0aW9uIGlzIGluIHRoZSBkZWZhdWx0IHBhcnRpdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiB0bwotCSAqICAgICAgICAgICAgYmUgY29uc2lkZXJlZAotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8gbm90Ci0JICogICAgICAgICAgICBjb25zaWRlciBhbnkgbW9yZSwgd2l0aCA8Y29kZT5ib3VuZDwvY29kZT4gJmx0OwotCSAqICAgICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+LCBvciA8Y29kZT5VTkJPVU5EPC9jb2RlPgotCSAqIEBwYXJhbSBjaAotCSAqICAgICAgICAgICAgdGhlIDxjb2RlPmNoYXI8L2NvZGU+IHRvIHNlYXJjaCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIG9mIG9uZSBlbGVtZW50IGluIDxjb2RlPmNoYXJzPC9jb2RlPiBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5CYWNrd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhciBjaCkgewotCQlyZXR1cm4gc2NhbkJhY2t3YXJkKHBvc2l0aW9uLCBib3VuZCwgbmV3IENoYXJhY3Rlck1hdGNoKGNoKSk7Ci0JfQotCi0JLyoqCi0JICogRmluZHMgdGhlIGhpZ2hlc3QgcG9zaXRpb24gaW4gPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiBzdWNoIHRoYXQgdGhlCi0JICogcG9zaXRpb24gaXMgJmx0Oz0gPGNvZGU+cG9zaXRpb248L2NvZGU+IGFuZCAmZ3Q7IDxjb2RlPmJvdW5kPC9jb2RlPgotCSAqIGFuZCA8Y29kZT5mRG9jdW1lbnQuZ2V0Q2hhcihwb3NpdGlvbikgPT0gY2g8L2NvZGU+IGV2YWx1YXRlcyB0bwotCSAqIDxjb2RlPnRydWU8L2NvZGU+IGZvciBhdCBsZWFzdCBvbmUgY2ggaW4gPGNvZGU+Y2hhcnM8L2NvZGU+IGFuZCB0aGUKLQkgKiBwb3NpdGlvbiBpcyBpbiB0aGUgZGVmYXVsdCBwYXJ0aXRpb24uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGluIDxjb2RlPmZEb2N1bWVudDwvY29kZT4gdG8KLQkgKiAgICAgICAgICAgIGJlIGNvbnNpZGVyZWQKLQkgKiBAcGFyYW0gYm91bmQKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiA8Y29kZT5mRG9jdW1lbnQ8L2NvZGU+IHRvIG5vdAotCSAqICAgICAgICAgICAgY29uc2lkZXIgYW55IG1vcmUsIHdpdGggPGNvZGU+Ym91bmQ8L2NvZGU+ICZsdDsKLQkgKiAgICAgICAgICAgIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiwgb3IgPGNvZGU+VU5CT1VORDwvY29kZT4KLQkgKiBAcGFyYW0gY2hhcnMKLQkgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIDxjb2RlPmNoYXI8L2NvZGU+IHRvIHNlYXJjaCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHBvc2l0aW9uIG9mIG9uZSBlbGVtZW50IGluIDxjb2RlPmNoYXJzPC9jb2RlPiBpbiAoPGNvZGU+Ym91bmQ8L2NvZGU+LAotCSAqICAgICAgICAgPGNvZGU+cG9zaXRpb248L2NvZGU+XSB0aGF0IHJlc2lkZXMgaW4gYSBKYXZhIHBhcnRpdGlvbiwgb3IKLQkgKiAgICAgICAgIDxjb2RlPk5PVF9GT1VORDwvY29kZT4gaWYgbm9uZSBjYW4gYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgaW50IHNjYW5CYWNrd2FyZChpbnQgcG9zaXRpb24sIGludCBib3VuZCwgY2hhcltdIGNoYXJzKSB7Ci0JCXJldHVybiBzY2FuQmFja3dhcmQocG9zaXRpb24sIGJvdW5kLCBuZXcgQ2hhcmFjdGVyTWF0Y2goY2hhcnMpKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3Mgd2hldGhlciA8Y29kZT5wb3NpdGlvbjwvY29kZT4gcmVzaWRlcyBpbiBhIGRlZmF1bHQgKEphdmEpCi0JICogcGFydGl0aW9uIG9mIDxjb2RlPmZEb2N1bWVudDwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgcG9zaXRpb24gdG8gYmUgY2hlY2tlZAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgPGNvZGU+cG9zaXRpb248L2NvZGU+IGlzIGluIHRoZQotCSAqICAgICAgICAgZGVmYXVsdCBwYXJ0aXRpb24gb2YgPGNvZGU+ZkRvY3VtZW50PC9jb2RlPiwKLQkgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRQYXJ0aXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPj0gMCk7Ci0JCUFzc2VydC5pc1RydWUocG9zaXRpb24gPD0gZkRvY3VtZW50LmdldExlbmd0aCgpKTsKLQotCQl0cnkgewotCQkJcmV0dXJuIGZQYXJ0aXRpb24uZXF1YWxzKFRleHRVdGlsaXRpZXMuZ2V0Q29udGVudFR5cGUoZkRvY3VtZW50LCBmUGFydGl0aW9uaW5nLCBwb3NpdGlvbiwgZmFsc2UpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uIGF0IDxjb2RlPnBvc2l0aW9uPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zaXRpb24KLQkgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB0byBnZXQgdGhlIHBhcnRpdGlvbiBmb3IKLQkgKiBAcmV0dXJuIHRoZSBwYXJ0aXRpb24gYXQgPGNvZGU+cG9zaXRpb248L2NvZGU+IG9yIGEgZHVtbXkgemVyby1sZW5ndGgKLQkgKiAgICAgICAgIHBhcnRpdGlvbiBpZiBhY2Nlc3NpbmcgdGhlIGRvY3VtZW50IGZhaWxzCi0JICovCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKGludCBwb3NpdGlvbikgewotCQlBc3NlcnQuaXNUcnVlKHBvc2l0aW9uID49IDApOwotCQlBc3NlcnQuaXNUcnVlKHBvc2l0aW9uIDw9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSk7Ci0KLQkJdHJ5IHsKLQkJCXJldHVybiBUZXh0VXRpbGl0aWVzLmdldFBhcnRpdGlvbihmRG9jdW1lbnQsIGZQYXJ0aXRpb25pbmcsIHBvc2l0aW9uLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBuZXcgVHlwZWRSZWdpb24ocG9zaXRpb24sIDAsICJfX25vX3BhcnRpdGlvbl9hdF9hbGwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGxpbmUgc2VlbXMgdG8gYmUgYW4gb3BlbiBjb25kaXRpb24gbm90IGZvbGxvd2VkIGJ5IGEKLQkgKiBibG9jayAoaS5lLiBhbiBpZiwgd2hpbGUsIG9yIGZvciBzdGF0ZW1lbnQgd2l0aCBqdXN0IG9uZSBmb2xsb3dpbmcKLQkgKiBzdGF0ZW1lbnQsIHNlZSBleGFtcGxlIGJlbG93KS4KLQkgKiAKLQkgKiA8cHJlPgotCSAqIGlmIChjb25kaXRpb24pCi0JICogCWRvU3R1ZmYoKTsKLQkgKiA8L3ByZT4KLQkgKiAKLQkgKiA8cD4KLQkgKiBBbGdvcml0aG06IGlmIHRoZSBsYXN0IG5vbi1XUywgbm9uLUNvbW1lbnQgY29kZSBvbiB0aGUgbGluZSBpcyBhbiBpZgotCSAqIChjb25kaXRpb24pLCB3aGlsZSAoY29uZGl0aW9uKSwgZm9yKCBleHByZXNzaW9uKSwgZG8sIGVsc2UsIGFuZCB0aGVyZQotCSAqIGlzIG5vIHN0YXRlbWVudCBhZnRlciB0aGF0Ci0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGluc2VydCBwb3NpdGlvbiBvZiB0aGUgbmV3IGNoYXJhY3RlcgotCSAqIEBwYXJhbSBib3VuZAotCSAqICAgICAgICAgICAgdGhlIGxvd2VzdCBwb3NpdGlvbiB0byBjb25zaWRlcgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNvZGUgaXMgYSBjb25kaXRpb25hbCBzdGF0ZW1lbnQgb3IKLQkgKiAgICAgICAgIGxvb3Agd2l0aG91dCBhIGJsb2NrLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNCcmFjZWxlc3NCbG9ja1N0YXJ0KGludCBwb3NpdGlvbiwgaW50IGJvdW5kKSB7Ci0JCWlmIChwb3NpdGlvbiA8IDEpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJc3dpdGNoIChwcmV2aW91c1Rva2VuKHBvc2l0aW9uLCBib3VuZCkpIHsKLQkJCWNhc2UgVG9rZW5ETyA6Ci0JCQljYXNlIFRva2VuRUxTRSA6Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQljYXNlIFRva2VuUlBBUkVOIDoKLQkJCQlwb3NpdGlvbiA9IGZpbmRPcGVuaW5nUGVlcihmUG9zLCBMUEFSRU4sIFJQQVJFTik7Ci0JCQkJaWYgKHBvc2l0aW9uID4gMCkgewotCQkJCQlzd2l0Y2ggKHByZXZpb3VzVG9rZW4ocG9zaXRpb24gLSAxLCBib3VuZCkpIHsKLQkJCQkJCWNhc2UgVG9rZW5JRiA6Ci0JCQkJCQljYXNlIFRva2VuRk9SIDoKLQkJCQkJCWNhc2UgVG9rZW5XSElMRSA6Ci0JCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3RleHQvSmF2YVBhaXJNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMDc2OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9KYXZhUGFpck1hdGNoZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLS8vIHRha2VuIGZyb20gcGFja2FnZSBvcmcuZWNsaXBzZS5qZHQudWkudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci0KLWNsYXNzIEphdmFQYWlyTWF0Y2hlciBpbXBsZW1lbnRzIElDaGFyYWN0ZXJQYWlyTWF0Y2hlciB7Ci0KLQlwcm90ZWN0ZWQgY2hhcltdIGZQYWlyczsKLQlwcm90ZWN0ZWQgSURvY3VtZW50IGZEb2N1bWVudDsKLQlwcm90ZWN0ZWQgaW50IGZPZmZzZXQ7Ci0KLQlwcm90ZWN0ZWQgaW50IGZTdGFydFBvczsKLQlwcm90ZWN0ZWQgaW50IGZFbmRQb3M7Ci0JcHJvdGVjdGVkIGludCBmQW5jaG9yOwotCi0JcHJvdGVjdGVkIEphdmFDb2RlUmVhZGVyIGZSZWFkZXIgPSBuZXcgSmF2YUNvZGVSZWFkZXIoKTsKLQkvKioKLQkgKiBTdG9yZXMgdGhlIHNvdXJjZSB2ZXJzaW9uIHN0YXRlLgotCSAqIAotCSAqIEBzZWUgRWNsaXBzZSAgMy4xCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZIaWdobGlnaHRBbmd1bGFyQnJhY2tldHMgPSBmYWxzZTsKLQotCi0JcHVibGljIEphdmFQYWlyTWF0Y2hlcihjaGFyW10gcGFpcnMpIHsKLQkJZlBhaXJzID0gcGFpcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjbWF0Y2gob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gbWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0KLQkJaWYob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgbWF0Y2hQYWlyc0F0KCkgJiYgZlN0YXJ0UG9zICE9IGZFbmRQb3MpCi0JCQlyZXR1cm4gbmV3IFJlZ2lvbihmU3RhcnRQb3MsIGZFbmRQb3MgLSBmU3RhcnRQb3MgKyAxKTsKLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNnZXRBbmNob3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QW5jaG9yKCkgewotCQlyZXR1cm4gZkFuY2hvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQljbGVhcigpOwotCQlmRG9jdW1lbnQgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2NsZWFyKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKGZSZWFkZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlmUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCS8vIGlnbm9yZQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbWF0Y2hQYWlyc0F0KCkgewotCi0JCWludCBpOwotCQlpbnQgcGFpckluZGV4MSA9IGZQYWlycy5sZW5ndGg7Ci0JCWludCBwYWlySW5kZXgyID0gZlBhaXJzLmxlbmd0aDsKLQotCQlmU3RhcnRQb3MgPSAtMTsKLQkJZkVuZFBvcyA9IC0xOwotCi0JCS8vIGdldCB0aGUgY2hhcnMgcHJlY2VkaW5nIGFuZCBmb2xsb3dpbmcgdGhlIHN0YXJ0IHBvc2l0aW9uCi0JCXRyeSB7Ci0KLQkJCWNoYXIgcHJldkNoYXIgPSBmRG9jdW1lbnQuZ2V0Q2hhcihNYXRoLm1heChmT2Zmc2V0IC0gMSwgMCkpOwotCQkJLy8gbW9kaWZpZWQgYmVoYXZpb3IgZm9yCi0JCQkvLyBodHRwOi8vZGV2LmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE2ODc5Ci0JCQkvLyBjaGFyIG5leHRDaGFyPSBmRG9jdW1lbnQuZ2V0Q2hhcihmT2Zmc2V0KTsKLQotCQkJLy8gc2VhcmNoIGZvciBvcGVuaW5nIHBlZXIgY2hhcmFjdGVyIG5leHQgdG8gdGhlIGFjdGl2YXRpb24gcG9pbnQKLQkJCWZvciAoaSA9IDA7IGkgPCBmUGFpcnMubGVuZ3RoOyBpID0gaSArIDIpIHsKLQkJCQkvLyBpZiAobmV4dENoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJLy8gZlN0YXJ0UG9zPSBmT2Zmc2V0OwotCQkJCS8vIHBhaXJJbmRleDE9IGk7Ci0JCQkJLy8gfSBlbHNlCi0JCQkJaWYgKHByZXZDaGFyID09IGZQYWlyc1tpXSkgewotCQkJCQlmU3RhcnRQb3MgPSBmT2Zmc2V0IC0gMTsKLQkJCQkJcGFpckluZGV4MSA9IGk7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzZWFyY2ggZm9yIGNsb3NpbmcgcGVlciBjaGFyYWN0ZXIgbmV4dCB0byB0aGUgYWN0aXZhdGlvbiBwb2ludAotCQkJZm9yIChpID0gMTsgaSA8IGZQYWlycy5sZW5ndGg7IGkgPSBpICsgMikgewotCQkJCWlmIChwcmV2Q2hhciA9PSBmUGFpcnNbaV0pIHsKLQkJCQkJZkVuZFBvcyA9IGZPZmZzZXQgLSAxOwotCQkJCQlwYWlySW5kZXgyID0gaTsKLQkJCQl9Ci0JCQkJLy8gZWxzZSBpZiAobmV4dENoYXIgPT0gZlBhaXJzW2ldKSB7Ci0JCQkJLy8gZkVuZFBvcz0gZk9mZnNldDsKLQkJCQkvLyBwYWlySW5kZXgyPSBpOwotCQkJCS8vIH0KLQkJCX0KLQotCQkJaWYgKGZFbmRQb3MgPiAtMSkgewotCQkJCWZBbmNob3IgPSBSSUdIVDsKLQkJCQlmU3RhcnRQb3MgPSBzZWFyY2hGb3JPcGVuaW5nUGVlcihmRW5kUG9zLCBmUGFpcnNbcGFpckluZGV4MiAtIDFdLCBmUGFpcnNbcGFpckluZGV4Ml0sIGZEb2N1bWVudCk7Ci0JCQkJaWYgKGZTdGFydFBvcyA+IC0xKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQllbHNlCi0JCQkJCWZFbmRQb3MgPSAtMTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZTdGFydFBvcyA+IC0xKSB7Ci0JCQkJZkFuY2hvciA9IExFRlQ7Ci0JCQkJZkVuZFBvcyA9IHNlYXJjaEZvckNsb3NpbmdQZWVyKGZTdGFydFBvcywgZlBhaXJzW3BhaXJJbmRleDFdLCBmUGFpcnNbcGFpckluZGV4MSArIDFdLCBmRG9jdW1lbnQpOwotCQkJCWlmIChmRW5kUG9zID4gLTEpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWVsc2UKLQkJCQkJZlN0YXJ0UG9zID0gLTE7Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBzZWFyY2hGb3JDbG9zaW5nUGVlcihpbnQgb2Zmc2V0LCBpbnQgb3BlbmluZ1BlZXIsIGludCBjbG9zaW5nUGVlciwgSURvY3VtZW50IGRvY3VtZW50KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAob3BlbmluZ1BlZXIgPT0gJzwnICYmICEoZkhpZ2hsaWdodEFuZ3VsYXJCcmFja2V0cyAmJiBpc1R5cGVQYXJhbWV0ZXJCcmFja2V0KG9mZnNldCwgZG9jdW1lbnQpKSkKLQkJCXJldHVybiAtMTsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUZvcndhcmRSZWFkZXIoZG9jdW1lbnQsIG9mZnNldCArIDEsIGRvY3VtZW50LmdldExlbmd0aCgpLCB0cnVlLCB0cnVlKTsKLQotCQlpbnQgc3RhY2sgPSAxOwotCQlpbnQgYyA9IGZSZWFkZXIucmVhZCgpOwotCQl3aGlsZSAoYyAhPSBKYXZhQ29kZVJlYWRlci5FT0YpIHsKLQkJCWlmIChjID09IG9wZW5pbmdQZWVyICYmIGMgIT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2srKzsKLQkJCWVsc2UgaWYgKGMgPT0gY2xvc2luZ1BlZXIpCi0JCQkJc3RhY2stLTsKLQotCQkJaWYgKHN0YWNrID09IDApCi0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQotCXByb3RlY3RlZCBpbnQgc2VhcmNoRm9yT3BlbmluZ1BlZXIoaW50IG9mZnNldCwgaW50IG9wZW5pbmdQZWVyLCBpbnQgY2xvc2luZ1BlZXIsIElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKG9wZW5pbmdQZWVyID09ICc8JyAmJiAhZkhpZ2hsaWdodEFuZ3VsYXJCcmFja2V0cykKLQkJCXJldHVybiAtMTsKLQotCQlmUmVhZGVyLmNvbmZpZ3VyZUJhY2t3YXJkUmVhZGVyKGRvY3VtZW50LCBvZmZzZXQsIHRydWUsIHRydWUpOwotCi0JCWludCBzdGFjayA9IDE7Ci0JCWludCBjID0gZlJlYWRlci5yZWFkKCk7Ci0JCXdoaWxlIChjICE9IEphdmFDb2RlUmVhZGVyLkVPRikgewotCQkJaWYgKGMgPT0gY2xvc2luZ1BlZXIgJiYgYyAhPSBvcGVuaW5nUGVlcikKLQkJCQlzdGFjaysrOwotCQkJZWxzZSBpZiAoYyA9PSBvcGVuaW5nUGVlcikKLQkJCQlzdGFjay0tOwotCi0JCQlpZiAoc3RhY2sgPT0gMCkgewotCQkJCWlmIChjbG9zaW5nUGVlciA9PSAnPicgJiYgIWlzVHlwZVBhcmFtZXRlckJyYWNrZXQoZlJlYWRlci5nZXRPZmZzZXQoKSwgZG9jdW1lbnQpKQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJcmV0dXJuIGZSZWFkZXIuZ2V0T2Zmc2V0KCk7Ci0JCQl9Ci0KLQkJCWMgPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCi0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdGhlIGFuZ3VsYXIgYnJhY2tldCBhdCA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzIGEgdHlwZQotCSAqIHBhcmFtZXRlciBicmFja2V0LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIG9wZW5pbmcgYnJhY2tldAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgYnJhY2tldCBpcyBwYXJ0IG9mIGEgdHlwZSBwYXJhbWV0ZXIsCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICogQHNlZSBFY2xpcHNlICAzLjEKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUeXBlUGFyYW1ldGVyQnJhY2tldChpbnQgb2Zmc2V0LCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLyoKLQkJICogdHlwZSBwYXJhbWV0ZXIgY29tZSBhZnRlciBicmFjZXMgKGNsb3Npbmcgb3Igb3BlbmluZyksIHNlbWljb2xvbnMsCi0JCSAqIG9yIGFmdGVyIGEgVHlwZSBuYW1lIChoZXVyaXN0aWM6IHN0YXJ0cyB3aXRoIGNhcGl0YWwgY2hhcmFjdGVyLCBvcgotCQkgKiBhZnRlciBhIG1vZGlmaWVyIGtleXdvcmQgaW4gYSBtZXRob2QgZGVjbGFyYXRpb24gKHZpc2liaWxpdHksCi0JCSAqIHN0YXRpYywgc3luY2hyb25pemVkLCBmaW5hbCkKLQkJICovCi0KLQkJdHJ5IHsKLQkJCUlSZWdpb24gbGluZSA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KG9mZnNldCk7Ci0KLQkJCUphdmFIZXVyaXN0aWNTY2FubmVyIHNjYW5uZXIgPSBuZXcgSmF2YUhldXJpc3RpY1NjYW5uZXIoZG9jdW1lbnQpOwotCQkJaW50IHByZXZUb2tlbiA9IHNjYW5uZXIucHJldmlvdXNUb2tlbihvZmZzZXQgLSAxLCBsaW5lLmdldE9mZnNldCgpKTsKLQkJCWludCBwcmV2VG9rZW5PZmZzZXQgPSBzY2FubmVyLmdldFBvc2l0aW9uKCkgKyAxOwotCQkJU3RyaW5nIHByZXZpb3VzID0gcHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5FT0YgPyBudWxsIDogZG9jdW1lbnQuZ2V0KHByZXZUb2tlbk9mZnNldCwgb2Zmc2V0IC0gcHJldlRva2VuT2Zmc2V0KS50cmltKCk7Ci0KLQkJCWlmIChwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlbkxCUkFDRSB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlblJCUkFDRSB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlblNFTUlDT0xPTiB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlblNZTkNIUk9OSVpFRCB8fCBwcmV2VG9rZW4gPT0gU3ltYm9scy5Ub2tlblNUQVRJQyB8fCAocHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5JREVOVCAmJiBpc1R5cGVQYXJhbWV0ZXJJbnRyb2R1Y2VyKHByZXZpb3VzKSkgfHwgcHJldlRva2VuID09IFN5bWJvbHMuVG9rZW5FT0YpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIDxjb2RlPmlkZW50aWZpZXI8L2NvZGU+IGlzIGFuCi0JICogaWRlbnRpZmllciB0aGF0IGNvdWxkIGNvbWUgcmlnaHQgYmVmb3JlIGEgdHlwZSBwYXJhbWV0ZXIgbGlzdC4gSXQgdXNlcwotCSAqIGEgaGV1cmlzdGljOiBpZiB0aGUgaWRlbnRpZmllciBzdGFydHMgd2l0aCBhbiB1cHBlciBjYXNlLCBpdCBpcyBhc3N1bWVkCi0JICogYSB0eXBlIG5hbWUuIEFsc28sIGlmIDxjb2RlPmlkZW50aWZpZXI8L2NvZGU+IGlzIGEgbWV0aG9kIG1vZGlmaWVyLAotCSAqIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgYW5ndWxhciBicmFja2V0IGlzIHBhcnQgb2YgdGhlIGdlbmVyaWMgdHlwZQotCSAqIHBhcmFtZXRlciBvZiBhIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gaWRlbnRpZmllcgotCSAqICAgICAgICAgICAgdGhlIGlkZW50aWZpZXIgdG8gY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBpZGVudGlmaWVyIGNvdWxkIGludHJvZHVjZSBhIHR5cGUKLQkgKiAgICAgICAgIHBhcmFtZXRlciBsaXN0Ci0JICogQHNlZSBFY2xpcHNlICAzLjEKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNUeXBlUGFyYW1ldGVySW50cm9kdWNlcihTdHJpbmcgaWRlbnRpZmllcikgewotCQlyZXR1cm4gaWRlbnRpZmllci5sZW5ndGgoKSA+IDAgJiYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShpZGVudGlmaWVyLmNoYXJBdCgwKSkgfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJmaW5hbCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwdWJsaWMiKSAvLyROT04tTkxTLTEkCi0JCQkJCXx8IGlkZW50aWZpZXIuc3RhcnRzV2l0aCgicHVibGljIikgLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBpZGVudGlmaWVyLnN0YXJ0c1dpdGgoInByb3RlY3RlZCIpIC8vJE5PTi1OTFMtMSQKLQkJfHwgaWRlbnRpZmllci5zdGFydHNXaXRoKCJwcml2YXRlIikpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvdGV4dC9TeW1ib2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L1N5bWJvbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4NjE1ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC90ZXh0L1N5bWJvbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC50ZXh0OwotCi0vLyB0YWtlbiBmcm9tIHBhY2thZ2Ugb3JnLmVjbGlwc2UuamR0LnVpLnRleHQ7Ci0KLS8qKgotICogU3ltYm9scyBmb3IgdGhlIGhldXJpc3RpYyBqYXZhIHNjYW5uZXIuCi0gKiAKLSAqIEBzZWUgRWNsaXBzZSAzLjAKLSAqLwotaW50ZXJmYWNlIFN5bWJvbHMgewotCWludCBUb2tlbkVPRiA9IC0xOwotCWludCBUb2tlbkxCUkFDRSA9IDE7Ci0JaW50IFRva2VuUkJSQUNFID0gMjsKLQlpbnQgVG9rZW5MQlJBQ0tFVCA9IDM7Ci0JaW50IFRva2VuUkJSQUNLRVQgPSA0OwotCWludCBUb2tlbkxQQVJFTiA9IDU7Ci0JaW50IFRva2VuUlBBUkVOID0gNjsKLQlpbnQgVG9rZW5TRU1JQ09MT04gPSA3OwotCWludCBUb2tlbk9USEVSID0gODsKLQlpbnQgVG9rZW5DT0xPTiA9IDk7Ci0JaW50IFRva2VuUVVFU1RJT05NQVJLID0gMTA7Ci0JaW50IFRva2VuQ09NTUEgPSAxMTsKLQlpbnQgVG9rZW5FUVVBTCA9IDEyOwotCWludCBUb2tlbkxFU1NUSEFOID0gMTM7Ci0JaW50IFRva2VuR1JFQVRFUlRIQU4gPSAxNDsKLQlpbnQgVG9rZW5JRiA9IDEwOTsKLQlpbnQgVG9rZW5ETyA9IDEwMTA7Ci0JaW50IFRva2VuRk9SID0gMTAxMTsKLQlpbnQgVG9rZW5UUlkgPSAxMDEyOwotCWludCBUb2tlbkNBU0UgPSAxMDEzOwotCWludCBUb2tlbkVMU0UgPSAxMDE0OwotCWludCBUb2tlbkJSRUFLID0gMTAxNTsKLQlpbnQgVG9rZW5DQVRDSCA9IDEwMTY7Ci0JaW50IFRva2VuV0hJTEUgPSAxMDE3OwotCWludCBUb2tlblJFVFVSTiA9IDEwMTg7Ci0JaW50IFRva2VuU1RBVElDID0gMTAxOTsKLQlpbnQgVG9rZW5TV0lUQ0ggPSAxMDIwOwotCWludCBUb2tlbkZJTkFMTFkgPSAxMDIxOwotCWludCBUb2tlblNZTkNIUk9OSVpFRCA9IDEwMjI7Ci0JaW50IFRva2VuR09UTyA9IDEwMjM7Ci0JaW50IFRva2VuREVGQVVMVCA9IDEwMjQ7Ci0JaW50IFRva2VuTkVXID0gMTAyNTsKLQlpbnQgVG9rZW5DTEFTUyA9IDEwMjY7Ci0JaW50IFRva2VuSU5URVJGQUNFID0gMTAyNzsKLQlpbnQgVG9rZW5FTlVNID0gMTAyODsKLQlpbnQgVG9rZW5JREVOVCA9IDIwMDA7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTEZpbGVXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTEZpbGVXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDE3ODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxGaWxlV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5Db21wb25lbnRDb3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29tcG9uZW50Y29yZS5pbnRlcm5hbC51dGlsLklNb2R1bGVDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb21wb25lbnRjb3JlLnJlc291cmNlcy5JVmlydHVhbENvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnByb2plY3QuZmFjZXQuY29yZS5JRmFjZXRlZFByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5wcm9qZWN0LmZhY2V0LmNvcmUuUHJvamVjdEZhY2V0c01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS5pbnRlcm5hbC5IVE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLkhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi1jbGFzcyBOZXdIVE1MRmlsZVdpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlIHsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGZDb250ZW50VHlwZTsKLQlwcml2YXRlIExpc3QgZlZhbGlkRXh0ZW5zaW9ucyA9IG51bGw7Ci0JCi0JcHVibGljIE5ld0hUTUxGaWxlV2l6YXJkUGFnZShTdHJpbmcgcGFnZU5hbWUsIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikgewotICAgICAgICBzdXBlcihwYWdlTmFtZSwgc2VsZWN0aW9uKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCB0aGUgc2VsZWN0ZWQgZm9sZGVyIHRvIHdlYiBjb250ZW50cyAKLQkgKiBmb2xkZXIgaWYgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGlzIG91dHNpZGUgdGhlIHdlYiBjb250ZW50cyBmb2xkZXIuIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxQb3B1bGF0ZUNvbnRhaW5lck5hbWVGaWVsZCgpIHsKLQkJc3VwZXIuaW5pdGlhbFBvcHVsYXRlQ29udGFpbmVyTmFtZUZpZWxkKCk7Ci0JCQotCQlJUGF0aCBmdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQlJUGF0aCB3ZWJDb250ZW50UGF0aCA9IGdldFdlYkNvbnRlbnRQYXRoKHByb2plY3QpOwotCQkKLQkJaWYgKHdlYkNvbnRlbnRQYXRoICE9IG51bGwgJiYgIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQlzZXRDb250YWluZXJGdWxsUGF0aCh3ZWJDb250ZW50UGF0aCk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgb3ZlcnJpZGVuIHRvIHNldCBhZGRpdGlvbmFsIHZhbGlkYXRpb24gc3BlY2lmaWMgdG8gCi0JICogaHRtbCBmaWxlcy4gCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlzZXRNZXNzYWdlKG51bGwpOwotCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQotCQlpZiAoIXN1cGVyLnZhbGlkYXRlUGFnZSgpKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJCi0JCVN0cmluZyBmaWxlTmFtZSA9IGdldEZpbGVOYW1lKCk7Ci0JCUlQYXRoIGZ1bGxQYXRoID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKTsKLQkJaWYgKChmdWxsUGF0aCAhPSBudWxsKSAmJiAoZnVsbFBhdGguaXNFbXB0eSgpID09IGZhbHNlKSAmJiAoZmlsZU5hbWUgIT0gbnVsbCkpIHsKLQkJCS8vIGNoZWNrIHRoYXQgZmlsZW5hbWUgZG9lcyBub3QgY29udGFpbiBpbnZhbGlkIGV4dGVuc2lvbgotCQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZpbGVOYW1lKSkgewotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChIVE1MVUlNZXNzYWdlcy5fRVJST1JfRklMRU5BTUVfTVVTVF9FTkRfSFRNTCwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJCXJldHVybiBmYWxzZTsKLQkJCX0KLQkJCS8vIG5vIGZpbGUgZXh0ZW5zaW9uIHNwZWNpZmllZCBzbyBjaGVjayBhZGRpbmcgZGVmYXVsdAotCQkJLy8gZXh0ZW5zaW9uIGRvZXNuJ3QgZXF1YWwgYSBmaWxlIHRoYXQgYWxyZWFkeSBleGlzdHMKLQkJCWlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLicpID09IC0xKSB7Ci0JCQkJU3RyaW5nIG5ld0ZpbGVOYW1lID0gYWRkRGVmYXVsdEV4dGVuc2lvbihmaWxlTmFtZSk7Ci0JCQkJSVBhdGggcmVzb3VyY2VQYXRoID0gZnVsbFBhdGguYXBwZW5kKG5ld0ZpbGVOYW1lKTsKLQotCQkJCUlXb3Jrc3BhY2Ugd29ya3NwYWNlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQkJCUlTdGF0dXMgcmVzdWx0ID0gd29ya3NwYWNlLnZhbGlkYXRlUGF0aChyZXNvdXJjZVBhdGgudG9TdHJpbmcoKSwgSVJlc291cmNlLkZPTERFUik7Ci0JCQkJaWYgKCFyZXN1bHQuaXNPSygpKSB7Ci0JCQkJCS8vIHBhdGggaW52YWxpZAotCQkJCQlzZXRFcnJvck1lc3NhZ2UocmVzdWx0LmdldE1lc3NhZ2UoKSk7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlpZiAoKHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0Rm9sZGVyKHJlc291cmNlUGF0aCkuZXhpc3RzKCkgfHwgd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHJlc291cmNlUGF0aCkuZXhpc3RzKCkpKSB7Ci0JCQkJCXNldEVycm9yTWVzc2FnZShIVE1MVUlNZXNzYWdlcy5SZXNvdXJjZUdyb3VwX25hbWVFeGlzdHMpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJCi0JCQkvLyBnZXQgdGhlIElQcm9qZWN0IGZvciB0aGUgc2VsZWN0aW9uIHBhdGgKLQkJCUlQcm9qZWN0IHByb2plY3QgPSBnZXRQcm9qZWN0RnJvbVBhdGgoZnVsbFBhdGgpOwotCQkJLy8gaWYgaW5zaWRlIHdlYiBwcm9qZWN0LCBjaGVjayBpZiBpbnNpZGUgd2ViQ29udGVudCBmb2xkZXIKLQkJCWlmIChwcm9qZWN0ICE9IG51bGwgJiYgaXNXZWJQcm9qZWN0KHByb2plY3QpKSB7Ci0JCQkJLy8gY2hlY2sgdGhhdCB0aGUgcGF0aCBpcyBpbnNpZGUgdGhlIHdlYkNvbnRlbnQgZm9sZGVyCi0JCQkJSVBhdGggd2ViQ29udGVudFBhdGggPSBnZXRXZWJDb250ZW50UGF0aChwcm9qZWN0KTsKLQkJCQlpZiAoIXdlYkNvbnRlbnRQYXRoLmlzUHJlZml4T2YoZnVsbFBhdGgpKSB7Ci0JCQkJCXNldE1lc3NhZ2UoSFRNTFVJTWVzc2FnZXMuX1dBUk5JTkdfRk9MREVSX01VU1RfQkVfSU5TSURFX1dFQl9DT05URU5ULCBXQVJOSU5HKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgewotCQlpZiAoZkNvbnRlbnRUeXBlID09IG51bGwpCi0JCQlmQ29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9ySFRNTC5Db250ZW50VHlwZUlEX0hUTUwpOwotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEdldCBsaXN0IG9mIHZhbGlkIGV4dGVuc2lvbnMgZm9yIEhUTUwgQ29udGVudCB0eXBlCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgTGlzdCBnZXRWYWxpZEV4dGVuc2lvbnMoKSB7Ci0JCWlmIChmVmFsaWRFeHRlbnNpb25zID09IG51bGwpIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJCWZWYWxpZEV4dGVuc2lvbnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QodHlwZS5nZXRGaWxlU3BlY3MoSUNvbnRlbnRUeXBlLkZJTEVfRVhURU5TSU9OX1NQRUMpKSk7Ci0JCX0KLQkJcmV0dXJuIGZWYWxpZEV4dGVuc2lvbnM7Ci0JfQotCQotCS8qKgotCSAqIFZlcmlmaWVzIGlmIGZpbGVOYW1lIGlzIHZhbGlkIG5hbWUgZm9yIGNvbnRlbnQgdHlwZS4gVGFrZXMgYmFzZSBjb250ZW50Ci0JICogdHlwZSBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIGZpbGVOYW1lCi0JICogQHJldHVybiB0cnVlIGlmIGV4dGVuc2lvbiBpcyB2YWxpZCBmb3IgdGhpcyBjb250ZW50IHR5cGUKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gZ2V0Q29udGVudFR5cGUoKTsKLQkJLy8gdGhlcmUgaXMgY3VycmVudGx5IGFuIGV4dGVuc2lvbgotCQlpZiAoZmlsZU5hbWUubGFzdEluZGV4T2YoJy4nKSAhPSAtMSkgewotCQkJLy8gY2hlY2sgd2hhdCBjb250ZW50IHR5cGVzIGFyZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBleHRlbnNpb24KLQkJCUlDb250ZW50VHlwZVtdIHR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihmaWxlTmFtZSk7Ci0JCQlpbnQgaSA9IDA7Ci0JCQl3aGlsZSAoaSA8IHR5cGVzLmxlbmd0aCAmJiAhdmFsaWQpIHsKLQkJCQl2YWxpZCA9IHR5cGVzW2ldLmlzS2luZE9mKHR5cGUpOwotCQkJCSsraTsKLQkJCX0KLQkJfQotCQllbHNlCi0JCQl2YWxpZCA9IHRydWU7IC8vIG5vIGV4dGVuc2lvbiBzbyB2YWxpZAotCQlyZXR1cm4gdmFsaWQ7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBkZWZhdWx0IGV4dGVuc2lvbiB0byB0aGUgZmlsZW5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JU3RyaW5nIGFkZERlZmF1bHRFeHRlbnNpb24oU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCVN0cmluZ0J1ZmZlciBuZXdGaWxlTmFtZSA9IG5ldyBTdHJpbmdCdWZmZXIoZmlsZW5hbWUpOwotCi0JCVByZWZlcmVuY2VzIHByZWZlcmVuY2UgPSBIVE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGV4dCA9IHByZWZlcmVuY2UuZ2V0U3RyaW5nKEhUTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQotCQluZXdGaWxlTmFtZS5hcHBlbmQoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQluZXdGaWxlTmFtZS5hcHBlbmQoZXh0KTsKLQotCQlyZXR1cm4gbmV3RmlsZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcGF0aAotCSAqIAotCSAqIEBwYXJhbSBwYXRoIHRoZSBwYXRoIHdoaWNoIHByb2plY3QgaXMgbmVlZGVkCi0JICogQHJldHVybiBJUHJvamVjdCBvYmplY3QuIElmIHBhdGggaXMgPGNvZGU+bnVsbDwvY29kZT4gdGhlIHJldHVybiB2YWx1ZSAKLQkgKiAJCSAgIGlzIGFsc28gPGNvZGU+bnVsbDwvY29kZT4uIAotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdEZyb21QYXRoKElQYXRoIHBhdGgpIHsKLQkJSVdvcmtzcGFjZSB3b3Jrc3BhY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCk7Ci0JCUlQcm9qZWN0IHByb2plY3QgPSBudWxsOwotCQkKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJaWYgKHdvcmtzcGFjZS52YWxpZGF0ZVBhdGgocGF0aC50b1N0cmluZygpLCBJUmVzb3VyY2UuUFJPSkVDVCkuaXNPSygpKSB7Ci0JCQkJcHJvamVjdCA9IHdvcmtzcGFjZS5nZXRSb290KCkuZ2V0UHJvamVjdChwYXRoLnRvU3RyaW5nKCkpOwotCQkJfSBlbHNlIHsKLQkJCQlwcm9qZWN0ID0gd29ya3NwYWNlLmdldFJvb3QoKS5nZXRGaWxlKHBhdGgpLmdldFByb2plY3QoKTsKLQkJCX0KLQkJfQotCQkKLQkJcmV0dXJuIHByb2plY3Q7Ci0JfQotCQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGUgc3BlY2lmaWVkIHByb2plY3QgaXMgYSB3ZWIgcHJvamVjdC4gCi0JICogCi0JICogQHBhcmFtIHByb2plY3QgcHJvamVjdCB0byBiZSBjaGVja2VkCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9qZWN0IGlzIHdlYiBwcm9qZWN0LCBvdGhlcndpc2UgZmFsc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNXZWJQcm9qZWN0KElQcm9qZWN0IHByb2plY3QpIHsKLQkJSUZhY2V0ZWRQcm9qZWN0IGZhY2V0ZWQgPSBudWxsOwotCQl0cnkgewotCQkJZmFjZXRlZCA9IFByb2plY3RGYWNldHNNYW5hZ2VyLmNyZWF0ZShwcm9qZWN0KTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0JCX0KLQkJCi0JCWlmIChmYWNldGVkICE9IG51bGwgJiYgCi0JCQkoZmFjZXRlZC5oYXNQcm9qZWN0RmFjZXQoUHJvamVjdEZhY2V0c01hbmFnZXIuZ2V0UHJvamVjdEZhY2V0KElNb2R1bGVDb25zdGFudHMuV1NUX1dFQl9NT0RVTEUpKSB8fCAKLQkJCSBmYWNldGVkLmhhc1Byb2plY3RGYWNldChQcm9qZWN0RmFjZXRzTWFuYWdlci5nZXRQcm9qZWN0RmFjZXQoSU1vZHVsZUNvbnN0YW50cy5KU1RfV0VCX01PRFVMRSkpKSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJucyB0aGUgd2ViIGNvbnRlbnRzIGZvbGRlciBvZiB0aGUgc3BlY2lmaWVkIHByb2plY3QKLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCB0aGUgcHJvamVjdCB3aGljaCB3ZWIgY29udGVudHMgcGF0aCBpcyBuZWVkZWQKLQkgKiBAcmV0dXJuIElQYXRoIG9mIHRoZSB3ZWIgY29udGVudHMgZm9sZGVyCi0JICovCi0JcHJpdmF0ZSBJUGF0aCBnZXRXZWJDb250ZW50UGF0aChJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQkKLQkJaWYgKHByb2plY3QgIT0gbnVsbCAmJiBpc1dlYlByb2plY3QocHJvamVjdCkpIHsJCQkKLQkJCUlWaXJ0dWFsQ29tcG9uZW50IGNvbXBvbmVudCA9IENvbXBvbmVudENvcmUuY3JlYXRlQ29tcG9uZW50KHByb2plY3QpOwotCQkJcGF0aCA9IGNvbXBvbmVudC5nZXRSb290Rm9sZGVyKCkuZ2V0V29ya3NwYWNlUmVsYXRpdmVQYXRoKCk7Ci0JCX0KLQkJCi0JCXJldHVybiBwYXRoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9odG1sL3VpL2ludGVybmFsL3dpemFyZC9OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4OTk0ZWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC53aXphcmQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkRvY3VtZW50VGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQnVmZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLnBlcnNpc3RlbmNlLlRlbXBsYXRlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXJTb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkNvbnRyb2xBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJlY3RhbmdsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvckhUTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5IVE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuSFRNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci0KLS8qKgotICogVGVtcGxhdGVzIHBhZ2UgaW4gbmV3IGZpbGUgd2l6YXJkLiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGEgbmV3IGZpbGUKLSAqIHRlbXBsYXRlIHRvIGJlIGFwcGxpZWQgaW4gbmV3IGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSB7Ci0KLQkvKioKLQkgKiBDb250ZW50IHByb3ZpZGVyIGZvciB0ZW1wbGF0ZXMKLQkgKi8KLQlwcml2YXRlIGNsYXNzIFRlbXBsYXRlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCQkvKiogVGhlIHRlbXBsYXRlIHN0b3JlLiAqLwotCQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlN0b3JlOwotCi0JCS8qCi0JCSAqIEBzZWUgSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmU3RvcmUgPSBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlciNnZXRFbGVtZW50cyhPYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGlucHV0KSB7Ci0JCQlyZXR1cm4gZlN0b3JlLmdldFRlbXBsYXRlcyhUZW1wbGF0ZUNvbnRleHRUeXBlSWRzSFRNTC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2UoKSB7Ci0JCXN1cGVyKCJOZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZSIsIEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzAsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKEhUTUxVSU1lc3NhZ2VzLk5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzEpOwotCX0KLQotCS8qKgotCSAqIENvcnJlY3RseSByZXNpemVzIHRoZSB0YWJsZSBzbyBubyBwaGFudG9tIGNvbHVtbnMgYXBwZWFyCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHBhcmFtIGJ1dHRvbnMKLQkgKiAgICAgICAgICAgIHRoZSBidXR0b25zCi0JICogQHBhcmFtIHRhYmxlCi0JICogICAgICAgICAgICB0aGUgdGFibGUKLQkgKiBAcGFyYW0gY29sdW1uMQotCSAqICAgICAgICAgICAgdGhlIGZpcnN0IGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4yCi0JICogICAgICAgICAgICB0aGUgc2Vjb25kIGNvbHVtbgotCSAqIEBwYXJhbSBjb2x1bW4zCi0JICogICAgICAgICAgICB0aGUgdGhpcmQgY29sdW1uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVRhYmxlUmVzaXppbmcoZmluYWwgQ29tcG9zaXRlIHBhcmVudCwgZmluYWwgVGFibGUgdGFibGUsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjEsIGZpbmFsIFRhYmxlQ29sdW1uIGNvbHVtbjIpIHsKLQkJcGFyZW50LmFkZENvbnRyb2xMaXN0ZW5lcihuZXcgQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBjb250cm9sUmVzaXplZChDb250cm9sRXZlbnQgZSkgewotCQkJCVJlY3RhbmdsZSBhcmVhID0gcGFyZW50LmdldENsaWVudEFyZWEoKTsKLQkJCQlQb2ludCBwcmVmZXJyZWRTaXplID0gdGFibGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCQlpbnQgd2lkdGggPSBhcmVhLndpZHRoIC0gMiAqIHRhYmxlLmdldEJvcmRlcldpZHRoKCk7Ci0JCQkJaWYgKHByZWZlcnJlZFNpemUueSA+IGFyZWEuaGVpZ2h0KSB7Ci0JCQkJCS8vIFN1YnRyYWN0IHRoZSBzY3JvbGxiYXIgd2lkdGggZnJvbSB0aGUgdG90YWwgY29sdW1uCi0JCQkJCS8vIHdpZHRoCi0JCQkJCS8vIGlmIGEgdmVydGljYWwgc2Nyb2xsYmFyIHdpbGwgYmUgcmVxdWlyZWQKLQkJCQkJUG9pbnQgdkJhclNpemUgPSB0YWJsZS5nZXRWZXJ0aWNhbEJhcigpLmdldFNpemUoKTsKLQkJCQkJd2lkdGggLT0gdkJhclNpemUueDsKLQkJCQl9Ci0KLQkJCQlQb2ludCBvbGRTaXplID0gdGFibGUuZ2V0U2l6ZSgpOwotCQkJCWlmIChvbGRTaXplLnggPiB3aWR0aCkgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIHNtYWxsZXIgc28gbWFrZSB0aGUgY29sdW1ucwotCQkJCQkvLyBzbWFsbGVyIGZpcnN0IGFuZCB0aGVuIHJlc2l6ZSB0aGUgdGFibGUgdG8KLQkJCQkJLy8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCWNvbHVtbjEuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJY29sdW1uMi5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQl0YWJsZS5zZXRTaXplKHdpZHRoLCBhcmVhLmhlaWdodCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyB0YWJsZSBpcyBnZXR0aW5nIGJpZ2dlciBzbyBtYWtlIHRoZSB0YWJsZQotCQkJCQkvLyBiaWdnZXIgZmlyc3QgYW5kIHRoZW4gbWFrZSB0aGUgY29sdW1ucyB3aWRlcgotCQkJCQkvLyB0byBtYXRjaCB0aGUgY2xpZW50IGFyZWEgd2lkdGgKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbXBvc2l0ZSBwYXJlbnQgPSBuZXcgQ29tcG9zaXRlKGFuY2VzdG9yLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlwYXJlbnQuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy8gY3JlYXRlIGNoZWNrYm94IGZvciB1c2VyIHRvIHVzZSBIVE1MIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgbGlua2VkIHRleHQgdG8ganVzdCB0byB0ZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoSFRNTFVJTWVzc2FnZXMuTmV3SFRNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iamVjdDEsIG9iamVjdDIpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVWaWV3ZXJJbnB1dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdmlld2VyIHRoYXQgZGlzcGxheXMgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlJ3MgY29udGVudHMKLQkJZlBhdHRlcm5WaWV3ZXIgPSBkb0NyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCWZUZW1wbGF0ZVN0b3JlID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JCWZUYWJsZVZpZXdlci5zZXRJbnB1dChmVGVtcGxhdGVTdG9yZSk7Ci0KLQkJY29uZmlndXJlVGFibGVSZXNpemluZyhpbm5lclBhcmVudCwgdGFibGUsIGNvbHVtbjEsIGNvbHVtbjIpOwotCQlsb2FkTGFzdFNhdmVkUHJlZmVyZW5jZXMoKTsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHBhcmVudCwgSUhlbHBDb250ZXh0SWRzLkhUTUxfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCk7Ci0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQocGFyZW50KTsKLQkJc2V0Q29udHJvbChwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMgYSBzb3VyY2Ugdmlld2VyIHRvIHByZXNlbnQgdGhlIHRlbXBsYXRlCi0JICogcGF0dGVybiBvbiB0aGUgcHJlZmVyZW5jZSBwYWdlLiBDbGllbnRzIG1heSBvdmVycmlkZSB0byBwcm92aWRlIGEKLQkgKiBjdXN0b20gc291cmNlIHZpZXdlciBmZWF0dXJpbmcgZS5nLiBzeW50YXggY29sb3JpbmcuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCBjb250cm9sCi0JICogQHJldHVybiBhIGNvbmZpZ3VyZWQgc291cmNlIHZpZXdlcgotCSAqLwotCXByaXZhdGUgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IENvbnRlbnRUeXBlSWRGb3JIVE1MLkNvbnRlbnRUeXBlSURfSFRNTDsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBiYXNlQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25IVE1MKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldFRleHRGb250KCkpOwotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZG9DcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChIVE1MVUlNZXNzYWdlcy5OZXdIVE1MVGVtcGxhdGVzV2l6YXJkUGFnZV81KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gY3JlYXRlVmlld2VyKHBhcmVudCk7Ci0JCXZpZXdlci5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLQkJQ29udHJvbCBjb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gMjsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJY29udHJvbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlL2Rpc2FibGUgY29udHJvbHMgaW4gcGFnZSBiYXNlZCBvbiBmVXNlVGVtcGxhdGVCdXR0b24ncyBjdXJyZW50Ci0JICogc3RhdGUuCi0JICovCi0Jdm9pZCBlbmFibGVUZW1wbGF0ZXMoKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IGZVc2VUZW1wbGF0ZUJ1dHRvbi5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoIWVuYWJsZWQpIHsKLQkJCS8vIHNhdmUgbGFzdCBzZWxlY3RlZCB0ZW1wbGF0ZQotCQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGUuZ2V0TmFtZSgpOwotCQkJZWxzZQotCQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0U2VsZWN0ZWRUZW1wbGF0ZShmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lKTsKLQkJfQotCi0JCWZUYWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlBhdHRlcm5WaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSB0ZW1wbGF0ZSBwcmVmZXJlbmNlIHBhZ2UgaWQKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5wcmVmZXJlbmNlcy50ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgdGVtcGxhdGUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgVGVtcGxhdGUgZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGZUYWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA9PSAxKSB7Ci0JCQl0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgc2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQl9Ci0JCXJldHVybiB0ZW1wbGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRlbXBsYXRlIHN0cmluZyB0byBpbnNlcnQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgdG8gaW5zZXJ0IG9yIG51bGwgaWYgbm9uZSBpcyB0byBiZSBpbnNlcnRlZAotCSAqLwotCVN0cmluZyBnZXRUZW1wbGF0ZVN0cmluZygpIHsKLQkJU3RyaW5nIHRlbXBsYXRlU3RyaW5nID0gbnVsbDsKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCVRlbXBsYXRlQ29udGV4dFR5cGUgY29udGV4dFR5cGUgPSBIVE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudCgpOwotCQkJVGVtcGxhdGVDb250ZXh0IGNvbnRleHQgPSBuZXcgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQoY29udGV4dFR5cGUsIGRvY3VtZW50LCAwLCAwKTsKLQkJCXRyeSB7Ci0JCQkJVGVtcGxhdGVCdWZmZXIgYnVmZmVyID0gY29udGV4dC5ldmFsdWF0ZSh0ZW1wbGF0ZSk7Ci0JCQkJdGVtcGxhdGVTdHJpbmcgPSBidWZmZXIuZ2V0U3RyaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HX0RFQlVHLCAiQ291bGQgbm90IGNyZWF0ZSB0ZW1wbGF0ZSBmb3IgbmV3IGh0bWwiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRlbXBsYXRlU3RyaW5nOwotCX0KLQotCXZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSBnZXRQcmVmZXJlbmNlUGFnZUlkKCk7Ci0JCVByZWZlcmVuY2VEaWFsb2cgZGlhbG9nID0gUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBwYWdlSWQsIG5ldyBTdHJpbmdbXXtwYWdlSWR9LCBudWxsKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBOZXcgSFRNTCBGaWxlIHdpemFyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gSFRNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUpOwotCQlpZiAodGVtcGxhdGVOYW1lID09IG51bGwgfHwgdGVtcGxhdGVOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCWZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbihmYWxzZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOwotCQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJfQotCQllbmFibGVUZW1wbGF0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBTYXZlIHRlbXBsYXRlIG5hbWUgdXNlZCBmb3IgbmV4dCBjYWxsIHRvIE5ldyBIVE1MIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoSFRNTFVJUHJlZmVyZW5jZU5hbWVzLk5FV19GSUxFX1RFTVBMQVRFX05BTUUsIHRlbXBsYXRlTmFtZSk7Ci0JCUhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc0hUTUwuTkVXKTsKLQkJfQotCi0JCS8vIG5vIHJlY29yZCBvZiBsYXN0IHVzZWQgdGVtcGxhdGUgc28ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJaWYgKHRlbXBsYXRlID09IG51bGwpIHsKLQkJCS8vIGp1c3QgcGljayBmaXJzdCBlbGVtZW50Ci0JCQl0ZW1wbGF0ZSA9IGZUYWJsZVZpZXdlci5nZXRFbGVtZW50QXQoMCk7Ci0JCX0KLQotCQlpZiAodGVtcGxhdGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24odGVtcGxhdGUpOwotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgcGF0dGVybiB2aWV3ZXIuCi0JICovCi0Jdm9pZCB1cGRhdGVWaWV3ZXJJbnB1dCgpIHsKLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkpOwotCQl9Ci0JCWVsc2UgewotCQkJZlBhdHRlcm5WaWV3ZXIuZ2V0RG9jdW1lbnQoKS5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvaW50ZXJuYWwvd2l6YXJkL05ld0hUTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M1NzQxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS9pbnRlcm5hbC93aXphcmQvTmV3SFRNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwud2l6YXJkOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaW50ZXJuYWwuSFRNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmVkaXRvci5IVE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuZWRpdG9yLkhUTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgTmV3SFRNTFdpemFyZCBleHRlbmRzIFdpemFyZCBpbXBsZW1lbnRzIElOZXdXaXphcmQgewotCQotCXByaXZhdGUgTmV3SFRNTEZpbGVXaXphcmRQYWdlIGZOZXdGaWxlUGFnZTsKLQlwcml2YXRlIE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlIGZOZXdGaWxlVGVtcGxhdGVzUGFnZTsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkU2VsZWN0aW9uIGZTZWxlY3Rpb247Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJZk5ld0ZpbGVQYWdlID0gbmV3IE5ld0hUTUxGaWxlV2l6YXJkUGFnZSgiSFRNTFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UiLCBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihJREUuY29tcHV0ZVNlbGVjdGVkUmVzb3VyY2VzKGZTZWxlY3Rpb24pKSk7IC8vJE5PTi1OTFMtMSQKLQkJZk5ld0ZpbGVQYWdlLnNldFRpdGxlKEhUTUxVSU1lc3NhZ2VzLl9VSV9XSVpBUkRfTkVXX0hFQURJTkcpOwotCQlmTmV3RmlsZVBhZ2Uuc2V0RGVzY3JpcHRpb24oSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfREVTQ1JJUFRJT04pOwotCQlhZGRQYWdlKGZOZXdGaWxlUGFnZSk7Ci0KLQkJZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlID0gbmV3IE5ld0hUTUxUZW1wbGF0ZXNXaXphcmRQYWdlKCk7Ci0JCWFkZFBhZ2UoZk5ld0ZpbGVUZW1wbGF0ZXNQYWdlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggYVdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gYVNlbGVjdGlvbikgewotCQlmU2VsZWN0aW9uID0gYVNlbGVjdGlvbjsKLQkJc2V0V2luZG93VGl0bGUoSFRNTFVJTWVzc2FnZXMuX1VJX1dJWkFSRF9ORVdfVElUTEUpOwotCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSFRNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEhUTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX1dJWkJBTl9ORVdIVE1MRklMRSk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotCX0KLQotCXByaXZhdGUgdm9pZCBvcGVuRWRpdG9yKGZpbmFsIElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRBY3RpdmVQYWdlKCk7Ci0JCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBmaWxlLCB0cnVlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlib29sZWFuIHBlcmZvcm1lZE9LID0gZmFsc2U7Ci0JCS8vIHNhdmUgdXNlciBvcHRpb25zIGZvciBuZXh0IHVzZQotCQlmTmV3RmlsZVRlbXBsYXRlc1BhZ2Uuc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gbm8gZmlsZSBleHRlbnNpb24gc3BlY2lmaWVkIHNvIGFkZCBkZWZhdWx0IGV4dGVuc2lvbgotCQlTdHJpbmcgZmlsZU5hbWUgPSBmTmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgPT0gLTEpIHsKLQkJCVN0cmluZyBuZXdGaWxlTmFtZSA9IGZOZXdGaWxlUGFnZS5hZGREZWZhdWx0RXh0ZW5zaW9uKGZpbGVOYW1lKTsKLQkJCWZOZXdGaWxlUGFnZS5zZXRGaWxlTmFtZShuZXdGaWxlTmFtZSk7Ci0JCX0KLQotCQkvLyBjcmVhdGUgYSBuZXcgZW1wdHkgZmlsZQotCQlJRmlsZSBmaWxlID0gZk5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotCQkvLyBpZiB0aGVyZSB3YXMgcHJvYmxlbSB3aXRoIGNyZWF0aW5nIGZpbGUsIGl0IHdpbGwgYmUgbnVsbCwgc28gbWFrZQotCQkvLyBzdXJlIHRvIGNoZWNrCi0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCS8vIHB1dCB0ZW1wbGF0ZSBjb250ZW50cyBpbnRvIGZpbGUKLQkJCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IGZOZXdGaWxlVGVtcGxhdGVzUGFnZS5nZXRUZW1wbGF0ZVN0cmluZygpOwotCQkJaWYgKHRlbXBsYXRlU3RyaW5nICE9IG51bGwpIHsKLQkJCQkvLyBkZXRlcm1pbmUgdGhlIGVuY29kaW5nIGZvciB0aGUgbmV3IGZpbGUKLQkJCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gSFRNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0KLQkJCQl0cnkgewotCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbnVsbDsKLQkJCQkJaWYgKGNoYXJTZXQgPT0gbnVsbCB8fCBjaGFyU2V0LnRyaW0oKS5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGp1c3QgdXNlIGRlZmF1bHQgZW5jb2RpbmcKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyU2V0KTsKLQkJCQkJfQotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUodGVtcGxhdGVTdHJpbmcpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIuZmx1c2goKTsKLQkJCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmNsb3NlKCk7Ci0JCQkJCUJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCQkJZmlsZS5zZXRDb250ZW50cyhpbnB1dFN0cmVhbSwgdHJ1ZSwgZmFsc2UsIG51bGwpOwotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgIkNvdWxkIG5vdCBjcmVhdGUgY29udGVudHMgZm9yIG5ldyBIVE1MIGZpbGUiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQotCQkJLy8gb3BlbiB0aGUgZmlsZSBpbiBlZGl0b3IKLQkJCW9wZW5FZGl0b3IoZmlsZSk7Ci0KLQkJCS8vIGV2ZXJ5dGhpbmcncyBmaW5lCi0JCQlwZXJmb3JtZWRPSyA9IHRydWU7Ci0JCX0KLQkJcmV0dXJuIHBlcmZvcm1lZE9LOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QvaHRtbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9IVE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMTQyMDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L2h0bWwvdWkvdmlld3MvY29udGVudG91dGxpbmUvSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS52aWV3cy5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuSFRNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkhUTUxOb2RlQWN0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlhNTE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmUuWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIG91dGxpbmUgdmlldyBwYWdlIHdoaWNoIHNob3dzIEhUTUwgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBleHRlbmRzIFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiB7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIEhUTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgSFRNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MTm9kZUFjdGlvbk1hbmFnZXIgY3JlYXRlTm9kZUFjdGlvbk1hbmFnZXIoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgSFRNTE5vZGVBY3Rpb25NYW5hZ2VyKChJU3RydWN0dXJlZE1vZGVsKSB0cmVlVmlld2VyLmdldElucHV0KCksIHRyZWVWaWV3ZXIpOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIEhUTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkvdGVtcGxhdGVzL2h0bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjM2FiNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotVGVtcGxhdGVzLmNvbW1lbnQubmFtZT1jb21tZW50Ci1UZW1wbGF0ZXMuY29tbWVudC5kZXNjPWNvbW1lbnQKLVRlbXBsYXRlcy51bC5uYW1lPXVsCi1UZW1wbGF0ZXMudWwuZGVzYz11bm9yZGVyZWQgbGlzdAotVGVtcGxhdGVzLnVsLmNvbnRlbnQ9PHVsPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvdWw+XG4KLVRlbXBsYXRlcy5kbC5uYW1lPWRsCi1UZW1wbGF0ZXMuZGwuZGVzYz1kZWZpbml0aW9uIGxpc3QKLVRlbXBsYXRlcy5kbC5jb250ZW50PTxkbD5cbiAgPGR0PiBGaXJzdCBkZWZpbml0aW9uPC9kdD4gIDxkZD4gIEZpcnN0IGV4cGxhbmF0aW9uPC9kZD5cbiAgPGR0PiBTZWNvbmQgZGVmaW5pdGlvbjwvZHQ+IDxkZD4gU2Vjb25kIGV4cGxhbmF0aW9uPC9kZD5cbjwvZGw+XG4KLVRlbXBsYXRlcy50YWJsZS5uYW1lPXRhYmxlCi1UZW1wbGF0ZXMudGFibGUuZGVzYz10YWJsZQotVGVtcGxhdGVzLnRhYmxlLmNvbnRlbnQ9PHRhYmxlPlxuICA8dHI+XG4gICAgPHRoPkNvbHVtbiAxIEhlYWRpbmc8L3RoPlxuICAgIDx0aD5Db2x1bW4gMiBIZWFkaW5nPC90aD5cbiAgPC90cj5cbiAgPHRyPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDE8L3RkPlxuICAgIDx0ZD5Sb3cgMTogQ29sIDI8L3RkPlxuICA8L3RyPlxuPC90YWJsZT5cbgotVGVtcGxhdGVzLm9sLm5hbWU9b2wKLVRlbXBsYXRlcy5vbC5kZXNjPW9yZGVyZWQgbGlzdAotVGVtcGxhdGVzLm9sLmNvbnRlbnQ9PG9sPlxuICA8bGk+IEl0ZW0gb25lIDwvbGk+XG4gIDxsaT4gSXRlbSB0d28gPC9saT5cbjwvb2w+XG4KLVRlbXBsYXRlcy5odG1sLm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSB0cmFuc2l0aW9uYWwpCi1UZW1wbGF0ZXMuaHRtbC5kZXNjPWh0bWwgNC4wMSB0cmFuc2l0aW9uYWwKLVRlbXBsYXRlcy5odG1sLmNvbnRlbnQ9PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+XG48aHRtbD5cbjxoZWFkPlxuPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9JHtlbmNvZGluZ30iPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMuaHRtbGZyYW1lc2V0Lm5hbWU9TmV3IEhUTUwgRmlsZSAoNC4wMSBmcmFtZXNldCkKLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuZGVzYz1odG1sIDQuMDEgZnJhbWVzZXQKLVRlbXBsYXRlcy5odG1sZnJhbWVzZXQuY29udGVudD08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBGcmFtZXNldC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9mcmFtZXNldC5kdGQiPlxuPGh0bWw+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9Ij5cbjx0aXRsZT5JbnNlcnQgdGl0bGUgaGVyZTwvdGl0bGU+XG48L2hlYWQ+XG48ZnJhbWVzZXQ+XG4gICAgPGZyYW1lPlxuICAgIDxmcmFtZT5cbiAgICA8bm9mcmFtZXM+XG4gICAgPGJvZHk+XG4gICAgPHA+VGhpcyBwYWdlIHVzZXMgZnJhbWVzLiBUaGUgY3VycmVudCBicm93c2VyIHlvdSBhcmUgdXNpbmcgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZXMuPC9wPlxuICAgIDwvYm9keT5cbiAgICA8L25vZnJhbWVzPlxuPC9mcmFtZXNldD5cbjwvaHRtbD4KLVRlbXBsYXRlcy54aHRtbC5uYW1lPU5ldyBYSFRNTCBGaWxlICgxLjAgdHJhbnNpdGlvbmFsKQotVGVtcGxhdGVzLnhodG1sLmRlc2M9eGh0bWwgMS4wIHRyYW5zaXRpb25hbAotVGVtcGxhdGVzLnhodG1sLmNvbnRlbnQ9PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iID8+XG48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+XG48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiAvPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxib2R5PlxuJHtjdXJzb3J9XG48L2JvZHk+XG48L2h0bWw+Ci1UZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5uYW1lPU5ldyBYSFRNTCBGaWxlICgxLjAgZnJhbWVzZXQpCi1UZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5kZXNjPXhodG1sIDEuMCBmcmFtZXNldAotVGVtcGxhdGVzLnhodG1sZnJhbWVzZXQuY29udGVudD08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSIke2VuY29kaW5nfSIgPz5cbjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIEZyYW1lc2V0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLWZyYW1lc2V0LmR0ZCI+XG48aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI+XG48aGVhZD5cbjxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSR7ZW5jb2Rpbmd9IiAvPlxuPHRpdGxlPkluc2VydCB0aXRsZSBoZXJlPC90aXRsZT5cbjwvaGVhZD5cbjxmcmFtZXNldD5cbiAgICA8ZnJhbWUgLz5cbiAgICA8ZnJhbWUgLz5cbiAgICA8bm9mcmFtZXM+XG4gICAgPGJvZHk+XG4gICAgPHA+VGhpcyBwYWdlIHVzZXMgZnJhbWVzLiBUaGUgY3VycmVudCBicm93c2VyIHlvdSBhcmUgdXNpbmcgZG9lcyBub3Qgc3VwcG9ydCBmcmFtZXMuPC9wPlxuICAgIDwvYm9keT5cbiAgICA8L25vZnJhbWVzPlxuPC9mcmFtZXNldD5cbjwvaHRtbD4KLVRlbXBsYXRlcy5zY3JpcHQubmFtZT1zY3JpcHQKLVRlbXBsYXRlcy5zY3JpcHQuZGVzYz1zY3JpcHQgICAgIChjb21tZW50ZWQpCi1UZW1wbGF0ZXMuc2NyaXB0LmNvbnRlbnQ9PHNjcmlwdCB0eXBlPVwiJHtjdXJzb3J9dGV4dC9qYXZhc2NyaXB0XCI+XG48IS0tXG5cbi8vLS0+XG48L3NjcmlwdD4KLVRlbXBsYXRlcy5zdHlsZS5uYW1lPXN0eWxlCi1UZW1wbGF0ZXMuc3R5bGUuZGVzYz1zdHlsZSAgICAgKGNvbW1lbnRlZCkKLVRlbXBsYXRlcy5zdHlsZS5jb250ZW50PTxzdHlsZT5cbjwhLS1cbiR7Y3Vyc29yfVxuLS0+XG48L3N0eWxlPgotVGVtcGxhdGVzLmltZ21hcC5uYW1lPWltZwotVGVtcGxhdGVzLmltZ21hcC5kZXNjPWltZyAgICAgKG1hcCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS90ZW1wbGF0ZXMvaHRtbGRlZmF1bHQtdGVtcGxhdGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUxODMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpL3RlbXBsYXRlcy9odG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx0ZW1wbGF0ZXM+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLmNvbW1lbnQubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuY29tbWVudC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmNvbW1lbnQiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7IS0tICR7Y3Vyc29yfSAtLSZndDs8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5pbWdtYXAubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuaW1nbWFwLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaW1nbWFwIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+Jmx0O2ltZyBpc21hcCZndDs8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy51bC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy51bC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnVsIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy51bC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuZGwubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMuZGwuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlbXBsYXRlcy5kbCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuZGwuY29udGVudDwvdGVtcGxhdGU+Ci0KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnRhYmxlLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnRhYmxlLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMudGFibGUiIGNvbnRleHQ9Imh0bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4lVGVtcGxhdGVzLnRhYmxlLmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5vbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5vbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLm9sIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5vbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuaHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5odG1sLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMuaHRtbCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuaHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuaHRtbGZyYW1lc2V0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLmh0bWxmcmFtZXNldC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLmh0bWxmcmFtZXNldCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuaHRtbGZyYW1lc2V0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy54aHRtbC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54aHRtbC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnhodG1sIiBjb250ZXh0PSJodG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy54aHRtbC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy54aHRtbGZyYW1lc2V0LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZW1wbGF0ZXMueGh0bWxmcmFtZXNldCIgY29udGV4dD0iaHRtbF9uZXciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMueGh0bWxmcmFtZXNldC5jb250ZW50PC90ZW1wbGF0ZT4KLQotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuc2NyaXB0Lm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnNjcmlwdC5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnNjcmlwdCIgY29udGV4dD0iaHRtbF90YWciIGVuYWJsZWQ9InRydWUiPiVUZW1wbGF0ZXMuc2NyaXB0LmNvbnRlbnQ8L3RlbXBsYXRlPgotCi08dGVtcGxhdGUgbmFtZT0iJVRlbXBsYXRlcy5zdHlsZS5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5zdHlsZS5kZXNjIiBpZD0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVtcGxhdGVzLnN0eWxlIiBjb250ZXh0PSJodG1sX3RhZyIgZW5hYmxlZD0idHJ1ZSI+JVRlbXBsYXRlcy5zdHlsZS5jb250ZW50PC90ZW1wbGF0ZT4KLQotPC90ZW1wbGF0ZXM+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY2xhc3NwYXRoIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzOTVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYy1lbmNvZGluZyIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYyIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYy10YXNrdGFncyIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYy1jb250ZW50cHJvcGVydGllcyIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIga2luZD0iY29uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIga2luZD0iY29uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9ImJpbiIga2luZD0ib3V0cHV0Ii8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzEyMzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbgotbW9kZWwuamFyCi1idWlsZC54bWwKLXRlbXAuZm9sZGVyCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmVfMS4wLjAuamFyCi1AZG90Ci1zcmMuemlwCi0uZmJ3YXJuaW5ncwotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLm9wdGlvbnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDgzY2VlZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9tL2FkYXB0ZXIvbm90aWZpY2F0aW9uL3RpbWU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZS9jcml0ZXJpYT0xMAotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRkb2N1bWVudD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL21vZGVsbWFuYWdlbWVudD1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xpZmVjeWNsZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9saWZlY3ljbGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvc3RhdGU9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbG9ja3M9dHJ1ZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9tb2RlbG1hbmFnZXI9ZmFsc2UKLW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcz1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2RldGVjdGlvbj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2pvYj1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL292ZXJhbGx0aW1lPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvdGltZT1mYWxzZQotb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL3ByZWZlcmVuY2VzPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcmVnaXN0cnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YzViMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4NCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40DQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKLW9yZy5lY2xpcHNlLmpkdC51aS50ZXh0LmN1c3RvbV9jb2RlX3RlbXBsYXRlcz08P3htbCB2ZXJzaW9uXD0iMS4wIiBlbmNvZGluZ1w9IlVURi04Ij8+XHJcbjx0ZW1wbGF0ZXMvPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotI01vbiBBcHIgMTcgMDI6MDE6MzMgRURUIDIwMDYKLWNvbXBpbGVycy5pbmNvbXBhdGlibGUtZW52aXJvbm1lbnQ9MAotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZmU1OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuY3NzOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0lJQotCi0lewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0KLQlwdWJsaWMgQ1NTSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0gIAkJCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQkKLQotJX0KLQotJWVvZnsKLQloYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIENTU0hlYWRUb2tlbml6ZXIKLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuCi0ldHlwZSBTdHJpbmcKLSVjaGFyCi0ldW5pY29kZQotJWlnbm9yZWNhc2UgCi0lZGVidWcKLSVzd2l0Y2gKLQotCi1VVEYxNkJFID0gXHhGRVx4RkYKLVVURjE2TEUgPSBceEZGXHhGRQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGCi0KLS8vU3BhY2VDaGFyID0gW1x4MjBceDA5XQotCi0KLQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsKLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0KLQotQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoKLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbgotCi0KLSVzdGF0ZSBTVF9YTUxEZWNsCi0lc3RhdGUgQ0hBUlNFVF9SVUxFCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUKLSVzdGF0ZSBEUV9TVFJJTkcKLSVzdGF0ZSBTUV9TVFJJTkcKLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZwotCi0lJQotCi0KLTxZWUlOSVRJQUw+ICAKLXsKLQl7VVRGMTZCRX0gICAJCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO30KLQl7VVRGMTZMRX0gICAJCXtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO30KLQl7VVRGODNCeXRlQk9NfSAgIAl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO30KLQotCS8vIGZvcmNlIHRvIGJlIHN0YXJ0ZWQgb24gZmlyc3QgbGluZSwgYnV0IHdlIGRvIGFsbG93IHByZWNlZWRpbmcgc3BhY2VzCi0JXiB7U30qICI8XD94bWwiIHtTfSsge2lmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fX0KLQkKLQleIHtTfSogIkBjaGFyc2V0IiAgICAge2lmICh5eWNoYXIgPT0gMCApICB7eXliZWdpbihDSEFSU0VUX1JVTEUpOyByZXR1cm4gQ1NTSGVhZFRva2VuaXplckNvbnN0YW50cy5DSEFSU0VUX1JVTEU7fX0KLQkKLQotfQkKLQotLy8gSSBkb24ndCB0aGluayB0aGVyZSdzIHJlYWxseSBhbiBYTUwgZm9ybSBvZiBDU1MgZmlsZXMgLi4uIGJ1dCB3aWxsIGxlYXZlIGhlcmUgZm9yIGNvbnNpc3RlbmN5CQotPFNUX1hNTERlY2w+IAotewotCS8vInZlcnNpb24iIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xWZXJzaW9uO30KLQkiZW5jb2RpbmciIHtCZWdpbkF0dHJpYmVWYWx1ZX0ge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nO30KLQkvLyBub3RlIHRoaXMgImZvcmNlZCBlbmQiIG9uY2UgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotCSJcPz4iICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kO30KLX0JCi0KLTxDSEFSU0VUX1JVTEU+IAotewotCi0Je1N9KiAge3B1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7fQotCSI7IiAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuUnVsZUVuZDt9Ci19Ci0JCi0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4KLXsKLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotCVwnCQkJeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcKLQl7U30qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9Ci0KLX0JCi0KLQotPERRX1NUUklORz4KLXsKLQotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JIj4iCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlwvPiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjsiICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0JCi0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFNRX1NUUklORz4KLXsKLQotCVwnICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiJT4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjwiCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIj4iCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlwvPiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIjsiICAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFVuRGVsaW1pdGVkU3RyaW5nPgotewotCi0KLQl7U30gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotCVwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JXCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkiPiIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXC8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiOyIgICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLX0KLQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZwotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkKLTxZWUlOSVRJQUwsIFNUX1hNTERlY2wsIFF1b3RlZEF0dHJpYnV0ZVZhbHVlLCBDSEFSU0VUX1JVTEU+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL0NTU0hlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGZjMzg1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDQgNjo0MiBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLmNzczsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiAxLzI3LzA0IDY6NDIgUE0gZnJvbSB0aGUgc3BlY2lmaWNhdGlvbiBmaWxlCi0gKiA8dHQ+ZmlsZTovRDovRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIENTU0hlYWRUb2tlbml6ZXIgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgQ0hBUlNFVF9SVUxFID0gNDsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw2XDFcMTFcMlwwXDFcMTBcMjJcMFwxXDZcMVwwXDFcMzZcMlwwIisKLSAgICAiXDFcNDFcMVwwXDFcMzdcN1wwXDFcNDBcMTNcMFwxXDM1XDFcMTJcMVw3XDFcMzQiKwotICAgICJcMVwxM1wxXDE3XDFcMjJcMVwwXDFcMjBcMVwzMVwxXDI1XDFcMFwxXDMzXDFcMjEiKwotICAgICJcMVwzMlwyXDBcMVwxNlwxXDE1XDFcMjdcMVwzMFwyXDBcMVwyM1wxXDI0XDFcMjYiKwotICAgICJcM1wwXDFcMTRcMTBcMFwxXDIyXDFcMFwxXDIwXDFcMzFcMVwyNVwxXDBcMVwzMyIrCi0gICAgIlwxXDIxXDFcMzJcMlwwXDFcMTZcMVwxNVwxXDI3XDFcMzBcMlwwXDFcMjNcMVwyNCIrCi0gICAgIlwxXDI2XDNcMFwxXDE0XDEwMlwwXDFcNFwzXDBcMVw1XDE3XDBcMVwzXDE2XDAiKwotICAgICJcMVwxXDIwXDBcMVwzXDE2XDBcMVwxXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSAxMDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQotCXB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotCSAgCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkgIAl5eV9yZWFkZXIgPSBpbjsKLQotICAJCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgCQl5eV9zdGF0ZSA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIAkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAJCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgCQkgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIAkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAJCXl5X21hcmtlZFBvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAJCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0gIAkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfc3RhcnRSZWFkID0gMDsKLQotICAJCS8qKiAKLSAgCQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgCQkgKiBmcm9tIGlucHV0IAotICAJCSAqLwotICAJCXl5X2VuZFJlYWQgPSAwOwotCi0gIAkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXlsaW5lID0gMDsKLQotICAJCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5Y2hhciA9IDA7Ci0KLSAgCQkvKioKLSAgCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydAotICAJCSAqIG9mIHRoZSBtYXRjaGVkIHRleHQKLSAgCQkgKi8KLSAgCQl5eWNvbHVtbiA9IDA7IAotCi0gIAkJLyoqIAotICAJCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIAotICAJCSAqIG9mIGEgbGluZQotICAJCSAqLwotICAJCXl5X2F0Qk9MID0gZmFsc2U7Ci0KLSAgCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIAkJeXlfYXRFT0YgPSBmYWxzZTsKLQotICAJCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICAJCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotICAJCWZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0gIAkJCi0gIAkJaGFzTW9yZSA9IHRydWU7Ci0gIAkJCi0JCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLQkJLy8gYnkgY2xhc3MgaW5pdCAodmlhIGF1dG8gZ2VuZXJhdGVkIGNvZGUpLCBidXQgd2UgcmVhbGx5IGRvIHdhbnQKLQkJLy8gYSBzbWFsbCBidWZmZXIgZm9yIG91ciBoZWFkIHBhcnNlcnMuCi0JCWlmICh5eV9idWZmZXIubGVuZ3RoICE9IE1BWF9UT19TQ0FOKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltNQVhfVE9fU0NBTl07Ci0JCX0KLSAgCQkKLQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQotCQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTU4KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogCi0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDMyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgICAgICAgY2FzZSAzMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogeXlfc3RhdGUgPSAzNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gMzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSA0MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDQzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDM3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTI6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA0OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNDM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9zdGF0ZSA9IDUyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9zdGF0ZSA9IDU1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDU3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfc3RhdGUgPSA1ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA1OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHl5X3N0YXRlID0gNjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogeXlfc3RhdGUgPSA2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSA2NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuUnVsZUVuZDsgfQotICAgICAgICBjYXNlIDY4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDcwOiBicmVhazsKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSAge3l5YmVnaW4oQ0hBUlNFVF9SVUxFKTsgcmV0dXJuIENTU0hlYWRUb2tlbml6ZXJDb25zdGFudHMuQ0hBUlNFVF9SVUxFO30gfQotICAgICAgICBjYXNlIDcxOiBicmVhazsKLSAgICAgICAgY2FzZSA1NjogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O30gfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTE6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNjogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDczOiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgNzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYzOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgNzU6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IH0KLSAgICAgICAgY2FzZSA3NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NOyB9Ci0gICAgICAgIGNhc2UgNzc6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7IH0KLSAgICAgICAgY2FzZSA3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTsgfQotICAgICAgICBjYXNlIDc5OiBicmVhazsKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7ICBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyAgfQotICAgICAgICBjYXNlIDgwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyAgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDgxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMjogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDgyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDgzOiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgIH0KLSAgICAgICAgY2FzZSA4NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDg1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDg2OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIENTU0hlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IENTU0hlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBDU1NIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvQ1NTSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjA2ZTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9DU1NIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi1AZWNobyBvZmYNCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtkOmpka3NcajJzZGsxLjQuMV8wMlxiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFB1cmVIZWFkV29ya3NwYWNlDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9Q1NTSGVhZFRva2VuaXplcg0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWNcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXGVuY29kaW5nXHJlc291cmNlXGNvbnRlbnRzcGVjaWZpY1xjc3NcDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXJlbSBwYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0NTU0hlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvQ1NTSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA3NDNjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9DU1NIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotUmVhZGluZyAiQ1NTSGVhZFRva2VuaXplci5qZmxleCIKLUNvbnN0cnVjdGluZyBORkEgOiA0NTggc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0xMDIgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDY0IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIkNTU0hlYWRUb2tlbml6ZXIuamF2YSIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzkyM2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXIuakZsZXgKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5odG1sOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5FbmNvZGluZ1BhcnNlckNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5IZWFkUGFyc2VyVG9rZW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSW50U3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMueG1sLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0lJQotCi0lewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQlib29sZWFuIGZvdW5kQ29udGVudFR5cGVWYWx1ZSA9IGZhbHNlOwotCi0KLQotCXB1YmxpYyBIVE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotCQkvLyBpdHMgYSBsaXR0bGUgd2FzdGVmdWwgdG8gInRocm93IGF3YXkiIGZpcnN0IGNoYXIgYXJyYXkgZ2VuZXJhdGVkCi0JCS8vIGJ5IGNsYXNzIGluaXQgKHZpYSBhdXRvIGdlbmVyYXRlZCBjb2RlKSwgYnV0IHdlIHJlYWxseSBkbyB3YW50Ci0JCS8vIGEgc21hbGwgYnVmZmVyIGZvciBvdXIgaGVhZCBwYXJzZXJzLgotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBNQVhfVE9fU0NBTikgewotCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotCQl9Ci0gIAkJCi0KLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0KLQkKLQotJX0KLQotJWVvZnsKLQloYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIEhUTUxIZWFkVG9rZW5pemVyCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbgotJXR5cGUgU3RyaW5nCi0lY2hhcgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlIAotJWRlYnVnCi0lc3dpdGNoCi0KLQotVVRGMTZCRSA9IFx4RkVceEZGCi1VVEYxNkxFID0gXHhGRlx4RkUKLVVURjgzQnl0ZUJPTSA9IFx4RUZceEJCXHhCRgotCi1TcGFjZUNoYXIgPSBbXHgyMFx4MDldCi0KLQotCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKwotUyA9IFtceDIwXHgwOVx4MERceDBBXQotCi1CZWdpbkF0dHJpYmVWYWx1ZSA9IHtTfSogXD0ge1N9KgotCi1MaW5lVGVybWluYXRvciA9IFxyfFxuCi0KLQotJXN0YXRlIFNUX1hNTERlY2wKLSVzdGF0ZSBTVF9NRVRBX1RBRwotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPiAgCi17Ci0Je1VURjE2QkV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9Ci0Je1VURjE2TEV9ICAgCQl7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZMRTt9Ci0Je1VURjgzQnl0ZUJPTX0gICAJe2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9Ci0KLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcwotCV4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0JCi0JIjxNRVRBICIgICAgICAge3l5YmVnaW4oU1RfTUVUQV9UQUcpOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0O30KLQkKLQotfQkKLQkKLTxTVF9YTUxEZWNsPiAKLXsKLQkvLyJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9Ci0JImVuY29kaW5nIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9Ci0JLy8gbm90ZSB0aGlzICJmb3JjZWQgZW5kIiBvbmNlIGVuZCBvZiBYTUwgRGVjbGFyYXRpb24gZm91bmQKLQkiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyAgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9Ci19CQotCi08U1RfTUVUQV9UQUc+IAotewotCi0JImh0dHAtZXF1aXYiIHtTfSogXD0ge1N9KiBcIj8gIkNvbnRlbnQtVHlwZSIgXCI/IHtTfSsgImNvbnRlbnQiIHtCZWdpbkF0dHJpYmVWYWx1ZX0gIHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTt9Ci0JIj4iICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyAgaWYgKGZvdW5kQ29udGVudFR5cGVWYWx1ZSkgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ0VuZDt9Ci0JIlwvPiIgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7IGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7fQotfQotCQotCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0JXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQlcJwkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0Je1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19CQotCi0KLTxEUV9TVFJJTkc+Ci17Ci0KLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCQotCSI+IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcLz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxTUV9TVFJJTkc+Ci17Ci0KLQlcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI+IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcLz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxVbkRlbGltaXRlZFN0cmluZz4KLXsKLQotCi0JLy8gbm90ZSB0aGlzIGluaXRpYWwgc3BlY2lhbCBjYXNlIGZvciBIVFRQIGNvbnRlbnR0eXBlIHZhbHVlcwotCSI7IntTfSoJCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQl7U30gICAgICAgICAgICAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXD8+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSI8IgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotCVwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JXCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkiPiIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiXC8+IgkJCXsgeXlwdXNoYmFjaygyKTsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLX0KLQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZwotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkKLTxZWUlOSVRJQUwsIFNUX1hNTERlY2wsIFF1b3RlZEF0dHJpYnV0ZVZhbHVlLCBTVF9NRVRBX1RBRz4KLXsKLS8vIHRoaXMgaXMgdGhlIGZhbGxiYWNrIChtYXRjaCAiYW55dGhpbmciKSBydWxlICAoZm9yIHRoaXMgc2Nhbm5lciwgaW5wdXQgaXMgaWdub3JlZCwgYW5kIHBvc2l0aW9uIGFkdmFuY2VkLCBpZiBub3QgcmVjb2duaXplZCkKLS58XG4gICAgICAgICAgICAgIHtpZiAoeXljaGFyID4gTUFYX1RPX1NDQU4pIHtoYXNNb3JlPWZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuTUFYX0NIQVJTX1JFQUNIRUQ7fX0KLX0KLQotLy8gdGhpcyBydWxlIGFsd2F5cyBpbiBlZmZlY3QKLTw8RU9GPj4gICAgICAgICB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GO30KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWVjMGY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDEvMjcvMDQgNjo0MSBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLmh0bWw7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkhlYWRQYXJzZXJUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy5JbnRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpYy54bWwuWE1MSGVhZFRva2VuaXplckNvbnN0YW50czsKLQotCi0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMS8yNy8wNCA2OjQxIFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL0hUTUxIZWFkVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEhUTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVUQV9UQUcgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUlOSVRJQUwgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBVbkRlbGltaXRlZFN0cmluZyA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBEUV9TVFJJTkcgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTUV9TVFJJTkcgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNjsKLQotICAvKioKLSAgICogWVlfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWVlfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgWVlfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCAgNiwgIDcsIDcKLSAgfTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw2XDFcN1wyXDBcMVwxMVwyMlwwXDFcMjJcMVwwXDFcNDBcMlwwIisKLSAgICAiXDFcNDRcMVwwXDFcNDNcNVwwXDFcMzRcMVwwXDFcNDJcMTNcMFwxXDQ1XDFcMTIiKwotICAgICJcMVwxMFwxXDMxXDFcMTNcMVwwXDFcMjFcMVwwXDFcMjRcMVwyNlwxXDE3XDFcMCIrCi0gICAgIlwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1XDFcMjNcMVwyNVwxXDMzXDFcMzUiKwotICAgICJcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0XDFcNDFcN1wwXDFcMjFcMVwwIisKLSAgICAiXDFcMjRcMVwyNlwxXDE3XDFcMFwxXDMwXDFcMzJcMVwyN1wyXDBcMVwxNlwxXDE1IisKLSAgICAiXDFcMjNcMVwyNVwxXDMzXDFcMzVcMlwwXDFcMjBcMVwzNlwxXDM3XDFcMFwxXDE0IisKLSAgICAiXDFcNDFcMTAxXDBcMVw0XDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMCIrCi0gICAgIlwxXDNcMTZcMFwxXDFcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0JYm9vbGVhbiBmb3VuZENvbnRlbnRUeXBlVmFsdWUgPSBmYWxzZTsKLQotCi0KLQlwdWJsaWMgSFRNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0JICAJLyogdGhlIGlucHV0IGRldmljZSAqLwotCSAgCXl5X3JlYWRlciA9IGluOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAJCXl5X3N0YXRlID0gMDsKLQotICAJCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgCQl5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIAkJLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAJCSB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgCQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIAkJeXlfbWFya2VkUG9zID0gMDsKLQotICAJCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIAkJeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIAkJeXlfY3VycmVudFBvcyA9IDA7Ci0KLSAgCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9zdGFydFJlYWQgPSAwOwotCi0gIAkJLyoqIAotICAJCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAJCSAqIGZyb20gaW5wdXQgCi0gIAkJICovCi0gIAkJeXlfZW5kUmVhZCA9IDA7Ci0KLSAgCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWxpbmUgPSAwOwotCi0gIAkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIAkJeXljaGFyID0gMDsKLQotICAJCS8qKgotICAJCSAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gIAkJICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAJCSAqLwotICAJCXl5Y29sdW1uID0gMDsgCi0KLSAgCQkvKiogCi0gIAkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgCi0gIAkJICogb2YgYSBsaW5lCi0gIAkJICovCi0gIAkJeXlfYXRCT0wgPSBmYWxzZTsKLQotICAJCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgCQl5eV9hdEVPRiA9IGZhbHNlOwotCi0gIAkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIAkJeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0gIAkJZlN0YXRlU3RhY2suY2xlYXIoKTsKLSAgCQkKLSAgCQloYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLQkJLy8gaXRzIGEgbGl0dGxlIHdhc3RlZnVsIHRvICJ0aHJvdyBhd2F5IiBmaXJzdCBjaGFyIGFycmF5IGdlbmVyYXRlZAotCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudAotCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLQkJCXl5X2J1ZmZlciA9IG5ldyBjaGFyW01BWF9UT19TQ0FOXTsKLQkJfQotICAJCQotCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9Ci0JCi0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBIVE1MSGVhZFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3NCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgeXlfYXRCT0wgPSB5eV9tYXJrZWRQb3MgPD0gMCB8fCB5eV9idWZmZXJbeXlfbWFya2VkUG9zLTFdID09ICdcbic7Ci0gICAgICBpZiAoIXl5X2F0Qk9MICYmIHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xyJykgewotICAgICAgICB5eV9hdEJPTCA9IHl5X2FkdmFuY2UoKSAhPSAnXG4nOwotICAgICAgICBpZiAoIXl5X2F0RU9GKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICBpZiAoeXlfYXRCT0wpCi0gICAgICAgIHl5X3N0YXRlID0gWVlfTEVYU1RBVEVbeXlfbGV4aWNhbF9zdGF0ZSsxXTsKLSAgICAgIGVsc2UKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlXTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIHl5X2lucHV0ID0geXljbWFwW3l5X2lucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4geXlfaXNGaW5hbCA9IGZhbHNlOwotICAgICAgICAgIGJvb2xlYW4geXlfbm9Mb29rQWhlYWQgPSBmYWxzZTsKLQotICAgICAgICAgIHl5X2Zvck5leHQ6IHsgc3dpdGNoICh5eV9zdGF0ZSkgewotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTE6IAotICAgICAgICAgICAgICAgIGNhc2UgMzQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzY6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogCi0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMzI6IAotICAgICAgICAgICAgICAgIGNhc2UgMzU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gMzU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDM2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSAzNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMzogeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNDE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDQyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfc3RhdGUgPSA0NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDMyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDQ3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA0ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogeXlfc3RhdGUgPSAzODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTE6IHl5X3N0YXRlID0gMzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB5eV9zdGF0ZSA9IDQ5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA1MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDQ0OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA1NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHl5X3N0YXRlID0gNTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB5eV9zdGF0ZSA9IDU2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNDogeXlfc3RhdGUgPSA1NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjI6IHl5X3N0YXRlID0gNTg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDU5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDYxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfc3RhdGUgPSA2MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTU6IHl5X3N0YXRlID0gNjM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA2MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHl5X3N0YXRlID0gNjQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI5OiB5eV9zdGF0ZSA9IDY1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogeXlfc3RhdGUgPSA2NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzA6IHl5X3N0YXRlID0gNjc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDY2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9zdGF0ZSA9IDY5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDY4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNjg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDMxOiB5eV9zdGF0ZSA9IDcwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA3MDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IHl5X3N0YXRlID0gNzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDcxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHl5X3N0YXRlID0gNzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSA3MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHl5X3N0YXRlID0gNzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDcyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA3NTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNzY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDc3OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDc3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA3ODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gNzk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNzk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI4OiB5eV9zdGF0ZSA9IDgwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogeXlfc3RhdGUgPSA4MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4MToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMzM6IHl5X3N0YXRlID0gODI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB5eV9zdGF0ZSA9IDgzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDgzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogeXlfc3RhdGUgPSA4NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAzMjogeXlfc3RhdGUgPSA4NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMDogeXlfc3RhdGUgPSA4NzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IAotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHl5X3N0YXRlID0gODU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgODc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIxOiB5eV9zdGF0ZSA9IDg4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA4OTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gOTA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9zdGF0ZSA9IDkxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOTogeXlfc3RhdGUgPSA5MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gOTM7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9zdGF0ZSA9IDkzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgODogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgICAgICAgICBjYXNlIDE4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA5NDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX0lMTEVHQUxfU1RBVEUpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IH0KLQotICAgICAgICAgIGlmICggeXlfaXNGaW5hbCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCB5eV9ub0xvb2tBaGVhZCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgOTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLSAgICAgICAgY2FzZSA5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgIGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7IH0KLSAgICAgICAgY2FzZSA5ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFlZSU5JVElBTCk7IGlmIChmb3VuZENvbnRlbnRUeXBlVmFsdWUpIGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdFbmQ7IH0KLSAgICAgICAgY2FzZSAxMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSAxMDE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDEwMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9IH0KLSAgICAgICAgY2FzZSAxMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9IH0KLSAgICAgICAgY2FzZSAxMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1RfTUVUQV9UQUcpOyByZXR1cm4gSFRNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuTWV0YVRhZ1N0YXJ0OyB9Ci0gICAgICAgIGNhc2UgMTA1OiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgICAgeyB5eWJlZ2luKFlZSU5JVElBTCk7ICByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgMTA2OiBicmVhazsKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgICAgeyBwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyBmb3VuZENvbnRlbnRUeXBlVmFsdWU9dHJ1ZTsgcmV0dXJuIEhUTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLk1ldGFUYWdDb250ZW50VHlwZTsgfQotICAgICAgICBjYXNlIDEwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7IH0KLSAgICAgICAgY2FzZSAxMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7IH0KLSAgICAgICAgY2FzZSAxMDk6IGJyZWFrOwotICAgICAgICBjYXNlIDM0OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7IH0KLSAgICAgICAgY2FzZSAxMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTsgfQotICAgICAgICBjYXNlIDExMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICAgIHsgIHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7ICB9Ci0gICAgICAgIGNhc2UgMTEyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSAxMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7ICB9Ci0gICAgICAgIGNhc2UgMTE0OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgICAgeyAgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyAgfQotICAgICAgICBjYXNlIDExNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDExNjogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuRU9GOyB9Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBIVE1MSGVhZFRva2VuaXplciBzY2FubmVyID0gbnVsbDsKLSAgICAgIHRyeSB7Ci0gICAgICAgIHNjYW5uZXIgPSBuZXcgSFRNTEhlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBIVE1MSGVhZFRva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvSFRNTEhlYWRUb2tlbml6ZXJHZW5KYXZhLmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZmMjMyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9IVE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotQGVjaG8gb2ZmDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7ZDpqZGtzXGoyc2RrMS40LjFfMDJcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xQdXJlSGVhZFdvcmtzcGFjZQ0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPUhUTUxIZWFkVG9rZW5pemVyDQotc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3QuY29tbW9uLmVuY29kaW5nLmNvbnRlbnRzcGVjaWZpY1xzcmNcDQotc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cZW5jb2RpbmdccmVzb3VyY2VcY29udGVudHNwZWNpZmljXGh0bWxcDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXJlbSBwYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4ZXJyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9IVE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvSFRNTEhlYWRUb2tlbml6ZXIvamZsZXhvdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDY5ZTljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL0hUTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotUmVhZGluZyAiSFRNTEhlYWRUb2tlbml6ZXIuamZsZXgiCi0KLVdhcm5pbmcgOiBNYWNybyAiU3BhY2VDaGFyIiBoYXMgYmVlbiBkZWNsYXJlZCBidXQgbmV2ZXIgdXNlZC4KLUNvbnN0cnVjdGluZyBORkEgOiA2NjAgc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCi0xMzUgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDk1IHN0YXRlcyBpbiBtaW5pbWl6ZWQgREZBCi1Xcml0aW5nIGNvZGUgdG8gIkhUTUxIZWFkVG9rZW5pemVyLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuakZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGQwZjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmpGbGV4CisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbC5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0lJQotCi0ldGFibGUKLSVwdWJsaWMKLSVmaW5hbAotJWNsYXNzIFhNTDEwTmFtZXMKLSVmdW5jdGlvbiBpc1ZhbGlkWE1MMTBOYW1lCi0ldHlwZSBib29sZWFuCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLSVidWZmZXIgMjA0OAotJWFwaXByaXZhdGUKLQotUyA9IChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKQotCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdCi0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQotCi1Db21iaW5pbmdDaGFyID0gW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0KLQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0KLQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQotCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pCi0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQotCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDogKSAoe05hbWVDaGFyfSkqCi0KLQotCi0lewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICovCi0JcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0JCXRoaXMuenpSZWFkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotCQl9Ci0JCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotCQkJLy8gIm5vdCIKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0lfQotCi0KLQotCi0lJQotCi08WVlJTklUSUFMPgotewotCi0JLy8gZG9uJ3QgbWF0Y2ggaWYgY29udGFpbnMgdHJhaWxpbmcgb3IgZW1iZWRkZWQgc3BhY2UKLQl7TmFtZX0ge1N9KyAgICAgICAgIHtyZXR1cm4gZmFsc2U7fQotCXtOYW1lfSB7U30rIHtOYW1lfSAge3JldHVybiBmYWxzZTt9Ci0KLQl7TmFtZX0gICAgICAgICAgICAgIHtyZXR1cm4gdHJ1ZTt9Ci0KLQkvLyBtYXRjaCBhbnl0aGluZyBzaG91bGQgY29tZSBsYXN0Ci0JLiAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQotfQotCi0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+Ci17Ci0Je3JldHVybiBmYWxzZTt9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdiZGNmMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQgb24gNy8xNy8wNCAzOjQzIEFNICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbC5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5qZmxleC5kZS8iPkpGbGV4PC9hPiAxLjQKLSAqIG9uIDcvMTcvMDQgMzo0MyBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5YTUwxME5hbWVzLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhNTDEwTmFtZXMgewotCi0gIC8qKiBUaGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gMjA0ODsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZSU5JVElBTCA9IDA7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTFcMFwxXDFcMVwyXDJcMFwxXDFcMjJcMFwxXDFcMTRcMFwxXDBcMlwwIisKLSAgICAiXDEyXDBcMVwzXDZcMFwzMlwzXDRcMFwxXDNcMVwwXDMyXDNcNzRcMFwxXDAiKwotICAgICJcMTBcMFwyN1wzXDFcMFwzN1wzXDFcMFw3MlwzXDJcMFwxM1wzXDJcMFwxMFwzIisKLSAgICAiXDFcMFw2NVwzXDFcMFwxMDRcM1wxMVwwXDQ0XDNcM1wwXDJcM1w0XDBcMzZcMyIrCi0gICAgIlw3MFwwXDEzMVwzXDIyXDBcN1wzXDE2XDBcMlwwXDU2XDBcMTA2XDBcMzJcMFwyXDAiKwotICAgICJcNDRcMFwxXDNcMVwwXDNcM1wxXDBcMVwzXDFcMFwyNFwzXDFcMFw1NFwzIisKLSAgICAiXDFcMFw3XDNcM1wwXDFcM1wxXDBcMVwzXDFcMFwxXDNcMVwwXDFcMyIrCi0gICAgIlwxXDBcMjJcM1wxNVwwXDE0XDNcMVwwXDEwMlwzXDFcMFwxNFwzXDFcMFw0NFwzIisKLSAgICAiXDFcMFw0XDBcMTFcMFw2NVwzXDJcMFwyXDNcMlwwXDJcM1wzXDBcMzRcMyIrCi0gICAgIlwyXDBcMTBcM1wyXDBcMlwzXDY3XDBcNDZcM1wyXDBcMVwzXDdcMFw0NlwzIisKLSAgICAiXDEyXDBcMjFcMFwxXDBcMjdcMFwxXDBcM1wwXDFcMFwxXDBcMVwwXDJcMCIrCi0gICAgIlwxXDBcMVwwXDEzXDBcMzNcM1w1XDBcM1wzXDU2XDBcMzJcM1w1XDBcMVwwIisKLSAgICAiXDEyXDNcMTBcMFwxNVwwXDEyXDBcNlwwXDFcMFwxMDdcM1wyXDBcNVwzXDFcMCIrCi0gICAgIlwxN1wzXDFcMFw0XDNcMVwwXDFcM1wxN1wwXDJcM1wyXDBcMVwwXDRcMCIrCi0gICAgIlwyXDBcMTJcMFx1MDIwN1wwXDNcMFwxXDBcNjVcM1wyXDBcMVwwXDFcM1wyMFwwIisKLSAgICAiXDNcMFw0XDBcM1wwXDEyXDNcMlwwXDJcMFwxMlwwXDIxXDBcM1wwXDFcMCIrCi0gICAgIlwxMFwzXDJcMFwyXDNcMlwwXDI2XDNcMVwwXDdcM1wxXDBcMVwzXDNcMCIrCi0gICAgIlw0XDNcMlwwXDFcMFwxXDBcN1wwXDJcMFwyXDBcMlwwXDNcMFwxMVwwIisKLSAgICAiXDFcMFw0XDBcMlwzXDFcMFwzXDNcMlwwXDJcMFwxMlwwXDJcM1wyMFwwIisKLSAgICAiXDFcMFwyXDBcNlwzXDRcMFwyXDNcMlwwXDI2XDNcMVwwXDdcM1wxXDAiKwotICAgICJcMlwzXDFcMFwyXDNcMVwwXDJcM1wyXDBcMVwwXDFcMFw1XDBcNFwwIisKLSAgICAiXDJcMFwyXDBcM1wwXDEzXDBcNFwzXDFcMFwxXDNcN1wwXDEyXDBcMlwwIisKLSAgICAiXDNcM1wxNFwwXDNcMFwxXDBcN1wzXDFcMFwxXDNcMVwwXDNcM1wxXDAiKwotICAgICJcMjZcM1wxXDBcN1wzXDFcMFwyXDNcMVwwXDVcM1wyXDBcMVwwXDFcMyIrCi0gICAgIlwxMFwwXDFcMFwzXDBcMVwwXDNcMFwyMlwwXDFcM1w1XDBcMTJcMFwyMVwwIisKLSAgICAiXDNcMFwxXDBcMTBcM1wyXDBcMlwzXDJcMFwyNlwzXDFcMFw3XDNcMVwwIisKLSAgICAiXDJcM1wyXDBcNFwzXDJcMFwxXDBcMVwzXDZcMFwzXDBcMlwwXDJcMCIrCi0gICAgIlwzXDBcMTBcMFwyXDBcNFwwXDJcM1wxXDBcM1wzXDRcMFwxMlwwXDIyXDAiKwotICAgICJcMlwwXDFcMFw2XDNcM1wwXDNcM1wxXDBcNFwzXDNcMFwyXDNcMVwwIisKLSAgICAiXDFcM1wxXDBcMlwzXDNcMFwyXDNcM1wwXDNcM1wzXDBcMTBcM1wxXDAiKwotICAgICJcM1wzXDRcMFw1XDBcM1wwXDNcMFwxXDBcNFwwXDExXDBcMVwwXDE3XDAiKwotICAgICJcMTFcMFwyMVwwXDNcMFwxXDBcMTBcM1wxXDBcM1wzXDFcMFwyN1wzXDFcMCIrCi0gICAgIlwxMlwzXDFcMFw1XDNcNFwwXDdcMFwxXDBcM1wwXDFcMFw0XDBcN1wwIisKLSAgICAiXDJcMFwxMVwwXDJcM1w0XDBcMTJcMFwyMlwwXDJcMFwxXDBcMTBcM1wxXDAiKwotICAgICJcM1wzXDFcMFwyN1wzXDFcMFwxMlwzXDFcMFw1XDNcNFwwXDdcMFwxXDAiKwotICAgICJcM1wwXDFcMFw0XDBcN1wwXDJcMFw3XDBcMVwzXDFcMFwyXDNcNFwwIisKLSAgICAiXDEyXDBcMjJcMFwyXDBcMVwwXDEwXDNcMVwwXDNcM1wxXDBcMjdcM1wxXDAiKwotICAgICJcMjBcM1w0XDBcNlwwXDJcMFwzXDBcMVwwXDRcMFwxMVwwXDFcMFwxMFwwIisKLSAgICAiXDJcM1w0XDBcMTJcMFwyMjFcMFw1NlwzXDFcMFwxXDNcMVwwXDJcM1w3XDAiKwotICAgICJcNVwwXDZcM1wxXDBcMTBcMFwxXDBcMTJcMFw0N1wwXDJcM1wxXDBcMVwzIisKLSAgICAiXDJcMFwyXDNcMVwwXDFcM1wyXDBcMVwzXDZcMFw0XDNcMVwwXDdcMyIrCi0gICAgIlwxXDBcM1wzXDFcMFwxXDNcMVwwXDFcM1wyXDBcMlwzXDFcMFwyXDMiKwotICAgICJcMVwwXDFcM1wxXDBcMlwzXDZcMFwxXDBcMlwwXDFcM1wyXDBcNVwzIisKLSAgICAiXDFcMFwxXDBcMVwwXDZcMFwyXDBcMTJcMFw3NlwwXDJcMFw2XDBcMTJcMCIrCi0gICAgIlwxM1wwXDFcMFwxXDBcMVwwXDFcMFwxXDBcNFwwXDJcMFwxMFwzXDFcMCIrCi0gICAgIlw0MVwzXDdcMFwyNFwwXDFcMFw2XDBcNFwwXDZcMFwxXDBcMVwwXDFcMCIrCi0gICAgIlwyNVwwXDNcMFw3XDBcMVwwXDFcMFwzNDZcMFw0NlwzXDEyXDBcNDdcM1wxMVwwIisKLSAgICAiXDFcM1wxXDBcMlwzXDFcMFwzXDNcMVwwXDFcM1wxXDBcMlwzXDFcMCIrCi0gICAgIlw1XDNcNTFcMFwxXDNcMVwwXDFcM1wxXDBcMVwzXDEzXDBcMVwzXDFcMCIrCi0gICAgIlwxXDNcMVwwXDFcM1wzXDBcMlwzXDNcMFwxXDNcNVwwXDNcM1wxXDAiKwotICAgICJcMVwzXDFcMFwxXDNcMVwwXDFcM1wxXDBcMVwzXDNcMFwyXDNcM1wwIisKLSAgICAiXDJcM1wxXDBcMVwzXDUwXDBcMVwzXDExXDBcMVwzXDJcMFwxXDNcMlwwIisKLSAgICAiXDJcM1w3XDBcMlwzXDFcMFwxXDNcMVwwXDdcM1w1MFwwXDFcM1w0XDAiKwotICAgICJcMVwzXDEwXDBcMVwzXHUwYzA2XDBcMjM0XDNcNFwwXDEzMlwzXDZcMFwyNlwzXDJcMCIrCi0gICAgIlw2XDNcMlwwXDQ2XDNcMlwwXDZcM1wyXDBcMTBcM1wxXDBcMVwzXDFcMCIrCi0gICAgIlwxXDNcMVwwXDFcM1wxXDBcMzdcM1wyXDBcNjVcM1wxXDBcN1wzXDFcMCIrCi0gICAgIlwxXDNcM1wwXDNcM1wxXDBcN1wzXDNcMFw0XDNcMlwwXDZcM1w0XDAiKwotICAgICJcMTVcM1w1XDBcM1wzXDFcMFw3XDNcMzIzXDBcMTVcMFw0XDBcMVwwXDEwNFwwIisKLSAgICAiXDFcM1wzXDBcMlwzXDJcMFwxXDNcMTIxXDBcM1wzXHUwZTgyXDBcMVwwXDFcMCIrCi0gICAgIlwxXDNcMzFcMFwxMVwzXDZcMFwxXDBcNVwwXDEzXDBcMTI0XDNcNFwwXDJcMCIrCi0gICAgIlwyXDBcMlwwXDJcMFwxMzJcM1wxXDBcM1wwXDZcMFw1MFwzXHUxY2QzXDBcdTUxYTZcMyIrCi0gICAgIlx1MGM1YVwwXHUyYmE0XDNcdTI4NWNcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgW10gWlpfQ01BUCA9IHp6VW5wYWNrQ01hcChaWl9DTUFQX1BBQ0tFRCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIERGQSBzdGF0ZXMgdG8gYWN0aW9uIHN3aXRjaCBsYWJlbHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfQUNUSU9OID0genpVbnBhY2tBY3Rpb24oKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQUNUSU9OX1BBQ0tFRF8wID0KLSAgICAiXDFcMFwxXDFcMVwyXDRcMSI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHp6VW5wYWNrQWN0aW9uKCkgewotICAgIGludCBbXSByZXN1bHQgPSBuZXcgaW50WzddOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9ST1dNQVAgPSB6elVucGFja1Jvd01hcCgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9ST1dNQVBfUEFDS0VEXzAgPQotICAgICJcMFwwXDBcNFwwXDEwXDBcMTRcMFwyMFwwXDI0XDBcMzAiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja1Jvd01hcCgpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs3XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja1Jvd01hcChaWl9ST1dNQVBfUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrUm93TWFwKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBoaWdoID0gcGFja2VkLmNoYXJBdChpKyspIDw8IDE2OwotICAgICAgcmVzdWx0W2orK10gPSBoaWdoIHwgcGFja2VkLmNoYXJBdChpKyspOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1RSQU5TIFtdID0gewotICAgIDEsIDEsIC0xLCAyLCAtMSwgLTEsIC0xLCAtMSwgMiwgMywgCi0gICAgNCwgMiwgMiwgMywgNCwgNSwgLTEsIDQsIDQsIDYsIAotICAgIDUsIDUsIDQsIDUsIDYsIDYsIC0xLCA2LCAKLSAgfTsKLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9OT19NQVRDSCA9IDE7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BVFRSSUJVVEVfUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMTFcNVwxIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBdHRyaWJ1dGUoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbN107Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0Qk9MID0gdHJ1ZTsKLQotICAvKiogenpBdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBhdCB0aGUgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB6ekF0RU9GOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotCSAqLwotCXB1YmxpYyBYTUwxME5hbWVzKCkgewotCQl0aGlzLnp6UmVhZGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKFN0cmluZyBzdHJpbmdUb0NoZWNrKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXl5cmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHN0cmluZ1RvQ2hlY2spKTsKLQkJdHJ5IHsKLQkJCXJlc3VsdCA9IGlzVmFsaWRYTUwxME5hbWUoKTsKLQkJfQotCQljYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSB3aXRoIHN0cmluZ3MsIGJ1dCBpZiBvY2N1cnMsIGp1c3QgbWVhbnMKLQkJCS8vICJub3QiCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUwxME5hbWVzKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEyMjYpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlZmlsbHMgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiwgaWZmIHRoZXJlIHdhcyBuZXcgaW5wdXQuCi0gICAqIAotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB6elJlZmlsbCgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHp6U3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh6ekJ1ZmZlciwgenpTdGFydFJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6QnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICB6ekVuZFJlYWQtenpTdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgenpFbmRSZWFkLT0genpTdGFydFJlYWQ7Ci0gICAgICB6ekN1cnJlbnRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6TWFya2VkUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elB1c2hiYWNrUG9zLT0genpTdGFydFJlYWQ7Ci0gICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh6ekN1cnJlbnRQb3MgPj0genpCdWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt6ekN1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHp6QnVmZmVyLmxlbmd0aCk7Ci0gICAgICB6ekJ1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHp6UmVhZGVyLnJlYWQoenpCdWZmZXIsIHp6RW5kUmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIubGVuZ3RoLXp6RW5kUmVhZCk7Ci0KLSAgICBpZiAobnVtUmVhZCA8IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBlbHNlIHsKLSAgICAgIHp6RW5kUmVhZCs9IG51bVJlYWQ7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0KLSAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLSAgICAgIHp6UmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHNjYW5uZXIgdG8gcmVhZCBmcm9tIGEgbmV3IGlucHV0IHN0cmVhbS4KLSAgICogRG9lcyBub3QgY2xvc2UgdGhlIG9sZCByZWFkZXIuCi0gICAqCi0gICAqIEFsbCBpbnRlcm5hbCB2YXJpYWJsZXMgYXJlIHJlc2V0LCB0aGUgb2xkIGlucHV0IHN0cmVhbSAKLSAgICogPGI+Y2Fubm90PC9iPiBiZSByZXVzZWQgKGludGVybmFsIGJ1ZmZlciBpcyBkaXNjYXJkZWQgYW5kIGxvc3QpLgotICAgKiBMZXhpY2FsIHN0YXRlIGlzIHNldCB0byA8dHQ+WlpfSU5JVElBTDwvdHQ+LgotICAgKgotICAgKiBAcGFyYW0gcmVhZGVyICAgdGhlIG5ldyBpbnB1dCBzdHJlYW0gCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLSAgICB5eWxpbmUgPSB5eWNoYXIgPSB5eWNvbHVtbiA9IDA7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHByaXZhdGUgZmluYWwgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgewotICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gPHR0PnBvczwvdHQ+IGZyb20gdGhlIAotICAgKiBtYXRjaGVkIHRleHQuIAotICAgKiAKLSAgICogSXQgaXMgZXF1aXZhbGVudCB0byB5eXRleHQoKS5jaGFyQXQocG9zKSwgYnV0IGZhc3RlcgotICAgKgotICAgKiBAcGFyYW0gcG9zIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2hhcmFjdGVyIHRvIGZldGNoLiAKLSAgICogICAgICAgICAgICBBIHZhbHVlIGZyb20gMCB0byB5eWxlbmd0aCgpLTEuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiBwb3MKLSAgICovCi0gIHByaXZhdGUgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwcml2YXRlIGZpbmFsIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogSW4gYSB3ZWxsZm9ybWVkIHNjYW5uZXIgKG5vIG9yIG9ubHkgY29ycmVjdCB1c2FnZSBvZiAKLSAgICogeXlwdXNoYmFjayhpbnQpIGFuZCBhIG1hdGNoLWFsbCBmYWxsYmFjayBydWxlKSB0aGlzIG1ldGhvZCAKLSAgICogd2lsbCBvbmx5IGJlIGNhbGxlZCB3aXRoIHRoaW5ncyB0aGF0ICJDYW4ndCBQb3NzaWJseSBIYXBwZW4iLgotICAgKiBJZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHNvbWV0aGluZyBpcyBzZXJpb3VzbHkgd3JvbmcKLSAgICogKGUuZy4gYSBKRmxleCBidWcgcHJvZHVjaW5nIGEgZmF1bHR5IHNjYW5uZXIgZXRjLikuCi0gICAqCi0gICAqIFVzdWFsIHN5bnRheC9zY2FubmVyIGxldmVsIGVycm9yIGhhbmRsaW5nIHNob3VsZCBiZSBkb25lCi0gICAqIGluIGVycm9yIGZhbGxiYWNrIHJ1bGVzLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHp6U2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICBTdHJpbmcgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1tlcnJvckNvZGVdOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIG1lc3NhZ2UgPSBaWl9FUlJPUl9NU0dbWlpfVU5LTk9XTl9FUlJPUl07Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpICB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHp6U2NhbkVycm9yKFpaX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIGphdmEuaW8uSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFhNTDEwTmFtZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgenpJbnB1dDsKLSAgICBpbnQgenpBY3Rpb247Ci0KLSAgICAvLyBjYWNoZWQgZmllbGRzOgotICAgIGludCB6ekN1cnJlbnRQb3NMOwotICAgIGludCB6ek1hcmtlZFBvc0w7Ci0gICAgaW50IHp6RW5kUmVhZEwgPSB6ekVuZFJlYWQ7Ci0gICAgY2hhciBbXSB6ekJ1ZmZlckwgPSB6ekJ1ZmZlcjsKLSAgICBjaGFyIFtdIHp6Q01hcEwgPSBaWl9DTUFQOwotCi0gICAgaW50IFtdIHp6VHJhbnNMID0gWlpfVFJBTlM7Ci0gICAgaW50IFtdIHp6Um93TWFwTCA9IFpaX1JPV01BUDsKLSAgICBpbnQgW10genpBdHRyTCA9IFpaX0FUVFJJQlVURTsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgenpBY3Rpb24gPSAtMTsKLQotICAgICAgenpDdXJyZW50UG9zTCA9IHp6Q3VycmVudFBvcyA9IHp6U3RhcnRSZWFkID0genpNYXJrZWRQb3NMOwotICAKLSAgICAgIHp6U3RhdGUgPSB6ekxleGljYWxTdGF0ZTsKLQotCi0gICAgICB6ekZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIGlmICh6ekN1cnJlbnRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICBlbHNlIGlmICh6ekF0RU9GKSB7Ci0gICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbnMKLSAgICAgICAgICAgIHp6Q3VycmVudFBvcyAgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgenpNYXJrZWRQb3MgICA9IHp6TWFya2VkUG9zTDsKLSAgICAgICAgICAgIGJvb2xlYW4gZW9mID0genpSZWZpbGwoKTsKLSAgICAgICAgICAgIC8vIGdldCB0cmFuc2xhdGVkIHBvc2l0aW9ucyBhbmQgcG9zc2libHkgbmV3IGJ1ZmZlcgotICAgICAgICAgICAgenpDdXJyZW50UG9zTCAgPSB6ekN1cnJlbnRQb3M7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgICA9IHp6TWFya2VkUG9zOwotICAgICAgICAgICAgenpCdWZmZXJMICAgICAgPSB6ekJ1ZmZlcjsKLSAgICAgICAgICAgIHp6RW5kUmVhZEwgICAgID0genpFbmRSZWFkOwotICAgICAgICAgICAgaWYgKGVvZikgewotICAgICAgICAgICAgICB6eklucHV0ID0gWVlFT0Y7Ci0gICAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSB6ekJ1ZmZlckxbenpDdXJyZW50UG9zTCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IHp6TmV4dCA9IHp6VHJhbnNMWyB6elJvd01hcExbenpTdGF0ZV0gKyB6ekNNYXBMW3p6SW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHp6TmV4dCA9PSAtMSkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgenpTdGF0ZSA9IHp6TmV4dDsKLQotICAgICAgICAgIGludCB6ekF0dHJpYnV0ZXMgPSB6ekF0dHJMW3p6U3RhdGVdOwotICAgICAgICAgIGlmICggKHp6QXR0cmlidXRlcyAmIDEpID09IDEgKSB7Ci0gICAgICAgICAgICB6ekFjdGlvbiA9IHp6U3RhdGU7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ekN1cnJlbnRQb3NMOwotICAgICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgOCkgPT0gOCApIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9uCi0gICAgICB6ek1hcmtlZFBvcyA9IHp6TWFya2VkUG9zTDsKLQotICAgICAgc3dpdGNoICh6ekFjdGlvbiA8IDAgPyB6ekFjdGlvbiA6IFpaX0FDVElPTlt6ekFjdGlvbl0pIHsKLSAgICAgICAgY2FzZSAxOiAKLSAgICAgICAgICB7IHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgNDogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh6eklucHV0ID09IFlZRU9GICYmIHp6U3RhcnRSZWFkID09IHp6Q3VycmVudFBvcykgewotICAgICAgICAgICAgenpBdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICAgIHsge3JldHVybiBmYWxzZTt9IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL1hNTDEwTmFtZXNHZW5KYXZhLmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmEuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDc3ZDE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmEuY21kCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotQGVjaG8gb24NCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgbmVlZCB0byBiZSBzZXQvc3BlY2lmaWVkIGZvciBlYWNoICJkZXZlbG9wbWVudCBtYWNoaW5lIg0KLXNldCBQQVRIPSVQQVRIJTtEOlxKREtzXGoyc2RrMS40LjJfMDNcYmluDQotc2V0IFdPUktTUEFDRV9MT0NBVElPTj1EOlxidWlsZHNcV29ya3NwYWNlc1xSQzINCi1zZXQgSkZMRVhfTElCX0xPQ0FUSU9OPUQ6XERldlRpbWVTdXBwb3J0XEpGbGV4LTEuNFxsaWINCi0NCi1yZW0gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgZGlmZmVyIGZyb20gcHJvamVjdCB0byBwcm9qZWN0LCBidXQgc2hvdWxkIGJlIG90aGVyd2lzZSBjb25zdGFudA0KLXNldCBNQUlOX05BTUU9WE1MMTBOYW1lcw0KLQ0KLXNldCBQUk9KRUNUX1NSQz1cb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbFxzcmNcDQotc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cc3NlXG1vZGVsXHhtbFxpbnRlcm5hbFxwYXJzZXJcDQotDQotDQotcmVtIEdpdmVuIHRoZSBhYm92ZSAiZnJhbWV3b3JrIiBhbmQgdGhlIGNvbW1hbmQgdGhlbXNlbHZlcywgdGhlc2UgdmFyaWFibGVzIHNob3VsZCBuZXZlciBuZWVkIHRvIGJlIG1vZGlmaWVkDQotc2V0IEpBVkFfRklMRT0lTUFJTl9OQU1FJS5qYXZhDQotc2V0IEpGTEVYX1JVTEVTPSVNQUlOX05BTUUlLmpmbGV4DQotc2V0IFNLRUxFVE9OX0ZJTEU9JU1BSU5fTkFNRSUuc2tlbGV0b24NCi0NCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBkZWwgJUpBVkFfRklMRSUNCi1yZW0gamF2YSAtWG14NDcwMDAwMDAwIC1jcCAlSkZMRVhfTElCX0xPQ0FUSU9OJVxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1JRiBFWElTVCAlSkFWQV9GSUxFJSBjb3B5ICVKQVZBX0ZJTEUlICVXT1JLU1BBQ0VfTE9DQVRJT04lJVBST0pFQ1RfU1JDJSVQQUNLQUdFX0RJUiUlSkFWQV9GSUxFJQ0KLQ0KLXBhdXNlDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzR2VuSmF2YUpGbGV4MTQuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9YTUwxME5hbWVzR2VuSmF2YUpGbGV4MTQuY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWZiZjYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvWE1MMTBOYW1lc0dlbkphdmFKRmxleDE0LmNtZAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLUBlY2hvIG9uDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIG5lZWQgdG8gYmUgc2V0L3NwZWNpZmllZCBmb3IgZWFjaCAiZGV2ZWxvcG1lbnQgbWFjaGluZSINCi1zZXQgUEFUSD0lUEFUSCU7RDpcSkRLc1xqMnNkazEuNC4yXzAzXGJpbg0KLXNldCBXT1JLU1BBQ0VfTE9DQVRJT049RDpcYnVpbGRzXFdvcmtzcGFjZXNcUkMyDQotc2V0IEpGTEVYX0xJQl9MT0NBVElPTj1EOlxEZXZUaW1lU3VwcG9ydFxKRmxleC0xLjRcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPVhNTDEwTmFtZXMNCi0NCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWxcc3JjXA0KLXNldCBQQUNLQUdFX0RJUj1jb21caWJtXHNzZVxtb2RlbFx4bWxcaW50ZXJuYWxccGFyc2VyXA0KLQ0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcSmZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlIC1za2VsICVTS0VMRVRPTl9GSUxFJSAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcSmZsZXguamFyOy4gSkZsZXguTWFpbiAlSkZMRVhfUlVMRVMlICAxPmpmbGV4b3V0LnR4dCAyPmpmbGV4ZXJyLnR4dA0KLUlGIEVYSVNUICVKQVZBX0ZJTEUlIGNvcHkgJUpBVkFfRklMRSUgJVdPUktTUEFDRV9MT0NBVElPTiUlUFJPSkVDVF9TUkMlJVBBQ0tBR0VfRElSJSVKQVZBX0ZJTEUlDQotDQotcGF1c2UNCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUwxME5hbWVzL2pmbGV4ZXJyLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhlcnIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhlcnIudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMvamZsZXhvdXQudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleG91dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlOTYwYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy9qZmxleG91dC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLVJlYWRpbmcgIlhNTDEwTmFtZXMuamZsZXgiCi1Db25zdHJ1Y3RpbmcgTkZBIDogMzYgc3RhdGVzIGluIE5GQQotQ29udmVydGluZyBORkEgdG8gREZBIDogCi0uLi4uLi4uLi4uLgotMTMgc3RhdGVzIGJlZm9yZSBtaW5pbWl6YXRpb24sIDcgc3RhdGVzIGluIG1pbmltaXplZCBERkEKLVdyaXRpbmcgY29kZSB0byAiWE1MMTBOYW1lcy5qYXZhIgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpGbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyLmpGbGV4CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmZlODk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0lJQotCi0lewotCi0KLQlwcml2YXRlIGJvb2xlYW4gaGFzTW9yZSA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BWF9UT19TQ0FOID0gODAwMDsKLQlTdHJpbmdCdWZmZXIgc3RyaW5nID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCS8vIHN0YXRlIHN0YWNrIGZvciBlYXNpZXIgc3RhdGUgaGFuZGxpbmcKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0JcHJpdmF0ZSBTdHJpbmcgdmFsdWVUZXh0ID0gbnVsbDsKLQotCi0JcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JICBwdWJsaWMgdm9pZCByZXNldCAoUmVhZGVyIGluKSB7Ci0gICAgICAgICAgICAgICAgLyogdGhlIGlucHV0IGRldmljZSAqLwotICAgICAgICAgICAgICAgIHp6UmVhZGVyID0gaW47Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gICAgICAgICAgICAgICAgenpTdGF0ZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpMZXhpY2FsU3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICAgICAgICAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAgICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuZmlsbCh6ekJ1ZmZlciwgKGNoYXIpMCk7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TWFya2VkUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gICAgICAgICAgICAgICAgenpQdXNoYmFja1BvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6ekN1cnJlbnRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpTdGFydFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICAgICAgICAgICAgICogZnJvbSBpbnB1dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHp6RW5kUmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHl5Y29sdW1uID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nCi0gICAgICAgICAgICAgICAgICogb2YgYSBsaW5lCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpBdEJPTCA9IHRydWU7Ci0KLSAgICAgICAgICAgICAgICAvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gICAgICAgICAgICAgICAgenpBdEVPRiA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gICAgICAgICAgICAgICAgenpFT0ZEb25lID0gZmFsc2U7Ci0KLQotICAgICAgICAgICAgICAgIGZTdGF0ZVN0YWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgICAgICBoYXNNb3JlID0gdHJ1ZTsKLSAgCQkKLSAgCX0KLQotCi0JcHVibGljIGZpbmFsIEhlYWRQYXJzZXJUb2tlbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCUhlYWRQYXJzZXJUb2tlbiByZXN1bHQgPSBudWxsOwotCQlpZiAodmFsdWVUZXh0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgdmFsdWVUZXh0KTsKLQkJCXZhbHVlVGV4dCA9IG51bGw7Ci0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHl5dGV4dCgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBib29sZWFuIGhhc01vcmVUb2tlbnMoKSB7Ci0JCXJldHVybiBoYXNNb3JlICYmIHl5Y2hhciA8IE1BWF9UT19TQ0FOOwotCX0KLQlwcml2YXRlIHZvaWQgcHVzaEN1cnJlbnRTdGF0ZSgpIHsKLQkJZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHBvcFN0YXRlKCkgewotCQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQl9Ci0JCi0JcHJpdmF0ZSBIZWFkUGFyc2VyVG9rZW4gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJcmV0dXJuIG5ldyBIZWFkUGFyc2VyVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHQpOwotCX0JCi0KLSV9Ci0KLSVlb2Z7Ci0JaGFzTW9yZT1mYWxzZTsKLSVlb2Z9Ci0KLSVwdWJsaWMKLSVjbGFzcyBYTUxIZWFkVG9rZW5pemVyCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbgotJXR5cGUgU3RyaW5nCi0lY2hhcgotJXVuaWNvZGUKLSVpZ25vcmVjYXNlIAotLy8lZGVidWcKLSVzd2l0Y2gKLSVidWZmZXIgODE5MgotCi1VVEYxNkJFID0gXHhGRVx4RkYKLVVURjE2TEUgPSBceEZGXHhGRQotVVRGODNCeXRlQk9NID0gXHhFRlx4QkJceEJGCi0KLVNwYWNlQ2hhciA9IFtceDIwXHgwOV0KLQotLy8gWzNdIFMgOjo9ICgweDIwIHwgMHg5IHwgMHhEIHwgMHhBKSsKLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0KLQotQmVnaW5BdHRyaWJlVmFsdWUgPSB7U30qIFw9IHtTfSoKLQotTGluZVRlcm1pbmF0b3IgPSBccnxcbgotCi0KLSVzdGF0ZSBTVF9YTUxEZWNsCi0lc3RhdGUgUXVvdGVkQXR0cmlidXRlVmFsdWUKLSVzdGF0ZSBEUV9TVFJJTkcKLSVzdGF0ZSBTUV9TVFJJTkcKLSVzdGF0ZSBVbkRlbGltaXRlZFN0cmluZwotCi0lJQotCi0KLTxZWUlOSVRJQUw+ICAKLXsKLQkvLyBmb3JjZSB0byBzdGFydCBhdCBiZWdpbm5pbmcgb2YgbGluZSAoXikgYW5kIGF0IGJlZ2lubmluZyBvZiBmaWxlICh5eWNoYXIgPT0gMCkKLQlee1VURjE2QkV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fX0KLQlee1VURjE2TEV9ICAgCQl7aWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fX0KLQlee1VURjgzQnl0ZUJPTX0gICAJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fX0KLQkKLQkvLyBmb3JjZSB0byBiZSBzdGFydGVkIG9uIGZpcnN0IGxpbmUsIGJ1dCB3ZSBkbyBhbGxvdyBwcmVjZWVkaW5nIHNwYWNlcwotCV4ge1N9KiAiPFw/eG1sIiB7U30rIHtpZiAoeXljaGFyID09IDAgKSB7eXliZWdpbihTVF9YTUxEZWNsKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0O319Ci0JCi19CQotCQotPFNUX1hNTERlY2w+IAotewotCSJ2ZXJzaW9uIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsVmVyc2lvbjt9Ci0JImVuY29kaW5nIiB7QmVnaW5BdHRyaWJlVmFsdWV9IHtwdXNoQ3VycmVudFN0YXRlKCk7IHl5YmVnaW4oUXVvdGVkQXR0cmlidXRlVmFsdWUpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWxFbmNvZGluZzt9Ci0JLy8gbm90ZSB0aGUgImZvcmNlZCBlbmQiICh2aWEgJ2hhc01vcmU9ZmFsc2UnKSBvbmNlIHRoZSBlbmQgb2YgWE1MIERlY2xhcmF0aW9uIGZvdW5kCi0JLy8gVGhpcyBpcyBzaW5jZSBub24tYXNjaWkgY2hhcnMgbWF5IGZvbGxvdyBhbmQgbWF5IGNhdXNlIElPRXhjZXB0aW9ucyB3aGljaCB3b3VsZCBub3Qgb2NjdXIgb25jZSBzdHJlYW0gaXMgCi0JLy8gcmVhZCB3aXRoIGluY29ycmVjdCBlbmNvZGluZyAoc3VjaCBhcyBpZiBwbGF0Zm9ybSBlbmNvZGluZyBpcyBpbiBlZmZlY3QgdW50aWwgdHJ1ZSBlbmNvZGluZyBkZXRlY3RlZCkuIAotCSJcPz4iICAgIHt5eWJlZ2luKFlZSU5JVElBTCk7IGhhc01vcmUgPSBmYWxzZTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbEVuZDt9Ci19CQotCi0JCi0KLTxRdW90ZWRBdHRyaWJ1dGVWYWx1ZT4KLXsKLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotCVwnCQkJeyB5eWJlZ2luKFNRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQkvLyBpbiB0aGlzIHN0YXRlLCBhbnl0aGluZyBvdGhlciB0aGFuIGEgc3BhY2UgY2hhcmFjdGVyIGNhbiBzdGFydCBhbiB1bmRlbGltaXRlZCBzdHJpbmcKLQl7U30qLiAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTt9Ci0KLX0JCi0KLQotPERRX1NUUklORz4KLXsKLQotCVwiICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFNRX1NUUklORz4KLXsKLQotCVwnICAgICAgICAgICAgICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTt9Ci0gIAl7TGluZVRlcm1pbmF0b3J9ICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQkiJT4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLgkJCXsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgfQotCi0KLX0KLQotPFVuRGVsaW1pdGVkU3RyaW5nPgotewotCi0Je1N9ICAgICAgICAgICAgICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsgfQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIlw/PiIJCQl7IHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlO30KLQknPCcJCi0JeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JLy8gdGhlc2UgYXJlIGEgYml0IHNwZWNpYWwsIHNpbmNlIHdlIHN0YXJ0ZWQgYW4gdW5kZWxpbWl0IHN0cmluZywgYnV0IGZvdW5kIGEgcXVvdGUgLi4uIHByb2JhYmx5IGluZGljYXRlcyBhIG1pc3NpbmcgYmVnaW5uaW5nIHF1b3RlCi0JXCcJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQlcIgkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7fQotCQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotfQotCi0vLyBUaGUgIm1hdGNoIGFueXRoaW5nIiBydWxlIHNob3VsZCBhbHdheXMgYmUgaW4gZWZmZWN0IGV4Y2VwdCBmb3Igd2hlbiBsb29raW5nIGZvciBlbmQgb2Ygc3RyaW5nCi0vLyAoVGhhdCBpcywgcmVtZW1iZXIgdG8gdXBkYXRlIHN0YXRlIGxpc3QgaWYvd2hlbiBuZXcgc3RhdGVzIGFkZGVkKQotPFlZSU5JVElBTCwgU1RfWE1MRGVjbCwgUXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0vLyB0aGlzIGlzIHRoZSBmYWxsYmFjayAobWF0Y2ggImFueXRoaW5nIikgcnVsZSAgKGZvciB0aGlzIHNjYW5uZXIsIGlucHV0IGlzIGlnbm9yZWQsIGFuZCBwb3NpdGlvbiBhZHZhbmNlZCwgaWYgbm90IHJlY29nbml6ZWQpCi0ufFxuICAgICAgICAgICAgICB7aWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO319Ci19Ci0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+ICAgICAgICAge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkVPRjt9Ci0KLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjAzNzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDQvNi8wNCAxMToxMyBQTSAqLwotCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbDsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbmNvZGluZy5jb250ZW50c3BlY2lmaWMuSGVhZFBhcnNlclRva2VuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLkludFN0YWNrOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljLnhtbC5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDQvNi8wNCAxMToxMyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL1hNTEhlYWRUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgWE1MSGVhZFRva2VuaXplciB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFVuRGVsaW1pdGVkU3RyaW5nID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IERRX1NUUklORyA9IDY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNRX1NUUklORyA9IDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTERlY2wgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBRdW90ZWRBdHRyaWJ1dGVWYWx1ZSA9IDQ7Ci0KLSAgLyoqCi0gICAqIFlZX0xFWFNUQVRFW2xdIGlzIHRoZSBzdGF0ZSBpbiB0aGUgREZBIGZvciB0aGUgbGV4aWNhbCBzdGF0ZSBsCi0gICAqIFlZX0xFWFNUQVRFW2wrMV0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogICAgICAgICAgICAgICAgICBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKiBsIGlzIG9mIHRoZSBmb3JtIGwgPSAyKmssIGsgYSBub24gbmVnYXRpdmUgaW50ZWdlcgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFlZX0xFWFNUQVRFW10gPSB7IAotICAgICAwLCAgMSwgIDIsICAyLCAgMywgIDMsICA0LCAgNCwgIDUsICA1LCAgNiwgNgotICB9OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDZcMVw3XDJcMFwxXDExXDIyXDBcMVw2XDFcMFwxXDI3XDJcMCIrCi0gICAgIlwxXDMxXDFcMFwxXDMwXDI0XDBcMVwxMlwxXDEwXDFcMjZcMVwxM1wzXDBcMVwyMSIrCi0gICAgIlwxXDIzXDFcMTdcMVwwXDFcMjVcMVwwXDFcMjRcMlwwXDFcMTZcMVwxNVwxXDIwIisKLSAgICAiXDFcMjJcMTBcMFwxXDE0XDEyXDBcMVwyMVwxXDIzXDFcMTdcMVwwXDFcMjVcMVwwIisKLSAgICAiXDFcMjRcMlwwXDFcMTZcMVwxNVwxXDIwXDFcMjJcMTBcMFwxXDE0XDEwMlwwXDFcNCIrCi0gICAgIlwzXDBcMVw1XDE3XDBcMVwzXDE2XDBcMVwxXDIwXDBcMVwzXDE2XDBcMVwxIisKLSAgICAiXDFcMlwxNzBcMFwxXDJcdWZlODdcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLQkgIAkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JICAJeXlfcmVhZGVyID0gaW47Ci0KLSAgCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIAkJeXlfc3RhdGUgPSAwOwotCi0gIAkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAJCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gIAkJIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICAJCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0gIAkJLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLSAgCQkvKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgCQl5eV9jdXJyZW50UG9zID0gMDsKLQotICAJCS8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAJCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLSAgCQkvKiogCi0gIAkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gIAkJICogZnJvbSBpbnB1dCAKLSAgCQkgKi8KLSAgCQl5eV9lbmRSZWFkID0gMDsKLQotICAJCS8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAJCXl5bGluZSA9IDA7Ci0KLSAgCQkvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgCQl5eWNoYXIgPSAwOwotCi0gIAkJLyoqCi0gIAkJICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgCQkgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gIAkJICovCi0gIAkJeXljb2x1bW4gPSAwOyAKLQotICAJCS8qKiAKLSAgCQkgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyAKLSAgCQkgKiBvZiBhIGxpbmUKLSAgCQkgKi8KLSAgCQl5eV9hdEJPTCA9IGZhbHNlOwotCi0gIAkJLyogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICAJCXl5X2F0RU9GID0gZmFsc2U7Ci0KLSAgCQkvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCi0KLSAgCQlmU3RhdGVTdGFjay5jbGVhcigpOwotICAJCQotICAJCWhhc01vcmUgPSB0cnVlOwotICAJCQotICAJCS8vIGl0cyBhIGxpdHRsZSB3YXN0ZWZ1bCB0byAidGhyb3cgYXdheSIgZmlyc3QgY2hhciBhcnJheSBnZW5lcmF0ZWQKLSAgCQkvLyBieSBjbGFzcyBpbml0ICh2aWEgYXV0byBnZW5lcmF0ZWQgY29kZSksIGJ1dCB3ZSByZWFsbHkgZG8gd2FudCAKLSAgCQkvLyBhIHNtYWxsIGJ1ZmZlciBmb3Igb3VyIGhlYWQgcGFyc2Vycy4gCi0gIAkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gTUFYX1RPX1NDQU4pIHsKLSAgCQkJeXlfYnVmZmVyID0gbmV3IGNoYXJbTUFYX1RPX1NDQU5dOwotICAJCX0KLQotCi0gIAl9Ci0KLQotCXB1YmxpYyBmaW5hbCBIZWFkUGFyc2VyVG9rZW4gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlIZWFkUGFyc2VyVG9rZW4gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHZhbHVlVGV4dCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVUb2tlbihjb250ZXh0LCB5eWNoYXIsIHZhbHVlVGV4dCk7Ci0JCQl2YWx1ZVRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB5eXRleHQoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBoYXNNb3JlVG9rZW5zKCkgewotCQlyZXR1cm4gaGFzTW9yZSAmJiB5eWNoYXIgPCBNQVhfVE9fU0NBTjsKLQl9Ci0JcHJpdmF0ZSB2b2lkIHB1c2hDdXJyZW50U3RhdGUoKSB7Ci0JCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBwb3BTdGF0ZSgpIHsKLQkJeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JfQotCQotCXByaXZhdGUgSGVhZFBhcnNlclRva2VuIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBuZXcgSGVhZFBhcnNlclRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0KTsKLQl9CQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MSGVhZFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXlfdW5wYWNrX2NtYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTI4KSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotCi0gICAgU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7Ci0KLSAgICB5eV9tYXJrZWRQb3MgLT0gbnVtYmVyOwotICB9Ci0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIAloYXNNb3JlPWZhbHNlOwotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICB5eV9hdEJPTCA9IHl5X21hcmtlZFBvcyA8PSAwIHx8IHl5X2J1ZmZlclt5eV9tYXJrZWRQb3MtMV0gPT0gJ1xuJzsKLSAgICAgIGlmICgheXlfYXRCT0wgJiYgeXlfYnVmZmVyW3l5X21hcmtlZFBvcy0xXSA9PSAnXHInKSB7Ci0gICAgICAgIHl5X2F0Qk9MID0geXlfYWR2YW5jZSgpICE9ICdcbic7Ci0gICAgICAgIGlmICgheXlfYXRFT0YpIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIGlmICh5eV9hdEJPTCkKLSAgICAgICAgeXlfc3RhdGUgPSBZWV9MRVhTVEFURVt5eV9sZXhpY2FsX3N0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB5eV9zdGF0ZSA9IFlZX0xFWFNUQVRFW3l5X2xleGljYWxfc3RhdGVdOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eWNtYXBbeXlfaW5wdXRdOwotCi0gICAgICAgICAgYm9vbGVhbiB5eV9pc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB5eV9ub0xvb2tBaGVhZCA9IGZhbHNlOwotCi0gICAgICAgICAgeXlfZm9yTmV4dDogeyBzd2l0Y2ggKHl5X3N0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDExOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDEyOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDE1OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDE2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxODsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDE5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMzogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyMzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNDsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDIxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI2OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMjY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAyNzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDIzOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDI4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDI5OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyOiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfbm9Mb29rQWhlYWQgPSB0cnVlOyB5eV9zdGF0ZSA9IDMwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMzE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDQ6IHl5X3N0YXRlID0gMzI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHl5X3N0YXRlID0gMzc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDc6IHl5X3N0YXRlID0gMzg7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAxNTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSAzOTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB5eV9zdGF0ZSA9IDQwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMjogeXlfaXNGaW5hbCA9IHRydWU7IHl5X25vTG9va0FoZWFkID0gdHJ1ZTsgeXlfc3RhdGUgPSA0MTsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gNDA7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gNDI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgNzogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB5eV9zdGF0ZSA9IDMzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHl5X3N0YXRlID0gMzQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB5eV9zdGF0ZSA9IDM1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMjogeXlfc3RhdGUgPSA0MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTc6IHl5X3N0YXRlID0gNDQ7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gMTY7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB5eV9zdGF0ZSA9IDM4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMTU7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjQ6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9ub0xvb2tBaGVhZCA9IHRydWU7IHl5X3N0YXRlID0gMjE7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEzOiB5eV9zdGF0ZSA9IDQ1OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxODogeXlfc3RhdGUgPSA0NjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0NToKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHl5X3N0YXRlID0gNDc7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE5OiB5eV9zdGF0ZSA9IDQ4OyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ3OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIwOiB5eV9zdGF0ZSA9IDUwOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDc6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogeXlfaXNGaW5hbCA9IHRydWU7IHl5X3N0YXRlID0gNDk7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoeXlfaW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE2OiB5eV9zdGF0ZSA9IDUxOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDUxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHl5X2lucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyMTogeXlfc3RhdGUgPSA1MjsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X3N0YXRlID0gNTI7IGJyZWFrIHl5X2Zvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA4OiB5eV9pc0ZpbmFsID0gdHJ1ZTsgeXlfc3RhdGUgPSA1MzsgYnJlYWsgeXlfZm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgc3dpdGNoICh5eV9pbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA3OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHl5X2lzRmluYWwgPSB0cnVlOyB5eV9zdGF0ZSA9IDUzOyBicmVhayB5eV9mb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfSUxMRUdBTF9TVEFURSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0gfQotCi0gICAgICAgICAgaWYgKCB5eV9pc0ZpbmFsICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoIHl5X25vTG9va0FoZWFkICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgICAgeyAgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsgfQotICAgICAgICBjYXNlIDU1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgICAgeyAgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgfQotICAgICAgICBjYXNlIDU3OiBicmVhazsKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgMjk6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNTg6IGJyZWFrOwotICAgICAgICBjYXNlIDM5OiAKLSAgICAgICAgICB7ICB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7IH0KLSAgICAgICAgY2FzZSA1OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMik7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlOyB9Ci0gICAgICAgIGNhc2UgNjA6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICBjYXNlIDg6IAotICAgICAgICBjYXNlIDk6IAotICAgICAgICBjYXNlIDEwOiAKLSAgICAgICAgY2FzZSAxMTogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30gfQotICAgICAgICBjYXNlIDYxOiBicmVhazsKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgICAgeyBpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRTt9IH0KLSAgICAgICAgY2FzZSA2MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEU7fSB9Ci0gICAgICAgIGNhc2UgNjM6IGJyZWFrOwotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT007fSB9Ci0gICAgICAgIGNhc2UgNjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fSB9Ci0gICAgICAgIGNhc2UgNjU6IGJyZWFrOwotICAgICAgICBjYXNlIDM2OiAKLSAgICAgICAgICB7IHl5YmVnaW4oWVlJTklUSUFMKTsgaGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsRW5kOyB9Ci0gICAgICAgIGNhc2UgNjY6IGJyZWFrOwotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOyB9Ci0gICAgICAgIGNhc2UgNjc6IGJyZWFrOwotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgICB7ICBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDY4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgICAgeyAgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsgIH0KLSAgICAgICAgY2FzZSA2OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSA3MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oRFFfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsgIH0KLSAgICAgICAgY2FzZSA3MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICAgIHsgIHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOyAgfQotICAgICAgICBjYXNlIDcyOiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlfU2NhbkVycm9yKFlZX05PX01BVENIKTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9ICAgIAotCi0gIC8qKgotICAgKiBSdW5zIHRoZSBzY2FubmVyIG9uIGlucHV0IGZpbGVzLgotICAgKgotICAgKiBUaGlzIG1haW4gbWV0aG9kIGlzIHRoZSBkZWJ1Z2dpbmcgcm91dGluZSBmb3IgdGhlIHNjYW5uZXIuCi0gICAqIEl0IHByaW50cyBlYWNoIHJldHVybmVkIHRva2VuIHRvIFN5c3RlbS5vdXQgdW50aWwgdGhlIGVuZCBvZgotICAgKiBmaWxlIGlzIHJlYWNoZWQsIG9yIGFuIGVycm9yIG9jY3VyZWQuCi0gICAqCi0gICAqIEBwYXJhbSBhcmd2ICAgdGhlIGNvbW1hbmQgbGluZSwgY29udGFpbnMgdGhlIGZpbGVuYW1lcyB0byBydW4KLSAgICogICAgICAgICAgICAgICB0aGUgc2Nhbm5lciBvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmd2W10pIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3YubGVuZ3RoOyBpKyspIHsKLSAgICAgIFhNTEhlYWRUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoIG5ldyBqYXZhLmlvLkZpbGVSZWFkZXIoYXJndltpXSkgKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmlsZSBub3QgZm91bmQgOiBcIiIrYXJndltpXSsiXCIiKTsKLSAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3Igb3BlbmluZyBmaWxlIFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YSBYTUxIZWFkVG9rZW5pemVyIDxpbnB1dGZpbGU+Iik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBkbyB7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNjYW5uZXIucHJpbUdldE5leHRUb2tlbigpKTsKLSAgICAgICAgfSB3aGlsZSAoIXNjYW5uZXIueXlfYXRFT0YpOwotCi0gICAgICB9Ci0gICAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQW4gSS9PIGVycm9yIG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgOiIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvWE1MSGVhZFRva2VuaXplckdlbkphdmEuY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzFjN2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9YTUxIZWFkVG9rZW5pemVyR2VuSmF2YS5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1AZWNobyBvbg0KLQ0KLXJlbSBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBuZWVkIHRvIGJlIHNldC9zcGVjaWZpZWQgZm9yIGVhY2ggImRldmVsb3BtZW50IG1hY2hpbmUiDQotc2V0IFBBVEg9JVBBVEglO0Q6XEpES3NcajJzZGsxLjQuMl8wM1xiaW4NCi1zZXQgV09SS1NQQUNFX0xPQ0FUSU9OPUQ6XGJ1aWxkc1xXb3Jrc3BhY2VzXFdTV0JNOA0KLXNldCBKRkxFWF9MSUJfTE9DQVRJT049RDpcRGV2VGltZVN1cHBvcnRcSkZsZXhcbGliDQotDQotcmVtIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGRpZmZlciBmcm9tIHByb2plY3QgdG8gcHJvamVjdCwgYnV0IHNob3VsZCBiZSBvdGhlcndpc2UgY29uc3RhbnQNCi1zZXQgTUFJTl9OQU1FPVhNTEhlYWRUb2tlbml6ZXINCi0NCi1yZW0gc2V0IFBST0pFQ1RfU1JDPVxvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUueG1sXHNyY1wNCi1yZW0gc2V0IFBBQ0tBR0VfRElSPWNvbVxpYm1cc3NlXG1vZGVsXHhtbFxlbmNvZGluZ1wNCi0NCi1zZXQgUFJPSkVDVF9TUkM9XG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW5jb2RpbmcuY29udGVudHNwZWNpZmljXHNyY1wNCi1zZXQgUEFDS0FHRV9ESVI9Y29tXGlibVxlbmNvZGluZ1xyZXNvdXJjZVxjb250ZW50c3BlY2lmaWNceG1sXA0KLQ0KLQ0KLXJlbSBHaXZlbiB0aGUgYWJvdmUgImZyYW1ld29yayIgYW5kIHRoZSBjb21tYW5kIHRoZW1zZWx2ZXMsIHRoZXNlIHZhcmlhYmxlcyBzaG91bGQgbmV2ZXIgbmVlZCB0byBiZSBtb2RpZmllZA0KLXNldCBKQVZBX0ZJTEU9JU1BSU5fTkFNRSUuamF2YQ0KLXNldCBKRkxFWF9SVUxFUz0lTUFJTl9OQU1FJS5qZmxleA0KLXNldCBTS0VMRVRPTl9GSUxFPSVNQUlOX05BTUUlLnNrZWxldG9uDQotDQotSUYgRVhJU1QgJUpBVkFfRklMRSUgZGVsICVKQVZBX0ZJTEUlDQotcmVtIGphdmEgLVhteDQ3MDAwMDAwMCAtY3AgJUpGTEVYX0xJQl9MT0NBVElPTiVcc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gJUpGTEVYX1JVTEVTJSAtc2tlbCAlU0tFTEVUT05fRklMRSUgMT5qZmxleG91dC50eHQgMj5qZmxleGVyci50eHQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwICVKRkxFWF9MSUJfTE9DQVRJT04lXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluICVKRkxFWF9SVUxFUyUgIDE+amZsZXhvdXQudHh0IDI+amZsZXhlcnIudHh0DQotSUYgRVhJU1QgJUpBVkFfRklMRSUgY29weSAlSkFWQV9GSUxFJSAlV09SS1NQQUNFX0xPQ0FUSU9OJSVQUk9KRUNUX1NSQyUlUEFDS0FHRV9ESVIlJUpBVkFfRklMRSUNCi0NCi1wYXVzZQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIvamZsZXhlcnIudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleGVyci50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9qZmxleG91dC50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE2YzMyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL2pmbGV4b3V0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotUmVhZGluZyAiWE1MSGVhZFRva2VuaXplci5qZmxleCIKLQotV2FybmluZyA6IE1hY3JvICJTcGFjZUNoYXIiIGhhcyBiZWVuIGRlY2xhcmVkIGJ1dCBuZXZlciB1c2VkLgotQ29uc3RydWN0aW5nIE5GQSA6IDM1OCBzdGF0ZXMgaW4gTkZBCi1Db252ZXJ0aW5nIE5GQSB0byBERkEgOiAKLS4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KLTc5IHN0YXRlcyBiZWZvcmUgbWluaW1pemF0aW9uLCA1NCBzdGF0ZXMgaW4gbWluaW1pemVkIERGQQotV3JpdGluZyBjb2RlIHRvICJYTUxIZWFkVG9rZW5pemVyLmphdmEiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL29sZFhNTEhlYWRUb2tlbml6ZXIuc2tlbGV0b24gYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9IZWFkUGFyc2Vycy9YTUxIZWFkVG9rZW5pemVyL29sZFhNTEhlYWRUb2tlbml6ZXIuc2tlbGV0b24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MDk2MDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci9vbGRYTUxIZWFkVG9rZW5pemVyLnNrZWxldG9uCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLQ0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovDQotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOw0KLQ0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovDQotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcA0KLQ0KLSAgLyogZXJyb3IgY29kZXMgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7DQotDQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7DQotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkDQotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkDQotICB9Ow0KLQ0KLS0tLSBpc0ZpbmFsIGxpc3QNCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICBwcml2YXRlIGludCB5eV9zdGF0ZTsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7DQotDQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7DQotDQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgZnJvbSBpbnB1dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsNCi0NCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5bGluZTsNCi0NCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsNCi0NCi0gIA0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsNCi0NCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQ0KLQ0KLS0tLSB1c2VyIGNsYXNzIGNvZGUNCi0NCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyDQotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuDQotICAgKg0KLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uDQotICAgKi8NCi0tLS0gY29uc3RydWN0b3IgZGVjbGFyYXRpb24NCi0NCi0NCi0gIC8qKg0KLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlDQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0NCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0NCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyANCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLw0KLQ0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLw0KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgew0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsNCi0NCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLw0KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfc3RhcnRSZWFkID0gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8NCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsNCi0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7DQotICAgIH0NCi0NCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovDQotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7DQotDQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsNCi0NCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7DQotDQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0gIH0NCi0NCi0gICAgDQotICAvKioNCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8NCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovDQotICAgIHl5X3JlYWRlci5jbG9zZSgpOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsNCi0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7DQotICB9DQotDQotICAvKioNCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKg0KLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgew0KLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgew0KLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgew0KLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24NCi0gICAqDQotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsNCi0gICAgdHJ5IHsNCi0gICAgICAvL0xvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7DQotCVN5c3RlbS5vdXQucHJpbnRsbigiU2NhbkVycm9yOiAiICsgZXJyb3JDb2RlICsgIjogIiArIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsNCi0gICAgfQ0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsNCi0gICAgICAvL0xvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5FcnJvcjogIiArIGVycm9yQ29kZSArICI6ICIgKyBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLSAgIH0NCi0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yDQotICAgIC8vIFN5c3RlbS5leGl0KDEpOw0KLSAgfSANCi0NCi0NCi0gIC8qKg0KLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uDQotICAgKg0KLSAgICogVGhleSB3aWxsIGJlIHJlYWQgYWdhaW4gYnkgdGhlbiBuZXh0IGNhbGwgb2YgdGhlIHNjYW5uaW5nIG1ldGhvZA0KLSAgICoNCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLg0KLSAgICogICAgICAgICAgICAgICAgVGhpcyBudW1iZXIgbXVzdCBub3QgYmUgZ3JlYXRlciB0aGFuIHl5bGVuZ3RoKCkhDQotICAgKi8NCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsNCi0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkNCi0gICAgICB5eV9TY2FuRXJyb3IoWVlfUFVTSEJBQ0tfMkJJRyk7DQotDQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7DQotICB9DQotDQotDQotLS0tIHl5X2RvRW9mDQotICAvKioNCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsDQotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuDQotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzDQotICAgKi8NCi0tLS0geXlsZXggZGVjbGFyYXRpb24NCi0gICAgaW50IHl5X2lucHV0Ow0KLSAgICBpbnQgeXlfYWN0aW9uOw0KLQ0KLS0tLSBsb2NhbCBkZWNsYXJhdGlvbnMNCi0NCi0gICAgd2hpbGUgKHRydWUpIHsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxpbmUsIGNoYXIsIGNvbCBjb3VudCkNCi0gICAgICB5eV9hY3Rpb24gPSAtMTsNCi0NCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOw0KLQ0KLS0tLSBzdGFydCBhZG1pbiAobGV4c3RhdGUgZXRjKQ0KLQ0KLSAgICAgIHl5X2ZvckFjdGlvbjogew0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsNCi0gICAgDQotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOw0KLQ0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOw0KLQ0KLS0tLSBsaW5lLCBjb2wsIGNoYXIgY291bnQsIG5leHQgdHJhbnNpdGlvbiwgaXNGaW5hbCBhY3Rpb24NCi0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgDQotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgDQotLS0tIGxpbmUgY291bnQgdXBkYXRlDQotICAgICAgICAgIH0NCi0NCi0gICAgICAgIH0NCi0gICAgICB9DQotDQotLS0tIGNoYXIgY291bnQgdXBkYXRlDQotDQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgDQotDQotLS0tIGFjdGlvbnMNCi0gICAgICAgIGRlZmF1bHQ6IA0KLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsNCi0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7DQotLS0tIGVvZnZhbHVlDQotICAgICAgICAgIH0gDQotICAgICAgICAgIGVsc2Ugew0KLS0tLSBubyBtYXRjaA0KLSAgICAgICAgICB9DQotICAgICAgfQ0KLSAgICB9DQotICB9ICAgIA0KLQ0KLS0tLSBtYWluDQotDQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0NTU1Rva2VuaXplci9kZXZlbC9DU1NUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwY2U2OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDA0LzEwLzAxIDIyOjUzICovCi0KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNzcy5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY3NzLmludGVybmFsLnBhcnNlci5yZWdpb25zLkNTU1RleHRSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3MucGFyc2VyLkNTU1JlZ2lvbkNvbnRleHRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3MucGFyc2VyLkNTU1RleHRUb2tlbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JVGV4dFJlZ2lvbjsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKi8KLXB1YmxpYyBjbGFzcyBDU1NUb2tlbml6ZXIgaW1wbGVtZW50cyBDU1NSZWdpb25Db250ZXh0cyB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0lNUE9SVF9ERUxJTUlURVIgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1IgPSAwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DSEFSU0VUX0RFTElNSVRFUiA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OX1ZBTFVFID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BBR0VfUFNFVURPX1BBR0UgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9JTVBPUlRfVVJJID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IgPSAxMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREVDTEFSQVRJT04gPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEFHRV9ERUxJTUlURVIgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUgPSAxMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVESUFfTUVESVVNID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0hBUlNFVF9OQU1FID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSU1QT1JUX01FRElVTSA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUiA9IDE2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9GT05UX0ZBQ0VfREVMSU1JVEVSID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfTUVESUFfREVMSU1JVEVSID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfU0VMRUNUT1JfTU9ESUZJRVIgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVwxMVwxXDE3XDFcMFwxXDRcMVwyMFwyMlwwXDFcNlwxXDMxXDFcMTAiKwotICAgICJcMVwyMlwxXDE2XDFcNzJcMVwxNlwxXDVcMVwyNlwxXDEyXDFcMzVcMVwxNFwxXDU1IisKLSAgICAiXDFcMTNcMVwxNVwxXDM0XDEyXDFcMVw2MlwxXDUwXDFcMzBcMVw2N1wxXDMyXDFcMjEiKwotICAgICJcMVwzNlwxXDQzXDFcMjdcMVw0MFwxXDU3XDFcNDZcMVw2NFwxXDYxXDFcNDFcMVw1MSIrCi0gICAgIlwyXDJcMVwyNVwxXDUyXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDI0XDFcNDRcMVw0NyIrCi0gICAgIlwxXDIzXDVcMlwxXDY2XDFcM1wxXDcxXDFcMTZcMVwyXDFcMTZcMVw0MlwxXDciKwotICAgICJcMVwzN1wxXDU2XDFcNDVcMVw2M1wxXDYxXDFcNDFcMVw1MVwyXDJcMVwyNVwxXDUyIisKLSAgICAiXDFcNjVcMVw1NFwxXDUzXDFcMlwxXDI0XDFcNDRcMVw0N1wxXDIzXDVcMlwxXDYwIisKLSAgICAiXDFcNzBcMVwzM1wxXDcwXDFcMFx1ZmY4MFwyIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDU5LCAgIDExOCwgICAxNzcsICAgMjM2LCAgIDI5NSwgICAzNTQsICAgNDEzLCAgIDQ3MiwgICA1MzEsIAotICAgICAgNTkwLCAgIDY0OSwgICA3MDgsICAgNzY3LCAgIDgyNiwgICA4ODUsICAgOTQ0LCAgMTAwMywgIDEwNjIsICAxMTIxLCAKLSAgICAgMTE4MCwgIDEyMzksICAxMjk4LCAgMTM1NywgIDE0MTYsICAxNDc1LCAgMTUzNCwgIDExMjEsICAxNTkzLCAgMTEyMSwgCi0gICAgIDE2NTIsICAxNzExLCAgMTEyMSwgIDE3NzAsICAxODI5LCAgMTg4OCwgIDExMjEsICAxOTQ3LCAgMjAwNiwgIDIwNjUsIAotICAgICAyMTI0LCAgMjE4MywgIDIyNDIsICAxMTIxLCAgMjMwMSwgIDIzNjAsICAyNDE5LCAgMTEyMSwgIDExMjEsICAyNDc4LCAKLSAgICAgMjUzNywgIDI1OTYsICAxMTIxLCAgMjY1NSwgIDI3MTQsICAxMTIxLCAgMTEyMSwgIDI3NzMsICAyODMyLCAgMjg5MSwgCi0gICAgIDExMjEsICAyOTUwLCAgMTEyMSwgIDMwMDksICAzMDY4LCAgMzEyNywgIDMxODYsICAzMjQ1LCAgMzMwNCwgIDMzNjMsIAotICAgICAzNDIyLCAgMTEyMSwgIDExMjEsICAzNDgxLCAgMzU0MCwgIDM1OTksICAzNjU4LCAgMzcxNywgIDExMjEsICAzNzc2LCAKLSAgICAgMzgzNSwgIDM4OTQsICAzOTUzLCAgNDAxMiwgIDQwNzEsICAxNTkzLCAgMTEyMSwgIDQxMzAsICAxMjM5LCAgNDE4OSwgCi0gICAgIDQyNDgsICAxNDE2LCAgNDMwNywgIDE0NzUsICA0MzY2LCAgNDQyNSwgIDQ0ODQsICA0NTQzLCAgNDYwMiwgIDQ2NjEsIAotICAgICA0NzIwLCAgNDc3OSwgIDQ4MzgsICA0ODk3LCAgMTc3MCwgIDQ5NTYsICAxMTIxLCAgMTgyOSwgIDUwMTUsICA1MDc0LCAKLSAgICAgMTk0NywgIDUxMzMsICAxMTIxLCAgMjAwNiwgIDUxOTIsICA1MjUxLCAgMjE4MywgIDUzMTAsICA1MzY5LCAgMjM2MCwgCi0gICAgIDU0MjgsICA1NDg3LCAgMjUzNywgIDU1NDYsICA1NjA1LCAgMTEyMSwgIDI3MTQsICAyODMyLCAgNTY2NCwgIDU3MjMsIAotICAgICAzMDY4LCAgNTc4MiwgIDMxMjcsICA1ODQxLCAgMTEyMSwgIDMxODYsICA1OTAwLCAgNTk1OSwgIDMzNjMsICA2MDE4LCAKLSAgICAgNjA3NywgIDYxMzYsICA2MTk1LCAgMzg5NCwgIDExMjEsICAzNTk5LCAgMTEyMSwgIDYyNTQsICAzNjU4LCAgNjMxMywgCi0gICAgIDExMjEsICAzNzE3LCAgNjM3MiwgIDY0MzEsICA2NDkwLCAgNjU0OSwgIDM5NTMsICA2NjA4LCAgNjY2NywgIDY3MjYsIAotICAgICA0MDcxLCAgNjc4NSwgIDExMjEsICA0MTMwLCAgNjg0NCwgIDExMjEsICA2OTAzLCAgNjk2MiwgIDcwMjEsICA3MDgwLCAKLSAgICAgNzEzOSwgIDcxOTgsICA3MjU3LCAgNzMxNiwgIDczNzUsICA3NDM0LCAgNzQ5MywgIDc1NTIsICAxNzcwLCAgNzYxMSwgCi0gICAgIDc2NzAsICAxODI5LCAgNzcyOSwgIDc3ODgsICAxOTQ3LCAgNzg0NywgIDc5MDYsICAyMDA2LCAgNzk2NSwgIDgwMjQsIAotICAgICA4MDgzLCAgODE0MiwgIDgyMDEsICA4MjYwLCAgODMxOSwgIDgzNzgsICAzMTI3LCAgODQzNywgIDg0OTYsICAzMTg2LCAKLSAgICAgODU1NSwgIDg2MTQsICA4NjczLCAgODczMiwgIDg3OTEsICAzNjU4LCAgODg1MCwgIDg5MDksICAzNzE3LCAgODk2OCwgCi0gICAgIDkwMjcsICA5MDg2LCAgOTE0NSwgIDkyMDQsICA5MjYzLCAgOTMyMiwgIDkzODEsICAxMTIxLCAgMTEyMSwgIDk0NDAsIAotICAgICA5NDk5LCAgOTU1OCwgIDk2MTcsICA5Njc2LCAgOTczNSwgIDk3OTQsICA5ODUzLCAgOTkxMiwgIDk5NzEsIDEwMDMwLCAKLSAgICAxMDA4OSwgMTAxNDgsIDEwMjA3LCAxMDI2NiwgMTAzMjUsIDEwMzg0LCAxMDQ0MywgMTA1MDIsIDEwNTYxLCAxMDYyMCwgCi0gICAgMTA2NzksIDEwNzM4LCAxMDc5NywgMTA4NTYsIDEwOTE1LCAxMDk3NCwgMTEwMzMsIDExMDkyLCAxMTE1MSwgMTEyMTAsIAotICAgIDExMjY5LCAxMTMyOCwgMTEzODcsIDExNDQ2LCAxMTUwNSwgIDExMjEsIDExNTY0LCAxMTYyMywgIDExMjEsIDExNjgyLCAKLSAgICAxMTc0MSwgMTE4MDAsIDExODU5LCAxMTkxOCwgMTE5NzcsIDEyMDM2LCAxMjA5NSwgMTIxNTQsIDEyMjEzLCAgMTEyMSwgCi0gICAgMTIyNzIsIDEyMzMxLCAxMjM5MCwgMTI0NDksIDEyNTA4LCAxMjU2NywgMTI2MjYsIDEyNjg1LCAxMjc0NCwgMTI4MDMsIAotICAgIDEyODYyLCAxMjkyMSwgMTI5ODAsIDEzMDM5LCAxMzA5OCwgMTMxNTcsIDEzMjE2LCAxMTA5MiwgMTMyNzUsIDEzMzM0LCAKLSAgICAgMTEyMSwgMTMzOTMsIDEzNDUyLCAxMzUxMSwgMTM1NzAsIDEzNjI5LCAxMzY4OCwgIDExMjEsIDEzNzQ3LCAxMzgwNiwgCi0gICAgMTM4NjUsIDEzOTI0LCAxMzk4MywgMTQwNDIsIDE0MTAxLCAxNDE2MCwgMTQyMTksIDEyMDM2LCAxNDI3OCwgMTQzMzcsIAotICAgIDE0Mzk2LCAxNDQ1NSwgMTQ1MTQsIDE0NTczLCAxNDYzMiwgMTQ2OTEsIDE0NzUwLCAxNDgwOSwgMTQ4NjgsIDE0OTI3LCAKLSAgICAxNDk4NiwgMTUwNDUsIDE1MTA0LCAxNTE2MywgMTUyMjIsIDE1MjgxLCAxNTM0MCwgMTMxNTcsIDE1Mzk5LCAxNTQ1OCwgCi0gICAgMTU1MTcsIDE1NTc2LCAxNTYzNSwgMTU2OTQsIDE1NzUzLCAgMTEyMSwgMTU4MTIsIDE1ODcxLCAxNTkzMCwgMTU5ODksIAotICAgIDE2MDQ4LCAxNjEwNywgMTYxNjYsIDE2MjI1LCAxNjI4NCwgMTYzNDMsIDE2NDAyLCAxNjQ2MSwgMTY1MjAsIDE2NTc5LCAKLSAgICAxNjYzOCwgMTY2OTcsIDE2NzU2LCAxNjgxNSwgMTY4NzQsIDE2OTMzLCAxNjk5MiwgMTcwNTEsIDE3MTEwLCAxNzE2OSwgCi0gICAgMTcyMjgsIDE3Mjg3LCAxNzM0NiwgMTc0MDUsIDE3NDY0LCAxNzUyMywgMTc1ODIsIDE3NjQxLCAxNzcwMCwgMTc3NTksIAotICAgIDE3ODE4LCAxNzg3NywgMTc5MzYsIDE3OTk1LCAxODA1NCwgIDExMjEsIDE4MTEzLCAxODE3MiwgMTgyMzEsIDE4MjkwLCAKLSAgICAxODM0OSwgMTg0MDgsIDE4NDY3LCAxODUyNiwgMTg1ODUsIDEyMTU0LCAxODY0NCwgMTIyMTMsIDE4NzAzLCAxODc2MiwgCi0gICAgMTg4MjEsIDE4ODgwLCAxODkzOSwgMTg5OTgsIDE5MDU3LCAxOTExNiwgMTkxNzUsIDE5MjM0LCAxMzI3NSwgMTkyOTMsIAotICAgIDEzMzM0LCAxOTM1MiwgMTk0MTEsIDE5NDcwLCAxOTUyOSwgMTk1ODgsIDE5NjQ3LCAxOTcwNiwgMTk3NjUsIDE5ODI0LCAKLSAgICAxOTg4MywgMTk5NDIsICAxMTIxLCAyMDAwMSwgMjAwNjAsIDIwMTE5LCAyMDE3OCwgIDExMjEsIDIwMjM3LCAyMDI5NiwgCi0gICAgMjAzNTUsICAxMTIxLCAyMDQxNCwgMjA0NzMsIDIwNTMyLCAyMDU5MSwgMjA2NTAsIDIwNzA5LCAyMDc2OCwgMjA4MjcsIAotICAgIDIwODg2LCAyMDk0NQotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDJcMjRcMVwyNVwxXDI2XDFcMjdcMVwyNFwxXDI3XDFcMjVcMVwyNCIrCi0gICAgIlwxXDI3XDFcMjRcMVwzMFwxXDI0XDFcMzFcMVwyNFwyXDI3XDFcMjQiKwotICAgICJcMVwzMlwzXDI1XDFcMjRcMVwyNVwxXDMzXDJcMjRcMVwzNFwxXDM1IisKLSAgICAiXDFcMzZcMVwzN1wxMVwyNVwxXDI0XDRcMjVcMVwyNFwyXDI1XDFcMjQiKwotICAgICJcMVwyNVwxXDQwXDNcMjVcMVw0MVwxMFwyNFwxXDI3XDFcNDJcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDNcMVwyN1wxXDI0XDFcNDRcM1wyNFwyXDI3XDdcMjQiKwotICAgICJcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcNDBcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcMjdcMlwyNFwxXDI3XDFcMjRcMVw0NFwzXDI0XDJcMjciKwotICAgICJcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzN1wxMVwyNCIrCi0gICAgIlwxXDQ1XDI2XDI0XDFcMjdcMVw0NlwxXDI3XDFcMjRcMVw0N1wxXDI3IisKLSAgICAiXDFcMjRcMVw0NFwzXDI0XDJcMjdcMlwyNFwxXDUwXDRcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVw0NVwyNFwyNCIrCi0gICAgIlwxXDUxXDFcNTJcMVwyN1wxXDI0XDFcMjdcMVw1MVwxXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDUzXDNcMjRcMlwyN1wyXDI0XDNcNTFcMVwyNFwxXDUxIisKLSAgICAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDUxXDFcNDUiKwotICAgICJcNFw1MVwxXDI0XDJcNTFcMVwyNFwxXDUxXDFcMjRcM1w1MVwxMVwyNCIrCi0gICAgIlwxXDI3XDFcMjRcMVwyN1wyXDI0XDFcMjdcMVwyNFwxXDQ0XDNcMjQiKwotICAgICJcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3IisKLSAgICAiXDExXDI0XDFcNDVcNFwyNFwxXDU0XDE3XDI0XDFcNTVcMVw1NlwxXDI3IisKLSAgICAiXDFcMjRcMVwyN1wxXDU1XDFcMjRcMVwyN1wxXDI0XDFcNTdcM1wyNCIrCi0gICAgIlwyXDI3XDJcMjRcM1w1NVwxXDI0XDFcNTVcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMTFcNTVcMVwyNFw0XDU1XDFcMjRcMlw1NSIrCi0gICAgIlwxXDI0XDFcNTVcMVwyNFwzXDU1XDExXDI0XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDJcMjRcMVwyN1wxXDI0XDFcNDRcM1wyNFwyXDI3XDdcMjRcMVwzMyIrCi0gICAgIlwyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzdcMTZcMjRcMVw2MFwyXDI0IisKLSAgICAiXDFcNjFcMTRcMjRcMVw2MlwxXDYzXDFcMjdcMVwyNFwxXDI3XDFcNjIiKwotICAgICJcMVwyNFwxXDI3XDFcMjRcMVw2NFwzXDI0XDJcMjdcMlwyNFwzXDYyIisKLSAgICAiXDFcMjRcMVw2MlwxXDMzXDJcMjRcMVwzNFwxXDM1XDFcMjRcMVwzNyIrCi0gICAgIlwxMVw2MlwxXDI0XDRcNjJcMVwyNFwyXDYyXDFcNjVcMVw2MlwxXDY2IisKLSAgICAiXDNcNjJcMTFcMjRcMVwyN1wxXDI0XDFcMjdcMlwyNFwxXDI3XDFcMjQiKwotICAgICJcMVw0NFwzXDI0XDJcMjdcN1wyNFwxXDMzXDJcMjRcMVwzNFwxXDM1IisKLSAgICAiXDFcMjRcMVwzN1wyMVwyNFwxXDY1XDE2XDI0XDFcNjdcMVwyNFwxXDY3IisKLSAgICAiXDJcMjRcMVw2N1wxXDI0XDFcNDRcMVw3MFwxXDMxXDFcMjRcMlw2NyIrCi0gICAgIlwxXDI0XDFcMzJcNVwyNFwxXDMzXDFcMjRcMVw3MFwxXDM0XDFcMzUiKwotICAgICJcMVwzNlwxXDM3XDE2XDI0XDFcNzFcMlwyNFwxXDY1XDFcMjRcMVw0MCIrCi0gICAgIlwzXDI0XDFcNDFcNlwyNFwxXDcyXDFcNzNcMVwyN1wxXDI0XDFcMjciKwotICAgICJcMVw3MlwxXDI0XDFcMjdcMVwyNFwxXDc0XDNcMjRcMlwyN1wyXDI0IisKLSAgICAiXDNcNzJcMVwyNFwxXDcyXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNCIrCi0gICAgIlwxXDM3XDExXDcyXDFcMjRcNFw3MlwxXDI0XDJcNzJcMVwyNFwxXDcyIisKLSAgICAiXDFcMjRcM1w3MlwxMVwyNFwxXDI3XDFcMjRcMVwyN1wyXDI0XDFcMjciKwotICAgICJcMVwyNFwxXDQ0XDNcMjRcMlwyN1w3XDI0XDFcMzNcMlwyNFwxXDM0IisKLSAgICAiXDFcMzVcMVwyNFwxXDM3XDMwXDI0XDFcNzVcMVw3NlwxXDc3XDNcMjQiKwotICAgICJcMVwxMDBcMVwxMDFcMVwyN1wxXDEwMlwxXDI3XDFcMTAwXDFcMTAzXDFcMjciKwotICAgICJcMVwyNFwxXDEwNFwzXDI0XDJcMjdcMlwyNFwzXDEwMFwxXDI0XDFcMTAwIisKLSAgICAiXDFcMzNcMlwyNFwxXDM0XDFcMzVcMVwyNFwxXDM3XDExXDEwMFwxXDI0IisKLSAgICAiXDRcMTAwXDFcMjRcMlwxMDBcMVwyNFwxXDEwMFwxXDI0XDNcMTAwXDExXDI0IisKLSAgICAiXDFcMjdcMVwyNFwxXDI3XDJcMjRcMVwyN1wxXDI0XDFcNDRcM1wyNCIrCi0gICAgIlwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0XDFcMzciKwotICAgICJcMzJcMjRcMVw3N1wzXDI0XDFcMTA1XDFcMTA2XDFcMjdcMVwyNFwxXDI3IisKLSAgICAiXDFcMTA1XDFcMjRcMVwyN1wxXDI0XDFcMTA3XDNcMjRcMlwyN1wyXDI0IisKLSAgICAiXDNcMTA1XDFcMjRcMVwxMDVcMVwzM1wyXDI0XDFcMzRcMVwzNVwxXDI0IisKLSAgICAiXDFcMzdcMTFcMTA1XDFcMTEwXDRcMTA1XDFcMjRcMlwxMDVcMVwyNFwxXDEwNSIrCi0gICAgIlwxXDI0XDNcMTA1XDExXDI0XDFcMjdcMVwyNFwxXDI3XDJcMjRcMVwyNyIrCi0gICAgIlwxXDI0XDFcNDRcM1wyNFwyXDI3XDdcMjRcMVwzM1wyXDI0XDFcMzQiKwotICAgICJcMVwzNVwxXDI0XDFcMzdcMTFcMjRcMVwxMTBcMTFcMjRcMVwxMTFcMTFcMjQiKwotICAgICJcMVwxMTJcMVwxMTNcMVwxMTRcMVwyN1wxXDExNVwxXDI3XDFcMTEzXDFcMTE2IisKLSAgICAiXDFcMjdcMVwxMTdcMVwxMjBcMVwxMjFcMVwxMjJcMVwyNFwyXDI3XDFcMjQiKwotICAgICJcMVwxMjNcMVwxMjRcMlwxMTNcMVwyNFwxXDExM1wxXDMzXDFcMTI1XDFcMjQiKwotICAgICJcMVwzNFwxXDEyNlwxXDI0XDFcMzdcMTFcMTEzXDFcMTEwXDRcMTEzXDFcMTI3IisKLSAgICAiXDJcMTEzXDFcMjRcMVwxMTNcMVwyNFwzXDExM1w2XDI0XDFcMTEyXDFcMTEzIisKLSAgICAiXDFcMTE0XDFcMTMwXDFcMTE1XDFcMTMwXDFcMTEzXDFcMTE2XDFcMTMwXDFcMTE3IisKLSAgICAiXDFcMTIwXDFcMTIxXDFcMTIyXDFcMjRcMlwxMzBcMVwyNFwxXDEyM1wxXDEyNCIrCi0gICAgIlwyXDExM1wxXDI0XDFcMTEzXDFcMzNcMVwxMjVcMVwyNFwxXDM0XDFcMTI2IisKLSAgICAiXDFcMjRcMVwzN1wxMVwxMTNcMVwxMTBcNFwxMTNcMVwxMjdcMlwxMTNcMVwyNCIrCi0gICAgIlwxXDExM1wxXDI0XDNcMTEzXDVcMjRcNzRcMFwyXDI1XDFcMTMxXDNcMCIrCi0gICAgIlwxXDI1XDNcMFwxXDI1XDdcMFwzXDI1XDFcMFwxXDI1XDdcMCIrCi0gICAgIlwxMVwyNVwxXDBcNFwyNVwxXDBcMlwyNVwxXDBcMVwyNVwxXDAiKwotICAgICJcM1wyNVw2XDBcMVwxMzJcMlwyNVwxXDBcMlwyNVwxXDEzMlwxXDI1IisKLSAgICAiXDFcMFw1XDI1XDJcMFwxNlwyNVwxXDEzMlwyXDI1XDFcMTMyXDJcMjUiKwotICAgICJcMVwxMzJcMTBcMjVcMVwxMzJcNFwyNVwxXDEzMlw3XDI1XDRcMFwxXDI3IisKLSAgICAiXDFcMFwxXDI3XDJcMFwxXDI3XDVcMFwyXDI3XDUzXDBcMlwyNSIrCi0gICAgIlwxXDEzMVwzXDBcMVwyNVwzXDBcMVwxMzNcN1wwXDNcMjVcMVwwIisKLSAgICAiXDFcMjVcN1wwXDExXDI1XDFcMFw0XDI1XDFcMFwyXDI1XDFcMCIrCi0gICAgIlwxXDI1XDFcMFwzXDI1XDZcMFwyXDEzNFwxXDEzNVwzXDBcMVwxMzQiKwotICAgICJcM1wwXDFcMTM0XDdcMFwzXDEzNFwxXDBcMVwxMzRcN1wwXDExXDEzNCIrCi0gICAgIlwxXDBcNFwxMzRcMVwwXDJcMTM0XDFcMFwxXDEzNFwxXDBcM1wxMzQiKwotICAgICJcNlwwXDJcMTM2XDFcMTM3XDNcMFwxXDEzNlwzXDBcMVwxMzZcN1wwIisKLSAgICAiXDNcMTM2XDFcMFwxXDEzNlw3XDBcMTFcMTM2XDFcMFw0XDEzNlwxXDAiKwotICAgICJcMlwxMzZcMVwwXDFcMTM2XDFcMFwzXDEzNlwzNlwwXDFcMTQwXDc2XDAiKwotICAgICJcMVwxNDFcNzRcMFwyXDE0MlwxMFwwXDFcMTQzXDFcMTQ0XDFcMTQ1XDdcMCIrCi0gICAgIlwyXDE0NlwxMFwwXDFcMTQ3XDFcMTUwXDNcMFwxXDE0N1wzXDBcMVwxNDciKwotICAgICJcN1wwXDNcMTQ3XDFcMFwxXDE0N1w3XDBcMTFcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMlwxNDdcMVwwXDFcMTQ3XDFcMFwzXDE0N1w2XDBcMlwxNTEiKwotICAgICJcMVwxNTJcMVwwXDFcMTUzXDExXDE1MVwyXDBcNTJcMTUxXDFcMFwyXDE1NCIrCi0gICAgIlwxXDE1NVwxXDBcM1wxNTRcMVwxNTNcNlwxNTRcMlwwXDUyXDE1NFwxM1wwIisKLSAgICAiXDFcMTU2XDYwXDBcMlwxNTdcMVwxNjBcMVwwXDFcMTYxXDExXDE1N1wyXDAiKwotICAgICJcNTJcMTU3XDFcMFwyXDE2MlwxXDE2M1wxXDBcM1wxNjJcMVwxNjFcNlwxNjIiKwotICAgICJcMlwwXDUyXDE2MlwyNFwwXDFcMTY0XDQ3XDBcMlw1MVwxXDE2NVwzXDAiKwotICAgICJcMVw1MVwzXDBcMVw1MVw3XDBcM1w1MVwxXDBcMVw1MVw3XDAiKwotICAgICJcMTFcNTFcMVwwXDRcNTFcMVwwXDJcNTFcMVwwXDFcNTFcMVwwIisKLSAgICAiXDNcNTFcNlwwXDFcMTY2XDJcNTFcMVwwXDJcNTFcMVwxNjZcMVw1MSIrCi0gICAgIlwxXDBcNVw1MVwyXDBcMTZcNTFcMVwxNjZcMlw1MVwxXDE2NlwyXDUxIisKLSAgICAiXDFcMTY2XDEwXDUxXDFcMTY2XDRcNTFcMVwxNjZcN1w1MVwxXDBcMlw1MSIrCi0gICAgIlwxXDE2NVwzXDBcMVw1MVwzXDBcMVwxNjdcN1wwXDNcNTFcMVwwIisKLSAgICAiXDFcNTFcN1wwXDExXDUxXDFcMFw0XDUxXDFcMFwyXDUxXDFcMCIrCi0gICAgIlwxXDUxXDFcMFwzXDUxXDZcMFwyXDU1XDFcMTcwXDNcMFwxXDU1IisKLSAgICAiXDNcMFwxXDU1XDdcMFwzXDU1XDFcMFwxXDU1XDdcMFwxMVw1NSIrCi0gICAgIlwxXDBcNFw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDBcM1w1NSIrCi0gICAgIlw2XDBcMVwxNzFcMlw1NVwxXDBcMlw1NVwxXDE3MVwxXDU1XDFcMCIrCi0gICAgIlw1XDU1XDJcMFwxNlw1NVwxXDE3MVwyXDU1XDFcMTcxXDJcNTVcMVwxNzEiKwotICAgICJcMTBcNTVcMVwxNzFcNFw1NVwxXDE3MVw3XDU1XDFcMFwyXDU1XDFcMTcwIisKLSAgICAiXDNcMFwxXDU1XDNcMFwxXDE3Mlw3XDBcM1w1NVwxXDBcMVw1NSIrCi0gICAgIlw3XDBcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTUiKwotICAgICJcMVwwXDNcNTVcNlwwXDJcNjJcMVwxNzNcM1wwXDFcNjJcM1wwIisKLSAgICAiXDFcNjJcN1wwXDNcNjJcMVwwXDFcNjJcN1wwXDExXDYyXDFcMCIrCi0gICAgIlw0XDYyXDFcMFwyXDYyXDFcMFwxXDYyXDFcMFwzXDYyXDZcMCIrCi0gICAgIlwxXDE3NFwyXDYyXDFcMFwyXDYyXDFcMTc0XDFcNjJcMVwwXDVcNjIiKwotICAgICJcMlwwXDE2XDYyXDFcMTc0XDJcNjJcMVwxNzRcMlw2MlwxXDE3NFwxMFw2MiIrCi0gICAgIlwxXDE3NFw0XDYyXDFcMTc0XDdcNjJcMVwwXDJcNjJcMVwxNzNcM1wwIisKLSAgICAiXDFcNjJcM1wwXDFcMTc1XDdcMFwzXDYyXDFcMFwxXDYyXDdcMCIrCi0gICAgIlwxMVw2MlwxXDBcNFw2MlwxXDBcMlw2MlwxXDBcMVw2MlwxXDAiKwotICAgICJcM1w2Mlw3XDBcMVw2MlwxXDE3M1wzXDBcMVw2MlwzXDBcMVw2MiIrCi0gICAgIlw3XDBcM1w2MlwxXDBcMVw2Mlw3XDBcMTFcNjJcMVwwXDRcNjIiKwotICAgICJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjJcNVwwXDRcMTc2IisKLSAgICAiXDFcMTc3XDFcMTc2XDFcMTc3XDJcMTc2XDFcMTc3XDJcMTc2XDFcMFwyXDE3NiIrCi0gICAgIlwyXDE3N1wxMVwxNzZcMVwwXDI1XDE3NlwxXDBcMTJcMTc2XDFcMFwyXDcyIisKLSAgICAiXDFcMjAwXDNcMFwxXDcyXDNcMFwxXDcyXDdcMFwzXDcyXDFcMCIrCi0gICAgIlwxXDcyXDdcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MlwxXDAiKwotICAgICJcMVw3MlwxXDBcM1w3Mlw2XDBcMVwyMDFcMlw3MlwxXDBcMlw3MiIrCi0gICAgIlwxXDIwMVwxXDcyXDFcMFw1XDcyXDJcMFwxNlw3MlwxXDIwMVwyXDcyIisKLSAgICAiXDFcMjAxXDJcNzJcMVwyMDFcMTBcNzJcMVwyMDFcNFw3MlwxXDIwMVw3XDcyIisKLSAgICAiXDFcMFwyXDcyXDFcMjAwXDNcMFwxXDcyXDNcMFwxXDIwMlw3XDAiKwotICAgICJcM1w3MlwxXDBcMVw3Mlw3XDBcMTFcNzJcMVwwXDRcNzJcMVwwIisKLSAgICAiXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNzRcMFwxXDc1XDRcMCIrCi0gICAgIlwyXDEwMFwxXDIwM1wzXDBcMVwxMDBcM1wwXDFcMTAwXDdcMFwzXDEwMCIrCi0gICAgIlwxXDBcMVwxMDBcN1wwXDExXDEwMFwxXDBcNFwxMDBcMVwwXDJcMTAwIisKLSAgICAiXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwXDFcMjA0XDJcMTAwXDFcMCIrCi0gICAgIlwyXDEwMFwxXDIwNFwxXDEwMFwxXDBcNVwxMDBcMlwwXDE2XDEwMFwxXDIwNCIrCi0gICAgIlwyXDEwMFwxXDIwNFwyXDEwMFwxXDIwNFwxMFwxMDBcMVwyMDRcNFwxMDBcMVwyMDQiKwotICAgICJcN1wxMDBcMVwwXDJcMjA1XDFcMjA2XDFcMFwxXDIwN1wxMVwyMDVcMlwwIisKLSAgICAiXDUyXDIwNVwxXDBcMlwyMTBcMVwyMTFcMVwwXDNcMjEwXDFcMjA3XDZcMjEwIisKLSAgICAiXDJcMFw1MlwyMTBcMVwwXDJcMTAwXDFcMjAzXDNcMFwxXDEwMFwzXDAiKwotICAgICJcMVwyMTJcN1wwXDNcMTAwXDFcMFwxXDEwMFw3XDBcMTFcMTAwXDFcMCIrCi0gICAgIlw0XDEwMFwxXDBcMlwxMDBcMVwwXDFcMTAwXDFcMFwzXDEwMFw2XDAiKwotICAgICJcMlwxMDVcMVwyMTNcM1wwXDFcMTA1XDNcMFwxXDEwNVw3XDBcM1wxMDUiKwotICAgICJcMVwwXDFcMTA1XDdcMFwxMVwxMDVcMVwwXDRcMTA1XDFcMFwyXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcMVwwXDNcMTA1XDZcMFwxXDIxNFwyXDEwNVwxXDAiKwotICAgICJcMlwxMDVcMVwyMTRcMVwxMDVcMVwwXDVcMTA1XDJcMFwxNlwxMDVcMVwyMTQiKwotICAgICJcMlwxMDVcMVwyMTRcMlwxMDVcMVwyMTRcMTBcMTA1XDFcMjE0XDRcMTA1XDFcMjE0IisKLSAgICAiXDdcMTA1XDFcMFwyXDEwNVwxXDIxM1wzXDBcMVwxMDVcM1wwXDFcMjE1IisKLSAgICAiXDdcMFwzXDEwNVwxXDBcMVwxMDVcN1wwXDExXDEwNVwxXDBcNFwxMDUiKwotICAgICJcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwXDFcMTEyIisKLSAgICAiXDFcMjE2XDFcMjE3XDNcMFwxXDIxNlwzXDBcMVwyMTZcMVwwXDFcMjIwIisKLSAgICAiXDVcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDBcNFwyMTYiKwotICAgICJcMVwwXDJcMjE2XDFcMFwxXDIxNlwxXDBcM1wyMTZcNFwwXDFcMjIxIisKLSAgICAiXDFcMFwyXDExM1wxXDIyMlwzXDBcMVwxMTNcM1wwXDFcMTEzXDdcMCIrCi0gICAgIlwzXDExM1wxXDIyM1wxXDExM1w3XDBcMTFcMTEzXDFcMFw0XDExM1wxXDAiKwotICAgICJcMlwxMTNcMVwwXDFcMTEzXDFcMFwzXDExM1w2XDBcMVwyMjRcMlwxMTMiKwotICAgICJcMVwwXDJcMTEzXDFcMjI0XDFcMTEzXDFcMFw1XDExM1wyXDBcMTZcMTEzIisKLSAgICAiXDFcMjI0XDJcMTEzXDFcMjI0XDJcMTEzXDFcMjI0XDEwXDExM1wxXDIyNFw0XDExMyIrCi0gICAgIlwxXDIyNFw3XDExM1wxXDBcMlwyMjVcMVwyMjZcMVwwXDFcMjI3XDExXDIyNSIrCi0gICAgIlwyXDBcNTJcMjI1XDFcMFwyXDIzMFwxXDIzMVwxXDBcM1wyMzBcMVwyMjciKwotICAgICJcNlwyMzBcMlwwXDUyXDIzMFwxXDBcMVwyMzJcMVwxMTNcMVwyMjJcM1wwIisKLSAgICAiXDFcMTEzXDNcMFwxXDIzM1wxXDBcMVwyMjBcNVwwXDNcMTEzXDFcMjIzIisKLSAgICAiXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMFwyXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVwwXDNcMTEzXDZcMFwxXDExMlwxM1wwXDFcMjIwXDU2XDAiKwotICAgICJcMVwyMzRcNzJcMFwyXDIzNVwxXDIzNlwzXDBcMVwyMzVcM1wwXDFcMjM1IisKLSAgICAiXDdcMFwzXDIzNVwxXDBcMVwyMzVcN1wwXDExXDIzNVwxXDBcNFwyMzUiKwotICAgICJcMVwwXDJcMjM1XDFcMFwxXDIzNVwxXDBcM1wyMzVcNlwwXDJcMTEzIisKLSAgICAiXDFcMjIyXDNcMFwxXDExM1wzXDBcMVwxMTNcMVwyMzdcNlwwXDFcMTEzIisKLSAgICAiXDFcMjQwXDFcMTEzXDFcMjIzXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcMFwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDExXDBcMVwyNDEiKwotICAgICJcMVwwXDFcMjQxXDJcMFwxXDI0MVw1XDBcMlwyNDFcMzBcMFwxXDI0MiIrCi0gICAgIlwyMVwwXDRcMjQzXDFcMjQ0XDFcMjQzXDFcMjQ0XDJcMjQzXDFcMjQ0XDVcMjQzIisKLSAgICAiXDJcMjQ0XDEyXDI0M1wxXDBcMTRcMjQzXDFcMFwyMlwyNDNcMVwwXDFcMjQ1IisKLSAgICAiXDFcMjVcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDI0NVwxXDBcMVwyNSIrCi0gICAgIlwxXDBcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNVwxXDBcMVwyNSIrCi0gICAgIlw3XDBcMVwyNDVcMlwyNVwxXDI0NVwyXDI1XDFcMjQ1XDJcMjVcMVwwIisKLSAgICAiXDRcMjVcMVwwXDFcMjQ1XDFcMjVcMVwwXDFcMjVcMVwwXDFcMjQ1IisKLSAgICAiXDJcMjVcNlwwXDJcMjVcMVwxMzFcM1wwXDFcMjVcM1wwXDFcMjUiKwotICAgICJcN1wwXDNcMjVcMVwwXDFcMjVcMlwwXDFcMjQ2XDRcMFwxMVwyNSIrCi0gICAgIlwxXDBcNFwyNVwxXDBcMlwyNVwxXDBcMVwyNVwxXDBcM1wyNSIrCi0gICAgIlw2XDBcMVwyNDdcMlwxMzRcMVwwXDJcMTM0XDFcMjQ3XDFcMTM0XDFcMCIrCi0gICAgIlw1XDEzNFwyXDBcMTZcMTM0XDFcMjQ3XDJcMTM0XDFcMjQ3XDJcMTM0XDFcMjQ3IisKLSAgICAiXDEwXDEzNFwxXDI0N1w0XDEzNFwxXDI0N1w3XDEzNFwxXDBcMVwyNTBcMlwxMzYiKwotICAgICJcMVwwXDJcMTM2XDFcMjUwXDFcMTM2XDFcMFw1XDEzNlwyXDBcMTZcMTM2IisKLSAgICAiXDFcMjUwXDJcMTM2XDFcMjUwXDJcMTM2XDFcMjUwXDEwXDEzNlwxXDI1MFw0XDEzNiIrCi0gICAgIlwxXDI1MFw3XDEzNlwxM1wwXDFcMjUxXDU3XDBcMzVcMTQxXDFcMjUyXDM1XDE0MSIrCi0gICAgIlw0MVwwXDFcMjUzXDEwM1wwXDFcMjU0XDY1XDBcMlwyNTVcNjZcMFwyXDI1NiIrCi0gICAgIlwxMDNcMFwxXDI1N1wxN1wwXDJcMTQ3XDFcMTUwXDNcMFwxXDE0N1wzXDAiKwotICAgICJcMVwxNDdcN1wwXDNcMTQ3XDFcMjYwXDFcMTQ3XDdcMFwxMVwxNDdcMVwwIisKLSAgICAiXDRcMTQ3XDFcMFwyXDE0N1wxXDBcMVwxNDdcMVwwXDNcMTQ3XDZcMCIrCi0gICAgIlwxXDI2MVwyXDE0N1wxXDBcMlwxNDdcMVwyNjFcMVwxNDdcMVwwXDVcMTQ3IisKLSAgICAiXDJcMFwxNlwxNDdcMVwyNjFcMlwxNDdcMVwyNjFcMlwxNDdcMVwyNjFcMTBcMTQ3IisKLSAgICAiXDFcMjYxXDRcMTQ3XDFcMjYxXDdcMTQ3XDFcMFwxXDI2MlwxXDE1MVwxXDE1MiIrCi0gICAgIlwxXDE1MVwxXDI2M1wxXDE1MVwxXDI2MlwxMFwxNTFcMVwyNjRcMTZcMTUxXDFcMjYyIisKLSAgICAiXDJcMTUxXDFcMjYyXDJcMTUxXDFcMjYyXDEwXDE1MVwxXDI2Mlw0XDE1MVwxXDI2MiIrCi0gICAgIlw3XDE1MVwxXDBcMVwyNjVcMVwxNTRcMVwxNTVcM1wxNTRcMVwyNjVcMVwyNjYiKwotICAgICJcN1wxNTRcMVwyNjdcMTZcMTU0XDFcMjY1XDJcMTU0XDFcMjY1XDJcMTU0XDFcMjY1IisKLSAgICAiXDEwXDE1NFwxXDI2NVw0XDE1NFwxXDI2NVw3XDE1NFwzMlwwXDFcMjQ2XDQxXDAiKwotICAgICJcMVwyNzBcMVwxNTdcMVwxNjBcMVwxNTdcMVwyNzFcMVwxNTdcMVwyNzBcMTBcMTU3IisKLSAgICAiXDFcMjcyXDE2XDE1N1wxXDI3MFwyXDE1N1wxXDI3MFwyXDE1N1wxXDI3MFwxMFwxNTciKwotICAgICJcMVwyNzBcNFwxNTdcMVwyNzBcN1wxNTdcMVwwXDFcMjczXDFcMTYyXDFcMTYzIisKLSAgICAiXDNcMTYyXDFcMjczXDFcMjc0XDdcMTYyXDFcMjc1XDE2XDE2MlwxXDI3M1wyXDE2MiIrCi0gICAgIlwxXDI3M1wyXDE2MlwxXDI3M1wxMFwxNjJcMVwyNzNcNFwxNjJcMVwyNzNcN1wxNjIiKwotICAgICJcMjVcMFwxXDI3Nlw0NlwwXDFcMjc3XDFcNTFcMVwxNjVcMVw1MVwxXDAiKwotICAgICJcMVw1MVwxXDI3N1wxXDBcMVw1MVwxXDBcMVw1MVwzXDBcMlw1MSIrCi0gICAgIlwyXDBcM1w1MVwxXDBcMVw1MVw3XDBcMVwyNzdcMlw1MVwxXDI3NyIrCi0gICAgIlwyXDUxXDFcMjc3XDJcNTFcMVwwXDRcNTFcMVwwXDFcMjc3XDFcNTEiKwotICAgICJcMVwwXDFcNTFcMVwwXDFcMjc3XDJcNTFcNlwwXDJcNTFcMVwxNjUiKwotICAgICJcM1wwXDFcNTFcM1wwXDFcNTFcN1wwXDNcNTFcMVwwXDFcNTEiKwotICAgICJcMlwwXDFcMjQ2XDRcMFwxMVw1MVwxXDBcNFw1MVwxXDBcMlw1MSIrCi0gICAgIlwxXDBcMVw1MVwxXDBcM1w1MVw2XDBcMVwzMDBcMVw1NVwxXDE3MCIrCi0gICAgIlwxXDU1XDFcMFwxXDU1XDFcMzAwXDFcMFwxXDU1XDFcMFwxXDU1IisKLSAgICAiXDNcMFwyXDU1XDJcMFwzXDU1XDFcMFwxXDU1XDdcMFwxXDMwMCIrCi0gICAgIlwyXDU1XDFcMzAwXDJcNTVcMVwzMDBcMlw1NVwxXDBcNFw1NVwxXDAiKwotICAgICJcMVwzMDBcMVw1NVwxXDBcMVw1NVwxXDBcMVwzMDBcMlw1NVw2XDAiKwotICAgICJcMlw1NVwxXDE3MFwzXDBcMVw1NVwzXDBcMVw1NVw3XDBcM1w1NSIrCi0gICAgIlwxXDBcMVw1NVwyXDBcMVwyNDZcNFwwXDExXDU1XDFcMFw0XDU1IisKLSAgICAiXDFcMFwyXDU1XDFcMFwxXDU1XDFcMFwzXDU1XDZcMFwxXDMwMSIrCi0gICAgIlwxXDYyXDFcMTczXDFcNjJcMVwwXDFcNjJcMVwzMDFcMVwwXDFcNjIiKwotICAgICJcMVwwXDFcNjJcM1wwXDJcNjJcMlwwXDNcNjJcMVwwXDFcNjIiKwotICAgICJcN1wwXDFcMzAxXDJcNjJcMVwzMDFcMlw2MlwxXDMwMVwyXDYyXDFcMCIrCi0gICAgIlw0XDYyXDFcMFwxXDMwMVwxXDYyXDFcMFwxXDYyXDFcMFwxXDMwMSIrCi0gICAgIlwyXDYyXDZcMFwyXDYyXDFcMTczXDNcMFwxXDYyXDNcMFwxXDYyIisKLSAgICAiXDdcMFwzXDYyXDFcMFwxXDYyXDJcMFwxXDI0Nlw0XDBcMTFcNjIiKwotICAgICJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwXDFcNjJcMVwwXDNcNjIiKwotICAgICJcNlwwXDFcMzAyXDFcNzJcMVwyMDBcMVw3MlwxXDBcMVw3MlwxXDMwMiIrCi0gICAgIlwxXDBcMVw3MlwxXDBcMVw3MlwzXDBcMlw3MlwyXDBcM1w3MiIrCi0gICAgIlwxXDBcMVw3Mlw3XDBcMVwzMDJcMlw3MlwxXDMwMlwyXDcyXDFcMzAyIisKLSAgICAiXDJcNzJcMVwwXDRcNzJcMVwwXDFcMzAyXDFcNzJcMVwwXDFcNzIiKwotICAgICJcMVwwXDFcMzAyXDJcNzJcNlwwXDJcNzJcMVwyMDBcM1wwXDFcNzIiKwotICAgICJcM1wwXDFcNzJcN1wwXDNcNzJcMVwwXDFcNzJcMlwwXDFcMjQ2IisKLSAgICAiXDRcMFwxMVw3MlwxXDBcNFw3MlwxXDBcMlw3MlwxXDBcMVw3MiIrCi0gICAgIlwxXDBcM1w3Mlw2XDBcMVwzMDNcMVwxMDBcMVwyMDNcMVwxMDBcMVwwIisKLSAgICAiXDFcMTAwXDFcMzAzXDFcMFwxXDEwMFwxXDBcMVwxMDBcM1wwXDJcMTAwIisKLSAgICAiXDJcMFwzXDEwMFwxXDBcMVwxMDBcN1wwXDFcMzAzXDJcMTAwXDFcMzAzIisKLSAgICAiXDJcMTAwXDFcMzAzXDJcMTAwXDFcMFw0XDEwMFwxXDBcMVwzMDNcMVwxMDAiKwotICAgICJcMVwwXDFcMTAwXDFcMFwxXDMwM1wyXDEwMFw2XDBcMVwzMDRcMVwyMDUiKwotICAgICJcMVwyMDZcMVwyMDVcMVwzMDVcMVwyMDVcMVwzMDRcMTBcMjA1XDFcMzA2XDE2XDIwNSIrCi0gICAgIlwxXDMwNFwyXDIwNVwxXDMwNFwyXDIwNVwxXDMwNFwxMFwyMDVcMVwzMDRcNFwyMDUiKwotICAgICJcMVwzMDRcN1wyMDVcMVwwXDFcMzA3XDFcMjEwXDFcMjExXDNcMjEwXDFcMzA3IisKLSAgICAiXDFcMzEwXDdcMjEwXDFcMzExXDE2XDIxMFwxXDMwN1wyXDIxMFwxXDMwN1wyXDIxMCIrCi0gICAgIlwxXDMwN1wxMFwyMTBcMVwzMDdcNFwyMTBcMVwzMDdcN1wyMTBcMVwwXDJcMTAwIisKLSAgICAiXDFcMjAzXDNcMFwxXDEwMFwzXDBcMVwxMDBcN1wwXDNcMTAwXDFcMCIrCi0gICAgIlwxXDEwMFwyXDBcMVwyNDZcNFwwXDExXDEwMFwxXDBcNFwxMDBcMVwwIisKLSAgICAiXDJcMTAwXDFcMFwxXDEwMFwxXDBcM1wxMDBcNlwwXDFcMzEyXDFcMTA1IisKLSAgICAiXDFcMjEzXDFcMTA1XDFcMFwxXDEwNVwxXDMxMlwxXDBcMVwxMDVcMVwwIisKLSAgICAiXDFcMTA1XDNcMFwyXDEwNVwyXDBcM1wxMDVcMVwwXDFcMTA1XDdcMCIrCi0gICAgIlwxXDMxMlwyXDEwNVwxXDMxMlwyXDEwNVwxXDMxMlwyXDEwNVwxXDBcNFwxMDUiKwotICAgICJcMVwwXDFcMzEyXDFcMTA1XDFcMFwxXDEwNVwxXDBcMVwzMTJcMlwxMDUiKwotICAgICJcNlwwXDJcMTA1XDFcMjEzXDNcMFwxXDEwNVwzXDBcMVwxMDVcN1wwIisKLSAgICAiXDNcMTA1XDFcMFwxXDEwNVwyXDBcMVwyNDZcNFwwXDExXDEwNVwxXDAiKwotICAgICJcNFwxMDVcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwIisKLSAgICAiXDJcMjE2XDFcMjE3XDNcMFwxXDIxNlwzXDBcMVwyMTZcN1wwXDNcMjE2IisKLSAgICAiXDFcMFwxXDIxNlw3XDBcMTFcMjE2XDFcMFw0XDIxNlwxXDBcMlwyMTYiKwotICAgICJcMVwwXDFcMjE2XDFcMFwzXDIxNlw2XDBcMVwzMTNcMlwyMTZcMVwwIisKLSAgICAiXDJcMjE2XDFcMzEzXDFcMjE2XDFcMFw1XDIxNlwyXDBcMTZcMjE2XDFcMzEzIisKLSAgICAiXDJcMjE2XDFcMzEzXDJcMjE2XDFcMzEzXDEwXDIxNlwxXDMxM1w0XDIxNlwxXDMxMyIrCi0gICAgIlw3XDIxNlwxXDBcMVwzMTRcMVwxMTNcMVwyMjJcMVwxMTNcMVwwXDFcMTEzIisKLSAgICAiXDFcMzE0XDFcMFwxXDExM1wxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMCIrCi0gICAgIlwzXDExM1wxXDIyM1wxXDExM1w3XDBcMVwzMTRcMlwxMTNcMVwzMTRcMlwxMTMiKwotICAgICJcMVwzMTRcMlwxMTNcMVwwXDRcMTEzXDFcMFwxXDMxNFwxXDExM1wxXDAiKwotICAgICJcMVwxMTNcMVwwXDFcMzE0XDJcMTEzXDZcMFwxXDMxNVwxXDIyNVwxXDIyNiIrCi0gICAgIlwxXDIyNVwxXDMxNlwxXDIyNVwxXDMxNVwxMFwyMjVcMVwzMTdcMTZcMjI1XDFcMzE1IisKLSAgICAiXDJcMjI1XDFcMzE1XDJcMjI1XDFcMzE1XDEwXDIyNVwxXDMxNVw0XDIyNVwxXDMxNSIrCi0gICAgIlw3XDIyNVwxXDBcMVwzMjBcMVwyMzBcMVwyMzFcM1wyMzBcMVwzMjBcMVwzMjEiKwotICAgICJcN1wyMzBcMVwzMjJcMTZcMjMwXDFcMzIwXDJcMjMwXDFcMzIwXDJcMjMwXDFcMzIwIisKLSAgICAiXDEwXDIzMFwxXDMyMFw0XDIzMFwxXDMyMFw3XDIzMFwxXDBcMVwyMzJcMVwxMTMiKwotICAgICJcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1wxXDBcMVwyMjBcNVwwIisKLSAgICAiXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxMVwxMTNcMVwwXDRcMTEzXDFcMCIrCi0gICAgIlwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDRcMFwxXDIyMVwxXDAiKwotICAgICJcMlwxMTNcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1w3XDBcM1wxMTMiKwotICAgICJcMVwyMjNcMVwxMTNcMlwwXDFcMjQ2XDRcMFwxMVwxMTNcMVwwXDRcMTEzIisKLSAgICAiXDFcMFwyXDExM1wxXDBcMVwxMTNcMVwwXDNcMTEzXDZcMFwxXDIzNCIrCi0gICAgIlwxXDIxNlwxXDIxN1wzXDBcMVwyMTZcM1wwXDFcMjE2XDdcMFwzXDIxNiIrCi0gICAgIlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDBcNFwyMTZcMVwwXDJcMjE2IisKLSAgICAiXDFcMFwxXDIxNlwxXDBcM1wyMTZcNFwwXDFcMjIxXDFcMFwxXDMyMyIrCi0gICAgIlwyXDIzNVwxXDBcMlwyMzVcMVwzMjNcMVwyMzVcMVwwXDVcMjM1XDJcMCIrCi0gICAgIlwxNlwyMzVcMVwzMjNcMlwyMzVcMVwzMjNcMlwyMzVcMVwzMjNcMTBcMjM1XDFcMzIzIisKLSAgICAiXDRcMjM1XDFcMzIzXDdcMjM1XDFcMFwxXDMyNFw1XDBcMVwzMjRcMTFcMCIrCi0gICAgIlwxXDMyNFw1XDBcMVwzMjRcN1wwXDJcMzI0XDFcMFwyXDMyNFwxXDAiKwotICAgICJcMlwzMjRcN1wwXDJcMzI0XDNcMFwyXDMyNFw3XDBcMlwxMTNcMVwyMjIiKwotICAgICJcM1wwXDFcMTEzXDNcMFwxXDExM1w3XDBcMlwxMTNcMVwzMjVcMVwyMjMiKwotICAgICJcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcM1wxMTNcNTdcMFwxXDMyNlwyMVwwXDFcMzI3XDFcMjUiKwotICAgICJcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDMyN1wxXDBcMVwyNVwxXDAiKwotICAgICJcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNVwxXDBcMVwyNVw3XDAiKwotICAgICJcMVwzMjdcMlwyNVwxXDMyN1wyXDI1XDFcMzI3XDJcMjVcMVwwXDRcMjUiKwotICAgICJcMVwwXDFcMzI3XDFcMjVcMVwwXDFcMjVcMVwwXDFcMzI3XDJcMjUiKwotICAgICJcNlwwXDFcMzMwXDFcMTM0XDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXDMzMCIrCi0gICAgIlwxXDBcMVwxMzRcMVwwXDFcMTM0XDNcMFwyXDEzNFwyXDBcM1wxMzQiKwotICAgICJcMVwwXDFcMTM0XDdcMFwxXDMzMFwyXDEzNFwxXDMzMFwyXDEzNFwxXDMzMCIrCi0gICAgIlwyXDEzNFwxXDBcNFwxMzRcMVwwXDFcMzMwXDFcMTM0XDFcMFwxXDEzNCIrCi0gICAgIlwxXDBcMVwzMzBcMlwxMzRcNlwwXDFcMzMxXDFcMTM2XDFcMTM3XDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlwxXDMzMVwxXDBcMVwxMzZcMVwwXDFcMTM2XDNcMCIrCi0gICAgIlwyXDEzNlwyXDBcM1wxMzZcMVwwXDFcMTM2XDdcMFwxXDMzMVwyXDEzNiIrCi0gICAgIlwxXDMzMVwyXDEzNlwxXDMzMVwyXDEzNlwxXDBcNFwxMzZcMVwwXDFcMzMxIisKLSAgICAiXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzMzFcMlwxMzZcMjBcMFwxXDMzMiIrCi0gICAgIlw1N1wwXDM0XDE0MVwxXDMzM1wxXDI1MlwzNVwxNDFcNDJcMFwyXDMzNFwxMDJcMCIrCi0gICAgIlwxXDMzNVw3NVwwXDJcMzM2XDc0XDBcMVwzMzdcNzZcMFwxXDM0MFw3XDAiKwotICAgICJcMVwzNDFcMVwzNDJcMVwyNjBcMVwwXDFcMjYwXDFcMzQxXDFcMFwxXDI2MCIrCi0gICAgIlwxXDBcMVwzNDFcM1wwXDJcMjYwXDJcMFwzXDM0MVwxXDBcMVwzNDEiKwotICAgICJcN1wwXDExXDM0MVwxXDBcNFwzNDFcMVwwXDJcMzQxXDFcMFwxXDM0MSIrCi0gICAgIlwxXDBcM1wzNDFcNlwwXDFcMzQzXDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMCIrCi0gICAgIlwxXDE0N1wxXDM0M1wxXDBcMVwxNDdcMVwwXDFcMTQ3XDNcMFwyXDE0NyIrCi0gICAgIlwyXDBcM1wxNDdcMVwyNjBcMVwxNDdcN1wwXDFcMzQzXDJcMTQ3XDFcMzQzIisKLSAgICAiXDJcMTQ3XDFcMzQzXDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVwzNDNcMVwxNDciKwotICAgICJcMVwwXDFcMTQ3XDFcMFwxXDM0M1wyXDE0N1w2XDBcMVwzNDRcMVwxNTEiKwotICAgICJcMVwxNTJcMVwxNTFcMVwxNTNcMVwxNTFcMVwzNDRcMjdcMTUxXDFcMzQ0XDJcMTUxIisKLSAgICAiXDFcMzQ0XDJcMTUxXDFcMzQ0XDEwXDE1MVwxXDM0NFw0XDE1MVwxXDM0NFw3XDE1MSIrCi0gICAgIlwxXDBcMlwxNTFcMVwxNTJcMVwwXDFcMTUzXDEyXDE1MVwxXDBcNTJcMTUxIisKLSAgICAiXDFcMFwxXDM0NVwxXDE1NFwxXDE1NVwzXDE1NFwxXDM0NVwxXDE1M1wyNlwxNTQiKwotICAgICJcMVwzNDVcMlwxNTRcMVwzNDVcMlwxNTRcMVwzNDVcMTBcMTU0XDFcMzQ1XDRcMTU0IisKLSAgICAiXDFcMzQ1XDdcMTU0XDFcMFwyXDE1NFwxXDE1NVwxXDBcM1wxNTRcMVwxNTMiKwotICAgICJcN1wxNTRcMVwwXDUyXDE1NFwxXDBcMVwzNDZcMVwxNTdcMVwxNjBcMVwxNTciKwotICAgICJcMVwxNjFcMVwxNTdcMVwzNDZcMjdcMTU3XDFcMzQ2XDJcMTU3XDFcMzQ2XDJcMTU3IisKLSAgICAiXDFcMzQ2XDEwXDE1N1wxXDM0Nlw0XDE1N1wxXDM0Nlw3XDE1N1wxXDBcMlwxNTciKwotICAgICJcMVwxNjBcMVwwXDFcMTYxXDEyXDE1N1wxXDBcNTJcMTU3XDFcMFwxXDM0NyIrCi0gICAgIlwxXDE2MlwxXDE2M1wzXDE2MlwxXDM0N1wxXDE2MVwyNlwxNjJcMVwzNDdcMlwxNjIiKwotICAgICJcMVwzNDdcMlwxNjJcMVwzNDdcMTBcMTYyXDFcMzQ3XDRcMTYyXDFcMzQ3XDdcMTYyIisKLSAgICAiXDFcMFwyXDE2MlwxXDE2M1wxXDBcM1wxNjJcMVwxNjFcN1wxNjJcMVwwIisKLSAgICAiXDUyXDE2MlwyNlwwXDFcMzUwXDQ1XDBcMVwzNTFcMVw1MVwxXDE2NVwxXDUxIisKLSAgICAiXDFcMFwxXDUxXDFcMzUxXDFcMFwxXDUxXDFcMFwxXDUxXDNcMCIrCi0gICAgIlwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXDM1MVwyXDUxIisKLSAgICAiXDFcMzUxXDJcNTFcMVwzNTFcMlw1MVwxXDBcNFw1MVwxXDBcMVwzNTEiKwotICAgICJcMVw1MVwxXDBcMVw1MVwxXDBcMVwzNTFcMlw1MVw2XDBcMVwzNTIiKwotICAgICJcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcMzUyXDFcMFwxXDU1IisKLSAgICAiXDFcMFwxXDU1XDNcMFwyXDU1XDJcMFwzXDU1XDFcMFwxXDU1IisKLSAgICAiXDdcMFwxXDM1MlwyXDU1XDFcMzUyXDJcNTVcMVwzNTJcMlw1NVwxXDAiKwotICAgICJcNFw1NVwxXDBcMVwzNTJcMVw1NVwxXDBcMVw1NVwxXDBcMVwzNTIiKwotICAgICJcMlw1NVw2XDBcMVwzNTNcMVw2MlwxXDE3M1wxXDYyXDFcMFwxXDYyIisKLSAgICAiXDFcMzUzXDFcMFwxXDYyXDFcMFwxXDYyXDNcMFwyXDYyXDJcMCIrCi0gICAgIlwzXDYyXDFcMFwxXDYyXDdcMFwxXDM1M1wyXDYyXDFcMzUzXDJcNjIiKwotICAgICJcMVwzNTNcMlw2MlwxXDBcNFw2MlwxXDBcMVwzNTNcMVw2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcMVwzNTNcMlw2Mlw2XDBcMVwzNTRcMVw3MlwxXDIwMCIrCi0gICAgIlwxXDcyXDFcMFwxXDcyXDFcMzU0XDFcMFwxXDcyXDFcMFwxXDcyIisKLSAgICAiXDNcMFwyXDcyXDJcMFwzXDcyXDFcMFwxXDcyXDdcMFwxXDM1NCIrCi0gICAgIlwyXDcyXDFcMzU0XDJcNzJcMVwzNTRcMlw3MlwxXDBcNFw3MlwxXDAiKwotICAgICJcMVwzNTRcMVw3MlwxXDBcMVw3MlwxXDBcMVwzNTRcMlw3Mlw2XDAiKwotICAgICJcMVwzNTVcMVwxMDBcMVwyMDNcMVwxMDBcMVwwXDFcMTAwXDFcMzU1XDFcMCIrCi0gICAgIlwxXDEwMFwxXDBcMVwxMDBcM1wwXDJcMTAwXDJcMFwzXDEwMFwxXDAiKwotICAgICJcMVwxMDBcN1wwXDFcMzU1XDJcMTAwXDFcMzU1XDJcMTAwXDFcMzU1XDJcMTAwIisKLSAgICAiXDFcMFw0XDEwMFwxXDBcMVwzNTVcMVwxMDBcMVwwXDFcMTAwXDFcMCIrCi0gICAgIlwxXDM1NVwyXDEwMFw2XDBcMVwzNTZcMVwyMDVcMVwyMDZcMVwyMDVcMVwyMDciKwotICAgICJcMVwyMDVcMVwzNTZcMjdcMjA1XDFcMzU2XDJcMjA1XDFcMzU2XDJcMjA1XDFcMzU2IisKLSAgICAiXDEwXDIwNVwxXDM1Nlw0XDIwNVwxXDM1Nlw3XDIwNVwxXDBcMlwyMDVcMVwyMDYiKwotICAgICJcMVwwXDFcMjA3XDEyXDIwNVwxXDBcNTJcMjA1XDFcMFwxXDM1N1wxXDIxMCIrCi0gICAgIlwxXDIxMVwzXDIxMFwxXDM1N1wxXDIwN1wyNlwyMTBcMVwzNTdcMlwyMTBcMVwzNTciKwotICAgICJcMlwyMTBcMVwzNTdcMTBcMjEwXDFcMzU3XDRcMjEwXDFcMzU3XDdcMjEwXDFcMCIrCi0gICAgIlwyXDIxMFwxXDIxMVwxXDBcM1wyMTBcMVwyMDdcN1wyMTBcMVwwXDUyXDIxMCIrCi0gICAgIlwxXDBcMVwzNjBcMVwxMDVcMVwyMTNcMVwxMDVcMVwwXDFcMTA1XDFcMzYwIisKLSAgICAiXDFcMFwxXDEwNVwxXDBcMVwxMDVcM1wwXDJcMTA1XDJcMFwzXDEwNSIrCi0gICAgIlwxXDBcMVwxMDVcN1wwXDFcMzYwXDJcMTA1XDFcMzYwXDJcMTA1XDFcMzYwIisKLSAgICAiXDJcMTA1XDFcMFw0XDEwNVwxXDBcMVwzNjBcMVwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDFcMFwxXDM2MFwyXDEwNVw2XDBcMVwzNjFcMVwyMTZcMVwyMTdcMVwyMTYiKwotICAgICJcMVwwXDFcMjE2XDFcMzYxXDFcMFwxXDIxNlwxXDBcMVwyMTZcM1wwIisKLSAgICAiXDJcMjE2XDJcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDFcMzYxXDJcMjE2IisKLSAgICAiXDFcMzYxXDJcMjE2XDFcMzYxXDJcMjE2XDFcMFw0XDIxNlwxXDBcMVwzNjEiKwotICAgICJcMVwyMTZcMVwwXDFcMjE2XDFcMFwxXDM2MVwyXDIxNlw2XDBcMVwzNjIiKwotICAgICJcMVwxMTNcMVwyMjJcMVwxMTNcMVwwXDFcMTEzXDFcMzYyXDFcMFwxXDExMyIrCi0gICAgIlwxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyM1wxXDExMyIrCi0gICAgIlw3XDBcMVwzNjJcMlwxMTNcMVwzNjJcMlwxMTNcMVwzNjJcMlwxMTNcMVwwIisKLSAgICAiXDRcMTEzXDFcMFwxXDM2MlwxXDExM1wxXDBcMVwxMTNcMVwwXDFcMzYyIisKLSAgICAiXDJcMTEzXDZcMFwxXDM2M1wxXDIyNVwxXDIyNlwxXDIyNVwxXDIyN1wxXDIyNSIrCi0gICAgIlwxXDM2M1wyN1wyMjVcMVwzNjNcMlwyMjVcMVwzNjNcMlwyMjVcMVwzNjNcMTBcMjI1IisKLSAgICAiXDFcMzYzXDRcMjI1XDFcMzYzXDdcMjI1XDFcMFwyXDIyNVwxXDIyNlwxXDAiKwotICAgICJcMVwyMjdcMTJcMjI1XDFcMFw1MlwyMjVcMVwwXDFcMzY0XDFcMjMwXDFcMjMxIisKLSAgICAiXDNcMjMwXDFcMzY0XDFcMjI3XDI2XDIzMFwxXDM2NFwyXDIzMFwxXDM2NFwyXDIzMCIrCi0gICAgIlwxXDM2NFwxMFwyMzBcMVwzNjRcNFwyMzBcMVwzNjRcN1wyMzBcMVwwXDJcMjMwIisKLSAgICAiXDFcMjMxXDFcMFwzXDIzMFwxXDIyN1w3XDIzMFwxXDBcNTJcMjMwXDFcMCIrCi0gICAgIlwxXDM2NVwxXDIzNVwxXDIzNlwxXDIzNVwxXDBcMVwyMzVcMVwzNjVcMVwwIisKLSAgICAiXDFcMjM1XDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwXDNcMjM1XDFcMCIrCi0gICAgIlwxXDIzNVw3XDBcMVwzNjVcMlwyMzVcMVwzNjVcMlwyMzVcMVwzNjVcMlwyMzUiKwotICAgICJcMVwwXDRcMjM1XDFcMFwxXDM2NVwxXDIzNVwxXDBcMVwyMzVcMVwwIisKLSAgICAiXDFcMzY1XDJcMjM1XDZcMFwxXDM2Nlw1XDBcMVwzNjZcM1wwXDFcMzY3IisKLSAgICAiXDVcMFwxXDM2Nlw1XDBcMVwzNjZcN1wwXDJcMzY2XDFcMFwyXDM2NiIrCi0gICAgIlwxXDBcMlwzNjZcN1wwXDJcMzY2XDNcMFwyXDM2Nlw3XDBcMlwxMTMiKwotICAgICJcMVwyMjJcM1wwXDFcMTEzXDNcMFwxXDExM1w3XDBcM1wxMTNcMVwzNzAiKwotICAgICJcMVwxMTNcN1wwXDExXDExM1wxXDBcNFwxMTNcMVwwXDJcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcM1wxMTNcNjBcMFwxXDM3MVwyMFwwXDFcMzcyXDFcMjUiKwotICAgICJcMVwxMzFcMVwyNVwxXDBcMVwyNVwxXDM3MlwxXDBcMVwyNVwxXDAiKwotICAgICJcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNVwxXDBcMVwyNVw3XDAiKwotICAgICJcMVwzNzJcMlwyNVwxXDM3MlwyXDI1XDFcMzcyXDJcMjVcMVwwXDRcMjUiKwotICAgICJcMVwwXDFcMzcyXDFcMjVcMVwwXDFcMjVcMVwwXDFcMzcyXDJcMjUiKwotICAgICJcNlwwXDFcMzczXDFcMTM0XDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXDM3MyIrCi0gICAgIlwxXDBcMVwxMzRcMVwwXDFcMTM0XDNcMFwyXDEzNFwyXDBcM1wxMzQiKwotICAgICJcMVwwXDFcMTM0XDdcMFwxXDM3M1wyXDEzNFwxXDM3M1wyXDEzNFwxXDM3MyIrCi0gICAgIlwyXDEzNFwxXDBcNFwxMzRcMVwwXDFcMzczXDFcMTM0XDFcMFwxXDEzNCIrCi0gICAgIlwxXDBcMVwzNzNcMlwxMzRcNlwwXDFcMzc0XDFcMTM2XDFcMTM3XDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlwxXDM3NFwxXDBcMVwxMzZcMVwwXDFcMTM2XDNcMCIrCi0gICAgIlwyXDEzNlwyXDBcM1wxMzZcMVwwXDFcMTM2XDdcMFwxXDM3NFwyXDEzNiIrCi0gICAgIlwxXDM3NFwyXDEzNlwxXDM3NFwyXDEzNlwxXDBcNFwxMzZcMVwwXDFcMzc0IisKLSAgICAiXDFcMTM2XDFcMFwxXDEzNlwxXDBcMVwzNzRcMlwxMzZcMzFcMFwxXDM3NSIrCi0gICAgIlwxMjJcMFwxXDM3Nlw2N1wwXDFcMzc3XDY2XDBcMlx1MDEwMFw3M1wwXDFcdTAxMDEiKwotICAgICJcMjRcMFwyXDM0MVwxXDM0MlwxXHUwMTAyXDFcMFwxXHUwMTAyXDFcMzQxXDFcMCIrCi0gICAgIlwxXHUwMTAyXDFcdTAxMDNcMVwzNDFcM1wwXDJcdTAxMDJcMlwwXDNcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVw3XDBcMTFcMzQxXDFcMFw0XDM0MVwxXDBcMlwzNDFcMVwwIisKLSAgICAiXDFcMzQxXDFcMFwzXDM0MVw2XDBcMVx1MDEwNFwyXDM0MVwxXDBcMlwzNDEiKwotICAgICJcMVx1MDEwNFwxXDM0MVwxXDBcNVwzNDFcMlwwXDE2XDM0MVwxXHUwMTA0XDJcMzQxIisKLSAgICAiXDFcdTAxMDRcMlwzNDFcMVx1MDEwNFwxMFwzNDFcMVx1MDEwNFw0XDM0MVwxXHUwMTA0XDdcMzQxIisKLSAgICAiXDFcMFwxXHUwMTA1XDFcMTQ3XDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTA1IisKLSAgICAiXDFcMFwxXDE0N1wxXDBcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0NyIrCi0gICAgIlwxXDI2MFwxXDE0N1w3XDBcMVx1MDEwNVwyXDE0N1wxXHUwMTA1XDJcMTQ3XDFcdTAxMDUiKwotICAgICJcMlwxNDdcMVwwXDRcMTQ3XDFcMFwxXHUwMTA1XDFcMTQ3XDFcMFwxXDE0NyIrCi0gICAgIlwxXDBcMVx1MDEwNVwyXDE0N1w2XDBcMVx1MDEwNlwxXDE1MVwxXDE1MlwxXDE1MSIrCi0gICAgIlwxXDE1M1wxXDE1MVwxXHUwMTA2XDI3XDE1MVwxXHUwMTA2XDJcMTUxXDFcdTAxMDZcMlwxNTEiKwotICAgICJcMVx1MDEwNlwxMFwxNTFcMVx1MDEwNlw0XDE1MVwxXHUwMTA2XDdcMTUxXDFcMFwxXHUwMTA3IisKLSAgICAiXDFcMTU0XDFcMTU1XDNcMTU0XDFcdTAxMDdcMVwxNTNcMjZcMTU0XDFcdTAxMDdcMlwxNTQiKwotICAgICJcMVx1MDEwN1wyXDE1NFwxXHUwMTA3XDEwXDE1NFwxXHUwMTA3XDRcMTU0XDFcdTAxMDdcN1wxNTQiKwotICAgICJcMVwwXDFcdTAxMDhcMVwxNTdcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDEwOCIrCi0gICAgIlwyN1wxNTdcMVx1MDEwOFwyXDE1N1wxXHUwMTA4XDJcMTU3XDFcdTAxMDhcMTBcMTU3XDFcdTAxMDgiKwotICAgICJcNFwxNTdcMVx1MDEwOFw3XDE1N1wxXDBcMVx1MDEwOVwxXDE2MlwxXDE2M1wzXDE2MiIrCi0gICAgIlwxXHUwMTA5XDFcMTYxXDI2XDE2MlwxXHUwMTA5XDJcMTYyXDFcdTAxMDlcMlwxNjJcMVx1MDEwOSIrCi0gICAgIlwxMFwxNjJcMVx1MDEwOVw0XDE2MlwxXHUwMTA5XDdcMTYyXDFcMFwyXHUwMTBhXDFcdTAxMGIiKwotICAgICJcMVwzNTBcMVx1MDEwY1wxXDM1MFwxXHUwMTBhXDFcdTAxMGRcMVwzNTBcMVx1MDEwZVw0XHUwMTBhIisKLSAgICAiXDJcMzUwXDVcdTAxMGFcMVwwXDQ0XHUwMTBhXDFcMFwxXHUwMTBmXDFcNTFcMVwxNjUiKwotICAgICJcMVw1MVwxXDBcMVw1MVwxXHUwMTBmXDFcMFwxXDUxXDFcMFwxXDUxIisKLSAgICAiXDNcMFwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXHUwMTBmIisKLSAgICAiXDJcNTFcMVx1MDEwZlwyXDUxXDFcdTAxMGZcMlw1MVwxXDBcNFw1MVwxXDAiKwotICAgICJcMVx1MDEwZlwxXDUxXDFcMFwxXDUxXDFcMFwxXHUwMTBmXDJcNTFcNlwwIisKLSAgICAiXDFcdTAxMTBcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcdTAxMTBcMVwwIisKLSAgICAiXDFcNTVcMVwwXDFcNTVcM1wwXDJcNTVcMlwwXDNcNTVcMVwwIisKLSAgICAiXDFcNTVcN1wwXDFcdTAxMTBcMlw1NVwxXHUwMTEwXDJcNTVcMVx1MDExMFwyXDU1IisKLSAgICAiXDFcMFw0XDU1XDFcMFwxXHUwMTEwXDFcNTVcMVwwXDFcNTVcMVwwIisKLSAgICAiXDFcdTAxMTBcMlw1NVw2XDBcMVx1MDExMVwxXDYyXDFcMTczXDFcNjJcMVwwIisKLSAgICAiXDFcNjJcMVx1MDExMVwxXDBcMVw2MlwxXDBcMVw2MlwzXDBcMlw2MiIrCi0gICAgIlwyXDBcM1w2MlwxXDBcMVw2Mlw3XDBcMVx1MDExMVwyXDYyXDFcdTAxMTEiKwotICAgICJcMlw2MlwxXHUwMTExXDJcNjJcMVwwXDRcNjJcMVwwXDFcdTAxMTFcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMVx1MDExMVwyXDYyXDZcMFwxXHUwMTEyXDFcNzIiKwotICAgICJcMVwyMDBcMVw3MlwxXDBcMVw3MlwxXHUwMTEyXDFcMFwxXDcyXDFcMCIrCi0gICAgIlwxXDcyXDNcMFwyXDcyXDJcMFwzXDcyXDFcMFwxXDcyXDdcMCIrCi0gICAgIlwxXHUwMTEyXDJcNzJcMVx1MDExMlwyXDcyXDFcdTAxMTJcMlw3MlwxXDBcNFw3MiIrCi0gICAgIlwxXDBcMVx1MDExMlwxXDcyXDFcMFwxXDcyXDFcMFwxXHUwMTEyXDJcNzIiKwotICAgICJcNlwwXDFcdTAxMTNcMVwxMDBcMVwyMDNcMVwxMDBcMVwwXDFcMTAwXDFcdTAxMTMiKwotICAgICJcMVwwXDFcMTAwXDFcMFwxXDEwMFwzXDBcMlwxMDBcMlwwXDNcMTAwIisKLSAgICAiXDFcMFwxXDEwMFw3XDBcMVx1MDExM1wyXDEwMFwxXHUwMTEzXDJcMTAwXDFcdTAxMTMiKwotICAgICJcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXHUwMTEzXDFcMTAwXDFcMFwxXDEwMCIrCi0gICAgIlwxXDBcMVx1MDExM1wyXDEwMFw2XDBcMVx1MDExNFwxXDIwNVwxXDIwNlwxXDIwNSIrCi0gICAgIlwxXDIwN1wxXDIwNVwxXHUwMTE0XDI3XDIwNVwxXHUwMTE0XDJcMjA1XDFcdTAxMTRcMlwyMDUiKwotICAgICJcMVx1MDExNFwxMFwyMDVcMVx1MDExNFw0XDIwNVwxXHUwMTE0XDdcMjA1XDFcMFwxXHUwMTE1IisKLSAgICAiXDFcMjEwXDFcMjExXDNcMjEwXDFcdTAxMTVcMVwyMDdcMjZcMjEwXDFcdTAxMTVcMlwyMTAiKwotICAgICJcMVx1MDExNVwyXDIxMFwxXHUwMTE1XDEwXDIxMFwxXHUwMTE1XDRcMjEwXDFcdTAxMTVcN1wyMTAiKwotICAgICJcMVwwXDFcdTAxMTZcMVwxMDVcMVwyMTNcMVwxMDVcMVwwXDFcMTA1XDFcdTAxMTYiKwotICAgICJcMVwwXDFcMTA1XDFcMFwxXDEwNVwzXDBcMlwxMDVcMlwwXDNcMTA1IisKLSAgICAiXDFcMFwxXDEwNVw3XDBcMVx1MDExNlwyXDEwNVwxXHUwMTE2XDJcMTA1XDFcdTAxMTYiKwotICAgICJcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTE2XDFcMTA1XDFcMFwxXDEwNSIrCi0gICAgIlwxXDBcMVx1MDExNlwyXDEwNVw2XDBcMVx1MDExN1wxXDIxNlwxXDIxN1wxXDIxNiIrCi0gICAgIlwxXDBcMVwyMTZcMVx1MDExN1wxXDBcMVwyMTZcMVwwXDFcMjE2XDNcMCIrCi0gICAgIlwyXDIxNlwyXDBcM1wyMTZcMVwwXDFcMjE2XDdcMFwxXHUwMTE3XDJcMjE2IisKLSAgICAiXDFcdTAxMTdcMlwyMTZcMVx1MDExN1wyXDIxNlwxXDBcNFwyMTZcMVwwXDFcdTAxMTciKwotICAgICJcMVwyMTZcMVwwXDFcMjE2XDFcMFwxXHUwMTE3XDJcMjE2XDZcMFwxXHUwMTE4IisKLSAgICAiXDFcMTEzXDFcMjIyXDFcMTEzXDFcMFwxXDExM1wxXHUwMTE4XDFcMFwxXDExMyIrCi0gICAgIlwxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyM1wxXDExMyIrCi0gICAgIlw3XDBcMVx1MDExOFwyXDExM1wxXHUwMTE4XDJcMTEzXDFcdTAxMThcMlwxMTNcMVwwIisKLSAgICAiXDRcMTEzXDFcMFwxXHUwMTE4XDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDExOCIrCi0gICAgIlwyXDExM1w2XDBcMVx1MDExOVwxXDIyNVwxXDIyNlwxXDIyNVwxXDIyN1wxXDIyNSIrCi0gICAgIlwxXHUwMTE5XDI3XDIyNVwxXHUwMTE5XDJcMjI1XDFcdTAxMTlcMlwyMjVcMVx1MDExOVwxMFwyMjUiKwotICAgICJcMVx1MDExOVw0XDIyNVwxXHUwMTE5XDdcMjI1XDFcMFwxXHUwMTFhXDFcMjMwXDFcMjMxIisKLSAgICAiXDNcMjMwXDFcdTAxMWFcMVwyMjdcMjZcMjMwXDFcdTAxMWFcMlwyMzBcMVx1MDExYVwyXDIzMCIrCi0gICAgIlwxXHUwMTFhXDEwXDIzMFwxXHUwMTFhXDRcMjMwXDFcdTAxMWFcN1wyMzBcMVwwXDFcdTAxMWIiKwotICAgICJcMVwyMzVcMVwyMzZcMVwyMzVcMVwwXDFcMjM1XDFcdTAxMWJcMVwwXDFcMjM1IisKLSAgICAiXDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwXDNcMjM1XDFcMFwxXDIzNSIrCi0gICAgIlw3XDBcMVx1MDExYlwyXDIzNVwxXHUwMTFiXDJcMjM1XDFcdTAxMWJcMlwyMzVcMVwwIisKLSAgICAiXDRcMjM1XDFcMFwxXHUwMTFiXDFcMjM1XDFcMFwxXDIzNVwxXDBcMVx1MDExYiIrCi0gICAgIlwyXDIzNVw2XDBcMVx1MDExY1w1XDBcMVx1MDExY1wzXDBcMVwzNjdcNVwwIisKLSAgICAiXDFcdTAxMWNcNVwwXDFcdTAxMWNcN1wwXDJcdTAxMWNcMVwwXDJcdTAxMWNcMVwwIisKLSAgICAiXDJcdTAxMWNcN1wwXDJcdTAxMWNcM1wwXDJcdTAxMWNcN1wwXDFcdTAxMWRcNVwwIisKLSAgICAiXDFcdTAxMWRcMTFcMFwxXHUwMTFkXDVcMFwxXHUwMTFkXDdcMFwyXHUwMTFkXDFcMCIrCi0gICAgIlwyXHUwMTFkXDFcMFwyXHUwMTFkXDdcMFwyXHUwMTFkXDNcMFwyXHUwMTFkXDdcMCIrCi0gICAgIlwyXHUwMTFlXDFcdTAxMWZcMVx1MDEyMFwxXHUwMTIxXDFcdTAxMjBcMVx1MDExZVwxXHUwMTIyXDFcdTAxMjAiKwotICAgICJcMVx1MDEyM1w0XHUwMTFlXDJcdTAxMjBcNVx1MDExZVwxXDBcNDRcdTAxMWVcNTRcMFwxXHUwMTI0IisKLSAgICAiXDE3XDBcMVx1MDEyNVwxXDI1XDFcMTMxXDFcMjVcMVwwXDFcMjVcMVx1MDEyNSIrCi0gICAgIlwxXDBcMVwyNVwxXDBcMVwyNVwzXDBcMlwyNVwyXDBcM1wyNSIrCi0gICAgIlwxXDBcMVwyNVw3XDBcMVx1MDEyNVwyXDI1XDFcdTAxMjVcMlwyNVwxXHUwMTI1IisKLSAgICAiXDJcMjVcMVwwXDRcMjVcMVwwXDFcdTAxMjVcMVwyNVwxXDBcMVwyNSIrCi0gICAgIlwxXDBcMVx1MDEyNVwyXDI1XDZcMFwxXHUwMTI2XDFcMTM0XDFcMTM1XDFcMTM0IisKLSAgICAiXDFcMFwxXDEzNFwxXHUwMTI2XDFcMFwxXDEzNFwxXDBcMVwxMzRcM1wwIisKLSAgICAiXDJcMTM0XDJcMFwzXDEzNFwxXDBcMVwxMzRcN1wwXDFcdTAxMjZcMlwxMzQiKwotICAgICJcMVx1MDEyNlwyXDEzNFwxXHUwMTI2XDJcMTM0XDFcMFw0XDEzNFwxXDBcMVx1MDEyNiIrCi0gICAgIlwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxMjZcMlwxMzRcNlwwXDFcdTAxMjciKwotICAgICJcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxMjdcMVwwXDFcMTM2IisKLSAgICAiXDFcMFwxXDEzNlwzXDBcMlwxMzZcMlwwXDNcMTM2XDFcMFwxXDEzNiIrCi0gICAgIlw3XDBcMVx1MDEyN1wyXDEzNlwxXHUwMTI3XDJcMTM2XDFcdTAxMjdcMlwxMzZcMVwwIisKLSAgICAiXDRcMTM2XDFcMFwxXHUwMTI3XDFcMTM2XDFcMFwxXDEzNlwxXDBcMVx1MDEyNyIrCi0gICAgIlwyXDEzNlw1MVwwXDFcdTAxMjhcNTJcMFwxXHUwMTI5XDExMFwwXDJcdTAxMmFcNDJcMCIrCi0gICAgIlwxXHUwMTJiXDYzXDBcMVx1MDEwMlwxXDBcMVx1MDEwMlwyXDBcMVx1MDEwMlwxXHUwMTAzIisKLSAgICAiXDRcMFwyXHUwMTAyXDUzXDBcMVx1MDEyY1wxXDM0MVwxXDM0MlwxXDM0MVwxXDAiKwotICAgICJcMVwzNDFcMVx1MDEyY1wxXDBcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDEiKwotICAgICJcMlwwXDNcMzQxXDFcMFwxXDM0MVw3XDBcMVx1MDEyY1wyXDM0MVwxXHUwMTJjIisKLSAgICAiXDJcMzQxXDFcdTAxMmNcMlwzNDFcMVwwXDRcMzQxXDFcMFwxXHUwMTJjXDFcMzQxIisKLSAgICAiXDFcMFwxXDM0MVwxXDBcMVx1MDEyY1wyXDM0MVw2XDBcMVx1MDEyZFwxXDE0NyIrCi0gICAgIlwxXDE1MFwxXDE0N1wxXDBcMVwxNDdcMVx1MDEyZFwxXDBcMVwxNDdcMVwwIisKLSAgICAiXDFcMTQ3XDNcMFwyXDE0N1wyXDBcM1wxNDdcMVwyNjBcMVwxNDdcN1wwIisKLSAgICAiXDFcdTAxMmRcMlwxNDdcMVx1MDEyZFwyXDE0N1wxXHUwMTJkXDJcMTQ3XDFcMFw0XDE0NyIrCi0gICAgIlwxXDBcMVx1MDEyZFwxXDE0N1wxXDBcMVwxNDdcMVwwXDFcdTAxMmRcMlwxNDciKwotICAgICJcNlwwXDFcdTAxMmVcMVwxNTFcMVwxNTJcMVwxNTFcMVwxNTNcMVwxNTFcMVx1MDEyZSIrCi0gICAgIlwyN1wxNTFcMVx1MDEyZVwyXDE1MVwxXHUwMTJlXDJcMTUxXDFcdTAxMmVcMTBcMTUxXDFcdTAxMmUiKwotICAgICJcNFwxNTFcMVx1MDEyZVw3XDE1MVwxXDBcMVx1MDEyZlwxXDE1NFwxXDE1NVwzXDE1NCIrCi0gICAgIlwxXHUwMTJmXDFcMTUzXDI2XDE1NFwxXHUwMTJmXDJcMTU0XDFcdTAxMmZcMlwxNTRcMVx1MDEyZiIrCi0gICAgIlwxMFwxNTRcMVx1MDEyZlw0XDE1NFwxXHUwMTJmXDdcMTU0XDFcMFwxXHUwMTMwXDFcMTU3IisKLSAgICAiXDFcMTYwXDFcMTU3XDFcMTYxXDFcMTU3XDFcdTAxMzBcMjdcMTU3XDFcdTAxMzBcMlwxNTciKwotICAgICJcMVx1MDEzMFwyXDE1N1wxXHUwMTMwXDEwXDE1N1wxXHUwMTMwXDRcMTU3XDFcdTAxMzBcN1wxNTciKwotICAgICJcMVwwXDFcdTAxMzFcMVwxNjJcMVwxNjNcM1wxNjJcMVx1MDEzMVwxXDE2MVwyNlwxNjIiKwotICAgICJcMVx1MDEzMVwyXDE2MlwxXHUwMTMxXDJcMTYyXDFcdTAxMzFcMTBcMTYyXDFcdTAxMzFcNFwxNjIiKwotICAgICJcMVx1MDEzMVw3XDE2MlwxXDBcMlx1MDEwYVwxXHUwMTBiXDFcdTAxMzJcMVwwXDJcdTAxMGEiKwotICAgICJcMVwwXDFcdTAxMzJcMVx1MDEwZVw0XHUwMTBhXDJcdTAxMzJcNVx1MDEwYVwxXDBcNDRcdTAxMGEiKwotICAgICJcMVwwXDFcdTAxMzNcMVx1MDEwYVwxXHUwMTBiXDFcdTAxMzJcMlx1MDEwYVwxXHUwMTMzXDFcdTAxMGEiKwotICAgICJcMVx1MDEzMlwxXHUwMTM0XDRcdTAxMGFcMlx1MDEzMlwxNlx1MDEwYVwxXHUwMTMzXDJcdTAxMGFcMVx1MDEzMyIrCi0gICAgIlwyXHUwMTBhXDFcdTAxMzNcMTBcdTAxMGFcMVx1MDEzM1w0XHUwMTBhXDFcdTAxMzNcN1x1MDEwYVwxXDAiKwotICAgICJcMlx1MDEwY1wxXHUwMTM1XDFcMFwxXHUwMTMyXDExXHUwMTBjXDJcMFw1Mlx1MDEwY1wxXDAiKwotICAgICJcMlx1MDEwZFwxXHUwMTM2XDFcMFwzXHUwMTBkXDFcdTAxMzJcNlx1MDEwZFwyXDBcNTJcdTAxMGQiKwotICAgICJcMVwwXDFcdTAxMzdcMVw1MVwxXDE2NVwxXDUxXDFcMFwxXDUxXDFcdTAxMzciKwotICAgICJcMVwwXDFcNTFcMVwwXDFcNTFcM1wwXDJcNTFcMlwwXDNcNTEiKwotICAgICJcMVwwXDFcNTFcN1wwXDFcdTAxMzdcMlw1MVwxXHUwMTM3XDJcNTFcMVx1MDEzNyIrCi0gICAgIlwyXDUxXDFcMFw0XDUxXDFcMFwxXHUwMTM3XDFcNTFcMVwwXDFcNTEiKwotICAgICJcMVwwXDFcdTAxMzdcMlw1MVw2XDBcMVx1MDEzOFwxXDU1XDFcMTcwXDFcNTUiKwotICAgICJcMVwwXDFcNTVcMVx1MDEzOFwxXDBcMVw1NVwxXDBcMVw1NVwzXDAiKwotICAgICJcMlw1NVwyXDBcM1w1NVwxXDBcMVw1NVw3XDBcMVx1MDEzOFwyXDU1IisKLSAgICAiXDFcdTAxMzhcMlw1NVwxXHUwMTM4XDJcNTVcMVwwXDRcNTVcMVwwXDFcdTAxMzgiKwotICAgICJcMVw1NVwxXDBcMVw1NVwxXDBcMVx1MDEzOFwyXDU1XDZcMFwxXHUwMTM5IisKLSAgICAiXDFcNjJcMVwxNzNcMVw2MlwxXDBcMVw2MlwxXHUwMTM5XDFcMFwxXDYyIisKLSAgICAiXDFcMFwxXDYyXDNcMFwyXDYyXDJcMFwzXDYyXDFcMFwxXDYyIisKLSAgICAiXDdcMFwxXHUwMTM5XDJcNjJcMVx1MDEzOVwyXDYyXDFcdTAxMzlcMlw2MlwxXDAiKwotICAgICJcNFw2MlwxXDBcMVx1MDEzOVwxXDYyXDFcMFwxXDYyXDFcMFwxXHUwMTM5IisKLSAgICAiXDJcNjJcNlwwXDFcdTAxM2FcMVw3MlwxXDIwMFwxXDcyXDFcMFwxXDcyIisKLSAgICAiXDFcdTAxM2FcMVwwXDFcNzJcMVwwXDFcNzJcM1wwXDJcNzJcMlwwIisKLSAgICAiXDNcNzJcMVwwXDFcNzJcN1wwXDFcdTAxM2FcMlw3MlwxXHUwMTNhXDJcNzIiKwotICAgICJcMVx1MDEzYVwyXDcyXDFcMFw0XDcyXDFcMFwxXHUwMTNhXDFcNzJcMVwwIisKLSAgICAiXDFcNzJcMVwwXDFcdTAxM2FcMlw3Mlw2XDBcMVx1MDEzYlwxXDEwMFwxXDIwMyIrCi0gICAgIlwxXDEwMFwxXDBcMVwxMDBcMVx1MDEzYlwxXDBcMVwxMDBcMVwwXDFcMTAwIisKLSAgICAiXDNcMFwyXDEwMFwyXDBcM1wxMDBcMVwwXDFcMTAwXDdcMFwxXHUwMTNiIisKLSAgICAiXDJcMTAwXDFcdTAxM2JcMlwxMDBcMVx1MDEzYlwyXDEwMFwxXDBcNFwxMDBcMVwwIisKLSAgICAiXDFcdTAxM2JcMVwxMDBcMVwwXDFcMTAwXDFcMFwxXHUwMTNiXDJcMTAwXDZcMCIrCi0gICAgIlwxXHUwMTNjXDFcMjA1XDFcMjA2XDFcMjA1XDFcMjA3XDFcMjA1XDFcdTAxM2NcMjdcMjA1IisKLSAgICAiXDFcdTAxM2NcMlwyMDVcMVx1MDEzY1wyXDIwNVwxXHUwMTNjXDEwXDIwNVwxXHUwMTNjXDRcMjA1IisKLSAgICAiXDFcdTAxM2NcN1wyMDVcMVwwXDFcdTAxM2RcMVwyMTBcMVwyMTFcM1wyMTBcMVx1MDEzZCIrCi0gICAgIlwxXDIwN1wyNlwyMTBcMVx1MDEzZFwyXDIxMFwxXHUwMTNkXDJcMjEwXDFcdTAxM2RcMTBcMjEwIisKLSAgICAiXDFcdTAxM2RcNFwyMTBcMVx1MDEzZFw3XDIxMFwxXDBcMVx1MDEzZVwxXDEwNVwxXDIxMyIrCi0gICAgIlwxXDEwNVwxXDBcMVwxMDVcMVx1MDEzZVwxXDBcMVwxMDVcMVwwXDFcMTA1IisKLSAgICAiXDNcMFwyXDEwNVwyXDBcM1wxMDVcMVwwXDFcMTA1XDdcMFwxXHUwMTNlIisKLSAgICAiXDJcMTA1XDFcdTAxM2VcMlwxMDVcMVx1MDEzZVwyXDEwNVwxXDBcNFwxMDVcMVwwIisKLSAgICAiXDFcdTAxM2VcMVwxMDVcMVwwXDFcMTA1XDFcMFwxXHUwMTNlXDJcMTA1XDZcMCIrCi0gICAgIlwxXHUwMTNmXDFcMjE2XDFcMjE3XDFcMjE2XDFcMFwxXDIxNlwxXHUwMTNmXDFcMCIrCi0gICAgIlwxXDIxNlwxXDBcMVwyMTZcM1wwXDJcMjE2XDJcMFwzXDIxNlwxXDAiKwotICAgICJcMVwyMTZcN1wwXDFcdTAxM2ZcMlwyMTZcMVx1MDEzZlwyXDIxNlwxXHUwMTNmXDJcMjE2IisKLSAgICAiXDFcMFw0XDIxNlwxXDBcMVx1MDEzZlwxXDIxNlwxXDBcMVwyMTZcMVwwIisKLSAgICAiXDFcdTAxM2ZcMlwyMTZcNlwwXDFcdTAxNDBcMVwxMTNcMVwyMjJcMVwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcdTAxNDBcMVwwXDFcMTEzXDFcMFwxXDExM1wzXDBcMlwxMTMiKwotICAgICJcMlwwXDNcMTEzXDFcMjIzXDFcMTEzXDdcMFwxXHUwMTQwXDJcMTEzXDFcdTAxNDAiKwotICAgICJcMlwxMTNcMVx1MDE0MFwyXDExM1wxXDBcNFwxMTNcMVwwXDFcdTAxNDBcMVwxMTMiKwotICAgICJcMVwwXDFcMTEzXDFcMFwxXHUwMTQwXDJcMTEzXDZcMFwxXHUwMTQxXDFcMjI1IisKLSAgICAiXDFcMjI2XDFcMjI1XDFcMjI3XDFcMjI1XDFcdTAxNDFcMjdcMjI1XDFcdTAxNDFcMlwyMjUiKwotICAgICJcMVx1MDE0MVwyXDIyNVwxXHUwMTQxXDEwXDIyNVwxXHUwMTQxXDRcMjI1XDFcdTAxNDFcN1wyMjUiKwotICAgICJcMVwwXDFcdTAxNDJcMVwyMzBcMVwyMzFcM1wyMzBcMVx1MDE0MlwxXDIyN1wyNlwyMzAiKwotICAgICJcMVx1MDE0MlwyXDIzMFwxXHUwMTQyXDJcMjMwXDFcdTAxNDJcMTBcMjMwXDFcdTAxNDJcNFwyMzAiKwotICAgICJcMVx1MDE0Mlw3XDIzMFwxXDBcMVx1MDE0M1wxXDIzNVwxXDIzNlwxXDIzNVwxXDAiKwotICAgICJcMVwyMzVcMVx1MDE0M1wxXDBcMVwyMzVcMVwwXDFcMjM1XDNcMFwyXDIzNSIrCi0gICAgIlwyXDBcM1wyMzVcMVwwXDFcMjM1XDdcMFwxXHUwMTQzXDJcMjM1XDFcdTAxNDMiKwotICAgICJcMlwyMzVcMVx1MDE0M1wyXDIzNVwxXDBcNFwyMzVcMVwwXDFcdTAxNDNcMVwyMzUiKwotICAgICJcMVwwXDFcMjM1XDFcMFwxXHUwMTQzXDJcMjM1XDZcMFwxXHUwMTQ0XDVcMCIrCi0gICAgIlwxXHUwMTQ0XDNcMFwxXDM2N1w1XDBcMVx1MDE0NFw1XDBcMVx1MDE0NFw3XDAiKwotICAgICJcMlx1MDE0NFwxXDBcMlx1MDE0NFwxXDBcMlx1MDE0NFw3XDBcMlx1MDE0NFwzXDAiKwotICAgICJcMlx1MDE0NFw3XDBcMVx1MDE0NVw1XDBcMVx1MDE0NVwxMVwwXDFcdTAxNDVcNVwwIisKLSAgICAiXDFcdTAxNDVcN1wwXDJcdTAxNDVcMVwwXDJcdTAxNDVcMVwwXDJcdTAxNDVcN1wwIisKLSAgICAiXDJcdTAxNDVcM1wwXDJcdTAxNDVcN1wwXDJcdTAxMWVcMVx1MDExZlwxXHUwMTQ2XDFcMCIrCi0gICAgIlwyXHUwMTFlXDFcMFwxXHUwMTQ2XDFcdTAxMjNcNFx1MDExZVwyXHUwMTQ2XDVcdTAxMWVcMVwwIisKLSAgICAiXDQ0XHUwMTFlXDFcMFwxXHUwMTQ3XDFcdTAxMWVcMVx1MDExZlwxXHUwMTQ2XDJcdTAxMWVcMVx1MDE0NyIrCi0gICAgIlwxXHUwMTFlXDFcdTAxNDZcMVx1MDE0OFw0XHUwMTFlXDJcdTAxNDZcMTZcdTAxMWVcMVx1MDE0N1wyXHUwMTFlIisKLSAgICAiXDFcdTAxNDdcMlx1MDExZVwxXHUwMTQ3XDEwXHUwMTFlXDFcdTAxNDdcNFx1MDExZVwxXHUwMTQ3XDdcdTAxMWUiKwotICAgICJcMVwwXDJcdTAxMjFcMVx1MDE0OVwxXDBcMVx1MDE0NlwxMVx1MDEyMVwyXDBcNTJcdTAxMjEiKwotICAgICJcMVwwXDJcdTAxMjJcMVx1MDE0YVwxXDBcM1x1MDEyMlwxXHUwMTQ2XDZcdTAxMjJcMlwwIisKLSAgICAiXDUyXHUwMTIyXDI0XDBcMVx1MDE0Ylw0N1wwXDFcdTAxNGNcMVwyNVwxXDEzMVwxXDI1IisKLSAgICAiXDFcMFwxXDI1XDFcdTAxNGNcMVwwXDFcMjVcMVwwXDFcMjVcM1wwIisKLSAgICAiXDJcMjVcMlwwXDNcMjVcMVwwXDFcMjVcN1wwXDFcdTAxNGNcMlwyNSIrCi0gICAgIlwxXHUwMTRjXDJcMjVcMVx1MDE0Y1wyXDI1XDFcMFw0XDI1XDFcMFwxXHUwMTRjIisKLSAgICAiXDFcMjVcMVwwXDFcMjVcMVwwXDFcdTAxNGNcMlwyNVw2XDBcMVx1MDE0ZCIrCi0gICAgIlwxXDEzNFwxXDEzNVwxXDEzNFwxXDBcMVwxMzRcMVx1MDE0ZFwxXDBcMVwxMzQiKwotICAgICJcMVwwXDFcMTM0XDNcMFwyXDEzNFwyXDBcM1wxMzRcMVwwXDFcMTM0IisKLSAgICAiXDdcMFwxXHUwMTRkXDJcMTM0XDFcdTAxNGRcMlwxMzRcMVx1MDE0ZFwyXDEzNFwxXDAiKwotICAgICJcNFwxMzRcMVwwXDFcdTAxNGRcMVwxMzRcMVwwXDFcMTM0XDFcMFwxXHUwMTRkIisKLSAgICAiXDJcMTM0XDZcMFwxXHUwMTRlXDFcMTM2XDFcMTM3XDFcMTM2XDFcMFwxXDEzNiIrCi0gICAgIlwxXHUwMTRlXDFcMFwxXDEzNlwxXDBcMVwxMzZcM1wwXDJcMTM2XDJcMCIrCi0gICAgIlwzXDEzNlwxXDBcMVwxMzZcN1wwXDFcdTAxNGVcMlwxMzZcMVx1MDE0ZVwyXDEzNiIrCi0gICAgIlwxXHUwMTRlXDJcMTM2XDFcMFw0XDEzNlwxXDBcMVx1MDE0ZVwxXDEzNlwxXDAiKwotICAgICJcMVwxMzZcMVwwXDFcdTAxNGVcMlwxMzZcNTJcMFwyXHUwMTRmXDczXDBcMVx1MDE1MCIrCi0gICAgIlwxMDZcMFwyXHUwMTUxXDdcMFwxXHUwMTUyXDFcMzQxXDFcMzQyXDFcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVwxXHUwMTUyXDFcMFwxXDM0MVwxXHUwMTAzXDFcMzQxXDNcMFwyXDM0MSIrCi0gICAgIlwyXDBcM1wzNDFcMVwwXDFcMzQxXDdcMFwxXHUwMTUyXDJcMzQxXDFcdTAxNTIiKwotICAgICJcMlwzNDFcMVx1MDE1MlwyXDM0MVwxXDBcNFwzNDFcMVwwXDFcdTAxNTJcMVwzNDEiKwotICAgICJcMVwwXDFcMzQxXDFcMFwxXHUwMTUyXDJcMzQxXDZcMFwxXHUwMTUzXDFcMTQ3IisKLSAgICAiXDFcMTUwXDFcMTQ3XDFcMFwxXDE0N1wxXHUwMTUzXDFcMFwxXDE0N1wxXDAiKwotICAgICJcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0N1wxXDI2MFwxXDE0N1w3XDAiKwotICAgICJcMVx1MDE1M1wyXDE0N1wxXHUwMTUzXDJcMTQ3XDFcdTAxNTNcMlwxNDdcMVwwXDRcMTQ3IisKLSAgICAiXDFcMFwxXHUwMTUzXDFcMTQ3XDFcMFwxXDE0N1wxXDBcMVx1MDE1M1wyXDE0NyIrCi0gICAgIlw2XDBcMVx1MDE1NFwxXDE1MVwxXDE1MlwxXDE1MVwxXDE1M1wxXDE1MVwxXHUwMTU0IisKLSAgICAiXDI3XDE1MVwxXHUwMTU0XDJcMTUxXDFcdTAxNTRcMlwxNTFcMVx1MDE1NFwxMFwxNTFcMVx1MDE1NCIrCi0gICAgIlw0XDE1MVwxXHUwMTU0XDdcMTUxXDFcMFwxXHUwMTU1XDFcMTU0XDFcMTU1XDNcMTU0IisKLSAgICAiXDFcdTAxNTVcMVwxNTNcMjZcMTU0XDFcdTAxNTVcMlwxNTRcMVx1MDE1NVwyXDE1NFwxXHUwMTU1IisKLSAgICAiXDEwXDE1NFwxXHUwMTU1XDRcMTU0XDFcdTAxNTVcN1wxNTRcMVwwXDFcdTAxNTZcMVwxNTciKwotICAgICJcMVwxNjBcMVwxNTdcMVwxNjFcMVwxNTdcMVx1MDE1NlwyN1wxNTdcMVx1MDE1NlwyXDE1NyIrCi0gICAgIlwxXHUwMTU2XDJcMTU3XDFcdTAxNTZcMTBcMTU3XDFcdTAxNTZcNFwxNTdcMVx1MDE1Nlw3XDE1NyIrCi0gICAgIlwxXDBcMVx1MDE1N1wxXDE2MlwxXDE2M1wzXDE2MlwxXHUwMTU3XDFcMTYxXDI2XDE2MiIrCi0gICAgIlwxXHUwMTU3XDJcMTYyXDFcdTAxNTdcMlwxNjJcMVx1MDE1N1wxMFwxNjJcMVx1MDE1N1w0XDE2MiIrCi0gICAgIlwxXHUwMTU3XDdcMTYyXDRcMFwxXHUwMTMyXDFcMFwxXHUwMTMyXDJcMFwxXHUwMTMyIisKLSAgICAiXDFcdTAxMGVcNFwwXDJcdTAxMzJcNTNcMFwxXHUwMTU4XDFcdTAxMGFcMVx1MDEwYlwxXHUwMTBhIisKLSAgICAiXDFcMFwxXHUwMTBhXDFcdTAxNThcMVwwXDFcdTAxMGFcMVx1MDEwZVwxM1x1MDEwYVwxXDAiKwotICAgICJcMTBcdTAxMGFcMVx1MDE1OFwyXHUwMTBhXDFcdTAxNThcMlx1MDEwYVwxXHUwMTU4XDEwXHUwMTBhXDFcdTAxNTgiKwotICAgICJcNFx1MDEwYVwxXHUwMTU4XDdcdTAxMGFcMVwwXDFcdTAxNTlcMVx1MDEwY1wxXHUwMTM1XDFcdTAxMGMiKwotICAgICJcMVx1MDE1YVwxXHUwMTBjXDFcdTAxNTlcMTBcdTAxMGNcMVx1MDE1YlwxNlx1MDEwY1wxXHUwMTU5XDJcdTAxMGMiKwotICAgICJcMVx1MDE1OVwyXHUwMTBjXDFcdTAxNTlcMTBcdTAxMGNcMVx1MDE1OVw0XHUwMTBjXDFcdTAxNTlcN1x1MDEwYyIrCi0gICAgIlwxXDBcMVx1MDE1Y1wxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMTVjXDFcdTAxNWRcN1x1MDEwZCIrCi0gICAgIlwxXHUwMTVlXDE2XHUwMTBkXDFcdTAxNWNcMlx1MDEwZFwxXHUwMTVjXDJcdTAxMGRcMVx1MDE1Y1wxMFx1MDEwZCIrCi0gICAgIlwxXHUwMTVjXDRcdTAxMGRcMVx1MDE1Y1w3XHUwMTBkXDFcMFwxXHUwMTVmXDFcNTFcMVwxNjUiKwotICAgICJcMVw1MVwxXDBcMVw1MVwxXHUwMTVmXDFcMFwxXDUxXDFcMFwxXDUxIisKLSAgICAiXDNcMFwyXDUxXDJcMFwzXDUxXDFcMFwxXDUxXDdcMFwxXHUwMTVmIisKLSAgICAiXDJcNTFcMVx1MDE1ZlwyXDUxXDFcdTAxNWZcMlw1MVwxXDBcNFw1MVwxXDAiKwotICAgICJcMVx1MDE1ZlwxXDUxXDFcMFwxXDUxXDFcMFwxXHUwMTVmXDJcNTFcNlwwIisKLSAgICAiXDFcdTAxNjBcMVw1NVwxXDE3MFwxXDU1XDFcMFwxXDU1XDFcdTAxNjBcMVwwIisKLSAgICAiXDFcNTVcMVwwXDFcNTVcM1wwXDJcNTVcMlwwXDNcNTVcMVwwIisKLSAgICAiXDFcNTVcN1wwXDFcdTAxNjBcMlw1NVwxXHUwMTYwXDJcNTVcMVx1MDE2MFwyXDU1IisKLSAgICAiXDFcMFw0XDU1XDFcMFwxXHUwMTYwXDFcNTVcMVwwXDFcNTVcMVwwIisKLSAgICAiXDFcdTAxNjBcMlw1NVw2XDBcMVx1MDE2MVwxXDYyXDFcMTczXDFcNjJcMVwwIisKLSAgICAiXDFcNjJcMVx1MDE2MVwxXDBcMVw2MlwxXDBcMVw2MlwzXDBcMlw2MiIrCi0gICAgIlwyXDBcM1w2MlwxXDBcMVw2Mlw3XDBcMVx1MDE2MVwyXDYyXDFcdTAxNjEiKwotICAgICJcMlw2MlwxXHUwMTYxXDJcNjJcMVwwXDRcNjJcMVwwXDFcdTAxNjFcMVw2MiIrCi0gICAgIlwxXDBcMVw2MlwxXDBcMVx1MDE2MVwyXDYyXDZcMFwxXHUwMTYyXDFcNzIiKwotICAgICJcMVwyMDBcMVw3MlwxXDBcMVw3MlwxXHUwMTYyXDFcMFwxXDcyXDFcMCIrCi0gICAgIlwxXDcyXDNcMFwyXDcyXDJcMFwzXDcyXDFcMFwxXDcyXDdcMCIrCi0gICAgIlwxXHUwMTYyXDJcNzJcMVx1MDE2MlwyXDcyXDFcdTAxNjJcMlw3MlwxXDBcNFw3MiIrCi0gICAgIlwxXDBcMVx1MDE2MlwxXDcyXDFcMFwxXDcyXDFcMFwxXHUwMTYyXDJcNzIiKwotICAgICJcNlwwXDFcdTAxNjNcMVwxMDBcMVwyMDNcMVwxMDBcMVwwXDFcMTAwXDFcdTAxNjMiKwotICAgICJcMVwwXDFcMTAwXDFcMFwxXDEwMFwzXDBcMlwxMDBcMlwwXDNcMTAwIisKLSAgICAiXDFcMFwxXDEwMFw3XDBcMVx1MDE2M1wyXDEwMFwxXHUwMTYzXDJcMTAwXDFcdTAxNjMiKwotICAgICJcMlwxMDBcMVwwXDRcMTAwXDFcMFwxXHUwMTYzXDFcMTAwXDFcMFwxXDEwMCIrCi0gICAgIlwxXDBcMVx1MDE2M1wyXDEwMFw2XDBcMVx1MDE2NFwxXDIwNVwxXDIwNlwxXDIwNSIrCi0gICAgIlwxXDIwN1wxXDIwNVwxXHUwMTY0XDI3XDIwNVwxXHUwMTY0XDJcMjA1XDFcdTAxNjRcMlwyMDUiKwotICAgICJcMVx1MDE2NFwxMFwyMDVcMVx1MDE2NFw0XDIwNVwxXHUwMTY0XDdcMjA1XDFcMFwxXHUwMTY1IisKLSAgICAiXDFcMjEwXDFcMjExXDNcMjEwXDFcdTAxNjVcMVwyMDdcMjZcMjEwXDFcdTAxNjVcMlwyMTAiKwotICAgICJcMVx1MDE2NVwyXDIxMFwxXHUwMTY1XDEwXDIxMFwxXHUwMTY1XDRcMjEwXDFcdTAxNjVcN1wyMTAiKwotICAgICJcMVwwXDFcdTAxNjZcMVwxMDVcMVwyMTNcMVwxMDVcMVwwXDFcMTA1XDFcdTAxNjYiKwotICAgICJcMVwwXDFcMTA1XDFcMFwxXDEwNVwzXDBcMlwxMDVcMlwwXDNcMTA1IisKLSAgICAiXDFcMFwxXDEwNVw3XDBcMVx1MDE2NlwyXDEwNVwxXHUwMTY2XDJcMTA1XDFcdTAxNjYiKwotICAgICJcMlwxMDVcMVwwXDRcMTA1XDFcMFwxXHUwMTY2XDFcMTA1XDFcMFwxXDEwNSIrCi0gICAgIlwxXDBcMVx1MDE2NlwyXDEwNVw2XDBcMVx1MDE2N1wxXDIxNlwxXDIxN1wxXDIxNiIrCi0gICAgIlwxXDBcMVwyMTZcMVx1MDE2N1wxXDBcMVwyMTZcMVwwXDFcMjE2XDNcMCIrCi0gICAgIlwyXDIxNlwyXDBcM1wyMTZcMVwwXDFcMjE2XDdcMFwxXHUwMTY3XDJcMjE2IisKLSAgICAiXDFcdTAxNjdcMlwyMTZcMVx1MDE2N1wyXDIxNlwxXDBcNFwyMTZcMVwwXDFcdTAxNjciKwotICAgICJcMVwyMTZcMVwwXDFcMjE2XDFcMFwxXHUwMTY3XDJcMjE2XDZcMFwxXHUwMTY4IisKLSAgICAiXDFcMTEzXDFcMjIyXDFcMTEzXDFcMFwxXDExM1wxXHUwMTY4XDFcMFwxXDExMyIrCi0gICAgIlwxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyM1wxXDExMyIrCi0gICAgIlw3XDBcMVx1MDE2OFwyXDExM1wxXHUwMTY4XDJcMTEzXDFcdTAxNjhcMlwxMTNcMVwwIisKLSAgICAiXDRcMTEzXDFcMFwxXHUwMTY4XDFcMTEzXDFcMFwxXDExM1wxXDBcMVx1MDE2OCIrCi0gICAgIlwyXDExM1w2XDBcMVx1MDE2OVwxXDIyNVwxXDIyNlwxXDIyNVwxXDIyN1wxXDIyNSIrCi0gICAgIlwxXHUwMTY5XDI3XDIyNVwxXHUwMTY5XDJcMjI1XDFcdTAxNjlcMlwyMjVcMVx1MDE2OVwxMFwyMjUiKwotICAgICJcMVx1MDE2OVw0XDIyNVwxXHUwMTY5XDdcMjI1XDFcMFwxXHUwMTZhXDFcMjMwXDFcMjMxIisKLSAgICAiXDNcMjMwXDFcdTAxNmFcMVwyMjdcMjZcMjMwXDFcdTAxNmFcMlwyMzBcMVx1MDE2YVwyXDIzMCIrCi0gICAgIlwxXHUwMTZhXDEwXDIzMFwxXHUwMTZhXDRcMjMwXDFcdTAxNmFcN1wyMzBcMVwwXDFcdTAxNmIiKwotICAgICJcMVwyMzVcMVwyMzZcMVwyMzVcMVwwXDFcMjM1XDFcdTAxNmJcMVwwXDFcMjM1IisKLSAgICAiXDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwXDNcMjM1XDFcMFwxXDIzNSIrCi0gICAgIlw3XDBcMVx1MDE2YlwyXDIzNVwxXHUwMTZiXDJcMjM1XDFcdTAxNmJcMlwyMzVcMVwwIisKLSAgICAiXDRcMjM1XDFcMFwxXHUwMTZiXDFcMjM1XDFcMFwxXDIzNVwxXDBcMVx1MDE2YiIrCi0gICAgIlwyXDIzNVw2XDBcMVx1MDE2Y1w1XDBcMVx1MDE2Y1wzXDBcMVwzNjdcNVwwIisKLSAgICAiXDFcdTAxNmNcNVwwXDFcdTAxNmNcN1wwXDJcdTAxNmNcMVwwXDJcdTAxNmNcMVwwIisKLSAgICAiXDJcdTAxNmNcN1wwXDJcdTAxNmNcM1wwXDJcdTAxNmNcN1wwXDFcdTAxNmRcNVwwIisKLSAgICAiXDFcdTAxNmRcMTFcMFwxXHUwMTZkXDVcMFwxXHUwMTZkXDdcMFwyXHUwMTZkXDFcMCIrCi0gICAgIlwyXHUwMTZkXDFcMFwyXHUwMTZkXDdcMFwyXHUwMTZkXDNcMFwyXHUwMTZkXDEyXDAiKwotICAgICJcMVx1MDE0NlwxXDBcMVx1MDE0NlwyXDBcMVx1MDE0NlwxXHUwMTIzXDRcMFwyXHUwMTQ2IisKLSAgICAiXDUzXDBcMVx1MDE2ZVwxXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDBcMVx1MDExZVwxXHUwMTZlIisKLSAgICAiXDFcMFwxXHUwMTFlXDFcdTAxMjNcMTNcdTAxMWVcMVwwXDEwXHUwMTFlXDFcdTAxNmVcMlx1MDExZSIrCi0gICAgIlwxXHUwMTZlXDJcdTAxMWVcMVx1MDE2ZVwxMFx1MDExZVwxXHUwMTZlXDRcdTAxMWVcMVx1MDE2ZVw3XHUwMTFlIisKLSAgICAiXDFcMFwxXHUwMTZmXDFcdTAxMjFcMVx1MDE0OVwxXHUwMTIxXDFcdTAxNzBcMVx1MDEyMVwxXHUwMTZmIisKLSAgICAiXDEwXHUwMTIxXDFcdTAxNzFcMTZcdTAxMjFcMVx1MDE2ZlwyXHUwMTIxXDFcdTAxNmZcMlx1MDEyMVwxXHUwMTZmIisKLSAgICAiXDEwXHUwMTIxXDFcdTAxNmZcNFx1MDEyMVwxXHUwMTZmXDdcdTAxMjFcMVwwXDFcdTAxNzJcMVx1MDEyMiIrCi0gICAgIlwxXHUwMTRhXDNcdTAxMjJcMVx1MDE3MlwxXHUwMTczXDdcdTAxMjJcMVx1MDE3NFwxNlx1MDEyMlwxXHUwMTcyIisKLSAgICAiXDJcdTAxMjJcMVx1MDE3MlwyXHUwMTIyXDFcdTAxNzJcMTBcdTAxMjJcMVx1MDE3Mlw0XHUwMTIyXDFcdTAxNzIiKwotICAgICJcN1x1MDEyMlw0N1wwXDFcdTAxNzVcMjRcMFwyXDI1XDFcMTMxXDFcMjVcMVwwIisKLSAgICAiXDJcMjVcMVwwXDFcMjVcMVwwXDFcMjVcM1wwXDJcMjVcMlwwIisKLSAgICAiXDNcMjVcMVwwXDFcMjVcN1wwXDExXDI1XDFcMFw0XDI1XDFcMCIrCi0gICAgIlwyXDI1XDFcMFwxXDI1XDFcMFwzXDI1XDZcMFwxXHUwMTc2XDFcMTM0IisKLSAgICAiXDFcMTM1XDFcMTM0XDFcMFwxXDEzNFwxXHUwMTc2XDFcMFwxXDEzNFwxXDAiKwotICAgICJcMVwxMzRcM1wwXDJcMTM0XDJcMFwzXDEzNFwxXDBcMVwxMzRcN1wwIisKLSAgICAiXDFcdTAxNzZcMlwxMzRcMVx1MDE3NlwyXDEzNFwxXHUwMTc2XDJcMTM0XDFcMFw0XDEzNCIrCi0gICAgIlwxXDBcMVx1MDE3NlwxXDEzNFwxXDBcMVwxMzRcMVwwXDFcdTAxNzZcMlwxMzQiKwotICAgICJcNlwwXDFcdTAxNzdcMVwxMzZcMVwxMzdcMVwxMzZcMVwwXDFcMTM2XDFcdTAxNzciKwotICAgICJcMVwwXDFcMTM2XDFcMFwxXDEzNlwzXDBcMlwxMzZcMlwwXDNcMTM2IisKLSAgICAiXDFcMFwxXDEzNlw3XDBcMVx1MDE3N1wyXDEzNlwxXHUwMTc3XDJcMTM2XDFcdTAxNzciKwotICAgICJcMlwxMzZcMVwwXDRcMTM2XDFcMFwxXHUwMTc3XDFcMTM2XDFcMFwxXDEzNiIrCi0gICAgIlwxXDBcMVx1MDE3N1wyXDEzNlw1NFwwXDFcdTAxNzhcNjVcMFwyXHUwMTc5XDMwXDAiKwotICAgICJcMVx1MDE3YVwxXDM0MVwxXDM0MlwxXDM0MVwxXDBcMVwzNDFcMVx1MDE3YVwxXDAiKwotICAgICJcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDFcMlwwXDNcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVw3XDBcMVx1MDE3YVwyXDM0MVwxXHUwMTdhXDJcMzQxXDFcdTAxN2FcMlwzNDEiKwotICAgICJcMVwwXDRcMzQxXDFcMFwxXHUwMTdhXDFcMzQxXDFcMFwxXDM0MVwxXDAiKwotICAgICJcMVx1MDE3YVwyXDM0MVw2XDBcMVx1MDE3YlwxXDE0N1wxXDE1MFwxXDE0N1wxXDAiKwotICAgICJcMVwxNDdcMVx1MDE3YlwxXDBcMVwxNDdcMVwwXDFcMTQ3XDNcMFwyXDE0NyIrCi0gICAgIlwyXDBcM1wxNDdcMVwyNjBcMVwxNDdcN1wwXDFcdTAxN2JcMlwxNDdcMVx1MDE3YiIrCi0gICAgIlwyXDE0N1wxXHUwMTdiXDJcMTQ3XDFcMFw0XDE0N1wxXDBcMVx1MDE3YlwxXDE0NyIrCi0gICAgIlwxXDBcMVwxNDdcMVwwXDFcdTAxN2JcMlwxNDdcNlwwXDFcdTAxN2NcMVwxNTEiKwotICAgICJcMVwxNTJcMVwxNTFcMVwxNTNcMVwxNTFcMVx1MDE3Y1wyN1wxNTFcMVx1MDE3Y1wyXDE1MSIrCi0gICAgIlwxXHUwMTdjXDJcMTUxXDFcdTAxN2NcMTBcMTUxXDFcdTAxN2NcNFwxNTFcMVx1MDE3Y1w3XDE1MSIrCi0gICAgIlwxXDBcMVx1MDE3ZFwxXDE1NFwxXDE1NVwzXDE1NFwxXHUwMTdkXDFcMTUzXDI2XDE1NCIrCi0gICAgIlwxXHUwMTdkXDJcMTU0XDFcdTAxN2RcMlwxNTRcMVx1MDE3ZFwxMFwxNTRcMVx1MDE3ZFw0XDE1NCIrCi0gICAgIlwxXHUwMTdkXDdcMTU0XDFcMFwxXHUwMTdlXDFcMTU3XDFcMTYwXDFcMTU3XDFcMTYxIisKLSAgICAiXDFcMTU3XDFcdTAxN2VcMjdcMTU3XDFcdTAxN2VcMlwxNTdcMVx1MDE3ZVwyXDE1N1wxXHUwMTdlIisKLSAgICAiXDEwXDE1N1wxXHUwMTdlXDRcMTU3XDFcdTAxN2VcN1wxNTdcMVwwXDFcdTAxN2ZcMVwxNjIiKwotICAgICJcMVwxNjNcM1wxNjJcMVx1MDE3ZlwxXDE2MVwyNlwxNjJcMVx1MDE3ZlwyXDE2MlwxXHUwMTdmIisKLSAgICAiXDJcMTYyXDFcdTAxN2ZcMTBcMTYyXDFcdTAxN2ZcNFwxNjJcMVx1MDE3Zlw3XDE2MlwxXDAiKwotICAgICJcMVx1MDE4MFwxXHUwMTBhXDFcdTAxMGJcMVx1MDEwYVwxXDBcMVx1MDEwYVwxXHUwMTgwXDFcMCIrCi0gICAgIlwxXHUwMTBhXDFcdTAxMGVcMTNcdTAxMGFcMVwwXDEwXHUwMTBhXDFcdTAxODBcMlx1MDEwYVwxXHUwMTgwIisKLSAgICAiXDJcdTAxMGFcMVx1MDE4MFwxMFx1MDEwYVwxXHUwMTgwXDRcdTAxMGFcMVx1MDE4MFw3XHUwMTBhXDFcMCIrCi0gICAgIlwxXHUwMTgxXDFcdTAxMGNcMVx1MDEzNVwxXHUwMTBjXDFcdTAxMzJcMVx1MDEwY1wxXHUwMTgxXDI3XHUwMTBjIisKLSAgICAiXDFcdTAxODFcMlx1MDEwY1wxXHUwMTgxXDJcdTAxMGNcMVx1MDE4MVwxMFx1MDEwY1wxXHUwMTgxXDRcdTAxMGMiKwotICAgICJcMVx1MDE4MVw3XHUwMTBjXDFcMFwyXHUwMTBjXDFcdTAxMzVcMlx1MDEzMlwxXHUwMTVhXDJcdTAxMGMiKwotICAgICJcMVx1MDE1YVwxXHUwMTgyXDRcdTAxMGNcMlx1MDEzMlw1Mlx1MDEwY1wxXDBcMlx1MDEwY1wxXHUwMTM1IisKLSAgICAiXDFcMFwxXHUwMTMyXDEyXHUwMTBjXDFcMFw1Mlx1MDEwY1wxXDBcMVx1MDE4M1wxXHUwMTBkIisKLSAgICAiXDFcdTAxMzZcM1x1MDEwZFwxXHUwMTgzXDFcdTAxMzJcMjZcdTAxMGRcMVx1MDE4M1wyXHUwMTBkXDFcdTAxODMiKwotICAgICJcMlx1MDEwZFwxXHUwMTgzXDEwXHUwMTBkXDFcdTAxODNcNFx1MDEwZFwxXHUwMTgzXDdcdTAxMGRcMVwwIisKLSAgICAiXDJcdTAxMGRcMVx1MDEzNlwxXHUwMTMyXDFcdTAxMGRcMVx1MDE1ZFwxXHUwMTBkXDFcdTAxMzJcMVx1MDE1ZCIrCi0gICAgIlwxXHUwMTg0XDRcdTAxMGRcMlx1MDEzMlw1Mlx1MDEwZFwxXDBcMlx1MDEwZFwxXHUwMTM2XDFcMCIrCi0gICAgIlwzXHUwMTBkXDFcdTAxMzJcN1x1MDEwZFwxXDBcNTJcdTAxMGRcMVwwXDJcNTFcMVwxNjUiKwotICAgICJcMVw1MVwxXDBcMlw1MVwxXDBcMVw1MVwxXDBcMVw1MVwzXDAiKwotICAgICJcMlw1MVwyXDBcM1w1MVwxXDBcMVw1MVw3XDBcMTFcNTFcMVwwIisKLSAgICAiXDRcNTFcMVwwXDJcNTFcMVwwXDFcNTFcMVwwXDNcNTFcNlwwIisKLSAgICAiXDJcNTVcMVwxNzBcMVw1NVwxXDBcMlw1NVwxXDBcMVw1NVwxXDAiKwotICAgICJcMVw1NVwzXDBcMlw1NVwyXDBcM1w1NVwxXDBcMVw1NVw3XDAiKwotICAgICJcMTFcNTVcMVwwXDRcNTVcMVwwXDJcNTVcMVwwXDFcNTVcMVwwIisKLSAgICAiXDNcNTVcNlwwXDJcNjJcMVwxNzNcMVw2MlwxXDBcMlw2MlwxXDAiKwotICAgICJcMVw2MlwxXDBcMVw2MlwzXDBcMlw2MlwyXDBcM1w2MlwxXDAiKwotICAgICJcMVw2Mlw3XDBcMTFcNjJcMVwwXDRcNjJcMVwwXDJcNjJcMVwwIisKLSAgICAiXDFcNjJcMVwwXDNcNjJcNlwwXDJcNzJcMVwyMDBcMVw3MlwxXDAiKwotICAgICJcMlw3MlwxXDBcMVw3MlwxXDBcMVw3MlwzXDBcMlw3MlwyXDAiKwotICAgICJcM1w3MlwxXDBcMVw3Mlw3XDBcMTFcNzJcMVwwXDRcNzJcMVwwIisKLSAgICAiXDJcNzJcMVwwXDFcNzJcMVwwXDNcNzJcNlwwXDJcMTAwXDFcMjAzIisKLSAgICAiXDFcMTAwXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDFcMTAwXDNcMCIrCi0gICAgIlwyXDEwMFwyXDBcM1wxMDBcMVwwXDFcMTAwXDdcMFwxMVwxMDBcMVwwIisKLSAgICAiXDRcMTAwXDFcMFwyXDEwMFwxXDBcMVwxMDBcMVwwXDNcMTAwXDZcMCIrCi0gICAgIlwxXHUwMTg1XDFcMjA1XDFcMjA2XDFcMjA1XDFcMjA3XDFcMjA1XDFcdTAxODVcMjdcMjA1IisKLSAgICAiXDFcdTAxODVcMlwyMDVcMVx1MDE4NVwyXDIwNVwxXHUwMTg1XDEwXDIwNVwxXHUwMTg1XDRcMjA1IisKLSAgICAiXDFcdTAxODVcN1wyMDVcMVwwXDFcdTAxODZcMVwyMTBcMVwyMTFcM1wyMTBcMVx1MDE4NiIrCi0gICAgIlwxXDIwN1wyNlwyMTBcMVx1MDE4NlwyXDIxMFwxXHUwMTg2XDJcMjEwXDFcdTAxODZcMTBcMjEwIisKLSAgICAiXDFcdTAxODZcNFwyMTBcMVx1MDE4Nlw3XDIxMFwxXDBcMlwxMDVcMVwyMTNcMVwxMDUiKwotICAgICJcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcMVwxMDVcM1wwXDJcMTA1IisKLSAgICAiXDJcMFwzXDEwNVwxXDBcMVwxMDVcN1wwXDExXDEwNVwxXDBcNFwxMDUiKwotICAgICJcMVwwXDJcMTA1XDFcMFwxXDEwNVwxXDBcM1wxMDVcNlwwXDFcdTAxODciKwotICAgICJcMVwyMTZcMVwyMTdcMVwyMTZcMVwwXDFcMjE2XDFcdTAxODdcMVwwXDFcMjE2IisKLSAgICAiXDFcMFwxXDIxNlwzXDBcMlwyMTZcMlwwXDNcMjE2XDFcMFwxXDIxNiIrCi0gICAgIlw3XDBcMVx1MDE4N1wyXDIxNlwxXHUwMTg3XDJcMjE2XDFcdTAxODdcMlwyMTZcMVwwIisKLSAgICAiXDRcMjE2XDFcMFwxXHUwMTg3XDFcMjE2XDFcMFwxXDIxNlwxXDBcMVx1MDE4NyIrCi0gICAgIlwyXDIxNlw2XDBcMlwxMTNcMVwyMjJcMVwxMTNcMVwwXDJcMTEzXDFcMCIrCi0gICAgIlwxXDExM1wxXDBcMVwxMTNcM1wwXDJcMTEzXDJcMFwzXDExM1wxXDIyMyIrCi0gICAgIlwxXDExM1w3XDBcMTFcMTEzXDFcMFw0XDExM1wxXDBcMlwxMTNcMVwwIisKLSAgICAiXDFcMTEzXDFcMFwzXDExM1w2XDBcMVx1MDE4OFwxXDIyNVwxXDIyNlwxXDIyNSIrCi0gICAgIlwxXDIyN1wxXDIyNVwxXHUwMTg4XDI3XDIyNVwxXHUwMTg4XDJcMjI1XDFcdTAxODhcMlwyMjUiKwotICAgICJcMVx1MDE4OFwxMFwyMjVcMVx1MDE4OFw0XDIyNVwxXHUwMTg4XDdcMjI1XDFcMFwxXHUwMTg5IisKLSAgICAiXDFcMjMwXDFcMjMxXDNcMjMwXDFcdTAxODlcMVwyMjdcMjZcMjMwXDFcdTAxODlcMlwyMzAiKwotICAgICJcMVx1MDE4OVwyXDIzMFwxXHUwMTg5XDEwXDIzMFwxXHUwMTg5XDRcMjMwXDFcdTAxODlcN1wyMzAiKwotICAgICJcMVwwXDFcdTAxOGFcMVwyMzVcMVwyMzZcMVwyMzVcMVwwXDFcMjM1XDFcdTAxOGEiKwotICAgICJcMVwwXDFcMjM1XDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwXDNcMjM1IisKLSAgICAiXDFcMFwxXDIzNVw3XDBcMVx1MDE4YVwyXDIzNVwxXHUwMThhXDJcMjM1XDFcdTAxOGEiKwotICAgICJcMlwyMzVcMVwwXDRcMjM1XDFcMFwxXHUwMThhXDFcMjM1XDFcMFwxXDIzNSIrCi0gICAgIlwxXDBcMVx1MDE4YVwyXDIzNVw2XDBcMVx1MDE4Ylw1XDBcMVx1MDE4YlwzXDAiKwotICAgICJcMVwzNjdcNVwwXDFcdTAxOGJcNVwwXDFcdTAxOGJcN1wwXDJcdTAxOGJcMVwwIisKLSAgICAiXDJcdTAxOGJcMVwwXDJcdTAxOGJcN1wwXDJcdTAxOGJcM1wwXDJcdTAxOGJcN1wwIisKLSAgICAiXDFcdTAxOGNcNVwwXDFcdTAxOGNcMTFcMFwxXHUwMThjXDVcMFwxXHUwMThjXDdcMCIrCi0gICAgIlwyXHUwMThjXDFcMFwyXHUwMThjXDFcMFwyXHUwMThjXDdcMFwyXHUwMThjXDNcMCIrCi0gICAgIlwyXHUwMThjXDdcMFwxXHUwMThkXDFcdTAxMWVcMVx1MDExZlwxXHUwMTFlXDFcMFwxXHUwMTFlIisKLSAgICAiXDFcdTAxOGRcMVwwXDFcdTAxMWVcMVx1MDEyM1wxM1x1MDExZVwxXDBcMTBcdTAxMWVcMVx1MDE4ZCIrCi0gICAgIlwyXHUwMTFlXDFcdTAxOGRcMlx1MDExZVwxXHUwMThkXDEwXHUwMTFlXDFcdTAxOGRcNFx1MDExZVwxXHUwMThkIisKLSAgICAiXDdcdTAxMWVcMVwwXDFcdTAxOGVcMVx1MDEyMVwxXHUwMTQ5XDFcdTAxMjFcMVx1MDE0NlwxXHUwMTIxIisKLSAgICAiXDFcdTAxOGVcMjdcdTAxMjFcMVx1MDE4ZVwyXHUwMTIxXDFcdTAxOGVcMlx1MDEyMVwxXHUwMThlXDEwXHUwMTIxIisKLSAgICAiXDFcdTAxOGVcNFx1MDEyMVwxXHUwMThlXDdcdTAxMjFcMVwwXDJcdTAxMjFcMVx1MDE0OVwyXHUwMTQ2IisKLSAgICAiXDFcdTAxNzBcMlx1MDEyMVwxXHUwMTcwXDFcdTAxOGZcNFx1MDEyMVwyXHUwMTQ2XDUyXHUwMTIxXDFcMCIrCi0gICAgIlwyXHUwMTIxXDFcdTAxNDlcMVwwXDFcdTAxNDZcMTJcdTAxMjFcMVwwXDUyXHUwMTIxXDFcMCIrCi0gICAgIlwxXHUwMTkwXDFcdTAxMjJcMVx1MDE0YVwzXHUwMTIyXDFcdTAxOTBcMVx1MDE0NlwyNlx1MDEyMlwxXHUwMTkwIisKLSAgICAiXDJcdTAxMjJcMVx1MDE5MFwyXHUwMTIyXDFcdTAxOTBcMTBcdTAxMjJcMVx1MDE5MFw0XHUwMTIyXDFcdTAxOTAiKwotICAgICJcN1x1MDEyMlwxXDBcMlx1MDEyMlwxXHUwMTRhXDFcdTAxNDZcMVx1MDEyMlwxXHUwMTczXDFcdTAxMjIiKwotICAgICJcMVx1MDE0NlwxXHUwMTczXDFcdTAxOTFcNFx1MDEyMlwyXHUwMTQ2XDUyXHUwMTIyXDFcMFwyXHUwMTIyIisKLSAgICAiXDFcdTAxNGFcMVwwXDNcdTAxMjJcMVx1MDE0Nlw3XHUwMTIyXDFcMFw1Mlx1MDEyMlw0MlwwIisKLSAgICAiXDJcdTAxOTJcMzBcMFwyXDEzNFwxXDEzNVwxXDEzNFwxXDBcMlwxMzRcMVwwIisKLSAgICAiXDFcMTM0XDFcMFwxXDEzNFwzXDBcMlwxMzRcMlwwXDNcMTM0XDFcMCIrCi0gICAgIlwxXDEzNFw3XDBcMTFcMTM0XDFcMFw0XDEzNFwxXDBcMlwxMzRcMVwwIisKLSAgICAiXDFcMTM0XDFcMFwzXDEzNFw2XDBcMlwxMzZcMVwxMzdcMVwxMzZcMVwwIisKLSAgICAiXDJcMTM2XDFcMFwxXDEzNlwxXDBcMVwxMzZcM1wwXDJcMTM2XDJcMCIrCi0gICAgIlwzXDEzNlwxXDBcMVwxMzZcN1wwXDExXDEzNlwxXDBcNFwxMzZcMVwwIisKLSAgICAiXDJcMTM2XDFcMFwxXDEzNlwxXDBcM1wxMzZcNDRcMFwyXHUwMTkzXDMzXDAiKwotICAgICJcMVx1MDE5NFwxXDM0MVwxXDM0MlwxXDM0MVwxXDBcMVwzNDFcMVx1MDE5NFwxXDAiKwotICAgICJcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDFcMlwwXDNcMzQxXDFcMCIrCi0gICAgIlwxXDM0MVw3XDBcMVx1MDE5NFwyXDM0MVwxXHUwMTk0XDJcMzQxXDFcdTAxOTRcMlwzNDEiKwotICAgICJcMVwwXDRcMzQxXDFcMFwxXHUwMTk0XDFcMzQxXDFcMFwxXDM0MVwxXDAiKwotICAgICJcMVx1MDE5NFwyXDM0MVw2XDBcMlwxNDdcMVwxNTBcMVwxNDdcMVwwXDJcMTQ3IisKLSAgICAiXDFcMFwxXDE0N1wxXDBcMVwxNDdcM1wwXDJcMTQ3XDJcMFwzXDE0NyIrCi0gICAgIlwxXDI2MFwxXDE0N1w3XDBcMTFcMTQ3XDFcMFw0XDE0N1wxXDBcMlwxNDciKwotICAgICJcMVwwXDFcMTQ3XDFcMFwzXDE0N1w2XDBcMlwxNTFcMVwxNTJcMVwxNTEiKwotICAgICJcMVwxNTNcNjVcMTUxXDFcMFwyXDE1NFwxXDE1NVw0XDE1NFwxXDE1M1w2MlwxNTQiKwotICAgICJcMVwwXDJcMTU3XDFcMTYwXDFcMTU3XDFcMTYxXDY1XDE1N1wxXDBcMlwxNjIiKwotICAgICJcMVwxNjNcNFwxNjJcMVwxNjFcNjJcMTYyXDFcMFwxXHUwMTk1XDFcdTAxMGFcMVx1MDEwYiIrCi0gICAgIlwxXHUwMTBhXDFcMFwxXHUwMTBhXDFcdTAxOTVcMVwwXDFcdTAxMGFcMVx1MDEwZVwxM1x1MDEwYSIrCi0gICAgIlwxXDBcMTBcdTAxMGFcMVx1MDE5NVwyXHUwMTBhXDFcdTAxOTVcMlx1MDEwYVwxXHUwMTk1XDEwXHUwMTBhIisKLSAgICAiXDFcdTAxOTVcNFx1MDEwYVwxXHUwMTk1XDdcdTAxMGFcMVwwXDFcdTAxOTZcMVx1MDEwY1wxXHUwMTM1IisKLSAgICAiXDFcdTAxMGNcMVx1MDEzMlwxXHUwMTBjXDFcdTAxOTZcMjdcdTAxMGNcMVx1MDE5NlwyXHUwMTBjXDFcdTAxOTYiKwotICAgICJcMlx1MDEwY1wxXHUwMTk2XDEwXHUwMTBjXDFcdTAxOTZcNFx1MDEwY1wxXHUwMTk2XDdcdTAxMGNcMVwwIisKLSAgICAiXDFcdTAxOTdcMVx1MDEwZFwxXHUwMTM2XDNcdTAxMGRcMVx1MDE5N1wxXHUwMTMyXDI2XHUwMTBkXDFcdTAxOTciKwotICAgICJcMlx1MDEwZFwxXHUwMTk3XDJcdTAxMGRcMVx1MDE5N1wxMFx1MDEwZFwxXHUwMTk3XDRcdTAxMGRcMVx1MDE5NyIrCi0gICAgIlw3XHUwMTBkXDFcMFwyXDIwNVwxXDIwNlwxXDIwNVwxXDIwN1w2NVwyMDVcMVwwIisKLSAgICAiXDJcMjEwXDFcMjExXDRcMjEwXDFcMjA3XDYyXDIxMFwxXDBcMlwyMTZcMVwyMTciKwotICAgICJcMVwyMTZcMVwwXDJcMjE2XDFcMFwxXDIxNlwxXDBcMVwyMTZcM1wwIisKLSAgICAiXDJcMjE2XDJcMFwzXDIxNlwxXDBcMVwyMTZcN1wwXDExXDIxNlwxXDAiKwotICAgICJcNFwyMTZcMVwwXDJcMjE2XDFcMFwxXDIxNlwxXDBcM1wyMTZcNlwwIisKLSAgICAiXDJcMjI1XDFcMjI2XDFcMjI1XDFcMjI3XDY1XDIyNVwxXDBcMlwyMzBcMVwyMzEiKwotICAgICJcNFwyMzBcMVwyMjdcNjJcMjMwXDFcMFwyXDIzNVwxXDIzNlwxXDIzNVwxXDAiKwotICAgICJcMlwyMzVcMVwwXDFcMjM1XDFcMFwxXDIzNVwzXDBcMlwyMzVcMlwwIisKLSAgICAiXDNcMjM1XDFcMFwxXDIzNVw3XDBcMTFcMjM1XDFcMFw0XDIzNVwxXDAiKwotICAgICJcMlwyMzVcMVwwXDFcMjM1XDFcMFwzXDIzNVwyMFwwXDFcMzY3XDYwXDAiKwotICAgICJcMVx1MDE5OFw1XDBcMVx1MDE5OFwxMVwwXDFcdTAxOThcNVwwXDFcdTAxOThcN1wwIisKLSAgICAiXDJcdTAxOThcMVwwXDJcdTAxOThcMVwwXDJcdTAxOThcN1wwXDJcdTAxOThcM1wwIisKLSAgICAiXDJcdTAxOThcN1wwXDFcdTAxOTlcMVx1MDExZVwxXHUwMTFmXDFcdTAxMWVcMVwwXDFcdTAxMWUiKwotICAgICJcMVx1MDE5OVwxXDBcMVx1MDExZVwxXHUwMTIzXDEzXHUwMTFlXDFcMFwxMFx1MDExZVwxXHUwMTk5IisKLSAgICAiXDJcdTAxMWVcMVx1MDE5OVwyXHUwMTFlXDFcdTAxOTlcMTBcdTAxMWVcMVx1MDE5OVw0XHUwMTFlXDFcdTAxOTkiKwotICAgICJcN1x1MDExZVwxXDBcMVx1MDE5YVwxXHUwMTIxXDFcdTAxNDlcMVx1MDEyMVwxXHUwMTQ2XDFcdTAxMjEiKwotICAgICJcMVx1MDE5YVwyN1x1MDEyMVwxXHUwMTlhXDJcdTAxMjFcMVx1MDE5YVwyXHUwMTIxXDFcdTAxOWFcMTBcdTAxMjEiKwotICAgICJcMVx1MDE5YVw0XHUwMTIxXDFcdTAxOWFcN1x1MDEyMVwxXDBcMVx1MDE5YlwxXHUwMTIyXDFcdTAxNGEiKwotICAgICJcM1x1MDEyMlwxXHUwMTliXDFcdTAxNDZcMjZcdTAxMjJcMVx1MDE5YlwyXHUwMTIyXDFcdTAxOWJcMlx1MDEyMiIrCi0gICAgIlwxXHUwMTliXDEwXHUwMTIyXDFcdTAxOWJcNFx1MDEyMlwxXHUwMTliXDdcdTAxMjJcNjVcMFwxXHUwMTljIisKLSAgICAiXDUyXDBcMlx1MDE5ZFwyNVwwXDFcdTAxOWVcMVwzNDFcMVwzNDJcMVwzNDFcMVwwIisKLSAgICAiXDFcMzQxXDFcdTAxOWVcMVwwXDFcMzQxXDFcdTAxMDNcMVwzNDFcM1wwXDJcMzQxIisKLSAgICAiXDJcMFwzXDM0MVwxXDBcMVwzNDFcN1wwXDFcdTAxOWVcMlwzNDFcMVx1MDE5ZSIrCi0gICAgIlwyXDM0MVwxXHUwMTllXDJcMzQxXDFcMFw0XDM0MVwxXDBcMVx1MDE5ZVwxXDM0MSIrCi0gICAgIlwxXDBcMVwzNDFcMVwwXDFcdTAxOWVcMlwzNDFcNlwwXDFcdTAxOWZcMVx1MDEwYSIrCi0gICAgIlwxXHUwMTBiXDFcdTAxMGFcMVwwXDFcdTAxMGFcMVx1MDE5ZlwxXDBcMVx1MDEwYVwxXHUwMTBlIisKLSAgICAiXDEzXHUwMTBhXDFcMFwxMFx1MDEwYVwxXHUwMTlmXDJcdTAxMGFcMVx1MDE5ZlwyXHUwMTBhXDFcdTAxOWYiKwotICAgICJcMTBcdTAxMGFcMVx1MDE5Zlw0XHUwMTBhXDFcdTAxOWZcN1x1MDEwYVwxXDBcMVx1MDFhMFwxXHUwMTBjIisKLSAgICAiXDFcdTAxMzVcMVx1MDEwY1wxXHUwMTMyXDFcdTAxMGNcMVx1MDFhMFwyN1x1MDEwY1wxXHUwMWEwXDJcdTAxMGMiKwotICAgICJcMVx1MDFhMFwyXHUwMTBjXDFcdTAxYTBcMTBcdTAxMGNcMVx1MDFhMFw0XHUwMTBjXDFcdTAxYTBcN1x1MDEwYyIrCi0gICAgIlwxXDBcMVx1MDFhMVwxXHUwMTBkXDFcdTAxMzZcM1x1MDEwZFwxXHUwMWExXDFcdTAxMzJcMjZcdTAxMGQiKwotICAgICJcMVx1MDFhMVwyXHUwMTBkXDFcdTAxYTFcMlx1MDEwZFwxXHUwMWExXDEwXHUwMTBkXDFcdTAxYTFcNFx1MDEwZCIrCi0gICAgIlwxXHUwMWExXDdcdTAxMGRcMVwwXDFcdTAxYTJcNVwwXDFcdTAxYTJcMTFcMFwxXHUwMWEyIisKLSAgICAiXDVcMFwxXHUwMWEyXDdcMFwyXHUwMWEyXDFcMFwyXHUwMWEyXDFcMFwyXHUwMWEyIisKLSAgICAiXDdcMFwyXHUwMWEyXDNcMFwyXHUwMWEyXDdcMFwxXHUwMWEzXDFcdTAxMWVcMVx1MDExZiIrCi0gICAgIlwxXHUwMTFlXDFcMFwxXHUwMTFlXDFcdTAxYTNcMVwwXDFcdTAxMWVcMVx1MDEyM1wxM1x1MDExZSIrCi0gICAgIlwxXDBcMTBcdTAxMWVcMVx1MDFhM1wyXHUwMTFlXDFcdTAxYTNcMlx1MDExZVwxXHUwMWEzXDEwXHUwMTFlIisKLSAgICAiXDFcdTAxYTNcNFx1MDExZVwxXHUwMWEzXDdcdTAxMWVcMVwwXDFcdTAxYTRcMVx1MDEyMVwxXHUwMTQ5IisKLSAgICAiXDFcdTAxMjFcMVx1MDE0NlwxXHUwMTIxXDFcdTAxYTRcMjdcdTAxMjFcMVx1MDFhNFwyXHUwMTIxXDFcdTAxYTQiKwotICAgICJcMlx1MDEyMVwxXHUwMWE0XDEwXHUwMTIxXDFcdTAxYTRcNFx1MDEyMVwxXHUwMWE0XDdcdTAxMjFcMVwwIisKLSAgICAiXDFcdTAxYTVcMVx1MDEyMlwxXHUwMTRhXDNcdTAxMjJcMVx1MDFhNVwxXHUwMTQ2XDI2XHUwMTIyXDFcdTAxYTUiKwotICAgICJcMlx1MDEyMlwxXHUwMWE1XDJcdTAxMjJcMVx1MDFhNVwxMFx1MDEyMlwxXHUwMWE1XDRcdTAxMjJcMVx1MDFhNSIrCi0gICAgIlw3XHUwMTIyXDQ3XDBcMVx1MDFhNlwyNFwwXDJcMzQxXDFcMzQyXDFcMzQxXDFcMCIrCi0gICAgIlwyXDM0MVwxXDBcMVwzNDFcMVx1MDEwM1wxXDM0MVwzXDBcMlwzNDFcMlwwIisKLSAgICAiXDNcMzQxXDFcMFwxXDM0MVw3XDBcMTFcMzQxXDFcMFw0XDM0MVwxXDAiKwotICAgICJcMlwzNDFcMVwwXDFcMzQxXDFcMFwzXDM0MVw2XDBcMVx1MDFhN1wxXHUwMTBhIisKLSAgICAiXDFcdTAxMGJcMVx1MDEwYVwxXDBcMVx1MDEwYVwxXHUwMWE3XDFcMFwxXHUwMTBhXDFcdTAxMGUiKwotICAgICJcMTNcdTAxMGFcMVwwXDEwXHUwMTBhXDFcdTAxYTdcMlx1MDEwYVwxXHUwMWE3XDJcdTAxMGFcMVx1MDFhNyIrCi0gICAgIlwxMFx1MDEwYVwxXHUwMWE3XDRcdTAxMGFcMVx1MDFhN1w3XHUwMTBhXDFcMFwxXHUwMWE4XDFcdTAxMGMiKwotICAgICJcMVx1MDEzNVwxXHUwMTBjXDFcdTAxMzJcMVx1MDEwY1wxXHUwMWE4XDI3XHUwMTBjXDFcdTAxYThcMlx1MDEwYyIrCi0gICAgIlwxXHUwMWE4XDJcdTAxMGNcMVx1MDFhOFwxMFx1MDEwY1wxXHUwMWE4XDRcdTAxMGNcMVx1MDFhOFw3XHUwMTBjIisKLSAgICAiXDFcMFwxXHUwMWE5XDFcdTAxMGRcMVx1MDEzNlwzXHUwMTBkXDFcdTAxYTlcMVx1MDEzMlwyNlx1MDEwZCIrCi0gICAgIlwxXHUwMWE5XDJcdTAxMGRcMVx1MDFhOVwyXHUwMTBkXDFcdTAxYTlcMTBcdTAxMGRcMVx1MDFhOVw0XHUwMTBkIisKLSAgICAiXDFcdTAxYTlcN1x1MDEwZFwxXDBcMVx1MDFhYVwxXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDAiKwotICAgICJcMVx1MDExZVwxXHUwMWFhXDFcMFwxXHUwMTFlXDFcdTAxMjNcMTNcdTAxMWVcMVwwXDEwXHUwMTFlIisKLSAgICAiXDFcdTAxYWFcMlx1MDExZVwxXHUwMWFhXDJcdTAxMWVcMVx1MDFhYVwxMFx1MDExZVwxXHUwMWFhXDRcdTAxMWUiKwotICAgICJcMVx1MDFhYVw3XHUwMTFlXDFcMFwxXHUwMWFiXDFcdTAxMjFcMVx1MDE0OVwxXHUwMTIxXDFcdTAxNDYiKwotICAgICJcMVx1MDEyMVwxXHUwMWFiXDI3XHUwMTIxXDFcdTAxYWJcMlx1MDEyMVwxXHUwMWFiXDJcdTAxMjFcMVx1MDFhYiIrCi0gICAgIlwxMFx1MDEyMVwxXHUwMWFiXDRcdTAxMjFcMVx1MDFhYlw3XHUwMTIxXDFcMFwxXHUwMWFjXDFcdTAxMjIiKwotICAgICJcMVx1MDE0YVwzXHUwMTIyXDFcdTAxYWNcMVx1MDE0NlwyNlx1MDEyMlwxXHUwMWFjXDJcdTAxMjJcMVx1MDFhYyIrCi0gICAgIlwyXHUwMTIyXDFcdTAxYWNcMTBcdTAxMjJcMVx1MDFhY1w0XHUwMTIyXDFcdTAxYWNcN1x1MDEyMlwxXDAiKwotICAgICJcMlx1MDEwYVwxXHUwMTBiXDFcdTAxMGFcMVwwXDJcdTAxMGFcMVwwXDFcdTAxMGFcMVx1MDEwZSIrCi0gICAgIlwxM1x1MDEwYVwxXDBcNDRcdTAxMGFcMVwwXDFcdTAxYWRcMVx1MDEwY1wxXHUwMTM1XDFcdTAxMGMiKwotICAgICJcMVx1MDEzMlwxXHUwMTBjXDFcdTAxYWRcMjdcdTAxMGNcMVx1MDFhZFwyXHUwMTBjXDFcdTAxYWRcMlx1MDEwYyIrCi0gICAgIlwxXHUwMWFkXDEwXHUwMTBjXDFcdTAxYWRcNFx1MDEwY1wxXHUwMWFkXDdcdTAxMGNcMVwwXDFcdTAxYWUiKwotICAgICJcMVx1MDEwZFwxXHUwMTM2XDNcdTAxMGRcMVx1MDFhZVwxXHUwMTMyXDI2XHUwMTBkXDFcdTAxYWVcMlx1MDEwZCIrCi0gICAgIlwxXHUwMWFlXDJcdTAxMGRcMVx1MDFhZVwxMFx1MDEwZFwxXHUwMWFlXDRcdTAxMGRcMVx1MDFhZVw3XHUwMTBkIisKLSAgICAiXDFcMFwyXHUwMTFlXDFcdTAxMWZcMVx1MDExZVwxXDBcMlx1MDExZVwxXDBcMVx1MDExZSIrCi0gICAgIlwxXHUwMTIzXDEzXHUwMTFlXDFcMFw0NFx1MDExZVwxXDBcMVx1MDFhZlwxXHUwMTIxXDFcdTAxNDkiKwotICAgICJcMVx1MDEyMVwxXHUwMTQ2XDFcdTAxMjFcMVx1MDFhZlwyN1x1MDEyMVwxXHUwMWFmXDJcdTAxMjFcMVx1MDFhZiIrCi0gICAgIlwyXHUwMTIxXDFcdTAxYWZcMTBcdTAxMjFcMVx1MDFhZlw0XHUwMTIxXDFcdTAxYWZcN1x1MDEyMVwxXDAiKwotICAgICJcMVx1MDFiMFwxXHUwMTIyXDFcdTAxNGFcM1x1MDEyMlwxXHUwMWIwXDFcdTAxNDZcMjZcdTAxMjJcMVx1MDFiMCIrCi0gICAgIlwyXHUwMTIyXDFcdTAxYjBcMlx1MDEyMlwxXHUwMWIwXDEwXHUwMTIyXDFcdTAxYjBcNFx1MDEyMlwxXHUwMWIwIisKLSAgICAiXDdcdTAxMjJcMVwwXDJcdTAxMGNcMVx1MDEzNVwxXHUwMTBjXDFcdTAxMzJcNjVcdTAxMGNcMVwwIisKLSAgICAiXDJcdTAxMGRcMVx1MDEzNlw0XHUwMTBkXDFcdTAxMzJcNjJcdTAxMGRcMVwwXDJcdTAxMjFcMVx1MDE0OSIrCi0gICAgIlwxXHUwMTIxXDFcdTAxNDZcNjVcdTAxMjFcMVwwXDJcdTAxMjJcMVx1MDE0YVw0XHUwMTIyXDFcdTAxNDYiKwotICAgICJcNjJcdTAxMjIiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsICAxLCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDksICAxLCAgMSwgIDEsICA5LCAgMSwgIDMsICA5LCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDMsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAgMCwgIDEsICAxLCAxMywgIDcsICAwLCAKLSAgICAgMSwgIDEsICAwLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgCi0gICAgIDksICAwLCAgOSwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMCwgMTMsICA3LCAgMSwgIDksICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsIAotICAgICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgCi0gICAgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksIAotICAgICAwLCAgMCwgIDksICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDksICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgOSwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgIDksICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMSwgIDAsIAotICAgICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMAotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOREVGSU5FRCA9ICJ1bmRlZmluZWQiOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0OwotLy8JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkVGV4dExlbmd0aDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGg7Ci0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsKLQlwcml2YXRlIENTU1RleHRSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gQ1NTVGV4dFJlZ2lvbkZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKLQlwcml2YXRlIGludCBmSW5pdGlhbFN0YXRlID0gWVlJTklUSUFMOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0OwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX1NNQUxMID0gMjU2OwotCXByaXZhdGUgaW50IGZJbml0aWFsQnVmZmVyU2l6ZSA9IEJVRkZFUl9TSVpFX05PUk1BTDsKLQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxTdGF0ZShpbnQgc3RhdGUpIHsKLQkJZkluaXRpYWxTdGF0ZSA9IHN0YXRlOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsQnVmZmVyU2l6ZShpbnQgc2l6ZSkgewotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRleHQ7Ci0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOwotCQlib29sZWFuIHNwYWNlRm9sbG93czsKLS8vCQlTdHJpbmdCdWZmZXIgdGV4dDsKLQkJaW50IHN0YXJ0OwotCQlpbnQgdGV4dExlbmd0aDsKLQkJaW50IGxlbmd0aDsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgewotCQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0vLwkJCXRleHQgPSBmQnVmZmVyZWRUZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOwotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjb250ZXh0ICE9IG51bGwpIHsKLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgewotCQkJCS8vIHVuZGVmIC0+IGNvbmNhdGVuYXRlIHVuZGVmJ3MKLQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgewotLy8JCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJdGV4dExlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCX0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsKLS8vCQkJCWZCdWZmZXJlZFRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKHl5dGV4dCgpKTsKLQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQkJfSBlbHNlIHsKLQkJCQluZXh0VG9rZW5UeXBlID0gbnVsbDsKLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsKLQkJCQlpZiAoQ1NTUmVnaW9uVXRpbC5pc0RlY2xhcmF0aW9uVmFsdWVUeXBlKGNvbnRleHQpKSB7IC8vIGRlY2xhcmF0aW9uIHZhbHVlIGNhbiBjb250YWluIFZBTFVFX1MKLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOwotCQkJCX0gZWxzZSBpZiAoY2FuQ29udGFpblNwYWNlKGNvbnRleHQpKSB7Ci0JCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsKLQkJCQl9Ci0JCQkJaWYgKG5leHRUb2tlblR5cGUgIT0gbnVsbCkgeyAvLyBuZXh0VG9rZW4gaXMgcmV0cmlldmVkCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsKLQkJCQkJCS8vIG5leHQgaXMgc3BhY2UgLT4gYXBwZW5kCi0vLwkJCQkJCXRleHQuYXBwZW5kKHl5dGV4dCgpKTsKLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOwotCQkJCQl9IGVsc2UgewotCQkJCQkJLy8gbmV4dCBpcyBOT1Qgc3BhY2UgLT4gcHVzaCB0aGlzIGZvciBuZXh0IHRpbWUsIHJldHVybiBpdHNlbGYKLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOwotLy8JCQkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7Ci0JCQkJCQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0JCQlpZiAoY29udGV4dCA9PSBVTkRFRklORUQpIHsKLQkJCQljb250ZXh0ID0gQ1NTX1VOS05PV047Ci0JCQl9Ci0JCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLSAgCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JLyogZm9yIHN0YW5kYWxvbmUgdXNlICovCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAJCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOwotCQlmb3IgKFN0cmluZyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpOyBraW5kICE9IG51bGw7IGtpbmQgPSBwcmltR2V0TmV4dFRva2VuKCkpIHsKLQkJCXRva2VuID0gbmV3IENTU1RleHRUb2tlbigpOwotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJCi0JCQl0b2tlbi5zdGFydCA9IHl5Y2hhcjsKLQkJCXRva2VuLmxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOwotCQkJdG9rZW5zLmFkZCh0b2tlbik7Ci0JCX0KLQotICAJCXJldHVybiB0b2tlbnM7Ci0gIAl9Ci0gIAkKLSAgCS8qIHVzZXIgbWV0aG9kICovCi0gIAlwcml2YXRlIGJvb2xlYW4gY2FuQ29udGFpblNwYWNlKFN0cmluZyB0eXBlKSB7Ci0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7Ci0gIAkJCXJldHVybiBmYWxzZTsKLSAgCQl9IGVsc2UgewotICAJCQlyZXR1cm4gdHJ1ZTsKLSAgCQl9Ci0gIAl9Ci0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4geXljaGFyOwotCX0KLQkKLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCi0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLwotCQl5eV9yZWFkZXIgPSBpbjsKLQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotCQl5eV9zdGF0ZSA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IGZJbml0aWFsU3RhdGU7IC8vWVlJTklUSUFMOwotCi0JCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQkJaWYgKHl5X2J1ZmZlci5sZW5ndGggIT0gZkluaXRpYWxCdWZmZXJTaXplKSB7Ci0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOwotCQl9Ci0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCi0JCS8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0KLQkJLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQotCQkvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0KLQkJLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCQkJZnJvbSBpbnB1dCAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQotCQkvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5bGluZSA9IDA7Ci0KLQkJLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCi0JCS8qKgotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0JCSAqIG1hdGNoZWQgdGV4dAotCQkgKi8KLQkJeXljb2x1bW4gPSAwOyAKLQotCQkvKiogCi0JCSAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotCQkgKi8KLQkJeXlfYXRCT0wgPSBmYWxzZTsKLQkJCi0JCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8KLQkJLy8JCWZVbmRlZmluZWQuZGVsZXRlKDAsIGZVbmRlZmluZWQubGVuZ3RoKCkpOwotCX0KLQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIENTU1Rva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBDU1NUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgQ1NTVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzIxMDA0XTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzkwNikgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE3MCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCBjaGFyYWN0ZXIgb2YgdGhlIGlucHV0IHN0cmVhbSwgRU9GIGlmIHRoZQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLQotICAgIC8qIGlmIHRoZSBlb2YgaXMgcmVhY2hlZCwgd2UgZG9uJ3QgbmVlZCB0byB3b3JrIGhhcmQgKi8gCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICAvKiBvdGhlcndpc2U6IG5lZWQgdG8gcmVmaWxsIHRoZSBidWZmZXIgKi8KLQotICAgIC8qIGZpcnN0OiBtYWtlIHJvb20gKGlmIHlvdSBjYW4pICovCi0gICAgaWYgKHl5X3N0YXJ0UmVhZCA+IDApIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIsIDAsIAotICAgICAgICAgICAgICAgICAgICAgICB5eV9lbmRSZWFkLXl5X3N0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB5eV9lbmRSZWFkLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X21hcmtlZFBvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3B1c2hiYWNrUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfc3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPj0geXlfYnVmZmVyLmxlbmd0aCkgewotICAgICAgLyogaWYgbm90OiBibG93IGl0IHVwICovCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCAwLCBuZXdCdWZmZXIsIDAsIHl5X2J1ZmZlci5sZW5ndGgpOwotICAgICAgeXlfYnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLmxlbmd0aC15eV9lbmRSZWFkKTsKLQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsKLQotICAgIHl5X2VuZFJlYWQrPSBudW1SZWFkOwotCi0gICAgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotICB9Ci0KLQotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZy4KLSAgICoKLSAgICogQHBhcmFtICAgZXJyb3JDb2RlICB0aGUgY29kZSBvZiB0aGUgZXJyb3JtZXNzYWdlIHRvIGRpc3BsYXkKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9TY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIHRyeSB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOwotICAgIH0KLSAgICBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOwotICAgIH0KLQotICAgIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcHJpbUdldE5leHRUb2tlbigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICBpbnQgeXlfaW5wdXQ7Ci0gICAgaW50IHl5X2FjdGlvbjsKLQotICAgIHl5X3B1c2hiYWNrUG9zID0gLTE7Ci0gICAgYm9vbGVhbiB5eV93YXNfcHVzaGJhY2s7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotICAgICAgeXlfd2FzX3B1c2hiYWNrID0gZmFsc2U7Ci0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICAgICAgeXlfaW5wdXQgPSB5eV9hZHZhbmNlKCk7Ci0KLSAgICAgICAgICBpZiAoIHl5X2lucHV0ID09IFlZRU9GICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotCi0gICAgICAgICAgaW50IHl5X25leHQgPSB5eXRyYW5zWyB5eV9yb3dNYXBbeXlfc3RhdGVdICsgeXljbWFwW3l5X2lucHV0XSBdOwotICAgICAgICAgIGlmICh5eV9uZXh0ID09IC0xKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgeXlfc3RhdGUgPSB5eV9uZXh0OwotCi0gICAgICAgICAgaW50IHl5X2F0dHJpYnV0ZXMgPSBZWV9BVFRSSUJVVEVbeXlfc3RhdGVdOwotICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiAyKSA+IDAgKQotICAgICAgICAgICAgeXlfcHVzaGJhY2tQb3MgPSB5eV9jdXJyZW50UG9zOwotCi0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X3dhc19wdXNoYmFjayA9ICh5eV9hdHRyaWJ1dGVzICYgNCkgPiAwOwotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV93YXNfcHVzaGJhY2spCi0gICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X3B1c2hiYWNrUG9zOwotCi0gICAgICBzd2l0Y2ggKHl5X2FjdGlvbikgeyAgICAKLQotICAgICAgICBjYXNlIDQyMTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSU1QT1JUQU5UOyAgfQotICAgICAgICBjYXNlIDQzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDEyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0ZPTlRfRkFDRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX0ZPTlRfRkFDRTsgIH0KLSAgICAgICAgY2FzZSA0MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM3NTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7ICB9Ci0gICAgICAgIGNhc2UgNDM1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyAgfQotICAgICAgICBjYXNlIDQzNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjk3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUE7ICB9Ci0gICAgICAgIGNhc2UgNDM3OiBicmVhazsKLSAgICAgICAgY2FzZSAyOTA6IAotICAgICAgICBjYXNlIDMyNzogCi0gICAgICAgIGNhc2UgMzk4OiAKLSAgICAgICAgY2FzZSA0MDA6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VSSTsgIH0KLSAgICAgICAgY2FzZSA0Mzg6IGJyZWFrOwotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgIGNhc2UgMzA3OiAKLSAgICAgICAgY2FzZSAzODU6IAotICAgICAgICBjYXNlIDM4NzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7ICB9Ci0gICAgICAgIGNhc2UgNDM5OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsgIH0KLSAgICAgICAgY2FzZSA0NDA6IGJyZWFrOwotICAgICAgICBjYXNlIDIxODogCi0gICAgICAgICAgeyAgcmV0dXJuIENTU19DT01NRU5UOyAgfQotICAgICAgICBjYXNlIDQ0MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjE3OiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX0NETzsgIH0KLSAgICAgICAgY2FzZSA0NDI6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMTogCi0gICAgICAgIGNhc2UgMjQ1OiAKLSAgICAgICAgY2FzZSAyODM6IAotICAgICAgICBjYXNlIDI4NDogCi0gICAgICAgIGNhc2UgMzIzOiAKLSAgICAgICAgY2FzZSAzMjQ6IAotICAgICAgICBjYXNlIDM2MzogCi0gICAgICAgIGNhc2UgMzY0OiAKLSAgICAgICAgY2FzZSAzOTQ6IAotICAgICAgICBjYXNlIDM5NTogCi0gICAgICAgIGNhc2UgNDA3OiAKLSAgICAgICAgY2FzZSA0MTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1VOSUNPREVfUkFOR0U7ICB9Ci0gICAgICAgIGNhc2UgNDQzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICAgIHsgIHJldHVybiBDU1NfQ0RDOyAgfQotICAgICAgICBjYXNlIDQ0NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYyOiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7ICB9Ci0gICAgICAgIGNhc2UgNDQ1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTY6IAotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgIGNhc2UgMjQ0OiAKLSAgICAgICAgY2FzZSAyODI6IAotICAgICAgICBjYXNlIDMyMjogCi0gICAgICAgIGNhc2UgMzYyOiAKLSAgICAgICAgY2FzZSAzOTM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7ICB9Ci0gICAgICAgIGNhc2UgNDQ2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9TVFJJTkc7ICB9Ci0gICAgICAgIGNhc2UgNDQ3OiBicmVhazsKLSAgICAgICAgY2FzZSA1NzogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAxOTM6IAotICAgICAgICBjYXNlIDIzNTogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgY2FzZSAzMTM6IAotICAgICAgICBjYXNlIDM1MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyAgfQotICAgICAgICBjYXNlIDQ0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0NDk6IGJyZWFrOwotICAgICAgICBjYXNlIDU1OiAKLSAgICAgICAgY2FzZSAxMjU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NPTUJJTkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDUwOiBicmVhazsKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyAgfQotICAgICAgICBjYXNlIDQ1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDk6IAotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSAxMjM6IAotICAgICAgICBjYXNlIDEyNDogCi0gICAgICAgIGNhc2UgMTkyOiAKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICBjYXNlIDI3MjogCi0gICAgICAgIGNhc2UgMzEyOiAKLSAgICAgICAgY2FzZSAzNTI6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfUEFHRV9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1BBR0VfU0VMRUNUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDUyOiBicmVhazsKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgIH0KLSAgICAgICAgY2FzZSA0NTM6IGJyZWFrOwotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ1NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDQ6IAotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgY2FzZSAyMzM6IAotICAgICAgICBjYXNlIDI3MTogCi0gICAgICAgIGNhc2UgMzExOiAKLSAgICAgICAgY2FzZSAzNTE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfTUVESUFfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07ICB9Ci0gICAgICAgIGNhc2UgNDU1OiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19NRURJQV9TRVBBUkFUT1I7ICB9Ci0gICAgICAgIGNhc2UgNDU2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjM6IAotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgIGNhc2UgMTY0OiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDI0OTogCi0gICAgICAgIGNhc2UgMjkyOiAKLSAgICAgICAgY2FzZSAzMzE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0VMRU1FTlRfTkFNRTsgIH0KLSAgICAgICAgY2FzZSA0NTc6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDEyNjogCi0gICAgICAgIGNhc2UgMTYzOiAKLSAgICAgICAgICB7ICByZXR1cm4gQ1NTX1M7ICB9Ci0gICAgICAgIGNhc2UgNDU4OiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgICAgeyAgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgIH0KLSAgICAgICAgY2FzZSA0NTk6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7ICB9Ci0gICAgICAgIGNhc2UgNDYwOiBicmVhazsKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOyAgfQotICAgICAgICBjYXNlIDQ2MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7ICB9Ci0gICAgICAgIGNhc2UgNDYyOiBicmVhazsKLSAgICAgICAgY2FzZSA0MDogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgIGNhc2UgMTE4OiAKLSAgICAgICAgY2FzZSAxOTA6IAotICAgICAgICBjYXNlIDIzMjogCi0gICAgICAgIGNhc2UgMjcwOiAKLSAgICAgICAgY2FzZSAzMTA6IAotICAgICAgICBjYXNlIDM1MDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9JTVBPUlRfREVMSU1JVEVSKTsgcmV0dXJuIENTU19NRURJVU07ICB9Ci0gICAgICAgIGNhc2UgNDYzOiBicmVhazsKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfVkFMVUUpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9PUEVSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0NjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyAgfQotICAgICAgICBjYXNlIDQ2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSAxMzE6IAotICAgICAgICBjYXNlIDEzNDogCi0gICAgICAgIGNhc2UgMTM3OiAKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgY2FzZSAyMzY6IAotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgIGNhc2UgMzE0OiAKLSAgICAgICAgY2FzZSAzNTQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORCk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFOyAgfQotICAgICAgICBjYXNlIDQ2NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgY2FzZSAxMzk6IAotICAgICAgICBjYXNlIDE0MDogCi0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgY2FzZSAyMzk6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgIGNhc2UgMzE3OiAKLSAgICAgICAgY2FzZSAzNTc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9QUk9QRVJUWTsgIH0KLSAgICAgICAgY2FzZSA0Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9ERUxJTUlURVI7ICB9Ci0gICAgICAgIGNhc2UgNDY4OiBicmVhazsKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUjsgIH0KLSAgICAgICAgY2FzZSA0Njk6IGJyZWFrOwotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX05VTUJFUjsgIH0KLSAgICAgICAgY2FzZSA0NzA6IGJyZWFrOwotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODM6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMTUzOiAKLSAgICAgICAgY2FzZSAxNTQ6IAotICAgICAgICBjYXNlIDE1OTogCi0gICAgICAgIGNhc2UgMjAzOiAKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICBjYXNlIDI0MTogCi0gICAgICAgIGNhc2UgMjc5OiAKLSAgICAgICAgY2FzZSAzMTk6IAotICAgICAgICBjYXNlIDM1OTogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7ICB9Ci0gICAgICAgIGNhc2UgNDcxOiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfUEFSRU5USEVTSVNfQ0xPU0U7ICB9Ci0gICAgICAgIGNhc2UgNDcyOiBicmVhazsKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX09QRVJBVE9SOyAgfQotICAgICAgICBjYXNlIDQ3MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyNTA6IAotICAgICAgICBjYXNlIDI5MzogCi0gICAgICAgIGNhc2UgMzMyOiAKLSAgICAgICAgY2FzZSAzNzM6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0NMQVNTOyAgfQotICAgICAgICBjYXNlIDQ3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDE2NzogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgY2FzZSAyNTE6IAotICAgICAgICBjYXNlIDI5NDogCi0gICAgICAgIGNhc2UgMzMzOiAKLSAgICAgICAgY2FzZSAzNzQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0lEOyAgfQotICAgICAgICBjYXNlIDQ3NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICBjYXNlIDIyNjogCi0gICAgICAgIGNhc2UgMjU4OiAKLSAgICAgICAgY2FzZSAyNjA6IAotICAgICAgICBjYXNlIDMwMDogCi0gICAgICAgIGNhc2UgMzM4OiAKLSAgICAgICAgY2FzZSAzNzg6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfU0VMRUNUT1JfTU9ESUZJRVIpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1BTRVVETzsgIH0KLSAgICAgICAgY2FzZSA0NzY6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNjogCi0gICAgICAgIGNhc2UgMTc4OiAKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfQ0hBUlNFVF9ERUxJTUlURVIpOyByZXR1cm4gQ1NTX1NUUklORzsgIH0KLSAgICAgICAgY2FzZSA0Nzc6IGJyZWFrOwotICAgICAgICBjYXNlIDExMjogCi0gICAgICAgIGNhc2UgMTg0OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyAgfQotICAgICAgICBjYXNlIDQ3ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQxOiAKLSAgICAgICAgY2FzZSAyMDI6IAotICAgICAgICBjYXNlIDI0MDogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAzMTg6IAotICAgICAgICBjYXNlIDM1ODogCi0gICAgICAgIGNhc2UgMzkwOiAKLSAgICAgICAgICB7ICB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9ESU1FTlNJT047ICB9Ci0gICAgICAgIGNhc2UgNDc5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNDQ6IAotICAgICAgICAgIHsgIHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BFUkNFTlRBR0U7ICB9Ci0gICAgICAgIGNhc2UgNDgwOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDI0NzogCi0gICAgICAgICAgeyAgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfRlVOQ1RJT047ICB9Ci0gICAgICAgIGNhc2UgNDgxOiBicmVhazsKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDI0OiAKLSAgICAgICAgY2FzZSAyNTogCi0gICAgICAgIGNhc2UgMjY6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAzMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzU6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQxOiAKLSAgICAgICAgY2FzZSA0NTogCi0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDUzOiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgIGNhc2UgNjY6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgY2FzZSA4NDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gVU5ERUZJTkVEOwotIH0KLSAgICAgICAgY2FzZSA0ODI6IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiAKLSAgICAgICAgICBpZiAoeXlfaW5wdXQgPT0gWVlFT0YgJiYgeXlfc3RhcnRSZWFkID09IHl5X2N1cnJlbnRQb3MpIHsKLSAgICAgICAgICAgIHl5X2F0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotICAvKioKLSAgICogUnVucyB0aGUgc2Nhbm5lciBvbiBpbnB1dCBmaWxlcy4KLSAgICoKLSAgICogVGhpcyBtYWluIG1ldGhvZCBpcyB0aGUgZGVidWdnaW5nIHJvdXRpbmUgZm9yIHRoZSBzY2FubmVyLgotICAgKiBJdCBwcmludHMgZWFjaCByZXR1cm5lZCB0b2tlbiB0byBTeXN0ZW0ub3V0IHVudGlsIHRoZSBlbmQgb2YKLSAgICogZmlsZSBpcyByZWFjaGVkLCBvciBhbiBlcnJvciBvY2N1cmVkLgotICAgKgotICAgKiBAcGFyYW0gYXJndiAgIHRoZSBjb21tYW5kIGxpbmUsIGNvbnRhaW5zIHRoZSBmaWxlbmFtZXMgdG8gcnVuCi0gICAqICAgICAgICAgICAgICAgdGhlIHNjYW5uZXIgb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJndltdKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmd2Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICBDU1NUb2tlbml6ZXIgc2Nhbm5lciA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICBzY2FubmVyID0gbmV3IENTU1Rva2VuaXplciggbmV3IGphdmEuaW8uRmlsZVJlYWRlcihhcmd2W2ldKSApOwotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaWxlIG5vdCBmb3VuZCA6IFwiIithcmd2W2ldKyJcIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBvcGVuaW5nIGZpbGUgXCIiK2FyZ3ZbaV0rIlwiIik7Ci0gICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgfQotICAgICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2UgOiBqYXZhIENTU1Rva2VuaXplciA8aW5wdXRmaWxlPiIpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgZG8gewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihzY2FubmVyLnByaW1HZXROZXh0VG9rZW4oKSk7Ci0gICAgICAgIH0gd2hpbGUgKCFzY2FubmVyLnl5X2F0RU9GKTsKLQotICAgICAgfQotICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFuIEkvTyBlcnJvciBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIDoiKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL0NTU1Rva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY0ODFhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvQ1NTVG9rZW5pemVyLmpmbGV4CisrKyAvZGV2L251bGwKQEAgLTEsNTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLg0KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMNCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjANCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdA0KLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sDQotICogDQotICogQ29udHJpYnV0b3JzOg0KLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24NCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi0vKm5sc1hYWCovDQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUuaW50ZXJuYWwucGFyc2VyOw0KLQ0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsNCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsNCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsNCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7DQotDQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5DU1NUZXh0UmVnaW9uRmFjdG9yeTsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLmludGVybmFsLnBhcnNlcnouQ1NTUmVnaW9uQ29udGV4dHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MuY29yZS5pbnRlcm5hbC5wYXJzZXJ6LkNTU1RleHRUb2tlbjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247DQotDQotJSUNCi0NCi0lcHVibGljDQotJWNsYXNzIENTU1Rva2VuaXplcg0KLSVpbXBsZW1lbnRzIENTU1JlZ2lvbkNvbnRleHRzLCBJQ1NTVG9rZW5pemVyDQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSVsaW5lDQotJXVuaWNvZGUNCi0lY2FzZWxlc3MNCi0lZGVidWcNCi0lcGFjaw0KLQ0KLSV7DQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVTkRFRklORUQgPSAidW5kZWZpbmVkIjsNCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0Ow0KLS8vCXByaXZhdGUgaW50IGZCdWZmZXJlZFRleHRMZW5ndGg7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aDsNCi0vLwlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyZWRUZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBDU1NUZXh0UmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IENTU1RleHRSZWdpb25GYWN0b3J5LmdldEluc3RhbmNlKCk7DQotCXByaXZhdGUgaW50IGZJbml0aWFsU3RhdGUgPSBZWUlOSVRJQUw7DQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEJVRkZFUl9TSVpFX05PUk1BTCA9IDE2Mzg0Ow0KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBCVUZGRVJfU0laRV9TTUFMTCA9IDI1NjsNCi0JcHJpdmF0ZSBpbnQgZkluaXRpYWxCdWZmZXJTaXplID0gQlVGRkVSX1NJWkVfTk9STUFMOw0KLQ0KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsU3RhdGUoaW50IHN0YXRlKSB7DQotCQlmSW5pdGlhbFN0YXRlID0gc3RhdGU7DQotCX0NCi0JDQotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxCdWZmZXJTaXplKGludCBzaXplKSB7DQotCQlmSW5pdGlhbEJ1ZmZlclNpemUgPSBzaXplOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotICAJcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQlTdHJpbmcgY29udGV4dDsNCi0JCVN0cmluZyBuZXh0VG9rZW5UeXBlOw0KLQkJYm9vbGVhbiBzcGFjZUZvbGxvd3M7DQotLy8JCVN0cmluZ0J1ZmZlciB0ZXh0Ow0KLQkJaW50IHN0YXJ0Ow0KLQkJaW50IHRleHRMZW5ndGg7DQotCQlpbnQgbGVuZ3RoOw0KLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgIT0gbnVsbCkgew0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLS8vCQkJdGV4dCA9IGZCdWZmZXJlZFRleHQ7DQotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsNCi0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0gZkJ1ZmZlcmVkTGVuZ3RoOw0KLQ0KLQkJCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQkJfSBlbHNlIHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLS8vCQkJdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCXN0YXJ0ID0geXljaGFyOw0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJfQ0KLQ0KLQkJaWYgKGNvbnRleHQgIT0gbnVsbCkgew0KLQkJCWlmIChjb250ZXh0ID09IFVOREVGSU5FRCkgew0KLQkJCQkvLyB1bmRlZiAtPiBjb25jYXRlbmF0ZSB1bmRlZidzDQotCQkJCW5leHRUb2tlblR5cGUgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCXdoaWxlIChuZXh0VG9rZW5UeXBlID09IFVOREVGSU5FRCkgew0KLS8vCQkJCQl0ZXh0LmFwcGVuZCh5eXRleHQoKSk7DQotCQkJCQl0ZXh0TGVuZ3RoICs9IHl5bGVuZ3RoKCk7DQotCQkJCQlsZW5ndGggPSB0ZXh0TGVuZ3RoOw0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJfQ0KLQkJCQlmQnVmZmVyZWRDb250ZXh0ID0gbmV4dFRva2VuVHlwZTsNCi0vLwkJCQlmQnVmZmVyZWRUZXh0ID0gbmV3IFN0cmluZ0J1ZmZlcih5eXRleHQoKSk7DQotCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCX0gZWxzZSB7DQotCQkJCW5leHRUb2tlblR5cGUgPSBudWxsOw0KLQkJCQlzcGFjZUZvbGxvd3MgPSBmYWxzZTsNCi0JCQkJaWYgKENTU1JlZ2lvblV0aWwuaXNEZWNsYXJhdGlvblZhbHVlVHlwZShjb250ZXh0KSkgeyAvLyBkZWNsYXJhdGlvbiB2YWx1ZSBjYW4gY29udGFpbiBWQUxVRV9TDQotCQkJCQluZXh0VG9rZW5UeXBlID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJc3BhY2VGb2xsb3dzID0gKG5leHRUb2tlblR5cGUgPT0gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1MpOw0KLQkJCQl9IGVsc2UgaWYgKGNhbkNvbnRhaW5TcGFjZShjb250ZXh0KSkgew0KLQkJCQkJbmV4dFRva2VuVHlwZSA9IHByaW1HZXROZXh0VG9rZW4oKTsNCi0JCQkJCXNwYWNlRm9sbG93cyA9IChuZXh0VG9rZW5UeXBlID09IENTU19TKTsNCi0JCQkJfQ0KLQkJCQlpZiAobmV4dFRva2VuVHlwZSAhPSBudWxsKSB7IC8vIG5leHRUb2tlbiBpcyByZXRyaWV2ZWQNCi0JCQkJCWlmIChzcGFjZUZvbGxvd3MpIHsNCi0JCQkJCQkvLyBuZXh0IGlzIHNwYWNlIC0+IGFwcGVuZA0KLS8vCQkJCQkJdGV4dC5hcHBlbmQoeXl0ZXh0KCkpOw0KLQkJCQkJCWxlbmd0aCArPSB5eWxlbmd0aCgpOw0KLQkJCQkJfSBlbHNlIHsNCi0JCQkJCQkvLyBuZXh0IGlzIE5PVCBzcGFjZSAtPiBwdXNoIHRoaXMgZm9yIG5leHQgdGltZSwgcmV0dXJuIGl0c2VsZg0KLQkJCQkJCWZCdWZmZXJlZENvbnRleHQgPSBuZXh0VG9rZW5UeXBlOw0KLS8vCQkJCQkJZkJ1ZmZlcmVkVGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoeXl0ZXh0KCkpOw0KLQkJCQkJCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJCQkJCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCQkJCQl9DQotCQkJCX0NCi0JCQl9DQotCQl9DQotDQotCQlpZiAoY29udGV4dCAhPSBudWxsKSB7DQotCQkJaWYgKGNvbnRleHQgPT0gVU5ERUZJTkVEKSB7DQotCQkJCWNvbnRleHQgPSBDU1NfVU5LTk9XTjsNCi0JCQl9DQotCQkJcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsNCi0JCX0gZWxzZSB7DQotCQkJcmV0dXJuIG51bGw7DQotCQl9DQotICAJfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQkvKiBmb3Igc3RhbmRhbG9uZSB1c2UgKi8NCi0gIAlwdWJsaWMgZmluYWwgTGlzdCBwYXJzZVRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0gIAkJQ1NTVGV4dFRva2VuIHRva2VuOw0KLQkJZm9yIChTdHJpbmcga2luZCA9IHByaW1HZXROZXh0VG9rZW4oKTsga2luZCAhPSBudWxsOyBraW5kID0gcHJpbUdldE5leHRUb2tlbigpKSB7DQotCQkJdG9rZW4gPSBuZXcgQ1NTVGV4dFRva2VuKCk7DQotCQkJdG9rZW4ua2luZCA9IGtpbmQ7ICAJCQkJDQotCQkJdG9rZW4uc3RhcnQgPSB5eWNoYXI7DQotCQkJdG9rZW4ubGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCQl0b2tlbi5pbWFnZSA9IHl5dGV4dCgpOw0KLQkJCXRva2Vucy5hZGQodG9rZW4pOw0KLQkJfQ0KLQ0KLSAgCQlyZXR1cm4gdG9rZW5zOw0KLSAgCX0NCi0gIAkNCi0gIAkvKiB1c2VyIG1ldGhvZCAqLw0KLSAgCXByaXZhdGUgYm9vbGVhbiBjYW5Db250YWluU3BhY2UoU3RyaW5nIHR5cGUpIHsNCi0gIAkJaWYgKHR5cGUgPT0gQ1NTX0RFTElNSVRFUiB8fCB0eXBlID09IENTU19SQlJBQ0UgfHwgdHlwZSA9PSBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSKSB7DQotICAJCQlyZXR1cm4gZmFsc2U7DQotICAJCX0gZWxzZSB7DQotICAJCQlyZXR1cm4gdHJ1ZTsNCi0gIAkJfQ0KLSAgCX0NCi0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIGludCBnZXRPZmZzZXQoKSB7DQotCQlyZXR1cm4geXljaGFyOw0KLQl9DQotCQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsNCi0JCXJldHVybiB5eV9hdEVPRjsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7DQotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOw0KLQl9DQotDQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7DQotCQkvKiogdGhlIGlucHV0IGRldmljZSAqLw0KLQkJeXlfcmVhZGVyID0gaW47DQotDQotCQkvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLQkJeXlfc3RhdGUgPSAwOw0KLQ0KLQkJLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JCXl5X2xleGljYWxfc3RhdGUgPSBmSW5pdGlhbFN0YXRlOyAvL1lZSU5JVElBTDsNCi0NCi0JCS8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovDQotCQlpZiAoeXlfYnVmZmVyLmxlbmd0aCAhPSBmSW5pdGlhbEJ1ZmZlclNpemUpIHsNCi0JCQl5eV9idWZmZXIgPSBuZXcgY2hhcltmSW5pdGlhbEJ1ZmZlclNpemVdOw0KLQkJfQ0KLQkJamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8NCi0JCXl5X21hcmtlZFBvcyA9IDA7DQotDQotCQkvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8NCi0JCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0JCS8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQ0KLQkJLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLw0KLQkJeXlfc3RhcnRSZWFkID0gMDsNCi0NCi0JCS8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JCQlmcm9tIGlucHV0ICovDQotCQl5eV9lbmRSZWFkID0gMDsNCi0NCi0JCS8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5bGluZSA9IDA7DQotDQotCQkvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWNoYXIgPSAwOw0KLQ0KLQkJLyoqDQotCQkgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgDQotCQkgKiBtYXRjaGVkIHRleHQNCi0JCSAqLw0KLS8vCQl5eWNvbHVtbiA9IDA7IA0KLQ0KLQkJLyoqIA0KLQkJICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lDQotCQkgKi8NCi0JCXl5X2F0Qk9MID0gZmFsc2U7DQotCQkNCi0JCS8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovDQotCQl5eV9hdEVPRiA9IGZhbHNlOw0KLQ0KLQkJLyogdXNlciB2YXJpYWJsZXMgKi8NCi0JCS8vCQlmVW5kZWZpbmVkLmRlbGV0ZSgwLCBmVW5kZWZpbmVkLmxlbmd0aCgpKTsNCi0JfQ0KLQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgQ1NTVG9rZW5pemVyKCkgew0KLQkJc3VwZXIoKTsNCi0JfQ0KLQ0KLSV9DQotDQotJXN0YXRlIFNUX0NIQVJTRVRfTkFNRQ0KLSVzdGF0ZSBTVF9DSEFSU0VUX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9JTVBPUlRfVVJJDQotJXN0YXRlIFNUX0lNUE9SVF9NRURJVU0NCi0lc3RhdGUgU1RfSU1QT1JUX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9NRURJQV9NRURJVU0NCi0lc3RhdGUgU1RfTUVESUFfREVMSU1JVEVSDQotJXN0YXRlIFNUX1BBR0VfUFNFVURPX1BBR0UNCi0lc3RhdGUgU1RfUEFHRV9ERUxJTUlURVINCi0lc3RhdGUgU1RfRk9OVF9GQUNFX0RFTElNSVRFUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9NT0RJRklFUg0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1INCi0lc3RhdGUgU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQNCi0lc3RhdGUgU1RfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfREVDTEFSQVRJT05fU0VQQVJBVE9SDQotJXN0YXRlIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRQ0KLSVzdGF0ZSBTVF9ERUNMQVJBVElPTl9WQUxVRQ0KLQ0KLWggPSBbMC05YS1mXQ0KLW5vbmFzY2lpID0gW1x1MDA4MC1cdWZmZmZdDQotdW5pY29kZSA9IFxce2h9ezEsNn1bIFx0XHJcblxmXT8NCi1lc2NhcGUgPSB7dW5pY29kZX18XFxbIC1+XHUwMDgwLVx1ZmZmZl0NCi0NCi0NCi0NCi1ubXN0YXJ0ID0gW19hLXpBLVpdfHtub25hc2NpaX18e2VzY2FwZX0NCi1ubWNoYXIgPSBbX2EtekEtWjAtOS1dfHtub25hc2NpaX18e2VzY2FwZX0NCi1zdHJpbmcxID0gXCIoW1x0ICEjJCUmKC1+XXxcXHtubH18XCd8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCINCi1zdHJpbmcyID0gXCcoW1x0ICEjJCUmKC1+XXxcXHtubH18XCJ8e25vbmFzY2lpfXx7ZXNjYXBlfSkqXCcNCi0NCi1pZGVudCA9IC0/e25tc3RhcnR9e25tY2hhcn0qDQotDQotbmFtZSA9IHtubWNoYXJ9Kw0KLW51bSA9IFsrLV0/KFswLTldK3xbMC05XSoiLiJbMC05XSspDQotc3RyaW5nID0ge3N0cmluZzF9fHtzdHJpbmcyfQ0KLXVybCA9IChbICEjJCUmKi1+XXx7bm9uYXNjaWl9fHtlc2NhcGV9KSoNCi1zID0gWyBcdFxyXG5cZl0NCi13ID0ge3N9Kg0KLW5sID0gXG58XHJcbnxccnxcZg0KLQ0KLS8vcmFuZ2UgPSBcP3sxLDZ9fHtofShcP3swLDV9fHtofShcP3swLDR9fHtofShcP3swLDN9fHtofShcP3swLDJ9fHtofShcPz98e2h9KSkpKSkNCi0NCi1oYXNoID0gIiMie25hbWV9DQotdXJpID0gKCJ1cmwoInt3fXtzdHJpbmd9e3d9IikifCJ1cmwoInt3fXt1cmx9e3d9IikiKQ0KLWZ1bmN0aW9uID0ge2lkZW50fSIoIg0KLXVuaWNvZGVfcmFuZ2UgPSAiVSJcK1swLTlhLWZBLUY/XXsxLDZ9KCItIlswLTlhLWZBLUY/XXsxLDZ9KT8NCi0NCi0lJQ0KLQ0KLS8qDQotICogKioqIGdsb2JhbCAqKioNCi0gKi8NCi0NCi17c30rIHsgcmV0dXJuIENTU19TOyB9DQotIjwhLS0iIHsgcmV0dXJuIENTU19DRE87IH0NCi0iLS0+IiB7IHJldHVybiBDU1NfQ0RDOyB9DQotIn0iIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX1JCUkFDRTsgfQ0KLVwvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLyB7IHJldHVybiBDU1NfQ09NTUVOVDsgfQ0KLQ0KLS8vPFlZSU5JVElBTD4gew0KLS8vCSJAaW1wb3J0IiB7CXl5YmVnaW4oU1RfSU1QT1JUX1VSSSk7IHJldHVybiBDU1NfSU1QT1JUOyB9DQotLy99DQotDQotLyoNCi0gKiAqKiogY2hhcnNldCBydWxlICoqKg0KLSAqIENIQVJTRVRfU1lNIFMqIFNUUklORyBTKiAnOycNCi0gKi8NCi0NCi0iQGNoYXJzZXQiIHsgeXliZWdpbihTVF9DSEFSU0VUX05BTUUpOyByZXR1cm4gQ1NTX0NIQVJTRVQ7IH0NCi0NCi08U1RfQ0hBUlNFVF9OQU1FPiB7DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9DSEFSU0VUX0RFTElNSVRFUik7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotfQ0KLQ0KLTxTVF9DSEFSU0VUX0RFTElNSVRFUj4gew0KLQkiOyIgeyB5eWJlZ2luKFlZSU5JVElBTCk7IHJldHVybiBDU1NfREVMSU1JVEVSOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIGltcG9ydCBydWxlICoqKg0KLSAqIElNUE9SVF9TWU0gUyogW1NUUklOR3xVUkldIFMqIFsgbWVkaXVtIFsgQ09NTUEgUyogbWVkaXVtXSogXT8gJzsnIFMqDQotICovDQotDQotIkBpbXBvcnQiIHsgeXliZWdpbihTVF9JTVBPUlRfVVJJKTsgcmV0dXJuIENTU19JTVBPUlQ7IH0NCi0NCi08U1RfSU1QT1JUX1VSST4gew0KLQl7c3RyaW5nfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfU1RSSU5HOyB9DQotCS8vCSJ1cmwoInt3fXtzdHJpbmd9e3d9IikiIHsgeXliZWdpbihTVF9JTVBPUlRfTUVESVVNKTsgcmV0dXJuIENTU19VUkk7IH0NCi0JLy8JInVybCgie3d9e3VybH17d30iKSIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX1VSSTsgfQ0KLQl7dXJpfSB7IHl5YmVnaW4oU1RfSU1QT1JUX01FRElVTSk7IHJldHVybiBDU1NfVVJJOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9NRURJVU0+IHsNCi0Je2lkZW50fSB7IHl5YmVnaW4oU1RfSU1QT1JUX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotCSI7IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19ERUxJTUlURVI7IH0NCi19DQotDQotPFNUX0lNUE9SVF9ERUxJTUlURVI+IHsNCi0JIjsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0RFTElNSVRFUjsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX0lNUE9SVF9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBX1NFUEFSQVRPUjsgfQ0KLX0NCi0NCi0vKg0KLSAqICoqKiBtZWRpYSBydWxlICoqKg0KLSAqIE1FRElBX1NZTSBTKiBtZWRpdW0gWyBDT01NQSBTKiBtZWRpdW0gXSogTEJSQUNFIFMqIHJ1bGVzZXQqICd9JyBTKg0KLSAqLw0KLQ0KLSJAbWVkaWEiIHsgeXliZWdpbihTVF9NRURJQV9NRURJVU0pOyByZXR1cm4gQ1NTX01FRElBOyB9DQotDQotLyogDQotICogbWVkaXVtDQotICogSURFTlQgUyoNCi0gKi8NCi08U1RfTUVESUFfTUVESVVNPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX01FRElBX0RFTElNSVRFUik7IHJldHVybiBDU1NfTUVESVVNOyB9DQotfQ0KLQ0KLTxTVF9NRURJQV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihZWUlOSVRJQUwpOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLQkiLCIgeyB5eWJlZ2luKFNUX01FRElBX01FRElVTSk7IHJldHVybiBDU1NfTUVESUFfU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLS8qDQotICogKioqIHBhZ2UgcnVsZSAqKg0KLSAqIFBBR0VfU1lNIFMqIHBzZXVkb19wYWdlPyBTKiBMQlJBQ0UgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gXSogJ30nIFMqDQotICovDQotDQotIkBwYWdlIiB7IHl5YmVnaW4oU1RfUEFHRV9QU0VVRE9fUEFHRSk7IHJldHVybiBDU1NfUEFHRTsgfQ0KLSANCi0vKg0KLSAqIHBzZXVkb19wYWdlDQotICogJzonIElERU5UDQotICovDQotDQotPFNUX1BBR0VfUFNFVURPX1BBR0U+IHsNCi0JIjoiP3tpZGVudH0geyB5eWJlZ2luKFNUX1BBR0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19QQUdFX1NFTEVDVE9SOyB9DQotCSJ7IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT04pOyByZXR1cm4gQ1NTX0xCUkFDRTsgfQ0KLX0NCi0NCi08U1RfUEFHRV9ERUxJTUlURVI+IHsNCi0JInsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfTEJSQUNFOyB9DQotfQ0KLQ0KLS8qDQotICogZm9udC1mYWNlDQotICogRk9OVF9GQUNFX1NZTSBTKiAneycgUyogZGVjbGFyYXRpb24gWyAnOycgUyogZGVjbGFyYXRpb24gJyogJ30nIFMqDQotICovDQotDQotIkBmb250LWZhY2UiIHsgeXliZWdpbihTVF9GT05UX0ZBQ0VfREVMSU1JVEVSKTsgcmV0dXJuIENTU19GT05UX0ZBQ0U7IH0NCi0NCi08U1RfRk9OVF9GQUNFX0RFTElNSVRFUj4gew0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBzZWxlY3Rvcg0KLSAqIHNpbXBsZV9zZWxlY3RvciBbIGNvbWJpbmF0b3Igc2ltcGxlX3NlbGVjdG9yIF0qDQotICovDQotDQotLyoNCi0gKiBzaW1wbGVfc2VsZWN0b3INCi0gKiBlbGVtZW50X25hbWUgWyBIQVNIIHwgY2xhc3MgfCBhdHRyaWIgfCBwc2V1ZG8gXSogfCBbIEhBU0ggfCBjbGFzcyB8IGF0dHJpYiB8IHBzZXVkbyBdKw0KLSAqLw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SX01PRElGSUVSLCBTVF9TRUxFQ1RPUj4gew0KLQkiKiIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9VTklWRVJTQUw7IH0NCi0Je2hhc2h9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfSUQ7IH0NCi0vLwkiOiJ7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfUFNFVURPOyB9DQotCSI6IntpZGVudH0oIigie3N9KntpZGVudH17c30qIikiKT8geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9QU0VVRE87IH0NCi0JIi4ie25hbWV9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ0xBU1M7IH0NCi0JIlsiIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRSk7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX1NUQVJUOyB9DQotfQ0KLQ0KLTxZWUlOSVRJQUwsIFNUX1NFTEVDVE9SPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9FTEVNRU5UX05BTUU7IH0NCi19DQotDQotPFNUX1NFTEVDVE9SX01PRElGSUVSPiB7DQotCSIsIiB7IHl5YmVnaW4oU1RfU0VMRUNUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX1NFUEFSQVRPUjsgfQ0KLQkvLyB1c2luZyBMT09LQUhFQUQNCi0Je3N9Ky9bXis+XHtdIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkiKyJ8Ij4iIHsgeXliZWdpbihTVF9TRUxFQ1RPUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQ09NQklOQVRPUjsgfQ0KLQkieyIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OKTsgcmV0dXJuIENTU19MQlJBQ0U7IH0NCi19DQotDQotLyoNCi0gKiBhdHRyaWINCi0gKiAnWycgUyogSURFTlQgUyogWyBbICc9JyB8IElOQ0xVREVTIHwgREFTSE1BVENIIF0gUyogWyBJREVOVCB8IFNUUklORyBdIFMqIF0/ICddJw0KLSAqLw0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfTkFNRT4gew0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1IpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9OQU1FOyB9DQotfQ0KLQ0KLTxTVF9TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I+IHsNCi0JIj0ifCJ+PSJ8Inw9IiB7IHl5YmVnaW4oU1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfT1BFUkFUT1I7IH0NCi0JIl0iIHsgeXliZWdpbihTVF9TRUxFQ1RPUl9NT0RJRklFUik7IHJldHVybiBDU1NfU0VMRUNUT1JfQVRUUklCVVRFX0VORDsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX1ZBTFVFPiB7DQotCXtpZGVudH18e3N0cmluZ30geyB5eWJlZ2luKFNUX1NFTEVDVE9SX0FUVFJJQlVURV9FTkQpOyByZXR1cm4gQ1NTX1NFTEVDVE9SX0FUVFJJQlVURV9WQUxVRTsgfQ0KLX0NCi0NCi08U1RfU0VMRUNUT1JfQVRUUklCVVRFX0VORD4gew0KLQkiXSIgeyB5eWJlZ2luKFNUX1NFTEVDVE9SX01PRElGSUVSKTsgcmV0dXJuIENTU19TRUxFQ1RPUl9BVFRSSUJVVEVfRU5EOyB9DQotfQ0KLQ0KLS8qDQotICogZGVjbGFyYXRpb24NCi0gKiBwcm9wZXJ0eSAnOicgUyogZXhwciBwcmlvPyB8IC8vIGVtcHR5IC8vDQotICovDQotDQotPFNUX0RFQ0xBUkFUSU9OPiB7DQotCXtpZGVudH0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fUFJPUEVSVFk7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1NFUEFSQVRPUj4gew0KLQkiOiIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fU0VQQVJBVE9SOyB9DQotfQ0KLQ0KLTxTVF9ERUNMQVJBVElPTl9QUkVfVkFMVUUsIFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCSIhIntzfSoiaW1wb3J0YW50IiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0lNUE9SVEFOVDsgfQ0KLQkNCi0JDQotCSIpIiB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1BBUkVOVEhFU0lTX0NMT1NFOyB9DQotCQ0KLQkvLyBvcmRlcmVkIGZvbGxvd2luZyB0d28gcnVsZXMgZGVsaWJlcmF0ZWx5LCBzZWUgDQotCS8vICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTI5OTAyDQotCXtudW19e2lkZW50fSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0RJTUVOU0lPTjsgfQ0KLQl7aWRlbnR9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfSURFTlQ7IH0NCi0NCi0NCi0Je251bX0iJSIgeyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9QRVJDRU5UQUdFOyB9DQotCQkNCi0Je251bX0geyB5eWJlZ2luKFNUX0RFQ0xBUkFUSU9OX1ZBTFVFKTsgcmV0dXJuIENTU19ERUNMQVJBVElPTl9WQUxVRV9OVU1CRVI7IH0NCi0JDQotCQ0KLQkNCi0Je2Z1bmN0aW9ufSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0ZVTkNUSU9OOyB9DQotCXtzdHJpbmd9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfU1RSSU5HOyB9DQotCXt1cml9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVVJJOyB9DQotCSIjIntuYW1lfSB7IHl5YmVnaW4oU1RfREVDTEFSQVRJT05fVkFMVUUpOyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX0hBU0g7IH0NCi0Je3VuaWNvZGVfcmFuZ2V9IHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfVU5JQ09ERV9SQU5HRTsgfQ0KLQlbLC9dIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTl9WQUxVRSk7IHJldHVybiBDU1NfREVDTEFSQVRJT05fVkFMVUVfT1BFUkFUT1I7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OX1ZBTFVFPiB7DQotCXtzfSsvW147fV0geyByZXR1cm4gQ1NTX0RFQ0xBUkFUSU9OX1ZBTFVFX1M7IH0NCi19DQotDQotPFNUX0RFQ0xBUkFUSU9OLCBTVF9ERUNMQVJBVElPTl9TRVBBUkFUT1IsIFNUX0RFQ0xBUkFUSU9OX1BSRV9WQUxVRSwgU1RfREVDTEFSQVRJT05fVkFMVUU+IHsNCi0JIjsiIHsgeXliZWdpbihTVF9ERUNMQVJBVElPTik7IHJldHVybiBDU1NfREVDTEFSQVRJT05fREVMSU1JVEVSOyB9DQotCS8vCSJ9IiB7IHl5YmVnaW4oWVlJTklUSUFMKTsgcmV0dXJuIENTU19SQlJBQ0U7IH0NCi19DQotDQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JXC9cKlteKl0qXCorKFteLypdW14qXSpcKispKlwvIHsgcmV0dXJuIENTU19DT01NRU5UOyB9DQotLy8Je3N9KyB7IHJldHVybiBDU1NfUzsgfQ0KLS8vCS4geyByZXR1cm4gVU5ERUZJTkVEOyB9DQotLy99DQotDQotLy88WVlJTklUSUFMLCBTVF9JTVBPUlRfVVJJLCBTVF9JTVBPUlRfTUVESVVNLCBTVF9JTVBPUlRfREVMSU1JVEVSPiB7DQotLy8JW14gXHRcclxuXGZdKyB7IHJldHVybiBDU1NfVU5LTk9XTjsgfQ0KLS8vfQ0KLQ0KLS4gew0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwZmNlNzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1AZWNobyBvZmYNCi1zZXQgUEFUSD0lUEFUSCU7YzpcamRrMS40XGJpbg0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXhcbGliXHNlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIEpTUFRva2VuaXplciAtc2tlbCBza2VsZXRvbi5zZWQNCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIEpGbGV4XGxpYlxzZWQtamZsZXguamFyOy4gSkZsZXguTWFpbiBYTUxUb2tlbml6ZXIgLXNrZWwgc2tlbGV0b24uc2VkDQotcm0gLWYgSlNQVG9rZW5pemVyLmphdmF+IEpTUFRva2VuaXplcn4gWE1MVG9rZW5pemVyLmphdmF+IFhNTFRva2VuaXplcn4NCi1jb3B5IFhNTFRva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXHNlZG1vZGVsXGNvbVxpYm1cc2VkXHBhcnNlclxpbnRlcm5hbA0KLWNvcHkgSlNQVG9rZW5pemVyLmphdmEgLi5cLi5cLi5cLi5cc2VkbW9kZWxcY29tXGlibVxzZWRccGFyc2VyXGludGVybmFsDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvQ1NTVG9rZW5pemVyL2RldmVsL2ZsZXguc2ggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc4NzJmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSMhL2Jpbi9zaA0KLQ0KLUpBVkFESVI9QzovQXBwL0lCTS9KYXZhMTQxL2Jpbg0KLUpBVkFPUFQ9LVhteDQ3MDAwMDAwMA0KLUNMQVNTUEFUSD0uLi8uLi9IVE1MVG9rZW5pemVyL2RldmVsL0pGbGV4L2xpYi9zZWQtamZsZXguamFyXDsuDQotREVTVERJUj0uLi8uLi8uLi8uLi8uLi9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuY3NzL3NyYy9jb20vaWJtL3NzZS9tb2RlbC9jc3MvaW50ZXJuYWwvcGFyc2VyDQotDQotI2V4cG9ydCBQQVRIPSRQQVRIOi9vcHQvSUJNSmF2YTItMTMxL2Jpbi86L29wdC9JQk1KYXZhMi0xMy9iaW4vOi9vcHQvamRrMS40DQotI2phdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXgvbGliL3NlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIENTU1Rva2VuaXplciAtc2tlbCBza2VsZXRvbi5zc2UNCi0NCi0kSkFWQURJUi9qYXZhICRKQVZBT1BUIC1jcCAkQ0xBU1NQQVRIIEpGbGV4Lk1haW4gQ1NTVG9rZW5pemVyLmpmbGV4DQotDQotcm0gLWYgQ1NTVG9rZW5pemVyLmphdmF+IENTU1Rva2VuaXplci5qZmxleH4NCi1jcCAtdiBDU1NUb2tlbml6ZXIuamF2YSAkREVTVERJUg0KLSMkSkFWQURJUi9qYXZhYyAkREVTVERJUi8qLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL1JFQURNRSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDgyMGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1kZXZlbCAgICAgLSB0aGUgYWN0aXZlIGRldmVsb3BtZW50IGVudmlyb25tZW50IChzYW5zIEpESykNCi0gICAgICAgICAgICAtIGxhdGVzdCB2ZXJzaW9uIG9mIEhUTUxUb2tlbml6ZXIgc3BlY2lmaWNhdGlvbiBhbmQgZ2VuZXJhdGVkIGNvZGUNCi0gICAgICAgICAgICAtIG1vZGlmaWVkIHNrZWxldG9uIHRvIHByZXZlbnQgVk0gZXhpdHMgb24gdW5tYXRjaGVkIGlucHV0DQotICAgICAgICAgICAgLSAiZmxleCIgc2NyaXB0cyB0byBydW4gSkZsZXggd2l0aCBtb2RpZmllZCBza2VsZXRvbg0KLSAgICAgICAgICAgIC0gYWN0aXZlIFJDUyBhcmNoaXZlDQotcmVzb3VyY2VzIC0gYmFja3VwL3ByaXN0aW5lIHJlc291cmNlcw0KLSAgICAgICAgICAgIC0gVW5tb2RpZmllZCBKRmxleCAxLjIuMiBkb3dubG9hZA0KLSAgICAgICAgICAgIC0gU2VwYXJhdGUgbW9kaWZpY2F0aW9ucyB0byB0aGUgSkZsZXggc2tlbGV0b24NCi0gICAgICAgICAgICAtIFczQyBYTUwgcmVjb21tZW5kYXRpb24gdXNlZCBmb3Igc2V2ZXJhbCBvZiB0aGUgSFRNTFRva2VuaXplciBydWxlcw0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQ5ZmFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzA2ICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDYvNy8wNiAxOjQ2IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLypubHNYWFgqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5JbnRTdGFjazsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaW5mb3JtYXRpay50dS1tdWVuY2hlbi5kZS9+a2xlaW5nL2pmbGV4LyI+SkZsZXg8L2E+IDEuMi4yCi0gKiBvbiA2LzcvMDYgMTo0NiBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvSlNQVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIEpTUFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01KU1BSZWdpb25Db250ZXh0cyB7Ci0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9WQkxfRFFVT1RFUyA9IDUyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX1NRVU9URVMgPSA1MTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTF9TUVVPVEVTX0VORCA9IDUzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRUxfU1FVT1RFU19FTkQgPSA0NjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVMgPSA0NTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMID0gNDM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19TQ0FOID0gMzY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9FTF9TUVVPVEVTID0gNDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUgPSA4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9UQUdfQ0xPU0UgPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEID0gNDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUgPSAyNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX1ZCTCA9IDUwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfU1FVT1RFRF9WQkwgPSA1NjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEID0gNDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDIzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMjQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUgPSAxOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0NPTlRFTlQgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMzE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gMzI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUyA9IDIwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfVkJMX0RRVU9URVNfRU5EID0gNTQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9EUVVPVEVEX0VMID0gNDg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gMjg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX0VORCA9IDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfVEVYVCA9IDE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQgPSAzMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04gPSAzNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0VMX0RRVU9URVNfRU5EID0gNDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9TUVVPVEVEX0VMID0gNDk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UX0VORCA9IDM5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDM1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMgPSAzMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfSlNQX0RRVU9URURfVkJMID0gNTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0FCT1JUX0VNQkVEREVEID0gNDI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEID0gMjk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0pTUF9DT01NRU5UID0gMzg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX0NPTlRFTlQgPSA3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTiA9IDM3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSSA9IDU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9KU1BfRElSRUNUSVZFX05BTUUgPSAxNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1RBR19OQU1FID0gMjI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9UQUdfQ0xPU0UgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlQgPSAzOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyNlwyXDBcMVwxN1wyMlwwXDFcMTdcMVwyNVwxXDEyXDFcNjMiKwotICAgICJcMVwxNVwxXDIyXDFcMTNcMVwxNFwxXDI0XDFcMjRcMVwyNFwxXDI0XDFcMjRcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMjBcMVwxMVwxXDcwXDFcMVwxXDUwXDFcMlwxXDRcMVwyMSIrCi0gICAgIlwxXDM3XDFcNzFcMVwzNVwxXDM2XDFcNTRcMVw2NlwxXDYwXDFcNjBcMVw2MVwxXDYwIisKLSAgICAiXDFcNjBcMVwzMlwxXDMxXDFcNjJcMVw1MVwxXDUzXDFcNjBcMVw2NVwxXDY0XDFcNDAiKwotICAgICJcMVw2N1wyXDYwXDFcMjdcMVw1MlwxXDYwXDFcMzRcMVwxMDJcMVwyM1wxXDBcMVwxMCIrCi0gICAgIlwxXDBcMVw1NlwxXDEwMVwxXDcyXDFcNTdcMVw0MlwxXDY2XDFcNzNcMVw2MFwxXDQ1IisKLSAgICAiXDFcNzZcMVw2MFwxXDMzXDFcMzFcMVw0N1wxXDQ2XDFcNzdcMVw2MFwxXDQzXDFcNDQiKwotICAgICJcMVw1NVwxXDEwMFwxXDQxXDFcNjBcMVwzMFwxXDUyXDFcNjBcMVwxNlwxXDBcMVwxMDMiKwotICAgICJcNzFcMFwxXDc1XDEwXDBcMjdcNzRcMVwwXDM3XDc0XDFcMFw3Mlw3NFwyXDBcMTNcNzQiKwotICAgICJcMlwwXDEwXDc0XDFcMFw2NVw3NFwxXDBcMTA0XDc0XDExXDBcNDRcNzRcM1wwXDJcNzQiKwotICAgICJcNFwwXDM2XDc0XDcwXDBcMTMxXDc0XDIyXDBcN1w3NFwxNlwwXDJcNzVcNTZcMFwxMDZcNzUiKwotICAgICJcMzJcMFwyXDc1XDQ0XDBcMVw3NFwxXDc1XDNcNzRcMVwwXDFcNzRcMVwwXDI0XDc0IisKLSAgICAiXDFcMFw1NFw3NFwxXDBcN1w3NFwzXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NCIrCi0gICAgIlwxXDBcMVw3NFwxXDBcMjJcNzRcMTVcMFwxNFw3NFwxXDBcMTAyXDc0XDFcMFwxNFw3NCIrCi0gICAgIlwxXDBcNDRcNzRcMVwwXDRcNzVcMTFcMFw2NVw3NFwyXDBcMlw3NFwyXDBcMlw3NCIrCi0gICAgIlwzXDBcMzRcNzRcMlwwXDEwXDc0XDJcMFwyXDc0XDY3XDBcNDZcNzRcMlwwXDFcNzQiKwotICAgICJcN1wwXDQ2XDc0XDEyXDBcMjFcNzVcMVwwXDI3XDc1XDFcMFwzXDc1XDFcMFwxXDc1IisKLSAgICAiXDFcMFwyXDc1XDFcMFwxXDc1XDEzXDBcMzNcNzRcNVwwXDNcNzRcNTZcMFwzMlw3NCIrCi0gICAgIlw1XDBcMVw3NVwxMlw3NFwxMFw3NVwxNVwwXDEyXDc1XDZcMFwxXDc1XDEwN1w3NFwyXDAiKwotICAgICJcNVw3NFwxXDBcMTdcNzRcMVwwXDRcNzRcMVwwXDFcNzRcMTdcNzVcMlw3NFwyXDc1IisKLSAgICAiXDFcMFw0XDc1XDJcMFwxMlw3NVx1MDIwN1wwXDNcNzVcMVwwXDY1XDc0XDJcMFwxXDc1IisKLSAgICAiXDFcNzRcMjBcNzVcM1wwXDRcNzVcM1wwXDEyXDc0XDJcNzVcMlwwXDEyXDc1XDIxXDAiKwotICAgICJcM1w3NVwxXDBcMTBcNzRcMlwwXDJcNzRcMlwwXDI2XDc0XDFcMFw3XDc0XDFcMCIrCi0gICAgIlwxXDc0XDNcMFw0XDc0XDJcMFwxXDc1XDFcMFw3XDc1XDJcMFwyXDc1XDJcMCIrCi0gICAgIlwzXDc1XDExXDBcMVw3NVw0XDBcMlw3NFwxXDBcM1w3NFwyXDc1XDJcMFwxMlw3NSIrCi0gICAgIlwyXDc0XDIwXDBcMVw3NVwyXDBcNlw3NFw0XDBcMlw3NFwyXDBcMjZcNzRcMVwwIisKLSAgICAiXDdcNzRcMVwwXDJcNzRcMVwwXDJcNzRcMVwwXDJcNzRcMlwwXDFcNzVcMVwwIisKLSAgICAiXDVcNzVcNFwwXDJcNzVcMlwwXDNcNzVcMTNcMFw0XDc0XDFcMFwxXDc0XDdcMCIrCi0gICAgIlwxMlw3NVwyXDc1XDNcNzRcMTRcMFwzXDc1XDFcMFw3XDc0XDFcMFwxXDc0XDFcMCIrCi0gICAgIlwzXDc0XDFcMFwyNlw3NFwxXDBcN1w3NFwxXDBcMlw3NFwxXDBcNVw3NFwyXDAiKwotICAgICJcMVw3NVwxXDc0XDEwXDc1XDFcMFwzXDc1XDFcMFwzXDc1XDIyXDBcMVw3NFw1XDAiKwotICAgICJcMTJcNzVcMjFcMFwzXDc1XDFcMFwxMFw3NFwyXDBcMlw3NFwyXDBcMjZcNzRcMVwwIisKLSAgICAiXDdcNzRcMVwwXDJcNzRcMlwwXDRcNzRcMlwwXDFcNzVcMVw3NFw2XDc1XDNcMCIrCi0gICAgIlwyXDc1XDJcMFwzXDc1XDEwXDBcMlw3NVw0XDBcMlw3NFwxXDBcM1w3NFw0XDAiKwotICAgICJcMTJcNzVcMjJcMFwyXDc1XDFcMFw2XDc0XDNcMFwzXDc0XDFcMFw0XDc0XDNcMCIrCi0gICAgIlwyXDc0XDFcMFwxXDc0XDFcMFwyXDc0XDNcMFwyXDc0XDNcMFwzXDc0XDNcMCIrCi0gICAgIlwxMFw3NFwxXDBcM1w3NFw0XDBcNVw3NVwzXDBcM1w3NVwxXDBcNFw3NVwxMVwwIisKLSAgICAiXDFcNzVcMTdcMFwxMVw3NVwyMVwwXDNcNzVcMVwwXDEwXDc0XDFcMFwzXDc0XDFcMCIrCi0gICAgIlwyN1w3NFwxXDBcMTJcNzRcMVwwXDVcNzRcNFwwXDdcNzVcMVwwXDNcNzVcMVwwIisKLSAgICAiXDRcNzVcN1wwXDJcNzVcMTFcMFwyXDc0XDRcMFwxMlw3NVwyMlwwXDJcNzVcMVwwIisKLSAgICAiXDEwXDc0XDFcMFwzXDc0XDFcMFwyN1w3NFwxXDBcMTJcNzRcMVwwXDVcNzRcNFwwIisKLSAgICAiXDdcNzVcMVwwXDNcNzVcMVwwXDRcNzVcN1wwXDJcNzVcN1wwXDFcNzRcMVwwIisKLSAgICAiXDJcNzRcNFwwXDEyXDc1XDIyXDBcMlw3NVwxXDBcMTBcNzRcMVwwXDNcNzRcMVwwIisKLSAgICAiXDI3XDc0XDFcMFwyMFw3NFw0XDBcNlw3NVwyXDBcM1w3NVwxXDBcNFw3NVwxMVwwIisKLSAgICAiXDFcNzVcMTBcMFwyXDc0XDRcMFwxMlw3NVwyMjFcMFw1Nlw3NFwxXDBcMVw3NFwxXDc1IisKLSAgICAiXDJcNzRcN1w3NVw1XDBcNlw3NFwxXDc1XDEwXDc1XDFcMFwxMlw3NVw0N1wwXDJcNzQiKwotICAgICJcMVwwXDFcNzRcMlwwXDJcNzRcMVwwXDFcNzRcMlwwXDFcNzRcNlwwXDRcNzQiKwotICAgICJcMVwwXDdcNzRcMVwwXDNcNzRcMVwwXDFcNzRcMVwwXDFcNzRcMlwwXDJcNzQiKwotICAgICJcMVwwXDJcNzRcMVwwXDFcNzRcMVw3NVwyXDc0XDZcNzVcMVwwXDJcNzVcMVw3NCIrCi0gICAgIlwyXDBcNVw3NFwxXDBcMVw3NVwxXDBcNlw3NVwyXDBcMTJcNzVcNzZcMFwyXDc1IisKLSAgICAiXDZcMFwxMlw3NVwxM1wwXDFcNzVcMVwwXDFcNzVcMVwwXDFcNzVcNFwwXDJcNzUiKwotICAgICJcMTBcNzRcMVwwXDQxXDc0XDdcMFwyNFw3NVwxXDBcNlw3NVw0XDBcNlw3NVwxXDAiKwotICAgICJcMVw3NVwxXDBcMjVcNzVcM1wwXDdcNzVcMVwwXDFcNzVcMzQ2XDBcNDZcNzRcMTJcMCIrCi0gICAgIlw0N1w3NFwxMVwwXDFcNzRcMVwwXDJcNzRcMVwwXDNcNzRcMVwwXDFcNzRcMVwwIisKLSAgICAiXDJcNzRcMVwwXDVcNzRcNTFcMFwxXDc0XDFcMFwxXDc0XDFcMFwxXDc0XDEzXDAiKwotICAgICJcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwzXDBcMlw3NFwzXDBcMVw3NFw1XDAiKwotICAgICJcM1w3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwzXDAiKwotICAgICJcMlw3NFwzXDBcMlw3NFwxXDBcMVw3NFw1MFwwXDFcNzRcMTFcMFwxXDc0XDJcMCIrCi0gICAgIlwxXDc0XDJcMFwyXDc0XDdcMFwyXDc0XDFcMFwxXDc0XDFcMFw3XDc0XDUwXDAiKwotICAgICJcMVw3NFw0XDBcMVw3NFwxMFwwXDFcNzRcdTBjMDZcMFwyMzRcNzRcNFwwXDEzMlw3NFw2XDAiKwotICAgICJcMjZcNzRcMlwwXDZcNzRcMlwwXDQ2XDc0XDJcMFw2XDc0XDJcMFwxMFw3NFwxXDAiKwotICAgICJcMVw3NFwxXDBcMVw3NFwxXDBcMVw3NFwxXDBcMzdcNzRcMlwwXDY1XDc0XDFcMCIrCi0gICAgIlw3XDc0XDFcMFwxXDc0XDNcMFwzXDc0XDFcMFw3XDc0XDNcMFw0XDc0XDJcMCIrCi0gICAgIlw2XDc0XDRcMFwxNVw3NFw1XDBcM1w3NFwxXDBcN1w3NFwzMjNcMFwxNVw3NVw0XDAiKwotICAgICJcMVw3NVwxMDRcMFwxXDc0XDNcMFwyXDc0XDJcMFwxXDc0XDEyMVwwXDNcNzRcdTBlODJcMCIrCi0gICAgIlwxXDc1XDFcMFwxXDc0XDMxXDBcMTFcNzRcNlw3NVwxXDBcNVw3NVwxM1wwXDEyNFw3NCIrCi0gICAgIlw0XDBcMlw3NVwyXDBcMlw3NVwyXDBcMTMyXDc0XDFcMFwzXDc1XDZcMFw1MFw3NCIrCi0gICAgIlx1MWNkM1wwXHU1MWE2XDc0XHUwYzVhXDBcdTJiYTRcNzRcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA2OCwgICAxMzYsICAgMjA0LCAgIDI3MiwgICAzNDAsICAgNDA4LCAgIDQ3NiwgICA1NDQsICAgNjEyLCAKLSAgICAgIDY4MCwgICA3NDgsICAgODE2LCAgIDg4NCwgICA5NTIsICAxMDIwLCAgMTA4OCwgIDExNTYsICAxMjI0LCAgMTI5MiwgCi0gICAgIDEzNjAsICAxNDI4LCAgMTQ5NiwgIDE1NjQsICAxNjMyLCAgMTcwMCwgIDE3NjgsICAxODM2LCAgMTkwNCwgIDE5NzIsIAotICAgICAyMDQwLCAgMjEwOCwgIDIxNzYsICAyMjQ0LCAgMjMxMiwgIDIzODAsICAyNDQ4LCAgMjUxNiwgIDI1ODQsICAyNjUyLCAKLSAgICAgMjcyMCwgIDI3ODgsICAyODU2LCAgMjkyNCwgIDI5OTIsICAzMDYwLCAgMzEyOCwgIDMxOTYsICAzMjY0LCAgMzMzMiwgCi0gICAgIDM0MDAsICAzNDY4LCAgMzUzNiwgIDM2MDQsICAzNjcyLCAgMzc0MCwgIDM4MDgsICAzODc2LCAgMzk0NCwgIDQwMTIsIAotICAgICA0MDgwLCAgNDE0OCwgIDQyMTYsICA0Mjg0LCAgNDM1MiwgIDQyODQsICA0MzUyLCAgNDQyMCwgIDQyODQsICA0Mjg0LCAKLSAgICAgNDM1MiwgIDQ0ODgsICA0NTU2LCAgNDYyNCwgIDQ2OTIsICA0NzYwLCAgNDgyOCwgIDQ4OTYsICA0Mjg0LCAgNDM1MiwgCi0gICAgIDQ5NjQsICA1MDMyLCAgNTEwMCwgIDQyODQsICA1MTY4LCAgNTE2OCwgIDUyMzYsICA1MzA0LCAgNTM3MiwgIDQ5NjQsIAotICAgICA0Mjg0LCAgNTQ0MCwgIDU1MDgsICA0Mjg0LCAgNTU3NiwgIDU2NDQsICA1NzEyLCAgNTc4MCwgIDQyODQsICA0MzUyLCAKLSAgICAgNTg0OCwgIDU5MTYsICA1OTg0LCAgNjA1MiwgIDYxMjAsICA2MTg4LCAgNDI4NCwgIDYyNTYsICA2MjU2LCAgNjMyNCwgCi0gICAgIDYzOTIsICA2NDYwLCAgNjUyOCwgIDY1OTYsICA0Mjg0LCAgNjY2NCwgIDY3MzIsICA2ODAwLCAgNjg2OCwgIDY5MzYsIAotICAgICA3MDA0LCAgNDI4NCwgIDcwNzIsICA3MTQwLCAgNzIwOCwgIDcyNzYsICA3MzQ0LCAgNzQxMiwgIDc0ODAsICA3NTQ4LCAKLSAgICAgNDI4NCwgIDc2MTYsICA3Njg0LCAgNzc1MiwgIDc4MjAsICA3ODg4LCAgNzk1NiwgIDgwMjQsICA4MDkyLCAgODA5MiwgCi0gICAgIDgxNjAsICA4MjI4LCAgODI5NiwgIDgzNjQsICA4MzY0LCAgODQzMiwgIDg1MDAsICA4NTY4LCAgODYzNiwgIDg2MzYsIAotICAgICA4NzA0LCAgODc3MiwgIDg4NDAsICA4OTA4LCAgNDI4NCwgIDg5NzYsICA4OTc2LCAgOTA0NCwgIDkxMTIsICA5MTgwLCAKLSAgICAgOTI0OCwgIDQyODQsICA0Mjg0LCAgNDM1MiwgIDkzMTYsICA0Mjg0LCAgNDM1MiwgIDkzODQsICA5NDUyLCAgOTUyMCwgCi0gICAgIDk1ODgsICA0Mjg0LCAgOTY1NiwgIDk3MjQsICA5NzkyLCAgOTg2MCwgIDQyODQsICA5OTI4LCAgOTk5NiwgMTAwNjQsIAotICAgIDEwMTMyLCAgNDI4NCwgIDQyODQsIDEwMjAwLCAgNDI4NCwgMTAyNjgsIDEwMzM2LCAxMDI2OCwgMTA0MDQsIDEwNDcyLCAKLSAgICAxMDQwNCwgIDQyODQsICA0Mjg0LCAxMDU0MCwgMTA2MDgsIDEwNjc2LCAgNDI4NCwgMTA3NDQsIDEwODEyLCAxMDg4MCwgCi0gICAgMTA5NDgsIDExMDE2LCAgNDI4NCwgIDQyODQsIDExMDg0LCAgNDI4NCwgMTExNTIsIDExMjIwLCAxMTE1MiwgMTEyODgsIAotICAgIDExMzU2LCAxMTI4OCwgIDQyODQsICA0Mjg0LCAxMTQyNCwgMTE0OTIsIDExNTYwLCAgNDI4NCwgMTE2MjgsIDExNjk2LCAKLSAgICAxMTc2NCwgIDQyODQsICA0Mjg0LCAxMTgzMiwgMTE5MDAsIDExOTY4LCAxMjAzNiwgMTIxMDQsICA0Mjg0LCAxMjE3MiwgCi0gICAgMTIyNDAsIDEyMzA4LCAxMjM3NiwgMTI0NDQsIDEyNTEyLCAxMjU4MCwgMTI2NDgsIDEyNzE2LCAgNDI4NCwgMTI3ODQsIAotICAgIDEyODUyLCAgNDI4NCwgIDQyODQsICA1MTY4LCAgNTMwNCwgIDQyODQsIDEyOTIwLCAgNTM3MiwgMTI5ODgsICA1NDQwLCAKLSAgICAgNTU3NiwgIDU2NDQsIDEzMDU2LCAgNTcxMiwgIDQyODQsIDEzMTI0LCAxMzE5MiwgIDU3ODAsIDEzMjYwLCAgNDI4NCwgCi0gICAgMTE5MDAsICA0Mjg0LCAgNjI1NiwgIDYzMjQsICA0Mjg0LCAxMzMyOCwgIDYzOTIsIDEzMzk2LCAgNDI4NCwgMTM0NjQsIAotICAgIDEzNTMyLCAgNzA3MiwgMTM2MDAsICA3Mjc2LCAgNDI4NCwgMTM2NjgsICA3MzQ0LCAxMzczNiwgMTM4MDQsIDEzODcyLCAKLSAgICAxMzk0MCwgMTQwMDgsIDE0MDc2LCAgNzgyMCwgIDQyODQsIDE0MTQ0LCAxNDIxMiwgIDgwOTIsICA4MTYwLCAgNDI4NCwgCi0gICAgMTQyODAsIDE0MzQ4LCAxNDQxNiwgMTQ0ODQsIDE0NTUyLCAgODI5NiwgIDgwOTIsICA4MzY0LCAgODQzMiwgIDQyODQsIAotICAgICA4NTAwLCAgODU2OCwgIDgzNjQsICA4NjM2LCAgODcwNCwgIDQyODQsIDE0NjIwLCAxNDY4OCwgMTQ3NTYsIDE0ODI0LCAKLSAgICAxNDg5MiwgMTQ5NjAsIDE1MDI4LCAgODk3NiwgIDkwNDQsICA0Mjg0LCAxNTA5NiwgMTUxNjQsIDE1MjMyLCAxNTMwMCwgCi0gICAgMTUzNjgsIDE1NDM2LCAxNTUwNCwgMTU1NzIsIDE1NjQwLCAgNDI4NCwgIDQyODQsICA0Mjg0LCAxNTcwOCwgIDQyODQsIAotICAgICA0Mjg0LCAxNTc3NiwgMTU4NDQsIDE1OTEyLCAxNTk4MCwgMTAyNjgsICA0Mjg0LCAxNjA0OCwgMTYxMTYsIDEwNDA0LCAKLSAgICAgNDI4NCwgMTYxODQsIDE2MjUyLCAxNjMyMCwgMTYzODgsIDE2NDU2LCAxNjUyNCwgMTY1OTIsIDE2NjYwLCAxNjcyOCwgCi0gICAgMTA5NDgsIDExMTUyLCAgNDI4NCwgMTY3OTYsIDE2ODY0LCAxMTI4OCwgIDQyODQsIDE2OTMyLCAxNzAwMCwgMTcwNjgsIAotICAgIDE3MTM2LCAxNzIwNCwgMTcyNzIsIDE3MzQwLCAxNzQwOCwgMTc0NzYsICA0Mjg0LCAgNDI4NCwgIDQyODQsIDE3NTQ0LCAKLSAgICAxNzYxMiwgMTc2ODAsIDE3NzQ4LCAxNzgxNiwgIDQyODQsIDE3ODg0LCAxNzk1MiwgIDQyODQsICA0Mjg0LCAgNDI4NCwgCi0gICAgIDQyODQsICA0Mjg0LCAgNDY5MiwgMTgwMjAsIDE4MDg4LCAxODE1NiwgMTgyMjQsIDE4MjkyLCAxODM2MCwgMTgyOTIsIAotICAgIDE4NDI4LCAxODQ5NiwgMTg0MjgsIDE4NTY0LCAxODYzMiwgMTg3MDAsIDE4NzY4LCAxODgzNiwgMTg5MDQsIDE4OTcyLCAKLSAgICAxODk3MiwgMTkwNDAsIDE5MTA4LCAxOTEwOCwgMTkxNzYsICA4ODQwLCAgODg0MCwgMTkyNDQsIDE5MzEyLCAxOTM4MCwgCi0gICAgMTkzODAsIDE5NDQ4LCAgOTE4MCwgIDkxODAsIDE5NTE2LCAxOTU4NCwgMTU5MTIsIDE5NjUyLCAxMDA2NCwgMTAwNjQsIAotICAgIDE5NzIwLCAxOTc4OCwgMTAyNjgsIDEwMjY4LCAxOTg1NiwgMTk5MjQsIDEwNDA0LCAxMDQwNCwgMTk5OTIsIDIwMDYwLCAKLSAgICAxMDU0MCwgMTA1NDAsIDE2NDU2LCAyMDEyOCwgMjAxOTYsIDEwNzQ0LCAxMDc0NCwgMTY2NjAsIDIwMjY0LCAyMDMzMiwgCi0gICAgMTA5NDgsIDEwOTQ4LCAyMDQwMCwgMTExNTIsIDExMTUyLCAyMDQ2OCwgMjA1MzYsIDExMjg4LCAxMTI4OCwgMjA2MDQsIAotICAgIDIwNjcyLCAxMTQyNCwgMTE0MjQsIDE3MjA0LCAyMDc0MCwgMjA4MDgsIDExNjI4LCAxMTYyOCwgMTc0MDgsIDIwODc2LCAKLSAgICAgNDI4NCwgIDQyODQsIDIwOTQ0LCAyMTAxMiwgIDQyODQsIDIxMDgwLCAyMTE0OCwgMjEyMTYsICA3MDcyLCAgNDI4NCwgCi0gICAgIDQyODQsIDIxMjg0LCAyMTM1MiwgMjE0MjAsIDIxNDg4LCAyMTU1NiwgMTQ0ODQsIDE0ODI0LCAgODg0MCwgMjE2MjQsIAotICAgIDE1MzAwLCAgOTE4MCwgMjE2OTIsICA0Mjg0LCAxMDA2NCwgMTAyNjgsIDIxNzYwLCAxMDQwNCwgMjE4MjgsIDEwNTQwLCAKLSAgICAyMTg5NiwgIDQyODQsIDEwNzQ0LCAyMTk2NCwgMTA5NDgsIDExMTUyLCAyMjAzMiwgMTEyODgsIDIyMTAwLCAxMTQyNCwgCi0gICAgMjIxNjgsICA0Mjg0LCAxMTYyOCwgMjIyMzYsIDIyMzA0LCAyMjM3MiwgMjI0NDAsIDIyNTA4LCAyMjU3NiwgMjI2NDQsIAotICAgIDIyNzEyLCAyMjc4MCwgMjI4NDgsIDIyOTE2LCAyMjk4NCwgMjMwNTIsIDIzMTIwLCAyMzE4OCwgMjMyNTYsIDIzMzI0LCAKLSAgICAyMzM5MiwgMjM0NjAsIDIzNTI4LCAyMzU5NiwgIDQ2OTIsIDIzNjY0LCAyMzczMiwgMjM4MDAsIDIzODY4LCAyMzkzNiwgCi0gICAgIDQyODQsICA0Mjg0LCAyNDAwNCwgMjQwNzIsIDI0MTQwLCAyNDIwOCwgMTY0NTYsIDE2NjYwLCAyNDI3NiwgMjQzNDQsIAotICAgIDE3MjA0LCAxNzQwOCwgMjQ0MTIsIDI0NDgwLCAyNDU0OCwgIDQyODQsICA0Mjg0LCAgNDI4NCwgMjQ2MTYsIDI0Njg0LCAKLSAgICAyNDc1MiwgMjQ4MjAsIDI0ODg4LCAyNDk1NiwgMjUwMjQsICA2ODAwLCAyNTA5MiwgMjUxNjAsIDI1MjI4LCAyNTI5NiwgCi0gICAgMjUzNjQsIDI1NDMyLCAyNTUwMCwgIDQyODQsIDI1NTY4LCAgODg0MCwgIDkxODAsIDEwMjY4LCAxMDQwNCwgMTExNTIsIAotICAgIDExMjg4LCAyNTYzNiwgMjU3MDQsIDI1NzcyLCAyNTg0MCwgMjU5MDgsIDI1OTc2LCAyNjA0NCwgMjYxMTIsIDI2MTgwLCAKLSAgICAyNjI0OCwgMjYzMTYsIDI2Mzg0LCAyNjQ1MiwgMjY1MjAsIDI2NTg4LCAyNjY1NiwgMjY3MjQsIDI2NzkyLCAyNjg2MCwgCi0gICAgMjY5MjgsIDI2OTk2LCAyNzA2NCwgMjcxMzIsIDI3MjAwLCAyNzI2OCwgMjczMzYsIDI3NDA0LCAyNzQ3MiwgMjc1NDAsIAotICAgIDI3NjA4LCAyNzY3NiwgMjc3NDQsIDI3ODEyLCAyNzg4MCwgMjc5NDgsIDI4MDE2LCAyODA4NCwgMjgxNTIsIDI4MjIwLCAKLSAgICAyODI4OCwgIDQyODQsIDI4MzU2LCAyODQyNCwgMjg0OTIsIDI4NTYwLCAgNjgwMCwgMjg2MjgsIDI4Njk2LCAyODc2NCwgCi0gICAgMjg4MzIsIDI4OTAwLCAyODk2OCwgMjkwMzYsIDI5MTA0LCAyOTE3MiwgMjkyNDAsIDI5MzA4LCAyOTM3NiwgMjk0NDQsIAotICAgIDI5NTEyCi0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMVw3MlwxXDczXDExXDcyXDFcNzRcMVw3MlwxXDc1XDRcNzJcMVw3NiIrCi0gICAgIlw0MFw3MlwxXDc3XDIwXDcyXDFcMTAwXDFcMTAxXDEwMlwxMDBcMVwxMDJcMVwxMDMiKwotICAgICJcMjFcMTAyXDFcMTA0XDJcMTAyXDFcMTA1XDU1XDEwMlwxXDEwNlwxXDEwN1wxMDJcMTA2IisKLSAgICAiXDFcMTAyXDFcMTAzXDVcMTAyXDFcMTEwXDE2XDEwMlwxXDEwNVw1NlwxMDJcMVwxMDMiKwotICAgICJcMlwxMDJcMVwxMTFcMVwxMTJcMlwxMDJcMlwxMTNcNVwxMDJcMVwxMTJcNlwxMDIiKwotICAgICJcMVwxMTJcMlwxMTRcM1wxMTNcMVwxMDJcMTBcMTEzXDFcMTE1XDJcMTEzXDFcMTAyIisKLSAgICAiXDEwXDExM1wxXDExNVwxXDExM1wxXDEwMlw0XDExM1wxXDEwMlw0XDExM1wxXDEwMiIrCi0gICAgIlw0XDExM1wzXDEwMlwxXDEwM1wyXDEwMlwxXDExMVwxXDExNlwxMVwxMDJcMVwxMTYiKwotICAgICJcNlwxMDJcMVwxMTZcNTVcMTAyXDFcMTE3XDFcMTIwXDJcMTE3XDFcMTIxXDIxXDExNyIrCi0gICAgIlwxXDEwNVw1NVwxMTdcMVwxMDJcMVwxMDNcMlwxMDJcMVwxMjJcMVwxMTJcMlwxMDIiKwotICAgICJcMlwxMjNcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMjNcMVwxMDJcMTNcMTIzIisKLSAgICAiXDFcMTAyXDEyXDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyM1wxXDEwMlw0XDEyMyIrCi0gICAgIlwzXDEwMlwxXDEwM1wyXDEwMlwxXDEyMlwxXDExMlwyXDEwMlwyXDEyM1w1XDEwMiIrCi0gICAgIlwxXDExMlw2XDEwMlwxXDExMlw1XDEyM1wxXDEwMlwxM1wxMjNcMVwxMjRcMTJcMTIzIisKLSAgICAiXDFcMTAyXDRcMTIzXDFcMTAyXDRcMTIzXDFcMTAyXDRcMTIzXDJcMTAyXDFcMTI1IisKLSAgICAiXDFcMTAzXDFcMTAyXDFcMTI2XDFcMTI3XDFcMTEyXDRcMTI1XDFcMTMwXDFcMTI1IisKLSAgICAiXDFcMTMxXDJcMTI1XDFcMTEyXDZcMTI1XDFcMTEyXDU1XDEyNVwxXDEwMlwxXDEwMyIrCi0gICAgIlwyXDEwMlwxXDEzMlwyMVwxMDJcMVwxMDVcNTZcMTAyXDFcMTAzXDFcMTMzXDFcMTM0IisKLSAgICAiXDFcMTAyXDFcMTEyXDJcMTAyXDJcMTM1XDVcMTAyXDFcMTEyXDZcMTAyXDFcMTEyIisKLSAgICAiXDVcMTM1XDFcMTAyXDEzXDEzNVwxXDEwMlwxMlwxMzVcMVwxMDJcNFwxMzVcMVwxMDIiKwotICAgICJcNFwxMzVcMVwxMDJcNFwxMzVcM1wxMDJcMVwxMDNcMVwxMzNcMVwxMzRcMVwxMDIiKwotICAgICJcMVwxMTJcMlwxMDJcMlwxMzVcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMzUiKwotICAgICJcMVwxMDJcMTNcMTM1XDFcMTM2XDEyXDEzNVwxXDEwMlw0XDEzNVwxXDEwMlw0XDEzNSIrCi0gICAgIlwxXDEwMlw0XDEzNVwyXDEwMlwxXDEzN1wxXDEwM1wxXDEzM1wxXDE0MFwxXDEzNyIrCi0gICAgIlwxXDExMlw0XDEzN1wxXDE0MVwxXDEzN1wxXDE0MlwyXDEzN1wxXDExMlw2XDEzNyIrCi0gICAgIlwxXDExMlw1NVwxMzdcMVwxMDJcMVwxMDNcM1wxMDJcMVwxMTJcMTFcMTAyXDFcMTEyIisKLSAgICAiXDZcMTAyXDFcMTEyXDU1XDEwMlwxXDE0M1wxXDE0NFwyMFwxNDNcMVwxNDVcNjFcMTQzIisKLSAgICAiXDFcMTAyXDFcMTQ2XDNcMTAyXDFcMTEyXDJcMTAyXDJcMTQ3XDVcMTAyXDFcMTEyIisKLSAgICAiXDJcMTAyXDFcMTUwXDNcMTAyXDFcMTEyXDVcMTQ3XDFcMTAyXDEzXDE0N1wxXDEwMiIrCi0gICAgIlwxMlwxNDdcMVwxMDJcNFwxNDdcMVwxMDJcNFwxNDdcMVwxMDJcNFwxNDdcM1wxMDIiKwotICAgICJcMVwxNDZcM1wxMDJcMVwxNTFcMTFcMTAyXDFcMTUxXDJcMTAyXDFcMTUwXDNcMTAyIisKLSAgICAiXDFcMTUxXDU2XDEwMlwxXDE0NlwzXDEwMlwxXDExMlwyXDEwMlwyXDE1Mlw1XDEwMiIrCi0gICAgIlwxXDExMlwyXDEwMlwxXDE1MFwzXDEwMlwxXDExMlw1XDE1MlwxXDEwMlwxM1wxNTIiKwotICAgICJcMVwxMDJcMTJcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyXDFcMTAyXDRcMTUyIisKLSAgICAiXDNcMTAyXDFcMTQ2XDNcMTAyXDFcMTEyXDJcMTAyXDJcMTUyXDVcMTAyXDFcMTEyIisKLSAgICAiXDJcMTAyXDFcMTUwXDNcMTAyXDFcMTEyXDVcMTUyXDFcMTAyXDEzXDE1MlwxXDE1MyIrCi0gICAgIlwxMlwxNTJcMVwxMDJcNFwxNTJcMVwxMDJcNFwxNTJcMVwxMDJcNFwxNTJcMlwxMDIiKwotICAgICJcMVwxNTRcMVwxNDZcMVwxMDJcMVwxNTVcMVwxNTRcMVwxMTJcNFwxNTRcMVwxNTYiKwotICAgICJcMVwxNTRcMVwxNTdcMlwxNTRcMVwxMTJcMlwxNTRcMVwxNjBcM1wxNTRcMVwxMTIiKwotICAgICJcNTVcMTU0XDFcMTYxXDFcMTYyXDFcMTYzXDFcMTY0XDRcMTYxXDJcMTY1XDE1XDE2MSIrCi0gICAgIlw1XDE2NlwxXDE2MVwxM1wxNjZcMVwxNjFcMTJcMTY2XDFcMTYxXDRcMTY2XDFcMTYxIisKLSAgICAiXDRcMTY2XDFcMTYxXDFcMTY3XDNcMTY2XDJcMTYxXDFcMTAyXDFcMTcwXDFcMTYzIisKLSAgICAiXDFcMTY0XDFcMTAyXDFcMTEyXDJcMTAyXDJcMTcxXDVcMTAyXDFcMTEyXDZcMTAyIisKLSAgICAiXDFcMTEyXDVcMTcxXDFcMTAyXDEzXDE3MVwxXDEwMlwxMlwxNzFcMVwxMDJcNFwxNzEiKwotICAgICJcMVwxMDJcNFwxNzFcMVwxMDJcNFwxNzFcM1wxMDJcMVwxNzBcMVwxNjNcMVwxNjQiKwotICAgICJcMVwxMDJcMVwxMTJcMlwxMDJcMlwxNzFcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTIiKwotICAgICJcNVwxNzFcMVwxMDJcMTNcMTcxXDFcMTcyXDEyXDE3MVwxXDEwMlw0XDE3MVwxXDEwMiIrCi0gICAgIlw0XDE3MVwxXDEwMlw0XDE3MVwyXDEwMlwxXDE3M1wxXDE3NFwxXDE2M1wxXDE3NSIrCi0gICAgIlwxXDE3M1wxXDExMlw0XDE3M1wxXDE3NlwxXDE3M1wxXDE3N1wxXDIwMFwxXDE3MyIrCi0gICAgIlwxXDExMlw2XDE3M1wxXDExMlwzNFwxNzNcMVwyMDFcMjBcMTczXDFcMTAyXDFcMjAyIisKLSAgICAiXDFcMjAzXDJcMTAyXDFcMTEyXDExXDEwMlwxXDExMlw2XDEwMlwxXDExMlw3XDEwMiIrCi0gICAgIlwxXDIwNFwxXDIwNVwyXDEwMlwxXDIwNlwxMVwxMDJcMVwyMDZcMVwxMDJcMVwyMDUiKwotICAgICJcMVwyMDRcMjVcMTAyXDFcMTAzXDFcMjAzXDJcMTAyXDFcMTEyXDExXDEwMlwxXDExMiIrCi0gICAgIlw2XDEwMlwxXDExMlw1XDEwMlwxXDIwN1w1MFwxMDJcMVwxMDNcMVwyMDNcMlwxMDIiKwotICAgICJcMVwxMTJcMlwxMDJcMlwyMTBcNVwxMDJcMVwxMTJcNlwxMDJcMVwxMTJcNVwyMTAiKwotICAgICJcMVwyMDdcMTNcMjEwXDFcMTAyXDEyXDIxMFwxXDEwMlw0XDIxMFwxXDEwMlw0XDIxMCIrCi0gICAgIlwxXDEwMlw0XDIxMFwzXDEwMlwxXDEwM1wxXDIwM1wyXDEwMlwxXDExMlwxMVwxMDIiKwotICAgICJcMVwxMTJcNlwxMDJcMVwxMTJcNVwxMDJcMVwyMDdcN1wxMDJcMVwyMTFcNlwxMDIiKwotICAgICJcMVwyMTJcMTBcMTAyXDFcMjExXDEyXDEwMlwxXDIxMlw0XDEwMlwxXDIxM1wxXDEwMyIrCi0gICAgIlwxXDIwM1wxXDIxNFwxXDIxM1wxXDExMlw0XDIxM1wxXDIxNVwxXDIxM1wxXDIxNiIrCi0gICAgIlwyXDIxM1wxXDExMlw2XDIxM1wxXDExMlw1XDIxM1wxXDIxN1w0N1wyMTNcMVwyMjAiKwotICAgICJcMVwxMDNcMVwyMDNcMVwyMjFcMVwyMjBcMVwxMTJcNFwyMjBcMVwyMjJcMVwyMjAiKwotICAgICJcMVwyMjNcMlwyMjBcMVwxMTJcNlwyMjBcMVwxMTJcNVwyMjBcMVwyMjRcNDdcMjIwIisKLSAgICAiXDFcMjI1XDFcMTAzXDFcMjAzXDFcMjI2XDFcMjI1XDFcMTEyXDRcMjI1XDFcMjI3IisKLSAgICAiXDFcMjI1XDFcMjMwXDJcMjI1XDFcMTEyXDZcMjI1XDFcMTEyXDU1XDIyNVwxXDIzMSIrCi0gICAgIlwxXDIzMlwxXDIzM1wxMDFcMjMxXDFcMjM0XDFcMTAzXDFcMjAzXDFcMjM1XDFcMjM0IisKLSAgICAiXDFcMTEyXDRcMjM0XDFcMjM2XDFcMjM0XDFcMjM3XDJcMjM0XDFcMTEyXDZcMjM0IisKLSAgICAiXDFcMTEyXDU1XDIzNFwxXDI0MFwxXDI0MVwxXDI0MlwxMDFcMjQwXDFcMjQzXDFcMjQ0IisKLSAgICAiXDEwMlwyNDNcMVwxMDJcMVwyNDVcMjRcMTAyXDFcMTA1XDU1XDEwMlwxXDI0NlwxXDI0NyIrCi0gICAgIlwxMDJcMjQ2XDFcMTAyXDFcMTAzXDVcMTAyXDFcMjUwXDE2XDEwMlwxXDEwNVw1NVwxMDIiKwotICAgICJcMVwyNTFcMVwyNTJcM1wyNTFcMVwyNTNcNlwyNTFcMVwyNTRcMVwyNTVcMVwyNTEiKwotICAgICJcMVwyNTNcNlwyNTFcMVwyNTNcMzRcMjUxXDFcMjU2XDIwXDI1MVwxXDI1N1wxXDI1MiIrCi0gICAgIlwzXDI1N1wxXDI2MFw0XDI1N1wxXDI2MVwyXDI1N1wxXDI2MlwxXDI1N1wxXDI2MCIrCi0gICAgIlw2XDI1N1wxXDI2MFwzNFwyNTdcMVwyNjNcMjBcMjU3XDFcMTAyXDFcMTAzXDI0XDEwMiIrCi0gICAgIlwxXDEwNVw1NVwxMDJcMVwyNjRcMVwyNjVcMTBcMjY0XDFcMjY2XDFcMjY0XDFcMjY3IisKLSAgICAiXDFcMjcwXDY1XDI2NFwxXDI3MVwxXDI3MlwxXDI3M1wxMlwyNzJcMVwxMDJcMTFcMjcyIisKLSAgICAiXDFcMjc0XDU1XDI3MlwxXDI3NVwxXDI3NlwxMFwyNzVcMVwxMDJcMTNcMjc1XDFcMjc3IisKLSAgICAiXDU1XDI3NVwxXDEwMlwxXDEwM1wxMlwxMDJcMVwzMDBcMTFcMTAyXDFcMTA1XDU2XDEwMiIrCi0gICAgIlwxXDEwM1wxMFwxMDJcMVwzMDFcMTNcMTAyXDFcMTA1XDU1XDEwMlwxXDMwMlwxXDMwMyIrCi0gICAgIlwxMFwzMDJcMVwyNjFcNjdcMzAyXDFcMzA0XDFcMzA1XDFcMzA2XDFcMzA3XDEyXDMwNiIrCi0gICAgIlwxXDI1NFw2NVwzMDZcMVwzMTBcMVwzMDVcMVwzMTFcMVwzMTJcMTBcMzExXDFcMzEzIisKLSAgICAiXDFcMzExXDFcMzE0XDQ2XDMxMVwxXDMxNVwxN1wzMTFcMVwzMTZcMVwzMTdcMVwzMjAiKwotICAgICJcMTJcMzE3XDFcMTAyXDExXDMxN1wxXDMyMVw1NVwzMTdcMVwzMjJcMVwzMjNcMTBcMzIyIisKLSAgICAiXDFcMTAyXDEzXDMyMlwxXDMyNFw1NVwzMjJcMVwxMDJcMVwxMDNcMTJcMTAyXDFcMzI1IisKLSAgICAiXDExXDEwMlwxXDEwNVw1NlwxMDJcMVwxMDNcMTBcMTAyXDFcMzI2XDEzXDEwMlwxXDEwNSIrCi0gICAgIlw1NVwxMDJcMVwzMjdcMVwzMzBcMTBcMzI3XDFcMjYxXDY3XDMyN1wxXDMzMVwxXDMzMiIrCi0gICAgIlwxXDMzM1wxXDMzNFwxMlwzMzNcMVwyNTRcNjVcMzMzXDFcMzM1XDFcMzMyXDFcNzIiKwotICAgICJcMVwwXDExXDcyXDFcMFwxXDcyXDFcMFw0XDcyXDFcMFw0MFw3MiIrCi0gICAgIlwxXDBcMjBcNzJcM1wwXDFcMzM2XDFcMzM3XDE1XDBcMVwzNDBcMlwwIisKLSAgICAiXDFcMzQxXDYzXDBcMVwzNDJcMlwwXDJcMzQzXDVcMFwxXDM0Mlw2XDAiKwotICAgICJcMVwzNDJcNVwzNDNcMVwwXDEzXDM0M1wxXDBcMTJcMzQzXDFcMzQ0XDRcMzQzIisKLSAgICAiXDFcMFw0XDM0M1wxXDBcNFwzNDNcMlwwXDFcMzQ1XDFcMFwxMVwzNDUiKwotICAgICJcMVwwXDFcMzQ1XDFcMzQ2XDFcMzQ3XDNcMzQ1XDFcMFw2MVwzNDVcNVwwIisKLSAgICAiXDFcMzQyXDJcMFwyXDM1MFw1XDBcMVwzNDJcNlwwXDFcMzQyXDVcMzUwIisKLSAgICAiXDFcMFwxM1wzNTBcMVwwXDEyXDM1MFwxXDBcNFwzNTBcMVwwXDRcMzUwIisKLSAgICAiXDFcMFw0XDM1MFwyXDBcMVwzNDVcMVwwXDExXDM0NVwxXDBcMlwzNDUiKwotICAgICJcMVwzNTFcM1wzNDVcMVwwXDQwXDM0NVwxXDM1MlwyMFwzNDVcMTI2XDBcMVwzNTMiKwotICAgICJcMlwwXDFcMzU0XDEwMVwwXDFcMzU1XDY3XDBcMVwzNTZcNzZcMFwxXDM1NyIrCi0gICAgIlwxMDZcMFwxXDExMlwxMVwwXDFcMTEyXDZcMFwxXDExMlw2M1wwXDRcMTEzIisKLSAgICAiXDZcMFwxXDExM1w2XDBcNVwxMTNcMVwwXDEzXDExM1wxXDBcMTJcMTEzIisKLSAgICAiXDFcMFw0XDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxMTNcNlwwXDFcMTEzIisKLSAgICAiXDZcMFwyXDExM1wxXDM2MFwyXDExM1wxXDBcMTNcMTEzXDFcMFwxMlwxMTMiKwotICAgICJcMVwwXDRcMTEzXDFcMFwxMVwxMTNcMTBcMFw0XDExM1w2XDBcMVwxMTMiKwotICAgICJcNlwwXDJcMTEzXDFcMzYxXDJcMTEzXDFcMFwxM1wxMTNcMVwwXDEyXDExMyIrCi0gICAgIlwxXDBcNFwxMTNcMVwwXDExXDExM1w3XDBcMVwxMTZcMTFcMFwxXDExNiIrCi0gICAgIlw2XDBcMVwxMTZcNTdcMFwxXDM2MlwxMDNcMFwxXDM2M1wxMDdcMFw0XDEyMyIrCi0gICAgIlw2XDBcMVwxMjNcNlwwXDVcMTIzXDFcMFwxM1wxMjNcMVwwXDEyXDEyMyIrCi0gICAgIlwxXDBcNFwxMjNcMVwwXDExXDEyM1wyXDBcMVwxMjVcMlwwXDFcMzY0IisKLSAgICAiXDFcMTI1XDFcMFw0XDEyNVwxXDBcMVwxMjVcMVwwXDJcMTI1XDFcMCIrCi0gICAgIlw2XDEyNVwxXDBcNTZcMTI1XDFcMFwxXDM2M1wxXDM2NFwxXDEyNVwxXDAiKwotICAgICJcNFwxMjVcMVwwXDFcMTI1XDFcMFwyXDEyNVwxXDBcNlwxMjVcMVwwIisKLSAgICAiXDU1XDEyNVwxXDM2NVwxXDBcMTBcMzY1XDFcMzY2XDJcMzY1XDFcMzY3XDQ1XDM2NSIrCi0gICAgIlwxXDM2N1wyMFwzNjVcMVwzNzBcMVwwXDEyXDM3MFwxXDM2NlwxXDM3MVw0NVwzNzAiKwotICAgICJcMVwzNzFcMjBcMzcwXDJcMFwxXDEzM1wxXDM3MlwxMDZcMFw0XDEzNVw2XDAiKwotICAgICJcMVwxMzVcNlwwXDVcMTM1XDFcMFwxM1wxMzVcMVwwXDEyXDEzNVwxXDAiKwotICAgICJcNFwxMzVcMVwwXDExXDEzNVwyXDBcMVwxMzdcMlwwXDFcMzczXDFcMTM3IisKLSAgICAiXDFcMFw0XDEzN1wxXDBcMVwxMzdcMVwwXDJcMTM3XDFcMFw2XDEzNyIrCi0gICAgIlwxXDBcNTZcMTM3XDFcMFwxXDEzM1wxXDM3NFwxXDEzN1wxXDBcNFwxMzciKwotICAgICJcMVwwXDFcMTM3XDFcMFwyXDEzN1wxXDBcNlwxMzdcMVwwXDU1XDEzNyIrCi0gICAgIlwxXDE0MVwxXDBcMVwzNzVcMVwzNzZcMVwxNDFcMVwzNzVcNFwxNDFcMVwzNzciKwotICAgICJcMVwxNDFcMVwzNzVcMVx1MDEwMFwxXDE0MVwxXDM3NVw2XDE0MVwxXDM3NVwzNFwxNDEiKwotICAgICJcMVx1MDEwMFwyMFwxNDFcMVwxNDJcMVwwXDFcdTAxMDFcMVx1MDEwMlwxXDE0MlwxXHUwMTAxIisKLSAgICAiXDRcMTQyXDFcdTAxMDFcMVwxNDJcMVwzNzdcMVx1MDEwM1wxXDE0MlwxXHUwMTAxXDZcMTQyIisKLSAgICAiXDFcdTAxMDFcMzRcMTQyXDFcdTAxMDNcMjBcMTQyXDJcMFwxXHUwMTA0XDEyM1wwXDFcMzUzIisKLSAgICAiXDJcMFwxXHUwMTA1XDY0XDBcNFwxNDdcNlwwXDFcMTQ3XDZcMFw1XDE0NyIrCi0gICAgIlwxXDBcMTNcMTQ3XDFcMFwxMlwxNDdcMVwwXDRcMTQ3XDFcMFwxMVwxNDciKwotICAgICJcNFwwXDFcdTAxMDZcMTA2XDBcMVwxNTFcMTFcMFwxXDE1MVw2XDBcMVwxNTEiKwotICAgICJcNjNcMFw0XDE1Mlw2XDBcMVwxNTJcNlwwXDVcMTUyXDFcMFwxM1wxNTIiKwotICAgICJcMVwwXDEyXDE1MlwxXDBcNFwxNTJcMVwwXDExXDE1MlwyXDBcMVwxNTQiKwotICAgICJcMlwwXDFcdTAxMDdcMVwxNTRcMVwwXDRcMTU0XDFcMFwxXDE1NFwxXDAiKwotICAgICJcMlwxNTRcMVwwXDZcMTU0XDFcMFw1NVwxNTRcMVx1MDEwOFwxXDBcMTBcdTAxMDgiKwotICAgICJcMVx1MDEwOVwyXHUwMTA4XDFcdTAxMGFcNDVcdTAxMDhcMVx1MDEwYVwyMFx1MDEwOFwxXHUwMTBiXDFcMCIrCi0gICAgIlwxMlx1MDEwYlwxXHUwMTA5XDFcdTAxMGNcNDVcdTAxMGJcMVx1MDEwY1wyMFx1MDEwYlwxXDE1NFwxXDAiKwotICAgICJcMVx1MDEwNlwxXHUwMTA3XDFcMTU0XDFcMFw0XDE1NFwxXDBcMVwxNTRcMVwwIisKLSAgICAiXDJcMTU0XDFcMFw2XDE1NFwxXDBcNTVcMTU0XDFcMTYxXDNcMFwyM1wxNjEiKwotICAgICJcNVwwXDFcMTYxXDEzXDBcMVwxNjFcMTJcMFwxXDE2MVw0XDBcMVwxNjEiKwotICAgICJcNFwwXDFcMTYxXDRcMFwyXDE2MVwzXDBcMVwzMzZcMTZcMFwxXDM1MyIrCi0gICAgIlwyXDBcMVwzNDFcNjBcMFwxXHUwMTBkXDEwMVwwXDFcMTYxXDNcMFwyXDE2MSIrCi0gICAgIlw0XDE2NVw2XDE2MVwxXDE2NVw2XDE2MVw1XDE2NlwxXDE2MVwxM1wxNjZcMVwxNjEiKwotICAgICJcMTJcMTY2XDFcMTYxXDRcMTY2XDFcMTYxXDRcMTY2XDFcMTY1XDRcMTY2XDJcMTYxIisKLSAgICAiXDZcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDdcMTY2XDFcdTAxMGVcM1wxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw1XDBcMVwzMzYiKwotICAgICJcNFwwXDJcdTAxMGZcMTBcMFwxXDM1M1wyXDBcMVwzNDFcMVwwXDVcdTAxMGYiKwotICAgICJcMVwwXDEzXHUwMTBmXDFcMFwxMlx1MDEwZlwxXDBcNFx1MDEwZlwxXDBcNFx1MDEwZiIrCi0gICAgIlwxXDBcNFx1MDEwZlwxMFwwXDRcMTcxXDZcMFwxXDE3MVw2XDBcNVwxNzEiKwotICAgICJcMVwwXDEzXDE3MVwxXDBcMTJcMTcxXDFcMFw0XDE3MVwxXDBcMTFcMTcxIisKLSAgICAiXDJcMFwxXDE3M1wyXDBcMVx1MDExMFwxXDE3M1wxXDBcNFwxNzNcMVwwIisKLSAgICAiXDFcMTczXDFcMFwyXDE3M1wxXDBcNlwxNzNcMVwwXDU1XDE3M1wzXDAiKwotICAgICJcMVwzMzZcNFwwXDJcdTAxMTFcMTBcMFwxXDM1M1wyXDBcMVwzNDFcMVwwIisKLSAgICAiXDVcdTAxMTFcMVwwXDEzXHUwMTExXDFcMFwxMlx1MDExMVwxXDBcNFx1MDExMVwxXDAiKwotICAgICJcNFx1MDExMVwxXDBcNFx1MDExMVwyXDBcMVwxNzNcMVwwXDFcdTAxMGRcMVx1MDExMCIrCi0gICAgIlwxXDE3M1wxXDBcNFwxNzNcMVwwXDFcMTczXDFcMFwyXDE3M1wxXDAiKwotICAgICJcNlwxNzNcMVwwXDU1XDE3M1wxXHUwMTEyXDFcMFwxMFx1MDExMlwxXHUwMTEzXDJcdTAxMTIiKwotICAgICJcMVx1MDExNFw0NVx1MDExMlwxXHUwMTE0XDIwXHUwMTEyXDFcdTAxMTVcMVwwXDEyXHUwMTE1XDFcdTAxMTMiKwotICAgICJcMVx1MDExNlw0NVx1MDExNVwxXHUwMTE2XDIwXHUwMTE1XDFcMTczXDJcMFwxXHUwMTEwXDFcMTczIisKLSAgICAiXDFcMFw0XDE3M1wxXDBcMVwxNzNcMVwwXDFcMTczXDFcdTAxMTdcMVwwIisKLSAgICAiXDZcMTczXDFcMFw1NlwxNzNcMlwwXDFcdTAxMTBcMVwxNzNcMVwwXDRcMTczIisKLSAgICAiXDFcMFwxXDE3M1wxXDBcMVwxNzNcMVx1MDExOFwxXDBcNlwxNzNcMVwwIisKLSAgICAiXDU1XDE3M1wzXDBcMVwzMzZcMTZcMFwxXDM1M1wyXDBcMVx1MDEwNVwxMjRcMCIrCi0gICAgIlwxXHUwMTE5XDJcMFwxXHUwMTE5XDcyXDBcMVx1MDExYVwxNFwwXDFcdTAxMWFcNjBcMCIrCi0gICAgIlwyXHUwMTFiXDUwXDBcMjNcdTAxMWNcMVx1MDExZFw2MFx1MDExY1w2XDBcNFwyMTBcNlwwIisKLSAgICAiXDFcMjEwXDZcMFw1XDIxMFwxXDBcMTNcMjEwXDFcMFwxMlwyMTBcMVwwIisKLSAgICAiXDRcMjEwXDFcMFwxMVwyMTBcNTRcMFwxXHUwMTFlXDEyMFwwXDFcdTAxMWZcMTBcMCIrCi0gICAgIlwxXHUwMTFmXDNcMFwxXDIxM1wyXDBcMVx1MDEyMFwxXDIxM1wxXDBcNFwyMTMiKwotICAgICJcMVwwXDFcMjEzXDFcMFwyXDIxM1wxXDBcNlwyMTNcMVwwXDU1XDIxMyIrCi0gICAgIlwxXHUwMTIxXDFcMFwxMFx1MDEyMVwxXHUwMTIyXDJcdTAxMjFcMVx1MDEyM1w0NVx1MDEyMVwxXHUwMTIzIisKLSAgICAiXDIwXHUwMTIxXDFcdTAxMjRcMVwwXDFcdTAxMjRcMlx1MDEyNVwxXHUwMTI0XDRcdTAxMjVcMlx1MDEyNCIrCi0gICAgIlwxXHUwMTI2XDFcdTAxMjdcMVx1MDEyNFw0XHUwMTI1XDFcdTAxMjRcMTBcdTAxMjVcMVx1MDEyNFwyNlx1MDEyNSIrCi0gICAgIlwxXHUwMTI3XDEwXHUwMTI1XDJcdTAxMjRcNFx1MDEyNVwyXHUwMTI0XDFcMjE3XDJcdTAxMWNcMVx1MDEyOCIrCi0gICAgIlwxXDIxN1wxXHUwMTFjXDRcMjE3XDFcdTAxMWNcMVwyMTdcMVx1MDExY1wyXDIxN1wxXHUwMTFjIisKLSAgICAiXDNcMjE3XDFcdTAxMjlcMlwyMTdcMVx1MDExY1w1NVwyMTdcMVwyMjBcMlwwXDFcdTAxMmEiKwotICAgICJcMVwyMjBcMVwwXDRcMjIwXDFcMFwxXDIyMFwxXDBcMlwyMjBcMVwwIisKLSAgICAiXDZcMjIwXDFcMFw1NVwyMjBcMTJcdTAxMmJcMVx1MDEyY1w3MVx1MDEyYlwxNFx1MDEyZFwxXHUwMTJjIisKLSAgICAiXDY3XHUwMTJkXDFcMjI0XDJcdTAxMWNcMVx1MDEyZVwxXDIyNFwxXHUwMTFjXDRcMjI0XDFcdTAxMWMiKwotICAgICJcMVwyMjRcMVx1MDExY1wyXDIyNFwxXHUwMTFjXDNcMjI0XDFcdTAxMmZcMlwyMjRcMVx1MDExYyIrCi0gICAgIlw1NVwyMjRcMVwyMjVcMlwwXDFcdTAxMzBcMVwyMjVcMVwwXDRcMjI1XDFcMCIrCi0gICAgIlwxXDIyNVwxXDBcMlwyMjVcMVwwXDZcMjI1XDFcMFw1NVwyMjVcMVx1MDEzMSIrCi0gICAgIlwxXDBcMTBcdTAxMzFcMVx1MDEzMlwyXHUwMTMxXDFcdTAxMzNcNDVcdTAxMzFcMVx1MDEzM1wyMFx1MDEzMSIrCi0gICAgIlwxXHUwMTM0XDFcMFwxXHUwMTM0XDJcdTAxMzVcMVx1MDEzNFw0XHUwMTM1XDJcdTAxMzRcMVx1MDEzNiIrCi0gICAgIlwxXHUwMTM3XDFcdTAxMzRcNFx1MDEzNVwxXHUwMTM0XDEwXHUwMTM1XDFcdTAxMzRcMjZcdTAxMzVcMVx1MDEzNyIrCi0gICAgIlwxMFx1MDEzNVwyXHUwMTM0XDRcdTAxMzVcMlx1MDEzNFwyXDIzMVwxXDBcMTAzXDIzMVwxXDAiKwotICAgICJcMTdcMjMxXDFcdTAxMzhcMlwyMzFcMVx1MDEzOVw1NlwyMzFcMVwyMzRcMlwwXDFcdTAxM2EiKwotICAgICJcMVwyMzRcMVwwXDRcMjM0XDFcMFwxXDIzNFwxXDBcMlwyMzRcMVwwIisKLSAgICAiXDZcMjM0XDFcMFw1NVwyMzRcMVx1MDEzYlwxXDBcMTBcdTAxM2JcMVx1MDEzY1wyXHUwMTNiIisKLSAgICAiXDFcdTAxM2RcNDVcdTAxM2JcMVx1MDEzZFwyMFx1MDEzYlwxXHUwMTNlXDFcMFwxXHUwMTNlXDJcdTAxM2YiKwotICAgICJcMVx1MDEzZVw0XHUwMTNmXDJcdTAxM2VcMVx1MDE0MFwxXHUwMTQxXDFcdTAxM2VcNFx1MDEzZlwxXHUwMTNlIisKLSAgICAiXDEwXHUwMTNmXDFcdTAxM2VcMjZcdTAxM2ZcMVx1MDE0MVwxMFx1MDEzZlwyXHUwMTNlXDRcdTAxM2ZcMlx1MDEzZSIrCi0gICAgIlwyXDI0MFwxXDBcMTAzXDI0MFwxXDBcMTdcMjQwXDFcdTAxNDJcMlwyNDBcMVx1MDE0MyIrCi0gICAgIlw1NlwyNDBcMjJcMFwxXDM0MFwyXDBcMVwzNTRcNjVcMFwxXHUwMTQ0XDc0XDAiKwotICAgICJcMVwyNTFcMVwwXDEyXDI1MVwxXDBcMVx1MDE0NVw0NVwyNTFcMVx1MDE0NVwyMFwyNTEiKwotICAgICJcM1wwXDFcdTAxNDZcMTZcMFwxXDM1M1wyXDBcMVwzNTRcNTZcMFwxXDI1MSIrCi0gICAgIlwxXDBcM1wyNTFcMVwyNTNcNlwyNTFcMVwwXDFcdTAxNDVcMVwyNTFcMVwyNTMiKwotICAgICJcNlwyNTFcMVwyNTNcMzRcMjUxXDFcdTAxNDVcMzZcMjUxXDFcdTAxNDdcMTAzXDI1MVwxXHUwMTQ4IisKLSAgICAiXDY1XDI1MVwxXDI1N1wxXDBcMTBcMjU3XDFcMFwyXDI1N1wxXHUwMTQ5XDQ1XDI1NyIrCi0gICAgIlwxXHUwMTQ5XDIxXDI1N1wxXDBcM1wyNTdcMVwyNjBcNFwyNTdcMVwwXDJcMjU3IisKLSAgICAiXDFcdTAxNDlcMVwyNTdcMVwyNjBcNlwyNTdcMVwyNjBcMzRcMjU3XDFcdTAxNDlcMzZcMjU3IisKLSAgICAiXDFcdTAxNGFcMTAzXDI1N1wxXHUwMTRiXDY1XDI1N1wxMlwyNjRcMVwwXDFcMjY0XDFcMCIrCi0gICAgIlwxXHUwMTRjXDY1XDI2NFwxXDBcMTJcMjY0XDFcMFwxXDI2NFwxXDBcMVx1MDE0YyIrCi0gICAgIlw0XDI2NFwxXHUwMTRkXDYwXDI2NFwxXDBcMTJcMjY0XDFcMFwxXDI2NFwxXDAiKwotICAgICJcMVwyNjRcMVx1MDE0ZVw2NFwyNjRcMVx1MDE0ZlwxNFx1MDE1MFwxXHUwMTUxXDEwM1x1MDE1MFwxXHUwMTUxIisKLSAgICAiXDVcdTAxNTBcMVx1MDE1MlwyXHUwMTUwXDFcdTAxNTNcNTZcdTAxNTBcMTJcdTAxNTRcMVx1MDE1NVwxMDNcdTAxNTQiKwotICAgICJcMVx1MDE1NVw3XHUwMTU0XDFcdTAxNTZcMlx1MDE1NFwxXHUwMTU3XDU2XHUwMTU0XDEyXDMwMlwxXDAiKwotICAgICJcNjdcMzAyXDFcdTAxNThcMVwwXDEyXDMwMlwxXDBcN1wzMDJcMVx1MDE1OVw1N1wzMDIiKwotICAgICJcMVx1MDE1OFwxXDBcMTJcMzAyXDFcdTAxNWFcNzFcMzAyXDE0XDMwNlwxXDBcNjVcMzA2IisKLSAgICAiXDFcdTAxNWJcMVwwXDE0XDMwNlwxXDBcNVwzMDZcMVx1MDE1Y1w1N1wzMDZcMVx1MDE1YiIrCi0gICAgIlwxXDBcMTRcMzA2XDFcdTAxNWRcNjdcMzA2XDEyXDMxMVwxXDBcMVwzMTFcMVwwIisKLSAgICAiXDY2XDMxMVwxXDBcMTJcMzExXDFcMFwxXDMxMVwxXDBcNVwzMTFcMVx1MDE1ZSIrCi0gICAgIlw2MFwzMTFcMVwwXDEyXDMxMVwxXDBcMVwzMTFcMVwwXDFcMzExXDFcdTAxNWYiKwotICAgICJcNjRcMzExXDFcMFwxNFx1MDE2MFwxXHUwMTYxXDEwM1x1MDE2MFwxXHUwMTYxXDVcdTAxNjBcMVx1MDE2MiIrCi0gICAgIlwyXHUwMTYwXDFcdTAxNjNcNTZcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwxMDNcdTAxNjRcMVx1MDE2NVw3XHUwMTY0IisKLSAgICAiXDFcdTAxNjZcMlx1MDE2NFwxXHUwMTY3XDU2XHUwMTY0XDEyXDMyN1wxXDBcNjdcMzI3XDFcdTAxNjgiKwotICAgICJcMVwwXDEyXDMyN1wxXDBcN1wzMjdcMVx1MDE2OVw1N1wzMjdcMVx1MDE2OFwxXDAiKwotICAgICJcMTJcMzI3XDFcdTAxNmFcNzFcMzI3XDE0XDMzM1wxXDBcNjVcMzMzXDFcdTAxNmJcMVwwIisKLSAgICAiXDE0XDMzM1wxXDBcNVwzMzNcMVx1MDE2Y1w1N1wzMzNcMVx1MDE2YlwxXDBcMTRcMzMzIisKLSAgICAiXDFcdTAxNmRcNjdcMzMzXDdcMFwxXHUwMTZlXDExXDBcMVx1MDE2ZlwzXDBcMVx1MDE3MCIrCi0gICAgIlwyMlwwXDFcdTAxNzFcNDJcMFwxXHUwMTcyXDI0XDBcMVx1MDE3M1w1NFwwXDFcMzQyIisKLSAgICAiXDJcMFwyXHUwMTc0XDVcMFwxXDM0Mlw2XDBcMVwzNDJcNVx1MDE3NFwxXDAiKwotICAgICJcMTNcdTAxNzRcMVwwXDEyXHUwMTc0XDFcMFw0XHUwMTc0XDFcMFw0XHUwMTc0XDFcMCIrCi0gICAgIlw0XHUwMTc0XDJcMFwxXHUwMTc1XDFcMFwzXHUwMTc1XDFcdTAxNzZcNFwzNDNcMVx1MDE3NSIrCi0gICAgIlwxXDBcM1x1MDE3NVwxXHUwMTc2XDFcMzQzXDFcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3NiIrCi0gICAgIlw1XDM0M1wxXHUwMTc1XDEzXDM0M1wxXHUwMTc1XDEyXDM0M1wxXHUwMTc1XDRcMzQzXDFcdTAxNzciKwotICAgICJcMTFcMzQzXDJcdTAxNzVcMjBcMFwxXHUwMTc4XDdcMFwxXHUwMTc5XDcwXDBcMVwzNDYiKwotICAgICJcNjZcMFwxMDNcMzQ3XDFcdTAxN2FcMVx1MDE3NVwxXDBcM1x1MDE3NVwxXHUwMTc2XDRcMzUwIisKLSAgICAiXDFcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3NlwxXDM1MFwxXHUwMTc1XDFcMFwzXHUwMTc1IisKLSAgICAiXDFcdTAxNzZcNVwzNTBcMVx1MDE3NVwxM1wzNTBcMVx1MDE3NVwxMlwzNTBcMVx1MDE3NVw0XDM1MCIrCi0gICAgIlwxXHUwMTdiXDExXDM1MFwyXHUwMTc1XDEwM1wzNTFcMVx1MDE3Y1w2M1wwXDFcMzUyXDI3XDAiKwotICAgICJcMVx1MDE2ZVwxNVwwXDFcdTAxNzBcMjJcMFwxXHUwMTcxXDY3XDBcMVx1MDE3M1w1MVwwIisKLSAgICAiXDFcdTAxN2RcMTAzXDBcMVx1MDE3ZVwxMDdcMFw0XDExM1w2XDBcMVwxMTNcNlwwIisKLSAgICAiXDNcMTEzXDJcdTAxN2ZcMVwwXDEzXDExM1wxXDBcMTJcMTEzXDFcMFw0XDExMyIrCi0gICAgIlwxXDBcMTFcMTEzXDEwXDBcNFwxMTNcNlwwXDFcMTEzXDZcMFw1XDExMyIrCi0gICAgIlwxXDBcMTNcMTEzXDFcMFwyXDExM1wxXHUwMTgwXDdcMTEzXDFcMFw0XDExMyIrCi0gICAgIlwxXDBcNlwxMTNcMVx1MDE4MFwyXDExM1wyXDBcMTJcMzY1XDFcMzY2XDNcMzY1IisKLSAgICAiXDFcMFw2NVwzNjVcMTRcMzcwXDFcMzY2XDFcMzcwXDFcMFw2NVwzNzBcMVwzNzUiKwotICAgICJcMVwwXDEwXDM3NVwxXDM3N1wyXDM3NVwxXHUwMTgxXDQ1XDM3NVwxXHUwMTgxXDIwXDM3NSIrCi0gICAgIlwxXDE0MVwyXDM3NVwxXDM3NlwxXDE0MVwxXDM3NVw0XDE0MVwxXDM3N1wxXDE0MSIrCi0gICAgIlwxXDM3NVwxXDE0MVwxXDEzN1wxXDM3NVw2XDE0MVwxXDM3NVw1NVwxNDFcMVx1MDEwMSIrCi0gICAgIlwxXDBcMTJcdTAxMDFcMVwzNzdcMVx1MDE4Mlw0NVx1MDEwMVwxXHUwMTgyXDIwXHUwMTAxXDFcMTQyIisKLSAgICAiXDJcdTAxMDFcMVx1MDEwMlwxXDE0MlwxXHUwMTAxXDRcMTQyXDFcdTAxMDFcMVwxNDJcMVwzNzciKwotICAgICJcMVwxNDJcMVwxMzdcMVx1MDEwMVw2XDE0MlwxXHUwMTAxXDU1XDE0MlwxMlx1MDEwOFwxXHUwMTA5IisKLSAgICAiXDNcdTAxMDhcMVwwXDY1XHUwMTA4XDE0XHUwMTBiXDFcdTAxMDlcMVx1MDEwYlwxXDBcNjVcdTAxMGIiKwotICAgICJcNlwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcNlwxNjZcMVx1MDE4M1wyXDE2NiIrCi0gICAgIlwxMFwwXDRcdTAxMGZcNlwwXDFcdTAxMGZcNlwwXDVcdTAxMGZcMVwwXDEzXHUwMTBmIisKLSAgICAiXDFcMFwxMlx1MDEwZlwxXDBcNFx1MDEwZlwxXDBcMTFcdTAxMGZcMTBcMFw0XHUwMTExIisKLSAgICAiXDZcMFwxXHUwMTExXDZcMFw1XHUwMTExXDFcMFwxM1x1MDExMVwxXDBcMTJcdTAxMTEiKwotICAgICJcMVwwXDRcdTAxMTFcMVwwXDExXHUwMTExXDJcMFwxMlx1MDExMlwxXHUwMTEzXDNcdTAxMTIiKwotICAgICJcMVwwXDY1XHUwMTEyXDE0XHUwMTE1XDFcdTAxMTNcMVx1MDExNVwxXDBcNjVcdTAxMTVcMVx1MDE4NCIrCi0gICAgIlwyXHUwMTg1XDFcdTAxODZcMVx1MDE4NFwxXHUwMTg1XDRcdTAxODRcMVx1MDE4NVwxXHUwMTg0XDFcdTAxODUiKwotICAgICJcMlx1MDE4NFwxXHUwMTg1XDZcdTAxODRcMVx1MDE4NVw1NFx1MDE4NFwxXDE3M1wxXHUwMTg3XDJcdTAxODgiKwotICAgICJcMVx1MDE4OVwxXHUwMTg3XDFcdTAxODhcNFx1MDE4N1wxXHUwMTg4XDFcdTAxODdcMVx1MDE4OFwyXHUwMTg3IisKLSAgICAiXDFcdTAxODhcNlx1MDE4N1wxXHUwMTg4XDU0XHUwMTg3XDFcMTczXDM1XDBcMVx1MDE4YVwzNFwwIisKLSAgICAiXDFcdTAxOGFcNTFcMFwxXHUwMThiXDE0XDBcMVx1MDE4Ylw3MFwwXDFcdTAxOGNcMTFcMCIrCi0gICAgIlwxXHUwMThjXDczXDBcMVx1MDE4ZFwxN1wwXDFcdTAxOGRcMTEwXDBcMVx1MDE4ZVw3XDAiKwotICAgICJcMVx1MDE4ZVwyXDBcMTJcdTAxMjFcMVx1MDEyMlwzXHUwMTIxXDFcMFw2NVx1MDEyMVwxXHUwMTI0IisKLSAgICAiXDFcMFwxMlx1MDEyNFwxXHUwMTIyXDFcdTAxOGZcNDVcdTAxMjRcMVx1MDE4ZlwyMVx1MDEyNFwxXDAiKwotICAgICJcMTJcdTAxMjRcMVx1MDE5MFwxXHUwMThmXDQ1XHUwMTI0XDFcdTAxOGZcMjBcdTAxMjRcMTRcMFwxXHUwMTkxIisKLSAgICAiXDY3XDBcMTRcdTAxMjRcMVx1MDE5MFwxXHUwMTI0XDFcMFw2NVx1MDEyNFwxMlx1MDEzMVwxXHUwMTMyIisKLSAgICAiXDNcdTAxMzFcMVwwXDY1XHUwMTMxXDFcdTAxMzRcMVwwXDEyXHUwMTM0XDFcdTAxMzJcMVx1MDE5MiIrCi0gICAgIlw0NVx1MDEzNFwxXHUwMTkyXDIxXHUwMTM0XDFcMFwxMlx1MDEzNFwxXHUwMTkzXDFcdTAxOTJcNDVcdTAxMzQiKwotICAgICJcMVx1MDE5MlwyMFx1MDEzNFwxNFwwXDFcdTAxOTRcNjdcMFwxNFx1MDEzNFwxXHUwMTkzXDFcdTAxMzQiKwotICAgICJcMVwwXDY1XHUwMTM0XDJcMjMxXDFcMFw0XDIzMVwxXHUwMTk1XDE1XDIzMVwxXHUwMTk2IisKLSAgICAiXDIyXDIzMVwxXHUwMTk3XDM1XDIzMVwxXDBcMzFcMjMxXDFcdTAxOThcNDdcMjMxXDEyXHUwMTNiIisKLSAgICAiXDFcdTAxM2NcM1x1MDEzYlwxXDBcNjVcdTAxM2JcMVx1MDEzZVwxXDBcMTJcdTAxM2VcMVx1MDEzYyIrCi0gICAgIlwxXHUwMTk5XDQ1XHUwMTNlXDFcdTAxOTlcMjFcdTAxM2VcMVwwXDEyXHUwMTNlXDFcdTAxOWFcMVx1MDE5OSIrCi0gICAgIlw0NVx1MDEzZVwxXHUwMTk5XDIwXHUwMTNlXDE0XDBcMVx1MDE5Ylw2N1wwXDE0XHUwMTNlXDFcdTAxOWEiKwotICAgICJcMVx1MDEzZVwxXDBcNjVcdTAxM2VcMlwyNDBcMVwwXDRcMjQwXDFcdTAxOWNcMTVcMjQwIisKLSAgICAiXDFcdTAxOWRcMjJcMjQwXDFcdTAxOWVcMzVcMjQwXDFcMFwzMVwyNDBcMVx1MDE5Zlw0N1wyNDAiKwotICAgICJcMjJcMFwxXHUwMWEwXDYxXDBcMTZcMjUxXDFcMFw2NVwyNTFcMTZcMjU3XDFcMCIrCi0gICAgIlw2NVwyNTdcMTJcMjY0XDFcMFwxXDI2NFwxXDBcMVwyNjRcMVx1MDFhMVw2NFwyNjQiKwotICAgICJcMVx1MDE0Zlw3XDI2NFwxXHUwMWEyXDJcMjY0XDFcMFwxXDI2NFwxXDBcMVx1MDE0YyIrCi0gICAgIlw3XDI2NFwxXHUwMWEzXDIyXDI2NFwxXHUwMWE0XDMyXDI2NFwxXDBcMTJcdTAxYTFcMVwwIisKLSAgICAiXDFcdTAxYTFcMVwwXDY2XHUwMWExXDFcMFwxMlx1MDE0ZlwxXDBcMVx1MDE0ZlwxXDAiKwotICAgICJcMVx1MDFhNVw2NVx1MDE0ZlwxXDBcN1x1MDE1MFwxXHUwMWE2XDRcdTAxNTBcMVx1MDE1MVwxMFx1MDE1MCIrCi0gICAgIlwxXHUwMWE3XDIyXHUwMTUwXDFcdTAxYThcNDdcdTAxNTBcMVx1MDE1MVwxN1x1MDE1MFwxXHUwMWE5XDQ3XHUwMTUwIisKLSAgICAiXDdcdTAxNTRcMVx1MDFhYVwyXHUwMTU0XDFcdTAxNTVcMTJcdTAxNTRcMVx1MDFhYlwyMlx1MDE1NFwxXHUwMWFjIisKLSAgICAiXDQ1XHUwMTU0XDFcdTAxNTVcMjFcdTAxNTRcMVx1MDFhZFw0N1x1MDE1NFwxMlwzMDJcMVwwXDEwMFwzMDIiKwotICAgICJcMVx1MDFhZVwyXDMwMlwxXDBcMTJcMzAyXDFcdTAxYWZcMjJcMzAyXDFcdTAxYjBcMzFcMzAyIisKLSAgICAiXDFcdTAxNThcMVwwXDEwMlx1MDFiMVwxXHUwMWIyXDFcdTAxYjFcMTRcMzA2XDFcMFw3NlwzMDYiKwotICAgICJcMVx1MDFiM1w0XDMwNlwxXDBcMTBcMzA2XDFcdTAxYjRcMjJcMzA2XDFcdTAxYjVcMzFcMzA2IisKLSAgICAiXDFcdTAxNWJcMVwwXDEwMlx1MDFiNlwxXHUwMWI3XDFcdTAxYjZcN1wzMTFcMVx1MDFiOFwyXDMxMSIrCi0gICAgIlwxXDBcMVwzMTFcMVwwXDEwXDMxMVwxXHUwMWI5XDIyXDMxMVwxXHUwMWJhXDMyXDMxMSIrCi0gICAgIlwxXDBcN1x1MDE2MFwxXHUwMWJiXDRcdTAxNjBcMVx1MDE2MVwxMFx1MDE2MFwxXHUwMWJjXDIyXHUwMTYwIisKLSAgICAiXDFcdTAxYmRcNDdcdTAxNjBcMVx1MDE2MVwxN1x1MDE2MFwxXHUwMWJlXDQ3XHUwMTYwXDdcdTAxNjRcMVx1MDFiZiIrCi0gICAgIlwyXHUwMTY0XDFcdTAxNjVcMTJcdTAxNjRcMVx1MDFjMFwyMlx1MDE2NFwxXHUwMWMxXDQ1XHUwMTY0XDFcdTAxNjUiKwotICAgICJcMjFcdTAxNjRcMVx1MDFjMlw0N1x1MDE2NFwxMlwzMjdcMVwwXDEwMFwzMjdcMVx1MDFjM1wyXDMyNyIrCi0gICAgIlwxXDBcMTJcMzI3XDFcdTAxYzRcMjJcMzI3XDFcdTAxYzVcMzFcMzI3XDFcdTAxNjhcMVwwIisKLSAgICAiXDEwMlx1MDFjNlwxXHUwMWM3XDFcdTAxYzZcMTRcMzMzXDFcMFw3NlwzMzNcMVx1MDFjOFw0XDMzMyIrCi0gICAgIlwxXDBcMTBcMzMzXDFcdTAxYzlcMjJcMzMzXDFcdTAxY2FcMzFcMzMzXDFcdTAxNmJcMVwwIisKLSAgICAiXDEwMlx1MDFjYlwxXHUwMWNjXDFcdTAxY2JcN1wwXDFcdTAxY2RcMTAzXDBcMVx1MDFjZVwxMzFcMCIrCi0gICAgIlwxXHUwMWNmXDQ2XDBcMVx1MDE3NFwxXDBcMTFcdTAxNzRcMVwwXDZcdTAxNzRcMVwwIisKLSAgICAiXDYxXHUwMTc0XDFcdTAxNzVcMVwwXDExXHUwMTc1XDFcMFw2XHUwMTc1XDFcMFw0NVx1MDE3NSIrCi0gICAgIlwxXDBcMTRcdTAxNzVcMVwwXDNcdTAxNzVcMVx1MDE3Nlw1XHUwMTc1XDFcMFwzXHUwMTc1IisKLSAgICAiXDFcdTAxNzZcMlx1MDE3NVwxXDBcM1x1MDE3NVwxXHUwMTc2XDQxXHUwMTc1XDFcdTAxZDBcMTNcdTAxNzUiKwotICAgICJcMjBcMFwxXHUwMTc4XDQ3XDBcMVx1MDFkMVwzM1wwXDFcdTAxZDJcMTRcMFwzXHUwMWQyIisKLSAgICAiXDJcMFwxXHUwMWQyXDExXDBcMVx1MDFkMlwxXDBcMlx1MDFkMlw2XDBcMVx1MDFkMiIrCi0gICAgIlwyXDBcMlx1MDFkMlw2XDBcMVx1MDFkMlwxMFwwXDRcMTEzXDZcMFwxXDExMyIrCi0gICAgIlw2XDBcNVwxMTNcMVwwXDExXDExM1wxXHUwMWQzXDFcMTEzXDFcMFwxXHUwMWQzIisKLSAgICAiXDExXDExM1wxXDBcNFwxMTNcMVwwXDExXDExM1wyXDBcMTJcMzc1XDFcMzc3IisKLSAgICAiXDNcMzc1XDFcMFw2NVwzNzVcMTRcdTAxMDFcMVwzNzdcMVx1MDEwMVwxXDBcNjVcdTAxMDEiKwotICAgICJcNlwwXDNcMTY2XDFcdTAxZDRcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDAiKwotICAgICJcMTNcMTY2XDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMlwwIisKLSAgICAiXDFcdTAxODRcMlx1MDE4NVwxXHUwMTg2XDFcdTAxODRcMVx1MDE4NVw0XHUwMTg0XDFcdTAxODVcMVx1MDE4NCIrCi0gICAgIlwxXHUwMTg1XDJcdTAxODRcMVx1MDE4NVw2XHUwMTg0XDFcdTAxODVcNTRcdTAxODRcMVx1MDFkNVwxMDNcdTAxODUiKwotICAgICJcMVx1MDFkNlwxXHUwMTg3XDJcdTAxODhcMVx1MDE4OVwxXHUwMTg3XDFcdTAxODhcNFx1MDE4N1wxXHUwMTg4IisKLSAgICAiXDFcdTAxODdcMVx1MDE4OFwyXHUwMTg3XDFcdTAxODhcNlx1MDE4N1wxXHUwMTg4XDU0XHUwMTg3XDFcdTAxZDUiKwotICAgICJcMTAzXHUwMTg4XDFcdTAxZDdcNDBcMFwxXHUwMWQ4XDE0XDBcMVx1MDFkOFw2MFwwXDJcdTAxZDkiKwotICAgICJcMTAxXDBcMVx1MDFkYVwxMTJcMFwxXHUwMWRiXDE0XDBcMVx1MDFkYlw2MFwwXDJcdTAxZGMiKwotICAgICJcNTBcMFwxNFx1MDEyNFwxXHUwMTIyXDFcdTAxMjRcMVwwXDY1XHUwMTI0XDNcMFwyXHUwMWRkIisKLSAgICAiXDFcMFw0XHUwMWRkXDJcMFwxXHUwMTI2XDFcdTAxZGRcMVwwXDRcdTAxZGRcMVwwIisKLSAgICAiXDEwXHUwMWRkXDFcMFwzN1x1MDFkZFwyXDBcNFx1MDFkZFwyXDBcMTRcdTAxMzRcMVx1MDEzMiIrCi0gICAgIlwxXHUwMTM0XDFcMFw2NVx1MDEzNFwzXDBcMlx1MDFkZVwxXDBcNFx1MDFkZVwyXDAiKwotICAgICJcMVx1MDEzNlwxXHUwMWRlXDFcMFw0XHUwMWRlXDFcMFwxMFx1MDFkZVwxXDBcMzdcdTAxZGUiKwotICAgICJcMlwwXDRcdTAxZGVcMlwwXDJcMjMxXDFcMFw0XDIzMVwxXHUwMWRmXDc2XDIzMSIrCi0gICAgIlwxXDBcMzJcMjMxXDFcdTAxZTBcNDZcMjMxXDE0XHUwMTNlXDFcdTAxM2NcMVx1MDEzZVwxXDAiKwotICAgICJcNjVcdTAxM2VcM1wwXDJcdTAxZTFcMVwwXDRcdTAxZTFcMlwwXDFcdTAxNDBcMVx1MDFlMSIrCi0gICAgIlwxXDBcNFx1MDFlMVwxXDBcMTBcdTAxZTFcMVwwXDM3XHUwMWUxXDJcMFw0XHUwMWUxIisKLSAgICAiXDJcMFwyXDI0MFwxXDBcNFwyNDBcMVx1MDFlMlw3NlwyNDBcMVwwXDMyXDI0MCIrCi0gICAgIlwxXHUwMWUzXDQ2XDI0MFwyXDBcMVx1MDFlNFwxMDFcMFw3XDI2NFwxXHUwMWU1XDJcMjY0IisKLSAgICAiXDFcMFwxXDI2NFwxXDBcMVx1MDE0Y1w2NVwyNjRcMVwwXDEyXHUwMTRmXDFcMCIrCi0gICAgIlwxXHUwMTRmXDFcMFwxXHUwMTRmXDFcMFw2NVx1MDE0Zlw3XHUwMTUwXDFcdTAxZTZcNFx1MDE1MCIrCi0gICAgIlwxXHUwMTUxXDEwM1x1MDE1MFwxXHUwMTUxXDIwXHUwMTUwXDFcdTAxZTdcNDZcdTAxNTBcN1x1MDE1NFwxXHUwMWU4IisKLSAgICAiXDJcdTAxNTRcMVx1MDE1NVwxMDNcdTAxNTRcMVx1MDE1NVwyMlx1MDE1NFwxXHUwMWU5XDQ2XHUwMTU0XDdcMzAyIisKLSAgICAiXDFcdTAxZWFcMlwzMDJcMVwwXDY3XDMwMlwxXHUwMTU4XDFcMFwxMlx1MDFlYlwxXHUwMWVjIisKLSAgICAiXDcwXHUwMWViXDFcMFw3XDMwNlwxXHUwMWVkXDRcMzA2XDFcMFw2NVwzMDZcMVx1MDE1YiIrCi0gICAgIlwxXDBcMTRcdTAxZWVcMVx1MDFlY1w2Nlx1MDFlZVwxXDBcN1wzMTFcMVx1MDFlZlwyXDMxMSIrCi0gICAgIlwxXDBcMVwzMTFcMVwwXDY2XDMxMVwxXDBcN1x1MDE2MFwxXHUwMWYwXDRcdTAxNjAiKwotICAgICJcMVx1MDE2MVwxMDNcdTAxNjBcMVx1MDE2MVwyMFx1MDE2MFwxXHUwMWYxXDQ2XHUwMTYwXDdcdTAxNjRcMVx1MDFmMiIrCi0gICAgIlwyXHUwMTY0XDFcdTAxNjVcMTAzXHUwMTY0XDFcdTAxNjVcMjJcdTAxNjRcMVx1MDFmM1w0Nlx1MDE2NFw3XDMyNyIrCi0gICAgIlwxXHUwMWY0XDJcMzI3XDFcMFw2N1wzMjdcMVx1MDE2OFwxXDBcMTJcdTAxZjVcMVx1MDFmNiIrCi0gICAgIlw3MFx1MDFmNVwxXDBcN1wzMzNcMVx1MDFmN1w0XDMzM1wxXDBcNjVcMzMzXDFcdTAxNmIiKwotICAgICJcMVwwXDE0XHUwMWY4XDFcdTAxZjZcNjZcdTAxZjhcMzdcMFwxXHUwMWY5XDEzNVwwXDFcdTAxZDAiKwotICAgICJcMzNcMFwxXHUwMWQyXDE0XDBcM1x1MDFkMlwyXDBcMVx1MDFkMlwxMVwwXDFcdTAxZDIiKwotICAgICJcMVwwXDJcdTAxZDJcNlwwXDFcdTAxZDJcMVwwXDFcdTAxZDFcMlx1MDFkMlw2XDAiKwotICAgICJcMVx1MDFkMlwxMFwwXDRcMTEzXDZcMFwxXDExM1w2XDBcNVwxMTNcMVwwIisKLSAgICAiXDZcMTEzXDFcdTAxZmFcNFwxMTNcMVwwXDEyXDExM1wxXDBcMVwxMTNcMVx1MDFmYSIrCi0gICAgIlwyXDExM1wxXDBcMTFcMTEzXDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMCIrCi0gICAgIlw1XDE2NlwxXDBcNlwxNjZcMVx1MDFmYlw0XDE2NlwxXDBcNlwxNjZcMVx1MDFmYyIrCi0gICAgIlwzXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw1NFwwXDFcdTAxZmRcNzZcMCIrCi0gICAgIlwxXHUwMWZlXDEzXDBcMVx1MDFmZVw2NFwwXDFcdTAxZmZcMTFcMFwxXHUwMWZmXDcxXDAiKwotICAgICJcMVx1MDIwMFwxMVwwXDFcdTAyMDBcNzRcMFwxXHUwMjAxXDEzXDBcMVx1MDIwMVwyMlwwIisKLSAgICAiXDJcMjMxXDFcMFwzM1wyMzFcMVx1MDIwMlw0NVwyMzFcMlwyNDBcMVwwXDMzXDI0MCIrCi0gICAgIlwxXHUwMjAzXDQ1XDI0MFwxNFx1MDE1MFwxXHUwMTUxXDIxXHUwMTUwXDFcdTAyMDRcNDVcdTAxNTBcMTJcdTAxNTQiKwotICAgICJcMVx1MDE1NVwyM1x1MDE1NFwxXHUwMjA1XDQ1XHUwMTU0XDEyXHUwMWViXDFcdTAxYjFcNjdcdTAxZWJcMVx1MDIwNiIrCi0gICAgIlwxXHUwMWIxXDE0XHUwMWVlXDFcdTAxYjZcNjVcdTAxZWVcMVx1MDIwN1wxXHUwMWI2XDE0XHUwMTYwXDFcdTAxNjEiKwotICAgICJcMjFcdTAxNjBcMVx1MDIwOFw0NVx1MDE2MFwxMlx1MDE2NFwxXHUwMTY1XDIzXHUwMTY0XDFcdTAyMDlcNDVcdTAxNjQiKwotICAgICJcMTJcdTAxZjVcMVx1MDFjNlw2N1x1MDFmNVwxXHUwMjBhXDFcdTAxYzZcMTRcdTAxZjhcMVx1MDFjYlw2NVx1MDFmOCIrCi0gICAgIlwxXHUwMjBiXDFcdTAxY2JcMzdcMFwxXHUwMjBjXDUyXDBcNFwxMTNcNlwwXDFcMTEzIisKLSAgICAiXDZcMFw1XDExM1wxXDBcM1wxMTNcMVx1MDIwZFw3XDExM1wxXDBcNFwxMTMiKwotICAgICJcMVx1MDIwZFw1XDExM1wxXDBcNFwxMTNcMVwwXDExXDExM1wxMFwwXDRcMTY2IisKLSAgICAiXDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDExXDE2NlwxXHUwMjBlXDFcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDIwZlwyXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDU1XDBcMVx1MDIxMCIrCi0gICAgIlwyM1wwXDFcdTAyMTBcNTBcMFwxXHUwMjExXDE3XDBcMVx1MDIxMVw2NlwwXDFcdTAyMTIiKwotICAgICJcMTJcMFwxXHUwMjEyXDUyXDBcMVx1MDIxM1wxMDdcMFwxXHUwMjE0XDM0XDBcMVx1MDIxNCIrCi0gICAgIlwxMVwwXDJcMjMxXDFcMFwzNFwyMzFcMVx1MDIxNVw0NFwyMzFcMlwyNDBcMVwwIisKLSAgICAiXDM0XDI0MFwxXHUwMjE2XDQ0XDI0MFwxNFx1MDE1MFwxXHUwMTUxXDIyXHUwMTUwXDFcdTAyMTdcNDRcdTAxNTAiKwotICAgICJcMTJcdTAxNTRcMVx1MDE1NVwyNFx1MDE1NFwxXHUwMjE4XDQ0XHUwMTU0XDEyXHUwMWViXDFcdTAyMTlcNjdcdTAxZWIiKwotICAgICJcMVx1MDIwNlwxXHUwMWIxXDE0XHUwMWVlXDFcdTAyMWFcNjVcdTAxZWVcMVx1MDIwN1wxXHUwMWI2XDE0XHUwMTYwIisKLSAgICAiXDFcdTAxNjFcMjJcdTAxNjBcMVx1MDIxYlw0NFx1MDE2MFwxMlx1MDE2NFwxXHUwMTY1XDI0XHUwMTY0XDFcdTAyMWMiKwotICAgICJcNDRcdTAxNjRcMTJcdTAxZjVcMVx1MDIxZFw2N1x1MDFmNVwxXHUwMjBhXDFcdTAxYzZcMTRcdTAxZjhcMVx1MDIxZSIrCi0gICAgIlw2NVx1MDFmOFwxXHUwMjBiXDFcdTAxY2JcNDBcMFwxXHUwMjFmXDUxXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTFcMTY2XDFcdTAyMjBcMVwxNjZcMVwwIisKLSAgICAiXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMCIrCi0gICAgIlwxXDE2Nlw2XDBcNVwxNjZcMVwwXDZcMTY2XDFcdTAyMjFcNFwxNjZcMVwwIisKLSAgICAiXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw0NFwwXDFcdTAyMjJcMTFcMCIrCi0gICAgIlwxXHUwMjIyXDY3XDBcMVx1MDIyM1wxNFwwXDFcdTAyMjNcNjZcMFwxXHUwMjI0XDE0XDAiKwotICAgICJcMVx1MDIyNFwyNlwwXDJcMjMxXDFcMFwzNVwyMzFcMVx1MDIyNVw0M1wyMzFcMlwyNDAiKwotICAgICJcMVwwXDM1XDI0MFwxXHUwMjI2XDQzXDI0MFwxNFx1MDE1MFwxXHUwMTUxXDIzXHUwMTUwXDFcdTAyMjciKwotICAgICJcNDNcdTAxNTBcMTJcdTAxNTRcMVx1MDE1NVwyNVx1MDE1NFwxXHUwMjI4XDQzXHUwMTU0XDE0XHUwMTYwXDFcdTAxNjEiKwotICAgICJcMjNcdTAxNjBcMVx1MDIyOVw0M1x1MDE2MFwxMlx1MDE2NFwxXHUwMTY1XDI1XHUwMTY0XDFcdTAyMmFcNDNcdTAxNjQiKwotICAgICJcMzdcMFwxXHUwMjJiXDUyXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjJjXDVcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcNVwxNjZcMVx1MDIyZFw1XDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDJcMFwyXDIzMVwxXDBcMzRcMjMxXDFcdTAyMmVcNDRcMjMxIisKLSAgICAiXDJcMjQwXDFcMFwzNFwyNDBcMVx1MDIyZlw0NFwyNDBcMTRcdTAxNTBcMVx1MDE1MVwyMlx1MDE1MCIrCi0gICAgIlwxXHUwMjMwXDQ0XHUwMTUwXDEyXHUwMTU0XDFcdTAxNTVcMjRcdTAxNTRcMVx1MDIzMVw0NFx1MDE1NFwxNFx1MDE2MCIrCi0gICAgIlwxXHUwMTYxXDIyXHUwMTYwXDFcdTAyMzJcNDRcdTAxNjBcMTJcdTAxNjRcMVx1MDE2NVwyNFx1MDE2NFwxXHUwMjMzIisKLSAgICAiXDQ0XHUwMTY0XDM0XDBcMVx1MDIzNFw1NVwwXDRcMTY2XDZcMFwxXDE2Nlw2XDAiKwotICAgICJcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcMVwxNjZcMVx1MDIzNVw3XDE2NlwyXDBcMlwyMzFcMVwwXDMxXDIzMVwxXHUwMjM2IisKLSAgICAiXDQ3XDIzMVwyXDI0MFwxXDBcMzFcMjQwXDFcdTAyMzdcNDdcMjQwXDE0XHUwMTUwXDFcdTAxNTEiKwotICAgICJcMTdcdTAxNTBcMVx1MDIzOFw0N1x1MDE1MFwxMlx1MDE1NFwxXHUwMTU1XDIxXHUwMTU0XDFcdTAyMzlcNDdcdTAxNTQiKwotICAgICJcMTRcdTAxNjBcMVx1MDE2MVwxN1x1MDE2MFwxXHUwMjNhXDQ3XHUwMTYwXDEyXHUwMTY0XDFcdTAxNjVcMjFcdTAxNjQiKwotICAgICJcMVx1MDIzYlw0N1x1MDE2NFw2XDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTNcMTY2XDFcMFw0XDE2NlwxXHUwMjNjXDVcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw1XDE2NiIrCi0gICAgIlwxXDBcMTBcMTY2XDFcdTAyM2RcMlwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcdTAyM2VcNlwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjYiKwotICAgICJcMVwwXDVcMTY2XDFcdTAyM2ZcNVwxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjYiKwotICAgICJcMVwwXDExXDE2NlwyXDBcNlx1MDI0MFw0XHUwMjQxXDZcdTAyNDBcMVx1MDI0MVw1XHUwMjQwIisKLSAgICAiXDFcMFw1XHUwMjQxXDFcdTAyNDBcMTNcdTAyNDFcMVx1MDI0MFwxMlx1MDI0MVwxXHUwMjQwXDRcdTAyNDEiKwotICAgICJcMVx1MDI0MFwxMVx1MDI0MVwyXHUwMjQwXDQxXDBcMVx1MDI0MlwzXDBcMVx1MDI0M1w3XDAiKwotICAgICJcMVx1MDI0NFwxXHUwMjQ1XDIwXDBcMVx1MDI0NlwxMlwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDRcMTY2XDFcdTAyNDdcM1wxNjZcMVx1MDI0OFwyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVx1MDI0OVwxXHUwMjRhXDRcMTY2XDFcMFw0XDE2NlwxXDAiKwotICAgICJcNlwxNjZcMVx1MDI0YlwyXDE2Nlw2MFwwXDFcdTAyNGNcNzRcMFwxXHUwMjRkXDExMlwwIisKLSAgICAiXDFcdTAyNGVcMTAyXDBcMVx1MDI0ZlwxMDRcMFwxXHUwMjUwXDMzXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw1XDE2NlwxXHUwMjUxIisKLSAgICAiXDRcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTJcMTY2XDFcdTAyNTJcMVwwXDEyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI1M1w0XDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNFwxNjZcMVx1MDI1NFw1XDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcNVwxNjZcMVx1MDI1NVw0XDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDExXDE2Nlw0NVwwXDFcdTAyNTZcMTMyXDBcMVx1MDI1NyIrCi0gICAgIlwxMDRcMFwxXHUwMjU4XDY1XDBcMVx1MDI1OVwxMjFcMFwxXHUwMjVhXDE2XDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcNlwxNjZcMVx1MDI1Ylw0XDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwxXDE2NlwxXHUwMjVjXDdcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwyXDE2NlwxXHUwMjVkXDZcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXHUwMjVlXDVcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFwyXDE2NlwxXHUwMjVmXDZcMTY2XDQ3XDBcMVx1MDI2MCIrCi0gICAgIlw3MVwwXDFcdTAyNjFcMTAzXDBcMVx1MDI2MlwxMTNcMFwxXHUwMjYzXDEwMlwwXDFcdTAyNjQiKwotICAgICJcNDdcMFw0XDE2Nlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMFwxNjYiKwotICAgICJcMVx1MDI2NVwyXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2IisKLSAgICAiXDEwXDBcNFwxNjZcNlwwXDFcMTY2XDZcMFw0XDE2NlwxXHUwMjY2XDFcMCIrCi0gICAgIlwxM1wxNjZcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMFwwIisKLSAgICAiXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNFwxNjZcMVx1MDI2N1wxXDBcMTNcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw2XDE2NlwxXHUwMjY4XDRcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFw1XDE2NlwxXHUwMjY5XDVcMTY2IisKLSAgICAiXDFcMFwxMlwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcNjBcMFwxXHUwMjZhIisKLSAgICAiXDEyNVwwXDFcdTAyNmJcNTBcMFwxXHUwMjZjXDEwM1wwXDFcdTAyNmRcNDRcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDVcMTY2IisKLSAgICAiXDFcdTAyNmVcNFwxNjZcMVwwXDRcMTY2XDFcMFwxMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDdcMTY2XDFcdTAyNmZcMVwxNjZcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxMFwxNjZcMVx1MDI3MFwyXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTBcMTY2XDFcdTAyNzFcMlwxNjYiKwotICAgICJcMVwwXDEyXDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NlwxMDNcMFwxXHUwMjcyIisKLSAgICAiXDYxXDBcMVx1MDI1YVwxMjVcMFwxXHUwMjY0XDEwM1wwXDFcdTAyNzNcMTBcMFw0XDE2NiIrCi0gICAgIlw2XDBcMVwxNjZcNlwwXDVcMTY2XDFcMFwxM1wxNjZcMVwwXDEyXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVwwXDEwXDE2NlwxXHUwMjc0XDEwXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFw2XDE2NlwxXHUwMjVmIisKLSAgICAiXDNcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjZcNlwwIisKLSAgICAiXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjZcMVwwIisKLSAgICAiXDRcMTY2XDFcMFwxMFwxNjZcMVx1MDI2OVwxMFwwXDRcMTY2XDZcMFwxXDE2NiIrCi0gICAgIlw2XDBcNVwxNjZcMVwwXDEzXDE2NlwxXDBcMTJcMTY2XDFcMFw0XDE2NiIrCi0gICAgIlwxXDBcMTBcMTY2XDFcdTAyNzVcMzVcMFwxXHUwMjVhXDE1MFwwXDFcdTAyNzZcMTFcMCIrCi0gICAgIlw0XDE2Nlw2XDBcMVwxNjZcNlwwXDRcMTY2XDFcdTAyNWZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcMTJcMTY2XDFcMFw0XDE2NlwxXDBcMTFcMTY2XDEwXDBcNFwxNjYiKwotICAgICJcNlwwXDFcMTY2XDZcMFw1XDE2NlwxXDBcMTNcMTY2XDFcMFwxMlwxNjYiKwotICAgICJcMVwwXDRcMTY2XDFcMFw3XDE2NlwxXHUwMjc3XDFcMTY2XDU3XDBcMVx1MDI1YSIrCi0gICAgIlwzNFwwXDRcMTY2XDZcMFwxXDE2Nlw2XDBcNVwxNjZcMVwwXDEzXDE2NiIrCi0gICAgIlwxXDBcNFwxNjZcMVx1MDI1Zlw1XDE2NlwxXDBcNFwxNjZcMVwwXDExXDE2NiIrCi0gICAgIlwyXDAiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgCi0gICAgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICA5LCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICAzLCAgMywgIDMsICAzLCAgMywgIDMsICA5LCAKLSAgICAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICA5LCAgMSwgIDksICAzLCAgMywgCi0gICAgIDMsICAzLCAgMywgIDMsICA5LCAgOSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICA5LCAgOSwgIDEsIAotICAgICAxLCAgMCwgIDEsICAwLCAgOSwgIDEsICAyLCAgMSwgIDIsICAxLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAKLSAgICAgMSwgIDksICA5LCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDksICAwLCAgOSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAxLCAgMSwgIDAsIAotICAgICAxLCAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDksICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICA5LCAgMCwgIDAsICAxLCAgMCwgCi0gICAgIDAsICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDEsIAotICAgICAwLCAgMSwgIDEsICAwLCAgMCwgIDksICA5LCAgOSwgIDAsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAyLCAKLSAgICAxMywgIDMsICAyLCAgMiwgMTMsICAzLCAgMiwgIDAsICAxLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMiwgCi0gICAgMTMsICAzLCAgMiwgIDIsIDEzLCAgMywgIDIsICAwLCAgMSwgIDEsICAwLCAgMSwgIDEsICAwLCAgOSwgIDksIAotICAgICA5LCAgMCwgIDAsICAxLCAgMSwgIDEsICA5LCAgMCwgIDAsIDEzLCAgOSwgMTMsICA5LCAgOSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMywgIDIsICAyLCAgMywgIDIsICAyLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMSwgIDAsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgIDAsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMCwgIDIsICAzLCAgMywgIDIsICAyLCAgMywgIDMsICAyLCAgMSwgIDEsICAxLCAKLSAgICAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDIsICAzLCAgMywgIDIsICAyLCAgMywgCi0gICAgIDMsICAyLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMCwgIDksICA5LCAgMCwgIDEsIAotICAgICA5LCAgMCwgIDEsICAxLCAgNSwgMTMsIDEzLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgOSwgIDEsICAzLCAgMiwgIDMsICAyLCAgMSwgIDAsICA5LCAgMSwgIDAsICAxLCAgMywgCi0gICAgIDIsICAzLCAgMiwgIDEsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMSwgIDAsICAwLCAgMCwgIDAsIAotICAgICAwLCAgMSwgIDEsICAyLCAgMiwgIDAsICAwLCAgMiwgIDIsICAwLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMCwgIDAsICA5LCAgOSwgIDEsICAxLCAgMiwgIDIsICAxLCAgMSwgIDIsICAyLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDEsICA5LCAgOSwgIDksICAxLCAgMSwgIDIsICAyLCAgMiwgIDIsICAwLCAgMSwgIDEsICAxLCAgMSwgIDIsIAotICAgICAyLCAgMiwgIDIsICA5LCAgMSwgIDEsICAxLCAgMywgIDMsICAzLCAgMywgIDEsICAxLCAgMSwgIDEsICAwLCAKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsIAotICAgICAwLCAgMCwgIDAsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMQotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgeXlfcmVhZGVyOwotCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgIHRoZSBzb3VyY2Ugb2YgdGhlIHl5dGV4dCgpIHN0cmluZyAqLwotICBwcml2YXRlIGNoYXIgeXlfYnVmZmVyW10gPSBuZXcgY2hhclsxNjM4NF07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHl5X21hcmtlZFBvczsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfcHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9jdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhcnRSZWFkOwotCi0gIC8qKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgIGZyb20gaW5wdXQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyAKLQotICAvKiogCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgLy8gcHJpdmF0ZSBib29sZWFuIHl5X2F0Qk9MOwotCi0gIC8qKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9hdEVPRjsKLQotICAvKiogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0gIHByaXZhdGUgYm9vbGVhbiB5eV9lb2ZfZG9uZTsKLQotICAvKiB1c2VyIGNvZGU6ICovCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOwotIAotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcKLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIGZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOwotCXByaXZhdGUgQ29udGV4dFJlZ2lvbkNvbnRhaW5lciBmQnVmZmVyZWRFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgYW4gZW1iZWRkZWQgcmVnaW9uIHNob3VsZCBiZSBldmFsdWF0ZWQKLQlwcml2YXRlIFN0cmluZyBmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgc3RhdGUgdG8gZW50ZXIgb25jZSBhbiBlbWJlZGRlZCByZWdpb24gaGFzCi0JLy8gICBiZWVuIGNvbXBsZXRlZAotCXByaXZhdGUgaW50IGZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQkvLyB0aGUgY29udGFpbmVyIHVzZWQgdG8gY3JlYXRlIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIENvbnRleHRSZWdpb25Db250YWluZXIgZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQ09OVEVYVCA9ICJQUk9YWV9DT05URVhUIjsKLQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0ID0gMDsKLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7Ci0JCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgaW5zaWRlIG9mIGFuIGVtYmVkZGVkIHJlZ2lvbgotCXByaXZhdGUgU3RyaW5nIGludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgaW50ZXJuYWxDb250ZXh0ID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgwKTsKLQlwcml2YXRlIExpc3QgZk5lc3RhYmxlUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQotCS8vIHdoZXJlIHRoZSBsYXN0IGludGVybmFsIGNvbnRhaW5lciBibG9jayB3YXMgZm91bmQKLQlwcml2YXRlIGludCBmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZkZvcmJpZEpTUCA9IGZhbHNlOwotCQotCXByaXZhdGUgaW50IGZFTGxldmVsID0gMDsKLQotCXByaXZhdGUgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBKU1BQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQkJaWYoY29udGFpbnNUYWdOYW1lKG1hcmtlci5nZXRUYWdOYW1lKCkpKQotCQkJcmV0dXJuOwotCQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGFkZE5lc3RhYmxlUHJlZml4KFRhZ01hcmtlciBtYXJrZXIpIHsKLQkJZk5lc3RhYmxlUHJlZml4ZXMuYWRkKG1hcmtlcik7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIExpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpIHsKLQkJcmV0dXJuIGZOZXN0YWJsZVByZWZpeGVzOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RhYmxlKFN0cmluZyB0YWdOYW1lKSB7Ci0JCS8vSXRlcmF0b3IgYmxvY2tzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJLy93aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCS8vCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKWJsb2Nrcy5uZXh0KCk7Ci0JCS8vCVN0cmluZyBtYXJrZXJOYW1lID0gbWFya2VyLmdldFRhZ05hbWUoKTsKLQkJLy8JaWYodGFnTmFtZS5sZW5ndGgoKSA+IG1hcmtlck5hbWUubGVuZ3RoKCkgKyAxICYmIHRhZ05hbWUuc3RhcnRzV2l0aChtYXJrZXJOYW1lKSAmJiB0YWdOYW1lLmNoYXJBdChtYXJrZXJOYW1lLmxlbmd0aCgpKSA9PSAnOicpIHsKLQkJLy8JCXJldHVybiBtYXJrZXIuaXNHbG9iYWwoKSB8fCBnZXRPZmZzZXQoKSA+PSBtYXJrZXIuZ2V0TWFya2VyKCkuZ2V0U3RhcnQoKTsKLQkJLy8JfQotCQkvL30KLQkJLy9yZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgbmFtZSkgewotCQlpZiAoZk5lc3RhYmxlUHJlZml4ZXMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgbmVzdGFibGVzID0gZk5lc3RhYmxlUHJlZml4ZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChuZXN0YWJsZXMuaGFzTmV4dCgpKSB7Ci0JCQkJaWYgKCgoVGFnTWFya2VyKSBuZXN0YWJsZXMubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCQkJbmVzdGFibGVzLnJlbW92ZSgpOwotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIAotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgewotCQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgewotCQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotCQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUYWdOYW1lKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBudWxsLCBlbmRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcykgewotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgZW5kVHlwZXMsIG51bGwpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUeXBlKSB7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoc3RhcnRUeXBlLCBuZXcgU3RyaW5nW117ZW5kVHlwZX0sIG51bGwpOwotCX0KLQkvKioKLQkgKiAgdXNlciBtZXRob2QgCi0JICogCi0JICogQXNzZW1ibGVzIGFuIGVtYmVkZGVkIGNvbnRhaW5lciBiZWdpbm5pbmcgd2l0aCB0aGUgZ2l2ZW4gc3RhcnRUeXBlIGFzCi0JICogdGhlIGZpcnN0IENvbnRleHRSZWdpb24gd2l0aGluIGl0IGFuZCBvZiB0aGUgdHlwZSBmRW1iZWRkZWRIaW50LiAgVGhlCi0JICogZW5kVHlwZXNbXSBhcnJheSBjb250YWlucyB0aGUgY29udGV4dCB0eXBlcyB0aGF0IHdpbGwgY2F1c2UgYSBzdWNjZXNzZnVsCi0JICogZXhpdC4gIFVzZSBvZiB0aGUgZW5kVGFnTmFtZSBwYXJhbWV0ZXIgYWx0ZXJzIHRoaXMgYmVoYXZpb3IgdG8gZm9yY2UgYW4KLQkgKiBleGl0IG9uIGFuIFhNTF9UQUdfQ0xPU0UgYWZ0ZXIgc2VlaW5nIGFuIFhNTF9UQUdfTkFNRSB3aG9zZSBzaWduaWZpY2FudAotCSAqIHRleHQgbWF0Y2hlcyB0aGUgZW5kVGFnTmFtZSBTdHJpbmcuICBBbGwgY29udGVudHMgaW4gYmV0d2VlbiBhcmUKLQkgKiBpbnNpZ25pZmljYW50LCBhbmQgeWVzLCB0aGlzIG1lYW5zIGNvbW1lbnRzIGFyZSBhbGxvd2VkIGluc2lkZS4KLQkgKiovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoU3RyaW5nIHN0YXJ0VHlwZSwgU3RyaW5nW10gZW5kVHlwZXMsIFN0cmluZyBlbmRUYWdOYW1lKSB7Ci0JCS8vIHRoZSBjb250ZXh0IG9mIHRoZSByZWdpb24gYmVpbmcgYWRkZWQgdG8gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQlpbnRlcm5hbENvbnRleHQgPSBzdGFydFR5cGU7Ci0JCS8vIGtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhpcyBjb250YWluZXIgYmVnYW47IHRvIHByb3ZpZGUgcmVsYXRpdmUgaW5kZWNlcyBmb3IgdGhlIHJlZ2lvbnMKLQkJaW50IGNvbnRhaW5lclN0YXJ0ID0geXljaGFyOwotCQlib29sZWFuIG5vdEZpbmlzaGVkID0gdHJ1ZTsKLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB3ZSBzZWVtIHRvIGJlIHNvIHRoYXQgdGhlIGVuZFRhZ05hbWUgY2FuIGJlIGNoZWNrZWQKLQkJYm9vbGVhbiBpc0luRW5kVGFnID0gZmFsc2U7Ci0JCWJvb2xlYW4gaXNJbkZpcnN0VGFnID0gdHJ1ZTsKLQkJLy8gY3JlYXRlIHRoZSBlbWJlZGRlZCBjb250YWluZXIgYW5kIHNldHVwIGl0cyAidHlwZSIKLQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIgPSBuZXcgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFR5cGUoZkVtYmVkZGVkSGludCk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoY29udGFpbmVyU3RhcnQpOwotCQkJLy8gVE9ETzogcGFyZW50IHJlZ2lvbiBuZWVkcyB0byBiZSBzZXQgLi4uLiBidXQgbm90IHN1cmUgd2hlcmUgdG8gZ2V0IGl0IGZyb20gCi0JCQkvLwkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFBhcmVudChwYXJlbnRSZWdpb24pOwotCQl9Ci0JCWNvbnRhaW5lclN0YXJ0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFN0YXJ0KCk7Ci0JCXdoaWxlIChub3RGaW5pc2hlZCkgewotCQkJLy8gYWRkIHRoZSByZWdpb24gdG8gdGhlIGNvbnRhaW5lcgotCQkJaWYgKGludGVybmFsQ29udGV4dCAhPSBudWxsICYmIGludGVybmFsQ29udGV4dCAhPSBQUk9YWV9DT05URVhUKSB7Ci0JCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvL25ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQkvLyBsb25nc2NhbiBkZXRlcm1pbmVzIHdoZXRoZXIgdG8gYXR0ZW1wdCBhIGJsb2NrVGFnU2NhbiB3aXRoaW4gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcgotCQkJCWJvb2xlYW4gbG9uZ3NjYW4gPSBmYWxzZTsKLQkJCQkvLyBzYXZlIHRoZSB0b2tlbml6ZXIgc3RhdGUgaW4gY2FzZSBvZiBhIGJsb2NrIHRhZyBzY2FuCi0JCQkJaW50IHByZXZpb3VzU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJU3RyaW5nIHByZXZpb3VzQ3VycmVudFRhZ05hbWUgPSBmQ3VycmVudFRhZ05hbWU7Ci0JCQkJaW50IHByZXZpb3VzUG9zdFN0YXRlID0gZkVtYmVkZGVkUG9zdFN0YXRlOwotCQkJCVN0cmluZyBwcmV2aW91c0VtYmVkZGVkSGludCA9IGZFbWJlZGRlZEhpbnQ7Ci0JCQkJLy8gZGV0ZXJtaW5lIGlmIGEgYmxvY2sgdGFnIHNjYW4gaXMgbmVjZXNzYXJ5Ci0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsKLQkJCQkJaW50ZXJuYWxUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQkJCWlmKCFpc05lc3RhYmxlKGludGVybmFsVGFnTmFtZSkpIHsKLQkJCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JCQkJCQkvLyBzbmFnZ2VkIGEgdGFnIG5hbWUgd2Ugc2hvdWxkbid0IGhhdmUKLQkJCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0FCT1JUX0VNQkVEREVEOwotCQkJCQkJbm90RmluaXNoZWQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19PUEVOIHx8IGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7Ci0JCQkJfQotCQkJCS8vIGRvIHVwa2VlcCBmb3IgZW5kVGFnTmFtZSB1c2FnZTsgbXVzdCBiZSBoZXJlIHNpbmNlIHRoZSBuZXh0IHRva2VuIGNvdWxkIGJlIHRoZSBjbG9zZQotCQkJCWlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCQlpc0luRW5kVGFnID0gdHJ1ZTsKLQkJCQl9IGVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB7Ci0JCQkJCWlzSW5GaXJzdFRhZyA9IGlzSW5FbmRUYWcgPSBmYWxzZTsKLQkJCQl9IGVsc2UgewotCQkJCSAJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7Ci0JCQkJCWlmIChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpID4gMiAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19DTE9TRSAmJiAoZW1iZWRkZWRSZWdpb25zLmdldChlbWJlZGRlZFJlZ2lvbnMuc2l6ZSgpIC0gMykpLmdldFR5cGUoKSA9PSBYTUxfVEFHX09QRU4gJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwpIHsKLQkJCQkJCWlmIChjb250YWluc1RhZ05hbWUoaW50ZXJuYWxUYWdOYW1lKSkgewotCQkJCQkJCWxvbmdzY2FuID0gdHJ1ZTsKLQkJCQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobG9uZ3NjYW4pCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IGludGVybmFsVGFnTmFtZTsKLQkJCQkvLyByZWFkIHRoZSBuZXh0IHJlZ2lvbiBhbmQgY29udGV4dAotCQkJCWludGVybmFsQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQlpZiAobG9uZ3NjYW4pIHsKLQkJCQkJLy8gUmV0dXJuaW5nIGZyb20gYSBibG9jayB0YWcgc2NhbiByZXF1aXJlcyByZXN0b3Jpbmcgc29tZSBzdGF0ZSB2YXJpYWJsZXMKLQkJCQkJLy8gYXMgd2VsbCBhcyBoYW5kbGluZyB0aGUgYmxvY2sgcmVnaW9uIGFuZCBzZXR0aW5nIHVwIGZvciBub3JtYWwgc2Nhbm5pbmcKLQkJCQkJLy8gaW5zaWRlIHRoZSBlbWJlZGRlZCBjb250YWluZXIKLQkJCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihpbnRlcm5hbENvbnRleHQsIHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0LCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsKLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7Ci0JCQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIG5ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOwotCQkJCQlsb25nc2NhbiA9IGZhbHNlOwotCQkJCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBwcmV2aW91c1Bvc3RTdGF0ZTsKLQkJCQkJZkVtYmVkZGVkSGludCA9IHByZXZpb3VzRW1iZWRkZWRIaW50OwotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBwcmV2aW91c0N1cnJlbnRUYWdOYW1lOwotCQkJCQl5eWJlZ2luKHByZXZpb3VzU3RhdGUpOwotCQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJfQotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHByaW1HZXROZXh0VG9rZW4oKSBjYWxscyBtYXkgdGhyb3cgYW4gSU9FeGNlcHRpb24KLQkJCQkvLyBjYXRjaCBhbmQgZG8gbm90aGluZyBzaW5jZSB0aGUgaXNFT0YgY2hlY2sgYmVsb3cKLQkJCQkvLyB3aWxsIHByb3Blcmx5IGV4aXQgaWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmKSB7Ci0JCQkJLy8gc29tZSBvdGhlciBleGNlcHRpb24gaGFwcGVuZWQ7IG5ldmVyIHNob3VsZAotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZik7Ci0JCQl9Ci0JCQlib29sZWFuIGlzRW5kaW5nVHlwZSA9IHl5c3RhdGUoKSA9PSBTVF9BQk9SVF9FTUJFRERFRDsKLQkJCWlmKCFpc0VuZGluZ1R5cGUpIHsKLQkJCQkvLyBjaGVjayBmb3IgZW5kaW5nIGNvbnRleHQKLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5kVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlzRW5kaW5nVHlwZSA9IGlzRW5kaW5nVHlwZSB8fCAoaW50ZXJuYWxDb250ZXh0ID09IGVuZFR5cGVzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaXNFbmRpbmdUeXBlID0gKChpc0luRW5kVGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB8fCAoaXNJbkZpcnN0VGFnICYmIGludGVybmFsQ29udGV4dCA9PSBYTUxfRU1QVFlfVEFHX0NMT1NFKSkgJiYgaW50ZXJuYWxUYWdOYW1lICE9IG51bGwgJiYgaW50ZXJuYWxUYWdOYW1lLmVxdWFscyhlbmRUYWdOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgZW1iZWRkZWRMaXN0ID0gZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJCW5vdEZpbmlzaGVkID0gbm90RmluaXNoZWQgJiYgKCghaXNFbmRpbmdUeXBlKSAmJiAhaXNFT0YoKSAmJiAoZW5kVGFnTmFtZSAhPSBudWxsIHx8IGludGVybmFsQ29udGV4dCAhPSBVTkRFRklORUQpICYmICEoaW50ZXJuYWxDb250ZXh0ID09IFBST1hZX0NPTlRFWFQgJiYgKGVtYmVkZGVkTGlzdC5nZXQoZW1iZWRkZWRMaXN0LnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFVOREVGSU5FRCkpOwotCQl9Ci0JCS8vIGZpbmlzaCBhZGRpbmcgdGhlIGxhc3QgY29udGV4dAotCQlpZiAoaW50ZXJuYWxDb250ZXh0ICE9IG51bGwgJiYgaW50ZXJuYWxDb250ZXh0ICE9IFBST1hZX0NPTlRFWFQpIHsKLQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7Ci0JCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7Ci0JCQkvLyBEVywgNC8xNi8yMDAzIHRva2VuIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsKLQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7Ci0JCX0KLQkJeXliZWdpbihmRW1iZWRkZWRQb3N0U3RhdGUpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKCkgewotCQlyZXR1cm4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhib29sZWFuIG5ld1ZhbHVlKSB7Ci0JCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCkgewotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckFsbG93c0pTUChTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJYm9vbGVhbiBjYXNlc2Vuc2l0aXZlID0gbWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpOwotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCQlyZXR1cm4gbWFya2VyLmFsbG93c0pTUCgpOwotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsKLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7Ci0JfQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgewotCQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIEJMT0NLX1RFWFQ7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7Ci0JfQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOwotCX0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlCi0JICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0JICoKLQkgKiBFeGFtcGxlOiAKLQkgKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0JICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsKLQkgKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7Ci0JICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotCSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgCi0JICoKLQkgKiBSZXR1cm5zOgotCSAqCUJMT0NLX1RFWFQ6IDAtNDAKLQkgKglYTUxfRU5EX1RBR19PUEVOOiA0MS00MgotCSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLQkgKglYTUxfVEFHX0NMT1NFOiA0OS00OQotCSAqCVhNTF9DT05URU5UOiA1MC01NwotCSAqCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsKLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7Ci0JfQotCi0vKioKLSAqIE1ldGhvZCBkb1NjYW4uCi0gKiAKLSAqIFJldHVybnMgYSBjb250ZXh0IHJlZ2lvbiBmb3IgYWxsIG9mIHRoZSB0ZXh0IGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24gdXB0byB0aGUgZW5kIG9mIGlucHV0IG9yCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZwotICogCi0gKiBAcGFyYW0gc2VhcmNoU3RyaW5nIC0gdGFyZ2V0IHN0cmluZyB0byBzZWFyY2ggZm9yIGV4LjogIi0tPiIsICI8L3RhZ25hbWUiCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+JwotICogQHBhcmFtIGFsbG93SlNQIC0gY2hlY2sgZm9yIGFuZCBhbGxvdyBmb3IgSlNQIG1hcmt1cCA8JSU+Ci0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgYm9vbGVhbiBhbGxvd0pTUCwgYm9vbGVhbiBhbGxvd0NEQVRBLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBzdGlsbFNlYXJjaGluZyA9IHRydWU7Ci0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkKLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOwotCWludCBuID0gMDsKLQljaGFyIGxhc3RDaGVja0NoYXI7Ci0JaW50IGk7Ci0JYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0JLy8gQ2hlY2sgZm9yIEpTUCBzdGFydHMgKCI8JSIpIGlmIHRoZSB0YWcgaXMgZ2xvYmFsIGxpa2UgU0NSSVBUIG9yIFNUWUxFCi0JYm9vbGVhbiBjaGVja0pTUHMgPSBhbGxvd0pTUCAmJiAhZkZvcmJpZEpTUDsKLQlib29sZWFuIGNoZWNrZWRGb3JKU1BzT25jZSA9ICFjaGVja0pTUHM7Ci0JYm9vbGVhbiBjaGVja2VkSlNQc0F0U3RhcnRPbmNlID0gZmFsc2U7Ci0JCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7Ci0JCW4gPSAwOwotCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLgotCQluID0geXlfYWR2YW5jZSgpOwotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpCi0JCQluID0geXlfYWR2YW5jZSgpOwotLy8JCWMgPSAoY2hhcikgbjsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YgJiYgY2hlY2tlZEZvckpTUHNPbmNlKSB7Ci0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOwotCQl9Ci0JCWVsc2UgewotCQkJLyoqCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBKU1BzICI8JSIKLQkJCSAqLwotCQkJY2hlY2tlZEZvckpTUHNPbmNlID0gdHJ1ZTsKLQkJCS8vIDEpIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBKU1BzCi0JCQkvLyAtLS0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQlpZihjaGVja0pTUHMgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIAotCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggKyAxXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0ganNwc3RhcnRlci5sZW5ndGggOiBUaGVyZSdzIG5vdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBjaGVjayBmb3IgYSBKU1AgMiBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZAotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb247IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QKLQkJCS8vIHNwaWxsIG92ZXIgdGhlIGVuZCBvZiB0aGUgYnVmZmVyIHdoaWxlIGNoZWNraW5nLgotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJgotCQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIDFdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfY3VycmVudFBvc10gPT0gJyUnKSB7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gMTsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLQkJCS8vIDMpIHl5X2N1cnJlbnRQb3MuLih5eV9jdXJyZW50UG9zK2pzcFN0YXJ0bGVuZ3RoLTEpIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgaW1tZWRpYXRlbHkgaW4gdGhlIGJsb2NrIGFyZWE7IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbgotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4KLQkJCWVsc2UgaWYoY2hlY2tKU1BzICYmICFjaGVja2VkSlNQc0F0U3RhcnRPbmNlICYmIHl5X3N0YXJ0UmVhZCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiB5eV9zdGFydFJlYWQgPiAwICYmCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7Ci0JCQkJY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IHRydWU7Ci0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9zdGFydFJlYWQ7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pOwotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7Ci0JCQl9Ci0KLQotCQkJLyoqCi0JCQkgKiBMb29rIGZvciBzdGFydGluZyBDREFUQSAiPCFbQ0RBVEFbIgotCQkJICovCi0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBDREFUQQotCQkJLy8gLS0tCi0JCQkvLyBMb29rIGZvciBhIENEQVRBIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8WyFDREFUQVtdXT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLS8qCQkJaWYoY2hlY2tDREFUQSAmJiB5eV9jdXJyZW50UG9zID4gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgKyBzZWFyY2hTdHJpbmdMZW5ndGggPCB5eV9idWZmZXIubGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGggIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgCi0JCQkJY2hhcnNNYXRjaChjZGF0YVN0YXJ0ZXIsIHl5X2J1ZmZlciwgMCwgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCkpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGg7Ci0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOwotCQkJCS8vIGdvIHRvIGEgc3RhdGUgd2hlcmUgQ0RBVEEgY2FuIGJlIGZvdW5kCi0JCQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUeXBlKHNlYXJjaENvbnRleHQpOwotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoeXljaGFyKTsKLQkJCQl9Ci0JCQkJSVRleHRSZWdpb24gbmV3VG9rZW4gPSBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihzZWFyY2hDb250ZXh0LCB5eWNoYXIsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKG5ld1Rva2VuKTsKLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOwotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsKLQkJCQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JCQkJU3RyaW5nIGNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCQkJaWYoY29udGV4dC5lcXVhbHMoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4pKSB7Ci0JCQkJCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX09QRU4sIFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9DTE9TRSk7Ci0JCQkJfQotCQkJCXl5YmVnaW4ocmVzdW1lU3RhdGUpOwotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotKi8vKgotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGNkYXRhU3RhcnRlci5sZW5ndGg6IFRoZXJlJ3Mgbm90IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IGNoZWNrIGZvciBhIENEQVRBIHJpZ2h0IGhlcmUgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0Ci0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4KLQkJCWVsc2UgaWYoY2hlY2tDREFUQSAmJiB5eV9zdGFydFJlYWQgIT0gZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgJiYgeXlfY3VycmVudFBvcyA+IDAgJiYgeXlfY3VycmVudFBvcyA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmCi0JCQkJCXl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gMV0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSA9PSAnJScpIHsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOwotCQkJCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOwotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsKLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsKLQkJCQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7Ci0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsKLQkJCQkJcmV0dXJuIGpzcENvbnRleHQ7Ci0JCQkJfQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0OwotCQkJfQotCQkJLy8gMykgeXlfY3VycmVudFBvcyA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUKLQkJCS8vIC0tLQotCQkJLy8gTG9vayBmb3IgYSBKU1AgYmVnaW5uaW5nIGltbWVkaWF0ZWx5IGluIHRoZSBibG9jayBhcmVhOyB0aGlzIGNhc2Ugd291bGRuJ3QgYmUgaGFuZGxlZCBieSB0aGUgcHJlY2VkaW5nIHNlY3Rpb24KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgIWNoZWNrZWRGb3JDREFUQU9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYKLQkJCQkJeXlfc3RhcnRSZWFkIDwgeXlfYnVmZmVyLmxlbmd0aCAtIDEgJiYgeXlfYnVmZmVyW3l5X3N0YXJ0UmVhZF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWQgKyAxXSA9PSAnJScpIHsKLQkJCQljaGVja2VkRm9yQ0RBVEFPbmNlID0gdHJ1ZTsKLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsKLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJCQlpbnQgcmVzdW1lU3RhdGUgPSB5eXN0YXRlKCk7Ci0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7Ci0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJCQlTdHJpbmcganNwQ29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7Ci0JCQkJCXJldHVybiBqc3BDb250ZXh0OwotCQkJCX0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLQkJCX0KLSovCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQlpZiAobiA9PSBZWUVPRikgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gdHJ1ZTsKLQkJCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzCi0JCQkJaWYoeXlfY3VycmVudFBvcyA+PSBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyA8PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCQlzYW1lID0geXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSA9PSBzZWFyY2hTdHJpbmcuY2hhckF0KGkpOwotCQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQkJZWxzZSB7Ci0JCQkJCXNhbWUgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKiBkb2VzIGEgbG9va2FoZWFkIGZvciB0aGUgY3VycmVudCB0YWcgbmFtZQotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrVGFnU2NhbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCksIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqIENvbnZlcnRzIHRoZSByYXcgY29udGV4dCBTdHJpbmcgcmV0dXJuZWQgYnkgdGhlIHByaW1HZXROZXh0VG9rZW4oKQotCSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlCi0JICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotCSAqCi0JICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQotCSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0JICoKLQkgKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZAotCSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOwotCQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7Ci0JCQlpZiAoZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uIGNvbnRhaW5lciA9IGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyOwotCQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsKLQkJCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCQkJcmV0dXJuIGNvbnRhaW5lcjsKLQkJCX0KLQkJCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0OwotCQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCX0gZWxzZSB7Ci0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQkJaWYgKGNvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCkgewotCQkJCXJldHVybiBmRW1iZWRkZWRDb250YWluZXI7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7Ci0JCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCQkJZWxzZQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQkJfQotCQkJc3RhcnQgPSB5eWNoYXI7Ci0JCQl0ZXh0TGVuZ3RoID0gbGVuZ3RoID0geXlsZW5ndGgoKTsKLQkJCWlmICh5eV9hdEVPRikgewotCQkJCWZUb2tlbkNvdW50Kys7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCX0KLQkJLy8gc3RvcmUgdGhlIG5leHQgdG9rZW4KLQkJZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCQlpZiAoZl9jb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsKLQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gZkVtYmVkZGVkQ29udGFpbmVyOwotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX1JPT1RfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ESVJFQ1RJVkVfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCX0gZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOwotCQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsKLQkJCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCX0KLQkJaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkJLy8gRU9GCi0JCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlmVG9rZW5Db3VudCsrOwotCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgSlNQVG9rZW5pemVyKCl7Ci0JCXN1cGVyKCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIEpTUFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsKLQkJCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgewotCQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7Ci0JfQotCS8qIHVzZXIgbWV0aG9kICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOwotCX0KLQkvKiB1c2VyIG1ldGhvZCAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7Ci0JCXJlc2V0KGluLCAwKTsKLQl9Ci0JLyoqCi0JICogdXNlciBtZXRob2QgKgotCSAqCi0JICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzCi0JICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KLQkgKgotCSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlCi0JICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcwotCSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0JCi0JCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQkJeXlfcmVhZGVyID0gaW47Ci0JCi0JCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQkJeXlfc3RhdGUgPSAwOwotCQotCQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0JCi0JCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQkJdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOwotCQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCQl5eV9tYXJrZWRQb3MgPSAwOwotCQotCQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCQl5eV9wdXNoYmFja1BvcyA9IDA7Ci0JCi0JCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCQl5eV9jdXJyZW50UG9zID0gMDsKLQkKLQkJLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JCXl5X3N0YXJ0UmVhZCA9IDA7Ci0JCi0JCS8qKiAKLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0JCSAqIGZyb20gaW5wdXQgCi0JCSAqLwotCQl5eV9lbmRSZWFkID0gMDsKLQkKLQkJLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JCXl5bGluZSA9IDA7Ci0JCi0JCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCQl5eWNoYXIgPSAwOwotCQotCQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JCXl5X2F0RU9GID0gZmFsc2U7Ci0JCi0JCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOwotCQotCQotCQkvKiB1c2VyIHZhcnM6ICovCi0JCWZUb2tlbkNvdW50ID0gMDsKLQkgCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQkJZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQkJZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQkKLQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsKLQkKLQkJY29udGV4dCA9IG51bGw7Ci0JCXN0YXJ0ID0gMDsKLQkJdGV4dExlbmd0aCA9IDA7Ci0JCWxlbmd0aCA9IDA7Ci0JCi0JCWZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7Ci0JCQotCQlmRUxsZXZlbCA9IDA7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCUpTUFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBKU1BUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZk5lc3RhYmxlUHJlZml4ZXMuc2l6ZSgpOyBpKyspIHsKLQkJCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKSBmTmVzdGFibGVQcmVmaXhlcy5nZXQoaSk7Ci0JCQlpZihtYXJrZXIuaXNHbG9iYWwoKSkKLQkJCQluZXdJbnN0YW5jZS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkJLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkJLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dAotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQkJcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLQl9Ci0JLyogdXNlciBtZXRob2QgKi8KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuSlNQQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBTY2FuIGZvciAnLS0lPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JCS8vICAgSlNQX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoCi0JCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfSlNQX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkJLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JCXJldHVybiBkb1NjYW4oIi0tJT4iLCBmYWxzZSwgZmFsc2UsIHRydWUsIEpTUF9DT01NRU5UX1RFWFQsIFNUX0pTUF9DT01NRU5UX0VORCwgU1RfSlNQX0NPTU1FTlRfRU5EKTsKLQl9Ci0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgSlNQVG9rZW5pemVyKGphdmEuaW8uUmVhZGVyIGluKSB7Ci0gICAgdGhpcy55eV9yZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIEpTUFRva2VuaXplcihqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbikpOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIERGQSB0cmFuc2l0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IFtdIHl5X3VucGFjayhTdHJpbmcgcGFja2VkKSB7Ci0gICAgaW50IFtdIHRyYW5zID0gbmV3IGludFsyOTU4MF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgNzM0NikgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzNzYpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7Ci0JCWZvcihpbnQgaiA9IDA7IGogPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaisrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpZkJsb2NrTWFya2Vycy5nZXQoaik7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsKLQkJCQlib29sZWFuIG1hdGNoZXNTb0ZhciA9IHRydWU7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ25hbWVMZW5ndGggJiYgbWF0Y2hlc1NvRmFyOyBpKyspIHsKLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSAhPSBtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkpCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobWF0Y2hlc1NvRmFyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKgotCSAqIFJldHVybiBBTEwgb2YgdGhlIHJlZ2lvbnMgc2Nhbm5hYmxlIHdpdGhpbiB0aGUgcmVtYWluaW5nIHRleHQKLQkgKiBOb3RlOiBmb3IgdmVyaWZpY2F0aW9uIHVzZQotCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQl0b2tlbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOiBpbnB1dCBjb3VsZCBub3QgYmUgdG9rZW5pemVkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0T2Zmc2V0KCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCAKLQkJCS8vIHdheSBvZiBnZXR0aW5nIHRva2VucywgbWFueSBlcnJvcnMgYXJlIHNpbXBseSBoaWRkZW4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBub3QgaGFuZGxlZCByZXRyaWV2aW5nIHJlZ2lvbnM6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocyArICIgKCIgKyB5eWNoYXIgKyAiLSIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdVdGlscy5lc2NhcGUoeXl0ZXh0KCkpICsgIlwnIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICAtIHNrZWxldG9uLnNlZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotLyogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQgKi8KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgewotCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOwotCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIC8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLSAgICB5eV9wdXNoYmFja1BvcyA9IC0xOwotICAgIGJvb2xlYW4geXlfd2FzX3B1c2hiYWNrOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLQotICAgICAgeXljaGFyKz0geXlsZW5ndGgoKTsKLQotICAgICAgYm9vbGVhbiB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICBmb3IgKHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQ7IHl5X2N1cnJlbnRQb3MgPCB5eV9tYXJrZWRQb3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9jdXJyZW50UG9zKyspIHsKLSAgICAgICAgc3dpdGNoICh5eV9idWZmZXJbeXlfY3VycmVudFBvc10pIHsKLSAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIHl5X2NvdW50ZWQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgaWYgKHl5X2NvdW50ZWQpCi0gICAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICh5eV9jb3VudGVkKSB7Ci0gICAgICAgIGlmICggeXlfYWR2YW5jZSgpID09ICdcbicgKSB5eWxpbmUtLTsKLSAgICAgICAgaWYgKCAheXlfYXRFT0YgKSB5eV9jdXJyZW50UG9zLS07Ci0gICAgICB9Ci0KLSAgICAgIHl5X2FjdGlvbiA9IC0xOwotCi0gICAgICB5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkID0geXlfbWFya2VkUG9zOwotCi0gICAgICB5eV9zdGF0ZSA9IHl5X2xleGljYWxfc3RhdGU7Ci0KLSAgICAgIHl5X3dhc19wdXNoYmFjayA9IGZhbHNlOwotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDIpID4gMCApCi0gICAgICAgICAgICB5eV9wdXNoYmFja1BvcyA9IHl5X2N1cnJlbnRQb3M7Ci0KLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwICkgewotICAgICAgICAgICAgeXlfd2FzX3B1c2hiYWNrID0gKHl5X2F0dHJpYnV0ZXMgJiA0KSA+IDA7Ci0gICAgICAgICAgICB5eV9hY3Rpb24gPSB5eV9zdGF0ZTsgCi0gICAgICAgICAgICB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOyAKLSAgICAgICAgICAgIGlmICggKHl5X2F0dHJpYnV0ZXMgJiA4KSA+IDAgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X3dhc19wdXNoYmFjaykKLSAgICAgICAgeXlfbWFya2VkUG9zID0geXlfcHVzaGJhY2tQb3M7Ci0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgNTk5OiAKLSAgICAgICAgY2FzZSA2MDQ6IAotICAgICAgICBjYXNlIDYxMTogCi0gICAgICAgIGNhc2UgNjE2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJqc3AgZGlyZWN0aXZlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIEpTUF9ESVJFQ1RJVkVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjMyOiBicmVhazsKLSAgICAgICAgY2FzZSA1NjM6IAotICAgICAgICBjYXNlIDU2NTogCi0gICAgICAgIGNhc2UgNTY2OiAKLSAgICAgICAgY2FzZSA1Njc6IAotICAgICAgICBjYXNlIDU2ODogCi0gICAgICAgIGNhc2UgNTY5OiAKLSAgICAgICAgY2FzZSA1NzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ0RBVEEgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCXl5YmVnaW4oU1RfQ0RBVEFfVEVYVCk7Ci0JcmV0dXJuIFhNTF9DREFUQV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2MzM6IGJyZWFrOwotICAgICAgICBjYXNlIDU1NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgianNwOnJvb3QgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gSlNQX1JPT1RfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDYzNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTQ3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgNjM1OiBicmVhazsKLSAgICAgICAgY2FzZSA1NDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSA2MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDU0NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDYzNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDYzODogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTMwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07Ci0gfQotICAgICAgICBjYXNlIDYzOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTI0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjQwOiBicmVhazsKLSAgICAgICAgY2FzZSA1MDE6IAotICAgICAgICBjYXNlIDU0MDogCi0gICAgICAgIGNhc2UgNTQxOiAKLSAgICAgICAgICB7IAotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2NDE6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5MTogCi0gICAgICAgIGNhc2UgNTM2OiAKLSAgICAgICAgY2FzZSA1Mzc6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQyOiBicmVhazsKLSAgICAgICAgY2FzZSA0ODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBKU1BfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNjQzOiBicmVhazsKLSAgICAgICAgY2FzZSA0NzA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0yKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiVkJMIGluIGF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX1ZCTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX1ZCTF9DTE9TRX0pOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKHl5bGVuZ3RoKCkgPiAyKQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJFTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlmRUxsZXZlbCsrOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0V9KTsKLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjQ1OiBicmVhazsKLSAgICAgICAgY2FzZSA0NjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuQ2hhclJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOwotIH0KLSAgICAgICAgY2FzZSA2NDY6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9DT01NRU5UOwotCXl5YmVnaW4oU1RfWE1MX0NPTU1FTlQpOwotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOwotIH0KLSAgICAgICAgY2FzZSA2NDc6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2MDogCi0gICAgICAgIGNhc2UgNDc4OiAKLSAgICAgICAgY2FzZSA0ODE6IAotICAgICAgICBjYXNlIDQ4NDogCi0gICAgICAgIGNhc2UgNDg1OiAKLSAgICAgICAgY2FzZSA0ODc6IAotICAgICAgICBjYXNlIDQ4OTogCi0gICAgICAgIGNhc2UgNDkyOiAKLSAgICAgICAgY2FzZSA0OTQ6IAotICAgICAgICBjYXNlIDQ5NTogCi0gICAgICAgIGNhc2UgNDk3OiAKLSAgICAgICAgY2FzZSA0OTk6IAotICAgICAgICBjYXNlIDUwMjogCi0gICAgICAgICAgeyAKLQkvKiBKU1AgY29tbWVudCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjayg0KTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDQpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSAgewotCQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikKLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0JLy8gZmluaXNoZWQgc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIHJlZ3VsYXIgc2NyaXB0bGV0IG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCXJldHVybiBKU1BfQ09NTUVOVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7Ci0JCS8vIHRoZSBjb21tZW50IGNvbnRhaW5lciBpdHNlbGYgd2lsbCBhY3QgYXMgY29tbWVudCB0ZXh0Ci0JCWZFbWJlZGRlZEhpbnQgPSBKU1BfQ09NTUVOVF9URVhUOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCS8qCi0JCSAqIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9uczsgbWFyayB0aGlzIG9uZSBhcyBhCi0JCSAqIGNvbW1lbnQgc28gaXQgd2lsbCBiZSBvdGhlcndpc2UgaWdub3JlZCBidXQgcHJlc2VydmVkICh3aGljaCBpcyB3aHkKLQkJICogd2UgY2FuJ3QgdXNlIHdoaXRlLXNwYWNlKQotCQkgKi8KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY0ODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2NDk6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2NTA6IGJyZWFrOwotICAgICAgICBjYXNlIDM4MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfQ0RBVEFfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY1MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc5OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JaWYoeXlsZW5ndGgoKSA+IDIpCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOwotCWZFTGxldmVsKys7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgSlNQX1ZCTF9DTE9TRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjUyOiBicmVhazsKLSAgICAgICAgY2FzZSAzNzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDY1MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzc3OiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlpZih5eWxlbmd0aCgpID4gMikKLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7Ci0JZkVMbGV2ZWwrKzsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIEpTUF9FTF9DTE9TRSk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOwotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjU0OiBicmVhazsKLSAgICAgICAgY2FzZSAzNzQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuRW50aXR5UmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgNjU1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNjg6IAotICAgICAgICBjYXNlIDQwNjogCi0gICAgICAgIGNhc2UgNDEzOiAKLSAgICAgICAgY2FzZSA0MTk6IAotICAgICAgICBjYXNlIDQyMzogCi0gICAgICAgIGNhc2UgNDI3OiAKLSAgICAgICAgY2FzZSA0MzE6IAotICAgICAgICBjYXNlIDQzNjogCi0gICAgICAgIGNhc2UgNDQxOiAKLSAgICAgICAgY2FzZSA0NDQ6IAotICAgICAgICBjYXNlIDQ0ODogCi0gICAgICAgIGNhc2UgNDUyOiAKLSAgICAgICAgY2FzZSA0NTc6IAotICAgICAgICAgIHsgCi0JLyogSlNQIGV4cHJlc3Npb24gYmVndW4gKGFueXdoZXJlKQotCSAqIEEgY29uc2VxdWVuY2Ugb2YgdGhlIHN0YXJ0IGFueXdoZXJlIHBvc3NpYmlsaXR5IGlzIHRoYXQgdGhlCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMKLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZAotCSAqLwotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MKLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsKLQkJLy8gYXQgdGhlIGJlZ2lubmluZz8hCi0JCXl5cHVzaGJhY2soMik7Ci0JCXJldHVybiBKU1BfQ09OVEVOVDsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIGRvQmxvY2tUYWdTY2FuKCk7Ci0JfQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7Ci0JCXl5cHVzaGJhY2soMyk7Ci0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOwotCX0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYW4gZXhwcmVzc2lvbiBvdXQgaW4gY29udGVudAotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGV4cHJlc3Npb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX0VYUFJFU1NJT05fT1BFTjsKLQl9Ci0JZWxzZSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJKU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOwotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOwotCQl9Ci0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FWFBSRVNTSU9OX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY1NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY3OiAKLSAgICAgICAgY2FzZSA0MDU6IAotICAgICAgICBjYXNlIDQxMjogCi0gICAgICAgIGNhc2UgNDE4OiAKLSAgICAgICAgY2FzZSA0MjI6IAotICAgICAgICBjYXNlIDQyNjogCi0gICAgICAgIGNhc2UgNDMwOiAKLSAgICAgICAgY2FzZSA0MzU6IAotICAgICAgICBjYXNlIDQ0MDogCi0gICAgICAgIGNhc2UgNDQzOiAKLSAgICAgICAgY2FzZSA0NDc6IAotICAgICAgICBjYXNlIDQ1MTogCi0gICAgICAgIGNhc2UgNDU2OiAKLSAgICAgICAgICB7IAotCS8qIEpTUCBkZWNsYXJhdGlvbiBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygzKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDMpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7Ci0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIGRlY2xhcmF0aW9uIG91dCBpbiBjb250ZW50Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiXG5KU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX0RFQ0xBUkFUSU9OX09QRU47Ci0JfQotCWVsc2UgewotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJZHVtcCgiSlNQIGRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOwotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7Ci0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JCX0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7Ci0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RFQ0xBUkFUSU9OX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY1NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzY2OiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgewotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIlxuSlNQIGRpcmVjdGl2ZSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOwotCQlyZXR1cm4gSlNQX0RJUkVDVElWRV9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRElSRUNUSVZFX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRElSRUNUSVZFX0NMT1NFLCBKU1BfQ0xPU0V9KTsKLQkJaWYoeXlzdGF0ZSgpID09IFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKSB7Ci0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQkJCXJldHVybiBCTE9DS19URVhUOwotCQl9Ci0JCXJldHVybiBQUk9YWV9DT05URVhUOwotCX0KLSB9Ci0gICAgICAgIGNhc2UgNjU4OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTY6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjU5OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVNfRU5EKTsKLQlyZXR1cm4gSlNQX1ZCTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjYwOiBicmVhazsKLSAgICAgICAgY2FzZSAzNTA6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwrKzsKLQlpZihmRUxsZXZlbCA9PSAxKSB7Ci0JCXJldHVybiBKU1BfVkJMX09QRU47Ci0JfQotIH0KLSAgICAgICAgY2FzZSA2NjE6IGJyZWFrOwotICAgICAgICBjYXNlIDM0MDogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTX0VORCk7Ci0JcmV0dXJuIEpTUF9FTF9RVU9URURfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjYyOiBicmVhazsKLSAgICAgICAgY2FzZSAzMzY6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFU19FTkQpOwotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDY2MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzM0OiAKLSAgICAgICAgICB7IAotCS8vU3lzdGVtLm91dC5wcmludGxuKEpTUF9FTF9DT05URU5UKyAiOlsiICsgeXl0ZXh0KCkgKyAiXSIpOwotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY0OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzM6IAotICAgICAgICAgIHsgCi0JZkVMbGV2ZWwrKzsKLQlpZihmRUxsZXZlbCA9PSAxKSB7Ci0JCXJldHVybiBKU1BfRUxfT1BFTjsKLQl9Ci0gfQotICAgICAgICBjYXNlIDY2NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzMwOiAKLSAgICAgICAgICB7IAotCWludCBlbnRlclN0YXRlID0geXlzdGF0ZSgpOwotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfVkJMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOwotCS8vIGFib3J0IGVhcmx5IHdoZW4gYW4gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSBpcyBmb3VuZCBpbiB0aGUgVkJMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NjY6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOTogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9EUVVPVEVEX0VMKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQl9Ci0JZWxzZSB7Ci0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7Ci0JfQotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2Njc6IGJyZWFrOwotICAgICAgICBjYXNlIDMyNzogCi0gICAgICAgICAgeyAKLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsKLQl5eWJlZ2luKFNUX0pTUF9TUVVPVEVEX1ZCTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsKLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIFZCTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY4OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjY6IAotICAgICAgICAgIHsgCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7Ci0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9FTCk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9FTF9DTE9TRSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFfSk7Ci0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBFTAotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7Ci0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JfQotCWVsc2UgewotCQl5eWJlZ2luKGVudGVyU3RhdGUpOwotCX0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjY5OiBicmVhazsKLSAgICAgICAgY2FzZSAzMjU6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJAotCX0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gZW5kIHRhZyIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfRU5EX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JaWYoeXlzdGF0ZSgpICE9IFNUX0FCT1JUX0VNQkVEREVEKQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzA6IGJyZWFrOwotICAgICAgICBjYXNlIDI4NDogCi0gICAgICAgIGNhc2UgMjk2OiAKLSAgICAgICAgY2FzZSAzMDI6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVDsKLSB9Ci0gICAgICAgIGNhc2UgNjcxOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzI6IAotICAgICAgICAgIHsgCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7Ci0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0Ci0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7Ci0JLyoKLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4KLQkgKiBhdHRyaWJ1dGUgbmFtZSwgZXF1YWxzLCBvciB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgewotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JCXJldHVybiBYTUxfVEFHX09QRU47Ci0JfQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQkvLyBlbWJlZGRlZCBjb250YWluZXIgc2hvdWxkIGJlIGxvb2tpbmcgZm9yIHRoZSBuYW1lIChhZ2FpbikgbmV4dAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNjcyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICAgIHsgCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7Ci0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0Ci0JeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMSk7Ci0JLyoKLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4KLQkgKiBhdHRyaWJ1dGUgbmFtZSwgZXF1YWxzLCBvciB2YWx1ZSwgcmV0dXJuIGltbWVkaWF0ZWx5LgotCSAqLwotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgewotCQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JCXJldHVybiBYTUxfVEFHX09QRU47Ci0JfQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQKLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0JYXNzZW1ibGVFbWJlZGRlZFRhZ1NlcXVlbmNlKFhNTF9UQUdfT1BFTiwgdGFnTmFtZSk7IC8vID8KLQlmU3RhdGVTdGFjay5wb3AoKTsKLQl5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2ODogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY3NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI1OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBkb3VibGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzU6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkCi0JfQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgdGFnIGVtYmVkZGVkIG5hbWUgc3RhcnQgLSBzdGFydCB0YWciKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7Ci0JZlN0YXRlU3RhY2sucG9wKCk7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCXJldHVybiBQUk9YWV9DT05URVhUOwotIH0KLSAgICAgICAgY2FzZSA2NzY6IGJyZWFrOwotICAgICAgICBjYXNlIDEyMjogCi0gICAgICAgIGNhc2UgMTI3OiAKLSAgICAgICAgY2FzZSAxMjg6IAotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgIGNhc2UgMjc4OiAKLSAgICAgICAgY2FzZSAyNzk6IAotICAgICAgICBjYXNlIDM4NzogCi0gICAgICAgIGNhc2UgMzkwOiAKLSAgICAgICAgY2FzZSA0Njg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDY3NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgNjc4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2Nzk6IGJyZWFrOwotICAgICAgICBjYXNlIDExNjogCi0gICAgICAgIGNhc2UgMTE3OiAKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICBjYXNlIDI2OTogCi0gICAgICAgIGNhc2UgMzg2OiAKLSAgICAgICAgY2FzZSA0Njc6IAotICAgICAgICBjYXNlIDUwNjogCi0gICAgICAgIGNhc2UgNTA3OiAKLSAgICAgICAgY2FzZSA1MjU6IAotICAgICAgICBjYXNlIDUyNjogCi0gICAgICAgIGNhc2UgNTQzOiAKLSAgICAgICAgY2FzZSA1NDQ6IAotICAgICAgICBjYXNlIDU1NjogCi0gICAgICAgIGNhc2UgNTY0OiAKLSAgICAgICAgY2FzZSA1NzE6IAotICAgICAgICBjYXNlIDU3MjogCi0gICAgICAgIGNhc2UgNTczOiAKLSAgICAgICAgY2FzZSA1NzQ6IAotICAgICAgICBjYXNlIDU3NjogCi0gICAgICAgIGNhc2UgNTgyOiAKLSAgICAgICAgY2FzZSA1ODM6IAotICAgICAgICBjYXNlIDU4NDogCi0gICAgICAgIGNhc2UgNTg1OiAKLSAgICAgICAgY2FzZSA1ODY6IAotICAgICAgICBjYXNlIDU5MjogCi0gICAgICAgIGNhc2UgNTkzOiAKLSAgICAgICAgY2FzZSA1OTQ6IAotICAgICAgICBjYXNlIDU5NTogCi0gICAgICAgIGNhc2UgNTk2OiAKLSAgICAgICAgY2FzZSA2MDI6IAotICAgICAgICBjYXNlIDYwMzogCi0gICAgICAgIGNhc2UgNjA1OiAKLSAgICAgICAgY2FzZSA2MDY6IAotICAgICAgICBjYXNlIDYxMjogCi0gICAgICAgIGNhc2UgNjEzOiAKLSAgICAgICAgY2FzZSA2MTQ6IAotICAgICAgICBjYXNlIDYxNTogCi0gICAgICAgIGNhc2UgNjIxOiAKLSAgICAgICAgY2FzZSA2MjI6IAotICAgICAgICBjYXNlIDYyMzogCi0gICAgICAgIGNhc2UgNjI0OiAKLSAgICAgICAgY2FzZSA2Mjc6IAotICAgICAgICBjYXNlIDYyODogCi0gICAgICAgIGNhc2UgNjMwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDY4MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsKLQkJZkVtYmVkZGVkSGludCA9IGdldEJsb2NrTWFya2VyQ29udGV4dCgpOwotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsKLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCX0KLQllbHNlCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA2ODE6IGJyZWFrOwotICAgICAgICBjYXNlIDEwNzogCi0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgY2FzZSAyNjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjgyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg0OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBkaXJlY3RpdmUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFKTsKLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2ODU6IGJyZWFrOwotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgY29kZSBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBkb1NjYW4oIiU+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5ULCBTVF9KU1BfQ09OVEVOVCk7Ci0gfQotICAgICAgICBjYXNlIDY4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTQ6IAotICAgICAgICBjYXNlIDk2OiAKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgMjU0OiAKLSAgICAgICAgY2FzZSAyNTU6IAotICAgICAgICBjYXNlIDI1ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjg3OiBicmVhazsKLSAgICAgICAgY2FzZSA5MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSA2ODg6IGJyZWFrOwotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSA2ODk6IGJyZWFrOwotICAgICAgICBjYXNlIDkwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDY5MDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICBjYXNlIDg2OiAKLSAgICAgICAgY2FzZSAyNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgNjkxOiBicmVhazsKLSAgICAgICAgY2FzZSA4MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0gfQotICAgICAgICBjYXNlIDY5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDIwMDogCi0gICAgICAgIGNhc2UgMjAxOiAKLSAgICAgICAgY2FzZSAyMDQ6IAotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgIGNhc2UgMjE1OiAKLSAgICAgICAgY2FzZSAyMTg6IAotICAgICAgICBjYXNlIDIxOTogCi0gICAgICAgIGNhc2UgMzYxOiAKLSAgICAgICAgY2FzZSAzNjQ6IAotICAgICAgICBjYXNlIDQzOTogCi0gICAgICAgIGNhc2UgNDUwOiAKLSAgICAgICAgY2FzZSA0NTU6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjkzOiBicmVhazsKLSAgICAgICAgY2FzZSA0MzogCi0gICAgICAgIGNhc2UgMTc5OiAKLSAgICAgICAgY2FzZSAxODA6IAotICAgICAgICBjYXNlIDE4MzogCi0gICAgICAgIGNhc2UgMTkzOiAKLSAgICAgICAgY2FzZSAxOTQ6IAotICAgICAgICBjYXNlIDE5NzogCi0gICAgICAgIGNhc2UgMTk4OiAKLSAgICAgICAgY2FzZSAzMzE6IAotICAgICAgICBjYXNlIDM0NTogCi0gICAgICAgIGNhc2UgMzQ4OiAKLSAgICAgICAgY2FzZSA0MTY6IAotICAgICAgICBjYXNlIDQxNzogCi0gICAgICAgIGNhc2UgNDI5OiAKLSAgICAgICAgY2FzZSA0MzQ6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2OTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAxNTk6IAotICAgICAgICBjYXNlIDE2MDogCi0gICAgICAgIGNhc2UgMzIyOiAKLSAgICAgICAgY2FzZSA0MTE6IAotICAgICAgICBjYXNlIDQxNDogCi0gICAgICAgIGNhc2UgNDgyOiAKLSAgICAgICAgY2FzZSA1MTQ6IAotICAgICAgICBjYXNlIDUzMzogCi0gICAgICAgIGNhc2UgNTQ5OiAKLSAgICAgICAgY2FzZSA1NTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk1OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMTUyOiAKLSAgICAgICAgY2FzZSAxNTM6IAotICAgICAgICBjYXNlIDMxMjogCi0gICAgICAgIGNhc2UgNDA0OiAKLSAgICAgICAgY2FzZSA0MDc6IAotICAgICAgICBjYXNlIDQ3OTogCi0gICAgICAgIGNhc2UgNTEzOiAKLSAgICAgICAgY2FzZSA1MzI6IAotICAgICAgICBjYXNlIDU0ODogCi0gICAgICAgIGNhc2UgNTU3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA2OTY6IGJyZWFrOwotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0JaWYoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKT09U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEfHxmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkpIHsKLQkJeXliZWdpbihTVF9BQk9SVF9FTUJFRERFRCk7Ci0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsKLQkJcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCX0KLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOwotCXJldHVybiBXSElURV9TUEFDRTsKLSB9Ci0gICAgICAgIGNhc2UgNjk4OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxOTogCi0gICAgICAgIGNhc2UgMjA6IAotICAgICAgICBjYXNlIDIxOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjc6IAotICAgICAgICBjYXNlIDI4OiAKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMzA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAzMjogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNzM6IAotICAgICAgICBjYXNlIDE3MDogCi0gICAgICAgIGNhc2UgMTc1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSA2OTk6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA2MDogCi0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICBjYXNlIDIyNjogCi0gICAgICAgIGNhc2UgMjI4OiAKLSAgICAgICAgY2FzZSAyMjk6IAotICAgICAgICBjYXNlIDIzMTogCi0gICAgICAgIGNhc2UgMjMzOiAKLSAgICAgICAgY2FzZSAzNzE6IAotICAgICAgICBjYXNlIDM3MjogCi0gICAgICAgIGNhc2UgMzczOiAKLSAgICAgICAgY2FzZSA0NjM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSA3MDA6IGJyZWFrOwotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzAxOiBicmVhazsKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgNjE6IAotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA3MjogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NzogCi0gICAgICAgIGNhc2UgODg6IAotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgY2FzZSAxMjQ6IAotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgIGNhc2UgMTMyOiAKLSAgICAgICAgY2FzZSAxMzM6IAotICAgICAgICBjYXNlIDEzNDogCi0gICAgICAgIGNhc2UgMTM2OiAKLSAgICAgICAgY2FzZSAxMzc6IAotICAgICAgICBjYXNlIDEzOTogCi0gICAgICAgIGNhc2UgMTQwOiAKLSAgICAgICAgY2FzZSAxNDE6IAotICAgICAgICBjYXNlIDE0NDogCi0gICAgICAgIGNhc2UgMTQ1OiAKLSAgICAgICAgY2FzZSAxNDY6IAotICAgICAgICBjYXNlIDE0OTogCi0gICAgICAgIGNhc2UgMTUwOiAKLSAgICAgICAgY2FzZSAxNTE6IAotICAgICAgICBjYXNlIDE1NjogCi0gICAgICAgIGNhc2UgMTU3OiAKLSAgICAgICAgY2FzZSAxNTg6IAotICAgICAgICBjYXNlIDE2NDogCi0gICAgICAgIGNhc2UgMTY3OiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE3MzogCi0gICAgICAgIGNhc2UgMTc3OiAKLSAgICAgICAgY2FzZSAxNzg6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMTg2OiAKLSAgICAgICAgY2FzZSAxODg6IAotICAgICAgICBjYXNlIDE4OTogCi0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgY2FzZSAxOTk6IAotICAgICAgICBjYXNlIDIwNjogCi0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgY2FzZSAyMDk6IAotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgIGNhc2UgMjE2OiAKLSAgICAgICAgY2FzZSAyMjA6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgNzAyOiBicmVhazsKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgIGNhc2UgNjQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7Ci0JU3RyaW5nIHJldHVybmVkQ29udGV4dCA9IGRvU2NhbigiXV0+IiwgZmFsc2UsIHRydWUsIHRydWUsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQsICBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihyZXR1cm5lZENvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gcmV0dXJuZWRDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSA3MDM6IGJyZWFrOwotICAgICAgICBjYXNlIDY4OiAKLSAgICAgICAgY2FzZSAxODc6IAotICAgICAgICBjYXNlIDE5MDogCi0gICAgICAgIGNhc2UgMjA4OiAKLSAgICAgICAgY2FzZSAyMTE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcwNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSA3MDU6IGJyZWFrOwotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICBjYXNlIDIzOTogCi0gICAgICAgIGNhc2UgMjQwOiAKLSAgICAgICAgY2FzZSAzODM6IAotICAgICAgICBjYXNlIDQ2NjogCi0gICAgICAgIGNhc2UgNTA1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7Ci0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSA3MDY6IGJyZWFrOwotICAgICAgICBjYXNlIDc3OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOwotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDcwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzg6IAotICAgICAgICBjYXNlIDc5OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgICAgeyAKLQkJLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOwotIH0KLSAgICAgICAgY2FzZSA3MDg6IGJyZWFrOwotICAgICAgICBjYXNlIDgyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI2OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCk7Ci0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBzaW5nbGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJAotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfU1FVT1RFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpOwotCWZTdGF0ZVN0YWNrLnBvcCgpOwotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7Ci0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzEwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDcxMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcxMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTM4OiAKLSAgICAgICAgY2FzZSAxNDI6IAotICAgICAgICBjYXNlIDI4OTogCi0gICAgICAgIGNhc2UgMjkzOiAKLSAgICAgICAgY2FzZSAzOTk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLSB9Ci0gICAgICAgIGNhc2UgNzEzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICBjYXNlIDE0NzogCi0gICAgICAgIGNhc2UgMjk5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7Ci0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUY7Ci0gfQotICAgICAgICBjYXNlIDcxNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ4OiAKLSAgICAgICAgY2FzZSAzMDU6IAotICAgICAgICBjYXNlIDMwOTogCi0gICAgICAgIGNhc2UgNDAyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOwotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE1OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE2OiBicmVhazsKLSAgICAgICAgY2FzZSAxNTU6IAotICAgICAgICBjYXNlIDMxNTogCi0gICAgICAgIGNhc2UgMzE5OiAKLSAgICAgICAgY2FzZSA0MDk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDcxNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTYxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzE4OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICBjYXNlIDE2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5KU1AgY29tbWVudCB0ZXh0Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsKLSB9Ci0gICAgICAgIGNhc2UgNzE5OiBicmVhazsKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICBjYXNlIDE3NDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDcyMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgICB7IAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7Ci0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIGluc2lkZSBvZiBKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOwotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkKLSAgICAgICAgeXliZWdpbihpbmNvbWluZ1N0YXRlKTsKLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLSB9Ci0gICAgICAgIGNhc2UgNzIxOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzE6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzIyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICAgIHsgCi0JcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzIzOiBicmVhazsKLSAgICAgICAgY2FzZSAxODE6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9FTF9EUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDcyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTgyOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMX1NRVU9URVMpOwotCXJldHVybiBKU1BfRUxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MjU6IGJyZWFrOwotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotCX0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDcyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX0VMKTsKLQlyZXR1cm4gSlNQX0VMX1NRVU9URTsKLSB9Ci0gICAgICAgIGNhc2UgNzI3OiBicmVhazsKLSAgICAgICAgY2FzZSAxOTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfRUwpOwotCXJldHVybiBKU1BfRUxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3Mjg6IGJyZWFrOwotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX0VMX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3Mjk6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfRFFVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MzA6IGJyZWFrOwotICAgICAgICBjYXNlIDIwMzogCi0gICAgICAgICAgeyAKLQl5eWJlZ2luKFNUX0pTUF9WQkxfU1FVT1RFUyk7Ci0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MzE6IGJyZWFrOwotICAgICAgICBjYXNlIDIwNTogCi0gICAgICAgICAgeyAKLQlmRUxsZXZlbC0tOwotCWlmKGZFTGxldmVsID09IDApIHsKLQkJeXliZWdpbihZWUlOSVRJQUwpOwotCQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLQl9Ci0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgNzMyOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JeXliZWdpbihTVF9KU1BfVkJMKTsKLQlyZXR1cm4gSlNQX1ZCTF9TUVVPVEU7Ci0gfQotICAgICAgICBjYXNlIDczMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7IAotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7Ci0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOwotIH0KLSAgICAgICAgY2FzZSA3MzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDIxNzogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gSlNQX1ZCTF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzM1OiBicmVhazsKLSAgICAgICAgY2FzZSAyMjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7Ci0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOwotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSA3MzY6IGJyZWFrOwotICAgICAgICBjYXNlIDIyMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfUEkpOwotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47Ci0gfQotICAgICAgICBjYXNlIDczNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjIzOiAKLSAgICAgICAgY2FzZSAyMzQ6IAotICAgICAgICBjYXNlIDMxMTogCi0gICAgICAgIGNhc2UgMzIxOiAKLSAgICAgICAgY2FzZSAzMzI6IAotICAgICAgICBjYXNlIDMzNzogCi0gICAgICAgIGNhc2UgMzQxOiAKLSAgICAgICAgY2FzZSAzNDQ6IAotICAgICAgICBjYXNlIDM0NzogCi0gICAgICAgIGNhc2UgMzQ5OiAKLSAgICAgICAgY2FzZSAzNTM6IAotICAgICAgICBjYXNlIDM1NzogCi0gICAgICAgIGNhc2UgMzYwOiAKLSAgICAgICAgY2FzZSAzNjM6IAotICAgICAgICAgIHsgCi0JLyogSlNQIHNjcmlwdGxldCBiZWd1biAoYW55d2hlcmUpCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUKLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cwotCSAqICBkdWUgdG8gdGhlIG9yZGVyIG9mIHByZWNlZGVuY2UgZ2VuZXJhdGVkCi0JICovCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcwotCWlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09OVEVOVCkgewotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyEKLQkJeXlwdXNoYmFjaygxKTsKLQkJcmV0dXJuIEpTUF9DT05URU5UOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQl9Ci0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0NPTU1FTlQpIHsKLQkJeXlwdXNoYmFjaygyKTsKLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotCX0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgewotCQl5eXB1c2hiYWNrKDIpOwotCQlyZXR1cm4gc2NhbkpTUENvbW1lbnRUZXh0KCk7Ci0JfQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsKLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQKLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCQlkdW1wKCJcbkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOwotCQlyZXR1cm4gSlNQX1NDUklQVExFVF9PUEVOOwotCX0KLQllbHNlIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJCWR1bXAoIkpTUCBzY3JpcHRsZXQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsKLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgewotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsKLQkJfQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsKLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfU0NSSVBUTEVUX09QRU4sIEpTUF9DTE9TRSk7Ci0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgewotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsKLQkJfQotCQkvLyByZXF1aXJlZCBoZWxwIGZvciBzdWNjZXNzaXZlIGVtYmVkZGVkIHJlZ2lvbnMKLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfTkFNRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQllbHNlIGlmKCh5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IHl5c3RhdGUoKSA9PSBTVF9YTUxfRVFVQUxTKSkgewotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOwotCQl9Ci0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsKLQkJfQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsKLQl9Ci0gfQotICAgICAgICBjYXNlIDczODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjI0OiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgNzM5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQwOiBicmVhazsKLSAgICAgICAgY2FzZSAyNDE6IAotICAgICAgICAgIHsgCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUKLQkJZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDE6IGJyZWFrOwotICAgICAgICBjYXNlIDI0MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7Ci0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgNzQyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNTk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gSlNQX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBKU1BfRElSRUNUSVZFX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSA3NDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDE2MjogCi0gICAgICAgIGNhc2UgMTYzOiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDc0NTogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9KU1BUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1NzRlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL0pTUFRva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI2NDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLQ0KLS8qbmxzWFhYKi8NCi0NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5pbnRlcm5hbC5wYXJzZXIuaW50ZXJuYWw7DQotDQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01KU1BSZWdpb25Db250ZXh0czsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5UYWdNYXJrZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbkNvbnRhaW5lcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5JbnRTdGFjazsNCi0NCi0lJQ0KLQ0KLSV7DQotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsNCi0gDQotCS8vIHJlcXVpcmVkIGhvbGRlcnMgZm9yIHdoaXRlLXNwYWNlIGNvbXBhY3RpbmcNCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7DQotCXByaXZhdGUgaW50IGZCdWZmZXJlZFN0YXJ0ID0gMTsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsNCi0NCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQkvLyBhICJoaW50IiBhcyB0byB3aGF0IGFuIGVtYmVkZGVkIHJlZ2lvbiBzaG91bGQgYmUgZXZhbHVhdGVkDQotCXByaXZhdGUgU3RyaW5nIGZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCS8vIGEgImhpbnQiIGFzIHRvIHdoYXQgc3RhdGUgdG8gZW50ZXIgb25jZSBhbiBlbWJlZGRlZCByZWdpb24gaGFzDQotCS8vICAgYmVlbiBjb21wbGV0ZWQNCi0JcHJpdmF0ZSBpbnQgZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQkvLyB0aGUgY29udGFpbmVyIHVzZWQgdG8gY3JlYXRlIGVtYmVkZGVkIHJlZ2lvbnMNCi0JcHJpdmF0ZSBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGZFbWJlZGRlZENvbnRhaW5lciA9IG51bGw7DQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9DT05URVhUID0gIlBST1hZX0NPTlRFWFQiOw0KLQ0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOw0KLQlwcml2YXRlIGludCB0ZXh0TGVuZ3RoID0gMDsNCi0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsNCi0NCi0JLy8gb2Zmc2V0IGZvciB0cmFja2luZyBwb3NpdGlvbiBzcGVjaWZpYyBibG9jayB0YWdzDQotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOw0KLQkNCi0JLy8gdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdGFnIGJlaW5nIG9wZW5lZA0KLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgaW5zaWRlIG9mIGFuIGVtYmVkZGVkIHJlZ2lvbg0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFRhZ05hbWUgPSBudWxsOw0KLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbENvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyB0aGUgbGlzdCBvZiB0YWcgbmFtZSBCbG9ja01hcmtlcnMNCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KDApOw0KLQlwcml2YXRlIExpc3QgZk5lc3RhYmxlUHJlZml4ZXMgPSBuZXcgQXJyYXlMaXN0KDEpOw0KLQkNCi0JLy8gd2hlcmUgdGhlIGxhc3QgaW50ZXJuYWwgY29udGFpbmVyIGJsb2NrIHdhcyBmb3VuZA0KLQlwcml2YXRlIGludCBmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IC0xOw0KLQ0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnDQotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IHRydWU7DQotDQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZkZvcmJpZEpTUCA9IGZhbHNlOw0KLQkNCi0JcHJpdmF0ZSBpbnQgZkVMbGV2ZWwgPSAwOw0KLQ0KLQlwcml2YXRlIEpTUFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgSlNQUGFyc2VyUmVnaW9uRmFjdG9yeSgpOw0KLQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsNCi0JCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkNCi0JCQlyZXR1cm47DQotCQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkTmVzdGFibGVQcmVmaXgoVGFnTWFya2VyIG1hcmtlcikgew0KLQkJZk5lc3RhYmxlUHJlZml4ZXMuYWRkKG1hcmtlcik7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIExpc3QgZ2V0TmVzdGFibGVQcmVmaXhlcygpIHsNCi0JCXJldHVybiBmTmVzdGFibGVQcmVmaXhlczsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICovDQotCXByaXZhdGUgYm9vbGVhbiBpc05lc3RhYmxlKFN0cmluZyB0YWdOYW1lKSB7DQotCQkvL0l0ZXJhdG9yIGJsb2NrcyA9IGZOZXN0YWJsZVByZWZpeGVzLml0ZXJhdG9yKCk7DQotCQkvL3doaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0JCS8vCVRhZ01hcmtlciBtYXJrZXIgPSAoVGFnTWFya2VyKWJsb2Nrcy5uZXh0KCk7DQotCQkvLwlTdHJpbmcgbWFya2VyTmFtZSA9IG1hcmtlci5nZXRUYWdOYW1lKCk7DQotCQkvLwlpZih0YWdOYW1lLmxlbmd0aCgpID4gbWFya2VyTmFtZS5sZW5ndGgoKSArIDEgJiYgdGFnTmFtZS5zdGFydHNXaXRoKG1hcmtlck5hbWUpICYmIHRhZ05hbWUuY2hhckF0KG1hcmtlck5hbWUubGVuZ3RoKCkpID09ICc6Jykgew0KLQkJLy8JCXJldHVybiBtYXJrZXIuaXNHbG9iYWwoKSB8fCBnZXRPZmZzZXQoKSA+PSBtYXJrZXIuZ2V0TWFya2VyKCkuZ2V0U3RhcnQoKTsNCi0JCS8vCX0NCi0JCS8vfQ0KLQkJLy9yZXR1cm4gZmFsc2U7DQotCQlyZXR1cm4gdHJ1ZTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVOZXN0YWJsZVByZWZpeChTdHJpbmcgbmFtZSkgew0KLQkJaWYgKGZOZXN0YWJsZVByZWZpeGVzICE9IG51bGwpIHsNCi0JCQlJdGVyYXRvciBuZXN0YWJsZXMgPSBmTmVzdGFibGVQcmVmaXhlcy5pdGVyYXRvcigpOw0KLQkJCXdoaWxlIChuZXN0YWJsZXMuaGFzTmV4dCgpKSB7DQotCQkJCWlmICgoKFRhZ01hcmtlcikgbmVzdGFibGVzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJCQluZXN0YWJsZXMucmVtb3ZlKCk7DQotCQkJfQ0KLQkJfQ0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCANCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQkJZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QgDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgew0KLQkJaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgew0KLQkJCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0JCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkNCi0JCQkJCWJsb2Nrcy5yZW1vdmUoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGFzc2VtYmxlRW1iZWRkZWRUYWdTZXF1ZW5jZShTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmcgZW5kVGFnTmFtZSkgew0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihzdGFydFR5cGUsIG51bGwsIGVuZFRhZ05hbWUpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZ1tdIGVuZFR5cGVzKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgZW5kVHlwZXMsIG51bGwpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgdm9pZCBhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFN0cmluZyBzdGFydFR5cGUsIFN0cmluZyBlbmRUeXBlKSB7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKHN0YXJ0VHlwZSwgbmV3IFN0cmluZ1tde2VuZFR5cGV9LCBudWxsKTsNCi0JfQ0KLQkvKioNCi0JICogIHVzZXIgbWV0aG9kIA0KLQkgKiANCi0JICogQXNzZW1ibGVzIGFuIGVtYmVkZGVkIGNvbnRhaW5lciBiZWdpbm5pbmcgd2l0aCB0aGUgZ2l2ZW4gc3RhcnRUeXBlIGFzDQotCSAqIHRoZSBmaXJzdCBDb250ZXh0UmVnaW9uIHdpdGhpbiBpdCBhbmQgb2YgdGhlIHR5cGUgZkVtYmVkZGVkSGludC4gIFRoZQ0KLQkgKiBlbmRUeXBlc1tdIGFycmF5IGNvbnRhaW5zIHRoZSBjb250ZXh0IHR5cGVzIHRoYXQgd2lsbCBjYXVzZSBhIHN1Y2Nlc3NmdWwNCi0JICogZXhpdC4gIFVzZSBvZiB0aGUgZW5kVGFnTmFtZSBwYXJhbWV0ZXIgYWx0ZXJzIHRoaXMgYmVoYXZpb3IgdG8gZm9yY2UgYW4NCi0JICogZXhpdCBvbiBhbiBYTUxfVEFHX0NMT1NFIGFmdGVyIHNlZWluZyBhbiBYTUxfVEFHX05BTUUgd2hvc2Ugc2lnbmlmaWNhbnQNCi0JICogdGV4dCBtYXRjaGVzIHRoZSBlbmRUYWdOYW1lIFN0cmluZy4gIEFsbCBjb250ZW50cyBpbiBiZXR3ZWVuIGFyZQ0KLQkgKiBpbnNpZ25pZmljYW50LCBhbmQgeWVzLCB0aGlzIG1lYW5zIGNvbW1lbnRzIGFyZSBhbGxvd2VkIGluc2lkZS4NCi0JICoqLw0KLQlwcml2YXRlIGZpbmFsIHZvaWQgYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihTdHJpbmcgc3RhcnRUeXBlLCBTdHJpbmdbXSBlbmRUeXBlcywgU3RyaW5nIGVuZFRhZ05hbWUpIHsNCi0JCS8vIHRoZSBjb250ZXh0IG9mIHRoZSByZWdpb24gYmVpbmcgYWRkZWQgdG8gdGhlIGVtYmVkZGVkIGNvbnRhaW5lcg0KLQkJaW50ZXJuYWxDb250ZXh0ID0gc3RhcnRUeXBlOw0KLQkJLy8ga2VlcCB0cmFjayBvZiB3aGVyZSB0aGlzIGNvbnRhaW5lciBiZWdhbjsgdG8gcHJvdmlkZSByZWxhdGl2ZSBpbmRlY2VzIGZvciB0aGUgcmVnaW9ucw0KLQkJaW50IGNvbnRhaW5lclN0YXJ0ID0geXljaGFyOw0KLQkJYm9vbGVhbiBub3RGaW5pc2hlZCA9IHRydWU7DQotCQkvLyBrZWVwIHRyYWNrIG9mIHdoZXJlIHdlIHNlZW0gdG8gYmUgc28gdGhhdCB0aGUgZW5kVGFnTmFtZSBjYW4gYmUgY2hlY2tlZA0KLQkJYm9vbGVhbiBpc0luRW5kVGFnID0gZmFsc2U7DQotCQlib29sZWFuIGlzSW5GaXJzdFRhZyA9IHRydWU7DQotCQkvLyBjcmVhdGUgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciBhbmQgc2V0dXAgaXRzICJ0eXBlIg0KLQkJaWYgKGZFbWJlZGRlZENvbnRhaW5lciA9PSBudWxsKSB7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbmV3IENvbnRleHRSZWdpb25Db250YWluZXIoKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShmRW1iZWRkZWRIaW50KTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0U3RhcnQoY29udGFpbmVyU3RhcnQpOw0KLQkJCS8vIFRPRE86IHBhcmVudCByZWdpb24gbmVlZHMgdG8gYmUgc2V0IC4uLi4gYnV0IG5vdCBzdXJlIHdoZXJlIHRvIGdldCBpdCBmcm9tIA0KLQkJCS8vCQlmRW1iZWRkZWRDb250YWluZXIuc2V0UGFyZW50KHBhcmVudFJlZ2lvbik7DQotCQl9DQotCQljb250YWluZXJTdGFydCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRTdGFydCgpOw0KLQkJd2hpbGUgKG5vdEZpbmlzaGVkKSB7DQotCQkJLy8gYWRkIHRoZSByZWdpb24gdG8gdGhlIGNvbnRhaW5lcg0KLQkJCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCQlJVGV4dFJlZ2lvbiBuZXdUb2tlbiA9IGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGludGVybmFsQ29udGV4dCwgeXljaGFyIC0gY29udGFpbmVyU3RhcnQsIHl5bGVuZ3RoKCksIHl5bGVuZ3RoKCkpOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRUZXh0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRUZXh0TGVuZ3RoKCkgKyB5eWxlbmd0aCgpKTsNCi0JCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsNCi0JCQl9DQotCQkJdHJ5IHsNCi0JCQkJLy8gbG9uZ3NjYW4gZGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGF0dGVtcHQgYSBibG9ja1RhZ1NjYW4gd2l0aGluIHRoZSBlbWJlZGRlZCBjb250YWluZXINCi0JCQkJYm9vbGVhbiBsb25nc2NhbiA9IGZhbHNlOw0KLQkJCQkvLyBzYXZlIHRoZSB0b2tlbml6ZXIgc3RhdGUgaW4gY2FzZSBvZiBhIGJsb2NrIHRhZyBzY2FuDQotCQkJCWludCBwcmV2aW91c1N0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQlTdHJpbmcgcHJldmlvdXNDdXJyZW50VGFnTmFtZSA9IGZDdXJyZW50VGFnTmFtZTsNCi0JCQkJaW50IHByZXZpb3VzUG9zdFN0YXRlID0gZkVtYmVkZGVkUG9zdFN0YXRlOw0KLQkJCQlTdHJpbmcgcHJldmlvdXNFbWJlZGRlZEhpbnQgPSBmRW1iZWRkZWRIaW50Ow0KLQkJCQkvLyBkZXRlcm1pbmUgaWYgYSBibG9jayB0YWcgc2NhbiBpcyBuZWNlc3NhcnkNCi0JCQkJaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX05BTUUpIHsNCi0JCQkJCWludGVybmFsVGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJCQkJaWYoIWlzTmVzdGFibGUoaW50ZXJuYWxUYWdOYW1lKSkgew0KLQkJCQkJCWludGVybmFsVGFnTmFtZSA9IG51bGw7DQotCQkJCQkJLy8gc25hZ2dlZCBhIHRhZyBuYW1lIHdlIHNob3VsZG4ndCBoYXZlDQotCQkJCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQUJPUlRfRU1CRURERUQ7DQotCQkJCQkJbm90RmluaXNoZWQgPSBmYWxzZTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIGlmIChpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19PUEVOIHx8IGludGVybmFsQ29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJCQlpbnRlcm5hbFRhZ05hbWUgPSBudWxsOw0KLQkJCQl9DQotCQkJCS8vIGRvIHVwa2VlcCBmb3IgZW5kVGFnTmFtZSB1c2FnZTsgbXVzdCBiZSBoZXJlIHNpbmNlIHRoZSBuZXh0IHRva2VuIGNvdWxkIGJlIHRoZSBjbG9zZQ0KLQkJCQlpZiAoaW50ZXJuYWxDb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJCWlzSW5FbmRUYWcgPSB0cnVlOw0KLQkJCQl9IGVsc2UgaWYgKGludGVybmFsQ29udGV4dCA9PSBYTUxfVEFHX0NMT1NFKSB7DQotCQkJCQlpc0luRmlyc3RUYWcgPSBpc0luRW5kVGFnID0gZmFsc2U7DQotCQkJCX0gZWxzZSB7DQotCQkJCSAJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucyA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7DQotCQkJCQlpZiAoZW1iZWRkZWRSZWdpb25zLnNpemUoKSA+IDIgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKS0xKSkuZ2V0VHlwZSgpID09IFhNTF9UQUdfQ0xPU0UgJiYgKGVtYmVkZGVkUmVnaW9ucy5nZXQoZW1iZWRkZWRSZWdpb25zLnNpemUoKSAtIDMpKS5nZXRUeXBlKCkgPT0gWE1MX1RBR19PUEVOICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsKSB7DQotCQkJCQkJaWYgKGNvbnRhaW5zVGFnTmFtZShpbnRlcm5hbFRhZ05hbWUpKSB7DQotCQkJCQkJCWxvbmdzY2FuID0gdHJ1ZTsNCi0JCQkJCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQkJCQkJfQ0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCWlmIChsb25nc2NhbikNCi0JCQkJCWZDdXJyZW50VGFnTmFtZSA9IGludGVybmFsVGFnTmFtZTsNCi0JCQkJLy8gcmVhZCB0aGUgbmV4dCByZWdpb24gYW5kIGNvbnRleHQNCi0JCQkJaW50ZXJuYWxDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQlpZiAobG9uZ3NjYW4pIHsNCi0JCQkJCS8vIFJldHVybmluZyBmcm9tIGEgYmxvY2sgdGFnIHNjYW4gcmVxdWlyZXMgcmVzdG9yaW5nIHNvbWUgc3RhdGUgdmFyaWFibGVzDQotCQkJCQkvLyBhcyB3ZWxsIGFzIGhhbmRsaW5nIHRoZSBibG9jayByZWdpb24gYW5kIHNldHRpbmcgdXAgZm9yIG5vcm1hbCBzY2FubmluZw0KLQkJCQkJLy8gaW5zaWRlIHRoZSBlbWJlZGRlZCBjb250YWluZXINCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuZ2V0UmVnaW9ucygpLmFkZChuZXdUb2tlbik7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoZkVtYmVkZGVkQ29udGFpbmVyLmdldFRleHRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMNCi0JCQkJCS8vIG5ld1Rva2VuLnNldFBhcmVudChmRW1iZWRkZWRDb250YWluZXIpOw0KLQkJCQkJbG9uZ3NjYW4gPSBmYWxzZTsNCi0JCQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IHByZXZpb3VzUG9zdFN0YXRlOw0KLQkJCQkJZkVtYmVkZGVkSGludCA9IHByZXZpb3VzRW1iZWRkZWRIaW50Ow0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gcHJldmlvdXNDdXJyZW50VGFnTmFtZTsNCi0JCQkJCXl5YmVnaW4ocHJldmlvdXNTdGF0ZSk7DQotCQkJCQlpbnRlcm5hbENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCX0NCi0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7DQotCQkJCS8vIHByaW1HZXROZXh0VG9rZW4oKSBjYWxscyBtYXkgdGhyb3cgYW4gSU9FeGNlcHRpb24NCi0JCQkJLy8gY2F0Y2ggYW5kIGRvIG5vdGhpbmcgc2luY2UgdGhlIGlzRU9GIGNoZWNrIGJlbG93DQotCQkJCS8vIHdpbGwgcHJvcGVybHkgZXhpdCBpZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydA0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBmKSB7DQotCQkJCS8vIHNvbWUgb3RoZXIgZXhjZXB0aW9uIGhhcHBlbmVkOyBuZXZlciBzaG91bGQNCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmKTsNCi0JCQl9DQotCQkJYm9vbGVhbiBpc0VuZGluZ1R5cGUgPSB5eXN0YXRlKCkgPT0gU1RfQUJPUlRfRU1CRURERUQ7DQotCQkJaWYoIWlzRW5kaW5nVHlwZSkgew0KLQkJCQkvLyBjaGVjayBmb3IgZW5kaW5nIGNvbnRleHQNCi0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkgew0KLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbmRUeXBlcy5sZW5ndGg7IGkrKykgew0KLQkJCQkJCWlzRW5kaW5nVHlwZSA9IGlzRW5kaW5nVHlwZSB8fCAoaW50ZXJuYWxDb250ZXh0ID09IGVuZFR5cGVzW2ldKTsNCi0JCQkJCX0NCi0JCQkJfQ0KLQkJCQllbHNlIHsNCi0JCQkJCWlzRW5kaW5nVHlwZSA9ICgoaXNJbkVuZFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX1RBR19DTE9TRSkgfHwgKGlzSW5GaXJzdFRhZyAmJiBpbnRlcm5hbENvbnRleHQgPT0gWE1MX0VNUFRZX1RBR19DTE9TRSkpICYmIGludGVybmFsVGFnTmFtZSAhPSBudWxsICYmIGludGVybmFsVGFnTmFtZS5lcXVhbHMoZW5kVGFnTmFtZSk7DQotCQkJCX0NCi0JCQl9DQotCQkJSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkTGlzdCA9IGZFbWJlZGRlZENvbnRhaW5lci5nZXRSZWdpb25zKCk7DQotCQkJbm90RmluaXNoZWQgPSBub3RGaW5pc2hlZCAmJiAoKCFpc0VuZGluZ1R5cGUpICYmICFpc0VPRigpICYmIChlbmRUYWdOYW1lICE9IG51bGwgfHwgaW50ZXJuYWxDb250ZXh0ICE9IFVOREVGSU5FRCkgJiYgIShpbnRlcm5hbENvbnRleHQgPT0gUFJPWFlfQ09OVEVYVCAmJiAoZW1iZWRkZWRMaXN0LmdldChlbWJlZGRlZExpc3Quc2l6ZSgpLTEpKS5nZXRUeXBlKCkgPT0gVU5ERUZJTkVEKSk7DQotCQl9DQotCQkvLyBmaW5pc2ggYWRkaW5nIHRoZSBsYXN0IGNvbnRleHQNCi0JCWlmIChpbnRlcm5hbENvbnRleHQgIT0gbnVsbCAmJiBpbnRlcm5hbENvbnRleHQgIT0gUFJPWFlfQ09OVEVYVCkgew0KLQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oaW50ZXJuYWxDb250ZXh0LCB5eWNoYXIgLSBjb250YWluZXJTdGFydCwgeXlsZW5ndGgoKSwgeXlsZW5ndGgoKSk7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOw0KLQkJCS8vIERXLCA0LzE2LzIwMDMgdG9rZW4gcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzDQotCQkJLy9uZXdUb2tlbi5zZXRQYXJlbnQoZkVtYmVkZGVkQ29udGFpbmVyKTsNCi0JCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKHl5Y2hhciAtIGNvbnRhaW5lclN0YXJ0ICsgeXlsZW5ndGgoKSk7DQotCQkJZkVtYmVkZGVkQ29udGFpbmVyLnNldFRleHRMZW5ndGgoeXljaGFyIC0gY29udGFpbmVyU3RhcnQgKyB5eWxlbmd0aCgpKTsNCi0JCX0NCi0JCXl5YmVnaW4oZkVtYmVkZGVkUG9zdFN0YXRlKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsNCi0JCXJldHVybiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmc7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGJvb2xlYW4gbmV3VmFsdWUpIHsNCi0JCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCkgew0KLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJBbGxvd3NKU1AoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsNCi0JCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5hbGxvd3NKU1AoKTsNCi0JCX0NCi0JCXJldHVybiB0cnVlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgew0KLQkJcmV0dXJuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOw0KLQkJfQ0KLQkJcmV0dXJuIHRydWU7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7DQotCQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsNCi0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQkJd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkNCi0JCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7DQotCQl9DQotCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgTGlzdCBnZXRCbG9ja01hcmtlcnMoKSB7DQotCQlyZXR1cm4gZkJsb2NrTWFya2VyczsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOw0KLQl9DQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgew0KLQkJcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgew0KLQkJaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpDQotCQkJcmV0dXJuIGZhbHNlOw0KLQkJcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICovDQotCXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKSB7DQotCQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsNCi0JfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogU3BlY2lhbCB0b2tlbml6ZXIgc2V0dXAuICBBbGxvd3MgdG9rZW5pemF0aW9uIHRvIGJlIGluaXRpYXRlZCBhdCB0aGUNCi0JICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuDQotCSAqDQotCSAqIEV4YW1wbGU6IA0KLQkgKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7DQotCSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7DQotCSAqCXRva2VyLnJlc2V0KG5ldyBqYXZhLmlvLlN0cmluZ1JlYWRlcigiYWZpdWhxd2tlamh0YXNpaGdhbGt3aHRxPC9zY3JpcHRlcj48L3Njcj48L3NjcmlwdD5hc2dkYXNnYSIpKTsNCi0JICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOw0KLQkgKgl0b2tlci5nZXRSZWdpb25zKCk7IA0KLQkgKg0KLQkgKiBSZXR1cm5zOg0KLQkgKglCTE9DS19URVhUOiAwLTQwDQotCSAqCVhNTF9FTkRfVEFHX09QRU46IDQxLTQyDQotCSAqCVhNTF9UQUdfTkFNRTogNDMtNDgNCi0JICoJWE1MX1RBR19DTE9TRTogNDktNDkNCi0JICoJWE1MX0NPTlRFTlQ6IDUwLTU3DQotCSAqDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrTWFya2VyU2NhbihTdHJpbmcgbmV3VGFnTmFtZSwgU3RyaW5nIGJsb2NrY29udGV4dCkgew0KLQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOw0KLQl9DQotDQotLyoqDQotICogTWV0aG9kIGRvU2Nhbi4NCi0gKiANCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcg0KLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nDQotICogDQotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIg0KLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nDQotICogQHBhcmFtIGFsbG93SlNQIC0gY2hlY2sgZm9yIGFuZCBhbGxvdyBmb3IgSlNQIG1hcmt1cCA8JSU+DQotICogQHBhcmFtIGNvbnRleHQgLSB0aGUgY29udGV4dCBvZiB0aGUgc2Nhbm5lZCByZWdpb24gaWYgbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgNCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQ0KLSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIGNvbnRleHQgZm91bmQ6IHRoZSBkZXNpcmVkIGNvbnRleHQgb24gYSBub24temVybyBsZW5ndGggbWF0Y2gsIHRoZSBhYm9ydENvbnRleHQgb24gaW1tZWRpYXRlIHN1Y2Nlc3MNCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9TY2FuKFN0cmluZyBzZWFyY2hTdHJpbmcsIGJvb2xlYW4gcmVxdWlyZVRhaWxTZXBhcmF0b3IsIGJvb2xlYW4gYWxsb3dKU1AsIGJvb2xlYW4gYWxsb3dDREFUQSwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlib29sZWFuIHN0aWxsU2VhcmNoaW5nID0gdHJ1ZTsNCi0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkNCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCWludCBzZWFyY2hTdHJpbmdMZW5ndGggPSBzZWFyY2hTdHJpbmcubGVuZ3RoKCk7DQotCWludCBuID0gMDsNCi0JY2hhciBsYXN0Q2hlY2tDaGFyOw0KLQlpbnQgaTsNCi0JYm9vbGVhbiBzYW1lID0gZmFsc2U7DQotCS8vIENoZWNrIGZvciBKU1Agc3RhcnRzICgiPCUiKSBpZiB0aGUgdGFnIGlzIGdsb2JhbCBsaWtlIFNDUklQVCBvciBTVFlMRQ0KLQlib29sZWFuIGNoZWNrSlNQcyA9IGFsbG93SlNQICYmICFmRm9yYmlkSlNQOw0KLQlib29sZWFuIGNoZWNrZWRGb3JKU1BzT25jZSA9ICFjaGVja0pTUHM7DQotCWJvb2xlYW4gY2hlY2tlZEpTUHNBdFN0YXJ0T25jZSA9IGZhbHNlOw0KLQkNCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7DQotCQluID0gMDsNCi0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuDQotCQluID0geXlfYWR2YW5jZSgpOw0KLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQ0KLQkJCW4gPSB5eV9hZHZhbmNlKCk7DQotLy8JCWMgPSAoY2hhcikgbjsNCi0JCS8vIElmIHRoZSBpbnB1dCB3YXMgdG9vIHNob3J0IG9yIHdlJ3ZlIGV4aGF1c3RlZCB0aGUgaW5wdXQsIHN0b3AgaW1tZWRpYXRlbHkuDQotCQlpZiAobiA9PSBZWUVPRiAmJiBjaGVja2VkRm9ySlNQc09uY2UpIHsNCi0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJLyoqDQotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgSlNQcyAiPCUiDQotCQkJICovDQotCQkJY2hlY2tlZEZvckpTUHNPbmNlID0gdHJ1ZTsNCi0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoIDogVGhlcmUncyBhdCBsZWFzdCBzZWFyY2hTdHJpbmdMZW5ndGggb2YgaW5wdXQgYXZhaWxhYmxlOyBvbmNlIHRoYXQncyByZWFkLCBjaGVjayBmb3IgSlNQcw0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCBjdXJyZW50LXNlYXJjaFN0cmluZ0xlbmd0aDsgaWYgc28sIGJhY2t1cCBhbmQgc3dpdGNoIHNjYW5uZXIgc3RhdGVzIHRvIGhhbmRsZSBpdC4NCi0JCQkvLyBFbnN1cmUgdGhhdCB3ZSd2ZSBub3QgZW5jb3VudGVyZWQgYSBjb21wbGV0ZSBibG9jayAoPCUlPikgdGhhdCB3YXMgKnNob3J0ZXIqIHRoYW4gdGhlIGNsb3NlVGFnU3RyaW5nIGFuZA0KLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4NCi0JCQlpZihjaGVja0pTUHMgJiYgeXlfY3VycmVudFBvcyA+IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIA0KLQkJCQl5eV9idWZmZXJbeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gJzwnICYmIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoICsgMV0gPT0gJyUnKSB7DQotCQkJCWZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ID0geXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsNCi0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7DQotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7DQotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQl9DQotCQkJLy8gMikgeXlfY3VycmVudFBvcyAtIGpzcHN0YXJ0ZXIubGVuZ3RoIDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgSlNQIDIgc3BvdHMgYmFjayBpbiB3aGF0IHdlIGNvdWxkIHJlYWQNCi0JCQkvLyAtLS0NCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb247IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbg0KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uICpoYXZpbmcqIGNsb3NlVGFnU3RyaW5nTGVuZ3RoIGFtb3VudCBvZiBpbnB1dCB0byB3b3JrIGFzIGRlc2lnbmVkLiAgTXVzdCBiZSBzdXJlIHdlIGRvbid0DQotCQkJLy8gc3BpbGwgb3ZlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIgd2hpbGUgY2hlY2tpbmcuDQotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJg0KLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgew0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0JCQkvLyAzKSB5eV9jdXJyZW50UG9zLi4oeXlfY3VycmVudFBvcytqc3BTdGFydGxlbmd0aC0xKSA6IENoZWNrIGF0IHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgb25lIHRpbWUNCi0JCQkvLyAtLS0NCi0JCQkvLyBMb29rIGZvciBhIEpTUCBiZWdpbm5pbmcgaW1tZWRpYXRlbHkgaW4gdGhlIGJsb2NrIGFyZWE7IHRoaXMgY2FzZSB3b3VsZG4ndCBiZSBoYW5kbGVkIGJ5IHRoZSBwcmVjZWRpbmcgc2VjdGlvbg0KLQkJCS8vIHNpbmNlIGl0IHJlbGllcyB1cG9uIHl5X2N1cnJlbnRQb3MgZXF1YWxpbmcgZXhhY3RseSB0aGUgcHJldmlvdXMgZW5kICsxIHRvIHdvcmsgYXMgZGVzaWduZWQuDQotCQkJZWxzZSBpZihjaGVja0pTUHMgJiYgIWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYNCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7DQotCQkJCWNoZWNrZWRKU1BzQXRTdGFydE9uY2UgPSB0cnVlOw0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsNCi0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7DQotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7DQotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQl9DQotDQotDQotCQkJLyoqDQotCQkJICogTG9vayBmb3Igc3RhcnRpbmcgQ0RBVEEgIjwhW0NEQVRBWyINCi0JCQkgKi8NCi0JCQkvLyAxKSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOiBUaGVyZSdzIGF0IGxlYXN0IHNlYXJjaFN0cmluZ0xlbmd0aCBvZiBpbnB1dCBhdmFpbGFibGU7IG9uY2UgdGhhdCdzIHJlYWQsIGNoZWNrIGZvciBDREFUQQ0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgQ0RBVEEgYmVnaW5uaW5nIGF0IGN1cnJlbnQtc2VhcmNoU3RyaW5nTGVuZ3RoOyBpZiBzbywgYmFja3VwIGFuZCBzd2l0Y2ggc2Nhbm5lciBzdGF0ZXMgdG8gaGFuZGxlIGl0Lg0KLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8WyFDREFUQVtdXT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQNCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotLyoJCQlpZihjaGVja0NEQVRBICYmIHl5X2N1cnJlbnRQb3MgPiBzZWFyY2hTdHJpbmdMZW5ndGggJiYgeXlfY3VycmVudFBvcyArIHNlYXJjaFN0cmluZ0xlbmd0aCA8IHl5X2J1ZmZlci5sZW5ndGggJiYgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCAhPSBmTGFzdEludGVybmFsQmxvY2tTdGFydCAmJiANCi0JCQkJY2hhcnNNYXRjaChjZGF0YVN0YXJ0ZXIsIHl5X2J1ZmZlciwgMCwgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aCkpIHsNCi0JCQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSB5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQkvLyBnbyB0byBhIHN0YXRlIHdoZXJlIENEQVRBIGNhbiBiZSBmb3VuZA0KLQkJCQlpZiAoZkVtYmVkZGVkQ29udGFpbmVyID09IG51bGwpIHsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lciA9IG5ldyBDb250ZXh0UmVnaW9uQ29udGFpbmVyKCk7DQotCQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VHlwZShzZWFyY2hDb250ZXh0KTsNCi0JCQkJCWZFbWJlZGRlZENvbnRhaW5lci5zZXRTdGFydCh5eWNoYXIpOw0KLQkJCQl9DQotCQkJCUlUZXh0UmVnaW9uIG5ld1Rva2VuID0gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oc2VhcmNoQ29udGV4dCwgeXljaGFyLCB5eWxlbmd0aCgpLCB5eWxlbmd0aCgpKTsNCi0JCQkJZkVtYmVkZGVkQ29udGFpbmVyLmdldFJlZ2lvbnMoKS5hZGQobmV3VG9rZW4pOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0TGVuZ3RoKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMZW5ndGgoKSArIHl5bGVuZ3RoKCkpOw0KLQkJCQlmRW1iZWRkZWRDb250YWluZXIuc2V0VGV4dExlbmd0aChmRW1iZWRkZWRDb250YWluZXIuZ2V0VGV4dExlbmd0aCgpICsgeXlsZW5ndGgoKSk7DQotCQkJCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCQkJU3RyaW5nIGNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCWlmKGNvbnRleHQuZXF1YWxzKFhNTFJlZ2lvbkNvbnRleHRzLlhNTF9DREFUQV9PUEVOKSkgew0KLQkJCQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxSZWdpb25Db250ZXh0cy5YTUxfQ0RBVEFfT1BFTiwgWE1MUmVnaW9uQ29udGV4dHMuWE1MX0NEQVRBX0NMT1NFKTsNCi0JCQkJfQ0KLQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotCQkJfQ0KLSovLyoNCi0JCQkvLyAyKSB5eV9jdXJyZW50UG9zIC0gY2RhdGFTdGFydGVyLmxlbmd0aDogVGhlcmUncyBub3Qgc2VhcmNoU3RyaW5nTGVuZ3RoIG9mIGlucHV0IGF2YWlsYWJsZTsgY2hlY2sgZm9yIGEgQ0RBVEEgcmlnaHQgaGVyZSBzcG90cyBiYWNrIGluIHdoYXQgd2UgY291bGQgcmVhZA0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBhdCB0aGUgY3VycmVudCBwb3NpdGlvbjsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24gKmhhdmluZyogY2xvc2VUYWdTdHJpbmdMZW5ndGggYW1vdW50IG9mIGlucHV0IHRvIHdvcmsgYXMgZGVzaWduZWQuICBNdXN0IGJlIHN1cmUgd2UgZG9uJ3QNCi0JCQkvLyBzcGlsbCBvdmVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aGlsZSBjaGVja2luZy4NCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X2N1cnJlbnRQb3MgPiAwICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoIC0gMSAmJg0KLQkJCQkJeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MgLSAxXSA9PSAnPCcgJiYgeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdID09ICclJykgew0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3MgLSAxOw0KLQkJCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsNCi0JCQkJaW50IHJlc3VtZVN0YXRlID0geXlzdGF0ZSgpOw0KLQkJCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOKTsNCi0JCQkJaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgew0KLQkJCQkJU3RyaW5nIGpzcENvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCQkJCQl5eWJlZ2luKHJlc3VtZVN0YXRlKTsNCi0JCQkJCXJldHVybiBqc3BDb250ZXh0Ow0KLQkJCQl9DQotCQkJCXJldHVybiBzZWFyY2hDb250ZXh0Ow0KLQkJCX0NCi0JCQkvLyAzKSB5eV9jdXJyZW50UG9zIDogQ2hlY2sgYXQgdGhlIHN0YXJ0IG9mIHRoZSBibG9jayBvbmUgdGltZQ0KLQkJCS8vIC0tLQ0KLQkJCS8vIExvb2sgZm9yIGEgSlNQIGJlZ2lubmluZyBpbW1lZGlhdGVseSBpbiB0aGUgYmxvY2sgYXJlYTsgdGhpcyBjYXNlIHdvdWxkbid0IGJlIGhhbmRsZWQgYnkgdGhlIHByZWNlZGluZyBzZWN0aW9uDQotCQkJLy8gc2luY2UgaXQgcmVsaWVzIHVwb24geXlfY3VycmVudFBvcyBlcXVhbGluZyBleGFjdGx5IHRoZSBwcmV2aW91cyBlbmQgKzEgdG8gd29yayBhcyBkZXNpZ25lZC4NCi0JCQllbHNlIGlmKGNoZWNrQ0RBVEEgJiYgIWNoZWNrZWRGb3JDREFUQU9uY2UgJiYgeXlfc3RhcnRSZWFkICE9IGZMYXN0SW50ZXJuYWxCbG9ja1N0YXJ0ICYmIHl5X3N0YXJ0UmVhZCA+IDAgJiYNCi0JCQkJCXl5X3N0YXJ0UmVhZCA8IHl5X2J1ZmZlci5sZW5ndGggLSAxICYmIHl5X2J1ZmZlclt5eV9zdGFydFJlYWRdID09ICc8JyAmJiB5eV9idWZmZXJbeXlfc3RhcnRSZWFkICsgMV0gPT0gJyUnKSB7DQotCQkJCWNoZWNrZWRGb3JDREFUQU9uY2UgPSB0cnVlOw0KLQkJCQlmTGFzdEludGVybmFsQmxvY2tTdGFydCA9IHl5X21hcmtlZFBvcyA9IHl5X3N0YXJ0UmVhZDsNCi0JCQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkJCWludCByZXN1bWVTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JCQkJeXliZWdpbihTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTik7DQotCQkJCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQkJCVN0cmluZyBqc3BDb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCQkJeXliZWdpbihyZXN1bWVTdGF0ZSk7DQotCQkJCQlyZXR1cm4ganNwQ29udGV4dDsNCi0JCQkJfQ0KLQkJCQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi0JCQl9DQotKi8NCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcg0KLQkJCS8vIGFuZCBzZWUgaWYgaXQgbWF0Y2hlcw0KLQkJCWlmIChuID09IFlZRU9GKSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlzYW1lID0gdHJ1ZTsNCi0JCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3Nlcw0KLQkJCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0JCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7DQotCQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7DQotCQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOw0KLQkJCQkJfQ0KLQkJCQl9DQotCQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdw0KLQkJCQllbHNlIHsNCi0JCQkJCXNhbWUgPSBmYWxzZTsNCi0JCQkJfQ0KLQkJCX0NCi0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQkvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBjbG9zZSB0YWdzIHRvIGVuc3VyZSB0aGF0IHRhcmdldFN0cmluZz0iPC9zY3JpcHQiIGRvZXNuJ3QgbWF0Y2gNCi0JCQkJLy8gIjwvc2NyaXB0UyINCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsNCi0JCQkJLy8gU3VjY2VlZCBvbiAiPC9zY3JpcHQ+IiBhbmQgIjwvc2NyaXB0ICINCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkNCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7DQotCQkJfQ0KLQkJCWVsc2Ugew0KLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsNCi0JCQl9DQotCQl9DQotCX0NCi0JaWYgKG4gIT0gWVlFT0YgfHwgc2FtZSkgew0KLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaA0KLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsNCi0JCXl5X2N1cnJlbnRQb3MgPSB5eV9tYXJrZWRQb3MgKyAxOw0KLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQ0KLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkNCi0JCWlmICh5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKSB7DQotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsNCi0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJfQ0KLQl9DQotCWVsc2Ugew0KLQkJLy8gV2UgcmFuIHRocm91Z2ggdGhlIHJlc3Qgb2YgdGhlIGlucHV0DQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOw0KLQkJeXlfY3VycmVudFBvcysrOw0KLQl9DQotCXl5YmVnaW4oZXhpdFN0YXRlKTsNCi0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQ0KLQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQ0KLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsNCi0JcmV0dXJuIHNlYXJjaENvbnRleHQ7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOw0KLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQWxsb3dzSlNQKCksIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7DQotfQ0KLQkvKioNCi0JICogdXNlciBtZXRob2QNCi0JICoNCi0JICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpDQotCSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlDQotCSAqIGN1cnJlbnQgb2Zmc2V0IHdpdGhpbiB0aGUgc2Nhbm5pbmcgdGV4dC4NCi0JICoNCi0JICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQ0KLQkgKiBkaXNjb3ZlcmVkIHdoaXRlc3BhY2Ugb250byB0aGUgZW5kIG9mIHVzZWZ1bCByZWdpb25zLg0KLQkgKg0KLQkgKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZA0KLQkgKiBzbyB0aGF0IHdoaXRlc3BhY2UgY2FuIGJlIGNvbGxhcHNlZC4NCi0JICovDQotCXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkJZkVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykNCi0JCWlmIChmU2hvdWxkTG9hZEJ1ZmZlcmVkKSB7DQotCQkJaWYgKGZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyICE9IG51bGwpIHsNCi0JCQkJSVRleHRSZWdpb24gY29udGFpbmVyID0gZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXI7DQotCQkJCWZCdWZmZXJlZEVtYmVkZGVkQ29udGFpbmVyID0gbnVsbDsNCi0JCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJCQlyZXR1cm4gY29udGFpbmVyOw0KLQkJCX0NCi0JCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsNCi0JCQlzdGFydCA9IGZCdWZmZXJlZFN0YXJ0Ow0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7DQotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJfSBlbHNlIHsNCi0JCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJCWlmIChjb250ZXh0ID09IFBST1hZX0NPTlRFWFQpIHsNCi0JCQkJcmV0dXJuIGZFbWJlZGRlZENvbnRhaW5lcjsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfUk9PVF9UQUdfTkFNRSB8fCBmX2NvbnRleHQgPT0gSlNQX0RJUkVDVElWRV9OQU1FKSB7DQotCQkJCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpDQotCQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQkJZWxzZQ0KLQkJCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsNCi0JCQl9IGVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7DQotCQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7DQotCQkJfSBlbHNlIGlmIChjb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsNCi0JCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQkJfQ0KLQkJCXN0YXJ0ID0geXljaGFyOw0KLQkJCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJCWlmICh5eV9hdEVPRikgew0KLQkJCQlmVG9rZW5Db3VudCsrOw0KLQkJCQlyZXR1cm4gbnVsbDsNCi0JCQl9DQotCQl9DQotCQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbg0KLQkJZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJaWYgKGZfY29udGV4dCA9PSBQUk9YWV9DT05URVhUKSB7DQotCQkJZkJ1ZmZlcmVkRW1iZWRkZWRDb250YWluZXIgPSBmRW1iZWRkZWRDb250YWluZXI7DQotCQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IHRydWU7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX05BTUUgfHwgZl9jb250ZXh0ID09IEpTUF9ST09UX1RBR19OQU1FIHx8IGZfY29udGV4dCA9PSBKU1BfRElSRUNUSVZFX05BTUUpIHsNCi0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsNCi0JCQllbHNlDQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCQl9IGVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQkJfSBlbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOw0KLQkJfQ0KLQkJZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsNCi0JCWZCdWZmZXJlZFN0YXJ0ID0geXljaGFyOw0KLQkJZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsNCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOw0KLQkJaWYgKGZCdWZmZXJlZENvbnRleHQgPT0gV0hJVEVfU1BBQ0UpIHsNCi0JCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsNCi0JCX0NCi0JCWlmIChjb250ZXh0ID09IG51bGwpIHsNCi0JCQkvLyBFT0YNCi0JCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCX0NCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JCWZUb2tlbkNvdW50Kys7DQotCQlyZXR1cm4gZlJlZ2lvbkZhY3RvcnkuY3JlYXRlVG9rZW4oY29udGV4dCwgc3RhcnQsIHRleHRMZW5ndGgsIGxlbmd0aCwgbnVsbCwgZkN1cnJlbnRUYWdOYW1lKTsNCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAqLw0KLQlwdWJsaWMgSlNQVG9rZW5pemVyKCl7DQotCQlzdXBlcigpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyBKU1BUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7DQotCQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgMCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoY2hhcltdIGNoYXJBcnJheSwgaW50IG5ld09mZnNldCkgew0KLQkJcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsNCi0JCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJcmVzZXQobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pLCBuZXdPZmZzZXQpOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluKSB7DQotCQlyZXNldChpbiwgMCk7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kICoNCi0JICoNCi0JICogUmVzZXQgaW50ZXJuYWwgY291bnRlcnMgYW5kIHZhcnMgdG8gIm5ld2x5IGNyZWF0ZWQiIHZhbHVlcywgaW4gdGhlIGhvcGVzDQotCSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuDQotCSAqDQotCSAqIFRoaXMgbWV0aG9kIGNvbnRhaW5zIGNvZGUgYmxvY2tzIHRoYXQgd2VyZSBlc3NlbnRpYWxseSBkdXBsaWNhdGVkIGZyb20gdGhlDQotCSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMNCi0JICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuDQotCSAqLw0KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZXNldHRpbmcgdG9rZW5pemVyIik7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJZk9mZnNldCA9IG5ld09mZnNldDsNCi0JDQotCQkvKiB0aGUgaW5wdXQgZGV2aWNlICovDQotCQl5eV9yZWFkZXIgPSBpbjsNCi0JDQotCQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotCQl5eV9zdGF0ZSA9IDA7DQotCQ0KLQkJLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLw0KLQkJeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0JDQotCQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzDQotCQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JCWphdmEudXRpbC5BcnJheXMuZmlsbCh5eV9idWZmZXIsIChjaGFyKTApOw0KLQkNCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCQl5eV9tYXJrZWRQb3MgPSAwOw0KLQkNCi0JCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCQl5eV9wdXNoYmFja1BvcyA9IDA7DQotCQ0KLQkJLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCQl5eV9jdXJyZW50UG9zID0gMDsNCi0JDQotCQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JCXl5X3N0YXJ0UmVhZCA9IDA7DQotCQ0KLQkJLyoqIA0KLQkJICogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotCQkgKiBmcm9tIGlucHV0IA0KLQkJICovDQotCQl5eV9lbmRSZWFkID0gMDsNCi0JDQotCQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JCXl5bGluZSA9IDA7DQotCQ0KLQkJLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCQl5eWNoYXIgPSAwOw0KLQkNCi0JCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JCXl5X2F0RU9GID0gZmFsc2U7DQotCQ0KLQkJLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotCQl5eV9lb2ZfZG9uZSA9IGZhbHNlOw0KLQkNCi0JDQotCQkvKiB1c2VyIHZhcnM6ICovDQotCQlmVG9rZW5Db3VudCA9IDA7DQotCSANCi0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsNCi0JCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOw0KLQkJZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQkJZkJ1ZmZlcmVkTGVuZ3RoID0gMDsNCi0JCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotCQ0KLQkJZkxhc3RJbnRlcm5hbEJsb2NrU3RhcnQgPSAtMTsNCi0JDQotCQljb250ZXh0ID0gbnVsbDsNCi0JCXN0YXJ0ID0gMDsNCi0JCXRleHRMZW5ndGggPSAwOw0KLQkJbGVuZ3RoID0gMDsNCi0JDQotCQlmRW1iZWRkZWRDb250YWluZXIgPSBudWxsOw0KLQkJDQotCQlmRUxsZXZlbCA9IDA7DQotCX0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kDQotCSAqDQotCSAqLw0KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7DQotCQlKU1BUb2tlbml6ZXIgbmV3SW5zdGFuY2UgPSBuZXcgSlNQVG9rZW5pemVyKCk7DQotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIA0KLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpDQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGkrKykgew0KLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsNCi0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQ0KLQkJCQluZXdJbnN0YW5jZS5hZGRCbG9ja01hcmtlcihibG9ja01hcmtlcik7DQotCQl9DQotCQlmb3IoaW50IGkgPSAwOyBpIDwgZk5lc3RhYmxlUHJlZml4ZXMuc2l6ZSgpOyBpKyspIHsNCi0JCQlUYWdNYXJrZXIgbWFya2VyID0gKFRhZ01hcmtlcikgZk5lc3RhYmxlUHJlZml4ZXMuZ2V0KGkpOw0KLQkJCWlmKG1hcmtlci5pc0dsb2JhbCgpKQ0KLQkJCQluZXdJbnN0YW5jZS5hZGROZXN0YWJsZVByZWZpeChtYXJrZXIpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOw0KLQl9DQotCS8qIHVzZXIgbWV0aG9kICovDQotCXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JCS8vICAgWE1MX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoDQotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0DQotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JCXJldHVybiBkb1NjYW4oIi0tPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ09NTUVOVF9URVhULCBTVF9YTUxfQ09NTUVOVF9FTkQsIFNUX1hNTF9DT01NRU5UX0VORCk7DQotCX0NCi0JLyogdXNlciBtZXRob2QgKi8NCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhbkpTUENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsNCi0JCS8vIFNjYW4gZm9yICctLSU+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JCS8vICAgSlNQX0NPTU1FTlRfVEVYVCB1bmxlc3MgdGhlIHN0cmluZyBvY2N1cnMgSU1NRURJQVRFTFksIGluIHdoaWNoDQotCQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX0pTUF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0DQotCQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JCXJldHVybiBkb1NjYW4oIi0tJT4iLCBmYWxzZSwgZmFsc2UsIHRydWUsIEpTUF9DT01NRU5UX1RFWFQsIFNUX0pTUF9DT01NRU5UX0VORCwgU1RfSlNQX0NPTU1FTlRfRU5EKTsNCi0JfQ0KLSV9DQotDQotJWVvZnsNCi0vLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYg0KLSVlb2Z9DQotDQotJXB1YmxpYw0KLSVjbGFzcyBKU1BUb2tlbml6ZXINCi0laW1wbGVtZW50cyBCbG9ja1Rva2VuaXplciwgRE9NSlNQUmVnaW9uQ29udGV4dHMNCi0lZnVuY3Rpb24gcHJpbUdldE5leHRUb2tlbg0KLSV0eXBlIFN0cmluZw0KLSVjaGFyDQotJWxpbmUNCi0ldW5pY29kZQ0KLSVwYWNrDQotDQotJXN0YXRlIFNUX0NEQVRBX1RFWFQNCi0lc3RhdGUgU1RfQ0RBVEFfRU5EDQotJXN0YXRlIFNUX1hNTF9DT01NRU5UDQotJXN0YXRlIFNUX1hNTF9DT01NRU5UX0VORA0KLSVzdGF0ZSBTVF9QSQ0KLSVzdGF0ZSBTVF9QSV9XUw0KLSVzdGF0ZSBTVF9QSV9DT05URU5UDQotJXN0YXRlIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfUElfRVFVQUxTDQotJXN0YXRlIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUNCi0lc3RhdGUgU1RfWE1MX1BJX1RBR19DTE9TRQ0KLSVzdGF0ZSBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9ESFRNTF9FUVVBTFMNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX0RIVE1MX1RBR19DTE9TRQ0KLQ0KLS8vIHNjcmlwdGxldCBzdGF0ZShzKQ0KLSVzdGF0ZSBTVF9KU1BfQ09OVEVOVA0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX05BTUUNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UNCi0lc3RhdGUgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRQ0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUw0KLSVzdGF0ZSBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRQ0KLQ0KLS8vIG5vcm1hbCB0YWcgc3RhdGVzDQotJXN0YXRlIFNUX1hNTF9UQUdfTkFNRQ0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFDQotDQotLy8gZGVjbGFyYXRpb24gKERURCkgc3RhdGVzDQotJXN0YXRlIFNUX1hNTF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UNCi0NCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQNCi0lc3RhdGUgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTQ0KLQ0KLSVzdGF0ZSBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotJXN0YXRlIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQNCi0NCi0NCi0lc3RhdGUgU1RfQkxPQ0tfVEFHX1NDQU4NCi0lc3RhdGUgU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4NCi0NCi0lc3RhdGUgU1RfSlNQX0NPTU1FTlQNCi0lc3RhdGUgU1RfSlNQX0NPTU1FTlRfRU5EDQotDQotJXN0YXRlIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRA0KLSVzdGF0ZSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQNCi0NCi0lc3RhdGUgU1RfQUJPUlRfRU1CRURERUQNCi0NCi0lc3RhdGUgU1RfSlNQX0VMDQotJXN0YXRlIFNUX0pTUF9FTF9TUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9FTF9EUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9FTF9TUVVPVEVTX0VORA0KLSVzdGF0ZSBTVF9KU1BfRUxfRFFVT1RFU19FTkQNCi0NCi0lc3RhdGUgU1RfSlNQX0RRVU9URURfRUwNCi0lc3RhdGUgU1RfSlNQX1NRVU9URURfRUwNCi0NCi0lc3RhdGUgU1RfSlNQX1ZCTA0KLSVzdGF0ZSBTVF9KU1BfVkJMX1NRVU9URVMNCi0lc3RhdGUgU1RfSlNQX1ZCTF9EUVVPVEVTDQotJXN0YXRlIFNUX0pTUF9WQkxfU1FVT1RFU19FTkQNCi0lc3RhdGUgU1RfSlNQX1ZCTF9EUVVPVEVTX0VORA0KLQ0KLSVzdGF0ZSBTVF9KU1BfRFFVT1RFRF9WQkwNCi0lc3RhdGUgU1RfSlNQX1NRVU9URURfVkJMDQotDQotLy8gTGV0dGVyID0gKFtBLVphLXpdKQ0KLS8vIERpZ2l0ID0gKFswLTldKQ0KLQ0KLS8qKg0KLSAqIHNtYWxsZXIgdG9rZW5zDQotICovDQotZ2VuZXJpY1RhZ09wZW4gICAgICAgPSA8DQotZ2VuZXJpY1RhZ0Nsb3NlICAgICAgPSA+DQotZ2VuZXJpY0VuZFRhZ09wZW4gICAgPSA8XC8NCi1nZW5lcmljRW1wdHlUYWdDbG9zZSA9IFwvPg0KLQ0KLVBJc3RhcnQgPSA8XD8NCi1QSWVuZCAgID0gXD8+DQotDQotDQotLy8gWzFdIGRvY3VtZW50IDo6PSBwcm9sb2cgZWxlbWVudCBNaXNjKg0KLWRvY3VtZW50ID0gKHtwcm9sb2d9IHtlbGVtZW50fSB7TWlzY30qKQ0KLQ0KLS8vIFsyXSBDaGFyIDo6PSAjeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdDQotIC8vQ2hhciA9ICguKQ0KLUNoYXIgPSBbXHgwOVx4MEFceDBEXHgyMC1cdUQ3RkZcdUUwMDAtXHVGRkZEXSANCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0rDQotDQotLy8gWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8IENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcg0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IFwuIHwgXC0gfCBfIHwgOiB8IHtDb21iaW5pbmdDaGFyfSB8IHtFeHRlbmRlcn0pDQotDQotLy8gWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIE5hbWVDaGFyKg0KLS8vTmFtZSA9ICh7TmFtZUNoYXJ9e05hbWVDaGFyfSopDQotTmFtZSA9ICh7TGV0dGVyfSB8IF8gfCA6KXtOYW1lQ2hhcn0qDQotDQotLy8gWzZdIE5hbWVzIDo6PSB7TmFtZX0gKHtTfSB7TmFtZX0pKg0KLU5hbWVzID0gKHtOYW1lfSAoe1N9IHtOYW1lfSkqKQ0KLQ0KLS8vIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKw0KLU5tdG9rZW4gPSAoe05hbWVDaGFyfSspDQotDQotLy8gWzhdIE5tdG9rZW5zIDo6PSBObXRva2VuIChTIE5tdG9rZW4pKg0KLU5tdG9rZW5zID0gKHtObXRva2VufSAoe1N9IHtObXRva2VufSkqKQ0KLQ0KLS8vIFs5XSBFbnRpdHlWYWx1ZSA6Oj0gJyInIChbXiUmIl0gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICciJyB8ICAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciDQotRW50aXR5VmFsdWUgPSAoXCIgKFteJSZcIl0gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcIiB8ICBcJyAoW14lJlwnXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwnKQ0KLQ0KLS8vIFx4MjQgPSAnJCcsIFx4N2IgPSAneycsIFx4MjMgPSAnIycNCi0vLyBbMTBdIEF0dFZhbHVlIDo6PSAnIicgKFtePCYiXSB8IFJlZmVyZW5jZSkqICciJyB8ICAiJyIgKFtePCYnXSB8IFJlZmVyZW5jZSkqICInIg0KLUF0dFZhbHVlID0gKCBcIihbXjwiXHgyNFx4MjNdIHwgW1x4MjRceDIzXVteXHg3YiJdIHwge1JlZmVyZW5jZX0pKltceDI0XHgyM10qXCIgfCBcJyhbXjwnXHgyNFx4MjNdIHwgW1x4MjRceDIzXVteXHg3YiddIHwge1JlZmVyZW5jZX0pKltceDI0XHgyM10qXCcgIHwgKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqKQ0KLQ0KLS8vIFsxMV0gU3lzdGVtTGl0ZXJhbCA6Oj0gKCciJyBbXiJdKiAnIicpIHwgKCInIiBbXiddKiAiJyIpIA0KLVN5c3RlbUxpdGVyYWwgPSAoKFwiIFteXCJdKiBcIikgfCAoXCcgW15cJ10qIFwnKSkgDQotDQotLy8gWzEyXSBQdWJpZExpdGVyYWwgOjo9ICciJyBQdWJpZENoYXIqICciJyB8ICInIiAoUHViaWRDaGFyIC0gIiciKSogIiciDQotUHViaWRMaXRlcmFsID0gKFwiIHtQdWJpZENoYXJ9KiBcIiB8IFwnICh7UHViaWRDaGFyfVwnKSogIiciKQ0KLQ0KLS8vIFsxM10gUHViaWRDaGFyIDo6PSAjeDIwIHwgI3hEIHwgI3hBIHwgW2EtekEtWjAtOV0gfCBbLScoKSssLi86PT87ISojQCRfJV0NCi1QdWJpZENoYXIgPSAoW1wwNDBcMDE1XDAxMl0gfCBbYS16QS1aMC05XSB8IFtcLVwnKClcKywuXC86PT87IVwqI0BcJF8lXSkNCi0NCi0vLyBbMTRdIENoYXJEYXRhIDo6PSBbXjwmXSogLSAoW148Jl0qICddXT4nIFtePCZdKikNCi0vLyBpbXBsZW1lbnQgbG9va2FoZWFkIGJlaGF2aW9yIGR1cmluZyBhY3Rpb24gZGVmaW5pdGlvbg0KLUNoYXJEYXRhID0gKFtePCYoXF1cXT4pXSopDQotDQotLy8gWzE1XSBDb21tZW50IDo6PSAnPCEtLScgKChDaGFyIC0gJy0nKSB8ICgnLScgKENoYXIgLSAnLScpKSkqICctLT4nDQotQ29tbWVudFN0YXJ0ID0gKDwhXC1cLSkNCi1Db21tZW50RW5kICAgPSAoXC1cLT4pDQotQ29tbWVudCA9ICh7Q29tbWVudFN0YXJ0fS4qe0NvbW1lbnRFbmR9KQ0KLQ0KLS8vIFsxNl0gUEkgOjo9ICc8PycgUElUYXJnZXQgKFMgKENoYXIqIC0gKENoYXIqICc/PicgQ2hhciopKSk/ICc/PicNCi1QSSA9ICg8XD97UElUYXJnZXR9IHtDaGFyfSogXD8+KQ0KLQ0KLS8vIFsxN10gUElUYXJnZXQgOjo9IE5hbWUgLSAoKCdYJyB8ICd4JykgKCdNJyB8ICdtJykgKCdMJyB8ICdsJykpDQotUElUYXJnZXQgPSAoe05hbWV9KChYfHgpKE18bSkoTHxsKSkpDQotDQotLy8gWzE4XSBDRFNlY3QgOjo9IENEU3RhcnQgQ0RhdGEgQ0RFbmQNCi1DRFNlY3QgPSAoe0NEU3RhcnR9e0NEYXRhfXtDREVuZH0pDQotDQotLy8gWzE5XSBDRFN0YXJ0IDo6PSAnPCFbQ0RBVEFbJw0KLUNEU3RhcnQgPSA8IVxbQ0RBVEFcWw0KLQ0KLS8vIFsyMF0gQ0RhdGEgOjo9IChDaGFyKiAtIChDaGFyKiAnXV0+JyBDaGFyKikpIA0KLS8vIGltcGxlbWVudCBsb29rYWhlYWQgYmVoYXZpb3IgZHVyaW5nIGFjdGlvbiBkZWZpbml0aW9uDQotQ0RhdGEgPSAoW14oXF1cXT4pXSopDQotDQotLy8gWzIxXSBDREVuZCA6Oj0gJ11dPicNCi1DREVuZCA9IChcXVxdPikNCi0NCi0vLyBbMjJdIHByb2xvZyA6Oj0gWE1MRGVjbD8gTWlzYyogKGRvY3R5cGVkZWNsIE1pc2MqKT8NCi1wcm9sb2cgPSAoe1hNTERlY2x9PyB7TWlzY30qICh7ZG9jdHlwZWRlY2x9IHtNaXNjfSopPykNCi0NCi0vLyBbMjNdIFhNTERlY2wgOjo9ICc8P3htbCcgVmVyc2lvbkluZm8gRW5jb2RpbmdEZWNsPyBTRERlY2w/IFM/ICc/PicNCi1YTUxEZWNsID0gKDxcP3htbCB7VmVyc2lvbkluZm99IHtFbmNvZGluZ0RlY2x9PyB7U0REZWNsfT8ge1N9PyBcPz4pDQotDQotLy8gWzI0XSBWZXJzaW9uSW5mbyA6Oj0gUyAndmVyc2lvbicgRXEgKCcgVmVyc2lvbk51bSAnIHwgIiBWZXJzaW9uTnVtICIpDQotVmVyc2lvbkluZm8gPSAoe1N9dmVyc2lvbntFcX0oXCd7VmVyc2lvbk51bX1cJyB8IFwie1ZlcnNpb25OdW19XCIpKQ0KLQ0KLS8vIFsyNV0gRXEgOjo9IFM/ICc9JyBTPw0KLUVxID0gKFw9KQ0KLQ0KLS8vIFsyNl0gVmVyc2lvbk51bSA6Oj0gKFthLXpBLVowLTlfLjpdIHwgJy0nKSsNCi1WZXJzaW9uTnVtID0gKChbYS16QS1aMC05Xy46XXxcLSkrKQ0KLQ0KLS8vIFsyN10gTWlzYyA6Oj0gQ29tbWVudCB8IFBJIHwgIFMNCi1NaXNjID0gKHtDb21tZW50fSB8IHtQSX0gfCB7U30pDQotDQotLy8gWzI4XSBkb2N0eXBlZGVjbCA6Oj0gJzwhRE9DVFlQRScgUyBOYW1lIChTIEV4dGVybmFsSUQpPyAgUz8gKCdbJyAobWFya3VwZGVjbCB8IFBFUmVmZXJlbmNlIHwgUykqICddJyBTPyk/ICc+Jw0KLWRvY3R5cGVkZWNsID0gKDxcIURPQ1RZUEV7U317TmFtZX0gKHtTfXtFeHRlcm5hbElEfSk/IHtTfT8gKFxbICh7bWFya3VwZGVjbH18e1BFUmVmZXJlbmNlfXx7U30pKiBcXXtTfT8pPz4pDQotDQotLy8gWzI5XSBtYXJrdXBkZWNsIDo6PSBlbGVtZW50ZGVjbCB8IEF0dGxpc3REZWNsIHwgRW50aXR5RGVjbCB8IE5vdGF0aW9uRGVjbCB8IFBJIHwgQ29tbWVudA0KLW1hcmt1cGRlY2wgPSAoe2VsZW1lbnRkZWNsfSB8IHtBdHRsaXN0RGVjbH0gfCB7RW50aXR5RGVjbH0gfCB7Tm90YXRpb25EZWNsfSB8IHtQSX0gfCB7Q29tbWVudH0pDQotDQotLy8gWzMwXSBleHRTdWJzZXQgOjo9IFRleHREZWNsPyBleHRTdWJzZXREZWNsDQotZXh0U3Vic2V0ID0gKHtUZXh0RGVjbH0/IHtleHRTdWJzZXREZWNsfSkNCi0NCi0vLyBbMzFdIGV4dFN1YnNldERlY2wgOjo9ICggbWFya3VwZGVjbCB8IGNvbmRpdGlvbmFsU2VjdCB8IFBFUmVmZXJlbmNlIHwgUyApKg0KLWV4dFN1YnNldERlY2wgPSAoKCB7bWFya3VwZGVjbH0gfCB7Y29uZGl0aW9uYWxTZWN0fSB8IHtQRVJlZmVyZW5jZX0gfCB7U30gKSopDQotDQotLy8gWzMyXSAgU0REZWNsICA6Oj0gUyAnc3RhbmRhbG9uZScgRXEgKCgiJyIgKCd5ZXMnIHwgJ25vJykgIiciKSB8ICgnIicgKCd5ZXMnIHwgJ25vJykgJyInKSkNCi1TRERlY2wgID0gKHtTfXN0YW5kYWxvbmV7RXF9e1N9KigoXCcoeWVzfG5vKVwnKXwoXCIoeWVzfG5vKVwiKSkpDQotDQotLy8gWzMzXSAgTGFuZ3VhZ2VJRCAgOjo9IExhbmdjb2RlICgnLScgU3ViY29kZSkqDQotTGFuZ3VhZ2VJRCAgPSAoe0xhbmdjb2RlfShcLXtTdWJjb2RlfSkqKQ0KLQ0KLS8vIFszNF0gIExhbmdjb2RlIDo6PSBJU082MzlDb2RlIHwgIElhbmFDb2RlIHwgIFVzZXJDb2RlDQotTGFuZ2NvZGUgPSAoe0lTTzYzOUNvZGV9IHwgIHtJYW5hQ29kZX0gfCAge1VzZXJDb2RlfSkNCi0NCi0vLyBbMzVdICBJU082MzlDb2RlIDo6PSAoW2Etel0gfCBbQS1aXSkgKFthLXpdIHwgW0EtWl0pDQotSVNPNjM5Q29kZSA9ICgoW2Etel18W0EtWl0pKFthLXpdfFtBLVpdKSkNCi0NCi0vLyBbMzZdICBJYW5hQ29kZSA6Oj0gKCdpJyB8ICdJJykgJy0nIChbYS16XSB8IFtBLVpdKSsNCi1JYW5hQ29kZSA9ICgoaXxJKVwtKFthLXpdfFtBLVpdKSspDQotDQotLy8gWzM3XSAgVXNlckNvZGUgOjo9ICgneCcgfCAnWCcpICctJyAoW2Etel0gfCBbQS1aXSkrDQotVXNlckNvZGUgPSAoKHh8WClcLShbYS16XXxbQS1aXSkrKQ0KLQ0KLS8vIFszOF0gIFN1YmNvZGUgOjo9IChbYS16XSB8IFtBLVpdKSsNCi1TdWJjb2RlID0gKChbYS16XXxbQS1aXSkrKQ0KLQ0KLS8vIFszOV0gIGVsZW1lbnQgIDo6PSBFbXB0eUVsZW1UYWcgfCBTVGFnIGNvbnRlbnQgRVRhZw0KLWVsZW1lbnQgID0gKHtFbXB0eUVsZW1UYWd9IHwge1NUYWd9IHtjb250ZW50fSB7RVRhZ30pDQotDQotLy8gWzQwXSAgU1RhZyAgOjo9ICc8JyBOYW1lIChTIEF0dHJpYnV0ZSkqIFM/ICc+Jw0KLVNUYWcgPSAoPHtOYW1lfSh7U317QXR0cmlidXRlfSkqe1N9Pz4pDQotDQotLy8gWzQxXSAgQXR0cmlidXRlIDo6PSBOYW1lIEVxIEF0dFZhbHVlDQotQXR0cmlidXRlID0gKHtOYW1lfXtTfSp7RXF9e1N9KntBdHRWYWx1ZX0pDQotDQotLy8gWzQyXSAgRVRhZyAgOjo9ICdOYW1lIFM/ICc+Jw0KLUVUYWcgPSAoPFwve05hbWV9e1N9Pz4pDQotDQotLy8gWzQzXSAgY29udGVudCAgOjo9IChlbGVtZW50IHwgQ2hhckRhdGEgfCBSZWZlcmVuY2UgfCBDRFNlY3QgfCBQSSB8IENvbW1lbnQpKg0KLWNvbnRlbnQgPSAoKHtlbGVtZW50fSB8IHtDaGFyRGF0YX0gfCB7UmVmZXJlbmNlfSB8IHtDRFNlY3R9IHwge1BJfSB8IHtDb21tZW50fSkqKQ0KLQ0KLS8vIFs0NF0gIEVtcHR5RWxlbVRhZyAgOjo9ICc8JyBOYW1lIChTIEF0dHJpYnV0ZSkqIFM/ICcvPicNCi1FbXB0eUVsZW1UYWcgPSAoPHtOYW1lfSh7U317QXR0cmlidXRlfSkqe1N9P1wvPikNCi0NCi0vLyBbNDVdIGVsZW1lbnRkZWNsIDo6PSAnPCFFTEVNRU5UJyBTIE5hbWUgUyBjb250ZW50c3BlYyBTPyAnPicNCi1lbGVtZW50ZGVjbCA9ICg8XCFFTEVNRU5Ue1N9e05hbWV9e1N9e2NvbnRlbnRzcGVjfXtTfT8+KQ0KLQ0KLS8vIFs0Nl0gY29udGVudHNwZWMgOjo9ICdFTVBUWScgfCAnQU5ZJyB8IE1peGVkIHwgY2hpbGRyZW4NCi1jb250ZW50c3BlYyA9IChFTVBUWXxBTll8e01peGVkfXx7Y2hpbGRyZW59KQ0KLQ0KLS8vIFs0N10gY2hpbGRyZW4gOjo9IChjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPw0KLWNoaWxkcmVuID0gKCh7Y2hvaWNlfXx7c2VxfSkoXD98XCp8XCspPykNCi0NCi0vLyBDQVVTRVMgTE9PUCBUSFJPVUdIIERFRlMgT0YgQ0hPSUNFIEFORCBTRVENCi0vLyBbNDhdIGNwIDo6PSAoTmFtZSB8IGNob2ljZSB8IHNlcSkgKCc/JyB8ICcqJyB8ICcrJyk/DQotY3AgPSAoKHtOYW1lfSB8IHtjaG9pY2V9IHwge3NlcX0pIChcP3xcKnxcKyk/KQ0KLQ0KLS8vIFs0OV0gY2hvaWNlIDo6PSAnKCcgUz8gY3AgKCBTPyAnfCcgUz8gY3AgKSogUz8gJyknDQotLy8gY2hvaWNlID0gXCh7U30/e2NwfSh7U30/XHx7U30/e2NwfSkqe1N9P1wpDQotY2hvaWNlID0gXCh7U30/e05hbWV9KHtTfT9cfHtTfT97TmFtZX0pKntTfT9cKQ0KLQ0KLS8vIFs1MF0gc2VxIDo6PSAnKCcgUz8gY3AgKCBTPyAnLCcgUz8gY3AgKSogUz8gJyknDQotLy8gc2VxID0gKFwoe1N9P3tjcH0oe1N9P1wse1N9P3tjcH0pKntTfT9cKSkNCi1zZXEgPSAoXCh7U30/e05hbWV9KHtTfT9cLHtTfT97TmFtZX0pKntTfT9cKSkNCi0NCi0vLyBbNTFdIE1peGVkIDo6PSAnKCcgUz8gJyNQQ0RBVEEnIChTPyAnfCcgUz8gTmFtZSkqIFM/ICAnKSonIHwgJygnIFM/ICcjUENEQVRBJyBTPyAnKScNCi1NaXhlZCA9ICh7U30/XCNQQ0RBVEEoe1N9P1x8e1N9P3tOYW1lfSkqe1N9PykqXHwoe1N9P1wjUENEQVRBe1N9PykNCi0NCi0vLyBbNTJdIEF0dGxpc3REZWNsIDo6PSAnPCFBVFRMSVNUJyBTIE5hbWUgQXR0RGVmKiBTPyAnPicNCi1BdHRsaXN0RGVjbCA9ICg8XCFBVFRMSVNUe1N9e05hbWV9e0F0dERlZn0qe1N9Pz4pDQotDQotLy8gWzUzXSBBdHREZWYgOjo9IFMgTmFtZSBTIEF0dFR5cGUgUyBEZWZhdWx0RGVjbA0KLUF0dERlZiA9ICh7U317TmFtZX17U317QXR0VHlwZX17U317RGVmYXVsdERlY2x9KQ0KLQ0KLS8vIFs1NF0gQXR0VHlwZSA6Oj0gU3RyaW5nVHlwZSB8IFRva2VuaXplZFR5cGUgfCBFbnVtZXJhdGVkVHlwZSANCi1BdHRUeXBlID0gKHtTdHJpbmdUeXBlfSB8IHtUb2tlbml6ZWRUeXBlfSB8IHtFbnVtZXJhdGVkVHlwZX0pDQotDQotLy8gWzU1XSBTdHJpbmdUeXBlIDo6PSAnQ0RBVEEnDQotU3RyaW5nVHlwZSA9IChDREFUQSkNCi0NCi0vLyBbNTZdIFRva2VuaXplZFR5cGUgOjo9ICdJRCcgfCAnSURSRUYnIHwgJ0lEUkVGUycgfCAnRU5USVRZJyB8ICdFTlRJVElFUycgfCAnTk1UT0tFTicgfCAnTk1UT0tFTlMnDQotVG9rZW5pemVkVHlwZSA9IChJRHxJRFJFRnxJRFJFRlN8RU5USVRZfEVOVElUSUVTfE5NVE9LRU58Tk1UT0tFTlMpDQotDQotLy8gWzU3XSBFbnVtZXJhdGVkVHlwZSA6Oj0gTm90YXRpb25UeXBlIHwgRW51bWVyYXRpb24gDQotRW51bWVyYXRlZFR5cGUgPSAoe05vdGF0aW9uVHlwZX0gfCB7RW51bWVyYXRpb259KQ0KLQ0KLS8vIFs1OF0gTm90YXRpb25UeXBlIDo6PSAnTk9UQVRJT04nIFMgJygnIFM/IE5hbWUgKFM/ICd8JyBTPyBOYW1lKSogUz8gJyknIA0KLU5vdGF0aW9uVHlwZSA9IChOT1RBVElPTntTfVwoe1N9P3tOYW1lfSh7U30/XHx7U30/e05hbWV9KSp7U30/XCkpDQotDQotLy8gWzU5XSBFbnVtZXJhdGlvbiA6Oj0gJygnIFM/IE5tdG9rZW4gKFM/ICd8JyBTPyAgTm10b2tlbikqIFM/ICcpJw0KLUVudW1lcmF0aW9uID0gKFwoe1N9P3tObXRva2VufSh7U30/XHx7U30/e05tdG9rZW59KSp7U30/XCkpDQotDQotLy8gWzYwXSBEZWZhdWx0RGVjbCA6Oj0gJyNSRVFVSVJFRCcgfCAnI0lNUExJRUQnIHwgKCgnI0ZJWEVEJyBTKT8gQXR0VmFsdWUpDQotRGVmYXVsdERlY2wgPSAoXCNSRVFVSVJFRHxcI0lNUExJRUR8KChcI0ZJWEVEe1N9KT97QXR0VmFsdWV9KSkNCi0NCi0vLyBbNjFdIGNvbmRpdGlvbmFsU2VjdCA6Oj0gaW5jbHVkZVNlY3QgfCBpZ25vcmVTZWN0IA0KLWNvbmRpdGlvbmFsU2VjdCA9ICh7aW5jbHVkZVNlY3R9IHwge2lnbm9yZVNlY3R9KQ0KLQ0KLS8vIFs2Ml0gaW5jbHVkZVNlY3QgOjo9ICc8IVsnIFM/ICdJTkNMVURFJyBTPyAnWycgZXh0U3Vic2V0RGVjbCAnXV0+JyANCi1pbmNsdWRlU2VjdCA9ICg8XCFcW3tTfT9JTkNMVURFe1N9P1xbe2V4dFN1YnNldERlY2x9XF1cXT4pDQotDQotLy8gWzYzXSBpZ25vcmVTZWN0IDo6PSAnPCFbJyBTPyAnSUdOT1JFJyBTPyAnWycgaWdub3JlU2VjdENvbnRlbnRzKiAnXV0+Jw0KLWlnbm9yZVNlY3QgPSAoPFwhXFt7U30/SUdOT1JFe1N9P1xbe2lnbm9yZVNlY3RDb250ZW50c30qXF1cXT4pDQotDQotLy8gWzY0XSBpZ25vcmVTZWN0Q29udGVudHMgOjo9IElnbm9yZSAoJzwhWycgaWdub3JlU2VjdENvbnRlbnRzICddXT4nIElnbm9yZSkqDQotaWdub3JlU2VjdENvbnRlbnRzID0gKHtJZ25vcmV9KDxcIVxbe2lnbm9yZVNlY3RDb250ZW50c31cXVxdPntJZ25vcmV9KSopDQotDQotLy8gWzY1XSBJZ25vcmUgOjo9IENoYXIqIC0gKENoYXIqICgnPCFbJyB8ICddXT4nKSBDaGFyKikNCi1JZ25vcmUgPSAgKFteKFw8XCFcW3xcXVxdXD4pXSopDQotDQotLy8gWzY2XSBDaGFyUmVmIDo6PSAnJiMnIFswLTldKyAnOycgfCAnJiN4JyBbMC05YS1mQS1GXSsgJzsnDQotQ2hhclJlZiA9ICgmI1swLTldKzt8JiN4WzAtOWEtZkEtRl0rOykNCi0NCi0vLyBbNjddIFJlZmVyZW5jZSA6Oj0gRW50aXR5UmVmIHwgQ2hhclJlZg0KLVJlZmVyZW5jZSA9ICh7RW50aXR5UmVmfSB8IHtDaGFyUmVmfSkNCi0NCi0vLyBbNjhdIEVudGl0eVJlZiA9ICcmJyBOYW1lICc7Jw0KLUVudGl0eVJlZiA9ICgme05hbWV9OykNCi0NCi0vLyBbNjldIFBFUmVmZXJlbmNlIDo6PSAnJScgTmFtZSAnOycNCi1QRVJlZmVyZW5jZSA9ICgle05hbWV9OykNCi0NCi0vLyBbNzBdIEVudGl0eURlY2wgOjo9IEdFRGVjbCB8IFBFRGVjbA0KLUVudGl0eURlY2wgPSAoe0dFRGVjbH0gfCB7UEVEZWNsfSkNCi0NCi0vLyBbNzFdIEdFRGVjbCA6Oj0gJzwhRU5USVRZJyBTIE5hbWUgUyBFbnRpdHlEZWYgUz8gJz4nDQotR0VEZWNsID0gKDxcIUVOVElUWXtTfXtOYW1lfXtTfXtFbnRpdHlEZWZ9e1N9Pz4pDQotDQotLy8gWzcyXSBQRURlY2wgOjo9ICc8IUVOVElUWScgUyAnJScgUyBOYW1lIFMgUEVEZWYgUz8gJz4nDQotUEVEZWNsID0gKDxcIUVOVElUWXtTfVwle1N9e05hbWV9e1N9e1BFRGVmfXtTfT8+KQ0KLQ0KLS8vIFs3M10gRW50aXR5RGVmIDo6PSBFbnRpdHlWYWx1ZSB8IChFeHRlcm5hbElEIE5EYXRhRGVjbD8pDQotRW50aXR5RGVmID0gKHtFbnRpdHlWYWx1ZX0gfCAoe0V4dGVybmFsSUR9e05EYXRhRGVjbH0/KSkNCi0NCi0vLyBbNzRdIFBFRGVmIDo6PSBFbnRpdHlWYWx1ZSB8IEV4dGVybmFsSUQNCi1QRURlZiA9ICh7RW50aXR5VmFsdWV9IHwge0V4dGVybmFsSUR9KQ0KLQ0KLS8vIFs3NV0gRXh0ZXJuYWxJRCA6Oj0gJ1NZU1RFTScgUyBTeXN0ZW1MaXRlcmFsIHwgJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwgUyBTeXN0ZW1MaXRlcmFsIA0KLUV4dGVybmFsSUQgPSAoU1lTVEVNe1N9e1N5c3RlbUxpdGVyYWx9fFBVQkxJQ3tTfXtQdWJpZExpdGVyYWx9e1N9e1N5c3RlbUxpdGVyYWx9ICkNCi0NCi0vLyBbNzZdIE5EYXRhRGVjbCA6Oj0gUyAnTkRBVEEnIFMgTmFtZQ0KLU5EYXRhRGVjbCA9ICh7U31OREFUQXtTfXtOYW1lfSkNCi0NCi0vLyBbNzddIFRleHREZWNsIDo6PSAnPD94bWwnIFZlcnNpb25JbmZvPyBFbmNvZGluZ0RlY2wgUz8gJz8+Jw0KLVRleHREZWNsID0gKDxcP3htbHtWZXJzaW9uSW5mb30/e0VuY29kaW5nRGVjbH17U30/XD8+KQ0KLQ0KLS8vIFs3OF0gZXh0UGFyc2VkRW50IDo6PSBUZXh0RGVjbD8gY29udGVudA0KLWV4dFBhcnNlZEVudCA9ICh7VGV4dERlY2x9P3tjb250ZW50fSkNCi0NCi0vLyBbNzldIGV4dFBFIDo6PSBUZXh0RGVjbD8gZXh0U3Vic2V0RGVjbA0KLWV4dFBFID0gKHtUZXh0RGVjbH0/e2V4dFN1YnNldERlY2x9KQ0KLQ0KLS8vIFs4MF0gRW5jb2RpbmdEZWNsIDo6PSBTICdlbmNvZGluZycgRXEgKCciJyBFbmNOYW1lICciJyB8ICAiJyIgRW5jTmFtZSAiJyIgKSANCi1FbmNvZGluZ0RlY2wgPSAoe1N9ZW5jb2Rpbmd7U30qe0VxfXtTfSooXCJ7RW5jTmFtZX1cInxcJ3tFbmNOYW1lfVwnKSkNCi0NCi0vLyBbODFdIEVuY05hbWUgOjo9IFtBLVphLXpdIChbQS1aYS16MC05Ll9dIHwgJy0nKSoNCi1FbmNOYW1lID0gKFtBLVphLXpdKFtBLVphLXowLTkuX118XC0pKikNCi0NCi0vLyBbODJdIE5vdGF0aW9uRGVjbCA6Oj0gJzwhTk9UQVRJT04nIFMgTmFtZSBTIChFeHRlcm5hbElEIHwgIFB1YmxpY0lEKSBTPyAnPicNCi1Ob3RhdGlvbkRlY2wgPSAoPFwhTk9UQVRJT057U317TmFtZX17U30oe0V4dGVybmFsSUR9fHtQdWJsaWNJRH0pe1N9Pz4pDQotDQotLy8gWzgzXSBQdWJsaWNJRCA6Oj0gJ1BVQkxJQycgUyBQdWJpZExpdGVyYWwNCi1QdWJsaWNJRCA9IChQVUJMSUN7U317UHViaWRMaXRlcmFsfSkNCi0NCi0vLyBbODRdICBMZXR0ZXIgOjo9IEJhc2VDaGFyIHwgSWRlb2dyYXBoaWMNCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pDQotDQotLy8gWzg1XSAgQmFzZUNoYXIgOjo9IFsjeDAwNDEtI3gwMDVBXSB8IFsjeDAwNjEtI3gwMDdBXSB8IFsjeDAwQzAtI3gwMEQ2XQ0KLS8vIHwgWyN4MDBEOC0jeDAwRjZdIHwgWyN4MDBGOC0jeDAwRkZdIHwgWyN4MDEwMC0jeDAxMzFdDQotLy8gfCBbI3gwMTM0LSN4MDEzRV0gfCBbI3gwMTQxLSN4MDE0OF0gfCBbI3gwMTRBLSN4MDE3RV0NCi0vLyB8IFsjeDAxODAtI3gwMUMzXSB8IFsjeDAxQ0QtI3gwMUYwXSB8IFsjeDAxRjQtI3gwMUY1XQ0KLS8vIHwgWyN4MDFGQS0jeDAyMTddIHwgWyN4MDI1MC0jeDAyQThdIHwgWyN4MDJCQi0jeDAyQzFdIHwgI3gwMzg2DQotLy8gfCBbI3gwMzg4LSN4MDM4QV0gfCAjeDAzOEMgfCBbI3gwMzhFLSN4MDNBMV0gfCBbI3gwM0EzLSN4MDNDRV0NCi0vLyB8IFsjeDAzRDAtI3gwM0Q2XSB8ICN4MDNEQSB8ICN4MDNEQyB8ICN4MDNERSB8ICN4MDNFMA0KLS8vIHwgWyN4MDNFMi0jeDAzRjNdIHwgWyN4MDQwMS0jeDA0MENdIHwgWyN4MDQwRS0jeDA0NEZdDQotLy8gfCBbI3gwNDUxLSN4MDQ1Q10gfCBbI3gwNDVFLSN4MDQ4MV0gfCBbI3gwNDkwLSN4MDRDNF0NCi0vLyB8IFsjeDA0QzctI3gwNEM4XSB8IFsjeDA0Q0ItI3gwNENDXSB8IFsjeDA0RDAtI3gwNEVCXQ0KLS8vIHwgWyN4MDRFRS0jeDA0RjVdIHwgWyN4MDRGOC0jeDA0RjldIHwgWyN4MDUzMS0jeDA1NTZdIHwgI3gwNTU5DQotLy8gfCBbI3gwNTYxLSN4MDU4Nl0gfCBbI3gwNUQwLSN4MDVFQV0gfCBbI3gwNUYwLSN4MDVGMl0NCi0vLyB8IFsjeDA2MjEtI3gwNjNBXSB8IFsjeDA2NDEtI3gwNjRBXSB8IFsjeDA2NzEtI3gwNkI3XQ0KLS8vIHwgWyN4MDZCQS0jeDA2QkVdIHwgWyN4MDZDMC0jeDA2Q0VdIHwgWyN4MDZEMC0jeDA2RDNdIHwgI3gwNkQ1DQotLy8gfCBbI3gwNkU1LSN4MDZFNl0gfCBbI3gwOTA1LSN4MDkzOV0gfCAjeDA5M0QgfCBbI3gwOTU4LSN4MDk2MV0NCi0vLyB8IFsjeDA5ODUtI3gwOThDXSB8IFsjeDA5OEYtI3gwOTkwXSB8IFsjeDA5OTMtI3gwOUE4XQ0KLS8vIHwgWyN4MDlBQS0jeDA5QjBdIHwgI3gwOUIyIHwgWyN4MDlCNi0jeDA5QjldIHwgWyN4MDlEQy0jeDA5RERdDQotLy8gfCBbI3gwOURGLSN4MDlFMV0gfCBbI3gwOUYwLSN4MDlGMV0gfCBbI3gwQTA1LSN4MEEwQV0NCi0vLyB8IFsjeDBBMEYtI3gwQTEwXSB8IFsjeDBBMTMtI3gwQTI4XSB8IFsjeDBBMkEtI3gwQTMwXQ0KLS8vIHwgWyN4MEEzMi0jeDBBMzNdIHwgWyN4MEEzNS0jeDBBMzZdIHwgWyN4MEEzOC0jeDBBMzldDQotLy8gfCBbI3gwQTU5LSN4MEE1Q10gfCAjeDBBNUUgfCBbI3gwQTcyLSN4MEE3NF0gfCBbI3gwQTg1LSN4MEE4Ql0NCi0vLyB8ICN4MEE4RCB8IFsjeDBBOEYtI3gwQTkxXSB8IFsjeDBBOTMtI3gwQUE4XSB8IFsjeDBBQUEtI3gwQUIwXQ0KLS8vIHwgWyN4MEFCMi0jeDBBQjNdIHwgWyN4MEFCNS0jeDBBQjldIHwgI3gwQUJEIHwgI3gwQUUwDQotLy8gfCBbI3gwQjA1LSN4MEIwQ10gfCBbI3gwQjBGLSN4MEIxMF0gfCBbI3gwQjEzLSN4MEIyOF0NCi0vLyB8IFsjeDBCMkEtI3gwQjMwXSB8IFsjeDBCMzItI3gwQjMzXSB8IFsjeDBCMzYtI3gwQjM5XSB8ICN4MEIzRA0KLS8vIHwgWyN4MEI1Qy0jeDBCNURdIHwgWyN4MEI1Ri0jeDBCNjFdIHwgWyN4MEI4NS0jeDBCOEFdDQotLy8gfCBbI3gwQjhFLSN4MEI5MF0gfCBbI3gwQjkyLSN4MEI5NV0gfCBbI3gwQjk5LSN4MEI5QV0gfCAjeDBCOUMNCi0vLyB8IFsjeDBCOUUtI3gwQjlGXSB8IFsjeDBCQTMtI3gwQkE0XSB8IFsjeDBCQTgtI3gwQkFBXQ0KLS8vIHwgWyN4MEJBRS0jeDBCQjVdIHwgWyN4MEJCNy0jeDBCQjldIHwgWyN4MEMwNS0jeDBDMENdDQotLy8gfCBbI3gwQzBFLSN4MEMxMF0gfCBbI3gwQzEyLSN4MEMyOF0gfCBbI3gwQzJBLSN4MEMzM10NCi0vLyB8IFsjeDBDMzUtI3gwQzM5XSB8IFsjeDBDNjAtI3gwQzYxXSB8IFsjeDBDODUtI3gwQzhDXQ0KLS8vIHwgWyN4MEM4RS0jeDBDOTBdIHwgWyN4MEM5Mi0jeDBDQThdIHwgWyN4MENBQS0jeDBDQjNdDQotLy8gfCBbI3gwQ0I1LSN4MENCOV0gfCAjeDBDREUgfCBbI3gwQ0UwLSN4MENFMV0gfCBbI3gwRDA1LSN4MEQwQ10NCi0vLyB8IFsjeDBEMEUtI3gwRDEwXSB8IFsjeDBEMTItI3gwRDI4XSB8IFsjeDBEMkEtI3gwRDM5XQ0KLS8vIHwgWyN4MEQ2MC0jeDBENjFdIHwgWyN4MEUwMS0jeDBFMkVdIHwgI3gwRTMwIHwgWyN4MEUzMi0jeDBFMzNdDQotLy8gfCBbI3gwRTQwLSN4MEU0NV0gfCBbI3gwRTgxLSN4MEU4Ml0gfCAjeDBFODQgfCBbI3gwRTg3LSN4MEU4OF0NCi0vLyB8ICN4MEU4QSB8ICN4MEU4RCB8IFsjeDBFOTQtI3gwRTk3XSB8IFsjeDBFOTktI3gwRTlGXQ0KLS8vIHwgWyN4MEVBMS0jeDBFQTNdIHwgI3gwRUE1IHwgI3gwRUE3IHwgWyN4MEVBQS0jeDBFQUJdDQotLy8gfCBbI3gwRUFELSN4MEVBRV0gfCAjeDBFQjAgfCBbI3gwRUIyLSN4MEVCM10gfCAjeDBFQkQNCi0vLyB8IFsjeDBFQzAtI3gwRUM0XSB8IFsjeDBGNDAtI3gwRjQ3XSB8IFsjeDBGNDktI3gwRjY5XQ0KLS8vIHwgWyN4MTBBMC0jeDEwQzVdIHwgWyN4MTBEMC0jeDEwRjZdIHwgI3gxMTAwIHwgWyN4MTEwMi0jeDExMDNdDQotLy8gfCBbI3gxMTA1LSN4MTEwN10gfCAjeDExMDkgfCBbI3gxMTBCLSN4MTEwQ10gfCBbI3gxMTBFLSN4MTExMl0NCi0vLyB8ICN4MTEzQyB8ICN4MTEzRSB8ICN4MTE0MCB8ICN4MTE0QyB8ICN4MTE0RSB8ICN4MTE1MA0KLS8vIHwgWyN4MTE1NC0jeDExNTVdIHwgI3gxMTU5IHwgWyN4MTE1Ri0jeDExNjFdIHwgI3gxMTYzIHwgI3gxMTY1DQotLy8gfCAjeDExNjcgfCAjeDExNjkgfCBbI3gxMTZELSN4MTE2RV0gfCBbI3gxMTcyLSN4MTE3M10gfCAjeDExNzUNCi0vLyB8ICN4MTE5RSB8ICN4MTFBOCB8ICN4MTFBQiB8IFsjeDExQUUtI3gxMUFGXSB8IFsjeDExQjctI3gxMUI4XQ0KLS8vIHwgI3gxMUJBIHwgWyN4MTFCQy0jeDExQzJdIHwgI3gxMUVCIHwgI3gxMUYwIHwgI3gxMUY5DQotLy8gfCBbI3gxRTAwLSN4MUU5Ql0gfCBbI3gxRUEwLSN4MUVGOV0gfCBbI3gxRjAwLSN4MUYxNV0NCi0vLyB8IFsjeDFGMTgtI3gxRjFEXSB8IFsjeDFGMjAtI3gxRjQ1XSB8IFsjeDFGNDgtI3gxRjREXQ0KLS8vIHwgWyN4MUY1MC0jeDFGNTddIHwgI3gxRjU5IHwgI3gxRjVCIHwgI3gxRjVEIHwgWyN4MUY1Ri0jeDFGN0RdDQotLy8gfCBbI3gxRjgwLSN4MUZCNF0gfCBbI3gxRkI2LSN4MUZCQ10gfCAjeDFGQkUgfCBbI3gxRkMyLSN4MUZDNF0NCi0vLyB8IFsjeDFGQzYtI3gxRkNDXSB8IFsjeDFGRDAtI3gxRkQzXSB8IFsjeDFGRDYtI3gxRkRCXQ0KLS8vIHwgWyN4MUZFMC0jeDFGRUNdIHwgWyN4MUZGMi0jeDFGRjRdIHwgWyN4MUZGNi0jeDFGRkNdIHwgI3gyMTI2DQotLy8gfCBbI3gyMTJBLSN4MjEyQl0gfCAjeDIxMkUgfCBbI3gyMTgwLSN4MjE4Ml0gfCBbI3gzMDQxLSN4MzA5NF0NCi0vLyB8IFsjeDMwQTEtI3gzMEZBXSB8IFsjeDMxMDUtI3gzMTJDXSB8IFsjeEFDMDAtI3hEN0EzXQ0KLUJhc2VDaGFyID0gW1x1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM10NCi0NCi0vLyBbODZdICBJZGVvZ3JhcGhpYyA6Oj0gWyN4NEUwMC0jeDlGQTVdIHwgI3gzMDA3IHwgWyN4MzAyMS0jeDMwMjldDQotSWRlb2dyYXBoaWMgPSBbXHU0RTAwLVx1OUZBNVx1MzAwN1x1MzAyMS1cdTMwMjldDQotDQotLy8gWzg3XSAgICAgIENvbWJpbmluZ0NoYXIgICAgOjo9ICAgIFsjeDAzMDAtI3gwMzQ1XSAgICB8IFsjeDAzNjAtI3gwMzYxXQ0KLS8vIHwgWyN4MDQ4My0jeDA0ODZdICAgICAgICAgIHwgWyN4MDU5MS0jeDA1QTFdICAgICAgICAgfCBbI3gwNUEzLSN4MDVCOV0NCi0vLyB8IFsjeDA1QkItI3gwNUJEXSAgICAgICB8ICN4MDVCRiAgICAgICB8IFsjeDA1QzEtI3gwNUMyXQkgfCAjeDA1QzQNCi0vLyB8IFsjeDA2NEItI3gwNjUyXSAgICB8ICN4MDY3MCAgICB8IFsjeDA2RDYtI3gwNkRDXSAgIHwgWyN4MDZERC0jeDA2REZdDQotLy8gfCBbI3gwNkUwLSN4MDZFNF0gICAgICAgICAgfCBbI3gwNkU3LSN4MDZFOF0gICAgICAgICB8IFsjeDA2RUEtI3gwNkVEXQ0KLS8vIHwgWyN4MDkwMS0jeDA5MDNdICAgICAgIHwgI3gwOTNDICAgICAgIHwgWyN4MDkzRS0jeDA5NENdICAgICAgfCAjeDA5NEQNCi0vLyB8IFsjeDA5NTEtI3gwOTU0XSAgICB8IFsjeDA5NjItI3gwOTYzXSAgICB8IFsjeDA5ODEtI3gwOTgzXSAgIHwgI3gwOUJDDQotLy8gfCAjeDA5QkUgICAgICAgfCAjeDA5QkYgICAgICAgfCBbI3gwOUMwLSN4MDlDNF0gICAgICB8IFsjeDA5QzctI3gwOUM4XQ0KLS8vIHwgWyN4MDlDQi0jeDA5Q0RdICAgfCAjeDA5RDcgICB8IFsjeDA5RTItI3gwOUUzXSAgIHwgI3gwQTAyICAgfCAjeDBBM0MNCi0vLyB8ICN4MEEzRSAgICAgICB8ICN4MEEzRiAgICAgICB8IFsjeDBBNDAtI3gwQTQyXSAgICAgIHwgWyN4MEE0Ny0jeDBBNDhdDQotLy8gfCBbI3gwQTRCLSN4MEE0RF0gICAgfCBbI3gwQTcwLSN4MEE3MV0gICAgfCBbI3gwQTgxLSN4MEE4M10gICB8ICN4MEFCQw0KLS8vIHwgWyN4MEFCRS0jeDBBQzVdICAgICAgICAgIHwgWyN4MEFDNy0jeDBBQzldICAgICAgICAgfCBbI3gwQUNCLSN4MEFDRF0NCi0vLyB8IFsjeDBCMDEtI3gwQjAzXSAgICB8ICN4MEIzQyAgICB8IFsjeDBCM0UtI3gwQjQzXSAgIHwgWyN4MEI0Ny0jeDBCNDhdDQotLy8gfCBbI3gwQjRCLSN4MEI0RF0gICAgICAgICAgfCBbI3gwQjU2LSN4MEI1N10gICAgICAgICB8IFsjeDBCODItI3gwQjgzXQ0KLS8vIHwgWyN4MEJCRS0jeDBCQzJdICAgIHwgWyN4MEJDNi0jeDBCQzhdICAgIHwgWyN4MEJDQS0jeDBCQ0RdICAgfCAjeDBCRDcNCi0vLyB8IFsjeDBDMDEtI3gwQzAzXSAgICAgICAgICB8IFsjeDBDM0UtI3gwQzQ0XSAgICAgICAgIHwgWyN4MEM0Ni0jeDBDNDhdDQotLy8gfCBbI3gwQzRBLSN4MEM0RF0gICAgICAgICAgfCBbI3gwQzU1LSN4MEM1Nl0gICAgICAgICB8IFsjeDBDODItI3gwQzgzXQ0KLS8vIHwgWyN4MENCRS0jeDBDQzRdICAgICAgICAgIHwgWyN4MENDNi0jeDBDQzhdICAgICAgICAgfCBbI3gwQ0NBLSN4MENDRF0NCi0vLyB8IFsjeDBDRDUtI3gwQ0Q2XSAgICAgICAgICB8IFsjeDBEMDItI3gwRDAzXSAgICAgICAgIHwgWyN4MEQzRS0jeDBENDNdDQotLy8gfCBbI3gwRDQ2LSN4MEQ0OF0gICAgICAgfCBbI3gwRDRBLSN4MEQ0RF0gICAgICAgfCAjeDBENTcgICAgICB8ICN4MEUzMQ0KLS8vIHwgWyN4MEUzNC0jeDBFM0FdICAgIHwgWyN4MEU0Ny0jeDBFNEVdICAgIHwgI3gwRUIxICAgfCBbI3gwRUI0LSN4MEVCOV0NCi0vLyB8IFsjeDBFQkItI3gwRUJDXSAgICB8IFsjeDBFQzgtI3gwRUNEXSAgICB8IFsjeDBGMTgtI3gwRjE5XSAgIHwgI3gwRjM1DQotLy8gfCAjeDBGMzcgICAgICB8ICN4MEYzOSAgICAgfCAjeDBGM0UgICAgIHwgI3gwRjNGICAgICB8IFsjeDBGNzEtI3gwRjg0XQ0KLS8vIHwgWyN4MEY4Ni0jeDBGOEJdICAgIHwgWyN4MEY5MC0jeDBGOTVdICAgIHwgI3gwRjk3ICAgfCBbI3gwRjk5LSN4MEZBRF0NCi0vLyB8IFsjeDBGQjEtI3gwRkI3XSAgICAgICB8ICN4MEZCOSAgICAgICB8IFsjeDIwRDAtI3gyMERDXSAgICAgIHwgI3gyMEUxDQotLy8gfCBbI3gzMDJBLSN4MzAyRl0gfCAjeDMwOTkgfCAjeDMwOUENCi1Db21iaW5pbmdDaGFyID0gICAgW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0NCi0NCi0vLyBbODhdICAgRGlnaXQgIDo6PSAgWyN4MDAzMC0jeDAwMzldIHwgWyN4MDY2MC0jeDA2NjldIHwgWyN4MDZGMC0jeDA2RjldDQotLy8gfCBbI3gwOTY2LSN4MDk2Rl0gICAgICAgICAgfCBbI3gwOUU2LSN4MDlFRl0gICAgICAgICB8IFsjeDBBNjYtI3gwQTZGXQ0KLS8vIHwgWyN4MEFFNi0jeDBBRUZdICAgICAgICAgIHwgWyN4MEI2Ni0jeDBCNkZdICAgICAgICAgfCBbI3gwQkU3LSN4MEJFRl0NCi0vLyB8IFsjeDBDNjYtI3gwQzZGXSAgICAgICAgICB8IFsjeDBDRTYtI3gwQ0VGXSAgICAgICAgIHwgWyN4MEQ2Ni0jeDBENkZdDQotLy8gfCBbI3gwRTUwLSN4MEU1OV0gfCBbI3gwRUQwLSN4MEVEOV0gfCBbI3gwRjIwLSN4MEYyOV0NCi1EaWdpdCA9ICBbXHUwMDMwLVx1MDAzOVx1MDY2MC1cdTA2NjlcdTA2RjAtXHUwNkY5XHUwOTY2LVx1MDk2Rlx1MDlFNi1cdTA5RUZcdTBBNjYtXHUwQTZGXHUwQUU2LVx1MEFFRlx1MEI2Ni1cdTBCNkZcdTBCRTctXHUwQkVGXHUwQzY2LVx1MEM2Rlx1MENFNi1cdTBDRUZcdTBENjYtXHUwRDZGXHUwRTUwLVx1MEU1OVx1MEVEMC1cdTBFRDlcdTBGMjAtXHUwRjI5XQ0KLQ0KLS8vIFs4OV0gIEV4dGVuZGVyIDo6PSAjeDAwQjcgfCAjeDAyRDAgfCAjeDAyRDEgfCAjeDAzODcgfCAjeDA2NDAgfCAjeDBFNDYNCi0vLyB8ICN4MEVDNiAgICAgICB8ICN4MzAwNSAgICAgICB8IFsjeDMwMzEtI3gzMDM1XSAgICAgIHwgWyN4MzA5RC0jeDMwOUVdDQotLy8gfCBbI3gzMEZDLSN4MzBGRV0NCi1FeHRlbmRlciA9IFtcdTAwQjdcdTAyRDBcdTAyRDFcdTAzODdcdTA2NDBcdTBFNDZcdTBFQzZcdTMwMDVcdTMwMzEtXHUzMDM1XHUzMDlELVx1MzA5RVx1MzBGQy1cdTMwRkVdDQotDQotDQotDQotLyoqDQotICogSlNQIGFuZCBzY3JpcHRpbmcgbWFya2VyIGFsbG93YW5jZXMNCi0gKi8NCi0NCi1qc3BDb21tZW50U3RhcnQgPSA8JS0tDQotanNwQ29tbWVudEVuZCAgID0gLS0lPg0KLQ0KLWpzcFNjcmlwdGxldFN0YXJ0ICAgICAgICA9IDwlDQotanNwRXhwcmVzc2lvblN0YXJ0ICAgICAgID0ge2pzcFNjcmlwdGxldFN0YXJ0fT0NCi1qc3BEZWNsYXJhdGlvblN0YXJ0ICAgICAgPSB7anNwU2NyaXB0bGV0U3RhcnR9XCENCi1qc3BTY3JpcHRsZXRFbmQgICAgICAgICAgPSAlPg0KLWpzcERpcmVjdGl2ZVN0YXJ0ICAgICAgICA9IHtqc3BTY3JpcHRsZXRTdGFydH1ADQotDQotJSUNCi0NCi0vKiB3aGl0ZSBzcGFjZSB3aXRoaW4gYSB0YWcgKi8NCi08U1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9QSSwgU1RfWE1MX1BJX0VRVUFMUywgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04sIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRSxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQsU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVELFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLFNUX0RIVE1MX0VRVUFMUyxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUsU1RfREhUTUxfVEFHX0NMT1NFPiB7U30qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHJldHVybiBXSElURV9TUEFDRTsNCi19DQotDQotLy8gQkVHSU4gUkVHVUxBUiBYTUwNCi0vKiBoYW5kbGUgb3BlbmluZyBhIG5ldyB0YWcgYWxtb3N0IGFueXdoZXJlICovDQotDQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfSlNQX0RJUkVDVElWRV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX05BTUVfV0hJVEVTUEFDRSwgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9FUVVBTFMsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbnN0YXJ0IHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOw0KLX0NCi0vKiBWRVJZIHNwZWNpYWwgY2FzZXMgZm9yIHRhZ3MgYXMgdmFsdWVzICovDQotLyogcXVvdGVkIEpTUCAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ+IFsiXSB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEU7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFsnXSB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiBbIl0gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCk7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0IC0gY29tcGxleCBkb3VibGUgcXVvdGVkIik7Ly8kTk9OLU5MUy0xJA0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSwgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFKTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4gWyddIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpOw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGF0dHJpYnV0ZSB2YWx1ZSBzdGFydCAtIGNvbXBsZXggc2luZ2xlIHF1b3RlZCIpOy8vJE5PTi1OTFMtMSQNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ+IChbXjwiXHgyNFx4MjNdfFtceDI0XHgyM11bXlx4N2JdKSsgew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IChbXjwnXHgyNFx4MjNdfFtceDI0XHgyM11bXlx4N2JdKSsgew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQsU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEPiB7Z2VuZXJpY1RhZ09wZW59IHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlpbnQgaW5jb21pbmdTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgidGFnIGluc2lkZSBvZiBKU1AgYXR0cmlidXRlIHZhbHVlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX1RBR19PUEVOLCBuZXcgU3RyaW5nW117WE1MX1RBR19DTE9TRSxYTUxfRU1QVFlfVEFHX0NMT1NFfSk7DQotCWlmKHl5c3RhdGUoKSAhPSBTVF9BQk9SVF9FTUJFRERFRCkNCi0gICAgICAgIHl5YmVnaW4oaW5jb21pbmdTdGF0ZSk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVELFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4ge2dlbmVyaWNFbmRUYWdPcGVufSB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JaW50IGluY29taW5nU3RhdGUgPSB5eXN0YXRlKCk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBhdHRyaWJ1dGUgdmFsdWUgc3RhcnQgLSBlbmQgdGFnIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoWE1MX0VORF9UQUdfT1BFTiwgbmV3IFN0cmluZ1tde1hNTF9UQUdfQ0xPU0UsWE1MX0VNUFRZX1RBR19DTE9TRX0pOw0KLQlpZih5eXN0YXRlKCkgIT0gU1RfQUJPUlRfRU1CRURERUQpDQotICAgICAgICB5eWJlZ2luKGluY29taW5nU3RhdGUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotLyogdW5xdW90ZWQgKi8NCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgdGFnIGVtYmVkZGVkIG5hbWUgc3RhcnQgLSBzdGFydCB0YWciKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihYTUxfVEFHX09QRU4sIG5ldyBTdHJpbmdbXXtYTUxfVEFHX0NMT1NFLFhNTF9FTVBUWV9UQUdfQ0xPU0V9KTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotPFlZSU5JVElBTCwgU1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUsIFNUX1hNTF9ERUNMQVJBVElPTj4ge2dlbmVyaWNFbmRUYWdPcGVufSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOw0KLX0NCi0vKiBzcGVjaWFsbHkgdHJlYXRlZCBKU1AgdGFnIG5hbWVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ganNwOnJvb3Qgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImpzcDpyb290IHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBKU1BfUk9PVF9UQUdfTkFNRTsNCi19DQotPFNUX1hNTF9UQUdfTkFNRT4ganNwOmRpcmVjdGl2ZS4ocGFnZXxpbmNsdWRlfHRhZ3x0YWdsaWJ8YXR0cmlidXRlfHZhcmlhYmxlKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgianNwIGRpcmVjdGl2ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi0vKiB0aGUgdGFnJ3MgbmFtZSB3YXMgZm91bmQsIHN0YXJ0IHNjYW5uaW5nIGZvciBhdHRyaWJ1dGVzICovDQotPFNUX1hNTF9UQUdfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi0NCi0vKiBhbm90aGVyIGF0dHJpYnV0ZSBuYW1lIHdhcyBmb3VuZCwgcmVzdW1lIGxvb2tpbmcgZm9yIHRoZSBlcXVhbHMgc2lnbiAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9FUVVBTFM+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi0vKiBhbiBlcXVhbCBzaWduIHdhcyBmb3VuZCwgd2hhdCdzIG5leHQgaXMgdGhlIHZhbHVlICovDQotPFNUX1hNTF9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7DQotCQlmRW1iZWRkZWRIaW50ID0gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KCk7DQotCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9CTE9DS19UQUdfU0NBTjsNCi0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JfQ0KLQllbHNlDQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQ0xPU0U7DQotfQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQsIGJ1dCB0aGUgdGFnIGRvZXNuJ3QgbmVlZCBhIG1hdGNoaW5nIGVuZCB0YWcgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljRW1wdHlUYWdDbG9zZX0gew0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOw0KLX0NCi0NCi08U1RfWE1MX1RBR19OQU1FPiBbXjwvPlx1MDA0MS1cdTAwNUFcdTAwNjEtXHUwMDdBXHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMEZGXHUwMTAwLVx1MDEzMVx1MDEzNC1cdTAxM0VcdTAxNDEtXHUwMTQ4XHUwMTRBLVx1MDE3RVx1MDE4MC1cdTAxQzNcdTAxQ0QtXHUwMUYwXHUwMUY0LVx1MDFGNVx1MDFGQS1cdTAyMTdcdTAyNTAtXHUwMkE4XHUwMkJCLVx1MDJDMVx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNDRVx1MDNEMC1cdTAzRDZcdTAzREFcdTAzRENcdTAzREVcdTAzRTBcdTAzRTItXHUwM0YzXHUwNDAxLVx1MDQwQ1x1MDQwRS1cdTA0NEZcdTA0NTEtXHUwNDVDXHUwNDVFLVx1MDQ4MVx1MDQ5MC1cdTA0QzRcdTA0QzctXHUwNEM4XHUwNENCLVx1MDRDQ1x1MDREMC1cdTA0RUJcdTA0RUUtXHUwNEY1XHUwNEY4LVx1MDRGOVx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg2XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjEtXHUwNjNBXHUwNjQxLVx1MDY0QVx1MDY3MS1cdTA2QjdcdTA2QkEtXHUwNkJFXHUwNkMwLVx1MDZDRVx1MDZEMC1cdTA2RDNcdTA2RDVcdTA2RTUtXHUwNkU2XHUwOTA1LVx1MDkzOVx1MDkzRFx1MDk1OC1cdTA5NjFcdTA5ODUtXHUwOThDXHUwOThGLVx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlEQy1cdTA5RERcdTA5REYtXHUwOUUxXHUwOUYwLVx1MDlGMVx1MEEwNS1cdTBBMEFcdTBBMEYtXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzItXHUwQTMzXHUwQTM1LVx1MEEzNlx1MEEzOC1cdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOEJcdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjItXHUwQUIzXHUwQUI1LVx1MEFCOVx1MEFCRFx1MEFFMFx1MEIwNS1cdTBCMENcdTBCMEYtXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzItXHUwQjMzXHUwQjM2LVx1MEIzOVx1MEIzRFx1MEI1Qy1cdTBCNURcdTBCNUYtXHUwQjYxXHUwQjg1LVx1MEI4QVx1MEI4RS1cdTBCOTBcdTBCOTItXHUwQjk1XHUwQjk5LVx1MEI5QVx1MEI5Q1x1MEI5RS1cdTBCOUZcdTBCQTMtXHUwQkE0XHUwQkE4LVx1MEJBQVx1MEJBRS1cdTBCQjVcdTBCQjctXHUwQkI5XHUwQzA1LVx1MEMwQ1x1MEMwRS1cdTBDMTBcdTBDMTItXHUwQzI4XHUwQzJBLVx1MEMzM1x1MEMzNS1cdTBDMzlcdTBDNjAtXHUwQzYxXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDREVcdTBDRTAtXHUwQ0UxXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDI4XHUwRDJBLVx1MEQzOVx1MEQ2MC1cdTBENjFcdTBFMDEtXHUwRTJFXHUwRTMwXHUwRTMyLVx1MEUzM1x1MEU0MC1cdTBFNDVcdTBFODEtXHUwRTgyXHUwRTg0XHUwRTg3LVx1MEU4OFx1MEU4QVx1MEU4RFx1MEU5NC1cdTBFOTdcdTBFOTktXHUwRTlGXHUwRUExLVx1MEVBM1x1MEVBNVx1MEVBN1x1MEVBQS1cdTBFQUJcdTBFQUQtXHUwRUFFXHUwRUIwXHUwRUIyLVx1MEVCM1x1MEVCRFx1MEVDMC1cdTBFQzRcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2OVx1MTBBMC1cdTEwQzVcdTEwRDAtXHUxMEY2XHUxMTAwXHUxMTAyLVx1MTEwM1x1MTEwNS1cdTExMDdcdTExMDlcdTExMEItXHUxMTBDXHUxMTBFLVx1MTExMlx1MTEzQ1x1MTEzRVx1MTE0MFx1MTE0Q1x1MTE0RVx1MTE1MFx1MTE1NC1cdTExNTVcdTExNTlcdTExNUYtXHUxMTYxXHUxMTYzXHUxMTY1XHUxMTY3XHUxMTY5XHUxMTZELVx1MTE2RVx1MTE3Mi1cdTExNzNcdTExNzVcdTExOUVcdTExQThcdTExQUJcdTExQUUtXHUxMUFGXHUxMUI3LVx1MTFCOFx1MTFCQVx1MTFCQy1cdTExQzJcdTExRUJcdTExRjBcdTExRjlcdTFFMDAtXHUxRTlCXHUxRUEwLVx1MUVGOVx1MUYwMC1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjEyNlx1MjEyQS1cdTIxMkJcdTIxMkVcdTIxODAtXHUyMTgyXHUzMDQxLVx1MzA5NFx1MzBBMS1cdTMwRkFcdTMxMDUtXHUzMTJDXHVBQzAwLVx1RDdBM1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImluYXBwcm9wcmlhdGUgdGFnIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWlmKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCk9PVNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRHx8ZlN0YXRlU3RhY2sucGVlaygpPT1TVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKS0xKTsNCi0JCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JfQ0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLS8vIEVORCBSRUdVTEFSIFhNTA0KLQ0KLS8vIEJFR0lOIE5FU1RFRCBYTUwgVEFHUw0KLTxTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9FUVVBTFM+IDx7TmFtZX0gew0KLQlTdHJpbmcgdGFnTmFtZSA9IHl5dGV4dCgpLnN1YnN0cmluZygxKTsNCi0JLy8gcHVzaGJhY2sgdG8ganVzdCBhZnRlciB0aGUgb3BlbmluZyBicmFja2V0DQotCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDEpOw0KLQkvKg0KLQkgKiBJZiB0aGlzIHRhZyBjYW4gbm90IGJlIG5lc3RlZCBvciB3ZSdyZSBhbHJlYWR5IHNlYXJjaGluZyBmb3IgYW4NCi0JICogYXR0cmlidXRlIG5hbWUsIGVxdWFscywgb3IgdmFsdWUsIHJldHVybiBpbW1lZGlhdGVseS4NCi0JICovDQotCWlmICghaXNOZXN0YWJsZSh0YWdOYW1lKSB8fCAoIWZTdGF0ZVN0YWNrLmVtcHR5KCkgJiYgKGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9FUVVBTFMgfHwgZlN0YXRlU3RhY2sucGVlaygpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpKSkgew0KLQkJeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQkJcmV0dXJuIFhNTF9UQUdfT1BFTjsNCi0JfQ0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBpbiBwbGFjZSBvZiBhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfRVFVQUxTKTsNCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFPiA8e05hbWV9IHsNCi0JU3RyaW5nIHRhZ05hbWUgPSB5eXRleHQoKS5zdWJzdHJpbmcoMSk7DQotCS8vIHB1c2hiYWNrIHRvIGp1c3QgYWZ0ZXIgdGhlIG9wZW5pbmcgYnJhY2tldA0KLQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLSAxKTsNCi0JLyoNCi0JICogSWYgdGhpcyB0YWcgY2FuIG5vdCBiZSBuZXN0ZWQgb3Igd2UncmUgYWxyZWFkeSBzZWFyY2hpbmcgZm9yIGFuDQotCSAqIGF0dHJpYnV0ZSBuYW1lLCBlcXVhbHMsIG9yIHZhbHVlLCByZXR1cm4gaW1tZWRpYXRlbHkuDQotCSAqLw0KLQlpZiAoIWlzTmVzdGFibGUodGFnTmFtZSkgfHwgKCFmU3RhdGVTdGFjay5lbXB0eSgpICYmIChmU3RhdGVTdGFjay5wZWVrKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9OQU1FIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfRVFVQUxTIHx8IGZTdGF0ZVN0YWNrLnBlZWsoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKSkpIHsNCi0JCXl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsNCi0JCXJldHVybiBYTUxfVEFHX09QRU47DQotCX0NCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgaW4gcGxhY2Ugb2YgYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JLy8gZW1iZWRkZWQgY29udGFpbmVyIHNob3VsZCBiZSBsb29raW5nIGZvciB0aGUgbmFtZSAoYWdhaW4pIG5leHQNCi0JeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLQlhc3NlbWJsZUVtYmVkZGVkVGFnU2VxdWVuY2UoWE1MX1RBR19PUEVOLCB0YWdOYW1lKTsgLy8gPw0KLQlmU3RhdGVTdGFjay5wb3AoKTsNCi0JeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotLy8gRU5EIE5FU1RFRCBYTUwNCi0NCi0vLyBYTUwgJiBKU1AgQ29tbWVudHMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9KU1BfRElSRUNUSVZFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfTkFNRV9XSElURVNQQUNFLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUywgU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUU+IHtDb21tZW50U3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09NTUVOVF9URVhUOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQ09NTUVOVDsNCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9PUEVOOw0KLX0NCi08U1RfWE1MX0NPTU1FTlQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLX0NCi0NCi08U1RfWE1MX0NPTU1FTlRfRU5EPiB7Q29tbWVudEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsNCi19DQotDQotPFNUX0pTUF9DT05URU5UPiB7anNwU2NyaXB0bGV0RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBKU1BfQ0xPU0U7DQotfQ0KLTxTVF9KU1BfQ09OVEVOVD4gLnxcbnxcciB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiSlNQIGNvZGUgY29udGVudCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIGRvU2NhbigiJT4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBKU1BfQ09OVEVOVCwgU1RfSlNQX0NPTlRFTlQsIFNUX0pTUF9DT05URU5UKTsNCi19DQote2pzcFNjcmlwdGxldFN0YXJ0fSB7DQotCS8qIEpTUCBzY3JpcHRsZXQgYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygxKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDIpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGZpbmlzaGVkIHNhbml0eSBjaGVja3MNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZihmU3RhdGVTdGFjay5wZWVrKCk9PVlZSU5JVElBTCkgew0KLQkJLy8gdGhlIHNpbXBsZSBjYXNlLCBqdXN0IGEgcmVndWxhciBzY3JpcHRsZXQgb3V0IGluIGNvbnRlbnQNCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIlxuSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJcmV0dXJuIEpTUF9TQ1JJUFRMRVRfT1BFTjsNCi0JfQ0KLQllbHNlIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYmVnaW4gZW1iZWRkZWQgcmVnaW9uOiAiICsgZkVtYmVkZGVkSGludCk7Ly8kTk9OLU5MUy0xJA0KLQkJfQ0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiSlNQIHNjcmlwdGxldCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0NEQVRBX1RFWFQpIHsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ0RBVEFfVEVYVDsNCi0JCX0NCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfU0NSSVBUTEVUX09QRU4sIEpTUF9DTE9TRSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsNCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JCX0NCi0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi17anNwRXhwcmVzc2lvblN0YXJ0fSB7DQotCS8qIEpTUCBleHByZXNzaW9uIGJlZ3VuIChhbnl3aGVyZSkNCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUNCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMNCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQNCi0JICovDQotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7DQotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyENCi0JCXl5cHVzaGJhY2soMik7DQotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsNCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsNCi0JfQ0KLQkvLyBlbmQgc2FuaXR5IGNoZWNrcw0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7DQotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYW4gZXhwcmVzc2lvbiBvdXQgaW4gY29udGVudA0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiXG5KU1AgZXhwcmVzc2lvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJcmV0dXJuIEpTUF9FWFBSRVNTSU9OX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBleHByZXNzaW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgew0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOw0KLQkJfQ0KLQkJeXliZWdpbihTVF9KU1BfQ09OVEVOVCk7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FWFBSRVNTSU9OX09QRU4sIEpTUF9DTE9TRSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsNCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JCX0NCi0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi17anNwRGVjbGFyYXRpb25TdGFydH0gew0KLQkvKiBKU1AgZGVjbGFyYXRpb24gYmVndW4gKGFueXdoZXJlKQ0KLQkgKiBBIGNvbnNlcXVlbmNlIG9mIHRoZSBzdGFydCBhbnl3aGVyZSBwb3NzaWJpbGl0eSBpcyB0aGF0IHRoZQ0KLQkgKiAgaW5jb21pbmcgc3RhdGUgbXVzdCBiZSBjaGVja2VkIHRvIHNlZSBpZiBpdCdzIGVycm9uZW91cw0KLQkgKiAgZHVlIHRvIHRoZSBvcmRlciBvZiBwcmVjZWRlbmNlIGdlbmVyYXRlZA0KLQkgKi8NCi0JLy8gYmVnaW4gc2FuaXR5IGNoZWNrcw0KLQlpZih5eXN0YXRlKCkgPT0gU1RfSlNQX0NPTlRFTlQpIHsNCi0JCS8vIGF0IHRoZSBiZWdpbm5pbmc/IQ0KLQkJeXlwdXNoYmFjaygyKTsNCi0JCXJldHVybiBKU1BfQ09OVEVOVDsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfU0NBTikgew0KLQkJeXlwdXNoYmFjaygzKTsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOw0KLQl9DQotCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT01NRU5UKSB7DQotCQl5eXB1c2hiYWNrKDMpOw0KLQkJcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLQl9DQotCS8vIGVuZCBzYW5pdHkgY2hlY2tzDQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoZlN0YXRlU3RhY2sucGVlaygpPT1ZWUlOSVRJQUwpIHsNCi0JCS8vIHRoZSBzaW1wbGUgY2FzZSwganVzdCBhIGRlY2xhcmF0aW9uIG91dCBpbiBjb250ZW50DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBkZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTlRFTlQpOw0KLQkJcmV0dXJuIEpTUF9ERUNMQVJBVElPTl9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZGVjbGFyYXRpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQlpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9EUVVPVEVEKQ0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRDsNCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9DREFUQV9URVhUKSB7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfQ0RBVEFfVEVYVDsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCQl9DQotCQl5eWJlZ2luKFNUX0pTUF9DT05URU5UKTsNCi0JCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0RFQ0xBUkFUSU9OX09QRU4sIEpTUF9DTE9TRSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pIHsNCi0JCQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsNCi0JCQlyZXR1cm4gQkxPQ0tfVEVYVDsNCi0JCX0NCi0JCS8vIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9ucw0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9UQUdfTkFNRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJZWxzZSBpZigoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSB8fCB5eXN0YXRlKCkgPT0gU1RfWE1MX0VRVUFMUykpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQkJfQ0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRSkgew0KLQkJCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCQl9DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLX0NCi17anNwQ29tbWVudFN0YXJ0fSB7DQotCS8qIEpTUCBjb21tZW50IGJlZ3VuIChhbnl3aGVyZSkNCi0JICogQSBjb25zZXF1ZW5jZSBvZiB0aGUgc3RhcnQgYW55d2hlcmUgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUNCi0JICogIGluY29taW5nIHN0YXRlIG11c3QgYmUgY2hlY2tlZCB0byBzZWUgaWYgaXQncyBlcnJvbmVvdXMNCi0JICogIGR1ZSB0byB0aGUgb3JkZXIgb2YgcHJlY2VkZW5jZSBnZW5lcmF0ZWQNCi0JICovDQotCS8vIGJlZ2luIHNhbml0eSBjaGVja3MNCi0JaWYoeXlzdGF0ZSgpID09IFNUX0pTUF9DT05URU5UKSB7DQotCQkvLyBhdCB0aGUgYmVnaW5uaW5nPyENCi0JCXl5cHVzaGJhY2soMyk7DQotCQlyZXR1cm4gSlNQX0NPTlRFTlQ7DQotCX0NCi0JZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX1NDQU4pIHsNCi0JCXl5cHVzaGJhY2soNCk7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjayg0KTsNCi0JCXJldHVybiBzY2FuWE1MQ29tbWVudFRleHQoKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9KU1BfQ09NTUVOVCkgew0KLQkJeXlwdXNoYmFjayg0KTsNCi0JCXJldHVybiBzY2FuSlNQQ29tbWVudFRleHQoKTsNCi0JfQ0KLQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgIHsNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7DQotCQlpZih5eXN0YXRlKCkgPT0gU1RfQkxPQ0tfVEFHX0lOVEVSTkFMX1NDQU4pDQotCQkJeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi0JfQ0KLQkvLyBmaW5pc2hlZCBzYW5pdHkgY2hlY2tzDQotCWlmKHl5c3RhdGUoKT09WVlJTklUSUFMKSB7DQotCQkvLyB0aGUgc2ltcGxlIGNhc2UsIGp1c3QgYSByZWd1bGFyIHNjcmlwdGxldCBvdXQgaW4gY29udGVudA0KLQkJaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQkJZHVtcCgiXG5KU1AgY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQkJcmV0dXJuIEpTUF9DT01NRU5UX09QRU47DQotCX0NCi0JZWxzZSB7DQotCQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJCWR1bXAoIkpTUCBjb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRCkNCi0JCQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ7DQotCQllbHNlIGlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQpDQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9WQUxVRV9TUVVPVEVEOw0KLQkJZWxzZSBpZih5eXN0YXRlKCkgPT0gU1RfQ0RBVEFfVEVYVCkgew0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX0NEQVRBX1RFWFQ7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9DREFUQV9URVhUOw0KLQkJfQ0KLQkJeXliZWdpbihTVF9KU1BfQ09NTUVOVCk7DQotCQkvLyB0aGUgY29tbWVudCBjb250YWluZXIgaXRzZWxmIHdpbGwgYWN0IGFzIGNvbW1lbnQgdGV4dA0KLQkJZkVtYmVkZGVkSGludCA9IEpTUF9DT01NRU5UX1RFWFQ7DQotCQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9DT01NRU5UX09QRU4sIEpTUF9DT01NRU5UX0NMT1NFKTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJLyoNCi0JCSAqIHJlcXVpcmVkIGhlbHAgZm9yIHN1Y2Nlc3NpdmUgZW1iZWRkZWQgcmVnaW9uczsgbWFyayB0aGlzIG9uZSBhcyBhDQotCQkgKiBjb21tZW50IHNvIGl0IHdpbGwgYmUgb3RoZXJ3aXNlIGlnbm9yZWQgYnV0IHByZXNlcnZlZCAod2hpY2ggaXMgd2h5DQotCQkgKiB3ZSBjYW4ndCB1c2Ugd2hpdGUtc3BhY2UpDQotCQkgKi8NCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9YTUxfVEFHX05BTUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19OQU1FOw0KLQkJCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JCX0NCi0JCWVsc2UgaWYoKHl5c3RhdGUoKSA9PSBTVF9YTUxfQVRUUklCVVRFX05BTUUgfHwgeXlzdGF0ZSgpID09IFNUX1hNTF9FUVVBTFMpKSB7DQotCQkJZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0JCX0NCi0JCWVsc2UgaWYoeXlzdGF0ZSgpID09IFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpIHsNCi0JCQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQotPFNUX0JMT0NLX1RBR19JTlRFUk5BTF9TQ0FOPiB7anNwQ29tbWVudFN0YXJ0fSAgew0KLQl5eWJlZ2luKFNUX0pTUF9DT01NRU5UKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfQ09NTUVOVF9PUEVOLCBKU1BfQ09NTUVOVF9DTE9TRSk7DQotCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikNCi0JCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFlZSU5JVElBTCxTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTj4ge2pzcERpcmVjdGl2ZVN0YXJ0fSAgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKT09WVlJTklUSUFMKSB7DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJcbkpTUCBkaXJlY3RpdmUgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSk7DQotCQlyZXR1cm4gSlNQX0RJUkVDVElWRV9PUEVOOw0KLQl9DQotCWVsc2Ugew0KLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCQlkdW1wKCJKU1AgZGlyZWN0aXZlIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQkJeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX05BTUUpOw0KLQkJYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRElSRUNUSVZFX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRElSRUNUSVZFX0NMT1NFLCBKU1BfQ0xPU0V9KTsNCi0JCWlmKHl5c3RhdGUoKSA9PSBTVF9CTE9DS19UQUdfSU5URVJOQUxfU0NBTikgew0KLQkJCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQkJCXJldHVybiBCTE9DS19URVhUOw0KLQkJfQ0KLQkJcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotCX0NCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRT4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJKU1AgZGlyZWN0aXZlIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0U+IHtTfT8gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUpOw0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FLCBTVF9KU1BfRElSRUNUSVZFX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIG5hbWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfSlNQX0RJUkVDVElWRV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfSlNQX0RJUkVDVElWRV9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX1ZBTFVFPiB7QXR0VmFsdWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotPFNUX0pTUF9ESVJFQ1RJVkVfTkFNRSwgU1RfSlNQX0RJUkVDVElWRV9OQU1FX1dISVRFU1BBQ0UsIFNUX0pTUF9ESVJFQ1RJVkVfQVRUUklCVVRFX05BTUUsIFNUX0pTUF9ESVJFQ1RJVkVfRVFVQUxTLCBTVF9KU1BfRElSRUNUSVZFX0FUVFJJQlVURV9WQUxVRT4ge2pzcFNjcmlwdGxldEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkpTUCBlbmQiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gSlNQX0RJUkVDVElWRV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge2pzcENvbW1lbnRTdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfSlNQX0NPTU1FTlQpOw0KLQlyZXR1cm4gSlNQX0NPTU1FTlRfT1BFTjsNCi19DQotDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfRFFVT1RFRD4gXHgyNFx4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfRFFVT1RFRF9FTCk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBkb3VibGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX0RRVU9URUQ+IFx4MjNceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX0RRVU9URURfVkJMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9EUVVPVEV9KTsNCi0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgZG91YmxlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX0RRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUVfU1FVT1RFRD4gXHgyNFx4N2Igew0KLQlpbnQgZW50ZXJTdGF0ZSA9IHl5c3RhdGUoKTsNCi0JeXliZWdpbihTVF9KU1BfU1FVT1RFRF9FTCk7DQotCWFzc2VtYmxlRW1iZWRkZWRDb250YWluZXIoSlNQX0VMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfRUxfQ0xPU0UsIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URX0pOw0KLQkvLyBhYm9ydCBlYXJseSB3aGVuIGFuIHVuZXNjYXBlZCBzaW5nbGUgcXVvdGUgaXMgZm91bmQgaW4gdGhlIEVMDQotCWlmKGZFbWJlZGRlZENvbnRhaW5lci5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpLmVxdWFscyhYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEUpKSB7DQotCQl5eWJlZ2luKFNUX0FCT1JUX0VNQkVEREVEKTsNCi0JCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JfQ0KLQllbHNlIHsNCi0JCXl5YmVnaW4oZW50ZXJTdGF0ZSk7DQotCX0NCi0JcmV0dXJuIFBST1hZX0NPTlRFWFQ7DQotfQ0KLTxTVF9YTUxfQVRUUklCVVRFX1ZBTFVFX1NRVU9URUQ+IFx4MjNceDdiIHsNCi0JaW50IGVudGVyU3RhdGUgPSB5eXN0YXRlKCk7DQotCXl5YmVnaW4oU1RfSlNQX1NRVU9URURfVkJMKTsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfVkJMX09QRU4sIG5ldyBTdHJpbmdbXXtKU1BfVkJMX0NMT1NFLCBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEV9KTsNCi0JLy8gYWJvcnQgZWFybHkgd2hlbiBhbiB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlIGlzIGZvdW5kIGluIHRoZSBWQkwNCi0JaWYoZkVtYmVkZGVkQ29udGFpbmVyLmdldExhc3RSZWdpb24oKS5nZXRUeXBlKCkuZXF1YWxzKFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFX1NRVU9URSkpIHsNCi0JCXl5YmVnaW4oU1RfQUJPUlRfRU1CRURERUQpOw0KLQkJZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0FUVFJJQlVURV9OQU1FOw0KLQl9DQotCWVsc2Ugew0KLQkJeXliZWdpbihlbnRlclN0YXRlKTsNCi0JfQ0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotDQotLy8gdW5lc2NhcGVkIGRvdWJsZSBxdW90ZSwgcmV0dXJuIGFzIGVuZGluZyByZWdpb24NCi08U1RfSlNQX0RRVU9URURfRUwsU1RfSlNQX0RRVU9URURfVkJMPiBbIl0gew0KLQlyZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUVfRFFVT1RFOw0KLX0NCi0vLyB1bmVzY2FwZWQgc2luZ2xlIHF1b3RlLCByZXR1cm4gYXMgZW5kaW5nIHJlZ2lvbg0KLTxTVF9KU1BfU1FVT1RFRF9FTCxTVF9KU1BfU1FVT1RFRF9WQkw+IFsnXSB7DQotCXJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRV9TUVVPVEU7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIGRvdWJsZSBxdW90ZXMNCi08U1RfSlNQX0RRVU9URURfRUw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBFTA0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTD4gXFxcIiB7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX0VMPiBcXFwnIChbXlxcXXxcXFteJ31dKykqIFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgRUwNCi08U1RfSlNQX1NRVU9URURfRUw+IChbXlxcfSddfFxcW14nXSkrIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1NRVU9URURfRUw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX0VMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRFFVT1RFRF9FTCxTVF9KU1BfU1FVT1RFRF9FTD4gfSB7DQotCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotfQ0KLQ0KLQ0KLS8vIHBhaXJlZCBlc2NhcGVkIHF1b3Rlcw0KLTxTVF9KU1BfRFFVT1RFRF9WQkw+IFxcXCIgKFteXFxdfFxcW14ifV0rKSogXFxcIiB7DQotCXJldHVybiBKU1BfVkJMX1FVT1RFRF9DT05URU5UOw0KLX0NCi0vLyBldmVyeXRoaW5nIGVsc2UgVkJMDQotPFNUX0pTUF9EUVVPVEVEX1ZCTD4gKFteXFx9Il18XFxbXiJdKSsgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX0RRVU9URURfVkJMPiBcXFwiIHsNCi0JcmV0dXJuIEpTUF9WQkxfQ09OVEVOVDsNCi19DQotLy8gcGFpcmVkIGVzY2FwZWQgcXVvdGVzDQotPFNUX0pTUF9TUVVPVEVEX1ZCTD4gXFxcJyAoW15cXF18XFxbXid9XSspKiBcXFwnIHsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLS8vIGV2ZXJ5dGhpbmcgZWxzZSBWQkwNCi08U1RfSlNQX1NRVU9URURfVkJMPiAoW15cXH0nXXxcXFteJ10pKyB7DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfU1FVT1RFRF9WQkw+IFxcXCcgew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0NCi08U1RfSlNQX0RRVU9URURfVkJMLFNUX0pTUF9TUVVPVEVEX1ZCTD4gfSB7DQotCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLX0NCi0NCi0NCi0vLyBYTUwgY29udGVudCBhcmVhIEVMDQotPFlZSU5JVElBTD4gXHgyNFx4N2JbXlx4N2RdKi9ceDdkIHsNCi0JeXliZWdpbihTVF9KU1BfRUwpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtIDIpOw0KLQlmRUxsZXZlbCsrOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JYXNzZW1ibGVFbWJlZGRlZENvbnRhaW5lcihKU1BfRUxfT1BFTiwgSlNQX0VMX0NMT1NFKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9DT05URU5UOw0KLQl5eWJlZ2luKFlZSU5JVElBTCk7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi08U1RfSlNQX0VMPiBceDI0XHg3YiB7DQotCWZFTGxldmVsKys7DQotCWlmKGZFTGxldmVsID09IDEpIHsNCi0JCXJldHVybiBKU1BfRUxfT1BFTjsNCi0JfQ0KLX0NCi0vLyBYTUwgY29udGVudCBhcmVhIFZCTA0KLTxZWUlOSVRJQUw+IFx4MjNceDdiW15ceDdkXSovXHg3ZCB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTCk7DQotCWlmKHl5bGVuZ3RoKCkgPiAyKQ0KLQkJeXlwdXNoYmFjayh5eWxlbmd0aCgpIC0gMik7DQotCWZFTGxldmVsKys7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgSlNQX1ZCTF9DTE9TRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfQ09OVEVOVDsNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotPFNUX0pTUF9WQkw+IFx4MjNceDdiIHsNCi0JZkVMbGV2ZWwrKzsNCi0JaWYoZkVMbGV2ZWwgPT0gMSkgew0KLQkJcmV0dXJuIEpTUF9WQkxfT1BFTjsNCi0JfQ0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIFZCTCBhcyBjb250ZW50DQotPFNUX0pTUF9WQkw+IFteXHg3ZFx4MjJceDI3XSogew0KLQlyZXR1cm4gSlNQX1ZCTF9DT05URU5UOw0KLX0NCi0vLyByZXR1cm4gYW55dGhpbmcgbm90IHN0YXJ0aW5nIHF1b3RlcyBvciBlbmRpbmcgdGhlIEVMIGFzIGNvbnRlbnQNCi08U1RfSlNQX0VMPiBbXlx4N2RceDIyXHgyN10qIHsNCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi0NCi0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX0VMPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfRUxfRFFVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMX0RRVU9URVM+IFteXHgyMl0rL1x4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9EUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfRFFVT1RFU19FTkQ+IFx4MjIgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX0VMPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfRUxfU1FVT1RFUyk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX0VMX1NRVU9URVM+IFteXHgyN10rL1x4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTF9TUVVPVEVTX0VORCk7DQotCXJldHVybiBKU1BfRUxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfRUxfU1FVT1RFU19FTkQ+IFx4Mjcgew0KLQl5eWJlZ2luKFNUX0pTUF9FTCk7DQotCXJldHVybiBKU1BfRUxfU1FVT1RFOw0KLX0NCi0vLyBxdW90ZXMNCi08U1RfSlNQX1ZCTD4gXHgyMiB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9EUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9EUVVPVEVTPiBbXlx4MjJdKy9ceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX0RRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX0RRVU9URVNfRU5EPiBceDIyIHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfRFFVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTD4gXHgyNyB7DQotCXl5YmVnaW4oU1RfSlNQX1ZCTF9TUVVPVEVTKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi08U1RfSlNQX1ZCTF9TUVVPVEVTPiBbXlx4MjddKy9ceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMX1NRVU9URVNfRU5EKTsNCi0JcmV0dXJuIEpTUF9WQkxfUVVPVEVEX0NPTlRFTlQ7DQotfQ0KLTxTVF9KU1BfVkJMX1NRVU9URVNfRU5EPiBceDI3IHsNCi0JeXliZWdpbihTVF9KU1BfVkJMKTsNCi0JcmV0dXJuIEpTUF9WQkxfU1FVT1RFOw0KLX0NCi0NCi0vLyB1bnF1b3RlZCBjb250ZW50DQotPFNUX0pTUF9FTD4gKFtefVx4MjdceDIyXHgyNF18XHgyNFteXHg3Ylx4MjdceDIyXSkrIHsNCi0JLy9TeXN0ZW0ub3V0LnByaW50bG4oSlNQX0VMX0NPTlRFTlQrICI6WyIgKyB5eXRleHQoKSArICJdIik7DQotCXJldHVybiBKU1BfRUxfQ09OVEVOVDsNCi19DQotPFNUX0pTUF9FTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfRUxfQ0xPU0U7DQotCX0NCi0JcmV0dXJuIEpTUF9FTF9DT05URU5UOw0KLX0NCi08U1RfSlNQX1ZCTD4gfSB7DQotCWZFTGxldmVsLS07DQotCWlmKGZFTGxldmVsID09IDApIHsNCi0JCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JCXJldHVybiBKU1BfVkJMX0NMT1NFOw0KLQl9DQotCXJldHVybiBKU1BfVkJMX0NPTlRFTlQ7DQotfQ0KLS8vIEVMIHVucXVvdGVkIGluIHRhZyAoc2VjdGlvbiAyLjEgZGVjbGFyZXMgaXQgYXMgdmFsaWQgaW4gdGVtcGxhdGUgdGV4dCAoWE1MX0NPTlRFTlQpIG9yIGF0dHJpYnV0ZSB2YWx1ZXMNCi08U1RfWE1MX0FUVFJJQlVURV9WQUxVRT4gXHgyNFx4N2JbXlx4N2RdKy9ceDdkIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oImJlZ2luIGVtYmVkZGVkIHJlZ2lvbjogIiArIGZFbWJlZGRlZEhpbnQpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQlpZih5eWxlbmd0aCgpID4gMikNCi0JCXl5cHVzaGJhY2soeXlsZW5ndGgoKSAtMik7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiRUwgaW4gYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9KU1BfRUwpOw0KLQlmRUxsZXZlbCsrOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9FTF9PUEVOLCBuZXcgU3RyaW5nW117SlNQX0VMX0NMT1NFfSk7DQotCWZTdGF0ZVN0YWNrLnBvcCgpOw0KLQl5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLQlyZXR1cm4gUFJPWFlfQ09OVEVYVDsNCi19DQotLy8gVkJMIHVucXVvdGVkIGluIHRhZyBvciBhdHRyaWJ1dGUgdmFsdWVzDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IFx4MjNceDdiW15ceDdkXSsvXHg3ZCB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJU3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBlbWJlZGRlZCByZWdpb246ICIgKyBmRW1iZWRkZWRIaW50KTsvLyROT04tTkxTLTEkDQotCX0NCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsNCi0JaWYoeXlsZW5ndGgoKSA+IDIpDQotCQl5eXB1c2hiYWNrKHl5bGVuZ3RoKCkgLTIpOw0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlZCTCBpbiBhdHRyIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX0pTUF9WQkwpOw0KLQlmRUxsZXZlbCsrOw0KLQlhc3NlbWJsZUVtYmVkZGVkQ29udGFpbmVyKEpTUF9WQkxfT1BFTiwgbmV3IFN0cmluZ1tde0pTUF9WQkxfQ0xPU0V9KTsNCi0JZlN0YXRlU3RhY2sucG9wKCk7DQotCXl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotCXJldHVybiBQUk9YWV9DT05URVhUOw0KLX0NCi0NCi08U1RfSlNQX0NPTU1FTlQ+IC58XHJ8XG4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgdGV4dCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIHNjYW5KU1BDb21tZW50VGV4dCgpOw0KLX0NCi08U1RfSlNQX0NPTU1FTlRfRU5EPiB7anNwQ29tbWVudEVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuSlNQIGNvbW1lbnQgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JcmV0dXJuIEpTUF9DT01NRU5UX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgbWlzYw0KLQ0KLXtDRFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47DQotfQ0KLTxTVF9DREFUQV9URVhUPiAufFxyfFxuIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9DREFUQV9URVhUOw0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NEQVRBX1RFWFQ7DQotCVN0cmluZyByZXR1cm5lZENvbnRleHQgPSBkb1NjYW4oIl1dPiIsIGZhbHNlLCB0cnVlLCB0cnVlLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5ELCAgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkDQotCWlmKHJldHVybmVkQ29udGV4dCA9PSBYTUxfQ0RBVEFfVEVYVCkNCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsNCi0JcmV0dXJuIHJldHVybmVkQ29udGV4dDsNCi19DQotPFNUX0NEQVRBX0VORD4ge0NERW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0RBVEEgZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsNCi19DQotDQotPFlZSU5JVElBTD4ge1BFUmVmZXJlbmNlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtDaGFyUmVmfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NIQVJfUkVGRVJFTkNFOw0KLX0NCi08WVlJTklUSUFMPiB7RW50aXR5UmVmfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5FbnRpdHlSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsNCi19DQotDQotPFlZSU5JVElBTD4ge1BJc3RhcnR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gc3RhcnQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfUEkpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOw0KLX0NCi0vLyB0aGUgbmV4dCB0aHJlZSBhcmUgb3JkZXIgZGVwZW5kZW50DQotPFNUX1BJPiAoKFh8eCkoTXxtKShMfGwpKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4gKFtpSV1bbU1dW3BQXVtvT11bclJdW3RUXSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gU1RfWE1MX0VRVUFMUzsNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0NPTlRFTlQ7DQotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QSV9XUz4ge1N9KyB7DQotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOw0KLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi08U1RfUEksIFNUX1BJX1dTPiBcPz4gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotPFNUX1BJX0NPTlRFTlQ+IC4gew0KLQkJLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZA0KLQlyZXR1cm4gZG9TY2FuKCI/PiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsNCi19DQotPFNUX1BJX0NPTlRFTlQsU1RfWE1MX1BJX1RBR19DTE9TRT4gXD8+IHsNCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUNCi0JCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi0NCi08U1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfUElfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfWE1MX1BJX0VRVUFMUz4ge0VxfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9BVFRSSUJVVEVfTkFNRTsNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFNUX1hNTF9FUVVBTFM7DQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIHRoZSBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9YTUxfUElfRVFVQUxTLCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtQSWVuZH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLS8vIERIVE1MDQotPFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9FUVVBTFM+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfRVFVQUxTKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLX0NCi08U1RfREhUTUxfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfQVRUUklCVVRFX05BTUU7DQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRT4ge0F0dFZhbHVlfSB8IChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBTVF9YTUxfRVFVQUxTOw0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIFRoZSBESFRNTCBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9ESFRNTF9FUVVBTFMsIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IFsvXSo+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBkZWNsYXJhdGlvbnMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSEgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRWVdW0xsXVtFZV1bTW1dW0VlXVtObl1bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRGRdW09vXVtDY11bVHRdW1l5XVtQcF1bRWVdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbQWFdW1R0XVtUdF1bTGxdW0lpXVtTc11bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOw0KLX0NCi0NCi0vLyBiZWdpbiBET0NUWVBFIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0U+IFxbW15cXV0qXF0gew0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOw0KLX0NCi0NCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1BwXVtVdV1bQmJdW0xsXVtJaV1bQ2NdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1NzXVtZeV1bU3NdW1R0XVtFZV1bTW1dIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUM+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQNCi0JZkVtYmVkZGVkSGludCA9IFVOREVGSU5FRDsNCi0JZkVtYmVkZGVkUG9zdFN0YXRlID0gWVlJTklUSUFMOw0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0+IHtBdHRWYWx1ZX18e1N5c3RlbUxpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UpOw0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOw0KLX0NCi0vLyBlbmQgRE9DVFlQRSBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEVMRU1FTlQgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQlmRW1iZWRkZWRIaW50ID0gVU5ERUZJTkVEOw0KLQlmRW1iZWRkZWRQb3N0U3RhdGUgPSBZWUlOSVRJQUw7DQotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgRUxFTUVOVCBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEFUVExJU1QgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IG5hbWUiKTsvLyROT04tTkxTLTEkDQotCWZFbWJlZGRlZEhpbnQgPSBVTkRFRklORUQ7DQotCWZFbWJlZGRlZFBvc3RTdGF0ZSA9IFlZSU5JVElBTDsNCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsNCi19DQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQ+IFtePl0qIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOw0KLX0NCi0NCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgQVRUTElTVCBoYW5kbGluZw0KLQ0KLTxTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCwgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT04sIFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UsIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4ge2dlbmVyaWNUYWdDbG9zZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBERUNMQVJBVElPTiBoYW5kbGluZw0KLQ0KLTxZWUlOSVRJQUw+IChbXjwmJVx4MjRceDIzXSp8XHgyMyt8XHgyNCt8WyYlXXtTfSt7TmFtZX1bXiYlPF0qfFtceDI0XHgyM11bXlx4N2I8JiVdfFsmJV17TmFtZX0oW147JiU8XSp8e1N9KzsqKSkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuWE1MIGNvbnRlbnQiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ09OVEVOVDsNCi19DQotDQotDQotPFNUX0JMT0NLX1RBR19TQ0FOPiAufFxyfFxuIHsNCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOw0KLQl9DQotDQotLiB7DQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBVTkRFRklORUQ7DQotfQ0KLQ0KLVwwNDAgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlNQQUNFIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTEgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIjB4OSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDE1IA0KLXsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDQVJSSUFHRSBSRVRVUk4iKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxMiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiTElORSBGRUVEIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDUzN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODgxICswLDAgQEAKLS8qIFRoZSBmb2xsb3dpbmcgY29kZSB3YXMgZ2VuZXJhdGVkIGJ5IEpGbGV4IDEuMi4yIG9uIDgvMTYvMDUgMzowNyBQTSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkNoYXJBcnJheVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnMuWE1MUGFyc2VyUmVnaW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IAotICogPGEgaHJlZj0iaHR0cDovL3d3dy5pbmZvcm1hdGlrLnR1LW11ZW5jaGVuLmRlL35rbGVpbmcvamZsZXgvIj5KRmxleDwvYT4gMS4yLjIKLSAqIG9uIDgvMTYvMDUgMzowNyBQTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5maWxlOi9EOi9lY2xpcHNlLnd0cC93b3Jrc3BhY2Uvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvWE1MVG9rZW5pemVyLmpmbGV4PC90dD4KLSAqLwotcHVibGljIGNsYXNzIFhNTFRva2VuaXplciBpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01SZWdpb25Db250ZXh0IHsKLQotICAvKiogdGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQgPSAyMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSA9IDEyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfVEFHX0NMT1NFID0gMTE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSA9IDIxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFID0gMTA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0VRVUFMUyA9IDEzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfVEFHX05BTUUgPSAxNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSA9IDE5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUgPSAxNDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNID0gMjU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDE3OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9IDI2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9IDIyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiA9IDI4OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQ09NTUVOVF9FTkQgPSA0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9URVhUID0gMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfVEFHX0NMT1NFID0gMTU7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UID0gMzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfQ09OVEVOVCA9IDc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJX1dTID0gNjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfQ0RBVEFfRU5EID0gMjsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCA9IDI5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9CTE9DS19UQUdfU0NBTiA9IDMwOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfRVFVQUxTID0gOTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OID0gMjA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFlZSU5JVElBTCA9IDA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyA9IDI0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRVFVQUxTID0gMTg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1BJID0gNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FID0gODsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5Y21hcF9wYWNrZWQgPSAKLSAgICAiXDExXDBcMVw1XDFcMjJcMlwwXDFcMTRcMjJcMFwxXDE0XDFcMjFcMVwxMVwxXDUxIisKLSAgICAiXDFcMTZcMVwxN1wxXDEyXDFcMTNcMVwxNlwxXDE2XDFcMTZcMVwxNlwxXDE2XDFcNyIrCi0gICAgIlwxXDZcMVwzXDEyXDE1XDFcMTBcMVw1NFwxXDFcMVw0M1wxXDJcMVw0XDFcMTYiKwotICAgICJcMVwzMlwxXDU1XDFcMzBcMVwzMVwxXDM1XDFcNTJcMVwzNFwxXDM0XDFcNDBcMVwzNCIrCi0gICAgIlwxXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDMzIisKLSAgICAiXDFcNTNcMlwzNFwxXDIzXDFcNDRcMVwzNFwxXDI3XDFcMFwxXDIwXDFcMFwxXDEwIisKLSAgICAiXDFcMFwxXDQ3XDFcNTVcMVw1NlwxXDUwXDFcMzVcMVw1MlwxXDM0XDFcMzRcMVw0MCIrCi0gICAgIlwyXDM0XDFcMjZcMVwyNVwxXDQyXDFcNDFcMVw0NVwxXDM0XDFcMzZcMVwzN1wxXDQ2IisKLSAgICAiXDFcNTNcMVwzNFwxXDM0XDFcMjRcMVw0NFwxXDM0XDFcMFwxXDBcNzJcMFwxXDYwIisKLSAgICAiXDEwXDBcMjdcNTdcMVwwXDM3XDU3XDFcMFw3Mlw1N1wyXDBcMTNcNTdcMlwwXDEwXDU3IisKLSAgICAiXDFcMFw2NVw1N1wxXDBcMTA0XDU3XDExXDBcNDRcNTdcM1wwXDJcNTdcNFwwXDM2XDU3IisKLSAgICAiXDcwXDBcMTMxXDU3XDIyXDBcN1w1N1wxNlwwXDJcNjBcNTZcMFwxMDZcNjBcMzJcMFwyXDYwIisKLSAgICAiXDQ0XDBcMVw1N1wxXDYwXDNcNTdcMVwwXDFcNTdcMVwwXDI0XDU3XDFcMFw1NFw1NyIrCi0gICAgIlwxXDBcN1w1N1wzXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1NyIrCi0gICAgIlwxXDBcMjJcNTdcMTVcMFwxNFw1N1wxXDBcMTAyXDU3XDFcMFwxNFw1N1wxXDBcNDRcNTciKwotICAgICJcMVwwXDRcNjBcMTFcMFw2NVw1N1wyXDBcMlw1N1wyXDBcMlw1N1wzXDBcMzRcNTciKwotICAgICJcMlwwXDEwXDU3XDJcMFwyXDU3XDY3XDBcNDZcNTdcMlwwXDFcNTdcN1wwXDQ2XDU3IisKLSAgICAiXDEyXDBcMjFcNjBcMVwwXDI3XDYwXDFcMFwzXDYwXDFcMFwxXDYwXDFcMFwyXDYwIisKLSAgICAiXDFcMFwxXDYwXDEzXDBcMzNcNTdcNVwwXDNcNTdcNTZcMFwzMlw1N1w1XDBcMVw2MCIrCi0gICAgIlwxMlw1N1wxMFw2MFwxNVwwXDEyXDYwXDZcMFwxXDYwXDEwN1w1N1wyXDBcNVw1N1wxXDAiKwotICAgICJcMTdcNTdcMVwwXDRcNTdcMVwwXDFcNTdcMTdcNjBcMlw1N1wyXDYwXDFcMFw0XDYwIisKLSAgICAiXDJcMFwxMlw2MFx1MDIwN1wwXDNcNjBcMVwwXDY1XDU3XDJcMFwxXDYwXDFcNTdcMjBcNjAiKwotICAgICJcM1wwXDRcNjBcM1wwXDEyXDU3XDJcNjBcMlwwXDEyXDYwXDIxXDBcM1w2MFwxXDAiKwotICAgICJcMTBcNTdcMlwwXDJcNTdcMlwwXDI2XDU3XDFcMFw3XDU3XDFcMFwxXDU3XDNcMCIrCi0gICAgIlw0XDU3XDJcMFwxXDYwXDFcMFw3XDYwXDJcMFwyXDYwXDJcMFwzXDYwXDExXDAiKwotICAgICJcMVw2MFw0XDBcMlw1N1wxXDBcM1w1N1wyXDYwXDJcMFwxMlw2MFwyXDU3XDIwXDAiKwotICAgICJcMVw2MFwyXDBcNlw1N1w0XDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDJcNTdcMVwwXDJcNTdcMlwwXDFcNjBcMVwwXDVcNjBcNFwwIisKLSAgICAiXDJcNjBcMlwwXDNcNjBcMTNcMFw0XDU3XDFcMFwxXDU3XDdcMFwxMlw2MFwyXDYwIisKLSAgICAiXDNcNTdcMTRcMFwzXDYwXDFcMFw3XDU3XDFcMFwxXDU3XDFcMFwzXDU3XDFcMCIrCi0gICAgIlwyNlw1N1wxXDBcN1w1N1wxXDBcMlw1N1wxXDBcNVw1N1wyXDBcMVw2MFwxXDU3IisKLSAgICAiXDEwXDYwXDFcMFwzXDYwXDFcMFwzXDYwXDIyXDBcMVw1N1w1XDBcMTJcNjBcMjFcMCIrCi0gICAgIlwzXDYwXDFcMFwxMFw1N1wyXDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDJcNTdcMlwwXDRcNTdcMlwwXDFcNjBcMVw1N1w2XDYwXDNcMFwyXDYwXDJcMCIrCi0gICAgIlwzXDYwXDEwXDBcMlw2MFw0XDBcMlw1N1wxXDBcM1w1N1w0XDBcMTJcNjBcMjJcMCIrCi0gICAgIlwyXDYwXDFcMFw2XDU3XDNcMFwzXDU3XDFcMFw0XDU3XDNcMFwyXDU3XDFcMCIrCi0gICAgIlwxXDU3XDFcMFwyXDU3XDNcMFwyXDU3XDNcMFwzXDU3XDNcMFwxMFw1N1wxXDAiKwotICAgICJcM1w1N1w0XDBcNVw2MFwzXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTdcMCIrCi0gICAgIlwxMVw2MFwyMVwwXDNcNjBcMVwwXDEwXDU3XDFcMFwzXDU3XDFcMFwyN1w1N1wxXDAiKwotICAgICJcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwXDNcNjBcMVwwXDRcNjBcN1wwIisKLSAgICAiXDJcNjBcMTFcMFwyXDU3XDRcMFwxMlw2MFwyMlwwXDJcNjBcMVwwXDEwXDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcMFwyN1w1N1wxXDBcMTJcNTdcMVwwXDVcNTdcNFwwXDdcNjBcMVwwIisKLSAgICAiXDNcNjBcMVwwXDRcNjBcN1wwXDJcNjBcN1wwXDFcNTdcMVwwXDJcNTdcNFwwIisKLSAgICAiXDEyXDYwXDIyXDBcMlw2MFwxXDBcMTBcNTdcMVwwXDNcNTdcMVwwXDI3XDU3XDFcMCIrCi0gICAgIlwyMFw1N1w0XDBcNlw2MFwyXDBcM1w2MFwxXDBcNFw2MFwxMVwwXDFcNjBcMTBcMCIrCi0gICAgIlwyXDU3XDRcMFwxMlw2MFwyMjFcMFw1Nlw1N1wxXDBcMVw1N1wxXDYwXDJcNTdcN1w2MCIrCi0gICAgIlw1XDBcNlw1N1wxXDYwXDEwXDYwXDFcMFwxMlw2MFw0N1wwXDJcNTdcMVwwXDFcNTciKwotICAgICJcMlwwXDJcNTdcMVwwXDFcNTdcMlwwXDFcNTdcNlwwXDRcNTdcMVwwXDdcNTciKwotICAgICJcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDFcNTdcMlwwXDJcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDFcNTdcMVw2MFwyXDU3XDZcNjBcMVwwXDJcNjBcMVw1N1wyXDBcNVw1NyIrCi0gICAgIlwxXDBcMVw2MFwxXDBcNlw2MFwyXDBcMTJcNjBcNzZcMFwyXDYwXDZcMFwxMlw2MCIrCi0gICAgIlwxM1wwXDFcNjBcMVwwXDFcNjBcMVwwXDFcNjBcNFwwXDJcNjBcMTBcNTdcMVwwIisKLSAgICAiXDQxXDU3XDdcMFwyNFw2MFwxXDBcNlw2MFw0XDBcNlw2MFwxXDBcMVw2MFwxXDAiKwotICAgICJcMjVcNjBcM1wwXDdcNjBcMVwwXDFcNjBcMzQ2XDBcNDZcNTdcMTJcMFw0N1w1N1wxMVwwIisKLSAgICAiXDFcNTdcMVwwXDJcNTdcMVwwXDNcNTdcMVwwXDFcNTdcMVwwXDJcNTdcMVwwIisKLSAgICAiXDVcNTdcNTFcMFwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3XDEzXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDBcMVw1N1w1XDBcM1w1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wxXDBcMVw1N1wzXDBcMlw1N1wzXDAiKwotICAgICJcMlw1N1wxXDBcMVw1N1w1MFwwXDFcNTdcMTFcMFwxXDU3XDJcMFwxXDU3XDJcMCIrCi0gICAgIlwyXDU3XDdcMFwyXDU3XDFcMFwxXDU3XDFcMFw3XDU3XDUwXDBcMVw1N1w0XDAiKwotICAgICJcMVw1N1wxMFwwXDFcNTdcdTBjMDZcMFwyMzRcNTdcNFwwXDEzMlw1N1w2XDBcMjZcNTdcMlwwIisKLSAgICAiXDZcNTdcMlwwXDQ2XDU3XDJcMFw2XDU3XDJcMFwxMFw1N1wxXDBcMVw1N1wxXDAiKwotICAgICJcMVw1N1wxXDBcMVw1N1wxXDBcMzdcNTdcMlwwXDY1XDU3XDFcMFw3XDU3XDFcMCIrCi0gICAgIlwxXDU3XDNcMFwzXDU3XDFcMFw3XDU3XDNcMFw0XDU3XDJcMFw2XDU3XDRcMCIrCi0gICAgIlwxNVw1N1w1XDBcM1w1N1wxXDBcN1w1N1wzMjNcMFwxNVw2MFw0XDBcMVw2MFwxMDRcMCIrCi0gICAgIlwxXDU3XDNcMFwyXDU3XDJcMFwxXDU3XDEyMVwwXDNcNTdcdTBlODJcMFwxXDYwXDFcMCIrCi0gICAgIlwxXDU3XDMxXDBcMTFcNTdcNlw2MFwxXDBcNVw2MFwxM1wwXDEyNFw1N1w0XDBcMlw2MCIrCi0gICAgIlwyXDBcMlw2MFwyXDBcMTMyXDU3XDFcMFwzXDYwXDZcMFw1MFw1N1x1MWNkM1wwXHU1MWE2XDU3IisKLSAgICAiXHUwYzVhXDBcdTJiYTRcNTdcMTM0XDBcdTA4MDBcMFx1MWZmZVwwXDJcMCI7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGNoYXIgW10geXljbWFwID0geXlfdW5wYWNrX2NtYXAoeXljbWFwX3BhY2tlZCk7Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGEgc3RhdGUgdG8gYSByb3cgaW5kZXggaW4gdGhlIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eV9yb3dNYXAgW10gPSB7IAotICAgICAgICAwLCAgICA0OSwgICAgOTgsICAgMTQ3LCAgIDE5NiwgICAyNDUsICAgMjk0LCAgIDM0MywgICAzOTIsICAgNDQxLCAKLSAgICAgIDQ5MCwgICA1MzksICAgNTg4LCAgIDYzNywgICA2ODYsICAgNzM1LCAgIDc4NCwgICA4MzMsICAgODgyLCAgIDkzMSwgCi0gICAgICA5ODAsICAxMDI5LCAgMTA3OCwgIDExMjcsICAxMTc2LCAgMTIyNSwgIDEyNzQsICAxMzIzLCAgMTM3MiwgIDE0MjEsIAotICAgICAxNDcwLCAgMTUxOSwgIDE1NjgsICAxNjE3LCAgMTY2NiwgIDE3MTUsICAxNzY0LCAgMTcxNSwgIDE3NjQsICAxODEzLCAKLSAgICAgMTcxNSwgIDE3MTUsICAxNzY0LCAgMTg2MiwgIDE5MTEsICAxOTYwLCAgMjAwOSwgIDIwNTgsICAyMTA3LCAgMjE1NiwgCi0gICAgIDE3MTUsICAxNzY0LCAgMjIwNSwgIDIyNTQsICAyMzAzLCAgMTcxNSwgIDIzNTIsICAyMzUyLCAgMjQwMSwgIDI0NTAsIAotICAgICAyNDk5LCAgMjIwNSwgIDE3MTUsICAyNTQ4LCAgMjU5NywgIDE3MTUsICAyNjQ2LCAgMjY5NSwgIDI3NDQsICAyNzkzLCAKLSAgICAgMjg0MiwgIDI4OTEsICAxNzE1LCAgMjk0MCwgIDI5ODksICAzMDM4LCAgMzA4NywgIDE3MTUsICAzMTM2LCAgMzE4NSwgCi0gICAgIDMyMzQsICAzMjgzLCAgMzMzMiwgIDE3MTUsICAzMzgxLCAgMzQzMCwgIDM0NzksICAzNTI4LCAgMzU3NywgIDM2MjYsIAotICAgICAzNjc1LCAgMzcyNCwgIDM3MjQsICAzNzczLCAgMzgyMiwgIDM4NzEsICAzOTIwLCAgMzkyMCwgIDM5NjksICA0MDE4LCAKLSAgICAgNDA2NywgIDQxMTYsICA0MTE2LCAgNDE2NSwgIDQyMTQsICA0MjYzLCAgNDMxMiwgIDE3MTUsICA0MzYxLCAgNDM2MSwgCi0gICAgIDQ0MTAsICA0NDU5LCAgNDUwOCwgIDQ1NTcsICAxNzE1LCAgMTcxNSwgIDE3NjQsICAxNzE1LCAgMTcxNSwgIDQ2MDYsIAotICAgICA0NjU1LCAgNDcwNCwgIDQ3NTMsICA0ODAyLCAgNDg1MSwgIDQ5MDAsICA0OTQ5LCAgMTcxNSwgIDQ5OTgsICA1MDQ3LCAKLSAgICAgMTcxNSwgIDE3MTUsICAyMzUyLCAgNTA5NiwgIDI0NTAsICAxNzE1LCAgNTE0NSwgIDI0OTksICAyNTQ4LCAgMjY0NiwgCi0gICAgIDI2OTUsICA1MTk0LCAgMjc0NCwgIDE3MTUsICA1MjQzLCAgMjc5MywgIDE3MTUsICAzMTM2LCAgNTI5MiwgIDMyMzQsIAotICAgICAxNzE1LCAgNTM0MSwgIDMyODMsICA0NjA2LCAgNTM5MCwgIDU0MzksICA1NDg4LCAgMzUyOCwgIDE3MTUsICA1NTM3LCAKLSAgICAgNTU4NiwgIDM3MjQsICA1NjM1LCAgMzc3MywgIDE3MTUsICA1Njg0LCAgNTczMywgIDU3ODIsICA1NzgyLCAgNTgzMSwgCi0gICAgIDU4ODAsICAzODcxLCAgMzcyNCwgIDM5MjAsICA1OTI5LCAgMzk2OSwgIDE3MTUsICA1OTc4LCAgNDAxOCwgIDQwNjcsIAotICAgICAzOTIwLCAgNDExNiwgIDYwMjcsICA0MTY1LCAgMTcxNSwgIDYwNzYsICA2MTI1LCAgNjE3NCwgIDYxNzQsICA2MjIzLCAKLSAgICAgNjI3MiwgIDYzMjEsICA0MzYxLCAgNjM3MCwgIDQ0MTAsICAxNzE1LCAgNjQxOSwgIDY0NjgsICA2NTE3LCAgNjUxNywgCi0gICAgIDY1NjYsICA2NjE1LCAgNjY2NCwgIDY3MTMsICA2NzYyLCAgNjgxMSwgIDY4NjAsICAxNzE1LCAgNjkwOSwgIDY5NTgsIAotICAgICAxNzE1LCAgMTcxNSwgIDE3MTUsICAyMDA5LCAgNzAwNywgIDcwNTYsICA3MTA1LCAgNzE1NCwgIDcyMDMsICA3MjUyLCAKLSAgICAgNTY4NCwgIDczMDEsICA3MzAxLCAgNjA3NiwgIDczNTAsICA3MzUwLCAgNzM5OSwgIDY0MTksICA3NDQ4LCAgNzQ0OCwgCi0gICAgIDc0OTcsICAxNzE1LCAgNzU0NiwgIDc1OTUsICAxNzE1LCAgNzY0NCwgIDc2OTMsICA3NzQyLCAgNzc5MSwgIDc4NDAsIAotICAgICA3ODg5LCAgNzkzOCwgIDU4MzEsICA2MjIzLCAgNzk4NywgIDY1NjYsICA4MDM2LCAgODA4NSwgIDgxMzQsICA4MTgzLCAKLSAgICAgODIzMiwgIDgyODEsICA4MzMwLCAgODM3OSwgIDg0MjgsICA4NDc3LCAgODUyNiwgIDg1NzUsICA4NjI0LCAgODY3MywgCi0gICAgIDg3MjIsICAxNzE1LCAgMTcxNSwgIDg3NzEsICA4ODIwLCAgODg2OSwgIDg5MTgsICAxNzE1LCAgMTcxNSwgIDE3MTUsIAotICAgICA4OTY3LCAgOTAxNiwgIDkwNjUsICA5MTE0LCAgOTE2MywgIDE3MTUsICA0MjYzLCAgNDUwOAotICB9OwotCi0gIC8qKiAKLSAgICogVGhlIHBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIFN0cmluZyB5eV9wYWNrZWQgPSAKLSAgICAiXDFcNDBcMVw0MVwxMFw0MFwxXDQyXDRcNDBcMVw0M1w0MVw0MFwxXDQ0IisKLSAgICAiXDFcNDVcNTdcNDRcMVw0NlwxXDQ3XDE2XDQ2XDFcNTBcMVw0NlwxXDUxIisKLSAgICAiXDM2XDQ2XDFcNTJcMVw1M1w1N1w1MlwxXDQ2XDFcNDdcNVw0NlwxXDU0IisKLSAgICAiXDEyXDQ2XDFcNTFcMzdcNDZcMVw0N1wyXDQ2XDFcNTVcMVw1NlwyXDQ2IisKLSAgICAiXDFcNTdcM1w0NlwxXDU2XDVcNDZcMVw1NlwyXDYwXDJcNTdcMVw0NiIrCi0gICAgIlwxMFw1N1wxXDYxXDJcNTdcMVw0Nlw1XDU3XDFcNDZcMlw1N1wxXDQ2IisKLSAgICAiXDNcNTdcMlw0NlwxXDQ3XDJcNDZcMVw1NVwxXDYyXDZcNDZcMVw2MiIrCi0gICAgIlw1XDQ2XDFcNjJcMzZcNDZcMVw2M1wxXDY0XDJcNjNcMVw2NVwxNVw2MyIrCi0gICAgIlwxXDUxXDM2XDYzXDFcNDZcMVw0N1wyXDQ2XDFcNjZcMVw1NlwyXDQ2IisKLSAgICAiXDFcNjdcM1w0NlwxXDU2XDVcNDZcMVw1Nlw0XDY3XDFcNDZcMTNcNjciKwotICAgICJcMVw0Nlw1XDY3XDFcNDZcMlw2N1wxXDQ2XDNcNjdcMlw0NlwxXDQ3IisKLSAgICAiXDJcNDZcMVw2NlwxXDU2XDJcNDZcMVw2N1wzXDQ2XDFcNTZcNVw0NiIrCi0gICAgIlwxXDU2XDRcNjdcMVw0NlwxM1w2N1wxXDcwXDVcNjdcMVw0NlwyXDY3IisKLSAgICAiXDFcNDZcM1w2N1wxXDQ2XDFcNzFcMVw0N1wxXDQ2XDFcNzJcMVw3MyIrCi0gICAgIlwxXDU2XDNcNzFcMVw3NFwxXDcxXDFcNzVcMVw1Nlw1XDcxXDFcNTYiKwotICAgICJcMzZcNzFcMVw0NlwxXDQ3XDJcNDZcMVw3NlwxNVw0NlwxXDUxXDM3XDQ2IisKLSAgICAiXDFcNDdcMVw3N1wxXDEwMFwxXDQ2XDFcNTZcMlw0NlwxXDEwMVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTAxXDFcNDZcMTNcMTAxXDFcNDZcNVwxMDEiKwotICAgICJcMVw0NlwyXDEwMVwxXDQ2XDNcMTAxXDJcNDZcMVw0N1wxXDc3XDFcMTAwIisKLSAgICAiXDFcNDZcMVw1NlwyXDQ2XDFcMTAxXDNcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcNFwxMDFcMVw0NlwxM1wxMDFcMVwxMDJcNVwxMDFcMVw0NlwyXDEwMVwxXDQ2IisKLSAgICAiXDNcMTAxXDFcNDZcMVwxMDNcMVw0N1wxXDc3XDFcMTA0XDFcMTAzXDFcNTYiKwotICAgICJcM1wxMDNcMVwxMDVcMVwxMDNcMVwxMDZcMVw1Nlw1XDEwM1wxXDU2XDM2XDEwMyIrCi0gICAgIlwxXDQ2XDFcNDdcM1w0NlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTYiKwotICAgICJcMzZcNDZcMVwxMDdcMVwxMTBcMVwxMTFcMVwxMTJcNFwxMDdcMVwxMTNcMTJcMTA3IisKLSAgICAiXDRcMTE0XDFcMTA3XDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwNyIrCi0gICAgIlwzXDExNFwxXDEwN1wxXDQ2XDFcMTEwXDFcMTExXDFcMTEyXDFcNDZcMVw1NiIrCi0gICAgIlwyXDQ2XDFcMTE1XDNcNDZcMVw1Nlw1XDQ2XDFcNTZcNFwxMTVcMVw0NiIrCi0gICAgIlwxM1wxMTVcMVw0Nlw1XDExNVwxXDQ2XDJcMTE1XDFcNDZcM1wxMTVcMlw0NiIrCi0gICAgIlwxXDExMFwxXDExMVwxXDExMlwxXDQ2XDFcNTZcMlw0NlwxXDExNVwzXDQ2IisKLSAgICAiXDFcNTZcNVw0NlwxXDU2XDRcMTE1XDFcNDZcMTNcMTE1XDFcMTE2XDVcMTE1IisKLSAgICAiXDFcNDZcMlwxMTVcMVw0NlwzXDExNVwxXDQ2XDFcMTE3XDFcMTEwXDFcMTExIisKLSAgICAiXDFcMTIwXDFcMTE3XDFcNTZcM1wxMTdcMVwxMjFcMVwxMTdcMVwxMjJcMVw1NiIrCi0gICAgIlw1XDExN1wxXDU2XDM2XDExN1wxXDQ2XDFcMTIzXDFcMTI0XDJcNDZcMVw1NiIrCi0gICAgIlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDZcNDZcMVwxMjVcMVwxMjZcMlw0NiIrCi0gICAgIlwxXDEyN1wxMVw0NlwxXDEyNlwxXDEyNVwxMVw0NlwxXDQ3XDFcMTI0XDJcNDYiKwotICAgICJcMVw1Nlw2XDQ2XDFcNTZcNVw0NlwxXDU2XDRcNDZcMVwxMzBcMzJcNDYiKwotICAgICJcMVw0N1wxXDEyNFwyXDQ2XDFcNTZcMlw0NlwxXDEzMVwzXDQ2XDFcNTYiKwotICAgICJcNVw0NlwxXDU2XDRcMTMxXDFcMTMwXDEzXDEzMVwxXDQ2XDVcMTMxXDFcNDYiKwotICAgICJcMlwxMzFcMVw0NlwzXDEzMVwyXDQ2XDFcNDdcMVwxMjRcMlw0NlwxXDU2IisKLSAgICAiXDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNFw0NlwxXDEzMFw3XDQ2XDFcMTMyIisKLSAgICAiXDVcNDZcMVwxMzNcMTNcNDZcMVwxMzRcMVw0N1wxXDEyNFwxXDEzNVwxXDEzNCIrCi0gICAgIlwxXDU2XDNcMTM0XDFcMTM2XDFcMTM0XDFcMTM3XDFcNTZcNVwxMzRcMVw1NiIrCi0gICAgIlw0XDEzNFwxXDE0MFwzMVwxMzRcMVwxNDFcMVw0N1wxXDEyNFwxXDE0MlwxXDE0MSIrCi0gICAgIlwxXDU2XDNcMTQxXDFcMTQzXDFcMTQxXDFcMTQ0XDFcNTZcNVwxNDFcMVw1NiIrCi0gICAgIlw0XDE0MVwxXDE0NVwzMVwxNDFcMVwxNDZcMVw0N1wxXDEyNFwxXDE0N1wxXDE0NiIrCi0gICAgIlwxXDU2XDNcMTQ2XDFcMTUwXDFcMTQ2XDFcMTUxXDFcNTZcNVwxNDZcMVw1NiIrCi0gICAgIlwzNlwxNDZcMVwxNTJcMVwxNTNcMVwxNTRcNTZcMTUyXDFcMTU1XDFcNDdcMVwxMjQiKwotICAgICJcMVwxNTZcMVwxNTVcMVw1NlwzXDE1NVwxXDE1N1wxXDE1NVwxXDE2MFwxXDU2IisKLSAgICAiXDVcMTU1XDFcNTZcMzZcMTU1XDFcMTYxXDFcMTYyXDFcMTYzXDU2XDE2MVwxXDE2NCIrCi0gICAgIlwxXDE2NVw1N1wxNjRcMVw0MFwxXDBcMTBcNDBcMVwwXDRcNDBcMVwwIisKLSAgICAiXDQxXDQwXDNcMFwxXDE2NlwxXDE2N1wxNFwwXDFcMTcwXDQ0XDBcMVwxNzEiKwotICAgICJcMlwwXDFcMTcyXDNcMFwxXDE3MVw1XDBcMVwxNzFcNFwxNzJcMVwwIisKLSAgICAiXDEzXDE3MlwxXDBcNVwxNzJcMVwxNzNcMlwxNzJcMVwwXDNcMTcyXDZcMCIrCi0gICAgIlwxXDE3MVwyXDBcMVwxNzRcM1wwXDFcMTcxXDVcMFwxXDE3MVw0XDE3NCIrCi0gICAgIlwxXDBcMTNcMTc0XDFcMFw1XDE3NFwxXDBcMlwxNzRcMVwwXDNcMTc0IisKLSAgICAiXDEwM1wwXDFcMTc1XDU3XDBcMVwxNzZcNDdcMFwxXDE3N1w1M1wwXDFcMjAwIisKLSAgICAiXDYzXDBcMVw1Nlw2XDBcMVw1Nlw1XDBcMVw1Nlw0NFwwXDNcNTciKwotICAgICJcNFwwXDFcNTdcNVwwXDRcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAxXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3IisKLSAgICAiXDVcMFwyXDU3XDFcMjAyXDFcNTdcMVwwXDEzXDU3XDFcMFw1XDU3IisKLSAgICAiXDFcMFwyXDU3XDFcMFw0XDU3XDVcMFwxXDYyXDZcMFwxXDYyIisKLSAgICAiXDVcMFwxXDYyXDQwXDBcMVwyMDNcNjBcMFwxXDIwNFw2NFwwXDNcNjciKwotICAgICJcNFwwXDFcNjdcNVwwXDRcNjdcMVwwXDEzXDY3XDFcMFw1XDY3IisKLSAgICAiXDFcMFwyXDY3XDFcMFw0XDY3XDFcNzFcMlwwXDFcMjA1XDFcNzEiKwotICAgICJcMVwwXDNcNzFcMVwwXDFcNzFcMlwwXDVcNzFcMVwwXDM3XDcxIisKLSAgICAiXDFcMFwxXDIwNFwxXDIwNVwxXDcxXDFcMFwzXDcxXDFcMFwxXDcxIisKLSAgICAiXDJcMFw1XDcxXDFcMFwzNlw3MVwxXDc0XDFcMFwxXDIwNlwxXDIwNyIrCi0gICAgIlwxXDc0XDFcMjA2XDNcNzRcMVwyMTBcMVw3NFwyXDIwNlw1XDc0XDFcMjA2IisKLSAgICAiXDM2XDc0XDFcNzVcMVwwXDFcMjExXDFcMjEyXDFcNzVcMVwyMTFcM1w3NSIrCi0gICAgIlwxXDIxMVwxXDc1XDFcMjEwXDFcMjExXDVcNzVcMVwyMTFcMzZcNzVcMlwwIisKLSAgICAiXDFcNzdcMVwyMTNcNjNcMFwzXDEwMVw0XDBcMVwxMDFcNVwwXDRcMTAxIisKLSAgICAiXDFcMFwxM1wxMDFcMVwwXDVcMTAxXDFcMFwyXDEwMVwxXDBcNFwxMDEiKwotICAgICJcMVwxMDNcMlwwXDFcMjE0XDFcMTAzXDFcMFwzXDEwM1wxXDBcMVwxMDMiKwotICAgICJcMlwwXDVcMTAzXDFcMFwzN1wxMDNcMVwwXDFcNzdcMVwyMTVcMVwxMDMiKwotICAgICJcMVwwXDNcMTAzXDFcMFwxXDEwM1wyXDBcNVwxMDNcMVwwXDM2XDEwMyIrCi0gICAgIlwxXDEwNVwxXDBcMVwyMTZcMVwyMTdcMVwxMDVcMVwyMTZcM1wxMDVcMVwyMjAiKwotICAgICJcMVwxMDVcMlwyMTZcNVwxMDVcMVwyMTZcMzZcMTA1XDFcMTA2XDFcMFwxXDIyMSIrCi0gICAgIlwxXDIyMlwxXDEwNlwxXDIyMVwzXDEwNlwxXDIyMVwxXDEwNlwxXDIyMFwxXDIyMSIrCi0gICAgIlw1XDEwNlwxXDIyMVwzNlwxMDZcMVwxMDdcM1wwXDE3XDEwN1w0XDBcMVwxMDciKwotICAgICJcMTNcMFwxXDEwN1w1XDBcMVwxMDdcMlwwXDFcMTA3XDNcMFwxXDEwNyIrCi0gICAgIlwzXDBcMVwxNjZcMTVcMFwxXDE3MFw0MVwwXDFcMjIzXDU2XDBcMVwxMDciKwotICAgICJcM1wwXDJcMTA3XDNcMTEzXDRcMTA3XDFcMTEzXDVcMTA3XDRcMTE0XDFcMTA3IisKLSAgICAiXDEzXDExNFwxXDEwN1w1XDExNFwxXDEwN1wyXDExNFwxXDEwN1wzXDExNFwxXDExMyIrCi0gICAgIlw2XDBcM1wxMTRcNFwwXDFcMTE0XDVcMFw0XDExNFwxXDBcMTNcMTE0IisKLSAgICAiXDFcMFw1XDExNFwxXDBcMlwxMTRcMVwwXDRcMTE0XDZcMFwzXDExNSIrCi0gICAgIlw0XDBcMVwxMTVcNVwwXDRcMTE1XDFcMFwxM1wxMTVcMVwwXDVcMTE1IisKLSAgICAiXDFcMFwyXDExNVwxXDBcNFwxMTVcMVwxMTdcMlwwXDFcMjI0XDFcMTE3IisKLSAgICAiXDFcMFwzXDExN1wxXDBcMVwxMTdcMlwwXDVcMTE3XDFcMFwzN1wxMTciKwotICAgICJcMVwwXDFcMjIzXDFcMjI0XDFcMTE3XDFcMFwzXDExN1wxXDBcMVwxMTciKwotICAgICJcMlwwXDVcMTE3XDFcMFwzNlwxMTdcMVwxMjFcMVwwXDFcMjI1XDFcMjI2IisKLSAgICAiXDFcMTIxXDFcMjI1XDNcMTIxXDFcMjI3XDFcMTIxXDJcMjI1XDVcMTIxXDFcMjI1IisKLSAgICAiXDM2XDEyMVwxXDEyMlwxXDBcMVwyMzBcMVwyMzFcMVwxMjJcMVwyMzBcM1wxMjIiKwotICAgICJcMVwyMzBcMVwxMjJcMVwyMjdcMVwyMzBcNVwxMjJcMVwyMzBcMzZcMTIyXDNcMCIrCi0gICAgIlwxXDE2NlwxNVwwXDFcMjMyXDEwMFwwXDFcMjMzXDUyXDBcMVwyMzRcMTJcMCIrCi0gICAgIlwxXDIzNFw0MFwwXDFcMjM1XDMyXDBcMjBcMjM2XDFcMjM3XDQwXDIzNlw2XDAiKwotICAgICJcM1wxMzFcNFwwXDFcMTMxXDVcMFw0XDEzMVwxXDBcMTNcMTMxXDFcMCIrCi0gICAgIlw1XDEzMVwxXDBcMlwxMzFcMVwwXDRcMTMxXDQ0XDBcMVwyNDBcNjdcMCIrCi0gICAgIlwxXDI0MVw1XDBcMVwxMzRcMlwwXDFcMjQyXDFcMTM0XDFcMFwzXDEzNCIrCi0gICAgIlwxXDBcMVwxMzRcMlwwXDVcMTM0XDFcMFwzNlwxMzRcMVwxMzZcMVwwIisKLSAgICAiXDFcMjQzXDFcMjQ0XDFcMTM2XDFcMjQzXDNcMTM2XDFcMjQ1XDFcMTM2XDJcMjQzIisKLSAgICAiXDVcMTM2XDFcMjQzXDM2XDEzNlwxXDI0NlwxXDBcMVwyNDdcMVwyNTBcMVwyNTEiKwotICAgICJcMVwyNDdcM1wyNTFcMVwyNDdcMVwyNDZcMVwyNTJcMVwyNTNcM1wyNTFcMVwyNDYiKwotICAgICJcMVwyNTFcMVwyNTNcNFwyNTFcMVwyNDZcMjdcMjUxXDJcMjQ2XDFcMTQwXDJcMjM2IisKLSAgICAiXDFcMjU0XDFcMTQwXDFcMjM2XDNcMTQwXDFcMjM2XDFcMTQwXDJcMjM2XDNcMTQwIisKLSAgICAiXDFcMjU1XDFcMTQwXDFcMjM2XDM2XDE0MFwxXDE0MVwyXDBcMVwyNTZcMVwxNDEiKwotICAgICJcMVwwXDNcMTQxXDFcMFwxXDE0MVwyXDBcNVwxNDFcMVwwXDM2XDE0MSIrCi0gICAgIlwxXDE0M1wyXDI1N1wxXDI2MFwxXDE0M1wxXDI1N1wzXDE0M1wxXDI2MVwxXDE0MyIrCi0gICAgIlwyXDI1N1w1XDE0M1wxXDI1N1wzNlwxNDNcMVwxNDRcMlwyNjJcMVwyNjNcMVwxNDQiKwotICAgICJcMVwyNjJcM1wxNDRcMVwyNjJcMVwxNDRcMVwyNjFcMVwyNjJcNVwxNDRcMVwyNjIiKwotICAgICJcMzZcMTQ0XDFcMTQ1XDJcMjM2XDFcMjY0XDFcMTQ1XDFcMjM2XDNcMTQ1XDFcMjM2IisKLSAgICAiXDFcMTQ1XDJcMjM2XDNcMTQ1XDFcMjY1XDFcMTQ1XDFcMjM2XDM2XDE0NVwxXDE0NiIrCi0gICAgIlwyXDBcMVwyNjZcMVwxNDZcMVwwXDNcMTQ2XDFcMFwxXDE0NlwyXDAiKwotICAgICJcNVwxNDZcMVwwXDM2XDE0NlwxXDE1MFwxXDBcMVwyNjdcMVwyNzBcMVwxNTAiKwotICAgICJcMVwyNjdcM1wxNTBcMVwyNzFcMVwxNTBcMlwyNjdcNVwxNTBcMVwyNjdcMzZcMTUwIisKLSAgICAiXDFcMjcyXDFcMFwxXDI3M1wxXDI3NFwxXDI3NVwxXDI3M1wzXDI3NVwxXDI3MyIrCi0gICAgIlwxXDI3MlwxXDI3NlwxXDI3N1wzXDI3NVwxXDI3MlwxXDI3NVwxXDI3N1w0XDI3NSIrCi0gICAgIlwxXDI3MlwyN1wyNzVcMlwyNzJcMlwxNTJcMVwwXDYwXDE1MlwxXDBcMTZcMTUyIisKLSAgICAiXDFcMzAwXDM3XDE1MlwxXDE1NVwyXDBcMVwzMDFcMVwxNTVcMVwwXDNcMTU1IisKLSAgICAiXDFcMFwxXDE1NVwyXDBcNVwxNTVcMVwwXDM2XDE1NVwxXDE1N1wxXDAiKwotICAgICJcMVwzMDJcMVwzMDNcMVwxNTdcMVwzMDJcM1wxNTdcMVwzMDRcMVwxNTdcMlwzMDIiKwotICAgICJcNVwxNTdcMVwzMDJcMzZcMTU3XDFcMzA1XDFcMFwxXDMwNlwxXDMwN1wxXDMxMCIrCi0gICAgIlwxXDMwNlwzXDMxMFwxXDMwNlwxXDMwNVwxXDMxMVwxXDMxMlwzXDMxMFwxXDMwNSIrCi0gICAgIlwxXDMxMFwxXDMxMlw0XDMxMFwxXDMwNVwyN1wzMTBcMlwzMDVcMlwxNjFcMVwwIisKLSAgICAiXDYwXDE2MVwxXDBcMTZcMTYxXDFcMzEzXDM3XDE2MVw3XDBcMVwzMTRcMTdcMCIrCi0gICAgIlwxXDMxNVwzNlwwXDFcMTcxXDJcMFwxXDQwXDNcMFwxXDE3MVw1XDAiKwotICAgICJcMVwxNzFcNFw0MFwxXDBcMTNcNDBcMVwwXDVcNDBcMVwwXDJcNDAiKwotICAgICJcMVwwXDNcNDBcMVwwXDFcMzE2XDFcMFwzXDMxNlwxXDMxN1wzXDE3MiIrCi0gICAgIlwxXDMxNlwxXDBcMVwzMTZcMVwzMTdcMVwxNzJcMVwzMTZcMVwwXDJcMzE2IisKLSAgICAiXDFcMzE3XDRcMTcyXDFcMzE2XDEzXDE3MlwxXDMxNlw1XDE3MlwxXDMxNlwyXDE3MiIrCi0gICAgIlwxXDMyMFw0XDE3MlwxNVwwXDFcMzIxXDZcMFwxXDMyMlwzNFwwXDFcMzE2IisKLSAgICAiXDFcMFwzXDMxNlwxXDMxN1wzXDE3NFwxXDMxNlwxXDBcMVwzMTZcMVwzMTciKwotICAgICJcMVwxNzRcMVwzMTZcMVwwXDJcMzE2XDFcMzE3XDRcMTc0XDFcMzE2XDEzXDE3NCIrCi0gICAgIlwxXDMxNlw1XDE3NFwxXDMxNlwyXDE3NFwxXDMyM1w0XDE3NFwyN1wwXDFcMzE1IisKLSAgICAiXDMzXDBcMVwzMjRcNjBcMFwxXDMyNVw2NFwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDNcNTdcMVwzMjZcMVwwXDEzXDU3XDFcMFw1XDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDZcMFwzXDU3XDRcMFwxXDU3XDVcMCIrCi0gICAgIlw0XDU3XDFcMFwxM1w1N1wxXDBcMVw1N1wxXDMyN1wzXDU3XDFcMCIrCi0gICAgIlwyXDU3XDFcMFw0XDU3XDFcMjA2XDFcMFw3XDIwNlwxXDIxMFw0N1wyMDYiKwotICAgICJcMVwyMTFcMVwwXDExXDIxMVwxXDIxMFw0NVwyMTFcMVwyMTZcMVwwXDdcMjE2IisKLSAgICAiXDFcMjIwXDQ3XDIxNlwxXDIyMVwxXDBcMTFcMjIxXDFcMjIwXDQ1XDIyMVwxXDIyNSIrCi0gICAgIlwxXDBcN1wyMjVcMVwyMjdcNDdcMjI1XDFcMjMwXDFcMFwxMVwyMzBcMVwyMjciKwotICAgICJcNDVcMjMwXDMwXDBcMVwzMzBcMjVcMFwxXDMzMFwzNVwwXDFcMzMxXDEyXDAiKwotICAgICJcMVwzMzFcNDdcMFwxXDMzMlw2MlwwXDFcMzMzXDc2XDBcMVwzMzRcM1wwIisKLSAgICAiXDFcMjQzXDFcMFw3XDI0M1wxXDI0NVw0N1wyNDNcMVwyNDZcMVwwXDFcMjQ3IisKLSAgICAiXDFcMzM1XDFcMjQ2XDFcMjQ3XDNcMjQ2XDFcMjQ3XDFcMjQ2XDFcMjQ1XDFcMjQ3IisKLSAgICAiXDVcMjQ2XDFcMjQ3XDM2XDI0NlwxXDI0N1wxXDBcMTFcMjQ3XDFcMjQ1XDQ1XDI0NyIrCi0gICAgIlwxXDI0NlwxXDBcMVwyNDdcMVwzMzVcMVwyNDZcMVwyNDdcM1wyNDZcMVwyNDciKwotICAgICJcMVwyNDZcMVwzMzZcMVwyNDdcNVwyNDZcMVwyNDdcMzZcMjQ2XDEzXDBcMVwzMzciKwotICAgICJcNDVcMFwxXDI0N1wxXDBcMTFcMjQ3XDFcMzM2XDQ1XDI0N1wxMVwyNTdcMVwyNjEiKwotICAgICJcNDdcMjU3XDEzXDI2MlwxXDI2MVw0NVwyNjJcMVwyNjdcMVwwXDdcMjY3XDFcMjcxIisKLSAgICAiXDQ3XDI2N1wxXDI3MlwxXDBcMVwyNzNcMVwzNDBcMVwyNzJcMVwyNzNcM1wyNzIiKwotICAgICJcMVwyNzNcMVwyNzJcMVwyNzFcMVwyNzNcNVwyNzJcMVwyNzNcMzZcMjcyXDFcMjczIisKLSAgICAiXDFcMFwxMVwyNzNcMVwyNzFcNDVcMjczXDFcMjcyXDFcMFwxXDI3M1wxXDM0MCIrCi0gICAgIlwxXDI3MlwxXDI3M1wzXDI3MlwxXDI3M1wxXDI3MlwxXDM0MVwxXDI3M1w1XDI3MiIrCi0gICAgIlwxXDI3M1wzNlwyNzJcMTNcMFwxXDM0Mlw0NVwwXDFcMjczXDFcMFwxMVwyNzMiKwotICAgICJcMVwzNDFcNDVcMjczXDJcMTUyXDFcMFwyNFwxNTJcMVwzNDNcMzFcMTUyXDFcMzAyIisKLSAgICAiXDFcMFw3XDMwMlwxXDMwNFw0N1wzMDJcMVwzMDVcMVwwXDFcMzA2XDFcMzQ0IisKLSAgICAiXDFcMzA1XDFcMzA2XDNcMzA1XDFcMzA2XDFcMzA1XDFcMzA0XDFcMzA2XDVcMzA1IisKLSAgICAiXDFcMzA2XDM2XDMwNVwxXDMwNlwxXDBcMTFcMzA2XDFcMzA0XDQ1XDMwNlwxXDMwNSIrCi0gICAgIlwxXDBcMVwzMDZcMVwzNDRcMVwzMDVcMVwzMDZcM1wzMDVcMVwzMDZcMVwzMDUiKwotICAgICJcMVwzNDVcMVwzMDZcNVwzMDVcMVwzMDZcMzZcMzA1XDEzXDBcMVwzNDZcNDVcMCIrCi0gICAgIlwxXDMwNlwxXDBcMTFcMzA2XDFcMzQ1XDQ1XDMwNlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcMzQ3XDMxXDE2MVw3XDBcMVwzNTBcMTAxXDBcMVwzNTFcMzBcMFwxXDMxNiIrCi0gICAgIlwxXDBcMTBcMzE2XDFcMFw0XDMxNlwxXDBcMzRcMzE2XDFcMFw1XDMxNiIrCi0gICAgIlwxXDBcM1wzMTZcMVwzMTdcNFwzMTZcMVwwXDFcMzE2XDFcMzE3XDJcMzE2IisKLSAgICAiXDFcMFwyXDMxNlwxXDMxN1wzMVwzMTZcMVwzNTJcNFwzMTZcMTVcMFwxXDMyMSIrCi0gICAgIlwzNlwwXDFcMzUzXDIxXDBcMVwzNTRcMTJcMFwzXDM1NFwyXDBcMVwzNTQiKwotICAgICJcMTFcMFwyXDM1NFwxXDBcMVwzNTRcMlwwXDJcMzU0XDEwXDBcM1w1NyIrCi0gICAgIlw0XDBcMVw1N1w1XDBcNFw1N1wxXDBcMTFcNTdcMVwzNTVcMVw1NyIrCi0gICAgIlwxXDBcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzM1wwXDFcMzU2IisKLSAgICAiXDEyXDBcMVwzNTZcNDBcMFwxXDM1N1w1N1wwXDFcMzYwXDY2XDBcMVwzNjEiKwotICAgICJcMTJcMFwxXDM2MVw0MFwwXDFcMzYyXDM1XDBcMlwzNjNcMVwwXDNcMzYzIisKLSAgICAiXDJcMFwxXDI1Mlw0XDM2M1wxXDBcNlwzNjNcMVwwXDI3XDM2M1w1XDAiKwotICAgICJcMlwzNjRcMVwwXDNcMzY0XDJcMFwxXDI3Nlw0XDM2NFwxXDBcNlwzNjQiKwotICAgICJcMVwwXDI3XDM2NFwyXDBcMlwxNTJcMVwwXDI1XDE1MlwxXDM2NVwzMFwxNTIiKwotICAgICJcM1wwXDJcMzY2XDFcMFwzXDM2NlwyXDBcMVwzMTFcNFwzNjZcMVwwIisKLSAgICAiXDZcMzY2XDFcMFwyN1wzNjZcMlwwXDJcMTYxXDFcMFwyNVwxNjFcMVwzNjciKwotICAgICJcMzBcMTYxXDMxXDBcMVwzNzBcMTAzXDBcMVwzNTJcMjFcMFwxXDM1NFwxMlwwIisKLSAgICAiXDNcMzU0XDJcMFwxXDM1NFwxMVwwXDJcMzU0XDFcMFwxXDM1NFwxXDAiKwotICAgICJcMVwzNTNcMlwzNTRcMTBcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3IisKLSAgICAiXDFcMFw2XDU3XDFcMzcxXDRcNTdcMVwwXDVcNTdcMVwwXDJcNTciKwotICAgICJcMVwwXDRcNTdcNDRcMFwxXDM3Mlw1NFwwXDFcMzczXDU1XDBcMVwzNzQiKwotICAgICJcNjBcMFwxXDM3NVw2M1wwXDFcMzc2XDIwXDBcMlwxNTJcMVwwXDI2XDE1MiIrCi0gICAgIlwxXDM3N1wyN1wxNTJcMlwxNjFcMVwwXDI2XDE2MVwxXHUwMTAwXDI3XDE2MVwzMlwwIisKLSAgICAiXDFcdTAxMDFcMzRcMFwzXDU3XDRcMFwxXDU3XDVcMFw0XDU3XDFcMCIrCi0gICAgIlwzXDU3XDFcdTAxMDJcN1w1N1wxXDBcMlw1N1wxXHUwMTAyXDJcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDRcNTdcNDVcMFwxXHUwMTAzXDUyXDBcMVx1MDEwNFw2M1wwIisKLSAgICAiXDFcdTAxMDVcNDNcMFwxXHUwMTA2XDYzXDBcMVx1MDEwN1wyNVwwXDFcdTAxMDdcMlwwIisKLSAgICAiXDJcMTUyXDFcMFwyN1wxNTJcMVx1MDEwOFwyNlwxNTJcMlwxNjFcMVwwXDI3XDE2MSIrCi0gICAgIlwxXHUwMTA5XDI2XDE2MVwzM1wwXDFcdTAxMGFcMzJcMFwxXHUwMTBiXDNcNTdcM1wwIisKLSAgICAiXDFcdTAxMGJcMVw1N1w0XDBcMVx1MDEwYlw0XDU3XDFcMFwxM1w1N1wxXDAiKwotICAgICJcNVw1N1wxXDBcMlw1N1wxXDBcNFw1N1wzNVwwXDFcdTAxMGNcNTZcMCIrCi0gICAgIlwxXHUwMTBkXDEyXDBcMVx1MDEwZFw0NVwwXDFcdTAxMGVcMTJcMFwxXHUwMTBlXDEyXDAiKwotICAgICJcMlwxNTJcMVwwXDMwXDE1MlwxXHUwMTBmXDI1XDE1MlwyXDE2MVwxXDBcMzBcMTYxIisKLSAgICAiXDFcdTAxMTBcMjVcMTYxXDMyXDBcMVx1MDExMVwzM1wwXDFcdTAxMGJcNlwwXDFcdTAxMGIiKwotICAgICJcNVwwXDFcdTAxMGJcMzZcMFwyXDE1MlwxXDBcMjdcMTUyXDFcdTAxMTJcMjZcMTUyIisKLSAgICAiXDJcMTYxXDFcMFwyN1wxNjFcMVx1MDExM1wyNlwxNjFcMjdcMFwxXHUwMTE0XDMxXDAiKwotICAgICJcMlwxNTJcMVwwXDI0XDE1MlwxXHUwMTE1XDMxXDE1MlwyXDE2MVwxXDBcMjRcMTYxIisKLSAgICAiXDFcdTAxMTZcMzFcMTYxIjsKLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCB5eXRyYW5zIFtdID0geXlfdW5wYWNrKHl5X3BhY2tlZCk7Ci0KLQotICAvKiBlcnJvciBjb2RlcyAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfVU5LTk9XTl9FUlJPUiA9IDA7Ci0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX05PX01BVENIID0gMjsKLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX1BVU0hCQUNLXzJCSUcgPSAzOwotCi0gIC8qIGVycm9yIG1lc3NhZ2VzIGZvciB0aGUgY29kZXMgYWJvdmUgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFlZX0VSUk9SX01TR1tdID0gewotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkCi0gICAgIkludGVybmFsIGVycm9yOiB1bmtub3duIHN0YXRlIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCQkvLyROT04tTkxTLTEkCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkCi0gIH07Ci0KLSAgLyoqCi0gICAqIFlZX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgWVlfQVRUUklCVVRFW10gPSB7Ci0gICAgIDEsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMSwgIDEsICAxLCAgMCwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICA5LCAgMSwgIDEsICA5LCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsIAotICAgICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDksICA5LCAgMSwgIDksICA5LCAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAKLSAgICAgMSwgIDEsICA5LCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgCi0gICAgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDksICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgOSwgIDAsIAotICAgICAwLCAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDAsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgOSwgIDAsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMSwgCi0gICAgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDksIAotICAgICAwLCAgMCwgIDksICA5LCAgOSwgIDEsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAKLSAgICAgMSwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDksICAwLCAgMSwgIDksICAwLCAgMSwgIDAsICAwLCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICA5LCAgMSwgIDEsICAwLCAgMSwgIDksICA5LCAgOSwgIDEsICAxLCAKLSAgICAgMCwgIDEsICAxLCAgOSwgIDEsICAxCi0gIH07Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB5eV9yZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfc3RhdGU7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsKLQotICAvKiogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB5eV9lbmRSZWFkOwotCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgcHJpdmF0ZSBpbnQgeXljaGFyOwotCi0gIC8qKgotICAgKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZnJvbSB0aGUgbGFzdCBuZXdsaW5lIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dAotICAgKi8KLSAgLy8gcHJpdmF0ZSBpbnQgeXljb2x1bW47IAotCi0gIC8qKiAKLSAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqLwotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7Ci0KLSAgLyoqIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOwotCi0gIC8qKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2VvZl9kb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQlwcml2YXRlIGludCBmVG9rZW5Db3VudCA9IDA7Ci0gCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZwotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCXByaXZhdGUgaW50IGZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBTdHJpbmcgZl9jb250ZXh0ID0gbnVsbDsKLQotCS8vIHN0YXRlIHN0YWNrIGZvciBoYW5kbGluZyBlbWJlZGRlZCByZWdpb25zCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCi0JcHJpdmF0ZSBTdHJpbmcgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgc3RhcnQgPSAwOwotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOwotCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MKLQlwcml2YXRlIGludCBmT2Zmc2V0ID0gMDsKLQkKLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkCi0JcHJpdmF0ZSBTdHJpbmcgZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2VycwotCXByaXZhdGUgTGlzdCBmQmxvY2tNYXJrZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZwotCXByaXZhdGUgYm9vbGVhbiBmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gdHJ1ZTsKLQotCXByaXZhdGUgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSBmUmVnaW9uRmFjdG9yeSA9IG5ldyBYTUxQYXJzZXJSZWdpb25GYWN0b3J5KCk7Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBhZGRCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpCi0JCXJldHVybjsKLQlmQmxvY2tNYXJrZXJzLmFkZChtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JZkJsb2NrTWFya2Vycy5yZW1vdmUobWFya2VyKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKFN0cmluZyB0YWduYW1lKSB7Ci0JaWYgKGZCbG9ja01hcmtlcnMgIT0gbnVsbCkgewotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCQlpZiAoKChCbG9ja01hcmtlcikgYmxvY2tzLm5leHQoKSkuZ2V0VGFnTmFtZSgpLmVxdWFscyh0YWduYW1lKSkKLQkJCQlibG9ja3MucmVtb3ZlKCk7Ci0JCX0KLQl9Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoKSB7Ci0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgewotCWZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZyA9IG5ld1ZhbHVlOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShTdHJpbmcgbmFtZSkgewotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOwotCXdoaWxlKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOwotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7Ci0JCWlmKGNhc2VzZW5zaXRpdmUgJiYgbWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpCi0JCQlyZXR1cm4gY2FzZXNlbnNpdGl2ZTsKLQl9Ci0JcmV0dXJuIHRydWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7Ci0JcmV0dXJuIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBTdHJpbmcgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7Ci0JfQotCXJldHVybiBCTE9DS19URVhUOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQlyZXR1cm4gZkJsb2NrTWFya2VyczsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsKLQlyZXR1cm4gZk9mZnNldCArIHl5Y2hhcjsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgewotCXJldHVybiBpc0Jsb2NrTWFya2VyKGZDdXJyZW50VGFnTmFtZSk7Ci19Ci1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgewotCWlmICghZklzQmxvY2tpbmdFbmFibGVkKQotCQlyZXR1cm4gZmFsc2U7Ci0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja1RhZ1NjYW4oU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBTcGVjaWFsIHRva2VuaXplciBzZXR1cC4gIEFsbG93cyB0b2tlbml6YXRpb24gdG8gYmUgaW5pdGlhdGVkIGF0IHRoZQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuCi0gKgotICogRXhhbXBsZTogCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7Ci0gKgl0b2tlci5zZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoZmFsc2UpOwotICoJdG9rZXIucmVzZXQobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKCJhZml1aHF3a2VqaHRhc2loZ2Fsa3dodHE8L3NjcmlwdGVyPjwvc2NyPjwvc2NyaXB0PmFzZ2Rhc2dhIikpOwotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOwotICoJdG9rZXIuZ2V0UmVnaW9ucygpOyAKLSAqCi0gKiBSZXR1cm5zOgotICoJQkxPQ0tfVEVYVDogMC00MAotICoJWE1MX0VORF9UQUdfT1BFTjogNDEtNDIKLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgKLSAqCVhNTF9UQUdfQ0xPU0U6IDQ5LTQ5Ci0gKglYTUxfQ09OVEVOVDogNTAtNTcKLSAqCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgYmxvY2tjb250ZXh0KSB7Ci0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7Ci0JZkN1cnJlbnRUYWdOYW1lID0gbmV3VGFnTmFtZTsKLX0KLS8qKgotICogTWV0aG9kIGRvU2Nhbi4KLSAqIAotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3IKLSAqIHRvIHJpZ2h0ICpiZWZvcmUqIHRoZSBmaXJzdCBvY2N1cmVuY2Ugb2Ygc2VhcmNoU3RyaW5nCi0gKiAKLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSIKLSAqIEBwYXJhbSByZXF1aXJlVGFpbFNlcGFyYXRvciAtIHdoZXRoZXIgdGhlIHRhcmdldCBtdXN0IGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IHdoaXRlc3BhY2Ugb3IgJz4nCi0gKiBAcGFyYW0gY29udGV4dCAtIHRoZSBjb250ZXh0IG9mIHRoZSBzY2FubmVkIHJlZ2lvbiBpZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoCi0gKiBAcGFyYW0gYWJvcnRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgc2VhcmNoU3RyaW5nIHdhcyBmb3VuZCBpbW1lZGlhdGVseQotICogQHJldHVybiBTdHJpbmcgLSB0aGUgY29udGV4dCBmb3VuZDogdGhlIGRlc2lyZWQgY29udGV4dCBvbiBhIG5vbi16ZXJvIGxlbmd0aCBtYXRjaCwgdGhlIGFib3J0Q29udGV4dCBvbiBpbW1lZGlhdGUgc3VjY2VzcwotICogQHRocm93cyBJT0V4Y2VwdGlvbgotICovCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb1NjYW4oU3RyaW5nIHNlYXJjaFN0cmluZywgYm9vbGVhbiByZXF1aXJlVGFpbFNlcGFyYXRvciwgU3RyaW5nIHNlYXJjaENvbnRleHQsIGludCBleGl0U3RhdGUsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOwotCS8vIERpc2FibGUgZnVydGhlciBibG9jayAocHJvYmFibHkpCi0JZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQlpbnQgbiA9IDA7Ci0JY2hhciBsYXN0Q2hlY2tDaGFyOwotCWludCBpOwotCWJvb2xlYW4gc2FtZSA9IGZhbHNlOwotCXdoaWxlIChzdGlsbFNlYXJjaGluZykgewotCQluID0gMDsKLQkJLy8gRW5zdXJlIHRoYXQgZW5vdWdoIGRhdGEgZnJvbSB0aGUgaW5wdXQgZXhpc3RzIHRvIGNvbXBhcmUgYWdhaW5zdCB0aGUgc2VhcmNoIFN0cmluZy4KLQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQotCQkJbiA9IHl5X2FkdmFuY2UoKTsKLQkJLy8gSWYgdGhlIGlucHV0IHdhcyB0b28gc2hvcnQgb3Igd2UndmUgZXhoYXVzdGVkIHRoZSBpbnB1dCwgc3RvcCBpbW1lZGlhdGVseS4KLQkJaWYgKG4gPT0gWVlFT0YpIHsKLQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzYW1lID0gdHJ1ZTsKLQkJCS8vIEVuc3VyZSB0aGF0IHdlJ3ZlIG5vdCBlbmNvdW50ZXJlZCBhIGNvbXBsZXRlIGJsb2NrICg8JSU+KSB0aGF0IHdhcyAqc2hvcnRlciogdGhhbiB0aGUgY2xvc2VUYWdTdHJpbmcgYW5kCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uCi0JCQkvLyBDaGVjayB0aGUgY2hhcmFjdGVycyBpbiB0aGUgdGFyZ2V0IHZlcnN1cyB0aGUgbGFzdCB0YXJnZXRMZW5ndGggY2hhcmFjdGVycyByZWFkIGZyb20gdGhlIGJ1ZmZlcgotCQkJLy8gYW5kIHNlZSBpZiBpdCBtYXRjaGVzCi0JCQkKLQkJCS8vIHNhZmV0eSBjaGVjayBmb3IgYXJyYXkgYWNjZXNzZXMgKHl5X2N1cnJlbnRQb3MgaXMgdGhlICpsYXN0KiBjaGFyYWN0ZXIgd2UgY2FuIGNoZWNrIGFnYWluc3QpCi0JCQlpZih5eV9jdXJyZW50UG9zID49IHNlYXJjaFN0cmluZ0xlbmd0aCAmJiB5eV9jdXJyZW50UG9zIDw9IHl5X2J1ZmZlci5sZW5ndGgpIHsKLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgewotCQkJCQlpZihzYW1lICYmIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZykKLQkJCQkJCXNhbWUgPSB5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdID09IHNlYXJjaFN0cmluZy5jaGFyQXQoaSk7Ci0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZSh5eV9idWZmZXJbaSArIHl5X2N1cnJlbnRQb3MgLSBzZWFyY2hTdHJpbmdMZW5ndGhdKSA9PSBDaGFyYWN0ZXIudG9Mb3dlckNhc2Uoc2VhcmNoU3RyaW5nLmNoYXJBdChpKSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gc2FmZXR5IGNoZWNrIGZhaWxlZDsgbm8gbWF0Y2ggaXMgcG9zc2libGUgcmlnaHQgbm93Ci0JCQllbHNlIHsKLQkJCQlzYW1lID0gZmFsc2U7Ci0JCQl9Ci0JCQlpZiAoc2FtZSAmJiByZXF1aXJlVGFpbFNlcGFyYXRvciAmJiB5eV9jdXJyZW50UG9zIDwgeXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaAotCQkJCS8vICI8L3NjcmlwdFMiCi0JCQkJbGFzdENoZWNrQ2hhciA9IHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXTsKLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIgotCQkJCWlmKGxhc3RDaGVja0NoYXIgPT0gJz4nIHx8IENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGFzdENoZWNrQ2hhcikpCi0JCQkJCXN0aWxsU2VhcmNoaW5nID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGlsbFNlYXJjaGluZyA9ICFzYW1lIHx8ICh5eV9jdXJyZW50UG9zIDwgeXlfc3RhcnRSZWFkICsgc2VhcmNoU3RyaW5nTGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7Ci0JCS8vIFdlJ3ZlIHN0b3BwZWQgc2hvcnQgb2YgdGhlIGVuZCBvciBkZWZpbml0ZWx5IGZvdW5kIGEgbWF0Y2gKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aDsKLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7Ci0JCS8vIElmIHRoZSBzZWFyY2hTdHJpbmcgb2NjdXJzIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiB3aGF0IHdvdWxkIGhhdmUKLQkJLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsKLQkJCXl5YmVnaW4oaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci0JCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCQl9Ci0JfQotCWVsc2UgewotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQKLQkJeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsKLQkJeXlfY3VycmVudFBvcysrOwotCX0KLQl5eWJlZ2luKGV4aXRTdGF0ZSk7Ci0JLy8gSWYgdGhlIGVuZGluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5Ci0JaWYoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkKLQkJcmV0dXJuIHByaW1HZXROZXh0VG9rZW4oKTsKLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBBIGdlbmVyaWMgbG9va2FoZWFkLWxpa2Ugb3BlcmF0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tTY2FuKFN0cmluZyB0YXJnZXQsIFN0cmluZyB0YXJnZXRDb250ZXh0LCBpbnQgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQlyZXR1cm4gZG9TY2FuKHRhcmdldCwgZmFsc2UsIHRhcmdldENvbnRleHQsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUsIGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvQmxvY2tUYWdTY2FuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsKLQlyZXR1cm4gZG9TY2FuKCI8LyIgKyBmQ3VycmVudFRhZ05hbWUsIHRydWUsIGdldEJsb2NrTWFya2VyQ29udGV4dChmQ3VycmVudFRhZ05hbWUpLCBZWUlOSVRJQUwsIFlZSU5JVElBTCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kCi0gKgotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpCi0gKiBtZXRob2QgaW50byBhIGZ1bGwgSVRleHRSZWdpb24gYnkgcHVsbGluZyBpbiB2YWx1ZXMgZm9yIHRoZQotICogY3VycmVudCBvZmZzZXQgd2l0aGluIHRoZSBzY2FubmluZyB0ZXh0LgotICoKLSAqIFJldHVybnMgbnVsbCB3aGVuIEVPRiBpcyBlbmNvdW50ZXJlZCBhbmQgYXR0YWNoZXMgaW50ZXJtaXR0ZW50bHkKLSAqIGRpc2NvdmVyZWQgd2hpdGVzcGFjZSBvbnRvIHRoZSBlbmQgb2YgdXNlZnVsIHJlZ2lvbnMuCi0gKgotICogTm90ZSB0aGF0IHRoaXMgYWxnb3JpdGhtIGNhY2hlcyB0aGUgdG9rZW4gZm9sbG93aW5nIHRoZSBvbmUgYmVpbmcgcmV0dXJuZWQKLSAqIHNvIHRoYXQgd2hpdGVzcGFjZSBjYW4gYmUgY29sbGFwc2VkLgotICovCi1wdWJsaWMgZmluYWwgSVRleHRSZWdpb24gZ2V0TmV4dFRva2VuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBsb2FkIHRoZSBzdGFydGluZyBub24td2hpdGVzcGFjZSB0b2tlbiAoYXNzdW1lIHRoYXQgaXQgaXMgc28pCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsKLQkJY29udGV4dCA9IGZCdWZmZXJlZENvbnRleHQ7Ci0JCXN0YXJ0ID0gZkJ1ZmZlcmVkU3RhcnQ7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQl9Ci0JZWxzZSB7Ci0JCWNvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCWlmIChjb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJCWVsc2UKLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJc3RhcnQgPSB5eWNoYXI7Ci0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOwotCQlpZiAoeXlfYXRFT0YpIHsKLQkJCWZUb2tlbkNvdW50Kys7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbgotCWZfY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQlpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfTkFNRSkgewotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7Ci0JCWVsc2UKLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JfQotCWVsc2UgaWYgKGZfY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9FTkRfVEFHX09QRU4pIHsKLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7Ci0JfQotCWZCdWZmZXJlZENvbnRleHQgPSBmX2NvbnRleHQ7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7Ci0JZkJ1ZmZlcmVkTGVuZ3RoID0geXlsZW5ndGgoKTsKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gdHJ1ZTsKLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgewotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JCWxlbmd0aCArPSBmQnVmZmVyZWRMZW5ndGg7Ci0JfQotCWlmIChjb250ZXh0ID09IG51bGwpIHsKLQkJLy8gRU9GCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBkaXNjb3ZlcmVkICIgKyBmVG9rZW5Db3VudCArICIgdG9rZW5zLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQlmVG9rZW5Db3VudCsrOwotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsKLQlzdXBlcigpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBYTUxUb2tlbml6ZXIoY2hhcltdIGNoYXJBcnJheSl7Ci0JCXRoaXMobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7Ci0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCBuZXdPZmZzZXQpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uSW5wdXRTdHJlYW0gaW4sIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsKLQlyZXNldChpbiwgMCk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kICoKLSAqCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMKLSAqIHRoYXQgcmVzZXR0aW5nIGEgcHJlLWV4aXN0aW5nIHRva2VuaXplciBpcyBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIG5ldyBvbmUuCi0gKgotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUKLSAqIDxlbT5nZW5lcmF0ZWQ8L2VtPiBvdXRwdXQgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIGJlZm9yZSB0aGlzIG1ldGhvZCB3YXMKLSAqIGFkZGVkLiAgVGhvc2UgY29kZSBibG9ja3Mgd2VyZSB1bmRlciB0aGUgYWJvdmUgY29weXJpZ2h0LgotICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbiwgaW50IG5ld09mZnNldCkgewotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkCi0JfQotCWZPZmZzZXQgPSBuZXdPZmZzZXQ7Ci0KLQkvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0JeXlfcmVhZGVyID0gaW47Ci0KLQkvKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovCi0JeXlfc3RhdGUgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotCXl5X2xleGljYWxfc3RhdGUgPSBZWUlOSVRJQUw7Ci0KLQkvKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0JdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotCXl5X21hcmtlZFBvcyA9IDA7Ci0KLQkvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotCXl5X3B1c2hiYWNrUG9zID0gMDsKLQotCS8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotCXl5X2N1cnJlbnRQb3MgPSAwOwotCi0JLyogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0JeXlfc3RhcnRSZWFkID0gMDsKLQotCS8qKiAKLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLQkgKiBmcm9tIGlucHV0IAotCSAqLwotCXl5X2VuZFJlYWQgPSAwOwotCi0JLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXlsaW5lID0gMDsKLQotCS8qIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotCXl5Y2hhciA9IDA7Ci0KLQkvKiB5eV9hdEVPRiA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBoYXMgcmV0dXJuZWQgYSB2YWx1ZSBmb3IgRU9GICovCi0JeXlfYXRFT0YgPSBmYWxzZTsKLQotCS8qIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotCXl5X2VvZl9kb25lID0gZmFsc2U7Ci0KLQotCS8qIHVzZXIgdmFyczogKi8KLQlmVG9rZW5Db3VudCA9IDA7Ci0gCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCWZCdWZmZXJlZENvbnRleHQgPSBudWxsOwotCWZCdWZmZXJlZFN0YXJ0ID0gMTsKLQlmQnVmZmVyZWRMZW5ndGggPSAwOwotCWZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQljb250ZXh0ID0gbnVsbDsKLQlzdGFydCA9IDA7Ci0JdGV4dExlbmd0aCA9IDA7Ci0JbGVuZ3RoID0gMDsKLX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kCi0JICoKLQkgKi8KLQlwdWJsaWMgQmxvY2tUb2tlbml6ZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFRva2VuaXplciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCAKLQkJLy8gYXJlIG5ldmVyIGRlc3Ryb3llZCAoZS5nLiAncmVsZWFzZScpCi0JCWZvcihpbnQgaSA9IDA7IGkgPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7Ci0JCQlpZihibG9ja01hcmtlci5pc0dsb2JhbCgpKQotCQkJCW5ld0luc3RhbmNlLmFkZEJsb2NrTWFya2VyKGJsb2NrTWFya2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotLyogdXNlciBtZXRob2QgKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIHNjYW5YTUxDb21tZW50VGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JLy8gU2NhbiBmb3IgJy0tPicgYW5kIHJldHVybiB0aGUgdGV4dCB1cCB0byB0aGF0IHBvaW50IGFzCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gKLQkvLyAgY2FzZSBjaGFuZ2UgdG8gdGhlIFNUX1hNTF9DT01NRU5UX0VORCBzdGF0ZSBhbmQgcmV0dXJuIHRoZSBuZXh0Ci0JLy8gIGNvbnRleHQgYXMgdXN1YWwuCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsKLX0KLQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIKLSAgICogVGhlcmUgaXMgYWxzbyBhIGphdmEuaW8uSW5wdXRTdHJlYW0gdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uUmVhZGVyIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnl5X3JlYWRlciA9IGluOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lci4KLSAgICogVGhlcmUgaXMgYWxzbyBqYXZhLmlvLlJlYWRlciB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5JbnB1dHN0cmVhbSB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgREZBIHRyYW5zaXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgW10geXlfdW5wYWNrKFN0cmluZyBwYWNrZWQpIHsKLSAgICBpbnQgW10gdHJhbnMgPSBuZXcgaW50WzkyMTJdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDMyMjApIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIHZhbHVlLS07Ci0gICAgICBkbyB0cmFuc1tqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiB0cmFuczsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eV91bnBhY2tfY21hcChTdHJpbmcgcGFja2VkKSB7Ci0gICAgY2hhciBbXSBtYXAgPSBuZXcgY2hhclsweDEwMDAwXTsKLSAgICBpbnQgaSA9IDA7ICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gMDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgd2hpbGUgKGkgPCAxMzcyKSB7Ci0gICAgICBpbnQgIGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgY2hhciB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIG1hcFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBuZXh0IGlucHV0IGNoYXJhY3Rlci4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlCi0gICAqICAgICAgICAgICAgICBlbmQgb2YgdGhlIHN0cmVhbSBpcyByZWFjaGVkLgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwcml2YXRlIGludCB5eV9hZHZhbmNlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zIDwgeXlfZW5kUmVhZCkgcmV0dXJuIHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zKytdOwotCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyAKLSAgICBpZiAoeXlfYXRFT0YpIHJldHVybiBZWUVPRjsKLQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLwotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgewotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlciwgMCwgCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsKLQotICAgICAgLyogdHJhbnNsYXRlIHN0b3JlZCBwb3NpdGlvbnMgKi8KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9jdXJyZW50UG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfbWFya2VkUG9zLT0geXlfc3RhcnRSZWFkOwotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9zdGFydFJlYWQgPSAwOwotICAgIH0KLQotICAgIC8qIGlzIHRoZSBidWZmZXIgYmlnIGVub3VnaD8gKi8KLSAgICBpZiAoeXlfY3VycmVudFBvcyA+PSB5eV9idWZmZXIubGVuZ3RoKSB7Ci0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8KLSAgICAgIGNoYXIgbmV3QnVmZmVyW10gPSBuZXcgY2hhclt5eV9jdXJyZW50UG9zKjJdOwotICAgICAgU3lzdGVtLmFycmF5Y29weSh5eV9idWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgeXlfYnVmZmVyLmxlbmd0aCk7Ci0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7Ci0gICAgfQotCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovCi0gICAgaW50IG51bVJlYWQgPSB5eV9yZWFkZXIucmVhZCh5eV9idWZmZXIsIHl5X2VuZFJlYWQsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5eV9idWZmZXIubGVuZ3RoLXl5X2VuZFJlYWQpOwotCi0gICAgaWYgKCBudW1SZWFkID09IC0xICkgcmV0dXJuIFlZRU9GOwotCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7Ci0KLSAgICByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHl5X2F0RU9GID0gdHJ1ZTsgICAgICAgICAgICAvKiBpbmRpY2F0ZSBlbmQgb2YgZmlsZSAqLwotICAgIHl5X2VuZFJlYWQgPSB5eV9zdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotICAgIHl5X3JlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB5eV9sZXhpY2FsX3N0YXRlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgeXlfbGV4aWNhbF9zdGF0ZSA9IG5ld1N0YXRlOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdGV4dCBtYXRjaGVkIGJ5IHRoZSBjdXJyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgewotICAgIHJldHVybiBuZXcgU3RyaW5nKCB5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCApOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlsZW5ndGgoKSB7Ci0gICAgcmV0dXJuIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXBvcnRzIGFuIGVycm9yIHRoYXQgb2NjdXJlZCB3aGlsZSBzY2FubmluZyAtIGZyb20gdGhlIFNFRCBKRmxleCBza2VsZXRvbgotICAgKgotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHl5X1NjYW5FcnJvcihpbnQgZXJyb3JDb2RlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbZXJyb3JDb2RlXSk7Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tZWV9VTktOT1dOX0VSUk9SXSk7Ci0gICAgfQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcgotICAgIC8vIFN5c3RlbS5leGl0KDEpOwotICB9IAotCi0KLSAgLyoqCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLgotICAgKgotICAgKiBUaGV5IHdpbGwgYmUgcmVhZCBhZ2FpbiBieSB0aGVuIG5leHQgY2FsbCBvZiB0aGUgc2Nhbm5pbmcgbWV0aG9kCi0gICAqCi0gICAqIEBwYXJhbSBudW1iZXIgIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBiZSByZWFkIGFnYWluLgotICAgKiAgICAgICAgICAgICAgICBUaGlzIG51bWJlciBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4geXlsZW5ndGgoKSEKLSAgICovCi0gIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSB7Ci0gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsKLQotICAgIHl5X21hcmtlZFBvcyAtPSBudW1iZXI7Ci0gIH0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gY29udGFpbnNUYWdOYW1lKGNoYXJbXSBtYXJrZXJUYWdOYW1lLCBpbnQgb2Zmc2V0LCBpbnQgdGFnbmFtZUxlbmd0aCkgewotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWZCbG9ja01hcmtlcnMuZ2V0KGopOwotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5sZW5ndGgoKSA9PSB0YWduYW1lTGVuZ3RoKSB7Ci0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOwotCQkJCWZvcihpbnQgaSA9IDA7IGkgPCB0YWduYW1lTGVuZ3RoICYmIG1hdGNoZXNTb0ZhcjsgaSsrKSB7Ci0JCQkJCWlmKG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKSkgewotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkKLQkJCQkJCQltYXRjaGVzU29GYXIgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmKENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSkgIT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlclRhZ05hbWVbaSArIG9mZnNldF0pKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXNTb0ZhcikKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICoKLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0Ci0JICogTm90ZTogZm9yIHZlcmlmaWNhdGlvbiB1c2UKLQkgKi8KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgewotCQlMaXN0IHRva2VucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJd2hpbGUocmVnaW9uICE9IG51bGwpIHsKLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJdG9rZW5zLmFkZChyZWdpb24pOwotCQkJCX0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZ2V0Q2xhc3MoKS5nZXROYW1lKCkrIjogaW5wdXQgY291bGQgbm90IGJlIHRva2VuaXplZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldE9mZnNldCgpLCBlKTsvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBlOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gU2luY2UgdGhpcyBpcyBjb252ZW5pZW5jZSBtZXRob2QgYW5kIE5PVCB0aGUgcmVjb21tZW5kZWQgCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbm90IGhhbmRsZWQgcmV0cmlldmluZyByZWdpb25zOiAiICsgZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gdG9rZW5zOwotCX0KLQkvKioKLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZAotCSAqLwotCXByaXZhdGUgZmluYWwgdm9pZCBkdW1wKFN0cmluZyBzKSB7Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKHMgKyAiICgiICsgeXljaGFyICsgIi0iICsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkoeXlsZW5ndGgoKSArIHl5Y2hhcikgKyAiKTpcJyIgKy8vJE5PTi1OTFMtMSQKLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VPRigpIHsKLQkJcmV0dXJuIHl5X2F0RU9GOwotCX0KLS8qIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkICovCi1wcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoU3RyaW5nIG1hcmtlclRhZ05hbWUpIHsKLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoYmxvY2tzLmhhc05leHQoKSkgewotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpYmxvY2tzLm5leHQoKTsKLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShtYXJrZXJUYWdOYW1lKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCX0KLQlyZXR1cm4gZmFsc2U7Ci19Ci0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfZG9fZW9mKCkgewotICAgIGlmICgheXlfZW9mX2RvbmUpIHsKLSAgICAgIHl5X2VvZl9kb25lID0gdHJ1ZTsKLSAgICAvLyBkbyBub3RoaW5nLCB0aGlzIGlzIHRoZSBkb3duc3RyZWFtIHBhcnNlcidzIGpvYgotCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogUmVzdW1lcyBzY2FubmluZyB1bnRpbCB0aGUgbmV4dCByZWd1bGFyIGV4cHJlc3Npb24gaXMgbWF0Y2hlZCwKLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgdG9rZW4KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB5eV9pbnB1dDsKLSAgICBpbnQgeXlfYWN0aW9uOwotCi0KLSAgICB3aGlsZSAodHJ1ZSkgewotCi0gICAgICB5eWNoYXIrPSB5eWxlbmd0aCgpOwotCi0gICAgICBib29sZWFuIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgIGZvciAoeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZDsgeXlfY3VycmVudFBvcyA8IHl5X21hcmtlZFBvczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2N1cnJlbnRQb3MrKykgewotICAgICAgICBzd2l0Y2ggKHl5X2J1ZmZlclt5eV9jdXJyZW50UG9zXSkgewotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgeXlfY291bnRlZCA9IHRydWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBpZiAoeXlfY291bnRlZCkKLSAgICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5bGluZSsrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB5eV9jb3VudGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHl5X2NvdW50ZWQpIHsKLSAgICAgICAgaWYgKCB5eV9hZHZhbmNlKCkgPT0gJ1xuJyApIHl5bGluZS0tOwotICAgICAgICBpZiAoICF5eV9hdEVPRiApIHl5X2N1cnJlbnRQb3MtLTsKLSAgICAgIH0KLQotICAgICAgeXlfYWN0aW9uID0gLTE7Ci0KLSAgICAgIHl5X2N1cnJlbnRQb3MgPSB5eV9zdGFydFJlYWQgPSB5eV9tYXJrZWRQb3M7Ci0KLSAgICAgIHl5X3N0YXRlID0geXlfbGV4aWNhbF9zdGF0ZTsKLQotCi0gICAgICB5eV9mb3JBY3Rpb246IHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAKLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsKLQotICAgICAgICAgIGlmICggeXlfaW5wdXQgPT0gWVlFT0YgKSBicmVhayB5eV9mb3JBY3Rpb247Ci0KLSAgICAgICAgICBpbnQgeXlfbmV4dCA9IHl5dHJhbnNbIHl5X3Jvd01hcFt5eV9zdGF0ZV0gKyB5eWNtYXBbeXlfaW5wdXRdIF07Ci0gICAgICAgICAgaWYgKHl5X25leHQgPT0gLTEpIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB5eV9zdGF0ZSA9IHl5X25leHQ7Ci0KLSAgICAgICAgICBpbnQgeXlfYXR0cmlidXRlcyA9IFlZX0FUVFJJQlVURVt5eV9zdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDEpID4gMCApIHsKLSAgICAgICAgICAgIHl5X2FjdGlvbiA9IHl5X3N0YXRlOyAKLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IAotICAgICAgICAgICAgaWYgKCAoeXlfYXR0cmlidXRlcyAmIDgpID4gMCApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIAotCi0gICAgICAgIGNhc2UgMjc1OiAKLSAgICAgICAgY2FzZSAyNzY6IAotICAgICAgICBjYXNlIDI3NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0JeXliZWdpbihTVF9DREFUQV9URVhUKTsKLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI3OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY5OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjgwOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyODE6IGJyZWFrOwotICAgICAgICBjYXNlIDI2NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI4MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDOwotIH0KLSAgICAgICAgY2FzZSAyODM6IGJyZWFrOwotICAgICAgICBjYXNlIDI2MTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBleHRlcm5hbCBpZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTTsKLSB9Ci0gICAgICAgIGNhc2UgMjg0OiBicmVhazsKLSAgICAgICAgY2FzZSAyNTc6IAotICAgICAgICBjYXNlIDI2NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAyODU6IGJyZWFrOwotICAgICAgICBjYXNlIDIzNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5DaGFyUmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI4NjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmNvbW1lbnQgc3RhcnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfQ09NTUVOVCk7Ci0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI4NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjEzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMjg4OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgZW5kIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI4OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjExOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9DREFUQV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjkwOiBicmVhazsKLSAgICAgICAgY2FzZSAyMTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuUEVSZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9QRV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI5MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjA3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VOVElUWV9SRUZFUkVOQ0U7Ci0gfQotICAgICAgICBjYXNlIDI5MjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU4OiAKLSAgICAgICAgY2FzZSAxNzI6IAotICAgICAgICBjYXNlIDE4MDogCi0gICAgICAgICAgeyAKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOwotIH0KLSAgICAgICAgY2FzZSAyOTM6IGJyZWFrOwotICAgICAgICBjYXNlIDE0NjogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbXB0eSB0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHJldHVybiBYTUxfRU1QVFlfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDEzMTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMwOiAKLSAgICAgICAgICB7IAotCQkvLyBlbmRlZCB3aXRoIG5vdGhpbmcgaW5zaWRlCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjk2OiBicmVhazsKLSAgICAgICAgY2FzZSAxMjc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE5OiAKLSAgICAgICAgICB7IAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjk4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1BJKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyOTk6IGJyZWFrOwotICAgICAgICBjYXNlIDYyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMDA6IGJyZWFrOwotICAgICAgICBjYXNlIDU2OiAKLSAgICAgICAgY2FzZSA1ODogCi0gICAgICAgIGNhc2UgNTk6IAotICAgICAgICBjYXNlIDYwOiAKLSAgICAgICAgY2FzZSAxMzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMwMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzAyOiBicmVhazsKLSAgICAgICAgY2FzZSA1NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMDM6IGJyZWFrOwotICAgICAgICBjYXNlIDUwOiAKLSAgICAgICAgY2FzZSA1MTogCi0gICAgICAgIGNhc2UgNTI6IAotICAgICAgICAgIHsgCi0JLy8gYmxvY2sgc2NhbiB1bnRpbCBjbG9zZSBpcyBmb3VuZAotCXJldHVybiBkb1NjYW4oIj8+IiwgZmFsc2UsIFhNTF9QSV9DT05URU5ULCBTVF9YTUxfUElfVEFHX0NMT1NFLCBTVF9YTUxfUElfVEFHX0NMT1NFKTsKLSB9Ci0gICAgICAgIGNhc2UgMzA0OiBicmVhazsKLSAgICAgICAgY2FzZSA0OTogCi0gICAgICAgICAgeyAKLSAgICAgICAgeXliZWdpbihTVF9QSV9DT05URU5UKTsKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMDU6IGJyZWFrOwotICAgICAgICBjYXNlIDQ2OiAKLSAgICAgICAgY2FzZSA0NzogCi0gICAgICAgIGNhc2UgNDg6IAotICAgICAgICBjYXNlIDEyODogCi0gICAgICAgIGNhc2UgMTI5OiAKLSAgICAgICAgY2FzZSAyMTQ6IAotICAgICAgICBjYXNlIDIzNjogCi0gICAgICAgIGNhc2UgMjQ4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9QSV9XUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDE6IAotICAgICAgICBjYXNlIDQyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJjb21tZW50IGNvbnRlbnQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIHNjYW5YTUxDb21tZW50VGV4dCgpOwotIH0KLSAgICAgICAgY2FzZSAzMDc6IGJyZWFrOwotICAgICAgICBjYXNlIDQwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJMSU5FIEZFRUQiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMDg6IGJyZWFrOwotICAgICAgICBjYXNlIDA6IAotICAgICAgICBjYXNlIDMxOiAKLSAgICAgICAgY2FzZSAxMjE6IAotICAgICAgICBjYXNlIDEyMzogCi0gICAgICAgIGNhc2UgMjA1OiAKLSAgICAgICAgY2FzZSAyMDY6IAotICAgICAgICBjYXNlIDIzMzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5YTUwgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMwOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTogCi0gICAgICAgIGNhc2UgODogCi0gICAgICAgIGNhc2UgOTogCi0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICBjYXNlIDEyOiAKLSAgICAgICAgY2FzZSAxMzogCi0gICAgICAgIGNhc2UgMTQ6IAotICAgICAgICBjYXNlIDE1OiAKLSAgICAgICAgY2FzZSAxNzogCi0gICAgICAgIGNhc2UgMTg6IAotICAgICAgICBjYXNlIDE5OiAKLSAgICAgICAgY2FzZSAyMDogCi0gICAgICAgIGNhc2UgMjE6IAotICAgICAgICBjYXNlIDIyOiAKLSAgICAgICAgY2FzZSAyMzogCi0gICAgICAgIGNhc2UgMjQ6IAotICAgICAgICBjYXNlIDI1OiAKLSAgICAgICAgY2FzZSAyNjogCi0gICAgICAgIGNhc2UgMjg6IAotICAgICAgICBjYXNlIDQ1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ3aGl0ZSBzcGFjZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFdISVRFX1NQQUNFOwotIH0KLSAgICAgICAgY2FzZSAzMTA6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgY2FzZSA3MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzExOiBicmVhazsKLSAgICAgICAgY2FzZSAyNzogCi0gICAgICAgIGNhc2UgMTA1OiAKLSAgICAgICAgY2FzZSAxMDY6IAotICAgICAgICBjYXNlIDE5MTogCi0gICAgICAgIGNhc2UgMjI2OiAKLSAgICAgICAgY2FzZSAyNDQ6IAotICAgICAgICBjYXNlIDI1NDogCi0gICAgICAgIGNhc2UgMjYzOiAKLSAgICAgICAgY2FzZSAyNzA6IAotICAgICAgICBjYXNlIDI3MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzEyOiBicmVhazsKLSAgICAgICAgY2FzZSAyOTogCi0gICAgICAgIGNhc2UgMTEyOiAKLSAgICAgICAgY2FzZSAxMTM6IAotICAgICAgICBjYXNlIDIwMjogCi0gICAgICAgIGNhc2UgMjMwOiAKLSAgICAgICAgY2FzZSAyNDY6IAotICAgICAgICBjYXNlIDI1NTogCi0gICAgICAgIGNhc2UgMjY0OiAKLSAgICAgICAgY2FzZSAyNzE6IAotICAgICAgICBjYXNlIDI3NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMTM6IGJyZWFrOwotICAgICAgICBjYXNlIDMyOiAKLSAgICAgICAgY2FzZSA3MTogCi0gICAgICAgIGNhc2UgODI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMzE0OiBicmVhazsKLSAgICAgICAgY2FzZSAzMzogCi0gICAgICAgIGNhc2UgMzQ6IAotICAgICAgICBjYXNlIDM3OiAKLSAgICAgICAgY2FzZSAzODogCi0gICAgICAgIGNhc2UgMzk6IAotICAgICAgICBjYXNlIDQzOiAKLSAgICAgICAgY2FzZSA0NDogCi0gICAgICAgIGNhc2UgNTM6IAotICAgICAgICBjYXNlIDU3OiAKLSAgICAgICAgY2FzZSA2MTogCi0gICAgICAgIGNhc2UgNjM6IAotICAgICAgICBjYXNlIDY3OiAKLSAgICAgICAgY2FzZSA3MzogCi0gICAgICAgIGNhc2UgNzk6IAotICAgICAgICBjYXNlIDg0OiAKLSAgICAgICAgY2FzZSA4NTogCi0gICAgICAgIGNhc2UgODY6IAotICAgICAgICBjYXNlIDg3OiAKLSAgICAgICAgY2FzZSA4OTogCi0gICAgICAgIGNhc2UgOTA6IAotICAgICAgICBjYXNlIDkyOiAKLSAgICAgICAgY2FzZSA5NzogCi0gICAgICAgIGNhc2UgMTAyOiAKLSAgICAgICAgY2FzZSAxMDk6IAotICAgICAgICAgIHsgCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJeXljaGFyICsgIi0iICsgKHl5Y2hhciArIHl5bGVuZ3RoKCkpKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFVOREVGSU5FRDsKLSB9Ci0gICAgICAgIGNhc2UgMzE1OiBicmVhazsKLSAgICAgICAgY2FzZSAzNTogCi0gICAgICAgIGNhc2UgMzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIHRleHQiKTsvLyROT04tTkxTLTEkCi0JU3RyaW5nIGJsb2NrQ29udGV4dCA9IGRvQmxvY2tTY2FuKCJdXT4iLCBYTUxfQ0RBVEFfVEVYVCwgU1RfQ0RBVEFfRU5EKTsvLyROT04tTkxTLTEkCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQotCQl5eWJlZ2luKFNUX0NEQVRBX0VORCk7Ci0JcmV0dXJuIGJsb2NrQ29udGV4dDsKLSB9Ci0gICAgICAgIGNhc2UgMzE2OiBicmVhazsKLSAgICAgICAgY2FzZSA2NDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzE3OiBicmVhazsKLSAgICAgICAgY2FzZSA2NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiAnPSciKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzE4OiBicmVhazsKLSAgICAgICAgY2FzZSA2NjogCi0gICAgICAgIGNhc2UgNjg6IAotICAgICAgICBjYXNlIDY5OiAKLSAgICAgICAgY2FzZSAxNDM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMTk6IGJyZWFrOwotICAgICAgICBjYXNlIDcyOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYoaXNCbG9ja01hcmtlcigpKSB7Ci0gICAgICAgIAl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQl9Ci0JZWxzZQotICAgICAgICAJeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIwOiBicmVhazsKLSAgICAgICAgY2FzZSA3NDogCi0gICAgICAgIGNhc2UgNzU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVxdWFscyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsKLSB9Ci0gICAgICAgIGNhc2UgMzIzOiBicmVhazsKLSAgICAgICAgY2FzZSA3ODogCi0gICAgICAgIGNhc2UgODA6IAotICAgICAgICBjYXNlIDgxOiAKLSAgICAgICAgY2FzZSAxNTA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFOwotIH0KLSAgICAgICAgY2FzZSAzMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDgzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkZWNsYXJhdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMjU6IGJyZWFrOwotICAgICAgICBjYXNlIDg4OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHR5cGUiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTE6IAotICAgICAgICBjYXNlIDkzOiAKLSAgICAgICAgY2FzZSA5NDogCi0gICAgICAgIGNhc2UgOTU6IAotICAgICAgICBjYXNlIDE2NDogCi0gICAgICAgIGNhc2UgMTY1OiAKLSAgICAgICAgY2FzZSAxNjg6IAotICAgICAgICBjYXNlIDE2OTogCi0gICAgICAgIGNhc2UgMjIxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0pOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUY7Ci0gfQotICAgICAgICBjYXNlIDMyNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTY6IAotICAgICAgICBjYXNlIDk4OiAKLSAgICAgICAgY2FzZSA5OTogCi0gICAgICAgIGNhc2UgMTAwOiAKLSAgICAgICAgY2FzZSAxNzY6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgc3lzdGVtIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsKLSB9Ci0gICAgICAgIGNhc2UgMzI4OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDE6IAotICAgICAgICBjYXNlIDEwMzogCi0gICAgICAgIGNhc2UgMTA0OiAKLSAgICAgICAgY2FzZSAxODQ6IAotICAgICAgICBjYXNlIDE4NTogCi0gICAgICAgIGNhc2UgMTg4OiAKLSAgICAgICAgY2FzZSAxODk6IAotICAgICAgICBjYXNlIDIyNDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZWxlbWVudGRlY2wgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMyOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTA4OiAKLSAgICAgICAgY2FzZSAxMTA6IAotICAgICAgICBjYXNlIDExMTogCi0gICAgICAgIGNhc2UgMTk1OiAKLSAgICAgICAgY2FzZSAxOTY6IAotICAgICAgICBjYXNlIDE5OTogCi0gICAgICAgIGNhc2UgMjAwOiAKLSAgICAgICAgY2FzZSAyMjg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOwotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMzMTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzMyOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfRU5EX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMzM6IGJyZWFrOwotICAgICAgICBjYXNlIDExNTogCi0gICAgICAgIGNhc2UgMTE2OiAKLSAgICAgICAgICB7IAotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsKLQkgfQotICAgICAgICBjYXNlIDMzNDogYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IAotICAgICAgICAgIGlmICh5eV9pbnB1dCA9PSBZWUVPRiAmJiB5eV9zdGFydFJlYWQgPT0geXlfY3VycmVudFBvcykgewotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOwotICAgICAgICAgICAgeXlfZG9fZW9mKCk7Ci0gICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB5eV9TY2FuRXJyb3IoWVlfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEzZGFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL1hNTFRva2VuaXplci5qZmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEzMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuDQotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscw0KLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMA0KLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0DQotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwNCi0gKiANCi0gKiBDb250cmlidXRvcnM6DQotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbg0KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLS8qbmxzWFhYKi8NCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7DQotDQotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0Ow0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7DQotaW1wb3J0IGphdmEudXRpbC5MaXN0Ow0KLQ0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tUb2tlbml6ZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOw0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsNCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU3RyaW5nVXRpbHM7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7DQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5Ow0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0Ow0KLQ0KLSUlDQotDQotJXsNCi0JcHJpdmF0ZSBpbnQgZlRva2VuQ291bnQgPSAwOw0KLSANCi0JLy8gcmVxdWlyZWQgaG9sZGVycyBmb3Igd2hpdGUtc3BhY2UgY29tcGFjdGluZw0KLQlwcml2YXRlIGJvb2xlYW4gZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlwcml2YXRlIGludCBmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOw0KLQ0KLQkvLyBzdGF0ZSBzdGFjayBmb3IgaGFuZGxpbmcgZW1iZWRkZWQgcmVnaW9ucw0KLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7DQotDQotCXByaXZhdGUgU3RyaW5nIGNvbnRleHQgPSBudWxsOw0KLQlwcml2YXRlIGludCBzdGFydCA9IDA7DQotCXByaXZhdGUgaW50IHRleHRMZW5ndGggPSAwOw0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOw0KLQ0KLQkvLyBvZmZzZXQgZm9yIHRyYWNraW5nIHBvc2l0aW9uIHNwZWNpZmljIGJsb2NrIHRhZ3MNCi0JcHJpdmF0ZSBpbnQgZk9mZnNldCA9IDA7DQotCQ0KLQkvLyB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0YWcgYmVpbmcgb3BlbmVkDQotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotDQotCS8vIHRoZSBsaXN0IG9mIHRhZyBuYW1lIEJsb2NrTWFya2Vycw0KLQlwcml2YXRlIExpc3QgZkJsb2NrTWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsNCi0NCi0JLy8gcmVxdWlyZWQgdG8gbm90IHNlZWsgdGV4dCBibG9ja3Mgb24gYW4gZW5kIHRhZw0KLQlwcml2YXRlIGJvb2xlYW4gZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOw0KLQ0KLQlwcml2YXRlIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgZlJlZ2lvbkZhY3RvcnkgPSBuZXcgWE1MUGFyc2VyUmVnaW9uRmFjdG9yeSgpOw0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQlpZihjb250YWluc1RhZ05hbWUobWFya2VyLmdldFRhZ05hbWUoKSkpDQotCQlyZXR1cm47DQotCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqLw0KLXB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZUJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgew0KLQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCANCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSkgew0KLQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7DQotCQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCQl3aGlsZSAoYmxvY2tzLmhhc05leHQoKSkgew0KLQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQ0KLQkJCQlibG9ja3MucmVtb3ZlKCk7DQotCQl9DQotCX0NCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsNCi0JcmV0dXJuIGZJc0Nhc2VTZW5zaXRpdmVCbG9ja2luZzsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlQmxvY2tpbmcoYm9vbGVhbiBuZXdWYWx1ZSkgew0KLQlmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBuZXdWYWx1ZTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgYm9vbGVhbiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpIHsNCi0gICAgICAgIHJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7DQotCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkJsb2NrTWFya2Vycy5pdGVyYXRvcigpOw0KLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7DQotCQlib29sZWFuIGNhc2VzZW5zaXRpdmUgPSBtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCk7DQotCQlpZihjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG5hbWUpKQ0KLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOw0KLQkJZWxzZSBpZighY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpDQotCQkJcmV0dXJuIGNhc2VzZW5zaXRpdmU7DQotCX0NCi0JcmV0dXJuIHRydWU7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoKSB7DQotCXJldHVybiBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dChTdHJpbmcgbmFtZSkgew0KLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsNCi0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7DQotCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpaXRlcmF0b3IubmV4dCgpOw0KLQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpDQotCQkJcmV0dXJuIG1hcmtlci5nZXRDb250ZXh0KCk7DQotCX0NCi0JcmV0dXJuIEJMT0NLX1RFWFQ7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgew0KLQlyZXR1cm4gZkJsb2NrTWFya2VyczsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgZmluYWwgaW50IGdldE9mZnNldCgpIHsNCi0JcmV0dXJuIGZPZmZzZXQgKyB5eWNoYXI7DQotfQ0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKCkgew0KLQlyZXR1cm4gaXNCbG9ja01hcmtlcihmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi1wcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSkgew0KLQlpZiAoIWZJc0Jsb2NraW5nRW5hYmxlZCkNCi0JCXJldHVybiBmYWxzZTsNCi0JcmV0dXJuIGNvbnRhaW5zVGFnTmFtZSh0YWdOYW1lKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKi8NCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgew0KLQliZWdpbkJsb2NrTWFya2VyU2NhbihuZXdUYWdOYW1lLCBCTE9DS19URVhUKTsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlDQotICogc3RhcnQgb2YgYSB0ZXh0IGJsb2NrIHdpdGhpbiBhICJuZXdUYWdOYW1lIiB0YWcuDQotICoNCi0gKiBFeGFtcGxlOiANCi0gKglUb2tlbml6ZXIgdG9rZXIgPSBuZXcgVG9rZW5pemVyKCk7DQotICoJdG9rZXIuc2V0Q2FzZVNlbnNpdGl2ZUJsb2NraW5nKGZhbHNlKTsNCi0gKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7DQotICoJdG9rZXIuYmVnaW5CbG9ja01hcmtlclNjYW4oInNjcmlwdCIsIEJMT0NLX1RFWFQpOw0KLSAqCXRva2VyLmdldFJlZ2lvbnMoKTsgDQotICoNCi0gKiBSZXR1cm5zOg0KLSAqCUJMT0NLX1RFWFQ6IDAtNDANCi0gKglYTUxfRU5EX1RBR19PUEVOOiA0MS00Mg0KLSAqCVhNTF9UQUdfTkFNRTogNDMtNDgNCi0gKglYTUxfVEFHX0NMT1NFOiA0OS00OQ0KLSAqCVhNTF9DT05URU5UOiA1MC01Nw0KLSAqDQotICovDQotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsNCi0JeXliZWdpbihTVF9CTE9DS19UQUdfU0NBTik7DQotCWZDdXJyZW50VGFnTmFtZSA9IG5ld1RhZ05hbWU7DQotfQ0KLS8qKg0KLSAqIE1ldGhvZCBkb1NjYW4uDQotICogDQotICogUmV0dXJucyBhIGNvbnRleHQgcmVnaW9uIGZvciBhbGwgb2YgdGhlIHRleHQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiB1cHRvIHRoZSBlbmQgb2YgaW5wdXQgb3INCi0gKiB0byByaWdodCAqYmVmb3JlKiB0aGUgZmlyc3Qgb2NjdXJlbmNlIG9mIHNlYXJjaFN0cmluZw0KLSAqIA0KLSAqIEBwYXJhbSBzZWFyY2hTdHJpbmcgLSB0YXJnZXQgc3RyaW5nIHRvIHNlYXJjaCBmb3IgZXguOiAiLS0+IiwgIjwvdGFnbmFtZSINCi0gKiBAcGFyYW0gcmVxdWlyZVRhaWxTZXBhcmF0b3IgLSB3aGV0aGVyIHRoZSB0YXJnZXQgbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIG9yICc+Jw0KLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aA0KLSAqIEBwYXJhbSBleGl0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHJlZ2lvbiB3YXMgb2Ygbm9uLXplcm8gbGVuZ3RoDQotICogQHBhcmFtIGFib3J0U3RhdGUgLSB0aGUgc3RhdGUgdG8gZ28gdG8gaWYgdGhlIHNlYXJjaFN0cmluZyB3YXMgZm91bmQgaW1tZWRpYXRlbHkNCi0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzDQotICogQHRocm93cyBJT0V4Y2VwdGlvbg0KLSAqLw0KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCWJvb2xlYW4gc3RpbGxTZWFyY2hpbmcgPSB0cnVlOw0KLQkvLyBEaXNhYmxlIGZ1cnRoZXIgYmxvY2sgKHByb2JhYmx5KQ0KLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsNCi0JaW50IHNlYXJjaFN0cmluZ0xlbmd0aCA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsNCi0JaW50IG4gPSAwOw0KLQljaGFyIGxhc3RDaGVja0NoYXI7DQotCWludCBpOw0KLQlib29sZWFuIHNhbWUgPSBmYWxzZTsNCi0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7DQotCQluID0gMDsNCi0JCS8vIEVuc3VyZSB0aGF0IGVub3VnaCBkYXRhIGZyb20gdGhlIGlucHV0IGV4aXN0cyB0byBjb21wYXJlIGFnYWluc3QgdGhlIHNlYXJjaCBTdHJpbmcuDQotCQluID0geXlfYWR2YW5jZSgpOw0KLQkJd2hpbGUobiAhPSBZWUVPRiAmJiB5eV9jdXJyZW50UG9zIDwgc2VhcmNoU3RyaW5nTGVuZ3RoKQ0KLQkJCW4gPSB5eV9hZHZhbmNlKCk7DQotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5Lg0KLQkJaWYgKG4gPT0gWVlFT0YpIHsNCi0JCQlzdGlsbFNlYXJjaGluZyA9IGZhbHNlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJc2FtZSA9IHRydWU7DQotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQNCi0JCQkvLyB0aHVzIGZvdW5kIHR3aWNlIGF0IGN1cnJlbnQtdGFyZ2V0TGVuZ3RoIFtzaW5jZSB0aGUgZmlyc3Qgc2NhbiB3b3VsZCBoYXZlIGNvbWUgb3V0IHRoaXMgZmFyIGFueXdheV0uDQotCQkJLy8gQ2hlY2sgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHRhcmdldCB2ZXJzdXMgdGhlIGxhc3QgdGFyZ2V0TGVuZ3RoIGNoYXJhY3RlcnMgcmVhZCBmcm9tIHRoZSBidWZmZXINCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMNCi0JCQkNCi0JCQkvLyBzYWZldHkgY2hlY2sgZm9yIGFycmF5IGFjY2Vzc2VzICh5eV9jdXJyZW50UG9zIGlzIHRoZSAqbGFzdCogY2hhcmFjdGVyIHdlIGNhbiBjaGVjayBhZ2FpbnN0KQ0KLQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgew0KLQkJCQlmb3IoaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdMZW5ndGg7IGkrKykgew0KLQkJCQkJaWYoc2FtZSAmJiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpDQotCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsNCi0JCQkJCWVsc2UgaWYoc2FtZSAmJiAhZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQ0KLQkJCQkJCXNhbWUgPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UoeXlfYnVmZmVyW2kgKyB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoXSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHNlYXJjaFN0cmluZy5jaGFyQXQoaSkpOw0KLQkJCQl9DQotCQkJfQ0KLQkJCS8vIHNhZmV0eSBjaGVjayBmYWlsZWQ7IG5vIG1hdGNoIGlzIHBvc3NpYmxlIHJpZ2h0IG5vdw0KLQkJCWVsc2Ugew0KLQkJCQlzYW1lID0gZmFsc2U7DQotCQkJfQ0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7DQotCQkJCS8vIEFkZGl0aW9uYWwgY2hlY2sgZm9yIGNsb3NlIHRhZ3MgdG8gZW5zdXJlIHRoYXQgdGFyZ2V0U3RyaW5nPSI8L3NjcmlwdCIgZG9lc24ndCBtYXRjaA0KLQkJCQkvLyAiPC9zY3JpcHRTIg0KLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOw0KLQkJCQkvLyBTdWNjZWVkIG9uICI8L3NjcmlwdD4iIGFuZCAiPC9zY3JpcHQgIg0KLQkJCQlpZihsYXN0Q2hlY2tDaGFyID09ICc+JyB8fCBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGxhc3RDaGVja0NoYXIpKQ0KLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsNCi0JCQl9DQotCQkJZWxzZSB7DQotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOw0KLQkJCX0NCi0JCX0NCi0JfQ0KLQlpZiAobiAhPSBZWUVPRiB8fCBzYW1lKSB7DQotCQkvLyBXZSd2ZSBzdG9wcGVkIHNob3J0IG9mIHRoZSBlbmQgb3IgZGVmaW5pdGVseSBmb3VuZCBhIG1hdGNoDQotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOw0KLQkJeXlfY3VycmVudFBvcyA9IHl5X21hcmtlZFBvcyArIDE7DQotCQkvLyBJZiB0aGUgc2VhcmNoU3RyaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQ0KLQkJaWYgKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpIHsNCi0JCQl5eWJlZ2luKGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpOw0KLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7DQotCQl9DQotCX0NCi0JZWxzZSB7DQotCQkvLyBXZSByYW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgaW5wdXQNCi0JCXl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7DQotCQl5eV9jdXJyZW50UG9zKys7DQotCX0NCi0JeXliZWdpbihleGl0U3RhdGUpOw0KLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlDQotCS8vIGJlZW4gYSBCbG9jaywgcmVzdW1lIHNjYW5uaW5nIG5vcm1hbGx5IGltbWVkaWF0ZWx5DQotCWlmKHl5X21hcmtlZFBvcyA9PSB5eV9zdGFydFJlYWQpDQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOw0KLQlyZXR1cm4gc2VhcmNoQ29udGV4dDsNCi19DQotLyoqDQotICogdXNlciBtZXRob2QNCi0gKg0KLSAqIEEgZ2VuZXJpYyBsb29rYWhlYWQtbGlrZSBvcGVyYXRpb24NCi0gKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBkb0Jsb2NrU2NhbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgdGFyZ2V0Q29udGV4dCwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCXJldHVybiBkb1NjYW4odGFyZ2V0LCBmYWxzZSwgdGFyZ2V0Q29udGV4dCwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7DQotfQ0KLS8qKg0KLSAqIHVzZXIgbWV0aG9kIA0KLSAqIGRvZXMgYSBsb29rYWhlYWQgZm9yIHRoZSBjdXJyZW50IHRhZyBuYW1lDQotICovDQotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLSAgICAgICAgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKTsNCi0JcmV0dXJuIGRvU2NhbigiPC8iICsgZkN1cnJlbnRUYWdOYW1lLCB0cnVlLCBnZXRCbG9ja01hcmtlckNvbnRleHQoZkN1cnJlbnRUYWdOYW1lKSwgWVlJTklUSUFMLCBZWUlOSVRJQUwpOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZA0KLSAqDQotICogQ29udmVydHMgdGhlIHJhdyBjb250ZXh0IFN0cmluZyByZXR1cm5lZCBieSB0aGUgcHJpbUdldE5leHRUb2tlbigpDQotICogbWV0aG9kIGludG8gYSBmdWxsIElUZXh0UmVnaW9uIGJ5IHB1bGxpbmcgaW4gdmFsdWVzIGZvciB0aGUNCi0gKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuDQotICoNCi0gKiBSZXR1cm5zIG51bGwgd2hlbiBFT0YgaXMgZW5jb3VudGVyZWQgYW5kIGF0dGFjaGVzIGludGVybWl0dGVudGx5DQotICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4NCi0gKg0KLSAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWNoZXMgdGhlIHRva2VuIGZvbGxvd2luZyB0aGUgb25lIGJlaW5nIHJldHVybmVkDQotICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuDQotICovDQotcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7DQotCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykNCi0JaWYgKGZTaG91bGRMb2FkQnVmZmVyZWQpIHsNCi0JCWNvbnRleHQgPSBmQnVmZmVyZWRDb250ZXh0Ow0KLQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsNCi0JCXRleHRMZW5ndGggPSBsZW5ndGggPSBmQnVmZmVyZWRMZW5ndGg7DQotCQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7DQotCX0NCi0JZWxzZSB7DQotCQljb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOw0KLQkJaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7DQotCQkJaWYoY29udGFpbnNUYWdOYW1lKHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkKSkNCi0JCQkJZkN1cnJlbnRUYWdOYW1lID0geXl0ZXh0KCk7DQotCQkJZWxzZQ0KLQkJCQlmQ3VycmVudFRhZ05hbWUgPSBudWxsOw0KLQkJfQ0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsNCi0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOw0KLQkJfQ0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7DQotCQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCQl9DQotCQlzdGFydCA9IHl5Y2hhcjsNCi0JCXRleHRMZW5ndGggPSBsZW5ndGggPSB5eWxlbmd0aCgpOw0KLQkJaWYgKHl5X2F0RU9GKSB7DQotCQkJZlRva2VuQ291bnQrKzsNCi0JCQlyZXR1cm4gbnVsbDsNCi0JCX0NCi0JfQ0KLQkvLyBzdG9yZSB0aGUgbmV4dCB0b2tlbg0KLQlmX2NvbnRleHQgPSBwcmltR2V0TmV4dFRva2VuKCk7DQotCWlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7DQotCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQ0KLQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOw0KLQkJZWxzZQ0KLQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7DQotCX0NCi0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gdHJ1ZTsNCi0JfQ0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgew0KLQkJZklzQmxvY2tpbmdFbmFibGVkID0gZmFsc2U7DQotCX0NCi0JZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsNCi0JZkJ1ZmZlcmVkU3RhcnQgPSB5eWNoYXI7DQotCWZCdWZmZXJlZExlbmd0aCA9IHl5bGVuZ3RoKCk7DQotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOw0KLQlpZiAoZkJ1ZmZlcmVkQ29udGV4dCA9PSBXSElURV9TUEFDRSkgew0KLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsNCi0JfQ0KLQlpZiAoY29udGV4dCA9PSBudWxsKSB7DQotCQkvLyBFT0YNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgZGlzY292ZXJlZCAiICsgZlRva2VuQ291bnQgKyAiIHRva2Vucy4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JCXJldHVybiBudWxsOw0KLQl9DQotCWZUb2tlbkNvdW50Kys7DQotCXJldHVybiBmUmVnaW9uRmFjdG9yeS5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBmQ3VycmVudFRhZ05hbWUpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyBYTUxUb2tlbml6ZXIoKXsNCi0Jc3VwZXIoKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgWE1MVG9rZW5pemVyKGNoYXJbXSBjaGFyQXJyYXkpew0KLQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOw0KLX0NCi0vKiB1c2VyIG1ldGhvZCAqLw0KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsNCi0JcmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihjaGFyQXJyYXkpLCAwKTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KSB7DQotCXJlc2V0KG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhckFycmF5KSwgbmV3T2Zmc2V0KTsNCi19DQotLyogdXNlciBtZXRob2QgKi8NCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLklucHV0U3RyZWFtIGluKSB7DQotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgew0KLQlyZXNldChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihpbiksIG5ld09mZnNldCk7DQotfQ0KLS8qIHVzZXIgbWV0aG9kICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4pIHsNCi0JcmVzZXQoaW4sIDApOw0KLX0NCi0vKioNCi0gKiB1c2VyIG1ldGhvZCAqDQotICoNCi0gKiBSZXNldCBpbnRlcm5hbCBjb3VudGVycyBhbmQgdmFycyB0byAibmV3bHkgY3JlYXRlZCIgdmFsdWVzLCBpbiB0aGUgaG9wZXMNCi0gKiB0aGF0IHJlc2V0dGluZyBhIHByZS1leGlzdGluZyB0b2tlbml6ZXIgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgb25lLg0KLSAqDQotICogVGhpcyBtZXRob2QgY29udGFpbnMgY29kZSBibG9ja3MgdGhhdCB3ZXJlIGVzc2VudGlhbGx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUNCi0gKiA8ZW0+Z2VuZXJhdGVkPC9lbT4gb3V0cHV0IG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBiZWZvcmUgdGhpcyBtZXRob2Qgd2FzDQotICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuDQotICovDQotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgaW4sIGludCBuZXdPZmZzZXQpIHsNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlc2V0dGluZyB0b2tlbml6ZXIiKTsvLyROT04tTkxTLTEkDQotCX0NCi0JZk9mZnNldCA9IG5ld09mZnNldDsNCi0NCi0JLyogdGhlIGlucHV0IGRldmljZSAqLw0KLQl5eV9yZWFkZXIgPSBpbjsNCi0NCi0JLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLw0KLQl5eV9zdGF0ZSA9IDA7DQotDQotCS8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8NCi0JeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsNCi0NCi0JLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcw0KLQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0JamF2YS51dGlsLkFycmF5cy5maWxsKHl5X2J1ZmZlciwgKGNoYXIpMCk7DQotDQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovDQotCXl5X21hcmtlZFBvcyA9IDA7DQotDQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotCXl5X3B1c2hiYWNrUG9zID0gMDsNCi0NCi0JLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovDQotCXl5X2N1cnJlbnRQb3MgPSAwOw0KLQ0KLQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8NCi0JeXlfc3RhcnRSZWFkID0gMDsNCi0NCi0JLyoqIA0KLQkgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQNCi0JICogZnJvbSBpbnB1dCANCi0JICovDQotCXl5X2VuZFJlYWQgPSAwOw0KLQ0KLQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0JeXlsaW5lID0gMDsNCi0NCi0JLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovDQotCXl5Y2hhciA9IDA7DQotDQotCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8NCi0JeXlfYXRFT0YgPSBmYWxzZTsNCi0NCi0JLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovDQotCXl5X2VvZl9kb25lID0gZmFsc2U7DQotDQotDQotCS8qIHVzZXIgdmFyczogKi8NCi0JZlRva2VuQ291bnQgPSAwOw0KLSANCi0JZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOw0KLQlmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsNCi0JZkJ1ZmZlcmVkU3RhcnQgPSAxOw0KLQlmQnVmZmVyZWRMZW5ndGggPSAwOw0KLQlmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOw0KLQ0KLQljb250ZXh0ID0gbnVsbDsNCi0Jc3RhcnQgPSAwOw0KLQl0ZXh0TGVuZ3RoID0gMDsNCi0JbGVuZ3RoID0gMDsNCi19DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZA0KLQkgKg0KLQkgKi8NCi0JcHVibGljIEJsb2NrVG9rZW5pemVyIG5ld0luc3RhbmNlKCkgew0KLQkJWE1MVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IFhNTFRva2VuaXplcigpOw0KLQkJLy8gZ2xvYmFsIHRhZ21hcmtlcnMgY2FuIGJlIHNoYXJlZDsgdGhleSBoYXZlIG5vIHN0YXRlIGFuZCANCi0JCS8vIGFyZSBuZXZlciBkZXN0cm95ZWQgKGUuZy4gJ3JlbGVhc2UnKQ0KLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsNCi0JCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9IChCbG9ja01hcmtlcikgZkJsb2NrTWFya2Vycy5nZXQoaSk7DQotCQkJaWYoYmxvY2tNYXJrZXIuaXNHbG9iYWwoKSkNCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOw0KLQkJfQ0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOw0KLQl9DQotLyogdXNlciBtZXRob2QgKi8NCi1wcml2YXRlIGZpbmFsIFN0cmluZyBzY2FuWE1MQ29tbWVudFRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24gew0KLQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMNCi0JLy8gICBYTUxfQ09NTUVOVF9URVhUIHVubGVzcyB0aGUgc3RyaW5nIG9jY3VycyBJTU1FRElBVEVMWSwgaW4gd2hpY2gNCi0JLy8gIGNhc2UgY2hhbmdlIHRvIHRoZSBTVF9YTUxfQ09NTUVOVF9FTkQgc3RhdGUgYW5kIHJldHVybiB0aGUgbmV4dA0KLQkvLyAgY29udGV4dCBhcyB1c3VhbC4NCi0JcmV0dXJuIGRvU2NhbigiLS0+IiwgZmFsc2UsIFhNTF9DT01NRU5UX1RFWFQsIFNUX1hNTF9DT01NRU5UX0VORCwgU1RfWE1MX0NPTU1FTlRfRU5EKTsNCi19DQotJX0NCi0NCi0lZW9mew0KLS8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iDQotJWVvZn0NCi0NCi0lcHVibGljDQotJWNsYXNzIFhNTFRva2VuaXplcg0KLSVpbXBsZW1lbnRzIEJsb2NrVG9rZW5pemVyLCBET01SZWdpb25Db250ZXh0DQotJWZ1bmN0aW9uIHByaW1HZXROZXh0VG9rZW4NCi0ldHlwZSBTdHJpbmcNCi0lY2hhcg0KLSVsaW5lDQotJXVuaWNvZGUNCi0lcGFjaw0KLQ0KLSVzdGF0ZSBTVF9DREFUQV9URVhUDQotJXN0YXRlIFNUX0NEQVRBX0VORA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVA0KLSVzdGF0ZSBTVF9YTUxfQ09NTUVOVF9FTkQNCi0lc3RhdGUgU1RfUEkNCi0lc3RhdGUgU1RfUElfV1MNCi0lc3RhdGUgU1RfUElfQ09OVEVOVA0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfWE1MX1BJX0VRVUFMUw0KLSVzdGF0ZSBTVF9YTUxfUElfQVRUUklCVVRFX1ZBTFVFDQotJXN0YXRlIFNUX1hNTF9QSV9UQUdfQ0xPU0UNCi0lc3RhdGUgU1RfREhUTUxfQVRUUklCVVRFX05BTUUNCi0lc3RhdGUgU1RfREhUTUxfRVFVQUxTDQotJXN0YXRlIFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRQ0KLSVzdGF0ZSBTVF9ESFRNTF9UQUdfQ0xPU0UNCi0NCi0vLyBub3JtYWwgdGFnIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfVEFHX05BTUUNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9OQU1FDQotJXN0YXRlIFNUX1hNTF9FUVVBTFMNCi0lc3RhdGUgU1RfWE1MX0FUVFJJQlVURV9WQUxVRQ0KLQ0KLS8vIGRlY2xhcmF0aW9uIChEVEQpIHN0YXRlcw0KLSVzdGF0ZSBTVF9YTUxfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFDQotDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9ODQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEDQotJXN0YXRlIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQw0KLSVzdGF0ZSBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0NCi0NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04NCi0lc3RhdGUgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVA0KLQ0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTg0KLSVzdGF0ZSBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UDQotDQotJXN0YXRlIFNUX0JMT0NLX1RBR19TQ0FODQotDQotLy8gTGV0dGVyID0gKFtBLVphLXpdKQ0KLS8vIERpZ2l0ID0gKFswLTldKQ0KLQ0KLS8qKg0KLSAqIHNtYWxsZXIgdG9rZW5zDQotICovDQotZ2VuZXJpY1RhZ09wZW4gICAgICAgPSA8DQotZ2VuZXJpY1RhZ0Nsb3NlICAgICAgPSA+DQotZ2VuZXJpY0VuZFRhZ09wZW4gICAgPSA8XC8NCi1nZW5lcmljRW1wdHlUYWdDbG9zZSA9IFwvPg0KLQ0KLVBJc3RhcnQgPSA8XD8NCi1QSWVuZCAgID0gXD8+DQotDQotDQotLy8gWzFdIGRvY3VtZW50IDo6PSBwcm9sb2cgZWxlbWVudCBNaXNjKg0KLWRvY3VtZW50ID0gKHtwcm9sb2d9IHtlbGVtZW50fSB7TWlzY30qKQ0KLQ0KLS8vIFsyXSBDaGFyIDo6PSAjeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdDQotIC8vQ2hhciA9ICguKQ0KLUNoYXIgPSBbXHgwOVx4MEFceDBEXHgyMC1cdUQ3RkZcdUUwMDAtXHVGRkZEXSANCi0NCi0vLyBbM10gUyA6Oj0gKDB4MjAgfCAweDkgfCAweEQgfCAweEEpKw0KLVMgPSBbXHgyMFx4MDlceDBEXHgwQV0rDQotDQotLy8gWzRdIE5hbWVDaGFyIDo6PSBMZXR0ZXIgfCBEaWdpdCB8ICcuJyB8ICctJyB8ICdfJyB8ICc6JyB8IENvbWJpbmluZ0NoYXIgfCBFeHRlbmRlcg0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IFwuIHwgXC0gfCBfIHwgOiB8IHtDb21iaW5pbmdDaGFyfSB8IHtFeHRlbmRlcn0pDQotDQotLy8gWzVdIE5hbWUgOjo9IChMZXR0ZXIgfCAnXycgfCAnOicpIE5hbWVDaGFyKg0KLS8vTmFtZSA9ICh7TmFtZUNoYXJ9e05hbWVDaGFyfSopDQotTmFtZSA9ICh7TGV0dGVyfSB8IF8gfCA6KXtOYW1lQ2hhcn0qDQotDQotLy8gWzZdIE5hbWVzIDo6PSB7TmFtZX0gKHtTfSB7TmFtZX0pKg0KLU5hbWVzID0gKHtOYW1lfSAoe1N9IHtOYW1lfSkqKQ0KLQ0KLS8vIFs3XSBObXRva2VuIDo6PSAoTmFtZUNoYXIpKw0KLU5tdG9rZW4gPSAoe05hbWVDaGFyfSspDQotDQotLy8gWzhdIE5tdG9rZW5zIDo6PSBObXRva2VuIChTIE5tdG9rZW4pKg0KLU5tdG9rZW5zID0gKHtObXRva2VufSAoe1N9IHtObXRva2VufSkqKQ0KLQ0KLS8vIFs5XSBFbnRpdHlWYWx1ZSA6Oj0gJyInIChbXiUmIl0gfCBQRVJlZmVyZW5jZSB8IFJlZmVyZW5jZSkqICciJyB8ICAiJyIgKFteJSYnXSB8IFBFUmVmZXJlbmNlIHwgUmVmZXJlbmNlKSogIiciDQotRW50aXR5VmFsdWUgPSAoXCIgKFteJSZcIl0gfCB7UEVSZWZlcmVuY2V9IHwge1JlZmVyZW5jZX0pKiBcIiB8ICBcJyAoW14lJlwnXSB8IHtQRVJlZmVyZW5jZX0gfCB7UmVmZXJlbmNlfSkqIFwnKQ0KLQ0KLS8vIFsxMF0gQXR0VmFsdWUgOjo9ICciJyAoW148JiJdIHwgUmVmZXJlbmNlKSogJyInIHwgICInIiAoW148JiddIHwgUmVmZXJlbmNlKSogIiciDQotQXR0VmFsdWUgPSAoIFwiIChbXjxcIl0gfCB7UmVmZXJlbmNlfSkqIFwiIHwgXCcgKFtePFwnXSB8IHtSZWZlcmVuY2V9KSogXCcgIHwgKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkNCi0NCi0vLyBbMTFdIFN5c3RlbUxpdGVyYWwgOjo9ICgnIicgW14iXSogJyInKSB8ICgiJyIgW14nXSogIiciKSANCi1TeXN0ZW1MaXRlcmFsID0gKChcIiBbXlwiXSogXCIpIHwgKFwnIFteXCddKiBcJykpIA0KLQ0KLS8vIFsxMl0gUHViaWRMaXRlcmFsIDo6PSAnIicgUHViaWRDaGFyKiAnIicgfCAiJyIgKFB1YmlkQ2hhciAtICInIikqICInIg0KLVB1YmlkTGl0ZXJhbCA9IChcIiB7UHViaWRDaGFyfSogXCIgfCBcJyAoe1B1YmlkQ2hhcn1cJykqICInIikNCi0NCi0vLyBbMTNdIFB1YmlkQ2hhciA6Oj0gI3gyMCB8ICN4RCB8ICN4QSB8IFthLXpBLVowLTldIHwgWy0nKCkrLC4vOj0/OyEqI0AkXyVdDQotUHViaWRDaGFyID0gKFtcMDQwXDAxNVwwMTJdIHwgW2EtekEtWjAtOV0gfCBbXC1cJygpXCssLlwvOj0/OyFcKiNAXCRfJV0pDQotDQotLy8gWzE0XSBDaGFyRGF0YSA6Oj0gW148Jl0qIC0gKFtePCZdKiAnXV0+JyBbXjwmXSopDQotLy8gaW1wbGVtZW50IGxvb2thaGVhZCBiZWhhdmlvciBkdXJpbmcgYWN0aW9uIGRlZmluaXRpb24NCi1DaGFyRGF0YSA9IChbXjwmKFxdXF0+KV0qKQ0KLQ0KLS8vIFsxNV0gQ29tbWVudCA6Oj0gJzwhLS0nICgoQ2hhciAtICctJykgfCAoJy0nIChDaGFyIC0gJy0nKSkpKiAnLS0+Jw0KLUNvbW1lbnRTdGFydCA9ICg8IVwtXC0pDQotQ29tbWVudEVuZCAgID0gKFwtXC0+KQ0KLUNvbW1lbnQgPSAoe0NvbW1lbnRTdGFydH0uKntDb21tZW50RW5kfSkNCi0NCi0vLyBbMTZdIFBJIDo6PSAnPD8nIFBJVGFyZ2V0IChTIChDaGFyKiAtIChDaGFyKiAnPz4nIENoYXIqKSkpPyAnPz4nDQotUEkgPSAoPFw/e1BJVGFyZ2V0fSB7Q2hhcn0qIFw/PikNCi0NCi0vLyBbMTddIFBJVGFyZ2V0IDo6PSBOYW1lIC0gKCgnWCcgfCAneCcpICgnTScgfCAnbScpICgnTCcgfCAnbCcpKQ0KLVBJVGFyZ2V0ID0gKHtOYW1lfSgoWHx4KShNfG0pKEx8bCkpKQ0KLQ0KLS8vIFsxOF0gQ0RTZWN0IDo6PSBDRFN0YXJ0IENEYXRhIENERW5kDQotQ0RTZWN0ID0gKHtDRFN0YXJ0fXtDRGF0YX17Q0RFbmR9KQ0KLQ0KLS8vIFsxOV0gQ0RTdGFydCA6Oj0gJzwhW0NEQVRBWycNCi1DRFN0YXJ0ID0gPCFcW0NEQVRBXFsNCi0NCi0vLyBbMjBdIENEYXRhIDo6PSAoQ2hhciogLSAoQ2hhciogJ11dPicgQ2hhciopKSANCi0vLyBpbXBsZW1lbnQgbG9va2FoZWFkIGJlaGF2aW9yIGR1cmluZyBhY3Rpb24gZGVmaW5pdGlvbg0KLUNEYXRhID0gKFteKFxdXF0+KV0qKQ0KLQ0KLS8vIFsyMV0gQ0RFbmQgOjo9ICddXT4nDQotQ0RFbmQgPSAoXF1cXT4pDQotDQotLy8gWzIyXSBwcm9sb2cgOjo9IFhNTERlY2w/IE1pc2MqIChkb2N0eXBlZGVjbCBNaXNjKik/DQotcHJvbG9nID0gKHtYTUxEZWNsfT8ge01pc2N9KiAoe2RvY3R5cGVkZWNsfSB7TWlzY30qKT8pDQotDQotLy8gWzIzXSBYTUxEZWNsIDo6PSAnPD94bWwnIFZlcnNpb25JbmZvIEVuY29kaW5nRGVjbD8gU0REZWNsPyBTPyAnPz4nDQotWE1MRGVjbCA9ICg8XD94bWwge1ZlcnNpb25JbmZvfSB7RW5jb2RpbmdEZWNsfT8ge1NERGVjbH0/IHtTfT8gXD8+KQ0KLQ0KLS8vIFsyNF0gVmVyc2lvbkluZm8gOjo9IFMgJ3ZlcnNpb24nIEVxICgnIFZlcnNpb25OdW0gJyB8ICIgVmVyc2lvbk51bSAiKQ0KLVZlcnNpb25JbmZvID0gKHtTfXZlcnNpb257RXF9KFwne1ZlcnNpb25OdW19XCcgfCBcIntWZXJzaW9uTnVtfVwiKSkNCi0NCi0vLyBbMjVdIEVxIDo6PSBTPyAnPScgUz8NCi1FcSA9IChcPSkNCi0NCi0vLyBbMjZdIFZlcnNpb25OdW0gOjo9IChbYS16QS1aMC05Xy46XSB8ICctJykrDQotVmVyc2lvbk51bSA9ICgoW2EtekEtWjAtOV8uOl18XC0pKykNCi0NCi0vLyBbMjddIE1pc2MgOjo9IENvbW1lbnQgfCBQSSB8ICBTDQotTWlzYyA9ICh7Q29tbWVudH0gfCB7UEl9IHwge1N9KQ0KLQ0KLS8vIFsyOF0gZG9jdHlwZWRlY2wgOjo9ICc8IURPQ1RZUEUnIFMgTmFtZSAoUyBFeHRlcm5hbElEKT8gIFM/ICgnWycgKG1hcmt1cGRlY2wgfCBQRVJlZmVyZW5jZSB8IFMpKiAnXScgUz8pPyAnPicNCi1kb2N0eXBlZGVjbCA9ICg8XCFET0NUWVBFe1N9e05hbWV9ICh7U317RXh0ZXJuYWxJRH0pPyB7U30/IChcWyAoe21hcmt1cGRlY2x9fHtQRVJlZmVyZW5jZX18e1N9KSogXF17U30/KT8+KQ0KLQ0KLS8vIFsyOV0gbWFya3VwZGVjbCA6Oj0gZWxlbWVudGRlY2wgfCBBdHRsaXN0RGVjbCB8IEVudGl0eURlY2wgfCBOb3RhdGlvbkRlY2wgfCBQSSB8IENvbW1lbnQNCi1tYXJrdXBkZWNsID0gKHtlbGVtZW50ZGVjbH0gfCB7QXR0bGlzdERlY2x9IHwge0VudGl0eURlY2x9IHwge05vdGF0aW9uRGVjbH0gfCB7UEl9IHwge0NvbW1lbnR9KQ0KLQ0KLS8vIFszMF0gZXh0U3Vic2V0IDo6PSBUZXh0RGVjbD8gZXh0U3Vic2V0RGVjbA0KLWV4dFN1YnNldCA9ICh7VGV4dERlY2x9PyB7ZXh0U3Vic2V0RGVjbH0pDQotDQotLy8gWzMxXSBleHRTdWJzZXREZWNsIDo6PSAoIG1hcmt1cGRlY2wgfCBjb25kaXRpb25hbFNlY3QgfCBQRVJlZmVyZW5jZSB8IFMgKSoNCi1leHRTdWJzZXREZWNsID0gKCgge21hcmt1cGRlY2x9IHwge2NvbmRpdGlvbmFsU2VjdH0gfCB7UEVSZWZlcmVuY2V9IHwge1N9ICkqKQ0KLQ0KLS8vIFszMl0gIFNERGVjbCAgOjo9IFMgJ3N0YW5kYWxvbmUnIEVxICgoIiciICgneWVzJyB8ICdubycpICInIikgfCAoJyInICgneWVzJyB8ICdubycpICciJykpDQotU0REZWNsICA9ICh7U31zdGFuZGFsb25le0VxfXtTfSooKFwnKHllc3xubylcJyl8KFwiKHllc3xubylcIikpKQ0KLQ0KLS8vIFszM10gIExhbmd1YWdlSUQgIDo6PSBMYW5nY29kZSAoJy0nIFN1YmNvZGUpKg0KLUxhbmd1YWdlSUQgID0gKHtMYW5nY29kZX0oXC17U3ViY29kZX0pKikNCi0NCi0vLyBbMzRdICBMYW5nY29kZSA6Oj0gSVNPNjM5Q29kZSB8ICBJYW5hQ29kZSB8ICBVc2VyQ29kZQ0KLUxhbmdjb2RlID0gKHtJU082MzlDb2RlfSB8ICB7SWFuYUNvZGV9IHwgIHtVc2VyQ29kZX0pDQotDQotLy8gWzM1XSAgSVNPNjM5Q29kZSA6Oj0gKFthLXpdIHwgW0EtWl0pIChbYS16XSB8IFtBLVpdKQ0KLUlTTzYzOUNvZGUgPSAoKFthLXpdfFtBLVpdKShbYS16XXxbQS1aXSkpDQotDQotLy8gWzM2XSAgSWFuYUNvZGUgOjo9ICgnaScgfCAnSScpICctJyAoW2Etel0gfCBbQS1aXSkrDQotSWFuYUNvZGUgPSAoKGl8SSlcLShbYS16XXxbQS1aXSkrKQ0KLQ0KLS8vIFszN10gIFVzZXJDb2RlIDo6PSAoJ3gnIHwgJ1gnKSAnLScgKFthLXpdIHwgW0EtWl0pKw0KLVVzZXJDb2RlID0gKCh4fFgpXC0oW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzhdICBTdWJjb2RlIDo6PSAoW2Etel0gfCBbQS1aXSkrDQotU3ViY29kZSA9ICgoW2Etel18W0EtWl0pKykNCi0NCi0vLyBbMzldICBlbGVtZW50ICA6Oj0gRW1wdHlFbGVtVGFnIHwgU1RhZyBjb250ZW50IEVUYWcNCi1lbGVtZW50ICA9ICh7RW1wdHlFbGVtVGFnfSB8IHtTVGFnfSB7Y29udGVudH0ge0VUYWd9KQ0KLQ0KLS8vIFs0MF0gIFNUYWcgIDo6PSAnPCcgTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnPicNCi1TVGFnID0gKDx7TmFtZX0oe1N9e0F0dHJpYnV0ZX0pKntTfT8+KQ0KLQ0KLS8vIFs0MV0gIEF0dHJpYnV0ZSA6Oj0gTmFtZSBFcSBBdHRWYWx1ZQ0KLUF0dHJpYnV0ZSA9ICh7TmFtZX17U30qe0VxfXtTfSp7QXR0VmFsdWV9KQ0KLQ0KLS8vIFs0Ml0gIEVUYWcgIDo6PSAnTmFtZSBTPyAnPicNCi1FVGFnID0gKDxcL3tOYW1lfXtTfT8+KQ0KLQ0KLS8vIFs0M10gIGNvbnRlbnQgIDo6PSAoZWxlbWVudCB8IENoYXJEYXRhIHwgUmVmZXJlbmNlIHwgQ0RTZWN0IHwgUEkgfCBDb21tZW50KSoNCi1jb250ZW50ID0gKCh7ZWxlbWVudH0gfCB7Q2hhckRhdGF9IHwge1JlZmVyZW5jZX0gfCB7Q0RTZWN0fSB8IHtQSX0gfCB7Q29tbWVudH0pKikNCi0NCi0vLyBbNDRdICBFbXB0eUVsZW1UYWcgIDo6PSAnPCcgTmFtZSAoUyBBdHRyaWJ1dGUpKiBTPyAnLz4nDQotRW1wdHlFbGVtVGFnID0gKDx7TmFtZX0oe1N9e0F0dHJpYnV0ZX0pKntTfT9cLz4pDQotDQotLy8gWzQ1XSBlbGVtZW50ZGVjbCA6Oj0gJzwhRUxFTUVOVCcgUyBOYW1lIFMgY29udGVudHNwZWMgUz8gJz4nDQotZWxlbWVudGRlY2wgPSAoPFwhRUxFTUVOVHtTfXtOYW1lfXtTfXtjb250ZW50c3BlY317U30/PikNCi0NCi0vLyBbNDZdIGNvbnRlbnRzcGVjIDo6PSAnRU1QVFknIHwgJ0FOWScgfCBNaXhlZCB8IGNoaWxkcmVuDQotY29udGVudHNwZWMgPSAoRU1QVFl8QU5ZfHtNaXhlZH18e2NoaWxkcmVufSkNCi0NCi0vLyBbNDddIGNoaWxkcmVuIDo6PSAoY2hvaWNlIHwgc2VxKSAoJz8nIHwgJyonIHwgJysnKT8NCi1jaGlsZHJlbiA9ICgoe2Nob2ljZX18e3NlcX0pKFw/fFwqfFwrKT8pDQotDQotLy8gQ0FVU0VTIExPT1AgVEhST1VHSCBERUZTIE9GIENIT0lDRSBBTkQgU0VRDQotLy8gWzQ4XSBjcCA6Oj0gKE5hbWUgfCBjaG9pY2UgfCBzZXEpICgnPycgfCAnKicgfCAnKycpPw0KLWNwID0gKCh7TmFtZX0gfCB7Y2hvaWNlfSB8IHtzZXF9KSAoXD98XCp8XCspPykNCi0NCi0vLyBbNDldIGNob2ljZSA6Oj0gJygnIFM/IGNwICggUz8gJ3wnIFM/IGNwICkqIFM/ICcpJw0KLS8vIGNob2ljZSA9IFwoe1N9P3tjcH0oe1N9P1x8e1N9P3tjcH0pKntTfT9cKQ0KLWNob2ljZSA9IFwoe1N9P3tOYW1lfSh7U30/XHx7U30/e05hbWV9KSp7U30/XCkNCi0NCi0vLyBbNTBdIHNlcSA6Oj0gJygnIFM/IGNwICggUz8gJywnIFM/IGNwICkqIFM/ICcpJw0KLS8vIHNlcSA9IChcKHtTfT97Y3B9KHtTfT9cLHtTfT97Y3B9KSp7U30/XCkpDQotc2VxID0gKFwoe1N9P3tOYW1lfSh7U30/XCx7U30/e05hbWV9KSp7U30/XCkpDQotDQotLy8gWzUxXSBNaXhlZCA6Oj0gJygnIFM/ICcjUENEQVRBJyAoUz8gJ3wnIFM/IE5hbWUpKiBTPyAgJykqJyB8ICcoJyBTPyAnI1BDREFUQScgUz8gJyknDQotTWl4ZWQgPSAoe1N9P1wjUENEQVRBKHtTfT9cfHtTfT97TmFtZX0pKntTfT8pKlx8KHtTfT9cI1BDREFUQXtTfT8pDQotDQotLy8gWzUyXSBBdHRsaXN0RGVjbCA6Oj0gJzwhQVRUTElTVCcgUyBOYW1lIEF0dERlZiogUz8gJz4nDQotQXR0bGlzdERlY2wgPSAoPFwhQVRUTElTVHtTfXtOYW1lfXtBdHREZWZ9KntTfT8+KQ0KLQ0KLS8vIFs1M10gQXR0RGVmIDo6PSBTIE5hbWUgUyBBdHRUeXBlIFMgRGVmYXVsdERlY2wNCi1BdHREZWYgPSAoe1N9e05hbWV9e1N9e0F0dFR5cGV9e1N9e0RlZmF1bHREZWNsfSkNCi0NCi0vLyBbNTRdIEF0dFR5cGUgOjo9IFN0cmluZ1R5cGUgfCBUb2tlbml6ZWRUeXBlIHwgRW51bWVyYXRlZFR5cGUgDQotQXR0VHlwZSA9ICh7U3RyaW5nVHlwZX0gfCB7VG9rZW5pemVkVHlwZX0gfCB7RW51bWVyYXRlZFR5cGV9KQ0KLQ0KLS8vIFs1NV0gU3RyaW5nVHlwZSA6Oj0gJ0NEQVRBJw0KLVN0cmluZ1R5cGUgPSAoQ0RBVEEpDQotDQotLy8gWzU2XSBUb2tlbml6ZWRUeXBlIDo6PSAnSUQnIHwgJ0lEUkVGJyB8ICdJRFJFRlMnIHwgJ0VOVElUWScgfCAnRU5USVRJRVMnIHwgJ05NVE9LRU4nIHwgJ05NVE9LRU5TJw0KLVRva2VuaXplZFR5cGUgPSAoSUR8SURSRUZ8SURSRUZTfEVOVElUWXxFTlRJVElFU3xOTVRPS0VOfE5NVE9LRU5TKQ0KLQ0KLS8vIFs1N10gRW51bWVyYXRlZFR5cGUgOjo9IE5vdGF0aW9uVHlwZSB8IEVudW1lcmF0aW9uIA0KLUVudW1lcmF0ZWRUeXBlID0gKHtOb3RhdGlvblR5cGV9IHwge0VudW1lcmF0aW9ufSkNCi0NCi0vLyBbNThdIE5vdGF0aW9uVHlwZSA6Oj0gJ05PVEFUSU9OJyBTICcoJyBTPyBOYW1lIChTPyAnfCcgUz8gTmFtZSkqIFM/ICcpJyANCi1Ob3RhdGlvblR5cGUgPSAoTk9UQVRJT057U31cKHtTfT97TmFtZX0oe1N9P1x8e1N9P3tOYW1lfSkqe1N9P1wpKQ0KLQ0KLS8vIFs1OV0gRW51bWVyYXRpb24gOjo9ICcoJyBTPyBObXRva2VuIChTPyAnfCcgUz8gIE5tdG9rZW4pKiBTPyAnKScNCi1FbnVtZXJhdGlvbiA9IChcKHtTfT97Tm10b2tlbn0oe1N9P1x8e1N9P3tObXRva2VufSkqe1N9P1wpKQ0KLQ0KLS8vIFs2MF0gRGVmYXVsdERlY2wgOjo9ICcjUkVRVUlSRUQnIHwgJyNJTVBMSUVEJyB8ICgoJyNGSVhFRCcgUyk/IEF0dFZhbHVlKQ0KLURlZmF1bHREZWNsID0gKFwjUkVRVUlSRUR8XCNJTVBMSUVEfCgoXCNGSVhFRHtTfSk/e0F0dFZhbHVlfSkpDQotDQotLy8gWzYxXSBjb25kaXRpb25hbFNlY3QgOjo9IGluY2x1ZGVTZWN0IHwgaWdub3JlU2VjdCANCi1jb25kaXRpb25hbFNlY3QgPSAoe2luY2x1ZGVTZWN0fSB8IHtpZ25vcmVTZWN0fSkNCi0NCi0vLyBbNjJdIGluY2x1ZGVTZWN0IDo6PSAnPCFbJyBTPyAnSU5DTFVERScgUz8gJ1snIGV4dFN1YnNldERlY2wgJ11dPicgDQotaW5jbHVkZVNlY3QgPSAoPFwhXFt7U30/SU5DTFVERXtTfT9cW3tleHRTdWJzZXREZWNsfVxdXF0+KQ0KLQ0KLS8vIFs2M10gaWdub3JlU2VjdCA6Oj0gJzwhWycgUz8gJ0lHTk9SRScgUz8gJ1snIGlnbm9yZVNlY3RDb250ZW50cyogJ11dPicNCi1pZ25vcmVTZWN0ID0gKDxcIVxbe1N9P0lHTk9SRXtTfT9cW3tpZ25vcmVTZWN0Q29udGVudHN9KlxdXF0+KQ0KLQ0KLS8vIFs2NF0gaWdub3JlU2VjdENvbnRlbnRzIDo6PSBJZ25vcmUgKCc8IVsnIGlnbm9yZVNlY3RDb250ZW50cyAnXV0+JyBJZ25vcmUpKg0KLWlnbm9yZVNlY3RDb250ZW50cyA9ICh7SWdub3JlfSg8XCFcW3tpZ25vcmVTZWN0Q29udGVudHN9XF1cXT57SWdub3JlfSkqKQ0KLQ0KLS8vIFs2NV0gSWdub3JlIDo6PSBDaGFyKiAtIChDaGFyKiAoJzwhWycgfCAnXV0+JykgQ2hhciopDQotSWdub3JlID0gIChbXihcPFwhXFt8XF1cXVw+KV0qKQ0KLQ0KLS8vIFs2Nl0gQ2hhclJlZiA6Oj0gJyYjJyBbMC05XSsgJzsnIHwgJyYjeCcgWzAtOWEtZkEtRl0rICc7Jw0KLUNoYXJSZWYgPSAoJiNbMC05XSs7fCYjeFswLTlhLWZBLUZdKzspDQotDQotLy8gWzY3XSBSZWZlcmVuY2UgOjo9IEVudGl0eVJlZiB8IENoYXJSZWYNCi1SZWZlcmVuY2UgPSAoe0VudGl0eVJlZn0gfCB7Q2hhclJlZn0pDQotDQotLy8gWzY4XSBFbnRpdHlSZWYgPSAnJicgTmFtZSAnOycNCi1FbnRpdHlSZWYgPSAoJntOYW1lfTspDQotDQotLy8gWzY5XSBQRVJlZmVyZW5jZSA6Oj0gJyUnIE5hbWUgJzsnDQotUEVSZWZlcmVuY2UgPSAoJXtOYW1lfTspDQotDQotLy8gWzcwXSBFbnRpdHlEZWNsIDo6PSBHRURlY2wgfCBQRURlY2wNCi1FbnRpdHlEZWNsID0gKHtHRURlY2x9IHwge1BFRGVjbH0pDQotDQotLy8gWzcxXSBHRURlY2wgOjo9ICc8IUVOVElUWScgUyBOYW1lIFMgRW50aXR5RGVmIFM/ICc+Jw0KLUdFRGVjbCA9ICg8XCFFTlRJVFl7U317TmFtZX17U317RW50aXR5RGVmfXtTfT8+KQ0KLQ0KLS8vIFs3Ml0gUEVEZWNsIDo6PSAnPCFFTlRJVFknIFMgJyUnIFMgTmFtZSBTIFBFRGVmIFM/ICc+Jw0KLVBFRGVjbCA9ICg8XCFFTlRJVFl7U31cJXtTfXtOYW1lfXtTfXtQRURlZn17U30/PikNCi0NCi0vLyBbNzNdIEVudGl0eURlZiA6Oj0gRW50aXR5VmFsdWUgfCAoRXh0ZXJuYWxJRCBORGF0YURlY2w/KQ0KLUVudGl0eURlZiA9ICh7RW50aXR5VmFsdWV9IHwgKHtFeHRlcm5hbElEfXtORGF0YURlY2x9PykpDQotDQotLy8gWzc0XSBQRURlZiA6Oj0gRW50aXR5VmFsdWUgfCBFeHRlcm5hbElEDQotUEVEZWYgPSAoe0VudGl0eVZhbHVlfSB8IHtFeHRlcm5hbElEfSkNCi0NCi0vLyBbNzVdIEV4dGVybmFsSUQgOjo9ICdTWVNURU0nIFMgU3lzdGVtTGl0ZXJhbCB8ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsIFMgU3lzdGVtTGl0ZXJhbCANCi1FeHRlcm5hbElEID0gKFNZU1RFTXtTfXtTeXN0ZW1MaXRlcmFsfXxQVUJMSUN7U317UHViaWRMaXRlcmFsfXtTfXtTeXN0ZW1MaXRlcmFsfSApDQotDQotLy8gWzc2XSBORGF0YURlY2wgOjo9IFMgJ05EQVRBJyBTIE5hbWUNCi1ORGF0YURlY2wgPSAoe1N9TkRBVEF7U317TmFtZX0pDQotDQotLy8gWzc3XSBUZXh0RGVjbCA6Oj0gJzw/eG1sJyBWZXJzaW9uSW5mbz8gRW5jb2RpbmdEZWNsIFM/ICc/PicNCi1UZXh0RGVjbCA9ICg8XD94bWx7VmVyc2lvbkluZm99P3tFbmNvZGluZ0RlY2x9e1N9P1w/PikNCi0NCi0vLyBbNzhdIGV4dFBhcnNlZEVudCA6Oj0gVGV4dERlY2w/IGNvbnRlbnQNCi1leHRQYXJzZWRFbnQgPSAoe1RleHREZWNsfT97Y29udGVudH0pDQotDQotLy8gWzc5XSBleHRQRSA6Oj0gVGV4dERlY2w/IGV4dFN1YnNldERlY2wNCi1leHRQRSA9ICh7VGV4dERlY2x9P3tleHRTdWJzZXREZWNsfSkNCi0NCi0vLyBbODBdIEVuY29kaW5nRGVjbCA6Oj0gUyAnZW5jb2RpbmcnIEVxICgnIicgRW5jTmFtZSAnIicgfCAgIiciIEVuY05hbWUgIiciICkgDQotRW5jb2RpbmdEZWNsID0gKHtTfWVuY29kaW5ne1N9KntFcX17U30qKFwie0VuY05hbWV9XCJ8XCd7RW5jTmFtZX1cJykpDQotDQotLy8gWzgxXSBFbmNOYW1lIDo6PSBbQS1aYS16XSAoW0EtWmEtejAtOS5fXSB8ICctJykqDQotRW5jTmFtZSA9IChbQS1aYS16XShbQS1aYS16MC05Ll9dfFwtKSopDQotDQotLy8gWzgyXSBOb3RhdGlvbkRlY2wgOjo9ICc8IU5PVEFUSU9OJyBTIE5hbWUgUyAoRXh0ZXJuYWxJRCB8ICBQdWJsaWNJRCkgUz8gJz4nDQotTm90YXRpb25EZWNsID0gKDxcIU5PVEFUSU9Oe1N9e05hbWV9e1N9KHtFeHRlcm5hbElEfXx7UHVibGljSUR9KXtTfT8+KQ0KLQ0KLS8vIFs4M10gUHVibGljSUQgOjo9ICdQVUJMSUMnIFMgUHViaWRMaXRlcmFsDQotUHVibGljSUQgPSAoUFVCTElDe1N9e1B1YmlkTGl0ZXJhbH0pDQotDQotLy8gWzg0XSAgTGV0dGVyIDo6PSBCYXNlQ2hhciB8IElkZW9ncmFwaGljDQotTGV0dGVyID0gKHtCYXNlQ2hhcn0gfCB7SWRlb2dyYXBoaWN9KQ0KLQ0KLS8vIFs4NV0gIEJhc2VDaGFyIDo6PSBbI3gwMDQxLSN4MDA1QV0gfCBbI3gwMDYxLSN4MDA3QV0gfCBbI3gwMEMwLSN4MDBENl0NCi0vLyB8IFsjeDAwRDgtI3gwMEY2XSB8IFsjeDAwRjgtI3gwMEZGXSB8IFsjeDAxMDAtI3gwMTMxXQ0KLS8vIHwgWyN4MDEzNC0jeDAxM0VdIHwgWyN4MDE0MS0jeDAxNDhdIHwgWyN4MDE0QS0jeDAxN0VdDQotLy8gfCBbI3gwMTgwLSN4MDFDM10gfCBbI3gwMUNELSN4MDFGMF0gfCBbI3gwMUY0LSN4MDFGNV0NCi0vLyB8IFsjeDAxRkEtI3gwMjE3XSB8IFsjeDAyNTAtI3gwMkE4XSB8IFsjeDAyQkItI3gwMkMxXSB8ICN4MDM4Ng0KLS8vIHwgWyN4MDM4OC0jeDAzOEFdIHwgI3gwMzhDIHwgWyN4MDM4RS0jeDAzQTFdIHwgWyN4MDNBMy0jeDAzQ0VdDQotLy8gfCBbI3gwM0QwLSN4MDNENl0gfCAjeDAzREEgfCAjeDAzREMgfCAjeDAzREUgfCAjeDAzRTANCi0vLyB8IFsjeDAzRTItI3gwM0YzXSB8IFsjeDA0MDEtI3gwNDBDXSB8IFsjeDA0MEUtI3gwNDRGXQ0KLS8vIHwgWyN4MDQ1MS0jeDA0NUNdIHwgWyN4MDQ1RS0jeDA0ODFdIHwgWyN4MDQ5MC0jeDA0QzRdDQotLy8gfCBbI3gwNEM3LSN4MDRDOF0gfCBbI3gwNENCLSN4MDRDQ10gfCBbI3gwNEQwLSN4MDRFQl0NCi0vLyB8IFsjeDA0RUUtI3gwNEY1XSB8IFsjeDA0RjgtI3gwNEY5XSB8IFsjeDA1MzEtI3gwNTU2XSB8ICN4MDU1OQ0KLS8vIHwgWyN4MDU2MS0jeDA1ODZdIHwgWyN4MDVEMC0jeDA1RUFdIHwgWyN4MDVGMC0jeDA1RjJdDQotLy8gfCBbI3gwNjIxLSN4MDYzQV0gfCBbI3gwNjQxLSN4MDY0QV0gfCBbI3gwNjcxLSN4MDZCN10NCi0vLyB8IFsjeDA2QkEtI3gwNkJFXSB8IFsjeDA2QzAtI3gwNkNFXSB8IFsjeDA2RDAtI3gwNkQzXSB8ICN4MDZENQ0KLS8vIHwgWyN4MDZFNS0jeDA2RTZdIHwgWyN4MDkwNS0jeDA5MzldIHwgI3gwOTNEIHwgWyN4MDk1OC0jeDA5NjFdDQotLy8gfCBbI3gwOTg1LSN4MDk4Q10gfCBbI3gwOThGLSN4MDk5MF0gfCBbI3gwOTkzLSN4MDlBOF0NCi0vLyB8IFsjeDA5QUEtI3gwOUIwXSB8ICN4MDlCMiB8IFsjeDA5QjYtI3gwOUI5XSB8IFsjeDA5REMtI3gwOUREXQ0KLS8vIHwgWyN4MDlERi0jeDA5RTFdIHwgWyN4MDlGMC0jeDA5RjFdIHwgWyN4MEEwNS0jeDBBMEFdDQotLy8gfCBbI3gwQTBGLSN4MEExMF0gfCBbI3gwQTEzLSN4MEEyOF0gfCBbI3gwQTJBLSN4MEEzMF0NCi0vLyB8IFsjeDBBMzItI3gwQTMzXSB8IFsjeDBBMzUtI3gwQTM2XSB8IFsjeDBBMzgtI3gwQTM5XQ0KLS8vIHwgWyN4MEE1OS0jeDBBNUNdIHwgI3gwQTVFIHwgWyN4MEE3Mi0jeDBBNzRdIHwgWyN4MEE4NS0jeDBBOEJdDQotLy8gfCAjeDBBOEQgfCBbI3gwQThGLSN4MEE5MV0gfCBbI3gwQTkzLSN4MEFBOF0gfCBbI3gwQUFBLSN4MEFCMF0NCi0vLyB8IFsjeDBBQjItI3gwQUIzXSB8IFsjeDBBQjUtI3gwQUI5XSB8ICN4MEFCRCB8ICN4MEFFMA0KLS8vIHwgWyN4MEIwNS0jeDBCMENdIHwgWyN4MEIwRi0jeDBCMTBdIHwgWyN4MEIxMy0jeDBCMjhdDQotLy8gfCBbI3gwQjJBLSN4MEIzMF0gfCBbI3gwQjMyLSN4MEIzM10gfCBbI3gwQjM2LSN4MEIzOV0gfCAjeDBCM0QNCi0vLyB8IFsjeDBCNUMtI3gwQjVEXSB8IFsjeDBCNUYtI3gwQjYxXSB8IFsjeDBCODUtI3gwQjhBXQ0KLS8vIHwgWyN4MEI4RS0jeDBCOTBdIHwgWyN4MEI5Mi0jeDBCOTVdIHwgWyN4MEI5OS0jeDBCOUFdIHwgI3gwQjlDDQotLy8gfCBbI3gwQjlFLSN4MEI5Rl0gfCBbI3gwQkEzLSN4MEJBNF0gfCBbI3gwQkE4LSN4MEJBQV0NCi0vLyB8IFsjeDBCQUUtI3gwQkI1XSB8IFsjeDBCQjctI3gwQkI5XSB8IFsjeDBDMDUtI3gwQzBDXQ0KLS8vIHwgWyN4MEMwRS0jeDBDMTBdIHwgWyN4MEMxMi0jeDBDMjhdIHwgWyN4MEMyQS0jeDBDMzNdDQotLy8gfCBbI3gwQzM1LSN4MEMzOV0gfCBbI3gwQzYwLSN4MEM2MV0gfCBbI3gwQzg1LSN4MEM4Q10NCi0vLyB8IFsjeDBDOEUtI3gwQzkwXSB8IFsjeDBDOTItI3gwQ0E4XSB8IFsjeDBDQUEtI3gwQ0IzXQ0KLS8vIHwgWyN4MENCNS0jeDBDQjldIHwgI3gwQ0RFIHwgWyN4MENFMC0jeDBDRTFdIHwgWyN4MEQwNS0jeDBEMENdDQotLy8gfCBbI3gwRDBFLSN4MEQxMF0gfCBbI3gwRDEyLSN4MEQyOF0gfCBbI3gwRDJBLSN4MEQzOV0NCi0vLyB8IFsjeDBENjAtI3gwRDYxXSB8IFsjeDBFMDEtI3gwRTJFXSB8ICN4MEUzMCB8IFsjeDBFMzItI3gwRTMzXQ0KLS8vIHwgWyN4MEU0MC0jeDBFNDVdIHwgWyN4MEU4MS0jeDBFODJdIHwgI3gwRTg0IHwgWyN4MEU4Ny0jeDBFODhdDQotLy8gfCAjeDBFOEEgfCAjeDBFOEQgfCBbI3gwRTk0LSN4MEU5N10gfCBbI3gwRTk5LSN4MEU5Rl0NCi0vLyB8IFsjeDBFQTEtI3gwRUEzXSB8ICN4MEVBNSB8ICN4MEVBNyB8IFsjeDBFQUEtI3gwRUFCXQ0KLS8vIHwgWyN4MEVBRC0jeDBFQUVdIHwgI3gwRUIwIHwgWyN4MEVCMi0jeDBFQjNdIHwgI3gwRUJEDQotLy8gfCBbI3gwRUMwLSN4MEVDNF0gfCBbI3gwRjQwLSN4MEY0N10gfCBbI3gwRjQ5LSN4MEY2OV0NCi0vLyB8IFsjeDEwQTAtI3gxMEM1XSB8IFsjeDEwRDAtI3gxMEY2XSB8ICN4MTEwMCB8IFsjeDExMDItI3gxMTAzXQ0KLS8vIHwgWyN4MTEwNS0jeDExMDddIHwgI3gxMTA5IHwgWyN4MTEwQi0jeDExMENdIHwgWyN4MTEwRS0jeDExMTJdDQotLy8gfCAjeDExM0MgfCAjeDExM0UgfCAjeDExNDAgfCAjeDExNEMgfCAjeDExNEUgfCAjeDExNTANCi0vLyB8IFsjeDExNTQtI3gxMTU1XSB8ICN4MTE1OSB8IFsjeDExNUYtI3gxMTYxXSB8ICN4MTE2MyB8ICN4MTE2NQ0KLS8vIHwgI3gxMTY3IHwgI3gxMTY5IHwgWyN4MTE2RC0jeDExNkVdIHwgWyN4MTE3Mi0jeDExNzNdIHwgI3gxMTc1DQotLy8gfCAjeDExOUUgfCAjeDExQTggfCAjeDExQUIgfCBbI3gxMUFFLSN4MTFBRl0gfCBbI3gxMUI3LSN4MTFCOF0NCi0vLyB8ICN4MTFCQSB8IFsjeDExQkMtI3gxMUMyXSB8ICN4MTFFQiB8ICN4MTFGMCB8ICN4MTFGOQ0KLS8vIHwgWyN4MUUwMC0jeDFFOUJdIHwgWyN4MUVBMC0jeDFFRjldIHwgWyN4MUYwMC0jeDFGMTVdDQotLy8gfCBbI3gxRjE4LSN4MUYxRF0gfCBbI3gxRjIwLSN4MUY0NV0gfCBbI3gxRjQ4LSN4MUY0RF0NCi0vLyB8IFsjeDFGNTAtI3gxRjU3XSB8ICN4MUY1OSB8ICN4MUY1QiB8ICN4MUY1RCB8IFsjeDFGNUYtI3gxRjdEXQ0KLS8vIHwgWyN4MUY4MC0jeDFGQjRdIHwgWyN4MUZCNi0jeDFGQkNdIHwgI3gxRkJFIHwgWyN4MUZDMi0jeDFGQzRdDQotLy8gfCBbI3gxRkM2LSN4MUZDQ10gfCBbI3gxRkQwLSN4MUZEM10gfCBbI3gxRkQ2LSN4MUZEQl0NCi0vLyB8IFsjeDFGRTAtI3gxRkVDXSB8IFsjeDFGRjItI3gxRkY0XSB8IFsjeDFGRjYtI3gxRkZDXSB8ICN4MjEyNg0KLS8vIHwgWyN4MjEyQS0jeDIxMkJdIHwgI3gyMTJFIHwgWyN4MjE4MC0jeDIxODJdIHwgWyN4MzA0MS0jeDMwOTRdDQotLy8gfCBbI3gzMEExLSN4MzBGQV0gfCBbI3gzMTA1LSN4MzEyQ10gfCBbI3hBQzAwLSN4RDdBM10NCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdDQotDQotLy8gWzg2XSAgSWRlb2dyYXBoaWMgOjo9IFsjeDRFMDAtI3g5RkE1XSB8ICN4MzAwNyB8IFsjeDMwMjEtI3gzMDI5XQ0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQ0KLQ0KLS8vIFs4N10gICAgICBDb21iaW5pbmdDaGFyICAgIDo6PSAgICBbI3gwMzAwLSN4MDM0NV0gICAgfCBbI3gwMzYwLSN4MDM2MV0NCi0vLyB8IFsjeDA0ODMtI3gwNDg2XSAgICAgICAgICB8IFsjeDA1OTEtI3gwNUExXSAgICAgICAgIHwgWyN4MDVBMy0jeDA1QjldDQotLy8gfCBbI3gwNUJCLSN4MDVCRF0gICAgICAgfCAjeDA1QkYgICAgICAgfCBbI3gwNUMxLSN4MDVDMl0JIHwgI3gwNUM0DQotLy8gfCBbI3gwNjRCLSN4MDY1Ml0gICAgfCAjeDA2NzAgICAgfCBbI3gwNkQ2LSN4MDZEQ10gICB8IFsjeDA2REQtI3gwNkRGXQ0KLS8vIHwgWyN4MDZFMC0jeDA2RTRdICAgICAgICAgIHwgWyN4MDZFNy0jeDA2RThdICAgICAgICAgfCBbI3gwNkVBLSN4MDZFRF0NCi0vLyB8IFsjeDA5MDEtI3gwOTAzXSAgICAgICB8ICN4MDkzQyAgICAgICB8IFsjeDA5M0UtI3gwOTRDXSAgICAgIHwgI3gwOTREDQotLy8gfCBbI3gwOTUxLSN4MDk1NF0gICAgfCBbI3gwOTYyLSN4MDk2M10gICAgfCBbI3gwOTgxLSN4MDk4M10gICB8ICN4MDlCQw0KLS8vIHwgI3gwOUJFICAgICAgIHwgI3gwOUJGICAgICAgIHwgWyN4MDlDMC0jeDA5QzRdICAgICAgfCBbI3gwOUM3LSN4MDlDOF0NCi0vLyB8IFsjeDA5Q0ItI3gwOUNEXSAgIHwgI3gwOUQ3ICAgfCBbI3gwOUUyLSN4MDlFM10gICB8ICN4MEEwMiAgIHwgI3gwQTNDDQotLy8gfCAjeDBBM0UgICAgICAgfCAjeDBBM0YgICAgICAgfCBbI3gwQTQwLSN4MEE0Ml0gICAgICB8IFsjeDBBNDctI3gwQTQ4XQ0KLS8vIHwgWyN4MEE0Qi0jeDBBNERdICAgIHwgWyN4MEE3MC0jeDBBNzFdICAgIHwgWyN4MEE4MS0jeDBBODNdICAgfCAjeDBBQkMNCi0vLyB8IFsjeDBBQkUtI3gwQUM1XSAgICAgICAgICB8IFsjeDBBQzctI3gwQUM5XSAgICAgICAgIHwgWyN4MEFDQi0jeDBBQ0RdDQotLy8gfCBbI3gwQjAxLSN4MEIwM10gICAgfCAjeDBCM0MgICAgfCBbI3gwQjNFLSN4MEI0M10gICB8IFsjeDBCNDctI3gwQjQ4XQ0KLS8vIHwgWyN4MEI0Qi0jeDBCNERdICAgICAgICAgIHwgWyN4MEI1Ni0jeDBCNTddICAgICAgICAgfCBbI3gwQjgyLSN4MEI4M10NCi0vLyB8IFsjeDBCQkUtI3gwQkMyXSAgICB8IFsjeDBCQzYtI3gwQkM4XSAgICB8IFsjeDBCQ0EtI3gwQkNEXSAgIHwgI3gwQkQ3DQotLy8gfCBbI3gwQzAxLSN4MEMwM10gICAgICAgICAgfCBbI3gwQzNFLSN4MEM0NF0gICAgICAgICB8IFsjeDBDNDYtI3gwQzQ4XQ0KLS8vIHwgWyN4MEM0QS0jeDBDNERdICAgICAgICAgIHwgWyN4MEM1NS0jeDBDNTZdICAgICAgICAgfCBbI3gwQzgyLSN4MEM4M10NCi0vLyB8IFsjeDBDQkUtI3gwQ0M0XSAgICAgICAgICB8IFsjeDBDQzYtI3gwQ0M4XSAgICAgICAgIHwgWyN4MENDQS0jeDBDQ0RdDQotLy8gfCBbI3gwQ0Q1LSN4MENENl0gICAgICAgICAgfCBbI3gwRDAyLSN4MEQwM10gICAgICAgICB8IFsjeDBEM0UtI3gwRDQzXQ0KLS8vIHwgWyN4MEQ0Ni0jeDBENDhdICAgICAgIHwgWyN4MEQ0QS0jeDBENERdICAgICAgIHwgI3gwRDU3ICAgICAgfCAjeDBFMzENCi0vLyB8IFsjeDBFMzQtI3gwRTNBXSAgICB8IFsjeDBFNDctI3gwRTRFXSAgICB8ICN4MEVCMSAgIHwgWyN4MEVCNC0jeDBFQjldDQotLy8gfCBbI3gwRUJCLSN4MEVCQ10gICAgfCBbI3gwRUM4LSN4MEVDRF0gICAgfCBbI3gwRjE4LSN4MEYxOV0gICB8ICN4MEYzNQ0KLS8vIHwgI3gwRjM3ICAgICAgfCAjeDBGMzkgICAgIHwgI3gwRjNFICAgICB8ICN4MEYzRiAgICAgfCBbI3gwRjcxLSN4MEY4NF0NCi0vLyB8IFsjeDBGODYtI3gwRjhCXSAgICB8IFsjeDBGOTAtI3gwRjk1XSAgICB8ICN4MEY5NyAgIHwgWyN4MEY5OS0jeDBGQURdDQotLy8gfCBbI3gwRkIxLSN4MEZCN10gICAgICAgfCAjeDBGQjkgICAgICAgfCBbI3gyMEQwLSN4MjBEQ10gICAgICB8ICN4MjBFMQ0KLS8vIHwgWyN4MzAyQS0jeDMwMkZdIHwgI3gzMDk5IHwgI3gzMDlBDQotQ29tYmluaW5nQ2hhciA9ICAgIFtcdTAzMDAtXHUwMzQ1XHUwMzYwLVx1MDM2MVx1MDQ4My1cdTA0ODZcdTA1OTEtXHUwNUExXHUwNUEzLVx1MDVCOVx1MDVCQi1cdTA1QkRcdTA1QkZcdTA1QzEtXHUwNUMyXHUwNUM0XHUwNjRCLVx1MDY1Mlx1MDY3MFx1MDZENi1cdTA2RENcdTA2REQtXHUwNkRGXHUwNkUwLVx1MDZFNFx1MDZFNy1cdTA2RThcdTA2RUEtXHUwNkVEXHUwOTAxLVx1MDkwM1x1MDkzQ1x1MDkzRS1cdTA5NENcdTA5NERcdTA5NTEtXHUwOTU0XHUwOTYyLVx1MDk2M1x1MDk4MS1cdTA5ODNcdTA5QkNcdTA5QkVcdTA5QkZcdTA5QzAtXHUwOUM0XHUwOUM3LVx1MDlDOFx1MDlDQi1cdTA5Q0RcdTA5RDdcdTA5RTItXHUwOUUzXHUwQTAyXHUwQTNDXHUwQTNFXHUwQTNGXHUwQTQwLVx1MEE0Mlx1MEE0Ny1cdTBBNDhcdTBBNEItXHUwQTREXHUwQTcwLVx1MEE3MVx1MEE4MS1cdTBBODNcdTBBQkNcdTBBQkUtXHUwQUM1XHUwQUM3LVx1MEFDOVx1MEFDQi1cdTBBQ0RcdTBCMDEtXHUwQjAzXHUwQjNDXHUwQjNFLVx1MEI0M1x1MEI0Ny1cdTBCNDhcdTBCNEItXHUwQjREXHUwQjU2LVx1MEI1N1x1MEI4Mi1cdTBCODNcdTBCQkUtXHUwQkMyXHUwQkM2LVx1MEJDOFx1MEJDQS1cdTBCQ0RcdTBCRDdcdTBDMDEtXHUwQzAzXHUwQzNFLVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1LVx1MEM1Nlx1MEM4Mi1cdTBDODNcdTBDQkUtXHUwQ0M0XHUwQ0M2LVx1MENDOFx1MENDQS1cdTBDQ0RcdTBDRDUtXHUwQ0Q2XHUwRDAyLVx1MEQwM1x1MEQzRS1cdTBENDNcdTBENDYtXHUwRDQ4XHUwRDRBLVx1MEQ0RFx1MEQ1N1x1MEUzMVx1MEUzNC1cdTBFM0FcdTBFNDctXHUwRTRFXHUwRUIxXHUwRUI0LVx1MEVCOVx1MEVCQi1cdTBFQkNcdTBFQzgtXHUwRUNEXHUwRjE4LVx1MEYxOVx1MEYzNVx1MEYzN1x1MEYzOVx1MEYzRVx1MEYzRlx1MEY3MS1cdTBGODRcdTBGODYtXHUwRjhCXHUwRjkwLVx1MEY5NVx1MEY5N1x1MEY5OS1cdTBGQURcdTBGQjEtXHUwRkI3XHUwRkI5XHUyMEQwLVx1MjBEQ1x1MjBFMVx1MzAyQS1cdTMwMkZcdTMwOTlcdTMwOUFdDQotDQotLy8gWzg4XSAgIERpZ2l0ICA6Oj0gIFsjeDAwMzAtI3gwMDM5XSB8IFsjeDA2NjAtI3gwNjY5XSB8IFsjeDA2RjAtI3gwNkY5XQ0KLS8vIHwgWyN4MDk2Ni0jeDA5NkZdICAgICAgICAgIHwgWyN4MDlFNi0jeDA5RUZdICAgICAgICAgfCBbI3gwQTY2LSN4MEE2Rl0NCi0vLyB8IFsjeDBBRTYtI3gwQUVGXSAgICAgICAgICB8IFsjeDBCNjYtI3gwQjZGXSAgICAgICAgIHwgWyN4MEJFNy0jeDBCRUZdDQotLy8gfCBbI3gwQzY2LSN4MEM2Rl0gICAgICAgICAgfCBbI3gwQ0U2LSN4MENFRl0gICAgICAgICB8IFsjeDBENjYtI3gwRDZGXQ0KLS8vIHwgWyN4MEU1MC0jeDBFNTldIHwgWyN4MEVEMC0jeDBFRDldIHwgWyN4MEYyMC0jeDBGMjldDQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0NCi0NCi0vLyBbODldICBFeHRlbmRlciA6Oj0gI3gwMEI3IHwgI3gwMkQwIHwgI3gwMkQxIHwgI3gwMzg3IHwgI3gwNjQwIHwgI3gwRTQ2DQotLy8gfCAjeDBFQzYgICAgICAgfCAjeDMwMDUgICAgICAgfCBbI3gzMDMxLSN4MzAzNV0gICAgICB8IFsjeDMwOUQtI3gzMDlFXQ0KLS8vIHwgWyN4MzBGQy0jeDMwRkVdDQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQ0KLQ0KLSUlDQotDQotDQotLyogd2hpdGUgc3BhY2Ugd2l0aGluIGEgdGFnICovDQotPFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfUEksIFNUX1hNTF9QSV9FUVVBTFMsIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OLCBTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0UsIFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQywgU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNLCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCxTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSxTVF9ESFRNTF9FUVVBTFMsU1RfREhUTUxfQVRUUklCVVRFX1ZBTFVFLFNUX0RIVE1MX1RBR19DTE9TRT4ge1N9KiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgid2hpdGUgc3BhY2UiKTsvLyROT04tTkxTLTEkDQotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLQ0KLS8vIEJFR0lOIFJFR1VMQVIgWE1MDQotLyogaGFuZGxlIG9wZW5pbmcgYSBuZXcgdGFnIGFsbW9zdCBhbnl3aGVyZSAqLw0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfREVDTEFSQVRJT04sIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuc3RhcnQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9UQUdfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOw0KLX0NCi0NCi0vKiB1bnF1b3RlZCAqLw0KLQ0KLTxZWUlOSVRJQUwsIFNUX1hNTF9UQUdfTkFNRSwgU1RfWE1MX0VRVUFMUywgU1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFLCBTVF9YTUxfREVDTEFSQVRJT04+IHtnZW5lcmljRW5kVGFnT3Blbn0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxuZW5kIHRhZyBvcGVuIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47DQotfQ0KLS8qIHRoZSB0YWcncyBuYW1lIHdhcyBmb3VuZCwgc3RhcnQgc2Nhbm5pbmcgZm9yIGF0dHJpYnV0ZXMgKi8NCi08U1RfWE1MX1RBR19OQU1FPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoInRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotLyogYW5vdGhlciBhdHRyaWJ1dGUgbmFtZSB3YXMgZm91bmQsIHJlc3VtZSBsb29raW5nIGZvciB0aGUgZXF1YWxzIHNpZ24gKi8NCi08U1RfWE1MX0FUVFJJQlVURV9OQU1FLCBTVF9YTUxfRVFVQUxTPiB7TmFtZX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotLyogYW4gZXF1YWwgc2lnbiB3YXMgZm91bmQsIHdoYXQncyBuZXh0IGlzIHRoZSB2YWx1ZSAqLw0KLTxTVF9YTUxfRVFVQUxTPiB7RXF9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlcXVhbHMiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLS8qIGFsbG93IGZvciB1bmJhbGFuY2VkIHF1b3RlcywgbW9zdGx5IGEgZHVwbGljYXRlIG9mIHRoZSBBdHRWYWx1ZSBydWxlICovDQotPFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dHIgdmFsdWUiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLQ0KLQ0KLS8qIHRoZSB0YWcncyBjbG9zZSB3YXMgZm91bmQgKi8NCi08U1RfWE1MX1RBR19OQU1FLCBTVF9YTUxfRVFVQUxTLCBTVF9YTUxfQVRUUklCVVRFX05BTUUsIFNUX1hNTF9BVFRSSUJVVEVfVkFMVUU+IHtnZW5lcmljVGFnQ2xvc2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJ0YWcgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmKGlzQmxvY2tNYXJrZXIoKSkgew0KLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOw0KLQl9DQotCWVsc2UNCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19DTE9TRTsNCi19DQotLyogdGhlIHRhZydzIGNsb3NlIHdhcyBmb3VuZCwgYnV0IHRoZSB0YWcgZG9lc24ndCBuZWVkIGEgbWF0Y2hpbmcgZW5kIHRhZyAqLw0KLTxTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNFbXB0eVRhZ0Nsb3NlfSB7DQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZW1wdHkgdGFnIGNsb3NlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7DQotfQ0KLQ0KLTxTVF9YTUxfVEFHX05BTUU+IFtePC8+XHUwMDQxLVx1MDA1QVx1MDA2MS1cdTAwN0FcdTAwQzAtXHUwMEQ2XHUwMEQ4LVx1MDBGNlx1MDBGOC1cdTAwRkZcdTAxMDAtXHUwMTMxXHUwMTM0LVx1MDEzRVx1MDE0MS1cdTAxNDhcdTAxNEEtXHUwMTdFXHUwMTgwLVx1MDFDM1x1MDFDRC1cdTAxRjBcdTAxRjQtXHUwMUY1XHUwMUZBLVx1MDIxN1x1MDI1MC1cdTAyQThcdTAyQkItXHUwMkMxXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0NFXHUwM0QwLVx1MDNENlx1MDNEQVx1MDNEQ1x1MDNERVx1MDNFMFx1MDNFMi1cdTAzRjNcdTA0MDEtXHUwNDBDXHUwNDBFLVx1MDQ0Rlx1MDQ1MS1cdTA0NUNcdTA0NUUtXHUwNDgxXHUwNDkwLVx1MDRDNFx1MDRDNy1cdTA0QzhcdTA0Q0ItXHUwNENDXHUwNEQwLVx1MDRFQlx1MDRFRS1cdTA0RjVcdTA0RjgtXHUwNEY5XHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODZcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMS1cdTA2M0FcdTA2NDEtXHUwNjRBXHUwNjcxLVx1MDZCN1x1MDZCQS1cdTA2QkVcdTA2QzAtXHUwNkNFXHUwNkQwLVx1MDZEM1x1MDZENVx1MDZFNS1cdTA2RTZcdTA5MDUtXHUwOTM5XHUwOTNEXHUwOTU4LVx1MDk2MVx1MDk4NS1cdTA5OENcdTA5OEYtXHUwOTkwXHUwOTkzLVx1MDlBOFx1MDlBQS1cdTA5QjBcdTA5QjJcdTA5QjYtXHUwOUI5XHUwOURDLVx1MDlERFx1MDlERi1cdTA5RTFcdTA5RjAtXHUwOUYxXHUwQTA1LVx1MEEwQVx1MEEwRi1cdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMi1cdTBBMzNcdTBBMzUtXHUwQTM2XHUwQTM4LVx1MEEzOVx1MEE1OS1cdTBBNUNcdTBBNUVcdTBBNzItXHUwQTc0XHUwQTg1LVx1MEE4Qlx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMi1cdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUUwXHUwQjA1LVx1MEIwQ1x1MEIwRi1cdTBCMTBcdTBCMTMtXHUwQjI4XHUwQjJBLVx1MEIzMFx1MEIzMi1cdTBCMzNcdTBCMzYtXHUwQjM5XHUwQjNEXHUwQjVDLVx1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTktXHUwQjlBXHUwQjlDXHUwQjlFLVx1MEI5Rlx1MEJBMy1cdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCNVx1MEJCNy1cdTBCQjlcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzMzXHUwQzM1LVx1MEMzOVx1MEM2MC1cdTBDNjFcdTBDODUtXHUwQzhDXHUwQzhFLVx1MEM5MFx1MEM5Mi1cdTBDQThcdTBDQUEtXHUwQ0IzXHUwQ0I1LVx1MENCOVx1MENERVx1MENFMC1cdTBDRTFcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEMjhcdTBEMkEtXHUwRDM5XHUwRDYwLVx1MEQ2MVx1MEUwMS1cdTBFMkVcdTBFMzBcdTBFMzItXHUwRTMzXHUwRTQwLVx1MEU0NVx1MEU4MS1cdTBFODJcdTBFODRcdTBFODctXHUwRTg4XHUwRThBXHUwRThEXHUwRTk0LVx1MEU5N1x1MEU5OS1cdTBFOUZcdTBFQTEtXHUwRUEzXHUwRUE1XHUwRUE3XHUwRUFBLVx1MEVBQlx1MEVBRC1cdTBFQUVcdTBFQjBcdTBFQjItXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEY0MC1cdTBGNDdcdTBGNDktXHUwRjY5XHUxMEEwLVx1MTBDNVx1MTBEMC1cdTEwRjZcdTExMDBcdTExMDItXHUxMTAzXHUxMTA1LVx1MTEwN1x1MTEwOVx1MTEwQi1cdTExMENcdTExMEUtXHUxMTEyXHUxMTNDXHUxMTNFXHUxMTQwXHUxMTRDXHUxMTRFXHUxMTUwXHUxMTU0LVx1MTE1NVx1MTE1OVx1MTE1Ri1cdTExNjFcdTExNjNcdTExNjVcdTExNjdcdTExNjlcdTExNkQtXHUxMTZFXHUxMTcyLVx1MTE3M1x1MTE3NVx1MTE5RVx1MTFBOFx1MTFBQlx1MTFBRS1cdTExQUZcdTExQjctXHUxMUI4XHUxMUJBXHUxMUJDLVx1MTFDMlx1MTFFQlx1MTFGMFx1MTFGOVx1MUUwMC1cdTFFOUJcdTFFQTAtXHUxRUY5XHUxRjAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMTI2XHUyMTJBLVx1MjEyQlx1MjEyRVx1MjE4MC1cdTIxODJcdTMwNDEtXHUzMDk0XHUzMEExLVx1MzBGQVx1MzEwNS1cdTMxMkNcdUFDMDAtXHVEN0EzXHU0RTAwLVx1OUZBNVx1MzAwN1x1MzAyMS1cdTMwMjldKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiaW5hcHByb3ByaWF0ZSB0YWcgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOw0KLX0NCi0NCi0vLyBFTkQgUkVHVUxBUiBYTUwNCi0NCi0NCi0vLyBYTUwgQ29tbWVudHMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRSwgU1RfWE1MX0RFQ0xBUkFUSU9OPiB7Q29tbWVudFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5jb21tZW50IHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsNCi0JcmV0dXJuIFhNTF9DT01NRU5UX09QRU47DQotfQ0KLTxTVF9YTUxfQ09NTUVOVD4gLnxccnxcbiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiY29tbWVudCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7DQotfQ0KLQ0KLTxTVF9YTUxfQ09NTUVOVF9FTkQ+IHtDb21tZW50RW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oWVlJTklUSUFMKTsNCi0JcmV0dXJuIFhNTF9DT01NRU5UX0NMT1NFOw0KLX0NCi0NCi0vLyBYTUwgbWlzYw0KLQ0KLXtDRFN0YXJ0fSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5DREFUQSBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOw0KLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX09QRU47DQotfQ0KLTxTVF9DREFUQV9URVhUPiAufFxyfFxuIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSB0ZXh0Iik7Ly8kTk9OLU5MUy0xJA0KLQlTdHJpbmcgYmxvY2tDb250ZXh0ID0gZG9CbG9ja1NjYW4oIl1dPiIsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQNCi0JaWYoYmxvY2tDb250ZXh0ID09IFhNTF9DREFUQV9URVhUKQ0KLQkJeXliZWdpbihTVF9DREFUQV9FTkQpOw0KLQlyZXR1cm4gYmxvY2tDb250ZXh0Ow0KLX0NCi08U1RfQ0RBVEFfRU5EPiB7Q0RFbmR9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJDREFUQSBlbmQiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UEVSZWZlcmVuY2V9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblBFUmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsNCi19DQotPFlZSU5JVElBTD4ge0NoYXJSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQ0hBUl9SRUZFUkVOQ0U7DQotfQ0KLTxZWUlOSVRJQUw+IHtFbnRpdHlSZWZ9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcbkVudGl0eVJlZiIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFhNTF9FTlRJVFlfUkVGRVJFTkNFOw0KLX0NCi0NCi08WVlJTklUSUFMPiB7UElzdGFydH0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlxucHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0JeXliZWdpbihTVF9QSSk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47DQotfQ0KLS8vIHRoZSBuZXh0IHRocmVlIGFyZSBvcmRlciBkZXBlbmRlbnQNCi08U1RfUEk+ICgoWHx4KShNfG0pKEx8bCkpIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOw0KLX0NCi08U1RfUEk+IChbaUldW21NXVtwUF1bb09dW3JSXVt0VF17U30qKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0YXJnZXQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7DQotfQ0KLTxTVF9QST4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfUElfV1MpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsNCi19DQotPFNUX1BJX1dTPiB7U30rIHsNCi0gICAgICAgIHl5YmVnaW4oU1RfUElfQ09OVEVOVCk7DQotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLTxTVF9QSSwgU1RfUElfV1M+IFw/PiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkDQotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7DQotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOw0KLX0NCi08U1RfUElfQ09OVEVOVD4gLiB7DQotCS8vIGJsb2NrIHNjYW4gdW50aWwgY2xvc2UgaXMgZm91bmQNCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOw0KLX0NCi08U1RfUElfQ09OVEVOVCxTVF9YTUxfUElfVEFHX0NMT1NFPiBcPz4gew0KLQkJLy8gZW5kZWQgd2l0aCBub3RoaW5nIGluc2lkZQ0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0VRVUFMUyk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsNCi19DQotPFNUX1hNTF9QSV9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOw0KLX0NCi0vKiB0aGUgdmFsdWUgd2FzIGZvdW5kLCBsb29rIGZvciB0aGUgbmV4dCBuYW1lICovDQotPFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1BJX0FUVFJJQlVURV9OQU1FKTsNCi0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsNCi19DQotLyogdGhlIFBJJ3MgY2xvc2Ugd2FzIGZvdW5kICovDQotPFNUX1hNTF9QSV9FUVVBTFMsIFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX1BJX0FUVFJJQlVURV9WQUxVRT4ge1BJZW5kfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsNCi19DQotLy8gREhUTUwNCi08U1RfREhUTUxfQVRUUklCVVRFX05BTUUsIFNUX0RIVE1MX0VRVUFMUz4ge05hbWV9IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9FUVVBTFMpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7DQotfQ0KLTxTVF9ESFRNTF9FUVVBTFM+IHtFcX0gew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOw0KLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUzsNCi19DQotLyogdGhlIHZhbHVlIHdhcyBmb3VuZCwgbG9vayBmb3IgdGhlIG5leHQgbmFtZSAqLw0KLTxTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IHtBdHRWYWx1ZX0gfCAoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJA0KLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7DQotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7DQotfQ0KLS8qIFRoZSBESFRNTCBQSSdzIGNsb3NlIHdhcyBmb3VuZCAqLw0KLTxTVF9ESFRNTF9FUVVBTFMsIFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FLCBTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUU+IFsvXSo+IHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsNCi0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7DQotfQ0KLQ0KLS8vIFhNTCBkZWNsYXJhdGlvbnMNCi0NCi08WVlJTklUSUFMLCBTVF9YTUxfVEFHX05BTUUsIFNUX1hNTF9FUVVBTFMsIFNUX1hNTF9BVFRSSUJVVEVfTkFNRSwgU1RfWE1MX0FUVFJJQlVURV9WQUxVRT4ge2dlbmVyaWNUYWdPcGVufSEgew0KLQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiXG5kZWNsYXJhdGlvbiBzdGFydCIpOy8vJE5PTi1OTFMtMSQNCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRWVdW0xsXVtFZV1bTW1dW0VlXVtObl1bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJlbGVtZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbRGRdW09vXVtDY11bVHRdW1l5XVtQcF1bRWVdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OOw0KLX0NCi08U1RfWE1MX0RFQ0xBUkFUSU9OPiBbQWFdW1R0XVtUdF1bTGxdW0lpXVtTc11bVHRdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJhdHRsaXN0Iik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsNCi0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OOw0KLX0NCi0NCi0vLyBiZWdpbiBET0NUWVBFIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRE9DVFlQRV9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfRVhURVJOQUxfSUQsIFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfREVDTEFSQVRJT05fQ0xPU0U+IFxbW15cXV0qXF0gew0KLQlyZXR1cm4gWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUOw0KLX0NCi0NCi08U1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04+IHtOYW1lfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZG9jdHlwZSB0eXBlIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX05BTUU7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1BwXVtVdV1bQmJdW0xsXVtJaV1bQ2NdIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1BVQkxJQyk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRD4gW1NzXVtZeV1bU3NdW1R0XVtFZV1bTW1dIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7DQotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU07DQotfQ0KLTxTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUM+IHtBdHRWYWx1ZX18e1B1YmlkTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHB1YmxpYyByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsNCi19DQotPFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTT4ge0F0dFZhbHVlfXx7U3lzdGVtTGl0ZXJhbH18KFtcJ1wiXShbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXXxcLytbXlwnXCJcMDQwXDAxMVwwMTJcMDE1PD4vXSApKiApIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJkb2N0eXBlIHN5c3RlbSByZWZlcmVuY2UiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsNCi0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRjsNCi19DQotLy8gZW5kIERPQ1RZUEUgaGFuZGxpbmcNCi0NCi0vLyBiZWdpbiBFTEVNRU5UIGhhbmRsaW5nIHByb2NlZHVyZQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTj4ge0F0dFZhbHVlfXx7UHViaWRMaXRlcmFsfXwoW1wnXCJdKFteXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dfFwvK1teXCdcIlwwNDBcMDExXDAxMlwwMTU8Pi9dICkqICkgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImVsZW1lbnRkZWNsIG5hbWUiKTsvLyROT04tTkxTLTEkDQotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7DQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX05BTUU7DQotfQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiBbXj5dKiB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZWxlbWVudGRlY2wgY2xvc2UiKTsvLyROT04tTkxTLTEkDQotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpDQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJA0KLQl9DQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOw0KLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOw0KLX0NCi0vLyBlbmQgRUxFTUVOVCBoYW5kbGluZw0KLQ0KLS8vIGJlZ2luIEFUVExJU1QgaGFuZGxpbmcgcHJvY2VkdXJlDQotPFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OPiB7QXR0VmFsdWV9fHtQdWJpZExpdGVyYWx9fChbXCdcIl0oW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L118XC8rW15cJ1wiXDA0MFwwMTFcMDEyXDAxNTw+L10gKSogKSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJA0KLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OX0NPTlRFTlQpOw0KLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTF9OQU1FOw0KLX0NCi08U1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVD4gW14+XSogew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoImF0dGxpc3QgY29udGVudHNwZWMiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7DQotfQ0KLQ0KLTxTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiYXR0bGlzdCBjbG9zZSIpOy8vJE5PTi1OTFMtMSQNCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7DQotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkNCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkDQotCX0NCi0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7DQotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7DQotfQ0KLS8vIGVuZCBBVFRMSVNUIGhhbmRsaW5nDQotDQotPFNUX1hNTF9ERUNMQVJBVElPTiwgU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lELCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTiwgU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT04sIFNUX1hNTF9ERUNMQVJBVElPTl9DTE9TRSwgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDLCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0sIFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEPiB7Z2VuZXJpY1RhZ0Nsb3NlfSB7DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiZGVjbGFyYXRpb24gZW5kIik7Ly8kTk9OLU5MUy0xJA0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsNCi0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQ0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQNCi0JfQ0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsNCi0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsNCi19DQotLy8gZW5kIERFQ0xBUkFUSU9OIGhhbmRsaW5nDQotDQotPFlZSU5JVElBTD4gW148JiVdKnxbJiVde1N9K3tOYW1lfVteJiU8XSp8WyYlXXtOYW1lfShbXjsmJTxdKnx7U30rOyopIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gWE1MX0NPTlRFTlQ7DQotfQ0KLQ0KLQ0KLTxTVF9CTE9DS19UQUdfU0NBTj4gLnxccnxcbiB7DQotCQlyZXR1cm4gZG9CbG9ja1RhZ1NjYW4oKTsNCi0JfQ0KLQ0KLS4gew0KLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlTeXN0ZW0ub3V0LnByaW50bG4oIiEhIXVuZXhwZWN0ZWQhISE6IFwiIiArIHl5dGV4dCgpICsgIlwiOiIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJA0KLQkJCXl5Y2hhciArICItIiArICh5eWNoYXIgKyB5eWxlbmd0aCgpKSk7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gVU5ERUZJTkVEOw0KLX0NCi0NCi1cMDQwIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCJTUEFDRSIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCi1cMDExIHsNCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpDQotCQlkdW1wKCIweDkiKTsvLyROT04tTkxTLTEkDQotCXJldHVybiBXSElURV9TUEFDRTsNCi19DQotXDAxNSANCi17DQotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQ0KLQkJZHVtcCgiQ0FSUklBR0UgUkVUVVJOIik7Ly8kTk9OLU5MUy0xJA0KLQlyZXR1cm4gV0hJVEVfU1BBQ0U7DQotfQ0KLVwwMTIgew0KLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikNCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQNCi0JcmV0dXJuIFdISVRFX1NQQUNFOw0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4LmNtZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTllODExYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1jbWQgL2MgZmxleHguY21kDQotY21kIC9jIGZsZXhqLmNtZA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiNmUzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXguc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLSMhL2Jpbi9zaA0KLWV4cG9ydCBQQVRIPSRQQVRIOi9vcHQvSUJNSmF2YTItMTMxL2Jpbi86L29wdC9JQk1KYXZhMi0xMy9iaW4vOi9vcHQvamRrMS40DQotamF2YSAtWG14NDcwMDAwMDAwIC1jcCBKRmxleC9saWIvc2VkLWpmbGV4LmphcjsuIEpGbGV4Lk1haW4gSlNQVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZQ0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgSkZsZXgvbGliL3NlZC1qZmxleC5qYXI7LiBKRmxleC5NYWluIFhNTFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UNCi1ybSAtZiBKU1BUb2tlbml6ZXIuamF2YX4gSlNQVG9rZW5pemVyfiBYTUxUb2tlbml6ZXIuamF2YX4gWE1MVG9rZW5pemVyfg0KLWNwIC12IFhNTFRva2VuaXplci5qYXZhIC4uLy4uLy4uLy4uL3NlZG1vZGVsL2NvbS9pYm0vc2VkL3BhcnNlci9pbnRlcm5hbA0KLWNwIC12IEpTUFRva2VuaXplci5qYXZhIC4uLy4uLy4uLy4uL3NlZG1vZGVsL2NvbS9pYm0vc2VkL3BhcnNlci9pbnRlcm5hbA0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleGouY21kIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjEyYTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9mbGV4ai5jbWQKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLUBlY2hvIG9mZg0KLVBBVEg9JVBBVEglO2M6XGpkazEuNC4yXzA5XGJpbg0KLWphdmEgLVhteDQ3MDAwMDAwMCAtY3AgZDpcSkZsZXhcMS4yLjJcbGliXEpGbGV4LmphcjsuIEpGbGV4Lk1haW4gSlNQVG9rZW5pemVyLmpmbGV4IC1za2VsIHNrZWxldG9uLnNzZSAmJiBybSAtZiBKU1BUb2tlbml6ZXIuamF2YX4gSlNQVG9rZW5pemVyfiAmJiBjb3B5IEpTUFRva2VuaXplci5qYXZhIC4uXC4uXC4uXC4uXC4uXG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZVxzcmNcb3JnXGVjbGlwc2VcanN0XGpzcFxjb3JlXGludGVybmFsXHBhcnNlclxcaW50ZXJuYWxcSlNQVG9rZW5pemVyLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL2ZsZXh4LmNtZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2IxZjgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvZmxleHguY21kCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1AZWNobyBvZmYNCi1QQVRIPSVQQVRIJTtjOlxqZGsxLjQuMl8wOFxiaW4NCi1qYXZhIC1YbXg0NzAwMDAwMDAgLWNwIGQ6XEpGbGV4XDEuMi4yXGxpYlxKRmxleC5qYXI7LiBKRmxleC5NYWluIFhNTFRva2VuaXplci5qZmxleCAtc2tlbCBza2VsZXRvbi5zc2UgJiYgcm0gLWYgWE1MVG9rZW5pemVyLmphdmF+IFhNTFRva2VuaXplcn4gJiYgY29weSBYTUxUb2tlbml6ZXIuamF2YSAuLlwuLlwuLlwuLlwuLlxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmVcc3JjXG9yZ1xlY2xpcHNlXHdzdFx4bWxcY29yZVxpbnRlcm5hbFxwYXJzZXJcWE1MVG9rZW5pemVyLmphdmENCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmI3NjM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L1NlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLQ0KLSAgLyoqIHRoaXMgY2hhcmFjdGVyIGRlbm90ZXMgdGhlIGVuZCBvZiBmaWxlICovDQotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOw0KLQ0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovDQotLS0tICBsZXhpY2FsIHN0YXRlcywgY2hhcm1hcA0KLQ0KLSAgLyogZXJyb3IgY29kZXMgKi8NCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsNCi0gIC8vIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9JTExFR0FMX1NUQVRFID0gMTsNCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9OT19NQVRDSCA9IDI7DQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7DQotDQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovDQotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7DQotICAgICJVbmtvd24gaW50ZXJuYWwgc2Nhbm5lciBlcnJvciIsCQkvLyROT04tTkxTLTEkDQotICAgICJJbnRlcm5hbCBlcnJvcjogdW5rbm93biBzdGF0ZSIsCQkvLyROT04tTkxTLTEkDQotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQNCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgkvLyROT04tTkxTLTEkDQotICB9Ow0KLQ0KLS0tLSBpc0ZpbmFsIGxpc3QNCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovDQotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgREZBICovDQotICBwcml2YXRlIGludCB5eV9zdGF0ZTsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovDQotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOw0KLQ0KLSAgLyoqIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMNCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8NCi0gIHByaXZhdGUgY2hhciB5eV9idWZmZXJbXSA9IG5ldyBjaGFyWzE2Mzg0XTsNCi0NCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfbWFya2VkUG9zOw0KLQ0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovDQotICBwcml2YXRlIGludCB5eV9wdXNoYmFja1BvczsNCi0NCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8NCi0gIHByaXZhdGUgaW50IHl5X2N1cnJlbnRQb3M7DQotDQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovDQotICBwcml2YXRlIGludCB5eV9zdGFydFJlYWQ7DQotDQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkDQotICAgICAgZnJvbSBpbnB1dCAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfZW5kUmVhZDsNCi0NCi0gIC8qKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5bGluZTsNCi0NCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8NCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsNCi0NCi0gIC8qKg0KLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIA0KLSAgICogbWF0Y2hlZCB0ZXh0DQotICAgKi8NCi0gIC8vIHByaXZhdGUgaW50IHl5Y29sdW1uOyANCi0NCi0gIC8qKiANCi0gICAqIHl5X2F0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQ0KLSAgICovDQotICAvLyBwcml2YXRlIGJvb2xlYW4geXlfYXRCT0w7DQotDQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLw0KLSAgcHJpdmF0ZSBib29sZWFuIHl5X2F0RU9GOw0KLQ0KLS0tLSB1c2VyIGNsYXNzIGNvZGUNCi0NCi0gIC8qKg0KLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyDQotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuDQotICAgKg0KLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uDQotICAgKi8NCi0tLS0gY29uc3RydWN0b3IgZGVjbGFyYXRpb24NCi0NCi0NCi0gIC8qKg0KLSAgICogR2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIuDQotICAgKg0KLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgc3RyZWFtLCBFT0YgaWYgdGhlDQotICAgKiAgICAgICAgICAgICAgZW5kIG9mIHRoZSBzdHJlYW0gaXMgcmVhY2hlZC4NCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMNCi0gICAqLw0KLSAgcHJpdmF0ZSBpbnQgeXlfYWR2YW5jZSgpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsNCi0NCi0gICAgLyogc3RhbmRhcmQgY2FzZSAqLw0KLSAgICBpZiAoeXlfY3VycmVudFBvcyA8IHl5X2VuZFJlYWQpIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0NCi0gICAgLyogaWYgdGhlIGVvZiBpcyByZWFjaGVkLCB3ZSBkb24ndCBuZWVkIHRvIHdvcmsgaGFyZCAqLyANCi0gICAgaWYgKHl5X2F0RU9GKSByZXR1cm4gWVlFT0Y7DQotDQotICAgIC8qIG90aGVyd2lzZTogbmVlZCB0byByZWZpbGwgdGhlIGJ1ZmZlciAqLw0KLQ0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLw0KLSAgICBpZiAoeXlfc3RhcnRSZWFkID4gMCkgew0KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIA0KLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCANCi0gICAgICAgICAgICAgICAgICAgICAgIHl5X2VuZFJlYWQteXlfc3RhcnRSZWFkKTsNCi0NCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLw0KLSAgICAgIHl5X2VuZFJlYWQtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfY3VycmVudFBvcy09IHl5X3N0YXJ0UmVhZDsNCi0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfcHVzaGJhY2tQb3MtPSB5eV9zdGFydFJlYWQ7DQotICAgICAgeXlfc3RhcnRSZWFkID0gMDsNCi0gICAgfQ0KLQ0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovDQotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsNCi0gICAgICAvKiBpZiBub3Q6IGJsb3cgaXQgdXAgKi8NCi0gICAgICBjaGFyIG5ld0J1ZmZlcltdID0gbmV3IGNoYXJbeXlfY3VycmVudFBvcyoyXTsNCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsNCi0gICAgICB5eV9idWZmZXIgPSBuZXdCdWZmZXI7DQotICAgIH0NCi0NCi0gICAgLyogZmluYWxseTogZmlsbCB0aGUgYnVmZmVyIHdpdGggbmV3IGlucHV0ICovDQotICAgIGludCBudW1SZWFkID0geXlfcmVhZGVyLnJlYWQoeXlfYnVmZmVyLCB5eV9lbmRSZWFkLCANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7DQotDQotICAgIGlmICggbnVtUmVhZCA9PSAtMSApIHJldHVybiBZWUVPRjsNCi0NCi0gICAgeXlfZW5kUmVhZCs9IG51bVJlYWQ7DQotDQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsNCi0gIH0NCi0NCi0gICAgDQotICAvKioNCi0gICAqIENsb3NlcyB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gew0KLSAgICB5eV9hdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8NCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovDQotICAgIHl5X3JlYWRlci5jbG9zZSgpOw0KLSAgfQ0KLQ0KLQ0KLSAgLyoqDQotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBpbnQgeXlzdGF0ZSgpIHsNCi0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7DQotICB9DQotDQotICAvKioNCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlDQotICAgKg0KLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQ0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgdm9pZCB5eWJlZ2luKGludCBuZXdTdGF0ZSkgew0KLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7DQotICB9DQotDQotDQotICAvKioNCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uDQotICAgKi8NCi0gIGZpbmFsIHB1YmxpYyBTdHJpbmcgeXl0ZXh0KCkgew0KLSAgICByZXR1cm4gbmV3IFN0cmluZyggeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQgKTsNCi0gIH0NCi0NCi0gIC8qKg0KLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLg0KLSAgICovDQotICBmaW5hbCBwdWJsaWMgaW50IHl5bGVuZ3RoKCkgew0KLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsNCi0gIH0NCi0NCi0NCi0gIC8qKg0KLSAgICogUmVwb3J0cyBhbiBlcnJvciB0aGF0IG9jY3VyZWQgd2hpbGUgc2Nhbm5pbmcgLSBmcm9tIHRoZSBTRUQgSkZsZXggc2tlbGV0b24NCi0gICAqDQotICAgKiBAcGFyYW0gICBlcnJvckNvZGUgIHRoZSBjb2RlIG9mIHRoZSBlcnJvcm1lc3NhZ2UgdG8gZGlzcGxheQ0KLSAgICovDQotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsNCi0gICAgdHJ5IHsNCi0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW2Vycm9yQ29kZV0pOw0KLSAgICB9DQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgew0KLSAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBZWV9FUlJPUl9NU0dbWVlfVU5LTk9XTl9FUlJPUl0pOw0KLSAgICB9DQotICAgIC8vIERPIE5PVCBFWElUIHRoZSBWTSBvbiBhbiBlcnJvcg0KLSAgICAvLyBTeXN0ZW0uZXhpdCgxKTsNCi0gIH0gDQotDQotDQotICAvKioNCi0gICAqIFB1c2hlcyB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiBjaGFyYWN0ZXJzIGJhY2sgaW50byB0aGUgaW5wdXQgc3RyZWFtLg0KLSAgICoNCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QNCi0gICAqDQotICAgKiBAcGFyYW0gbnVtYmVyICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gYmUgcmVhZCBhZ2Fpbi4NCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQ0KLSAgICovDQotICB2b2lkIHl5cHVzaGJhY2soaW50IG51bWJlcikgew0KLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQ0KLSAgICAgIHl5X1NjYW5FcnJvcihZWV9QVVNIQkFDS18yQklHKTsNCi0NCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsNCi0gIH0NCi0NCi0JLyoqDQotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkDQotCSAqLw0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7DQotCQlmb3IoaW50IGogPSAwOyBqIDwgZkJsb2NrTWFya2Vycy5zaXplKCk7IGorKykgew0KLQkJCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilmQmxvY2tNYXJrZXJzLmdldChqKTsNCi0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsNCi0JCQkJYm9vbGVhbiBtYXRjaGVzU29GYXIgPSB0cnVlOw0KLQkJCQlmb3IoaW50IGkgPSAwOyBpIDwgdGFnbmFtZUxlbmd0aCAmJiBtYXRjaGVzU29GYXI7IGkrKykgew0KLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7DQotCQkJCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkgIT0gbWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkNCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCQllbHNlIHsNCi0JCQkJCQlpZihDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyLmdldFRhZ05hbWUoKS5jaGFyQXQoaSkpICE9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKSkNCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7DQotCQkJCQl9DQotCQkJCX0NCi0JCQkJaWYobWF0Y2hlc1NvRmFyKQ0KLQkJCQkJcmV0dXJuIHRydWU7DQotCQkJfQ0KLQkJfQ0KLQkJcmV0dXJuIGZhbHNlOw0KLQl9DQotDQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKg0KLQkgKiBSZXR1cm4gQUxMIG9mIHRoZSByZWdpb25zIHNjYW5uYWJsZSB3aXRoaW4gdGhlIHJlbWFpbmluZyB0ZXh0DQotCSAqIE5vdGU6IGZvciB2ZXJpZmljYXRpb24gdXNlDQotCSAqLw0KLQlwdWJsaWMgZmluYWwgTGlzdCBnZXRSZWdpb25zKCkgew0KLQkJTGlzdCB0b2tlbnMgPSBuZXcgQXJyYXlMaXN0KCk7DQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOw0KLQkJdHJ5IHsNCi0JCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsNCi0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgew0KLQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsNCi0JCQkJCXRva2Vucy5hZGQocmVnaW9uKTsNCi0JCQkJfQ0KLQkJCQlyZWdpb24gPSBnZXROZXh0VG9rZW4oKTsNCi0JCQl9DQotCQl9DQotCQljYXRjaCAoU3RhY2tPdmVyZmxvd0Vycm9yIGUpIHsNCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpKyI6IGlucHV0IGNvdWxkIG5vdCBiZSB0b2tlbml6ZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRPZmZzZXQoKSwgZSk7Ly8kTk9OLU5MUy0xJA0KLQkJCXRocm93IGU7DQotCQl9DQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsNCi0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCANCi0JCQkvLyB3YXkgb2YgZ2V0dGluZyB0b2tlbnMsIG1hbnkgZXJyb3JzIGFyZSBzaW1wbHkgaGlkZGVuDQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIG5vdCBoYW5kbGVkIHJldHJpZXZpbmcgcmVnaW9uczogIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBlKTsvLyROT04tTkxTLTEkDQotCQl9DQotCQlyZXR1cm4gdG9rZW5zOw0KLQl9DQotCS8qKg0KLQkgKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZA0KLQkgKi8NCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsNCi0JCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgew0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbihzICsgIiAoIiArIHl5Y2hhciArICItIiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkDQotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJA0KLQkJCQkJU3RyaW5nVXRpbHMuZXNjYXBlKHl5dGV4dCgpKSArICJcJyIpOy8vJE5PTi1OTFMtMSQNCi0JCX0NCi0JfQ0KLQkvKiB1c2VyIG1ldGhvZCAgLSBza2VsZXRvbi5zZWQgKi8NCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFT0YoKSB7DQotCQlyZXR1cm4geXlfYXRFT0Y7DQotCX0NCi0vKiB1c2VyIG1ldGhvZCAtIHNrZWxldG9uLnNlZCAqLw0KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgew0KLQlJdGVyYXRvciBibG9ja3MgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7DQotCXdoaWxlKGJsb2Nrcy5oYXNOZXh0KCkpIHsNCi0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOw0KLQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobWFya2VyVGFnTmFtZSkpDQotCQkJCXJldHVybiB0cnVlOw0KLQkJfQ0KLQkJZWxzZSB7DQotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQ0KLQkJCQlyZXR1cm4gdHJ1ZTsNCi0JCX0NCi0JfQ0KLQlyZXR1cm4gZmFsc2U7DQotfQ0KLQ0KLS0tLSB5eV9kb0VvZg0KLSAgLyoqDQotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLA0KLSAgICogdGhlIGVuZCBvZiBpbnB1dCBpcyBlbmNvdW50ZXJlZCBvciBhbiBJL08tRXJyb3Igb2NjdXJzLg0KLSAgICoNCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbg0KLSAgICogQGV4Y2VwdGlvbiAgIElPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3Vycw0KLSAgICovDQotLS0tIHl5bGV4IGRlY2xhcmF0aW9uDQotICAgIGludCB5eV9pbnB1dDsNCi0gICAgaW50IHl5X2FjdGlvbjsNCi0NCi0tLS0gbG9jYWwgZGVjbGFyYXRpb25zDQotDQotICAgIHdoaWxlICh0cnVlKSB7DQotDQotLS0tIHN0YXJ0IGFkbWluIChsaW5lLCBjaGFyLCBjb2wgY291bnQpDQotICAgICAgeXlfYWN0aW9uID0gLTE7DQotDQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsNCi0NCi0tLS0gc3RhcnQgYWRtaW4gKGxleHN0YXRlIGV0YykNCi0NCi0gICAgICB5eV9mb3JBY3Rpb246IHsNCi0gICAgICAgIHdoaWxlICh0cnVlKSB7DQotICAgIA0KLSAgICAgICAgICB5eV9pbnB1dCA9IHl5X2FkdmFuY2UoKTsNCi0NCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsNCi0NCi0tLS0gbGluZSwgY29sLCBjaGFyIGNvdW50LCBuZXh0IHRyYW5zaXRpb24sIGlzRmluYWwgYWN0aW9uDQotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IA0KLSAgICAgICAgICAgIHl5X21hcmtlZFBvcyA9IHl5X2N1cnJlbnRQb3M7IA0KLS0tLSBsaW5lIGNvdW50IHVwZGF0ZQ0KLSAgICAgICAgICB9DQotDQotICAgICAgICB9DQotICAgICAgfQ0KLQ0KLS0tLSBjaGFyIGNvdW50IHVwZGF0ZQ0KLQ0KLSAgICAgIHN3aXRjaCAoeXlfYWN0aW9uKSB7ICAgIA0KLQ0KLS0tLSBhY3Rpb25zDQotICAgICAgICBkZWZhdWx0OiANCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7DQotICAgICAgICAgICAgeXlfYXRFT0YgPSB0cnVlOw0KLS0tLSBlb2Z2YWx1ZQ0KLSAgICAgICAgICB9IA0KLSAgICAgICAgICBlbHNlIHsNCi0tLS0gbm8gbWF0Y2gNCi0gICAgICAgICAgfQ0KLSAgICAgIH0NCi0gICAgfQ0KLSAgfSAgICANCi0NCi0tLS0gbWFpbg0KLQ0KLX0NCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9TZWRNb2RlbC9IVE1MVG9rZW5pemVyL2RldmVsL3NrZWxldG9uLnNzZS5yZWFkbWUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViODk3MDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9za2VsZXRvbi5zc2UucmVhZG1lCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1UaGUgc2tlbGV0b24uc2VkIGZpbGUgY29udGFpbnMgdGhlIG1vZGlmaWVkIEpGbGV4IDEuMi4yIHNrZWxldG9uIGZpbGUgd2l0aA0KLWNoYW5nZXMgZm9yIHVzZSB3aXRoIHRoZSB0b2tlbml6ZXJzIHdpdGhpbiB0aGUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbCBhbmQNCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuanNwIHBsdWdpbnMuDQotDQotVGhlIHNrZWxldG9uIGZpbGUncyBtZXRob2QgZGVmaW5pdGlvbnMgYXJlIGNvcGllZCBpbnRvIHRoZSBnZW5lcmF0ZWQgb3V0cHV0DQotZGlyZWN0bHkuDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmQ4M2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkNTU1Rva2VuaXplciI+Ci0JPHRhcmdldCBuYW1lPSJpbml0IiBkZXBlbmRzPSJwcm9wZXJ0aWVzIj4KLQkJPHByb3BlcnR5IG5hbWU9IndvcmtzcGFjZS5kaXIiIHZhbHVlPSIuLi8uLiIvPgotCQk8cHJvcGVydHkgbmFtZT0iamZsZXguamFyIiB2YWx1ZT0iL0RldlRpbWVTdXBwb3J0L0pGbGV4L2xpYi9zZWQtamZsZXguamFyIi8+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJqZmxleC5tYXhtZW1vcnkiIHZhbHVlPSI0NzAwMDAwMDAiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImpmbGV4Lm9wdCIgdmFsdWU9Ii1za2VsIFNlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwvc2tlbGV0b24uc3NlIi8+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9InByb3BlcnRpZXMiIGlmPSJlY2xpcHNlLnJ1bm5pbmciPgotCQk8cHJvcGVydHkgbmFtZT0iYnVpbGQuY29tcGlsZXIiIHZhbHVlPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5KRFRDb21waWxlckFkYXB0ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iQ1NTVG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5kaXIiIHZhbHVlPSJTZWRNb2RlbC9DU1NUb2tlbml6ZXIvZGV2ZWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iQ1NTVG9rZW5pemVyLmpmbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jc3Mvc3JjL2NvbS9pYm0vc3NlL21vZGVsL2Nzcy9pbnRlcm5hbC9wYXJzZXIiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImZpbmFsZGVzdC5kaXIiIHZhbHVlPSJvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9jc3MvY29yZS9pbnRlcm5hbC9wYXJzZXIiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10b2tlbml6ZXIiPgotCQkJPHBhcmFtIG5hbWU9ImpmbGV4Lm9wdCIgdmFsdWU9IiIvPgotCQk8L2FudGNhbGw+Ci0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IlhNTFRva2VuaXplciIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbCIvPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUxUb2tlbml6ZXIiLz4JCQkKLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnhtbC9zcmMvY29tL2libS9zc2UvbW9kZWwveG1sL2ludGVybmFsL3BhcnNlciIvPgotCQk8YW50Y2FsbCB0YXJnZXQ9ImJ1aWxkLXRva2VuaXplciIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJKU1BUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmRpciIgdmFsdWU9IlNlZE1vZGVsL0hUTUxUb2tlbml6ZXIvZGV2ZWwiLz4KLQkJPHByb3BlcnR5IG5hbWU9InNyYy5maWxlIiB2YWx1ZT0iSlNQVG9rZW5pemVyLmpmbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJkZXN0LmRpciIgdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5qc3Avc3JjL2NvbS9pYm0vc3NlL21vZGVsL2pzcC9wYXJzZXIvaW50ZXJuYWwiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJidWlsZC10b2tlbml6ZXIiLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0iYnVpbGQtdG9rZW5pemVyIiBkZXBlbmRzPSJpbml0Ij4KLQkJPGFudGNhbGwgdGFyZ2V0PSJydW4tamZsZXgiLz4KLQkJPGFudGNhbGwgdGFyZ2V0PSJjb3B5Ii8+Ci0JCTxhbnRjYWxsIHRhcmdldD0iY2xlYW4iLz4KLQk8L3RhcmdldD4KLQotCTx0YXJnZXQgbmFtZT0icnVuLWpmbGV4IiBkZXBlbmRzPSJpbml0Ij4KLQkJPGphdmEgY2xhc3NuYW1lPSJKRmxleC5NYWluIiBtYXhtZW1vcnk9IiR7amZsZXgubWF4bWVtb3J5fSIgZm9yaz0ieWVzIiA+Ci0JCQk8YXJnIGxpbmU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0gJHtqZmxleC5vcHR9Ii8+Ci0JCQk8Y2xhc3NwYXRoPgotCQkJCTxwYXRoZWxlbWVudCBsb2NhdGlvbj0iJHtqZmxleC5qYXJ9Ii8+Ci0JCQk8L2NsYXNzcGF0aD4KLQkJPC9qYXZhPgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY29weSIgZGVwZW5kcz0iaW5pdCI+Ci0JCTxjb3B5IHRvZGlyPSIke3dvcmtzcGFjZS5kaXJ9LyR7ZGVzdC5kaXJ9IiBvdmVyd3JpdGU9InRydWUiIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphdmEiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9jb3B5PgotCQk8Y29weSB0b2Rpcj0iJHt3b3Jrc3BhY2UuZGlyfS8ke2ZpbmFsZGVzdC5kaXJ9IiBvdmVyd3JpdGU9InRydWUiIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9Ij4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqLmphdmEiLz4KLQkJCTwvZmlsZXNldD4KLQkJPC9jb3B5PgotCTwvdGFyZ2V0PgotCQotCTx0YXJnZXQgbmFtZT0iY2xlYW4iIGRlcGVuZHM9ImluaXQiPgotCQk8ZGVsZXRlIHZlcmJvc2U9InRydWUiPgotCQkJPGZpbGVzZXQgZGlyPSIke3NyYy5kaXJ9IiBkZWZhdWx0ZXhjbHVkZXM9Im5vIj4KLQkJCQk8aW5jbHVkZSBuYW1lPSIqfiIvPgotCQkJPC9maWxlc2V0PgotCQk8L2RlbGV0ZT4KLQk8L3RhcmdldD4KLQkKLQotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2RldlRpbWVTdXBwb3J0SW5mby50eHQgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9EZXZUaW1lU3VwcG9ydC9kZXZUaW1lU3VwcG9ydEluZm8udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmQ3YWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL0RldlRpbWVTdXBwb3J0L2RldlRpbWVTdXBwb3J0SW5mby50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0KLQotVGhpcyBkaXJlY3RvcnksIERldlRpbWVTdXBwb3J0LCBub3JtYWxseSBjb250YWlucwotdGhlIHNvdXJjZSBmb3Igc29tZSBvZiBvdXIgcGFyc2VyIGdlbmVyYXRvcnMuIAotCi1TZWUgd3N0L2NvbXBvbmVudHMvc3NlL3BsdWdpbnMvCi1vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmVcRGV2VGltZVN1cHBvcnQKLQotVGhpcyBwYXJ0aWN1bGFyIHRleHQgZmlsZSB5b3UgYXJlIHJlYWRpbmcgCi1pcyB0aGUgb25seSBvbmUgc2hpcHBlZCAKLXdpdGggYW4gU0RLIGJ1aWxkLCBzaW5jZSB0aGUgb3RoZXIgZmlsZXMgCi1hcmUgc2VsZG9tIG5lZWRlZCBkdXJpbmcgZGV2ZWxvcG1lbnQgb3IgZGVidWdnaW5nLCAKLWFuZCBzb21lIG9mIHRob3NlIGZpbGVzIGNhdXNlIHByb2JsZW1zIHdpdGggbG9uZyAKLWZpbGVuYW1lIG9yIHBhdGhzIHRoYXQgZW5kIHVwIGJlaW5nIHRvbyBsb25nIGZvciAKLXNvbWUgcGxhdGZvcm1zLCBhbmQgc29tZSB1bnppcCBwcm9ncmFtcy4gCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwOWJkMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjEuMTAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3Quc3NlLnVpLG9yZy5lY2xpcHNlLndzdC54bWwuY29yZSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnNzZS51aSxvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscywKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC5zc2UudWksb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnRleHQ7dmlzaWJpbGl0eTo9cmVleHBvcnQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuZW1mLmNvbW1vbjtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYjNjY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotVGhlIGNvcmUgbW9kZWwgb2YgdGhlIHNzZSBmcmFtZXdvcmsuIEl0IHByb3ZpZGVzIHRoZSBiYXNlIGRvY3VtZW50IGNsYXNzZXMsCi1idWlsZGVycyBhbmQgcGFyc2Vycy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NjA1NDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc291cmNlLi4gPSBzcmMtZW5jb2RpbmcvLFwKLSAgICAgICAgICAgc3JjLyxcCi0gICAgICAgICAgIHNyYy10YXNrdGFncy8sXAotICAgICAgICAgICBzcmMtY29udGVudHByb3BlcnRpZXMvCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGNvbmZpZy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbAotYmluLmV4Y2x1ZGVzID0gYmluLyoqLFwKLSAgICAgICAgICAgICAgIEBkb3QvKiosXAotICAgICAgICAgICAgICAgdGVtcC5mb2xkZXIvKioKLXNyYy5pbmNsdWRlcyA9IHNjaGVtYS8sXAotICAgICAgICAgICAgICAgZG9jLyxcCi0gICAgICAgICAgICAgICBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0Lwotb3V0cHV0Li4gPSBiaW4vCi1zcmMuZXhjbHVkZXMgPSBEZXZUaW1lU3VwcG9ydC9idWlsZC54bWwsXAotICAgICAgICAgICAgICAgRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvLFwKLSAgICAgICAgICAgICAgIERldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzLwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29tcG9uZW50LnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZTIyM2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29tcG9uZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vZWNsaXBzZS5vcmcvd3RwL3JlbGVuZy90b29scy9jb21wb25lbnQtbW9kZWwiIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UiPgotCTxkZXNjcmlwdGlvbiB1cmw9Imh0dHA6Ly9lY2xpcHNlLm9yZy93ZWJ0b29scy93c3QvY29tcG9uZW50cy9zc2Uvb3ZlcnZpZXcuaHRtbCI+PC9kZXNjcmlwdGlvbj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgZnJhZ21lbnQ9ImZhbHNlIiAvPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzIiBhcGk9ImZhbHNlIj4KLQkJPHR5cGUgbmFtZT0iUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQkJPHR5cGUgbmFtZT0iSVByb3BlcnR5U291cmNlRXh0ZW5zaW9uIiBpbXBsZW1lbnQ9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dEVkaXRvciIgc3ViY2xhc3M9ImZhbHNlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQkJPHR5cGUgbmFtZT0iU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIiBzdWJjbGFzcz0idHJ1ZSIgaW5zdGFudGlhdGU9InRydWUiIC8+Ci0JPC9wYWNrYWdlPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBsdWdpbiBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvY2hhcnNldC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL2NoYXJzZXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwZTY1Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvY2hhcnNldC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotISB0aGUgbnVtYmVyIG9mIGNvZGVzZXQgbmFtZXMKLXRvdGFsbnVtYmVyPTI1Ci0KLSEgT25seSB0cmFuc2xhdGUgdGhlIHh4LmxhYmVsIHN0cmluZ3MuICBEbyBub3QgdHJhbnNsYXRlIHRoZSB4eC5pYW5hIG9yIHh4LmphdmEgc3RyaW5ncy4KLQotY29kZXNldC4wLmxhYmVsPUlTTyAxMDY0Ni9Vbmljb2RlKFVURi04KQotY29kZXNldC4wLmlhbmE9VVRGLTgKLQotY29kZXNldC4xLmxhYmVsPUlTTyAxMDY0Ni9Vbmljb2RlKFVURi0xNikgQmlnIEVuZGlhbgotY29kZXNldC4xLmlhbmE9VVRGLTE2Ci0KLWNvZGVzZXQuMi5sYWJlbD1JU08gMTA2NDYvVW5pY29kZShVVEYtMTZCRSkgQmlnIEVuZGlhbgotY29kZXNldC4yLmlhbmE9VVRGLTE2QkUKLQotY29kZXNldC4zLmxhYmVsPUlTTyAxMDY0Ni9Vbmljb2RlKFVURi0xNkxFKSBMaXR0bGUgRW5kaWFuCi1jb2Rlc2V0LjMuaWFuYT1VVEYtMTZMRQotCi1jb2Rlc2V0LjQubGFiZWw9VVMgQVNDSUkKLWNvZGVzZXQuNC5pYW5hPVVTLUFTQ0lJCi0KLWNvZGVzZXQuNS5sYWJlbD1JU08gTGF0aW4tMQotY29kZXNldC41LmlhbmE9SVNPLTg4NTktMQotCi0hIChTbGF2aWM6IEN6ZWNoLCBDcm9hdCwgR2VybWFuLCBIdW5nYXJpYW4sIFBvbGlzaCwgUm9tYW5pYW4sIFNsb3ZhaywgU2xvdmVuaWFuKQotY29kZXNldC42LmxhYmVsPUNlbnRyYWwvRWFzdCBFdXJvcGVhbiAoU2xhdmljKSAKLWNvZGVzZXQuNi5pYW5hPUlTTy04ODU5LTIKLQotISAoRXNwZXJhbnRvLCBHYWxpY2lhbiwgTWFsdGVzZSwgVHVya2lzaCkKLWNvZGVzZXQuNy5sYWJlbD1Tb3V0aGVybiBFdXJvcGVhbgotY29kZXNldC43LmlhbmE9SVNPLTg4NTktMwotCi1jb2Rlc2V0LjgubGFiZWw9QXJhYmljLCBMb2dpY2FsCi1jb2Rlc2V0LjguaWFuYT1JU08tODg1OS02Ci0KLWNvZGVzZXQuOS5sYWJlbD1BcmFiaWMKLWNvZGVzZXQuOS5pYW5hPXdpbmRvd3MtMTI1NgotCi1jb2Rlc2V0LjEwLmxhYmVsPUNoaW5lc2UsIE5hdGlvbmFsIFN0YW5kYXJkCi1jb2Rlc2V0LjEwLmlhbmE9R0IxODAzMAotCi1jb2Rlc2V0LjExLmxhYmVsPVRyYWRpdGlvbmFsIENoaW5lc2UsIEJpZzUKLWNvZGVzZXQuMTEuaWFuYT1CSUc1Ci0KLSEgKEVzdG9uaWFuLCBMYXR2aWFuLCBMaXRodWFuaWFuKQotY29kZXNldC4xMi5sYWJlbD1DeXJpbGxpYywgSVNPLTg4NTktNAotY29kZXNldC4xMi5pYW5hPUlTTy04ODU5LTQKLQotISAoQnVsZ2FyaWFuLCBCeWVsb3J1c3NpYW4sIE1hY2Vkb25pYW4sIFNlcmJpYW4sIFVrcmFpbmlhbikKLWNvZGVzZXQuMTMubGFiZWw9Q3lyaWxsaWMsIElTTy04ODU5LTUKLWNvZGVzZXQuMTMuaWFuYT1JU08tODg1OS01Ci0KLWNvZGVzZXQuMTQubGFiZWw9R3JlZWsKLWNvZGVzZXQuMTQuaWFuYT1JU08tODg1OS03Ci0KLWNvZGVzZXQuMTUubGFiZWw9SGVicmV3LCBWaXN1YWwKLWNvZGVzZXQuMTUuaWFuYT1JU08tODg1OS04Ci0KLSEgbGFiZWw9SGVicmV3LCBMb2dpY2FsCi0hIGlhbmE9SVNPLTg4NTktOC1JCi0KLWNvZGVzZXQuMTYubGFiZWw9SGVicmV3Ci1jb2Rlc2V0LjE2LmlhbmE9d2luZG93cy0xMjU1Ci0KLWNvZGVzZXQuMTcubGFiZWw9SmFwYW5lc2UsIEVVQy1KUAotY29kZXNldC4xNy5pYW5hPUVVQy1KUAotCi1jb2Rlc2V0LjE4LmxhYmVsPUphcGFuZXNlLCBJU08gMjAyMgotY29kZXNldC4xOC5pYW5hPUlTTy0yMDIyLUpQCi0KLWNvZGVzZXQuMTkubGFiZWw9SmFwYW5lc2UsIFNoaWZ0LUpJUwotY29kZXNldC4xOS5pYW5hPVNoaWZ0X0pJUwotCi1jb2Rlc2V0LjIwLmxhYmVsPUphcGFuZXNlLCBXaW5kb3dzLTMxSgotY29kZXNldC4yMC5pYW5hPXdpbmRvd3MtMzFqCi0KLWNvZGVzZXQuMjEubGFiZWw9S29yZWFuLCBFVUMtS1IKLWNvZGVzZXQuMjEuaWFuYT1FVUMtS1IKLQotY29kZXNldC4yMi5sYWJlbD1Lb3JlYW4sIElTTyAyMDIyCi1jb2Rlc2V0LjIyLmlhbmE9SVNPLTIwMjItS1IKLQotY29kZXNldC4yMy5sYWJlbD1UaGFpLCBUSVNJCi1jb2Rlc2V0LjIzLmlhbmE9VElTLTYyMAotCi1jb2Rlc2V0LjI0LmxhYmVsPVR1cmtpc2gKLWNvZGVzZXQuMjQuaWFuYT1JU08tODg1OS05CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvZGVmYXVsdElBTkEucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzVjM2Q3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2NvbmZpZy9kZWZhdWx0SUFOQS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBUaGlzIGZpbGUgbGlzdHMgY2hhcnNldCBtYXBwaW5ncyBiZXR3ZWVuIGFuIGVuY29kaW5nIGFuZCBpdHMgZGVmYXVsdAotIyBlcXVpdmFsZW50IGVuY29kaW5nIGxpc3RlZCBpbiBjaGFyc2V0LnByb3BlcnRpZXMKLSMgZm9ybWF0OiBhbnluYW1lPWlhbmEgbmFtZSBsaXN0ZWQgaW4gY2hhcnNldC5wcm9wZXJ0aWVzCi0KLSMgTm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5Ci13aW5kb3dzLTEyNTI9SVNPLTg4NTktMQotd2luZG93cy05MzI9U2hpZnRfSklTCi14LWV1Yy1qcC1saW51eD1FVUMtSlAgCi13aW5kb3dzLTk0OT1FVUMtS1IKLXgtd2luZG93cy05NDk9RVVDLUtSCi13aW5kb3dzLTk1MD1CSUc1Ci14LXdpbmRvd3MtOTUwPUJJRzUKLXdpbmRvd3MtOTM2PUdCMTgwMzAKLXgtbXN3aW4tOTM2PUdCMTgwMzAKLUdCMjMxMj1HQjE4MDMwCi14LUVVQy1DTj1HQjE4MDMwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvY29uZmlnL292ZXJyaWRlLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvb3ZlcnJpZGUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0MzhiMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9jb25maWcvb3ZlcnJpZGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGlzIGZpbGUgbGlzdHMgY2hhcnNldCBtYXBwaW5ncyB3aGljaCBzdXBwbGVtZW50IG9yIG92ZXJyaWRlIHRob3NlCi0jIHByb3ZpZGVkIGJ5IHRoZSBWTS4gVGhlcmUgYXJlIGZldyBjYXNlcyB3aGVyZSB0aGlzIHNob3VsZCBiZSByZXF1aXJlZC4KLSMgTm90ZTogdGhlcmUgaXMgbm8gaW50ZWdyZXR5IGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgdmFsaWRDaGFyc2V0TmFtZSBpcyBpbmRlZWQKLSMgdmFsaWQgZm9yIGEgZ2l2ZW4gVk0sIHNvIGVycm9ycyB3b3VsZCBvbmx5IHNob3cgdXAgd2hlbiBhdHRlbXB0ZWQgdG8gCi0jIGJlIHVzZWQuCi0KLSMgTm8gdHJhbnNsYXRpb24gbmVjZXNzYXJ5Ci0KLSMgZm9ybWF0OiBhbnluYW1lPXZhbGlkamF2YUNoYXJzZXROYW1lCi1JU08tODg1OS04LUk9SVNPLTg4NTktOAotWC1TSklTPVNoaWZ0X0pJUwotWC1FVUMtSlA9U2hpZnRfSklTCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2MvYm9vay5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2MvYm9vay5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNzhjZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL2Jvb2suY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLVAuQ29kZSB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMC4wMHB0Ow0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAxNXB0Ow0KLQlmb250LXNpemU6IDEwLjAwMDAwMHB0Ow0KLQlmb250LXdlaWdodDogbWVkaXVtOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQljb2xvcjogIzQ0NDRDQzsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IjsNCi19DQotSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7DQotCWRpc3BsYXk6IGJsb2NrOw0KLQl0ZXh0LWFsaWduOiBsZWZ0Ow0KLQl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXRvcDogMy4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMTEuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotCWZvbnQtc2l6ZTogOS4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogSXRhbGljOw0KLQljb2xvcjogIzAwMDAwMDsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkFyaWFsIjsNCi19DQotUC5Ob3RlIHsNCi0JZGlzcGxheTogYmxvY2s7DQotCXRleHQtYWxpZ246IGxlZnQ7DQotCXRleHQtaW5kZW50OiAwcHQ7DQotCW1hcmdpbi10b3A6IDE5LjUwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxOS41MDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMzBwdDsNCi0JZm9udC1zaXplOiAxMS4wMDAwMDBwdDsNCi0JZm9udC13ZWlnaHQ6IG1lZGl1bTsNCi0JZm9udC1zdHlsZTogSXRhbGljOw0KLQljb2xvcjogIzAwMDAwMDsNCi0JdGV4dC1kZWNvcmF0aW9uOiBub25lOw0KLQl2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7DQotCXRleHQtdHJhbnNmb3JtOiBub25lOw0KLQlmb250LWZhbWlseTogIkFyaWFsIjsNCi19DQotRU0uVUlMYWJlbCB7DQotCWZvbnQtd2VpZ2h0OiBCb2xkOw0KLQlmb250LXN0eWxlOiBSZWd1bGFyOw0KLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7DQotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsNCi0JdGV4dC10cmFuc2Zvcm06IG5vbmU7DQotfQ0KLUVNLkNvZGVOYW1lIHsNCi0JZm9udC13ZWlnaHQ6IEJvbGQ7DQotCWZvbnQtc3R5bGU6IFJlZ3VsYXI7DQotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsNCi0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOw0KLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsNCi0JZm9udC1mYW1pbHk6IkNvdXJpZXIgTmV3IjsNCi19DQotDQotDQotDQotDQotLyogZm9sbG93aW5nIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgbmVlZCB0byBiZSByZW1vdmVkIGZvciBEQkNTICovDQotDQotYm9keSwgaDEsIGgyLCBoMywgaDQsIGg1LCBoNiwgcCwgdGFibGUsIHRkLCBjYXB0aW9uLCB0aCwgdWwsIG9sLCBkbCwgbGksIGRkLCBkdCB7Zm9udC1mYW1pbHk6IEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7IGNvbG9yOiAjMDAwMDAwfQ0KLXByZQkJCQl7IGZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2V9DQotDQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi0vKiBmb2xsb3dpbmcgZm9udCBzaXplIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgT0sgZm9yIERCQ1MgKi8NCi1ib2R5LCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2LCBwLCB0YWJsZSwgdGQsIGNhcHRpb24sIHRoLCB1bCwgb2wsIGRsLCBsaSwgZGQsIGR0IHtmb250LXNpemU6IDEwcHQ7IH0NCi1wcmUJCQkJeyBmb250LXNpemU6IDEwcHR9DQotDQotLyogZW5kIGZvbnQgc2l6ZSBkZWNsYXJhdGlvbnMgKi8NCi0NCi1ib2R5CSAgICAgeyBiYWNrZ3JvdW5kOiAjRkZGRkZGfQ0KLWgxICAgICAgICAgICB7IGZvbnQtc2l6ZTogMThwdDsgbWFyZ2luLXRvcDogNTsgbWFyZ2luLWJvdHRvbTogMSB9CQ0KLWgyICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTRwdDsgbWFyZ2luLXRvcDogMjU7IG1hcmdpbi1ib3R0b206IDMgfQ0KLWgzICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTFwdDsgbWFyZ2luLXRvcDogMjA7IG1hcmdpbi1ib3R0b206IDMgfQ0KLWg0ICAgICAgICAgICB7IGZvbnQtc2l6ZTogMTBwdDsgbWFyZ2luLXRvcDogMjA7IG1hcmdpbi1ib3R0b206IDM7IGZvbnQtc3R5bGU6IGl0YWxpYyB9DQotcCAgICAgICAgICAgIHsgbWFyZ2luLXRvcDogMTBweDsgbWFyZ2luLWJvdHRvbTogMTBweCB9DQotcHJlCSAgICAgeyBtYXJnaW4tbGVmdDogNjsgZm9udC1zaXplOiA5cHQgfQ0KLWE6bGluawkgICAgIHsgY29sb3I6ICMwMDAwRkYgfQ0KLWE6aG92ZXIJICAgICB7IGNvbG9yOiAjMDAwMDgwIH0NCi1hOnZpc2l0ZWQgICAgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZSB9DQotdWwJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDEwIH0NCi1saQkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9IA0KLWxpIHAJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDAgfSANCi1vbAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMTAgfQ0KLWRsCSAgICAgeyBtYXJnaW4tdG9wOiAwOyBtYXJnaW4tYm90dG9tOiAxMCB9DQotZHQJICAgICB7IG1hcmdpbi10b3A6IDA7IG1hcmdpbi1ib3R0b206IDA7IGZvbnQtd2VpZ2h0OiBib2xkIH0NCi1kZAkgICAgIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMCB9DQotc3Ryb25nCSAgICAgeyBmb250LXdlaWdodDogYm9sZH0NCi1lbQkgICAgIHsgZm9udC1zdHlsZTogaXRhbGljfQ0KLXZhcgkgICAgIHsgZm9udC1zdHlsZTogaXRhbGljfQ0KLWRpdi5yZXZpc2lvbiB7IGJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsgYm9yZGVyLWxlZnQtd2lkdGg6IHRoaW47IA0KLQkJCQkgICBib3JkZXItbGVmdC1jb2xvcjogIzdCNjhFRTsgcGFkZGluZy1sZWZ0OjUgfQ0KLXRoCSAgICAgeyBmb250LXdlaWdodDogYm9sZCB9DQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9jL3NjaGVtYS5jc3MgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2Mvc2NoZW1hLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYmYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb2Mvc2NoZW1hLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLUg2LkNhcHRpb25GaWdDb2x1bW4jaGVhZGVyIHsNCi0JZm9udC1zaXplOjE2cHg7IA0KLQlkaXNwbGF5OmlubGluZQ0KLX0NCi0NCi1QLk5vdGUjY29weXJpZ2h0IHsNCi0JZm9udC1zaXplOiBzbWFsbGVyOyANCi0JZm9udC1zdHlsZTogbm9ybWFsOw0KLQljb2xvcjogIzMzNjY5OTsgDQotCWRpc3BsYXk6aW5saW5lOw0KLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAxMS4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI2R0ZCB7DQotCWNvbG9yOiAjODAwMDAwOyANCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMTAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNkdGRBdHRsaXN0IHsNCi0JY29sb3I6ICM4MDAwMDA7IA0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAyMC4wMDAwMDBwdDsNCi19DQotDQotUC5Db2RlI3RhZyB7DQotCWNvbG9yOiAjMDAwMDgwOyANCi0JZGlzcGxheTppbmxpbmU7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDAuMDAwMDAwcHQ7DQotfQ0KLQ0KLVAuQ29kZSNjc3RyaW5nIHsNCi0JY29sb3I6ICMwMDgwMDA7IA0KLQlkaXNwbGF5OmlubGluZTsNCi0JbWFyZ2luLXRvcDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsJDQotfQ0KLQ0KLS5Db25maWdNYXJrdXAjZWxlbWVudERlc2Mgew0KLQljb2xvcjogYmxhY2s7DQotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1ib3R0b206IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsNCi0JbWFyZ2luLWxlZnQ6IDEwLjAwMDAwMHB0Ow0KLX0NCi0NCi0uQ29uZmlnTWFya3VwI2F0dGxpc3REZXNjIHsNCi0JY29sb3I6IGJsYWNrOw0KLQltYXJnaW4tdG9wOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tYm90dG9tOiAwLjAwMDAwMHB0Ow0KLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7DQotCW1hcmdpbi1sZWZ0OiAzMi4wMDAwMDBwdDsNCi19DQotDQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvaGFuZHlTdHVmZi5qcGFnZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2hhbmR5U3R1ZmYuanBhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDdiNGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvaGFuZHlTdHVmZi5qcGFnZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4YWM2N2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFRleHQgTW9kZWwKLSMgZXh0ZW5zaW9uIG5hbWVzCi1BZGFwdF9Pbl9DcmVhdGVfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1BZGFwdCBPbiBDcmVhdGUgRmFjdG9yeSBFeHRlbnNpb24KLURvY3VtZW50X1R5cGVzX0V4dGVuc2lvbi5uYW1lPURvY3VtZW50IFR5cGVzIEV4dGVuc2lvbgotSlNQX0VtYmVkZGVkX0NvbnRlbnRfVHlwZV9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lPUpTUCBFbWJlZGRlZCBDb250ZW50IFR5cGUgSGFuZGxlciBFeHRlbnNpb24KLUNvbnRlbnRfVHlwZV9GYWN0b3J5X0NvbnRyaWJ1dGlvbl9FeHRlbnNpb24ubmFtZT1Db250ZW50IFR5cGUgRmFjdG9yeSBDb250cmlidXRpb24gRXh0ZW5zaW9uCi1DU1NfUHJvZmlsZV9FeHRlbnNpb24ubmFtZT1DU1MgUHJvZmlsZSBFeHRlbnNpb24KLUNvbW1lbnRfRWxlbWVudF9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lPUNvbW1lbnQgRWxlbWVudCBIYW5kbGVyIEV4dGVuc2lvbgotTW9kZWxfSGFuZGxlcl9FeHRlbnNpb24ubmFtZT1Nb2RlbCBIYW5kbGVyIEV4dGVuc2lvbgotRm9ybWF0X1Byb2Nlc3NvcnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9Rm9ybWF0IFByb2Nlc3NvcnMgRXh0ZW5zaW9uIFBvaW50Ci1UYXNrX1NjYW5uZXJfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9VGFzayBTY2FubmVyIEV4dGVuc2lvbiBQb2ludAotU3RydWN0dXJlZF9Tb3VyY2VzX1Rhc2tfRXh0ZW5zaW9uLm5hbWU9U3RydWN0dXJlZCBTb3VyY2VzIFRhc2sKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODlkODVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCi0JPCEtLSBkZXByZWNhdGVkIC0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImFkYXB0T25DcmVhdGVGYWN0b3J5IiBuYW1lPSIlQWRhcHRfT25fQ3JlYXRlX0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2FkYXB0T25DcmVhdGVGYWN0b3J5LmV4c2QiLz4KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImRvY3VtZW50VHlwZXMiIG5hbWU9IiVEb2N1bWVudF9UeXBlc19FeHRlbnNpb24ubmFtZSIgc2NoZW1hPSJzY2hlbWEvZG9jdW1lbnRUeXBlcy5leHNkIi8+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJlbWJlZGRlZFR5cGVIYW5kbGVyIiBuYW1lPSIlSlNQX0VtYmVkZGVkX0NvbnRlbnRfVHlwZV9IYW5kbGVyX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9lbWJlZGRlZFR5cGVIYW5kbGVyLmV4c2QiLz4KLQk8IS0tIGRlcHJlY2F0ZWQgLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uIiBuYW1lPSIlQ29udGVudF9UeXBlX0ZhY3RvcnlfQ29udHJpYnV0aW9uX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9jb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24uZXhzZCIvPgotCTwhLS0gSSBjb21tZW50ZWQgb3V0IC4uLiBjbGllbnRzIHNob3VsZCBqdXN0IHVzZSB0aGUgbm9ybWFsIHBsYXRmb3JtIHdheSBvZiByZWdpc3RlcmluZyB0aGVzZSAKLQkJYWRhcHRlckZhY3Rvcmllcy4gQXQgd29yc3QsIHRoZXknZCBuZWVkIGEgc21hbGwgcGx1Z2luIHdpdGggJ3N0YXJ0dXAnIHNwZWNpZmllZCAuLi4gYnV0IHRoYXQncyAKLQkJYmV0dGVyIHRoYW4gdXMgZ2V0dGluZyBoaXQgd2l0aCB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0IChvZiBsb2FkaW5nIHBsdWdpbnMgYW5kIHByZS1yZXFzLCBldGMuKS4gCi0JCTxleHRlbnNpb24tcG9pbnQgaWQ9InVyaVJlc29sdmVyQWRhcHRlckZhY3RvcnkiIG5hbWU9IlJlc291cmNlIEFkYXB0ZXIgRmFjdG9yeSBmb3IgQ3JlYXRpbmcgVVJJUmVzb2x2ZXJzIi8+Ci0JLS0+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjc3Nwcm9maWxlIiBuYW1lPSIlQ1NTX1Byb2ZpbGVfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2Nzc3Byb2ZpbGUuZXhzZCIvPgotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0iY29tbWVudEVsZW1lbnRIYW5kbGVyIiBuYW1lPSIlQ29tbWVudF9FbGVtZW50X0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NvbW1lbnRFbGVtZW50SGFuZGxlci5leHNkIi8+Ci0KLQk8IS0tIG5vdCBmb3IgdXNlIGJ5IGNsaWVudHMgKGludGVybmFsKS0tPgotCTxleHRlbnNpb24tcG9pbnQgaWQ9Im1vZGVsSGFuZGxlciIgbmFtZT0iJU1vZGVsX0hhbmRsZXJfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL21vZGVsSGFuZGxlci5leHNkIi8+Ci0JPCEtLSBub3QgZm9yIHVzZSBieSBjbGllbnRzIChpbnRlcm5hbCktLT4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJmb3JtYXRQcm9jZXNzb3JzIgotCQluYW1lPSIlRm9ybWF0X1Byb2Nlc3NvcnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiCi0JCXNjaGVtYT0ic2NoZW1hL2Zvcm1hdFByb2Nlc3NvcnMuZXhzZCIgLz4KLQotCTwhLS0gbm90IGZvciB1c2UgYnkgY2xpZW50cyAoaW50ZXJuYWwpLS0+Ci0JPGV4dGVuc2lvbi1wb2ludCBpZD0idGFza3NjYW5uZXIiIG5hbWU9IiVUYXNrX1NjYW5uZXJfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL3Rhc2tzY2FubmVyLmV4c2QiLz4KLQotCTwhLS0gZGVmaW5lIG91ciB0YXNrIG1hcmtlciB0eXBlIC0tPgotCTxleHRlbnNpb24KLQkJaWQ9InRhc2siCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX1NvdXJjZXNfVGFza19FeHRlbnNpb24ubmFtZSIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLm1hcmtlcnMiPgotCQk8c3VwZXIgdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMudGFza21hcmtlciIgLz4KLQkJPHBlcnNpc3RlbnQgdmFsdWU9InRydWUiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIE1ha2Ugc3VyZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzIGFyZSBzZXQgYXQgcnVudGltZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuUHJlZmVyZW5jZUluaXRpYWxpemVyIiAvPgotCTwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9hZGFwdE9uQ3JlYXRlRmFjdG9yeS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2FkYXB0T25DcmVhdGVGYWN0b3J5LmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkYmY4OTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2FkYXB0T25DcmVhdGVGYWN0b3J5LmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImFkYXB0T25DcmVhdGVGYWN0b3J5IiBuYW1lPSJBZGFwdCBPbiBDcmVhdGUgRmFjdG9yeSBFeHRlbnNpb24gUG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgZGVwcmVjYXRlZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbW1lbnRFbGVtZW50SGFuZGxlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbW1lbnRFbGVtZW50SGFuZGxlci5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDQxNzM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb21tZW50RWxlbWVudEhhbmRsZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImNvbW1lbnRFbGVtZW50SGFuZGxlciIgbmFtZT0iQ29tbWVudCBFbGVtZW50IEhhbmRsZXIgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJoYW5kbGVyLWN1c3RvbSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJoYW5kbGVyLWN1c3RvbSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InN0YXJ0d2l0aCIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY29tbWVudHR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InN0YXJ0d2l0aCI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InByZWZpeCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbi5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2NvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbi5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjg0MThlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9jb250ZW50VHlwZUZhY3RvcnlDb250cmlidXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iY29udGVudFR5cGVGYWN0b3J5Q29udHJpYnV0aW9uIiBuYW1lPSJDb250ZW50IFR5cGUgRmFjdG9yeSBDb250cmlidXRpb24gRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OyAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY3NzcHJvZmlsZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2Nzc3Byb2ZpbGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTIzZTg1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvY3NzcHJvZmlsZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iY3NzcHJvZmlsZSIgbmFtZT0iQ1NTIFByb2ZpbGUgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm9maWxlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb2ZpbGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZG9jdW1lbnRUeXBlcy5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2RvY3VtZW50VHlwZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjkwZjM1Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZG9jdW1lbnRUeXBlcy5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iZG9jdW1lbnRUeXBlcyIgbmFtZT0iRG9jdW1lbnQgVHlwZXMgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJkb2N1bWVudFR5cGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZG9jdW1lbnRUeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZWxlbWVudE5hbWUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGlzcGxheU5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2VVUkkiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNYSFRNTCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaGFzRnJhbWVzZXQiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpY0lEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InN5c3RlbUlEIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRYSFRNTCIgdHlwZT0iYm9vbGVhbiI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaXNXTUwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImRlZmF1bHRXTUwiIHR5cGU9ImJvb2xlYW4iPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImFwaUluZm8iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImltcGxlbWVudGF0aW9uIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJjb3B5cmlnaHQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiZsdDticiZndDsKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgCi1hdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgCi10aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCAmbHQ7YQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZW1iZWRkZWRUeXBlSGFuZGxlci5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL2VtYmVkZGVkVHlwZUhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjZGU4ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZW1iZWRkZWRUeXBlSGFuZGxlci5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI+Ci08YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2NoZW1hIHBsdWdpbj0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIiBpZD0iZW1iZWRkZWRUeXBlSGFuZGxlciIgbmFtZT0iSlNQIEVtYmVkZGVkIENvbnRlbnQgVHlwZSBIYW5kbGVyIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZW1iZWRkZWRUeXBlSGFuZGxlciIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlbWJlZGRlZFR5cGVIYW5kbGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9mb3JtYXRQcm9jZXNzb3JzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvZm9ybWF0UHJvY2Vzc29ycy5leHNkCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWJkNWViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9mb3JtYXRQcm9jZXNzb3JzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4NCi08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPg0KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPg0KLTxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9ImZvcm1hdFByb2Nlc3NvcnMiIG5hbWU9IkZvcm1hdCBQcm9jZXNzb3JzIEV4dGVuc2lvbiBQb2ludCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBmb3IgZGVmaW5pbmcgdGhlIGZvcm1hdCBwcm9jZXNzc29yIGZvciBhIGNvbnRlbnQgdHlwZS4NCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+DQotICAgICAgPGNvbXBsZXhUeXBlPg0KLSAgICAgICAgIDxzZXF1ZW5jZT4NCi0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb2Nlc3NvciIvPg0KLSAgICAgICAgIDwvc2VxdWVuY2U+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4NCi0gICAgICAgICAgICA8YW5ub3RhdGlvbj4NCi0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50DQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQ0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+DQotICAgICAgICAgICAgICAgPC9hcHBJbmZvPg0KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4NCi0gICAgICAgICA8L2F0dHJpYnV0ZT4NCi0gICAgICA8L2NvbXBsZXhUeXBlPg0KLSAgIDwvZWxlbWVudD4NCi0NCi0gICA8ZWxlbWVudCBuYW1lPSJwcm9jZXNzb3IiPg0KLSAgICAgIDxjb21wbGV4VHlwZT4NCi0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICAgICA8YXBwSW5mbz4NCi0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPg0KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPg0KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPg0KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPg0KLSAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAgICA8L2Fubm90YXRpb24+DQotICAgICAgICAgPC9hdHRyaWJ1dGU+DQotICAgICAgPC9jb21wbGV4VHlwZT4NCi0gICA8L2VsZW1lbnQ+DQotDQotICAgPGFubm90YXRpb24+DQotICAgICAgPGFwcEluZm8+DQotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgJmx0O3ByZSZndDsNCi0gICAmbHQ7ZXh0ZW5zaW9uDQotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMmcXVvdDsmZ3Q7DQotICAgICAgJmx0O3Byb2Nlc3Nvcg0KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS54bWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTCZxdW90Ow0KLSAgICAgICAgICAgIGNvbnRlbnRUeXBlSWQ9JnF1b3Q7b3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCZxdW90OyZndDsNCi0gICAgICAmbHQ7L3Byb2Nlc3NvciZndDsNCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsNCi0mbHQ7L3ByZSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICANCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLSAgIDxhbm5vdGF0aW9uPg0KLSAgICAgIDxhcHBJbmZvPg0KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4NCi0gICAgICA8L2FwcEluZm8+DQotICAgICAgPGRvY3VtZW50YXRpb24+DQotICAgICAgICAgDQotICAgICAgPC9kb2N1bWVudGF0aW9uPg0KLSAgIDwvYW5ub3RhdGlvbj4NCi0NCi0gICA8YW5ub3RhdGlvbj4NCi0gICAgICA8YXBwSW5mbz4NCi0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPg0KLSAgICAgIDwvYXBwSW5mbz4NCi0gICAgICA8ZG9jdW1lbnRhdGlvbj4NCi0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0Ow0KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgDQotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIA0KLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthDQotaHJlZj0mcXVvdDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZxdW90OyZndDtodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCZsdDsvYSZndDsNCi0gICAgICA8L2RvY3VtZW50YXRpb24+DQotICAgPC9hbm5vdGF0aW9uPg0KLQ0KLTwvc2NoZW1hPg0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9tb2RlbEhhbmRsZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NjaGVtYS9tb2RlbEhhbmRsZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMzNzViYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvbW9kZWxIYW5kbGVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiIGlkPSJtb2RlbEhhbmRsZXIiIG5hbWU9Ik1vZGVsIEhhbmRsZXIgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJtb2RlbEhhbmRsZXIiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ibW9kZWxIYW5kbGVyIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iYXNzb2NpYXRlZENvbnRlbnRUeXBlSWQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZGVmYXVsdCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc2NoZW1hL3Rhc2tzY2FubmVyLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvdGFza3NjYW5uZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZjMDNmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zY2hlbWEvdGFza3NjYW5uZXIuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIgaWQ9InRhc2tzY2FubmVyIiBuYW1lPSJUYXNrIFNjYW5uZXIgRXh0ZW5zaW9uIFBvaW50Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzY2FubmVyIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InNjYW5uZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZUlkcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0YmZhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciBpbXBsZW1lbnRzIElDb250ZW50U2V0dGluZ3NIYW5kbGVyIHsKLQotCi0JcHJpdmF0ZSBJQ29udGVudFNldHRpbmdzIGNvbnRlbnRTZXR0aW5ncyA9IENvbnRlbnRTZXR0aW5nc0NyZWF0b3IuY3JlYXRlKCk7Ci0JcHJpdmF0ZSBJUmVzb3VyY2VEZWx0YSBmRGVsdGE7Ci0KLQlwcml2YXRlIHZvaWQgY29tbW9uV2l0aFJlc3BlY3RUb0tpbmQoKSB7Ci0JCWdldENvbnRlbnRTZXR0aW5ncygpLnJlbGVhc2VDYWNoZSgpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJQ29udGVudFNldHRpbmdzIGdldENvbnRlbnRTZXR0aW5ncygpIHsKLQkJcmV0dXJuIGNvbnRlbnRTZXR0aW5nczsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgSVJlc291cmNlRGVsdGEgZ2V0RGVsdGEoKSB7Ci0JCXJldHVybiBmRGVsdGE7Ci0JfQotCi0KLQkvKgotCSAqIEBzZWUgSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIjaGFuZGxlKElSZXNvdXJjZURlbHRhKQotCSAqLwotCXB1YmxpYyB2b2lkIGhhbmRsZShmaW5hbCBJUmVzb3VyY2VEZWx0YSBkZWx0YSkgewotCQl0aGlzLmZEZWx0YSA9IGRlbHRhOwotCQkvLyBnZXQgUmVzb3VyY2UgZGVsdGEga2luZAotCQlmaW5hbCBpbnQga2luZCA9IGRlbHRhLmdldEtpbmQoKTsKLQkJLy8gbmV2ZXIgdXNlZCE/Ci0JCS8vSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQotCi0JCXN3aXRjaCAoa2luZCkgewotCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5DSEFOR0VEIDogewotCQkJCWhhbmRsZUNoYW5nZWQoKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6IHsKLQkJCQloYW5kbGVSZW1vdmVkKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElSZXNvdXJjZURlbHRhLkFEREVEIDogewotCQkJCWhhbmRsZUFkZGVkKCk7Ci0JCQl9Ci0JCQkJYnJlYWs7Ci0KLQotCQl9Ci0KLQotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkZWQoKSB7Ci0JCWNvbW1vbldpdGhSZXNwZWN0VG9LaW5kKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQ2hhbmdlZCgpIHsKLQkJY29tbW9uV2l0aFJlc3BlY3RUb0tpbmQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmVkKCkgewotCQljb21tb25XaXRoUmVzcGVjdFRvS2luZCgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQWJzdHJhY3RTdWJqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdFN1YmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc2YTdhNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9BYnN0cmFjdFN1YmplY3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3ViamVjdCBpbXBsZW1lbnRzIElOb3RpZnksIElTdWJqZWN0IHsKLQotCi0KLQlwcml2YXRlIHN0YXRpYyBNYXAgbGlzdGVuZXJMaXN0ID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExpc3RlbmVyKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlsaXN0ZW5lckxpc3QucHV0KGxpc3RlbmVyLCBsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElDb250ZW50U2V0dGluZ3NFdmVudFN1YmplY3Qjbm90aWZ5Q29udGVudFNldHRpbmdzTGlzdGVuZXJzKE9iamVjdCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSBjaGFuZ2VkUmVzb3VyY2UpIHsKLQotCQlTZXQga2V5cyA9IGxpc3RlbmVyTGlzdC5rZXlTZXQoKTsKLQkJSXRlcmF0b3IgaXRlciA9IGtleXMuaXRlcmF0b3IoKTsKLQotCQl3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLQkJCUlDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBjc2wgPSAoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyKSBpdGVyLm5leHQoKTsKLQkJCWNzbC5jb250ZW50U2V0dGluZ3NDaGFuZ2VkKGNoYW5nZWRSZXNvdXJjZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotCX0KLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMzc0NTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5GYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50U2V0dGluZ3MgaW1wbGVtZW50cyBJQ29udGVudFNldHRpbmdzIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgY29udGVudFNldHRpbmdzTmFtZSA9ICIuY29udGVudHNldHRpbmdzIjsvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTaW1wbGVOb2RlT3BlcmF0b3IgZG9tT3BlcmF0b3I7Ci0KLQlwcml2YXRlIHN0YXRpYyBJUHJvamVjdCBwcmVQcm9qZWN0OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgSUNvbnRlbnRTZXR0aW5ncyBzaW5nbGV0b24gPSBuZXcgQ29udGVudFNldHRpbmdzKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRDb250ZW50U2V0dGluZ3NOYW1lKCkgewotCQlyZXR1cm4gY29udGVudFNldHRpbmdzTmFtZTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBJQ29udGVudFNldHRpbmdzIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gc2luZ2xldG9uOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNvbnRlbnRTZXR0aW5nc1BhdGg7Ci0JcHJpdmF0ZSBJUHJvamVjdCBjdXJyUHJvamVjdDsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlRWxlbWVudE5hbWUgPSAiZmlsZSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBBVEhBVFRSID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvamVjdEVsZW1lbnROYW1lID0gInByb2plY3QiOy8vJE5PTi1OTFMtMSQKLQotCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyByb290RWxlbWVudE5hbWUgPSAiY29udGVudHNldHRpbmdzIjsvLyROT04tTkxTLTEkCi0KLQotCi0JcHJpdmF0ZSBDb250ZW50U2V0dGluZ3MoKSB7Ci0JCWN1cnJQcm9qZWN0ID0gbnVsbDsKLQkJY29udGVudFNldHRpbmdzUGF0aCA9IG51bGw7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgX3NldFByb3BlcnRpZXMoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBNYXAgcHJvcGVydGllcykgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzID09IG51bGwgfHwgcHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm47Ci0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCi0JCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKSB7Ci0JCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZvciBuZXcgWE1MIERvY3VtZW50Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZyb20gZXhpc3RpbmcgY29udGVudHNldHRpbmdzLgotCQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHByb2plY3QgRWxlbWVudCBhbmQgYWRkIGl0IGludG8gdHJlZQotCQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuYWRkRWxlbWVudFVuZGVyUm9vdCh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkvLyBjaGVjayBleGlzdHMgZmlsZSBFbGVtZW50Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIGZpbGUgRWxlbWVudCBhbmQgYWRkIHBhdGggaW50byBpdC4KLQkJCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmFkZEVsZW1lbnRVbmRlclJvb3QodGhpcy5maWxlRWxlbWVudE5hbWUpOwotCQkJCWRvbU9wZXJhdG9yLmFkZEF0dHJpYnV0ZUF0KGUsIGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBleGlzdHMgcHJvcGVydHlOYW1lIGF0dHJpYnV0ZQotCQlNYXAgYXR0ckxpc3QgPSBkb21PcGVyYXRvci5nZXRBdHRyaWJ1dGVzT2YoZSk7Ci0JCWJvb2xlYW4gaGFzQXR0ciA9IHRydWU7Ci0JCWlmIChhdHRyTGlzdCA9PSBudWxsIHx8IGF0dHJMaXN0LmlzRW1wdHkoKSkKLQkJCWhhc0F0dHIgPSBmYWxzZTsKLQkJU2V0IGtleXMgPSBwcm9wZXJ0aWVzLmtleVNldCgpOwotCQlJdGVyYXRvciBpaSA9IGtleXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGlpLmhhc05leHQoKSkgewotCQkJU3RyaW5nIHByb3BlcnR5TmFtZSA9IChTdHJpbmcpIGlpLm5leHQoKTsKLQkJCVN0cmluZyBwcm9wZXJ0eVZhbHVlID0gKFN0cmluZykgcHJvcGVydGllcy5nZXQocHJvcGVydHlOYW1lKTsKLQotCi0JCQlpZiAoIWhhc0F0dHIgfHwgKFN0cmluZykgYXR0ckxpc3QuZ2V0KHByb3BlcnR5TmFtZSkgPT0gbnVsbCkKLQkJCQkvLyBjcmVhdGUgcHJvcGVydHlOYW1lIGF0dHJpYnV0ZSBhbmQgYWRkCi0JCQkJZG9tT3BlcmF0b3IuYWRkQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJCWVsc2UKLQkJCQkvLyBzZXQgYXR0cmlidXRlIHZhbHVlCi0JCQkJZG9tT3BlcmF0b3IudXBkYXRlQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lLCBwcm9wZXJ0eVZhbHVlKTsKLQkJfQotCi0JCS8vIHdyaXRlIGRvbSB0cmVlIGludG8gLmNvbnRlbnRzZXR0aW5ncwotCQl0cnkgewotCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuV3JpdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0JCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQotCi0JfQotCi0KLQlwcml2YXRlIHZvaWQgX3NldFByb3BlcnR5KGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5VmFsdWUpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgcHJvcGVydHlOYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCi0JCQlpZiAoIWV4aXN0c0NvbnRlbnRTZXR0aW5ncygpKSB7Ci0JCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZvciBuZXcgWE1MIERvY3VtZW50Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZyb20gZXhpc3RpbmcgY29udGVudHNldHRpbmdzLgotCQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJCX0KLQotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIHByb2plY3QgRWxlbWVudCBhbmQgYWRkIGl0IGludG8gdHJlZQotCQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuYWRkRWxlbWVudFVuZGVyUm9vdCh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQkvLyBjaGVjayBleGlzdHMgZmlsZSBFbGVtZW50Ci0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQlpZiAoZSA9PSBudWxsKSB7Ci0JCQkJLy8gY3JlYXRlIGZpbGUgRWxlbWVudCBhbmQgYWRkIHBhdGggaW50byBpdC4KLQkJCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmFkZEVsZW1lbnRVbmRlclJvb3QodGhpcy5maWxlRWxlbWVudE5hbWUpOwotCQkJCWRvbU9wZXJhdG9yLmFkZEF0dHJpYnV0ZUF0KGUsIGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KHJlc291cmNlKSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBleGlzdHMgcHJvcGVydHlOYW1lIGF0dHJpYnV0ZQotCi0JCU1hcCBhdHRyTGlzdCA9IGRvbU9wZXJhdG9yLmdldEF0dHJpYnV0ZXNPZihlKTsKLQkJaWYgKGF0dHJMaXN0ID09IG51bGwgfHwgYXR0ckxpc3QuaXNFbXB0eSgpIHx8IChTdHJpbmcpIGF0dHJMaXN0LmdldChwcm9wZXJ0eU5hbWUpID09IG51bGwpCi0JCQkvLyBjcmVhdGUgcHJvcGVydHlOYW1lIGF0dHJpYnV0ZSBhbmQgYWRkCi0JCQlkb21PcGVyYXRvci5hZGRBdHRyaWJ1dGVBdChlLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCQllbHNlCi0JCQkvLyBzZXQgYXR0cmlidXRlIHZhbHVlCi0JCQlkb21PcGVyYXRvci51cGRhdGVBdHRyaWJ1dGVBdChlLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCi0KLQkJLy8gd3JpdGUgZG9tIHRyZWUgaW50byAuY29udGVudHNldHRpbmdzCi0JCXRyeSB7Ci0JCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCX0KLQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCi0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVET01UcmVlKCkgdGhyb3dzIFNpbXBsZU5vZGVPcGVyYXRvci5SZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb21PcGVyYXRvciA9PSBudWxsIHx8IChjdXJyUHJvamVjdCAhPSBudWxsICYmICghY3VyclByb2plY3QuZXF1YWxzKHByZVByb2plY3QpKSAmJiBjb250ZW50U2V0dGluZ3NQYXRoICE9IG51bGwpKQotCQkJZG9tT3BlcmF0b3IgPSBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yKGNvbnRlbnRTZXR0aW5nc1BhdGgpOwotCi0KLQl9Ci0KLQkvKgotCSAqIHByaXZhdGUgdm9pZCBjcmVhdGVOZXdET01UcmVlKCkgdGhyb3dzCi0JICogU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb257IC8vIGNyZWF0ZSBOZXcKLQkgKiBkb2N1bWVudCB3aGVuIG5vIGZpbGUgZXhpc3RzLiBET01JbXBsZW1lbnRhdGlvbiBpbXBsID0KLQkgKiBET01JbXBsZW1lbnRhdGlvbkltcGwuZ2V0RE9NSW1wbGVtZW50YXRpb24oKTsgRG9jdW1lbnQgZG9jdW1lbnQgPQotCSAqIGltcGwuY3JlYXRlRG9jdW1lbnQobnVsbCxyb290RWxlbWVudE5hbWUsbnVsbCk7IGRvbU9wZXJhdG9yID0gbmV3Ci0JICogU2ltcGxlTm9kZU9wZXJhdG9yKGRvY3VtZW50KTsgfQotCSAqLwotCXByaXZhdGUgdm9pZCBjcmVhdGVOZXdET01UcmVlKCkgdGhyb3dzIFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkubmV3RG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gY3JlYXRpbmcgZG9jdW1lbnQiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBjcmVhdGluZyBkb2N1bWVudCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQocm9vdEVsZW1lbnROYW1lKSk7Ci0JCQlkb21PcGVyYXRvciA9IG5ldyBTaW1wbGVOb2RlT3BlcmF0b3IoZG9jdW1lbnQpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGVsZXRlQWxsUHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgZGVsZXRlZEZpbGUpIHsKLQkJaWYgKGRlbGV0ZWRGaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIGlmIChkZWxldGVkRmlsZS5leGlzdHMoKSkgcmV0dXJuOwotCQlpZiAoKGRlbGV0ZWRGaWxlKS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLkZJTEUgJiYgKGRlbGV0ZWRGaWxlKS5nZXRUeXBlKCkgIT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlyZXR1cm47Ci0KLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChkZWxldGVkRmlsZSk7Ly8gZ2V0UHJvamVjdE9mKChJUmVzb3VyY2UpZGVsZXRlZEZpbGUpCi0JCS8vICsKLQkJLy8gSVBhdGguU0VQQVJBVE9SCi0JCS8vICsKLQkJLy8gY29udGVudFNldHRpbmdzTmFtZTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkKLQkJCXJldHVybjsKLQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnQgZSA9IG51bGw7Ci0JCWlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQkvLyBzZWxlY3QgcHJvamVjdCBlbGVtZW50IGFuZCBnZXQgYXR0cmlidXRlCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoTm9kZU5hbWUodGhpcy5wcm9qZWN0RWxlbWVudE5hbWUpOwotCQllbHNlIGlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpCi0JCQllID0gKEVsZW1lbnQpIGRvbU9wZXJhdG9yLmdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KGRlbGV0ZWRGaWxlKSk7Ci0JCWlmIChlID09IG51bGwpIHsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybjsKLQkJfQotCi0KLQkJLy8gd2hlbiBkZWxldGVkRmlsZSBlbnRyeSBleGlzdHMuCi0JCWlmIChkZWxldGVkRmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpCi0JCQlkb21PcGVyYXRvci5yZW1vdmVFbGVtZW50V2l0aCh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKGRlbGV0ZWRGaWxlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWRvbU9wZXJhdG9yLnJlbW92ZUVsZW1lbnRXaXRoKGdldFBhdGhBdHRyKCksIGdldFJlbGF0aXZlUGF0aEZyb21Qcm9qZWN0KGRlbGV0ZWRGaWxlKSk7Ci0KLQotCQkvLyB3cml0ZSBkb20gdHJlZSBpbnRvIC5jb250ZW50c2V0dGluZ3MKLQkJdHJ5IHsKLQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0KLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBkZWxldGVQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuOwotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJcmV0dXJuOyAvLyB3aGVuIC5jb250ZW50c2V0dGluZ3MueG1sIGlzIE5PVCBleGlzdC4KLQkJfQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXRyeSB7Ci0JCQkJY3JlYXRlTmV3RE9NVHJlZSgpOwotCQkJCXdyaXRlRE9NRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuQ3JlYXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHRoaXMucHJvamVjdEVsZW1lbnROYW1lKTsKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCi0KLQkJaWYgKGUgIT0gbnVsbCkgewotCQkJZG9tT3BlcmF0b3IucmVtb3ZlQXR0cmlidXRlQXQoZSwgcHJvcGVydHlOYW1lKTsKLQkJCS8vIHdyaXRlIGRvbSB0cmVlIGludG8gLmNvbnRlbnRzZXR0aW5ncwotCQkJdHJ5IHsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBleCkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXgpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0KLQl9Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBleGlzdHNDb250ZW50U2V0dGluZ3MoKSB7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVJlc291cmNlIGZpbGUgPSBjdXJyUHJvamVjdC5nZXRGaWxlKGNvbnRlbnRTZXR0aW5nc05hbWUpOwotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoZmlsZS5pc0FjY2Vzc2libGUoKSkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHNQcm9wZXJ0aWVzKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQljb250ZW50U2V0dGluZ3NQYXRoID0gZ2V0Q29udGVudFNldHRpbmdzUGF0aChyZXNvdXJjZSk7Ci0JCWlmIChjb250ZW50U2V0dGluZ3NQYXRoID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkKLQkJCXJldHVybiBmYWxzZTsgLy8gd2hlbiAuY29udGVudHNldHRpbmdzLnhtbCBpcyBOT1QgZXhpc3QuCi0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHRoaXMucHJvamVjdEVsZW1lbnROYW1lKTsKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCi0JCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJaWYgKGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNYXAgcHJvcGVydGllcyA9IGRvbU9wZXJhdG9yLmdldEF0dHJpYnV0ZXNPZihlKTsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcHJvcGVydGllcy5yZW1vdmUoZ2V0UGF0aEF0dHIoKSk7Ly8gaWYgSUZpbGUscmVtb3ZlZAotCQlpZiAocHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0Q29udGVudFNldHRpbmdzUGF0aChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJU3RyaW5nIHByb2plY3RQYXRoID0gZ2V0UHJvamVjdE9mKHJlc291cmNlKTsKLQkJU3RyaW5nQnVmZmVyIHN0cmJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoIiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChwcm9qZWN0UGF0aCAhPSBudWxsKSB7Ci0JCQlzdHJidWYuYXBwZW5kKHByb2plY3RQYXRoKTsKLQkJCXN0cmJ1Zi5hcHBlbmQoSVBhdGguU0VQQVJBVE9SKTsKLQkJCXN0cmJ1Zi5hcHBlbmQoY29udGVudFNldHRpbmdzTmFtZSk7Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHN0ciA9IHN0cmJ1Zi50b1N0cmluZygpOwotCQlzdHJidWYuZGVsZXRlKDAsIHN0cmJ1Zi5sZW5ndGgoKSk7Ci0JCXJldHVybiBzdHI7Ci0JfQotCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRQYXRoQXR0cigpIHsKLQkJcmV0dXJuIFBBVEhBVFRSOwotCX0KLQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJvamVjdE9mKElSZXNvdXJjZSByZXNvdXJjZSkgewotCQkvLyBpZiAocmVzb3VyY2U9PW51bGwpIHJldHVybiBudWxsOwotCQljdXJyUHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJLy8gU3RyaW5nIHByb2plY3RQYXRoPW51bGw7Ci0KLQkJSVBhdGggcGF0aCA9IGN1cnJQcm9qZWN0LmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXBhdGggPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCk7Ci0JCQlpZiAocGF0aCAhPSBudWxsKSB7Ci0JCQkJcGF0aCA9IHBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJCQlwYXRoID0gcGF0aC5hcHBlbmQoY3VyclByb2plY3QuZ2V0TmFtZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKHBhdGggIT0gbnVsbCkgPyBwYXRoLnRvU3RyaW5nKCkgOiBudWxsOwotCi0JfQotCi0KLQlwdWJsaWMgc3luY2hyb25pemVkIE1hcCBnZXRQcm9wZXJ0aWVzKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCB8fCByZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY29udGVudFNldHRpbmdzUGF0aCA9IGdldENvbnRlbnRTZXR0aW5nc1BhdGgocmVzb3VyY2UpOwotCQlpZiAoY29udGVudFNldHRpbmdzUGF0aCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCFleGlzdHNDb250ZW50U2V0dGluZ3MoKSkgewotCQkJcmV0dXJuIG51bGw7IC8vIHdoZW4gLmNvbnRlbnRzZXR0aW5ncy54bWwgaXMgTk9UIGV4aXN0LgotCQl9Ci0KLQotCQl0cnkgewotCQkJY3JlYXRlRE9NVHJlZSgpOwotCQl9Ci0JCWNhdGNoIChTaW1wbGVOb2RlT3BlcmF0b3IuUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTEpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJLy8gY3JlYXRlIERPTSB0cmVlIGZvciBuZXcgWE1MIERvY3VtZW50Ci0JCQl0cnkgewotCQkJCWNyZWF0ZU5ld0RPTVRyZWUoKTsKLQkJCQl3cml0ZURPTURvY3VtZW50KCk7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLkNyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiBlMikgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQotCQl9Ci0KLQotCQlFbGVtZW50IGUgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKQotCQkJLy8gc2VsZWN0IHByb2plY3QgZWxlbWVudCBhbmQgZ2V0IGF0dHJpYnV0ZQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aE5vZGVOYW1lKHRoaXMucHJvamVjdEVsZW1lbnROYW1lKTsKLQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKQotCQkJZSA9IChFbGVtZW50KSBkb21PcGVyYXRvci5nZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShnZXRQYXRoQXR0cigpLCBnZXRSZWxhdGl2ZVBhdGhGcm9tUHJvamVjdChyZXNvdXJjZSkpOwotCi0KLQkJaWYgKGUgIT0gbnVsbCkgewotCi0JCQlNYXAgcHJvcGVydGllcyA9IGRvbU9wZXJhdG9yLmdldEF0dHJpYnV0ZXNPZihlKTsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCWlmIChwcm9wZXJ0aWVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAocHJvcGVydGllcy5pc0VtcHR5KCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlwcm9wZXJ0aWVzLnJlbW92ZShnZXRQYXRoQXR0cigpKTsKLQkJCXJldHVybiBwcm9wZXJ0aWVzOwotCQl9Ci0JCWVsc2UgewotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuIG51bGw7Ly8gd2hlbiBwcm9qZWN0IG9yIGZpbGUgZWxlbWVudCBpcyBOT1QgZXhpc3QuCi0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoIShyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFKSkKLQkJCXJldHVybiBudWxsOwotCi0JCWNvbnRlbnRTZXR0aW5nc1BhdGggPSBnZXRDb250ZW50U2V0dGluZ3NQYXRoKHJlc291cmNlKTsKLQkJaWYgKGNvbnRlbnRTZXR0aW5nc1BhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmICghZXhpc3RzQ29udGVudFNldHRpbmdzKCkpIHsKLQkJCXJldHVybiBudWxsOyAvLyB3aGVuIC5jb250ZW50c2V0dGluZ3MueG1sIGlzIE5PVCBleGlzdC4KLQkJfQotCi0KLQkJdHJ5IHsKLQkJCWNyZWF0ZURPTVRyZWUoKTsKLQkJfQotCQljYXRjaCAoU2ltcGxlTm9kZU9wZXJhdG9yLlJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUxKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCS8vIGNyZWF0ZSBET00gdHJlZSBmb3IgbmV3IFhNTCBEb2N1bWVudAotCQkJdHJ5IHsKLQkJCQljcmVhdGVOZXdET01UcmVlKCk7Ci0JCQkJd3JpdGVET01Eb2N1bWVudCgpOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5DcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGUyKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQkJY2F0Y2ggKFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZTIpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLQkJCQlwcmVQcm9qZWN0ID0gY3VyclByb2plY3Q7Ci0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0KLQkJfQotCi0KLQkJRWxlbWVudCBlID0gbnVsbDsKLQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUFJPSkVDVCkKLQkJCS8vIHNlbGVjdCBwcm9qZWN0IGVsZW1lbnQgYW5kIGdldCBhdHRyaWJ1dGUKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhOb2RlTmFtZSh0aGlzLnByb2plY3RFbGVtZW50TmFtZSk7Ci0JCWVsc2UgaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRklMRSkKLQkJCWUgPSAoRWxlbWVudCkgZG9tT3BlcmF0b3IuZ2V0RWxlbWVudFdpdGhBdHRyaWJ1dGUoZ2V0UGF0aEF0dHIoKSwgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QocmVzb3VyY2UpKTsKLQotCi0JCWlmIChlICE9IG51bGwpIHsKLQkJCVN0cmluZyByZXN1bHQgPSBlLmdldEF0dHJpYnV0ZShwcm9wZXJ0eU5hbWUpOwotCQkJcHJlUHJvamVjdCA9IGN1cnJQcm9qZWN0OwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCQllbHNlIHsKLQkJCXByZVByb2plY3QgPSBjdXJyUHJvamVjdDsKLQkJCXJldHVybiBudWxsOy8vIHdoZW4gcHJvamVjdCBvciBmaWxlIGVsZW1lbnQgaXMgTk9UIGV4aXN0LgotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVQYXRoRnJvbVByb2plY3QoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldFByb2plY3RSZWxhdGl2ZVBhdGgoKTsKLQkJaWYgKHBhdGggPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpZiByZXNvdXJjZSBpcyBwcm9qZWN0IG9yIHdvcmtzcGFjZSByb290Ci0JCVN0cmluZyByZXNvdXJjZVBhdGggPSBwYXRoLnRvU3RyaW5nKCk7Ci0KLQkJcmV0dXJuIHJlc291cmNlUGF0aDsKLQotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZWxlYXNlQ2FjaGUoKSB7Ci0JCWRvbU9wZXJhdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIE1hcCBwcm9wZXJ0aWVzKSB7Ci0JCS8vIGRlbnkgdG8gc2V0ICJwYXRoIiBhdHRyaWJ1dGUgdmFsdWUuCi0JCVNldCBrZXlzID0gcHJvcGVydGllcy5rZXlTZXQoKTsKLQkJSXRlcmF0b3IgaWkgPSBrZXlzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpaS5oYXNOZXh0KCkpIHsKLQkJCWlmICh0aGlzLmdldFBhdGhBdHRyKCkuZXF1YWxzKGlpLm5leHQoKSkpCi0JCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuX3NldFByb3BlcnRpZXMocmVzb3VyY2UsIHByb3BlcnRpZXMpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlKSB7Ci0JCS8vIGRlbnkgdG8gc2V0ICJwYXRoIiBhdHRyaWJ1dGUgdmFsdWUuCi0JCWlmICh0aGlzLmdldFBhdGhBdHRyKCkuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuX3NldFByb3BlcnR5KHJlc291cmNlLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpOwotCX0KLQotCXByaXZhdGUgdm9pZCB3cml0ZURPTURvY3VtZW50KCkgdGhyb3dzIFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCi0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQkJZG9tT3BlcmF0b3Iud3JpdGVEb2N1bWVudChvdXRwdXRTdHJlYW0pOwotCQkJb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0JCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQotCQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCi0JCQlJRmlsZSBvdXRwdXRGaWxlID0gY3VyclByb2plY3QuZ2V0RmlsZShjb250ZW50U2V0dGluZ3NOYW1lKTsKLQkJCWlmIChvdXRwdXRGaWxlLmV4aXN0cygpKQotCQkJCW91dHB1dEZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQkJZWxzZQotCQkJCW91dHB1dEZpbGUuY3JlYXRlKGlucHV0U3RyZWFtLCB0cnVlLCBudWxsKTsKLQotCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJdGhyb3cgbmV3IFNpbXBsZU5vZGVPcGVyYXRvci5Xcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oImludmFsaWQgb3V0cHV0RmlsZSBpbiB3cml0ZURPTURvY3VtZW50KCkiKTsvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBuZXcgU2ltcGxlTm9kZU9wZXJhdG9yLldyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbigiaW52YWxpZCBvdXRwdXRTdHJlYW0gb3IgaW5wdXRTdHJlYW0gaW4gd3JpdGVET01Eb2N1bWVudCgpIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ODMyOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50U2V0dGluZ3NDaGFuZ2VTdWJqZWN0IGV4dGVuZHMgQWJzdHJhY3RTdWJqZWN0IHsKLQotCi0JcHJpdmF0ZSBzdGF0aWMgSU5vdGlmeSBub3RpZnk7Ci0JcHJpdmF0ZSBzdGF0aWMgSVN1YmplY3Qgc3ViamVjdDsKLQotCXByb3RlY3RlZCBzdGF0aWMgSU5vdGlmeSBnZXROb3RpZnkoKSB7Ci0JCWlmIChub3RpZnkgPT0gbnVsbCAmJiBzdWJqZWN0ID09IG51bGwpIHsKLQkJCXN5bmNocm9uaXplZCAoQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdC5jbGFzcykgewotCQkJCWlmIChub3RpZnkgPT0gbnVsbCAmJiBzdWJqZWN0ID09IG51bGwpIHsKLQkJCQkJbm90aWZ5ID0gbmV3IENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QoKTsKLQkJCQkJc3ViamVjdCA9IChJU3ViamVjdCkgbm90aWZ5OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBub3RpZnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBJU3ViamVjdCBnZXRTdWJqZWN0KCkgewotCQlpZiAoc3ViamVjdCA9PSBudWxsICYmIG5vdGlmeSA9PSBudWxsKSB7Ci0JCQlzeW5jaHJvbml6ZWQgKENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuY2xhc3MpIHsKLQkJCQlpZiAoc3ViamVjdCA9PSBudWxsICYmIG5vdGlmeSA9PSBudWxsKSB7Ci0JCQkJCXN1YmplY3QgPSBuZXcgQ29udGVudFNldHRpbmdzQ2hhbmdlU3ViamVjdCgpOwotCQkJCQlub3RpZnkgPSAoSU5vdGlmeSkgc3ViamVjdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN1YmplY3Q7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZExpc3RlbmVyKElDb250ZW50U2V0dGluZ3NMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzdXBlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUxpc3RlbmVycyhvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgY2hhbmdlZFJlc291cmNlKSB7Ci0JCXN1cGVyLm5vdGlmeUxpc3RlbmVycyhjaGFuZ2VkUmVzb3VyY2UpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3VwZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0NyZWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYxZTMxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9Db250ZW50U2V0dGluZ3NDcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBTZWUKLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLmh0bWwuY29yZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy5IVE1MQ29udGVudFByb3BlcnRpZXMKLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRTZXR0aW5nc0NyZWF0b3IgewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBJQ29udGVudFNldHRpbmdzIGNyZWF0ZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRTZXR0aW5ncy5nZXRJbnN0YW5jZSgpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc0ZpbGVIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3MzgzZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzRmlsZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1jbGFzcyBDb250ZW50U2V0dGluZ3NGaWxlSGFuZGxlciBleHRlbmRzIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciB7Ci0KLQotCi0JcHJpdmF0ZSBNYXAgcHJvcGVydGllczsKLQotCi0JcHJpdmF0ZSB2b2lkIGdldFByb3BlcnRpZXMoSVJlc291cmNlIGZpbGUpIHsKLQkJcHJvcGVydGllcyA9IGdldENvbnRlbnRTZXR0aW5ncygpLmdldFByb3BlcnRpZXMoZmlsZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVBZGRlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkZWQoKSB7Ci0JCXN1cGVyLmhhbmRsZUFkZGVkKCk7Ci0KLQkJaWYgKHN1cGVyLmdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW11LT5jb3B5LT5jcmVhdGUgZmlsZSB3aXRob3V0IG92ZXJyaWRlLCBuZXcgZmlsZSwKLQkJCS8vIGltcG9ydCB3aXRob3V0IG92ZXJyaWRlCi0JCQkvLyBjb3B5LG5ldyxpbXBvcnQgaGFzIHNhbWUga2luZCg9MSkgYW5kIGZsYWcoPTApLgotCi0JCX0gZWxzZSBpZiAoKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLk1PVkVEX0ZST00pICE9IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPiByZW5hbWUgd2l0aG91dCBvdmVycmlkZSxwdWxsZG93biBtZW51LT5tb3ZlCi0JCQkvLyB3aXRob3V0IG92ZXJyaWRlCi0JCQkvLyBpbnN0ZWFkIG9mIHRoaXMgbWV0aG9kLGhhbmRsZVJlbW92ZWQoKSB3b3JrcyBmb3IgdGhpcyBkZWx0YQotCi0JCX0KLQotCX0KLQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVDaGFuZ2VkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVDaGFuZ2VkKCkgewotCQkvLyBlZGl0Ci0JCWlmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gSVJlc291cmNlRGVsdGEuQ09OVEVOVCAmJiAoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuUkVQTEFDRUQpID09IDApIHsKLQkJCXN1cGVyLmhhbmRsZUNoYW5nZWQoKTsKLQotCQl9IGVsc2UgaWYgKGdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSBJUmVzb3VyY2VEZWx0YS5DT05URU5UICYmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgIT0gMCkgewotCQkJLy8gb3ZlcnJpZGUgYXMgYSByZXN1bHQgb2YgY29weSBvciBpbXBvcnQKLQkJCS8vIGluIFdlYiBwcm9qZWN0LCBjb3B5IHdpdGggb3ZlcnJpZGUgZG9lc24ndCBoYXBwZW4KLQotCQkJLy8gb3ZlcnJpZGUgYXMgbW92ZSBvciByZW5hbWUKLQkJCS8vIGhhbmRsZVJlbW92ZWQoKSB3b3JrcyBmb3IgdGhpcyBkZWx0YQotCQkJc3VwZXIuaGFuZGxlQ2hhbmdlZCgpOwotCi0JCX0KLQotCi0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVSZW1vdmVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmVkKCkgewotCQlzdXBlci5oYW5kbGVSZW1vdmVkKCk7Ci0JCUlGaWxlIGRlbGV0ZWRGaWxlID0gbnVsbDsKLQotCQkvLyBpZiBlbnRyeSBleGlzdHMgdGhlbiByZW1vdmUgaXQuCi0JCWlmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVudS0+ZGVsZXRlCi0JCQlkZWxldGVkRmlsZSA9IChJRmlsZSkgZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpOwotCi0JCQlpZiAoZGVsZXRlZEZpbGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlnZXRDb250ZW50U2V0dGluZ3MoKS5kZWxldGVBbGxQcm9wZXJ0aWVzKGRlbGV0ZWRGaWxlKTsKLQotCQkJZ2V0Q29udGVudFNldHRpbmdzKCkucmVsZWFzZUNhY2hlKCk7Ci0JCX0KLQotCQllbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQotCQkJLy8gcHVsbGRvd24gbWVudS0+IHJlbmFtZSwgcHVsbGRvd24gbWVudS0+bW92ZQotCQkJZGVsZXRlZEZpbGUgPSAoSUZpbGUpIGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKTsKLQkJCWdldFByb3BlcnRpZXMoZGVsZXRlZEZpbGUpOwotCi0JCQkvLyBnZXQgZGVzdGluYXRpb24gSVJlc291cmNlCi0JCQlJUGF0aCB0YXJnZXRQYXRoID0gZ2V0RGVsdGEoKS5nZXRNb3ZlZFRvUGF0aCgpOwotCQkJSVdvcmtzcGFjZVJvb3QgaXdyID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJCUlSZXNvdXJjZSB0YXJnZXRGaWxlID0gaXdyLmdldEZpbGUodGFyZ2V0UGF0aCk7Ly9pd3IuZmluZE1lbWJlcih0YXJnZXRQYXRoKTsKLQotCQkJLy8gc2V0IHByb3BlcnR5IG9mIGRlc3RpbmF0aW9uIGZpbGUKLQkJCWdldENvbnRlbnRTZXR0aW5ncygpLmRlbGV0ZUFsbFByb3BlcnRpZXModGFyZ2V0RmlsZSk7Ci0JCQlzZXRQcm9wZXJ0aWVzKHRhcmdldEZpbGUpOwotCQkJaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkKLQkJCQlwcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCQlwcm9wZXJ0aWVzID0gbnVsbDsKLQkJfQotCi0JCWlmIChkZWxldGVkRmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlnZXRDb250ZW50U2V0dGluZ3MoKS5kZWxldGVBbGxQcm9wZXJ0aWVzKGRlbGV0ZWRGaWxlKTsKLQotCQlnZXRDb250ZW50U2V0dGluZ3MoKS5yZWxlYXNlQ2FjaGUoKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRQcm9wZXJ0aWVzKElSZXNvdXJjZSBmaWxlKSB7Ci0JCWlmIChmaWxlLmdldEZpbGVFeHRlbnNpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoIShmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJzaHRtbCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJodG0iKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtbCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqaHRtbCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJ4aHRtbCIpLy8kTk9OLU5MUy0xJAotCQkJCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc3AiKS8vJE5PTi1OTFMtMSQKLQkJCQkJfHwgZmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiY3NzIikvLyROT04tTkxTLTEkCi0JCQkJCXx8IGZpbGUuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzZiIpLy8kTk9OLU5MUy0xJAotCQl8fCBmaWxlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc3BmIikpKS8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJaWYgKHByb3BlcnRpZXMgPT0gbnVsbCB8fCBwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCXJldHVybjsKLQkJZ2V0Q29udGVudFNldHRpbmdzKCkuc2V0UHJvcGVydGllcyhmaWxlLCBwcm9wZXJ0aWVzKTsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmMWVlMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLQotLyoqCi0qIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0qLwotZmluYWwgY2xhc3MgQ29udGVudFNldHRpbmdzU2VsZkhhbmRsZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRlbnRTZXR0aW5nc0hhbmRsZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgSU5vdGlmeSBub3RpZnk7Ly8gPSBuZXcgQ29udGVudFNldHRpbmdzQ2hhbmdlZFN1YmplY3QoKTsKLQotCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGdldFN1YmplY3QoKSB7Ci0JCW5vdGlmeSA9IENvbnRlbnRTZXR0aW5nc0NoYW5nZVN1YmplY3QuZ2V0Tm90aWZ5KCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVBZGRlZCgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlQWRkZWQoKSB7Ci0JCWdldFN1YmplY3QoKTsKLQkJaWYgKHN1cGVyLmdldERlbHRhKCkuZ2V0RmxhZ3MoKSA9PSAwKSB7Ci0JCQkvLyBwdWxsZG93biBtZW11LT5jb3B5LT5jcmVhdGUgZmlsZSB3aXRob3V0IG92ZXJyaWRlLCBuZXcgZmlsZSwKLQkJCS8vIHByb3BlcnR5IHBhZ2UgY3JlYXRlIC5jb250ZW50c2V0dGluZ3MKLQkJCXN1cGVyLmhhbmRsZUFkZGVkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfSBlbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfRlJPTSkgIT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVudS0+IHJlbmFtZSB3aXRob3V0IG92ZXJyaWRlLHB1bGxkb3duIG1lbnUtPm1vdmUKLQkJCS8vIHdpdGhvdXQgb3ZlcnJpZGUKLQkJCXN1cGVyLmhhbmRsZUFkZGVkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfQotCi0JfQotCi0KLQkvKgotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50U2V0dGluZ3NIYW5kbGVyI2hhbmRsZUNoYW5nZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUNoYW5nZWQoKSB7Ci0JCWdldFN1YmplY3QoKTsKLQkJaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwICYmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgPT0gMCkgewotCQkJLy8gcmVzdWx0IG9mIGVkaXQsIHByb3BlcnR5IHBhZ2Ugb3BlcmF0ZSBzZXRQcm9wZXJ0eShhcHBseSBvciBvawotCQkJLy8gYnV0dG9uKSBpbiAuY29udGVudHNldHRpbmdzCi0JCQlzdXBlci5oYW5kbGVDaGFuZ2VkKCk7Ci0KLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9IGVsc2UgaWYgKChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5DT05URU5UKSAhPSAwICYmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgJiBJUmVzb3VyY2VEZWx0YS5SRVBMQUNFRCkgIT0gMCkgewotCQkJc3VwZXIuaGFuZGxlQ2hhbmdlZCgpOwotCQkJbm90aWZ5Lm5vdGlmeUxpc3RlbmVycyhnZXREZWx0YSgpLmdldFJlc291cmNlKCkpOwotCi0JCX0KLQotCi0JfQotCi0JLyoKLQkgKiBAc2VlIEFic3RyYWN0Q29udGVudFNldHRpbmdzSGFuZGxlciNoYW5kbGVSZW1vdmVkKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVSZW1vdmVkKCkgewotCQlnZXRTdWJqZWN0KCk7Ci0JCWlmIChnZXREZWx0YSgpLmdldEZsYWdzKCkgPT0gMCkgewotCQkJLy8gcHVsbGRvd24gbWVudS0+ZGVsZXRlCi0JCQlzdXBlci5oYW5kbGVSZW1vdmVkKCk7Ci0JCQlub3RpZnkubm90aWZ5TGlzdGVuZXJzKGdldERlbHRhKCkuZ2V0UmVzb3VyY2UoKSk7Ci0KLQkJfSBlbHNlIGlmICgoZ2V0RGVsdGEoKS5nZXRGbGFncygpICYgSVJlc291cmNlRGVsdGEuTU9WRURfVE8pICE9IDApIHsKLQkJCS8vIHB1bGxkb3duIG1lbnUtPiByZW5hbWUsIHB1bGxkb3duIG1lbnUtPm1vdmUKLQkJCXN1cGVyLmhhbmRsZVJlbW92ZWQoKTsKLQkJCW5vdGlmeS5ub3RpZnlMaXN0ZW5lcnMoZ2V0RGVsdGEoKS5nZXRSZXNvdXJjZSgpKTsKLQotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0NvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0ZjViZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhVmlzaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyIGltcGxlbWVudHMgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIgewotCWNsYXNzIENvbnRlbnRTZXR0aW5nc1Zpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VEZWx0YVZpc2l0b3IgewotCQkvLyByZWRlZmluaXRpb24gaW4gQ29udGVudFNldHRpbmdzLmphdmEKLQkJcHJpdmF0ZSBTdHJpbmcgY29udGVudFNldHRpbmdzTmFtZSA9IENvbnRlbnRTZXR0aW5ncy5nZXRDb250ZW50U2V0dGluZ3NOYW1lKCk7IC8vJE5PTi1OTFMtMSQKLQkJcHJpdmF0ZSBJUmVzb3VyY2VDaGFuZ2VFdmVudCBmRXZlbnQ7Ci0JCXByaXZhdGUgSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIgaGFuZGxlcjsKLQotCQlwdWJsaWMgQ29udGVudFNldHRpbmdzVmlzaXRvcihJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQkJdGhpcy5mRXZlbnQgPSBldmVudDsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElSZXNvdXJjZURlbHRhVmlzaXRvciN2aXNpdChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YSkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIHZpc2l0KElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCQlpZiAoZGVsdGEgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJLy8gcGFyZW50IGZvbGRlciBvciBwcm9qZWN0Ci0JCQlpZiAoZGVsdGEuZ2V0S2luZCgpID09IElSZXNvdXJjZURlbHRhLkNIQU5HRUQgJiYgZGVsdGEuZ2V0RmxhZ3MoKSA9PSAwKQotCQkJCXJldHVybiB0cnVlOwotCQkJZmluYWwgaW50IHJlc291cmNlVHlwZSA9IHJlc291cmNlLmdldFR5cGUoKTsKLQkJCXN3aXRjaCAocmVzb3VyY2VUeXBlKSB7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuUFJPSkVDVCA6Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQljYXNlIElSZXNvdXJjZS5GSUxFIDoKLQkJCQkJLy8gd2hldGhlciByZXNvdXJjZSBpcyAuY29udGVudHNldHRpbmdzIGZpbGUgb3Igbm90Ci0JCQkJCUlQcm9qZWN0IHByb2plY3QgPSBkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKTsKLQkJCQkJaWYgKHRoaXMuZkV2ZW50LmdldFR5cGUoKSA9PSBJUmVzb3VyY2VDaGFuZ2VFdmVudC5QT1NUX0NIQU5HRSAmJiByZXNvdXJjZS5lcXVhbHMocHJvamVjdC5nZXRGaWxlKHRoaXMuY29udGVudFNldHRpbmdzTmFtZSkpKSB7Ci0JCQkJCQkvLyBuZXcgb2JqZWN0IGZvciAuY29udGVudHNldHRpbmdzCi0JCQkJCQloYW5kbGVyID0gbmV3IENvbnRlbnRTZXR0aW5nc1NlbGZIYW5kbGVyKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAodGhpcy5mRXZlbnQuZ2V0VHlwZSgpID09IElSZXNvdXJjZUNoYW5nZUV2ZW50LlBSRV9CVUlMRCAmJiByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkgIT0gbnVsbCkgewotCQkJCQkJLy8gVE9ETyBjaGFuZ2UgdG8gY29udGVudCB0eXBlIQotCQkJCQkJaWYgKHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJzaHRtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJodG0iKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiaHRtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqaHRtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJ4aHRtbCIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc3AiKSAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQl8fCByZXNvdXJjZS5nZXRGaWxlRXh0ZW5zaW9uKCkuZXF1YWxzSWdub3JlQ2FzZSgiY3NzIikgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfHwgcmVzb3VyY2UuZ2V0RmlsZUV4dGVuc2lvbigpLmVxdWFsc0lnbm9yZUNhc2UoImpzZiIpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCXx8IHJlc291cmNlLmdldEZpbGVFeHRlbnNpb24oKS5lcXVhbHNJZ25vcmVDYXNlKCJqc3BmIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCS8vIG5ldyBvYmplY3QgZm9yIElGaWxlCi0JCQkJCQkJaGFuZGxlciA9IG5ldyBDb250ZW50U2V0dGluZ3NGaWxlSGFuZGxlcigpOwotCQkJCQkJCWhhbmRsZXIuaGFuZGxlKGRlbHRhKTsKLQkJCQkJCQloYW5kbGVyID0gbnVsbDsKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlCi0JCQkJCQlyZXR1cm4gZmFsc2U7IC8vIHRydWUgb3IgZmFsc2U7bW90b21vdG8gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2UuRk9MREVSIDoKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotLy8JCQlmaW5hbCBJUmVzb3VyY2VEZWx0YSBmRGVsdGEgPSBkZWx0YTsKLS8vCQkJZmluYWwgSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIgZGVsdGFIYW5kbGVyID0gdGhpcy5oYW5kbGVyOwotCQkJLy8gWFhYIEZJWE1FCi0JCQkvLyBJIGNvbW1lbnRlZCBvdXQgZm9sbG93aW5nIHRvIG1vdmUgdGhpcyB0byAibW9kZWwiIAotCQkJLy8gcGFja2FnZXMuIFNpbmNlIHdhc250J3QgaG9va2VkIHVwL3dvcmtpbmcgYW55d2F5LCBJIHRoaW5rIAotCQkJLy8gb2sgZm9yIG5vdywgYnV0IG5lZWQgdG8gcmUtd29yayBhcyBKb2IsIG9uY2Ugd2UgZG8gaW1wbGVtZW50IAotCQkJLy8gc2V0dGluZ3MgZm9yIHJlc291cmNlcyBhZ2Fpbi4gCi0vLwkJCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLS8vCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLS8vCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLS8vCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0vLwkJCQkJCWlmIChkZWx0YUhhbmRsZXIgIT0gbnVsbCkgewotLy8JCQkJCQkJZGVsdGFIYW5kbGVyLmhhbmRsZShmRGVsdGEpOwotLy8JCQkJCQl9Ci0vLwkJCQkJfQotLy8JCQkJfSk7Ci0vLwkJCX0KLS8vCQkJZWxzZSBpZiAoZGVsdGFIYW5kbGVyICE9IG51bGwpIHsKLS8vCQkJCWRlbHRhSGFuZGxlci5oYW5kbGUoZkRlbHRhKTsKLS8vCQkJfQotCQkJaGFuZGxlciA9IG51bGw7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8gdHJ1ZSBvciBmYWxzZTttb3RvbW90byB0cnVlOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgQ29udGVudFNldHRpbmdzU3luY2hyb25pemVyIGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIENvbnRlbnRTZXR0aW5nc1N5bmNocm9uaXplciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBDb250ZW50U2V0dGluZ3NTeW5jaHJvbml6ZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgQ29udGVudFNldHRpbmdzVmlzaXRvciBjc1Zpc2l0b3I7Ci0JcHJpdmF0ZSBib29sZWFuIGZMaXN0ZW5pbmcgPSBmYWxzZTsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCi0KLQlwcml2YXRlIGZpbmFsIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCXJldHVybiBmUHJvamVjdDsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlpZiAoZ2V0UHJvamVjdCgpID09IG51bGwpCi0JCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCQlyZXR1cm4gZ2V0UHJvamVjdCgpLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBpbnN0YWxsKCkgewotCQlpZiAoIWZMaXN0ZW5pbmcpIHsKLQkJCWdldFdvcmtzcGFjZSgpLmFkZFJlc291cmNlQ2hhbmdlTGlzdGVuZXIodGhpcywgSVJlc291cmNlQ2hhbmdlRXZlbnQuUFJFX0JVSUxEIHwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCQkJZkxpc3RlbmluZyA9IHRydWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzTGlzdGVuaW5nKCkgewotCQlyZXR1cm4gZkxpc3RlbmluZzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlc291cmNlQ2hhbmdlTGlzdGVuZXIjcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlQ2hhbmdlZChJUmVzb3VyY2VDaGFuZ2VFdmVudCBldmVudCkgewotCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCWlmIChkZWx0YSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChjc1Zpc2l0b3IgPT0gbnVsbCkKLQkJCQkJY3NWaXNpdG9yID0gbmV3IENvbnRlbnRTZXR0aW5nc1Zpc2l0b3IoZXZlbnQpOwotCQkJCWRlbHRhLmFjY2VwdChjc1Zpc2l0b3IpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJY3NWaXNpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgdW5JbnN0YWxsKCkgewotCQlnZXRXb3Jrc3BhY2UoKS5yZW1vdmVSZXNvdXJjZUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCQlmTGlzdGVuaW5nID0gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDBiYjRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIFNlZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2UuaHRtbC5jb3JlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLkhUTUxDb250ZW50UHJvcGVydGllcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50U2V0dGluZ3MgewotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBmaW5hbCBTdHJpbmcgQ1NTX1BST0ZJTEUgPSAiY3NzLXByb2ZpbGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBERVZJQ0VfUFJPRklMRSA9ICJ0YXJnZXQtZGV2aWNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBET0NVTUVOVF9UWVBFID0gImRvY3VtZW50LXR5cGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBIVE1MX0RPQ1VNRU5UX1RZUEUgPSAiaHRtbC1kb2N1bWVudC10eXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlQWxsUHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgZGVsZXRlZEZpbGUpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgZGVsZXRlUHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBib29sZWFuIGV4aXN0c1Byb3BlcnRpZXMoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBNYXAgZ2V0UHJvcGVydGllcyhmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShmaW5hbCBJUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogcmVsZWFzZSBjYWNoZSBvZiBET00gdHJlZSBpbiAuY29udGVudHNldHRpbmdzCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZUNhY2hlKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgTWFwIHByb3BlcnRpZXMpOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlWYWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjZTQwOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JQ29udGVudFNldHRpbmdzSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZURlbHRhOwotCi0vKioKLSogQGRlcHJlY2F0ZWQgVGhpcyBpcyBwYWNrYWdlIHByb3RlY3RlZCBzbyBubyBvbmUgY2FyZXMgYW55d2F5cy4KLSovCi1pbnRlcmZhY2UgSUNvbnRlbnRTZXR0aW5nc0hhbmRsZXIgewotCi0JcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIElSZXNvdXJjZURlbHRhIGRlbHRhKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL0lDb250ZW50U2V0dGluZ3NMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MWFkZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNvbnRlbnRTZXR0aW5nc0xpc3RlbmVyIHsKLQotCXZvaWQgY29udGVudFNldHRpbmdzQ2hhbmdlZChvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UgZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JTm90aWZ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JTm90aWZ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzOGRlOWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSU5vdGlmeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotKiBAZGVwcmVjYXRlZCBUaGlzIGlzIHBhY2thZ2UgcHJvdGVjdGVkIHNvIG5vIG9uZSBjYXJlcyBhbnl3YXlzLgotKi8KLWludGVyZmFjZSBJTm90aWZ5IHsKLQotCXZvaWQgbm90aWZ5TGlzdGVuZXJzKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSByZXNvdXJjZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JU3ViamVjdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWNvbnRlbnRwcm9wZXJ0aWVzL29yZy9lY2xpcHNlL3dzdC9zc2UvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvSVN1YmplY3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxYTViNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9JU3ViamVjdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgU2VlCi0gKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS5odG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuSFRNTENvbnRlbnRQcm9wZXJ0aWVzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN1YmplY3QgewotCi0Jdm9pZCBhZGRMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCByZW1vdmVMaXN0ZW5lcihJQ29udGVudFNldHRpbmdzTGlzdGVuZXIgbGlzdGVuZXIpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtY29udGVudHByb3BlcnRpZXMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy9TaW1wbGVOb2RlT3BlcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL1NpbXBsZU5vZGVPcGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjIzMWQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1jb250ZW50cHJvcGVydGllcy9vcmcvZWNsaXBzZS93c3Qvc3NlL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL1NpbXBsZU5vZGVPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllczsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3I7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotLyoqCi0qIEBkZXByZWNhdGVkIFRoaXMgaXMgcGFja2FnZSBwcm90ZWN0ZWQgc28gbm8gb25lIGNhcmVzIGFueXdheXMuCi0qLwotY2xhc3MgU2ltcGxlTm9kZU9wZXJhdG9yIHsKLQotCWNsYXNzIENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBDcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKFN0cmluZyByZWFzb24pIHsKLQkJCXN1cGVyKHJlYXNvbik7Ci0JCX0KLQl9Ci0KLQotCWNsYXNzIFJlYWRDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQlwdWJsaWMgUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotCQkJc3VwZXIocmVhc29uKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCQkvKioKLQkJICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oU3RyaW5nIHJlYXNvbikgewotCQkJc3VwZXIocmVhc29uKTsKLQkJfQotCX0KLQotCS8vIHdyaXRlciBjbGFzcyBmb3IgLmNvbnRlbnRTZXR0aW5ncy4KLQljbGFzcyBYTUxEb2N1bWVudFdyaXRlciB7Ci0JCU91dHB1dFN0cmVhbSBmT3V0OwotCi0JCXByb3RlY3RlZCBYTUxEb2N1bWVudFdyaXRlcihPdXRwdXRTdHJlYW0gb3V0KSB7Ci0JCQl0aGlzLmZPdXQgPSBvdXQ7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBjbG9zZSgpIHsKLQkJCXRyeSB7Ci0JCQkJZk91dC5jbG9zZSgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGRvIG5vdGhpbmcsIHNob3VsZG4ndCBtYXR0ZXIKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIHNlcmlhbGl6ZShEb2N1bWVudCBzb3VyY2VEb2N1bWVudCkgdGhyb3dzIFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCQkvLyBKQVhQIHRyYW5zZm9ybWF0aW9uCi0JCQlTb3VyY2UgZG9tU291cmNlID0gbmV3IERPTVNvdXJjZShzb3VyY2VEb2N1bWVudCk7Ci0JCQl0cnkgewotCQkJCVRyYW5zZm9ybWVyIHNlcmlhbGl6ZXIgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpOwotCQkJCXRyeSB7Ci0JCQkJCXNlcmlhbGl6ZXIuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlzZXJpYWxpemVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICI0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIHVuc3VwcG9ydGVkIHByb3BlcnRpZXMKLQkJCQl9Ci0JCQkJc2VyaWFsaXplci50cmFuc2Zvcm0oZG9tU291cmNlLCBuZXcgU3RyZWFtUmVzdWx0KGZPdXQpKTsKLQkJCX0gY2F0Y2ggKFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGhyb3cgbmV3IFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9IGNhdGNoIChUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IgZSkgewotCQkJCXRocm93IG5ldyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkgewotCQkJCXRocm93IG5ldyBXcml0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgewotCQlTaW1wbGVOb2RlT3BlcmF0b3IgYSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlhID0gbmV3IFNpbXBsZU5vZGVPcGVyYXRvcigid29ya3NwYWNlL29yZy5lY2xpcHNlLmV4YW1wbGVzLmNvbnRlbnRzZXR0aW5ncy8uY29udGVudHNldHRpbmdzLnhtbCIpOy8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5leGl0KDApOwotCQl9Ci0KLQkJLy8gcHJpbnQgYWxsIEVsZW1lbnRzCi0JCS8vYS5wcmludFRyZWUoaXRlcik7Ci0KLQkJLy8gYWRkIEVsZW1lbnQKLQkJTWFwIGF0dE1hcCA9IG5ldyBIYXNodGFibGUoKTsKLQkJYXR0TWFwLnB1dCgicGF0aCIsICJob2dlcGF0aCIpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlhdHRNYXAucHV0KCJmRG9jdW1lbnQtdHlwZSIsICJkb2N1bWVudGhvZ2Vob2dlIik7Ly8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWEuYWRkRWxlbWVudFVuZGVyUm9vdCgiZmlsZSIsIGF0dE1hcCk7Ly8kTk9OLU5MUy0xJAotCi0JCXRyeSB7Ci0JCQlhLndyaXRlRG9jdW1lbnQoU3lzdGVtLm91dCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZS50b1N0cmluZygpKTsKLQkJfQotCi0JfQotCi0JLy9uZXZlciB1c2VkCi0JLy9wcml2YXRlIERPTVBhcnNlciBwYXJzZXI7Ci0JcHJpdmF0ZSBEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBOb2RlIHJvb3Q7Ci0KLQlwcml2YXRlIFN0cmluZyBzZXR0aW5nc0ZpbGVOYW1lOwotCi0KLQlwdWJsaWMgU2ltcGxlTm9kZU9wZXJhdG9yKERvY3VtZW50IGRvYykgdGhyb3dzIENyZWF0ZUNvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCi0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKCJEb2N1bWVudCBkb2M9PW51bGwiKTsvLyROT04tTkxTLTEkCi0JCWZEb2N1bWVudCA9IGRvYzsKLQkJcm9vdCA9IGZEb2N1bWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBDcmVhdGVDb250ZW50U2V0dGluZ3NGYWlsdXJlRXhjZXB0aW9uKCJOb2RlIHJvb3Q9PW51bGwiKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFNpbXBsZU5vZGVPcGVyYXRvcihTdHJpbmcgZnVsbFBhdGgpIHRocm93cyBSZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCXRoaXMuc2V0dGluZ3NGaWxlTmFtZSA9IGZ1bGxQYXRoOwotCQljcmVhdGVPYmplY3RPZkRvY3VtZW50KCk7Ci0JfQotCi0JLy8gYWRkIGF0dHJpYnV0ZShhdHROYW1lPWF0dFZhbHVlKSBvZiBlbGUgd2l0aG91dCBjaGVja2luZyBvdmVybGFwcGluZyBvZgotCS8vIGFub3RoZXIgYXR0cmlidXRlcyBvZiBlbGUuCi0JLy8gaWYgb3ZlcmxhcHBpbmcgLG92ZXJyaWRlCi0JcHJvdGVjdGVkIE5vZGUgYWRkQXR0cmlidXRlQXQoRWxlbWVudCBlbGUsIFN0cmluZyBhdHROYW1lLCBTdHJpbmcgYXR0VmFsdWUpIHsKLQkJQXR0ciBhdHQgPSBmRG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGF0dE5hbWUpOwotCQlhdHQuc2V0VmFsdWUoYXR0VmFsdWUpOwotCQlpZiAoZWxlICE9IG51bGwpCi0JCQllbGUuc2V0QXR0cmlidXRlTm9kZShhdHQpOwotCQlyZXR1cm4gZWxlOwotCX0KLQotCXByb3RlY3RlZCBOb2RlIGFkZEVsZW1lbnRVbmRlcihOb2RlIHBhcmVudCwgU3RyaW5nIHRhZ05hbWUsIE1hcCBhdHRNYXApIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsIHx8IHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlFbGVtZW50IGUgPSBmRG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLQkJaWYgKGF0dE1hcCAhPSBudWxsKSB7Ci0JCQlpZiAoIWF0dE1hcC5pc0VtcHR5KCkpIHsKLQkJCQlTZXQgYXR0S2V5cyA9IGF0dE1hcC5rZXlTZXQoKTsKLQkJCQlJdGVyYXRvciBpdGVyID0gYXR0S2V5cy5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpdGVyLmhhc05leHQoKSkgewotCQkJCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaXRlci5uZXh0KCk7Ci0JCQkJCWUuc2V0QXR0cmlidXRlKGtleSwgKFN0cmluZykgYXR0TWFwLmdldChrZXkpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcGFyZW50LmFwcGVuZENoaWxkKGUpOwotCQlyZXR1cm4gZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgTm9kZSBhZGRFbGVtZW50VW5kZXJSb290KFN0cmluZyB0YWdOYW1lKSB7Ci0JCXJldHVybiBhZGRFbGVtZW50VW5kZXIocm9vdCwgdGFnTmFtZSwgbnVsbCk7Ci0JfQotCi0JLy8gYWRkIGVsZW1lbnQgd2l0aCBhdHRNYXAgYXMgYXR0cmlidXRlIHdpdGhvdXQgY2hlY2tpbmcgb3ZlcmxhcHBpbmcuCi0JcHJvdGVjdGVkIGZpbmFsIE5vZGUgYWRkRWxlbWVudFVuZGVyUm9vdChTdHJpbmcgdGFnTmFtZSwgTWFwIGF0dE1hcCkgewotCQlyZXR1cm4gYWRkRWxlbWVudFVuZGVyKHJvb3QsIHRhZ05hbWUsIGF0dE1hcCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNyZWF0ZU9iamVjdE9mRG9jdW1lbnQoKSB0aHJvd3MgUmVhZENvbnRlbnRTZXR0aW5nc0ZhaWx1cmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJZkRvY3VtZW50ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBGaWxlKHNldHRpbmdzRmlsZU5hbWUpKTsKLQkJfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBwYXJzaW5nIiArIHNldHRpbmdzRmlsZU5hbWUsIGUpOyAvLyROT04tTkxTLTEkCi0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkkvTyBleGNlcHRpb24gcGFyc2luZyIgKyBzZXR0aW5nc0ZpbGVOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBhY2Nlc3NpbmcgRE9NSW1wbGVtZW50YXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9IGNhdGNoIChGYWN0b3J5Q29uZmlndXJhdGlvbkVycm9yIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiBhY2Nlc3NpbmcgRE9NSW1wbGVtZW50YXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCS8vZ2V0IHRoZSByb290IG9mIHRoZSBYTUwgZkRvY3VtZW50Ci0JCXJvb3QgPSBmRG9jdW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBSZWFkQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbigiRXJyb3I6IE5vZGUgcm9vdD09bnVsbCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0QXR0cmlidXRlc09mKE5vZGUgbm9kZSkgewotCQlpZiAoIW5vZGUuaGFzQXR0cmlidXRlcygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaW50IHNpemUgPSBhdHRycy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBhdHRycy5pdGVtKGkpOwotCQkJbWFwLnB1dChhdHRyLmdldE5hbWUoKSwgYXR0ci5nZXRWYWx1ZSgpKTsKLQkJfQotCQlyZXR1cm4gKG1hcCk7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlIGdldEVsZW1lbnRXaXRoQXR0cmlidXRlKE5vZGUgZmlyc3QsIFN0cmluZyBhdHROYW1lLCBTdHJpbmcgYXR0VmFsdWUpIHsKLQkJTm9kZSBuYXZwb2ludCA9IGZpcnN0OwotCQl3aGlsZSAobmF2cG9pbnQgIT0gbnVsbCkgewotCQkJaWYgKG5hdnBvaW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlOYW1lZE5vZGVNYXAgbSA9IG5hdnBvaW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlpZiAobSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAobS5nZXROYW1lZEl0ZW0oYXR0TmFtZSkgIT0gbnVsbCkgewotCQkJCQlpZiAoYXR0VmFsdWUuZXF1YWxzKCgoQXR0cikgbS5nZXROYW1lZEl0ZW0oYXR0TmFtZSkpLmdldE5vZGVWYWx1ZSgpKSkKLQkJCQkJCXJldHVybiBuYXZwb2ludDsKLQkJCQl9Ci0JCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5hdnBvaW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQlpZiAoY2hpbGROb2RlcyAhPSBudWxsICYmIGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCU5vZGUgaG9sZE5vZGUgPSBnZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShuYXZwb2ludC5nZXRGaXJzdENoaWxkKCksIGF0dE5hbWUsIGF0dFZhbHVlKTsKLQkJCQkJaWYgKGhvbGROb2RlICE9IG51bGwpIHsKLQkJCQkJCXJldHVybiBob2xkTm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCW5hdnBvaW50ID0gbmF2cG9pbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCS8vIHJldHVybiBhIChmaXJzdCkgRWxlbWVudCB3aXRoIGF0dHIoYXR0TmFtZT1hdHRWYWx1ZSkgaXQgaWYgZXhpc3RzLAotCS8vIG90aGVyd2lzZSByZXR1cm4gbnVsbAotCXByb3RlY3RlZCBOb2RlIGdldEVsZW1lbnRXaXRoQXR0cmlidXRlKFN0cmluZyBhdHROYW1lLCBTdHJpbmcgYXR0VmFsdWUpIHsKLQkJaWYgKGF0dE5hbWUgPT0gbnVsbCB8fCBhdHRWYWx1ZSA9PSBudWxsIHx8ICFmRG9jdW1lbnQuaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRFbGVtZW50V2l0aEF0dHJpYnV0ZShmRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpLCBhdHROYW1lLCBhdHRWYWx1ZSk7Ci0JfQotCi0JLy8gcmV0cnVuIEVsZW1lbnQgd2hpY2ggaGFzIG5vZGVOYW1lIGFzIE5vZGUgTmFtZQotCXByb3RlY3RlZCBOb2RlIGdldEVsZW1lbnRXaXRoTm9kZU5hbWUoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCWlmIChub2RlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVzID0gZkRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5vZGVOYW1lKTsKLQkJaWYgKG5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJcmV0dXJuIG5vZGVzLml0ZW0oMCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJpbnRUcmVlKE5vZGVJdGVyYXRvciBpdGVyKSB7Ci0JCU5vZGUgbjsKLQkJd2hpbGUgKChuID0gaXRlci5uZXh0Tm9kZSgpKSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4obi5nZXROb2RlTmFtZSgpICsgIjoiKTsvLyROT04tTkxTLTEkCi0JCQlOYW1lZE5vZGVNYXAgbSA9IG4uZ2V0QXR0cmlidXRlcygpOwotCQkJaWYgKG0gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbS5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJU3RyaW5nIGF0dE5hbWUgPSBtLml0ZW0oaSkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KCIgIiArIGF0dE5hbWUgKyAiPSIgKyBtLml0ZW0oaSkuZ2V0Tm9kZVZhbHVlKCkpOy8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiKTsvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCS8vIHJlbW92ZSBhdHRyaWJ1dGUoYXR0TmFtZSkgYXQgZWxlLgotCXByb3RlY3RlZCBBdHRyIHJlbW92ZUF0dHJpYnV0ZUF0KEVsZW1lbnQgZWxlLCBTdHJpbmcgYXR0TmFtZSkgewotCQlpZiAoZWxlID09IG51bGwgfHwgYXR0TmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUF0dHIgYXR0ID0gZWxlLmdldEF0dHJpYnV0ZU5vZGUoYXR0TmFtZSk7Ci0JCWVsZS5yZW1vdmVBdHRyaWJ1dGUoYXR0TmFtZSk7Ci0JCXJldHVybiBhdHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEVsZW1lbnQgcmVtb3ZlRWxlbWVudFdpdGgoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCU5vZGVMaXN0IG5vZGVzID0gZkRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5vZGVOYW1lKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlub2Rlcy5pdGVtKGkpLmdldFBhcmVudE5vZGUoKS5yZW1vdmVDaGlsZChub2Rlcy5pdGVtKGkpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyByZW1vdmUgYSAoZmlyc3QpIEVsZW1lbnQgd2l0aCBhdHRyKGF0dE5hbWU9YXR0VmFsdWUpIGFuZCByZXR1cm4gaXQgaWYKLQkvLyBleGlzdHMsIG90aGVyd2lzZSByZXR1cm4gbnVsbAotCXByb3RlY3RlZCBFbGVtZW50IHJlbW92ZUVsZW1lbnRXaXRoKFN0cmluZyBhdHROYW1lLCBTdHJpbmcgYXR0VmFsdWUpIHsKLQkJaWYgKGZEb2N1bWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCU5vZGUgZWxlbWVudCA9IGdldEVsZW1lbnRXaXRoQXR0cmlidXRlKGF0dE5hbWUsIGF0dFZhbHVlKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwgJiYgZWxlbWVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJZWxlbWVudC5nZXRQYXJlbnROb2RlKCkucmVtb3ZlQ2hpbGQoZWxlbWVudCk7Ci0JCQkJcmV0dXJuIChFbGVtZW50KSBlbGVtZW50OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCi0JfQotCi0JLy8gdXBkYXRlIGF0dHJpYnV0ZShhdHROYW1lPW5ld1ZhbHVlKSBhdCBlbGUgaWYgYm90aCBlbGUgYW5kIGF0dHJpYnV0ZSBvZgotCS8vIGVsZSBleGlzdAotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUF0dHJpYnV0ZUF0KEVsZW1lbnQgZWxlLCBTdHJpbmcgYXR0TmFtZSwgU3RyaW5nIG5ld1ZhbHVlKSB7Ci0JCUF0dHIgYXR0ID0gbnVsbDsKLQkJaWYgKGVsZSAhPSBudWxsKQotCQkJaWYgKChhdHQgPSBlbGUuZ2V0QXR0cmlidXRlTm9kZShhdHROYW1lKSkgIT0gbnVsbCkKLQkJCQlhdHQuc2V0VmFsdWUobmV3VmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHdyaXRlRG9jdW1lbnQoT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIFdyaXRlQ29udGVudFNldHRpbmdzRmFpbHVyZUV4Y2VwdGlvbiB7Ci0JCVhNTERvY3VtZW50V3JpdGVyIHdyaXRlciA9IG5ldyBYTUxEb2N1bWVudFdyaXRlcihvdXQpOwotCQl0cnkgewotCQkJd3JpdGVyLnNlcmlhbGl6ZShmRG9jdW1lbnQpOwotCQl9IGZpbmFsbHkgewotCQkJd3JpdGVyLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZElPLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkSU8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJkOTk5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkSU8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29kZWRJTyB7Ci0KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQlVGX1NJWkUgPSAxMDI0ICogODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9NQVJLX1NJWkUgPSBNQVhfQlVGX1NJWkU7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19TUEVDX0RFRkFVTFQgPSAiTm9TcGVjRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFByb3BlcnRpZXMgb3ZlcnJpZGVuQ2hhcnNldHMgPSBudWxsOwotCi0JLyoqCi0JICogPHA+Ci0JICogVGhlcmUgYXJlIHR3byB3ZWxsIGtub3duIHVuZGVyc3Rvb2QgY2FzZXMgd2hlcmUgdGhlIHN0YW5kYXJkL2RlZmF1bHQKLQkgKiBKYXZhIE1hcHBpbmdzIGFyZSBub3Qgc3VmZmljaWVudC4gKFRoYW5rcyB0byBIaXJvdGFrYSBNYXRzdW1vdG8gZm9yCi0JICogcHJvdmlkaW5nIHRoZXNlIHR3bykuIEkgYmVsaWV2ZSB0aGVyZSBhcmUgb3RoZXJzIHRoYXQgaW5kaXZpZHVhbAotCSAqIGN1c3RvbWVycyBoYXZlIHJlcXVlc3RlZCB0byBvdmVycmlkZSBvbiBhIGNhc2UgYnkgY2FzZSBiYXNpcywgYnV0IEkndmUKLQkgKiBsb3N0IHRoZSBkZXRhaWxzLiBUT0RPLWZ1dHVyZTogZG9jdW1lbnQgc29tZSBvZiB0aG9zZSB1c2UtY2FzZXMuCi0JICogPC9wPgotCSAqIDx1bD4KLQkgKiA8bGk+SVNPLTg4NTktOC1JPC9saT4KLQkgKiA8cD4KLQkgKiBJbiB0aGUgY29kZSBjb252ZXJzaW9uIHBvaW50IG9mIHZpZXcsIElTTy05OTU5LTggYW5kIElTTy04ODU5LTgtSSBhcmUKLQkgKiB0aGUgc2FtZS4gSG93ZXZlci4gdGhlIHJlcHJlc2VudGF0aW9uIG9uIHRoZSBicm93c2VyIGlzIGRpZmZlcmVudC4gKAotCSAqIEl0J3MgdmVyeSB2ZXJ5IGhhcmQgdG8gZXhwbGFpbiB0aGlzIGludG8gdGhlIHdvcmRzLCBidXQgb25jZSB5b3Ugd2lsbAotCSAqIHNlZSwgeW91IHdpbGwgdW5kZXJzdGFuZCBpdCA6KSBNYW55IEJpRGkgSFRNTC9KU1BzIHVzZSBJU08tODg1OS04LUkgaW4KLQkgKiBNRVRBL3BhZ2UgZGlyZWN0aXZlLiBTbyBXU0FEIG5lZWRzIHRvIHN1cHBvcnQgdGhpcyBlbmNvZGluZy4KLQkgKiA8L3A+Ci0JICogPGxpPlgtU0pJUzwvbGk+Ci0JICogPHA+Ci0JICogQmVjYXVzZSBNb3NhaWMvTmF2aWdhdG9yIDIuMCBzdXBwb3J0ZWQgb25seSBYLVNKSVMvWC1FVUMtSlAsIGxvdHMgb2YKLQkgKiBvbGQgSFRNTCBmaWxlcyB1c2VkIFgtU0pJUy9YLUVVQy1KUCBzbyB0aGF0IHRoZSBjdXN0b21lcnMgc3RpbGwgd2FudCB1cwotCSAqIHRvIHN1cHBvcnQgdGhpcyBjb2RlIGNvbnZlcnNpb24gZm9yIEhUTUwgZmlsZXMuCi0JICogPC9wPgotCSAqIDwvdWw+Ci0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuIHRoZSBkZXRlY3RlZENoYXJzZXROYW1lLCBpZiBubyBvdmVycmlkZXMsIG90aGVyd2lzZSB0aGUgY2hhcnNldAotCSAqICAgICAgICAgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqLwotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGRlbGliZXJhdGx5ICdkZWZhdWx0IGFjY2Vzcycgc2luY2UgY2xpZW50cyBzaG91bGQgbm90Ci0JICogbmVlZCB0byBhY2Nlc3MgdGhpcyBpbmZvcm1hdGlvbiBkaXJlY3RseS4KLQkgKi8KLQlzdGF0aWMgcHVibGljIFN0cmluZyBjaGVja01hcHBpbmdPdmVycmlkZXMoU3RyaW5nIGRldGVjdGVkQ2hhcnNldE5hbWUpIHsKLQkJLy8gVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2hhdCB3YXMgcGFzc2VkIGluLCBpZgotCQkvLyB0aGVyZSBhcmUgbm8KLQkJLy8gb3ZlcnJpZGVzLgotCQlTdHJpbmcgcmVzdWx0ID0gZGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQkJU3RyaW5nIG5ld1Jlc3VsdCA9IGdldE92ZXJyaWRlbkNoYXJzZXRzKCkuZ2V0UHJvcGVydHkoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCWlmIChuZXdSZXN1bHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbmV3UmVzdWx0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIEVuY29kaW5nTWVtZW50byBjcmVhdGVFbmNvZGluZ01lbWVudG8oYnl0ZVtdIGRldGVjdGVkQm9tLCBTdHJpbmcgamF2YUNoYXJzZXROYW1lLCBTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHVuU3VwcG9ydGVkTmFtZSwgU3RyaW5nIHNwZWNEZWZhdWx0RW5jb2RpbmcsIFN0cmluZyByZWFzb24pIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJcmVzdWx0LnNldEphdmFDaGFyc2V0TmFtZShqYXZhQ2hhcnNldE5hbWUpOwotCQlyZXN1bHQuc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gVE9ETzogaWYgZGV0ZWN0ZWRDaGFyc2V0IGFuZCBzcGVjIGRlZmF1bHQgaXMKLQkJLy8gbnVsbCwgbmVlZCB0byB1c2UgIndvcmsKLQkJLy8gYmVuY2ggYmFzZWQiIGRlZmF1bHRzLgotCQlpZiAoc3BlY0RlZmF1bHRFbmNvZGluZyA9PSBudWxsKQotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChOT19TUEVDX0RFRkFVTFQpOwotCQllbHNlCi0JCQlyZXN1bHQuc2V0QXBwcm9wcmlhdGVEZWZhdWx0KHNwZWNEZWZhdWx0RW5jb2RpbmcpOwotCQlpZiAodW5TdXBwb3J0ZWROYW1lICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXRJbnZhbGlkRW5jb2RpbmcodW5TdXBwb3J0ZWROYW1lKTsKLQkJfQotCQkvLyBjaGVjayBpZiB2YWxpZAotCQl0cnkgewotCQkJQ2hhcnNldC5pc1N1cHBvcnRlZChqYXZhQ2hhcnNldE5hbWUpOwotCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LnNldEludmFsaWRFbmNvZGluZyhqYXZhQ2hhcnNldE5hbWUpOwotCQl9Ci0KLQkJLy8gY2hlY2sgVVRGODNCeXRlQk9NVXNlZCBhbmQgVW5pY29kZVN0cmVhbQotCQlpZiAoZGV0ZWN0ZWRCb20gIT0gbnVsbCkgewotCQkJaWYgKGRldGVjdGVkQm9tLmxlbmd0aCA9PSAyKQotCQkJCXJlc3VsdC5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJZWxzZSBpZiAoZGV0ZWN0ZWRCb20ubGVuZ3RoID09IDMpCi0JCQkJcmVzdWx0LnNldFVURjgzQnl0ZUJPTVVzZWQodHJ1ZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGRldGVjdGVkQ2hhcnNldE5hbWUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IG9uY2UgdGhpcyBpbnN0YW5jZSBpcyBjcmVhdGVkLCB0cmFjZSBpbmZvIHN0aWxsIG5lZWRzIHRvIGJlCi0JICogYXBwZW5kZWQgYnkgY2FsbGVyLCBkZXBlbmRpbmcgb24gdGhlIGNvbnRleHQgaXRzIGNyZWF0ZWQuCi0JICovCi0JcHVibGljIHN0YXRpYyBFbmNvZGluZ01lbWVudG8gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCXJldHVybiBjcmVhdGVFbmNvZGluZ01lbWVudG8oZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgcmVhc29uLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiBvbmNlIHRoaXMgaW5zdGFuY2UgaXMgY3JlYXRlZCwgdHJhY2UgaW5mbyBzdGlsbCBuZWVkcyB0byBiZQotCSAqIGFwcGVuZGVkIGJ5IGNhbGxlciwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0IGl0cyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgU3RyaW5nIHJlYXNvbiwgU3RyaW5nIHNwZWNEZWZhdWx0RW5jb2RpbmcpIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJcmVzdWx0ID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQlTdHJpbmcgamF2YUNoYXJzZXQgPSBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQlyZXN1bHQuc2V0SmF2YUNoYXJzZXROYW1lKGphdmFDaGFyc2V0KTsKLQkJcmVzdWx0LnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJaWYgKHNwZWNEZWZhdWx0RW5jb2RpbmcgPT0gbnVsbCkKLQkJCXJlc3VsdC5zZXRBcHByb3ByaWF0ZURlZmF1bHQoTk9fU1BFQ19ERUZBVUxUKTsKLQkJZWxzZQotCQkJcmVzdWx0LnNldEFwcHJvcHJpYXRlRGVmYXVsdChzcGVjRGVmYXVsdEVuY29kaW5nKTsKLQkJLy8gY2hlY2sgaWYgdmFsaWQKLQkJdHJ5IHsKLQkJCUNoYXJzZXQuaXNTdXBwb3J0ZWQoamF2YUNoYXJzZXQpOwotCQl9IGNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0LnNldEludmFsaWRFbmNvZGluZyhqYXZhQ2hhcnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiByZXR1cm4gbnVsbCwgaWYgaW52YWxpZCBjaGFyc2V0IG5hbWUgKGluIHdoaWNoIGNhc2UKLQkgKiAiYXBwcm9wcmlhdGVEZWZhdWx0IiBzaG91bGQgYmUgdXNlZCwgaWYgYSBuYW1lIGlzIHJlYWxseSBuZWVkIGZvciBzb21lCi0JICogInNhdmUgYW55d2F5IiBjYXNlcykuCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QXBwcm9wcmlhdGVKYXZhQ2hhcnNldChTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQkvLyB3ZSBkb24ndCBhbGxvdyBudWxsIGFyZ3VtZW50IChvciByaXNrIE5QRSBvcgotCQkvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbGF0ZXIgYXQgc2V2ZXJhbAotCQkvLyBwb2ludHMuCi0JCUFzc2VydC5pc05vdE51bGwoZGV0ZWN0ZWRDaGFyc2V0TmFtZSwgImlsbGVnYWwgY2hhcnNldCBhcmd1bWVudC4gaXQgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IGRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JCS8vIDEuIENoZWNrIGV4cGxpY2l0IG1hcHBpbmcgb3ZlcnJpZGVzIGZyb20KLQkJLy8gcHJvcGVydHkgZmlsZQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJLy8gMi4gVXNlIHRoZSAiY2Fub25pY2FsIiBuYW1lIGZyb20gSlJFIG1hcHBpbmdzCi0JCS8vIE5vdGU6IHNlZSBDaGFyc2V0IEphdmFEb2MsIHRoZSBuYW1lIHlvdSBnZXQgb25lCi0JCS8vIHdpdGggY2FuIGJlIGFsaWFzLAotCQkvLyB0aGUgbmFtZSB5b3UgZ2V0IGJhY2sgaXMgInN0YW5kYXJkIiBuYW1lLgotCQlDaGFyc2V0IGphdmFDaGFyc2V0ID0gbnVsbDsKLQkJLy8gTm90ZTogdGhpcyB3aWxsIGltbWVkaWF0bHkgdGhyb3cKLQkJLy8gIlVuc3VwcG90ZWRDaGFyc2V0RXhjZXB0aW9uIiBpZiBpdAotCQkvLyBpbnZhbGlkLiBJc3N1ZTogSXMgaXQgbW9yZSBjbGllbnQgZnJpZW5kbHkgdG8KLQkJLy8gZWF0IHRoYXQgZXhjZXB0aW9uIGFuZCByZXR1cm4gbnVsbD8KLQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUocmVzdWx0KTsKLQkJaWYgKGphdmFDaGFyc2V0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGphdmFDaGFyc2V0Lm5hbWUoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgb3ZlcnJpZGVuQ2hhcnNldHMuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBnZXRPdmVycmlkZW5DaGFyc2V0cygpIHsKLQkJaWYgKG92ZXJyaWRlbkNoYXJzZXRzID09IG51bGwpIHsKLQkJCW92ZXJyaWRlbkNoYXJzZXRzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCUJ1bmRsZSBrZXlCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQpOwotCQkJSVBhdGgga2V5UGF0aCA9IG5ldyBQYXRoKCJjb25maWcvb3ZlcnJpZGUucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgbG9jYXRpb24gPSBQbGF0Zm9ybS5maW5kKGtleUJ1bmRsZSwga2V5UGF0aCk7Ci0JCQlJbnB1dFN0cmVhbSBwcm9wZXJ0aWVzSW5wdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlwcm9wZXJ0aWVzSW5wdXRTdHJlYW0gPSBsb2NhdGlvbi5vcGVuU3RyZWFtKCk7Ci0JCQkJb3ZlcnJpZGVuQ2hhcnNldHMubG9hZChwcm9wZXJ0aWVzSW5wdXRTdHJlYW0pOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIGNhbid0IHJlYWQsIGp1c3QgYXNzdW1lIHRoZXJlJ3Mgbm8KLQkJCQkvLyBvdmVycmlkZXMKLQkJCQkvLyBhbmQgcmVwZWF0ZWQgYXR0ZW1wdHMgd2lsbCBub3Qgb2NjdXIsCi0JCQkJLy8gc2luY2UgdGhleQotCQkJCS8vIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkKLQkJCQkvLyBQcm9wZXJ0aWVzIG9iamVjdAotCQkJfQotCQl9Ci0JCXJldHVybiBvdmVycmlkZW5DaGFyc2V0czsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNsYXNzIG5lZWQgbm90IGJlIGluc3RhbnRpYXRlZCAodGhvdWdoIGl0cyBzdWJjbGFzc2VzIGNhbiBiZSkuCi0JICovCi0JcHJvdGVjdGVkIENvZGVkSU8oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBjcmVhdGVNZW1lbnRvKElDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQ7Ci0JCVN0cmluZyBhcHByb3ByaWF0ZURlZmF1bHQgPSBjb250ZW50RGVzY3JpcHRpb24uZ2V0Q29udGVudFR5cGUoKS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQlTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0ID0gKFN0cmluZykgY29udGVudERlc2NyaXB0aW9uLmdldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5ERVRFQ1RFRF9DSEFSU0VUKTsKLQkJU3RyaW5nIHVuU3VwcG9ydGVkQ2hhcnNldCA9IChTdHJpbmcpIGNvbnRlbnREZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuVU5TVVBQT1JURURfQ0hBUlNFVCk7Ci0JCVN0cmluZyBqYXZhQ2hhcnNldCA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDaGFyc2V0KCk7Ci0JCS8vIGludGVncml0eSBjaGVja3MgZm9yIGRlYnVnZ2luZwotCQlpZiAoamF2YUNoYXJzZXQgPT0gbnVsbCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgImNoYXJzZXQgZXF1YWxlZCBudWxsISIpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAoamF2YUNoYXJzZXQubGVuZ3RoKCkgPT0gMCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgImNoYXJzZXQgZXF1YWxlZCBlbXB0eVN0cmluZyEiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJ5dGVbXSBCT00gPSAoYnl0ZVtdKSBjb250ZW50RGVzY3JpcHRpb24uZ2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5CWVRFX09SREVSX01BUkspOwotCQkvL3Jlc3VsdCA9IChFbmNvZGluZ01lbWVudG8pCi0JCS8vIGNvbnRlbnREZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuRU5DT0RJTkdfTUVNRU5UTyk7Ci0JCXJlc3VsdCA9IGNyZWF0ZUVuY29kaW5nTWVtZW50byhCT00sIGphdmFDaGFyc2V0LCBkZXRlY3RlZENoYXJzZXQsIHVuU3VwcG9ydGVkQ2hhcnNldCwgYXBwcm9wcmlhdGVEZWZhdWx0LCBudWxsKTsKLQkJaWYgKCFyZXN1bHQuaXNWYWxpZCgpKSB7Ci0JCQlyZXN1bHQuc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGFwcHJvcHJpYXRlRGVmYXVsdCk7Ci0JCQkvLyBpbnRlZ3JpdHkgY2hlY2sgZm9yIGRlYnVnZ2luZyAiaW52YWxpZCIgY2FzZXMuCi0JCQkvLyB0aGUgYXBwcnJpYXRlIGRlZmF1bHQgd2UgaGF2ZSwgc2hvdWxkIGVxdWFsIHdoYXQncyBpbiB0aGUKLQkJCS8vIGRldGVjdGVkIGZpZWxkLiAobm90IHN1cmUgdGhpcyBpcyBhbHdheXMgcmVxdWlyZWQpCi0JCQlpZiAoREVCVUcgJiYgYXBwcm9wcmlhdGVEZWZhdWx0ICE9IG51bGwgJiYgIWFwcHJvcHJpYXRlRGVmYXVsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0KSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJhcHByb3ByaWF0ZSBkaWQgbm90IGVxdWFsIGRldGVjdGVkLCBhcyBleHBlY3RlZCBmb3IgaW52YWxpZCBjaGFyc2V0IGNhc2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZFJlYWRlckNyZWF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRSZWFkZXJDcmVhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYjIxNmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db2RlZFJlYWRlckNyZWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXREZWNvZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kaW5nRXJyb3JBY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkJ1ZmZlcmVkTGltaXRlZFN0cmVhbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuTnVsbElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLlVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci0KLQotLyoqCi0gKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIGNlbnRyYWxpemUgYW5hbHlzaXMgb2YgYSBmaWxlIHRvIGRldGVybWluZQotICogdGhlIG1vc3QgYXBwcm9wcmlhdGUgcnVsZXMgb2YgZGVjb2RpbmcgaXQuIFRoZSBpbnRlbmRlZCB1c2UgaXMgdG8gc2V0IHRoZQotICogaW5wdXQsIHRoZW4gZ2V0IHRoZSByZWFkZXIgZm9yIHRoYXQgaW5wdXQgd2hpY2ggd2lsbCBoYXZlIGl0cyBlbmNvZGluZyBzZXQKLSAqIGFwcHJvcHJpYXRlbHkuIEFkZGl0aW9uYWxseSwgdGhlcmUgaXMgYW4gRW5jb2RpbmdNZW1lbnRvIHByb3ZpZGVkLCB3aGljaAotICogd2lsbCBiZSByZXF1aXJlZCwgaW4gc29tZSBjYXNlcywgdG8gbGF0ZXIgZGV0ZXJtaW5lIHRoZSBtb3N0IGFwcHJvcHJpYXRlCi0gKiBmb3JtIG9mIGVuY29kZWQgb3V0cHV0LgotICovCi1wdWJsaWMgY2xhc3MgQ29kZWRSZWFkZXJDcmVhdG9yIGV4dGVuZHMgQ29kZWRJTyB7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBmQ2xpZW50U3VwcGxpZWRTdHJlYW07Ci0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIEVuY29kaW5nUnVsZSBmRW5jb2RpbmdSdWxlOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkZpbGVuYW1lOwotCi0JcHJpdmF0ZSBJRmlsZSBmSUZpbGU7Ci0KLQotCXByaXZhdGUgSW5wdXRTdHJlYW0gZklucHV0U3RyZWFtOwotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcigpIHsKLQotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQl0aGlzKCk7Ci0JCXNldChmaWxlKTsKLQkJc2V0RW5jb2RpbmdSdWxlKEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgQ29kZWRSZWFkZXJDcmVhdG9yKElGaWxlIGZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJdGhpcygpOwotCQlzZXQoZmlsZSk7Ci0JCXNldEVuY29kaW5nUnVsZShlbmNvZGluZ1J1bGUpOwotCX0KLQotCXB1YmxpYyBDb2RlZFJlYWRlckNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCi0JCXRoaXMoKTsKLQkJc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCXNldEVuY29kaW5nUnVsZShFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIENvZGVkUmVhZGVyQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB7Ci0KLQkJdGhpcygpOwotCQlzZXQoZmlsZW5hbWUsIGlucHV0U3RyZWFtKTsKLQkJc2V0RW5jb2RpbmdSdWxlKGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMoSW5wdXRTdHJlYW0gbGltaXRlZFN0cmVhbSkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0KLQkJLy8gaWYgZW5jb2RpbmcgbWVtZW50byBhbHJlYWR5IHNldCwgdGhlbiBpRmlsZSBtdXN0Ci0JCS8vIGhhdmUgYmVlbiBzZXQsIGFuZCBubyBuZWVkIHRvIGdldCBhZ2Fpbi4KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChmQ2xpZW50U3VwcGxpZWRTdHJlYW0pIHsKLQkJCQl0cnkgewotCQkJCQlsaW1pdGVkU3RyZWFtLnJlc2V0KCk7Ci0JCQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gY29udGVudFR5cGVNYW5hZ2VyLmdldERlc2NyaXB0aW9uRm9yKGxpbWl0ZWRTdHJlYW0sIGZGaWxlbmFtZSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCWZFbmNvZGluZ01lbWVudG8gPSBjcmVhdGVNZW1lbnRvKGNvbnRlbnREZXNjcmlwdGlvbik7Ci0JCQkJCX0KLQkJCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWxpbWl0ZWRTdHJlYW0ucmVzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJ1bmV4cGVjdGVkIHN0YXRlOgotCQkJCS8vIGVuY29kaW5nTWVtZW50byB3YXMgbnVsbCBidXQgbm8gaW5wdXQgc3RyZWFtIHN1cHBsaWVkIGJ5Ci0JCQkJLy8gY2xpZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXN1bHQgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNWYWxpZCgpICYmICFmb3JjZURlZmF1bHQoKSkgewotCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWwocmVzdWx0KTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gY2hlY2tTdHJlYW1Gb3JCT00oSW5wdXRTdHJlYW0gcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pIHsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yIHVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yID0gbmV3IFVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yKCk7Ci0JCXVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLnNldChyZXNldHRhYmxlTGltaXRlZFN0cmVhbSk7Ci0JCXJlc3VsdCA9IHVuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmaW5kTWVtZW50b0Zyb21GaWxlQ2FzZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBUaGlzIG1ldGhvZCBwcm92aWRlcyBwb3NzaWJsZSBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhdCB0aGUKLQkJCS8vIGNvc3Qgb2Ygc29tZXRpbWVzIHJldHVybmluZyBudWxsCi0JCQlpZiAoZklGaWxlLmV4aXN0cygpKQotCQkJCWNvbnRlbnREZXNjcmlwdGlvbiA9IGZJRmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBBc3N1bWUgaWYgY29yZSBleGNlcHRpb24gb2NjdXJzLCB3ZSBjYW4gc3RpbGwgdHJ5IG1vcmUKLQkJCS8vIGV4cGVuc2l2ZQotCQkJLy8gZGlzY292ZXJ5IG9wdGlvbnMuCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCAmJiBmSUZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCUlucHV0U3RyZWFtIGNvbnRlbnRzID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJY29udGVudHMgPSBmSUZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihjb250ZW50cywgZklGaWxlLmdldE5hbWUoKSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZTEpIHsKLQkJCQkvLyBBc3N1bWUgaWYgY29yZSBleGNlcHRpb24gb2NjdXJzLCB3ZSBjYW4ndCByZWFsbHkgZG8gbXVjaAotCQkJCS8vIHdpdGgKLQkJCQkvLyBkZXRlcm1pbmluZyBlbmNvZGluZywgZXRjLgotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJCXRocm93IGUxOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUyKSB7Ci0JCQkJLy8gV2UgbGlrZWx5IGNvdWxkbid0IGdldCB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUsIHNvbWV0aGluZwotCQkJCS8vIGlzIHJlYWxseSB3cm9uZwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTIpOwotCQkJCXRocm93IGUyOwotCQkJfQotCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQljb250ZW50cy5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTIpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlTWVtZW50byhjb250ZW50RGVzY3JpcHRpb24pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcHJpbWFyeSBtZXRob2Qgd2hpY2ggY29udGFpbnMgdGhlIGhpZ2hlc3QgbGV2ZWwgcnVsZXMgZm9yIGhvdyB0bwotCSAqIGRlY2lkZSBhcHByb3ByaWF0ZSBkZWNvZGluZyBydWxlczogMS4gZmlyc3QgY2hlY2sgZm9yIHVuaWNvZGUgc3RyZWFtIDIuCi0JICogdGhlbiBsb29rZWQgZm9yIGVuY29kaW5nIHNwZWNpZmllZCBpbiBjb250ZW50IChhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YKLQkgKiBjb250ZW50IHRoYXQgaXMgaXQgLi4uIHhtbCwgaHRtbCwganNwLCBldGMuIDMuIHRoZW4gY2hlY2sgZm9yIHZhcmlvdXMKLQkgKiBzZXR0aW5nczogZmlsZSBzZXR0aW5ncyBmaXJzdCwgaWYgbnVsbCBjaGVjayBwcm9qZWN0IHNldHRpbmdzLCBpZiBudWxsLAotCSAqIGNoZWNrIHVzZXIgcHJlZmVyZW5jZXMuIDQuIGxhc3RseSAob3IsIHdoYXQgaXMgdGhlIGxhc3QgdXNlcgotCSAqIHByZWZlcmVuY2UpIGlzIHRvIHVzZSAid29ya2JlbmNoIGRlZmF1bHRzIi4KLQkgKiAKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZmluZE1lbWVudG9Gcm9tU3RyZWFtQ2FzZSgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlc2V0dGFibGVMaW1pdGVkU3RyZWFtID0gZ2V0TGltaXRlZFN0cmVhbShnZXRSZXNldHRhYmxlU3RyZWFtKCkpOwotCQkJaWYgKHJlc2V0dGFibGVMaW1pdGVkU3RyZWFtICE9IG51bGwpIHsKLQkJCQkvLyBmaXJzdCBjaGVjayBmb3IgdW5pY29kZSBzdHJlYW0KLQkJCQlyZXN1bHQgPSBjaGVja1N0cmVhbUZvckJPTShyZXNldHRhYmxlTGltaXRlZFN0cmVhbSk7Ci0JCQkJLy8gaWYgbm90IHRoYXQsIHRoZW4gY2hlY2sgY29udGVudHMKLQkJCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQkJcmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0ucmVzZXQoKTsKLQkJCQkJcmVzdWx0ID0gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gc3RyZWFtIG51bGwsIG1heSBuYW1lJ3Mgbm90LgotCQkJCWlmIChmRmlsZW5hbWUgIT0gbnVsbCkgewotCQkJCQkvLyBmaWxlbmFtZSBub3QgbnVsbAotCQkJCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXREZXNjcmlwdGlvbkZvcihuZXcgTnVsbElucHV0U3RyZWFtKCksIGZGaWxlbmFtZSwgSUNvbnRlbnREZXNjcmlwdGlvbi5BTEwpOwotCQkJCQlpZiAoY29udGVudERlc2NyaXB0aW9uICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGNyZWF0ZU1lbWVudG8oY29udGVudERlc2NyaXB0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChyZXNldHRhYmxlTGltaXRlZFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaGFuZGxlU3RyZWFtQ2xvc2UocmVzZXR0YWJsZUxpbWl0ZWRTdHJlYW0pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGZvcmNlRGVmYXVsdCgpIHsKLQotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZkVuY29kaW5nUnVsZSAhPSBudWxsICYmIGZFbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBSZWFkZXIgZ2V0Q29kZWRSZWFkZXIoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCVJlYWRlciByZXN1bHQgPSBudWxsOwotCQkvLyB3ZSBtYWtlIGEgbG9jYWwgY29weSBvZiBlbmNvZGluZyBtZW1lbnRvIHNvCi0JCS8vIHN0cmVhbSB3b24ndAotCQkvLyBiZSBhY2Nlc3NlZCBzaW11bHRhbmVvdXNseS4KLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9IGdldEVuY29kaW5nTWVtZW50bygpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGVuY29kaW5nTWVtZW50bywgIkFwcGVhcnMgcmVhZGVyIHJlcXVlc3RlZCBiZWZvcmUgZmlsZSBvciBzdHJlYW0gc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJSW5wdXRTdHJlYW0gc3RyZWFtVG9SZXR1cm4gPSBnZXRSZXNldHRhYmxlU3RyZWFtKCk7Ci0JCXN0cmVhbVRvUmV0dXJuLnJlc2V0KCk7Ci0JCS8vIGlmIFVURiAzIGJ5dGUgQk9NIGlzIHVzZWQgKG9yIFVURi0xNkxFKSwgdGhlCi0JCS8vIGJ1aWx0IGluIGNvbnZlcnRlcnMKLQkJLy8gZG9uJ3QKLQkJLy8gY29ycmVjdCBza2lwIGFsbCB0aHJlZSBieXRlcyAuLi4gc28gc2tpcAotCQkvLyByZW1haW5pbmcgb25lIHRvIGxlYXZlCi0JCS8vIHN0cmVhbSB0cmFuc3BhcmVudGx5IHJlYWR5IGZvciBjbGllbnQuCi0JCS8vIHNlZSAuLi4gVE9ETyBsb29rIHVwIGJ1ZyBudW1iZXIKLQkJaWYgKGVuY29kaW5nTWVtZW50by5pc1VuaWNvZGVTdHJlYW0oKSkgewotCQkJc3RyZWFtVG9SZXR1cm4uc2tpcCgyKTsKLQkJfQotCQllbHNlIGlmIChlbmNvZGluZ01lbWVudG8uaXNVVEY4M0J5dGVCT01Vc2VkKCkpIHsKLQkJCXN0cmVhbVRvUmV0dXJuLnNraXAoMyk7Ci0JCX0KLQkJU3RyaW5nIGNoYXJzZXROYW1lID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQlpZiAoY2hhcnNldE5hbWUgPT0gbnVsbCkgewotCQkJY2hhcnNldE5hbWUgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQl9Ci0JCWlmICghZW5jb2RpbmdNZW1lbnRvLmlzVmFsaWQoKSAmJiAhZm9yY2VEZWZhdWx0KCkpIHsKLQkJCXRocm93IG5ldyBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKGVuY29kaW5nTWVtZW50byk7Ci0JCX0KLQotCQlpZiAoZkVuY29kaW5nUnVsZSA9PSBFbmNvZGluZ1J1bGUuRk9SQ0VfREVGQVVMVCkgewotCQkJY2hhcnNldE5hbWUgPSBlbmNvZGluZ01lbWVudG8uZ2V0QXBwcm9wcmlhdGVEZWZhdWx0KCk7Ci0JCX0KLQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGNoYXJzZXROYW1lKTsKLQkJQ2hhcnNldERlY29kZXIgY2hhcnNldERlY29kZXIgPSBjaGFyc2V0Lm5ld0RlY29kZXIoKTsKLQkJaWYgKGZFbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSB7Ci0JCQljaGFyc2V0RGVjb2Rlci5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCQkJY2hhcnNldERlY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhcnNldERlY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQkJY2hhcnNldERlY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7Ci0JCX0KLQkJLy8gbW9yZSBlZmZpY2llbnQgdG8gYmUgYnVmZmVyZWQsIGFuZCBJIGtub3cgb2Ygbm8KLQkJLy8gcmVhc29uIG5vdCB0byByZXR1cm4KLQkJLy8gdGhhdCBkaXJlY3RseS4KLQkJcmVzdWx0ID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW1Ub1JldHVybiwgY2hhcnNldERlY29kZXIpLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc3VsdC5tYXJrKENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vIGZpZ3VyZSBvdXQgZW5jb2RpbmcgbWVtZW50byBmcm9tIGVuY29kaW5nIHN0cmF0ZWd5Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWlmIChmQ2xpZW50U3VwcGxpZWRTdHJlYW0pIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gZmluZE1lbWVudG9Gcm9tU3RyZWFtQ2FzZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoZklGaWxlICE9IG51bGwpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gZmluZE1lbWVudG9Gcm9tRmlsZUNhc2UoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGlmIGVuY29kaW5nIHN0cmF0YWd5IGRvZXNuJ3QgcHJvdmlkZSBhbnN3ZXIsCi0JCS8vIHRoZW4gdHJ5IGZpbGUgc2V0dGluZ3MsIHByb2plY3Qgc2V0dGluZ3MsCi0JCS8vIHVzZXIgcHJlZmVyZW5jZXMsIGFuZAotCQkvLyBmaW5hbGx5IHdvcmtiZW5jaCBkZWZhdWx0LgotCQkvLwotCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsIHx8IGZFbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpID09IG51bGwpIHsKLQkJCWZFbmNvZGluZ01lbWVudG8gPSBnZXRFbmNvZGluZ01lbWVudG9Gcm9tUmVzb3VyY2VBbmRQcmVmZXJlbmNlKCk7Ci0JCX0KLQotCQkvLyB1c2UgRGVmYXVsdE5hbWVSdWxlcyBmcm9tIE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMgYXMgdGhlIGZpbmFsCi0JCS8vIGRlZmF1bHQKLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJZkVuY29kaW5nTWVtZW50byA9IGhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gZkVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IHdoZW4gZW5jb2RpbmcgaXMgbm90IGRldGVjdGVkIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIEhlcmUgaXMgZW5jb2RpbmcgbG9va3VwIG9yZGVyIHdlIHdpbGwgdHJ5OiAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlIGVuY29kaW5nKSAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogcHJvcGVydGllcyAoZm9yIEpTUCBvbmx5KSAtIHRyeSBjb250ZW50IHR5cGUgZW5jb2RpbmcgcHJlZmVyZW5jZXMgKGZvcgotCSAqIEhUTUwgb25seSkgLSB0cnkgcmVzb3VyY2UgY29udGVudCBkZXNjcmlwdGlvbiAoRWNsaXBzZSBUZXh0IGZpbGUKLQkgKiBlbmNvZGluZywgaW1wbGljaXQgY2hlY2spCi0JICogCi0JICogTm90ZTogVGhpcyBtZXRob2QgYXBwZWFycyBpbiBib3RoIENvZGVkUmVhZGVyQ3JlYXRvciBhbmQKLQkgKiBDb2RlZFN0cmVhbUNyZWF0b3IgKHdpdGgganVzdCBhIG1pbm9yIGRpZmZlcmVuY2UpLiBUaGV5IHNob3VsZCBiZSBrZXB0Ci0JICogdGhlIHNhbWUuCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBmRW5jb2RpbmdNZW1lbnRvOwotCi0JCS8vIEZvbGxvdyBFY2xpcHNlIFBsYXRmb3JtJ3MgZGlyZWN0aW9uLiBHZXQgdGhlIGNoYXJzZXQgZnJvbSBJRmlsZS4KLQkJaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2hhcnNldCA9IGZJRmlsZS5nZXRDaGFyc2V0KCk7Ci0JCQllbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQsIGlzIHJlYWRsaW1pdCBpcwotCSAqIHNldCwgYW5kIHRoYXQgdGhlIHN0cmVhbSBpcyAibGltaXRhYmxlIiAodGhhdCBpcywgcmVwb3J0cyAiZW5kIG9mCi0JICogaW5wdXQiIHJhdGhlciB0aGFuIGFsbG93IGdvaW5nIHBhc3QgbWFyaykuIFRoaXMgaXMgdmVyeSBzcGVjaWFsaXplZAotCSAqIHN0cmVhbSBpbnRyb2R1Y2VkIHRvIG92ZXJjb21lCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3MjExLiBTZWUgYWxzbwotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODU2NQotCSAqLwotCXByaXZhdGUgSW5wdXRTdHJlYW0gZ2V0TGltaXRlZFN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob3JpZ2luYWwgaW5zdGFuY2VvZiBCdWZmZXJlZExpbWl0ZWRTdHJlYW0pCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCUlucHV0U3RyZWFtIHMgPSBuZXcgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKG9yaWdpbmFsLCBDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJcmV0dXJuIHM7Ci0JfQotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRSZXNldHRhYmxlU3RyZWFtKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlJbnB1dFN0cmVhbSByZXNldHRhYmxlU3RyZWFtID0gbnVsbDsKLQotCQlpZiAoZklGaWxlICE9IG51bGwpIHsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gbm90ZSB3ZSBhbHdheXMgZ2V0IGNvbnRlbnRzLCBldmVuIGlmIG91dCBvZiBzeW5jaAotCQkJCWlucHV0U3RyZWFtID0gZklGaWxlLmdldENvbnRlbnRzKHRydWUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8vIFNIT1VMRCBhY3R1YWxseSBjaGVjayBmb3IgZXhpc3RlbmNlIG9mCi0JCQkJLy8gZklTdG9yYWdlLCBidXQKLQkJCQkvLyBmb3Igbm93IHdpbGwganVzdCBhc3N1bWUgY29yZSBleGNlcHRpb24KLQkJCQkvLyBtZWFucyBpdAotCQkJCS8vIGRvZXNuJ3QgZXhpc3Qgb24gZmlsZSBzeXN0ZW0sIHlldC4KLQkJCQkvLyBhbmQgd2UnbGwgbG9nLCBqdXN0IGluIGNhc2UgaXRzIGEgbm90ZWFibGUgZXJyb3IKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCWlucHV0U3RyZWFtID0gbmV3IE51bGxJbnB1dFN0cmVhbSgpOwotCQkJfQotCQkJcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZklucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQlpZiAoZklucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCQlyZXNldHRhYmxlU3RyZWFtID0gZklucHV0U3RyZWFtOwotCQkJCQkvLyB0cnkgewotCQkJCQlyZXNldHRhYmxlU3RyZWFtLnJlc2V0KCk7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gLy8gYXNzdW1lZCBqdXN0IGhhc24ndCBiZWVuIG1hcmtlZCB5ZXQsIHNvIGlnbm9yZQotCQkJCQkvLyB9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXNldHRhYmxlU3RyZWFtID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZklucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc2V0dGFibGVTdHJlYW0gPT0gbnVsbCkgewotCQkJcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBOdWxsSW5wdXRTdHJlYW0oKTsKLQkJfQotCi0JCS8vIG1hcmsgdGhpcyBvbmNlLCBzdHJlYW0gYXQgInplcm8iIHBvc2l0aW9uCi0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJcmV0dXJuIHJlc2V0dGFibGVTdHJlYW07Ci0JfQotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gaGFuZGxlTm90UHJvdmlkZWRGcm9tQ29udGVudENhc2UoKSB7Ci0KLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBzcGVjRGVmYXVsdCA9IG51bGw7Ci0JCS8vIHRyeSB7Ci0JCS8vIHNwZWNEZWZhdWx0ID0gZ2V0RW5jb2RpbmdEZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJLy8gfQotCQkvLyBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCS8vIC8vIElmIHRoaXMgZXhjZXB0aW9uIG9jY3VycywgYXNzdW1lcyB0aGVyZSBpcwotCQkvLyAvLyBubyBzcGVjRGVmYXVsdAotCQkvLyB9Ci0JCS8vIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIC8vIElmIHRoaXMgZXhjZXB0aW9uIG9jY3VycywgYXNzdW1lcyB0aGVyZSBpcwotCQkvLyAvLyBubyBzcGVjRGVmYXVsdAotCQkvLyB9Ci0JCS8vIGZpbmFsbHkgewotCQkvLyB0cnkgewotCQkvLyBoYW5kbGVTdHJlYW1DbG9zZShmRW5jb2RpbmdEZXRlY3RvclN0cmVhbSk7Ci0JCS8vIH0KLQkJLy8gY2F0Y2ggKElPRXhjZXB0aW9uIGUxKSB7Ci0JCS8vIC8vIHNldmVyZSBlcnJvciwgbm90IG11Y2ggdG8gZG8gaGVyZQotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gdGhpcyBsb2dpYyBzaG91bGQgYmUgbW92ZWQgdG8gJ2RldGVjdGlvbicgaWYgbm90IGFscmVhZHkKLQkJU3RyaW5nIGNoYXJzZXQgPSBOb25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLnVzZURlZmF1bHROYW1lUnVsZXMoc3BlY0RlZmF1bHQpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGNoYXJzZXQsICJwb3N0IGNvbmRpdGlvbiBmYWlsZWQiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXN1bHQgPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzZXR0YWJsZUlucHV0U3RyZWFtCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXByaXZhdGUgdm9pZCBoYW5kbGVTdHJlYW1DbG9zZShJbnB1dFN0cmVhbSByZXNldHRhYmxlSW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0KLQkJaWYgKHJlc2V0dGFibGVJbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQlpZiAoZkNsaWVudFN1cHBsaWVkU3RyZWFtKSB7Ci0JCQkJcmVzZXR0YWJsZUlucHV0U3RyZWFtLnJlc2V0KCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQotCQkJCXJlc2V0dGFibGVJbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gVE9ETyBXZSBqdXN0IGNvcHkgdGhlIGNvbnRlbnQgcHJvcGVydGllcyBlbmNvZGluZyB0byBjdXJyZW50IHJlc291cmNlJ3MKLQkvLyBlbmNvZGluZyBmb3Igbm93LiBNYXkgaW1wcm92ZSB0aGUgVUkgbGF0ZXIgYnkgc2V0dGluZyBhbiBpbmZvcm1hdGlvbmFsCi0JLy8gbWVzc2FnZSBhbmQvb3IgZGlzYWJsZSB0aGUgY29udGVudCBwcm9wZXJ0aWVzIGVuY29kaW5nIGZpZWxkLgotCS8vIFRPRE86IHJlbWFrZSBwcml2YXRlIGVsc2UgcmVtb3ZlCi0Jdm9pZCBtaWdyYXRlQ29udGVudFByb3BlcnRpZXNFbmNvZGluZyhTdHJpbmcgZW5jb2RpbmcpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZmluYWwgSUZpbGUgZmlsZSA9IGZJRmlsZTsKLQkJZmluYWwgU3RyaW5nIGNoYXJzZXQgPSBlbmNvZGluZzsKLQkJLy8gVE9ETzogZXh0ZXJuYWxpemUgc3RyaW5nIGxhdGVyCi0JCUpvYiBtaWdyYXRlciA9IG5ldyBKb2IoU1NFQ29yZU1lc3NhZ2VzLk1pZ3JhdGVfQ2hhcnNldCkgeyAvLyROT04tTkxTLTEkCi0JCQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZmlsZS5zZXRDaGFyc2V0KGNoYXJzZXQsIG51bGwpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQl9Ci0JCX07Ci0JCW1pZ3JhdGVyLnNldFN5c3RlbSh0cnVlKTsKLQkJbWlncmF0ZXIuc2NoZWR1bGUoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVzZXRBbGwoKSB7Ci0KLQkJZkVuY29kaW5nUnVsZSA9IG51bGw7Ci0JCWZJRmlsZSA9IG51bGw7Ci0JCWZGaWxlbmFtZSA9IG51bGw7Ci0JCWZJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCQlmQ2xpZW50U3VwcGxpZWRTdHJlYW0gPSBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJpbGxlZ2FsIGFyZ3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzZXRBbGwoKTsKLQkJZklGaWxlID0gaUZpbGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQotCQlyZXNldEFsbCgpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZklucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07Ci0JCWZDbGllbnRTdXBwbGllZFN0cmVhbSA9IHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdSdWxlKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHsKLQotCQlmRW5jb2RpbmdSdWxlID0gZW5jb2RpbmdSdWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRTdHJlYW1DcmVhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvZGVkU3RyZWFtQ3JlYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2QzMTlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29kZWRTdHJlYW1DcmVhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQ2hhckFycmF5UmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5DaGFyQ29udmVyc2lvbkVycm9yV2l0aERldGFpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zLlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci0KLQotcHVibGljIGNsYXNzIENvZGVkU3RyZWFtQ3JlYXRvciBleHRlbmRzIENvZGVkSU8gewotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IElOSVRJQUxfQlVGRkVSX1NJWkUgPSAxMDI0ICogMTY7Ci0KLQkvLyB0aGUgMzIgYnl0ZXMgdXNlZCBieSBkZWZhdWx0IGJ5IEJ5dGVPdXRwdXRTdHJlYW0gaXMKLQkvLyBhIGxpdHRsZSBzbWFsbAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9HUkFNX0VSUk9SX19GQUlMRURfVE9fRklORF9BTllfQ0hBUlNFVF9BTllXSEVSRV8gPSAiUHJvZ3JhbSBlcnJvcjogZmFpbGVkIHRvIGZpbmQgYW55IGNoYXJzZXQgYW55d2hlcmUhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl8xNkJFX0NIQVJTRVRfTkFNRSA9ICJVVEYtMTZCRSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2TEVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkxFIjsgLy8kTk9OLU5MUy0xJAotCS8vCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTZfQ0hBUlNFVF9OQU1FID0gIlVURi0xNiI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84X0NIQVJTRVRfTkFNRSA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiBmQ2xpZW50U3VwcGxpZWRSZWFkZXI7Ci0KLQkvLyBmdXR1cmVfVE9ETzogdGhpcyAnY2hlY2tDb252ZXJzaW9uJyBjYW4gYmUgYSBsaXR0bGUKLQkvLyBwcmljZXkgZm9yIGxhcmdlCi0JLy8gZmlsZXMsIGNob3VsZCBiZSBhIHVzZXIgcHJlZmVyZW5jZSwgb3Igc29tZXRoaW5nLgotCS8vIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gY2hlY2tDb252ZXJzaW9uID0gdHJ1ZTsKLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBmQ3VycmVudEVuY29kaW5nTWVtZW50bzsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGZFbmNvZGluZ01lbWVudG87Ci0KLQlwcml2YXRlIFN0cmluZyBmRmlsZW5hbWU7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkhhc0JlZW5BbmFseXplZDsKLQotCXByaXZhdGUgSUZpbGUgZklGaWxlOwotCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJpdmF0ZSBSZWFkZXIgZlJlYWRlcjsKLQotCXByaXZhdGUgUmVhZGVyIGZSZXNldHRhYmxlUmVhZGVyOwotCXByaXZhdGUgYnl0ZVtdIFVURjE2QkVCT00gPSBuZXcgYnl0ZVtdeyhieXRlKSAweEZFLCAoYnl0ZSkgMHhGRn07Ci0KLQlwcml2YXRlIGJ5dGVbXSBVVEYxNkxFQk9NID0gbmV3IGJ5dGVbXXsoYnl0ZSkgMHhGRiwgKGJ5dGUpIDB4RkV9OwotCXByaXZhdGUgYnl0ZVtdIFVURjNCWVRFQk9NID0gbmV3IGJ5dGVbXXsoYnl0ZSkgMHhFRiwgKGJ5dGUpIDB4QkIsIChieXRlKSAweEJGfTsKLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvZGVkU3RyZWFtQ3JlYXRvcihTdHJpbmcgZmlsZW5hbWUsIGNoYXJbXSBjaGFyYWN0ZXJBcnJheSkgewotCQlzdXBlcigpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IG5ldyBDaGFyQXJyYXlSZWFkZXIoY2hhcmFjdGVyQXJyYXkpOwotCX0KLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCX0KLQotCXB1YmxpYyBDb2RlZFN0cmVhbUNyZWF0b3IoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgdGV4dFN0cmluZykgewotCQlzdXBlcigpOwotCQlmRmlsZW5hbWUgPSBmaWxlbmFtZTsKLQkJZlJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIodGV4dFN0cmluZyk7Ci0JfQotCi0JLyoqCi0JICogVGhlIHByaW1hcnkgbWV0aG9kIHdoaWNoIGNvbnRhaW5zIHRoZSBoaWdoZXN0IGxldmVsIHJ1bGVzIGZvciBob3cgdG8KLQkgKiBkZWNpZGUgYXBwcm9wcmlhdGUgZGVjb2RpbmcgcnVsZXM6IDEuIGZpcnN0IGNoZWNrIGZvciB1bmljb2RlIHN0cmVhbSAyLgotCSAqIHRoZW4gbG9va2VkIGZvciBlbmNvZGluZyBzcGVjaWZpZWQgaW4gY29udGVudCAoYWNjb3JkaW5nIHRvIHRoZSB0eXBlIG9mCi0JICogY29udGVudCB0aGF0IGlzIGl0IC4uLiB4bWwsIGh0bWwsIGpzcCwgZXRjLiAzLiB0aGVuIGNoZWNrIGZvciB2YXJpb3VzCi0JICogc2V0dGluZ3M6IGZpbGUgc2V0dGluZ3MgZmlyc3QsIGlmIG51bGwgY2hlY2sgcHJvamVjdCBzZXR0aW5ncywgaWYgbnVsbCwKLQkgKiBjaGVjayB1c2VyIHByZWZlcmVuY2VzLiA0LiBsYXN0bHkgKG9yLCB3aGF0IGlzIHRoZSBsYXN0IHVzZXIKLQkgKiBwcmVmZXJlbmNlKSBpcyB0byB1c2UgIndvcmtiZW5jaCBkZWZhdWx0cyIuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFuYWx5emUoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlSZWFkZXIgcmVzZXR0YWJsZVJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJdHJ5IHsKLQkJCWlmIChmQ3VycmVudEVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID0gY2hlY2tGb3JFbmNvZGluZ0luQ29udGVudHMoKTsKLQkJCX0KLQkJCS8vIGlmIGVuY29kaW5nIHN0cmF0YWd5IGRvZXNuJ3QgcHJvdmlkZSBhbnN3ZXIsCi0JCQkvLyB0aGVuIHRyeSBmaWxlIHNldHRpbmdzLCBwcm9qZWN0IHNldHRpbmdzLAotCQkJLy8gdXNlciBwcmVmZXJlbmNlcywgYW5kCi0JCQkvLyBmaW5hbGx5IHdvcmtiZW5jaCBkZWZhdWx0LgotCQkJLy8KLQkJCWlmIChmQ3VycmVudEVuY29kaW5nTWVtZW50byA9PSBudWxsIHx8IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSA9PSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJCWZDdXJyZW50RW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpOwotCQkJfQotCi0JCQkvLyB1c2UgRGVmYXVsdE5hbWVSdWxlcyBmcm9tIE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMgYXMgdGhlCi0JCQkvLyBmaW5hbCBkZWZhdWx0Ci0JCQlpZiAoZkVuY29kaW5nTWVtZW50byA9PSBudWxsKSB7Ci0JCQkJaGFuZGxlTm90UHJvdmlkZWRGcm9tQ29udGVudENhc2UoKTsKLQkJCX0KLQotCQkJZkhhc0JlZW5BbmFseXplZCA9IHRydWU7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAocmVzZXR0YWJsZVJlYWRlciAhPSBudWxsKSB7Ci0JCQkJcmVzZXR0YWJsZVJlYWRlci5yZXNldCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTmVlZCB0byBjaGVjayBjb252ZXJzaW9uIGVhcmx5IG9uLiBUaGVyZSdzIHNvbWUgZGFuZ2VyIHRoYW4gb2xkCi0JICogY29udGVudHMgb2YgYSBmaWxlIGFyZSBzZXQgdG8gZW1wdHksIGlmIGFuIGV4Y2VwdGlvbiBvY2N1cnMuCi0JICogCi0JICogQHBhcmFtIGFsbFRleHQKLQkgKiBAcGFyYW0gZW5jb2RpbmcKLQkgKiBAcGFyYW0gZW5jb2RpbmdSdWxlCi0JICogQHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwKLQkgKiBAZGVwcmVjYXRlZCAtIHdlIG5lZWQgdG8gZmluZCAiY2hlYXBlciIgd2F5IHRvIHRvIHRoaXMgZnVuY3Rpb25hbGl0eSBzbwotCSAqICAgICAgICAgICAgIGxpa2VseSB0byBnbyBhd2F5IGluIGZ1dHVyZQotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0NvbnZlcnNpb24oRW5jb2RpbmdNZW1lbnRvIG1lbWVudG8sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBqYXZhRW5jb2RpbmcgPSBtZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQlTdHJpbmcgZGV0ZWN0ZWRFbmNvZGluZyA9IG1lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoamF2YUVuY29kaW5nKTsKLQkJQ2hhcnNldEVuY29kZXIgY2hhcnNldEVuY29kZXIgPSBjaGFyc2V0Lm5ld0VuY29kZXIoKTsKLQkJY2hhcnNldEVuY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQljaGFyc2V0RW5jb2Rlci5vblVubWFwcGFibGVDaGFyYWN0ZXIoQ29kaW5nRXJyb3JBY3Rpb24uUkVQT1JUKTsKLQkJUmVhZGVyIHJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJcmVhZGVyLnJlc2V0KCk7Ci0JCWludCBjdXJyZW50Q2hhciA9IHJlYWRlci5yZWFkKCk7Ci0JCWludCBjdXJyZW50UG9zID0gMTsKLQkJdHJ5IHsKLQkJCXdoaWxlIChjdXJyZW50Q2hhciAhPSAtMSkgewotCQkJCS8vIG5vdGU6IHRoaXMgY2FuIHByb2JhYmx5IGJlIG1hZGUgbW9yZQotCQkJCS8vIGVmZmljaWVudCBsYXRlciB0bwotCQkJCS8vIGNoZWNrIGJ1ZmZlciBieSBidWZmZXIsIGluc3RlYWQgb2YKLQkJCQkvLyBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLgotCQkJCXRyeSB7Ci0JCQkJCWJvb2xlYW4gY2FuQ29udmVydCA9IGNoYXJzZXRFbmNvZGVyLmNhbkVuY29kZSgoY2hhcikgY3VycmVudENoYXIpOwotCQkJCQlpZiAoIWNhbkNvbnZlcnQpIHsKLQkJCQkJCWlmIChlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSB7Ci0JCQkJCQkJLy8gaWYgd2UncmUgdG9sZCB0byBpZ25vcmUgdGhlCi0JCQkJCQkJLy8gZW5jb2RpbmcgY29udmVyc2lvbgotCQkJCQkJCS8vIGVycm9yLAotCQkJCQkJCS8vIG5vdGljZSB3ZSBzdGlsbCB3YW50IHRvIGRldGVjdAotCQkJCQkJCS8vIGFuZCBsb2cgaXQuIFdlIHNpbXBseQotCQkJCQkJCS8vIGRvbid0IHRocm93IHRoZSBleGNlcHRpb24sIGFuZAotCQkJCQkJCS8vIHdlIGRvIGNvbnRpbnVlIHdpdGgKLQkJCQkJCQkvLyB0aGUKLQkJCQkJCQkvLyBzYXZlLgotCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiRW5jb2RpbmcgQ29udmVyc2lvbiBFcnJvciBkdXJpbmcgc2F2ZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCXRocm93IG5ldyBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsKGphdmFFbmNvZGluZywgZGV0ZWN0ZWRFbmNvZGluZywgY3VycmVudFBvcyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudENoYXIgPSByZWFkZXIucmVhZCgpOwotCQkJCQljdXJyZW50UG9zKys7Ci0JCQkJfQotCQkJCS8vIElCTSdzIEpSRSBzZWVtcyB0byB0aHJvdyBOUEUgd2hlbiBEQkNTIGNoYXIgaXMgZ2l2ZW4gdG8KLQkJCQkvLyBTQkNTIGNoYXJzZXRFbmNvZGVyCi0JCQkJY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLQkJCQkJdGhyb3cgbmV3IENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKGphdmFFbmNvZGluZyk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiB3ZSBnZXQgYWxsIHRoZSB3YXkgdGhyb3VnaCBsb29wIHdpdGhvdXQgdGhyb3dpbmcgZXhjZXB0aW9uLAotCQkJLy8gdGhlbiB0aGVyZSBtdXN0Ci0JCQkvLyBiZSBhbiBlcnJvciBub3QgZGV0ZWN0YWJsZSB3aGVuIGdvaW5nIGNoYXJhY3RlciBieSBjaGFyYWN0ZXIuCi0JCQl0aHJvdyBuZXcgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwoamF2YUVuY29kaW5nKTsgLy8kTk9OLU5MUy0xJAotCQl9IGZpbmFsbHkgewotCQkJcmVhZGVyLnJlc2V0KCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEVuY29kaW5nTWVtZW50byBjaGVja0ZvckVuY29kaW5nSW5Db250ZW50cygpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCi0JCS8vIGlmIGVuY29kaW5nIG1lbWVudG8gYWxyZWFkeSBzZXQsIGFuZCBubyBuZWVkIHRvIGdldCBhZ2Fpbi4KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZkVuY29kaW5nTWVtZW50bzsKLQkJfSBlbHNlIHsKLQkJCWlmIChmQ2xpZW50U3VwcGxpZWRSZWFkZXIpIHsKLQkJCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjb250ZW50VHlwZU1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJCQl0cnkgewotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGNvbnRlbnRUeXBlTWFuYWdlci5nZXREZXNjcmlwdGlvbkZvcihmUmVhZGVyLCBmRmlsZW5hbWUsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQlmRW5jb2RpbmdNZW1lbnRvID0gY3JlYXRlTWVtZW50byhjb250ZW50RGVzY3JpcHRpb24pOwotCQkJCQl9IGVsc2UgewotCQkJCQkJZkVuY29kaW5nTWVtZW50byA9IENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIFRPRE86IHdvcmsgYXJvdW5kIGZvciA1LzE0IGJ1ZyBpbiBiYXNlLCBzaG91bGQgYmUKLQkJCQkJLy8gcmVtb3ZlZCB3aGVuIG1vdmUgdXAgdG8gNS8yMQotCQkJCQkvLyBqdXN0IGNyZWF0ZWQgYSBzaW1wbGUgZGVmYXVsdCBvbmUKLQkJCQkJZkVuY29kaW5nTWVtZW50byA9IENvZGVkSU8uY3JlYXRlRW5jb2RpbmdNZW1lbnRvKCJVVEYtOCIpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJlc3VsdCA9IGZFbmNvZGluZ01lbWVudG87Ci0JCQl9IGVsc2UgewotCQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInVuZXhwZWN0ZWQgc3RhdGU6IGVuY29kaW5nTWVtZW50byB3YXMgbnVsbCBidXQgbm8gaW5wdXQgc3RyZWFtIHN1cHBsaWVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQkvLwkJdHJ5IHsKLQkJLy8JCQlyZXN1bHQgPSBnZXRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCS8vCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICFyZXN1bHQuaXNWYWxpZCgpICYmICFmb3JjZURlZmF1bHQoKSkgewotCQkvLwkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChyZXN1bHQpOwotCQkvLwkJCX0KLQkJLy8JCX0KLQkJLy8JCWZpbmFsbHkgewotCQkvLwkJCWhhbmRsZVN0cmVhbUNsb3NlKGZFbmNvZGluZ0RldGVjdG9yU3RyZWFtKTsKLQkJLy8JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBkdW1wKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUsIGJvb2xlYW4gdXNlM0J5dGVCT01pZlVURjgpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKTsKLQkJU3RyaW5nIGphdmFFbmNvZGluZ05hbWUgPSBudWxsOwotCQlpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKSB7Ci0JCQlpZiAoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uaXNWYWxpZCgpKSB7Ci0JCQkJamF2YUVuY29kaW5nTmFtZSA9IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCQkJfSBlbHNlIHsKLQkJCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChmQ3VycmVudEVuY29kaW5nTWVtZW50byk7Ci0JCQl9Ci0JCX0gZWxzZSBpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikKLQkJCWphdmFFbmNvZGluZ05hbWUgPSBmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJZWxzZSBpZiAoZW5jb2RpbmdSdWxlID09IEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKQotCQkJamF2YUVuY29kaW5nTmFtZSA9IGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLmdldEFwcHJvcHJpYXRlRGVmYXVsdCgpOwotCQkvLyB3cml0ZSBhcHByb3ByaWF0ZSAiaGVhZGVyIiB1bmljb2RlIEJPTSBieXRlcwotCQkvLyBOb3RlOiBKYXZhIHNlZW1zIHRvIHdyaXRlIGFwcHJvcHJpYXRlIGhlYWRlciBmb3IKLQkJLy8gVVRGLTE2LCBidXQgbm90Ci0JCS8vIFVURi04IG5vciBVVEYtMTZCRS4gVGhpcwotCQkvLyBtYXkgdmFyeSBieSBKUkUgdmVyc2lvbiwgc28gbmVlZCB0byB0ZXN0IHdlbGwuCi0JCS8vIE5vdGU6IGphdmFFbmNvZGluZ05hbWUgY2FuIGJlIG51bGwgaW4gaW52YWxpZAotCQkvLyBjYXNlcywgc28gd2Ugbm8gaGFyZAotCQkvLyB0byBza2lwIHdob2xlIGNoZWNrIGlmIHRoYXQncyB0aGUgY2FzZS4KLQkJaWYgKGphdmFFbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJaWYgKChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfOF9DSEFSU0VUX05BTUUpICYmIHVzZTNCeXRlQk9NaWZVVEY4KSB8fCAoamF2YUVuY29kaW5nTmFtZS5lcXVhbHMoVVRGXzhfQ0hBUlNFVF9OQU1FKSAmJiBmQ3VycmVudEVuY29kaW5nTWVtZW50by5pc1VURjgzQnl0ZUJPTVVzZWQoKSkpIHsKLQkJCQlvdXRwdXRTdHJlYW0ud3JpdGUoVVRGM0JZVEVCT00pOwotCQkJfSBlbHNlIGlmIChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfMTZMRV9DSEFSU0VUX05BTUUpKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLndyaXRlKFVURjE2TEVCT00pOwotCQkJfSBlbHNlIGlmIChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfMTZCRV9DSEFSU0VUX05BTUUpKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLndyaXRlKFVURjE2QkVCT00pOwotCQkJfQotCQl9Ci0JCS8vIFRPRE8gYWRkIGJhY2sgaW4gbGluZSBkZWxpbWl0ZXIgaGFuZGxpbmcgdGhlCi0JCS8vICJyaWdodCIgd2F5ICh1cGRhdGluZwotCQkvLyBtYXJrZXJzLCBub3QgcmVxdWlyaW5nIHN0cmluZywgZXRjLiAuLiBtYXkgbmVlZAotCQkvLyB0byBtb3ZlIHRvIGRvY3VtZW50Ci0JCS8vIGxldmVsKQotCQkvL2FsbFRleHRCdWZmZXIgPQotCQkvLyBoYW5kbGVMaW5lRGVsaW1pdGVyKGFsbFRleHRCdWZmZXIsIGRvY3VtZW50KTsKLQkJUmVhZGVyIHJlYWRlciA9IGdldFJlc2V0dGFibGVSZWFkZXIoKTsKLQkJLy8gYmUgc3VyZSB0byB0ZXN0IGxhcmdlICJyZWFkZXJzIiAuLi4gd2UnbGwgbmVlZAotCQkvLyB0byBtYWtlIHN1cmUgdGhleSBhbGwKLQkJLy8gY2FuIHJlc2V0IHRvIGluaXRpYWwgcG9zaXRpb24gKFN0cmluZ1JlYWRlciwKLQkJLy8gQ2hhckFycmF5UmVhZGVyLCBhbmQKLQkJLy8gRG9jdW1lbnRSZWFkZXIgc2hvdWxkIGFsbCB3b3JrIG9rKS4KLQkJcmVhZGVyLnJlc2V0KCk7Ci0JCS8vIFRoZXJlIG11c3QgYmUgY2xlYW5lciBsb2dpYyBzb21laG93LCBidXQgdGhlCi0JCS8vIGlkZWEgaXMgdGhhdAotCQkvLyBqYXZhRW5jb2RpbmdOYW1lIGNhbiBiZSBudWxsCi0JCS8vIGlmIG9yaWdpbmFsIGRldGVjdGVkIGVuY29kaW5nIGlzIG5vdCB2YWxpZCAoYW5kCi0JCS8vIGlmIEZPUkNFX0RFRkFVTFQgd2FzCi0JCS8vIG5vdCBzcGVjaWZpZWQpLiBIZW5jZSwgd2UgV0FOVCB0aGUgZmlyc3QKLQkJLy8gQ2hhcnNldC5mb3JOYW1lIHRvCi0JCS8vIHRocm93IGFwcHJvcHJpYXRlIGV4Y2VwdGlvbi4KLQkJQ2hhcnNldCBjaGFyc2V0ID0gbnVsbDsKLQotCQkvLyB0aGlzIGNhbGwgY2hlY2tzICJvdmVycmlkZSIgcHJvcGVydGllcyBmaWxlCi0JCWphdmFFbmNvZGluZ05hbWUgPSBDb2RlZElPLmdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoamF2YUVuY29kaW5nTmFtZSk7Ci0KLQkJaWYgKGphdmFFbmNvZGluZ05hbWUgPT0gbnVsbCkgewotCQkJY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShmQ3VycmVudEVuY29kaW5nTWVtZW50by5nZXREZXRlY3RlZENoYXJzZXROYW1lKCkpOwotCQl9IGVsc2UgewotCQkJY2hhcnNldCA9IENoYXJzZXQuZm9yTmFtZShqYXZhRW5jb2RpbmdOYW1lKTsKLQkJfQotCQlDaGFyc2V0RW5jb2RlciBjaGFyc2V0RW5jb2RlciA9IGNoYXJzZXQubmV3RW5jb2RlcigpOwotCQlpZiAoIShlbmNvZGluZ1J1bGUgPT0gRW5jb2RpbmdSdWxlLklHTk9SRV9DT05WRVJTSU9OX0VSUk9SKSkgewotCQkJY2hhcnNldEVuY29kZXIub25NYWxmb3JtZWRJbnB1dChDb2RpbmdFcnJvckFjdGlvbi5SRVBPUlQpOwotCQkJY2hhcnNldEVuY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUE9SVCk7Ci0JCX0gZWxzZSB7Ci0JCQljaGFyc2V0RW5jb2Rlci5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCQkJY2hhcnNldEVuY29kZXIub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotCi0JCX0KLQkJT3V0cHV0U3RyZWFtV3JpdGVyIG91dHB1dFN0cmVhbVdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0cHV0U3RyZWFtLCBjaGFyc2V0RW5jb2Rlcik7Ci0JCS8vVE9ETzogdGhpcyBtYXkgbm8gbG9uZ2VyIGJlIG5lZWRlZCAoYW5kIGlzIGF0Ci0JCS8vIGxlYXN0IHdyb25nIHNwb3QgZm9yCi0JCS8vIGl0KS4KLQkJLy8JCWlmIChjaGVja0NvbnZlcnNpb24gJiYgKCEoZW5jb2RpbmdSdWxlID09Ci0JCS8vIEVuY29kaW5nUnVsZS5JR05PUkVfQ09OVkVSU0lPTl9FUlJPUikpKSB7Ci0JCS8vCQkJY2hlY2tDb252ZXJzaW9uKGZDdXJyZW50RW5jb2RpbmdNZW1lbnRvLAotCQkvLyBlbmNvZGluZ1J1bGUpOwotCQkvLwkJfQotCQljaGFyW10gY2hhcmJ1ZiA9IG5ldyBjaGFyW0NvZGVkSU8uTUFYX0JVRl9TSVpFXTsKLQkJaW50IG5SZWFkID0gMDsKLQkJdHJ5IHsKLQkJCXdoaWxlIChuUmVhZCAhPSAtMSkgewotCQkJCW5SZWFkID0gcmVhZGVyLnJlYWQoY2hhcmJ1ZiwgMCwgTUFYX0JVRl9TSVpFKTsKLQkJCQlpZiAoblJlYWQgPiAwKSB7Ci0JCQkJCW91dHB1dFN0cmVhbVdyaXRlci5mbHVzaCgpOwotCQkJCQlvdXRwdXRTdHJlYW1Xcml0ZXIud3JpdGUoY2hhcmJ1ZiwgMCwgblJlYWQpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiBlKSB7Ci0JCQljaGVja0NvbnZlcnNpb24oZkN1cnJlbnRFbmNvZGluZ01lbWVudG8sIGVuY29kaW5nUnVsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyBzaW5jZSB3ZSBkb24ndCBvd24gdGhlIG9yaWdpbmFsIG91dHB1dCBzdHJlYW0sIHdlCi0JCQkvLyB3b24ndCBjbG9zZSBpdCBvdXJzLgotCQkJLy8gdGhlIGNhbGxlciB3aG8gcGFzc2VkIGl0IHRvIHVzIG11c3QgY2xvc2Ugb3JpZ2luYWwgb25lCi0JCQkvLyB3aGVuIGFwcHJvcHJpYXRlLgotCQkJLy8gKGJ1dCB3ZSBkbyBmbHVzaCB0byBiZSBzdXJlIGFsbCB1cC10by1kYXRlKQotCQkJb3V0cHV0U3RyZWFtV3JpdGVyLmZsdXNoKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZ2V0M0J5dGVCT01QcmVmZXJlbmNlKCkgewotCQlyZXR1cm4gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4KTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgdGhyb3dzIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBDb3JlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCS8vQXNzZXJ0LmlzTm90TnVsbChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8sCi0JCS8vICJwcmV2aW91c0VuY29kaW5nTWVtZW50bwotCQkvLyBuZWVkcyB0byBiZSBzZXQgZmlyc3QiKTsKLQkJQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oSU5JVElBTF9CVUZGRVJfU0laRSk7Ci0JCWR1bXAoYnl0ZUFycmF5T3V0cHV0U3RyZWFtLCBlbmNvZGluZ1J1bGUsIGdldDNCeXRlQk9NUHJlZmVyZW5jZSgpKTsKLQkJcmV0dXJuIGJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvL0Fzc2VydC5pc05vdE51bGwoZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvLAotCQkvLyAicHJldmlvdXNFbmNvZGluZ01lbWVudG8KLQkJLy8gbmVlZHMgdG8gYmUgc2V0IGZpcnN0Iik7Ci0JCWlmICghZkhhc0JlZW5BbmFseXplZCkgewotCQkJYW5hbHl6ZSgpOwotCQl9Ci0JCS8vIHBvc3QgY29uZGl0aW9uCi0JCUFzc2VydC5pc05vdE51bGwoZkN1cnJlbnRFbmNvZGluZ01lbWVudG8sICJpbGxlZ2FsIHBvc3QgY29uZGl0aW9uIHN0YXRlIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYmUgc3VyZSB0byBjYXJyeSBvdmVyIGFwcHJvcHJpYXRlIGVuY29kaW5nCi0JCS8vICJzdGF0ZSIgdGhhdCBtYXkgYmUKLQkJLy8gcmVsZXZlbnQuCi0JCWlmIChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8gIT0gbnVsbCkgewotCQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZChmUHJldmlvdXNFbmNvZGluZ01lbWVudG8uaXNVVEY4M0J5dGVCT01Vc2VkKCkpOwotCQl9Ci0JCXJldHVybiBmQ3VycmVudEVuY29kaW5nTWVtZW50bzsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbmx5IHdoZW4gZW5jb2RpbmcgaXMgbm90IGRldGVjdGVkIGluIHRoZSBmaWxlLgotCSAqIAotCSAqIEhlcmUgaXMgZW5jb2RpbmcgbG9va3VwIG9yZGVyIHdlIHdpbGwgdHJ5OiAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogZGVzY3JpcHRpb24gKEVjbGlwc2UgVGV4dCBmaWxlIGVuY29kaW5nKSAtIHRyeSByZXNvdXJjZSBjb250ZW50Ci0JICogcHJvcGVydGllcyAoZm9yIEpTUCBvbmx5KSAtIHRyeSBjb250ZW50IHR5cGUgZW5jb2RpbmcgcHJlZmVyZW5jZXMgKGZvcgotCSAqIEhUTUwgb25seSkgLSB0cnkgcmVzb3VyY2UgY29udGVudCBkZXNjcmlwdGlvbiAoRWNsaXBzZSBUZXh0IGZpbGUKLQkgKiBlbmNvZGluZywgaW1wbGljaXQgY2hlY2spCi0JICogCi0JICogTm90ZTogVGhpcyBtZXRob2QgYXBwZWFycyBpbiBib3RoIENvZGVkUmVhZGVyQ3JlYXRvciBhbmQKLQkgKiBDb2RlZFN0cmVhbUNyZWF0b3IgKHdpdGgganVzdCBhIG1pbm9yIGRpZmZlcmVuY2UpLiBUaGV5IHNob3VsZCBiZSBrZXB0Ci0JICogdGhlIHNhbWUuCi0JICovCi0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvRnJvbVJlc291cmNlQW5kUHJlZmVyZW5jZSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8gPSBmRW5jb2RpbmdNZW1lbnRvOwotCi0JCS8vIEZvbGxvdyBFY2xpcHNlIFBsYXRmb3JtJ3MgZGlyZWN0aW9uLiBHZXQgdGhlIGNoYXJzZXQgZnJvbSBJRmlsZS4KLQkJaWYgKGZJRmlsZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY2hhcnNldCA9IGZJRmlsZS5nZXRDaGFyc2V0KCk7Ci0JCQllbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQkJfQotCi0JCXJldHVybiBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHJpdmF0ZSBSZWFkZXIgZ2V0UmVzZXR0YWJsZVJlYWRlcigpIHsKLQkJaWYgKGZSZXNldHRhYmxlUmVhZGVyID09IG51bGwpIHsKLQkJCWlmIChmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJCWZSZXNldHRhYmxlUmVhZGVyID0gZlJlYWRlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJZlJlc2V0dGFibGVSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoZlJlYWRlcik7Ci0JCQkJdHJ5IHsKLQkJCQkJZlJlc2V0dGFibGVSZWFkZXIubWFyayhNQVhfTUFSS19TSVpFKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGp1c3QgY2hlY2tlZCBpZgotCQkJCQkvLyBtYXJrYWJsZQotCQkJCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZSZXNldHRhYmxlUmVhZGVyOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZU5vdFByb3ZpZGVkRnJvbUNvbnRlbnRDYXNlKCkgewotCQkvLyBtb3ZlIHRvICJkZXRlY3RvcnMiIGlmIG5vdCBhbHJlYWR5Ci0JCVN0cmluZyBzcGVjRGVmYXVsdCA9IG51bGw7Ci0JCS8vc3BlY0RlZmF1bHQgPSBnZXRFbmNvZGluZ0RldGVjdG9yKCkuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlTdHJpbmcgY2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhzcGVjRGVmYXVsdCk7Ci0JCUFzc2VydC5pc05vdE51bGwoY2hhcnNldCwgUFJPR1JBTV9FUlJPUl9fRkFJTEVEX1RPX0ZJTkRfQU5ZX0NIQVJTRVRfQU5ZV0hFUkVfKTsKLQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPSBDb2RlZElPLmNyZWF0ZUVuY29kaW5nTWVtZW50byhjaGFyc2V0KTsKLQl9Ci0KLQkvLyBUT0RPIFdlIGp1c3QgY29weSB0aGUgY29udGVudCBwcm9wZXJ0aWVzIGVuY29kaW5nIHRvIGN1cnJlbnQgcmVzb3VyY2UncwotCS8vIGVuY29kaW5nIGZvciBub3cuIE1heSBpbXByb3ZlIHRoZSBVSSBsYXRlciBieSBzZXR0aW5nIGFuIGluZm9ybWF0aW9uYWwKLQkvLyBtZXNzYWdlIGFuZC9vciBkaXNhYmxlIHRoZSBjb250ZW50IHByb3BlcnRpZXMgZW5jb2RpbmcgZmllbGQuCi0JLy8gVE9ETyBtYWtlIHByaXZpYXRlIGlmIG5lZWRlZCwgZWxzZSByZW1vdmUKLQl2b2lkIG1pZ3JhdGVDb250ZW50UHJvcGVydGllc0VuY29kaW5nKFN0cmluZyBlbmNvZGluZykgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlpZiAoZklGaWxlICE9IG51bGwpCi0JCQlmSUZpbGUuc2V0Q2hhcnNldChlbmNvZGluZywgbnVsbCk7Ci0JCWZpbmFsIElGaWxlIGZpbGUgPSBmSUZpbGU7Ci0JCWZpbmFsIFN0cmluZyBjaGFyc2V0ID0gZW5jb2Rpbmc7Ci0JCS8vIFRPRE86IGV4dGVybmFsaXplIHN0cmluZyBsYXRlcgotCQlKb2IgbWlncmF0ZXIgPSBuZXcgSm9iKFNTRUNvcmVNZXNzYWdlcy5NaWdyYXRlX0NoYXJzZXQpIHsgLy8kTk9OLU5MUy0xJAotCQkJcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZpbGUuc2V0Q2hhcnNldChjaGFyc2V0LCBudWxsKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJfQotCQl9OwotCQltaWdyYXRlci5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCW1pZ3JhdGVyLnNjaGVkdWxlKCk7Ci0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmRmlsZW5hbWUgPSBudWxsOwotCQlmUmVhZGVyID0gbnVsbDsKLQkJZlByZXZpb3VzRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQkJZkN1cnJlbnRFbmNvZGluZ01lbWVudG8gPSBudWxsOwotCQlmSGFzQmVlbkFuYWx5emVkID0gZmFsc2U7Ci0JCWZDbGllbnRTdXBwbGllZFJlYWRlciA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJRmlsZSBmaWxlLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCWZJRmlsZSA9IGZpbGU7Ci0JCXNldChmaWxlLmdldE5hbWUoKSwgcmVhZGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIGZpbGVuYW1lLCBjaGFyW10gY2hhcmFjdGVyQXJyYXkpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZkZpbGVuYW1lID0gZmlsZW5hbWU7Ci0JCWZSZWFkZXIgPSBuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJhY3RlckFycmF5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIGZpbGVuYW1lLCBSZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZGaWxlbmFtZSA9IGZpbGVuYW1lOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlmQ2xpZW50U3VwcGxpZWRSZWFkZXIgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyB0ZXh0U3RyaW5nKSB7Ci0JCXNldChmaWxlbmFtZSwgbmV3IFN0cmluZ1JlYWRlcih0ZXh0U3RyaW5nKSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXNFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvIHByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKSB7Ci0JCWZQcmV2aW91c0VuY29kaW5nTWVtZW50byA9IHByZXZpb3VzRW5jb2RpbmdNZW1lbnRvOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uQ2hhcnNldE5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbW1vbkNoYXJzZXROYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGUwOGY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uQ2hhcnNldE5hbWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LklsbGVnYWxDaGFyc2V0TmFtZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7Ci1pbXBvcnQgamF2YS51dGlsLlByb3BlcnR5UmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDb21tb25DaGFyc2V0cyBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gcHJvdmlkZSBhIGNlbnRyYWwgcGxhY2UgdG8gbWFwIHNvbWUKLSAqIElBTkEgY2hhcnNldCBuYW1lIHRvIGEgSmF2YSBjaGFyc2V0IG5hbWUuIEluIDEuNCBKUkUncyB0aGlzIG1vc3RseSBpcyBhCi0gKiB0aGluIHdyYXBwZXIgb2YgZXhpc3RpbmcgQ2hhcnNldCBmdW5jdGlvbmFsaXR5LiBJdCBkb2VzLCBob3dldmVyLCBhbGxvdwotICogc29tZSAib3ZlcnJpZGluZyIgb2YgdGhlIGJ1aWx0IGluIEpSRSBtYXBwaW5ncyBpbiB0aGUgZXZlbnQgdGhleSBhcmUKLSAqIG5lY2Vzc2FyeS4gU2VlIENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGFsc28gcHJvdmlkZXMgc29tZSBjb252ZW5pZW50IGh1bWFuIHJlYWRhYmxlIGRlc2NyaXB0aW9uIGZvciB0aGUKLSAqIGNoYXJzZXQgbmFtZXMgd2hpY2ggY2FuIGJlIHVzZWQgaW4gdXNlciBpbnRlcmZhY2VzLiBUaGUgZGVzY3JpcHRpb24gaXMgTkwKLSAqIGF3YXJlIGJhc2VkIG9uIGxvY2FsZS4gVGhlIGRhdGEgaXMgcG9wdWxhdGVkIHZpYSB0aGUgY2hhcnNldC5wcm9wZXJ0aWVzCi0gKiBmaWxlIG9ubHkgb25jZSwgYmFzZWQgb24gc3RhdGljIGluaXRpYWxpemF0aW9uIG9mIHRoZSBoYXNodGFibGVzLgotICogPHA+Ci0gKiBUaGUgSUFOQSB0YWdzIGFyZSBiYXNlZCBvbiByZWZlcmVuY2UgaW5mb3JtYXRpb24gZm91bmQgYXQgdGhlCi0gKiBodHRwOi8vd3d3LmlhbmEub3JnIHNpdGUuIFNwZWNpZmljYWxseSBzZWUKLSAqIGh0dHA6Ly93d3cuaWFuYS5vcmcvYXNzaWdubWVudHMvY2hhcmFjdGVyLXNldHMKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbW1vbkNoYXJzZXROYW1lcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBQcm9wZXJ0aWVzIGRlZmF1bHRJQU5BbWFwcGluZ3MgPSBudWxsOwotCi0JcHJpdmF0ZSBzdGF0aWMgQXJyYXlMaXN0IGVuY29kaW5ncyA9IG51bGw7Ci0KLQlwcml2YXRlIHN0YXRpYyBIYXNodGFibGUgc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMgPSBudWxsOwotCi0JLyoqCi0JICogUmV0dXJucyBsaXN0IG9mIGNvbW1vbmx5IGF2YWlsYWJsZSBlbmNvZGluZyBuYW1lcy4gU3VpdGFibGUgZm9yCi0JICogcG9wdWxhdGluZyBhIFVJIGRpYWxvZyBvciBkcm9wIGRvd24uIFRoaXMgbGlzdCB3b3VsZCBiZSBhIHN1YnNldCBvZiBhbGwKLQkgKiBwb3NzaWJsZSBjaGFyc2V0cyB0aGUgVk0gc3VwcG9ydHMgKHdoaWNoIGNhbiBnZXQgaW50byB0aGUgaHVuZHJlZHMpLgotCSAqIEZvciB0aGUgVk0gc3VwcG9ydGVkIGNoYXJzZXRzLCB1c2UKLQkgKiA8Y29kZT5DaGFyc2V0LmF2YWlsYWJsZUNoYXJzZXRzKCk8L2NvZGU+Ci0JICogCi0JICogQHJldHVybiBTdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29tbW9uQ2hhcnNldE5hbWVzKCkgewotCQlTdHJpbmdbXSBlbmMgPSBuZXcgU3RyaW5nW2dldEVuY29kaW5ncygpLnNpemUoKV07Ci0JCWdldEVuY29kaW5ncygpLnRvQXJyYXkoZW5jKTsKLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGRlZmF1bHRJQU5BbWFwcGluZ3MuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBnZXREZWZhdWx0SUFOQU1hcHBpbmdzKCkgewotCQlpZiAoZGVmYXVsdElBTkFtYXBwaW5ncyA9PSBudWxsKSB7Ci0JCQlkZWZhdWx0SUFOQW1hcHBpbmdzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCUJ1bmRsZSBrZXlCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQpOwotCQkJSVBhdGgga2V5UGF0aCA9IG5ldyBQYXRoKCJjb25maWcvZGVmYXVsdElBTkEucHJvcGVydGllcyIpOyAvLyROT04tTkxTLTEkCi0JCQlVUkwgbG9jYXRpb24gPSBQbGF0Zm9ybS5maW5kKGtleUJ1bmRsZSwga2V5UGF0aCk7Ci0JCQlJbnB1dFN0cmVhbSBwcm9wZXJ0aWVzSW5wdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQlwcm9wZXJ0aWVzSW5wdXRTdHJlYW0gPSBsb2NhdGlvbi5vcGVuU3RyZWFtKCk7Ci0JCQkJZGVmYXVsdElBTkFtYXBwaW5ncy5sb2FkKHByb3BlcnRpZXNJbnB1dFN0cmVhbSk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIGNhbid0IHJlYWQsIGp1c3QgYXNzdW1lIHRoZXJlJ3Mgbm8KLQkJCQkvLyBkZWZhdWx0IElBTkEgbWFwcGluZ3MKLQkJCQkvLyBhbmQgcmVwZWF0ZWQgYXR0ZW1wdHMgd2lsbCBub3Qgb2NjdXIsCi0JCQkJLy8gc2luY2UgdGhleQotCQkJCS8vIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgYW4gZW1wdHkKLQkJCQkvLyBQcm9wZXJ0aWVzIG9iamVjdAotCQkJfQotCQl9Ci0JCXJldHVybiBkZWZhdWx0SUFOQW1hcHBpbmdzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgZGlzcGxheSAodHJhbnNsYXRlZCkgc3RyaW5nIGZvciBlbmNvZGluZyBuYW1lLiBJZiB0aGVyZSBpcyBubwotCSAqICJjdXN0b20iIHRyYW5zbGF0ZWQgdmVyc2lvbiBhdmFpbGFibGUsIGl0IGRlZmVycyB0byB0aGVyIFZNJ3MgQ2hhcnNldAotCSAqIHN1cHBvcnQuIEl0IHdpbGwgcmV0dXJuIG51bGwgaWYgbm8gZGlzcGxheSBuYW1lIGlzIGF2YWlsYWJsZS4KLQkgKiAKLQkgKiBAcGFyYW0gU3RyaW5nCi0JICogICAgICAgICAgICBjaGFyc2V0IG5hbWUKLQkgKiBAcmV0dXJuIEh1bWFuIGZyaWVuZGx5IGRpc3BsYXkgbmFtZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoU3RyaW5nIGNoYXJzZXROYW1lKSB7Ci0JCWlmIChjaGFyc2V0TmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSBnZXRTdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcygpLmdldChjaGFyc2V0TmFtZSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJLy8gaWYgd2UgZG9uJ3QgaGF2ZSBhIHNwZWNpYWwgb25lLCBqdXN0IHJldHVybgotCQkJLy8gd2hhdCdzIHByb3ZpZGVkIGJ5IENoYXJzZXQKLQotCQkJdHJ5IHsKLQkJCQlDaGFyc2V0IGNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoY2hhcnNldE5hbWUpOwotCQkJCXJlc3VsdCA9IGNoYXJzZXQuZGlzcGxheU5hbWUoKTsKLQkJCX0KLQkJCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJCS8vIGlmIG5vdCBzdXBwb3J0ZWQsIHRoZSBkaXNwbGF5IG5hbWUgaXMKLQkJCQkvLyB0aGUgbGVhc3Qgb2YgY2xpZW50cyBjb25jZXJucyA6KQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBqYXZhRW5jb2RpbmdzLgotCSAqLwotCXByaXZhdGUgc3RhdGljIEFycmF5TGlzdCBnZXRFbmNvZGluZ3MoKSB7Ci0JCWlmIChlbmNvZGluZ3MgPT0gbnVsbCkgewotCQkJaW5pdEhhc2hUYWJsZXMoKTsKLQkJfQotCQlyZXR1cm4gZW5jb2RpbmdzOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZShTdHJpbmcgY2hhcnNldE5hbWUpIHsKLQkJU3RyaW5nIHByZWZlcnJlZE5hbWUgPSBjaGFyc2V0TmFtZTsKLQotCQl0cnkgewotCQkJQ2hhcnNldCBjaGFyc2V0ID0gQ2hhcnNldC5mb3JOYW1lKGNoYXJzZXROYW1lKTsKLQkJCWlmIChjaGFyc2V0Lm5hbWUoKSAhPSBudWxsKSB7Ci0JCQkJcHJlZmVycmVkTmFtZSA9IGNoYXJzZXQubmFtZSgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCByZXR1cm4gaW5wdXQgaWYgaWxsZWdhbAotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCByZXR1cm4gaW5wdXQgaWYgaWxsZWdhbAotCQl9Ci0JCXJldHVybiBwcmVmZXJyZWROYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZWZhdWx0IElBTkEgbmFtZSB0aGF0IGlzIGxpc3RlZCBpbiBDb21tb25DaGFyc2V0TmFtZXMuIEhlcmUKLQkgKiBpcyBob3cgaXQgY2hlY2tzOiAxLiBjaGVjayB0byBzZWUgaWYgY2hhcnNldE5hbWUgaXMgaW4gdGhlCi0JICogQ29tbW9uQ2hhcnNldE5hbWVzIGxpc3QgYW5kIGlmIHNvLCBqdXN0IHJldHVybiBpdC4gMi4gY2hlY2sgdG8gc2VlIGlmCi0JICogY2hhcnNldE5hbWUgaXMgbGlzdGVkIGluIGRlZmF1bHRJQU5BbWFwcGluZ3Mgd2hpY2ggY29udGFpbnMgYSBtYXBwaW5nCi0JICogb2YgbW9yZSBjb21tb24gZW5jb2RpbmdzIGFuZCB0aGUgZGVmYXVsdCBJQU5BIG5hbWUgdGhleSBzaG91bGQgbWFwIHRvLgotCSAqIDMuIHJldHVybiBkZWZhdWx0SWFuYU5hbWUgaWYgYWxsIGVsc2UgZmFpbHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmZXJyZWREZWZhdWx0SWFuYU5hbWUoU3RyaW5nIGNoYXJzZXROYW1lLCBTdHJpbmcgZGVmYXVsdElhbmFOYW1lKSB7Ci0JCVN0cmluZyBwcmVmZXJyZWROYW1lID0gZGVmYXVsdElhbmFOYW1lOwotCQlTdHJpbmcgZ3Vlc3NlZE5hbWUgPSBjaGFyc2V0TmFtZTsKLQkJdHJ5IHsKLQkJCWd1ZXNzZWROYW1lID0gQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGNoYXJzZXROYW1lKTsKLQkJfQotCQljYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgaWdub3JlIGlmIGlsbGVnYWwKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgaWdub3JlIGlmIGlsbGVnYWwKLQkJfQotCQlpZiAoZ2V0RW5jb2RpbmdzKCkuY29udGFpbnMoZ3Vlc3NlZE5hbWUpKQotCQkJcHJlZmVycmVkTmFtZSA9IGd1ZXNzZWROYW1lOwotCQllbHNlIHsKLQkJCXByZWZlcnJlZE5hbWUgPSBnZXREZWZhdWx0SUFOQU1hcHBpbmdzKCkuZ2V0UHJvcGVydHkoZ3Vlc3NlZE5hbWUsIHByZWZlcnJlZE5hbWUpOwotCQl9Ci0KLQkJcmV0dXJuIHByZWZlcnJlZE5hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIEhhc2h0YWJsZSBnZXRTdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcygpIHsKLQkJaWYgKHN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzID09IG51bGwpIHsKLQkJCWluaXRIYXNoVGFibGVzKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cHBvcnRlZEVuY29kaW5nRGlzcGxheU5hbWVzOwotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgaW5pdEhhc2hUYWJsZXMoKSB7Ci0JCWlmIChzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcyA9PSBudWxsKSB7Ci0JCQkvLyBJbml0aWFsaXplIGhhc2ggdGFibGUgZm9yIGVuY29kaW5nIHRhYmxlCi0JCQlzdXBwb3J0ZWRFbmNvZGluZ0Rpc3BsYXlOYW1lcyA9IG5ldyBIYXNodGFibGUoKTsKLQkJCWVuY29kaW5ncyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkJUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gbnVsbDsKLQkJCUlucHV0U3RyZWFtIGJ1bmRsZVN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCVVSTCBidW5kbGVVUkwgPSBQbGF0Zm9ybS5maW5kKFBsYXRmb3JtLmdldEJ1bmRsZShJQ29kZWRSZXNvdXJjZVBsdWdpbi5JRCksIFBhdGguZnJvbU9TU3RyaW5nKCIkbmwkL2NvbmZpZy9jaGFyc2V0LnByb3BlcnRpZXMiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoYnVuZGxlVVJMICE9IG51bGwpIHsKLQkJCQkJYnVuZGxlU3RyZWFtID0gYnVuZGxlVVJMLm9wZW5TdHJlYW0oKTsKLQkJCQkJYnVuZGxlID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoYnVuZGxlU3RyZWFtKTsKLQkJCQl9Ci0KLQkJCQlTdHJpbmcgdG90YWxOdW1TdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKCJ0b3RhbG51bWJlciIpOy8vJE5PTi1OTFMtMSQKLQkJCQlpbnQgdG90YWxOdW0gPSAwOwotCQkJCWlmICh0b3RhbE51bVN0cmluZy5sZW5ndGgoKSAhPSAwKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQl0b3RhbE51bSA9IEludGVnZXIudmFsdWVPZih0b3RhbE51bVN0cmluZykuaW50VmFsdWUoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCXRvdGFsTnVtID0gMDsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxOdW07IGkrKykgewotCQkJCQlTdHJpbmcgaWFuYSA9IGJ1bmRsZS5nZXRTdHJpbmcoImNvZGVzZXQuIiArIGkgKyAiLmlhbmEiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmcgZGlzcGxheU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKCJjb2Rlc2V0LiIgKyBpICsgIi5sYWJlbCIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0KLQkJCQkJZW5jb2RpbmdzLmFkZChpYW5hKTsKLQkJCQkJc3VwcG9ydGVkRW5jb2RpbmdEaXNwbGF5TmFtZXMucHV0KGlhbmEsIGRpc3BsYXlOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImludmFsaWQgaW5zdGFsbCBvciBjb25maWd1cmF0aW9uIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChidW5kbGVTdHJlYW0gIT0gbnVsbCkKLQkJCQkJCWJ1bmRsZVN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gdW5pdCB0ZXN0IG9ubHkKLQkJU3RyaW5nIHRlc3QgPSAiQ3AxMjUyIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZSh0ZXN0KTsKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3QgKyAiIC0tPiAiICsgcmVzdWx0KTsgLy8kTk9OLU5MUy0xJAotCi0JCXRlc3QgPSAiTVM5MzIiOyAvLyROT04tTkxTLTEkCi0JCXJlc3VsdCA9IENvbW1vbkNoYXJzZXROYW1lcy5nZXRJYW5hUHJlZmVycmVkQ2hhcnNldE5hbWUodGVzdCk7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0ICsgIiAtLT4gIiArIHJlc3VsdCk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyBDb21tb25DaGFyc2V0TmFtZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JCWluaXRIYXNoVGFibGVzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDM1NGQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi0vKioKLSAqIENvbW1vbiBwcmVmZXJlbmNlIGtleXMgdXNlZCB0byBzcGVjaWZ5IGVuY29kaW5nIGFuZCBlbmQgb2YgbGluZS4KLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzIHsKLQkKLQlwcml2YXRlIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIENvbnN0YW50IHRvIGJlIHVzZWQgd2hlbiByZWZlcnJpbmcgdG8gQ1IvTUFDIGxpbmUgZGVsaW1pdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1IgPSAiRU9MX01hYyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDb25zdGFudCB0byBiZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIENSTEYvV0lORE9XUyBsaW5lIGRlbGltaXRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiRU9MX1dpbmRvd3MiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGVuZC1vZi1saW5lIGNoYXJhY3RlcihzKSB0byB1c2UuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09GX0xJTkVfQ09ERSA9ICJlbmRPZkxpbmVDb2RlIjsvLyROT04tTkxTLTEkCi0JLyoqCi0JICogVGhlIGNoYXJhY3RlciBjb2RlIHRvIHVzZSB3aGVuIHJlYWRpbmcgYSBmaWxlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOUFVUX0NPREVTRVQgPSAiaW5wdXRDb2Rlc2V0IjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdGFudCB0byBiZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIExGL1VOSVggbGluZSBkZWxpbWl0ZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMRiA9ICJFT0xfVW5peCI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDb25zdGFudCB0byBiZSB1c2VkIHdoZW4gcmVmZXJyaW5nIHRvIE5vIHRyYW5zbGF0aW9uIG9mIGxpbmUgZGVsaW1pdGVycwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX1RSQU5TTEFUSU9OID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgY2hhcmFjdGVyIGNvZGUgdG8gdXNlIHdoZW4gd3JpdGluZyBhIGZpbGUuCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUUFVUX0NPREVTRVQgPSAib3V0cHV0Q29kZXNldCI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIENSL01BQyBsaW5lIGRlbGltaXRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19DUiA9ICJcciI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIENSTEYvV0lORE9XUyBsaW5lIGRlbGltaXRlcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19DUkxGID0gIlxyXG4iOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBMRi9VTklYIGxpbmUgZGVsaW1pdGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSSU5HX0xGID0gIlxuIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTdHJpbmcgVXNlIDMgYnl0ZSBCT00gKEJ5dGUgT3JkZXIgTWFyaykgd2hlbiBzYXZpbmcgVVRGLTggZW5jb2RlZCBmaWxlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV8zQllURV9CT01fV0lUSF9VVEY4ID0gIlVzZTNCeXRlQk9NV2l0aFVURjgiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0NvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkNmNhMzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci1pbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5wcmVmcy5QcmVmZXJlbmNlczsKLQotCi1wdWJsaWMgY2xhc3MgQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkgewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBERUZBVUxUX0xPQ0FUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgUlVOVElNRV9YTUxfSUQgPSAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1NFX1hNTF9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQHBhcmFtIHBsdWdpbklkCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gYnVuZGxlRXhpc3RzKFN0cmluZyBwbHVnaW5JZCkgewotCi0JCS8vIHRoaXMganVzdCB2ZXJpZmllcyB0aGVyZSdzIHJlYWxseSBhIHBsdWdpbiB3aXRoIHRoaXMgSUQgaW4gInN0YWNrIgotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJcmV0dXJuICghKGJ1bmRsZSA9PSBudWxsKSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRDb250cmlidXRvclBsdWdpbklkKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQkvLyBUT0RPOiBuZWVkIHRvIGhhdmUgcmVnaXN0cmF0aW9uIGluZm8gaGVyZSwgYnV0IGZvciBub3csIHdlJ2xsIHVzZQotCQkvLyBzaW1wbGUgaGV1cmlzdGljIHRvIGNvdmVyIHRoZSBjYXNlcyB3ZSBrbm93IGFib3V0LgotCQlTdHJpbmcgZnVsbElkID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWZ1bGxJZCA9IERFRkFVTFRfTE9DQVRJT047Ci0JCX0gZWxzZSB7Ci0JCQlmdWxsSWQgPSBjb250ZW50VHlwZS5nZXRJZCgpOwotCQl9Ci0JCS8vIG9ubHkgb25lIGtub3duIGNhc2UsIHNvIGZhciwgb2YgaGFyZCBjb2RlZCByZS1kaXJlY3Rpb24KLQkJLy8gKG5vdCBzdXJlIHRoaXMgaXMgZXZlbiBuZWVkZWQsIGJ1dCBqdXN0IGluIGNhc2UpLgotCQkvLyBXZSBkb24ndCB3YW50IHRvIHN0b3JlL2NoYW5nZSBydW50aW1lLnhtbCBwcmVmZXJlbmNlcwotCQlpZiAoUlVOVElNRV9YTUxfSUQuZXF1YWxzKGZ1bGxJZCkpIHsKLQkJCWZ1bGxJZCA9IFNTRV9YTUxfSUQ7Ci0JCX0KLQkJU3RyaW5nIHBsdWdpbklkID0gaW5mZXJQbHVnaW5JZChmdWxsSWQpOwotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKElDb250ZW50VHlwZSBjb250ZW50VHlwZSkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGVjbGlwc2VQcmVmZXJlbmNlcyA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFJvb3ROb2RlKCk7Ci0JCS8vIFRPRE86IGV2ZW50YXVsbHkgbmVlZCBleHRlbnNpb24gbWVjaGFuaXNtIHRvIGF2b2lkIHRoZXNlIGhhcmQgY29kZWQKLQkJLy8gbWVjaGFuaXNtLgotCQkvLyBUaGUgaWRlYSBpcyB0byBsb2FkL3N0b3JlIGJhc2VkIG9uIHBsdWdpbidzIHByZWZlcmVuY2VzLCB3aGVyZSB0aGUKLQkJLy8gY29udGVudCB0eXBlIHdhcyBjb250cmlidXRlZAotCQkvLyBFdmVudHVhbGx5LCB0b28sIHdlIGNvdWxkIGRvIG1vcmUgImR5bmFtaWMgbG9va3VwIiB0byBnZXQgcGFyZW50Ci0JCS8vIHR5cGVzIGZvciBkZWZhdWx0cywgZXRjLgotCi0JCS8vIEdldCBkZWZhdWx0IHBsdWdpbiBwcmVmZXJlbmNlcwotCQlTdHJpbmcgcGx1Z2luUHJlZmVyZW5jZUxvY2F0aW9uID0gRGVmYXVsdFNjb3BlLlNDT1BFICsgSVBhdGguU0VQQVJBVE9SICsgZ2V0Q29udHJpYnV0b3JQbHVnaW5JZChjb250ZW50VHlwZSk7Ci0JCVByZWZlcmVuY2VzIHBsdWdpblByZWZlcmVuY2VzID0gZWNsaXBzZVByZWZlcmVuY2VzLm5vZGUocGx1Z2luUHJlZmVyZW5jZUxvY2F0aW9uKTsKLQotCQkvLyB0aGUgYmVsb3cgY29kZSBkb2VzIG5vdCB3b3JrIGF0IHRoaXMgdGltZSBiZWNhdXNlIGNvbnRlbnQgdHlwZQotCQkvLyBwcmVmZXJlbmNlcyBhcmUgc3RvcmVkIGluIHRoZSBwbGFjZSBhcyBwbHVnaW4gcHJlZmVyZW5jZXMKLQotCQkvLwkJUHJlZmVyZW5jZXMgY29udGVudFByZWZlcmVuY2VzID0gbnVsbDsKLQkJLy8JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCS8vCQkJY29udGVudFByZWZlcmVuY2VzID0gcGx1Z2luUHJlZmVyZW5jZXMubm9kZShjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJLy8JCX0KLQkJLy8JCWVsc2UgewotCQkvLwkJCWNvbnRlbnRQcmVmZXJlbmNlcyA9IHBsdWdpblByZWZlcmVuY2VzLm5vZGUoREVGQVVMVF9MT0NBVElPTiApOwotCQkvLwkJfQotCQkvLwotCQkvLwkJcmV0dXJuIGNvbnRlbnRQcmVmZXJlbmNlczsKLQotCQlyZXR1cm4gcGx1Z2luUHJlZmVyZW5jZXM7Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXREZWZhdWx0UHJlZmVyZW5jZXMoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY29udGVudFR5cGVJZCk7Ci0JCXJldHVybiBnZXREZWZhdWx0UHJlZmVyZW5jZXMoY29udGVudFR5cGUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJlZmVyZW5jZXMgZ2V0UHJlZmVyZW5jZXMoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZWNsaXBzZVByZWZlcmVuY2VzID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0Um9vdE5vZGUoKTsKLQkJLy8gVE9ETzogZXZlbnRhdWxseSBuZWVkIGV4dGVuc2lvbiBtZWNoYW5pc20gdG8gYXZvaWQgdGhlc2UgaGFyZCBjb2RlZAotCQkvLyBtZWNoYW5pc20uCi0JCS8vIFRoZSBpZGVhIGlzIHRvIGxvYWQvc3RvcmUgYmFzZWQgb24gcGx1Z2luJ3MgcHJlZmVyZW5jZXMsIHdoZXJlIHRoZQotCQkvLyBjb250ZW50IHR5cGUgd2FzIGNvbnRyaWJ1dGVkCi0JCS8vIEV2ZW50dWFsbHksIHRvbywgd2UgY291bGQgZG8gbW9yZSAiZHluYW1pYyBsb29rdXAiIHRvIGdldCBwYXJlbnQKLQkJLy8gdHlwZXMgZm9yIGRlZmF1bHRzLCBldGMuCi0KLQkJLy8gR2V0IGluc3RhbmNlIHBsdWdpbiBwcmVmZXJlbmNlcwotCQlTdHJpbmcgcGx1Z2luUHJlZmVyZW5jZUxvY2F0aW9uID0gUGx1Z2luLlBMVUdJTl9QUkVGRVJFTkNFX1NDT1BFICsgSVBhdGguU0VQQVJBVE9SICsgZ2V0Q29udHJpYnV0b3JQbHVnaW5JZChjb250ZW50VHlwZSk7Ci0JCVByZWZlcmVuY2VzIHBsdWdpblByZWZlcmVuY2VzID0gZWNsaXBzZVByZWZlcmVuY2VzLm5vZGUocGx1Z2luUHJlZmVyZW5jZUxvY2F0aW9uKTsKLQotCQkvLyB0aGUgYmVsb3cgY29kZSBkb2VzIG5vdCB3b3JrIGF0IHRoaXMgdGltZSBiZWNhdXNlIGNvbnRlbnQgdHlwZQotCQkvLyBwcmVmZXJlbmNlcyBhcmUgc3RvcmVkIGluIHRoZSBwbGFjZSBhcyBwbHVnaW4gcHJlZmVyZW5jZXMKLQotCQkvLwkJUHJlZmVyZW5jZXMgY29udGVudFByZWZlcmVuY2VzID0gbnVsbDsKLQkJLy8JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCS8vCQkJY29udGVudFByZWZlcmVuY2VzID0gcGx1Z2luUHJlZmVyZW5jZXMubm9kZShjb250ZW50VHlwZS5nZXRJZCgpKTsKLQkJLy8JCX0KLQkJLy8JCWVsc2UgewotCQkvLwkJCWNvbnRlbnRQcmVmZXJlbmNlcyA9IHBsdWdpblByZWZlcmVuY2VzLm5vZGUoREVGQVVMVF9MT0NBVElPTiApOwotCQkvLwkJfQotCQkvLwotCQkvLwkJcmV0dXJuIGNvbnRlbnRQcmVmZXJlbmNlczsKLQkJcmV0dXJuIHBsdWdpblByZWZlcmVuY2VzOwotCi0JfQotCi0JcHVibGljIHN0YXRpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcyhTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQkJcmV0dXJuIGdldFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcmVmZXJlbmNlc1N0cmluZyhJQ29udGVudFR5cGUgY29udGVudFR5cGUsIFN0cmluZyBrZXkpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhjb250ZW50VHlwZSk7Ci0JCVN0cmluZyB2YWx1ZSA9IHByZWZlcmVuY2VzLmdldChrZXksIGdldERlZmF1bHRQcmVmZXJlbmNlcyhjb250ZW50VHlwZSkuZ2V0KGtleSwgbnVsbCkpOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZmVyZW5jZXNTdHJpbmcoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFN0cmluZyBrZXkpIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBnZXRQcmVmZXJlbmNlcyhjb250ZW50VHlwZUlkKTsKLQkJU3RyaW5nIHZhbHVlID0gcHJlZmVyZW5jZXMuZ2V0KGtleSwgZ2V0RGVmYXVsdFByZWZlcmVuY2VzKGNvbnRlbnRUeXBlSWQpLmdldChrZXksIG51bGwpKTsKLQkJcmV0dXJuIHZhbHVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmdWxsSWQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGluZmVyUGx1Z2luSWQoU3RyaW5nIGZ1bGxJZCkgewotCQkvLyBzaW1wbHkgdHJpbSBvZmYgbGFzdCAic2VnbWVudCIgZnJvbSBmdWxsIElELgotCQlpbnQgbGFzdFNlZ21lbnRQb3MgPSBmdWxsSWQubGFzdEluZGV4T2YoJy4nKTsKLQkJU3RyaW5nIHBsdWdpbklkID0gbnVsbDsKLQkJaWYgKGxhc3RTZWdtZW50UG9zICE9IC0xKSB7Ci0JCQlwbHVnaW5JZCA9IGZ1bGxJZC5zdWJzdHJpbmcoMCwgbGFzdFNlZ21lbnRQb3MpOwotCQl9IGVsc2UgewotCQkJLy8gd2VpcmQgY2FzZT8gV2UnbGwgYXQgbGVhc3QgcHV0L2dldCB0aGVtIHNvbWV3aGVyZQotCQkJcGx1Z2luSWQgPSBERUZBVUxUX0xPQ0FUSU9OOwotCQl9Ci0JCWlmICghYnVuZGxlRXhpc3RzKHBsdWdpbklkKSkgewotCQkJLy8gdXNlIGRlZmF1bHQgbG9jYXRpb24KLQkJCXBsdWdpbklkID0gREVGQVVMVF9MT0NBVElPTjsKLQkJfQotCQlyZXR1cm4gcGx1Z2luSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMmFkMjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Db250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEEgY29udmVuaWVuY2UgY2xhc3MgdG8gc3RhdGljYWxseSBnZXQgcHJlZmVyZW5lbmNlcy4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzIHsKLQotCS8vIGFjdHVhbGx5IGEgbnVsbC9lbXB0eSBzdHJpbmcgYWxzbyBtZWFucyB1c2Ugd29ya2JlbmNoIGRlZmF1bHQgc28gdGhpcwotCS8vIGNvbnN0YW50IG1pZ2h0IG5vdCByZWFsbHkgYmUgbmVjZXNzYXJ5Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0JFTkNIX0RFRkFVTFQgPSAiV09SS0JFTkNIX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRKYXZhUGxhdGZvcm1EZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIG5vdGU6IGl0cyBpbXBvcnRhbnQgdG8gdXNlIHRoaXMgc3lzdGVtIHByb3BlcnR5LAotCQkvLyBpbnN0ZWFkCi0JCS8vIG9mCi0JCS8vIEJ5dGVUb0NoYXJDb252ZXJ0ZXIuZ2V0RGVmYXVsdCgpLmdldENoYXJhY3RlckVuY29kaW5nKCkKLQkJLy8gaW5vcmRlciB0byBoYW5kbGUgY2hhbmdlcyAib24gdGhlIGZseSIuIHRoZQotCQkvLyBCeXRlVG9DaGFyQ29udmVydGVyCi0JCS8vIGRlZmF1bHQgaXMgYXBwYXJlbnRseSBzZXQgb25seSB3aGVuIFZNIHN0YXJ0cy4KLQkJLy8gVGhlcmUncyBub3QgcmVhbGx5IGFueSAiY3Vzb210ZXIgc2NuZXJlcmlvcyIKLQkJLy8gdGhhdCBjaGFuZ2UgdGhlCi0JCS8vIGRlZmF1bHQgZW5jb2RpbmcgIm9uIHRoZSBmbHkiLCBidXQgaXRzIGF0IGxlYXN0Ci0JCS8vIHVzZWQgZHVyaW5nCi0JCS8vIG91ciBhdXRvbWF0ZWQgdGVzdHMuCi0JCVN0cmluZyBlbmMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImZpbGUuZW5jb2RpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlTdHJpbmcgbmV3TGluZUNvZGUgPSBudWxsOwotCQluZXdMaW5lQ29kZSA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlSWQsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUpOwotCQlpZiAobmV3TGluZUNvZGUgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IG51bGw7Ci0JCWVsc2UgaWYgKG5ld0xpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUikpCi0JCQlyZXN1bHQgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1I7Ci0JCWVsc2UgaWYgKG5ld0xpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikpCi0JCQlyZXN1bHQgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfTEY7Ci0JCWVsc2UgaWYgKG5ld0xpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKSkKLQkJCXJlc3VsdCA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUkxGOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgY3VycmVudCBvdXRwdXQgZW5jb2RpbmcgcHJlZmVyZW5jZSBmb3IgY29udGVudFR5cGVJZGVudGlmaWVyCi0JICogKHVuaXF1ZSBJQU5BIGVuY29kaW5nKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0TmFtZShTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlTdHJpbmcgcHJlZkVuY29kaW5nID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJZCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCQlTdHJpbmcgZW5jb2RpbmcgPSBwcmVmRW5jb2Rpbmc7Ci0JCS8vIGdldCB3b3JrYmVuY2ggZW5jb2RpbmcgcHJlZmVyZW5jZSBpZiBwcmVmZXJlbmNlCi0JCS8vIHJlcXVlc3RzIGl0Ci0JCWlmIChwcmVmRW5jb2RpbmcgPT0gbnVsbCB8fCBwcmVmRW5jb2RpbmcudHJpbSgpLmxlbmd0aCgpID09IDAgfHwgcHJlZkVuY29kaW5nLmVxdWFscyhDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuV09SS0JFTkNIX0RFRkFVTFQpKSB7Ci0JCQllbmNvZGluZyA9IENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRXb3JrYmVuY2hQcmVmZXJyZWRDaGFyc2V0TmFtZSgpOwotCQl9Ci0JCXJldHVybiBlbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBnZXQgc3BlY2lmaWVkIHByZWZlcmVuY2UuIFN1YmNsYXNzZXMgY2FuJ3Qgb3ZlcnJpZGUsCi0JICogc2luY2Ugd2UgZXhwZWN0IHRoaXMgdG8gd29yayBpbiBhIGNvbnNpc3RlbnQgd2F5LiBOb3RlOiB0aGlzIGlzCi0JICogc3BlY2lmaWMgdG8gSFRNTCBhbmQgQ1NTIGFuZCBpcyBpbnRlbmRlZCB0byBzdXBwbHkgYSAiZGVmYXVsdCBzcGVjIgotCSAqIG90aGVyIHRoYW4gdGhlIHdvcmtiZW5jaCBwbGF0Zm9ybSdzIGRlZmF1bHQsIG9ubHkgZm9yIHRob3NlIGNhc2VzIHdoZXJlCi0JICogdGhlcmUgaXMgbm8gZW5jb2Rpbmcgc3BlY2lmaWVkIGFueXdoZXJlIGVsc2UsIGUuZy4gaW4gdGhlIGZpbGUsIG9yIGFzIGEKLQkgKiBmaWxlIG9yIGZvbGRlciBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZSgpIHsKLQkJU3RyaW5nIENvbnRlbnRUeXBlSURfSFRNTCA9ICJvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBnZXRVc2VyU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nUHJlZmVyZW5jZShDb250ZW50VHlwZUlEX0hUTUwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFVzZXJTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmdQcmVmZXJlbmNlKFN0cmluZyBjb250ZW50VHlwZUlEKSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCi0JCS8vIGZpcnN0IHRyeSB0byBnZXQgYmFzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlEKTsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCWVuYyA9IGNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0KCk7Ci0JCX0KLQkJCi0JCS8vIG5leHQgdHJ5IHRvIGdldCBzc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJRCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0JCX0KLQkJCi0JCS8vIG5leHQsIGp1c3QgdHJ5IGFuZCB1c2Ugd29ya2JlbmNoIGVuY29kaW5nCi0JCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpOwotCQl9Ci0JCQotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBXb3JrYmVuY2ggZW5jb2RpbmcgcHJlZmVyZW5jZS4gTm90ZTogaWYgd29ya2JlbmNoIGVuY29kaW5nIGlzCi0JICogbnVsbCwgcGxhdGZvcm0gZW5jb2Rpbmcgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0V29ya2JlbmNoUHJlZmVycmVkQ2hhcnNldE5hbWUoKSB7Ci0JCVN0cmluZyBjaGFyc2V0ID0gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JCWNoYXJzZXQgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0SWFuYVByZWZlcnJlZENoYXJzZXROYW1lKGNoYXJzZXQpOwotCQlyZXR1cm4gY2hhcnNldDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIFdvcmtiZW5jaCBlbmNvZGluZyBwcmVmZXJlbmNlLiBXaWxsIHJldHVybiBudWxsIGlmIG5vbmUKLQkgKiBzcGVjaWZpZWQuCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpIHsKLQkJUmVzb3VyY2VzUGx1Z2luIHJlc291cmNlUGx1Z2luID0gUmVzb3VyY2VzUGx1Z2luLmdldFBsdWdpbigpOwotCQlTdHJpbmcgZW5jID0gcmVzb3VyY2VQbHVnaW4uZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoUmVzb3VyY2VzUGx1Z2luLlBSRUZfRU5DT0RJTkcpOwotCQkvLyByZXR1cm4gYmxhbmsgYXMgbnVsbAotCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgdXNlRGVmYXVsdE5hbWVSdWxlcyhJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZW5jb2RpbmdQcm92aWRlcikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGVuYyA9IG51bGw7Ci0JCWVuYyA9IGVuY29kaW5nUHJvdmlkZXIuZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGVuYzsKLQkJfSBlbHNlIHsKLQkJCWVuYyA9IGdldFVzZXJTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmdQcmVmZXJlbmNlKCk7Ci0JCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXN1bHQgPSBlbmM7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJZW5jID0gZ2V0V29ya2JlbmNoU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJCWlmIChlbmMgIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gZW5jOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChlbmMgPT0gbnVsbCB8fCBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJZW5jID0gZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCk7Ci0JCQkJCS8vIGVuYyBzaG91bGQgbmV2ZXIgYmUgbnVsbCAoYnV0IHdlJ2xsCi0JCQkJCS8vIGNoZWNrIGFueXdheSkKLQkJCQkJaWYgKGVuYyAhPSBudWxsKSB7Ci0JCQkJCQlyZXN1bHQgPSBlbmM7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJQXNzZXJ0LmlzTm90TnVsbChlbmMsICJwb3N0IGNvbmRpdGlvbiBpbnZhbGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMoZW5jKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdNZW1lbnRvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0VuY29kaW5nTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTNkZmRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdNZW1lbnRvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB0byBzaW1wbHkgaG9sZCBpbmZvcm1hdGlvbiBhbmQgZGF0YSBhYm91dCB0aGUgdHlwZSBvZgotICogZW5jb2RpbmcgZm91bmQgZm9yIGEgcmVzb3VyY2UuIEl0IG5vdCBvbmx5IGluY2x1ZGVzIG5hbWVzLCBldGMuLCBidXQgYWxzbwotICogZ2l2ZXMgaGludHMgYWJvdXQgdGhlIGFsZ29yaXRobSwgb3IgcnVsZSwgdGhhdCB0aGUgZW5jb2RuZyB3YXMgZGV0ZXJtaW5lZC4KLSAqIEhhdmluZyBhbGwgdGhpcyBpbmZvIGluIGEgY2VudHJhbCBvYmplY3QsIGFzc29jaWF0ZWQgd2l0aCB0aGUgRG9jdW1lbnQKLSAqICh0ZWNobmljYWxseSwgSVN0cnVjdHVyZWREb2N1bWVudCksIGFsbG93cyBmb3IgYmV0dGVyIHVzZXIgZXJyb3IgbWVzc2FnZXMsCi0gKiBhbmQgYmV0dGVyIGhhbmRsaW5nIG9mIGtub3dpbmcgaG93IHRvIGR1bXAgYSBmaWxlLCBnaXZlbiB3ZSBrbm93IGhvdyBpdCB3YXMKLSAqIGxvYWRlZC4KLSAqIAotICogTm90ZTogdGhlIGRhdGEgaW4gdGhpcyBjbGFzcyBpcyBvbmx5IHZhbGlkIGlmIGl0cyBoYXMgYWN0dWFsbHkgZ29uZSB0aHJvdWdoCi0gKiB0aGUgbG9hZGluZyBvciBkdW1waW5nIHNlcXVlbmNlLiBJdCBpcyBub3QgYWNjdXJhdGUsIGZvciBleGFtcGxlLCBpZiBhCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgc2ltcGx5IGNyZWF0ZWQgYW5kIHRoZW4gc2V0VGV4dCBjYWxsZWQuIEluIHRoaXMgdHlwZQotICogb2YgY2FzZSwgYWNjdXJhY3kgZm9yIGxvYWRpbmcgYW5kIGR1bXBpbmcgaXMgbm90IHJlcXVpcmVkLCBzaW5jZSBpdHMgYWxsCi0gKiByZS1kaXNjb3ZlcmVkLiBPbmUgbGltaXRhdGlvbiBpcyB0aGF0IHN0cnVjdHVyZWREb2N1bWVudCdzIGNyZWF0ZWQgImZyb20KLSAqIHNjcmF0Y2giIHRoaXMgd2F5LCBkb24ndCBoYXZlIGFueSBlbmNvZGluZyBpbmZvcm1hdGlvbiB0byBjb3VudCBvbiwgYW5kCi0gKiB3b3VsZCBoYXZlIHRvIGFycmFuZ2UgdGhlIHByb2Nlc3NpbmcgdG8gYmUgZG9uZS4gKEFuZCBpdCBpcyBkb25lLAotICogYXV0b21hdGljYWxseSBpZiBnb2luZyB0aHJvdWdoIGxvYWRlciBvciBkdW1wZXIsIGJ1dCBwZXJoYXBzIG5vdCBpbiBmdXR1cmUKLSAqIG5ldyB1c2VzLiBUT0RPOiB0aGlzIGNhbiBiZSBpbnByb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMuKQotICogCi0gKiBpc0luaXRpYWxpemVkIGlzIHNldCB3aGVuIHRoZSBsb2FkZXIgb3IgZHVtcGVyIHByb2Nlc3NlcyBoYXZlIGJlZW4gdXNlZCwKLSAqIGJ1dCBldmVuIHRoaXMgY2FuJ3QgYmUgY291bnRlZCBvbiAxMDAlIGlmIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBtb2RpZmllZAotICogc2luY2UuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nTWVtZW50byBpbXBsZW1lbnRzIENsb25lYWJsZSB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTE9ORUQgPSAiY2xvbmVkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUID0gIkRlZmF1bHRzQXNzdW1lZEZvckVtcHR5SW5wdXQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgREVGQVVMVFNfVVNFRF9EVUVfVE9fU01BTExfU1RSRUFNID0gImRlZmF1bHRzVXNlZER1ZVRvU21hbGxTdHJlYW0iOyAvLyROT04tTkxTLTEkCi0KLQotCS8qCi0JICogU3RyaW5ncyB0byBiZSB1c2VkIGZvciB0cmFjaW5nLiBUT0RPOiBuZWVkIHRvIGNsZWFuIHRoaXMgdXAsIHdlIG5vCi0JICogbG9uZ2VyIHVzZSBhbGwgb2YgdGhlbQotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMgPSAiZGV0ZWN0ZWRTdGFuZGFyZFVuaWNvZGVCeXRlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1VORF9FTkNPRElOR19JTl9DT05URU5UID0gImZvdW5kRW5jb2RpbmdJbkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9VTkRfRU5DT0RJTkdfSU5fU1RSRUFNID0gImZvdW5kRW5jb2RpbmdJblN0cmVhbSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1VORF9FTkNPRElOR19JTl9TVFJVQ1RVUkVEX0RPQ1VNRU5UID0gImZvdW5kRW5jb2RpbmdJblN0cnVjdHVyZWREb2N1bWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBHVUVTU0VEX0VOQ09ESU5HX0ZST01fU1RSRUFNID0gIkd1ZXNzRW5jb2RpbmdGcm9tU3RyZWFtIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfTkFNRV9GT1VORF9BU19JQU5BX05BTUUgPSAibm9NYXBwaW5nRm91bmRCdXRKYXZhTmFtZUZvdW5kVG9CZUlBTkFOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpBVkFfTkFNRV9GT1VORF9JTl9BTElBU19OQU1FID0gIm5vTWFwcGluZ0ZvdW5kQnV0SmF2YU5hbWVGb3VuZEluQWxpYXNUYWJsZSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBOT19JQU5BX05BTUVfRk9VTkQgPSAibm9NYXBwaW5nRm91bmRGcm9tSmF2YU5hbWVUb0lBTkFOYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQgPSAiVXNlZENvbnRlbnRUeXBlRGVmYXVsdCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX0pBVkFfREVGQVVMVCA9ICJVc2VkSmF2YURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFRF9NRU1FTlRPX0ZST01fTE9BRCA9ICJ1c2VkTWVtZW50b0Zyb21Mb2FkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfUFJPUEVSVFlfU0VUVElOR1MgPSAiVVNFRF9QUk9QRVJUWV9TRVRUSU5HUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBVU0VEX1VTRVJfU1BFQ0lGSUVEX1BSRUZFUkVOQ0UgPSAiVXNlZFVzZXJTcGVjaWZpZWRQcmVmZXJlbmNlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVTRURfV09SS1NQQUNFX0RFRkFVTFQgPSAiVXNlZFdvcmtzcGFjZURlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVVNFUl9JU19VU0lOR19KQVZBX0VOQ09ESU5HID0gIlVzZXJJc1VzaW5nSmF2YUVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZBcHByb3ByaWF0ZURlZmF1bHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JcHJpdmF0ZSBTdHJpbmcgZkludmFsaWRFbmNvZGluZzsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgZkphdmFDaGFyc2V0TmFtZTsKLQlwcml2YXRlIGJvb2xlYW4gZlVuaWNvZGVTdHJlYW07Ci0JcHJpdmF0ZSBib29sZWFuIGZVVEY4M0J5dGVCT01Vc2VkOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50bygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE9iamVjdCBjbG9uZSgpIHsKLQkJRW5jb2RpbmdNZW1lbnRvIG9iamVjdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlvYmplY3QgPSAoRW5jb2RpbmdNZW1lbnRvKSBzdXBlci5jbG9uZSgpOwotCQl9Ci0JCWNhdGNoIChDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB3ZSdyZSBpbXBsZW1lbnRpbmcgaGVyZQotCQl9Ci0KLQkJcmV0dXJuIG9iamVjdDsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlRGVmYXVsdC4gVGhpcyBpcyBvbmx5IHNldCBpZiBhbiBpbnZhbGlkIGVuY29kaW5nCi0JICogd2FzIGZvdW5kLCBhbmQgY29udGFpbnMgYW4gY2hhcnNldCBhcHByb3ByaWF0ZSB0byB1c2UgYXMgYSBkZWZhdWx0Ci0JICogdmFsdWUsIGlmLCBmb3IgZXhhbXBsZSwgdGhlIHVzZXIgZGVjaWRlcyB0byBsb2FkIHRoZSBkb2N1bWVudCBhbnl3YXksCi0JICogZXZlbiB0aG91Z2ggdGhlIGNoYXJzZXQgd2FzIGZvdW5kIHRvIGJlIGludmFsaWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFwcHJvcHJpYXRlRGVmYXVsdCgpIHsKLQkJaWYgKGZBcHByb3ByaWF0ZURlZmF1bHQgPT0gbnVsbCkgewotCQkJZkFwcHJvcHJpYXRlRGVmYXVsdCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJfQotCQlyZXR1cm4gZkFwcHJvcHJpYXRlRGVmYXVsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjaGFyc2V0IG5hbWUsIGlmIGl0IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBjaGFyc2V0IG5hbWUKLQkgKiBmb3VuZCBpbiBnZXRKYXZhQ2hhcnNldE5hbWUuIFRoaXMgY2FuIGhhcHBlbiwgZm9yIGV4YW1wbGUsIGlmIHRoZXJlIGFyZQotCSAqIGRpZmZlcmVuY2VzIGluIGNhc2UuIFRoaXMgbWV0aG9kIG1pZ2h0IHJldHVybiBTSElGVF9KSVMsIGFuZCB0aGUgdGhlCi0JICogZ2V0SmF2YUNoYXJzZXROYW1lIG1pZ2h0IHJldHVybiBTaGlmdF9KSVMgLS0gaWYgU0hJRlRfSklTIHdhcyBkZXRlY3RlZAotCSAqIGluIGZpbGUvZG9jdW1lbnQuIElmIHRoZSBvcmlnaW5hbCBmaWxlIGNvbnRhaW5lZCB0aGUgY29ycmVjdCBjYXNlLCB0aGVuCi0JICogdGhpcyBtZXRob2Qgd291bGQgcmV0dXJuIG51bGwuIFRoZSBnZXRKYXZhQ2hhcnNldE5hbWUgaXMgdHlwaWNhbGx5IHRoZQotCSAqIG9uZSB0aGF0IHNob3VsZCBhbHdheXMgYmUgdXNlZCwgYW5kIHRoaXMgb25lIG9ubHkgdXNlZCBmb3IgY2VydGFpbgotCSAqIGVycm9yIGNvbmRpdGlvbnMsIG9yIG9yIGlmIHdoZW4gY3JlYXRpbmcgYSAiZHVwbGljYXRlIiByZXNvdXJjZSwgaXQgd2FzCi0JICogZGVzaXJlZCB0byB1c2UgZXhhY3RseSB0aGUgY2hhcnNldCBuYW1lIGFzIGluIHRoZSBvcmlnaW5hbCBkb2N1bWVudC4gQXMKLQkgKiBhbiBleGFtcGxlIG9mIHRoaXMgbGF0ZXIgY2FzZSwgdGhlIG9yaWdpbmFsIGRvY3VtZW50IG1pZ2h0IGNvbnRhaW4KLQkgKiBJU08tODg1OS05LCBidXQgdGhlIGRldGVjdGVkIGNoYXJzZXQgbmFtZSBtaWdodCBjb250YWluIElTTy04ODU5LTktSS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpIHsKLQkJcmV0dXJuIGZEZXRlY3RlZENoYXJzZXROYW1lOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjaGFyc2V0IG5hbWUgdGhhdCB3YXMgZGV0ZWN0ZWQsIGJ1dCBub3QgZm91bmQgdG8gYmUgYSBjaGFyc2V0Ci0JICogc3VwcG9vcnRlZCBieSB0aGUgVk0uCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEludmFsaWRFbmNvZGluZygpIHsKLQkJcmV0dXJuIGZJbnZhbGlkRW5jb2Rpbmc7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgamF2YSBjb25vbmljYWwgY2hhcnNldCBuYW1lLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRKYXZhQ2hhcnNldE5hbWUoKSB7Ci0JCXJldHVybiBmSmF2YUNoYXJzZXROYW1lOwotCX0KLQotCS8qKgotCSAqIE5vdGU6IHdlIG1heSBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIG1ldGhvZCwgaWYgaXQgdHVybnMgb3V0IHRoaXMgd29yawotCSAqIGlzIGRvbmUgYnkgInRleHQiIHR5cGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLQotCSAqLwotCXB1YmxpYyBieXRlW10gZ2V0VW5pY29kZUJPTSgpIHsKLQkJYnl0ZVtdIGJvbSA9IG51bGw7Ci0JCWlmIChpc1VURjgzQnl0ZUJPTVVzZWQoKSkKLQkJCWJvbSA9IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl84OwotCQllbHNlIGlmIChpc1VuaWNvZGVTdHJlYW0oKSkgewotCQkJaWYgKGdldEphdmFDaGFyc2V0TmFtZSgpLmVxdWFscygiVVRGLTE2IikgfHwgZ2V0SmF2YUNoYXJzZXROYW1lKCkuZXF1YWxzKCJVVEYtMTZMRSIpKSB7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWJvbSA9IElDb250ZW50RGVzY3JpcHRpb24uQk9NX1VURl8xNkxFOwotCQkJfQotCQkJZWxzZSBpZiAoZ2V0SmF2YUNoYXJzZXROYW1lKCkuZXF1YWxzKCJVVEYtMTZCRSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlib20gPSBJQ29udGVudERlc2NyaXB0aW9uLkJPTV9VVEZfMTZCRTsKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBib207Ci0JfQotCi0JLyoqCi0JICogTm90ZTogaW4gb3VyIGltcGxlbWVudGF0aW9uLCB0aGUgc3RyZWFtIGlzIGEgdW5pY29kZSBzdHJlYW0gaWYgdGhlCi0JICogY2hhcnNldCBpcyBVVEYtMTYsIFVURi0xNkxFLCBvciBVVEYtMTZCRS4gQSBzdHJlYW0gd2l0aCAzIGJ5dGUgQk9NIGlzCi0JICogbm90IGNvbnNpZGVyZWQgdW5pY29kZSBzdHJlYW0gaGVyZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBpcyBhIHVuaWNvZGUgKFVURi0xNikgc3RyZWFtCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVbmljb2RlU3RyZWFtKCkgewotCQlyZXR1cm4gZlVuaWNvZGVTdHJlYW07Ci0JfQotCi0JLyoqCi0JICogTm90ZTogaW4gb3VyIGltcGxlbWVudGF0aW9uLCB0aGUgc3RyZWFtIGlzIGEgdW5pY29kZSBzdHJlYW0gaWYgdGhlCi0JICogY2hhcnNldCBpcyBVVEYtMTYsIFVURi0xNkxFLCBvciBVVEYtMTZCRS4gQSBzdHJlYW0gd2l0aCAzIGJ5dGUgQk9NIGlzCi0JICogbm90IGNvbnNpZGVyZWQgdW5pY29kZSBzdHJlYW0gaGVyZS4KLQkgKiAKLQkgKiBTZXQgZHVyaW5nIGxvYWQsIGNhbiBiZSB1c2VkIGJ5IGR1bXBlciB0byB3cml0ZSAzIGJ5dGUgQk9NLCB3aGljaCBKYXZhCi0JICogZG9lcyBub3Qgbm9ybWFsbHkgZG8uIFRoaXMgaGVscHMgbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIG90aGVyCi0JICogcHJvZ3JhbXMgKHRob3NlIHRoYXQgd3JvdGUgdGhlIDMgYnl0ZSBCT00gdGhlcmUgdG8gYmVnaW4gd2l0aC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1VURjgzQnl0ZUJPTVVzZWQoKSB7Ci0JCXJldHVybiBmVVRGODNCeXRlQk9NVXNlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotCQlyZXR1cm4gZ2V0SW52YWxpZEVuY29kaW5nKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhcHByb3ByaWF0ZURlZmF1bHQuCi0JICogCi0JICogQHBhcmFtIGFwcHJvcHJpYXRlRGVmYXVsdAotCSAqICAgICAgICAgICAgVGhlIGFwcHJvcHJpYXRlRGVmYXVsdCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBcHByb3ByaWF0ZURlZmF1bHQoU3RyaW5nIGFwcHJvcHJpYXRlRGVmYXVsdCkgewotCQlmQXBwcm9wcmlhdGVEZWZhdWx0ID0gYXBwcm9wcmlhdGVEZWZhdWx0OwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShTdHJpbmcgZGV0ZWN0ZWRDaGFyc2V0TmFtZSkgewotCQlmRGV0ZWN0ZWRDaGFyc2V0TmFtZSA9IGRldGVjdGVkQ2hhcnNldE5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SW52YWxpZEVuY29kaW5nKFN0cmluZyBpbnZhbGlkRW5jb2RpbmcpIHsKLQkJZkludmFsaWRFbmNvZGluZyA9IGludmFsaWRFbmNvZGluZzsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBqYXZhRW5jb2RpbmdOYW1lLgotCSAqIAotCSAqIEBwYXJhbSBqYXZhRW5jb2RpbmdOYW1lCi0JICogICAgICAgICAgICBUaGUgamF2YUVuY29kaW5nTmFtZSB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRKYXZhQ2hhcnNldE5hbWUoU3RyaW5nIGphdmFDaGFyc2V0TmFtZSkgewotCQlmSmF2YUNoYXJzZXROYW1lID0gamF2YUNoYXJzZXROYW1lOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBiCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5pY29kZVN0cmVhbShib29sZWFuIHVuaWNvZGVTdHJlYW0pIHsKLQkJZlVuaWNvZGVTdHJlYW0gPSB1bmljb2RlU3RyZWFtOwotCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgdVRGODNCeXRlQk9NZm91bmQuCi0JICogCi0JICogQHBhcmFtIHVURjgzQnl0ZUJPTWZvdW5kCi0JICogICAgICAgICAgICBUaGUgdVRGODNCeXRlQk9NZm91bmQgdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0VVRGODNCeXRlQk9NVXNlZChib29sZWFuIHVURjgzQnl0ZUJPTVVzZWQpIHsKLQkJZlVURjgzQnl0ZUJPTVVzZWQgPSB1VEY4M0J5dGVCT01Vc2VkOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ1J1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvRW5jb2RpbmdSdWxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzZmJiZTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9FbmNvZGluZ1J1bGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi0KLS8qKgotICogQ2xhc3MgdG8gcHJvdmlkZWQgImVudW1lcmF0ZWQgdHlwZXMiIGZvciBlbmNvZGluZyBydWxlIHBhcmFtZXRlci4gVGhpcyBpcwotICogdG8gYmUgdXNlZCBieSBjbGllbnQgdG8gaGF2ZSBzb21lIGNvbnRyb2wgb3ZlciBob3cgZW5jb2RpbmcgaXMgZGV0ZXJtaW5lZC4KLSAqLwotcHVibGljIGNsYXNzIEVuY29kaW5nUnVsZSB7Ci0JLyoqCi0JICogQ09OVEVOVF9CQVNFRCBtZWFucyB0aGUgY2xhc3Mgd2hpY2ggdXNlcyB0aGUgcGFyYW1ldGVyIChzdWNoIGFzCi0JICogY29udGVudFR5cGUgTG9hZGVycykgc2hvdWxkIHVzZSB3aGF0IGV2ZXIgcnVsZXMgaXQgbm9ybWFsbHkgd291bGQuCi0JICogKE5vdGUsIHNvbWUgY29udGVudCB0eXBlIGxvYWRlcnMgbWF5IG5vdCBhbHdheXMgbGl0ZXJhbGx5IHVzZSB0aGUgZmlsZQotCSAqIGNvbnRlbnQgdG8gZGV0ZXJtaW5lIGVuY29kaW5nLCBidXQgdGhlIHBvaW50IGlzIHRoZXkgc2hvdWxkIHVzZSB3aGF0Ci0JICogZXZlciBydWxlcyB0aGV5IG5vcm1hbGx5IHdvdWxkLikKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVuY29kaW5nUnVsZSBDT05URU5UX0JBU0VEID0gbmV3IEVuY29kaW5nUnVsZSgiQ09OVEVOVF9CQVNFRCIpOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogRk9SQ0VfREVGQVVMVCBtZWFucyB0aGUgY2xhc3Mgd2hpY2ggdXNlcyB0aGUgcGFyYW1ldGVyIChzdWNoIGFzCi0JICogY29udGVudFR5cGUgTG9hZGVycykgc2hvdWxkIHVzZSB3aGF0IGV2ZXIgaXQgZGVmaW5lcyBhcyB0aGUgZGVmYXVsdAotCSAqIGVuY29kaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgRW5jb2RpbmdSdWxlIEZPUkNFX0RFRkFVTFQgPSBuZXcgRW5jb2RpbmdSdWxlKCJGT1JDRV9ERUZBVUxUIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIElHTk9SRV9DT05WRVJTSU9OX0VSUk9SIG1lYW5zIHRoYXQgdGhlIHNhdmUgb3BlcmF0aW9uIHNob3VsZCBzYXZlIGV2ZW4KLQkgKiBpZiBpdCBlbmNvdW50ZXJzIGNvbnZlcnNpb24gZXJyb3JzLiBUaGlzIHdpbGwgcmVzdWx0IGluIHNvbWUgZGF0YSBsb3NzLAotCSAqIHNvIHNob3VsZCBvbmx5IGJlIHVzZWQgYWZ0ZXIgdGhlIHVzZXIgY29uZmlybXMgdGhhdCBpcyBpbmRlZWQgd2hhdCB0aGV5Ci0JICogd2FudCB0byBkby4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIEVuY29kaW5nUnVsZSBJR05PUkVfQ09OVkVSU0lPTl9FUlJPUiA9IG5ldyBFbmNvZGluZ1J1bGUoIklHTk9SRV9DT05WRVJTSU9OX0VSUk9SIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZW5jb2RpbmdSdWxlOwotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVuY29kaW5nUnVsZSBpcyBwcml2YXRlLCBzbyBubyBvbmUgY2FuIGluc3RhbnRpYXRlCi0JICogZXhjZXB0IHRoaXMgY2xhc3MgaXRzZWxmLgotCSAqLwotCXByaXZhdGUgRW5jb2RpbmdSdWxlKFN0cmluZyBydWxlTmFtZSkgewotCQlzdXBlcigpOwotCQllbmNvZGluZ1J1bGUgPSBydWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZW5jb2RpbmdSdWxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUNvZGVkUmVzb3VyY2VQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSUNvZGVkUmVzb3VyY2VQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDJiMDFkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb2RlZFJlc291cmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb2RlZFJlc291cmNlUGx1Z2luIHsKLQlTdHJpbmcgSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc3OGFkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZCB7Ci0JLyoqCi0JICogVGhlIEFQUFJPUFJJQVRFX0RFRkFVTFQgZmllbGQgaXMgdXNlZCBvbmx5IHdoZW4gdGhlCi0JICogSUNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0IHJldHVybnMgbnVsbC4gSXRzIHR5cGljYWxseSBzZXQgZnJvbQotCSAqIHVzZXIgcHJlZmVyZW5jZXMuIEtub3duIHVzZXMgY2FzZXMgYXJlIEhUTUwgYW5kIENTUywgd2hlcmUgdGhlcmUgaXMgbm8KLQkgKiAic3BlYyBkZWZhdWx0IiBmb3IgdGhvc2UgY29udGVudCB0eXBlcy4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFF1YWxpZmllZE5hbWUgQVBQUk9QUklBVEVfREVGQVVMVCA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiYXBwcm9wcmlhdGVEZWZhdWx0Iik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgREVURUNURURfQ0hBUlNFVCBwcm9wZXJ0eSBzaG91bGQgYmUgc2V0IHdoZW4gdGhlICJkZXRlY3RlZCIgY2hhcnNldAotCSAqIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBqYXZhIGNoYXJzZXQsIGV2ZW4gdGhvdWdoIGZ1bmN0aW9uYWxseQotCSAqIGVxdWl2ZWxlbnQuIFRoaXMgY2FuIG9jY3VyLCBmb3IgZXhhbXBsZSwgd2hlbiB0aGUgY2FzZXMgYXJlIGRpZmZlcmVudCwKLQkgKiBvciB3aGVuIGFuIGFsaWFzIG5hbWUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBjb25hbmljYWwgbmFtZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFF1YWxpZmllZE5hbWUgREVURUNURURfQ0hBUlNFVCA9IG5ldyBRdWFsaWZpZWROYW1lKElDb2RlZFJlc291cmNlUGx1Z2luLklELCAiZGV0ZWN0ZWRDaGFyc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBUaGUgVU5TVVBQT1JURURfQ0hBUlNFVCBwcm9wZXJ0eSBob2xkcyB0aGUgY2hhcnNldCB2YWx1ZSwgaWYgaXRzIGJlZW4KLQkgKiBmb3VuZCB0byBiZSBhbiB1bnN1cHBvdGVkIGNoYXJzZXQuIFRoaXMgaXMgaGVscGZ1bCBpbiBlcnJvciBtZXNzYWdlcywKLQkgKiBvciBpbiBjYXNlcyB3aGVuIGV2ZW4gdGhvdWdoIHRoZSBjaGFyc2V0IGlzIGludmFsaWQsIHRoZSBqYXZhIGNoYXJzZXQKLQkgKiBpcyBhc3N1bWVkIHRvIGJlIHRoZSBkZWZhdWx0LgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgUXVhbGlmaWVkTmFtZSBVTlNVUFBPUlRFRF9DSEFSU0VUID0gbmV3IFF1YWxpZmllZE5hbWUoSUNvZGVkUmVzb3VyY2VQbHVnaW4uSUQsICJ1bnN1cHBvcnRlZENoYXJzZXQiKTsgLy8kTk9OLU5MUy0xJAotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVJlc291cmNlQ2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lSZXNvdXJjZUNoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTk1YjUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvSVJlc291cmNlQ2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklTdG9yYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBleHRlbmRzIElTdHJlYW1DaGFyc2V0RGV0ZWN0b3IgewotCXZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9JU3RyZWFtQ2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lTdHJlYW1DaGFyc2V0RGV0ZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUxYWVjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL0lTdHJlYW1DaGFyc2V0RGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJlYW1DaGFyc2V0RGV0ZWN0b3IgewotCVN0cmluZyBnZXRFbmNvZGluZygpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCVN0cmluZyBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0KLQl2b2lkIHNldChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSk7Ci0KLQl2b2lkIHNldChSZWFkZXIgcmVhZGVyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9Ob25Db250ZW50QmFzZWRFbmNvZGluZ1J1bGVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL05vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjOWFlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL05vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotCi1wdWJsaWMgY2xhc3MgTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcyB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0SmF2YVBsYXRmb3JtRGVmYXVsdEVuY29kaW5nKCkgewotCQlTdHJpbmcgZW5jID0gU3lzdGVtLmdldFByb3BlcnR5KCJmaWxlLmVuY29kaW5nIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZW5jOwotCX0KLQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRGb3JDb250ZW50VHlwZShJRmlsZSBpRmlsZSkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJCi0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQljb250ZW50VHlwZSA9IGlGaWxlLmdldENvbnRlbnREZXNjcmlwdGlvbigpLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkKLQkJCS8vIGZpcnN0IHRyeSB0byBnZXQgYmFzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZSAKLQkJCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJZW5jID0gY29udGVudFR5cGUuZ2V0RGVmYXVsdENoYXJzZXQoKTsKLQkJCX0KLQotCQkJLy8gbmV4dCB0cnkgdG8gZ2V0IHNzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWVuYyA9IENvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5LmdldFByZWZlcmVuY2VzU3RyaW5nKGNvbnRlbnRUeXBlLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5JTlBVVF9DT0RFU0VUKTsKLQkJCX0KLQkJCQotCQkJLy8gcmV0dXJuIGJsYW5rIGFzIG51bGwKLQkJCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQllbmMgPSBudWxsOwotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGlmIGNvcmUgZXhjZXB0aW9uIG9jY3VycywgYXNzdW1lIG5vIHByZWZlcmVuY2UhCi0JCQllbmMgPSBudWxsOwotCQl9Ci0JCXJldHVybiBlbmM7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VXNlclNwZWNpZmllZERlZmF1bHRGb3JDb250ZW50VHlwZShTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlTdHJpbmcgZW5jID0gbnVsbDsKLQkJCi0JCS8vIGZpcnN0IHRyeSB0byBnZXQgYmFzZSdzIGRlZmF1bHQgZW5jb2RpbmcgZm9yIGNvbnRlbnQgdHlwZQotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCWVuYyA9IGNvbnRlbnRUeXBlLmdldERlZmF1bHRDaGFyc2V0KCk7Ci0JCX0KLQkJCi0JCS8vIG5leHQgdHJ5IHRvIGdldCBzc2UncyBkZWZhdWx0IGVuY29kaW5nIGZvciBjb250ZW50IHR5cGUKLQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJZW5jID0gQ29udGVudEJhc2VkUHJlZmVyZW5jZUdhdGV3YXkuZ2V0UHJlZmVyZW5jZXNTdHJpbmcoY29udGVudFR5cGVJZCwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCk7Ci0JCX0KLQkJCi0JCS8vIHJldHVybiBibGFuayBhcyBudWxsCi0JCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZ2V0V29ya2JlbmNoU3BlY2lmaWVkRGVmYXVsdEVuY29kaW5nKCkgewotCQlSZXNvdXJjZXNQbHVnaW4gcmVzb3VyY2VQbHVnaW4gPSBSZXNvdXJjZXNQbHVnaW4uZ2V0UGx1Z2luKCk7Ci0JCVN0cmluZyBlbmMgPSByZXNvdXJjZVBsdWdpbi5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldFN0cmluZyhSZXNvdXJjZXNQbHVnaW4uUFJFRl9FTkNPRElORyk7Ci0JCS8vIHJldHVybiBibGFuayBhcyBudWxsCi0JCWlmIChlbmMgIT0gbnVsbCAmJiBlbmMudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCWVuYyA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGVuYzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc3BlY0RlZmF1bHQKLQkgKiAgICAgICAgICAgIFRoaXMgaXMgdGhlIGRlZmF1bHQgY2hhcnNldCBuYW1lIHRoYXQgd291bGQgb3JkaW5hcmlseSBiZQotCSAqICAgICAgICAgICAgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgY29udGVudC4gTnVsbCBtYXkgYmUKLQkgKiAgICAgICAgICAgIHNwZWNpZmlmZWQgZm9yIHRob3NlIHR5cGVzIHdpdGggbm8gc3BlYyBkZWZhdWx0LiBJZiB0aGUgc3BlYwotCSAqICAgICAgICAgICAgZGVmYXVsdCBpcyBrbm93biAoYW5kIHBhc3NlZCBpbiksIHRoZW4gaXQgd2lsbCBiZSByZXR1cm5lZAotCSAqICAgICAgICAgICAgYWZ0ZXIgYmVpbmcgY2hlY2tlZCB0byBzZWUgaWYgdGhlcmUncyBiZSBhbnkgdXNlciBzcGVjaWZpZWQKLQkgKiAgICAgICAgICAgICJvdmVycmlkZSIgZm9yIHRoYXQgY2hhcnNldCAod2hpY2ggd291bGQgYmUgcmFyZSkuIEluIG90aGVyCi0JICogICAgICAgICAgICB3b3JkcywgaWYgdGhlIHNwZWMgaXMga25vd24sIHRoZXJlJ3MgbGl0dGxlIHJlYXNvbiB0byB1c2UKLQkgKiAgICAgICAgICAgIHRoaXMgbWV0aG9kLgotCSAqIEByZXR1cm4gdGhlIGNoYXJzZXQgdGhhdCBzaG91bGQgYmUgdXNlZCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzCi0JICogICAgICAgICBlc3RhYmxpc2hlZCBieSB0aGlzIGNsYXNzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHVzZURlZmF1bHROYW1lUnVsZXMoU3RyaW5nIHNwZWNEZWZhdWx0KSB7Ci0JCVN0cmluZyBlbmMgPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJZW5jID0gc3BlY0RlZmF1bHQ7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZW5jOwotCQl9IGVsc2UgewotCQkJZW5jID0gQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzLmdldFVzZXJTcGVjaWZpZWREZWZhdWx0RW5jb2RpbmdQcmVmZXJlbmNlKCk7Ci0JCQlpZiAoZW5jICE9IG51bGwgJiYgZW5jLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXN1bHQgPSBlbmMudHJpbSgpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoZW5jID09IG51bGwgfHwgZW5jLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCWVuYyA9IGdldFdvcmtiZW5jaFNwZWNpZmllZERlZmF1bHRFbmNvZGluZygpOwotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYy50cmltKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGVuYyA9PSBudWxsIHx8IGVuYy50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQllbmMgPSBnZXRKYXZhUGxhdGZvcm1EZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQkJLy8gZW5jIHNob3VsZCBuZXZlciBiZSBudWxsIChidXQgd2UnbGwKLQkJCQkJLy8gY2hlY2sgYW55d2F5KQotCQkJCQlpZiAoZW5jICE9IG51bGwpIHsKLQkJCQkJCXJlc3VsdCA9IGVuYzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXN1bHQgPSBDb2RlZElPLmNoZWNrTWFwcGluZ092ZXJyaWRlcyhyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlcygpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQXNzZXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjE4ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0Fzc2VydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLS8qKgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzIGluCi0gKiBjb2RlLiBUaGUgcHJlZGljYXRlIG1ldGhvZHMgYWxsIHRlc3QgYSBjb25kaXRpb24gYW5kIHRocm93IHNvbWUgdHlwZSBvZgotICogdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGRvZXMgbm90IGhvbGQuCi0gKiA8cD4KLSAqIEFzc2VydGlvbiBmYWlsdXJlIGV4Y2VwdGlvbnMsIGxpa2UgbW9zdCBydW50aW1lIGV4Y2VwdGlvbnMsIGFyZSB0aHJvd24gd2hlbgotICogc29tZXRoaW5nIGlzIG1pc2JlaGF2aW5nLiBBc3NlcnRpb24gZmFpbHVyZXMgYXJlIGludmFyaWFibHkgdW5zcGVjaWZpZWQKLSAqIGJlaGF2aW9yOyBjb25zZXF1ZW50bHksIGNsaWVudHMgc2hvdWxkIG5ldmVyIHJlbHkgb24gdGhlc2UgYmVpbmcgdGhyb3duCi0gKiAoYW5kIGNlcnRhaW5seSBzaG91bGQgbm90IGJlaW5nIGNhdGNoaW5nIHRoZW0gc3BlY2lmaWNhbGx5KS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7Ci0KLQkvKioKLQkgKiA8Y29kZT5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb248L2NvZGU+IGlzIGEgcnVudGltZSBleGNlcHRpb24gdGhyb3duCi0JICogYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbiA8Y29kZT5Bc3NlcnQ8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgY2xhc3MgaXMgbm90IGRlY2xhcmVkIHB1YmxpYyB0byBwcmV2ZW50IHNvbWUgbWlzdXNlczsgcHJvZ3JhbXMKLQkgKiB0aGF0IGNhdGNoIG9yIG90aGVyd2lzZSBkZXBlbmQgb24gYXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBzdXNjZXB0aWJsZSB0bwotCSAqIHVuZXhwZWN0ZWQgYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqIDwvcD4KLQkgKi8KLQlzdGF0aWMgY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQkJc3VwZXIoZGV0YWlsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKG1lc3NhZ2UpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuCi0JICogbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCXRocm93IG5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbnN0YW50aWF0ZWQuICovCi0JcHJpdmF0ZSBBc3NlcnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J1ZmZlcmVkTGltaXRlZFJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J1ZmZlcmVkTGltaXRlZFJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDI2YmRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLS8qKgotICogVGhpcyBpcyBhIHByZXR0eSBsaW1pdGVkIGltcGxlbWVudGF0aW9uLCBzb3J0IG9mIHNwZWNpZmljIAotICogdG8gdGhlIHdheSBpdHMgdXNlZCBieSB0b2tlbml6ZXJzIChKRmxleCkuIFRvIHJlYWxseSAKLSAqIGJlIGdlbmVyYWwgcHVycG9zZSwgd291bGQgbmVlZCBtb3JlIHdvcmsuIAotICoKLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBCdWZmZXJlZExpbWl0ZWRSZWFkZXIgZXh0ZW5kcyBCdWZmZXJlZFJlYWRlciB7Ci0JcHJpdmF0ZSBpbnQgbGltaXRlZENvdW50OwotCXByaXZhdGUgaW50IG5SZWFkOwotCi0JcHVibGljIEJ1ZmZlcmVkTGltaXRlZFJlYWRlcihSZWFkZXIgcmVhZGVyLCBpbnQgc2l6ZSkgewotCQlzdXBlcihyZWFkZXIsIHNpemUpOwotCQlpZiAocmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdHJ5IHsKLQkJCQltYXJrKHNpemUpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBpbXBvc3NpYmxlCi0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCQlsaW1pdGVkQ291bnQgPSBzaXplOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSAwOwotCQluUmVhZCsrOwotCQlpZiAoblJlYWQgPiBsaW1pdGVkQ291bnQpIHsKLQkJCXJlc3VsdCA9IC0xOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gc3VwZXIucmVhZCgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhciBjYnVmW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlpZiAoblJlYWQgKyBsZW4gPiBsaW1pdGVkQ291bnQpIHsKLQkJCXJlc3VsdCA9IC0xOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gc3VwZXIucmVhZChjYnVmLCBvZmYsIGxlbik7Ci0JCQluUmVhZCA9IG5SZWFkICsgcmVzdWx0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J1ZmZlcmVkTGltaXRlZFN0cmVhbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J1ZmZlcmVkTGltaXRlZFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTIwY2I5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9CdWZmZXJlZExpbWl0ZWRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1wdWJsaWMgY2xhc3MgQnVmZmVyZWRMaW1pdGVkU3RyZWFtIGV4dGVuZHMgQnVmZmVyZWRJbnB1dFN0cmVhbSB7Ci0KLQlwcml2YXRlIGludCBsaW1pdGVkQ291bnQ7Ci0KLQlwdWJsaWMgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKElucHV0U3RyZWFtIGluU3RyZWFtLCBpbnQgc2l6ZSkgewotCQlzdXBlcihpblN0cmVhbSwgc2l6ZSk7Ci0JCW1hcmsoc2l6ZSk7Ci0JCXRyeSB7Ci0JCQlsaW1pdGVkQ291bnQgPSBNYXRoLm1pbihzaXplLCBpblN0cmVhbS5hdmFpbGFibGUoKSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHVubGlrZWx5Ci0JCQlsaW1pdGVkQ291bnQgPSAwOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI2F2YWlsYWJsZSgpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gbGltaXRlZENvdW50IC0gcG9zOwotCX0KLQotCS8qKgotCSAqIGNvcGllZCBkb3duIGZyb20gc3VwZXIgY2xhc3MKLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5zdXJlT3BlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbiA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBjb3BpZWQgZG93biBmcm9tIHN1cGVyIGNsYXNzIHRoZW4sIGNoYW5nZWQgdG8gc2ltaXVsYXRlIEVPRiBpZiBnb2VzCi0JICogYmV5b25kIGJ1ZmZlcmVkIGFtb3VudAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVPcGVuKCk7Ci0JCS8vIGZvciB0aGlzIHNwZWNpYWwgc3RyZWFtLCBpbmRpY2F0ZSAiZW5kIG9mIGZpbGUiIHdoZW4gYnVmZmVyIGlzCi0JCS8vIGZ1bGwKLQkJaWYgKHBvcyA+PSBsaW1pdGVkQ291bnQpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCQlyZXR1cm4gc3VwZXIucmVhZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZm9yIHRoaXMgc3BlY2lhbCBzdHJlYW0sIGluZGljYXRlICJlbmQgb2YgZmlsZSIgd2hlbiBidWZmZXIgaXMKLQkJLy8gZnVsbAotCQlpZiAocG9zID49IGxpbWl0ZWRDb3VudCkgewotCQkJcmV0dXJuIC0xOwotCQl9Ci0JCXJldHVybiBzdXBlci5yZWFkKGIsIG9mZiwgbGVuKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0J5dGVSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTNkYzUwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQnl0ZVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQl0aGlzLmZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQlpZiAoIWlucHV0U3RyZWFtLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZVJlYWRlciBpcyByZXF1aXJlZCB0byBoYXZlIGEgcmVzZXR0YWJsZSBzdHJlYW0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRoaXMuZkJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB7Ci0JCXRoaXMuZklucHV0U3RyZWFtLm1hcmsocmVhZEFoZWFkTGltaXQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWludCBiMCA9IHRoaXMuZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IHRoaXMuZkJ1ZmZlci5sZW5ndGgpIHsKLQkJCWxlbmd0aCA9IHRoaXMuZkJ1ZmZlci5sZW5ndGg7Ci0JCX0KLQotCQlpbnQgY291bnQgPSB0aGlzLmZJbnB1dFN0cmVhbS5yZWFkKHRoaXMuZkJ1ZmZlciwgMCwgbGVuZ3RoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCWludCBiMCA9IHRoaXMuZkJ1ZmZlcltpXTsKLQkJCS8vIHRoZSAweDAwRkYgaXMgdG8gImxvc2UiIHRoZSBuZWdhdGl2ZSBiaXRzIGZpbGxlZCBpbiB0aGUgYnl0ZSB0bwotCQkJLy8gaW50IGNvbnZlcnNpb24KLQkJCS8vIChhbmQgd2hpY2ggd291bGQgYmUgdGhlcmUgaWYgY2FzdCBkaXJlY3RseSBmcm9tIGJ5dGUgdG8gY2hhcikuCi0JCQljaGFyIGMwID0gKGNoYXIpIChiMCAmIDB4MDBGRik7Ci0JCQljaFtvZmZzZXQgKyBpXSA9IGMwOwotCQl9Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQl0aGlzLmZJbnB1dFN0cmVhbS5yZXNldCgpOwotCX0KLQotCXB1YmxpYyBsb25nIHNraXAobG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5mSW5wdXRTdHJlYW0uc2tpcChuKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Db2RlZFJlc291cmNlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvQ29kZWRSZXNvdXJjZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmMwYjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Db2RlZFJlc291cmNlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JQ29kZWRSZXNvdXJjZVBsdWdpbjsKLQotLyoqCi0gKiBUaGUgbWFpbiBwbHVnaW4gY2xhc3MgdG8gYmUgdXNlZCBpbiB0aGUgZGVza3RvcC4KLSAqLwotcHVibGljIGNsYXNzIENvZGVkUmVzb3VyY2VQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gaW1wbGVtZW50cyBJQ29kZWRSZXNvdXJjZVBsdWdpbiB7Ci0JLy9UaGUgc2hhcmVkIGluc3RhbmNlLgotCXByaXZhdGUgc3RhdGljIENvZGVkUmVzb3VyY2VQbHVnaW4gcGx1Z2luOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hhcmVkIGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ29kZWRSZXNvdXJjZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gcGx1Z2luOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHdvcmtzcGFjZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElXb3Jrc3BhY2UgZ2V0V29ya3NwYWNlKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ29kZWRSZXNvdXJjZVBsdWdpbigpIHsKLQkJc3VwZXIoKTsKLQkJcGx1Z2luID0gdGhpczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgsIGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMTAxNDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLQotLyoqCi0gKiBTbWFsbCBjb252ZW5pZW5jZSBjbGFzcyB0byBsb2cgbWVzc2FnZXMgdG8gcGx1Z2luJ3MgbG9nIGZpbGUgYW5kIGFsc28sIGlmCi0gKiBkZXNpcmVkLCB0aGUgY29uc29sZS4gVGhpcyBjbGFzcyBzaG91bGQgb25seSBiZSB1c2VkIGJ5IGNsYXNzZXMgaW4gdGhpcwotICogcGx1Z2luLiBPdGhlciBwbHVnaW5zIHNob3VsZCBtYWtlIHRoZWlyIG93biBjb3B5LCB3aXRoIGFwcHJvcHJpYXRlIElELgotICovCi1wdWJsaWMgY2xhc3MgTG9nZ2VyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9OdWxsSW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9OdWxsSW5wdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNmM2FhMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvTnVsbElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0KLXB1YmxpYyBjbGFzcyBOdWxsSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jbWFyayhpbnQpCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI21hcmtTdXBwb3J0ZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0JCS8vIHdlIGNhbiBtYXJrIG5vdGhpbmcuCi0JCS8vIGFuZCwgd2UgYXJlIHVzaW5nIHRoaXMgTnVsbCBjbGFzcyBzcGVjaWZpY2FsbHkgZm9yCi0JCS8vIGEgImZha2UiIHJlc2V0dGFibGUgc3RyZWFtLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLklucHV0U3RyZWFtI3NraXAobG9uZykKLQkgKi8KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIDA7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU3YzdlZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2VuY29kaW5nL3V0aWwvUmVzb3VyY2VCdW5kbGVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci0KLS8vVE9ETzogcmV3b3JrIHRoaXMgd2l0aCBuZXcgcGxhdGZvcm0vcnVudGltZSBBUElzIChpZiBzdGlsbCBuZWVkZWQpLgotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFJlc291cmNlQnVuZGxlKHJlc291cmNlVVJJLCBMb2NhbGUuZ2V0RGVmYXVsdCgpKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKFN0cmluZyByZXNvdXJjZVVSSSwgTG9jYWxlIHRhcmdldExvY2FsZSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQkvLyB0cnkgdG8gbG9hZCBidW5kbGUgZnJvbSB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHRoZSByZXNvdXJjZVVSSQotCQkvLyB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHJlc291cmNlVVJJIHBvaW50cyB0byB0aGUgbG9jYWwKLQkJLy8gZmlsZSBzeXN0ZW0KLQotCQlpbnQgaW5kZXggPSByZXNvdXJjZVVSSS5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChpbmRleCA9PSAtMSkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCByZXNvdXJjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBCZWxvdyB3ZSBzZXQgJ3Jlc291cmNlRGlyZWN0b3J5JyBzbyB0aGF0IGl0IGVuZHMgd2l0aCBhICcvJy4KLQkJLy8gSGVyZSdzIGFuIGV4Y2VycHQgZnJvbSB0aGUgQ2xhc3NMb2FkZXIgSmF2YWRvYyAuLi4KLQkJLy8gQW55IFVSTCB0aGF0IGVuZHMgd2l0aCBhICcvJyBpcyBhc3N1bWVkIHRvIHJlZmVyIHRvIGEgZGlyZWN0b3J5LgotCQkvLyBPdGhlcndpc2UsIHRoZSBVUkwgaXMgYXNzdW1lZAotCQkvLyB0byByZWZlciB0byBhIEpBUiBmaWxlIHdoaWNoIHdpbGwgYmUgb3BlbmVkIGFzIG5lZWRlZC4KLQkJLy8KLQkJU3RyaW5nIHJlc291cmNlRGlyZWN0b3J5ID0gcmVzb3VyY2VVUkkuc3Vic3RyaW5nKDAsIGluZGV4ICsgMSk7Ci0JCVN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQotCQkvLyBjcmVhdGUgYSBjbGFzcyBsb2FkZXIgd2l0aCBhIGNsYXNzIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHJlc291cmNlCi0JCS8vIGJ1bmRsZSdzIGxvY2F0aW9uCi0JCS8vICAgICAgICAgCi0JCVVSTFtdIGNsYXNzcGF0aCA9IG5ldyBVUkxbMV07Ci0JCWNsYXNzcGF0aFswXSA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChyZXNvdXJjZURpcmVjdG9yeSkpOwotCQlDbGFzc0xvYWRlciByZXNvdXJjZUxvYWRlciA9IG5ldyBVUkxDbGFzc0xvYWRlcihjbGFzc3BhdGgsIG51bGwpOwotCi0JCXJldHVybiBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUocmVzb3VyY2VCdW5kbGVOYW1lLCB0YXJnZXRMb2NhbGUsIHJlc291cmNlTG9hZGVyKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZW5jb2RpbmcvdXRpbC9Vbmljb2RlQk9NRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1VuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYzUxOTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9lbmNvZGluZy91dGlsL1VuaWNvZGVCT01FbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLS8qKgotICogVGhpcyBpcyBhICJjb21tb24gZnVuY3Rpb24iIGNsYXNzIHRvIGRlY2lkZSBpZiBhbiBpbnB1dCBzdHJlYW0sIGlzIGEKLSAqIHVuaWNvZGUgc3RyZWFtLgotICovCi1wdWJsaWMgY2xhc3MgVW5pY29kZUJPTUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JLy9wcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2X0NIQVJTRVRfTkFNRSA9ICJVVEYtMTYiOwotCS8vIC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgY2xhc3MgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0KLQkJLyoqCi0JCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JCXB1YmxpYyBOb3RFbm91Z2hJbnB1dEZvckJPTUV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm90RW5vdWdoSW5wdXRGb3JCT01FeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEJCID0gKGJ5dGUpIDB4QkI7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBCRiA9IChieXRlKSAweEJGOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGJ5dGUgRUYgPSAoYnl0ZSkgMHhFRjsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBieXRlIEZFID0gKGJ5dGUpIC0yOwotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBGRiA9IChieXRlKSAtMTsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzE2QkVfQ0hBUlNFVF9OQU1FID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVVEZfMTZMRV9DSEFSU0VUX05BTUUgPSAiVVRGLTE2TEUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGXzhfQ0hBUlNFVF9OQU1FID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW0gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmTm9CT01Qb3NzaWJsZTsKLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGNoZWNrRm9yQk9NKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCi0JCXRyeSB7Ci0JCQlieXRlIGIxID0gZ2V0TmV4dEJ5dGUoaW5wdXRTdHJlYW0pOwotCQkJYnl0ZSBiMiA9IGdldE5leHRCeXRlKGlucHV0U3RyZWFtKTsKLQkJCWlmIChiMSA9PSBGRSAmJiBiMiA9PSBGRikgewotCQkJCXJlc3VsdCA9IGNyZWF0ZUVuY29kaW5nTWVtZW50byhVVEZfMTZCRV9DSEFSU0VUX05BTUUpOwotCQkJCXJlc3VsdC5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYjEgPT0gRkYgJiYgYjIgPT0gRkUpIHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFVURl8xNkxFX0NIQVJTRVRfTkFNRSk7Ci0JCQkJCXJlc3VsdC5zZXRVbmljb2RlU3RyZWFtKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWJ5dGUgYjMgPSBnZXROZXh0Qnl0ZSgoaW5wdXRTdHJlYW0pKTsKLQkJCQkJaWYgKGIxID09IEVGICYmIGIyID09IEJCICYmIGIzID09IEJGKSB7Ci0JCQkJCQlyZXN1bHQgPSBjcmVhdGVFbmNvZGluZ01lbWVudG8oVVRGXzhfQ0hBUlNFVF9OQU1FKTsKLQkJCQkJCXJlc3VsdC5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChOb3RFbm91Z2hJbnB1dEZvckJPTUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBUaGlzIGlzIHNvcnQgb2YgdW5leHBlY3RlZCBmb3Igbm9ybWFsIGNhc2VzLCBidXQgY2FuIG9jY3VyIGZvcgotCQkJLy8gZW1wdHkKLQkJCS8vIHN0cmVhbXMuIEFuZCwgdGhpcyBjYW4gb2NjdXIgIm5vcm1hbGx5IiBmb3Igbm9uLUJPTSBzdHJlYW1zCi0JCQkvLyB0aGF0Ci0JCQkvLyBoYXZlIG9ubHkgdHdvCi0JCQkvLyBieXRlcywgYW5kIGZvciB3aGljaCB0aG9zZSB0d28gYnl0ZXMgbWF0Y2ggdGhlIGZpcnN0IHR3byBieXRlcwotCQkJLy8gb2YgVVRGLTgKLQkJCS8vIEJPTSBJbiBhbnkgY2FzZSwgd2UnbGwgc2ltcGx5IHJldHVybiBudWxsOwotCQkJcmVzdWx0ID0gbnVsbDsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gb3RoZXIgZXJyb3JzIHNob3VsZCBiZSBpbXBvc3NpYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGNyZWF0ZUVuY29kaW5nTWVtZW50byhTdHJpbmcgamF2YUVuY29kaW5nTmFtZSkgewotCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gbmV3IEVuY29kaW5nTWVtZW50bygpOwotCQllbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGphdmFFbmNvZGluZ05hbWUpOwotCQlTdHJpbmcgaWFuYU5hbWUgPSBDaGFyc2V0LmZvck5hbWUoamF2YUVuY29kaW5nTmFtZSkubmFtZSgpOwotCQllbmNvZGluZ01lbWVudG8uc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShpYW5hTmFtZSk7Ci0JCWlmIChqYXZhRW5jb2RpbmdOYW1lLmVxdWFscyhVVEZfOF9DSEFSU0VUX05BTUUpKSB7Ci0JCQllbmNvZGluZ01lbWVudG8uc2V0VVRGODNCeXRlQk9NVXNlZCh0cnVlKTsKLQkJfQotCQlyZXR1cm4gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXJldHVybiBnZXRFbmNvZGluZ01lbWVudG8oKS5nZXREZXRlY3RlZENoYXJzZXROYW1lKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBJQU5BIGVuY29kaW5nIG5hbWUgaWYgQk9NIGRldGVjdGVkIGluIHN0cmVhbS4gSWYgYSBCT00gaXMKLQkgKiBkZXRlY3RlZCwgdGhlIHN0cmVhbSBpcyBsZWZ0IHBvc2l0aW9uZWQgYWZ0ZXIgcmVhZHlpbmcgdGhlIEJPTS4gSWYgYQotCSAqIEJPTSBpcyBub3QgZGV0ZWN0ZWQsIHRoZSBzdGVhbSBpcyByZXNldC4KLQkgKiAKLQkgKiAweEZFRkYgVVRGLTE2LCBiaWctZW5kaWFuIDB4RkZGRSBVVEYtMTYsIGxpdHRsZS1lbmRpYW4gMHhFRkJCQkYgVVRGLTgKLQkgKiAoQk9NIGlzIG9wdGlvbmFsKQotCSAqIAotCSAqIEBwYXJhbSBpbnB1dFN0cmVhbSAtCi0JICogICAgICAgICAgICBtdXN0IGJlIGEgcmVzZXRhYmxlIChtYXJrIHN1cHBvcnRlZCkgc3RyZWFtIHNvIGl0IGNhbiBiZQotCSAqICAgICAgICAgICAgcmVzZXQsIGlmIG5vdCBCT00gZW5jb2RlZCBzdHJlYW0KLQkgKiBAcmV0dXJuIFN0cmluZyAtIElBTkEgZW5jb2RpbmduYW1lIChtYXkgbm90IHdvcmsgd2VsbCBvbiAxLjMsIGJ1dCAxLjQKLQkgKiAgICAgICAgIHNlZW1zIHRvIGhhdmUgZ29vZCBzdXBwb3J0IGZvciBJQU5BIG5hbWVzKQotCSAqLwotCXB1YmxpYyBFbmNvZGluZ01lbWVudG8gZ2V0RW5jb2RpbmdNZW1lbnRvKCkgewotCi0JCUVuY29kaW5nTWVtZW50byByZXN1bHQgPSBudWxsOwotCQlpZiAoIWZOb0JPTVBvc3NpYmxlKSB7Ci0KLQkJCWlmIChmSW5wdXRTdHJlYW0gPT0gbnVsbCkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbnB1dCBtdXN0IGJlIHNldCBiZWZvcmUgdXNlIik7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKCFmSW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5wdXRTdHJlYW0gbXVzdCBiZSByZXNldGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXN1bHQgPSBjaGVja0ZvckJPTShmSW5wdXRTdHJlYW0pOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXByaXZhdGUgYnl0ZSBnZXROZXh0Qnl0ZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgYnl0ZUNoYXJBc0ludCA9IC0xOwotCQkvLyBiZSBzdXJlIHdlIHdvbid0IGJsb2NrCi0JCWlmIChpbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDApIHsKLQkJCWJ5dGVDaGFyQXNJbnQgPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQlieXRlQ2hhckFzSW50ID0gYnl0ZUNoYXJBc0ludCAmIDBYRkY7Ci0JCX0KLQkJLy8gdG8gYXZvaWQgY29uZnVzdGlvbiBvdmVyIG1lYW5pbmcgb2YgcmV0dXJuZWQgYnl0ZSwKLQkJLy8gdGhyb3cgZXhjZXB0aW9uIGlmIEVPRiByZWFjaGVkLgotCQlpZiAoYnl0ZUNoYXJBc0ludCA9PSAtMSkKLQkJCXRocm93IG5ldyBOb3RFbm91Z2hJbnB1dEZvckJPTUV4Y2VwdGlvbigidHlwaWNhbGx5IG5vdCBhbiBlcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAoYnl0ZSkgYnl0ZUNoYXJBc0ludDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIFRoZXJlIGlzIG5vIGRlZmF1bHQgZm9yIHRoaXMgY2FzZQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlc2V0QWxsKCkgewotCQlmTm9CT01Qb3NzaWJsZSA9IGZhbHNlOwotCQlmSW5wdXRTdHJlYW0gPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZJbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChJU3RvcmFnZSBpU3RvcmFnZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlzZXQobmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oaVN0b3JhZ2UuZ2V0Q29udGVudHMoKSwgQ29kZWRJTy5NQVhfQlVGX1NJWkUpKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldChSZWFkZXIgcmVhZGVyKSB7Ci0JCWlmIChyZWFkZXIgaW5zdGFuY2VvZiBCeXRlUmVhZGVyKSB7Ci0JCQlCeXRlUmVhZGVyIGJ5dGVSZWFkZXIgPSAoQnl0ZVJlYWRlcikgcmVhZGVyOwotCQkJZklucHV0U3RyZWFtID0gYnl0ZVJlYWRlci5mSW5wdXRTdHJlYW07Ci0JCX0gZWxzZSB7Ci0JCQlmTm9CT01Qb3NzaWJsZSA9IHRydWU7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL0NoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1MjUzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbjsKLQotCi1wdWJsaWMgY2xhc3MgQ2hhckNvbnZlcnNpb25FcnJvcldpdGhEZXRhaWwgZXh0ZW5kcyBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNoYXJzZXROYW1lOwotCi0JcHVibGljIENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICovCi0JcHVibGljIENoYXJDb252ZXJzaW9uRXJyb3JXaXRoRGV0YWlsKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlzdXBlcigpOwotCQlmQ2hhcnNldE5hbWUgPSBjaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZDaGFyc2V0TmFtZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENoYXJzZXROYW1lKCkgewotCQlyZXR1cm4gZkNoYXJzZXROYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI5NTY3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9uczsKLQotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwotCi0KLS8qKgotICogSW50ZW5kZWQgdG8gYmUgYSBtb3JlIHByZWNpc2UgZm9ybSBvZiB0aGUgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb24sIHdoZXJlCi0gKiBjaGFyYWN0ZXIgcG9zaXRpb24gYW5kIGF0dGVtcHRlZCBlbmNvZGluZyBjYW4gYmUgYXR0ZW1wdGVkLgotICovCi1wdWJsaWMgY2xhc3MgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsIGV4dGVuZHMgQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIGludCBmQ2hhclBvc2l0aW9uOwotCXByaXZhdGUgU3RyaW5nIGZEZXRlY3RlZENoYXJzZXROYW1lOwotCXByaXZhdGUgYm9vbGVhbiBmRXhjZWVkZWRNYXggPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmSmF2YUNoYXJzZXROYW1lOwotCXByaXZhdGUgaW50IGZNYXhCdWZmZXI7Ci0KLQkvKioKLQkgKiBEaXNhbGxvdyBkZWZhdWx0IGNvbnN0cnVjdG9yLiBJZiBhdHRlbXB0ZWRFbmNvZGluZyBhbmQgY2hhclBvc3Rpb24gY2FuCi0JICogbm90IGJlIHByb3ZpZGVkLCB1c2Ugb25lIG9mIGphdmEncyBNYWxmb3JtZWRFeGNlcHRpb24uCi0JICovCi0JcHJvdGVjdGVkIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbCgpIHsKLQkJLy8gTm90aGluZyB0byBkbwotCX0KLQotCXB1YmxpYyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoU3RyaW5nIGVuY29kaW5nTmFtZSwgaW50IGNoYXJQb3N0aW9uKSB7Ci0JCXRoaXMuZkphdmFDaGFyc2V0TmFtZSA9IGVuY29kaW5nTmFtZTsKLQkJdGhpcy5mRGV0ZWN0ZWRDaGFyc2V0TmFtZSA9IGVuY29kaW5nTmFtZTsKLQkJdGhpcy5mQ2hhclBvc2l0aW9uID0gY2hhclBvc3Rpb247Ci0JfQotCi0JcHVibGljIE1hbGZvcm1lZElucHV0RXhjZXB0aW9uV2l0aERldGFpbChTdHJpbmcgYXR0ZW1wdGVkSmF2YUVuY29kaW5nLCBTdHJpbmcgYXR0ZW1wdGVkSUFOQUVuY29kaW5nLCBpbnQgY2hhclBvc3Rpb24pIHsKLQkJdGhpcy5mSmF2YUNoYXJzZXROYW1lID0gYXR0ZW1wdGVkSmF2YUVuY29kaW5nOwotCQl0aGlzLmZEZXRlY3RlZENoYXJzZXROYW1lID0gYXR0ZW1wdGVkSUFOQUVuY29kaW5nOwotCQl0aGlzLmZDaGFyUG9zaXRpb24gPSBjaGFyUG9zdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBJZiBjaGFyUG9zaXRpb24gPSAtMSB0aGlzIGNvdWxkIGJlIGJlY2F1c2UgdGhlIGNoYXJhY3RlciBwb3NpdGlvbgotCSAqIGV4Y2VlZGVkIHRoZSBtYXhpbXVtIGJ1ZmZlciBzaXplLCBtYXhCdWZmZXIsIHRoZW4gZXhjZWVkZWRNYXggPSB0cnVlLgotCSAqLwotCXB1YmxpYyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoU3RyaW5nIGF0dGVtcHRlZEphdmFFbmNvZGluZywgU3RyaW5nIGF0dGVtcHRlZElBTkFFbmNvZGluZywgaW50IGNoYXJQb3N0aW9uLCBib29sZWFuIGV4Y2VlZGVkTWF4LCBpbnQgbWF4QnVmZmVyKSB7Ci0JCXRoaXMuZkphdmFDaGFyc2V0TmFtZSA9IGF0dGVtcHRlZEphdmFFbmNvZGluZzsKLQkJdGhpcy5mRGV0ZWN0ZWRDaGFyc2V0TmFtZSA9IGF0dGVtcHRlZElBTkFFbmNvZGluZzsKLQkJdGhpcy5mQ2hhclBvc2l0aW9uID0gY2hhclBvc3Rpb247Ci0JCXRoaXMuZkV4Y2VlZGVkTWF4ID0gZXhjZWVkZWRNYXg7Ci0JCXRoaXMuZk1heEJ1ZmZlciA9IG1heEJ1ZmZlcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRlbXB0ZWRJQU5BRW5jb2RpbmcoKSB7Ci0JCXJldHVybiBmRGV0ZWN0ZWRDaGFyc2V0TmFtZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRBdHRlbXB0ZWRKYXZhRW5jb2RpbmcoKSB7Ci0JCXJldHVybiBmSmF2YUNoYXJzZXROYW1lOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRDaGFyUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmQ2hhclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1heEJ1ZmZlci4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4QnVmZmVyKCkgewotCQlyZXR1cm4gZk1heEJ1ZmZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBleGNlZWRlZE1heC4KLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0V4Y2VlZGVkTWF4KCkgewotCQlyZXR1cm4gZkV4Y2VlZGVkTWF4OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL01hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZjlmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9leGNlcHRpb25zL01hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnM7Ci0KLQotcHVibGljIGNsYXNzIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwgZXh0ZW5kcyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwgewotCi0JLyoqCi0JICogRGVmYXVsdCA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JLyoqCi0JICogRGlzYWxsb3cgZGVmYXVsdCBjb25zdHJ1Y3Rvci4gSWYgYXR0ZW1wdGVkRW5jb2RpbmcgYW5kIGNoYXJQb3N0aW9uIGNhbgotCSAqIG5vdCBiZSBwcm92aWRlZCwgdXNlIHN1bi5pby5NYWxmb3JtZWRFeGNlcHRpb24uCi0JICovCi0JcHJpdmF0ZSBNYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsKCkgewotCQkvLyBkZWZhdWx0IGNvbnN0cnVjdG9yIGlzIGRpc2FsbG93ZWQsIHNpbmNlIGlmCi0JCS8vIGV4dHJhIGluZm8gY2FuIG5vdCBiZSBwcm92aWRlZCwgdGhlIHJlZ3VsYXIKLQkJLy8gTWFsZm9ybWVkIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duCi0JfQotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIE1hbGZvcm1lZE91dHB1dEV4Y2VwdGlvbldpdGhEZXRhaWwuCi0JICogCi0JICogQHBhcmFtIGF0dGVtcHRlZEphdmFFbmNvZGluZwotCSAqIEBwYXJhbSBhdHRlbXB0ZWRJQU5BRW5jb2RpbmcKLQkgKiBAcGFyYW0gY2hhclBvc3Rpb24KLQkgKi8KLQlwdWJsaWMgTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbChTdHJpbmcgYXR0ZW1wdGVkSmF2YUVuY29kaW5nLCBTdHJpbmcgYXR0ZW1wdGVkSUFOQUVuY29kaW5nLCBpbnQgY2hhclBvc3Rpb24pIHsKLQkJc3VwZXIoYXR0ZW1wdGVkSmF2YUVuY29kaW5nLCBhdHRlbXB0ZWRJQU5BRW5jb2RpbmcsIGNoYXJQb3N0aW9uKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2V4Y2VwdGlvbnMvVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RjNDBiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy1lbmNvZGluZy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZXhjZXB0aW9ucy9VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5leGNlcHRpb25zOwotCi1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotCi0KLS8qKgotICogVGhpcyBpcyBpbnRlbmRlZCBmb3Igc2FtZSBwdXJwb3NlIGFzIGl0IHN1cGVyIGNsYXNzLCBidXQgc2ltcGx5IHByb3ZpZGVzCi0gKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoYW4gdGhlIG5hbWUgaW4gZXJyb3IuIFRoaXMgaXMgZXNwZWNpYWxseSB1c2VmdWwKLSAqIGZvciAiVUlzIiB3aGljaCBjYW4gcHJlc2VudCB1c2VycyB3aXRoIHRoZSBlcnJvciwgYW5kIHRoZQotICogImFwcHJvcHJpYXRlRGVmYXVsdCIgdGhhdCBjYW4gYmUgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIGlucHV0LgotICovCi1wdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbCBleHRlbmRzIFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0JcHJpdmF0ZSBFbmNvZGluZ01lbWVudG8gZkVuY29kaW5nTWVtZW50aW87Ci0KLQlwdWJsaWMgVW5zdXBwb3J0ZWRDaGFyc2V0RXhjZXB0aW9uV2l0aERldGFpbChFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRoaXMoZW5jb2RpbmdNZW1lbnRvLmdldERldGVjdGVkQ2hhcnNldE5hbWUoKSk7Ci0JCWZFbmNvZGluZ01lbWVudGlvID0gZW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCXByb3RlY3RlZCBVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb25XaXRoRGV0YWlsKFN0cmluZyBjaGFyc2V0TmFtZSkgewotCQlzdXBlcihjaGFyc2V0TmFtZSk7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRpbzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvSUZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9JRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5YzQ3ODAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9JRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLQotLyoqCi0gKiBTY2FubmVycyBmb3IgdGhlIG1haW4gVGFzayBTY2FubmVyLiBTY2FubmVycyBtYXkgYmUgY29udHJpYnV0ZWQgdXNpbmcgdGhlCi0gKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIgZXh0ZW5zaW9uIHBvaW50LiBGb3IgcmVzb3VyY2VzIGFuZAotICogcmVzb3VyY2UgZGVsdGFzIHdpdGggbWF0Y2hpbmcgY29udGVudCB0eXBlcywgdGhlIG1haW4gc2Nhbm5lciB3aWxsIGZpcnN0Ci0gKiBjYWxsIHRoZSBzdGFydHVwKCkgbWV0aG9kLCBzY2FuKCksIGFuZCB0aGVuIHNodXRkb3duKCkgaW4gc2VxdWVuY2UuIFNjYW5uZXIKLSAqIGluc3RhbmNlcyB3aWxsIGJlIHJldXNlZCBhY3Jvc3MgcHJvamVjdHMgYnV0IGFyZSBub3Qgc2hhcmVkIHBlciBjb250ZW50Ci0gKiB0eXBlLiBTY2FubmVycyBzaG91bGQgbm90IGhvbGQgb24gdG8gcmVmZXJlbmNlcyB0byBtb2RlbHMgb3IgcmVzb3VyY2VzCi0gKiBhZnRlciBzaHV0ZG93bigpIGFuZCBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byBsZWFrIG1lbW9yeSBvciByZXNvdXJjZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUZpbGVUYXNrU2Nhbm5lciB7Ci0JLyoqCi0JICogTWFya2VyIHR5cGUgSUQgb2YgdGFzayBtYXJrZXJzIHRoYXQgYXJlIGNyZWF0ZWQsIGFsbCBzY2FubmVycyBhcmUKLQkgKiBleHBlY3RlZCB0byB1c2UgdGhpcyB0eXBlIG9yIHN1YnR5cGVzCi0JICovCi0JU3RyaW5nIFRBU0tfTUFSS0VSX0lEID0gU1NFQ29yZVBsdWdpbi5JRCArICIudGFzayI7IC8vJE5PTi1OTFMtMSQ7Ci0KLQkvKioKLQkgKiBSZXF1ZXN0cyB0aGF0IHRoZSBsaXN0IG9mIGF1dG9tYXRpY2FsbHkgZGlzY292ZXJlZCB0YXNrcyBmb3IgdGhlIGdpdmVuCi0JICogZmlsZSBiZSB1cGRhdGVkLiBPbmNlIGNvbXBsZXRlZCwgdGhlIGxpc3Qgb2YgdGFza3Mgc2hvdWxkIGNvcnJlc3BvbmQKLQkgKiBleGFjdGx5IHRvIHRoZSBmaWxlJ3MgY29udGVudHMuCi0JICogCi0JICogQHBhcmFtIGZpbGUgLQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gYmUgc2Nhbm5lZAotCSAqIEBwYXJhbSB0YXNrVGFncyAtCi0JICogICAgICAgICAgICB0aGUgbGlzdCBvZiB0YXNrIHRhZ3MgZm9yIHdoaWNoIHRvIHNjYW4KLQkgKiBAcGFyYW0gbW9uaXRvciAtCi0JICogICAgICAgICAgICBhIHByb2dyZXNzIG1vbml0b3IKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIG1hcHMgY29udGFpbmluZyB0aGUgYXR0cmlidXRlcyBmb3IgdGFzayBtYXJrZXJzIHRvCi0JICogICAgICAgICBiZSBjcmVhdGVkCi0JICovCi0JTWFwW10gc2NhbihJRmlsZSBmaWxlLCBUYXNrVGFnW10gdGFza1RhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcik7Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB0aGUgc2Nhbm5lciB0aGF0IHNjYW5uaW5nIGlzIGRvbmUgZm9yIG5vdy4gUmVzb3VyY2VzIGhlbGQgZnJvbQotCSAqIHN0YXJ0dXAgc2hvdWxkIG5vdyBiZSByZWxlYXNlZC4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvamVjdCAtCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdCB0aGF0IHdhcyBqdXN0IHNjYW5uZWQKLQkgKi8KLQl2b2lkIHNodXRkb3duKElQcm9qZWN0IHByb2plY3QpOwotCi0JLyoqCi0JICogTm90aWZpZXMgdGhlIHNjYW5uZXIgdGhhdCBhIHNlcXVlbmNlIG9mIHNjYW5zIGlzIGFib3V0IHRvIGJlIHJlcXVlc3RlZC4KLQkgKiBJZGVhbGx5IHRoZSB0aW1lIHRvIGxvYWQgcHJlZmVyZW5jZXMgYW5kIHBlcmZvcm0gYW55IGV4cGVuc2l2ZQotCSAqIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnaXZlbiBwcm9qZWN0LgotCSAqIAotCSAqIEBwYXJhbSBwcm9qZWN0IC0KLQkgKiAgICAgICAgICAgIHRoZSBwcm9qZWN0IHRoYXQgaXMgYWJvdXQgdG8gYmUgc2Nhbm5lZAotCSAqIAotCSAqLwotCXZvaWQgc3RhcnR1cChJUHJvamVjdCBwcm9qZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGFza3MvVGFza1RhZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9UYXNrVGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYjcyNTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90YXNrcy9UYXNrVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci0KLS8qKgotICogU2ltcGxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZXMgdGhhdCBtYWtlIHVwIGEgVGFzayBUYWcKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRhc2tUYWcgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJJT1JJVFlfSElHSCA9IElNYXJrZXIuUFJJT1JJVFlfSElHSDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9MT1cgPSBJTWFya2VyLlBSSU9SSVRZX0xPVzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWV9OT1JNQUwgPSBJTWFya2VyLlBSSU9SSVRZX05PUk1BTDsKLQotCS8qKgotCSAqIHRoaXMgdGFzayB0YWcncyBwcmlvcml0eQotCSAqLwotCXByaXZhdGUgaW50IGZQcmlvcml0eSA9IFBSSU9SSVRZX05PUk1BTDsKLQkKLQkvKioKLQkgKiB0aGlzIHRhc2sgdGFnJ3MgInRhZ2dpbmciIHRleHQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmVGFnID0gbnVsbDsKLQotCXB1YmxpYyBUYXNrVGFnKFN0cmluZyB0YWcsIGludCBwcmlvcml0eSkgewotCQlzdXBlcigpOwotCQlmVGFnID0gdGFnOwotCQlmUHJpb3JpdHkgPSBwcmlvcml0eTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFByaW9yaXR5KCkgewotCQlyZXR1cm4gZlByaW9yaXR5OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gZlRhZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gZ2V0VGFnKCkgKyAiOiIgKyBnZXRQcmlvcml0eSgpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9GaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9GaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzBmMThjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBjbGFzcyBTY2FubmVySW5mbyB7Ci0JCVN0cmluZyBmSWQ7Ci0JCUlGaWxlVGFza1NjYW5uZXIgZlNjYW5uZXI7Ci0KLQkJU2Nhbm5lckluZm8oU3RyaW5nIGlkLCBJRmlsZVRhc2tTY2FubmVyIHNjYW5uZXIpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmSWQgPSBpZDsKLQkJCWZTY2FubmVyID0gc2Nhbm5lcjsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gb2JqIGluc3RhbmNlb2YgU2Nhbm5lckluZm8gJiYgZklkLmVxdWFscygoKFNjYW5uZXJJbmZvKSBvYmopLmZJZCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJcmV0dXJuIGZJZDsKLQkJfQotCi0JCXB1YmxpYyBJRmlsZVRhc2tTY2FubmVyIGdldFNjYW5uZXIoKSB7Ci0JCQlyZXR1cm4gZlNjYW5uZXI7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlciBfaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBGaWxlVGFza1NjYW5uZXJSZWdpc3RyeVJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlfaW5zdGFuY2UgPSBuZXcgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gX2luc3RhbmNlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgU3RyaW5nIEFUVF9DT05URU5UX1RZUEVTID0gImNvbnRlbnRUeXBlSWRzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBmU2Nhbm5lckVsZW1lbnRzOwotCi0JLy8gYSBtYXBwaW5nIGZyb20gY29udGVudCB0eXBlcyB0byBTY2FubmVySW5mbyBpbnN0YW5jZXMKLQlwcml2YXRlIE1hcCBmU2Nhbm5lckluZm9zID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIE5BTUVfU0NBTk5FUiA9ICJzY2FubmVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBTdHJpbmcgU0NBTk5FUl9FWFRFTlNJT05fUE9JTlRfSUQgPSBTU0VDb3JlUGx1Z2luLklEICsgIi50YXNrc2Nhbm5lciI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JSUZpbGVUYXNrU2Nhbm5lcltdIGdldEZpbGVUYXNrU2Nhbm5lcnMoSUNvbnRlbnRUeXBlW10gY29udGVudFR5cGVzKSB7Ci0JCWlmIChmU2Nhbm5lckVsZW1lbnRzID09IG51bGwpIHsKLQkJCXJlYWRSZWdpc3RyeSgpOwotCQl9Ci0KLQkJTGlzdCBzY2FubmVySW5mb3MgPSBuZXcgQXJyYXlMaXN0KDEpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTY2FubmVySW5mb1tdIHNjYW5uZXJJbmZvc0ZvckNvbnRlbnRUeXBlID0gKFNjYW5uZXJJbmZvW10pIGZTY2FubmVySW5mb3MuZ2V0KGNvbnRlbnRUeXBlc1tpXS5nZXRJZCgpKTsKLQkJCWlmIChzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQkJc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGUgPSBsb2FkU2Nhbm5lcnMoY29udGVudFR5cGVzW2ldKTsKLQkJCX0KLQkJCS8vIG9ubHkgYWRkIG5vbi1kdXBsaWNhdGUgc2Nhbm5lcnMKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgc2Nhbm5lckluZm9zRm9yQ29udGVudFR5cGUubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAoIXNjYW5uZXJJbmZvcy5jb250YWlucyhzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZVtqXSkpIHsKLQkJCQkJc2Nhbm5lckluZm9zLmFkZChzY2FubmVySW5mb3NGb3JDb250ZW50VHlwZVtqXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCUlGaWxlVGFza1NjYW5uZXJbXSBzY2FubmVycyA9IG5ldyBJRmlsZVRhc2tTY2FubmVyW3NjYW5uZXJJbmZvcy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNjYW5uZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlzY2FubmVyc1tpXSA9ICgoU2Nhbm5lckluZm8pIHNjYW5uZXJJbmZvcy5nZXQoaSkpLmdldFNjYW5uZXIoKTsKLQkJfQotCQlyZXR1cm4gc2Nhbm5lcnM7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFN1cHBvcnRlZENvbnRlbnRUeXBlSWRzKCkgewotCQlpZiAoZlNjYW5uZXJFbGVtZW50cyA9PSBudWxsKSB7Ci0JCQlyZWFkUmVnaXN0cnkoKTsKLQkJfQotCi0JCS8vIGZpbmQgdGhlIHJlbGV2YW50IGV4dGVuc2lvbnMKLQkJTGlzdCB0eXBlcyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIHNjYW5uZXJFbGVtZW50cyA9IGZTY2FubmVyRWxlbWVudHM7Ci0JCWZvciAoaW50IGogPSAwOyBqIDwgc2Nhbm5lckVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQlpZiAoIXNjYW5uZXJFbGVtZW50c1tqXS5nZXROYW1lKCkuZXF1YWxzKE5BTUVfU0NBTk5FUikpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmdbXSBjb250ZW50VHlwZUlkcyA9IFN0cmluZ1V0aWxzLnVucGFjayhzY2FubmVyRWxlbWVudHNbal0uZ2V0QXR0cmlidXRlKEFUVF9DT05URU5UX1RZUEVTKSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRUeXBlSWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKCF0eXBlcy5jb250YWlucyhjb250ZW50VHlwZUlkc1tpXSkpIHsKLQkJCQkJdHlwZXMuYWRkKGNvbnRlbnRUeXBlSWRzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gKFN0cmluZ1tdKSB0eXBlcy50b0FycmF5KG5ldyBTdHJpbmdbdHlwZXMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBTY2FubmVySW5mb1tdIGxvYWRTY2FubmVycyhJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCVNjYW5uZXJJbmZvW10gc2Nhbm5lckluZm9zID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZGVsZWdhdGVFbGVtZW50cyA9IGZTY2FubmVyRWxlbWVudHM7Ci0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGVNYW5hZ2VyIGNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWxlZ2F0ZUVsZW1lbnRzLmxlbmd0aDsgaisrKSB7Ci0JCQkJaWYgKCFkZWxlZ2F0ZUVsZW1lbnRzW2pdLmdldE5hbWUoKS5lcXVhbHMoTkFNRV9TQ0FOTkVSKSkKLQkJCQkJY29udGludWU7Ci0JCQkJU3RyaW5nW10gc3VwcG9ydGVkQ29udGVudFR5cGVJZHMgPSBTdHJpbmdVdGlscy51bnBhY2soZGVsZWdhdGVFbGVtZW50c1tqXS5nZXRBdHRyaWJ1dGUoQVRUX0NPTlRFTlRfVFlQRVMpKTsKLQkJCQlJQ29udGVudFR5cGVbXSBzdXBwb3J0ZWRDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW3N1cHBvcnRlZENvbnRlbnRUeXBlSWRzLmxlbmd0aF07Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzdXBwb3J0ZWRDb250ZW50VHlwZUlkcy5sZW5ndGg7IGsrKykgewotCQkJCQlzdXBwb3J0ZWRDb250ZW50VHlwZXNba10gPSBjb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoc3VwcG9ydGVkQ29udGVudFR5cGVJZHNba10udHJpbSgpKTsKLQkJCQl9Ci0JCQkJZm9yIChpbnQgayA9IDA7IGsgPCBzdXBwb3J0ZWRDb250ZW50VHlwZUlkcy5sZW5ndGg7IGsrKykgewotCQkJCQkvLyBhbGxvdyBzdWJ0eXBlcyB0byBiZSByZXR1cm5lZCBhcyB3ZWxsCi0JCQkJCWlmIChzdXBwb3J0ZWRDb250ZW50VHlwZXNba10gIT0gbnVsbCAmJiBjb250ZW50VHlwZS5pc0tpbmRPZihzdXBwb3J0ZWRDb250ZW50VHlwZXNba10pKSB7Ci0JCQkJCQllbGVtZW50cy5hZGQoZGVsZWdhdGVFbGVtZW50c1tqXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpbnN0YW50aWF0ZSBhbmQgc2F2ZSB0aGUgc2Nhbm5lcnMKLQkJCUxpc3Qgc2Nhbm5lckluZm9MaXN0ID0gbmV3IEFycmF5TGlzdChlbGVtZW50cy5zaXplKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5zaXplKCk7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCUlGaWxlVGFza1NjYW5uZXIgc2Nhbm5lciA9IChJRmlsZVRhc2tTY2FubmVyKSAoKElDb25maWd1cmF0aW9uRWxlbWVudCkgZWxlbWVudHMuZ2V0KGkpKS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKEFUVF9DTEFTUyk7Ci0JCQkJCWlmIChzY2FubmVyICE9IG51bGwpIHsKLQkJCQkJCXNjYW5uZXJJbmZvTGlzdC5hZGQobmV3IFNjYW5uZXJJbmZvKCgoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBlbGVtZW50cy5nZXQoaSkpLmdldEF0dHJpYnV0ZShBVFRfSUQpLCBzY2FubmVyKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJOb24tZmF0YWwgZXhjZXB0aW9uIGNyZWF0aW5nIHRhc2sgc2Nhbm5lciBmb3IgIiArIGNvbnRlbnRUeXBlLmdldElkKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJc2Nhbm5lckluZm9zID0gKFNjYW5uZXJJbmZvW10pIHNjYW5uZXJJbmZvTGlzdC50b0FycmF5KG5ldyBTY2FubmVySW5mb1tzY2FubmVySW5mb0xpc3Quc2l6ZSgpXSk7Ci0JCQlmU2Nhbm5lckluZm9zLnB1dChjb250ZW50VHlwZS5nZXRJZCgpLCBzY2FubmVySW5mb3MpOwotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU1JFR0lTVFJZKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGVkICIgKyBzY2FubmVySW5mb3MubGVuZ3RoICsgIiB0YXNrIHNjYW5uZXIgZm9yICIgKyBjb250ZW50VHlwZS5nZXRJZCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHNjYW5uZXJJbmZvczsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVhZFJlZ2lzdHJ5KCkgewotCQlmU2Nhbm5lckluZm9zID0gbmV3IEhhc2hNYXAoKTsKLQkJLy8gSnVzdCByZW1lbWJlciB0aGUgZWxlbWVudHMsIHNvIHBsdWdpbnMgZG9uJ3QgaGF2ZSB0byBiZSBhY3RpdmF0ZWQsCi0JCS8vIHVubGVzcyBleHRlbnNpb24gYXR0cmlidXRlcyBtYXRjaCB0aG9zZSBvZiBpbnRlcmVzdAotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLmdldEV4dGVuc2lvblBvaW50KFNDQU5ORVJfRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCWZTY2FubmVyRWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTdlMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9TdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3M7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcmFjdGVyQ29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUXVhbGlmaWVkTmFtZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudERlc2NyaXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuSUZpbGVUYXNrU2Nhbm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGFza3MuVGFza1RhZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0vKioKLSAqIEEgZGVsZWdhdGUgdG8gY3JlYXRlIElNYXJrZXIuVEFTS3MgZm9yICJ0b2RvcyIgYW5kIHNpbWlsaWFyIGNvbW1lbnRzLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciBpbXBsZW1lbnRzIElGaWxlVGFza1NjYW5uZXIgewotCS8vIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMgZm9yIHRoZSBuZXcgdGFza3MgZm9yIHRoZSBjdXJyZW50IGZpbGUKLQlwcm90ZWN0ZWQgTGlzdCBmTmV3TWFya2VyQXR0cmlidXRlTWFwcyA9IG51bGw7Ci0KLQlMaXN0IG9sZE1hcmtlcnMgPSBudWxsOwotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRmlsZVRhc2tTY2FubmVyKCkgewotCQlzdXBlcigpOwotCQlmTmV3TWFya2VyQXR0cmlidXRlTWFwcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBpbnN0YW5jZSBjcmVhdGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZXMgd2l0aCB3aGljaCBhIG5ld2x5IGNyZWF0ZWQgbWFya2VyIHdpbGwgYmUKLQkgKiBpbml0aWFsaXplZC4gTW9kaWZpZWQgZnJvbSB0aGUgbWV0aG9kIGluIE1hcmtlclJ1bGVyQWN0aW9uCi0JICogCi0JICogQHJldHVybiB0aGUgaW5pdGlhbCBtYXJrZXIgYXR0cmlidXRlcwotCSAqLwotCXByb3RlY3RlZCBNYXAgY3JlYXRlSW5pdGlhbE1hcmtlckF0dHJpYnV0ZXMoU3RyaW5nIHRleHQsIGludCBkb2N1bWVudExpbmUsIGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCwgaW50IHByaW9yaXR5KSB7Ci0JCU1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoNik7Ci0JCS8vIG1hcmtlciBsaW5lIG51bWJlcnMgYXJlIDEtYmFzZWQKLQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5MSU5FX05VTUJFUiwgbmV3IEludGVnZXIoZG9jdW1lbnRMaW5lICsgMSkpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlRBU0ssIElGaWxlVGFza1NjYW5uZXIuVEFTS19NQVJLRVJfSUQpOwotCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLkNIQVJfU1RBUlQsIG5ldyBJbnRlZ2VyKHN0YXJ0T2Zmc2V0KSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuQ0hBUl9FTkQsIG5ldyBJbnRlZ2VyKHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoKSk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuTUVTU0FHRSwgdGV4dCk7Ci0JCWF0dHJpYnV0ZXMucHV0KElNYXJrZXIuVVNFUl9FRElUQUJMRSwgQm9vbGVhbi5UUlVFKTsKLQkJYXR0cmlidXRlcy5wdXQoIm9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldCIsIG5ldyBTdHJpbmdbXXsiIn0pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlzd2l0Y2ggKHByaW9yaXR5KSB7Ci0JCQljYXNlIElNYXJrZXIuUFJJT1JJVFlfSElHSCA6IHsKLQkJCQlhdHRyaWJ1dGVzLnB1dChJTWFya2VyLlBSSU9SSVRZLCBuZXcgSW50ZWdlcihJTWFya2VyLlBSSU9SSVRZX0hJR0gpKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgSU1hcmtlci5QUklPUklUWV9MT1cgOiB7Ci0JCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9MT1cpKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOiB7Ci0JCQkJYXR0cmlidXRlcy5wdXQoSU1hcmtlci5QUklPUklUWSwgbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9OT1JNQUwpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGRldGVjdENoYXJzZXQoSUZpbGUgZmlsZSkgewotCQlpZiAoZmlsZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gb3B0aW1pemVkIGRlc2NyaXB0aW9uIGxvb2t1cCwgbWlnaHQgbm90IHN1Y2NlZWQKLQkJCQlkID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQlpZiAoZCAhPSBudWxsKQotCQkJCQlyZXR1cm4gZC5nZXRDaGFyc2V0KCk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJLyoKLQkJCQkgKiBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlIHR5cGUKLQkJCQkgKiBjaGVjayBhYm92ZQotCQkJCSAqLwotCQkJfQotCQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQljb250ZW50cyA9IGZpbGUuZ2V0Q29udGVudHMoKTsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0RGVzY3JpcHRpb25Gb3IoY29udGVudHMsIGZpbGUuZ2V0TmFtZSgpLCBuZXcgUXVhbGlmaWVkTmFtZVtde0lDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVH0pOwotCQkJCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkZXNjcmlwdGlvbi5nZXRDaGFyc2V0KCk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyB3aWxsIHRyeSB0byBjbGVhbnVwIGluIGZpbmFsbHkKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGNvbnRlbnRzICE9IG51bGwpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBub3Qgc3VyZSBob3cgdG8gcmVjb3ZlciBhdCB0aGlzIHBvaW50Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRFbmNvZGluZygpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEBwYXJhbSBkb2N1bWVudFJlZ2lvbgotCSAqIEBwYXJhbSBjb21tZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmluZFRhc2tzKElEb2N1bWVudCBkb2N1bWVudCwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb21tZW50KSB7Ci0JCWlmIChpc0NvbW1lbnRSZWdpb24oZG9jdW1lbnRSZWdpb24sIGNvbW1lbnQpKSB7Ci0JCQlpbnQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21tZW50KTsKLQkJCWludCBlbmRPZmZzZXQgPSBkb2N1bWVudFJlZ2lvbi5nZXRUZXh0RW5kT2Zmc2V0KGNvbW1lbnQpOwotCQkJdHJ5IHsKLQkJCQlpbnQgc3RhcnRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KHN0YXJ0T2Zmc2V0KTsKLQkJCQlpbnQgZW5kTGluZSA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldChlbmRPZmZzZXQpOwotCQkJCWZvciAoaW50IGxpbmVOdW1iZXIgPSBzdGFydExpbmU7IGxpbmVOdW1iZXIgPD0gZW5kTGluZTsgbGluZU51bWJlcisrKSB7Ci0JCQkJCUlSZWdpb24gbGluZSA9IGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbihsaW5lTnVtYmVyKTsKLQkJCQkJaW50IGJlZ2luID0gTWF0aC5tYXgoc3RhcnRPZmZzZXQsIGxpbmUuZ2V0T2Zmc2V0KCkpOwotCQkJCQlpbnQgZW5kID0gTWF0aC5taW4oZW5kT2Zmc2V0LCBsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSk7Ci0JCQkJCWludCBsZW5ndGggPSBlbmQgLSBiZWdpbjsKLQotCQkJCQkvKiBYWFg6IFRoaXMgZ2VuZXJhdGVzIGEgbG90IG9mIGdhcmJhZ2Ugb2JqZWN0cyAqLwotCi0JCQkJCVN0cmluZyBjb21tZW50ZWRUZXh0ID0gZ2V0Q29tbWVudGVkVGV4dChkb2N1bWVudCwgYmVnaW4sIGxlbmd0aCk7Ci0JCQkJCVN0cmluZyBjb21wYXJpc29uVGV4dCA9IGNvbW1lbnRlZFRleHQudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFza1RhZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWludCB0YWdJbmRleCA9IGNvbXBhcmlzb25UZXh0LmluZGV4T2YodGFza1RhZ3NbaV0uZ2V0VGFnKCkudG9Mb3dlckNhc2UoTG9jYWxlLkVOR0xJU0gpKTsKLQkJCQkJCWlmICh0YWdJbmRleCA+PSAwKSB7Ci0JCQkJCQkJU3RyaW5nIG1hcmtlckRlc2NyaXB0aW9uID0gY29tbWVudGVkVGV4dC5zdWJzdHJpbmcodGFnSW5kZXgpOwotCQkJCQkJCWludCBtYXJrZXJPZmZzZXQgPSBiZWdpbiArIHRhZ0luZGV4OwotCQkJCQkJCWludCBtYXJrZXJMZW5ndGggPSBlbmQgLSBtYXJrZXJPZmZzZXQ7Ci0JCQkJCQkJZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMuYWRkKGNyZWF0ZUluaXRpYWxNYXJrZXJBdHRyaWJ1dGVzKG1hcmtlckRlc2NyaXB0aW9uLCBsaW5lTnVtYmVyLCBtYXJrZXJPZmZzZXQsIG1hcmtlckxlbmd0aCwgdGFza1RhZ3NbaV0uZ2V0UHJpb3JpdHkoKSkpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbmRUYXNrcyhJRmlsZSBmaWxlLCBmaW5hbCBUYXNrVGFnW10gdGFza1RhZ3MsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQl0cnkgewotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRIYW5kbGVyRm9yKGZpbGUpOwotCi0JCQkvLyByZWNvcmRzIGlmIHRoZSBvcHRpbWl6ZWQgc3RyZWFtaXNoIHBhcnNlIHdhcyBwb3NzaWJsZQotCQkJYm9vbGVhbiBkaWRTdHJlYW1QYXJzZSA9IGZhbHNlOwotCQkJZmluYWwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCQkJZmluYWwgSUVuY29kZWREb2N1bWVudCBkZWZhdWx0RG9jdW1lbnQgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQlpZiAoZGVmYXVsdERvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVJlZ2lvblBhcnNlciBwYXJzZXIgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRlZmF1bHREb2N1bWVudCkuZ2V0UGFyc2VyKCk7Ci0JCQkJaWYgKHBhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgewotCQkJCQlkaWRTdHJlYW1QYXJzZSA9IHRydWU7Ci0JCQkJCVN0cmluZyBjaGFyc2V0ID0gZGV0ZWN0Q2hhcnNldChmaWxlKTsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGRvY3VtZW50UGFyc2VyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgcGFyc2VyOwotCQkJCQlmaW5hbCBJRG9jdW1lbnQgdGV4dERvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQkJCXNldERvY3VtZW50Q29udGVudCh0ZXh0RG9jdW1lbnQsIGZpbGUuZ2V0Q29udGVudHModHJ1ZSksIGNoYXJzZXQpOwotCQkJCQlkb2N1bWVudFBhcnNlci5yZXNldChuZXcgRG9jdW1lbnRSZWFkZXIodGV4dERvY3VtZW50KSk7Ci0JCQkJCWRvY3VtZW50UGFyc2VyLmFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIobmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoKSB7Ci0JCQkJCQlwdWJsaWMgdm9pZCBub2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHJlZ2lvbnMuc2l6ZSgpOyBqKyspIHsKLQkJCQkJCQkJSVRleHRSZWdpb24gY29tbWVudCA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJCQkJCQlmaW5kVGFza3ModGV4dERvY3VtZW50LCB0YXNrVGFncywgZG9jdW1lbnRSZWdpb24sIGNvbW1lbnQpOwotCQkJCQkJCX0KLQkJCQkJCQkvLyBkaXNjb25uZWN0IHRoZSBkb2N1bWVudCByZWdpb25zCi0JCQkJCQkJaWYgKGRvY3VtZW50UmVnaW9uLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgewotCQkJCQkJCQlkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpLnNldFByZXZpb3VzKG51bGwpOwotCQkJCQkJCQlkb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpLnNldE5leHQobnVsbCk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChwcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCQkJCXRleHREb2N1bWVudC5zZXQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlwdWJsaWMgdm9pZCByZXNldE5vZGVzKCkgewotCQkJCQkJfQotCQkJCQl9KTsKLQkJCQkJZG9jdW1lbnRQYXJzZXIuZ2V0RG9jdW1lbnRSZWdpb25zKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKCFkaWRTdHJlYW1QYXJzZSkgewotCQkJCS8vIFVzZSBhIFN0cnVjdHVyZWREb2N1bWVudAotCQkJCUlFbmNvZGVkRG9jdW1lbnQgZG9jdW1lbnQgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGUpOwotCQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCXdoaWxlIChkb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVnaW9ucy5zaXplKCk7IGorKykgewotCQkJCQkJCUlUZXh0UmVnaW9uIGNvbW1lbnQgPSByZWdpb25zLmdldChqKTsKLQkJCQkJCQlmaW5kVGFza3MoZG9jdW1lbnQsIHRhc2tUYWdzLCBkb2N1bWVudFJlZ2lvbiwgY29tbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCQlkb2N1bWVudFJlZ2lvbiA9IGRvY3VtZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gd2l0aCAiICsgZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKENoYXJhY3RlckNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiU3RydWN0dXJlZEZpbGVUYXNrU2Nhbm5lciBlbmNvdW50ZXJlZCBDaGFyYWN0ZXJDb2RpbmdFeGNlcHRpb24gcmVhZGluZyAiICsgZmlsZS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdpdGggIiArIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21tZW50ZWRUZXh0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZG9jdW1lbnQuZ2V0KGJlZ2luLCBsZW5ndGgpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGlzQ29tbWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiwgSVRleHRSZWdpb24gdGV4dFJlZ2lvbik7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIE1hcFtdIHNjYW4oSUZpbGUgZmlsZSwgVGFza1RhZ1tdIHRhc2tUYWdzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMuY2xlYXIoKTsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpIHx8ICFzaG91bGRTY2FuKGZpbGUpKSB7Ci0JCQlyZXR1cm4gbmV3IE1hcFswXTsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUEVSRikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAodGFza1RhZ3MubGVuZ3RoID4gMCkgewotCQkJZmluZFRhc2tzKGZpbGUsIHRhc2tUYWdzLCBtb25pdG9yKTsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUEVSRikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIGZvciAiICsgZmlsZS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIChNYXBbXSkgZk5ld01hcmtlckF0dHJpYnV0ZU1hcHMudG9BcnJheShuZXcgTWFwW2ZOZXdNYXJrZXJBdHRyaWJ1dGVNYXBzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50IGNvbnRlbnQgZnJvbSB0aGlzIHN0cmVhbSBhbmQgY2xvc2VzIHRoZSBzdHJlYW0KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudENvbnRlbnQoSURvY3VtZW50IGRvY3VtZW50LCBJbnB1dFN0cmVhbSBjb250ZW50U3RyZWFtLCBTdHJpbmcgY2hhcnNldCkgewotCQlSZWFkZXIgaW4gPSBudWxsOwotCQl0cnkgewotCQkJaW4gPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbnRlbnRTdHJlYW0sIGNoYXJzZXQpLCAyMDQ4KTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKDIwNDgpOwotCQkJY2hhcltdIHJlYWRCdWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKLQkJCWludCBuID0gaW4ucmVhZChyZWFkQnVmZmVyKTsKLQkJCXdoaWxlIChuID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQocmVhZEJ1ZmZlciwgMCwgbik7Ci0JCQkJbiA9IGluLnJlYWQocmVhZEJ1ZmZlcik7Ci0JCQl9Ci0JCQlkb2N1bWVudC5zZXQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoaW4gIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWluLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiB4KSB7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JYm9vbGVhbiBzaG91bGRTY2FuKElSZXNvdXJjZSByKSB7Ci0JCS8vIHNraXAgImRvdCIgZmlsZXMKLQkJU3RyaW5nIHMgPSByLmdldE5hbWUoKTsKLQkJcmV0dXJuIHMubGVuZ3RoKCkgPT0gMCB8fCBzLmNoYXJBdCgwKSAhPSAnLic7Ci0JfQotCi0JcHVibGljIHZvaWQgc2h1dGRvd24oSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcyArICIgc2h1dGRvd24gZm9yICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHN0YXJ0dXAoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4odGhpcyArICIgc3RhcnR1cCBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NQRVJGKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NQRVJGKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMgbG9hZGluZyBwcmVmcyBmb3IgIiArIHByb2plY3QuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ0pvYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdKb2IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ4NjdhZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Rhc2tzL1Rhc2tTY2FubmluZ0pvYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2VEZWx0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdWJQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBRdWV1ZWluZyBKb2IgZm9yIHByb2Nlc3NpbmcgZGVsdGFzIGFuZCBwcm9qZWN0cy4KLSAqLwotY2xhc3MgVGFza1NjYW5uaW5nSm9iIGV4dGVuZHMgSm9iIHsKLQlzdGF0aWMgZmluYWwgaW50IEpPQl9ERUxBWV9ERUxUQSA9IDUwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSk9CX0RFTEFZX1BST0pFQ1QgPSAxMDAwOwotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVEID0gInRhc2stdGFnLXByb2plY3RzLWFscmVhZHktc2Nhbm5lZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIExpc3QgZlF1ZXVlID0gbnVsbDsKLQotCS8qKiBzeW1ib2xpYyBuYW1lIGZvciBPU0dJIGZyYW1ld29yayAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9TR0lfRlJBTUVXT1JLX0lEID0gIm9yZy5lY2xpcHNlLm9zZ2kiOyAvLyROT04tTkxTLTEkCi0KLQlUYXNrU2Nhbm5pbmdKb2IoKSB7Ci0JCXN1cGVyKFNTRUNvcmVNZXNzYWdlcy5UYXNrU2Nhbm5lcl8wKTsKLQkJZlF1ZXVlID0gbmV3IEFycmF5TGlzdCgpOwotCQlzZXRQcmlvcml0eShKb2IuREVDT1JBVEUpOwotCQlzZXRTeXN0ZW0oZmFsc2UpOwotCi0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0RGVmYXVsdChUQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQsICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIGFkZERlbHRhKElSZXNvdXJjZURlbHRhIGRlbHRhKSB7Ci0JCWZRdWV1ZS5hZGQoZGVsdGEpOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKSB7Ci0JCQlTdHJpbmcga2luZCA9IG51bGw7Ci0JCQlzd2l0Y2ggKGRlbHRhLmdldEtpbmQoKSkgewotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuQURERUQgOgotCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuQURERURdIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLkNIQU5HRUQgOgotCQkJCQlraW5kID0gIiBbSVJlc291cmNlRGVsdGEuQ0hBTkdFRF0iOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSVJlc291cmNlRGVsdGEuUkVNT1ZFRCA6Ci0JCQkJCWtpbmQgPSAiIFtJUmVzb3VyY2VEZWx0YS5SRU1PVkVEXSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJUmVzb3VyY2VEZWx0YS5BRERFRF9QSEFOVE9NIDoKLQkJCQkJa2luZCA9ICIgW0lSZXNvdXJjZURlbHRhLkFEREVEX1BIQU5UT01dIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElSZXNvdXJjZURlbHRhLlJFTU9WRURfUEhBTlRPTSA6Ci0JCQkJCWtpbmQgPSAiIFtJUmVzb3VyY2VEZWx0YS5SRU1PVkVEX1BIQU5UT01dIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCX0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQWRkaW5nIGRlbHRhICIgKyBkZWx0YS5nZXRGdWxsUGF0aCgpICsga2luZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzY2hlZHVsZShKT0JfREVMQVlfREVMVEEpOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIGFkZFByb2plY3QoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoaXNFbmFibGVkUHJvamVjdChwcm9qZWN0KSkgewotCQkJZlF1ZXVlLmFkZChwcm9qZWN0KTsKLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkFkZGluZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXNjaGVkdWxlKEpPQl9ERUxBWV9QUk9KRUNUKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgY2hlY2sgdG8gc2VlIGlmIHRoZSBPU0dJIGZyYW1ld29yayBpcyBzaHV0dGluZyBkb3duLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgU3lzdGVtIEJ1bmRsZSBpcyBzdG9wcGVkIChpZS4gdGhlIGZyYW1ld29yayBpcwotCSAqICAgICAgICAgc2h1dHRpbmcgZG93bikKLQkgKi8KLQlib29sZWFuIGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkgewotCQkvLyBpbiB0aGUgRnJhbWV3b3JrIGNsYXNzIHRoZXJlJ3MgYSBub3RlOgotCQkvLyBzZXQgdGhlIHN0YXRlIG9mIHRoZSBTeXN0ZW0gQnVuZGxlIHRvIFNUT1BQSU5HLgotCQkvLyB0aGlzIG11c3QgYmUgZG9uZSBmaXJzdCBhY2NvcmRpbmcgdG8gc2VjdGlvbiA0LjE5LjIgZnJvbSB0aGUgT1NHaQotCQkvLyBSMyBzcGVjLgotCQlib29sZWFuIHNodXR0aW5nRG93biA9ICFQbGF0Zm9ybS5pc1J1bm5pbmcoKSB8fCBQbGF0Zm9ybS5nZXRCdW5kbGUoT1NHSV9GUkFNRVdPUktfSUQpLmdldFN0YXRlKCkgPT0gQnVuZGxlLlNUT1BQSU5HOwotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CICYmIHNodXR0aW5nRG93bikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUYXNrU2Nhbm5pbmdKb2I6IHN5c3RlbSBpcyBzaHV0dGluZyBkb3duISIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHNodXR0aW5nRG93bjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmFibGVkUHJvamVjdChJUmVzb3VyY2UgcHJvamVjdCkgewotCQlTdHJpbmdbXSBwcm9qZWN0c1NjYW5uZWQgPSBTdHJpbmdVdGlscy51bnBhY2soU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVEKSk7Ci0KLQkJYm9vbGVhbiBzaG91bGRTY2FuID0gdHJ1ZTsKLQkJU3RyaW5nIG5hbWUgPSBwcm9qZWN0LmdldE5hbWUoKTsKLQkJZm9yIChpbnQgaiA9IDA7IHNob3VsZFNjYW4gJiYgaiA8IHByb2plY3RzU2Nhbm5lZC5sZW5ndGg7IGorKykgewotCQkJaWYgKHByb2plY3RzU2Nhbm5lZFtqXS5lcXVhbHMobmFtZSkpIHsKLQkJCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTSk9CKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNjYW5uaW5nIEpvYiBza2lwcGluZyAiICsgcHJvamVjdC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJc2hvdWxkU2NhbiA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBzaG91bGRTY2FuOwotCX0KLQotCXN5bmNocm9uaXplZCBMaXN0IHJldHJpZXZlUXVldWUoKSB7Ci0JCUxpc3QgcXVldWUgPSBmUXVldWU7Ci0JCWZRdWV1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJcmV0dXJuIHF1ZXVlOwotCX0KLQotCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKGZyYW1ld29ya0lzU2h1dHRpbmdEb3duKCkpCi0JCQlyZXR1cm4gU3RhdHVzLkNBTkNFTF9TVEFUVVM7Ci0KLQkJdmFsaWRhdGVSZW1lbWJlcmVkUHJvamVjdExpc3QoVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVEKTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IG51bGw7Ci0JCUxpc3QgY3VycmVudFF1ZXVlID0gcmV0cmlldmVRdWV1ZSgpOwotCQlMaXN0IGVycm9ycyA9IG51bGw7Ci0JCWludCB0aWNrcyA9IGN1cnJlbnRRdWV1ZS5zaXplKCk7Ci0JCVN0cmluZyB0YXNrTmFtZSA9IG51bGw7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpIHsKLQkJCXRhc2tOYW1lID0gIlNjYW5uaW5nICgiICsgdGlja3MgKyAiIHdvcmsgaXRlbXMpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJZWxzZSB7Ci0JCQl0YXNrTmFtZSA9IFNTRUNvcmVNZXNzYWdlcy5UYXNrU2Nhbm5pbmdKb2JfMDsKLQkJfQotCQltb25pdG9yLmJlZ2luVGFzayh0YXNrTmFtZSwgdGlja3MpOwotCi0JCUlQcm9ncmVzc01vbml0b3Igc2Nhbk1vbml0b3IgPSBudWxsOwotCQl3aGlsZSAoIWN1cnJlbnRRdWV1ZS5pc0VtcHR5KCkpIHsKLQkJCU9iamVjdCBvID0gY3VycmVudFF1ZXVlLnJlbW92ZSgwKTsKLQkJCWlmIChmcmFtZXdvcmtJc1NodXR0aW5nRG93bigpKQotCQkJCXJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLQkJCXRyeSB7Ci0JCQkJc2Nhbk1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpOwotCQkJCWlmIChvIGluc3RhbmNlb2YgSVJlc291cmNlRGVsdGEpIHsKLQkJCQkJV29ya3NwYWNlVGFza1NjYW5uZXIuZ2V0SW5zdGFuY2UoKS5zY2FuKChJUmVzb3VyY2VEZWx0YSkgbywgc2Nhbk1vbml0b3IpOwotCQkJCX0KLQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVByb2plY3QpIHsKLQkJCQkJV29ya3NwYWNlVGFza1NjYW5uZXIuZ2V0SW5zdGFuY2UoKS5zY2FuKChJUHJvamVjdCkgbywgc2Nhbk1vbml0b3IpOwotCQkJCQlTdHJpbmdbXSBwcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkID0gU3RyaW5nVXRpbHMudW5wYWNrKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCkpOwotCQkJCQlTdHJpbmdbXSB1cGRhdGVkUHJvamVjdHMgPSBuZXcgU3RyaW5nW3Byb2plY3RzUHJldmlvdXNseVNjYW5uZWQubGVuZ3RoICsgMV07Ci0JCQkJCXVwZGF0ZWRQcm9qZWN0c1twcm9qZWN0c1ByZXZpb3VzbHlTY2FubmVkLmxlbmd0aF0gPSAoKElSZXNvdXJjZSkgbykuZ2V0TmFtZSgpOwotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KHByb2plY3RzUHJldmlvdXNseVNjYW5uZWQsIDAsIHVwZGF0ZWRQcm9qZWN0cywgMCwgcHJvamVjdHNQcmV2aW91c2x5U2Nhbm5lZC5sZW5ndGgpOwotCQkJCQlTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLnNldFZhbHVlKFRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCwgU3RyaW5nVXRpbHMucGFjayh1cGRhdGVkUHJvamVjdHMpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoZXJyb3JzID09IG51bGwpIHsKLQkJCQkJZXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCX0KLQkJCQllcnJvcnMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFQ29yZVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgIiIsIGUpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCW1vbml0b3IuZG9uZSgpOwotCi0JCWlmIChlcnJvcnMgPT0gbnVsbCB8fCBlcnJvcnMuaXNFbXB0eSgpKSB7Ci0JCQlzdGF0dXMgPSBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGVycm9ycy5zaXplKCkgPT0gMSkgewotCQkJCXN0YXR1cyA9IChJU3RhdHVzKSBlcnJvcnMuZ2V0KDApOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVN0YXR1c1tdIHN0YXRpaSA9IChJU3RhdHVzW10pIGVycm9ycy50b0FycmF5KG5ldyBJU3RhdHVzW2Vycm9ycy5zaXplKCldKTsKLQkJCQlzdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoU1NFQ29yZVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgc3RhdGlpLCBTU0VDb3JlTWVzc2FnZXMuVGFza1NjYW5uaW5nSm9iXzEsIG51bGwpOwotCQkJfQotCQl9Ci0KLQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVtZW1iZXJlZFByb2plY3RMaXN0KFN0cmluZyBwcmVmZXJlbmNlTmFtZSkgewotCQlTdHJpbmdbXSByZW1lbWJlcmVkUHJvamVjdE5hbWVzID0gU3RyaW5nVXRpbHMudW5wYWNrKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKHByZWZlcmVuY2VOYW1lKSk7Ci0JCUlSZXNvdXJjZVtdIHdvcmtzcGFjZVByb2plY3RzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0cygpOwotCQlTdHJpbmdbXSBwcm9qZWN0TmFtZXMgPSBuZXcgU3RyaW5nW3dvcmtzcGFjZVByb2plY3RzLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlwcm9qZWN0TmFtZXNbaV0gPSB3b3Jrc3BhY2VQcm9qZWN0c1tpXS5nZXROYW1lKCk7Ci0JCX0KLQotCQlMaXN0IHByb2plY3ROYW1lc1RvUmVtZW1iZXIgPSBuZXcgQXJyYXlMaXN0KHJlbWVtYmVyZWRQcm9qZWN0TmFtZXMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZW1lbWJlcmVkUHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlib29sZWFuIHJlbWVtYmVyZWRQcm9qZWN0RXhpc3RzID0gZmFsc2U7Ci0JCQlmb3IgKGludCBqID0gMDsgIXJlbWVtYmVyZWRQcm9qZWN0RXhpc3RzICYmIGogPCBwcm9qZWN0TmFtZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAocmVtZW1iZXJlZFByb2plY3ROYW1lc1tpXS5lcXVhbHMocHJvamVjdE5hbWVzW2pdKSkgewotCQkJCQlyZW1lbWJlcmVkUHJvamVjdEV4aXN0cyA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKHJlbWVtYmVyZWRQcm9qZWN0RXhpc3RzKSB7Ci0JCQkJcHJvamVjdE5hbWVzVG9SZW1lbWJlci5hZGQocmVtZW1iZXJlZFByb2plY3ROYW1lc1tpXSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChMb2dnZXIuREVCVUdfVEFTS1NKT0IpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlJlbW92aW5nICIgKyByZW1lbWJlcmVkUHJvamVjdE5hbWVzW2ldICsgIiByZW1vdmVkIGZyb20gIiArIHByZWZlcmVuY2VOYW1lKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQotCQlpZiAocHJvamVjdE5hbWVzVG9SZW1lbWJlci5zaXplKCkgIT0gcmVtZW1iZXJlZFByb2plY3ROYW1lcy5sZW5ndGgpIHsKLQkJCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUocHJlZmVyZW5jZU5hbWUsIFN0cmluZ1V0aWxzLnBhY2soKFN0cmluZ1tdKSBwcm9qZWN0TmFtZXNUb1JlbWVtYmVyLnRvQXJyYXkobmV3IFN0cmluZ1twcm9qZWN0TmFtZXNUb1JlbWVtYmVyLnNpemUoKV0pKSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdTY2hlZHVsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1NjYW5uaW5nU2NoZWR1bGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNWYxM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrU2Nhbm5pbmdTY2hlZHVsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGFWaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotcHVibGljIGNsYXNzIFRhc2tTY2FubmluZ1NjaGVkdWxlciB7Ci0JcHJpdmF0ZSBjbGFzcyBMaXN0ZW5lclZpc2l0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lciwgSVJlc291cmNlRGVsdGFWaXNpdG9yIHsKLQkJcHVibGljIHZvaWQgcmVzb3VyY2VDaGFuZ2VkKElSZXNvdXJjZUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlJUmVzb3VyY2VEZWx0YSBkZWx0YSA9IGV2ZW50LmdldERlbHRhKCk7Ci0JCQlpZiAoZGVsdGEuZ2V0UmVzb3VyY2UoKSAhPSBudWxsKSB7Ci0JCQkJaW50IHJlc291cmNlVHlwZSA9IGRlbHRhLmdldFJlc291cmNlKCkuZ2V0VHlwZSgpOwotCQkJCWlmIChyZXNvdXJjZVR5cGUgPT0gSVJlc291cmNlLlBST0pFQ1QgfHwgcmVzb3VyY2VUeXBlID09IElSZXNvdXJjZS5ST09UKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlkZWx0YS5hY2NlcHQodGhpcyk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIGhhbmRsaW5nIHJlc291cmNlIGNoYW5nZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiB2aXNpdChJUmVzb3VyY2VEZWx0YSBkZWx0YSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJaWYgKChkZWx0YS5nZXRLaW5kKCkgJiBJUmVzb3VyY2VEZWx0YS5NQVJLRVJTKSA+IDAgfHwgKGRlbHRhLmdldEtpbmQoKSAmIElSZXNvdXJjZURlbHRhLkVOQ09ESU5HKSA+IDAgfHwgKGRlbHRhLmdldEtpbmQoKSAmIElSZXNvdXJjZURlbHRhLk5PX0NIQU5HRSkgPiAwKQotCQkJCXJldHVybiBmYWxzZTsKLQotCQkJSVJlc291cmNlIHJlc291cmNlID0gZGVsdGEuZ2V0UmVzb3VyY2UoKTsKLQkJCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJaWYgKHJlc291cmNlLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuUk9PVCkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5QUk9KRUNUKSB7Ci0JCQkJCWZKb2IuYWRkRGVsdGEoZGVsdGEpOwotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBUYXNrU2Nhbm5pbmdTY2hlZHVsZXIgc2NoZWR1bGVyOwotCi0JcHVibGljIHN0YXRpYyB2b2lkIHJlZnJlc2goKSB7Ci0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoVGFza1NjYW5uaW5nSm9iLlRBU0tfVEFHX1BST0pFQ1RTX0FMUkVBRFlfU0NBTk5FRCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCXNjaGVkdWxlci5lbnF1ZXVlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCByZWZyZXNoKElQcm9qZWN0IHByb2plY3QpIHsKLQkJU3RyaW5nW10gcHJvamVjdE5hbWVzID0gU3RyaW5nVXRpbHMudW5wYWNrKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFRhc2tTY2FubmluZ0pvYi5UQVNLX1RBR19QUk9KRUNUU19BTFJFQURZX1NDQU5ORUQpKTsgLy8kTk9OLU5MUy0xJAotCQlMaXN0IGZyZXNoUHJvamVjdExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvamVjdE5hbWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoIXByb2plY3ROYW1lc1tpXS5lcXVhbHMocHJvamVjdC5nZXROYW1lKCkpKSB7Ci0JCQkJZnJlc2hQcm9qZWN0TGlzdC5hZGQocHJvamVjdE5hbWVzW2ldKTsKLQkJCX0KLQkJfQotCQlTdHJpbmcgZnJlc2hQcm9qZWN0cyA9IFN0cmluZ1V0aWxzLnBhY2soKFN0cmluZ1tdKSBmcmVzaFByb2plY3RMaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tmcmVzaFByb2plY3RMaXN0LnNpemUoKV0pKTsKLQkJU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShUYXNrU2Nhbm5pbmdKb2IuVEFTS19UQUdfUFJPSkVDVFNfQUxSRUFEWV9TQ0FOTkVELCBmcmVzaFByb2plY3RzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXNjaGVkdWxlci5lbnF1ZXVlKHByb2plY3QpOwotCX0KLQotCi0JLyoqCi0JICogT25seSBmb3IgdXNlIGJ5IFNTRUNvcmVQbHVnaW4gY2xhc3MKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2h1dGRvd24oKSB7Ci0JCWlmIChzY2hlZHVsZXIgIT0gbnVsbCkgewotCQkJc2NoZWR1bGVyLmZKb2IuY2FuY2VsKCk7Ci0JCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucmVtb3ZlUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihzY2hlZHVsZXIudmlzaXRvcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPbmx5IGZvciB1c2UgYnkgU1NFQ29yZVBsdWdpbiBjbGFzcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBzdGFydHVwKCkgewotCQlzY2hlZHVsZXIgPSBuZXcgVGFza1NjYW5uaW5nU2NoZWR1bGVyKCk7Ci0KLQkJLyoKLQkJICogQWNjb3JkaW5nIHRvCi0JCSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvZWNsaXBzZS9kZXZlbG9wbWVudC9wZXJmb3JtYW5jZS9ibG9vcGVycy5odG1sLAotCQkgKiBQT1NUX0NIQU5HRSBsaXN0ZW5lcnMgYWRkIGEgdHJpdmlhbCBwZXJmb3JtYW5jZSBjb3N0Ci0JCSAqLwotCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuYWRkUmVzb3VyY2VDaGFuZ2VMaXN0ZW5lcihzY2hlZHVsZXIudmlzaXRvciwgSVJlc291cmNlQ2hhbmdlRXZlbnQuUE9TVF9DSEFOR0UpOwotCi0JCXNjaGVkdWxlci5lbnF1ZXVlKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkpOwotCX0KLQotCVRhc2tTY2FubmluZ0pvYiBmSm9iID0gbnVsbDsKLQotCUxpc3RlbmVyVmlzaXRvciB2aXNpdG9yID0gbnVsbDsKLQotCXByaXZhdGUgVGFza1NjYW5uaW5nU2NoZWR1bGVyKCkgewotCQlzdXBlcigpOwotCQlmSm9iID0gbmV3IFRhc2tTY2FubmluZ0pvYigpOwotCQl2aXNpdG9yID0gbmV3IExpc3RlbmVyVmlzaXRvcigpOwotCX0KLQotCXZvaWQgZW5xdWV1ZShJUHJvamVjdCBwcm9qZWN0KSB7Ci0JCWZKb2IuYWRkUHJvamVjdChwcm9qZWN0KTsKLQl9Ci0KLQl2b2lkIGVucXVldWUoSVdvcmtzcGFjZVJvb3Qgcm9vdCkgewotCQlJUHJvamVjdFtdIGFsbFByb2plY3RzID0gcm9vdC5nZXRQcm9qZWN0cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbFByb2plY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmSm9iLmFkZFByb2plY3QoYWxsUHJvamVjdHNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrVGFnUHJlZmVyZW5jZUtleXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvVGFza1RhZ1ByZWZlcmVuY2VLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2UzMDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9UYXNrVGFnUHJlZmVyZW5jZUtleXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgVGFza1RhZ1ByZWZlcmVuY2VLZXlzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCA9ICJpZ25vcmVkLWNvbnRlbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19FTkFCTEUgPSAiZW5hYmxlZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19OT0RFID0gU1NFQ29yZVBsdWdpbi5JRCArIElQYXRoLlNFUEFSQVRPUiArICJ0YXNrLXRhZ3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfUEVSX1BST0pFQ1QgPSAidXNlLXByb2plY3Qtc2V0dGluZ3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfUFJJT1JJVElFUyA9ICJ0YXNrUHJpb3JpdGllcyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1RBR19UQUdTID0gInRhc2tUYWdzIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9Xb3Jrc3BhY2VUYXNrU2Nhbm5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90YXNrcy9Xb3Jrc3BhY2VUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MDAwNjdlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGFza3MvV29ya3NwYWNlVGFza1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlRGVsdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUHJvamVjdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVByZWZlcmVuY2VzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSVNjb3BlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5JRmlsZVRhc2tTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5UYXNrVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotLyoqCi0gKiBEaXNwYXRjaGVyIGZvciBzY2FubmluZyBiYXNlZCBvbiBkZWx0YXMgYW5kIHJlcXVlc3RlZCBwcm9qZWN0cwotICovCi1jbGFzcyBXb3Jrc3BhY2VUYXNrU2Nhbm5lciB7Ci0JcHJpdmF0ZSBzdGF0aWMgV29ya3NwYWNlVGFza1NjYW5uZXIgX2luc3RhbmNlID0gbnVsbDsKLQotCXN0YXRpYyBzeW5jaHJvbml6ZWQgV29ya3NwYWNlVGFza1NjYW5uZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChfaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJX2luc3RhbmNlID0gbmV3IFdvcmtzcGFjZVRhc2tTY2FubmVyKCk7Ci0JCX0KLQkJcmV0dXJuIF9pbnN0YW5jZTsKLQl9Ci0KLQlmaW5hbCBTdHJpbmcgREVGQVVMVF9NQVJLRVJfVFlQRSA9IElGaWxlVGFza1NjYW5uZXIuVEFTS19NQVJLRVJfSUQ7Ci0JcHJpdmF0ZSBMaXN0IGZBY3RpdmVTY2FubmVycyA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmQ3VycmVudElnbm9yZUNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JcHJpdmF0ZSBUYXNrVGFnW10gZkN1cnJlbnRUYXNrVGFncyA9IG51bGw7Ci0KLQlwcml2YXRlIEZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyIHJlZ2lzdHJ5ID0gbnVsbDsKLQotCXByaXZhdGUgbG9uZyB0aW1lMDsKLQotCS8qKgotCSAqIAotCSAqLwotCXByaXZhdGUgV29ya3NwYWNlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCXJlZ2lzdHJ5ID0gRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJZkFjdGl2ZVNjYW5uZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmQ3VycmVudFRhc2tUYWdzID0gbmV3IFRhc2tUYWdbMF07Ci0JCWZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzID0gbmV3IElDb250ZW50VHlwZVswXTsKLQl9Ci0KLQlwcml2YXRlIElDb250ZW50VHlwZVtdIGRldGVjdENvbnRlbnRUeXBlcyhJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBudWxsOwotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQl0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IocmVzb3VyY2UuZ2V0TmFtZSgpKTsKLQkJCWlmICh0eXBlcy5sZW5ndGggPT0gMCkgewotCQkJCUlDb250ZW50RGVzY3JpcHRpb24gZCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gb3B0aW1pemVkIGRlc2NyaXB0aW9uIGxvb2t1cCwgbWlnaHQgbm90IHN1Y2NlZWQKLQkJCQkJZCA9ICgoSUZpbGUpIHJlc291cmNlKS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQkJdHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW117ZC5nZXRDb250ZW50VHlwZSgpfTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIHNob3VsZCBub3QgYmUgcG9zc2libGUgZ2l2ZW4gdGhlIGFjY2Vzc2libGUgYW5kIGZpbGUKLQkJCQkJICogdHlwZSBjaGVjayBhYm92ZQotCQkJCQkgKi8KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAodHlwZXMgPT0gbnVsbCkgewotCQkJCXR5cGVzID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlc0ZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJfQotCQkJaWYgKExvZ2dlci5ERUJVR19UQVNLU0NPTlRFTlRUWVBFKSB7Ci0JCQkJaWYgKHR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQkJaWYgKHR5cGVzLmxlbmd0aCA+IDEpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpICsgIjogIiArICJtdWx0aXBsZSBiYXNlZCBvbiBuYW1lIChwcm9iYWJseSBoaWVyYXJjaGljYWwpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZXNvdXJjZS5nZXRGdWxsUGF0aCgpICsgIiBtYXRjaGVkOiAiICsgdHlwZXNbaV0uZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb2plY3QgZ2V0UHJvamVjdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLlBST0pFQ1QpIHsKLQkJCXByb2plY3QgPSAoSVByb2plY3QpIHJlc291cmNlOwotCQl9Ci0JCWVsc2UgewotCQkJcHJvamVjdCA9IHJlc291cmNlLmdldFByb2plY3QoKTsKLQkJfQotCQlyZXR1cm4gcHJvamVjdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5pdChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QocmVzb3VyY2UpOwotCi0JCUlQcmVmZXJlbmNlc1NlcnZpY2UgcHJlZmVyZW5jZXNTZXJ2aWNlID0gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCk7Ci0JCUlTY29wZUNvbnRleHRbXSBsb29rdXBPcmRlciA9IG5ldyBJU2NvcGVDb250ZXh0W117bmV3IFByb2plY3RTY29wZShwcm9qZWN0KSwgbmV3IEluc3RhbmNlU2NvcGUoKSwgbmV3IERlZmF1bHRTY29wZSgpfTsKLQotCQlib29sZWFuIHByb2NlZWQgPSBwcmVmZXJlbmNlc1NlcnZpY2UuZ2V0Qm9vbGVhbihUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZmFsc2UsIGxvb2t1cE9yZGVyKTsKLQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUFJFRlMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2NhbiBvZiAiICsgcmVzb3VyY2UuZ2V0RnVsbFBhdGgoKSArICI6IiArIHByb2NlZWQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCWlmIChwcm9jZWVkKSB7Ci0JCQlTdHJpbmdbXSB0YWdzID0gU3RyaW5nVXRpbHMudW5wYWNrKHByZWZlcmVuY2VzU2VydmljZS5nZXRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUsIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCBudWxsLCBsb29rdXBPcmRlcikpOwotCQkJU3RyaW5nW10gcHJpb3JpdGllcyA9IFN0cmluZ1V0aWxzLnVucGFjayhwcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgbnVsbCwgbG9va3VwT3JkZXIpKTsKLQkJCVN0cmluZ1tdIGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEcyA9IFN0cmluZ1V0aWxzLnVucGFjayhwcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsIG51bGwsIGxvb2t1cE9yZGVyKSk7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTUFJFRlMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50KGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiB0YWdzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdGFncy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnQodGFnc1tpXSk7Ci0JCQkJfQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCQkJCVN5c3RlbS5vdXQucHJpbnQoZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHByaW9yaXRpZXM6ICIpOyAvLyROT04tTkxTLTEkCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmlvcml0aWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludChwcmlvcml0aWVzW2ldKTsKLQkJCQl9Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQkJU3lzdGVtLm91dC5wcmludChnZXRDbGFzcygpLmdldE5hbWUoKSArICIgaWdub3JlZCBjb250ZW50IHR5cGVzOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY3VycmVudElnbm9yZUNvbnRlbnRUeXBlSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmIChpID4gMCkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludCgiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQkJU3lzdGVtLm91dC5wcmludChjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHNbaV0pOwotCQkJCX0KLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJCX0KLQkJCWZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzID0gbmV3IElDb250ZW50VHlwZVtjdXJyZW50SWdub3JlQ29udGVudFR5cGVJRHMubGVuZ3RoXTsKLQkJCUlDb250ZW50VHlwZU1hbmFnZXIgY29udGVudFR5cGVNYW5hZ2VyID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEcy5sZW5ndGg7IGkrKykgewotCQkJCWZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzW2ldID0gY29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGN1cnJlbnRJZ25vcmVDb250ZW50VHlwZUlEc1tpXSk7Ci0JCQl9Ci0JCQlpbnQgbWF4ID0gTWF0aC5taW4odGFncy5sZW5ndGgsIHByaW9yaXRpZXMubGVuZ3RoKTsKLQkJCWZDdXJyZW50VGFza1RhZ3MgPSBuZXcgVGFza1RhZ1ttYXhdOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXg7IGkrKykgewotCQkJCWludCBwcmlvcml0eSA9IFRhc2tUYWcuUFJJT1JJVFlfTk9STUFMOwotCQkJCXRyeSB7Ci0JCQkJCXByaW9yaXR5ID0gSW50ZWdlci5wYXJzZUludChwcmlvcml0aWVzW2ldKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGRlZmF1bHQgdG8gbm9ybWFsIHByaW9yaXR5Ci0JCQkJfQotCQkJCWZDdXJyZW50VGFza1RhZ3NbaV0gPSBuZXcgVGFza1RhZyh0YWdzW2ldLCBwcmlvcml0eSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2NlZWQ7Ci0JfQotCi0Jdm9pZCBpbnRlcm5hbFNjYW4oZmluYWwgSVByb2plY3QgcHJvamVjdCwgZmluYWwgSVJlc291cmNlIHJlc291cmNlLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIHNjYW5Nb25pdG9yKSB7Ci0JCWlmIChzY2FuTW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgbmFtZSA9IHJlc291cmNlLmdldE5hbWUoKTsKLQkJCWlmIChyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSAmJiAhcmVzb3VyY2UuaXNEZXJpdmVkKCkgJiYgIXJlc291cmNlLmlzUGhhbnRvbSgpICYmICFyZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgJiYgbmFtZS5sZW5ndGgoKSAhPSAwICYmIG5hbWUuY2hhckF0KDApICE9ICcuJykgewotCQkJCWlmICgocmVzb3VyY2UuZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgPiAwIHx8IChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPiAwKSB7Ci0JCQkJCVN1YlByb2dyZXNzTW9uaXRvciBjaGlsZE1vbml0b3IgPSBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKHNjYW5Nb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQkJCQlJUmVzb3VyY2VbXSBjaGlsZHJlbiA9ICgoSUNvbnRhaW5lcikgcmVzb3VyY2UpLm1lbWJlcnMoKTsKLQkJCQkJY2hpbGRNb25pdG9yLmJlZ2luVGFzaygiIiwgY2hpbGRyZW4ubGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpbnRlcm5hbFNjYW4ocHJvamVjdCwgY2hpbGRyZW5baV0sIGNoaWxkTW9uaXRvcik7Ci0JCQkJCX0KLQkJCQkJY2hpbGRNb25pdG9yLmRvbmUoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5GSUxFKSA+IDApIHsKLQkJCQkJc2NhbkZpbGUocHJvamVjdCwgZkN1cnJlbnRUYXNrVGFncywgKElGaWxlKSByZXNvdXJjZSwgc2Nhbk1vbml0b3IpOwotCQkJCQlzY2FuTW9uaXRvci53b3JrZWQoMSk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2Nhbk1vbml0b3Iud29ya2VkKDEpOwotCi0JCQl9Ci0JCQlzY2FuTW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXZvaWQgaW50ZXJuYWxTY2FuKElSZXNvdXJjZURlbHRhIGRlbHRhLCBmaW5hbCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJU3RyaW5nIG5hbWUgPSBkZWx0YS5nZXRGdWxsUGF0aCgpLmxhc3RTZWdtZW50KCk7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBkZWx0YS5nZXRSZXNvdXJjZSgpOwotCQkJaWYgKCFyZXNvdXJjZS5pc0Rlcml2ZWQoKSAmJiAhcmVzb3VyY2UuaXNQaGFudG9tKCkgJiYgIXJlc291cmNlLmlzVGVhbVByaXZhdGVNZW1iZXIoKSAmJiBuYW1lLmxlbmd0aCgpICE9IDAgJiYgbmFtZS5jaGFyQXQoMCkgIT0gJy4nKSB7Ci0JCQkJaWYgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRk9MREVSKSA+IDAgfHwgKHJlc291cmNlLmdldFR5cGUoKSAmIElSZXNvdXJjZS5QUk9KRUNUKSA+IDApIHsKLQkJCQkJSVJlc291cmNlRGVsdGFbXSBjaGlsZHJlbiA9IGRlbHRhLmdldEFmZmVjdGVkQ2hpbGRyZW4oKTsKLQkJCQkJaWYgKG5hbWUubGVuZ3RoKCkgIT0gMCAmJiBuYW1lLmNoYXJBdCgwKSAhPSAnLicgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCQkJU3ViUHJvZ3Jlc3NNb25pdG9yIGNoaWxkTW9uaXRvciA9IG5ldyBTdWJQcm9ncmVzc01vbml0b3IobW9uaXRvciwgMSwgU3ViUHJvZ3Jlc3NNb25pdG9yLlBSRVBFTkRfTUFJTl9MQUJFTF9UT19TVUJUQVNLKTsKLQkJCQkJCWNoaWxkTW9uaXRvci5iZWdpblRhc2soIiIsIGNoaWxkcmVuLmxlbmd0aCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZvciAoaW50IGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJCWludGVybmFsU2NhbihjaGlsZHJlbltpXSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihjaGlsZE1vbml0b3IsIDEsIFN1YlByb2dyZXNzTW9uaXRvci5QUkVQRU5EX01BSU5fTEFCRUxfVE9fU1VCVEFTSykpOwotCQkJCQkJfQotCQkJCQkJY2hpbGRNb25pdG9yLmRvbmUoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuRklMRSkgPiAwKSB7Ci0JCQkJCWlmICgoZGVsdGEuZ2V0S2luZCgpICYgSVJlc291cmNlRGVsdGEuQURERUQpID4gMCB8fCAoKGRlbHRhLmdldEtpbmQoKSAmIElSZXNvdXJjZURlbHRhLkNIQU5HRUQpID4gMCAmJiAoZGVsdGEuZ2V0RmxhZ3MoKSAmIElSZXNvdXJjZURlbHRhLkNPTlRFTlQpID4gMCkpIHsKLQkJCQkJCUlGaWxlIGZpbGUgPSAoSUZpbGUpIHJlc291cmNlOwotCQkJCQkJc2NhbkZpbGUoZmlsZS5nZXRQcm9qZWN0KCksIGZDdXJyZW50VGFza1RhZ3MsIGZpbGUsIG1vbml0b3IpOwotCQkJCQl9Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGxhY2VUYXNrTWFya2VycyhmaW5hbCBJRmlsZSBmaWxlLCBmaW5hbCBNYXAgbWFya2VyQXR0cmlidXRlc1tdLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJZmluYWwgSUZpbGUgZmluYWxGaWxlID0gZmlsZTsKLQkJaWYgKGZpbGUuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtzcGFjZVJ1bm5hYmxlIHIgPSBuZXcgSVdvcmtzcGFjZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBEZWxldGUgb2xkIFRhc2sgbWFya2VycyAoZG9uJ3QgZGVsZXRlIHJlZ3VsYXIKLQkJCQkJCQkgKiBUYXNrcyBzaW5jZSB0aGF0IGluY2x1ZGVzIHVzZXItZGVmaW5lZCBvbmVzCi0JCQkJCQkJICovCi0JCQkJCQkJZmlsZS5kZWxldGVNYXJrZXJzKERFRkFVTFRfTUFSS0VSX1RZUEUsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gZGVsZXRpbmcgb2xkIHRhc2tzIiwgZSk7IC8vJE5PTi1OTFMtMSQgCi0JCQkJCQl9Ci0JCQkJCQlpZiAobWFya2VyQXR0cmlidXRlcyAhPSBudWxsICYmIG1hcmtlckF0dHJpYnV0ZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgbWFya2VyQXR0cmlidXRlcy5sZW5ndGggKyAiIHRhc2tzIGZvciAiICsgZmlsZS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2VyQXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCQlTdHJpbmcgc3BlY2lmaWVkTWFya2VyVHlwZSA9IChTdHJpbmcpIG1hcmtlckF0dHJpYnV0ZXNbaV0uZ2V0KElNYXJrZXIuVEFTSyk7Ci0JCQkJCQkJCUlNYXJrZXIgbWFya2VyID0gZmluYWxGaWxlLmNyZWF0ZU1hcmtlcihzcGVjaWZpZWRNYXJrZXJUeXBlICE9IG51bGwgPyBzcGVjaWZpZWRNYXJrZXJUeXBlIDogREVGQVVMVF9NQVJLRVJfVFlQRSk7Ci0JCQkJCQkJCW1hcmtlci5zZXRBdHRyaWJ1dGVzKG1hcmtlckF0dHJpYnV0ZXNbaV0pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJaWYoZmlsZS5pc0FjY2Vzc2libGUoKSkgewotCQkJCQlmaW5hbEZpbGUuZ2V0V29ya3NwYWNlKCkucnVuKHIsIGZpbGUsIElXb3Jrc3BhY2UuQVZPSURfVVBEQVRFLCBtb25pdG9yKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlMSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZTEpOwotCQkJfQotCQl9Ci0JfQotCi0Jdm9pZCBzY2FuKGZpbmFsIElQcm9qZWN0IHByb2plY3QsIGZpbmFsIElQcm9ncmVzc01vbml0b3Igc2Nhbk1vbml0b3IpIHsKLQkJaWYgKHNjYW5Nb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQkJaWYgKExvZ2dlci5ERUJVR19UQVNLUykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzY2FubmluZyBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoIXByb2plY3QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfVEFTS1MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNraXBwaW5nIGluYWNjZXNzaWJsZSBwcm9qZWN0ICIgKyBwcm9qZWN0LmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NPVkVSQUxMUEVSRikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQl0cnkgewotCQkJc2Nhbk1vbml0b3IuYmVnaW5UYXNrKCIiLCBwcm9qZWN0Lm1lbWJlcnMoKS5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW5pdChwcm9qZWN0KSkgewotCQkJCWludGVybmFsU2Nhbihwcm9qZWN0LCBwcm9qZWN0LCBzY2FuTW9uaXRvcik7Ci0JCQkJc2h1dGRvd25EZWxlZ2F0ZXMocHJvamVjdCk7Ci0JCQl9Ci0JCQlzY2FuTW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAoTG9nZ2VyLkRFQlVHX1RBU0tTT1ZFUkFMTFBFUkYpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyBmb3IgIiArIHByb2plY3QuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0KLQl2b2lkIHNjYW4oSVJlc291cmNlRGVsdGEgZGVsdGEsIGZpbmFsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NPVkVSQUxMUEVSRikgewotCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQltb25pdG9yLmJlZ2luVGFzaygiIiwgMSk7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluaXQoZGVsdGEuZ2V0UmVzb3VyY2UoKSkpIHsKLQkJCWludGVybmFsU2NhbihkZWx0YSwgbW9uaXRvcik7Ci0JCQlzaHV0ZG93bkRlbGVnYXRlcyhkZWx0YS5nZXRSZXNvdXJjZSgpLmdldFByb2plY3QoKSk7Ci0JCX0KLQkJbW9uaXRvci5kb25lKCk7Ci0JCWlmIChMb2dnZXIuREVCVUdfVEFTS1NPVkVSQUxMUEVSRikgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCIiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIGZvciAiICsgZGVsdGEuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0Jdm9pZCBzY2FuRmlsZShJUHJvamVjdCBwcm9qZWN0LCBUYXNrVGFnW10gdGFza1RhZ3MsIElGaWxlIGZpbGUsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlpZiAobW9uaXRvci5pc0NhbmNlbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJU3ViUHJvZ3Jlc3NNb25pdG9yIHNjYW5uZXJNb25pdG9yID0gbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxLCBTdWJQcm9ncmVzc01vbml0b3IuUFJFUEVORF9NQUlOX0xBQkVMX1RPX1NVQlRBU0spOwotCQlMaXN0IG1hcmtlckF0dHJpYnV0ZXMgPSBudWxsOwotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IGRldGVjdENvbnRlbnRUeXBlcyhmaWxlKTsKLQkJSUZpbGVUYXNrU2Nhbm5lcltdIGZpbGVTY2FubmVycyA9IG51bGw7Ci0JCWlmICh0eXBlcyAhPSBudWxsKSB7Ci0JCQlpZiAoZkN1cnJlbnRJZ25vcmVDb250ZW50VHlwZXMubGVuZ3RoID09IDApIHsKLQkJCQlmaWxlU2Nhbm5lcnMgPSByZWdpc3RyeS5nZXRGaWxlVGFza1NjYW5uZXJzKHR5cGVzKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUxpc3QgdmFsaWRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkvLyBvYnRhaW4gYSBmaWx0ZXJlZCBsaXN0IG9mIGRlbGVnYXRlcwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJYm9vbGVhbiBpZ25vcmVDb250ZW50VHlwZSA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpZ25vcmVDb250ZW50VHlwZSA9IGlnbm9yZUNvbnRlbnRUeXBlIHx8IHR5cGVzW2ldLmlzS2luZE9mKGZDdXJyZW50SWdub3JlQ29udGVudFR5cGVzW2pdKTsKLQkJCQkJfQotCQkJCQlpZiAoIWlnbm9yZUNvbnRlbnRUeXBlKSB7Ci0JCQkJCQl2YWxpZFR5cGVzLmFkZCh0eXBlc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmlsZVNjYW5uZXJzID0gcmVnaXN0cnkuZ2V0RmlsZVRhc2tTY2FubmVycygoSUNvbnRlbnRUeXBlW10pIHZhbGlkVHlwZXMudG9BcnJheShuZXcgSUNvbnRlbnRUeXBlW3ZhbGlkVHlwZXMuc2l6ZSgpXSkpOwotCQkJfQotCQkJaWYgKGZpbGVTY2FubmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGZpbGVTY2FubmVycyAhPSBudWxsICYmIGogPCBmaWxlU2Nhbm5lcnMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHNjYW5uZXJNb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlzY2FubmVyTW9uaXRvci5iZWdpblRhc2soZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGZpbGVTY2FubmVycy5sZW5ndGgpOyAvLyROT04tTkxTLTEkCi0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoIWZBY3RpdmVTY2FubmVycy5jb250YWlucyhmaWxlU2Nhbm5lcnNbal0pICYmICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkgewotCQkJCQkJCWZpbGVTY2FubmVyc1tqXS5zdGFydHVwKGZpbGUuZ2V0UHJvamVjdCgpKTsKLQkJCQkJCQlmQWN0aXZlU2Nhbm5lcnMuYWRkKGZpbGVTY2FubmVyc1tqXSk7Ci0JCQkJCQl9Ci0JCQkJCQlNYXBbXSB0YXNrTWFya2VyQXR0cmlidXRlcyA9IGZpbGVTY2FubmVyc1tqXS5zY2FuKGZpbGUsIHRhc2tUYWdzLCBzY2FubmVyTW9uaXRvcik7Ci0JCQkJCQkvKgotCQkJCQkJICogVE9ETzogcG9vbCB0aGUgbWFya2VyIHJlc3VsdHMgc28gdGhlcmUncyBvbmx5IG9uZQotCQkJCQkJICogb3BlcmF0aW9uIGNyZWF0aW5nIHRoZW0KLQkJCQkJCSAqLwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YXNrTWFya2VyQXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChtYXJrZXJBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCQkJCQkJbWFya2VyQXR0cmlidXRlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbWFya2VyQXR0cmlidXRlcy5hZGQodGFza01hcmtlckF0dHJpYnV0ZXNbaV0pOwotCQkJCQkJfQotCQkJCQkJc2Nhbm5lck1vbml0b3Iud29ya2VkKDEpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJc2Nhbm5lck1vbml0b3IuZG9uZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbW9uaXRvci53b3JrZWQoMSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCQkvLyBvbmx5IHVwZGF0ZSBtYXJrZXJzIGlmIHdlIHJhbiBhIHNjYW5uZXIgb24gdGhpcyBmaWxlCi0JCWlmIChmaWxlU2Nhbm5lcnMgIT0gbnVsbCAmJiBmaWxlU2Nhbm5lcnMubGVuZ3RoID4gMCkgewotCQkJaWYgKG1hcmtlckF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCXJlcGxhY2VUYXNrTWFya2VycyhmaWxlLCAoTWFwW10pIG1hcmtlckF0dHJpYnV0ZXMudG9BcnJheShuZXcgTWFwW21hcmtlckF0dHJpYnV0ZXMuc2l6ZSgpXSksIG1vbml0b3IpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVwbGFjZVRhc2tNYXJrZXJzKGZpbGUsIG51bGwsIG1vbml0b3IpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNodXRkb3duRGVsZWdhdGVzKElQcm9qZWN0IHByb2plY3QpIHsKLQkJZm9yIChpbnQgaiA9IDA7IGogPCBmQWN0aXZlU2Nhbm5lcnMuc2l6ZSgpOyBqKyspIHsKLQkJCXRyeSB7Ci0JCQkJKChJRmlsZVRhc2tTY2FubmVyKSBmQWN0aXZlU2Nhbm5lcnMuZ2V0KGopKS5zaHV0ZG93bihwcm9qZWN0KTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24ocHJvamVjdC5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCksIGUpOwotCQkJfQotCQl9Ci0JCWZBY3RpdmVTY2FubmVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ1NGEzYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbE1hbmFnZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogQ2xhc3MgdG8gYWxsb3cgYWNjZXNzIHRvIE1vZGVsTWFuYWdlci4gTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQuCi0gKiAKLSAqIEBzaW5jZSAgMS41ICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUKLSAqLwotZmluYWwgcHVibGljIGNsYXNzIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIgewotCS8qKgotCSAqIERvIG5vdCBhbGxvdyBpbnN0YW5jZXMgdG8gYmUgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSBvZiBJTW9kZWxNYW5hZ2VyLiBSZXR1cm5zIG51bGwgaWYgbW9kZWwKLQkgKiBtYW5hZ2VyIGNhbiBub3QgYmUgY3JlYXRlZCBvciBpcyBub3QgdmFsaWQgKHN1Y2ggYXMsIHdoZW4gd29ya2JlbmNoIGlzCi0JICogc2h1dHRpbmcgZG93bikuCi0JICogCi0JICogQHJldHVybiBJTW9kZWxNYW5hZ2VyIC0gcmV0dXJucyB0aGUgb25lIG1vZGVsIG1hbmFnZXIgZm9yIHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIG1vZGVsCi0JICovCi0JcHVibGljIHN0YXRpYyBJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpIHsKLQkJYm9vbGVhbiBpc1JlYWR5ID0gZmFsc2U7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJd2hpbGUgKCFpc1JlYWR5KSB7Ci0JCQlCdW5kbGUgbG9jYWxCdW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoU1NFQ29yZVBsdWdpbi5JRCk7Ci0JCQlpbnQgc3RhdGUgPSBsb2NhbEJ1bmRsZS5nZXRTdGF0ZSgpOwotCQkJaWYgKHN0YXRlID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQkvLyBnZXRJbnN0YW5jZSBpcyBhIHN5bmNocm9uaXplZCBzdGF0aWMgbWV0aG9kLgotCQkJCW1vZGVsTWFuYWdlciA9IE1vZGVsTWFuYWdlckltcGwuZ2V0SW5zdGFuY2UoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXRlID09IEJ1bmRsZS5TVEFSVElORykgewotCQkJCXRyeSB7Ci0JCQkJCVRocmVhZC5zbGVlcCgxMDApOwotCQkJCX0KLQkJCQljYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewotCQkJCQkvLyBpZ25vcmUsIGp1c3QgbG9vcCBhZ2FpbgotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHN0YXRlID09IEJ1bmRsZS5TVE9QUElORyB8fCBzdGF0ZSA9PSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQlpc1JlYWR5ID0gdHJ1ZTsKLQkJCQltb2RlbE1hbmFnZXIgPSBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gbm90IHN1cmUgYWJvdXQgb3RoZXIgc3RhdGVzLCAncmVzb2x2ZWQnLCAnaW5zdGFsbGVkJwotCQkJCWlzUmVhZHkgPSB0cnVlOwotCQkJCW1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsTWFuYWdlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0ZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzJhMWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRmlsZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLklGaWxlQnVmZmVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotCi1wdWJsaWMgY2xhc3MgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciB7Ci0KLQlzdGF0aWMgY2xhc3MgRG9jdW1lbnRJbmZvIHsKLQkJLyoqCi0JCSAqIFRoZSBJVGV4dEZpbGVCdWZmZXIKLQkJICovCi0JCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBudWxsOwotCi0JCS8qKgotCQkgKiBUaGUgcGxhdGZvcm0gY29udGVudC10eXBlIElEIG9mIHRoaXMgZG9jdW1lbnQKLQkJICovCi0JCVN0cmluZyBjb250ZW50VHlwZUlEID0gbnVsbDsKLQotCQkvKioKLQkJICogVGhlIElTdHJ1Y3R1cmVNb2RlbCBjb250YWluaW5nIHRoaXMgZG9jdW1lbnQ7IG1pZ2h0IGJlIG51bGwgYXQKLQkJICogcG9pbnRzIGluIHRoZSBJVGV4dEZpbGVCdWZmZXIncyBsaWZlY3ljbGUKLQkJICovCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCi0JCS8qKgotCQkgKiBXaGV0aGVyIEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgY2FsbGVkIGNvbm5lY3QoKSBmb3IgdGhpcwotCQkgKiBEb2N1bWVudEluZm8ncyB0ZXh0IGZpbGVidWZmZXIKLQkJICovCi0JCWJvb2xlYW4gc2VsZkNvbm5lY3RlZCA9IGZhbHNlOwotCi0JCWludCBidWZmZXJSZWZlcmVuY2VDb3VudCA9IDA7Ci0JCWludCBtb2RlbFJlZmVyZW5jZUNvdW50ID0gMDsKLQl9Ci0KLQkvKioKLQkgKiBBIFVSSVJlc29sdmVyIGluc3RhbmNlIG9mIG1vZGVscyBidWlsdCBvbiBqYXZhLmlvLkZpbGVzCi0JICovCi0JY2xhc3MgRXh0ZXJuYWxVUklSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQkJSVBhdGggZkxvY2F0aW9uOwotCi0JCUV4dGVybmFsVVJJUmVzb2x2ZXIoSVBhdGggbG9jYXRpb24pIHsKLQkJCWZMb2NhdGlvbiA9IGxvY2F0aW9uOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCkgewotCQkJcmV0dXJuIGZMb2NhdGlvbi50b1N0cmluZygpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmkpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGJhc2VSZWZlcmVuY2UsIGZhbHNlKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJCS8vIGlnbm9yZSByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgdmFsdWUKLQkJCWlmICh1cmkgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICh1cmkuc3RhcnRzV2l0aCgiZmlsZToiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJdHJ5IHsKLQkJCQkJVVJMIHVybCA9IG5ldyBVUkwodXJpKTsKLQkJCQkJcmV0dXJuIHVybC5nZXRGaWxlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBVUklIZWxwZXIubm9ybWFsaXplKHVyaSwgYmFzZVJlZmVyZW5jZSwgUGF0aC5ST09ULnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBJQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpIHsKLQkJCXJldHVybiBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQl9Ci0KLQkJcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgVVJJUmVzb2x2ZXIgaW5zdGFuY2Ugb2YgbW9kZWxzIGJ1aWx0IG9uIHRoZSBleHRlbnNpYmxlIFdTVCBVUkkKLQkgKiByZXNvbHZlcgotCSAqLwotCWNsYXNzIENvbW1vblVSSVJlc29sdmVyIGltcGxlbWVudHMgVVJJUmVzb2x2ZXIgewotCQlJUGF0aCBmTG9jYXRpb247Ci0JCUlQYXRoIGZQYXRoOwotCQlmaW5hbCBzdGF0aWMgU3RyaW5nIFNFUEFSQVRPUiA9ICIvIjsgLy8kTk9OLU5MUy0xJCAKLQkJZmluYWwgc3RhdGljIFN0cmluZyBGSUxFX1BSRUZJWCA9ICJmaWxlOi8vIjsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbW1vblVSSVJlc29sdmVyKElQYXRoIHBhdGgsIElQYXRoIGxvY2F0aW9uKSB7Ci0JCQlmTG9jYXRpb24gPSBsb2NhdGlvbjsKLQkJCWZQYXRoID0gcGF0aDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0RmlsZUJhc2VMb2NhdGlvbigpIHsKLQkJCXJldHVybiBmTG9jYXRpb24udG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgZmFsc2UpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlyZXR1cm4gZ2V0TG9jYXRpb25CeVVSSSh1cmksIGdldEZpbGVCYXNlTG9jYXRpb24oKSwgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlLCBmYWxzZSk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UsIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCQlib29sZWFuIGJhc2VIYXNQcmVmaXggPSBiYXNlUmVmZXJlbmNlICE9IG51bGwgJiYgYmFzZVJlZmVyZW5jZS5zdGFydHNXaXRoKEZJTEVfUFJFRklYKTsKLQkJCVN0cmluZyByZWZlcmVuY2UgPSBudWxsOwotCQkJaWYgKGJhc2VIYXNQcmVmaXgpIHsKLQkJCQlyZWZlcmVuY2UgPSBiYXNlUmVmZXJlbmNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVmZXJlbmNlID0gRklMRV9QUkVGSVggKyBiYXNlUmVmZXJlbmNlOwotCQkJfQotCQkJU3RyaW5nIHJlc3VsdCA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShyZWZlcmVuY2UsIG51bGwsIHVyaSk7Ci0JCQkvLyBMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLAotCQkJLy8gIlVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZSgiCi0JCQkvLyArIHJlZmVyZW5jZSArICIsIG51bGwsICIgK3VyaSsiKSA9ICIgKyByZXN1bHQpOwotCQkJaWYgKCFiYXNlSGFzUHJlZml4ICYmIHJlc3VsdC5zdGFydHNXaXRoKEZJTEVfUFJFRklYKSAmJiByZXN1bHQubGVuZ3RoKCkgPiBGSUxFX1BSRUZJWC5sZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoRklMRV9QUkVGSVgubGVuZ3RoKCkpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBJUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0UHJvamVjdChmUGF0aC5zZWdtZW50KDApKTsKLQkJfQotCi0JCXB1YmxpYyBJQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpIHsKLQkJCVN0cmluZyByb290ID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKEZJTEVfUFJFRklYICsgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCBudWxsLCBTRVBBUkFUT1IpOwotCQkJSUZpbGVbXSBmaWxlcyA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZEZpbGVzRm9yTG9jYXRpb24obmV3IFBhdGgocm9vdCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICgoZmlsZXNbaV0uZ2V0VHlwZSgpICYgSVJlc291cmNlLkZPTERFUikgPT0gSVJlc291cmNlLkZPTERFUikgewotCQkJCQlpZiAoKChJRm9sZGVyKSBmaWxlc1tpXSkuZ2V0RnVsbFBhdGgoKS5pc1ByZWZpeE9mKGZQYXRoKSkgewotCQkJCQkJcmV0dXJuIChJRm9sZGVyKSBmaWxlc1tpXTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBnZXRQcm9qZWN0KCk7Ci0JCX0KLQotCQlwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0VVJJU3RyZWFtKFN0cmluZyB1cmkpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RmlsZUJhc2VMb2NhdGlvbihTdHJpbmcgbmV3TG9jYXRpb24pIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFByb2plY3QoSVByb2plY3QgbmV3UHJvamVjdCkgewotCQl9Ci0JfQotCi0JLyoqCi0JICogTWFwcyBpbnRlcmVzdGluZyBkb2N1bWVudHMgaW4gZmlsZSBidWZmZXJzIHRvIHRob3NlIGZpbGUgYnVmZmVycy4KLQkgKiBSZXF1aXJlZCB0byBhbGxvd3MgdXMgdG8gZ28gZnJvbSBkb2N1bWVudHMgdG8gY29tcGxldGUgbW9kZWxzLgotCSAqLwotCWNsYXNzIEZpbGVCdWZmZXJNYXBwZXIgaW1wbGVtZW50cyBJRmlsZUJ1ZmZlckxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudEFib3V0VG9CZVJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgYnVmZmVyQ29udGVudFJlcGxhY2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQl9Ci0KLQkJcHVibGljIHZvaWQgYnVmZmVyQ3JlYXRlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJCWlmIChidWZmZXIgaW5zdGFuY2VvZiBJVGV4dEZpbGVCdWZmZXIpIHsKLQkJCQlJVGV4dEZpbGVCdWZmZXIgdGV4dEJ1ZmZlciA9IChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcjsKLQkJCQlpZiAoISh0ZXh0QnVmZmVyLmdldERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTGVhcm5lZCBuZXcgYnVmZmVyOiAiICsgYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIgIiArIGJ1ZmZlciArICIgIiArICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IG5ldyBEb2N1bWVudEluZm8oKTsKLQkJCQlpbmZvLmJ1ZmZlciA9IHRleHRCdWZmZXI7Ci0JCQkJaW5mby5jb250ZW50VHlwZUlEID0gZGV0ZWN0Q29udGVudFR5cGUoYnVmZmVyLmdldExvY2F0aW9uKCkpLmdldElkKCk7Ci0JCQkJaW5mby5idWZmZXJSZWZlcmVuY2VDb3VudCsrOwotCQkJCWZEb2N1bWVudE1hcC5wdXQodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpLCBpbmZvKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGJ1ZmZlckRpc3Bvc2VkKElGaWxlQnVmZmVyIGJ1ZmZlcikgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCUlUZXh0RmlsZUJ1ZmZlciB0ZXh0QnVmZmVyID0gKElUZXh0RmlsZUJ1ZmZlcikgYnVmZmVyOwotCQkJCWlmICghKHRleHRCdWZmZXIuZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpKQotCQkJCQlyZXR1cm47Ci0JCQkJaWYgKExvZ2dlci5ERUJVR19URVhUQlVGRkVSTElGRUNZQ0xFKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJEaXNjYXJkZWQgYnVmZmVyOiAiICsgYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArICIgIiArIGJ1ZmZlciArICIgIiArICgoSVRleHRGaWxlQnVmZmVyKSBidWZmZXIpLmdldERvY3VtZW50KCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0KLQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJCWluZm8uYnVmZmVyUmVmZXJlbmNlQ291bnQtLTsKLQkJCQkJaWYgKGluZm8uYnVmZmVyUmVmZXJlbmNlQ291bnQgPT0gMCAmJiBpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQgPT0gMCkKLQkJCQkJCWZEb2N1bWVudE1hcC5yZW1vdmUodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXJ0eVN0YXRlQ2hhbmdlZChJRmlsZUJ1ZmZlciBidWZmZXIsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJaWYgKGJ1ZmZlciBpbnN0YW5jZW9mIElUZXh0RmlsZUJ1ZmZlcikgewotCQkJCWlmIChMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiQnVmZmVyIGRpcnR5IHN0YXRlIGNoYW5nZWQ6ICgiICsgaXNEaXJ0eSArICIpICIgKyBidWZmZXIuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpICsgIiAiICsgYnVmZmVyICsgIiAiICsgKChJVGV4dEZpbGVCdWZmZXIpIGJ1ZmZlcikuZ2V0RG9jdW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQl9Ci0JCQkJSVRleHRGaWxlQnVmZmVyIHRleHRCdWZmZXIgPSAoSVRleHRGaWxlQnVmZmVyKSBidWZmZXI7Ci0JCQkJaWYgKCEodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpCi0JCQkJCXJldHVybjsKLQkJCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQodGV4dEJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8ubW9kZWwgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbXNnID0gIlVwZGF0aW5nIG1vZGVsIGRpcnR5IHN0YXRlIGZvciIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCB8fCBMb2dnZXIuREVCVUdfVEVYVEJVRkZFUkxJRkVDWUNMRSkgewotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgbXNnKTsKLQkJCQkJfQotCQkJCQlpbmZvLm1vZGVsLnNldERpcnR5U3RhdGUoaXNEaXJ0eSk7Ci0KLQkJCQkJSUZpbGUgd29ya3NwYWNlRmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkpOwotCQkJCQlpZiAoIWlzRGlydHkgJiYgd29ya3NwYWNlRmlsZSAhPSBudWxsKSB7Ci0JCQkJCQlpbmZvLm1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAod29ya3NwYWNlRmlsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZUNoYW5nZUZhaWxlZChJRmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHN0YXRlQ2hhbmdpbmcoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzdGF0ZVZhbGlkYXRpb25DaGFuZ2VkKElGaWxlQnVmZmVyIGJ1ZmZlciwgYm9vbGVhbiBpc1N0YXRlVmFsaWRhdGVkKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1bmRlcmx5aW5nRmlsZURlbGV0ZWQoSUZpbGVCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJaWYgKExvZ2dlci5ERUJVR19URVhUQlVGRkVSTElGRUNZQ0xFKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJEZWxldGVkIGJ1ZmZlcjogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSArICIgIiArIGJ1ZmZlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHVuZGVybHlpbmdGaWxlTW92ZWQoSUZpbGVCdWZmZXIgYnVmZmVyLCBJUGF0aCBwYXRoKSB7Ci0JCQlpZiAoYnVmZmVyIGluc3RhbmNlb2YgSVRleHRGaWxlQnVmZmVyKSB7Ci0JCQkJaWYgKExvZ2dlci5ERUJVR19URVhUQlVGRkVSTElGRUNZQ0xFKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb3ZlZCBidWZmZXIgZnJvbTogIiArIGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKSArICIgIiArIGJ1ZmZlcik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiTW92ZWQgYnVmZmVyIHRvOiAiICsgcGF0aC50b09TU3RyaW5nKCkgKyAiICIgKyBidWZmZXIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGluc3RhbmNlOwotCi0JcHVibGljIHN0YXRpYyBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRmlsZUJ1ZmZlck1vZGVsTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlzdGF0aWMgZmluYWwgdm9pZCBzaHV0ZG93bigpIHsKLQkJaWYgKGluc3RhbmNlICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCUlEb2N1bWVudFtdIGRhbmdsaW5nRG9jdW1lbnRzID0gKElEb2N1bWVudFtdKSBpbnN0YW5jZS5mRG9jdW1lbnRNYXAua2V5U2V0KCkudG9BcnJheShuZXcgSURvY3VtZW50WzBdKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRhbmdsaW5nRG9jdW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgaW5zdGFuY2UuZkRvY3VtZW50TWFwLmdldChkYW5nbGluZ0RvY3VtZW50c1tpXSk7Ci0JCQkJCWlmIChpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQgPiAwKQotCQkJCQkJU3lzdGVtLmVyci5wcmludGxuKCJMRUFLRUQgTU9ERUw6ICIgKyBpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpICsgIiAiICsgKGluZm8ubW9kZWwgIT0gbnVsbCA/IGluZm8ubW9kZWwuZ2V0SWQoKSA6IG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWlmIChpbmZvLmJ1ZmZlclJlZmVyZW5jZUNvdW50ID4gMCkKLQkJCQkJCVN5c3RlbS5lcnIucHJpbnRsbigiTEVBS0VEIEJVRkZFUjogIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkgKyAiICIgKyBpbmZvLmJ1ZmZlci5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCkucmVtb3ZlRmlsZUJ1ZmZlckxpc3RlbmVyKGluc3RhbmNlLmZGaWxlQnVmZmVyTGlzdGVuZXIpOwotCQkJaW5zdGFuY2UgPSBudWxsOwotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIHZvaWQgc3RhcnR1cCgpIHsKLQkJZ2V0SW5zdGFuY2UoKTsKLQl9Ci0KLQkvLyBhIG1hcCBvZiBJU3RydWN0dXJlZERvY3VtZW50cyB0byBEb2N1bWVudEluZm8gb2JqZWN0cwotCU1hcCBmRG9jdW1lbnRNYXAgPSBudWxsOwotCi0JSUZpbGVCdWZmZXJMaXN0ZW5lciBmRmlsZUJ1ZmZlckxpc3RlbmVyID0gbnVsbDsKLQotCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZEb2N1bWVudE1hcCA9IG5ldyBIYXNodGFibGUoNCk7Ci0JCUZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpLmFkZEZpbGVCdWZmZXJMaXN0ZW5lcihmRmlsZUJ1ZmZlckxpc3RlbmVyID0gbmV3IEZpbGVCdWZmZXJNYXBwZXIoKSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRmlsZSBmaWxlKSB7Ci0JCWlmIChmaWxlID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGNhbGN1bGF0ZSBhIG1vZGVsIElEIHdpdGhvdXQgYW4gSUZpbGUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJU3RyaW5nIGlkID0gbnVsbDsKLQkJSVBhdGggcGF0aCA9IGZpbGUuZ2V0RnVsbFBhdGgoKTsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJLyoKLQkJCSAqIFRoZSBJRCBvZiBtb2RlbHMgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGUgbm9ybWFsaXplZCBwYXRocwotCQkJICogc3RvcmVkIGluIHRoZSB1bmRlcmx5aW5nIEZpbGVCdWZmZXJzIHRvIHJldHJpZXZlIHRoZW0gYnkgY29tbW9uCi0JCQkgKiBJRCBsYXRlciBvbi4gV2UgY2hvc2UgdGhlIEZpbGVCdWZmZXIgbm9ybWFsaXplZCBwYXRoIG92ZXIgdGhlCi0JCQkgKiBwcmV2aW91c2x5IHVzZWQgYWJzb2x1dGUgSUZpbGUgcGF0aCBiZWNhdXNlIHRoZSBidWZmZXJzIHNob3VsZAotCQkJICogYWxyZWFkeSBleGlzdCBiZWZvcmUgd2UgYnVpbGQgYSBtb2RlbCBhbmQgd2UgY2FuJ3QgcmV0cmlldmUgYQotCQkJICogRmlsZUJ1ZmZlciB1c2luZyB0aGUgSUQgb2YgYSBtb2RlbCB0aGF0IGRvZXNuJ3QgeWV0IGV4aXN0LgotCQkJICovCi0JCQlpZCA9IEZpbGVCdWZmZXJzLm5vcm1hbGl6ZUxvY2F0aW9uKHBhdGgpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCi0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGNhbGN1bGF0ZUlkKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgY2FsY3VsYXRlIGEgbW9kZWwgSUQgd2l0aG91dCBhIGRvY3VtZW50IHJlZmVyZW5jZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlJVGV4dEZpbGVCdWZmZXIgYnVmZmVyID0gZ2V0QnVmZmVyKGRvY3VtZW50KTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZCA9IGJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIGlkOwotCX0KLQotCVVSSVJlc29sdmVyIGNyZWF0ZVVSSVJlc29sdmVyKElUZXh0RmlsZUJ1ZmZlciBidWZmZXIpIHsKLQkJSVBhdGggbG9jYXRpb24gPSBidWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJSUZpbGUgd29ya3NwYWNlRmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBudWxsOwotCQlpZiAod29ya3NwYWNlRmlsZSAhPSBudWxsKSB7Ci0JCQlJUHJvamVjdCBwcm9qZWN0ID0gd29ya3NwYWNlRmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQlyZXNvbHZlciA9IChVUklSZXNvbHZlcikgcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKTsKLQkJCWlmIChyZXNvbHZlciA9PSBudWxsKSB7Ci0JCQkJcmVzb2x2ZXIgPSBuZXcgQ29tbW9uVVJJUmVzb2x2ZXIod29ya3NwYWNlRmlsZS5nZXRGdWxsUGF0aCgpLCB3b3Jrc3BhY2VGaWxlLmdldExvY2F0aW9uKCkpOwotCQkJfQotCQkJcmVzb2x2ZXIuc2V0RmlsZUJhc2VMb2NhdGlvbih3b3Jrc3BhY2VGaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXNvbHZlciA9IG5ldyBFeHRlcm5hbFVSSVJlc29sdmVyKGxvY2F0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzb2x2ZXI7Ci0JfQotCi0KLQlJQ29udGVudFR5cGUgZGV0ZWN0Q29udGVudFR5cGUoSVBhdGggbG9jYXRpb24pIHsKLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBudWxsOwotCi0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCWlmIChyZXNvdXJjZS5nZXRUeXBlKCkgPT0gSVJlc291cmNlLkZJTEUgJiYgcmVzb3VyY2UuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCS8vIE9wdGltaXplZCBkZXNjcmlwdGlvbiBsb29rdXAsIG1pZ2h0IG5vdCBzdWNjZWVkCi0JCQkJCWQgPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkICE9IG51bGwpIHsKLQkJCQkJCXR5cGUgPSBkLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkvLyBTaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlCi0JCQkJCS8vIHR5cGUgY2hlY2sgYWJvdmUKLQkJCQl9Ci0JCQkJaWYgKHR5cGUgPT0gbnVsbCkgewotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKHJlc291cmNlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJRmlsZSBmaWxlID0gRmlsZUJ1ZmZlcnMuZ2V0U3lzdGVtRmlsZUF0TG9jYXRpb24obG9jYXRpb24pOwotCQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJCUlucHV0U3RyZWFtIGlucHV0ID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQlpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoaW5wdXQsIGxvY2F0aW9uLnRvT1NTdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGlucHV0ICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJaW5wdXQuY2xvc2UoKTsKLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmICh0eXBlID09IG51bGwpIHsKLQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQpOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQotCXB1YmxpYyBJVGV4dEZpbGVCdWZmZXIgZ2V0QnVmZmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0IGEgYnVmZmVyIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGRvY3VtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkKLQkJCXJldHVybiBpbmZvLmJ1ZmZlcjsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JU3RyaW5nIGdldENvbnRlbnRUeXBlSUQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwpCi0JCQlyZXR1cm4gaW5mby5jb250ZW50VHlwZUlEOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBnZXQvY3JlYXRlIGEgbW9kZWwgd2l0aG91dCBhIGphdmEuaW8uRmlsZSIpOyAvLyROT04tTkxTLTEkIAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihpYWUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSVRleHRGaWxlQnVmZmVyTWFuYWdlciBidWZmZXJNYW5hZ2VyID0gRmlsZUJ1ZmZlcnMuZ2V0VGV4dEZpbGVCdWZmZXJNYW5hZ2VyKCk7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBsb2NhdGlvbiA9IG5ldyBQYXRoKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgY29ubmVjdGluZyB0byBGaWxlICIgKyBsb2NhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1ZmZlck1hbmFnZXIuY29ubmVjdChsb2NhdGlvbiwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IGJ1ZmZlck1hbmFnZXIuZ2V0VGV4dEZpbGVCdWZmZXIobG9jYXRpb24pOwotCQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQlpbmZvLnNlbGZDb25uZWN0ZWQgPSB0cnVlOwotCQkJCW1vZGVsID0gZ2V0TW9kZWwoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJFcnJvciBnZXR0aW5nIG1vZGVsIGZvciAiICsgZmlsZS5nZXRQYXRoKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKElGaWxlIGZpbGUpIHsKLQkJaWYgKGZpbGUgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgZ2V0L2NyZWF0ZSBhIG1vZGVsIHdpdGhvdXQgYW4gSUZpbGUiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCUlUZXh0RmlsZUJ1ZmZlck1hbmFnZXIgYnVmZmVyTWFuYWdlciA9IEZpbGVCdWZmZXJzLmdldFRleHRGaWxlQnVmZmVyTWFuYWdlcigpOwotCQl0cnkgewotCQkJaWYgKExvZ2dlci5ERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgY29ubmVjdGluZyB0byBJRmlsZSAiICsgZmlsZS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gc2VlIFRleHRGaWxlRG9jdW1lbnRQcm92aWRlciNjcmVhdGVGaWxlSW5mbyBhYm91dCB3aHkgd2UgdXNlCi0JCQkvLyBJRmlsZSNnZXRGdWxsUGF0aAotCQkJLy8gaGVyZSwgbm90IElGaWxlI2dldExvY2F0aW9uLgotCQkJSVBhdGggbG9jYXRpb24gPSBmaWxlLmdldEZ1bGxQYXRoKCk7Ci0JCQlpZiAobG9jYXRpb24gIT0gbnVsbCkgewotCQkJCWJ1ZmZlck1hbmFnZXIuY29ubmVjdChsb2NhdGlvbiwgZ2V0UHJvZ3Jlc3NNb25pdG9yKCkpOwotCQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBidWZmZXJNYW5hZ2VyLmdldFRleHRGaWxlQnVmZmVyKGxvY2F0aW9uKTsKLQkJCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCQkJRG9jdW1lbnRJbmZvIGluZm8gPSAoRG9jdW1lbnRJbmZvKSBmRG9jdW1lbnRNYXAuZ2V0KGJ1ZmZlci5nZXREb2N1bWVudCgpKTsKLQkJCQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJCQkJLyoKLQkJCQkJCSAqIE5vdGU6ICJpbmZvIiBiZWluZyBudWxsIGF0IHRoaXMgcG9pbnQgaXMgYSBzbGlnaHQKLQkJCQkJCSAqIGVycm9yLgotCQkJCQkJICogCi0JCQkJCQkgKiBUaGUgY29ubmVjdCBjYWxsIGZyb20gYWJvdmUgKG9yIGF0IHNvbWUgdGltZQotCQkJCQkJICogZWFybGllciBpbiB0aGUgc2Vzc2lvbikgd291bGQgaGF2ZSBub3RpZmllZCB0aGUKLQkJCQkJCSAqIEZpbGVCdWZmZXJNYXBwZXIgb2YgdGhlIGNyZWF0aW9uIG9mIHRoZQotCQkJCQkJICogY29ycmVzcG9uZGluZyB0ZXh0IGJ1ZmZlciBhbmQgY3JlYXRlZCB0aGUKLQkJCQkJCSAqIERvY3VtZW50SW5mbyBvYmplY3QgZm9yIElTdHJ1Y3R1cmVkRG9jdW1lbnRzLgotCQkJCQkJICovCi0JCQkJCQlpbmZvLnNlbGZDb25uZWN0ZWQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCS8qCi0JCQkJCSAqIENoZWNrIHRoZSBkb2N1bWVudCB0eXBlLiBBbHRob3VnaCByZXR1cm5pbmcgbnVsbCBmb3IKLQkJCQkJICogdW5rbm93biBkb2N1bWVudHMgd291bGQgYmUgZmFpciwgdHJ5IHRvIGdldCBhIG1vZGVsIGlmCi0JCQkJCSAqIHRoZSBkb2N1bWVudCBpcyBhdCBsZWFzdCBhIHZhbGlkIHR5cGUuCi0JCQkJCSAqLwotCQkJCQlJRG9jdW1lbnQgYnVmZmVyRG9jdW1lbnQgPSBidWZmZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJaWYgKGJ1ZmZlckRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQkJbW9kZWwgPSBnZXRNb2RlbCgoSVN0cnVjdHVyZWREb2N1bWVudCkgYnVmZmVyRG9jdW1lbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkVycm9yIGdldHRpbmcgbW9kZWwgZm9yICIgKyBmaWxlLmdldExvY2F0aW9uKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCUV4Y2VwdGlvbiBpYWUgPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4gbm90IGdldC9jcmVhdGUgYSBtb2RlbCB3aXRob3V0IGEgZG9jdW1lbnQgcmVmZXJlbmNlIik7IC8vJE5PTi1OTFMtMSQgCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGlhZSk7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCWlmIChpbmZvICE9IG51bGwgJiYgaW5mby5tb2RlbCA9PSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBjcmVhdGluZyBtb2RlbCBmb3IgIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkgKyAiICIgKyBpbmZvLmJ1ZmZlci5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlpbmZvLm1vZGVsUmVmZXJlbmNlQ291bnQrKzsKLQotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKGluZm8uY29udGVudFR5cGVJRCk7Ci0JCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkJbW9kZWwgPSBsb2FkZXIuY3JlYXRlTW9kZWwoZG9jdW1lbnQsIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSwgaGFuZGxlcik7Ci0JCQl0cnkgewotCQkJCWluZm8ubW9kZWwgPSBtb2RlbDsKLQkJCQltb2RlbC5zZXRJZChpbmZvLmJ1ZmZlci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJCS8vIGhhbmRsZXIgbm93IHNldCBieSBsb2FkZXIsIGZvciBub3cKLQkJCQkvLyBtb2RlbC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCQkJaWYgKG1vZGVsIGluc3RhbmNlb2YgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgbW9kZWwpLnNldENvbnRlbnRUeXBlSWRlbnRpZmllcihpbmZvLmNvbnRlbnRUeXBlSUQpOwotCQkJCX0KLQkJCQltb2RlbC5zZXRSZXNvbHZlcihjcmVhdGVVUklSZXNvbHZlcihnZXRCdWZmZXIoZG9jdW1lbnQpKSk7Ci0JCQkJaWYgKGluZm8uYnVmZmVyLmlzRGlydHkoKSkgewotCQkJCQltb2RlbC5zZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChSZXNvdXJjZUluVXNlIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJhdHRlbXB0ZWQgdG8gY3JlYXRlIG5ldyBtb2RlbCB3aXRoIGV4aXN0aW5nIElEIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQltb2RlbCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmV0dXJuIGluZm8ubW9kZWw7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVByb2dyZXNzTW9uaXRvciBnZXRQcm9ncmVzc01vbml0b3IoKSB7Ci0JCXJldHVybiBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRXhpc3RpbmdCdWZmZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlFeGNlcHRpb24gaWFlID0gbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjaGVjayBmb3IgYW4gZXhpc3RpbmcgYnVmZmVyIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCURvY3VtZW50SW5mbyBpbmZvID0gKERvY3VtZW50SW5mbykgZkRvY3VtZW50TWFwLmdldChkb2N1bWVudCk7Ci0JCXJldHVybiBpbmZvICE9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZU1vZGVsKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgcmVsZWFzZSBhIG1vZGVsIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybjsKLQkJfQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0ZJTEVCVUZGRVJNT0RFTE1BTkFHRU1FTlQpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBub3RpY2VkIGZ1bGwgcmVsZWFzZSBvZiBtb2RlbCBmb3IgIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkgKyAiICIgKyBpbmZvLmJ1ZmZlci5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlpbmZvLm1vZGVsID0gbnVsbDsKLQkJCWluZm8ubW9kZWxSZWZlcmVuY2VDb3VudC0tOwotCQkJaWYgKGluZm8uc2VsZkNvbm5lY3RlZCkgewotCQkJCWlmIChMb2dnZXIuREVCVUdfRklMRUJVRkZFUk1PREVMTUFOQUdFTUVOVCkgewotCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiRmlsZUJ1ZmZlck1vZGVsTWFuYWdlciBkaXNjb25uZWN0aW5nIGZyb20gIiArIGluZm8uYnVmZmVyLmdldExvY2F0aW9uKCkgKyAiICIgKyBpbmZvLmJ1ZmZlci5nZXREb2N1bWVudCgpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJCUlQYXRoIGxvY2F0aW9uID0gaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCQl0cnkgewotCQkJCQlGaWxlQnVmZmVycy5nZXRUZXh0RmlsZUJ1ZmZlck1hbmFnZXIoKS5kaXNjb25uZWN0KGxvY2F0aW9uLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgcmVsZWFzaW5nIG1vZGVsIGZvciAiICsgbG9jYXRpb24sIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmV2ZXJ0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkgewotCQkJRXhjZXB0aW9uIGlhZSA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgcmVsZWFzZSBhIG1vZGVsIHdpdGhvdXQgYSBkb2N1bWVudCByZWZlcmVuY2UiKTsgLy8kTk9OLU5MUy0xJCAKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaWFlKTsKLQkJCXJldHVybjsKLQkJfQotCQlEb2N1bWVudEluZm8gaW5mbyA9IChEb2N1bWVudEluZm8pIGZEb2N1bWVudE1hcC5nZXQoZG9jdW1lbnQpOwotCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkZpbGVCdWZmZXJNb2RlbE1hbmFnZXIgd2FzIGFza2VkIHRvIHJldmVydCBhIGRvY3VtZW50IGJ1dCB3YXMgbm90IGJlaW5nIG1hbmFnZWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWVsc2UgewotCQkJLy8gZ2V0IHBhdGgganVzdCBmb3IgcG90ZW50aWFsIGVycm9yIG1lc3NhZ2UKLQkJCUlQYXRoIGxvY2F0aW9uID0gaW5mby5idWZmZXIuZ2V0TG9jYXRpb24oKTsKLQkJCXRyeSB7Ci0JCQkJLy8gSVNTVUU6IGluIGZ1dHVyZSwgY2xpZW50cyBzaG91bGQgcHJvdmlkZSBwcm9ncmVzcyBtb25pdG9yCi0JCQkJaW5mby5idWZmZXIucmV2ZXJ0KGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBJU1NVRTogc2hvdWRsIHdlIG5vdCBiZSByZS10aHJvd2luZyBDb3JlRXhjZXB0aW9ucz8gT3IKLQkJCQkvLyBub3QgY2F0Y2ggdGhlbSBhdCBhbGw/Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXJyb3IgcmV2ZXJ0aW5nIG1vZGVsIGZvciAiICsgbG9jYXRpb24sIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lFeGVjdXRpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JRXhlY3V0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAwNDkxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0lFeGVjdXRpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElFeGVjdXRpb25EZWxlZ2F0ZSB7Ci0KLQl2b2lkIGV4ZWN1dGUoUnVubmFibGUgcnVubmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JTG9ja2FibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSUxvY2thYmxlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZWMyMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9JTG9ja2FibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLQotLyoqCi0gKiAKLSAqIE5vdCBBUEk6IG5vdCB0byBiZSB1c2VkIG9yIGltcGxlbWVudGVkIGJ5IGNsaWVudHMuIFRoaXMgaXMgYSBzcGVjaWFsCi0gKiBwdXJwb3NlIGludGVyZmFjZSB0byBoZWxwIGd1YXJkIHNvbWUgdGhyZWFkaW5nIGlzc3VlcyBiZXR3ZWVlbiBtb2RlbCBhbmQKLSAqIGRvY3VtZW50LiBXaWxsIGJlIGNoYW5nZWQgc29vbi4KLSAqICAKLSAqLwotCi1wdWJsaWMgaW50ZXJmYWNlIElMb2NrYWJsZSB7Ci0KLQlJTG9jayBnZXRMb2NrT2JqZWN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvSlNQQXdhcmVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9KU1BBd2FyZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYmMxODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9KU1BBd2FyZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkVtYmVkZGVkVHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci0KLQotcHVibGljIGludGVyZmFjZSBKU1BBd2FyZUFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQl2b2lkIGluaXRpYWxpemVXaXRoKEVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Mb2dnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI2NWQ3ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogdHJ1ZSBpZiBib3RoIHBsYXRmb3JtIGFuZCB0aGlzIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IFBsYXRmb3JtLmluRGVidWdNb2RlKCkgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kZWJ1ZyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgYWRhcHRlcgotCSAqIG5vdGlmaWNhdGlvbiB0aW1lCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0FEQVBURVJOT1RJRklDQVRJT05USU1FID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9kb20vYWRhcHRlci9ub3RpZmljYXRpb24vdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgc3RydWN0dXJlZAotCSAqIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX0RPQ1VNRU5UID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkZG9jdW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIGZpbGUgYnVmZmVyCi0JICogbW9kZWwgbWFuYWdlbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19GSUxFQlVGRkVSTU9ERUxNQU5BR0VNRU5UID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9maWxlYnVmZmVycy9tb2RlbG1hbmFnZW1lbnQiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRleHQgYnVmZmVyCi0JICogbGlmZWN5Y2xlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RFWFRCVUZGRVJMSUZFQ1lDTEUgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL2ZpbGVidWZmZXJzL2xpZmVjeWNsZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgbW9kZWwKLQkgKiBsaWZlY3ljbGUKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfTElGRUNZQ0xFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvbGlmZWN5Y2xlIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyBtb2RlbCBzdGF0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19NT0RFTFNUQVRFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zdHJ1Y3R1cmVkbW9kZWwvc3RhdGUiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIG1vZGVsIGxvY2sKLQkgKiBzdGF0ZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19NT0RFTExPQ0sgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3N0cnVjdHVyZWRtb2RlbC9sb2NrcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgbW9kZWwKLQkgKiBtYW5hZ2VyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX01PREVMTUFOQUdFUiA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3RydWN0dXJlZG1vZGVsL21vZGVsbWFuYWdlciIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1RBU0tTID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogY29udGVudCB0eXBlIGRldGVjdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU0NPTlRFTlRUWVBFID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9kZXRlY3Rpb24iKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCS8qKgotCSAqIHRydWUgaWYgcGxhdGZvcm0gYW5kIHBsdWdpbiBhcmUgaW4gZGVidWcgbW9kZSBhbmQgZGVidWdnaW5nIHRhc2sgdGFncwotCSAqIGpvYnMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NKT0IgPSBERUJVRyAmJiAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3Rhc2tzL2pvYiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogb3ZlcmFsbCBwZXJmb3JtYW5jZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU09WRVJBTExQRVJGID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9vdmVyYWxsdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NQRVJGID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy90aW1lIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKioKLQkgKiB0cnVlIGlmIHBsYXRmb3JtIGFuZCBwbHVnaW4gYXJlIGluIGRlYnVnIG1vZGUgYW5kIGRlYnVnZ2luZyB0YXNrIHRhZ3MKLQkgKiBwcmVmZXJlbmNlcwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVR19UQVNLU1BSRUZTID0gREVCVUcgJiYgInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLyoqCi0JICogdHJ1ZSBpZiBwbGF0Zm9ybSBhbmQgcGx1Z2luIGFyZSBpbiBkZWJ1ZyBtb2RlIGFuZCBkZWJ1Z2dpbmcgdGFzayB0YWdzCi0JICogcmVnaXN0cnkKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEFTS1NSRUdJU1RSWSA9IERFQlVHICYmICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcmVnaXN0cnkiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JLyoKLQkgKiBLZWVwIG91ciBvd24gY29weSBpbiBjYXNlIHdlIHdhbnQgdG8gYWRkIG90aGVyIHNldmVyaXR5IGxldmVscwotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKGxldmVsLCBQTFVHSU5fSUQsIGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFdyaXRlIGEgbWVzc2FnZSB0byB0aGUgbG9nIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGxldmVsCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBFUlJPUiwgV0FSTklORywgSU5GTywgT0sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSkgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgYSBtZXNzYWdlIGFuZCBleGNlcHRpb24gdG8gdGhlIGxvZyB3aXRoIHRoZSBnaXZlbiBzZXZlcml0eSBsZXZlbAotCSAqIAotCSAqIEBwYXJhbSBsZXZlbAotCSAqICAgICAgICAgICAgRVJST1IsIFdBUk5JTkcsIElORk8sIE9LCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIG1lc3NhZ2UgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdG8gYWRkIHRvIHRoZSBsb2cKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIGV4Y2VwdGlvbiBhcyBhbiBlcnJvciBpbiB0aGUgbG9nIGFsb25nIHdpdGggYW4gYWNjb21wYW55aW5nCi0JICogbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICBtZXNzYWdlIHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRvIGFkZCB0byB0aGUgbG9nCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogV3JpdGVzIHRoZSBleGNlcHRpb24gYXMgYW4gZXJyb3IgaW4gdGhlIGxvZwotCSAqIAotCSAqIEBwYXJhbSBleGNlcHRpb24KLQkgKiAgICAgICAgICAgIGV4Y2VwdGlvbiB0byBhZGQgdG8gdGhlIGxvZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKElTdGF0dXMuRVJST1IsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCksIGV4Y2VwdGlvbik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Nb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9Nb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTRiNzg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIE1vZGVsTWFuYWdlclBsdWdpblJlZ2lzdHJ5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAocmVhZGVyID09IG51bGwpIHsKLQkJCXJlYWRlciA9IG5ldyBNb2RlbE1hbmFnZXJQbHVnaW5SZWdpc3RyeVJlYWRlcigpOwotCQl9Ci0JCXJldHVybiByZWFkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBBVFRSX0FEQVBURVJLRVkgPSAiYWRhcHRlcktleUNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQ09OVEVOVFRZUEUgPSAidHlwZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfUkVHSVNURVJBREFQVEVSID0gInJlZ2lzdGVyQWRhcHRlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJhZGFwdE9uQ3JlYXRlRmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gIkFkYXB0T25DcmVhdGVGYWN0b3J5IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogWE1MRWRpdG9yUGx1Z2luUmVnaXN0cnlSZWFkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTW9kZWxNYW5hZ2VyUGx1Z2luUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0RmFjdG9yaWVzKElEb2N1bWVudFR5cGVIYW5kbGVyIGhhbmRsZXIpIHsKLQkJcmV0dXJuIGxvYWRSZWdpc3RyeShoYW5kbGVyLmdldElkKCkpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZhY3RvcmllcyhTdHJpbmcgdHlwZSkgewotCQlyZXR1cm4gbG9hZFJlZ2lzdHJ5KHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXJGYWN0b3J5IGxvYWRGYWN0b3J5RnJvbUNvbmZpZ3VyYXRpb25FbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBPYmplY3QgcmVxdWVzdGVyVHlwZSkgewotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DT05URU5UVFlQRSk7Ci0JCQlpZiAoIWNvbnRlbnRUeXBlLmVxdWFscyhyZXF1ZXN0ZXJUeXBlKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCVN0cmluZyBjbGFzc05hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0NMQVNTKTsKLQkJCVN0cmluZyBhZGFwdGVyS2V5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0FEQVBURVJLRVkpOwotCQkJU3RyaW5nIHJlZ2lzdGVyQWRhcHRlcnMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1JFR0lTVEVSQURBUFRFUik7Ci0KLQkJCS8vIGlmIGNsYXNzTmFtZSBpcyBudWxsLCB0aGVuIG5vIG9uZSBkZWZpbmVkIHRoZSBleHRlbnNpb24gcG9pbnQKLQkJCS8vIGZvciBhZGFwdGVyIGZhY3RvcmllcwotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJCUJ1bmRsZSBidW5kbGUgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShuYW1lKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlmIGFuIGVycm9yIG9jY3VycyBoZXJlLCBpdHMgcHJvYmFibHkgdGhhdCB0aGUgcGx1Z2luCi0JCQkJCS8vIGNvdWxkIG5vdCBiZSBmb3VuZC9sb2FkZWQKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgYnVuZGxlOiAiICsgbmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCX0KLQkJCQlpZiAoYnVuZGxlICE9IG51bGwpIHsKLQkJCQkJYm9vbGVhbiB1c2VFeHRlbmRlZENvbnN0cnVjdG9yID0gZmFsc2U7Ci0JCQkJCWJvb2xlYW4gZG9SZWdpc3RlckFkYXB0ZXJzID0gZmFsc2U7Ci0JCQkJCU9iamVjdCBhZGFwdGVyS2V5ID0gbnVsbDsKLQotCQkJCQlpZiAocmVnaXN0ZXJBZGFwdGVycyAhPSBudWxsICYmIHJlZ2lzdGVyQWRhcHRlcnMubGVuZ3RoKCkgPiAwICYmIEJvb2xlYW4udmFsdWVPZihyZWdpc3RlckFkYXB0ZXJzKS5ib29sZWFuVmFsdWUoKSkgewotCQkJCQkJZG9SZWdpc3RlckFkYXB0ZXJzID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQlpZiAoYWRhcHRlcktleUNsYXNzICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJQ2xhc3MgYUNsYXNzID0gbnVsbDsKLQkJCQkJCQkvLyBhQ2xhc3MgPSBjbGFzc0xvYWRlciAhPSBudWxsID8KLQkJCQkJCQkvLyBjbGFzc0xvYWRlci5sb2FkQ2xhc3MoYWRhcHRlcktleUNsYXNzKSA6Ci0JCQkJCQkJLy8gQ2xhc3MuZm9yTmFtZShhZGFwdGVyS2V5Q2xhc3MpOwotCQkJCQkJCWlmIChidW5kbGUuZ2V0U3RhdGUoKSAhPSBCdW5kbGUuVU5JTlNUQUxMRUQpIHsKLQkJCQkJCQkJYUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhhZGFwdGVyS2V5Q2xhc3MpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYUNsYXNzID0gQ2xhc3MuZm9yTmFtZShhZGFwdGVyS2V5Q2xhc3MpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoYUNsYXNzICE9IG51bGwpIHsKLQkJCQkJCQkJdXNlRXh0ZW5kZWRDb25zdHJ1Y3RvciA9IHRydWU7Ci0JCQkJCQkJCWFkYXB0ZXJLZXkgPSBhQ2xhc3M7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlhZGFwdGVyS2V5ID0gYWRhcHRlcktleUNsYXNzOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWNhdGNoIChFeGNlcHRpb24gYW55RXJyb3JzKSB7Ci0JCQkJCQkJYWRhcHRlcktleSA9IGFkYXB0ZXJLZXlDbGFzczsKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXRyeSB7Ci0JCQkJCQlDbGFzcyB0aGVDbGFzcyA9IG51bGw7Ci0JCQkJCQkvLyBDbGFzcyB0aGVDbGFzcyA9IGNsYXNzTG9hZGVyICE9IG51bGwgPwotCQkJCQkJLy8gY2xhc3NMb2FkZXIubG9hZENsYXNzKGNsYXNzTmFtZSkgOgotCQkJCQkJLy8gQ2xhc3MuZm9yTmFtZShjbGFzc05hbWUpOwotCQkJCQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpICE9IEJ1bmRsZS5VTklOU1RBTExFRCkgewotCQkJCQkJCXRoZUNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc05hbWUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJdGhlQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKGNsYXNzTmFtZSk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodXNlRXh0ZW5kZWRDb25zdHJ1Y3RvcikgewotCQkJCQkJCWphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yW10gY3RvcnMgPSB0aGVDbGFzcy5nZXRDb25zdHJ1Y3RvcnMoKTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGN0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCUNsYXNzW10gcGFyYW1UeXBlcyA9IGN0b3JzW2ldLmdldFBhcmFtZXRlclR5cGVzKCk7Ci0JCQkJCQkJCWlmIChjdG9yc1tpXS5pc0FjY2Vzc2libGUoKSAmJiBwYXJhbVR5cGVzLmxlbmd0aCA9PSAyICYmIHBhcmFtVHlwZXNbMF0uZXF1YWxzKE9iamVjdC5jbGFzcykgJiYgcGFyYW1UeXBlc1sxXS5lcXVhbHMoYm9vbGVhbi5jbGFzcykpIHsKLQkJCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQkJZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBjdG9yc1tpXS5uZXdJbnN0YW5jZShuZXcgT2JqZWN0W117YWRhcHRlcktleSwgbmV3IEJvb2xlYW4oZG9SZWdpc3RlckFkYXB0ZXJzKX0pOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24KLQkJCQkJCQkJCQkvLyBub3QgdG8KLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uCi0JCQkJCQkJCQkJLy8gbm90IHRvCi0JCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24KLQkJCQkJCQkJCQkvLyBub3QgdG8KLQkJCQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWNhdGNoIChFeGNlcHRpb25JbkluaXRpYWxpemVyRXJyb3IgZSkgewotCQkJCQkJCQkJCS8vIGxvZyBvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbgotCQkJCQkJCQkJCS8vIG5vdCB0bwotCQkJCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCQkJCQlmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRSX0NMQVNTKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gbG9nIG9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWN0b3J5OwotCX0KLQotCXByb3RlY3RlZCBMaXN0IGxvYWRSZWdpc3RyeShPYmplY3QgY29udGVudFR5cGUpIHsKLQkJTGlzdCBmYWN0b3J5TGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gZXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQoU1NFQ29yZVBsdWdpbi5JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbG9hZEZhY3RvcnlGcm9tQ29uZmlndXJhdGlvbkVsZW1lbnQoZWxlbWVudHNbaV0sIGNvbnRlbnRUeXBlKTsKLQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCQlmYWN0b3J5TGlzdC5hZGQoZmFjdG9yeSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm9DYW5jZWxQcm9ncmVzc01vbml0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm9DYW5jZWxQcm9ncmVzc01vbml0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlmMTI5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk51bGxQcm9ncmVzc01vbml0b3I7Ci0KLQotcHVibGljIGNsYXNzIE5vQ2FuY2VsUHJvZ3Jlc3NNb25pdG9yIGV4dGVuZHMgTnVsbFByb2dyZXNzTW9uaXRvciB7Ci0KLQotCXB1YmxpYyBOb0NhbmNlbFByb2dyZXNzTW9uaXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yI2lzQ2FuY2VsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsZWQoKSB7Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTm90SW1wbGVtZW50ZWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EwYjk4NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL05vdEltcGxlbWVudGVkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotCi1wdWJsaWMgY2xhc3MgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotCQlzdXBlcihtZXNzYWdlKTsKLQl9Ci0KLQlwdWJsaWMgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0JfQotCi0JcHVibGljIE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgewotCQlzdXBlcihjYXVzZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9OdWxsTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjNjNzJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWY3YjVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLQotcHVibGljIGludGVyZmFjZSBQcm9wYWdhdGluZ0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0Jdm9pZCBhZGRBZGFwdE9uQ3JlYXRlRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpOwotCi0JTGlzdCBnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGltbWVkaWF0ZWx5IGFmdGVyIGFkZGluZyBhIGZhY3RvcnksCi0JICogdHlwaWNhbGx5IG9uIHRoZSBkb2N1bWVudCAodG9wIGxldmVsKSBub2RlLCBzbyBhbGwgbm9kZXMgY2FuIGJlCi0JICogYWRhcHRlZCwgaWYgbmVlZGVkLiBUaGlzIGlzIG5lZWRlZCBmb3IgdGhvc2Ugb2NjYXNpb25zIHdoZW4gYSBmYWN0b3J5Ci0JICogaXMgYWRkZWRlZCBhZnRlciBzb21lIG5vZGVzIG1heSBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkIGF0IHRoZSB0aW1lCi0JICogdGhlIGZhY3RvcnkgaXMgYWRkZWQuCi0JICovCi0Jdm9pZCBpbml0aWFsaXplRm9yRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnksIElOb2RlTm90aWZpZXIgbm9kZSk7Ci0KLQkvLyBkbXc6IHNob3VsZCBoYXZlIGdldEZhY3RvcnlGb3I/Ci0Jdm9pZCByZWxlYXNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1Byb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDkyODgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0KLQotcHVibGljIGludGVyZmFjZSBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgSU5vZGVBZGFwdGVyRmFjdG9yeSB7Ci0KLQl2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSk7Ci0KLQl2b2lkIHNldENvbnRyaWJ1dGVkRmFjdG9yaWVzKEFycmF5TGlzdCBsaXN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZU1lc3NhZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmQxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlTWVzc2FnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICAgVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZgotICogdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzCi0gKiBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiAKLSAqIElCTSAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFNTRSBDb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU1NFQ29yZU1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTU0VDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQotCXByaXZhdGUgU1NFQ29yZU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFfbW9kZWxfc19pZF9jYW5fbm90X2JlX251X0VYQ187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcmlnaW5hbF9FcnJvcl9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRfQ2hhbmdlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrU2Nhbm5lcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tTY2FubmluZ0pvYl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tTY2FubmluZ0pvYl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1pZ3JhdGVfQ2hhcnNldDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODQ2OWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9TU0VDb3JlUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi0vKioKLSAqIFNTRSBDb3JlIFBsdWdpbi4KLSAqLwotcHVibGljIGNsYXNzIFNTRUNvcmVQbHVnaW4gZXh0ZW5kcyBQbHVnaW4gewotCXN0YXRpYyBTU0VDb3JlUGx1Z2luIGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU1NFQ29yZVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIFNTRUNvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgZGVmYXVsdCBub24tVUkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRGVmYXVsdFBsdWdpblByZWZlcmVuY2VzKCkgewotCQlQcmVmZXJlbmNlcyBwcmVmcyA9IGdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQkvLyBzZXQgbW9kZWwgcHJlZmVyZW5jZSBkZWZhdWx0cwotCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgsIGZhbHNlKTsKLQkJCi0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFTS19UQUdfRU5BQkxFLCBmYWxzZSk7Ci0JCXByZWZzLnNldERlZmF1bHQoQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMuVEFTS19UQUdfVEFHUywgIlRPRE8sRklYTUUsWFhYIik7IC8vJE5PTi1OTFMtMSQKLQkJcHJlZnMuc2V0RGVmYXVsdChDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQVNLX1RBR19QUklPUklUSUVTLCAiMSwyLDEiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdG9wKG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0KQotCSAqLwotCXB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCUZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuc2h1dGRvd24oKTsKLQotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbiNzdGFydChvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQotCQkvLyBpbml0aWFsaXplIEZpbGVCdWZmZXIgaGFuZGxpbmcKLQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5zdGFydHVwKCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlwdWJsaWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JICovCi0JcHVibGljIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlyZXR1cm4gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL1NTRUNvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTIyZjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvU1NFQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BX21vZGVsX3NfaWRfY2FuX25vdF9iZV9udV9FWENfPUEgbW9kZWwncyBpZCBjYW4gbm90IGJlIG51bGwKLVByb2dyYW1fRXJyb3JfX01vZGVsTWFuYWdlX0VYQ189UHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlCi1PcmlnaW5hbF9FcnJvcl9fVUlfPU9yaWdpbmFsIEVycm9yOgotVGV4dF9DaGFuZ2VfVUlfPVRleHQgQ2hhbmdlCi1UYXNrU2Nhbm5lcl8wPVNjYW5uaW5nIGZvciBUYXNrcwotVGFza1NjYW5uaW5nSm9iXzA9U2Nhbm5pbmcKLVRhc2tTY2FubmluZ0pvYl8xPUVycm9ycyB3aGlsZSBkZXRlY3RpbmcgVGFza3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLU1pZ3JhdGVfQ2hhcnNldD1NaWdyYXRlIENoYXJzZXQKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvQWJzdHJhY3RTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzQzYTdhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQlwdWJsaWMgYm9vbGVhbiByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzID0gdHJ1ZTsgLy8gc3BlY2lhbCBmbGFnIGZvciBKVW5pdAotCi0JLy8gdGVzdHMgdG8gc2tpcCByZWZyZXNoCi0JLy8gb2YgY2xlYW51cCBwcmVmZXJlbmNlcwotCS8vIHdoZW4gaXQncyBzZXQgdG8gZmFsc2UKLQotCXB1YmxpYyBTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQuZ2V0Qnl0ZXMoIlVURjgiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBpZCA9IGlucHV0U3RyZWFtLnRvU3RyaW5nKCkgKyBnZXRDb250ZW50VHlwZSgpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoaWQsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgMCwgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKTsKLQotCQkJLy8gcmV0dXJuIG91dHB1dAotCQkJcmV0dXJuIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuc3VyZUNsb3NlZChudWxsLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgY2xlYW51cENvbnRlbnQoU3RyaW5nIGlucHV0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygiVVRGOCIpKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArIGdldENvbnRlbnRUeXBlKCk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gcmV0dXJuIG91dHB1dAotCQkJcmV0dXJuIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXQoKTsKLQkJfSBmaW5hbGx5IHsKLQkJCWVuc3VyZUNsb3NlZChudWxsLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQotCQkJLy8gc2F2ZSBtb2RlbCBpZiBuZWVkZWQKLQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoc3RhcnQgPj0gMCAmJiBsZW5ndGggPj0gMCAmJiBzdGFydCArIGxlbmd0aCA8PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZgotCQkJCS8vIG1vZGVsIGNoYW5nZWQuCi0JCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0KLQkJCQkvLyBjbGVhbnVwCi0JCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJCX0gZmluYWxseSB7Ci0JCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBudWxsKTsKLQkJCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgMCwgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKTsKLQotCQkJLy8gc2F2ZSBvdXRwdXQgdG8gZmlsZQotCQkJLy9vdXRwdXRTdHJlYW0gPSBuZXcKLQkJCS8vIEZpbGVPdXRwdXRTdHJlYW0oZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOwotCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoZmlsZSk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvL2Vuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhbnVwRmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJLy9PdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZSk7Ci0KLQkJCS8vIGNsZWFudXAKLQkJCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkvLyBzYXZlIG91dHB1dCB0byBmaWxlCi0JCQkvL291dHB1dFN0cmVhbSA9IG5ldwotCQkJLy8gRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZShmaWxlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCS8vZW5zdXJlQ2xvc2VkKG91dHB1dFN0cmVhbSwgbnVsbCk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvL091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQl0cnkgewotCQkJLy8gc2V0dXAgc3RydWN0dXJlZE1vZGVsCi0JCQlpbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotCQkJc3RydWN0dXJlZE1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvclJlYWQoZmlsZU5hbWUsIGlucHV0U3RyZWFtLCBudWxsKTsKLQotCQkJLy8gY2xlYW51cAotCQkJY2xlYW51cE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgMCwgc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKTsKLQotCQkJLy8gc2F2ZSBvdXRwdXQgdG8gZmlsZQotCQkJLy9vdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCS8vT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBjbGVhbnVwCi0JCQljbGVhbnVwTW9kZWwoc3RydWN0dXJlZE1vZGVsLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJLy8gc2F2ZSBvdXRwdXQgdG8gZmlsZQotCQkJLy9vdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuc2F2ZSgpOwotCQl9IGZpbmFsbHkgewotCQkJLy9lbnN1cmVDbG9zZWQob3V0cHV0U3RyZWFtLCBpbnB1dFN0cmVhbSk7Ci0JCQkvLyByZWxlYXNlIGZyb20gbW9kZWwgbWFuYWdlcgotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCWNsZWFudXBNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlpZiAoKHN0YXJ0ID49IDApICYmIChsZW5ndGggPD0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpKSkgewotCQkJCVZlY3RvciBhY3RpdmVOb2RlcyA9IGdldEFjdGl2ZU5vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJaWYgKGFjdGl2ZU5vZGVzLnNpemUoKSA+IDApIHsKLQkJCQkJTm9kZSBmaXJzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMuZmlyc3RFbGVtZW50KCk7Ci0JCQkJCU5vZGUgbGFzdE5vZGUgPSAoTm9kZSkgYWN0aXZlTm9kZXMubGFzdEVsZW1lbnQoKTsKLQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCU5vZGUgZWFjaE5vZGUgPSBmaXJzdE5vZGU7Ci0JCQkJCU5vZGUgbmV4dE5vZGUgPSBudWxsOwotCQkJCQl3aGlsZSAoIWRvbmUpIHsKLQkJCQkJCS8vIHVwZGF0ZSAiZG9uZSIKLQkJCQkJCWRvbmUgPSAoZWFjaE5vZGUgPT0gbGFzdE5vZGUpOwotCi0JCQkJCQkvLyBnZXQgbmV4dCBzaWJsaW5nIGJlZm9yZSBjbGVhbnVwIGJlY2F1c2UgZWFjaE5vZGUKLQkJCQkJCS8vIG1heQotCQkJCQkJLy8gYmUgZGVsZXRlZCwKLQkJCQkJCS8vIGZvciBleGFtcGxlIHdoZW4gaXQncyBhbiBlbXB0eSB0ZXh0IG5vZGUKLQkJCQkJCW5leHROb2RlID0gZWFjaE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJLy8gY2xlYW51cCBzZWxlY3RlZCBub2RlKHMpCi0JCQkJCQljbGVhbnVwTm9kZShlYWNoTm9kZSk7Ci0KLQkJCQkJCS8vIHVwZGF0ZSBlYWNoIG5vZGUKLQkJCQkJCWlmIChuZXh0Tm9kZSAhPSBudWxsICYmIG5leHROb2RlLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKQotCQkJCQkJCS8vIG5leHROb2RlIGlzIGRlbGV0ZWQgZHVyaW5nIGNsZWFudXAKLQkJCQkJCQllYWNoTm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZWFjaE5vZGUgPSBuZXh0Tm9kZTsKLQotCQkJCQkJLy8gVGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZQotCQkJCQkJLy8gc29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB3aXRoIGVhY2hOb2RlLgotCQkJCQkJLy8gV2UgZG9uJ3Qgd2FudCBhbiBpbmZpbml0ZSBsb29wIGhlcmUuCi0JCQkJCQlpZiAoZWFjaE5vZGUgPT0gbnVsbCkKLQkJCQkJCQlkb25lID0gdHJ1ZTsKLQkJCQkJfQotCi0JCQkJCS8vIGZvcm1hdCBzb3VyY2UKLQkJCQkJaWYgKGdldEZvcm1hdFNvdXJjZVByZWZlcmVuY2Uoc3RydWN0dXJlZE1vZGVsKSkgewotCQkJCQkJLy8gZm9ybWF0IHRoZSBkb2N1bWVudAotCQkJCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gZ2V0Rm9ybWF0UHJvY2Vzc29yKCk7Ci0JCQkJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0TW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQkJCQkJfQotCi0JCQkJCS8vIGNvbnZlcnQgRU9MIGNvZGVzCi0JCQkJCWlmIChnZXRDb252ZXJ0RU9MQ29kZXNQcmVmZXJlbmNlKHN0cnVjdHVyZWRNb2RlbCkpIHsKLQkJCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCVN0cmluZyBlbmRPZkxpbmVDb2RlID0gZ2V0RU9MQ29kZVByZWZlcmVuY2Uoc3RydWN0dXJlZE1vZGVsKTsKLQkJCQkJCVN0cmluZyBlbmRPZkxpbmVDb2RlU3RyaW5nID0gbnVsbDsKLQkJCQkJCWlmIChlbmRPZkxpbmVDb2RlLmNvbXBhcmVUbyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikgPT0gMCkKLQkJCQkJCQllbmRPZkxpbmVDb2RlU3RyaW5nID0gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuU1RSSU5HX0xGOwotCQkJCQkJZWxzZSBpZiAoZW5kT2ZMaW5lQ29kZS5jb21wYXJlVG8oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpID09IDApCi0JCQkJCQkJZW5kT2ZMaW5lQ29kZVN0cmluZyA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUjsKLQkJCQkJCWVsc2UgaWYgKGVuZE9mTGluZUNvZGUuY29tcGFyZVRvKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSTEYpID09IDApCi0JCQkJCQkJZW5kT2ZMaW5lQ29kZVN0cmluZyA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUkxGOwotCQkJCQkJaWYgKGVuZE9mTGluZUNvZGVTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJCWNvbnZlcnRMaW5lRGVsaW1pdGVycyhkb2N1bWVudCwgZW5kT2ZMaW5lQ29kZVN0cmluZyk7Ci0JCQkJCQkJLy8gRE1XOiA4LzI0LzIwMDIgc2V0dGluZyBsaW5lIGRlbGltaXRlciBpbgotCQkJCQkJCS8vIGRvY3VtZW50IGFsbG93cwotCQkJCQkJCS8vIHN1YnNlcXVlbnQgZWRpdGluZyB0byBpbnNlcnQgdGhlIHNhbWUgbGluZQotCQkJCQkJCS8vIGRlbGltaXRlci4KLQkJCQkJCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQpLnNldExpbmVEZWxpbWl0ZXIoZW5kT2ZMaW5lQ29kZVN0cmluZyk7Ci0JCQkJCQkJfQotCQkJCQkJCXN0cnVjdHVyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCU5vZGUgY2xlYW51cE5vZGUgPSBub2RlOwotCi0JCQkvLyBjbGVhbnVwIHRoZSBvd25lciBub2RlIGlmIGl0J3MgYW4gYXR0cmlidXRlIG5vZGUKLQkJCWlmIChjbGVhbnVwTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJY2xlYW51cE5vZGUgPSAoKEF0dHIpIGNsZWFudXBOb2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQotCQkJLy8gcmVmcmVzaCBjbGVhbnVwIHByZWZlcmVuY2VzIGJlZm9yZSBnZXR0aW5nIGNsZWFudXAgaGFuZGxlcgotCQkJaWYgKHJlZnJlc2hDbGVhbnVwUHJlZmVyZW5jZXMpCi0JCQkJcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpOwotCi0JCQkvLyBnZXQgY2xlYW51cCBoYW5kbGVyCi0JCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoY2xlYW51cE5vZGUpOwotCQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCQkvLyBjbGVhbnVwIGVhY2ggbm9kZQotCQkJCWNsZWFudXBIYW5kbGVyLmNsZWFudXAoY2xlYW51cE5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udmVydExpbmVEZWxpbWl0ZXJzKElEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIG5ld0RlbGltaXRlcikgewotCQlmaW5hbCBpbnQgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQlNYXAgcGFydGl0aW9uZXJzID0gVGV4dFV0aWxpdGllcy5yZW1vdmVEb2N1bWVudFBhcnRpdGlvbmVycyhkb2N1bWVudCk7CQkKLQkJdHJ5IHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGluZUNvdW50OyBpKyspIHsKLQkJCQlmaW5hbCBTdHJpbmcgZGVsaW1pdGVyID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKTsKLQkJCQlpZiAoZGVsaW1pdGVyICE9IG51bGwgJiYgZGVsaW1pdGVyLmxlbmd0aCgpID4gMCAmJiAhZGVsaW1pdGVyLmVxdWFscyhuZXdEZWxpbWl0ZXIpKSB7Ci0JCQkJCUlSZWdpb24gcmVnaW9uID0gZG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCQlkb2N1bWVudC5yZXBsYWNlKHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSwgZGVsaW1pdGVyLmxlbmd0aCgpLCBuZXdEZWxpbWl0ZXIpOwotCQkJCX0KLQkJCX0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfSBmaW5hbGx5IHsKLQkJCVRleHRVdGlsaXRpZXMuYWRkRG9jdW1lbnRQYXJ0aXRpb25lcnMoZG9jdW1lbnQsIHBhcnRpdGlvbmVycyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbnN1cmVDbG9zZWQoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsgLy8gaG9wZWxlc3MKLQkJfQotCQl0cnkgewotCQkJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIGdldEFjdGl2ZU5vZGVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnROb2RlT2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVZlY3RvciBhY3RpdmVOb2RlcyA9IG5ldyBWZWN0b3IoKTsKLQotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCU5vZGUgc3RhcnROb2RlID0gKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0Tm9kZU9mZnNldCk7Ci0JCQlOb2RlIGVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoKTsKLQotCQkJLy8gbWFrZSBzdXJlIGl0J3MgYW4gbm9uLWVtcHR5IGRvY3VtZW50Ci0JCQlpZiAoc3RhcnROb2RlICE9IG51bGwpIHsKLQkJCQl3aGlsZSAoaXNTaWJsaW5nT2Yoc3RhcnROb2RlLCBlbmROb2RlKSA9PSBmYWxzZSkgewotCQkJCQlpZiAoZW5kTm9kZSAhPSBudWxsKQotCQkJCQkJZW5kTm9kZSA9IGVuZE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAoZW5kTm9kZSA9PSBudWxsKSB7Ci0JCQkJCQlzdGFydE5vZGUgPSBzdGFydE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGgpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJd2hpbGUgKHN0YXJ0Tm9kZSAhPSBlbmROb2RlKSB7Ci0JCQkJCWFjdGl2ZU5vZGVzLmFkZEVsZW1lbnQoc3RhcnROb2RlKTsKLQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkKLQkJCQkJYWN0aXZlTm9kZXMuYWRkRWxlbWVudChzdGFydE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGFjdGl2ZU5vZGVzOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGdldENsZWFudXBIYW5kbGVyKE5vZGUgbm9kZSk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXNQcmVmZXJlbmNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0KLQkJYm9vbGVhbiBjb252ZXJ0RU9MQ29kZXMgPSB0cnVlOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoKE5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKDApKTsKLQkJaWYgKGNsZWFudXBIYW5kbGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyA9IGNsZWFudXBIYW5kbGVyLmdldENsZWFudXBQcmVmZXJlbmNlcygpOwotCQkJY29udmVydEVPTENvZGVzID0gY2xlYW51cFByZWZlcmVuY2VzLmdldENvbnZlcnRFT0xDb2RlcygpOwotCQl9Ci0JCXJldHVybiBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFT0xDb2RlUHJlZmVyZW5jZShJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCi0JCVN0cmluZyBlb2xDb2RlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0KLQkJSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBjbGVhbnVwSGFuZGxlciA9IGdldENsZWFudXBIYW5kbGVyKChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbigwKSk7Ci0JCWlmIChjbGVhbnVwSGFuZGxlciAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMgPSBjbGVhbnVwSGFuZGxlci5nZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQkJCWVvbENvZGUgPSBjbGVhbnVwUHJlZmVyZW5jZXMuZ2V0RU9MQ29kZSgpOwotCQl9Ci0JCXJldHVybiBlb2xDb2RlOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBnZXRGb3JtYXRQcm9jZXNzb3IoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGdldEZvcm1hdFNvdXJjZVByZWZlcmVuY2UoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQlib29sZWFuIGZvcm1hdFNvdXJjZSA9IHRydWU7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBnZXRDbGVhbnVwSGFuZGxlcigoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCkpOwotCQlpZiAoY2xlYW51cEhhbmRsZXIgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgY2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cEhhbmRsZXIuZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCk7Ci0JCQlmb3JtYXRTb3VyY2UgPSBjbGVhbnVwUHJlZmVyZW5jZXMuZ2V0Rm9ybWF0U291cmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGZvcm1hdFNvdXJjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpYmxpbmdPZihOb2RlIG5vZGUsIE5vZGUgZW5kTm9kZSkgewotCQlpZiAoZW5kTm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCU5vZGUgc2libGluZ05vZGUgPSBub2RlOwotCQkJd2hpbGUgKHNpYmxpbmdOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoc2libGluZ05vZGUgPT0gZW5kTm9kZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlzaWJsaW5nTm9kZSA9IHNpYmxpbmdOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0lTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwZGQ4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0JTm9kZSBjbGVhbnVwKE5vZGUgbm9kZSk7Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKTsKLQotCXZvaWQgc2V0Q2xlYW51cFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGNsZWFudXBQcmVmZXJlbmNlcyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODQ4NTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyB7Ci0KLQlpbnQgZ2V0QXR0ck5hbWVDYXNlKCk7Ci0KLQlib29sZWFuIGdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpOwotCi0JYm9vbGVhbiBnZXRDb252ZXJ0RU9MQ29kZXMoKTsKLQotCVN0cmluZyBnZXRFT0xDb2RlKCk7Ci0KLQlib29sZWFuIGdldEZvcm1hdFNvdXJjZSgpOwotCi0JYm9vbGVhbiBnZXRJbnNlcnRNaXNzaW5nVGFncygpOwotCi0JYm9vbGVhbiBnZXRJbnNlcnRSZXF1aXJlZEF0dHJzKCk7Ci0KLQlib29sZWFuIGdldFF1b3RlQXR0clZhbHVlcygpOwotCi0JaW50IGdldFRhZ05hbWVDYXNlKCk7Ci0KLQl2b2lkIHNldEF0dHJOYW1lQ2FzZShpbnQgYXR0ck5hbWVDYXNlKTsKLQotCXZvaWQgc2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKGJvb2xlYW4gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKTsKLQotCXZvaWQgc2V0Q29udmVydEVPTENvZGVzKGJvb2xlYW4gY29udmVydEVPTENvZGVzKTsKLQotCXZvaWQgc2V0RU9MQ29kZShTdHJpbmcgRU9MQ29kZSk7Ci0KLQl2b2lkIHNldEZvcm1hdFNvdXJjZShib29sZWFuIGZvcm1hdFNvdXJjZSk7Ci0KLQl2b2lkIHNldEluc2VydE1pc3NpbmdUYWdzKGJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MpOwotCi0Jdm9pZCBzZXRJbnNlcnRSZXF1aXJlZEF0dHJzKGJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycyk7Ci0KLQl2b2lkIHNldFByZWZlcmVuY2VzKFByZWZlcmVuY2VzIHByZWZlcmVuY2VzKTsKLQotCXZvaWQgc2V0UXVvdGVBdHRyVmFsdWVzKGJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzKTsKLQotCXZvaWQgc2V0VGFnTmFtZUNhc2UoaW50IHRhZ05hbWVDYXNlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9JU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMWM0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFuZCByZWxhdGVkIGNsYXNzZXMgYXJlICdpbnRlcm5hbCcgYW5kIHNob3VsZCBub3QgCi0gKiBiZSB0cmVhdGVkIGFzIEFQSSwgZXZlbiB0aG91Z2ggdXNlZCBhY3Jvc3MgY29tcG9uZW50cyBpbiBXVFAuIAotICogQ29uc2lkZXIgaXQgYSB3b3JrIGluIHByb2dyZXNzLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gaW5wdXQgc3RyaW5nIGFzIGlucHV0LAotCSAqIGNyZWF0ZXMgYW4gSW5wdXRTdHJlYW0gZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCBjcmVhdGUgYSB0ZW1wb3JhcnkgbW9kZWwKLQkgKiBvZiB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCwgY2xlYW51cHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJldHVybnMKLQkgKiB0aGUgY2xlYW5lZCB1cCBpbnB1dCBzdHJpbmcuCi0JICovCi0JU3RyaW5nIGNsZWFudXBDb250ZW50KFN0cmluZyBjb250ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gaW5wdXQgc3RyaW5nIGFzIGlucHV0LAotCSAqIGNyZWF0ZXMgYW4gSW5wdXRTdHJlYW0gZnJvbSB0aGUgaW5wdXQgc3RyaW5nLCBjcmVhdGUgYSB0ZW1wb3JhcnkgbW9kZWwKLQkgKiBvZiB0aGUgY29udGVudCB0eXBlIHNwZWNpZmllZCwgY2xlYW51cHMgdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQKLQkgKiBsZW5ndGgsIHRoZW4gcmV0dXJucyB0aGUgY2xlYW5lZCB1cCBpbnB1dCBzdHJpbmcuCi0JICovCi0JU3RyaW5nIGNsZWFudXBDb250ZW50KFN0cmluZyBjb250ZW50LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBJRG9jdW1lbnQgYXMgaW5wdXQsIGNyZWF0ZXMKLQkgKiBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSURvY3VtZW50J3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGNsZWFudXBEb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhbiBJRG9jdW1lbnQgYXMgaW5wdXQsIGNyZWF0ZXMKLQkgKiBhIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSURvY3VtZW50J3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLCB0aGVuIHJlbGVhc2VzCi0JICogdGhlIG1vZGVsLgotCSAqLwotCXZvaWQgY2xlYW51cERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIENsZWFudXBQcm9jZXNzb3IgdGFrZXMgYW4gSUZpbGUgYXMgaW5wdXQsIGNyZWF0ZXMgYQotCSAqIHRlbXBvcmFyeSBtb2RlbCBvZiBjb250ZW50IHR5cGUgY2FsY3VsYXRlZCB1c2luZyB0aGUgSUZpbGUncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgd2hvbGUgbW9kZWwsIHRoZW4gcmVsZWFzZXMgdGhlIG1vZGVsLiBUaGUgSUZpbGUKLQkgKiBpcyB1cGRhdGVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIG9mIHRoZSBtb2RlbCBpcyByZWxlYXNlZCBpbiB0aGUKLQkgKiBtb2RlbCBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY2xlYW51cEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGFuIElGaWxlIGFzIGlucHV0LCBjcmVhdGVzIGEKLQkgKiB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIElGaWxlJ3MgZmlsZQotCSAqIGV4dGVuc2lvbiwgY2xlYW51cHMgdGhlIG1vZGVsIHdpdGhpbiBzdGFydCBhbmQgbGVuZ3RoLCB0aGVuIHJlbGVhc2VzCi0JICogdGhlIG1vZGVsLiBUaGUgSUZpbGUgaXMgdXBkYXRlZCB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMKLQkgKiByZWxlYXNlZCBpbiB0aGUgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlKElGaWxlIGZpbGUsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgZmlsZSBuYW1lIGFzIGlucHV0LGNyZWF0ZXMgYW4KLQkgKiBJbnB1dFN0cmVhbSBmcm9tIHRoZSBmaWxlLCBjcmVhdGUgYSB0ZW1wb3JhcnkgbW9kZWwgb2YgY29udGVudCB0eXBlCi0JICogY2FsY3VsYXRlZCB1c2luZyB0aGUgZmlsZSBuYW1lJ3MgZmlsZSBleHRlbnNpb24sIGNsZWFudXBzIHRoZSB3aG9sZQotCSAqIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4gVGhlIGZpbGUgaXMgdXBkYXRlZCB3aGVuIHRoZSBsYXN0Ci0JICogcmVmZXJlbmNlIG9mIHRoZSBtb2RlbCBpcyByZWxlYXNlZCBpbiB0aGUgbW9kZWwgbWFuYWdlci4KLQkgKi8KLQl2b2lkIGNsZWFudXBGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIGZpbGUgbmFtZSBhcyBpbnB1dCxjcmVhdGVzIGFuCi0JICogSW5wdXRTdHJlYW0gZnJvbSB0aGUgZmlsZSwgY3JlYXRlIGEgdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZQotCSAqIGNhbGN1bGF0ZWQgdXNpbmcgdGhlIGZpbGUgbmFtZSdzIGZpbGUgZXh0ZW5zaW9uLCBjbGVhbnVwcyB0aGUgbW9kZWwKLQkgKiB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcyB0aGUgbW9kZWwuIFRoZSBmaWxlIGlzIHVwZGF0ZWQKLQkgKiB3aGVuIHRoZSBsYXN0IHJlZmVyZW5jZSBvZiB0aGUgbW9kZWwgaXMgcmVsZWFzZWQgaW4gdGhlIG1vZGVsIG1hbmFnZXIuCi0JICovCi0Jdm9pZCBjbGVhbnVwRmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgY2xlYW51cHMKLQkgKiB0aGUgd2hvbGUgbW9kZWwuCi0JICovCi0Jdm9pZCBjbGVhbnVwTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBDbGVhbnVwUHJvY2Vzc29yIHRha2VzIGEgbW9kZWwgYXMgaW5wdXQsIGFuZCBjbGVhbnVwcwotCSAqIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aC4KLQkgKi8KLQl2b2lkIGNsZWFudXBNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgQ2xlYW51cFByb2Nlc3NvciB0YWtlcyBhIG5vZGUgYXMgaW5wdXQsIGFuZCBmb3JtYXRzCi0JICogdGhlIG5vZGUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCi0JICovCi0Jdm9pZCBjbGVhbnVwTm9kZShOb2RlIG5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZmJmY2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgewotCXByaXZhdGUgaW50IGZBdHRyTmFtZUNhc2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3M7Ci0JcHJpdmF0ZSBib29sZWFuIGZDb252ZXJ0RU9MQ29kZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkVPTENvZGU7Ci0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXRTb3VyY2U7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbnNlcnRNaXNzaW5nVGFnczsKLQlwcml2YXRlIGJvb2xlYW4gZkluc2VydFJlcXVpcmVkQXR0cnM7Ci0JLy9wcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0JcHJpdmF0ZSBQcmVmZXJlbmNlcyBmUHJlZmVyZW5jZXMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUXVvdGVBdHRyVmFsdWVzOwotCi0JcHJpdmF0ZSBpbnQgZlRhZ05hbWVDYXNlOwotCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZBdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzKCkgewotCi0JCXJldHVybiBmQ29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldENvbnZlcnRFT0xDb2RlcygpIHsKLQotCQlyZXR1cm4gZkNvbnZlcnRFT0xDb2RlczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVPTENvZGUoKSB7Ci0KLQkJcmV0dXJuIGZFT0xDb2RlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEZvcm1hdFNvdXJjZSgpIHsKLQotCQlyZXR1cm4gZkZvcm1hdFNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRJbnNlcnRNaXNzaW5nVGFncygpIHsKLQotCQlyZXR1cm4gZkluc2VydE1pc3NpbmdUYWdzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluc2VydFJlcXVpcmVkQXR0cnMoKSB7Ci0KLQkJcmV0dXJuIGZJbnNlcnRSZXF1aXJlZEF0dHJzOwotCX0KLQotCXB1YmxpYyBQcmVmZXJlbmNlcyBnZXRQcmVmZXJlbmNlcygpIHsKLQotCQlpZiAoZlByZWZlcmVuY2VzID09IG51bGwpIHsKLQkJCWZQcmVmZXJlbmNlcyA9IFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRRdW90ZUF0dHJWYWx1ZXMoKSB7Ci0KLQkJcmV0dXJuIGZRdW90ZUF0dHJWYWx1ZXM7Ci0JfQotCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQotCQlyZXR1cm4gZlRhZ05hbWVDYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJOYW1lQ2FzZShpbnQgYXR0ck5hbWVDYXNlKSB7Ci0KLQkJZkF0dHJOYW1lQ2FzZSA9IGF0dHJOYW1lQ2FzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MoYm9vbGVhbiBjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MpIHsKLQotCQlmQ29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzID0gY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRFT0xDb2Rlcyhib29sZWFuIGNvbnZlcnRFT0xDb2RlcykgewotCi0JCWZDb252ZXJ0RU9MQ29kZXMgPSBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RU9MQ29kZShTdHJpbmcgRU9MQ29kZSkgewotCi0JCWZFT0xDb2RlID0gRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpIHsKLQotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydE1pc3NpbmdUYWdzKGJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQotCQlmSW5zZXJ0TWlzc2luZ1RhZ3MgPSBpbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJbnNlcnRSZXF1aXJlZEF0dHJzKGJvb2xlYW4gaW5zZXJ0UmVxdWlyZWRBdHRycykgewotCi0JCWZJbnNlcnRSZXF1aXJlZEF0dHJzID0gaW5zZXJ0UmVxdWlyZWRBdHRyczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCi0JCWZQcmVmZXJlbmNlcyA9IHByZWZzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFF1b3RlQXR0clZhbHVlcyhib29sZWFuIHF1b3RlQXR0clZhbHVlcykgewotCi0JCWZRdW90ZUF0dHJWYWx1ZXMgPSBxdW90ZUF0dHJWYWx1ZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFnTmFtZUNhc2UoaW50IHRhZ05hbWVDYXNlKSB7Ci0KLQkJZlRhZ05hbWVDYXNlID0gdGFnTmFtZUNhc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwODY5YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlciB7Ci0KLQlJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZ2V0Q2xlYW51cFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGUpOwotCi0Jdm9pZCBzZXRDbGVhbnVwUHJvY2Vzc29yKElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yLCBTdHJpbmcgY29udGVudFR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9jbGVhbnVwL1N0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI0YzlkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2NsZWFudXAvU3RydWN0dXJlZENvbnRlbnRDbGVhbnVwSGFuZGxlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXA7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVySW1wbCBpbXBsZW1lbnRzIFN0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIgewotCXByb3RlY3RlZCBNYXAgZkNsZWFudXBQcm9jZXNzb3JzOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKFN0cmluZyBjb250ZW50VHlwZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnRUeXBlKTsKLQotCQlpZiAoZkNsZWFudXBQcm9jZXNzb3JzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlyZXR1cm4gKElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvcikgZkNsZWFudXBQcm9jZXNzb3JzLmdldChjb250ZW50VHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2xlYW51cFByb2Nlc3NvcihJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgY2xlYW51cFByb2Nlc3NvciwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoY29udGVudFR5cGUpOwotCi0JCWlmIChmQ2xlYW51cFByb2Nlc3NvcnMgPT0gbnVsbCkKLQkJCWZDbGVhbnVwUHJvY2Vzc29ycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJaWYgKGZDbGVhbnVwUHJvY2Vzc29ycyA9PSBudWxsKQotCQkJZkNsZWFudXBQcm9jZXNzb3JzLnJlbW92ZShjb250ZW50VHlwZSk7Ci0JCWVsc2UKLQkJCWZDbGVhbnVwUHJvY2Vzc29ycy5wdXQoY29udGVudFR5cGUsIGNsZWFudXBQcm9jZXNzb3IpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQWJzdHJhY3REb2N1bWVudExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyMjk4ZDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BYnN0cmFjdERvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVubWFwcGFibGVDaGFyYWN0ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkUmVhZGVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklFbmNvZGVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYSBmaWxlIGFuZCBjcmVhdGVzIGFuIFN0cnVjdHVyZWQgTW9kZWwuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdERvY3VtZW50TG9hZGVyIGltcGxlbWVudHMgSURvY3VtZW50TG9hZGVyIHsKLQotCXByaXZhdGUgQ29kZWRSZWFkZXJDcmVhdG9yIGZDb2RlZFJlYWRlckNyZWF0b3I7Ci0JcHJvdGVjdGVkIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCS8vIHByaXZhdGUgYm9vbGVhbiBmUHJvcGVydGllc09idGFpbmVkOwotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCXByb3RlY3RlZCBSZWFkZXIgZkZ1bGxQcmVwYXJlZFJlYWRlcjsKLQotCS8qKgotCSAqIEFic3RyYWN0TG9hZGVyIGNvbnN0cnVjdG9yIGFsc28gaW5pdGlhbGl6ZXMgZW5jb2RpbmcgY29udmVydGVyL21hcHBlcgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdERvY3VtZW50TG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmdCdWZmZXIgY29udmVydExpbmVEZWxpbWl0ZXJzKFN0cmluZ0J1ZmZlciBhbGxUZXh0QnVmZmVyLCBTdHJpbmcgbGluZURlbGltaXRlclRvVXNlKSB7Ci0JCS8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJU3RyaW5nIGFsbFRleHQgPSBhbGxUZXh0QnVmZmVyLnRvU3RyaW5nKCk7Ci0JCUlEb2N1bWVudCB0ZW1wRG9jID0gbmV3IERvY3VtZW50KGFsbFRleHQpOwotCQlpZiAobGluZURlbGltaXRlclRvVXNlID09IG51bGwpCi0JCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWludCBsaW5lQ291bnQgPSB0ZW1wRG9jLmdldE51bWJlck9mTGluZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lQ291bnQ7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24gbGluZUluZm8gPSB0ZW1wRG9jLmdldExpbmVJbmZvcm1hdGlvbihpKTsKLQkJCQlpbnQgbGluZVN0YXJ0T2Zmc2V0ID0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IGxpbmVMZW5ndGggPSBsaW5lSW5mby5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZUVuZE9mZnNldCA9IGxpbmVTdGFydE9mZnNldCArIGxpbmVMZW5ndGg7Ci0JCQkJbmV3VGV4dC5hcHBlbmQoYWxsVGV4dC5zdWJzdHJpbmcobGluZVN0YXJ0T2Zmc2V0LCBsaW5lRW5kT2Zmc2V0KSk7Ci0JCQkJaWYgKChpIDwgbGluZUNvdW50IC0gMSkgJiYgKHRlbXBEb2MuZ2V0TGluZURlbGltaXRlcihpKSAhPSBudWxsKSkKLQkJCQkJbmV3VGV4dC5hcHBlbmQobGluZURlbGltaXRlclRvVXNlKTsKLQkJCX0KLQkJCWNhdGNoIChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCS8vIHNob3VsZCBmaXggdXAgdG8gZWl0aGVyIHRocm93IG5vdGhpbmcsIG9yIHRoZSByaWdodCB0aGluZywKLQkJCQkvLyBidXQKLQkJCQkvLyBpbiB0aGUgY291cnNlIG9mIHJlZmFjdG9yaW5nLCB0aGlzIHdhcyBlYXNpZXN0ICJxdWljayBmaXgiLgotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ld1RleHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgbXVzdCByZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgSUVuY29kZWREb2N1bWVudCwgdGhhdCBoYXMKLQkgKiBiZWVuIGluaXRpYWxpemVkIHdpdGggYXBwcm9wcmlhdGUgcGFyc2VyLiBGb3IgbWFueSBsb2FkZXJzLCB0aGUKLQkgKiAoZGVmYXVsdCkgcGFyc2VyIHVzZWQgaXMga25vd24gZm9yIGFueSBpbnB1dC4gRm9yIG90aGVycywgdGhlIGNvcnJlY3QKLQkgKiBwYXJzZXIgKGFuZCBpdHMgaW5pdGlhbGl6YXRpb24pIGlzIG5vcm1hbGx5IGRlcGVuZGVudCBvbiB0aGUgY29udGVudCBvZgotCSAqIHRoZSBmaWxlLiBUaGlzIG5vLWFyZ3VtZW50IG1ldGhvZCBzaG91bGQgYXNzdW1lICJlbXB0eSBpbnB1dCIgYW5kIHdvdWxkCi0JICogdGhlcmVmb3JlIHJldHVybiB0aGUgZGVmYXVsdCBwYXJzZXIgZm9yIHRoZSBkZWZhdWx0IGNvbnRlbnRUeXBlLgotCSAqLwotCXB1YmxpYyBJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBuZXdFbmNvZGVkRG9jdW1lbnQoKTsKLQkJLy8gTWFrZSBzdXJlIGV2ZXJ5IHN0cnVjdHVyZWREb2N1bWVudCBoYXMgYW4gRW5jb2RpbmcgTWVtZW50bywKLQkJLy8gd2hpY2ggaXMgdGhlIGRlZmF1bHQgb25lIGZvciAiZW1wdHkiIHN0cnVjdHVyZWREb2N1bWVudHMKLQkJU3RyaW5nIGNoYXJzZXQgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKSk7Ci0JCVN0cmluZyBzcGVjRGVmYXVsdENoYXJzZXQgPSBnZXREb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IoKS5nZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oQ29kZWRJTy5jcmVhdGVFbmNvZGluZ01lbWVudG8oY2hhcnNldCwgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVULCBzcGVjRGVmYXVsdENoYXJzZXQpKTsKLQotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIobnVsbCk7Ci0JCWlmIChsaW5lRGVsaW1pdGVyICE9IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihsaW5lRGVsaW1pdGVyKTsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBkZWZhdWx0UGFydGl0aW9uZXIgPSBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJKChJRG9jdW1lbnRFeHRlbnNpb24zKSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldERvY3VtZW50UGFydGl0aW9uZXIoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgZGVmYXVsdFBhcnRpdGlvbmVyKTsKLQkJfQotCQllbHNlIHsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXREb2N1bWVudFBhcnRpdGlvbmVyKGRlZmF1bHRQYXJ0aXRpb25lcik7Ci0JCX0KLQkJZGVmYXVsdFBhcnRpdGlvbmVyLmNvbm5lY3Qoc3RydWN0dXJlZERvY3VtZW50KTsKLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFRoaXMgYWJzdHJhY3QgdmVyc2lvbiBzaG91bGQgaGFuZGxlIG1vc3QgY2FzZXMsIGJ1dCB3b24ndCBpZgotCSAqIGNvbnRlbnRUeXBlIGlzIHNlbnNpdGl2ZSB0byBlbmNvZGluZywgYW5kL29yIGVtYmVkZGVkIHR5cGVzCi0JICovCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihpRmlsZSk7Ci0JCWlmIChsaW5lRGVsaW1pdGVyICE9IG51bGwpCi0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihsaW5lRGVsaW1pdGVyKTsKLQotCQl0cnkgewotCi0JCQlDb2RlZFJlYWRlckNyZWF0b3IgY3JlYXRvciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpOwotCQkJY3JlYXRvci5zZXQoaUZpbGUpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IGNyZWF0b3IuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0RW5jb2RpbmdNZW1lbnRvKGZFbmNvZGluZ01lbWVudG8pOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0KLQkJCXNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCwgZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoZkZ1bGxQcmVwYXJlZFJlYWRlciAhPSBudWxsKSB7Ci0JCQkJZkZ1bGxQcmVwYXJlZFJlYWRlci5jbG9zZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCXJldHVybiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlucHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JfQotCi0JcHVibGljIElFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlbmFtZSA9PSBudWxsICYmIGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbiBub3QgaGF2ZSBib3RoIG51bGwgZmlsZW5hbWUgYW5kIGlucHV0c3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlDb2RlZFJlYWRlckNyZWF0b3IgY29kZWRSZWFkZXJDcmVhdG9yID0gZ2V0Q29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCXRyeSB7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0KGZpbGVuYW1lLCBpbnB1dFN0cmVhbSk7Ci0JCQljb2RlZFJlYWRlckNyZWF0b3Iuc2V0RW5jb2RpbmdSdWxlKGVuY29kaW5nUnVsZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGNvZGVkUmVhZGVyQ3JlYXRvci5nZXRDb2RlZFJlYWRlcigpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnNldEVuY29kaW5nTWVtZW50byhmRW5jb2RpbmdNZW1lbnRvKTsKLQkJCXNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCwgZkZ1bGxQcmVwYXJlZFJlYWRlcik7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSBpbiB0aGlzIGNvbnRleHQKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChmRnVsbFByZXBhcmVkUmVhZGVyICE9IG51bGwpIHsKLQkJCQlmRnVsbFByZXBhcmVkUmVhZGVyLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXByaXZhdGUgaW50IGdldENoYXJQb3N0aW9uT2ZGYWlsdXJlKEJ1ZmZlcmVkUmVhZGVyIGlucHV0U3RyZWFtKSB7Ci0JCWludCBjaGFyUG9zaXRpb24gPSAxOwotCQlpbnQgY2hhclJlYWQgPSAtMTsKLQkJYm9vbGVhbiBlcnJvckZvdW5kID0gZmFsc2U7Ci0JCWRvIHsKLQkJCXRyeSB7Ci0JCQkJY2hhclJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKCk7Ci0JCQkJY2hhclBvc2l0aW9uKys7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCS8vIHRoaXMgaXMgZXhwZWN0ZWQsIHNpbmNlIHdlJ3JlIGV4cGVjdGluZyBmYWlsdXJlLAotCQkJCS8vIHNvIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcuCi0JCQkJZXJyb3JGb3VuZCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJd2hpbGUgKCEoY2hhclJlYWQgPT0gLTEgfHwgZXJyb3JGb3VuZCkpOwotCi0JCWlmIChlcnJvckZvdW5kKQotCQkJLy8gZG13LCBibGluZGx5IG1vZGlmaWVkIHRvICsxIHRvIGdldCB1bml0IHRlc3RzIHRvIHdvcmssIG1vdmluZwotCQkJLy8gZnJvbSBKYXZhIDEuMywgdG8gMS40Ci0JCQkvLyBub3Qgc3VyZSBob3cvd2h5IHRoaXMgYmVoYXZpb3Igd291bGQgaGF2ZSBjaGFuZ2VkLiAoSXRzIGFzIGlmCi0JCQkvLyAncmVhZCcgaXMgcmVwb3J0aW5nIGVycm9yCi0JCQkvLyBvbmUgY2hhcmFjdGVyIGVhcmx5KS4KLQkJCXJldHVybiBjaGFyUG9zaXRpb24gKyAxOwotCQllbHNlCi0JCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb2RlZFJlYWRlckNyZWF0b3IuCi0JICovCi0JcHJvdGVjdGVkIENvZGVkUmVhZGVyQ3JlYXRvciBnZXRDb2RlZFJlYWRlckNyZWF0b3IoKSB7Ci0JCWlmIChmQ29kZWRSZWFkZXJDcmVhdG9yID09IG51bGwpIHsKLQkJCWZDb2RlZFJlYWRlckNyZWF0b3IgPSBuZXcgQ29kZWRSZWFkZXJDcmVhdG9yKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb2RlZFJlYWRlckNyZWF0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgcGFydGl0aW9uZXIgdG8gYmUgdXNlZCB3aXRoIHRoZQotCSAqIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcgcGFydGl0aW9uaW5nCi0JICogCi0JICogQHJldHVybiBJRG9jdW1lbnRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jb2RpbmdNZW1lbnRvLgotCSAqIAotCSAqIEByZXR1cm4gRW5jb2RpbmdNZW1lbnRvCi0JICovCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IGVuY29kaW5nTWVtZW50byB3YXMgYWNjZXNzZWQgYmVmb3JlIGl0IHdhcyBzZXQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmRW5jb2RpbmdNZW1lbnRvOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZnVsbFByZXBhcmVkUmVhZGVyLgotCSAqLwotCXByb3RlY3RlZCBSZWFkZXIgZ2V0RnVsbFByZXBhcmVkUmVhZGVyKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZGdWxsUHJlcGFyZWRSZWFkZXIgPT0gbnVsbCkgewotCQkJZkZ1bGxQcmVwYXJlZFJlYWRlciA9IGdldENvZGVkUmVhZGVyQ3JlYXRvcigpLmdldENvZGVkUmVhZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZGdWxsUHJlcGFyZWRSZWFkZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGVmYXVsdCBsaW5lIGRlbGltaXRlciBwcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gZmlsZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUKLQkgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IGxpbmUgZGVsaW1pdGVyCi0JICogQHNpbmNlIDMuMQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBsYXRmb3JtTGluZURlbGltaXRlclByZWZlcmVuY2UoSUZpbGUgZmlsZSkgewotCQlJU2NvcGVDb250ZXh0W10gc2NvcGVDb250ZXh0OwotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCS8vIHByb2plY3QgcHJlZmVyZW5jZQotCQkJc2NvcGVDb250ZXh0ID0gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKGZpbGUuZ2V0UHJvamVjdCgpKX07Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IFBsYXRmb3JtLmdldFByZWZlcmVuY2VzU2VydmljZSgpLmdldFN0cmluZyhQbGF0Zm9ybS5QSV9SVU5USU1FLCBQbGF0Zm9ybS5QUkVGX0xJTkVfU0VQQVJBVE9SLCBudWxsLCBzY29wZUNvbnRleHQpOwotCQkJaWYgKGxpbmVEZWxpbWl0ZXIgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbGluZURlbGltaXRlcjsKLQkJfQotCQkvLyB3b3Jrc3BhY2UgcHJlZmVyZW5jZQotCQlzY29wZUNvbnRleHQgPSBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCl9OwotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0UHJlZmVyZW5jZXNTZXJ2aWNlKCkuZ2V0U3RyaW5nKFBsYXRmb3JtLlBJX1JVTlRJTUUsIFBsYXRmb3JtLlBSRUZfTElORV9TRVBBUkFUT1IsIG51bGwsIHNjb3BlQ29udGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoSUZpbGUpIGluc3RlYWQKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXRQcmVmZXJyZWROZXdMaW5lRGVsaW1pdGVyKG51bGwpOwotCX0KLQotCS8qKgotCSAqIElmIHN1YmNsYXNzIGRvZXNuJ3QgaW1wbGVtZW50LCByZXR1cm4gcGxhdGZvcm0gZGVmYXVsdAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBnZXRQbGF0Zm9ybUxpbmVEZWxpbWl0ZXJQcmVmZXJlbmNlKGZpbGUpOwotCX0KLQotCS8qKgotCSAqIEEgdXRpbGl0eSBtZXRob2QsIGJ1dCBkZXBlbmRzIG9uIHN1YmNsYXNzZXMgdG8gaW1wbGltZW50IHRoZSBwcmVmZXJyZWQKLQkgKiBlbmQgb2YgbGluZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZS4gTm90ZTogc3ViY2xhc3NlcyBzaG91bGQgbm90Ci0JICogcmUtaW1wbGVtZW50IHRoaXMgbWV0aG9kICh0aGVyZSdzIG5vIHJlYXNvbiB0bywgZXZlbiB0aG91Z2ggaXRzIHBhcnQgb2YKLQkgKiBpbnRlcmZhY2UpLiBUaGlzIG1ldGhvZCBub3Qgb25seSBjb252ZXJ0cyBlbmQtb2YtbGluZSBjaGFyYWN0ZXJzLCBpZgotCSAqIG5lZWRlZCwgYnV0IHNldHMgdGhlIGNvcnJlY3QgZW5kLW9mLWxpbmUgZGVsaW1pdGVyIGluCi0JICogc3RydWN0dXJlZERvY3VtZW50LiBNaW5vciBub3RlOiBjYW4ndCB1c2UgdGhpcyBleGFjdCBtZXRob2QgaW4gZHVtcGVycywKLQkgKiBzaW5jZSB0aGUgZGVjaXNpb24gdG8gY2hhbmdlIG9yIG5vdCBpcyBhIGxpdHRsZSBkaWZmZXJlbnQsIGFuZCBzaW5jZQotCSAqIHRoZXJlIHdlIGhhdmUgdG8gY2hhbmdlIHRleHQgb2Ygc3RydWN0dXJlZERvY3VtZW50IGlmIGZvdW5kIHRvIG5lZWQKLQkgKiBjb252ZXJzaW9uLiAoV2hlcmUgYXMgZm9yIGxvYWRpbmcsIHdlIGFzc3VtZSB3ZSBoYXZlbid0IHlldCBzZXQgdGV4dCBpbgotCSAqIHN0cnVjdHVyZWREb2N1bWVudCwgYnV0IHdpbGwgYmUgZG9uZSBieSBvdGhlciBtZXRob2QganVzdCBhIHRpbnkgYml5Ci0JICogbGF0ZXIpLiBOZWVkcyB0byBiZSBwdWJsaWMgdG8gaGFuZGxlIGludGVyZmFjZS4gSXQgaXMgaW4gdGhlIGludGVyZmFjZQotCSAqIGp1c3Qgc28gTW9kZWxNYW5hZ2VySW1wbCBjYW4gdXNlIGl0IGluIGEgc3BlY2lhbCBjaXJjdW1zdGFuY2UuCi0JICovCi0JcHVibGljIFN0cmluZ0J1ZmZlciBoYW5kbGVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciBvcmlnaW5hbFN0cmluZywgSUVuY29kZWREb2N1bWVudCB0aGVGbGF0TW9kZWwpIHsKLQkJLy8gVE9ETzogbmVlZCB0byBoYW5kbGUgbGluZSBkZWxpbWl0ZXJzIHNvIE1hcmtlciBQb3NpdGlvbnMgYXJlCi0JCS8vIHVwZGF0ZWQKLQkJU3RyaW5nQnVmZmVyIGNvbnZlcnRlZFRleHQgPSBudWxsOwotCQkvLyBiYXNlZCBvbiB0ZXh0LCBtYWtlIGEgZ3Vlc3Mgb24gd2hhdCdzIGJlaW5nIHVzZWQgYXMKLQkJLy8gbGluZSBkZWxpbWl0ZXIKLQkJU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlciA9IFRleHRVdGlsaXRpZXMuZGV0ZXJtaW5lTGluZURlbGltaXRlcihvcmlnaW5hbFN0cmluZywgdGhlRmxhdE1vZGVsLmdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcHJlZmVycmVkTGluZURlbGltaXRlciA9IGdldFByZWZlcnJlZE5ld0xpbmVEZWxpbWl0ZXIobnVsbCk7Ci0JCWlmIChwcmVmZXJyZWRMaW5lRGVsaW1pdGVyID09IG51bGwpIHsKLQkJCS8vIHdoZW4gcHJlZmVycmVkTGluZURlbGltaXRlciBpcyBudWxsLCBpdCBtZWFucyAibGVhdmUgYWxvbmUiCi0JCQkvLyBzbyBubyBjb252ZXJzaW9uIG5lZWRlZC4KLQkJCS8vIHNldCBoZXJlLCBvbmx5IGlmIG51bGwgKHNob3VsZCBhbHJlYWR5IGJlIHNldCwgYnV0IGlmIG5vdCwKLQkJCS8vIHdlJ2xsIHNldCBzbyBhbnkgc3Vic2VxdWVudCBlZGl0aW5nIGluc2VydHMgd2hhdCB3ZSdyZQotCQkJLy8gYXNzdW1pbmcpCi0JCQlpZiAoIXRoZUZsYXRNb2RlbC5nZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkuZXF1YWxzKHByb2JhYmxlTGluZURlbGltaXRlcikpIHsKLQkJCQl0aGVGbGF0TW9kZWwuc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJY29udmVydGVkVGV4dCA9IG9yaWdpbmFsU3RyaW5nOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKCFwcmVmZXJyZWRMaW5lRGVsaW1pdGVyLmVxdWFscyhwcm9iYWJsZUxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJLy8gdGVjaG5pY2FsbHksIHdvdWxkbid0IGhhdmUgdG8gY29udmVydCBsaW5lIGRlbGltaXRlcnMKLQkJCQkvLyBoZXJlIGF0IGJlZ2lubmluZywgYnV0IHdoZW4gd2Ugc2F2ZSwgaWYgdGhlIHByZWZlcnJlZAotCQkJCS8vIGxpbmUgZGVsaW10ZXIgaXMgImxlYXZlIGFsb25lIiB0aGVuIHdlIGRvIGxlYXZlIGFsb25lLAotCQkJCS8vIHNvIGJlc3QgdG8gYmUgcmlnaHQgZnJvbSBiZWdpbm5pbmcuCi0JCQkJY29udmVydGVkVGV4dCA9IGNvbnZlcnRMaW5lRGVsaW1pdGVycyhvcmlnaW5hbFN0cmluZywgcHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQkJdGhlRmxhdE1vZGVsLnNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIocHJlZmVycmVkTGluZURlbGltaXRlcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB0aGV5IGFyZSBhbHJlYWR5IHRoZSBzYW1lLCBubyBjb252ZXJzaW9uIG5lZWRlZAotCQkJCXRoZUZsYXRNb2RlbC5zZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKHByZWZlcnJlZExpbmVEZWxpbWl0ZXIpOwotCQkJCWNvbnZlcnRlZFRleHQgPSBvcmlnaW5hbFN0cmluZzsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udmVydGVkVGV4dDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSUVuY29kZWREb2N1bWVudCBuZXdFbmNvZGVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIFZlcnkgbWVjaGFuaWNhbCBtZXRob2QsIGp1c3QgdG8gcmVhZCB0aGUgY2hhcmFjdGVycywgb25jZSB0aGUgcmVhZGVyIGlzCi0JICogY29ycmVjdGx5IGNyZWF0ZWQuIENhbiB0aHJvdyBNYWxGb3JtZWRJbnB1dEV4Y2VwdGlvbi4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ0J1ZmZlciByZWFkSW5wdXRTdHJlYW0oUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgZkJsb2Nrc1JlYWQgPSAwOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgbnVtUmVhZCA9IDA7Ci0JCXRyeSB7Ci0JCQljaGFyIHRCdWZmW10gPSBuZXcgY2hhcltDb2RlZElPLk1BWF9CVUZfU0laRV07Ci0JCQl3aGlsZSAobnVtUmVhZCAhPSAtMSkgewotCQkJCW51bVJlYWQgPSByZWFkZXIucmVhZCh0QnVmZiwgMCwgdEJ1ZmYubGVuZ3RoKTsKLQkJCQlpZiAobnVtUmVhZCA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZCh0QnVmZiwgMCwgbnVtUmVhZCk7Ci0JCQkJCWZCbG9ja3NSZWFkKys7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGZFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCksIGZCbG9ja3NSZWFkICogQ29kZWRJTy5NQVhfQlVGX1NJWkUgKyBudW1SZWFkICsgZS5nZXRJbnB1dExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoVW5tYXBwYWJsZUNoYXJhY3RlckV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsKGZFbmNvZGluZ01lbWVudG8uZ2V0SmF2YUNoYXJzZXROYW1lKCksIGZCbG9ja3NSZWFkICogQ29kZWRJTy5NQVhfQlVGX1NJWkUgKyBudW1SZWFkICsgZS5nZXRJbnB1dExlbmd0aCgpKTsKLQotCQl9Ci0JCXJldHVybiBidWZmZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsb2FkKElFbmNvZGVkRG9jdW1lbnQgZW5jb2RlZERvY3VtZW50LCBSZWFkZXIgaW5wdXRTdHJlYW1SZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dFN0cmVhbVJlYWRlciA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdHJlYW0gcmVhZGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaW50IFJFQURfQlVGRkVSX1NJWkUgPSA4MTkyOwotCQlpbnQgTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUksgPSAyMDAwMDA7Ci0JCS8vIHRlbXAgLi4uLiBldmVudHVhbGx5IHdlJ2xsbCBvbmx5IHJlYWQgYXMgbmVlZGVkCi0JCUJ1ZmZlcmVkUmVhZGVyIGJ1ZmZlcmVkUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlucHV0U3RyZWFtUmVhZGVyLCBNQVhfQlVGRkVSRURfU0laRV9GT1JfUkVTRVRfTUFSSyk7Ci0JCWJ1ZmZlcmVkUmVhZGVyLm1hcmsoTUFYX0JVRkZFUkVEX1NJWkVfRk9SX1JFU0VUX01BUkspOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQl0cnkgewotCQkJaW50IG51bVJlYWQgPSAwOwotCQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbUkVBRF9CVUZGRVJfU0laRV07Ci0JCQl3aGlsZSAoKG51bVJlYWQgPSBidWZmZXJlZFJlYWRlci5yZWFkKHRCdWZmLCAwLCB0QnVmZi5sZW5ndGgpKSAhPSAtMSkgewotCQkJCWJ1ZmZlci5hcHBlbmQodEJ1ZmYsIDAsIG51bVJlYWQpOwotCQkJfQotCQkJLy8gcmVtZW1iZXIgLS0gd2UgZGlkbid0IG9wZW4gc3RyZWFtIC4uLiBzbyB3ZSBkb24ndCBjbG9zZSBpdAotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbnQgcG9zID0gZS5nZXRJbnB1dExlbmd0aCgpOwotCQkJRW5jb2RpbmdNZW1lbnRvIGxvY2FsRW5jb2RpbmdNZW1lbnRvID0gZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCQlib29sZWFuIGNvdWxkUmVzZXQgPSB0cnVlOwotCQkJU3RyaW5nIGVuY29kaW5nTmFtZUluRXJyb3IgPSBsb2NhbEVuY29kaW5nTWVtZW50by5nZXRKYXZhQ2hhcnNldE5hbWUoKTsKLQkJCWlmIChlbmNvZGluZ05hbWVJbkVycm9yID09IG51bGwpIHsKLQkJCQllbmNvZGluZ05hbWVJbkVycm9yID0gbG9jYWxFbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQkJfQotCQkJdHJ5IHsKLQkJCQlidWZmZXJlZFJlYWRlci5yZXNldCgpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHJlc2V0RXhjZXB0aW9uKSB7Ci0JCQkJLy8gdGhlIG9ubHkgZXJycm8gdGhhdCBjYW4gb2NjdXIgZHVyaW5nIHJlc2V0IGlzIGFuCi0JCQkJLy8gSU9FeGNlcHRpb24KLQkJCQkvLyBkdWUgdG8gYWxyZWFkeSBiZWluZyBwYXN0IHRoZSByZXN0IG1hcmsuIEluIHRoYXQgY2FzZSwgd2UKLQkJCQkvLyB0aHJvdyBtb3JlIGdlbmVyaWMgbWVzc2FnZQotCQkJCWNvdWxkUmVzZXQgPSBmYWxzZTsKLQkJCX0KLQkJCS8vIC0xIGNhbiBiZSB1c2VkIGJ5IFVJIGxheWVyIGFzIGEgY29kZSB0aGF0ICJwb3NpdGlvbiBjb3VsZCBub3QKLQkJCS8vIGJlCi0JCQkvLyBkZXRlcm1pbmVkIgotCQkJaW50IGNoYXJQb3N0aW9uID0gLTE7Ci0JCQlpZiAoY291bGRSZXNldCkgewotCi0JCQkJY2hhclBvc3Rpb24gPSBnZXRDaGFyUG9zdGlvbk9mRmFpbHVyZShidWZmZXJlZFJlYWRlcik7Ci0JCQkJLy8gZ2V0Q2hhclBvc3Rpb25PZkZhaWx1cmUobmV3IElucHV0U3RyZWFtUmVhZGVyKGluU3RyZWFtLAotCQkJCS8vIGphdmFFbmNvZGluZ05hbWVJbkVycm9yKSk7Ci0JCQl9Ci0JCQkvLyBhbGwgb2YgdGhhdCBqdXN0IHRvIHRocm93IG1vcmUgYWNjdXJhdGUgZXJyb3IKLQkJCS8vIG5vdGU6IHdlIGRvIHRoZSBjb252ZXJzaW9uIHRvIGlhbmFOYW1lLCBpbnN0ZWFkIG9mIHVzaW5nIHRoZQotCQkJLy8gbG9jYWwKLQkJCS8vIHZhcmlhYmxlLAotCQkJLy8gYmVjYXVzZSB0aGlzIGlzIHVsdGltYXRlbHkgb25seSBmb3IgdGhlIHVzZXIgZXJyb3IgbWVzc2FnZQotCQkJLy8gKHRoYXQKLQkJCS8vIGlzLAotCQkJLy8gdGhlIGVycm9yIG9jY3VycmVkCi0JCQkvLyBpbiBjb250ZXh0IG9mIGphdmFFbmNvZGluZ05hbWUgbm8gbWF0dGVyIHdoYXQgaWFuYUVuY29kaW5nTmFtZQotCQkJLy8gaXMKLQkJCXRocm93IG5ldyBNYWxmb3JtZWRJbnB1dEV4Y2VwdGlvbldpdGhEZXRhaWwoZW5jb2RpbmdOYW1lSW5FcnJvciwgQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGVuY29kaW5nTmFtZUluRXJyb3IpLCBjaGFyUG9zdGlvbiwgIWNvdWxkUmVzZXQsIE1BWF9CVUZGRVJFRF9TSVpFX0ZPUl9SRVNFVF9NQVJLKTsKLQkJfQotCQlTdHJpbmdCdWZmZXIgc3RyaW5nYnVmZmVyID0gYnVmZmVyOwotCQllbmNvZGVkRG9jdW1lbnQuc2V0KHN0cmluZ2J1ZmZlci50b1N0cmluZygpKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50Q29udGVudHNGcm9tUmVhZGVyKElFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZ0J1ZmZlciBhbGxUZXh0ID0gcmVhZElucHV0U3RyZWFtKHJlYWRlcik7Ci0JCXN0cnVjdHVyZWREb2N1bWVudC5zZXQoYWxsVGV4dC50b1N0cmluZygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDhhMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotCi0vKioKLSAqIEEgamF2YS5pby5SZWFkZXIgdGhhdCBjYW4gb3BlcmF0ZSBvZmYgb2YgYW4gSURvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRSZWFkZXIgZXh0ZW5kcyBSZWFkZXIgewotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbWFyayA9IDA7Ci0JcHJpdmF0ZSBpbnQgcG9zaXRpb24gPSAwOwotCi0JcHVibGljIERvY3VtZW50UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBEb2N1bWVudFJlYWRlcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcyhkb2N1bWVudCwgMCk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50UmVhZGVyKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGluaXRpYWxQb3NpdGlvbikgewotCQlzdXBlcigpOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJcG9zaXRpb24gPSBpbml0aWFsUG9zaXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5SZWFkZXIjbWFyayhpbnQpCi0JICovCi0JcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCW1hcmsgPSBwb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgaW50IHJlYWQoY2hhcltdIGNidWYsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKGZEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQkKLQkJY2hhcltdIHJlYWRDaGFycyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAocG9zaXRpb24gPj0gZkRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJCXJldHVybiAtMTsKLQkJCS8vIHRoZSBJRG9jdW1lbnQgaXMgbGlrZWx5IHVzaW5nIGEgR2FwVGV4dFN0b3JlLCBzbyB3ZSBjYW4ndAotCQkJLy8gcmV0cmlldmUgYSBjaGFyW10gZGlyZWN0bHkKLQkJCWlmIChwb3NpdGlvbiArIGxlbiA+IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkKLQkJCQlyZWFkQ2hhcnMgPSBmRG9jdW1lbnQuZ2V0KHBvc2l0aW9uLCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSBwb3NpdGlvbikudG9DaGFyQXJyYXkoKTsKLQkJCWVsc2UKLQkJCQlyZWFkQ2hhcnMgPSBmRG9jdW1lbnQuZ2V0KHBvc2l0aW9uLCBsZW4pLnRvQ2hhckFycmF5KCk7Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHJlYWRDaGFycywgMCwgY2J1Ziwgb2ZmLCByZWFkQ2hhcnMubGVuZ3RoKTsKLQkJCS8vCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiIiArIHBvc2l0aW9uICsgIjoiICsgcmVhZENoYXJzLmxlbmd0aCArICIgIgotCQkJLy8gKyBTdHJpbmdVdGlscy5lc2NhcGUobmV3IFN0cmluZyhyZWFkQ2hhcnMpKSk7Ci0JCQlwb3NpdGlvbiArPSByZWFkQ2hhcnMubGVuZ3RoOwotCQkJcmV0dXJuIHJlYWRDaGFycy5sZW5ndGg7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSByZWFkaW5nIGZyb20gSURvY3VtZW50OiAiICsgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5SZWFkZXIjcmVzZXQoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcG9zaXRpb24gPSBtYXJrOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0KElEb2N1bWVudCBkb2N1bWVudCwgaW50IGluaXRpYWxQb3NpdGlvbikgewotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJcG9zaXRpb24gPSBpbml0aWFsUG9zaXRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoaW50IHBvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcG9zaXRpb24gPSBwb3M7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmlvLlJlYWRlciNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmKGZEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0KLQkJbG9uZyBza2lwcGVkID0gbjsKLQkJaWYgKHBvc2l0aW9uICsgbiA+IGZEb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJc2tpcHBlZCA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIHBvc2l0aW9uOwotCQkJcG9zaXRpb24gPSBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCX0gZWxzZSB7Ci0JCQlwb3NpdGlvbiArPSBuOwotCQl9Ci0JCXJldHVybiBza2lwcGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTdiNzBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5JUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3I7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBleHRlbmRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0Jdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L0lEb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmI3YjQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSURvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudExvYWRlciB7Ci0KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgaXMgbGlrZSBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQsIGV4Y2VwdCBpdCBzaG91bGQgcG9wdWxhdGUKLQkgKiB0aGUgc3RydWN0dXJlZERvY3VtZW50IHdpdGggdGhlIGNvbnRlbnRzIG9mIElGaWxlLiBBbHNvLCB0aG9zZQotCSAqIFN0cnVjdHVyZWREb2N1bWVudHMgd2hpY2ggYXJlIHNlbnNpdGl2ZSB0byB0aGUgaW5wdXQgKHRoYXQgaXMsIHRoZQotCSAqIHBhcnNlciBvciBwYXJzZXIgaW5pdGlhbGl6YXRpb24gbXkgcmVxdWlyZSB0aGUgaW5wdXQpIHNob3VsZAotCSAqIGFkZGl0aW9uYWxseSBpbml0aWFsaXplIHRoZSBwYXJzZXIsIGV0Yy4sIGFwcHJvcHJpYXRlIHRvIHRoZSBpbnB1dC4KLQkgKiAKLQkgKiBBcyBhbHdheXMsIHRoZSBhcHByb3ByaWF0ZSBkZWNvZGluZyBzaG91bGQgYmUgdXNlZC4KLQkgKi8KLQlJRW5jb2RlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChJRmlsZSBpRmlsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiBJRW5jb2RlZERvY3VtZW50LCB0aGF0IGhhcwotCSAqIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhcHByb3ByaWF0ZSBwYXJzZXIuIEZvciBtYW55IGxvYWRlcnMsIHRoZQotCSAqIChkZWZhdWx0KSBwYXJzZXIgdXNlZCBpcyBrbm93biBmb3IgYW55IGlucHV0LiBGb3Igb3RoZXJzLCB0aGUgY29ycmVjdAotCSAqIHBhcnNlciAoYW5kIGl0cyBpbml0aWFsaXphdGlvbikgaXMgbm9ybWFsbHkgZGVwZW5kZW50IG9uIHRoZSBjb250ZW50IG9mCi0JICogdGhlIGZpbGUuIFRoaXMgbm8tYXJndW1lbnQgbWV0aG9kIHNob3VsZCBhc3N1bWUgImVtcHR5IGlucHV0IiBhbmQgd291bGQKLQkgKiB0aGVyZWZvcmUgcmV0dXJuIHRoZSBkZWZhdWx0IHBhcnNlciBmb3IgdGhlIGRlZmF1bHQgY29udGVudFR5cGUuCi0JICovCi0JSUVuY29kZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpc3RyZWFtKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotCUlFbmNvZGVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaXN0cmVhbSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLQlJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREZWZhdWx0RG9jdW1lbnRQYXJ0aXRpb25lcigpOwotCi0JSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpOwotCi0JLyoqCi0JICogQSB1dGlsaXR5IG1ldGhvZCwgYnV0IGRlcGVuZHMgb24gc3ViY2xhc3NlcyB0byBpbXBsaW1lbnQgdGhlIHByZWZlcnJlZAotCSAqIGVuZCBvZiBsaW5lIGZvciBhIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLiBOb3RlOiBzdWJjbGFzc2VzIHNob3VsZCBub3QKLQkgKiByZS1pbXBsZW1lbnQgdGhpcyBtZXRob2QgKHRoZXJlJ3Mgbm8gcmVhc29uIHRvLCBldmVuIHRob3VnaCBpdHMgcGFydCBvZgotCSAqIGludGVyZmFjZSkuIFRoaXMgbWV0aG9kIG5vdCBvbmx5IGNvbnZlcnRzIGVuZC1vZi1saW5lIGNoYXJhY3RlcnMsIGlmCi0JICogbmVlZGVkLCBidXQgc2V0cyB0aGUgY29ycmVjdCBlbmQtb2YtbGluZSBkZWxpbWl0ZXIgaW4KLQkgKiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBlaXRoZXIgdGhlIG9yaWdpbmFsIHN0cmluZywKLQkgKiBpZiBubyBjb252ZXJzaW9uIGlzIG5lZWRlZCwgb3IgYSBuZXcgc3RyaW5nIHdpdGggZW5kLW9mLWxpbmVzCi0JICogY29udmVydGVkLgotCSAqLwotCVN0cmluZ0J1ZmZlciBoYW5kbGVMaW5lRGVsaW1pdGVyKFN0cmluZ0J1ZmZlciBvcmlnaW5hbFN0cmluZywgSUVuY29kZWREb2N1bWVudCB0aGVTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0Jdm9pZCByZWxvYWQoSUVuY29kZWREb2N1bWVudCBkb2N1bWVudCwgUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1ZGYzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIEF0IHRoZSBtb21lbnQsIHRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkIGFzIGEgY29udmVuaWVuY2UgdG8gaGVscCBzd2l0Y2gKLSAqIGJldHdlZW4gdmFyaW91cyB0eXBlcyBvZiB0aHJlYWRpbmcgbW9kZWxzIGluIHRoZSBkb2N1bWVudCwgYWxsIGluIGEgY2VudHJhbAotICogcGllY2Ugb2YgY29kZS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXUklURV9TWU5DSFJPTklaRUQgPSAzOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gV1JJVEVfU1lOQ0hST05JWkVEOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTlNZTkNIUk9OSVpFRCA9IDE7Ci0KLQlwcml2YXRlIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGludCB0eXBlLCBSZWdpb25QYXJzZXIgcGFyc2VyKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJc3dpdGNoICh0eXBlKSB7Ci0JCQljYXNlIFVOU1lOQ0hST05JWkVEIDoKLQkJCQlyZXN1bHQgPSBuZXcgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQocGFyc2VyKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgV1JJVEVfU1lOQ0hST05JWkVEIDoKLQkJCQlyZXN1bHQgPSBuZXcgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudChwYXJzZXIpOwotCQkJCWJyZWFrOwotCi0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZXF1ZXN0IGRvY3VtZW50IHR5cGUgd2FzIG5vdCBrbm93biIpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVzIHRoZSAoc3lzdGVtIGRlZmF1bHQpIHN0cnVjdHVyZWQgZG9jdW1lbnQgaW5pdGlhbGl6ZWQgd2l0aCB0aGUKLQkgKiBwYXJzZXIuCi0JICogCi0JICogQHBhcmFtIHBhcnNlcgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQlyZXR1cm4gZ2V0TmV3U3RydWN0dXJlZERvY3VtZW50SW5zdGFuY2UoREVGQVVMVCwgcGFyc2VyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkCi0JICogCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dFV0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0VXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZWM1OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9UZXh0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0vKioKLSAqIENvbGxlY3Rpb24gb2YgdGV4dCBmdW5jdGlvbnMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIC0gbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8gcmVtaW5kIHVzIHRvIHBoYXNlIHRoaXMgb3V0IChhbmQvb3IKLSAqICAgICAgICAgICAgIG1vdmUgdG8gImZpbmlzaGVkIiB2ZXJzaW9uKS4KLSAqLwotcHVibGljIGNsYXNzIFRleHRVdGlsaXRpZXMgewotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgaWYgcG9zc2libGUsIGl0cyBiZXN0IHRvIHVzZQotCSAqICAgICAgICAgICAgIElEb2N1bWVudC5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZ1tdIGZnRGVsaW1pdGVycyA9IG5ldyBTdHJpbmdbXXsiXG4iLCAiXHIiLCAiXHJcbiJ9Oy8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGljaCBvbmUgb2YgZmdEZWxpbWl0ZXJzIGFwcGVhcnMgZmlyc3QgaW4gdGhlIHRleHQuIElmIG5vbmUKLQkgKiBvZiB0aGVtIHRoZSBoaW50IGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGRldGVybWluZUxpbmVEZWxpbWl0ZXIoU3RyaW5nQnVmZmVyIHRleHRCdWZmZXIsIFN0cmluZ1tdIHBvc3NpYmxlcywgU3RyaW5nIGhpbnQpIHsKLQkJdHJ5IHsKLQkJCS8vIFRPRE86IGF2b2lkIHVzZSBvZiBTdHJpbmcgaW5zdGFuY2UKLQkJCVN0cmluZyB0ZXh0ID0gdGV4dEJ1ZmZlci50b1N0cmluZygpOwotCQkJaW50W10gaW5mbyA9IGluZGV4T2YocG9zc2libGVzLCB0ZXh0LCAwKTsKLQkJCXJldHVybiBwb3NzaWJsZXNbaW5mb1sxXV07Ci0JCX0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB4KSB7Ci0JCX0KLQkJcmV0dXJuIGhpbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcG9zaXRpb24gaW4gdGhlIHN0cmluZyBncmVhdGVyIHRoYW4gb2Zmc2V0IG9mIHRoZSBsb25nZXN0Ci0JICogbWF0Y2hpbmcgc2VhcmNoIHN0cmluZy4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBpbnRbXSBpbmRleE9mKFN0cmluZ1tdIHNlYXJjaFN0cmluZ3MsIFN0cmluZyB0ZXh0LCBpbnQgb2Zmc2V0KSB7Ci0KLQkJaW50W10gcmVzdWx0ID0gey0xLCAtMX07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWFyY2hTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpbnQgaW5kZXggPSB0ZXh0LmluZGV4T2Yoc2VhcmNoU3RyaW5nc1tpXSwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA+PSAwKSB7Ci0KLQkJCQlpZiAocmVzdWx0WzBdID09IC0xKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0gZWxzZSBpZiAoaW5kZXggPCByZXN1bHRbMF0pIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleCA9PSByZXN1bHRbMF0gJiYgc2VhcmNoU3RyaW5nc1tpXS5sZW5ndGgoKSA+IHNlYXJjaFN0cmluZ3NbcmVzdWx0WzFdXS5sZW5ndGgoKSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9maWxlYnVmZmVycy9CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZmlsZWJ1ZmZlcnMvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2OTI0MGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9maWxlYnVmZmVycy9CYXNpY1N0cnVjdHVyZWREb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudDsKLQotCi0vKioKLSAqIEdlbmVyaWMgSURvY3VtZW50RmFjdG9yeSBmb3IgSVN0cnVjdHVyZWREb2N1bWVudHMgdG8gYmUgdXNlZCBieSB0aGUKLSAqIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiBleHRlbnNpb24gcG9pbnQuIFRoaXMgY2xhc3MKLSAqIGlzIG5vdCBtZWFudCB0byBiZSBzdWJjbGFzc2VkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSBpbXBsZW1lbnRzIElEb2N1bWVudEZhY3RvcnksIElFeGVjdXRhYmxlRXh0ZW5zaW9uIHsKLQotCS8qCi0JICogVGhlIGNvbnRlbnQgdHlwZSBJRCB1c2VkIHRvIGRlY2xhcmUgdGhpcyBmYWN0b3J5OyBpdCBpcyB1c2VkIHRvIGZpbmQKLQkgKiB0aGUgY29ycmVzcG9uZGluZyBzdXBwb3J0IGZvciBjcmVhdGluZyB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJZGVudGlmaWVyID0gbnVsbDsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yLCBvbmx5IHRvIGJlIHVzZWQgYnkgdGhlCi0JICogb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5kb2N1bWVudENyZWF0aW9uIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JRG9jdW1lbnRGYWN0b3J5I2NyZWF0ZURvY3VtZW50KCkKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGNyZWF0ZURvY3VtZW50KCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCXdoaWxlIChoYW5kbGVyID09IG51bGwgJiYgIUlDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVC5lcXVhbHMoY29udGVudFR5cGUuZ2V0SWQoKSkpIHsKLQkJCWhhbmRsZXIgPSBNb2RlbEhhbmRsZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkJY29udGVudFR5cGUgPSBjb250ZW50VHlwZS5nZXRCYXNlVHlwZSgpOwotCQl9Ci0JCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCWRvY3VtZW50ID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJZG9jdW1lbnQgPSBuZXcgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSB7Ci0JCXJldHVybiBmQ29udGVudFR5cGVJZGVudGlmaWVyOwotCX0KLQotCS8qCi0JICogTG9hZHMgdGhlIGNvbnRlbnQgdHlwZSBJRCB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgdGhlIFN0cnVjdHVyZWQgRG9jdW1lbnQuIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeGVjdXRhYmxlRXh0ZW5zaW9uI3NldEluaXRpYWxpemF0aW9uRGF0YShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbml0aWFsaXphdGlvbkRhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZywgU3RyaW5nIHByb3BlcnR5TmFtZSwgT2JqZWN0IGRhdGEpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJZkNvbnRlbnRUeXBlSWRlbnRpZmllciA9IGNvbmZpZy5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlSWQiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGF0YSAhPSBudWxsKSB7Ci0JCQlpZiAoZGF0YSBpbnN0YW5jZW9mIFN0cmluZyAmJiBkYXRhLnRvU3RyaW5nKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJZkNvbnRlbnRUeXBlSWRlbnRpZmllciA9IChTdHJpbmcpIGRhdGE7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Fic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDhlYzFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0Fic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIGluaXRpYWwgSURvY3VtZW50RXh0ZW5zaW9uNCBzdXBwb3J0IC0gIzEwMjgyMgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmRm9ybWF0Q29udHJhaW50cyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0JcHVibGljIGJvb2xlYW4gcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzID0gdHJ1ZTsgLy8gc3BlY2lhbCBmbGFnIGZvciBKVW5pdAotCi0JcHJvdGVjdGVkIHZvaWQgZW5zdXJlQ2xvc2VkKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0KLQkJdHJ5IHsKLQkJCWlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsgLy8gaG9wZWxlc3MKLQkJfQotCQl0cnkgewotCQkJaWYgKG91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0JCQkJb3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7IC8vIGhvcGVsZXNzCi0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdENvbnRlbnQoU3RyaW5nIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoaW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybiBpbnB1dDsKLQotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIHJlYWQuIFdpbGwgcmV0dXJuIGZvcm1hdHRlZAotCQkJLy8gc3RyaW5nIGFuZCBOT1Qgc2F2ZSBtb2RlbC4KLQkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgaWQgPSBpbnB1dFN0cmVhbS50b1N0cmluZygpICsgIi4iICsgZ2V0RmlsZUV4dGVuc2lvbigpOyAvLyROT04tTkxTLTEkCi0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yUmVhZChpZCwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHJldHVybiBvdXRwdXQKLQkJCXJldHVybiBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQllbnN1cmVDbG9zZWQobnVsbCwgaW5wdXRTdHJlYW0pOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGZvcm1hdENvbnRlbnQoU3RyaW5nIGlucHV0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuIGlucHV0OwotCi0JCWlmICgoc3RhcnQgPj0gMCkgJiYgKGxlbmd0aCA+PSAwKSAmJiAoc3RhcnQgKyBsZW5ndGggPD0gaW5wdXQubGVuZ3RoKCkpKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQl0cnkgewotCQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJCS8vIE5vdGU6IFdlIGFyZSBnZXR0aW5nIG1vZGVsIGZvciByZWFkLiBXaWxsIHJldHVybiBmb3JtYXR0ZWQKLQkJCQkvLyBzdHJpbmcgYW5kIE5PVCBzYXZlIG1vZGVsLgotCQkJCWlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCJVVEY4IikpOyAvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGlkID0gaW5wdXRTdHJlYW0udG9TdHJpbmcoKSArICIuIiArIGdldEZpbGVFeHRlbnNpb24oKTsgLy8kTk9OLU5MUy0xJAotCQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGlkLCBpbnB1dFN0cmVhbSwgbnVsbCk7Ci0KLQkJCQkvLyBmb3JtYXQKLQkJCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCi0JCQkJLy8gcmV0dXJuIG91dHB1dAotCQkJCXJldHVybiBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQllbnN1cmVDbG9zZWQobnVsbCwgaW5wdXRTdHJlYW0pOwotCQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJcmV0dXJuIGlucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKChzdGFydCA+PSAwKSAmJiAobGVuZ3RoID49IDApICYmIChzdGFydCArIGxlbmd0aCA8PSBkb2N1bWVudC5nZXRMZW5ndGgoKSkpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJCS8vIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBzZXR1cCBzdHJ1Y3R1cmVkTW9kZWwKLQkJCQkvLyBOb3RlOiBXZSBhcmUgZ2V0dGluZyBtb2RlbCBmb3IgZWRpdC4gV2lsbCBzYXZlIG1vZGVsIGlmCi0JCQkJLy8gbW9kZWwgY2hhbmdlZC4KLQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQotCQkJCS8vIGZvcm1hdAotCQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCQkvLyBzYXZlIG1vZGVsIGlmIG5lZWRlZAotCQkJCWlmICghc3RydWN0dXJlZE1vZGVsLmlzU2hhcmVkRm9yRWRpdCgpICYmIHN0cnVjdHVyZWRNb2RlbC5pc1NhdmVOZWVkZWQoKSkKLQkJCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRGaWxlKElGaWxlIGZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCXN0cnVjdHVyZWRNb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZShJRmlsZSBmaWxlLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCXN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JFZGl0KGZpbGUpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIG51bGwpOwotCQkJLy8gcmVsZWFzZSBmcm9tIG1vZGVsIG1hbmFnZXIKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXRGaWxlTmFtZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0RmlsZU5hbWUoU3RyaW5nIGZpbGVOYW1lLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmaWxlTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQkJSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBudWxsOwotCQkvLyBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5IHsKLQkJCS8vIHNldHVwIHN0cnVjdHVyZWRNb2RlbAotCQkJLy8gTm90ZTogV2UgYXJlIGdldHRpbmcgbW9kZWwgZm9yIGVkaXQuIFdpbGwgc2F2ZSBtb2RlbCBpZiBtb2RlbAotCQkJLy8gY2hhbmdlZC4KLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlTmFtZSk7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlTmFtZSwgaW5wdXRTdHJlYW0sIG51bGwpOwotCi0JCQkvLyBmb3JtYXQKLQkJCWZvcm1hdE1vZGVsKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0KLQkJCS8vIHNhdmUgbW9kZWwgaWYgbmVlZGVkCi0JCQlpZiAoIXN0cnVjdHVyZWRNb2RlbC5pc1NoYXJlZEZvckVkaXQoKSAmJiBzdHJ1Y3R1cmVkTW9kZWwuaXNTYXZlTmVlZGVkKCkpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnNhdmUoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIGVuc3VyZUNsb3NlZChvdXRwdXRTdHJlYW0sIGlucHV0U3RyZWFtKTsKLQkJCS8vIHJlbGVhc2UgZnJvbSBtb2RlbCBtYW5hZ2VyCi0JCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpCi0JCQkJc3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHN0YXJ0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQotCQlmb3JtYXRNb2RlbChzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0LCBsZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJaWYgKHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSBpbnN0YW5jZW9mIElEb2N1bWVudEV4dGVuc2lvbjQpIHsKLQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCX0KLQkJCURvY3VtZW50UmV3cml0ZVNlc3Npb24gcmV3cml0ZVNlc3Npb24gPSBudWxsOwotCi0JCQl0cnkgewotCQkJCS8vIHdoZW5ldmVyIGZvcm1hdHRpbmcgbW9kZWwsIGZpcmUgYWJvdXR0b2NoYW5nZS9tb2RlbGNoYW5nZWQKLQkJCQlzdHJ1Y3R1cmVkTW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsKSA/IG51bGwgOiBkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQotCQkJCWlmICgoc3RhcnQgPT0gMCkgJiYgKGxlbmd0aCA9PSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpKQotCQkJCQlzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChzdHJ1Y3R1cmVkTW9kZWwsIGZhbHNlKTsKLQkJCQllbHNlCi0JCQkJCXNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHN0cnVjdHVyZWRNb2RlbCwgdHJ1ZSk7Ci0KLQkJCQlpZiAoKHN0YXJ0ID49IDApICYmIChsZW5ndGggPj0gMCkgJiYgKHN0YXJ0ICsgbGVuZ3RoIDw9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkpIHsKLQkJCQkJTGlzdCBhY3RpdmVOb2RlcyA9IGdldEFsbEFjdGl2ZU5vZGVzKHN0cnVjdHVyZWRNb2RlbCwgc3RhcnQsIGxlbmd0aCk7Ci0JCQkJCWlmIChhY3RpdmVOb2Rlcy5zaXplKCkgPiAwKSB7Ci0JCQkJCQlOb2RlIGZpcnN0Tm9kZSA9IChOb2RlKSBhY3RpdmVOb2Rlcy5nZXQoMCk7Ci0JCQkJCQlOb2RlIGxhc3ROb2RlID0gKE5vZGUpIGFjdGl2ZU5vZGVzLmdldChhY3RpdmVOb2Rlcy5zaXplKCkgLSAxKTsKLQotCQkJCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQkJCQlOb2RlIGVhY2hOb2RlID0gZmlyc3ROb2RlOwotCQkJCQkJTm9kZSBuZXh0Tm9kZSA9IG51bGw7Ci0JCQkJCQl3aGlsZSAoIWRvbmUpIHsKLQkJCQkJCQkvLyB1cGRhdGUgImRvbmUiCi0JCQkJCQkJZG9uZSA9IChlYWNoTm9kZSA9PSBsYXN0Tm9kZSk7Ci0KLQkJCQkJCQkvKgotCQkJCQkJCSAqIGdldCBuZXh0IHNpYmxpbmcgYmVmb3JlIGZvcm1hdCBiZWNhdXNlIGVhY2hOb2RlCi0JCQkJCQkJICogbWF5IGJlIGRlbGV0ZWQsIGZvciBleGFtcGxlIHdoZW4gaXQncyBhbiBlbXB0eQotCQkJCQkJCSAqIHRleHQgbm9kZQotCQkJCQkJCSAqLwotCQkJCQkJCW5leHROb2RlID0gZWFjaE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCS8vIGZvcm1hdCBlYWNoIG5vZGUKLQkJCQkJCQlmb3JtYXROb2RlKGVhY2hOb2RlKTsKLQotCQkJCQkJCS8vIHVwZGF0ZSBlYWNoIG5vZGUKLQkJCQkJCQlpZiAoKG5leHROb2RlICE9IG51bGwpICYmIChuZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCkgPT0gbnVsbCkpCi0JCQkJCQkJCS8vIG5leHROb2RlIGlzIGRlbGV0ZWQgZHVyaW5nIGZvcm1hdAotCQkJCQkJCQllYWNoTm9kZSA9IGVhY2hOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQllYWNoTm9kZSA9IG5leHROb2RlOwotCi0JCQkJCQkJLy8gVGhpcyBzaG91bGQgbm90IGJlIG5lZWRlZCwgYnV0IGp1c3QgaW4gY2FzZQotCQkJCQkJCS8vIHNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggd2l0aCBlYWNoTm9kZS4KLQkJCQkJCQkvLyBXZSBkb24ndCB3YW50IGFuIGluZmluaXRlIGxvb3AgaGVyZS4KLQkJCQkJCQlpZiAoZWFjaE5vZGUgPT0gbnVsbCkKLQkJCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIHdlIG5lZWQgdHdvIGZpbmFsbHkncywganVzdCBpbiBjYXNlIGZpcnN0IGZhaWxzCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKChkb2NFeHQ0ICE9IG51bGwpICYmIChyZXdyaXRlU2Vzc2lvbiAhPSBudWxsKSkKLQkJCQkJCWRvY0V4dDQuc3RvcFJld3JpdGVTZXNzaW9uKHJld3JpdGVTZXNzaW9uKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCS8vIGFsd2F5cyBtYWtlIHN1cmUgdG8gZmlyZSBjaGFuZ2VkbW9kZWwgd2hlbiBkb25lCi0JCQkJCXN0cnVjdHVyZWRNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBmb3JtYXROb2RlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlOb2RlIG5ld05vZGUgPSBub2RlOwotCi0JCQkvLyBmb3JtYXQgdGhlIG93bmVyIG5vZGUgaWYgaXQncyBhbiBhdHRyaWJ1dGUgbm9kZQotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCW5ld05vZGUgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCi0JCQkvLyByZWZyZXNoIGZvcm1hdCBwcmVmZXJlbmNlcyBiZWZvcmUgZ2V0dGluZyBmb3JtYXR0ZXIKLQkJCWlmIChyZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMpCi0JCQkJcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCk7Ci0KLQkJCS8vIGdldCBmb3JtYXR0ZXIgYW5kIGZvcm1hdCBjb250cmFpbnRzCi0JCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIobmV3Tm9kZSk7Ci0JCQkvLyBUT0RPX2Z1dHVyZTogYWRkZWQgYXNzZXJ0IHRvIHJlcGxhY2UgInJlZHVuZGFudCBudWxsIGNoZWNrIi4KLQkJCS8vIGlmIGZvcm1hdHRlciBpcyBldmVyIG51bGwsIHdlIHNob3VsZCBwcm92aWRlIHNvbWUKLQkJCS8vIGRlZmF1bHQgZm9ybWF0dGVyIHRvIHNlcnZlIGFzIHBsYWNlIGhvbGRlci4KLQkJCUFzc2VydC5pc05vdE51bGwoZm9ybWF0dGVyLCAiZm9ybWF0dGVyIHdhcyBudWxsIGZvciBhIG5vZGUsICIpOyAvLyROT04tTkxTLTEkCi0JCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyA9IGZvcm1hdHRlci5nZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0JCQlmb3JtYXRDb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KHRydWUpOwotCQkJLy8gZm9ybWF0IGVhY2ggbm9kZQotCQkJZm9ybWF0dGVyLmZvcm1hdChuZXdOb2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIFVzZSBnZXRBbGxBY3RpdmVOb2RlcyBpbnN0ZWFkCi0JICovCi0JcHJvdGVjdGVkIFZlY3RvciBnZXRBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlMaXN0IGFsbEFjdGl2ZU5vZGVzID0gZ2V0QWxsQWN0aXZlTm9kZXMoc3RydWN0dXJlZE1vZGVsLCBzdGFydE5vZGVPZmZzZXQsIGxlbmd0aCk7Ci0JCXJldHVybiBuZXcgVmVjdG9yKGFsbEFjdGl2ZU5vZGVzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRBbGxBY3RpdmVOb2RlcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgaW50IHN0YXJ0Tm9kZU9mZnNldCwgaW50IGxlbmd0aCkgewotCQlMaXN0IGFjdGl2ZU5vZGVzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJTm9kZSBzdGFydE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0KTsKLQkJCS8vIHNlZSBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDcxMQotCQkJLy8KLQkJCS8vIFdlIGhhdmUgdG8gd2F0Y2ggZm9yIHNlbGVjdGlvbiBib3VuZGFyeSBjb25kaXRpb25zLiBVc2UgdGhpcyBhcwotCQkJLy8gYW4gZXhhbXBsZTogPGE+dGV4dDwvYT48Yj50ZXh0PC9iPiwKLQkJCS8vIElmIHRoZSB3aG9sZSA8YT4gbm9kZSBpcyBzZWxlY3RlZCwgbGlrZToKLQkJCS8vIHw8YT50ZXh0PC9hPnw8Yj50ZXh0PC9iPiwgd2UgbmVlZCB0byBzdWJzdHJhY3QgdGhlIGxlbmd0aCBieSAxCi0JCQkvLyB0byBmaW5kCi0JCQkvLyB0aGUgbm9kZSBhdCB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb246Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGggLSAxKSwKLQkJCS8vIG9yIGVsc2UKLQkJCS8vIHdlJ2QgZmluZCB0aGUgbmV4dCBhZGphY2VudCBub2RlLgotCQkJLy8KLQkJCS8vIEhvd2V2ZXIsIHdoZW4gdGhlIHNlbGVjdGlvbiBsZW5ndGggaXMgMCAobWVhbmluZyBubyB0ZXh0IGlzCi0JCQkvLyBzZWxlY3RlZCksIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGJlZ2lubmluZwotCQkJLy8gb2YgdGhlIG5vZGUgd2Ugd2FudCB0byBmb3JtYXQ6IHw8YT50ZXh0PC9hPjxiPnRleHQ8L2I+LCB0aGUKLQkJCS8vIG5vZGUgYXQgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGlzOgotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoKS4KLQkJCWludCBlbmROb2RlT2Zmc2V0ID0gbGVuZ3RoID4gMCA/IHN0YXJ0Tm9kZU9mZnNldCArIGxlbmd0aCAtIDEgOiBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGg7Ci0JCQlOb2RlIGVuZE5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oZW5kTm9kZU9mZnNldCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBpdCdzIGFuIG5vbi1lbXB0eSBkb2N1bWVudAotCQkJaWYgKHN0YXJ0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJd2hpbGUgKGlzU2libGluZ09mKHN0YXJ0Tm9kZSwgZW5kTm9kZSkgPT0gZmFsc2UpIHsKLQkJCQkJaWYgKGVuZE5vZGUgIT0gbnVsbCkKLQkJCQkJCWVuZE5vZGUgPSBlbmROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkgewotCQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCS8vIHNlZQotCQkJCQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ3MTEKLQkJCQkJCS8vIGFuZCBub3RlcyBhYm92ZQotCQkJCQkJZW5kTm9kZU9mZnNldCA9IGxlbmd0aCA+IDAgPyBzdGFydE5vZGVPZmZzZXQgKyBsZW5ndGggLSAxIDogc3RhcnROb2RlT2Zmc2V0ICsgbGVuZ3RoOwotCQkJCQkJZW5kTm9kZSA9IChOb2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihlbmROb2RlT2Zmc2V0KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCXdoaWxlIChzdGFydE5vZGUgIT0gZW5kTm9kZSkgewotCQkJCQlhY3RpdmVOb2Rlcy5hZGQoc3RhcnROb2RlKTsKLQkJCQkJc3RhcnROb2RlID0gc3RhcnROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJfQotCQkJCWlmIChzdGFydE5vZGUgIT0gbnVsbCkKLQkJCQkJYWN0aXZlTm9kZXMuYWRkKHN0YXJ0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYWN0aXZlTm9kZXM7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZyBnZXRGaWxlRXh0ZW5zaW9uKCk7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gMjYyMTM1IC0gTlBFIGR1cmluZyBmb3JtYXQgb2YgZW1wdHkgZG9jdW1lbnQKLQkJaWYgKChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsKSAmJiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oMCk7Ci0KLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZEZvcm1hdHRlciBmb3JtYXR0ZXIgPSBnZXRGb3JtYXR0ZXIobm9kZSk7Ci0JCQkJaWYgKGZvcm1hdHRlciAhPSBudWxsKSB7Ci0JCQkJCWZGb3JtYXRDb250cmFpbnRzID0gZm9ybWF0dGVyLmdldEZvcm1hdENvbnRyYWludHMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0dGVyIGdldEZvcm1hdHRlcihOb2RlIG5vZGUpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNTaWJsaW5nT2YoTm9kZSBub2RlLCBOb2RlIGVuZE5vZGUpIHsKLQkJaWYgKGVuZE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlIHsKLQkJCU5vZGUgc2libGluZ05vZGUgPSBub2RlOwotCQkJd2hpbGUgKHNpYmxpbmdOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoc2libGluZ05vZGUgPT0gZW5kTm9kZSkKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJZWxzZQotCQkJCQlzaWJsaW5nTm9kZSA9IHNpYmxpbmdOb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCByZWZyZXNoRm9ybWF0UHJlZmVyZW5jZXMoKTsKLQotCXByb3RlY3RlZCB2b2lkIHNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBib29sZWFuIGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzID0gZ2V0Rm9ybWF0Q29udHJhaW50cyhzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCWlmIChmb3JtYXRDb250cmFpbnRzICE9IG51bGwpCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZGM3MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLS8qKgotICogVGhlc2UgYXJlIGl0ZW1zIHRoYXQgY2hhbmdlIGZyb20gZWxlbWVudCB0byBlbGVtZW50LgotICogUGFzc2VkIGZyb20gbm9kZSB0byBub2RlIGluIGEgcmVjdXJzaXZlIGNhbGwuCi0gKiBlZy4gY3VycmVudCBpbmRlbnQgaXMgMiBkZWVwLCBidXQgZm9yIHRoZSBuZXh0IG5vZGUgbWlnaHQgYmUgMy4uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyB7Ci0JYm9vbGVhbiBnZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCVN0cmluZyBnZXRDdXJyZW50SW5kZW50KCk7Ci0KLQlib29sZWFuIGdldEZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KCk7Ci0KLQlib29sZWFuIGdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKTsKLQotCS8qKiAKLQkgKiBzb21lIHNwZWNpYWwgZWxlbWVudHMgY2FuIGlnbm9yZSBjbGVhcmluZyBibGFuayBsaW5lcwotCSAqICovCi0Jdm9pZCBzZXRDbGVhckFsbEJsYW5rTGluZXMoYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMpOwotCi0Jdm9pZCBzZXRDdXJyZW50SW5kZW50KFN0cmluZyBjdXJyZW50SW5kZW50KTsKLQotCXZvaWQgc2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoYm9vbGVhbiBmb3JtYXRXaXRoU2libGluZ0luZGVudCk7Ci0JCi0Jdm9pZCBzZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGJvb2xlYW4gaW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ODE5ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi0vKioKLSAqIFRoZXNlIGFyZSBpdGVtcyB0aGF0IGRvIG5vdCBjaGFuZ2UgZnJvbSBlbGVtZW50IHRvIGVsZW1lbnQuCi0gKiBQYXNzZWQgZnJvbSBub2RlIHRvIG5vZGUgaW4gYSByZWN1cnNpdmUgY2FsbCBiZWNhdXNlIHNvbWV0aW1lcwotICogY2hpbGQgbm9kZXMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIHByZWZlcmVuY2VzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyB7Ci0JCi0JYm9vbGVhbiBnZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCVN0cmluZyBnZXRJbmRlbnQoKTsKLQotCWludCBnZXRMaW5lV2lkdGgoKTsKLQotCXZvaWQgc2V0Q2xlYXJBbGxCbGFua0xpbmVzKGJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzKTsKLQotCXZvaWQgc2V0SW5kZW50KFN0cmluZyBpbmRlbnQpOwotCi0Jdm9pZCBzZXRMaW5lV2lkdGgoaW50IGxpbmVXaWR0aCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9mb3JtYXQvSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyNDgxMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhlIG1haW4gZm9ybWF0dGluZyBlbmdpbmUuICAKLSAqIExvb3BzIHRocm91Z2ggYWxsIHRoZSBub2RlcyBpbiBhbiBJU3RydWN0dXJlZE1vZGVsLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIHsKLQotCS8qKgotCSAqIFRoaXMgZm9ybSBvZiB0aGUgRm9ybWF0UHJvY2Vzc29yIHRha2VzIGFuIElEb2N1bWVudCBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRG9jdW1lbnQncyBmaWxlCi0JICogZXh0ZW5zaW9uLCBmb3JtYXRzIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aCwgdGhlbiByZWxlYXNlcyB0aGUKLQkgKiBtb2RlbC4KLQkgKi8KLQl2b2lkIGZvcm1hdERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhbiBJRmlsZSBhcyBpbnB1dCwgY3JlYXRlcyBhCi0JICogdGVtcG9yYXJ5IG1vZGVsIG9mIGNvbnRlbnQgdHlwZSBjYWxjdWxhdGVkIHVzaW5nIHRoZSBJRmlsZSdzIGZpbGUKLQkgKiBleHRlbnNpb24sIGZvcm1hdHMgdGhlIHdob2xlIG1vZGVsLCB0aGVuIHJlbGVhc2VzIHRoZSBtb2RlbC4KLQkgKi8KLQl2b2lkIGZvcm1hdEZpbGUoSUZpbGUgZmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBtb2RlbCBhcyBpbnB1dCwgYW5kIGZvcm1hdHMKLQkgKiB0aGUgd2hvbGUgbW9kZWwuCi0JICovCi0Jdm9pZCBmb3JtYXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEZvcm1hdFByb2Nlc3NvciB0YWtlcyBhIG1vZGVsIGFzIGlucHV0LCBhbmQgZm9ybWF0cwotCSAqIHRoZSBtb2RlbCB3aXRoaW4gc3RhcnQgYW5kIGxlbmd0aC4KLQkgKi8KLQl2b2lkIGZvcm1hdE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBmb3JtIG9mIHRoZSBGb3JtYXRQcm9jZXNzb3IgdGFrZXMgYSBub2RlIGFzIGlucHV0LCBhbmQgZm9ybWF0cyB0aGUKLQkgKiBub2RlIGFuZCBhbGwgaXRzIGNoaWxkcmVuLgotCSAqLwotCXZvaWQgZm9ybWF0Tm9kZShOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcHJvZ3Jlc3MgbW9uaXRvciBmb3IgdGhpcyA8Y29kZT5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjwvY29kZT4uCi0JICogVGhlIG1vbml0b3IgaXMgdXNlZCB0byBkaXNwbGF5IHByb2dyZXNzIG9yIGNhbmNlbCBpZiB0aGUgZm9ybWF0dGVyIGlzIHJ1biAKLQkgKiBpbiBhIGJhY2tncm91bmQgam9iLgotCSAqIEBwYXJhbSBtb25pdG9yCi0JICovCi0Jdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjJlZTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0dGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEtub3dzIGhvdyB0byBmb3JtYXQgYSBwYXJ0aWN1bGFyIG5vZGUuCi0gKiAKLSAqIGVnLiBnZW5lcmljIG5vZGUsIHRleHQgbm9kZSwgZG9jdW1lbnQgbm9kZSwgY29tbWVudCwgZXRjLi4uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRGb3JtYXR0ZXIgewotCQotCXZvaWQgZm9ybWF0KE5vZGUgbm9kZSk7Ci0KLQl2b2lkIGZvcm1hdChOb2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKTsKLQotCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBnZXRGb3JtYXRDb250cmFpbnRzKCk7Ci0KLQlJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGdldEZvcm1hdFByZWZlcmVuY2VzKCk7Ci0KLQl2b2lkIHNldEZvcm1hdFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpOwotCi0Jdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTk1YzRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdDsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIHsKLQlwcml2YXRlIGJvb2xlYW4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudEluZGVudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBib29sZWFuIGZGb3JtYXRXaXRoU2libGluZ0luZGVudCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCA9IGZhbHNlOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkgewotCQlyZXR1cm4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRJbmRlbnQoKSB7Ci0JCXJldHVybiBmQ3VycmVudEluZGVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBnZXRGb3JtYXRXaXRoU2libGluZ0luZGVudCgpIHsKLQkJcmV0dXJuIGZGb3JtYXRXaXRoU2libGluZ0luZGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDbGVhckFsbEJsYW5rTGluZXMoYm9vbGVhbiBjbGVhckFsbEJsYW5rTGluZXMpIHsKLQkJZkNsZWFyQWxsQmxhbmtMaW5lcyA9IGNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDdXJyZW50SW5kZW50KFN0cmluZyBjdXJyZW50SW5kZW50KSB7Ci0JCWZDdXJyZW50SW5kZW50ID0gY3VycmVudEluZGVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRXaXRoU2libGluZ0luZGVudChib29sZWFuIGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50KSB7Ci0JCWZGb3JtYXRXaXRoU2libGluZ0luZGVudCA9IGZvcm1hdFdpdGhTaWJsaW5nSW5kZW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSB7Ci0JCXJldHVybiBmSW5QcmVzZXJ2ZVNwYWNlRWxlbWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGJvb2xlYW4gaW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCkgewotCQlmSW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCA9IGluUHJlc2VydmVTcGFjZUVsZW1lbnQ7CQkKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2FkN2NkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0OwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzIGltcGxlbWVudHMgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlcyB7Ci0JcHJpdmF0ZSBib29sZWFuIGZDbGVhckFsbEJsYW5rTGluZXM7Ci0JcHJpdmF0ZSBTdHJpbmcgZkluZGVudDsKLQlwcml2YXRlIGludCBmTGluZVdpZHRoOwotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCkgewotCQlyZXR1cm4gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEluZGVudCgpIHsKLQkJcmV0dXJuIGZJbmRlbnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lV2lkdGgoKSB7Ci0JCXJldHVybiBmTGluZVdpZHRoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFyQWxsQmxhbmtMaW5lcyhib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcykgewotCQlmQ2xlYXJBbGxCbGFua0xpbmVzID0gY2xlYXJBbGxCbGFua0xpbmVzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluZGVudChTdHJpbmcgaW5kZW50KSB7Ci0JCWZJbmRlbnQgPSBpbmRlbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGluZVdpZHRoKGludCBsaW5lV2lkdGgpIHsKLQkJZkxpbmVXaWR0aCA9IGxpbmVXaWR0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvQWJzdHJhY3RNb2RlbEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjlmYTI2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9BYnN0cmFjdE1vZGVsSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyOwotCi0vKioKLSAqIElTU1VFOiBuZWVkIHRvIHByb3ZpZGUgdGhpcyBmdW5jdGlvbmFsaXR5IGluIGltcHJvdmVkIEFQSS4KLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb2RlbEhhbmRsZXIgaW1wbGVtZW50cyBJTW9kZWxIYW5kbGVyIHsKLQlwcml2YXRlIFN0cmluZyBhc3NvY2lhdGVkQ29udGVudFR5cGVJZDsKLQlwcml2YXRlIGJvb2xlYW4gZGVmYXVsdFNldHRpbmc7Ci0JcHJpdmF0ZSBTdHJpbmcgbW9kZWxIYW5kbGVySUQ7Ci0KLQlwdWJsaWMgQWJzdHJhY3RNb2RlbEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhlc2UgZmFjdG9yaWVzIGFyZSBhZGRlZCBhdXRvbWF0aWNhbGx5IGJ5IG1vZGVsIG1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ29sbGVjdGlvbiBob2xkRmFjdG9yaWVzID0gUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yaWVzKHRoaXMpOwotCQlpZiAoaG9sZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKGhvbGRGYWN0b3JpZXMpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpIHsKLQkJcmV0dXJuIGFzc29jaWF0ZWRDb250ZW50VHlwZUlkOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpOwotCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQkJcmV0dXJuIG1vZGVsSGFuZGxlcklEOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdCgpIHsKLQkJcmV0dXJuIGRlZmF1bHRTZXR0aW5nOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkID0gY29udGVudFR5cGVJZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KGJvb2xlYW4gZGVmYXVsdFBhcmFtKSB7Ci0JCWRlZmF1bHRTZXR0aW5nID0gZGVmYXVsdFBhcmFtOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldElkKFN0cmluZyBpZCkgewotCQltb2RlbEhhbmRsZXJJRCA9IGlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTM3ZDVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRW1iZWRkZWRUeXBlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGVzZSBBZGFwdGVyRmFjdG9yaWVzIGFyZSBOT1QgYWRkZWQgdG8gSVN0cnVjdHVyZWRNb2RlbCdzCi0JICogSUFkYXB0ZXJGYWN0b3J5IFJlZ2lzdHJ5IC4uLiB0aGV5IGFyZSBmb3IgdXNlIGJ5ICJKU1AgQXdhcmUKLQkgKiBBZGFwdGVyRmFjdG9yaWVzIiBUaGUgYXJlIGFkZGVkIHRvIHRoZSAicmVnaXN0cnkiIGluIHRoZQotCSAqIFBhZ2VEaXJlY3RpdmVBZGFwdGVyLgotCSAqLwotCUxpc3QgZ2V0QWRhcHRlckZhY3RvcmllcygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBjb250ZW50IHR5cGUgZmFtaWx5IHRoaXMKLQkgKiBDb250ZW50VHlwZURlc2NyaXB0aW9uIGJlbG9uZ3MgdG8uCi0JICovCi0JU3RyaW5nIGdldEZhbWlseUlkKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbGlzdCBvZiBtaW1lIHR5cGVzIChhcyBTdHJpbmdzKSB0aGlzIGhhbmRsZXIgaXMgYXBwcm9wcmlhdGUKLQkgKiBmb3IKLQkgKi8KLQlMaXN0IGdldFN1cHBvcnRlZE1pbWVUeXBlcygpOwotCQotCS8qKgotCSAqIElmIHRoaXMgaGFuZGVyIGNhbiBoYW5kbGUgYSBnaXZlbiBtaW1lVHlwZS4KLQkgKiAKLQkgKiBUaGlzIGlzIGEgbG9vc2VyIGNoZWNrIHRoYW4gc2ltcGx5IGNoZWNraW5nIGlmIGEgZ2l2ZSBtaW1lVHlwZQotCSAqIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB0eXBlcywgc28gaXQgc2hvdWxkIGJlIHVzZWQgd2l0aCB0aGF0Ci0JICogaW4gbWluZC4gIFRoYXQgaXMsIHRoZSBzdXBwb3J0ZWQgbWltZVR5cGUgbGlzdCBzaG91bGQgaWRlYWxseSBiZQotCSAqIGNoZWNrZWQgZmlyc3QuCi0JICogCi0JICogZWcuIGlmIGEgbWltZSB0eXBlIGVuZHMgd2l0aCAiK3htbCIsIGxpa2Ugdm9pY2UreG1sCi0JICogICAgIHRoZSBFbWJlZGRlZFhNTCBoYW5kbGVyIHNob3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBpdAotCSAqICAgICAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBoYW5kbGVyIHRoaW5rcyBjYW4gaGFuZGxlIHRoZSBnaXZlbiBtaW1lVHlwZQotCSAqLwotCWJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKTsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byBnaXZlIHRoZSBFbWJlZGRlZENvbnRlbnRUeXBlIGFuIG9wcG9ydHVuaXR5IHRvIGFkZAotCSAqIGZhY3RvcmllcyBkaXJlY3RseSB0byB0aGUgSVN0cnVjdHVyZWRNb2RlbCdzIElBZGFwdGVyRmFjdG9yeSByZWdpc3RyeS4KLQkgKi8KLQl2b2lkIGluaXRpYWxpemVGYWN0b3J5UmVnaXN0cnkoRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5KTsKLQotCS8qKgotCSAqIGluaXRpYWxpemVQYXJzZXIgSXRzIHB1cnBvc2UgaXMgdG8gc2V0QmxvY2tUYWdzCi0JICovCi0Jdm9pZCBpbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKTsKLQotCWJvb2xlYW4gaXNEZWZhdWx0KCk7Ci0KLQlFbWJlZGRlZFR5cGVIYW5kbGVyIG5ld0luc3RhbmNlKCk7Ci0KLQl2b2lkIHVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpOwotCi0Jdm9pZCB1bmluaXRpYWxpemVQYXJzZXIoSlNQQ2FwYWJsZVBhcnNlciBwYXJzZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvbW9kZWxoYW5kbGVyL0lEb2N1bWVudFR5cGVIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSURvY3VtZW50VHlwZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjUwYzg1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSURvY3VtZW50VHlwZUhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50Q2hhcnNldERldGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIGFsbG93IGN1c3RvbSBjb250ZW50IHR5cGVzIHRvIGJlIGRlZmluZWQgYXMgZXh0ZW5zaW9uIHBvaW50cwotICogaW4gcGx1Z2lucy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJRG9jdW1lbnRUeXBlSGFuZGxlciB7Ci0KLQkvKioKLQkgKiBUaGUgTG9hZGVyIGlzIHJlcG9uc2libGUgZm9yIGRlY29kaW5nIHRoZSBSZXNvdXJjZSwKLQkgKi8KLQlJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gbGlrZWx5IHRvIGdvIGF3YXksIHNvIEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8KLQkgKiAgICAgICAgICAgICBkaXNjb3Vyc2FnZSB1c2UKLQkgKi8KLQlJRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3IgZ2V0RW5jb2RpbmdEZXRlY3RvcigpOwotCi0JLyoqCi0JICogTXVzdCByZXR1cm4gdW5pcXVlIElEIHRoYXQgaXMgdGhlIHNhbWUgYXMgaWRlbnRpZmllZCBpbiBwbHVnaW4gcmVnaXN0cnkKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JTW9kZWxIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9tb2RlbGhhbmRsZXIvSU1vZGVsSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDJiM2ZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL21vZGVsaGFuZGxlci9JTW9kZWxIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsSGFuZGxlciBleHRlbmRzIElEb2N1bWVudFR5cGVIYW5kbGVyIHsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIEZhY3RvcmllcyB3aGljaCBhcmUgYWRkZWQgYXV0b21hdGljYWxseSBieQotCSAqIElNb2RlbE1hbmFnZXIuIFRoaXMgY2FuIGFuZCB3aWxsIG9mdGVuIGJlIGFuIGVtcHR5IExpc3QgKG9yIG51bGwpLAotCSAqIHNpbmNlIHNvbWUgQWRhcHRlckZhY3RvcmllcyBtdXN0IGJlIGFkZGVkIGJ5IExvYWRlciBkaXJlY3RseSwgYW5kIG1vc3QKLQkgKiBzaG91bGQgYmUgYWRkZWQgYnkgRWRpdG9ycy4gRm9ybWF0QWRhcHRlckZhY3RvcnkgaXMgYW4gZXhhbXBsZSBvZiBvbmUKLQkgKiB0aGF0IGNhbiBiZSByZXR1cm5lZCBoZXJlLCBzaW5jZSB0aGUgdGltaW5nIG9mIGFkZGluZyBpdCBpcyBub3QKLQkgKiBjcml0aWNhbCwgYnV0IGl0IG1heSBiZSBuZWVkZWQgZXZlbiB3aGVuIGFuIGVkaXRvciBpcyBub3QgYmVpbmcgdXNlZC4KLQkgKi8KLQlMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIElEIGZvciB0aGUgYXNzb2NpYXRlZCBDb250ZW50VHlwZUhhbmRsZXIgQnV0IGlzIG5lZWRlZCBmb3IKLQkgKiBub3cuCi0JICovCi0JU3RyaW5nIGdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0KLQkvKioKLQkgKiBUaGUgTG9hZGVyIGlzIHJlcG9uc2libGUgZm9yIGRlY29kaW5nIHRoZSBSZXNvdXJjZSwKLQkgKi8KLQlJTW9kZWxMb2FkZXIgZ2V0TW9kZWxMb2FkZXIoKTsKLQotCWJvb2xlYW4gaXNEZWZhdWx0KCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tNYXJrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja01hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjdmZjU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja01hcmtlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotLyoqCi0gKiBJU1NVRTogbmVlZCB0byBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgaW4gaW1wcm92ZWQgQVBJLiAKLSAqLwotcHVibGljIGNsYXNzIEJsb2NrTWFya2VyIGV4dGVuZHMgVGFnTWFya2VyIHsKLQotCS8vIGFsbG93IGZvciBKU1AgZXhwcmVzc2lvbnMgd2l0aGluIHRoZSBibG9jawotCXByb3RlY3RlZCBib29sZWFuIGZBbGxvd0pTUCA9IHRydWU7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBmQ2FzZVNlbnNpdGl2ZSA9IGZhbHNlOwotCi0JLy8gdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50cyBvZiB0aGlzIHRhZyAoQkxPQ0tfVEVYVCwgSlNQX0NPTlRFTlQsCi0JLy8gZXRjLikKLQlwcm90ZWN0ZWQgU3RyaW5nIGZDb250ZXh0OwotCi0JLyoqCi0JICogSXQncyBub3QgYXBwcm9wcmlhdGUgdG8gbWFrZSAiZW1wdHkiIEJsb2NrTWFya2VyLCBzbyB3ZSdsbCBtYXJrIGFzCi0JICogcHJpdmF0ZS4KLQkgKi8KLQlwcml2YXRlIEJsb2NrTWFya2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gbWFya2VyLCBTdHJpbmcgY29udGV4dCkgewotCQl0aGlzKHRhZ05hbWUsIG1hcmtlciwgY29udGV4dCwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIEJsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lLCBJVGV4dFJlZ2lvbiBtYXJrZXIsIFN0cmluZyBjb250ZXh0LCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJdGhpcyh0YWdOYW1lLCBtYXJrZXIsIGNvbnRleHQsIGNhc2VTZW5zaXRpdmUsIHRydWUpOwotCX0KLQotCXB1YmxpYyBCbG9ja01hcmtlcihTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gbWFya2VyLCBTdHJpbmcgY29udGV4dCwgYm9vbGVhbiBjYXNlU2Vuc2l0aXZlLCBib29sZWFuIGFsbG93SlNQKSB7Ci0JCXN1cGVyKHRhZ05hbWUsIG1hcmtlcik7Ci0JCXNldENvbnRleHQoY29udGV4dCk7Ci0JCXNldENhc2VTZW5zaXRpdmUoY2FzZVNlbnNpdGl2ZSk7Ci0JCXNldEFsbG93SlNQKGFsbG93SlNQKTsKLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyByZWdpb25Db250ZXh0LCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJdGhpcyh0YWdOYW1lLCBudWxsLCByZWdpb25Db250ZXh0LCBjYXNlU2Vuc2l0aXZlLCBmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgYWxsb3dKU1AuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGFsbG93c0pTUCgpIHsKLQkJcmV0dXJuIGZBbGxvd0pTUDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGZDb250ZXh0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpIHsKLQkJcmV0dXJuIGZDYXNlU2Vuc2l0aXZlOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGFsbG93SlNQLgotCSAqIAotCSAqIEBwYXJhbSBhbGxvd0pTUAotCSAqICAgICAgICAgICAgVGhlIGFsbG93SlNQIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFsbG93SlNQKGJvb2xlYW4gYWxsb3dKU1ApIHsKLQkJZkFsbG93SlNQID0gYWxsb3dKU1A7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FzZVNlbnNpdGl2ZShib29sZWFuIHNlbnNpdGl2ZSkgewotCQlmQ2FzZVNlbnNpdGl2ZSA9IHNlbnNpdGl2ZTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZXh0Ci0JICogICAgICAgICAgICBUaGUgY29udGV4dCB0byBzZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb250ZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCWZDb250ZXh0ID0gY29udGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9CbG9ja1RhZ1BhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVGFnUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNWQ0ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVGFnUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEJsb2NrVGFnUGFyc2VyIHsKLQotCXZvaWQgYWRkQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKTsKLQotCXZvaWQgYmVnaW5CbG9ja1NjYW4oU3RyaW5nIHRhZ05hbWUpOwotCi0JQmxvY2tNYXJrZXIgZ2V0QmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpOwotCi0JTGlzdCBnZXRCbG9ja01hcmtlcnMoKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKTsKLQotCXZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0Jsb2NrVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI4M2M0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvQmxvY2tUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGludGVyZmFjZSBCbG9ja1Rva2VuaXplciB7Ci0KLQl2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcik7Ci0KLQl2b2lkIGJlZ2luQmxvY2tNYXJrZXJTY2FuKFN0cmluZyBuZXdUYWdOYW1lLCBTdHJpbmcgY29udGV4dCk7Ci0KLQl2b2lkIGJlZ2luQmxvY2tUYWdTY2FuKFN0cmluZyBuZXdUYWdOYW1lKTsKLQotCUxpc3QgZ2V0QmxvY2tNYXJrZXJzKCk7Ci0KLQlJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQlpbnQgZ2V0T2Zmc2V0KCk7Ci0KLQlib29sZWFuIGlzRU9GKCk7Ci0KLQlCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpOwotCi0Jdm9pZCByZW1vdmVCbG9ja01hcmtlcihTdHJpbmcgdGFnbmFtZSk7Ci0KLQl2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpOwotCi0Jdm9pZCByZXNldChjaGFyW10gY2hhckFycmF5LCBpbnQgbmV3T2Zmc2V0KTsKLQotCXZvaWQgcmVzZXQoSW5wdXRTdHJlYW0gaW4pOwotCi0Jdm9pZCByZXNldChJbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCk7Ci0KLQl2b2lkIHJlc2V0KFJlYWRlciBpbik7Ci0KLQl2b2lkIHJlc2V0KFJlYWRlciBpbiwgaW50IG5ld09mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGVhYjBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMganVzdCBsaWtlIGFuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLSAqIGV4Y2VwdCByZXN1bHRzIGZyb20gcGFyc2luZyBhICJibG9jayB0YWciIChzdWNoIGFzIFNDUklQVCBvciBTVFlMRSkuCi0gKiBCZWNhdXNlIHRoZXNlIGFyZSAidmFyaWFibGUiIHBhcnRpdGlvbiB0eXBlcywgaXRzIG9mdGVuIGhhbmR5IChlZmZpY2llbnQpCi0gKiB0byBrZWVwIHRyYWNrIG9mIHRoZSBwYXJ0aXRpb24gdHlwZS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZXh0ZW5kcyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQkvKioKLQkgKiBSZXR1cm4gdGhlIHBhcnRpb24gdHlwZSBmb3IgdGhpcyByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgcGFydGlvbiB0eXBlLgotCSAqLwotCVN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwYXJ0aW9uIHR5cGUuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZS1wYXJzZXJzIG9ubHkuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKi8KLQl2b2lkIHNldFBhcnRpdGlvblR5cGUoU3RyaW5nIHBhcnRpdGlvblR5cGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0pTUENhcGFibGVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9KU1BDYXBhYmxlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2N2Y1YTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL0pTUENhcGFibGVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGludGVyZmFjZSBKU1BDYXBhYmxlUGFyc2VyIGV4dGVuZHMgUmVnaW9uUGFyc2VyLCBCbG9ja1RhZ1BhcnNlciB7Ci0Jdm9pZCBhZGROZXN0YWJsZVByZWZpeChUYWdNYXJrZXIgbWFya2VyKTsKLQotCS8qKgotCSAqIHJldHVybnMgdGhlIFRhZ01hcmtlcnMgZm9yIHByZWZpeGVzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgbmVzdGFibGUKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JTGlzdCBnZXROZXN0YWJsZVByZWZpeGVzKCk7Ci0KLQl2b2lkIHJlbW92ZU5lc3RhYmxlUHJlZml4KFN0cmluZyB0YWdOYW1lKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9SZWdpb25QYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9SZWdpb25QYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM4ZTk3Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvUmVnaW9uUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIFJlZ2lvblBhcnNlciB7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpOwotCi0JTGlzdCBnZXRSZWdpb25zKCk7Ci0KLQkvKioKLQkgKiBUaGUgJ25ld0luc3RhbmNlJyBtZXRob2QgaXMgc2ltaWxhciB0byAnY2xvbmUnLCBidXQgZG9lcyBub3QgaW5jbHVkZQotCSAqIHRoZSBjb3B5aW5nIG9mIGFueSBjb250ZW50LiBGb3IgYSBwdXJlIFJlZ2lvblBhcnNlciBpdHNlbGYsIHRoZXJlIHdvdWxkCi0JICogYmUgbGl0dGxlIHN0YXRlIHRvICJjbG9uZSIsIGJ1dCBmb3Igc29tZSBzdWJ0eXBlcywgc3VjaCBhcwotCSAqIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBhbmQgSlNQQ2FwYWJsZVBhcnNlciwgdGhlcmUgY291bGQgdGhlCi0JICogbW9yZSBpbnRlcm5hbCBkYXRhIHRvICJjbG9uZSIsIHN1Y2ggYXMgdGhlIGludGVybmFsIHRva2VuaXplciBzaG91bGQgYmUKLQkgKiBjbG9uZWQgKGluY2x1ZGluZyBibG9jayB0YWdzLCBldGMpLgotCSAqLwotCVJlZ2lvblBhcnNlciBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCByZXNldChSZWFkZXIgcmVhZGVyKTsKLQotCS8qKgotCSAqIEFuIGFkZGl0aW9uYWwgb2Zmc2V0IGZvciB1c2Ugd2l0aCBhbnkgcG9zaXRpb24tZGVwZW5kYW50IHBhcnNpbmcgcnVsZXMKLQkgKi8KLQl2b2lkIHJlc2V0KFJlYWRlciByZWFkZXIsIGludCBvZmZzZXQpOwotCi0Jdm9pZCByZXNldChTdHJpbmcgaW5wdXQpOwotCi0JLyoqCi0JICogQW4gYWRkaXRpb25hbCBvZmZzZXQgZm9yIHVzZSB3aXRoIGFueSBwb3NpdGlvbi1kZXBlbmRhbnQgcGFyc2luZyBydWxlcwotCSAqLwotCXZvaWQgcmVzZXQoU3RyaW5nIGlucHV0LCBpbnQgb2Zmc2V0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWNlMzA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciB7Ci0KLQkvLyBTZW50IHdoZW4gYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGZpcnN0IHBhcnNlZAotCXB1YmxpYyB2b2lkIG5vZGVQYXJzZWQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhQ29yZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkvLyBTZW50IHdoZW4gdGhlIGNhbGxpbmcgcGFyc2VyJ3MgbW9kZWwgdW5kZXJnb2VzIGEgZnVsbCByZXNldAotCS8vICAgYW5kIGFueSBpbmZvcm1hdGlvbiBiYXNlZCB1cG9uIHRoZSBvbGQgbW9kZWwgc2hvdWxkIGJlCi0JLy8gICBjbGVhcmVkCi0JcHVibGljIHZvaWQgcmVzZXROb2RlcygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZGIyNmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbiBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgewotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGEyNDk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLQotCi1wdWJsaWMgaW50ZXJmYWNlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciBleHRlbmRzIFJlZ2lvblBhcnNlciB7Ci0KLQl2b2lkIGFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKTsKLQotCXZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIpOwotCi0Jdm9pZCByZXNldEhhbmRsZXJzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL2x0ay9wYXJzZXIvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzZDhjMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlcjsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0KLQotcHVibGljIGludGVyZmFjZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24gZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGlzdCBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyBsaXN0ZW5pbmcKLQkgKiB0byB0aGlzIHBhcnNlci4KLQkgKiAKLQkgKiBAcmV0dXJuIExpc3QgLSB0aGUgbGlzdCBvZiBsaXN0ZW5lcnMsIHRoZSBsaXN0IG1heSBub3QgYmUgbnVsbCBhbmQgZWFjaAotCSAqICAgICAgICAgZWxlbWVudCBpbiBpdCBtdXN0IGltcGxlbWVudCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyCi0JICovCi0JTGlzdCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1RhZ01hcmtlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9sdGsvcGFyc2VyL1RhZ01hcmtlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzMyZTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbHRrL3BhcnNlci9UYWdNYXJrZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLQotLyoqCi0gKiBJU1NVRTogbmVlZCB0byBwcm92aWRlIGZ1bmN0aW9uYWxpdHkgaW4gaW1wcm92ZWQgQVBJLiAKLSAqLwotCi1wdWJsaWMgY2xhc3MgVGFnTWFya2VyIHsKLQotCS8vIGEgSVRleHRSZWdpb24gKG1lYW50IHRvIGJlIHVwZGF0ZWQgd2l0aCB0aGUgbW9kZWwpIG1hcmtpbmcgdGhlIHBvc2l0aW9uCi0JLy8gd2hlcmUgdGhpcyB0YWduYW1lIGJlY29tZXMgZWZmZWN0aXZlCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGZNYXJrZXIgPSBudWxsOwotCi0JLy8gdGhlIHRhZ25hbWUKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUYWdOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgVGFnTWFya2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBUYWdNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGFnTmFtZSh0YWduYW1lKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTWFya2VyKFN0cmluZyB0YWduYW1lLCBJVGV4dFJlZ2lvbiBtYXJrZXIpIHsKLQkJc3VwZXIoKTsKLQkJc2V0VGFnTmFtZSh0YWduYW1lKTsKLQkJc2V0TWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIGZpbmFsIElUZXh0UmVnaW9uIGdldE1hcmtlcigpIHsKLQkJcmV0dXJuIGZNYXJrZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGZpbmFsIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlyZXR1cm4gZlRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWwoKSB7Ci0JCXJldHVybiBmTWFya2VyID09IG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld01hcmtlcgotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldE1hcmtlcihJVGV4dFJlZ2lvbiBuZXdNYXJrZXIpIHsKLQkJZk1hcmtlciA9IG5ld01hcmtlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3VGFnbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIHNldFRhZ05hbWUoU3RyaW5nIG5ld1RhZ05hbWUpIHsKLQkJZlRhZ05hbWUgPSBuZXdUYWdOYW1lOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvQWJzdHJhY3RNb2RlbExvYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTEyZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdE1vZGVsTG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVGFnUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIGEgZmlsZSBhbmQgY3JlYXRlcyBhbiBTdHJ1Y3R1cmVkIE1vZGVsLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RNb2RlbExvYWRlciBpbXBsZW1lbnRzIElNb2RlbExvYWRlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgZW5jb2RpbmdOYW1lU2VhcmNoTGltaXQgPSAxMDAwOwotCi0JcHJpdmF0ZSBzdGF0aWMgbG9uZyBjb21wdXRlTWVtKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotCQkJU3lzdGVtLmdjKCk7Ci0JCQlTeXN0ZW0ucnVuRmluYWxpemF0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIFJ1bnRpbWUuZ2V0UnVudGltZSgpLnRvdGFsTWVtb3J5KCkgLSBSdW50aW1lLmdldFJ1bnRpbWUoKS5mcmVlTWVtb3J5KCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJvdGVjdGVkIElEb2N1bWVudExvYWRlciBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCi0JLyoqCi0JICogQWJzdHJhY3RMb2FkZXIgY29uc3RydWN0b3IgYWxzbyBpbml0aWFsaXplcyBlbmNvZGluZyBjb252ZXJ0ZXIvbWFwcGVyCi0JICovCi0JcHVibGljIEFic3RyYWN0TW9kZWxMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIExpc3QgZmFjdG9yeUxpc3QpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChtb2RlbCk7Ci0JCUZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSA9IG1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKHJlZ2lzdHJ5LCAiSVN0cnVjdHVyZWRNb2RlbCAiICsgbW9kZWwuZ2V0SWQoKSArICIgaGFzIGEgbnVsbCBGYWN0b3J5UmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChmYWN0b3J5TGlzdCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpdGVyYXRvciA9IGZhY3RvcnlMaXN0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQlyZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIHBlcmZvcm0gYWxsIHRoZSBtb2RlbCBpbml0aWFsaXphdGlvbiByZXF1aXJlZCBiZWZvcmUKLQkgKiBpdCBjb250YWlucyBjb250ZW50LCBuYW1lbHksIGl0IHNob3VsZCBjYWxsIG5ld01vZGVsLCB0aGUKLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgdGhlbiBhZGQgdGhvc2UgYWRhcHRlciBmYWN0b3JpZXMgd2hpY2gKLQkgKiBtdXN0IGJlIHNldCBiZWZvcmUgY29udGVudCBpcyBhcHBsaWVkLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGJ5Ci0JICogImxvYWQiIG1ldGhvZC4gKHRoaXMgaXMgdGVudGF0aXZlIEFQSSkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVNb2RlbCgpIHsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBuZXdNb2RlbCgpOwotCQlJRW5jb2RlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQltb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlhZGRGYWN0b3JpZXMobW9kZWwsIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCQkvLwotCQkJaW5pdEVtYmVkZGVkVHlwZVByZShtb2RlbCk7Ci0JCQlpbml0RW1iZWRkZWRUeXBlUG9zdChtb2RlbCk7Ci0JCQkvLyBGb3IgdHlwZXMgd2l0aCBwcm9wYWdhdGluZyBhZGFwdGVycywgaXRzIGltcG9ydGFudAotCQkJLy8gdGhhdCB0aGUgcHJvcGFnYXRpbmcgYWRhcHRlciBiZSBpbiBwbGFjZSBiZWZvcmUgdGhlIGNvbnRlbnRzCi0JCQkvLyBhcmUgc2V0LgotCQkJcHJlTG9hZEFkYXB0KG1vZGVsKTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIFN0cmluZyBiYXNlTG9jYXRpb24sIElNb2RlbEhhbmRsZXIgaGFuZGxlcikgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG5ld01vZGVsKCk7Ci0JCW1vZGVsLnNldEJhc2VMb2NhdGlvbihiYXNlTG9jYXRpb24pOwotCQkKLQkJLy8gaGFuZGxlciBtdXN0IGJlIHNldCBlYXJseSwgaW5jYXNlIGEgcmUtaW5pdCBpcyAKLQkJLy8gcmVxdWlyZWQgZHVyaW5nIGNyZWF0aW9uLgotCQltb2RlbC5zZXRNb2RlbEhhbmRsZXIoaGFuZGxlcik7Ci0JCQotCQlhZGRGYWN0b3JpZXMobW9kZWwsIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSk7Ci0JCS8vIEZvciB0eXBlcyB3aXRoIHByb3BhZ2F0aW5nIGFkYXB0ZXJzLCBpdCdzIGltcG9ydGFudAotCQkvLyB0aGF0IHRoZSBwcm9wYWdhdGluZyBhZGFwdGVyIGJlIGluIHBsYWNlIGJlZm9yZSB0aGUgY29udGVudHMKLQkJLy8gYXJlIHNldC4KLQkJcHJlTG9hZEFkYXB0KG1vZGVsKTsKLQkJaW5pdEVtYmVkZGVkVHlwZVByZShtb2RlbCk7Ci0KLQkJbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vCi0JCWluaXRFbWJlZGRlZFR5cGVQb3N0KG1vZGVsKTsKLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgY2xvbmluZyBtb2RlbHMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCkgewotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCA9IG5ld01vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkU3RydWN0dXJlZERvY3VtZW50ID0gb2xkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50ID0gb2xkU3RydWN0dXJlZERvY3VtZW50Lm5ld0luc3RhbmNlKCk7Ci0JCW5ld01vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyBOT1RFOiB3ZSBETyBOT1Qgc2ltcGx5IGFkZCB0aGUgc3RhbmRhcmQgb25lcyB0byB0aGUgbmV3IG1vZGVsCi0JCS8vIGFkZEZhY3RvcmllcyhuZXdNb2RlbCwgZ2V0QWRhcHRlckZhY3RvcmllcygpKTsKLQkJLy8gTm93LCB3ZSB0YWtlIHRoZSBvcHBvcnR1bml0eSB0byBhZGQgRmFjdG9yaWVzIGZyb20gdGhlIG9sZE1vZGVsJ3MKLQkJLy8gcmVnaXN0cnkgdG8gdGhlIG5ldyBtb2RlbCdzIHJlZ2lzdHJ5IC4uIGlmIHRoZXkgZG8gbm90IGFscmVhZHkKLQkJLy8gZXhpc3QgdGhlcmUuCi0JCWR1cGxpY2F0ZUZhY3RvcnlSZWdpc3RyeShuZXdNb2RlbCwgb2xkTW9kZWwpOwotCQlpZiAobmV3TW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgewotCQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgbmV3TW9kZWwpLnNldENvbnRlbnRUeXBlSWRlbnRpZmllcihvbGRNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCX0KLQkJLy8gYWRkRmFjdG9yaWVzKG5ld01vZGVsLCBvbGRNb2RlbCk7Ci0JCWluaXRFbWJlZGRlZFR5cGUob2xkTW9kZWwsIG5ld01vZGVsKTsKLQkJLy8gRm9yIHR5cGVzIHdpdGggcHJvcGFnYXRpbmcgYWRhcHRlcnMsIGl0cyBpbXBvcnRhbnQKLQkJLy8gdGhhdCB0aGUgcHJvcGFnYXRpbmcgYWRhcHRlciBiZSBpbiBwbGFjZSBiZWZvcmUgdGhlIGNvbnRlbnRzCi0JCS8vIGFyZSBzZXQuCi0JCXByZUxvYWRBZGFwdChuZXdNb2RlbCk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZHVwbGljYXRlRmFjdG9yeVJlZ2lzdHJ5KElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHsKLQkJTGlzdCBvbGRBZGFwdGVyRmFjdG9yaWVzID0gb2xkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yaWVzKCk7Ci0JCUxpc3QgbmV3QWRhcHRlckZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSXRlcmF0b3Igb2xkTGlzdEl0ZXJhdG9yID0gb2xkQWRhcHRlckZhY3Rvcmllcy5pdGVyYXRvcigpOwotCQl3aGlsZSAob2xkTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBvbGRBZGFwdGVyRmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBvbGRMaXN0SXRlcmF0b3IubmV4dCgpOwotCQkJLy8gbm93ICJjbG9uZSIgdGhlIGFkYXB0ZXJmYWN0b3J5Ci0JCQluZXdBZGFwdGVyRmFjdG9yaWVzLmFkZChvbGRBZGFwdGVyRmFjdG9yeS5jb3B5KCkpOwotCQl9Ci0JCS8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlICJjbG9uZWQiIGxpc3QsIGFkZCB0byBuZXcgbW9kZWwKLQkJYWRkRmFjdG9yaWVzKG5ld01vZGVsLCBuZXdBZGFwdGVyRmFjdG9yaWVzKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQkvLyBhYnN0cmFjdCBtZXRob2QgcmV0dXJucyBub25lCi0JCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCX0KLQotCWFic3RyYWN0IHB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQotCS8qKgotCSAqIE1ldGhvZCBpbml0RW1iZWRkZWRUeXBlLiBOb3RoaW5nIHRvIGRvIGhlcmUgaW4gc3VwZXIgY2xhc3MuCi0JICogCi0JICogQHBhcmFtIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdEVtYmVkZGVkVHlwZVByZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JfQotCXByb3RlY3RlZCB2b2lkIGluaXRFbWJlZGRlZFR5cGVQb3N0KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgaW5pdEVtYmVkZGVkVHlwZS4gTm90aGluZyB0byBkbyBoZXJlIGluIHN1cGVyIGNsYXNzLgotCSAqIAotCSAqIEBwYXJhbSBvbGRNb2RlbAotCSAqIEBwYXJhbSBuZXdNb2RlbAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRFbWJlZGRlZFR5cGUoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoSUZpbGUgZmlsZSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJSUVuY29kZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKGZpbGUgPT0gbnVsbCkKLQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWVsc2UKLQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KGZpbGUpOwotCi0JCS8vIFRPRE86IG5lZWQgdG8gc3RyYWlnaHRlbiBvdXQgSUVuY29kZWREb2N1bWVudCBtZXNzCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KQotCQkJdHJhbnNmb3JtSW5zdGFuY2UobW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIChJU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQllbHNlCi0JCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXQoc3RydWN0dXJlZERvY3VtZW50LmdldCgpKTsKLQotCQkvLyBvcmlnaW5hbCBoYWNrCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gKChJU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLmZpcmVOZXdEb2N1bWVudCh0aGlzKTsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCS8vIHRlY2huaWNxIG9mIGZ1dHVyZQotCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCS8vIHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vIGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZSB3ZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIHNvIHdlIGRvbid0IGNsb3NlIGl0Ci0JCUlFbmNvZGVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gYXNzdW1lJ3MgbW9kZWwgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWxyZWFkeSB3aXRoIGJhc2UgbG9jYXRpb24KLQkJCXN0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KG1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBpbnB1dFN0cmVhbSwgZW5jb2RpbmdSdWxlKTsKLQkJCS8vIFRPRE86IG1vZGVsJ3Mgbm90IGRlc2lnbmVkIGZvciB0aGlzIQotCQkJLy8gd2Ugd2FudCB0byBtb3ZlIHRvIHRoaXMgInNldCIgbWV0aG9kLCBidXQgdGhlICdmaXJlJyB3YXMgbmVlZGVkCi0JCQkvLyBhcwotCQkJLy8gYSB3b3JrIGFyb3VuZCBmb3Igc3RydWN1dHJlZE1vZGVsIG5vdCBoYW5kbGluZyAnc2V0JyByaWdodCwgYnV0Ci0JCQkvLyB0aGF0ICdmaXJlTmV3RG9jdW1lbnQnIG1ldGhvZCB3YXMgY2F1c2luZyB1bmJhbGFuY2UKLQkJCS8vICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiCi0JCQkvLyBldmVudHMuCi0JCQkvLyBtb2RlbC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJLy8gKChJU3RydWN0dXJlZERvY3VtZW50KQotCQkJLy8gc3RydWN0dXJlZERvY3VtZW50KS5maXJlTmV3RG9jdW1lbnQodGhpcyk7Ci0JCQltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXQoc3RydWN0dXJlZERvY3VtZW50LmdldCgpKTsKLQotCQl9Ci0JCWRvY3VtZW50TG9hZGVySW5zdGFuY2UgPSBudWxsOwotCi0JfQotCi0JLyoqCi0JICogZGVwcmVjYXRlZCAtLSB1c2UgRW5jb2RpbmdSdWxlIGZvcm0KLQkgKi8KLQlzeW5jaHJvbml6ZWQgcHVibGljIHZvaWQgbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIGVuY29kaW5nTmFtZSwgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQkJLy8gbm90ZSB3ZSBkb24ndCBvcGVuIHRoZSBzdHJlYW0sIHNvIHdlIGRvbid0IGNsb3NlIGl0Ci0JCS8vIFRFTVAgd29yayBhcm91bmQgdG8gbWFpbnRhaW4gcHJldmlvdXMgZnVuY3Rpb24sCi0JCS8vIHVudGlsIGV2ZXJ5b25lIGNhbiBjaGFuZ2UgdG8gRW5jb2RpbmdSdWxlLkZPUkNFX0RFRkFVTFQKLQkJaWYgKGVuY29kaW5nTmFtZSAhPSBudWxsICYmIGVuY29kaW5nTmFtZS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJLy8gcmVkaXJlY3QgdG8gbmV3IG1ldGhvZAotCQkJbG9hZChpbnB1dFN0cmVhbSwgbW9kZWwsIEVuY29kaW5nUnVsZS5GT1JDRV9ERUZBVUxUKTsKLQkJfQotCQllbHNlIHsKLQkJCWxvYWQoaW5wdXRTdHJlYW0sIG1vZGVsLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFN0cmluZyBqdW5rLCBTdHJpbmcgZHVtbXkpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLQotCQlsb25nIG1lbW9yeVVzZWQgPSAwOwotCQlpZiAoREVCVUcpIHsKLQkJCW1lbW9yeVVzZWQgPSBjb21wdXRlTWVtKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1lYXN1cmluZyBoZWFwIG1lbW9yeSBmb3IgIiArIGZpbGVuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJoZWFwIG1lbW9yeSB1c2VkIGJlZm9yZSBsb2FkOiAiICsKLQkJCS8vIG1lbW9yeVVzZWQpOwotCQl9Ci0KLQkJLy8gZHVyaW5nIGFuIGluaXRpYWwgbG9hZCwgd2UgZXhwZWN0IHRoZSBvbGRkb2N1bWVudCB0byBiZSBlbXB0eQotCQkvLyBkdXJpbmcgcmUtbG9hZCwgaG93ZXZlciwgaXQgd291bGQgYmUgZnVsbC4KLQkJSUVuY29kZWREb2N1bWVudCBuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCQlJRW5jb2RlZERvY3VtZW50IG9sZFN0cnVjdHVyZWREb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCS8vIGdldCBuZXcgZG9jdW1lbnQKLQkJaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKLQkJCW5ld3N0cnVjdHVyZWREb2N1bWVudCA9IGdldERvY3VtZW50TG9hZGVyKCkuY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudExvYWRlcigpLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudChmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQl9Ci0JCWlmIChERUJVRykgewotCQkJbG9uZyBtZW1vcnlBdEVuZCA9IGNvbXB1dGVNZW0oKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGVhcCBtZW1vcnkgdXNlZCBhZnRlciBsb2FkaW5nIG5ldwotCQkJLy8gZG9jdW1lbnQ6ICIgKyBtZW1vcnlBdEVuZCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICBoZWFwIG1lbW9yeSBpbXBsaWVkIHVzZWQgYnkgZG9jdW1lbnQ6ICIgKyAobWVtb3J5QXRFbmQgLSBtZW1vcnlVc2VkKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJLy8gVE9ETzogbmVlZCB0byBzdHJhaWdodGVuIG91dCBJRW5jb2RlZERvY3VtZW50IG1lc3MKLQkJaWYgKG5ld3N0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCXRyYW5zZm9ybUluc3RhbmNlKChJU3RydWN0dXJlZERvY3VtZW50KSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQsIChJU3RydWN0dXJlZERvY3VtZW50KSBuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gd2UgZG9uJ3QgcmVhbGx5IGV4cGVjdCB0aGlzIGNhc2UsIGp1c3QgaW5jbHVkZWQgZm9yIHNhZmV0eQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnNldChuZXdzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KCkpOwotCQl9Ci0JCS8vIG9yaWdpbmFsIGhhY2sKLQkJLy8gbW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KChJU3RydWN0dXJlZERvY3VtZW50KQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHN0cnVjdHVyZWREb2N1bWVudCkuZmlyZU5ld0RvY3VtZW50KHRoaXMpOwotCQlkb2N1bWVudExvYWRlckluc3RhbmNlID0gbnVsbDsKLQkJLy8gdGVjaG5pY3Egb2YgZnV0dXJlCi0JCS8vIG1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50KTsKLQkJLy8gZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCWlmIChERUJVRykgewotCQkJbG9uZyBtZW1vcnlBdEVuZCA9IGNvbXB1dGVNZW0oKTsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaGVhcCBtZW1vcnkgdXNlZCBhZnRlciBzZXR0aW5nIHRvIG1vZGVsOiAiCi0JCQkvLyArIG1lbW9yeUF0RW5kKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIGhlYXAgbWVtb3J5IGltcGxpZWQgdXNlZCBieSBkb2N1bWVudCBhbmQgbW9kZWw6ICIgKyAobWVtb3J5QXRFbmQgLSBtZW1vcnlVc2VkKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JfQotCi0JLyoqCi0JICogcmVxdWlyZWQgYnkgaW50ZXJmYWNlLCBiZWluZyBkZWNsYXJlZCBoZXJlIGFic3RyYWN0bHkganVzdCBhcyBhbm90aGVyCi0JICogcmVtaW5kZXIuCi0JICovCi0JYWJzdHJhY3QgcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKTsKLQotCS8qKgotCSAqIFRoZXJlJ3Mgbm90aGluZyB0byBkbyBoZXJlIGluIGFic3RyYWN0IGNsYXNzIGZvciBpbml0aWFsaXppbmcgYWRhcHRlcnMuCi0JICogU3ViY2xhc3NlcyBjYW4gYW5kIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgcHJvdmlkZSBwcm9wZXIKLQkgKiBpbnRpYWxpemF0aW9uIChGb3IgZXhhbXBsZSwgdG8gZ2V0IERPTSBkb2N1bWVudCBhbmQgJ2dldEFkYXB0ZXInIG9uIGl0LAotCSAqIHNvIHRoYXQgdGhlIGZpcnN0IG5vZGUvbm90aWZpZXIgaGFzIHRoZSBhZGFwdGVyIG9uIGl0LikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCi0JfQotCi0JLyoqCi0JICogTm9ybWFsbHksIGhlcmUgaW4gdGhlIGFic3RhY3QgY2xhc3MsIHRoZXJlJ3Mgbm90aGluZyB0byBkbywgYnV0IHdlIHdpbGwKLQkgKiByZXNldCB0ZXh0LCBzaW5jZSB0aGlzIE1JR0hUIGVuZCB1cCBiZWluZyBjYWxsZWQgdG8gcmVjb3ZlciBmcm9tIGVycm9yCi0JICogY29uZGl0aW9ucyAoZS5nLiBJU3RydWN0dXJlZERvY3VtZW50IGV4Y2VwdGlvbnMpIEFuZCwgY2FuIGJlIGNhbGxlZCBieQotCSAqIHN1YmNsYXNzZXMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJLy8gTm90ZTogdGhlICJtaW5pbXVtaXphdGlvbiIgcm91dGluZXMKLQkJLy8gb2YgJ3JlcGxhY2VUZXh0JyBhbGxvdyBtYW55IG9sZCBub2RlcyB0byBwYXNzIHRocm91Z2gsIHdoZW4KLQkJLy8gcmVhbGx5IGl0cyBhc3N1bWVkIHRoZXkgYXJlIGNyZWF0ZWQgYW5ldy4KLQkJLy8gc28gd2UgbmVlZCB0byB1c2UgJ3NldFRleHQnIChJIHRoaW5rICJzZXRUZXh0JyBlbmRzIHVwCi0JCS8vIHRocm93aW5nIGEgJ25ld01vZGVsJyBldmVudCB0aG91Z2gsIHRoYXQgbWF5IGhhdmUgc29tZQotCQkvLyBpbXBsaWNhdGlvbnMuCi0JCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldFRleHQodGhpcywgbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkpOwotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2V0cyBhIGZyZXNoIGNvcHkgb2YgdGhlIGRhdGEsIGFuZCByZXBvcHVsYXRlcyB0aGUgbW9kZWxzCi0JICogLi4uIGJ5IGEgY2FsbCB0byBzZXRUZXh0IG9uIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQuIFRoaXMgbWV0aG9kIGlzCi0JICogbmVlZGVkIGluIHNvbWUgY2FzZXMgd2hlcmUgY2xpZW50cyBhcmUgc2hhcmluZyBhIG1vZGVsIGFuZCB0aGVuIGNoYW5nZXMKLQkgKiBjYW5jZWxlZC4gU2F5IGZvciBleGFtcGxlLCBvbmUgZWRpdG9yIGFuZCBzZXZlcmFsICJkaXNwbGF5cyIgYXJlCi0JICogc2hhcmluZyBhIG1vZGVsLCBpZiB0aGUgZWRpdG9yIGlzIGNsb3NlZCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzLCB0aGVuCi0JICogdGhlIGRpc3BsYXlzIHN0aWxsIG5lZWQgYSBtb2RlbCwgYnV0IHRoZXkgc2hvdWxkIHJldmVydCB0byB0aGUgb3JpZ2luYWwKLQkgKiB1bnNhdmVkIHZlcnNpb24uCi0JICovCi0Jc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIHJlbG9hZChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyB0ZW1wIHNvbHV0aW9uIC4uLiB3ZSBzaG91bGQgYmUgYWJsZSB0byBkbyBiZXR0ZXIgKG1vcmUKLQkJCS8vIGVmZmljaWVudCkgaW4gZnV0dXJlLgotCQkJLy8gQWRhcHRlcnMgd2lsbCAocHJvYmFibHkpIG5lZWQgdG8gYmUgc2Vuc2l0aXZlIHRvIHRoZSBmYWN0IHRoYXQKLQkJCS8vIHRoZSBkb2N1bWVudCBpbnN0YW5jZSBjaGFuZ2VkCi0JCQkvLyAoYnkgYmVpbmcgbGlmZSBjeWNsZSBsaXN0ZW5lcnMpCi0JCQlsb2FkKGlucHV0U3RyZWFtLCBzdHJ1Y3R1cmVkTW9kZWwsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQotCQkJLy8gLy8gTm90ZTogd2UgYXBwYXJlbnRseSByZWFkIHRoZSBkYXRhIChhbmQgZW5jb2RpbmcpIGNvcnJlY3RseQotCQkJLy8gLy8gYmVmb3JlLCB3ZSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlIHdlIGZvbGxvd2VkIHRoZSBzYW1lIHJ1bGUKLQkJCS8vIGFzCi0JCQkvLyAvLyBiZWZvcmUuCi0JCQkvLyBFbmNvZGluZ01lbWVudG8gcHJldmlvdXNNZW1lbnRvID0KLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRFbmNvZGluZ01lbWVudG8oKTsKLQkJCS8vIEVuY29kaW5nUnVsZSBwcmV2aW91c1J1bGUgPSBwcmV2aW91c01lbWVudG8uZ2V0RW5jb2RpbmdSdWxlKCk7Ci0JCQkvLyAvL0lGaWxlIGZpbGUgPSBSZXNvdXJjZVV0aWwuZ2V0RmlsZUZvcihzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJLy8gLy8gTm90ZTogdGhlcmUncyBvcHBvcnR1bml0eSBoZXJlIGZvciBzb21lIG9kZCBiZWhhdmlvciwgaWYgdGhlCi0JCQkvLyAvLyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQgZnJvbSB0aGUgZmlyc3QgbG9hZCB0byB0aGUgcmVsb2FkLgotCQkJLy8gQnV0LAotCQkJLy8gLy8gaG9wZWZ1bGx5LAotCQkJLy8gLy8gd2lsbCByZXN1bHQgaW4gdGhlIGludGVuZGVkIGJlaGF2aW9yLgotCQkJLy8gUmVhZGVyIGFsbFRleHRSZWFkZXIgPQotCQkJLy8gZ2V0RG9jdW1lbnRMb2FkZXIoKS5yZWFkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIHByZXZpb3VzUnVsZSk7Ci0JCQkvLwotCQkJLy8gLy8gVE9ETzogYXZvaWQgdXNlIG9mIFN0cmluZyBpbnN0YW5jZQotCQkJLy8gZ2V0RG9jdW1lbnRMb2FkZXIoKS5yZWxvYWQoc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLAotCQkJLy8gYWxsVGV4dFJlYWRlcik7Ci0JCQkvLyAvLyBhbmQgbm93ICJyZXNldCIgZW5jb2RpbmcgbWVtZW50byB0byBrZWVwIGl0IGN1cnJlbnQgd2l0aCB0aGUKLQkJCS8vIC8vIG9uZQotCQkJLy8gLy8gdGhhdCB3YXMganVzdCBkZXRlcm1pbmVkLgotCQkJLy8gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnNldEVuY29kaW5nTWVtZW50byhnZXREb2N1bWVudExvYWRlcigpLmdldEVuY29kaW5nTWVtZW50bygpKTsKLQkJCS8vIHN0cnVjdHVyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCS8vIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01nciA9Ci0JCQkvLyBzdHJ1Y3R1cmVkTW9kZWwuZ2V0VW5kb01hbmFnZXIoKTsKLQkJCS8vIGlmICh1bmRvTWdyICE9IG51bGwpIHsKLQkJCS8vIHVuZG9NZ3IucmVzZXQoKTsKLQkJCS8vIH0KLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3VsZG4ndCBoYXBwZW4uIFRoZSBwcm9ncmFtIGhhcyBhcHBhcmVudGx5Ci0JCQkvLyByZWFkIHRoZSBtb2RlbCBvbmNlLCBhbmQgdGhlcmUnZCBiZSBubyByZWFzb24gdGhlIGVuY29kaW5nCi0JCQkvLyBjb3VsZCBub3QgYmUgdXNlZCBhZ2Fpbi4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIldhcm5pbmc6ICBYTUxMb2FkZXI6OnJlbG9hZC4gIFRoaXMgZXhjZXB0aW9uIHJlYWxseSBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhISBCdXQgd2lsbCBhdHRlbXAgdG8gY29udGludWUgYWZ0ZXIgZHVtcGluZyBzdGFjayB0cmFjZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgRXJyb3IoIlByb2dyYW0gRXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBjb3VsZG4ndCBoYXBwZW4uIFRoZSBwcm9ncmFtIGhhcyBhcHBhcmVudGx5Ci0JCQkvLyByZWFkIHRoZSBtb2RlbCBvbmNlLCBhbmQgdGhlcmUnZCBiZSBubyAoY29tbW9uKSByZWFzb24gaXQKLQkJCS8vIGNvdWxkbid0IGJlIGxvYWRlZCBhZ2Fpbi4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIldhcm5pbmc6ICBYTUxMb2FkZXI6OnJlbG9hZC4gIFRoaXMgZXhjZXB0aW9uIHJlYWxseSBzaG91bGQgbm90IGhhdmUgaGFwcGVuZWQhISBCdXQgd2lsbCBhdHRlbXAgdG8gY29udGludWUgYWZ0ZXIgZHVtcGluZyBzdGFjayB0cmFjZSIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQl0aHJvdyBuZXcgRXJyb3IoIlByb2dyYW0gRXJyb3IiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogdGhpcyB3b3JrIGlzIGRvbmUgYmV0dGVyIGVsc2V3aGVyZSwgYnV0IGRvbmUgaGVyZSBmb3IgdGhpcyB2ZXJzaW9uIHRvCi0JICogcmVkdWNlIGNoYW5nZXMuIGVzcGVjaWFsbHkgc2luY2UgdGhlIG5lZWQgZm9yIGl0IHNob3VsZCBnbyBhd2F5IG9uY2Ugd2UKLQkgKiBubyBsb25nZXIgbmVlZCB0byByZS11c2Ugb2xkIGRvY3VtZW50IGluc3RhbmNlLgotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFuc2Zvcm1JbnN0YW5jZShJU3RydWN0dXJlZERvY3VtZW50IG9sZEluc3RhbmNlLCBJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKSB7Ci0JCS8qKgotCQkgKiBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDkyMAotCQkgKiAKLQkJICogSlNQIHRhZ2xpYiBzdXBwb3J0IGJyb2tlbiwgY29ycmVjdCBieSBkdXBsaWNhdGluZyBleHRlbmRlZCBzZXR1cAotCQkgKiBpbmZvcm1hdGlvbiAoQmxvY2tUYWdQYXJzZXIgZXh0ZW5zaW9uLAotCQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIgZXh0ZW5zaW9ucykKLQkJICovCi0JCVJlZ2lvblBhcnNlciBvbGRQYXJzZXIgPSBvbGRJbnN0YW5jZS5nZXRQYXJzZXIoKTsKLQkJUmVnaW9uUGFyc2VyIG5ld1BhcnNlciA9IG5ld0luc3RhbmNlLmdldFBhcnNlcigpLm5ld0luc3RhbmNlKCk7Ci0JCS8vIFJlZ2lzdGVyIGFsbCBvZiB0aGUgb2xkIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzIG9uIHRoZSBuZXcKLQkJLy8gcGFyc2VyCi0JCWlmIChvbGRQYXJzZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24gJiYgbmV3UGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uKSB7Ci0JCQlMaXN0IG9sZEhhbmRsZXJzID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXJFeHRlbnNpb24pIG9sZFBhcnNlcikuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkSGFuZGxlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIpIG9sZEhhbmRsZXJzLmdldChpKSk7Ci0JCQkJaWYgKGhhbmRsZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uKSB7Ci0JCQkJCS8qKgotCQkJCQkgKiBTa2lwIHRoZSB0cmFuc2ZlcnJpbmcgaGVyZSwgdGhlIGhhbmRsZXIgd2lsbCBkbyB0aGlzCi0JCQkJCSAqIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZSBidXQgdGhlIHNvdXJjZSBpcyB0cmFuc2ZlcnJlZC4KLQkJCQkJICovCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgb2xkUGFyc2VyKS5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGhhbmRsZXIpOwotCQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlcikgbmV3UGFyc2VyKS5hZGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKGhhbmRsZXIpOwotCQkJCQloYW5kbGVyLnJlc2V0Tm9kZXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gQWRkIGFueSBnbG9iYWwgQmxvY2tNYXJrZXJzIHRvIHRoZSBuZXcgcGFyc2VyCi0JCWlmIChvbGRQYXJzZXIgaW5zdGFuY2VvZiBCbG9ja1RhZ1BhcnNlciAmJiBuZXdQYXJzZXIgaW5zdGFuY2VvZiBCbG9ja1RhZ1BhcnNlcikgewotCQkJTGlzdCBvbGRCbG9ja01hcmtlcnMgPSAoKEJsb2NrVGFnUGFyc2VyKSBvbGRQYXJzZXIpLmdldEJsb2NrTWFya2VycygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlCbG9ja01hcmtlciBibG9ja01hcmtlciA9ICgoQmxvY2tNYXJrZXIpIG9sZEJsb2NrTWFya2Vycy5nZXQoaSkpOwotCQkJCWlmIChibG9ja01hcmtlci5pc0dsb2JhbCgpKSB7Ci0JCQkJCSgoQmxvY2tUYWdQYXJzZXIpIG5ld1BhcnNlcikuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCSgoQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQpIG9sZEluc3RhbmNlKS5zZXRQYXJzZXIobmV3UGFyc2VyKTsKLQotCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBvbGRJbnN0YW5jZSkuc2V0UmVQYXJzZXIobmV3SW5zdGFuY2UuZ2V0UmVQYXJzZXIoKS5uZXdJbnN0YW5jZSgpKTsKLQotCQlpZiAobmV3SW5zdGFuY2UuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgewotCQkJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IG51bGw7Ci0JCQlpZiAob2xkSW5zdGFuY2UgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24zICYmIG5ld0luc3RhbmNlIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMykgewotCQkJCXBhcnRpdGlvbmVyID0gKChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSAoKElEb2N1bWVudEV4dGVuc2lvbjMpIG5ld0luc3RhbmNlKS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpKTsKLQkJCQlpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkgewotCQkJCQlwYXJ0aXRpb25lciA9IChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSBwYXJ0aXRpb25lci5uZXdJbnN0YW5jZSgpOwotCQkJCX0KLQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbjMpIG9sZEluc3RhbmNlKS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIHBhcnRpdGlvbmVyKTsKLQkJCX0KLQkJCWlmIChwYXJ0aXRpb25lciA9PSBudWxsKSB7Ci0JCQkJcGFydGl0aW9uZXIgPSAoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgKChTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSBuZXdJbnN0YW5jZS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKCkpLm5ld0luc3RhbmNlKCk7Ci0JCQkJb2xkSW5zdGFuY2Uuc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25lcik7Ci0JCQl9Ci0JCQlpZiAocGFydGl0aW9uZXIgIT0gbnVsbCkgewotCQkJCXBhcnRpdGlvbmVyLmNvbm5lY3Qob2xkSW5zdGFuY2UpOwotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGV4aXN0aW5nTGluZURlbGltaXRlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlleGlzdGluZ0xpbmVEZWxpbWl0ZXIgPSBuZXdJbnN0YW5jZS5nZXRMaW5lRGVsaW1pdGVyKDApOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBlbXB0eSBmaWxlLCBhc3N1bWUgcGxhdGZvcm0gZGVmYXVsdAotCQkJLy8gVE9ETzogc2hvdWxkIGJlIHVzaW5nIHVzZXIgc2V0IHByZWZlcmVuY2UsIHBlciBjb250ZW50IHR5cGU/Ci0JCQlleGlzdGluZ0xpbmVEZWxpbWl0ZXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCW9sZEluc3RhbmNlLnNldExpbmVEZWxpbWl0ZXIoZXhpc3RpbmdMaW5lRGVsaW1pdGVyKTsgLy8kTk9OLU5MUy0xJCk7Ci0JCWlmIChuZXdJbnN0YW5jZS5nZXRFbmNvZGluZ01lbWVudG8oKSAhPSBudWxsKSB7Ci0JCQlvbGRJbnN0YW5jZS5zZXRFbmNvZGluZ01lbWVudG8oKEVuY29kaW5nTWVtZW50bykgbmV3SW5zdGFuY2UuZ2V0RW5jb2RpbmdNZW1lbnRvKCkuY2xvbmUoKSk7Ci0JCX0KLQotCQkvKioKLQkJICogaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQ5MjAKLQkJICogCi0JCSAqIEpTUCB0YWdsaWIgc3VwcG9ydCBicm9rZW4sIGNvcnJlY3QgYnkgZHVwbGljYXRpbmcgZXh0ZW5kZWQgc2V0dXAKLQkJICogaW5mb3JtYXRpb24gKEJsb2NrVGFnUGFyc2VyIGV4dGVuc2lvbiwKLQkJICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyIGV4dGVuc2lvbnMpCi0JCSAqLwotCQlpZiAob2xkUGFyc2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uICYmIG5ld1BhcnNlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlckV4dGVuc2lvbikgewotCQkJTGlzdCBvbGRIYW5kbGVycyA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uKSBvbGRQYXJzZXIpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZEhhbmRsZXJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBvbGRIYW5kbGVycy5nZXQoaSkpOwotCQkJCWlmIChoYW5kbGVyIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbikgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyRXh0ZW5zaW9uIGhhbmRsZXJFeHRlbnNpb24gPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlckV4dGVuc2lvbikgaGFuZGxlcjsKLQkJCQkJaGFuZGxlckV4dGVuc2lvbi5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQob2xkSW5zdGFuY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlTdHJpbmcgaG9sZFN0cmluZyA9IG5ld0luc3RhbmNlLmdldCgpOwotCQluZXdJbnN0YW5jZSA9IG51bGw7Ci0JCW9sZEluc3RhbmNlLnNldChob2xkU3RyaW5nKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0Fic3RyYWN0U3RydWN0dXJlZE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0Fic3RyYWN0U3RydWN0dXJlZE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNTMyNDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9BYnN0cmFjdFN0cnVjdHVyZWRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklMb2NrYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5Eb2N1bWVudENoYW5nZWQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTmV3RG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGltcGxlbWVudHMgSVN0cnVjdHVyZWRNb2RlbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9ERUxfTUFOQUdFUl9OVUxMID0gIldhcm5pbmc6IEFic3RyYWN0U3RydWN0dXJlZE1vZGVsOjpjbG9zZTogIG1vZGVsIG1hbmFnZXIgd2FzIG51bGwgZHVyaW5nIGEgY2xvc2Ugb2YgYSBtb2RlbCAod2hpY2ggc2hvdWxkIGJlIGltcG9zc2libGUpIjsgLy8kTk9OLU5MUy0xJAotCi0JY2xhc3MgRGlydHlTdGF0ZVdhdGNoZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJLy8gSSBkb24ndCB0aGluayBpdHMgc2FmZSB0byBhc3N1bWUgYSBuZXcgbW9kZWwKLQkJCS8vIGlzIGFsd2F5cyAiZnJlc2giLCBzbyB3ZSdsbCBsZWF2ZSBkaXJ0eSBzdGF0ZQotCQkJLy8gdW5jaGFuZ2VkOwotCQkJLy8gYnV0IHdlJ2xsIHRlbGwgZXZlcnlvbmUgYWJvdXQgaXQuCi0JCQlzZXREaXJ0eVN0YXRlKGZEaXJ0eVN0YXRlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vQ2hhbmdlKE5vQ2hhbmdlRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJLy8gZG9uJ3QgY2hhbmdlIGRpcnR5IHN0YXRlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCXNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkvLyBubyBuZWVkIHRvIGxpc3RlbiBhbnkgbW9yZQotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCXNldERpcnR5U3RhdGUodHJ1ZSk7Ci0JCQkvLyBubyBuZWVkIHRvIGxpc3RlbiBhbnkgbW9yZQotCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlzZXREaXJ0eVN0YXRlKHRydWUpOwotCQkJLy8gbm8gbmVlZCB0byBsaXN0ZW4gYW55IG1vcmUKLQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGZEaXJ0eVN0YXRlV2F0Y2hlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQljbGFzcyBEb2N1bWVudFRvTW9kZWxOb3RpZmllciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciwgSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyI21vZGVsQWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLkFib3V0VG9CZUNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChBYm91dFRvQmVDaGFuZ2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIElmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGFyZSBhYm91dCB0bwotCQkJLy8gY2hhbmdlIGJhc2VkIG9uIG91ciB1bmRlcmx5aW5nIGRvY3VtZW50IGNoYW5naW5nLgotCQkJLy8gSWYgd2UgZGlkIG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB3ZSwgb3IgY2xpZW50LCBzaG91bGQgaGF2ZQotCQkJLy8gYWxyZWFkeSBjYWxsZWQgYWJvdXRUb0NoYW5nZU1vZGVsLgotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJfQotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25ld01vZGVsKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIGlmIHdlIGRpZG4ndCBvcmlnaW5hdGUgdGhlIGNoYW5nZSwgdGFrZSBub3RlIHdlIGhhdmUgY2hhbmdlZAotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldE9yaWdpbmFsUmVxdWVzdGVyKCkgIT0gdGhpcykgewotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub0NoYW5nZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBpZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBoYXZlIGNoYW5nZWQKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIjbm9kZXNSZXBsYWNlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbkNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gaWYgd2UgZGlkbid0IG9yaWdpbmF0ZSB0aGUgY2hhbmdlLCB0YWtlIG5vdGUgd2UgaGF2ZSBjaGFuZ2VkCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSAhPSB0aGlzKSB7Ci0JCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbnNSZXBsYWNlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVnaW9uc1JlcGxhY2VkKFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBpZiB3ZSBkaWRuJ3Qgb3JpZ2luYXRlIHRoZSBjaGFuZ2UsIHRha2Ugbm90ZSB3ZSBoYXZlIGNoYW5nZWQKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpICE9IHRoaXMpIHsKLQkJCQljaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5OwotCXByaXZhdGUgU3RyaW5nIGZCYXNlTG9jYXRpb247Ci0JYm9vbGVhbiBmRGlydHlTdGF0ZTsKLQlEaXJ0eVN0YXRlV2F0Y2hlciBmRGlydHlTdGF0ZVdhdGNoZXI7Ci0JRG9jdW1lbnRUb01vZGVsTm90aWZpZXIgZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyOwotCXByaXZhdGUgU3RyaW5nIGZFeHBsaWNpdENvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQlwcml2YXRlIFN0cmluZyBmSWQ7Ci0KLQlwcml2YXRlIExpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIgZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0KLQlwcml2YXRlIGZpbmFsIE9iamVjdCBmTGlzdGVuZXJMb2NrID0gbmV3IGJ5dGVbMF07Ci0JcHJvdGVjdGVkIElMb2NrIGZMb2NrT2JqZWN0OwotCS8vIHByaXZhdGUgU3RyaW5nIGZMaW5lRGVsaW1pdGVyOwotCS8vIHByaXZhdGUgT2JqZWN0IGZUeXBlOwotCXByaXZhdGUgSU1vZGVsSGFuZGxlciBmTW9kZWxIYW5kbGVyOwotCS8vIGlzc3VlOiB3ZSBzaG91bGQgbm90ICJob2xkIG9uIiB0byBtb2RlbCBtYW5hZ2VyLCBjYW4gCi0JLy8gZWFzaWx5IGdldCB3aXRoIFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JLy8gYnV0IHdpbGwgbmVlZCB0byBhZGQgbW9yZSBudWxsIGNoZWNrcy4KLQlwcml2YXRlIElNb2RlbE1hbmFnZXIgZk1vZGVsTWFuYWdlcjsKLQlwcml2YXRlIGludCBmTW9kZWxTdGF0ZUNoYW5naW5nOwotCXByaXZhdGUgT2JqZWN0W10gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBib29sZWFuIGZOZXdTdGF0ZSA9IGZhbHNlOwotCXByaXZhdGUgVVJJUmVzb2x2ZXIgZlJlc29sdmVyOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JLyoqCi0JICogVGhlIHRpbWUgc3RhbXAgb2YgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UncyBtb2RpZmljYXRpb24gZGF0ZSwgYXQgdGhlCi0JICogdGltZSB0aGlzIG1vZGVsIHdhcyBjcmVhdGVkLCBvciB0aGUgbGFzdCB0aW1lIGl0IHdhcyBzYXZlZC4gTm90ZTogZm9yCi0JICogdGhpcyB2ZXJzaW9uLCB0aGlzIHZhcmlhYmxlIGlzIG5vdCBzZXQgYXV0b21hdGljYWxseSwgYmUgbmVlZHMgdG8gYmUKLQkgKiBtYW5hZ2VkIGJ5IGNsaWVudC4gVGhlIEZpbGVNb2RlbFByb3ZpZGVyIGRvZXMgdGhpcyBmb3IgbW9zdCBjYXNlcywgYnV0Ci0JICogaWYgY2xpZW50IGRvIG5vdCB1c2UgRmlsZU1vZGVsUHJvdmlkZXIsIHRoZXkgbXVzdCBzZXQgdGhpcyB2YXJpYWJsZQotCSAqLwotCXB1YmxpYyBsb25nIGZTeW5jaHJvbml6YXRpb25TdGFtcCA9IElSZXNvdXJjZS5OVUxMX1NUQU1QOwotCXByaXZhdGUgYm9vbGVhbiByZWluaXRpYWxpemF0aW9uTmVlZGVkOwotCXByaXZhdGUgT2JqZWN0IHJlaW5pdGlhbGl6ZVN0YXRlRGF0YTsKLQotCS8qKgotCSAqIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKCkgewotCi0JCXN1cGVyKCk7Ci0JCWZEaXJ0eVN0YXRlV2F0Y2hlciA9IG5ldyBEaXJ0eVN0YXRlV2F0Y2hlcigpOwotCQlmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIgPSBuZXcgRG9jdW1lbnRUb01vZGVsTm90aWZpZXIoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGp1c3QgZm9yIGdldHRpbmcgYW4gaW5zdGFuY2Ugb2YgdGhlIG1vZGVsIG1hbmFnZXIgb2YgdGhlCi0JICogcmlnaHQgSW1wbCB0eXBlLCB0byBiZSB1c2VkICJpbnRlcm5hbGx5IiBmb3IgbWFraW5nIHByb3RlY3RlZCBjYWxscwotCSAqIGRpcmVjdGx5IHRvIHRoZSBpbXBsIGNsYXNzLgotCSAqLwotCXByaXZhdGUgTW9kZWxNYW5hZ2VySW1wbCBfZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQkvLyBUT0RPX2Z1dHVyZTogcmVkZXNpZ24gc28gd2UgZG9uJ3QgbmVlZCB0aGlzICdJbXBsJyB2ZXJzaW9uCi0JCWlmIChmTW9kZWxNYW5hZ2VyID09IG51bGwpIHsKLQkJCWZNb2RlbE1hbmFnZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQl9Ci0KLQkJcmV0dXJuIChNb2RlbE1hbmFnZXJJbXBsKSBmTW9kZWxNYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4gTm90ZSB0aGF0IGluCi0JICogdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMgc2VudCBvbmx5Ci0JICogb25jZS4gTm90ZSB0aGF0IHRoZSBjbGllbnQgd2hvIGlzIG1ha2luZyB0aGVzZSBjaGFuZ2VzIGhhcyB0aGUKLQkgKiByZXNwb25zaWJpbGl0eSB0byByZXN0b3JlIHRoZSBtb2RlbHMgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZQotCSAqIGNoYW5nZXMuIFNlZSBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuIFRoZSBtZXRob2QKLQkgKiBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsCi0JICogaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhYm91dFRvQ2hhbmdlTW9kZWwoKSB7Ci0KLQotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlpbnRlcm5hbEFib3V0VG9CZUNoYW5nZWQoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpIHsKLQotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZCgpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCQkJaWYgKGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpIHsKLQkJCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9IG5ldyBMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyKCk7Ci0JCQl9Ci0JCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmTW9kZWxTdGF0ZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvcgotCQkJCQkvLyBmaXJzdAotCQkJCQkvLyB0aW1lIHRocm91Z2gKLQkJCQkJb2xkU2l6ZSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZk1vZGVsU3RhdGVMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQkJfQotCQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJCS8vCi0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZNb2RlbFN0YXRlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBsb2NrIHRvIGxvY2sgdGhlIHNtYWxsIGJpdHMgb2YgZGF0YSBhbmQgb3BlcmF0aW9ucyBpbiB0aGUgbW9kZWxzCi0JICogdGhlbXNlbGZlcy4gdGhpcyBsb2NrIGlzICJzaGFyZWQiIHdpdGggZG9jdW1lbnQsIHNvLCBldmVudHVhbGx5LAotCSAqIGNoYW5nZXMgY2FuIGJlIG1hZGUgc2FmZWZseSBmcm9tIGVpdGhlciBzaWRlLgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCB2b2lkIGJlZ2luTG9jaygpIHsKLQotCQkvLyBpZiB3ZSBnZXQgYSBkaWZmZXJlbnQgbG9jayBvYmplY3QKLQkJLy8gdGhhbiB3ZSBoYWQgYmVmb3JlLCBiZXN1cmUgdG8gcmVsZWFzZQotCQkvLyBvbGQgb25lIGZpcnN0IGJlZm9yZSBsb3NpbmcgaXQuCi0JCS8vIElTU1VFOiB0aGlzIHNtZWxscyBsaWtlIGFuIGVycm9yIGNvbmRpdGlvbiwKLQkJLy8gd2hlbiB3b3VsZCB0aGlzIGhhcHBlbj8gYmV0dGVyIHRvIGNoZWNrIGluIHNldCBkb2N1bWVudD8KLQkJSUxvY2sgZG9jdW1lbnRMb2NrID0gZ2V0TG9ja09iamVjdEZyb21Eb2N1bWVudCgpOwotCi0JCWlmIChmTG9ja09iamVjdCAhPSBudWxsICYmIGZMb2NrT2JqZWN0ICE9IGRvY3VtZW50TG9jaykgewotCQkJZkxvY2tPYmplY3QucmVsZWFzZSgpOwotCQkJaWYgKExvZ2dlci5ERUJVRykgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbCBsb2NrIHJlbGVhc2VkIGVhcmx5IiArIGZMb2NrT2JqZWN0ICsgIiBhcHBhcmVudGx5IGRvY3VtZW50IHN3aXRjaGVkPyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQl9Ci0JCWZMb2NrT2JqZWN0ID0gZG9jdW1lbnRMb2NrOwotCQlpZiAoZkxvY2tPYmplY3QgIT0gbnVsbCkgewotCQkJZkxvY2tPYmplY3QuYWNxdWlyZSgpOwotCQkJaWYgKExvZ2dlci5ERUJVRykgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbCBsb2NrIGFjcXVpcmVkOiAiICsgZkxvY2tPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0KLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCkgewotCi0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0KLQkJYmVnaW5SZWNvcmRpbmcocmVxdWVzdGVyLCBsYWJlbCwgbnVsbCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5iZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdG5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIKLQkgKiB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCAqbXVzdCogYmUgY2FsbGVkIGFmdGVyIGFib3V0VG9DaGFuZ2VNb2RlbAotCSAqIC4uLiBvciBzb21lIGxpc3RlbmVycyBjb3VsZCBiZSBsZWZ0IHdhaXRpbmcgaW5kZWZpbml0ZWx5IGZvciB0aGUKLQkgKiBjaGFuZ2VkIGV2ZW50LiBTbywgaXRzIHN1Z2dlc3RlZCB0aGF0IGNoYW5nZWRNb2RlbCBhbHdheXMgYmUgaW4gYQotCSAqIGZpbmFsbHkgY2xhdXNlLiBMaWtld2lzZSwgYSBjbGllbnQgc2hvdWxkIG5ldmVyIGNhbGwgY2hhbmdlZE1vZGVsCi0JICogd2l0aG91dCBjYWxsaW5nIGFib3V0VG9DaGFuZ2VNb2RlbCBmaXJzdC4gSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQKLQkgKiBjYWxscywgdGhlIG5vdGlmaWNhdGlvbiBpcyBqdXN0IHNlbnQgb25jZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkTW9kZWwoKSB7Ci0KLQotCQkvLyBub3RpY2UgdGhpcyBpcyBqdXN0IGEgcHVibGljIGF2ZW51ZSB0byBvdXIgcHJvdGVjdGVkIG1ldGhvZAotCQlpbnRlcm5hbE1vZGVsQ2hhbmdlZCgpOwotCQkvLyBhbHNvIG5vdGUhCi0JCS8vIGlmIHdlJ3ZlIGJlZW4gImNoYW5nZWQiIGJ5IGEgY2xpZW50LCB3ZSBtaWdodCBzdGlsbCBuZWVkCi0JCS8vIHRvIGJlIHJlLWluaXRpYWxpemVkLCBzbyB3ZSdsbCBjaGVjayBhbmQgaGFuZGxlIHRoYXQgaGVyZS4KLQkJLy8gTm90ZSBvbmx5IGRvZXMgdGhpcyBwcm92aWRlIGEgc29sdXRpb24gdG8gc29tZSAibWlzc2VkIgotCQkvLyByZS1pbml0cywgaW4gcHJvdmlkZXMgYSBidWlsdCBpbiB3YXkgZm9yIGNsaWVudHMgdG8KLQkJLy8gImZvcmNlIiB0aGUgbW9kZWwgdG8gaGFuZGxlIGl0c2VsZiwgYnkgYnJhY2tldGluZyBhbnkKLQkJLy8gY2hhbmdlcyB3aXRoIGFib3V0VG9DaGFuZ2UgYW5kIGNoYW5nZWQsIHRoZSBtb2RlbCBpdHNlbGYKLQkJLy8gd2lsbCBjaGVjay4gQnV0IG9ubHkgY2FsbCByZS1pbml0IGlmIGFsbCBvdGhlciBwZW5kaW5nCi0JCS8vIG1vZGVsQ2hhbmdlZCBzdGF0ZXMgaGF2ZSBiZWVuIGhhbmRsZWQuCi0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDAgJiYgaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCkpIHsKLQkJCXJlaW5pdCgpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBCYXNlZCBvbiBzaW1pbGFyIG1ldGhvZCBpbiBGaWxlRG9jdW1lbnRQcm92aWRlci4gSXQgd2lsbCBwcm92aWRlIHdoYXQKLQkgKiB0aGUgbW9kaWZpY2F0aW9uU3RhbXAgd291bGQgYmUgaWYgcmVzZXRTeW5jaHJvbnphdGlvblN0YW1wKHJlc291cmNlKQotCSAqIHdlcmUgdXNlZCwgYWx0aG91Z2ggZm9yIHRoaXMgJ2NvbXB1dGUnIEFQSSwgbm8gY2hhbmdlcyB0byB0aGUgaW5zdGFuY2UKLQkgKiBhcmUgbWFkZS4KLQkgKi8KLQlwdWJsaWMgbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKSB7Ci0KLQotCQlsb25nIG1vZGlmaWNhdGlvblN0YW1wID0gcmVzb3VyY2UuZ2V0TW9kaWZpY2F0aW9uU3RhbXAoKTsKLQkJSVBhdGggcGF0aCA9IHJlc291cmNlLmdldExvY2F0aW9uKCk7Ci0JCWlmIChwYXRoID09IG51bGwpIHsKLQkJCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCQkvLyBOb3RlOiBjaGVja2luZyBleGlzdGVuY2Ugb2YgZmlsZSBpcyBhIGxpdHRsZSBkaWZmZXJlbnQgdGhhbgotCQkvLyBpbXBsIGluCi0JCS8vIHRoZSBGaWxlRG9jdW1lbnRQcm92aWRlci4gU2VlIGRlZmVjdCBudW1iZXIgMjIzNzkwLgotCQlGaWxlIGZpbGUgPSBwYXRoLnRvRmlsZSgpOwotCQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkJCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQkJfQotCQltb2RpZmljYXRpb25TdGFtcCA9IGZpbGUubGFzdE1vZGlmaWVkKCk7Ci0JCXJldHVybiBtb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgY29weSBvZiB0aGUgbW9kZWwsIGJ1dCBhIG5ldyBJRCBtdXN0IGJlIHByb3ZpZGVkLiBUaGUKLQkgKiBwcmluY2lwbGUgb2YgdGhpcyBjb3B5IGlzIG5vdCB0byBjb3B5IGZpZWxkcywgZXRjLiwgYXMgaXMgdHlwaWNhbGx5Ci0JICogZG9uZSBpbiBhIGNsb25lIG1ldGhvZCwgYnV0IHRvIHJldHVybiBhIG1vZGVsIHdpdGggdGhlIHNhbWUgY29udGVudCBpbgotCSAqIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQuIE5vdGU6IEl0IGlzIHRoZSBjYWxsZXJzIHJlc3BvbnNpYmlsaXR5IHRvCi0JICogc2V0QmFzZUxvY2F0aW9uLCBsaXN0bmVycywgZXRjLiwgYXMgYXBwcm9wcmlhdGUuIFR5cGUgYW5kIEVuY29kaW5nIGFyZQotCSAqIHRoZSBvbmx5IGZpZWxkcyBzZXQgYnkgdGhpcyBtZXRob2QuIElmIHRoZSBuZXdJZCBwcm92aWRlZCBhbHJlYWR5IGV4aXN0Ci0JICogaW4gdGhlIG1vZGVsIG1hbmFnZXIsIGEgUmVzb3VyY2VJblVzZSBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGNvcHkoU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0KLQotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJLy8gdGhpcyBmaXJzdCBvbmUgc2hvdWxkIGZhaWwsIGlmIG5vdCwgaXRzIHRyZWF0ZWQgYXMgYW4gZXJyb3IKLQkJLy8gSWYgdGhlIGNhbGxlciB3YW50cyB0byB1c2UgYW4gZXhpc3Rpbmcgb25lLCB0aGV5IGNhbiBjYWxsCi0JCS8vIGdldEV4aXN0aW5nCi0JCS8vIGFmdGVyIHRoaXMgZmFpbHVyZQotCQluZXdNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KG5ld0lkKTsKLQkJaWYgKG5ld01vZGVsICE9IG51bGwpIHsKLQkJCS8vIGJlIHN1cmUgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHdlIGdvdCAiYnkgYWNjaWRlbnQiIChhbmQKLQkJCS8vIG5vCi0JCQkvLyBsb25nZXIgbmVlZCkKLQkJCW5ld01vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJfQotCQluZXdNb2RlbCA9IGdldE1vZGVsTWFuYWdlcigpLmNvcHlNb2RlbEZvckVkaXQoZ2V0SWQoKSwgbmV3SWQpOwotCQlyZXR1cm4gbmV3TW9kZWw7Ci0JfQotCi0KLQkvKioKLQkgKiBEaXNhYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNhYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICogRW5hYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmFibGVVbmRvTWFuYWdlbWVudCgpIHsKLQotCQlpZiAoZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKQotCQkJZ2V0VW5kb01hbmFnZXIoKS5lbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCS8qKgotCSAqIGVuZExvY2sgaXMgcHJvdGVjdGVkIG9ubHkgZm9yIGEgdmVyeSBzcGVjaWFsIHB1cnBvc2UuIFNvIHN1YmNsYXNzZXMgY2FuCi0JICogY2FsbCBpdCB0byBlbmQgdGhlIGxvY2sgYWZ0ZXIgdXBkYXRlcyBoYXZlIGJlZW4gbWFkZSwgYnV0IGJlZm9yZQotCSAqIG5vdGlmaWNhdGlvbnMgYXJlIHNlbnQKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBlbmRMb2NrKCkgewotCQlpZiAoZkxvY2tPYmplY3QgIT0gbnVsbCkgewotCQkJZkxvY2tPYmplY3QucmVsZWFzZSgpOwotCQkJaWYgKExvZ2dlci5ERUJVRykgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbCBsb2NrIHJlbGVhc2VkOiAiICsgZkxvY2tPYmplY3QpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0KLQkJaWYgKGdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCWdldFVuZG9NYW5hZ2VyKCkuZW5kUmVjb3JkaW5nKHJlcXVlc3Rlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCi0JCWlmIChnZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQlnZXRVbmRvTWFuYWdlcigpLmVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgc3RhdGUgbGlzdGVuZXJzIHRoYXQgdGhlIHRoZSBtb2RlbCBpcwotCSAqIGFib3V0IHRvIHVuZGVyIGdvIGEgY2hhbmdlLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50cwotCSAqIG9yIG1pZ2h0IGJlIGluIHRlcm1zIG9mIHRoZSBtb2RlbCdzIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGZpcmVNb2RlbEFib3V0VG9CZUNoYW5nZWQoKSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUgbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkKLQkJLy8gZnJvbSBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbEFib3V0VG9CZUNoYW5nZWQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoKSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCS8vIE5PVEU6IHRyaWNrIGZvciB0cmFuc2l0aW9uLiBXZSBhY3R1YWwgdXNlIHRoZSBzYW1lCi0JCQkJLy8gbGlzdGVuZXJzCi0JCQkJLy8gYXMgbW9kZWxTdGF0ZSwgYnV0IG9ubHkgc2VuZCB0aGlzIHRvIHRob3NlIHRoYXQgaGF2ZQotCQkJCS8vIGltcGxlbWVudGVkIE1vZGVsU3RhdGVFeHRlbmRlZC4KLQkJCQlJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV07Ci0JCQkJbGlzdGVuZXIubW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVNb2RlbENoYW5nZWQoKSB7Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycwotCQkvLyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZAotCQkvLyBhbmQgcmVtb3ZlIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyCi0JCS8vIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCXRyeSB7Ci0JCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxDaGFuZ2VkKHRoaXMpOwotCQkJCX0KLQkJCQkvLyBpdHMgc28gY3JpdGljaWFsIHRoYXQgdGhlIGJlZ2luL2VuZCBhcnJpdmUgaW4KLQkJCQkvLyBwYWlycywKLQkJCQkvLyBpZiB0aGVyZSBoYXBwZW5kcyB0byBiZSBhbiBlcnJvciBpbiBvbmUgb2YgdGhlCi0JCQkJLy8gbW9kZWxDaGFuZ2VkLAotCQkJCS8vIHRoZXkgd2Ugd2FudCB0byBiZSBzdXJlIHJlc3QgY29tcGxldGUgb2suCi0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyBhYm91dCBhIGNoYW5nZSBpbiB0aGUKLQkgKiBkaXJ0eSBzdGF0ZSBvZiB0aGUgbW9kZWwuIFRoZSBkaXJ0eSBzdGF0ZSBpcyBlbnRpcmVseSBhYm91dCBjaGFuZ2VzIGluCi0JICogdGhlIGNvbnRlbnQgb2YgdGhlIG1vZGVsIChub3QsIGZvciBleGFtcGxlLCBhYm91dCBjaGFuZ2VzIHRvIGlkLCBvcgotCSAqIGJhc2UgbG9jYXRpb24gLS0gc2VlIG1vZGVsTW92ZWQpLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGZpcmVNb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgZWxlbWVudCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0KLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsRGlydHlTdGF0ZUNoYW5nZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkoKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsRGlydHlTdGF0ZUNoYW5nZWQoZWxlbWVudCwgaXNEaXJ0eSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmaXJlTW9kZWxSZWluaXRpYWxpemVkKCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbFJlaW5pdGlhbGl6ZWQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gZk1vZGVsU3RhdGVMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyID0gKElNb2RlbFN0YXRlTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV07Ci0JCQkJbGlzdGVuZXIubW9kZWxSZWluaXRpYWxpemVkKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5mb3JtcyBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBzdGF0ZSBsaXN0ZW5lcnMgYWJvdXQgdGhlIGRlbGV0aW9uIG9mIGEKLQkgKiBtb2RlbCdzIHVuZGVybHlpbmcgcmVzb3VyY2UuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgZWxlbWVudCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZNb2RlbFN0YXRlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfTU9ERUxTVEFURSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJJTW9kZWxTdGF0ZUxpc3RlbmVyIGV2ZW50IGZvciAiICsgZ2V0SWQoKSArICIgOiBtb2RlbFJlc291cmNlRGVsZXRlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmTW9kZWxTdGF0ZUxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCSgoSU1vZGVsU3RhdGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubW9kZWxSZXNvdXJjZURlbGV0ZWQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyB0aGF0IHRoZSByZXNvdXJjZQotCSAqIHVuZGVybHlpbmcgYSBtb2RlbCBoYXMgYmVlbiBtb3ZlZC4gVGhpcyBpcyB0eXBpY2FsbHkgcmVmbGVjdGVkIGluIGEKLQkgKiBjaGFuZ2UgdG8gdGhlIGlkLCBiYXNlTG9jYXRpb24sIG9yIGJvdGguCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZU1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9yaWdpbmFsRWxlbWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb3ZlZEVsZW1lbnQpIHsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChmTW9kZWxTdGF0ZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxSZXNvdXJjZU1vdmVkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJKChJTW9kZWxTdGF0ZUxpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5tb2RlbFJlc291cmNlTW92ZWQob3JpZ2luYWxFbGVtZW50LCBtb3ZlZEVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQotCQlyZXR1cm4gUGxhdGZvcm0uZ2V0QWRhcHRlck1hbmFnZXIoKS5nZXRBZGFwdGVyKHRoaXMsIGFkYXB0ZXIpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEJhc2VMb2NhdGlvbigpIHsKLQotCQlyZXR1cm4gZkJhc2VMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsI2dldENvbnRlbnRUeXBlSWRlbnRpZmllcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSB7Ci0JCWlmIChmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXIgIT0gbnVsbCkKLQkJCXJldHVybiBmRXhwbGljaXRDb250ZW50VHlwZUlkZW50aWZpZXI7Ci0JCXJldHVybiBmTW9kZWxIYW5kbGVyLmdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JCWlmIChmYWN0b3J5UmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IEZhY3RvcnlSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBmYWN0b3J5UmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGlkIGlzIHRoZSBpZCB0aGF0IHRoZSBtb2RlbCBtYW5hZ2VyIHVzZXMgdG8gaWRlbnRpZnkgdGhpcyBtb2RlbAotCSAqIAotCSAqIEBJU1NVRSAtIG5vIG9uZSBzaG91bGQgbmVlZCB0byBrbm93IElELCBzbyB0aGlzIHNob3VsZCBiZSBkZWZhdWx0IGFjY2VzcyBldmVudHVhbGx5LiAKLQkgKiBJZiBjbGllbnRzIGJlbGlldmUgdGhleSBkbyBuZWVkIElELCBiZSBzdXJlIHRvIGxldCB1cyBrbm93IChvcGVuIGEgYnVnKS4gCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLQotCQlyZXR1cm4gZklkOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJTG9jayBnZXRMb2NrT2JqZWN0RnJvbURvY3VtZW50KCkgewotCi0JCS8vIHdlIGFsd2F5cyAiZ2V0IGFmcmVzaCIgdGhlIGxvY2sgb2JqZWN0IGZyb20gb3VyIGRvY3VtZW50LAotCQkvLyBqdXN0IGluIGNhc2UgdGhlIGluc3RhbmNlIG9mIHRoZSBkb2N1bWVudCBjaGFuZ2VzLgotCQlJTG9jayByZXN1bHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIElMb2NrYWJsZSkgewotCQkJCS8vIHJlbWVtYmVyLCBtb3JlIHRoYW4gb25lIGNsaWVudCBjYW4gZ2V0IHRoZQotCQkJCS8vIGxvY2sgb2JqZWN0LCBpdHMgZHVyaW5nIHRoZSBhcXVpcmUgdGhhdCB0aGUKLQkJCQkvLyBsb2NrIG9uIHRoZSB0aHJlYWQgaXMgb2J0YWluZWQuCi0JCQkJcmVzdWx0ID0gKChJTG9ja2FibGUpIGRvYykuZ2V0TG9ja09iamVjdCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBDb250ZW50VHlwZURlc2NyaXB0aW9uCi0JICovCi0JcHVibGljIElNb2RlbEhhbmRsZXIgZ2V0TW9kZWxIYW5kbGVyKCkgewotCi0JCXJldHVybiBmTW9kZWxIYW5kbGVyOwotCX0KLQotCi0JcHVibGljIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCi0JCXJldHVybiBfZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQkvLyBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24gbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5nZXRSZWZlcmVuY2VDb3VudChnZXRJZCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCXB1YmxpYyBpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KCkgewotCi0KLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0UmVmZXJlbmNlQ291bnRGb3JFZGl0KGdldElkKCkpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQkvLyBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24gbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JcHVibGljIGludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoKSB7Ci0KLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5nZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoZ2V0SWQoKSk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoKSB7Ci0KLQkJcmV0dXJuIHJlaW5pdGlhbGl6ZVN0YXRlRGF0YTsKLQl9Ci0KLQotCi0JcHVibGljIFVSSVJlc29sdmVyIGdldFJlc29sdmVyKCkgewotCi0JCXJldHVybiBmUmVzb2x2ZXI7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBmU3RydWN0dXJlZERvY3VtZW50OwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEluc2VydCB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRpb24gaGVyZS4gQ3JlYXRpb24gZGF0ZTogKDkvNy8yMDAxIDI6MzA6MjYKLQkgKiBQTSkKLQkgKiAKLQkgKiBAcmV0dXJuIGxvbmcKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcCgpIHsKLQotCQlyZXR1cm4gZlN5bmNocm9uaXphdGlvblN0YW1wOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBnZXRVbmRvTWFuYWdlcigpIHsKLQotCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciBzdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0VW5kb01hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0SWQoU3RyaW5nIGlkKSB7Ci0JCWZJZCA9IGlkOwotCX0KLQotCWZpbmFsIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWJvdXRUb0JlQ2hhbmdlZCgpIHsKLQotCQkvLyBub3RpY2Ugd2Ugb25seSBmaXJlIHRoaXMgZXZlbnQgaWYgd2UgYXJlIG5vdAotCQkvLyBhbHJlYWR5IGluIGEgbW9kZWwgc3RhdGUgY2hhbmdpbmcgc2VxdWVuY2UKLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMCkgewotCi0JCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMU1RBVEUpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCAiSU1vZGVsU3RhdGVMaXN0ZW5lciBldmVudCBmb3IgIiArIGdldElkKCkgKyAiIDogbW9kZWxBYm91dFRvQmVDaGFuZ2VkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCi0JCQl0cnkgewotCQkJCWZpcmVNb2RlbEFib3V0VG9CZUNoYW5nZWQoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiB3aGlsZSBub3RpZnlpbmcgbW9kZWwgc3RhdGUgbGlzdGVycyBvZiBhYm91dCB0byBjaGFuZ2UiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJLy8gYmVnaW4gbG9jayBhZnRlciBsaXN0ZW5lcnMgbm90aWZpZWQsIG90aGVyd2lzZQotCQkJCS8vIGRlYWRsb2NrIGNvdWxkIG9jY3VyIGlmIHRoZXkgY2FsbCB1cyBiYWNrLgotCQkJCWJlZ2luTG9jaygpOwotCQkJfQotCi0JCX0KLQkJLy8gd2UgYWx3YXlzIGluY3JlbWVudCBjb3VudGVyLCBmb3IgZXZlcnkgcmVxdWVzdCAoc28gKm11c3QqIHJlY2VpdmUKLQkJLy8gY29ycmVzcG9uZGluZyBudW1iZXIgb2YgJ2NoYW5nZWRNb2RlbCcgcmVxdWVzdHMpCi0JCWZNb2RlbFN0YXRlQ2hhbmdpbmcrKzsKLQl9Ci0KLQkvKioKLQkgKiBJbmZvcm1zIGFsbCByZWdpc3RlcmVkIG1vZGVsIHN0YXRlIGxpc3RlbmVycyB0aGF0IGFuIGltcGVuZGluZyBjaGFuZ2UKLQkgKiBpcyBub3cgY29tcGxldGUuIFRoaXMgbWV0aG9kIG11c3Qgb25seSBiZSBjYWxsZWQgYnkgJ21vZGVsQ2hhbmdlZCcKLQkgKiBzaW5jZSBpdCBrZWVwcyB0cmFjayBvZiBjb3VudHMuCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxNb2RlbENoYW5nZWQoKSB7Ci0KLQkJLy8gYWx3YXlzIGRlY3JlbWVudAotCQlmTW9kZWxTdGF0ZUNoYW5naW5nLS07Ci0KLQotCQkvLyBDaGVjayBpbnRlZ3JpdHkKLQkJLy8gdG8gYmUgbGVzcyB0aGFuIHplcm8gaXMgYSBwcm9ncmFtbWluZyBlcnJvciwKLQkJLy8gYnV0IHdlJ2xsIHJlc2V0IHRvIHplcm8KLQkJLy8gYW5kIHRyeSB0byBjb250aW51ZQotCQlpZiAoZk1vZGVsU3RhdGVDaGFuZ2luZyA8IDApIHsKLQkJCWZNb2RlbFN0YXRlQ2hhbmdpbmcgPSAwOwotCQkJLy8gc2hvdWxkIG5vdCBiZSBsb2NrZWQsIGJ1dCBqdXN0IGluIGNhc2UKLQkJCWVuZExvY2soKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlByb2dyYW0gRXJyb3I6IG1vZGVsU3RhdGVDaGFuZ2luZyB3YXMgbGVzcyB0aGFuIHplcm8iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQotCQkvLyBXZSBvbmx5IGZpcmUgdGhpcyBldmVudCBpZiBhbGwgcGVuZGluZyByZXF1ZXN0cyBhcmUgZG9uZS4KLQkJLy8gVGhhdCBpcywgaWYgd2UndmUgcmVjZWl2ZWQgdGhlIHNhbWUgbnVtYmVyIG9mIG1vZGVsQ2hhbmdlZCBhcwotCQkvLyB3ZSBoYXZlIGFib3V0VG9DaGFuZ2VNb2RlbC4KLQkJaWYgKGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMCkgewotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTFNUQVRFKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIklNb2RlbFN0YXRlTGlzdGVuZXIgZXZlbnQgZm9yICIgKyBnZXRJZCgpICsgIiA6IG1vZGVsQ2hhbmdlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCQkJZW5kTG9jaygpOwotCQkJLy8gbm90aWZpZnkgbGlzdGVuZXJzIG91dHNpZGUgb2YgbG9ja2VkIHN0YXRlIChvciBkZWFkbG9jawotCQkJLy8gY2FuIG9jY3VyIGlmIG9uZSBvZiB0aGVtIGNhbGxzIHVzIGJhY2suCi0JCQlmaXJlTW9kZWxDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RpcnR5KCkgewotCi0JCXJldHVybiBmRGlydHlTdGF0ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBoYXMgdmVyeSBzcGVjaWFsIHB1cnBvc2UsIGl0cyB1c2VkIGluIHN1YmNsYXNzCi0JICogJ2NoYW5nZWRNb2RlbCcgdG8ga25vdyB3aGVuIHRvIGRvICJlbmRpbmciIHNvcnRzIG9mIHRoaW5ncywgcmlnaHQKLQkgKiBiZWZvcmUgYSBjYWxsIHRvIHN1cGVyLkNoYW5nZWRNb2RlbCB3b3VsZCBpbiBkZWVkIHB1dCB0aGUgbW9kZWwgaW4KLQkgKiAnZW5kJyBzdGF0ZS4gUHV0IGFub3RoZXIgd2F5LCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdWJjbGFzc2VzJ3MKLQkgKiBjaGFuZ2VkTW9kZWwsIHRoZSBpc01vZGVsU3RhdGVDaGFuZ2luZyBpcyB0cnVlLCBidXQgYXQgZW5kLCBpdCB3aWxsIGJlCi0JICogZmFsc2UuIFNvLCB0aGlzIG1ldGhvZCBhbGxvd3MgYSBzbWFsbCAicGVlayBhaGVhZCIuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNNb2RlbENoYW5nZVN0YXRlT25WZXJnZU9mRW5kaW5nKCkgewotCi0KLQkJcmV0dXJuIGZNb2RlbFN0YXRlQ2hhbmdpbmcgPT0gMTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgbW9kZWwgaXMgd2l0aGluIGEKLQkgKiAiYWJvdXRUb0NoYW5nZSIgYW5kICJjaGFuZ2VkIiBzZXF1ZW5jZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc01vZGVsU3RhdGVDaGFuZ2luZygpIHsKLQotCi0JCXJldHVybiBmTW9kZWxTdGF0ZUNoYW5naW5nID4gMDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc05ldygpIHsKLQotCQlyZXR1cm4gZk5ld1N0YXRlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpIHsKLQotCQlyZXR1cm4gcmVpbml0aWFsaXphdGlvbk5lZWRlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKSB7Ci0KLQotCQlpZiAoIWlzU2hhcmVkRm9yRWRpdCgpKQotCQkJcmV0dXJuIGlzRGlydHkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5pc1NoYXJlZChnZXRJZCgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTaGFyZWRGb3JFZGl0KCkgewotCi0KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBnZXRNb2RlbE1hbmFnZXIoKS5pc1NoYXJlZEZvckVkaXQoZ2V0SWQoKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2hhcmVkRm9yUmVhZCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZ2V0TW9kZWxNYW5hZ2VyKCkuaXNTaGFyZWRGb3JSZWFkKGdldElkKCkpOwotCX0KLQotCi0JcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVpbml0aWFsaXplZCgpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIG5ld0luc3RhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJLy8gd2UgZGVsZWdhdGUgdG8gdGhlIG1vZGVsIG1hbmFnZXIsIHNvIGxvYWRlciwgZXRjLiwgY2FuIGJlCi0JCS8vIHVzZWQuCi0JCW5ld01vZGVsID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlTmV3SW5zdGFuY2UodGhpcyk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWluaXQoKSB7Ci0KLQotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChmTW9kZWxTdGF0ZUNoYW5naW5nID09IDApIHsKLQkJCXRyeSB7Ci0JCQkJYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQkJYWJvdXRUb1JlaW5pdGlhbGl6ZU1vZGVsKCk7Ci0JCQkJcmVzdWx0ID0gX2dldE1vZGVsTWFuYWdlcigpLnJlaW5pdGlhbGl6ZSh0aGlzKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldFJlaW5pdGlhbGl6ZU5lZWRlZChmYWxzZSk7Ci0JCQkJc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKG51bGwpOwotCQkJCW1vZGVsUmVpbml0aWFsaXplZCgpOwotCQkJCWNoYW5nZWRNb2RlbCgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKExvZ2dlci5ERUJVRykgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJpbmRlZWQhISEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tRWRpdCgpIHsKLQotCi0JCWlmIChnZXRNb2RlbE1hbmFnZXIoKSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKE1PREVMX01BTkFHRVJfTlVMTCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCS8qCi0JCQkgKiBCZSBzdXJlIHRvIGNoZWNrIHRoZSBzaGFyZWQgc3RhdGUgYmVmb3JlIHJlbGVhc2luZy4gKFNpbmNlCi0JCQkgKiBpc1NoYXJlZCBhc3N1bWVzIGEgY291bnQgb2YgMSBtZWFucyBub3Qgc2hhcmVkIC4uLiBhbmQgd2Ugd2FudAotCQkJICogb3VyICcxJyB0byBiZSB0aGF0IG9uZS4pIFRoZSBwcm9ibGVtLCBvZiBjb3Vyc2UsIGlzIHRoYXQKLQkJCSAqIGJldHdlZW4gcHJlLWN5Y2xlIG5vdGlmaWNhdGlvbiBhbmQgcG9zdC1yZWxlYXNlIG5vdGlmaWNhdGlvbiwKLQkJCSAqIHRoZSBtb2RlbCBjb3VsZCBvbmNlIGFnYWluIGhhdmUgYmVjb21lIHNoYXJlZCwgcmVuZGVyaW5nIHRoZQotCQkJICogcmVsZWFzZSBub3RpZmljYXRpb24gaW5jb3JyZWN0LgotCQkJICovCi0JCQlib29sZWFuIGlzU2hhcmVkID0gaXNTaGFyZWQoKTsKLQotCQkJaWYgKCFpc1NoYXJlZCkgewotCQkJCXNpZ25hbFByZUxpZmVDeWNsZUV2ZW50UmVsZWFzZSh0aGlzKTsKLQkJCX0KLQotCQkJX2dldE1vZGVsTWFuYWdlcigpLnJlbGVhc2VGcm9tRWRpdCh0aGlzKTsKLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZWxlYXNlKHRoaXMpOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0aGUgbW9kZWwgdG8gZnJlZSB1cCBhbnkgcmVzb3VyY2VzIGl0IG1pZ2h0IGJlCi0JICogdXNpbmcuIEluIHBhcnRpY3VsYXIsIGl0c2VsZiwgYXMgc3RvcmVkIGluIHRoZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQotCQlpZiAoZ2V0TW9kZWxNYW5hZ2VyKCkgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihNT0RFTF9NQU5BR0VSX05VTEwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvKgotCQkJICogQmUgc3VyZSB0byBjaGVjayB0aGUgc2hhcmVkIHN0YXRlIGJlZm9yZSByZWxlYXNpbmcuIChTaW5jZQotCQkJICogaXNTaGFyZWQgYXNzdW1lcyBhIGNvdW50IG9mIDEgbWVhbnMgbm90IHNoYXJlZCAuLi4gYW5kIHdlIHdhbnQKLQkJCSAqIG91ciAnMScgdG8gYmUgdGhhdCBvbmUuKSBUaGUgcHJvYmxlbSwgb2YgY291cnNlLCBpcyB0aGF0Ci0JCQkgKiBiZXR3ZWVuIHByZS1jeWNsZSBub3RpZmljYXRpb24gYW5kIHBvc3QtcmVsZWFzZSBub3RpZmljYXRpb24sCi0JCQkgKiB0aGUgbW9kZWwgY291bGQgb25jZSBhZ2FpbiBoYXZlIGJlY29tZSBzaGFyZWQsIHJlbmRlcmluZyB0aGUKLQkJCSAqIHJlbGVhc2Ugbm90aWZpY2F0aW9uIGluY29ycmVjdC4KLQkJCSAqLwotCQkJYm9vbGVhbiBpc1NoYXJlZCA9IGlzU2hhcmVkKCk7Ci0KLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQcmVMaWZlQ3ljbGVFdmVudFJlbGVhc2UodGhpcyk7Ci0JCQl9Ci0KLQkJCV9nZXRNb2RlbE1hbmFnZXIoKS5yZWxlYXNlRnJvbVJlYWQodGhpcyk7Ci0KLQkJCWlmICghaXNTaGFyZWQpIHsKLQkJCQlzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZWxlYXNlKHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJlcGxlbmlzaGVzIHRoZSBtb2RlbCB3aXRoIHRoZSByZXNvdXJjZSB3aXRob3V0IHNhdmluZwotCSAqIGFueSBwb3NzaWJsZSBjaGFuZ2VzLiBJdCBpcyB1c2VkIHdoZW4gb25lIGVkaXRvciBtYXkgYmUgY2xvc2luZywgYW5kCi0JICogc3BlY2lmaWFsbHkgc2F5cyBub3QgdG8gc2F2ZSB0aGUgbW9kZWwsIGJ1dCBhbm90aGVyICJkaXNwbGF5IiBvZiB0aGUKLQkgKiBtb2RlbCBzdGlsbCBuZWVkcyB0byBoYW5nIG9uIHRvIHNvbWUgbW9kZWwsIHNvIG5lZWRzIGEgZnJlc2ggY29weS4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJcmVzdWx0ID0gX2dldE1vZGVsTWFuYWdlcigpLnJlbG9hZE1vZGVsKGdldElkKCksIGlucHV0U3RyZWFtKTsKLQkJfQotCQljYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0KLQkJLy8gaWYgbWFuYWdlciBpcyBudWxsLCB0aGVuIG5vbmUgaGF2ZSBiZWVuIGFkZGVkLCBzbwotCQkvLyBubyBuZWVkIHRvIHJlbW92ZSBhbnkKLQkJaWYgKGZMaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN5bmNocm9uaXplZCAoZkxpc3RlbmVyTG9jaykgewotCQkJZkxpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIucmVtb3ZlTGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCByZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCWlmIChsaXN0ZW5lciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJc3luY2hyb25pemVkIChmTGlzdGVuZXJMb2NrKSB7Ci0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZNb2RlbFN0YXRlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZk1vZGVsU3RhdGVMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZQotCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZNb2RlbFN0YXRlTGlzdGVuZXJzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJLy8gb2xkCi0JCQkJLy8gb25lCi0JCQkJZk1vZGVsU3RhdGVMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCS8qKgotCSAqIEEgbWV0aG9kIHRoYXQgbW9kaWZpZXMgdGhlIG1vZGVsJ3Mgc3luY2hyb25pemF0aW9uIHN0YW1wIHRvIG1hdGNoIHRoZQotCSAqIHJlc291cmNlLiBUdXJucyBvdXQgdGhlcmUncyBzZXZlcmFsIHdheXMgb2YgZG9pbmcgaXQsIHNvIHRoaXMgZW5zdXJlcyBhCi0JICogY29tbW9uIGFsZ29yaXRobS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFN5bmNocm9uaXphdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSkgewotCi0KLQkJc2V0U3luY2hyb25pemF0aW9uU3RhbXAoY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKSk7Ci0JfQotCi0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgdG8gaW5pdGlhdGUgbm90aWZpY2F0aW9uIHRvIGFsbCBpbnRlcmVzdGVkCi0JICogcGFydGllcyB0aGF0IGEgbW9kZWwncyB1bmRlcmx5aW5nIHJlc291cmNlIGhhcyBiZWVuIGRlbGV0ZWQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzb3VyY2VEZWxldGVkKCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVzb3VyY2VEZWxldGVkKHRoaXMpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgYWxsb3dzIGEgbW9kZWwgY2xpZW50IHRvIGluaXRpYXRlIG5vdGlmaWNhdGlvbiB0byBhbGwKLQkgKiBpbnRlcmVzdGVkIHBhcnRpZXMgdGhhdCBhIG1vZGVsJ3MgdW5kZXJseWluZyByZXNvdXJjZSBsb2NhdGlvbiBoYXMKLQkgKiBjaGFuZ2VkLiBOb3RlOiB3ZSBhc3N1bWUgY2FsbGVyIGhhcyBhbHJlYWR5IGNoYW5nZWQgYmFzZUxvY2F0aW9uLCBJZCwKLQkgKiBldGMuLCBzaW5jZSBpdHMgcmVhbGx5IHVwIHRvIHRoZSBjbGllbnQgdG8gZGV0ZXJtaW5lIHdoYXQncyAibmV3IiBhYm91dAotCSAqIGEgbW92ZWQgbW9kZWwuIENhdXRpb246ICd0aGlzJyBhbmQgJ25ld01vZGVsJyBtYXkgYmUgdGhlIHNhbWUgb2JqZWN0LgotCSAqIFRoaXMgaXMgdGhlIGNhc2UgZm9yIGN1cnJlbnQgd29ya2luZyB3aXRoIEZpbGVNb2RlbFByb3ZpZGVyLCBidXQgaGF2ZQotCSAqIGxlZnQgdGhlIGR1YWwgYXJndW1lbnQgZm9yIGZ1dHVyZSBwb3NzaWJpbGl0aWVzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCi0KLQkJLy8gbm90aWNlIHRoaXMgaXMganVzdCBhIHB1YmxpYyBhdmVudWUgdG8gb3VyIHByb3RlY3RlZCBtZXRob2QKLQkJZmlyZU1vZGVsUmVzb3VyY2VNb3ZlZCh0aGlzLCBuZXdNb2RlbCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgRW5jb2RpbmdSdWxlLkNPTlRFTlRfQkFTRUQpOwotCQl9Ci0KLQkJZmluYWxseSB7Ci0JCQkvLyB3ZSBwdXQgZW5kIG5vdGlmaWNhdGlvbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgZW5jb2RpbmdSdWxlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgc2F2ZShJRmlsZSBpRmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChpRmlsZSwgc3RyaW5nSWQsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQkJfQotCi0JCWZpbmFsbHkgewotCQkJLy8gd2UgcHV0IGVuZCBub3RpZmljYXRpb24gaW4gZmluYWxseSBibG9jaywgc28gZXZlbiBpZgotCQkJLy8gZXJyb3Igb2NjdXJzIGR1cmluZyBzYXZlLCBsaXN0ZW5lcnMgYXJlIHN0aWxsIG5vdGlmaWVkLAotCQkJLy8gc2luY2UgdGhlaXIgY29kZSBjb3VsZCBkZXBlbmQgb24gcmVjZWl2aW5nLCB0byBjbGVhbiB1cAotCQkJLy8gc29tZSBzdGF0ZSwgb3IgY29vcmRpbmF0ZSBvdGhlciByZXNvdXJjZXMuCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzYXZlKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9TQVZFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyBzdHJpbmdJZCA9IGdldElkKCk7Ci0JCQlfZ2V0TW9kZWxNYW5hZ2VyKCkuc2F2ZU1vZGVsKGlGaWxlLCBzdHJpbmdJZCwgZW5jb2RpbmdSdWxlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9vbiBpbiBmaW5hbGx5IGJsb2NrLCBzbyBldmVuIGlmCi0JCQkvLyBlcnJvciBvY2N1cnMgZHVyaW5nIHNhdmUsIGxpc3RlbmVycyBhcmUgc3RpbGwgbm90aWZpZWQsCi0JCQkvLyBzaW5jZSB0aGVpciBjb2RlIGNvdWxkIGRlcGVuZCBvbiByZWNlaXZpbmcsIHRvIGNsZWFuIHVwCi0JCQkvLyBzb21lIHN0YXRlLCBvciBjb29yZGluYXRlIG90aGVyIHJlc291cmNlcy4KLQkJCXR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkJbW9kZWxMaWZlY3ljbGVFdmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHRoaXMsIHR5cGUpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVDsKLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBtb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RyaW5nSWQgPSBnZXRJZCgpOwotCQkJX2dldE1vZGVsTWFuYWdlcigpLnNhdmVNb2RlbChzdHJpbmdJZCwgb3V0cHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUuQ09OVEVOVF9CQVNFRCk7Ci0JCX0KLQotCQlmaW5hbGx5IHsKLQkJCS8vIHdlIHB1dCBlbmQgbm90aWZpY2F0aW9uIGluIGZpbmFsbHkgYmxvY2ssIHNvIGV2ZW4gaWYKLQkJCS8vIGVycm9yIG9jY3VycyBkdXJpbmcgc2F2ZSwgbGlzdGVuZXJzIGFyZSBzdGlsbCBub3RpZmllZCwKLQkJCS8vIHNpbmNlIHRoZWlyIGNvZGUgY291bGQgZGVwZW5kIG9uIHJlY2VpdmluZywgdG8gY2xlYW4gdXAKLQkJCS8vIHNvbWUgc3RhdGUsIG9yIGNvb3JkaW5hdGUgb3RoZXIgcmVzb3VyY2VzLgotCQkJdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfU0FWRUQgfCBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQ7Ci0JCQltb2RlbExpZmVjeWNsZUV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQodGhpcywgdHlwZSk7Ci0JCQlzaWduYWxMaWZlY3ljbGVFdmVudChtb2RlbExpZmVjeWNsZUV2ZW50KTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogVGhpcyBhdHRyaWJ1dGUgaXMgdHlwaWNhbGx5IHVzZWQgdG8gZGVub3RlIHRoZSBtb2RlbCdzIHVuZGVybHlpbmcKLQkgKiByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRCYXNlTG9jYXRpb24oamF2YS5sYW5nLlN0cmluZyBuZXdCYXNlTG9jYXRpb24pIHsKLQotCQlmQmFzZUxvY2F0aW9uID0gbmV3QmFzZUxvY2F0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRUeXBlSWRlbnRpZmllcihTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVyKSB7Ci0JCWZFeHBsaWNpdENvbnRlbnRUeXBlSWRlbnRpZmllciA9IGNvbnRlbnRUeXBlSWRlbnRpZmllcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eVN0YXRlKGJvb2xlYW4gZGlydHlTdGF0ZSkgewotCi0JCS8vIG5vIG5lZWQgdG8gcHJvY2VzcyAoc2V0IG9yIGZpcmUgZXZlbnQpLCBpZiBzYW1lIHZhbHVlCi0JCWlmIChmRGlydHlTdGF0ZSAhPSBkaXJ0eVN0YXRlKSB7Ci0JCQkvLyBwcmUtY2hhbmdlIG5vdGlmaWNhdGlvbgotCQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RJUlRZX1NUQVRFIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCi0KLQkJCS8vIHRoZSBhY3R1YWwgY2hhbmdlCi0JCQlmRGlydHlTdGF0ZSA9IGRpcnR5U3RhdGU7Ci0KLQkJCS8vIG9sZCBub3RpZmljYXRpb24KLQkJCS8vIFRPRE86IEMzIHJlbW92ZSBvbGQgbm90aWZpY2F0aW9uCi0JCQlpZiAoZkRpcnR5U3RhdGUgPT0gZmFsc2UpIHsKLQkJCQkvLyBpZiB3ZSBhcmUgYmVpbmcgc2V0IHRvIG5vdCBkaXJ0eSAoc3VjaCBhcyBqdXN0IGJlZW4gc2F2ZWQpCi0JCQkJLy8gdGhlbiB3ZSBuZWVkIHRvIHN0YXJ0IGxpc3RlbmluZyBmb3IgY2hhbmdlcwotCQkJCS8vIGFnYWluIHRvIGtub3cgd2hlbiB0byBzZXQgc3RhdGUgdG8gdHJ1ZTsKLQkJCQlnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJfQotCQkJZmlyZU1vZGVsRGlydHlTdGF0ZUNoYW5nZWQodGhpcywgZGlydHlTdGF0ZSk7Ci0KLQotCQkJLy8gcG9zdCBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0JCQl0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ESVJUWV9TVEFURSB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJCW1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudCh0aGlzLCB0eXBlKTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB3aWxsIGxpa2VseSBiZSBkZXByZWNhdGVkIHNvb24sIGluIGZhdm9yIG9mIGRpcmVjdCAnYWRkcycKLQkgKiAgICAgICAgICAgICAuLi4gYnV0IHRha2VzIHNvbWUgcmVkZXNpZ24uCi0JICovCi0JcHVibGljIHZvaWQgc2V0RmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSBmYWN0b3J5UmVnaXN0cnkpIHsKLQkJdGhpcy5mYWN0b3J5UmVnaXN0cnkgPSBmYWN0b3J5UmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogVGhlIGlkIGlzIHRoZSBpZCB0aGF0IHRoZSBtb2RlbCBtYW5hZ2VyIHVzZXMgdG8gaWRlbnRpZnkgdGhpcyBtb2RlbC4gSWYKLQkgKiBpdCBpcyBiZWluZyBzZXQgaGVyZSwgaXQgbWVhbnMgdGhlIG1vZGVsIG1hbmdlciBpcyBhbHJlYWR5IG1hbmFnaW5nIHRoZQotCSAqIG1vZGVsIHdpdGggYW5vdGhlciBpZCwgc28gd2UgaGF2ZSB0byBrZWVwIGl0IGluIHN5bmMuIFRoaXMgbWV0aG9kIGNhbGxzCi0JICogbm90aWZpZXMgbGlzdG5lcnMsIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIG5vdGlmaWVkIGFscmVhZHksIHRoYXQgYSAibW9kZWwKLQkgKiBzdGF0ZSBjaGFuZ2UiIGlzIGFib3V0IHRvIG9jY3VyLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCi0KLQkJLy8gSXQgbWFrZXMgbm8gc2Vuc2UsIEkgZG9uJ3QgdGhpbmssIHRvIGhhdmUgYW4gaWQgb2YgbnVsbCwgc28KLQkJLy8gd2UnbGwgdGhyb3cgYW4gaWxsZWdhbCBhcmd1bWVudCBleGNlcHRpb24gaWYgc29tZW9uZSB0cnlzLiBOb3RlOgotCQkvLyB0aGUgSU1vZGVsTWFuYWdlciBjb3VsZCBub3QgbWFuYWdlIGEgbW9kZWwgd2l0aCBhbiBpZCBvZiBudWxsLAotCQkvLyBzaW5jZSBpdCB1c2VzIGhhc2h0YWJsZXMsIGFuZCB5b3UgY2FuJ3QgaGF2ZSBhIG51bGwgaWQgZm9yIGEKLQkJLy8gaGFzaHRhYmxlLgotCQlpZiAobmV3SWQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU1NFQ29yZU1lc3NhZ2VzLkFfbW9kZWxfc19pZF9jYW5fbm90X2JlX251X0VYQ18pOyAvLyROT04tTkxTLTEkID0gIkEgbW9kZWwncyBpZCBjYW4gbm90IGJlIG51bGwiCi0JCS8vIFRvIGd1YXJkIGFnYWluc3QgdGhyb3dpbmcgYSBzcHVyaW91cyBSZXNvdXJjZUluVXNlIGV4Y2VwdGlvbiwKLQkJLy8gd2hpY2ggY2FuIG9jY3VyIHdoZW4gdHdvIHBpZWNlcyBvZiBjb2RlIGJvdGggd2FudCB0byBjaGFuZ2UgdGhlIGlkLAotCQkvLyBzbyB0aGUgc2Vjb25kIHJlcXVlc3QgaXMgc3B1cmlvdXMsIHdlJ2xsIGlnbm9yZSBhbnkgcmVxdWVzdHMgdGhhdAotCQkvLyBhdHRlbXB0IHRvIGNoYW5nZSB0aGUgaWQgdG8gd2hhdCBpdCBhbHJlYWR5IGlzIC4uLiBub3RlLCB3ZSB1c2UKLQkJLy8gJ2VxdWFscycsIG5vdCBpZGVudGl0eSAoJz09Jykgc28gdGhhdCB0aGluZ3MgbGlrZQotCQkvLyBzdHJpbmdzIGNhbiBiZSB1c2VkLiBUaGlzIGlzIHRoZSBzYW1lIGNyaXRlcmlhIHRoYXQgaWRzIGFyZQotCQkvLyBmb3VuZCBpbiBtb2RlbCBtYW5hZ2VyIC0tIHdlbGwsIGFjdHVhbGx5LCBJIGp1c3QgY2hlY2tlZCwgYW5kIGZvcgotCQkvLyB0aGUgaGFzaHRhYmxlIGltcGwsIHRoZSBjcml0ZXJpYSB1c2VzIC5lcXVhbHMgQU5EIHRoZSBjb25kaXRpb24KLQkJLy8gdGhhdCB0aGUgaGFzaCB2YWx1ZXMgYmUgaWRlbnRpY2FsIChJJ20gYXNzdW1pbmcgdGhpcyBpcyBhbHdheXMKLQkJLy8gdHJ1ZSwgaWYgZXF1YWxzIGlzIHRydWUsIGZvciBub3csIEknbSBub3Qgc3VyZQotCQkvLyB3ZSBjYW4gYXNzdW1lIHRoYXQgaGFzaHRhYmxlIHdpbGwgYWx3YXlzIGJlIHVzZWQsIGJ1dCBpbgotCQkvLyBnZW5lcmFsLCBzaG91bGQgbWF0Y2guKQotCQkvLwotCQlpZiAobmV3SWQuZXF1YWxzKGZJZCkpCi0JCQlyZXR1cm47Ci0JCS8vIHdlIG11c3QgZ3VhcmQgYWdhaW5zdCByZWFzc2lnbmluZyBhbiBpZCB0byBvbmUgdGhhdCB3ZSBhbHJlYWR5Ci0JCS8vIGFyZSBtYW5hZ2luZy4KLQkJaWYgKGdldE1vZGVsTWFuYWdlcigpICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChuZXdJZCk7Ci0JCQlpZiAobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGJlIHN1cmUgdG8gcmVsZWFzZSB0aGUgcmVmZXJlbmNlIHdlIGdvdCB1bmV4ZXBlY3RhbnRseQotCQkJCS8vIChhbmQgbm8gbG9uZ2VyIG5lZWQpCi0JCQkJbmV3TW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJCX0KLQkJfQotCQl0cnkgewotCQkJLy8gbm9ybWFsIGNvZGUgcGF0aAotCQkJYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCQlTdHJpbmcgb2xkSWQgPSBmSWQ7Ci0JCQlmSWQgPSBuZXdJZDsKLQkJCWlmIChnZXRNb2RlbE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJLy8gaWYgbWFuYWdlZCBhbmQgdGhlIGlkIGhhcyBjaGFuZ2VkLCBub3RpZnkgdG8KLQkJCQkvLyBJTW9kZWxNYW5hZ2VyCi0JCQkJLy8gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduIG5vdCB0byBkbyB0aGF0Ci0JCQkJaWYgKG9sZElkICE9IG51bGwgJiYgbmV3SWQgIT0gbnVsbCAmJiAhbmV3SWQuZXF1YWxzKG9sZElkKSkgewotCQkJCQlnZXRNb2RlbE1hbmFnZXIoKS5tb3ZlTW9kZWwob2xkSWQsIG5ld0lkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBtYWtlIHN1cmUgdGhpcyBmaW5hbGx5IGlzIG9ubHkgZXhlY3V0ZWQgaWYgJ2Fib3V0IHRvIENoYW5nZQotCQkJLy8gbW9kZWwnIGhhcwotCQkJLy8gYmVlbiBleGVjdXRlZC4KLQkJCWNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGVEZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgVGhlIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gdG8gc2V0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxIYW5kbGVyKElNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyKSB7Ci0KLQkJLy8gbm8gbmVlZCB0byBmaXJlIGV2ZW50cyBpZiBtb2RlbEhhbmRsZXIgaGFzIGJlZW4gbnVsbAotCQkvLyBmb3IgdGhpcyBtb2RlbCAtLQotCQkvLyB0aGlzIGlzIGFuIGF0dGVtcHQgYXQgaW5pdGlhbGl6YXRpb24gb3B0aW1pemF0aW9uIGFuZCBtYXkgbmVlZAotCQkvLyB0byBjaGFuZ2UgaW4gZnV0dXJlLgotCQlib29sZWFuIHRydWVDaGFuZ2UgPSBmYWxzZTsKLQkJaWYgKGZNb2RlbEhhbmRsZXIgIT0gbnVsbCkKLQkJCXRydWVDaGFuZ2UgPSB0cnVlOwotCQlpZiAodHJ1ZUNoYW5nZSkgewotCQkJaW50ZXJuYWxBYm91dFRvQmVDaGFuZ2VkKCk7Ci0JCX0KLQkJZk1vZGVsSGFuZGxlciA9IG1vZGVsSGFuZGxlcjsKLQkJaWYgKHRydWVDaGFuZ2UpIHsKLQkJCWludGVybmFsTW9kZWxDaGFuZ2VkKCk7Ci0JCX0KLQl9Ci0KLQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWxNYW5hZ2VyKElNb2RlbE1hbmFnZXIgbmV3TW9kZWxNYW5hZ2VyKSB7Ci0KLQkJZk1vZGVsTWFuYWdlciA9IG5ld01vZGVsTWFuYWdlcjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROZXdTdGF0ZShib29sZWFuIG5ld1N0YXRlKSB7Ci0KLQkJZk5ld1N0YXRlID0gbmV3U3RhdGU7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhICJmbGFnIiB0aGF0IHJlaW5pdGlhbGl6YXRpb24gaXMgbmVlZGVkLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlaW5pdGlhbGl6ZU5lZWRlZChib29sZWFuIG5lZWRlZCkgewotCi0JCXJlaW5pdGlhbGl6YXRpb25OZWVkZWQgPSBuZWVkZWQ7Ci0JfQotCi0JLyoqCi0JICogSG9sZHMgYW55IGRhdGEgdGhhdCB0aGUgcmVpbml0IHByb2NlZHVyZSBtaWdodCBmaW5kIHVzZWZ1bCBpbgotCSAqIHJlaW5pdGlhbGl6aW5nIHRoZSBtb2RlbC4gVGhpcyBpcyBoYW5keSwgc2luY2UgdGhlIHJlaW5pdGlhbGl6YXRpb24gbWF5Ci0JICogbm90IHRha2UgcGxhY2UgYXQgb25jZSwgYW5kIHNvbWUgIm9sZCIgZGF0YSBtYXkgYmUgbmVlZGVkIHRvIHByb3Blcmx5Ci0JICogdW5kbyBwcmV2aW91cyBzZXR0aW5ncy4gTm90ZTogdGhlIHBhcmFtZXRlciB3YXMgaW50ZW50aW9uYWxseSBtYWRlIHRvCi0JICogYmUgb2YgdHlwZSAnT2JqZWN0JyBzbyBkaWZmZXJlbnQgbW9kZWxzIGNhbiB1c2UgaW4gZGlmZmVyZW50IHdheXMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVpbml0aWFsaXplU3RhdGVEYXRhKE9iamVjdCBvYmplY3QpIHsKLQotCQlyZWluaXRpYWxpemVTdGF0ZURhdGEgPSBvYmplY3Q7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvbHZlcihVUklSZXNvbHZlciBuZXdSZXNvbHZlcikgewotCi0JCWZSZXNvbHZlciA9IG5ld1Jlc29sdmVyOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWJvb2xlYW4gbGlmZUN5Y2xlTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRpcnR5U3RhdGVXYXRjaGVyKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkRvY3VtZW50VG9Nb2RlbE5vdGlmaWVyKTsKLQkJCS8vIHByZWNoYW5nZSBub3RpZmljYXRpb24KLQkJCWxpZmVDeWNsZU5vdGlmaWNhdGlvbiA9IHRydWU7Ci0JCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgRG9jdW1lbnRDaGFuZ2VkKE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5ULCB0aGlzLCBmU3RydWN0dXJlZERvY3VtZW50LCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJc2lnbmFsTGlmZWN5Y2xlRXZlbnQobW9kZWxMaWZlY3ljbGVFdmVudCk7Ci0JCX0KLQotCQkvLyBob2xkIGZvciBsaWZlIGN5Y2xlIG5vdGlmaWNhdGlvbgotCQlJU3RydWN0dXJlZERvY3VtZW50IHByZXZpb3VzRG9jdW1lbnQgPSBmU3RydWN0dXJlZERvY3VtZW50OwotCQkvLyB0aGUgYWN0dWFsIGNoYW5nZQotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gbmV3U3RydWN0dXJlZERvY3VtZW50OwotCi0KLQkJLy8gYXQgdGhlIHN1cGVyIGNsYXNzIGxldmVsLCB3ZSdsbCBsaXN0ZW4gZm9yIHN0cnVjdHVyZWREb2N1bWVudAotCQkvLyBjaGFuZ2VzCi0JCS8vIHNvIHdlIGNhbiBzZXQgb3VyIGRpcnR5IHN0YXRlIGZsYWcKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRGlydHlTdGF0ZVdhdGNoZXIpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIpOwotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmRG9jdW1lbnRUb01vZGVsTm90aWZpZXIpOwotCQl9Ci0KLQkJaWYgKGxpZmVDeWNsZU5vdGlmaWNhdGlvbikgewotCQkJLy8gcG9zdCBjaGFuZ2Ugbm90aWZpY2F0aW9uCi0JCQlNb2RlbExpZmVjeWNsZUV2ZW50IG1vZGVsTGlmZWN5Y2xlRXZlbnQgPSBuZXcgRG9jdW1lbnRDaGFuZ2VkKE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVCwgdGhpcywgcHJldmlvdXNEb2N1bWVudCwgbmV3U3RydWN0dXJlZERvY3VtZW50KTsKLQkJCXNpZ25hbExpZmVjeWNsZUV2ZW50KG1vZGVsTGlmZWN5Y2xlRXZlbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IHRoZSBtZXRob2QncyBkZXNjcmlwdGlvbiBoZXJlLiBDcmVhdGlvbiBkYXRlOiAoOS83LzIwMDEgMjozMDoyNgotCSAqIFBNKQotCSAqIAotCSAqIEBwYXJhbSBuZXdTeW5jaHJvbml6YXRpb25TdGFtcAotCSAqICAgICAgICAgICAgbG9uZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN5bmNocm9uaXphdGlvblN0YW1wKGxvbmcgbmV3U3luY2hyb25pemF0aW9uU3RhbXApIHsKLQotCQlmU3luY2hyb25pemF0aW9uU3RhbXAgPSBuZXdTeW5jaHJvbml6YXRpb25TdGFtcDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgd2FzIG51bGwgd2hlbiB1bmRvIG1hbmFnZXIgc2V0IG9uIG1vZGVsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0VW5kb01hbmFnZXIodW5kb01hbmFnZXIpOwotCX0KLQotCS8qKgotCSAqIFRvIGJlIGNhbGxlZCBvbmx5IGJ5ICJmcmllbmRseSIgY2xhc3Nlcywgc3VjaCBhcyBNb2RlbE1hbmFnZXIsIGFuZAotCSAqIHN1YmNsYXNzZXMuCi0JICovCi0Jdm9pZCBzaWduYWxMaWZlY3ljbGVFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlmTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlci5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNpZ25hbFBvc3RMaWZlQ3ljbGVMaXN0ZW5lclJlbGVhc2UoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFTEVBU0VEIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QT1NUX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2lnbmFsUHJlTGlmZUN5Y2xlRXZlbnRSZWxlYXNlKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCWludCB0eXBlID0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9SRUxFQVNFRCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UOwotCQkvLyB3aGF0J3Mgd3Jvbmcgd2l0aCB0aGlzIGRlc2lnbiB0aGF0IGEgY2FzdCBpcyBuZWVkZWQgaGVyZSE/Ci0JCU1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQgPSBuZXcgTW9kZWxMaWZlY3ljbGVFdmVudChzdHJ1Y3R1cmVkTW9kZWwsIHR5cGUpOwotCQkoKEFic3RyYWN0U3RydWN0dXJlZE1vZGVsKSBzdHJ1Y3R1cmVkTW9kZWwpLnNpZ25hbExpZmVjeWNsZUV2ZW50KGV2ZW50KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0ZhY3RvcnlSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9GYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzNjcyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0ZhY3RvcnlSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBzaW1wbHkgbWFpbnRhaW5zIHRoZSBsaXN0IG9mIGZhY3RvcmllcyBhbmQgcmV0dXJucyBzaW5nbGV0b24KLSAqIGluc3RhbmNlcyBvZiB0aGVtLiBTb21lICJidWlsdCBpbiIgdHlwZXMgYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmb3JtCi0gKiBGYWN0b3J5Q29uZmlnLCBpZiBub3QgZm91bmQgcmVnaXN0ZXJkLCBidXQgbm9ybWFsbHkgY2xpZW50cyBjYW4vc2hvdWxkCi0gKiByZWdpc3RlciB0aGVpciBvd24gZmFjdG9yaWVzLgotICogCi0gKiBOb3QgaW50ZW5kZWQgZm9yIGNsaWVudHMgdG8gc3ViY2xhc3Mgb3IgaW5zdGFudGlhdGUuCi0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZhY3RvcnlSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIExpc3QgZmFjdG9yaWVzOwotCi0JLyoqCi0JICogaW50ZW50aW9uYWxseSBkZWZhdWx0IGFjY2VzcwotCSAqLwotCUZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCXByaXZhdGUgTGlzdCBfZ2V0RmFjdG9yaWVzKCkgewotCi0JCWlmIChmYWN0b3JpZXMgPT0gbnVsbCkgewotCQkJLy8gbWF5IG5lZWQgdG8gdXNlIGphdmEudXRpbC5Db2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KCkgaWYKLQkJCS8vIHN5bmNyb25pemF0aW9uIGJlY29tZXMKLQkJCS8vIG5lY2Vzc2FyeSAoYW5kIGlmIHNvLCByZW1lbWJlciB0byBzeW5jaHJvbml6ZSBvbiBmYWN0b3JpZXMpCi0JCQlmYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCX0KLQkJcmV0dXJuIGZhY3RvcmllczsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5KSB7Ci0JCV9nZXRGYWN0b3JpZXMoKS5hZGQoZmFjdG9yeSk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2xlYXJGYWN0b3JpZXMoKSB7Ci0JCWZhY3Rvcmllcy5jbGVhcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBGYWN0b3J5UmVnaXN0cnkjY29udGFpbnMoT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCB0eXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ3JlIG5vdCB1c2luZyBjbG9uZWQgbGlzdCwgc28gc3RyaWN0bHkgc3BlYWtpbmcKLQkJLy8gaXMgbm90IHRocmVhZCBzYWZlLgotCQlMaXN0IGludGVybmFsTGlzdCA9IF9nZXRGYWN0b3JpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcm5hbExpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpbnRlcm5hbExpc3QuZ2V0KGkpOwotCQkJaWYgKGZhY3RvcnkuaXNGYWN0b3J5Rm9yVHlwZSh0eXBlKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoZSBsaXN0IG9mIGZhY3RvcmllcyBpbiB0aGUgcmVnaXN0cnkuIE5vdGU6Ci0JICogdGhpcyBjYW4gbm90IGJlIHVzZWQgdG8gYWRkL3JlbW92ZSBmYWN0b3JpZXMuIEl0cyBwcmltYXJpbHkgcHJvdmlkZWQKLQkgKiBmb3IgdGhvc2UgZmV3IGNhc2VzIHdoZXJlIGEgbGlzdCBvZiBmYWN0b3JpZXMgbXVzdCBiZSBjb3BpZWQgZnJvbSBvbmUKLQkgKiBtb2RlbCBhbmQgYWRkZWQgdG8gYW5vdGhlci4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoKSB7Ci0JCS8vIG5vdGU6IGZvciBvYmplY3QgaW50ZWdyaXR5LCB3ZSBkb24ndCBsZXQgYW55b25lIGdldAotCQkvLyBvdXIgbWFpbiBsaXN0IChzbyB0aGV5IGhhdmUgdG8gYWRkIHRocm91Z2ggYWRkRmFjdG9yeSksCi0JCS8vIGJ1dCB3ZSB3aWxsIHJldHVybiBhIHNoYWxsb3cgImNsb25lZCIgbGlzdC4KLQkJTGlzdCBmYWN0b3J5TGlzdCA9IG5ldyBBcnJheUxpc3QoX2dldEZhY3RvcmllcygpKTsKLQkJcmV0dXJuIGZhY3RvcnlMaXN0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGEgbm90IGEgcHVyZSByZXNpc3RyeS4gRmFjdG9yaWVzIHJldHJpZXZlZCBiYXNlZCBvbgotCSAqIHRoZWlyIHJlc3BvbnNlIHRvICJpc0ZhY3RvcnlGb3JUeXBlKHR5cGUpIi4gTm90ZSB0aGF0IGlmIHRoZXJlIGlzIG1vcmUKLQkgKiB0aGFuIG9uZSBmYWN0b3J5IHRoYXQgY2FuIGFuc3dlciAndHJ1ZScgdGhhdCB0aGUgbW9zdCByZWNlbnRseSBhZGRlZAotCSAqIGZhY3RvcnkgaXMgdXNlZC4KLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBnZXRGYWN0b3J5Rm9yKE9iamVjdCB0eXBlKSB7Ci0KLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSByZXN1bHQgPSBudWxsOwotCQlpZiAoZmFjdG9yaWVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxpc3RTaXplID0gZmFjdG9yaWVzLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCS8vIEl0IGlzIHRoZSBhZGFwdGVyIGZhY3RvcmllcyByZXNwb25zaWJpbGl0eSB0byBhbnN3ZXIKLQkJCS8vIGlzRmFjdG9yeUZvclR5cGUgc28gaXQgZ2V0cyBjaG9vc2VuLgotCQkJLy8gTm90aWNlIHdlIGFyZSBnb2luZyB0aHJvdWdoIHRoZSBsaXN0IGJhY2t3YXJkcyB0byBnZXQgdGhlCi0JCQkvLyBmYWN0b3J5IGFkZGVkIGxhc3QuCi0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGEgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLmdldChpKTsKLQkJCWlmIChhLmlzRmFjdG9yeUZvclR5cGUodHlwZSkpIHsKLQkJCQlyZXN1bHQgPSBhOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyBtb2RpZmllZCB0byB3b3JrIG9uIGNvcHkgb2YgbGlzdCwgZm9yIFY1UFRGMQotCQkvLyBzZW5kIHJlbGVhc2UgdG8gbG9jYWwgY29weSBvZiBsaXN0Ci0JCS8vIG9mIGZhY3Rvcmllcywgc2luY2Ugc29tZSBmYWN0b3JpZXMsIGR1cmluZwotCQkvLyB0aGVpciByZWxlYXNlIGZ1bmN0aW9uLCBtYXkgcmVtb3ZlCi0JCS8vIHRoZW1zZWx2ZXMgZnJvbSB0aGUgcmVnaXN0cnkuCi0JCUxpc3QgbG9jYWxMaXN0ID0gZ2V0RmFjdG9yaWVzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGEgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgbG9jYWxMaXN0LmdldChpKTsKLQkJCS8vIFRvIGhlbHAgYnVsbGV0IHByb29mIGNvZGUsIHdlJ2xsIGNhdGNoIGFuZCBsb2cKLQkJCS8vIGFueSBtZXNzYWdlcyB0aHJvd24gYnkgZmFjdG9yaWVzIGR1cmluZyByZWxlYXNlLAotCQkJLy8gYnV0IHdlJ2xsIGF0dGVtcHQgdG8ga2VlcCBnb2luZy4KLQkJCS8vIEluIG5lYXJseSBhbGwgY2FzZXMsIHRob3VnaCwgc3VjaCBlcnJvcnMgYXJlCi0JCQkvLyBzZXZlcmUgZm9yIHByb2R1Y3QvY2xpZW50LCBhbmQgbmVlZCB0byBiZSBmaXhlZC4KLQkJCXRyeSB7Ci0JCQkJYS5yZWxlYXNlKCk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJQcm9ncmFtIHByb2JsZW0gcmVsZWFzaW5nIGZhY3RvcnkiICsgYSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBmYWN0b3J5IGlmIGl0IGNhbiBiZSByZXRyaWV2ZWQgYnkgZ2V0RmFjdG9yeUZvcih0eXBlKS4gSWYKLQkgKiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lLCBhbGwgYXJlIHJlbW92ZWQuIElmIHRoZXJlIGlzIG5vbmUsIHRoZSBjYWxsCi0JICogc2ltcGx5IHJldHVybnMgKHRoYXQgaXMsIGl0IGlzIG5vdCBjb25zaWRlcmVkIGFuIGVycm9yKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVGYWN0b3JpZXNGb3IoamF2YS5sYW5nLk9iamVjdCB0eXBlKSB7Ci0JCWlmIChmYWN0b3JpZXMgIT0gbnVsbCkgewotCQkJaW50IGxpc3RTaXplID0gZmFjdG9yaWVzLnNpemUoKTsKLQkJCS8vIHdlJ2xsIGdvIGJhY2t3YXJkcyB0aHJvdWdoIGxpc3QsIHNpbmNlIHdlJ3JlIHJlbW92aW5nLCBzbwotCQkJLy8gJ3NpemUnIGNoYW5nZSB3b24ndCBtYXR0ZXIuCi0JCQkvLyBOb3RlOiBJJ20gYXNzdW1pbmcgb3RoZXIgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb24gZG8gbm90IGNoYW5nZQotCQkJLy8gcG9zaXRpb24KLQkJCS8vIHNpbXBseSBiZWNhdXNlIGFub3RoZXIgd2FzIHJlbW92ZWQuCi0JCQlmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IGktLSkgewotCQkJCS8vIEl0IGlzIHRoZSBhZGFwdGVyIGZhY3RvcmllcyByZXNwb25zaWJpbGl0eSB0byBhbnN3ZXIKLQkJCQkvLyBpc0ZhY3RvcnlGb3JUeXBlIHNvIGl0IGdldHMgY2hvb3Nlbi4KLQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGEgPSAoSU5vZGVBZGFwdGVyRmFjdG9yeSkgZmFjdG9yaWVzLmdldChpKTsKLQkJCQlpZiAoYS5pc0ZhY3RvcnlGb3JUeXBlKHR5cGUpKSB7Ci0JCQkJCWZhY3Rvcmllcy5yZW1vdmUoYSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRmFjdG9yeShJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJX2dldEZhY3RvcmllcygpLnJlbW92ZShmYWN0b3J5KTsKLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9MaWZlY3ljbGVOb3RpZmljYXRpb25NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0xpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyYTkzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL0xpZmVjeWNsZU5vdGlmaWNhdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIEZvciAiaW50ZXJuYWwgdXNlIiBvbmx5IGJ5IEFic3RyYWN0U3RydWN0dXJlZE1vZGVsCi0gKi8KLQotY2xhc3MgTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmTGlzdGVuZXJzOwotCi0JTGlmZWN5Y2xlTm90aWZpY2F0aW9uTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIGEgbmV3IGNvcHkgb2YgdGhlIGdpdmVuIGxpc3RlbmVyIHRvIHRoZSBsaXN0IG9mIExpZmUgQ3ljbGUKLQkgKiBMaXN0ZW5lcnMuCi0JICogCi0JICogTXVsdGlwbGUgY29waWVzIG9mIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhbGxvd2VkLiBUaGlzIGlzIHJlcXVpcmVkIHRvCi0JICogc3VwcG9ydCB0aHJlYWRlZCBsaXN0ZW5lciBtYW5hZ2VtZW50IHByb3Blcmx5IGFuZCBmb3IgbW9kZWwtZHJpdmVuIG1vdmUKLQkgKiB0byB3b3JrLiBGb3IgZXhhbXBsZSwgdHdvIGFkZHMgYW5kIGEgc2luZ2xlIHJlbW92ZSBzaG91bGQgcmVzdWx0IGluIHRoZQotCSAqIGxpc3RlbmVyIHN0aWxsIGxpc3RlbmluZyBmb3IgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqLwotCXZvaWQgYWRkTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKExvZ2dlci5ERUJVRyAmJiBVdGlsaXRpZXMuY29udGFpbnMoZkxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgIiArIGxpc3RlbmVyICsgIiBsaXN0ZW5pbmcgbW9yZSB0aGFuIG9uY2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJaW50IG9sZFNpemUgPSAwOwotCQlpZiAoZkxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IgZmlyc3QKLQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJb2xkU2l6ZSA9IGZMaXN0ZW5lcnMubGVuZ3RoOwotCQl9Ci0JCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCWlmIChmTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCVN5c3RlbS5hcnJheWNvcHkoZkxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBvbGRTaXplKTsKLQkJfQotCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQluZXdMaXN0ZW5lcnNbbmV3U2l6ZSAtIDFdID0gbGlzdGVuZXI7Ci0JCS8vCi0JCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJZkxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgc2luZ2xlIGNvcHkgb2YgdGhlIGdpdmVuIGxpc3RlbmVyIGZyb20gdGhlIGxpc3Qgb2YgTGlmZSBDeWNsZQotCSAqIExpc3RlbmVycy4KLQkgKiAKLQkgKiBAcGFyYW0gbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZkxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaW50IG9sZFNpemUgPSBmTGlzdGVuZXJzLmxlbmd0aDsKLQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCWJvb2xlYW4gcmVtb3ZlZE9uY2UgPSBmYWxzZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJaWYgKGZMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIgJiYgIXJlbW92ZWRPbmNlKSB7Ci0JCQkJCS8vIGlnbm9yZSBvbiB0aGUgZmlyc3QgbWF0Y2gKLQkJCQkJcmVtb3ZlZE9uY2UgPSB0cnVlOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdCdzIG5vdCB0aGUgb25lIHdlIGFyZSByZW1vdmluZwotCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmTGlzdGVuZXJzW2ldOwotCQkJCX0KLQkJCX0KLQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlIG9sZAotCQkJLy8gb25lCi0JCQlmTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQl9Ci0JCWlmIChMb2dnZXIuREVCVUcgJiYgVXRpbGl0aWVzLmNvbnRhaW5zKGZMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIklNb2RlbExpZmVjeWNsZUxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgcmVtb3ZlZCBvbmNlIGJ1dCBzdGlsbCBsaXN0ZW5pbmciKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQl2b2lkIHNpZ25hbExpZmVjeWNsZUV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKExvZ2dlci5ERUJVR19MSUZFQ1lDTEUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJNb2RlbExpZmVjeWNsZUV2ZW50IGZpcmVkIGZvciAiICsgZXZlbnQuZ2V0TW9kZWwoKS5nZXRJZCgpICsgIjogIiArIGV2ZW50LnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kZWxMaWZlY3ljbGVFdmVudCBmaXJlZCBmb3IgIiArIGV2ZW50LmdldE1vZGVsKCkuZ2V0SWQoKSArICI6ICIgKyBldmVudC50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJLy8gV2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUgbGlzdGVuZXIgbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlCi0JCS8vIGxpc3RlbmVyIGFycmF5IGZyb20gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGZMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGZMaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9IChJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXTsKLQkJCQkvLyBvbmx5IG9uZSB0eXBlIG9mIGxpc3RlbmVyIGZvciBub3cgLi4uIHRoaXMgY291bGQgYmVjb21lCi0JCQkJLy8gbW9yZSBjb21wbGV4Ci0JCQkJaWYgKChldmVudC5nZXRJbnRlcm5hbFR5cGUoKSAmIE1vZGVsTGlmZWN5Y2xlRXZlbnQuUFJFX0VWRU5UKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50LlBSRV9FVkVOVCkgewotCQkJCQlsaXN0ZW5lci5wcm9jZXNzUHJlTW9kZWxFdmVudChldmVudCk7Ci0JCQkJfQotCQkJCWlmICgoZXZlbnQuZ2V0SW50ZXJuYWxUeXBlKCkgJiBNb2RlbExpZmVjeWNsZUV2ZW50LlBPU1RfRVZFTlQpID09IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVCkgewotCQkJCQlsaXN0ZW5lci5wcm9jZXNzUG9zdE1vZGVsRXZlbnQoZXZlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxMaWZlY3ljbGVFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbExpZmVjeWNsZUV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWI2ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbC9Nb2RlbExpZmVjeWNsZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotLyoqCi0gKiBUaGlzIGlzIGFuIGVhcmx5IHZlcnNpb24gb2YgYSBjbGFzcyB0aGF0IG1heSBjaGFuZ2Ugb3ZlciB0aGUgbmV4dCBmZXcKLSAqIG1pbGVzdG9uZXMuCi0gKi8KLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxMaWZlY3ljbGVFdmVudCB7Ci0KLQotCS8vIHRoaXMgbGlzdCBpcyBmb3IgInB1YmxpYyIgY29uc3VtcHRpb24KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9TQVZFRCA9IDB4MDAwMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRUxFQVNFRCA9IDB4MDAwMDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCA9IDB4MDAwMzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9ESVJUWV9TVEFURSA9IDB4MDAwNDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRVZFUlQ9IDB4MDAwNTsKLQotCS8vIFRPRE86IGZpbmlzaCBzdXBwb3J0IGZvciB0aGVzZQotCS8vIGZvbGxvd2luZyBub3QgaW1wbGVtZW50ZWQgeWV0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVJTklUSUFMSVpFRCA9IDB4MDAwNjsKLQkvL3B1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFEQVBURVJTX05PVElGSUVEID0gMHgwMDA3OwotCS8vcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTU9ERUxfUkVTT1VSQ0VfTU9WRUQgPSAweDAwMDg7Ci0JLy9wdWJsaWMgc3RhdGljIGZpbmFsIGludCBNT0RFTF9SRVNPVVJDRV9ERUxFVEVEID0gMHgwMDA5OwotCi0JLy8gVGhpcyBsaXN0ICh1cHBlciB0d28gYnl0ZXMpIGlzIGZvciBvbmx5IGludGVybmFsIG1lY2hhbmlzbXMgYW5kCi0JLy8gc3ViY2xhc3NlcwotCS8vIEZvciBzaW1wbGljaXR5IHRoZXkgYXJlICJtYXNrZWQgb3V0IiB3aGVuIGNsaWVudCBjYWxscyBnZXRUeXBlKCkKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBQUkVfRVZFTlQgPSAweDAxMDA7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1BU0sgPSAweDAwRkY7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgUE9TVF9FVkVOVCA9IDB4MDIwMDsKLQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZNb2RlbDsKLQlwcml2YXRlIGludCBmVHlwZTsKLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KGludCB0eXBlKSB7Ci0JCXRoaXMoKTsKLQkJZlR5cGUgPSB0eXBlOwotCX0KLQotCXB1YmxpYyBNb2RlbExpZmVjeWNsZUV2ZW50KElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsLCBpbnQgdHlwZSkgewotCQl0aGlzKHR5cGUpOwotCQlmTW9kZWwgPSBzdHJ1Y3R1cmVkTW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZGVidWdTdHJpbmcoaW50IHR5cGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSAmIE1BU0spIHsKLQkJCWNhc2UgTU9ERUxfU0FWRUQgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9TQVZFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERUxfUkVMRUFTRUQgOgotCQkJCXJlc3VsdCA9ICJNT0RFTF9SRUxFQVNFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgTU9ERUxfRE9DVU1FTlRfQ0hBTkdFRCA6Ci0JCQkJcmVzdWx0ID0gIk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQljYXNlIE1PREVMX0RJUlRZX1NUQVRFIDoKLQkJCQlyZXN1bHQgPSAiTU9ERUxfRElSVFlfU1RBVEUiOyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQkvKgotCQkJICogY2FzZSBNT0RFTF9SRUlOSVRJQUxJWkVEIDogcmVzdWx0ID0gIk1PREVMX1JFSU5JVElBTElaRUQiOwotCQkJICogYnJlYWs7IGNhc2UgTU9ERUxfUkVMT0FERUQgOiByZXN1bHQgPSAiTU9ERUxfUkVMT0FERUQiOyBicmVhazsKLQkJCSAqIGNhc2UgQURBUFRFUlNfTk9USUZJRUQgOiByZXN1bHQgPSAiQURBUFRFUlNfTk9USUZJRUQiOyBicmVhazsKLQkJCSAqIGNhc2UgTU9ERUxfUkVTT1VSQ0VfTU9WRUQgOiByZXN1bHQgPSAiTU9ERUxfUkVTT1VSQ0VfTU9WRUQiOwotCQkJICogYnJlYWs7IGNhc2UgTU9ERUxfUkVTT1VSQ0VfREVMRVRFRCA6IHJlc3VsdCA9Ci0JCQkgKiAiTU9ERUxfUkVTT1VSQ0VfREVMRVRFRCI7IGJyZWFrOwotCQkJICovCi0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNb2RlbExpZmVjeWNsZUV2ZW50IGRpZCBub3QgaGF2ZSB2YWxpZCB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0SW50ZXJuYWxUeXBlKCkgewotCi0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbCgpIHsKLQotCQlyZXR1cm4gZk1vZGVsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpIHsKLQotCQkvLyBmb3Igbm93LCB3ZSdsbCBtYXNrIHR5cGUgdG8gInB1YmxpYyIgb25lcyB0aGlzIGVhc3kKLQkJLy8gd2F5IC4uLiBidXQgSSBrbm93IHRoZXJlIG11c3QgYmUgYSBiZXR0ZXIgd2F5Ci0JCXJldHVybiBmVHlwZSAmIE1BU0s7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9ICJNb2RlbExpZmVjeWNsZUV2ZW50OiAiICsgZGVidWdTdHJpbmcoZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsL01vZGVsTWFuYWdlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxNYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWMzMDA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWwvTW9kZWxNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuRmlsZUJ1ZmZlcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JVGV4dEZpbGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5SZXBsYWNlRWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLlRleHRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5GaWxlQnVmZmVyTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLk51bGxNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LkRvY3VtZW50UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkU3RyZWFtQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbnRlbnRCYXNlZFByZWZlcmVuY2VHYXRld2F5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZXhjZXB0aW9ucy5NYWxmb3JtZWRPdXRwdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlci5Nb2RlbEhhbmRsZXJSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlByb2plY3RSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLS8qKgotICogTm90IGludGVuZGVkIHRvIGJlIHN1YmNsYXNzZWQsIHJlZmVyZW5jZWQgb3IgaW5zdGFudGlhdGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nLCByZXRyaXZpbmcsIGFuZCBjYWNoaW5nCi0gKiBTdHJ1Y3R1cmVkTW9kZWxzIEl0IHJldHJpZXZlcyB0aGUgY2FjaGVkIG9iamVjdHMgYnkgYW4gaWQgd2hpY2ggaXMKLSAqIHR5cGljYWxseSBhIFN0cmluZyByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlcyBVUkkuIE5vdGU6IEl0cyBpbXBvcnRhbnQgdGhhdAotICogYWxsIGNsaWVudHMgdGhhdCBzaGFyZSBhIHJlc291cmNlIGRvIHNvIHVzaW5nIDxiPmlkZW50aWNhbCA8L2I+Ci0gKiBpZGVudGlmaWVycywgb3IgZWxzZSBkaWZmZXJlbnQgaW5zdGFuY2VzIHdpbGwgYmUgY3JlYXRlZCBhbmQgcmV0cmlldmVkLAotICogZXZlbiBpZiB0aGV5IGFsbCB0ZWNobmljYWxseSBwb2ludCB0byB0aGUgc2FtZSByZXNvdXJjZSBvbiB0aGUgZmlsZSBzeXN0ZW0uCi0gKiBUaGlzIGNsYXNzIGFsc28gcHJvdmlkZXMgYSBjb252ZW5pZW50IHBsYWNlIHRvIHJlZ2lzdGVyIE1vZGVsIExvYWRlcnMgYW5kCi0gKiBEdW1wZXJzIGJhc2VkIG9uICd0eXBlJy4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsTWFuYWdlckltcGwgaW1wbGVtZW50cyBJTW9kZWxNYW5hZ2VyIHsKLQotCXN0YXRpYyBjbGFzcyBFbnVtZXJhdGVkTW9kZWxJZHMgaW1wbGVtZW50cyBFbnVtZXJhdGlvbiB7Ci0KLQkJRW51bWVyYXRpb24gZlNoYXJlZE9iamVjdEtleXM7Ci0KLQkJcHJvdGVjdGVkIEVudW1lcmF0ZWRNb2RlbElkcyhEaWN0aW9uYXJ5IHNoYXJlZE9iamVjdHMpIHsKLQotCQkJaWYgKHNoYXJlZE9iamVjdHMgPT0gbnVsbCkgewotCQkJCS8vIGlmIG5vIHNoYXJlZCBvYmplY3RzIHlldCwgcmV0dXJuIGVtcHR5IGVudW1lcmF0aW9uCi0JCQkJZlNoYXJlZE9iamVjdEtleXMgPSBudWxsOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZlNoYXJlZE9iamVjdEtleXMgPSBzaGFyZWRPYmplY3RzLmtleXMoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc01vcmVFbGVtZW50cygpIHsKLQotCQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJCWlmIChmU2hhcmVkT2JqZWN0S2V5cyAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGZTaGFyZWRPYmplY3RLZXlzLmhhc01vcmVFbGVtZW50cygpOwotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0KLQkJCWlmIChmU2hhcmVkT2JqZWN0S2V5cyA9PSBudWxsKQotCQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCQlyZXR1cm4gZlNoYXJlZE9iamVjdEtleXMubmV4dEVsZW1lbnQoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBjbGFzcyBSZWFkRWRpdFR5cGUgewotCQlSZWFkRWRpdFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgRGF0YSBjbGFzcyB0byB0cmFjayBvdXIgc2hhcmVkIG9iamVjdHMKLQkgKi8KLQlzdGF0aWMgY2xhc3MgU2hhcmVkT2JqZWN0IHsKLQkJaW50IHJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJaW50IHJlZmVyZW5jZUNvdW50Rm9yUmVhZDsKLQkJSVN0cnVjdHVyZWRNb2RlbCB0aGVTaGFyZWRNb2RlbDsKLQotCQlTaGFyZWRPYmplY3QoSVN0cnVjdHVyZWRNb2RlbCBzaGFyZWRNb2RlbCkgewotCQkJdGhlU2hhcmVkTW9kZWwgPSBzaGFyZWRNb2RlbDsKLQkJCXJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9IDA7Ci0JCQlyZWZlcmVuY2VDb3VudEZvckVkaXQgPSAwOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBFeGNlcHRpb24gZGVidWdFeGNlcHRpb24gPSBudWxsOwotCi0JLyoqCi0JICogT3VyIHNpbmdsZXRvbiBpbnN0YW5jZQotCSAqLwotCXByaXZhdGUgc3RhdGljIE1vZGVsTWFuYWdlckltcGwgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IFJFQURfQlVGRkVSX1NJWkUgPSA0MDk2OwotCi0JLyoqCi0JICogTm90IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLCB3aWxsIGJlIG1hZGUgcmVzdHJpY3RlZCBhY2Nlc3MuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIElNb2RlbE1hbmFnZXIgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IE1vZGVsTWFuYWdlckltcGwoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBSZWFkRWRpdFR5cGUgRURJVCA9IG5ldyBSZWFkRWRpdFR5cGUoImVkaXQiKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIE91ciBjYWNoZSBvZiBtYW5hZ2VkIG9iamVjdHMKLQkgKi8KLQlwcml2YXRlIERpY3Rpb25hcnkgZk1hbmFnZWRPYmplY3RzOwotCi0JcHJpdmF0ZSBNb2RlbEhhbmRsZXJSZWdpc3RyeSBmTW9kZWxIYW5kbGVyUmVnaXN0cnk7Ci0JcHJpdmF0ZSBpbnQgbW9kZWxNYW5hZ2VyU3RhdGVDaGFuZ2luZzsKLQlwcml2YXRlIGZpbmFsIFJlYWRFZGl0VHlwZSBSRUFEID0gbmV3IFJlYWRFZGl0VHlwZSgicmVhZCIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbnRlbnRpYWxseSBkZWZhdWx0IGFjY2VzcyBvbmx5LgotCSAqIAotCSAqLwotCU1vZGVsTWFuYWdlckltcGwoKSB7Ci0KLQkJc3VwZXIoKTsKLQkJZk1hbmFnZWRPYmplY3RzID0gbmV3IEhhc2h0YWJsZSgpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uQ3JlYXRlTW9kZWwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLCBVUklSZXNvbHZlciByZXNvbHZlciwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaWQsIGhhbmRsZXIsIHJlc29sdmVyKTsKLQkJCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkJCWxvYWRlci5sb2FkKFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKSwgbW9kZWwsIGVuY29kaW5nUnVsZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UndmUgYWxyZWFkeSBmb3VuZAotCQkJCWhhbmRsZVByb2dyYW1FcnJvcihlKTsKLQkJCX0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gYWRkIHRvIG91ciBjYWNoZQotCQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QobW9kZWwpOwotCQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiBzaGFyZWQgb2JqZWN0IGlzIGluaXRpYWxseSBpbiBvdXIgY2FjaGUsIHRoZW4gc2ltcGx5Ci0JCQkvLyBpbmNyZW1lbnQgaXRzIHJlZiBjb3VudCwKLQkJCS8vIGFuZCByZXR1cm4gdGhlIG9iamVjdC4KLQkJCV9pbmNyQ291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQl9Ci0JCS8vIHdlIGV4cGVjdCB0byBhbHdheXMgcmV0dXJuIHNvbWV0aGluZwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCWRlYnVnRXhjZXB0aW9uID0gbmV3IEV4Y2VwdGlvbigiaW5zdGFuY2Ugb25seSBmb3Igc3RhY2sgdHJhY2UiKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogbm8gbW9kZWwgcmVjb3JkZWQgZm9yIGlkICIgKyBpZCwgZGVidWdFeGNlcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCi0JCS8vIG5vdGU6IGNsaWVudHMgbXVzdCBjYWxsIHJlbGVhc2UgZm9yIGVhY2ggdGltZSB0aGV5IGNhbGwgZ2V0LgotCQlyZXR1cm4gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBfY29tbW9uQ3JlYXRlTW9kZWwoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLCBVUklSZXNvbHZlciByZXNvbHZlciwgUmVhZEVkaXRUeXBlIHJ3VHlwZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogaWQgbWF5IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAoc2hhcmVkT2JqZWN0ID09IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBfY29tbW9uQ3JlYXRlTW9kZWwoaWQsIGhhbmRsZXIsIHJlc29sdmVyKTsKLQkJCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkJCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJtb2RlbCB3YXMgcmVxdWVzdGVkIGZvciBpZCAiICsgaWQgKyAiIHdpdGhvdXQgYSBjb250ZW50IElucHV0U3RyZWFtIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCQlsb2FkZXIubG9hZChpZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBtb2RlbCwgZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIpOwotCQkJfQotCQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlJ3ZlIGFscmVhZHkgZm91bmQKLQkJCQloYW5kbGVQcm9ncmFtRXJyb3IoZSk7Ci0JCQl9Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCS8vIGFkZCB0byBvdXIgY2FjaGUKLQkJCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KG1vZGVsKTsKLQkJCQlfaW5pdENvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gaWYgc2hhcmVkIG9iamVjdCBpcyBpbml0aWFsbHkgaW4gb3VyIGNhY2hlLCB0aGVuIHNpbXBseQotCQkJLy8gaW5jcmVtZW50IGl0cyByZWYgY291bnQsCi0JCQkvLyBhbmQgcmV0dXJuIHRoZSBvYmplY3QuCi0JCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgcndUeXBlKTsKLQkJfQotCQkvLyB3ZSBleHBlY3QgdG8gYWx3YXlzIHJldHVybiBzb21ldGhpbmcKLQkJQXNzZXJ0LmlzTm90TnVsbChzaGFyZWRPYmplY3QsICJQcm9ncmFtIEVycm9yOiBubyBtb2RlbCByZWNvcmRlZCBmb3IgaWQgIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkvLyBub3RlOiBjbGllbnRzIG11c3QgY2FsbCByZWxlYXNlIGZvciBlYWNoIHRpbWUgdGhleSBjYWxsIGdldC4KLQkJcmV0dXJuIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkNyZWF0ZU1vZGVsKFN0cmluZyBpZCwgSU1vZGVsSGFuZGxlciBoYW5kbGVyLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCi0JCUlNb2RlbExvYWRlciBsb2FkZXIgPSBoYW5kbGVyLmdldE1vZGVsTG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbG9hZGVyLmNyZWF0ZU1vZGVsKCk7Ci0JCS8vIGluIHRoZSBwYXN0LCBpZCB3YXMgbnVsbCBmb3IgInVubWFuYWdlZCIgY2FzZSwgc28gd2Ugd29uJ3QKLQkJLy8gdHJ5IGFuZCBzZXQgaXQKLQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCXJlc3VsdC5zZXRJZChpZCk7Ci0JCX0KLQkJcmVzdWx0LnNldE1vZGVsSGFuZGxlcihoYW5kbGVyKTsKLQkJcmVzdWx0LnNldFJlc29sdmVyKHJlc29sdmVyKTsKLQkJLy8gc29tZSBvYnZpb3VzIHJlZHVuYW5jeSBoZXJlIHRoYXQgbWF5YmUgY291bGQgYmUgaW1wcm92ZWQKLQkJLy8gaW4gZnV0dXJlLCBidXQgaXMgbmVjZXNzYXJ5IGZvciBub3cKLQkJcmVzdWx0LnNldEJhc2VMb2NhdGlvbihpZCk7Ci0JCWlmIChyZXNvbHZlciAhPSBudWxsKSB7Ci0JCQlyZXNvbHZlci5zZXRGaWxlQmFzZUxvY2F0aW9uKGlkKTsKLQkJfQotCQlhZGRGYWN0b3JpZXMocmVzdWx0LCBoYW5kbGVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkdldE1vZGVsKElGaWxlIGlGaWxlLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQotCQlpZiAoaUZpbGUgIT0gbnVsbCAmJiBpRmlsZS5leGlzdHMoKSkgewotCQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpRmlsZSk7Ci0JCQlVUklSZXNvbHZlciByZXNvbHZlciA9IGNhbGN1bGF0ZVVSSVJlc29sdmVyKGlGaWxlKTsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaUZpbGUuZ2V0Q29udGVudHModHJ1ZSkpOwotCQkJdHJ5IHsKLQkJCQltb2RlbCA9IF9jb21tb25DcmVhdGVNb2RlbChpbnB1dFN0cmVhbSwgaWQsIGhhbmRsZXIsIHJlc29sdmVyLCByd1R5cGUsIGVuY29kaW5nUnVsZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgX2NvbW1vbkdldE1vZGVsKElGaWxlIGlGaWxlLCBSZWFkRWRpdFR5cGUgcndUeXBlLCBTdHJpbmcgZW5jb2RpbmcsIFN0cmluZyBsaW5lRGVsaW1pdGVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlTdHJpbmcgaWQgPSBjYWxjdWxhdGVJZChpRmlsZSk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IGNhbGN1bGF0ZVVSSVJlc29sdmVyKGlGaWxlKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IF9jb21tb25HZXRNb2RlbChpRmlsZSwgaWQsIGhhbmRsZXIsIHJlc29sdmVyLCByd1R5cGUsIGVuY29kaW5nLCBsaW5lRGVsaW1pdGVyKTsKLQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIF9jb21tb25HZXRNb2RlbChJRmlsZSBmaWxlLCBTdHJpbmcgaWQsIElNb2RlbEhhbmRsZXIgaGFuZGxlciwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFJlYWRFZGl0VHlwZSByd1R5cGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChpZCA9PSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogaWQgbWF5IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQotCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCkgewotCQkJCW1vZGVsID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKGZpbGUpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCS8vIGFkZCB0byBvdXIgY2FjaGUKLQkJCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChtb2RlbCk7Ci0JCQkJCV9pbml0Q291bnQoc2hhcmVkT2JqZWN0LCByd1R5cGUpOwotCQkJCQlmTWFuYWdlZE9iamVjdHMucHV0KGlkLCBzaGFyZWRPYmplY3QpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgaW5pdGlhbGx5IGluIG91ciBjYWNoZSwgdGhlbiBzaW1wbHkKLQkJCQkvLyBpbmNyZW1lbnQgaXRzIHJlZiBjb3VudCwKLQkJCQkvLyBhbmQgcmV0dXJuIHRoZSBvYmplY3QuCi0JCQkJX2luY3JDb3VudChzaGFyZWRPYmplY3QsIHJ3VHlwZSk7Ci0JCQl9Ci0KLQkJCS8vIGlmIHdlIGRvbid0IGtub3cgaG93IHRvIGNyZWF0ZSBhIG1vZGVsCi0JCQkvLyBmb3IgdGhpcyB0eXBlIG9mIGZpbGUsIHJldHVybiBudWxsCi0JCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQkvLyBub3RlOiBjbGllbnRzIG11c3QgY2FsbCByZWxlYXNlIGZvciBlYWNoIHRpbWUgdGhleSBjYWxsCi0JCQkJLy8gZ2V0LgotCQkJCW1vZGVsID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXByaXZhdGUgU2hhcmVkT2JqZWN0IF9jb21tb25OZXdNb2RlbChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIGFTaGFyZWRNb2RlbCA9IG51bGw7Ci0JCS8vIEZpcnN0LCBjaGVjayBpZiByZXNvdXJjZSBhbHJlYWR5IGV4aXN0cyBvbiBmaWxlIHN5c3RlbS4KLQkJLy8gaWYgaXMgZG9lcywgdGhlbiB0aHJvdyBSZXNvdXJjZSBpbiBVc2UgaWZmIGZvcmNlPT1mYWxzZQotCi0JCWlmIChpRmlsZS5leGlzdHMoKSAmJiAhZm9yY2UpIHsKLQkJCXRocm93IG5ldyBSZXNvdXJjZUFscmVhZHlFeGlzdHMoKTsKLQkJfQotCi0JCVN0cmluZyBpZCA9IGNhbGN1bGF0ZUlkKGlGaWxlKTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCi0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCAmJiAhZm9yY2UpIHsKLQkJCS8vIGlmIGluIGNhY2hlIGFscmVhZHksIGFuZCBmb3JjZSBpcyBub3QgdHJ1ZSwgdGhlbiB0aGlzIGlzIGFuCi0JCQkvLyBlcnJvcgotCQkJLy8gaW4gY2FsbAotCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJfQotCi0JCS8vIGlmIHdlIGdldCB0byBoZWFyIHdpdGhvdXQgYWJvdmUgZXhjZXB0aW9ucywgdGhlbiBhbGwgaXMgb2sKLQkJLy8gdG8gZ2V0IG1vZGVsIGxpa2Ugbm9ybWFsLCBidXQgc2V0ICduZXcnIGF0dHJpYnV0ZSAod2hlcmUgdGhlCi0JCS8vICduZXcnIGF0dHJpYnV0ZSBtZWFucyB0aGlzIGlzIGEgbW9kZWwgd2l0aG91dCBhIGNvcnJlc3BvbmRpbmcKLQkJLy8gdW5kZXJseWluZyByZXNvdXJjZS4KLQkJYVNoYXJlZE1vZGVsID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKGlGaWxlKTsKLQkJYVNoYXJlZE1vZGVsLnNldE5ld1N0YXRlKHRydWUpOwotCQlzaGFyZWRPYmplY3QgPSBhZGRUb0NhY2hlKGlkLCBhU2hhcmVkTW9kZWwpOwotCQkvLyB3aGVuIHJlc291cmNlIGlzIHByb3ZpZGVkLCB3ZSBjYW4gc2V0Ci0JCS8vIHN5bmNocm9uaXphdGlvbiBzdGFtcCAuLi4gb3RoZXJ3aXNlIGNsaWVudCBzaG91bGQKLQkJLy8gTm90ZTogb25lIGNsaWVudCB3aGljaCBkb2VzIHRoaXMgaXMgRmlsZU1vZGVsUHJvdmlkZXIuCi0JCWFTaGFyZWRNb2RlbC5yZXNldFN5bmNocm9uaXphdGlvblN0YW1wKGlGaWxlKTsKLQkJcmV0dXJuIHNoYXJlZE9iamVjdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBfZ2V0TW9kZWxGb3IoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgUmVhZEVkaXRUeXBlIGFjY2Vzc1R5cGUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCVN0cmluZyBpZCA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jYWxjdWxhdGVJZChkb2N1bWVudCk7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJ1bmtub3duIElTdHJ1Y3R1cmVkRG9jdW1lbnQgIiArIGRvY3VtZW50KTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQlfaW5jckNvdW50KHNoYXJlZE9iamVjdCwgYWNjZXNzVHlwZSk7Ci0JCQltb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJfQotCQllbHNlIHsKLQkJCW1vZGVsID0gRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldE1vZGVsKGRvY3VtZW50KTsKLQkJCXNoYXJlZE9iamVjdCA9IG5ldyBTaGFyZWRPYmplY3QobW9kZWwpOwotCQkJX2luaXRDb3VudChzaGFyZWRPYmplY3QsIGFjY2Vzc1R5cGUpOwotCQkJZk1hbmFnZWRPYmplY3RzLnB1dChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIF9pbmNyQ291bnQoU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCwgUmVhZEVkaXRUeXBlIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gUkVBRCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCsrOwotCQl9Ci0JCWVsc2UgaWYgKHR5cGUgPT0gRURJVCkgewotCQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCsrOwotCQl9Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2luaXRDb3VudChTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0LCBSZWFkRWRpdFR5cGUgdHlwZSkgewotCQlpZiAodHlwZSA9PSBSRUFEKSB7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID0gMTsKLQkJfQotCQllbHNlIGlmICh0eXBlID09IEVESVQpIHsKLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQgPSAxOwotCQl9Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElNb2RlbEhhbmRsZXIgaGFuZGxlcikgewotCQlBc3NlcnQuaXNOb3ROdWxsKG1vZGVsLCAibW9kZWwgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJRmFjdG9yeVJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gbW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCUFzc2VydC5pc05vdE51bGwocmVnaXN0cnksICJGYWN0b3J5IFJlZ2lzdHJ5IGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCUxpc3QgZmFjdG9yeUxpc3QgPSBoYW5kbGVyLmdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQkJYWRkRmFjdG9yaWVzKG1vZGVsLCBmYWN0b3J5TGlzdCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBMaXN0IGZhY3RvcnlMaXN0KSB7Ci0JCUFzc2VydC5pc05vdE51bGwobW9kZWwsICJtb2RlbCBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChyZWdpc3RyeSwgIkZhY3RvcnkgUmVnaXN0cnkgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gTm90ZTogd2UgYWRkIGFsbCBvZiB0aGVtIGZyb20gaGFuZGxlciwgZXZlbiBpZgotCQkvLyBhbHJlYWR5IGV4aXN0cy4gTWF5IG5lZWQgdG8gcmVjb25zaWRlciB0aGlzLgotCQlpZiAoZmFjdG9yeUxpc3QgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBmYWN0b3J5TGlzdC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJcmVnaXN0cnkuYWRkRmFjdG9yeShmYWN0b3J5KTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgU2hhcmVkT2JqZWN0IGFkZFRvQ2FjaGUoU3RyaW5nIGlkLCBJU3RydWN0dXJlZE1vZGVsIGFTaGFyZWRNb2RlbCkgewotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0OwotCQlzaGFyZWRPYmplY3QgPSBuZXcgU2hhcmVkT2JqZWN0KGFTaGFyZWRNb2RlbCk7Ci0JCWZNYW5hZ2VkT2JqZWN0cy5wdXQoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCXJldHVybiBzaGFyZWRPYmplY3Q7Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIGlkIHByb3ZpZGVzIGEgY29tbW9uIHdheSB0byBkZXRlcm1pbmUgdGhlIGlkIGZyb20gdGhlIGlucHV0Ci0JICogLi4uIG5lZWRlZCB0byBnZXQgYW5kIHNhdmUgdGhlIG1vZGVsLiBJdCBpcyBhIHNpbXBsZSBjbGFzcyB1dGlsaXR5LCBidXQKLQkgKiBpcyBhbiBpbnN0YW5jZSBtZXRob2Qgc28gY2FuIGJlIGFjY2Vzc2VkIHZpYSBpbnRlcmZhY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBjYWxjdWxhdGVJZChJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGNhbGN1bGF0ZVR5cGUoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gSU1vZGVsTWFuYWdlciBtbSA9ICgoTW9kZWxNYW5hZ2VyUGx1Z2luKQotCQkvLyBQbGF0Zm9ybS5nZXRQbHVnaW4oTW9kZWxNYW5hZ2VyUGx1Z2luLklEKSkuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBjZCA9IGNyLmdldEhhbmRsZXJGb3IoaUZpbGUpOwotCQlyZXR1cm4gY2Q7Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxIYW5kbGVyIGNhbGN1bGF0ZVR5cGUoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJTW9kZWxIYW5kbGVyUmVnaXN0cnkgY3IgPSBnZXRNb2RlbEhhbmRsZXJSZWdpc3RyeSgpOwotCQlJTW9kZWxIYW5kbGVyIGNkID0gY3IuZ2V0SGFuZGxlckZvcihmaWxlbmFtZSwgaW5wdXRTdHJlYW0pOwotCQlyZXR1cm4gY2Q7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBVUklSZXNvbHZlciBjYWxjdWxhdGVVUklSZXNvbHZlcihJRmlsZSBmaWxlKSB7Ci0JCS8vIE5vdGU6IHNlZSBjb21tZW50IGluIHBsdWdpbi54bWwgZm9yIHBvdGVudGlhbGx5Ci0JCS8vIGJyZWFraW5nIGNoYW5nZSBpbiBiZWhhdmlvci4KLQotCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCVVSSVJlc29sdmVyIHJlc29sdmVyID0gKFVSSVJlc29sdmVyKSBwcm9qZWN0LmdldEFkYXB0ZXIoVVJJUmVzb2x2ZXIuY2xhc3MpOwotCQlpZiAocmVzb2x2ZXIgPT0gbnVsbCkKLQkJCXJlc29sdmVyID0gbmV3IFByb2plY3RSZXNvbHZlcihwcm9qZWN0KTsKLQkJcmVzb2x2ZXIuc2V0RmlsZUJhc2VMb2NhdGlvbihmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JCXJldHVybiByZXNvbHZlcjsKLQl9Ci0KLQkvKgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIGFwcGVhcnMgaW4gYm90aCBNb2RlbE1hbmFnZXJJbXBsIGFuZCBKU0VkaXRvciAod2l0aAotCSAqIGp1c3QgYSBtaW5vciBkaWZmZXJlbmNlKS4gVGhleSBzaG91bGQgYmUga2VwdCB0aGUgc2FtZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIGhhbmRsZWQgYnkgcGxhdGZvcm0KLQkgKi8KLQlwcml2YXRlIHZvaWQgY29udmVydExpbmVEZWxpbWl0ZXJzKElEb2N1bWVudCBkb2N1bWVudCwgSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJLy8gTm90ZTogY2FsY3VsYXRlVHlwZShpRmlsZSkgcmV0dXJucyBhIGRlZmF1bHQgeG1sIG1vZGVsIGhhbmRsZXIgaWYKLQkJLy8gY29udGVudCB0eXBlIGlzIG51bGwuCi0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gY2FsY3VsYXRlVHlwZShpRmlsZSkuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQkJU3RyaW5nIGVuZE9mTGluZUNvZGUgPSBDb250ZW50QmFzZWRQcmVmZXJlbmNlR2F0ZXdheS5nZXRQcmVmZXJlbmNlc1N0cmluZyhjb250ZW50VHlwZUlkLCBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5FTkRfT0ZfTElORV9DT0RFKTsKLQkJLy8gZW5kT2ZMaW5lQ29kZSA9PSBudWxsIG1lYW5zIHRoZSBjb250ZW50IHR5cGUgZG9lcyBub3Qgc3VwcG9ydCB0aGlzCi0JCS8vIGZ1bmN0aW9uIChlLmcuIERURCkKLQkJLy8gZW5kT2ZMaW5lQ29kZSA9PSAiIiBtZWFucyBubyB0cmFuc2xhdGlvbgotCQlpZiAoZW5kT2ZMaW5lQ29kZSAhPSBudWxsICYmIGVuZE9mTGluZUNvZGUubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlclRvVXNlID0gU3lzdGVtLmdldFByb3BlcnR5KCJsaW5lLnNlcGFyYXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoZW5kT2ZMaW5lQ29kZS5lcXVhbHMoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpKQotCQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlNUUklOR19DUjsKLQkJCWVsc2UgaWYgKGVuZE9mTGluZUNvZGUuZXF1YWxzKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkxGKSkKLQkJCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfTEY7Ci0JCQllbHNlIGlmIChlbmRPZkxpbmVDb2RlLmVxdWFscyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5DUkxGKSkKLQkJCQlsaW5lRGVsaW1pdGVyVG9Vc2UgPSBDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5TVFJJTkdfQ1JMRjsKLQotCQkJVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCQlpbnQgbGluZUNvdW50ID0gZG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQkJdHJ5IHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCWludCBsaW5lU3RhcnRPZmZzZXQgPSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCQkJaW50IGxpbmVMZW5ndGggPSBsaW5lSW5mby5nZXRMZW5ndGgoKTsKLQkJCQkJaW50IGxpbmVFbmRPZmZzZXQgPSBsaW5lU3RhcnRPZmZzZXQgKyBsaW5lTGVuZ3RoOwotCi0JCQkJCWlmIChpIDwgbGluZUNvdW50IC0gMSkgewotCQkJCQkJU3RyaW5nIGN1cnJlbnRMaW5lRGVsaW1pdGVyID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKTsKLQkJCQkJCWlmIChjdXJyZW50TGluZURlbGltaXRlciAhPSBudWxsICYmIGN1cnJlbnRMaW5lRGVsaW1pdGVyLmNvbXBhcmVUbyhsaW5lRGVsaW1pdGVyVG9Vc2UpICE9IDApCi0JCQkJCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgUmVwbGFjZUVkaXQobGluZUVuZE9mZnNldCwgY3VycmVudExpbmVEZWxpbWl0ZXIubGVuZ3RoKCksIGxpbmVEZWxpbWl0ZXJUb1VzZSkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKG11bHRpVGV4dEVkaXQuZ2V0Q2hpbGRyZW5TaXplKCkgPiAwKQotCQkJCQltdWx0aVRleHRFZGl0LmFwcGx5KGRvY3VtZW50KTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkvLyBqdXN0IGFkZGluZyBnZW5lcmljIHJ1bnRpbWUgaGVyZSwgdW50aWwgd2hvbGUgbWV0aG9kCi0JCQkJLy8gZGVsZXRlZC4KLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHRoaXMgdXNlZCB0byBiZSBpbiBsb2FkZXIsIGJ1dCBoYXMgYmVlbiBtb3ZlZCBoZXJlCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGNvcHkoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgU3RyaW5nIG5ld0lkKSB0aHJvd3MgUmVzb3VyY2VJblVzZSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwgPSBudWxsOwotCQlJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsID0gbW9kZWw7Ci0JCUlNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyID0gb2xkTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCUlNb2RlbExvYWRlciBsb2FkZXIgPSBtb2RlbEhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJLy8gbmV3TW9kZWwgPSBsb2FkZXIubmV3TW9kZWwoKTsKLQkJbmV3TW9kZWwgPSBsb2FkZXIuY3JlYXRlTW9kZWwob2xkTW9kZWwpOwotCQkvLyBuZXdJZCwgb2xkTW9kZWwuZ2V0UmVzb2x2ZXIoKSwgb2xkTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkpOwotCQluZXdNb2RlbC5zZXRNb2RlbEhhbmRsZXIobW9kZWxIYW5kbGVyKTsKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPQotCQkvLyBvbGRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgPQotCQkvLyBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQubmV3SW5zdGFuY2UoKTsKLQkJLy8gbmV3TW9kZWwuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld1N0cnVjdHVyZWREb2N1bWVudCk7Ci0JCW5ld01vZGVsLnNldFJlc29sdmVyKG9sZE1vZGVsLmdldFJlc29sdmVyKCkpOwotCQluZXdNb2RlbC5zZXRNb2RlbE1hbmFnZXIob2xkTW9kZWwuZ2V0TW9kZWxNYW5hZ2VyKCkpOwotCQkvLyBkdXBsaWNhdGVGYWN0b3J5UmVnaXN0cnkobmV3TW9kZWwsIG9sZE1vZGVsKTsKLQkJbmV3TW9kZWwuc2V0SWQobmV3SWQpOwotCQkvLyBzZXQgdGV4dCBvZiBuZXcgb25lIGFmdGVyIGFsbCBpbml0aWFsaXphdGlvbiBpcyBkb25lCi0JCVN0cmluZyBjb250ZW50cyA9IG9sZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFRleHQoKTsKLQkJbmV3TW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuc2V0VGV4dCh0aGlzLCBjb250ZW50cyk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgY29weU1vZGVsRm9yRWRpdChTdHJpbmcgb2xkSWQsIFN0cmluZyBuZXdJZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UgewotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbnVsbDsKLQkJLy8gZ2V0IHRoZSBleGlzdGluZyBtb2RlbCBhc3NvY2lhdGVkIHdpdGggdGhpcyBpZAotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZ2V0RXhpc3RpbmdNb2RlbChvbGRJZCk7Ci0JCS8vIGlmIGl0IGRvZXNuJ3QgZXhpc3QsIGlnbm9yZSByZXF1ZXN0ICh0aG91Z2ggdGhpcyB3b3VsZCBub3JtYWxseQotCQkvLyBiZSBhIHByb2dyYW1taW5nIGVycm9yLgotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBub3cgYmUgc3VyZSBuZXdNb2RlbCBkb2VzIG5vdCBleGlzdAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChuZXdJZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IFJlc291cmNlSW5Vc2UoKTsKLQkJfQotCQkvLyBnZXQgbG9hZGVyIGJhc2VkIG9uIGV4aXN0aW5nIHR5cGUgKG5vdGUgdGhlIHR5cGUgYXNzdW1wdGlvbikKLQkJLy8gT2JqZWN0IHR5cGUgPSAoKElTdHJ1Y3R1cmVkTW9kZWwpIG1vZGVsKS5nZXRUeXBlKCk7Ci0JCS8vIElNb2RlbEhhbmRsZXIgdHlwZSA9IG1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQkvLyBJTW9kZWxMb2FkZXIgbG9hZGVyID0gKElNb2RlbExvYWRlcikgZ2V0TW9kZWxMb2FkZXJzKCkuZ2V0KHR5cGUpOwotCQkvLyBJTW9kZWxMb2FkZXIgbG9hZGVyID0gKElNb2RlbExvYWRlcikgZ2V0TW9kZWxMb2FkZXJzKCkuZ2V0KHR5cGUpOwotCQkvLyBhc2sgdGhlIGxvYWRlciB0byBjb3B5Ci0JCW5ld01vZGVsID0gY29weShtb2RlbCwgbmV3SWQpOwotCQlpZiAobmV3TW9kZWwgIT0gbnVsbCkgewotCQkJLy8gYWRkIHRvIG91ciBjYWNoZQotCQkJc2hhcmVkT2JqZWN0ID0gbmV3IFNoYXJlZE9iamVjdChuZXdNb2RlbCk7Ci0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID0gMTsKLQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQobmV3SWQsIHNoYXJlZE9iamVjdCk7Ci0JCQl0cmFjZSgiY29waWVkIG1vZGVsIiwgbmV3SWQsIHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG5ld01vZGVsOwotCX0KLQotCS8qKgotCSAqIFNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGUgbmV3IGluc3RhbmNlIGhhcyBubyBjb250ZW50LiBOb3RlOiB0aGlzCi0JICogcHJvZHVjZXMgYW4gdW5tYW5hZ2VkIG1vZGVsLCBmb3IgdGVtcG9yYXJ5IHVzZS4gSWYgYSB0cnVlIHNoYXJlZCBtb2RlbAotCSAqIGlzIGRlc2lyZWQsIHVzZSAiY29weSIuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU5ld0luc3RhbmNlKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG9sZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsID0gbG9hZGVyLmNyZWF0ZU1vZGVsKG9sZE1vZGVsKTsKLQkJbmV3TW9kZWwuc2V0TW9kZWxIYW5kbGVyKGhhbmRsZXIpOwotCQlpZiAobmV3TW9kZWwgaW5zdGFuY2VvZiBBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgewotCQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgbmV3TW9kZWwpLnNldENvbnRlbnRUeXBlSWRlbnRpZmllcihvbGRNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCX0KLQkJVVJJUmVzb2x2ZXIgb2xkUmVzb2x2ZXIgPSBvbGRNb2RlbC5nZXRSZXNvbHZlcigpOwotCQluZXdNb2RlbC5zZXRSZXNvbHZlcihvbGRSZXNvbHZlcik7Ci0JCXRyeSB7Ci0JCQluZXdNb2RlbC5zZXRJZChEVVBMSUNBVEVEX01PREVMKTsKLQkJfQotCQljYXRjaCAoUmVzb3VyY2VJblVzZSBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlLCBzaW5jZSB0aGlzIGlzIGFuIHVubWFuYWdlZCBtb2RlbAotCQl9Ci0JCS8vIGJhc2UgbG9jYXRpb24gc2hvdWxkIGJlIG51bGwsIGJ1dCB3ZSdsbCBzZXQgdG8KLQkJLy8gbnVsbCB0byBiZSBzdXJlLgotCQluZXdNb2RlbC5zZXRCYXNlTG9jYXRpb24obnVsbCk7Ci0JCXJldHVybiBuZXdNb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGl0cyBhc3N1bWUgdGhhdCBJRmlsZSBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBhcwotCSAqIGEgcmVzb3VyY2UgeWV0LiBJZiBpdCBkb2VzLCBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiB0aGUgcmVzb3VyY2UgZG9lcyBhbHJlYWR5IGV4aXN0LCB0aGVuIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvciBpcwotCSAqIHRoZSByaWdodCBBUEkgdG8gdXNlLgotCSAqIAotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZQotCSAqIAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQkJaWYgKGlGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKGlGaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJfQotCQkvLyBXaWxsIHJlY29uc2lkZXIgaW4gZnV0dXJlIHZlcnNpb24KLQkJLy8gU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQkvLyBpZiAoaXNSZXNvdXJjZUluVXNlKGlkKSkgewotCQkvLyB0aHJvdyBuZXcgUmVzb3VyY2VJblVzZShpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCS8vIH0KLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCS8vIGZvciB0aGlzIEFQSSwgImNyZWF0ZU5ldyIgd2UgYXNzdW1lIHRoZSBJRmlsZSBkb2VzIG5vdCBleGlzdCB5ZXQKLQkJLy8gYXMgY2hlY2tlZCBhYm92ZSwgc28ganVzdCBjcmVhdGUgZW1wdHkgZG9jdW1lbnQuCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGNsaWVudHMgc2hvdWxkIHZlcmlmeSBJRmlsZSBleGlzdHMgYmVmb3JlIHVzaW5nCi0JICogdGhpcyBtZXRob2QuIElmIHRoaXMgSUZpbGUgZG9lcyBub3QgZXhpc3QsIHRoZW4KLQkgKiBjcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgdGhlIGNvcnJlY3QgQVBJIHRvIHVzZS4KLQkgKiAKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlpZiAoIWlGaWxlLmV4aXN0cygpKSB7Ci0JCQl0aHJvdyBuZXcgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKGlGaWxlLmdldEZ1bGxQYXRoKCkudG9PU1N0cmluZygpKTsKLQkJfQotCQkvLyBXaWxsIHJlY29uc2lkZXIgaW4gZnV0dXJlIHZlcnNpb24KLQkJLy8gU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQkvLyBpZiAoaXNSZXNvdXJjZUluVXNlKGlkKSkgewotCQkvLyB0aHJvdyBuZXcgUmVzb3VyY2VJblVzZShpRmlsZS5nZXRGdWxsUGF0aCgpLnRvT1NTdHJpbmcoKSk7Ci0JCS8vIH0KLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoaUZpbGUpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhCi0JICogcHJvcGVyIHBhcnNlciBhc3NpZ25lZC4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGFuIGVtcHR5Ci0JICogc3RydWN0dXJlZERvY3VtZW50IGlzIG5lZWRlZC4gT3RoZXJ3aXNlLCB1c2UgSUZpbGUgZm9ybS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIFRPRE86IHRvIGJlIHJlbW92ZWQgYnkgQzQgZG8gd2UgcmVhbGx5IG5lZWQgdGhpcz8gSQotCSAqICAgICAgICAgICAgIHJlY29tbWVuZCB0byAtIHVzZSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoZmlsZW5hbWUsCi0JICogICAgICAgICAgICAgbnVsbCwgbnVsbCkgLSB0aGUgZmlsZW5hbWUgZG9lcyBub3QgbmVlZCB0byByZXByZXNlbnQgYQotCSAqICAgICAgICAgICAgIHJlYWwgLSBmaWxlLCBidXQgY2FuIHRha2UgZm9yIGZvcm0gb2YgZHVtbXkuanNwLCB0ZXN0LnhtbCwKLQkgKiAgICAgICAgICAgICBldGMuIC0gVGhhdCB3YXkgd2UgZG9uJ3QgaGFyZCBjb2RlIHRoZSBoYW5kbGVyLCBidXQgc3BlY2lmeQotCSAqICAgICAgICAgICAgIHdlIC0gd2FudCB0aGUgaGFuZGxlciB0aGF0ICJnb2VzIHdpdGgiIGEgY2VydGFpbiB0eXBlIG9mIC0KLQkgKiAgICAgICAgICAgICBmaWxlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCU1vZGVsSGFuZGxlclJlZ2lzdHJ5IGNyID0gZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY3IuZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlSWQoY29udGVudFR5cGVJZCk7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIlByb2dyYW0gZXJyb3I6IG5vIG1vZGVsIGhhbmRsZXIgZm91bmQgZm9yICIgKyBjb250ZW50VHlwZUlkKTsgLy8kTk9OLU5MUy0xJAotCQlsb2FkZXIgPSBoYW5kbGVyLmdldERvY3VtZW50TG9hZGVyKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuCi0JICogCi0JICogQGRlcHJlY2F0ZWQgLS0gLSBUT0RPOiB0byBiZSByZW1vdmVkIGJ5IEM0IEkgbWFya2VkIGFzIGRlcHJlY2F0ZWQgdG8KLQkgKiAgICAgICAgICAgICBkaXNjb3VhZ2UgdXNlIG9mIHRoaXMgbWV0aG9kLiBJdCBkb2VzIG5vdCByZWFsbHkgd29yayBmb3IKLQkgKiAgICAgICAgICAgICBKU1AgZnJhZ21lbnRzLCBzaW5jZSBKU1AgRnJhZ21lbnRzIG5lZWQgYW4gSUZpbGUgdG8KLQkgKiAgICAgICAgICAgICBjb3JyZWN0bHkgbG9vayB1cCB0aGUgY29udGVudCBzZXR0aW5ncy4gVXNlIElGaWxlIGZvcm0KLQkgKiAgICAgICAgICAgICBpbnN0ZWFkLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG51bGw7Ci0JCUlucHV0U3RyZWFtIGlzdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0JCWlmIChpc3RyZWFtICE9IG51bGwpIHsKLQkJCWlzdHJlYW0ucmVzZXQoKTsKLQkJfQotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGZpbGVuYW1lLCBpc3RyZWFtKTsKLQkJbG9hZGVyID0gaGFuZGxlci5nZXREb2N1bWVudExvYWRlcigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChpbnB1dFN0cmVhbSA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoZmlsZW5hbWUsIGlzdHJlYW0pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogU3BlY2lhbCBjYXNlIG1ldGhvZC4gVGhpcyBtZXRob2Qgd2FzIGNyZWF0ZWQgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugd2hlcmUKLQkgKiB0aGVyZSBpcyBhbiBlbmNvZGluZyBmb3IgaW5wdXQgc3RyZWFtIHRoYXQgc2hvdWxkIG92ZXJyaWRlIGFsbCB0aGUKLQkgKiBub3JtYWwgcnVsZXMgZm9yIGVuY29kaW5nLiBGb3IgZXhhbXBsZSwgaWYgdGhlcmUgaXMgYW4gZW5jb2RpbmcKLQkgKiAoY2hhcnNldCkgc3BlY2lmaWVkIGluIEhUVFAgcmVzcG9uc2UgaGVhZGVyLCB0aGVuIHRoYXQgZW5jb2RpbmcgaXMgdXNlZAotCSAqIHRvIHRyYW5zbGF0ZSB0aGUgaW5wdXQgc3RyZWFtIHRvIGEgc3RyaW5nLCBidXQgdGhlbiB0aGUgbm9ybWFsIGVuY29kaW5nCi0JICogcnVsZXMgYXJlIGlnbm9yZWQsIHNvIHRoYXQgdGhlIHN0cmluZyBpcyBub3QgdHJhbnNsYXRlZCB0d2ljZSAoZm9yCi0JICogZXhhbXBsZSwgaWYgaXRzIGFuIEhUTUwgImZpbGUiLCB0aGVuIGV2ZW4gaWYgaXQgY29udGFpbnMgYSBjaGFyc2V0IGluCi0JICogbWV0YSB0YWcsIGl0cyBpZ25vcmVkIHNpbmNlIGl0cyBhc3N1bWVkIGl0cyBhbGwgY29ycmVjdGx5IGRlY29kZWQgYnkKLQkgKiB0aGUgSFRUUCBjaGFyc2V0LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIsIFN0cmluZyBlbmNvZGluZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSByZWFkSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0sIGVuY29kaW5nKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoZmlsZW5hbWUsIGNvbnRlbnQsIHJlc29sdmVyKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZW5pZW5jZSBtZXRob2QuIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHdoZW4gdGhlIHJlc291cmNlIGRvZXMgbm90Ci0JICogcmVhbGx5IGV4aXN0IChlLmcuIHdoZW4gY29udGVudCBpcyBiZWluZyBjcmVhdGVkLCBidXQgaGFzbid0IGJlZW4KLQkgKiB3cml0dGVuIHRvIGRpc2sgeWV0KS4gTm90ZSB0aGF0IHNpbmNlIHRoZSBjb250ZW50IGlzIGJlaW5nIHByb3ZpZGVkIGFzCi0JICogYSBTdHJpbmcsIGl0IGlzIGFzc3VtZWQgdG8gYWxyZWFkeSBiZSBkZWNvZGVkIGNvcnJlY3RseSBzbyBubwotCSAqIHRyYW5zZm9ybWF0aW9uIGlzIGRvbmUuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvcihTdHJpbmcgZmlsZW5hbWUsIFN0cmluZyBjb250ZW50LCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gVE9ETzogYXZvaWQgYWxsIHRoZXNlIFN0cmluZyBpbnN0YW5jZXMKLQkJU3RyaW5nQnVmZmVyIGNvbnRlbnRCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGNvbnRlbnQpOwotCQlJRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gbnVsbDsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShmaWxlbmFtZSwgbnVsbCk7Ci0JCWxvYWRlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCByZXN1bHQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgbG9hZGVyLmNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpOwotCQlTdHJpbmdCdWZmZXIgY29udmVydGVkQ29udGVudCA9IGxvYWRlci5oYW5kbGVMaW5lRGVsaW1pdGVyKGNvbnRlbnRCdWZmZXIsIHJlc3VsdCk7Ci0JCXJlc3VsdC5zZXRFbmNvZGluZ01lbWVudG8obmV3IE51bGxNZW1lbnRvKCkpOwotCQlyZXN1bHQuc2V0VGV4dCh0aGlzLCBjb252ZXJ0ZWRDb250ZW50LnRvU3RyaW5nKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpRmlsZQotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZEVtcHR5TW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlJTW9kZWxIYW5kbGVyIGhhbmRsZXIgPSBjYWxjdWxhdGVUeXBlKGlGaWxlKTsKLQkJU3RyaW5nIGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlVUklSZXNvbHZlciByZXNvbHZlciA9IGNhbGN1bGF0ZVVSSVJlc29sdmVyKGlGaWxlKTsKLQotCQl0cnkgewotCQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlkLCBoYW5kbGVyLCByZXNvbHZlcik7Ci0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UncmUgbm90IHNoYXJpbmcKLQkJCS8vIChldmVuIGlmIGl0IHJlYWxseSBpcyBpbiB1c2UgLi4uIHdlIGRvbid0IGNhcmUpCi0JCQkvLyB0aGlzIG1heSBuZWVkIHRvIGJlIHJlLWV4YW1pbmVkLgotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vZGVsTWFuZ2VySW1wbDo6Y3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yLiBNb2RlbCB1bmV4cGVjdGVkbHkgaW4gdXNlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29udmVpZW5jZSBtZXRob2QuIEl0IGRlcGVuZHMgb24gdGhlIGxvYWRlcnMgbmV3TW9kZWwgbWV0aG9kIHRvIHJldHVybgotCSAqIGFuIGFwcHJvcHJpYXRlIFN0cnVjdXR1cmVkTW9kZWwgYXBwcm9wcmlhdGVseSBpbml0aWFsaXplZC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGNyZWF0ZVVuTWFuYWdlZEVtcHR5TW9kZWxGb3IoaUZpbGUpOwotCi0JCUlEb2N1bWVudExvYWRlciBsb2FkZXIgPSByZXN1bHQuZ2V0TW9kZWxIYW5kbGVyKCkuZ2V0RG9jdW1lbnRMb2FkZXIoKTsKLQkJSUVuY29kZWREb2N1bWVudCBkb2N1bWVudCA9IGxvYWRlci5jcmVhdGVOZXdTdHJ1Y3R1cmVkRG9jdW1lbnQoaUZpbGUpOwotCi0JCXJlc3VsdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5zZXRUZXh0KHRoaXMsIGRvY3VtZW50LmdldCgpKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlyZXR1cm4gY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSWQsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihTdHJpbmcgY29udGVudFR5cGVJZCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlNb2RlbEhhbmRsZXJSZWdpc3RyeSBjciA9IGdldE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCk7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNyLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKGNvbnRlbnRUeXBlSWQpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKFVOTUFOQUdFRF9NT0RFTCwgaGFuZGxlciwgcmVzb2x2ZXIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKFJlc291cmNlSW5Vc2UgZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2UncmUgbm90IHNoYXJpbmcKLQkJCS8vIChldmVuIGlmIGl0IHJlYWxseSBpcyBpbiB1c2UgLi4uIHdlIGRvbid0IGNhcmUpCi0JCQkvLyB0aGlzIG1heSBuZWVkIHRvIGJlIHJlLWV4YW1pbmVkLgotCQkJaWYgKExvZ2dlci5ERUJVR19NT0RFTE1BTkFHRVIpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIk1vZGVsTWFuZ2VySW1wbDo6Y3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yLiBNb2RlbCB1bmV4cGVjdGVkbHkgaW4gdXNlLiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgRW51bWVyYXRlZE1vZGVsSWRzIGdldEVudW1lcmF0ZWRNb2RlbElkcygpIHsKLQkJLy8gcmV0dXJuIG5ldyBpbnN0YW5jZSBlYWNoIHRpbWUgc28gd2lsbCAiYWN0IGxpa2UiIHByb3BlciBlbnVtZXJhdGlvbgotCQkvLyB0byBjbGllbnQKLQkJLy8gKGlmIHdlIGNhY2hlZCwgbWF5IG5vdCBiZSBhdCBiZWdpbm5pbmcpLgotCQlyZXR1cm4gbmV3IEVudW1lcmF0ZWRNb2RlbElkcyhmTWFuYWdlZE9iamVjdHMpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsKE9iamVjdCBpZCkgewotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJLy8gbGV0J3Mgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBpdCBpbiBvdXIgY2FjaGUKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkvLyBpZiBub3QsIHRoZW4gd2UnbGwgc2ltcGx5IHJldHVybiBudWxsCi0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogdXNlcnMgb2YgdGhpcyAnbW9kZWwnIG11c3Qgc3RpbGwgcmVsZWFzZSBpdCB3aGVuIGZpbmlzaGVkLgotCSAqIFJldHVybnMgbnVsbCBpZiB0aGVyZSdzIG5vdCBhIG1vZGVsIGNvcnJlc3BvbmRpbmcgdG8gZG9jdW1lbnQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCUVudW1lcmF0aW9uIGlkcyA9IGdldEVudW1lcmF0ZWRNb2RlbElkcygpOwotCQl3aGlsZSAoaWRzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQlPYmplY3QgcG90ZW50aWFsSWQgPSBpZHMubmV4dEVsZW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgdGVtcFJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWwocG90ZW50aWFsSWQpOwotCQkJaWYgKGRvY3VtZW50ID09IHRlbXBSZXN1bHQuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpIHsKLQkJCQlyZXN1bHQgPSBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChwb3RlbnRpYWxJZCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBmb3JtIC0gdGhpcyBvbmUgd2lsbCBiZWNvbWUgcHJvdGVjdGVkIG9yIHByaXZhdGUKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoT2JqZWN0IGlkKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJLy8gaWYgbm90LCB0aGVuIHdlJ2xsIHNpbXBseSByZXR1cm4gbnVsbAotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgaW4gb3VyIGNhY2hlLCB0aGVuIHNpbXBseSBpbmNyZW1lbnQgaXRzIHJlZgotCQkJLy8gY291bnQsCi0JCQkvLyBhbmQgcmV0dXJuIHRoZSBvYmplY3QuCi0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0Kys7Ci0JCQlyZXN1bHQgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCQl0cmFjZSgiZ290IGV4aXN0aW5nIG1vZGVsIGZvciBFZGl0OiAiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCXRyYWNlKCIgICBpbmNyZW1lbnRlZCByZWZlcmVuY2VDb3VudEZvckVkaXQgIiwgaWQsIHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvckVkaXQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB1c2VycyBvZiB0aGlzICdtb2RlbCcgbXVzdCBzdGlsbCByZWxlYXNlIGl0IHdoZW4gZmluaXNoZWQuCi0JICogUmV0dXJucyBudWxsIGlmIHRoZXJlJ3Mgbm90IGEgbW9kZWwgY29ycmVzcG9uZGluZyB0byBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJRW51bWVyYXRpb24gaWRzID0gZ2V0RW51bWVyYXRlZE1vZGVsSWRzKCk7Ci0JCXdoaWxlIChpZHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCU9iamVjdCBwb3RlbnRpYWxJZCA9IGlkcy5uZXh0RWxlbWVudCgpOwotCQkJSVN0cnVjdHVyZWRNb2RlbCB0ZW1wUmVzdWx0ID0gZ2V0RXhpc3RpbmdNb2RlbChwb3RlbnRpYWxJZCk7Ci0JCQlpZiAoZG9jdW1lbnQgPT0gdGVtcFJlc3VsdC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkgewotCQkJCXJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHBvdGVudGlhbElkKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRFeGlzdGluZ01vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IGlkID0gY2FsY3VsYXRlSWQoaUZpbGUpOwotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGdldE1vZGVsIG1ldGhvZCwgZXhjZXB0IHRoaXMgbWV0aG9kIGRvZXMgbm90Ci0JICogY3JlYXRlIGEgbW9kZWwuIFRoaXMgbWV0aG9kIGRvZXMgaW5jcmVtZW50IHRoZSByZWZlcmVuY2UgY291bnQgKGlmIGl0Ci0JICogZXhpc3RzKS4gSWYgdGhlIG1vZGVsIGRvZXMgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIGNhY2hlIG9mIG1vZGVscywKLQkgKiBudWxsIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBmb3JtIC0gdGhpcyBvbmUgd2lsbCBiZWNvbWUgcHJvdGVjdGVkIG9yIHByaXZhdGUKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJLy8gaWYgbm90LCB0aGVuIHdlJ2xsIHNpbXBseSByZXR1cm4gbnVsbAotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCS8vIGlmIHNoYXJlZCBvYmplY3QgaXMgaW4gb3VyIGNhY2hlLCB0aGVuIHNpbXBseSBpbmNyZW1lbnQgaXRzIHJlZgotCQkJLy8gY291bnQsCi0JCQkvLyBhbmQgcmV0dXJuIHRoZSBvYmplY3QuCi0JCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkKys7Ci0JCQlyZXN1bHQgPSBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBETVc6IFRvbSwgdGhpcyBpcyAic3BlY2lhbCIgZm9yIGxpbmtzIGJ1aWxkZXIgQXNzdW1pbmcgaXRzCi0JICogICAgICAgICAgICAgc3RpbGwgbmVlZGVkLCB3b3VsZG4ndCBpdCBiZSBiZXR0ZXIgdG8gY2hhbmdlIHRvCi0JICogICAgICAgICAgICAgZ2V0RXhpc3RpbmdNb2RlbHMoKT8gLS0gd2lsbCBiZSByZW1vdmVkLiBJdHMgbm90IHRocmVhZAotCSAqICAgICAgICAgICAgIHNhZmUgZm9yIG9uZSB0aHJlYWQgdG8gZ2V0IHRoZSBFbnVtZXJhdGlvbiwgd2hlbiB1bmRlcmx5aW5nCi0JICogICAgICAgICAgICAgZGF0YSBjb3VsZCBiZSBjaGFuZ2VkIGluIGFub3RoZXIgdGhyZWFkLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgRW51bWVyYXRpb24gZ2V0RXhpc3RpbmdNb2RlbElkcygpIHsKLQotCQlFbnVtZXJhdGlvbiByZXN1bHQgPSBnZXRFbnVtZXJhdGVkTW9kZWxJZHMoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBUT0RPOiByZXBsYWNlIChvciBzdXBwbGVtZW50KSB0aGlzIGlzIGEgIm1vZGVsIGluZm8iIGFzc29jaWF0aW9uIHRvIHRoZQotCS8vIElGaWxlIHRoYXQgY3JlYXRlZCB0aGUgbW9kZWwKLQlwcml2YXRlIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcGF0aCA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlpZiAocGF0aCA9PSBudWxsIHx8IHBhdGgubGVuZ3RoKCkgPT0gMCkgewotCQkJT2JqZWN0IGlkID0gbW9kZWwuZ2V0SWQoKTsKLQkJCWlmIChpZCA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcGF0aCA9IGlkLnRvU3RyaW5nKCk7Ci0JCX0KLQkJLy8gVE9PRE8gbmVlZHMgcmV3b3JrIGZvciBsaW5rZWQgcmVzb3VyY2VzCi0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgocGF0aCkpOwotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIHByaW1hcnkgZm9ybXMgdG8gZ2V0IGEgbWFuYWdlZCBtb2RlbAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgRURJVCwgbnVsbCwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIEVESVQsIGVuY29kaW5nUnVsZSk7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCi0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgRURJVCwgZW5jb2RpbmcsIGxpbmVEZWxpbWl0ZXIpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlyZXR1cm4gX2dldE1vZGVsRm9yKGRvY3VtZW50LCBFRElUKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgb3IgU3RyaW5nIGZvcm0KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KE9iamVjdCBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JFZGl0KHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBJRmlsZSBvciBTdHJpbmcgZm9ybQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoT2JqZWN0IGlkLCBPYmplY3QgbW9kZWxUeXBlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlciwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JFZGl0KHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KFN0cmluZyBpZCwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAoaWQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogaWQgbWF5IG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJU3RydWN0dXJlZE1vZGVsIHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpZCwgaXN0cmVhbSk7Ci0JCWlmIChoYW5kbGVyICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IF9jb21tb25DcmVhdGVNb2RlbChpc3RyZWFtLCBpZCwgaGFuZGxlciwgcmVzb2x2ZXIsIEVESVQsIG51bGwsIG51bGwpOwotCQl9Ci0JCWVsc2UgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIm5vIG1vZGVsIGhhbmRsZXIgZm91bmQgZm9yIGlkIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgcHJpbWFyeSBmb3JtcyB0byBnZXQgYSBtYW5hZ2VkIG1vZGVsCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJRmlsZSBpRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uIHsKLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIFJFQUQsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaUZpbGUsICJJRmlsZSBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIF9jb21tb25HZXRNb2RlbChpRmlsZSwgUkVBRCwgZW5jb2RpbmdSdWxlKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBfY29tbW9uR2V0TW9kZWwoaUZpbGUsIFJFQUQsIGVuY29kaW5nTmFtZSwgbGluZURlbGltaXRlcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXJldHVybiBfZ2V0TW9kZWxGb3IoZG9jdW1lbnQsIFJFQUQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlcgotCSAqIEBkZXByZWNhdGVkIHVzZSBJRmlsZSBvciBTdHJpbmcgZm9ybQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoT2JqZWN0IGlkLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3RyaW5nSWQgPSBpZC50b1N0cmluZygpOwotCQlyZXR1cm4gZ2V0TW9kZWxGb3JSZWFkKHN0cmluZ0lkLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSksIHJlc29sdmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElNb2RlbE1hbmFnZXIKLQkgKiBAZGVwcmVjYXRlZCB1c2UgSUZpbGUgZm9ybQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoT2JqZWN0IGlkLCBPYmplY3QgbW9kZWxUeXBlLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlciwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHN0cmluZ0lkID0gaWQudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGdldE1vZGVsRm9yUmVhZChzdHJpbmdJZCwgVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCByZXNvbHZlcik7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChTdHJpbmcgaWQsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJSW5wdXRTdHJlYW0gaXN0cmVhbSA9IFV0aWxpdGllcy5nZXRNYXJrU3VwcG9ydGVkU3RyZWFtKGlucHV0U3RyZWFtKTsKLQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gY2FsY3VsYXRlVHlwZShpZCwgaXN0cmVhbSk7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gX2NvbW1vbkNyZWF0ZU1vZGVsKGlzdHJlYW0sIGlkLCBoYW5kbGVyLCByZXNvbHZlciwgUkVBRCwgbnVsbCwgbnVsbCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSBvbmx5IHRlbXBvcmFyaWx5IHZpc2libGUKLQkgKi8KLQlwdWJsaWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0TW9kZWxIYW5kbGVyUmVnaXN0cnkoKSB7Ci0JCWlmIChmTW9kZWxIYW5kbGVyUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJZk1vZGVsSGFuZGxlclJlZ2lzdHJ5ID0gTW9kZWxIYW5kbGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQlyZXR1cm4gZk1vZGVsSGFuZGxlclJlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBJU3RydWN0dXJlZE1vZGVsIGdldE5ld01vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgYm9vbGVhbiBmb3JjZSkgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQlBc3NlcnQuaXNOb3ROdWxsKGlGaWxlLCAiSUZpbGUgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBfY29tbW9uTmV3TW9kZWwoaUZpbGUsIGZvcmNlKTsKLQkJc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9IDE7Ci0JCXJldHVybiBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJTW9kZWxNYW5hZ2VyI2dldE5ld01vZGVsRm9yUmVhZChJRmlsZSwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TmV3TW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlLCBib29sZWFuIGZvcmNlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBSZXNvdXJjZUluVXNlLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJQXNzZXJ0LmlzTm90TnVsbChpRmlsZSwgIklGaWxlIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gX2NvbW1vbk5ld01vZGVsKGlGaWxlLCBmb3JjZSk7Ci0JCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgPSAxOwotCQlyZXR1cm4gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFJlZmVyZW5jZUNvdW50KE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCWludCBjb3VudCA9IDA7Ci0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKQotCQkJY291bnQgPSBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkICsgc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkKLQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yUmVhZChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkKLQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZDsKLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVDb252ZXJ0TGluZURlbGltaXRlcnMoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlLCBFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiwgTWFsZm9ybWVkT3V0cHV0RXhjZXB0aW9uV2l0aERldGFpbCwgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpID4gMSkgewotCQkJY29udmVydExpbmVEZWxpbWl0ZXJzKHN0cnVjdHVyZWREb2N1bWVudCwgaUZpbGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVByb2dyYW1FcnJvcihUaHJvd2FibGUgdCkgewotCi0JCUxvZ2dlci5sb2dFeGNlcHRpb24oIkltcG9zc2libGUgUHJvZ3JhbSBFcnJvciIsIHQpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNTaGFyZWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpCi0JCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQgKyBzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0OwotCQlyZXN1bHQgPSBjb3VudCA+IDE7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBib29sZWFuIGlzU2hhcmVkRm9yRWRpdChPYmplY3QgaWQpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChpZCwgImlkIHBhcmFtZXRlciBjYW4gbm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgY291bnQgPSAwOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgIT0gbnVsbCkKLQkJCWNvdW50ID0gc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdDsKLQkJcmVzdWx0ID0gY291bnQgPiAxOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoT2JqZWN0IGlkKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaWQsICJpZCBwYXJhbWV0ZXIgY2FuIG5vdCBiZSBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGNvdW50ID0gMDsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpCi0JCQljb3VudCA9IHNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQ7Ci0JCXJlc3VsdCA9IGNvdW50ID4gMTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHRvIGRldGVybWluZSBpZiB0aGUgbW9kZWwgbWFuYWdlciBpcyB3aXRoaW4gYQotCSAqICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1N0YXRlQ2hhbmdpbmcoKSB7Ci0KLQkJcmV0dXJuIG1vZGVsTWFuYWdlclN0YXRlQ2hhbmdpbmcgPiAwOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNoYW5nZXMgdGhlIGlkIG9mIHRoZSBtb2RlbC4gVE9ETzogdHJ5IHRvIHJlZmluZSB0aGUgZGVzaWduCi0JICogbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1vdmVNb2RlbChPYmplY3Qgb2xkSWQsIE9iamVjdCBuZXdJZCkgewotCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQuaXNOb3ROdWxsKG9sZElkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KG9sZElkKTsKLQkJLy8gaWYgbm90IGZvdW5kIGluIGNhY2hlLCBpZ25vcmUgcmVxdWVzdC4KLQkJLy8gdGhpcyB3b3VsZCBub3JtYWxseSBiZSBhIHByb2dyYW0gZXJyb3IKLQkJaWYgKHNoYXJlZE9iamVjdCAhPSBudWxsKSB7Ci0JCQlmTWFuYWdlZE9iamVjdHMucmVtb3ZlKG9sZElkKTsKLQkJCWZNYW5hZ2VkT2JqZWN0cy5wdXQobmV3SWQsIHNoYXJlZE9iamVjdCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyByZWFkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFN0cmluZyBpYW5hRW5jb2RpbmdOYW1lKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZyBhbGxUZXh0ID0gbnVsbDsKLQkJaWYgKChpYW5hRW5jb2RpbmdOYW1lICE9IG51bGwpICYmIChpYW5hRW5jb2RpbmdOYW1lLmxlbmd0aCgpICE9IDApKSB7Ci0JCQlTdHJpbmcgZW5jID0gQ29kZWRJTy5nZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KGlhbmFFbmNvZGluZ05hbWUpOwotCQkJaWYgKGVuYyA9PSBudWxsKSB7Ci0JCQkJLy8gaWYgbm8gY29udmVyc2lvbiB3YXMgcG9zc2libGUsIGxldCdzIGFzc3VtZSB0aGF0Ci0JCQkJLy8gdGhlIGVuY29kaW5nIGlzIGFscmVhZHkgYSBqYXZhIGVuY29kaW5nIG5hbWUsIHNvIHdlJ2xsCi0JCQkJLy8gcHJvY2VlZCB3aXRoIHRoYXQgYXNzdW1wdGlvbi4gVGhpcyBpcyB0aGUgY2FzZSwgZm9yCi0JCQkJLy8gZXhhbXBsZSwKLQkJCQkvLyBmb3IgdGhlIHJlbG9hZCgpIHByb2NlZHVyZS4KLQkJCQkvLyBJZiBpbiBmYWN0IGl0IGlzIG5vdCBhIHZhbGlkIGphdmEgZW5jb2RpbmcsIHRoZW4KLQkJCQkvLyB0aGUgImFsbFRleHQ9IiBsaW5lIHdpbGwgY2F1c2UgYW4KLQkJCQkvLyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JCQkJZW5jID0gaWFuYUVuY29kaW5nTmFtZTsKLQkJCX0KLQkJCWFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtLCBlbmMpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHdlIG5vcm1hbGx5IGFzc3VtZSBlbmNvZGluZyBpcyBwcm92aWRlZCBmb3IgdGhpcyBtZXRob2QsIGJ1dCBpZgotCQkJLy8gbm90LAotCQkJLy8gd2UnbGwgdXNlIHBsYXRmb3JtIGRlZmF1bHQKLQkJCWFsbFRleHQgPSByZWFkSW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKSk7Ci0JCX0KLQkJcmV0dXJuIGFsbFRleHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgcmVhZElucHV0U3RyZWFtKElucHV0U3RyZWFtUmVhZGVyIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWludCBudW1SZWFkID0gMDsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJY2hhciB0QnVmZltdID0gbmV3IGNoYXJbUkVBRF9CVUZGRVJfU0laRV07Ci0JCXdoaWxlICgobnVtUmVhZCA9IGlucHV0U3RyZWFtLnJlYWQodEJ1ZmYsIDAsIHRCdWZmLmxlbmd0aCkpICE9IC0xKSB7Ci0JCQlidWZmZXIuYXBwZW5kKHRCdWZmLCAwLCBudW1SZWFkKTsKLQkJfQotCQkvLyByZW1lbWJlciAtLSB3ZSBkaWRuJ3Qgb3BlbiBzdHJlYW0gLi4uIHNvIHdlIGRvbid0IGNsb3NlIGl0Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSU1vZGVsTWFuYWdlciNyZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIElTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQotCQkvLyBnZXRIYW5kbGVyIChhc3N1bWUgaXRzIHRoZSAibmV3IG9uZSIpCi0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQkvLyBnZXRMb2FkZXIgZm9yIHRoYXQgbmV3IG9uZQotCQlJTW9kZWxMb2FkZXIgbG9hZGVyID0gaGFuZGxlci5nZXRNb2RlbExvYWRlcigpOwotCQkvLyBhc2sgaXQgdG8gcmVpbml0aWFsaXplCi0JCW1vZGVsID0gbG9hZGVyLnJlaW5pdGlhbGl6ZShtb2RlbCk7Ci0JCS8vIHRoZSBsb2FkZXIgc2hvdWxkIGNoZWNrIHRvIHNlZSBpZiB0aGUgb25lIGl0IHJlY2VpdmVkCi0JCS8vIGlzIHRoZSBzYW1lIHR5cGUgaXQgd291bGQgbm9ybWFsbHkgY3JlYXRlLgotCQkvLyBpZiBub3QsIGl0IG11c3QgInN0YXJ0IGZyb20gc2NyYXRjaCIgYW5kIGNyZWF0ZSBhIHdob2xlCi0JCS8vIG5ldyBvbmUuCi0JCS8vIGlmIGl0IGlzIG9mIHRoZSBzYW1lIHR5cGUsIGl0IHNob3VsZCBqdXN0ICdyZXBsYWNlIHRleHQnCi0JCS8vIHJlcGxhY2luZyBhbGwgdGhlIGV4aXN0aW5nIHRleHQgd2l0aCB0aGUgbmV3IHRleHQuCi0JCS8vIHRoZSBpbXBvcnRhbnQgb25lIGlzIHRoZSBKU1AgbG9hZGVyIC4uLiBpdCBzaG91bGQgZ28gdGhyb3VnaAotCQkvLyBpdHMgZW1iZWRkZWQgY29udGVudCBjaGVja2luZyBhbmQgaW5pdGlhbGl6YXRpb24KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXN5bmNocm9uaXplZCB2b2lkIHJlbGVhc2VGcm9tRWRpdChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlPYmplY3QgaWQgPSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SWQoKTsKLQkJaWYgKGlkLmVxdWFscyhVTk1BTkFHRURfTU9ERUwpIHx8IGlkLmVxdWFscyhEVVBMSUNBVEVEX01PREVMKSkgewotCQkJY2xlYW51cERpc2NhcmRlZE1vZGVsKHN0cnVjdHVyZWRNb2RlbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZWxlYXNlRnJvbUVkaXQoaWQpOwotCQl9Ci0KLQl9Ci0JCi0Jc3luY2hyb25pemVkIHZvaWQgcmVsZWFzZUZyb21SZWFkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCU9iamVjdCBpZCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRJZCgpOwotCQlpZiAoaWQuZXF1YWxzKFVOTUFOQUdFRF9NT0RFTCkgfHwgaWQuZXF1YWxzKERVUExJQ0FURURfTU9ERUwpKSB7Ci0JCQljbGVhbnVwRGlzY2FyZGVkTW9kZWwoc3RydWN0dXJlZE1vZGVsKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlbGVhc2VGcm9tUmVhZChpZCk7Ci0JCX0KLQotCX0KLQkvKioKLQkgKiBkZWZhdWx0IGZvciB1c2UgaW4gc2FtZSBwYWNrYWdlLCBub3Qgc3ViY2xhc3NlcwotCSAqIAotCSAqLwotCXN5bmNocm9uaXplZCBwcml2YXRlIHZvaWQgcmVsZWFzZUZyb21FZGl0KE9iamVjdCBpZCkgewotCQkvLyBJU1NVRTogbWFueSBvZiB0aGVzZSBhc3NlcnRzIHNob3VsZCBiZSBjaGFuZ2VkIHRvICJsb2dzIgotCQkvLyBhbmQgY29udGludWUgdG8gbGltcCBhbG9uZz8KLQotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCi0JCS8vIElTU1VFOiBoZXJlIHdlIG5lZWQgYmV0dGVyICJzcGVjIiB3aGF0IHRvIGRvIHdpdGgKLQkJLy8gdW5tYW5hZ2VkIG9yIGR1cGxpY2F0ZWQgbW9kZWxzLiBSZWxlYXNlIHN0aWxsIG5lZWRzCi0JCS8vIHRvIGJlIGNhbGxlZCBvbiB0aGVtLCBmb3Igbm93LCBidXQgdGhlIG1vZGVsIG1hbmFnZXIKLQkJLy8gZG9lc24ndCBuZWVkIHRvIGRvIGFueXRoaW5nLgotCQlpZiAoaWQuZXF1YWxzKFVOTUFOQUdFRF9NT0RFTCkgfHwgaWQuZXF1YWxzKERVUExJQ0FURURfTU9ERUwpKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJZHMgb2YgVU5NQU5BR0VEX01PREVMIG9yIERVUExJQ0FURURfTU9ERUwgYXJlIGlsbGVnYWwgaGVyZSIpOwotCQl9Ci0JCWVsc2UgewotCQkJc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKHNoYXJlZE9iamVjdCwgInJlbGVhc2Ugd2FzIHJlcXVlc3RlZCBvbiBhIG1vZGVsIHRoYXQgd2FzIG5vdCBiZWluZyBtYW5hZ2VkIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCQlzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0LS07Ci0JCQkJaWYgKChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JSZWFkID09IDApICYmIChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID09IDApKSB7Ci0JCQkJCWRpc2NhcmRNb2RlbChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCQl9Ci0JCQkJLy8gaWYgZWRpdCBnb2VzIHRvIHplcm8sIGJ1dCBzdGlsbCBvcGVuIGZvciByZWFkLAotCQkJCS8vIHRoZW4gd2Ugc2hvdWxkIHJlbG9hZCBoZXJlLCBzbyB3ZSBhcmUgaW4gc3luY2ggd2l0aAotCQkJCS8vIGNvbnRlbnRzIG9uIGRpc2suCi0JCQkJLy8gSVNTVUU6IHNob3VsZCB3ZSBjaGVjayBpc0RpcnR5IGhlcmU/Ci0JCQkJLy8gQU5TV0VSOiBoZXJlLCBmb3Igbm93IG5vdy4gbW9kZWwgc3RpbGwgaGFzIGl0cyBvd24gZGlydHkKLQkJCQkvLyBmbGFnIGZvciBzb21lIHJlYXNvbi4KLQkJCQkvLyB3ZSBuZWVkIHRvIGFkZHJlc3MgKiB0aGF0ICogdG9vLgotCQkJCWlmICgoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA+IDApICYmIChzaGFyZWRPYmplY3QucmVmZXJlbmNlQ291bnRGb3JFZGl0ID09IDApICYmIHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5pc0RpcnR5KCkpIHsKLQkJCQkJc2lnbmFsUHJlTGlmZUN5Y2xlTGlzdGVuZXJSZXZlcnQoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsKTsKLQkJCQkJcmV2ZXJ0TW9kZWwoaWQsIHNoYXJlZE9iamVjdCk7Ci0JCQkJCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXREaXJ0eVN0YXRlKGZhbHNlKTsKLQkJCQkJc2lnbmFsUG9zdExpZmVDeWNsZUxpc3RlbmVyUmV2ZXJ0KHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLy8gcHJpdmF0ZSBmb3Igbm93LCB0aG91Z2ggcHVibGljIGZvcm1zIGhhdmUgYmVlbiByZXF1ZXN0ZWQsIGluIHBhc3QuCi0JcHJpdmF0ZSB2b2lkIHJldmVydE1vZGVsKE9iamVjdCBpZCwgU2hhcmVkT2JqZWN0IHNoYXJlZE9iamVjdCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJldmVydChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaWduYWxQcmVMaWZlQ3ljbGVMaXN0ZW5lclJldmVydChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpbnQgdHlwZSA9IE1vZGVsTGlmZWN5Y2xlRXZlbnQuTU9ERUxfUkVWRVJUIHwgTW9kZWxMaWZlY3ljbGVFdmVudC5QUkVfRVZFTlQ7Ci0JCS8vIHdoYXQncyB3cm9uZyB3aXRoIHRoaXMgZGVzaWduIHRoYXQgYSBjYXN0IGlzIG5lZWRlZCBoZXJlIT8KLQkJTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCA9IG5ldyBNb2RlbExpZmVjeWNsZUV2ZW50KHN0cnVjdHVyZWRNb2RlbCwgdHlwZSk7Ci0JCSgoQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwpIHN0cnVjdHVyZWRNb2RlbCkuc2lnbmFsTGlmZWN5Y2xlRXZlbnQoZXZlbnQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzaWduYWxQb3N0TGlmZUN5Y2xlTGlzdGVuZXJSZXZlcnQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJaW50IHR5cGUgPSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1JFVkVSVCB8IE1vZGVsTGlmZWN5Y2xlRXZlbnQuUE9TVF9FVkVOVDsKLQkJLy8gd2hhdCdzIHdyb25nIHdpdGggdGhpcyBkZXNpZ24gdGhhdCBhIGNhc3QgaXMgbmVlZGVkIGhlcmUhPwotCQlNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50ID0gbmV3IE1vZGVsTGlmZWN5Y2xlRXZlbnQoc3RydWN0dXJlZE1vZGVsLCB0eXBlKTsKLQkJKChBYnN0cmFjdFN0cnVjdHVyZWRNb2RlbCkgc3RydWN0dXJlZE1vZGVsKS5zaWduYWxMaWZlY3ljbGVFdmVudChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRpc2NhcmRNb2RlbChPYmplY3QgaWQsIFNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QpIHsKLQkJZk1hbmFnZWRPYmplY3RzLnJlbW92ZShpZCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJUGxhdGZvcm0uZ2V0TG9nKFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpKS5sb2cobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VDb3JlUGx1Z2luLklELCBJU3RhdHVzLkVSUk9SLCAiQXR0ZW1wdGVkIHRvIGRpc2NhcmQgYSBzdHJ1Y3R1cmVkIG1vZGVsIGJ1dCB0aGUgdW5kZXJseWluZyBkb2N1bWVudCBoYXMgYWxyZWFkeSBiZWVuIHNldCB0byBudWxsOiAiICsgc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldEJhc2VMb2NhdGlvbigpLCBudWxsKSk7Ci0JCX0KLQotCQljbGVhbnVwRGlzY2FyZGVkTW9kZWwoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW51cERpc2NhcmRlZE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkvKgotCQkgKiBUaGlzIGNhbGwgKGFuZCBzZXR0aW5nIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnQgdG8gbnVsbCkgd2VyZQotCQkgKiBwcmV2aW91c2x5IGRvbmUgd2l0aGluIHRoZSBtb2RlbCBpdHNlbGYsIGJ1dCBmb3IgY29uY3VycmVuY3kgaXQKLQkJICogbXVzdCBiZSBkb25lIGhlcmUgZHVyaW5nIGEgc3luY2hyb25pemVkIHJlbGVhc2UuCi0JCSAqLwotCQlzdHJ1Y3R1cmVkTW9kZWwuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkucmVsZWFzZSgpOwotCi0JCS8qCi0JCSAqIEZvciBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBvcmlnaW5hdGluZyBmcm9tIGZpbGUgYnVmZmVycywgZGlzY29ubmVjdAotCQkgKiB1cyBmcm9tIHRoZSBmaWxlIGJ1ZmZlciwgbm93LgotCQkgKi8KLQkJRmlsZUJ1ZmZlck1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnJlbGVhc2VNb2RlbChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCS8qCi0JCSAqIFNldHRpbmcgdGhlIGRvY3VtZW50IHRvIG51bGwgaXMgcmVxdWlyZWQgc2luY2Ugc29tZSBzdWJjbGFzc2VzIG9mCi0JCSAqIG1vZGVsIG1pZ2h0IGhhdmUgImNsZWFudXAiIG9mIGxpc3RlbmVycywgZXRjLiwgdG8gcmVtb3ZlLCB3aGljaAotCQkgKiB3ZXJlIGluaXRpYWxpemVkIGR1cmluZyB0aGUgaW5pdGlhbCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JCSAqIAotCQkgKiBUaGUgbW9kZWwgaXRzZWxmIGluIHBhcnRpY3VsYXIgbWF5IGhhdmUgaW50ZXJuYWwgbGlzdGVuZXJzIHVzZWQgdG8KLQkJICogY29vcmRpbmF0ZSB0aGUgZG9jdW1lbnQgd2l0aCBpdHMgb3duICJzdHJ1Y3R1cmUiLgotCQkgKi8KLQkJc3RydWN0dXJlZE1vZGVsLnNldFN0cnVjdHVyZWREb2N1bWVudChudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBkZWZhdWx0IGZvciB1c2UgaW4gc2FtZSBwYWNrYWdlLCBub3Qgc3ViY2xhc3NlcwotCSAqIAotCSAqLwotCXN5bmNocm9uaXplZCBwcml2YXRlIHZvaWQgcmVsZWFzZUZyb21SZWFkKE9iamVjdCBpZCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGlkLCAiaWQgcGFyYW1ldGVyIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSBudWxsOwotCi0JCWlmIChpZC5lcXVhbHMoVU5NQU5BR0VEX01PREVMKSB8fCBpZC5lcXVhbHMoRFVQTElDQVRFRF9NT0RFTCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklkcyBvZiBVTk1BTkFHRURfTU9ERUwgb3IgRFVQTElDQVRFRF9NT0RFTCBhcmUgaWxsZWdhbCBoZXJlIik7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCXNoYXJlZE9iamVjdCA9IChTaGFyZWRPYmplY3QpIGZNYW5hZ2VkT2JqZWN0cy5nZXQoaWQpOwotCQkJQXNzZXJ0LmlzTm90TnVsbChzaGFyZWRPYmplY3QsICJyZWxlYXNlIHdhcyByZXF1ZXN0ZWQgb24gYSBtb2RlbCB0aGF0IHdhcyBub3QgYmVpbmcgbWFuYWdlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlpZiAoc2hhcmVkT2JqZWN0ICE9IG51bGwpIHsKLQkJCXNoYXJlZE9iamVjdC5yZWZlcmVuY2VDb3VudEZvclJlYWQtLTsKLQkJCWlmICgoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yUmVhZCA9PSAwKSAmJiAoc2hhcmVkT2JqZWN0LnJlZmVyZW5jZUNvdW50Rm9yRWRpdCA9PSAwKSkgewotCQkJCWRpc2NhcmRNb2RlbChpZCwgc2hhcmVkT2JqZWN0KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QgdXNlCi0JICogdGhlIGNhY2hlZCB2ZXJzaW9uLCBidXQgZm9yY2VzIHRoZSBjYWNoZWQgdmVyc2lvbiB0byBiZSByZXBsYWNlZCB3aXRoIGEKLQkgKiBmcmVzaCwgdW5jaGFuZ2VkIHZlcnNpb24uIE5vdGU6IHRoaXMgbWV0aG9kIGRvZXMgbm90IGNoYW5nZSBhbnkKLQkgKiByZWZlcmVuY2UgY291bnRzLiBBbHNvLCBpZiB0aGVyZSBpcyBub3QgYWxyZWFkeSBhIGNhY2hlZCB2ZXJzaW9uIG9mIHRoZQotCSAqIG1vZGVsLCB0aGVuIHRoaXMgY2FsbCBpcyBlc3NlbnRpYWxseSBpZ25vcmVkICh0aGF0IGlzLCBpdCBkb2VzIG5vdCBwdXQKLQkgKiBhIG1vZGVsIGluIHRoZSBjYWNoZSkgYW5kIHJldHVybnMgbnVsbC4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZCAtIHdpbGwgYmVjb21lIHByb3RlY3RlZCwgdXNlIHJlbG9hZCBkaXJlY3RseSBvbiBtb2RlbAotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgSVN0cnVjdHVyZWRNb2RlbCByZWxvYWRNb2RlbChPYmplY3QgaWQsIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotCi0JCS8vIGdldCB0aGUgZXhpc3RpbmcgbW9kZWwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaWQKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBnZXRFeGlzdGluZ01vZGVsKGlkKTsKLQkJLy8gZm9yIHRoZSBtb2RlbCB0byBiZSBudWxsIGlzIHByb2JhYmx5IGFuIGVycm9yICh0aGF0IGlzLAotCQkvLyByZWxvYWQgc2hvdWxkIG5vdCBoYXZlIGJlZW4gY2FsbGVkLCBidXQgd2UnbGwgZ3VhcmQgYWdhaW5zdAotCQkvLyBhIG51bGwgcG9pbnRlciBleGFtcGxlIGFuZCByZXR1cm4gbnVsbCBpZiB3ZSBhcmUgbm8gbG9uZ2VyIG1hbmFnaW5nCi0JCS8vIHRoYXQgbW9kZWwuCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJLy8gZ2V0IGxvYWRlciBiYXNlZCBvbiBleGlzdGluZyB0eXBlCi0JCQkvLyBkbXdUT0RPIGV2YWx1YXRlIHdoZW4gcmVsb2FkIHNob3VsZCBvY2N1cgotCQkJLy8gd2l0aCBwb3RlbnRpYWxseSBuZXcgdHlwZSAoZS5nLiBodG1sICdzYXZlIGFzJyBqc3ApLgotCQkJSU1vZGVsSGFuZGxlciBoYW5kbGVyID0gc3RydWN0dXJlZE1vZGVsLmdldE1vZGVsSGFuZGxlcigpOwotCQkJSU1vZGVsTG9hZGVyIGxvYWRlciA9IGhhbmRsZXIuZ2V0TW9kZWxMb2FkZXIoKTsKLQkJCS8vIGFzayB0aGUgbG9hZGVyIHRvIHJlLWxvYWQKLQkJCWxvYWRlci5yZWxvYWQoVXRpbGl0aWVzLmdldE1hcmtTdXBwb3J0ZWRTdHJlYW0oaW5wdXRTdHJlYW0pLCBzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJdHJhY2UoInJlLWxvYWRpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVNb2RlbChJRmlsZSBpRmlsZSwgU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCB8fCBzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlIgotCQl9Ci0JCWVsc2UgewotCQkJYm9vbGVhbiBzYXZlZCA9IGZhbHNlOwotCQkJLy8gaWYgdGhpcyBtb2RlbCB3YXMgYmFzZWQgb24gYSBGaWxlIEJ1ZmZlciBhbmQgd2UncmUgd3JpdGluZyBiYWNrCi0JCQkvLyB0byB0aGUgc2FtZSBsb2NhdGlvbiwgdXNlIHRoZSBidWZmZXIgdG8gZG8gdGhlIHdyaXRpbmcKLQkJCWlmIChGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNFeGlzdGluZ0J1ZmZlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpKSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQlJUGF0aCBmaWxlTG9jYXRpb24gPSBGaWxlQnVmZmVycy5ub3JtYWxpemVMb2NhdGlvbihpRmlsZS5nZXRGdWxsUGF0aCgpKTsKLQkJCQlpZiAoZmlsZUxvY2F0aW9uLmVxdWFscyhidWZmZXIuZ2V0TG9jYXRpb24oKSkpIHsKLQkJCQkJYnVmZmVyLmNvbW1pdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJCQkJc2F2ZWQgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWlmICghc2F2ZWQpIHsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQlzYXZlU3RydWN0dXJlZERvY3VtZW50KGRvY3VtZW50LCBpRmlsZSwgZW5jb2RpbmdSdWxlKTsKLQkJCQl0cmFjZSgic2F2aW5nIG1vZGVsIiwgaWQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2F2aW5nIHRoZSBtb2RlbCByZWFsbHkganVzdCBtZWFucyB0byBzYXZlIGl0J3Mgc3RydWN0dXJlZCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gb3V0cHV0U3RyZWFtCi0JICogQHBhcmFtIGVuY29kaW5nUnVsZQotCSAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kZWwoU3RyaW5nIGlkLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb24gewotCQkvLyBsZXQncyBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGl0IGluIG91ciBjYWNoZQotCQlTaGFyZWRPYmplY3Qgc2hhcmVkT2JqZWN0ID0gKFNoYXJlZE9iamVjdCkgZk1hbmFnZWRPYmplY3RzLmdldChpZCk7Ci0JCWlmIChzaGFyZWRPYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihTU0VDb3JlTWVzc2FnZXMuUHJvZ3JhbV9FcnJvcl9fTW9kZWxNYW5hZ2VfRVhDXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvZ3JhbSBFcnJvcjogTW9kZWxNYW5hZ2VySW1wbDo6c2F2ZU1vZGVsLiBNb2RlbCBzaG91bGQgYmUgaW4gdGhlIGNhY2hlIgotCQl9Ci0JCWVsc2UgewotCQkJLy8gaWYgdGhpcyBtb2RlbCB3YXMgYmFzZWQgb24gYSBGaWxlIEJ1ZmZlciBhbmQgd2UncmUgd3JpdGluZyBiYWNrCi0JCQkvLyB0byB0aGUgc2FtZSBsb2NhdGlvbiwgdXNlIHRoZSBidWZmZXIgdG8gZG8gdGhlIHdyaXRpbmcKLQkJCWlmIChGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuaXNFeGlzdGluZ0J1ZmZlcihzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpKSB7Ci0JCQkJSVRleHRGaWxlQnVmZmVyIGJ1ZmZlciA9IEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5nZXRCdWZmZXIoc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpKTsKLQkJCQlidWZmZXIuY29tbWl0KG5ldyBOdWxsUHJvZ3Jlc3NNb25pdG9yKCksIHRydWUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSUZpbGUgaUZpbGUgPSBnZXRGaWxlRm9yKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbCk7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbDsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJc2F2ZVN0cnVjdHVyZWREb2N1bWVudChkb2N1bWVudCwgaUZpbGUpOwotCQkJCXRyYWNlKCJzYXZpbmcgbW9kZWwiLCBpZCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0JCXNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5zZXROZXdTdGF0ZShmYWxzZSk7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB0aGlzIG1ldGhvZCBpcyBsZXNzIGVmZmljaWVudCB0aGFuIElGaWxlIGZvcm0sIHNpbmNlIGl0Ci0JICogICAgICAgICAgICAgcmVxdWlyZXMgYW4gZXh0cmEgImNvcHkiIG9mIGJ5dGUgYXJyYXksIGFuZCBzaG91bGQgYmUgYXZvaWQKLQkgKiAgICAgICAgICAgICBpbiBmYXZvciBvZiB0aGUgSUZpbGUgZm9ybS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzYXZlTW9kZWwoU3RyaW5nIGlkLCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCi0JCS8vIGxldCdzIHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgaXQgaW4gb3VyIGNhY2hlCi0JCVNoYXJlZE9iamVjdCBzaGFyZWRPYmplY3QgPSAoU2hhcmVkT2JqZWN0KSBmTWFuYWdlZE9iamVjdHMuZ2V0KGlkKTsKLQkJaWYgKHNoYXJlZE9iamVjdCA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFNTRUNvcmVNZXNzYWdlcy5Qcm9ncmFtX0Vycm9yX19Nb2RlbE1hbmFnZV9FWENfKTsgLy8kTk9OLU5MUy0xJCA9ICJQcm9ncmFtIEVycm9yOiBNb2RlbE1hbmFnZXJJbXBsOjpzYXZlTW9kZWwuIE1vZGVsIHNob3VsZCBiZSBpbiB0aGUgY2FjaGUiCi0JCX0KLQkJZWxzZSB7Ci0JCQlDb2RlZFN0cmVhbUNyZWF0b3IgY29kZWRTdHJlYW1DcmVhdG9yID0gbmV3IENvZGVkU3RyZWFtQ3JlYXRvcigpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldChzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuZ2V0SWQoKSwgbmV3IERvY3VtZW50UmVhZGVyKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSkpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHNoYXJlZE9iamVjdC50aGVTaGFyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldENvZGVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGVuY29kaW5nUnVsZSk7Ci0JCQlieXRlW10gb3V0cHV0Qnl0ZXMgPSBieXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQkJCW91dHB1dFN0cmVhbS53cml0ZShvdXRwdXRCeXRlcyk7Ci0JCQl0cmFjZSgic2F2aW5nIG1vZGVsIiwgaWQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2hhcmVkT2JqZWN0LnRoZVNoYXJlZE1vZGVsLnNldERpcnR5U3RhdGUoZmFsc2UpOwotCQlzaGFyZWRPYmplY3QudGhlU2hhcmVkTW9kZWwuc2V0TmV3U3RhdGUoZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNhdmVTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIElGaWxlIGlGaWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlzYXZlU3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCwgaUZpbGUsIEVuY29kaW5nUnVsZS5DT05URU5UX0JBU0VEKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlU3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBJRmlsZSBpRmlsZSwgRW5jb2RpbmdSdWxlIGVuY29kaW5nUnVsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIENvcmVFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLQkJaWYgKEZpbGVCdWZmZXJNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5pc0V4aXN0aW5nQnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCUlUZXh0RmlsZUJ1ZmZlciBidWZmZXIgPSBGaWxlQnVmZmVyTW9kZWxNYW5hZ2VyLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQlpZiAoaUZpbGUuZ2V0TG9jYXRpb24oKS5lcXVhbHMoYnVmZmVyLmdldExvY2F0aW9uKCkpKSB7Ci0JCQkJYnVmZmVyLmNvbW1pdChuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpLCB0cnVlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIElNb2RlbEhhbmRsZXIgaGFuZGxlciA9IGNhbGN1bGF0ZVR5cGUoaUZpbGUpOwotCQkJLy8gSURvY3VtZW50RHVtcGVyIGR1bXBlciA9IGhhbmRsZXIuZ2V0RG9jdW1lbnREdW1wZXIoKTsKLQkJCUNvZGVkU3RyZWFtQ3JlYXRvciBjb2RlZFN0cmVhbUNyZWF0b3IgPSBuZXcgQ29kZWRTdHJlYW1DcmVhdG9yKCk7Ci0JCQlSZWFkZXIgcmVhZGVyID0gbmV3IERvY3VtZW50UmVhZGVyKHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQljb2RlZFN0cmVhbUNyZWF0b3Iuc2V0KGlGaWxlLCByZWFkZXIpOwotCQkJY29kZWRTdHJlYW1DcmVhdG9yLnNldFByZXZpb3VzRW5jb2RpbmdNZW1lbnRvKHN0cnVjdHVyZWREb2N1bWVudC5nZXRFbmNvZGluZ01lbWVudG8oKSk7Ci0JCQlFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvID0gY29kZWRTdHJlYW1DcmVhdG9yLmdldEN1cnJlbnRFbmNvZGluZ01lbWVudG8oKTsKLQotCQkJLy8gYmUgc3VyZSBkb2N1bWVudCdzIGlzIHVwZGF0ZWQsIGluIGNhc2UgZXhjZXB0aW9uIGlzIHRocm93biBpbgotCQkJLy8gZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0KLQkJCXN0cnVjdHVyZWREb2N1bWVudC5zZXRFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdNZW1lbnRvKTsKLQotCQkJLy8gQ29udmVydCBsaW5lIGRlbGltaXRlcnMgYWZ0ZXIgZW5jb2RpbmcgbWVtZW50byBpcyBmaWd1cmVkIG91dCwKLQkJCS8vIGJ1dAotCQkJLy8gYmVmb3JlIHdyaXRpbmcgdG8gb3V0cHV0IHN0cmVhbS4KLQkJCWhhbmRsZUNvbnZlcnRMaW5lRGVsaW1pdGVycyhzdHJ1Y3R1cmVkRG9jdW1lbnQsIGlGaWxlLCBlbmNvZGluZ1J1bGUsIGVuY29kaW5nTWVtZW50byk7Ci0KLQkJCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBjb2RlZEJ5dGVTdHJlYW0gPSBjb2RlZFN0cmVhbUNyZWF0b3IuZ2V0Q29kZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oZW5jb2RpbmdSdWxlKTsKLQkJCUlucHV0U3RyZWFtIGNvZGVkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvZGVkQnl0ZVN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQkJCWlmIChpRmlsZS5leGlzdHMoKSkKLQkJCQlpRmlsZS5zZXRDb250ZW50cyhjb2RlZFN0cmVhbSwgdHJ1ZSwgdHJ1ZSwgbnVsbCk7Ci0JCQllbHNlCi0JCQkJaUZpbGUuY3JlYXRlKGNvZGVkU3RyZWFtLCBmYWxzZSwgbnVsbCk7Ci0JCQljb2RlZEJ5dGVTdHJlYW0uY2xvc2UoKTsKLQkJCWNvZGVkU3RyZWFtLmNsb3NlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdHJhY2UgbWV0aG9kCi0JICovCi0JcHJpdmF0ZSB2b2lkIHRyYWNlKFN0cmluZyBtc2csIE9iamVjdCBpZCkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMTUFOQUdFUikgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgbXNnICsgIiAiICsgVXRpbGl0aWVzLm1ha2VTaG9ydElkKGlkKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tbW9uIHRyYWNlIG1ldGhvZAotCSAqLwotCXByaXZhdGUgdm9pZCB0cmFjZShTdHJpbmcgbXNnLCBPYmplY3QgaWQsIGludCB2YWx1ZSkgewotCQlpZiAoTG9nZ2VyLkRFQlVHX01PREVMTUFOQUdFUikgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgbXNnICsgVXRpbGl0aWVzLm1ha2VTaG9ydElkKGlkKSArICIgKCIgKyB2YWx1ZSArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZkNzU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLQotLyoqCi0gKiBUaGUgZW50cmllcyBpbiB0aGlzIHJlZ2lzdHJ5IGFyZSwgY29uY2VwdHVhbGx5LCBzaW5nbGV0b24ncyBTaW5jZSBvbmx5IG9uZQotICogaW5zdGFuY2UgaXMgY3JlYXRlZCBpbiB0aGUgcmVnaXN0cnksIGFuZCB0aGVuIHRoYXQgaW5zdGFuY2UgcmV0dXJuZWQgd2hlbgotICogcmVxdWlyZWQuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGVyZSBpcyBpbnRlbnRpb25hbGx5IG5vICdyZW1vdmUnIG1ldGhvZCwgU2luY2UgdGhlIHJlZ2lzdHJ5Ci0gKiBpdHNlbGYgaXMgcmVhZCBpdCB3aGVuIG9uY2UsIGZyb20gdGhlIHBsYXRmb3JtJ3MgcGx1Z2luIHJlZ2lzdHJ5LCBhbmQgaXMKLSAqIG5vdCBpbnRlbmRlZCB0byBiZSBtb2RpZmllZCBhZnRlciB0aGF0LiBBIGNoYW5nZSBpbiBhbiBleHRlbnN0aW9uIGluIGEKLSAqIHBsdWdpbi54bWwgd2lsbCBvbmx5IHRha2UgZWZmZWN0IHdoZW4gdGhlIHdvcmtiZW5jaCBpcyByZS1zdGFydGVkLgotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHsKLQotCS8qKgotCSAqIE1ldGhvZCB0byByZXR1cm4gdGhlIHNwZWNpZmljIHR5cGUgZm9yIHRoZSBzcGVjaWZpYyBtaW1ldHlwZS4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRUeXBlRm9yKFN0cmluZyBtaW1lVHlwZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYTg4YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JRG9jdW1lbnRUeXBlSGFuZGxlcjsKLQotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IHsKLQotCXByaXZhdGUgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSGFzaFNldCBoYXNoU2V0ID0gbnVsbDsKLQlwcml2YXRlIEVtYmVkZGVkVHlwZUhhbmRsZXIgcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IG51bGw7Ci0KLQkvKgotCSAqIEBzZWUgQ29udGVudFR5cGVSZWdpc3RyeSNnZXRUeXBlRm9yKFN0cmluZykKLQkgKi8KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29udGVudFR5cGVSZWdpc3RyeUltcGwuCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVSZWdpc3RyeUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWhhc2hTZXQgPSBuZXcgSGFzaFNldCgpOwotCQluZXcgRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoaGFzaFNldCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBDb250ZW50VHlwZVJlZ2lzdHJ5I2FkZChDb250ZW50VHlwZURlc2NyaXB0aW9uKQotCSAqLwotCXZvaWQgYWRkKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJaGFzaFNldC5hZGQoY29udGVudFR5cGVEZXNjcmlwdGlvbik7Ci0JfQotCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpc3RyeURlZmF1bHQuIFdlIGNhY2hlIHRoZSBkZWZhdWx0IGhhbmRsZXIsIHNpbmNlIGNhbid0Ci0JICogY2hhbmdlIG9uY2UgcGx1Z2luIGRlc2NyaXB0b3JzIGFyZSBsb2FkZWQuCi0JICogCi0JICogQHJldHVybiBFbWJlZGRlZFR5cGVIYW5kbGVyCi0JICovCi0JcHJpdmF0ZSBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldFJlZ2lzdHJ5RGVmYXVsdCgpIHsKLQkJaWYgKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoKHJlZ2lzdHJ5RGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgJiYgKGl0Lmhhc05leHQoKSkpIHsgLy8gc2FmZQotCQkJCS8vIGNhc3QKLQkJCQkvLyBzaW5jZQotCQkJCS8vICdhZGQnCi0JCQkJLy8gcmVxdWlyZXMKLQkJCQkvLyBFbWJlZGRlZENvbnRlbnRUeXBlRGVzY3JpcHRpb24KLQkJCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGl0ZW0gPSAoRW1iZWRkZWRUeXBlSGFuZGxlcikgaXQubmV4dCgpOwotCQkJCWlmICgoaXRlbSAhPSBudWxsKSAmJiAoaXRlbS5pc0RlZmF1bHQoKSkpIHsKLQkJCQkJcmVnaXN0cnlEZWZhdWx0SGFuZGxlciA9IGl0ZW07Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVnaXN0cnlEZWZhdWx0SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgY29udGVudFR5cGVEZXNjcmlwdGlvbiBiYXNlZCBvbiBsaXRlcmFsIGlkLiBJdHMgYmFzaWNhbGx5IGEKLQkgKiAiZmlyc3QgZm91bmQgZmlyc3QgcmV0dXJuZWQiLiBOb3RlIHRoZSBvcmRlciBpcyBmYWlybHkgdW5wcmVkaWN0YWJsZSwKLQkgKiBzbyBub24tdW5pcXVlIGlkcyB3b3VsZCBjYXVzZSBwcm9ibGVtcy4KLQkgKi8KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRUeXBlRm9yKFN0cmluZyBtaW1lVHlwZSkgewotCQkvLyBOb3RlOiB0aGUgcmVhc29uIHdlIGhhdmUgdGhpcyBwcmVjb25kaXRpb24gaXMgdGhhdCB0aGUKLQkJLy8gZGVmYXVsdCBpcyBkaWZmZXJlbnQgaW5zaWRlIHRoZSByZWdpc3RyeSB0aGFuIHdoZW4gY2FsbGVkLAotCQkvLyBmb3IgZXhhbXBsZSwgZnJvbSB0aGUgSlNQTG9hZGVyLiBGb3IgdGhlIEpTUExvYWRlciwgaWYgdGhlcmUKLQkJLy8gaXMgbm8gbWltZXR5cGUsIHRoZSBkZWZhdWx0IHNob3VsZCBiZSBIVE1MLiBIZXJlLCBpZiB0aGVyZSBpcwotCQkvLyBzb21lIG1pbWV0eXBlLCBidXQgaXQgaXMgbm90IHJlY29nbml6ZWQsIHdlIHJldHVybiBhIGRlZmF1bHQKLQkJLy8gZm9yIFhNTC4gVGhpcyBpcyByZXF1aXJlZCBmb3IgdmFyaW91cyB2b2ljZSB4bWwgdHlwZXMsIGV0Yy4KLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBmb3VuZCA9IG51bGw7Ci0JCWlmIChtaW1lVHlwZSA9PSBudWxsIHx8IG1pbWVUeXBlLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmb3VuZCA9IGdldEpTUERlZmF1bHRFbWJlZGRlZFR5cGUoKTsKLQkJfSBlbHNlIHsKLQkJCUl0ZXJhdG9yIGl0ID0gaGFzaFNldC5pdGVyYXRvcigpOwotCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAvLyBzYWZlIGNhc3Qgc2luY2UKLQkJCQkvLyAnYWRkJyByZXF1aXJlcwotCQkJCS8vIEVtYmVkZGVkQ29udGVudFR5cGVEZXNjcmlwdGlvbgotCQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgaXRlbSA9IChFbWJlZGRlZFR5cGVIYW5kbGVyKSBpdC5uZXh0KCk7Ci0JCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmdldFN1cHBvcnRlZE1pbWVUeXBlcygpLmNvbnRhaW5zKG1pbWVUeXBlKSkpIHsKLQkJCQkJZm91bmQgPSBpdGVtOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBpZiBubyBleGFjdCBtYXRjaCwgZG8gdGhlICJsb29zZXIiIGNoZWNrCi0JCQlpZihmb3VuZCA9PSBudWxsKSB7Ci0JCQkJaXQgPSBoYXNoU2V0Lml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKChmb3VuZCA9PSBudWxsKSAmJiAoaXQuaGFzTmV4dCgpKSkgeyAKLQkJCQkJRW1iZWRkZWRUeXBlSGFuZGxlciBpdGVtID0gKEVtYmVkZGVkVHlwZUhhbmRsZXIpIGl0Lm5leHQoKTsKLQkJCQkJaWYgKChpdGVtICE9IG51bGwpICYmIChpdGVtLmNhbkhhbmRsZU1pbWVUeXBlKG1pbWVUeXBlKSkpIHsKLQkJCQkJCWZvdW5kID0gaXRlbTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIG5vIG1hdGNoZXMsIHVzZSBkZWZhdWx0Ci0JCWlmIChmb3VuZCA9PSBudWxsKSB7Ci0JCQlmb3VuZCA9IGdldFJlZ2lzdHJ5RGVmYXVsdCgpOwotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFR5cGVSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzQ0MTc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLQotcHVibGljIGNsYXNzIEVtYmVkZGVkVHlwZVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJlbWJlZGRlZFR5cGVIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBUQUdfTkFNRSA9ICJlbWJlZGRlZFR5cGVIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JRW1iZWRkZWRUeXBlUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVtYmVkZGVkVHlwZUhhbmRsZXIgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQotCQlFbWJlZGRlZFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24gPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJdHJ5IHsKLQkJCQljb250ZW50VHlwZURlc2NyaXB0aW9uID0gKEVtYmVkZGVkVHlwZUhhbmRsZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCUFzc2VydC5pc05vdE51bGwoY29udGVudFR5cGVEZXNjcmlwdGlvbiwgIkVycm9yIHJlYWRpbmcgY29udGVudCB0eXBlIGRlc2NyaXB0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGNvbnRlbnRUeXBlRGVzY3JpcHRpb247Ci0JfQotCi0JLyoqCi0JICogV2Ugc2ltcGx5IHJlcXVpcmUgYW4gJ2FkZCcgbWV0aG9kLCBvZiB3aGF0IGV2ZXIgaXQgaXMgd2UgYXJlIHRvIHJlYWQKLQkgKiBpbnRvCi0JICovCi0Jdm9pZCByZWFkUmVnaXN0cnkoU2V0IHNldCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBleHRlbnNpb25SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCUVtYmVkZGVkVHlwZUhhbmRsZXIgZW1iZWRkZWRDb250ZW50VHlwZSA9IHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCQkvLyBudWxsIGNhbiBiZSByZXR1cm5lZCBpZiB0aGVyZSdzIGFuIGVycm9yIHJlYWRpbmcgdGhlCi0JCQkJLy8gZWxlbWVudAotCQkJCWlmIChlbWJlZGRlZENvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkJc2V0LmFkZChlbWJlZGRlZENvbnRlbnRUeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2M2NmYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJSZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci0KLQotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlclJlZ2lzdHJ5IHsKLQlwcml2YXRlIHN0YXRpYyBNb2RlbEhhbmRsZXJSZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBJTlRFUk5BTF9ERUZBVUxUX0VYVEVOU0lPTiA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBNb2RlbEhhbmRsZXJSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIElNb2RlbEhhbmRsZXIgZGVmYXVsdEhhbmRsZXIgPSBudWxsOwotCXByaXZhdGUgTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIgcmVhZGVyID0gbmV3IE1vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyKCk7Ci0KLQlwcml2YXRlIE1vZGVsSGFuZGxlclJlZ2lzdHJ5KCkgewotCQlzdXBlcigpOwotCQlyZWFkZXIgPSBuZXcgTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIoKS5yZWFkUmVnaXN0cnkoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgZGVmYXVsdCBtb2RlbCBoYW5kbGVyLiBOb3RlOiB3ZSBzdGlsbCBnbyB0aHJvdWdoIHRoZSByZWdpc3RyeQotCSAqIHRvIGJlIHN1cmUgdG8gZ2V0IHRoZSBleGlzdGluZyBpbnN0YW5jZSwgYnV0IHRoZW4gd2UgZG8gcmVtZW1iZXIgaXQsIHNvCi0JICogc3Vic2VxdWVudCByZXF1ZXN0cyB3aWxsIGJlIGZhc3Rlci4gVGhlIGZpcnN0IHRpbWUgdGhyb3VnaCwgd2UgZG8gY2hlY2sKLQkgKiB0aGUgd2hvbGUgbGlzdCwgdG8gYmUgc3VyZSB0aGVyZSBpcyBvbmx5IG9uZS4KLQkgKiAKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXREZWZhdWx0KCkgewotCQlpZiAoZGVmYXVsdEhhbmRsZXIgPT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWFkZXIuZWxlbWVudHM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJYm9vbGVhbiBvZkludGVyZXN0ID0gcmVhZGVyLmlzRWxlbWVudERlZmF1bHQoZWxlbWVudHNbaV0pOwotCQkJCWlmIChvZkludGVyZXN0KSB7Ci0JCQkJCS8qCi0JCQkJCSAqIElmLCBoZXJlIHdpdGhpbiB0aGUgc2VhcmNoIGxvb3Agd2UndmUgYWxyZWFkeSBmb3VuZCBvbmUKLQkJCQkJICogZGVmYXVsdEhhbmRsZXIsIHRoZW4gc29tZXRoaW5nIGlzIHdyb25nIQotCQkJCQkgKi8KLQkJCQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpIHsKLQkJCQkJCWRlZmF1bHRIYW5kbGVyID0gcmVhZGVyLmdldEluc3RhbmNlKGVsZW1lbnRzW2ldKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCVN0cmluZyBlcnJvclN0cmluZyA9ICJQcm9ncmFtIG9yIGNvbmZpZ3VyYXRpb24gZXJyb3IuIE1vcmUgdGhhbiBvbmUgZGVmYXVsdCBjb250ZW50IGhhbmRsZXIgZm91bmQiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgZXJyb3JTdHJpbmcpOwotCQkJCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlcnJvclN0cmluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGRlZmF1bHRIYW5kbGVyID09IG51bGwpIHsKLQkJCVN0cmluZyBlcnJvclN0cmluZyA9ICJQcm9ncmFtIG9yIGNvbmZpZ3VyYXRpb24gZXJyb3IuIE5vIGRlZmF1bHQgY29udGVudCB0eXBlIGhhbmRsZXIgZm91bmQuIjsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGVycm9yU3RyaW5nKTsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXJyb3JTdHJpbmcpOwotCQl9Ci0JCXJldHVybiBkZWZhdWx0SGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyBhIE1vZGVsSGFuZGxlciBiYXNlZCBvbiBsaXRlcmFsIGV4dGVuc2lvbiBpZC4gSXQncyBiYXNpY2FsbHkgYQotCSAqICJmaXJzdCBmb3VuZCBmaXJzdCByZXR1cm5lZCIuIE5vIHNwZWNpZmljIG9yZGVyIGlzIGd1YXJhbnRlZWQgYW5kIHRoZQotCSAqIHVuaXF1ZW5lc3Mgb2YgSURzIGlzIG5vdCBjb25zaWRlcmVkLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25JZAotCSAqIEByZXR1cm4gdGhlIGdpdmVuIGV4dGVuc2lvbiwgb3IgbnVsbAotCSAqLwotCXByaXZhdGUgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRXh0ZW5zaW9uKFN0cmluZyBleHRlbnNpb25JZCkgewotCQlJTW9kZWxIYW5kbGVyIGZvdW5kID0gbnVsbDsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSByZWFkZXIuZWxlbWVudHM7Ci0JCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGN1cnJlbnRJZCA9IHJlYWRlci5nZXRJZChlbGVtZW50c1tpXSk7Ci0JCQkJaWYgKGV4dGVuc2lvbklkLmVxdWFscyhjdXJyZW50SWQpKSB7Ci0JCQkJCUlNb2RlbEhhbmRsZXIgaXRlbSA9IHJlYWRlci5nZXRJbnN0YW5jZShlbGVtZW50c1tpXSk7Ci0JCQkJCWZvdW5kID0gaXRlbTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoTG9nZ2VyLkRFQlVHKXsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJUaGVyZSB3ZXJlIG5vIE1vZGVsIEhhbmRsZXIgZm91bmQgaW4gcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgcmVnaXN0ZXJlZCBJTW9kZWxIYW5kbGVyIGZvciBhIGdpdmVuIG5hbWVkIGZpbGUncyBjb250ZW50Ci0JICogdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqIEByZXR1cm4gVGhlIElNb2RlbEhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIGZpbGUuIElmIGFuIGV4YWN0IG1hdGNoIGlzIG5vdCBmb3VuZCwgdGhlIG1vc3Qtc3BlY2lmaWMgbWF0Y2gKLQkgKiAgICAgICAgIGFjY29yZGluZyB0byBJQ29udGVudFR5cGUuaXNLaW5kT2YoKSB3aWxsIGJlIHJldHVybmVkLiBJZiBub25lCi0JICogICAgICAgICBhcmUgZm91bmQsIGVpdGhlciBhIGRlZmF1bHQgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3IoSUZpbGUgZmlsZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlJTW9kZWxIYW5kbGVyIG1vZGVsSGFuZGxlciA9IG51bGw7Ci0JCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gbnVsbDsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJYm9vbGVhbiBhY2Nlc3NpYmxlID0gZmlsZS5pc0FjY2Vzc2libGUoKTsKLQkJaWYgKGFjY2Vzc2libGUpIHsKLQkJCS8qIFRyeSB0aGUgb3B0aW1pemVkIG1ldGhvZCBmaXJzdCBhcyB0aGUgZGVzY3JpcHRpb24gbWF5IGJlIGNhY2hlZCAqLwotCQkJY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCS8vIHVzZSB0aGUgcHJvdmlkZWQgZGVzY3JpcHRpb24KLQkJCQljb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLyogdXNlIHRoZSBtb3JlIHRob3JvdWdoIGRpc2NvdmVyeSBtZXRob2QgdG8gZ2V0IGEgZGVzY3JpcHRpb24gKi8KLQkJCQlJbnB1dFN0cmVhbSBjb250ZW50cyA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJY29udGVudHMgPSBmaWxlLmdldENvbnRlbnRzKHRydWUpOwotCQkJCQljb250ZW50RGVzY3JpcHRpb24gPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXREZXNjcmlwdGlvbkZvcihjb250ZW50cywgZmlsZS5nZXROYW1lKCksIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJCQkJaWYgKGNvbnRlbnREZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQljb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdGhpbmcgZnVydGhlciBjYW4gYmUgZG9uZSwgYnV0IHdpbGwgbG9nIGZvciBkZWJ1Z2dpbmcKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChjb250ZW50cyAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCQkvLyBub3RoaW5nIGNhbiBiZSBkb25lCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKgotCQkgKiBJZiB3ZSBjb3VsZG4ndCBnZXQgdGhlIGNvbnRlbnQgdHlwZSBmcm9tIGEgZGVzY3JpcHRpb24sIHRyeSBiYXNpbmcKLQkJICogaXQgb24ganVzdCB0aGUgZmlsZW5hbWUKLQkJICovCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQljb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihmaWxlLmdldE5hbWUoKSk7Ci0JCX0KLQotCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJbW9kZWxIYW5kbGVyID0gZ2V0SGFuZGxlckZvckNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGhhcmQgY29kaW5nIGZvciBudWxsIGNvbnRlbnQgdHlwZQotCQkJbW9kZWxIYW5kbGVyID0gZ2V0SGFuZGxlckV4dGVuc2lvbihJTlRFUk5BTF9ERUZBVUxUX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiBtb2RlbEhhbmRsZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBGaW5kcyB0aGUgcmVnaXN0ZXJlZCBJTW9kZWxIYW5kbGVyIGZvciBhIGdpdmVuIG5hbWVkIElucHV0U3RyZWFtLgotCSAqIAotCSAqIEBwYXJhbSBpbnB1dE5hbWUKLQkgKiBAcGFyYW0gaW5wdXRTdHJlYW0KLQkgKiBAcmV0dXJuIFRoZSBJTW9kZWxIYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIGdpdmVuCi0JICogICAgICAgICBpbnB1dC4gSWYgYW4gZXhhY3QgbWF0Y2ggaXMgbm90IGZvdW5kLCB0aGUgbW9zdC1zcGVjaWZpYyBtYXRjaAotCSAqICAgICAgICAgYWNjb3JkaW5nIHRvIElDb250ZW50VHlwZS5pc0tpbmRPZigpIHdpbGwgYmUgcmV0dXJuZWQuIElmIG5vbmUKLQkgKiAgICAgICAgIGFyZSBmb3VuZCwgZWl0aGVyIGEgZGVmYXVsdCBvciBudWxsIHdpbGwgYmUgcmV0dXJuZWQuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJTW9kZWxIYW5kbGVyIGdldEhhbmRsZXJGb3IoU3RyaW5nIGlucHV0TmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUlucHV0U3RyZWFtIGlTdHJlYW0gPSBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0JCUlNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyID0gbnVsbDsKLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gbnVsbDsKLQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaVN0cmVhbS5tYXJrKENvZGVkSU8uTUFYX01BUktfU0laRSk7Ci0JCQkJY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoVXRpbGl0aWVzLmdldExpbWl0ZWRTdHJlYW0oaVN0cmVhbSksIGlucHV0TmFtZSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoaVN0cmVhbSAhPSBudWxsICYmIGlTdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQkJCWlTdHJlYW0ucmVzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlpZiAoY29udGVudFR5cGUgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoaW5wdXROYW1lKTsKLQkJfQotCQkvLyBpZiBhbGwgZWxzZSBmYWlsZWQsIHRyeSB0byBkZXRlY3Qgc29sZWx5IG9uIGNvbnRlbnRzOyBkb25lIGxhc3QgZm9yCi0JCS8vIHBlcmZvcm1hbmNlIHJlYXNvbnMKLQkJaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKFV0aWxpdGllcy5nZXRMaW1pdGVkU3RyZWFtKGlTdHJlYW0pLCBudWxsKTsKLQkJfQotCQltb2RlbEhhbmRsZXIgPSBnZXRIYW5kbGVyRm9yQ29udGVudFR5cGUoY29udGVudFR5cGUpOwotCQlyZXR1cm4gbW9kZWxIYW5kbGVyOwotCX0KLQotCS8qKgotCSAqIEZpbmRzIHRoZSByZWdpc3RlcmVkIElNb2RlbEhhbmRsZXIgZm9yIGEgZ2l2ZW4gSUNvbnRlbnRUeXBlLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqIEByZXR1cm4gVGhlIElNb2RlbEhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGNvbnRlbnQgdHlwZS4gSWYgYW4KLQkgKiAgICAgICAgIGV4YWN0IG1hdGNoIGlzIG5vdCBmb3VuZCwgdGhlIG1vc3Qtc3BlY2lmaWMgbWF0Y2ggYWNjb3JkaW5nIHRvCi0JICogICAgICAgICBJQ29udGVudFR5cGUuaXNLaW5kT2YoKSB3aWxsIGJlIHJldHVybmVkLiBJZiBub25lIGFyZSBmb3VuZCwKLQkgKiAgICAgICAgIGVpdGhlciBhIGRlZmF1bHQgb3IgbnVsbCB3aWxsIGJlIHJldHVybmVkLgotCSAqLwotCXByaXZhdGUgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yQ29udGVudFR5cGUoSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKSB7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IG51bGw7Ci0JCWlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZXhhY3RDb250ZW50VHlwZUVsZW1lbnQgPSBudWxsOwotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGtpbmRPZkNvbnRlbnRUeXBlRWxlbWVudCA9IG51bGw7Ci0JCQlpbnQga2luZE9mQ29udGVudFR5cGVEZXB0aCA9IDA7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHJlYWRlci5lbGVtZW50czsKLQkJCWlmIChlbGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGggJiYgZXhhY3RDb250ZW50VHlwZUVsZW1lbnQgPT0gbnVsbDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBjdXJyZW50SWQgPSByZWFkZXIuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoZWxlbWVudHNbaV0pOwotCQkJCQlJQ29udGVudFR5cGUgYXNzb2NpYXRlZENvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoY3VycmVudElkKTsKLQkJCQkJaWYgKGNvbnRlbnRUeXBlLmVxdWFscyhhc3NvY2lhdGVkQ29udGVudFR5cGUpKSB7Ci0JCQkJCQlleGFjdENvbnRlbnRUeXBlRWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGNvbnRlbnRUeXBlLmlzS2luZE9mKGFzc29jaWF0ZWRDb250ZW50VHlwZSkpIHsKLQkJCQkJCS8qCi0JCQkJCQkgKiBVcGRhdGUgdGhlIGtpbmRPZkVsZW1lbnQgdmFyaWFibGUgb25seSBpZiB0aGlzCi0JCQkJCQkgKiBlbGVtZW50J3MgY29udGVudCB0eXBlIGlzICJkZWVwZXIiIChkZXB0aCB0ZXN0Ci0JCQkJCQkgKiBlbnN1cmVzIHRoZSBmaXJzdCBjb250ZW50IHR5cGUgaXMgcmVtZW1iZXJlZCkKLQkJCQkJCSAqLwotCQkJCQkJSUNvbnRlbnRUeXBlIHRlc3RDb250ZW50VHlwZSA9IGFzc29jaWF0ZWRDb250ZW50VHlwZTsKLQkJCQkJCWludCB0ZXN0RGVwdGggPSAwOwotCQkJCQkJd2hpbGUgKHRlc3RDb250ZW50VHlwZSAhPSBudWxsKSB7Ci0JCQkJCQkJdGVzdERlcHRoKys7Ci0JCQkJCQkJdGVzdENvbnRlbnRUeXBlID0gdGVzdENvbnRlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCQkJCQl9Ci0JCQkJCQlpZiAodGVzdERlcHRoID4ga2luZE9mQ29udGVudFR5cGVEZXB0aCkgewotCQkJCQkJCWtpbmRPZkNvbnRlbnRUeXBlRWxlbWVudCA9IGVsZW1lbnRzW2ldOwotCQkJCQkJCWtpbmRPZkNvbnRlbnRUeXBlRGVwdGggPSB0ZXN0RGVwdGg7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChMb2dnZXIuREVCVUcpewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJUaGVyZSB3ZXJlIG5vIE1vZGVsIEhhbmRsZXIgZm91bmQgaW4gcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGV4YWN0Q29udGVudFR5cGVFbGVtZW50ICE9IG51bGwpIHsKLQkJCQloYW5kbGVyID0gcmVhZGVyLmdldEluc3RhbmNlKGV4YWN0Q29udGVudFR5cGVFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGtpbmRPZkNvbnRlbnRUeXBlRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJaGFuZGxlciA9IHJlYWRlci5nZXRJbnN0YW5jZShraW5kT2ZDb250ZW50VHlwZUVsZW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGhhbmRsZXIgPT0gbnVsbCkgewotCQkJLy8gdGVtcCBoYXJkIGNvZGluZyBmb3IgbnVsbCBjb250ZW50IHR5cGUgYXJndW1lbnRzCi0JCQloYW5kbGVyID0gZ2V0SGFuZGxlckV4dGVuc2lvbihJTlRFUk5BTF9ERUZBVUxUX0VYVEVOU0lPTik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaGFuZGxlcjsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kcyB0aGUgcmVnaXN0ZXJlZCBJTW9kZWxIYW5kbGVyIGZvciBhIGdpdmVuIGNvbnRlbnQgdHlwZSBJRC4gTm8KLQkgKiBzcGVjaWZpYyBvcmRlciBpcyBndWFyYW50ZWVkIGFuZCB0aGUgdW5pcXVlbmVzcyBvZiBJRHMgaXMgbm90Ci0JICogY29uc2lkZXJlZC4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIFRoZSBJTW9kZWxIYW5kbGVyIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBjb250ZW50IHR5cGUgSUQuIElmCi0JICogICAgICAgICBhbiBleGFjdCBtYXRjaCBpcyBub3QgZm91bmQsIHRoZSBtb3N0LXNwZWNpZmljIG1hdGNoIGFjY29yZGluZwotCSAqICAgICAgICAgdG8gSUNvbnRlbnRUeXBlLmlzS2luZE9mKCkgd2lsbCBiZSByZXR1cm5lZC4gSWYgbm9uZSBhcmUgZm91bmQsCi0JICogICAgICAgICBlaXRoZXIgYSBkZWZhdWx0IG9yIG51bGwgd2lsbCBiZSByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgSU1vZGVsSGFuZGxlciBnZXRIYW5kbGVyRm9yQ29udGVudFR5cGVJZChTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLQkJcmV0dXJuIGdldEhhbmRsZXJGb3JDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclJlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NjViNmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5BYnN0cmFjdE1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBqdXN0IGNvbnZlcnRzIHdoYXQncyBpbiB0aGUgcGx1Z2lucyByZWdpc3RyeSBpbnRvIGEgZm9ybSBtb3JlCi0gKiBlYXNpbHkgdXNlYWJsZSBieSBvdGhlcnMsIHRoZSBDb250ZW50VHlwZVJlZ2lzdHJ5LgotICovCi1jbGFzcyBNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBIYXNoTWFwIGFsbFJlYWR5Q3JlYXRlSW5zdGFuY2VzID0gbmV3IEhhc2hNYXAoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9BU1NPQ0lBVEVEX0NPTlRFTlRfVFlQRSA9ICJhc3NvY2lhdGVkQ29udGVudFR5cGVJZCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgU3RyaW5nIEFUVF9ERUZBVUxUID0gImRlZmF1bHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0JSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHM7Ci0JcHJvdGVjdGVkIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAibW9kZWxIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCS8vCi0JcHJvdGVjdGVkIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBTdHJpbmcgVEFHX05BTUUgPSAibW9kZWxIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8KLQkvKioKLQkgKiBDb250ZW50VHlwZVJlZ2lzdHJ5UmVhZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JTW9kZWxIYW5kbGVyUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JU3RyaW5nIGdldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9BU1NPQ0lBVEVEX0NPTlRFTlRfVFlQRSk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlTdHJpbmcgZ2V0SWQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGlkVmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlyZXR1cm4gaWRWYWx1ZTsKLQl9Ci0KLQlzeW5jaHJvbml6ZWQgSU1vZGVsSGFuZGxlciBnZXRJbnN0YW5jZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQkvLyBNYXkgbmVlZCB0byByZWNvbnNpZGVyLCBidXQgZm9yIG5vdywgd2UnbGwgYXNzdW1lIGFsbCBjbGllbnRzIG11c3QKLQkJLy8gc3ViY2xhc3MgQWJzdHJhY3RDb250ZW50VHlwZUlkZW50aWZpZXIuIEl0cyBlYXNpZXIgYW5kIHNhZmVyLCBmb3IKLQkJLy8gdGhpcwotCQkvLyBsb3cgbGV2ZWwgInN5c3RlbSIgb2JqZWN0LiAoVGhhdCBpcywgd2UgY2FuIGNoZWNrIGFuZCBzZXQgInBhY2thZ2UKLQkJLy8gcHJvdGVjdGVkIgotCQkvLyBhdHRyaWJ1dGVzLgotCQlBYnN0cmFjdE1vZGVsSGFuZGxlciBtb2RlbEhhbmRsZXIgPSAoQWJzdHJhY3RNb2RlbEhhbmRsZXIpIGFsbFJlYWR5Q3JlYXRlSW5zdGFuY2VzLmdldChnZXRJZChlbGVtZW50KSk7Ci0JCWlmIChtb2RlbEhhbmRsZXIgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbEhhbmRsZXIgPSAoQWJzdHJhY3RNb2RlbEhhbmRsZXIpIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihBVFRfQ0xBU1MpOwotCQkJCWlmIChtb2RlbEhhbmRsZXIgIT0gbnVsbCkgewotCQkJCQlhbGxSZWFkeUNyZWF0ZUluc3RhbmNlcy5wdXQoZ2V0SWQoZWxlbWVudCksIG1vZGVsSGFuZGxlcik7Ci0JCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfREVGQVVMVCk7Ci0JCQkJCWlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiAidHJ1ZSIuZXF1YWxzKGRlZmF1bHRWYWx1ZSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW1vZGVsSGFuZGxlci5zZXREZWZhdWx0KHRydWUpOwotCQkJCQllbHNlCi0JCQkJCQltb2RlbEhhbmRsZXIuc2V0RGVmYXVsdChmYWxzZSk7Ci0JCQkJCS8vIFRPRE8gLS0gc2V0IGFuZCBjaGVjayBhdHRyaWJ1dGVzIHZzLiBjcmVhdGVkIGluc3RhbmNlCi0JCQkJCS8vY29udGVudFR5cGVJZGVudGlmaWVyLnNldE9yQ2hlY2tJZChlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxIYW5kbGVyOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudERlZmF1bHQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERUZBVUxUKTsKLQkJaWYgKGRlZmF1bHRWYWx1ZSAhPSBudWxsICYmICJ0cnVlIi5lcXVhbHMoZGVmYXVsdFZhbHVlKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCWVsc2UKLQkJCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlNb2RlbEhhbmRsZXJSZWdpc3RyeVJlYWRlciByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCS8vIGp1c3QgcmVtZW1iZXIgdGhlIGVsZW1lbnRzLCBzbyBwbHVnaW5zIGRvbid0IGhhdmUgdG8KLQkJCS8vIGJlIGFjdGl2YXRlZCwgdW5sZXNzIGV4dGVuc2lvbiBtYXRjaGVzIHRob3NlICJvZiBpbnRlcmVzdCIuCi0JCQllbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQl9Ci0JCXJldHVybiB0aGlzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhZWYzYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5FbWJlZGRlZFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotCi0vKioKLSAqIAotICogTGlrZWx5IGEgdGVtcG9yYXJ5IGNsYXNzIHRvIGJlIHJlcGxhY2VkIGJ5IHBsdWdpbiwgZXZlbnR1YWxseS4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlclV0aWxpdHkgewotCi0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgY29udGVudFR5cGVSZWdpc3RyeTsKLQotCXB1YmxpYyBzdGF0aWMgSURvY3VtZW50VHlwZUhhbmRsZXIgZ2V0Q29udGVudFR5cGVGb3IoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gZ2V0Q29udGVudFR5cGVSZWdpc3RyeSgpLmdldEhhbmRsZXJGb3JDb250ZW50VHlwZUlkKHN0cmluZyk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgTW9kZWxIYW5kbGVyUmVnaXN0cnkgZ2V0Q29udGVudFR5cGVSZWdpc3RyeSgpIHsKLQkJaWYgKGNvbnRlbnRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJY29udGVudFR5cGVSZWdpc3RyeSA9IE1vZGVsSGFuZGxlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRUeXBlUmVnaXN0cnk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBFbWJlZGRlZFR5cGVIYW5kbGVyIGdldERlZmF1bHRFbWJlZGRlZFR5cGUoKSB7Ci0JCXJldHVybiBnZXRFbWJlZGRlZENvbnRlbnRUeXBlRm9yKCJ0ZXh0L2h0bWwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgRW1iZWRkZWRUeXBlSGFuZGxlciBnZXRFbWJlZGRlZENvbnRlbnRUeXBlRm9yKFN0cmluZyBzdHJpbmcpIHsKLQkJRW1iZWRkZWRUeXBlSGFuZGxlciBpbnN0YW5jZSA9IG51bGw7Ci0JCWluc3RhbmNlID0gRW1iZWRkZWRUeXBlUmVnaXN0cnlJbXBsLmdldEluc3RhbmNlKCkuZ2V0VHlwZUZvcihzdHJpbmcpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIE1vZGVsSGFuZGxlclV0aWxpdHkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0NTM0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9QbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5TU0VDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotCi0KLS8qKgotICogCi0gKiBDbGllbnRzIGNhbiBtYWtlIHVzZSBvZiBJRXhlY3V0YWJsZUV4dGVuc2lvbiB0byBoYW5kbGUgdGhlIG9wdGlvbmFsIGFkYXB0ZXIKLSAqIGNsYXNzIGFuZCBrZXkuIFR5cGljYWxseSwgbWFueSBjbGllbnRzIHVzZSBhIHR5cGljYWwgcGF0dGVybiBvZiBwcm92aWRpbmcKLSAqIGFuIGFkYXB0ZXIgY2xhc3MgYW5kIGtleSBpbiB0aGVpciBudWxsIGFyZ3VtZW50IGNvbnN0cnVjdG9yIGFueXdheSwgc28KLSAqIHRoZXknZCBvbmx5IGhhdmUgdG8gdXNlIElFeGVjdXRhYmxlRXh0ZW5zaW9uIGlmIHRoZSBmYWN0b3J5IHdhcyBmb3IgbW9yZQotICogdGhhbiBvbmUuCi0gKi8KLXB1YmxpYyBjbGFzcyBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIgewotCS8vCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9BREFQVEVSS0VZID0gImFkYXB0ZXJLZXlDbGFzcyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9SRUdJU1RFUkFEQVBURVIgPSAicmVnaXN0ZXJBZGFwdGVycyI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIFBsdWdpbkNvbnRyaWJ1dGVkRmFjdG9yeVJlYWRlciByZWFkZXIgPSBudWxsOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAocmVhZGVyID09IG51bGwpIHsKLQkJCXJlYWRlciA9IG5ldyBQbHVnaW5Db250cmlidXRlZEZhY3RvcnlSZWFkZXIoKTsKLQkJfQotCQlyZXR1cm4gcmVhZGVyOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQVRUUl9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEFUVFJfQ09OVEVOVFRZUEUgPSAiY29udGVudFR5cGVJZGVudGlmZXJJZCI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNvbnRlbnRUeXBlRmFjdG9yeUNvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImZhY3RvcnkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEZhY3RvcmllcyhJRG9jdW1lbnRUeXBlSGFuZGxlciBoYW5kbGVyKSB7Ci0JCXJldHVybiBsb2FkUmVnaXN0cnkoaGFuZGxlci5nZXRJZCgpKTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRGYWN0b3JpZXMoU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIGxvYWRSZWdpc3RyeSh0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyRmFjdG9yeSBsb2FkRmFjdG9yeUZyb21Db25maWd1cmF0aW9uRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgT2JqZWN0IHJlcXVlc3RlclR5cGUpIHsKLQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhUQUdfTkFNRSkpIHsKLQkJCVN0cmluZyBjb250ZW50VHlwZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVFJfQ09OVEVOVFRZUEUpOwotCQkJaWYgKCFyZXF1ZXN0ZXJUeXBlLmVxdWFscyhjb250ZW50VHlwZSkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgY2xhc3NOYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUUl9DTEFTUyk7Ci0JCQkvLwkJCVN0cmluZyBhZGFwdGVyS2V5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX0FEQVBURVJLRVkpOwotCQkJLy8JCQlTdHJpbmcgcmVnaXN0ZXJBZGFwdGVycyA9Ci0JCQkvLyBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRSX1JFR0lTVEVSQURBUFRFUik7Ci0KLQkJCS8vIGlmIGNsYXNzTmFtZSBpcyBudWxsLCB0aGVuIG5vIG9uZSBkZWZpbmVkIHRoZSBleHRlbnNpb24gcG9pbnQKLQkJCS8vIGZvciBhZGFwdGVyIGZhY3RvcmllcwotCQkJaWYgKGNsYXNzTmFtZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUUl9DTEFTUyk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlmIGFuIGVycm9yIG9jY3VycyBoZXJlLCBpdHMgcHJvYmFibHkgdGhhdCB0aGUgcGx1Z2luCi0JCQkJCS8vIGNvdWxkIG5vdCBiZSBmb3VuZC9sb2FkZWQKLQkJCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlci5sb2dFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGNsYXNzOiAiICsgY2xhc3NOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlmIGFuIGVycm9yIG9jY3VycyBoZXJlLCBpdHMgcHJvYmFibHkgdGhhdCB0aGUgcGx1Z2luCi0JCQkJCS8vIGNvdWxkIG5vdCBiZSBmb3VuZC9sb2FkZWQgLS0gYnV0IGluIGFueSBjYXNlIHdlIGp1c3QKLQkJCQkJLy8gd2FudAotCQkJCQkvLyB0byBsb2cgdGhlIGVycm9yIGFuZCBjb250aW51ZSBydW5uaW5nIGFuZCBiZXN0IHdlIGNhbi4KLQkJCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlci5sb2dFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGNsYXNzOiAiICsgY2xhc3NOYW1lLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQkvLwkJCQlpZiAocGx1Z2luICE9IG51bGwpIHsKLQkJCQkvLwkJCQkJZmFjdG9yeSA9IG9sZEF0dHJpYnV0ZXNDb2RlKGVsZW1lbnQsIGZhY3RvcnksIGNsYXNzTmFtZSwKLQkJCQkvLyBwbHVnaW4pOwotCQkJCS8vCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBsb2FkUmVnaXN0cnkoT2JqZWN0IGNvbnRlbnRUeXBlKSB7Ci0JCUxpc3QgZmFjdG9yeUxpc3QgPSBudWxsOyAvLyBuZXcgVmVjdG9yKCk7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFNTRUNvcmVQbHVnaW4uSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJaWYgKGVsZW1lbnRzLmxlbmd0aCA+IDApIHsKLQkJCQkvLyB0aGlzIGlzIGNhbGxlZCBhIGxvdCwgc28gZG9uJ3QgY3JlYXRlIHZlY3RvciB1bmxlc3MgcmVhbGx5Ci0JCQkJLy8gbmVlZGVkCi0JCQkJLy8gVE9ETzogY291bGQgZXZlbnR1YWxseSBjYWNoZSBpbiBhIGhhc2h0YWJsZSwgb3Igc29tZXRoaW5nLAotCQkJCS8vIHRvIGF2b2lkIHJlcGVhdCBwcm9jZXNzaW5nCi0JCQkJZmFjdG9yeUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBsb2FkRmFjdG9yeUZyb21Db25maWd1cmF0aW9uRWxlbWVudChlbGVtZW50c1tpXSwgY29udGVudFR5cGUpOwotCQkJCQlpZiAoZmFjdG9yeSAhPSBudWxsKQotCQkJCQkJZmFjdG9yeUxpc3QuYWRkKGZhY3RvcnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFjdG9yeUxpc3Q7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDI4NzY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotCi0KLS8qKgotICogUmVnaW9ucyBvZiB0aGlzIGNsYXNzIGFyZSBpbnRlbmRlZCBzcGVjaWZpY2FsbHkgZm9yIFhNTC9IVE1ML0pTUHMuIE90aGVyCi0gKiBsYW5ndWFnZXMgbWF5IG5lZWQgdGhlaXIgb3duIHN1YmNsYXNzZXMuIChTZWUgdGhlIHVwZGF0ZU1vZGVsIG1ldGhvZCkuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0UmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXByb3RlY3RlZCBpbnQgZkxlbmd0aDsKLQotCXByb3RlY3RlZCBpbnQgZlN0YXJ0OwotCXByb3RlY3RlZCBpbnQgZlRleHRMZW5ndGg7Ci0JcHJvdGVjdGVkIFN0cmluZyBmVHlwZTsKLQotCXByb3RlY3RlZCBDb250ZXh0UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBDb250ZXh0UmVnaW9uKFN0cmluZyBuZXdDb250ZXh0LCBpbnQgbmV3U3RhcnQsIGludCBuZXdUZXh0TGVuZ3RoLCBpbnQgbmV3TGVuZ3RoKSB7Ci0JCWZUeXBlID0gbmV3Q29udGV4dDsKLQkJZlN0YXJ0ID0gbmV3U3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gbmV3VGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IG5ld0xlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JYm9vbGVhbiBhbGxMZXR0ZXJPckRpZ2l0KFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aCgpOyBpKyspIHsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2hlY2sgdGhhdCBhIEphdmEgTGV0dGVyIG9yIERpZ2l0IGlzCi0JCQkvLyB0aGUgc2FtZSB0aGluZyBhcyBhbiBYTUwgbGV0dGVyIG9yIGRpZ2l0Ci0JCQlpZiAoIShDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoYW5nZXMuY2hhckF0KGkpKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWJvb2xlYW4gYWxsV2hpdGVTcGFjZShTdHJpbmcgY2hhbmdlcykgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoIUNoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2hhbmdlcy5jaGFyQXQoaSkpKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCWJvb2xlYW4gY2FuSGFuZGxlQXNMZXR0ZXJPckRpZ2l0KFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBub24td2hpdGUgc3BhY2UgYXJlYQotCQlpZiAoKHJlcXVlc3RTdGFydCA8PSAoZ2V0VGV4dEVuZCgpKSkgJiYgKGFsbExldHRlck9yRGlnaXQoY2hhbmdlcykpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JYm9vbGVhbiBjYW5IYW5kbGVBc1doaXRlU3BhY2UoU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgd2UgYXJlIGluIHRoZSAid2hpdGUgc3BhY2UiIGFyZWEgb2YgYSByZWdpb24sIHRoZW4KLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBoYW5kbGUsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCS8vIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24gaXMgY29uc2lkZXIgYW55d2hlcmUgdGhhdCB3b3VsZAotCQkvLyBsZWF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhpcyBjaGFyYWN0ZXIgYW5kIHRoZSB0ZXh0IHBhcnQuCi0JCS8vIGFuZCBvZiBjb3Vyc2UsIHdlIGNhbiBpbnNlcnQgd2hpdGVzcGFjZSBpbiB3aGl0ZXNwYWNlIHJlZ2lvbgotCQkvLwotCQkvLyBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlIGluIHRoaXMgcmVnaW9uLCBubyBuZWVkIHRvIGxvb2sgZnVydGhlcgotCQlpZiAoZ2V0RW5kKCkgPiBnZXRUZXh0RW5kKCkpIHsKLQkJCS8vIG5vIG5lZWQgdG8gYWRkIG9uZSB0byBlbmQgb2YgdGV4dCwgYXMgd2UgdXNlZCB0bywgc2luY2Ugd2UKLQkJCS8vIGNoYW5nZSBkZWZpbml0aW9uIG9mIGxlbmd0aCB0byBlcXVhdGUgdG8gb2Zmc2V0IHBsdXMgb25lLgotCQkJaWYgKHJlcXVlc3RTdGFydCA+IGdldFRleHRFbmQoKSkgewotCQkJCS8vIG9rLCB3ZSBhcmUgaW4gdGhlIHdoaXRlc3BhY2UgcmVnaW9uLCBzbyB3ZSBjYW4ndCBoYW5kbGUsCi0JCQkJLy8gdW5sZXNzCi0JCQkJLy8gd2UgYXJlIGp1c3QgaW5zZXJ0aW5nIHdoaXRlc3BhY2UuCi0JCQkJaWYgKGFsbFdoaXRlU3BhY2UoY2hhbmdlcykpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgcG9zaXRpb24pIHsKLQotCQlyZXR1cm4gZlN0YXJ0IDw9IHBvc2l0aW9uICYmIHBvc2l0aW9uIDwgZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgaSkgewotCQlmU3RhcnQgPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHN0cmluZykgewotCQlmVHlwZSA9IHN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWUgKyAiLS0+ICIgKyBnZXRUeXBlKCkgKyAiOiAiICsgZ2V0U3RhcnQoKSArICItIiArIGdldFRleHRFbmQoKSArIChnZXRUZXh0RW5kKCkgIT0gZ2V0RW5kKCkgPyAoIi8iICsgZ2V0RW5kKCkpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gdGhlIGZvdXIgdHlwZXMgd2UgdXNlZCB0byBoYW5kbGUgaGVyZSwgaGF2ZSBhbGwgYmVlbiBtb3ZlZCB0bwotCQkvLyBzcGVjaWZpYyByZWdpb24gY2xhc3Nlcy4KLQkJLy8gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUKLQkJLy8gWE1MX1RBR19BVFRSSUJVVEVfTkFNRQotCQkvLyBYTUxfQ09OVEVOVAotCQkvLyBYTUxfQ0RBVEFfVEVYVAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ZvcmVpZ25SZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ZvcmVpZ25SZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4NmQwMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3BhcnNlci9Gb3JlaWduUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBGb3JlaWduUmVnaW9uIGV4dGVuZHMgQ29udGV4dFJlZ2lvbiB7Ci0KLQlwcml2YXRlIFN0cmluZyBsYW5ndWFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3Vycm91bmRpbmdUYWcgPSBudWxsOwotCi0JLyoqCi0JICogRm9yZWlnblJlZ2lvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXByaXZhdGUgRm9yZWlnblJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgRm9yZWlnblJlZ2lvbihTdHJpbmcgbmV3Q29udGV4dCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3VGV4dExlbmd0aCwgaW50IG5ld0xlbmd0aCkgewotCQlzdXBlcihuZXdDb250ZXh0LCBuZXdTdGFydCwgbmV3VGV4dExlbmd0aCwgbmV3TGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgRm9yZWlnblJlZ2lvbihTdHJpbmcgbmV3Q29udGV4dCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3VGV4dExlbmd0aCwgaW50IG5ld0xlbmd0aCwgU3RyaW5nIG5ld0xhbmd1YWdlKSB7Ci0JCXN1cGVyKG5ld0NvbnRleHQsIG5ld1N0YXJ0LCBuZXdUZXh0TGVuZ3RoLCBuZXdMZW5ndGgpOwotCQlzZXRMYW5ndWFnZShuZXdMYW5ndWFnZSk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0TGFuZ3VhZ2UoKSB7Ci0JCXJldHVybiBsYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXRTdXJyb3VuZGluZ1RhZygpIHsKLQkJcmV0dXJuIHN1cnJvdW5kaW5nVGFnOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdMYW5ndWFnZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldExhbmd1YWdlKGphdmEubGFuZy5TdHJpbmcgbmV3TGFuZ3VhZ2UpIHsKLQkJbGFuZ3VhZ2UgPSBuZXdMYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3U3Vycm91bmRpbmdUYWcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdXJyb3VuZGluZ1RhZyhqYXZhLmxhbmcuU3RyaW5nIG5ld1N1cnJvdW5kaW5nVGFnKSB7Ci0JCXN1cnJvdW5kaW5nVGFnID0gbmV3U3Vycm91bmRpbmdUYWc7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuICJGT1JFSUdOOiAiICsgc3VwZXIudG9TdHJpbmcoKTsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXRub2RlLCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJZlRleHRMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJcmVzdWx0ID0gbmV3IFJlZ2lvbkNoYW5nZWRFdmVudChmbGF0bm9kZS5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIGZsYXRub2RlLCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL0NvbW1vbk1vZGVsUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYTUxM2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Db21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMgYXJlIG5vdyBtYW5hZ2VkIGJ5IGVhY2ggaW5kaXZpZHVhbAotICogICAgICAgICAgICAgY29udGVudCB0eXBlLiAoWFhDb3JlUHJlZmVyZW5jZU5hbWVzKQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbW9uTW9kZWxQcmVmZXJlbmNlTmFtZXMgewotCVN0cmluZyBUQUJfV0lEVEggPSAidGFiV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgU1BMSVRfTVVMVElfQVRUUlMgPSAic3BsaXRNdWx0aUF0dHJzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOREVOVF9VU0lOR19UQUJTID0gImluZGVudFVzaW5nVGFicyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBUl9BTExfQkxBTktfTElORVMgPSAiY2xlYXJBbGxCbGFua0xpbmVzIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFHX05BTUVfQ0FTRSA9ICJ0YWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBBVFRSX05BTUVfQ0FTRSA9ICJhdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBGT1JNQVRUSU5HX1NVUFBPUlRFRCA9ICJmb3JtYXR0aW5nU3VwcG9ydGVkIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgUFJFRkVSUkVEX01BUktVUF9DQVNFX1NVUFBPUlRFRCA9ICJwcmVmZXJyZWRNYXJrdXBDYXNlU3VwcG9ydGVkIjsvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgVEFTS19UQUdfVEFHUyA9ICJ0YXNrLXRhZy10YWdzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBUQVNLX1RBR19QUklPUklUSUVTID0gInRhc2stdGFnLXByaW9yaXRpZXMiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBU0tfVEFHX0VOQUJMRSA9ICJ0YXNrLXRhZ3MiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFRBU0tfVEFHX1BST0pFQ1RTX0lHTk9SRUQgPSAidGFzay10YWctcHJvamVjdHMtdG9JZ25vcmUiOyAvLyROT04tTkxTLTEkCi0KLQotCS8qKgotCSAqIHRoZXNlIGFyZSBwcmVmZXJlbmNlcyB0aGF0IHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSB0aGUgImVtYmVkZGVkCi0JICogcHJlZmVyZW5jZSBzdG9yZSIgZm9yIGV4YW1wbGU6IGlmIHlvdSBhc2sgZm9yIHRoIE9WRVJWSUVXX1JVTEVSCi0JICogcHJlZmVyZW5jZSBmb3IgSlNQLCB5b3Ugd2lsbCBhdXRvbWF0aWNhbGx5IGdldCB0aGUgcHJlZmVyZW5jZSBmcm9tIHRoZQotCSAqIEhUTUwgcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlTdHJpbmcgRU1CRURERURfQ09OVEVOVF9UWVBFX1BSRUZFUkVOQ0VTW10gPSB7VEFCX1dJRFRILCBMSU5FX1dJRFRILCBTUExJVF9NVUxUSV9BVFRSUywgSU5ERU5UX1VTSU5HX1RBQlMsIENMRUFSX0FMTF9CTEFOS19MSU5FUywgVEFHX05BTUVfQ0FTRSwgQVRUUl9OQU1FX0NBU0UsfTsKLQotCVN0cmluZyBGT1JNQVRUSU5HX1BSRUZFUkVOQ0VTW10gPSB7VEFCX1dJRFRILCBMSU5FX1dJRFRILCBTUExJVF9NVUxUSV9BVFRSUywgSU5ERU5UX1VTSU5HX1RBQlMsIENMRUFSX0FMTF9CTEFOS19MSU5FUyx9OwotCi0JU3RyaW5nIEFVVE8gPSAiQXV0byI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBVVEZfOCA9ICJVVEYtOCI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJU09fODg1OV8xID0gIklTTy04ODU5LTEiOy8vJE5PTi1OTFMtMSQKLQotCWludCBBU0lTID0gMDsKLQlpbnQgTE9XRVIgPSAxOwotCWludCBVUFBFUiA9IDI7Ci0KLQkvLyBjbGVhbnVwIHByZWZlcmVuY2UgbmFtZXMKLQlTdHJpbmcgQ0xFQU5VUF9UQUdfTkFNRV9DQVNFID0gImNsZWFudXBUYWdOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0FUVFJfTkFNRV9DQVNFID0gImNsZWFudXBBdHRyTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTID0gImNvbXByZXNzRW1wdHlFbGVtZW50VGFncyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRfUkVRVUlSRURfQVRUUlMgPSAiaW5zZXJ0UmVxdWlyZWRBdHRycyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBJTlNFUlRfTUlTU0lOR19UQUdTID0gImluc2VydE1pc3NpbmdUYWdzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBGT1JNQVRfU09VUkNFID0gImZvcm1hdFNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDT05WRVJUX0VPTF9DT0RFUyA9ICJjb252ZXJ0RU9MQ29kZXMiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ0xFQU5VUF9FT0xfQ09ERSA9ICJjbGVhbnVwRU9MQ29kZSI7Ly8kTk9OLU5MUy0xJAotCi0JU3RyaW5nIExBU1RfQUNUSVZFX1BBR0UgPSAibGFzdEFjdGl2ZVBhZ2UiOy8vJE5PTi1OTFMtMSQJCi0KLQkvLyBuZWVkIHRvIHB1dCBkZWZhdWx0IHRhYiB3aWR0aCBwcmVmZXJlbmNlIGhlcmUgc28gaXQgaXMgYWNjZXNzaWJsZSBieQotCS8vIGJvdGggbW9kZWwgYW5kIGVkaXRvcgotCS8vIHRoaXMgd2F5LCBlZGl0b3IgZG9lcyBub3QgbmVlZCB0byBxdWVyeSBtb2RlbCdzIGRlZmF1bHQgdGFiIHdpZHRoCi0JLy8gcHJlZmVyZW5jZQotCWludCBERUZBVUxUX1RBQl9XSURUSCA9IDQ7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9QcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliMWYxZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1RhZ1ByZWZlcmVuY2VLZXlzOwotCi1wdWJsaWMgY2xhc3MgUHJlZmVyZW5jZUluaXRpYWxpemVyIGV4dGVuZHMgQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgdGFza1RhZ0RlZmF1bHRzID0gbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpOwotCQl0YXNrVGFnRGVmYXVsdHMucHV0Qm9vbGVhbihUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFLCBmYWxzZSk7Ci0JCXRhc2tUYWdEZWZhdWx0cy5wdXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MsICJUT0RPLEZJWE1FLFhYWCIpOyAvLyROT04tTkxTLTEkCi0JCXRhc2tUYWdEZWZhdWx0cy5wdXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMsICIxLDIsMSIpOyAvLyROT04tTkxTLTEkCi0JCXRhc2tUYWdEZWZhdWx0cy5wdXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVELCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFhOWM4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0QWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiBJQWRhcHRlckZhY3RvcnkuIEFsbCBpbXBsZW1lbnRlcnMgb2YKLSAqIElBZGFwdGVyRmFjdG9yeSBzaG91bGQgc3ViY2xhc3MgdGhpcyBjbGFzcy4gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgdXNlcwotICogaXRzZWxmICh0aGlzKSBhcyB0aGUga2V5LiBTdWJjbGFzc2VzIG5lZWQgdG8gcHJvdmlkZSBhIHdheSB0byBjcmVhdGUgdGhlCi0gKiBhZGFwdGVyLCBhbmQgY2FuIG92ZXJyaWRlIG9yIGNhbGwgb3RoZXIgbWV0aG9kcy4KLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCi0KLQlwcml2YXRlIE9iamVjdCBmQWRhcHRlcktleTsKLQotCXByaXZhdGUgYm9vbGVhbiBmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyOwotCi0JLyoqCi0JICogSWYgdGhpcyBkZWZhdWx0IGNvbnN0cnVjdG9yIHVzZWQsIHNldEFkYXB0ZXJLZXkgYW5kIHNldFNob3VsZFJlZ2lzdGVyCi0JICogc2hvdWxkIGJlIHVzZWQgdG8gcHJvcGVybHkgaW5pdGlhbGl6ZS4KLQkgKi8KLQlwcm90ZWN0ZWQgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQotCX0KLQotCi0JcHVibGljIEFic3RyYWN0QWRhcHRlckZhY3RvcnkoT2JqZWN0IGFkYXB0ZXJLZXkpIHsKLQkJdGhpcyhhZGFwdGVyS2V5LCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWNsYXNzZXMgbWF5IGV4dGVuZGVkIHRoaXMgY29uc3RydWN0b3IsIGlmIG5lZWRlZC4KLQkgKi8KLQotCXB1YmxpYyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5KE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsKLQotCQlzdXBlcigpOwotCQlmQWRhcHRlcktleSA9IGFkYXB0ZXJLZXk7Ci0JCWZTaG91bGRSZWdpc3RlckFkYXB0ZXIgPSByZWdpc3RlckFkYXB0ZXJzOwotCi0JfQotCi0JLyoqCi0JICogSVNTVUU6IHNob3VsZCBiZSBmaW5hbC4gU2VlIHRob3NlIHRoYXQgaW1wbGVtZW50IGl0IAotCSAqIGZvciBjb21wbGljYXRpbmcgZGV0YWlscyBhbmQgInVua25vd25zIi4gCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQlJTm9kZUFkYXB0ZXIgYWRhcHRlciA9IG51bGw7Ci0JCWlmICh0YXJnZXQgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IHRhcmdldC5nZXRFeGlzdGluZ0FkYXB0ZXIoZkFkYXB0ZXJLZXkpOwotCQkJaWYgKGFkYXB0ZXIgPT0gbnVsbCkgewotCQkJCWFkYXB0ZXIgPSBhZGFwdE5ldyh0YXJnZXQpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIG5vcm1hbGx5IGltcGxlbWVudCB0aGVpciBvd24gJ2NvcHknIG1ldGhvZC4gQnkKLQkgKiBkZWZhdWx0LCB3ZSdsbCByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UsIGZvciBjb252ZW5pZW5jZSBvZiB0aG9zZSB1c2luZwotCSAqIHNpbmdsZXRvbiBmYWN0b3JpZXMgKHdoaWNoIGhhdmUgbm8gc3RhdGUsIGFuZCBzbyBuZWVkIHRvIGRvIGFueXRoaW5nIG9uCi0JICogJ3JlbGVhc2UnKS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBuZWVkcyB0byByZXR1cm4gdHJ1ZSBvZiB0aGlzIGZhY3RvcnkgaXMgZm9yIGFkYXB0ZXJzIG9mCi0JICogdHlwZSAndHlwZScuIEl0IGlzIHJlcXVpcmVkIHRoYXQgaXQgcmV0dXJuIHRydWUgaWYgJ2VxdWFscycgYW5kIHRoaXMKLQkgKiBkZWZhdWx0IGJlaGF2aW9yIGlzIHByb3ZpZGVkIGJ5IHRoaXMgc3VwZXIgY2xhc3MuIENsaWVudHMgbWF5IGV4dGVuZAotCSAqIHRoaXMgYmVoYXZpb3IgaWYgbW9yZSBjb21wbGV4IGxvZ2ljIGlzIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKGZBZGFwdGVyS2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG1heSBuZWVkIHRvICJjbGVhbnVwIiB0aGVpciBhZGFwdGVyIGZhY3RvcnksIHJlbGVhc2UKLQkgKiBhZGFwdGVycywgcmVzb3VyY2VzLCBldGMuIFN1YmNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIG1ldGhvZCBpZiBzdWNoCi0JICogY2xlYW4gdXAgaXMgcmVxdWlyZWQuIE5vdGU6IHdoaWxlIGN1cnJlbnQgYmVoYXZpb3IgaXMgdG8gZG8gbm90aGluZywKLQkgKiBzdWJjbGFzc2VzIHNob3VsZCBub3QgYXNzdW1lIHRoaXMgd291bGQgYWx3YXlzIGJlIHRydWUsIHNvIHNob3VsZAotCSAqIGFsd2F5cyBjYWxsIHN1cGVyLnJlbGVhc2UgYXQgdGhlIGVuZCBvZiB0aGVpciBtZXRob2QuCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZGVmYXVsdCBmb3Igc3VwZXJjbGFzcyBpcyB0byBkbyBub3RoaW5nCi0JfQotCi0JLyoqCi0JICogT25seSBmb3Igc3BlY2lhbCBjYXNlcyB0aGVyZSB0aGUgYWRhcHRlciBrZXkgY2FuIGJlIHNldCBpbiB0aGUKLQkgKiBjb25zdHJ1Y3Rvci4gSXQgY2FuIGJlIHNldCBoZXJlLiBJZiBpdCBpcyBzZXQgbW9yZSB0aGFuLCBhbmQKLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBzZXRBZGFwdGVyS2V5KE9iamVjdCBrZXkpIHsKLQkJaWYgKGZBZGFwdGVyS2V5ICE9IG51bGwgJiYgIShmQWRhcHRlcktleS5lcXVhbHMoa2V5KSkpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJTm9kZUFkYXB0ZXIgS2V5IGNhbm5vdCBiZSBjaGFuZ2VkLiIpOyAvLyROT04tTkxTLTEkCi0JCWZBZGFwdGVyS2V5ID0ga2V5OwotCX0KLQotCS8qKgotCSAqIENhbiBiZSBjYWxsZWQgYnkgc3ViY2xhc3NlcyBkdXJpbmcgJ2FkYXB0JyBwcm9jZXNzLCBidXQgbXVzdCBub3QgYmUKLQkgKiBvdmVycmlkZGVuIG9yIHJlaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKiAKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBJTm9kZUFkYXB0ZXIgYWRhcHROZXcoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSBjcmVhdGVBZGFwdGVyKHRhcmdldCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWlmIChmU2hvdWxkUmVnaXN0ZXJBZGFwdGVyKSB7Ci0JCQkJdGFyZ2V0LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzIG1ldGhvZC4gSXQgaXMgY2FsbGVkIGJ5IGluZnJhc3RydWN0dXJlCi0JICogd2hlbiBhbiBpbnN0YW5jZSBpcyBuZWVkZWQuIEl0IGlzIHByb3ZpZGVkIHRoZSBub2RlIG5vdGlmaWVyLCB3aGljaCBtYXkKLQkgKiBvciBtYXkgbm90IGJlIHJlbGV2ZW50IHdoZW4gY3JlYXRpbmcgdGhlIGFkYXB0ZXIuIE5vdGU6IHRoZSBhZGFwdGVyCi0JICogZG9lcyBub3QgaGF2ZSB0byBsaXRlcmFsbHkgYmUgYSBuZXcgaW50YW5jZSBhbmQgaXMgYWN0dWFsbHkgcmVjb21tZW5kZWQKLQkgKiB0byB0eXBpY2FsbHkgYmUgYSBzaW5nbGV0b24gZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCi0JICogCi0JICogQHBhcmFtIHRhcmdldAotCSAqIEByZXR1cm4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpOwotCi0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpIHsKLQkJcmV0dXJuIGZTaG91bGRSZWdpc3RlckFkYXB0ZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRTaG91bGRSZWdpc3RlckFkYXB0ZXIoYm9vbGVhbiBzaG91bGRSZWdpc3RlckFkYXB0ZXIpIHsKLQkJLy8gSVNTVUU6IHRlY2huaWNhbGx5IHdlIHByb2JhYmx5IHNob3VsZCBub3QgYWxsb3cgdGhpcyB2YWx1ZSB0bwotCQkvLyBjaGFuZ2UsIGFmdGVyIGluaXRpYWxpemF0aW9uLCBidXQgaXMgbm90IHNvIGVhc3kgdG8gZG8sCi0JCS8vIGFuZCBJJ20gbm90IHN1cmUgaXRzICJ3b3J0aCIgdGhlIHByb3RlY3Rpb24uCi0JCWZTaG91bGRSZWdpc3RlckFkYXB0ZXIgPSBzaG91bGRSZWdpc3RlckFkYXB0ZXI7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IGdldEFkYXB0ZXJLZXkoKSB7Ci0JCXJldHVybiBmQWRhcHRlcktleTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0Fic3RyYWN0Tm90aWZpZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3ROb3RpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDE0MjcwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvQWJzdHJhY3ROb3RpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotCi0KLQotLyoqCi0gKiBBYnN0cmFjdE5vdGlmaWVyIGlzIHNpbWlsYXIgdG8gKGFuZCBiYXNlZCBvbikgdGhlIEVNRiBOb3RpZmllckltcGwgY2xhc3MsCi0gKiBidXQgaXMgbm90IHJlbGF0ZWQgdG8gRU1GIHBlciBzZS4gVGhpcyBjbGFzcyBpcyBzaW1wbGVyICh0aGF0IGlzLCBub3QgYXMKLSAqIG1hbnkgZnVuY3Rpb25zKS4KLSAqIAotICogSW1wbGVtZW50ZXJzIG9mIHRoaXMgSU5vZGVOb3RpZmllciBtdXN0IHN1YmNsYXNzIHRoaXMgY2xhc3MuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE5vdGlmaWVyIGltcGxlbWVudHMgSU5vZGVOb3RpZmllciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IGdyb3d0aENvbnN0YW50ID0gMzsKLQlwcml2YXRlIGludCBhZGFwdGVyQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXJbXSBmQWRhcHRlcnM7Ci0KLQkvKioKLQkgKiBBYnN0cmFjdE5vdGlmaWVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIEFic3RyYWN0Tm90aWZpZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogYWRkQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlcikgewotCi0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVuc3VyZUNhcGFjaXR5KGFkYXB0ZXJDb3VudCArIDEpOwotCQlmQWRhcHRlcnNbYWRhcHRlckNvdW50KytdID0gYWRhcHRlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5zdXJlQ2FwYWNpdHkoaW50IG5lZWRlZCkgewotCQlpZiAoZkFkYXB0ZXJzID09IG51bGwpIHsKLQkJCS8vIGZpcnN0IHRpbWUKLQkJCWZBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmQWRhcHRlcnMubGVuZ3RoOwotCQlpZiAob2xkTGVuZ3RoIDwgbmVlZGVkKSB7Ci0JCQlJTm9kZUFkYXB0ZXJbXSBvbGRBZGFwdGVycyA9IGZBZGFwdGVyczsKLQkJCUlOb2RlQWRhcHRlcltdIG5ld0FkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlcltuZWVkZWQgKyBncm93dGhDb25zdGFudF07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KG9sZEFkYXB0ZXJzLCAwLCBuZXdBZGFwdGVycywgMCwgYWRhcHRlckNvdW50KTsKLQkJCWZBZGFwdGVycyA9IG5ld0FkYXB0ZXJzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTk9UIEFQSTogdXNlZCBvbmx5IGZvciB0ZXN0aW5nLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRBZGFwdGVyQ291bnQoKSB7Ci0JCXJldHVybiBhZGFwdGVyQ291bnQ7Ci0JfQotCi0JLyoqCi0JICogRGVmYXVsdCBiZWhhdmlvciBmb3IgZ2V0dGluZyBhbiBhZGFwdGVyLgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXIgZ2V0QWRhcHRlckZvcihPYmplY3QgdHlwZSkgewotCQkvLyBmaXJzdCwgd2UnbGwgc2VlIGlmIHdlIGFscmVhZHkgaGF2ZSBvbmUKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IGdldEV4aXN0aW5nQWRhcHRlcih0eXBlKTsKLQkJLy8gaWYgd2UgZGlkbid0IGZpbmQgb25lIGluIG91ciBsaXN0IGFscmVhZHksCi0JCS8vIGxldCdzIGNyZWF0ZSBpdAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCUZhY3RvcnlSZWdpc3RyeSByZWcgPSBnZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IHJlZy5nZXRGYWN0b3J5Rm9yKHR5cGUpOwotCQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gZmFjdG9yeS5hZGFwdCh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBXZSB3b24ndCBwcmV2ZW50IG51bGwgZnJvbSBiZWluZyByZXR1cm5lZCwgYnV0IGl0IHdvdWxkIGJlCi0JCQkvLyB1bnVzdWFsLgotCQkJLy8gSXQgbWlnaHQgYmUgYmVjYXVzZSBGYWN0b3J5IGlzIG5vdCB3b3JraW5nIGNvcnJlY3RseSwgb3IKLQkJCS8vIG5vdCBpbnN0YWxsZWQsIHNvIHdlJ2xsIGFsbG93IHdhcm5pbmcgbWVzc2FnZS4KLQkJCWlmICgocmVzdWx0ID09IG51bGwpICYmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5kaXNwbGF5V2FybmluZ3MpKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBubyBhZGFwdGVyIHdhcyBmb3VuZCBvciBjcmVhdGVkIGZvciAiICsgdHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBzaGFsbG93IGNsb25lIG9mIGxpc3QsIHNpbmNlIGNsaWVudHMgc2hvdWxkIG5vdCBtYW5pcHVsYXRlCi0JICogb3VyIGxpc3QgZGlyZWN0bHkuIEluc3RlYWQsIHRoZXkgc2hvdWxkIHVzZSBhZGQvcmVtb3ZlQWRhcHRlci4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRBZGFwdGVycygpIHsKLQkJaWYgKGZBZGFwdGVycyAhPSBudWxsKSB7Ci0JCQlpZiAoYWRhcHRlckNvdW50ID09IDApIHsKLQkJCQlmQWRhcHRlcnMgPSBudWxsOwotCQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2UgbmVlZCB0byBtYWtlIGEgbmV3IGFycmF5LCB0byBiZSBzdXJlCi0JCQkJLy8gaXQgZG9lc24ndCBjb250YWluIG51bGxzIGF0IGVuZCwgd2hpY2ggbWF5IGJlCi0JCQkJLy8gcHJlc2VudCB0aGVyZSBmb3IgImdyb3d0aCIuCi0JCQkJSU5vZGVBZGFwdGVyW10gdGVtcEFkYXB0ZXJzID0gbmV3IElOb2RlQWRhcHRlclthZGFwdGVyQ291bnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZkFkYXB0ZXJzLCAwLCB0ZW1wQWRhcHRlcnMsIDAsIGFkYXB0ZXJDb3VudCk7Ci0JCQkJLy8gRU1GIHVzZXMgdGhlIHVubW9kaWZpYWJsZUNvbGxlY3Rpb24uIEl0cyBhIGJpdCBvZiBhCi0JCQkJLy8gcGVyZm9ybWFuY2UKLQkJCQkvLyBkcmFpbiwgYnV0IG1heSB3YW50IHRvIGxlYXZlIGluIHNpbmNlCi0JCQkJLy8gaXQgd291bGQgImZhaWwgZmFzdCIgaWYgc29tZW9uZSB3YXMgdHJ5aW5nIHRvIG1vZGlmeSB0aGUKLQkJCQkvLyBsaXN0LgotCQkJCXJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKEFycmF5cy5hc0xpc3QodGVtcEFkYXB0ZXJzKSk7Ci0JCQkJLy8gcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3QWRhcHRlcnMpOwotCQkJfQotCQl9Ci0JCWVsc2UKLQkJCXJldHVybiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotCX0KLQotCXByaXZhdGUgbG9uZyBnZXRBZGFwdGVyVGltZUNyaXRlcmlhKCkgewotCQkvLyB0byAicmUtZ2V0IiB0aGUgcHJvcGVydHkgZWFjaCB0aW1lIGlzIGEgbGl0dGxlIGF3a3dhcmQsIGJ1dCB3ZQotCQkvLyBkbyBpdCB0aGF0IHdheSB0byBhdm9pZCBhZGRpbmcgaW5zdGFuY2UgdmFyaWFibGUganVzdCBmb3IKLQkJLy8gZGVidWdnaW5nLgotCQkvLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgZGVidWdBZGFwdGVyTm90aWZjYXRpb25UaW1lCi0JCS8vIGlzIHRydWUuCi0JCWZpbmFsIFN0cmluZyBjcml0ZXJpYVN0ciA9IFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvZG9tL2FkYXB0ZXIvbm90aWZpY2F0aW9uL3RpbWUvY3JpdGVyaWEiKTsgLy8kTk9OLU5MUy0xJAotCQlsb25nIGNyaXRlcmlhID0gLTE7Ci0JCWlmIChjcml0ZXJpYVN0ciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWNyaXRlcmlhID0gTG9uZy5wYXJzZUxvbmcoY3JpdGVyaWFTdHIpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gY2F0Y2ggdG8gYmUgc3VyZSB3ZSBkb24ndCBidXJiIGluIG5vdGlmaWNhdGlvbiBsb29wLAotCQkJCS8vIGJ1dCBpZ25vcmUsIHNpbmNlIGp1c3QgYSBkZWJ1ZyBhaWQKLQkJCX0KLQkJfQotCQlyZXR1cm4gY3JpdGVyaWE7Ci0JfQotCi0JcHVibGljIElOb2RlQWRhcHRlciBnZXRFeGlzdGluZ0FkYXB0ZXIoT2JqZWN0IHR5cGUpIHsKLQkJSU5vZGVBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYWRhcHRlckNvdW50OyBpKyspIHsKLQkJCUlOb2RlQWRhcHRlciBhID0gZkFkYXB0ZXJzW2ldOwotCQkJaWYgKGEuaXNBZGFwdGVyRm9yVHlwZSh0eXBlKSkgewotCQkJCXJlc3VsdCA9IGE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgZGlkbid0IGZpbmQgb25lIGluIG91ciBsaXN0LAotCQkvLyByZXR1cm4gdGhlIG51bGwgcmVzdWx0Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JYWJzdHJhY3QgcHVibGljIEZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCXB1YmxpYyB2b2lkIG5vdGlmeShpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0KLQkJaWYgKGZBZGFwdGVycyAhPSBudWxsKSB7Ci0JCQlpbnQgbG9jYWxBZGFwdGVyQ291bnQgPSAwOwotCQkJSU5vZGVBZGFwdGVyW10gbG9jYWxBZGFwdGVycyA9IG51bGw7Ci0KLQkJCS8vIGxvY2sgb2JqZWN0IHdoaWxlIG1ha2luZyBsb2NhbCBhc3NpZ25tZW50cwotCQkJc3luY2hyb25pemVkICh0aGlzKSB7Ci0JCQkJbG9jYWxBZGFwdGVyQ291bnQgPSBhZGFwdGVyQ291bnQ7Ci0JCQkJbG9jYWxBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbbG9jYWxBZGFwdGVyQ291bnRdOwotCQkJCVN5c3RlbS5hcnJheWNvcHkoZkFkYXB0ZXJzLCAwLCBsb2NhbEFkYXB0ZXJzLCAwLCBsb2NhbEFkYXB0ZXJDb3VudCk7Ci0JCQl9Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxBZGFwdGVyQ291bnQ7IGkrKykgewotCQkJCUlOb2RlQWRhcHRlciBhID0gbG9jYWxBZGFwdGVyc1tpXTsKLQotCQkJCWlmIChMb2dnZXIuREVCVUdfQURBUFRFUk5PVElGSUNBVElPTlRJTUUpIHsKLQkJCQkJbG9uZyBnZXRBZGFwdGVyVGltZUNyaXRlcmlhID0gZ2V0QWRhcHRlclRpbWVDcml0ZXJpYSgpOwotCQkJCQlsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQkvLyAqKiBrZWVwIHRoaXMgbGluZSBpZGVudGljYWwgd2l0aCBub24tZGVidWcgdmVyc2lvbiEhCi0JCQkJCWEubm90aWZ5Q2hhbmdlZCh0aGlzLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcyk7Ci0JCQkJCWxvbmcgbm90aWZ5RHVyYXRpb24gPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0VGltZTsKLQkJCQkJaWYgKGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEgPj0gMCAmJiBub3RpZnlEdXJhdGlvbiA+IGdldEFkYXB0ZXJUaW1lQ3JpdGVyaWEpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRhcHRlciBub3RpZnlEdXJhdGlvbjogIiArIG5vdGlmeUR1cmF0aW9uICsgIiAgY2xhc3M6ICIgKyBhLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vICoqIGtlZXAgdGhpcyBsaW5lIGlkZW50aWNhbCB3aXRoIGRlYnVnIHZlcnNpb24hIQotCQkJCQkJYS5ub3RpZnlDaGFuZ2VkKHRoaXMsIGV2ZW50VHlwZSwgY2hhbmdlZEZlYXR1cmUsIG9sZFZhbHVlLCBuZXdWYWx1ZSwgcG9zKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIEl0cyBpbXBvcnRhbnQgdG8gImtlZXAgZ29pbmciLCBzaW5jZSBub3RpZmljYXRpb25zCi0JCQkJCQkvLyBvY2N1ciBiZXR3ZWVuIGFuCi0JCQkJCQkvLyBhYm91dFRvQ2hhbmdlIGV2ZW50IGFuZCBhIGNoYW5nZWQgZXZlbnQgLS0gdGhlCi0JCQkJCQkvLyBjaGFuZ2VkIGV2ZW50IHR5cGljYWxseSBiZWluZyByZXF1aXJlCi0JCQkJCQkvLyB0byByZXN0b3JlIHN0YXRlLCBldGMuIFNvLCB3ZSBqdXN0IGxvZyBtZXNzYWdlLCBkbwotCQkJCQkJLy8gbm90IHJlLXRocm93IGl0LCBidXQKLQkJCQkJCS8vIHR5cGljYWxseSB0aGUgZXhjZXB0aW9uIGRvZXMgaW5kaWNhdGUgYSBzZXJpb3VzCi0JCQkJCQkvLyBwcm9ncmFtIGVycm9yLgotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQSBzdHJ1Y3R1cmVkIG1vZGVsIGNsaWVudCwgIiArIGEgKyAiIHRocmV3IGZvbGxvd2luZyBleGNlcHRpb24gZHVyaW5nIGFkYXB0ZXIgbm90aWZpY2F0aW9uICgiICsgSU5vZGVOb3RpZmllci5FVkVOVF9UWVBFX1NUUklOR1NbZXZlbnRUeXBlXSArICIgKSIsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlQWRhcHRlcihJTm9kZUFkYXB0ZXIgYSkgewotCQlpZiAoZkFkYXB0ZXJzID09IG51bGwgfHwgYSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlJTm9kZUFkYXB0ZXJbXSBuZXdBZGFwdGVycyA9IG5ldyBJTm9kZUFkYXB0ZXJbZkFkYXB0ZXJzLmxlbmd0aF07Ci0JCWludCBvbGRBZGFwdGVyQ291bnQgPSBhZGFwdGVyQ291bnQ7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgb2xkSW5kZXggPSAwOyBvbGRJbmRleCA8IG9sZEFkYXB0ZXJDb3VudDsgb2xkSW5kZXgrKykgewotCQkJSU5vZGVBZGFwdGVyIGNhbmRpZGF0ZSA9IGZBZGFwdGVyc1tvbGRJbmRleF07Ci0JCQlpZiAoYSA9PSBjYW5kaWRhdGUpIHsKLQkJCQlhZGFwdGVyQ291bnQtLTsKLQkJCQlmb3VuZCA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3QWRhcHRlcnNbbmV3SW5kZXgrK10gPSBmQWRhcHRlcnNbb2xkSW5kZXhdOwotCQl9Ci0JCWlmIChmb3VuZCkKLQkJCWZBZGFwdGVycyA9IG5ld0FkYXB0ZXJzOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9Eb2N1bWVudENoYW5nZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvRG9jdW1lbnRDaGFuZ2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwOTg3ZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9Eb2N1bWVudENoYW5nZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERvY3VtZW50Q2hhbmdlZCBleHRlbmRzIE1vZGVsTGlmZWN5Y2xlRXZlbnQgewotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmTmV3RG9jdW1lbnQ7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZk9sZERvY3VtZW50OwotCi0JcHJvdGVjdGVkIERvY3VtZW50Q2hhbmdlZCgpIHsKLQotCQlzdXBlcihNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQpOwotCi0JfQotCi0JcHJvdGVjdGVkIERvY3VtZW50Q2hhbmdlZChpbnQgYWRkaXRpb25hbFR5cGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQotCQlzdXBlcihtb2RlbCwgTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ET0NVTUVOVF9DSEFOR0VEIHwgYWRkaXRpb25hbFR5cGUpOwotCi0JfQotCi0JcHVibGljIERvY3VtZW50Q2hhbmdlZChpbnQgYWRkaXRpb25hbFR5cGUsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgb2xkRG9jdW1lbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3RG9jdW1lbnQpIHsKLQotCQl0aGlzKGFkZGl0aW9uYWxUeXBlLCBtb2RlbCk7Ci0JCWZPbGREb2N1bWVudCA9IG9sZERvY3VtZW50OwotCQlmTmV3RG9jdW1lbnQgPSBuZXdEb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXROZXdEb2N1bWVudCgpIHsKLQotCQlyZXR1cm4gZk5ld0RvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldE9sZERvY3VtZW50KCkgewotCi0JCXJldHVybiBmT2xkRG9jdW1lbnQ7Ci0JfQotCi0Jdm9pZCBzZXROZXdEb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0KLQkJZk5ld0RvY3VtZW50ID0gbmV3RG9jdW1lbnQ7Ci0JfQotCi0Jdm9pZCBzZXRPbGREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IG9sZERvY3VtZW50KSB7Ci0KLQkJZk9sZERvY3VtZW50ID0gb2xkRG9jdW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI3ZTk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQ7Ci0KLS8qKgotICogVGhpcyBpcyBhbiBlYXJseSB2ZXJzaW9uIG9mIGEgY2xhc3MgdGhhdCBtYXkgY2hhbmdlIG92ZXIgdGhlIG5leHQgZmV3Ci0gKiBtaWxlc3RvbmVzLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgewotCi0Jdm9pZCBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoTW9kZWxMaWZlY3ljbGVFdmVudCBldmVudCk7Ci0KLQl2b2lkIHByb2Nlc3NQcmVNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmZmODguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBSZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYSBuZXcgTW9kZWwgZnJvbSBhIHJlc291cmNlLCBvciBhcyBhIG5ldywgZW1wdHkKLSAqIGluc3RhbmNlLgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTG9hZGVyIHsKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgcGVyZm9ybSBhbGwgdGhlIG1vZGVsIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJlZm9yZQotCSAqIGl0IGNvbnRhaW5zIGNvbnRlbnQsIG5hbWVseSwgaXQgc2hvdWxkIGNhbGwgbmV3TW9kZWwsIHRoZQotCSAqIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCgpLCB0aGVuIHNldEFkYXB0ZXJGYWN0b3JpZXMuICh0aGlzIGlzCi0JICogdGVudGF0aXZlKQotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoKTsKLQotCS8qKgotCSAqIE1ldGhvZCBjcmVhdGVNb2RlbC4gQ3JlYXRlcyBhIG5ldyBtb2RlbCBiYXNlZCBvbiBvbGQgb25lLgotCSAqIAotCSAqIEBwYXJhbSBvbGRNb2RlbAotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWRNb2RlbAotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgY3JlYXRlTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiB0aG9zZSBmYWN0b3JpZXMgd2hpY2ggbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUKLQkgKiBzdHJ1Y3R1cmVkTW9kZWwgYmVmb3JlIGNvbnRlbnQgaXMgYXBwbGllZC4KLQkgKi8KLQlMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKTsKLQotCXZvaWQgbG9hZChJRmlsZSBmaWxlLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQl2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCXZvaWQgbG9hZChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBTdHJpbmcgZW5jb2RpbmdOYW1lLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JSU1vZGVsTG9hZGVyIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBzaG91bGQgYWx3YXlzIHJldHVybiBhbiBuZXcsIGVtcHR5IFN0cnVjdHVyZWQgTW9kZWwKLQkgKiBhcHByb3ByaWF0ZSBmb3IgaXRzZWxmLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwoKTsKLQotCUlTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0aWFsaXplKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIGdldCBhIGZyZXNoIGNvcHkgb2YgdGhlIGRhdGEsIGFuZCByZXBvcHVsYXRlIHRoZQotCSAqIG1vZGVscyAuLi4gbm9ybWFsbHkgYnkgYSBjYWxsIHRvIHNldFRleHQgb24gdGhlIHN0cnVjdHVyZWREb2N1bWVudCwgZm9yCi0JICogU3RydWN0dXJlZE1vZGVscy4gVGhpcyBtZXRob2QgaXMgbmVlZGVkIGluIHNvbWUgY2FzZXMgd2hlcmUgY2xpZW50cyBhcmUKLQkgKiBzaGFyaW5nIGEgbW9kZWwgYW5kIHRoZW4gY2hhbmdlcyBjYW5jZWxlZC4gU2F5IGZvciBleGFtcGxlLCBvbmUgZWRpdG9yCi0JICogYW5kIHNldmVyYWwgImRpc3BsYXlzIiBhcmUgc2hhcmluZyBhIG1vZGVsLCBpZiB0aGUgZWRpdG9yIGlzIGNsb3NlZAotCSAqIHdpdGhvdXQgc2F2aW5nIGNoYW5nZXMsIHRoZW4gdGhlIGRpc3BsYXlzIHN0aWxsIG5lZWQgYSBtb2RlbCwgYnV0IHRoZXkKLQkgKiBzaG91bGQgcmV2ZXJ0IHRvIHRoZSBvcmlnaW5hbCB1bnNhdmVkIHZlcnNpb24uCi0JICovCi0Jdm9pZCByZWxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogQ3JlYXRlIGEgU3RydWN0dXJlZCBNb2RlbCB3aXRoIHRoZSBnaXZlbiBTdHJ1Y3R1cmVkRG9jdW1lbnQgaW5zdGFuY2UgYXMKLQkgKiBpdHMgZG9jdW1lbnQgKGluc3RlYWQgb2YgYSBuZXcgZG9jdW1lbnQgaW5zdGFuY2UgYXMgd2VsbCkKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNyZWF0ZU1vZGVsKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBiYXNlTG9jYXRpb24sIElNb2RlbEhhbmRsZXIgaGFuZGxlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU1vZGVsTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMTU1YTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ1J1bGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgYSBzZXQgb2YgQVBJcyBmb3IgY3JlYXRpbmcgYSBuZXcgbW9kZWwgbWFuYWdlciwKLSAqIGZvciBtYW5hZ2luZyAoYWRkIG9yIHJlbW92ZSkgbW9kZWwgbG9hZGVycyBhbmQgbW9kZWwgZHVtcGVycywgYW5kIGZvcgotICogbWFuYWdpbmcgKGdldCwgcmVsZWFzZSwgc2F2ZSwgYW5kIHNhdmUgYXMpIG1vZGVscy4KLSAqIAotICogQ2xpZW50cyBjYW4gcmVmZXJlbmNlLCBidXQgc2hvdWxkIG5vdCBpbXBsZW1lbnQuCi0gKiAKLSAqIEBzZWUgU3RydWN0dXJlZE1vZGVsTWFuZ2VyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTWFuYWdlciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBEVVBMSUNBVEVEX01PREVMID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyLkRVUExJQ0FURURfTU9ERUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5NQU5BR0VEX01PREVMID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxNYW5hZ2VyLlVOTUFOQUdFRF9NT0RFTCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENhbGN1bGF0ZSBpZCBwcm92aWRlcyBhIGNvbW1vbiB3YXkgdG8gZGV0ZXJtaW5lIHRoZSBpZCBmcm9tIHRoZSBpbnB1dAotCSAqIC4uLiBuZWVkZWQgdG8gZ2V0IGFuZCBzYXZlIHRoZSBtb2RlbC4gSXQgaXMgYSBzaW1wbGUgY2xhc3MgdXRpbGl0eSwgYnV0Ci0JICogaXMgYW4gaW5zdGFuY2UgbWV0aG9kIHNvIGNhbiBiZSBhY2Nlc3NlZCB2aWEgaW50ZXJmYWNlLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY2FsY3VsYXRlSWQoSUZpbGUgZmlsZSk7Ci0KLQlJU3RydWN0dXJlZE1vZGVsIGNvcHlNb2RlbEZvckVkaXQoU3RyaW5nIG9sZElkLCBTdHJpbmcgbmV3SWQpIHRocm93cyBSZXNvdXJjZUluVXNlOwotCi0JLyoqCi0JICogY3JlYXRlTmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IHRoZSBuZXcgaW5zdGFuY2UgaGFzIG5vCi0JICogY29udGVudC4gTm90ZTogdGhpcyBwcm9kdWNlcyBhbiB1bm1hbmFnZWQgbW9kZWwsIGZvciB0ZW1wb3JhcnkgdXNlLiBJZgotCSAqIGEgdHJ1ZSBzaGFyZWQgbW9kZWwgaXMgZGVzaXJlZCwgdXNlICJjb3B5Ii4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVOZXdJbnN0YW5jZShJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGl0cyBhc3N1bWUgdGhhdCBJRmlsZSBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBhcwotCSAqIGEgcmVzb3VyY2UgeWV0LiBJZiBpdCBkb2VzLCBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiB0aGUgcmVzb3VyY2UgZG9lcyBhbHJlYWR5IGV4aXN0LCB0aGVuIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvciBpcwotCSAqIHRoZSByaWdodCBBUEkgdG8gdXNlLgotCSAqIAotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgUmVzb3VyY2VBbHJlYWR5RXhpc3RzLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIEZhY3RvcnkgbWV0aG9kLCBzaW5jZSBhIHByb3BlciBJU3RydWN0dXJlZERvY3VtZW50IG11c3QgaGF2ZSBhIHByb3BlcgotCSAqIHBhcnNlciBhc3NpZ25lZC4gTm90ZTogY2xpZW50cyBzaG91bGQgdmVyaWZ5IElGaWxlIGV4aXN0cyBiZWZvcmUgdXNpbmcKLQkgKiB0aGlzIG1ldGhvZC4gSWYgdGhpcyBJRmlsZSBkb2VzIG5vdCBleGlzdCwgdGhlbgotCSAqIGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudCBpcyB0aGUgY29ycmVjdCBBUEkgdG8gdXNlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKElGaWxlIGlGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBDb252ZWllbmNlIG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYQotCSAqIHByb3BlciBwYXJzZXIgYXNzaWduZWQuIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBhbiBlbXB0eQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBuZWVkZWQuIE90aGVyd2lzZSwgdXNlIElGaWxlIGZvcm0uCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLS0gSSBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0byBkaXNjb3VhZ2UgdXNlIG9mIHRoaXMgbWV0aG9kLgotCSAqICAgICAgICAgICAgIEl0IGRvZXMgbm90IHJlYWxseSB3b3JrIGZvciBKU1AgZnJhZ21lbnRzLCBzaW5jZSBKU1AKLQkgKiAgICAgICAgICAgICBGcmFnbWVudHMgbmVlZCBhbiBJRmlsZSB0byBjb3JyZWN0bHkgbG9vayB1cCB0aGUgY29udGVudAotCSAqICAgICAgICAgICAgIHNldHRpbmdzLiBVc2UgSUZpbGUgZm9ybSBpbnN0ZWFkLiBOb3RlOiBzb21lIGNvbmZ1c3Rpb24KLQkgKiAgICAgICAgICAgICB3aXRoIGl0IGFuZCB0aGUgZm9ybSBmb3IgSFRQUCBlbmNvZGluZywgc28gb25jZSBhIG51bGwgYXJnCi0JICogICAgICAgICAgICAgaXMgYWxsb3dlZCBpbiB0aGF0IEFQSSAuLi4gd2UgY2FuIHJlbW92ZSB0aGlzIG9uZS4gKGFmdGVyCi0JICogICAgICAgICAgICAgdmVyaWZ5aW5nIGFnYWluIHdpdGggVG9tL0xpbmtzYnVpbGQpCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKFN0cmluZyBmaWxlbmFtZSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyLCBTdHJpbmcgaWFuYUVuY29kaW5nTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JSVN0cnVjdHVyZWREb2N1bWVudCBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgY29udGVudCwgVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENvbnZlaWVuY2UgbWV0aG9kLiBJdCBkZXBlbmRzIG9uIHRoZSBsb2FkZXJzIG5ld01vZGVsIG1ldGhvZCB0byByZXR1cm4KLQkgKiBhbiBhcHByb3ByaWF0ZSBTdHJ1Y3V0dXJlZE1vZGVsIGFwcHJvcHJpYXRlbHkgaW5pdGlhbGl6ZWQuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpOwotCi0JSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVVbk1hbmFnZWRTdHJ1Y3R1cmVkTW9kZWxGb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFVSSVJlc29sdmVyIHJlc29sdmVyKTsKLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoSURvY3VtZW50IGRvY3VtZW50KTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KElGaWxlIGlGaWxlKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIE5vdGU6IHVzZXJzIG9mIHRoaXMgJ21vZGVsJyBtdXN0IHN0aWxsIHJlbGVhc2UgaXQgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIG51bGwgaWYgdGhlcmUncyBub3QgYSBtb2RlbCBjb3JyZXNwb25kaW5nIHRvIGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoSURvY3VtZW50IGRvY3VtZW50KTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKElGaWxlIGlGaWxlKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgZ2V0TW9kZWwgbWV0aG9kLCBleGNlcHQgdGhpcyBtZXRob2QgZG9lcyBub3QKLQkgKiBjcmVhdGUgYSBtb2RlbC4gVGhpcyBtZXRob2QgZG9lcyBpbmNyZW1lbnQgdGhlIHJlZmVyZW5jZSBjb3VudCAoaWYgaXQKLQkgKiBleGlzdHMpLiBJZiB0aGUgbW9kZWwgZG9lcyBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgY2FjaGUgb2YgbW9kZWxzLAotCSAqIG51bGwgaXMgcmV0dXJuZWQuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoT2JqZWN0IGlkKTsKLQotCXB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFeGlzdGluZ01vZGVsSWRzKCk7Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSBlbmNvZGluZyBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yRWRpdChJRmlsZSBpRmlsZSwgU3RyaW5nIGVuY29kaW5nLCBTdHJpbmcgbGluZURlbGltaXRlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgdGV4dEZpbGVCdWZmZXJEb2N1bWVudCk7Ci0KLQkvKgotCSAqIEBkZXByZWNhdGVkIC0gYSBVUkkgcmVzb2x2ZXIgc2hvdWxkIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aGVuCi0JICogICAgICAgICAgICAgbmVlZGVkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWxGb3JFZGl0KFN0cmluZyBpZCwgSW5wdXRTdHJlYW0gaW5TdHJlYW0sIFVSSVJlc29sdmVyIHJlc29sdmVyKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb247Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSBlbmNvZGluZyBpcyBoYW5kbGVkIGF1dG9tYXRpY2FsbHkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qCi0JICogQGRlcHJlY2F0ZWQgLSBlbmNvZGluZyBhbmQgbGluZSBkZWxpbWl0ZXJzIGFyZSBoYW5kbGVkIGF1dG9tYXRpY2FsbHkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGxpbmVEZWxpbWl0ZXIpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChJU3RydWN0dXJlZERvY3VtZW50IHRleHRGaWxlQnVmZmVyRG9jdW1lbnQpOwotCi0JLyoKLQkgKiBAZGVwcmVjYXRlZCAtIGEgVVJJIHJlc29sdmVyIHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2hlbgotCSAqICAgICAgICAgICAgIG5lZWRlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsRm9yUmVhZChTdHJpbmcgZmlsZW5hbWUsIElucHV0U3RyZWFtIGluU3RyZWFtLCBVUklSZXNvbHZlciByZXNvbHZlcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY3JlYXRlIGEgbmV3IG1vZGVsIGlmIGl0IGFscmVhZHkgZXhpc3RzIC4uLiBpZgotCSAqIGZvcmNlIGlzIGZhbHNlLiBUaGUgaWRlYSBpcyB0aGF0IGEgY2xpZW50IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uY2UKLQkgKiB3aXRoIGZvcmNlIHNldCB0byBmYWxzZS4gSWYgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gcHJvbXB0IGNsaWVudAotCSAqIGlmIHRoZXkgd2FudCB0byBvdmVyd3JpdGUuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvckVkaXQoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBub3QgY3JlYXRlIGEgbmV3IG1vZGVsIGlmIGl0IGFscmVhZHkgZXhpc3RzIC4uLiBpZgotCSAqIGZvcmNlIGlzIGZhbHNlLiBUaGUgaWRlYSBpcyB0aGF0IGEgY2xpZW50IHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIG9uY2UKLQkgKiB3aXRoIGZvcmNlIHNldCB0byBmYWxzZS4gSWYgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24sIHRoZW4gcHJvbXB0IGNsaWVudAotCSAqIGlmIHRoZXkgd2FudCB0byBvdmVyd3JpdGUuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbEZvclJlYWQoSUZpbGUgaUZpbGUsIGJvb2xlYW4gZm9yY2UpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIFJlc291cmNlSW5Vc2UsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWZlcmVuY2UgY291bnQgb2YgdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlpbnQgZ2V0UmVmZXJlbmNlQ291bnRGb3JSZWFkKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKE9iamVjdCBpZCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqICAgICAgICAgICAgT2JqZWN0IFRoZSBpZCBvZiB0aGUgbW9kZWwKLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yRWRpdChPYmplY3QgaWQpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZEZvclJlYWQoT2JqZWN0IGlkKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBtYW5hZ2VyIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGF0ZUNoYW5naW5nKCk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjaGFuZ2VzIHRoZSBpZCBvZiB0aGUgbW9kZWwuIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0Jdm9pZCBtb3ZlTW9kZWwoT2JqZWN0IG9sZElkLCBPYmplY3QgbmV3SWQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB3aGVuIHRoZSBjb250ZW50IHR5cGUgb2YgYSBtb2RlbCBjaGFuZ2VzLiBJdHMKLQkgKiBhc3N1bWVkIHRoZSBjb250ZW50VHlwZSBoYXMgYWxyZWFkeSBiZWVuIGNoYW5nZWQsIGFuZCB0aGlzIG1ldGhvZCB1c2VzCi0JICogdGhlIHRleHQgb2YgdGhlIG9sZCBvbmUsIHRvIHJlcG9wdWxhdGUgdGhlIHRleHQgb2YgdGhlIG5ldyBvbmUuIEluCi0JICogdGhlb3J5LCB0aGUgYWN0dWFsIGluc3RhbmNlIGNvdWxkIGNoYW5nZSwgKGUuZy4gdXNpbmcgJ3NhdmVBcycgdG8gZ28KLQkgKiBmcm9tIHhtbCB0byBkdGQpLCBidXQgaW4gcHJhY3RpY2UsIHRoZSBpbnRlbnQgb2YgdGhpcyBBUEkgaXMgdG8gcmV0dXJuCi0JICogdGhlIHNhbWUgaW5zdGFuY2UsIGp1c3QgdXNpbmcgZGlmZmVyZW50IGhhbmRsZXJzLCBhZGFwdGVyIGZhY3RvcmllcywKLQkgKiBldGMuCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBpcyBzaW1pbGFyIHRvIHRoZSBnZXRNb2RlbCBtZXRob2QsIGV4Y2VwdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB1c2UKLQkgKiB0aGUgY2FjaGVkIHZlcnNpb24sIGJ1dCBmb3JjZXMgdGhlIGNhY2hlZCB2ZXJzaW9uIHRvIGJlIHJlcGxhY2VkIHdpdGggYQotCSAqIGZyZXNoLCB1bmNoYW5nZWQgdmVyc2lvbi4gTm90ZTogdGhpcyBtZXRob2QgZG9lcyBub3QgY2hhbmdlIGFueQotCSAqIHJlZmVyZW5jZSBjb3VudHMuIEFsc28sIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5IGEgY2FjaGVkIHZlcnNpb24gb2YgdGhlCi0JICogbW9kZWwsIHRoZW4gdGhpcyBjYWxsIGlzIGVzc2VudGlhbGx5IGlnbm9yZWQgKHRoYXQgaXMsIGl0IGRvZXMgbm90IHB1dAotCSAqIGEgbW9kZWwgaW4gdGhlIGNhY2hlKSBhbmQgcmV0dXJucyBudWxsLgotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWxvYWRNb2RlbChPYmplY3QgaWQsIElucHV0U3RyZWFtIGluU3RyZWFtKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZVN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCwgSUZpbGUgaUZpbGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTW9kZWxTdGF0ZUxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbFN0YXRlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGViZGQ4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lNb2RlbFN0YXRlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHRob3NlIHdhbnRpbmcgdG8gbGlzdGVuIHRvIGEgbW9kZWwncyBzdGF0ZSBjaGFuZ2luZy4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQotCS8qKgotCSAqIEEgbW9kZWwgaXMgYWJvdXQgdG8gYmUgY2hhbmdlZC4gVGhpcyB0eXBpY2FsbHkgaXMgaW5pdGlhdGVkIGJ5IG9uZQotCSAqIGNsaWVudCBvZiB0aGUgbW9kZWwsIHRvIHNpZ25hbCBhIGxhcmdlIGNoYW5nZSBhbmQvb3IgYSBjaGFuZ2UgdG8gdGhlCi0JICogbW9kZWwncyBJRCBvciBiYXNlIExvY2F0aW9uLiBBIHR5cGljYWwgdXNlIG1pZ2h0IGJlIGlmIGEgY2xpZW50IG1pZ2h0Ci0JICogd2FudCB0byBzdXNwZW5kIHByb2Nlc3NpbmcgdW50aWwgYWxsIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGUuCi0JICovCi0Jdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCk7Ci0KLQkvKioKLQkgKiBTaWduYWxzIHRoYXQgdGhlIGNoYW5nZXMgZm9yZXRvbGQgYnkgbW9kZWxBYm91dFRvQmVDaGFuZ2VkIGhhdmUgYmVlbgotCSAqIG1hZGUuIEEgdHlwaWNhbCB1c2UgbWlnaHQgYmUgdG8gcmVmcmVzaCwgb3IgdG8gcmVzdW1lIHByb2Nlc3NpbmcgdGhhdAotCSAqIHdhcyBzdXNwZW5kZWQgYXMgYSByZXN1bHQgb2YgbW9kZWxBYm91dFRvQmVDaGFuZ2VkLgotCSAqLwotCXZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpOwotCi0JLyoqCi0JICogTm90aWZpZXMgdGhhdCBhIG1vZGVsJ3MgZGlydHkgc3RhdGUgaGFzIGNoYW5nZWQsIGFuZCBwYXNzZXMgdGhhdCBzdGF0ZQotCSAqIGluIGlzRGlydHkuIEEgbW9kZWwgYmVjb21lcyBkaXJ0eSB3aGVuIGFueSBjaGFuZ2UgaXMgbWFkZSwgYW5kIGJlY29tZXMKLQkgKiBub3QtZGlydHkgd2hlbiB0aGUgbW9kZWwgaXMgc2F2ZWQuCi0JICovCi0Jdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSk7Ci0KLQkvKioKLQkgKiBBIG1vZGVsRGVsZXRlZCBtZWFucyB0aGUgdW5kZXJseWluZyByZXNvdXJjZSBoYXMgYmVlbiBkZWxldGVkLiBUaGUKLQkgKiBtb2RlbCBpdHNlbGYgaXMgbm90IHJlbW92ZWQgZnJvbSBtb2RlbCBtYW5hZ2VtZW50IHVudGlsIGFsbCBoYXZlCi0JICogcmVsZWFzZWQgaXQuIE5vdGU6IGJhc2VMb2NhdGlvbiBpcyBub3QgKG5lY2Vzc2FyaWx5KSBjaGFuZ2VkIGluIHRoaXMKLQkgKiBldmVudCwgYnV0IG1heSBub3QgYmUgYWNjdXJhdGUuCi0JICovCi0Jdm9pZCBtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKTsKLQotCS8qKgotCSAqIEEgbW9kZWwgaGFzIGJlZW4gcmVuYW1lZCBvciBjb3BpZWQgKGFzIGluIHNhdmVBcy4uKS4gSW4gdGhlIHJlbmFtZWQKLQkgKiBjYXNlLCB0aGUgdHdvIHBhcmFtZW50ZXJzIGFyZSB0aGUgc2FtZSBpbnN0YW5jZSwgYW5kIG9ubHkgY29udGFpbiB0aGUKLQkgKiBuZXcgaW5mbyBmb3IgaWQgYW5kIGJhc2UgbG9jYXRpb24uCi0JICovCi0Jdm9pZCBtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCBvbGRNb2RlbCwgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCk7Ci0KLQl2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQl2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4MTQxOGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGFsbG93cyBub2RlcyB0byBiZSBhZGFwdGVkLgotICogCi0gKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyB0eXBlIG9mIGFkYXB0ZXIgKElBZGFwdGFibGUpIGFuZCBiYXNlCi0gKiBhZGFwdGVyIGlzIHRoYXQgdGhlc2UgYWRhcHRlcnMgYXJlIG5vdGlmaWVkIG9mIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqIFRoZSBpbmZyYXN0cnVjdHVyZSBjYWxscyB0aGlzIG1ldGhvZCB0byBkZXRlcm1pbmUgaWYgdGhlIGFkYXB0ZXIgaXMKLQkgKiBhcHByb3ByaWF0ZSBmb3IgJ3R5cGUnLiBUeXBpY2FsbHksIGFkYXB0ZXJzIHJldHVybiB0cnVlIGJhc2VkIG9uCi0JICogaWRlbnRpdHkgY29tcGFyaXNvbiB0byAndHlwZScsIGJ1dCB0aGlzIGlzIG5vdCByZXF1aXJlZCwgdGhhdCBpcywgdGhlCi0JICogZGVjaXNpb24gY2FuIGJlIGJhc2VkIG9uIGNvbXBsZXggbG9naWMuCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqIFNlbnQgdG8gYWRhcHRlciB3aGVuIG5vdGlmaWVyIGNoYW5nZXMuIEVhY2ggbm90aWZpZXIgaXMgcmVzcG9uc2libGUgZm9yCi0JICogZGVmaW5pbmcgc3BlY2lmaWMgZXZlbnRUeXBlcywgZmVhdHVyZSBjaGFuZ2VkLCBldGMuCi0JICogCi0JICogSVNTVUU6IG1heSBiZSBtb3JlIGV2b2x2YWJsZSBpZiB0aGUgYXJndW1lbnQgd2FzIG9uZSBiaWcgJ25vdGlmaWVyCi0JICogZXZlbnQnIGluc3RhbmNlLgotCSAqLwotCXZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NjdjNDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotLyoqCi0gKiBJTm9kZU5vdGlmaWVycyBjYW4gYmUgYWRhcHRlZCBieSBJTm9kZUFkYXB0ZXJzLiBUaGlzIGZhY3RvcnkgaW50ZXJmYWNlCi0gKiBwcm92aWRlcyBhIHdheSB0byBwcm92aWRlIGZhY3RvcmllcyB3aGljaCBhcmUgaW52b2tlZCBieSB0aGUgaW5mcmFzdHJ1Y3R1cmUKLSAqIHRvIG1hbmFnZSB0aGlzIHByb2Nlc3MsIGZyb20gY3JlYXRpbmcsIHRvIGFkYXB0aW5nLCB0byByZWxlYXNpbmcsIGlmCi0gKiByZXF1aXJlZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQotCS8qKgotCSAqIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgYW4gYWRhcHRlciBmYWN0b3J5IGlzIHRvIGNyZWF0ZSBhbiBhZGFwdGVyIGFuZAotCSAqIGFzc29jaWF0ZSBpdCB3aXRoIGFuIElOb2RlTm90aWZpZXIuIFRoaXMgYWRhcHQgbWV0aG9kIE1ldGhvZCB0aGF0Ci0JICogcmV0dXJucyB0aGUgYWRhcHRlciBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIG9iamVjdC4gVGhlCi0JICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNhbGwgYWRkQWRhcHRlciBvbiB0aGUgYWRhcHRlZAotCSAqIG9iamVjdCB3aXRoIHRoZSBjb3JyZWN0IGluc3RhbmNlIG9mIHRoZSBhZGFwdGVyLCBpZiBhcHByb3ByaWF0ZS4KLQkgKiAKLQkgKiBOb3RlOiB0aGUgaW5zdGFuY2Ugb2YgdGhlIGFkYXB0ZXIgcmV0dXJuZWQgbWF5IGJlIGEgc2luZ2xldG9uIG9yIG5vdAotCSAqIC4uLiBkZXBlbmRpbmcgb24gdGhlIG5lZWRzIG9mIHRoZSBJTm9kZUFkYXB0ZXIgLi4uIGJ1dCBpbiBnZW5lcmFsIGl0IGlzCi0JICogcmVjb21tZW5kZWQgZm9yIGFuIGFkYXB0ZXIgdG8gYmUgc3RhdGVsZXNzLCBzbyB0aGUgZWZmaWNpZW5jaWVzIG9mIGEKLQkgKiBzaW5nbGV0b24gY2FuIGJlIGdhaW5lZC4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgbm9kZSBub3RpZmllciB0byBiZSBhZGFwdGVkCi0JICovCi0JSU5vZGVBZGFwdGVyIGFkYXB0KElOb2RlTm90aWZpZXIgb2JqZWN0KTsKLQotCS8qKgotCSAqIFVubGlrZSBjbG9uZSwgdGhpcyBtZXRob2QgbWF5IG9yIG1heSBub3QgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlLCBzdWNoCi0JICogYXMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIElBZGFwdGVyRmFjdG9yeSBpcyBpbnRlbmRlZCB0byBiZSBhIHNpbmdsZXRvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoaXMgYWRhcHRlciBmYWN0b3J5LgotCSAqLwotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKTsKLQotCS8qKgotCSAqIGlzRmFjdG9yeUZvclR5cGUgaXMgY2FsbGVkIGJ5IGluZnJhc3RydWN0dXJlIHRvIGRlY2lkZSBpZiB0aGlzIGFkYXB0ZXIKLQkgKiBmYWN0b3J5IGlzIGFwcG9yaWF0ZSB0byB1c2UgZm9yIGFuIGFkYXB0ZXIgcmVxdWVzdCB0aGF0IHNwZWNpZmllcwotCSAqICd0eXBlJy4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZSAtCi0JICogICAgICAgICAgICBzYW1lIG9iamVjdCB1c2VkIHRvIGlkZW50aWZ5L3JlcXVlc3QgYWRhcHRlcnMuCi0JICogQHJldHVybiB0cnVlIGlmIGZhY3RvcnkgaXMgYXBwcm9wcmlhdGUgZm9yIHR5cGUsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpOwotCi0JLyoqCi0JICogcmVsZWFzZSBpcyBjYWxsZWQgYnkgaW5mcmFzdHJ1Y3R1cmUgd2hlbiB0aGUgZmFjdG9yeSByZWdpc3RyeSBpcwotCSAqIHJlbGVhc2VkICh3aGljaCBpcyBkb25lIHdoZW4gYSBzdHJ1Y3R1cmVkIG1vZGVsIGlzIHJlbGVhc2VkKS4gVGhpcwotCSAqIGludGVuZWQgZm9yIHRoZSBmYWN0b3J5IHRvIGJlIGFsbG93ZWQgdG8gY2xlYW4gdXAgYW55IHN0YXRlIGluZm9ybWF0aW9uCi0JICogaXQgbWF5IGhhdmUuCi0JICogCi0JICogTm90ZTogd2hpbGUgbm90IHJlY29tbWVuZGVkLCBkdWUgdG8gcGVyZm9ybWFuY2UgcmVhc29ucywgaWYgaW5kaXZpZHVhbAotCSAqIGFkYXB0ZXJzIG5lZWQgc29tZSBjbGVhbnVwIChvciBuZWVkIHRvIGJlIHJlbGVhc2VkKSBpdCBpcyAodHlwaWNhbGx5KQotCSAqIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgYWRhcHRlciBmYWN0b3J5IHRvIHRyYWNrIHRoZW0sIGFuZCBpbml0aWF0ZQotCSAqIHdoYXQgZXZlciBjbGVhbiB1cCBpcyBuZWVkZWQuIEluIG90aGVyIHdvcmtzLCBjbGVhbnVwIGF0IHRoZSBhZGF0cGVyCi0JICogbGV2ZWwgaXMgbm90IHByb3ZpZGVkIGJ5IGluZnJhc3RydWN0dXJlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JTm9kZU5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMxMDNiMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lOb2RlTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBJTm9kZU5vdGlmaWVycyBhbmQgSU5vZGVBZGFwdGVycyBmb3JtIGEgY29sbGFib3JhdGlvbiB0aGF0IGFsbG93cyBjbGllbnRzCi0gKiB0byB1c2UgdGhlIHR5cGljYWwgYWRhcHRlciBwYXR0ZXJuIGJ1dCB3aXRoIG5vdGlmaWNhdGlvbiBhZGRlZCwgdGhhdCBpcywKLSAqIGNsaWVudCdzIGFkYXB0ZXJzIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgbm9kZU5vdGlmaWVyIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVOb3RpZmllciB7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSBub24tc3RydWN0dXJhbCBjaGFuZ2UsIHNlbnQgdG8gbm9kZSBub3RpZmllcidzCi0JICogcGFyZW50LgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFID0gMTsKLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYW4gYWRkIGV2ZW50LgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQUREID0gMjsKLQotCS8qKgotCSAqIFRoZSBjaGFuZ2UgcmVwcmVzZW50cyBhIHJlbW92ZSBldmVudC4KLQkgKi8KLQlzdGF0aWMgZmluYWwgaW50IFJFTU9WRSA9IDM7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSBzdHJ1Y3R1cmFsIGNoYW5nZSwgc2VudCB0byBsZWFzdC1jb21tb24gcGFyZW50Ci0JICogb2Ygbm9kZSBub3RpZmllcnMgaW52b2x2ZWQgaW4gdGhlIHN0cnVjdHVyYWwgY2hhbmdlCi0JICovCi0Jc3RhdGljIGZpbmFsIGludCBTVFJVQ1RVUkVfQ0hBTkdFRCA9IDQ7Ci0KLQkvKioKLQkgKiBUaGUgY2hhbmdlIHJlcHJlc2VudHMgYSBub3RpZmljYXRpb24gdG8gcGFyZW50IG5vdGlmaWVyIHRoYW4gaXRzCi0JICogY29udGVudHMgaGF2ZSBjaGFuZ2VkLgotCSAqLwotCXN0YXRpYyBmaW5hbCBpbnQgQ09OVEVOVF9DSEFOR0VEID0gNTsKLQotCi0JLyoqCi0JICogTk9UIEFQSTogdGhlc2Ugc3RyaW5ncyBhcmUgZm9yIHByaW50aW5nLCBzdWNoIGFzIGR1cmluZyBkZWJ1Z2luZwotCSAqLwotCXN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFVkVOVF9UWVBFX1NUUklOR1MgPSBuZXcgU3RyaW5nW117InVuZGVmaW5lZCIsICJDSEFOR0UiLCAiQUREIiwgIlJFTU9WRSIsICJTVFJVQ1VUUkVEX0NIQU5HRUQiLCAiQ09OVEVOVF9DSEFOR0VEIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JCAvLyROT04tTkxTLTYkCi0KLQotCS8qKgotCSAqIEFkZCBhbiBhZGFwdGVyIG9mIHRoaXMgbm90aWZpZXIuCi0JICogCi0JICogQHBhcmFtIGFkYXB0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBhZGFwdGVyIHRvIGJlIGFkZGVkCi0JICogCi0JICovCi0Jdm9pZCBhZGRBZGFwdGVyKElOb2RlQWRhcHRlciBhZGFwdGVyKTsKLQotCS8qKgotCSAqIFJldHVybiBhbiBleGlzaXRpbmcgYWRhcHRlciBvZiB0eXBlICJ0eXBlIiBvciBpZiBub25lIGZvdW5kIGNyZWF0ZSBhCi0JICogbmV3IGFkYXB0ZXIgdXNpbmcgYSByZWdpc3RlcmVkIGFkYXB0ZXIgZmFjdG9yeQotCSAqLwotCUlOb2RlQWRhcHRlciBnZXRBZGFwdGVyRm9yKE9iamVjdCB0eXBlKTsKLQotCS8qKgotCSAqIFJldHVybiBhIHJlYWQtb25seSBDb2xsZWN0aW9uIG9mIHRoZSBBZGFwdGVycyB0byB0aGlzIG5vdGlmaWVyLgotCSAqIAotCSAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBhZGFwdGVycy4KLQkgKi8KLQlDb2xsZWN0aW9uIGdldEFkYXB0ZXJzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gZXhpc2l0aW5nIGFkYXB0ZXIgb2YgdHlwZSAidHlwZSIgb3IgbnVsbCBpZiBub25lIGZvdW5kCi0JICovCi0JSU5vZGVBZGFwdGVyIGdldEV4aXN0aW5nQWRhcHRlcihPYmplY3QgdHlwZSk7Ci0KLQkvKioKLQkgKiBzZW50IHRvIGFkYXB0ZXIgd2hlbiBpdHMgbm9kZU5vdGlmaWVyIGNoYW5nZXMuCi0JICovCi0Jdm9pZCBub3RpZnkoaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcyk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgYW4gYWRhcHRlciBvZiB0aGlzIG5vdGlmaWVyLiBJZiB0aGUgYWRhcHRlciBkb2VzIG5vdCBleGlzdCBmb3IKLQkgKiB0aGlzIG5vZGUgbm90aWZpZXIsIHRoaXMgcmVxdWVzdCBpcyBpZ25vcmVkLgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgYWRhcHRlciB0byByZW1vdmUKLQkgKi8KLQl2b2lkIHJlbW92ZUFkYXB0ZXIoSU5vZGVBZGFwdGVyIGFkYXB0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JU3RydWN0dXJlZE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTdHJ1Y3R1cmVkTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE3OWFjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lTdHJ1Y3R1cmVkTW9kZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLm1vZGVsaGFuZGxlci5JTW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV4Y2VwdGlvbnMuUmVzb3VyY2VBbHJlYWR5RXhpc3RzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlSW5Vc2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLQotCi0vKioKLSAqIElTdHJ1Y3R1cmVkTW9kZWxzIGFyZSBtYWlubHkgaW50ZXJlc3RpbmcgYnkgdGhlaXIgZXh0ZW5zaW9ucyBhbmQKLSAqIGltcGxlbWVudGVycy4gVGhlIG1haW4gcHVycG9zZWQgb2YgdGhpcyBhYnN0cmFjdGlvbiBpcyB0byBwcm92aWRlIGEgY29tbW9uCi0gKiBtZWFucyB0byBtYW5hZ2UgbW9kZWxzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDIuMAotICogCi0gKiA8cD4KLSAqIElTU1VFOiB0aGlzIGludGVyZmFjZSBuZWVkcyB0b24gb2YgY2xlYW51cCEKLSAqIDwvcD4KLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZE1vZGVsIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVsJ3Mgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpciB0byBjaGFuZ2VkTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZAotCSAqIGJlZm9yZSBjaGFuZ2VkTW9kZWwuIEEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3Qgbm9yIGNhbGwgYWJvdXRUb0NoYW5nZU1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGNoYW5nZWRNb2RlbCBsYXRlciBmcm9tIHRoZSBzYW1lIFRocmVhZC4KLQkgKi8KLQl2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0Jdm9pZCBhZGRNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotCXZvaWQgYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKElNb2RlbFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogVGhpcyBBUEkgYWxsb3dzIGEgY2xpZW50IGNvbnRyb2xsZWQgd2F5IG9mIG5vdGlmeWluZyBhbGwgTW9kZWxFdmVudAotCSAqIGxpc3RlbmVycyB0aGF0IHRoZSBtb2RlbCBoYXMgYmVlbiBjaGFuZ2VkLiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQKLQkgKiBwYWlyIHRvIGFib3V0VG9DaGFuZ2VNb2RlbCwgYW5kIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFib3V0VG9DaGFuZ2VNb2RlbAotCSAqIC4uLiBvciBzb21lIGxpc3RlbmVycyBjb3VsZCBiZSBsZWZ0IHdhaXRpbmcgaW5kZWZpbml0ZWx5IGZvciB0aGUKLQkgKiBjaGFuZ2VkIGV2ZW50LiBTbywgaXRzIHN1Z2dlc3RlZCB0aGF0IGNoYW5nZWRNb2RlbCBhbHdheXMgYmUgaW4gYQotCSAqIGZpbmFsbHkgY2xhdXNlLiBMaWtld2lzZSwgYSBjbGllbnQgc2hvdWxkIG5ldmVyIGNhbGwgY2hhbmdlZE1vZGVsCi0JICogd2l0aG91dCBjYWxsaW5nIGFib3V0VG9DaGFuZ2VNb2RlbCBmaXJzdC4KLQkgKiAKLQkgKiBJbiB0aGUgY2FzZSBvZiBlbWJlZGRlZCBjYWxscywgdGhlIG5vdGlmaWNhdGlvbiBpcyBqdXN0IHNlbnQgb25jZS4KLQkgKiAKLQkgKi8KLQl2b2lkIGNoYW5nZWRNb2RlbCgpOwotCi0JbG9uZyBjb21wdXRlTW9kaWZpY2F0aW9uU3RhbXAoSVJlc291cmNlIHJlc291cmNlKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBjb3B5KFN0cmluZyBpZCkgdGhyb3dzIFJlc291cmNlSW5Vc2UsIFJlc291cmNlQWxyZWFkeUV4aXN0czsKLQotCS8qKgotCSAqIERpc2FibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCk7Ci0KLQkvKioKLQkgKiBFbmFibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBFbmQgcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY2xpZW50LWRlZmluZWQgdmFsdWUgZm9yIHdoYXQgdGhhdCBjbGllbnQgKGFuZC9vciBsb2FkZXIpCi0JICogY29uc2lkZXJzIHRoZSAiYmFzZSIgb2YgdGhlIHN0cnVjdHVyZWQgbW9kZWwuIEZyZXF1ZW50bHkgdGhlIGxvY2F0aW9uCi0JICogaXMgZWl0aGVyIGEgd29ya3NwYWNlIHJvb3QtcmVsYXRpdmUgcGF0aCBvZiBhIHdvcmtzcGFjZSByZXNvdXJjZSBvciBhbgotCSAqIGFic29sdXRlIHBhdGggaW4gdGhlIGxvY2FsIGZpbGUgc3lzdGVtLgotCSAqLwotCVN0cmluZyBnZXRCYXNlTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgY29udGVudCB0eXBlIGlkZW50aWZpZXIgKFN0cmluZykgZm9yIHRoaXMgbW9kZWwuCi0JICovCi0JU3RyaW5nIGdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBUaGUgbW9kZWwncyBGYWN0b3J5UmVnaXN0cnkuIEEgbW9kZWwgaXMgbm90IHZhbGlkIHdpdGhvdXQgb25lLgotCSAqLwotCUZhY3RvcnlSZWdpc3RyeSBnZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCS8qKgotCSAqIFRoZSBpZCBpcyB0aGUgaWQgdGhhdCB0aGUgbW9kZWwgbWFuYWdlciB1c2VzIHRvIGlkZW50aWZ5IHRoaXMgbW9kZWwKLQkgKi8KLQlTdHJpbmcgZ2V0SWQoKTsKLQotCS8qKgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGEgdGV4dCBvZmZzZXQgd2l0aGluIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50Ci0JICogQHJldHVybiBhbiBJbmRleGVkUmVnaW9uIGNvbnRhaW5pbmcgdGhpcyBvZmZzZXQgb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCUluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KTsKLQotCUlNb2RlbEhhbmRsZXIgZ2V0TW9kZWxIYW5kbGVyKCk7Ci0KLQlJTW9kZWxNYW5hZ2VyIGdldE1vZGVsTWFuYWdlcigpOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlZmVyZW5jZSBjb3VudCBvZiB1bmRlcmx5aW5nIG1vZGVsCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50KCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVkaXQtcmVzcG9uc2libGUgcmVmZXJlbmNlIGNvdW50IG9mCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiAgICAgICAgICAgIE9iamVjdCBUaGUgaWQgb2YgdGhlIG1vZGVsIFRPRE86IHRyeSB0byByZWZpbmUgdGhlIGRlc2lnbgotCSAqICAgICAgICAgICAgbm90IHRvIHVzZSB0aGlzIGZ1bmN0aW9uCi0JICovCi0JaW50IGdldFJlZmVyZW5jZUNvdW50Rm9yRWRpdCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWFkZXIgcmVmZXJlbmNlIGNvdW50IG9mIHVuZGVybHlpbmcgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICBPYmplY3QgVGhlIGlkIG9mIHRoZSBtb2RlbCBUT0RPOiB0cnkgdG8gcmVmaW5lIHRoZSBkZXNpZ24KLQkgKiAgICAgICAgICAgIG5vdCB0byB1c2UgdGhpcyBmdW5jdGlvbgotCSAqLwotCWludCBnZXRSZWZlcmVuY2VDb3VudEZvclJlYWQoKTsKLQotCU9iamVjdCBnZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoKTsKLQotCS8qKgotCSAqIEdldCBVUkkgcmVzb2x1dGlvbiBoZWxwZXIKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCVVSSVJlc29sdmVyIGdldFJlc29sdmVyKCk7Ci0KLQlJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JLyoqCi0JICogbW9kaWZpY2F0aW9uIGRhdGUgb2YgdW5kZXJseWluZyByZXNvdXJjZSwgd2hlbiB0aGlzIG1vZGVsIHdhcyBvcGVuLCBvcgotCSAqIGxhc3Qgc2F2ZWQuIChOb3RlOiBmb3IgdGhpcyB2ZXJzaW9uLCB0aGUgY2xpZW50IG11c3QgbWFuYWdlIHRoZQotCSAqIGFjY3VyYWN5IG9mIHRoaXMgZGF0YSkKLQkgKi8KLQlsb25nIGdldFN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0KLQkvKioKLQkgKiBHZXQgdW5kbyBtYW5hZ2VyLgotCSAqLwotCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGdldFVuZG9NYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzRGlydHkoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZSBtb2RlbCBpcyB3aXRoaW4gYQotCSAqICJhYm91dFRvQ2hhbmdlIiBhbmQgImNoYW5nZWQiIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTW9kZWxTdGF0ZUNoYW5naW5nKCk7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzTmV3KCk7Ci0KLQlib29sZWFuIGlzUmVpbml0aWFsaXphdGlvbk5lZWRlZCgpOwotCi0JLyoqCi0JICogVGhpcyBpcyBhIGNvbWJpbmF0aW9uIG9mIGlmIHRoZSBtb2RlbCBpcyBkaXJ0eSBhbmQgaWYgdGhlIG1vZGVsIGlzCi0JICogc2hhcmVkIGZvciB3cml0ZSBhY2Nlc3MuIFRoZSBsYXN0IHdyaXRlciBhcyB0aGUgcmVzcG9uc2liaWxpdHkgdG8gYmUKLQkgKiBzdXJlIHRoZSB1c2VyIGlzIHByb21wdGVkIHRvIHNhdmUuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYXZlTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgaXNTaGFyZWRGb3JSZWFkIG9yIGlzU2hhcmVkRm9yRWRpdAotCSAqIGlzIHRydWUuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yRWRpdCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhlCi0JICogdW5kZXJseWluZyBtb2RlbC4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkRm9yUmVhZCgpOwotCi0JLyoqCi0JICogbmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IHRoYXQgdGhlIG5ld0luc3RhbmNlIGNvbnRhaW5zCi0JICogbm8gY29udGVudC4gSXRzIHB1cnBvc2UgaXMgc28gY2xpZW50cyBjYW4gZ2V0IGEgdGVtcG9yYXJ5LCB1bm1hbmFnZWQsCi0JICogbW9kZWwgb2YgdGhlIHNhbWUgInR5cGUiIGFzIHRoZSBvcmlnaW5hbC4gTm90ZTogdGhlIGNsaWVudCBtYXkgc3RpbGwKLQkgKiBuZWVkIHRvIGRvIHNvbWUgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG1vZGVsIHJldHVybmVkIGJ5IG5ld0luc3RhbmNlLAotCSAqIGRlcGVuZGluZyBvbiBkZXNpcmVkIHVzZS4gRm9yIGV4YW1wbGUsIHRoZSBvbmx5IGZhY3RvcmllcyBpbiB0aGUKLQkgKiBuZXdJbnN0YW5jZSBhcmUgdGhvc2UgdGhhdCB3b3VsZCBiZSBub3JtYWxseSBiZSBjcmVhdGVkIGZvciBhIG1vZGVsIG9mCi0JICogdGhlIGdpdmVuIGNvbnRlbnRUeXBlLiBPdGhlcnMgYXJlIG5vdCBjb3BpZWQgYXV0b21hdGljYWxseSwgYW5kIGlmCi0JICogZGVzaXJlZCwgc2hvdWxkIGJlIGFkZGVkIGJ5IGNsaWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIG5ld0luc3RhbmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUGVyZm9ybXMgYSByZWluaXRpYWxpemF0aW9uIHByb2NlZHVyZS4gRm9yIHRoaXMgbW9kZWwuIE5vdGUgZm9yIGZ1dHVyZToKLQkgKiB0aGVyZSBtYXkgYmUgYSBkYXkgd2hlcmUgdGhlIG1vZGVsIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QgaXMgYQotCSAqIGRpZmZlcmVudCBpbnN0YW5jZSB0aGFuIHRoZSBpbnN0YW5jZSBpdCB3YXMgY2FsbGVkIG9uLiBUaGlzIHdpbGwgb2NjdXIKLQkgKiB3aGVuIHRoZXJlIGlzIGZ1bGwgc3VwcG9ydCBmb3IgInNhdmUgYXMiIHR5cGUgZnVuY3Rpb25zLCB3aGVyZSB0aGUKLQkgKiBtb2RlbCBjb3VsZCB0aGVvcmV0aWNhbGx5IGNoYW5nZSBjb21wbGV0ZWx5LgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgcmVpbml0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIG1vZGVsIHRvIGZyZWUgdXAgYW55IHJlc291cmNlcyBpdCBtaWdodCBiZQotCSAqIHVzaW5nLiBJbiBwYXJ0aWN1bGFyLCBpdHNlbGYsIGFzIHN0b3JlZCBpbiB0aGUgSU1vZGVsTWFuYWdlci4KLQkgKiAKLQkgKi8KLQl2b2lkIHJlbGVhc2VGcm9tRWRpdCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIG1vZGVsIHRvIGZyZWUgdXAgYW55IHJlc291cmNlcyBpdCBtaWdodCBiZQotCSAqIHVzaW5nLiBJbiBwYXJ0aWN1bGFyLCBpdHNlbGYsIGFzIHN0b3JlZCBpbiB0aGUgSU1vZGVsTWFuYWdlci4KLQkgKiAKLQkgKi8KLQl2b2lkIHJlbGVhc2VGcm9tUmVhZCgpOwotCi0JLyoqCi0JICogVGhpcyBmdW5jdGlvbiByZXBsZW5pc2hlcyB0aGUgbW9kZWwgd2l0aCB0aGUgcmVzb3VyY2Ugd2l0aG91dCBzYXZpbmcKLQkgKiBhbnkgcG9zc2libGUgY2hhbmdlcy4gSXQgaXMgdXNlZCB3aGVuIG9uZSBlZGl0b3IgbWF5IGJlIGNsb3NpbmcsIGFuZAotCSAqIHNwZWNpZmljYWxseSBzYXlzIG5vdCB0byBzYXZlIHRoZSBtb2RlbCwgYnV0IGFub3RoZXIgImRpc3BsYXkiIG9mIHRoZQotCSAqIG1vZGVsIHN0aWxsIG5lZWRzIHRvIGhhbmcgb24gdG8gc29tZSBtb2RlbCwgc28gbmVlZHMgYSBmcmVzaCBjb3B5LgotCSAqIAotCSAqIE9ubHkgdmFsaWQgZm9yIHVzZSB3aXRoIG1hbmFnZWQgbW9kZWxzLgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgcmVsb2FkKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIHJlbW92ZU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCByZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBBIG1ldGhvZCB0aGF0IG1vZGlmaWVzIHRoZSBtb2RlbCdzIHN5bmNocm9uaXphdGlvbiBzdGFtcCB0byBtYXRjaCB0aGUKLQkgKiByZXNvdXJjZS4gVHVybnMgb3V0IHRoZXJlJ3Mgc2V2ZXJhbCB3YXlzIG9mIGRvaW5nIGl0LCBzbyB0aGlzIGVuc3VyZXMgYQotCSAqIGNvbW1vbiBhbGdvcml0aG0uCi0JICovCi0Jdm9pZCByZXNldFN5bmNocm9uaXphdGlvblN0YW1wKElSZXNvdXJjZSByZXNvdXJjZSk7Ci0KLQl2b2lkIHJlc291cmNlRGVsZXRlZCgpOwotCi0Jdm9pZCByZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpOwotCi0Jdm9pZCBzYXZlKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBzYXZlKEVuY29kaW5nUnVsZSBlbmNvZGluZ1J1bGUpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCXZvaWQgc2F2ZShJRmlsZSBpRmlsZSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBzYXZlKElGaWxlIGlGaWxlLCBFbmNvZGluZ1J1bGUgZW5jb2RpbmdSdWxlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQl2b2lkIHNhdmUoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0Jdm9pZCBzZXRCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0Jhc2VMb2NhdGlvbik7Ci0KLQlwdWJsaWMgdm9pZCBzZXREaXJ0eVN0YXRlKGJvb2xlYW4gZGlydHlTdGF0ZSk7Ci0KLQl2b2lkIHNldEZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpOwotCi0JLyoqCi0JICogVGhlIGlkIGlzIHRoZSBpZCB0aGF0IHRoZSBtb2RlbCBtYW5hZ2VyIHVzZXMgdG8gaWRlbnRpZnkgdGhpcyBtb2RlbAotCSAqLwotCXZvaWQgc2V0SWQoU3RyaW5nIGlkKSB0aHJvd3MgUmVzb3VyY2VJblVzZTsKLQotCXZvaWQgc2V0TW9kZWxIYW5kbGVyKElNb2RlbEhhbmRsZXIgbW9kZWxIYW5kbGVyKTsKLQotCXZvaWQgc2V0TW9kZWxNYW5hZ2VyKElNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyKTsKLQotCXB1YmxpYyB2b2lkIHNldE5ld1N0YXRlKGJvb2xlYW4gbmV3U3RhdGUpOwotCi0JLyoqCi0JICogU2V0cyBhICJmbGFnIiB0aGF0IHJlaW5pdGlhbGl6YXRpb24gaXMgbmVlZGVkLgotCSAqLwotCXZvaWQgc2V0UmVpbml0aWFsaXplTmVlZGVkKGJvb2xlYW4gYik7Ci0KLQkvKioKLQkgKiBIb2xkcyBhbnkgZGF0YSB0aGF0IHRoZSByZWluaXRpYWxpemF0aW9uIHByb2NlZHVyZSBtaWdodCBmaW5kIHVzZWZ1bCBpbgotCSAqIHJlaW5pdGlhbGl6aW5nIHRoZSBtb2RlbC4gVGhpcyBpcyBoYW5keSwgc2luY2UgdGhlIHJlaW5pdGlhbGl6YXRpb24gbWF5Ci0JICogbm90IHRha2UgcGxhY2UgYXQgb25jZSwgYW5kIHNvbWUgIm9sZCIgZGF0YSBtYXkgYmUgbmVlZGVkIHRvIHByb3Blcmx5Ci0JICogdW5kbyBwcmV2aW91cyBzZXR0aW5ncy4gTm90ZTogdGhlIHBhcmFtZXRlciB3YXMgaW50ZW50aW9uYWxseSBtYWRlIHRvCi0JICogYmUgb2YgdHlwZSAnT2JqZWN0JyBzbyBkaWZmZXJlbnQgbW9kZWxzIGNhbiB1c2UgaW4gZGlmZmVyZW50IHdheXMuCi0JICovCi0Jdm9pZCBzZXRSZWluaXRpYWxpemVTdGF0ZURhdGEoT2JqZWN0IG9iamVjdCk7Ci0KLQkvKioKLQkgKiBTZXQgdGhlIFVSSSByZXNvbHV0aW9uIGhlbHBlcgotCSAqLwotCXZvaWQgc2V0UmVzb2x2ZXIoVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpOwotCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JLyoqCi0JICogU2V0IHVuZG8gbWFuYWdlci4KLQkgKi8KLQl2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSW5kZXhlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JbmRleGVkUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiZjVkY2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JbmRleGVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotCi0KLS8qKgotICogVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgcG9zaXRpb25zIGFuZCBsZW5ndGhzIGluIHNvdXJjZS4gTm90aWNlIHRoYXQKLSAqIHdoaWxlIGdldEVuZE9mZnNldCBhbmQgZ2V0TGVuZ3RoIGFyZSByZWR1bmRhbnQsIGdpdmVuIHRoYXQKLSAqIAotICogPHByZT4KLSAqIDxjb2RlPgotICogICAgICAgICAgZ2V0RW5kT2Zmc2V0KCkgPT0gZ2V0U3RhcnRPZmZzZXQoKSArIGdldExlbmd0aCgpOyAKLSAqIDwvY29kZT4KLSAqIDwvcHJlPgotICogCi0gKiB3ZSBwcm92aWRlIChyZXF1aXJlKSBib3RoIHNpbmNlIGluIHNvbWUgY2FzZXMgaW1wbGVtZW50b3JzIG1heSBiZSBhYmxlIHRvCi0gKiBwcm92aWRlIG9uZSBvciB0aGUgb3RoZXIgbW9yZSBlZmZpY2llbnRseS4KLSAqIAotICogTm90ZTogaXQgaXMgbm90IHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdCB0aGF0IGltcGxlbWVudG9ycyBvZiBJbmRleGVkUmVnaW9uIC0tCi0gKiBhcyBhIHdob2xlIGNvbGxlY3Rpb24gZm9yIGEgcGFydGljdWxhciBzb3VyY2UgLS0gbXVzdCBjb21wbGV0ZWx5IGNvdmVyIHRoZQotICogb3JpZ2luYWwgc291cmNlLiBUaGV5IGN1cnJlbnRseSBvZnRlbiBkbywgc28gdGhvdWdodCBJJ2QgbWVudGlvbiBleHBsaWNpdGx5Ci0gKiB0aGlzIG1heSBub3QgYWx3YXlzIGJlIHRydWUuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIEluZGV4ZWRSZWdpb24gewotCi0JLyoqCi0JICogQ2FuIGJlIHVzZWQgdG8gdGVzdCBpZiB0aGUgaW5kZXhlZCByZWdpb25zIGNvbnRhaW5zIHRoZSB0ZXN0IHBvc2l0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB0ZXN0UG9zaXRpb24KLQkgKiBAcmV0dXJuIHRydWUgaWYgdGVzdCBwb3NpdGlvbiBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gc3RhcnQgb2Zmc2V0Ci0JICogICAgICAgICBhbmQgbGVzcyB0aGFuIHN0YXJ0IG9mZnNldCBwbHVzIGxlbmd0aC4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zKGludCB0ZXN0UG9zaXRpb24pOwotCi0JLyoqCi0JICogQ2FuIGJlIHVzZWQgdG8gZ2V0IGVuZCBvZmZzZXQgb2Ygc291cmNlIHRleHQsIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZgotCSAqIGRvY3VtbnQuIEltcGxlbWVudGVycyBzaG91bGQgcmV0dXJuIC0xIGlmLCBvciBzb21lIHJlYXNvbiwgdGhlIHJlZ2lvbgotCSAqIGlzIG5vdCB2YWxpZC4KLQkgKiAKLQkgKiBAcmV0dXJuIGVuZG9mZnNldAotCSAqLwotCWludCBnZXRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIGdldCBzb3VyY2UgcG9zdGlvbiBvZiBiZWdpbm5pbmcgb2YgaW5kZXhlZCByZWdpb24uCi0JICogSW1wbGVtZW50ZXJzIHNob3VsZCByZXR1cm4gLTEgaWYsIG9yIHNvbWUgcmVhc29uLCB0aGUgcmVnaW9uIGlzIG5vdAotCSAqIHZhbGlkLgotCSAqIAotCSAqIEByZXR1cm4gaW50IHBvc2l0aW9uIG9mIHN0YXJ0IG9mIGluZGV4IHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0U3RhcnRPZmZzZXQoKTsKLQotCS8qKgotCSAqIENhbiBiZSB1c2VkIHRvIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzb3VyY2UgdGV4dC4gSW1wbGVtZW50ZXJzIHNob3VsZAotCSAqIHJldHVybiAtMSBpZiwgb3Igc29tZSByZWFzb24sIHRoZSByZWdpb24gaXMgbm90IHZhbGlkLgotCSAqIAotCSAqIEByZXR1cm4gaW50IHBvc2l0aW9uIG9mIGxlbmd0aCBvZiBpbmRleCByZWdpb24uCi0JICovCi0JaW50IGdldExlbmd0aCgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL1N0cnVjdHVyZWRNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU3RydWN0dXJlZE1vZGVsTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDE2ZmRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvU3RydWN0dXJlZE1vZGVsTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBDbGFzcyB0byBhbGxvdyBhY2Nlc3MgdG8gTW9kZWxNYW5hZ2VyLiBOb3QgaW50ZW5kZWQgdG8gYmUgc3ViY2xhc3NlZC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgb25lIHRoYXQgaXMgaW4KLSAqICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHRydWN0dXJlZE1vZGVsTWFuYWdlcgotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgU3RydWN0dXJlZE1vZGVsTWFuYWdlciB7Ci0JLyoqCi0JICogRG8gbm90IGFsbG93IGluc3RhbmNlcyB0byBiZSBjcmVhdGVkLgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZE1vZGVsTWFuYWdlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlIG9mIElNb2RlbE1hbmFnZXIuIFJldHVybnMgbnVsbCBpZiBtb2RlbAotCSAqIG1hbmFnZXIgY2FuIG5vdCBiZSBjcmVhdGVkIG9yIGlzIG5vdCB2YWxpZCAoc3VjaCBhcywgd2hlbiB3b3JrYmVuY2ggaXMKLQkgKiBzaHV0dGluZyBkb3duKS4KLQkgKiAKLQkgKiBAcmV0dXJuIElNb2RlbE1hbmFnZXIgLSByZXR1cm5zIHRoZSBvbmUgbW9kZWwgbWFuYWdlciBmb3Igc3RydWN0dXJlZAotCSAqICAgICAgICAgbW9kZWwKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSB0aGUgb25lIHRoYXQgaXMgaW4KLQkgKiAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3R0cnVjdHVyZWRNb2RlbE1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElNb2RlbE1hbmFnZXIgZ2V0TW9kZWxNYW5hZ2VyKCkgewotCQlib29sZWFuIGlzUmVhZHkgPSBmYWxzZTsKLQkJSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXIgPSBudWxsOwotCQl3aGlsZSAoIWlzUmVhZHkpIHsKLQkJCUJ1bmRsZSBsb2NhbEJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShTU0VDb3JlUGx1Z2luLklEKTsKLQkJCWludCBzdGF0ZSA9IGxvY2FsQnVuZGxlLmdldFN0YXRlKCk7Ci0JCQlpZiAoc3RhdGUgPT0gQnVuZGxlLkFDVElWRSkgewotCQkJCWlzUmVhZHkgPSB0cnVlOwotCQkJCS8vIGdldEluc3RhbmNlIGlzIGEgc3luY2hyb25pemVkIHN0YXRpYyBtZXRob2QuCi0JCQkJbW9kZWxNYW5hZ2VyID0gTW9kZWxNYW5hZ2VySW1wbC5nZXRJbnN0YW5jZSgpOwotCQkJfQotCQkJZWxzZSBpZiAoc3RhdGUgPT0gQnVuZGxlLlNUQVJUSU5HKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJVGhyZWFkLnNsZWVwKDEwMCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIGlnbm9yZSwganVzdCBsb29wIGFnYWluCi0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoc3RhdGUgPT0gQnVuZGxlLlNUT1BQSU5HIHx8IHN0YXRlID09IEJ1bmRsZS5VTklOU1RBTExFRCkgewotCQkJCWlzUmVhZHkgPSB0cnVlOwotCQkJCW1vZGVsTWFuYWdlciA9IG51bGw7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBub3Qgc3VyZSBhYm91dCBvdGhlciBzdGF0ZXMsICdyZXNvbHZlZCcsICdpbnN0YWxsZWQnCi0JCQkJaXNSZWFkeSA9IHRydWU7Ci0JCQkJbW9kZWxNYW5hZ2VyID0gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbW9kZWxNYW5hZ2VyOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSUVuY29kZWREb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRW5jb2RlZERvY3VtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MTk0YWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRW5jb2RlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgc3RyaWN0bHkgdG8gZGVmaW5lIGltcG9ydGFudCAiZG9jdW1lbnQgcHJvcGVydGllcyIgbm90Ci0gKiBmb3VuZCBpbiBJRG9jdW1lbnQsIGJ1dCBub3QgY2VudHJhbCB0byAiU3RydWN0dXJlZERvY3VtZW50Ii4KLSAqIAotICogSXRzIG5vdCB0byBiZSBiZSBpbXBsbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUVuY29kZWREb2N1bWVudCBleHRlbmRzIElEb2N1bWVudCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuY29kaW5nIG1lbWVudG8gZm9yIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcHJlZmVycmVkIGxpbmUgZGVsaW1pdGVyIGZvciB0aGlzIGRvY3VtZW50LgotCSAqLwotCVN0cmluZyBnZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqIAotCSAqIElzIG5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seSBkb2N1bWVudCBjcmVhdGlvbiBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhbEVuY29kaW5nTWVtZW50bwotCSAqLwotCXZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBsb2NhbEVuY29kaW5nTWVtZW50byk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBwcmVmZXJyZWRMaW5lRGVsaW1pdGVyLiBJcyBub3QgdG8gYmUgY2FsbGVkIGJ5IGNsaWVudHMsIG9ubHkKLQkgKiBkb2N1bWVudCBjcmVhdGlvbiBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9iYWJsZUxpbmVEZWxpbWl0ZXIKLQkgKi8KLQl2b2lkIHNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIHByb2JhYmxlTGluZURlbGltaXRlcik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTdHJ1Y3R1cmVkRG9jdW1lbnRQcm9wb3NlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDdkZDZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSVN0cnVjdHVyZWREb2N1bWVudFByb3Bvc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotCi0KLS8qKgotICogQSBJU3RydWN0dXJlZERvY3VtZW50IGlzIGEgY29sbGVjdGlvbiBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLiBJdCdzCi0gKiBvZnRlbiBjYWxsZWQgYSAiZmxhdCBtb2RlbCIgYmVjYXVzZSBpdHMgZG9lcyBjb250YWluIHNvbWUgc3RydWN0dXJhbAotICogaW5mb3JtYXRpb24sIGJ1dCBub3QgdmVyeSBtdWNoLCB1c3VhbGx5LCBhdCBtb3N0LCBhIGZldyBsZXZlbHMgb2YKLSAqIGNvbnRhaW5tZW50LgotICogCi0gKiBDbGllbnRzIHNob3VsZCBub3QgaW1wbGVtZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZERvY3VtZW50UHJvcG9zZWQgZXh0ZW5kcyBJRG9jdW1lbnQsIElEb2N1bWVudEV4dGVuc2lvbiwgSUFkYXB0YWJsZSB7Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgY2hhbmdpbmcgbGlzdGVuZXJzIHJlY2VpdmVzIHRoZSBzYW1lIGV2ZW50cyBhcyB0aGUKLQkgKiBkb2N1bWVudCBsaXN0ZW5lcnMsIGJ1dCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgdGltaW5nIGFuZAotCSAqIHN5bmNocm9uaXphdGlvbiBvZiBkYXRhIGNoYW5nZXMgYW5kIG5vdGlmaWNhdGlvbnMuCi0JICovCi0Jdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogdGhpcyBBUEkgZW5zdXJlcyB0aGF0IGFueSBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCB3aXRoaW4gc3RhcnRPZmYgdG8KLQkgKiBsZW5ndGggaXMgbm90IHJlYWRvbmx5ICh0aGF0IGlzLCB0aGF0IGl0cyBlZGl0YWJsZSkuIE5vdGUgdGhhdCBpZiB0aGUKLQkgKiByYW5nZSBvdmVybGFwcyB3aXRoIG90aGVyIHJlYWRvbmx5IHJlZ2lvbnMsIHRob3NlIG90aGVyIHJlYWRvbmx5Ci0JICogcmVnaW9ucyB3aWxsIGJlIGFkanVzdGVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBhbnkgcG9ydGlvbiBvZiBzdGFydE9mZnNldCB0byBsZW5ndGggaXMgcmVhZG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcmVnaW9uIGNvbnRhaW5lZCBieSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpOwotCi0JLyoqCi0JICogUmVzdHVybnMgYSBsaXN0IG9mIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbnMuCi0JICogCi0JICogTm90ZTogcG9zc2libHkgZXhwZW5zaXZlIGNhbGwsIG5vdCB0byBiZSB1c2VkIGNhc3VhbGx5LgotCSAqIAotCSAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbnMuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZ2V0UmVnaW9uTGlzdCgpOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogU2FtZSBhcyAnZ2V0JyBpbiBzdXBlciBjbGFzcywgYWRkZWQgZm9yIGRlc2NyaXB0aXZlbmVzcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IG9mIHRoaXMgZG9jdW1lbnQuCi0JICovCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCS8qKgotCSAqIGNhdXNlcyB0aGF0IHBvcnRpb24gb2YgdGhlIGRvY3VtZW50IGZyb20gc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIHRvIGJlCi0JICogbWFya2VkIGFzIHJlYWRvbmx5LiBOb3RlIHRoYXQgaWYgdGhpcyByYW5nZSBvdmVybGFwcyB3aXRoIHNvbWUgb3RoZXIKLQkgKiByZWdpb24gd2l0aCBpcyByZWFkb25seSwgdGhlIHJlZ2lvbnMgYXJlIGVmZmVjdGl2bHkgY29tYmluZWQuCi0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqLwotCXZvaWQgbWFrZVJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiBuZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgaXQgY29udGFpbnMgbm8gZGF0YS4gT25lCi0JICogaW1wb3J0YW50IHRoaW5nIHRvIGR1cGxpY2F0ZSBpcyB0aGUgcGFyc2VyLCB3aXRoIHRoZSBwYXJzZXIgY29ycmVjdGx5Ci0JICogImNsb25lZCIsIGluY2x1ZGluZyBpdHMgdG9rZW5pbnplciwgYmxvY2sgdGFncywgZXRjLgotCSAqIAotCSAqIE5PVEU6IGV2ZW4gYWZ0ZXIgb2J0YWluaW5nIGEgJ25ld0luc3RhbmNlJyB0aGUgY2xpZW50IG1heSBoYXZlIHRvIGRvCi0JICogc29tZSBpbml0aWFsaXphdGlvbiwgZm9yIGV4YW1wbGUsIGl0IG1heSBuZWVkIHRvIGFkZCBpdHMgb3duIG1vZGVsCi0JICogbGlzdGVuZXJzLiBPciwgYXMgYW5vdGhlciBleGFtcGxlLCBpZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBoYXMgYQotCSAqIHBhcnNlciBvZiB0eXBlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblBhcnNlciwgdGhlbiB0aGUgY2xpZW50IG1heSBuZWVkCi0JICogdG8gYWRkIGl0cyBvd24gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciB0byB0aGF0IHBhcnNlciwgaWYgaXQgaXMKLQkgKiBpbiBmYWN0IG5lZWRlZC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UHJvcG9zZWQgbmV3SW5zdGFuY2UoKTsKLQotCS8qKgotCSAqIFRoZSBkb2N1bWVudCBjaGFuZ2luZyBsaXN0ZW5lcnMgcmVjZWl2ZXMgdGhlIHNhbWUgZXZlbnRzIGFzIHRoZQotCSAqIGRvY3VtZW50IGxpc3RlbmVycywgYnV0IHRoZSBkaWZmZXJlbmNlIGlzIHRoZSB0aW1pbmcgYW5kCi0JICogc3luY2hyb25pemF0aW9uIG9mIGRhdGEgY2hhbmdlcyBhbmQgbm90aWZpY2F0aW9ucy4KLQkgKi8KLQl2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIEFQSXMgdG8gbWFuaXB1bGF0ZSB0aGUgSVN0cnVjdHVyZWREb2N1bWVudC4KLQkgKiAKLQkgKiByZXBsYWNlVGV4dCByZXBsYWNlcyB0aGUgdGV4dCBmcm9tIG9sZFN0YXJ0IHRvIG9sZEVuZCB3aXRoIHRoZSBuZXcgdGV4dAotCSAqIGZvdW5kIGluIHRoZSByZXF1ZXN0ZWRDaGFuZ2Ugc3RyaW5nLiBJZiBvbGRTdGFydCBhbmQgb2xkRW5kIGFyZSBlcXVhbCwKLQkgKiBpdCBpcyBhbiBpbnNlcnRpb24gcmVxdWVzdC4gSWYgcmVxdWVzdGVkQ2hhbmdlIGlzIG51bGwgKG9yIGVtcHR5KSBpdCBpcwotCSAqIGEgZGVsZXRlIHJlcXVlc3QuIE90aGVyd2lzZSBpdCBpcyBhIHJlcGxhY2UgcmVxdWVzdC4KLQkgKiAKLQkgKiBTaW1pbGFyIHRvICdyZXBsYWNlJyBpbiBzdXBlciBjbGFzcy4KLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgb2xkU3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHJlcXVlc3RlZENoYW5nZSk7Ci0KLQkvKioKLQkgKiBOb3RlLCBzYW1lIGFzIHJlcGxhY2VUZXh0IEFQSSwgYnV0IHdpbGwgYWxsb3cgcmVhZG9ubHkgYXJlYXMgdG8gYmUKLQkgKiByZXBsYWNlZC4gVGhpcyBtZXRob2QgaXMgbm90IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLCBvbmx5Ci0JICogaW5mcmFzdHJ1Y3R1cmUuIEZvciBleGFtcGxlLCBvbmUgY2FzZSB3aGVyZSBpdHMgb2sgaXMgd2l0aCB1bmRvCi0JICogb3BlcmF0aW9ucyAoc2luY2UsIHByZXN1bWFibHksIGlmIHVzZXIganVzdCBkaWQgc29tZXRoaW5nIHRoYXQKLQkgKiBoYXBwZW5kZWQgdG8gaW52b2x2ZSBzb21lIGluc2VydGluZyByZWFkb25seSB0ZXh0LCB0aGV5IHNob3VsZCBub3JtYWxseQotCSAqIGJlIGFsbG93ZWQgdG8gc3RpbGwgdW5kbyB0aGF0IG9wZXJhdGlvbi4gVGhlcmUgbWlnaHQgYmUgb3RoZXIgY2FzZXMKLQkgKiB3aGVyZSBpdHMgdXNlZCB0byBnaXZlIHRoZSB1c2VyIGEgY2hvaWNlLCBlLmcuICJ5b3UgYXJlIGFib3V0IHRvCi0JICogb3ZlcndyaXRlIHJlYWQgb25seSBwb3J0aW9ucywgZG8geW91IHdhbnQgdG8gY29udGludWUiLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG92ZXJyaWRlUmVhZE9ubHlyZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgb2xkU3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIHJlcXVlc3RlZENoYW5nZSk7Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIEFQSXMgdG8gbWFuaXB1bGF0ZSB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBpbiB0ZXJtcyBvZiBUZXh0LgotCSAqIAotCSAqIFRoZSBzZXRUZXh0IG1ldGhvZCByZXBsYWNlcyBhbGwgdGV4dCBpbiB0aGUgbW9kZWwuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlciAtCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IHJlcXVlc3RpbmcgdGhlIGRvY3VtZW50IGJlIGNyZWF0ZWQuCi0JICogQHBhcmFtIGFsbFRleHQgLQotCSAqICAgICAgICAgICAgYWxsIHRoZSB0ZXh0IG9mIHRoZSBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIE5ld0RvY3VtZW50RXZlbnQgLSBiZXNpZGVzIGNhdXNpbmcgdGhpcyBldmVudCB0byBiZSBzZW50IHRvCi0JICogICAgICAgICBkb2N1bWVudCBsaXN0ZW5lcnMsIHRoZSBldmVudCBpcyByZXR1cm5lZC4KLQkgKi8KLQlOZXdEb2N1bWVudEV2ZW50IHNldFRleHQoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGFsbFRleHQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5jb2RpbmcgbWVtZW50byBmb3IgdGhpcyBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmNvZGluZyBtZW1lbnRvIGZvciB0aGlzIGRvY3VtZW50LgotCSAqLwotCUVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpbmUgZGVsaW1pdGVyIGRldGVjdGVkIHdoZW4gdGhpcyBkb2N1bWVudCB3YXMgcmVhZCBmcm9tCi0JICogc3RvcmFnZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGxpbmUgZGVsaW1pdGVyIGRldGVjdGVkIHdoZW4gdGhpcyBkb2N1bWVudCB3YXMgcmVhZCBmcm9tCi0JICogICAgICAgICBzdG9yYWdlLgotCSAqLwotCVN0cmluZyBnZXREZXRlY3RlZExpbmVEZWxpbWl0ZXIoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGVuY29kaW5nIG1lbWVudG8gZm9yIHRoaXMgZG9jdW1lbnQuCi0JICogCi0JICogSXMgbm90IHRvIGJlIGNhbGxlZCBieSBjbGllbnRzLCBvbmx5IGRvY3VtZW50IGNyZWF0aW9uIGNsYXNzZXMuCi0JICogCi0JICogQHBhcmFtIGxvY2FsRW5jb2RpbmdNZW1lbnRvCi0JICovCi0Jdm9pZCBzZXRFbmNvZGluZ01lbWVudG8oRW5jb2RpbmdNZW1lbnRvIGxvY2FsRW5jb2RpbmdNZW1lbnRvKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGRldGVjdGVkIGxpbmUgZGVsaW1pdGVyIHdoZW4gdGhlIGRvY3VtZW50IHdhcyByZWFkLiBJcyBub3QgdG8KLQkgKiBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seSBkb2N1bWVudCBjcmVhdGlvbiBjbGFzc2VzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9iYWJsZUxpbmVEZWxpbWl0ZXIKLQkgKi8KLQl2b2lkIHNldERldGVjdGVkTGluZURlbGltaXRlcihTdHJpbmcgcHJvYmFibGVMaW5lRGVsaW1pdGVyKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgYSB3YXkgZm9yIGNsaWVudHMgdG8gY29tcGFyZSBhIHN0cmluZyB3aXRoIGEKLQkgKiByZWdpb24gb2YgdGhlIGRvY3VtbmV0LCB3aXRob3V0IGhhdmluZyB0byByZXRyaWV2ZSAoY3JlYXRlKSBhIHN0cmluZwotCSAqIGZyb20gdGhlIGRvY3VtZW50LCB0aHVzIG1vcmUgZWZmaWNpZW50IG9mIGxvdHMgb2YgY29tcGFyaXNvbnMgYmVpbmcKLQkgKiBkb25lLgotCSAqIAotCSAqIEBwYXJhbSBpZ25vcmVDYXNlIC0KLQkgKiAgICAgICAgICAgIGlmIHRydWUgdGhlIGNoYXJhY3RlcnMgYXJlIGNvbXBhcmVkIGJhc2VkIG9uIGlkZW50aXR5LiBJZgotCSAqICAgICAgICAgICAgZmFsc2UsIHRoZSBzdHJpbmcgYXJlIGNvbXBhcmVkIHdpdGggY2FzZSBhY2NvdW50ZWQgZm9yLgotCSAqIEBwYXJhbSB0ZXN0U3RyaW5nIC0KLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gY29tcGFyZS4KLQkgKiBAcGFyYW0gZG9jdW1lbnRPZmZzZXQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGluIHRoZSBvZmZzZXQgdG8gc3RhcnQgdGhlIGNvbXBhcmlzb24uCi0JICogQHBhcmFtIGxlbmd0aCAtCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIGluIHRoZSBkb2N1bWVudCB0byBjb21wYXJlIChOb3RlOiB0ZWNobmljYWxseSwKLQkgKiAgICAgICAgICAgIGNsaWVudHMgY291bGQganVzdCBwcm92aWRlIHRoZSBzdHJpbmcsIGFuZCB3ZSBjb3VsZCBpbmZlcgotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBmcm9tIHRoZSBzdHJpbmcgc3VwcGxpZWQsIGJ1dCB0aGlzIGxlYXZlcyBldmVyeQotCSAqICAgICAgICAgICAgY2xpZW50IHRvIGNvcnJlY3RseSBub3QgZXZlbiBhc2sgdXMgaWYgdGhlIHRoZSBzdHJpbmcgbGVuZ3RoCi0JICogICAgICAgICAgICBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCBsZW5ndGgsIHNvIHRoaXMgaXMgYW4gZWZmb3J0IHRvCi0JICogICAgICAgICAgICBtYXhpbWl6ZSBwZXJmb3JtYW5jZSB3aXRoIGNvcnJlY3QgY29kZS4KLQkgKiBAcmV0dXJuIHRydWUgaWYgbWF0Y2hlcywgZmFsc2Ugb3RoZXJ3aXNlLgotCSAqLwotCWJvb2xlYW4gc3RyaW5nTWF0Y2hlcyhib29sZWFuIGlnbm9yZUNhc2UsIFN0cmluZyB0ZXN0U3RyaW5nLCBpbnQgZG9jdW1lbnRPZmZzZXQsIGludCBsZW5ndGgpOwotCQotCVBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBvZmZzZXQsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHR5cGUpOwotCQotCVBvc2l0aW9uIGNyZWF0ZVBvc2l0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIHR5cGUpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9BYm91dFRvQmVDaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0Fib3V0VG9CZUNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODNlNzVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0Fib3V0VG9CZUNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHNlbmQgdG8gc3RydWN0dXJlZCBkb2N1bWVudCBsaXN0ZW5lcnMuIEl0IGlzIHBlcmZlY3RseQotICogYW5hbGFnb3VzIHRvIGl0cyBjb3JyZXNwb25kaW5nIGpmYWNlIERvY3VtZW50RXZlbnQgYW5kIGlzIHByb3ZpZGVkIHNpbXBseQotICogdG8gYWxsb3cgY2xpZW50cyB0byBkaXN0aW5ndWlzaCB0aGUgc291cmNlIG9mIHRoZSBldmVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBYm91dFRvQmVDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGludm9sdmVkIGluIHRoZSBjaGFuZ2UKLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIKLQkgKiAgICAgICAgICAgIHNvdXJjZSBvZiBvcmlnaW5hbCByZXF1ZXN0Ci0JICogQHBhcmFtIGNoYW5nZXMKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IGNoYW5nZXMKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBvZmZzZXQgb2YgcmVxdWVzdAotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UKLQkgKiAgICAgICAgICAgIGFtb3VudCwgaWYgYW55LCBvZiByZXBsYWNlZCB0ZXh0Ci0JICovCi0JcHVibGljIEFib3V0VG9CZUNoYW5nZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZjgxODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLQotCi0vKioKLSAqIENsaWVudHMgY2FuIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSwgYW5kIHJlZ2lzdGVyIHdpdGggdGhlCi0gKiBzdHJ1Y3R1cmVkRG9jdW1lbnQgdXNpbmcgYWRkQWJvdXRUb0JlQ2hhbmdlZExpc3RuZXIgdG8gYmUgbm90aWZpZWQgdGhhdCB0aGUKLSAqIHN0cnVjdHVyZWREb2N1bWVudCBpcyBhYm91dCB0byBiZSBjaGFuZ2VkLCBidXQgaGFzbid0IGJlZW4gY2hhbmdlZCBhdCB0aGUKLSAqIHRpbWUgdGhpcyBldmVudCBpcyBmaXJlZC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgewotCi0Jdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoQWJvdXRUb0JlQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL0lTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjJhMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgd2lsbCBiZSByZW1vdmVkIHNpbmNlIHdlIG5vdyBzdWJjbGFzcyBEb2N1bWVudEV2ZW50LgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCi0JcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci0KLQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQotCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9OZXdEb2N1bWVudENvbnRlbnRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvTmV3RG9jdW1lbnRDb250ZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RiZDE3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9OZXdEb2N1bWVudENvbnRlbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLQotLyoqCi0gKiBUaGUgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQgaXMgZmlyZWQgd2hlbiBhbiBpbnN0YW5jZSBvZiBhCi0gKiBJU3RydWN0dXJlZERvY3VtZW50IHJlcGxhY2VzIGFsbCBvZiBpdHMgdGV4dC4KLSAqIAotICogSVNTVUU6IG5vdCBjdXJyZW50bHkgdXNlZCwgYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSBlZmZpY2llbmNpZXMgdG8gYmUgaGFkIHNvCi0gKiBwbGFuIHRvIGltcGxlbWVudC4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdEb2N1bWVudENvbnRlbnRFdmVudCBleHRlbmRzIE5ld0RvY3VtZW50RXZlbnQgewotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhpcyBldmVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcmVxdWVzdGVyIG9mIHRoZSBjaGFuZ2UKLQkgKi8KLQlwdWJsaWMgTmV3RG9jdW1lbnRDb250ZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3Rlcik7Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05ld0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY3OGNlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9OZXdEb2N1bWVudEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIFRoZSBOZXdEb2N1bWVudEV2ZW50IGlzIGZpcmVkIHdoZW4gYW4gaW5zdGFuY2Ugb2YgYSBJU3RydWN0dXJlZERvY3VtZW50Ci0gKiBzZXRzIG9yIHJlcGxhY2VzIGFsbCBvZiBpdHMgdGV4dC4KLSAqIAotICogSVNTVUU6IG5lZWQgdG8gY2hhbmdlIHNvIHRoaXMgaXMgdXNlZCBmb3IgJ3NldCcgb25seS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXdEb2N1bWVudEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBOZXdEb2N1bWVudEV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgYmVpbmcgY2hhbmdlZAotCSAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3RlcgotCSAqICAgICAgICAgICAgc291cmNlIG9mIHJlcXVlc3QKLQkgKi8KLQlwdWJsaWMgTmV3RG9jdW1lbnRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIpIHsKLQkJc3VwZXIoZG9jdW1lbnQsIG9yaWdpbmFsUmVxdWVzdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gaW50IHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbmV3IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBkb2Vzbid0IG1lYW4gcXVpdGUgdGhlIHNhbWUgdGhpbmcgYXMgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKiBFdmVudHMgaW4gdGhlIHN1cGVyIGNsYXNzLiBJdCBhbHdheXMgd2lsbCByZXR1cm4gemVyby4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCBmb3IgYSBuZXdEb2N1bWVudCwgdGhlIG9mZnNldCBvZiBpcyBhbHdheXMgMAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiBGb3IgYSBuZXcgZG9jdW1lbnQsIHRoZSB0ZXh0IGludm9sdmVkIGlzIHRoZSBjb21wbGV0ZSB0ZXh0LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHRoZSB0ZXh0IHRoYXQgaXMgdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhlIGRvY3VtbmV0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdHMgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRUZXh0KCk7Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05vQ2hhbmdlRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL05vQ2hhbmdlRXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y1ZTc4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9Ob0NoYW5nZUV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIFRoaXMgZXZlbnQgaXMgc2VudCBpZiwgYWZ0ZXIgYW5hbHlzaXMsIGl0IGlzIGZvdW5kIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwotICogY2hhbmdlIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQuIFRoaXMgbWlnaHQgb2NjdXIsIGZvciBleGFtcGxlLCBpZiBzb21lb25lCi0gKiBwYXN0ZXMgaW4gdGhlIGV4YWN0IHNhbWUgdGV4dCB0aGF0IHRoZXkgYXJlIHJlcGxhY2luZywgb3IgaWYgc29tZW9uZSB0cmllcwotICogdG8gY2hhbmdlIGEgcmVhZC1vbmx5IHJlZ2lvbi4KLSAqIAotICogVGhpcyBtaWdodCBiZSBpbXBvcnRhbnQsIGZvciBleGFtcGxlLCBpZiBzb21lIHN0YXRlIHZhcmlhYmxlcyBhcmUgc2V0IG9uIGFuCi0gKiAiYWJvdXQgdGhlIGNoYW5nZSIgZXZlbnQuIHRoZW4gaWYgdGhlcmUgaXMgbm8gY2hhbmdlIChpLmUubm8gb3RoZXIgZXZlbnQgaXMKLSAqIGZpcmVkKSwgdGhvc2Ugc3RhdGUgdmFyaWFibGVzIGNvdWxkIHJlc2V0LCBvciB3aGF0ZXZlciwgdXBvbiByZWNlaXZpbmcgdGhpcwotICogZXZlbnQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgTm9DaGFuZ2VFdmVudCBleHRlbmRzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHsKLQkvKioKLQkgKiBOT19DT05URU5UX0NIQU5HRSBtZWFucyB0aGF0IGEgc29tZSB0ZXh0IHdhcyByZXF1ZXN0ZWQgdG8gYmUgcmVwbGFjZWQKLQkgKiB3aXRoIGlkZW50aWNhbCB0ZXh0LCBzbyBubyBjaGFuZ2UgaXMgYWN0dWFsbHkgZG9uZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIGludCBOT19DT05URU5UX0NIQU5HRSA9IDI7Ci0JLyoqCi0JICogTk9fRVZFTlQgaXMgdXNlZCBpbiByYXJlIGVycm9yIGNvbmRpdGlvbnMsIHdoZW4sIGJhc2ljYWxseSwgYSByZXF1ZXN0Ci0JICogdG8gY2hhbmdlIHRoZSBkb2N1bWVudCBpcyBtYWRlIGJlZm9yZSB0aGUgcHJldmlvdXMgcmVxdWVzdCBoYXMKLQkgKiBjb21wbGV0ZWQuIFRoaXMgZXZlbnQgdG8gdXNlZCBzbyBhYm91dFRvQ2hhbmdlL0NoYW5nZWQgY3ljbGVzIGNhbgotCSAqIGNvbXBsZXRlIGFzIHJlcXVpcmVkLCBidXQgdGhlIGRvY3VtZW50IGlzIG1vc3QgbGlrZWx5IG5vdCBtb2RpZmllZCBhcwotCSAqIGV4cGVjdGVkLgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5PX0VWRU5UID0gODsKLQkvKioKLQkgKiBSRUFEX09OTFlfU1RBVEVfQ0hBTkdFIG1lYW5zIHRoYXQgdGhlICJyZWFkIG9ubHkiIHN0YXRlIG9mIHRoZSB0ZXh0IHdhcwotCSAqIGNoYW5nZWQsIG5vdCB0aGUgY29udGVudCBpdHNlbGYuCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgUkVBRF9PTkxZX1NUQVRFX0NIQU5HRSA9IDQ7Ci0KLQkvKioKLQkgKiBzZXQgdG8gb25lIG9mIHRoZSBhYm92ZSBkZXRhaWxlZCByZWFzb25zIGZvciB3aHkgbm8gY2hhbmdlIHdhcyBkb25lLgotCSAqLwotCXB1YmxpYyBpbnQgcmVhc29uID0gMDsKLQotCS8qKgotCSAqIE5vQ2hhbmdlRXZlbnQgY29uc3RydWN0b3IuIFRoaXMgZXZlbnQgY2FuIG9jY3VyIGlmIHRoZXJlIHdhcyBhIHJlcXVlc3QKLQkgKiB0byBtb2RpZnkgYSBkb2N1bWVudCBvciBpdHMgcHJvcGVydGllcywgYnV0IHRoZXJlIGFzIG5vdCByZWFsbHkgaXMgbm8KLQkgKiBjaGFuZ2UgdG8gYSBkb2N1bWVudCdzIGNvbnRlbnQuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZQotCSAqIEBwYXJhbSBvcmlnaW5hbFNvdXJjZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGxlbmd0aFRvUmVwbGFjZQotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIE5vQ2hhbmdlRXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzb3VyY2UsIE9iamVjdCBvcmlnaW5hbFNvdXJjZSwgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJc3VwZXIoc291cmNlLCBvcmlnaW5hbFNvdXJjZSwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbkNoYW5nZWRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1YzkzNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBkb2N1bWVudCByZWdpb24gY2hhbmdlcyBpbiBhIG5vbi1zdHJ1Y3R1cmFsIHdheS4KLSAqIE5vbi1zdHJ1Y3R1cmFsLCB0aGF0IGlzLCBhcyBmYXIgYXMgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgY29uY2VybmVkLgotICogVGhlIHdob2xlIHJlZ2lvbiwgYWxvbmcgd2l0aCB0aGUgbmV3IHRleHQgaXMgc2VudCwganVzdCBpbiBjYXNlIGEgbGlzdGVuZXIKLSAqIChlLmcuIGEgdHJlZSBtb2RlbCkgbWlnaHQgbWFrZSBpdHMgb3duIGRldGVybWluYXRpb24gb2Ygd2hhdCB0byBkbywgYW5kCi0gKiBuZWVkcyB0aGUgd2hvbGUgcmVnaW9uIHRvIGFjdCBhcHByb3ByaWF0ZWx5LgotICogCi0gKiBOb3RlOiB1c2VycyBzaG91bGQgbm90IG1ha2UgYXNzdW1wdGlvbnMgYWJvdXQgd2hldGhlciB0aGUgcmVnaW9uIGlzCi0gKiBsaXRlcmFsbHkgdGhlIHNhbWUgaW5zdGFuY2Ugb3Igbm90IC0tIGl0IGlzIGN1cnJlbnRseSBhIGRpZmZlcmVudCBpbnN0YW5jZQotICogdGhhdCBpcyBpZGVudGljYWwgdG8gdGhlIG9sZCBleGNlcHQgZm9yIHRoZSBjaGFuZ2VkIHJlZ2lvbiwgYnV0IHRoaXMKLSAqIGltcGxlbWVudGF0aW9uIG1heSBjaGFuZ2UuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgUmVnaW9uQ2hhbmdlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb24gZkNoYW5nZWRSZWdpb247Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGluc3RhbmNlIG9mIGEgUmVnaW9uQ2hhbmdlZEV2ZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyCi0JICogICAgICAgICAgICB0aGUgb2JqZWN0IG1ha2luZyB0aGUgcmVxdWVzdCBmb3IgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogICAgICAgICAgICB0aGUgY29udGFpbmluZyByZWdpb24KLQkgKiBAcGFyYW0gY2hhbmdlZFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiB0aGF0IGhhcyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGNoYW5nZS4KLQkgKiBAcGFyYW0gbGVuZ3RoVG9SZXBsYWNlCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIHNwZWNpZmllZCB0byBiZSByZXBsYWNlZC4KLQkgKi8KLQlwdWJsaWMgUmVnaW9uQ2hhbmdlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQlmQ2hhbmdlZFJlZ2lvbiA9IGNoYW5nZWRSZWdpb247Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHJlZ2lvbiBjaGFuZ2VkLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgcmVnaW9uIGNoYW5nZWQKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uKCkgewotCQlyZXR1cm4gZkNoYW5nZWRSZWdpb247Ci0JfQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCByZWdpb24gY2hhbmdlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCByZWdpb24gY2hhbmdlZAotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1JlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTJlNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvUmVnaW9uc1JlcGxhY2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci0KLS8qKgotICogVGhpcyBldmVudCBpcyB1c2VkIHdoZW4gYSBub2RlJ3MgcmVnaW9ucyBjaGFuZ2UsIGJ1dCB0aGUgZG9jdW1lbnQgcmVnaW9uCi0gKiBpdHNlbGYgZG9lc24ndC4gVGhpcyBzYXlzIG5vdGhpbmcgYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGUgZG9jdW1lbnQKLSAqIHJlZ2lvbiwgdGhhdCBtYXkgc3RpbGwgaGF2ZSBjaGFuZ2VkLiBBbHNvLCBpdHMgYXNzdW1lZC9yZXF1aXJlZCB0aGF0IGFsbAotICogdGhlIHJlZ2lvbnMgYXJlIHJlcGxhY2VkIChldmVuIHRob3NlIHRoYXQgbWF5IG5vdCBoYXZlIGNoYW5nZWQpLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgewotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGZOZXdSZWdpb25zOwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IGZPbGRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgUmVnaW9uc1JlcGxhY2VkRXZlbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIGRvY3VtZW50IGJlaW5nIGNoYW5nZWQuCi0JICogQHBhcmFtIG9yaWdpbmFsUmVxdWVzdGVyIC0KLQkgKiAgICAgICAgICAgIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLQotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBjb250YWluaW5nIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIG9sZFJlZ2lvbnMgLQotCSAqICAgICAgICAgICAgdGhlIG9sZCBSZWdpb25zIGJlaW5nIHJlcGxhY2VkLgotCSAqIEBwYXJhbSBuZXdSZWdpb25zIC0KLQkgKiAgICAgICAgICAgIHRoZSBuZXcgcmVnaW9ucyBiZWluZyBhZGRlZC4KLQkgKiBAcGFyYW0gY2hhbmdlcyAtCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQgLQotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UgLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIHJlcGxhY2UuCi0JICovCi0JcHVibGljIFJlZ2lvbnNSZXBsYWNlZEV2ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIE9iamVjdCBvcmlnaW5hbFJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgU3RyaW5nIGNoYW5nZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJc3VwZXIoZG9jdW1lbnQsIG9yaWdpbmFsUmVxdWVzdGVyLCBjaGFuZ2VzLCBvZmZzZXQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCWZPbGRSZWdpb25zID0gb2xkUmVnaW9uczsKLQkJZk5ld1JlZ2lvbnMgPSBuZXdSZWdpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5ldyB0ZXh0IHJlZ2lvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgbmV3IHRleHQgcmVnaW9ucy4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldE5ld1JlZ2lvbnMoKSB7Ci0JCXJldHVybiBmTmV3UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgdGV4dCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9sZCB0ZXh0IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uTGlzdCBnZXRPbGRSZWdpb25zKCkgewotCQlyZXR1cm4gZk9sZFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9ldmVudHMvU3RydWN0dXJlZERvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhNDhjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50czsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLS8qKgotICogSVN0cnVjdHVyZWREb2N1bWVudCBldmVudHMgYXJlIGdlbmVyYXRlZCBieSB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCwgYWZ0ZXIKLSAqIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IGFjdHMgb24gYSByZXF1ZXN0LiBOb3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLAotICogZXhjZXB0IGJ5IHN1YmNsYXNzZXMgaW4gaW5mcmFzdHJ1Y3R1cmUuIE5vdCBpbnRlbmRlZCB0byBiZSBzdWJjbGFzc2VkIGJ5Ci0gKiBjbGllbnRzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV4dGVuZHMgRG9jdW1lbnRFdmVudCB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRlbGV0ZWRUZXh0OwotCXByaXZhdGUgT2JqZWN0IGZPcmlnaW5hbFJlcXVlc3RlcjsKLQotCS8qKgotCSAqIFRoZXJlIGlzIG5vIHB1YmxpYyBudWxsLWFyZyB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgKGFuZCByZXF1aXJlKSB0aGF0IGFuIElTdHJ1Y3R1cmVkRG9jdW1lbnQncyBhcmUgYWx3YXlzIHRoZQotCSAqIHNvdXJjZSBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZAotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlzdXBlcigpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bGwgc291cmNlIik7IC8vJE5PTi1OTFMtMSQKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZPcmlnaW5hbFJlcXVlc3RlciA9IGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFdlIGFzc3VtZSAoYW5kIHJlcXVpcmUpIHRoYXQgYW4gSVN0cnVjdHVyZWREb2N1bWVudCdzIGFyZSBhbHdheXMgdGhlCi0JICogc291cmNlIG9mIFN0cnVjdHVyZWREb2N1bWVudCBldmVudHMuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3RlciAtCi0JICogICAgICAgICAgICB0aGUgb3JpZ2luYWwgcmVxdWVzdGVyIG9mIHRoZSBjaGFuZ2UuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyKSB7Ci0JCXRoaXMoZG9jdW1lbnQpOwotCQlmT3JpZ2luYWxSZXF1ZXN0ZXIgPSBvcmlnaW5hbFJlcXVlc3RlcjsKLQl9Ci0KLQkvKioKLQkgKiBXZSBhc3N1bWUgKGFuZCByZXF1aXJlKSB0aGF0IGFuIElTdHJ1Y3R1cmVkRG9jdW1lbnQncyBhcmUgYWx3YXlzIHRoZQotCSAqIHNvdXJjZSBvZiBTdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnRzLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgYmVpbmcgY2hhbmdlZC4KLQkgKiBAcGFyYW0gb3JpZ2luYWxSZXF1ZXN0ZXIgLQotCSAqICAgICAgICAgICAgdGhlIHJlcXVlc3RlciBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBjaGFuZ2VzIC0KLQkgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuZXcgdGV4dAotCSAqIEBwYXJhbSBvZmZzZXQgLQotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgY2hhbmdlLgotCSAqIEBwYXJhbSBsZW5ndGhUb1JlcGxhY2UgLQotCSAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIHJlcGxhY2UuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCwgT2JqZWN0IG9yaWdpbmFsUmVxdWVzdGVyLCBTdHJpbmcgY2hhbmdlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQl0aGlzKGRvY3VtZW50KTsKLQkJZk9yaWdpbmFsUmVxdWVzdGVyID0gb3JpZ2luYWxSZXF1ZXN0ZXI7Ci0JCWZUZXh0ID0gY2hhbmdlczsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZkxlbmd0aCA9IGxlbmd0aFRvUmVwbGFjZTsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgdGV4dCB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQuCi0JICogCi0JICogQHJldHVybiB0aGUgdGV4dCB0aGF0IGlzIGJlaW5nIGRlbGV0ZWQsIG9yIG51bGwgaWYgbm9uZSBpcyBiZWluZwotCSAqICAgICAgICAgZGVsZXRlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERlbGV0ZWRUZXh0KCkgewotCQlyZXR1cm4gZkRlbGV0ZWRUZXh0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG9iamVjdCB0aGF0IG9yaWdpbmFsbHkgY2F1c2VkIHRoZSBldmVudCB0bwotCSAqIGZpcmUuIFRoaXMgaXMgdHlwaWNhbGx5IG5vdCB0aGUgb2JqZWN0IHRoYXQgY3JlYXRlZCB0aGUgZXZlbnQgKHRoZQotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGJ1dCBpbnN0ZWFkIHRoZSBvYmplY3QgdGhhdCBtYWRlIGEgcmVxdWVzdCB0byB0aGUKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9iamVjdCB0aGF0IG1hZGUgdGhlIHJlcXVlc3QgdG8gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIE9iamVjdCBnZXRPcmlnaW5hbFJlcXVlc3RlcigpIHsKLQkJcmV0dXJuIGZPcmlnaW5hbFJlcXVlc3RlcjsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvICdnZXREb2N1bWVudCcgZXhjZXB0IGl0IHJldHVybnMgYW4gb2JqZWN0Ci0JICogb2YgdGhlIGFwcHJvcHJpYXRlIHR5cGUgKG5hbWVseSwgYSBJU3RydWN0dXJlZERvY3VtZW50LCBpbnN0ZWFkIG9mCi0JICogSURvY3VtZW50KS4KLQkgKiAKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1udCAtIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQkvLyBhIHNhZmUgY2FzZSwgc2luY2UgY29uc3RydWN0b3IgY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggYQotCQkvLyBJU3RydWN0dXJlZERvY3VtZW50Ci0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIE5vdCB0byBiZSBjYWxsZWQgYnkgY2xpZW50cywgb25seSBwYXJzZXJzIGFuZCByZXBhcnNlcnMuICh3aWxsCi0JICogZXZlbnR1YWxseSBiZSBtb3ZlZCB0byBhbiBTUEkgcGFja2FnZSkuCi0JICogCi0JICogQHBhcmFtIG5ld0RlbGV0ZWRUZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHRoYXQgaGFzIGJlZW4gZGVsZXRlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWxldGVkVGV4dChTdHJpbmcgbmV3RGVsZXRlZFRleHQpIHsKLQkJZkRlbGV0ZWRUZXh0ID0gbmV3RGVsZXRlZFRleHQ7Ci0JfQotCi0JLyoqCi0JICogZm9yIGRlYnVnZ2luZyBvbmx5Ci0JICogCi0JICogQGRlcHJlY2F0ZWQgLSBuZWVkIHRvIGZpeCB1bml0IHRlc3RzIHdoaWNoIGRlcGVuZCBvbiB0aGlzIGV4YWN0IGZvcm1hdCwKLQkgKiAgICAgICAgICAgICB0aGVuIGRlbGV0ZSB0aGlzCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJLy8gcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIltzb3VyY2U9IiArIHNvdXJjZSArICJdIjsKLQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V2ZW50cy9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDllNGQ2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXZlbnRzL1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHVzZWQgd2hlbiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgZGVsZXRlZCwgb3IgcmVwbGFjZWQKLSAqIHdpdGggbW9yZSB0aGFuIG9uZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvciB3aGVuIHNpbXBseSBtb3JlIHRoYW4gb25lCi0gKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNoYW5nZXMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXh0ZW5kcyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgZk9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50IC0KLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBiZWluZyBjaGFuZ2VkLgotCSAqIEBwYXJhbSBvcmlnaW5hbFJlcXVlc3RlciAtCi0JICogICAgICAgICAgICB0aGUgcmVxdWVzdGVyIG9mIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgLQotCSAqICAgICAgICAgICAgdGhlIG9sZCBkb2N1bWVudCByZWdpb25zIHJlbW92ZWQuCi0JICogQHBhcmFtIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgLQotCSAqICAgICAgICAgICAgdGhlIG5ldyBkb2N1bWVudCByZWdpb25zIGFkZGVkLgotCSAqIEBwYXJhbSBjaGFuZ2VzIC0KLQkgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgdGV4dCBjaGFuZ2UuCi0JICogQHBhcmFtIG9mZnNldCAtCi0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBjaGFuZ2UuCi0JICogQHBhcmFtIGxlbmd0aFRvUmVwbGFjZSAtCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRleHQgcmVxdWVzdGVkIHRvIGJlIHJlcGxhY2VkLgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBPYmplY3Qgb3JpZ2luYWxSZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIFN0cmluZyBjaGFuZ2VzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCXN1cGVyKGRvY3VtZW50LCBvcmlnaW5hbFJlcXVlc3RlciwgY2hhbmdlcywgb2Zmc2V0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQlmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnM7Ci0JCWZOZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXcgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG5ldyBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBmTmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBvbGQgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG9sZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBmT2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VBbHJlYWR5RXhpc3RzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VBbHJlYWR5RXhpc3RzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MjMzY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9leGNlcHRpb25zL1Jlc291cmNlQWxyZWFkeUV4aXN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9uczsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUFscmVhZHlFeGlzdHMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmVzb3VyY2VBbHJlYWR5RXhpc3RzIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHMKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgUmVzb3VyY2VBbHJlYWR5RXhpc3RzKFN0cmluZyBzKSB7Ci0JCXN1cGVyKHMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXhjZXB0aW9ucy9SZXNvdXJjZUluVXNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4Y2VwdGlvbnMvUmVzb3VyY2VJblVzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RhYzUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXhjZXB0aW9ucy9SZXNvdXJjZUluVXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zOwotCi0KLQotcHVibGljIGNsYXNzIFJlc291cmNlSW5Vc2UgZXh0ZW5kcyBFeGNlcHRpb24gewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBSZXNvdXJjZUluVXNlKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFJlc291cmNlQWxyZWFkeUV4aXN0cyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFJlc291cmNlSW5Vc2UoU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxNYW5hZ2VyUHJvcG9zZWQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU1vZGVsTWFuYWdlclByb3Bvc2VkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiOWM2YjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxNYW5hZ2VyUHJvcG9zZWQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5tb2RlbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5leGNlcHRpb25zLlJlc291cmNlQWxyZWFkeUV4aXN0czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXhjZXB0aW9ucy5SZXNvdXJjZUluVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogUmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIElTdHJ1Y3R1cmVkTW9kZWxzLgotICogCi0gKiBUaGlzIGFsbG93cyBjbGllbnRzIHRvIHNoYXJlIG1vZGVscywgc28gdGhleSBkbyBub3QgaGF2ZSB0byBiZSByZS1jcmVhdGVkCi0gKiBvciBwYXNzZWQgYXJvdW5kIGZyb20gb25lIGNsaWVudCB0byBhbm90aGVyLiBDbGllbnRzIHNob3VsZCBpbnRlcm5hbGx5Ci0gKiBlbmZvcmNlIHRoYXQgbW9kZWxzIGFyZSBnb3R0ZW4gYW5kIHJlbGVhc2VkIGZyb20gbG9jYXRpb25zIGNsb3NlIHRvIGVhY2gKLSAqIG90aGVyIHRvIHByZXZlbnQgbW9kZWwgbGVha3MuCi0gKiAKLSAqIFRoZXJlIGFyZSB0aHJlZSB3YXlzIHRvIGdldCBhIG1vZGVsIGJhc2VkIG9uIHVzYWdlIGFuZCByZXNwb25zaWJpbGl0eTogZm9yCi0gKiAnTU9ESUZZJywganVzdCBmb3IgJ1NIQVJFRCcsIGFuZCAnVU5TSEFSRUQnLiBDb250cmFyeSB0byB0aGVpciBuYW1lcywgYQotICogbW9kZWwgY2FuIHRlY2huaWNhbGx5IGJlIG1vZGlmaWVkLCBhbmQgYWxsIG1vZGlmaWNhdGlvbnMgZGlyZWN0bHkgYWZmZWN0Ci0gKiB0aGUgY29tbW9ubHkgc2hhcmVkIHZlcnNpb24gb2YgdGhlIG1vZGVsLiBJdCBpcyBwYXJ0IG9mIHRoZSBBUEkgY29udHJhY3QsCi0gKiBob3dldmVyLCB0aGF0IGNsaWVudHMgd2hvIGdldCBhIG1vZGVsIGZvciBTSEFSRUQgZG8gbm90IG1vZGlmeSBpdC4gVGhlCi0gKiBzaWduaWZpY2FuY2Ugb2YgdGhlICdNT0RJRlknIG1vZGVsIGlzIHRoYXQgdGhlIGNsaWVudCBpcyByZWdpc3RlcmluZyB0aGVpcgotICogaW50ZXJlc3QgaW4gc2F2aW5nIGNoYW5nZXMgdG8gdGhlIG1vZGVsLgotICogCi0gKiBDbGllbnRzIGNhbiByZWZlcmVuY2UgdGhpcyBpbnRlcmZhY2UsIGJ1dCBzaG91bGQgbm90IGltcGxlbWVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcgotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsTWFuYWdlclByb3Bvc2VkIHsKLQotCS8qKgotCSAqIEFjY2Vzc1R5cGUgaXMgdXNlZCBpbnRlcm5hbGx5IGFzIGEgSlJFIDEuNCBjb21wYXRpYmxlIGVudW1lcmF0ZWQgdHlwZS4KLQkgKiBOb3QgaW50ZW5kZWQgdG8gYmUgcmVmZXJlbmNlZCBieSBjbGllbnRzLgotCSAqLwotCXN0YXRpYyBjbGFzcyBBY2Nlc3NUeXBlIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQkJLyoqCi0JCSAqIGRlZmF1bHQgYWNjZXNzIGNvbnRydWN0b3Igd2UgdXNlIHRvIGNyZWF0ZSBvdXIgc3BlY2lmaWMgY29uc3RhbnRzLgotCQkgKiAKLQkJICogQHBhcmFtIHR5cGUKLQkJICovCi0JCUFjY2Vzc1R5cGUoU3RyaW5nIHR5cGUpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmVHlwZSA9IHR5cGU7Ci0JCX0KLQotCQkvKioKLQkJICogRm9yIGRlYnVnIHB1cnBvc2VzIG9ubHkuCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuICJNb2RlbCBBY2Nlc3MgVHlwZTogIiArIGZUeXBlOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb25zdGFudCB0byBwcm92aWRlIGNvbXBpbGUgdGltZSBzYWZlIHBhcmFtZXRlci4gPGNvZGU+Tk9UU0hBUkVEPC9jb2RlPnNpZ25pZmllcwotCSAqIHRoZSBjbGllbnQgaW50ZW50aWFsbHkgd2FudHMgYSBtb2RlbCB0aGF0IGlzIG5vdCBzaGFyZWQgd2l0aCBvdGhlcgotCSAqIGNsaWVudHMuIE5PVFNIQVJFRCBtb2RlbHMgY2FuIG5vdCBiZSBzYXZlZC4KLQkgKi8KLQlmaW5hbCBBY2Nlc3NUeXBlIE5PVFNIQVJFRCA9IG5ldyBBY2Nlc3NUeXBlKCJOT1RTSEFSRUQiKTsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RhbnQgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUgc2FmZSBwYXJhbWV0ZXIuIDxjb2RlPlNIQVJFRDwvY29kZT5zaWduaWZpZXMKLQkgKiB0aGUgY2xpZW50IGlzIG5vdCBpbnRlbmRpbmcgdG8gbWFrZSBjaGFuZ2VzIGFuZCBkb2VzIG5vdCBjYXJlIHdoZXRoZXIKLQkgKiB0aGUgbW9kZWwgYWNjZXNzZWQgaXMgc2F2ZWQuCi0JICovCi0JZmluYWwgQWNjZXNzVHlwZSBTSEFSRUQgPSBuZXcgQWNjZXNzVHlwZSgiU0hBUkVEIik7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENvbnN0YW50IHRvIHByb3ZpZGUgY29tcGlsZS10aW1lIHNhZmUgcGFyYW1ldGVyLiA8Y29kZT5NT0RJRlk8L2NvZGU+c2lnbmlmaWVzCi0JICogdGhlIGNsaWVudCBpcyBpbnRlbmRpbmcgdG8gbWFrZSBjaGFuZ2VzIGFuZCBpcyByZXNwb25zaWJsZSBmb3Igc2F2aW5nCi0JICogY2hhbmdlcyAob3Igbm90KSBpZiB0aGV5IGFyZSB0aGUgbGFzdCBvbmUgaG9sZGluZyBNT0RJRlkgYWNjZXNzIHRvIHRoZQotCSAqIG1vZGVsIGJlZm9yZSBpdCdzIHJlbGVhc2VkLgotCSAqLwotCWZpbmFsIEFjY2Vzc1R5cGUgTU9ESUZZID0gbmV3IEFjY2Vzc1R5cGUoIk1PRElGWSIpOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBjb3B5TW9kZWwgaXMgc2ltaWxhciB0byBhIGRlZXAgY2xvbmUuIFRoZSByZXN1bHRpbmcgbW9kZWwgaXMgc2hhcmVkLAotCSAqIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgUmVhZEVkaXRUeXBlLiBJZiBhIG1vZGVsIGFscmVhZHkgaXMgYmVpbmcKLQkgKiBtYW5hZ2VkIGZvciAnbmV3TG9jYXRpb24nIHRoZW4gYSBSZXNvdXJjZUluVXNlIGV4Y2VwdGlvbiBpcyB0aHJvd24sCi0JICogdW5sZXNzIHRoZSBSZWFkRWRpdFR5cGUgaXMgTk9UU0hBUkVELCBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHRpbmcgbW9kZWwKLQkgKiBjYW4gbm90IGJlIHNhdmVkLgotCSAqIAotCSAqIEBwYXJhbSBvbGRMb2NhdGlvbgotCSAqIEBwYXJhbSBuZXdMb2NhdGlvbgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgUmVzb3VyY2VJblVzZQotCSAqIAotCSAqIElTU1VFOiBpcyB0aGlzIGltcG9ydGFudCBlbm91Z2ggdG8gYmUgQVBJLCBvciBjYW4gY2xpZW50cyBzb2x2ZQotCSAqIHRoZW1zZWx2ZXMKLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsIGNvcHlNb2RlbChJUGF0aCBvbGRMb2NhdGlvbiwgSVBhdGggbmV3TG9jYXRpb24sIEFjY2Vzc1R5cGUgdHlwZSkgdGhyb3dzIFJlc291cmNlSW5Vc2U7Ci0KLQkvKioKLQkgKiBjcmVhdGVOZXdJbnN0YW5jZSBpcyBzaW1pbGFyIHRvIGNsb25lLCBleGNlcHQgdGhlIG5ldyBpbnN0YW5jZSBoYXMgbm8KLQkgKiB0ZXh0IGNvbnRlbnQuIE5vdGU6IHRoaXMgcHJvZHVjZXMgYW4gVU5TSEFSRUQgbW9kZWwsIGZvciB0ZW1wb3JhcnkgdXNlLAotCSAqIHRoYXQgaGFzIHRoZSBzYW1lIGNoYXJhY3RlcmlzdGljcyBhcyBvcmlnaW5hbCBtb2RlbC4gSWYgYSB0cnVlIHNoYXJlZAotCSAqIG1vZGVsIGlzIGRlc2lyZWQsIHVzZSAiY29weSIuCi0JICogCi0JICogSVNTVUU6IHN0aWxsIG5lZWRlZD8KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIG1vZGVsCi0JICogQHJldHVybgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBjcmVhdGVOZXdJbnN0YW5jZShPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBGYWN0b3J5IG1ldGhvZCwgc2luY2UgYSBwcm9wZXIgSVN0cnVjdHVyZWREb2N1bWVudCBtdXN0IGhhdmUgYSBwcm9wZXIKLQkgKiBwYXJzZXIgYXNzaWduZWQuIE5vdGU6IGl0cyBhc3N1bWUgdGhhdCBJUGF0aCBkb2VzIG5vdCBhY3R1YWxseSBleGlzdCBhcwotCSAqIGEgcmVzb3VyY2UgeWV0LiBJZiBpdCBkb2VzLCBSZXNvdXJjZUFscmVhZHlFeGlzdHMgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiBJZiB0aGUgcmVzb3VyY2UgZG9lcyBhbHJlYWR5IGV4aXN0LCB0aGVuIGNyZWF0ZVN0cnVjdHVyZWREb2N1bWVudEZvciBpcwotCSAqIHRoZSByaWdodCBBUEkgdG8gdXNlLgotCSAqIAotCSAqIElTU1VFOiBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpcyB2aWEgbW9kZWwgbWFuYWdlciwgb3IgZWxzZSB3aGVyZT8KLQkgKiBJU1NVRTogZG8gd2UgbmVlZCB0d28gb2YgdGhlc2U/IFdoYXQncyBsZWdhY3kgdXNlIGNhc2U/Ci0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cwotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50IGNyZWF0ZU5ld1N0cnVjdHVyZWREb2N1bWVudEZvcihJUGF0aCBsb2NhdGlvbiwgSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMsIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogRmFjdG9yeSBtZXRob2QsIHNpbmNlIGEgcHJvcGVyIElTdHJ1Y3R1cmVkRG9jdW1lbnQgbXVzdCBoYXZlIGEgcHJvcGVyCi0JICogcGFyc2VyIGFzc2lnbmVkLiBOb3RlOiBjbGllbnRzIHNob3VsZCB2ZXJpZnkgdGhhdCB0aGUgcmVzb3VyY2UKLQkgKiBpZGVudGlmaWVkIGJ5IHRoZSBJUGF0aCBleGlzdHMgYmVmb3JlIHVzaW5nIHRoaXMgbWV0aG9kLiBJZiB0aGlzIElGaWxlCi0JICogZG9lcyBub3QgZXhpc3QsIHRoZW4gY3JlYXRlTmV3U3RydWN0dXJlZERvY3VtZW50IGlzIHRoZSBjb3JyZWN0IEFQSSB0bwotCSAqIHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXMgdmlhIG1vZGVsIG1hbmFnZXIsIG9yIGVsc2Ugd2hlcmU/Ci0JICogSVNTVUU6IGRvIHdlIG5lZWQgdHdvIG9mIHRoZXNlPyBXaGF0J3MgbGVnYWN5IHVzZSBjYXNlPwotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgY3JlYXRlU3RydWN0dXJlZERvY3VtZW50Rm9yKElQYXRoIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogTm90ZTogY2FsbGVycyBvZiB0aGlzIG1ldGhvZCBtdXN0IHN0aWxsIHJlbGVhc2UgdGhlIG1vZGVsIHdoZW4KLQkgKiBmaW5pc2hlZC4gUmV0dXJucyB0aGUgbW9kZWwgZm9yIHRoaXMgZG9jdW1lbnQgaWYgaXQgYWxyZWFkeSBleGlzdHMgYW5kCi0JICogaXMgYmVpbmcgc2hhcmVkLiBSZXR1cm5zIG51bGwgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UuIFRoZSBSZWFkRWRpdFR5cGUKLQkgKiBtdXN0IGJlIGVpdGhlciBNT0RJRlkgb3IgU0hBUkVELgotCSAqIAotCSAqIElTU1VFOiBzaG91bGQgd2UgYWNjZXB0IElEb2N1bWVudCBvbiBwYXJhbWV0ZXIgZm9yIGZ1dHVyZSBldm9sdXRpb24sCi0JICogYW5kIGNvbnN0cmFpbiB0byBTdHJ1Y3R1cmVkRG9jdW1lbnRzIGF0IHJ1bnRpbWU/Ci0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHJldHVybgotCSAqLwotCUlTdHJ1Y3R1cmVkTW9kZWwgZ2V0RXhpc3RpbmdNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBBY2Nlc3NUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBDYWxsZXJzIG9mIHRoaXMgbWV0aG9kIG11c3Qgc3RpbGwgcmVsZWFzZSB0aGUgbW9kZWwgd2hlbiBmaW5pc2hlZC4KLQkgKiBSZXR1cm5zIHRoZSBtb2RlbCBmb3IgdGhpcyBsb2NhdGlvbiBpZiBpdCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgYmVpbmcKLQkgKiBzaGFyZWQuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZS4gVGhlIFJlYWRFZGl0VHlwZSBtdXN0IGJlCi0JICogZWl0aGVyIE1PRElGWSBvciBTSEFSRUQuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldEV4aXN0aW5nTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgQWNjZXNzVHlwZSB0eXBlLCBJUGF0aCBsb2NhdGlvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtb2RlbCB0aGF0IGhhcyB0aGUgc3BlY2lmaWVkIGRvY3VtZW50IGFzIGl0cyBzdHJ1Y3R1cmVkCi0JICogZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBBY2Nlc3NUeXBlIHR5cGUsIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yLCBJRG9jdW1lbnQgZG9jdW1lbnQpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbW9kZWwgYmFzZWQgb24gdGhlIGNvbnRlbnQgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlOiBpZiB0aGUgTW9kZWxNYW5hZ2VyIGRvZXMgbm90IGtub3cgaG93IHRvIGNyZWF0ZSBhIG1vZGVsIGZvciAKLQkgKiBzdWNoIGEgZmlsZSBmb3IgY29udGVudCwgbnVsbCBpcyByZXR1cm4uCi0JICogSVNTVUU6IHNob3VsZCB3ZSB0aHJvdyBzb21lIHNwZWNpYWwsIG1lYW5pbmdmdWwsIGNoZWNrZWQgCi0JICogZXhjZXB0aW9uIGluc3RlYWQ/Ci0JICogCi0JICogQHBhcmFtIHJlcXVlc3RlcgotCSAqIEBwYXJhbSB0eXBlCi0JICogQHBhcmFtIHByb2dyZXNzTW9uaXRvcgotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgQWNjZXNzVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvciwgSVBhdGggbG9jYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiwgQ29yZUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNyZWF0ZSBhIG5ldyBtb2RlbCBpZiBpdCBhbHJlYWR5IGV4aXN0cyAuLi4gaWYKLQkgKiBmb3JjZSBpcyBmYWxzZS4gVGhlIGlkZWEgaXMgdGhhdCBhIGNsaWVudCBzaG91bGQgY2FsbCB0aGlzIG1ldGhvZCBvbmNlCi0JICogd2l0aCBmb3JjZSBzZXQgdG8gZmFsc2UuIElmIHRoZSBleGNlcHRpb24gaXMgdGhyb3duLCB0aGVuIHByb21wdCBjbGllbnQKLQkgKiBpZiB0aGV5IHdhbnQgdG8gb3ZlcndyaXRlLgotCSAqIAotCSAqIEBwYXJhbSByZXF1ZXN0ZXIKLQkgKiBAcGFyYW0gbG9jYXRpb24KLQkgKiBAcGFyYW0gZm9yY2UKLQkgKiBAcGFyYW0gdHlwZQotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBSZXNvdXJjZUFscmVhZHlFeGlzdHMKLQkgKiBAdGhyb3dzIFJlc291cmNlSW5Vc2UKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCBnZXROZXdNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBJUGF0aCBsb2NhdGlvbiwgYm9vbGVhbiBmb3JjZSwgQWNjZXNzVHlwZSB0eXBlLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIFJlc291cmNlQWxyZWFkeUV4aXN0cywgUmVzb3VyY2VJblVzZSwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgb3RoZXIgcmVmZXJlbmNlcyB0byB0aGUKLQkgKiB1bmRlcmx5aW5nIG1vZGVsLgotCSAqIAotCSAqIEBwYXJhbSBsb2NhdGlvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGlzU2hhcmVkKElQYXRoIGxvY2F0aW9uKTsKLQotCS8qKgotCSAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBvdGhlciByZWZlcmVuY2VzIHRvIHRoZQotCSAqIHVuZGVybHlpbmcgbW9kZWwsIHNoYXJlZCBpbiB0aGUgc3BlY2lmaWVkIHdheS4gVGhlIFJlYWRFZGl0VHlwZSBtdXN0IGJlCi0JICogZWl0aGVyIE1PRElGWSBvciBTSEFSRUQuCi0JICogCi0JICogQHBhcmFtIGxvY2F0aW9uCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBpc1NoYXJlZChJUGF0aCBsb2NhdGlvbiwgQWNjZXNzVHlwZSB0eXBlKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgd2hlbiB0aGUgY29udGVudCB0eXBlIG9mIGEgbW9kZWwgY2hhbmdlcy4gSXRzCi0JICogYXNzdW1lZCB0aGUgY29udGVudFR5cGUgaGFzIGFscmVhZHkgYmVlbiBjaGFuZ2VkLCBhbmQgdGhpcyBtZXRob2QgdXNlcwotCSAqIHRoZSB0ZXh0IG9mIHRoZSBvbGQgb25lLCB0byByZXBvcHVsYXRlIHRoZSB0ZXh0IG9mIHRoZSBuZXcgb25lLgotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqIEByZXR1cm4KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JSVN0cnVjdHVyZWRNb2RlbCByZWluaXRpYWxpemUoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0KLQkvKioKLQkgKiBUaGlzIGlzIHVzZWQgYnkgY2xpZW50cyB0byBzaWduaWZ5IHRoYXQgdGhleSBhcmUgZmluaXNoZWQgd2l0aCBhIG1vZGVsCi0JICogYW5kIHdpbGwgbm8gbG9uZ2VyIGFjY2VzcyBpdCBvciBhbnkgb2YgaXRzIHVuZGVybHlpbmcgZGF0YSAoc3VjaCBhcyBpdHMKLQkgKiBzdHJ1Y3R1cmVkIGRvY3VtZW50KS4gVGhlIFJlYWRFZGl0VHlwZSBtdXN0IG1hdGNoIHdoYXQgZXZlciB0aGUgY2xpZW50Ci0JICogdXNlZCBpbiB0aGUgY29ycmVzcG9uZGluZyAnZ2V0JyBtZXRob2QuCi0JICogCi0JICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgZm9yIGV2ZXJ5ICdnZXQnLiBDbGllbnRzIHNob3VsZCB1c2UgdGhlCi0JICogdHJ5L2ZpbmFsbHkgcGF0dGVybiB0byBlbnN1cmUgdGhlIHJlbGVhc2UgaXMgY2FsbGVkIGV2ZW4gaWYgdGhlcmUgaXMgYW4KLQkgKiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHN0cnVjdHVyZWRNb2RlbAotCSAqIEBwYXJhbSB0eXBlCi0JICovCi0Jdm9pZCByZWxlYXNlTW9kZWwoT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIEFjY2Vzc1R5cGUgdHlwZSk7Ci0KLQkvKioKLQkgKiBXcml0ZXMgdGhlIHVuZGVybHlpbmcgZG9jdW1lbnQgdG8gdGhlIElQYXRoLgotCSAqIAotCSAqIElTU1VFOiB3ZSB3YW50IHRvIGp1c3QgImR1bXAiIGNvbnRlbnRzIHRvIGxvY2F0aW9uLCBidXQgbmVlZCB0byBzcGVjLgotCSAqIGFsbCB0aGUgZGlmZmVyZW50IGNhc2VzIG9mIHNoYXJlZCwgZXRjLgotCSAqIAotCSAqID9JZiB0byBzYW1lIGxvY2F0aW9uIGFzICdnZXQnLCB0aGVuIHNhbWUgaW5zdGFuY2Ugb2YgbW9kZWwsIElmIHRvCi0JICogZGlmZmVyZW50IGxvY2F0aW9uIChlc3AuIGlmIHNoYXJlZCkgdGhlbiBuZWVkIHRvIGxlYXZlIG9sZCBpbnN0YW5jZSBvZgotCSAqIG1vZGVsLCBjcmVhdGUgbmV3IG1vZGVsLCBhbmQgc2F2ZSB0byBuZXcgbG9jYXRpb24uID8KLQkgKiAKLQkgKiBDYXNlczogSVBhdGggaXMgbnVsbCwgd3JpdGUgdG8gSVBhdGggY3JlYXRlZCB3aXRoIElQYXRoIHNwZWNpZmljZWQgYW5kCi0JICogZXF1YWxzIElQYXRoIGNyZWF0ZWQgd2l0aCwgd3JpdGUgdG8gSVBhdGggSVBhdGggc3BlY2lmaWVkIGFuZCBub3QKLQkgKiBlcXVhbHMgSVBhdGggY3JlYXRlZCB3aXRoLCBkdW1wcyB0byBuZXcgSVBhdGgsIG5vIGNoYW5nZSBpbiBjdXJyZW50Ci0JICogbW9kZWwgc3RhdGUuCi0JICogCi0JICogSVNTVUU6IHRoaW5rIHRocm91Z2ggJ25vcm1hbGl6YXRpb24nIGNhc2VzCi0JICogCi0JICogCi0JICogQHBhcmFtIHN0cnVjdHVyZWRNb2RlbAotCSAqIEBwYXJhbSBsb2NhdGlvbiAtIGFscmVhZHkgbm9ybWFsaXplZD8KLQkgKiBAcGFyYW0gcHJvZ3Jlc3NNb25pdG9yCi0JICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0JICogQHRocm93cyBJT0V4Y2VwdGlvbgotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIAotCSAqIElTU1VFOiByZXNvdXJjZSBhbGVhZHkgZXhpc3RzPyB2ZXRvIG92ZXJyaWRlCi0JICovCi0Jdm9pZCBzYXZlTW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElQYXRoIGxvY2F0aW9uLCBJUHJvZ3Jlc3NNb25pdG9yIHByb2dyZXNzTW9uaXRvcikgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBDb3JlRXhjZXB0aW9uOwotCi0JLyoqCi0JICogV3JpdGVzIHRoZSB1bmRlcmx5aW5nIGRvY3VtZW50IHRvIHRoZSBJUGF0aCBpZiB0aGUgbW9kZWwgaXMgb25seSBzaGFyZWQKLQkgKiBmb3IgRURJVCBieSBvbmUgY2xpZW50LiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgZm9yICdiYWNrZ3JvdW5kCi0JICogam9icycgdG8gc2F2ZSBtb2RlbHMsIGluIGNhc2UgdGhlIG1vZGVsIGlzIGJlaW5nIHNoYXJlZCBieSBhbiBlZGl0b3IsCi0JICogb3Igb3RoZXIgY2xpZW50IHRoYXQgbWlnaHQgZGVzaXJlIHVzZXIgaW50ZXJ2ZW50aW9uIHRvIHNhdmUgYSByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZE1vZGVsCi0JICogQHBhcmFtIGxvY2F0aW9uIC0gYWxyZWFkeSBub3JtYWxpemVkPwotCSAqIEBwYXJhbSBwcm9ncmVzc01vbml0b3IKLQkgKiBAdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICogCi0JICogSVNTVUU6IGlzIGxvY2FpdG9uIG5lZWRlZCBpbiB0aGlzIGNhc2UsIG9yIGp1c3QgdXNlIHRoZSBvbmUgaXQgd2FzCi0JICogY3JlYXRlZCB3aXRoCi0JICovCi0Jdm9pZCBzYXZlTW9kZWxJZk5vdFNoYXJlZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCwgSVBhdGggbG9jYXRpb24sIElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9tb2RlbC9JTW9kZWxTdGF0ZUxpc3RlbmVyUHJvcG9zZWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRhNGJhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lNb2RlbFN0YXRlTGlzdGVuZXJQcm9wb3NlZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwubW9kZWw7Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHRob3NlIHdhbnRpbmcgdG8gbGlzdGVuIHRvIGEgbW9kZWwncyBzdGF0ZSBjaGFuZ2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsU3RhdGVMaXN0ZW5lclByb3Bvc2VkIHsKLQotCS8qKgotCSAqIEEgbW9kZWwgaXMgYWJvdXQgdG8gYmUgY2hhbmdlZC4gVGhlIGV2ZW50IG9iamVjdCBpdHNlbGYgc2lnbmlmaWVzIHdoaWNoCi0JICogbW9kZWwsIGFuZCBhbnkgcGVydGluZW50IGluZm9ybWF0aW9uLgotCSAqLwotCXZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWxFdmVudCBldmVudCk7Ci0KLQkvKioKLQkgKiBTaWduYWxzIHRoYXQgdGhlIGNoYW5nZXMgZm9yZXRvbGQgYnkgbW9kZWxBYm91dFRvQmVDaGFuZ2VkIGhhdmUgYmVlbgotCSAqIG1hZGUuIEEgdHlwaWNhbCB1c2UgbWlnaHQgYmUgdG8gcmVmcmVzaCwgb3IgdG8gcmVzdW1lIHByb2Nlc3NpbmcgdGhhdAotCSAqIHdhcyBzdXNwZW5kZWQgYXMgYSByZXN1bHQgb2YgbW9kZWxBYm91dFRvQmVDaGFuZ2VkLgotCSAqLwotCXZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWxFdmVudCBldmVudCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU5vZGVBZGFwdGVyRmFjdG9yeU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSU5vZGVBZGFwdGVyRmFjdG9yeU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMyZDE2NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lOb2RlQWRhcHRlckZhY3RvcnlNYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotLyoqCi0gKiBQcm92aWRlcyBhIG1lYW5zIGZvciBjbGllbnRzIHRvIHJlZ2lzdGVyIElBZGFwdGVyRmFjdG9yaWVzIGZvciB1c2UKLSAqIGJ5IGluZnJhc3RydWN0dXJlIHdoZW4gU3RydWN0dXJlZE1vZGVscyBhcmUgY3JlYXRlZC4gCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVBZGFwdGVyRmFjdG9yeU1hbmFnZXIgewotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGZhY3RvcnkKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKi8KLQl2b2lkIGFkZEFkYXB0ZXJGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlKTsKLQotCXZvaWQgcmVtb3ZlQWRhcHRlckZhY3RvcnkoSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5LCBJQ29udGVudFR5cGUgY29udGVudFR5cGUpOwotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzVhMTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLm1vZGVsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkTW9kZWxFdmVudCB7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL21vZGVsL0lTdHJ1Y3R1cmVkTW9kZWxQcm9wb3NlZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDk4NGRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvbW9kZWwvSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwubW9kZWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBJU3RydWN0dXJlZE1vZGVsJ3MgYXJlIG1haW5seSBpbnRlcmVzdGluZyBieSB0aGVpciBleHRlbnNpb25zIGFuZAotICogaW1wbGVtZW50ZXJzLiBUaGUgbWFpbiBwdXJwb3NlZCBvZiB0aGlzIGFic3RyYWN0aW9uIGl0IHRvIHByb3ZpZGUgYSBjb21tb24KLSAqIHdheSB0byBtYW5hZ2UgbW9kZWxzIHRoYXQgaGF2ZSBhbiBhc3NvY2lhdGVkIHN0cnVjdHVyZWQgZG9jdW1uZXQuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRNb2RlbFByb3Bvc2VkIGV4dGVuZHMgSUFkYXB0YWJsZSB7Ci0KLQotCS8qKgotCSAqIFRoaXMgQVBJIGFsbG93cyBjbGllbnRzIHRvIGRlY2xhcmUgdGhhdCB0aGV5IGFyZSBhYm91dCB0byBtYWtlIGEKLQkgKiAibGFyZ2UiIGNoYW5nZSB0byB0aGUgbW9kZWwuIFRoaXMgY2hhbmdlIG1pZ2h0IGJlIGluIHRlcm1zIG9mIGNvbnRlbnQKLQkgKiBvciBpdCBtaWdodCBiZSBpbiB0ZXJtcyBvZiB0aGUgbW9kZWwgaWQgb3IgYmFzZSBsb2NhdGlvbi4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgaW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIG5vdGlmaWNhdGlvbiB0byBsaXN0ZW5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVsJ3Mgc3RhdGUgb25jZSBmaW5pc2hlZCB3aXRoIHRoZSBjaGFuZ2VzLiBTZWUKLQkgKiBnZXRNZW1lbnRvIGFuZCByZXN0b3JlU3RhdGUuCi0JICogCi0JICogVGhlIG1ldGhvZCBpc01vZGVsU3RhdGVDaGFuZ2luZyBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkZXRlcm1pbmUgaWYKLQkgKiB0aGUgbW9kZWwgaXMgYWxyZWFkeSBpbiBhIGNoYW5nZSBzZXF1ZW5jZS4KLQkgKiAKLQkgKiBUaGlzIG1ldGhvZCBpcyBhIG1hdGNoZWQgcGFpciB0byBjaGFuZ2VkTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZAotCSAqIGJlZm9yZSBjaGFuZ2VkTW9kZWwuIEEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3Qgbm9yIGNhbGwgYWJvdXRUb0NoYW5nZU1vZGVsIHdpdGhvdXQKLQkgKiBjYWxsaW5nIGNoYW5nZWRNb2RlbCBsYXRlciBmcm9tIHRoZSBzYW1lIFRocmVhZC4KLQkgKi8KLQl2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0Jdm9pZCBhZGRNb2RlbFN0YXRlTGlzdGVuZXIoSU1vZGVsU3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdG5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIKLQkgKiB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwgLi4uCi0JICogb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlIGNoYW5nZWQKLQkgKiBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEgZmluYWxseQotCSAqIGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuCi0JICogCi0JICogSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VkTW9kZWwoKTsKLQotCS8qKgotCSAqIFRoaXMgaXMgYSBjbGllbnQtZGVmaW5lZCB2YWx1ZSBmb3Igd2hhdCB0aGF0IGNsaWVudCAoYW5kL29yIGxvYWRlcikKLQkgKiBjb25zaWRlcnMgdGhlICJiYXNlIiBvZiB0aGUgc3RydWN0dXJlZCBtb2RlbC4gRnJlcXVlbnRseSB0aGUgbG9jYXRpb24KLQkgKiBpcyBlaXRoZXIgYSB3b3Jrc3BhY2Ugcm9vdC1yZWxhdGl2ZSBwYXRoIG9mIGEgd29ya3NwYWNlIHJlc291cmNlIG9yIGFuCi0JICogYWJzb2x1dGUgcGF0aCBpbiB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0uCi0JICovCi0JSVBhdGggZ2V0TG9jYXRpb24oKTsKLQotCS8qKgotCSAqIEByZXR1cm4gVGhlIGFzc29jaWF0ZWQgY29udGVudCB0eXBlIGlkZW50aWZpZXIgKFN0cmluZykgZm9yIHRoaXMgbW9kZWwuCi0JICovCi0JSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBtb2RlbCdzIEZhY3RvcnlSZWdpc3RyeS4gQSBtb2RlbCBpcyBub3QgdmFsaWQgd2l0aG91dCBvbmUuCi0JICovCi0JRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpOwotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBpbmRleCByZWdpb24gYXQgb2Zmc2V0LiBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8KLQkgKiBJbmRleGVkUmVnaW9uIHRoYXQgY29udGFpbnMgb2Zmc2V0LgotCSAqLwotCUluZGV4ZWRSZWdpb24gZ2V0SW5kZXhlZFJlZ2lvbihpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIElTU1VFOiBkbyB3ZSB3YW50IHRvIHByb3ZpZGUgdGhpcz8gSG93IHRvIGVuc3VyZSBqb2IvdGhyZWFkIHNhZmV0eQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlJbmRleGVkUmVnaW9uW10gZ2V0SW5kZXhlZFJlZ2lvbnMoKTsKLQotCS8qKgotCSAqIFJyZXR1cm5zIHRoZSBJU3RydWN0dXJlZERvY3VtZW50IHRoYXQgdW5kZXJsaWVzIHRoaXMgbW9kZWwKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNEaXJ0eSgpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIG1vZGVsIGlzIHdpdGhpbiBhCi0JICogImFib3V0VG9DaGFuZ2UiIGFuZCAiY2hhbmdlZCIgc2VxdWVuY2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RlbFN0YXRlQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNOZXcoKTsKLQotCWJvb2xlYW4gaXNSZWluaXRpYWxpemF0aW9uTmVlZGVkKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGlzIGEgY29tYmluYXRpb24gb2YgaWYgdGhlIG1vZGVsIGlzIGRpcnR5IGFuZCBpZiB0aGUgbW9kZWwgaXMKLQkgKiBzaGFyZWQgZm9yIHdyaXRlIGFjY2Vzcy4gVGhlIGxhc3Qgd3JpdGVyIGFzIHRoZSByZXNwb25zaWJpbGl0eSB0byBiZQotCSAqIHN1cmUgdGhlIHVzZXIgaXMgcHJvbXB0ZWQgdG8gc2F2ZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVOZWVkZWQoKTsKLQotCS8qKgotCSAqIG5ld0luc3RhbmNlIGlzIHNpbWlsYXIgdG8gY2xvbmUsIGV4Y2VwdCB0aGF0IHRoZSBuZXdJbnN0YW5jZSBjb250YWlucwotCSAqIG5vIGNvbnRlbnQuIEl0cyBwdXJwb3NlIGlzIHNvIGNsaWVudHMgY2FuIGdldCBhIHRlbXBvcmFyeSwgdW5tYW5hZ2VkLAotCSAqIG1vZGVsIG9mIHRoZSBzYW1lICJ0eXBlIiBhcyB0aGUgb3JpZ2luYWwuIE5vdGU6IHRoZSBjbGllbnQgbWF5IHN0aWxsCi0JICogbmVlZCB0byBkbyBzb21lIGludGlhbGl6YXRpb24gb2YgdGhlIG1vZGVsIHJldHVybmVkIGJ5IG5ld0luc3RhbmNlLAotCSAqIGRlcGVuZGluZyBvbiBkZXNpcmVkIHVzZS4gRm9yIGV4YW1wbGUsIHRoZSBvbmx5IGZhY3RvcmllcyBpbiB0aGUKLQkgKiBuZXdJbnN0YW5jZSBhcmUgdGhvc2UgdGhhdCB3b3VsZCBiZSBub3JtYWxseSBiZSBjcmVhdGVkIGZvciBhIG1vZGVsIG9mCi0JICogdGhlIGdpdmVuIGNvbnRlbnRUeXBlLiBPdGhlcnMgYXJlIG5vdCBjb3BpZWQgYXV0b21hdGljYWxseSwgYW5kIGlmCi0JICogZGVzaXJlZCwgc2hvdWxkIGJlIGFkZGVkIGJ5IGNsaWVudC4KLQkgKi8KLQlJU3RydWN0dXJlZE1vZGVsUHJvcG9zZWQgbmV3SW5zdGFuY2UoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQl2b2lkIHJlbW92ZU1vZGVsU3RhdGVMaXN0ZW5lcihJTW9kZWxTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2ZmNzhlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci0KLQotLyoqCi0gKiBBIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaXMgYSBjb2xsZWN0aW9uIG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuIEl0J3MKLSAqIG9mdGVuIGNhbGxlZCAiZmxhdCIgYmVjYXVzZSBpdHMgY29udGVudHMgYnkgZGVzaWduIGRvIG5vdCBjb250YWluIG11Y2gKLSAqIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gYmV5b25kIGNvbnRhaW5tZW50LiBDbGllbnRzIHNob3VsZCBub3QgaW1wbGVtZW50LgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZXh0ZW5kcyBJRW5jb2RlZERvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElBZGFwdGFibGUgewotCi0Jdm9pZCBhZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogVGhlIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVycyBhbmQgTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGFyZSB2ZXJ5Ci0JICogc2ltaWxhci4gVGhleSBib3RoIHJlY2VpdmUgaWRlbnRpY2FsIGV2ZW50cy4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlCi0JICogdGltaW5nLiBUaGUgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVycyBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlCi0JICogc3RydWN0dXJlZERvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQsIGJ1dCBiZWZvcmUgb3RoZXIsIHJlbGF0ZWQgbW9kZWxzCi0JICogbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIHN1Y2ggYXMgdGhlIFN0cnVjdHVyYWwgTW9kZWwuIFRoZSBTdHJ1Y3R1cmFsCi0JICogbW9kZWwgaXMgaW4gZmFjdCBpdHNlbGYgYSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdG5lci4gVGhlCi0JICogTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGNhbiByZXN0IGFzc3VyZWQgdGhhdCBhbGwgbW9kZWxzIGFuZCBkYXRhIGhhdmUKLQkgKiBiZWVuIHVwZGF0ZWQgZnJvbSB0aGUgY2hhbmdlIGJ5IHRoZSB0aWVtIHRoZXkgYXJlIG5vdGlmaWVkLiBUaGlzIGlzCi0JICogZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHRoZSB0ZXh0IHdpZGdldCwgZm9yIGV4YW1wbGUsIHdoaWNoIG1heSByZWx5Ci0JICogb24gYm90aCBzdHJ1Y3R1cmVkRG9jdW1lbnQgYW5kIHN0cnVjdHVyYWwgbW9kZWwgaW5mb3JtYXRpb24uCi0JICovCi0Jdm9pZCBhZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogVGhlIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVycyBhbmQgTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGFyZSB2ZXJ5Ci0JICogc2ltaWxhci4gVGhleSBib3RoIHJlY2VpdmUgaWRlbnRpY2FsIGV2ZW50cy4gVGhlIGRpZmZlcmVuY2UgaXMgdGhlCi0JICogdGltaW5nLiBUaGUgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVycyBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlCi0JICogc3RydWN0dXJlZERvY3VtZW50IGhhcyBiZWVuIGNoYW5nZWQsIGJ1dCBiZWZvcmUgb3RoZXIsIHJlbGF0ZWQgbW9kZWxzCi0JICogbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIHN1Y2ggYXMgdGhlIFN0cnVjdHVyYWwgTW9kZWwuIFRoZSBTdHJ1Y3R1cmFsCi0JICogbW9kZWwgaXMgaW4gZmFjdCBpdHNlbGYgYSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdG5lci4gVGhlCi0JICogTW9kZWxDaGFuZ2VkTGlzdGVuZXJzIGNhbiByZXN0IGFzc3VyZWQgdGhhdCBhbGwgbW9kZWxzIGFuZCBkYXRhIGhhdmUKLQkgKiBiZWVuIHVwZGF0ZWQgZnJvbSB0aGUgY2hhbmdlIGJ5IHRoZSB0aWVtIHRoZXkgYXJlIG5vdGlmaWVkLiBUaGlzIGlzCi0JICogZXNwZWNpYWxseSBpbXBvcnRhbnQgZm9yIHRoZSB0ZXh0IHdpZGdldCwgZm9yIGV4YW1wbGUsIHdoaWNoIG1heSByZWx5Ci0JICogb24gYm90aCBzdHJ1Y3R1cmVkRG9jdW1lbnQgYW5kIHN0cnVjdHVyYWwgbW9kZWwgaW5mb3JtYXRpb24uCi0JICovCi0Jdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIHRoaXMgQVBJIGVuc3VyZXMgdGhhdCBhbnkgcG9ydGlvbiBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIHN0YXJ0T2ZmIHRvCi0JICogbGVuZ3RoIGlzIG5vdCByZWFkb25seSAodGhhdCBpcywgdGhhdCBpdHMgZWRpdGFibGUpLiBOb3RlIHRoYXQgaWYgdGhlCi0JICogcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBvdGhlciByZWFkb25seSByZWdpb25zLCB0aG9zZSBvdGhlciByZWFkb25seQotCSAqIHJlZ2lvbnMgd2lsbCBiZSBhZGp1c3RlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICovCi0Jdm9pZCBjbGVhclJlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCk7Ci0KLQkvKioKLQkgKiByZXR1cm5zIHRydWUgaWYgYW55IHBvcnRpb24gb2Ygc3RhcnRPZmZzZXQgdG8gbGVuZ3RoIGlzIHJlYWRvbmx5Ci0JICogCi0JICogQHBhcmFtIHN0YXJ0T2Zmc2V0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlib29sZWFuIGNvbnRhaW5zUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIHJlbWVtYmVyIGluZm8gYWJvdXQgdGhlIGVuY29kaW5nIFdoZW4gdGhlIHJlc291cmNlCi0JICogd2FzIGxhc3QgbG9hZGVkIG9yIHNhdmVkLiBOb3RlOiBpdCBpcyBub3Qga2VwdCAiY3VycmVudCIsIHRoYXQgaXMsIGNhbgotCSAqIG5vdCBiZSBkZXBlbmRlZCBvbiBibGluZGx5IHRvIHJlZmxlY3Qgd2hhdCBlbmNvZGluZyB0byB1c2UuIEZvciB0aGF0LAotCSAqIG11c3QgZ28gdGhyb3VnaCB0aGUgbm9ybWFsIHJ1bGVzIGV4cHJlc3NlZCBpbiBMb2FkZXJzIGFuZCBEdW1wZXJzLgotCSAqLwotCi0JRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpOwotCi0Jb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0Jb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBUaGlzIGNhbiBiZSBjb25zaWRlcmVkIHRoZSBwcmVmZXJyZWQgZGVsaW1pdGVyLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpOwotCi0JaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KTsgLy8gdGhyb3dzIFNvdXJjZUVkaXRpbmdFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBUaGUgcGFyc2VyIGlzIG5vdyByZXF1aXJlZCBvbiBjb25zdHJ1Y3Rvciwgc28gdGhlcmUgYXJlIG9jY2FzaW9ucyBpdAotCSAqIG5lZWRzIHRvIGJlIHJldHJpZXZlZCwgc3VjaCBhcyB0byBiZSBpbml0aWFsaXplZCBieSBFbWJlZGRlZENvbnRlbnRUeXBlCi0JICovCi0JUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpOwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKQotCSAqIEByZXR1cm4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBnZXRSZWdpb25MaXN0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPiBhdCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldC4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiB0aGUgPGNvZGU+SVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjwvY29kZT4gYXQgdGhlIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+cyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHJldHVybiA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPnMgaW4gdGhlIHNwZWNpZmllZCByYW5nZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQkKLQkvKioKLQkgKiBSZXR1cm5zIGFsbCA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPnMgaW4gdGhlIGRvY3VtZW50LgotCSAqIEByZXR1cm4gYWxsIDxjb2RlPklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb248L2NvZGU+cyBpbiB0aGUgZG9jdW1lbnQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkKLQkvKioKLQkgKiBOb3RlOiB0aGlzIG1ldGhvZCB3YXMgbWFkZSBwdWJsaWMsIGFuZCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UsIGZvcgotCSAqIGVhc2llciB0ZXN0aW5nLiBDbGllbnRzIG5vcm1hbGx5IG5ldmVyIG1hbmlwdWxhdGUgdGhlIHJlcGFyc2VyIGRpcmVjdGx5Ci0JICogKG5vciBzaG91bGQgdGhleSBuZWVkIHRvKS4KLQkgKi8KLQlJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpOwotCi0JU3RyaW5nIGdldFRleHQoKTsKLQotCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGdldFVuZG9NYW5hZ2VyKCk7Ci0KLQkvKioKLQkgKiBjYXVzZXMgdGhhdCBwb3J0aW9uIG9mIHRoZSBkb2N1bWVudCBmcm9tIHN0YXJ0T2Zmc2V0IHRvIGxlbmd0aCB0byBiZQotCSAqIG1hcmtlZCBhcyByZWFkb25seS4gTm90ZSB0aGF0IGlmIHRoaXMgcmFuZ2Ugb3ZlcmxhcHMgd2l0aCBzb21lIG90aGVyCi0JICogcmVnaW9uIHdpdGggaXMgcmVhZG9ubHksIHRoZSByZWdpb25zIGFyZSBlZmZlY3Rpdmx5IGNvbWJpbmVkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydE9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKi8KLQl2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogbmV3SW5zdGFuY2UgaXMgc2ltaWxhciB0byBjbG9uZSwgZXhjZXB0IGl0IGNvbnRhaW5zIG5vIGRhdGEuIE9uZQotCSAqIGltcG9ydGFudCB0aGluZyB0byBkdXBsaWNhdGUgaXMgdGhlIHBhcnNlciwgd2l0aCB0aGUgcGFyc2VyIGNvcnJlY3RseQotCSAqICJjbG9uZWQiLCBpbmNsdWRpbmcgaXRzIHRva2VuaW56ZXIsIGJsb2NrIHRhZ3MsIGV0Yy4KLQkgKiAKLQkgKiBOT1RFOiBldmVuIGFmdGVyIG9idGFpbmluZyBhICduZXdJbnN0YW5jZScgdGhlIGNsaWVudCBtYXkgaGF2ZSB0byBkbwotCSAqIHNvbWUgaW5pdGlhbGl6YXRpb24sIGZvciBleGFtcGxlLCBpdCBtYXkgbmVlZCB0byBhZGQgaXRzIG93biBtb2RlbAotCSAqIGxpc3RlbmVycy4gT3IsIGFzIGFub3RoZXIgZXhhbXBsZSwgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaGFzIGEKLQkgKiBwYXJzZXIgb2YgdHlwZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXIsIHRoZW4gdGhlIGNsaWVudCBtYXkgbmVlZAotCSAqIHRvIGFkZCBpdHMgb3duIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIgdG8gdGhhdCBwYXJzZXIsIGlmIGl0IGlzCi0JICogaW4gZmFjdCBuZWVkZWQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBuZXdJbnN0YW5jZSgpOwotCi0Jdm9pZCByZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCByZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpOwotCi0Jdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotCS8qKgotCSAqIE9uZSBvZiB0aGUgQVBJcyB0byBtYW5pcHVsYXRlIHRoZSBJU3RydWN0dXJlZERvY3VtZW50LgotCSAqIAotCSAqIHJlcGxhY2VUZXh0IHJlcGxhY2VzIHRoZSB0ZXh0IGZyb20gb2xkU3RhcnQgdG8gb2xkRW5kIHdpdGggdGhlIG5ldyB0ZXh0Ci0JICogZm91bmQgaW4gdGhlIHJlcXVlc3RlZENoYW5nZSBzdHJpbmcuIElmIG9sZFN0YXJ0IGFuZCBvbGRFbmQgYXJlIGVxdWFsLAotCSAqIGl0IGlzIGFuIGluc2VydGlvbiByZXF1ZXN0LiBJZiByZXF1ZXN0ZWRDaGFuZ2UgaXMgbnVsbCAob3IgZW1wdHkpIGl0IGlzCi0JICogYSBkZWxldGUgcmVxdWVzdC4gT3RoZXJ3aXNlIGl0IGlzIGEgcmVwbGFjZSByZXF1ZXN0LgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlKTsKLQotCS8qKgotCSAqIE5vdGUsIHNhbWUgYXMgcmVwbGFjZVRleHQgQVBJLCBidXQgd2lsbCBhbGxvdyByZWFkb25seSBhcmVhcyB0byBiZQotCSAqIHJlcGxhY2VkLiBUaGlzIHNob3VsZCBzZWxkb20gYmUgY2FsbGVkIHdpdGggYSB2YWx1ZSBvZiAidHJ1ZSIgZm9yCi0JICogaWdub3JlUmVhZE9ubHlTZXR0aW5nLiBPbmUgY2FzZSB3aGVyZSBpdHMgb2sgaXMgd2l0aCB1bmRvIG9wZXJhdGlvbnMKLQkgKiAoc2luY2UsIHByZXN1bWFibHksIGlmIHVzZXIganVzdCBkaWQgc29tZXRoaW5nIHRoYXQgaGFwcGVuZGVkIHRvCi0JICogaW52b2x2ZSBzb21lIGluc2VydGluZyByZWFkb25seSB0ZXh0LCB0aGV5IHNob3VsZCBub3JtYWxseSBiZSBhbGxvd2VkCi0JICogdG8gc3RpbGwgdW5kbyB0aGF0IG9wZXJhdGlvbi4gT3RoZXJ3aXNlLCBJIGNhbid0IHRoaW5rIG9mIGEgc2luZ2xlCi0JICogZXhhbXBsZSwgdW5sZXNzIGl0cyB0byBnaXZlIHRoZSB1c2VyIGEgY2hvaWNlLCBlLmcuICJ5b3UgYXJlIGFib3V0IHRvCi0JICogb3ZlcndyaXRlIHJlYWQgb25seSBwb3J0aW9ucywgZG8geW91IHdhbnQgdG8gY29udGludWUiLgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZyk7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyB0byByZW1lbWJlciBpbmZvIGFib3V0IHRoZSBlbmNvZGluZyBXaGVuIHRoZSByZXNvdXJjZQotCSAqIHdhcyBsYXN0IGxvYWRlZCBvciBzYXZlZC4gTm90ZTogaXQgaXMgbm90IGtlcHQgImN1cnJlbnQiLCB0aGF0IGlzLCBjYW4KLQkgKiBub3QgYmUgZGVwZW5kZWQgb24gYmxpbmRseSB0byByZWZsZWN0IHdoYXQgZW5jb2RpbmcgdG8gdXNlLiBGb3IgdGhhdCwKLQkgKiBtdXN0IGdvIHRocm91Z2ggdGhlIG5vcm1hbCBydWxlcyBleHByZXNzZWQgaW4gTG9hZGVycyBhbmQgRHVtcGVycy4KLQkgKi8KLQl2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKTsKLQotCXB1YmxpYyB2b2lkIHNldExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcik7Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIEFQSXMgdG8gbWFuaXB1bGF0ZSB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBpbiB0ZXJtcyBvZiBUZXh0LgotCSAqIAotCSAqIFRoZSBzZXRUZXh0IG1ldGhvZCByZXBsYWNlcyBhbGwgdGV4dCBpbiB0aGUgbW9kZWwuCi0JICovCi0JU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgYWxsVGV4dCk7Ci0KLQl2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGQxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIEEgSVRleHRSZWdpb25Db2xsZWN0aW9uIGlzIGEgY29sbGVjdGlvbiBvZiBJVGV4dFJlZ2lvbnMuIEl0IGlzIGEgc3RydWN0dXJhbAotICogdW5pdCwgYnV0IGEgbWluaW1hbCBvbmUuIEZvciBleGFtcGxlLCBpbiBtaWdodCBjb25zaXN0IG9mIGEgInN0YXJ0IHRhZyIgYnV0Ci0gKiBub3QgYSB3aG9sZSBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgSVRleHRSZWdpb25Db2xsZWN0aW9uIHsKLQotCS8qKgotCSAqIEFkZHMgYSB0ZXh0IHJlZ2lvbiB0byB0aGUgZW5kIG9mIHRoZSBjb2xsZWN0aW9uIG9mIHJlZ2lvbnMgY29udGFpbmVkIGJ5Ci0JICogdGhpcyByZWdpb24uIEl0IGlzIHRoZSBwYXJzZXJzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSBpdHMgYQotCSAqIGNvcnJlY3QgcmVnaW9uICh0aGF0IGlzLCBpdHMgc3RhcnQgb2Zmc2V0IGlzIG9uZSBncmVhdGVyIHRoYW4gcHJldmlvdXMKLQkgKiByZWdpb25zIGVuZCBvZmZzZXQpCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seS4KLQkgKi8KLQl2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIHRoYXQgZm9sbG93cyB0aGlzIG9uZSBvciBudWxsIGlmCi0JICogYXQgZW5kIG9mIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIHRoYXQgZm9sbG93cyB0aGlzIG9uZS4KLQkgKiAKLQkgKiBJU1NVRTogZm9yIHRocmVhZCBzYWZldHksIHRoaXMgc2hvdWxkIGJlIG1vcmUgcmVzdHJpY3RpdmUuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXROZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgcmVnaW9ucyBwYXJlbnQgZG9jdW1lbnQuCi0JICogCi0JICogQHJldHVybiB0aGlzIHJlZ2lvbnMgcGFyZW50IGRvY3VtZW50LgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIHRoYXQgcHJlY2VlZHMgdGhpcyBvbmUgb3IgbnVsbAotCSAqIGlmIGF0IGJlZ2lubmluZyBvZiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiB0aGF0IGZvbGxvd3MgdGhpcyBvbmUuCi0JICogCi0JICogSVNTVUU6IGZvciB0aHJlYWQgc2FmZXR5LCB0aGlzIHNob3VsZCBiZSBtb3JlIHJlc3RyaWN0aXZlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldmlvdXMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRvY3VtZW50IGhhcyBiZWVuIGRlbGV0ZWQsIGFuZCBpcyBubyBsb25nZXIgcGFydAotCSAqIG9mIHRoZSBhY3R1YWwgc3RydWN0dXJlZCBkb2N1bWVudC4gVGhpcyBmaWVsZCBjYW4gYmUgdXNlZCBpbgotCSAqIG11bHRpLXRocmVhZGVkIG9wZXJhdGlvbnMsIHdoaWNoIG1heSByZXRyaWV2ZSBhIGxvbmcgbGlzdCBvZiByZWdpb25zCi0JICogYW5kIGJlIGl0ZXJhdGluZyB0aHJvdWdoIHRoZW0gYXQgdGhlIHNhbWUgdGltZSB0aGUgZG9jdW1lbnQgaXMKLQkgKiBtb2RpZmllZCwgYW5kIHJlZ2lvbnMgZGVsZXRlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyByZWdpb24gaXMgbm8gbG9uZ2VyIHBhcnQgb2YgZG9jdW1lbnQuCi0JICovCi0JYm9vbGVhbiBpc0RlbGV0ZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIHdhcyBlbmRlZCAibmF0dXJhbGx5IgotCSAqIGJ5IHN5bnRhY3RpYyBydWxlcywgb3IgaWYgc2ltcGx5IGFzc3VtZWQgdG8gZW5kIHNvIGFub3RoZXIgY291bGQgYmUKLQkgKiBzdGFydGVkLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiByZWdpb24gaGFzIHN5bnRhY3RpYyBlbmQuCi0JICovCi0JYm9vbGVhbiBpc0VuZGVkKCk7Ci0KLQkvKioKLQkgKiBUZXN0cyBpcyByZWdpb24gaXMgZXF1YWwgdG8gdGhpcyBvbmUsIGlnbm9yaW5nIHBvc2l0aW9uIG9mZnNldHMgb2YKLQkgKiBzaGlmdC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcGFyYW0gc2hpZnQKLQkgKiBAcmV0dXJuCi0JICovCi0JYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCk7Ci0KLQkvKioKLQkgKiBUZXN0cyBpZiA8Y29kZT5vbGRSZWdpb248L2NvZGU+IGlzIHNhbWUgYXMgPGNvZGU+bmV3UmVnaW9uPC9jb2RlPiwKLQkgKiBpZ25vcmluZyBwb3NpdGlvbiBvZmZzZXRzIG9mIDxjb2RlPnNoaWZ0PC9jb2RlPi4KLQkgKiAKLQkgKiBJU1NVRTogd2hpY2ggZG9jdW1lbnQgcmVnaW9uIGFyZSBvbGQgYW5kIG5ldyBpbj8KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBvbGRSZWdpb24KLQkgKiBAcGFyYW0gZG9jdW1lbnRSZWdpb24KLQkgKiBAcGFyYW0gbmV3UmVnaW9uCi0JICogQHBhcmFtIHNoaWZ0Ci0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gc2FtZUFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpOwotCi0JLyoqCi0JICogU2V0IHRvIHRydWUgaWYvd2hlbiB0aGlzIHJlZ2lvbiBpcyByZW1vdmVkIGZyb20gYSBkb2N1bWVudCwgZHVyaW5nIHRoZQotCSAqIHByb2Nlc3Mgb2YgcmUtcGFyc2luZy4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBkZWxldGVkCi0JICovCi0Jdm9pZCBzZXREZWxldGVkKGJvb2xlYW4gZGVsZXRlZCk7Ci0KLQkvKioKLQkgKiBTZXQgdG8gdHJ1ZSBieSBwYXJzZXIvcmVwYXJzZXIgaWYgcmVnaW9uIGRlZW1lZCB0byBlbmQgc3ludGFjdGljYWxseS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBoYXNFbmQKLQkgKi8KLQl2b2lkIHNldEVuZGVkKGJvb2xlYW4gaGFzRW5kKTsKLQotCS8qKgotCSAqIFNldHMgbGVuZ3RoIG9mIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpOwotCi0JLyoqCi0JICogQXNzaWducyBwb2ludGVyIHRvIG5leHQgcmVnaW9uLCBvciBudWxsIGlmIGxhc3QgcmVnaW9uLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCk7Ci0KLQkvKioKLQkgKiBBc3NpZ25zIHBhcmVudCBkb2N1bW5ldC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0UGFyZW50RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCk7Ci0KLQkvKioKLQkgKiBBc3NpZ25zIHBvaW50ZXIgdG8gcHJldmlvdXMgcmVnaW9uLCBvciBudWxsIGlmIGZpcnN0IHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cyk7Ci0KLQkvKioKLQkgKiBTZXRzIHN0YXJ0IG9mZnNldCBvZiByZWdpb24sIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBkb2N1bWVudC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqLwotCXZvaWQgc2V0U3RhcnQoaW50IG5ld1N0YXJ0KTsKLQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkN2RiNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi0vKioKLSAqIFRoaXMgaXMgYSBjbGFzcyB1c2VkIHRvIHByb3ZpZGUgYSBsaXN0IG9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIHNvIHRoZQotICogaW1wbGVtZW50YXRpb24gb2YgaG93IHRoZSBsaXN0IGlzIGZvcm1lZCBjYW4gYmUgaGlkZGVuIChlbmNhcHN1bGF0ZWQgYnkKLSAqIHRoaXMgY2xhc3MpLgotICogCi0gKiBJU1NVRTogc2hvdWxkIGV4dGVuZCBJVGV4dFJlZ2lvbkxpc3QgaW5zdGVhZD8KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGVudW1lcmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gZW51bWVyYXRpb24uCi0JICovCi0JRW51bWVyYXRpb24gZWxlbWVudHMoKTsKLQotCS8qKgotCSAqIFJldHVybnMgc2l6ZSBvZiBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gc2l6ZSBvZiBsaXN0LgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIGF0IGluZGV4IGkuCi0JICogCi0JICogQHBhcmFtIGkKLQkgKiAgICAgICAgICAgIGluZGV4IG9mIHJlZ2lvbiB0byByZXR1cm4KLQkgKiBAcmV0dXJuIHRoZSByZWdpb24gYXQgc3BlY2lmaWVkIG9mZnNldC4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGl0ZW0oaW50IGkpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9uVHlwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjN2I4MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb25pbmcgZm9yIFN0cnVjdHVyZWREb2N1bWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCB1c2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25zCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRQYXJ0aXRpb25UeXBlcyB7Ci0KLQlTdHJpbmcgREVGQVVMVF9QQVJUSVRJT04gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5TVF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBVTktOT1dOX1BBUlRJVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLlVOS05PV05fUEFSVElUSU9OX1RZUEUiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvbmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2U5NDBjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFBhcnRpdGlvbmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotLyoqCi0gKiBJZGVudGlmaWVzIHRoZSB3YXkgdGhhdCBEb2N1bWVudHMgYXJlIHBhcnRpdGlvbmVkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFBhcnRpdGlvbmluZyB7Ci0JCi0JLyoqIFN0cmluZyB0byBpZGVudGlmeSBkZWZhdWx0IHBhcnRpdGlvbmluZyovCi0JU3RyaW5nIERFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmRlZmF1bHRfc3RydWN0dXJlZF90ZXh0X3BhcnRpdGlvbmluZyI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNjRjODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5JU3RydWN0dXJlZFR5cGVkUmVnaW9uOwotCi0KLS8qKgotICogQSBwYXJ0aXRpb25lciBpbnRlcmZhY2UgcmVxdWlyZWQgZm9yIGhhbmRsaW5nIHRoZSBlbWJlZGRlZCBjb250ZW50IHR5cGUgCi0gKiBwcm9wZXJseS4gCi0gKiAKLSAqIElTU1VFOiBuZWVkIHRvIGludmVzdGlnYXRlIG5lY2Vzc2l0eSBvZiB0aGVzZSBtZXRob2RzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgZXh0ZW5kcyBJRG9jdW1lbnRQYXJ0aXRpb25lciB7Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IEpTUCBwYXJ0aXRpb25lciB0byBlbnN1cmUgdGhhdCB0aGUgcGFydGl0aW9uZXIgb2YgdGhlCi0JICogZW1iZWRkZWQgY29udGVudCB0eXBlIGdldHMgdG8gY3JlYXRlIHRoZSBwYXJ0aXRpb24gaW4gY2FzZSB0aGUgc3BlY2lmaWMKLQkgKiBjbGFzc2VzIGFyZSBpbXBvcnRhbnQuCi0JICogCi0JICogSVNTVUU6IGludmVzdGlnYXRlIGlmIHdlIHJlYWxseSBuZWVkIHRoaXMuLi4KLQkgKi8KLQlJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGNyZWF0ZVBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgcGFydGl0aW9uVHlwZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBEZWZhdWx0IHBhcnRpdGlvbiB0eXBlIGZvciB0aGlzIHBhcnRpdGlvbmVyLgotCSAqIDxwPgotCSAqIGVnOgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVDwvY29kZT4KLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQ8L2NvZGU+Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUPC9jb2RlPgotCSAqIDwvcD4KLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9ucwotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGV4dC5JSFRNTFBhcnRpdGlvbnMKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zCi0JICogCi0JICogQHJldHVybiB0aGUgRGVmYXVsdCBwYXJ0aXRpb24gdHlwZSBmb3IgdGhpcyBwYXJ0aXRpb25lci4KLQkgKi8KLQlTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHBhcnRpY3VsYXIgcGFydGl0aW9uIHR5cGUgZm9yIHRoZSBnaXZlbiByZWdpb24vb2Zmc2V0LgotCSAqIDxwPgotCSAqIGVnOgotCSAqIDxicj48Y29kZT5vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVDwvY29kZT4KLQkgKiA8YnI+PGNvZGU+b3JnLmVjbGlwc2Uud3N0Lmh0bWwuY29yZS50ZXh0LklIVE1MUGFydGl0aW9ucy5IVE1MX0RFRkFVTFQ8L2NvZGU+Ci0JICogPGJyPjxjb2RlPm9yZy5lY2xpcHNlLndzdC5qc3AuY29yZS50ZXh0LklKU1BQYXJ0aXRpb25zLkpTUF9ERUZBVUxUPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uIG9mIHRoZSBJU3RydWN0dXJlZERvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldCBpbiB0aGUgSVN0cnVjdHVyZWREb3VjbWVudAotCSAqIEByZXR1cm4gdGhlIHBhcnRpY3VsYXIgcGFydGl0aW9uIHR5cGUgZm9yIHRoZSBnaXZlbiByZWdpb24vb2Zmc2V0LgotCSAqLwotCVN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gdHlwZSBTdHJpbmcgb2YgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gCi0JICogYmV0d2VlbiB0aGUgMiByZWdpb24gcGFyYW1ldGVycy4KLQkgKiBVc2VmdWwgZm9yIGZpbmRpbmcgdGhlIHBhcnRpdGlvbiB0eXBlIG9mIGEgMCBsZW5ndGggcmVnaW9uLgotCSAqIGVnLgotCSAqIDxwcmU+Ci0JICogCTxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij58PC9zY3JpcHQ+Ci0JICogPC9wcmU+Ci0JICogQHBhcmFtIHByZXZpb3VzTm9kZQotCSAqIEBwYXJhbSBuZXh0Tm9kZQotCSAqIEByZXR1cm4gdGhlIHBhcnRpdGlvbiB0eXBlIG9mIHRoZSBub2RlIGJldHdlZW4gcHJldmlvdXNOb2RlIGFuZCBuZXh0Tm9kZQotCSAqIEBkZXByZWNhdGVkIG1vdmUgdG8gSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24yIC0+Ci0JICogIFN0cmluZyBnZXRDb250ZW50VHlwZShpbnQgb2Zmc2V0LCBib29sZWFuIHByZWZlck9wZW5QYXJ0aXRpb25zKTsKLQkgKi8KLQlTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c05vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV4dE5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ2NWZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLS8qKgotICogSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZGVzY3JpYmVzIHRoZSBjaGFyYWN0ZXJpc3RpY3MgYW5kIHJlc3BvbnNpYmlsaXRpZXMKLSAqIGZvciByZXBhcnNpbmcgYSBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRSZVBhcnNlciB7Ci0KLQkvKioKLQkgKiBCZWdpbnMgdGhlIHByb2Nlc3Mgb2YgcmVwYXJzaW5nLCBieSBwcm92aWRpbmcgdGhlIGluZm9ybWF0aW9uIG5lZWRlZAotCSAqIGZvciB0aGUgcmVwYXJzZS4gVGhlIHJlcGFyc2UgaXMgYWN0dWFsbHkgcGVyZm9ybWVkIHdoZW4gdGhlIHJlcGFyc2UKLQkgKiBtZXRob2QgaXMgY2FsbGVkLiBXaWxsIHRocm91Z2ggYW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGRvY3VtZW50IGFzCi0JICogbm90IGJlIHNldC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIGxlbmd0aFRvUmVwbGFjZQotCSAqIEBwYXJhbSBjaGFuZ2VzCi0JICovCi0Jdm9pZCBpbml0aWFsaXplKE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSwgU3RyaW5nIGNoYW5nZXMpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIG11bHRpcGxlIHRocmVhZHMgdG8gcmVwYXJzZSBhCi0JICogZG9jdW1lbnQuIFRoaXMgaXMgbmVlZGVkIHNpbmNlIHRoZSBpbnRpYWxpemUgbWV0aG9kIHNldHMgc3RhdGUKLQkgKiB2YXJpYWJsZXMgdGhhdCBtdXN0IGJlICJpbiBzeW5jIiB3aXRoIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQYXJzaW5nKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcmVwYXJzZXIsIHVzZWQgd2hlbiBjbG9uaW5nIGRvY3VtZW50cy4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoaXMgcmVwYXJzZXIuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCk7Ci0KLQkvKioKLQkgKiBBbiBlbnRyeSBwb2ludCBmb3IgcmVwYXJzaW5nLiBJdCBuZWVkcyB0byBjYWxjdWxhdGVzIHRoZSBkaXJ0eSBzdGFydAotCSAqIGFuZCBkaXJ0eSBlbmQgaW4gdGVybXMgb2Ygc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb25zIGJhc2VkIG9uIHRoZQotCSAqIHN0YXJ0IHBvaW50IGFuZCBsZW5ndGggb2YgdGhlIGNoYW5nZXMsIHdoaWNoIGFyZSBwcm92aWRlZCBieSB0aGUKLQkgKiBpbml0aWFsaXplIG1ldGhvZC4gV2lsbCB0aHJvdWdoIGFuIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBkb2N1bWVudCBhcwotCSAqIG5vdCBiZSBzZXQuCi0JICogCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoKTsKLQotCi0KLQkvKioKLQkgKiBUaGUgcmVwYXJzZXIgaXMgaW5pdGlhbGl6ZWQgd2l0aCBpdHMgZG9jdW1lbnQsIGVpdGhlciBpbiBvciBzaG9ydGx5Ci0JICogYWZ0ZXIgaXRzIGNvbnN0cnVjdGVkIGlzIGNhbGxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjgxYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLS8qKgotICogQSBzaW1wbGUgZGVzY3JpcHRpb24gb2YgYSBiaXQgb2YgdGV4dCAodGVjaG5pY2FsbHksIGEgYml0IG9mIGEgdGV4dCBidWZmZXIpCi0gKiB0aGF0IGhhcyBhICJ0eXBlIiBhc3NvY2lhdGVkIHdpdGggaXQuIEZvciBleGFtcGxlLCBmb3IgdGhlIFhNTCB0ZXh0Ci0gKiAiJkxUO0lNRyZHVDsiLCB0aGUgJyA8JyBtaWdodCBmb3JtIGEgcmVnaW9uIG9mIHR5cGUgIm9wZW4gYnJhY2tldCIgd2hlcmUgYXMKLSAqIHRoZSB0ZXh0ICJJTUciIG1pZ2h0IGZvcm0gYSByZWdpb24gb2YgdHlwZSAidGFnIG5hbWUiLgotICogCi0gKiBOb3RlIHRoYXQgdGhlcmUgYXJlIHRocmVlIHBvc2l0aW9ucyBhc3NvY2lhdGVkIHdpdGggYSByZWdpb24sIHRoZSBzdGFydCwKLSAqIHRoZSBlbmQsIGFuZCB0aGUgZW5kIG9mIHRoZSB0ZXh0LiBUaGUgZW5kIG9mIHRoZSByZWdpb24gc2hvdWxkIGFsd2F5cyBiZQotICogZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBlbmQgb2YgdGhlIHRleHQsIGJlY2F1c2UgdGhlIGVuZCBvZiB0aGUgdGV4dAotICogc2ltcGx5IGluY2x1ZGVzIGFueSB3aGl0ZSBzcGFjZSB0aGF0IG1pZ2h0IGZvbGxvdyB0aGUgbm9uLXdoaXRlc3BhY2UKLSAqIHBvcnRpb24gb2YgdGhlIHJlZ2lvbi4gVGhpcyB3aGl0ZXNwYWNlIGlzIGFzc3VtZWQgdG8gYmUgaWdub3JhYmxlIGV4Y2VwdAotICogZm9yIHJlYXNvbnMgb2YgbWFpbnRhaW5pbmcgaXQgaW4gdGhlIG9yaWdpbmFsIGRvY3VtZW50IGZvciBmb3JtYXR0aW5nLAotICogYXBwZWFyYW5jZSwgZXRjLgotICogCi0gKiBGb2xsb3dzIHRoZSBQcmltZSBEaXJlY3RpdmVzOgotICogCi0gKiBnZXRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0TGVuZ3RoKCkKLSAqIAotICogZ2V0VGV4dEVuZCgpID09IGdldFN0YXJ0KCkgKyBnZXRUZXh0TGVuZ3RoKCk7Ci0gKiAKLSAqIEV2ZW50IHRob3VnaCAnZW5kJyBhbmQgJ2xlbmd0aCcgYXJlIHJlZHVuZGFudCAoZ2l2ZW4gc3RhcnQpLCBib3RoIG1ldGhvZHMKLSAqIGFyZSBwcm92aWRlZCwgc2luY2Ugc29tZSBwYXJzZXJzL2ltcGxlbWVudGF0aW9ucyBmYXZvciBvbmUgb3IgdGhlIG90aGVyIGZvcgotICogZWZmaWNpZW5jeS4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb24gewotCi0JLyoqCi0JICogQ2hhbmdlcyBsZW5ndGggb2YgcmVnaW9uLiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuCi0JICogemVyby4gSXQgbWF5IG5vdCwgaG93ZXZlciwgY2F1c2UgdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uIHRvIGJlIGxlc3MKLQkgKiB0aGFuIG9yIGVxdWFsIHRvIHplcm8sIG9yIGFuIGlsbGVnYWwgYXJndW1lbnQgYWNjZXB0aW9uIG1heSBiZSB0aHJvd24KLQkgKiBhdCBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpOwotCi0JLyoqCi0JICogQ2hhbmdlcyBzdGFydCBvZmZzZXQgb2YgcmVnaW9uLiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlcgotCSAqIHRoYW4gemVyby4gSXQgbWF5IG5vdCwgaG93ZXZlciwgY2F1c2UgdGhlIG9mZnNldCBvZiB0aGUgcmVnaW9uIHRvIGJlCi0JICogbGVzcyB0aGFuIHplcm8sIG9yIGFuIGlsbGVnYWwgYXJndW1lbnQgYWNjZXB0aW9uIG1heSBiZSB0aHJvd24gYXQKLQkgKiBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RTdGFydChpbnQgaSk7Ci0KLQkvKioKLQkgKiBDaGFuZ2VzIHRleHQgbGVuZ3RoIG9mIHJlZ2lvbi4KLQkgKiAKLQkgKiBNYXkgYmUgbGVzcyB0aGFuLCBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHplcm8uIEl0IG1heSBub3QsIGhvd2V2ZXIsCi0JICogY2F1c2UgdGhlIHRleHQgbGVuZ3RoIG9mIHRoZSByZWdpb24gdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgYQotCSAqIHJlZ2lvbiwgb3IgYW4gaWxsZWdhbCBhcmd1bWVudCBhY2NlcHRpb24gbWF5IGJlIHRocm93biBhdCBydW50aW1lLgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHkuCi0JICovCi0Jdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKTsKLQotCS8qKgotCSAqIE1ha2VzIHRoaXMgcmVnaW9ucyBzdGFydCwgbGVuZ3RoLCBhbmQgdGV4dCBsZW5ndGggZXF1YWwgdG8gdGhlCi0JICogcGFyZW10ZXIncyBzdGFydCwgbGVuZ3RoLCBhbmQgdGV4dCBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqLwotCXZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLiBXaGV0aGVyIGlzIHJlbGF0aXZlIHRvIHRoZQotCSAqIGRvY3VtZW50LCBvciBhbm90aGVyIHJlZ2lvbiBkZXBlbmRzIG9uIHRoZSBzdWJ0eXBlLgotCSAqIAotCSAqIEZvbGxvd3MgdGhlIFByaW1lIERpcmVjdGl2ZTogZ2V0RW5kKCkgPT0gZ2V0U3RhcnQoKSArIGdldExlbmd0aCgpCi0JICogCi0JICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0RW5kKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb2xsb3dzIHRoZSBQcmltZSBEaXJlY3RpdmU6IGdldEVuZCgpID09IGdldFN0YXJ0KCkgKyBnZXRMZW5ndGgoKQotCSAqIAotCSAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcmVnaW9uLgotCSAqLwotCWludCBnZXRMZW5ndGgoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24uIFdoZXRoZXIgaXMgcmVsYXRpdmUgdG8gdGhlIGRvY3VtZW50LAotCSAqIG9yIGFub3RoZXIgcmVnaW9uIGRlcGVuZHMgb24gdGhlIHN1YnR5cGUuCi0JICogCi0JICogRm9sbG93cyB0aGUgUHJpbWUgRGlyZWN0aXZlOiBnZXRFbmQoKSA9PSBnZXRTdGFydCgpICsgZ2V0TGVuZ3RoKCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uLgotCSAqLwotCWludCBnZXRTdGFydCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBJbiBzb21lIGltcGxlbWVudGF0aW9ucywgdGhlICJlbmQiIG9mIHRoZSByZWdpb24gKGFjY2Vzc2libGUgdmlhCi0JICogZ2V0RW5kKCkpIGFsc28gY29udGFpbnMgYW55IGFuZCBhbGwgd2hpdGUgc3BhY2UgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZQotCSAqIHByZXNlbnQgYWZ0ZXIgdGhlICJ0b2tlbiIgKHJlYWQ6IHJlbGV2YW50KSBwYXJ0IG9mIHRoZSByZWdpb24uIFRoaXMKLQkgKiBtZXRob2QsIGdldFRleHRFbmQoKSwgaXMgc3BlY2lmaWMgZm9yIHRoZSAidG9rZW4iIHBhcnQgb2YgdGhlIHJlZ2lvbiwKLQkgKiB3aXRob3V0IHRoZSB3aGl0ZXNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24uCi0JICovCi0JaW50IGdldFRleHRFbmQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBUaGUgdGV4dCBsZW5ndGggaXMgZXF1YWwgdG8gbGVuZ3RoIGlmIHRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGF0IHRoZQotCSAqIGVuZCBvZiBhIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IGlzIHNtYWxsZXIgdGhhbiBsZW5ndGguCi0JICogCi0JICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLgotCSAqLwotCWludCBnZXRUZXh0TGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEBzZWUgcmVnaW9udHlwZXMsIHN0cnVjdHVyZWRkb2N1bWVudHJlZ2lvbnR5cGVzCi0JICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlTdHJpbmcgZ2V0VHlwZSgpOwotCi0JLyoqCi0JICogQWxsb3dzIHRoZSByZWdpb24gaXRzZWxmIHRvIHBhcnRpY2lwYXRlIGluIHJlcGFyc2luZyBwcm9jZXNzLgotCSAqIAotCSAqIFRoZSByZWdpb24gaXRzZWxmIGNhbiBkZWNpZGUgaWYgaXQgY2FuIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZXZlbnQKLQkgKiB0byByZXR1cm4sIGJhc2VkIG9uIHRoZSByZXF1ZXN0ZWQgY2hhbmdlLiBJZiBpdCBjYW4gbm90LCB0aGlzIG1ldGhvZAotCSAqIG11c3QgcmV0dXJuIG51bGwsIHNvIGEgImhpZ2hlciBsZXZlbCIgcmVwYXJzaW5nIHByb2Nlc3Mgd2lsbCBiZSBnaXZlbgotCSAqIHRoZSBvcHB1cnR1bml0eSB0byBkZWNpZGUuIElmIGl0IHJldHVybnMgYW4gRXZlbnQsIHRoYXQncyBpdCwgbm90IG90aGVyCi0JICogcmVwYXJzaW5nIHByb2Nlc3Mgd2lsbCBnZXQgYW4gb3BwdXJ0dW5pdHkgdG8gcmVwYXJzZS4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25Db2xsZWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL3RleHQvSVRleHRSZWdpb25Db2xsZWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ODkwYWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29sbGVjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7Ci0KLS8qKgotICogSVRleHRSZWdpb25Db2xsZWN0aW9uLCBhcyBpdHMgbmFtZSBpbXBsaWVzLCBpcyBhIGNvbGxlY3Rpb24gb2YKLSAqIElUZXh0UmVnaW9ucy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRSZWdpb25Db2xsZWN0aW9uIGV4dGVuZHMgSVRleHRSZWdpb24gewotCi0JLyoqCi0JICogVXNlZCB0byBkZXRlcm1pbmUgaWYgYSByZWdpb24gY29udGFpbnMgYSBwYXJ0aWN1bGFyIG9mZnNldCwgd2hlcmUKLQkgKiBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZWdpb25zIHN0YXJ0IGFuZAotCSAqICAgICAgICAgbGVzcyB0aGFuIGl0cyBlbmQgb2Zmc2V0LgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIGRldGVybWluZSBpZiBhIHJlZ2lvbiBjb250YWlucyBhIHBhcnRpY3VsYXIgb2Zmc2V0LgotCSAqIAotCSAqIElTU1VFOiBJIG5lZWQgdG8gZmlndXJlIG91dCB3aGF0IHRoaXMgaXMgcmVhbGx5IGZvciEgKHRoYXQgaXMsIGhvdyB0bwotCSAqIGRlc2NyaWJlIGl0LCBvciBpZiBzdGlsbCBuZWVkZWQpLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgb2Zmc2V0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZWdpb25zIHN0YXJ0IGFuZAotCSAqICAgICAgICAgbGVzcyB0aGFuIGl0cyBlbmQgb2Zmc2V0LgotCSAqLwotCWJvb2xlYW4gY29udGFpbnNPZmZzZXQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhpcyByZWdpb24sIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZgotCSAqIGRvY3VtZW50LgotCSAqIAotCSAqIEZvciBzb21lIHN1YnR5cGVzLCBidXQgbm90IGFsbCwgaXQgaXMgZXF1aXZpbGVudCB0byBnZXRFbmQoKS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLgotCSAqLwotCWludCBnZXRFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQsIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50IG9mCi0JICogdGhlIGNvbnRhaW5lZCByZWdpb24uCi0JICogCi0JICogQHBhcmFtIGNvbnRhaW5lZFJlZ2lvbgotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24uCi0JICovCi0JaW50IGdldEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgcmVnaW9uIG9mIHRob3NlIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbiBjb2xsZWN0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHJlZ2lvbi4KLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmdWxsIHRleHQgb2YgdGhpcyByZWdpb24sIGluY2x1ZGluZyB3aGl0ZXNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRGdWxsVGV4dCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZnVsbCB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBmdWxsIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIGluY2x1ZGluZyB3aGl0ZXNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGFzdCByZWdpb24gb2YgdGhvc2UgY29udGFpbmVkIGJ5IHRoaXMgcmVnaW9uIGNvbGxlY3Rpb24uCi0JICogCi0JICogQHJldHVybiB0aGUgbGFzdCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lvbnMgY29udGFpbmVkIGJ5IHRoaXMgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBvZmZzZXQuIEluIHRoZSBjYXNlIG9mICJuZXN0ZWQiCi0JICogcmVnaW9ucywgcmV0dXJucyB0aGUgdG9wIG1vc3QgcmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZiBkb2N1bWVudC4KLQkgKiBAcmV0dXJuIHRoZSByZWdpb24gdGhhdCBjb250YWlucyBvZmZzZXQuIEluIHRoZSBjYXNlIG9mICJuZXN0ZWQiCi0JICogICAgICAgICByZWdpb25zLCByZXR1cm5zIHRoZSB0b3AgbW9zdCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBOb3RlOiBubyBhc3N1bXB0aW9ucyBzaG91bGQgYmUgbWFkZSBhYm91dCB0aGUgb2JqZWN0IGlkZW50aXR5IG9mIHRoZQotCSAqIHJlZ2lvbnMgcmV0dXJuZWQuIFB1dCBhbm90aGVyIHdheSwgZHVlIHRvIG1lbW9yeSB1c2Ugb3B0aW1pemF0aW9ucywKLQkgKiBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIHRleHQgaGFzIG5vdCBjaGFuZ2VkLCB0aGUgcmVnaW9ucyBtYXkgb3IgbWF5IG5vdAotCSAqIGJlIHRoZSBzYW1lIG9uZXMgcmV0dXJuZWQgZnJvbSBvbmUgY2FsbCB0byB0aGUgbmV4dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSByZWdpb25zIGNvbnRhaW5lZCBieSB0aGlzIHJlZ2lvbi4KLQkgKi8KLQlJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoaXMgcmVnaW9uLCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mCi0JICogdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGlzIHJlZ2lvbgotCSAqLwotCWludCBnZXRTdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCByZWxhdGl2ZSB0byB0aGUKLQkgKiBiZWdpbm5pbmcgb2YgdGhlIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbgotCSAqLwotCWludCBnZXRTdGFydE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdGV4dCBvZiB0aGlzIHJlZ2lvbiwgbm90IGluY2x1ZGluZyB3aGl0ZSBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqLwotCVN0cmluZyBnZXRUZXh0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBjb250YWluZWQgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIG5vdCBpbmNsdWRpbmcgd2hpdGUgc3BhY2UuCi0JICovCi0JU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhpcyByZWdpb24sIG5vdCBpbmNsdWRpbmcgd2hpdGUKLQkgKiBzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSB0ZXh0IG9mIHRoaXMgcmVnaW9uLCBub3QgaW5jbHVkaW5nIHdoaXRlCi0JICogICAgICAgICBzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0VGV4dEVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGUgdGV4dCBvZiB0aGUgY29udGFpbmVkIHJlZ2lvbiwgbm90Ci0JICogaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIHRleHQgb2YgdGhlIGNvbnRhaW5lZCByZWdpb24sIG5vdAotCSAqICAgICAgICAgaW5jbHVkaW5nIHdoaXRlIHNwYWNlLgotCSAqLwotCWludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbik7Ci0KLQkvKioKLQkgKiBBc3NpZ25zIHRoZSBjb2xsZWN0aW9uIGNvbnRhaW5lZCBpbiB0aGlzIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZWRSZWdpb25zCi0JICovCi0Jdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBjb250YWluZWRSZWdpb25zKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NGNhODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uQ29udGFpbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0vKioKLSAqIElUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5zIG90aGVyIHJlZ2lvbnMsIGxpa2UgYSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24KLSAqIGJ1dCBpcyBpdHNlbGYgYSByZWdpb24gaW4gYW4gSVRleHRSZWdpb25Db2xsZWN0aW9uLCBzbyBpdHMgInBhcmVudCIgcmVnaW9uCi0gKiBpcyBtYWludGFpbmVkLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJVGV4dFJlZ2lvbkNvbnRhaW5lciBleHRlbmRzIElUZXh0UmVnaW9uQ29sbGVjdGlvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgcmVnaW9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHBhcmVudCByZWdpb24uCi0JICovCi0JSVRleHRSZWdpb25Db2xsZWN0aW9uIGdldFBhcmVudCgpOwotCi0JLyoqCi0JICogU2V0cyB0aGUgcGFyZW50IHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gdGhpcyByZWdpb24gaXMgY29udGFpbmVkIGluLgotCSAqLwotCXZvaWQgc2V0UGFyZW50KElUZXh0UmVnaW9uQ29sbGVjdGlvbiBwYXJlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lUZXh0UmVnaW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDEzNTcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JVGV4dFJlZ2lvbkxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIElUZXh0UmVnaW9uTGlzdCBpcyB0byBwcm92aWRlIGEgbGlzdCBvZiByZWdpb25zLiBJdCBjYW4gYmUgdXNlZCBzbyBjbGllbnRzCi0gKiBkbyBub3QgbmVlZCB0byBiZSBhd2FyZSBvZiB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElUZXh0UmVnaW9uTGlzdCB7Ci0KLQkvKioKLQkgKiBBZGRzIHJlZ2lvbiB0byB0aGUgbGlzdC4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGQoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCS8qKgotCSAqIEFkZHMgbmV3IHJlZ2lvbnMgdG8gdGhlIGxpc3QuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqIEBwYXJhbSBpbnNlcnRQb3MKLQkgKiBAcGFyYW0gbmV3UmVnaW9ucwotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluc2VydFBvcywgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMpOwotCi0JLyoqCi0JICogUmVtb3ZlcyBhbGwgcmVnaW9ucyBmcm9tIHRoZSBsaXN0LgotCSAqIAotCSAqIEZvciB1c2UgYnkgcGFyc2VycyBhbmQgcmVwYXJzZXJzIG9ubHksIHdoaWxlIGxpc3QgaXMgYmVpbmcgY3JlYXRlZC4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbGVhcigpOwotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb24gYXQgPGNvZGU+aW5kZXg8L2NvZGU+LCB3aGVyZSAwIGlzIGZpcnN0IG9uZSBpbgotCSAqIHRoZSBsaXN0LiBUaHJvd3MgYW4gPGNvZGU+QXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uPC9jb2RlPiBpZgotCSAqIGxpc3QgaXMgZW1wdHksIG9yIGlmIGluZGV4IGlzIG91dCBvZiByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldChpbnQgaW5kZXgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5kZXggb2YgPGNvZGU+cmVnaW9uPC9jb2RlPiBvciAtMSBpZiA8Y29kZT5yZWdpb248L2NvZGU+Ci0JICogaXMgbm90IGluIHRoZSBsaXN0LgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIGludCBpbmRleE9mKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbGlzdCBoYXMgbm8gcmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgbGlzdCBoYXMgbm8gcmVnaW9ucy4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCk7Ci0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIHRoaXMgbGlzdC4KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIGZvciB0aGlzIGxpc3QuCi0JICovCi0JcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSByZWdpb24gYXQgaW5kZXguCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiByZW1vdmUoaW50IGluZGV4KTsKLQotCS8qKgotCSAqIFJlbW92ZXMgdGhlIHJlZ2lvbi4KLQkgKiAKLQkgKiBGb3IgdXNlIGJ5IHBhcnNlcnMgYW5kIHJlcGFyc2VycyBvbmx5LCB3aGlsZSBsaXN0IGlzIGJlaW5nIGNyZWF0ZWQuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlKElUZXh0UmVnaW9uIHJlZ2lvbik7Ci0KLQotCS8qKgotCSAqIFJlbW92ZXMgYWxsIHJlZ2lvbkxpc3QgZnJvbSB0aGlzIGxpc3QuCi0JICogCi0JICogRm9yIHVzZSBieSBwYXJzZXJzIGFuZCByZXBhcnNlcnMgb25seSwgd2hpbGUgbGlzdCBpcyBiZWluZyBjcmVhdGVkLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbChJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uTGlzdCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBsaXN0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGxpc3QuCi0JICovCi0JcHVibGljIGludCBzaXplKCk7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgdGhlIHJlZ2lvbnMgaW4gYW4gYXJyYXkuIE5vIGFzc3VtcHRpb25zIHNob3VsZCBiZQotCSAqIG1hZGUgaWYgdGhlIHJlZ2lvbnMgaW4gdGhlIGFycmF5IGFyZSBjbG9uZXMgYXJlIHNhbWUgaW5zdGFuY2Ugb2YKLQkgKiBvcmlnaW5hbCByZWdpb24uCi0JICogCi0JICogSVNTVUU6IGRvIHdlIG5lZWQgdG8gc3BlY2lmeSBpZiBjbG9uZWQgY29waWVzIG9yIG5vdD8KLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHJlZ2lvbnMuCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uW10gdG9BcnJheSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTRhZTE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSBpbml0aWFsIElEb2N1bWVudEV4dGVuc2lvbjQgc3VwcG9ydCAtICMxMDI4MjIKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQYXJ0aXRpb25pbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdExpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUxpbmVUcmFja2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5TZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LlN0cnVjdHVyZWREb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5BYm91dFRvQmVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRSZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLlN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIFRoZSBzdGFuZGFyZCBpbXBsZW1lbnRhdGlvbiBvZiBzdHJ1Y3R1cmVkIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50LCBJRG9jdW1lbnRFeHRlbnNpb24sIElEb2N1bWVudEV4dGVuc2lvbjMsIElEb2N1bWVudEV4dGVuc2lvbjQsIENoYXJTZXF1ZW5jZSwgSVJlZ2lvbkNvbXBhcmlibGUgewotCi0JLyoqCi0JICogVGhpcyBUaHJlYWRMb2NhbCBjb25zdHJ1Y3QgaXMgdXNlZCBzbyBlYWNoIHRocmVhZCBjYW4gbWFpbnRhaW4gaXRzIG9ubHkKLQkgKiBwb2ludGVyIHRvIHRoZSBkb3VibGUgbGlua2VkIGxpc3QgdGhhdCBtYW5hZ2VzIHRoZSBkb2N1bWVudHMgcmVnaW9ucy4KLQkgKiBUaGUgb25seSB0aGluZyB3ZSAiZ2F1cmQiIGZvciBpcyB0aGF0IGEgcHJldmlvdXNseSBjYWNoZWQgcmVnaW9uIGhhcwotCSAqIGJlZW4gZGVsZXRlZC4KLQkgKiAKLQkgKiBUaGUgb2JqZWN0IHRoYXQgaXMga2VwdCBpbiB0aGUgdGhyZWFkIGxvY2FsJ3MgbWFwLCBpcyBqdXN0IGEgcG9pbnRlciB0bwotCSAqIGFuIGFycmF5IHBvc2l0aW9uLiBUaGF0J3MgYmVjYXVzZSB0aGUgb2JqZWN0IHRoZXJlIG5lZWRzIHRvIGJlICJmcmVlIgotCSAqIGZyb20gcmVmZXJlbmNlcyB0byBvdGhlciBvYmplY3RzLCBvciBpdCB3aWxsIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZC4KLQkgKi8KLQlwcml2YXRlIGNsYXNzIEN1cnJlbnREb2N1bWVudFJlZ2lvbkNhY2hlIHsKLQkJLy8gSSdtIGFzc3VtaW5nIGZvciBub3cgdGhlcmUgd291bGQgbmV2ZXIgYmUgc28gbWFueSB0aHJlYWRzIHRoYXQKLQkJLy8gdGhpcyBhcnJheUxpc3QgbmVlZHMgdG8gYmUgYm91bmRlZCwgb3IgJ2NsZWFuZWQgdXAnLgotCQkvLyB0aGlzIGFzc3VtcHRpb24gc2hvdWxkIGJlIHRlc3RlZCBpbiBwcmFjdGljZSBhbmQgbG9uZyBydW5uaW5nCi0JCS8vIGpvYnMgLS0gZm91bmQgbm90IHRvIGJlIGEgZ29vZCBhc3N1bXB0aW9uLiBTZWUgYmVsb3cuCi0JCXByaXZhdGUgTGlzdCBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5ID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkTGlzdChuZXcgQXJyYXlMaXN0KCkpOwotCQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQkJcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJWkUgPSA1MDsKLQotCi0JCXByaXZhdGUgVGhyZWFkTG9jYWwgdGhyZWFkTG9jYWxDYWNoZVBvc2l0aW9uID0gbmV3IFRocmVhZExvY2FsKCk7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXQoKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQlpbnQgcG9zID0gZ2V0VGhyZWFkTG9jYWxQb3NpdGlvbigpOwotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5nZXQocG9zKTsKLQkJCX0KLQkJCWNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBldmVuIHRob3VnaCB0aGUgY2FjaGVkUmVnaW9uUG9zaXRpb24gaXMgc3luY2hyb25pemVkLAotCQkJCS8vIHRoYXQganVzdCBtZWFucyBlYWNoIGFjY2VzcyBpcyBzeW5jcm9uaXplZCwgaXRzCi0JCQkJLy8gc3RpbGwgcG9zc2libGUgZm9yIGFub3RoZXIgdGhyZWFkIHRvIGNhdXNlIGl0IHRvCi0JCQkJLy8gYmUgY2xlYXJlZCwgYWZ0ZXIgdGhpcyB0aHJlYWQgZ2V0cyBpdCBwb3NpdGlvbi4KLQkJCQkvLyBTbywgaWYgdGhhdCBoYXBwZW5zLCBhbGwgd2UgY2FuIGRvIGlzIHJlc2V0IHRvIGJlZ2lubmluZy4KLQkJCQkvLyBUaGlzIHNob3VsZCBiZSBleHRyZW1lbHkgcmFyZSAoaW4gb3RoZXIgd29yZHMsIHByb2JhYmx5Ci0JCQkJLy8gbm90IHdvcnRoIHVzaW5nIHN5bmNocm9uaXplZCBibG9ja3MKLQkJCQkvLyB0byBhY2Nlc3MgY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS4KLQkJCQlyZWluaXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQkJcmVzZXRUb0luaXRpYWxTdGF0ZSgpOwotCQkJfQotCQkJaWYgKHJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJcmVnaW9uID0gcmVzZXRUb0luaXRpYWxTdGF0ZSgpOwotCQkJfQotCQkJZWxzZQotCQkJLy8gcmVnaW9uIG5vdCBudWxsCi0JCQlpZiAocmVnaW9uLmlzRGVsZXRlZCgpKSB7Ci0JCQkJcmVnaW9uID0gcmVzZXRUb0luaXRpYWxTdGF0ZSgpOwotCQkJfQotCQkJcmV0dXJuIHJlZ2lvbjsKLQkJfQotCi0JCXByaXZhdGUgaW50IGdldFRocmVhZExvY2FsUG9zaXRpb24oKSB7Ci0JCQlPYmplY3QgdGhyZWFkTG9jYWxPYmplY3QgPSB0aHJlYWRMb2NhbENhY2hlUG9zaXRpb24uZ2V0KCk7Ci0JCQlpbnQgcG9zID0gLTE7Ci0JCQlpZiAodGhyZWFkTG9jYWxPYmplY3QgPT0gbnVsbCkgewotCi0JCQkJcG9zID0gcmVpbml0VGhyZWFkTG9jYWxQb3NpdGlvbigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcG9zID0gKChJbnRlZ2VyKSB0aHJlYWRMb2NhbE9iamVjdCkuaW50VmFsdWUoKTsKLQkJCX0KLQkJCXJldHVybiBwb3M7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBpbnQgcmVpbml0VGhyZWFkTG9jYWxQb3NpdGlvbigpIHsKLQkJCUludGVnZXIgcG9zaXRpb247Ci0JCQlpbnQgcG9zOwotCQkJLy8gVE9ET19mdXR1cmU6IHRoaW5rIG9mIGEgYmV0dGVyIHNvbHV0aW9uIHRoYXQgZG9lc24ndAotCQkJLy8gcmVxdWlyZSB0aGlzIGtsdWRnZS4gVGhpcyBpcyBlc3BlY2lhbGx5IHJlcXVpcmVkIGJlY2F1c2UKLQkJCS8vIHNvbWUgaW5mcmFzdHVyZSwgc3VjaCBhcyByZWNvbmNpbGVyLCBhY3R1YWxseSBudWxsIG91dAotCQkJLy8gdGhlaXIgdGhyZWFkIG9iamVjdCBhbmQgcmVjcmVhdGUgaXQsIDUwMCBtc2VjcyBsYXRlcgotCQkJLy8gKGFwcHJveGltYXRlbHkpLgotCQkJLy8gTm90ZTogdGhlIGxpa2VseSBzb2x1dGlvbiBpbiBmdXR1cmUgaXMgdG8gY2xlYXIgYWZ0ZXIgZXZlcnkKLQkJCS8vIGhlYXZ5IHVzZSBvZiBnZXRDYWNoZWRSZWdpb24sIHN1Y2ggYXMgaW4gY3JlYXRpbmcgbm9kZQotCQkJLy8gbGlzdHMsIG9yIHJlcGFyc2luZyBvciBwYXJ0aW9uaW5nLgotCQkJaWYgKGNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2l6ZSgpID4gTUFYX1NJWkUpIHsKLQkJCQljYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LmNsZWFyKCk7Ci0JCQkJaWYgKERFQlVHKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheSBjbGVhcmVkIGF0IHNpemUgIiArIE1BWF9TSVpFKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXBvc2l0aW9uID0gbmV3IEludGVnZXIoY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5zaXplKCkpOwotCQkJdGhyZWFkTG9jYWxDYWNoZVBvc2l0aW9uLnNldChwb3NpdGlvbik7Ci0JCQljYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LmFkZChwb3NpdGlvbi5pbnRWYWx1ZSgpLCBudWxsKTsKLQkJCXBvcyA9IHBvc2l0aW9uLmludFZhbHVlKCk7Ci0JCQlyZXR1cm4gcG9zOwotCQl9Ci0KLQkJcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlc2V0VG9Jbml0aWFsU3RhdGUoKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlZ2lvbjsKLQkJCXJlZ2lvbiA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlzZXQocmVnaW9uKTsKLQkJCXJldHVybiByZWdpb247Ci0JCX0KLQotCQkvLyBUT0RPOiBtYWtlIHByaXZpdGUgaWYgdXNlZCwgZWxzZSBkZWxldGUKLQkJdm9pZCBzZXQoaW50IHBvcywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24pIHsKLQkJCWNhY2hlZFJlZ2lvblBvc2l0aW9uQXJyYXkuc2V0KHBvcywgcmVnaW9uKTsKLQkJfQotCi0JCXZvaWQgc2V0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCQl0cnkgewotCQkJCWludCBwb3MgPSBnZXRUaHJlYWRMb2NhbFBvc2l0aW9uKCk7Ci0JCQkJY2FjaGVkUmVnaW9uUG9zaXRpb25BcnJheS5zZXQocG9zLCByZWdpb24pOwotCQkJfQotCQkJY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJCS8vIGV2ZW4gdGhvdWdoIHRoZSBjYWNoZWRSZWdpb25Qb3NpdGlvbiBpcyBzeW5jaHJvbml6ZWQsCi0JCQkJLy8gdGhhdCBqdXN0IG1lYW5zIGVhY2ggYWNjZXNzIGlzIHN5bmNyb25pemVkLCBpdHMKLQkJCQkvLyBzdGlsbCBwb3NzaWJsZSBmb3IgYW5vdGhlciB0aHJlYWQgdG8gY2F1c2UgaXQgdG8KLQkJCQkvLyBiZSBjbGVhcmVkLCBhZnRlciB0aGlzIHRocmVhZCBnZXRzIGl0IHBvc2l0aW9uLgotCQkJCS8vIFNvLCBpZiB0aGF0IGhhcHBlbnMsIGFsbCB3ZSBjYW4gZG8gaXMgcmVzZXQgdG8gYmVnaW5uaW5nLgotCQkJCS8vIFRoaXMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIChpbiBvdGhlciB3b3JkcywgcHJvYmFibHkKLQkJCQkvLyBub3Qgd29ydGggdXNpbmcgc3luY2hyb25pemVkIGJsb2NrcwotCQkJCS8vIHRvIGFjY2VzcyBjYWNoZWRSZWdpb25Qb3NpdGlvbkFycmF5LgotCQkJCXJlaW5pdFRocmVhZExvY2FsUG9zaXRpb24oKTsKLQkJCQlyZXNldFRvSW5pdGlhbFN0YXRlKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIE51bGxEb2N1bWVudEV2ZW50IGlzIHVzZWQgdG8gY29tcGxldGUgdGhlICJhYm91dFRvQ2hhbmdlIiBhbmQKLQkgKiAiY2hhbmdlZCIgY3ljbGUsIHdoZW4gaW4gZmFjdCB0aGUgb3JpZ2luYWwgY2hhbmdlIGlzIG5vIGxvbmdlciB2YWxpZC4KLQkgKiBUaGUgb25seSBrbm93biAodmFsaWQpIGNhc2Ugb2YgdGhpcyBpcyB3aGVuIGEgbW9kZWwgcmUtaW5pdGlhbGl6ZSB0YWtlcwotCSAqIHBsYWNlLCB3aGljaCBjYXVzZXMgc2V0VGV4dCB0byBiZSBjYWxsZWQgaW4gdGhlIG1pZGRsZSBvZiBzb21lIHByZXZpb3VzCi0JICogY2hhbmdlLiBbVGhpcyBhcmNoaXRlY3R1cmUgd2lsbCBiZSBpbXByb3ZlZCBpbiBmdXR1cmVdLgotCSAqLwotCXB1YmxpYyBjbGFzcyBOdWxsRG9jdW1lbnRFdmVudCBleHRlbmRzIERvY3VtZW50RXZlbnQgewotCQlwdWJsaWMgTnVsbERvY3VtZW50RXZlbnQoKSB7Ci0JCQl0aGlzKEJhc2ljU3RydWN0dXJlZERvY3VtZW50LnRoaXMsIDAsIDAsICIiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJpdmF0ZSBOdWxsRG9jdW1lbnRFdmVudChJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQkJc3VwZXIoZG9jLCBvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZWdpc3RlcmVkUmVwbGFjZSB7Ci0JCS8qKiBUaGUgb3duZXIgb2YgdGhpcyByZXBsYWNlIG9wZXJhdGlvbi4gKi8KLQkJSURvY3VtZW50TGlzdGVuZXIgZk93bmVyOwotCQkvKiogVGhlIHJlcGxhY2Ugb3BlcmF0aW9uICovCi0JCUlEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSBmUmVwbGFjZTsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBidW5kbGUgb2JqZWN0LgotCQkgKiAKLQkJICogQHBhcmFtIG93bmVyCi0JCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGxpc3RlbmVyIG93bmluZyB0aGUgcmVwbGFjZSBvcGVyYXRpb24KLQkJICogQHBhcmFtIHJlcGxhY2UKLQkJICogICAgICAgICAgICB0aGUgcmVwbGFjZSBvcGVyYXRpb24KLQkJICovCi0JCVJlZ2lzdGVyZWRSZXBsYWNlKElEb2N1bWVudExpc3RlbmVyIG93bmVyLCBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgcmVwbGFjZSkgewotCQkJZk93bmVyID0gb3duZXI7Ci0JCQlmUmVwbGFjZSA9IHJlcGxhY2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGVzZSBjb250cm9sIHZhcmlhYmxlIGlzbid0IG1hcmsgYXMgJ2ZpbmFsJyBzaW5jZSB0aGVyZSdzIHNvbWUgdW5pdAotCSAqIHRlc3RzIHRoYXQgbWFuaXB1bGF0ZSBpdC4gRm9yIGZpbmFsIHByb2R1Y3QsIGl0IHNob3VsZCBiZS4KLQkgKi8KLQotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gVVNFX0xPQ0FMX1RIUkVBRCA9IHRydWU7Ci0KLQkvKioKLQkgKiBwdXJlbHkgZm9yIGRlYnVnZ2luZy9wZXJmb3JtYW5jZSBtZWFzdXJlbWVudHMgSW4gcHJhY3RpY2UsIHdvdWxkIGFsd2F5cwotCSAqIGJlICd0cnVlJy4gKGFuZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGJ5IGNhbGxlZCBieSBjbGllbnRzKS4gSXRzIG5vdAotCSAqICdmaW5hbCcgb3IgcHJpdmF0ZSBqdXN0IHNvIGl0IGNhbiBiZSB2YXJpZWQgZHVyaW5nCi0JICogZGVidWdnaW5nL3BlcmZvcm1hbmNlIG1lYXN1cmVtZW50IHJ1bnMuCi0JICogCi0JICogQHBhcmFtIHVzZV9sb2NhbF90aHJlYWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgc2V0VVNFX0xPQ0FMX1RIUkVBRChmaW5hbCBib29sZWFuIHVzZV9sb2NhbF90aHJlYWQpIHsKLQkJVVNFX0xPQ0FMX1RIUkVBRCA9IHVzZV9sb2NhbF90aHJlYWQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNhY2hlZERvY3VtZW50UmVnaW9uOwotCXByaXZhdGUgRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50bzsKLQlwcml2YXRlIGJvb2xlYW4gZkFjY2VwdFBvc3ROb3RpZmljYXRpb25SZXBsYWNlcyA9IHRydWU7Ci0JcHJpdmF0ZSBDdXJyZW50RG9jdW1lbnRSZWdpb25DYWNoZSBmQ3VycmVudERvY3VtbmV0UmVnaW9uQ2FjaGU7Ci0JcHJpdmF0ZSBEb2N1bWVudEV2ZW50IGZEb2N1bWVudEV2ZW50OwotCXByaXZhdGUgSURvY3VtZW50TGlzdGVuZXJbXSBmRG9jdW1lbnRMaXN0ZW5lcnM7Ci0KLQkvKioKLQkgKiBUaGUgcmVnaXN0ZXJlZCBkb2N1bWVudCBwYXJ0aXRpb25lcnMuCi0JICovCi0JcHJpdmF0ZSBNYXAgZkRvY3VtZW50UGFydGl0aW9uZXJzOwotCS8qKiBUaGUgcmVnaXN0ZXJlZCBkb2N1bWVudCBwYXJ0aXRpb25pbmcgbGlzdGVuZXJzICovCi0JcHJpdmF0ZSBMaXN0IGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyczsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmlyc3REb2N1bWVudFJlZ2lvbjsKLQlwcml2YXRlIFJlZ2lvblBhcnNlciBmUGFyc2VyOwotCXByaXZhdGUgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciBmUG9zaXRpb25NYW5hZ2VyOwotCXByaXZhdGUgTGlzdCBmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXM7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lcltdIGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzOwotCXByaXZhdGUgaW50IGZSZWVudHJhbmNlQ291bnQgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZlJlUGFyc2VyOwotCXByaXZhdGUgaW50IGZTdG9wcGVkQ291bnQgPSAwOwotCi0JcHJpdmF0ZSBJVGV4dFN0b3JlIGZTdG9yZTsKLQlwcml2YXRlIE9iamVjdFtdIGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzOwotCXByaXZhdGUgT2JqZWN0W10gZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBPYmplY3RbXSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIExpc3QgZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnM7Ci0KLQlwcml2YXRlIElMaW5lVHJhY2tlciBmVHJhY2tlcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGZVbmRvTWFuYWdlcjsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdERvY3VtZW50UmVnaW9uOwotCi0JcHJpdmF0ZSBieXRlW10gbGlzdGVuZXJMb2NrID0gbmV3IGJ5dGVbMF07Ci0JcHJpdmF0ZSBOdWxsRG9jdW1lbnRFdmVudCBOVUxMX0RPQ1VNRU5UX0VWRU5UOwotCi0JLy8KLQkvKioKLQkgKiBpbiBjYXNlIHByZWZlcnJlZCBkZWxpbWl0ZXIgaXMgbm90IHNldCwgd2UnbGwgYXNzdW1lIHRoZSBwbGF0Zm9ybQotCSAqIGRlZmF1bHQgTm90ZTogaXQgaXMgbm90IGZpbmFsIHN0YXRpYyB0byBtYWtlIHN1cmUgaXQgd29uJ3QgYmUgaW5saW5lZAotCSAqIGJ5IGNvbXBpbGVyLgotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBsYXRmb3JtTGluZURlbGltaXRlciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIHRoZW9yZXRpY2FsbHksIGEgZG9jdW1lbnQgY2FuIGNvbnRhaW4gbWl4ZWQgbGluZSBkZWxpbWl0ZXJzCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcHJlZmVyZWREZWxpbWl0ZXI7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkgPSAiX1JFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZXyI7IC8vJE5PTi1OTFMtMSQKLQkvKioKLQkgKiBDdXJyZW50IHJld3JpdGUgc2Vzc2lvbiwgb3Igbm9uZSBpZiBub3QgcHJlc2VudGx5IHJld3JpdGluZy4KLQkgKi8KLQlwcml2YXRlIERvY3VtZW50UmV3cml0ZVNlc3Npb24gZkFjdGl2ZVJld3JpdGVTZXNzaW9uOwotCS8qKgotCSAqIExhc3QgbW9kaWZpY2F0aW9uIHN0YW1wLCBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgb24gY2hhbmdlLgotCSAqLwotCXByaXZhdGUgbG9uZyBmTW9kaWZpY2F0aW9uU3RhbXA7Ci0JLyoqCi0JICogZGVidWcgdmFyaWFibGUgb25seQotCSAqIAotCSAqIEBwYXJhbSBwYXJzZXIKLQkgKi8KLQlwcml2YXRlIGxvbmcgc3RhcnRTdHJlYW1UaW1lOwotCS8qKgotCSAqIGRlYnVnIHZhcmlhYmxlIG9ubHkKLQkgKiAKLQkgKiBAcGFyYW0gcGFyc2VyCi0JICovCi0JcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKLQotCXB1YmxpYyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJc3VwZXIoKTsKLQkJZkN1cnJlbnREb2N1bW5ldFJlZ2lvbkNhY2hlID0gbmV3IEN1cnJlbnREb2N1bWVudFJlZ2lvbkNhY2hlKCk7Ci0JCWZTdG9yZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoNTAsIDMwMCk7Ci0JCXNldExpbmVUcmFja2VyKG5ldyBEZWZhdWx0TGluZVRyYWNrZXIoKSk7Ci0JCU5VTExfRE9DVU1FTlRfRVZFTlQgPSBuZXcgTnVsbERvY3VtZW50RXZlbnQoKTsKLQotCQlpbnRlcm5hbF9hZGRQb3NpdGlvbkNhdGVnb3J5KFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJaW50ZXJuYWxfYWRkUG9zaXRpb25VcGRhdGVyKG5ldyBEZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlcihSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSkpOwotCi0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0aGUgcHJpbWFyeSB3YXkgdG8gZ2V0IGEgbmV3IHN0cnVjdHVyZWREb2N1bWVudC4gSXRzIGJlc3QgdG8KLQkgKiB1c2UgdGhlIGZhY3RvcnkgbWV0aG9kcyBpbiBNb2RlbE1hbmdlciB0byBjcmVhdGUgYSBuZXcKLQkgKiBJU3RydWN0dXJlZERvY3VtZW50LCBzaW5jZSBpdCB3aWxsIGdldCBhbmQgaW5pdGlhbGl6ZSB0aGUgcGFyc2VyCi0JICogYWNjb3JkaW5nIHRvIHRoZSBkZXNpcmVkIGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnQoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQl0aGlzKCk7Ci0JCUFzc2VydC5pc05vdE51bGwocGFyc2VyLCAiUHJvZ3JhbSBFcnJvcjogSVN0cnVjdHVyZWREb2N1bWVudCBjYW4gbm90IGJlIGNyZWF0ZWQgd2l0aCBudWxsIHBhcnNlciIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGdvIHRocm91Z2ggc2V0dGVyIGluIGNhc2UgdGhlcmUgaXMgc2lkZSBlZmZlY3RzCi0JCWludGVybmFsX3NldFBhcnNlcihwYXJzZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBfY2xlYXJEb2N1bWVudEV2ZW50KCkgewotCQkvLyBubyBoYXJkIGFuZCBmYXN0IHJlcXVpcmVtZW50IHRvIG51bGwgb3V0IC4uLiBqdXN0IHNlZW1zIGxpa2UKLQkJLy8gYSBnb29kIGlkZWEsIHNpbmNlIHdlIGFyZSBkb25lIHdpdGggaXQuCi0JCWZEb2N1bWVudEV2ZW50ID0gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoT2JqZWN0W10gbGlzdGVuZXJzKSB7Ci0JCS8vIG1vc3QgRG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkIGxpc3RlbmVycyBkbyBub3QgYW50aWNpcGF0ZQotCQkvLyBEb2N1bWVudEV2ZW50ID09IG51bGwuIFNvIG1ha2Ugc3VyZSBkb2N1bWVudEV2ZW50IGlzIG5vdAotCQkvLyBudWxsLiAodGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCB5ZXQgaXQgZG9lcyBzb21ldGltZXMpCi0JCWlmIChmRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFdmVudCA9IG5ldyBOdWxsRG9jdW1lbnRFdmVudCgpOwotCQl9Ci0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJCi0JCQkvLyBmaXJlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElEb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoZkRvY3VtZW50RXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzQWJvdXRUb0NoYW5nZShEb2N1bWVudEV2ZW50IGRvY3VtZW50RXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gZkRvY3VtZW50UGFydGl0aW9uZXJzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwID0gKElEb2N1bWVudFBhcnRpdGlvbmVyKSBlLm5leHQoKTsKLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJcC5kb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoZG9jdW1lbnRFdmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVEb2N1bWVudENoYW5nZWQoT2JqZWN0W10gbGlzdGVuZXJzLCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCkgewotCi0JCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSwgc2luY2UgdGhlIGFkZCBhbmQKLQkJLy8gcmVtb3ZlCi0JCS8vIGxpc3RuZXIKLQkJLy8gbWV0aG9kcyBjYW4gY2hhbmdlIHRoZSBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5IGZyb20KLQkJLy8gYW5vdGhlciB0aHJlYWQKLQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQlPYmplY3RbXSBob2xkTGlzdGVuZXJzID0gbGlzdGVuZXJzOwotCQkJLy8gTk9URTogZG9jdW1lbnQgZXZlbnQgaXMgY3JlYXRlZCBpbiByZXBsYWNlIFRleHQgQVBJIGFuZCBzZXRUZXh0Ci0JCQkvLyBBUEkKLQkJCS8vIG5vdyBmaXJlCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCi0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCS8vIE5vdGVzOiBmRG9jdW1lbnRFdmVudCBjYW4gYmUgInN1ZGRlbmx5IiBudWxsLCBpZiBvbmUgb2YKLQkJCQkJLy8gdGhlCi0JCQkJCS8vIHByZXZpb3VzIGNoYW5nZXMKLQkJCQkJLy8gY2F1c2VkIGEgInNldFRleHQiIHRvIGJlIGNhbGxlZC4gVGhlIG9ubHkga25vd24gY2FzZSBvZgotCQkJCQkvLyB0aGlzCi0JCQkJCS8vIGlzIGEgbW9kZWwgcmVzZXQKLQkJCQkJLy8gZHVlIHRvIHBhZ2UgZGlyZWN0aXZlIGNoYW5naW5nLiBFdmVudHVhbGx5IHdlIHNob3VsZAotCQkJCQkvLyBjaGFuZ2UKLQkJCQkJLy8gYXJjaGV0ZWN0dXJlIHRvIGhhdmUKLQkJCQkJLy8gZXZlbnQgcXVlIGFuZCBiZSBhYmxlIHRvICJjYW5jZWwiIHBlbmRpbmcgZXZlbnRzLCBidXQKLQkJCQkJLy8gZm9yCi0JCQkJCS8vIG5vdywgd2UnbGwganVzdCBwYXNzIGEKLQkJCQkJLy8gTnVsbERvY3VtZW50RXZlbnQuIEJ5IHRoZSB3YXksIGl0IGlzIGltcG9ydGFudCB0byBzZW5kCi0JCQkJCS8vIHNvbWV0aGluZywgc2luY2UgY2xpZW50cyBtaWdodAotCQkJCQkvLyBoYXZlIGluZGV0ZXJtaW5hbnQgc3RhdGUgZHVlIHRvICJhYm91dFRvQ2hhbmdlIiBiZWluZwotCQkJCQkvLyBzZW50Ci0JCQkJCS8vIGVhcmxpZXIuCi0JCQkJCWlmIChmRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQkJCQkoKElEb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5kb2N1bWVudENoYW5nZWQoTlVMTF9ET0NVTUVOVF9FVkVOVCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkoKElEb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5kb2N1bWVudENoYW5nZWQoZkRvY3VtZW50RXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBkb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgZSA9IGZEb2N1bWVudFBhcnRpdGlvbmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uZXIgcCA9IChJRG9jdW1lbnRQYXJ0aXRpb25lcikgZS5uZXh0KCk7Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCWlmIChwIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24pIHsKLQkJCQkJCS8vIElSZWdpb24gY2hhbmdlZFBhcnRpb24gPQotCQkJCQkJKChJRG9jdW1lbnRQYXJ0aXRpb25lckV4dGVuc2lvbikgcCkuZG9jdW1lbnRDaGFuZ2VkMihkb2N1bWVudEV2ZW50KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXAuZG9jdW1lbnRDaGFuZ2VkKGRvY3VtZW50RXZlbnQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBfZmlyZUV2ZW50KE9iamVjdFtdIGxpc3RlbmVycywgTm9DaGFuZ2VFdmVudCBldmVudCkgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5ub0NoYW5nZShldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVFdmVudChPYmplY3RbXSBsaXN0ZW5lcnMsIFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaG9sZExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQkJLy8gc2FmZWd1YXJkIGZyb20gbGlzdGVuZXJzIHRoYXQgdGhyb3cgZXhjZXB0aW9ucwotCQkJCXRyeSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBzYWZlIGNhc3QsIHNpbmNlIGFkZExpc3RuZXJzIHJlcXVpcmVzIGEKLQkJCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKSBob2xkTGlzdGVuZXJzW2ldKS5yZWdpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBfZmlyZUV2ZW50KE9iamVjdFtdIGxpc3RlbmVycywgUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkucmVnaW9uc1JlcGxhY2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQkJCX0KLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJbG9uZyBzdG9wVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgSVN0cnVjdHVyZWREb2N1bWVudDo6ZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50LiBUaW1lIHdhcyAiICsgKHN0b3BUaW1lIC0gc3RhcnRUaW1lKSArICIgbXNlY3MgdG8gZmlyZSBOZXdNb2RlbEV2ZW50IHRvIGluc3RhbmNlIG9mICIgKyBob2xkTGlzdGVuZXJzW2ldLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBfZmlyZUV2ZW50KE9iamVjdFtdIGxpc3RlbmVycywgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLCBzaW5jZSB0aGUgYWRkIGFuZAotCQkvLyByZW1vdmUKLQkJLy8gbGlzdG5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUgbGlzdGVuZXIgYXJyYXkgZnJvbQotCQkvLyBhbm90aGVyIHRocmVhZAotCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoRGVidWcucGVyZlRlc3QgfHwgRGVidWcucGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkpIHsKLQkJCQkJc3RhcnRUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJfQotCQkJCS8vIHNhZmVndWFyZCBmcm9tIGxpc3RlbmVycyB0aGF0IHRocm93IGV4Y2VwdGlvbnMKLQkJCQl0cnkgewotCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0bmVycyByZXF1aXJlcyBhCi0JCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkubm9kZXNSZXBsYWNlZChldmVudCk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZXhjZXB0aW9uKTsKLQkJCQl9Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCWxvbmcgc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJcblx0XHRcdFx0IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4gVGltZSB3YXMgIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIG1zZWNzIHRvIGZpcmUgTmV3TW9kZWxFdmVudCB0byBpbnN0YW5jZSBvZiAiICsgaG9sZExpc3RlbmVyc1tpXS5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgX2ZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKE9iamVjdFtdIGxpc3RlbmVycykgewotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlIHRoZSBhZGQgYW5kCi0JCS8vIHJlbW92ZQotCQkvLyBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZSBsaXN0ZW5lciBhcnJheSBmcm9tCi0JCS8vIGFub3RoZXIgdGhyZWFkCi0JCWlmIChsaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJT2JqZWN0W10gaG9sZExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCS8vIE5vdGU6IHRoZSBkb2NFdmVudCBpcyBjcmVhdGVkIGluIHJlcGxhY2VUZXh0IEFQSQotCQkJLy8gZmlyZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50RXZlbnRPbmx5KSB7Ci0JCQkJCXN0YXJ0VGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCQkvLyBzYWZlZ3VhcmQgZnJvbSBsaXN0ZW5lcnMgdGhhdCB0aHJvdyBleGNlcHRpb25zCi0JCQkJdHJ5IHsKLQkJCQkJLy8gbm90aWNlIHRoZSBBYm91dFRvQmVDaGFuZ2VkRXZlbnQgaXMgY3JlYXRlZCBmcm9tIHRoZQotCQkJCQkvLyBEb2N1bWVudEV2ZW50LCBzaW5jZSBpdCBpcyAobmVhcmx5KQotCQkJCQkvLyB0aGUgc2FtZSBpbmZvcm1hdGlvbi4gP1doYXQgdG8gZG8gYWJvdXQKLQkJCQkJLy8gb3JpZ2luYWxSZXF1ZXN0ZXI/Ci0JCQkJCWlmIChmRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQkJCQlmRG9jdW1lbnRFdmVudCA9IG5ldyBOdWxsRG9jdW1lbnRFdmVudCgpOwotCQkJCQl9Ci0JCQkJCUFib3V0VG9CZUNoYW5nZWRFdmVudCBhYm91dFRvQmVDaGFuZ2VkRXZlbnQgPSBuZXcgQWJvdXRUb0JlQ2hhbmdlZEV2ZW50KHRoaXMsIG51bGwsIGZEb2N1bWVudEV2ZW50LmdldFRleHQoKSwgZkRvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCksIGZEb2N1bWVudEV2ZW50LmdldExlbmd0aCgpKTsKLQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UgYWRkTGlzdG5lcnMgcmVxdWlyZXMgYQotCQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIKLQkJCQkJKChJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIpIGhvbGRMaXN0ZW5lcnNbaV0pLm1vZGVsQWJvdXRUb0JlQ2hhbmdlZChhYm91dFRvQmVDaGFuZ2VkRXZlbnQpOwotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4Y2VwdGlvbik7Ci0JCQkJfQotCQkJCWlmIChEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFN0cnVjdHVyZWREb2N1bWVudEV2ZW50T25seSkgewotCQkJCQlsb25nIHN0b3BUaW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBJU3RydWN0dXJlZERvY3VtZW50OjpmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQuIFRpbWUgd2FzICIgKyAoc3RvcFRpbWUgLSBzdGFydFRpbWUpICsgIiBtc2VjcyB0byBmaXJlIE5ld01vZGVsRXZlbnQgdG8gaW5zdGFuY2Ugb2YgIiArIGhvbGRMaXN0ZW5lcnNbaV0uZ2V0Q2xhc3MoKSk7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWNxdWlyZUxvY2soKSB7Ci0JCS8vIGRvIG5vdGhpbmcgaGVyZSBpbiBzdXBlciBjbGFzcwotCX0KLQotCS8qKgotCSAqIGFkZE1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQkvLyBtYWtlIHN1cmUgbGlzdGVuZXIgaXMgbm90IGFscmVhZHkgaW4gbGlzdGVuaW5nCi0JCQkvLyAoYW5kIGlmIGl0IGlzLCBwcmludCBhIHdhcm5pbmcgdG8gYWlkIGRlYnVnZ2luZywgaWYgbmVlZGVkKQotCQkJaWYgKCFVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gMDsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLwotCQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQkvLwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXJzIGFuZCBNb2RlbENoYWduZWRMaXN0ZW5lcnMgYXJlIHZlcnkKLQkgKiBzaW1pbGFyLiBUaGV5IGJvdGggcmVjZWl2ZSBpZGVudGljYWwgZXZlbnRzLiBUaGUgZGlmZmVyZW5jZSBpcyB0aGUKLQkgKiB0aW1pbmcuIFRoZSAicHVyZSIgU3RydWN0dXJlZERvY3VtZW50TGlzdG5lcnMgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZQotCSAqIHN0cnVjdHVyZWREb2N1bWVudCBoYXMgYmVlbiBjaGFuZ2VkLCBidXQgYmVmb3JlIG90aGVyLCByZWxhdGVkIG1vZGVscwotCSAqIG1heSBoYXZlIGJlZW4gY2hhbmdlZCBzdWNoIGFzIHRoZSBTdHJ1Y3R1cmFsIE1vZGVsLiBUaGUgU3RydWN0dXJhbAotCSAqIG1vZGVsIGlzIGluIGZhY3QgaXRzZWxmIGEgInB1cmUiIFN0cnVjdHVyZWREb2N1bWVudExpc3RuZXIuIFRoZQotCSAqIE1vZGVsQ2hhbmdlZExpc3RlbmVycyBjYW4gcmVzdCBhc3N1cmVkIHRoYXQgYWxsIG1vZGVscyBhbmQgZGF0YSBoYXZlCi0JICogYmVlbiB1cGRhdGVkIGZyb20gdGhlIGNoYW5nZSBieSB0aGUgdGllbSB0aGV5IGFyZSBub3RpZmllZC4gVGhpcyBpcwotCSAqIGVzcGVjaWFsbHkgaW1wb3J0YW50IGZvciB0aGUgdGV4dCB3aWRnZXQsIGZvciBleGFtcGxlLCB3aGljaCBtYXkgcmVseQotCSAqIG9uIGJvdGggc3RydWN0dXJlZERvY3VtZW50IGFuZCBzdHJ1Y3R1cmFsIG1vZGVsIGluZm9ybWF0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyLiBSZXF1ZXN0IHRvIGFkZCBhbiBpbnN0YW5jZSBvZiAiICsgbGlzdGVuZXIuZ2V0Q2xhc3MoKSArICIgYXMgYSBsaXN0ZW5lciBvbiBzdHJ1Y3R1cmVkRG9jdW1lbnQuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQkvLyBtYWtlIHN1cmUgbGlzdGVuZXIgaXMgbm90IGFscmVhZHkgaW4gbGlzdGVuaW5nCi0JCQkvLyAoYW5kIGlmIGl0IGlzLCBwcmludCBhIHdhcm5pbmcgdG8gYWlkIGRlYnVnZ2luZywgaWYgbmVlZGVkKQotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZE1vZGVsQ2hhbmdlZExpc3RlbmVyLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBhZGRlZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRNb2RlbENoYW5nZWRMaXN0ZW5lci4gQWRkaW5nIGFuIGluc3RhbmNlIG9mICIgKyBsaXN0ZW5lci5nZXRDbGFzcygpICsgIiBhcyBhIGxpc3RlbmVyIG9uIHN0cnVjdHVyZWREb2N1bWVudC4iKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvcgotCQkJCQkvLyBmaXJzdAotCQkJCQkvLyB0aW1lIHRocm91Z2gKLQkJCQkJb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQl9Ci0JCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCWlmIChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQkJfQotCQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJCS8vCi0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJCS8vCi0JCQkJLy8gd2hlbiBhIGxpc3RlbmVyIGlzIGFkZGVkLAotCQkJCS8vIHNlbmQgdGhlIG5ldyBtb2RlbCBldmVudCB0byB0aGF0IG9uZSBwYXJ0aWN1bGFyIGxpc3RlbmVyLAotCQkJCS8vIHNvIGl0Ci0JCQkJLy8gY2FuIGluaXRpYWxpemUgaXRzZWxmIHdpdGggdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG1vZGVsCi0JCQkJLy8gbGlzdGVuZXIubmV3TW9kZWwobmV3IE5ld01vZGVsRXZlbnQodGhpcywgbGlzdGVuZXIpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcihJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJJU3RydWN0dXJlZERvY3VtZW50OjphZGRTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lci4gUmVxdWVzdCB0byBhZGQgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gc3RydWN0dXJlZERvY3VtZW50LiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSVN0cnVjdHVyZWREb2N1bWVudDo6YWRkU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIuIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIGFkZGVkZWQgbW9yZSB0aGFuIG9uY2UuICIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmFkZFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyLiBBZGRpbmcgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gc3RydWN0dXJlZERvY3VtZW50LiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpbnQgb2xkU2l6ZSA9IDA7Ci0JCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvcgotCQkJCQkvLyBmaXJzdAotCQkJCQkvLyB0aW1lIHRocm91Z2gKLQkJCQkJb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycy5sZW5ndGg7Ci0JCQkJfQotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSArIDE7Ci0JCQkJT2JqZWN0W10gbmV3TGlzdGVuZXJzID0gbmV3IE9iamVjdFtuZXdTaXplXTsKLQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJU3lzdGVtLmFycmF5Y29weShmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQkJfQotCQkJCS8vIGFkZCBsaXN0ZW5lciB0byBsYXN0IHBvc2l0aW9uCi0JCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJCS8vCi0JCQkJLy8gbm93IHN3aXRjaCBuZXcgZm9yIG9sZAotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQkvLwotCQkJCS8vIHdoZW4gYSBsaXN0ZW5lciBpcyBhZGRlZCwKLQkJCQkvLyBzZW5kIHRoZSBuZXcgbW9kZWwgZXZlbnQgdG8gdGhhdCBvbmUgcGFydGljdWxhciBsaXN0ZW5lciwKLQkJCQkvLyBzbyBpdAotCQkJCS8vIGNhbiBpbml0aWFsaXplIGl0c2VsZiB3aXRoIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBtb2RlbAotCQkJCS8vIGxpc3RlbmVyLm5ld01vZGVsKG5ldyBOZXdNb2RlbEV2ZW50KHRoaXMsIGxpc3RlbmVyKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBXZSBtYW5hZ2Ugb3VyIG93biBkb2N1bWVudCBsaXN0bmVycywgaW5zdGVhZCBvZiBkZWxlZ2F0aW5nIHRvIG91cgotCSAqIHBhcmVudERvY3VtZW50LCBzbyB3ZSBjYW4gZmlyZSBhdCB2ZXJ5IGVuZCAoYW5kIG5vdCB3aGVuIHRoZQotCSAqIHBhcmVudERvY3VtZW50IGNoYW5nZXMpLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZwotCQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsIGlmIG5lZWRlZCkKLQkJCWlmICghVXRpbGl0aWVzLmNvbnRhaW5zKGZEb2N1bWVudExpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJaW50IG9sZFNpemUgPSAwOwotCQkJCWlmIChmRG9jdW1lbnRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZSBzdXJlLCBmb3IKLQkJCQkJLy8gZmlyc3QKLQkJCQkJLy8gdGltZSB0aHJvdWdoCi0JCQkJCW9sZFNpemUgPSBmRG9jdW1lbnRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCX0KLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgKyAxOwotCQkJCUlEb2N1bWVudExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbnVsbDsKLQkJCQluZXdMaXN0ZW5lcnMgPSBuZXcgSURvY3VtZW50TGlzdGVuZXJbbmV3U2l6ZV07Ci0JCQkJaWYgKGZEb2N1bWVudExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVN5c3RlbS5hcnJheWNvcHkoZkRvY3VtZW50TGlzdGVuZXJzLCAwLCBuZXdMaXN0ZW5lcnMsIDAsIG9sZFNpemUpOwotCQkJCX0KLQkJCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJCW5ld0xpc3RlbmVyc1tuZXdTaXplIC0gMV0gPSBsaXN0ZW5lcjsKLQkJCQkvLyBub3cgc3dpdGNoIG5ldyBmb3Igb2xkCi0JCQkJZkRvY3VtZW50TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZERvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikKLQkgKiAKLQkgKiBSZWdpc3RlcnMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBsaXN0ZW5lciB3aXRoIHRoZSBkb2N1bWVudC4gQWZ0ZXIKLQkgKiByZWdpc3RyYXRpb24gdGhlIElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGlzIGluZm9ybWVkIGFib3V0IGVhY2gKLQkgKiBwYXJ0aXRpb24gY2hhbmdlIGNhdXNlIGJ5IGEgZG9jdW1lbnQgbWFuaXB1bGF0aW9uLiBJZiBhIGRvY3VtZW50Ci0JICogcGFydGl0aW9uaW5nIGxpc3RlbmVyIGlzIGFsc28gYSBkb2N1bWVudCBsaXN0ZW5lciwgdGhlIGZvbGxvd2luZwotCSAqIG5vdGlmaWNhdGlvbiBzZXF1ZW5jZSBpcyBndWFyYW50ZWVkIGlmIGEgZG9jdW1lbnQgbWFuaXB1bGF0aW9uIGNoYW5nZXMKLQkgKiB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nOiAxKQotCSAqIGxpc3RlbmVyLmRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50KTsgMikKLQkgKiBsaXN0ZW5lci5kb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQoKTsgMykKLQkgKiBsaXN0ZW5lci5kb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCk7IElmIHRoZSBsaXN0ZW5lciBpcyBhbHJlYWR5Ci0JICogcmVnaXN0ZXJlZCBub3RoaW5nIGhhcHBlbnMuCi0JICogCi0JICogQHNlZSBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcgotCSAqLwotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlBc3NlcnQuaXNOb3ROdWxsKGxpc3RlbmVyKTsKLQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQl9Ci0JCQlpZiAoIWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQkJZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBwb3NpdGlvbiB0byB0aGUgZG9jdW1lbnQncyBkZWZhdWx0IHBvc2l0aW9uIGNhdGVnb3J5LiBUaGUKLQkgKiBkZWZhdWx0IGNhdGVnb3J5IG11c3QgYmUgc3BlY2lmaWVkIGJ5IHRoZSBpbXBsZW1lbnRlci4gQSBwb3NpdGlvbiB0aGF0Ci0JICogaGFzIGJlZW4gYWRkZWQgdG8gYSBwb3NpdGlvbiBjYXRlZ29yeSBpcyB1cGRhdGVkIGF0IGVhY2ggY2hhbmdlIGFwcGxpZWQKLQkgKiB0byB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvbihwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjYWRkUG9zaXRpb24KLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgcG9zaXRpb24gaXMgbm90IGEgdmFsaWQgcmFuZ2UgaW4gdGhlIGRvY3VtZW50Ci0JICogQGV4Y2VwdGlvbiBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5hZGRQb3NpdGlvbihjYXRlZ29yeSwgcG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2FkZFBvc2l0aW9uQ2F0ZWdvcnkKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQlpbnRlcm5hbF9hZGRQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNhZGRQb3NpdGlvblVwZGF0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWludGVybmFsX2FkZFBvc2l0aW9uVXBkYXRlcih1cGRhdGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiBkb2N1bWVudCBsaXN0ZW5lciBhcyBvbmUgd2hpY2ggaXMgbm90aWZpZWQgYmVmb3JlIHRob3NlCi0JICogZG9jdW1lbnQgbGlzdGVuZXJzIGFkZGVkIHdpdGggPGNvZGU+YWRkRG9jdW1lbnRMaXN0ZW5lcjwvY29kZT4gYXJlCi0JICogbm90aWZpZWQuIElmIHRoZSBnaXZlbiBsaXN0ZW5lciBpcyBhbHNvIHJlZ2lzdGVyZWQgdXNpbmcKLQkgKiA8Y29kZT5hZGREb2N1bWVudExpc3RlbmVyPC9jb2RlPiBpdCB3aWxsIGJlIG5vdGlmaWVkIHR3aWNlLiBJZiB0aGUKLQkgKiBsaXN0ZW5lciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgbm90aGluZyBoYXBwZW5zLgotCSAqIDxwPgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIG5vdCBmb3IgcHVibGljIHVzZSwgaXQgbWF5IG9ubHkgYmUgY2FsbGVkIGJ5Ci0JICogaW1wbGVtZW50ZXJzIG9mIDxjb2RlPklEb2N1bWVudEFkYXB0ZXI8L2NvZGU+IGFuZCBvbmx5IGlmIHRob3NlCi0JICogaW1wbGVtZW50ZXJzIG5lZWQgdG8gaW1wbGVtZW50IDxjb2RlPklEb2N1bWVudExpc3RlbmVyPC9jb2RlPi4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRBZGFwdGVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYmUgYWRkZWQgYXMgcHJlbm90aWZpZWQgZG9jdW1lbnQgbGlzdGVuZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgZG9jdW1lbnRBZGFwdGVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmIChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJaW50IHByZXZpb3VzU2l6ZSA9IGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltwcmV2aW91c1NpemUgKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCAwLCBsaXN0ZW5lcnMsIDAsIHByZXZpb3VzU2l6ZSk7Ci0JCQkJbGlzdGVuZXJzW3ByZXZpb3VzU2l6ZV0gPSBkb2N1bWVudEFkYXB0ZXI7Ci0JCQkJZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lclsxXTsKLQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyc1swXSA9IGRvY3VtZW50QWRhcHRlcjsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNjaGFyQXQoaW50KQotCSAqLwotCXB1YmxpYyBjaGFyIGNoYXJBdChpbnQgYXJnMCkgewotCQl0cnkgewotCQkJcmV0dXJuIGdldENoYXIoMCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZvcm0gb2YgdGhlIEFQSSByZW1vdmVzIGFsbCByZWFkIG9ubHkgcG9zaXRpb25zLCBhcyBzaG91bGQgYmUgZG9uZQotCSAqIHdlICdzZXRUZXh0JyBpcyBjYWxsZWQuIE5vdGU6IGFuIGFsdGVybmF0aXZlIGFsZ29yaXRobSBtYXkgc2ltcGx5Ci0JICogcmVtb3ZlIHRoZSBjYXRlZ29yeSAoYW5kIGl0IHdvdWxkIGdldCBhZGRlZCBiYWNrIGluIGxhdGVyLCBpZi93aGVuCi0JICogcmVhZG9ubHkgcmVnaW9ucyBhZGRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYXJSZWFkT25seSgpIHsKLQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBudWxsOwotCQl0cnkgewotCQkJcG9zaXRpb25zID0gZ2V0UG9zaXRpb25zKFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJfQotCQljYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ncmFtIGVycm9yOiBzaG91bGQgbmV2ZXIgb2NjdXIiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlQb3NpdGlvbiBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKLQkJCS8vIG5vdGUgd2UgZG9uJ3QgZmlyZSB0aGUgImFib3V0IHRvIGNoYW5nZSIgb3IgImNoYW5nZWQiIGV2ZW50cywKLQkJCS8vIHNpbmNlIHByZXN1bWFibHksIHRleHQgaXMgYWxsIGdvaW5nIGF3YXkgYW5kIGJlaW5nIHJlcGxhY2VkCi0JCQkvLyBhbnl3YXkuCi0JCQlwb3NpdGlvbi5kZWxldGUoKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgY2xlYXJSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJLy8gVE9ETyBEVyBJIHN0aWxsIG5lZWQgdG8gaW1wbGVtZW50IHNtYXJ0ZXIgYWxnb3JpdGhtIHRoYXQKLQkJLy8gYWR1c3QgZXhpc3RpbmcgUk8gcmVnaW9ucywgaWYgbmVlZGVkLiBGb3Igbm93LCBJJ2xsIGp1c3QKLQkJLy8gcmVtb3ZlIGFueSB0aGF0IG92ZXJsYXAuCi0JCXRyeSB7Ci0JCQlQb3NpdGlvbltdIHBvc2l0aW9ucyA9IGdldFBvc2l0aW9ucyhSRUFEX09OTFlfUkVHSU9OU19DQVRFR09SWSk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCVBvc2l0aW9uIHBvc2l0aW9uID0gcG9zaXRpb25zW2ldOwotCQkJCWlmIChwb3NpdGlvbi5vdmVybGFwc1dpdGgoc3RhcnRPZmZzZXQsIGxlbmd0aCkpIHsKLQkJCQkJU3RyaW5nIGVmZmVjdGVkVGV4dCA9IHRoaXMuZ2V0KHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkvLyBmRG9jdW1lbnRFdmVudCA9IG5ldyBEb2N1bWVudEV2ZW50KHRoaXMsIHN0YXJ0T2Zmc2V0LAotCQkJCQkvLyBsZW5ndGgsIGVmZmVjdGVkVGV4dCk7Ci0JCQkJCWZpcmVSZWFkT25seUFib3V0VG9CZUNoYW5nZWQoKTsKLQkJCQkJcG9zaXRpb24uZGVsZXRlKCk7Ci0JCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIG51bGwsIGVmZmVjdGVkVGV4dCwgc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCW5vQ2hhbmdlRXZlbnQucmVhc29uID0gTm9DaGFuZ2VFdmVudC5SRUFEX09OTFlfU1RBVEVfQ0hBTkdFOwotCQkJCQlmaXJlUmVhZE9ubHlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChub0NoYW5nZUV2ZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gZSkgewotCQkJLy8ganVzdCBtZWFucyBubyByZWFkb25seSByZWdpb25zIGJlZW4gZGVmaW5lZCB5ZXQKLQkJCS8vIHNvIG5vdGhpbmcgdG8gZG8uCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaW5kZXggYXQgd2hpY2ggYSA8Y29kZT5Qb3NpdGlvbjwvY29kZT4gd2l0aCB0aGUKLQkgKiBzcGVjaWZpZWQgb2Zmc2V0IHdvdWxkIGJlIGluc2VydGVkIGludG8gdGhlIGdpdmVuIGNhdGVnb3J5LiBBcyB0aGUKLQkgKiBvcmRlcmluZyBpbnNpZGUgYSBjYXRlZ29yeSBvbmx5IGRlcGVuZHMgb24gdGhlIG9mZnNldCwgdGhlIGluZGV4IG11c3QKLQkgKiBiZSBjaG9vc2VuIHRvIGJlIHRoZSBmaXJzdCBvZiBhbGwgcG9zaXRpb25zIHdpdGggdGhlIHNhbWUgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgdGhlIGNhdGVnb3J5IGluIHdoaWNoIHdvdWxkIGJlIGFkZGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mZnNldCB0byBiZSBjb25zaWRlcmVkCi0JICogQHJldHVybiB0aGUgaW5kZXggaW50byB0aGUgY2F0ZWdvcnkKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgb2Zmc2V0IGlzIGludmFsaWQgaW4gdGhpcyBkb2N1bWVudAotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIGNhdGVnb3J5IGlzIHVuZGVmaW5lZCBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBjb21wdXRlSW5kZXhJbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRQb3NpdGlvbk1hbmFnZXIoKS5jb21wdXRlSW5kZXhJbkNhdGVnb3J5KGNhdGVnb3J5LCBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGdpdmVuIHRleHQuIEZvciBhIGdpdmVuIGltcGxlbWVudGVyCi0JICogb2YgdGhpcyBpbnRlcmZhY2UgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgc2FtZSByZXN1bHQgYXMKLQkgKiA8Y29kZT5zZXQodGV4dCk7IGdldE51bWJlck9mTGluZXMoKTwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHdob3NlIG51bWJlciBvZiBsaW5lcyBzaG91bGQgYmUgY29tcHV0ZWQKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIGdpdmVuIHRleHQKLQkgKi8KLQlwdWJsaWMgaW50IGNvbXB1dGVOdW1iZXJPZkxpbmVzKFN0cmluZyB0ZXh0KSB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuY29tcHV0ZU51bWJlck9mTGluZXModGV4dCk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHBhcnRpdGlvbmluZyBvZiB0aGUgZ2l2ZW4gZG9jdW1lbnQgcmFuZ2UgdXNpbmcgdGhlCi0JICogZG9jdW1lbnQncyBwYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgb2Zmc2V0IGF0IHdoaWNoIHRoZSByYW5nZSBzdGFydHMKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByYW5nZQotCSAqIEByZXR1cm4gYSBzcGVjaWZpY2F0aW9uIG9mIHRoZSByYW5nZSdzIHBhcnRpdGlvbmluZwotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiBAdGhyb3dzIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCUlUeXBlZFJlZ2lvbltdIHR5cGVkUmVnaW9ucyA9IG51bGw7Ci0JCXRyeSB7Ci0JCQl0eXBlZFJlZ2lvbnMgPSBjb21wdXRlUGFydGl0aW9uaW5nKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcsIG9mZnNldCwgbGVuZ3RoLCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCWlmICh0eXBlZFJlZ2lvbnMgPT0gbnVsbCkgewotCQkJdHlwZWRSZWdpb25zID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQkJfQotCQlyZXR1cm4gdHlwZWRSZWdpb25zOwotCX0KLQotCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoU3RyaW5nIHBhcnRpdGlvbmluZywgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgYm9vbGVhbiBpbmNsdWRlWmVyb0xlbmd0aFBhcnRpdGlvbnMpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uIHsKLQkJaWYgKCgwID4gb2Zmc2V0KSB8fCAoMCA+IGxlbmd0aCkgfHwgKG9mZnNldCArIGxlbmd0aCA+IGdldExlbmd0aCgpKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmcpOwotCi0JCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikKLQkJCXJldHVybiAoKElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikgcGFydGl0aW9uZXIpLmNvbXB1dGVQYXJ0aXRpb25pbmcob2Zmc2V0LCBsZW5ndGgsIGluY2x1ZGVaZXJvTGVuZ3RoUGFydGl0aW9ucyk7Ci0JCWVsc2UgaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpCi0JCQlyZXR1cm4gcGFydGl0aW9uZXIuY29tcHV0ZVBhcnRpdGlvbmluZyhvZmZzZXQsIGxlbmd0aCk7Ci0JCWVsc2UgaWYgKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcuZXF1YWxzKHBhcnRpdGlvbmluZykpCi0JCQlyZXR1cm4gbmV3IFR5cGVkUmVnaW9uW117bmV3IFR5cGVkUmVnaW9uKG9mZnNldCwgbGVuZ3RoLCBERUZBVUxUX0NPTlRFTlRfVFlQRSl9OwotCQllbHNlCi0JCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjY29udGFpbnNQb3NpdGlvbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiBnZXRQb3NpdGlvbk1hbmFnZXIoKS5jb250YWluc1Bvc2l0aW9uKGNhdGVnb3J5LCBvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5Ci0JICovCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQlyZXR1cm4gZ2V0UG9zaXRpb25NYW5hZ2VyKCkuY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5KGNhdGVnb3J5KTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1JlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQl0cnkgewotCQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBnZXRQb3NpdGlvbnMoUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwb3NpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQb3NpdGlvbiBwb3NpdGlvbiA9IHBvc2l0aW9uc1tpXTsKLQkJCQlpZiAocG9zaXRpb24ub3ZlcmxhcHNXaXRoKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBqdXN0IG1lYW5zIG5vIHJlYWRvbmx5IHJlZ2lvbnMgYmVlbiBkZWZpbmVkIHlldAotCQkJLy8gc28gb2J2aW91c2x5IGZhbHNlCi0JCQlyZXN1bHQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgdm9pZCBleGVjdXRlUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMoKSB7Ci0JCWlmIChmU3RvcHBlZENvdW50ID4gMCkKLQkJCXJldHVybjsKLQkJd2hpbGUgKGZQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcyAhPSBudWxsKSB7Ci0JCQlMaXN0IGNoYW5nZXMgPSBmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXM7Ci0JCQlmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMgPSBudWxsOwotCQkJSXRlcmF0b3IgZSA9IGNoYW5nZXMuaXRlcmF0b3IoKTsKLQkJCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJCVJlZ2lzdGVyZWRSZXBsYWNlIHJlcGxhY2UgPSAoUmVnaXN0ZXJlZFJlcGxhY2UpIGUubmV4dCgpOwotCQkJCXJlcGxhY2UuZlJlcGxhY2UucGVyZm9ybSh0aGlzLCByZXBsYWNlLmZPd25lcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZWQoKSB7Ci0JCS8vIG1vc3QgRG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkIGxpc3RlbmVycyBkbyBub3QgYW50aWNpcGF0ZQotCQkvLyBEb2N1bWVudEV2ZW50ID09IG51bGwuIFNvIG1ha2Ugc3VyZSBkb2N1bWVudEV2ZW50IGlzIG5vdAotCQkvLyBudWxsLiAodGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLCB5ZXQgaXQgZG9lcyBzb21ldGltZXMpCi0JCWlmIChmRG9jdW1lbnRFdmVudCA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRFdmVudCA9IG5ldyBOdWxsRG9jdW1lbnRFdmVudCgpOwotCQl9Ci0KLQkJX2ZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzKTsKLQkJLy8gTm90ZTogdGhlIGRvY0V2ZW50IGlzIGNyZWF0ZWQgaW4gcmVwbGFjZVRleHQgQVBJISAob3Igc2V0IFRleHQpCi0JCV9maXJlRG9jdW1lbnRBYm91dFRvQ2hhbmdlKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzKTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNBYm91dFRvQ2hhbmdlKGZEb2N1bWVudEV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoZkRvY3VtZW50TGlzdGVuZXJzKTsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyB0aGUgZG9jdW1lbnQgcGFydGl0aW9uaW5nIGNoYW5nZWQgbm90aWZpY2F0aW9uIHRvIGFsbCByZWdpc3RlcmVkCi0JICogZG9jdW1lbnQgcGFydGl0aW9uaW5nIGxpc3RlbmVycy4gVXNlcyBhIHJvYnVzdCBpdGVyYXRvci4KLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgY2hhbmdlZCBldmVudAotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24yCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZmlyZURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChEb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzID09IG51bGwgfHwgZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZkRvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJzKTsKLQkJSXRlcmF0b3IgZSA9IGxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsID0gKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKSBlLm5leHQoKTsKLQkJCWlmIChsIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24yKSB7Ci0JCQkJSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24yIGV4dGVuc2lvbjIgPSAoSURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXJFeHRlbnNpb24yKSBsOwotCQkJCWV4dGVuc2lvbjIuZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKGV2ZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGwgaW5zdGFuY2VvZiBJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbikgewotCQkJCUlEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lckV4dGVuc2lvbikgbDsKLQkJCQlleHRlbnNpb24uZG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkKHRoaXMsIGV2ZW50LmdldENvdmVyYWdlKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbC5kb2N1bWVudFBhcnRpdGlvbmluZ0NoYW5nZWQodGhpcyk7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlUmVhZE9ubHlBYm91dFRvQmVDaGFuZ2VkKCkgewotCQlfZmlyZVN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMpOwotCQkvLyBOb3RlOiB0aGUgZG9jRXZlbnQgaXMgY3JlYXRlZCBpbiByZXBsYWNlVGV4dCBBUEkhIChvciBzZXQgVGV4dCkKLQkJLy8gX2ZpcmVEb2N1bWVudEFib3V0VG9DaGFuZ2UoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMpOwotCQkvLyBfZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZShmRG9jdW1lbnRMaXN0ZW5lcnMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBmaXJlUmVhZE9ubHlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJLy8gX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJLy8gX2ZpcmVEb2N1bWVudENoYW5nZWQoZkRvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCS8vIF9jbGVhckRvY3VtZW50RXZlbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KE5vQ2hhbmdlRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0RvY3VtZW50Q2hhbmdlZChldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChSZWdpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVFdmVudChmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlub3RpZnlEb2N1bWVudFBhcnRpdGlvbmVyc0RvY3VtZW50Q2hhbmdlZChldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZEb2N1bWVudExpc3RlbmVycywgZXZlbnQpOwotCQlfY2xlYXJEb2N1bWVudEV2ZW50KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycywgZXZlbnQpOwotCQlfZmlyZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRG9jdW1lbnRDaGFuZ2VkKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCW5vdGlmeURvY3VtZW50UGFydGl0aW9uZXJzRG9jdW1lbnRDaGFuZ2VkKGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZkRvY3VtZW50TGlzdGVuZXJzLCBldmVudCk7Ci0JCV9jbGVhckRvY3VtZW50RXZlbnQoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IGV2ZW50KSB7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzLCBldmVudCk7Ci0JCV9maXJlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2ZpcmVEb2N1bWVudENoYW5nZWQoZlByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJbm90aWZ5RG9jdW1lbnRQYXJ0aXRpb25lcnNEb2N1bWVudENoYW5nZWQoZXZlbnQpOwotCQlfZmlyZURvY3VtZW50Q2hhbmdlZChmRG9jdW1lbnRMaXN0ZW5lcnMsIGV2ZW50KTsKLQkJX2NsZWFyRG9jdW1lbnRFdmVudCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50J3MgY29tcGxldGUgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldCgpIHsKLQkJcmV0dXJuIGdldFN0b3JlKCkuZ2V0KDAsIGdldExlbmd0aCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGxlbmd0aCBjaGFyYWN0ZXJzIGZyb20gdGhlIGRvY3VtZW50J3MgdGV4dCBzdGFydGluZyBmcm9tIHRoZQotCSAqIHNwZWNpZmllZCBwb3NpdGlvbi4KLQkgKiAKLQkgKiBAdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSByYW5nZSBpcyBub3QgdmFsaWQgaW4gdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXQoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaW50IG15TGVuZ3RoID0gZ2V0TGVuZ3RoKCk7Ci0JCWlmICgwID4gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gMDsKLQkJaWYgKDAgPiBsZW5ndGgpCi0JCQlsZW5ndGggPSAwOwotCQlpZiAob2Zmc2V0ICsgbGVuZ3RoID4gbXlMZW5ndGgpIHsKLQkJCS8vIGZpcnN0IHRyeSBhZGp1c3RpbmcgbGVuZ3RoIHRvIGZpdAotCQkJaW50IGxlc3NMZW5ndGggPSBteUxlbmd0aCAtIG9mZnNldDsKLQkJCWlmICgobGVzc0xlbmd0aCA+PSAwKSAmJiAob2Zmc2V0ICsgbGVzc0xlbmd0aCA9PSBteUxlbmd0aCkpIHsKLQkJCQlsZW5ndGggPSBsZXNzTGVuZ3RoOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gc2Vjb25kLCB0cnkgb2Zmc2V0Ci0JCQkJaW50IG1vcmVPZmZzZXQgPSBteUxlbmd0aCAtIGxlbmd0aDsKLQkJCQlpZiAoKG1vcmVPZmZzZXQgPj0gMCkgJiYgKG1vcmVPZmZzZXQgKyBsZW5ndGggPT0gbXlMZW5ndGgpKSB7Ci0JCQkJCW9mZnNldCA9IG1vcmVPZmZzZXQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBjYW4gaGFwcGVuIGlmIG15TGVuZ3RoIGlzIDAuCi0JCQkJCS8vIG5vIGFkanVzdG1lbnQgcG9zc2libGUuCi0JCQkJCXJlc3VsdCA9IG5ldyBTdHJpbmcoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFN0b3JlKCkuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRBZGFwdGVyTWFuYWdlcigpLmdldEFkYXB0ZXIodGhpcywgYWRhcHRlcik7Ci0JfQotCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBudWxsOwotCQlpZiAoVVNFX0xPQ0FMX1RIUkVBRCkgewotCQkJcmVzdWx0ID0gZkN1cnJlbnREb2N1bW5ldFJlZ2lvbkNhY2hlLmdldCgpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY2FjaGVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNnZXRDaGFyCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBjaGFyIGdldENoYXIoaW50IHBvcykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJY2hhciByZXN1bHQgPSAweDAwOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0U3RvcmUoKS5nZXQocG9zKTsKLQkJfQotCQljYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZG9jdW1lbnQgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuCi0JICogY2hhcmFjdGVyIHBvc2l0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldERvY3VtZW50UGFydGl0aW9uZXIoKS5nZXRDb250ZW50VHlwZShvZmZzZXQpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShTdHJpbmcgcGFydGl0aW9uaW5nLCBpbnQgb2Zmc2V0LCBib29sZWFuIHByZWZlck9wZW5QYXJ0aXRpb25zKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24sIEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiB7Ci0JCWlmICgoMCA+IG9mZnNldCkgfHwgKG9mZnNldCA+IGdldExlbmd0aCgpKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCi0JCUlEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyID0gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihwYXJ0aXRpb25pbmcpOwotCi0JCWlmIChwYXJ0aXRpb25lciBpbnN0YW5jZW9mIElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikKLQkJCXJldHVybiAoKElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikgcGFydGl0aW9uZXIpLmdldENvbnRlbnRUeXBlKG9mZnNldCwgcHJlZmVyT3BlblBhcnRpdGlvbnMpOwotCQllbHNlIGlmIChwYXJ0aXRpb25lciAhPSBudWxsKQotCQkJcmV0dXJuIHBhcnRpdGlvbmVyLmdldENvbnRlbnRUeXBlKG9mZnNldCk7Ci0JCWVsc2UgaWYgKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcuZXF1YWxzKHBhcnRpdGlvbmluZykpCi0JCQlyZXR1cm4gREVGQVVMVF9DT05URU5UX1RZUEU7Ci0JCWVsc2UKLQkJCXRocm93IG5ldyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNnZXREZWZhdWx0TGluZURlbGltaXRlcigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0TGluZURlbGltaXRlcigpIHsKLQkJLy8gc3BlY2lmaWMgcHJlZmVycmVkIGxpbmUgZGVsaW1pdGVyCi0JCWlmIChwcmVmZXJlZERlbGltaXRlciAhPSBudWxsKQotCQkJcmV0dXJuIHByZWZlcmVkRGVsaW1pdGVyOwotCi0KLQkJLy8gbm8gbGluZSBkZWxpbWl0ZXIgaGFzIGJlZW4gdXNlZCBzbyBqdXN0IHVzZSBwbGF0Zm9ybSdzIGRlZmF1bHQKLQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBudWxsOwotCQlTdHJpbmcgc3lzTGluZURlbGltaXRlciA9IFBsYXRmb3JtTGluZURlbGltaXRlcjsKLQkJU3RyaW5nW10gZGVsaW1pdGVycyA9IGdldExlZ2FsTGluZURlbGltaXRlcnMoKTsKLQkJQXNzZXJ0LmlzVHJ1ZShkZWxpbWl0ZXJzLmxlbmd0aCA+IDApOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlbGltaXRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChkZWxpbWl0ZXJzW2ldLmVxdWFscyhzeXNMaW5lRGVsaW1pdGVyKSkgewotCQkJCWxpbmVEZWxpbWl0ZXIgPSBzeXNMaW5lRGVsaW1pdGVyOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLy8gbm8gcGxhdGZvcm0gZGVmYXVsdCBzbyBqdXN0IHVzZSBmaXJzdCBsZWdhbCBkZWxpbWl0ZXIKLQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXIgPSBkZWxpbWl0ZXJzWzBdOwotCi0JCXJldHVybiBsaW5lRGVsaW1pdGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50J3MgcGFydGl0aW9uZXIuCi0JICogCi0JICogQHNlZSBJRG9jdW1lbnRQYXJ0aXRpb25lcgotCSAqLwotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcihJRG9jdW1lbnRFeHRlbnNpb24zLkRFRkFVTFRfUEFSVElUSU9OSU5HKTsKLQl9Ci0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREb2N1bWVudFBhcnRpdGlvbmVyKFN0cmluZyBwYXJ0aXRpb25pbmcpIHsKLQotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBkb2N1bWVudFBhcnRpdGlvbmVyID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudFBhcnRpdGlvbmVyID0gKElEb2N1bWVudFBhcnRpdGlvbmVyKSBmRG9jdW1lbnRQYXJ0aXRpb25lcnMuZ2V0KHBhcnRpdGlvbmluZyk7Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50UGFydGl0aW9uZXI7Ci0JfQotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB7Ci0JCXJldHVybiBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCS8vIHNob3VsZCB3ZSB1cGRhdGUgY2FjaGVkTm9kZT8KLQkJLy8gV2Ugc2hvdWxkIHRvIGtlZXAgY29uc2lzdGVudCBwaGlsb3NvcGh5IG9mIHJlbWVtYmVyaW5nIGxhc3QKLQkJLy8gcmVxdWVzdGVkIHBvc2l0aW9uLAotCQkvLyBmb3IgZWZmaWNpZW5jeS4KLQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oZmlyc3REb2N1bWVudFJlZ2lvbik7Ci0JCXJldHVybiBmaXJzdERvY3VtZW50UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCS8vIHNob3VsZCB3ZSB1cGRhdGUgY2FjaGVkTm9kZT8KLQkJLy8gV2Ugc2hvdWxkIHRvIGtlZXAgY29uc2lzdGVudCBwaGlsb3NvcGh5IG9mIHJlbWVtYmVyaW5nIGxhc3QKLQkJLy8gcmVxdWVzdGVkIHBvc2l0aW9uLAotCQkvLyBmb3IgZWZmaWNpZW5jeS4KLQkJc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24obGFzdERvY3VtZW50UmVnaW9uKTsKLQkJcmV0dXJuIGxhc3REb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBhcnRpdGlvbnMKLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsQ29udGVudFR5cGVzKCkgewotCQlTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0TGVnYWxDb250ZW50VHlwZXMoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyk7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpbXBvc3NpYmxlIGluIHRoaXMgY29udGV4dAotCQkJdGhyb3cgbmV3IEVycm9yKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsQ29udGVudFR5cGVzKFN0cmluZyBwYXJ0aXRpb25pbmcpIHRocm93cyBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gewotCQlJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lciA9IGdldERvY3VtZW50UGFydGl0aW9uZXIocGFydGl0aW9uaW5nKTsKLQkJaWYgKHBhcnRpdGlvbmVyICE9IG51bGwpCi0JCQlyZXR1cm4gcGFydGl0aW9uZXIuZ2V0TGVnYWxDb250ZW50VHlwZXMoKTsKLQkJaWYgKElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcuZXF1YWxzKHBhcnRpdGlvbmluZykpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1tde0RFRkFVTFRfQ09OVEVOVF9UWVBFfTsKLQkJdGhyb3cgbmV3IEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbigpOwotCX0KLQotCS8qCi0JICogLS0tLS0tLS0tLS0tLS0tLS0tIGxpbmUgZGVsaW1pdGVyIGNvbnZlcnNpb24KLQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMZWdhbExpbmVEZWxpbWl0ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjZ2V0TGVuZ3RoCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBnZXRTdG9yZSgpLmdldExlbmd0aCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNnZXRMaW5lRGVsaW1pdGVyKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCXJldHVybiBnZXREZWZhdWx0TGluZURlbGltaXRlcigpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxpbmUgZGVsaW1pdGVyIG9mIHRoYXQgbGluZQotCSAqIAotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiB0aGUgbGluZSBudW1iZXIgaXMgaW52YWxpZCBpbiB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoaW50IGxpbmUpIHRocm93cyBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXRMaW5lRGVsaW1pdGVyKGxpbmUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3BlY2lmaWVkIGxpbmUuIFRoZSBsaW5lIGlzIGRlc2NyaWJlZCBieQotCSAqIGl0cyBvZmZzZXQgYW5kIGl0cyBsZW5ndGggZXhjbHVkaW5nIHRoZSBsaW5lJ3MgZGVsaW1pdGVyLgotCSAqIAotCSAqIEBwYXJhbSBsaW5lCi0JICogICAgICAgICAgICB0aGUgbGluZSBvZiBpbnRlcmVzdAotCSAqIEByZXR1cm4gYSBsaW5lIGRlc2NyaXB0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsaW5lIG51bWJlciBpcyBpbnZhbGlkIGluIHRoaXMgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbihpbnQgbGluZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVJbmZvcm1hdGlvbihsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIGxpbmUgYXQgdGhlIGdpdmVuIG9mZnNldC4gVGhlIGRlc2NyaXB0aW9uCi0JICogY29udGFpbnMgdGhlIG9mZnNldCBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgbGluZSBleGNsdWRpbmcgdGhlIGxpbmUncwotCSAqIGRlbGltaXRlci4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IHdob3NlIGxpbmUgc2hvdWxkIGJlIGRlc2NyaWJlZAotCSAqIEByZXR1cm4gYSByZWdpb24gZGVzY3JpYmluZyB0aGUgbGluZQotCSAqIEBleGNlcHRpb24gQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBpZiBvZmZzZXQgaXMgaW52YWxpZCBpbiB0aGlzIGRvY3VtZW50Ci0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChpbnQgb2Zmc2V0KSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQob2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbGluZSBpbmZvcm1hdGlvbgotCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0JICovCi0JcHVibGljIGludCBnZXRMaW5lTGVuZ3RoKGludCBsaW5lKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TGluZUxlbmd0aChsaW5lKTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgZ2l2ZW4gbGluZS4KLQkgKiAKLQkgKiBAcGFyYW0gbGluZQotCSAqICAgICAgICAgICAgdGhlIGxpbmUgb2YgaW50ZXJlc3QKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBvZmZzZXQKLQkgKiBAZXhjZXB0aW9uIEJhZExvY2F0aW9uRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxpbmUgbnVtYmVyIGlzIGludmFsaWQgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGluZU9mZnNldChpbnQgbGluZSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0VHJhY2tlcigpLmdldExpbmVPZmZzZXQobGluZSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lT2ZPZmZzZXQoaW50IG9mZnNldCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBnZXRUcmFja2VyKCkuZ2V0TGluZU51bWJlck9mT2Zmc2V0KG9mZnNldCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCWlmIChMb2dnZXIuREVCVUdfRE9DVU1FTlQpCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgIkRldi4gUHJvZ3JhbSBJbmZvIE9ubHk6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OmdldExpbmVPZk9mZnNldDogb2Zmc2V0IG91dCBvZiByYW5nZSwgemVybyBhc3N1bWVkLiBvZmZzZXQgPSAiICsgb2Zmc2V0LCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXN1bHQgPSAwOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoaXMgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhpcyBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcygpIHsKLQkJcmV0dXJuIGdldFRyYWNrZXIoKS5nZXROdW1iZXJPZkxpbmVzKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGxpbmVzIHdoaWNoIGFyZSBvY2N1cGllZCBieSBhIGdpdmVuIHRleHQgcmFuZ2UuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgc3BlY2lmaWVkIHRleHQgcmFuZ2UKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBzcGVjaWZpZWQgdGV4dCByYW5nZQotCSAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBsaW5lcyBvY2N1cGllZCBieSB0aGUgc3BlY2lmaWVkIHJhbmdlCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHNwZWNpZmllZCByYW5nZSBpcyBpbnZhbGlkIGluIHRoaXMgdHJhY2tlcgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3Mgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRUcmFja2VyKCkuZ2V0TnVtYmVyT2ZMaW5lcyhvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyBwdWJsaWMsIHRlbXBvcmFyaWx5LCBmb3IgdXNlIGJ5IHRhZyBsaWIgY2xhc3Nlcy4KLQkgKi8KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJaWYgKGZQYXJzZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSVN0cnVjdHVyZWREb2N1bWVudDo6Z2V0UGFyc2VyLiBQYXJzZXIgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBmUGFyc2VyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbiBpbiB3aGljaCB0aGUgcG9zaXRpb24gaXMgbG9jYXRlZC4gVGhlCi0JICogcGFydGl0aW9uIGlzIHNwZWNpZmllZCBhcyB0eXBlZCByZWdpb24uCi0JICovCi0JcHVibGljIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oaW50IG9mZnNldCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXJ0aXRpb24gPSBnZXRQYXJ0aXRpb24oSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgb2Zmc2V0LCBmYWxzZSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZFBhcnRpdGlvbmluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQkJaWYgKHBhcnRpdGlvbiA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRXJyb3IoKTsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uOwotCX0KLQotCi0JcHVibGljIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oU3RyaW5nIHBhcnRpdGlvbmluZywgaW50IG9mZnNldCwgYm9vbGVhbiBwcmVmZXJPcGVuUGFydGl0aW9ucykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQYXJ0aXRpb25pbmdFeGNlcHRpb24gewotCQlpZiAoKDAgPiBvZmZzZXQpIHx8IChvZmZzZXQgPiBnZXRMZW5ndGgoKSkpCi0JCQl0aHJvdyBuZXcgQmFkTG9jYXRpb25FeGNlcHRpb24oKTsKLQkJSVR5cGVkUmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0KLQkJSURvY3VtZW50UGFydGl0aW9uZXIgcGFydGl0aW9uZXIgPSBnZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZyk7Ci0KLQkJaWYgKHBhcnRpdGlvbmVyIGluc3RhbmNlb2YgSURvY3VtZW50UGFydGl0aW9uZXJFeHRlbnNpb24yKSB7Ci0JCQlyZXN1bHQgPSAoKElEb2N1bWVudFBhcnRpdGlvbmVyRXh0ZW5zaW9uMikgcGFydGl0aW9uZXIpLmdldFBhcnRpdGlvbihvZmZzZXQsIHByZWZlck9wZW5QYXJ0aXRpb25zKTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25lciAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBwYXJ0aXRpb25lci5nZXRQYXJ0aXRpb24ob2Zmc2V0KTsKLQkJfQotCQllbHNlIGlmIChJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLmVxdWFscyhwYXJ0aXRpb25pbmcpKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVHlwZWRSZWdpb24oMCwgZ2V0TGVuZ3RoKCksIERFRkFVTFRfQ09OVEVOVF9UWVBFKTsKLQkJfQotCQllbHNlCi0JCQl0aHJvdyBuZXcgQmFkUGFydGl0aW9uaW5nRXhjZXB0aW9uKCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UGFydGl0aW9uaW5ncygpIHsKLQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCVN0cmluZ1tdIHBhcnRpdGlvbmluZ3MgPSBuZXcgU3RyaW5nW2ZEb2N1bWVudFBhcnRpdGlvbmVycy5zaXplKCldOwotCQlmRG9jdW1lbnRQYXJ0aXRpb25lcnMua2V5U2V0KCkudG9BcnJheShwYXJ0aXRpb25pbmdzKTsKLQkJcmV0dXJuIHBhcnRpdGlvbmluZ3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgcG9zaXRpb24gY2F0ZWdvcmllcyBhZGRlZCB0byB0aGlzIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKSB7Ci0JCXJldHVybiBnZXRQb3NpdGlvbk1hbmFnZXIoKS5nZXRQb3NpdGlvbkNhdGVnb3JpZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHBvc2l0aW9uTWFuYWdlci4KLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIgZ2V0UG9zaXRpb25NYW5hZ2VyKCkgewotCQlpZiAoZlBvc2l0aW9uTWFuYWdlciA9PSBudWxsKSB7Ci0JCQlmUG9zaXRpb25NYW5hZ2VyID0gbmV3IEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIodGhpcyk7Ci0JCX0KLQkJcmV0dXJuIGZQb3NpdGlvbk1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhbGwgUG9zaXRpb25zIG9mIHRoZSBnaXZlbiBwb3NpdGlvbiBjYXRlZ29yeS4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJZiBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0UG9zaXRpb25zKFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBnZXRQb3NpdGlvbk1hbmFnZXIoKS5nZXRQb3NpdGlvbnMoY2F0ZWdvcnkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I2dldFBvc2l0aW9uVXBkYXRlcnMKLQkgKi8KLQlwdWJsaWMgSVBvc2l0aW9uVXBkYXRlcltdIGdldFBvc2l0aW9uVXBkYXRlcnMoKSB7Ci0JCXJldHVybiBnZXRQb3NpdGlvbk1hbmFnZXIoKS5nZXRQb3NpdGlvblVwZGF0ZXJzKCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCB3aGljaCBpcyB0aGUgY2FzZSBpZiB0aGUgb2Zmc2V0IGlzIGp1c3QKLQkgKiBiZWZvcmUgb3IganVzdCBhZnRlciB0aGUgZXhpc3RpbmcgdGV4dC4gQ29tcGFyZSB3aXRoCi0JICogZ2V0Tm9kZUF0Q2hhcmFjdGVyT2Zmc2V0LgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXN1bHQgPSBudWxsOwotCi0JCS8vIEZJWE1FOiBuZWVkIHRvIHN5bmNoIG9uICdjYWNoZWRSZWdpb24nIChidXQgc2luY2UgdGhhdCdzIGEKLQkJLy8gY29uc3RhbnRseSBjaGFuZ2luZyBvYmplY3QsIHdlCi0JCS8vIGNhbid0LCBzbyBuZWVkIHRvIGFkZCBhICJyZWdpb25fbG9jayIgb2JqZWN0LCBhbmQgdXNlIGl0IGhlcmUsIGFuZAotCQkvLyBpbiByZS1wYXJzZXIuCi0JCS8vIE9oLCBhbmQgbmVlZCB0byBtYWtlIHN1cmUsIGFmdGVyIHN5bmNoLCB0aGF0IHRoZSByZWdpb24gaXMgbm90Ci0JCS8vIGRlbGV0ZWQsIGFuZCBpZiBzbywgSSBndWVzcyBnbyBiYWNrCi0JCS8vIHRvIHRoZSBiZWdpbm5pbmchCi0KLQkJLy8gY2FjaGVkIG5vZGUgY2FuIGJlIG51bGwgd2hlbiBkb2N1bWVudCBpcyBlbXB0eQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBvdGVudGlhbENhY2hlZFJlZ2lvbiA9IGdldENhY2hlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChwb3RlbnRpYWxDYWNoZWRSZWdpb24gIT0gbnVsbCkgewotCi0JCQkvLyAKLQotCQkJLy8gaWYgd2UgYWxyZWFkeSBoYXZlIHRoZSByaWdodCBub2RlLCByZXR1cm4gdGhhdC4KLQkJCWlmIChwb3RlbnRpYWxDYWNoZWRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJCXJlc3VsdCA9IHBvdGVudGlhbENhY2hlZFJlZ2lvbjsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGZpcnN0LCBmaW5kIG91dCB3aGF0IGRpcmVjdGlvbiB0byBnbywgcmVsYXRpdmUgdG8KLQkJCQkvLyBjYWNoZWROb2RlLgotCQkJCS8vIG5lZ2F0aXZlIG1lYW5zICJ0b3dhcmRzIHRoZSBmcm9udCIgb2YgdGhlIGZpbGUsCi0JCQkJLy8gcG9zdGl0aXZlCi0JCQkJLy8gbWVhbnMKLQkJCQkvLyB0b3dhcmRzIHRoZSBlbmQuCi0JCQkJaW50IGRpcmVjdGlvbiA9IG9mZnNldCAtIHBvdGVudGlhbENhY2hlZFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCWlmIChkaXJlY3Rpb24gPCAwKSB7Ci0JCQkJCS8vIHNlYXJjaCB0b3dhcmRzIGJlZ2lubmluZwotCQkJCQl3aGlsZSAoIXBvdGVudGlhbENhY2hlZFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHRlbXBOb2RlID0gcG90ZW50aWFsQ2FjaGVkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQkJCQlpZiAodGVtcE5vZGUgPT0gbnVsbCkgewotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJcG90ZW50aWFsQ2FjaGVkUmVnaW9uID0gdGVtcE5vZGU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHNlYXJjaCB0b3dhcmRzIGVuZAotCQkJCQkvLyBUaGVyZSBpcyBhIGxlZ2l0YW1hdCBjb25kaXRpb24gd2hlcmUgdGhlCi0JCQkJCS8vIG9mZnNldCB3aWxsIG5vdCBiZSBjb250YWluZWQgaW4gYW55IG5vZGUsCi0JCQkJCS8vIHdoaWNoIGlzIGlmIHRoZSBvZmZzZXQgaXMganVzdCBwYXN0IHRoZSBsYXN0Ci0JCQkJCS8vIGNoYXJhY3RlciBvZiB0ZXh0LgotCQkJCQkvLyBBbmQsIHdlIG11c3QgZ2F1cmQgYWdhaW5zdCBzZXR0aW5nIGNhY2hlZE5vZGUgdG8KLQkJCQkJLy8gbnVsbCEKLQkJCQkJd2hpbGUgKCFwb3RlbnRpYWxDYWNoZWRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0ZW1wTm9kZSA9IHBvdGVudGlhbENhY2hlZFJlZ2lvbi5nZXROZXh0KCk7Ci0JCQkJCQlpZiAodGVtcE5vZGUgPT0gbnVsbCkKLQkJCQkJCQlicmVhazsKLQkJCQkJCWVsc2UKLQkJCQkJCQlwb3RlbnRpYWxDYWNoZWRSZWdpb24gPSB0ZW1wTm9kZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IHBvdGVudGlhbENhY2hlZFJlZ2lvbjsKLQkJfQotCQkvLyBqdXN0IHRvIGJlIGRvdWJseSBzdXJlIHdlIG5ldmVyIGFzc2lnbiBudWxsIHRvIGFuIGFscmVhZHkgdmFsaWQKLQkJLy8gY2FjaGVkUmVnaW9uLgotCQkvLyBJIGJlbGlldmUgYW55IHRpbWUgJ3Jlc3VsdCcgaXMgbnVsbCBhdCB0aGlzIHBvaW50LCB0aGF0IGp1c3QgbWVhbnMKLQkJLy8gd2UgaGF2ZSBhbgotCQkvLyBlbXB0eSBkb2N1bWVudCwgYW5kIHRoZSBjYWNoZWRSZWdpb24gaXMgYWxyZWFkeSBudWxsLCBidXQgd2UgY2hlY2sKLQkJLy8gYW5kIHByaW50Ci0JCS8vIHdhcm5pbmcsIGp1c3Qgc28gZHVyaW5nIGRldmVsb3BtZW50IHdlIGJlIHN1cmUgd2UgbmV2ZXIgYWNjaWRlbnRseQotCQkvLyBicmVhayB0aGlzIGFzc3VtcHRpb24uCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCXNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWVsc2UgaWYgKGdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUHJvZ3JhbSBFcnJvcjogbm8gcmVnaW9uIGNvdWxkIGJlIGZvdW5kIHRvIGNhY2hlLCBidXQgY2FjaGUgd2FzIG5vbiBudWxsLiBJbmRpY2F0ZXMgY29ycnVwdGVkIG1vZGVsIG9yIHJlZ2lvbiBsaXN0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKSB7Ci0JCUNvcmVOb2RlTGlzdCByZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKQotCQkJcmVzdWx0ID0gbmV3IENvcmVOb2RlTGlzdChudWxsKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gbmV3IENvcmVOb2RlTGlzdChnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKTsKLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQlyZXR1cm4gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygwLCBnZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogSW4gdGhlIGNhc2Ugb2YgMCBsZW5ndGgsIHRoZSA8Y29kZT5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uPC9jb2RlPgotCSAqIGF0IHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IGlzIHJldHVyZW5lZC4gSW4gb3RoZXIgd29yZHMsIHRoZSByZWdpb24gdG8gdGhlCi0JICogcmlnaHQgb2YgdGhlIGNhcmV0IGlzIHJldHVybmVkLiBleGNlcHQgZm9yIGF0IHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LAotCSAqIHRoZW4gdGhlIGxhc3QgcmVnaW9uIGlzIHJldHVybmVkLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBPdGhlcndpc2UgYWxsIHRoZSByZWdpb25zICJpbmJldHdlZW4iIHRoZSBpbmRpY2F0ZWQgcmFuZ2UgYXJlIHJldHVybmVkLAotCSAqIGluY2x1ZGluZyB0aGUgcmVnaW9ucyB3aGljaCBvdmVybGFwIHRoZSByZWdpb24uCi0JICogPC9wPgotCSAqIAotCSAqIDxicj4KLQkgKiBlZy4KLQkgKiA8cD4KLQkgKiA8YnI+Ci0JICogZWcuCi0JICogCi0JICogPHByZT4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICZsdDtodG1sJmd0O1smbHQ7aGVhZCZndDsmbHQ7L2hlYWQmZ3Q7XSZsdDsvaHRtbCZndDsgcmV0dXJucyAmbHQ7aGVhZCZndDssJmx0Oy9oZWFkJmd0OwotCSAqIDwvcHJlPgotCSAqICAgIDxwcmU+Ci0JICogICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aHRbbWwmZ3Q7Jmx0O2hlYWQmZ3Q7Jmx0Oy9oZV1hZCZndDsmbHQ7L2h0bWwmZ3Q7IHJldHVybnMgJmx0O2h0bWwmZ3Q7LCZsdDtoZWFkJmd0OywmbHQ7L2hlYWQmZ3Q7Ci0JICogPC9wcmU+Ci0JICogCi0JICogPHByZT4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2h0bWwmZ3Q7WyZsdDtoZWFkJmd0OyZsdDsvaGVhZCZndDtdJmx0Oy9odG1sJmd0OyByZXR1cm5zICZsdDtoZWFkJmd0OywmbHQ7L2hlYWQmZ3Q7Ci0JICogPC9wcmU+Ci0JICogICAgPHByZT4KLQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2h0W21sJmd0OyZsdDtoZWFkJmd0OyZsdDsvaGVdYWQmZ3Q7Jmx0Oy9odG1sJmd0OyByZXR1cm5zICZsdDtodG1sJmd0OywmbHQ7aGVhZCZndDssJmx0Oy9oZWFkJmd0OwotCSAqIDwvcHJlPgotCSAqIAotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJaWYgKGxlbmd0aCA8IDApCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYW4ndCBoYXZlIG5lZ2F0aXZlIGxlbmd0aCIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gdGhpcyB3aWxsIG1ha2UgdGhlIHJpZ2h0IGVkZ2Ugb2YgdGhlIHJhbmdlIHBvaW50IGludG8gdGhlIHNlbGVjdGlvbgotCQkvLyBlZy4gPGh0bWw+WzxoZWFkPjwvaGVhZD5dPC9odG1sPgotCQkvLyB3aWxsIHJldHVybiA8aGVhZD4sPC9oZWFkPiBpbnN0ZWFkIG9mIDxoZWFkPiw8L2hlYWQ+LDwvaHRtbD4KLQkJaWYgKGxlbmd0aCA+IDApCi0JCQlsZW5ndGgtLTsKLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gc3RhcnQgdGhyZWFkIHNhZmUgYmxvY2sKLQkJdHJ5IHsKLQkJCWFjcXVpcmVMb2NrKCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFJlZ2lvbiA9IGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHN0YXJ0KTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc3RhcnQgKyBsZW5ndGgpOwotCQkJd2hpbGUgKGN1cnJlbnRSZWdpb24gIT0gZW5kUmVnaW9uICYmIGN1cnJlbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCXJlc3VsdHMuYWRkKGN1cnJlbnRSZWdpb24pOwotCQkJCWN1cnJlbnRSZWdpb24gPSBjdXJyZW50UmVnaW9uLmdldE5leHQoKTsKLQkJCX0KLQkJCS8vIG5lZWQgdG8gYWRkIHRoYXQgbGFzdCBlbmQgcmVnaW9uCi0JCQkvLyBjYW4gYmUgbnVsbCBpbiB0aGUgY2FzZSBvZiBhbiBlbXB0eSBkb2N1bWVudAotCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKQotCQkJCXJlc3VsdHMuYWRkKGVuZFJlZ2lvbik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlyZWxlYXNlTG9jaygpOwotCQl9Ci0JCS8vIGVuZCB0aHJlYWQgc2FmZSBibG9jawotCi0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltdKSByZXN1bHRzLnRvQXJyYXkobmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiB3YXMgbWFkZSBwdWJsaWMgZm9yIGVhc2llciB0ZXN0aW5nLiBOb3JtYWxseSBzaG91bGQgbmV2ZXIgYmUgdXNlZCBieQotCSAqIGNsaWVudCBjb2Rlcy4KLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgZ2V0UmVQYXJzZXIoKSB7Ci0JCWlmIChmUmVQYXJzZXIgPT0gbnVsbCkgewotCQkJZlJlUGFyc2VyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JCQlmUmVQYXJzZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHRoaXMpOwotCQl9Ci0JCXJldHVybiBmUmVQYXJzZXI7Ci0JfQotCi0JcHJpdmF0ZSBJVGV4dFN0b3JlIGdldFN0b3JlKCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGZTdG9yZSk7Ci0JCXJldHVybiBmU3RvcmU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlTdHJpbmcgcmVzdWx0ID0gZ2V0KCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIuIEFzc3VtZXMgdGhhdCB0aGUgZG9jdW1lbnQgaGFzIGJlZW4KLQkgKiBpbml0aWFsaXplZCB3aXRoIGEgbGluZSB0cmFja2VyLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgbGluZSB0cmFja2VyCi0JICovCi0JcHJpdmF0ZSBJTGluZVRyYWNrZXIgZ2V0VHJhY2tlcigpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmVHJhY2tlcik7Ci0JCXJldHVybiBmVHJhY2tlcjsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0JCWlmIChmVW5kb01hbmFnZXIgPT0gbnVsbCkgewotCQkJZlVuZG9NYW5hZ2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIoKTsKLQkJfQotCQlyZXR1cm4gZlVuZG9NYW5hZ2VyOwotCX0KLQotCXZvaWQgaW5pdGlhbGl6ZUZpcnN0QW5kTGFzdERvY3VtZW50UmVnaW9uKCkgewotCQkvLyBjYWNoZWQgTm9kZSBtdXN0IGFsc28gYmUgZmlyc3QsIGF0IHRoZSBpbml0aWFsIHBvaW50LiBPbmx5Ci0JCS8vIHZhbGlkCi0JCS8vIHRvIGNhbGwgdGhpcyBtZXRob2QgcmlnaHQgYWZ0ZXIgdGhlIGZpcnN0IHBhcnNlLgotCQkvLyAKLQkJLy8gd2hlbiBzdGFydGluZyBhZnJlc2gsIG91ciBjYWNoZWROb2RlIHNob3VsZCBiZSBvdXIgZmlyc3ROb2RlLAotCQkvLyBzbyBiZSBzdXJlIHRvIGluaXRpYWxpemUgdGhlIGZpcnN0Tm9kZQotCQlmaXJzdERvY3VtZW50UmVnaW9uID0gZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gYmUgc3VyZSB0byB1c2UgJ2dldE5leHQnIGZvciB0aGlzIGluaXRpYWwgZmluZGluZyBvZiB0aGUgbGFzdAotCQkvLyBub2RlLAotCQkvLyBzaW5jZSB0aGUgaW1wbGVtZW50YXRpb24gb2Ygbm9kZS5nZXRMYXN0Tm9kZSBtYXkgc2ltcGx5IGNhbGwKLQkJLy8gc3RydWN0dXJlZERvY3VtZW50LmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24hCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBmaXJzdERvY3VtZW50UmVnaW9uOwotCQlpZiAoYU5vZGUgPT0gbnVsbCkgewotCQkJLy8gZGVmZWN0IDI1NDYwNzogdG8gaGFuZGxlIGVtcHR5IGRvY3VtZW50cyByaWdodCwgaWYKLQkJCS8vIGZpcnN0bm9kZSBpcwotCQkJLy8gbnVsbCwgbWFrZSBzdXJlIGxhc3Qgbm9kZSBpcyBudWxsIHRvbwotCQkJbGFzdERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JCQkJbGFzdERvY3VtZW50UmVnaW9uID0gYU5vZGU7Ci0JCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNpbnNlcnRQb3NpdGlvblVwZGF0ZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyLCBpbnQgaW5kZXgpIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuaW5zZXJ0UG9zaXRpb25VcGRhdGVyKHVwZGF0ZXIsIGluZGV4KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxfYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGludGVybmFsX2FkZFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkuYWRkUG9zaXRpb25VcGRhdGVyKHVwZGF0ZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnRlcm5hbF9zZXRQYXJzZXIoUmVnaW9uUGFyc2VyIG5ld1BhcnNlcikgewotCQlmUGFyc2VyID0gbmV3UGFyc2VyOwotCX0KLQotCVN0cmluZyBpbnRlcm5hbEdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBpbnQgbXlMZW5ndGggPSBnZXRMZW5ndGgoKTsKLQkJLy8gaWYgKCgwID4gb2Zmc2V0KSB8fCAoMCA+IGxlbmd0aCkgfHwgKG9mZnNldCArIGxlbmd0aCA+IG15TGVuZ3RoKSkKLQkJLy8gdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0JCXJlc3VsdCA9IGdldFN0b3JlKCkuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWVzdGVyCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIHJlcGxhY2VtZW50TGVuZ3RoCi0JICogQHBhcmFtIGNoYW5nZXMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBpbnRlcm5hbFJlcGxhY2VUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIGludCBzdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgY2hhbmdlcywgYm9vbGVhbiBpZ25vcmVSZWFkT25seVNldHRpbmdzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0KLQkJc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCk7Ci0JCWlmIChjaGFuZ2VzID09IG51bGwpCi0JCQljaGFuZ2VzID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJLy8gCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6OnJlcGxhY2VUZXh0KCIgKyBzdGFydCArICIsIiArIHJlcGxhY2VtZW50TGVuZ3RoICsgIiwiICsgY2hhbmdlcyArICIpIik7IC8vJE5PTi1OTFMtNCQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJaWYgKERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50T25seSB8fCBEZWJ1Zy5wZXJmVGVzdCB8fCBEZWJ1Zy5wZXJmVGVzdFJhd1N0cnVjdHVyZWREb2N1bWVudE9ubHkpIHsKLQkJCXN0YXJ0U3RyZWFtVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCXRyeSB7Ci0JCQkvLyBOb3RlOiBldmVudCBtdXN0IGJlIGNvbXB1dGVkIGJlZm9yZSAnZmlyZScgbWV0aG9kIGNhbGxlZAotCQkJZkRvY3VtZW50RXZlbnQgPSBuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMpOwotCQkJZmlyZURvY3VtZW50QWJvdXRUb0NoYW5nZWQoKTsKLQotCQkJdHJ5IHsKLQkJCQlhY3F1aXJlTG9jaygpOwotCi0JCQkJaWYgKCFpZ25vcmVSZWFkT25seVNldHRpbmdzICYmIChjb250YWluc1JlYWRPbmx5KHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCkpKSB7Ci0JCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIHJlcXVlc3RlciwgY2hhbmdlcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50LlJFQURfT05MWV9TVEFURV9DSEFOR0U7Ci0JCQkJCXJlc3VsdCA9IG5vQ2hhbmdlRXZlbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHQgPSB1cGRhdGVNb2RlbChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJcmVsZWFzZUxvY2soKTsKLQkJCX0KLQotCi0JCQlpZiAoRGVidWcucGVyZlRlc3RSYXdTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5IHx8IERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJbG9uZyBzdG9wU3RyZWFtVGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiXG5cdFx0XHRcdCBUaW1lIGZvciBJU3RydWN0dXJlZERvY3VtZW50IHJhdyByZXBsYWNlVGV4dDogIiArIChzdG9wU3RyZWFtVGltZSAtIHN0YXJ0U3RyZWFtVGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImV2ZW50IHR5cGUgcmV0dXJuZWQgYnkgcmVwbGFjZVRleHRXaXRoTm9EZWJ1Z2dpbmdUaHJlYWQ6ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQkvLyBGVVRVUkVfVE9fRE86IGltcGxlbWVudCBjYWxsYmFjayBtZWNoYW5pc20/IHRvIGF2b2lkIGluc3RhbmNlb2YKLQkJCS8vIGFuZCBjYXN0aW5nCi0JCQkvLyBmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQgbXVzdCBiZSBjYWxsZWQgaW4gb3JkZXIgdG8gZW5kCi0JCQkvLyBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQgc3RhdGUKLQotCQkJLy8gaW5jcmVtZW50IG1vZGlmaWNhdGlvbiBzdGFtcCBpZiBtb2RpZmljYXRpb25zIHdlcmUgbWFkZQotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmICEocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkpCi0JCQkJZk1vZGlmaWNhdGlvblN0YW1wKys7Ci0KLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCS8vIHJlc3VsdCBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93biwKLQkJCQkvLyBpdCB3aWxsIGJlCi0JCQkJLy8gc28gc2VuZCBhIG5vQ2hhbmdlRXZlbnQgYW5kIGxvZyB0aGUgcHJvYmxlbQotCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIHJlcXVlc3RlciwgY2hhbmdlcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuTk9fRVZFTlQ7Ci0JCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KG5vQ2hhbmdlRXZlbnQpOwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiUHJvZ3JhbSBFcnJvcjogaW52YWxpZCBzdHJ1Y3R1cmVkIGRvY3VtZW50IGV2ZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChyZXN1bHQgaW5zdGFuY2VvZiBSZWdpb25DaGFuZ2VkRXZlbnQpIHsKLQkJCQkJZmlyZVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KChSZWdpb25DaGFuZ2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoUmVnaW9uc1JlcGxhY2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCQkJCQkvLyBwcm9iYWJseSBtb3JlIGVmZmljaWVudCB0byBtYXJrIG9sZCByZWdpb25zIGFzCi0JCQkJCQkJLy8gJ2RlbGV0ZWQnIGF0IHRoZSB0aW1lCi0JCQkJCQkJLy8gdGhhdCBhcmUgZGV0ZXJtaW5lZCB0byBiZSBkZWxldGVkLCBidXQgSSdsbCBkbwotCQkJCQkJCS8vIGhlcmUKLQkJCQkJCQkvLyBpbiB0aGVuIGNlbnRyYWwgc3BvdAotCQkJCQkJCS8vIGZvciBwcm9ncmFtbWluZyBlYXNlLgotCQkJCQkJCXVwZGF0ZURlbGV0ZWRGaWVsZHMoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSByZXN1bHQpOwotCQkJCQkJCWZpcmVTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpZiAocmVzdWx0IGluc3RhbmNlb2YgTm9DaGFuZ2VFdmVudCkgewotCQkJCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQoKE5vQ2hhbmdlRXZlbnQpIHJlc3VsdCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBpZiBoZXJlLCB0aGlzIG1lYW5zIGEgbmV3IGV2ZW50IHdhcyBjcmVhdGVkCi0JCQkJCQkJCS8vIGFuZCBub3QgaGFuZGxlZCBoZXJlCi0JCQkJCQkJCS8vIGp1c3Qgc2VuZCBhIG5vIGV2ZW50IHVudGlsIHRoaXMgaXNzdWUgaXMKLQkJCQkJCQkJLy8gcmVzb2x2ZWQuCi0JCQkJCQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIHJlcXVlc3RlciwgY2hhbmdlcywgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoKTsKLQkJCQkJCQkJbm9DaGFuZ2VFdmVudC5yZWFzb24gPSBOb0NoYW5nZUV2ZW50Lk5PX0VWRU5UOwotCQkJCQkJCQlmaXJlU3RydWN0dXJlZERvY3VtZW50RXZlbnQobm9DaGFuZ2VFdmVudCk7Ci0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJQcm9ncmFtIEVycm9yOiB1bmV4cGVjdGVkIHN0cnVjdHVyZWQgZG9jdW1lbnQgZXZlbnQ6ICIgKyByZXN1bHQpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKERlYnVnLnBlcmZUZXN0IHx8IERlYnVnLnBlcmZUZXN0U3RydWN0dXJlZERvY3VtZW50T25seSkgewotCQkJCWxvbmcgc3RvcFN0cmVhbVRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlxuXHRcdFx0XHQgVG90YWwgVGltZSBmb3IgSVN0cnVjdHVyZWREb2N1bWVudCBldmVudCBzaWduYWxpbmcvcHJvY2Vzc2luZyBpbiByZXBsYWNlVGV4dDogIiArIChzdG9wU3RyZWFtVGltZSAtIHN0YXJ0U3RyZWFtVGltZSkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2xlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBsZW5ndGgoKSB7Ci0KLQkJcmV0dXJuIGdldExlbmd0aCgpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCW1ha2VSZWFkT25seShzdGFydE9mZnNldCwgbGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VSZWFkT25seShpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gY2FuSW5zZXJ0QmVmb3JlLCBib29sZWFuIGNhbkluc2VydEFmdGVyKSB7CQotCQkvLyBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gaGF2ZSBhIHJlYWRvbmx5IHJlZ2lvbiBvZiAwIGxlbmd0aCwKLQkJLy8gc28gd2UnbGwgaWdub3JlIHRob3NlIHJlcXVlc3RzCi0JCWlmIChsZW5ndGggPD0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGFmZmVjdGVkVGV4dCA9IHRoaXMuZ2V0KHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCQkvLyBhIGRvY3VtZW50IGV2ZW50IGZvciAicmVhZCBvbmx5IiBjaGFuZ2UgLi4uIG11c3QKLQkJLy8gYmUgZm9sbG93ZWQgYnkgIm5vIGNoYW5nZSIgc3RydWN0dXJlZERvY3VtZW50IGV2ZW50Ci0JCS8vIGZEb2N1bWVudEV2ZW50ID0gbmV3IERvY3VtZW50RXZlbnQodGhpcywgc3RhcnRPZmZzZXQsIGxlbmd0aCwKLQkJLy8gYWZmZWN0ZWRUZXh0KTsKLQkJZmlyZVJlYWRPbmx5QWJvdXRUb0JlQ2hhbmdlZCgpOwotCQkvLyBpZiAoY29udGFpbnNSZWFkT25seShzdGFydE9mZnNldCwgbGVuZ3RoKSkgewotCQkvLyBhZGp1c3RSZWFkT25seVJlZ2lvbnMoc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCS8vIH0gZWxzZSB7Ci0JCS8vIHdlIGNhbiBibGluZGx5IGFkZCBjYXRlZ29yeSwgc2luY2Ugbm8gaGFybSBkb25lIGlmIGFscmVhZHkKLQkJLy8gZXhpc3RzLgotCQlhZGRQb3NpdGlvbkNhdGVnb3J5KFJFQURfT05MWV9SRUdJT05TX0NBVEVHT1JZKTsKLQkJUG9zaXRpb24gbmV3UG9zaXRpb24gPSBuZXcgUmVhZE9ubHlQb3NpdGlvbihzdGFydE9mZnNldCwgbGVuZ3RoLCBjYW5JbnNlcnRCZWZvcmUpOwotCQl0cnkgewotCQkJYWRkUG9zaXRpb24oUkVBRF9PTkxZX1JFR0lPTlNfQ0FURUdPUlksIG5ld1Bvc2l0aW9uKTsKLQkJCS8vIEZJWE1FOiBuZWVkIHRvIGNoYW5nZSBBUEkgdG8gcGFzcyBpbiByZXF1ZXN0ZXIsIHNvIHRoaXMgZXZlbnQKLQkJCS8vIGNhbiBiZQotCQkJLy8gY3JlYXRlZCBjb3JyZWN0bHksIGluc3RlYWQgb2YgdXNpbmcgbnVsbC4KLQkJCU5vQ2hhbmdlRXZlbnQgbm9DaGFuZ2VFdmVudCA9IG5ldyBOb0NoYW5nZUV2ZW50KHRoaXMsIG51bGwsIGFmZmVjdGVkVGV4dCwgc3RhcnRPZmZzZXQsIGxlbmd0aCk7Ci0JCQlub0NoYW5nZUV2ZW50LnJlYXNvbiA9IE5vQ2hhbmdlRXZlbnQuUkVBRF9PTkxZX1NUQVRFX0NIQU5HRTsKLQkJCWZpcmVSZWFkT25seVN0cnVjdHVyZWREb2N1bWVudEV2ZW50KG5vQ2hhbmdlRXZlbnQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBmb3Igbm93LCBsb2cgYW5kIGlnbm9yZS4gUGVyaGFwcyBsYXRlciB3ZQotCQkJLy8gY291bGQgYWRqdXN0IHRvIGhhbmRsZSBzb21lIGNhc2VzPwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigoImNvdWxkIG5vdCBjcmVhdGUgcmVhZG9ubHkgcmVnaW9uIGF0ICIgKyBzdGFydE9mZnNldCArICIgdG8gIiArIGxlbmd0aCksIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgbmV2ZXIgb2NjdXIsIHNpbmNlIHdlIGFkZCBjYXRlZ29yeQotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlID0gU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeS5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRJbnN0YW5jZShnZXRQYXJzZXIoKS5uZXdJbnN0YW5jZSgpKTsKLQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgbmV3SW5zdGFuY2UpLnNldFJlUGFyc2VyKGdldFJlUGFyc2VyKCkubmV3SW5zdGFuY2UoKSk7Ci0JCWlmIChnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyKSB7Ci0JCQluZXdJbnN0YW5jZS5zZXREb2N1bWVudFBhcnRpdGlvbmVyKCgoU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcikgZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKS5uZXdJbnN0YW5jZSgpKTsKLQkJCW5ld0luc3RhbmNlLmdldERvY3VtZW50UGFydGl0aW9uZXIoKS5jb25uZWN0KG5ld0luc3RhbmNlKTsKLQkJfQotCQluZXdJbnN0YW5jZS5zZXRMaW5lRGVsaW1pdGVyKGdldExpbmVEZWxpbWl0ZXIoKSk7Ci0JCWlmIChnZXRFbmNvZGluZ01lbWVudG8oKSAhPSBudWxsKSB7Ci0JCQluZXdJbnN0YW5jZS5zZXRFbmNvZGluZ01lbWVudG8oKEVuY29kaW5nTWVtZW50bykgZ2V0RW5jb2RpbmdNZW1lbnRvKCkuY2xvbmUoKSk7Ci0JCX0KLQkJcmV0dXJuIG5ld0luc3RhbmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSVJlZ2lvbkNvbXBhcmlibGUjcmVnaW9uTWF0Y2hlcyhpbnQsCi0JICogICAgICBpbnQsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCUlUZXh0U3RvcmUgc3RvcmUgPSBnZXRTdG9yZSgpOwotCQlpZiAoc3RvcmUgaW5zdGFuY2VvZiBJUmVnaW9uQ29tcGFyaWJsZSkgewotCQkJcmVzdWx0ID0gKChJUmVnaW9uQ29tcGFyaWJsZSkgc3RvcmUpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBnZXQob2Zmc2V0LCBsZW5ndGgpLmVxdWFscyhzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlJVGV4dFN0b3JlIHN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHN0b3JlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIHN0b3JlKS5yZWdpb25NYXRjaGVzSWdub3JlQ2FzZShvZmZzZXQsIGxlbmd0aCwgc3RyaW5nVG9Db21wYXJlKTsKLQkJfQotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldChvZmZzZXQsIGxlbmd0aCkuZXF1YWxzSWdub3JlQ2FzZShzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbiNyZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbi5JUmVwbGFjZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpc3RlclBvc3ROb3RpZmljYXRpb25SZXBsYWNlKElEb2N1bWVudExpc3RlbmVyIG93bmVyLCBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgcmVwbGFjZSkgewotCQlpZiAoZkFjY2VwdFBvc3ROb3RpZmljYXRpb25SZXBsYWNlcykgewotCQkJaWYgKGZQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcyA9PSBudWxsKQotCQkJCWZQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQlmUG9zdE5vdGlmaWNhdGlvbkNoYW5nZXMuYWRkKG5ldyBSZWdpc3RlcmVkUmVwbGFjZShvd25lciwgcmVwbGFjZSkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZUxvY2soKSB7Ci0JCS8vIGRvIG5vdGhpbmcgaGVyZSBpbiBzdXBlciBjbGFzcwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVyKElNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZUxpc3RlbmVycywgbGlzdGVuZXIpKSB7Ci0JCQkJCWludCBvbGRTaXplID0gZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCQlPYmplY3RbXSBuZXdMaXN0ZW5lcnMgPSBuZXcgT2JqZWN0W25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXJzW2ldOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlCi0JCQkJCS8vIG9sZAotCQkJCQkvLyBvbmUKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlTW9kZWxDaGFuZ2VkTGlzdGVuZXIgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgbGlzdGVuZXJzLCB3ZSdsbCBpZ25vcmUgdGhlIHJlcXVlc3QKLQkJCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQkJaW50IG9sZFNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnNbaV0gPT0gbGlzdGVuZXIpIHsgLy8gaWdub3JlCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBjb3B5IG9sZCB0byBuZXcgaWYgaXRzIG5vdCB0aGUgb25lIHdlIGFyZQotCQkJCQkJCS8vIHJlbW92aW5nCi0JCQkJCQkJbmV3TGlzdGVuZXJzW2luZGV4KytdID0gZlN0cnVjdHVyZWREb2N1bWVudENoYW5nZWRMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmU3RydWN0dXJlZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCU9iamVjdFtdIG5ld0xpc3RlbmVycyA9IG5ldyBPYmplY3RbbmV3U2l6ZV07Ci0JCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudENoYW5naW5nTGlzdGVuZXJzW2ldID09IGxpc3RlbmVyKSB7IC8vIGlnbm9yZQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gY29weSBvbGQgdG8gbmV3IGlmIGl0cyBub3QgdGhlIG9uZSB3ZSBhcmUKLQkJCQkJCQkvLyByZW1vdmluZwotCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVyc1tpXTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncyBzd2l0Y2ggaXQgZm9yIHRoZQotCQkJCQkvLyBvbGQKLQkJCQkJLy8gb25lCi0JCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2luZ0xpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCWlmICgoZkRvY3VtZW50TGlzdGVuZXJzICE9IG51bGwpICYmIChsaXN0ZW5lciAhPSBudWxsKSkgewotCQkJCS8vIGlmIGl0cyBub3QgaW4gdGhlIGxpc3RlbmVycywgd2UnbGwgaWdub3JlIHRoZSByZXF1ZXN0Ci0JCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmRG9jdW1lbnRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCQlpbnQgb2xkU2l6ZSA9IGZEb2N1bWVudExpc3RlbmVycy5sZW5ndGg7Ci0JCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJCUlEb2N1bWVudExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElEb2N1bWVudExpc3RlbmVyW25ld1NpemVdOwotCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQkJaWYgKGZEb2N1bWVudExpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlCi0JCQkJCQkJLy8gcmVtb3ZpbmcKLQkJCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmRG9jdW1lbnRMaXN0ZW5lcnNbaV07Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUKLQkJCQkJLy8gb2xkCi0JCQkJCS8vIG9uZQotCQkJCQlmRG9jdW1lbnRMaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I3JlbW92ZURvY3VtZW50UGFydGl0aW9uaW5nTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyKElEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0KLQkJCUFzc2VydC5pc05vdE51bGwobGlzdGVuZXIpOwotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycyAhPSBudWxsKQotCQkJCWZEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gPGNvZGU+UG9zaXRpb248L2NvZGU+IGZyb20gdGhlIGRvY3VtZW50J3MgZGVmYXVsdAotCSAqIHBvc2l0aW9uIGNhdGVnb3J5LiBUaGUgZGVmYXVsdCBwb3NpdGlvbiBjYXRlZ29yeSBpcyB0byBiZSBkZWZpbmVkIGJ5Ci0JICogdGhlIGltcGxlbWVudGVycy4gSWYgdGhlIHBvc2l0aW9uIGlzIG5vdCBwYXJ0IG9mIHRoZSBkb2N1bWVudCdzIGRlZmF1bHQKLQkgKiBjYXRlZ29yeSBub3RoaW5nIGhhcHBlbnMuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb24oUG9zaXRpb24gcG9zaXRpb24pIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3JlbW92ZVBvc2l0aW9uCi0JICogQGV4Y2VwdGlvbiBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgdGhlIGNhdGVnb3J5IGlzIG5vdCBkZWZpbmVkIGZvciB0aGUgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCWdldFBvc2l0aW9uTWFuYWdlcigpLnJlbW92ZVBvc2l0aW9uKGNhdGVnb3J5LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25DYXRlZ29yeQotCSAqIEBleGNlcHRpb24gQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHRoZSBjYXRlZ29yeSBpcyBub3QgZGVmaW5lZCBmb3IgdGhlIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJZ2V0UG9zaXRpb25NYW5hZ2VyKCkucmVtb3ZlUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25VcGRhdGVyCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlnZXRQb3NpdGlvbk1hbmFnZXIoKS5yZW1vdmVQb3NpdGlvblVwZGF0ZXIodXBkYXRlcik7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZG9jdW1lbnQgbGlzdGVuZXIgZnJvbSB0ZWggZG9jdW1lbnQncyBsaXN0IG9mCi0JICogcHJlbm90aWZpZWQgZG9jdW1lbnQgbGlzdGVuZXJzLiBJZiB0aGUgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aAotCSAqIHRoZSBkb2N1bWVudCBub3RoaW5nIGhhcHBlbnMuCi0JICogPHA+Ci0JICogCi0JICogVGhpcyBtZXRob2QgaXMgbm90IGZvciBwdWJsaWMgdXNlLCBpdCBtYXkgb25seSBiZSBjYWxsZWQgYnkKLQkgKiBpbXBsZW1lbnRlcnMgb2YgPGNvZGU+SURvY3VtZW50QWRhcHRlcjwvY29kZT4gYW5kIG9ubHkgaWYgdGhvc2UKLQkgKiBpbXBsZW1lbnRlcnMgbmVlZCB0byBpbXBsZW1lbnQgPGNvZGU+SURvY3VtZW50TGlzdGVuZXI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0ZW5lciB0byBiZSByZW1vdmVkCi0JICogCi0JICogQHNlZSAjYWRkUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQlzeW5jaHJvbml6ZWQgKGxpc3RlbmVyTG9jaykgewotCi0JCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLCBkb2N1bWVudEFkYXB0ZXIpKSB7Ci0JCQkJaW50IHByZXZpb3VzU2l6ZSA9IGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpZiAocHJldmlvdXNTaXplID4gMSkgewotCQkJCQlJRG9jdW1lbnRMaXN0ZW5lcltdIGxpc3RlbmVycyA9IG5ldyBJRG9jdW1lbnRMaXN0ZW5lcltwcmV2aW91c1NpemUgLSAxXTsKLQkJCQkJaW50IHByZXZpb3VzSW5kZXggPSAwOwotCQkJCQlpbnQgbmV3SW5kZXggPSAwOwotCQkJCQl3aGlsZSAocHJldmlvdXNJbmRleCA8IHByZXZpb3VzU2l6ZSkgewotCQkJCQkJaWYgKGZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzW3ByZXZpb3VzSW5kZXhdICE9IGRvY3VtZW50QWRhcHRlcikKLQkJCQkJCQlsaXN0ZW5lcnNbbmV3SW5kZXgrK10gPSBmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyc1twcmV2aW91c0luZGV4XTsKLQkJCQkJCXByZXZpb3VzSW5kZXgrKzsKLQkJCQkJfQotCQkJCQlmUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVycyA9IGxpc3RlbmVyczsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWZQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXJzID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBmb3IgSU5URVJOQUwgVVNFIE9OTFkgYW5kIGlzIE5PVCBBUEkuCi0JICogCi0JICogUmVidWlsZHMgdGhlIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjaGFpbiBmcm9tIHRoZSBleGlzdGluZyB0ZXh0LgotCSAqIEZpbGVCdWZmZXIgc3VwcG9ydCBkb2VzIG5vdCBhbGxvdyBjbGllbnRzIHRvIGtub3cgdGhlIGRvY3VtZW50J3MKLQkgKiBsb2NhdGlvbiBiZWZvcmUgdGhlIHRleHQgY29udGVudHMgYXJlIHNldC4KLQkgKiAKLQkgKiBAc2VlIHNldChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwYXJzZShPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQljbGVhclJlYWRPbmx5KCk7Ci0KLQkJYWNxdWlyZUxvY2soKTsKLQkJdHJ5IHsKLQkJCUNoYXJTZXF1ZW5jZVJlYWRlciBzdWJTZXRUZXh0U3RvcmVSZWFkZXIgPSBuZXcgQ2hhclNlcXVlbmNlUmVhZGVyKChDaGFyU2VxdWVuY2UpIGdldFN0b3JlKCksIDAsIGdldFN0b3JlKCkuZ2V0TGVuZ3RoKCkpOwotCQkJcmVzZXRQYXJzZXIoc3ViU2V0VGV4dFN0b3JlUmVhZGVyLCAwKTsKLQkJCS8vCi0JCQlzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihnZXRQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKSk7Ci0JCQkvLyB3aGVuIHN0YXJ0aW5nIGFmcmVzaCwgb3VyIGNhY2hlZE5vZGUgc2hvdWxkIGJlIG91ciBmaXJzdE5vZGUsCi0JCQkvLyBzbyBiZSBzdXJlIHRvIGluaXRpYWxpemUgdGhlIGZpcnN0Tm9kZSBhbmQgbGFzdE5vZGUKLQkJCWluaXRpYWxpemVGaXJzdEFuZExhc3REb2N1bWVudFJlZ2lvbigpOwotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0UGFyZW50RG9jdW1lbnQoZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcyk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlyZWxlYXNlTG9jaygpOwotCQl9Ci0KLQkJcmVzdW1lUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNyZXBsYWNlCi0JICogQGV4Y2VwdGlvbiBCYWRMb2NhdGlvbkV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElmIHBvc2l0aW9uIGlzIG5vdCBhIHZhbGlkIHJhbmdlIGluIHRoZSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IHBvcywgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZykgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJOb3RlOiBJU3RydWN0dXJlZERvY3VtZW50OjpyZXBsYWNlKGludCwgaW50LCBTdHJpbmcpIC4uLi4gaXRzIGJldHRlciB0byB1c2UgcmVwbGFjZVRleHQoc291cmNlLCBzdHJpbmcsIGludCwgaW50KSBBUEkgZm9yIHN0cnVjdHVyZWREb2N1bWVudCB1cGRhdGVzIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXBsYWNlVGV4dCh0aGlzLCBwb3MsIGxlbmd0aCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIHRoZSB0ZXh0IHdpdGggIm5ld1RleHQiIHN0YXJ0aW5nIGF0IHBvc2l0aW9uICJzdGFydCIgZm9yIGEKLQkgKiBsZW5ndGggb2YgInJlcGxhY2VMZW5ndGgiLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIHRleHQgdG8gcmVwbGFjZSBOb25lIG9mIHRoZSBvZmZzZXRzIGluY2x1ZGUKLQkgKiAgICAgICAgICAgIGRlbGltaXRlcnMgb2YgcHJlY2VlZGluZyBsaW5lcy4gT2Zmc2V0IDAgaXMgdGhlIGZpcnN0Ci0JICogICAgICAgICAgICBjaGFyYWN0ZXIgb2YgdGhlIGRvY3VtZW50LgotCSAqIEBwYXJhbSByZXBsYWNlTGVuZ3RoCi0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlCi0JICogQHBhcmFtIG5ld1RleHQKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UKLQkgKiAgICAgICAgICAgIDxwPgotCSAqICAgICAgICAgICAgSW1wbGVtZW50b3JzIGhhdmUgdG8gbm90aWZ5IFRleHRDaGFuZ2VkIGxpc3RlbmVycyBhZnRlciB0aGUKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgaGFzIGJlZW4gdXBkYXRlZC4gVGhlIFRleHRDaGFuZ2VkRXZlbnQgc2hvdWxkIGJlIHNldAotCSAqICAgICAgICAgICAgYXMgZm9sbG93czoKLQkgKiAKLQkgKiBldmVudC50eXBlID0gU1dULlRleHRSZXBsYWNlZCBldmVudC5zdGFydCA9IHN0YXJ0IG9mIHRoZSByZXBsYWNlZCB0ZXh0Ci0JICogZXZlbnQubnVtUmVwbGFjZWRMaW5lcyA9IG51bWJlciBvZiByZXBsYWNlZCBsaW5lcyBldmVudC5udW1OZXdMaW5lcyA9Ci0JICogbnVtYmVyIG9mIG5ldyBsaW5lcyBldmVudC5yZXBsYWNlZExlbmd0aCA9IGxlbmd0aCBvZiB0aGUgcmVwbGFjZWQgdGV4dAotCSAqIGV2ZW50Lm5ld0xlbmd0aCA9IGxlbmd0aCBvZiB0aGUgbmV3IHRleHQKLQkgKiAKLQkgKiBOT1RFOiBudW1OZXdMaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGluc2VydGVkIGxpbmVzIGFuZCBudW1SZXBsYWNlZExpbmVzCi0JICogaXMgdGhlIG51bWJlciBvZiBkZWxldGVkIGxpbmVzIGJhc2VkIG9uIHRoZSBjaGFuZ2UgdGhhdCBvY2N1cnMKLQkgKiB2aXN1YWxseS4gRm9yIGV4YW1wbGU6Ci0JICogCi0JICogcmVwbGFjZWRUZXh0IG5ld1RleHQgbnVtUmVwbGFjZWRMaW5lcyBudW1OZXdMaW5lcyAiIiAiXG4iIDAgMSAiXG5cbiIKLQkgKiAiYSIgMiAwICJhIiAiXG5cbiIgMCAyCi0JICovCi0JLyoqCi0JICogT25lIG9mIHRoZSBBUElzIHRvIG1hbmlwdWxhdGUgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW4gdGVybXMgb2YgdGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVwbGFjZVRleHQoT2JqZWN0IHJlcXVlc3RlciwgaW50IHN0YXJ0LCBpbnQgcmVwbGFjZW1lbnRMZW5ndGgsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCXJldHVybiByZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgZmFsc2UpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCByZXBsYWNlbWVudExlbmd0aCwgU3RyaW5nIGNoYW5nZXMsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlyZXR1cm4gaW50ZXJuYWxSZXBsYWNlVGV4dChyZXF1ZXN0ZXIsIHN0YXJ0LCByZXBsYWNlbWVudExlbmd0aCwgY2hhbmdlcywgaWdub3JlUmVhZE9ubHlTZXR0aW5ncyk7Ci0JfQotCi0Jdm9pZCByZXNldFBhcnNlcihpbnQgc3RhcnRPZmZzZXQsIGludCBlbmRPZmZzZXQpIHsKLQotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCUlUZXh0U3RvcmUgdGV4dFN0b3JlID0gZ2V0U3RvcmUoKTsKLQkJaWYgKHRleHRTdG9yZSBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewotCQkJQ2hhclNlcXVlbmNlUmVhZGVyIHN1YlNldFRleHRTdG9yZVJlYWRlciA9IG5ldyBDaGFyU2VxdWVuY2VSZWFkZXIoKENoYXJTZXF1ZW5jZSkgdGV4dFN0b3JlLCBzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJcGFyc2VyLnJlc2V0KHN1YlNldFRleHRTdG9yZVJlYWRlciwgc3RhcnRPZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJU3RyaW5nIG5ld05vZGVUZXh0ID0gZ2V0KHN0YXJ0T2Zmc2V0LCBlbmRPZmZzZXQgLSBzdGFydE9mZnNldCk7Ci0JCQlwYXJzZXIucmVzZXQobmV3Tm9kZVRleHQsIHN0YXJ0T2Zmc2V0KTsKLQotCQl9Ci0KLQl9Ci0KLQl2b2lkIHJlc2V0UGFyc2VyKFJlYWRlciByZWFkZXIsIGludCBzdGFydE9mZnNldCkgewotCQlSZWdpb25QYXJzZXIgcGFyc2VyID0gZ2V0UGFyc2VyKCk7Ci0JCXBhcnNlci5yZXNldChyZWFkZXIsIHN0YXJ0T2Zmc2V0KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJLS1mU3RvcHBlZENvdW50OwotCQlpZiAoZlN0b3BwZWRDb3VudCA9PSAwICYmIGZSZWVudHJhbmNlQ291bnQgPT0gMCkKLQkJCWV4ZWN1dGVQb3N0Tm90aWZpY2F0aW9uQ2hhbmdlcygpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGluIHN1cGVyY2xhc3MgaW4gMy4wIC0gdXNlIGEgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIKLQkgKiAgICAgICAgICAgICBkaXJlY3RseQotCSAqIEBzZWUgSURvY3VtZW50I3NlYXJjaAotCSAqLwotCXB1YmxpYyBpbnQgc2VhcmNoKGludCBzdGFydFBvc2l0aW9uLCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQkvLyAoZG13KSBJIGFkZGVkIHRoaXMgd2FybmluZywgdG8ga25vdyBpZiBzdGlsbCBiZWluZyB1c2VkLiBJJ20gbm90Ci0JCS8vIHN1cmUgaXQKLQkJLy8gd29ya3MgYXMgZXhwZWN0ZWQgYW55IGxvbmdlci4KLQkJLy8gYnV0IHRoZSB3YXJuaW5nIHNob3VsZCBiZSByZW1vdmVkLCBvbmNlIGtub3cuCi0JCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJXQVJOSU5HOiB1c2luZyB1bnN1cHBvcnRlZCBkZXByZWNhdGVkIG1ldGhvZCAnc2VhcmNoJyIpOyAvLyROT04tTkxTLTEkCi0JCWludCBvZmZzZXQgPSAtMTsKLQkJSVJlZ2lvbiBtYXRjaCA9IG5ldyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcih0aGlzKS5maW5kKHN0YXJ0UG9zaXRpb24sIGZpbmRTdHJpbmcsIGZvcndhcmRTZWFyY2gsIGNhc2VTZW5zaXRpdmUsIHdob2xlV29yZCwgZmFsc2UpOwotCQlpZiAobWF0Y2ggIT0gbnVsbCkgewotCQkJb2Zmc2V0ID0gbWF0Y2guZ2V0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIG9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElEb2N1bWVudCNzZXRUZXh0Ci0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyBzdHJpbmcpIHsKLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk5vdGU6IElTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnNldFRleHQoU3RyaW5nKSAuLi4uIGl0cyBiZXR0ZXIgdG8gdXNlIHNldFRleHQoc291cmNlLCBzdHJpbmcpIEFQSSBmb3Igc3RydWN0dXJlZERvY3VtZW50IHVwZGF0ZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXNldFRleHQobnVsbCwgc3RyaW5nKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1heSBiZSBtYXJrZWQgcHVibGljLCBidXQgc2hvdWxkIGJlIHBhY2thZ2VkIHByb3RlY3RlZCwgb25jZQotCSAqIHJlZmFjdG9yaW5nIGlzIGNvbXBsZXRlIChpbiBvdGhlciB3b3Jkcywgbm90IGZvciBjbGllbnQgdXNlKS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYWNoZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWRSZWdpb24pIHsKLQkJaWYgKFVTRV9MT0NBTF9USFJFQUQpIHsKLQkJCWZDdXJyZW50RG9jdW1uZXRSZWdpb25DYWNoZS5zZXQoc3RydWN0dXJlZFJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljYWNoZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWRSZWdpb247Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgSURvY3VtZW50UGFydGl0aW9uZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXNldERvY3VtZW50UGFydGl0aW9uZXIoSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORywgcGFydGl0aW9uZXIpOwotCX0KLQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25lcihTdHJpbmcgcGFydGl0aW9uaW5nLCBJRG9jdW1lbnRQYXJ0aXRpb25lciBwYXJ0aXRpb25lcikgewotCQlpZiAocGFydGl0aW9uZXIgPT0gbnVsbCkgewotCQkJaWYgKGZEb2N1bWVudFBhcnRpdGlvbmVycyAhPSBudWxsKSB7Ci0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzLnJlbW92ZShwYXJ0aXRpb25pbmcpOwotCQkJCWlmIChmRG9jdW1lbnRQYXJ0aXRpb25lcnMuc2l6ZSgpID09IDApCi0JCQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycyA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZkRvY3VtZW50UGFydGl0aW9uZXJzID09IG51bGwpCi0JCQkJZkRvY3VtZW50UGFydGl0aW9uZXJzID0gbmV3IEhhc2hNYXAoKTsKLQkJCWZEb2N1bWVudFBhcnRpdGlvbmVycy5wdXQocGFydGl0aW9uaW5nLCBwYXJ0aXRpb25lcik7Ci0JCX0KLQkJRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQgZXZlbnQgPSBuZXcgRG9jdW1lbnRQYXJ0aXRpb25pbmdDaGFuZ2VkRXZlbnQodGhpcyk7Ci0JCWV2ZW50LnNldFBhcnRpdGlvbkNoYW5nZShwYXJ0aXRpb25pbmcsIDAsIGdldExlbmd0aCgpKTsKLQkJZmlyZURvY3VtZW50UGFydGl0aW9uaW5nQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5jb2RpbmdNZW1lbnRvKEVuY29kaW5nTWVtZW50byBlbmNvZGluZ01lbWVudG8pIHsKLQkJdGhpcy5lbmNvZGluZ01lbWVudG8gPSBlbmNvZGluZ01lbWVudG87Ci0JfQotCi0Jdm9pZCBzZXRGaXJzdERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWZpcnN0RG9jdW1lbnRSZWdpb24gPSByZWdpb247Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNzZXRJbml0aWFsTGluZURlbGltaXRlcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluaXRpYWxMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJLy8gbWFrZSBzdXJlIG91ciBwcmVmZXJyZWQgZGVsaW1pdGVyIGlzCi0JCS8vIG9uZSBvZiB0aGUgbGVnYWwgb25lcwotCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zU3RyaW5nKGdldExlZ2FsTGluZURlbGltaXRlcnMoKSwgZGVsaW1pdGVyKSkgewotCQkJcHJlZmVyZWREZWxpbWl0ZXIgPSBkZWxpbWl0ZXI7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoTG9nZ2VyLkRFQlVHX0RPQ1VNRU5UKQotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sICJBdHRlbXB0IHRvIHNldCBsaW5lZGVsaW1pdGVyIHRvIG5vbi1sZWdhbCBkZWxpbWl0ZXIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlwcmVmZXJlZERlbGltaXRlciA9IFBsYXRmb3JtTGluZURlbGltaXRlcjsKLQkJfQotCX0KLQotCXZvaWQgc2V0TGFzdERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWxhc3REb2N1bWVudFJlZ2lvbiA9IHJlZ2lvbjsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNzZXRMaW5lRGVsaW1pdGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0TGluZURlbGltaXRlcihTdHJpbmcgZGVsaW1pdGVyKSB7Ci0JCXNldEluaXRpYWxMaW5lRGVsaW1pdGVyKGRlbGltaXRlcik7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZG9jdW1lbnQncyBsaW5lIHRyYWNrZXIuIE11c3QgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YKLQkgKiB0aGUgY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHRyYWNrZXIKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCdzIGxpbmUgdHJhY2tlcgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRMaW5lVHJhY2tlcihJTGluZVRyYWNrZXIgdHJhY2tlcikgewotCQlmVHJhY2tlciA9IHRyYWNrZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyc2VyKFJlZ2lvblBhcnNlciBuZXdQYXJzZXIpIHsKLQkJaW50ZXJuYWxfc2V0UGFyc2VyKG5ld1BhcnNlcik7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBvc2l0aW9uTWFuYWdlcgotCSAqICAgICAgICAgICAgVGhlIHBvc2l0aW9uTWFuYWdlciB0byBzZXQuCi0JICovCi0JLy8gVE9ETzogbWFrZSBwcml2YXRlIGlzIG5lZWRlZCwgZWxzZSByZW1vdmUKLQl2b2lkIHNldFBvc2l0aW9uTWFuYWdlcihHZW5lcmljUG9zaXRpb25NYW5hZ2VyIHBvc2l0aW9uTWFuYWdlcikgewotCQlmUG9zaXRpb25NYW5hZ2VyID0gcG9zaXRpb25NYW5hZ2VyOwotCX0KLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlUGFyc2VyKElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld1JlUGFyc2VyKSB7Ci0JCWZSZVBhcnNlciA9IG5ld1JlUGFyc2VyOwotCQlpZiAoZlJlUGFyc2VyICE9IG51bGwpIHsKLQkJCWZSZVBhcnNlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnQodGhpcyk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBPbmUgb2YgdGhlIEFQSXMgdG8gbWFuaXB1bGF0ZSB0aGUgSVN0cnVjdHVyZWREb2N1bWVudCBpbiB0ZXJtcyBvZiB0ZXh0LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBzZXRUZXh0KE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyB0aGVTdHJpbmcpIHsKLQotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCXJlc3VsdCA9IHJlcGxhY2VUZXh0KHJlcXVlc3RlciwgMCwgZ2V0TGVuZ3RoKCksIHRoZVN0cmluZywgdHJ1ZSk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBkb2N1bWVudCdzIHRleHQgc3RvcmUuIE11c3QgYmUgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0JICogY29uc3RydWN0b3IuCi0JICogCi0JICogQHBhcmFtIHN0b3JlCi0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQncyB0ZXh0IHN0b3JlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFRleHRTdG9yZShJVGV4dFN0b3JlIHN0b3JlKSB7Ci0JCWZTdG9yZSA9IHN0b3JlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFVuZG9NYW5hZ2VyKElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyKSB7Ci0KLQkJLy8gaWYgdGhlIHVuZG8gbWFuYWdlciBoYXMgYWxyZWFkeSBiZWVuIHNldCwgdGhlbgotCQkvLyBmYWlsIGZhc3QsIHNpbmNlIGNoYW5naW5nIHRoZSB1bmRvIG1hbmFnZXIgd2lsbCBsZWFkCi0JCS8vIHRvIHVudXN1YWwgcmVzdWx0cyAob3IgYXQgbGVhc3QgbG9zcyBvZiB1bmRvIHN0YWNrKS4KLQkJaWYgKGZVbmRvTWFuYWdlciAhPSBudWxsICYmIGZVbmRvTWFuYWdlciAhPSB1bmRvTWFuYWdlcikgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FuIG5vdCBjaGFuZ2UgdW5kbyBtYW5hZ2VyIG9uY2UgaXRzIGJlZW4gc2V0Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllbHNlIHsKLQkJCWZVbmRvTWFuYWdlciA9IHVuZG9NYW5hZ2VyOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4gbm9ybWFsaXplZCkgewotCQlJVGV4dFN0b3JlIHN0b3JlID0gbmV3IFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlKGdldFN0b3JlKCkpOwotCQlzZXRUZXh0U3RvcmUoc3RvcmUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCSsrZlN0b3BwZWRDb3VudDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpIHsKLQkJaWYgKGdldFN0b3JlKCkgaW5zdGFuY2VvZiBTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZSkgewotCQkJU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUgc3J3cyA9IChTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZSkgZ2V0U3RvcmUoKTsKLQkJCUlUZXh0U3RvcmUgc291cmNlID0gc3J3cy5nZXRTb3VyY2VTdG9yZSgpOwotCQkJc2V0VGV4dFN0b3JlKHNvdXJjZSk7Ci0JCQlzcndzLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBhcmcwLCBpbnQgYXJnMSkgewotCQlyZXR1cm4gZ2V0KGFyZzAsIGFyZzEpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlRGVsZXRlZEZpZWxkcyhTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gZXZlbnQuZ2V0T2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlZ2lvbnMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBvbGRSZWdpb25zLml0ZW0oaSk7Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uc2V0RGVsZXRlZCh0cnVlKTsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIGJ5IHJlLXBhcnNlci4gTm90ZTogdGhpcyBtZXRob2QgbWF5IGJlICJwdWJsaWMiIGJ1dCBzaG91bGQgb25seQotCSAqIGJlIGNhbGxlZCBieSByZS1wYXJzZXJzIGluIHRoZSByaWdodCBjaXJjdW1zdGFuY2VzLgotCSAqLwotCXB1YmxpYyB2b2lkIHVwZGF0ZURvY3VtZW50RGF0YShpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCXN0b3BQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpOwotCQlnZXRTdG9yZSgpLnJlcGxhY2Uoc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcyk7Ci0JCXRyeSB7Ci0JCQlnZXRUcmFja2VyKCkucmVwbGFjZShzdGFydCwgbGVuZ3RoVG9SZXBsYWNlLCBjaGFuZ2VzKTsKLQkJfQotCi0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBzaG91bGQgYmUgaW1wb3NzaWJsZSBoZXJlLCBidXQgd2lsbCBsb2cgZm9yIG5vdwotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlpZiAoZlBvc2l0aW9uTWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmUG9zaXRpb25NYW5hZ2VyLnVwZGF0ZVBvc2l0aW9ucyhuZXcgRG9jdW1lbnRFdmVudCh0aGlzLCBzdGFydCwgbGVuZ3RoVG9SZXBsYWNlLCBjaGFuZ2VzKSk7Ci0JCX0KLQkJZk1vZGlmaWNhdGlvblN0YW1wKys7Ci0JCXJlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVNb2RlbChPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIHJlUGFyc2VyID0gZ2V0UmVQYXJzZXIoKTsKLQkJLy8gaW5pdGlhbGl6ZSB0aGUgSVN0cnVjdHVyZWRUZXh0UmVQYXJzZXIgd2l0aCB0aGUgc3RhbmRhcmQgZGF0YQotCQkvLyB0aGF0J3MKLQkJLy8gYWx3YXlzIG5lZWRlZAotCQlyZVBhcnNlci5pbml0aWFsaXplKHJlcXVlc3Rlciwgc3RhcnQsIGxlbmd0aFRvUmVwbGFjZSwgY2hhbmdlcyk7Ci0JCXJlc3VsdCA9IHJlUGFyc2VyLnJlcGFyc2UoKTsKLQkJLy8gaWYgcmVzdWx0IGlzIG51bGwgYXQgdGhpcyBwb2ludCwgdGhlbiB0aGVyZSBtdXN0IGJlIGFuIGVycm9yLCBzaW5jZQotCQkvLyBldmVuIGlmIHRoZXJlCi0JCS8vIHdhcyBubyBjaGFuZ2UgKGVpdGhlciBkaXNhbGxvdyBkdWUgdG8gcmVhZG9ubHksIG9yIGEgcGVyc29uIHBhc3RlZAotCQkvLyB0aGUgc2FtZSB0aGluZwotCQkvLyB0aGV5IGhhZCBzZWxlY3RlZCkgdGhlbiBhICJOb0NoYW5nZSIgZXZlbnQgc2hvdWxkIGhhdmUgYmVlbiBmaXJlZC4KLQkJQXNzZXJ0LmlzTm90TnVsbChyZXN1bHQsICJubyBzdHJ1Y3R1cmVkRG9jdW1lbnQgZXZlbnQgd2FzIGNyZWF0ZWQgaW4gSVN0cnVjdHVyZWREb2N1bWVudDo6dXBkYXRlU3RydWN0dXJlZERvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRW5jb2RlZERvY3VtZW50I2dldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZmVycmVkTGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMaW5lRGVsaW1pdGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudCNzZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZmVycmVkTGluZURlbGltaXRlcihTdHJpbmcgcHJvYmFibGVMaW5lRGVsaW1pdGVyKSB7Ci0JCXNldEluaXRpYWxMaW5lRGVsaW1pdGVyKHByb2JhYmxlTGluZURlbGltaXRlcik7Ci0KLQl9Ci0KLQotCS8qKgotCSAqIENsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIHJld3JpdGFibGUgc2Vzc2lvbiBmb3IgdGhlIFNTRS4KLQkgKiAKLQkgKi8KLQljbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBleHRlbmRzIERvY3VtZW50UmV3cml0ZVNlc3Npb24gewotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IHNlc3Npb24uCi0JCSAqIAotCQkgKiBAcGFyYW0gc2Vzc2lvblR5cGUKLQkJICogICAgICAgICAgICB0aGUgdHlwZSBvZiB0aGlzIHNlc3Npb24KLQkJICovCi0JCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSkgewotCQkJc3VwZXIoc2Vzc2lvblR5cGUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjc3RhcnRSZXdyaXRlU2Vzc2lvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlKQotCSAqLwotCXB1YmxpYyBEb2N1bWVudFJld3JpdGVTZXNzaW9uIHN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQkvLyBkZWxlZ2F0ZSB0byBzdWItY2xhc3MsIHNvIFVJIHRocmVhZGluZyBpcyBoYW5kbGVkIGNvcnJlY3RseQotCQlyZXR1cm4gaW50ZXJuYWxTdGFydFJld3JpdGVTZXNzaW9uKHNlc3Npb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QtQVBJLiBGaW5hbCBwcm90ZWN0ZWQgc28gY2xpZW50cyBtYXkgY2FsbCB0aGlzIG1ldGhvZCBpZiBuZWVkZWQsIGJ1dAotCSAqIGNhbm5vdCBvdmVycmlkZS4KLQkgKiAKLQkgKiBAcGFyYW0gc2Vzc2lvblR5cGUKLQkgKiBAcmV0dXJuCi0JICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUgc2Vzc2lvblR5cGUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotCQlpZiAoZ2V0QWN0aXZlUmV3cml0ZVNlc3Npb24oKSAhPSBudWxsKQotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwotCi0JCURvY3VtZW50UmV3cml0ZVNlc3Npb24gc2Vzc2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbihzZXNzaW9uVHlwZSk7Ci0JCURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCBldmVudCA9IG5ldyBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQodGhpcywgc2Vzc2lvbiwgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50LlNFU1NJT05fU1RBUlQpOwotCQlmaXJlRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50KGV2ZW50KTsKLQotCQlJTGluZVRyYWNrZXIgdHJhY2tlciA9IGdldFRyYWNrZXIoKTsKLQkJaWYgKHRyYWNrZXIgaW5zdGFuY2VvZiBJTGluZVRyYWNrZXJFeHRlbnNpb24pIHsKLQkJCUlMaW5lVHJhY2tlckV4dGVuc2lvbiBleHRlbnNpb24gPSAoSUxpbmVUcmFja2VyRXh0ZW5zaW9uKSB0cmFja2VyOwotCQkJZXh0ZW5zaW9uLnN0YXJ0UmV3cml0ZVNlc3Npb24oc2Vzc2lvbik7Ci0JCX0KLQotCQlpZiAoRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuU0VRVUVOVElBTCA9PSBzZXNzaW9uVHlwZSkKLQkJCXN0YXJ0U2VxdWVudGlhbFJld3JpdGUoZmFsc2UpOwotCQllbHNlIGlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TVFJJQ1RMWV9TRVFVRU5USUFMID09IHNlc3Npb25UeXBlKQotCQkJc3RhcnRTZXF1ZW50aWFsUmV3cml0ZSh0cnVlKTsKLQotCQlmQWN0aXZlUmV3cml0ZVNlc3Npb24gPSBzZXNzaW9uOwotCQlyZXR1cm4gc2Vzc2lvbjsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJLy8gZGVsZWdhdGUgdG8gc3ViLWNsYXNzLCBzbyBVSSB0aHJlYWRpbmcgaXMgaGFuZGxlZCBjb3JyZWN0bHkKLQkJaW50ZXJuYWxTdG9wUmV3cml0ZVNlc3Npb24oc2Vzc2lvbik7Ci0JfQotCi0JLyoqCi0JICogTk9ULUFQSS4gRmluYWwgcHJvdGVjdGVkIHNvIGNsaWVudHMgbWF5IGNhbGwgdGhpcyBtZXRob2QgaWYgbmVlZGVkLCBidXQKLQkgKiBjYW5ub3Qgb3ZlcnJpZGUuCi0JICogCi0JICogQHBhcmFtIHNlc3Npb24KLQkgKi8KLQlmaW5hbCBwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbFN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYgKGZBY3RpdmVSZXdyaXRlU2Vzc2lvbiA9PSBzZXNzaW9uKSB7Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBzZXNzaW9uVHlwZSA9IHNlc3Npb24uZ2V0U2Vzc2lvblR5cGUoKTsKLQkJCWlmIChEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZS5TRVFVRU5USUFMID09IHNlc3Npb25UeXBlIHx8IERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlNUUklDVExZX1NFUVVFTlRJQUwgPT0gc2Vzc2lvblR5cGUpCi0JCQkJc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCk7Ci0KLQkJCUlMaW5lVHJhY2tlciB0cmFja2VyID0gZ2V0VHJhY2tlcigpOwotCQkJaWYgKHRyYWNrZXIgaW5zdGFuY2VvZiBJTGluZVRyYWNrZXJFeHRlbnNpb24pIHsKLQkJCQlJTGluZVRyYWNrZXJFeHRlbnNpb24gZXh0ZW5zaW9uID0gKElMaW5lVHJhY2tlckV4dGVuc2lvbikgdHJhY2tlcjsKLQkJCQlleHRlbnNpb24uc3RvcFJld3JpdGVTZXNzaW9uKHNlc3Npb24sIGdldCgpKTsKLQkJCX0KLQotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkV2ZW50IGV2ZW50ID0gbmV3IERvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudCh0aGlzLCBzZXNzaW9uLCBEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQuU0VTU0lPTl9TVE9QKTsKLQkJCWZpcmVEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQoZXZlbnQpOwotCQkJZkFjdGl2ZVJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I2dldEFjdGl2ZVJld3JpdGVTZXNzaW9uKCkKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBnZXRBY3RpdmVSZXdyaXRlU2Vzc2lvbigpIHsKLQkJcmV0dXJuIGZBY3RpdmVSZXdyaXRlU2Vzc2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNhZGREb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXN5bmNocm9uaXplZCAobGlzdGVuZXJMb2NrKSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGxpc3RlbmVyKTsKLQkJCWlmIChmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkJZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KDEpOwotCQkJfQotCQkJaWYgKCFmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycy5jb250YWlucyhsaXN0ZW5lcikpCi0JCQkJZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I3JlbW92ZURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVyKElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJc3luY2hyb25pemVkIChsaXN0ZW5lckxvY2spIHsKLQotCQkJQXNzZXJ0LmlzTm90TnVsbChsaXN0ZW5lcik7Ci0JCQlpZiAoZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMgIT0gbnVsbCkKLQkJCQlmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQjcmVwbGFjZShpbnQsIGludCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCwgbG9uZyBtb2RpZmljYXRpb25TdGFtcCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJcmVwbGFjZVRleHQodGhpcywgb2Zmc2V0LCBsZW5ndGgsIHRleHQpOwotCQlmTW9kaWZpY2F0aW9uU3RhbXAgPSBtb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uNCNzZXQoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFN0cmluZyB0ZXh0LCBsb25nIG1vZGlmaWNhdGlvblN0YW1wKSB7Ci0JCS8vIGJ1ZyAxNTEwNjkgLSBvdmVyd3JpdGUgcmVhZCBvbmx5IHJlZ2lvbnMgd2hlbiBzZXR0aW5nIGVudGlyZSBkb2N1bWVudAotCQkgcmVwbGFjZVRleHQobnVsbCwgMCwgZ2V0TGVuZ3RoKCksIHRleHQsIHRydWUpOwotCi0JCWZNb2RpZmljYXRpb25TdGFtcCA9IG1vZGlmaWNhdGlvblN0YW1wOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb240I2dldE1vZGlmaWNhdGlvblN0YW1wKCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRNb2RpZmljYXRpb25TdGFtcCgpIHsKLQkJcmV0dXJuIGZNb2RpZmljYXRpb25TdGFtcDsKLQl9Ci0KLQkvKioKLQkgKiBGaXJlcyBhbiBldmVudCwgYXMgc3BlY2lmaWVkLCB0byB0aGUgYXNzb2NpYXRlZCBsaXN0ZW5lcnMuCi0JICogCi0JICogQHBhcmFtIGV2ZW50Ci0JICogICAgICAgICAgICBUaGUgZXZlbnQgdG8gZmlyZSwgZWl0aGVyIGEgc3RhcnQgb3Igc3RvcCBldmVudC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZmlyZURvY3VtZW50UmV3cml0ZVNlc3Npb25FdmVudChEb2N1bWVudFJld3JpdGVTZXNzaW9uRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXJzID09IG51bGwgfHwgZkRvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lcnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm47Ci0KLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdChmRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbkxpc3RlbmVycyk7Ci0JCUl0ZXJhdG9yIGUgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSURvY3VtZW50UmV3cml0ZVNlc3Npb25MaXN0ZW5lciBsID0gKElEb2N1bWVudFJld3JpdGVTZXNzaW9uTGlzdGVuZXIpIGUubmV4dCgpOwotCQkJbC5kb2N1bWVudFJld3JpdGVTZXNzaW9uQ2hhbmdlZChldmVudCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTU1OWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9CYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotCi0KLXB1YmxpYyBjbGFzcyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX1NUT1JFX05PVF9BU1NJR05FRCA9ICJ0ZXh0IHN0b3JlIG5vdCBhc3NpZ25lZCB5ZXQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVOREVGSU5FRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuc3RydWN0dXJlZERvY3VtZW50LlVOREVGSU5FRCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IF9yZWdpb25zOwotCXByaXZhdGUgYm9vbGVhbiBmSXNEZWxldGVkID0gZmFsc2U7Ci0JLy8gcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0JLyoqCi0JICogYWxsb3cgYSBwb2ludGVyIGJhY2sgdG8gdGhpcyBub2RlcyBtb2RlbAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmUGFyZW50RG9jdW1lbnQ7Ci0JLyoqCi0JICogd2FzIHRoaXMgbm9kZSB0ZXJtaW5hdGVkIG5vcm1hbGx5Ci0JICovCi0JLy8gMCA9PSBmYWxzZSwgMSA9PSB0cnVlCi0JcHJpdmF0ZSBieXRlIGhhc0VuZCA9IDA7Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0ID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgc3RhcnQ7Ci0KLQlwdWJsaWMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCV9yZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCi0JfQotCi0JLyoqCi0JICogRXZlbiBpbnNpZGUtdGhpcyBjbGFzcyB1c2VzIG9mICdyZWdpb25zJyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kLCBhcwotCSAqIHRoaXMgaXMgd2hlcmUgKHNvZnQpIG1lbW9yeSBtYW5hZ2VtZW50L3JlcGFyc2luZywgZXRjLiwgd2lsbCBiZQotCSAqIGNlbnRyYWxpemVkLgotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb25MaXN0IF9nZXRSZWdpb25zKCkgewotCi0JCXJldHVybiBfcmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQlfZ2V0UmVnaW9ucygpLmFkZChhUmVnaW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJc3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpIDw9IGkgJiYgaSA8IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlzdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIGdldEVuZCBhbmQgZ2V0RW5kT2Zmc2V0IGFyZSB0aGUgc2FtZSBvbmx5IGZvcgotCSAqIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JICovCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBzdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogZ2V0RW5kIGFuZCBnZXRFbmRPZmZzZXQgYXJlIHRoZSBzYW1lIG9ubHkgZm9yCi0JICogSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIF9nZXRSZWdpb25zKCkuZ2V0KDApOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJcmVzdWx0ID0gZ2V0UGFyZW50RG9jdW1lbnQoKS5nZXQoc3RhcnQsIGZMZW5ndGgpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl0cnkgewotCQkJaW50IHJlZ2lvblN0YXJ0ID0gYVJlZ2lvbi5nZXRTdGFydCgpOwotCQkJaW50IHJlZ2lvbkxlbmd0aCA9IGFSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlyZXN1bHQgPSBmUGFyZW50RG9jdW1lbnQuZ2V0KHN0YXJ0ICsgcmVnaW9uU3RhcnQsIHJlZ2lvbkxlbmd0aCk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCS8vIERNVzogbG9vcGluZyBpcyBmYXN0ZXIgdGhhbiBlbnVtZXJhdGlvbiwKLQkJLy8gc28gc3dpdGNoZWQgYXJvdW5kIDIvMTIvMDMKLQkJLy8gRW51bWVyYXRpb24gZSA9IGdldFJlZ2lvbnMoKS5lbGVtZW50cygpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBjb250ZXh0KQotCQkJCXJlc3VsdCArPSBnZXRGdWxsVGV4dChyZWdpb24pOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCWlmIChfZ2V0UmVnaW9ucygpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIF9nZXRSZWdpb25zKCkuZ2V0KF9nZXRSZWdpb25zKCkuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCXJldHVybiBuZXh0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQlyZXR1cm4gX2dldFJlZ2lvbnMoKS5zaXplKCk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0KLQkJcmV0dXJuIGZQYXJlbnREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRQcmV2aW91cygpIHsKLQkJcmV0dXJuIHByZXZpb3VzOwotCX0KLQotCS8qKgotCSAqIFRoZSBwYXJhbWV0ZXIgb2Zmc2V0IHJlZmVycyB0byB0aGUgb3ZlcmFsbCBvZmZzZXQgaW4gdGhlIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCUlUZXh0UmVnaW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChfZ2V0UmVnaW9ucygpICE9IG51bGwpIHsKLQkJCS8vIHRyYW5zZm9ybSB0aGUgcmVxdWVzdGVkIG9mZnNldCB0byB0aGUgInNjYWxlIiB0aGF0Ci0JCQkvLyByZWdpb25zIGFyZSBzdG9yZWQgaW4sIHdoaWNoIGFyZSBhbGwgcmVsYXRpdmUgdG8gdGhlCi0JCQkvLyBzdGFydCBwb2ludC4KLQkJCS8vIGludCB0cmFuc2Zvcm1lZE9mZnNldCA9IG9mZnNldCAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkvLwotCQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWdpb24ocykgaW4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjo6Z2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQ6ICIgKyByZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlcXVlc3RlZCBvZmZzZXQ6ICIgKyBvZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiIHRyYW5zZm9ybWVkT2Zmc2V0OiAiICsKLQkJCQkJLy8gdHJhbnNmb3JtZWRPZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBzdGFydDogIiArIHJlZ2lvbi5nZXRTdGFydCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gZW5kOiAiICsgcmVnaW9uLmdldEVuZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgICByZWdpb24gdHlwZTogIiArIHJlZ2lvbi5nZXRUeXBlKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBjbGFzczogIiArIHJlZ2lvbi5nZXRDbGFzcygpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJfQotCQkJCWlmICgoZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA8PSBvZmZzZXQpICYmIChvZmZzZXQgPCBnZXRFbmRPZmZzZXQocmVnaW9uKSkpIHsKLQkJCQkJcmVzdWx0ID0gcmVnaW9uOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXJldHVybiBfZ2V0UmVnaW9ucygpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0IGFuZCBnZXRTdGFydE9mZnNldCBhcmUgdGhlIHNhbWUgb25seSBmb3IKLQkgKiBJU3RydWN1dHJlZERvY3VtZW50UmVnaW9ucwotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBzdGFydDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydCBhbmQgZ2V0U3RhcnRPZmZzZXQgYXJlIHRoZSBzYW1lIG9ubHkgZm9yCi0JICogSVN0cnVjdXRyZWREb2N1bWVudFJlZ2lvbnMKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQkvLyBhc3NlcnQ6IGNvbnRhaW5lZFJlZ2lvbiBjYW4gbm90IGJlIG51bGwKLQkJLy8gKG1pZ2h0IGJlIHBlcmZvcm1hbmNlIGhpdCBpZiBsaXRlcmFsbHkgcHV0IGluIGFzc2VydCBjYWxsLAotCQkvLyBidXQgY29udGFpbmVkUmVnaW9uIGNhbiBub3QgYmUgbnVsbCkuIE5lZWRzIHRvIGJlIGNoZWNrZWQKLQkJLy8gYnkgY2FsbGluZyBjb2RlLgotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZlBhcmVudERvY3VtZW50ID09IG51bGwpIHsKLQkJCQkvLyBsaWtlbHkgdG8gaGFwcGVuIGR1cmluZyBpbnNwZWN0aW5nCi0JCQkJcmVzdWx0ID0gVEVYVF9TVE9SRV9OT1RfQVNTSUdORUQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBmUGFyZW50RG9jdW1lbnQuZ2V0KHN0YXJ0LCBmTGVuZ3RoKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCS8vIGFzc2VydDogYVJlZ2lvbiBjYW4gbm90IGJlIG51bGwKLQkJLy8gKG1pZ2h0IGJlIHBlcmZvcm1hbmNlIGhpdCBpZiBsaXRlcmFsbHkgcHV0IGluIGFzc2VydCBjYWxsLAotCQkvLyBidXQgYVJlZ2lvbiBjYW4gbm90IGJlIG51bGwpLiBOZWVkcyB0byBiZSBjaGVja2VkCi0JCS8vIGJ5IGNhbGxpbmcgY29kZS4KLQkJdHJ5IHsKLQkJCXJldHVybiBmUGFyZW50RG9jdW1lbnQuZ2V0KHRoaXMuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbiksIGFSZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IG9mIHRoZSBmaXJzdCByZWdpb24gd2l0aCB0aGUgbWF0Y2hpbmcgY29udGV4dCB0eXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCS8vIERNVzogbG9vcGluZyBpcyBmYXN0ZXIgdGhhbiBlbnVtZXJhdGlvbiwKLQkJLy8gc28gc3dpdGNoZWQgYXJvdW5kIDIvMTIvMDMKLQkJLy8gRW51bWVyYXRpb24gZSA9IGdldFJlZ2lvbnMoKS5lbGVtZW50cygpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCXJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBjb250ZXh0KSB7Ci0JCQkJcmVzdWx0ID0gZ2V0VGV4dChyZWdpb24pOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChfZ2V0UmVnaW9ucygpLnNpemUoKSAtIDEpOwotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyB0aGUgdHlwZSBvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIC4uLiBub3QgdG8gYmUgY29uZnVzZWQKLQkgKiB3aXRoIHR5cGUgb2YgWE1MIG5vZGUhIFRoaXMgaXMgc3ViY2xhc3NlZCwgaWYgc29tZXRoaW5nIG90aGVyIHRoYW4gdHlwZQotCSAqIG9mIGZpcnN0IHJlZ2lvbiBpcyBkZXNpcmVkLgotCSAqIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IFVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHN1YnJlZ2lvbnMgPSBnZXRSZWdpb25zKCk7Ci0JCWlmIChzdWJyZWdpb25zICE9IG51bGwgJiYgc3VicmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHN1YnJlZ2lvbnMuZ2V0KDApOwotCQkJaWYgKGZpcnN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBmaXJzdFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jaXNEZWxldGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoKSB7Ci0JCXJldHVybiBmSXNEZWxldGVkIHx8IChmUGFyZW50RG9jdW1lbnQgPT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJcmV0dXJuIChoYXNFbmQgPT0gMSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gc2FtZUFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgcmVnaW9uID09IG51bGwsIHdlIHJldHVybiBmYWxzZTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkvLyBpZiB0aGUgcmVnaW9ucyBhcmUgdGhlIHNhbWUgaW5zdGFuY2UsIHRoZXkgYXJlIGVxdWFsCi0JCQlpZiAodGhpcyA9PSByZWdpb24pIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgbm9uLXRyaXZpYWwgcGFydAotCQkJCS8vIG5vdGU6IHdlIGNoYW5nZSBmb3IgdHlwZSBmaXJzdCwgdGhlbiBzdGFydCBvZmZzZXQgYW5kIGVuZAotCQkJCS8vIG9mZnNldCwKLQkJCQkvLyBzaW5jZSB0aGF0IHdvdWxkIGRlY2lkZSBtYW55IGNhc2VzIHJpZ2h0IGF3YXkgYW5kIGF2b2lkIHRoZQotCQkJCS8vIHRleHQgY29tcGFyaXNvbgotCQkJCWlmIChnZXRUeXBlKCkgPT0gcmVnaW9uLmdldFR5cGUoKSkgewotCQkJCQlpZiAoc2FtZU9mZnNldHNBcyhyZWdpb24sIHNoaWZ0KSAmJiBzYW1lVGV4dEFzKHJlZ2lvbiwgc2hpZnQpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld0RvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBhbnkgcmVnaW9uIGlzIG51bGwsIHdlIHJldHVybiBmYWxzZSAoZXZlbiBpZiBib3RoIGFyZSEpCi0JCWlmICgob2xkUmVnaW9uICE9IG51bGwpICYmIChuZXdSZWdpb24gIT0gbnVsbCkpIHsKLQkJCS8vIGlmIHRoZSByZWdpb25zIGFyZSB0aGUgc2FtZSBpbnN0YW5jZSwgdGhleSBhcmUgZXF1YWwKLQkJCWlmIChvbGRSZWdpb24gPT0gbmV3UmVnaW9uKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHRoaXMgaXMgdGhlIG5vbi10cml2aWFsIHBhcnQKLQkJCQkvLyBub3RlOiB3ZSBjaGFuZ2UgZm9yIHR5cGUgZmlyc3QsIHRoZW4gc3RhcnQgb2Zmc2V0IGFuZCBlbmQKLQkJCQkvLyBvZmZzZXQsCi0JCQkJLy8gc2luY2UgdGhhdCB3b3VsZCBkZWNpZGUgbWFueSBjYXNlcyByaWdodCBhd2F5IGFuZCBhdm9pZCB0aGUKLQkJCQkvLyB0ZXh0IGNvbXBhcmlzb24KLQkJCQlpZiAob2xkUmVnaW9uLmdldFR5cGUoKSA9PSBuZXdSZWdpb24uZ2V0VHlwZSgpKSB7Ci0JCQkJCWlmIChzYW1lT2Zmc2V0c0FzKG9sZFJlZ2lvbiwgbmV3RG9jdW1lbnRSZWdpb24sIG5ld1JlZ2lvbiwgc2hpZnQpKSB7Ci0JCQkJCQlpZiAoc2FtZVRleHRBcyhvbGRSZWdpb24sIG5ld0RvY3VtZW50UmVnaW9uLCBuZXdSZWdpb24sIHNoaWZ0KSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVPZmZzZXRzQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQlpZiAoZ2V0U3RhcnRPZmZzZXQoKSA9PSByZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSAtIHNoaWZ0KSB7Ci0JCQlpZiAoZ2V0RW5kT2Zmc2V0KCkgPT0gcmVnaW9uLmdldEVuZE9mZnNldCgpIC0gc2hpZnQpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIHNhbWVPZmZzZXRzQXMoSVRleHRSZWdpb24gb2xkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIGludCBzaGlmdCkgewotCQlpZiAoZ2V0U3RhcnRPZmZzZXQob2xkUmVnaW9uKSA9PSBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuZXdSZWdpb24pIC0gc2hpZnQpIHsKLQkJCWlmIChnZXRFbmRPZmZzZXQob2xkUmVnaW9uKSA9PSBkb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQobmV3UmVnaW9uKSAtIHNoaWZ0KSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJdHJ5IHsKLQkJCWlmIChnZXRUZXh0KCkuZXF1YWxzKHJlZ2lvbi5nZXRUZXh0KCkpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyBJU1NVRTogd2Ugc2hvdWxkIG5vdCBuZWVkIHRoaXMKLQkJY2F0Y2ggKFN0cmluZ0luZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBzYW1lVGV4dEFzKElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gbmV3UmVnaW9uLCBpbnQgc2hpZnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAoZ2V0VGV4dChvbGRSZWdpb24pLmVxdWFscyhkb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5ld1JlZ2lvbikpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24jc2V0RGVsZXRlKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGlzRGVsZXRlZCkgewotCQlmSXNEZWxldGVkID0gaXNEZWxldGVkOwotCi0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0hhc0VuZAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZGVkKGJvb2xlYW4gbmV3SGFzRW5kKSB7Ci0JCWlmIChuZXdIYXNFbmQpIHsKLQkJCWhhc0VuZCA9IDE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQloYXNFbmQgPSAwOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBuZXdMZW5ndGgpIHsKLQkJLy8gdGV4dExlbmd0aCA9IG5ld0xlbmd0aDsKLQkJZkxlbmd0aCA9IG5ld0xlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROZXh0KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3TmV4dCkgewotCQluZXh0ID0gbmV3TmV4dDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZQYXJlbnREb2N1bWVudCA9IGRvY3VtZW50OwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQlwcmV2aW91cyA9IG5ld1ByZXZpb3VzOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGNvbnRhaW5lZFJlZ2lvbnMpIHsKLQkJX3JlZ2lvbnMgPSBjb250YWluZWRSZWdpb25zOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQlzdGFydCA9IG5ld1N0YXJ0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQkvLyBBbHNvIG5vdGUsIHRoaXMgbWV0aG9kIGNhbiBub3QgYmUgY2hhbmdlZCwgd2l0aG91dCAiYnJlYWtpbmciCi0JCS8vIHVuaXQgdGVzdHMsIHNpbmNlIHNvbWUgb2YgdGhlbSBjb21wYXJlIGN1cnJlbnQgcmVzdWx0cyB0byBwcmV2aW91cwotCQkvLyByZXN1bHRzLgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJcmVzdWx0ID0gIlsiICsgZ2V0U3RhcnQoKSArICIsICIgKyBnZXRFbmQoKSArICJdICgiICsgZ2V0VGV4dCgpICsgIikiOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZURvd25TdHJlYW1SZWdpb25zKElUZXh0UmVnaW9uIGNoYW5nZWRSZWdpb24sIGludCBsZW5ndGhEaWZmZXJlbmNlKSB7Ci0JCWludCBsaXN0TGVuZ3RoID0gX2dldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCWludCBzdGFydEluZGV4ID0gMDsKLQkJLy8gZmlyc3QsIGxvb3AgdGhyb3VnaCB0byBmaW5kIGluZGV4IG9mIHdoZXJlIHRvIHN0YXJ0Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCWlmIChyZWdpb24gPT0gY2hhbmdlZFJlZ2lvbikgewotCQkJCXN0YXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIG5vdywgYmVnaW5uaW5nIG9uZSBwYXN0IHRoZSBvbmUgdGhhdCB3YXMgY2hhbmdlZCwgbG9vcAotCQkvLyB0aHJvdWdoIHRvIGVuZCBvZiBsaXN0LCBhZGp1c3RpbmcgdGhlIHN0YXJ0IHBvc3Rpb25zLgotCQlzdGFydEluZGV4Kys7Ci0JCWZvciAoaW50IGogPSBzdGFydEluZGV4OyBqIDwgbGlzdExlbmd0aDsgaisrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBfZ2V0UmVnaW9ucygpLmdldChqKTsKLQkJCXJlZ2lvbi5hZGp1c3RTdGFydChsZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJLy8gR2V0IHRoZSByZWdpb24gcG9pbnRlZCB0byBieSB0aGUgcmVxdWVzdFN0YXJ0IHBvc3Rpb24sIGFuZCBnaXZlCi0JCS8vIHRoYXQgcmVnaW9uIGEgY2hhbmNlIHRvIGVmZmVjdAotCQkvLyB0aGUgdXBkYXRlLgotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBnZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChyZXF1ZXN0U3RhcnQpOwotCQkvLyBpZiB0aGVyZSBpcyBubyByZWdpb24sIHRoZW4gdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIG11c3QgY29tZSByaWdodAotCQkvLyBhZnRlciB0aGUKLQkJLy8gbm9kZSAoYW5kIHJpZ2h0IGFmdGVyIHRoZSBsYXN0IHJlZ2lvbikuIFRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsCi0JCS8vIHdoZW4gc29tZW9uZQotCQkvLyB0eXBlcyBzb21ldGhpbmcgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQsIG9yIG1vcmUgY29tbW9ubHksIHdoZW4KLQkJLy8gdGhleSBhcmUgcmlnaHQKLQkJLy8gYXQgdGhlIGJlZ2lubmluZyBvZiBvbmUgbm9kZSwgYW5kIHRoZSBkaXJ0eSBzdGFydCBpcyB0aGVyZWZvcmUKLQkJLy8gY2FsY3VsYXRlZCB0byBiZSB0aGUKLQkJLy8gcHJldmlvdXMgbm9kZS4KLQkJLy8gU28sIGluIHRoaXMgY2FzZSwgd2UnbGwgZ2l2ZSB0aGUgbGFzdCByZWdpb24gYSBjaGFuY2UgdG8gc2VlIGlmIGl0Ci0JCS8vIHdhbnRzIHRvCi0JCS8vIHN3YWxsb3cgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIC0tIGJ1dCBvbmx5IGZvciBpbnNlcnRzIC0tIGRlbGV0ZXMKLQkJLy8gYW5kICJyZXBsYWNlcyIKLQkJLy8gc2hvdWxkIGJlIHJlcGFyc2VkIGlmIHRoZXkgYXJlIGluIHRoZXNlIGJvcmRlciByZWdpb25zLCBhbmQgb25seSBpZgotCQkvLyB0aGUKLQkJaWYgKChyZWdpb24gPT0gbnVsbCkgJiYgKGxlbmd0aFRvUmVwbGFjZSA9PSAwKSkgewotCQkJcmVnaW9uID0gX2dldFJlZ2lvbnMoKS5nZXQoX2dldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQkJCS8vIG1ha2Ugc3VyZSB0aGUgcmVnaW9uIGlzIGNvbnRpZ3VvdXMKLQkJCWlmIChnZXRFbmRPZmZzZXQocmVnaW9uKSA9PSByZXF1ZXN0U3RhcnQpIHsKLQkJCQlyZXN1bHQgPSByZWdpb24udXBkYXRlUmVnaW9uKHJlcXVlc3RlciwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8KLQkJCQkvLyBJZiB0aGUgcmVxdWVzdGVkIGNoYW5nZSBzcGFucyBtb3JlIHRoYW4gb25lIHJlZ2lvbiwgdGhlbgotCQkJCS8vIHdlIGRvbid0IGdpdmUgdGhlIHJlZ2lvbiBhIGNoYW5jZSB0byB1cGRhdGUuCi0JCQkJaWYgKChjb250YWluc09mZnNldChyZWdpb24sIHJlcXVlc3RTdGFydCkpICYmIChjb250YWluc09mZnNldChyZWdpb24sIHJlcXVlc3RTdGFydCArIGxlbmd0aFRvUmVwbGFjZSkpKSB7Ci0JCQkJCXJlc3VsdCA9IHJlZ2lvbi51cGRhdGVSZWdpb24ocmVxdWVzdGVyLCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGlmIHJlc3VsdCBpcyBub3QgbnVsbCwgdGhlbiB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RhcnQgYW5kIGVuZAotCQkvLyBwb3N0aW9ucyBvZiB0aGUgcmVnaW9ucyB0aGF0IGZvbGxvdyB0aGlzIG9uZQotCQkvLyBpZiByZXN1bHQgaXMgbnVsbCwgdGhlbiBhcHBseSB0aGUgZmxhdG5vZGUgc3BlY2lmaWMgY2hlY2tzIG9uIHdoYXQKLQkJLy8gaXQgY2FuIGNoYW5nZQotCQkvLyAoaS5lLiBtb3JlIHRoYW4gb25lIHJlZ2lvbiwgYnV0IG5vIGNoYW5nZSB0byB0aGUgbm9kZSBpdHNlbGYpCi0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJLy8gVGhhdCBpcywgYSByZWdpb24gZGVjaWRlZCBpdCBjb3VsZCBoYW5kbGUgdGhlIGNoYW5nZSBhbmQKLQkJCS8vIGNyZWF0ZWQKLQkJCS8vIGEgcmVnaW9uIGNoYW5nZWQgZXZlbnQuCi0JCQlBc3NlcnQuaXNUcnVlKHJlc3VsdCBpbnN0YW5jZW9mIFJlZ2lvbkNoYW5nZWRFdmVudCwgIlByb2dyYW0gRXJyb3IiKTsgLy8kTk9OLU5MUy0xJAotCQkJdXBkYXRlRG93blN0cmVhbVJlZ2lvbnMoKChSZWdpb25DaGFuZ2VkRXZlbnQpIHJlc3VsdCkuZ2V0UmVnaW9uKCksIGxlbmd0aERpZmZlcmVuY2UpOwotCQkJLy8gUExVUywgd2UgbmVlZCB0byB1cGRhdGUgb3VyIG93biBub2RlIGVuZCBwb2ludCAobGVuZ3RoKQotCQkJc2V0TGVuZ3RoKGdldExlbmd0aCgpICsgbGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NoYXJTZXF1ZW5jZVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODFmNjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9DaGFyU2VxdWVuY2VSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotcHVibGljIGNsYXNzIENoYXJTZXF1ZW5jZVJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0JcHJpdmF0ZSBpbnQgZkN1cnJlbnRQb3NpdGlvbjsKLQlwcml2YXRlIGludCBmTWF4aW11bVJlYWRPZmZzZXQ7Ci0KLQlwcml2YXRlIENoYXJTZXF1ZW5jZSBmT3JpZ2luYWxTb3VyY2U7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JQ2hhclNlcXVlbmNlUmVhZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIENoYXJTZXF1ZW5jZVJlYWRlcihDaGFyU2VxdWVuY2Ugb3JpZ2luYWxTb3VyY2UsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJLy8gSVNTVUU6IHNob3VsZCB3ZSAiZmFpbCBmYXN0IiBpZiByZXF1ZXN0ZWQgbGVuZ3RoIGlzIG1vcmUgdGhhbiB0aGVyZQotCQkvLyBpcz8KLQkJZk9yaWdpbmFsU291cmNlID0gb3JpZ2luYWxTb3VyY2U7Ci0JCWludCBzdGFydE9mZnNldCA9IG9mZnNldDsKLQkJaW50IG1heFJlcXVlc3RlZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoOwotCQlpbnQgbWF4UG9zc2libGVPZmZzZXQgPSAwICsgb3JpZ2luYWxTb3VyY2UubGVuZ3RoKCk7Ci0JCWZNYXhpbXVtUmVhZE9mZnNldCA9IE1hdGgubWluKG1heFJlcXVlc3RlZE9mZnNldCwgbWF4UG9zc2libGVPZmZzZXQpOwotCi0JCWZDdXJyZW50UG9zaXRpb24gPSBzdGFydE9mZnNldDsKLQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb2NrCi0JICovCi0JQ2hhclNlcXVlbmNlUmVhZGVyKE9iamVjdCBsb2NrKSB7Ci0JCXN1cGVyKGxvY2spOwotCQkvLyBmb3IgdGhyZWFkIHNhZmV0eSwgbWF5IG5lZWQgdG8gYWRkIGJhY2sgbG9ja2luZyBtZWNoYW5pc20KLQkJLy8gaW4gb3VyIGN1c3RvbSBjb25zdHJ1Y3Rvci4gVGhpcyBjb25zdHJ1Y3RvciBsZWZ0IGhlcmUganVzdAotCQkvLyBmb3IgYSByZW1pbmRlci4KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gd2hlbiB3ZSBjbG9zZQotCQkvLyAobWF5IGJlIHRvIGV2ZW50dWFsbHkgInVubG9jayIgb3IgbnVsbCBvdXQgc29tZSB2YXJpYmxlcwotCQkvLyBqdXN0IGZvciBoeWdlbmUuCi0JCS8vIG9yLCBwZXJoYXBzIGlmIGFscmVhZHkgY2xvc2VkIG9uY2UgdGhyb3cgSU9FeGNlcHRpb24/IGZvcgotCQkvLyBjb25zaXN0ZW5jeT8KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIG9yaWdpbmFsU291cmNlLgotCSAqIEBkZXByZWNhdGVkIC0gb25seSB0ZW1wb3JhcmlseSBwdWJsaWMsIHNob3VsZCBiZSAnZGVmYXVsdCcgZXZlbnR1YWxseQotCSAqICAgICAgICAgICAgIG9yIGdvIGF3YXkgYWx0b2dldGhlci4KLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIGdldE9yaWdpbmFsU291cmNlKCkgewotCQlyZXR1cm4gZk9yaWdpbmFsU291cmNlOwotCX0KLQotCXB1YmxpYyBpbnQgcmVhZCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCQlpZiAoZkN1cnJlbnRQb3NpdGlvbiA8IGZNYXhpbXVtUmVhZE9mZnNldCkgewotCQkJcmVzdWx0ID0gZk9yaWdpbmFsU291cmNlLmNoYXJBdChmQ3VycmVudFBvc2l0aW9uKyspOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBjaGFyYWN0ZXJzIGludG8gYSBwb3J0aW9uIG9mIGFuIGFycmF5LiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrCi0JICogdW50aWwgc29tZSBpbnB1dCBpcyBhdmFpbGFibGUsIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBlbmQgb2YgdGhlCi0JICogc3RyZWFtIGlzIHJlYWNoZWQuCi0JICogCi0JICogQHBhcmFtIGNidWYKLQkgKiAgICAgICAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlcgotCSAqIEBwYXJhbSBvZmYKLQkgKiAgICAgICAgICAgIE9mZnNldCBhdCB3aGljaCB0byBzdGFydCBzdG9yaW5nIGNoYXJhY3RlcnMKLQkgKiBAcGFyYW0gbGVuCi0JICogICAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIHJlYWQKLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciAtMSBpZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KLQkgKiAgICAgICAgIGhhcyBiZWVuIHJlYWNoZWQKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIElPRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSWYgYW4gSS9PIGVycm9yIG9jY3VycwotCSAqLwotCi0JcHVibGljIGludCByZWFkKGNoYXJbXSBjYnVmLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgY2hhcnNUb1JlYWQgPSAtMTsKLQkJLy8gaWYgYWxyZWFkeSBvdmVyIG1heCwganVzdCByZXR1cm4gLTEKLQkJLy8gcmVtZW1iZXIsIGN1cnJlbnRQb3NpdGlvbiBpcyB3aGF0IGlzIGdldHRpbmcgcmVhZHkgdG8gYmUgcmVhZAotCQkvLyAodGhhdCBpcywgaXRzIGFscmVhZHkgYmVlbiBpbmNyZW1lbnRlZCBpbiByZWFkKCkpLgotCQlpZiAoZkN1cnJlbnRQb3NpdGlvbiA8IGZNYXhpbXVtUmVhZE9mZnNldCkgewotCi0KLQkJCWludCBidWZmTWF4VG9SZWFkID0gY2J1Zi5sZW5ndGggLSBvZmY7Ci0JCQlpbnQgbWluUmVxdWVzdGVkID0gTWF0aC5taW4oYnVmZk1heFRvUmVhZCwgbGVuKTsKLQkJCWludCBsZW5ndGhSZW1haW5pbmcgPSBmTWF4aW11bVJlYWRPZmZzZXQgLSBmQ3VycmVudFBvc2l0aW9uOwotCQkJY2hhcnNUb1JlYWQgPSBNYXRoLm1pbihtaW5SZXF1ZXN0ZWQsIGxlbmd0aFJlbWFpbmluZyk7Ci0KLQotCQkJQ2hhclNlcXVlbmNlIHNlcSA9IGZPcmlnaW5hbFNvdXJjZS5zdWJTZXF1ZW5jZShmQ3VycmVudFBvc2l0aW9uLCBmQ3VycmVudFBvc2l0aW9uICsgY2hhcnNUb1JlYWQpOwotCQkJLy8gZm9yIG5vdywgaGFyZCBhc3N1bXB0aW9uIHRoYXQgb3JpZ2luYWwgaXMgYSBTdHJpbmcgc2luY2Ugc291cmNlCi0JCQkvLyBpcyBhc3N1bWVkIHRvIGJlIGRvY3VtZW50LCBvciB0ZXh0IHN0b3JlCi0JCQlTdHJpbmcgc2VxU3RyaW5nID0gKFN0cmluZykgc2VxOwotCQkJc2VxU3RyaW5nLmdldENoYXJzKDAsIHNlcVN0cmluZy5sZW5ndGgoKSwgY2J1Ziwgb2ZmKTsKLQotCi0KLQkJCWZDdXJyZW50UG9zaXRpb24gPSBmQ3VycmVudFBvc2l0aW9uICsgY2hhcnNUb1JlYWQ7Ci0KLQotCQl9Ci0JCXJldHVybiBjaGFyc1RvUmVhZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvQ29yZU5vZGVMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZjc0NDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0NvcmVOb2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgQ29yZU5vZGVMaXN0IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgewotCWludCBjb3VudGVkTGVuZ3RoOwotCWludCBjdXJyZW50SW5kZXggPSAtMTsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSBmbGF0Tm9kZXM7Ci0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkOwotCi0JLyoqCi0JICogQ29yZU5vZGVMaXN0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIENvcmVOb2RlTGlzdCgpIHsKLQkJc3VwZXIoKTsKLQkJLy8gY3JlYXRlIGFuIGFycmF5LCBldmVuIGlmIHplcm8gbGVuZ3RoCi0JCWZsYXROb2RlcyA9IG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uWzBdOwotCX0KLQotCXB1YmxpYyBDb3JlTm9kZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdIZWFkKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIHNhdmUgaGVhZAotCQloZWFkID0gbmV3SGVhZDsKLQkJaW50IGNvdW50ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBuZXdIZWFkOwotCQkvLyB3ZSBoYXZlIHRvIGdvIHRocm91Z2ggdGhlIGxpc3Qgb25jZSwgdG8gZ2V0IGl0cwotCQkvLyBsZW5ndGggaW4gb3JkZXIgdG8gY3JlYXRlIHRoZSBhcnJheQotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCWNvdW50Kys7Ci0JCQljb3VudE5vZGUgPSBjb3VudE5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JCS8vIGNyZWF0ZSBhbiBhcnJheSwgZXZlbiBpZiB6ZXJvIGxlbmd0aAotCQlmbGF0Tm9kZXMgPSBuZXcgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbltjb3VudF07Ci0JCS8vIHN0YXJ0IGNvdW50Tm9kZSBvdmVyIGFnYWluLCBzbyB0byBzcGVhay4KLQkJY291bnROb2RlID0gbmV3SGVhZDsKLQkJY291bnQgPSAwOwotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCWZsYXROb2Rlc1tjb3VudCsrXSA9IGNvdW50Tm9kZTsKLQkJCWNvdW50Tm9kZSA9IGNvdW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJaWYgKGNvdW50ID4gMCkgewotCQkJY3VycmVudEluZGV4ID0gMDsKLQkJCS8vIGVsc2UgaXQgc3RheXMgYXQgLTEgaW5pdGlhbGl6ZWQgYXQgb2JqZWN0IGNyZWF0aW9uCi0JCQkvLwotCQkJLy8gc2F2ZSBsZW5ndGgKLQkJCWNvdW50ZWRMZW5ndGggPSBjb3VudDsKLQkJfQotCX0KLQotCXB1YmxpYyBDb3JlTm9kZUxpc3QoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJLy8gc2F2ZSBoZWFkCi0JCWhlYWQgPSBzdGFydDsKLQkJaW50IGNvdW50ID0gMDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBzdGFydDsKLQkJaWYgKChzdGFydCA9PSBudWxsKSB8fCAoZW5kID09IG51bGwpKSB7Ci0JCQkvLyBlcnJvciBjb25kaXRpb24KLQkJCS8vdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTXVzdCBwcm92aWRlIHN0YXJ0IGFuZCBlbmQKLQkJCS8vIG5vZGVzIHRvIGNvbnN0cnVjdCBDb3JlTm9kZUxpc3QiKTsKLQkJfSBlbHNlIHsKLQkJCWNvdW50ID0gMTsKLQkJCXdoaWxlICgoY291bnROb2RlICE9IG51bGwpICYmIChjb3VudE5vZGUgIT0gZW5kKSkgewotCQkJCWNvdW50Kys7Ci0JCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBpZiB3ZSBlbmRlZCBiZWNhdXNlIHRoZSBsYXN0IG9uZSB3YXMgbnVsbCwKLQkJLy8gYmFja3VwIG9uZS4KLQkJaWYgKGNvdW50Tm9kZSA9PSBudWxsKQotCQkJY291bnQtLTsKLQkJaWYgKGNvdW50IDwgMCkgewotCQkJY291bnQgPSAwOwotCQl9Ci0JCWZsYXROb2RlcyA9IG5ldyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW2NvdW50XTsKLQkJaWYgKGNvdW50ID4gMCkgewotCQkJZmxhdE5vZGVzWzBdID0gY291bnROb2RlID0gc3RhcnQ7Ci0JCQlmb3IgKGludCBpID0gMTsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlmbGF0Tm9kZXNbaV0gPSBmbGF0Tm9kZXNbaSAtIDFdLmdldE5leHQoKTsKLQkJCX0KLQotCQl9Ci0JCWN1cnJlbnRJbmRleCA9IDA7Ci0JCWNvdW50ZWRMZW5ndGggPSBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgRW51bWVyYXRpb24gZWxlbWVudHMoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWlmICgoZmxhdE5vZGVzICE9IG51bGwpICYmIChmbGF0Tm9kZXMubGVuZ3RoID4gMCkpCi0JCQlyZXN1bHQgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24oZmxhdE5vZGVzWzBdLCBmbGF0Tm9kZXNbZmxhdE5vZGVzLmxlbmd0aCAtIDFdKTsKLQkJZWxzZQotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uKG51bGwpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZmxhdE5vZGVzLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpbmNsdWRlcyhPYmplY3QgbykgewotCQlpZiAoZmxhdE5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZmxhdE5vZGVzLmxlbmd0aDsgaSsrKQotCQkJaWYgKGZsYXROb2Rlc1tpXSA9PSBvKQotCQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXRlbShpbnQgaSkgewotCQlyZXR1cm4gZmxhdE5vZGVzW2ldOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9EZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0RlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjZGZkNTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0RlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdFBvc2l0aW9uVXBkYXRlcjsKLQotLyoqCi0gKiBGb2xsb3dzIHRoZSBiZWhhdmlvciBvZiBEZWZhdWx0UG9zaXRpb25VcGRhdGVyIGV4Y2VwdCBpbiBhZGRpdGlvbiB0bwotICogZGVsZXRpbmcvb3ZlcndyaXRpbmcgdGV4dCB3aGljaCBjb21wbGV0ZWx5IGNvbnRhaW5zIHRoZSBwb3NpdGlvbiBkZWxldGVzCi0gKiB0aGUgcG9zaXRpb24sIGRlbGV0aW5nIHRleHQgdGhhdCBlcXVhbHMgdGhlIHRleHQgaW4gcG9zaXRpb24gYWxzbyBkZWxldGVzCi0gKiB0aGUgcG9zaXRpb24uCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxldGVFcXVhbFBvc2l0aW9uVXBkYXRlciBleHRlbmRzIERlZmF1bHRQb3NpdGlvblVwZGF0ZXIgewotCi0JLyoqCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICovCi0JcHVibGljIERlbGV0ZUVxdWFsUG9zaXRpb25VcGRhdGVyKFN0cmluZyBjYXRlZ29yeSkgewotCQlzdXBlcihjYXRlZ29yeSk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50bHkgaW52ZXN0aWdhdGVkIHBvc2l0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKLQkgKiBieSB0aGUgcmVwbGFjZSBvcGVyYXRpb24gc3BlY2lmaWVkIGluIHRoZSBjdXJyZW50IGV2ZW50LiBJZiBzbywgaXQKLQkgKiBkZWxldGVzIHRoZSBwb3NpdGlvbiBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBkb2N1bWVudCdzIHBvc2l0aW9uCi0JICogY2F0ZWdvcnkuCi0JICogCi0JICogTk9URTogcG9zaXRpb24gaXMgZGVsZXRlZCBpZiBjdXJyZW50IGV2ZW50IGNvbXBsZXRlbHkgb3ZlcndyaXRlcwotCSAqIHBvc2l0aW9uIE9SIGlmIGN1cnJlbnQgZXZlbnQgZGVsZXRlcyB0aGUgYXJlYSBzdXJyb3VuZGluZy9pbmNsdWRpbmcgdGhlCi0JICogcG9zaXRpb24KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHBvc2l0aW9uIGhhcyBiZWVuIGRlbGV0ZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub3REZWxldGVkKCkgewotCQkvLyBwb3NpdGlvbiBpcyBkZWxldGVkIGlmIGN1cnJlbnQgZXZlbnQgY29tcGxldGVseSBvdmVyd3JpdGVzIHBvc2l0aW9uCi0JCS8vIE9SIGlmCi0JCS8vIGN1cnJlbnQgZXZlbnQgZGVsZXRlcyB0aGUgYXJlYSBzdXJyb3VuZGluZy9pbmNsdWRpbmcgdGhlIHBvc2l0aW9uCi0JCWlmICgoZk9mZnNldCA8IGZQb3NpdGlvbi5vZmZzZXQgJiYgKGZQb3NpdGlvbi5vZmZzZXQgKyBmUG9zaXRpb24ubGVuZ3RoIDwgZk9mZnNldCArIGZMZW5ndGgpKSB8fCAoZk9mZnNldCA8PSBmUG9zaXRpb24ub2Zmc2V0ICYmIChmUG9zaXRpb24ub2Zmc2V0ICsgZlBvc2l0aW9uLmxlbmd0aCA8PSBmT2Zmc2V0ICsgZkxlbmd0aCkgJiYgZlJlcGxhY2VMZW5ndGggPT0gMCkpIHsKLQotCQkJZlBvc2l0aW9uLmRlbGV0ZSgpOwotCi0JCQl0cnkgewotCQkJCWZEb2N1bWVudC5yZW1vdmVQb3NpdGlvbihnZXRDYXRlZ29yeSgpLCBmUG9zaXRpb24pOwotCQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB4KSB7Ci0JCQl9Ci0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiB0cnVlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0dlbmVyaWNQb3NpdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9HZW5lcmljUG9zaXRpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODM3MjQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0dlbmVyaWNQb3NpdGlvbk1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0UG9zaXRpb25VcGRhdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgR2VuZXJpY1Bvc2l0aW9uTWFuYWdlciB7Ci0JcHJpdmF0ZSBDaGFyU2VxdWVuY2UgZkNoYXJTZXF1ZW5jZTsKLQotCi0KLQlwcml2YXRlIE1hcCBmUG9zaXRpb25zOwotCS8qKiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCBwb3NpdGlvbiB1cGRhdGVycyAqLwotCXByaXZhdGUgTGlzdCBmUG9zaXRpb25VcGRhdGVyczsKLQotCS8qKgotCSAqIGRvbid0IGFsbG93IGluc3RhbnRpYXRpb24gd2l0aCBvdXQgZG9jdW1lbnQgcG9pbnRlcgotCSAqICAKLQkgKi8KLQlwcml2YXRlIEdlbmVyaWNQb3NpdGlvbk1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBHZW5lcmljUG9zaXRpb25NYW5hZ2VyKENoYXJTZXF1ZW5jZSBjaGFyU2VxdWVuY2UpIHsKLQkJdGhpcygpOwotCQkvLyB3ZSBvbmx5IHVzZSBjaGFyU2VxdWVuY2UgZm9yICJsZW5ndGgiLCB0bwotCQkvLyBtYWRlIG1vcmUgZ2VuZXJpYyB0aGFuICJkb2N1bWVudCIgZXZlbiAidGV4dCBzdG9yZSIKLQkJZkNoYXJTZXF1ZW5jZSA9IGNoYXJTZXF1ZW5jZTsKLQkJY29tcGxldGVJbml0aWFsaXphdGlvbigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNhZGRQb3NpdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0cnkgewotCQkJYWRkUG9zaXRpb24oSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlksIHBvc2l0aW9uKTsKLQkJfSBjYXRjaCAoQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQl9Ci0KLQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZFBvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgUG9zaXRpb24gcG9zaXRpb24pIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKCgwID4gcG9zaXRpb24ub2Zmc2V0KSB8fCAoMCA+IHBvc2l0aW9uLmxlbmd0aCkgfHwgKHBvc2l0aW9uLm9mZnNldCArIHBvc2l0aW9uLmxlbmd0aCA+IGdldERvY3VtZW50TGVuZ3RoKCkpKQotCQkJdGhyb3cgbmV3IEJhZExvY2F0aW9uRXhjZXB0aW9uKCk7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCWxpc3QuYWRkKGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KGxpc3QsIHBvc2l0aW9uLm9mZnNldCksIHBvc2l0aW9uKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjYWRkUG9zaXRpb25DYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZFBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoY2F0ZWdvcnkpKQotCQkJZlBvc2l0aW9ucy5wdXQoY2F0ZWdvcnksIG5ldyBBcnJheUxpc3QoKSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50I2FkZFBvc2l0aW9uVXBkYXRlcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklQb3NpdGlvblVwZGF0ZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQlpbnNlcnRQb3NpdGlvblVwZGF0ZXIodXBkYXRlciwgZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpKTsKLQl9Ci0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIGRvY3VtZW50IGxpc3RlbmVycywgcG9zaXRpb25zLCBhbmQgcG9zaXRpb24gdXBkYXRlcnMuIE11c3QKLQkgKiBiZSBjYWxsZWQgaW5zaWRlIHRoZSBjb25zdHJ1Y3RvciBhZnRlciB0aGUgaW1wbGVtZW50YXRpb24gcGx1Zy1pbnMgaGF2ZQotCSAqIGJlZW4gc2V0LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKSB7Ci0KLQkJZlBvc2l0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZQb3NpdGlvblVwZGF0ZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWFkZFBvc2l0aW9uQ2F0ZWdvcnkoSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlkpOwotCQlhZGRQb3NpdGlvblVwZGF0ZXIobmV3IERlZmF1bHRQb3NpdGlvblVwZGF0ZXIoSURvY3VtZW50LkRFRkFVTFRfQ0FURUdPUlkpKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjY29tcHV0ZUluZGV4SW5DYXRlZ29yeShqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKDAgPiBvZmZzZXQgfHwgb2Zmc2V0ID4gZ2V0RG9jdW1lbnRMZW5ndGgoKSkKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCi0JCUxpc3QgYyA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCXJldHVybiBjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChjLCBvZmZzZXQpOwotCX0KLQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGluZGV4IGluIHRoZSBsaXN0IG9mIHBvc2l0aW9ucyBhdCB3aGljaCBhIHBvc2l0aW9uIHdpdGgKLQkgKiB0aGUgZ2l2ZW4gb2Zmc2V0IHdvdWxkIGJlIGluc2VydGVkLiBUaGUgcG9zaXRpb24gaXMgc3VwcG9zZWQgdG8gYmVjb21lCi0JICogdGhlIGZpcnN0IGluIHRoaXMgbGlzdCBvZiBhbGwgcG9zaXRpb25zIHdpdGggdGhlIHNhbWUgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbnMKLQkgKiAgICAgICAgICAgIHRoZSBsaXN0IGluIHdoaWNoIHRoZSBpbmRleCBpcyBjb21wdXRlZAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgZm9yIHdoaWNoIHRoZSBpbmRleCBpcyBjb21wdXRlZAotCSAqIEByZXR1cm4gdGhlIGNvbXB1dGVkIGluZGV4Ci0JICogCi0JICogQHNlZSBJRG9jdW1lbnQjY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcsIGludCkKLQkgKi8KLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVJbmRleEluUG9zaXRpb25MaXN0KExpc3QgcG9zaXRpb25zLCBpbnQgb2Zmc2V0KSB7Ci0KLQkJaWYgKHBvc2l0aW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiAwOwotCi0JCWludCBsZWZ0ID0gMDsKLQkJaW50IHJpZ2h0ID0gcG9zaXRpb25zLnNpemUoKSAtIDE7Ci0JCWludCBtaWQgPSAwOwotCQlQb3NpdGlvbiBwID0gbnVsbDsKLQotCQl3aGlsZSAobGVmdCA8IHJpZ2h0KSB7Ci0KLQkJCW1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKLQotCQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChtaWQpOwotCQkJaWYgKG9mZnNldCA8IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCQlpZiAobGVmdCA9PSBtaWQpCi0JCQkJCXJpZ2h0ID0gbGVmdDsKLQkJCQllbHNlCi0JCQkJCXJpZ2h0ID0gbWlkIC0gMTsKLQkJCX0gZWxzZSBpZiAob2Zmc2V0ID4gcC5nZXRPZmZzZXQoKSkgewotCQkJCWlmIChyaWdodCA9PSBtaWQpCi0JCQkJCWxlZnQgPSByaWdodDsKLQkJCQllbHNlCi0JCQkJCWxlZnQgPSBtaWQgKyAxOwotCQkJfSBlbHNlIGlmIChvZmZzZXQgPT0gcC5nZXRPZmZzZXQoKSkgewotCQkJCWxlZnQgPSByaWdodCA9IG1pZDsKLQkJCX0KLQotCQl9Ci0KLQkJaW50IHBvcyA9IGxlZnQ7Ci0JCXAgPSAoUG9zaXRpb24pIHBvc2l0aW9ucy5nZXQocG9zKTsKLQkJaWYgKG9mZnNldCA+IHAuZ2V0T2Zmc2V0KCkpIHsKLQkJCS8vIGFwcGVuZCB0byB0aGUgZW5kCi0JCQlwb3MrKzsKLQkJfSBlbHNlIHsKLQkJCS8vIGVudHJ5IHdpbGwgYmVjYW1lIHRoZSBmaXJzdCBvZiBhbGwgZW50cmllcyB3aXRoIHRoZSBzYW1lCi0JCQkvLyBvZmZzZXQKLQkJCWRvIHsKLQkJCQktLXBvczsKLQkJCQlpZiAocG9zIDwgMCkKLQkJCQkJYnJlYWs7Ci0JCQkJcCA9IChQb3NpdGlvbikgcG9zaXRpb25zLmdldChwb3MpOwotCQkJfSB3aGlsZSAob2Zmc2V0ID09IHAuZ2V0T2Zmc2V0KCkpOwotCQkJKytwb3M7Ci0JCX0KLQotCQlBc3NlcnQuaXNUcnVlKDAgPD0gcG9zICYmIHBvcyA8PSBwb3NpdGlvbnMuc2l6ZSgpKTsKLQotCQlyZXR1cm4gcG9zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uKFN0cmluZyBjYXRlZ29yeSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCUxpc3QgbGlzdCA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChsaXN0ID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgaW5kZXggPSBjb21wdXRlSW5kZXhJblBvc2l0aW9uTGlzdChsaXN0LCBvZmZzZXQpOwotCQlpZiAoaW5kZXggPCBzaXplKSB7Ci0JCQlQb3NpdGlvbiBwID0gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCk7Ci0JCQl3aGlsZSAocCAhPSBudWxsICYmIHAub2Zmc2V0ID09IG9mZnNldCkgewotCQkJCWlmIChwLmxlbmd0aCA9PSBsZW5ndGgpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCSsraW5kZXg7Ci0JCQkJcCA9IChpbmRleCA8IHNpemUpID8gKFBvc2l0aW9uKSBsaXN0LmdldChpbmRleCkgOiBudWxsOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1Bvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmIChjYXRlZ29yeSAhPSBudWxsKQotCQkJcmV0dXJuIGZQb3NpdGlvbnMuY29udGFpbnNLZXkoY2F0ZWdvcnkpOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0KLQotCXB1YmxpYyBpbnQgZ2V0RG9jdW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiBmQ2hhclNlcXVlbmNlLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHBvc2l0aW9ucyBtYW5hZ2VkIGJ5IHRoZSBkb2N1bWVudCBncm91cGVkIGJ5IGNhdGVnb3J5LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGRvY3VtZW50J3MgcG9zaXRpb25zCi0JICovCi0JcHJvdGVjdGVkIE1hcCBnZXREb2N1bWVudE1hbmFnZWRQb3NpdGlvbnMoKSB7Ci0JCXJldHVybiBmUG9zaXRpb25zOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKQotCSAqLwotCXB1YmxpYyBTdHJpbmdbXSBnZXRQb3NpdGlvbkNhdGVnb3JpZXMoKSB7Ci0JCVN0cmluZ1tdIGNhdGVnb3JpZXMgPSBuZXcgU3RyaW5nW2ZQb3NpdGlvbnMuc2l6ZSgpXTsKLQkJSXRlcmF0b3Iga2V5cyA9IGZQb3NpdGlvbnMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yaWVzLmxlbmd0aDsgaSsrKQotCQkJY2F0ZWdvcmllc1tpXSA9IChTdHJpbmcpIGtleXMubmV4dCgpOwotCQlyZXR1cm4gY2F0ZWdvcmllczsKLQl9Ci0KLQotCXB1YmxpYyBQb3NpdGlvbltdIGdldFBvc2l0aW9ucyhTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJTGlzdCBjID0gKExpc3QpIGZQb3NpdGlvbnMuZ2V0KGNhdGVnb3J5KTsKLQkJaWYgKGMgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uKCk7Ci0KLQkJUG9zaXRpb25bXSBwb3NpdGlvbnMgPSBuZXcgUG9zaXRpb25bYy5zaXplKCldOwotCQljLnRvQXJyYXkocG9zaXRpb25zKTsKLQkJcmV0dXJuIHBvc2l0aW9uczsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjZ2V0UG9zaXRpb25VcGRhdGVycygpCi0JICovCi0JcHVibGljIElQb3NpdGlvblVwZGF0ZXJbXSBnZXRQb3NpdGlvblVwZGF0ZXJzKCkgewotCQlJUG9zaXRpb25VcGRhdGVyW10gdXBkYXRlcnMgPSBuZXcgSVBvc2l0aW9uVXBkYXRlcltmUG9zaXRpb25VcGRhdGVycy5zaXplKCldOwotCQlmUG9zaXRpb25VcGRhdGVycy50b0FycmF5KHVwZGF0ZXJzKTsKLQkJcmV0dXJuIHVwZGF0ZXJzOwotCX0KLQotCi0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjaW5zZXJ0UG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlciwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyLCBpbnQgaW5kZXgpIHsKLQotCQlmb3IgKGludCBpID0gZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKLQkJCWlmIChmUG9zaXRpb25VcGRhdGVycy5nZXQoaSkgPT0gdXBkYXRlcikKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoaW5kZXggPT0gZlBvc2l0aW9uVXBkYXRlcnMuc2l6ZSgpKQotCQkJZlBvc2l0aW9uVXBkYXRlcnMuYWRkKHVwZGF0ZXIpOwotCQllbHNlCi0JCQlmUG9zaXRpb25VcGRhdGVycy5hZGQoaW5kZXgsIHVwZGF0ZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uKFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlyZW1vdmVQb3NpdGlvbihJRG9jdW1lbnQuREVGQVVMVF9DQVRFR09SWSwgcG9zaXRpb24pOwotCQl9IGNhdGNoIChCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbihqYXZhLmxhbmcuU3RyaW5nLAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0KLQkJaWYgKHBvc2l0aW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGNhdGVnb3J5ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCUxpc3QgYyA9IChMaXN0KSBmUG9zaXRpb25zLmdldChjYXRlZ29yeSk7Ci0JCWlmIChjID09IG51bGwpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCS8vIHJlbW92ZSBiYXNlZCBvbiBpZGVudGl0eSBub3QgZXF1YWxpdHkKLQkJaW50IHNpemUgPSBjLnNpemUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLQkJCWlmIChwb3NpdGlvbiA9PSBjLmdldChpKSkgewotCQkJCWMucmVtb3ZlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCNyZW1vdmVQb3NpdGlvbkNhdGVnb3J5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHRocm93cyBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQotCQlpZiAoY2F0ZWdvcnkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWNvbnRhaW5zUG9zaXRpb25DYXRlZ29yeShjYXRlZ29yeSkpCi0JCQl0aHJvdyBuZXcgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbigpOwotCi0JCWZQb3NpdGlvbnMucmVtb3ZlKGNhdGVnb3J5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQjcmVtb3ZlUG9zaXRpb25VcGRhdGVyKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvblVwZGF0ZXIoSVBvc2l0aW9uVXBkYXRlciB1cGRhdGVyKSB7Ci0JCWZvciAoaW50IGkgPSBmUG9zaXRpb25VcGRhdGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJaWYgKGZQb3NpdGlvblVwZGF0ZXJzLmdldChpKSA9PSB1cGRhdGVyKSB7Ci0JCQkJZlBvc2l0aW9uVXBkYXRlcnMucmVtb3ZlKGkpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogVXBkYXRlcyBhbGwgcG9zaXRpb25zIG9mIGFsbCBjYXRlZ29yaWVzIHRvIHRoZSBjaGFuZ2UgZGVzY3JpYmVkIGJ5IHRoZQotCSAqIGRvY3VtZW50IGV2ZW50LiBBbGwgcmVnaXN0ZXJlZCBkb2N1bWVudCB1cGRhdGVycyBhcmUgY2FsbGVkIGluIHRoZQotCSAqIHNlcXVlbmNlIHRoZXkgaGF2ZSBiZWVuIGFycmFuZ2VkLiBVc2VzIGEgcm9idXN0IGl0ZXJhdG9yLgotCSAqIAotCSAqIEBwYXJhbSBldmVudAotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IGV2ZW50IGRlc2NyaWJpbmcgdGhlIGNoYW5nZSB0byB3aGljaCB0byBhZGFwdAotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9ucwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVBvc2l0aW9ucyhEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoZlBvc2l0aW9uVXBkYXRlcnMpOwotCQlJdGVyYXRvciBlID0gbGlzdC5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlQb3NpdGlvblVwZGF0ZXIgdSA9IChJUG9zaXRpb25VcGRhdGVyKSBlLm5leHQoKTsKLQkJCXUudXBkYXRlKGV2ZW50KTsKLQkJfQotCX0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JRXhlY3V0aW9uRGVsZWdhdGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9JRXhlY3V0aW9uRGVsZWdhdGFibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYmViNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSUV4ZWN1dGlvbkRlbGVnYXRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklFeGVjdXRpb25EZWxlZ2F0ZTsKLQotcHVibGljIGludGVyZmFjZSBJRXhlY3V0aW9uRGVsZWdhdGFibGUgewotCi0Jdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZXhlY3V0aW9uRGVsZWdhdGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L0lSZWdpb25Db21wYXJpYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSVJlZ2lvbkNvbXBhcmlibGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzMDQzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSVJlZ2lvbkNvbXBhcmlibGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVJlZ2lvbkNvbXBhcmlibGUgewotCWJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKTsKLQotCWJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhhYWY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9Kb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5JTG9jazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuSUV4ZWN1dGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5JTG9ja2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgSm9iU2FmZVN0cnVjdHVyZWREb2N1bWVudCBleHRlbmRzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IGltcGxlbWVudHMgSUV4ZWN1dGlvbkRlbGVnYXRhYmxlLCBJTG9ja2FibGUgewotCi0JcHJpdmF0ZSBJRXhlY3V0aW9uRGVsZWdhdGUgZkV4ZWN1dGlvbkRlbGVnYXRlOwotCXByaXZhdGUgSUxvY2sgZkxvY2thYmxlID0gUGxhdGZvcm0uZ2V0Sm9iTWFuYWdlcigpLm5ld0xvY2soKTsKLQotCXB1YmxpYyBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JcHVibGljIEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQoUmVnaW9uUGFyc2VyIHBhcnNlcikgewotCQlzdXBlcihwYXJzZXIpOwotCX0KLQotCi0JLyoqCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWNxdWlyZUxvY2soKSB7Ci0JCWdldExvY2tPYmplY3QoKS5hY3F1aXJlKCk7Ci0JfQotCi0JcHJpdmF0ZSBJRXhlY3V0aW9uRGVsZWdhdGUgZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKSB7Ci0JCXJldHVybiBmRXhlY3V0aW9uRGVsZWdhdGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUxvY2thYmxlI2dldExvY2soKQotCSAqLwotCi0JcHVibGljIElMb2NrIGdldExvY2tPYmplY3QoKSB7Ci0JCXJldHVybiBmTG9ja2FibGU7Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgdm9pZCByZWxlYXNlTG9jaygpIHsKLQkJZ2V0TG9ja09iamVjdCgpLnJlbGVhc2UoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjcmVwbGFjZVRleHQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIGludCwgaW50LCBqYXZhLmxhbmcuU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBsYWNlVGV4dChmaW5hbCBPYmplY3QgcmVxdWVzdGVyLCBmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCByZXBsYWNlbWVudExlbmd0aCwgZmluYWwgU3RyaW5nIGNoYW5nZXMsIGZpbmFsIGJvb2xlYW4gaWdub3JlUmVhZE9ubHlTZXR0aW5ncykgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBldmVudCA9IG51bGw7Ci0JCWlmIChnZXRFeGVjdXRpb25EZWxlZ2F0ZSgpID09IG51bGwpIHsKLQkJCS8vIGlmIHRoZSBkZWxlZ2F0ZSBoYXMgbm90IGJlZW4gc2V0LCB3ZSBleGVjdXRlIG9uIGN1cnJlbnQKLQkJCS8vIHRocmVhZCwgbGlrZSAibm9ybWFsIi4gVGhpcyBpcyB0aGUgY2FzZSBmb3Igbm9ybWFsCi0JCQkvLyBub24tZWRpdG9yCi0JCQkvLyB1c2UgKHdoaWNoIHNob3VsZCBzdGlsbCwgdWx0aW1hdGVseSwgYmUgcHJvdGVjdGVkIGJ5Ci0JCQkvLyBhIHNjaGVkdWxpbmcgcnVsZSkuCi0JCQlldmVudCA9IHN1cGVyLnJlcGxhY2VUZXh0KHJlcXVlc3Rlciwgc3RhcnQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjaGFuZ2VzLCBpZ25vcmVSZWFkT25seVNldHRpbmdzKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIElmIGRvY3VtZW50IGlzIGJlaW5nIHVzZWQgYnkgYW4gZWRpdG9yLCBhIHJ1bm5hYmxlIGlzCi0JCQkvLyBjcmVhdGVkLAotCQkJLy8gZXZlbiBpZiBsYXRlciAoaW4gdGhlIGV4ZWN1dGlvbiBkZWxlZ2F0ZSBpbnN0YW5jZSkgaXQgaXMKLQkJCS8vIGRlY2lkZWQKLQkJCS8vIG5vdGhpbmcgc3BlY2lhbCBpcyBuZWVkZWQgKHRoYXQgaXMsIGluIGZhY3QgYmVpbmcgY2FsbGVkCi0JCQkvLyBmcm9tCi0JCQkvLyBlZGl0b3IncyBkaXNwbGF5IHRocmVhZCwgaW4gd2hpY2ggY2FzZSBpdHMganVzdCBleGVjdXRlZCkKLQkJCWZpbmFsIE9iamVjdFtdIHJlc3VsdFNsb3QgPSBuZXcgT2JqZWN0WzFdOwotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IEpvYlNhZmVTdHJ1Y3R1cmVkRG9jdW1lbnQuc3VwZXIucmVwbGFjZVRleHQocmVxdWVzdGVyLCBzdGFydCwgcmVwbGFjZW1lbnRMZW5ndGgsIGNoYW5nZXMsIGlnbm9yZVJlYWRPbmx5U2V0dGluZ3MpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJLy8gc3Ryb25nbHkgYXNzdW1lcyBzeW5jaHJvbm91cyBjYWxsLCB0byAid2FpdCIgZm9yCi0JCQkvLyByZXN1bHRzCi0JCQkvLyBiYXNpY2FsbHkganVzdCByb3V0ZXMgdG8gRGlzcGxheS5zeW5jaEV4ZWMocnVubmFibGUpLAotCQkJLy8gaWYgbm90IGFscmVhZHkgcnVubmluZyBvbiBkaXNwbGF5IHRocmVhZC4KLQkJCWdldEV4ZWN1dGlvbkRlbGVnYXRlKCkuZXhlY3V0ZShydW5uYWJsZSk7Ci0KLQkJCS8vIHRoaXMgcmVtZW1iZXJpbmcgYW5kIHJlLXRocm93aW5nIG9mIGV4Y2VwdGlvbiBpcyBqdXN0IHRvCi0JCQkvLyBnZXQgYW4KLQkJCS8vIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIG9uIG9uZSB0aHJlYWQsIHRvIGJlIHRocm93biBvbgotCQkJLy8gY2FsbGVycwotCQkJLy8gdGhyZWFkLgotCQkJaWYgKHJlc3VsdFNsb3RbMF0gaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigoVGhyb3dhYmxlKSByZXN1bHRTbG90WzBdKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWV2ZW50ID0gKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFeGVjdXRpb25EZWxlZ2F0ZShJRXhlY3V0aW9uRGVsZWdhdGUgZGVsZWdhdGUpIHsKLQkJZkV4ZWN1dGlvbkRlbGVnYXRlID0gZGVsZWdhdGU7Ci0JfQotCi0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChmaW5hbCBPYmplY3QgcmVxdWVzdGVyLCBmaW5hbCBTdHJpbmcgdGhlU3RyaW5nKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJaWYgKGdldEV4ZWN1dGlvbkRlbGVnYXRlKCkgPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIGRlbGVnYXRlIGhhcyBub3QgYmVlbiBzZXQsIHdlIGV4ZWN1dGUgb24gY3VycmVudAotCQkJLy8gdGhyZWFkLCBsaWtlICJub3JtYWwiLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBub3JtYWwKLQkJCS8vIG5vbi1lZGl0b3IKLQkJCS8vIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLCB1bHRpbWF0ZWx5LCBiZSBwcm90ZWN0ZWQgYnkKLQkJCS8vIGEgc2NoZWR1bGluZyBydWxlKS4KLQkJCWV2ZW50ID0gc3VwZXIuc2V0VGV4dChyZXF1ZXN0ZXIsIHRoZVN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBJZiBkb2N1bWVudCBpcyBiZWluZyB1c2VkIGJ5IGFuIGVkaXRvciwgYSBydW5uYWJsZSBpcwotCQkJLy8gY3JlYXRlZCwKLQkJCS8vIGV2ZW4gaWYgbGF0ZXIgKGluIHRoZSBleGVjdXRpb24gZGVsZWdhdGUgaW5zdGFuY2UpIGl0IGlzCi0JCQkvLyBkZWNpZGVkCi0JCQkvLyBub3RoaW5nIHNwZWNpYWwgaXMgbmVlZGVkICh0aGF0IGlzLCBpbiBmYWN0IGJlaW5nIGNhbGxlZAotCQkJLy8gZnJvbQotCQkJLy8gZWRpdG9yJ3MgZGlzcGxheSB0aHJlYWQsIGluIHdoaWNoIGNhc2UgaXRzIGp1c3QgZXhlY3V0ZWQpCi0JCQlmaW5hbCBPYmplY3RbXSByZXN1bHRTbG90ID0gbmV3IE9iamVjdFsxXTsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFNsb3RbMF0gPSBKb2JTYWZlU3RydWN0dXJlZERvY3VtZW50LnN1cGVyLnNldFRleHQocmVxdWVzdGVyLCB0aGVTdHJpbmcpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChUaHJvd2FibGUgZSkgewotCQkJCQkJcmVzdWx0U2xvdFswXSA9IGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9OwotCQkJLy8gc3Ryb25nbHkgYXNzdW1lcyBzeW5jaHJvbm91cyBjYWxsLCB0byAid2FpdCIgZm9yCi0JCQkvLyByZXN1bHRzCi0JCQkvLyBiYXNpY2FsbHkganVzdCByb3V0ZXMgdG8gRGlzcGxheS5zeW5jaEV4ZWMocnVubmFibGUpLAotCQkJLy8gaWYgbm90IGFscmVhZHkgcnVubmluZyBvbiBkaXNwbGF5IHRocmVhZC4KLQkJCWdldEV4ZWN1dGlvbkRlbGVnYXRlKCkuZXhlY3V0ZShydW5uYWJsZSk7Ci0KLQkJCS8vIHRoaXMgcmVtZW1iZXJpbmcgYW5kIHJlLXRocm93aW5nIG9mIGV4Y2VwdGlvbiBpcyBqdXN0IHRvCi0JCQkvLyBnZXQgYW4KLQkJCS8vIGV4Y2VwdGlvbiB0aGF0IG9jY3VycmVkIG9uIG9uZSB0aHJlYWQsIHRvIGJlIHRocm93biBvbgotCQkJLy8gY2FsbGVycwotCQkJLy8gdGhyZWFkLgotCQkJaWYgKHJlc3VsdFNsb3RbMF0gaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigoVGhyb3dhYmxlKSByZXN1bHRTbG90WzBdKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWV2ZW50ID0gKFN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBldmVudDsKLQl9Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlIHNlc3Npb25UeXBlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiBzZXNzaW9uID0gbnVsbDsKLQkJaWYgKGdldEV4ZWN1dGlvbkRlbGVnYXRlKCkgPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIGRlbGVnYXRlIGhhcyBub3QgYmVlbiBzZXQsIHdlIGV4ZWN1dGUgb24gY3VycmVudAotCQkJLy8gdGhyZWFkLCBsaWtlICJub3JtYWwiLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBub3JtYWwKLQkJCS8vIG5vbi1lZGl0b3IKLQkJCS8vIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLCB1bHRpbWF0ZWx5LCBiZSBwcm90ZWN0ZWQgYnkKLQkJCS8vIGEgc2NoZWR1bGluZyBydWxlKS4KLQkJCXNlc3Npb24gPSBpbnRlcm5hbFN0YXJ0UmV3cml0ZVNlc3Npb24oc2Vzc2lvblR5cGUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSWYgZG9jdW1lbnQgaXMgYmVpbmcgdXNlZCBieSBhbiBlZGl0b3IsIGEgcnVubmFibGUgaXMKLQkJCS8vIGNyZWF0ZWQsCi0JCQkvLyBldmVuIGlmIGxhdGVyIChpbiB0aGUgZXhlY3V0aW9uIGRlbGVnYXRlIGluc3RhbmNlKSBpdCBpcwotCQkJLy8gZGVjaWRlZAotCQkJLy8gbm90aGluZyBzcGVjaWFsIGlzIG5lZWRlZCAodGhhdCBpcywgaW4gZmFjdCBiZWluZyBjYWxsZWQKLQkJCS8vIGZyb20KLQkJCS8vIGVkaXRvcidzIGRpc3BsYXkgdGhyZWFkLCBpbiB3aGljaCBjYXNlIGl0cyBqdXN0IGV4ZWN1dGVkKQotCQkJZmluYWwgT2JqZWN0W10gcmVzdWx0U2xvdCA9IG5ldyBPYmplY3RbMV07Ci0JCQlmaW5hbCBEb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZSBmaW5hbFNlc3Npb25UeXBlID0gc2Vzc2lvblR5cGU7Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gaW50ZXJuYWxTdGFydFJld3JpdGVTZXNzaW9uKGZpbmFsU2Vzc2lvblR5cGUpOwotCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gZTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkvLyBzdHJvbmdseSBhc3N1bWVzIHN5bmNocm9ub3VzIGNhbGwsIHRvICJ3YWl0IiBmb3IKLQkJCS8vIHJlc3VsdHMKLQkJCS8vIGJhc2ljYWxseSBqdXN0IHJvdXRlcyB0byBEaXNwbGF5LnN5bmNoRXhlYyhydW5uYWJsZSksCi0JCQkvLyBpZiBub3QgYWxyZWFkeSBydW5uaW5nIG9uIGRpc3BsYXkgdGhyZWFkLgotCQkJZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKS5leGVjdXRlKHJ1bm5hYmxlKTsKLQotCQkJLy8gdGhpcyByZW1lbWJlcmluZyBhbmQgcmUtdGhyb3dpbmcgb2YgZXhjZXB0aW9uIGlzIGp1c3QgdG8KLQkJCS8vIGdldCBhbgotCQkJLy8gZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgb24gb25lIHRocmVhZCwgdG8gYmUgdGhyb3duIG9uCi0JCQkvLyBjYWxsZXJzCi0JCQkvLyB0aHJlYWQuCi0JCQlpZiAocmVzdWx0U2xvdFswXSBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKChUaHJvd2FibGUpIHJlc3VsdFNsb3RbMF0pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2Vzc2lvbiA9IChEb2N1bWVudFJld3JpdGVTZXNzaW9uKSByZXN1bHRTbG90WzBdOwotCQkJfQotCQl9Ci0JCXJldHVybiBzZXNzaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIHN0b3BSZXdyaXRlU2Vzc2lvbihEb2N1bWVudFJld3JpdGVTZXNzaW9uIHNlc3Npb24pIHsKLQkJaWYgKGdldEV4ZWN1dGlvbkRlbGVnYXRlKCkgPT0gbnVsbCkgewotCQkJLy8gaWYgdGhlIGRlbGVnYXRlIGhhcyBub3QgYmVlbiBzZXQsIHdlIGV4ZWN1dGUgb24gY3VycmVudAotCQkJLy8gdGhyZWFkLCBsaWtlICJub3JtYWwiLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBub3JtYWwKLQkJCS8vIG5vbi1lZGl0b3IKLQkJCS8vIHVzZSAod2hpY2ggc2hvdWxkIHN0aWxsLCB1bHRpbWF0ZWx5LCBiZSBwcm90ZWN0ZWQgYnkKLQkJCS8vIGEgc2NoZWR1bGluZyBydWxlKS4KLQkJCWludGVybmFsU3RvcFJld3JpdGVTZXNzaW9uKHNlc3Npb24pOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gSWYgZG9jdW1lbnQgaXMgYmVpbmcgdXNlZCBieSBhbiBlZGl0b3IsIGEgcnVubmFibGUgaXMKLQkJCS8vIGNyZWF0ZWQsCi0JCQkvLyBldmVuIGlmIGxhdGVyIChpbiB0aGUgZXhlY3V0aW9uIGRlbGVnYXRlIGluc3RhbmNlKSBpdCBpcwotCQkJLy8gZGVjaWRlZAotCQkJLy8gbm90aGluZyBzcGVjaWFsIGlzIG5lZWRlZCAodGhhdCBpcywgaW4gZmFjdCBiZWluZyBjYWxsZWQKLQkJCS8vIGZyb20KLQkJCS8vIGVkaXRvcidzIGRpc3BsYXkgdGhyZWFkLCBpbiB3aGljaCBjYXNlIGl0cyBqdXN0IGV4ZWN1dGVkKQotCQkJZmluYWwgT2JqZWN0W10gcmVzdWx0U2xvdCA9IG5ldyBPYmplY3RbMV07Ci0JCQlmaW5hbCBEb2N1bWVudFJld3JpdGVTZXNzaW9uIGZpbmFsU2Vzc2lvbiA9IHNlc3Npb247Ci0JCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpbnRlcm5hbFN0b3BSZXdyaXRlU2Vzc2lvbihmaW5hbFNlc3Npb24pOwotCi0JCQkJCX0KLQkJCQkJY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0JCQkJCQlyZXN1bHRTbG90WzBdID0gZTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQkvLyBzdHJvbmdseSBhc3N1bWVzIHN5bmNocm9ub3VzIGNhbGwsIHRvICJ3YWl0IiBmb3IKLQkJCS8vIHJlc3VsdHMKLQkJCS8vIGJhc2ljYWxseSBqdXN0IHJvdXRlcyB0byBEaXNwbGF5LnN5bmNoRXhlYyhydW5uYWJsZSksCi0JCQkvLyBpZiBub3QgYWxyZWFkeSBydW5uaW5nIG9uIGRpc3BsYXkgdGhyZWFkLgotCQkJZ2V0RXhlY3V0aW9uRGVsZWdhdGUoKS5leGVjdXRlKHJ1bm5hYmxlKTsKLQotCQkJLy8gdGhpcyByZW1lbWJlcmluZyBhbmQgcmUtdGhyb3dpbmcgb2YgZXhjZXB0aW9uIGlzIGp1c3QgdG8KLQkJCS8vIGdldCBhbgotCQkJLy8gZXhjZXB0aW9uIHRoYXQgb2NjdXJyZWQgb24gb25lIHRocmVhZCwgdG8gYmUgdGhyb3duIG9uCi0JCQkvLyBjYWxsZXJzCi0JCQkvLyB0aHJlYWQuCi0JCQlpZiAocmVzdWx0U2xvdFswXSBpbnN0YW5jZW9mIFRocm93YWJsZSkgewotCQkJCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKChUaHJvd2FibGUpIHJlc3VsdFNsb3RbMF0pOwotCQkJfQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9NaW5pbWFsRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkNjNmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvTWluaW1hbERvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmluZ0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVBvc2l0aW9uVXBkYXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLk5vdEltcGxlbWVudGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuUmVnaW9uUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotCi0KLS8qKgotICogUHVyZWx5IGEgZHVtbXkgIm1hcmtlciIgaW5zdGFuY2UgZm9yIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgd2hpY2ggYXJlCi0gKiBjcmVhdGVkIHRlbW9yYXJpbHkgaW4gdGhlIGNvdXJzZSBvZiByZS1wYXJzaW5nLiBQcmltYXJpbHkgYSBwbGFjZSBob2xkZXIsCi0gKiBidXQgY2FuIGJlIG5lZWRlZCB0byBnZXQgdGV4dCBmcm9tLgotICovCi1wdWJsaWMgY2xhc3MgTWluaW1hbERvY3VtZW50IGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudCB7Ci0JcHJpdmF0ZSBTdWJTZXRUZXh0U3RvcmUgZGF0YTsKLQotCS8qKgotCSAqIE1hcmtlZCBwcml2YXRlIHRvIGJlIHN1cmUgbmV2ZXIgY3JlYXRlZCB3aXRob3V0IGRhdGEgYmVpbmcgaW5pdGlhbGl6ZWQuCi0JICogIAotCSAqLwotCXByaXZhdGUgTWluaW1hbERvY3VtZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBNaW5pbWFsRG9jdW1lbnQoU3ViU2V0VGV4dFN0b3JlIGluaXRpYWxDb250ZW50cykgewotCQl0aGlzKCk7Ci0JCWRhdGEgPSBpbml0aWFsQ29udGVudHM7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGREb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGFkZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb24oU3RyaW5nIGNhdGVnb3J5LCBQb3NpdGlvbiBwb3NpdGlvbikgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBCYWRQb3NpdGlvbkNhdGVnb3J5RXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgYWRkUG9zaXRpb25VcGRhdGVyKElQb3NpdGlvblVwZGF0ZXIgdXBkYXRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgZG9jdW1lbnRBZGFwdGVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgY2FsbGVkIGZyb20gbm90aWZpZXIgbG9vcCBpbmFwcHJvcHJpYXRlbHkKLQkJLy8JdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyBpbnQgY29tcHV0ZUluZGV4SW5DYXRlZ29yeShTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiwgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgY29tcHV0ZU51bWJlck9mTGluZXMoU3RyaW5nIHRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNQb3NpdGlvbkNhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc1JlYWRPbmx5KGludCBzdGFydE9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBmaXJlTmV3RG9jdW1lbnQoT2JqZWN0IHJlcXVlc3RlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGRhdGEuZ2V0KDAsIGRhdGEuZ2V0TGVuZ3RoKCkpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJcmVzdWx0ID0gZGF0YS5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChTdHJpbmdJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIGFkYXB0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGNoYXIgZ2V0Q2hhcihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlyZXR1cm4gZGF0YS5nZXQob2Zmc2V0KTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBnZXREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQkvLyB0ZW1wIGZpeAotCQlyZXR1cm4gbnVsbDsKLQkJLy8JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsKLQl9Ci0KLQlwdWJsaWMgRW5jb2RpbmdNZW1lbnRvIGdldEVuY29kaW5nTWVtZW50bygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldExlZ2FsTGluZURlbGltaXRlcnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZGF0YS5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZlcmVkTGluZURlbGltaXRlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMaW5lRGVsaW1pdGVyKGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVJlZ2lvbiBnZXRMaW5lSW5mb3JtYXRpb24oaW50IGxpbmUpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJUmVnaW9uIGdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGluZUxlbmd0aChpbnQgbGluZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRMaW5lT2Zmc2V0KGludCBsaW5lKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExpbmVPZk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZMaW5lcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZkxpbmVzKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVR5cGVkUmVnaW9uIGdldFBhcnRpdGlvbihpbnQgb2Zmc2V0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiQW4gaW5zdGFuY2Ugb2YgTWluaW1hbERvY3VtZW50IHdhcyBhc2tlZCBmb3IgaXRzIHBhcnRpdGlvbiwgc29tZXRpbWUgaW5kaWNhdGluZyBhIGRlbGV0ZWQgcmVnaW9uIHdhcyBiZWluZyBhY2Nlc3NlZC4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmV3IFR5cGVkUmVnaW9uKDAsMCwgInVuZGVmaW5lZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldFBvc2l0aW9uQ2F0ZWdvcmllcygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFBvc2l0aW9uW10gZ2V0UG9zaXRpb25zKFN0cmluZyBjYXRlZ29yeSkgdGhyb3dzIEJhZFBvc2l0aW9uQ2F0ZWdvcnlFeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVBvc2l0aW9uVXBkYXRlcltdIGdldFBvc2l0aW9uVXBkYXRlcnMoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGdldFJlZ2lvbkxpc3QoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBnZXRSZVBhcnNlcigpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZGF0YS5nZXQoMCwgZGF0YS5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50I2dldFVuZG9NYW5hZ2VyKCkKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgZ2V0VW5kb01hbmFnZXIoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIGluc2VydFBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIsIGludCBpbmRleCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtYWtlUmVhZE9ubHkoaW50IHN0YXJ0T2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCS8vIFRPRE86IHRoaXMgaXMgY2FsbGVkIGZyb20gbm90aWZpZXIgbG9vcCBpbmFwcHJvcHJpYXRlbHkKLQkJLy8JdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IG5ld0luc3RhbmNlKCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3JlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2Uob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uLklSZXBsYWNlKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UoSURvY3VtZW50TGlzdGVuZXIgb3duZXIsIElSZXBsYWNlIHJlcGxhY2UpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAkJCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRBYm91dFRvQ2hhbmdlTGlzdGVuZXIoSU1vZGVsQWJvdXRUb0JlQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVEb2N1bWVudENoYW5naW5nTGlzdGVuZXIoSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURvY3VtZW50TGlzdGVuZXIoSURvY3VtZW50TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lcihJRG9jdW1lbnRQYXJ0aXRpb25pbmdMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihQb3NpdGlvbiBwb3NpdGlvbikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVQb3NpdGlvbihTdHJpbmcgY2F0ZWdvcnksIFBvc2l0aW9uIHBvc2l0aW9uKSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB0aHJvd3MgQmFkUG9zaXRpb25DYXRlZ29yeUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVBvc2l0aW9uVXBkYXRlcihJUG9zaXRpb25VcGRhdGVyIHVwZGF0ZXIpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJlbm90aWZpZWREb2N1bWVudExpc3RlbmVyKElEb2N1bWVudExpc3RlbmVyIGRvY3VtZW50QWRhcHRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZXBsYWNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0ZXh0KSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8JCWRhdGEucmVwbGFjZShvZmZzZXQsIGxlbmd0aCwgdGV4dCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCNyZXBsYWNlVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgaW50LCBpbnQsIGphdmEubGFuZy5TdHJpbmcsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGxhY2VUZXh0KE9iamVjdCBzb3VyY2UsIGludCBvbGRTdGFydCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBTdHJpbmcgcmVxdWVzdGVkQ2hhbmdlLCBib29sZWFuIGlnbm9yZVJlYWRPbmx5U2V0dGluZykgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3Jlc3VtZVBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN1bWVQb3N0Tm90aWZpY2F0aW9uUHJvY2Vzc2luZygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBzZWFyY2goaW50IHN0YXJ0T2Zmc2V0LCBTdHJpbmcgZmluZFN0cmluZywgYm9vbGVhbiBmb3J3YXJkU2VhcmNoLCBib29sZWFuIGNhc2VTZW5zaXRpdmUsIGJvb2xlYW4gd2hvbGVXb3JkKSB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHRleHQpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JCS8vCQlkYXRhLnNldCh0ZXh0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmVyKElEb2N1bWVudFBhcnRpdGlvbmVyIHBhcnRpdGlvbmVyKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nTWVtZW50byhFbmNvZGluZ01lbWVudG8gZW5jb2RpbmdNZW1lbnRvKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZWZlcnJlZExpbmVEZWxpbWl0ZXIoU3RyaW5nIGRlbGltaXRlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgc2V0VGV4dChPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgYWxsVGV4dCkgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQjc2V0VW5kb01hbmFnZXIob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRVbmRvTWFuYWdlcihJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlcikgewotCQl0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uI3N0YXJ0U2VxdWVudGlhbFJld3JpdGUoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdGFydFNlcXVlbnRpYWxSZXdyaXRlKGJvb2xlYW4gbm9ybWFsaXplKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFBvc3ROb3RpZmljYXRpb25Qcm9jZXNzaW5nKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wUG9zdE5vdGlmaWNhdGlvblByb2Nlc3NpbmcoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb24jc3RvcFNlcXVlbnRpYWxSZXdyaXRlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdG9wU2VxdWVudGlhbFJld3JpdGUoKSB7Ci0JCXRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGluZURlbGltaXRlcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQcmVmZXJyZWRMaW5lRGVsaW1pdGVyKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaW5lRGVsaW1pdGVyKFN0cmluZyBkZWxpbWl0ZXIpIHsKLQkJCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXhjZXB0aW9uKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1JlYWRPbmx5UG9zaXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9SZWFkT25seVBvc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYjViNjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1JlYWRPbmx5UG9zaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotCi1jbGFzcyBSZWFkT25seVBvc2l0aW9uIGV4dGVuZHMgUG9zaXRpb24gewotCXByaXZhdGUgYm9vbGVhbiBmSW5jbHVkZVN0YXJ0T2Zmc2V0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgUmVhZE9ubHlQb3NpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBib29sZWFuIGluY2x1ZGVTdGFydCkgewotCQlzdXBlcihvZmZzZXQsIGxlbmd0aCk7Ci0JCWZJbmNsdWRlU3RhcnRPZmZzZXQgPSBpbmNsdWRlU3RhcnQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gb3ZlcmxhcHNXaXRoKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJYm9vbGVhbiBvdmVybGFwc1dpdGggPSBzdXBlci5vdmVybGFwc1dpdGgob2Zmc2V0LCBsZW5ndGgpOwotCQlpZiAob3ZlcmxhcHNXaXRoKSB7Ci0JCQkvKgotCQkJICogQlVHMTU3NTI2IElmIGF0IHRoZSBzdGFydCBvZiB0aGUgcmVhZCBvbmx5IHJlZ2lvbiBhbmQgbGVuZ3RoID0KLQkJCSAqIDAgbW9zdCBsaWtlbHkgYXNraW5nIHRvIGluc2VydCBhbmQgd2FudCB0byBhbGwgaW5zZXJ0aW5nIGJlZm9yZQotCQkJICogcmVhZCBvbmx5IHJlZ2lvbgotCQkJICovCi0JCQlpZiAoZkluY2x1ZGVTdGFydE9mZnNldCAmJiAobGVuZ3RoID09IDApICYmICh0aGlzLmxlbmd0aCAhPSAwKSAmJiAob2Zmc2V0ID09IHRoaXMub2Zmc2V0KSkgewotCQkJCW92ZXJsYXBzV2l0aCA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCXJldHVybiBvdmVybGFwc1dpdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDljN2I1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5GaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5vQ2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBjZW50cmFsaXplZCBwbGFjZSB0byBwdXQgInJlcGFyc2luZyIgbG9naWMuIFRoaXMgaXMKLSAqIHRoZSBsb2dpYyB0aGF0IHJlcGFyc2VzIHRoZSB0ZXh0IGluY3JlbWVudGFsbHksIGFzIGEgdXNlciB0eXBlcyBpbiBuZXcKLSAqIGNoYXJhY3RlcnMsIG9yIERPTSBub2RlcyBhcmUgaW5zZXJ0ZWQgb3IgZGVsZXRlZC4gTm90ZTogaXQgaXMgbm90IGEgdGhyZWFkCi0gKiBzYWZlIGNsYXNzLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQgPSBudWxsOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIGRvdWJsZVF1b3RlID0gbmV3IFN0cmluZyhuZXcgY2hhcltdeydcIid9KTsKLQlwcm90ZWN0ZWQgZmluYWwgQ29yZU5vZGVMaXN0IEVNUFRZX0xJU1QgPSBuZXcgQ29yZU5vZGVMaXN0KCk7Ci0JcHJvdGVjdGVkIFN0cmluZyBmQ2hhbmdlczsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZEZWxldGVkVGV4dDsKLQotCXByaXZhdGUgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgZkZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgaW50IGZMZW5ndGhEaWZmZXJlbmNlOwotCXByb3RlY3RlZCBpbnQgZkxlbmd0aFRvUmVwbGFjZTsKLQlwcm90ZWN0ZWQgT2JqZWN0IGZSZXF1ZXN0ZXI7Ci0JcHJvdGVjdGVkIGludCBmU3RhcnQ7Ci0JLy8gbm90ZTogdGhpcyBpcyB0aGUgaW1wbCBjbGFzcyBvZiBJU3RydWN0dXJlZERvY3VtZW50LCBub3QgdGhlIGludGVyZmFjZQotCS8vIEZVVFVSRV9UT19ETzogSSBiZWxpZXZlIHNvbWUgb2YgdGhlc2UgY2FuIGJlIG1hZGUgcHJpdmF0ZSBub3cuPwotCXByb3RlY3RlZCBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCBmU3RydWN0dXJlZERvY3VtZW50OwotCi0JLyoqCi0JICogdmFyaWFibGUgdXNlZCBpbiBhbnRpY2lhcGF0aW9uIG9mIG11bHRpdGhyZWFkaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJzaW5nOwotCWZpbmFsIHByaXZhdGUgU3RyaW5nIHNpbmdsZVF1b3RlID0gbmV3IFN0cmluZyhuZXcgY2hhcltdeydcJyd9KTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgX2NoZWNrQmxvY2tOb2RlTGlzdChMaXN0IGJsb2NrVGFnTGlzdCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoYmxvY2tUYWdMaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYmxvY2tUYWdMaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXIgYmxvY2tUYWcgPSAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuQmxvY2tNYXJrZXIpIGJsb2NrVGFnTGlzdC5nZXQoaSk7Ci0JCQkJU3RyaW5nIHRhZ05hbWUgPSBibG9ja1RhZy5nZXRUYWdOYW1lKCk7Ci0JCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbE5hbWUoIjwiICsgdGFnTmFtZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxOYW1lKCI8LyIgKyB0YWdOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdXRpbGl0eSBmb3IgY2hlY2tpbmcgZm9yIGNyaXRpY2FsIHdvcmQgc3VjaCBhcyAiIDxTQ1JJUFQ+IgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgX2NoZWNrRm9yQ3JpdGljYWxXb3JkKFN0cmluZyBjcml0aWNhbFRhcmdldCwgYm9vbGVhbiBjaGVja0VuZCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlpbnQgZG9jdW1lbnRMZW5ndGggPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpOwotCQlpbnQgcHJvcExlbiA9IGZMZW5ndGhUb1JlcGxhY2U7Ci0JCWlmIChwcm9wTGVuID4gZG9jdW1lbnRMZW5ndGgpCi0JCQlwcm9wTGVuID0gZG9jdW1lbnRMZW5ndGg7Ci0JCWludCBzdGFydE5laWdoYm9yaG9vZCA9IGZTdGFydCAtIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpOwotCQlpbnQgYWRqdXN0SW5zZXJ0ID0gMDsKLQkJaWYgKHN0YXJ0TmVpZ2hib3Job29kIDwgMCkgewotCQkJYWRqdXN0SW5zZXJ0ID0gMCAtIHN0YXJ0TmVpZ2hib3Job29kOwotCQkJc3RhcnROZWlnaGJvcmhvb2QgPSAwOwotCQl9Ci0JCWludCBlbmROZWlnaGJvcmhvb2QgPSBmU3RhcnQgKyBmTGVuZ3RoVG9SZXBsYWNlICsgY3JpdGljYWxUYXJnZXQubGVuZ3RoKCkgLSAxOwotCQlpZiAoZW5kTmVpZ2hib3Job29kID4gZG9jdW1lbnRMZW5ndGgpCi0JCQllbmROZWlnaGJvcmhvb2QgPSBkb2N1bWVudExlbmd0aCAtIDE7Ci0JCWludCBvbGRsZW4gPSBlbmROZWlnaGJvcmhvb2QgLSBzdGFydE5laWdoYm9yaG9vZDsgLy8gKyAxOwotCQlpZiAob2xkbGVuICsgc3RhcnROZWlnaGJvcmhvb2QgPiBkb2N1bWVudExlbmd0aCkgewotCQkJb2xkbGVuID0gZG9jdW1lbnRMZW5ndGggLSBzdGFydE5laWdoYm9yaG9vZDsKLQkJfQotCQlTdHJpbmcgb2xkVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KHN0YXJ0TmVpZ2hib3Job29kLCBvbGRsZW4pOwotCQlTdHJpbmcgcGVlayA9IFN0cmluZ1V0aWxzLnBhc3RlKG9sZFRleHQsIGZDaGFuZ2VzLCBjcml0aWNhbFRhcmdldC5sZW5ndGgoKSAtIGFkanVzdEluc2VydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCWJvb2xlYW4gaXNDcml0aWNhbFN0cmluZyA9IGNoZWNrVGFnTmFtZXMob2xkVGV4dCwgY3JpdGljYWxUYXJnZXQsIGNoZWNrRW5kKTsKLQkJYm9vbGVhbiB0b0JlQ3JpdGljYWxTdHJpbmcgPSBjaGVja1RhZ05hbWVzKHBlZWssIGNyaXRpY2FsVGFyZ2V0LCBjaGVja0VuZCk7Ci0JCWlmICgoaXNDcml0aWNhbFN0cmluZyAhPSB0b0JlQ3JpdGljYWxTdHJpbmcpIHx8IC8vIE9SIGlmIGJvdGggYXJlCi0JCQkJCS8vIGNyaXRpY2FsIGFuZCB0aGVyZSdzCi0JCQkJCS8vIGEgY2hhbmdlIGluIHRoZSBlbmQKLQkJCQkJLy8gdGFnICgnPicpCi0JCQkJCSgoaXNDcml0aWNhbFN0cmluZyAmJiB0b0JlQ3JpdGljYWxTdHJpbmcpICYmIChjaGFuZ2VJbklzRW5kZWRTdGF0ZShvbGRUZXh0LCBwZWVrKSkpKSB7Ci0JCQkvLyBpZiBpdCBpbnZvbHZlcyBhIGNoYW5nZSBvZiBhIGNyaXRpY2FsIHN0cmluZyAobWFraW5nIG9uZSB3aGVyZQotCQkJLy8gdGhlcmUgd2Fzbid0LCBvciByZW1vdmluZwotCQkJLy8gb25lIHdoZXJlIHRoZXJlIHdhcyBvbmUpIHRoZW4gcmVwYXJzZSBldmVydGhpbmcuCi0JCQlyZXN1bHQgPSByZXBhcnNlKDAsIGRvY3VtZW50TGVuZ3RoIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBfY29tcHV0ZVN0YXJ0T2ZEaWZmZXJlbmNlcyhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlpbnQgc3RhcnRPZkRpZmZlcmVuY2VzID0gLTE7Ci0JCWludCBuZXdOb2Rlc0xlbmd0aCA9IG5ld05vZGVzLmdldExlbmd0aCgpOwotCQlib29sZWFuIGZvdW5kRGlmZmVyZW5jZSA9IGZhbHNlOwotCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJLy8gd2UnbGwgY29udHJvbCBvdXIgbG9vcCBiYXNlZCBvbiB0aGUgb2xkIExpc3QgbGVuZ3RoCi0JCWludCBvbGROb2Rlc0xlbmd0aCA9IG9sZE5vZGVzLmdldExlbmd0aCgpOwotCQkvLyBiZSBzdXJlIHRvIGNoZWNrICdkb25lJyBmaXJzdCwgc28gc3RhcnRPZkRpZmZlcmVuY2VzIGlzbid0Ci0JCS8vIGljcmVtZW50ZWQgaWYgZG9uZSBpcyB0cnVlCi0JCWRvbmUgOiB3aGlsZSAoKCFkb25lKSAmJiAoKytzdGFydE9mRGlmZmVyZW5jZXMgPCBvbGROb2Rlc0xlbmd0aCkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSA9IG9sZE5vZGVzLml0ZW0oc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCS8vIHRoaXMgbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbiBpcyB0byBjaGVjayB0byBiZSBzdXJlIHRoZSBub2RlIGlzCi0JCQkvLyBpbmZhY3QgYSBjYW5kaWRhdGUKLQkJCS8vIHRvIGJlIGNvbnNpZGVyZWQgYXMgIm9sZCIuIFRoaXMgY2hlY2sgaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZQotCQkJLy8gd2hlcmUgc29tZQotCQkJLy8gdGV4dCBpcyByZXBsYWNlaW5nIHRleHQgdGhhdAotCQkJLy8gYXBwZWFycyBpZGVudGljYWwsIGJ1dCBpcyBhIGRpZmZlcmVudCBpbnN0YW5jZS4gRm9yIGV4YW1wbGUsIGlmCi0JCQkvLyB0aGUgdGV4dAotCQkJLy8gaXMgPFA+PEI+PC9CPjwvUD4gYW5kIDxCPjwvQj4gaXMgaW5zZXJ0ZWQgYXQgcG9zdGlvbiAzLAotCQkJLy8gcmVzdWx0aW5nIGluIDxQPjxCPjwvQj48Qj48L0I+PC9QPgotCQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlCi0JCQkvLyBmaXJzdCA8Qj4gdG8gYmUgY29uc2lkZXJlZCBvbGQgLi4uIGl0IGlzIHRoZSBuZXcgb25lLCB0aGUKLQkJCS8vIHNlY29uZAotCQkJLy8gPEI+IGlzIHRoZSBvbGQgb25lLgotCQkJaWYgKF9sZXNzVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGUpKSB7Ci0JCQkJLy8gYmUgc3VyZSB0byBjaGVjayB0aGF0IHdlIGhhdmUgbmV3IG5vZGVzIHRvIGNvbXBhcmUgYWdhaW5zdC4KLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gbmV3Tm9kZXNMZW5ndGgpIHsKLQkJCQkJZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCQkJCWRvbmUgPSB0cnVlOwotCQkJCQljb250aW51ZSBkb25lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vCi0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG5ld05vZGVzLml0ZW0oc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCQkJLy8gbm90ZTogc2hpZnQgaXMgMCB3aGlsZSBhdCBiZWdpbm5pbmcgb2YgbGlzdCwgYmVmb3JlIHRoZQotCQkJCQkvLyBpbnNlcnRpb24gKG9yIGRlbGV0aW9uKSBwb2ludC4gQWZ0ZXIgdGhhdCwgaXQgaXMKLQkJCQkJLy8gZlN0YXJ0K2ZMZW5ndGhEaWZmZXJlbmNlCi0JCQkJCWlmICghKG9sZE5vZGUuc2FtZUFzKG5ld05vZGUsIDApKSkgewotCQkJCQkJZm91bmREaWZmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJY29udGludWUgZG9uZTsKLQkJCQkJfSBlbHNlIHsgLy8gaWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZQotCQkJCQkJLy8gb2xkIG9uZSwgc28KLQkJCQkJCS8vIHdlIG5lZWQgdG8gYmUgc3VyZSBpdHMgcGFyZW50RG9jdW1lbnQgaXMgc2V0IGJhY2sKLQkJCQkJCS8vIHRvCi0JCQkJCQkvLyB0aGUgcmlnaHQgaW5zdGFuY2UKLQkJCQkJCW9sZE5vZGUuc2V0UGFyZW50RG9jdW1lbnQoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIGRpZG4ndCBsaXRlcmFsbHkgZmluZCBhIGRpZmZlcmVuY2UsIGJ1dCB3ZSBjb3VudCBpdCBhcwotCQkJCS8vIHN1Y2ggYnkgaW1wbGljYXRpb24KLQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgbGl0ZXJhbGx5IGZvdW5kIGEgZGlmZmVyZW5jZSwgdGhlbiBhbGwgaXMgb2sgYW5kIHdlIGNhbgotCQkvLyByZXR1cm4KLQkJLy8gaXQuCi0JCS8vIGlmIHdlIGRpZCBub3QgbGl0ZXJhbGx5IGZpbmQgb25lLCB0aGVuIHdlIGhhdmUgdG8gZGVjaWRlIHdoeS4KLQkJaWYgKCFmb3VuZERpZmZlcmVuY2UpIHsKLQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA9PSBvbGROb2Rlc0xlbmd0aCkgeyAvLyB0aGVuIGxpc3RzIGFyZQotCQkJCS8vIGlkZW50aWNhbAotCQkJCS8vIChhbmQgbWF5IGJlIG9mIHplcm8KLQkJCQkvLyBsZW5ndGgpCi0JCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gLTE7Ci0JCQl9IGVsc2UgewotCQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA+IG9sZE5vZGVzTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCS8vIGlkZW50aWNhbCBleGNlcHQgZm9yCi0JCQkJCS8vIG5ld05vZGVzIGFkZGVkCi0JCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG9sZE5vZGVzTGVuZ3RoOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2Rlc0xlbmd0aCA8IG9sZE5vZGVzTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCQkvLyBpZGVudGljYWwgZXhjZXB0Ci0JCQkJCQkvLyBmb3Igb2xkIE5vZGVzCi0JCQkJCQkvLyBkZWxldGVkCi0JCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdOb2Rlc0xlbmd0aDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhcnRPZkRpZmZlcmVuY2VzOwotCX0KLQotCXByaXZhdGUgaW50IF9jb21wdXRlU3RhcnRPZkRpZmZlcmVuY2VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZVBhcmFtLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlUGFyYW0sIElUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zKSB7Ci0JCWludCBzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJaW50IG5ld1JlZ2lvbnNMZW5ndGggPSBuZXdSZWdpb25zLnNpemUoKTsKLQkJYm9vbGVhbiBmb3VuZERpZmZlcmVuY2UgPSBmYWxzZTsKLQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCS8vIHdlJ2xsIGNvbnRyb2wgb3VyIGxvb3AgYmFzZWQgb24gdGhlIG9sZCBMaXN0IGxlbmd0aAotCQlpbnQgb2xkUmVnaW9uc0xlbmd0aCA9IG9sZFJlZ2lvbnMuc2l6ZSgpOwotCQkvLyBiZSBzdXJlIHRvIGNoZWNrICdkb25lJyBmaXJzdCwgc28gc3RhcnRPZkRpZmZlcmVuY2VzIGlzbid0Ci0JCS8vIGljcmVtZW50ZWQgaWYgZG9uZSBpcyB0cnVlCi0JCWRvbmUgOiB3aGlsZSAoKCFkb25lKSAmJiAoKytzdGFydE9mRGlmZmVyZW5jZXMgPCBvbGRSZWdpb25zTGVuZ3RoKSkgewotCQkJSVRleHRSZWdpb24gb2xkUmVnaW9uID0gb2xkUmVnaW9ucy5nZXQoc3RhcnRPZkRpZmZlcmVuY2VzKTsKLQkJCS8vIHRoaXMgbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbiBpcyB0byBjaGVjayB0byBiZSBzdXJlIHRoZSBub2RlIGlzCi0JCQkvLyBpbmZhY3QgYSBjYW5kaWRhdGUKLQkJCS8vIHRvIGJlIGNvbnNpZGVyZWQgYXMgIm9sZCIuIFRoaXMgY2hlY2sgaXMgaW1wb3J0YW50IGZvciB0aGUgY2FzZQotCQkJLy8gd2hlcmUgc29tZQotCQkJLy8gdGV4dCBpcyByZXBsYWNlaW5nIHRleHQgdGhhdAotCQkJLy8gYXBwZWFycyBpZGVudGljYWwsIGJ1dCBpcyBhIGRpZmZlcmVudCBpbnN0YW5jZS4gRm9yIGV4YW1wbGUsIGlmCi0JCQkvLyB0aGUgdGV4dAotCQkJLy8gaXMgPFA+PEI+PC9CPjwvUD4gYW5kIDxCPjwvQj4gaXMgaW5zZXJ0ZWQgYXQgcG9zdGlvbiAzLAotCQkJLy8gcmVzdWx0aW5nIGluIDxQPjxCPjwvQj48Qj48L0I+PC9QPgotCQkJLy8gd2UgZG8gbm90IHdhbnQgdGhlCi0JCQkvLyBmaXJzdCA8Qj4gdG8gYmUgY29uc2lkZXJlZCBvbGQgLi4uIGl0IGlzIHRoZSBuZXcgb25lLCB0aGUKLQkJCS8vIHNlY29uZAotCQkJLy8gPEI+IGlzIHRoZSBvbGQgb25lLgotCQkJaWYgKF9sZXNzVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGVQYXJhbSwgb2xkUmVnaW9uKSkgewotCQkJCS8vIGJlIHN1cmUgdG8gY2hlY2sgdGhhdCB3ZSBoYXZlIG5ldyBub2RlcyB0byBjb21wYXJlIGFnYWluc3QuCi0JCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IG5ld1JlZ2lvbnNMZW5ndGgpIHsKLQkJCQkJZm91bmREaWZmZXJlbmNlID0gZmFsc2U7Ci0JCQkJCWRvbmUgPSB0cnVlOwotCQkJCQljb250aW51ZSBkb25lOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vCi0JCQkJCUlUZXh0UmVnaW9uIG5ld1JlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KHN0YXJ0T2ZEaWZmZXJlbmNlcyk7Ci0JCQkJCS8vIG5vdGU6IHNoaWZ0IGlzIDAgd2hpbGUgYXQgYmVnaW5uaW5nIG9mIGxpc3QsIGJlZm9yZSB0aGUKLQkJCQkJLy8gaW5zZXJ0aW9uIChvciBkZWxldGlvbikgcG9pbnQuIEFmdGVyIHRoYXQsIGl0IGlzCi0JCQkJCS8vIGZTdGFydCtmTGVuZ3RoRGlmZmVyZW5jZQotCQkJCQlpZiAoIShvbGROb2RlUGFyYW0uc2FtZUFzKG9sZFJlZ2lvbiwgbmV3Tm9kZVBhcmFtLCBuZXdSZWdpb24sIDApKSkgewotCQkJCQkJZm91bmREaWZmZXJlbmNlID0gdHJ1ZTsKLQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJY29udGludWUgZG9uZTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGlmIHRoZXkgYXJlIGVxdWFsLCB0aGVuIHdlIHdpbGwgYmUga2VlcGluZyB0aGUgb2xkCi0JCQkJCQkvLyBvbmUuCi0JCQkJCQkvLyB1bmxpa2UgdGhlIGZsYXRub2RlIGNhc2UsIHRoZXJlIGlzIG5vIHJlYXNvbiB0bwotCQkJCQkJLy8gdXBkYXRlCi0JCQkJCQkvLyB0aGUgdGV4dHN0b3JlLCBzaW5jZSBpdHMgdGhlIHNhbWUgdGV4dCBzdG9yZSBpbgotCQkJCQkJLy8gZWl0aGVyIGNhc2UKLQkJCQkJCS8vIChzaW5jZSBpdHMgdGhlIHNhbWUgZmxhdG5vZGUpCi0JCQkJCQkvL29sZFJlZ2lvbi5zZXRUZXh0U3RvcmUoZlN0cnVjdHVyZWREb2N1bWVudC5wYXJlbnREb2N1bWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIHdlIGRpZG4ndCBsaXRlcmFsbHkgZmluZCBhIGRpZmZlcmVuY2UsIGJ1dCB3ZSBjb3VudCBpdCBhcwotCQkJCS8vIHN1Y2ggYnkgaW1wbGljYXRpb24KLQkJCQlmb3VuZERpZmZlcmVuY2UgPSB0cnVlOwotCQkJCWRvbmUgPSB0cnVlOwotCQkJCWNvbnRpbnVlIGRvbmU7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgd2UgbGl0ZXJhbGx5IGZvdW5kIGEgZGlmZmVyZW5jZSwgdGhlbiBhbGwgaXMgb2sgYW5kIHdlIGNhbgotCQkvLyByZXR1cm4KLQkJLy8gaXQuCi0JCS8vIGlmIHdlIGRpZCBub3QgbGl0ZXJhbGx5IGZpbmQgb25lLCB0aGVuIHdlIGhhdmUgdG8gZGVjaWRlIHdoeS4KLQkJaWYgKCFmb3VuZERpZmZlcmVuY2UpIHsKLQkJCWlmIChuZXdSZWdpb25zTGVuZ3RoID09IG9sZFJlZ2lvbnNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cyBhcmUKLQkJCQkvLyBpZGVudGljYWwgKGFuZCBtYXkKLQkJCQkvLyBiZSBvZiB6ZXJvIGxlbmd0aCkKLQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSAtMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG5ld1JlZ2lvbnNMZW5ndGggPiBvbGRSZWdpb25zTGVuZ3RoKSB7IC8vIHRoZW4gbGlzdHMgYXJlCi0JCQkJCS8vIGlkZW50aWNhbCBleGNlcHQKLQkJCQkJLy8gZm9yIG5ld1JlZ2lvbnMKLQkJCQkJLy8gYWRkZWQKLQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gb2xkUmVnaW9uc0xlbmd0aDsKLQkJCQl9IGVsc2UgewotCQkJCQlpZiAobmV3UmVnaW9uc0xlbmd0aCA8IG9sZFJlZ2lvbnNMZW5ndGgpIHsgLy8gdGhlbiBsaXN0cwotCQkJCQkJLy8gYXJlIGlkZW50aWNhbAotCQkJCQkJLy8gZXhjZXB0IGZvcgotCQkJCQkJLy8gb2xkIE5vZGVzCi0JCQkJCQkvLyBkZWxldGVkCi0JCQkJCQlzdGFydE9mRGlmZmVyZW5jZXMgPSBuZXdSZWdpb25zTGVuZ3RoOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdGFydE9mRGlmZmVyZW5jZXM7Ci0JfQotCi0JLyoqCi0JICogUGFydCAxIG9mIDIgc3RlcHMgdG8gZG8gYSBjb3JlX3JlcGFyc2UKLQkgKiAKLQkgKiBQYXJzZXMgYSBwb3J0aW9uIG9mIHRoZSBjdXJyZW50IHRleHQgaW4gdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgYW5kCi0JICogcmV0dXJucyB0aGUgcmF3IHJlc3VsdAotCSAqLwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBfY29yZV9yZXBhcnNlX3RleHQoaW50IHJlc2NhblN0YXJ0LCBpbnQgcmVzY2FuRW5kKSB7Ci0JCWZTdHJ1Y3R1cmVkRG9jdW1lbnQucmVzZXRQYXJzZXIocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCk7Ci0JCXJldHVybiBmU3RydWN0dXJlZERvY3VtZW50LmdldFBhcnNlcigpLmdldERvY3VtZW50UmVnaW9ucygpOwotCX0KLQotCS8qKgotCSAqIFBhcnQgMiBvZiAyIHN0ZXBzIHRvIGRvIGEgY29yZV9yZXBhcnNlCi0JICogCi0JICogSW50ZWdyYXRlcyBhIGxpc3Qgb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudAotCSAqIHRleHQgY29udGVudHMgb2YgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgaW50byB0aGUgSVN0cnVjdHVyZWREb2N1bWVudAotCSAqIGRhdGEgc3RydWN0dXJlCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBfY29yZV9yZXBhcnNlX3VwZGF0ZV9tb2RlbChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld05vZGVzSGVhZCwgaW50IHJlc2NhblN0YXJ0LCBpbnQgcmVzY2FuRW5kLCBDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIGJvb2xlYW4gZmlyc3RUaW1lKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBuZXdOb2RlcyA9IG51bGw7Ci0JCS8vIHJlc2NhbgotCQluZXdOb2RlcyA9IG5ldyBDb3JlTm9kZUxpc3QobmV3Tm9kZXNIZWFkKTsKLQkJLy8gYWRqdXN0IG91ciBuZXdOb2RlIGNoYWluIHNvIHRoZSBvZmZzZXQgcG9zaXRpb25zIG1hdGNoCi0JCS8vIG91ciB0ZXh0IHN0b3JlIChub3QgdGhlIHNpbXBsZSBzdHJpbmcgb2YgdGV4dCByZXBhcnNlZCkKLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuYWRqdXN0U3RhcnQobmV3Tm9kZXNIZWFkLCByZXNjYW5TdGFydCk7Ci0JCS8vIGluaXRpYWxpemUgdGhlIHBhcmVudERvY3VtZW50IHZhcmlhYmxlIG9mIGVhY2ggaW5zdGFuY2UgaW4gdGhlIG5ldwotCQkvLyBjaGFpbgotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5zZXRQYXJlbnREb2N1bWVudChuZXdOb2Rlc0hlYWQsIGZTdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkvLyBpbml0aWFsaXplIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnQgdmFyaWFibGUgb2YgZWFjaCBpbnN0YW5jZSBpbiB0aGUKLQkJLy8gbmV3IGNoYWluCi0JCS8vU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0U3RydWN0dXJlZERvY3VtZW50KG5ld05vZGVzSGVhZCwKLQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCS8vCi0JCWlmIChmaXJzdFRpbWUpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24obmV3Tm9kZXNIZWFkKTsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuaW5pdGlhbGl6ZUZpcnN0QW5kTGFzdERvY3VtZW50UmVnaW9uKCk7Ci0JCQkvLyBub3RlOiBzaW5jZSB3ZSBhcmUgaW5zZXJ0aW5nIG5vZGVzLCBmb3IgdGhlIGZpcnN0IHRpbWUsIHRoZXJlCi0JCQkvLyBpcwotCQkJLy8gbm8gYWRqdXN0bWVudHMKLQkJCS8vIHRvIGRvd25zdHJlYW0gc3R1ZmYgbmVjZXNzYXJ5LgotCQkJcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGVzLCBuZXdOb2RlcywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBub3RlOiBpbnRlZ3JhdGVzIGNoYW5nZXMgaW50byBtb2RlbCBhcyBhIHNpZGUgZWZmZWN0Ci0JCQlyZXN1bHQgPSBtaW5pbXVtRXZlbnQob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJfQotCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIENvcmVOb2RlTGlzdCBfZm9ybU1pbmltdW1MaXN0KENvcmVOb2RlTGlzdCBmbGF0bm9kZXMsIGludCBzdGFydE9mRGlmZmVyZW5jZXMsIGludCBlbmRPZkRpZmZlcmVuY2VzKSB7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsTm9kZXMgPSBudWxsOwotCQkvLyBpZiBzdGFydE9mRGlmZmVyY2VzIGlzIHN0aWxsIGl0cyBpbml0aWFsIHZhbHVlLCB0aGVuIHdlIGhhdmUgYW4KLQkJLy8gZW1wdHkgZG9jdW1lbnQKLQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA9PSAtMSkgewotCQkJbWluaW1hbE5vZGVzID0gRU1QVFlfTElTVDsKLQkJfSBlbHNlIHsKLQkJCS8vIGlmIHdlIGRvIG5vdCBoYXZlIGFueSBmbGF0bm9kZSBpbiBvdXIgZmxhdG5vZGUgbGlzdCwgdGhlbgotCQkJLy8gc2ltcGx5Ci0JCQkvLyByZXR1cm4gb3VyIHN0YW5kYXJkIGVtcHR5IGxpc3QKLQkJCWlmIChmbGF0bm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCW1pbmltYWxOb2RlcyA9IEVNUFRZX0xJU1Q7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGlmIHN0YXJ0T2ZEaWZmZXJlbmNlcyBpcyBncmVhdGVyIHRoYW4gZW5kT2ZEaWZmZXJlbmNlcywKLQkJCQkvLyB0aGVuCi0JCQkJLy8gdGhhdCBtZWFucyB0aGUgY2FsY3VsYXRpb25zICJjcm9zc2VkIiBlYWNoIG90aGVyLCBhbmQKLQkJCQkvLyBoZW5jZSwKLQkJCQkvLyB0aGVyZSByZWFsbHkgaXMgbm8gZGlmZmVyZW5jZXMsIHNvLCBhZ2FpbiwgcmV0dXJuIHRoZSBlbXB0eQotCQkJCS8vIGxpc3QKLQkJCQlpZiAoc3RhcnRPZkRpZmZlcmVuY2VzID4gZW5kT2ZEaWZmZXJlbmNlcykgewotCQkJCQltaW5pbWFsTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIHRoZSBsYXN0IGNoZWNrIGJlIHN1cmUgd2UgaGF2ZSBzb21lIGRpZmZlcm5jZXMKLQkJCQkJaWYgKChlbmRPZkRpZmZlcmVuY2VzID4gLTEpKSB7Ci0JCQkJCQltaW5pbWFsTm9kZXMgPSBuZXcgQ29yZU5vZGVMaXN0KGZsYXRub2Rlcy5pdGVtKHN0YXJ0T2ZEaWZmZXJlbmNlcyksIGZsYXRub2Rlcy5pdGVtKGVuZE9mRGlmZmVyZW5jZXMpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIHRoZXJlIHdlcmUgbm8gZGlmZmVyZW5jZXMsIHRoZSBsaXN0IHdhc24ndAotCQkJCQkJLy8gbWluaW1pemVkLCBzbyBzaW1wbHkgcmV0dXJuIGl0LgotCQkJCQkJbWluaW1hbE5vZGVzID0gZmxhdG5vZGVzOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtaW5pbWFsTm9kZXM7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIF9ncmVhdGVyVGhhbkVmZmVjdGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgbm9kZVN0YXJ0ID0gb2xkTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgY2hhbmdlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSBub2RlU3RhcnQgPiBjaGFuZ2VkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgcmVnaW9uU3RhcnRPZmZzZXQgPSBvbGROb2RlLmdldFN0YXJ0T2Zmc2V0KG9sZFJlZ2lvbik7Ci0JCWludCBlZmZlY3RlZFJlZ2lvbkVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2UgLSAxOwotCQlyZXN1bHQgPSByZWdpb25TdGFydE9mZnNldCA+IGVmZmVjdGVkUmVnaW9uRW5kOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBfbGVzc1RoYW5FZmZlY3RlZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldCgpIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX2xlc3NUaGFuRWZmZWN0ZWRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbiBvbGRSZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IG5vZGVFbmQgPSBvbGROb2RlLmdldEVuZE9mZnNldChvbGRSZWdpb24pIC0gMTsKLQkJcmVzdWx0ID0gbm9kZUVuZCA8IGZTdGFydDsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gX3JlZ2lvbnNTYW1lS2luZChJVGV4dFJlZ2lvbiBuZXdSZWdpb24sIElUZXh0UmVnaW9uIG9sZFJlZ2lvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkvLyBpZiBvbmUgcmVnaW9uIGlzIGEgY29udGFpbmVyIHJlZ2lvbiwgYW5kIHRoZSBvdGhlciBub3QsIGFsd2F5cwotCQkvLyByZXR1cm4gZmFsc2UKLQkJLy8gZWxzZSwganVzdCBjaGVjayB0aGVpciB0eXBlLgotCQkvLyAgICAgIERXIGRydWluZyByZWZhY3RvcmluZywgbG9va3MgbGlrZSBhICJ0eXBvIiBoZXJlLCB1c2luZyAnb2xkJyBpbgotCQkvLyBib3RoLgotCQkvLwkJaWYgKGlzQ29udGFpbmVyUmVnaW9uKG9sZFJlZ2lvbikgIT0gaXNDb250YWluZXJSZWdpb24ob2xkUmVnaW9uKSkKLQkJaWYgKGlzQ29sbGVjdGlvblJlZ2lvbihvbGRSZWdpb24pICE9IGlzQ29sbGVjdGlvblJlZ2lvbihuZXdSZWdpb24pKQotCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCWVsc2UgaWYgKG9sZFJlZ2lvbi5nZXRUeXBlKCkgPT0gbmV3UmVnaW9uLmdldFR5cGUoKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLy8JcHJpdmF0ZSBib29sZWFuIGhhc0NvbGxlY3Rpb25SZWdpb25zKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkvLwkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkvLwkJaWYgKGFSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkvLwkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb25Db250YWludGVyID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikKLQkvLyBhUmVnaW9uOwotCS8vCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSByZWdpb25Db250YWludGVyLmdldFJlZ2lvbnMoKTsKLQkvLwkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCS8vCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCS8vCQkJCWlmIChhUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JLy8JCQkJCXJlc3VsdCA9IHRydWU7Ci0JLy8JCQkJCWJyZWFrOwotCS8vCQkJCX0KLQkvLwkJCX0KLQkvLwkJfQotCS8vCQlyZXR1cm4gcmVzdWx0OwotCS8vCX0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBzcGVjaWZpY2FsbHkgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gJ2lzRW5kZWQnIHN0YXRlLAotCSAqIGFsdGhvdWdoIGl0IHN0aWxsIGRvZXMgc28gd2l0aCBoZXVyaXN0aWNzLiBJZiBudW1iZXIgb2YgJz4nIGNoYW5nZXMsCi0JICogYXNzdW1lIHRoZSBpc0VuZGVkIHN0YXRlIGhhcyBjaGFuZ2VkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2VJbklzRW5kZWRTdGF0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQpIHsKLQkJaW50IG5PbGQgPSBTdHJpbmdVdGlscy5vY2N1cnJlbmNlc09mKG9sZFRleHQsICc+Jyk7Ci0JCWludCBuTmV3ID0gU3RyaW5nVXRpbHMub2NjdXJyZW5jZXNPZihuZXdUZXh0LCAnPicpOwotCQlyZXR1cm4gIShuT2xkID09IG5OZXcpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0FuZEFzc2lnblBhcmVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpZiAocmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCSgoSVRleHRSZWdpb25Db250YWluZXIpIHJlZ2lvbikuc2V0UGFyZW50KG9sZE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHsKLQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiB0ZXh0UmVnaW9uQ29sbGVjdGlvbiA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHJlZ2lvbjsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0ID0gdGV4dFJlZ2lvbkNvbGxlY3Rpb24uZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gaW5uZXJSZWdpb24gPSByZWdpb25MaXN0LmdldChpKTsKLQkJCQljaGVja0FuZEFzc2lnblBhcmVudChvbGROb2RlLCBpbm5lclJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBIGNoYW5nZSB0byBhIENEQVRBIHRhZyBjYW4gcmVzdWx0IGluIGFsbCBiZWluZyByZXBhcnNlZC4KLQkgKi8KLQlwcml2YXRlIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ0RBVEEoKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIjwhW0NEQVRBWyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIl1dPiIpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogSWYgYSBjb21tZW50IHN0YXJ0IG9yIGVuZCB0YWcgaXMgYmVpbmcgYWRkZWQgb3IgZGVsZXRlZCwgd2UnbGwgcmVzY2FuCi0JICogdGhlIHdob2xlIGRvY3VtZW50LiBUaGUgcmVhc29uIGlzIHRoYXQgY29udGVudCB0aGF0IGlzIHJldmVhbGVkIG9yCi0JICogY29tbWVudGVkIG91dCBjYW4gZWZmZWN0IHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgcmVzdCBvZiB0aGUKLQkgKiBkb2N1bWVudC4gTm90ZTogZm9yIG5vdyB0aGlzIGlzIHZlcnkgWE1MIHNwZWNpZmljLCBjYW4gcmVmYWN0b3IvaW1wcm92ZQotCSAqIGxhdGVyLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNvbW1lbnRzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8IS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcml0aWNhbEtleSgiLS0+Iik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gd2UnbGwgYWxzbyBjaGVjayBmb3IgdGhlc2UgZGVnZW5lcmF0ZSBjYXNlcwotCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8IS0tLT4iKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbW1vbiB1dGlsaXR5IGZvciBjaGVja2luZyBmb3IgY3JpdGljYWwgd29yZCBzdWNoIGFzICIgPFNDUklQVD4iCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNoZWNrRm9yQ3JpdGljYWxLZXkoU3RyaW5nIGNyaXRpY2FsVGFyZ2V0KSB7Ci0JCXJldHVybiBfY2hlY2tGb3JDcml0aWNhbFdvcmQoY3JpdGljYWxUYXJnZXQsIGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21tb24gdXRpbGl0eSBmb3IgY2hlY2tpbmcgZm9yIGNyaXRpY2FsIHdvcmQgc3VjaCBhcyAiIDxTQ1JJUFQ+IgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JDcml0aWNhbE5hbWUoU3RyaW5nIGNyaXRpY2FsVGFyZ2V0KSB7Ci0JCXJldHVybiBfY2hlY2tGb3JDcml0aWNhbFdvcmQoY3JpdGljYWxUYXJnZXQsIHRydWUpOwotCX0KLQotCS8vCS8qKgotCS8vCSAqIEN1cnJlbnRseSB0aGlzIG1ldGhvZCBpcyBwcmV0dHkgc3BlY2lmaWMgdG8gP01MCi0JLy8JICogQGRlcHJlY2F0ZWQgLSBub3QgcmVhbGx5IGRlcHJlY2F0ZWQsIGJ1dCBwbGFuIHRvIG1ha2UKLQkvLwkgKiBwcm90ZWN0ZWQgLi4uIEknbSBub3Qgc3VyZSB3aHkgaXRzIHB1YmxpYyBvciBtaXNzcGVsbGVkPwotCS8vCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQm91bmRyeUNhc2VzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBDYXNlIDE6IFNlZSBpZiB0aGUgbGFuZ3VhZ2UncyBzeW50YXggcmVxdWlyZXMgdGhhdCBtdWx0aXBsZQotCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGJlIHJlc2Nhbm5lZAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3Jvc3NTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25TeW50YXgoKTsKLQkJfQotCQkvLyBDYXNlIDI6ICJibG9jayB0YWdzIiB3aG9zZSBjb250ZW50IGlzIGxlZnQgdW5wYXJzZWQKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlPYmplY3QgcGFyc2VyID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRQYXJzZXIoKTsKLQkJCWlmIChwYXJzZXIgaW5zdGFuY2VvZiBCbG9ja1RhZ1BhcnNlcikgewotCQkJCUxpc3QgYmxvY2tUYWdzID0gKChCbG9ja1RhZ1BhcnNlcikgcGFyc2VyKS5nZXRCbG9ja01hcmtlcnMoKTsKLQkJCQlyZXN1bHQgPSBfY2hlY2tCbG9ja05vZGVMaXN0KGJsb2NrVGFncyk7Ci0JCQl9Ci0JCX0KLQkJLy8gRlVUVVJFX1RPX0RPOiBpcyB0aGVyZSBhIGJldHRlciBwbGFjZSB0byBkbyB0aGlzPwotCQkvLyBvciEgZG8gd2UgYWxyZWFkeSBkbyBpdCBzb21lIG90aGVyIG1vcmUgY2VudHJhbCBwbGFjZT8KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFsbG93IGEgcmVwYXJzZXIgdG8gY2hlY2sgZm9yIGV4dHJhIHN5bnRhY3RpYyBjYXNlcyB0aGF0IHJlcXVpcmUKLQkgKiBwYXJzaW5nIGJleW9uZCB0aGUgZmxhdE5vZGUgYm91bmRhcnkuCi0JICogCi0JICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IFhNTC1jZW50cmljLgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvckNyb3NzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uU3ludGF4KCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQ7Ci0JCS8vIENhc2UgMTogUXVvdGUgY2hhcmFjdGVycyBhcmUgaW52b2x2ZWQKLQkJcmVzdWx0ID0gY2hlY2tGb3JRdW90ZXMoKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDI6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBjb21tZW50IGJlZ2lubmluZyBvcgotCQkJLy8gY29tbWVudAotCQkJLy8gZW5kCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNvbW1lbnRzKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDM6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0JCQlyZXN1bHQgPSBjaGVja0ZvclBJKCk7Ci0JCX0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkvLyBDYXNlIDQ6IFRoZSBpbnB1dCBmb3JtcyBvciB1bmRvZXMgYSBDREFUQSBzZWN0aW9uCi0JCQlyZXN1bHQgPSBjaGVja0ZvckNEQVRBKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgdG8gc2VlIGlmIGNoYW5nZSByZXF1ZXN0IGV4YWN0bHkgbWF0Y2hlcyB0aGUgdGV4dCBpdCB3b3VsZCBiZQotCSAqIHJlcGxhY2luZy4gKEluIGZ1dHVyZSwgdGhpcywgb3Igc2ltaWxhciBtZXRob2QgaXMgd2hlcmUgdG8gY2hlY2sgZm9yCi0JICogInJlYWQgb25seSIgYXR0ZW1wdGVkIGNoYW5nZS4pCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0Zvck5vQ2hhbmdlKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBkb24ndCBjaGVjayBlcXVhbHMgdW5sZXNzIGxlbmd0aHMgbWF0Y2gKLQkJLy8gc2hvdWxkIGJlIGEgdGlueSBiaXQgZmFzdGVyLCBzaW5jZSB1c3VhbGx5IG5vdAotCQkvLyBvZiBlcXVhbCBsZW5ndGhzIChJJ20gc3VycHJpc2VkIFN0cmluZydzIGVxdWFscyBtZXRob2QKLQkJLy8gZG9lc24ndCBkbyB0aGlzLikKLQkJaWYgKChmQ2hhbmdlcyAhPSBudWxsKSAmJiAoZkRlbGV0ZWRUZXh0ICE9IG51bGwpICYmIChmQ2hhbmdlcy5sZW5ndGgoKSA9PSBmRGVsZXRlZFRleHQubGVuZ3RoKCkpICYmIChmQ2hhbmdlcy5lcXVhbHMoZkRlbGV0ZWRUZXh0KSkpIHsKLQkJCXJlc3VsdCA9IG5ldyBOb0NoYW5nZUV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBjaGFuZ2UgdG8gYSBQSSB0YWcgY2FuIHJlc3VsdCBpbiBhbGwgYmVpbmcgcmVwYXJzZWQuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBjaGVja0ZvclBJKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0ZvckNyaXRpY2FsS2V5KCI8PyIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGNoZWNrRm9yQ3JpdGljYWxLZXkoIj8+Iik7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyAgRm9yIHNpbXBsaWNpdHksIGlmIGVpdGhlciB0ZXh0IHRvIGJlIGRlbGV0ZWQsIG9yIHRleHQgdG8gYmUgaW5zZXJ0ZWQKLQkvLyBjb250YWlucyBhdCBsZWFzdAotCS8vICBvbmUgcXVvdGUsIHdlJ2xsIHNlYXJjaCBmb3IgcHJldmlvdXMgcXVvdGUgaW4gZG9jdW1lbnQsIGlmIGFueSwgYW5kIHVzZQotCS8vIHRoYXQgZmxhdG5vZGUgYXMKLQkvLyAgYSBkaXJ0eSBzdGFydCwgYW5kIHdlJ2xsIHVzZSBlbmQgb2YgZG9jdW1lbnQgYXMgZGlydHkgZW5kLiBXZSBuZWVkIHRvCi0JLy8gYXNzdW1lIGVpdGhlciBcIiBvcgotCS8vICBcJyBpcyBhbiBleGNlcHRhYmxlIHF1b3RlLiAoTk9URTogdGhpcyBpcywgbG9vc2VseSwgYW4gWE1MIGFzc3VtcHRpb24KLQkvLyAtLQotCS8vIG90aGVyIGxhbmd1YWdlcwotCS8vICB3b3VsZCBkaWZmZXIsIGJ1dCB3ZSdsbCAiaGFyZCBjb2RlIiBmb3IgWE1MIGZvciBub3cuCi0JLy8gZnV0dXJlX1RPRE86IHRoaXMgaXMgYSByZWFsbHkgYmFkIGhldXJpc3RpYyAuLi4gd2Ugc2hvdWxkIGJlIGxvb2tpbmcKLQkvLyBmb3IKLQkvLyBvZGQgbnVtYmVyIG9mIHF1b3RlcwotCS8vIHdpdGhpbiBhIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAob3Igc29tZXRoaW5nISkgVGhpcyBjYXVzZXMgd2F5IHRvbwotCS8vIG11Y2ggcmVwYXJzaW5nIG9uCi0JLy8gc2ltcGxlIGNhc2VzLCBsaWtlIGRlbGV0aW5nIGEgdGFnIHdpdGggYSBxdW90ZWQgYXR0cmlidXRlIQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tGb3JRdW90ZXMoKSB7Ci0JCS8vIHJvdXRpbmUgaXMgc3VwcG9ydGVkIHdpdGggbnVsbCBvciBlbXB0eSBzdHJpbmcgbWVhbmluZyB0aGUgc2FtZQotCQkvLyB0aGluZzogZGVsZXRpb24KLQkJaWYgKGZDaGFuZ2VzID09IG51bGwpCi0JCQlmQ2hhbmdlcyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpbnQgZGlydHlTdGFydFBvcyA9IC0xOwotCQkJU3RyaW5nIHByb3Bvc2VkRGVsZXRpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKGZTdGFydCA8IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKLQkJCQlpZiAoKGZDaGFuZ2VzLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpIHx8IChwcm9wb3NlZERlbGV0aW9uLmluZGV4T2Yoc2luZ2xlUXVvdGUpID4gLTEpKSB7Ci0JCQkJCUlSZWdpb24gc2luZ2xlUXVvdGVSZWdpb24gPSBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpLmZpbmQoZlN0YXJ0LCBzaW5nbGVRdW90ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotCQkJCQlpZiAoc2luZ2xlUXVvdGVSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJZGlydHlTdGFydFBvcyA9IHNpbmdsZVF1b3RlUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIGlmICgoZkNoYW5nZXMuaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkgfHwgKHByb3Bvc2VkRGVsZXRpb24uaW5kZXhPZihkb3VibGVRdW90ZSkgPiAtMSkpIHsKLQkJCQkJSVJlZ2lvbiBkb3VibGVRdW90ZVJlZ2lvbiA9IGdldEZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyKCkuZmluZChmU3RhcnQsIGRvdWJsZVF1b3RlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0JCQkJCWlmIChkb3VibGVRdW90ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlkaXJ0eVN0YXJ0UG9zID0gZG91YmxlUXVvdGVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGlydHlTdGFydFBvcyA+IC0xKSB7Ci0JCQkJLy8gdGhlbiB3ZSBmb3VuZCBvbmUsIGRvIGNyZWF0ZSBuZXcgc3RydWN0dXJlZERvY3VtZW50IGV2ZW50Ci0JCQkJLy8gYmFzZWQgb24gdGhlIHByZXZpb3VzIHF1b3RlIHRvIGVuZCBvZiBkb2N1bWVudAotCQkJCS8vIGV4Y2VwdCwgd2UgbmVlZCB0byBiZSBwb3NpdGl2ZSB0aGF0IHRoZSBwcmV2aW91cyBxdW90ZSBpcwotCQkJCS8vIGluIGEgInNhZmUgc3RhcnQiIHJlZ2lvbiAoZS5nLiBpZiBpbiBKU1AgY29udGVudCwgd2UgbmVlZAotCQkJCS8vIHRvCi0JCQkJLy8gYmFja3VwIHRpbGwgd2UgaW5jbHVkZSB0aGUgd2hvbGUgSlNQIHJlZ2lvbiwgaW4gb3JkZXIgZm9yCi0JCQkJLy8gaXQKLQkJCQkvLyB0byBiZSBjb3JyZWN0bHkgcmUtcGFyc2VkLiBUaGUgYmFja2luZyB1cCBpcyBkb25lIGluIHRoZQotCQkJCS8vIHJlcGFyc2UvZmluZCBkaXJ0eSBzdGFydCBmcm9tIGhpbnQKLQkJCQkvLyBtZXRob2QuCi0JCQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0UG9zLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpIC0gMSk7Ci0JCQl9Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQuc2V0RGVsZXRlZFRleHQoZkRlbGV0ZWRUZXh0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgY2hlY2tIZXVyaXN0aWNzKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQlyZXN1bHQgPSBjaGVja0Zvck5vQ2hhbmdlKCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY2hlY2tGb3JDcm9zc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJvdW5kcnlDYXNlcygpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcXVpY2tDaGVjaygpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGFrZXMgaW50byBhY2NvdW50ICJ0YWcgbmFtZSIgcnVsZXMgZm9yIGNvbXBhcmlzb25zOyBjYXNlLWluc2Vuc2l0aXZlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjaGVja1RhZ05hbWVzKFN0cmluZyBjb21wYXJlVGV4dCwgU3RyaW5nIGNyaXRpY2FsVGFyZ2V0LCBib29sZWFuIGNoZWNrRW5kKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmICgoY29tcGFyZVRleHQgPT0gbnVsbCkgfHwgKGNyaXRpY2FsVGFyZ2V0ID09IG51bGwpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgcG9zT2ZDcml0aWNhbFdvcmQgPSBjb21wYXJlVGV4dC50b0xvd2VyQ2FzZSgpLmluZGV4T2YoY3JpdGljYWxUYXJnZXQudG9Mb3dlckNhc2UoKSk7Ci0JCXJlc3VsdCA9IHBvc09mQ3JpdGljYWxXb3JkID4gLTE7Ci0JCWlmIChjaGVja0VuZCAmJiByZXN1bHQpIHsKLQkJCS8vIGluc3RlYWQgb2YgcmV0dXJuaW5nIHRydWUgcmlnaHQgYXdheSwgd2UnbGwgb25seSByZXR1cm4gdHJ1ZQotCQkJLy8gdGhlCi0JCQkvLyBwb3RlbnRpYWxseSBtYXRjaGVkIHRhZyBpcyBpbmRlZWQgYSB0YWcsIGZvciBleGFtcGxlLCBpZgotCQkJLy8gPFNDUklQVAotCQkJLy8gYmVjb21lcyA8U0NSSVBUUyB3ZSBkb24ndCB3YW50IHRvIHNheSB0aGUgbGF0dGVyIGlzIGEgY3JpdGljYWwKLQkJCS8vIHRhZwotCQkJaW50IGxhc3RQb3MgPSBwb3NPZkNyaXRpY2FsV29yZCArIGNyaXRpY2FsVGFyZ2V0Lmxlbmd0aCgpOwotCQkJaWYgKGxhc3RQb3MgPCBjb21wYXJlVGV4dC5sZW5ndGgoKSkgewotCQkJCWNoYXIgbGFzdENoYXIgPSBjb21wYXJlVGV4dC5jaGFyQXQobGFzdFBvcyk7Ci0JCQkJLy8gRnV0dXJlOiBjaGVjayBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGlzIGphdmEgbWV0aG9kLCB2cy4KLQkJCQkvLyBYTUwKLQkJCQkvLyBwYXJzaW5nIHJ1bGVzCi0JCQkJcmVzdWx0ID0gKCFDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGxhc3RDaGFyKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29yZSByZXBhcnNpbmcgbWV0aG9kIC4uLiBhZnRlciB0aGUgZGlydHkgc3RhcnQgYW5kIGRpcnR5IGVuZCBoYXZlCi0JICogYmVlbiBjYWxjdWxhdGVkIGVsc2V3aGVyZSwgYW5kIHRoZSB0ZXh0IHVwZGF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGNvcmVfcmVwYXJzZShpbnQgcmVzY2FuU3RhcnQsIGludCByZXNjYW5FbmQsIENvcmVOb2RlTGlzdCBvbGROb2RlcywgYm9vbGVhbiBmaXJzdFRpbWUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2Rlc0hlYWQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQluZXdOb2Rlc0hlYWQgPSBfY29yZV9yZXBhcnNlX3RleHQocmVzY2FuU3RhcnQsIHJlc2NhbkVuZCk7Ci0JCXJlc3VsdCA9IF9jb3JlX3JlcGFyc2VfdXBkYXRlX21vZGVsKG5ld05vZGVzSGVhZCwgcmVzY2FuU3RhcnQsIHJlc2NhbkVuZCwgb2xkTm9kZXMsIGZpcnN0VGltZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHN0YXRlIHRvICJub3QgcGFyc2luZyIKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGVuZFJlUGFyc2UoKSB7Ci0JCWlzUGFyc2luZyA9IGZhbHNlOwotCQlkaXJ0eVN0YXJ0ID0gbnVsbDsKLQkJZGlydHlFbmQgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmREaXJ0eUVuZChpbnQgZW5kKSB7Ci0JCS8vIENhdXRpb246IGhlcmUncyBvbmUgcGxhY2Ugd2UgaGF2ZSB0byBjYXN0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkvLyBpZiBub3Qgd2VsbCBmb3JtZWQsIGdldCBvbmUgcGFzdCwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmICghcmVzdWx0LmlzRW5kZWQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIGFsc28sIGdldCBvbmUgcGFzdCBpZiBleGFjdGx5IGVxdWFsIHRvIHRoZSBlbmQgKHRoaXMgd2FzIG5lZWRlZAotCQkvLyBhcyBhIHNpbXBsZSBmaXggdG8gd2hlbiBhIHdob2xlIGV4YWN0IHJlZ2lvbiBpcyBkZWxldGVkLgotCQkvLyB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyIHdheS4KLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKGVuZCA9PSByZXN1bHQuZ2V0RW5kKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCQkvLyBtb3ZlZCB0byBzdWJjbGFzcyBmb3IgcXVpY2sgdHJhbnNpdGlvbgotCQkvLyAxMi82LzIwMDEgLSBTaW5jZSB3ZSd2ZSBjaGFuZ2VkIHRoZSBwYXJzZXIvc2Nhbm5lciB0byBhbGxvdyBhIGxvbmUKLQkJLy8gJzwnIHdpdGhvdXQKLQkJLy8gYWx3YXlzIGludGVycHJldHRpbmcgaXQgYXMgc3RhcnQgb2YgYSB0YWcgbmFtZSwgd2UgbmVlZCB0byBiZSBhCi0JCS8vIGxpdHRsZSBmYW5jaWVyLCBpbiBvcmRlcgotCQkvLyB0byAic2tpcCIgb3ZlciBhbnkgcGxhaW4gJ29sIGNvbnRlbnQgYmV0d2VlbiB0aGUgbG9uZSAnPCcgYW5kIGFueQotCQkvLyBwb3RlbnRpYWwgbWVhdGluZwotCQkvLyByZWdpb25zIHBhc3QgcGxhaW4gJ29sIGNvbnRlbnQuCi0JCS8vCQlpZiAoaXNMb25lT3BlbkZvbGxvd2VkQnlDb250ZW50KHJlc3VsdCkgJiYgKHJlc3VsdC5nZXROZXh0KCkgIT0KLQkJLy8gbnVsbCkpIHsKLQkJLy8JCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkvLwkJfQotCQlpZiAocmVzdWx0ICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCWRpcnR5RW5kID0gcmVzdWx0OwotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluZERpcnR5U3RhcnQoaW50IHN0YXJ0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCS8vIGhldXJpc3RpYzogaWYgdGhlIHBvc3Rpb24gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RhcnQsIHRoZW4KLQkJLy8gZ28gYmFjayBvbmUgbW9yZSwgaWYgaXQgZXhpc3RzLiBUaGlzIHByZXZlbnRzIHByb2JsZW1zIHdpdGgKLQkJLy8gaW5zZXJ0aW9ucwotCQkvLyBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBwcmV2aW91cyBub2RlIGluc3RlYWQgb2YKLQkJLy8gc2ltcGx5IGh1bmcKLQkJLy8gb2ZmIG9mIGl0IGFzIGEgc2VwYXJhdGUgbm9kZSAoZXguOiBYTUwgY29udGVudCBpbnNlcnRlZCByaWdodAotCQkvLyBiZWZvcmUKLQkJLy8gYW4gb3BlbgotCQkvLyBicmFja2V0IHNob3VsZCBiZWNvbWUgcGFydCBvZiB0aGUgcHJldmlvdXMgY29udGVudCBub2RlKQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSByZXN1bHQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmICgocHJldmlvdXMgIT0gbnVsbCkgJiYgKCghKHByZXZpb3VzLmlzRW5kZWQoKSkpIHx8IChzdGFydCA9PSByZXN1bHQuZ2V0U3RhcnQoKSkpKSB7Ci0JCQkJcmVzdWx0ID0gcHJldmlvdXM7Ci0JCQl9Ci0JCQkvLyBJZiB3ZSBhcmUgbm93IGF0IHRoZSBlbmQgb2YgYSAidGFnIGRlcGVuZGVudCIgY29udGVudCBhcmVhIChvcgotCQkJLy8gSlNQIGFyZWEpCi0JCQkvLyB0aGVuIHdlIG5lZWQgdG8gYmFjayB1cCBhbGwgdGhlIHdheSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoYXQuCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBvdGVudGlhbCA9IHJlc3VsdDsKLQkJCS8vIG1vdmVkIHRvIHN1YmNsYXNzIHRvIHNwZWVkIHRyYW5zaXRpb24KLQkJCS8vCQkJd2hpbGUgKGlzUGFydE9mQmxvY2tSZWdpb24ocG90ZW50aWFsKSkgewotCQkJLy8JCQkJcG90ZW50aWFsID0gcG90ZW50aWFsLmdldFByZXZpb3VzKCk7Ci0JCQkvLwkJCX0KLQkJCWlmIChwb3RlbnRpYWwgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHBvdGVudGlhbDsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZGlydHlTdGFydCA9IHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29yZU5vZGVMaXN0IGZvcm1PbGROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5U3RhcnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZGlydHlFbmQpIHsKLQkJQ29yZU5vZGVMaXN0IG9sZE5vZGVzID0gbmV3IENvcmVOb2RlTGlzdChkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCS8vIE5vdyBzYXZlIHRoZSBvbGQgdGV4dCwgdGhhdCAiZ29lcyB3aXRoIiB0aGUgb2xkIG5vZGVzIGFuZCByZWdpb25zLgotCQkvLyBOb3RpY2Ugd2UgYXJlIGdldHRpbmcgaXQgZGlyZWN0bHkgZnJvbSB0aGUgdGV4dCBzdG9yZQotCQlTdHJpbmcgb2xkVGV4dCA9IG51bGw7Ci0JCWludCBvbGRTdGFydCA9IC0xOwotCQlpbnQgb2xkRW5kID0gLTE7Ci0JCS8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBzb21lIHRleHQsIGlmIG5vdCwgdXNlIGVtcHR5IHN0cmluZwotCQkvLyAoaWYgb25lIG5vZGUgaXMgbm90IG51bGwsIHRoZSBvdGhlciBzaG91bGQgQUxXQVlTIGJlIG5vdCBudWxsIHRvbywKLQkJLy8gc2luY2UgaXQKLQkJLy8gd291bGQgYXQgbGVhc3QgYmUgZXF1YWwgdG8gaXQuKQotCQlpZiAoZGlydHlTdGFydCAhPSBudWxsKSB7Ci0JCQlvbGRTdGFydCA9IGRpcnR5U3RhcnQuZ2V0U3RhcnQoKTsKLQkJCW9sZEVuZCA9IGRpcnR5RW5kLmdldEVuZCgpOwotCQkJb2xkVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0KG9sZFN0YXJ0LCBvbGRFbmQgLSBvbGRTdGFydCk7Ci0JCX0gZWxzZSB7Ci0JCQlvbGRTdGFydCA9IDA7Ci0JCQlvbGRFbmQgPSAwOwotCQkJb2xkVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IHRleHQgc3RvcmUgZm9yIHRoaXMgdGV4dAotCQlTdWJTZXRUZXh0U3RvcmUgc3ViVGV4dFN0b3JlID0gbmV3IFN1YlNldFRleHRTdG9yZShvbGRUZXh0LCBvbGRTdGFydCwgb2xkRW5kLCBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKTsKLQkJLy8gTm93IHVwZGF0ZSB0aGUgdGV4dCBzdG9yZSBvZiB0aGUgb2xkTm9kZXMKLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3Iuc2V0UGFyZW50RG9jdW1lbnQob2xkTm9kZXMsIG5ldyBNaW5pbWFsRG9jdW1lbnQoc3ViVGV4dFN0b3JlKSk7Ci0JCXJldHVybiBvbGROb2RlczsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZpbmRSZXBsYWNlRG9jdW1lbnRBZGFwdGVyLgotCSAqLwotCXB1YmxpYyBGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciBnZXRGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcigpIHsKLQkJaWYgKGZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9PSBudWxsKSB7Ci0JCQlmRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIgPSBuZXcgRmluZFJlcGxhY2VEb2N1bWVudEFkYXB0ZXIoZlN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCX0KLQkJcmV0dXJuIGZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlcjsKLQl9Ci0KLQkvLyBOb3RlOiBpZiB0aGVhZCBzYWZldHkgaXMgbmVlZGVkLCB0aGlzIGFuZCBhbGwgdGhlIG90aGVyIHB1YmxpYyBtZXRob2RzCi0JLy8gb2YgdGhpcyBjbGFzcwotCS8vIHNob3VsZCBiZSBzeW5jaHJvbml6ZWQuCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZShPYmplY3QgcmVxdWVzdGVyLCBpbnQgc3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UsIFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWlzUGFyc2luZyA9IHRydWU7Ci0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoVG9SZXBsYWNlID0gbGVuZ3RoVG9SZXBsYWNlOwotCQlmQ2hhbmdlcyA9IGNoYW5nZXM7Ci0JCS8vIG5vdGljZSB0aGlzIG9uZSBpcyBkZXJpdmVkCi0JCWZMZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoZkNoYW5nZXMsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQlmRGVsZXRlZFRleHQgPSBmU3RydWN0dXJlZERvY3VtZW50LmdldChmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydE5vZGVzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNPbGROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRPbGROb2RlLCBDb3JlTm9kZUxpc3QgbmV3Tm9kZXMpIHsKLQkJLy8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5ldyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5ldyA9IG51bGw7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkUHJldmlvdXMgPSBwcmV2aW91c09sZE5vZGU7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTmV4dCA9IG5leHRPbGROb2RlOwotCQkvLwotCQlpZiAobmV3Tm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBnZXQgcG9pbnRlcnMKLQkJCWZpcnN0TmV3ID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCWxhc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCQkvLyBzd2l0Y2ggc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucycgcmVmZXJlbmNlcyB0bwotCQkJLy8gbGlzdHMKLQkJCWlmIChvbGRQcmV2aW91cyAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzLnNldE5leHQoZmlyc3ROZXcpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCW9sZE5leHQuc2V0UHJldmlvdXMobGFzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIFNJREUgRUZGRUNUCi0JCQkJLy8gaWYgb2xkTmV4dCBpcyBudWxsLCB0aGF0IG1lYW5zIHdlIGFyZSByZXBsYWNlaW5nIHRoZQotCQkJCS8vIGxhc3ROb2RlIGluIHRoZSBjaGFpbiwKLQkJCQkvLyBzbyB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc3RydWN0dXJlZERvY3VtZW50cyBsYXN0Tm9kZSBhcwotCQkJCS8vIHRoZQotCQkJCS8vIGxhc3Qgb2YgdGhlIG5ldyBub2Rlcy4KLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldExhc3REb2N1bWVudFJlZ2lvbihuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSkpOwotCQkJfQotCQkJaWYgKGZpcnN0TmV3ICE9IG51bGwpCi0JCQkJZmlyc3ROZXcuc2V0UHJldmlvdXMob2xkUHJldmlvdXMpOwotCQkJaWYgKGxhc3ROZXcgIT0gbnVsbCkKLQkJCQlsYXN0TmV3LnNldE5leHQob2xkTmV4dCk7Ci0JCX0KLQkJLy8gZWxzZSBub3RoaW5nIHRvIGluc2VydAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvbGRSZWdpb24KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb2xsZWN0aW9uUmVnaW9uKElUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJcmV0dXJuIChhUmVnaW9uIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1BhcnNpbmcoKSB7Ci0JCXJldHVybiBpc1BhcnNpbmc7Ci0JfQotCi0JLyoqCi0JICogVGhlIG1pbmltaXphdGlvbiBhbGdvcml0aG0gc2ltcGx5IGNoZWNrcyB0aGUgb2xkIG5vZGVzIHRvIHNlZSBpZiBhbnkgb2YKLQkgKiB0aGVtICJzdXJ2aXZlZCIgdGhlIHJlc2NhbiBhbmQgYXJlIHVuY2hhbmdlZC4gSWYgc28sIHRoZSBpbnN0YW5jZSBvZgotCSAqIHRoZSBvbGQgbm9kZSBpcyB1c2VkIGluc3RlYWQgb2YgdGhlIG5ldyBub2RlLiBCZWZvcmUgdGhlIHJlcXVlc3RlZAotCSAqIGNoYW5nZSwgbmVlZCB0byBjaGVjayB0eXBlLCBvZmZzZXRzLCBhbmQgdGV4dCB0byBkZXRlcm1pbmUgaWYgdGhlIHNhbWUuCi0JICogQWZ0ZXIgdGhlIHJlcXVlc3RlZCBjaGFuZ2UsIG5lZWQgdG8gY2hlY2sgdHlwZSBhbmQgdGV4dCwgYnV0IGFkanVzdCB0aGUKLQkgKiBvZmZzZXRzIHRvIHdoYXQgZXZlciB0aGUgY2hhbmdlIHdhcy4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgbWluaW11bUV2ZW50KENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGV2ZW50ID0gbnVsbDsKLQkJQ29yZU5vZGVMaXN0IG1pbmltYWxPbGROb2RlcyA9IG51bGw7Ci0JCUNvcmVOb2RlTGlzdCBtaW5pbWFsTmV3Tm9kZXMgPSBudWxsOwotCQkvLyBUbyBtaW5pbWl6ZSBub2Rlcywgd2UnbGwgY29sbGVjdCBhbGwgdGhvc2UKLQkJLy8gdGhhdCBhcmUgbm90IGVxdWFsIGludG8gb2xkIGFuZCBuZXcgbGlzdHMKLQkJLy8gTm90ZTogd2UgYXNzdW1lIHRoYXQgb2xkIGFuZCBuZXcgbm9kZXMKLQkJLy8gYXJlIGJhc2ljYWxseSBjb250aWd1b3VzIC0tIGFuZCB3ZSBmb3JjZSBpdCB0byBiZSBzbywKLQkJLy8gYnkgc3RhcnRpbmcgYXQgdGhlIGJlZ2lubmluZyB0bwotCQkvLyBmaW5kIGZpcnN0IGRpZmZlcmVuY2UsIGFuZCB0aGVuIHN0YXJ0aW5nIGF0IHRoZSBlbmQgdG8gZmluZAotCQkvLyBsYXN0IGRpZmZlcmVuY2UuIEV2ZXJ5dGhpbmcgaW4gYmV0d2VlbiB3ZSBhc3N1bWUgaXMgZGlmZmVyZW50LgotCQkvLwotCQkvLwotCQkvLwotCQkvLyBzdGFydE9mRGlmZmVyZW5jZXMgaXMgdGhlIGluZGV4IGludG8gdGhlIGNvcmUgbm9kZSBsaXN0IHdoZXJlIHRoZQotCQkvLyBmaXJzdCBkaWZmZXJlbmNlCi0JCS8vIG9jY3Vycy4gQnV0IGl0IG1heSBwb2ludCBpbnRvIHRoZSBvbGQgb3IgdGhlIG5ldyBsaXN0LgotCQlpbnQgc3RhcnRPZkRpZmZlcmVuY2VzID0gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMob2xkTm9kZXMsIG5ld05vZGVzKTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNPbGQgPSAtMTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNOZXcgPSAtMTsKLQkJLy8gaWYgb25lIG9mIHRoZSBsaXN0cyBhcmUgc2hvcnRlciB0aGFuIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyBzdGFydCwKLQkJLy8gdGhlbgotCQkvLyB0aGVuIHNvbWUgcG9ydGlvbiBvZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbAotCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBvbGROb2Rlcy5nZXRMZW5ndGgoKSkgfHwgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSkpIHsKLQkJCWlmIChvbGROb2Rlcy5nZXRMZW5ndGgoKSA8IG5ld05vZGVzLmdldExlbmd0aCgpKSB7Ci0JCQkJLy8gVGhlbiB0aGVyZSBhcmUgbmV3IHJlZ2lvbnMgdG8gYWRkCi0JCQkJLy8gICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCBvbmVzIHRvIG5vdAotCQkJCS8vICAgICBoYXZlIGFueSBlbGVtZW50cywgYW5kIHRoZSB2ZWN0b3Igb2YgbmV3IHJlZ2lvbnMgdG8gaGF2ZQotCQkJCS8vICAgICBqdXN0IHRoZSBuZXcgb25lcyBub3QgaW4gY29tbW9uIHdpdGggdGhlIG9sZCBvbmVzCi0JCQkJLy9zdGFydE9mRGlmZmVyZW5jZXMgc2hvdWxkIGVxdWFsIG9sZE5vZGVzLmdldExlbmd0aCgpLAotCQkJCS8vIGNhbGN1bGF0ZWQgYWJvdmUgb24gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMKLQkJCQltaW5pbWFsT2xkTm9kZXMgPSBFTVBUWV9MSVNUOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkJbWluaW1hbE5ld05vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChuZXdOb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzTmV3KTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9sZE5vZGVzLmdldExlbmd0aCgpID4gbmV3Tm9kZXMuZ2V0TGVuZ3RoKCkpIHsKLQkJCQkJLy8gZGVsZXRlIG9sZAotCQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBvbGQgcmVnaW9ucyB0byBkZWxldGUKLQkJCQkJLy8gICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIHJlZ2lvbnMgdG8KLQkJCQkJLy8gICAgY29udGFpbiB0aGUgb25lcyB0byBkZWxldGUsIGFuZCB0aGUgdmVjdG9yIG9mIG5ldwotCQkJCQkvLyByZWdpb25zCi0JCQkJCS8vICAgIG5vdCBoYXZlIGFueSBlbGVtZW50cwotCQkJCQkvL3N0YXJ0T2ZEaWZmZXJlbmNlcyBzaG91bGQgZXF1YWwgbmV3Tm9kZXMuZ2V0TGVuZ3RoKCksCi0JCQkJCS8vIGNhbGN1bGF0ZWQgYWJvdmUgb24gX2NvbXB1dGVTdGFydE9mRGlmZmVyZW5jZXMKLQkJCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZE5vZGVzLmdldExlbmd0aCgpIC0gMTsKLQkJCQkJbWluaW1hbE9sZE5vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChvbGROb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzT2xkKTsKLQkJCQkJbWluaW1hbE5ld05vZGVzID0gRU1QVFlfTElTVDsKLQkJCQl9IGVsc2UKLQkJCQkJLy8gdW5saWtlbHkgZXZlbnQKLQkJCQkJZXZlbnQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCS8vIFdlIGZvdW5kIGEgbm9ybWFsIHN0YXJ0T2ZEaWZmZXJuY2VzLCBidXQgaGF2ZSBub3QgeWV0IGZvdW5kIHRoZQotCQkJLy8gZW5kcy4KLQkJCS8vIFdlJ2xsIGxvb2sgZm9yIHRoZSBlbmQgb2YgZGlmZmVyZW5jZXMgYnkgZ29pbmcgYmFja3dhcmRzIGRvd24KLQkJCS8vIHRoZSB0d28gbGlzdHMuCi0JCQkvLyBIZXJlIHdlIG5lZWQgYSBzZXBlcmF0ZSBpbmRleCBmb3IgZWFjaCBhcnJheSwgc2luY2UgdGhleSBtYXkgYmUKLQkJCS8vIChhbmQKLQkJCS8vIHByb2JhYmx5IGFyZSkgb2YgZGlmZmVyZW50IGxlbmd0aHMuCi0JCQlpbnQgaW5kZXhPbGQgPSBvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQlpbnQgaW5kZXhOZXcgPSBuZXdOb2Rlcy5nZXRMZW5ndGgoKSAtIDE7Ci0JCQkvLyBUaGUgZ3JlYXRlclRoYW5FZmZlY3RlZFJlZ2lvbiBpcyBpbXBvcnRhbnQgdG8gZ2F1cmQgYWdhaW5zdAotCQkJLy8gaW5jb3JyZWN0IGNvdW50aW5nCi0JCQkvLyB3aGVuIHNvbWV0aGluZyBpZGVudGljYWwgaXMgaW5zZXJ0ZWQgdG8gd2hhdCdzIGFscmVhZHkgdGhlcmUKLQkJCS8vIChzZWUgbWluaW1pemF0aW9uIHRlc3QgY2FzZSA1KQotCQkJLy8gTm90ZTogdGhlIGluZGV4T2xkID4gc3RhcnRPZkRpZmZlcmVuY2VzIGtlZXBzIGluZGV4T2xkIGZyb20KLQkJCS8vIGdldHRpbmcgdG9vIHNtYWxsLAotCQkJLy8gc28gdGhhdCB0aGUgc3Vic2VxdWVudCBvbGROb2Rlcy5pdGVtKGluZGV4T2xkKSBpcyBhbHdheXMgdmFsaWQuCi0JCQl3aGlsZSAoKGluZGV4T2xkID49IHN0YXJ0T2ZEaWZmZXJlbmNlcykgJiYgKF9ncmVhdGVyVGhhbkVmZmVjdGVkUmVnaW9uKG9sZE5vZGVzLml0ZW0oaW5kZXhPbGQpKSkpIHsKLQkJCQlpZiAoIShvbGROb2Rlcy5pdGVtKGluZGV4T2xkKS5zYW1lQXMobmV3Tm9kZXMuaXRlbShpbmRleE5ldyksIGZMZW5ndGhEaWZmZXJlbmNlKSkpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gaWYgdGhleSBhcmUgZXF1YWwsIHRoZW4gd2Ugd2lsbCBiZSBrZWVwaW5nIHRoZSBvbGQgb25lLAotCQkJCQkvLyBzbwotCQkJCQkvLyB3ZSBuZWVkIHRvIGJlIHN1cmUgaXRzIHBhcmVudERvY3VtZW50IGlzIHNldCBiYWNrIHRvCi0JCQkJCS8vIHRoZQotCQkJCQkvLyByaWdodCBpbnN0YW5jZQotCQkJCQlvbGROb2Rlcy5pdGVtKGluZGV4T2xkKS5zZXRQYXJlbnREb2N1bWVudChmU3RydWN0dXJlZERvY3VtZW50KTsKLQkJCQl9Ci0JCQkJaW5kZXhPbGQtLTsKLQkJCQlpbmRleE5ldy0tOwotCQkJfQotCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IGluZGV4T2xkOwotCQkJZW5kT2ZEaWZmZXJlbmNlc05ldyA9IGluZGV4TmV3OwotCQkJbWluaW1hbE9sZE5vZGVzID0gX2Zvcm1NaW5pbXVtTGlzdChvbGROb2Rlcywgc3RhcnRPZkRpZmZlcmVuY2VzLCBlbmRPZkRpZmZlcmVuY2VzT2xkKTsKLQkJCW1pbmltYWxOZXdOb2RlcyA9IF9mb3JtTWluaW11bUxpc3QobmV3Tm9kZXMsIHN0YXJ0T2ZEaWZmZXJlbmNlcywgZW5kT2ZEaWZmZXJlbmNlc05ldyk7Ci0JCX0gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdERvd25TdHJlYW1Ob2RlID0gbnVsbDsKLQkJZXZlbnQgPSByZWdpb25DaGVjayhtaW5pbWFsT2xkTm9kZXMsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCWlmIChldmVudCAhPSBudWxsKSB7Ci0JCQlmaXJzdERvd25TdHJlYW1Ob2RlID0gbWluaW1hbE9sZE5vZGVzLml0ZW0oMCkuZ2V0TmV4dCgpOwotCQkJaWYgKGZpcnN0RG93blN0cmVhbU5vZGUgIT0gbnVsbCAmJiBmTGVuZ3RoRGlmZmVyZW5jZSAhPSAwKSB7IC8vIGlmCi0JCQkJLy8gZmlyc3REb3duU3RyZWFtCi0JCQkJLy8gaXMKLQkJCQkvLyBudWxsLAotCQkJCS8vIHRoZW4KLQkJCQkvLyB3ZSdyZQotCQkJCS8vIGF0Ci0JCQkJLy8gdGhlCi0JCQkJLy8gZW5kCi0JCQkJLy8gb2YKLQkJCQkvLyB0aGUKLQkJCQkvLyBkb2N1bWVudAotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmFkanVzdFN0YXJ0KGZpcnN0RG93blN0cmVhbU5vZGUsIGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJCX0gLy8KLQkJfSBlbHNlIHsKLQkJCWV2ZW50ID0gbm9kZXNSZXBsYWNlZENoZWNrKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCS8vIG5vdyBzcGxpY2UgdGhlIG5ldyBjaGFpbiBvZiBub2RlcyB0byB3aGVyZSB0aGUgb2xkIGNoYWluIGlzIChvcgotCQkJLy8gd2FzKQotCQkJLy8gdGhlIGZpcnN0RG93blN0cmVhbU5vZGUgKHRoZSBmaXJzdCBvZiB0aG9zZSBhZnRlciB0aGUgbmV3Ci0JCQkvLyBub2RlcykKLQkJCS8vIGlzCi0JCQkvLyByZW1lbWJlcmVkIGFzIGEgdGlueSBvcHRpbWl6YXRpb24uCi0JCQlpZiAobWluaW1hbE9sZE5vZGVzLmdldExlbmd0aCgpID09IDAgJiYgbWluaW1hbE5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCS8vIGlmIG5vIG9sZCBub2RlcyBhcmUgYmVpbmcgZGVsZXRlZCwgdGhlbiB1c2UgdGhlCi0JCQkJLy8gdGhlIG5ld05vZGVzIG9mZnNldCAobWludXMgb25lKSB0byBmaW5kIHRoZSBwb2ludCB0bwotCQkJCS8vIHVwZGF0ZSBkb3duc3RyZWFtIG5vZGVzLCBhbmQgYWZ0ZXIgdXBkYXRpbmcgZG93bnN0cmVhbQotCQkJCS8vIG5vZGVzIHBvc3Rpb25zLCBpbnNlcnQgdGhlIG5ldyBvbmVzLgotCQkJCWludCBpbnNlcnRPZmZzZXQgPSBtaW5pbWFsTmV3Tm9kZXMuaXRlbSgwKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE9sZFVuY2hhbmdlZE5vZGUgPSBudWxsOwotCQkJCWlmIChpbnNlcnRPZmZzZXQgPiAwKSB7Ci0JCQkJCWxhc3RPbGRVbmNoYW5nZWROb2RlID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnNlcnRPZmZzZXQgLSAxKTsKLQkJCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IGxhc3RPbGRVbmNoYW5nZWROb2RlLmdldE5leHQoKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyB3ZSdyZSBpbnNlcnRpbmcgYXQgdmVyeSBiZWdpbm5pbmcKLQkJCQkJZmlyc3REb3duU3RyZWFtTm9kZSA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJLy8gU0lERSBFRkZFQ1Q6IGNoYW5nZSB0aGUgZmlyc3ROb2RlIHBvaW50ZXIgaWYgd2UncmUKLQkJCQkJLy8gaW5zZXJ0aW5nIGF0IGJlZ2lubmluZwotCQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldEZpcnN0RG9jdW1lbnRSZWdpb24obWluaW1hbE5ld05vZGVzLml0ZW0oMCkpOwotCQkJCX0KLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJaW5zZXJ0Tm9kZXMobGFzdE9sZFVuY2hhbmdlZE5vZGUsIGZpcnN0RG93blN0cmVhbU5vZGUsIG1pbmltYWxOZXdOb2Rlcyk7Ci0JCQkJLy8gdGhpcyAobm9kZXMgcmVwbGFjZWQpIGlzIHRoZSBvbmx5IGNhc2Ugd2hlcmUgd2UgbmVlZCB0bwotCQkJCS8vIHVwZGF0ZSB0aGUgY2FjaGVkIE5vZGUKLQkJCQlyZVNldENhY2hlZE5vZGUobWluaW1hbE9sZE5vZGVzLCBtaW5pbWFsTmV3Tm9kZXMpOwotCQkJfSBlbHNlIHsKLQkJCQlmaXJzdERvd25TdHJlYW1Ob2RlID0gc3dpdGNoTm9kZUxpc3RzKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCQkvLyBubyBuZWVkIHRvIGFkanVzdCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgbm9kZXMgdGhlbXNlbHZlcywKLQkJCQkvLyB0aGV5Ci0JCQkJLy8gYXJlIGFscmVhZHkgY29ycmVjdCwgYnV0IHdlIGRvIG5lZWQgdG8KLQkJCQkvLyBhZGp1c3QgYWxsICJkb3duIHN0cmVhbSIgbm9kZXMgd2l0aCB0aGUgbGVuZ3RoIG9mIHRoZQotCQkJCS8vIGluc2VydGlvbiBvciBkZWxldGlvbgotCQkJCS8vIC0tLSBhZGp1c3RtZW50IG1vdmVkIHRvIGNhbGxpbmcgbWV0aG9kLgotCQkJCWlmIChmaXJzdERvd25TdHJlYW1Ob2RlICE9IG51bGwpIHsKLQkJCQkJLy8gJiYgZXZlbnQgIT0gbnVsbAotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJfSAvLwotCQkJCS8vIHRoaXMgKG5vZGVzIHJlcGxhY2VkKSBpcyB0aGUgb25seSBjYXNlIHdoZXJlIHdlIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUgdGhlIGNhY2hlZCBOb2RlCi0JCQkJcmVTZXRDYWNoZWROb2RlKG1pbmltYWxPbGROb2RlcywgbWluaW1hbE5ld05vZGVzKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZXZlbnQ7Ci0JfQotCi0JLy8gVE9ETzogVGhpcyBzaG91bGQgYmUgYWJzdHJhY3QuCi0JcHVibGljIElTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IG5vZGVzUmVwbGFjZWRDaGVjayhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLyBhY3R1YWxseSwgbm90aGluZyB0byBjaGVjayBoZXJlLCBzaW5jZSAoYW5kIGFzc3VtaW5nKSB3ZSd2ZSBhbHJlYWR5Ci0JCS8vIG1pbmltaXplZCB0aGUgbnVtYmVyIG9mIG5vZGVzLCBhbmQgcnVsZWQgb3V0IG1lcmUgcmVnaW9uIGNoYW5nZXMKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGVzLCBuZXdOb2RlcywgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQSBtZXRob2QgdG8gYWxsb3cgYW55IGhldXJpc3RpYyAicXVpY2sgY2hlY2tzIiB0aGF0IG1pZ2h0IGNvdmVyIG1hbnkKLQkgKiBtYW55IGNhc2VzLCBiZWZvcmUgZXhwZW5kaW5nIHRoZSB0aW1lIG9uIGEgZnVsbCByZXBhcnNlLgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcXVpY2tDaGVjaygpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIGRpcnR5IHN0YXJ0IGlzIG51bGwsIHRoZW4gd2UgaGF2ZSBhbiBlbXB0eSBkb2N1bWVudC4KLQkJLy8gaW4gd2hpY2ggY2FzZSB3ZSdsbCByZXR1cm4gbnVsbCBzbyBldmVyeXRoaW5nIGNhbiBiZQotCQkvLyByZXBhcnNlZCAiZnJvbSBzY3JhdGNoIiAuIElmIGl0cyBub3QgbnVsbCwgd2UnbGwgZ2l2ZSB0aGUgZmxhdG5vZGUKLQkJLy8gYQotCQkvLyBjaGFuY2UKLQkJLy8gdG8gaGFuZGxlLCBidXQgb25seSBpZiB0aGVyZSBpcyBvbmUgZmxhdG5vZGUgaW52b2x2ZWQuCi0JCWlmIChkaXJ0eVN0YXJ0ICE9IG51bGwgJiYgZGlydHlTdGFydCA9PSBkaXJ0eUVuZCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiB0YXJnZXROb2RlID0gZGlydHlTdGFydDsKLQkJCXJlc3VsdCA9IGRpcnR5U3RhcnQudXBkYXRlUmVnaW9uKGZSZXF1ZXN0ZXIsIHRhcmdldE5vZGUsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJLy8gYXQgdGhpcyBwb2ludCBvbmx5LCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGV4dCBzdG9yZSBhbmQKLQkJCQkvLyBhbmQgZG93bnN0cmVhbSBub2Rlcy4KLQkJCQkvLyBGVVRVUkVfVE9fRE86IGNhbiB0aGlzIGRlcGVuZGVuY3kgb24gc3RydWN0dXJlZERvY3VtZW50Ci0JCQkJLy8gbWV0aG9kIGJlIGVsaW1pbmF0ZWQ/Ci0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC51cGRhdGVEb2N1bWVudERhdGEoZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlLCBmQ2hhbmdlcyk7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdERvd25TdHJlYW1Ob2RlID0gdGFyZ2V0Tm9kZS5nZXROZXh0KCk7Ci0JCQkJLy8gdGhlbiBmbGF0bm9kZSBtdXN0IGhhdmUgYmVlbiB0aGUgbGFzdCBvbmUsIHNvIG5lZWQgdG8KLQkJCQkvLyB1cGRhdGUKLQkJCQkvLyBhbnkgZG93bnN0cmVhbSBvbmVzCi0JCQkJaWYgKGZpcnN0RG93blN0cmVhbU5vZGUgIT0gbnVsbCkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvci5hZGp1c3RTdGFydChmaXJzdERvd25TdHJlYW1Ob2RlLCBmTGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJcmVzdWx0LnNldERlbGV0ZWRUZXh0KGZEZWxldGVkVGV4dCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBJZiBvbmx5IG9uZSBub2RlIGlzIGludm9sdmVkLCBzZWVzIGhvdyBtYW55IHJlZ2lvbnMgYXJlIGNoYW5nZWQuIElmCi0JICogb25seSBvbmUsIHRoZW4gaXRzIGEgJ3JlZ2lvbkNoYW5nZWQnIGV2ZW50IC4uLiBpZiBtb3JlIHRoYW4gb25lLCBpdHMgYQotCSAqICdyZWdpb25zUmVwbGFjZWQnIGV2ZW50LgotCSAqLwotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZWdpb25DaGVjayhDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIklTdHJ1Y3R1cmVkRG9jdW1lbnQ6OnJlZ2lvbnNSZXBsYWNlZENoZWNrIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8kTk9OLU5MUy0xJAotCQkvLyROT04tTkxTLTEkCi0JCS8vIHRoZSAicmVnaW9uc1JlcGxhY2VkIiBldmVudCBjb3VsZCBvbmx5IGJlIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlCi0JCS8vIG5vZGVsaXN0cwotCQkvLyBhcmUgZWFjaCBvbmx5ICIxIiBpbiBsZW5ndGguCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCBvbGRMZW5ndGggPSBvbGROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJaW50IG5ld0xlbmd0aCA9IG5ld05vZGVzLmdldExlbmd0aCgpOwotCQlpZiAoKG9sZExlbmd0aCAhPSAxKSB8fCAobmV3TGVuZ3RoICE9IDEpKSB7Ci0JCQlyZXN1bHQgPSBudWxsOwotCQl9IGVsc2UgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlID0gb2xkTm9kZXMuaXRlbSgwKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3Tm9kZSA9IG5ld05vZGVzLml0ZW0oMCk7Ci0JCQlyZXN1bHQgPSByZWdpb25DaGVjayhvbGROb2RlLCBuZXdOb2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIElmIG9ubHkgb25lIG5vZGUgaXMgaW52b2x2ZWQsIHNlZXMgaG93IG1hbnkgcmVnaW9ucyBhcmUgY2hhbmdlZC4gSWYKLQkgKiBvbmx5IG9uZSwgdGhlbiBpdHMgYSAncmVnaW9uQ2hhbmdlZCcgZXZlbnQgLi4uIGlmIG1vcmUgdGhhbiBvbmUsIGl0cyBhCi0JICogJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlZ2lvbkNoZWNrKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlKSB7Ci0JCS8vCi0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gb2xkTm9kZS5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zID0gbmV3Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCUlUZXh0UmVnaW9uW10gb2xkUmVnaW9uc0FycmF5ID0gb2xkUmVnaW9ucy50b0FycmF5KCk7Ci0JCUlUZXh0UmVnaW9uW10gbmV3UmVnaW9uc0FycmF5ID0gbmV3UmVnaW9ucy50b0FycmF5KCk7Ci0JCS8vCi0JCS8vIGZvciB0aGUgJ3JlZ2lvbnNSZXBsYWNlZCcgZXZlbnQsIHdlIGRvbid0IGNhcmUgaWYKLQkJLy8gdGhlIHJlZ2lvbnMgY2hhbmdlZCBkdWUgdG8gdHlwZSwgb3IgdGV4dCwKLQkJLy8gd2UnbGwganVzdCBjb2xsZWN0IGFsbCB0aG9zZSB0aGF0IGFyZSBub3QgZXF1YWwKLQkJLy8gaW50byB0aGUgb2xkIGFuZCBuZXcgcmVnaW9uIGxpc3RzLgotCQkvLyBOb3RlOiB3ZSwgb2YgY291cnNlLCBhc3N1bWUgdGhhdCBvbGQgYW5kIG5ldyByZWdpb25zCi0JCS8vIGFyZSBiYXNpY2FsbHkgY29udGlndW91cyAtLSBhbmQgd2UgZm9yY2UgaXQgdG8gYmUgc28sCi0JCS8vIGV2ZW4gaWYgbm90IGxpdGVyYWxseSBzbywgYnkgc3RhcnRpbmcgYXQgYmVnaW5uaW5nIHRvCi0JCS8vIGZpbmQgZmlyc3QgZGlmZmVyZW5jZSwgYW5kIHRoZW4gc3RhcnRpbmcgYXQgZW5kIHRvIGZpbmQKLQkJLy8gbGFzdCBkaWZmZXJlbmNlLiBFdmVyeXRoaW5nIGluIGJldHdlZW4gd2UgYXNzdW1lIGlzIGRpZmZlcmVudC4KLQkJLy8KLQkJLy8gZ29pbmcgdXAgaXMgZWFzeSwgd2Ugc3RhcnQgYXQgemVybyBpbiBlYWNoLCBhbmQgY29udGludWUKLQkJLy8gdGlsbCByZWdpb25zIGFyZSBub3QgdGhlIHNhbWUuCi0JCWludCBzdGFydE9mRGlmZmVyZW5jZXMgPSBfY29tcHV0ZVN0YXJ0T2ZEaWZmZXJlbmNlcyhvbGROb2RlLCBvbGRSZWdpb25zLCBuZXdOb2RlLCBuZXdSZWdpb25zKTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNPbGQgPSAtMTsKLQkJaW50IGVuZE9mRGlmZmVyZW5jZXNOZXcgPSAtMTsKLQkJLy8KLQkJLy8KLQkJLy8gaWYgb25lIG9mIHRoZSBsaXN0cyBhcmUgc2hvcnRlciB0aGFuIHdoZXJlIHRoZSBkaWZmZXJlbmNlcyBzdGFydCwKLQkJLy8gdGhlbgotCQkvLyB0aGVuIHNvbWUgcG9ydGlvbiBvZiB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbAotCQlpZiAoKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBvbGRSZWdpb25zLnNpemUoKSkgfHwgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+PSBuZXdSZWdpb25zLnNpemUoKSkpIHsKLQkJCWlmIChvbGRSZWdpb25zLnNpemUoKSA8IG5ld1JlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJLy8gSU5TRVJUIENBU0UKLQkJCQkvLyB0aGVuIHRoZXJlIGFyZSBuZXcgcmVnaW9ucyB0byBhZGQKLQkJCQkvLyAgICAgdGhlc2UgbGVuZ3RocyB3aWxsIGNhdXNlIHRoZSB2ZWN0b3Igb2Ygb2xkIG9uZXMgdG8gbm90Ci0JCQkJLy8gICAgIGhhdmUgYW55IGVsZW1lbnRzLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcgcmVnaW9ucyB0byBoYXZlCi0JCQkJLy8gICAgIGp1c3QgdGhlIG5ldyBvbmVzLgotCQkJCXN0YXJ0T2ZEaWZmZXJlbmNlcyA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGg7Ci0JCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCWVuZE9mRGlmZmVyZW5jZXNOZXcgPSBuZXdSZWdpb25zQXJyYXkubGVuZ3RoIC0gMTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpID4gbmV3UmVnaW9ucy5zaXplKCkpIHsKLQkJCQkJLy8gREVMRVRFIENBU0UKLQkJCQkJLy8gdGhlbiB0aGVyZSBhcmUgb2xkIHJlZ2lvbnMgdG8gZGVsZXRlCi0JCQkJCS8vICAgIHRoZXNlIGxlbmd0aHMgd2lsbCBjYXVzZSB0aGUgdmVjdG9yIG9mIG9sZCByZWdpb25zIHRvCi0JCQkJCS8vICAgIGNvbnRhaW4gdGhlIG9uZXMgdG8gZGVsZXRlLCBhbmQgdGhlIHZlY3RvciBvZiBuZXcKLQkJCQkJLy8gcmVnaW9ucwotCQkJCQkvLyAgICBub3QgaGF2ZSBhbnkgZWxlbWVudHMKLQkJCQkJc3RhcnRPZkRpZmZlcmVuY2VzID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aDsKLQkJCQkJZW5kT2ZEaWZmZXJlbmNlc09sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gbmV3UmVnaW9uc0FycmF5Lmxlbmd0aCAtIDE7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gZWxzZSB0aGUgbGlzdHMgYXJlIGlkZW50aWNhbCEKLQkJCQkJLy8gdW5saWtlbHkgZXZlbnQsIHByb2JhYmx5IGVycm9yIGluIGN1cnJlbnQgZGVzaWduLCBzaW5jZQotCQkJCQkvLyB3ZSBjaGVjayBmb3IgaWRlbnRpdHkgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mCi0JCQkJCS8vIHJlcGFyc2luZy4KLQkJCQkJcmVzdWx0ID0gbmV3IE5vQ2hhbmdlRXZlbnQoZlN0cnVjdHVyZWREb2N1bWVudCwgZlJlcXVlc3RlciwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChzdGFydE9mRGlmZmVyZW5jZXMgPiAtMSkgJiYgKGVuZE9mRGlmZmVyZW5jZXNPbGQgPCAwKSAmJiAoZW5kT2ZEaWZmZXJlbmNlc05ldyA8IDApKSB7Ci0JCQkJLy8gV2UgZm91bmQgYSBub3JtYWwgc3RhcnRPZkRpZmZlcm5jZXMsIGJ1dCBoYXZlIG5vdCB5ZXQgZm91bmQKLQkJCQkvLyB0aGUgZW5kcy4KLQkJCQkvLyBXZSdsbCBsb29rIGZvciB0aGUgZW5kIG9mIGRpZmZlcmVuY2VzIGJ5IGdvaW5nIGJhY2t3YXJkcwotCQkJCS8vIGRvd24gdGhlIHR3byBsaXN0cy4KLQkJCQkvLyBIZXJlIHdlIG5lZWQgYSBzZXBlcmF0ZSBpbmRleCBmb3IgZWFjaCBhcnJheSwgc2luY2UgdGhleQotCQkJCS8vIG1heQotCQkJCS8vIGJlIChhbmQKLQkJCQkvLyBwcm9iYWJseSBhcmUpIG9mIGRpZmZlcmVudCBsZW5ndGhzLgotCQkJCWludCBpbmRleE9sZCA9IG9sZFJlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCWludCBpbmRleE5ldyA9IG5ld1JlZ2lvbnNBcnJheS5sZW5ndGggLSAxOwotCQkJCXdoaWxlICgoaW5kZXhPbGQgPj0gc3RhcnRPZkRpZmZlcmVuY2VzKSAmJiAoX2dyZWF0ZXJUaGFuRWZmZWN0ZWRSZWdpb24ob2xkTm9kZSwgb2xkUmVnaW9uc0FycmF5W2luZGV4T2xkXSkpKSB7Ci0JCQkJCWlmICgoIShvbGROb2RlLnNhbWVBcyhvbGRSZWdpb25zQXJyYXlbaW5kZXhPbGRdLCBuZXdOb2RlLCBuZXdSZWdpb25zQXJyYXlbaW5kZXhOZXddLCBmTGVuZ3RoRGlmZmVyZW5jZSkpKSkgewotCQkJCQkJLy9lbmRPZkRpZmZlcmVuY2VzT2xkID0gaW5kZXhPbmU7Ci0JCQkJCQkvL2VuZE9mRGlmZmVyZW5jZXNOZXcgPSBpbmRleFR3bzsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWluZGV4T2xkLS07Ci0JCQkJCWluZGV4TmV3LS07Ci0JCQkJfQotCQkJCWVuZE9mRGlmZmVyZW5jZXNPbGQgPSBpbmRleE9sZDsKLQkJCQllbmRPZkRpZmZlcmVuY2VzTmV3ID0gaW5kZXhOZXc7Ci0JCQl9Ci0JCX0KLQkJLy8KLQkJLy8gcmVzdWx0ICE9IG51bGwgbWVhbnMgdGhlIGltcG9zc2libGUgY2FzZSBhYm92ZSBvY2N1cnJlZAotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIE5vdyBmb3JtIHRoZSB0d28gdmVjdG9ycyBvZiBkaWZmZXJlbnQgcmVnaW9ucwotCQkJSVRleHRSZWdpb25MaXN0IGhvbGRPbGRSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQkJSVRleHRSZWdpb25MaXN0IGhvbGROZXdSZWdpb25zID0gbmV3IFRleHRSZWdpb25MaXN0SW1wbCgpOwotCQkJaWYgKHN0YXJ0T2ZEaWZmZXJlbmNlcyA+IC0xICYmIGVuZE9mRGlmZmVyZW5jZXNPbGQgPiAtMSkgewotCQkJCWZvciAoaW50IGkgPSBzdGFydE9mRGlmZmVyZW5jZXM7IGkgPD0gZW5kT2ZEaWZmZXJlbmNlc09sZDsgaSsrKSB7Ci0JCQkJCWhvbGRPbGRSZWdpb25zLmFkZChvbGRSZWdpb25zQXJyYXlbaV0pOwotCQkJCX0KLQkJCX0KLQkJCWlmIChzdGFydE9mRGlmZmVyZW5jZXMgPiAtMSAmJiBlbmRPZkRpZmZlcmVuY2VzTmV3ID4gLTEpIHsKLQkJCQlmb3IgKGludCBpID0gc3RhcnRPZkRpZmZlcmVuY2VzOyBpIDw9IGVuZE9mRGlmZmVyZW5jZXNOZXc7IGkrKykgewotCQkJCQlob2xkTmV3UmVnaW9ucy5hZGQobmV3UmVnaW9uc0FycmF5W2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoaG9sZE9sZFJlZ2lvbnMuc2l6ZSgpID09IDAgJiYgaG9sZE5ld1JlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCQkvLyB0aGVuIHRoaXMgbWVhbnMgdGhlIHJlZ2lvbnMgd2VyZSBpZGVudGljYWwsIHdoaWNoIG1lYW5zCi0JCQkJLy8gc29tZW9uZQotCQkJCS8vIHBhc3RlZCBleGFjdGx5IHRoZSBzYW1lIHRoaW5nIHRoZXkgaGFkIHNlbGVjdGVkLCBvciAhISEKLQkJCQkvLyBzb21lb25lIGRlbGV0ZWQgdGhlIGVuZCBicmFja2V0IG9mIHRoZSB0YWcuICEhIT8KLQkJCQlyZXN1bHQgPSBuZXcgTm9DaGFuZ2VFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBmQ2hhbmdlcywgZlN0YXJ0LCBmTGVuZ3RoVG9SZXBsYWNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy9JZiBib3RoIGhvbGRPbGRSZWdpb25zIGFuZCBob2xkTmV3UmVnaW9ucyBhcmUgb2YgbGVuZ3RoIDEsCi0JCQkJLy8gdGhlbiBpdHMKLQkJCQkvLyBhICJyZWdpb24gY2hhbmdlZCIgZXZlbnQsIGVsc2UgYSAicmVnaW9ucyByZXBsYWNlZCIgZXZlbnQuCi0JCQkJLy8gc28gd2Ugd2FudCB0aGUgbmV3IGluc3RhbmNlIG9mIHJlZ2lvbiB0byBiZWNvbWUgcGFydCBvZiB0aGUKLQkJCQkvLyBvbGQgaW5zdGFuY2Ugb2Ygb2xkIG5vZGUKLQkJCQlpZiAoKGhvbGRPbGRSZWdpb25zLnNpemUoKSA9PSAxKSAmJiAoaG9sZE5ld1JlZ2lvbnMuc2l6ZSgpID09IDEpICYmIF9yZWdpb25zU2FtZUtpbmQoKGhvbGROZXdSZWdpb25zLmdldCgwKSksIChob2xkT2xkUmVnaW9ucy5nZXQoMCkpKSkgewotCQkJCQlJVGV4dFJlZ2lvbiBuZXdPbGRSZWdpb24gPSBzd2FwTmV3Rm9yT2xkUmVnaW9uKG9sZE5vZGUsIGhvbGRPbGRSZWdpb25zLmdldCgwKSwgbmV3Tm9kZSwgaG9sZE5ld1JlZ2lvbnMuZ2V0KDApKTsKLQkJCQkJLy8gLS0gbmVlZCB0byB1cGRhdGUgYW55IGRvd24gc3RyZWFtIHJlZ2lvbnMsIHdpdGhpbiB0aGlzCi0JCQkJCS8vICdvbGROb2RlJwotCQkJCQl1cGRhdGVEb3duU3RyZWFtUmVnaW9ucyhvbGROb2RlLCBuZXdPbGRSZWdpb24pOwotCQkJCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KGZTdHJ1Y3R1cmVkRG9jdW1lbnQsIGZSZXF1ZXN0ZXIsIG9sZE5vZGUsIG5ld09sZFJlZ2lvbiwgZkNoYW5nZXMsIGZTdGFydCwgZkxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVwbGFjZVJlZ2lvbnMob2xkTm9kZSwgaG9sZE9sZFJlZ2lvbnMsIG5ld05vZGUsIGhvbGROZXdSZWdpb25zKTsKLQkJCQkJLy8gLS0gbmVlZCB0byB1cGRhdGUgYW55IGRvd24gc3RyZWFtIHJlZ2lvbnMsIHdpdGhpbiB0aGlzCi0JCQkJCS8vICdvbGROb2RlJwotCQkJCQkvLyBkb24ndCBuZWVkIHdpdGggdGhlIHdheSByZXBsYWNlUmVnaW9ucyBpcyBpbXBsZW1lbnRlZC4KLQkJCQkJLy8gSXQgaGFuZGxlcy4KLQkJCQkJLy9pZihob2xkTmV3UmVnaW9ucy5zaXplKCkgPiAwKQotCQkJCQkvL3VwZGF0ZURvd25TdHJlYW1SZWdpb25zKG9sZE5vZGUsIChJVGV4dFJlZ2lvbikKLQkJCQkJLy8gaG9sZE5ld1JlZ2lvbnMubGFzdEVsZW1lbnQoKSk7Ci0JCQkJCXJlc3VsdCA9IG5ldyBSZWdpb25zUmVwbGFjZWRFdmVudChmU3RydWN0dXJlZERvY3VtZW50LCBmUmVxdWVzdGVyLCBvbGROb2RlLCBob2xkT2xkUmVnaW9ucywgaG9sZE5ld1JlZ2lvbnMsIGZDaGFuZ2VzLCBmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFuIGVudHJ5IHBvaW50IGZvciByZXBhcnNpbmcuIEl0IGNhbGN1bGF0ZXMgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eQotCSAqIGVuZCBmbGF0bm9kZXMgYmFzZWQgb24gdGhlIHN0YXJ0IHBvaW50IGFuZCBsZW5ndGggb2YgdGhlIGNoYW5nZXMuCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXBhcnNlKCkgewotCQlTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB3ZSBkbyBub3QgaGF2ZSBhIGNhY2hlZE5vZGUsIHRoZW4gdGhlIGRvY3VtZW50Ci0JCS8vIG11c3QgYmUgZW1wdHksIHNvIHNpbXBseSB1c2UgJ251bGwnIGFzIHRoZSBkaXJ0eVN0YXJ0IGFuZCBkaXJ0eUVuZAotCQkvLyBvdGhlcndpc2UsIGZpbmQgdGhlbS4KLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlmaW5kRGlydHlTdGFydChmU3RhcnQpOwotCQkJaW50IGVuZCA9IGZTdGFydCArIGZMZW5ndGhUb1JlcGxhY2U7Ci0JCQlmaW5kRGlydHlFbmQoZW5kKTsKLQkJfQotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNoZWNrSGV1cmlzdGljcygpOwotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gcmVwYXJzZShkaXJ0eVN0YXJ0LCBkaXJ0eUVuZCk7Ci0JCX0KLQkJZW5kUmVQYXJzZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEFuIGVudHJ5IHBvaW50IGZvciByZXBhcnNpbmcuIEl0IGNhbGN1bGF0ZXMgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eQotCSAqIGVuZCBmbGF0bm9kZXMgYmFzZWQgb24gc3VnZ2VzdGVkIHBvc2l0aW9ucyB0byBiZWdpbiBhbmQgZW5kLiBUaGlzIGlzCi0JICogbmVlZGVkIGZvciBjYXNlcyB3aGVyZSBwYXJzaW5nIG11c3QgZ28gYmV5b25kIHRoZSBpbW1lZGlhdGUgbm9kZSBhbmQKLQkgKiBpdHMgZGlyZWN0IG5laWdoYm9ycy4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoaW50IHJlU2NhblN0YXJ0SGludCwgaW50IHJlU2NhbkVuZEhpbnQpIHsKLQkJU3RydWN0dXJlZERvY3VtZW50RXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgd2UgZG8gbm90IGhhdmUgYSBjYWNoZWROb2RlLCB0aGVuIHRoZSBkb2N1bWVudAotCQkvLyBtdXN0IGJlIGVtcHR5LCBzbyBzaW1wbHkgdXNlICdudWxsJyBhcyB0aGUgZGlydHlTdGFydCBhbmQgZGlydHlFbmQKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlmaW5kRGlydHlTdGFydChyZVNjYW5TdGFydEhpbnQpOwotCQkJZmluZERpcnR5RW5kKHJlU2NhbkVuZEhpbnQpOwotCQl9Ci0JCXJlc3VsdCA9IHJlcGFyc2UoZGlydHlTdGFydCwgZGlydHlFbmQpOwotCQlpc1BhcnNpbmcgPSBmYWxzZTsKLQkJLy8gZGVidWcKLQkJLy92ZXJpZnlTdHJ1Y3R1cmVkKHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIGNvcmUgcmVwYXJzaW5nIG1ldGhvZCAuLi4gYWZ0ZXIgdGhlIGRpcnR5IHN0YXJ0IGFuZCBkaXJ0eSBlbmQgaGF2ZQotCSAqIGJlZW4gY2FsY3VsYXRlZCBlbHNld2hlcmUuCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlcGFyc2UoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkaXJ0eVN0YXJ0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRpcnR5RW5kKSB7Ci0JCVN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCWludCByZXNjYW5TdGFydCA9IC0xOwotCQlpbnQgcmVzY2FuRW5kID0gLTE7Ci0JCWJvb2xlYW4gZmlyc3RUaW1lID0gZmFsc2U7Ci0JCS8vCi0JCS8vICJzYXZlIiB0aGUgb2xkTm9kZXMgKHRoYXQgbWF5IGJlIHJlcGxhY2VkKSBpbiBhIGxpc3QKLQkJQ29yZU5vZGVMaXN0IG9sZE5vZGVzID0gZm9ybU9sZE5vZGVzKGRpcnR5U3RhcnQsIGRpcnR5RW5kKTsKLQkJaWYgKGRpcnR5U3RhcnQgPT0gbnVsbCB8fCBkaXJ0eUVuZCA9PSBudWxsKSB7Ci0JCQkvLyBkaXJ0eVN0YXJ0IG9yIGRpcnR5IGVuZCBhcmUgbnVsbCwgdGhlbiB0aGF0IG1lYW5zIHdlIGRpZG4ndAotCQkJLy8gaGF2ZQotCQkJLy8gYQotCQkJLy8gY2FjaGVkIG5vZGUsIHdoaWNoIG1lYW5zIHdlIGhhdmUgYW4gZW1wdHkgZG9jdW1lbnQsIHNvIHdlCi0JCQkvLyBqdXN0IG5lZWQgdG8gcmVzY2FuIHRoZSBjaGFuZ2VzCi0JCQlyZXNjYW5TdGFydCA9IDA7Ci0JCQlyZXNjYW5FbmQgPSBmQ2hhbmdlcy5sZW5ndGgoKTsKLQkJCWZpcnN0VGltZSA9IHRydWU7Ci0JCX0gZWxzZSB7Ci0JCQkvLyBzZXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IHRvIHJlc2NhbgotCQkJcmVzY2FuU3RhcnQgPSBkaXJ0eVN0YXJ0LmdldFN0YXJ0KCk7Ci0JCQkvLwotCQkJLy8gc2V0IHRoZSBlbmQgb2YgdGhlIHRleHQgdG8gcmVzY2FuCi0JCQkvLyBub3RpY2Ugd2UgdXNlIHRoZSBzYW1lIHJhdGlvbmFsZSBhcyBmb3IgdGhlIHJlc2NhblN0YXJ0LAotCQkJLy8gd2l0aCB0aGUgYWRkZWQgY2F2ZWF0IHRoYXQgbGVuZ3RoIGhhcyB0byBiZSBhZGRlZCB0byBpdCwKLQkJCS8vIHRvIGNvbXBlbnNhdGUgZm9yIHRoZSBuZXcgdGV4dCB3aGljaCBoYXMgYmVlbiBhZGRlZCBvciBkZWxldGVkLgotCQkJLy8gSWYgY2hhbmdlcyBoYXMgemVybyBsZW5ndGgsIHRoZW4gImxlbmd0aCIgd2lsbCBiZSBuZWdhdGl2ZSwKLQkJCS8vIHNpbmNlCi0JCQkvLyB3ZSBhcmUgZGVsZXRpbmcgdGV4dC4gT3RoZXJ3aXNlLCB1c2UgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotCQkJLy8gd2hhdCdzIHNlbGVjdGVkIHRvIGJlIHJlcGxhY2VkIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgdGV4dC4KLQkJCXJlc2NhbkVuZCA9IGRpcnR5RW5kLmdldEVuZCgpICsgZkxlbmd0aERpZmZlcmVuY2U7Ci0JCX0KLQkJLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgb2xkIHN0dWZmICJzYXZlZCIgYXdheSwgdXBkYXRlIHRoZSBkb2N1bWVudAotCQkvLyB3aXRoIHRoZSBjaGFuZ2VzLgotCQkvLyBGVVRVUkVfVE9fRE8gLS0gZG9uJ3QgZmlyZSAiZG9jdW1lbnQgY2hhbmdlZCIgZXZlbnQgdGlsbCBsYXRlcgotCQlmU3RydWN0dXJlZERvY3VtZW50LnVwZGF0ZURvY3VtZW50RGF0YShmU3RhcnQsIGZMZW5ndGhUb1JlcGxhY2UsIGZDaGFuZ2VzKTsKLQkJLy8gLS0tLS0tLS0tLS0tLS0tLS0tIG5vdyB0aGUgcmVhbCB3b3JrCi0JCXJlc3VsdCA9IGNvcmVfcmVwYXJzZShyZXNjYW5TdGFydCwgcmVzY2FuRW5kLCBvbGROb2RlcywgZmlyc3RUaW1lKTsKLQkJLy8KLQkJLy8gZXZlbnQgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgaW5jYXNlIHRoZXJlIGlzCi0JCS8vIHNvbWUgb3BpdG1pemF0aW9uIHRoZXkgY2FuIGRvCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbkxpc3Qgb2xkUmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucykgewotCQlpbnQgaW5zZXJ0UG9zID0gLTE7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gb2xkTm9kZS5nZXRSZWdpb25zKCk7Ci0JCS8vIG1ha2UgYSBmYWtlIGZsYXRub2RlIHRvIGJlIG5ldyBwYXJlbnQgb2Ygb2xkUmVnaW9ucywgc28gdGhlaXIgdGV4dAotCQkvLyB3aWxsIGJlIHJpZ2h0LgotCQkvL0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaG9sZE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldwotCQkvLyBCYXNpY1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGROb2RlKTsKLQkJLy8KLQkJLy8gbmVlZCB0byByZXNldCB0aGUgcGFyZW50IG9mIHRoZSBuZXcgdG8tYmUtaW5zZXJ0ZWQgcmVnaW9ucyB0byBiZQotCQkvLyB0aGUKLQkJLy8gc2FtZSBvbGROb2RlIHRoYXQgaXMgdGhlIG9uZSBoYXZpbmcgaXRzIHJlZ2lvbnMgY2hhbmdlZAotCQkvLyBEVywgNC8xNi8yMDAzLCByZW1vdmVkIHNpbmNlIElUZXh0UmVnaW9uIG5vIGxvbmdlciBoYXMgcGFyZW50LgotCQkvLyAJCUlUZXh0UmVnaW9uQ29udGFpbmVyIG9sZFBhcmVudCA9IG9sZE5vZGU7Ci0JCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld1JlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJLy8JCQlBYnN0cmFjdFJlZ2lvbiByZWdpb24gPSAoQWJzdHJhY3RSZWdpb24pIG5ld1JlZ2lvbnMuZWxlbWVudEF0KGkpOwotCQkvLwkJCXJlZ2lvbi5zZXRQYXJlbnQob2xkUGFyZW50KTsKLQkJLy8JCX0KLQkJLy8gaWYgdGhlcmUgYXJlIG5vIG9sZCByZWdpb25zLCBpbnNlcnQgdGhlIG5ldyByZWdpb25zIGFjY29yZGluZyB0bwotCQkvLyBvZmZzZXQKLQkJaWYgKG9sZFJlZ2lvbnMuc2l6ZSgpID09IDApIHsKLQkJCUlUZXh0UmVnaW9uIGZpcnN0TmV3UmVnaW9uID0gbmV3UmVnaW9ucy5nZXQoMCk7Ci0JCQlpbnQgZmlyc3RPZmZzZXQgPSBuZXdOb2RlLmdldFN0YXJ0T2Zmc2V0KGZpcnN0TmV3UmVnaW9uKTsKLQkJCS8vIGlmIGF0IGJlZ2lubmluZywgaW5zZXJ0IHRoZXJlCi0JCQlpZiAoZmlyc3RPZmZzZXQgPT0gMCkgewotCQkJCWluc2VydFBvcyA9IDA7Ci0JCQl9IGVsc2UgewotCQkJCS8vCi0JCQkJSVRleHRSZWdpb24gcmVnaW9uQXRPZmZzZXQgPSBvbGROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZpcnN0T2Zmc2V0KTsKLQkJCQlpZiAocmVnaW9uQXRPZmZzZXQgPT0gbnVsbCkKLQkJCQkJaW5zZXJ0UG9zID0gcmVnaW9ucy5zaXplKCk7Ci0JCQkJZWxzZQotCQkJCQlpbnNlcnRQb3MgPSByZWdpb25zLmluZGV4T2YocmVnaW9uQXRPZmZzZXQpOwotCQkJfQotCQl9IGVsc2UgewotCQkJLy8gZWxzZSwgZGVsZXRlIG9sZCBvbmVzIGJlZm9yZSBpbnNlcnRpbmcgbmV3IG9uZXMgaW4gdGhlaXIgcGxhY2UKLQkJCUlUZXh0UmVnaW9uIGZpcnN0T2xkUmVnaW9uID0gb2xkUmVnaW9ucy5nZXQoMCk7Ci0JCQlpbnNlcnRQb3MgPSByZWdpb25zLmluZGV4T2YoZmlyc3RPbGRSZWdpb24pOwotCQkJcmVnaW9ucy5yZW1vdmVBbGwob2xkUmVnaW9ucyk7Ci0JCX0KLQkJcmVnaW9ucy5hZGRBbGwoaW5zZXJ0UG9zLCBuZXdSZWdpb25zKTsKLQkJLy8gbm93IHJlZ2lvbnMgdmVjdG9yIG9mIGVhY2ggbm9kZSBzaG91bGQgYmUgb2YgZXF1YWwgbGVuZ3RoLAotCQkvLyBzbyBnbyB0aHJvdWdoIGVhY2gsIGFuZCBtYWtlIHN1cmUgdGhlIG9sZCByZWdpb25zCi0JCS8vIG9mZnNldHMgbWF0Y2hlcyB0aGUgbmV3IHJlZ2lvbnMgb2Zmc2V0cwotCQkvLyAod2UnbGwganVzdCBhc3NpZ24gdGhlbSBhbGwsIGJ1dCBjb3VsZCBiZSBzbGlnaHRseSBtb3JlIGVmZmllY2llbnQpCi0JCUlUZXh0UmVnaW9uTGlzdCBhbGxOZXdSZWdpb25zID0gbmV3Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gbmV4dE9sZGlzaFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJSVRleHRSZWdpb24gbmV4dE5ld1JlZ2lvbiA9IGFsbE5ld1JlZ2lvbnMuZ2V0KGkpOwotCQkJbmV4dE9sZGlzaFJlZ2lvbi5lcXVhdGVQb3NpdGlvbnMobmV4dE5ld1JlZ2lvbik7Ci0JCQljaGVja0FuZEFzc2lnblBhcmVudChvbGROb2RlLCBuZXh0T2xkaXNoUmVnaW9uKTsKLQkJfQotCQlvbGROb2RlLnNldExlbmd0aChuZXdOb2RlLmdldExlbmd0aCgpKTsKLQkJb2xkTm9kZS5zZXRFbmRlZChuZXdOb2RlLmlzRW5kZWQoKSk7Ci0JCW9sZE5vZGUuc2V0UGFyZW50RG9jdW1lbnQobmV3Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpKTsKLQkJLy8gcmVtb3ZlZCBjb25jZXB0IG9mIHBhcnQgb2YgdGhlc2UgcmVnaW9ucywgc28gbm8gbG9uZ2VyIG5lZWQgdG8gZG8uCi0JCS8vCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJLy8JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIG9sZFJlZ2lvbnMuZWxlbWVudEF0KGkpOwotCQkvLwkJCXJlZ2lvbi5zZXRQYXJlbnQoaG9sZE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCS8vCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlU2V0Q2FjaGVkTm9kZShDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLyB1c2UgdGhlIGxhc3QgbmV3Tm9kZSBhcyB0aGUgbmV3IGNhY2hlZE5vZGUgcG9zdGlvbiwgdW5sZXNzIGl0cyBudWxsCi0JCS8vIChlLmcuIHdoZW4gbm9kZXMgYXJlIGRlbGV0ZWQpIGluIHdoaWNoIGNhc2UsIGFzc2lnbgotCQkvLyBpdCB0byBhICJzYWZlIiBub2RlIHNvIHdlIGRvbid0IGxvc2UgcmVmZXJlbmNlIHRvIHRoZQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnQhCi0JCWlmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCS8vIHVzZSBsYXN0IG5ldyBub2RlIGFzIHRoZSBjYWNoZQotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSkpOwotCQl9IGVsc2UgewotCQkJLy8gaWYgY2FjaGVkTm9kZSBpcyBhbiBvbGQgbm9kZSwgdGhlbiB3ZSdyZSBpbiB0cm91YmxlOgotCQkJLy8gd2UgY2FuJ3QgbGVhdmUgaXQgYXMgdGhlIGNhY2hlZCBub2RlISBhbmQgaXRzIGFscmVhZHkKLQkJCS8vIGJlZW4gZGlzY29ubmVjdGVkIGZyb20gdGhlIG1vZGVsLCBzbyB3ZSBjYW4ndCBkbyBnZXROZXh0Ci0JCQkvLyBvciBnZXRQcmV2aW91cywgc28gd2UnbGwgZ2V0IG9uZSB0aGF0IGlzIHJpZ2h0IGJlZm9yZQotCQkJLy8gKG9yIHJpZ2h0IGFmdGVyKSB0aGUgb2Zmc2V0IG9mIHRoZSBvbGQgbm9kZXMgdGhhdCBhcmUgYmVpbmcKLQkJCS8vIGRlbGV0ZWQuCi0JCQkvLyAKLQkJCS8vIGlmIG5ld05vZGVzSGVhZCBhbmQgY2FjaGVkTm9kZSBhcmUgYm90aCBudWxsLCB0aGVuCi0JCQkvLyBpdCBtZWFucyB3ZSB3ZXJlIGFza2VkIHRvIGluc2VydCBhbiBlbXB0eSBzdHJpbmcgaW50bwotCQkJLy8gYW4gZW1wdHkgZG9jdW1lbnQuIFNvIHdlIGhhdmUgbm90aGluZyB0byBkbyBoZXJlCi0JCQkvLyAodGhhdCBpcywgd2UgaGF2ZSBubyBub2RlIHRvIGNhY2hlKQotCQkJLy8gc2ltaWxhcmx5IGlmIHRoZXJlIGFyZSBubyBuZXcgbm9kZXMgYW5kIG5vIG9sZCBub2RlcyB0aGVuCi0JCQkvLyBub3RoaW5nIHRvIGRvIChidXQgdGhhdCBzaG91bGQgbmV2ZXIgaGFwcGVuIC4uLiB3ZSBzaG91bGRuJ3QKLQkJCS8vIGdldCB0aGVyZSBpZiB0aGVyZSBpcyBubyBldmVudCB0byBnZW5lcmF0ZSkuCi0JCQlpZiAoKGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0Q2FjaGVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJCS8vIG5vdGU6IHdlIGNhbid0IHNpbXBsZSB1c2Ugbm9kZUF0Q2hhcmFjdGVyT2Zmc2V0LCBzaW5jZSBpdAotCQkJCS8vIGRlcGVuZHMgb24gY2FjaGVkTm9kZS4KLQkJCQlpZiAob2xkTm9kZXMuaW5jbHVkZXMoZlN0cnVjdHVyZWREb2N1bWVudC5nZXRDYWNoZWREb2N1bWVudFJlZ2lvbigpKSkKLQkJCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihmU3RydWN0dXJlZERvY3VtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJfQotCQkJaWYgKChmU3RydWN0dXJlZERvY3VtZW50LmdldENhY2hlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgJiYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykpIHsKLQkJCQkvLyB0aGlzIHdpbGwgaGFwcGVuIG5vdyBsZWdpdGFtYXRlbHkgd2hlbiBhbGwgdGV4dCBpcyBkZWxldGVkCi0JCQkJLy8gZnJvbSBhIGRvY3VtZW50Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJXYXJuaW5nOiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcjo6cmVTZXRDYWNoZWROb2RlOiBjb3VsZCBub3QgZmluZCBhIG5vZGUgdG8gY2FjaGUhIChpdHMgb2sgaWYgYWxsIHRleHQgZGVsZXRlZCkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnQgbmV3U3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCS8vIE5PVEU6IHRoaXMgbWV0aG9kIChhbmQgY2xhc3MpIGRlcGVuZCBvbiBiZWluZyBhYmxlIHRvCi0JCS8vIGRvIHRoZSBmb2xsb3dpbmcgY2FzdCAoaS5lLiByZWZlcmVuY2VzIHNvbWUgZmllbGRzIGRpcmVjdGx5KQotCQlmU3RydWN0dXJlZERvY3VtZW50ID0gKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0JCWZGaW5kUmVwbGFjZURvY3VtZW50QWRhcHRlciA9IG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNwbGljZShDb3JlTm9kZUxpc3Qgb2xkTm9kZXMsIENvcmVOb2RlTGlzdCBuZXdOb2RlcykgewotCQkvLwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0T2xkID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdE5ldyA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE9sZCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5ldyA9IG51bGw7Ci0JCS8vCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkUHJldmlvdXMgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5leHQgPSBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1ByZXZpb3VzID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0ID0gbnVsbDsKLQkJLy8KLQkJLy8gaWYgY2FsbGVkIHdpdGggYm90aCBhcmd1bWVudHMgZW1wdHkgbGlzdHMsIHdlIGNhbiBkaXNyZWdhcmQuCi0JCS8vIHRoaXMgaGFwcGVucywgZm9yIGV4YW1wbGUsIHdoZW4gc29tZSB0ZXh0IGlzIHJlcGxhY2VkIHdpdGggdGhlCi0JCS8vIGlkZW50aWNhbCB0ZXh0LgotCQlpZiAoKG9sZE5vZGVzLmdldExlbmd0aCgpID09IDApICYmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA9PSAwKSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJLy8gZ2V0IHBvaW50ZXJzCi0JCWlmIChuZXdOb2Rlcy5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCWZpcnN0TmV3ID0gbmV3Tm9kZXMuaXRlbSgwKTsKLQkJCWxhc3ROZXcgPSBuZXdOb2Rlcy5pdGVtKG5ld05vZGVzLmdldExlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJLy8KLQkJaWYgKG9sZE5vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJZmlyc3RPbGQgPSBvbGROb2Rlcy5pdGVtKDApOwotCQkJbGFzdE9sZCA9IG9sZE5vZGVzLml0ZW0ob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCWlmIChmaXJzdE9sZCAhPSBudWxsKQotCQkJCW9sZFByZXZpb3VzID0gZmlyc3RPbGQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmIChsYXN0T2xkICE9IG51bGwpCi0JCQkJb2xkTmV4dCA9IGxhc3RPbGQuZ2V0TmV4dCgpOwotCQl9Ci0JCS8vIGhhbmRsZSBzd2l0Y2gKLQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJLy8gc3dpdGNoIHN1cnJvdW5kaW5nIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMnIHJlZmVyZW5jZXMgdG8KLQkJCS8vIGxpc3RzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KGZpcnN0TmV3KTsKLQkJCWlmIChuZXdQcmV2aW91cyAhPSBudWxsKQotCQkJCW5ld1ByZXZpb3VzLnNldE5leHQoZmlyc3RPbGQpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKGxhc3ROZXcpOwotCQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCQluZXdOZXh0LnNldFByZXZpb3VzKGxhc3RPbGQpOwotCQkJLy8gc3dpdGNoIGxpc3QgcG9pbnRlcnMgdG8gc3Vycm91bmRpbmcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJaWYgKGZpcnN0T2xkICE9IG51bGwpCi0JCQkJZmlyc3RPbGQuc2V0UHJldmlvdXMobmV3UHJldmlvdXMpOwotCQkJaWYgKGxhc3RPbGQgIT0gbnVsbCkKLQkJCQlsYXN0T2xkLnNldE5leHQobmV3TmV4dCk7Ci0JCQlpZiAoZmlyc3ROZXcgIT0gbnVsbCkKLQkJCQlmaXJzdE5ldy5zZXRQcmV2aW91cyhvbGRQcmV2aW91cyk7Ci0JCQlpZiAobGFzdE5ldyAhPSBudWxsKQotCQkJCWxhc3ROZXcuc2V0TmV4dChvbGROZXh0KTsKLQkJfSBlbHNlIHsKLQkJCS8vIHNob3J0IGNpcmN1aXQgd2hlbiB0aGVyZSBhcmUgbm8gbmV3IG5vZGVzCi0JCQlpZiAob2xkUHJldmlvdXMgIT0gbnVsbCkKLQkJCQlvbGRQcmV2aW91cy5zZXROZXh0KG9sZE5leHQpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkKLQkJCQlvbGROZXh0LnNldFByZXZpb3VzKG9sZFByZXZpb3VzKTsKLQkJfQotCQkvLwotCQkvLyBTSURFIEVGRkVDVHMKLQkJLy8gaWYgd2UgaGF2ZSBvbGROb2RlcywgYW5kIGlmIG9sZE5leHQgb3Igb2xkUHJldmlvdXMgaXMgbnVsbCwKLQkJLy8gdGhhdCBtZWFucyB3ZSBhcmUgcmVwbGFjaW5nCi0JCS8vIHRoZSBsYXN0Tm9kZSBvciBmaXJzdE5vZGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMncyBjaGFpbiBvZiBub2RlcywKLQkJLy8gc28gd2UgbmVlZCB0byB1cGRhdGUgdGhlIHN0cnVjdHVyZWREb2N1bWVudHMgbGFzdCBvciBmaXJzdCBOb2RlCi0JCS8vIGFzIHRoZSBsYXN0IG9yIGZpcnN0IG9mIHRoZSBuZXcgbm9kZXMuCi0JCS8vIChhbmQgc29tZXRpbWVzIGV2ZW4gdGhlc2Ugd2lsbCBiZSBudWxsISBzdWNoIGFzIHdoZW4gZGVsZXRpbmcgYWxsCi0JCS8vIHRleHQgaW4gYSBkb2N1bWVudCkuCi0JCWlmICgob2xkTmV4dCA9PSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0TGFzdERvY3VtZW50UmVnaW9uKGxhc3ROZXcpOwotCQkJfSBlbHNlIHsKLQkJCQkvLyBpbiB0aGlzIGNhc2UsIHRoZSBsYXN0IG5vZGUgaXMgYmVpbmcgZGVsZXRlZCwgYnV0IG5vdAotCQkJCS8vIHJlcGxhY2VkCi0JCQkJLy8gd2l0aCBhbnl0aGluZy4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4ganVzdCBiYWNrIHVwIG9uZQotCQkJCS8vIGZyb20gdGhlIGZpcnN0IG9sZCBub2RlCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRMYXN0RG9jdW1lbnRSZWdpb24oZmlyc3RPbGQuZ2V0UHJldmlvdXMoKSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKChvbGRQcmV2aW91cyA9PSBudWxsKSAmJiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSkgewotCQkJaWYgKG5ld05vZGVzLmdldExlbmd0aCgpID4gMCkgewotCQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnQuc2V0Rmlyc3REb2N1bWVudFJlZ2lvbihmaXJzdE5ldyk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGluIHRoaXMgY2FzZSB0aGUgZmlyc3Qgbm9kZSBpcyBiZWluZyBkZWxldGVkLCBidXQgbm90Ci0JCQkJLy8gcmVwbGFjZWQKLQkJCQkvLyB3aXRoIGFueXRoaW5nLiBTbywgd2UganVzdCBnbyBvbmUgZm9yd2FyZCBwYXN0IHRoZSBsYXN0IG9sZAotCQkJCS8vIG5vZGUuCi0JCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRGaXJzdERvY3VtZW50UmVnaW9uKGxhc3RPbGQuZ2V0TmV4dCgpKTsKLQkJCX0KLQkJfQotCQkvLyBhcyBhIHRpbnkgb3B0aW1pemF0aW9uLCB3ZSByZXR1cm4gdGhlIGZpcnN0IG9mIHRoZSBkb3duc3RyZWFtCi0JCS8vIG5vZGVzLAotCQkvLyBpZiBhbnkKLQkJcmV0dXJuIG9sZE5leHQ7Ci0JfQotCi0JLyoqCi0JICogVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInJldXNlIiB0aGUgb2xkIGNvbnRhaW5lciByZWdpb24sIHdoZW4KLQkgKiBmb3VuZCB0byBiZSBzYW1lIChzbyBzYW1lIGluc3RhbmNlIGRvZXNuJ3QgY2hhbmdlKS4gVGhlIGdvYWwgaXMgdG8KLQkgKiAidHJhbnNmb3JtIiB0aGUgb2xkIHJlZ2lvbiwgc28gaXRzIGVxdWl2ZWxlbnQgdG8gdGhlIG5ld2x5IHBhcnNlZCBvbmUuCi0JICogIAotCSAqLwotCXByaXZhdGUgSVRleHRSZWdpb24gc3dhcE5ld0Zvck9sZFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZE5vZGUsIElUZXh0UmVnaW9uIG9sZFJlZ2lvbiwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlLCBJVGV4dFJlZ2lvbiBuZXdSZWdpb24pIHsKLQkJLy8gbWFrZXMgdGhlIG9sZCByZWdpb24gaW5zdGFuY2UgdGhlIGNvcnJlY3Qgc2l6ZS4KLQkJb2xkUmVnaW9uLmVxdWF0ZVBvc2l0aW9ucyhuZXdSZWdpb24pOwotCQkvLyBhZGp1c3RzIG9sZCBub2RlIGluc3RhbmNlIGFwcHJvcHJpYXRlbHkKLQkJb2xkTm9kZS5zZXRMZW5ndGgobmV3Tm9kZS5nZXRMZW5ndGgoKSk7Ci0JCW9sZE5vZGUuc2V0RW5kZWQobmV3Tm9kZS5pc0VuZGVkKCkpOwotCQkvLyB3ZSBkbyBoYXZlIHRvIHNldCB0aGUgcGFyZW50IGRvY3VtZW50LCBzaW5jZSB0aGUgb2xkTm9kZSdzCi0JCS8vIHdlcmUgc2V0IHRvIGEgdGVtcG9yYXJ5IG9uZSwgdGhlbiBuZXdOb2RlJ3MgaGF2ZSB0aGUKLQkJLy8gcmlnaHQgb25lLgotCQlvbGROb2RlLnNldFBhcmVudERvY3VtZW50KG5ld05vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKSk7Ci0JCS8vIGlmIHdlJ3JlIHRyYW5zZm9ybWluZyBhIGNvbnRhaW5lciByZWdpb24sIHdlIG5lZWQgdG8gYmUgc3VyZSB0bwotCQkvLyB0cmFuc2ZlciB0aGUgbmV3IGVtYmVkZGVkIHJlZ2lvbnMsIHRvIHRoZSBvbGQgcGFyZW50Ci0JCS8vIE5vdGU6IGlmIG9sZFJlZ2lvbiBoYXNFbWJlZGRlZFJlZ2lvbnMsIHRoZW4gd2Uga25vdyB0aGUKLQkJLy8gbmV3UmVnaW9uIGRvZXMgdG9vLCBzaW5jZSB3ZSBnb3QgaGVyZSBiZWNhdXNlIHRoZXkgd2VyZSB0aGUKLQkJLy8gc2FtZSB0eXBlLgotCQlpZiAoaXNDb2xsZWN0aW9uUmVnaW9uKG9sZFJlZ2lvbikpIHsgLy8gfHwKLQkJCS8vIGhhc0NvbnRhaW5lclJlZ2lvbnMob2xkUmVnaW9uKSkKLQkJCS8vIHsKLQkJCXRyYW5zZmVyRW1iZWRkZWRSZWdpb25zKG9sZE5vZGUsIChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgb2xkUmVnaW9uLCAoSVRleHRSZWdpb25Db250YWluZXIpIG5ld1JlZ2lvbik7Ci0JCX0KLQkJcmV0dXJuIG9sZFJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3dpdGNoTm9kZUxpc3RzKENvcmVOb2RlTGlzdCBvbGROb2RlcywgQ29yZU5vZGVMaXN0IG5ld05vZGVzKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gc3BsaWNlKG9sZE5vZGVzLCBuZXdOb2Rlcyk7Ci0JCS8vIGVuc3VyZSB0aGF0IHRoZSBvbGQgbm9kZXMgaG9sZCBubyByZWZlcmVuY2VzIHRvIHRoZSBleGlzdGluZyBtb2RlbAotCQlpZiAob2xkTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0SXRlbSA9IG9sZE5vZGVzLml0ZW0oMCk7Ci0JCQlmaXJzdEl0ZW0uc2V0UHJldmlvdXMobnVsbCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RJdGVtID0gb2xkTm9kZXMuaXRlbShvbGROb2Rlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJbGFzdEl0ZW0uc2V0TmV4dChudWxsKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvICJyZXVzZSIgdGhlIG9sZCBjb250YWluZXIgcmVnaW9uLCB3aGVuCi0JICogZm91bmQgdG8gYmUgc2FtZSAoc28gc2FtZSBpbnN0YW5jZSBkb2Vzbid0IGNoYW5nZSkuIFRoZSBnb2FsIGlzIHRvCi0JICogInRyYW5zZm9ybSIgdGhlIG9sZCByZWdpb24sIHNvIGl0cyBlcXVpdmVsZW50IHRvIHRoZSBuZXdseSBwYXJzZWQgb25lLgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgdHJhbnNmZXJFbWJlZGRlZFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGROb2RlLCBJVGV4dFJlZ2lvbkNvbnRhaW5lciBvbGRSZWdpb24sIElUZXh0UmVnaW9uQ29udGFpbmVyIG5ld1JlZ2lvbikgewotCQkvLyB0aGUgb2xkUmVnaW9uIHNob3VsZCBhbHJlYWR5IGhhdmUgdGhlIHJpZ2h0IHBhcmVudCwgc2luY2UKLQkJLy8gd2UgZ290IGhlcmUgYmVjYXVzZSBhbGwncyBlcXVpdmVsZW50IGV4Y2VwdCB0aGUgcmVnaW9uCi0JCS8vIHBvc3Rpb25zIGhhdmUgY2hhbmdlZC4KLQkJLy9vbGRSZWdpb24uc2V0UGFyZW50KG5ld1JlZ2lvbi5nZXRQYXJlbnQoKSk7Ci0JCS8vIGJ1dCB3ZSBzaG91bGQgY2hlY2sgaWYgdGhlcmUncyAibmVzdGVkIiBlbWJlZGRlZCByZWdpb25zLCBhbmQgaWYKLQkJLy8gc28sIHdlIGNhbiBqdXN0IG1vdmUgdGhlbSBvdmVyLiBzZXR0aW5nIHRoZWlyIHBhcmVudCBhcyB0aGlzIG9sZAotCQkvLyByZWdpb24uCi0JCUlUZXh0UmVnaW9uTGlzdCBuZXdSZWdpb25zVG9UcmFuc2ZlciA9IG5ld1JlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCW9sZFJlZ2lvbi5zZXRSZWdpb25zKG5ld1JlZ2lvbnNUb1RyYW5zZmVyKTsKLQkJSXRlcmF0b3IgbmV3UmVnaW9uc0luT2xkT25lID0gbmV3UmVnaW9uc1RvVHJhbnNmZXIuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKG5ld1JlZ2lvbnNJbk9sZE9uZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIG5ld09uZSA9IChJVGV4dFJlZ2lvbikgbmV3UmVnaW9uc0luT2xkT25lLm5leHQoKTsKLQkJCWlmIChpc0NvbGxlY3Rpb25SZWdpb24obmV3T25lKSkgeyAvLyB8fAotCQkJCS8vIGhhc0NvbnRhaW5lclJlZ2lvbnMobmV3T25lKSkgewotCQkJCS8vKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgbmV3T25lKS5zZXRQYXJlbnQob2xkUmVnaW9uKTsKLQkJCQlvbGRSZWdpb24uc2V0UmVnaW9ucyhuZXdSZWdpb24uZ2V0UmVnaW9ucygpKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVEb3duU3RyZWFtUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiBsYXN0S25vd25SZWdpb24pIHsKLQkJLy8gc28gYWxsIHJlZ2lvbnMgYWZ0ZXIgdGhlIGxhc3Qga25vd24gcmVnaW9uIChsYXN0IGtub3duIHRvIGJlIG9rKQotCQkvLyBoYXZlIHRvIGhhdmUgdGhlaXIgc3RhcnQgYW5kIGVuZCB2YWx1ZXMgYWRqdXN0ZWQuCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpbnQgbGlzdExlbmd0aCA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlpbnQgc3RhcnRJbmRleCA9IDA7Ci0JCS8vIGZpcnN0LCBsb29wIHRocm91Z2ggdG8gZmluZCB3aGVyZSB0byBzdGFydAotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RMZW5ndGg7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uID09IGxhc3RLbm93blJlZ2lvbikgewotCQkJCXN0YXJ0SW5kZXggPSBpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCS8vIG5vdywgYmVnaW5uaW5nIG9uZSBwYXN0IHRoZSBsYXN0IGtub3duIG9uZSwgbG9vcAotCQkvLyB0aHJvdWdoIHRvIGVuZCBvZiBsaXN0LCBhZGp1c3RpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgcG9zdGlvbnMuCi0JCXN0YXJ0SW5kZXgrKzsKLQkJZm9yIChpbnQgaiA9IHN0YXJ0SW5kZXg7IGogPCBsaXN0TGVuZ3RoOyBqKyspIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGopOwotCQkJcmVnaW9uLmFkanVzdFN0YXJ0KGZMZW5ndGhEaWZmZXJlbmNlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZjIwYjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24gewotCi0JcHJpdmF0ZSBpbnQgY291bnQ7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWQ7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZEhlYWQ7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld0hlYWQpIHsKLQkJc3VwZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBoZWFkID0gbmV3SGVhZDsKLQkJd2hpbGUgKGNvdW50Tm9kZSAhPSBudWxsKSB7Ci0JCQljb3VudCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAoRGVidWcuREVCVUcgPiA1KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk4gTm9kZXMgaW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gQ29udHJ1Y3RvcjogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmQpIHsKLQkJc3VwZXIoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb3VudE5vZGUgPSBoZWFkID0gc3RhcnQ7Ci0JCWlmICgoc3RhcnQgPT0gbnVsbCkgfHwgKGVuZCA9PSBudWxsKSkgewotCQkJLy8gZXJyb3IgY29uZGl0aW9uCi0JCQljb3VudCA9IDA7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy9JZiBib3RoIG5vZGVzIGFyZSBub24tbnVsbCwgd2UgYXNzdW1lIHRoZXJlIGlzIGFsd2F5cyBhdCBsZWFzdCBvbmUKLQkJLy8gaXRlbQotCQljb3VudCA9IDE7Ci0JCXdoaWxlIChjb3VudE5vZGUgIT0gZW5kKSB7Ci0JCQljb3VudCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuREVCVUcgPiA1KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIk4gTm9kZXMgaW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uRW51bWVyYXRpb24gQ29udHJ1Y3RvcjogIiArIGNvdW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogaGFzTW9yZUVsZW1lbnRzIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKSB7Ci0JCXJldHVybiBjb3VudCA+IDA7Ci0JfQotCi0JLyoqCi0JICogbmV4dEVsZW1lbnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgbmV4dEVsZW1lbnQoKSB7Ci0JCWlmIChjb3VudCA+IDApIHsKLQkJCWNvdW50LS07Ci0JCQlvbGRIZWFkID0gaGVhZDsKLQkJCWhlYWQgPSBoZWFkLmdldE5leHQoKTsKLQkJCXJldHVybiBvbGRIZWFkOwotCQl9Ci0JCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbnVtZXJhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkl0ZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIyMjJjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvciB7Ci0KLQlwdWJsaWMgZmluYWwgc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYWRqdXN0U3RhcnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSwgaW50IGFkanVzdG1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuYWRqdXN0U3RhcnQoYWRqdXN0bWVudCk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gaGVhZE5vZGU7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgY291bnRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcykgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKGZsYXROb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZmxhdE5vZGVzLmdldExlbmd0aCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbm9kZSA9IGZsYXROb2Rlcy5pdGVtKGkpOwotCQkJCS8vIGRvbid0IGtub3cgd2h5LCBidXQgd2UncmUgZ2V0dGluZyBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucwotCQkJCS8vIGluIHRoaXMgbWV0aG9kCi0JCQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQgKyBub2RlLmdldE51bWJlck9mUmVnaW9ucygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIGdldFRleHQoQ29yZU5vZGVMaXN0IGZsYXROb2RlcykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGZsYXROb2RlcyA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9IGVsc2UgewotCQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkvL0lTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYU5vZGUgPSBudWxsOwotCQkJaW50IGxlbmd0aCA9IGZsYXROb2Rlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQlidWZmLmFwcGVuZChmbGF0Tm9kZXMuaXRlbShpKS5nZXRUZXh0KCkpOwotCQkJfQotCQkJcmVzdWx0ID0gYnVmZi50b1N0cmluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBDb3JlTm9kZUxpc3Qgc2V0UGFyZW50RG9jdW1lbnQoQ29yZU5vZGVMaXN0IG5vZGVsaXN0LCBJU3RydWN0dXJlZERvY3VtZW50IHRleHRTdG9yZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGVsaXN0LCAibm9kZWxpc3Qgd2FzIG51bGwgaW4gQ29yZU5vZGVMaXN0OjpzZXRUZXh0U3RvcmUoQ29yZU5vZGVMaXN0LCBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCWludCBsZW4gPSBub2RlbGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gbm9kZWxpc3QuaXRlbShpKTsKLQkJCS8vQXNzZXJ0LmlzTm90TnVsbChub2RlLCAid2hvJ3MgcHV0dGluZyBudWxsIGluIHRoZSBub2RlIGxpc3Q/IGluCi0JCQkvLyBDb3JlTm9kZUxpc3Q6OnNldFRleHRTdG9yZShDb3JlTm9kZUxpc3QsCi0JCQkvLyBTdHJ1Y3R1cmVkVGV4dFN0b3JlKSIpOyAvLyROT04tTkxTLTEkCi0JCQlub2RlLnNldFBhcmVudERvY3VtZW50KHRleHRTdG9yZSk7Ci0JCX0KLQkJcmV0dXJuIG5vZGVsaXN0OwotCX0KLQotCS8vCXB1YmxpYyBmaW5hbCBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCS8vIHNldFN0cnVjdHVyZWREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlLAotCS8vIEJhc2ljU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCS8vCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGFOb2RlID0gaGVhZE5vZGU7Ci0JLy8JCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JLy8JCQlhTm9kZS5zZXRQYXJlbnREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCS8vCQkJYU5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgYU5vZGUuZ2V0TmV4dCgpOwotCS8vCQl9Ci0JLy8JCXJldHVybiBoZWFkTm9kZTsKLQkvLwl9Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNldFBhcmVudERvY3VtZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQl3aGlsZSAoYU5vZGUgIT0gbnVsbCkgewotCQkJYU5vZGUuc2V0UGFyZW50RG9jdW1lbnQoZG9jdW1lbnQpOwotCQkJYU5vZGUgPSBhTm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGhlYWROb2RlOwotCX0KLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgVmVjdG9yIHRvVmVjdG9yKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaGVhZE5vZGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGhlYWROb2RlOwotCQlWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwpIHsKLQkJCXYuYWRkRWxlbWVudChhTm9kZSk7Ci0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gdjsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25JdGVyYXRvcigpIHsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzMxYWE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRTZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5TZXF1ZW50aWFsUmV3cml0ZVRleHRTdG9yZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFNlcXVlbnRpYWxSZXdyaXRlVGV4dFN0b3JlIGV4dGVuZHMgU2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUgaW1wbGVtZW50cyBDaGFyU2VxdWVuY2UsIElSZWdpb25Db21wYXJpYmxlIHsKLQotCS8qKgotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50U2VxdWVudGlhbFJld3JpdGVUZXh0U3RvcmUoSVRleHRTdG9yZSBzb3VyY2UpIHsKLQkJc3VwZXIoc291cmNlKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2UjY2hhckF0KGludCkKLQkgKi8KLQlwdWJsaWMgY2hhciBjaGFyQXQoaW50IGluZGV4KSB7Ci0JCXJldHVybiBnZXQoaW5kZXgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNsZW5ndGgoKQotCSAqLwotCXB1YmxpYyBpbnQgbGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGMKLQkgKiBAcGFyYW0gZAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gbWF0Y2hlc0lnbm9yZUNhc2UoY2hhciBjMSwgY2hhciBjMikgewotCQkvLyB3ZSBjaGVjayBib3RoIGNhc2UgY29udmVyc2lvbnMgdG8gaGFuZGxlIHRob3NlIGZldyBjYXNlcywKLQkJLy8gaW4gbGFuZ3VhZ2VzIHN1Y2ggYXMgVHVya2lzaCwgd2hpY2ggaGF2ZSBzb21lIGNoYXJhY3RlcnMKLQkJLy8gd2hpY2ggc29ydCBvZiBoYXZlIDMgY2FzZXMuCi0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChDaGFyYWN0ZXIudG9VcHBlckNhc2UoYzEpID09IENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoYzEpID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMikpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpbnQgY29tcGFyZUxlbmd0aCA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJaWYgKGNvbXBhcmVMZW5ndGggPT0gbGVuZ3RoKSB7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJaWYgKGVuZE9mZnNldCA8PSBsZW5ndGgoKSkgewotCQkJCXJlc3VsdCA9IHJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIGFsbCBsZW5ndGhzIGhhdmUgYmVlbiBjaGVja2VkIGFuZCBmYWxsIHdpdGhpbnQKLQkgKiBleGNlcHRhYmxlIGxpbWl0cwotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gc3RyaW5nVG9Db21wYXJlCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpbnQgc3RyaW5nT2Zmc2V0ID0gMDsKLQkJaW50IGxlbiA9IHN0cmluZ1RvQ29tcGFyZS5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGxlbjsgaSsrKSB7Ci0JCQlpZiAoY2hhckF0KGkpICE9IHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2Uob2Zmc2V0LCBzdHJpbmdUb0NvbXBhcmUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcmVnaW9uTWF0Y2hlc0lnbm9yZUNhc2UoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgbGVuID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmICghbWF0Y2hlc0lnbm9yZUNhc2UoY2hhckF0KGkpLCBzdHJpbmdUb0NvbXBhcmUuY2hhckF0KHN0cmluZ09mZnNldCsrKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5sYW5nLkNoYXJTZXF1ZW5jZSNzdWJTZXF1ZW5jZShpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgQ2hhclNlcXVlbmNlIHN1YlNlcXVlbmNlKGludCBzdGFydCwgaW50IGVuZCkgewotCi0JCXJldHVybiBnZXQoc3RhcnQsIGVuZCAtIHN0YXJ0KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE0NmU2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBWaWFjaGVzbGF2IEthYmFub3ZpY2gvRXhhZGVsIDk3ODE3IFdyb25nIGFsZ29yaXRtIGluIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFRleHRTdG9yZQotICogICAgIAkJCWh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD05NzgxNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5HYXBUZXh0U3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlIGltcGxlbWVudHMgSVRleHRTdG9yZSwgQ2hhclNlcXVlbmNlLCBJUmVnaW9uQ29tcGFyaWJsZSB7Ci0KLQlwcml2YXRlIEdhcFRleHRTdG9yZSBmSW50ZXJuYWxTdG9yZTsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50VGV4dFN0b3JlKCkgewotCQl0aGlzKDUwLCAzMDApOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBsb3dXYXRlcm1hcmsKLQkgKiBAcGFyYW0gaGlnaFdhdGVybWFyawotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRUZXh0U3RvcmUoaW50IGxvd1dhdGVybWFyaywgaW50IGhpZ2hXYXRlcm1hcmspIHsKLQkJc3VwZXIoKTsKLQkJZkludGVybmFsU3RvcmUgPSBuZXcgR2FwVGV4dFN0b3JlKGxvd1dhdGVybWFyaywgaGlnaFdhdGVybWFyayk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2NoYXJBdChpbnQpCi0JICovCi0JcHVibGljIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KGluZGV4KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXQoaW50KQotCSAqLwotCXB1YmxpYyBjaGFyIGdldChpbnQgb2Zmc2V0KSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldChvZmZzZXQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldChpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0TGVuZ3RoKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuQ2hhclNlcXVlbmNlI2xlbmd0aCgpCi0JICovCi0JcHVibGljIGludCBsZW5ndGgoKSB7Ci0KLQkJcmV0dXJuIGZJbnRlcm5hbFN0b3JlLmdldExlbmd0aCgpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBtYXRjaGVzSWdub3JlQ2FzZShjaGFyIGMxLCBjaGFyIGMyKSB7Ci0JCS8vIHdlIGNoZWNrIGJvdGggY2FzZSBjb252ZXJzaW9ucyB0byBoYW5kbGUgdGhvc2UgZmV3IGNhc2VzLAotCQkvLyBpbiBsYW5ndWFnZXMgc3VjaCBhcyBUdXJraXNoLCB3aGljaCBoYXZlIHNvbWUgY2hhcmFjdGVycwotCQkvLyB3aGljaCBzb3J0IG9mIGhhdmUgMyBjYXNlcy4KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGMyKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCWVsc2UgaWYgKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjMSkgPT0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGMyKSkKLQkJCXJlc3VsdCA9IHRydWU7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcmVnaW9uTWF0Y2hlcyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWludCBjb21wYXJlTGVuZ3RoID0gc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlpZiAoY29tcGFyZUxlbmd0aCA9PSBsZW5ndGgpIHsKLQkJCWludCBlbmRPZmZzZXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0JCQlpZiAoZW5kT2Zmc2V0IDw9IGxlbmd0aCgpKSB7Ci0JCQkJcmVzdWx0ID0gcmVnaW9uTWF0Y2hlcyhvZmZzZXQsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFzc3VtZXMgYWxsIGxlbmd0aHMgaGF2ZSBiZWVuIGNoZWNrZWQgYW5kIGZhbGwgd2l0aGludAotCSAqIGV4Y2VwdGFibGUgbGltaXRzCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBzdHJpbmdUb0NvbXBhcmUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHJlZ2lvbk1hdGNoZXMoaW50IG9mZnNldCwgU3RyaW5nIHN0cmluZ1RvQ29tcGFyZSkgewotCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCWludCBzdHJpbmdPZmZzZXQgPSAwOwotCQlpbnQgbGVuID0gb2Zmc2V0ICsgc3RyaW5nVG9Db21wYXJlLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgbGVuOyBpKyspIHsKLQkJCWlmIChjaGFyQXQoaSkgIT0gc3RyaW5nVG9Db21wYXJlLmNoYXJBdChzdHJpbmdPZmZzZXQrKykpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaW50IGNvbXBhcmVMZW5ndGggPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWlmIChjb21wYXJlTGVuZ3RoID09IGxlbmd0aCkgewotCQkJaW50IGVuZE9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKLQkJCWlmIChlbmRPZmZzZXQgPD0gbGVuZ3RoKCkpIHsKLQkJCQlyZXN1bHQgPSByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShvZmZzZXQsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiByZWdpb25NYXRjaGVzSWdub3JlQ2FzZShpbnQgb2Zmc2V0LCBTdHJpbmcgc3RyaW5nVG9Db21wYXJlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJaW50IHN0cmluZ09mZnNldCA9IDA7Ci0JCWludCBsZW4gPSBzdHJpbmdUb0NvbXBhcmUubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKCFtYXRjaGVzSWdub3JlQ2FzZShjaGFyQXQoaSksIHN0cmluZ1RvQ29tcGFyZS5jaGFyQXQoc3RyaW5nT2Zmc2V0KyspKSkgewotCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjcmVwbGFjZShpbnQsIGludCwKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlmSW50ZXJuYWxTdG9yZS5yZXBsYWNlKG9mZnNldCwgbGVuZ3RoLCB0ZXh0KTsKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI3NldChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCkgewotCQlmSW50ZXJuYWxTdG9yZS5zZXQodGV4dCk7Ci0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEubGFuZy5DaGFyU2VxdWVuY2Ujc3ViU2VxdWVuY2UoaW50LCBpbnQpCi0JICovCi0JcHVibGljIENoYXJTZXF1ZW5jZSBzdWJTZXF1ZW5jZShpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJLy8gY29udmVydCAnZW5kJyB0byAnbGVuZ3RoJwotCQlyZXR1cm4gZkludGVybmFsU3RvcmUuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N1YlNldFRleHRTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L1N1YlNldFRleHRTdG9yZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWNhOGI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9TdWJTZXRUZXh0U3RvcmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0OwotCi0vKioKLSAqIFRoaXMgaXMgYSBjb252aWVuY2Ugb3IgdXRpbGl0eSBjbGFzcyB0aGF0IGFsbG93cyB5b3UgdG8gbWFrZSBhIGNvcHkgb2YgYQotICogcGFydCBvZiBhIGxhcmdlciB0ZXh0IHN0b3JlLCBidXQgaGF2ZSB0aGUgY29weSBiZWhhdmUgYXMgaWYgaXQgd2FzIHRoZQotICogbGFyZ2VyIHRleHQgc3RvcmUuCi0gKiAKLSAqIEluIG90aGVyIHdvcmRzLCBpdCBwcm92aWRlcyBhIHN1YnNldCBvZiBhIGxhcmdlciBkb2N1bWVudCwgdGhhdCAibG9va3MgbGlrZSIKLSAqIHRoZSBvcmdpbmFsIGRvY3VtZW50LiBUaGF0IGlzLCAibG9va3MgbGlrZSIgaW4gdGVybXMgb2Ygb2Zmc2V0cyBhbmQgbGVuZ3Rocy4KLSAqIFZhbGlkIGFjY2VzcyBjYW4gb25seSBiZSBtYWRlIHRvIGRhdGEgYmV0d2VlbiB0aGUgb3JpZ25hbCBvZmZzZXRzLCBldmVuCi0gKiB0aG91Z2ggdGhvc2Ugb2Zmc2V0cyBhcmUgaW4gdGhlIHNhbWUgdW5pdHMgYXQgdGhlIG9yaWdpbmFsLCBhbmQgZXZlbiB0aG91Z2gKLSAqIHRoZSBsZW5ndGggYXBwZWFycyB0byBiZSBsb25nLgotICogCi0gKiBGb3IgZXhhbXBsZSwgaWYgYSBzdWJzZXR0ZXh0IHN0b3JlIGlzIGNyZWF0ZWQgZm9yIHRoZSBkZWYgcGFydCBvZiBhYmNkZWZnaCwKLSAqIHRoZW4gZ2V0KDMsNSkgaXMgdmFsaWQsIGdldExlbmd0aCBpcyA4LiBBbnkgb3RoZXIgYWNjZXNzLCBzdWNoIGFzCi0gKiBnZXRDaGFyKDIpLCB3b3VsZCBiZSBpbnZhbGlkLgotICovCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotCi0vKioKLSAqIFNpbWlsYXIgdG8gYmFzaWNzIG9mIElEb2N1bWVudCwgYnV0IHRoZSBvZmZzZXRzIGFyZSBtYXBwZWQgZnJvbSBjb29yZGluYXRlcwotICogb2YgdW5kZXJseWluZyBzdG9yYWdlIHRvIGEgInZpcnR1YWwiIGRvY3VtZW50LgotICovCi1wdWJsaWMgY2xhc3MgU3ViU2V0VGV4dFN0b3JlIGltcGxlbWVudHMgSVRleHRTdG9yZSB7Ci0JcHJpdmF0ZSBpbnQgcHNldWRvQmVnaW5PZmZzZXQ7IC8vIG1hcHMgdG8gInplcm8iIHBvc3Rpb24gb2YgbmV3IHRleHQKLQkvL3ByaXZhdGUgaW50IHBzZXVkb0VuZE9mZnNldDsKLQlwcml2YXRlIGludCBwc2V1ZG9MZW5ndGg7IC8vIGxlbmd0aCBvZiBvbGQvb3JpZ2luYWwgZG9jdW1lbnQKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkvKioKLQkgKiBTdWJTZXRUZXh0U3RvcmUgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaW5pdGlhbENvbnRlbnQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3ViU2V0VGV4dFN0b3JlKFN0cmluZyBpbml0aWFsQ29udGVudCwgaW50IGJlZ2luT2Zmc2V0LCBpbnQgZW5kT2Zmc2V0LCBpbnQgb3JpZ2luYWxEb2N1bWVudExlbmd0aCkgewotCQlzdXBlcigpOwotCQlwc2V1ZG9CZWdpbk9mZnNldCA9IGJlZ2luT2Zmc2V0OwotCQkvL3BzZXVkb0VuZE9mZnNldCA9IGVuZE9mZnNldDsKLQkJLy8gdXNlZCB0byBiZSBvcmlnaW5hbERvY3VtZW50LmdldExlbmd0aCAuLi4gbm90IHN1cmUgaWYgdXNlZCwgb3IKLQkJLy8gd2hpY2gKLQkJLy8gaXMgcmlnaHQKLQkJcHNldWRvTGVuZ3RoID0gb3JpZ2luYWxEb2N1bWVudExlbmd0aDsKLQkJc3RyaW5nQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihpbml0aWFsQ29udGVudCk7Ci0JCS8vc2V0KGluaXRpYWxDb250ZW50KTsKLQl9Ci0KLQkvLyB0aGlzIGlzIG91ciAicHJpdmF0ZSIgZ2V0LCB3aGljaCBtZXRob2RzIGluIHRoaXMgY2xhc3Mgc2hvdWxkCi0JLy8gdXNlIHRvIGdldCB1c2luZyAicmVhbCIgY29vcmRpbmF0ZXMgb2YgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4KLQlwcml2YXRlIFN0cmluZyBfZ2V0KGludCBiZWdpbiwgaW50IGxlbmd0aCkgewotCQljaGFyW10gY2hhcnMgPSBuZXcgY2hhcltsZW5ndGhdOwotCQlpbnQgc3JjRW5kID0gYmVnaW4gKyBsZW5ndGg7Ci0JCXN0cmluZ0J1ZmZlci5nZXRDaGFycyhiZWdpbiwgc3JjRW5kLCBjaGFycywgMCk7Ci0JCXJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKLQl9Ci0KLQlwdWJsaWMgY2hhciBnZXQoaW50IG9mZnNldCkgewotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLmNoYXJBdChvZmZzZXQgLSBwc2V1ZG9CZWdpbk9mZnNldCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGJlZ2luCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldChpbnQgYmVnaW4sIGludCBsZW5ndGgpIHsKLQkJLy8gcmVtYXAgdGhlIGJlZ2luIGFuZCBlbmQgdG8gImFwcGVhciIgdG8gYmUgaW4gdGhlCi0JCS8vIHNhbWUgY29vcmRpbmF0ZXMgb2YgdGhlIG9yaWdpbmFsIHBhcmVudERvY3VtZW50Ci0JCXJldHVybiBfZ2V0KGJlZ2luIC0gcHNldWRvQmVnaW5PZmZzZXQsIGxlbmd0aCk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGJlZ2luCi0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgY2hhciBnZXRDaGFyKGludCBwb3MpIHsKLQkJLy8gcmVtYXAgdGhlIGJlZ2luIGFuZCBlbmQgdG8gImFwcGVhciIgdG8gYmUgaW4gdGhlCi0JCS8vIHNhbWUgY29vcmRpbmF0ZXMgb2YgdGhlIG9yaWdpbmFsIHBhcmVudERvY3VtZW50Ci0JCXJldHVybiBnZXQocG9zIC0gcHNldWRvQmVnaW5PZmZzZXQpOwotCX0KLQotCS8qKgotCSAqIFdlIHJlZGVmaW5lIGdldExlbmd0aCBzbyBpdHMgbm90IHRoZSB0cnVlIGxlbmd0aCBvZiB0aGlzIHN1Yi1zZXQKLQkgKiBkb2N1bWVudCwgYnV0IHRoZSBsZW5ndGggb2YgdGhlIG9yaWdpbmFsLiBUaGlzIGlzIG5lZWRlZCwgYXMgYSBzaW1wbGUKLQkgKiBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBzZWUgaWYgdGhlIHBzZXVkbyBlbmQgaXMgZXF1YWwgdGhlIGxhc3QKLQkgKiBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luYWwgZG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBwc2V1ZG9MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIGFzIGlmIGNvbnNpZGVyZWQgYSB0cnVlLCBzdGFuZGFsb25lIGRvY3VtZW50Ci0JICovCi0JcHVibGljIGludCBnZXRUcnVlTGVuZ3RoKCkgewotCQlyZXR1cm4gc3RyaW5nQnVmZmVyLmxlbmd0aCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlcGxhY2UoaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgY2hhbmdlcykgewotCQkvLyByZW1hcCB0aGUgYmVnaW4gYW5kIGVuZCB0byAiYXBwZWFyIiB0byBiZSBpbiB0aGUKLQkJLy8gc2FtZSBjb29yZGluYXRlcyBvZiB0aGUgb3JpZ2luYWwgcGFyZW50RG9jdW1lbnQKLQkJaW50IGVuZCA9IGJlZ2luICsgbGVuZ3RoOwotCQlzdHJpbmdCdWZmZXIucmVwbGFjZShiZWdpbiAtIHBzZXVkb0JlZ2luT2Zmc2V0LCBlbmQsIGNoYW5nZXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldChTdHJpbmcgdGV4dCkgewotCQlzdHJpbmdCdWZmZXIuc2V0TGVuZ3RoKDApOwotCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHRleHQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9UZXh0UmVnaW9uTGlzdEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9UZXh0UmVnaW9uTGlzdEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwYzI0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvVGV4dFJlZ2lvbkxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgVGV4dFJlZ2lvbkxpc3RJbXBsIGltcGxlbWVudHMgSVRleHRSZWdpb25MaXN0IHsKLQotCXByaXZhdGUgY2xhc3MgTnVsbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgTnVsbEl0ZXJhdG9yKCkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbiBub3QgcmVtb3ZlIHJlZ2lvbnMgdmlhIGl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFJlZ2lvbkl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwcml2YXRlIElUZXh0UmVnaW9uW10gZkl0ZXJhdG9yUmVnaW9uczsKLQkJcHJpdmF0ZSBpbnQgaW5kZXggPSAtMTsKLQkJcHJpdmF0ZSBpbnQgbWF4aW5kZXggPSAtMTsKLQotCQlwdWJsaWMgUmVnaW9uSXRlcmF0b3IoKSB7Ci0JCQlmSXRlcmF0b3JSZWdpb25zID0gdG9BcnJheSgpOwotCQkJbWF4aW5kZXggPSBmSXRlcmF0b3JSZWdpb25zLmxlbmd0aCAtIDE7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotCQkJcmV0dXJuIGluZGV4IDwgbWF4aW5kZXg7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0JCQlpZiAoIShpbmRleCA8IG1heGluZGV4KSkKLQkJCQl0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotCQkJcmV0dXJuIGZJdGVyYXRvclJlZ2lvbnNbKytpbmRleF07Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbiBub3QgcmVtb3ZlIHJlZ2lvbnMgdmlhIGl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgZ3Jvd3RoQ29uc3RhbnQgPSAyOwotCi0JcHJpdmF0ZSBJVGV4dFJlZ2lvbltdIGZSZWdpb25zOwotCXByaXZhdGUgaW50IGZSZWdpb25zQ291bnQgPSAwOwotCi0JcHVibGljIFRleHRSZWdpb25MaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dFJlZ2lvbkxpc3RJbXBsKElUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0KSB7Ci0JCXRoaXMoKTsKLQkJZlJlZ2lvbnMgPSAoSVRleHRSZWdpb25bXSkgcmVnaW9uTGlzdC50b0FycmF5KCkuY2xvbmUoKTsKLQkJZlJlZ2lvbnNDb3VudCA9IGZSZWdpb25zLmxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhZGQoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0KLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQllbnN1cmVDYXBhY2l0eShmUmVnaW9uc0NvdW50ICsgMSk7Ci0JCWZSZWdpb25zW2ZSZWdpb25zQ291bnQrK10gPSByZWdpb247Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5zZXJ0UG9zLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucykgewotCQkvLyBiZWdpbm5pbmcgb2YgbGlzdCBpcyAwIHRvIGluc2VydFBvcy0xCi0JCS8vIHJlbWFpbmRlciBvZiBsaXN0IGlzIGluc2VydFBvcyB0byBmUmVnaW9uc0NvdW50Ci0JCS8vIHJlc3VsdGluZyB0b3RhbCB3aWxsIGJlIGJlIGZSZWdpb25zQ291bnQgKyBuZXdSZWdpb25zLnNpemUoKQotCQlpZiAoaW5zZXJ0UG9zIDwgMCB8fCBpbnNlcnRQb3MgPiBmUmVnaW9uc0NvdW50KSB7Ci0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluc2VydFBvcyk7Ci0JCX0KLQotCQlpbnQgbmV3UmVnaW9uc1NpemUgPSBuZXdSZWdpb25zLnNpemUoKTsKLQotCQllbnN1cmVDYXBhY2l0eShmUmVnaW9uc0NvdW50ICsgbmV3UmVnaW9uc1NpemUpOwotCi0JCWludCBudW1Nb3ZlZCA9IGZSZWdpb25zQ291bnQgLSBpbnNlcnRQb3M7Ci0JCWlmIChudW1Nb3ZlZCA+IDApCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWdpb25zLCBpbnNlcnRQb3MsIGZSZWdpb25zLCBpbnNlcnRQb3MgKyBuZXdSZWdpb25zU2l6ZSwgbnVtTW92ZWQpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV3UmVnaW9uc1NpemU7IGkrKykKLQkJCWZSZWdpb25zW2luc2VydFBvcysrXSA9IG5ld1JlZ2lvbnMuZ2V0KGkpOwotCi0JCWZSZWdpb25zQ291bnQgKz0gbmV3UmVnaW9uc1NpemU7Ci0JCXJldHVybiBuZXdSZWdpb25zU2l6ZSAhPSAwOwotCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCS8vIG5vdGU6IHNpemUgb2YgYXJyYXkgaXMgbm90IHJlZHVjZWQhCi0JCWZSZWdpb25zQ291bnQgPSAwOwotCX0KLQotCXByaXZhdGUgdm9pZCBlbnN1cmVDYXBhY2l0eShpbnQgbmVlZGVkKSB7Ci0JCWlmIChmUmVnaW9ucyA9PSBudWxsKSB7Ci0JCQkvLyBmaXJzdCB0aW1lCi0JCQlmUmVnaW9ucyA9IG5ldyBJVGV4dFJlZ2lvbltuZWVkZWRdOwotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBvbGRMZW5ndGggPSBmUmVnaW9ucy5sZW5ndGg7Ci0JCWlmIChvbGRMZW5ndGggPCBuZWVkZWQpIHsKLQkJCUlUZXh0UmVnaW9uW10gb2xkQWRhcHRlcnMgPSBmUmVnaW9uczsKLQkJCUlUZXh0UmVnaW9uW10gbmV3QWRhcHRlcnMgPSBuZXcgSVRleHRSZWdpb25bbmVlZGVkICsgZ3Jvd3RoQ29uc3RhbnRdOwotCQkJU3lzdGVtLmFycmF5Y29weShvbGRBZGFwdGVycywgMCwgbmV3QWRhcHRlcnMsIDAsIGZSZWdpb25zQ291bnQpOwotCQkJZlJlZ2lvbnMgPSBuZXdBZGFwdGVyczsKLQkJfQotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXQoaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPiBmUmVnaW9uc0NvdW50KSB7Ci0JCQl0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKGluZGV4KTsKLQkJfQotCQlJVGV4dFJlZ2lvbiByZXN1bHQgPSBmUmVnaW9uc1tpbmRleF07Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBpbmRleE9mKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCi0JCWludCByZXN1bHQgPSAtMTsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoZlJlZ2lvbnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHJlZ2lvbi5lcXVhbHMoZlJlZ2lvbnNbaV0pKSB7Ci0JCQkJCQlyZXN1bHQgPSBpOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZlJlZ2lvbnNDb3VudCA9PSAwOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKLQkJaWYgKHNpemUoKSA9PSAwKSB7Ci0JCQlyZXR1cm4gbmV3IE51bGxJdGVyYXRvcigpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBSZWdpb25JdGVyYXRvcigpOwotCQl9Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIHJlbW92ZShpbnQgaW5kZXgpIHsKLQkJLy8gbXVjaCBtb3JlIGVmZmljaWVudCB3YXlzIHRvIGltcGxlbWVudCB0aGlzLCBidXQKLQkJLy8gSSBkb3VidCBpZiBjYWxsZWQgb2Z0ZW4KLQkJSVRleHRSZWdpb24gb25lVG9SZW1vdmUgPSBnZXQoaW5kZXgpOwotCQlyZW1vdmUob25lVG9SZW1vdmUpOwotCQlyZXR1cm4gb25lVG9SZW1vdmU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKElUZXh0UmVnaW9uIGEpIHsKLQkJaWYgKGZSZWdpb25zID09IG51bGwgfHwgYSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbmV3SW5kZXggPSAwOwotCQlJVGV4dFJlZ2lvbltdIG5ld1JlZ2lvbnMgPSBuZXcgSVRleHRSZWdpb25bZlJlZ2lvbnNDb3VudF07Ci0JCWludCBvbGRSZWdpb25Db3VudCA9IGZSZWdpb25zQ291bnQ7Ci0JCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJZm9yIChpbnQgb2xkSW5kZXggPSAwOyBvbGRJbmRleCA8IG9sZFJlZ2lvbkNvdW50OyBvbGRJbmRleCsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjYW5kaWRhdGUgPSBmUmVnaW9uc1tvbGRJbmRleF07Ci0JCQlpZiAoYSA9PSBjYW5kaWRhdGUpIHsKLQkJCQlmUmVnaW9uc0NvdW50LS07Ci0JCQkJZm91bmQgPSB0cnVlOwotCQkJfSBlbHNlCi0JCQkJbmV3UmVnaW9uc1tuZXdJbmRleCsrXSA9IGZSZWdpb25zW29sZEluZGV4XTsKLQkJfQotCQlpZiAoZm91bmQpCi0JCQlmUmVnaW9ucyA9IG5ld1JlZ2lvbnM7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQWxsKElUZXh0UmVnaW9uTGlzdCByZWdpb25MaXN0KSB7Ci0JCS8vIG11Y2ggbW9yZSBlZmZpY2llbnQgd2F5cyB0byBpbXBsZW1lbnQgdGhpcywgYnV0Ci0JCS8vIEkgZG91YnQgaWYgY2FsbGVkIG9mdGVuCi0JCWlmIChyZWdpb25MaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9uTGlzdC5zaXplKCk7IGkrKykgewotCQkJCXRoaXMucmVtb3ZlKHJlZ2lvbkxpc3QuZ2V0KGkpKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gZlJlZ2lvbnNDb3VudDsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25bXSB0b0FycmF5KCkgewotCQkvLyByZXR1cm4gImNsb25lIiBvZiBpbnRlcm5hbCBhcnJheQotCQlJVGV4dFJlZ2lvbltdIG5ld0FycmF5ID0gbmV3IElUZXh0UmVnaW9uW2ZSZWdpb25zQ291bnRdOwotCQlTeXN0ZW0uYXJyYXljb3B5KGZSZWdpb25zLCAwLCBuZXdBcnJheSwgMCwgZlJlZ2lvbnNDb3VudCk7Ci0JCXJldHVybiBuZXdBcnJheTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyYTgxMzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotCi0vKioKLSAqIExpa2Ugc3VwZXIgY2xhc3MgZXhjZXB0IGFsbG93cyBsZW5ndGggYW5kIG9mZnNldCB0byBiZSBtb2RpZmllZC4gVGhpcyBpcwotICogY29udmVuaWVudCBmb3Igc29tZSBhbGdvcml0aG1zLCBhbmQgYWxsb3dzIHJlZ2lvbiBvYmplY3RzIHRvIGJlIHJldXNlZC4KLSAqIE5vdGU6IFRoZXJlIE1JR0hUIGJlIHNvbWUgY29kZSB0aGF0IGFzc3VtZXMgcmVnaW9ucyBhcmUgaW1tdXRhYmxlLiBUaGlzCi0gKiBjbGFzcyB3b3VsZCBub3QgYmUgYXBwcm9wcmlhdGUgZm9yIHRob3NlIHVzZXMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRSZWdpb24gZXh0ZW5kcyBJUmVnaW9uIHsKLQl2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKTsKLQotCXZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9JU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YTE0YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL0lTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLQotLyoqCi0gKiBTaW1pbGFyIHRvIGV4dGVuZGVkIGludGVyZmFjZSwgZXhjZXB0IGl0IGFsbG93cyB0aGUgbGVuZ3RoLCBvZmZzZXQsIGFuZAotICogdHlwZSB0byBiZSBzZXQuIFRoaXMgaXMgdXNlZnVsIHdoZW4gaXRlcmF0aW5nIHRocm91Z2ggYSBudW1iZXIgb2YgInNtYWxsIgotICogcmVnaW9ucywgdGhhdCBhbGwgbWFwIHRvIHRoZSB0aGUgc2FtZSBwYXJ0aW9uIHJlZ2lvbnMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBleHRlbmRzIElTdHJ1Y3R1cmVkUmVnaW9uLCBJVHlwZWRSZWdpb24gewotCXZvaWQgc2V0VHlwZShTdHJpbmcgcGFydGl0aW9uVHlwZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1NpbXBsZVN0cnVjdHVyZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWVmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotCi0KLS8qKgotICogU2ltaWxhciB0byBqZmFjZSByZWdpb24gZXhjZXB0IHdlIHdhbnRlZCBhIHNldHRpbmcgb24gbGVuZ3RoCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVTdHJ1Y3R1cmVkUmVnaW9uIGltcGxlbWVudHMgSVN0cnVjdHVyZWRSZWdpb24gewotCS8qKiBUaGUgcmVnaW9uIGxlbmd0aCAqLwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0KLQkvKiogVGhlIHJlZ2lvbiBvZmZzZXQgKi8KLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0JLyoqCi0JICogQ3JlYXRlIGEgbmV3IHJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSByZWdpb24KLQkgKi8KLQlwdWJsaWMgU2ltcGxlU3RydWN0dXJlZFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWZPZmZzZXQgPSBvZmZzZXQ7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogVHdvIHJlZ2lvbnMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBvZmZzZXQgYW5kIGxlbmd0aC4KLQkgKiAKLQkgKiBAc2VlIE9iamVjdCNlcXVhbHMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQlJUmVnaW9uIHIgPSAoSVJlZ2lvbikgbzsKLQkJCXJldHVybiByLmdldE9mZnNldCgpID09IGZPZmZzZXQgJiYgci5nZXRMZW5ndGgoKSA9PSBmTGVuZ3RoOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJlZ2lvbiNnZXRMZW5ndGgKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElSZWdpb24jZ2V0T2Zmc2V0Ci0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiBmT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlIGhhc2NvZGUgaXMgb3ZlcnJpZGRlbiBzaW5jZSB3ZSBwcm92aWRlIG91ciBvd24KLQkgKiAgICAgIGVxdWFscy4KLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gKGZPZmZzZXQgPDwgMjQpIHwgKGZMZW5ndGggPDwgMTYpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aC4KLQkgKiAKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICBUaGUgbGVuZ3RoIHRvIHNldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwZDU0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LnJ1bGVzOwotCi0KLQotCi0vKioKLSAqIFNpbWlsYXIgamFjZSBUeXBlZFJlZ2lvbiwgYnV0IGhhZCB0byBzdWJjbGFzcyBvdXIgdmVyc2lvbiB3aGljaCBhbGxvd2VkCi0gKiBsZW5ndGggdG8gYmUgc2V0LgotICovCi1wdWJsaWMgY2xhc3MgU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uIGV4dGVuZHMgU2ltcGxlU3RydWN0dXJlZFJlZ2lvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gewotCi0JLyoqIFRoZSByZWdpb24ncyB0eXBlICovCi0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgdHlwZWQgcmVnaW9uIGJhc2VkIG9uIHRoZSBnaXZlbiBzcGVjaWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24ncyBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uJ3MgbGVuZ3RoCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24ncyB0eXBlCi0JICovCi0JcHVibGljIFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlzdXBlcihvZmZzZXQsIGxlbmd0aCk7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBUd28gdHlwZWQgcG9zaXRpb25zIGFyZSBlcXVhbCBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgb2Zmc2V0LCBsZW5ndGgsIGFuZAotCSAqIHR5cGUuCi0JICogCi0JICogQHNlZSBPYmplY3QjZXF1YWxzCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0JCWlmIChvIGluc3RhbmNlb2YgU2ltcGxlU3RydWN0dXJlZFR5cGVkUmVnaW9uKSB7Ci0JCQlTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gciA9IChTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24pIG87Ci0JCQlyZXR1cm4gc3VwZXIuZXF1YWxzKHIpICYmICgoZlR5cGUgPT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBudWxsKSB8fCBmVHlwZS5lcXVhbHMoci5nZXRUeXBlKCkpKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElUeXBlZFJlZ2lvbiNnZXRUeXBlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgT2JqZWN0I2hhc2hDb2RlCi0JICovCi0JcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJaW50IHR5cGUgPSBmVHlwZSA9PSBudWxsID8gMCA6IGZUeXBlLmhhc2hDb2RlKCk7Ci0JCXJldHVybiBzdXBlci5oYXNoQ29kZSgpIHwgdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWZUeXBlID0gdHlwZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBzID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlzLmFwcGVuZChnZXRPZmZzZXQoKSk7Ci0JCXMuYXBwZW5kKCI6Iik7IC8vJE5PTi1OTFMtMSQKLQkJcy5hcHBlbmQoZ2V0TGVuZ3RoKCkpOwotCQlzLmFwcGVuZCgiIC0gIik7IC8vJE5PTi1OTFMtMSQKLQkJcy5hcHBlbmQoZ2V0VHlwZSgpKTsKLQkJcmV0dXJuIHMudG9TdHJpbmcoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRhMmNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdGV4dC9ydWxlcy9TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlczsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5JQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLQotCi0vKioKLSAqIEJhc2UgRG9jdW1lbnQgcGFydGl0aW9uZXIgZm9yIFN0cnVjdHVyZWREb2N1bWVudHMuIEJMT0NLX1RFWFQgSVRleHRSZWdpb25zCi0gKiBoYXZlIGEgcGFydGl0aW9uIHR5cGUgb2YgQkxPQ0sgb3IgQkxPQ0s6VEFHTkFNRSBpZiBhIHN1cnJvdW5kaW5nIHRhZ25hbWUKLSAqIHdhcyByZWNvcmRlZC4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRQYXJ0aXRpb25lciwgSVN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIgewotCi0Jc3RhdGljIGNsYXNzIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyB7Ci0JCWludCBmTGVuZ3RoOwotCQlpbnQgZk9mZnNldDsKLQkJSVR5cGVkUmVnaW9uW10gZlBhcnRpdGlvbnM7Ci0JCWJvb2xlYW4gaXNJblZhbGlkOwotCi0JCUNhY2hlZENvbXB1dGVkUGFydGl0aW9ucyhpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zKSB7Ci0JCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJZkxlbmd0aCA9IGxlbmd0aDsKLQkJCWZQYXJ0aXRpb25zID0gcGFydGl0aW9uczsKLQkJCWlzSW5WYWxpZCA9IHRydWU7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENhY2hlZENvbXB1dGVkUGFydGl0aW9ucyBjYWNoZWRQYXJ0aXRpb25zID0gbmV3IENhY2hlZENvbXB1dGVkUGFydGl0aW9ucygtMSwgLTEsIG51bGwpOwotCXByb3RlY3RlZCBTdHJpbmdbXSBmU3VwcG9ydGVkVHlwZXMgPSBudWxsOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZFR5cGVkUmVnaW9uIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlID0gbmV3IFNpbXBsZVN0cnVjdHVyZWRUeXBlZFJlZ2lvbigwLCAwLCBJU3RydWN0dXJlZFBhcnRpdGlvbnMuREVGQVVMVF9QQVJUSVRJT04pOwotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGZTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgcGFydGl0aW9uaW5nIG9mIHRoZSBnaXZlbiByYW5nZSBvZiB0aGUgY29ubmVjdGVkIGRvY3VtZW50LgotCSAqIFRoZXJlIG11c3QgYmUgYSBkb2N1bWVudCBjb25uZWN0ZWQgdG8gdGhpcyBwYXJ0aXRpb25lci4KLQkgKiAKLQkgKiBOb3RlOiB0aGlzIHNob3VsZG4ndCBiZSBjYWxsZWQgZGlyY3RseSBieSBjbGllbnRzLCB1bmxlc3MgdGhleSBjb250cm9sCi0JICogdGhlIHRocmVhZGluZyB0aGF0IGluY2x1ZGVzIG1vZGlmaWNhdGlvbnMgdG8gdGhlIGRvY3VtZW50LiBPdGhlcndpc2UKLQkgKiB0aGUgZG9jdW1lbnQgY291bGQgYmUgbW9kaWZpZWQgd2hpbGUgcGFydGl0aW9ucyBhcmUgYmVpbmcgY29tcHV0ZWQuIFdlCi0JICogYWR2aXNlIHRoYXQgY2xpZW50cyB1c2UgdGhlIGNvbXB1dGVQYXJ0aXRpb25zIEFQSSBkaXJlY3RseSBmcm9tIHRoZQotCSAqIGRvY3VtZW50LCBzbyB0aGV5IHdvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhhdC4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZSBvZiBpbnRlcmVzdAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlIG9mIGludGVyZXN0Ci0JICogQHJldHVybiB0aGUgcGFydGl0aW9uaW5nIG9mIHRoZSByYW5nZQotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb25bXSBjb21wdXRlUGFydGl0aW9uaW5nKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgcGFydGl0aW9uZXIgaXMgbm90IGNvbm5lY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVR5cGVkUmVnaW9uW10gcmVzdWx0cyA9IG51bGw7Ci0KLQotCi0JCWlmICgoIWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkKSAmJiAob2Zmc2V0ID09IGNhY2hlZFBhcnRpdGlvbnMuZk9mZnNldCkgJiYgKGxlbmd0aCA9PSBjYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGgpKSB7Ci0JCQlyZXN1bHRzID0gY2FjaGVkUGFydGl0aW9ucy5mUGFydGl0aW9uczsKLQkJfSBlbHNlIHsKLQotCQkJaWYgKGxlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bXXtnZXRQYXJ0aXRpb24ob2Zmc2V0KX07Ci0JCQl9IGVsc2UgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpbnQgZW5kUG9zID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJCWlmIChlbmRQb3MgPiBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpKSB7Ci0JCQkJCS8vIFRoaXMgY2FuIG9jY3VyIGlmIHRoZSBtb2RlbCBpbnN0YW5jZSBpcyBiZWluZwotCQkJCQkvLyBjaGFuZ2VkCi0JCQkJCS8vIGFuZCBldmVyeW9uZSdzIG5vdCB5ZXQgdXAgdG8gZGF0ZQotCQkJCQlyZXR1cm4gbmV3IElUeXBlZFJlZ2lvbltde2NyZWF0ZVBhcnRpdGlvbihvZmZzZXQsIGxlbmd0aCwgZ2V0VW5rbm93bigpKX07Ci0JCQkJfQotCQkJCWludCBjdXJyZW50UG9zID0gb2Zmc2V0OwotCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcHJldmlvdXNQYXJ0aXRpb24gPSBudWxsOwotCQkJCXdoaWxlIChjdXJyZW50UG9zIDwgZW5kUG9zKSB7Ci0JCQkJCWludGVybmFsR2V0UGFydGl0aW9uKGN1cnJlbnRQb3MsIGZhbHNlKTsKLQkJCQkJY3VycmVudFBvcyArPSBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRMZW5ndGgoKTsKLQkJCQkJLy8gY2hlY2sgaWYgdGhpcyBwYXJ0aXRpb24ganVzdCBjb250aW51ZXMgbGFzdCBvbmUKLQkJCQkJLy8gKHR5cGUgaXMgdGhlIHNhbWUpLAotCQkJCQkvLyBpZiBzbywganVzdCBleHRlbmQgbGVuZ3RoIG9mIGxhc3Qgb25lLCBub3QgbmVlZCB0bwotCQkJCQkvLyBjcmVhdGUgbmV3Ci0JCQkJCS8vIGluc3RhbmNlLgotCQkJCQlpZiAocHJldmlvdXNQYXJ0aXRpb24gIT0gbnVsbCAmJiBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRUeXBlKCkuZXF1YWxzKHByZXZpb3VzUGFydGl0aW9uLmdldFR5cGUoKSkpIHsKLQkJCQkJCS8vIHNhbWUgcGFydGl0aW9uIHR5cGUKLQkJCQkJCXByZXZpb3VzUGFydGl0aW9uLnNldExlbmd0aChwcmV2aW91c1BhcnRpdGlvbi5nZXRMZW5ndGgoKSArIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIG5vdCB0aGUgc2FtZSwgc28gYWRkIHRvIGxpc3QKLQkJCQkJCUlTdHJ1Y3R1cmVkVHlwZWRSZWdpb24gcGFydGl0aW9uID0gY3JlYXRlTmV3UGFydGl0aW9uSW5zdGFuY2UoKTsKLQkJCQkJCWxpc3QuYWRkKHBhcnRpdGlvbik7Ci0JCQkJCQkvLyBhbmQgbWFrZSBjdXJyZW50LCBwcmV2aW91cwotCQkJCQkJcHJldmlvdXNQYXJ0aXRpb24gPSBwYXJ0aXRpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJcmVzdWx0cyA9IG5ldyBJVHlwZWRSZWdpb25bbGlzdC5zaXplKCldOwotCQkJCWxpc3QudG9BcnJheShyZXN1bHRzKTsKLQkJCX0KLQkJCWlmIChyZXN1bHRzLmxlbmd0aCA+IDApIHsKLQkJCQkvLyB0cnVuY2F0ZSByZXR1cm5lZCByZXN1bHRzIHRvIHJlcXVlc3RlZCByYW5nZQotCQkJCWlmIChyZXN1bHRzWzBdLmdldE9mZnNldCgpIDwgb2Zmc2V0ICYmIHJlc3VsdHNbMF0gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFJlZ2lvbikgewotCQkJCQkoKElTdHJ1Y3R1cmVkUmVnaW9uKSByZXN1bHRzWzBdKS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQl9Ci0JCQkJaW50IGxhc3RFbmQgPSByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0T2Zmc2V0KCkgKyByZXN1bHRzW3Jlc3VsdHMubGVuZ3RoIC0gMV0uZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKGxhc3RFbmQgPiBvZmZzZXQgKyBsZW5ndGggJiYgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRSZWdpb24pIHsKLQkJCQkJKChJU3RydWN0dXJlZFJlZ2lvbikgcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdKS5zZXRMZW5ndGgob2Zmc2V0ICsgbGVuZ3RoIC0gcmVzdWx0c1tyZXN1bHRzLmxlbmd0aCAtIDFdLmdldE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZMZW5ndGggPSBsZW5ndGg7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZPZmZzZXQgPSBvZmZzZXQ7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmZQYXJ0aXRpb25zID0gcmVzdWx0czsKLQkJCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0KLQotCS8qKgotCSAqIENvbm5lY3RzIHRoZSBkb2N1bWVudCB0byB0aGUgcGFydGl0aW9uZXIsIGkuZS4gaW5kaWNhdGVzIHRoZSBiZWdpbiBvZgotCSAqIHRoZSB1c2FnZSBvZiB0aGUgcmVjZWl2ZXIgYXMgcGFydGl0aW9uZXIgb2YgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQljYWNoZWRQYXJ0aXRpb25zLmlzSW5WYWxpZCA9IHRydWU7Ci0JCQl0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCX0gZWxzZSB7Ci0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGlzIGNsYXNzIGFuZCBBUEkgYXJlIGZvciBTdHJ1Y3R1cmVkIERvY3VtZW50cyBvbmx5Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIGdpdmVuIElUZXh0UmVnaW9uQ29udGFpbmVyIGl0c2VsZiBjb250YWlucyBhbm90aGVyCi0JICogSVRleHRSZWdpb25Db250YWluZXIKLQkgKiAKLQkgKiBAcGFyYW0gSVRleHRSZWdpb25Db250YWluZXIKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250YWluc0VtYmVkZGVkUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGFpbmVyKSB7Ci0JCWJvb2xlYW4gY29udGFpbnNFbWJlZGRlZFJlZ2lvbiA9IGZhbHNlOwotCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gY29udGFpbmVyLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCWNvbnRhaW5zRW1iZWRkZWRSZWdpb24gPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBjb250YWluc0VtYmVkZGVkUmVnaW9uOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVOZXdQYXJ0aXRpb25JbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24oaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2UuZ2V0T2Zmc2V0KCksIGludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLmdldExlbmd0aCgpLCBpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5nZXRUeXBlKCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIGNvbmNyZXRlIHBhcnRpdGlvbiBmcm9tIHRoZSBnaXZlbiB2YWx1ZXMuIFJldHVybnMgYSBuZXcKLQkgKiBpbnN0YW5jZSBmb3IgZWFjaCBjYWxsLgotCSAqIAotCSAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlLgotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogQHBhcmFtIHR5cGUKLQkgKiBAcmV0dXJuIElUeXBlZFJlZ2lvbgotCSAqIAotCSAqIFRPRE86IHNob3VsZCBiZSBwcm90ZWN0ZWQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRUeXBlZFJlZ2lvbiBjcmVhdGVQYXJ0aXRpb24oaW50IG9mZnNldCwgaW50IGxlbmd0aCwgU3RyaW5nIHR5cGUpIHsKLQkJcmV0dXJuIG5ldyBTaW1wbGVTdHJ1Y3R1cmVkVHlwZWRSZWdpb24ob2Zmc2V0LCBsZW5ndGgsIHR5cGUpOwotCX0KLQotCS8qKgotCSAqIERpc2Nvbm5lY3RzIHRoZSBkb2N1bWVudCBmcm9tIHRoZSBwYXJ0aXRpb25lciwgaS5lLiBpbmRpY2F0ZXMgdGhlIGVuZAotCSAqIG9mIHRoZSB1c2FnZSBvZiB0aGUgcmVjZWl2ZXIgYXMgcGFydGl0aW9uZXIgb2YgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNkaXNjb25uZWN0KCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZGlzY29ubmVjdCgpIHsKLQkJY2FjaGVkUGFydGl0aW9ucy5pc0luVmFsaWQgPSB0cnVlOwotCQl0aGlzLmZTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIEluZm9ybXMgYWJvdXQgYSBmb3J0aGNvbWluZyBkb2N1bWVudCBjaGFuZ2UuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWNhY2hlZFBhcnRpdGlvbnMuaXNJblZhbGlkID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZG9jdW1lbnQgaGFzIGJlZW4gY2hhbmdlZC4gVGhlIHBhcnRpdGlvbmVyIHVwZGF0ZXMgdGhlIHNldCBvZgotCSAqIHJlZ2lvbnMgYW5kIHJldHVybnMgd2hldGhlciB0aGUgc3RydWN0dXJlIG9mIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcKLQkgKiBoYXMgYmVlbiBjaGFuZ2VkLCBpLmUuIHdoZXRoZXIgcGFydGl0aW9ucyBoYXZlIGJlZW4gYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZG9jdW1lbnRDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGV2ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpIHsKLQkJCS8vIHBhcnRpdGlvbnMgZG9uJ3QgYWx3YXlzIGNoYW5nZSB3aGlsZSBkb2N1bWVudCByZWdpb25zIGRvLAotCQkJLy8gYnV0IHRoYXQncyB0aGUgb25seSAicXVpY2sgY2hlY2siIHdlIGhhdmUuCi0JCQkvLyBJJ20gbm90IHN1cmUgaWYgc29tZXRoaW5nIG1vcmUgc29waGlzdGljYXRlZCB3aWxsIGJlIG5lZWRlZAotCQkJLy8gaW4gdGhlIGZ1dHVyZS4gKGRtdywgMDIvMTgvMDQpLgotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvUGFyc2VyU3BlY2lmaWNDaGVjayhpbnQgb2Zmc2V0LCBib29sZWFuIHBhcnRpdGlvbkZvdW5kLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBuZXh0LCBJVGV4dFJlZ2lvbiBwcmV2aW91c1N0YXJ0KSB7Ci0JCS8vIHRoaXMgKGNvbmNlcHR1YWxseSkgYWJzdHJhY3QgbWV0aG9kIGlzIG5vdCBjb25jZXJuZWQgd2l0aAotCQkvLyBzcGVjaWZpYyByZWdpb24gdHlwZXMKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGUgcGFydGl0aW9uIGNvbnRhaW5pbmcgdGhlIGdpdmVuCi0JICogY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZSBnaXZlbiBkb2N1bWVudC4gVGhlIGRvY3VtZW50IGhhcyBwcmV2aW91c2x5Ci0JICogYmVlbiBjb25uZWN0ZWQgdG8gdGhlIHBhcnRpdGlvbmVyLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRDb250ZW50VHlwZShpbnQpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZShpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBnZXRQYXJ0aXRpb24ob2Zmc2V0KS5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICogVG8gYmUgdXNlZCBieSBkZWZhdWx0IQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKSB7Ci0KLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYWxsIHBvc3NpYmxlIGNvbnRlbnQgdHlwZXMgdGhlIHBhcnRpdG9uZXIgc3VwcG9ydHMuCi0JICogSS5lLiBBbnkgcmVzdWx0IGRlbGl2ZXJlZCBieSB0aGlzIHBhcnRpdGlvbmVyIG1heSBub3QgY29udGFpbiBhIGNvbnRlbnQKLQkgKiB0eXBlIHdoaWNoIHdvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGlzIG1ldGhvZCdzIHJlc3VsdC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50UGFydGl0aW9uZXIjZ2V0TGVnYWxDb250ZW50VHlwZXMoKQotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nW10gZ2V0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCWlmIChmU3VwcG9ydGVkVHlwZXMgPT0gbnVsbCkgewotCQkJaW5pdExlZ2FsQ29udGVudFR5cGVzKCk7Ci0JCX0KLQkJcmV0dXJuIGZTdXBwb3J0ZWRUeXBlczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZQotCSAqIGdpdmVuIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgaGFzIHByZXZpb3VzbHkgYmVlbiBjb25uZWN0ZWQgdG8gdGhlCi0JICogcGFydGl0aW9uZXIuCi0JICogCi0JICogTm90ZTogdGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmN0bHkgYnkgY2xpZW50cywgdW5sZXNzIHRoZXkgY29udHJvbAotCSAqIHRoZSB0aHJlYWRpbmcgdGhhdCBpbmNsdWRlcyBtb2RpZmljYXRpb25zIHRvIHRoZSBkb2N1bWVudC4gT3RoZXJ3aXNlCi0JICogdGhlIGRvY3VtZW50IGNvdWxkIGJlIG1vZGlmaWVkIHdoaWxlIHBhcnRpdGlvbnMgYXJlIGJlaW5nIGNvbXB1dGVkLiBXZQotCSAqIGFkdmlzZSB0aGF0IGNsaWVudHMgdXNlIHRoZSBnZXRQYXJ0aXRpb24gQVBJIGRpcmVjdGx5IGZyb20gdGhlCi0JICogZG9jdW1lbnQsIHNvIHRoZXkgd29uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGF0LgotCSAqIAotCSAqIAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lciNnZXRQYXJ0aXRpb24oaW50KQotCSAqLwotCXB1YmxpYyBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKGludCBvZmZzZXQpIHsKLQkJaW50ZXJuYWxHZXRQYXJ0aXRpb24ob2Zmc2V0LCB0cnVlKTsKLQkJcmV0dXJuIGNyZWF0ZU5ld1BhcnRpdGlvbkluc3RhbmNlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25Gcm9tQmxvY2tlZFRleHQoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0LCBTdHJpbmcgcmVzdWx0KSB7Ci0JCS8vIHBhcnNlciBzZW5zaXRpdmUgY29kZSB3YXMgbW92ZWQgdG8gc3ViY2xhc3MgZm9yIHF1aWNrIHRyYW5zaXRpb24KLQkJLy8gdGhpcyAoY29uY2VwdHVhbGx5KSBhYnN0cmFjdCB2ZXJzaW9uIGlzbid0IGNvbmNlcm5lZCB3aXRoIGJsb2NrZWQKLQkJLy8gdGV4dAotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyB0YWduYW1lID0gcmVnaW9uLmdldFN1cnJvdW5kaW5nVGFnKCk7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAodGFnbmFtZSAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAiQkxPQ0s6IiArIHRhZ25hbWUudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlyZXN1bHQgPSAiQkxPQ0siOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJQmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBibG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCi0JCS8vIHJlZ2lvbnMgc2hvdWxkIG5ldmVyIGJlIG51bGwsIG9yIGhvbGQgemVybyByZWdpb25zLCBidXQganVzdCBpbgotCQkvLyBjYXNlLi4uCi0JCWlmIChyZWdpb25zICE9IG51bGwgJiYgcmVnaW9ucy5zaXplKCkgPiAwKSB7Ci0JCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMSkgewotCQkJCS8vIGlmIG9ubHkgb25lLCB0aGVuIGl0cyBhICJwdXJlIiBibG9ja2VkIG5vdGUuCi0JCQkJLy8gaWYgbW9yZSB0aGFuIG9uZSwgdGhlbiBtdXN0IGNvbnRhaW4gc29tZSBlbWJlZGRlZCByZWdpb24KLQkJCQkvLyBjb250YWluZXIKLQkJCQlJVGV4dFJlZ2lvbiBibG9ja2VkUmVnaW9uID0gcmVnaW9ucy5nZXQoMCk7Ci0JCQkJLy8gZG91YmxlIGNoZWNrIGZvciBjb2RlIHNhZmVmeSwgdGhvdWdoIHNob3VsZCBhbHdheXMgYmUgdHJ1ZQotCQkJCWlmIChibG9ja2VkUmVnaW9uIGluc3RhbmNlb2YgRm9yZWlnblJlZ2lvbikgewotCQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChGb3JlaWduUmVnaW9uKSBibG9ja2VkUmVnaW9uLCBvZmZzZXQpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJLy8gbXVzdCBoYXZlIHNvbWUgZW1iZWRkZWQgcmVnaW9uIGNvbnRhaW5lciwgc28gd2UnbGwgbWFrZQotCQkJCS8vIHN1cmUgd2UnbGwgZ2V0IHRoZSBhcHByb3ByaWF0ZSBvbmUKLQkJCQlyZXN1bHQgPSBnZXRSZWxldmVudFJlZ2lvblR5cGUoYmxvY2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRQYXJ0aXRpb25UeXBlLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIGlmIGl0IGdldCdzIHRvIHRoaXMgInJhdyIgbGV2ZWwsIHRoZW4KLQkJLy8gbXVzdCBiZSBkZWZhdWx0LgotCQlyZXR1cm4gZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gYmFzZWQgb24gcmVnaW9uIHR5cGUuIFRoaXMgYmFzaWNhbGx5IG1hcHMgZnJvbQotCSAqIG9uZSByZWdpb24tdHlwZSBzcGFjZSB0byBhbm90aGVyLCBoaWdoZXIgbGV2ZWwsIHJlZ2lvbi10eXBlIHNwYWNlLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpOwotCQkvLwkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb25Db250YWluZXIpIHsKLQkJLy8JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uLCBvZmZzZXQpOwotCQkvLwkJfSBlbHNlIHsKLQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVnaW9uLCBvZmZzZXQpOwotCQl9Ci0KLQkJcmVzdWx0ID0gZ2V0UGFydGl0aW9uRnJvbUJsb2NrZWRUZXh0KHJlZ2lvbiwgb2Zmc2V0LCByZXN1bHQpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIG1ldGhvZCB3aXRoICdJVGV4dFJlZ2lvbicgYXMgYXJndW1lbnQsIGV4Y2VwdCBmb3IKLQkgKiBSZWdpb25Db250YWluZXJzLCBpZiBpdCBoYXMgZW1iZWRkZWQgcmVnaW9ucywgdGhlbiB3ZSBuZWVkIHRvIGRyaWxsCi0JICogZG93biBhbmQgcmV0dXJuIERvY3VtZW50UGFydGl0aW9uIGJhc2VkIG9uICJsb3dlc3QgbGV2ZWwiIHJlZ2lvbiB0eXBlLgotCSAqIEZvciBleGFtcGxlLCBpbiA8Ym9keSBpZD0iIDwlPSBvYmplY3QuZ2V0SUQoKSAlPiIgPiBUaGUgdGV4dCBiZXR3ZWVuCi0JICogPCU9IGFuZCAlPiB3b3VsZCBiZSBhICJqYXZhIHJlZ2lvbiIgbm90IGFuICJIVE1MIHJlZ2lvbiIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uQ29udGFpbmVyIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQkvLyBUT0RPIHRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlICdjbGVhbmVkIHVwJyBhZnRlciByZWZhY3RvcmluZwotCQkvLyBpdHMgaW5zdGFuY2VvZiBsb2dpYyBzZWVtcyBtZXNzZWQgdXAgbm93LgotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiBjb3JlUmVnaW9uID0gcmVnaW9uOwotCQkJaWYgKGNvcmVSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb3JlUmVnaW9uLCAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBjb3JlUmVnaW9uKS5nZXRSZWdpb25zKCksIG9mZnNldCk7Ci0JCQl9IGVsc2UgewotCQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUocmVnaW9uKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGdldFBhcnRpdGlvblR5cGUoKElUZXh0UmVnaW9uKSByZWdpb24sIG9mZnNldCk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSVRleHRSZWdpb25Db250YWluZXIgY29yZVJlZ2lvbiwgSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMsIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoY29yZVJlZ2lvbi5jb250YWluc09mZnNldChyZWdpb24sIG9mZnNldCkpIHsKLQkJCQlyZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKHJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBwYXJ0aXRpb24gdHlwZSBmb3IgdGhlIHplcm8tbGVuZ3RoIHBhcnRpdGlvbiBiZXR3ZWVuIGEKLQkgKiBzdGFydCB0YWcgYW5kIGVuZCB0YWcgd2l0aCB0aGUgZ2l2ZW4gbmFtZSByZWdpb25zLgotCSAqIAotCSAqIEBwYXJhbSBwcmV2aW91c1N0YXJ0VGFnTmFtZVJlZ2lvbgotCSAqIEBwYXJhbSBuZXh0RW5kVGFnTmFtZVJlZ2lvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdFBhcnRpdGlvblR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIElUZXh0UmVnaW9uIGF0IHRoZSBnaXZlbiBvZmZzZXQuIEZvciBtb3N0IGNhc2VzLCB0aGlzIHdpbGwKLQkgKiBiZSB0aGUgZmxhdE5vZGUgaXRzZWxmLiBTaG91bGQgaXQgY29udGFpbiBhbiBlbWJlZGRlZAotCSAqIElUZXh0UmVnaW9uQ29udGFpbmVyLCB3aWxsIHJldHVybiB0aGUgaW50ZXJuYWwgcmVnaW9uIGF0IHRoZSBvZmZzZXQKLQkgKiAKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogQHJldHVybiBJVGV4dFJlZ2lvbgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFJlbGV2ZW50UmVnaW9uVHlwZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vCQkqIE5vdGU6IHRoZSBvcmlnaW5hbCBmb3JtIG9mIHRoaXMgbWV0aG9kIC0tIHdoaWNoIHJldHVybmVkICJkZWVwIgotCQkvLyByZWdpb24sIGlzbid0IHRoYXQKLQkJLy8JCSogdXNlZnVsLCBhZnRlciBkb2luZyBwYXJlbnQgZWxpbWluYXRpb24gcmVmYWN0b3JpbmcsCi0JCS8vCQkqIHNpbmNlIG9uY2UgdGhlIGRlZXAgcmVnaW9uIGlzIHJldHVybmVkLCBpdHMgaGFyZCB0byBnZXQgaXRzIHRleHQKLQkJLy8gb3Igb2Zmc2V0IHdpdGhvdXQKLQkJLy8JCSogcHJvcGVyIHBhcmVudC4KLQkJSVRleHRSZWdpb24gcmVzdWx0UmVnaW9uID0gbnVsbDsKLQkJaWYgKGNvbnRhaW5zRW1iZWRkZWRSZWdpb24oZmxhdE5vZGUpKSB7Ci0JCQlyZXN1bHRSZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKHJlc3VsdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJcmVzdWx0UmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9ICgoSVRleHRSZWdpb25Db250YWluZXIpIHJlc3VsdFJlZ2lvbikuZ2V0UmVnaW9ucygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQkJaWYgKGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPD0gb2Zmc2V0ICYmIG9mZnNldCA8IGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pKSB7Ci0JCQkJCQlyZXN1bHRSZWdpb24gPSByZWdpb247Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdFJlZ2lvbiA9IGZsYXROb2RlOwotCQl9Ci0JCXJldHVybiByZXN1bHRSZWdpb24uZ2V0VHlwZSgpOwotCX0KLQotCS8qKgotCSAqIFRvIGJlIHVzZWQsIGluc3RlYWQgb2YgZGVmYXVsdCwgd2hlbiB0aGVyZSBpcyBzb21lIHRoaW5nIHN1cnByaXNpbmcKLQkgKiBhYm91dCBhcmUgYXR0ZW1wdCB0byBwYXJ0aXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFVua25vd24oKSB7Ci0JCXJldHVybiBJU3RydWN0dXJlZFBhcnRpdGlvbnMuVU5LTk9XTl9QQVJUSVRJT047Ci0JfQotCi0JLyoqCi0JICogdG8gYmUgYWJzdHJhY3QgZXZlbnR1YWxseQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRMZWdhbENvbnRlbnRUeXBlcygpIHsKLQkJZlN1cHBvcnRlZFR5cGVzID0gbmV3IFN0cmluZ1tde0lTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTiwgSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUgZ2l2ZW4gY2hhcmFjdGVyIHBvc2l0aW9uIG9mIHRoZQotCSAqIGdpdmVuIGRvY3VtZW50LiBUaGUgZG9jdW1lbnQgaGFzIHByZXZpb3VzbHkgYmVlbiBjb25uZWN0ZWQgdG8gdGhlCi0JICogcGFydGl0aW9uZXIuIElmIHRoZSBjaGVja0JldHdlZW4gcGFyYW1ldGVyIGlzIHRydWUsIGFuIG9mZnNldCBiZXR3ZWVuIGEKLQkgKiBzdGFydCBhbmQgZW5kIHRhZyB3aWxsIHJldHVybiBhIHplcm8tbGVuZ3RoIHJlZ2lvbi4KLQkgKi8KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxHZXRQYXJ0aXRpb24oaW50IG9mZnNldCwgYm9vbGVhbiBjaGVja0JldHdlZW4pIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZG9jdW1lbnQgcGFydGl0aW9uZXIgaXMgbm90IGNvbm5lY3RlZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlib29sZWFuIHBhcnRpdGlvbkZvdW5kID0gZmFsc2U7Ci0JCWludCBkb2NMZW5ndGggPSBmU3RydWN0dXJlZERvY3VtZW50LmdldExlbmd0aCgpOwotCQkvLyBnZXQgZG9jdW1lbnQgcmVnaW9uIHR5cGUgYW5kIG1hcCB0byBwYXJ0aXRpb24gdHlwZSA6Ci0JCS8vIE5vdGU6IGEgcGFydGlvbiBjYW4gYmUgc21hbGxlciB0aGFuIGEgZmxhdG5vZGUsIGlmIHRoYXQgZmxhdG5vZGUKLQkJLy8gY29udGFpbnMgYSByZWdpb24gY29udGFpbmVyLgotCQkvLyBUaGF0J3Mgd2h5IHdlIG5lZWQgdG8gZ2V0ICJyZWxldmVudCByZWdpb24iLgotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJLy8gZmxhdE5vZGUgaXMgbnVsbCBpZiBlbXB0eSBkb2N1bWVudAotCQkvLyB0aGlzIGlzIGtpbmcgb2YgYSAibm9ybWFsIGNhc2UiIGZvciBlbXB0eSBkb2N1bWVudAotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgJiYgZG9jTGVuZ3RoID09IDApIHsKLQkJCS8vIEluIG9yZGVyIHRvIHByZXZlbnQgaW5maW5pdGUgZXJyb3IgbG9vcHMsIHRoaXMgcGFydGl0aW9uIG11c3QKLQkJCS8vIG5ldmVyIGhhdmUgYSB6ZXJvIGxlbmd0aAotCQkJLy8gdW5sZXNzIHRoZSBkb2N1bWVudCBpcyBhbHNvIHplcm8gbGVuZ3RoCi0JCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDAsIGdldERlZmF1bHRQYXJ0aXRpb25UeXBlKCkpOwotCQkJcGFydGl0aW9uRm91bmQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsICYmIGRvY0xlbmd0aCAhPSAwKSB7Ci0JCQkvLyB0aGlzIGNhc2UgaXMgInVudXN1YWwiLiBXaGVuIHdvdWxkIHJlZ2lvbiBiZSBudWxsLCBhbmQgZG9jdW1lbnQKLQkJCS8vIGxvbmdlcgotCQkJLy8gdGhhbiAwLiBJIHRoaW5rIHRoaXMgbWVhbnMgc29tZXRoaW5ncyAib3V0IG9mIHN5bmMiLiBBbmQgd2UgbWF5Ci0JCQkvLyB3YW50Ci0JCQkvLyB0byAiZmxhZyIgdGhhdCBmYWN0IGFuZCBqdXN0IHJldHVybiBvbmUgYmlnIHJlZ2lvbiBvZgotCQkJLy8gJ3Vua25vd24nLCBpbnN0ZWFkCi0JCQkvLyBvZiBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZS4KLQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMSwgZ2V0VW5rbm93bigpKTsKLQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjaGVja0JldHdlZW4pIHsKLQkJCS8vIGRtdzogbWluaW1pemVzIG91dCB0byB0aGUgZmlyc3QgaWYgdGVzdCBhYm92ZQotCQkJLy8JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgJiYgZG9jTGVuZ3RoID09IDApIHsKLQkJCS8vCQkJCS8vIGtub3duIHNwZWNpYWwgY2FzZSBmb3IgYW4gZW1wdHkgZG9jdW1lbnQKLQkJCS8vCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMCwgZ2V0RGVmYXVsdCgpKTsKLQkJCS8vCQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJCS8vCQkJfQotCQkJLy8JCQllbHNlCi0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkgPT0gb2Zmc2V0KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJCWlmIChwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIG5leHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCQkJSVRleHRSZWdpb24gcHJldmlvdXNTdGFydCA9IHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQlwYXJ0aXRpb25Gb3VuZCA9IGRvUGFyc2VyU3BlY2lmaWNDaGVjayhvZmZzZXQsIHBhcnRpdGlvbkZvdW5kLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBuZXh0LCBwcmV2aW91c1N0YXJ0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJLy8gZG13OiBHaXZlbiB0aGUgZmlyc3QgdHdvIHRlc3RzIGFib3ZlIG1pbmltaXplIHRvIHRoaXMsIHRoaXMgYmxvY2sKLQkJLy8gY2FuIG5ldmVyIHJ1biwgcmlnaHQ/Ci0JCS8vCQllbHNlIGlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkgewotCQkvLwkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgMCwgZ2V0RGVmYXVsdCgpKTsKLQkJLy8JCQlwYXJ0aXRpb25Gb3VuZCA9IHRydWU7Ci0JCS8vCQl9Ci0KLQkJaWYgKCFwYXJ0aXRpb25Gb3VuZCkgewotCQkJSVRleHRSZWdpb24gcmVzdWx0UmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlwYXJ0aXRpb25Gb3VuZCA9IGlzRG9jdW1lbnRSZWdpb25CYXNlZFBhcnRpdGlvbihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlc3VsdFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCWlmICghcGFydGl0aW9uRm91bmQpIHsKLQkJCQkvLyBOb3RlOiB0aGlzIG5ldyBsb2dpYyBkb2Vzbid0IGhhbmRsZSBjb250YWluZXIgcmVnaW9ucwotCQkJCS8vIGluc2lkZSBvZgotCQkJCS8vIGNvbnRhaW5lciByZWdpb25zIC4uLiBtYXkgbmVlZCB0byBtYWtlIHRoaXMgZmlyc3QgY2xhdXNlCi0JCQkJLy8gYSByZWN1cnNpdmUgbWV0aG9kCi0JCQkJaWYgKHJlc3VsdFJlZ2lvbiAhPSBudWxsICYmIHJlc3VsdFJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lclJlZ2lvbiA9IChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgcmVzdWx0UmVnaW9uOwotCQkJCQkvLyB0aGVuIG5lZWQgdG8gImRyaWxsIGRvd24iIGZvciByZWxldmVudCByZWdpb24gYW5kCi0JCQkJCS8vIHJlbGV2ZW50IG9mZnNldAotCQkJCQlJVGV4dFJlZ2lvbiBkZWVwUmVnaW9uID0gY29udGFpbmVyUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJCWludCBlbmRPZmZzZXQgPSBjb250YWluZXJSZWdpb24uZ2V0RW5kT2Zmc2V0KGRlZXBSZWdpb24pOwotCQkJCQlTdHJpbmcgdHlwZSA9IGdldFBhcnRpdGlvblR5cGUoZGVlcFJlZ2lvbiwgZW5kT2Zmc2V0KTsKLQkJCQkJc2V0SW50ZXJuYWxQYXJ0aXRpb24ob2Zmc2V0LCBlbmRPZmZzZXQgLSBvZmZzZXQsIHR5cGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWlmIChyZXN1bHRSZWdpb24gIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKHJlc3VsdFJlZ2lvbiwgb2Zmc2V0KTsKLQkJCQkJCXNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChyZXN1bHRSZWdpb24pIC0gb2Zmc2V0LCB0eXBlKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNhbiBoYXBwZW4gYXQgRU9GCi0JCQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDEsIGdldFVua25vd24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBmb3IgYSBwZXItU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG92ZXJyaWRlIHNlbGVjdGluZyB0aGUKLQkgKiBwYXJ0aXRpb24gdHlwZSB1c2luZyBtb3JlIHRoYW4ganVzdCBhIHNpbmdsZSBJVGV4dFJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogICAgICAgICAgICB0aGUgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogQHBhcmFtIGNvbnRhaW5lZENoaWxkUmVnaW9uCi0JICogICAgICAgICAgICBhbiBJVGV4dFJlZ2lvbiB3aXRoaW4gdGhlIGdpdmVuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqICAgICAgICAgICAgdGhhdCB3b3VsZCBub3JtYWxseSBkZXRlcm1pbmUgdGhlIHBhcnRpdGlvbiB0eXBlIGJ5IGl0c2VsZgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBvZmZzZXQKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBhcnRpdGlvbiB0eXBlIHdpbGwgYmUgb3ZlcnJpZGRlbiwgZmFsc2UgdG8KLQkgKiAgICAgICAgIGNvbnRpbnVlIG5vcm1hbCBwcm9jZXNzaW5nCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEb2N1bWVudFJlZ2lvbkJhc2VkUGFydGl0aW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiBjb250YWluZWRDaGlsZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIG5ld0luc3RhbmNlKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRJbnRlcm5hbFBhcnRpdGlvbihpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdHlwZSkgewotCQlpbnRlcm5hbFJldXNlZFRlbXBJbnN0YW5jZS5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJaW50ZXJuYWxSZXVzZWRUZW1wSW5zdGFuY2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0JCWludGVybmFsUmV1c2VkVGVtcEluc3RhbmNlLnNldFR5cGUodHlwZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vQ29tbWFuZEN1cnNvclBvc2l0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vQ29tbWFuZEN1cnNvclBvc2l0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMzJmNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0NvbW1hbmRDdXJzb3JQb3NpdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29tbWFuZEN1cnNvclBvc2l0aW9uIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSBzZXQgdG8gYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlpbnQgZ2V0UmVkb1NlbGVjdGlvbkxlbmd0aCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHNldCB0byBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JaW50IGdldFVuZG9DdXJzb3JQb3NpdGlvbigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRleHQgdG8gYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHVuZG9uZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCWludCBnZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXZvaWQgc2V0UmVkb0N1cnNvclBvc2l0aW9uKGludCBjdXJzb3JQb3NpdGlvbik7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXZvaWQgc2V0UmVkb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byBiZSB1c2VkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0Jdm9pZCBzZXRVbmRvQ3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKTsKLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0Jdm9pZCBzZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKGludCBzZWxlY3Rpb25MZW5ndGgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYzODgyZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IncyBpbnB1dCBkb2N1bWVudAotCSAqLwotCUlEb2N1bWVudCBnZXREb2N1bWVudCgpOwotCi0JLyoqCi0JICogU2V0cyBhIG5ldyBzZWxlY3Rpb24gaW4gdGhlIGRvY3VtZW50IGFzIGEgcmVzdWx0IG9mIGFuIHVuZG8gb3BlcmF0aW9uLgotCSAqIAotCSAqIFVuZG9Eb2N1bWVudEV2ZW50IGNvbnRhaW5zIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHVuZG8gb3BlcmF0aW9uLCBhbmQgdGhlCi0JICogb2Zmc2V0IGFuZCBsZW5ndGggb2YgdGhlIG5ldyBzZWxlY3Rpb24uIEltcGxlbWVudGF0aW9uIG9mCi0JICogSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgY2FuIGNoZWNrIGlmIGl0J3MgdGhlIHJlcXVlc3RlciB0aGF0IGNhdXNlZAotCSAqIHRoZSBuZXcgc2VsZWN0aW9uLCBhbmQgZGVjaWRlIGlmIHRoZSBuZXcgc2VsZWN0aW9uIHNob3VsZCBiZSBhcHBsaWVkLgotCSAqLwotCXZvaWQgdW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQoVW5kb0RvY3VtZW50RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL0lTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjNzQxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLQotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIEJlZ2luIHJlY29yZGluZyB1bmRvIHRyYW5zYWN0aW9ucy4KLQkgKi8KLQl2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBCZWdpbiByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogQmVnaW4gcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24sIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiBDb25uZWN0IHRoZSBtZWRpYXRvciB0byB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcik7Ci0KLQkvKioKLQkgKiBEaXNhYmxlIHVuZG8gbWFuYWdlbWVudC4KLQkgKi8KLQl2b2lkIGRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGUgbWVkaWF0b3IgZnJvbSB0aGUgdW5kbyBtYW5hZ2VyLgotCSAqLwotCXZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcik7Ci0KLQkvKioKLQkgKiBFbmFibGUgdW5kbyBtYW5hZ2VtZW50LgotCSAqLwotCXZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQotCS8qKgotCSAqIEVuZCByZWNvcmRpbmcgdW5kbyB0cmFuc2FjdGlvbnMuCi0JICovCi0Jdm9pZCBlbmRSZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3Rlcik7Ci0KLQkvKioKLQkgKiBFbmQgcmVjb3JkaW5nIHVuZG8gdHJhbnNhY3Rpb25zLgotCSAqLwotCXZvaWQgZW5kUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCk7Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBOb3JtYWxseSwgdGhlIHVuZG8gbWFuYWdlciBjYW4gZmlndXJlIG91dCB0aGUgYmVzdCB0aW1lcyB3aGVuIHRvIGVuZCBhCi0JICogcGVuZGluZyBjb21tYW5kIGFuZCBiZWdpbiBhIG5ldyBvbmUgLi4uIHRvIHRoZSBzdHJ1Y3R1cmUgb2YgYSBzdHJ1Y3R1ZWQKLQkgKiBkb2N1bWVudC4gVGhlcmUgYXJlIHRpbWVzLCBob3dldmVyLCB3aGVuIGNsaWVudHMgbWF5IHdpc2ggdG8gb3ZlcnJpZGUKLQkgKiB0aG9zZSBhbGdvcml0aG1zIGFuZCBlbmQgb25lIGVhcmxpZXIgdGhhbiBub3JtYWwuIFRoZSBvbmUga25vd24gY2FzZSBpcwotCSAqIGZvciBtdWx0aXBhZ2UgZWRpdG9ycy4gSWYgYSB1c2VyIGlzIG9uIG9uZSBwYWdlLCBhbmQgdHlwZSAnMTIzJyBhcwotCSAqIGF0dHJpYnV0ZSB2YWx1ZSwgdGhlbiBjbGljayBhcm91bmQgdG8gb3RoZXIgcGFydHMgb2YgcGFnZSwgb3IgZGlmZmVyZW50Ci0JICogcGFnZXMsIHRoZW4gcmV0dXJuIHRvICcxMjN8JyBhbmQgdHlwZSA0NTYsIHRoZW4gInVuZG8iIHRoZXkgdHlwaWNhbGx5Ci0JICogZXhwZWN0IHRoZSB1bmRvIHRvIGp1c3QgdW5kbyB3aGF0IHRoZXkganVzdCB0eXBlZCwgdGhlIDQ1Niwgbm90IHRoZQotCSAqIHdob2xlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiA8cD4KLQkgKiBJZiB0aGVyZSBpcyBubyBwZW5kaW5nIGNvbW1hbmQsIHRoZSByZXF1ZXN0IGlzIGlnbm9yZWQuCi0JICovCi0JcHVibGljIHZvaWQgZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJyZW50UG9zaXRpb24sIGludCBsZW5ndGgpOwotCi0JLyoqCi0JICogU29tZSBjbGllbnRzIG5lZWQgdG8gZG8gY29tcGxpY2F0ZWQgdGhpbmdzIHdpdGggdW5kbyBzdGFjay4gUGx1cywgaW4KLQkgKiBzb21lIGNhc2VzLCBpZiBjbGllbnRzIHNldENvbW1hbmRTdGFjayB0ZW1wb3JhcmlseSwgdGhleSBoYXZlCi0JICogcmVwb25zaWJpbGl0eSB0byBzZXQgYmFjayB0byBvcmlnaW5hbCBvbmUgd2hlbiBmaW5pc2hlZC4KLQkgKi8KLQlwdWJsaWMgQ29tbWFuZFN0YWNrIGdldENvbW1hbmRTdGFjaygpOwotCi0JLyoqCi0JICogR2V0IHRoZSByZWRvIGNvbW1hbmQgZXZlbiBpZiBpdCdzIG5vdCBjb21taXR0ZWQgeWV0LgotCSAqLwotCUNvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgdW5kbyBjb21tYW5kIGV2ZW4gaWYgaXQncyBub3QgY29tbWl0dGVkIHlldC4KLQkgKi8KLQlDb21tYW5kIGdldFVuZG9Db21tYW5kKCk7Ci0KLQkvKioKLQkgKiBSZWRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlci4KLQkgKi8KLQl2b2lkIHJlZG8oKTsKLQotCS8qKgotCSAqIFJlZG8gdGhlIGxhc3QgY29tbWFuZCBpbiB0aGUgdW5kbyBtYW5hZ2VyIGFuZCBub3RpZnkgdGhlIHJlcXVlc3RlcgotCSAqIGFib3V0IHRoZSBuZXcgc2VsZWN0aW9uLgotCSAqLwotCXZvaWQgcmVkbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIGF0IGxlYXN0IG9uZSB0ZXh0IGNoYW5nZSBjYW4gYmUgcmVwZWF0ZWQuIEEgdGV4dCBjaGFuZ2UKLQkgKiBjYW4gYmUgcmVwZWF0ZWQgb25seSBpZiBpdCB3YXMgZXhlY3V0ZWQgYW5kIHJvbGxlZCBiYWNrLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb24gdGV4dCBjaGFuZ2UgY2FuIGJlIHJlcGVhdGVkCi0JICovCi0JYm9vbGVhbiByZWRvYWJsZSgpOwotCi0JLyoqCi0JICogU2V0IHRoZSBjb21tYW5kIHN0YWNrLgotCSAqLwotCXZvaWQgc2V0Q29tbWFuZFN0YWNrKENvbW1hbmRTdGFjayBjb21tYW5kU3RhY2spOwotCi0JLyoqCi0JICogVW5kbyB0aGUgbGFzdCBjb21tYW5kIGluIHRoZSB1bmRvIG1hbmFnZXIuCi0JICovCi0Jdm9pZCB1bmRvKCk7Ci0KLQkvKioKLQkgKiBVbmRvIHRoZSBsYXN0IGNvbW1hbmQgaW4gdGhlIHVuZG8gbWFuYWdlciBhbmQgbm90aWZ5IHRoZSByZXF1ZXN0ZXIKLQkgKiBhYm91dCB0aGUgbmV3IHNlbGVjdGlvbi4KLQkgKi8KLQl2b2lkIHVuZG8oSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgcmVxdWVzdGVyKTsKLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciBhdCBsZWFzdCBvbmUgdGV4dCBjaGFuZ2UgY2FuIGJlIHJvbGxlZCBiYWNrLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYXQgbGVhc3Qgb25lIHRleHQgY2hhbmdlIGNhbiBiZSByb2xsZWQKLQkgKiAgICAgICAgIGJhY2sKLQkgKi8KLQlib29sZWFuIHVuZG9hYmxlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21tYW5kLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjN2FkMzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZFRleHRDb21tYW5kIHsKLQotCVN0cmluZyBnZXRUZXh0RGVsZXRlZCgpOwotCi0JaW50IGdldFRleHRFbmQoKTsKLQotCVN0cmluZyBnZXRUZXh0SW5zZXJ0ZWQoKTsKLQotCWludCBnZXRUZXh0U3RhcnQoKTsKLQotCXZvaWQgc2V0VGV4dERlbGV0ZWQoU3RyaW5nIHRleHREZWxldGVkKTsKLQotCXZvaWQgc2V0VGV4dEVuZChpbnQgdGV4dEVuZCk7Ci0KLQl2b2lkIHNldFRleHRJbnNlcnRlZChTdHJpbmcgdGV4dEluc2VydGVkKTsKLQotCXZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTI4MmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1N0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5BYnN0cmFjdENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZXh0ZW5kcyBBYnN0cmFjdENvbW1hbmQgaW1wbGVtZW50cyBTdHJ1Y3R1cmVkVGV4dENvbW1hbmQgewotCi0JcHJvdGVjdGVkIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOyAvLyBuZWVkZWQgZm9yIHVwZGF0aW5nIHRoZSB0ZXh0Ci0JcHJvdGVjdGVkIFN0cmluZyBmVGV4dERlbGV0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRFbmQgPSAtMTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZUZXh0SW5zZXJ0ZWQgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZlRleHRTdGFydCA9IC0xOwotCi0JLyoqCi0JICogV2UgaGF2ZSBuby1hcmcgY29uc3RydWN0b3Igbm9uLXB1YmxpYyB0byBmb3JjZSBkb2N1bWVudCB0byBiZSBzcGVjZmllZC4KLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7IC8vIG5lZWRlZCBmb3IgdXBkYXRpbmcgdGhlIHRleHQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBleGVjdXRlKCkgewotCX0KLQotCS8qKgotCSAqIGdldFRleHREZWxldGVkIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldFRleHREZWxldGVkKCkgewotCQlyZXR1cm4gZlRleHREZWxldGVkOwotCX0KLQotCS8qKgotCSAqIHRleHRFbmQgaXMgdGhlIHNhbWUgYXMgKHRleHRTdGFydCArIHRleHRJbnNlcnRlZC5sZW5ndGgoKSkKLQkgKi8KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmVGV4dEVuZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0SW5zZXJ0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VGV4dEluc2VydGVkKCkgewotCQlyZXR1cm4gZlRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0U3RhcnQoKSB7Ci0JCXJldHVybiBmVGV4dFN0YXJ0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHByZXBhcmUoKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZG8oKSB7Ci0JCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkvLyBub3RlOiBvbmUgb2YgdGhlIGZldyBwbGFjZXMgd2UgcHJvZ3JhbWF0aWNhbGx5IGlnbm9yZSByZWFkLW9ubHkKLQkJCS8vIHNldHRpbmdzCi0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZEb2N1bWVudCkucmVwbGFjZVRleHQodGhpcywgZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkLCB0cnVlKTsKLQkJfSBlbHNlIHsKLQkJCXRyeSB7Ci0JCQkJZkRvY3VtZW50LnJlcGxhY2UoZlRleHRTdGFydCwgZlRleHREZWxldGVkLmxlbmd0aCgpLCBmVGV4dEluc2VydGVkKTsKLQkJCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBhc3N1bWVkIGltcG9zc2libGUsIGZvciBub3cKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0VGV4dERlbGV0ZWQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dERlbGV0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0RGVsZXRlZCkgewotCQlmVGV4dERlbGV0ZWQgPSB0ZXh0RGVsZXRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0RW5kIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHRFbmQoaW50IHRleHRFbmQpIHsKLQkJZlRleHRFbmQgPSB0ZXh0RW5kOwotCX0KLQotCS8qKgotCSAqIHNldFRleHRJbnNlcnRlZCBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0SW5zZXJ0ZWQoamF2YS5sYW5nLlN0cmluZyB0ZXh0SW5zZXJ0ZWQpIHsKLQkJZlRleHRJbnNlcnRlZCA9IHRleHRJbnNlcnRlZDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUZXh0U3RhcnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFN0YXJ0KGludCB0ZXh0U3RhcnQpIHsKLQkJZlRleHRTdGFydCA9IHRleHRTdGFydDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmRvKCkgewotCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJLy8gbm90ZTogb25lIG9mIHRoZSBmZXcgcGxhY2VzIHdlIHByb2dyYW1hdGljYWxseSBpZ25vcmUgcmVhZC1vbmx5Ci0JCQkvLyBzZXR0aW5ncwotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlcGxhY2VUZXh0KHRoaXMsIGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCwgdHJ1ZSk7Ci0JCX0gZWxzZSB7Ci0JCQl0cnkgewotCQkJCWZEb2N1bWVudC5yZXBsYWNlKGZUZXh0U3RhcnQsIGZUZXh0SW5zZXJ0ZWQubGVuZ3RoKCksIGZUZXh0RGVsZXRlZCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gYXNzdW1lZCBpbXBvc3NpYmxlLCBmb3Igbm93Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZjYTRhMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudW5kbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tcG91bmRDb21tYW5kOwotCi0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBleHRlbmRzIENvbXBvdW5kQ29tbWFuZCBpbXBsZW1lbnRzIENvbW1hbmRDdXJzb3JQb3NpdGlvbiB7Ci0JcHJvdGVjdGVkIGludCBmUmVkb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JcHJvdGVjdGVkIGludCBmUmVkb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQlwcm90ZWN0ZWQgaW50IGZVbmRvQ3Vyc29yUG9zaXRpb24gPSAtMTsKLQlwcm90ZWN0ZWQgaW50IGZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCkgewotCQlzdXBlcihyZXN1bHRJbmRleCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKHJlc3VsdEluZGV4LCBsYWJlbCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKGludCByZXN1bHRJbmRleCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJc3VwZXIocmVzdWx0SW5kZXgsIGxhYmVsLCBkZXNjcmlwdGlvbik7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIHJlc3VsdEluZGV4Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChpbnQgcmVzdWx0SW5kZXgsIFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihyZXN1bHRJbmRleCwgbGFiZWwsIGRlc2NyaXB0aW9uLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGNvbW1hbmRMaXN0Ci0JICogICAgICAgICAgICBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoamF2YS51dGlsLkxpc3QgY29tbWFuZExpc3QpIHsKLQkJc3VwZXIoY29tbWFuZExpc3QpOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwoU3RyaW5nIGxhYmVsKSB7Ci0JCXN1cGVyKGxhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWFuZExpc3QKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5MaXN0Ci0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChTdHJpbmcgbGFiZWwsIGphdmEudXRpbC5MaXN0IGNvbW1hbmRMaXN0KSB7Ci0JCXN1cGVyKGxhYmVsLCBjb21tYW5kTGlzdCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICogCi0JICogQHBhcmFtIGxhYmVsCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRlc2NyaXB0aW9uCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbChTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24pOwotCX0KLQotCS8qKgotCSAqIFN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBsYWJlbAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tYW5kTGlzdAotCSAqICAgICAgICAgICAgamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBqYXZhLnV0aWwuTGlzdCBjb21tYW5kTGlzdCkgewotCQlzdXBlcihsYWJlbCwgZGVzY3JpcHRpb24sIGNvbW1hbmRMaXN0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgc2V0IHRvIGFmdGVyIHRoaXMgY29tbWFuZCBpcyByZWRvbmUuCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlZG9DdXJzb3JQb3NpdGlvbigpIHsKLQkJaW50IGN1cnNvclBvc2l0aW9uID0gLTE7Ci0KLQkJaWYgKGZSZWRvQ3Vyc29yUG9zaXRpb24gIT0gLTEpCi0JCQljdXJzb3JQb3NpdGlvbiA9IGZSZWRvQ3Vyc29yUG9zaXRpb247Ci0JCWVsc2UgaWYgKCFjb21tYW5kTGlzdC5pc0VtcHR5KCkpIHsKLQkJCWludCBjb21tYW5kTGlzdFNpemUgPSBjb21tYW5kTGlzdC5zaXplKCk7Ci0JCQlDb21tYW5kIGxhc3RDb21tYW5kID0gKENvbW1hbmQpIGNvbW1hbmRMaXN0LmdldChjb21tYW5kTGlzdFNpemUgLSAxKTsKLQotCQkJaWYgKGxhc3RDb21tYW5kIGluc3RhbmNlb2YgQ29tbWFuZEN1cnNvclBvc2l0aW9uKQotCQkJCWN1cnNvclBvc2l0aW9uID0gKChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGxhc3RDb21tYW5kKS5nZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJfQotCi0JCXJldHVybiBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKCkgewotCQlyZXR1cm4gZlJlZG9TZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHNldCB0byBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRVbmRvQ3Vyc29yUG9zaXRpb24oKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCi0JCWlmIChmVW5kb0N1cnNvclBvc2l0aW9uICE9IC0xKQotCQkJY3Vyc29yUG9zaXRpb24gPSBmVW5kb0N1cnNvclBvc2l0aW9uOwotCQllbHNlIGlmICghY29tbWFuZExpc3QuaXNFbXB0eSgpKSB7Ci0JCQkvLyBuZXZlciB1c2VkCi0JCQkvL2ludCBjb21tYW5kTGlzdFNpemUgPSBjb21tYW5kTGlzdC5zaXplKCk7Ci0JCQlDb21tYW5kIGZpcnN0Q29tbWFuZCA9IChDb21tYW5kKSBjb21tYW5kTGlzdC5nZXQoMCk7Ci0KLQkJCWlmIChmaXJzdENvbW1hbmQgaW5zdGFuY2VvZiBDb21tYW5kQ3Vyc29yUG9zaXRpb24pCi0JCQkJY3Vyc29yUG9zaXRpb24gPSAoKENvbW1hbmRDdXJzb3JQb3NpdGlvbikgZmlyc3RDb21tYW5kKS5nZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJfQotCi0JCXJldHVybiBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCkgewotCQlyZXR1cm4gZlVuZG9TZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIGJlIHVzZWQgYWZ0ZXIgdGhpcyBjb21tYW5kIGlzIHJlZG9uZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWRvQ3Vyc29yUG9zaXRpb24oaW50IGN1cnNvclBvc2l0aW9uKSB7Ci0JCWZSZWRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBsZW5ndGggb2YgdGV4dCB0byBiZSBzZWxlY3RlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgcmVkb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFJlZG9TZWxlY3Rpb25MZW5ndGgoaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQlmUmVkb1NlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbkxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjdXJzb3IgcG9zaXRpb24gdG8gYmUgdXNlZCBhZnRlciB0aGlzIGNvbW1hbmQgaXMgdW5kb25lLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFVuZG9DdXJzb3JQb3NpdGlvbihpbnQgY3Vyc29yUG9zaXRpb24pIHsKLQkJZlVuZG9DdXJzb3JQb3NpdGlvbiA9IGN1cnNvclBvc2l0aW9uOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGxlbmd0aCBvZiB0ZXh0IHRvIGJlIHNlbGVjdGVkIGFmdGVyIHRoaXMgY29tbWFuZCBpcyB1bmRvbmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmQwMjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdW5kby9TdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0gaW5pdGlhbCBJRG9jdW1lbnRFeHRlbnNpb240IHN1cHBvcnQgLSAjMTAyODIyCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBqYXZhLnV0aWwuRXZlbnRPYmplY3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQmFzaWNDb21tYW5kU3RhY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbW1hbmRTdGFjazsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLmNvbW1hbmQuQ29tbWFuZFN0YWNrTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5jb21tYW5kLkNvbXBvdW5kQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50UmV3cml0ZVNlc3Npb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudFJld3JpdGVTZXNzaW9uVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB7Ci0KLQljbGFzcyBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGltcGxlbWVudHMgQ29tbWFuZFN0YWNrTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBjb21tYW5kU3RhY2tDaGFuZ2VkKEV2ZW50T2JqZWN0IGV2ZW50KSB7Ci0JCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJfQotCX0KLQotCWNsYXNzIEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgewotCi0JCXB1YmxpYyB2b2lkIG5ld01vZGVsKE5ld0RvY3VtZW50RXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQkJCS8vIERvIG5vdGhpbmcuIERvIG5vdCBwdXNoIHRoZSBuZXcgbW9kZWwncyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkJCS8vIGNoYW5nZXMKLQkJCS8vIG9udG8gdGhlIHVuZG8gY29tbWFuZCBzdGFjaywgb3IgZWxzZSB0aGUgdXNlciBtYXkgYmUgYWJsZSB0bwotCQkJLy8gdW5kbwotCQkJLy8gYW4gZXhpc3RpbmcgZmlsZSB0byBhbiBlbXB0eSBmaWxlLgotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJLy8gU2luY2UgIm5vIGNoYW5nZSIsIGRvIG5vdGhpbmcuCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlwcm9jZXNzU3RydWN0dXJlZERvY3VtZW50RXZlbnQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHByb2Nlc3NTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudChTdHJpbmcgdGV4dERlbGV0ZWQsIFN0cmluZyB0ZXh0SW5zZXJ0ZWQsIGludCB0ZXh0U3RhcnQsIGludCB0ZXh0RW5kKSB7Ci0JCQlpZiAoZlRleHRDb21tYW5kICE9IG51bGwgJiYgdGV4dFN0YXJ0ID09IGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkpIHsKLQkJCQkvLyBhcHBlbmQgdG8gdGhlIHRleHQgY29tbWFuZAotCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0RGVsZXRlZChmVGV4dENvbW1hbmQuZ2V0VGV4dERlbGV0ZWQoKS5jb25jYXQodGV4dERlbGV0ZWQpKTsKLQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dEluc2VydGVkKGZUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5jb25jYXQodGV4dEluc2VydGVkKSk7Ci0JCQkJZlRleHRDb21tYW5kLnNldFRleHRFbmQodGV4dEVuZCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmVGV4dENvbW1hbmQgIT0gbnVsbCAmJiB0ZXh0U3RhcnQgPT0gZlRleHRDb21tYW5kLmdldFRleHRTdGFydCgpIC0gKHRleHRFbmQgLSB0ZXh0U3RhcnQgKyAxKSAmJiB0ZXh0RW5kIDw9IGZUZXh0Q29tbWFuZC5nZXRUZXh0RW5kKCkgLSAodGV4dEVuZCAtIHRleHRTdGFydCArIDEpICYmIHRleHREZWxldGVkLmxlbmd0aCgpID09IDEgJiYgdGV4dEluc2VydGVkLmxlbmd0aCgpID09IDApIHsKLQkJCQkvLyBiYWNrc3BhY2UgcHJlc3NlZAotCi0JCQkJLy8gZXJhc2UgYSBjaGFyYWN0ZXIganVzdCBpbnNlcnRlZAotCQkJCWlmIChmVGV4dENvbW1hbmQuZ2V0VGV4dEluc2VydGVkKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWZUZXh0Q29tbWFuZC5zZXRUZXh0SW5zZXJ0ZWQoZlRleHRDb21tYW5kLmdldFRleHRJbnNlcnRlZCgpLnN1YnN0cmluZygwLCBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIC0gZlRleHRDb21tYW5kLmdldFRleHRTdGFydCgpIC0gMSkpOwotCQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dEVuZCh0ZXh0RW5kKTsKLQkJCQl9Ci0JCQkJLy8gZXJhc2UgYSBjaGFyYWN0ZXIgaW4gdGhlIGZpbGUKLQkJCQllbHNlIHsKLQkJCQkJZlRleHRDb21tYW5kLnNldFRleHREZWxldGVkKHRleHREZWxldGVkLmNvbmNhdChmVGV4dENvbW1hbmQuZ2V0VGV4dERlbGV0ZWQoKSkpOwotCQkJCQlmVGV4dENvbW1hbmQuc2V0VGV4dFN0YXJ0KHRleHRTdGFydCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY3JlYXRlTmV3VGV4dENvbW1hbmQodGV4dERlbGV0ZWQsIHRleHRJbnNlcnRlZCwgdGV4dFN0YXJ0LCB0ZXh0RW5kKTsKLQkJCX0KLQotCQkJLy8gc2F2ZSBjdXJzb3IgcG9zaXRpb24KLQkJCWZDdXJzb3JQb3NpdGlvbiA9IHRleHRFbmQ7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQkvLyBOb3RlOiBmTGlzdGVuaW5nIHRlbGxzIHVzIGlmIHdlIHNob3VsZCBsaXN0ZW4gdG8gdGhlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC4KLQkJCS8vIGZMaXN0ZW5pbmcgaXMgc2V0IHRvIGZhbHNlIHJpZ2h0IGJlZm9yZSB0aGUgdW5kby9yZWRvIHByb2Nlc3MKLQkJCS8vIGFuZAotCQkJLy8gdGhlbiBzZXQgdG8gdHJ1ZSBhZ2FpbgotCQkJLy8gcmlnaHQgYWZ0ZXIgdGhlIHVuZG8vcmVkbyBwcm9jZXNzIHRvIGJsb2NrIG91dCBhbmQgaWdub3JlIGFsbAotCQkJLy8gU3RydWN0dXJlZERvY3VtZW50RXZlbnRzIGdlbmVyYXRlZAotCQkJLy8gYnkgdGhlIHVuZG8vcmVkbyBwcm9jZXNzLgotCi0JCQkvLyBQcm9jZXNzIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IGlmIGZMaXN0ZW5pbmcgaXMgdHJ1ZS4KLQkJCS8vCi0JCQkvLyBXZSBhcmUgZXhlY3V0aW5nIGEgY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrIGlmIHRoZQotCQkJLy8gcmVxdWVzdGVyCi0JCQkvLyBpcyBhIGNvbW1hbmQgKGZvciBleGFtcGxlLCB1bmRvL3JlZG8pLgotCQkJLy8gV2Ugc2hvdWxkIG5vdCBwcm9jZXNzIHRoZSBmbGF0IG1vZGVsIGV2ZW50IHdoZW4gd2UgYXJlCi0JCQkvLyBleGVjdXRpbmcgYQotCQkJLy8gY29tbWFuZCBmcm9tIHRoZSBjb21tYW5kIHN0YWNrLgotCQkJaWYgKGZVbmRvTWFuYWdlbWVudEVuYWJsZWQgJiYgIShzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRPcmlnaW5hbFJlcXVlc3RlcigpIGluc3RhbmNlb2YgQ29tbWFuZCkpIHsKLQkJCQkvLyBjaGVjayByZXF1ZXN0ZXIgaWYgbm90IHJlY29yZGluZwotCQkJCWlmICghZlJlY29yZGluZykKLQkJCQkJY2hlY2tSZXF1ZXN0ZXIoc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T3JpZ2luYWxSZXF1ZXN0ZXIoKSk7Ci0KLQkJCQkvLyBwcm9jZXNzIHRoZSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCQkJCVN0cmluZyB0ZXh0RGVsZXRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldERlbGV0ZWRUZXh0KCk7Ci0JCQkJU3RyaW5nIHRleHRJbnNlcnRlZCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFRleHQoKTsKLQkJCQlpbnQgdGV4dFN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCQkJaW50IHRleHRFbmQgPSB0ZXh0U3RhcnQgKyB0ZXh0SW5zZXJ0ZWQubGVuZ3RoKCk7Ci0JCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHRleHREZWxldGVkLCB0ZXh0SW5zZXJ0ZWQsIHRleHRTdGFydCwgdGV4dEVuZCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJcHJvY2Vzc1N0cnVjdHVyZWREb2N1bWVudEV2ZW50KHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ0hBTkdFX1RFWFQgPSBTU0VDb3JlTWVzc2FnZXMuVGV4dF9DaGFuZ2VfVUlfOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2sgZkNvbW1hbmRTdGFjayA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dENvbXBvdW5kQ29tbWFuZEltcGwgZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmQ29tcG91bmRDb21tYW5kTGFiZWwgPSBudWxsOwotCWludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCS8vIHByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyIGZJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyOwotCS8vIHByaXZhdGUgTWFwIGZUZXh0Vmlld2VyVG9MaXN0ZW5lck1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcltdIGZNZWRpYXRvcnMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmUmVjb3JkaW5nID0gZmFsc2U7Ci0JcHJpdmF0ZSBpbnQgZlJlY29yZGluZ0NvdW50ID0gMDsKLQlwcml2YXRlIE9iamVjdCBmUmVxdWVzdGVyOwotCVN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwgZlRleHRDb21tYW5kID0gbnVsbDsKLQlwcml2YXRlIGludCBmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JYm9vbGVhbiBmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gdHJ1ZTsKLQlwcml2YXRlIGludCBmVW5kb1NlbGVjdGlvbkxlbmd0aCA9IDA7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlcigpIHsKLQkJdGhpcyhuZXcgQmFzaWNDb21tYW5kU3RhY2soKSk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIoQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlzZXRDb21tYW5kU3RhY2soY29tbWFuZFN0YWNrKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvcihJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlpZiAoIVV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCWludCBvbGRTaXplID0gMDsKLQotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmTWVkaWF0b3JzLmxlbmd0aDsKLQkJCX0KLQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCUlEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW10gbmV3TWVkaWF0b3JzID0gbmV3IElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yW25ld1NpemVdOwotCQkJaWYgKGZNZWRpYXRvcnMgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZk1lZGlhdG9ycywgMCwgbmV3TWVkaWF0b3JzLCAwLCBvbGRTaXplKTsKLQkJCX0KLQotCQkJLy8gYWRkIHRoZSBuZXcgdW5kbyBtZWRpYXRvciB0byBsYXN0IHBvc2l0aW9uCi0JCQluZXdNZWRpYXRvcnNbbmV3U2l6ZSAtIDFdID0gbWVkaWF0b3I7Ci0KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQkJCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlcikgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQliZWdpblJlY29yZGluZyhyZXF1ZXN0ZXIsIG51bGwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luUmVjb3JkaW5nKE9iamVjdCByZXF1ZXN0ZXIsIFN0cmluZyBsYWJlbCwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIG51bGwpOwotCi0JCWZVbmRvQ3Vyc29yUG9zaXRpb24gPSBjdXJzb3JQb3NpdGlvbjsKLQkJZlVuZG9TZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb25MZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5SZWNvcmRpbmcoT2JqZWN0IHJlcXVlc3RlciwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJLy8gc2F2ZSB0aGUgcmVxdWVzdGVyCi0JCWZSZXF1ZXN0ZXIgPSByZXF1ZXN0ZXI7Ci0KLQkJLy8gdXBkYXRlIGxhYmVsIGFuZCBkZXNjIG9ubHkgb24gdGhlIGZpcnN0IGxldmVsIHdoZW4gcmVjb3JkaW5nIGlzCi0JCS8vIG5lc3RlZAotCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IGxhYmVsOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmRMYWJlbCA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmRMYWJlbCA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotCQkJaWYgKGZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9PSBudWxsKQotCQkJCWZDb21wb3VuZENvbW1hbmREZXNjcmlwdGlvbiA9IFRFWFRfQ0hBTkdFX1RFWFQ7Ci0KLQkJCS8vIGNsZWFyIGNvbW1hbmRzCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCX0KLQotCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQlmUmVjb3JkaW5nQ291bnQrKzsKLQkJZlJlY29yZGluZyA9IHRydWU7Ci0KLQkJLy8gbm8gdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aCBzcGVjaWZpZWQKLQkJLy8gcmVzZXQgdW5kbyBjdXJzb3IgcG9zaXRpb24gYW5kIHVuZG8gc2VsZWN0aW9uIGxlbmd0aAotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gLTE7Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gMDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpblJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBTdHJpbmcgbGFiZWwsIFN0cmluZyBkZXNjcmlwdGlvbiwgaW50IGN1cnNvclBvc2l0aW9uLCBpbnQgc2VsZWN0aW9uTGVuZ3RoKSB7Ci0JCWJlZ2luUmVjb3JkaW5nKHJlcXVlc3RlciwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQotCQlmVW5kb0N1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0JCWZVbmRvU2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uTGVuZ3RoOwotCX0KLQotCXZvaWQgY2hlY2tSZXF1ZXN0ZXIoT2JqZWN0IHJlcXVlc3RlcikgewotCQlpZiAoZlJlcXVlc3RlciAhPSBudWxsICYmICFmUmVxdWVzdGVyLmVxdWFscyhyZXF1ZXN0ZXIpKSB7Ci0JCQkvLyBGb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyBzbyB0aGUgbGFzdCBjb21wb3VuZCBjb21tYW5kIGlzCi0JCQkvLyBjbG9zZWQuCi0JCQkvLwotCQkJLy8gSG93ZXZlciwgd2Ugc2hvdWxkIG5vdCBmb3JjZSByZXN0YXJ0IG9mIHJlY29yZGluZyB3aGVuIHRoZQotCQkJLy8gcmVxdWVzdCBjYW1lIGZyb20gU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciBvcgotCQkJLy8gWE1MTW9kZWxJbXBsCi0JCQkvLyBiZWNhdXNlIGN1dC9wYXN0ZSByZXF1ZXN0cyBhbmQgY2hhcmFjdGVyIGluc2VydHMgdG8gdGhlCi0JCQkvLyB0ZXh0Vmlld2VyIGFyZSBmcm9tIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIsCi0JCQkvLyBhbmQgcmVxdWVzdHMgdG8gZGVsZXRlIGEgbm9kZSBpbiB0aGUgWE1MVGFibGVUcmVlVmlld2VyIGFyZQotCQkJLy8gZnJvbSBYTUxNb2RlbEltcGwgKHdoaWNoIGltcGxlbWVudHMgSVN0cnVjdHVyZWRNb2RlbCkuCi0KLQkJCWlmICghKHJlcXVlc3RlciBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwgfHwgcmVxdWVzdGVyIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpIHsKLQkJCQlyZXNldEludGVybmFsQ29tbWFuZHMoKTsKLQkJCX0KLQkJfQotCX0KLQotCi0KLQlwdWJsaWMgdm9pZCBjb25uZWN0KElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWVkaWF0b3IpOwotCQlpZiAoZkRvY3VtZW50ID09IG51bGwpIHsKLQkJCS8vIGFkZCB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQlmRG9jdW1lbnQgPSBtZWRpYXRvci5nZXREb2N1bWVudCgpOwotCQkJLy8gZnV0dXJlX1RPRE86IGV2ZW50dWFsbHkgd2Ugd2FudCB0byByZWZhY3RvciBvciBhbGxvdyBlaXRoZXIKLQkJCS8vIHR5cGUgb2YgZG9jdW1lbnQsIGJ1dCBmb3Igbm93LCB3ZSdsbCBkbyBpbnN0YW5jZW9mIGNoZWNrLCBhbmQKLQkJCS8vIGZhaWwKLQkJCS8vIGlmIG5vdCByaWdodCB0eXBlCi0JCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5hZGREb2N1bWVudENoYW5nZWRMaXN0ZW5lcihnZXRJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25seSBtZWRpdGF0b3Igd2l0aCBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBjdXJyZW50bHkgaGFuZGxlZCIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBpZiB3ZSd2ZSBhbHJlYWR5IGhhZCBvdXIgZG9jdW1lbnQgc2V0LCB3ZSdsbCBqdXN0IGRvIHRoaXMgZmFpbAotCQkJLy8gZmFzdCBpbnRlZ3JpdHkgY2hlY2sKLQkJCWlmICghZkRvY3VtZW50LmVxdWFscyhtZWRpYXRvci5nZXREb2N1bWVudCgpKSkKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb25uZWN0aW9uIHRvIHVuZG8gbWFuYWdlciBmYWlsZWQuIERvY3VtZW50IGZvciBkb2N1bWVudCBzZWxlY3Rpb24gbWVkaWF0b3IgaW5jb25pc3RlbnQgd2l0aCB1bmRvIG1hbmFnZXIuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWFkZERvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IobWVkaWF0b3IpOwotCX0KLQotCXZvaWQgY3JlYXRlTmV3VGV4dENvbW1hbmQoU3RyaW5nIHRleHREZWxldGVkLCBTdHJpbmcgdGV4dEluc2VydGVkLCBpbnQgdGV4dFN0YXJ0LCBpbnQgdGV4dEVuZCkgewotCQlTdHJ1Y3R1cmVkVGV4dENvbW1hbmRJbXBsIHRleHRDb21tYW5kID0gbmV3IFN0cnVjdHVyZWRUZXh0Q29tbWFuZEltcGwoZkRvY3VtZW50KTsKLQkJdGV4dENvbW1hbmQuc2V0TGFiZWwoVEVYVF9DSEFOR0VfVEVYVCk7Ci0JCXRleHRDb21tYW5kLnNldERlc2NyaXB0aW9uKFRFWFRfQ0hBTkdFX1RFWFQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0U3RhcnQodGV4dFN0YXJ0KTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dEVuZCh0ZXh0RW5kKTsKLQkJdGV4dENvbW1hbmQuc2V0VGV4dERlbGV0ZWQodGV4dERlbGV0ZWQpOwotCQl0ZXh0Q29tbWFuZC5zZXRUZXh0SW5zZXJ0ZWQodGV4dEluc2VydGVkKTsKLQotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgPT0gbnVsbCkgewotCQkJCVN0cnVjdHVyZWRUZXh0Q29tcG91bmRDb21tYW5kSW1wbCBjb21wb3VuZENvbW1hbmQgPSBuZXcgU3RydWN0dXJlZFRleHRDb21wb3VuZENvbW1hbmRJbXBsKCk7Ci0JCQkJY29tcG91bmRDb21tYW5kLnNldFVuZG9DdXJzb3JQb3NpdGlvbihmVW5kb0N1cnNvclBvc2l0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0VW5kb1NlbGVjdGlvbkxlbmd0aChmVW5kb1NlbGVjdGlvbkxlbmd0aCk7Ci0KLQkJCQljb21wb3VuZENvbW1hbmQuc2V0TGFiZWwoZkNvbXBvdW5kQ29tbWFuZExhYmVsKTsKLQkJCQljb21wb3VuZENvbW1hbmQuc2V0RGVzY3JpcHRpb24oZkNvbXBvdW5kQ29tbWFuZERlc2NyaXB0aW9uKTsKLQkJCQljb21wb3VuZENvbW1hbmQuYXBwZW5kKHRleHRDb21tYW5kKTsKLQkJCQlmQ29tbWFuZFN0YWNrLmV4ZWN1dGUoY29tcG91bmRDb21tYW5kKTsKLQotCQkJCWZDb21wb3VuZENvbW1hbmQgPSBjb21wb3VuZENvbW1hbmQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQ29tcG91bmRDb21tYW5kLmFwcGVuZCh0ZXh0Q29tbWFuZCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmQ29tbWFuZFN0YWNrLmV4ZWN1dGUodGV4dENvbW1hbmQpOwotCQl9Ci0KLQkJZlRleHRDb21tYW5kID0gdGV4dENvbW1hbmQ7Ci0JfQotCi0JLyoqCi0JICogRGlzYWJsZSB1bmRvIG1hbmFnZW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlmVW5kb01hbmFnZW1lbnRFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzY29ubmVjdChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciBtZWRpYXRvcikgewotCQlyZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKG1lZGlhdG9yKTsKLQotCQlpZiAoZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID09IDAgJiYgZkRvY3VtZW50ICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSB0aGlzIHVuZG8gbWFuYWdlciBhcyBzdHJ1Y3R1cmVkIGRvY3VtZW50IGxpc3RlbmVyCi0JCQkvLyBmdXR1cmVfVE9ETzogZXZlbnR1YWxseSB3ZSB3YW50IHRvIHJlZmFjdG9yIG9yIGFsbG93IGVpdGhlcgotCQkJLy8gdHlwZSBvZiBkb2N1bWVudCwgYnV0IGZvciBub3csIHdlJ2xsIGRvIGluc3RhbmNlb2YgY2hlY2ssIGFuZAotCQkJLy8gZmFpbAotCQkJLy8gaWYgbm90IHJpZ2h0IHR5cGUKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLnJlbW92ZURvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGdldEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJvbmx5IG1lZGl0YXRvciB3aXRoIHN0cnVjdHVyZWQgZG9jdW1lbnRzIGN1cnJlbnRseSBoYW5kbGVkIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIGlmIG5vIGxvbmdlciBsaXN0ZW5pbmcgdG8gZG9jdW1lbnQsIHRoZW4gZG9udCBldmVuIHRyYWNrIGl0Ci0JCQkvLyBhbnltb3JlCi0JCQkvLyAodGhpcyBhbGxvd3MgY29ubmVjdCB0byByZWNvbm5lY3QgdG8gZG9jdW1lbnQgYWdhaW4pCi0JCQlmRG9jdW1lbnQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZW5hYmxlVW5kb01hbmFnZW1lbnQoKSB7Ci0JCWZVbmRvTWFuYWdlbWVudEVuYWJsZWQgPSB0cnVlOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IChmVGV4dENvbW1hbmQgIT0gbnVsbCkgPyBmVGV4dENvbW1hbmQuZ2V0VGV4dEVuZCgpIDogLTE7Ci0JCWludCBzZWxlY3Rpb25MZW5ndGggPSAwOwotCi0JCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGVuZFJlY29yZGluZyhPYmplY3QgcmVxdWVzdGVyLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJLy8gUmVjb3JkaW5nIGNvdWxkIGJlIHN0b3BwZWQgYnkgZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKCkuIE1ha2Ugc3VyZQotCQkvLyB3ZSBhcmUgc3RpbGwgcmVjb3JkaW5nIGJlZm9yZSBwcm9jZWVkaW5nLCBvciBlbHNlIGZSZWNvcmRpbmdDb3VudAotCQkvLyBtYXkgbm90IGJlIGJhbGFuY2VkLgotCQlpZiAoZlJlY29yZGluZykgewotCQkJaWYgKGZDb21wb3VuZENvbW1hbmQgIT0gbnVsbCkgewotCQkJCWZDb21wb3VuZENvbW1hbmQuc2V0UmVkb0N1cnNvclBvc2l0aW9uKGN1cnNvclBvc2l0aW9uKTsKLQkJCQlmQ29tcG91bmRDb21tYW5kLnNldFJlZG9TZWxlY3Rpb25MZW5ndGgoc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCX0KLQotCQkJLy8gZW5kIHJlY29yZGluZyBpcyBhIGxvZ2ljYWwgc3RvcHBpbmcgcG9pbnQgZm9yIHRleHQgY29tbWFuZCwKLQkJCS8vIGV2ZW4gd2hlbiBmUmVjb3JkaW5nQ291bnQgPiAwIChpbiBuZXN0ZWQgYmVnaW5SZWNvcmRpbmcpCi0JCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCQkvLyB1cGRhdGUgY291bnRlciBhbmQgZmxhZwotCQkJaWYgKGZSZWNvcmRpbmdDb3VudCA+IDApCi0JCQkJZlJlY29yZGluZ0NvdW50LS07Ci0JCQlpZiAoZlJlY29yZGluZ0NvdW50ID09IDApIHsKLQkJCQlmUmVjb3JkaW5nID0gZmFsc2U7Ci0KLQkJCQkvLyByZXNldCBjb21wb3VuZCBjb21tYW5kIG9ubHkgd2hlbiBmUmVjb3JkaW5nQ291bnQgPT0KLQkJCQkvLyAwCi0JCQkJZkNvbXBvdW5kQ29tbWFuZCA9IG51bGw7Ci0JCQkJZkNvbXBvdW5kQ29tbWFuZExhYmVsID0gbnVsbDsKLQkJCQlmQ29tcG91bmRDb21tYW5kRGVzY3JpcHRpb24gPSBudWxsOwotCi0JCQkJLy8gQWxzbyByZXNldCBmUmVxdWVzdGVyCi0JCQkJZlJlcXVlc3RlciA9IG51bGw7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0byBmaW5kIG1vZGVsIGdpdmVuIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZpbmRTdHJ1Y3R1cmVkTW9kZWwoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUlNb2RlbE1hbmFnZXIgbW9kZWxNYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBtb2RlbE1hbmFnZXIuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlyZXR1cm4gc3RydWN0dXJlZE1vZGVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIjZm9yY2VFbmRPZlBlbmRpbmdDb21tYW5kKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBpbnQsIGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JjZUVuZE9mUGVuZGluZ0NvbW1hbmQoT2JqZWN0IHJlcXVlc3RlciwgaW50IGN1cnJlbnRQb3NpdGlvbiwgaW50IGxlbmd0aCkgewotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyhyZXF1ZXN0ZXIsIGN1cnJlbnRQb3NpdGlvbiwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJcmVzZXRJbnRlcm5hbENvbW1hbmRzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudW5kby5JU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciNnZXRDb21tYW5kU3RhY2soKQotCSAqLwotCXB1YmxpYyBDb21tYW5kU3RhY2sgZ2V0Q29tbWFuZFN0YWNrKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjazsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBDb21tYW5kU3RhY2tMaXN0ZW5lciBnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkgewotCQlpZiAoZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkludGVybmFsQ29tbWFuZFN0YWNrTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpOwotCQl9Ci0JCXJldHVybiBmSW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgZ2V0SW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJaWYgKGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID09IG51bGwpIHsKLQkJCWZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IEludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0UmVkb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFJlZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIENvbW1hbmQgZ2V0VW5kb0NvbW1hbmQoKSB7Ci0JCXJldHVybiBmQ29tbWFuZFN0YWNrLmdldFVuZG9Db21tYW5kKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJcmVkbyhudWxsKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWRvKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlcikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gZmluZFN0cnVjdHVyZWRNb2RlbChmRG9jdW1lbnQpOwotCi0JCWlmIChyZWRvYWJsZSgpKSB7Ci0JCQlJRG9jdW1lbnRFeHRlbnNpb240IGRvY0V4dDQgPSBudWxsOwotCQkJRG9jdW1lbnRSZXdyaXRlU2Vzc2lvbiByZXdyaXRlU2Vzc2lvbiA9IG51bGw7Ci0JCQl0cnkgewotCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQltb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQotCQkJCUNvbW1hbmQgcmVkb0NvbW1hbmQgPSBnZXRSZWRvQ29tbWFuZCgpOwotCQkJCWlmIChyZWRvQ29tbWFuZCBpbnN0YW5jZW9mIENvbXBvdW5kQ29tbWFuZCAmJgotCQkJCQkJbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb240KSB7Ci0JCQkJCWRvY0V4dDQgPSAoSURvY3VtZW50RXh0ZW5zaW9uNCltb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQkJcmV3cml0ZVNlc3Npb24gPSAoZG9jRXh0NCA9PSBudWxsKSA/IG51bGwgOgotCQkJCQlkb2NFeHQ0LnN0YXJ0UmV3cml0ZVNlc3Npb24oRG9jdW1lbnRSZXdyaXRlU2Vzc2lvblR5cGUuVU5SRVNUUklDVEVEKTsKLQotCQkJCS8vIG1ha2Ugc3VyZSB0byByZWRvIGJlZm9yZSBzZXR0aW5nIGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCWZDb21tYW5kU3RhY2sucmVkbygpOwotCi0JCQkJLy8gc2V0IGRvY3VtZW50IHNlbGVjdGlvbgotCQkJCXNldFJlZG9Eb2N1bWVudFNlbGVjdGlvbihyZXF1ZXN0ZXIsIHJlZG9Db21tYW5kKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChkb2NFeHQ0ICE9IG51bGwgJiYgcmV3cml0ZVNlc3Npb24gIT0gbnVsbCkKLQkJCQkJZG9jRXh0NC5zdG9wUmV3cml0ZVNlc3Npb24ocmV3cml0ZVNlc3Npb24pOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiByZWRvYWJsZSgpIHsKLQkJcmV0dXJuIGZDb21tYW5kU3RhY2suY2FuUmVkbygpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZW1vdmVEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIG1lZGlhdG9yKSB7Ci0JCWlmIChmTWVkaWF0b3JzICE9IG51bGwgJiYgbWVkaWF0b3IgIT0gbnVsbCkgewotCQkJLy8gaWYgaXRzIG5vdCBpbiB0aGUgYXJyYXksIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmTWVkaWF0b3JzLCBtZWRpYXRvcikpIHsKLQkJCQlpbnQgb2xkU2l6ZSA9IGZNZWRpYXRvcnMubGVuZ3RoOwotCQkJCWludCBuZXdTaXplID0gb2xkU2l6ZSAtIDE7Ci0JCQkJSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbXSBuZXdNZWRpYXRvcnMgPSBuZXcgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3JbbmV3U2l6ZV07Ci0JCQkJaW50IGluZGV4ID0gMDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG9sZFNpemU7IGkrKykgewotCQkJCQlpZiAoZk1lZGlhdG9yc1tpXSA9PSBtZWRpYXRvcikgeyAvLyBpZ25vcmUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQluZXdNZWRpYXRvcnNbaW5kZXgrK10gPSBmTWVkaWF0b3JzW2ldOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIG5vdyB0aGF0IHdlIGhhdmUgYSBuZXcgYXJyYXksIGxldCdzIHN3aXRjaCBpdCBmb3IgdGhlIG9sZAotCQkJCS8vIG9uZQotCQkJCWZNZWRpYXRvcnMgPSBuZXdNZWRpYXRvcnM7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHJlc2V0SW50ZXJuYWxDb21tYW5kcygpIHsKLQkJLy8gRWl0aGVyIHRoZSByZXF1ZXN0ZXIgb2YgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgY2hhbmdlIGV2ZW50IGlzCi0JCS8vIGNoYW5nZWQsIG9yIHRoZSBjb21tYW5kIHN0YWNrIGlzIGNoYW5nZWQuIE5lZWQgdG8gcmVzZXQgaW50ZXJuYWwKLQkJLy8gY29tbWFuZHMgc28gd2Ugd29uJ3QgY29udGludWUgdG8gYXBwZW5kIGNoYW5nZXMuCi0JCWZDb21wb3VuZENvbW1hbmQgPSBudWxsOwotCQlmVGV4dENvbW1hbmQgPSBudWxsOwotCi0JCS8vIEFsc28gcmVzZXQgZlJlcXVlc3RlcgotCQlmUmVxdWVzdGVyID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21tYW5kU3RhY2soQ29tbWFuZFN0YWNrIGNvbW1hbmRTdGFjaykgewotCQlpZiAoZkNvbW1hbmRTdGFjayAhPSBudWxsKQotCQkJZkNvbW1hbmRTdGFjay5yZW1vdmVDb21tYW5kU3RhY2tMaXN0ZW5lcihnZXRJbnRlcm5hbENvbW1hbmRTdGFja0xpc3RlbmVyKCkpOwotCi0JCWZDb21tYW5kU3RhY2sgPSBjb21tYW5kU3RhY2s7Ci0KLQkJaWYgKGZDb21tYW5kU3RhY2sgIT0gbnVsbCkKLQkJCWZDb21tYW5kU3RhY2suYWRkQ29tbWFuZFN0YWNrTGlzdGVuZXIoZ2V0SW50ZXJuYWxDb21tYW5kU3RhY2tMaXN0ZW5lcigpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0UmVkb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRSZWRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0SW5zZXJ0ZWQoKS5sZW5ndGgoKTsKLQkJfQotCi0JCWlmIChjdXJzb3JQb3NpdGlvbiA+IC0xICYmIGZNZWRpYXRvcnMgIT0gbnVsbCAmJiBmTWVkaWF0b3JzLmxlbmd0aCA+IDApIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk1lZGlhdG9ycy5sZW5ndGg7IGkrKykgewotCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGZNZWRpYXRvcnNbaV0uZ2V0RG9jdW1lbnQoKTsKLQkJCQlmTWVkaWF0b3JzW2ldLnVuZG9PcGVyYXRpb25TZWxlY3Rpb25DaGFuZ2VkKG5ldyBVbmRvRG9jdW1lbnRFdmVudChyZXF1ZXN0ZXIsIGRvY3VtZW50LCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIHJlcXVlc3RlciwgQ29tbWFuZCBjb21tYW5kKSB7Ci0JCWludCBjdXJzb3JQb3NpdGlvbiA9IC0xOwotCQlpbnQgc2VsZWN0aW9uTGVuZ3RoID0gMDsKLQotCQlpZiAoY29tbWFuZCBpbnN0YW5jZW9mIENvbW1hbmRDdXJzb3JQb3NpdGlvbikgewotCQkJQ29tbWFuZEN1cnNvclBvc2l0aW9uIGNvbW1hbmRDdXJzb3JQb3NpdGlvbiA9IChDb21tYW5kQ3Vyc29yUG9zaXRpb24pIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvQ3Vyc29yUG9zaXRpb24oKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IGNvbW1hbmRDdXJzb3JQb3NpdGlvbi5nZXRVbmRvU2VsZWN0aW9uTGVuZ3RoKCk7Ci0JCX0KLQkJZWxzZSBpZiAoY29tbWFuZCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Q29tbWFuZCkgewotCQkJU3RydWN0dXJlZFRleHRDb21tYW5kIHN0cnVjdHVyZWRUZXh0Q29tbWFuZCA9IChTdHJ1Y3R1cmVkVGV4dENvbW1hbmQpIGNvbW1hbmQ7Ci0JCQljdXJzb3JQb3NpdGlvbiA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0U3RhcnQoKTsKLQkJCXNlbGVjdGlvbkxlbmd0aCA9IHN0cnVjdHVyZWRUZXh0Q29tbWFuZC5nZXRUZXh0RGVsZXRlZCgpLmxlbmd0aCgpOwotCQl9Ci0KLQkJaWYgKGN1cnNvclBvc2l0aW9uID4gLTEgJiYgZk1lZGlhdG9ycyAhPSBudWxsICYmIGZNZWRpYXRvcnMubGVuZ3RoID4gMCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWVkaWF0b3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZk1lZGlhdG9yc1tpXS5nZXREb2N1bWVudCgpOwotCQkJCWZNZWRpYXRvcnNbaV0udW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQobmV3IFVuZG9Eb2N1bWVudEV2ZW50KHJlcXVlc3RlciwgZG9jdW1lbnQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHVuZG8oKSB7Ci0JCXVuZG8obnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5kbyhJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIpIHsKLQkJLy8gRm9yY2UgYW4gZW5kUmVjb3JkaW5nIGJlZm9yZSB1bmRvLgotCQkvLwotCQkvLyBGb3IgZXhhbXBsZSwgcmVjb3JkaW5nIHdhcyB0dXJuZWQgb24gb24gdGhlIERlc2lnbiBQYWdlIG9mCi0JCS8vIFBhZ2VEZXNpZ25lci4KLQkJLy8gVGhlbiB1bmRvIGlzIGludm9rZWQgb24gdGhlIFNvdXJjZSBQYWdlLiBSZWNvcmRpbmcgc2hvdWxkIGJlCi0JCS8vIHN0b3BwZWQgYmVmb3JlIHdlIHVuZG8uCi0JCS8vIE5vdGUgdGhhdCByZWRvIHNob3VsZCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gd2Ugc3dpdGNoIHRvIHRoZSBTb3VyY2UKLQkJLy8gUGFnZS4KLQkJLy8gVGhlcmVmb3JlLCB0aGlzIGZvcmNlIGVuZGluZyBvZiByZWNvcmRpbmcgaXMgbm90IG5lZWRlZCBpbiByZWRvLgotCQlpZiAoZlJlY29yZGluZykKLQkJCWVuZFJlY29yZGluZyh0aGlzKTsKLQotCQlpZiAodW5kb2FibGUoKSkgewotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IGZpbmRTdHJ1Y3R1cmVkTW9kZWwoZkRvY3VtZW50KTsKLQkJCUlEb2N1bWVudEV4dGVuc2lvbjQgZG9jRXh0NCA9IG51bGw7Ci0JCQlEb2N1bWVudFJld3JpdGVTZXNzaW9uIHJld3JpdGVTZXNzaW9uID0gbnVsbDsKLQotCQkJdHJ5IHsKLQkJCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlDb21tYW5kIHVuZG9Db21tYW5kID0gZ2V0VW5kb0NvbW1hbmQoKTsKLQkJCQlpZiAodW5kb0NvbW1hbmQgaW5zdGFuY2VvZiBDb21wb3VuZENvbW1hbmQgJiYKLQkJCQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpIGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uNCkgewotCQkJCQlkb2NFeHQ0ID0gKElEb2N1bWVudEV4dGVuc2lvbjQpbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCQkJfQotCQkJCXJld3JpdGVTZXNzaW9uID0gKGRvY0V4dDQgPT0gbnVsbCkgPyBudWxsIDoKLQkJCQkJZG9jRXh0NC5zdGFydFJld3JpdGVTZXNzaW9uKERvY3VtZW50UmV3cml0ZVNlc3Npb25UeXBlLlVOUkVTVFJJQ1RFRCk7Ci0JCQkJCi0JCQkJLy8gbWFrZSBzdXJlIHRvIHVuZG8gYmVmb3JlIHNldHRpbmcgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJZkNvbW1hbmRTdGFjay51bmRvKCk7Ci0KLQkJCQkvLyBzZXQgZG9jdW1lbnQgc2VsZWN0aW9uCi0JCQkJc2V0VW5kb0RvY3VtZW50U2VsZWN0aW9uKHJlcXVlc3RlciwgdW5kb0NvbW1hbmQpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKGRvY0V4dDQgIT0gbnVsbCAmJiByZXdyaXRlU2Vzc2lvbiAhPSBudWxsKQotCQkJCQlkb2NFeHQ0LnN0b3BSZXdyaXRlU2Vzc2lvbihyZXdyaXRlU2Vzc2lvbik7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIHVuZG9hYmxlKCkgewotCQlyZXR1cm4gZkNvbW1hbmRTdGFjay5jYW5VbmRvKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91bmRvL1VuZG9Eb2N1bWVudEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYyZjhkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3VuZG8vVW5kb0RvY3VtZW50RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG87Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIFVuZG9Eb2N1bWVudEV2ZW50IHsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCXByaXZhdGUgSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IgZlJlcXVlc3RlcjsKLQotCXB1YmxpYyBVbmRvRG9jdW1lbnRFdmVudChJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciByZXF1ZXN0ZXIsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlmUmVxdWVzdGVyID0gcmVxdWVzdGVyOwotCQlmRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJZk9mZnNldCA9IG9mZnNldDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIGZPZmZzZXQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFNlbGVjdGlvbk1lZGlhdG9yIGdldFJlcXVlc3RlcigpIHsKLQkJcmV0dXJuIGZSZXF1ZXN0ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0Fzc2VydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTIwYTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLS8qKgotICogPGNvZGU+QXNzZXJ0PC9jb2RlPiBpcyB1c2VmdWwgZm9yIGZvciBlbWJlZGRpbmcgcnVudGltZSBzYW5pdHkgY2hlY2tzIGluCi0gKiBjb2RlLiBUaGUgcHJlZGljYXRlIG1ldGhvZHMgYWxsIHRlc3QgYSBjb25kaXRpb24gYW5kIHRocm93IHNvbWUgdHlwZSBvZgotICogdW5jaGVja2VkIGV4Y2VwdGlvbiBpZiB0aGUgY29uZGl0aW9uIGRvZXMgbm90IGhvbGQuCi0gKiA8cD4KLSAqIEFzc2VydGlvbiBmYWlsdXJlIGV4Y2VwdGlvbnMsIGxpa2UgbW9zdCBydW50aW1lIGV4Y2VwdGlvbnMsIGFyZSB0aHJvd24gd2hlbgotICogc29tZXRoaW5nIGlzIG1pc2JlaGF2aW5nLiBBc3NlcnRpb24gZmFpbHVyZXMgYXJlIGludmFyaWFibHkgdW5zcGVjaWZpZWQKLSAqIGJlaGF2aW9yOyBjb25zZXF1ZW50bHksIGNsaWVudHMgc2hvdWxkIG5ldmVyIHJlbHkgb24gdGhlc2UgYmVpbmcgdGhyb3duCi0gKiAoYW5kIGNlcnRhaW5seSBzaG91bGQgbm90IGJlaW5nIGNhdGNoaW5nIHRoZW0gc3BlY2lmaWNhbGx5KS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEFzc2VydCB7Ci0KLQkvKioKLQkgKiA8Y29kZT5Bc3NlcnRpb25GYWlsZWRFeGNlcHRpb248L2NvZGU+IGlzIGEgcnVudGltZSBleGNlcHRpb24gdGhyb3duCi0JICogYnkgc29tZSBvZiB0aGUgbWV0aG9kcyBpbiA8Y29kZT5Bc3NlcnQ8L2NvZGU+LgotCSAqIDxwPgotCSAqIFRoaXMgY2xhc3MgaXMgbm90IGRlY2xhcmVkIHB1YmxpYyB0byBwcmV2ZW50IHNvbWUgbWlzdXNlczsgcHJvZ3JhbXMKLQkgKiB0aGF0IGNhdGNoIG9yIG90aGVyd2lzZSBkZXBlbmQgb24gYXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBzdXNjZXB0aWJsZSB0bwotCSAqIHVuZXhwZWN0ZWQgYnJlYWthZ2Ugd2hlbiBhc3NlcnRpb25zIGluIHRoZSBjb2RlIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqIDwvcD4KLQkgKi8KLQljbGFzcyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKLQkJLyoqCi0JCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JCSAqLwotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4Y2VwdGlvbiB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbihTdHJpbmcgZGV0YWlsKSB7Ci0JCQlzdXBlcihkZXRhaWwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IGFuIGFyZ3VtZW50IGlzIGxlZ2FsLiBJZiB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyBub3QKLQkgKiA8Y29kZT50cnVlPC9jb2RlPiwgYW4gPGNvZGU+SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPC9jb2RlPiBpcwotCSAqIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbikgewotCQlyZXR1cm4gaXNMZWdhbChleHByZXNzaW9uLCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgYW4gYXJndW1lbnQgaXMgbGVnYWwuIElmIHRoZSBnaXZlbiBib29sZWFuIGlzIG5vdAotCSAqIDxjb2RlPnRydWU8L2NvZGU+LCBhbiA8Y29kZT5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2NvZGU+IGlzCi0JICogdGhyb3duLiBUaGUgZ2l2ZW4gbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkCi0JICogZGVidWdnaW5nLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2UgdG8gaW5jbHVkZSBpbiB0aGUgZXhjZXB0aW9uCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgY2hlY2sgcGFzc2VzIChkb2VzIG5vdCByZXR1cm4gaWYgdGhlCi0JICogICAgICAgICBjaGVjayBmYWlscykKLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBsZWdhbGl0eSB0ZXN0IGZhaWxlZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0xlZ2FsKGJvb2xlYW4gZXhwcmVzc2lvbiwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJaWYgKCFleHByZXNzaW9uKQotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIG9iamVjdCBpcyA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBpc05vdE51bGwoT2JqZWN0IG9iamVjdCkgewotCQlpc05vdE51bGwob2JqZWN0LCAiIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuCi0JICogbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJLy9Mb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIm51bGxfYXJndW1lbnQ6ICIgKyBtZXNzYWdlKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gYm9vbGVhbiBpcyA8Y29kZT50cnVlPC9jb2RlPi4gSWYgdGhpcyBpcyBub3QKLQkgKiB0aGUgY2FzZSwgc29tZSBraW5kIG9mIHVuY2hlY2tlZCBleGNlcHRpb24gaXMgdGhyb3duLgotCSAqIAotCSAqIEBwYXJhbSBleHByZXNzaW9uCi0JICogICAgICAgICAgICB0aGUgb3V0Y29kZSBvZiB0aGUgY2hlY2sKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uKSB7Ci0JCXJldHVybiBpc1RydWUoZXhwcmVzc2lvbiwgIiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBib29sZWFuIGlzIDxjb2RlPnRydWU8L2NvZGU+LiBJZiB0aGlzIGlzIG5vdAotCSAqIHRoZSBjYXNlLCBzb21lIGtpbmQgb2YgdW5jaGVja2VkIGV4Y2VwdGlvbiBpcyB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlCi0JICogaXMgaW5jbHVkZWQgaW4gdGhhdCBleGNlcHRpb24sIHRvIGFpZCBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RydWUoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pIHsKLQkJCXRocm93IG5ldyBBc3NlcnQoKS5uZXcgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCQlzdXBlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9EZWJ1Zy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RlYnVnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyOGYwMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RlYnVnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVidWcgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBjaGVja0Zvck1lbW9yeUxlYWtzID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gY29sbGVjdFN0YXRzID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUJVRyA9IDA7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUdfVEhSRUFETE9DQUwgPSBmYWxzZTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0JyZWFrcG9pbnRzID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnQ2FyZXRNZWRpYXRvciA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0Rpc3BsYXlUcmVlUG9zaXRpb25zID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdNZWRpYXRvciA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTm90aWZpY2F0aW9uID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnTm90aWZpY2F0aW9uQW5kRXZlbnRzID0gZmFsc2U7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdOb3RpZnlEZWZlcnJlZCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1JlY29uY2lsaW5nID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdSdGZGb3JtYXRQcm92aWRlciA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnU3RydWN0dXJlZERvY3VtZW50ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVGFnbGlicyA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnVG9rZW5pemVyID0gZmFsc2U7Ci0JLy8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdUcmVlTW9kZWwgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWdVcGRhdGVUcmVlUG9zaXRpb25zID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc3BsYXlJbmZvID0gZmFsc2U7Ci0KLQkvKiogZWZmZWN0cyBvdXRwdXQgb2YgTG9nZ2VyICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGRpc3BsYXlUb0NvbnNvbGUgPSB0cnVlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBkaXNwbGF5V2FybmluZ3MgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBoZWFkUGFyc2luZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBqc0RlYnVnQ29udGV4dEFzc2lzdCA9IGZhbHNlOwotCS8vCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIGpzRGVidWdTeW50YXhDb2xvcmluZyA9IGZhbHNlOwotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIExPQ0tTID0gZmFsc2U7Ci0JLy8gCi0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0ID0gZmFsc2U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIHBlcmZUZXN0QWRhcHRlckNsYXNzTG9hZGluZyA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdEZvcm1hdCA9IGZhbHNlOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBwZXJmVGVzdFJhd1N0cnVjdHVyZWREb2N1bWVudE9ubHkgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudE9ubHkgPSBmYWxzZTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gcGVyZlRlc3RTdHJ1Y3R1cmVkRG9jdW1lbnRPbmx5ID0gZmFsc2U7Ci0KLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBzeW50YXhIaWdobGlnaHRpbmcgPSBmYWxzZTsKLQkvLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiB1c2VTdGFuZGFyZEVvbEluV2lkZ2V0ID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBGb3IgdGVzdHMgYW5kIGRlYnVnIG9ubHkKLQkgKi8KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCBkdW1wKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCWR1bXAoc3RydWN0dXJlZERvY3VtZW50LCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXAoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIGJvb2xlYW4gdmVyYm9zZSkgewotCQlJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZmxhdE5vZGUgPSBudWxsOwotCQlTeXN0ZW0ub3V0LnByaW50bG4oIkR1bXAgb2Ygc3RydWN0dXJlZERvY3VtZW50OiIpOyAvLyROT04tTkxTLTEkCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCUVudW1lcmF0aW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBmbGF0Tm9kZXMuZWxlbWVudHMoKTsKLQkJd2hpbGUgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCWZsYXROb2RlID0gKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgc3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5uZXh0RWxlbWVudCgpOwotCQkJaWYgKCF2ZXJib3NlKSB7Ci0JCQkJU3RyaW5nIG91dFN0cmluZyA9IGZsYXROb2RlLnRvU3RyaW5nKCk7Ci0JCQkJb3V0U3RyaW5nID0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzLmVzY2FwZShvdXRTdHJpbmcpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihvdXRTdHJpbmcpOwotCQkJfSBlbHNlIHsKLQkJCQlkdW1wKGZsYXROb2RlLCB2ZXJib3NlKTsKLQkJCX0KLQkJfQotCQlTeXN0ZW0ub3V0LnByaW50bG4oKTsKLQkJU3lzdGVtLm91dC5wcmludGxuKCI9ID0gPSA9ID0gPSIpOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBmbGF0Tm9kZQotCSAqIEBwYXJhbSB2ZXJib3NlCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCB2b2lkIGR1bXAoSVRleHRSZWdpb25Db2xsZWN0aW9uIHJlZ2lvbiwgYm9vbGVhbiB2ZXJib3NlKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHZlcmJvc2UpIHsKLQkJCXByaW50UGFyZW50KHJlZ2lvbik7Ci0JCX0KLQkJcHJpbnRDaGlsZFJlZ2lvbnMocmVnaW9uLCAwKTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50Q2hpbGRSZWdpb25zKElUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24sIGludCBkZXB0aCkgewotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCS8vID09PiAvLyBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uQ29sbGVjdGlvbiA9IHJlZ2lvbjsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihyZWdpb24pOwotCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbkxpc3QgPSByZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHJlZ2lvbkxpc3QuZ2V0KGkpOwotCQkJCWlmIChyIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByYyA9IChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHI7Ci0JCQkJCXByaW50Q2hpbGRSZWdpb25zKHJjLCBkZXB0aCsrKTsKLQkJCQl9IGVsc2UgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oc3BhY2UoZGVwdGgpICsgcik7Ci0JCQkJCWRlcHRoLS07Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogU2ltcGxlIHV0aWxpdHkgdG8gbWFrZSBzdXJlIHByaW50bG4ncyBhcmUgc29tZSB3aGF0IGluIG9yZGVyCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBzeW5jaHJvbml6ZWQgdm9pZCBwcmludGxuKFN0cmluZyBtc2cpIHsKLQkJU3lzdGVtLm91dC5wcmludGxuKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIlx0IiArIG1zZyk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UGFyZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyB0b1N0cmluZ1V0aWwocmVnaW9uLmdldFBhcmVudERvY3VtZW50KCkpICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFBhcmVudChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlwcmludFBhcmVudCgoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgcmVnaW9uKTsKLQkJfSBlbHNlIGlmIChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJcHJpbnRQYXJlbnQoKElUZXh0UmVnaW9uQ29udGFpbmVyKSByZWdpb24pOwotCQl9IGVsc2UKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyAiKG5hKSIgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCX0KLQotCXByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQYXJlbnQoSVRleHRSZWdpb25Db250YWluZXIgcmVnaW9uKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigiICAgIFtwYXJlbnQgZG9jdW1lbnQ6ICIgKyB0b1N0cmluZ1V0aWwocmVnaW9uLmdldFBhcmVudCgpKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkZXB0aAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3BhY2UoaW50IGRlcHRoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSAiICAiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgewotCQkJcmVzdWx0ICs9ICIgICI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nVXRpbChJU3RydWN0dXJlZERvY3VtZW50IG9iamVjdCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gb2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQlTdHJpbmcgc2hvcnRDbGFzc05hbWUgPSBjbGFzc05hbWUuc3Vic3RyaW5nKGNsYXNzTmFtZS5sYXN0SW5kZXhPZigiLiIpICsgMSk7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHJlc3VsdCA9IHNob3J0Q2xhc3NOYW1lOwotCQkvLyBOT1RFOiBpZiB0aGUgZG9jdW1lbnQgaGVsZCBieSBhbnkgcmVnaW9uIGhhcyBiZWVuIHVwZGF0ZWQgYW5kIHRoZQotCQkvLyByZWdpb24gb2Zmc2V0cyBoYXZlIG5vdAotCQkvLyB5ZXQgYmVlbiB1cGRhdGVkLCB0aGUgb3V0cHV0IGZyb20gdGhpcyBtZXRob2QgaW52YWxpZC4KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nVXRpbChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gb2JqZWN0KSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWU7Ci0JCS8vIE5PVEU6IGlmIHRoZSBkb2N1bWVudCBoZWxkIGJ5IGFueSByZWdpb24gaGFzIGJlZW4gdXBkYXRlZCBhbmQgdGhlCi0JCS8vIHJlZ2lvbiBvZmZzZXRzIGhhdmUgbm90Ci0JCS8vIHlldCBiZWVuIHVwZGF0ZWQsIHRoZSBvdXRwdXQgZnJvbSB0aGlzIG1ldGhvZCBpbnZhbGlkLgotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoqCi0JICogRGVidWcgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgRGVidWcoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50SW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9Eb2N1bWVudElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMjU5YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0RvY3VtZW50SW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLQotcHVibGljIGNsYXNzIERvY3VtZW50SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7Ci0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgaW50IGZNYXJrID0gLTE7Ci0JcHJpdmF0ZSBpbnQgZlBvc2l0aW9uID0gMDsKLQotCXB1YmxpYyBEb2N1bWVudElucHV0U3RyZWFtKElEb2N1bWVudCBzb3VyY2UpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gc291cmNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNhdmFpbGFibGUoKQotCSAqLwotCXB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jY2xvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdGhpcy5mRG9jdW1lbnQgPSBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrKGludCkKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7Ci0JCWZNYXJrID0gZlBvc2l0aW9uOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNtYXJrU3VwcG9ydGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCWlmIChmUG9zaXRpb24gPCBmRG9jdW1lbnQuZ2V0TGVuZ3RoKCkpCi0JCQkJcmV0dXJuIGZEb2N1bWVudC5nZXRDaGFyKGZQb3NpdGlvbisrKTsKLQkJCWVsc2UKLQkJCQlyZXR1cm4gLTE7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IG5ldyBJT0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIGphdmEuaW8uSW5wdXRTdHJlYW0jcmVzZXQoKQotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZXNldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZQb3NpdGlvbiA9IGZNYXJrOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgamF2YS5pby5JbnB1dFN0cmVhbSNza2lwKGxvbmcpCi0JICovCi0JcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWxvbmcgc2tpcHBlZCA9IG47Ci0JCWlmIChuIDwgZkRvY3VtZW50LmdldExlbmd0aCgpIC0gZlBvc2l0aW9uKSB7Ci0JCQlza2lwcGVkID0gbjsKLQkJCWZQb3NpdGlvbiArPSBza2lwcGVkOwotCQl9IGVsc2UgewotCQkJc2tpcHBlZCA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKSAtIGZQb3NpdGlvbjsKLQkJCWZQb3NpdGlvbiA9IGZEb2N1bWVudC5nZXRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gc2tpcHBlZDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvSmFyVXRpbGl0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5NDYzYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL0phclV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgSmFyVXRpbGl0aWVzIHsKLQotCS8qKgotCSAqIEBzZWUgaHR0cDovL2phdmEuc3VuLmNvbS9wcm9kdWN0cy9qc3AvZXJyYXRhXzFfMV9hXzA0MjgwMC5odG1sLCBJc3N1ZXMKLQkgKiAgICAgIDggJiA5Ci0JICogCi0JICogIlRoZXJlIGFyZSB0d28gY2FzZXMuIEluIGJvdGggY2FzZXMgdGhlIFRMRF9VUkkgaXMgdG8gYmUgaW50ZXJwcmV0ZWQKLQkgKiByZWxhdGl2ZSB0byB0aGUgcm9vdCBvZiB0aGUgV2ViIEFwcGxpY2F0aW9uLiBJbiB0aGUgZmlyc3QgY2FzZSB0aGUKLQkgKiBUTERfVVJJIHJlZmVycyB0byBhIFRMRCBmaWxlIGRpcmVjdGx5LiBJbiB0aGUgc2Vjb25kIGNhc2UsIHRoZSBUTERfVVJJCi0JICogcmVmZXJzIHRvIGEgSkFSIGZpbGUuIElmIHNvLCB0aGF0IEpBUiBmaWxlIHNob3VsZCBoYXZlIGEgVExEIGF0Ci0JICogbG9jYXRpb24gTUVUQS1JTkYvdGFnbGliLnRsZC4iCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQMTFfVEFHTElCID0gIk1FVEEtSU5GL3RhZ2xpYi50bGQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgY2xvc2VKYXJGaWxlKFppcEZpbGUgZmlsZSkgewotCQlpZiAoZmlsZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0cnkgewotCQkJZmlsZS5jbG9zZSgpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKLQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkphclV0aWxpdGllczogQ291bGQgbm90IGNsb3NlIGZpbGUgIiArIGZpbGUuZ2V0TmFtZSgpLCBpb2UpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBhIHN0cmVhbSB0byBhIGxvY2FsIGNvcHkgb2YgdGhlIGlucHV0IG9yIG51bGwgaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRDYWNoZWRJbnB1dFN0cmVhbShTdHJpbmcgamFyRmlsZW5hbWUsIFN0cmluZyBlbnRyeU5hbWUpIHsKLQkJRmlsZSB0ZXN0RmlsZSA9IG5ldyBGaWxlKGphckZpbGVuYW1lKTsKLQkJaWYgKCF0ZXN0RmlsZS5leGlzdHMoKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlucHV0U3RyZWFtIGNhY2hlID0gbnVsbDsKLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWphcmZpbGUgPSBuZXcgWmlwRmlsZShqYXJGaWxlbmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvRXhjKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJKYXJVdGlsaXRpZXM6ICIgKyBqYXJGaWxlbmFtZSwgaW9FeGMpOyAvLyROT04tTkxTLTEkCi0JCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCX0KLQotCQlpZiAoamFyZmlsZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVppcEVudHJ5IHplbnRyeSA9IGphcmZpbGUuZ2V0RW50cnkoZW50cnlOYW1lKTsKLQkJCQlpZiAoemVudHJ5ICE9IG51bGwpIHsKLQkJCQkJSW5wdXRTdHJlYW0gZW50cnlJbnB1dFN0cmVhbSA9IG51bGw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQllbnRyeUlucHV0U3RyZWFtID0gamFyZmlsZS5nZXRJbnB1dFN0cmVhbSh6ZW50cnkpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBpb0V4YykgewotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiSmFyVXRpbGl0aWVzOiAiICsgamFyRmlsZW5hbWUsIGlvRXhjKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0KLQkJCQkJaWYgKGVudHJ5SW5wdXRTdHJlYW0gIT0gbnVsbCkgewotCQkJCQkJaW50IGM7Ci0JCQkJCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyID0gbnVsbDsKLQkJCQkJCWlmICh6ZW50cnkuZ2V0U2l6ZSgpID4gMCkgewotCQkJCQkJCWJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKGludCkgemVudHJ5LmdldFNpemUoKSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBhcnJheSBkaW0gcmVzdHJpY3Rpb24/Ci0JCQkJCQlieXRlIGJ5dGVzW10gPSBuZXcgYnl0ZVsyMDQ4XTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJd2hpbGUgKChjID0gZW50cnlJbnB1dFN0cmVhbS5yZWFkKGJ5dGVzKSkgPj0gMCkgewotCQkJCQkJCQlidWZmZXIud3JpdGUoYnl0ZXMsIDAsIGMpOwotCQkJCQkJCX0KLQkJCQkJCQljYWNoZSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7Ci0JCQkJCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgewotCQkJCQkJCS8vIG5vIGNsZWFudXAgY2FuIGJlIGRvbmUKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWVudHJ5SW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQljbG9zZUphckZpbGUoamFyZmlsZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhY2hlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RW50cnlOYW1lcyhJUmVzb3VyY2UgamFyUmVzb3VyY2UpIHsKLQkJaWYgKGphclJlc291cmNlID09IG51bGwgfHwgamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JCXJldHVybiBnZXRFbnRyeU5hbWVzKGphclJlc291cmNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSkgewotCQlyZXR1cm4gZ2V0RW50cnlOYW1lcyhqYXJGaWxlbmFtZSwgdHJ1ZSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnRyeU5hbWVzKFN0cmluZyBqYXJGaWxlbmFtZSwgYm9vbGVhbiBleGNsdWRlRGlyZWN0b3JpZXMpIHsKLQkJWmlwRmlsZSBqYXJmaWxlID0gbnVsbDsKLQkJTGlzdCBlbnRyeU5hbWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJamFyZmlsZSA9IG5ldyBaaXBGaWxlKGphckZpbGVuYW1lKTsKLQkJCUVudW1lcmF0aW9uIGVudHJpZXMgPSBqYXJmaWxlLmVudHJpZXMoKTsKLQkJCXdoaWxlIChlbnRyaWVzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJWmlwRW50cnkgeiA9IChaaXBFbnRyeSkgZW50cmllcy5uZXh0RWxlbWVudCgpOwotCQkJCWlmICghKHouaXNEaXJlY3RvcnkoKSAmJiBleGNsdWRlRGlyZWN0b3JpZXMpKQotCQkJCQllbnRyeU5hbWVzLmFkZCh6LmdldE5hbWUoKSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFppcEV4Y2VwdGlvbiB6RXhjKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSmFyVXRpbGl0aWVzIFppcEV4Y2VwdGlvbjogIiArIGphckZpbGVuYW1lICsgIiAiICsgekV4Yy5nZXRNZXNzYWdlKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gaW9FeGMpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJKYXJVdGlsaXRpZXMgSU9FeGNlcHRpb246ICIgKyBqYXJGaWxlbmFtZSArICIgIiArIGlvRXhjLmdldE1lc3NhZ2UoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWZpbmFsbHkgewotCQkJY2xvc2VKYXJGaWxlKGphcmZpbGUpOwotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gKFN0cmluZ1tdKSBlbnRyeU5hbWVzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JCXJldHVybiBuYW1lczsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKElSZXNvdXJjZSBqYXJSZXNvdXJjZSwgU3RyaW5nIGVudHJ5TmFtZSkgewotCQlpZiAoamFyUmVzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0SW5wdXRTdHJlYW0oamFyUmVzb3VyY2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLCBlbnRyeU5hbWUpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oU3RyaW5nIGphckZpbGVuYW1lLCBTdHJpbmcgZW50cnlOYW1lKSB7Ci0JCS8vIGNoZWNrIHNhbml0eQotCQlpZiAoamFyRmlsZW5hbWUgPT0gbnVsbCB8fCBqYXJGaWxlbmFtZS5sZW5ndGgoKSA8IDEgfHwgZW50cnlOYW1lID09IG51bGwgfHwgZW50cnlOYW1lLmxlbmd0aCgpIDwgMSkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEpBUiBmaWxlcyBhcmUgbm90IGFsbG93ZWQgdG8gaGF2ZSBsZWFkaW5nICcvJyBpbiBtZW1iZXIgbmFtZXMKLQkJU3RyaW5nIGludGVybmFsTmFtZSA9IG51bGw7Ci0JCWlmIChlbnRyeU5hbWUuc3RhcnRzV2l0aCgiLyIpKSAvLyROT04tTkxTLTEkCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWUuc3Vic3RyaW5nKDEpOwotCQllbHNlCi0JCQlpbnRlcm5hbE5hbWUgPSBlbnRyeU5hbWU7Ci0KLQkJcmV0dXJuIGdldENhY2hlZElucHV0U3RyZWFtKGphckZpbGVuYW1lLCBpbnRlcm5hbE5hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUGF0aEhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzEyMDYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9QYXRoSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLS8qKgotICogQ29sbGVjdGlvbiBvZiBoZWxwZXIgbWV0aG9kcyB0byBtYW5hZ2UgYW5kIGNvbnZlcnQgbGlua3MgT3JpZ2luYWxseSBwYXJ0IG9mCi0gKiB0aGUgTGlua3NNYW5hZ2VyIAotICovCi1wdWJsaWMgY2xhc3MgUGF0aEhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1dBUkRfU0xBU0ggPSAiXFwiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUldBUkRfU0xBU0ggPSAiLyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTEFUSVZFX1BBVEhfU0lHID0gIi4uLyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogYWRqdXN0IHJlbGF0aXZlIHBhdGggaXNzaWRlIHRoZSBhYnNvbHV0ZSBwYXRoCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYWRqdXN0UGF0aChTdHJpbmcgcGF0aCkgewotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlICgoaSA9IHBhdGguaW5kZXhPZihSRUxBVElWRV9QQVRIX1NJRykpID4gMCkgewotCQkJLy8gc3BsaXQgdGhlIHN0cmluZyBpbnRvIHR3bwotCQkJU3RyaW5nIHBhcnQxID0gcGF0aC5zdWJzdHJpbmcoMCwgaSAtIDEpOwotCQkJU3RyaW5nIHBhcnQyID0gcGF0aC5zdWJzdHJpbmcoaSArIFJFTEFUSVZFX1BBVEhfU0lHLmxlbmd0aCgpIC0gMSk7Ci0JCQkvLyBzdHJpcCBvbmUgcGF0aCBzZWcgZnJvbSBwYXJ0MQotCQkJaW50IGogPSBwYXJ0MS5sYXN0SW5kZXhPZihGT1JXQVJEX1NMQVNIKTsKLQkJCWlmIChqID09IC0xKSB7Ci0JCQkJLy8gY2FuJ3QgcmVzb2x2ZS4gcGFzc2VkIHBhdGggaXMgbGlrZQotCQkJCS8vIEU6L2VjbGlwc2Vwcm9qZWN0Ly4uLy4uL3NhbXBsZS5jc3MuCi0JCQkJcmV0dXJuICIiOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXBhcnQxID0gcGFydDEuc3Vic3RyaW5nKDAsIGopOwotCQkJcGF0aCA9IHBhcnQxICsgcGFydDI7Ci0JCX0KLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogQXBwZW5kIHRyYWlsaW5nIHVybCBzbGFzaCBpZiBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBhcHBlbmRUcmFpbGluZ1VSTFNsYXNoKFN0cmluZyBpbnB1dCkgewotCQkvLyBjaGVjayB0byBzZWUgYWxyZWFkeSBhIHNsYXNoCi0JCWlmICghaW5wdXQuZW5kc1dpdGgoRk9SV0FSRF9TTEFTSCkpIHsKLQkJCWlucHV0ICs9IEZPUldBUkRfU0xBU0g7Ci0JCX0KLQkJcmV0dXJuIGlucHV0OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnQgdG8gcmVsYXRpdmUgdXJsIGJhc2VkIG9uIGJhc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjb252ZXJ0VG9SZWxhdGl2ZShTdHJpbmcgaW5wdXQsIFN0cmluZyBiYXNlKSB7Ci0JCS8vIHRva2VuaXplIHRoZSBzdHJpbmdzCi0JCVN0cmluZ1Rva2VuaXplciBpbnB1dFRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoaW5wdXQsIEZPUldBUkRfU0xBU0gpOwotCQlTdHJpbmdUb2tlbml6ZXIgYmFzZVRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYmFzZSwgRk9SV0FSRF9TTEFTSCk7Ci0JCVN0cmluZyB0b2tlbjEgPSAiIiwgdG9rZW4yID0gIiI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJLy8KLQkJLy8gR28gdGhyb3VnaCB1bnRpbCBlcXVscwotCQl3aGlsZSAodHJ1ZSkgewotCQkJaWYgKCFpbnB1dFRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkgfHwgIWJhc2VUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKQotCQkJCWJyZWFrOwotCQkJdG9rZW4xID0gYmFzZVRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCXRva2VuMiA9IGlucHV0VG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJaWYgKCF0b2tlbjEuZXF1YWxzKHRva2VuMikpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJLy8gbm93IGdlbmVyYXRlIHRoZSBiYWNrcwotCQlTdHJpbmcgb3V0cHV0ID0gIiI7Ly8kTk9OLU5MUy0xJAotCQl3aGlsZSAoYmFzZVRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWJhc2VUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQlvdXRwdXQgKz0gIi4uLyI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlvdXRwdXQgKz0gdG9rZW4yOwotCQkvLyBnZW5lcmF0ZSB0aGUgcmVzdAotCQl3aGlsZSAoaW5wdXRUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlvdXRwdXQgPSBvdXRwdXQgKyBGT1JXQVJEX1NMQVNIICsgaW5wdXRUb2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCX0KLQkJcmV0dXJuIG91dHB1dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGNvbnRhaW5pbmcgZm9sZGVyIHBhdGguIFdpbGwgaGFuZGxlIGJvdGggdXJsIGFuZCBmaWxlIHBhdGgKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb250YWluaW5nRm9sZGVyUGF0aChTdHJpbmcgcGF0aCkgewotCQlTdHJpbmcgcmV0VmFsdWUgPSBwYXRoOwotCi0JCWludCB1cmxTbGFzaEluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZihGT1JXQVJEX1NMQVNIKTsKLQkJaW50IGZpbGVQYXRoU2xhc2hJbmRleCA9IHBhdGgubGFzdEluZGV4T2YoRmlsZS5zZXBhcmF0b3IpOwotCQlpbnQgaW5kZXggPSBmaWxlUGF0aFNsYXNoSW5kZXg7Ci0JCWlmICh1cmxTbGFzaEluZGV4ID4gZmlsZVBhdGhTbGFzaEluZGV4KQotCQkJaW5kZXggPSB1cmxTbGFzaEluZGV4OwotCQlpZiAoaW5kZXggPj0gMCkKLQkJCXJldFZhbHVlID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQlyZXR1cm4gcmV0VmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlIGxlYWRpbmcgcGF0aCBzZXBhcmF0b3IKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMZWFkaW5nUGF0aFNlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhGaWxlLnNlcGFyYXRvci5sZW5ndGgoKSk7Ci0JCXJldHVybiBwYXRoOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZSBsZWFkaW5nIHBhdGggc2VwYXJhdG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1NlcGFyYXRvcihTdHJpbmcgcGF0aCkgewotCQlpZiAocGF0aC5zdGFydHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLQkJCXBhdGggPSBwYXRoLnN1YnN0cmluZyhGaWxlLnNlcGFyYXRvci5sZW5ndGgoKSk7Ci0JCWVsc2UgaWYgKHBhdGguc3RhcnRzV2l0aChGT1JXQVJEX1NMQVNIKSB8fCBwYXRoLnN0YXJ0c1dpdGgoQkFDS1dBUkRfU0xBU0gpKQotCQkJcGF0aCA9IHBhdGguc3Vic3RyaW5nKEZPUldBUkRfU0xBU0gubGVuZ3RoKCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBTd2l0Y2ggdG8gZmlsZSBwYXRoIHNsYXNoZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBzd2l0Y2hUb0ZpbGVQYXRoU2xhc2hlcyhTdHJpbmcgcGF0aCkgewotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZPUldBUkRfU0xBU0guY2hhckF0KDApLCBGaWxlLnNlcGFyYXRvckNoYXIpOwotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEJBQ0tXQVJEX1NMQVNILmNoYXJBdCgwKSwgRmlsZS5zZXBhcmF0b3JDaGFyKTsKLQkJcmV0dXJuIHBhdGg7Ci0JfQotCi0JLyoqCi0JICogU3dpdGNoIHRvIGZpbGUgcGF0aCBzbGFzaGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3dpdGNoVG9Gb3J3YXJkU2xhc2hlcyhTdHJpbmcgcGF0aCkgewotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEZpbGUuc2VwYXJhdG9yQ2hhciwgRk9SV0FSRF9TTEFTSC5jaGFyQXQoMCkpOwotCQlwYXRoID0gcGF0aC5yZXBsYWNlKEJBQ0tXQVJEX1NMQVNILmNoYXJBdCgwKSwgRk9SV0FSRF9TTEFTSC5jaGFyQXQoMCkpOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUHJvamVjdFJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUHJvamVjdFJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNTJmOGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1Byb2plY3RSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBUaGUgVVJJUmVzb2x2ZXIgaW50ZXJmYWNlIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgcmVzb2x2ZXIgZnJvbQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci4KLSAqLwotcHVibGljIGNsYXNzIFByb2plY3RSZXNvbHZlciBpbXBsZW1lbnRzIFVSSVJlc29sdmVyIHsKLQlwcml2YXRlIFN0cmluZyBmRmlsZUJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvamVjdCBmUHJvamVjdCA9IG51bGw7Ci0KLQkvKioKLQkgKiBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IGNsaWVudHMgdXNlCi0JICogcHJvamVjdC5nZXRBZGFwdGVyKFVSSVJlc29sdmVyLmNsYXNzKSB0byBvYnRhaW4gYSBVUklSZXNvbHZlciBhd2FyZSBvZgotCSAqIHRoZSBQcm9qZWN0J3Mgc3BlY2lhbCByZXF1aXJlbWVudHMuIE5vdGUgdGhhdCBhIFVSSVJlc29sdmVyIG1heSBub3QgYmUKLQkgKiByZXR1cm5lZCBhdCBhbGwgc28gbWFudWFsbHkgY3JlYXRpbmcgdGhpcyBvYmplY3QgbWF5IHN0aWxsIGJlIHJlcXVpcmVkLgotCSAqLwotCXB1YmxpYyBQcm9qZWN0UmVzb2x2ZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGaWxlQmFzZUxvY2F0aW9uKCkgewotCQlyZXR1cm4gZkZpbGVCYXNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmkpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBnZXRGaWxlQmFzZUxvY2F0aW9uKCkpOwotCX0KLQotCS8vIGRlZmVjdCAyNDQ4MTcgZW5kCi0JLyoqCi0JICogUmVzb2x2ZSB0aGUgKHBvc3NpYmx5IHJlbGF0aXZlKSBVUkkgYWNvcmRpbmcgdG8gUkZDMTgwOCB1c2luZyB0aGUKLQkgKiBkZWZhdWx0IGZpbGUgYmFzZSBsb2NhdGlvbi4gUmVzb2x2ZXMgcmVzb3VyY2UgcmVmZXJlbmNlcyBpbnRvIGFic29sdXRlCi0JICogcmVzb3VyY2UgbG9jYXRpb25zIHdpdGhvdXQgZW5zdXJpbmcgdGhhdCB0aGUgcmVzb3VyY2UgYWN0dWFsbHkgZXhpc3RzLgotCSAqIAotCSAqIE5vdGU6IGN1cnJlbnRseSByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgaWdub3JlZCBpbiB0aGlzCi0JICogaW1wbGVtZW50YXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKSB7Ci0JCXJldHVybiBnZXRMb2NhdGlvbkJ5VVJJKHVyaSwgZ2V0RmlsZUJhc2VMb2NhdGlvbigpLCByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSkgewotCQlpZiAodXJpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLyoKLQkJICogZGVmZWN0IDI0NDgxNyB0cnkgeyBVUkwgYVVSTCA9IG5ldyBVUkwodXJpKTsKLQkJICovCi0JCS8qKgotCQkgKiBBbiBhY3R1YWwgVVJMIHdhcyBnaXZlbiwgYnV0IG9ubHkgdGhlICJmaWxlOi8vLyIgcHJvdG9jb2wgaXMKLQkJICogc3VwcG9ydGVkLiBSZXNvbHZlIHRoZSBVUkkgYnkgZmluZGluZyB0aGUgZmlsZSB0byB3aGljaCBpdCBwb2ludHMuCi0JCSAqLwotCQkvKgotCQkgKiBkZWZlY3QgMjQ0ODE3IGlmICghYVVSTC5nZXRQcm90b2NvbCgpLmVxdWFscygicGxhdGZvcm0iKSkgewotCQkgKiAvLyROT04tTkxTLTEkIGlmIChhVVJMLmdldFByb3RvY29sKCkuZXF1YWxzKCJmaWxlIikgJiYKLQkJICogKGFVUkwuZ2V0SG9zdCgpLmVxdWFscygibG9jYWxob3N0IikgfHwgYVVSTC5nZXRIb3N0KCkubGVuZ3RoKCkgPT0KLQkJICogMCkpIHsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQgcmV0dXJuIGFVUkwuZ2V0RmlsZSgpOyB9IHJldHVybgotCQkgKiB1cmk7IH0gfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIG1mdUV4YykgeyB9Ci0JCSAqLwotCQkvLyBkZWZlY3QgMjQ0ODE3IHN0YXJ0Ci0JCWlmIChpc0ZpbGVVUkwodXJpKSkgewotCQkJdHJ5IHsKLQkJCQlVUkwgdXJsID0gbmV3IFVSTCh1cmkpOwotCQkJCXJldHVybiBnZXRQYXRoKHVybCk7Ci0JCQl9Ci0JCQljYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCX0KLQkJfQotCQkvLyBkZWZlY3QgMjQ0ODE3IGVuZAotCi0JCS8vIHdoaWNoIG9mIHRoZSBzZXJ2ZXJhbCBhcmUgd2Ugc3VwcG9zZSB0byB1c2UgaGVyZT8KLQkJLy8KLQotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzEyMjMKLQkJLy8gV29ya2Fyb3VuZCBmb3IgcHJvYmxlbSBpbiBVUklIZWxwZXI7IHVyaXMgc3RhcnRpbmcgd2l0aCAnLycgYXJlCi0JCS8vIHJldHVybmVkIGFzLWlzLgotCQlTdHJpbmcgbG9jYXRpb24gPSB1cmk7Ci0JCWlmICh1cmkuc3RhcnRzV2l0aCgiLyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlQcm9qZWN0IHAgPSBnZXRQcm9qZWN0KCk7Ci0JCQlpZiAocCAhPSBudWxsICYmIHAuZXhpc3RzKCkpCi0JCQkJbG9jYXRpb24gPSBwLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKSArIHVyaTsKLQkJfQotCQllbHNlIHsKLQkJCWxvY2F0aW9uID0gVVJJSGVscGVyLm5vcm1hbGl6ZSh1cmksIGJhc2VSZWZlcmVuY2UsIGdldFJvb3RMb2NhdGlvblN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiAKLQkgKiBOb3RlOiBjdXJyZW50bHkgcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzIGlzIGlnbm9yZWQgaW4gdGhpcwotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpLCBTdHJpbmcgYmFzZVJlZmVyZW5jZSwgYm9vbGVhbiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MpIHsKLQkJcmV0dXJuIGdldExvY2F0aW9uQnlVUkkodXJpLCBiYXNlUmVmZXJlbmNlKTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGF0aAotCSAqIEBwYXJhbSBob3N0Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRQYXRoKElQYXRoIHBhdGgsIFN0cmluZyBob3N0KSB7Ci0JCUlQYXRoIG5ld1BhdGggPSBwYXRoOwotCQkvLyBUaGV5IGFyZSBwb3RlbnRpYWxseSBmb3Igb25seSBXaW5kb3dzIG9wZXJhdGluZyBzeXN0ZW0uCi0JCS8vIGEuKSBpZiBwYXRoIGhhcyBhIGRldmljZSwgYW5kIGlmIGl0IGJlZ2lucyB3aXRoIElQYXRoLlNFUEFSQVRPUiwKLQkJLy8gcmVtb3ZlIGl0Ci0JCWZpbmFsIFN0cmluZyBkZXZpY2UgPSBwYXRoLmdldERldmljZSgpOwotCQlpZiAoKGRldmljZSAhPSBudWxsKSAmJiAoZGV2aWNlLmxlbmd0aCgpID4gMCkpIHsKLQkJCWlmIChkZXZpY2UuY2hhckF0KDApID09IElQYXRoLlNFUEFSQVRPUikgewotCQkJCWZpbmFsIFN0cmluZyBuZXdEZXZpY2UgPSBkZXZpY2Uuc3Vic3RyaW5nKDEpOwotCQkJCW5ld1BhdGggPSBwYXRoLnNldERldmljZShuZXdEZXZpY2UpOwotCQkJfQotCQl9Ci0JCS8vIGIuKSBpZiBpdCBoYXMgYSBob3N0bmFtZSwgaXQgaXMgVU5DIG5hbWUuLi4gQW55IGphdmEgb3IgZWNsaXBzZSBhcGkKLQkJLy8gaGVscHMgaXQgPz8KLQkJaWYgKHBhdGggIT0gbnVsbCAmJiBob3N0ICE9IG51bGwgJiYgaG9zdC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlJUGF0aCB1bmNQYXRoID0gbmV3IFBhdGgoaG9zdCk7Ci0JCQl1bmNQYXRoID0gdW5jUGF0aC5hcHBlbmQocGF0aCk7Ci0JCQluZXdQYXRoID0gdW5jUGF0aC5tYWtlVU5DKHRydWUpOwotCQl9Ci0JCXJldHVybiBuZXdQYXRoLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIHVybAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGF0aChVUkwgdXJsKSB7Ci0JCVN0cmluZyByZWYgPSB1cmwuZ2V0UmVmKCkgPT0gbnVsbCA/ICIiIDogIiMiICsgdXJsLmdldFJlZigpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU3RyaW5nIHN0clBhdGggPSB1cmwuZ2V0RmlsZSgpICsgcmVmOwotCQlJUGF0aCBwYXRoOwotCQlpZiAoc3RyUGF0aC5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwYXRoID0gUGF0aC5ST09UOwotCQl9Ci0JCWVsc2UgewotCQkJcGF0aCA9IG5ldyBQYXRoKHN0clBhdGgpOwotCQkJU3RyaW5nIHF1ZXJ5ID0gbnVsbDsKLQkJCVN0cmluZ1Rva2VuaXplciBwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0clBhdGgsICI/Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWludCB0b2tlbkNvdW50ID0gcGFyc2VyLmNvdW50VG9rZW5zKCk7Ci0JCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJcGF0aCA9IG5ldyBQYXRoKChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpKTsKLQkJCQlxdWVyeSA9IChTdHJpbmcpIHBhcnNlci5uZXh0RWxlbWVudCgpOwotCQkJfQotCQkJaWYgKHF1ZXJ5ID09IG51bGwpIHsKLQkJCQlwYXJzZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHBhdGgudG9TdHJpbmcoKSwgIiMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRva2VuQ291bnQgPSBwYXJzZXIuY291bnRUb2tlbnMoKTsKLQkJCQlpZiAodG9rZW5Db3VudCA9PSAyKSB7Ci0JCQkJCXBhdGggPSBuZXcgUGF0aCgoU3RyaW5nKSBwYXJzZXIubmV4dEVsZW1lbnQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBnZXRQYXRoKHBhdGgsIHVybC5nZXRIb3N0KCkpOwotCX0KLQotCXB1YmxpYyBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCBnZXRQcm9qZWN0KCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHVibGljIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIgZ2V0Um9vdExvY2F0aW9uKCkgewotCQlyZXR1cm4gZlByb2plY3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSb290TG9jYXRpb25TdHJpbmcoKSB7Ci0JCXJldHVybiBmUHJvamVjdC5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElucHV0U3RyZWFtIGdldFVSSVN0cmVhbShTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8vIGRlZmVjdCAyNDQ4MTcgc3RhcnQKLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gcGFzc2VkU3BlYwotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZpbGVVUkwoU3RyaW5nIHBhc3NlZFNwZWMpIHsKLQkJaWYgKHBhc3NlZFNwZWMgPT0gbnVsbCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCWZpbmFsIFN0cmluZyBzcGVjID0gcGFzc2VkU3BlYy50cmltKCk7Ci0JCWlmIChzcGVjLmxlbmd0aCgpID09IDApIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlmaW5hbCBpbnQgbGltaXQgPSBzcGVjLmxlbmd0aCgpOwotCQlTdHJpbmcgbmV3UHJvdG9jb2wgPSBudWxsOwotCQlmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgbGltaXQ7IGluZGV4KyspIHsKLQkJCWZpbmFsIGNoYXIgcCA9IHNwZWMuY2hhckF0KGluZGV4KTsKLQkJCWlmIChwID09ICcvJykgeyAvLyROT04tTkxTLTEkCi0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAocCA9PSAnOicpIHsgLy8kTk9OLU5MUy0xJAotCQkJCW5ld1Byb3RvY29sID0gc3BlYy5zdWJzdHJpbmcoMCwgaW5kZXgpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiAobmV3UHJvdG9jb2wgIT0gbnVsbCAmJiBuZXdQcm90b2NvbC5jb21wYXJlVG9JZ25vcmVDYXNlKCJmaWxlIikgPT0gMCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWxlQmFzZUxvY2F0aW9uKFN0cmluZyBuZXdGaWxlQmFzZUxvY2F0aW9uKSB7Ci0JCWZGaWxlQmFzZUxvY2F0aW9uID0gbmV3RmlsZUJhc2VMb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KElQcm9qZWN0IG5ld1Byb2plY3QpIHsKLQkJZlByb2plY3QgPSBuZXdQcm9qZWN0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9SZXNvdXJjZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGIyYzhjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvUmVzb3VyY2VVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZVJvb3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gbWFrZXMgYXNzdW1wdGlvbnMgb24gYmVoYWxmIG9mIHRoZSByZXF1ZXN0ZXIKLSAqLwotcHVibGljIGNsYXNzIFJlc291cmNlVXRpbCB7Ci0KLQkvKioKLQkgKiBPYnRhaW5zIHRoZSBJRmlsZSBmb3IgYSBtb2RlbAotCSAqIAotCSAqIEBwYXJhbSBtb2RlbAotCSAqICAgICAgICAgICAgdGhlIG1vZGVsIHRvIHVzZQotCSAqIEByZXR1cm4gdGhlIElGaWxlIHVzZWQgdG8gY3JlYXRlIHRoZSBtb2RlbCwgaWYgaXQgY2FtZSBmcm9tIGFuIElGaWxlLAotCSAqICAgICAgICAgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIElGaWxlIGdldEZpbGVGb3IoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJV29ya3NwYWNlUm9vdCByb290ID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKTsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCUlQYXRoIGxvY2F0aW9uID0gbmV3IFBhdGgobW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkvLyBpZiB0aGUgcGF0aCBpcyBub3QgYSBwYXRoIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgdGhlcmUgYXJlIGF0IGxlYXN0Ci0JCS8vIDIgc2VnbWVudHMsIGl0IG1pZ2h0IGJlIGluIHRoZSB3b3Jrc3BhY2UKLQkJSUZpbGVbXSBmaWxlcyA9IHJvb3QuZmluZEZpbGVzRm9yTG9jYXRpb24obG9jYXRpb24pOwotCQlpZiAoZmlsZXMubGVuZ3RoID4gMCkgewotCQkJZmlsZSA9IGZpbGVzWzBdOwotCQl9Ci0JCWVsc2UgaWYgKGxvY2F0aW9uLnNlZ21lbnRDb3VudCgpID4gMSkgewotCQkJLy8gcmVtZW1iZXIsIHRoaXMgSUZpbGUgaXNuJ3QgZ3VhcmFudGVlZCB0byBleGlzdAotCQkJZmlsZSA9IHJvb3QuZ2V0RmlsZShsb2NhdGlvbik7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogT2J0YWluIElGaWxlcyBmcm9tIElTdHJ1Y3R1cmVkTW9kZWwgKGluY2x1ZGVzIGxpbmtlZFJlc291cmNlcykKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGZpbGVzIGluIHRoZSB3b3Jrc3BhY2UsIG9yIGFuIGVtcHR5IGFycmF5IGlmCi0JICogICAgICAgICBub25lCi0JICovCi0JcHVibGljIHN0YXRpYyBJRmlsZVtdIGdldEZpbGVzRm9yKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJRmlsZVtdIGZpbGVzID0gbnVsbDsKLQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSk7Ci0JCUlXb3Jrc3BhY2VSb290IHJvb3QgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpOwotCQkvLyBpZiB0aGUgcGF0aCBpcyBub3QgYSBwYXRoIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgdGhlcmUgYXJlIGF0IGxlYXN0Ci0JCS8vIDIgc2VnbWVudHMsIGl0IG1pZ2h0IGJlIGluIHRoZSB3b3Jrc3BhY2UKLQkJaWYgKCFsb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSAmJiBsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpIHsKLQkJCS8vIHJlbWVtYmVyLCB0aGlzIElGaWxlIGlzbid0IGd1YXJhbnRlZWQgdG8gZXhpc3QKLQkJCWZpbGVzID0gbmV3IElGaWxlW117cm9vdC5nZXRGaWxlKGxvY2F0aW9uKX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmaWxlcyA9IHJvb3QuZmluZEZpbGVzRm9yTG9jYXRpb24obG9jYXRpb24pOwotCQl9Ci0JCXJldHVybiBmaWxlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU2NyaXB0TGFuZ3VhZ2VLZXlzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvU2NyaXB0TGFuZ3VhZ2VLZXlzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZTI2OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1NjcmlwdExhbmd1YWdlS2V5cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotLyoqCi0gKiBDb250YWlucyBsaXN0IG9mIHNjcmlwdCBsYW5ndWFnZXMgYW5kIG1pbWUgdHlwZXMKLSAqLwotcHVibGljIGludGVyZmFjZSBTY3JpcHRMYW5ndWFnZUtleXMgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQSA9ICJqYXZhIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBKQVZBX0xBTkdVQUdFX0tFWVMgPSBuZXcgU3RyaW5nW117ImphdmEifTsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFWQVNDUklQVCA9ICJqYXZhc2NyaXB0IjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9MQU5HVUFHRV9LRVlTID0geyJqYXZhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4wIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4xIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4yIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS4zIiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS40IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS41IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqYXZhc2NyaXB0MS42IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJqc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJzYXNoc2NyaXB0In07IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUyA9IHsidGV4dC9qYXZhc2NyaXB0IiwgLy8kTk9OLU5MUy0xJAotCQkJCSJ0ZXh0L2pzY3JpcHQiLCAvLyROT04tTkxTLTEkCi0JCQkJInRleHQvc2FzaHNjcmlwdCJ9OyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVGV4dFV0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1RleHRVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmOTRmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3V0aWwvVGV4dFV0aWxpdGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbDsKLQotCi0KLS8qKgotICogQ29sbGVjdGlvbiBvZiB0ZXh0IGZ1bmN0aW9ucy4KLSAqIEBkZXByZWNhdGVkIC0gdGhlIEpGYWNlIGNsYXNzIGlzIHB1YmxpYyBpbiAzLjEKLSAqLwotLy8gVGhpcyBjbGFzcyB3YXMgb3JpZ2luYWxseSBjb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LCBhbmQgbWFkZQotLy8gcHVibGljCi1wdWJsaWMgY2xhc3MgVGV4dFV0aWxpdGllcyB7Ci0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSB0ZXh0IGVuZHMgd2l0aCBvbmUgb2YgdGhlIGdpdmVuIHNlYXJjaCBzdHJpbmdzLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlbmRzV2l0aChTdHJpbmdbXSBzZWFyY2hTdHJpbmdzLCBTdHJpbmcgdGV4dCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IHNlYXJjaFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmICh0ZXh0LmVuZHNXaXRoKHNlYXJjaFN0cmluZ3NbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nIGdyZWF0ZXIgdGhhbiBvZmZzZXQgb2YgdGhlIGxvbmdlc3QKLQkgKiBtYXRjaGluZyBzZWFyY2ggc3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50W10gaW5kZXhPZihTdHJpbmdbXSBzZWFyY2hTdHJpbmdzLCBTdHJpbmcgdGV4dCwgaW50IG9mZnNldCkgewotCi0JCWludFtdIHJlc3VsdCA9IHstMSwgLTF9OwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJaW50IGluZGV4ID0gdGV4dC5pbmRleE9mKHNlYXJjaFN0cmluZ3NbaV0sIG9mZnNldCk7Ci0JCQlpZiAoaW5kZXggPj0gMCkgewotCi0JCQkJaWYgKHJlc3VsdFswXSA9PSAtMSkgewotCQkJCQlyZXN1bHRbMF0gPSBpbmRleDsKLQkJCQkJcmVzdWx0WzFdID0gaTsKLQkJCQl9IGVsc2UgaWYgKGluZGV4IDwgcmVzdWx0WzBdKSB7Ci0JCQkJCXJlc3VsdFswXSA9IGluZGV4OwotCQkJCQlyZXN1bHRbMV0gPSBpOwotCQkJCX0gZWxzZSBpZiAoaW5kZXggPT0gcmVzdWx0WzBdICYmIHNlYXJjaFN0cmluZ3NbaV0ubGVuZ3RoKCkgPiBzZWFyY2hTdHJpbmdzW3Jlc3VsdFsxXV0ubGVuZ3RoKCkpIHsKLQkJCQkJcmVzdWx0WzBdID0gaW5kZXg7Ci0JCQkJCXJlc3VsdFsxXSA9IGk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VUklSZXNvbHZlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1VSSVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMzQ0NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1VSSVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZAotICogCi0gKiBTaG91bGQgdXNlIGV4dGVuc2libGUgVVJJUmVzb2x2ZXIgZnJvbSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyCi0gKiBpbnN0ZWFkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgVVJJUmVzb2x2ZXIgewotCi0JU3RyaW5nIGdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIGFjb3JkaW5nIHRvIFJGQzE4MDggdXNpbmcgdGhlCi0JICogZGVmYXVsdCBmaWxlIGJhc2UgbG9jYXRpb24uIFJlc29sdmVzIHJlc291cmNlIHJlZmVyZW5jZXMgaW50byBhYnNvbHV0ZQotCSAqIHJlc291cmNlIGxvY2F0aW9ucyB3aXRob3V0IGVuc3VyaW5nIHRoYXQgdGhlIHJlc291cmNlIGFjdHVhbGx5IGV4aXN0cy4KLQkgKi8KLQlTdHJpbmcgZ2V0TG9jYXRpb25CeVVSSShTdHJpbmcgdXJpKTsKLQotCS8qKgotCSAqIFJlc29sdmUgdGhlIChwb3NzaWJseSByZWxhdGl2ZSkgVVJJIGFjb3JkaW5nIHRvIFJGQzE4MDggdXNpbmcgdGhlCi0JICogZGVmYXVsdCBmaWxlIGJhc2UgbG9jYXRpb24uIFJlc29sdmVzIHJlc291cmNlIHJlZmVyZW5jZXMgaW50byBhYnNvbHV0ZQotCSAqIHJlc291cmNlIGxvY2F0aW9ucyB3aXRob3V0IGVuc3VyaW5nIHRoYXQgdGhlIHJlc291cmNlIGFjdHVhbGx5IGV4aXN0cy4KLQkgKiAKLQkgKiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcyBhIHZhbGlkIFVSSSB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkKLQkgKiBwcm9qZWN0LgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIGJvb2xlYW4gcmVzb2x2ZUNyb3NzUHJvamVjdExpbmtzKTsKLQotCS8qKgotCSAqIFBlcmZvcm0gdGhlIGdldExvY2F0aW9uQnlVUkkgYWN0aW9uIHVzaW5nIHRoZSBiYXNlUmVmZXJlbmNlIGFzIHRoZQotCSAqIHBvaW50IG9mIHJlZmVyZW5jZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGZvciB0aGlzIHJlc29sdmVyCi0JICovCi0JU3RyaW5nIGdldExvY2F0aW9uQnlVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGJhc2VSZWZlcmVuY2UpOwotCi0JLyoqCi0JICogUGVyZm9ybSB0aGUgZ2V0TG9jYXRpb25CeVVSSSBhY3Rpb24gdXNpbmcgdGhlIGJhc2VSZWZlcmVuY2UgYXMgdGhlCi0JICogcG9pbnQgb2YgcmVmZXJlbmNlIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgZm9yIHRoaXMgcmVzb2x2ZXIKLQkgKiAKLQkgKiBJZiByZXNvbHZlQ3Jvc3NQcm9qZWN0TGlua3MgaXMgc2V0IHRvIHRydWUsIHRoZW4gdGhpcyBtZXRob2Qgd2lsbAotCSAqIHByb3Blcmx5IHJlc29sdmUgdGhlIFVSSSBpZiBpdCBpcyBhIHZhbGlkIFVSSSB0byBhbm90aGVyIChhcHByb3ByaWF0ZSkKLQkgKiBwcm9qZWN0LgotCSAqLwotCVN0cmluZyBnZXRMb2NhdGlvbkJ5VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlUmVmZXJlbmNlLCBib29sZWFuIHJlc29sdmVDcm9zc1Byb2plY3RMaW5rcyk7Ci0KLQlJUHJvamVjdCBnZXRQcm9qZWN0KCk7Ci0KLQlJQ29udGFpbmVyIGdldFJvb3RMb2NhdGlvbigpOwotCi0JLyoqCi0JICogQXR0ZW1wdHMgdG8gcmV0dXJuIGEgZGlyZWN0IGlucHV0c3RyZWFtIHRvIHRoZSBnaXZlbiBVUkkgd2hpY2ggbXVzdCBiZQotCSAqIHJlbGF0aXZlIHRvIHRoZSBkZWZhdWx0IHBvaW50IG9mIHJlZmVyZW5jZS4KLQkgKiAKLQkgKi8KLQlJbnB1dFN0cmVhbSBnZXRVUklTdHJlYW0oU3RyaW5nIHVyaSk7Ci0KLQl2b2lkIHNldEZpbGVCYXNlTG9jYXRpb24oU3RyaW5nIG5ld0xvY2F0aW9uKTsKLQotCXZvaWQgc2V0UHJvamVjdChJUHJvamVjdCBuZXdQcm9qZWN0KTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1V0aWxpdGllcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC91dGlsL1V0aWxpdGllcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzUxMDBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdXRpbC9VdGlsaXRpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkSU87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQnVmZmVyZWRMaW1pdGVkU3RyZWFtOwotCi0KLQotcHVibGljIGNsYXNzIFV0aWxpdGllcyB7Ci0KLQkvKioKLQkgKiBhIGNvbW1vbiBjYWxjdWxhdGlvbiBpbiBzb21lIG9mIHRoZSBwYXJzaW5nIG1ldGhvZHMgKGUuZy4gaW4KLQkgKiBDb250ZXh0UmVnaW9uIGFuZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoU3RyaW5nIGNoYW5nZXMsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gZGV0ZXJtaW5lIHRoZSBsZW5ndGggYnkgdGhlIHRleHQgaXRzZWxmLCBvciwgaWYgdGhlcmUgaXMgbm8gdGV4dCB0bwotCQkvLyBpbnNlcnQgKGkuZS4gd2UgYXJlIGRvaW5nIGEgZGVsZXRlKSB0aGVuIGNhbGN1bGF0ZSB0aGUgbGVuZ3RoIGFzCi0JCS8vIGEgbmVnYXRpdmUgbnVtYmVyIHRvIGRlbm90ZSB0aGUgYW1vdW50IHRvIGRlbGV0ZS4KLQkJLy8gRm9yIGEgc3RyYWlnaHQgaW5zZXJ0LCB0aGUgc2VsZWN0aW9uIExlbmd0aCB3aWxsIGJlIHplcm8uCi0JCWludCBsZW5ndGhEaWZmZXJlbmNlID0gMDsKLQkJaWYgKGNoYW5nZXMgPT0gbnVsbCkgewotCQkJLy8gdGhlIGRlbGV0ZSBjYXNlCi0JCQlsZW5ndGhEaWZmZXJlbmNlID0gMCAtIGxlbmd0aFRvUmVwbGFjZTsKLQkJfQotCQllbHNlIHsKLQkJCWxlbmd0aERpZmZlcmVuY2UgPSBjaGFuZ2VzLmxlbmd0aCgpIC0gbGVuZ3RoVG9SZXBsYWNlOwotCQl9Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJsZW5ndGhEaWZmZXJlbmNlOiAiICsgbGVuZ3RoRGlmZmVyZW5jZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBsZW5ndGhEaWZmZXJlbmNlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZmYgYm90aCBwYXJhbWV0ZXJzIGFyZSBub3QgbnVsbCBhbmQgdGhlIG9iamVjdCBpcyB3aXRoaW4KLQkgKiB0aGUgYXJyYXkuIENhcmVmdWwsIHRoaXMgdXNlcyBpZGVudGl0eS4gTm90IGdvb2QgZm9yIGJhc2ljIHN0cmluZ3MuCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdFtdIG9iamVjdEFycmF5LCBPYmplY3Qgb2JqZWN0KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIGlmIG9iamVjdCBvciBvYmplY3RBcnJheSBpcyBudWxsLCByZXR1cm4gZmFsc2UKLQkJaWYgKChvYmplY3RBcnJheSAhPSBudWxsKSAmJiAob2JqZWN0ICE9IG51bGwpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG9iamVjdEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG9iamVjdEFycmF5W2ldID09IG9iamVjdCkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNTdHJpbmcoU3RyaW5nW10gb2JqZWN0QXJyYXksIFN0cmluZyBvYmplY3QpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgb2JqZWN0IG9yIG9iamVjdEFycmF5IGlzIG51bGwsIHJldHVybiBmYWxzZQotCQlpZiAoKG9iamVjdEFycmF5ICE9IG51bGwpICYmIChvYmplY3QgIT0gbnVsbCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2JqZWN0QXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAob2JqZWN0QXJyYXlbaV0uZXF1YWxzKG9iamVjdCkpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQsIGlzIHJlYWRsaW1pdCBpcwotCSAqIHNldCwgYW5kIHRoYXQgdGhlIHN0cmVhbSBpcyAibGltaXRhYmxlIiAodGhhdCBpcywgcmVwb3J0cyAiZW5kIG9mCi0JICogaW5wdXQiIHJhdGhlciB0aGFuIGFsbG93IGdvaW5nIHBhc3QgbWFyaykuIFRoaXMgaXMgdmVyeSBzcGVjaWFsaXplZAotCSAqIHN0cmVhbSBpbnRyb2R1Y2VkIHRvIG92ZXJjb21lCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTY3MjExLiBTZWUgYWxzbwotCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD02ODU2NQotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0TGltaXRlZFN0cmVhbShJbnB1dFN0cmVhbSBvcmlnaW5hbCkgewotCQlpZiAob3JpZ2luYWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAob3JpZ2luYWwgaW5zdGFuY2VvZiBCdWZmZXJlZExpbWl0ZWRTdHJlYW0pCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCXJldHVybiBuZXcgQnVmZmVyZWRMaW1pdGVkU3RyZWFtKG9yaWdpbmFsLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRW5zdXJlcyB0aGF0IGFuIElucHV0U3RyZWFtIGhhcyBtYXJrL3Jlc2V0IHN1cHBvcnQuCi0JICogPC9wPgotCSAqIDxwPgotCSAqIEl0J3Mgdml0YWwgdGhhdCBhIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gPGI+bm90PC9iPiBiZSB3cmFwcGVkIGluIGFub3RoZXIKLQkgKiBCdWZmZXJlZElucHV0U3RyZWFtIGFzIGVhY2ggY2FuIHByZWVtcHRpdmVseSBjb25zdW1lIDxpPm48L2k+IGJ5dGVzCi0JICogKGUuZy4gMjA0OCkgZnJvbSB0aGUgcGFyZW50IHN0cmVhbSBiZWZvcmUgYW55IHJlcXVlc3RzIGFyZSBtYWRlLiBUaGUKLQkgKiBjYXNjYWRpbmcgZWZmZWN0IGlzIHRoYXQgdGhlIHNlY29uZC9pbm5lciBCdWZmZXJlZElucHV0U3RyZWFtIGNhbiBuZXZlcgotCSAqIHJld2luZCBpdHNlbGYgdG8gdGhlIGZpcnN0IDxpPm48L2k+IGJ5dGVzIHNpbmNlIHRoZXkgd2VyZSBhbHJlYWR5Ci0JICogY29uc3VtZWQgYnkgaXRzIHBhcmVudC4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRNYXJrU3VwcG9ydGVkU3RyZWFtKElucHV0U3RyZWFtIG9yaWdpbmFsKSB7Ci0JCWlmIChvcmlnaW5hbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChvcmlnaW5hbC5tYXJrU3VwcG9ydGVkKCkpCi0JCQlyZXR1cm4gb3JpZ2luYWw7Ci0JCUlucHV0U3RyZWFtIGJ1ZmZlcmVkID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0ob3JpZ2luYWwsIENvZGVkSU8uTUFYX0JVRl9TSVpFKTsKLQkJYnVmZmVyZWQubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlyZXR1cm4gYnVmZmVyZWQ7Ci0JfQotCi0JLyoqCi0JICogVXNlZCBmb3IgbG9nL3RyYWNlIG1lc3NhZ2VzLiBJZCBpcyBhc3N1bWVkIHRvIGJlIHNvbWUgZm9ybSBvZiBhCi0JICogZmlsZW5hbWUuIFNlZSBJTW9kZWxNYW5hZ2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ha2VTaG9ydElkKE9iamVjdCBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCWlkID0gIk5PSUQiOy8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHdob2xlID0gaWQudG9TdHJpbmcoKTsKLQkJU3RyaW5nIHBhcnQgPSB3aG9sZS5zdWJzdHJpbmcod2hvbGUubGFzdEluZGV4T2YoIi8iKSArIDEpOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiAiLi4uIiArIHBhcnQ7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCS8qKgotCSAqIFV0aWxpdGllcyBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBVdGlsaXRpZXMoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg1YWM3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbkFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25BZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKTsKLQotCS8qKgotCSAqLwotCXZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNjYTlmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTsKLQotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbk1lc3NhZ2UgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SID0gMTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPUk1BVElPTiA9IDM7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IDI7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoOwotCi0JcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKLQlwcml2YXRlIGludCBvZmZzZXQ7Ci0JcHJpdmF0ZSBpbnQgc2V2ZXJpdHk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBvZmZzZXQsIGludCBzZXZlcml0eSkgewotCQl0aGlzKG1lc3NhZ2UsIG9mZnNldCwgMCwgc2V2ZXJpdHkpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IHNldmVyaXR5KSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCQl0aGlzLnNldmVyaXR5ID0gc2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiB0aGlzLmxlbmd0aDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiB0aGlzLm1lc3NhZ2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFNldmVyaXR5KCkgewotCQlyZXR1cm4gdGhpcy5zZXZlcml0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25SZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uUmVwb3J0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEzM2Q1Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25SZXBvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUmVwb3J0ZXIgewotCi0JLyoqCi0JICovCi0Jdm9pZCByZXBvcnQoVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3RleHQvSVN0cnVjdHVyZWRQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmOWRmN2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvY29yZS90ZXh0L0lTdHJ1Y3R1cmVkUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb25pbmcgZm9yIFN0cnVjdHVyZWREb2N1bWVudHMuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRQYXJ0aXRpb25zIHsKLQotCVN0cmluZyBERUZBVUxUX1BBUlRJVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFVOS05PV05fUEFSVElUSU9OID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuVU5LTk9XTl9QQVJUSVRJT05fVFlQRSI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbHMvU3RyaW5nVXRpbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL2NvcmUvdXRpbHMvU3RyaW5nVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTYyY2VkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS9jb3JlL3V0aWxzL1N0cmluZ1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHM7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgU3RyaW5nVXRpbHMgewotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFNUEVSU1RBTkQgPSAiJiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBTVBFUlNUQU5EX0VOVElUWSA9ICImJjsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FSUklBR0VfUkVUVVJOID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENBUlJJQUdFX1JFVFVSTl9FTlRJVFkgPSAiXFxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSID0gIlxyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIENSTEYgPSAiXHJcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVJTID0gIiBcdFxuXHJcZiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URV9DSEFSID0gJ1wiJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URV9FTlRJVFkgPSAiJnF1b3Q7IjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVFVQUxfU0lHTiA9ICI9IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVRVUFMX1NJR05fRU5USVRZID0gIiYjNjE7IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGQUxTRSA9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU4gPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBHUkVBVEVSX1RIQU5fRU5USVRZID0gIiZndDsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOID0gIjwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEVTU19USEFOX0VOVElUWSA9ICImbHQ7IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExGID0gIlxuIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfRkVFRCA9ICJcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfRU5USVRZID0gIlxcbiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX0ZFRURfVEFHID0gIjxkbD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9UQUIgPSAiXHQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9UQUJfRU5USVRZID0gIlxcdCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMSU5FX1RBQl9UQUcgPSAiPGRkPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVfUVVPVEUgPSAiJyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFX0NIQVIgPSAnXCcnOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lOR0xFX1FVT1RFX0VOVElUWSA9ICImIzAzOTsiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUEFDRV9FTlRJVFkgPSAiJm5ic3A7IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVFID0gInRydWUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBBcHBlbmQgYXBwZW5kU3RyaW5nIHRvIHRoZSBlbmQgb2YgYVN0cmluZyBvbmx5IGlmIGFTdHJpbmcgZG9lcyBub3QgZW5kCi0JICogd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFwcGVuZElmTm90RW5kV2l0aChTdHJpbmcgYVN0cmluZywgU3RyaW5nIGFwcGVuZFN0cmluZykgewotCQlpZiAoKGFTdHJpbmcgIT0gbnVsbCkgJiYgKGFwcGVuZFN0cmluZyAhPSBudWxsKSkKLQkJCWlmIChhU3RyaW5nLmVuZHNXaXRoKGFwcGVuZFN0cmluZykpCi0JCQkJcmV0dXJuIGFTdHJpbmc7Ci0JCQllbHNlCi0JCQkJcmV0dXJuIGFTdHJpbmcgKyBhcHBlbmRTdHJpbmc7Ci0JCWVsc2UKLQkJCXJldHVybiBhU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgc3BhY2Utc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzQXJyYXkoU3RyaW5nIHZhbHVlKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUpOwotCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHN0b2submV4dFRva2VuKCkpOwotCQl9Ci0JCVN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCcmVha3Mgb3V0IGRlbGltLXNlcGFyYXRlZCB3b3JkcyBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLiBGb3IgZXhhbXBsZToKLQkgKiA8Y29kZT4ibm8gY29tbWVudCI8L2NvZGU+IGludG8gYW4gYXJyYXkgPGNvZGU+YVswXT0ibm8iPC9jb2RlPiBhbmQKLQkgKiA8Y29kZT5hWzFdPSAiY29tbWVudCI8L2NvZGU+LgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0FycmF5KFN0cmluZyB2YWx1ZSwgU3RyaW5nIGRlbGltKSB7Ci0JCXJldHVybiBhc0FycmF5KHZhbHVlLCBkZWxpbSwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIEJyZWFrcyBvdXQgZGVsaW0tc2VwYXJhdGVkIHdvcmRzIGludG8gYW4gYXJyYXkgb2Ygd29yZHMuIEZvciBleGFtcGxlOgotCSAqIDxjb2RlPiJubyBjb21tZW50IjwvY29kZT4gaW50byBhbiBhcnJheSA8Y29kZT5hWzBdPSJubyI8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmFbMV09ICJjb21tZW50IjwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAotCSAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygd29yZHMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGFzQXJyYXkoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVsaW0sIGJvb2xlYW4gcmV0dXJuVG9rZW5zKSB7Ci0JCUFycmF5TGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlTdHJpbmdUb2tlbml6ZXIgc3RvayA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUsIGRlbGltLCByZXR1cm5Ub2tlbnMpOwotCQl3aGlsZSAoc3Rvay5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWxpc3QuYWRkKHN0b2submV4dFRva2VuKCkpOwotCQl9Ci0JCVN0cmluZyByZXN1bHRbXSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlsaXN0LnRvQXJyYXkocmVzdWx0KTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBCcmVha3Mgb3V0IGRlbGltLXNlcGFyYXRlZCB3b3JkcyBpbnRvIGFuIGFycmF5IG9mIHdvcmRzLiBGb3IgZXhhbXBsZToKLQkgKiA8Y29kZT4iYWJjLCxkZWYiPC9jb2RlPiBpbnRvIGFuIGFycmF5IDxjb2RlPmFbMF09ImFiYyI8L2NvZGU+LAotCSAqIDxjb2RlPmFbMV09bnVsbDwvY29kZT4sIGFuZCA8Y29kZT5hWzJdPSAiZGVmIjwvY29kZT4gd2hlcmUgIiwiIGlzCi0JICogdGhlIGRlbGltLgotCSAqIAotCSAqIEBwYXJhbSB2YWx1ZQotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQKLQkgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHdvcmRzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBhc0ZpeGVkQXJyYXkoU3RyaW5nIHZhbHVlLCBTdHJpbmcgZGVsaW0pIHsKLQkJU3RyaW5nIGFycmF5W10gPSBhc0FycmF5KHZhbHVlLCBkZWxpbSwgdHJ1ZSk7Ci0JCWludCBhcnJheUxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKLQkJYm9vbGVhbiBzdHJpbmdGb3VuZCA9IGZhbHNlOwotCQlBcnJheUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyB0b2tlbiA9IGFycmF5W2ldOwotCQkJaWYgKHRva2VuLmNvbXBhcmVUbyhkZWxpbSkgPT0gMCkgewotCQkJCWlmICghc3RyaW5nRm91bmQpCi0JCQkJCWxpc3QuYWRkKG51bGwpOwotCQkJCXN0cmluZ0ZvdW5kID0gZmFsc2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsaXN0LmFkZCh0b2tlbik7Ci0JCQkJc3RyaW5nRm91bmQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCS8vIGFkZCBvbmUgbW9yZSBudWxsIGlmIGxhc3QgdG9rZW4gaXMgdGhlIGRlbGltCi0JCWlmICghc3RyaW5nRm91bmQpCi0JCQlsaXN0LmFkZChudWxsKTsKLQotCQlTdHJpbmcgcmVzdWx0W10gPSBuZXcgU3RyaW5nW2xpc3Quc2l6ZSgpXTsKLQkJbGlzdC50b0FycmF5KHJlc3VsdCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY2hvcChTdHJpbmcgc291cmNlKSB7Ci0JCXJldHVybiBjaG9wKHNvdXJjZSwgIi8iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNob3AoU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGRlbGltaXRlcikgewotCQlyZXR1cm4gc291cmNlLnN1YnN0cmluZygwLCBzb3VyY2UubGFzdEluZGV4T2YoZGVsaW1pdGVyKSk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZ1tdIGFycmF5T2ZTdHJpbmdzLCBTdHJpbmcgbmVlZGxlLCBib29sZWFuIGNhc2VTZW5zaXRpdmUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5lZWRsZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoYXJyYXlPZlN0cmluZ3MgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoY2FzZVNlbnNpdGl2ZSkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheU9mU3RyaW5ncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChuZWVkbGUuZXF1YWxzKGFycmF5T2ZTdHJpbmdzW2ldKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFycmF5T2ZTdHJpbmdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG5lZWRsZS5lcXVhbHNJZ25vcmVDYXNlKGFycmF5T2ZTdHJpbmdzW2ldKSkgewotCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gY29udGFpbnNMZXR0ZXJzKFN0cmluZyBmdWxsVmFsdWUpIHsKLQotCQlpZiAoZnVsbFZhbHVlID09IG51bGwgfHwgZnVsbFZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJY2hhcltdIGNoYXJzID0gZnVsbFZhbHVlLnRvQ2hhckFycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZnVsbFZhbHVlLmxlbmd0aCgpOyBpKyspCi0JCQlpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyKGNoYXJzW2ldKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZykgIT0gLTE7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydExpbmVEZWxpbWl0ZXJzKFN0cmluZyBhbGxUZXh0LCBTdHJpbmcgbGluZURlbGltaXRlclRvVXNlKSB7Ci0JCUlEb2N1bWVudCB0ZW1wRG9jID0gbmV3IERvY3VtZW50KGFsbFRleHQpOwotCi0JCWlmIChsaW5lRGVsaW1pdGVyVG9Vc2UgPT0gbnVsbCkKLQkJCWxpbmVEZWxpbWl0ZXJUb1VzZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVN0cmluZyBuZXdUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxpbmVDb3VudCA9IHRlbXBEb2MuZ2V0TnVtYmVyT2ZMaW5lcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpbmVDb3VudDsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCW9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbiBsaW5lSW5mbyA9IHRlbXBEb2MuZ2V0TGluZUluZm9ybWF0aW9uKGkpOwotCQkJCWludCBsaW5lU3RhcnRPZmZzZXQgPSBsaW5lSW5mby5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgbGluZUxlbmd0aCA9IGxpbmVJbmZvLmdldExlbmd0aCgpOwotCQkJCWludCBsaW5lRW5kT2Zmc2V0ID0gbGluZVN0YXJ0T2Zmc2V0ICsgbGluZUxlbmd0aDsKLQkJCQluZXdUZXh0ICs9IGFsbFRleHQuc3Vic3RyaW5nKGxpbmVTdGFydE9mZnNldCwgbGluZUVuZE9mZnNldCk7Ci0KLQkJCQlpZiAoKGkgPCBsaW5lQ291bnQgLSAxKSAmJiAodGVtcERvYy5nZXRMaW5lRGVsaW1pdGVyKGkpICE9IG51bGwpKQotCQkJCQluZXdUZXh0ICs9IGxpbmVEZWxpbWl0ZXJUb1VzZTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIHNwZWNpYWwgSFRNTCBjaGFyYWN0ZXJzIHdpdGggdGhlIGFwcHJvcHJpYXRlCi0JICogSFRNTCBlbnRpdHkgZXF1aXZhbGVudC4gV0FSTklORyBvbmx5IHVzZSB0aGlzIG1ldGhvZCBmb3Igc3RyaW5ncyB0aGF0Ci0JICogZG9udCBhbHJlYWR5IGhhdmUgSFRNTC1zcGVjaWZpYyBpdGVtcyBzdWNoIGFzIHRhZ3MgYW5kIGVudGl0aWVzLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgU3RyaW5nIHRvIGNvbnZlcnQKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyB0aGUgY29udmVydGVkIHN0cmluZwotCSAqIEBzZWUgSFRNTFByaW50ZXIjY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX0ZFRUQsIExJTkVfRkVFRF9UQUcpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMSU5FX1RBQiwgTElORV9UQUJfVEFHKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU0lOR0xFX1FVT1RFLCBTSU5HTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgRE9VQkxFX1FVT1RFLCBET1VCTEVfUVVPVEVfRU5USVRZKTsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgU1BBQ0UgKyBTUEFDRSwgU1BBQ0VfRU5USVRZICsgU1BBQ0VfRU5USVRZKTsgLy8gcmVwbGFjaW5nCi0JCS8vIGV2ZXJ5Ci0JCS8vIHNwYWNlCi0JCS8vIHdvdWxkCi0JCS8vIGJlCi0JCS8vIHRvbwotCQkvLyBtdWNoCi0JCXJldHVybiBjb250ZW50OwotCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSBmb3JtIHRoYXQgd2lsbCBub3QgY29uZmxpY3Qgd2l0aCBzYXZpbmcgaXQKLQkgKiBpbnRvIGFuIElOSSBmaWxlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlKFN0cmluZyBub3JtYWxTdHJpbmcpIHsKLQkJaWYgKG5vcm1hbFN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBlc2NhcGVkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5vcm1hbFN0cmluZywgRVFVQUxfU0lHTiArIExJTkVfRkVFRCArIENBUlJJQUdFX1JFVFVSTiArIExJTkVfVEFCLCB0cnVlKTsKLQkJU3RyaW5nIGNodW5rID0gbnVsbDsKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJY2h1bmsgPSB0b2tlci5uZXh0VG9rZW4oKTsKLQkJCWlmIChjaHVuay5lcXVhbHMoRVFVQUxfU0lHTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChFUVVBTF9TSUdOX0VOVElUWSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChjaHVuay5lcXVhbHMoTElORV9GRUVEKSkgewotCQkJCWVzY2FwZWRCdWZmZXIuYXBwZW5kKExJTkVfRkVFRF9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSBpZiAoY2h1bmsuZXF1YWxzKENBUlJJQUdFX1JFVFVSTikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChDQVJSSUFHRV9SRVRVUk5fRU5USVRZKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGNodW5rLmVxdWFscyhMSU5FX1RBQikpIHsKLQkJCQllc2NhcGVkQnVmZmVyLmFwcGVuZChMSU5FX1RBQl9FTlRJVFkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZXNjYXBlZEJ1ZmZlci5hcHBlbmQoY2h1bmspOwotCQkJfQotCQl9Ci0JCXJldHVybiBlc2NhcGVkQnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZ2l2ZW4gdGV4dCB3aXRob3V0IGEgdHJhaWxpbmcgZGVsaW1pdGVyCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZmlyc3RMaW5lT2YoU3RyaW5nIHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0Lmxlbmd0aCgpIDwgMSkgewotCQkJcmV0dXJuIHRleHQ7Ci0JCX0KLQkJSURvY3VtZW50IGRvYyA9IG5ldyBEb2N1bWVudCh0ZXh0KTsKLQkJdHJ5IHsKLQkJCWludCBsaW5lTnVtYmVyID0gZG9jLmdldExpbmVPZk9mZnNldCgwKTsKLQkJCUlSZWdpb24gbGluZSA9IGRvYy5nZXRMaW5lSW5mb3JtYXRpb24obGluZU51bWJlcik7Ci0JCQlyZXR1cm4gZG9jLmdldChsaW5lLmdldE9mZnNldCgpLCBsaW5lLmdldExlbmd0aCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0JCXJldHVybiB0ZXh0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKGFTdHJpbmcsIGFTdHJpbmcubGVuZ3RoKCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgaW50IGluZGV4T2ZMYXN0TGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZywgaW50IG9mZnNldCkgewotCQlpbnQgaW5kZXggPSAtMTsKLQotCQlpZiAoYVN0cmluZyAhPSBudWxsICYmIGFTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpbmRleCA9IGFTdHJpbmcubGFzdEluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihDUiwgb2Zmc2V0KTsKLQkJCQlpZiAoaW5kZXggPT0gLTEpCi0JCQkJCWluZGV4ID0gYVN0cmluZy5sYXN0SW5kZXhPZihMRiwgb2Zmc2V0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBpbmRleDsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBpbmRleE9mTGluZURlbGltaXRlcihTdHJpbmcgYVN0cmluZykgewotCQlyZXR1cm4gaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZkxpbmVEZWxpbWl0ZXIoU3RyaW5nIGFTdHJpbmcsIGludCBvZmZzZXQpIHsKLQkJaW50IGluZGV4ID0gLTE7Ci0KLQkJaWYgKGFTdHJpbmcgIT0gbnVsbCAmJiBhU3RyaW5nLmxlbmd0aCgpID4gMCkgewotCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoQ1JMRiwgb2Zmc2V0KTsKLQkJCWlmIChpbmRleCA9PSAtMSkgewotCQkJCWluZGV4ID0gYVN0cmluZy5pbmRleE9mKENSLCBvZmZzZXQpOwotCQkJCWlmIChpbmRleCA9PSAtMSkKLQkJCQkJaW5kZXggPSBhU3RyaW5nLmluZGV4T2YoTEYsIG9mZnNldCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nKSB7Ci0JCXJldHVybiBpbmRleE9mTm9uYmxhbmsoYVN0cmluZywgMCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBpbnQgaW5kZXhPZk5vbmJsYW5rKFN0cmluZyBhU3RyaW5nLCBpbnQgb2Zmc2V0KSB7Ci0JCWludCBpbmRleCA9IC0xOwotCi0JCWlmIChhU3RyaW5nICE9IG51bGwgJiYgYVN0cmluZy5sZW5ndGgoKSA+IDApIHsKLQkJCWZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBhU3RyaW5nLmxlbmd0aCgpOyBpKyspIHsKLQkJCQlpZiAoREVMSU1JVEVSUy5pbmRleE9mKGFTdHJpbmcuc3Vic3RyaW5nKGksIGkgKyAxKSkgPT0gLTEpIHsKLQkJCQkJaW5kZXggPSBpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0JLyoqCi0JICogSW5zZXJ0IGluc2VydFN0cmluZyB0byB0aGUgYmVnaW5uaW5nIG9mIGFTdHJpbmcgb25seSBpZiBhU3RyaW5nIGRvZXMKLQkgKiBub3Qgc3RhcnQgd2l0aCB0aGUgaW5zZXJ0U3RyaW5nLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGluc2VydElmTm90U3RhcnRXaXRoKFN0cmluZyBhU3RyaW5nLCBTdHJpbmcgaW5zZXJ0U3RyaW5nKSB7Ci0JCWlmICgoYVN0cmluZyAhPSBudWxsKSAmJiAoaW5zZXJ0U3RyaW5nICE9IG51bGwpKQotCQkJaWYgKGFTdHJpbmcuc3RhcnRzV2l0aChpbnNlcnRTdHJpbmcpKQotCQkJCXJldHVybiBhU3RyaW5nOwotCQkJZWxzZQotCQkJCXJldHVybiBpbnNlcnRTdHJpbmcgKyBhU3RyaW5nOwotCQllbHNlCi0JCQlyZXR1cm4gYVN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNRdW90ZWQoU3RyaW5nIHN0cmluZykgewotCQlpZiAoKHN0cmluZyA9PSBudWxsKSB8fCAoc3RyaW5nLmxlbmd0aCgpIDwgMikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJaW50IGxhc3RJbmRleCA9IHN0cmluZy5sZW5ndGgoKSAtIDE7Ci0JCWNoYXIgZmlyc3RDaGFyID0gc3RyaW5nLmNoYXJBdCgwKTsKLQkJY2hhciBsYXN0Q2hhciA9IHN0cmluZy5jaGFyQXQobGFzdEluZGV4KTsKLQotCQlyZXR1cm4gKCgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFX0NIQVIpKSB8fCAoKGZpcnN0Q2hhciA9PSBET1VCTEVfUVVPVEVfQ0hBUikgJiYgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkpOwotCX0KLQotCS8qKgotCSAqIFVuaXQgdGVzdHMuCi0JICogCi0JICogQHBhcmFtIGFyZ3MKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmdbXQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLQkJLy8gdGVzdFBhc3RlKCk7Ci0JCXRlc3RTdHJpcE5vbkxldHRlckRpZ2l0cygpOwotCX0KLQotCS8qCi0JICogUmV0dXJucyB0aGUgbWVyZ2VkIGZvcm0gb2YgYm90aCBzdHJpbmdzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbWVyZ2UoU3RyaW5nIG5ld1N0YXJ0LCBTdHJpbmcgbmV3RW5kKSB7Ci0JCVN0cmluZ1tdIHJlZ2lvbnMgPSBvdmVybGFwUmVnaW9ucyhuZXdTdGFydCwgbmV3RW5kKTsKLQkJcmV0dXJuIHJlZ2lvbnNbMF0gKyByZWdpb25zWzFdICsgcmVnaW9uc1syXTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGludCBvY2N1cnJlbmNlc09mKFN0cmluZyBzZWFyY2hTdHJpbmcsIGNoYXIgdGFyZ2V0Q2hhcikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaW50IGxlbiA9IHNlYXJjaFN0cmluZy5sZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotCQkJaWYgKHRhcmdldENoYXIgPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKSkKLQkJCQlyZXN1bHQrKzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZ1tdCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGVuZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqIAotCSAqIFJldHVybnMgYSAzIFN0cmluZyBhcnJheSBjb250YWluaW5nIHVuaXF1ZSB0ZXh0IGZyb20gdGhlIHN0YXJ0LAotCSAqIGR1cGxpY2F0ZWQgdGV4dCB0aGF0IG92ZXJsYXBzIHRoZSBzdGFydCBhbmQgZW5kLCBhbmQgdGhlIHVuaXF1ZSB0ZXh0Ci0JICogZnJvbSB0aGUgZW5kLgotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZ1tdIG92ZXJsYXBSZWdpb25zKFN0cmluZyBzdGFydCwgU3RyaW5nIGVuZCkgewotCQlTdHJpbmdbXSByZXN1bHRzID0gbnVsbDsKLQkJaWYgKHN0YXJ0ICE9IG51bGwgJiYgZW5kID09IG51bGwpIHsKLQkJCXJlc3VsdHMgPSBuZXcgU3RyaW5nW117c3RhcnQsICIiLCAiIn07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsIGVuZH07IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgPT0gbnVsbCAmJiBlbmQgPT0gbnVsbCkgewotCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAoc3RhcnQgIT0gbnVsbCAmJiBlbmQgIT0gbnVsbCkgewotCi0JCQlpbnQgc3RhcnRMZW5ndGggPSBzdGFydC5sZW5ndGgoKTsKLQkJCWludCBlbmRMZW5ndGggPSBlbmQubGVuZ3RoKCk7Ci0KLQkJCWlmIChzdGFydExlbmd0aCA9PSAwIHx8IGVuZExlbmd0aCA9PSAwKSB7Ci0JCQkJcmVzdWx0cyA9IG5ldyBTdHJpbmdbXXsiIiwgIiIsICIifTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHRzID0gbmV3IFN0cmluZ1szXTsKLQkJCQlTdHJpbmcgdGVzdFN0YXJ0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgdGVzdEVuZCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaW50IG1lcmdlTGVuZ3RoID0gTWF0aC5taW4oc3RhcnRMZW5ndGgsIGVuZExlbmd0aCk7Ci0JCQkJYm9vbGVhbiBmaW5pc2hlZCA9IGZhbHNlOwotCQkJCXdoaWxlIChtZXJnZUxlbmd0aCA+IDAgJiYgIWZpbmlzaGVkKSB7Ci0JCQkJCXRlc3RTdGFydCA9IHN0YXJ0LnN1YnN0cmluZyhzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJdGVzdEVuZCA9IGVuZC5zdWJzdHJpbmcoMCwgbWVyZ2VMZW5ndGgpOwotCQkJCQkvLyBjYXNlIHNlbnNpdGl2ZQotCQkJCQlpZiAodGVzdFN0YXJ0LmVxdWFscyh0ZXN0RW5kKSkgewotCQkJCQkJZmluaXNoZWQgPSB0cnVlOwotCQkJCQkJcmVzdWx0c1swXSA9IHN0YXJ0LnN1YnN0cmluZygwLCBzdGFydExlbmd0aCAtIG1lcmdlTGVuZ3RoKTsKLQkJCQkJCXJlc3VsdHNbMV0gPSBzdGFydC5zdWJzdHJpbmcoc3RhcnRMZW5ndGggLSBtZXJnZUxlbmd0aCk7Ci0JCQkJCQlyZXN1bHRzWzJdID0gZW5kLnN1YnN0cmluZyhtZXJnZUxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJbWVyZ2VMZW5ndGgtLTsKLQkJCQl9Ci0JCQkJaWYgKCFmaW5pc2hlZCkgewotCQkJCQlyZXN1bHRzWzBdID0gc3RhcnQ7Ci0JCQkJCXJlc3VsdHNbMV0gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXN1bHRzWzJdID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQkvKioKLQkgKiBQYWNrcyBhbiBhcnJheSBvZiBTdHJpbmdzIGludG8gYSBzaW5nbGUgY29tbWEgZGVsaW1pdGVkIFN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gc3RyaW5ncwotCSAqIEByZXR1cm4KLQkgKiBAdG9kbyBHZW5lcmF0ZWQgY29tbWVudAotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHBhY2soU3RyaW5nW10gc3RyaW5ncykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMucmVwbGFjZShzdHJpbmdzW2ldLCAiLCIsICImY29tbWE7IikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCWlmIChpIDwgc3RyaW5ncy5sZW5ndGggLSAxKQotCQkJCWJ1Zi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKgotCSAqIFBhc3RlcyB0aGUgbmV3IHRleHQgaW50byB0aGUgb2xkIGF0IHRoZSBzdGFydCBwb3NpdGlvbiwgcmVwbGFjaW5nIHRleHQKLQkgKiBpbXBsaWVkIGJ5IGxlbmd0aC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYXN0ZShTdHJpbmcgb2xkVGV4dCwgU3RyaW5nIG5ld1RleHQsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgc3RhcnRJbmRleCA9IHN0YXJ0OwotCQlpbnQgZW5kSW5kZXggPSBzdGFydCArIGxlbmd0aDsKLQkJaWYgKHN0YXJ0SW5kZXggPiBvbGRUZXh0Lmxlbmd0aCgpKSB7Ci0JCQlzdGFydEluZGV4ID0gb2xkVGV4dC5sZW5ndGgoKTsKLQkJfQotCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRJbmRleCkpOwotCQkvLyBudWxsIG9yIGVtcHR5IG5ldyB0ZXh0IGFjY29tcGxpY2hlcyBhIGRlbGV0ZQotCQlpZiAobmV3VGV4dCAhPSBudWxsKSB7Ci0JCQlzYi5hcHBlbmQobmV3VGV4dCk7Ci0JCX0KLQkJaWYgKGVuZEluZGV4IDwgb2xkVGV4dC5sZW5ndGgoKSkgewotCi0JCQlzYi5hcHBlbmQob2xkVGV4dC5zdWJzdHJpbmcoZW5kSW5kZXgpKTsKLQkJfQotCQlyZXN1bHQgPSBzYi50b1N0cmluZygpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgbWF0Y2hpbmcgbGl0ZXJhbCBwb3J0aW9ucyBvZiBhIHN0cmluZyB3aXRoIGFub3RoZXIgc3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgcmVwbGFjZShTdHJpbmcgYVN0cmluZywgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCkgewotCQlpZiAoYVN0cmluZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBub3JtYWxTdHJpbmcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbGVuZ3RoID0gYVN0cmluZy5sZW5ndGgoKTsKLQkJaW50IHBvc2l0aW9uID0gMDsKLQkJaW50IHByZXZpb3VzID0gMDsKLQkJaW50IHNwYWNlciA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJd2hpbGUgKHBvc2l0aW9uICsgc3BhY2VyIC0gMSA8IGxlbmd0aCAmJiBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwb3NpdGlvbikgPiAtMSkgewotCQkJcG9zaXRpb24gPSBhU3RyaW5nLmluZGV4T2Yoc291cmNlLCBwcmV2aW91cyk7Ci0JCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwcmV2aW91cywgcG9zaXRpb24pICsgdGFyZ2V0OwotCQkJcG9zaXRpb24gKz0gc3BhY2VyOwotCQkJcHJldmlvdXMgPSBwb3NpdGlvbjsKLQkJfQotCQlub3JtYWxTdHJpbmcgPSBub3JtYWxTdHJpbmcgKyBhU3RyaW5nLnN1YnN0cmluZyhwb3NpdGlvbiwgYVN0cmluZy5sZW5ndGgoKSk7Ci0KLQkJcmV0dXJuIG5vcm1hbFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiBSZXN0b3JlIHRoZSBlbnRpdHkgcmVmZXJlbmNlcyBmb3IgbWFya3VwIGRlbGltaXRlcnMgaW4gdGV4dCB3aGVyZSB0aGV5Ci0JICogaGF2ZSBiZWVuIHJlcGxhY2VkIGJ5IHRoZSBwcm9wZXIgVW5pY29kZSB2YWx1ZXMgdGhyb3VnaCBhIERPTSB0ZXh0Ci0JICogcGFyc2VyLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlc3RvcmVNYXJrZXJzKFN0cmluZyB0ZXh0KSB7Ci0JCVN0cmluZyBjb250ZW50ID0gdGV4dDsKLQkJY29udGVudCA9IHJlcGxhY2UoY29udGVudCwgQU1QRVJTVEFORCwgQU1QRVJTVEFORF9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBMRVNTX1RIQU4sIExFU1NfVEhBTl9FTlRJVFkpOwotCQljb250ZW50ID0gcmVwbGFjZShjb250ZW50LCBHUkVBVEVSX1RIQU4sIEdSRUFURVJfVEhBTl9FTlRJVFkpOwotCQlyZXR1cm4gY29udGVudDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGV4dHJhIHdoaXRlc3BhY2UgY2hhcmFjdGVycyBhbmQgcXVvdGVzCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXAoU3RyaW5nIHF1b3RlZFN0cmluZykgewotCQlpZiAocXVvdGVkU3RyaW5nID09IG51bGwgfHwgcXVvdGVkU3RyaW5nLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gcXVvdGVkU3RyaW5nOwotCQlTdHJpbmcgdHJpbW1lZCA9IHF1b3RlZFN0cmluZy50cmltKCk7Ci0JCWlmICh0cmltbWVkLmxlbmd0aCgpIDwgMikKLQkJCXJldHVybiBxdW90ZWRTdHJpbmc7Ci0KLQkJY2hhciBmaXJzdCA9IHRyaW1tZWQuY2hhckF0KDApOwotCQljaGFyIG5leHRUb0xhc3QgPSB0cmltbWVkLmNoYXJBdCh0cmltbWVkLmxlbmd0aCgpIC0gMik7Ci0JCWNoYXIgbGFzdCA9IHRyaW1tZWQuY2hhckF0KHRyaW1tZWQubGVuZ3RoKCkgLSAxKTsKLQotCQlpZiAoKGZpcnN0ID09ICdcIicgJiYgbGFzdCA9PSAnXCInICYmIG5leHRUb0xhc3QgIT0gJ1xcJykgfHwgKGZpcnN0ID09ICdcJycgJiYgbGFzdCA9PSAnXCcnICYmIG5leHRUb0xhc3QgIT0gJ1xcJykpIHsKLQkJCXJldHVybiB0cmltbWVkLnN1YnN0cmluZygxLCB0cmltbWVkLmxlbmd0aCgpIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIHRyaW1tZWQ7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc3RyaXBzIGFueXRoaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nIHRoYXQKLQkgKiBpcyBub3QgYSBsZXR0ZXIgb3IgZGlnaXQuIEl0IGlzIHVzZWQgYnkgc29tZSBlbmNvZGluZyBkZXRlY3RvcnMgdG8gY29tZQotCSAqIHVwIHdpdGggdGhlIGVuY29kaW5nIG5hbWUgZnJvbSBpbGxmb3JtZWQgaW5wdXQgKGUuZyBpbiA8P3htbAotCSAqIGVuY29kaW5nPSJhYmM/PiAtLSB3aGVyZSBmaW5hbCBxdW90ZSBpcyBsZWZ0IG9mZiwgdGhlICc+JyBpcyByZXR1cm5lZAotCSAqIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGF0dHJpYnV0ZSB2YWx1ZSAnYWJjJykuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBOb25MZXR0ZXJEaWdpdHMoU3RyaW5nIGZ1bGxWYWx1ZSkgewotCQlpZiAoZnVsbFZhbHVlID09IG51bGwgfHwgZnVsbFZhbHVlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZnVsbFZhbHVlOwotCQlpbnQgZnVsbFZhbHVlTGVuZ3RoID0gZnVsbFZhbHVlLmxlbmd0aCgpOwotCQlpbnQgZmlyc3RQb3MgPSAwOwotCQl3aGlsZSAoZmlyc3RQb3MgPCBmdWxsVmFsdWVMZW5ndGggJiYgIUNoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoZnVsbFZhbHVlLmNoYXJBdChmaXJzdFBvcykpKSB7Ci0JCQlmaXJzdFBvcysrOwotCQl9Ci0JCWludCBsYXN0UG9zID0gZnVsbFZhbHVlTGVuZ3RoIC0gMTsKLQkJd2hpbGUgKGxhc3RQb3MgPiBmaXJzdFBvcyAmJiAhQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChmdWxsVmFsdWUuY2hhckF0KGxhc3RQb3MpKSkgewotCQkJbGFzdFBvcy0tOwotCQl9Ci0JCVN0cmluZyByZXN1bHQgPSBmdWxsVmFsdWU7Ci0JCWlmIChmaXJzdFBvcyAhPSAwIHx8IGxhc3RQb3MgIT0gZnVsbFZhbHVlTGVuZ3RoKSB7Ci0JCQlyZXN1bHQgPSBmdWxsVmFsdWUuc3Vic3RyaW5nKGZpcnN0UG9zLCBsYXN0UG9zICsgMSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTaW1pbGFyIHRvIHN0cmlwLCBleGNlcHQgcXVvdGVzIGRvbid0IG5lZWQgdG8gbWF0Y2ggc3VjaCBhcyAiVVRGJyBpcwotCSAqIHN0aWxsIHN0cmlwcGVkIG9mIGJvdGggcXVvdGVzLiAoUGx1cywgdGhpcyBvbmUgZG9lcyBub3QgZGV0ZWN0IGVzY2FwZWQKLQkgKiBxdW90ZXMpCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXMoU3RyaW5nIHF1b3RlZFZhbHVlKSB7Ci0JCWlmIChxdW90ZWRWYWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIG5vcm1hbGx5IHdpbGwgbmV2ZXIgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIGJsYW5rcywKLQkJLy8gYnV0IGlmIGl0IGRvZXMsIHdlJ2xsIGRvIGxlbmllbnQgaW50ZXJwcmV0YXRpb24KLQkJcmV0dXJuIHN0cmlwUXVvdGVzTGVhdmVJbnNpZGVTcGFjZShxdW90ZWRWYWx1ZSkudHJpbSgpOwotCX0KLQotCS8qKgotCSAqIExpa2Ugc3RyaXAgcXVvdGVzLCBleGNlcHQgbGVhdmVzIHRoZSBzdGFydCBhbmQgZW5kIHNwYWNlIGluc2lkZSB0aGUKLQkgKiBxdW90ZXMKLQkgKiAKLQkgKiBAcGFyYW0gcXVvdGVkVmFsdWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaXBRdW90ZXNMZWF2ZUluc2lkZVNwYWNlKFN0cmluZyBxdW90ZWRWYWx1ZSkgewotCQlpZiAocXVvdGVkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBub21hbGx5IHdpbGwgbmV2ZXIgaGF2ZSBsZWFkaW5nIG9yIHRyYWlsaW5nIGJsYW5rcyAuLi4gYnV0IGp1c3QgaW4KLQkJLy8gY2FzZS4KLQkJU3RyaW5nIHJlc3VsdCA9IHF1b3RlZFZhbHVlLnRyaW0oKTsKLQkJaW50IGxlbiA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJaWYgKGxlbiA+IDApIHsKLQkJCWNoYXIgZmlyc3RDaGFyID0gcmVzdWx0LmNoYXJBdCgwKTsKLQkJCWlmICgoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URV9DSEFSKSB8fCAoZmlyc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkgewotCQkJCXJlc3VsdCA9IHJlc3VsdC5zdWJzdHJpbmcoMSwgbGVuKTsKLQkJCX0KLQkJCWxlbiA9IHJlc3VsdC5sZW5ndGgoKTsKLQkJCWlmIChsZW4gPiAwKSB7Ci0JCQkJY2hhciBsYXN0Q2hhciA9IHJlc3VsdC5jaGFyQXQobGVuIC0gMSk7Ci0JCQkJaWYgKChsYXN0Q2hhciA9PSBTSU5HTEVfUVVPVEVfQ0hBUikgfHwgKGxhc3RDaGFyID09IERPVUJMRV9RVU9URV9DSEFSKSkgewotCQkJCQlyZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKDAsIGxlbiAtIDEpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0ZXN0UGFzdGUoKSB7Ci0JCVN0cmluZyB0ZXN0U3RyaW5nID0gIlRoZSBxdWljayBicm93biBmb3ggLi4uIjsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgbnVsbCwgNCwgNSkpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgbnVsbCwgNCwgNikpOwotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgIiIsIDQsIDYpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgImZhc3QiLCA0LCA2KSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKHRlc3RTdHJpbmcsICJmYXN0ICIsIDQsIDYpKTsgLy8kTk9OLU5MUy0xJAotCQlTeXN0ZW0ub3V0LnByaW50bG4ocGFzdGUodGVzdFN0cmluZywgIkJ1dCAiLCAwLCAwKSk7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHBhc3RlKCIiLCAiYnVycCIsIDQsIDYpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFN0cmlwTm9uTGV0dGVyRGlnaXRzKCkgewotCQlTdHJpbmcgdGVzdFN0cmluZyA9ICJhYmMiOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiXCJhYmNcIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiXCJhYi1jMT8iOyAvLyROT04tTkxTLTEkCi0JCVN5c3RlbS5vdXQucHJpbnRsbih0ZXN0U3RyaW5nICsgIiAtLT4iICsgc3RyaXBOb25MZXR0ZXJEaWdpdHModGVzdFN0cmluZykgKyAiPC0tIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl0ZXN0U3RyaW5nID0gIisrKyI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiYWJjPSI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXRlc3RTdHJpbmcgPSAiYWJjICI7IC8vJE5PTi1OTFMtMSQKLQkJU3lzdGVtLm91dC5wcmludGxuKHRlc3RTdHJpbmcgKyAiIC0tPiIgKyBzdHJpcE5vbkxldHRlckRpZ2l0cyh0ZXN0U3RyaW5nKSArICI8LS0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhib29sZWFuIGJvb2xlYW5WYWx1ZSkgewotCQlpZiAoYm9vbGVhblZhbHVlKQotCQkJcmV0dXJuIFRSVUU7Ci0JCWVsc2UKLQkJCXJldHVybiBGQUxTRTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgImVzY2FwZWQiIGNoYXJzIGZyb20gYSBzdHJpbmcuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgdW5lc2NhcGUoU3RyaW5nIGFTdHJpbmcpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbm9ybWFsU3RyaW5nID0gcmVwbGFjZShhU3RyaW5nLCBFUVVBTF9TSUdOX0VOVElUWSwgRVFVQUxfU0lHTik7Ci0JCW5vcm1hbFN0cmluZyA9IHJlcGxhY2Uobm9ybWFsU3RyaW5nLCBMSU5FX0ZFRURfRU5USVRZLCBMSU5FX0ZFRUQpOwotCQlub3JtYWxTdHJpbmcgPSByZXBsYWNlKG5vcm1hbFN0cmluZywgQ0FSUklBR0VfUkVUVVJOX0VOVElUWSwgQ0FSUklBR0VfUkVUVVJOKTsKLQkJbm9ybWFsU3RyaW5nID0gcmVwbGFjZShub3JtYWxTdHJpbmcsIExJTkVfVEFCX0VOVElUWSwgTElORV9UQUIpOwotCQlyZXR1cm4gbm9ybWFsU3RyaW5nOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuaXF1ZUVuZE9mKFN0cmluZyBuZXdTdGFydCwgU3RyaW5nIG5ld0VuZCkgewotCQlTdHJpbmdbXSByZWdpb25zID0gb3ZlcmxhcFJlZ2lvbnMobmV3U3RhcnQsIG5ld0VuZCk7Ci0JCXJldHVybiByZWdpb25zWzJdOwotCX0KLQotCS8qKgotCSAqIFVucGFja3MgYSBjb21tYSBkZWxpbWl0ZWQgU3RyaW5nIGludG8gYW4gYXJyYXkgb2YgU3RyaW5ncwotCSAqIAotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqIEB0b2RvIEdlbmVyYXRlZCBjb21tZW50Ci0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSB1bnBhY2soU3RyaW5nIHMpIHsKLQkJaWYgKHMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlTdHJpbmdUb2tlbml6ZXIgdG9rZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHMsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAodG9rZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkvLyBzaW5jZSB3ZSdyZSBzZXBhcmF0aW5nIHRoZSB2YWx1ZXMgd2l0aCAnLCcsIGVzY2FwZSAnLCcgaW4gdGhlCi0JCQkvLyB2YWx1ZXMKLQkJCWxpc3QuYWRkKFN0cmluZ1V0aWxzLnJlcGxhY2UodG9rZXIubmV4dFRva2VuKCksICImY29tbWE7IiwgIiwiKS50cmltKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlyZXR1cm4gKFN0cmluZ1tdKSBsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogU3RyaW5nVXRpbHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFN0cmluZ1V0aWxzKCkgewotCQlzdXBlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFhZTlkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYy8iIC8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9InNyYyIKLSAgICAgICAgcGF0aD0ic3JjLWV4dGVuc2lvbnMvIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYy1lbmNvZGluZyIgLz4KLSAgICA8Y2xhc3NwYXRoZW50cnkKLSAgICAgICAga2luZD0ic3JjIgotICAgICAgICBwYXRoPSJzcmMtdGFza3RhZ3MiIC8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9ImNvbiIKLSAgICAgICAgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiCi0gICAgICAgIGtpbmQ9ImNvbiI+Ci0gICAgICAgIDxhY2Nlc3NydWxlcz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlCi0gICAgICAgICAgICAgICAga2luZD0iYWNjZXNzaWJsZSIKLSAgICAgICAgICAgICAgICBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiIC8+Ci0gICAgICAgIDwvYWNjZXNzcnVsZXM+Ci0gICAgPC9jbGFzc3BhdGhlbnRyeT4KLSAgICA8Y2xhc3NwYXRoZW50cnkKLSAgICAgICAga2luZD0ib3V0cHV0IgotICAgICAgICBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmJjNDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbgotZWRpdG9yLmphcgotYnVpbGQueG1sCi10ZW1wLmZvbGRlcgotb3JnLmVjbGlwc2Uud3N0LnNzZS51aV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ub3B0aW9ucyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ub3B0aW9ucwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFkZjViZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnPXRydWUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvdHJhY2VmaWx0ZXI9Ci0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5BY3Rpb25Db250cmlidXRlci5fc2hvd0RlYnVnU3RhdHVzCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2FjdGlvbmNvbnRyaWJ1dG9yL2RlYnVnc3RhdHVzZmllbGRzPWZhbHNlCi0KLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLlRyYW5zZmVyQnVpbGRlci5kZWJ1Z1RpbWUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvdHJhbnNmZXJidWlsZGVyL3RpbWU9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGNvbmZpZ3VyYXRpb25idWlsZGVyPWZhbHNlCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5kZWJ1Z1RpbWUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRjb25maWd1cmF0aW9uYnVpbGRlci90aW1lPWZhbHNlCi0KLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGVkaXRvcmFjdGlvbmJ1aWxkZXI9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5kZWJ1Z1JlYWRUaW1lCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9yZWFkdGltZT1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmRlYnVnQ29udHJpYnV0ZVRpbWUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2NvbnRyaWJ1dGV0aW1lPWZhbHNlCi0KLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5kZWJ1Z01lbnUKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2RlYnVnbWVudT1mYWxzZQotCi0jb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmRlYnVnUG9wdXAKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2RlYnVncG9wdXA9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLkV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5kZWJ1Z1Rvb2xiYXIKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2RlYnVndG9vbGJhcj1mYWxzZQotCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLkZpbGVNb2RlbFByb3ZpZGVyLmRlYnVnT3BlcmF0aW9ucwotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9maWxlbW9kZWxwcm92aWRlci9vcGVyYXRpb25zPWZhbHNlCi0KLSNvcmcuZWNsaXBzZS53c3Quc3NlLnVpLkZpbGVNb2RlbFByb3ZpZGVyLmRlYnVnTGlmZWN5Y2xlbGlzdGVuZXIKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZmlsZW1vZGVscHJvdmlkZXIvbGlmZWN5Y2xlbGlzdGVuZXI9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuRmlsZU1vZGVsUHJvdmlkZXIuZGVidWdNb2RlbFN0YXRlbGlzdGVuZXIKLW9yZy5lY2xpcHNlLndzdC5zc2UudWkvZmlsZW1vZGVscHJvdmlkZXIvbW9kZWxzdGF0ZWxpc3RlbmVyPWZhbHNlCi0KLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RvcmFnZU1vZGVsUHJvdmlkZXIuZGVidWdPcGVyYXRpb25zCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0b3JhZ2Vtb2RlbHByb3ZpZGVyL29wZXJhdGlvbnM9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RvcmFnZU1vZGVsUHJvdmlkZXIuZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcgotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zdG9yYWdlbW9kZWxwcm92aWRlci9lbGVtZW50c3RhdGVsaXN0ZW5lcj1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2NvbnRlbnRPdXRsaW5lPWZhbHNlCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Byb3BlcnR5U2hlZXQ9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtLmRlYnVnCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbT1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2RlYnVnL3JlY29uY2lsZXJqb2I9ZmFsc2UKLQotI29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuR290b0Fubm90YXRpb25BY3Rpb24uX2RlYnVnCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2dvdG9OZXh0QW5ub3RhdGlvbj1mYWxzZQotCi1vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3ByZWZlcmVuY2VzLXByb3BlcnRpZXM9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyU3BlbGxpbmc9ZmFsc2UKLQotb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyVmFsaWRhdG9ycz1mYWxzZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhiZDk0Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgQXVnIDE5IDE2OjMxOjQzIEVEVCAyMDA2DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxY2Q1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2DQotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wDQotY29tcGlsZXJzLnAuYnVpbGQ9MA0KLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQ0KLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTANCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MA0KLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTANCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wDQotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wDQotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTANCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTANCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wDQotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MA0KLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wDQotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUNCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQ0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMxMDBjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW4KLUJ1bmRsZS1WZW5kb3I6ICVwcm92aWRlck5hbWUKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgotRXhwb3J0LVBhY2thZ2U6IG9yZy5lY2xpcHNlLndzdC5zc2UudWksCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXQudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3I7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZW5jb2RpbmcudWk7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNwZWxsaW5nO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnZpZXcuZXZlbnRzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcwotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLnVpLmlkZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcuY29yZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuZGVidWcudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7dmlzaWJpbGl0eTo9cmVleHBvcnQ7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnNlYXJjaDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uuc3d0O2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5qZmFjZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWk7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS53b3JrYmVuY2g7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLnZpZXdzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuY29tbW9uO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBjb20uaWJtLmljdTtidW5kbGUtdmVyc2lvbj0iWzMuNC40LDQuMC4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvUkVBRE1FLnR4dCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmU0NTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1UaGUgYmFzZSBlZGl0b3Igb2YgdGhlIHNzZSBmcmFtZXdvcmsuIEl0IHByb3ZpZGVzIHRoZSBob29rcyBmb3IgY29udGVudCBhc3Npc3QsCi1icmVha3BvaW50cywgZGVidWdnaW5nLCBvcGVuLW9uLCBxdWlja2ZpeCwgc3BlbGwgY2hlY2tpbmcgYW5kIGEgY29udGVudCBvdXRsaW5lLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNWI3N2JlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIC4sXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1iaW4uZXhjbHVkZXMgPSBiaW4vKiosXAotICAgICAgICAgICAgICAgQGRvdC8qKixcCi0gICAgICAgICAgICAgICB0ZW1wLmZvbGRlci8qKgotc3JjLmluY2x1ZGVzID0gdG9jLnhtbCxcCi0gICAgICAgICAgICAgICB0ZXN0VG9jLnhtbCxcCi0gICAgICAgICAgICAgICBzY2hlbWEvLFwKLSAgICAgICAgICAgICAgIGh0bWwvCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtZXh0ZW5zaW9ucy8sXAotICAgICAgICAgICBzcmMtZW5jb2RpbmcsXAotICAgICAgICAgICBzcmMtdGFza3RhZ3MvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC9tYWludG9waWMuaHRtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL21haW50b3BpYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDc2MDc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL21haW50b3BpYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMCBUcmFuc2l0aW9uYWwvL0VOIj4KLQotPGh0bWw+Ci08aGVhZD4KLQk8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLQk8dGl0bGU+TWFpbiBUb3BpYzwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPk1haW4gVG9waWM8L2gxPgotUGxlYXNlIGVudGVyIHlvdXIgdGV4dCBoZXJlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL3N1YnRvcGljLmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaHRtbC9zdWJ0b3BpYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTYxYzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL3N1YnRvcGljLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5TdWIgVG9waWM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLTxoMT5TdWIgVG9waWM8L2gxPgotUGxlYXNlIGVudGVyIHlvdXIgdGV4dCBoZXJlLgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9odG1sL3RvYy5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvdG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNmYwYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2h0bWwvdG9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wIFRyYW5zaXRpb25hbC8vRU4iPgotCi08aHRtbD4KLTxoZWFkPgotCTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotCTx0aXRsZT5UYWJsZSBvZiBDb250ZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotPGgxPlRhYmxlIG9mIENvbnRlbnRzPC9oMT4KLVBsZWFzZSBlbnRlciB5b3VyIHRleHQgaGVyZS4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3NwZWxsY2hlY2suZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvY3Rvb2wxNi9zcGVsbGNoZWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcxZGUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9jdG9vbDE2L3NwZWxsY2hlY2suZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9jb2xsYXBzZWFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzBkZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2NvbGxhcHNlYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9kZWxldGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2RlbGV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMTk3YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZGxjbDE2L2RlbGV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9kbGNsMTYvc3luY2VkLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjllNTY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2RsY2wxNi9zeW5jZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zcGVsbGNoZWNrLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2R0b29sMTYvc3BlbGxjaGVjay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Y2Y1NWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9zcGVsbGNoZWNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmQ4MGE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9jb2xsYXBzZWFsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvZGVsZXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9kZWxldGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWU2ZGVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2VsY2wxNi9kZWxldGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvZWxjbDE2L3N5bmNlZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjZWZlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9lbGNsMTYvc3luY2VkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvc3BlbGxjaGVjay5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3NwZWxsY2hlY2suZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzFkZTMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL2V0b29sMTYvc3BlbGxjaGVjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9vY2NfbWF0Y2guZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvb2NjX21hdGNoLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUwMzNkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvZnVsbC9vYmoxNi9vY2NfbWF0Y2guZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJlZmVyZW5jZXMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJlZmVyZW5jZXMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzA3ZmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L3ByZWZlcmVuY2VzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9mdWxsL29iajE2L3Byb3BfcHMuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvcF9wcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZWM2NGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL2ljb25zL2Z1bGwvb2JqMTYvcHJvcF9wcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvaWNvbnMvc291cmNlRWRpdG9yLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWViZGI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZDUyN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MjA6MTAgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMWM3YWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdAotb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuY3VzdG9tX2NvZGVfdGVtcGxhdGVzPTw/eG1sIHZlcnNpb25cPSIxLjAiIGVuY29kaW5nXD0iVVRGLTgiPz5cclxuPHRlbXBsYXRlcy8+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzUyMmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jTW9uIEFwciAxNyAwMjowMTozMyBFRFQgMjAwNgotY29tcGlsZXJzLmluY29tcGF0aWJsZS1lbnZpcm9ubWVudD0wCi1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJiYjUwYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotcGx1Z2luTmFtZT1TdHJ1Y3R1cmVkIFNvdXJjZSBFZGl0b3IKLVN0YW5kYWxvbmVfU3RydWN0dXJlZF9Tb3VyY2VfRWRpdG9yLm5hbWU9U3RhbmRhbG9uZSBTdHJ1Y3R1cmVkIFNvdXJjZSBFZGl0b3IKLSMgTmFtZSBvbiBwcmVmZXJlbmNlcyBwYWdlCi1XRUJfQU5EX1hNTF9GaWxlcy5uYW1lPVdlYiBhbmQgWE1MCi1TdHJ1Y3R1cmVkX1RleHRfRWRpdG9yLm5hbWU9U3RydWN0dXJlZCBUZXh0IEVkaXRvcnMKLVRhc2tfVGFnc19QcmVmZXJlbmNlcy5uYW1lPVRhc2sgVGFncwotCi0jCi1zb3VyY2VFZGl0b3JGb250RGVmaW5pdG9uLmxhYmVsPVN0cnVjdHVyZWQgVGV4dCBFZGl0b3IgVGV4dCBGb250Ci1zb3VyY2VFZGl0b3JGb250RGVmaW50aW9uLmRlc2NyaXB0aW9uPVRoZSBTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHRleHQgZm9udCBpcyB1c2VkIGJ5IFN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLgotCi1BZGFwdGVyX0ZhY3RvcnlfRGVzY3JpcHRpb25fRXh0ZW5zaW9uLm5hbWU9QWRhcHRlciBGYWN0b3J5IERlc2NyaXB0aW9uIEV4dGVuc2lvbgotRXh0ZW5kZWRfRWRpdG9yX0FjdGlvbnNfRXh0ZW5zaW9uLm5hbWU9RXh0ZW5kZWQgRWRpdG9yIEFjdGlvbnMgRXh0ZW5zaW9uCi1Ecm9wX1RhcmdldF9UcmFuc2ZlcnNfRXh0ZW5zaW9uLm5hbWU9RHJvcCBUYXJnZXQgVHJhbnNmZXJzIEV4dGVuc2lvbgotRXh0ZW5kZWRfRWRpdG9yX0NvbmZpZ3VyYXRpb25fRXh0ZW5zaW9uLm5hbWU9RXh0ZW5kZWQgRWRpdG9yIENvbmZpZ3VyYXRpb24gRXh0ZW5zaW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIFdvcmtiZW5jaCBLZXlzIFByZWZlcmVuY2VzCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotc2NvcGUuc3RydWN0dXJlZFRleHRFZGl0b3IubmFtZT1FZGl0aW5nIGluIFN0cnVjdHVyZWQgVGV4dCBFZGl0b3JzCi1zY29wZS5zdHJ1Y3R1cmVkVGV4dEVkaXRvci5kZXNjcmlwdGlvbj1FZGl0aW5nIGluIFN0cnVjdHVyZWQgVGV4dCBFZGl0b3JzCi1jb21tYW5kLnRvZ2dsZS5jb21tZW50Lm5hbWU9VG9nZ2xlIENvbW1lbnQKLWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQuZGVzY3JpcHRpb249VG9nZ2xlIENvbW1lbnQKLWNvbW1hbmQuYWRkLmJsb2NrLmNvbW1lbnQubmFtZT1BZGQgQmxvY2sgQ29tbWVudAotY29tbWFuZC5hZGQuYmxvY2suY29tbWVudC5kZXNjcmlwdGlvbj1BZGQgQmxvY2sgQ29tbWVudAotY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5uYW1lPVJlbW92ZSBCbG9jayBDb21tZW50Ci1jb21tYW5kLnJlbW92ZS5ibG9jay5jb21tZW50LmRlc2NyaXB0aW9uPVJlbW92ZSBCbG9jayBDb21tZW50Ci1jb21tYW5kLmNsZWFudXAuZG9jdW1lbnQubmFtZT1DbGVhbnVwIERvY3VtZW50Ci1jb21tYW5kLmNsZWFudXAuZG9jdW1lbnQuZGVzY3JpcHRpb249Q2xlYW51cCBkb2N1bWVudAotY29tbWFuZC5mb3JtYXQuZG9jdW1lbnQubmFtZT1Gb3JtYXQgRG9jdW1lbnQKLWNvbW1hbmQuZm9ybWF0LmRvY3VtZW50LmRlc2NyaXB0aW9uPUZvcm1hdCBkb2N1bWVudAotY29tbWFuZC5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzLm5hbWU9Rm9ybWF0IEFjdGl2ZSBFbGVtZW50cwotY29tbWFuZC5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzLmRlc2NyaXB0aW9uPUZvcm1hdCBhY3RpdmUgZWxlbWVudHMKLWNvbW1hbmQub3Blbi5maWxlLmZyb20uc291cmNlLm5hbWU9T3BlbiBTZWxlY3Rpb24KLWNvbW1hbmQub3Blbi5maWxlLmZyb20uc291cmNlLmRlc2NyaXB0aW9uPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1jb21tYW5kLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzLm5hbWU9T2NjdXJyZW5jZXMgaW4gRmlsZQotY29tbWFuZC5zZWFyY2guZmluZC5vY2N1cnJlbmNlcy5kZXNjcmlwdGlvbj1GaW5kIG9jY3VycmVuY2VzIG9mIHRoZSBzZWxlY3Rpb24gaW4gdGhlIGZpbGUKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0RW5jbG9zaW5nLm5hbWU9U2VsZWN0IEVuY2xvc2luZyBFbGVtZW50Ci1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdEVuY2xvc2luZy5kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TmV4dC5uYW1lPVNlbGVjdCBOZXh0IEVsZW1lbnQKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TmV4dC5kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1BY3Rpb25EZWZpbml0aW9uLnNlbGVjdFByZXZpb3VzLm5hbWU9U2VsZWN0IFByZXZpb3VzIEVsZW1lbnQKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0UHJldmlvdXMuZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIHByZXZpb3VzIHNpYmxpbmcKLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TGFzdC5uYW1lPVJlc3RvcmUgTGFzdCBTZWxlY3Rpb24KLUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TGFzdC5kZXNjcmlwdGlvbj1SZXN0b3JlIGxhc3Qgc2VsZWN0aW9uCi1BY3Rpb25EZWZpbml0aW9uLnNob3dKYXZhZG9jLm5hbWU9U2hvdyBUb29sdGlwIERlc2NyaXB0aW9uCi1BY3Rpb25EZWZpbml0aW9uLnNob3dKYXZhZG9jLmRlc2NyaXB0aW9uPURpc3BsYXlzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudAotQWN0aW9uRGVmaW5pdGlvbi5xdWlja0ZpeC5uYW1lPVF1aWNrIEZpeAotQWN0aW9uRGVmaW5pdGlvbi5xdWlja0ZpeC5kZXNjcmlwdGlvbj1RdWljayBGaXgKLQotIwotQWRkQm9va21hcmsubGFiZWw9QWRkIEJvbyZrbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGVzZSBzdHJpbmdzIGFyZSB1c2VkIGluIGZpbGUgYW5kIGNvbnRhaW5lciByZXNvdXJjZSBwb3B1cCBtZW51Ci0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU291cmNlPSZTb3VyY2UKLUZvcm1hdERvY3VtZW50PSZGb3JtYXQgZG9jdW1lbnQKLSMjCi1CcmVha3BvaW50X0V4dGVuc2lvbl9Qb2ludC5uYW1lPUJyZWFrcG9pbnQgRXh0ZW5zaW9uIFBvaW50Ci1Tb3VyY2VfVmFsaWRhdGlvbl9FeHRlbnNpb25fUG9pbnQubmFtZT1SZWNvbmNpbGUgVmFsaWRhdG9yIEV4dGVuc2lvbiBQb2ludAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBUaGUgZm9sbG93aW5nIHByb3BlcnR5IGtleXMgbWF5YmUgdW51c2VkLiBDb21tZW50ZWQgb3V0IG9uIDQvMTIvMjAwNS4gVW5jb21tZW50IGlmIG5lZWRlZC4KLSNCZWFuX0luZm9fUHJvdmlkZXJfRXh0ZW5zaW9uLm5hbWU9QmVhbiBJbmZvIFByb3ZpZGVyIEV4dGVuc2lvbgotI1NwZWxsQ2hlY2tfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9U3BlbGxDaGVjayBFeHRlbnNpb24gUG9pbnQKLSNPcGVuX09uX0V4dGVuc2lvbl9Qb2ludC5uYW1lPU9wZW4gT24gRXh0ZW5zaW9uIFBvaW50Ci0jU3BlbGxfQ2hlY2tfbGFiZWw9U3BlbGwgQ2hlY2sKLSNTcGVsbF9DaGVja190b29sdGlwPVNwZWxsIENoZWNrCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQxOWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08cGx1Z2luPgotCi0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0iYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiIKLQkJbmFtZT0iJUFkYXB0ZXJfRmFjdG9yeV9EZXNjcmlwdGlvbl9FeHRlbnNpb24ubmFtZSIgLz4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJleHRlbmRlZEVkaXRvckFjdGlvbnMiCi0JCW5hbWU9IiVFeHRlbmRlZF9FZGl0b3JfQWN0aW9uc19FeHRlbnNpb24ubmFtZSIgLz4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJkcm9wVGFyZ2V0VHJhbnNmZXJzIgotCQluYW1lPSIlRHJvcF9UYXJnZXRfVHJhbnNmZXJzX0V4dGVuc2lvbi5uYW1lIiAvPgotCTxleHRlbnNpb24tcG9pbnQKLQkJaWQ9ImVkaXRvckNvbmZpZ3VyYXRpb24iCi0JCW5hbWU9IiVFeHRlbmRlZF9FZGl0b3JfQ29uZmlndXJhdGlvbl9FeHRlbnNpb24ubmFtZSIKLQkJc2NoZW1hPSJzY2hlbWEvZWRpdG9yY29uZmlndXJhdGlvbi5leHNkIiAvPgotCi0KLQk8IS0tIE1ha2Ugc3VyZSBkZWZhdWx0IHByZWZlcmVuY2UgdmFsdWVzIGFyZSBzZXQgYXQgcnVudGltZSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMiPgotCQk8aW5pdGlhbGl6ZXIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCi0JPCEtLSByZXVzYWJsZSBleHRlbnNpb25zIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTxzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiIC8+Ci0JCTxwcm92aXNpb25hbERlZmluaXRpb24KLQkJCXR5cGU9InByZWZlcmVuY2VwYWdlcyIKLQkJCXZhbHVlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIGFzc29jaWF0ZSB0aGUgTmF2aWdhdGVBY3Rpb25TZXQgd2l0aCB2YXJpb3VzIHBhcnRzIG9mIHRoZSBYTUwgcGVyc3BlY3RpdmUtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb25zIj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLmVkaXQudGV4dC5hY3Rpb25TZXQuYW5ub3RhdGlvbk5hdmlnYXRpb24iPgotCQkJPHBhcnQKLQkJCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciI+Ci0JCQk8L3BhcnQ+Ci0JCTwvYWN0aW9uU2V0UGFydEFzc29jaWF0aW9uPgotCQk8YWN0aW9uU2V0UGFydEFzc29jaWF0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2UudWkuTmF2aWdhdGVBY3Rpb25TZXQiPgotCQkJPCEtLQotCQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5SZXNvdXJjZU5hdmlnYXRvciIvPgotCQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS51aS52aWV3cy5Db250ZW50T3V0bGluZSIvPgotCQkJLS0+Ci0JCQk8IS0tCi0JCQkJc2hvdWxkIHByb2JhYmx5IG9ubHkgImZvcmNlIiBhc3NvY2lhdGlvbiBvZiBhY3Rpb24gc2V0cyBmb3Igd29ya2JlbmNoIHBhcnRzIHRoYXQgd2Ugb3duCi0JCQkJb3Igb25seSBpZiB0aGUgdmlldyBpcyBmb2N1c3NlIGluIHRoZSBYTUxQZXJzcGVjdGl2ZQotCQkJLS0+Ci0JCQk8cGFydAotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yIj4KLQkJCTwvcGFydD4KLQkJPC9hY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzIj4KLQkJPCEtLSBST09UIFBSRUZFUkVOQ0UgUEFHRSBGT1IgV0VCIEFORCBYTUwgRklMRVMgLS0+Ci0JCTwhLS0gIENvbW1lbnQgb3V0IGZvciBub3cgc2luY2UgdGhpcyBwcmVmZXJlbmNlIHBhZ2UgaXMgbm90IHVzZWQKLQkJCTxwYWdlCi0JCQluYW1lPSIlV0VCX0FORF9YTUxfRmlsZXMubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkZpbGVQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzIj4KLQkJCTwvcGFnZT4KLQkJLS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlV0VCX0FORF9YTUxfRmlsZXMubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkVtcHR5RmlsZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMiPgotCQk8L3BhZ2U+Ci0JCTwhLS0gImNvbW1vbiIgdGFzayB0YWdzIHByZWZlcmVuY2UgcGFnZSAtLT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVUYXNrX1RhZ3NfUHJlZmVyZW5jZXMubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnByZWZlcmVuY2VzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuVGFza1RhZ1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudGFza3RhZ3MiPgotCQk8L3BhZ2U+Ci0KLQkJPCEtLSBTb3VyY2UgRWRpdG9yIFByZWZlcmVuY2UgcGFnZSB1bmRlciBXb3JrYmVuY2gtPkVkaXRvcnMgLS0+Ci0JCTxwYWdlCi0JCQluYW1lPSIlU3RydWN0dXJlZF9UZXh0X0VkaXRvci5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcy5FZGl0b3JzIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLmVkaXRvciI+Ci0JCTwvcGFnZT4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIGNvbW1vbiB0YXNrIHRhZ3MgcHJvcGVydHkgcGFnZSAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcm9wZXJ0eVBhZ2VzIj4KLQkJPHBhZ2UKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByb2plY3QucHJvcGVydGllcy50YXNrdGFncyIKLQkJCW5hbWU9IiVUYXNrX1RhZ3NfUHJlZmVyZW5jZXMubmFtZSIKLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdCIKLQkJCWFkYXB0YWJsZT0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLlRhc2tUYWdQcmVmZXJlbmNlUGFnZSIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0KLQkJPGV4dGVuc2lvbi1wb2ludCBpZD0iZHJhZ1NvdXJjZVRyYW5zZmVycyIgbmFtZT0iRHJhZyBTb3VyY2UgVHJhbnNmZXJzIi8+Ci0JLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuY29tbWFuZHMiPgotCQk8IS0tIEVkaXQgY29tbWFuZHMgLS0+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RFbmNsb3NpbmcubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RFbmNsb3NpbmcuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3ROZXh0Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TmV4dC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RQcmV2aW91cy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLnNlbGVjdFByZXZpb3VzLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlQWN0aW9uRGVmaW5pdGlvbi5zZWxlY3RMYXN0Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJUFjdGlvbkRlZmluaXRpb24uc2VsZWN0TGFzdC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlQWN0aW9uRGVmaW5pdGlvbi5zaG93SmF2YWRvYy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVBY3Rpb25EZWZpbml0aW9uLnNob3dKYXZhZG9jLmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNob3cuamF2YWRvYyI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVBY3Rpb25EZWZpbml0aW9uLnF1aWNrRml4Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJUFjdGlvbkRlZmluaXRpb24ucXVpY2tGaXguZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC50ZXh0LmphdmEuY29ycmVjdGlvbi5hc3Npc3QucHJvcG9zYWxzIj4KLQkJPC9jb21tYW5kPgotCQk8IS0tIFNvdXJjZSBjb21tYW5kcyAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnRvZ2dsZS5jb21tZW50Lm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQudG9nZ2xlLmNvbW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5hZGQuYmxvY2suY29tbWVudC5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmFkZC5ibG9jay5jb21tZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQucmVtb3ZlLmJsb2NrLmNvbW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5yZW1vdmUuYmxvY2suY29tbWVudC5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCI+Ci0JCTwvY29tbWFuZD4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLmNsZWFudXAuZG9jdW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5jbGVhbnVwLmRvY3VtZW50LmRlc2NyaXB0aW9uIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2UudWkuY2F0ZWdvcnkuZWRpdCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiPgotCQk8L2NvbW1hbmQ+Ci0JCTxjb21tYW5kCi0JCQluYW1lPSIlY29tbWFuZC5mb3JtYXQuZG9jdW1lbnQubmFtZSIKLQkJCWRlc2NyaXB0aW9uPSIlY29tbWFuZC5mb3JtYXQuZG9jdW1lbnQuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmRvY3VtZW50Ij4KLQkJPC9jb21tYW5kPgotCQk8Y29tbWFuZAotCQkJbmFtZT0iJWNvbW1hbmQuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cy5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmFjdGl2ZS5lbGVtZW50cyI+Ci0JCTwvY29tbWFuZD4KLQkJPCEtLSBOYXZpZ2F0ZSBjb21tYW5kcyAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLm9wZW4uZmlsZS5mcm9tLnNvdXJjZS5uYW1lIgotCQkJZGVzY3JpcHRpb249IiVjb21tYW5kLm9wZW4uZmlsZS5mcm9tLnNvdXJjZS5kZXNjcmlwdGlvbiIKLQkJCWNhdGVnb3J5SWQ9Im9yZy5lY2xpcHNlLnVpLmNhdGVnb3J5LmVkaXQiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5vcGVuLmZpbGUuZnJvbS5zb3VyY2UiPgotCQk8L2NvbW1hbmQ+Ci0JCTwhLS0gRmluZCBPY2N1cnJlbmNlcyAtLT4KLQkJPGNvbW1hbmQKLQkJCW5hbWU9IiVjb21tYW5kLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzLm5hbWUiCi0JCQlkZXNjcmlwdGlvbj0iJWNvbW1hbmQuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMuZGVzY3JpcHRpb24iCi0JCQljYXRlZ29yeUlkPSJvcmcuZWNsaXBzZS51aS5jYXRlZ29yeS5lZGl0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiPgotCQk8L2NvbW1hbmQ+Ci0JPC9leHRlbnNpb24+Ci0JPCEtLSBLZXliaW5kaW5nIHNjb3BlIGZvciBzb3VyY2UgZWRpdG9yIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmNvbnRleHRzIj4KLQkJPGNvbnRleHQKLQkJCW5hbWU9IiVzY29wZS5zdHJ1Y3R1cmVkVGV4dEVkaXRvci5uYW1lIgotCQkJcGFyZW50SWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRFZGl0b3JTY29wZSIKLQkJCWRlc2NyaXB0aW9uPSIlc2NvcGUuc3RydWN0dXJlZFRleHRFZGl0b3IuZGVzY3JpcHRpb24iCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIj4KLQkJPC9jb250ZXh0PgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gS2V5YmluZGluZ3MgZm9yIHNvdXJjZSBlZGl0b3IgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYmluZGluZ3MiPgotCSAgICA8IS0tICB3aW4zMjogIE0xPUNUUkwsIE0yPVNISUZULCBNMz1BTFQgLS0+Ci0JCTwhLS0gRWRpdCBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0yK00zK0FSUk9XX1VQIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrQVJST1dfUklHSFQiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lm5leHQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrQVJST1dfTEVGVCIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTIrTTMrQVJST1dfRE9XTiIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubGFzdCIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJGMiIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNob3cuamF2YWRvYyIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMSsxIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC50ZXh0LmphdmEuY29ycmVjdGlvbi5hc3Npc3QucHJvcG9zYWxzIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPCEtLSBTb3VyY2UgY29tbWFuZHMgLS0+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitDIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiCi0JCQlzY2hlbWVJZD0ib3JnLmVjbGlwc2UudWkuZGVmYXVsdEFjY2VsZXJhdG9yQ29uZmlndXJhdGlvbiI+Ci0JCTwva2V5PgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErTTIrLyIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkZC5ibG9jay5jb21tZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK00yK1wiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5yZW1vdmUuYmxvY2suY29tbWVudCIKLQkJCXNjaGVtZUlkPSJvcmcuZWNsaXBzZS51aS5kZWZhdWx0QWNjZWxlcmF0b3JDb25maWd1cmF0aW9uIj4KLQkJPC9rZXk+Ci0JCTxrZXkKLQkJCXNlcXVlbmNlPSJNMStNMitGIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZm9ybWF0LmRvY3VtZW50IgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPGtleQotCQkJc2VxdWVuY2U9Ik0xK0kiCi0JCQljb250ZXh0SWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlZFRleHRFZGl0b3JTY29wZSIKLQkJCWNvbW1hbmRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPCEtLSBOYXZpZ2F0ZSBjb21tYW5kcyAtLT4KLQkJPGtleQotCQkJc2VxdWVuY2U9IkYzIgotCQkJY29udGV4dElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiCi0JCQljb21tYW5kSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkub3Blbi5maWxlLmZyb20uc291cmNlIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQkJPCEtLSBGaW5kIE9jY3VycmVuY2VzIC0tPgotCQk8a2V5Ci0JCQlzZXF1ZW5jZT0iTTErTTIrQSIKLQkJCWNvbnRleHRJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmVkVGV4dEVkaXRvclNjb3BlIgotCQkJY29tbWFuZElkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIgotCQkJc2NoZW1lSWQ9Im9yZy5lY2xpcHNlLnVpLmRlZmF1bHRBY2NlbGVyYXRvckNvbmZpZ3VyYXRpb24iPgotCQk8L2tleT4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIEZvbnQgYW5kIGNvbG9ycyBjb250cmlidXRpb25zIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnRoZW1lcyI+Ci0JCTx0aGVtZUVsZW1lbnRDYXRlZ29yeQotCQkJbGFiZWw9IiVTdHJ1Y3R1cmVkX1RleHRfRWRpdG9yLm5hbWUiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI+Ci0JCTwvdGhlbWVFbGVtZW50Q2F0ZWdvcnk+Ci0JCTxmb250RGVmaW5pdGlvbgotCQkJbGFiZWw9IiVzb3VyY2VFZGl0b3JGb250RGVmaW5pdG9uLmxhYmVsIgotCQkJY2F0ZWdvcnlJZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aSIKLQkJCWRlZmF1bHRzVG89Im9yZy5lY2xpcHNlLmpmYWNlLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiPgotCQkJPGRlc2NyaXB0aW9uPgotCQkJCSVzb3VyY2VFZGl0b3JGb250RGVmaW50aW9uLmRlc2NyaXB0aW9uCi0JCQk8L2Rlc2NyaXB0aW9uPgotCQk8L2ZvbnREZWZpbml0aW9uPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuZHJvcFRhcmdldFRyYW5zZmVycyI+Ci0JCTxkcm9wVGFyZ2V0Q29udHJpYnV0aW9uCi0JCQl0YXJnZXRJRD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbi5FeHRlbmRlZFRyYW5zZmVycyI+Ci0JCQk8dHJhbnNmZXIKLQkJCQlwcmlvcml0eT0ibWlkIgotCQkJCXNpbmdsZXRvbj0idHJ1ZSIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXIiCi0JCQkJbWV0aG9kPSJnZXRJbnN0YW5jZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXIiPgotCQkJPC90cmFuc2Zlcj4KLQkJCTxkcm9wQWN0aW9uCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRmlsZURyb3BBY3Rpb24iCi0JCQkJdHJhbnNmZXJJRD0ib3JnLmVjbGlwc2Uuc3d0LmRuZC5GaWxlVHJhbnNmZXIiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRmlsZURyb3BBY3Rpb24iPgotCQkJPC9kcm9wQWN0aW9uPgotCQkJPHRyYW5zZmVyCi0JCQkJcHJpb3JpdHk9ImxvdyIKLQkJCQlzaW5nbGV0b249InRydWUiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyIgotCQkJCW1ldGhvZD0iZ2V0SW5zdGFuY2UiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyIj4KLQkJCTwvdHJhbnNmZXI+Ci0JCQk8ZHJvcEFjdGlvbgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlRleHREcm9wQWN0aW9uIgotCQkJCXRyYW5zZmVySUQ9Im9yZy5lY2xpcHNlLnN3dC5kbmQuVGV4dFRyYW5zZmVyIgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlRleHREcm9wQWN0aW9uIj4KLQkJCTwvZHJvcEFjdGlvbj4KLQkJPC9kcm9wVGFyZ2V0Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5hbm5vdGF0aW9uVHlwZXMiPgotCQk8dHlwZQotCQkJc3VwZXI9Im9yZy5lY2xpcHNlLnVpLndvcmtiZW5jaC50ZXh0ZWRpdG9yLmVycm9yIgotCQkJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5wcm9ibGVtIgotCQkJbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLmVycm9yIgotCQkJbWFya2VyU2V2ZXJpdHk9IjIiPgotCQk8L3R5cGU+Ci0JCTx0eXBlCi0JCQlzdXBlcj0ib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3Iud2FybmluZyIKLQkJCW1hcmtlclR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UucHJvYmxlbSIKLQkJCW5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC53YXJuaW5nIgotCQkJbWFya2VyU2V2ZXJpdHk9IjEiPgotCQk8L3R5cGU+Ci0KLQkJPHR5cGUKLQkJCXN1cGVyPSJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5pbmZvIgotCQkJbWFya2VyVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS5wcm9ibGVtIgotCQkJbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLmluZm8iCi0JCQltYXJrZXJTZXZlcml0eT0iMCI+Ci0JCTwvdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS51aS5lZGl0b3JzLm1hcmtlckFubm90YXRpb25TcGVjaWZpY2F0aW9uIj4KLQotCQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCTwhLS0gc2FtZSBhcyBlY2xpcHNlIHRleHQgdWkgKGluY2x1ZGluZyBwcmVmZXJlbmNlIGtleXMpLCBleGNlcHQgZm9yIHZlcnRpY2FsIHJ1bGVyICYgcHJlZmVyZW5jZSBwYWdlIC0tPgotCQk8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JCTxzcGVjaWZpY2F0aW9uCi0JCQlhbm5vdGF0aW9uVHlwZT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLmVycm9yIgotCQkJYW5ub3RhdGlvbkltYWdlUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudWkuU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciIKLQkJCXZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlVmFsdWU9InRydWUiCi0JCQl2ZXJ0aWNhbFJ1bGVyUHJlZmVyZW5jZUtleT0ic3NlRXJyb3JJbmRpY2F0aW9uSW5WZXJ0aWNhbFJ1bGVyIgotCQkJaW5jbHVkZU9uUHJlZmVyZW5jZVBhZ2U9ImZhbHNlIj4KLQkJPC9zcGVjaWZpY2F0aW9uPgotCQk8c3BlY2lmaWNhdGlvbgotCQkJYW5ub3RhdGlvblR5cGU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC53YXJuaW5nIgotCQkJYW5ub3RhdGlvbkltYWdlUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudWkuU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciIKLQkJCXZlcnRpY2FsUnVsZXJQcmVmZXJlbmNlVmFsdWU9ImZhbHNlIgotCQkJdmVydGljYWxSdWxlclByZWZlcmVuY2VLZXk9InNzZVdhcm5pbmdJbmRpY2F0aW9uSW5WZXJ0aWNhbFJ1bGVyIgotCQkJaW5jbHVkZU9uUHJlZmVyZW5jZVBhZ2U9ImZhbHNlIj4KLQkJPC9zcGVjaWZpY2F0aW9uPgotCQk8c3BlY2lmaWNhdGlvbgotCQkJYW5ub3RhdGlvbkltYWdlUHJvdmlkZXI9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudWkuU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciIKLQkJCWFubm90YXRpb25UeXBlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuaW5mbyI+Ci0JCTwvc3BlY2lmaWNhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQk8IS0tIGR5bmFtaWMgY29udGVudCB0eXBlIHN1cHBvcnRpbmcgZWRpdG9yLCBubyBzdXBwb3J0ZWQgZmlsZSBleHRlbnNpb25zIGJ5IGRlZmF1bHQgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVTdGFuZGFsb25lX1N0cnVjdHVyZWRfU291cmNlX0VkaXRvci5uYW1lIgotCQkJaWNvbj0iJG5sJC9pY29ucy9zb3VyY2VFZGl0b3IuZ2lmIgotCQkJY29udHJpYnV0b3JDbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkNvbnRyaWJ1dG9yIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiPgotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hY3Rpb25zLkNvbnRhaW5lclNvdXJjZUFjdGlvbnMiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJVNvdXJjZSIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9InNvdXJjZSI+Ci0JCQkJPGdyb3VwTWFya2VyIG5hbWU9InNvdXJjZUdyb3VwIj48L2dyb3VwTWFya2VyPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlRm9ybWF0RG9jdW1lbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0ic291cmNlL3NvdXJjZUdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IisiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWN0aW9ucy5Db250YWluZXJTb3VyY2VBY3Rpb25zLkZvcm1hdCI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9vYmplY3RDb250cmlidXRpb24+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFjdGlvbnMuRmlsZVNvdXJjZUFjdGlvbnMiPgotCQkJPG1lbnUKLQkJCQlsYWJlbD0iJVNvdXJjZSIKLQkJCQlwYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9InNvdXJjZSI+Ci0JCQkJPGdyb3VwTWFya2VyIG5hbWU9InNvdXJjZUdyb3VwIj48L2dyb3VwTWFya2VyPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlRm9ybWF0RG9jdW1lbnQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZSIKLQkJCQltZW51YmFyUGF0aD0ic291cmNlL3NvdXJjZUdyb3VwIgotCQkJCWVuYWJsZXNGb3I9IisiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuYWN0aW9ucy5GaWxlU291cmNlQWN0aW9ucy5Gb3JtYXQiPgotCQkJPC9hY3Rpb24+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotICAgCTwvZXh0ZW5zaW9uPgotICAgPGV4dGVuc2lvbgotICAgICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvckFjdGlvbnMiPgotICAgICAgPGVkaXRvckNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IiCi0gICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iPgotICAgICAgICAgPC9hY3Rpb24+Ci0gICAgICAgICA8YWN0aW9uCi0gICAgICAgICAgICAgICBsYWJlbD0iJVNlbGVjdFJ1bGVyLmxhYmVsIgotICAgICAgICAgICAgICAgY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNlbGVjdFJ1bGVyQWN0aW9uIj4KLSAgICAgICAgIDwvYWN0aW9uPgotICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KLQk8IS0tIGNvbnRyaWJ1dGUgYSBTZWFyY2hSZXN1bHRWaWV3UGFnZSBmb3IgT2NjdXJyZW5jZXMgaW4gZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgotCTxleHRlbnNpb24KLQkJaWQ9Ik9jY3VycmVuY2VzIHNlYXJjaCBwYWdlIgotCQlwb2ludD0ib3JnLmVjbGlwc2Uuc2VhcmNoLnNlYXJjaFJlc3VsdFZpZXdQYWdlcyI+Ci0JCTx2aWV3UGFnZQotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLk9jY3VycmVuY2VzU2VhcmNoUmVzdWx0UGFnZSIKLQkJCXNlYXJjaFJlc3VsdENsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5PY2N1cnJlbmNlc1NlYXJjaFZpZXdQYWdlIj4KLQkJPC92aWV3UGFnZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gZXh0ZW5zaW9uIHBvaW50IGZvciBicmVha3BvaW50IGV4dGVuc2lvbiAtLT4KLQk8ZXh0ZW5zaW9uLXBvaW50Ci0JCWlkPSJicmVha3BvaW50IgotCQluYW1lPSIlQnJlYWtwb2ludF9FeHRlbnNpb25fUG9pbnQubmFtZSIgLz4KLQk8IS0tIGV4dGVuc2lvbiBwb2ludCBmb3Igc291cmNlIHZhbGlkYXRpb24gLS0+Ci0JPCEtLSBpbnRlcmZhY2VzIGZvciB0aGlzIGV4dGVuc2lvbiBwb2ludCBjYW4gYmUgZm91bmQgaW4gb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24gLS0+Ci0JPGV4dGVuc2lvbi1wb2ludAotCQlpZD0ic291cmNldmFsaWRhdGlvbiIKLQkJbmFtZT0iJVNvdXJjZV9WYWxpZGF0aW9uX0V4dGVuc2lvbl9Qb2ludC5uYW1lIgotCQlzY2hlbWE9InNjaGVtYS9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24uZXhzZCIgLz4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3JlZXhwb3J0LWluZm8udHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3JlZXhwb3J0LWluZm8udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhjN2M3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9yZWV4cG9ydC1pbmZvLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotd2UgcmVleHBvcnQgZWNsaXBzZS51aS5lZGl0b3JzIAotc2luY2Ugb25lIG9mIG91ciBBUElzLCBTdHJ1Y3R1cmVkU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiAKLXJlcXVpcmVzIGl0LiAKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9lZGl0b3Jjb25maWd1cmF0aW9uLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL2VkaXRvcmNvbmZpZ3VyYXRpb24uZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2Yzk0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc2NoZW1hL2VkaXRvcmNvbmZpZ3VyYXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiBpZD0iZWRpdG9yQ29uZmlndXJhdGlvbiIgbmFtZT0iRWRpdG9yIENvbmZpZ3VyYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIFNTRSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBpcyBpbnRlbmRlZCB0byBiZSBhcyBmbGV4aWJsZSBhcyBwb3NzaWJsZS4gIE11Y2ggb2YgaXRzIGRlc2lnbiBjZW50ZXJzIGFyb3VuZCB0aGUgbm90aW9uIG9mIGRlZmluaW5nIGFuZCByZWRlZmluaW5nIGl0cyBiZWhhdmlvciBhbmQgYXBwZWFyYW5jZSBiYXNlZCBvbiB0aGUgY29udGVudCB0eXBlIG9mIGl0cyBpbnB1dC4gIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBjbGllbnRzIHRvIHByb3ZpZGUgYW4gZWRpdG9yIGNvbmZpZ3VyYXRpb24gdG8gdGhlIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHdpdGhvdXQgaGF2aW5nIHRvIHN1YmNsYXNzIHRoZSBlZGl0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iY29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJwcm92aXNpb25hbERlZmluaXRpb24iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJzb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIHRoZSBzb3VyY2Ugdmlld2VyIGNvbmZpZ3VyYXRpb24sIGFmZmVjdGluZyBzeW50YXggaGlnaGxpZ2h0aW5nLCBjb250ZW50IGFzc2lzdCwgaG92ZXIgaGVscCwgYW5kIG1vcmUgaW4gdGhlIGN1cnJlbnQgZWRpdG9yLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0YXJnZXQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQSBzdHJpbmcgZGVmaW5pbmcgd2hlbiB0byB1c2UgdGhpcyBleHRlbnNpb24sIGVpdGhlciBhbiBlZGl0b3Igb3IgY29udGVudCB0eXBlIGlkLiAgTXVsdGlwbGUgdGFyZ2V0cyBtYXkgYmUgZ2l2ZW4gYXMgYSBjb21tYSBkZWxpbWl0ZWQgdmFsdWUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgTXVzdCBzdWJjbGFzcyBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0iamF2YSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJjb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iPgotICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIERlZmluZXMgaG93IHRoZSBjdXJyZW50IGVkaXRvciZhcG9zO3MgaW5wdXQgbWFwcyB0byBlbGVtZW50cyB3aXRoIGluIGEgVHJlZSBjb250cm9sLCBhcyB3ZWxsIGFzIHNlbGVjdGlvbiBmaWx0ZXJpbmcsIHRvb2xiYXIgYW5kIG1lbnUgY29udHJpYnV0aW9ucywgZXRjIGluIHRoZSBPdXRsaW5lIHZpZXcuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHN0cmluZyBkZWZpbmluZyB3aGVuIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgZWl0aGVyIGFuIGVkaXRvciBvciBjb250ZW50IHR5cGUgaWQuICBNdWx0aXBsZSB0YXJnZXRzIG1heSBiZSBnaXZlbiBhcyBhIGNvbW1hIGRlbGltaXRlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBNdXN0IHN1YmNsYXNzIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBEZWZpbmVzIGhvdyB0aGUgY3VycmVudCBlZGl0b3ImYXBvcztzIGlucHV0IG1hcHMgdG8gcHJvcGVydGllcyBpbiBhIFRhYmxlIGNvbnRyb2wsIGFzIHdlbGwgYXMgdG9vbGJhciBjb250cmlidXRpb25zLCBldGMgaW4gdGhlIFByb3BlcnRpZXMgdmlldy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCBlaXRoZXIgYW4gZWRpdG9yIG9yIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIE11c3Qgc3ViY2xhc3Mgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVjbGFyZXMgYSBjbGFzcyBmdWxmaWxsaW5nIHRoZSByZXF1aXJlbWVudHMgb2YgYSB0eXBlIHRvIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiB0YXJnZXQocykuCi1Ob3RlOiB0aGlzIGlzIG5vdCBBUEkgYW5kIGlzIG9ubHkgdXNlZCBmb3IgcHJvdmlzaW9uYWwgY29uZmlndXJhdGlvbiB0eXBlcy4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idGFyZ2V0IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgc3RyaW5nIGRlZmluaW5nIHdoZW4gdG8gdXNlIHRoaXMgZXh0ZW5zaW9uLCBlaXRoZXIgYW4gZWRpdG9yIG9yIGNvbnRlbnQgdHlwZSBpZC4gIE11bHRpcGxlIHRhcmdldHMgbWF5IGJlIGdpdmVuIGFzIGEgY29tbWEgZGVsaW1pdGVkIHZhbHVlLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHR5cGUgb2YgY29uZmlndXJhdGlvbiB0byBmaW5kLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uIGNsYXNzIGZvciB0aGlzIHR5cGUuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InByb3Zpc2lvbmFsRGVmaW5pdGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgRGVmaW5lcyBhIHZhbHVlIGZvciBhIHR5cGUgdG8gYmUgdXNlZCBmb3IgdGhlIGdpdmVuIHRhcmdldChzKS4KLU5vdGU6IHRoaXMgaXMgbm90IEFQSSBhbmQgaXMgb25seSB1c2VkIGZvciBwcm92aXNpb25hbCBjb25maWd1cmF0aW9uIHR5cGVzLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIGRlZmluaXRpb24gdG8gZmluZC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhpcyBkZWZpbml0aW9uLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InRhcmdldCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBBIHN0cmluZyBkZWZpbmluZyB3aGVuIHRvIHVzZSB0aGlzIGV4dGVuc2lvbiwgZWl0aGVyIGFuIGVkaXRvciBvciBjb250ZW50IHR5cGUgaWQuICBNdWx0aXBsZSB0YXJnZXRzIG1heSBiZSBnaXZlbiBhcyBhIGNvbW1hIGRlbGltaXRlZCB2YWx1ZS4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgMS4wCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uIAotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0b3JDb25maWd1cmF0aW9uJnF1b3Q7Jmd0OwotICAgICAgJmx0OyEtLSBhc3NvY2lhdGluZyBhIHNvdXJjZSB2aWV3ZXIgY29uZmlndXJhdGlvbiB0byBhbiBpbnB1dCZhcG9zO3MgY29udGVudCB0eXBlLS0mZ3Q7Ci0gICAgICAmbHQ7c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uSFRNTCZxdW90OwotICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUuaHRtbHNvdXJjZSZxdW90Oy8mZ3Q7Ci0gICAgICAmbHQ7IS0tIGFzc29jaWF0aW5nIGFuIG91dGxpbmUgY29uZmlndXJhdGlvbiB0byBhbiBpbnB1dCZhcG9zO3MgY29udGVudCB0eXBlIC0tJmd0OwotICAgICAgJmx0O2NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24mcXVvdDsKLSAgICAgICAgICAgIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sJnF1b3Q7LyZndDsKLSAgICAgICZsdDshLS0gYXNzb2NpYXRpbmcgYSBwcm9wZXJ0eSBzaGVldCBjb25maWd1cmF0aW9uIHRvIG11bHRpcGxlIGNvbnRlbnQgdHlwZXMgLS0mZ3Q7Ci0gICAgICAmbHQ7cHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLSAgICAgICAgICAgIGNsYXNzPSZxdW90O29yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiZxdW90OwotICAgICAgICAgICAgdGFyZ2V0PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UuY29udGVudHR5cGUueG1sLCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UsIG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS5qc3Bzb3VyY2UmcXVvdDsvJmd0OwotICAgJmx0Oy9leHRlbnNpb24mZ3Q7Ci0mbHQ7L3ByZSZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBzZWUgJmx0O2NvZGUmZ3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24mbHQ7L2NvZGUmZ3Q7LCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiZsdDsvY29kZSZndDssICZsdDtjb2RlJmd0O29yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5TdHJ1Y3R1cmVkUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24mbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthIGhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24uZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zY2hlbWEvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zb3VyY2V2YWxpZGF0aW9uLmV4c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNTBkMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NjaGVtYS9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24uZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIiBpZD0ic291cmNldmFsaWRhdGlvbiIgbmFtZT0iU291cmNlIFZhbGlkYXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgcHJvdmlkZWQgdG8gYWxsb3cgY2xpZW50cyB0byBjb250cmlidXRlIGEgdmFsaWRhdG9yICgmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3ImbHQ7L2NvZGUmZ3Q7KQotZm9yIGFzLXlvdS10eXBlIChzb3VyY2UpIHZhbGlkYXRpb24uJmx0O2JyJmd0OwotCi1JZiB5b3VyIHZhbGlkYXRvciBjYW4gaGFuZGxlICZxdW90O3BhcnRpYWwgZG9jdW1lbnQmcXVvdDsgdmFsaWRhdGlvbiwgaXQgc2hvdWxkIGFsc28gaW1wbGVtZW50IElTb3VyY2VWYWxpZGF0b3IuICBUaGUgdmFsaWRhdGUgY2FsbCBvbiBJU291cmNlVmFsaWRhdG9yIGdldHMgcGFzc2VkIGFuIElSZWdpb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRoYXQmYXBvcztzIGRpcnR5LiZsdDticiZndDsKLQotVGhpcyBzaG91bGQgYmUgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuIHZhbGlkYXRpbmcgdGhlIGVudGlyZSBmaWxlIGVhY2ggdGltZSBzb21lb25lIHR5cGVzLiZsdDticiZndDsKLQotVGhlIHZhbGlkYXRvciBpcyBlbmFibGVkIGZvciBzcGVjaWZpYyBjb250ZW50IHR5cGUvcGFydGl0aW9uIGNvbWJpbmF0aW9ucy4mbHQ7YnImZ3Q7Ci0KLVJlcXVpcmVkIHBsdWdpbnMgYXJlOiZsdDticiZndDsKLSAgIG9yZy5lY2xpcHNlLndzdC5zc2UudWkmbHQ7YnImZ3Q7Ci0gICBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8ZWxlbWVudCBuYW1lPSJleHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJ2YWxpZGF0b3IiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjb250ZW50VHlwZUlkZW50aWZpZXIiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNsYXNzIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InNjb3BlIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJwYXJ0aXRpb25UeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImNvbnRlbnRUeXBlSWRlbnRpZmllciI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InBhcnRpdGlvblR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgRXhhbXBsZSBkZW1vbnN0cmF0aW5nIGhvdyBIVE1MVmFsaWRhdG9yIGNvbnRyaWJ1dGVzIHRvIGFzLXlvdS10eXBlIHZhbGlkYXRpb24gaW4gdGhlIHNvdXJjZSBlZGl0b3IuCi0KLSZsdDtwcmUmZ3Q7Ci0gICAmbHQ7ZXh0ZW5zaW9uCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuc291cmNldmFsaWRhdGlvbiZxdW90OyZndDsKLSAgICAgICZsdDt2YWxpZGF0b3IKLSAgICAgICAgICAgIHNjb3BlPSZxdW90O3RvdGFsJnF1b3Q7Ci0gICAgICAgICAgICBjbGFzcz0mcXVvdDtvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5odG1sLkhUTUxWYWxpZGF0b3ImcXVvdDsKLSAgICAgICAgICAgIGlkPSZxdW90O29yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmh0bWxzb3VyY2V2YWxpZGF0b3ImcXVvdDsmZ3Q7Ci0gICAgICAgICAmbHQ7Y29udGVudFR5cGVJZGVudGlmaWVyCi0gICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLmh0bWxzb3VyY2UmcXVvdDsmZ3Q7Ci0gICAgICAgICAgICAmbHQ7cGFydGl0aW9uVHlwZQotICAgICAgICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0Lmh0bWwuSFRNTF9ERUZBVUxUJnF1b3Q7LyZndDsKLSAgICAgICAgICZsdDsvY29udGVudFR5cGVJZGVudGlmaWVyJmd0OwotICAgICAgICAgJmx0O2NvbnRlbnRUeXBlSWRlbnRpZmllcgotICAgICAgICAgICAgICAgaWQ9JnF1b3Q7b3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtwYXJ0aXRpb25UeXBlCi0gICAgICAgICAgICAgICAgICBpZD0mcXVvdDtvcmcuZWNsaXBzZS53c3QuaHRtbC5IVE1MX0RFRkFVTFQmcXVvdDsvJmd0OwotICAgICAgICAgJmx0Oy9jb250ZW50VHlwZUlkZW50aWZpZXImZ3Q7Ci0gICAgICAmbHQ7L3ZhbGlkYXRvciZndDsKLSAgICZsdDsvZXh0ZW5zaW9uJmd0OwotJmx0Oy9wcmUmZ3Q7Ci0mbHQ7cCZndDsKLVVzaW5nIElTb3VyY2VWYWxpZGF0b3IKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotSWYgeW91ciB2YWxpZGF0b3IgY2FuIGhhbmRsZSAmcXVvdDtwYXJ0aWFsIGRvY3VtZW50JnF1b3Q7IHZhbGlkYXRpb24sIGl0IHNob3VsZCAgaW1wbGVtZW50IElTb3VyY2VWYWxpZGF0b3IuICAKLSZsdDsvcCZndDsKLSZsdDtwJmd0OwotVGhlIHZhbGlkYXRlIGNhbGwgb24gSVNvdXJjZVZhbGlkYXRvciBnZXRzIHBhc3NlZCBhbiBJUmVnaW9uIG9mIHRoZSBkb2N1bWVudCB3aGljaCByZXByZXNlbnRzIGp1c3QgdGhlIHBhcnQgdGhhdCZhcG9zO3MgZGlydHkuICBUaGlzIHNob3VsZCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gdmFsaWRhdGluZyB0aGUgZW50aXJlIGZpbGUgZWFjaCB0aW1lIHNvbWVvbmUgdHlwZXMuCi0mbHQ7L3AmZ3Q7Ci0mbHQ7cCZndDsKLUlTb3VyY2VWYWxpZGF0b3IgaGFzIGl0cyAmcXVvdDtjb25uZWN0KElEb2N1bWVudCBkb2MpJnF1b3Q7IG1ldGhvZCBjYWxsZWQgd2hlbiBpdCZhcG9zO3MgaG9va2VkIHVwIHRvIHRoZSBkb2N1bWVudCAod2hlbiB0aGUgZWRpdG9yIGlzIG9wZW5lZCksIGFuZCAmcXVvdDtkaXNjb25uZWN0KElEb2N1bWVudCBkb2MpJnF1b3Q7IGNhbGxlZCB3aGVuIHRoZSBlZGl0b3IgaXMgY2xvc2VkLCB3aGVyZSBhbnkgJnF1b3Q7dW5ob29raW5nJnF1b3Q7IHNob3VsZCB0YWtlIHBsYWNlLgotJmx0Oy9wJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDdXJyZW50bHkgdGhlcmUgaXMgbm8gc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gZm9yIElWYWxpZGF0b3IuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lbmNvZGluZy91aS9FbmNvZGluZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWVuY29kaW5nL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZW5jb2RpbmcvdWkvRW5jb2RpbmdQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmNmM2RkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZW5jb2Rpbmcvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lbmNvZGluZy91aS9FbmNvZGluZ1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVuY29kaW5nLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLnV0aWwuQ29kZWRSZXNvdXJjZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB0aGlzIHNob3VsZCBub3QgYmUgaGFuZGxlZCBieSB0aGUgcGxhdGZvcm0gYW5kIG5vdCBXVFAKLSAqLwotCi1wdWJsaWMgY2xhc3MgRW5jb2RpbmdQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQlCdXR0b24gZlVzZTNCeXRlQk9NV2l0aFVURjhDaGVja0JveCA9IG51bGw7Ci0KLQlwcml2YXRlIEJ1dHRvbiBjcmVhdGVDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCB8IFNXVC5XUkFQKTsKLQkJYnV0dG9uLnNldFRleHQobGFiZWwpOwotCi0JCWJvb2xlYW4gc2VsZWN0aW9uID0gQ29kZWRSZXNvdXJjZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLlVTRV8zQllURV9CT01fV0lUSF9VVEY4KTsKLQkJYnV0dG9uLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0KLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMSwgdHJ1ZSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2UjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQpOwotCi0JCVN0cmluZyBkZXNjcmlwdGlvbiA9IFNTRVVJTWVzc2FnZXMuRW5jb2RpbmdQcmVmZXJlbmNlUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JCQotCQkvLyBJU1NVRTogdGhlIGZvbGxvd2luZyB0byBsaW5lcyBsb29rIHJlZHVuZGFudCwgCi0JCS8vIG5vdCBzdXJlIHdoYXQgd2FzIHRyeWluZyB0byBiZSBhY2NvbXBsaXNoZWQuIAotCQkvLyBNYXkgYmUgZGVhZCBjb2RlLiAKLQkJY3JlYXRlTGFiZWwoY29tcG9zaXRlLCBkZXNjcmlwdGlvbik7Ci0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJU3RyaW5nIGNoZWNrQm94TGFiZWwgPSBTU0VVSU1lc3NhZ2VzLkVuY29kaW5nUHJlZmVyZW5jZVBhZ2VfMTsgLy8kTk9OLU5MUy0xJAotCQlmVXNlM0J5dGVCT01XaXRoVVRGOENoZWNrQm94ID0gY3JlYXRlQ2hlY2tCb3goY29tcG9zaXRlLCBjaGVja0JveExhYmVsKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByaXZhdGUgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UjaW5pdChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWJvb2xlYW4gZGVmYXVsdFNlbGVjdGlvbiA9IENvZGVkUmVzb3VyY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgpOwotCQlmVXNlM0J5dGVCT01XaXRoVVRGOENoZWNrQm94LnNldFNlbGVjdGlvbihkZWZhdWx0U2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCUNvZGVkUmVzb3VyY2VQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuVVNFXzNCWVRFX0JPTV9XSVRIX1VURjgsIGZVc2UzQnl0ZUJPTVdpdGhVVEY4Q2hlY2tCb3guZ2V0U2VsZWN0aW9uKCkpOwotCQlDb2RlZFJlc291cmNlUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL0NvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGIxNWNiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGU7Ci0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERVNJR04gPSAiLmRlc2lnbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTT1VSQ0UgPSAiLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0Q29uZmlndXJhdGlvblBvaW50cyhJRWRpdG9yUGFydCBwYXJ0LCBTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBzdWJDb250ZXh0LCBDbGFzcyByb290Q2xhc3MpIHsKLQkJQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvciBjYWxjdWxhdG9yID0gbmV3IENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IoKTsKLQkJY2FsY3VsYXRvci5zZXRDb250ZW50VHlwZShjb250ZW50VHlwZSk7Ci0JCWNhbGN1bGF0b3Iuc2V0UGFydChwYXJ0KTsKLQkJY2FsY3VsYXRvci5zZXRSb290Q2xhc3Mocm9vdENsYXNzKTsKLQkJY2FsY3VsYXRvci5zZXRTdWJDb250ZXh0KHN1YkNvbnRleHQpOwotCQlyZXR1cm4gY2FsY3VsYXRvci5nZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBmQ29udGVudFR5cGUgPSBudWxsOwotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBmUGFydCA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgZlJvb3RDbGFzcyA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU3ViQ29udGV4dCA9IG51bGw7Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpIHsKLQkJTGlzdCBwb2ludHMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCi0JCUlFZGl0b3JTaXRlIHNpdGUgPSBmUGFydC5nZXRFZGl0b3JTaXRlKCk7Ci0JCVN0cmluZyBpZCA9IHNpdGUuZ2V0SWQoKTsKLQkJaWYgKGlkICE9IG51bGwgJiYgaWQubGVuZ3RoKCkgPiAwICYmICFpZC5lcXVhbHMoZlJvb3RDbGFzcy5nZXROYW1lKCkpKQotCQkJcG9pbnRzLmFkZChpZCk7Ci0KLQkJaWYgKHNpdGUgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JTaXRlKSB7Ci0JCQlTdHJpbmcgbXVsdGlwYWdlSUQgPSAoKE11bHRpUGFnZUVkaXRvclNpdGUpIHNpdGUpLmdldE11bHRpUGFnZUVkaXRvcigpLmdldFNpdGUoKS5nZXRJZCgpOwotCQkJaWYgKCFwb2ludHMuY29udGFpbnMobXVsdGlwYWdlSUQpKQotCQkJCXBvaW50cy5hZGQobXVsdGlwYWdlSUQpOwotCQkJU3RyaW5nIHNvdXJjZVBhZ2VJRCA9ICgoTXVsdGlQYWdlRWRpdG9yU2l0ZSkgc2l0ZSkuZ2V0TXVsdGlQYWdlRWRpdG9yKCkuZ2V0U2l0ZSgpLmdldElkKCkgKyAiLnNvdXJjZSI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICghcG9pbnRzLmNvbnRhaW5zKHNvdXJjZVBhZ2VJRCkpCi0JCQkJcG9pbnRzLmFkZChzb3VyY2VQYWdlSUQpOwotCQl9Ci0JCWlmIChzaXRlIGluc3RhbmNlb2YgTXVsdGlQYWdlRWRpdG9yU2l0ZSkgewotCQkJU3RyaW5nIG11bHRpcGFnZUNsYXNzTmFtZSA9ICgoTXVsdGlQYWdlRWRpdG9yU2l0ZSkgc2l0ZSkuZ2V0TXVsdGlQYWdlRWRpdG9yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQlpZiAoIXBvaW50cy5jb250YWlucyhtdWx0aXBhZ2VDbGFzc05hbWUpKQotCQkJCXBvaW50cy5hZGQobXVsdGlwYWdlQ2xhc3NOYW1lKTsKLQkJfQotCQlDbGFzcyBlZGl0b3JDbGFzcyA9IGZQYXJ0LmdldENsYXNzKCk7Ci0JCXdoaWxlIChlZGl0b3JDbGFzcyAhPSBudWxsICYmIGZSb290Q2xhc3MgIT0gbnVsbCAmJiAhZWRpdG9yQ2xhc3MuZXF1YWxzKGZSb290Q2xhc3MpKSB7Ci0JCQlpZiAoIXBvaW50cy5jb250YWlucyhlZGl0b3JDbGFzcy5nZXROYW1lKCkpKQotCQkJCXBvaW50cy5hZGQoZWRpdG9yQ2xhc3MuZ2V0TmFtZSgpKTsKLQkJCWVkaXRvckNsYXNzID0gZWRpdG9yQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotCQl9Ci0KLQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoZkNvbnRlbnRUeXBlKTsKLQkJd2hpbGUgKGNvbnRlbnRUeXBlICE9IG51bGwgJiYgIWNvbnRlbnRUeXBlLmdldElkKCkuZXF1YWxzKElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVCkpIHsKLQkJCWlmICghcG9pbnRzLmNvbnRhaW5zKGNvbnRlbnRUeXBlLmdldElkKCkpKQotCQkJCXBvaW50cy5hZGQoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQljb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCX0KLQotCQlpZiAoIXBvaW50cy5jb250YWlucyhmUm9vdENsYXNzLmdldE5hbWUoKSkpCi0JCQlwb2ludHMuYWRkKGZSb290Q2xhc3MuZ2V0TmFtZSgpKTsKLQkJcmV0dXJuIChTdHJpbmdbXSkgcG9pbnRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBjb250ZW50VHlwZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgewotCQlyZXR1cm4gZkNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcGFydC4KLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0UGFydCgpIHsKLQkJcmV0dXJuIGZQYXJ0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcm9vdENsYXNzLgotCSAqLwotCXB1YmxpYyBDbGFzcyBnZXRSb290Q2xhc3MoKSB7Ci0JCXJldHVybiBmUm9vdENsYXNzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgc3ViQ29udGV4dC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN1YkNvbnRleHQoKSB7Ci0JCXJldHVybiBmU3ViQ29udGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZW50VHlwZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCWZDb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJ0Ci0JICogICAgICAgICAgICBUaGUgcGFydCB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0UGFydChJRWRpdG9yUGFydCBwYXJ0KSB7Ci0JCWZQYXJ0ID0gcGFydDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcm9vdENsYXNzCi0JICogICAgICAgICAgICBUaGUgcm9vdENsYXNzIHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSb290Q2xhc3MoQ2xhc3Mgcm9vdENsYXNzKSB7Ci0JCWZSb290Q2xhc3MgPSByb290Q2xhc3M7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHN1YkNvbnRleHQKLQkgKiAgICAgICAgICAgIFRoZSBzdWJDb250ZXh0IHRvIHNldC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdWJDb250ZXh0KFN0cmluZyBzdWJDb250ZXh0KSB7Ci0JCWZTdWJDb250ZXh0ID0gc3ViQ29udGV4dDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvSVNlbGZWYWxpZGF0ZUVkaXRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRlZGMyMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL0lTZWxmVmFsaWRhdGVFZGl0QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9uczsKLQotCi0KLS8qKgotICogVGhpcyBpcyBhIG1hcmtlciBpbnRlcmZhY2UgdG8gY29udHJvbCBWYWxpZGF0ZUVkaXQgY2FsbCBVc3VhbGx5IGZyYW1ld29yawotICogY2FsbHMgSUV4dGVuZGVkU2ltcGxlRWRpdG9yI3ZhbGlkYXRlRWRpdCgpIGJlZm9yZSBjYWxsaW5nCi0gKiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24ncyBydW4oKSBtZXRob2QuIEhvd2V2ZXIsIGlmIHRoZSBhY3Rpb24gaW1wbGVtZW50cwotICogdGhpcyBpbnRlcmZhY2UsIGZyYW1ld29yayB3b24ndCBjYWxsIHZhbGlkYXRlRWRpdCgpIG1ldGhvZC4KLSAqIAotICogVGhlIGFjdGlvbiBzaG91bGQgY2FsbCB2YWxpZGF0ZUVkaXQoKSBhdCB0aGVpciBvd24gYXBwcm9wcmlhdGUgdGltaW5nLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTZWxmVmFsaWRhdGVFZGl0QWN0aW9uIHsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9JU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzBlZGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgY29udmVuaWVudCBmdW5jdGlvbnMgZm9yIGVkaXRvcnMgdGhhdCBtYXkgbm90IGJlCi0gKiBJVGV4dEVkaXRvcnMsIGJ1dCBuZWVkIHRvIGV4cG9zZSBwcm9wZXJ0aWVzIHVzdWFsbHkgZm91bmQgaW4gdGV4dCBlZGl0b3JzCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgewotCi0JLyoqCi0JICogQHJldHVybiB0aGUgZG9jdW1lbnQgb2Zmc2V0IGF0IHdoaWNoIHRoZSBDYXJldCBpcyBsb2NhdGVkCi0JICovCi0JcHVibGljIGludCBnZXRDYXJldE9mZnNldCgpOwotCi0JLyoqCi0JICogQHJldHVybiB0aGUgSURvY3VtZW50IGJlaW5nIGVkaXRlZC4gSWYgdGhpcyBlZGl0b3Igc3VwcG9ydHMgbXVsdGlwbGUKLQkgKiAgICAgICAgIGRvY3VtZW50cywgdGhlIGRvY3VtZW50IGN1cnJlbnRseSBwb3NzZXNzaW5nIHRoZSBjYXJldCB3aWxsIGJlCi0JICogICAgICAgICByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFRoZSBJRWRpdG9yUGFydCBpbnN0YW5jZSBmb3IgdGhpcyBlZGl0b3IgdGhhdCBpcyBrbm93biB0byB0aGUKLQkgKiAgICAgICAgIHdvcmtiZW5jaC4KLQkgKi8KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpOwotCi0JLyoqCi0JICogQHJldHVybiBUaGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aGluIHRoZSBlZGl0b3IuIEltcGxlbWVudG9ycyBtYXkKLQkgKiAgICAgICAgIHN1cHBvcnQgb3RoZXIgdHlwZXMgb2Ygc2VsZWN0aW9uLgotCSAqLwotCXB1YmxpYyBJVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JQnJlYWtwb2ludENvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50Q29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGU0NDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lCcmVha3BvaW50Q29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50OwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUJyZWFrcG9pbnRDb25zdGFudHMgewotCVN0cmluZyBBVFRSX0hJRERFTiA9ICJoaWRkZW4iOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFJFU09VUkNFX1BBVEggPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLmJyZWFrcG9pbnQucGF0aCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JQnJlYWtwb2ludFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUJyZWFrcG9pbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTg1NWQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtZXh0ZW5zaW9ucy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL2V4dGVuc2lvbnMvYnJlYWtwb2ludC9JQnJlYWtwb2ludFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRvIHByb3ZpZGUgYnJlYWtwb2ludCBjcmVhdGlvbgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElCcmVha3BvaW50UHJvdmlkZXIgewotCi0JLyoqCi0JICogQWRkcyBicmVha3BvaW50IHRvIHNwZWNpZmllZCBwb3NpdGlvbgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgSURvY3VtZW50IG9iamVjdAotCSAqIEBwYXJhbSBpbnB1dAotCSAqICAgICAgICAgICAgY3VycmVudCBlZGl0b3IgaW5wdXQsIG5vdCBuZWNlc3NhcmlseSBhbiBJRmlsZUVkaXRvcklucHV0IG9yCi0JICogICAgICAgICAgICBsaW5rZWQgdG8gYSByZXNvdXJjZSBpbiBhbnkgd2F5Ci0JICogQHBhcmFtIGxpbmVOdW1iZXIKLQkgKiAgICAgICAgICAgIGN1cnJlbnQgbGluZSBudW1iZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBjdXJyZW50IGNhcmV0IG9mZnNldAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqIEByZXR1cm4gSVN0YXR1cyB0aGUgc3RhdHVzIGFmdGVyIGJlaW5nIGFza2VkIHRvIGFkZCBhIGJyZWFrcG9pbnQuIFRoZQotCSAqICAgICAgICAgU2V2ZXJpdHkgb2YgRVJST1Igc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB0aGUgbG9jYXRpb24KLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIGlzIGJvdGggdmFsaWQgZm9yIGEgYnJlYWtwb2ludCBhbmQgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgYWRkZWQuCi0JICovCi0JSVN0YXR1cyBhZGRCcmVha3BvaW50KElEb2N1bWVudCBkb2N1bWVudCwgSUVkaXRvcklucHV0IGlucHV0LCBpbnQgbGluZU51bWJlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZnJvbSBlZGl0b3IgaW5wdXQKLQkgKiAKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuIElSZXNvdXJjZQotCSAqLwotCUlSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpOwotCi0JLyoqCi0JICogU2V0IElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIG9iamVjdAotCSAqIAotCSAqIEBwYXJhbSB0b29sCi0JICogICAgICAgICAgICBJU291cmNlRWRpdGluZ1RleHRUb29scyBvYmplY3QKLQkgKi8KLQl2b2lkIHNldFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNDE0NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L0lFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTdG9yYWdlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWxlbWVudFN0YXRlTGlzdGVuZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0IGV4dGVuZHMgSVN0b3JhZ2VFZGl0b3JJbnB1dCB7Ci0JLyoqCi0JICogQWRkcyB0aGUgZ2l2ZW4gZWxlbWVudCBzdGF0ZSBsaXN0ZW5lciB0byB0aGlzIGlucHV0LiBIYXMgbm8gZWZmZWN0IGlmCi0JICogYW4gaWRlbnRpY2FsIGxpc3RlbmVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4gVHlwaWNhbGx5IHVzZWQgYnkgdGhlCi0JICogSURvY3VtZW50UHJvdmlkZXIgdG8gcmVnaXN0ZXIgaXRzZWxmIGZvciBjaGFuZ2Ugbm90aWZpY2F0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBsaXN0ZW5lcgotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyCi0JICovCi0Jdm9pZCBhZGRFbGVtZW50U3RhdGVMaXN0ZW5lcihJRWxlbWVudFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBzdGF0ZSBsaXN0ZW5lciBmcm9tIHRoaXMgaW5wdXQuIEhhcyBubyBhZmZlY3QKLQkgKiBpZiBhbiBpZGVudGljYWwgbGlzdGVuZXIgaXMgbm90IHJlZ2lzdGVyZWQuCi0JICogCi0JICogQHBhcmFtIGxpc3RlbmVyCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIKLQkgKi8KLQl2b2lkIHJlbW92ZUVsZW1lbnRTdGF0ZUxpc3RlbmVyKElFbGVtZW50U3RhdGVMaXN0ZW5lciBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTm9kZUxvY2F0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTm9kZUxvY2F0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NzRkOTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L05vZGVMb2NhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludDsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIE5vZGVMb2NhdGlvbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgZW5kIG9mZnNldCBvZiB0aGUgZW5kIHRhZywgLTEgb2YgdGhlcmUgaXMgbm8gZW5kCi0JICogdGFnCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRFbmRUYWdFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50IHN0YXJ0IG9mZnNldCBvZiB0aGUgZW5kIHRhZywgLTEgb2YgdGhlcmUgaXMgbm8gZW5kCi0JICogdGFnCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWludCBnZXRFbmRUYWdTdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZG9jdW1lbnQgZW5kIG9mZnNldCBvZiB0aGUgc3RhcnQgdGFnLCAtMSBvZiB0aGVyZSBpcyBubwotCSAqIHN0YXJ0IHRhZwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0U3RhcnRUYWdFbmRPZmZzZXQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGRvY3VtZW50IHN0YXJ0IG9mZnNldCBvZiB0aGUgc3RhcnQgdGFnLCAtMSBvZiB0aGVyZSBpcyBubwotCSAqIHN0YXJ0IHRhZwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlpbnQgZ2V0U3RhcnRUYWdTdGFydE9mZnNldCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy1leHRlbnNpb25zL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZXh0ZW5zaW9ucy9icmVha3BvaW50L051bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3NThhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLWV4dGVuc2lvbnMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9leHRlbnNpb25zL2JyZWFrcG9pbnQvTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0KLXB1YmxpYyBjbGFzcyBOdWxsU291cmNlRWRpdGluZ1RleHRUb29scyBpbXBsZW1lbnRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRCA9ICJzb3VyY2VlZGl0aW5ndGV4dHRvb2xzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgSVRleHRFZGl0b3IgZlRleHRFZGl0b3I7Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKTsKLQl9Ci0KLQlwcml2YXRlIE51bGxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Q2FyZXRPZmZzZXQoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsID0gZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbCBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQlyZXR1cm4gKChJVGV4dFNlbGVjdGlvbikgc2VsKS5nZXRPZmZzZXQoKTsKLQkJfQotCQlyZXR1cm4gLTE7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQl9Ci0KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0RWRpdG9yOwotCX0KLQotCXB1YmxpYyBJVGV4dFNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oKSB7Ci0JCWlmIChmVGV4dEVkaXRvciAhPSBudWxsKQotCQkJcmV0dXJuIChJVGV4dFNlbGVjdGlvbikgZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJcmV0dXJuIFRleHRTZWxlY3Rpb24uZW1wdHlTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUZXh0RWRpdG9yKElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlmVGV4dEVkaXRvciA9IGVkaXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRXhjbHVzaW9uc1RhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0V4Y2x1c2lvbnNUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNmY2RmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRXhjbHVzaW9uc1RhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklQcmVmZXJlbmNlc1NlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklTY29wZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLkZpbGVUYXNrU2Nhbm5lclJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrVGFnUHJlZmVyZW5jZUtleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuU29ydGVyOwotCi1jbGFzcyBFeGNsdXNpb25zVGFiIGltcGxlbWVudHMgSVByZWZlcmVuY2VUYWIgewotCXByaXZhdGUgY2xhc3MgQXJyYXlUcmVlQ29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwdWJsaWMgQXJyYXlUcmVlQ29udGVudFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pCi0JCQkJcmV0dXJuIGZDb250ZW50VHlwZVNvcnRlci5zb3J0KChPYmplY3RbXSkgcGFyZW50RWxlbWVudCk7Ci0JCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oaW5wdXRFbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCkubGVuZ3RoID4gMDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50VHlwZUxhYmVsUHJvdmlkZXIgZXh0ZW5kcyBMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJT2JqZWN0IG8gPSBlbGVtZW50OwotCQkJCWlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJCW8gPSBmQ29udGVudFR5cGVNYW5hZ2VyLmdldENvbnRlbnRUeXBlKG8udG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWlmIChvIGluc3RhbmNlb2YgSUNvbnRlbnRUeXBlKSB7Ci0JCQkJCXJldHVybiAoKElDb250ZW50VHlwZSkgbykuZ2V0TmFtZSgpOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdXBlci5nZXRUZXh0KGVsZW1lbnQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBRdWlja1NvcnRlciB0aGF0IHNvcnRzIGFuZCByZXR1cm5zIGEgSUNvbnRlbnRUeXBlLXR5cGVkIGFycmF5Ci0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb250ZW50VHlwZVNvcnRlciBleHRlbmRzIFNvcnRlciB7Ci0JCXByaXZhdGUgQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3QgZWxlbWVudE9uZSwgT2JqZWN0IGVsZW1lbnRUd28pIHsKLQkJCXJldHVybiAoY29sbGF0b3IuY29tcGFyZSgoKElDb250ZW50VHlwZSkgZWxlbWVudE9uZSkuZ2V0TmFtZSgpLCAoKElDb250ZW50VHlwZSkgZWxlbWVudFR3bykuZ2V0TmFtZSgpKSkgPCAwOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIHNvcnQoT2JqZWN0W10gdW5Tb3J0ZWRDb2xsZWN0aW9uKSB7Ci0JCQlPYmplY3RbXSB0eXBlcyA9IHN1cGVyLnNvcnQodW5Tb3J0ZWRDb2xsZWN0aW9uKTsKLQkJCUlDb250ZW50VHlwZVtdIHNvcnRlZFR5cGVzID0gbmV3IElDb250ZW50VHlwZVt0eXBlcy5sZW5ndGhdOwotCQkJaWYgKHR5cGVzLmxlbmd0aCA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHR5cGVzLCAwLCBzb3J0ZWRUeXBlcywgMCwgc29ydGVkVHlwZXMubGVuZ3RoKTsKLQkJCX0KLQkJCXJldHVybiBzb3J0ZWRUeXBlczsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgQ29udGVudFR5cGVUcmVlUHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0JCXB1YmxpYyBDb250ZW50VHlwZVRyZWVQcm92aWRlcigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGxlZnQsIE9iamVjdCByaWdodCkgewotCQkJcmV0dXJuIGxlZnQgPT0gbnVsbCA/IHJpZ2h0ID09IG51bGwgOiAoKHJpZ2h0ICE9IG51bGwpICYmIGxlZnQuZXF1YWxzKHJpZ2h0KSk7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCQlyZXR1cm4gKE9iamVjdFtdKSBwYXJlbnRFbGVtZW50OwotCQkJfQotCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGVudFR5cGUpIHsKLQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCQlJQ29udGVudFR5cGVbXSBhbGxUeXBlcyA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0QWxsQ29udGVudFR5cGVzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxUeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIWZTdXBwb3J0ZWRDb250ZW50VHlwZXMuY29udGFpbnMoYWxsVHlwZXNbaV0pICYmIGVxdWFscyhhbGxUeXBlc1tpXS5nZXRCYXNlVHlwZSgpLCBwYXJlbnRFbGVtZW50KSkgewotCQkJCQkJZWxlbWVudHMuYWRkKGFsbFR5cGVzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm4gZkNvbnRlbnRUeXBlU29ydGVyLnNvcnQoZWxlbWVudHMudG9BcnJheSgpKTsKLQkJCX0KLQkJCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBnZXRDaGlsZHJlbihpbnB1dEVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCU9iamVjdCBwYXJlbnQgPSBudWxsOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ29udGVudFR5cGUpIHsKLQkJCQlwYXJlbnQgPSAoKElDb250ZW50VHlwZSkgZWxlbWVudCkuZ2V0QmFzZVR5cGUoKTsKLQkJCX0KLQkJCXJldHVybiBwYXJlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCX0KLQotCS8qKgotCSAqIEEgUXVpY2tTb3J0ZXIgdGhhdCBzb3J0cyBhbmQgcmV0dXJucyBhIFN0cmluZy10eXBlZCBhcnJheQotCSAqLwotCXByaXZhdGUgY2xhc3MgU3RyaW5nU29ydGVyIGV4dGVuZHMgU29ydGVyIHsKLQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZShMb2NhbGUuRU5HTElTSCk7Ci0KLQkJcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3QgZWxlbWVudE9uZSwgT2JqZWN0IGVsZW1lbnRUd28pIHsKLQkJCXJldHVybiAoY29sbGF0b3IuY29tcGFyZShlbGVtZW50T25lLnRvU3RyaW5nKCksIGVsZW1lbnRUd28udG9TdHJpbmcoKSkgPCAwKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBzb3J0KE9iamVjdFtdIHVuU29ydGVkQ29sbGVjdGlvbikgewotCQkJT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiA9IHN1cGVyLnNvcnQodW5Tb3J0ZWRDb2xsZWN0aW9uKTsKLQkJCVN0cmluZ1tdIHN0cmluZ3MgPSBuZXcgU3RyaW5nW3NvcnRlZENvbGxlY3Rpb24ubGVuZ3RoXTsKLQkJCS8vIGNvcHkgdGhlIGFycmF5IHNvIGNhbiByZXR1cm4gYSBuZXcgc29ydGVkIGNvbGxlY3Rpb24KLQkJCWlmIChzdHJpbmdzLmxlbmd0aCA+IDApIHsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KHNvcnRlZENvbGxlY3Rpb24sIDAsIHN0cmluZ3MsIDAsIHN0cmluZ3MubGVuZ3RoKTsKLQkJCX0KLQkJCXJldHVybiBzdHJpbmdzOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcHJlZmVyZW5jZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBDaGVja2JveFRyZWVWaWV3ZXIgZkNvbnRlbnRUeXBlTGlzdDsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlTWFuYWdlciBmQ29udGVudFR5cGVNYW5hZ2VyID0gbnVsbDsKLQotCUNvbnRlbnRUeXBlU29ydGVyIGZDb250ZW50VHlwZVNvcnRlciA9IG5ldyBDb250ZW50VHlwZVNvcnRlcigpOwotCi0JcHJpdmF0ZSBJQ29udGVudFR5cGVbXSBmSWdub3JlQ29udGVudFR5cGVzID0gbnVsbDsKLQotCXByaXZhdGUgSUNvbnRlbnRUeXBlW10gZk9yaWdpbmFsSWdub3JlQ29udGVudFR5cGVzID0gbnVsbDsKLQotCXByaXZhdGUgVGFza1RhZ1ByZWZlcmVuY2VQYWdlIGZPd25lciA9IG51bGw7Ci0KLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIExpc3QgZlN1cHBvcnRlZENvbnRlbnRUeXBlcyA9IG51bGw7Ci0KLQlwdWJsaWMgRXhjbHVzaW9uc1RhYihUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgcGFyZW50LCBJUHJlZmVyZW5jZXNTZXJ2aWNlIHByZWZlcmVuY2VzU2VydmljZSwgSVNjb3BlQ29udGV4dFtdIGxvb2t1cE9yZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lciA9IHBhcmVudDsKLQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXIgPSBsb29rdXBPcmRlcjsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IHByZWZlcmVuY2VzU2VydmljZTsKLQkJZkNvbnRlbnRUeXBlTWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCi0JCVN0cmluZ1tdIHN1cHBvcnRlZENvbnRlbnRUeXBlSURzID0gRmlsZVRhc2tTY2FubmVyUmVnaXN0cnlSZWFkZXIuZ2V0SW5zdGFuY2UoKS5nZXRTdXBwb3J0ZWRDb250ZW50VHlwZUlkcygpOwotCQlmU3VwcG9ydGVkQ29udGVudFR5cGVzID0gbmV3IEFycmF5TGlzdChzdXBwb3J0ZWRDb250ZW50VHlwZUlEcy5sZW5ndGgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cHBvcnRlZENvbnRlbnRUeXBlSURzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoc3VwcG9ydGVkQ29udGVudFR5cGVJRHNbaV0pOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWZTdXBwb3J0ZWRDb250ZW50VHlwZXMuYWRkKHR5cGUpOwotCQkJfQotCQl9Ci0JCVN0cmluZ1tdIGlnbm9yZUNvbnRlbnRUeXBlcyA9IFN0cmluZ1V0aWxzLnVucGFjayhmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldFN0cmluZyhUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSwgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVELCBTU0VDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVEKSwgZlByZWZlcmVuY2VzTG9va3VwT3JkZXIpKTsKLQkJTGlzdCBjb250ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgaWdub3JlQ29udGVudFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoaWdub3JlQ29udGVudFR5cGVzW2ldKTsKLQkJCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCQljb250ZW50VHlwZXMuYWRkKHR5cGUpOwotCQkJfQotCQl9Ci0JCWZPcmlnaW5hbElnbm9yZUNvbnRlbnRUeXBlcyA9IGZJZ25vcmVDb250ZW50VHlwZXMgPSAoSUNvbnRlbnRUeXBlW10pIGNvbnRlbnRUeXBlcy50b0FycmF5KG5ldyBJQ29udGVudFR5cGVbY29udGVudFR5cGVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSB0YWJGb2xkZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgdHJ1ZSkpOwotCQlUZXh0IGRlc2NyaXB0aW9uID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJZGVzY3JpcHRpb24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdFeGNsdXNpb25UYWJfMDIpOwotCQlkZXNjcmlwdGlvbi5zZXRCYWNrZ3JvdW5kKGNvbXBvc2l0ZS5nZXRCYWNrZ3JvdW5kKCkpOwotCi0JCWZDb250ZW50VHlwZUxpc3QgPSBuZXcgQ2hlY2tib3hUcmVlVmlld2VyKGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCWZDb250ZW50VHlwZUxpc3Quc2V0TGFiZWxQcm92aWRlcihuZXcgQ29udGVudFR5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQlmQ29udGVudFR5cGVMaXN0LnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlUcmVlQ29udGVudFByb3ZpZGVyKCkpOwotCi0JCWZDb250ZW50VHlwZUxpc3Quc2V0SW5wdXQoZlN1cHBvcnRlZENvbnRlbnRUeXBlcy50b0FycmF5KCkpOwotCQlmQ29udGVudFR5cGVMaXN0LnNldENoZWNrZWRFbGVtZW50cyhmU3VwcG9ydGVkQ29udGVudFR5cGVzLnRvQXJyYXkoKSk7Ci0JCWZDb250ZW50VHlwZUxpc3QuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZJZ25vcmVDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZChmSWdub3JlQ29udGVudFR5cGVzW2ldLCBmYWxzZSk7Ci0JCX0KLQotCQlCdXR0b24gc2VsZWN0QWxsID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5QVVNIKTsKLQkJc2VsZWN0QWxsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNyk7Ci0JCXNlbGVjdEFsbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCQlzZWxlY3RBbGwuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJZkNvbnRlbnRUeXBlTGlzdC5zZXRDaGVja2VkRWxlbWVudHMoZlN1cHBvcnRlZENvbnRlbnRUeXBlcy50b0FycmF5KCkpOwotCQkJfQotCQl9KTsKLQotCQlCdXR0b24gc2VsZWN0Tm9uZSA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuUFVTSCk7Ci0JCXNlbGVjdE5vbmUuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE4KTsKLQkJc2VsZWN0Tm9uZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCQlzZWxlY3ROb25lLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKG5ldyBPYmplY3RbMF0pOwotCQkJfQotCQl9KTsKLQotCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSkpOwotCi0JCVRleHQgYWZmZWN0ZWRUeXBlc0xhYmVsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZKTsKLQkJYWZmZWN0ZWRUeXBlc0xhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UsIDIsIDEpKTsKLQkJYWZmZWN0ZWRUeXBlc0xhYmVsLnNldEJhY2tncm91bmQoY29tcG9zaXRlLmdldEJhY2tncm91bmQoKSk7Ci0JCWFmZmVjdGVkVHlwZXNMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ0V4Y2x1c2lvblRhYl8wMyk7Ci0KLQkJZmluYWwgVHJlZVZpZXdlciBjb250ZW50VHlwZVRyZWVWaWV3ZXIgPSBuZXcgVHJlZVZpZXdlcihjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuc2V0TGFiZWxQcm92aWRlcihuZXcgQ29udGVudFR5cGVMYWJlbFByb3ZpZGVyKCkpOwotCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDb250ZW50VHlwZVRyZWVQcm92aWRlcigpKTsKLQkJY29udGVudFR5cGVUcmVlVmlld2VyLnNldElucHV0KG5ldyBPYmplY3RbMF0pOwotCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuZ2V0VHJlZSgpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCi0JCWZDb250ZW50VHlwZUxpc3QuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQlPYmplY3RbXSBvID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJCQkJY29udGVudFR5cGVUcmVlVmlld2VyLnNldElucHV0KG8pOwotCQkJCQljb250ZW50VHlwZVRyZWVWaWV3ZXIuZXhwYW5kQWxsKCk7Ci0JCQkJCWlmIChvLmxlbmd0aCA+IDApIHsKLQkJCQkJCWNvbnRlbnRUeXBlVHJlZVZpZXdlci5yZXZlYWwob1swXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ0V4Y2x1c2lvblRhYl8wMTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQXBwbHkoKSB7Ci0JCXNhdmUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMb2FkaW5nIGRlZmF1bHRzIGluICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlJRWNsaXBzZVByZWZlcmVuY2VzW10gZGVmYXVsdFByZWZlcmVuY2VzID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXNbZlByZWZlcmVuY2VzTG9va3VwT3JkZXIubGVuZ3RoIC0gMV07Ci0JCWZvciAoaW50IGkgPSAxOyBpIDwgZGVmYXVsdFByZWZlcmVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWZhdWx0UHJlZmVyZW5jZXNbaSAtIDFdID0gZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbaV0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSk7Ci0JCX0KLQkJU3RyaW5nW10gZGVmYXVsdElnbm9yZVR5cGVzID0gU3RyaW5nVXRpbHMudW5wYWNrKGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCwgbnVsbCwgZGVmYXVsdFByZWZlcmVuY2VzKSk7IC8vJE5PTi1OTFMtMSQKLQotCQlMaXN0IGNvbnRlbnRUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZWZhdWx0SWdub3JlVHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCUlDb250ZW50VHlwZSB0eXBlID0gZkNvbnRlbnRUeXBlTWFuYWdlci5nZXRDb250ZW50VHlwZShkZWZhdWx0SWdub3JlVHlwZXNbaV0pOwotCQkJaWYgKHR5cGUgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRUeXBlcy5hZGQodHlwZSk7Ci0JCQl9Ci0JCX0KLQkJZklnbm9yZUNvbnRlbnRUeXBlcyA9IChJQ29udGVudFR5cGVbXSkgY29udGVudFR5cGVzLnRvQXJyYXkobmV3IElDb250ZW50VHlwZVtjb250ZW50VHlwZXMuc2l6ZSgpXSk7Ci0JCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZEVsZW1lbnRzKGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0QWxsQ29udGVudFR5cGVzKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZJZ25vcmVDb250ZW50VHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZDb250ZW50VHlwZUxpc3Quc2V0Q2hlY2tlZChmSWdub3JlQ29udGVudFR5cGVzW2ldLCBmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtT2soKSB7Ci0JCUxpc3QgaWdub3JlZElkcyA9IHNhdmUoKTsKLQkJU3RyaW5nW10gaWdub3JlSURzID0gKFN0cmluZ1tdKSBuZXcgU3RyaW5nU29ydGVyKCkuc29ydChpZ25vcmVkSWRzLnRvQXJyYXkoKSk7Ci0JCWZJZ25vcmVDb250ZW50VHlwZXMgPSBuZXcgSUNvbnRlbnRUeXBlW2lnbm9yZUlEcy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGlnbm9yZUlEcy5sZW5ndGg7IGkrKykgewotCQkJZklnbm9yZUNvbnRlbnRUeXBlc1tpXSA9IGZDb250ZW50VHlwZU1hbmFnZXIuZ2V0Q29udGVudFR5cGUoaWdub3JlSURzW2ldKTsKLQkJfQotCi0JCWlmICghQXJyYXlzLmVxdWFscyhmT3JpZ2luYWxJZ25vcmVDb250ZW50VHlwZXMsIGZJZ25vcmVDb250ZW50VHlwZXMpKSB7Ci0JCQlmT3duZXIucmVxdWVzdFJlZGV0ZWN0aW9uKCk7Ci0JCX0KLQkJZk9yaWdpbmFsSWdub3JlQ29udGVudFR5cGVzID0gZklnbm9yZUNvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcml2YXRlIExpc3Qgc2F2ZSgpIHsKLQkJTGlzdCBpZ25vcmVkSWRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlMaXN0IGNoZWNrZWQgPSBBcnJheXMuYXNMaXN0KGZDb250ZW50VHlwZUxpc3QuZ2V0Q2hlY2tlZEVsZW1lbnRzKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdXBwb3J0ZWRDb250ZW50VHlwZXMuc2l6ZSgpOyBpKyspIHsKLQkJCWlmICghY2hlY2tlZC5jb250YWlucyhmU3VwcG9ydGVkQ29udGVudFR5cGVzLmdldChpKSkpIHsKLQkJCQlpZ25vcmVkSWRzLmFkZCgoKElDb250ZW50VHlwZSkgZlN1cHBvcnRlZENvbnRlbnRUeXBlcy5nZXQoaSkpLmdldElkKCkpOwotCQkJfQotCQl9Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXNbXSBkZWZhdWx0UHJlZmVyZW5jZXMgPSBuZXcgSUVjbGlwc2VQcmVmZXJlbmNlc1tmUHJlZmVyZW5jZXNMb29rdXBPcmRlci5sZW5ndGggLSAxXTsKLQkJZm9yIChpbnQgaSA9IDE7IGkgPCBkZWZhdWx0UHJlZmVyZW5jZXMubGVuZ3RoOyBpKyspIHsKLQkJCWRlZmF1bHRQcmVmZXJlbmNlc1tpIC0gMV0gPSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcltpXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKTsKLQkJfQotCi0JCVN0cmluZyBkZWZhdWx0SWdub3JlZENvbnRlbnRUeXBlSWRzID0gU3RyaW5nVXRpbHMucGFjaygoU3RyaW5nW10pIG5ldyBTdHJpbmdTb3J0ZXIoKS5zb3J0KFN0cmluZ1V0aWxzLnVucGFjayhmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsICIiLCBkZWZhdWx0UHJlZmVyZW5jZXMpKSkpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBpZ25vcmVkQ29udGVudFR5cGVJZHMgPSBTdHJpbmdVdGlscy5wYWNrKChTdHJpbmdbXSkgbmV3IFN0cmluZ1NvcnRlcigpLnNvcnQoaWdub3JlZElkcy50b0FycmF5KCkpKTsKLQkJaWYgKGlnbm9yZWRDb250ZW50VHlwZUlkcy5lcXVhbHMoZGVmYXVsdElnbm9yZWRDb250ZW50VHlwZUlkcykpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19DT05URU5UVFlQRVNfSUdOT1JFRCArICIgZnJvbSBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQgKyAiIFwiIiArIGlnbm9yZWRDb250ZW50VHlwZUlkcyArICJcIiBpbiBzY29wZSAiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TmFtZSgpICsgIjoiICsgZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCX0KLQkJCWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5vZGUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX05PREUpLnB1dChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfQ09OVEVOVFRZUEVTX0lHTk9SRUQsIGlnbm9yZWRDb250ZW50VHlwZUlkcyk7Ci0JCX0KLQkJcmV0dXJuIGlnbm9yZWRJZHM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL01haW5UYWIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9NYWluVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNDU2NWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL01haW5UYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJsZUNvbHVtbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50YXNrcy5UYXNrVGFnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrVGFnUHJlZmVyZW5jZUtleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotY2xhc3MgTWFpblRhYiBpbXBsZW1lbnRzIElQcmVmZXJlbmNlVGFiIHsKLQlwdWJsaWMgY2xhc3MgVGFza1RhZ0RpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0JCXB1YmxpYyBUYXNrVGFnIHRhc2tUYWcgPSBudWxsOwotCi0JCUNvbWJvIHByaW9yaXR5Q29tYm8gPSBudWxsOwotCQlUZXh0IHRhZ1RleHQgPSBudWxsOwotCi0JCXB1YmxpYyBUYXNrVGFnRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsKSB7Ci0JCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU2hlbGwoU2hlbGwgbmV3U2hlbGwpIHsKLQkJCXN1cGVyLmNvbmZpZ3VyZVNoZWxsKG5ld1NoZWxsKTsKLQkJCW5ld1NoZWxsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl81KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUJ1dHRvbkJhcihwYXJlbnQpOwotCQkJZ2V0QnV0dG9uKElEaWFsb2dDb25zdGFudHMuT0tfSUQpLnNldEVuYWJsZWQodGFza1RhZyA9PSBudWxsIHx8IHRhc2tUYWcuZ2V0VGFnKCkubGVuZ3RoKCkgPiAwKTsKLQkJCXJldHVybiBjOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCUdyaWREYXRhIGdyaWREYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQlncmlkRGF0YS53aWR0aEhpbnQgPSBwYXJlbnQuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS53aWR0aCAvIDU7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShncmlkRGF0YSk7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl82KTsgLy8kTk9OLU5MUy0xJAotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQl0YWdUZXh0ID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQl0YWdUZXh0LnNldFRleHQodGFza1RhZyAhPSBudWxsID8gdGFza1RhZy5nZXRUYWcoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGFnVGV4dC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXRhZ1RleHQuYWRkTW9kaWZ5TGlzdGVuZXIobmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQlTdHJpbmcgdGVzdFRhZyA9IHRhZ1RleHQuZ2V0VGV4dCgpOwotCQkJCQlTdHJpbmdbXSB0YWdzID0gbmV3IFN0cmluZ1tmVGFza1RhZ3MubGVuZ3RoXTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0YWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQl0YWdzW2ldID0gZlRhc2tUYWdzW2ldLmdldFRhZygpOwotCQkJCQl9Ci0JCQkJCWdldEJ1dHRvbihJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKS5zZXRFbmFibGVkKHRhZ1RleHQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCAmJiAhQXJyYXlzLmFzTGlzdCh0YWdzKS5jb250YWlucyh0ZXN0VGFnKSk7Ci0JCQkJCXRhc2tUYWcgPSBuZXcgVGFza1RhZyh0YWdUZXh0LmdldFRleHQoKSwgcHJpb3JpdHlDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpKTsKLQkJCQl9Ci0JCQl9KTsKLQotCQkJbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfNyk7IC8vJE5PTi1OTFMtMSQKLQkJCWxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCQkJcHJpb3JpdHlDb21ibyA9IG5ldyBDb21ibyhjb21wb3NpdGUsIFNXVC5SRUFEX09OTFkgfCBTV1QuU0lOR0xFKTsKLQkJCXByaW9yaXR5Q29tYm8uc2V0SXRlbXMobmV3IFN0cmluZ1tde1NTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMCwgU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xLCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzJ9KTsKLQkJCXByaW9yaXR5Q29tYm8uc2VsZWN0KHRhc2tUYWcgIT0gbnVsbCA/IHRhc2tUYWcuZ2V0UHJpb3JpdHkoKSA6IFRhc2tUYWcuUFJJT1JJVFlfTk9STUFMKTsKLQkJCXByaW9yaXR5Q29tYm8uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQlwcmlvcml0eUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJdGFza1RhZyA9IG5ldyBUYXNrVGFnKHRhc2tUYWcuZ2V0VGFnKCksIHByaW9yaXR5Q29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZyNva1ByZXNzZWQoKQotCQkgKi8KLQkJcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCQkJdGFza1RhZyA9IG5ldyBUYXNrVGFnKHRhZ1RleHQuZ2V0VGV4dCgpLCBwcmlvcml0eUNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCQkJc3VwZXIub2tQcmVzc2VkKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgY2xhc3MgVGFza1RhZ1RhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIFRhc2tUYWdUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCWlmIChjb2x1bW5JbmRleCA8IDEpCi0JCQkJcmV0dXJuICgoVGFza1RhZykgZWxlbWVudCkuZ2V0VGFnKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYXNrVGFncy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmVGFza1RhZ3NbaV0uZXF1YWxzKGVsZW1lbnQpKSB7Ci0JCQkJCWlmIChmVGFza1RhZ3NbaV0uZ2V0UHJpb3JpdHkoKSA9PSBJTWFya2VyLlBSSU9SSVRZX0xPVykgewotCQkJCQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMDsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGZUYXNrVGFnc1tpXS5nZXRQcmlvcml0eSgpID09IElNYXJrZXIuUFJJT1JJVFlfSElHSCkgewotCQkJCQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfZGVidWdQcmVmZXJlbmNlcyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvdGFza3MvcHJlZmVyZW5jZXMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBDb250cm9sIGZDb250cm9sOwotCi0JcHJpdmF0ZSBUYXNrVGFnW10gZk9yaWdpbmFsVGFza1RhZ3M7Ci0JcHJpdmF0ZSBUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgZk93bmVyID0gbnVsbDsKLQlwcml2YXRlIElTY29wZUNvbnRleHRbXSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlciA9IG51bGw7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlc1NlcnZpY2UgZlByZWZlcmVuY2VzU2VydmljZSA9IG51bGw7Ci0KLQlwcml2YXRlIFRhc2tUYWdbXSBmVGFza1RhZ3M7Ci0KLQlwcml2YXRlIFRhYmxlVmlld2VyIHZhbHVlVGFibGUgPSBudWxsOwotCi0KLQlwdWJsaWMgTWFpblRhYihUYXNrVGFnUHJlZmVyZW5jZVBhZ2UgcGFyZW50LCBJUHJlZmVyZW5jZXNTZXJ2aWNlIHByZWZlcmVuY2VzU2VydmljZSwgSVNjb3BlQ29udGV4dFtdIGxvb2t1cE9yZGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCWZPd25lciA9IHBhcmVudDsKLQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXIgPSBsb29rdXBPcmRlcjsKLQkJZlByZWZlcmVuY2VzU2VydmljZSA9IHByZWZlcmVuY2VzU2VydmljZTsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCBhZGRUYWcoKSB7Ci0JCVRhc2tUYWdEaWFsb2cgZGxnID0gbmV3IFRhc2tUYWdEaWFsb2coZkNvbnRyb2wuZ2V0U2hlbGwoKSk7Ci0JCWludCByZXN1bHQgPSBkbGcub3BlbigpOwotCQlpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotCQkJVGFza1RhZyBuZXdUYWcgPSBkbGcudGFza1RhZzsKLQkJCUxpc3QgbmV3VGFncyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChmVGFza1RhZ3MpKTsKLQkJCW5ld1RhZ3MuYWRkKG5ld1RhZyk7Ci0JCQlmVGFza1RhZ3MgPSAoVGFza1RhZ1tdKSBuZXdUYWdzLnRvQXJyYXkobmV3IFRhc2tUYWdbbmV3VGFncy5zaXplKCldKTsKLQkJCXZhbHVlVGFibGUuc2V0SW5wdXQoZlRhc2tUYWdzKTsKLQkJCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oZlRhc2tUYWdzLmxlbmd0aCAtIDEpOwotCQl9Ci0JfQotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRhYkZvbGRlcikgewotCQlsb2FkUHJlZmVyZW5jZVZhbHVlcygpOwotCQlmT3JpZ2luYWxUYXNrVGFncyA9IGZUYXNrVGFnczsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZSh0YWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotCQlmQ29udHJvbCA9IGNvbXBvc2l0ZTsKLQotCQlUZXh0IGRlc2NyaXB0aW9uID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuUkVBRF9PTkxZIHwgU1dULlNJTkdMRSk7Ci0JCWRlc2NyaXB0aW9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8zMyk7IC8vJE5PTi1OTFMtMSQKLQkJZGVzY3JpcHRpb24uc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDQ0MDMKLQkJUG9pbnQgc2l6ZUhpbnQgPSBkZXNjcmlwdGlvbi5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpOwotCQlnZC53aWR0aEhpbnQgPSBzaXplSGludC54OwotCQlkZXNjcmlwdGlvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQl2YWx1ZVRhYmxlID0gbmV3IFRhYmxlVmlld2VyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQl2YWx1ZVRhYmxlLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJVGFibGVDb2x1bW4gdGV4dENvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbih2YWx1ZVRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FLCAwKTsKLQkJdGV4dENvbHVtbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTIpOyAvLyROT04tTkxTLTEkCi0JCVRhYmxlQ29sdW1uIHByaW9yaXR5Q29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHZhbHVlVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUsIDEpOwotCQlwcmlvcml0eUNvbHVtbi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTMpOyAvLyROT04tTkxTLTEkCi0JCXZhbHVlVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJdmFsdWVUYWJsZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBUYXNrVGFnVGFibGVMYWJlbFByb3ZpZGVyKCkpOwotCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDEsIDE0MCwgdHJ1ZSkpOwotCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxLCAxNDAsIHRydWUpKTsKLQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldExheW91dChsYXlvdXQpOwotCi0JCUNvbXBvc2l0ZSBidXR0b25zID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9ucy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCWJ1dHRvbnMuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCi0JCWZpbmFsIEJ1dHRvbiBhZGRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbnMsIFNXVC5QVVNIKTsKLQkJYWRkQnV0dG9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNCk7IC8vJE5PTi1OTFMtMSQKLQkJYWRkQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCkpOwotCQlmaW5hbCBCdXR0b24gZWRpdEJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQllZGl0QnV0dG9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNSk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpKTsKLQkJZmluYWwgQnV0dG9uIHJlbW92ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9ucywgU1dULlBVU0gpOwotCQlyZW1vdmVCdXR0b24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE2KTsgLy8kTk9OLU5MUy0xJAotCQlyZW1vdmVCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0KLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0JCUxhYmVsIHdhcm5pbmcgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXdhcm5pbmcuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCXdhcm5pbmcuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzE5KTsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCWJvb2xlYW4gZW5hYmxlZEZvclNlbGVjdGlvbiA9ICF2YWx1ZVRhYmxlLmdldFNlbGVjdGlvbigpLmlzRW1wdHkoKTsKLQkJCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZEZvclNlbGVjdGlvbik7Ci0JCQkJcmVtb3ZlQnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZEZvclNlbGVjdGlvbik7Ci0JCQl9Ci0JCX07Ci0JCXZhbHVlVGFibGUuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCQlhZGRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJYWRkVGFnKCk7Ci0JCQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihmVGFza1RhZ3MubGVuZ3RoIC0gMSk7Ci0JCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0JCQl9Ci0JCX0pOwotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBpID0gdmFsdWVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQkJZWRpdFRhZyhpKTsKLQkJCQlpZiAoaSA+PSAwKSB7Ci0JCQkJCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oaSk7Ci0JCQkJCXNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lci5zZWxlY3Rpb25DaGFuZ2VkKG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXJlbW92ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlpbnQgaSA9IHZhbHVlVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCXJlbW92ZVRhZyh2YWx1ZVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKSk7Ci0JCQkJaWYgKGkgPj0gMCAmJiBpIDwgZlRhc2tUYWdzLmxlbmd0aCkgewotCQkJCQl2YWx1ZVRhYmxlLmdldFRhYmxlKCkuc2V0U2VsZWN0aW9uKGkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JCXZhbHVlVGFibGUuYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihuZXcgSURvdWJsZUNsaWNrTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQkJaW50IGkgPSB2YWx1ZVRhYmxlLmdldFRhYmxlKCkuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQllZGl0VGFnKGkpOwotCQkJCWlmIChpID49IDApIHsKLQkJCQkJdmFsdWVUYWJsZS5nZXRUYWJsZSgpLnNldFNlbGVjdGlvbihpKTsKLQkJCQkJc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyLnNlbGVjdGlvbkNoYW5nZWQobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQotCQl2YWx1ZVRhYmxlLnNldElucHV0KGZUYXNrVGFncyk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2VsZWN0aW9uCi0JICovCi0JcHJpdmF0ZSB2b2lkIGVkaXRUYWcoaW50IGkpIHsKLQkJaWYgKGkgPCAwKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgc2VsZWN0aW9uID0gdmFsdWVUYWJsZS5nZXRUYWJsZSgpLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCVRhc2tUYWdEaWFsb2cgZGxnID0gbmV3IFRhc2tUYWdEaWFsb2coZkNvbnRyb2wuZ2V0U2hlbGwoKSk7Ci0JCWRsZy50YXNrVGFnID0gZlRhc2tUYWdzW3NlbGVjdGlvbl07Ci0JCWludCByZXN1bHQgPSBkbGcub3BlbigpOwotCQlpZiAocmVzdWx0ID09IFdpbmRvdy5PSykgewotCQkJZlRhc2tUYWdzW3NlbGVjdGlvbl0gPSBkbGcudGFza1RhZzsKLQkJCXZhbHVlVGFibGUucmVmcmVzaCgpOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjA7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcmVmZXJlbmNlVmFsdWVzKCkgewotCQlTdHJpbmcgdGFncyA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgIiIsIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcHJpb3JpdGllcyA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0U3RyaW5nKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUFJJT1JJVElFUywgIiIsIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyKTsgLy8kTk9OLU5MUy0xJAotCQlsb2FkVGFnc0FuZFByaW9yaXRpZXNGcm9tKHRhZ3MsIHByaW9yaXRpZXMpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0YWdzCi0JICogQHBhcmFtIHByaW9yaXRpZXMKLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZFRhZ3NBbmRQcmlvcml0aWVzRnJvbShTdHJpbmcgdGFnU3RyaW5nLCBTdHJpbmcgcHJpb3JpdHlTdHJpbmcpIHsKLQkJU3RyaW5nW10gdGFncyA9IFN0cmluZ1V0aWxzLnVucGFjayh0YWdTdHJpbmcpOwotCi0JCVN0cmluZ1Rva2VuaXplciB0b2tlciA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQl0b2tlciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJpb3JpdHlTdHJpbmcsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJd2hpbGUgKHRva2VyLmhhc01vcmVUb2tlbnMoKSkgewotCQkJSW50ZWdlciBudW1iZXIgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQludW1iZXIgPSBJbnRlZ2VyLnZhbHVlT2YodG9rZXIubmV4dFRva2VuKCkpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJbnVtYmVyID0gbmV3IEludGVnZXIoSU1hcmtlci5QUklPUklUWV9OT1JNQUwpOwotCQkJfQotCQkJbGlzdC5hZGQobnVtYmVyKTsKLQkJfQotCQlJbnRlZ2VyW10gcHJpb3JpdGllcyA9IChJbnRlZ2VyW10pIGxpc3QudG9BcnJheShuZXcgSW50ZWdlclswXSk7Ci0KLQkJZlRhc2tUYWdzID0gbmV3IFRhc2tUYWdbTWF0aC5taW4odGFncy5sZW5ndGgsIHByaW9yaXRpZXMubGVuZ3RoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhc2tUYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmVGFza1RhZ3NbaV0gPSBuZXcgVGFza1RhZyh0YWdzW2ldLCBwcmlvcml0aWVzW2ldLmludFZhbHVlKCkpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotCQlzYXZlKCk7Ci0KLQkJaWYgKCFBcnJheXMuZXF1YWxzKGZPcmlnaW5hbFRhc2tUYWdzLCBmVGFza1RhZ3MpKSB7Ci0JCQlmT3duZXIucmVxdWVzdFJlZGV0ZWN0aW9uKCk7Ci0JCX0KLQkJZk9yaWdpbmFsVGFza1RhZ3MgPSBmVGFza1RhZ3M7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyBkZWZhdWx0cyBpbiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSUVjbGlwc2VQcmVmZXJlbmNlc1tdIHByZWZlcmVuY2VzID0gbmV3IElFY2xpcHNlUHJlZmVyZW5jZXNbZlByZWZlcmVuY2VzTG9va3VwT3JkZXIubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcmVmZXJlbmNlcy5sZW5ndGg7IGkrKykgewotCQkJcHJlZmVyZW5jZXNbaV0gPSBmUHJlZmVyZW5jZXNMb29rdXBPcmRlcltpXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKTsKLQkJfQotCQlTdHJpbmcgdGFncyA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0KFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19UQUdTLCBudWxsLCBwcmVmZXJlbmNlcyk7Ci0JCVN0cmluZyBwcmlvcml0aWVzID0gZlByZWZlcmVuY2VzU2VydmljZS5nZXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMsIG51bGwsIHByZWZlcmVuY2VzKTsKLQkJbG9hZFRhZ3NBbmRQcmlvcml0aWVzRnJvbSh0YWdzLCBwcmlvcml0aWVzKTsKLQkJaW50IHNlbGVjdGlvbiA9IHZhbHVlVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQl2YWx1ZVRhYmxlLnNldElucHV0KGZUYXNrVGFncyk7Ci0JCXZhbHVlVGFibGUuZ2V0VGFibGUoKS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtT2soKSB7Ci0JCXBlcmZvcm1BcHBseSgpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlVGFnKGludCBpKSB7Ci0JCWlmIChpIDwgMCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUxpc3QgdGFza1RhZ3MgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoZlRhc2tUYWdzKSk7Ci0JCXRhc2tUYWdzLnJlbW92ZShpKTsKLQkJZlRhc2tUYWdzID0gKFRhc2tUYWdbXSkgdGFza1RhZ3MudG9BcnJheShuZXcgVGFza1RhZ1t0YXNrVGFncy5zaXplKCldKTsKLQkJdmFsdWVUYWJsZS5zZXRJbnB1dChmVGFza1RhZ3MpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIGRlZmF1bHRQcmVmZXJlbmNlcyA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKTsKLQkJU3RyaW5nIGRlZmF1bHRUYWdzID0gZGVmYXVsdFByZWZlcmVuY2VzLmdldChUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUywgbnVsbCk7Ci0JCVN0cmluZyBkZWZhdWx0UHJpb3JpdGllcyA9IGRlZmF1bHRQcmVmZXJlbmNlcy5nZXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMsIG51bGwpOwotCi0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhc2tUYWdzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAoaSA+IDApIHsKLQkJCQlidWYuYXBwZW5kKCIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWJ1Zi5hcHBlbmQoZlRhc2tUYWdzW2ldLmdldFRhZygpKTsKLQkJfQotCQlTdHJpbmcgY3VycmVudFRhZ3MgPSBidWYudG9TdHJpbmcoKTsKLQkJaWYgKGN1cnJlbnRUYWdzLmVxdWFscyhkZWZhdWx0VGFncykgJiYgIWZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5hbWUoKS5lcXVhbHMoRGVmYXVsdFNjb3BlLlNDT1BFKSkgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MgKyAiIGZyb20gc2NvcGUgIiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5hbWUoKSArICI6IiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MpOwotCQl9Ci0JCWVsc2UgewotCQkJZk93bmVyLnJlcXVlc3RSZWRldGVjdGlvbigpOwotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUyArICIgXCIiICsgY3VycmVudFRhZ3MgKyAiXCIgaW4gc2NvcGUgIiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5hbWUoKSArICI6IiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKS5wdXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MsIGN1cnJlbnRUYWdzKTsKLQkJfQotCi0JCVN0cmluZ0J1ZmZlciBidWYyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYXNrVGFncy5sZW5ndGg7IGkrKykgewotCQkJaWYgKGkgPiAwKSB7Ci0JCQkJYnVmMi5hcHBlbmQoIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJYnVmMi5hcHBlbmQoU3RyaW5nLnZhbHVlT2YoZlRhc2tUYWdzW2ldLmdldFByaW9yaXR5KCkpKTsKLQkJfQotCQlTdHJpbmcgcHJpb3JpdGllcyA9IGJ1ZjIudG9TdHJpbmcoKTsKLQotCQlpZiAocHJpb3JpdGllcy5lcXVhbHMoZGVmYXVsdFByaW9yaXRpZXMpICYmICFmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkuZXF1YWxzKERlZmF1bHRTY29wZS5TQ09QRSkpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTICsgIiBmcm9tIHNjb3BlICIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROYW1lKCkgKyAiOiIgKyBmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJZlByZWZlcmVuY2VzTG9va3VwT3JkZXJbMF0uZ2V0Tm9kZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfTk9ERSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTKTsKLQkJfQotCQllbHNlIHsKLQkJCWZPd25lci5yZXF1ZXN0UmVkZXRlY3Rpb24oKTsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMgKyAiIFwiIiArIHByaW9yaXRpZXMgKyAiXCIgaW4gc2NvcGUgIiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldE5hbWUoKSArICI6IiArIGZQcmVmZXJlbmNlc0xvb2t1cE9yZGVyWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQl9Ci0JCQlmUHJlZmVyZW5jZXNMb29rdXBPcmRlclswXS5nZXROb2RlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFKS5wdXQoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMsIHByaW9yaXRpZXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMtdGFza3RhZ3Mvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzOTA5NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Byb3BlcnR5UHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVdvcmtzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5Qcm9qZWN0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JbnN0YW5jZVNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuQ29udHJvbEVuYWJsZVN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5MaXN0RGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJlZmVyZW5jZXNVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLldvcmtiZW5jaExhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MubmF2aWdhdG9yLlJlc291cmNlU29ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrVGFnUHJlZmVyZW5jZUtleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLWFic3RyYWN0IGNsYXNzIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcm9wZXJ0eVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gX2RlYnVnUHJlZmVyZW5jZXMgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcmVmZXJlbmNlcy1wcm9wZXJ0aWVzIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkvKgotCSAqIERpc2FibGUgbGluayBkYXRhLCBwcmV2ZW50cyB0aGUgZGlzcGxheSBvZiBhICJ3b3Jrc3BhY2UiIG9yICJwcm9qZWN0IgotCSAqIHNldHRpbmdzIGxpbmsgdG8gcHJldmVudCByZWN1cnNpdmUgZGlhbG9nIGxhdW5jaGluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBESVNBQkxFX0xJTksgPSAiRElTQUJMRV9MSU5LIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBNYXAgZkRhdGEgPSBudWxsOwotCi0JcHJpdmF0ZSBCdXR0b24gZkVuYWJsZVByb2plY3RTZXR0aW5nczsKLQotCXByaXZhdGUgTGluayBmUHJvamVjdFNldHRpbmdzTGluazsKLQotCXB1YmxpYyBQcm9wZXJ0eVByZWZlcmVuY2VQYWdlKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIGFwcGx5RGF0YShPYmplY3QgZGF0YSkgewotCQlzdXBlci5hcHBseURhdGEoZGF0YSk7Ci0JCWlmIChkYXRhIGluc3RhbmNlb2YgTWFwKSB7Ci0JCQlmRGF0YSA9IChNYXApIGRhdGE7Ci0JCQl1cGRhdGVMaW5rRW5hYmxlbWVudCgpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29tbW9uQ29udGVudHMoQ29tcG9zaXRlIGNvbXBvc2l0ZSk7Ci0KLQlwdWJsaWMgZmluYWwgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbXBvc2l0ZSBjaGVja0xpbmtDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQljaGVja0xpbmtDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5DRU5URVIsIHRydWUsIGZhbHNlKSk7Ci0JCWNoZWNrTGlua0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3MgPSBuZXcgQnV0dG9uKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0VGV4dChTU0VVSU1lc3NhZ2VzLkVuYWJsZVByb2plY3RTZXR0aW5ncyk7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTIkCi0JCQlmRW5hYmxlUHJvamVjdFNldHRpbmdzLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5CRUdJTk5JTkcsIFNXVC5DRU5URVIsIGZhbHNlLCBmYWxzZSkpOwotCQkJYm9vbGVhbiBlbmFibGVkRm9yUHJvamVjdCA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKVswXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEJvb2xlYW4oZ2V0UHJvamVjdFNldHRpbmdzS2V5KCksIGZhbHNlKTsKLQkJCWZFbmFibGVQcm9qZWN0U2V0dGluZ3Muc2V0U2VsZWN0aW9uKGVuYWJsZWRGb3JQcm9qZWN0KTsKLQkJfQotCQllbHNlIHsKLQkJCUxhYmVsIHNwYWNlciA9IG5ldyBMYWJlbChjaGVja0xpbmtDb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCQlzcGFjZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCX0KLQotCQlmUHJvamVjdFNldHRpbmdzTGluayA9IG5ldyBMaW5rKGNoZWNrTGlua0NvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRU5ELCBTV1QuQkVHSU5OSU5HLCB0cnVlLCBmYWxzZSkpOwotCi0JCS8qCi0JCSAqICJlbGVtZW50IiBzaG91bGQgYmUgYSBwcm9qZWN0LCBpZiBudWxsLCBsaW5rIHRvIHBlci1wcm9qZWN0Ci0JCSAqIHByb3BlcnRpZXMKLQkJICovCi0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlV29ya3NwYWNlU2V0dGluZ3MgKyAiPC9hPiIpOyAvLyROT04tTkxTLTEkLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWVsc2UgewotCQkJZlByb2plY3RTZXR0aW5nc0xpbmsuc2V0VGV4dCgiPGE+IiArIFNTRVVJTWVzc2FnZXMuQ29uZmlndXJlUHJvamVjdFNldHRpbmdzICsgIjwvYT4iKTsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXVwZGF0ZUxpbmtFbmFibGVtZW50KCk7Ci0KLQkJZlByb2plY3RTZXR0aW5nc0xpbmsuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJCQlvcGVuUHJvamVjdFNldHRpbmdzKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlvcGVuV29ya3NwYWNlU2V0dGluZ3MoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfSk7Ci0KLQkJaWYgKGdldFByb2plY3QoKSAhPSBudWxsKSB7Ci0JCQlMYWJlbCBsaW5lID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULlNFUEFSQVRPUiB8IFNXVC5IT1JJWk9OVEFMKTsKLQkJCWxpbmUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKSk7Ci0JCX0KLQotCQlmaW5hbCBDb250cm9sIGNvbW1vbiA9IGNyZWF0ZUNvbW1vbkNvbnRlbnRzKGNvbXBvc2l0ZSk7Ci0JCWNvbW1vbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlpZiAoZkVuYWJsZVByb2plY3RTZXR0aW5ncyAhPSBudWxsKSB7Ci0JCQlTZWxlY3Rpb25BZGFwdGVyIHNlbGVjdGlvbkFkYXB0ZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlDb250cm9sRW5hYmxlU3RhdGUgZW5hYmxlbWVudHMgPSBudWxsOwotCi0JCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCQlzdXBlci53aWRnZXRTZWxlY3RlZChlKTsKLQkJCQkJaWYgKGZFbmFibGVQcm9qZWN0U2V0dGluZ3MuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCQkJCWlmIChlbmFibGVtZW50cyAhPSBudWxsKSB7Ci0JCQkJCQkJZW5hYmxlbWVudHMucmVzdG9yZSgpOwotCQkJCQkJCWVuYWJsZW1lbnRzID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWVuYWJsZW1lbnRzID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUoY29tbW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlzZWxlY3Rpb25BZGFwdGVyLndpZGdldFNlbGVjdGVkKG51bGwpOwotCQkJZkVuYWJsZVByb2plY3RTZXR0aW5ncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25BZGFwdGVyKTsKLQkJfQotCQkKLQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChnZXRQcm9qZWN0KCkgIT0gbnVsbCkgewotCQkJbm9EZWZhdWx0QW5kQXBwbHlCdXR0b24oKTsKLQkJfQotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIElTY29wZUNvbnRleHRbXSBjcmVhdGVQcmVmZXJlbmNlU2NvcGVzKCkgewotCQlJUHJvamVjdCBwcm9qZWN0ID0gZ2V0UHJvamVjdCgpOwotCQlpZiAocHJvamVjdCAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gbmV3IElTY29wZUNvbnRleHRbXXtuZXcgUHJvamVjdFNjb3BlKHByb2plY3QpLCBuZXcgSW5zdGFuY2VTY29wZSgpLCBuZXcgRGVmYXVsdFNjb3BlKCl9OwotCQl9Ci0JCXJldHVybiBuZXcgSVNjb3BlQ29udGV4dFtde25ldyBJbnN0YW5jZVNjb3BlKCksIG5ldyBEZWZhdWx0U2NvcGUoKX07Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcmVmZXJlbmNlUGFnZUlEKCk7Ci0KLQlwcm90ZWN0ZWQgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJaWYgKGdldEVsZW1lbnQoKSAhPSBudWxsICYmIGdldEVsZW1lbnQoKSBpbnN0YW5jZW9mIElQcm9qZWN0KSB7Ci0JCQlyZXR1cm4gKElQcm9qZWN0KSBnZXRFbGVtZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRQcm9qZWN0U2V0dGluZ3NLZXkoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJvcGVydHlQYWdlSUQoKTsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpIHsKLQkJcmV0dXJuIGZFbmFibGVQcm9qZWN0U2V0dGluZ3MgIT0gbnVsbCAmJiBmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpOwotCX0KLQotCXZvaWQgb3BlblByb2plY3RTZXR0aW5ncygpIHsKLQkJTGlzdERpYWxvZyBkaWFsb2cgPSBuZXcgTGlzdERpYWxvZyhnZXRTaGVsbCgpKSB7Ci0KLQkJCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIGNvbnRhaW5lcikgewotCQkJCUNvbnRyb2wgYXJlYSA9IHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEoY29udGFpbmVyKTsKLQkJCQlnZXRUYWJsZVZpZXdlcigpLnNldFNvcnRlcihuZXcgUmVzb3VyY2VTb3J0ZXIoUmVzb3VyY2VTb3J0ZXIuTkFNRSkpOwotCQkJCXJldHVybiBhcmVhOwotCQkJfQotCQl9OwotCQlkaWFsb2cuc2V0TWVzc2FnZShTU0VVSU1lc3NhZ2VzLlByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDIpOwotCQlkaWFsb2cuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBJU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJcmV0dXJuICgoSVdvcmtzcGFjZSkgaW5wdXRFbGVtZW50KS5nZXRSb290KCkuZ2V0UHJvamVjdHMoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl9Ci0JCX0pOwotCQlkaWFsb2cuc2V0TGFiZWxQcm92aWRlcihuZXcgRGVjb3JhdGluZ0xhYmVsUHJvdmlkZXIobmV3IFdvcmtiZW5jaExhYmVsUHJvdmlkZXIoKSwgU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldERlY29yYXRvck1hbmFnZXIoKS5nZXRMYWJlbERlY29yYXRvcigpKSk7Ci0JCWRpYWxvZy5zZXRJbnB1dChSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkpOwotCQlkaWFsb2cuc2V0VGl0bGUoU1NFVUlNZXNzYWdlcy5Qcm9wZXJ0eVByZWZlcmVuY2VQYWdlXzAxKTsKLQkJaWYgKGRpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlPYmplY3RbXSByZXN1bHQgPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0JCQlpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gKElQcm9qZWN0KSBkaWFsb2cuZ2V0UmVzdWx0KClbMF07Ci0JCQkJTWFwIGRhdGEgPSBuZXcgSGFzaE1hcCgpOwotCQkJCWRhdGEucHV0KERJU0FCTEVfTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJCQlQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJvcGVydHlEaWFsb2dPbihnZXRTaGVsbCgpLCBwcm9qZWN0LCBnZXRQcm9wZXJ0eVBhZ2VJRCgpLCBuZXcgU3RyaW5nW117Z2V0UHJvcGVydHlQYWdlSUQoKX0sIGRhdGEpLm9wZW4oKTsKLQkJCX0KLQkJfQotCX0KLQotCXZvaWQgb3BlbldvcmtzcGFjZVNldHRpbmdzKCkgewotCQlNYXAgZGF0YSA9IG5ldyBIYXNoTWFwKCk7Ci0JCWRhdGEucHV0KERJU0FCTEVfTElOSywgQm9vbGVhbi5UUlVFKTsKLQkJUHJlZmVyZW5jZXNVdGlsLmNyZWF0ZVByZWZlcmVuY2VEaWFsb2dPbihnZXRTaGVsbCgpLCBnZXRQcmVmZXJlbmNlUGFnZUlEKCksIG5ldyBTdHJpbmdbXXtnZXRQcmVmZXJlbmNlUGFnZUlEKCl9LCBkYXRhKS5vcGVuKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCUlTY29wZUNvbnRleHRbXSBwcmVmZXJlbmNlU2NvcGVzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwpIHsKLQkJCWlmIChpc0VsZW1lbnRTZXR0aW5nc0VuYWJsZWQoKSkgewotCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHNldHRpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCArICIgKCIgKyB0cnVlICsgIikgaW4gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQkJfQotCQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRCb29sZWFuKGdldFByb2plY3RTZXR0aW5nc0tleSgpLCBmRW5hYmxlUHJvamVjdFNldHRpbmdzLmdldFNlbGVjdGlvbigpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCX0KLQkJCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKGdldFByb2plY3RTZXR0aW5nc0tleSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gb2s7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUxpbmtFbmFibGVtZW50KCkgewotCQlpZiAoZkRhdGEgIT0gbnVsbCAmJiBmUHJvamVjdFNldHRpbmdzTGluayAhPSBudWxsKSB7Ci0JCQlmUHJvamVjdFNldHRpbmdzTGluay5zZXRFbmFibGVkKCFCb29sZWFuLlRSVUUuZXF1YWxzKGZEYXRhLmdldChESVNBQkxFX0xJTkspKSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGFza1RhZ1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjLXRhc2t0YWdzL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGFza1RhZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMDVjYzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy10YXNrdGFncy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1Rhc2tUYWdQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuRGVmYXVsdFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JRWNsaXBzZVByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JUHJlZmVyZW5jZXNTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5JU2NvcGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuQ29udHJvbEVuYWJsZVN0YXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGFza3MuVGFza1NjYW5uaW5nU2NoZWR1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50YXNrcy5UYXNrVGFnUHJlZmVyZW5jZUtleXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuVGFiRm9sZGVyTGF5b3V0OwotaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UucHJlZnMuQmFja2luZ1N0b3JlRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGFza1RhZ1ByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJvcGVydHlQcmVmZXJlbmNlUGFnZSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1Z1ByZWZlcmVuY2VzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS90YXNrcy9wcmVmZXJlbmNlcyIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JLy8gUmVtZW1iZXIgdGhlIGxhc3QgZGlzcGxheWVkIHRhYiBmb3IgY29udmVuaWVuY2UKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19UQUdfTEFTVF9UQUIgPSAidGFzay10YWctbGFzdC10YWIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIGludCBkZXRlY3Rpb25SZXF1ZXN0ZWQgPSAwOwotCi0JcHJpdmF0ZSBCdXR0b24gZkVuYWJsZUNoZWNrYm94ID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBmRW5hYmxlVGFza1RhZ3MgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGZPcmlnaW5hbEVuYWJsZVRhc2tUYWdzID0gdHJ1ZTsKLQotCXByaXZhdGUgSVByZWZlcmVuY2VzU2VydmljZSBmUHJlZmVyZW5jZXNTZXJ2aWNlID0gbnVsbDsKLQotCXByaXZhdGUgQnV0dG9uIGZSZWRldGVjdEJ1dHRvbjsKLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZlRhYkVuYWJsZW1lbnRMaXN0ZW5lcjsKLQotCXByaXZhdGUgVGFiRm9sZGVyIGZUYWJGb2xkZXI7Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVRhYltdIGZUYWJzID0gbnVsbDsKLQotCXB1YmxpYyBUYXNrVGFnUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQcmVmZXJlbmNlc1NlcnZpY2UgPSBQbGF0Zm9ybS5nZXRQcmVmZXJlbmNlc1NlcnZpY2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChnZXRFbGVtZW50KCkgPT0gbnVsbCkgewotCQkJKChHcmlkTGF5b3V0KSBwYXJlbnQuZ2V0TGF5b3V0KCkpLm51bUNvbHVtbnMgKz0gMjsKLQkJCWZSZWRldGVjdEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCQlmUmVkZXRlY3RCdXR0b24uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlUGFnZV8zMik7IC8vJE5PTi1OTFMtMSQKLQkJCWZSZWRldGVjdEJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORCB8IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEwpKTsKLQkJCWZSZWRldGVjdEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotCQkJZlJlZGV0ZWN0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSm9iIHJlZGV0ZWN0Sm9iID0gbmV3IEpvYihTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzI3KSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCQl9Ci0KLQkJCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQlUYXNrU2Nhbm5pbmdTY2hlZHVsZXIucmVmcmVzaCgpOwotCQkJCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCQkJfQotCQkJCQl9OwotCQkJCQlyZWRldGVjdEpvYi5zY2hlZHVsZSgpOwotCQkJCX0KLQkJCX0pOwotCQkJTGFiZWwgc3BhY2VyID0gbmV3IExhYmVsKHBhcmVudCwgU1dULk5PTkUpOwotCQkJc3BhY2VyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRU5EIHwgR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQ0VOVEVSKSk7Ci0JCX0KLQkJc3VwZXIuY29udHJpYnV0ZUJ1dHRvbnMocGFyZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb21tb25Db250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGNvbXBvc2l0ZUxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWNvbXBvc2l0ZUxheW91dC5tYXJnaW5MZWZ0ID0gMDsKLQkJY29tcG9zaXRlTGF5b3V0Lm1hcmdpblJpZ2h0ID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChjb21wb3NpdGVMYXlvdXQpOwotCi0JCUlTY29wZUNvbnRleHRbXSBwcmVmZXJlbmNlU2NvcGVzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpOwotCQlmT3JpZ2luYWxFbmFibGVUYXNrVGFncyA9IGZFbmFibGVUYXNrVGFncyA9IGZQcmVmZXJlbmNlc1NlcnZpY2UuZ2V0Qm9vbGVhbihnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpLCBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFLCBmYWxzZSwgcHJlZmVyZW5jZVNjb3Blcyk7Ci0JCWZFbmFibGVDaGVja2JveCA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmRW5hYmxlQ2hlY2tib3guc2V0U2VsZWN0aW9uKGZFbmFibGVUYXNrVGFncyk7Ci0JCWZFbmFibGVDaGVja2JveC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzEpOyAvLyROT04tTkxTLTEkCi0JCWZFbmFibGVDaGVja2JveC5zZXRTZWxlY3Rpb24oZkVuYWJsZVRhc2tUYWdzKTsKLQkJZkVuYWJsZUNoZWNrYm94LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HLCBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9FTkQsIGZhbHNlLCBmYWxzZSwgMSwgMSkpOwotCi0JCWZUYWJGb2xkZXIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmVGFiRm9sZGVyLnNldExheW91dChuZXcgVGFiRm9sZGVyTGF5b3V0KCkpOwotCQlmVGFiRm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSwgMiwgMSkpOwotCi0JCVRhYkl0ZW0gdGFza0l0ZW0gPSBuZXcgVGFiSXRlbShmVGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCU1haW5UYWIgbWFpblRhYiA9IG5ldyBNYWluVGFiKHRoaXMsIGZQcmVmZXJlbmNlc1NlcnZpY2UsIHByZWZlcmVuY2VTY29wZXMpOwotCQl0YXNrSXRlbS5zZXRUZXh0KG1haW5UYWIuZ2V0VGl0bGUoKSk7Ci0JCWZpbmFsIENvbnRyb2wgdGFza1RhZ3NDb250cm9sID0gbWFpblRhYi5jcmVhdGVDb250ZW50cyhmVGFiRm9sZGVyKTsKLQkJdGFza0l0ZW0uc2V0Q29udHJvbCh0YXNrVGFnc0NvbnRyb2wpOwotCi0JCVRhYkl0ZW0gZXhjbHVzaW9uSXRlbSA9IG5ldyBUYWJJdGVtKGZUYWJGb2xkZXIsIFNXVC5OT05FKTsKLQkJRXhjbHVzaW9uc1RhYiBleGNsdXNpb25zVGFiID0gbmV3IEV4Y2x1c2lvbnNUYWIodGhpcywgZlByZWZlcmVuY2VzU2VydmljZSwgcHJlZmVyZW5jZVNjb3Blcyk7Ci0JCWV4Y2x1c2lvbkl0ZW0uc2V0VGV4dChleGNsdXNpb25zVGFiLmdldFRpdGxlKCkpOwotCQlmaW5hbCBDb250cm9sIGV4Y2x1c2lvbkNvbnRyb2wgPSBleGNsdXNpb25zVGFiLmNyZWF0ZUNvbnRlbnRzKGZUYWJGb2xkZXIpOwotCQlleGNsdXNpb25JdGVtLnNldENvbnRyb2woZXhjbHVzaW9uQ29udHJvbCk7Ci0KLQkJZlRhYnMgPSBuZXcgSVByZWZlcmVuY2VUYWJbXXttYWluVGFiLCBleGNsdXNpb25zVGFifTsKLQotCQlmVGFiRW5hYmxlbWVudExpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlDb250cm9sRW5hYmxlU3RhdGVbXSBsYXN0RW5hYmxlU3RhdGVzID0gbnVsbDsKLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWZFbmFibGVUYXNrVGFncyA9IGZFbmFibGVDaGVja2JveC5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoZkVuYWJsZVRhc2tUYWdzKSB7Ci0JCQkJCWlmIChsYXN0RW5hYmxlU3RhdGVzICE9IG51bGwpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGFzdEVuYWJsZVN0YXRlcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmIChsYXN0RW5hYmxlU3RhdGVzW2ldICE9IG51bGwpIHsKLQkJCQkJCQkJbGFzdEVuYWJsZVN0YXRlc1tpXS5yZXN0b3JlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJbGFzdEVuYWJsZVN0YXRlcyA9IG51bGw7Ci0JCQkJCQlmVGFiRm9sZGVyLnJlZHJhdygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGxhc3RFbmFibGVTdGF0ZXMgPT0gbnVsbCkgewotCQkJCQlsYXN0RW5hYmxlU3RhdGVzID0gbmV3IENvbnRyb2xFbmFibGVTdGF0ZVtmVGFicy5sZW5ndGggKyAxXTsKLQkJCQkJbGFzdEVuYWJsZVN0YXRlc1swXSA9IENvbnRyb2xFbmFibGVTdGF0ZS5kaXNhYmxlKHRhc2tUYWdzQ29udHJvbCk7Ci0JCQkJCWxhc3RFbmFibGVTdGF0ZXNbMV0gPSBDb250cm9sRW5hYmxlU3RhdGUuZGlzYWJsZShleGNsdXNpb25Db250cm9sKTsKLQkJCQkJaWYgKGZSZWRldGVjdEJ1dHRvbiAhPSBudWxsKSB7Ci0JCQkJCQlsYXN0RW5hYmxlU3RhdGVzWzJdID0gQ29udHJvbEVuYWJsZVN0YXRlLmRpc2FibGUoZlJlZGV0ZWN0QnV0dG9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfTsKLQkJZlRhYkVuYWJsZW1lbnRMaXN0ZW5lci53aWRnZXRTZWxlY3RlZChudWxsKTsKLQkJZkVuYWJsZUNoZWNrYm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGZUYWJFbmFibGVtZW50TGlzdGVuZXIpOwotCi0JCS8vIHJlc3RvcmUgbGFzdCBzZWxlY3RlZCB0YWIKLQkJaW50IGFjdGl2ZVRhYiA9IG5ldyBEZWZhdWx0U2NvcGUoKS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmdldEludChUQVNLX1RBR19MQVNUX1RBQiwgMCk7Ci0JCWlmIChhY3RpdmVUYWIgPiAwKSB7Ci0JCQlmVGFiRm9sZGVyLnNldFNlbGVjdGlvbihhY3RpdmVUYWIpOwotCQl9Ci0KLQkJU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlBSRUZXRUJYX1RBU0tUQUdTX0hFTFBJRCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpIHsKLQkJcmV0dXJuIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19OT0RFOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVyZW5jZVBhZ2VJRCgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnRhc2t0YWdzIjsvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb2plY3RTZXR0aW5nc0tleSgpIHsKLQkJcmV0dXJuIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3BlcnR5UGFnZUlEKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJvamVjdC5wcm9wZXJ0aWVzLnRhc2t0YWdzIjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjA7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotCQlzdXBlci5wZXJmb3JtQXBwbHkoKTsKLQkJc2F2ZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1BcHBseSgpOwotCQl9Ci0KLQkJcHJvbXB0Rm9yUmVkZXRlY3RJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCUlFY2xpcHNlUHJlZmVyZW5jZXMgZGVmYXVsdFByZWZlcmVuY2VzID0gY3JlYXRlUHJlZmVyZW5jZVNjb3BlcygpWzFdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSk7Ci0JCWZFbmFibGVUYXNrVGFncyA9IGRlZmF1bHRQcmVmZXJlbmNlcy5nZXRCb29sZWFuKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlKTsKLQkJZkVuYWJsZUNoZWNrYm94LnNldFNlbGVjdGlvbihmRW5hYmxlVGFza1RhZ3MpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmVGFic1tpXS5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJfQotCQlmVGFiRW5hYmxlbWVudExpc3RlbmVyLndpZGdldFNlbGVjdGVkKG51bGwpOwotCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTG9hZGluZyBkZWZhdWx0cyBpbiAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gb2sgPSBzdXBlci5wZXJmb3JtT2soKTsKLQkJc2F2ZSgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1PaygpOwotCQl9Ci0KLQkJcHJvbXB0Rm9yUmVkZXRlY3RJZk5lY2Vzc2FyeSgpOwotCi0JCS8vIHNhdmUgbGFzdCB0YWIgKHVzZSBEZWZhdWx0IHNjb3BlIHNpbmNlIGl0IHdvbid0IGJlIHBlcnNpc3RlZCkKLQkJbmV3IERlZmF1bHRTY29wZSgpLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucHV0SW50KFRBU0tfVEFHX0xBU1RfVEFCLCBmVGFiRm9sZGVyLmdldFNlbGVjdGlvbkluZGV4KCkpOwotCi0JCUlTY29wZUNvbnRleHRbXSBjb250ZXh0cyA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKTsKLQkJLy8gcmVtb3ZlIHByb2plY3Qtc3BlY2lmaWMgaW5mb3JtYXRpb24gaWYgaXQncyBub3QgZW5hYmxlZAotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgIWlzRWxlbWVudFNldHRpbmdzRW5hYmxlZCgpKSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBjb250ZXh0c1swXS5nZXROYW1lKCkgKyAiOiIgKyBjb250ZXh0c1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QpOwotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVEICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgY29udGV4dHNbMF0uZ2V0TmFtZSgpICsgIjoiICsgY29udGV4dHNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJfQotCQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0NPTlRFTlRUWVBFU19JR05PUkVEKTsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgcmVtb3ZpbmcgIiArIFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QUklPUklUSUVTICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgY29udGV4dHNbMF0uZ2V0TmFtZSgpICsgIjoiICsgY29udGV4dHNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJfQotCQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BSSU9SSVRJRVMpOwotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiByZW1vdmluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1RBR1MgKyAiICgiICsgdHJ1ZSArICIpIGluIHNjb3BlICIgKyBjb250ZXh0c1swXS5nZXROYW1lKCkgKyAiOiIgKyBjb250ZXh0c1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAgCi0JCQl9Ci0JCQljb250ZXh0c1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfVEFHUyk7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgY29udGV4dHNbMF0uZ2V0TmFtZSgpICsgIjoiICsgY29udGV4dHNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgIAotCQkJfQotCQkJY29udGV4dHNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5yZW1vdmUoVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSk7Ci0JCX0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZXh0cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQljb250ZXh0c1tpXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLmZsdXNoKCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIHNhdmluZyBwcmVmZXJlbmNlIHNldHRpbmdzIHRvIHNjb3BlICIgKyBjb250ZXh0c1tpXS5nZXROYW1lKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb2s7Ci0JfQotCi0KLQlwcml2YXRlIHZvaWQgcHJvbXB0Rm9yUmVkZXRlY3RJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKGRldGVjdGlvblJlcXVlc3RlZCA+IDApIHsKLQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpLCBTU0VVSU1lc3NhZ2VzLlRhc2tUYWdQcmVmZXJlbmNlVGFiXzIyLCBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0SW1hZ2UoKSwgU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMywgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgbmV3IFN0cmluZ1tde1NTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjQsIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjUsIFNTRVVJTWVzc2FnZXMuVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjZ9LCAyKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQlpbnQgYnV0dG9uID0gZGlhbG9nLm9wZW4oKTsKLQkJCWlmIChidXR0b24gPT0gMCkgewotCQkJCUpvYiByZWRldGVjdEpvYiA9IG5ldyBKb2IoU1NFVUlNZXNzYWdlcy5UYXNrVGFnUHJlZmVyZW5jZVRhYl8yNykgeyAvLyROT04tTkxTLTEkCi0JCQkJCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJfQotCi0JCQkJCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCWlmIChnZXRQcm9qZWN0KCkgPT0gbnVsbCkgewotCQkJCQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiOiByZXNjYW5uaW5nIGFsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCVRhc2tTY2FubmluZ1NjaGVkdWxlci5yZWZyZXNoKCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogcmVzY2FubmluZyAiICsgZ2V0UHJvamVjdCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCQlUYXNrU2Nhbm5pbmdTY2hlZHVsZXIucmVmcmVzaChnZXRQcm9qZWN0KCkpOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCXJlZGV0ZWN0Sm9iLnNjaGVkdWxlKDUwMCk7Ci0JCQl9Ci0JCQlkZXRlY3Rpb25SZXF1ZXN0ZWQgPSAwOwotCQl9Ci0JfQotCi0Jdm9pZCByZXF1ZXN0UmVkZXRlY3Rpb24oKSB7Ci0JCWRldGVjdGlvblJlcXVlc3RlZCsrOwotCX0KLQotCXByaXZhdGUgdm9pZCBzYXZlKCkgewotCQlpZiAoZkVuYWJsZVRhc2tUYWdzICE9IGZPcmlnaW5hbEVuYWJsZVRhc2tUYWdzKSB7Ci0JCQlyZXF1ZXN0UmVkZXRlY3Rpb24oKTsKLQkJfQotCQlmT3JpZ2luYWxFbmFibGVUYXNrVGFncyA9IGZFbmFibGVUYXNrVGFnczsKLQotCQlJU2NvcGVDb250ZXh0W10gcHJlZmVyZW5jZVNjb3BlcyA9IGNyZWF0ZVByZWZlcmVuY2VTY29wZXMoKTsKLQkJSUVjbGlwc2VQcmVmZXJlbmNlcyBkZWZhdWx0UHJlZmVyZW5jZXMgPSBwcmVmZXJlbmNlU2NvcGVzWzFdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSk7Ci0JCWJvb2xlYW4gZGVmYXVsdEVuYWJsZSA9IGRlZmF1bHRQcmVmZXJlbmNlcy5nZXRCb29sZWFuKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUsIGZhbHNlKTsKLQkJaWYgKGZFbmFibGVUYXNrVGFncyA9PSBkZWZhdWx0RW5hYmxlKSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFICsgIiBmcm9tIHNjb3BlICIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5hbWUoKSArICI6IiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TG9jYXRpb24oKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlwcmVmZXJlbmNlU2NvcGVzWzBdLmdldE5vZGUoZ2V0UHJlZmVyZW5jZU5vZGVRdWFsaWZpZXIoKSkucmVtb3ZlKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19FTkFCTEUpOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKF9kZWJ1Z1ByZWZlcmVuY2VzKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzZXR0aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfRU5BQkxFICsgIiBcIiIgKyBmRW5hYmxlVGFza1RhZ3MgKyAiXCIgaW4gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnB1dEJvb2xlYW4oVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX0VOQUJMRSwgZkVuYWJsZVRhc2tUYWdzKTsKLQkJfQotCQlpZiAoZ2V0UHJvamVjdCgpICE9IG51bGwgJiYgaXNFbGVtZW50U2V0dGluZ3NFbmFibGVkKCkpIHsKLQkJCWlmIChfZGVidWdQcmVmZXJlbmNlcykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2V0dGluZyAiICsgVGFza1RhZ1ByZWZlcmVuY2VLZXlzLlRBU0tfVEFHX1BFUl9QUk9KRUNUICsgIiAoIiArIHRydWUgKyAiKSBpbiBzY29wZSAiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROYW1lKCkgKyAiOiIgKyBwcmVmZXJlbmNlU2NvcGVzWzBdLmdldExvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkICAKLQkJCX0KLQkJCXByZWZlcmVuY2VTY29wZXNbMF0uZ2V0Tm9kZShnZXRQcmVmZXJlbmNlTm9kZVF1YWxpZmllcigpKS5wdXRCb29sZWFuKFRhc2tUYWdQcmVmZXJlbmNlS2V5cy5UQVNLX1RBR19QRVJfUFJPSkVDVCwgdHJ1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoX2RlYnVnUHJlZmVyZW5jZXMpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIHJlbW92aW5nICIgKyBUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QgKyAiIGZyb20gc2NvcGUgIiArIHByZWZlcmVuY2VTY29wZXNbMF0uZ2V0TmFtZSgpICsgIjoiICsgcHJlZmVyZW5jZVNjb3Blc1swXS5nZXRMb2NhdGlvbigpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJfQotCQkJcHJlZmVyZW5jZVNjb3Blc1swXS5nZXROb2RlKGdldFByZWZlcmVuY2VOb2RlUXVhbGlmaWVyKCkpLnJlbW92ZShUYXNrVGFnUHJlZmVyZW5jZUtleXMuVEFTS19UQUdfUEVSX1BST0pFQ1QpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUHJlZmVyZW5jZXNTZXJ2aWNlLmdldFJvb3ROb2RlKCkuZmx1c2goKTsKLQkJfQotCQljYXRjaCAoQmFja2luZ1N0b3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBpdCwgdGhlcmUgaXMgbm8gcmVjb3ZlcnkKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRWRpdG9yRXhlY3V0aW9uQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0VkaXRvckV4ZWN1dGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg4YTI3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRWRpdG9yRXhlY3V0aW9uQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklFeGVjdXRpb25EZWxlZ2F0ZTsKLQotCi0KLWNsYXNzIEVkaXRvckV4ZWN1dGlvbkNvbnRleHQgaW1wbGVtZW50cyBJRXhlY3V0aW9uRGVsZWdhdGUgewotCi0KLQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBmRWRpdG9yOwotCi0JcHVibGljIEVkaXRvckV4ZWN1dGlvbkNvbnRleHQoU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKCk7Ci0JCWZFZGl0b3IgPSBlZGl0b3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSUV4ZWN1dGlvbkRlbGVnYXRlI2V4ZWN1dGUoamF2YS5sYW5nLlJ1bm5hYmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoZmluYWwgUnVubmFibGUgcnVubmFibGUpIHsKLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlmaW5hbCBEaXNwbGF5IGRpc3BsYXkgPSB3b3JrYmVuY2guZ2V0RGlzcGxheSgpOwotCQlpZiAoZGlzcGxheS5nZXRUaHJlYWQoKSA9PSBUaHJlYWQuY3VycmVudFRocmVhZCgpKSB7Ci0JCQkvLyBpZiBhbHJlYWR5IGluIGRpc3BsYXkgdGhyZWFkLCB3ZSBjYW4gc2ltcGx5IHJ1biwgImFzIHVzdWFsIgotCQkJcnVubmFibGUucnVuKCk7Ci0JCX0gZWxzZSB7Ci0JCQkvLyB0aGlzIGlzIHRoZSBwYXJ0IHRoYXQncyByZWFsbHkgbmV3LCB0aGF0Ci0JCQkvLyBhY2NvbWlkYXRlJ3MgYSBjaGFuZ2UgaW4gYSBkb2N1bWVudAotCQkJLy8gZnJvbSBiYWNrZ3JvdW5kIHRocmVhZCwgYnkgZm9yY2luZyBpdCBvbgotCQkJLy8gdGhlIGRpc3BsYXkgdGhyZWFkLgotCQkJZmluYWwgU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yID0gZkVkaXRvcjsKLQkJCS8vIGlmIG5vdCBpbiBkaXNwbGF5IHRocmVhZCwgd2UgImZvcmNlIiB0byBydW4gb24gZGlzcGxheSB0aHJlYWQuCi0JCQkvLyBzZWUgZWRpdG9ycyBiZWdpbi9lbmQgYmFja2dyb3VuZCBqb2IgZm9yIG90aGVyCi0JCQkvLyBhY3Rpdml0aWVzIHRvIGJlc3QgYWNjb21pZGF0ZSAoZm9yIGV4YW1wbGUsIHRoZXJlCi0JCQkvLyBpcyBhICJ0aW1lZCBkZWxheSIgYmVmb3JlIHRoZSBlZGl0b3IgaXRzZWxmIGxlYXZlcwotCQkJLy8gYmFja2dyb3VuZC11cGRhdGUgbW9kZSkuCi0JCQkvLyBOT1RFOiB0aGlzIGV4ZWN1dGUgbWV0aG9kIGl0c2VsZiBpcyBhbHdheXMgY2FsbGVkIGZyb20KLQkJCS8vIGluc2lkZSBvZiBhbiBJTG9jayBibG9jaywgc28gYW5vdGhlcgotCQkJLy8gYmxvY2sgaXMgbm90IG5vdCBuZWVkZWQgaGVyZSBmb3IgYWxsIHRoZXNlIHN5Y25FeGVjJ3MKLQkJCWRpc3BsYXkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJaWYgKGRpc3BsYXkgIT0gbnVsbCAmJiAhZGlzcGxheS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCWVkaXRvci5iZWdpbkJhY2tncm91bmRPcGVyYXRpb24oKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gaGVyZSdzIHdoZXJlIHRoZSBkb2N1bWVudCB1cGRhdGUvbW9kaWZpY2F0aW9uCi0JCQkJCQkJLy8gb2NjdXJzCi0JCQkJCQkJcnVubmFibGUucnVuKCk7Ci0KLQkJCQkJCQkvLyBmb3IgZnV0dXJlLCBwb3NzaWJseSBleHBsb3JlIHNvbHV0aW9ucyBzdWNoIGFzCi0JCQkJCQkJLy8gdGhpcwotCQkJCQkJCS8vCQkJCQkJCUlXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlIGpvYlNlcnZpY2UgPQotCQkJCQkJCS8vIChJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZSkKLQkJCQkJCQkvLyBlZGl0b3IuZ2V0RWRpdG9yUGFydCgpLmdldFNpdGUoKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJCQkJCQkvLwkJCQkJCQlqb2JTZXJ2aWNlLnJ1bkluVUkoeHh4eHgpCi0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCS8vIHRoaXMgJ2VuZCcgaXMganVzdCBhIHNpZ25hbCB0byBlZGl0b3IgdGhhdCB0aGlzCi0JCQkJCQkJLy8gcGFydGljdWxhciB1cGRhdGUgaXMgZG9uZS4gSXRzIHVwIHRvIHRoZSBlZGl0b3IKLQkJCQkJCQkvLyB0byBkZWNpZGUgZXhhY3RseSB3aGVuIHRvIGxlYXZlIGl0cyAiYmFja2dyb3VuZAotCQkJCQkJCS8vIG1vZGUiCi0JCQkJCQkJZWRpdG9yLmVuZEJhY2tncm91bmRPcGVyYXRpb24oKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRm9sZGluZ0FjdGlvbkdyb3VwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvRm9sZGluZ0FjdGlvbkdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NDJhYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0ZvbGRpbmdBY3Rpb25Hcm91cC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aTsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRPcGVyYXRpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLklQcm9qZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklGb2xkaW5nQ29tbWFuZElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJlc291cmNlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dE9wZXJhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotCi1jbGFzcyBGb2xkaW5nQWN0aW9uR3JvdXAgZXh0ZW5kcyBBY3Rpb25Hcm91cCB7Ci0JcHJpdmF0ZSBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUHJlZmVyZW5jZUFjdGlvbiBleHRlbmRzIFJlc291cmNlQWN0aW9uIGltcGxlbWVudHMgSVVwZGF0ZSB7Ci0JCVByZWZlcmVuY2VBY3Rpb24oUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcHJlZml4LCBpbnQgc3R5bGUpIHsKLQkJCXN1cGVyKGJ1bmRsZSwgcHJlZml4LCBzdHlsZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXIgZlZpZXdlcjsKLQotCXByaXZhdGUgZmluYWwgUHJlZmVyZW5jZUFjdGlvbiBmVG9nZ2xlOwotCXByaXZhdGUgZmluYWwgVGV4dE9wZXJhdGlvbkFjdGlvbiBmRXhwYW5kQWxsOwotCXByaXZhdGUgZmluYWwgSVByb2plY3Rpb25MaXN0ZW5lciBmUHJvamVjdGlvbkxpc3RlbmVyOwotCXByaXZhdGUgZmluYWwgVGV4dE9wZXJhdGlvbkFjdGlvbiBmQ29sbGFwc2VBbGw7Ci0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgcHJvamVjdGlvbiBhY3Rpb24gZ3JvdXAgZm9yIDxjb2RlPmVkaXRvcjwvY29kZT4uIElmCi0JICogdGhlIHN1cHBsaWVkIHZpZXdlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgPGNvZGU+UHJvamVjdGlvblZpZXdlcjwvY29kZT4sCi0JICogdGhlIGFjdGlvbiBncm91cCBpcyBkaXNhYmxlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICB0aGUgdGV4dCBlZGl0b3IgdG8gb3BlcmF0ZSBvbgotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgb2YgdGhlIGVkaXRvcgotCSAqLwotCXB1YmxpYyBGb2xkaW5nQWN0aW9uR3JvdXAoZmluYWwgSVRleHRFZGl0b3IgZWRpdG9yLCBJVGV4dFZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKCEodmlld2VyIGluc3RhbmNlb2YgUHJvamVjdGlvblZpZXdlcikpIHsKLQkJCWZUb2dnbGUgPSBudWxsOwotCQkJZkV4cGFuZEFsbCA9IG51bGw7Ci0JCQlmQ29sbGFwc2VBbGwgPSBudWxsOwotCQkJZlByb2plY3Rpb25MaXN0ZW5lciA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlmVmlld2VyID0gKFByb2plY3Rpb25WaWV3ZXIpIHZpZXdlcjsKLQotCQlmUHJvamVjdGlvbkxpc3RlbmVyID0gbmV3IElQcm9qZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLQkJCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQkJCXVwZGF0ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCQkJdXBkYXRlKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJZlZpZXdlci5hZGRQcm9qZWN0aW9uTGlzdGVuZXIoZlByb2plY3Rpb25MaXN0ZW5lcik7Ci0KLQkJZlRvZ2dsZSA9IG5ldyBQcmVmZXJlbmNlQWN0aW9uKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlByb2plY3Rpb25fVG9nZ2xlXyIsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkJCWJvb2xlYW4gY3VycmVudCA9IHN0b3JlLmdldEJvb2xlYW4oSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRCk7Ci0JCQkJc3RvcmUuc2V0VmFsdWUoSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRCwgIWN1cnJlbnQpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQkJSVRleHRPcGVyYXRpb25UYXJnZXQgdGFyZ2V0ID0gKElUZXh0T3BlcmF0aW9uVGFyZ2V0KSBlZGl0b3IuZ2V0QWRhcHRlcihJVGV4dE9wZXJhdGlvblRhcmdldC5jbGFzcyk7Ci0KLQkJCQlib29sZWFuIGlzRW5hYmxlZCA9ICh0YXJnZXQgIT0gbnVsbCAmJiB0YXJnZXQuY2FuRG9PcGVyYXRpb24oUHJvamVjdGlvblZpZXdlci5UT0dHTEUpKTsKLQkJCQlzZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0JCQl9Ci0JCX07Ci0JCWZUb2dnbGUuc2V0Q2hlY2tlZCh0cnVlKTsKLQkJZlRvZ2dsZS5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSUZvbGRpbmdDb21tYW5kSWRzLkZPTERJTkdfVE9HR0xFKTsKLQkJZWRpdG9yLnNldEFjdGlvbigiRm9sZGluZ1RvZ2dsZSIsIGZUb2dnbGUpOyAvLyROT04tTkxTLTEkCi0KLQkJZkV4cGFuZEFsbCA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIlByb2plY3Rpb25fRXhwYW5kQWxsXyIsIGVkaXRvciwgUHJvamVjdGlvblZpZXdlci5FWFBBTkRfQUxMLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlmRXhwYW5kQWxsLnNldEFjdGlvbkRlZmluaXRpb25JZChJRm9sZGluZ0NvbW1hbmRJZHMuRk9MRElOR19FWFBBTkRfQUxMKTsKLQkJZWRpdG9yLnNldEFjdGlvbigiRm9sZGluZ0V4cGFuZEFsbCIsIGZFeHBhbmRBbGwpOyAvLyROT04tTkxTLTEkCi0KLQkJZkNvbGxhcHNlQWxsID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCAiUHJvamVjdGlvbl9Db2xsYXBzZUFsbF8iLCBlZGl0b3IsIFByb2plY3Rpb25WaWV3ZXIuQ09MTEFQU0VfQUxMLCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlmQ29sbGFwc2VBbGwuc2V0QWN0aW9uRGVmaW5pdGlvbklkKElGb2xkaW5nQ29tbWFuZElkcy5GT0xESU5HX0NPTExBUFNFX0FMTCk7Ci0JCWVkaXRvci5zZXRBY3Rpb24oIkZvbGRpbmdDb2xsYXBzZUFsbCIsIGZDb2xsYXBzZUFsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBncm91cCBpcyBlbmFibGVkLgotCSAqIAotCSAqIDxwcmU+Ci0JICogICAgICAgIEludmFyaWFudDogaXNFbmFibGVkKCkgJmx0Oz0mZ3Q7IGZWaWV3ZXIgYW5kIGFsbCBhY3Rpb25zIGFyZSAhPSBudWxsLgotCSAqIDwvcHJlPgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGdyb3VwIGlzIGVuYWJsZWQKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXJldHVybiBmVmlld2VyICE9IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmFjdGlvbnMuQWN0aW9uR3JvdXAjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlmVmlld2VyLnJlbW92ZVByb2plY3Rpb25MaXN0ZW5lcihmUHJvamVjdGlvbkxpc3RlbmVyKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBhY3Rpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZSgpIHsKLQkJaWYgKGlzRW5hYmxlZCgpKSB7Ci0JCQlmVG9nZ2xlLnVwZGF0ZSgpOwotCQkJZlRvZ2dsZS5zZXRDaGVja2VkKGZWaWV3ZXIuaXNQcm9qZWN0aW9uTW9kZSgpKTsKLQkJCWZFeHBhbmRBbGwudXBkYXRlKCk7Ci0JCQlmQ29sbGFwc2VBbGwudXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBGaWxscyB0aGUgbWVudSB3aXRoIGFsbCBmb2xkaW5nIGFjdGlvbnMuCi0JICogCi0JICogQHBhcmFtIG1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBtZW51IG1hbmFnZXIgZm9yIHRoZSBmb2xkaW5nIHN1Ym1lbnUKLQkgKi8KLQlwdWJsaWMgdm9pZCBmaWxsTWVudShJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQlpZiAoaXNFbmFibGVkKCkpIHsKLQkJCXVwZGF0ZSgpOwotCQkJbWFuYWdlci5hZGQoZlRvZ2dsZSk7Ci0JCQltYW5hZ2VyLmFkZChmRXhwYW5kQWxsKTsKLQkJCW1hbmFnZXIuYWRkKGZDb2xsYXBzZUFsbCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25Hcm91cCN1cGRhdGVBY3Rpb25CYXJzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVBY3Rpb25CYXJzKCkgewotCQl1cGRhdGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL0luZm9ybWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4NDc1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjI7Ci0KLS8qKgotICogSW5mb3JtYXRpb24gcHJvdmlkZXIgdXNlZCB0byBwcmVzZW50IHRoZSBpbmZvcm1hdGlvbi4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkuamF2YWVkaXRvci5KYXZhRWRpdG9yI0luZm9ybWF0aW9uRGlzcGF0Y2hBY3Rpb24KLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciNJbmZvcm1hdGlvbkRpc3BhdGNoQWN0aW9uCi0gKi8KLWNsYXNzIEluZm9ybWF0aW9uUHJvdmlkZXIgaW1wbGVtZW50cyBJSW5mb3JtYXRpb25Qcm92aWRlciwgSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24sIElJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uMiB7Ci0KLQlwcml2YXRlIElSZWdpb24gZkhvdmVyUmVnaW9uOwotCXByaXZhdGUgU3RyaW5nIGZIb3ZlckluZm87Ci0JcHJpdmF0ZSBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBmQ29udHJvbENyZWF0b3I7Ci0KLQlJbmZvcm1hdGlvblByb3ZpZGVyKElSZWdpb24gaG92ZXJSZWdpb24sIFN0cmluZyBob3ZlckluZm8sIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGNvbnRyb2xDcmVhdG9yKSB7Ci0JCWZIb3ZlclJlZ2lvbiA9IGhvdmVyUmVnaW9uOwotCQlmSG92ZXJJbmZvID0gaG92ZXJJbmZvOwotCQlmQ29udHJvbENyZWF0b3IgPSBjb250cm9sQ3JlYXRvcjsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRTdWJqZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0U3ViamVjdChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgaW52b2NhdGlvbk9mZnNldCkgewotCQlyZXR1cm4gZkhvdmVyUmVnaW9uOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyI2dldEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGdldEluZm9ybWF0aW9uMih0ZXh0Vmlld2VyLCBzdWJqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uMihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIGZIb3ZlckluZm87Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb24yI2dldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3IoKQotCSAqIEBzaW5jZSAzLjAKLQkgKi8KLQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXJDb250cm9sQ3JlYXRvcigpIHsKLQkJcmV0dXJuIGZDb250cm9sQ3JlYXRvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRFZGl0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmU0ZDk1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dEVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci1pbXBvcnQgamF2YS51dGlsLlRpbWVyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TYWZlUnVubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24uY29tbWFuZC5Db21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0SW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklTZWxlY3Rpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRPcGVyYXRpb25UYXJnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLkluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkxpbmVDaGFuZ2VIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblN1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkRvdWJsZUNsaWNrRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JRG91YmxlQ2xpY2tMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklQb3N0U2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlVHJhY2tBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNoYXJlZEltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JVGV4dEVkaXRvckhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmhlbHAuSVdvcmtiZW5jaEhlbHBTeXN0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0TGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5JV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkNoYWluZWRQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5EZWZhdWx0UmFuZ2VJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQWJzdHJhY3RUZXh0RWRpdG9ySGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklTdGF0dXNGaWVsZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Tb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0T3BlcmF0aW9uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLklDb250ZW50T3V0bGluZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuRW5jb2RpbmdNZW1lbnRvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuSUV4ZWN1dGlvbkRlbGVnYXRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JTW9kZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklQb3B1cE1lbnVDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlJlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0b3JhZ2VNb2RlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZExpbmVDaGFuZ2VIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9ucy5TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkNvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuQnJlYWtwb2ludFJ1bGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuRWRpdEJyZWFrcG9pbnRBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1Zy5NYW5hZ2VCcmVha3BvaW50QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWcuVG9nZ2xlQnJlYWtwb2ludEFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnLlRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZC5IVE1MVGV4dFByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLlN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmh5cGVybGluay5PcGVuSHlwZXJsaW5rQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzLkNvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllcy5TaG93UHJvcGVydGllc0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuTnVsbFNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU2VsZWN0aW9uSGlzdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbjsKLQotLyoqCi0gKiBBIFRleHQgRWRpdG9yIGZvciBlZGl0aW5nIHN0cnVjdHVyZWQgbW9kZWxzIGFuZCBzdHJ1Y3R1cmVkIGRvY3VtZW50cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZC48YnIgLz4KLSAqIE5ldyBjb250ZW50IHR5cGVzIG1heSBhc3NvY2lhdGUgc291cmNlIHZpZXdlciwgY29udGVudCBvdXRsaW5lLCBhbmQKLSAqIHByb3BlcnR5IHNoZWV0IGNvbmZpZ3VyYXRpb25zIHRvIGV4dGVuZCB0aGUgZXhpc3RpbmcgZnVuY3Rpb25hbGl0eS4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLSAqIAotICogQHNpbmNlIDEuMAotICovCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBleHRlbmRzIFRleHRFZGl0b3IgewotCi0KLQkvLyBJU1NVRTogVGhpcyB1c2UgY2FzZSBpcyBub3QgY2xlYXIgdG8gbWUuCi0JLy8gSXMgdGhpcyBsaXN0bmVyIGFuZCBkYW5jZSB3aXRoIGRpcnR5IHN0YXRlIGZvciBub24tZWRpdG9yIGRyaXZlbgotCS8vIHVwZGF0ZXM/Ci0JY2xhc3MgSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQkvLyBUaGlzIGlzIGZvciB0aGUgSURvY3VtZW50TGlzdGVuZXIgaW50ZXJmYWNlCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlmRGlydHlCZWZvcmVEb2N1bWVudEV2ZW50ID0gaXNEaXJ0eSgpOwotCQl9Ci0KLQkJLy8gVGhpcyBpcyBmb3IgdGhlIElEb2N1bWVudExpc3RlbmVyIGludGVyZmFjZQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJaWYgKGlzRWRpdG9ySW5wdXRSZWFkT25seSgpKSB7Ci0JCQkJLy8gc3RvcCBsaXN0ZW5pbmcgdG8gZG9jdW1lbnQgZXZlbnQKLQkJCQkvLyBjYXVzZWQgYnkgdGhlIHVuZG8gYWZ0ZXIgdmFsaWRhdGVFZGl0Ci0JCQkJZmluYWwgaW50IG9mZnNldCA9IGV2ZW50LmdldE9mZnNldCgpICsgZXZlbnQuZ2V0TGVuZ3RoKCk7Ci0JCQkJZmluYWwgSVN0cnVjdHVyZWRNb2RlbCBpbnRlcm5hbE1vZGVsID0gZ2V0SW50ZXJuYWxNb2RlbCgpOwotCQkJCWZDdXJyZW50UnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCWlmICghZkVkaXRvckRpc3Bvc2VkKSB7Ci0JCQkJCQkJYm9vbGVhbiBzdGF0dXMgPSB2YWxpZGF0ZUVkaXRvcklucHV0U3RhdGUoKTsKLQkJCQkJCQlpZiAoIXN0YXR1cykgewotCQkJCQkJCQlpZiAoaW50ZXJuYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkJCQlpbnRlcm5hbE1vZGVsLmdldFVuZG9NYW5hZ2VyKCkudW5kbygpOwotCQkJCQkJCQkJZ2V0U291cmNlVmlld2VyKCkuc2V0U2VsZWN0ZWRSYW5nZShvZmZzZXQsIDApOwotCQkJCQkJCQkJaWYgKCFmRGlydHlCZWZvcmVEb2N1bWVudEV2ZW50KSB7Ci0JCQkJCQkJCQkJLy8gcmVzZXQgZGlydHkgc3RhdGUgaWYKLQkJCQkJCQkJCQkvLyBtb2RlbCBub3QgZGlydHkgYmVmb3JlCi0JCQkJCQkJCQkJLy8gZG9jdW1lbnQgZXZlbnQKLQkJCQkJCQkJCQlpbnRlcm5hbE1vZGVsLnNldERpcnR5U3RhdGUoZmFsc2UpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZkN1cnJlbnRSdW5uYWJsZSA9IG51bGw7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCS8qCi0JCQkJICogV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGlzIGlzIHJ1biB2aWEgJ2FzeW5jRXhlYycgc2luY2UKLQkJCQkgKiB0aGVzZSBub3RpZmljYXRpb25zIGNhbiBjb21lIGZyb20gYSBub24tdWkgdGhyZWFkLgotCQkJCSAqIAotCQkJCSAqIFRoZSBub24tdWkgdGhyZWFkIGNhbGwgd291bGQgb2NjdXIgd2hlbiBjcmVhdGluZyBhIG5ldyBmaWxlCi0JCQkJICogdW5kZXIgQ2xlYXJDYXNlIChvciBvdGhlciBsaWJyYXJ5KSBjb250cm9sLiBUaGUgY3JlYXRpb24gb2YKLQkJCQkgKiB0aGUgbmV3IGZpbGUgd291bGQgdHJpZ2dlciBhIHZhbGlkYXRlRWRpdCBjYWxsLCBvbiBhbm90aGVyCi0JCQkJICogdGhyZWFkLCB0aGF0IHdvdWxkIHByb21wdCB0aGUgdXNlciB0byBhZGQgdGhlIG5ldyBmaWxlIHRvCi0JCQkJICogdmVyc2lvbiBjb250cm9sLgotCQkJCSAqLwotCQkJCURpc3BsYXkgZGlzcGxheSA9IGdldERpc3BsYXkoKTsKLQkJCQlpZiAoZGlzcGxheSAhPSBudWxsKSB7Ci0JCQkJCWlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpICE9IGRpc3BsYXkuZ2V0VGhyZWFkKCkpCi0JCQkJCQkvLyBmdXR1cmVfVE9ETzogdGhlcmUncyBwcm9iYWJseSBhIGJldHRlcgotCQkJCQkJLy8gd2F5IHRoYW4gcmVseWluZyBvbiBhc3ljbkV4ZWMKLQkJCQkJCWRpc3BsYXkuYXN5bmNFeGVjKGZDdXJyZW50UnVubmFibGUpOwotCQkJCQllbHNlCi0JCQkJCQlmQ3VycmVudFJ1bm5hYmxlLnJ1bigpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJTW9kZWxTdGF0ZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCWlmIChnZXRUZXh0Vmlld2VyKCkgIT0gbnVsbCkgewotCQkJCS8vIGdldFRleHRWaWV3ZXIoKS5zZXRSZWRyYXcoZmFsc2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlpZiAoZ2V0VGV4dFZpZXdlcigpICE9IG51bGwpIHsKLQkJCQkvLyBnZXRUZXh0Vmlld2VyKCkuc2V0UmVkcmF3KGZhbHNlKTsKLQkJCQlnZXRUZXh0Vmlld2VyKCkudW5jb25maWd1cmUoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlpZiAoZ2V0VGV4dFZpZXdlcigpICE9IG51bGwpIHsKLQkJCQkvLyBnZXRUZXh0Vmlld2VyKCkuc2V0UmVkcmF3KHRydWUpOwotCQkJCS8vIFNpbmNlIHRoZSBtb2RlbCBjYW4gYmUgY2hhbmdlZCBvbiBhIGJhY2tncm91bmQKLQkJCQkvLyB0aHJlYWQsIHdlIHdpbGwgdXBkYXRlIG1lbnVzIG9uIGRpc3BsYXkgdGhyZWFkLAotCQkJCS8vIGlmIHdlIGFyZSBub3QgYWxyZWFkeSBvbiBkaXNwbGF5IHRocmVhZCwKLQkJCQkvLyBhbmQgaWYgdGhlcmUgaXMgbm90IGFuIHVwZGF0ZSBhbHJlYWR5IHBlbmRpbmcuCi0JCQkJLy8gKHdlIGNhbiBnZXQgbG90cyBvZiAnbW9kZWxDaGFuZ2VkJyBldmVudHMgaW4gcmFwaWQKLQkJCQkvLyBzdWNjZXNzaW9uLCBzbyBvbmx5IG5lZWQgdG8gZG8gb25lLgotCQkJCWlmICghZlVwZGF0ZU1lbnVUZXh0UGVuZGluZykgewotCQkJCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGVkKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQl1cGRhdGVNZW51VGV4dCgpOwotCQkJCQkJCWZVcGRhdGVNZW51VGV4dFBlbmRpbmcgPSBmYWxzZTsKLQkJCQkJCX0KLQkJCQkJfSk7Ci0JCQkJfQotCi0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQl0cnkgewotCQkJCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY2ZnID0gZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJCQlnZXRTb3VyY2VWaWV3ZXIoKS5jb25maWd1cmUoY2ZnKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTE2NgotCQkJCS8vIGludmVzdGlnYXRlIGVhY2ggZXJyb3IgY2FzZSBwb3N0IGJldGEKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIHRyeWluZyB0byBjb25maWd1cmUgYWZ0ZXIgbW9kZWwgY2hhbmdlIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCS8vIHNvIHdlIGRvbid0IGZyZWV6ZSB3b3JrYmVuY2ggKGVnLiBkdXJpbmcgcGFnZSBsYW5ndWFnZSBvcgotCQkJCS8vIGNvbnRlbnQgdHlwZSBjaGFuZ2UpCi0JCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbikgZ2V0U291cmNlVmlld2VyKCkpLnNldFJlZHJhdyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCS8vIE5vdGU6IHRoaXMgb25lIHNob3VsZCBwcm9iYWJseSBiZSB1c2VkIHRvCi0JCS8vIGNvbnRyb2wgdmlld2VyCi0JCS8vIGluc3RlYWQgb2Ygdmlld2VyIGhhdmluZyBpdHMgb3duIGxpc3RlbmVyCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9yaWdpbmFsbW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbW92ZWRtb2RlbCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJLyoqCi0JCSAqIFRoaXMgJ1J1bm5hYmxlJyBzaG91bGQgYmUgdmVyeSBicmllZiwgYW5kIHNob3VsZCBub3QgImNhbGwgb3V0IiB0bwotCQkgKiBvdGhlciBjb2RlIGVzcGVjaWFsbHkgaWYgaXQgZGVwZW5kcyBvbiB0aGUgc3RhdGUgb2YgdGhlIG1vZGVsLgotCQkgKiAKLQkJICogQHBhcmFtIHIKLQkJICovCi0JCXByaXZhdGUgdm9pZCBydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGVkKFJ1bm5hYmxlIHIpIHsKLQkJCS8vIGlmIHRoZXJlIGlzIG5vIERpc3BsYXkgYXQgYWxsICh0aGF0IGlzLCBydW5uaW5nIGhlYWRsZXNzKSwKLQkJCS8vIG9yIGlmIHdlIGFyZSBhbHJlYWR5IHJ1bm5pbmcgb24gdGhlIGRpc3BsYXkgdGhyZWFkLCB0aGVuCi0JCQkvLyBzaW1wbHkgZXhlY3V0ZSB0aGUgcnVubmFibGUuCi0JCQlpZiAoZ2V0RGlzcGxheSgpID09IG51bGwgfHwgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpKSkgewotCQkJCXIucnVuKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBvdGhlcndpc2UgZm9yY2UgdGhlIHJ1bm5hYmxlIHRvIHJ1biBvbiB0aGUgZGlzcGxheSB0aHJlYWQuCi0JCQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhyKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIE1vdXNlVHJhY2tlciBleHRlbmRzIE1vdXNlVHJhY2tBZGFwdGVyIGltcGxlbWVudHMgTW91c2VNb3ZlTGlzdGVuZXIgewotCQkvKiogVGhlIHRyYWNrZXIncyBzdWJqZWN0IGNvbnRyb2wuICovCi0JCXByaXZhdGUgQ29udHJvbCBmU3ViamVjdENvbnRyb2w7Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZXMgYSBuZXcgbW91c2UgdHJhY2tlci4KLQkJICovCi0JCXB1YmxpYyBNb3VzZVRyYWNrZXIoKSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZUhvdmVyKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQkJCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiaG92ZXI6ICIrZXZlbnQueCArICJ4IiArIGV2ZW50LnkpOwotCQkJaG92ZXJYID0gZXZlbnQueDsKLQkJCWhvdmVyWSA9IGV2ZW50Lnk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXIjbW91c2VNb3ZlKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vdXNlTW92ZShNb3VzZUV2ZW50IGUpIHsKLQkJCWhvdmVyWCA9IGUueDsKLQkJCWhvdmVyWSA9IGUueTsKLQkJfQotCi0JCS8qKgotCQkgKiBTdGFydHMgdGhpcyBtb3VzZSB0cmFja2VyLiBUaGUgZ2l2ZW4gY29udHJvbCBiZWNvbWVzIHRoaXMgdHJhY2tlcidzCi0JCSAqIHN1YmplY3QgY29udHJvbC4gSW5zdGFsbHMgaXRzZWxmIGFzIG1vdXNlIHRyYWNrIGxpc3RlbmVyIG9uIHRoZQotCQkgKiBzdWJqZWN0IGNvbnRyb2wuCi0JCSAqIAotCQkgKiBAcGFyYW0gc3ViamVjdENvbnRyb2wKLQkJICogICAgICAgICAgICB0aGUgc3ViamVjdCBjb250cm9sCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdGFydChDb250cm9sIHN1YmplY3RDb250cm9sKSB7Ci0JCQlmU3ViamVjdENvbnRyb2wgPSBzdWJqZWN0Q29udHJvbDsKLQkJCWlmIChmU3ViamVjdENvbnRyb2wgIT0gbnVsbCAmJiAhZlN1YmplY3RDb250cm9sLmlzRGlzcG9zZWQoKSkgewotCQkJCWZTdWJqZWN0Q29udHJvbC5hZGRNb3VzZU1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJCQlmU3ViamVjdENvbnRyb2wuYWRkTW91c2VUcmFja0xpc3RlbmVyKHRoaXMpOwotCQkJCWZTdWJqZWN0Q29udHJvbC5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCQkJcHVibGljIHZvaWQgd2lkZ2V0RGlzcG9zZWQoRGlzcG9zZUV2ZW50IGUpIHsKLQkJCQkJCXN0b3AoKTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIFN0b3BzIHRoaXMgbW91c2UgdHJhY2tlci4gUmVtb3ZlcyBpdHNlbGYgYXMgbW91c2UgdHJhY2ssIG1vdXNlCi0JCSAqIG1vdmUsIGFuZCBzaGVsbCBsaXN0ZW5lciBmcm9tIHRoZSBzdWJqZWN0IGNvbnRyb2wuCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQkJaWYgKGZTdWJqZWN0Q29udHJvbCAhPSBudWxsICYmICFmU3ViamVjdENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJZlN1YmplY3RDb250cm9sLnJlbW92ZU1vdXNlTW92ZUxpc3RlbmVyKHRoaXMpOwotCQkJCWZTdWJqZWN0Q29udHJvbC5yZW1vdmVNb3VzZVRyYWNrTGlzdGVuZXIodGhpcyk7Ci0JCQkJZlN1YmplY3RDb250cm9sID0gbnVsbDsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIExpc3RlbnMgdG8gZG91YmxlLWNsaWNrIGFuZCBzZWxlY3Rpb24gZnJvbSB0aGUgb3V0bGluZSBwYWdlCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBPdXRsaW5lUGFnZUxpc3RlbmVyIGltcGxlbWVudHMgSURvdWJsZUNsaWNrTGlzdGVuZXIsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpKQotCQkJCXJldHVybjsKLQotCQkJaW50IHN0YXJ0ID0gLTE7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJSVNlbGVjdGlvbiBjdXJyZW50U2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpZiAoY3VycmVudFNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCU9iamVjdCBjdXJyZW50ID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgY3VycmVudFNlbGVjdGlvbikudG9BcnJheSgpOwotCQkJCQlPYmplY3QgbmV3U2VsZWN0aW9uID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLnRvQXJyYXkoKTsKLQkJCQkJaWYgKCFjdXJyZW50LmVxdWFscyhuZXdTZWxlY3Rpb24pKSB7Ci0JCQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQkJT2JqZWN0IG8gPSBzZWxlY3Rpb24uZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQlpZiAobyBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCQlzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQlsZW5ndGggPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldEVuZE9mZnNldCgpIC0gc3RhcnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCQlzdGFydCA9ICgoSVRleHRSZWdpb24pIG8pLmdldFN0YXJ0KCk7Ci0JCQkJCQkJbGVuZ3RoID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0RW5kKCkgLSBzdGFydDsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQkJCQkJc3RhcnQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRTdGFydCgpOwotCQkJCQkJCWxlbmd0aCA9ICgoSVRleHRSZWdpb24pIG8pLmdldExlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCXN0YXJ0ID0gKChJVGV4dFNlbGVjdGlvbikgZXZlbnQuZ2V0U2VsZWN0aW9uKCkpLmdldE9mZnNldCgpOwotCQkJCWxlbmd0aCA9ICgoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRMZW5ndGgoKTsKLQkJCX0KLQkJCWlmIChzdGFydCA+IC0xKSB7Ci0JCQkJZ2V0U291cmNlVmlld2VyKCkuc2V0UmFuZ2VJbmRpY2F0aW9uKHN0YXJ0LCBsZW5ndGgsIGZhbHNlKTsKLQkJCQlzZWxlY3RBbmRSZXZlYWwoc3RhcnQsIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJLyoKLQkJCSAqIERvIG5vdCBhbGxvdyBzZWxlY3Rpb24gZnJvbSBvdGhlciBwYXJ0cyB0byBhZmZlY3Qgc2VsZWN0aW9uIGluCi0JCQkgKiB0aGUgdGV4dCB3aWRnZXQgaWYgaXQgaGFzIGZvY3VzLCBvciBpZiB3ZSdyZSBzdGlsbCBmaXJpbmcgYQotCQkJICogY2hhbmdlIG9mIHNlbGVjdGlvbi4gU2VsZWN0aW9uIGV2ZW50cyAiYm91bmNpbmciIG9mZiBvZiBvdGhlcgotCQkJICogcGFydHMgYXJlIGFsbCB0aGF0IHdlIGNhbiByZWNlaXZlIGlmIHdlIGhhdmUgZm9jdXMgKHNpbmNlIHdlCi0JCQkgKiBmb3J3YXJkZWQgb3VyIHNlbGVjdGlvbiB0byB0aGUgc2VydmljZSBqdXN0IGEgbW9tZW50IGFnbyksIGFuZAotCQkJICogb25seSB0aGUgdXNlciBzaG91bGQgYWZmZWN0IHNlbGVjdGlvbiBpZiB3ZSBoYXZlIGZvY3VzLgotCQkJICovCi0KLQkJCS8qIFRoZSBpc0ZpcmluZ1NlbGVjdGlvbiBjaGVjayBvbmx5IHdvcmtzIGlmIGEgc2VsZWN0aW9uIGxpc3RlbmVyICovCi0JCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkuaXNFbXB0eSgpIHx8IGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIuaXNGaXJpbmdTZWxlY3Rpb24oKSkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsICYmIGdldFNvdXJjZVZpZXdlcigpLmdldFRleHRXaWRnZXQoKSAhPSBudWxsICYmICFnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkuaXNEaXNwb3NlZCgpICYmICFnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkuaXNGb2N1c0NvbnRyb2woKSkgewotCQkJCWludCBzdGFydCA9IC0xOwotCQkJCWludCBsZW5ndGggPSAwOwotCQkJCWlmIChldmVudC5nZXRTZWxlY3Rpb24oKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJCUlTZWxlY3Rpb24gY3VycmVudCA9IGdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCWlmIChjdXJyZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQkJCU9iamVjdFtdIGN1cnJlbnRTZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBjdXJyZW50KS50b0FycmF5KCk7Ci0JCQkJCQlPYmplY3RbXSBuZXdTZWxlY3Rpb24gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkudG9BcnJheSgpOwotCQkJCQkJaWYgKCFBcnJheXMuZXF1YWxzKGN1cnJlbnRTZWxlY3Rpb24sIG5ld1NlbGVjdGlvbikpIHsKLQkJCQkJCQlpZiAobmV3U2VsZWN0aW9uLmxlbmd0aCA+IDApIHsKLQkJCQkJCQkJLyoKLQkJCQkJCQkJICogTm8gb3JkZXJpbmcgaXMgZ3VhcmFudGVlZCBmb3IgbXVsdGlwbGUKLQkJCQkJCQkJICogc2VsZWN0aW9uCi0JCQkJCQkJCSAqLwotCQkJCQkJCQlPYmplY3QgbyA9IG5ld1NlbGVjdGlvblswXTsKLQkJCQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQkJCQlzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldEVuZE9mZnNldCgpOwotCQkJCQkJCQkJaWYgKG5ld1NlbGVjdGlvbi5sZW5ndGggPiAxKSB7Ci0JCQkJCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuZXdTZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgKChJbmRleGVkUmVnaW9uKSBuZXdTZWxlY3Rpb25baV0pLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkJCQkJCQllbmQgPSBNYXRoLm1heChlbmQsICgoSW5kZXhlZFJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRFbmRPZmZzZXQoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCWVsc2UgaWYgKG8gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbikgewotCQkJCQkJCQkJc3RhcnQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRTdGFydCgpOwotCQkJCQkJCQkJaW50IGVuZCA9ICgoSVRleHRSZWdpb24pIG8pLmdldEVuZCgpOwotCQkJCQkJCQkJaWYgKG5ld1NlbGVjdGlvbi5sZW5ndGggPiAxKSB7Ci0JCQkJCQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBuZXdTZWxlY3Rpb24ubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJCQkJc3RhcnQgPSBNYXRoLm1pbihzdGFydCwgKChJVGV4dFJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRTdGFydCgpKTsKLQkJCQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKElUZXh0UmVnaW9uKSBuZXdTZWxlY3Rpb25baV0pLmdldEVuZCgpKTsKLQkJCQkJCQkJCQl9Ci0JCQkJCQkJCQkJbGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElSZWdpb24pIHsKLQkJCQkJCQkJCXN0YXJ0ID0gKChJUmVnaW9uKSBvKS5nZXRPZmZzZXQoKTsKLQkJCQkJCQkJCWludCBlbmQgPSBzdGFydCArICgoSVJlZ2lvbikgbykuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJCQlpZiAobmV3U2VsZWN0aW9uLmxlbmd0aCA+IDEpIHsKLQkJCQkJCQkJCQlmb3IgKGludCBpID0gMTsgaSA8IG5ld1NlbGVjdGlvbi5sZW5ndGg7IGkrKykgewotCQkJCQkJCQkJCQlzdGFydCA9IE1hdGgubWluKHN0YXJ0LCAoKElSZWdpb24pIG5ld1NlbGVjdGlvbltpXSkuZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCQkJCQllbmQgPSBNYXRoLm1heChlbmQsICgoSVJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRPZmZzZXQoKSArICgoSVJlZ2lvbikgbmV3U2VsZWN0aW9uW2ldKS5nZXRMZW5ndGgoKSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJCWxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJc3RhcnQgPSAoKElUZXh0U2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0T2Zmc2V0KCk7Ci0JCQkJfQotCQkJCWlmIChzdGFydCA+IC0xKSB7Ci0JCQkJCXVwZGF0ZVJhbmdlSW5kaWNhdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCXNlbGVjdEFuZFJldmVhbChzdGFydCwgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIFNob3dJblRhcmdldExpc3RBZGFwdGVyIGltcGxlbWVudHMgSVNob3dJblRhcmdldExpc3QgewotCQkvKioKLQkJICogQXJyYXkgb2YgSUQgU3RyaW5ncyB0aGF0IGRlZmluZSB0aGUgZGVmYXVsdCBzaG93IGluIHRhcmdldHMgZm9yCi0JCSAqIHRoaXMgZWRpdG9yLgotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXRMaXN0I2dldFNob3dJblRhcmdldElkcygpCi0JCSAqIEByZXR1cm4gdGhlIGFycmF5IG9mIElEIFN0cmluZ3MgdGhhdCBkZWZpbmUgdGhlIGRlZmF1bHQgc2hvdyBpbgotCQkgKiAgICAgICAgIHRhcmdldHMgZm9yIHRoaXMgZWRpdG9yLgotCQkgKi8KLQkJcHVibGljIFN0cmluZ1tdIGdldFNob3dJblRhcmdldElkcygpIHsKLQkJCXJldHVybiBmU2hvd0luVGFyZ2V0SWRzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBwb3N0IHNlbGVjdGlvbiBwcm92aWRlciB0aGF0IHdyYXBzIHRoZSBwcm92aWRlciBpbXBsZW1lbnRlZCBpbgotCSAqIEFic3RyYWN0VGV4dEVkaXRvciB0byBwcm92aWRlIGEgU3RydWN0dXJlZFRleHRTZWxlY3Rpb24gdG8gcG9zdAotCSAqIHNlbGVjdGlvbiBsaXN0ZW5lcnMuIExpc3RlbnMgdG8gc2VsZWN0aW9uIGNoYW5nZXMgZnJvbSB0aGUgc291cmNlCi0JICogdmlld2VyLgotCSAqLwotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciBpbXBsZW1lbnRzIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIsIElTZWxlY3Rpb25WYWxpZGF0b3IgewotCQkvKioKLQkJICogQSAiaHlicmlkIiB0ZXh0IGFuZCBzdHJ1Y3R1cmVkIHNlbGVjdGlvbiBjbGFzcy4gQ29udmVydHMgdGhlIHNvdXJjZQotCQkgKiB2aWV3ZXIgdGV4dCBzZWxlY3Rpb24gdG8gYSBnZW5lcmljICJnZXRJbmRleGVkUmVnaW9uIi1kZXJpdmVkCi0JCSAqIHN0cnVjdHVyZWQgc2VsZWN0aW9uLCBhbGxvd2luZyBzZWxlY3Rpb24gY2hhbmdlZCBsaXN0ZW5lcnMgdG8KLQkJICogcG9zc2libHkgbm90IG5lZWQgdG8gcmVmZXJlbmNlIHRoZSBtb2RlbCBkaXJlY3RseS4KLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uIGV4dGVuZHMgVGV4dFNlbGVjdGlvbiBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkU2VsZWN0aW9uLCBJVGV4dFNlbGVjdGlvbiB7Ci0JCQlwcml2YXRlIFdlYWtSZWZlcmVuY2Ugd2Vha1NlbGVjdGVkU3RydWN0dXJlZDsKLQkJCXByaXZhdGUgSW50ZXJuYWxUZXh0U2VsZWN0aW9uIGZJbnRlcm5hbFRleHRTZWxlY3Rpb247Ci0KLQkJCVN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKElUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiwgSURvY3VtZW50IGRvY3VtZW50LCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQkJLy8gbm90ZTogd2UgZG8gbm90IGN1cnJlbnRseSB1c2Ugc3VwZXIgY2xhc3MgYXQgYWxsLCBidXQsIG9ubHkKLQkJCQkvLyBzdWJjbGFzcyBUZXh0U2VsZWN0aW9uLAotCQkJCS8vIGJlY2F1c2Ugc29tZSBpbmZyYXN0cnVjdHVyZSBjb2RlIHVzZXMgImluc3RhbmNlb2YKLQkJCQkvLyBUZXh0U2VsZWN0aW9uIiBpbnN0ZWFkIG9mIElUZXh0U2VsZWN0aW9uLgotCQkJCXN1cGVyKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCQlmSW50ZXJuYWxUZXh0U2VsZWN0aW9uID0gbmV3IEludGVybmFsVGV4dFNlbGVjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCXdlYWtTZWxlY3RlZFN0cnVjdHVyZWQgPSBuZXcgV2Vha1JlZmVyZW5jZShpbml0aWFsaXplSW5mZXJyZWRTZWxlY3RlZE9iamVjdHMoc2VsZWN0aW9uLCBtb2RlbCkpOwotCQkJfQotCi0JCQlTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbihJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24sIE9iamVjdFtdIHNlbGVjdGVkT2JqZWN0cywgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQkJc3VwZXIoc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZJbnRlcm5hbFRleHRTZWxlY3Rpb24gPSBuZXcgSW50ZXJuYWxUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJd2Vha1NlbGVjdGVkU3RydWN0dXJlZCA9IG5ldyBXZWFrUmVmZXJlbmNlKHNlbGVjdGVkT2JqZWN0cyk7Ci0JCQl9Ci0KLQkJCVN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzKSB7Ci0JCQkJc3VwZXIob2Zmc2V0LCBsZW5ndGgpOwotCQkJCWZJbnRlcm5hbFRleHRTZWxlY3Rpb24gPSBuZXcgSW50ZXJuYWxUZXh0U2VsZWN0aW9uKGRvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJd2Vha1NlbGVjdGVkU3RydWN0dXJlZCA9IG5ldyBXZWFrUmVmZXJlbmNlKHNlbGVjdGVkT2JqZWN0cyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBPYmplY3QgZ2V0Rmlyc3RFbGVtZW50KCkgewotCQkJCU9iamVjdFtdIHNlbGVjdGVkU3RydWN0dXJlcyA9IGdldFNlbGVjdGVkU3RydWN0dXJlcygpOwotCQkJCXJldHVybiBzZWxlY3RlZFN0cnVjdHVyZXMubGVuZ3RoID4gMCA/IHNlbGVjdGVkU3RydWN0dXJlc1swXSA6IG51bGw7Ci0JCQl9Ci0KLQkJCXByaXZhdGUgT2JqZWN0W10gZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCkgewotCQkJCU9iamVjdFtdIHNlbGVjdGVkU3RydWN0dXJlcyA9IChPYmplY3RbXSkgd2Vha1NlbGVjdGVkU3RydWN0dXJlZC5nZXQoKTsKLQkJCQlpZiAoc2VsZWN0ZWRTdHJ1Y3R1cmVzID09IG51bGwpIHsKLQkJCQkJc2VsZWN0ZWRTdHJ1Y3R1cmVzID0gbmV3IE9iamVjdFswXTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHNlbGVjdGVkU3RydWN0dXJlczsKLQkJCX0KLQotCQkJcHJpdmF0ZSBPYmplY3RbXSBpbml0aWFsaXplSW5mZXJyZWRTZWxlY3RlZE9iamVjdHMoSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uLCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQkJT2JqZWN0W10gbG9jYWxTZWxlY3RlZFN0cnVjdHVyZXMgPSBudWxsOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24gcmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQlpbnQgZW5kID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWlmIChlbmQgPD0gcmVnaW9uLmdldEVuZE9mZnNldCgpKSB7Ci0JCQkJCQkJLy8gc2luZ2xlIHNlbGVjdGlvbgotCQkJCQkJCWxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzID0gbmV3IE9iamVjdFsxXTsKLQkJCQkJCQlsb2NhbFNlbGVjdGVkU3RydWN0dXJlc1swXSA9IHJlZ2lvbjsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG11bHRpcGxlIHNlbGVjdGlvbgotCQkJCQkJCWludCBtYXhMZW5ndGggPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJCQkJCQlMaXN0IHN0cnVjdHVyZXMgPSBuZXcgQXJyYXlMaXN0KDIpOwotCQkJCQkJCXdoaWxlIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0RW5kT2Zmc2V0KCkgPD0gZW5kICYmIHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSA8IG1heExlbmd0aCkgewotCQkJCQkJCQlzdHJ1Y3R1cmVzLmFkZChyZWdpb24pOwotCQkJCQkJCQlyZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvbi5nZXRFbmRPZmZzZXQoKSArIDEpOwotCQkJCQkJCX0KLQkJCQkJCQlsb2NhbFNlbGVjdGVkU3RydWN0dXJlcyA9IHN0cnVjdHVyZXMudG9BcnJheSgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb2NhbFNlbGVjdGVkU3RydWN0dXJlcyA9PSBudWxsKSB7Ci0JCQkJCWxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzID0gbmV3IE9iamVjdFswXTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGxvY2FsU2VsZWN0ZWRTdHJ1Y3R1cmVzOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmlzRW1wdHkoKSAmJiBnZXRTZWxlY3RlZFN0cnVjdHVyZXMoKS5sZW5ndGggPT0gMDsKLQkJCX0KLQotCQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJCXJldHVybiB0b0xpc3QoKS5pdGVyYXRvcigpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IHNpemUoKSB7Ci0JCQkJcmV0dXJuIGdldFNlbGVjdGVkU3RydWN0dXJlcygpLmxlbmd0aDsKLQkJCX0KLQotCQkJcHVibGljIE9iamVjdFtdIHRvQXJyYXkoKSB7Ci0JCQkJcmV0dXJuIGdldFNlbGVjdGVkU3RydWN0dXJlcygpOwotCQkJfQotCi0JCQlwdWJsaWMgTGlzdCB0b0xpc3QoKSB7Ci0JCQkJcmV0dXJuIEFycmF5cy5hc0xpc3QoZ2V0U2VsZWN0ZWRTdHJ1Y3R1cmVzKCkpOwotCQkJfQotCi0JCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgIjoiICsgZkludGVybmFsVGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSArICJAIiArIGdldFNlbGVjdGVkU3RydWN0dXJlcygpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQotCi0JCQlwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFRleHRTZWxlY3Rpb24gaW1wbGVtZW50cyBJVGV4dFNlbGVjdGlvbiB7Ci0KLQotCQkJCXByaXZhdGUgV2Vha1JlZmVyZW5jZSB3ZWFrRG9jdW1lbnQ7Ci0KLQkJCQkvKiogT2Zmc2V0IG9mIHRoZSBzZWxlY3Rpb24gKi8KLQkJCQlwcml2YXRlIGludCBmT2Zmc2V0OwotCQkJCS8qKiBMZW5ndGggb2YgdGhlIHNlbGVjdGlvbiAqLwotCQkJCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0KLQotCQkJCS8qKgotCQkJCSAqIENyZWF0ZXMgYW4gZW1wdHkgdGV4dCBzZWxlY3Rpb24uCi0JCQkJICovCi0JCQkJcHJpdmF0ZSBJbnRlcm5hbFRleHRTZWxlY3Rpb24oKSB7Ci0JCQkJCXRoaXMobnVsbCwgLTEsIC0xKTsKLQkJCQl9Ci0KLQkJCQkvKioKLQkJCQkgKiBDcmVhdGVzIGEgdGV4dCBzZWxlY3Rpb24gZm9yIHRoZSBnaXZlbiByYW5nZS4gVGhpcwotCQkJCSAqIHNlbGVjdGlvbiBvYmplY3QgZGVzY3JpYmVzIGdlbmVyaWNhbGx5IGEgdGV4dCByYW5nZSBhbmQgaXMKLQkJCQkgKiBpbnRlbmRlZCB0byBiZSBhbiBhcmd1bWVudCBmb3IgdGhlCi0JCQkJICogPGNvZGU+c2V0U2VsZWN0aW9uPC9jb2RlPiBtZXRob2Qgb2Ygc2VsZWN0aW9uIHByb3ZpZGVycy4KLQkJCQkgKiAKLQkJCQkgKiBAcGFyYW0gb2Zmc2V0Ci0JCQkJICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSByYW5nZQotCQkJCSAqIEBwYXJhbSBsZW5ndGgKLQkJCQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIHJhbmdlCi0JCQkJICovCi0JCQkJSW50ZXJuYWxUZXh0U2VsZWN0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJCQkJdGhpcyhudWxsLCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJfQotCi0JCQkJLyoqCi0JCQkJICogQ3JlYXRlcyBhIHRleHQgc2VsZWN0aW9uIGZvciB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgdGhlIGdpdmVuCi0JCQkJICogZG9jdW1lbnQuIFRoaXMgc2VsZWN0aW9uIG9iamVjdCBpcyBjcmVhdGVkIGJ5IHNlbGVjdGlvbgotCQkJCSAqIHByb3ZpZGVycyBpbiByZXNwb25kcyA8Y29kZT5nZXRTZWxlY3Rpb248L2NvZGU+LgotCQkJCSAqIAotCQkJCSAqIEBwYXJhbSBkb2N1bWVudAotCQkJCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50IHdob3NlIHRleHQgcmFuZ2UgaXMgc2VsZWN0ZWQgaW4gYQotCQkJCSAqICAgICAgICAgICAgdmlld2VyCi0JCQkJICogQHBhcmFtIG9mZnNldAotCQkJCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgc2VsZWN0ZWQgcmFuZ2UKLQkJCQkgKiBAcGFyYW0gbGVuZ3RoCi0JCQkJICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBzZWxlY3RlZCByYW5nZQotCQkJCSAqLwotCQkJCUludGVybmFsVGV4dFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJCQkJd2Vha0RvY3VtZW50ID0gbmV3IFdlYWtSZWZlcmVuY2UoZG9jdW1lbnQpOwotCQkJCQlmT2Zmc2V0ID0gb2Zmc2V0OwotCQkJCQlmTGVuZ3RoID0gbGVuZ3RoOwotCQkJCX0KLQotCQkJCS8qKgotCQkJCSAqIAotCQkJCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgb2Zmc2V0IGFuZCBsZW5ndGggYXJlIHNtYWxsZXIgdGhhbiAwLiBBCi0JCQkJICogc2VsZWN0aW9uIG9mIGxlbmd0aCAwLCBpcyBhIHZhbGlkIHRleHQgc2VsZWN0aW9uIGFzIGl0Ci0JCQkJICogZGVzY3JpYmVzLCBlLmcuLCB0aGUgY3Vyc29yIHBvc2l0aW9uIGluIGEgdmlld2VyLgotCQkJCSAqIAotCQkJCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzZWxlY3Rpb24gaXMgZW1wdHkKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbiNpc0VtcHR5KCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQkJCQlyZXR1cm4gZk9mZnNldCA8IDAgfHwgZkxlbmd0aCA8IDA7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb24jZ2V0T2Zmc2V0KCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJCQkJcmV0dXJuIGZPZmZzZXQ7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb24jZ2V0TGVuZ3RoKCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCQkJcmV0dXJuIGZMZW5ndGg7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb24jZ2V0U3RhcnRMaW5lKCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgaW50IGdldFN0YXJ0TGluZSgpIHsKLQotCQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURvY3VtZW50KSB3ZWFrRG9jdW1lbnQuZ2V0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGZPZmZzZXQpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJCX0KLQotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCi0JCQkJLyoKLQkJCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb24jZ2V0RW5kTGluZSgpCi0JCQkJICovCi0JCQkJcHVibGljIGludCBnZXRFbmRMaW5lKCkgewotCQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURvY3VtZW50KSB3ZWFrRG9jdW1lbnQuZ2V0KCk7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCWludCBlbmRPZmZzZXQgPSBmT2Zmc2V0ICsgZkxlbmd0aDsKLQkJCQkJCQlpZiAoZkxlbmd0aCAhPSAwKQotCQkJCQkJCQllbmRPZmZzZXQtLTsKLQkJCQkJCQlyZXR1cm4gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGVuZE9mZnNldCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJfQotCi0JCQkJCXJldHVybiAtMTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbiNnZXRUZXh0KCkKLQkJCQkgKi8KLQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCQkJCXJldHVybiBkb2N1bWVudC5nZXQoZk9mZnNldCwgZkxlbmd0aCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJfQotCi0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCS8qCi0JCQkJICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhPYmplY3QpCi0JCQkJICovCi0JCQkJcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLQkJCQkJaWYgKG9iaiA9PSB0aGlzKQotCQkJCQkJcmV0dXJuIHRydWU7Ci0KLQkJCQkJaWYgKG9iaiA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0KLQkJCQkJSW50ZXJuYWxUZXh0U2VsZWN0aW9uIHMgPSAoSW50ZXJuYWxUZXh0U2VsZWN0aW9uKSBvYmo7Ci0JCQkJCWJvb2xlYW4gc2FtZVJhbmdlID0gKHMuZk9mZnNldCA9PSBmT2Zmc2V0ICYmIHMuZkxlbmd0aCA9PSBmTGVuZ3RoKTsKLQkJCQkJaWYgKHNhbWVSYW5nZSkgewotCi0JCQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURvY3VtZW50KSB3ZWFrRG9jdW1lbnQuZ2V0KCk7Ci0JCQkJCQlJRG9jdW1lbnQgc0RvY3VtZW50ID0gcy5nZXREb2N1bWVudCgpOwotCi0JCQkJCQkvLyBJU1NVRTogd2h5IGRvZXMgbm90IElEb2N1bWVudCAuZXF1YWxzIHN1ZmZpY2U/Ci0JCQkJCQlpZiAoc0RvY3VtZW50ID09IG51bGwgJiYgZG9jdW1lbnQgPT0gbnVsbCkKLQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCWlmIChzRG9jdW1lbnQgPT0gbnVsbCB8fCBkb2N1bWVudCA9PSBudWxsKQotCQkJCQkJCXJldHVybiBmYWxzZTsKLQotCQkJCQkJdHJ5IHsKLQkJCQkJCQkvLyBJU1NVRTogcHJpY2V5ISAoYSBjYWNoZWQgaGFzaCBtaWdodCBiZSBpbiBvcmRlciwgaWYgdGhpcyAKLQkJCQkJCQkvLyB3YXMgZXZlciByZWFsbHkgZXZlciB1c2VkIHZlcnkgb2Z0ZW4uCi0JCQkJCQkJU3RyaW5nIHNDb250ZW50ID0gc0RvY3VtZW50LmdldChmT2Zmc2V0LCBmTGVuZ3RoKTsKLQkJCQkJCQlTdHJpbmcgY29udGVudCA9IGRvY3VtZW50LmdldChmT2Zmc2V0LCBmTGVuZ3RoKTsKLQkJCQkJCQlyZXR1cm4gc0NvbnRlbnQuZXF1YWxzKGNvbnRlbnQpOwotCQkJCQkJfQotCQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCQkJCQkvLyByZXR1cm4gZmFsc2UsIGNhbiBub3QgYmUgZXF1YWwKLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JCQkJICovCi0JCQkJcHVibGljIGludCBoYXNoQ29kZSgpIHsKLQkJCQkJSURvY3VtZW50IGRvY3VtZW50ID0gKElEb2N1bWVudCkgd2Vha0RvY3VtZW50LmdldCgpOwotCQkJCQlpbnQgbG93ID0gZG9jdW1lbnQgIT0gbnVsbCA/IGRvY3VtZW50Lmhhc2hDb2RlKCkgOiAwOwotCQkJCQlyZXR1cm4gKGZPZmZzZXQgPDwgMjQpIHwgKGZMZW5ndGggPDwgMTYpIHwgbG93OwotCQkJCX0KLQotCQkJCXByaXZhdGUgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJCQlpZiAod2Vha0RvY3VtZW50ID09IG51bGwpCi0JCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQkJcmV0dXJuIChJRG9jdW1lbnQpIHdlYWtEb2N1bWVudC5nZXQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBpbnQgZ2V0T2Zmc2V0KCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJfQotCi0KLQkJCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCQkJfQotCi0JCQlwdWJsaWMgaW50IGdldFN0YXJ0TGluZSgpIHsKLQkJCQlyZXR1cm4gZkludGVybmFsVGV4dFNlbGVjdGlvbi5nZXRTdGFydExpbmUoKTsKLQkJCX0KLQotCQkJcHVibGljIGludCBnZXRFbmRMaW5lKCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldEVuZExpbmUoKTsKLQkJCX0KLQotCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQkJCXJldHVybiBmSW50ZXJuYWxUZXh0U2VsZWN0aW9uLmdldFRleHQoKTsKLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgV2Vha1JlZmVyZW5jZSB3ZWFrRG9jdW1lbnQ7Ci0JCXByaXZhdGUgSVNlbGVjdGlvblByb3ZpZGVyIGZQYXJlbnRQcm92aWRlciA9IG51bGw7Ci0JCXByaXZhdGUgYm9vbGVhbiBpc0ZpcmluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQlwcml2YXRlIExpc3RlbmVyTGlzdCBsaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0IHBvc3RMaXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KCk7Ci0JCXByaXZhdGUgSVNlbGVjdGlvbiBmTGFzdFNlbGVjdGlvbiA9IG51bGw7Ci0JCXByaXZhdGUgSVNlbGVjdGlvblByb3ZpZGVyIGZMYXN0U2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCQlwcml2YXRlIFNlbGVjdGlvbkNoYW5nZWRFdmVudCBmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCQlwcml2YXRlIFdlYWtSZWZlcmVuY2Ugd2Vha0VkaXRvcjsKLQotCi0JCVN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlcihJU2VsZWN0aW9uUHJvdmlkZXIgcGFyZW50UHJvdmlkZXIsIFN0cnVjdHVyZWRUZXh0RWRpdG9yIHN0cnVjdHVyZWRUZXh0RWRpdG9yKSB7Ci0JCQlmUGFyZW50UHJvdmlkZXIgPSBwYXJlbnRQcm92aWRlcjsKLQkJCXdlYWtFZGl0b3IgPSBuZXcgV2Vha1JlZmVyZW5jZShzdHJ1Y3R1cmVkVGV4dEVkaXRvcik7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzdHJ1Y3R1cmVkVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoc3RydWN0dXJlZFRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXNldERvY3VtZW50KGRvY3VtZW50KTsKLQkJCX0KLQkJCWZQYXJlbnRQcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJaGFuZGxlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlpZiAoZlBhcmVudFByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgZlBhcmVudFByb3ZpZGVyKS5hZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkJaGFuZGxlUG9zdFNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBhZGRQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXBvc3RMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBmaXJlU2VsZWN0aW9uQ2hhbmdlZChmaW5hbCBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQsIExpc3RlbmVyTGlzdCBsaXN0ZW5lckxpc3QpIHsKLQkJCU9iamVjdFtdIGxpc3RlbmVycyA9IGxpc3RlbmVyTGlzdC5nZXRMaXN0ZW5lcnMoKTsKLQkJCWlzRmlyaW5nU2VsZWN0aW9uID0gdHJ1ZTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgKytpKSB7Ci0JCQkJZmluYWwgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsID0gKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQlTYWZlUnVubmVyLnJ1bihuZXcgU2FmZVJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlsLnNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCQl9Ci0JCQkJfSk7Ci0JCQl9Ci0JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IGZhbHNlOwotCQl9Ci0KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uUHJvdmlkZXIgZ2V0UGFyZW50UHJvdmlkZXIoKSB7Ci0JCQlyZXR1cm4gZlBhcmVudFByb3ZpZGVyOwotCQl9Ci0KLQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJZkxhc3RTZWxlY3Rpb24gPSBudWxsOwotCQkJZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9IG51bGw7Ci0JCQlmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgPSBudWxsOwotCi0JCQkvKgotCQkJICogV2hlbiBhIGNsaWVudCBleHBsaWNpdGx5IGFza3MgZm9yIHNlbGVjdGlvbiwgcHJvdmlkZSB0aGUgaHlicmlkCi0JCQkgKiByZXN1bHQuCi0JCQkgKi8KLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gZ2V0UGFyZW50UHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCWlmICghKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGxvY2FsRWRpdG9yID0gZ2V0U3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCQlpZiAobG9jYWxFZGl0b3IgIT0gbnVsbCkgewotCQkJCQltb2RlbCA9IGxvY2FsRWRpdG9yLmdldE1vZGVsKCk7Ci0JCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbigoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbiwgZ2V0RG9jdW1lbnQoKSwgbW9kZWwpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uKChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uLCBnZXREb2N1bWVudCgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gc2VsZWN0aW9uOwotCQl9Ci0KLQkJcHJpdmF0ZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBnZXRTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpIHsKLQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvciA9IG51bGw7Ci0JCQlpZiAod2Vha0VkaXRvciAhPSBudWxsKSB7Ci0JCQkJZWRpdG9yID0gKFN0cnVjdHVyZWRUZXh0RWRpdG9yKSB3ZWFrRWRpdG9yLmdldCgpOwotCQkJfQotCQkJcmV0dXJuIGVkaXRvcjsKLQkJfQotCi0JCXZvaWQgaGFuZGxlUG9zdFNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgdXBkYXRlZEV2ZW50ID0gbnVsbDsKLQkJCWlmIChmTGFzdFNlbGVjdGlvbiA9PSBldmVudC5nZXRTZWxlY3Rpb24oKSAmJiBmTGFzdFNlbGVjdGlvblByb3ZpZGVyID09IGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCkpIHsKLQkJCQl1cGRhdGVkRXZlbnQgPSBmTGFzdFVwZGF0ZWRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl1cGRhdGVkRXZlbnQgPSB1cGRhdGVFdmVudChldmVudCk7Ci0JCQl9Ci0JCQkvLyBvbmx5IHVwZGF0ZSB0aGUgcmFuZ2UgaW5kaWNhdG9yIG9uIHBvc3Qgc2VsZWN0aW9uCi0JCQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBsb2NhbEVkaXRvciA9IChTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgd2Vha0VkaXRvci5nZXQoKTsKLQotCQkJaWYgKGxvY2FsRWRpdG9yICE9IG51bGwpIHsKLQkJCQlsb2NhbEVkaXRvci51cGRhdGVSYW5nZUluZGljYXRpb24odXBkYXRlZEV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQlmaXJlU2VsZWN0aW9uQ2hhbmdlZCh1cGRhdGVkRXZlbnQsIHBvc3RMaXN0ZW5lcnMpOwotCQkJfQotCQl9Ci0KLQkJdm9pZCBoYW5kbGVTZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IHVwZGF0ZWRFdmVudCA9IGV2ZW50OwotCQkJaWYgKGZMYXN0U2VsZWN0aW9uICE9IGV2ZW50LmdldFNlbGVjdGlvbigpIHx8IGZMYXN0U2VsZWN0aW9uUHJvdmlkZXIgIT0gZXZlbnQuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkgewotCQkJCWZMYXN0U2VsZWN0aW9uID0gZXZlbnQuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJZkxhc3RTZWxlY3Rpb25Qcm92aWRlciA9IGV2ZW50LmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCQkJZkxhc3RVcGRhdGVkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gdXBkYXRlZEV2ZW50ID0gdXBkYXRlRXZlbnQoZXZlbnQpOwotCQkJfQotCQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQodXBkYXRlZEV2ZW50LCBsaXN0ZW5lcnMpOwotCQl9Ci0KLQkJSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmICh3ZWFrRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50ID0gKElEb2N1bWVudCkgd2Vha0RvY3VtZW50LmdldCgpOwotCQkJfQotCQkJcmV0dXJuIGRvY3VtZW50OwotCQl9Ci0KLQotCQlib29sZWFuIGlzRmlyaW5nU2VsZWN0aW9uKCkgewotCQkJcmV0dXJuIGlzRmlyaW5nU2VsZWN0aW9uOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNWYWxpZChJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJLy8gSVNTVUU6IGlzIG5vdCBjbGVhciBkZWZhdWx0IGJlaGF2aW9yIHNob3VsZCBiZSB0cnVlPwotCQkJLy8gQnV0IG5vdCBjbGVhciBpcyB0aGlzIGRlZmF1bHQgd291bGQgYXBwbHkgZm9yIG91ciBlZGl0b3IuCi0JCQlib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0JCQkvLyBpZiBlZGl0b3IgaXMgImdvbmUiLCBjYW4gbm90IGJlIHZhbGlkCi0JCQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBlID0gZ2V0U3RydWN0dXJlZFRleHRFZGl0b3IoKTsgCi0JCQlpZiAoZSA9PSBudWxsIHx8IGUuZkVkaXRvckRpc3Bvc2VkKSB7Ci0JCQkJcmVzdWx0ID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBlbHNlIGRlZmVyIHRvIHBhcmVudAotCQkJZWxzZSBpZiAoZ2V0UGFyZW50UHJvdmlkZXIoKSBpbnN0YW5jZW9mIElTZWxlY3Rpb25WYWxpZGF0b3IpIHsKLQkJCQlyZXN1bHQgPSAoKElTZWxlY3Rpb25WYWxpZGF0b3IpIGdldFBhcmVudFByb3ZpZGVyKCkpLmlzVmFsaWQoc2VsZWN0aW9uKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmVQb3N0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCXBvc3RMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQlsaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJaWYgKGlzRmlyaW5nU2VsZWN0aW9uKCkpIHsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWZMYXN0U2VsZWN0aW9uID0gbnVsbDsKLQkJCWZMYXN0U2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCQkJZkxhc3RVcGRhdGVkU2VsZWN0aW9uQ2hhbmdlZEV2ZW50ID0gbnVsbDsKLQotCQkJSVNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gdXBkYXRlU2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQlnZXRQYXJlbnRQcm92aWRlcigpLnNldFNlbGVjdGlvbih0ZXh0U2VsZWN0aW9uKTsKLQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGxvY2FsRWRpdG9yID0gZ2V0U3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCWlmIChsb2NhbEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJbG9jYWxFZGl0b3IudXBkYXRlUmFuZ2VJbmRpY2F0aW9uKHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIGNvcnJlc3BvbmRpbmcgZXZlbnQgdGhhdCBjb250YWlucyBhCi0JCSAqIFN0cnVjdHVyZWRUZXh0c2VsZWN0aW9uCi0JCSAqIAotCQkgKiBAcGFyYW0gZXZlbnQKLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgdXBkYXRlRXZlbnQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uICYmICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBudWxsOwotCQkJCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGxvY2FsRWRpdG9yID0gZ2V0U3RydWN0dXJlZFRleHRFZGl0b3IoKTsKLQkJCQlpZiAobG9jYWxFZGl0b3IgIT0gbnVsbCkgewotCQkJCQlzdHJ1Y3R1cmVkTW9kZWwgPSBsb2NhbEVkaXRvci5nZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCQkJfQotCQkJCXNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbigoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpLCBnZXREb2N1bWVudCgpLCBzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJfQotCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IG5ld0V2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLCBzZWxlY3Rpb24pOwotCQkJcmV0dXJuIG5ld0V2ZW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIENyZWF0ZSBhIGNvcnJlc3BvbmRpbmcgU3RydWN0dXJlZFRleHRzZWxlY3Rpb24KLQkJICogCi0JCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkJICogQHJldHVybgotCQkgKi8KLQkJcHJpdmF0ZSBJU2VsZWN0aW9uIHVwZGF0ZVNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJSVNlbGVjdGlvbiB1cGRhdGVkID0gc2VsZWN0aW9uOwotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uICYmICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pICYmICFzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCQkJaWYgKHNlbGVjdGVkT2JqZWN0cy5sZW5ndGggPiAwKSB7Ci0JCQkJCWludCBzdGFydCA9IC0xOwotCQkJCQlpbnQgbGVuZ3RoID0gMDsKLQotCQkJCQkvLyBubyBvcmRlcmluZyBpcyBndWFyYW50ZWVkIGZvciBtdWx0aXBsZSBzZWxlY3Rpb24KLQkJCQkJT2JqZWN0IG8gPSBzZWxlY3RlZE9iamVjdHNbMF07Ci0JCQkJCWlmIChvIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJc3RhcnQgPSAoKEluZGV4ZWRSZWdpb24pIG8pLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQlpbnQgZW5kID0gKChJbmRleGVkUmVnaW9uKSBvKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdHMubGVuZ3RoID4gMSkgewotCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSW5kZXhlZFJlZ2lvbikgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKEluZGV4ZWRSZWdpb24pIHNlbGVjdGVkT2JqZWN0c1tpXSkuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCQkJCX0KLQkJCQkJCQlsZW5ndGggPSBlbmQgLSBzdGFydDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCXN0YXJ0ID0gKChJVGV4dFJlZ2lvbikgbykuZ2V0U3RhcnQoKTsKLQkJCQkJCWludCBlbmQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRFbmQoKTsKLQkJCQkJCWlmIChzZWxlY3RlZE9iamVjdHMubGVuZ3RoID4gMSkgewotCQkJCQkJCWZvciAoaW50IGkgPSAxOyBpIDwgc2VsZWN0ZWRPYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsICgoSVRleHRSZWdpb24pIHNlbGVjdGVkT2JqZWN0c1tpXSkuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkJCWVuZCA9IE1hdGgubWF4KGVuZCwgKChJVGV4dFJlZ2lvbikgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRFbmQoKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWxlbmd0aCA9IGVuZCAtIHN0YXJ0OwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJaWYgKHN0YXJ0ID4gLTEpIHsKLQkJCQkJCXVwZGF0ZWQgPSBuZXcgU3RydWN0dXJlZFRleHRTZWxlY3Rpb24oZ2V0RG9jdW1lbnQoKSwgc3RhcnQsIGxlbmd0aCwgc2VsZWN0ZWRPYmplY3RzKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiB1cGRhdGVkOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQl3ZWFrRG9jdW1lbnQgPSBuZXcgV2Vha1JlZmVyZW5jZShkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBUaW1lT3V0RXhwaXJlZCBleHRlbmRzIFRpbWVyVGFzayB7Ci0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWdldERpc3BsYXkoKS5zeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZ2V0RGlzcGxheSgpICE9IG51bGwgJiYgIWdldERpc3BsYXkoKS5pc0Rpc3Bvc2VkKCkpCi0JCQkJCQllbmRCdXN5U3RhdGVJbnRlcm5hbCgpOwotCQkJCX0KLQkJCX0pOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIGNsYXNzIENvbmZpZ3VyYXRpb25BbmRUYXJnZXQgewotCQlwcml2YXRlIFN0cmluZyBmVGFyZ2V0SWQ7Ci0JCXByaXZhdGUgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCi0JCXB1YmxpYyBDb25maWd1cmF0aW9uQW5kVGFyZ2V0KFN0cmluZyB0YXJnZXRJZCwgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQkJZlRhcmdldElkID0gdGFyZ2V0SWQ7Ci0JCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZzsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gZlRhcmdldElkOwotCQl9Ci0KLQkJcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgewotCQkJcmV0dXJuIGZDb25maWd1cmF0aW9uOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBhY3Rpb24gYmVoYXZlcyBpbiB0d28gZGlmZmVyZW50IHdheXM6IElmIHRoZXJlIGlzIG5vIGN1cnJlbnQgdGV4dAotCSAqIGhvdmVyLCB0aGUgamF2YWRvYyBpcyBkaXNwbGF5ZWQgdXNpbmcgaW5mb3JtYXRpb24gcHJlc2VudGVyLiBJZiB0aGVyZQotCSAqIGlzIGEgY3VycmVudCB0ZXh0IGhvdmVyLCBpdCBpcyBjb252ZXJ0ZWQgaW50byBhIGluZm9ybWF0aW9uIHByZXNlbnRlcgotCSAqIGluIG9yZGVyIHRvIG1ha2UgaXQgc3RpY2t5LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuSmF2YUVkaXRvciNJbmZvcm1hdGlvbkRpc3BhdGNoQWN0aW9uCi0JICovCi0JY2xhc3MgSW5mb3JtYXRpb25EaXNwYXRjaEFjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCi0JCS8qKiBUaGUgd3JhcHBlZCB0ZXh0IG9wZXJhdGlvbiBhY3Rpb24uICovCi0JCXByaXZhdGUgZmluYWwgVGV4dE9wZXJhdGlvbkFjdGlvbiBmVGV4dE9wZXJhdGlvbkFjdGlvbjsKLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIGRpc3BhdGNoIGFjdGlvbi4KLQkJICogCi0JCSAqIEBwYXJhbSByZXNvdXJjZUJ1bmRsZQotCQkgKiAgICAgICAgICAgIHRoZSByZXNvdXJjZSBidW5kbGUKLQkJICogQHBhcmFtIHByZWZpeAotCQkgKiAgICAgICAgICAgIHRoZSBwcmVmaXgKLQkJICogQHBhcmFtIHRleHRPcGVyYXRpb25BY3Rpb24KLQkJICogICAgICAgICAgICB0aGUgdGV4dCBvcGVyYXRpb24gYWN0aW9uCi0JCSAqLwotCQlwdWJsaWMgSW5mb3JtYXRpb25EaXNwYXRjaEFjdGlvbihSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSwgU3RyaW5nIHByZWZpeCwgZmluYWwgVGV4dE9wZXJhdGlvbkFjdGlvbiB0ZXh0T3BlcmF0aW9uQWN0aW9uKSB7Ci0JCQlzdXBlcihyZXNvdXJjZUJ1bmRsZSwgcHJlZml4LCBTdHJ1Y3R1cmVkVGV4dEVkaXRvci50aGlzKTsKLQkJCWlmICh0ZXh0T3BlcmF0aW9uQWN0aW9uID09IG51bGwpCi0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotCQkJZlRleHRPcGVyYXRpb25BY3Rpb24gPSB0ZXh0T3BlcmF0aW9uQWN0aW9uOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIgPSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJCWlmIChzb3VyY2VWaWV3ZXIgPT0gbnVsbCkgewotCQkJCWZUZXh0T3BlcmF0aW9uQWN0aW9uLnJ1bigpOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKHNvdXJjZVZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNCkgewotCQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNCBleHRlbnNpb240ID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNCkgc291cmNlVmlld2VyOwotCQkJCWlmIChleHRlbnNpb240Lm1vdmVGb2N1c1RvV2lkZ2V0VG9rZW4oKSkKLQkJCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoIShzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjIpKSB7Ci0JCQkJZlRleHRPcGVyYXRpb25BY3Rpb24ucnVuKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlJVGV4dFZpZXdlckV4dGVuc2lvbjIgdGV4dFZpZXdlckV4dGVuc2lvbjIgPSAoSVRleHRWaWV3ZXJFeHRlbnNpb24yKSBzb3VyY2VWaWV3ZXI7Ci0KLQkJCS8vIGRvZXMgYSB0ZXh0IGhvdmVyIGV4aXN0PwotCQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSB0ZXh0Vmlld2VyRXh0ZW5zaW9uMi5nZXRDdXJyZW50VGV4dEhvdmVyKCk7Ci0JCQlpZiAodGV4dEhvdmVyID09IG51bGwpIHsKLQkJCQlmVGV4dE9wZXJhdGlvbkFjdGlvbi5ydW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCVBvaW50IGhvdmVyRXZlbnRMb2NhdGlvbiA9IHRleHRWaWV3ZXJFeHRlbnNpb24yLmdldEhvdmVyRXZlbnRMb2NhdGlvbigpOwotCQkJaW50IG9mZnNldCA9IGNvbXB1dGVPZmZzZXRBdExvY2F0aW9uKHNvdXJjZVZpZXdlciwgaG92ZXJFdmVudExvY2F0aW9uLngsIGhvdmVyRXZlbnRMb2NhdGlvbi55KTsKLQkJCWlmIChvZmZzZXQgPT0gLTEpIHsKLQkJCQlmVGV4dE9wZXJhdGlvbkFjdGlvbi5ydW4oKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCXRyeSB7Ci0JCQkJLy8gZ2V0IHRoZSB0ZXh0IGhvdmVyIGNvbnRlbnQKLQkJCQlTdHJpbmcgY29udGVudFR5cGUgPSBUZXh0VXRpbGl0aWVzLmdldENvbnRlbnRUeXBlKHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpLCBJU3RydWN0dXJlZFBhcnRpdGlvbmluZy5ERUZBVUxUX1NUUlVDVFVSRURfUEFSVElUSU9OSU5HLCBvZmZzZXQsIHRydWUpOwotCi0JCQkJSVJlZ2lvbiBob3ZlclJlZ2lvbiA9IHRleHRIb3Zlci5nZXRIb3ZlclJlZ2lvbihzb3VyY2VWaWV3ZXIsIG9mZnNldCk7Ci0JCQkJaWYgKGhvdmVyUmVnaW9uID09IG51bGwpCi0JCQkJCXJldHVybjsKLQotCQkJCVN0cmluZyBob3ZlckluZm8gPSB0ZXh0SG92ZXIuZ2V0SG92ZXJJbmZvKHNvdXJjZVZpZXdlciwgaG92ZXJSZWdpb24pOwotCi0JCQkJSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgY29udHJvbENyZWF0b3IgPSBudWxsOwotCQkJCWlmICh0ZXh0SG92ZXIgaW5zdGFuY2VvZiBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjIpCi0JCQkJCWNvbnRyb2xDcmVhdG9yID0gKChJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbjIpIHRleHRIb3ZlcikuZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXJDb250cm9sQ3JlYXRvcigpOwotCi0JCQkJSUluZm9ybWF0aW9uUHJvdmlkZXIgaW5mb3JtYXRpb25Qcm92aWRlciA9IG5ldyBJbmZvcm1hdGlvblByb3ZpZGVyKGhvdmVyUmVnaW9uLCBob3ZlckluZm8sIGNvbnRyb2xDcmVhdG9yKTsKLQotCQkJCWZJbmZvcm1hdGlvblByZXNlbnRlci5zZXRPZmZzZXQob2Zmc2V0KTsKLQkJCQlmSW5mb3JtYXRpb25QcmVzZW50ZXIuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORyk7Ci0JCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLnNldEluZm9ybWF0aW9uUHJvdmlkZXIoaW5mb3JtYXRpb25Qcm92aWRlciwgY29udGVudFR5cGUpOwotCQkJCWZJbmZvcm1hdGlvblByZXNlbnRlci5zaG93SW5mb3JtYXRpb24oKTsKLQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBObyBnb29kIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkKLQkJCX0KLQkJfQotCi0JCS8vIG1vZGlmaWVkIHZlcnNpb24gZnJvbSBUZXh0Vmlld2VyCi0JCXByaXZhdGUgaW50IGNvbXB1dGVPZmZzZXRBdExvY2F0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCB4LCBpbnQgeSkgewotCi0JCQlTdHlsZWRUZXh0IHN0eWxlZFRleHQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQotCQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQkJcmV0dXJuIC0xOwotCi0JCQl0cnkgewotCQkJCWludCB3aWRnZXRMb2NhdGlvbiA9IHN0eWxlZFRleHQuZ2V0T2Zmc2V0QXRMb2NhdGlvbihuZXcgUG9pbnQoeCwgeSkpOwotCQkJCWlmICh0ZXh0Vmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB0ZXh0Vmlld2VyOwotCQkJCQlyZXR1cm4gZXh0ZW5zaW9uLndpZGdldE9mZnNldDJNb2RlbE9mZnNldCh3aWRnZXRMb2NhdGlvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJUmVnaW9uIHZpc2libGVSZWdpb24gPSB0ZXh0Vmlld2VyLmdldFZpc2libGVSZWdpb24oKTsKLQkJCQkJcmV0dXJuIHdpZGdldExvY2F0aW9uICsgdmlzaWJsZVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gLTE7Ci0JCQl9Ci0KLQkJfQotCX0KLQotCS8qKgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBjaGFyW10gQlJBQ0tFVFMgPSB7J3snLCAnfScsICcoJywgJyknLCAnWycsICddJ307Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEJVU1lfU1RBVEVfREVMQVkgPSAxMDAwOwotCS8qKgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9UID0gIi4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9DT05URVhUX01FTlVfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvci5FZGl0b3JDb250ZXh0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfQ09OVEVYVF9NRU5VX1NVRkZJWCA9ICIuc291cmNlLkVkaXRvckNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JLyoqIE5vbi1OTFMgc3RyaW5ncyAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfS0VZQklORElOR19TQ09QRV9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZWRUZXh0RWRpdG9yU2NvcGUiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9OQU1FX0FERElUSU9OUyA9ICJhZGRpdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9OQU1FX0ZPUk1BVCA9ICJGb3JtYXQiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9OQU1FX0ZPUk1BVF9FWFQgPSAiRm9ybWF0LmV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPX0FDVElPTl9ERVNDID0gU1NFVUlNZXNzYWdlcy5SZWRvX19fMF9fX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICJSZWRvOiB7MH0uIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPX0FDVElPTl9ERVNDX0RFRkFVTFQgPSBTU0VVSU1lc3NhZ2VzLlJlZG9fVGV4dF9DaGFuZ2VfX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICJSZWRvIFRleHQgQ2hhbmdlLiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVET19BQ1RJT05fVEVYVCA9IFNTRVVJTWVzc2FnZXMuX1JlZG9fXzBfX19DdHJsX1lfVUlfOyAvLyROT04tTkxTLTEkID0gIiZSZWRvIHswfSBAQ3RybCtZIgotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRURPX0FDVElPTl9URVhUX0RFRkFVTFQgPSBTU0VVSU1lc3NhZ2VzLl9SZWRvX1RleHRfQ2hhbmdlX19DdHJsX1lfVUlfOyAvLyROT04tTkxTLTEkID0gIiZSZWRvIFRleHQgQ2hhbmdlIEBDdHJsK1kiCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJVTEVSX0NPTlRFWFRfTUVOVV9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yLlJ1bGVyQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlVMRVJfQ09OVEVYVF9NRU5VX1NVRkZJWCA9ICIuc291cmNlLlJ1bGVyQ29udGV4dCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBVTkRFUlNDT1JFID0gIl8iOyAvLyROT04tTkxTLTEkCi0JLyoqIFRyYW5zbGF0YWJsZSBzdHJpbmdzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE9fQUNUSU9OX0RFU0MgPSBTU0VVSU1lc3NhZ2VzLlVuZG9fX18wX19fVUlfOyAvLyROT04tTkxTLTEkID0gIlVuZG86IHswfS4iCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19BQ1RJT05fREVTQ19ERUZBVUxUID0gU1NFVUlNZXNzYWdlcy5VbmRvX1RleHRfQ2hhbmdlX19VSV87IC8vJE5PTi1OTFMtMSQgPSAiVW5kbyBUZXh0IENoYW5nZS4iCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVORE9fQUNUSU9OX1RFWFQgPSBTU0VVSU1lc3NhZ2VzLl9VbmRvX18wX19fQ3RybF9aX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICImVW5kbyB7MH0gQEN0cmwrWiIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVU5ET19BQ1RJT05fVEVYVF9ERUZBVUxUID0gU1NFVUlNZXNzYWdlcy5fVW5kb19UZXh0X0NoYW5nZV9fQ3RybF9aX1VJXzsgLy8kTk9OLU5MUy0xJCA9ICImVW5kbyBUZXh0IENoYW5nZSBAQ3RybCtaIgotCS8vIGRldmVsb3BtZW50IHRpbWUvZGVidWcgdmFyaWFibGVzIG9ubHkKLQlwcml2YXRlIGludCBhZGFwdGVyUmVxdWVzdHM7Ci0KLQlwcml2YXRlIGxvbmcgYWRhcHRlclRpbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGZCYWNrZ3JvdW5kSm9iRW5kZWQ7Ci0JcHJpdmF0ZSBib29sZWFuIGZCdXN5U3RhdGU7Ci0JcHJpdmF0ZSBUaW1lciBmQnVzeVRpbWVyOwotCVJ1bm5hYmxlIGZDdXJyZW50UnVubmFibGUgPSBudWxsOwotCWJvb2xlYW4gZkRpcnR5QmVmb3JlRG9jdW1lbnRFdmVudCA9IGZhbHNlOwotCXByaXZhdGUgRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlciBmRHJvcEFkYXB0ZXI7Ci0JcHJpdmF0ZSBEcm9wVGFyZ2V0IGZEcm9wVGFyZ2V0OwotCWJvb2xlYW4gZkVkaXRvckRpc3Bvc2VkID0gZmFsc2U7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yUGFydDsKLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXI7Ci0JcHJpdmF0ZSBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0JcHJpdmF0ZSBNb3VzZVRyYWNrZXIgZk1vdXNlVHJhY2tlcjsKLQlwcml2YXRlIElDb250ZW50T3V0bGluZVBhZ2UgZk91dGxpbmVQYWdlOwotCi0JcHJpdmF0ZSBPdXRsaW5lUGFnZUxpc3RlbmVyIGZPdXRsaW5lUGFnZUxpc3RlbmVyID0gbnVsbDsKLQkvKiogVGhpcyBlZGl0b3IncyBwcm9qZWN0aW9uIG1vZGVsIHVwZGF0ZXIgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmUHJvamVjdGlvbk1vZGVsVXBkYXRlcjsKLQkvKiogVGhpcyBlZGl0b3IncyBwcm9qZWN0aW9uIHN1cHBvcnQgKi8KLQlwcml2YXRlIFByb2plY3Rpb25TdXBwb3J0IGZQcm9qZWN0aW9uU3VwcG9ydDsKLQlwcml2YXRlIElQcm9wZXJ0eVNoZWV0UGFnZSBmUHJvcGVydHlTaGVldFBhZ2U7Ci0JcHJpdmF0ZSBTdHJpbmcgZlJlbWVtYmVyVGl0bGU7Ci0JLyoqIFRoZSBydWxlciBjb250ZXh0IG1lbnUgdG8gYmUgZGlzcG9zZWQuICovCi0JcHJpdmF0ZSBNZW51IGZSdWxlckNvbnRleHRNZW51OwotCS8qKiBUaGUgcnVsZXIgY29udGV4dCBtZW51IG1hbmFnZXIgdG8gYmUgZGlzcG9zZWQuICovCi0JcHJpdmF0ZSBNZW51TWFuYWdlciBmUnVsZXJDb250ZXh0TWVudU1hbmFnZXI7Ci0KLQlTdHJpbmdbXSBmU2hvd0luVGFyZ2V0SWRzID0gbmV3IFN0cmluZ1tde0lQYWdlTGF5b3V0LklEX1JFU19OQVZ9OwotCi0JcHJpdmF0ZSBJQWN0aW9uIGZTaG93UHJvcGVydGllc0FjdGlvbiA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZTdHJ1Y3R1cmVkTW9kZWw7Ci0JU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyIGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCS8qKiBUaGUgdGV4dCBjb250ZXh0IG1lbnUgdG8gYmUgZGlzcG9zZWQuICovCi0JcHJpdmF0ZSBNZW51IGZUZXh0Q29udGV4dE1lbnU7Ci0JLyoqIFRoZSB0ZXh0IGNvbnRleHQgbWVudSBtYW5hZ2VyIHRvIGJlIGRpc3Bvc2VkLiAqLwotCXByaXZhdGUgTWVudU1hbmFnZXIgZlRleHRDb250ZXh0TWVudU1hbmFnZXI7Ci0JcHJpdmF0ZSBTdHJpbmcgZlZpZXdlckNvbmZpZ3VyYXRpb25UYXJnZXRJZDsKLQkvKiogVGhlIHNlbGVjdGlvbiBoaXN0b3J5IG9mIHRoZSBlZGl0b3IgKi8KLQlwcml2YXRlIFNlbGVjdGlvbkhpc3RvcnkgZlNlbGVjdGlvbkhpc3Rvcnk7Ci0JLyoqIFRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZXIuICovCi0JcHJpdmF0ZSBJbmZvcm1hdGlvblByZXNlbnRlciBmSW5mb3JtYXRpb25QcmVzZW50ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZVcGRhdGVNZW51VGV4dFBlbmRpbmc7Ci0JaW50IGhvdmVyWCA9IC0xOwotCWludCBob3ZlclkgPSAtMTsKLQotCXByaXZhdGUgYm9vbGVhbiBzaG91bGRDbG9zZSA9IGZhbHNlOwotCXByaXZhdGUgbG9uZyBzdGFydFBlcmZUaW1lOwotCXByaXZhdGUgYm9vbGVhbiBmaXNSZWxlYXNlZDsKLQkvKioKLQkgKiBUaGUgYWN0aW9uIGdyb3VwIGZvciBmb2xkaW5nLgotCSAqLwotCXByaXZhdGUgRm9sZGluZ0FjdGlvbkdyb3VwIGZGb2xkaW5nR3JvdXA7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFN0cnVjdHVyZWQgVGV4dCBFZGl0b3IuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0RWRpdG9yKCkgewotCQlzdXBlcigpOwotCQlpbml0aWFsaXplRG9jdW1lbnRQcm92aWRlcihudWxsKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWJvdXRUb1NhdmVNb2RlbCgpIHsKLQkJaWYgKGdldEludGVybmFsTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlnZXRJbnRlcm5hbE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWJzdHJhY3RUZXh0RWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8pKTsKLQkJbWVudS5hZGQobmV3IEdyb3VwTWFya2VyKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1NBVkUpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9DT1BZKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfUFJJTlQpKTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9FRElUKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfRklORCkpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuR1JPVVBfQUREKSk7Ci0JCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfUkVTVCkpOwotCQltZW51LmFkZChuZXcgU2VwYXJhdG9yKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0KLQkJaWYgKGlzRWRpdGFibGUoKSkgewotCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8sIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8pOwotCQkJYWRkQWN0aW9uKG1lbnUsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1VORE8sIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFVkVSVF9UT19TQVZFRCk7Ci0JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfU0FWRSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU0FWRSk7Ci0JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfQ09QWSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ1VUKTsKLQkJCWFkZEFjdGlvbihtZW51LCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9DT1BZLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DT1BZKTsKLQkJCWFkZEFjdGlvbihtZW51LCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9DT1BZLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5QQVNURSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGRBY3Rpb24obWVudSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfQ09QWSwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQ09QWSk7Ci0JCX0KLQotCQkvLyBmcm9tIEFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvcgotCQlJQWN0aW9uIHByZWZlcmVuY2VzQWN0aW9uID0gZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkNPTlRFWFRfUFJFRkVSRU5DRVMpOwotCQltZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMsIG5ldyBTZXBhcmF0b3IoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfU0VUVElOR1MpKTsKLQkJbWVudS5hcHBlbmRUb0dyb3VwKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1NFVFRJTkdTLCBwcmVmZXJlbmNlc0FjdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQ29udGV4dE1lbnVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIE9ubHkgb2ZmZXIgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgdGV4dCBpZiB0aGUgdmlld2VyIGFsbG93cwotCQkvLyBtb2RpZmljYXRpb24gYW5kIHN1cHBvcnRzIGFueSBvZiB0aGVzZSBvcGVyYXRpb25zCi0JCUlBY3Rpb24gZm9ybWF0QWxsID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCk7Ci0JCUlBY3Rpb24gZm9ybWF0U2VsZWN0aW9uID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMpOwotCQlJQWN0aW9uIGNsZWFudXBBbGwgPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ0xFQU5VUF9ET0NVTUVOVCk7Ci0JCWJvb2xlYW4gZW5hYmxlRm9ybWF0TWVudSA9IChmb3JtYXRBbGwgIT0gbnVsbCAmJiBmb3JtYXRBbGwuaXNFbmFibGVkKCkpIHx8IChmb3JtYXRTZWxlY3Rpb24gIT0gbnVsbCAmJiBmb3JtYXRTZWxlY3Rpb24uaXNFbmFibGVkKCkpIHx8IChjbGVhbnVwQWxsICE9IG51bGwgJiYgY2xlYW51cEFsbC5pc0VuYWJsZWQoKSk7Ci0KLQkJaWYgKGdldFNvdXJjZVZpZXdlcigpLmlzRWRpdGFibGUoKSAmJiBlbmFibGVGb3JtYXRNZW51KSB7Ci0JCQlTdHJpbmcgbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLkZvcm1hdE1lbnVfbGFiZWw7IC8vJE5PTi1OTFMtMSQgPSAiRm9ybWF0IgotCQkJTWVudU1hbmFnZXIgc3ViTWVudSA9IG5ldyBNZW51TWFuYWdlcihsYWJlbCwgR1JPVVBfTkFNRV9GT1JNQVQpOwotCQkJc3ViTWVudS5hZGQobmV3IEdyb3VwTWFya2VyKEdST1VQX05BTUVfRk9STUFUX0VYVCkpOwotCQkJYWRkQWN0aW9uKHN1Yk1lbnUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCk7Ci0JCQlhZGRBY3Rpb24oc3ViTWVudSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUyk7Ci0JCQlzdWJNZW51LmFkZChuZXcgR3JvdXBNYXJrZXIoR1JPVVBfTkFNRV9BRERJVElPTlMpKTsKLQkJCWFkZEFjdGlvbihtZW51LCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9FRElULCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DTEVBTlVQX0RPQ1VNRU5UKTsKLQkJCW1lbnUuYXBwZW5kVG9Hcm91cChJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9FRElULCBzdWJNZW51KTsKLQkJfQotCi0JCS8vIFNvbWUgRGVzaWduIGVkaXRvcnMgKERURCkgcmVseSBvbiB0aGlzIHZpZXcgZm9yIHRoZWlyIG93biB1c2VzCi0JCW1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLkdST1VQX0FERCwgZlNob3dQcm9wZXJ0aWVzQWN0aW9uKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWRkRXh0ZW5kZWRDb250ZXh0TWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGMgPSBnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJaWYgKGMgaW5zdGFuY2VvZiBJUG9wdXBNZW51Q29udHJpYnV0b3IpIHsKLQkJCSgoSVBvcHVwTWVudUNvbnRyaWJ1dG9yKSBjKS5jb250cmlidXRlVG9Qb3B1cE1lbnUobWVudSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIoKTsKLQkJCUlFeHRlbmRlZENvbnRyaWJ1dG9yIHBtYyA9IGJ1aWxkZXIucmVhZEFjdGlvbkV4dGVuc2lvbnMoZ2V0Q29uZmlndXJhdGlvblBvaW50cygpKTsKLQkJCWlmIChwbWMgIT0gbnVsbCkgewotCQkJCXBtYy5zZXRBY3RpdmVFZGl0b3IodGhpcyk7Ci0JCQkJcG1jLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEV4dGVuZGVkUnVsZXJDb250ZXh0TWVudUFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gbm9uZSBhdCB0aGlzIGxldmVsCi0JfQotCi0KLQotCS8qKgotCSAqIFN0YXJ0cyBiYWNrZ3JvdW5kIG1vZGUuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICovCi0Jdm9pZCBiZWdpbkJhY2tncm91bmRPcGVyYXRpb24oKSB7Ci0JCWZCYWNrZ3JvdW5kSm9iRW5kZWQgPSBmYWxzZTsKLQkJLy8gaWYgYWxyZWFkeSBpbiBidXN5IHN0YXRlLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nCi0JCS8vIGFuZCwgd2Ugb25seSBzdGFydCwgb3IgcmVzZXQsIHRoZSB0aW1lZCBidXN5Ci0JCS8vIHN0YXRlIHdoZW4gd2UgZ2V0IHRoZSAiZW5kQmFja2dyb3VuZE9wZXJhdGlvbiIgY2FsbC4KLQkJaWYgKCFpbkJ1c3lTdGF0ZSgpKSB7Ci0JCQliZWdpbkJ1c3lTdGF0ZUludGVybmFsKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgYmVnaW5CdXN5U3RhdGVJbnRlcm5hbCgpIHsKLQotCQlmQnVzeVN0YXRlID0gdHJ1ZTsKLQkJc3RhcnRCdXN5VGltZXIoKTsKLQotCQlJU291cmNlVmlld2VyIHZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCSgoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcikuYmVnaW5CYWNrZ3JvdW5kVXBkYXRlKCk7Ci0KLQkJfQotCQlzaG93QnVzeSh0cnVlKTsKLQl9Ci0KLQkvLyBwcml2YXRlIHZvaWQgYWRkRmluZE9jY3VycmVuY2VzQWN0aW9uKFN0cmluZyBtYXRjaFR5cGUsIFN0cmluZwotCS8vIG1hdGNoVGV4dCwgSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkvLwotCS8vIEFic3RyYWN0RmluZE9jY3VycmVuY2VzQWN0aW9uIGFjdGlvbiA9IG5ldwotCS8vIEFic3RyYWN0RmluZE9jY3VycmVuY2VzQWN0aW9uKGdldEZpbGVJbkVkaXRvcigpLCBuZXcKLQkvLyBTZWFyY2hVSUNvbmZpZ3VyYXRpb24oKSwgKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50KCksCi0JLy8gbWF0Y2hUeXBlLCBtYXRjaFRleHQsIGdldFByb2dyZXNzTW9uaXRvcigpKTsKLQkvLyBhY3Rpb24uc2V0VGV4dCgiT2NjdXJyZW5jZXMgb2YgXCIiICsgbWF0Y2hUZXh0ICsgIlwiIGluIEZpbGUiKTsKLQkvLyBtZW51LmFwcGVuZFRvR3JvdXAoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuR1JPVVBfRURJVCwgYWN0aW9uKTsKLQkvLyB9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IjY2xvc2UoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZShmaW5hbCBib29sZWFuIHNhdmUpIHsKLQkJLyoKLQkJICogSW5zdGVhZCBvZiB1cyBjbG9zaW5nIGRpcmVjdGx5LCB3ZSBoYXZlIHRvIGNsb3NlIHdpdGggb3VyCi0JCSAqIGNvbnRhaW5pbmcgKG11bHRpcGFnZSkgZWRpdG9yLCBpZiBpdCBleGlzdHMuCi0JCSAqLwotCQlpZiAoZ2V0U2l0ZSgpID09IG51bGwpIHsKLQkJCS8vIGlmIHNpdGUgaGFzbid0IGJlZW4gc2V0IHlldCwgdGhlbiB3ZSdyZSBub3QKLQkJCS8vIGNvbXBsZXRlbHkgb3BlbgotCQkJLy8gc28gc2V0IGEgZmxhZyBub3QgdG8gb3BlbgotCQkJc2hvdWxkQ2xvc2UgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGdldEVkaXRvclBhcnQoKSAhPSBudWxsKSB7Ci0JCQkJRGlzcGxheSBkaXNwbGF5ID0gZ2V0U2l0ZSgpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpOwotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQlnZXRTaXRlKCkuZ2V0UGFnZSgpLmNsb3NlRWRpdG9yKGdldEVkaXRvclBhcnQoKSwgc2F2ZSk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN1cGVyLmNsb3NlKHNhdmUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNjb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBjb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKSB7Ci0JCUxpc3QgYWxsSWRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQotCQkvLyBnZXQgY29udHJpYnV0ZWQgcHJlZmVyZW5jZSBwYWdlcwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGNvbmZpZ3VyYXRpb25JZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbklkcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nW10gZGVmaW5pdGlvbnMgPSBidWlsZGVyLmdldERlZmluaXRpb25zKCJwcmVmZXJlbmNlcGFnZXMiLCBjb25maWd1cmF0aW9uSWRzW2ldKTsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBkZWZpbml0aW9ucy5sZW5ndGg7IGorKykgewotCQkJCVN0cmluZyBzb21lSWRzID0gZGVmaW5pdGlvbnNbal07Ci0JCQkJaWYgKHNvbWVJZHMgIT0gbnVsbCAmJiBzb21lSWRzLmxlbmd0aCgpID4gMCkgewotCQkJCQkvLyBzdXBwb3J0cyBtdWx0aXBsZSBjb21tYS1kZWxpbWl0ZWQgcGFnZSBJRHMgaW4gb25lCi0JCQkJCS8vIGVsZW1lbnQKLQkJCQkJU3RyaW5nW10gaWRzID0gU3RyaW5nVXRpbHMudW5wYWNrKHNvbWVJZHMpOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlkcy5sZW5ndGg7IGsrKykgewotCQkJCQkJLy8gdHJpbSwganVzdCB0byBrZWVwIHRoaW5ncyBjbGVhbgotCQkJCQkJU3RyaW5nIGlkID0gaWRzW2tdLnRyaW0oKTsKLQkJCQkJCWlmICghYWxsSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCQkJCWFsbElkcy5hZGQoaWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gYWRkIHBhZ2VzIGNvbnRyaWJ1dGVkIGJ5IHN1cGVyCi0JCVN0cmluZ1tdIHN1cGVyUGFnZXMgPSBzdXBlci5jb2xsZWN0Q29udGV4dE1lbnVQcmVmZXJlbmNlUGFnZXMoKTsKLQkJZm9yIChpbnQgbSA9IDA7IG0gPCBzdXBlclBhZ2VzLmxlbmd0aDsgbSsrKSB7Ci0JCQkvLyB0cmltLCBqdXN0IHRvIGtlZXAgdGhpbmdzIGNsZWFuCi0JCQlTdHJpbmcgaWQgPSBzdXBlclBhZ2VzW21dLnRyaW0oKTsKLQkJCWlmICghYWxsSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCWFsbElkcy5hZGQoaWQpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChTdHJpbmdbXSkgYWxsSWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZSBhbmQgc2V0IGRvdWJsZS1jbGljayBhY3Rpb24gZm9yIHRoZSB2ZXJ0aWNhbCBydWxlcgotCSAqLwotCXByaXZhdGUgdm9pZCBjb21wdXRlQW5kU2V0RG91YmxlQ2xpY2tBY3Rpb24oKSB7Ci0JCS8qCi0JCSAqIE1ha2UgZG91YmxlLWNsaWNraW5nIG9uIHRoZSBydWxlciB0b2dnbGUgYSBicmVha3BvaW50IGluc3RlYWQgb2YKLQkJICogdG9nZ2xpbmcgYSBib29rbWFyay4gRm9yIGxpbmVzIHdoZXJlIGEgYnJlYWtwb2ludCB3b24ndCBiZSBjcmVhdGVkLAotCQkgKiBjcmVhdGUgYSBib29rbWFyayB0aHJvdWdoIHRoZSBjb250cmlidXRlZCBSdWxlckRvdWJsZUNsaWNrIGFjdGlvbi4KLQkJICovCi0JCXNldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5SVUxFUl9ET1VCTEVfQ0xJQ0ssIG5ldyBUb2dnbGVCcmVha3BvaW50QWN0aW9uKHRoaXMsIGdldFZlcnRpY2FsUnVsZXIoKSwgZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJVTEVSX0RPVUJMRV9DTElDSykpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRXh0ZW5kZWRUZXh0RWRpdG9yI2NvbmZpZ3VyZVNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQoU291cmNlVmlld2VyRGVjb3JhdGlvblN1cHBvcnQgc3VwcG9ydCkgewotCQlzdXBwb3J0LnNldENoYXJhY3RlclBhaXJNYXRjaGVyKGNyZWF0ZUNoYXJhY3RlclBhaXJNYXRjaGVyKCkpOwotCQlzdXBwb3J0LnNldE1hdGNoaW5nQ2hhcmFjdGVyUGFpbnRlclByZWZlcmVuY2VLZXlzKEVkaXRvclByZWZlcmVuY2VOYW1lcy5NQVRDSElOR19CUkFDS0VUUywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SKTsKLQotCQlzdXBlci5jb25maWd1cmVTb3VyY2VWaWV3ZXJEZWNvcmF0aW9uU3VwcG9ydChzdXBwb3J0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0JCVJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlID0gU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpOwotCQlJV29ya2JlbmNoSGVscFN5c3RlbSBoZWxwU3lzdGVtID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJLy8gVGV4dFZpZXcgQWN0aW9uIC0gbW92aW5nIHRoZSBzZWxlY3RlZCB0ZXh0IHRvCi0JCS8vIHRoZSBjbGlwYm9hcmQKLQkJLy8gb3ZlcnJpZGUgdGhlIGN1dC9wYXN0ZS9kZWxldGUgYWN0aW9uIHRvIG1ha2UKLQkJLy8gdGhlbSBydW4gb24gcmVhZC1vbmx5Ci0JCS8vIGZpbGVzCi0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIkVkaXRvcl9DdXRfIiwgdGhpcywgSVRleHRPcGVyYXRpb25UYXJnZXQuQ1VULCB0cnVlKTsgLy8kTk9OLU5MUy0xJAotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElXb3JrYmVuY2hBY3Rpb25EZWZpbml0aW9uSWRzLkNVVCk7Ci0JCXNldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5DVVQsIGFjdGlvbik7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5DVVRfQUNUSU9OKTsKLQkJLy8gVGV4dFZpZXcgQWN0aW9uIC0gaW5zZXJ0aW5nIHRoZSBjbGlwYm9hcmQKLQkJLy8gY29udGVudCBhdCB0aGUgY3VycmVudAotCQkvLyBwb3NpdGlvbgotCQkvLyBvdmVycmlkZSB0aGUgY3V0L3Bhc3RlL2RlbGV0ZSBhY3Rpb24gdG8gbWFrZQotCQkvLyB0aGVtIHJ1biBvbiByZWFkLW9ubHkKLQkJLy8gZmlsZXMKLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsICJFZGl0b3JfUGFzdGVfIiwgdGhpcywgSVRleHRPcGVyYXRpb25UYXJnZXQuUEFTVEUsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuUEFTVEUpOwotCQlzZXRBY3Rpb24oSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUEFTVEUsIGFjdGlvbik7Ci0JCWhlbHBTeXN0ZW0uc2V0SGVscChhY3Rpb24sIElBYnN0cmFjdFRleHRFZGl0b3JIZWxwQ29udGV4dElkcy5QQVNURV9BQ1RJT04pOwotCQkvLyBUZXh0VmlldyBBY3Rpb24gLSBkZWxldGluZyB0aGUgc2VsZWN0ZWQgdGV4dCBvcgotCQkvLyBpZiBzZWxlY3Rpb24gaXMKLQkJLy8gZW1wdHkgdGhlIGNoYXJhY3RlciBhdCB0aGUgcmlnaHQgb2YgdGhlIGN1cnJlbnQKLQkJLy8gcG9zaXRpb24KLQkJLy8gb3ZlcnJpZGUgdGhlIGN1dC9wYXN0ZS9kZWxldGUgYWN0aW9uIHRvIG1ha2UKLQkJLy8gdGhlbSBydW4gb24gcmVhZC1vbmx5Ci0JCS8vIGZpbGVzCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiRWRpdG9yX0RlbGV0ZV8iLCB0aGlzLCBJVGV4dE9wZXJhdGlvblRhcmdldC5ERUxFVEUsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVdvcmtiZW5jaEFjdGlvbkRlZmluaXRpb25JZHMuREVMRVRFKTsKLQkJc2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRFTEVURSwgYWN0aW9uKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGFjdGlvbiwgSUFic3RyYWN0VGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLkRFTEVURV9BQ1RJT04pOwotCQkvLyBTb3VyY2VWaWV3IEFjdGlvbiAtIHJlcXVlc3RpbmcgaW5mb3JtYXRpb24gYXQKLQkJLy8gdGhlIGN1cnJlbnQgaW5zZXJ0aW9uCi0JCS8vIHBvc2l0aW9uCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfSU5GT1JNQVRJT04gKyBVTkRFUlNDT1JFLCB0aGlzLCBJU291cmNlVmlld2VyLklORk9STUFUSU9OLCB0cnVlKTsKLQkJYWN0aW9uID0gbmV3IEluZm9ybWF0aW9uRGlzcGF0Y2hBY3Rpb24oU1NFVUlNZXNzYWdlcy5nZXRSZXNvdXJjZUJ1bmRsZSgpLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9JTkZPUk1BVElPTiArIFVOREVSU0NPUkUsIChUZXh0T3BlcmF0aW9uQWN0aW9uKSBhY3Rpb24pOwotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuSU5GT1JNQVRJT04pOwotCQlzZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfSU5GT1JNQVRJT04sIGFjdGlvbik7Ci0JCW1hcmtBc1N0YXRlRGVwZW5kZW50QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0lORk9STUFUSU9OLCB0cnVlKTsKLQkJLy8gU291cmNlVmlldyBBY3Rpb24gLSByZXF1ZXN0aW5nIGNvbnRlbnQgYXNzaXN0IHRvCi0JCS8vIHNob3cgY29tcGxldGV0aW9uCi0JCS8vIHByb3Bvc2FscyBmb3IgdGhlIGN1cnJlbnQgaW5zZXJ0IHBvc2l0aW9uCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUyArIFVOREVSU0NPUkUsIHRoaXMsIElTb3VyY2VWaWV3ZXIuQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMsIHRydWUpOwotCQloZWxwU3lzdGVtLnNldEhlbHAoYWN0aW9uLCBJSGVscENvbnRleHRJZHMuQ09OVE1OVV9DT05URU5UQVNTSVNUX0hFTFBJRCk7Ci0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLkNPTlRFTlRfQVNTSVNUX1BST1BPU0FMUyk7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUywgYWN0aW9uKTsKLQkJbWFya0FzU3RhdGVEZXBlbmRlbnRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMsIHRydWUpOwotCQkvLyBTb3VyY2VWaWV3IEFjdGlvbiAtIHJlcXVlc3RpbmcgY29udGVudCBhc3Npc3QgdG8KLQkJLy8gc2hvdyB0aGUgY29udGVudAotCQkvLyBpbmZvcm1hdGlvbiBmb3IgdGhlIGN1cnJlbnQgaW5zZXJ0IHBvc2l0aW9uCi0JCWFjdGlvbiA9IG5ldyBUZXh0T3BlcmF0aW9uQWN0aW9uKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OICsgVU5ERVJTQ09SRSwgdGhpcywgSVNvdXJjZVZpZXdlci5DT05URU5UQVNTSVNUX0NPTlRFWFRfSU5GT1JNQVRJT04pOwotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5DT05URU5UX0FTU0lTVF9DT05URVhUX0lORk9STUFUSU9OKTsKLQkJc2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0NPTlRFTlRBU1NJU1RfQ09OVEVYVF9JTkZPUk1BVElPTiwgYWN0aW9uKTsKLQkJbWFya0FzU3RhdGVEZXBlbmRlbnRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OLCB0cnVlKTsKLQkJLy8gU3RydWN0dXJlZFRleHRWaWV3ZXIgQWN0aW9uIC0gcmVxdWVzdGluZwotCQkvLyBjb3JyZWN0aW9uIGFzc2lzdCB0byBzaG93Ci0JCS8vIGNvcnJlY3Rpb24gcHJvcG9zYWxzIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbgotCQlhY3Rpb24gPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfUVVJQ0tfRklYICsgVU5ERVJTQ09SRSwgdGhpcywgU3RydWN0dXJlZFRleHRWaWV3ZXIuUVVJQ0tfRklYLCB0cnVlKTsKLQkJYWN0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlFVSUNLX0ZJWCk7Ci0JCXNldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9RVUlDS19GSVgsIGFjdGlvbik7Ci0JCW1hcmtBc1N0YXRlRGVwZW5kZW50QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1FVSUNLX0ZJWCwgdHJ1ZSk7Ci0JCS8vIFN0cnVjdHVyZWRUZXh0Vmlld2VyIEFjdGlvbiAtIHJlcXVlc3RpbmcgZm9ybWF0Ci0JCS8vIG9mIHRoZSB3aG9sZQotCQkvLyBkb2N1bWVudAotCQlhY3Rpb24gPSBuZXcgVGV4dE9wZXJhdGlvbkFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5UICsgVU5ERVJTQ09SRSwgdGhpcywgU3RydWN0dXJlZFRleHRWaWV3ZXIuRk9STUFUX0RPQ1VNRU5UKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGFjdGlvbiwgSUhlbHBDb250ZXh0SWRzLkNPTlRNTlVfRk9STUFUX0RPQ19IRUxQSUQpOwotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuRk9STUFUX0RPQ1VNRU5UKTsKLQkJc2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCwgYWN0aW9uKTsKLQkJbWFya0FzU3RhdGVEZXBlbmRlbnRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0RPQ1VNRU5ULCB0cnVlKTsKLQkJbWFya0FzU2VsZWN0aW9uRGVwZW5kZW50QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCwgdHJ1ZSk7Ci0JCS8vIFN0cnVjdHVyZWRUZXh0Vmlld2VyIEFjdGlvbiAtIHJlcXVlc3RpbmcgZm9ybWF0Ci0JCS8vIG9mIHRoZSBhY3RpdmUKLQkJLy8gZWxlbWVudHMKLQkJYWN0aW9uID0gbmV3IFRleHRPcGVyYXRpb25BY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMgKyBVTkRFUlNDT1JFLCB0aGlzLCBTdHJ1Y3R1cmVkVGV4dFZpZXdlci5GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKTsKLQkJaGVscFN5c3RlbS5zZXRIZWxwKGFjdGlvbiwgSUhlbHBDb250ZXh0SWRzLkNPTlRNTlVfRk9STUFUX0VMRU1FTlRTX0hFTFBJRCk7Ci0JCWFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKTsKLQkJc2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMsIGFjdGlvbik7Ci0JCW1hcmtBc1N0YXRlRGVwZW5kZW50QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0ZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMsIHRydWUpOwotCQltYXJrQXNTZWxlY3Rpb25EZXBlbmRlbnRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUywgdHJ1ZSk7Ci0KLQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IgQWN0aW9uIC0gYWRkIGJyZWFrcG9pbnRzIChmYWxsaW5nIGJhY2sgdG8gdGhlCi0JCS8vIGN1cnJlbnQgZG91YmxlLWNsaWNrIGlmIHRoZXkgY2FuJ3QgYmUgYWRkZWQpCi0JCWFjdGlvbiA9IG5ldyBUb2dnbGVCcmVha3BvaW50QWN0aW9uKHRoaXMsIGdldFZlcnRpY2FsUnVsZXIoKSk7Ci0JCXNldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLlRPR0dMRV9CUkVBS1BPSU5UUywgYWN0aW9uKTsKLQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IgQWN0aW9uIC0gbWFuYWdlIGJyZWFrcG9pbnRzCi0JCWFjdGlvbiA9IG5ldyBNYW5hZ2VCcmVha3BvaW50QWN0aW9uKHRoaXMsIGdldFZlcnRpY2FsUnVsZXIoKSk7Ci0JCXNldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLk1BTkFHRV9CUkVBS1BPSU5UUywgYWN0aW9uKTsKLQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IgQWN0aW9uIC0gZWRpdCBicmVha3BvaW50cwotCQlhY3Rpb24gPSBuZXcgRWRpdEJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpKTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuRURJVF9CUkVBS1BPSU5UUywgYWN0aW9uKTsKLQkJLy8gU3RydWN0dXJlZFRleHRWaWV3ZXIgQWN0aW9uIC0gb3BlbiBmaWxlIG9uIHNlbGVjdGlvbgotCQlhY3Rpb24gPSBuZXcgT3Blbkh5cGVybGlua0FjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfT1BFTl9GSUxFICsgVU5ERVJTQ09SRSwgdGhpcywgZ2V0U291cmNlVmlld2VyKCkpOwotCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuT1BFTl9GSUxFKTsKLQkJc2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX09QRU5fRklMRSwgYWN0aW9uKTsKLQotCQljb21wdXRlQW5kU2V0RG91YmxlQ2xpY2tBY3Rpb24oKTsKLQotCQlmU2hvd1Byb3BlcnRpZXNBY3Rpb24gPSBuZXcgU2hvd1Byb3BlcnRpZXNBY3Rpb24oKTsKLQkJZkZvbGRpbmdHcm91cCA9IG5ldyBGb2xkaW5nQWN0aW9uR3JvdXAodGhpcywgZ2V0U291cmNlVmlld2VyKCkpOwotCX0KLQotCXByb3RlY3RlZCBMaW5lQ2hhbmdlSG92ZXIgY3JlYXRlQ2hhbmdlSG92ZXIoKSB7Ci0JCXJldHVybiBuZXcgU3RydWN0dXJlZExpbmVDaGFuZ2VIb3ZlcigpOwotCX0KLQotCXByb3RlY3RlZCBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgY3JlYXRlQ2hhcmFjdGVyUGFpck1hdGNoZXIoKSB7Ci0JCUlDaGFyYWN0ZXJQYWlyTWF0Y2hlciBtYXRjaGVyID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBtYXRjaGVyID09IG51bGwgJiYgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJbWF0Y2hlciA9IChJQ2hhcmFjdGVyUGFpck1hdGNoZXIpIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbihEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLklELCBpZHNbaV0pOwotCQl9Ci0JCWlmIChtYXRjaGVyID09IG51bGwpIHsKLQkJCW1hdGNoZXIgPSBuZXcgSUNoYXJhY3RlclBhaXJNYXRjaGVyKCkgewotCi0JCQkJcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJCQkJcmV0dXJuIElDaGFyYWN0ZXJQYWlyTWF0Y2hlci5MRUZUOwotCQkJCX0KLQotCQkJCXB1YmxpYyBJUmVnaW9uIG1hdGNoKElEb2N1bWVudCBpRG9jdW1lbnQsIGludCBpKSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJcmV0dXJuIG1hdGNoZXI7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgcHJlZmVyZW5jZSBzdG9yZSB0aGF0IGNvbWJpbmVzIHRoZSBzb3VyY2UgZWRpdG9yIHByZWZlcmVuY2VzCi0JICogd2l0aCB0aGUgYmFzZSBlZGl0b3IncyBwcmVmZXJlbmNlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIElQcmVmZXJlbmNlU3RvcmUKLQkgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgY3JlYXRlQ29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3NlRWRpdG9yUHJlZnMgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgYmFzZUVkaXRvclByZWZzID0gRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gbmV3IENoYWluZWRQcmVmZXJlbmNlU3RvcmUobmV3IElQcmVmZXJlbmNlU3RvcmVbXXtzc2VFZGl0b3JQcmVmcywgYmFzZUVkaXRvclByZWZzfSk7Ci0JfQotCi0JcHJpdmF0ZSBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY3JlYXRlQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQlDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY2ZnID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBpZHMgPSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBjZmcgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQljZmcgPSAoQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5DT05URU5UT1VUTElORUNPTkZJR1VSQVRJT04sIGlkc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGNmZzsKLQl9Ci0KLQkvKioKLQkgKiBPbmx5IGdldHMgdGhlIGNvcnJlY3Rpb24gYXNzaXN0YW50IGFzc29jaXRlZCB3aXRoIHRoZSBjdXJyZW50IHNvdXJjZQotCSAqIHZpZXdlciBjb25maWd1cmF0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gSUNvbnRlbnRBc3Npc3RhbnQgb3IgbnVsbAotCSAqLwotCXByaXZhdGUgSUNvbnRlbnRBc3Npc3RhbnQgY3JlYXRlQ29ycmVjdGlvbkFzc2lzdGFudCgpIHsKLQkJSUNvbnRlbnRBc3Npc3RhbnQgYXNzaXN0ID0gbnVsbDsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIgcHJvdmlkZXIgPSAoQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oImNvcnJlY3Rpb25hc3Npc3RhbnQiLCBmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJYXNzaXN0ID0gcHJvdmlkZXIuZ2V0Q29ycmVjdGlvbkFzc2lzdGFudChnZXRTb3VyY2VWaWV3ZXIoKSk7Ci0JCX0KLQkJcmV0dXJuIGFzc2lzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVNb2RlbERlcGVuZGVudEZpZWxkcygpIHsKLQkJLy8gbm9uZSBhdCB0aGlzIGxldmVsCi0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIFVzZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gaWYgYSB2aWV3ZXJjb25maWd1cmF0aW9uIGhhcyBub3QKLQkgKiBhbHJlYWR5IGJlZW4gc2V0LiBBbHNvIGluaXRpYWxpemUgU3RydWN0dXJlZFRleHRWaWV3ZXIuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3IjY3JlYXRlUGFydENvbnRyb2wob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZVBhcnRDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJaWYgKGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSA9PSBudWxsKSB7Ci0JCQlDb25maWd1cmF0aW9uQW5kVGFyZ2V0IGNhdCA9IGNyZWF0ZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJCWZWaWV3ZXJDb25maWd1cmF0aW9uVGFyZ2V0SWQgPSBjYXQuZ2V0VGFyZ2V0SWQoKTsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBuZXdWaWV3ZXJDb25maWd1cmF0aW9uID0gY2F0LmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCXNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24obmV3Vmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCX0KLQotCQlzdXBlci5jcmVhdGVQYXJ0Q29udHJvbChwYXJlbnQpOwotCi0JCS8vIGluc3RlYWQgb2YgY2FsbGluZyBzZXRJbnB1dCB0d2ljZSwgdXNlIGluaXRpYWxpemVTb3VyY2VWaWV3ZXIoKSB0bwotCQkvLyBoYW5kbGUgc291cmNlIHZpZXdlciBpbml0aWFsaXphdGlvbiBwcmV2aW91c2x5IGhhbmRsZWQgYnkgc2V0SW5wdXQKLQkJaW5pdGlhbGl6ZVNvdXJjZVZpZXdlcigpOwotCi0JCS8vIHVwZGF0ZSBlZGl0b3IgY29udGV4dCBtZW51LCB2ZXJ0aWNhbCBydWxlciBjb250ZXh0IG1lbnUsIGluZm9wb3AKLQkJaWYgKGdldEludGVybmFsTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQl1cGRhdGVFZGl0b3JDb250cm9sc0ZvckNvbnRlbnRUeXBlKGdldEludGVybmFsTW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQl1cGRhdGVFZGl0b3JDb250cm9sc0ZvckNvbnRlbnRUeXBlKG51bGwpOwotCQl9Ci0KLQkJLy8gdXNlZCBmb3IgU2hvdyBUb29sdGlwIERlc2NyaXB0aW9uCi0JCUlJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IgPSBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgc2hlbGwpIHsKLQkJCQlib29sZWFuIGN1dERvd24gPSBmYWxzZTsKLQkJCQlpbnQgc3R5bGUgPSBjdXREb3duID8gU1dULk5PTkUgOiAoU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2woc2hlbGwsIFNXVC5SRVNJWkUgfCBTV1QuVE9PTCwgc3R5bGUsIG5ldyBIVE1MVGV4dFByZXNlbnRlcihjdXREb3duKSk7Ci0JCQl9Ci0JCX07Ci0KLQkJZkluZm9ybWF0aW9uUHJlc2VudGVyID0gbmV3IEluZm9ybWF0aW9uUHJlc2VudGVyKGluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IpOwotCQlmSW5mb3JtYXRpb25QcmVzZW50ZXIuc2V0U2l6ZUNvbnN0cmFpbnRzKDYwLCAxMCwgdHJ1ZSwgdHJ1ZSk7Ci0JCWZJbmZvcm1hdGlvblByZXNlbnRlci5pbnN0YWxsKGdldFNvdXJjZVZpZXdlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY3JlYXRlUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCVByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGNmZyA9IG51bGw7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gaWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgY2ZnID09IG51bGwgJiYgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJY2ZnID0gKFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKSBidWlsZGVyLmdldENvbmZpZ3VyYXRpb24oRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5QUk9QRVJUWVNIRUVUQ09ORklHVVJBVElPTiwgaWRzW2ldKTsKLQkJfQotCQlyZXR1cm4gY2ZnOwotCX0KLQotCS8qKgotCSAqIExvYWRzIHRoZSBTaG93IEluIFRhcmdldCBJRHMgZnJvbSB0aGUgRXh0ZW5kZWQgQ29uZmlndXJhdGlvbiBleHRlbnNpb24KLQkgKiBwb2ludC4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBjcmVhdGVTaG93SW5UYXJnZXRJZHMoKSB7Ci0JCUxpc3QgYWxsSWRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBjb25maWd1cmF0aW9uSWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25JZHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIGRlZmluaXRpb25zID0gYnVpbGRlci5nZXREZWZpbml0aW9ucygic2hvd2ludGFyZ2V0IiwgY29uZmlndXJhdGlvbklkc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVmaW5pdGlvbnMubGVuZ3RoOyBqKyspIHsKLQkJCQlTdHJpbmcgc29tZUlkcyA9IGRlZmluaXRpb25zW2pdOwotCQkJCWlmIChzb21lSWRzICE9IG51bGwgJiYgc29tZUlkcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJU3RyaW5nW10gaWRzID0gU3RyaW5nVXRpbHMudW5wYWNrKHNvbWVJZHMpOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlkcy5sZW5ndGg7IGsrKykgewotCQkJCQkJLy8gdHJpbSwganVzdCB0byBrZWVwIHRoaW5ncyBjbGVhbgotCQkJCQkJU3RyaW5nIGlkID0gaWRzW2tdLnRyaW0oKTsKLQkJCQkJCWlmICghYWxsSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCQkJCWFsbElkcy5hZGQoaWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFhbGxJZHMuY29udGFpbnMoSVBhZ2VMYXlvdXQuSURfUkVTX05BVikpIHsKLQkJCWFsbElkcy5hZGQoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0JCX0KLQkJaWYgKCFhbGxJZHMuY29udGFpbnMoSVBhZ2VMYXlvdXQuSURfT1VUTElORSkpIHsKLQkJCWFsbElkcy5hZGQoSVBhZ2VMYXlvdXQuSURfT1VUTElORSk7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgYWxsSWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgY3JlYXRlU291cmNlRWRpdGluZ1RleHRUb29scygpIHsKLQkJSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgdG9vbHMgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IHRvb2xzID09IG51bGwgJiYgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJdG9vbHMgPSAoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMpIGJ1aWxkZXIuZ2V0Q29uZmlndXJhdGlvbihOdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5JRCwgaWRzW2ldKTsKLQkJfQotCQlpZiAodG9vbHMgPT0gbnVsbCkgewotCQkJdG9vbHMgPSBOdWxsU291cmNlRWRpdGluZ1RleHRUb29scy5nZXRJbnN0YW5jZSgpOwotCQkJKChOdWxsU291cmNlRWRpdGluZ1RleHRUb29scykgdG9vbHMpLnNldFRleHRFZGl0b3IodGhpcyk7Ci0JCX0KLQkJTWV0aG9kIG1ldGhvZCA9IG51bGw7IC8vJE5PTi1OTFMtMSQKLQkJdHJ5IHsKLQkJCW1ldGhvZCA9IHRvb2xzLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRUZXh0RWRpdG9yIiwgbmV3IENsYXNzW117U3RydWN0dXJlZFRleHRFZGl0b3IuY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQl9Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltZXRob2QgPSB0b29scy5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0VGV4dEVkaXRvciIsIG5ldyBDbGFzc1tde0lUZXh0RWRpdG9yLmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChtZXRob2QgPT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltZXRob2QgPSB0b29scy5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0VGV4dEVkaXRvciIsIG5ldyBDbGFzc1tde0lFZGl0b3JQYXJ0LmNsYXNzfSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJaWYgKCFtZXRob2QuaXNBY2Nlc3NpYmxlKCkpIHsKLQkJCQltZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLQkJCX0KLQkJCXRyeSB7Ci0JCQkJbWV0aG9kLmludm9rZSh0b29scywgbmV3IE9iamVjdFtde3RoaXN9KTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlByb2JsZW0gY3JlYXRpbmcgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgaW1wbGVtZW50YXRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRvb2xzOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgdXNlZCBieSB0aGlzIGVkaXRvcgotCSAqLwotCXByb3RlY3RlZCBJU291cmNlVmlld2VyIGNyZWF0ZVNvdXJjZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJVmVydGljYWxSdWxlciB2ZXJ0aWNhbFJ1bGVyLCBpbnQgc3R5bGVzKSB7Ci0JCWZBbm5vdGF0aW9uQWNjZXNzID0gY3JlYXRlQW5ub3RhdGlvbkFjY2VzcygpOwotCQlmT3ZlcnZpZXdSdWxlciA9IGNyZWF0ZU92ZXJ2aWV3UnVsZXIoZ2V0U2hhcmVkQ29sb3JzKCkpOwotCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlciBzb3VyY2VWaWV3ZXIgPSBjcmVhdGVTdHJ1Y3RlZFRleHRWaWV3ZXIocGFyZW50LCB2ZXJ0aWNhbFJ1bGVyLCBzdHlsZXMpOwotCQlpbml0U291cmNlVmlld2VyKHNvdXJjZVZpZXdlcik7Ci0JCXJldHVybiBzb3VyY2VWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBDb25maWd1cmF0aW9uQW5kVGFyZ2V0IGNyZWF0ZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCUNvbmZpZ3VyYXRpb25BbmRUYXJnZXQgY2F0ID0gbnVsbDsKLQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGNmZyA9IG51bGw7Ci0JCUV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgYnVpbGRlciA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKTsKLQkJU3RyaW5nW10gaWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgY2ZnID09IG51bGwgJiYgaSA8IGlkcy5sZW5ndGg7IGkrKykgewotCQkJY2ZnID0gKFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuU09VUkNFVklFV0VSQ09ORklHVVJBVElPTiwgaWRzW2ldKTsKLQkJCWNhdCA9IG5ldyBDb25maWd1cmF0aW9uQW5kVGFyZ2V0KGlkc1tpXSwgY2ZnKTsKLQkJfQotCQlpZiAoY2ZnID09IG51bGwpIHsKLQkJCWNmZyA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJCVN0cmluZyB0YXJnZXRpZCA9IGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNkZWZhdWx0IjsgLy8kTk9OLU5MUy0xJAotCQkJY2F0ID0gbmV3IENvbmZpZ3VyYXRpb25BbmRUYXJnZXQodGFyZ2V0aWQsIGNmZyk7Ci0JCX0KLQkJcmV0dXJuIGNhdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgY3JlYXRlU3RydWN0ZWRUZXh0Vmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIElWZXJ0aWNhbFJ1bGVyIHZlcnRpY2FsUnVsZXIsIGludCBzdHlsZXMpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIHZlcnRpY2FsUnVsZXIsIGdldE92ZXJ2aWV3UnVsZXIoKSwgaXNPdmVydmlld1J1bGVyVmlzaWJsZSgpLCBzdHlsZXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpIHsKLQkJLy8gb3ZlcnJpZGRlbiB0byBhZGQgaWNvbnMgdG8gYWN0aW9ucwotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExODc3Ci0JCXN1cGVyLmNyZWF0ZVVuZG9SZWRvQWN0aW9ucygpOwotCQlJQWN0aW9uIGFjdGlvbiA9IGdldEFjdGlvbihJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5VTkRPKTsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKElTaGFyZWRJbWFnZXMuSU1HX1RPT0xfVU5ETykpOwotCQl9Ci0KLQkJYWN0aW9uID0gZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8pOwotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRTaGFyZWRJbWFnZXMoKS5nZXRJbWFnZURlc2NyaXB0b3IoSVNoYXJlZEltYWdlcy5JTUdfVE9PTF9SRURPKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dEVkaXRvcjo6ZGlzcG9zZSBlbnRyeSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJaWYgKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnLnBlcmZUZXN0QWRhcHRlckNsYXNzTG9hZGluZykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCBjYWxscyB0byBnZXRBZGFwdGVyOiAiICsgYWRhcHRlclJlcXVlc3RzKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJUb3RhbCB0aW1lIGluIGdldEFkYXB0ZXI6ICIgKyBhZGFwdGVyVGltZSk7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQXZlcmFnZSB0aW1lIHBlciBjYWxsOiAiICsgKGFkYXB0ZXJUaW1lIC8gYWRhcHRlclJlcXVlc3RzKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8vIGRpc3Bvc2Ugb2YgaW5mb3JtYXRpb24gcHJlc2VudGVyCi0JCWlmIChmSW5mb3JtYXRpb25QcmVzZW50ZXIgIT0gbnVsbCkgewotCQkJZkluZm9ybWF0aW9uUHJlc2VudGVyLmRpc3Bvc2UoKTsKLQkJCWZJbmZvcm1hdGlvblByZXNlbnRlciA9IG51bGw7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG9mIHNlbGVjdGlvbiBoaXN0b3J5Ci0JCWlmIChmU2VsZWN0aW9uSGlzdG9yeSAhPSBudWxsKSB7Ci0JCQlmU2VsZWN0aW9uSGlzdG9yeS5kaXNwb3NlKCk7Ci0JCQlmU2VsZWN0aW9uSGlzdG9yeSA9IG51bGw7Ci0JCX0KLQotCQkvLyBkaXNwb3NlIG9mIGRvY3VtZW50IGZvbGRpbmcgc3VwcG9ydAotCQlpZiAoZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIgIT0gbnVsbCkgewotCQkJZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIudW5pbnN0YWxsKCk7Ci0JCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlciA9IG51bGw7Ci0JCX0KLQotCQlpZiAoZlByb2plY3Rpb25TdXBwb3J0ICE9IG51bGwpIHsKLQkJCWZQcm9qZWN0aW9uU3VwcG9ydC5kaXNwb3NlKCk7Ci0JCQlmUHJvamVjdGlvblN1cHBvcnQgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGZGb2xkaW5nR3JvdXAgIT0gbnVsbCkgewotCQkJZkZvbGRpbmdHcm91cC5kaXNwb3NlKCk7Ci0JCQlmRm9sZGluZ0dyb3VwID0gbnVsbDsKLQkJfQotCi0JCS8vIHN1YmNsYXNzIG1heSBub3QgaGF2ZSBtb3VzZSB0cmFja2VyIGNyZWF0ZWQKLQkJLy8gbmVlZCB0byBjaGVjayBmb3IgbnVsbCBiZWZvcmUgc3RvcHBpbmcKLQkJaWYgKGZNb3VzZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJZk1vdXNlVHJhY2tlci5zdG9wKCk7Ci0JCQlmTW91c2VUcmFja2VyID0gbnVsbDsKLQkJfQotCi0JCS8vIGRpc3Bvc2Ugb2YgbWVudXMgdGhhdCB3ZXJlIGJlaW5nIHRyYWNrZWQKLQkJaWYgKGZUZXh0Q29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJZlRleHRDb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCX0KLQkJaWYgKGZSdWxlckNvbnRleHRNZW51ICE9IG51bGwpIHsKLQkJCWZSdWxlckNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoZlRleHRDb250ZXh0TWVudU1hbmFnZXIgIT0gbnVsbCkgewotCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0JCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5yZW1vdmVNZW51TGlzdGVuZXIoZ2V0Q29udGV4dE1lbnVMaXN0ZW5lcigpKTsKLQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5yZW1vdmVBbGwoKTsKLQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCX0KLQotCQkvLyBhZGRlZCB0aGlzIDIvMjAvMjAwNCBiYXNlZCBvbiBwcm9iZSByZXN1bHRzIC0tCi0JCS8vIHNlZW1zIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHNldE1vZGVsKG51bGwpLCBidXQKLQkJLy8gdGhhdCdzIGEgbW9yZSByYWRpY2FsIGNoYW5nZS4KLQkJLy8gYW5kLCB0ZWNobmljYWxseSBzcGVha2luZywgc2hvdWxkIG5vdCBiZSBuZWVkZWQsCi0JCS8vIGJ1dCBtYWtlcyBhIG1lbW9yeSBsZWFrCi0JCS8vIGxlc3Mgc2V2ZXJlLgotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlpZiAoZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGdldEludGVybmFsRG9jdW1lbnRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWZTdHJ1Y3R1cmVkTW9kZWwucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCQl9Ci0KLQkJLy8gQlVHMTU1MzM1IC0gaWYgdGhlcmUgd2FzIG5vIGRvY3VtZW50IHByb3ZpZGVyLCB0aGVyZSB3YXMgbm90aGluZyBhZGRlZAotCQkvLyB0byBkb2N1bWVudCwgc28gbm90aGluZyB0byByZW1vdmUKLQkJaWYgKGdldERvY3VtZW50UHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkJZG9jLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZ2V0SW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKCkpOwotCQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJRXhlY3V0aW9uRGVsZWdhdGFibGUpIHsKLQkJCQkJKChJRXhlY3V0aW9uRGVsZWdhdGFibGUpIGRvYykuc2V0RXhlY3V0aW9uRGVsZWdhdGUobnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gc29tZSB0aGluZ3MgaW4gdGhlIGNvbmZpZ3VyYXRpb24gbmVlZCB0byBjbGVhbgotCQkvLyB1cCBhZnRlciB0aGVtc2VsdmVzCi0JCWlmIChmT3V0bGluZVBhZ2UgIT0gbnVsbCkgewotCQkJaWYgKGZPdXRsaW5lUGFnZSBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSAmJiBmT3V0bGluZVBhZ2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQkJKChDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UpIGZPdXRsaW5lUGFnZSkucmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihmT3V0bGluZVBhZ2VMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZiAoZk91dGxpbmVQYWdlTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJCWZPdXRsaW5lUGFnZS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZk91dGxpbmVQYWdlTGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQkJZkVkaXRvckRpc3Bvc2VkID0gdHJ1ZTsKLQkJZGlzcG9zZU1vZGVsRGVwZW5kZW50RmllbGRzKCk7Ci0KLQkJaWYgKGZEcm9wVGFyZ2V0ICE9IG51bGwpCi0JCQlmRHJvcFRhcmdldC5kaXNwb3NlKCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKG51bGwpOwotCi0JCS8vIHN0cmljdGx5IHNwZWFraW5nLCBidXQgZm9sbG93aW5nIG51bGwgb3V0cwotCQkvLyBzaG91bGQgbm90IGJlIG5lZWRlZCwKLQkJLy8gYnV0IGluIHRoZSBldmVudCBvZiBhIG1lbW9yeSBsZWFrLCB0aGV5IG1ha2UgdGhlCi0JCS8vIG1lbW9yeSBsZWFrIGxlc3MKLQkJLy8gc2V2ZXJlCi0JCWZEcm9wQWRhcHRlciA9IG51bGw7Ci0JCWZEcm9wVGFyZ2V0ID0gbnVsbDsKLQotCQlzdXBlci5kaXNwb3NlKCk7Ci0KLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0RWRpdG9yOjpkaXNwb3NlIGV4aXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNkaXNwb3NlRG9jdW1lbnRQcm92aWRlcigpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZURvY3VtZW50UHJvdmlkZXIoKSB7Ci0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwgJiYgIWZpc1JlbGVhc2VkICYmICEoZ2V0RG9jdW1lbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSU1vZGVsUHJvdmlkZXIpKSB7Ci0JCQlmU3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJZmlzUmVsZWFzZWQgPSB0cnVlOwotCQl9Ci0JCXN1cGVyLmRpc3Bvc2VEb2N1bWVudFByb3ZpZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRGlzcG9zZXMgbW9kZWwgc3BlY2lmaWMgZWRpdG9yIGhlbHBlcnMgc3VjaCBhcyBzdGF0dXNMaW5lSGVscGVyLgotCSAqIEJhc2ljYWxseSBhbnkgY29kZSByZXBlYXRlZCBpbiB1cGRhdGUoKSAmIGRpc3Bvc2UoKSBzaG91bGQgYmUgcGxhY2VkCi0JICogaGVyZS4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZGlzcG9zZU1vZGVsRGVwZW5kZW50RmllbGRzKCkgewotCQkvLyBub25lIGF0IHRoaXMgbGV2ZWwKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3IjZG9SZXZlcnRUb1NhdmVkKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1JldmVydFRvU2F2ZWQoKSB7Ci0JCXN1cGVyLmRvUmV2ZXJ0VG9TYXZlZCgpOwotCQlpZiAoZk91dGxpbmVQYWdlICE9IG51bGwgJiYgZk91dGxpbmVQYWdlIGluc3RhbmNlb2YgSVVwZGF0ZSkgewotCQkJKChJVXBkYXRlKSBmT3V0bGluZVBhZ2UpLnVwZGF0ZSgpOwotCQl9Ci0JCS8vIHJlc2V0IHVuZG8KLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jKS5nZXRVbmRvTWFuYWdlcigpLmdldENvbW1hbmRTdGFjaygpLmZsdXNoKCk7Ci0JCX0KLQotCQkvLyB1cGRhdGUgbWVudSB0ZXh0Ci0JCXVwZGF0ZU1lbnVUZXh0KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZShvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmUoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJdHJ5IHsKLQkJCWFib3V0VG9TYXZlTW9kZWwoKTsKLQkJCXVwZGF0ZUVuY29kaW5nTWVtZW50bygpOwotCQkJc3VwZXIuZG9TYXZlKHByb2dyZXNzTW9uaXRvcik7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzYXZlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2RvU2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvU2V0SW5wdXQoSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE86IGlmIG9wZW5lZCBpbiBtb3JlIHRoYW4gb25lIGVkaXRvciwgdGhpcyB3aWxsIGNhdXNlCi0JCS8vIHByb2JsZW1zLgotCQlJRWRpdG9ySW5wdXQgb2xkSW5wdXQgPSBnZXRFZGl0b3JJbnB1dCgpOwotCQlpZiAob2xkSW5wdXQgIT0gbnVsbCkgewotCQkJSURvY3VtZW50IG9sZGRvYyA9IGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChvbGRJbnB1dCk7Ci0JCQlpZiAob2xkZG9jICE9IG51bGwgJiYgb2xkZG9jIGluc3RhbmNlb2YgSUV4ZWN1dGlvbkRlbGVnYXRhYmxlKSB7Ci0JCQkJKChJRXhlY3V0aW9uRGVsZWdhdGFibGUpIG9sZGRvYykuc2V0RXhlY3V0aW9uRGVsZWdhdGUobnVsbCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsICYmICEoZ2V0RG9jdW1lbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSU1vZGVsUHJvdmlkZXIpKSB7Ci0JCQlmU3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQl9Ci0KLQkJc3VwZXIuZG9TZXRJbnB1dChpbnB1dCk7Ci0KLQkJSURvY3VtZW50IG5ld0RvY3VtZW50ID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGlucHV0KTsKLQkJaWYgKG5ld0RvY3VtZW50IGluc3RhbmNlb2YgSUV4ZWN1dGlvbkRlbGVnYXRhYmxlKSB7Ci0JCQkoKElFeGVjdXRpb25EZWxlZ2F0YWJsZSkgbmV3RG9jdW1lbnQpLnNldEV4ZWN1dGlvbkRlbGVnYXRlKG5ldyBFZGl0b3JFeGVjdXRpb25Db250ZXh0KHRoaXMpKTsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkvLyBpZiB3ZSBoYXZlIGEgTW9kZWwgcHJvdmlkZXIsIGdldCB0aGUgbW9kZWwgZnJvbSBpdAotCQlpZiAoZ2V0RG9jdW1lbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSU1vZGVsUHJvdmlkZXIpIHsKLQkJCW1vZGVsID0gKChJTW9kZWxQcm92aWRlcikgZ2V0RG9jdW1lbnRQcm92aWRlcigpKS5nZXRNb2RlbChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmICghbW9kZWwuaXNTaGFyZWQoKSkgewotCQkJCUVkaXRvck1vZGVsVXRpbC5hZGRGYWN0b3JpZXNUbyhtb2RlbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAobmV3RG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJLy8gY29ycmVzcG9uZGluZyByZWxlYXNlRnJvbUVkaXQgb2NjdXJzIGluCi0JCQkJLy8gZGlzcG9zZSgpCi0JCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdCgoSVN0cnVjdHVyZWREb2N1bWVudCkgbmV3RG9jdW1lbnQpOwotCQkJCUVkaXRvck1vZGVsVXRpbC5hZGRGYWN0b3JpZXNUbyhtb2RlbCk7Ci0JCQl9Ci0KLQkJCWVsc2UgewotCQkJCWxvZ1VuZXhwZWN0ZWREb2N1bWVudEtpbmQoaW5wdXQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCB8fCBtb2RlbCAhPSBudWxsKSB7Ci0JCQlzZXRNb2RlbChtb2RlbCk7Ci0JCX0KLQotCQlpZiAoZ2V0SW50ZXJuYWxNb2RlbCgpICE9IG51bGwpIHsKLQkJCXVwZGF0ZUVkaXRvckNvbnRyb2xzRm9yQ29udGVudFR5cGUoZ2V0SW50ZXJuYWxNb2RlbCgpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJfQotCQllbHNlIHsKLQkJCXVwZGF0ZUVkaXRvckNvbnRyb2xzRm9yQ29udGVudFR5cGUobnVsbCk7Ci0JCX0KLQotCQlpZiAoZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIgIT0gbnVsbCkKLQkJCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyLmluaXRpYWxpemUoKTsKLQotCQkvLyBzdGFydCBlZGl0b3Igd2l0aCBzbWFydCBpbnNlcnQgbW9kZQotCQlzZXRJbnNlcnRNb2RlKFNNQVJUX0lOU0VSVCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB1cCB0aGlzIGVkaXRvcidzIGNvbnRleHQgbWVudSBiZWZvcmUgaXQgaXMgbWFkZSB2aXNpYmxlLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZWR1Y2VkIHRvIHByb3RlY3RlZCBtZXRob2QgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIG1lbnUKLQkgKiAgICAgICAgICAgIHRoZSBtZW51Ci0JICovCi0JcHVibGljIHZvaWQgZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBUbyBiZSBjb25zaXN0YW50IHdpdGggdGhlIEphdmEgRWRpdG9yLCB3ZSB3YW50Ci0JCS8vIHRvIHJlbW92ZQotCQkvLyBTaGlmdFJpZ2h0IGFuZCBTaGlmdExlZnQgZnJvbSB0aGUgY29udGV4dCBtZW51LgotCQkvLwotCQkvLyBTaGlmdFJpZ2h0IGFuZCBTaGlmdExlZnQgd2VyZSBhZGRlZCBpbiB0aGUgc3VwZXIKLQkJLy8gaW1wbGVtZW5hdGlvbiBvZgotCQkvLyB0aGlzIG1ldGhvZC4gV2Ugd2FudCB0byBza2lwIGl0IGFuZCBjYWxsCi0JCS8vIEFic3RyYWN0VGV4dEVkaXRvcidzCi0JCS8vIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5LiBUaGUgZWFzaWVzdCB3YXkgaXMgdG8KLQkJLy8gY29weSB0aGUgbWV0aG9kIGhlcmUuCi0KLQkJLy8gc3VwZXIuZWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQkJYWJzdHJhY3RUZXh0RWRpdG9yQ29udGV4dE1lbnVBYm91dFRvU2hvdyhtZW51KTsKLQotCQlhZGRDb250ZXh0TWVudUFjdGlvbnMobWVudSk7Ci0JCWFkZEV4dGVuZGVkQ29udGV4dE1lbnVBY3Rpb25zKG1lbnUpOwotCX0KLQotCS8qKgotCSAqIEVuZCBiYWNrZ3JvdW5kIG1vZGUuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICovCi0Jdm9pZCBlbmRCYWNrZ3JvdW5kT3BlcmF0aW9uKCkgewotCQlmQmFja2dyb3VuZEpvYkVuZGVkID0gdHJ1ZTsKLQkJLy8gbm90ZSwgd2UgZG9uJ3QgaW1tZWRpYXRlbHkgZW5kIG91ciAnaW50ZXJuYWwgYnVzeScgc3RhdGUsCi0JCS8vIHNpbmNlIHdlIG1heSBnZXQgbWFueSBjYWxscyBpbiBhIHNob3J0IHBlcmlvZCBvZgotCQkvLyB0aW1lLiBXZSBhbHdheXMgd2FpdCBmb3IgdGhlIHRpbWUgb3V0LgotCQlyZXNldEJ1c3lTdGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIE5vdGUgdGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBpbmRpcmVjdGx5IGZyb20gYmFja2dyb3VuZCBqb2Igb3BlcmF0aW9uCi0JICogLi4uIGJ1dCBleHBlY3RlZCB0byBiZSBnYXVyZGVkIHRoZXJlIHdpdGggSUxvY2ssIHBsdXMsIGNhbiBiZSBjYWxsZWQKLQkgKiBkaXJlY3RseSBmcm9tIHRpbWVyIHRocmVhZCwgc28gdGhlIHRpbWVyJ3MgcnVuIG1ldGhvZCBndWFyZHMgd2l0aCBJTG9jawotCSAqIHRvby4KLQkgKi8KLQlwcml2YXRlIHZvaWQgZW5kQnVzeVN0YXRlSW50ZXJuYWwoKSB7Ci0JCWlmIChmQmFja2dyb3VuZEpvYkVuZGVkKSB7Ci0JCQlmQnVzeVRpbWVyLmNhbmNlbCgpOwotCQkJc2hvd0J1c3koZmFsc2UpOwotCi0JCQlJU291cmNlVmlld2VyIHZpZXdlciA9IGdldFNvdXJjZVZpZXdlcigpOwotCQkJaWYgKHZpZXdlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB7Ci0JCQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5lbmRCYWNrZ3JvdW5kVXBkYXRlKCk7Ci0JCQl9Ci0JCQlmQnVzeVN0YXRlID0gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3ZSB3aWxsIG9ubHkgYmUgaW4gdGhpcyBicmFuY2ggZm9yIGEgYmFjayBncm91bmQgam9iIHRoYXQgaXMKLQkJCS8vIHRha2luZwotCQkJLy8gbG9uZ2VyIHRoYW4gb3VyIG5vcm1hbCB0aW1lLW91dCBwZXJpb2QgKG1lYW5pbmcgd2UgZ290IG5vdGlmaWVkCi0JCQkvLyBvZgotCQkJLy8gdGhlIHRpbWVvdXQgImluYmV0d2VlbiIgY2FsbHMgdG8gJ2JlZ2luJyBhbmQKLQkJCS8vICdlbmRCYWNrZ3JvdW5kT3BlcmF0aW9uJy4KLQkJCS8vICh3aGljaCwgcmVtZW1iZXIsIGNhbiBvbmx5IGhhcHBlbiBzaW5jZSB0aGVyZSBhcmUgbWFueSBjYWxscyB0bwotCQkJLy8gYmVnaW4vZW5kIGluIGEgc2hvcnQgcGVyaW9kIG9mIHRpbWUsIGFuZCB3ZSBvbmx5ICJyZXNldCIgb24gdGhlCi0JCQkvLyAnZW5kcycpLgotCQkJLy8gSW4gdGhpcyBldmVudCwgdGhlcmUncyByZWFsbHkgbm90aGluZyB0byBkbywgd2UncmUgc3RpbGwgaW4KLQkJCS8vICJidXN5IHN0YXRlIgotCQkJLy8gYW5kIHNob3VsZCBzdGFydCBhIG5ldyByZXNldCBjeWNsZSBvbmNlIGVuZEJhY2tncm91bmRqb2IgaXMKLQkJCS8vIGNhbGxlZC4KLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKSB7Ci0JCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5wZXJmVGVzdEFkYXB0ZXJDbGFzc0xvYWRpbmcpIHsKLQkJCXN0YXJ0UGVyZlRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJLy8gdGV4dCBlZGl0b3IKLQkJSVN0cnVjdHVyZWRNb2RlbCBpbnRlcm5hbE1vZGVsID0gZ2V0SW50ZXJuYWxNb2RlbCgpOwotCQlpZiAoSVRleHRFZGl0b3IuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmVzdWx0ID0gdGhpczsKLQkJfQotCQllbHNlIGlmIChJV29ya2JlbmNoU2l0ZVByb2dyZXNzU2VydmljZS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlyZXR1cm4gZ2V0RWRpdG9yUGFydCgpLmdldFNpdGUoKS5nZXRBZGFwdGVyKElXb3JrYmVuY2hTaXRlUHJvZ3Jlc3NTZXJ2aWNlLmNsYXNzKTsKLQkJfQotCQkvLyBjb250ZW50IG91dGxpbmUgcGFnZQotCQllbHNlIGlmIChJQ29udGVudE91dGxpbmVQYWdlLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCWlmIChmT3V0bGluZVBhZ2UgPT0gbnVsbCB8fCBmT3V0bGluZVBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgZk91dGxpbmVQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY2ZnID0gY3JlYXRlQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCk7Ci0JCQkJaWYgKGNmZyAhPSBudWxsKSB7Ci0JCQkJCUNvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSBvdXRsaW5lUGFnZSA9IG5ldyBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UoKTsKLQkJCQkJb3V0bGluZVBhZ2Uuc2V0Q29uZmlndXJhdGlvbihjZmcpOwotCQkJCQlpZiAoaW50ZXJuYWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlvdXRsaW5lUGFnZS5zZXRJbnB1dENvbnRlbnRUeXBlSWRlbnRpZmllcihpbnRlcm5hbE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJCQkJCW91dGxpbmVQYWdlLnNldElucHV0KGludGVybmFsTW9kZWwpOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGZPdXRsaW5lUGFnZUxpc3RlbmVyID09IG51bGwpIHsKLQkJCQkJCWZPdXRsaW5lUGFnZUxpc3RlbmVyID0gbmV3IE91dGxpbmVQYWdlTGlzdGVuZXIoKTsKLQkJCQkJfQotCi0JCQkJCW91dGxpbmVQYWdlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmT3V0bGluZVBhZ2VMaXN0ZW5lcik7Ci0JCQkJCW91dGxpbmVQYWdlLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIoZk91dGxpbmVQYWdlTGlzdGVuZXIpOwotCi0JCQkJCWZPdXRsaW5lUGFnZSA9IG91dGxpbmVQYWdlOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IGZPdXRsaW5lUGFnZTsKLQkJfQotCQkvLyBwcm9wZXJ0eSBzaGVldCBwYWdlLCBidXQgb25seSBpZiB0aGUgaW5wdXQncyBlZGl0YWJsZQotCQllbHNlIGlmIChJUHJvcGVydHlTaGVldFBhZ2UuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSAmJiBpc0VkaXRhYmxlKCkpIHsKLQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgPT0gbnVsbCB8fCBmUHJvcGVydHlTaGVldFBhZ2UuZ2V0Q29udHJvbCgpID09IG51bGwgfHwgZlByb3BlcnR5U2hlZXRQYWdlLmdldENvbnRyb2woKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQlQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjZmcgPSBjcmVhdGVQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbigpOwotCQkJCWlmIChjZmcgIT0gbnVsbCkgewotCQkJCQlDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSBwcm9wZXJ0eVNoZWV0UGFnZSA9IG5ldyBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSgpOwotCQkJCQlwcm9wZXJ0eVNoZWV0UGFnZS5zZXRDb25maWd1cmF0aW9uKGNmZyk7Ci0JCQkJCWZQcm9wZXJ0eVNoZWV0UGFnZSA9IHByb3BlcnR5U2hlZXRQYWdlOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IGZQcm9wZXJ0eVNoZWV0UGFnZTsKLQkJfQotCQllbHNlIGlmIChJRG9jdW1lbnQuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmVzdWx0ID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0JCWVsc2UgaWYgKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmNsYXNzLmVxdWFscyhyZXF1aXJlZCkpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMoKTsKLQkJfQotCQllbHNlIGlmIChJVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkgewotCQkJcmVzdWx0ID0gVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQuZ2V0SW5zdGFuY2UoKTsKLQkJfQotCQllbHNlIGlmIChJU2hvd0luVGFyZ2V0TGlzdC5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlyZXR1cm4gbmV3IFNob3dJblRhcmdldExpc3RBZGFwdGVyKCk7Ci0JCX0KLQkJZWxzZSBpZiAoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcy5lcXVhbHMocmVxdWlyZWQpKSB7Ci0JCQlpZiAoZlNlbGVjdGlvbkhpc3RvcnkgPT0gbnVsbCkKLQkJCQlmU2VsZWN0aW9uSGlzdG9yeSA9IG5ldyBTZWxlY3Rpb25IaXN0b3J5KHRoaXMpOwotCQkJcmV0dXJuIGZTZWxlY3Rpb25IaXN0b3J5OwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKHJlc3VsdCA9PSBudWxsICYmIGludGVybmFsTW9kZWwgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGludGVybmFsTW9kZWwuZ2V0QWRhcHRlcihyZXF1aXJlZCk7Ci0JCQl9Ci0JCQkvLyBvdGhlcnMKLQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQlyZXN1bHQgPSBzdXBlci5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLQkJfQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcucGVyZlRlc3RBZGFwdGVyQ2xhc3NMb2FkaW5nKSB7Ci0JCQlsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCWFkYXB0ZXJSZXF1ZXN0cysrOwotCQkJYWRhcHRlclRpbWUgKz0gKHN0b3AgLSBzdGFydFBlcmZUaW1lKTsKLQkJfQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcucGVyZlRlc3RBZGFwdGVyQ2xhc3NMb2FkaW5nKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIGNhbGxzIHRvIGdldEFkYXB0ZXI6ICIgKyBhZGFwdGVyUmVxdWVzdHMpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlRvdGFsIHRpbWUgaW4gZ2V0QWRhcHRlcjogIiArIGFkYXB0ZXJUaW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJBdmVyYWdlIHRpbWUgcGVyIGNhbGw6ICIgKyAoYWRhcHRlclRpbWUgLyBhZGFwdGVyUmVxdWVzdHMpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkgewotCQlTdHJpbmcgY29udGVudFR5cGVJZGVudGlmaWVySUQgPSBudWxsOwotCQlpZiAoZ2V0SW50ZXJuYWxNb2RlbCgpICE9IG51bGwpIHsKLQkJCWNvbnRlbnRUeXBlSWRlbnRpZmllcklEID0gZ2V0SW50ZXJuYWxNb2RlbCgpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCQl9Ci0JCXJldHVybiBDb25maWd1cmF0aW9uUG9pbnRDYWxjdWxhdG9yLmdldENvbmZpZ3VyYXRpb25Qb2ludHModGhpcywgY29udGVudFR5cGVJZGVudGlmaWVySUQsIENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IuU09VUkNFLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvci5jbGFzcyk7Ci0JfQotCi0JLyoqCi0JICogYWRkZWQgY2hlY2tzIHRvIG92ZXJjb21lIGJ1ZyBzdWNoIHRoYXQgaWYgd2UgYXJlIHNodXR0aW5nIGRvd24gaW4gYW4KLQkgKiBlcnJvciBjb25kaXRpb24sIHRoZW4gdmlld2VyIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDdXJzb3JQb3NpdGlvbigpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCS8vIHRoaXMgbWF5IGJlIHRvbyBleHBlbnNpdmUgaW4gdGVybXMgb2YKLQkJLy8gcGVyZm9ybWFuY2UsIHRvIGRvIHRoaXMgY2hlY2sKLQkJLy8gZXZlcnkgdGltZSwganVzdCB0byBnYXVyZCBhZ2FpbnN0IGVycm9yCi0JCS8vIGNvbmRpdGlvbi4KLQkJLy8gcGVyaGFwcyB0aGVyZSdzIGEgYmV0dGVyIHdheT8KLQkJaWYgKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwgJiYgZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpICE9IG51bGwgJiYgIWdldFNvdXJjZVZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXJlc3VsdCA9IHN1cGVyLmdldEN1cnNvclBvc2l0aW9uKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSAiMDowIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgZWRpdG9yIHBhcnQuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHJldHVybiB0aGlzIGVkaXRvciBwYXJ0Ci0JICovCi0JcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0JCWlmIChmRWRpdG9yUGFydCA9PSBudWxsKQotCQkJcmV0dXJuIHRoaXM7Ci0JCXJldHVybiBmRWRpdG9yUGFydDsKLQl9Ci0KLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGdldEludGVybmFsRG9jdW1lbnRMaXN0ZW5lcigpIHsKLQkJaWYgKGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lcjsKLQl9Ci0KLQlJU3RydWN0dXJlZE1vZGVsIGdldEludGVybmFsTW9kZWwoKSB7Ci0JCXJldHVybiBmU3RydWN0dXJlZE1vZGVsOwotCX0KLQotCXByaXZhdGUgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCWlmIChmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyID0gbmV3IEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoaXMgZWRpdG9yJ3MgU3RydWN0dXJlZE1vZGVsLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIFdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcmV0dXJuIHJldHVybnMgdGhpcyBlZGl0b3IncyBJU3RydWN0dXJlZE1vZGVsCi0JICogQGRlcHJlY2F0ZWQgLSBUaGlzIG1ldGhvZCBhbGxvd2VkIGZvciB1bmNvbnRyb2xsZWQgYWNjZXNzIHRvIHRoZSBtb2RlbAotCSAqICAgICAgICAgICAgIGluc3RhbmNlIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gSXQgaXMKLQkgKiAgICAgICAgICAgICByZWNvbW1lbmRlZCB0aGF0IHRoZSBjdXJyZW50IGRvY3VtZW50IHByb3ZpZGVyIGJlIGFza2VkIGZvcgotCSAqICAgICAgICAgICAgIHRoZSBjdXJyZW50IGRvY3VtZW50IGFuZCB0aGUgSU1vZGVsTWFuYWdlciB0aGVuIGFza2VkIGZvcgotCSAqICAgICAgICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIG1vZGVsIHdpdGgKLQkgKiAgICAgICAgICAgICBnZXRFeGlzdGluZ01vZGVsRm9yKihJRG9jdW1lbnQpLgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZE1vZGVsIGdldE1vZGVsKCkgewotCQlpZiAoZ2V0RG9jdW1lbnRQcm92aWRlcigpID09IG51bGwpIHsKLQkJCS8vIHRoaXMgaW5kaWNhdGVkIGFuIGVycm9yIGluIHN0YXJ0dXAgc2VxdWVuY2UKLQkJCUxvZ2dlci50cmFjZShnZXRDbGFzcygpLmdldE5hbWUoKSwgIlByb2dyYW0gSW5mbyBPbmx5OiBkb2N1bWVudCBwcm92aWRlciB3YXMgbnVsbCB3aGVuIG1vZGVsIHJlcXVlc3RlZCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlib29sZWFuIGluaXRpYWxNb2RlbE51bGwgPSBmYWxzZTsKLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgPT0gbnVsbCkKLQkJCWluaXRpYWxNb2RlbE51bGwgPSB0cnVlOwotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCA9PSBudWxsKSB7Ci0JCQkvLyBsYXppbHkgc2V0IHRoZSBtb2RlbCBpbnN0YW5jZSwgYWx0aG91Z2ggdGhpcyBpcyBhbiBBQk5PUk1BTAotCQkJLy8gQ09ERSBQQVRICi0JCQlpZiAoZ2V0RG9jdW1lbnRQcm92aWRlcigpIGluc3RhbmNlb2YgSU1vZGVsUHJvdmlkZXIpIHsKLQkJCQlmU3RydWN0dXJlZE1vZGVsID0gKChJTW9kZWxQcm92aWRlcikgZ2V0RG9jdW1lbnRQcm92aWRlcigpKS5nZXRNb2RlbChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQlmaXNSZWxlYXNlZCA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2MpOwotCQkJCQlpZiAobW9kZWwgPT0gbnVsbCkgewotCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jKTsKLQkJCQkJfQotCQkJCQlmU3RydWN0dXJlZE1vZGVsID0gbW9kZWw7Ci0JCQkJCWZpc1JlbGVhc2VkID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBJU1NVRTogdGhpcyBsb29rcyBiYWQgLi4uIGVkaXQtdGltZSBmYWN0b3JpZXMgbm90IGluaXRpYWxpemVkCi0JCQkvLyB1bmxlc3Mgc29tZW9uZSBjYWxscyBnZXRNb2RlbD8KLQkJCS8vIGZhY3RvcmllcyB3aWxsIG5vdCBiZSByZS1hZGRlZCBpZiBhbHJlYWR5IGV4aXN0cwotCQkJRWRpdG9yTW9kZWxVdGlsLmFkZEZhY3Rvcmllc1RvKGZTdHJ1Y3R1cmVkTW9kZWwpOwotCi0JCQlpZiAoaW5pdGlhbE1vZGVsTnVsbCAmJiBmU3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCQkvKgotCQkJCSAqIERNVzogOS8xLzIwMDIgLS0gd2h5IGlzIHVwZGF0ZSBjYWxsZWQgaGVyZT8gTm8gY2hhbmdlIGhhcwotCQkJCSAqIGJlZW4gaW5kaWNhdGVkPyBJJ2QgbGlrZSB0byByZW1vdmUsIGJ1dCB3aWxsIGxlYXZlIGZvciBub3cKLQkJCQkgKiB0byBhdm9pZCBicmVha2luZyB0aGlzIGhhY2suIFNob3VsZCBtZWFzdXJlL2JyZWFrcG9pbnQgdG8KLQkJCQkgKiBzZWUgaG93IGxhcmdlIHRoZSBwcm9ibGVtIGlzLiBNYXkgY2F1c2UgcGVyZm9ybWFuY2UKLQkJCQkgKiBwcm9ibGVtcy4KLQkJCQkgKiAKLQkJCQkgKiBETVc6IDkvOC8yMDAyIC0tIG5vdCBzdXJlIHdoeSB0aGlzIHdhcyBoZXJlIGluaXRpYWxseSwgYnV0Ci0JCQkJICogdGhlIGludGVudC9oYWNrIG11c3QgaGF2ZSBiZWVuIHRvIGNhbGwgdXBkYXRlIGlmIHRoaXMgd2FzCi0JCQkJICogdGhlIGZpcnN0IHRpbWUgZlN0cnVjdHVyZWRNb2RlbCB3YXMgc2V0LiBTbywgSSBhZGRlZCB0aGUKLQkJCQkgKiBsb2dpYyB0byBjaGVjayBmb3IgdGhhdCAiZmlyc3QgdGltZSIgY2FzZS4gSXQgd291bGQgYXBwZWFyCi0JCQkJICogd2UgZG9uJ3QgcmVhbGx5IG5lZWQuIG1heSByZW1vdmUgaW4gZnV0dXJlIHdoZW4gY2FuIHRlc3QKLQkJCQkgKiBtb3JlLgotCQkJCSAqLwotCQkJCXVwZGF0ZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmU3RydWN0dXJlZE1vZGVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5JV29ya2JlbmNoUGFydE9yaWVudGF0aW9uI2dldE9yaWVudGF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9yaWVudGF0aW9uKCkgewotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg3MTQKLQkJcmV0dXJuIFNXVC5MRUZUX1RPX1JJR0hUOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvciNnZXRTZWxlY3Rpb25Qcm92aWRlcigpCi0JICovCi0JcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJSVNlbGVjdGlvblByb3ZpZGVyIHBhcmVudFByb3ZpZGVyID0gc3VwZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChwYXJlbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uUHJvdmlkZXIocGFyZW50UHJvdmlkZXIsIHRoaXMpOwotCQkJfQotCQl9Ci0JCWlmIChmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQl9Ci0JCXJldHVybiBmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXRvcidzIHNvdXJjZSB2aWV3ZXIuIFRoaXMgbWV0aG9kIHdhcyBjcmVhdGVkIHRvIGV4cG9zZQotCSAqIHRoZSBwcm90ZWN0ZWQgZmluYWwgZ2V0U291cmNlVmlld2VyKCkgbWV0aG9kLgotCSAqIDxwPgotCSAqIE5vdCBBUEkuIE1heSBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGVkaXRvcidzIHNvdXJjZSB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRWaWV3ZXIgZ2V0VGV4dFZpZXdlcigpIHsKLQkJcmV0dXJuIChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgZ2V0U291cmNlVmlld2VyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNoYW5kbGVDdXJzb3JQb3NpdGlvbkNoYW5nZWQoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZUN1cnNvclBvc2l0aW9uQ2hhbmdlZCgpIHsKLQkJc3VwZXIuaGFuZGxlQ3Vyc29yUG9zaXRpb25DaGFuZ2VkKCk7Ci0JCXVwZGF0ZVN0YXR1c0ZpZWxkKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlNUQVRVU19DQVRFR09SWV9PRkZTRVQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IGV2ZW50LmdldFByb3BlcnR5KCk7Ci0KLQkJaWYgKEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJdXBkYXRlSG92ZXJCZWhhdmlvcigpOwotCQl9Ci0KLQkJaWYgKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5GT0xESU5HX0VOQUJMRUQuZXF1YWxzKHByb3BlcnR5KSkgewotCQkJaWYgKGdldFNvdXJjZVZpZXdlcigpIGluc3RhbmNlb2YgUHJvamVjdGlvblZpZXdlcikgewotCQkJCS8vIGluc3RhbGwgcHJvamVjdGlvbiBzdXBwb3J0IGlmIGl0IGhhcyBub3QgZXZlbiBiZWVuCi0JCQkJLy8gaW5zdGFsbGVkIHlldAotCQkJCWlmIChpc0ZvbGRpbmdFbmFibGVkKCkgJiYgKGZQcm9qZWN0aW9uU3VwcG9ydCA9PSBudWxsKSAmJiAoZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIgPT0gbnVsbCkpIHsKLQkJCQkJaW5zdGFsbFByb2plY3Rpb25TdXBwb3J0KCk7Ci0JCQkJfQotCQkJCVByb2plY3Rpb25WaWV3ZXIgcHYgPSAoUHJvamVjdGlvblZpZXdlcikgZ2V0U291cmNlVmlld2VyKCk7Ci0JCQkJaWYgKHB2LmlzUHJvamVjdGlvbk1vZGUoKSAhPSBpc0ZvbGRpbmdFbmFibGVkKCkpIHsKLQkJCQkJaWYgKHB2LmNhbkRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKSkKLQkJCQkJCXB2LmRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJc3VwZXIuaGFuZGxlUHJlZmVyZW5jZVN0b3JlQ2hhbmdlZChldmVudCk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluQnVzeVN0YXRlKCkgewotCQlyZXR1cm4gZkJ1c3lTdGF0ZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0I2luaXQob3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGUsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJRWRpdG9yU2l0ZSBzaXRlLCBJRWRpdG9ySW5wdXQgaW5wdXQpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCS8vIGlmIHdlJ3ZlIGdvdHRlbiBhbiBlcnJvciBlbHNld2hlcmUsIGJlZm9yZQotCQkvLyB3ZSd2ZSBhY3R1YWxseSBvcGVuZWQsIHRoZW4gZG9uJ3Qgb3Blbi4KLQkJaWYgKHNob3VsZENsb3NlKSB7Ci0JCQlzZXRTaXRlKHNpdGUpOwotCQkJY2xvc2UoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIGRvY3VtZW50IHByb3ZpZGVyIGZvciB0aGlzIGVkaXRvci4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnRQcm92aWRlcgotCSAqICAgICAgICAgICAgZG9jdW1lbnRQcm92aWRlciB0byBpbml0aWFsaXplCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZURvY3VtZW50UHJvdmlkZXIoSURvY3VtZW50UHJvdmlkZXIgZG9jdW1lbnRQcm92aWRlcikgewotCQlpZiAoZG9jdW1lbnRQcm92aWRlciAhPSBudWxsKSB7Ci0JCQlzZXREb2N1bWVudFByb3ZpZGVyKGRvY3VtZW50UHJvdmlkZXIpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZURyb3AoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQlpbnQgb3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFOwotCQlmRHJvcFRhcmdldCA9IG5ldyBEcm9wVGFyZ2V0KHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpLCBvcGVyYXRpb25zKTsKLQkJZkRyb3BBZGFwdGVyID0gbmV3IFJlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlcih0cnVlKTsKLQkJZkRyb3BBZGFwdGVyLnNldFRhcmdldEVkaXRvcih0aGlzKTsKLQkJZkRyb3BBZGFwdGVyLnNldFRhcmdldElEcyhnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkpOwotCQlmRHJvcEFkYXB0ZXIuc2V0VGV4dFZpZXdlcih0ZXh0Vmlld2VyKTsKLQkJZkRyb3BUYXJnZXQuc2V0VHJhbnNmZXIoZkRyb3BBZGFwdGVyLmdldFRyYW5zZmVycygpKTsKLQkJZkRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKGZEcm9wQWRhcHRlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNpbml0aWFsaXplRWRpdG9yKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRWRpdG9yKCkgewotCQlzdXBlci5pbml0aWFsaXplRWRpdG9yKCk7Ci0JCS8vIEZJWE1FOiBoZXJlJ3Mgd2hlcmUgdG8gYWRkIGJhY2sgaW4gb3VyIGN1c3RvbSBlbmNvZGluZyBzdXBwb3J0Ci0JCWZFbmNvZGluZ1N1cHBvcnQgPSBudWxsOwotCQlzZXRQcmVmZXJlbmNlU3RvcmUoY3JlYXRlQ29tYmluZWRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0KLQkJc2V0UmFuZ2VJbmRpY2F0b3IobmV3IERlZmF1bHRSYW5nZUluZGljYXRvcigpKTsKLQkJc2V0RWRpdG9yQ29udGV4dE1lbnVJZChFRElUT1JfQ09OVEVYVF9NRU5VX0lEKTsKLQkJaW5pdGlhbGl6ZURvY3VtZW50UHJvdmlkZXIobnVsbCk7Ci0JCS8vIHNldCB0aGUgaW5mb3BvcCBmb3Igc291cmNlIHZpZXdlcgotCQlTdHJpbmcgaGVscElkID0gZ2V0SGVscENvbnRleHRJZCgpOwotCQkvLyBubyBpbmZvcG9wIHNldCBvciB1c2luZyBkZWZhdWx0IHRleHQgZWRpdG9yIGhlbHAsIHVzZSBkZWZhdWx0Ci0JCWlmIChoZWxwSWQgPT0gbnVsbCB8fCBJVGV4dEVkaXRvckhlbHBDb250ZXh0SWRzLlRFWFRfRURJVE9SLmVxdWFscyhoZWxwSWQpKQotCQkJaGVscElkID0gSUhlbHBDb250ZXh0SWRzLlhNTF9TT1VSQ0VfVklFV19IRUxQSUQ7Ci0JCXNldEhlbHBDb250ZXh0SWQoaGVscElkKTsKLQkJLy8gZGVmZWN0IDIwMzE1OCAtIGRpc2FibGUgcnVsZXIgY29udGV4dCBtZW51IGZvcgotCQkvLyBiZXRhCi0JCS8vIHNldFJ1bGVyQ29udGV4dE1lbnVJZChSVUxFUl9DT05URVhUX01FTlVfSUQpOwotCQljb25maWd1cmVJbnNlcnRNb2RlKFNNQVJUX0lOU0VSVCwgdHJ1ZSk7Ci0KLQkJLy8gZW5hYmxlIHRoZSBiYXNlIHNvdXJjZSBlZGl0b3IgYWN0aXZpdHkgd2hlbiBlZGl0b3Igb3BlbnMKLQkJdHJ5IHsKLQkJCS8vIEZJWE1FOiAtIGNvbW1lbnRlZCBvdXQgdG8gYXZvaWQgbWlub3IgZGVwZW5kYW5jeSBkdXJpbmcKLQkJCS8vIHRyYW5zaXRpb24gdG8gb3JnLmVjbGlwc2UKLQkJCS8vIFdUUEFjdGl2aXR5QnJpZGdlLmdldEluc3RhbmNlKCkuZW5hYmxlQWN0aXZpdHkoQ09SRV9TU0VfQUNUSVZJVFlfSUQsCi0JCQkvLyB0cnVlKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCS8vIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nIHdpdGggZW5hYmxpbmcgYWN0aXZpdHksIGp1c3QgbG9nIHRoZQotCQkJLy8gZXJyb3IgYnV0IGRvbnQKLQkJCS8vIGhhdmUgaXQgYnJlYWsgdGhlIGVkaXRvcgotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgdC5nZXRNZXNzYWdlKCksIHQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvciNpbml0aWFsaXplS2V5QmluZGluZ1Njb3BlcygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZUtleUJpbmRpbmdTY29wZXMoKSB7Ci0JCXNldEtleUJpbmRpbmdTY29wZXMobmV3IFN0cmluZ1tde0VESVRPUl9LRVlCSU5ESU5HX1NDT1BFX0lEfSk7Ci0JfQotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhlIGVkaXRvcidzIHNvdXJjZSB2aWV3ZXIgYW5kIG90aGVyIGl0ZW1zIHRoYXQgd2VyZSBzb3VyY2UKLQkgKiB2aWV3ZXItZGVwZW5kZW50LgotCSAqLwotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplU291cmNlVmlld2VyKCkgewotCQlJQWN0aW9uIGNvbnRlbnRBc3Npc3RBY3Rpb24gPSBnZXRBY3Rpb24oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMpOwotCQlpZiAoY29udGVudEFzc2lzdEFjdGlvbiBpbnN0YW5jZW9mIElVcGRhdGUpIHsKLQkJCSgoSVVwZGF0ZSkgY29udGVudEFzc2lzdEFjdGlvbikudXBkYXRlKCk7Ci0JCX0KLQkJSUFjdGlvbiBvcGVuSHlwZXJsaW5rQWN0aW9uID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX09QRU5fRklMRSk7Ci0JCWlmIChvcGVuSHlwZXJsaW5rQWN0aW9uIGluc3RhbmNlb2YgT3Blbkh5cGVybGlua0FjdGlvbikgewotCQkJKChPcGVuSHlwZXJsaW5rQWN0aW9uKSBvcGVuSHlwZXJsaW5rQWN0aW9uKS5zZXRIeXBlcmxpbmtEZXRlY3RvcnMoZ2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpLmdldEh5cGVybGlua0RldGVjdG9ycyhnZXRTb3VyY2VWaWV3ZXIoKSkpOwotCQl9Ci0KLQkJLy8gZG8gbm90IGV2ZW4gaW5zdGFsbCBwcm9qZWN0aW9uIHN1cHBvcnQgdW50aWwgZm9sZGluZyBpcyBhY3R1YWxseQotCQkvLyBlbmFibGVkCi0JCWlmIChpc0ZvbGRpbmdFbmFibGVkKCkpIHsKLQkJCWluc3RhbGxQcm9qZWN0aW9uU3VwcG9ydCgpOwotCQl9Ci0KLQkJLy8gaW5pdGlhbGl6ZSBzb3VyY2Ugdmlld2VyJ3MgY29ycmVjdGlvbiBhc3Npc3RhbnQKLQkJSUNvbnRlbnRBc3Npc3RhbnQgY29ycmVjdGlvbkFzc2lzdGFudCA9IGNyZWF0ZUNvcnJlY3Rpb25Bc3Npc3RhbnQoKTsKLQkJZ2V0VGV4dFZpZXdlcigpLnNldENvcnJlY3Rpb25Bc3Npc3RhbnQoY29ycmVjdGlvbkFzc2lzdGFudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFNvdXJjZVZpZXdlcihTdHJ1Y3R1cmVkVGV4dFZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLy8gZW5zdXJlIGRlY29yYXRpb24gc3VwcG9ydCBpcyBjb25maWd1cmVkCi0JCWdldFNvdXJjZVZpZXdlckRlY29yYXRpb25TdXBwb3J0KHNvdXJjZVZpZXdlcik7Ci0JCWZNb3VzZVRyYWNrZXIgPSBuZXcgTW91c2VUcmFja2VyKCk7Ci0JCWZNb3VzZVRyYWNrZXIuc3RhcnQoc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKSk7Ci0JCWluaXRpYWxpemVEcm9wKHNvdXJjZVZpZXdlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvciNpbnN0YWxsRW5jb2RpbmdTdXBwb3J0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbnN0YWxsRW5jb2RpbmdTdXBwb3J0KCkgewotCQkvLyBUT0RPOiBpbnN0YWxsIG91ciBjdXN0b20gc3VwcG9ydCB0aGF0IGNhbgotCQkvLyB1cGRhdGUgZG9jdW1lbnQgYXBwcm9wcmlhdGVseQotCQkvLyBzdXBlci5pbnN0YWxsRW5jb2RpbmdTdXBwb3J0KCk7Ci0JfQotCi0JLyoqCi0JICogSW5zdGFsbCBldmVyeXRoaW5nIG5lY2Vzc2FyeSB0byBnZXQgZG9jdW1lbnQgZm9sZGluZyB3b3JraW5nIGFuZCBlbmFibGUKLQkgKiBkb2N1bWVudCBmb2xkaW5nCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc3RhbGxQcm9qZWN0aW9uU3VwcG9ydCgpIHsKLQkJUHJvamVjdGlvblZpZXdlciBwcm9qZWN0aW9uVmlld2VyID0gKFByb2plY3Rpb25WaWV3ZXIpIGdldFNvdXJjZVZpZXdlcigpOwotCi0JCWZQcm9qZWN0aW9uU3VwcG9ydCA9IG5ldyBQcm9qZWN0aW9uU3VwcG9ydChwcm9qZWN0aW9uVmlld2VyLCBnZXRBbm5vdGF0aW9uQWNjZXNzKCksIGdldFNoYXJlZENvbG9ycygpKTsKLQkJZlByb2plY3Rpb25TdXBwb3J0LmFkZFN1bW1hcml6YWJsZUFubm90YXRpb25UeXBlKCJvcmcuZWNsaXBzZS51aS53b3JrYmVuY2gudGV4dGVkaXRvci5lcnJvciIpOyAvLyROT04tTkxTLTEkCi0JCWZQcm9qZWN0aW9uU3VwcG9ydC5hZGRTdW1tYXJpemFibGVBbm5vdGF0aW9uVHlwZSgib3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3Iud2FybmluZyIpOyAvLyROT04tTkxTLTEkCi0JCWZQcm9qZWN0aW9uU3VwcG9ydC5zZXRIb3ZlckNvbnRyb2xDcmVhdG9yKG5ldyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcigpIHsKLQkJCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sIGNyZWF0ZUluZm9ybWF0aW9uQ29udHJvbChTaGVsbCBwYXJlbnQpIHsKLQkJCQlyZXR1cm4gbmV3IERlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2wocGFyZW50KTsKLQkJCX0KLQkJfSk7Ci0JCWZQcm9qZWN0aW9uU3VwcG9ydC5pbnN0YWxsKCk7Ci0KLQkJSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyIHVwZGF0ZXIgPSBudWxsOwotCQlFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCk7Ci0JCVN0cmluZ1tdIGlkcyA9IGdldENvbmZpZ3VyYXRpb25Qb2ludHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IHVwZGF0ZXIgPT0gbnVsbCAmJiBpIDwgaWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQl1cGRhdGVyID0gKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlcikgYnVpbGRlci5nZXRDb25maWd1cmF0aW9uKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5JRCwgaWRzW2ldKTsKLQkJfQotCi0JCWZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyID0gdXBkYXRlcjsKLQkJaWYgKGZQcm9qZWN0aW9uTW9kZWxVcGRhdGVyICE9IG51bGwpCi0JCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlci5pbnN0YWxsKHByb2plY3Rpb25WaWV3ZXIpOwotCi0JCWlmIChpc0ZvbGRpbmdFbmFibGVkKCkpCi0JCQlwcm9qZWN0aW9uVmlld2VyLmRvT3BlcmF0aW9uKFByb2plY3Rpb25WaWV3ZXIuVE9HR0xFKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gd2hldGhlciBkb2N1bWVudCBmb2xkaW5nIHNob3VsZCBiZSBlbmFibGVkIGFjY29yZGluZyB0byB0aGUKLQkgKiBwcmVmZXJlbmNlIHN0b3JlIHNldHRpbmdzLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZG9jdW1lbnQgZm9sZGluZyBzaG91bGQgYmUgZW5hYmxlZAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0ZvbGRpbmdFbmFibGVkKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCS8vIGNoZWNrIGJvdGggcHJlZmVyZW5jZSBzdG9yZSBhbmQgdm0gYXJndW1lbnQKLQkJcmV0dXJuIChzdG9yZS5nZXRCb29sZWFuKElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5GT0xESU5HX0VOQUJMRUQpKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbG9nVW5leHBlY3RlZERvY3VtZW50S2luZChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJLy8gZGlzcGxheSBhIGRpYWxvZyBpbmZvcm1pbmcgdXNlciBvZiB1a25vd24gY29udGVudCB0eXBlCi0JCWlmIChTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihFZGl0b3JQcmVmZXJlbmNlTmFtZXMuU0hPV19VTktOT1dOX0NPTlRFTlRfVFlQRV9NU0cpKSB7Ci0JCQlKb2Igam9iID0gbmV3IFVJSm9iKFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JfMCkgewotCQkJCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQkJCVVua25vd25Db250ZW50VHlwZURpYWxvZyBkaWFsb2cgPSBuZXcgVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nKGdldFNpdGUoKS5nZXRTaGVsbCgpLCBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCksIEVkaXRvclByZWZlcmVuY2VOYW1lcy5TSE9XX1VOS05PV05fQ09OVEVOVF9UWVBFX01TRyk7Ci0JCQkJCWRpYWxvZy5vcGVuKCk7Ci0JCQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQkJCX0KLQkJCX07Ci0JCQlqb2Iuc2NoZWR1bGUoKTsKLQkJfQotCi0JCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJTdHJ1Y3R1cmVkVGV4dEVkaXRvciBiZWluZyB1c2VkIHdpdGhvdXQgU3RydWN0dXJlZERvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5hbWUgPSBudWxsOwotCQlpZiAoaW5wdXQgIT0gbnVsbCkgewotCQkJbmFtZSA9IGlucHV0LmdldE5hbWUoKTsKLQkJfQotCQllbHNlIHsKLQkJCW5hbWUgPSAiaW5wdXQgd2FzIG51bGwiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklORywgIiAgICAgICAgIElucHV0IE5hbWU6ICIgKyBuYW1lKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgaW1wbENsYXNzID0gbnVsbDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGlucHV0KTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWltcGxDbGFzcyA9IGRvY3VtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQl9Ci0JCWVsc2UgewotCQkJaW1wbENsYXNzID0gImRvY3VtZW50IHdhcyBudWxsIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICIgICAgICAgIFVuZXhwZWN0ZWQgSURvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50YXRpb246ICIgKyBnZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICIgICAgICAgIFVuZXhwZWN0ZWQgSURvY3VtZW50IGltcGxlbWVudGF0aW9uOiAiICsgaW1wbENsYXNzKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNwZXJmb3JtUmV2ZXJ0KCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtUmV2ZXJ0KCkgewotCQlQcm9qZWN0aW9uVmlld2VyIHByb2plY3Rpb25WaWV3ZXIgPSAoUHJvamVjdGlvblZpZXdlcikgZ2V0U291cmNlVmlld2VyKCk7Ci0JCXByb2plY3Rpb25WaWV3ZXIuc2V0UmVkcmF3KGZhbHNlKTsKLQkJdHJ5IHsKLQotCQkJYm9vbGVhbiBwcm9qZWN0aW9uTW9kZSA9IHByb2plY3Rpb25WaWV3ZXIuaXNQcm9qZWN0aW9uTW9kZSgpOwotCQkJaWYgKHByb2plY3Rpb25Nb2RlKSB7Ci0JCQkJcHJvamVjdGlvblZpZXdlci5kaXNhYmxlUHJvamVjdGlvbigpOwotCQkJCWlmIChmUHJvamVjdGlvbk1vZGVsVXBkYXRlciAhPSBudWxsKQotCQkJCQlmUHJvamVjdGlvbk1vZGVsVXBkYXRlci51bmluc3RhbGwoKTsKLQkJCX0KLQotCQkJc3VwZXIucGVyZm9ybVJldmVydCgpOwotCi0JCQlpZiAocHJvamVjdGlvbk1vZGUpIHsKLQkJCQlpZiAoZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIgIT0gbnVsbCkKLQkJCQkJZlByb2plY3Rpb25Nb2RlbFVwZGF0ZXIuaW5zdGFsbChwcm9qZWN0aW9uVmlld2VyKTsKLQkJCQlwcm9qZWN0aW9uVmlld2VyLmVuYWJsZVByb2plY3Rpb24oKTsKLQkJCX0KLQotCQl9Ci0JCWZpbmFsbHkgewotCQkJcHJvamVjdGlvblZpZXdlci5zZXRSZWRyYXcodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlZHVjZWQgdG8gcHJvdGVjdGVkIG1ldGhvZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1lbWJlclNlbGVjdGlvbigpIHsKLQkJLyoKLQkJICogVGhpcyBtZXRob2Qgd2FzIG1hZGUgcHVibGljIGZvciB1c2UgYnkgZWRpdG9ycyB0aGF0IHVzZQotCQkgKiBTdHJ1Y3R1cmVkVGV4dEVkaXRvciAobGlrZSBzb21lIGNsaWVudHMpCi0JCSAqLwotCQlzdXBlci5yZW1lbWJlclNlbGVjdGlvbigpOwotCX0KLQotCi0JLyoqCi0JICogYm90aCBzdGFydHMgYW5kIHJlc2V0cyB0aGUgYnVzeSBzdGF0ZSB0aW1lcgotCSAqLwotCXByaXZhdGUgdm9pZCByZXNldEJ1c3lTdGF0ZSgpIHsKLQkJLy8gcmVzZXQgdGhlICJidXN5IiB0aW1lb3V0Ci0JCWlmIChmQnVzeVRpbWVyICE9IG51bGwpIHsKLQkJCWZCdXN5VGltZXIuY2FuY2VsKCk7Ci0JCX0KLQkJc3RhcnRCdXN5VGltZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlZHVjZWQgdG8gcHJvdGVjdGVkIG1ldGhvZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXN0b3JlU2VsZWN0aW9uKCkgewotCQkvKgotCQkgKiBUaGlzIG1ldGhvZCB3YXMgbWFkZSBwdWJsaWMgZm9yIHVzZSBieSBlZGl0b3JzIHRoYXQgdXNlCi0JCSAqIFN0cnVjdHVyZWRUZXh0RWRpdG9yIChsaWtlIHNvbWUgY2xpZW50cykKLQkJICovCi0JCS8vIGNhdGNoIG9kZCBjYXNlIHdoZXJlIHNvdXJjZSB2aWV3ZXIgaGFzIG5vIHRleHQKLQkJLy8gd2lkZ2V0IChkZWZlY3QKLQkJLy8gMjI3NjcwKQotCQlpZiAoKGdldFNvdXJjZVZpZXdlcigpICE9IG51bGwpICYmIChnZXRTb3VyY2VWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCkpCi0JCQlzdXBlci5yZXN0b3JlU2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0VGV4dEVkaXRvciNydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBydWxlckNvbnRleHRNZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIucnVsZXJDb250ZXh0TWVudUFib3V0VG9TaG93KG1lbnUpOwotCi0JCUlNZW51TWFuYWdlciBmb2xkaW5nTWVudSA9IG5ldyBNZW51TWFuYWdlcihTU0VVSU1lc3NhZ2VzLkZvbGRpbmcsICJwcm9qZWN0aW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJbWVudS5hcHBlbmRUb0dyb3VwKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX1JVTEVSUywgZm9sZGluZ01lbnUpOwotCi0JCUlBY3Rpb24gYWN0aW9uID0gZ2V0QWN0aW9uKCJGb2xkaW5nVG9nZ2xlIik7IC8vJE5PTi1OTFMtMSQKLQkJZm9sZGluZ01lbnUuYWRkKGFjdGlvbik7Ci0JCWFjdGlvbiA9IGdldEFjdGlvbigiRm9sZGluZ0V4cGFuZEFsbCIpOyAvLyROT04tTkxTLTEkCi0JCWZvbGRpbmdNZW51LmFkZChhY3Rpb24pOwotCQlhY3Rpb24gPSBnZXRBY3Rpb24oIkZvbGRpbmdDb2xsYXBzZUFsbCIpOyAvLyROT04tTkxTLTEkCi0JCWZvbGRpbmdNZW51LmFkZChhY3Rpb24pOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgaW50ZXJuYWxNb2RlbCA9IGdldEludGVybmFsTW9kZWwoKTsKLQkJaWYgKGludGVybmFsTW9kZWwgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBkZWJ1Z2dpbmdBdmFpbGFibGUgPSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuaXNBdmFpbGFibGUoaW50ZXJuYWxNb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKSwgQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oZ2V0RWRpdG9ySW5wdXQoKSkpOwotCQkJaWYgKGRlYnVnZ2luZ0F2YWlsYWJsZSkgewotCQkJCS8vIGFwcGVuZCBhY3Rpb25zIHRvICJkZWJ1ZyIgZ3JvdXAgKGNyZWF0ZWQgaW4KLQkJCQkvLyBBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3IucnVsZXJDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlcikKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoImRlYnVnIiwgZ2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuVE9HR0xFX0JSRUFLUE9JTlRTKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoImRlYnVnIiwgZ2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuTUFOQUdFX0JSRUFLUE9JTlRTKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQltZW51LmFwcGVuZFRvR3JvdXAoImRlYnVnIiwgZ2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuRURJVF9CUkVBS1BPSU5UUykpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlhZGRFeHRlbmRlZFJ1bGVyQ29udGV4dE1lbnVBY3Rpb25zKG1lbnUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIE92ZXJyaWRkZW4gdG8gZXhwb3NlIHBhcnQgYWN0aXZhdGlvbiBoYW5kbGluZyBmb3IgbXVsdGktcGFnZSBlZGl0b3JzLgotCSAqIDwvcD4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVkdWNlZCB0byBwcm90ZWN0ZWQgbWV0aG9kIGluIHRoZSBmdXR1cmUuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3Ijc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZShvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHVibGljIHZvaWQgc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJc3VwZXIuc2FmZWx5U2FuaXR5Q2hlY2tTdGF0ZShpbnB1dCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNhdmVkTW9kZWwoKSB7Ci0JCWlmIChnZXRJbnRlcm5hbE1vZGVsKCkgIT0gbnVsbCkgewotCQkJZ2V0SW50ZXJuYWxNb2RlbCgpLmNoYW5nZWRNb2RlbCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRW5zdXJlIHRoYXQgdGhlIGNvcnJlY3QgSURvY3VtZW50UHJvdmlkZXIgaXMgdXNlZC4gRm9yIGRpcmVjdCBtb2RlbHMsIGEKLQkgKiBzcGVjaWFsIHByb3ZpZGVyIGlzIHVzZWQuIEZvciBTdG9yYWdlRWRpdG9ySW5wdXRzLCB1c2UgYSBjdXN0b20KLQkgKiBwcm92aWRlciB0aGF0IGNyZWF0ZXMgYSB1c2FibGUgUmVzb3VyY2VBbm5vdGF0aW9uTW9kZWwuIEZvciBldmVyeXRoaW5nCi0JICogZWxzZSwgdXNlIHRoZSBiYXNlIHN1cHBvcnQuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RGVjb3JhdGVkVGV4dEVkaXRvciNzZXREb2N1bWVudFByb3ZpZGVyKG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXREb2N1bWVudFByb3ZpZGVyKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQkvLyBsYXJnZWx5IHVudGVzdGVkCi0JCQlzZXREb2N1bWVudFByb3ZpZGVyKFN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCX0KLQkJZWxzZSBpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0ICYmICEoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KSAmJiAhKGlucHV0IGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkpIHsKLQkJCXNldERvY3VtZW50UHJvdmlkZXIoU3RvcmFnZU1vZGVsUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldCBlZGl0b3IgcGFydCBhc3NvY2lhdGVkIHdpdGggdGhpcyBlZGl0b3IuCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIGVkaXRvclBhcnQKLQkgKiAgICAgICAgICAgIGVkaXRvciBwYXJ0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkaXRvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVkaXRvclBhcnQoSUVkaXRvclBhcnQgZWRpdG9yUGFydCkgewotCQlmRWRpdG9yUGFydCA9IGVkaXRvclBhcnQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgbW9kZWwgZmllbGQgd2l0aGluIHRoaXMgZWRpdG9yLgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gY2FuIGV2ZW50dWFsbHkgYmUgZWxpbWluYXRlZAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZ2V0RG9jdW1lbnRQcm92aWRlcigpLCAiZG9jdW1lbnQgcHJvdmlkZXIgY2FuIG5vdCBiZSBudWxsIHdoZW4gc2V0dGluZyBtb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmU3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCWlmIChmU3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpICE9IG51bGwpIHsKLQkJCQlmU3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZ2V0SW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKCkpOwotCQkJfQotCQkJZlN0cnVjdHVyZWRNb2RlbC5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0JCX0KLQkJZlN0cnVjdHVyZWRNb2RlbCA9IG5ld01vZGVsOwotCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlpZiAoZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5hZGREb2N1bWVudExpc3RlbmVyKGdldEludGVybmFsRG9jdW1lbnRMaXN0ZW5lcigpKTsKLQkJCX0KLQkJCWZTdHJ1Y3R1cmVkTW9kZWwuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkpOwotCQl9Ci0JCS8vIHVwZGF0ZSgpIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIG1vZGVsIGlzCi0JCS8vIHNldCBvciBjaGFuZ2VkCi0JCXVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVkaXRvcidzIHNvdXJjZSB2aWV3ZXIgY29uZmlndXJhdGlvbiB3aGljaCBpdCB1c2VzIHRvCi0JICogY29uZmlndXJlIGl0J3MgaW50ZXJuYWwgc291cmNlIHZpZXdlci4gVGhpcyBtZXRob2Qgd2FzIG92ZXJ3cml0dGVuIHNvCi0JICogdGhhdCB2aWV3ZXIgY29uZmlndXJhdGlvbiBjb3VsZCBiZSBzZXQgYWZ0ZXIgZWRpdG9yIHBhcnQgd2FzIGNyZWF0ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0U291cmNlVmlld2VyQ29uZmlndXJhdGlvbihTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGNvbmZpZykgewotCQlzdXBlci5zZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKGNvbmZpZyk7Ci0JCVN0cnVjdHVyZWRUZXh0Vmlld2VyIHN0diA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHN0diAhPSBudWxsKSB7Ci0JCQkvLyB0aGVyZSBzaG91bGQgYmUgbm8gbmVlZCB0byB1bmNvbmZpZ3VyZQotCQkJLy8gYmVmb3JlIGNvbmZpZ3VyZSBiZWNhdXNlCi0JCQkvLyBjb25maWd1cmUgd2lsbAotCQkJLy8gYWxzbyB1bmNvbmZpZ3VyZSBiZWZvcmUgY29uZmlndXJpbmcKLQkJCXN0di51bmNvbmZpZ3VyZSgpOwotCQkJc3R2LmNvbmZpZ3VyZShjb25maWcpOwotCi0JCQkvLyB1cGRhdGUgc291cmNlIHZpZXdlcidzIGNvcnJlY3Rpb24gYXNzaXN0YW50IGFzIHdlbGwKLQkJCUlDb250ZW50QXNzaXN0YW50IGNvcnJlY3Rpb25Bc3Npc3RhbnQgPSBjcmVhdGVDb3JyZWN0aW9uQXNzaXN0YW50KCk7Ci0JCQlzdHYuc2V0Q29ycmVjdGlvbkFzc2lzdGFudChjb3JyZWN0aW9uQXNzaXN0YW50KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5Xb3JrYmVuY2hQYXJ0I3Nob3dCdXN5KGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2hvd0J1c3koYm9vbGVhbiBidXN5KSB7Ci0JCWlmIChidXN5KSB7Ci0JCQlmUmVtZW1iZXJUaXRsZSA9IGdldFBhcnROYW1lKCk7Ci0JCQkvLyB1cGRhdGUgdGl0bGUgYW5kL29yIGZvbnRzIGFuZC9vciBiYWNrZ3JvdW5kCi0JCQkvLwotCQkJLy8gdGVtcCBzb2x1dGlvbiwgZm9yIHRlc3RpbmcsIHVzZXMgImJ1c3kiCi0JCQlzZXRQYXJ0TmFtZShTU0VVSU1lc3NhZ2VzLmJ1c3kpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQkvLyByZXNldCB0byB3aGF0IGl0IHdhcwotCQkJc2V0UGFydE5hbWUoZlJlbWVtYmVyVGl0bGUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHN0YXJ0QnVzeVRpbWVyKCkgewotCQkvLyBUT0RPOiB3ZSBuZWVkIGEgcmVzZXR0YWJsZSB0aW1lciwgc28gbm90IHNvCi0JCS8vIG1hbnkgYXJlIGNyZWF0ZWQKLQkJZkJ1c3lUaW1lciA9IG5ldyBUaW1lcih0cnVlKTsKLQkJZkJ1c3lUaW1lci5zY2hlZHVsZShuZXcgVGltZU91dEV4cGlyZWQoKSwgQlVTWV9TVEFURV9ERUxBWSk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlIHNob3VsZCBiZSBjYWxsZWQgd2hlbmV2ZXIgdGhlIG1vZGVsIGlzIHNldCBvciBjaGFuZ2VkIChhcyBpbgotCSAqIHN3YXBwZWQpCi0JICogPHA+Ci0JICogTm90IEFQSS4gTWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlpZiAoZk91dGxpbmVQYWdlICE9IG51bGwgJiYgZk91dGxpbmVQYWdlIGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKSB7Ci0JCQlDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24gY2ZnID0gY3JlYXRlQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCk7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgZk91dGxpbmVQYWdlKS5zZXRDb25maWd1cmF0aW9uKGNmZyk7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBnZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCQkoKENvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZSkgZk91dGxpbmVQYWdlKS5zZXRJbnB1dENvbnRlbnRUeXBlSWRlbnRpZmllcihpbnRlcm5hbE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQkJCSgoQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKSBmT3V0bGluZVBhZ2UpLnNldElucHV0KGludGVybmFsTW9kZWwpOwotCQl9Ci0JCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCAmJiBmUHJvcGVydHlTaGVldFBhZ2UgaW5zdGFuY2VvZiBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSkgewotCQkJUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gY2ZnID0gY3JlYXRlUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKTsKLQkJCSgoQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UpIGZQcm9wZXJ0eVNoZWV0UGFnZSkuc2V0Q29uZmlndXJhdGlvbihjZmcpOwotCQl9Ci0JCWRpc3Bvc2VNb2RlbERlcGVuZGVudEZpZWxkcygpOwotCi0JCWZTaG93SW5UYXJnZXRJZHMgPSBjcmVhdGVTaG93SW5UYXJnZXRJZHMoKTsKLQotCQl1cGRhdGVTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCk7Ci0JCQotCQlpZiAoZlN0cnVjdHVyZWRTZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQlmU3RydWN0dXJlZFNlbGVjdGlvblByb3ZpZGVyLnNldERvY3VtZW50KGdldEludGVybmFsTW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSk7Ci0JCX0KLQotCQljcmVhdGVNb2RlbERlcGVuZGVudEZpZWxkcygpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgYWxsIGNvbnRlbnQgZGVwZW5kZW50IGFjdGlvbnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMoKSB7Ci0JCXN1cGVyLnVwZGF0ZUNvbnRlbnREZXBlbmRlbnRBY3Rpb25zKCk7Ci0JCS8vIHN1cGVyLnVwZGF0ZUNvbnRlbnREZXBlbmRlbnRBY3Rpb25zIG9ubHkgdXBkYXRlcwotCQkvLyB0aGUgZW5hYmxlL2Rpc2FibGUKLQkJLy8gc3RhdGUgb2YgYWxsCi0JCS8vIHRoZSBjb250ZW50IGRlcGVuZGVudCBhY3Rpb25zLgotCQkvLyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcidzIHVuZG8gYW5kIHJlZG8gYWN0aW9ucwotCQkvLyBoYXZlIGEgZGV0YWlsIGxhYmVsIGFuZAotCQkvLyBkZXNjcmlwdGlvbi4KLQkJLy8gVGhleSBuZWVkZWQgdG8gYmUgdXBkYXRlZC4KLQkJaWYgKCFmRWRpdG9yRGlzcG9zZWQpCi0JCQl1cGRhdGVNZW51VGV4dCgpOwotCX0KLQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgZWRpdG9yIGNvbnRleHQgbWVudSBieSBjcmVhdGluZyBhIG5ldyBjb250ZXh0IG1lbnUgd2l0aCB0aGUKLQkgKiBnaXZlbiBtZW51IGlkCi0JICogCi0JICogQHBhcmFtIGNvbnRleHRNZW51SWQKLQkgKiAgICAgICAgICAgIENhbm5vdCBiZSBudWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVkaXRvckNvbnRleHRNZW51SWQoU3RyaW5nIGNvbnRleHRNZW51SWQpIHsKLQkJLy8gdXBkYXRlIGVkaXRvciBjb250ZXh0IG1lbnUgaWQgaWYgdXBkYXRpbmcgdG8gYSBuZXcgaWQgb3IgaWYgY29udGV4dAotCQkvLyBtZW51IGlzIG5vdCBhbHJlYWR5IHNldCB1cAotCQlpZiAoIWNvbnRleHRNZW51SWQuZXF1YWxzKGdldEVkaXRvckNvbnRleHRNZW51SWQoKSkgfHwgKGZUZXh0Q29udGV4dE1lbnUgPT0gbnVsbCkpIHsKLQkJCXNldEVkaXRvckNvbnRleHRNZW51SWQoY29udGV4dE1lbnVJZCk7Ci0KLQkJCWlmIChnZXRTb3VyY2VWaWV3ZXIoKSAhPSBudWxsKSB7Ci0JCQkJU3R5bGVkVGV4dCBzdHlsZWRUZXh0ID0gZ2V0U291cmNlVmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpOwotCQkJCWlmIChzdHlsZWRUZXh0ICE9IG51bGwpIHsKLQkJCQkJLy8gZGlzcG9zZSBvZiBwcmV2aW91cyBjb250ZXh0IG1lbnUKLQkJCQkJaWYgKGZUZXh0Q29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJCQkJZlRleHRDb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCQkJCX0KLQkJCQkJaWYgKGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihnZXRDb250ZXh0TWVudUxpc3RlbmVyKCkpOwotCQkJCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIucmVtb3ZlQWxsKCk7Ci0JCQkJCQlmVGV4dENvbnRleHRNZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCQkJCX0KLQotCQkJCQlmVGV4dENvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihnZXRFZGl0b3JDb250ZXh0TWVudUlkKCksIGdldEVkaXRvckNvbnRleHRNZW51SWQoKSk7Ci0JCQkJCWZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLnNldFJlbW92ZUFsbFdoZW5TaG93bih0cnVlKTsKLQkJCQkJZlRleHRDb250ZXh0TWVudU1hbmFnZXIuYWRkTWVudUxpc3RlbmVyKGdldENvbnRleHRNZW51TGlzdGVuZXIoKSk7Ci0KLQkJCQkJZlRleHRDb250ZXh0TWVudSA9IGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHN0eWxlZFRleHQpOwotCQkJCQlzdHlsZWRUZXh0LnNldE1lbnUoZlRleHRDb250ZXh0TWVudSk7Ci0KLQkJCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoZ2V0RWRpdG9yQ29udGV4dE1lbnVJZCgpLCBmVGV4dENvbnRleHRNZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0KLQkJCQkJLy8gYWxzbyByZWdpc3RlciB0aGlzIG1lbnUgZm9yIHNvdXJjZSBwYWdlIHBhcnQgYW5kCi0JCQkJCS8vIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaWRzCi0JCQkJCVN0cmluZyBwYXJ0SWQgPSBnZXRTaXRlKCkuZ2V0SWQoKTsKLQkJCQkJaWYgKHBhcnRJZCAhPSBudWxsKSB7Ci0JCQkJCQlnZXRTaXRlKCkucmVnaXN0ZXJDb250ZXh0TWVudShwYXJ0SWQgKyBFRElUT1JfQ09OVEVYVF9NRU5VX1NVRkZJWCwgZlRleHRDb250ZXh0TWVudU1hbmFnZXIsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCQkJCQl9Ci0JCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KEVESVRPUl9DT05URVhUX01FTlVfSUQsIGZUZXh0Q29udGV4dE1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIGVkaXRvciBjb250ZXh0IG1lbnUsIHZlcnRpY2FsIHJ1bGVyIG1lbnUsIGhlbHAgY29udGV4dCBpZCBmb3IKLQkgKiBuZXcgY29udGVudCB0eXBlCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUVkaXRvckNvbnRyb2xzRm9yQ29udGVudFR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQl1cGRhdGVFZGl0b3JDb250ZXh0TWVudUlkKEVESVRPUl9DT05URVhUX01FTlVfSUQpOwotCQkJdXBkYXRlUnVsZXJDb250ZXh0TWVudUlkKFJVTEVSX0NPTlRFWFRfTUVOVV9JRCk7Ci0JCQl1cGRhdGVIZWxwQ29udGV4dElkKElUZXh0RWRpdG9ySGVscENvbnRleHRJZHMuVEVYVF9FRElUT1IpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlRWRpdG9yQ29udGV4dE1lbnVJZChjb250ZW50VHlwZSArIEVESVRPUl9DT05URVhUX01FTlVfU1VGRklYKTsKLQkJCXVwZGF0ZVJ1bGVyQ29udGV4dE1lbnVJZChjb250ZW50VHlwZSArIFJVTEVSX0NPTlRFWFRfTUVOVV9TVUZGSVgpOwotCQkJdXBkYXRlSGVscENvbnRleHRJZChjb250ZW50VHlwZSArICJfc291cmNlX0hlbHBJZCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlRW5jb2RpbmdNZW1lbnRvKCkgewotCQlib29sZWFuIGZhaWxlZCA9IGZhbHNlOwotCQlJU3RydWN0dXJlZE1vZGVsIGludGVybmFsTW9kZWwgPSBnZXRJbnRlcm5hbE1vZGVsKCk7Ci0JCWlmIChpbnRlcm5hbE1vZGVsICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gaW50ZXJuYWxNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUVuY29kaW5nTWVtZW50byBtZW1lbnRvID0gZG9jLmdldEVuY29kaW5nTWVtZW50bygpOwotCQkJSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gaW50ZXJuYWxNb2RlbC5nZXRNb2RlbEhhbmRsZXIoKS5nZXRFbmNvZGluZ0RldGVjdG9yKCk7Ci0JCQlpZiAobWVtZW50byAhPSBudWxsICYmIGRldGVjdG9yICE9IG51bGwpCi0JCQkJZGV0ZWN0b3Iuc2V0KGRvYyk7Ci0JCQl0cnkgewotCQkJCWRldGVjdG9yLmdldEVuY29kaW5nKCk7Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCWZhaWxlZCA9IHRydWU7Ci0JCQl9Ci0JCQkvLyBiZSBzdXJlIHRvIHVzZSB0aGUgbmV3IGluc3RhbmNlCi0JCQkvLyBidXQgb25seSBpZiBubyBleGNlcHRpb24gb2NjdXJyZWQuCi0JCQkvLyAod2UgbWF5IGZpbmQgY2FzZXMgd2UgbmVlZCB0byBkbyBtb3JlIGVycm9yIHJlY292ZXIgdGhlcmUpCi0JCQkvLyBzaG91bGQgYmUgbmVhciBpbXBvc3NpYmxlIHRvIGdldCBJT0V4Y2VwdGlvbiBmcm9tIHByb2Nlc3NpbmcKLQkJCS8vIHRoZQotCQkJLy8gKmRvY3VtZW50KgotCQkJaWYgKCFmYWlsZWQpIHsKLQkJCQlkb2Muc2V0RW5jb2RpbmdNZW1lbnRvKG1lbWVudG8pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgaGVscCBjb250ZXh0IG9mIHRoZSBlZGl0b3Igd2l0aCB0aGUgZ2l2ZW4gaGVscCBjb250ZXh0IGlkCi0JICogCi0JICogQHBhcmFtIGhlbHBDb250ZXh0SWQKLQkgKiAgICAgICAgICAgIENhbm5vdCBiZSBudWxsCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUhlbHBDb250ZXh0SWQoU3RyaW5nIGhlbHBDb250ZXh0SWQpIHsKLQkJaWYgKCFoZWxwQ29udGV4dElkLmVxdWFscyhnZXRIZWxwQ29udGV4dElkKCkpKSB7Ci0JCQlzZXRIZWxwQ29udGV4dElkKGhlbHBDb250ZXh0SWQpOwotCi0JCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCkgewotCQkJCVN0eWxlZFRleHQgc3R5bGVkVGV4dCA9IGdldFNvdXJjZVZpZXdlcigpLmdldFRleHRXaWRnZXQoKTsKLQkJCQlpZiAoc3R5bGVkVGV4dCAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hIZWxwU3lzdGVtIGhlbHBTeXN0ZW0gPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKTsKLQkJCQkJaGVscFN5c3RlbS5zZXRIZWxwKHN0eWxlZFRleHQsIGdldEhlbHBDb250ZXh0SWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBVcGRhdGUgdGhlIGhvdmVyaW5nIGJlaGF2aW9yIGRlcGVuZGluZyBvbiB0aGUgcHJlZmVyZW5jZXMuCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUhvdmVyQmVoYXZpb3IoKSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJU3RyaW5nW10gdHlwZXMgPSBjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoZ2V0U291cmNlVmlld2VyKCkpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQotCQkJU3RyaW5nIHQgPSB0eXBlc1tpXTsKLQotCQkJSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIgPSBnZXRTb3VyY2VWaWV3ZXIoKTsKLQkJCWlmIChzb3VyY2VWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjIpIHsKLQkJCQkvLyBSZW1vdmUgZXhpc3RpbmcgaG92ZXJzCi0JCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbjIpIHNvdXJjZVZpZXdlcikucmVtb3ZlVGV4dEhvdmVycyh0KTsKLQotCQkJCWludFtdIHN0YXRlTWFza3MgPSBjb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRUZXh0SG92ZXJTdGF0ZU1hc2tzKGdldFNvdXJjZVZpZXdlcigpLCB0KTsKLQotCQkJCWlmIChzdGF0ZU1hc2tzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzdGF0ZU1hc2tzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlpbnQgc3RhdGVNYXNrID0gc3RhdGVNYXNrc1tqXTsKLQkJCQkJCUlUZXh0SG92ZXIgdGV4dEhvdmVyID0gY29uZmlndXJhdGlvbi5nZXRUZXh0SG92ZXIoc291cmNlVmlld2VyLCB0LCBzdGF0ZU1hc2spOwotCQkJCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbjIpIHNvdXJjZVZpZXdlcikuc2V0VGV4dEhvdmVyKHRleHRIb3ZlciwgdCwgc3RhdGVNYXNrKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVRleHRIb3ZlciB0ZXh0SG92ZXIgPSBjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIHQpOwotCQkJCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgc291cmNlVmlld2VyKS5zZXRUZXh0SG92ZXIodGV4dEhvdmVyLCB0LCBJVGV4dFZpZXdlckV4dGVuc2lvbjIuREVGQVVMVF9IT1ZFUl9TVEFURV9NQVNLKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJc291cmNlVmlld2VyLnNldFRleHRIb3Zlcihjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIHQpLCB0KTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVNZW51VGV4dCgpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiAhZlN0cnVjdHVyZWRNb2RlbC5pc01vZGVsU3RhdGVDaGFuZ2luZygpICYmIGdldFRleHRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkgIT0gbnVsbCkgewotCQkJLy8gcGVyZm9ybWFuY2U6IGRvbid0IGZvcmNlIGFuIHVwZGF0ZSBvZiB0aGUgYWN0aW9uIGJhcnMgdW5sZXNzCi0JCQkvLyByZXF1aXJlZCBhcyBpdCBpcyBleHBlbnNpdmUKLQkJCVN0cmluZyBwcmV2aW91c1VuZG9UZXh0ID0gbnVsbDsKLQkJCVN0cmluZyBwcmV2aW91c1VuZG9EZXNjID0gbnVsbDsKLQkJCVN0cmluZyBwcmV2aW91c1JlZG9UZXh0ID0gbnVsbDsKLQkJCVN0cmluZyBwcmV2aW91c1JlZG9EZXNjID0gbnVsbDsKLQkJCWJvb2xlYW4gdXBkYXRlQWN0aW9ucyA9IGZhbHNlOwotCQkJSUFjdGlvbiB1bmRvQWN0aW9uID0gZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8pOwotCQkJSUFjdGlvbiByZWRvQWN0aW9uID0gZ2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8pOwotCQkJaWYgKHVuZG9BY3Rpb24gIT0gbnVsbCkgewotCQkJCXByZXZpb3VzVW5kb1RleHQgPSB1bmRvQWN0aW9uLmdldFRleHQoKTsKLQkJCQlwcmV2aW91c1VuZG9EZXNjID0gdW5kb0FjdGlvbi5nZXREZXNjcmlwdGlvbigpOwotCQkJCXVwZGF0ZUFjdGlvbnMgPSB1cGRhdGVBY3Rpb25zIHx8IHByZXZpb3VzVW5kb1RleHQgPT0gbnVsbCB8fCBwcmV2aW91c1VuZG9EZXNjID09IG51bGw7Ci0JCQkJdW5kb0FjdGlvbi5zZXRUZXh0KFVORE9fQUNUSU9OX1RFWFRfREVGQVVMVCk7Ci0JCQkJdW5kb0FjdGlvbi5zZXREZXNjcmlwdGlvbihVTkRPX0FDVElPTl9ERVNDX0RFRkFVTFQpOwotCQkJfQotCQkJaWYgKHJlZG9BY3Rpb24gIT0gbnVsbCkgewotCQkJCXByZXZpb3VzUmVkb1RleHQgPSByZWRvQWN0aW9uLmdldFRleHQoKTsKLQkJCQlwcmV2aW91c1JlZG9EZXNjID0gcmVkb0FjdGlvbi5nZXREZXNjcmlwdGlvbigpOwotCQkJCXVwZGF0ZUFjdGlvbnMgPSB1cGRhdGVBY3Rpb25zIHx8IHByZXZpb3VzUmVkb1RleHQgPT0gbnVsbCB8fCBwcmV2aW91c1JlZG9EZXNjID09IG51bGw7Ci0JCQkJcmVkb0FjdGlvbi5zZXRUZXh0KFJFRE9fQUNUSU9OX1RFWFRfREVGQVVMVCk7Ci0JCQkJcmVkb0FjdGlvbi5zZXREZXNjcmlwdGlvbihSRURPX0FDVElPTl9ERVNDX0RFRkFVTFQpOwotCQkJfQotCQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwuZ2V0VW5kb01hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIgdW5kb01hbmFnZXIgPSBmU3RydWN0dXJlZE1vZGVsLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQkJLy8gZ2V0IHVuZG8gY29tbWFuZAotCQkJCUNvbW1hbmQgdW5kb0NvbW1hbmQgPSB1bmRvTWFuYWdlci5nZXRVbmRvQ29tbWFuZCgpOwotCQkJCS8vIHNldCB1bmRvIGxhYmVsIGFuZCBkZXNjcmlwdGlvbgotCQkJCXVuZG9BY3Rpb24uc2V0RW5hYmxlZCh1bmRvTWFuYWdlci51bmRvYWJsZSgpKTsKLQkJCQlpZiAodW5kb0NvbW1hbmQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgbGFiZWwgPSB1bmRvQ29tbWFuZC5nZXRMYWJlbCgpOwotCQkJCQlpZiAobGFiZWwgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGN1c3RvbVRleHQgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChVTkRPX0FDVElPTl9URVhULCBuZXcgU3RyaW5nW117bGFiZWx9KTsKLQkJCQkJCXVwZGF0ZUFjdGlvbnMgPSB1cGRhdGVBY3Rpb25zIHx8IGN1c3RvbVRleHQgPT0gbnVsbCB8fCBwcmV2aW91c1VuZG9UZXh0ID09IG51bGwgfHwgIWN1c3RvbVRleHQuZXF1YWxzKHByZXZpb3VzVW5kb1RleHQpOwotCQkJCQkJdW5kb0FjdGlvbi5zZXRUZXh0KGN1c3RvbVRleHQpOwotCQkJCQl9Ci0JCQkJCVN0cmluZyBkZXNjID0gdW5kb0NvbW1hbmQuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGN1c3RvbURlc2MgPSBNZXNzYWdlRm9ybWF0LmZvcm1hdChVTkRPX0FDVElPTl9ERVNDLCBuZXcgU3RyaW5nW117ZGVzY30pOwotCQkJCQkJdXBkYXRlQWN0aW9ucyA9IHVwZGF0ZUFjdGlvbnMgfHwgY3VzdG9tRGVzYyA9PSBudWxsIHx8IHByZXZpb3VzUmVkb0Rlc2MgPT0gbnVsbCB8fCAhY3VzdG9tRGVzYy5lcXVhbHMocHJldmlvdXNVbmRvRGVzYyk7Ci0JCQkJCQl1bmRvQWN0aW9uLnNldERlc2NyaXB0aW9uKGN1c3RvbURlc2MpOwotCQkJCQl9Ci0JCQkJfQotCQkJCS8vIGdldCByZWRvIGNvbW1hbmQKLQkJCQlDb21tYW5kIHJlZG9Db21tYW5kID0gdW5kb01hbmFnZXIuZ2V0UmVkb0NvbW1hbmQoKTsKLQkJCQkvLyBzZXQgcmVkbyBsYWJlbCBhbmQgZGVzY3JpcHRpb24KLQkJCQlyZWRvQWN0aW9uLnNldEVuYWJsZWQodW5kb01hbmFnZXIucmVkb2FibGUoKSk7Ci0JCQkJaWYgKHJlZG9Db21tYW5kICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGxhYmVsID0gcmVkb0NvbW1hbmQuZ2V0TGFiZWwoKTsKLQkJCQkJaWYgKGxhYmVsICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBjdXN0b21UZXh0ID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVET19BQ1RJT05fVEVYVCwgbmV3IFN0cmluZ1tde2xhYmVsfSk7Ci0JCQkJCQl1cGRhdGVBY3Rpb25zID0gdXBkYXRlQWN0aW9ucyB8fCBjdXN0b21UZXh0ID09IG51bGwgfHwgcHJldmlvdXNSZWRvVGV4dCA9PSBudWxsIHx8ICFjdXN0b21UZXh0LmVxdWFscyhwcmV2aW91c1JlZG9UZXh0KTsKLQkJCQkJCXJlZG9BY3Rpb24uc2V0VGV4dChjdXN0b21UZXh0KTsKLQkJCQkJfQotCQkJCQlTdHJpbmcgZGVzYyA9IHJlZG9Db21tYW5kLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQkJCVN0cmluZyBjdXN0b21EZXNjID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQoUkVET19BQ1RJT05fREVTQywgbmV3IFN0cmluZ1tde2Rlc2N9KTsKLQkJCQkJCXVwZGF0ZUFjdGlvbnMgPSB1cGRhdGVBY3Rpb25zIHx8IGN1c3RvbURlc2MgPT0gbnVsbCB8fCBwcmV2aW91c1JlZG9EZXNjID09IG51bGwgfHwgIWN1c3RvbURlc2MuZXF1YWxzKHByZXZpb3VzUmVkb0Rlc2MpOwotCQkJCQkJcmVkb0FjdGlvbi5zZXREZXNjcmlwdGlvbihjdXN0b21EZXNjKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIHRlbGwgdGhlIGFjdGlvbiBiYXJzIHRvIHVwZGF0ZQotCQkJaWYgKHVwZGF0ZUFjdGlvbnMpIHsKLQkJCQlpZiAoZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKSAhPSBudWxsKSB7Ci0JCQkJCWdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkudXBkYXRlQWN0aW9uQmFycygpOwotCQkJCX0KLQkJCQllbHNlIGlmIChnZXRFZGl0b3JQYXJ0KCkgIT0gbnVsbCAmJiBnZXRFZGl0b3JQYXJ0KCkuZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhcnMoKSAhPSBudWxsKSB7Ci0JCQkJCWdldEVkaXRvclBhcnQoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFycygpLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQl2b2lkIHVwZGF0ZVJhbmdlSW5kaWNhdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlib29sZWFuIHJhbmdlVXBkYXRlZCA9IGZhbHNlOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24gJiYgISgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuaXNFbXB0eSgpKSB7Ci0JCQlPYmplY3RbXSBvYmplY3RzID0gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCk7Ci0JCQlpZiAob2JqZWN0cy5sZW5ndGggPiAwICYmIG9iamVjdHNbMF0gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJaW50IHN0YXJ0ID0gKChJbmRleGVkUmVnaW9uKSBvYmplY3RzWzBdKS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBlbmQgPSAoKEluZGV4ZWRSZWdpb24pIG9iamVjdHNbMF0pLmdldEVuZE9mZnNldCgpOwotCQkJCWlmIChvYmplY3RzLmxlbmd0aCA+IDEpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBvYmplY3RzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlzdGFydCA9IE1hdGgubWluKHN0YXJ0LCAoKEluZGV4ZWRSZWdpb24pIG9iamVjdHNbaV0pLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJCQkJZW5kID0gTWF0aC5tYXgoZW5kLCAoKEluZGV4ZWRSZWdpb24pIG9iamVjdHNbaV0pLmdldEVuZE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlnZXRTb3VyY2VWaWV3ZXIoKS5zZXRSYW5nZUluZGljYXRpb24oc3RhcnQsIGVuZCAtIHN0YXJ0LCBmYWxzZSk7Ci0JCQkJcmFuZ2VVcGRhdGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoIXJhbmdlVXBkYXRlZCkgewotCQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJZ2V0U291cmNlVmlld2VyKCkuc2V0UmFuZ2VJbmRpY2F0aW9uKCgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0T2Zmc2V0KCksICgoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0TGVuZ3RoKCksIGZhbHNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWdldFNvdXJjZVZpZXdlcigpLnJlbW92ZVJhbmdlSW5kaWNhdGlvbigpOwotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBlZGl0b3IgdmVydGljYWwgcnVsZXIgbWVudSBieSBjcmVhdGluZyBhIG5ldyB2ZXJ0aWNhbCBydWxlcgotCSAqIGNvbnRleHQgbWVudSB3aXRoIHRoZSBnaXZlbiBtZW51IGlkCi0JICogCi0JICogQHBhcmFtIHJ1bGVyTWVudUlkCi0JICogICAgICAgICAgICBDYW5ub3QgYmUgbnVsbAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVSdWxlckNvbnRleHRNZW51SWQoU3RyaW5nIHJ1bGVyTWVudUlkKSB7Ci0JCS8vIHVwZGF0ZSBydWxlciBjb250ZXh0IG1lbnUgaWQgaWYgdXBkYXRpbmcgdG8gYSBuZXcgaWQgb3IgaWYgY29udGV4dAotCQkvLyBtZW51IGlzIG5vdCBhbHJlYWR5IHNldCB1cAotCQlpZiAoIXJ1bGVyTWVudUlkLmVxdWFscyhnZXRSdWxlckNvbnRleHRNZW51SWQoKSkgfHwgKGZSdWxlckNvbnRleHRNZW51ID09IG51bGwpKSB7Ci0JCQlzZXRSdWxlckNvbnRleHRNZW51SWQocnVsZXJNZW51SWQpOwotCi0JCQlpZiAoZ2V0VmVydGljYWxSdWxlcigpICE9IG51bGwpIHsKLQkJCQkvLyBkaXNwb3NlIG9mIHByZXZpb3VzIHJ1bGVyIGNvbnRleHQgbWVudQotCQkJCWlmIChmUnVsZXJDb250ZXh0TWVudSAhPSBudWxsKSB7Ci0JCQkJCWZSdWxlckNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJCQl9Ci0JCQkJaWYgKGZSdWxlckNvbnRleHRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5yZW1vdmVNZW51TGlzdGVuZXIoZ2V0Q29udGV4dE1lbnVMaXN0ZW5lcigpKTsKLQkJCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJCQlmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIuZGlzcG9zZSgpOwotCQkJCX0KLQotCQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlciA9IG5ldyBNZW51TWFuYWdlcihnZXRSdWxlckNvbnRleHRNZW51SWQoKSwgZ2V0UnVsZXJDb250ZXh0TWVudUlkKCkpOwotCQkJCWZSdWxlckNvbnRleHRNZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCQkJZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihnZXRDb250ZXh0TWVudUxpc3RlbmVyKCkpOwotCi0JCQkJQ29udHJvbCBydWxlckNvbnRyb2wgPSBnZXRWZXJ0aWNhbFJ1bGVyKCkuZ2V0Q29udHJvbCgpOwotCQkJCWZSdWxlckNvbnRleHRNZW51ID0gZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KHJ1bGVyQ29udHJvbCk7Ci0JCQkJcnVsZXJDb250cm9sLnNldE1lbnUoZlJ1bGVyQ29udGV4dE1lbnUpOwotCi0JCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoZ2V0UnVsZXJDb250ZXh0TWVudUlkKCksIGZSdWxlckNvbnRleHRNZW51TWFuYWdlciwgZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSk7Ci0KLQkJCQkvLyBhbHNvIHJlZ2lzdGVyIHRoaXMgbWVudSBmb3Igc291cmNlIHBhZ2UgcGFydCBhbmQgc3RydWN0dXJlZAotCQkJCS8vIHRleHQgZWRpdG9yIGlkcwotCQkJCVN0cmluZyBwYXJ0SWQgPSBnZXRTaXRlKCkuZ2V0SWQoKTsKLQkJCQlpZiAocGFydElkICE9IG51bGwpIHsKLQkJCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUocGFydElkICsgUlVMRVJfQ09OVEVYVF9NRU5VX1NVRkZJWCwgZlJ1bGVyQ29udGV4dE1lbnVNYW5hZ2VyLCBnZXRTZWxlY3Rpb25Qcm92aWRlcigpKTsKLQkJCQl9Ci0JCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoUlVMRVJfQ09OVEVYVF9NRU5VX0lELCBmUnVsZXJDb250ZXh0TWVudU1hbmFnZXIsIGdldFNlbGVjdGlvblByb3ZpZGVyKCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGdldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJLy8gbm8gbmVlZCB0byB1cGRhdGUgc291cmNlIHZpZXdlciBjb25maWd1cmF0aW9uIGlmIG9uZSBkb2VzIG5vdCBleGlzdAotCQkvLyB5ZXQKLQkJaWYgKGNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIGRvIG5vdCBjb25maWd1cmUgc291cmNlIHZpZXdlciBjb25maWd1cmF0aW9uIHR3aWNlCi0JCWJvb2xlYW4gY29uZmlndXJlZCA9IGZhbHNlOwotCi0JCS8vIHN0cnVjdHVyZWR0ZXh0dmlld2VyIG9ubHkgd29ya3Mgd2l0aAotCQkvLyBzdHJ1Y3R1cmVkdGV4dHZpZXdlcmNvbmZpZ3VyYXRpb24KLQkJaWYgKCEoY29uZmlndXJhdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikpIHsKLQkJCUNvbmZpZ3VyYXRpb25BbmRUYXJnZXQgY2F0ID0gY3JlYXRlU291cmNlVmlld2VyQ29uZmlndXJhdGlvbigpOwotCQkJZlZpZXdlckNvbmZpZ3VyYXRpb25UYXJnZXRJZCA9IGNhdC5nZXRUYXJnZXRJZCgpOwotCQkJY29uZmlndXJhdGlvbiA9IGNhdC5nZXRDb25maWd1cmF0aW9uKCk7Ci0JCQlzZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKGNvbmZpZ3VyYXRpb24pOwotCQkJY29uZmlndXJlZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlDb25maWd1cmF0aW9uQW5kVGFyZ2V0IGNhdCA9IGNyZWF0ZVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oKTsKLQkJCVN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBuZXdWaWV3ZXJDb25maWd1cmF0aW9uID0gY2F0LmdldENvbmZpZ3VyYXRpb24oKTsKLQkJCWlmICghKGNhdC5nZXRUYXJnZXRJZCgpLmVxdWFscyhmVmlld2VyQ29uZmlndXJhdGlvblRhcmdldElkKSkpIHsKLQkJCQkvLyBkMjgyODk0IHVzZSBuZXdWaWV3ZXJDb25maWd1cmF0aW9uCi0JCQkJZlZpZXdlckNvbmZpZ3VyYXRpb25UYXJnZXRJZCA9IGNhdC5nZXRUYXJnZXRJZCgpOwotCQkJCWNvbmZpZ3VyYXRpb24gPSBuZXdWaWV3ZXJDb25maWd1cmF0aW9uOwotCQkJCXNldFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24oY29uZmlndXJhdGlvbik7Ci0JCQkJY29uZmlndXJlZCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZ2V0U291cmNlVmlld2VyKCkgIT0gbnVsbCkgewotCQkJLy8gbm90IHN1cmUgaWYgcmVhbGx5IG5lZWQgdG8gcmVjb25maWd1cmUgd2hlbiBpbnB1dCBjaGFuZ2VzCi0JCQkvLyAobWF5YmUgb25seSBuZWVkIHRvIHJlc2V0IHZpZXdlcmNvbmZpZydzIGRvY3VtZW50KQotCQkJaWYgKCFjb25maWd1cmVkKQotCQkJCWdldFNvdXJjZVZpZXdlcigpLmNvbmZpZ3VyZShjb25maWd1cmF0aW9uKTsKLQkJCUlBY3Rpb24gY29udGVudEFzc2lzdEFjdGlvbiA9IGdldEFjdGlvbihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUyk7Ci0JCQlpZiAoY29udGVudEFzc2lzdEFjdGlvbiBpbnN0YW5jZW9mIElVcGRhdGUpIHsKLQkJCQkoKElVcGRhdGUpIGNvbnRlbnRBc3Npc3RBY3Rpb24pLnVwZGF0ZSgpOwotCQkJfQotCQkJSUFjdGlvbiBvcGVuSHlwZXJsaW5rQWN0aW9uID0gZ2V0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX09QRU5fRklMRSk7Ci0JCQlpZiAob3Blbkh5cGVybGlua0FjdGlvbiBpbnN0YW5jZW9mIE9wZW5IeXBlcmxpbmtBY3Rpb24pIHsKLQkJCQkoKE9wZW5IeXBlcmxpbmtBY3Rpb24pIG9wZW5IeXBlcmxpbmtBY3Rpb24pLnNldEh5cGVybGlua0RldGVjdG9ycyhnZXRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uKCkuZ2V0SHlwZXJsaW5rRGV0ZWN0b3JzKGdldFNvdXJjZVZpZXdlcigpKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTdGF0dXNGaWVsZChTdHJpbmcgY2F0ZWdvcnkpIHsKLQkJc3VwZXIudXBkYXRlU3RhdHVzRmllbGQoY2F0ZWdvcnkpOwotCi0JCWlmIChjYXRlZ29yeSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmIChTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TVEFUVVNfQ0FURUdPUllfT0ZGU0VULmVxdWFscyhjYXRlZ29yeSkpIHsKLQkJCUlTdGF0dXNGaWVsZCBmaWVsZCA9IGdldFN0YXR1c0ZpZWxkKGNhdGVnb3J5KTsKLQkJCWlmIChmaWVsZCAhPSBudWxsKSB7Ci0JCQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQlpbnQgb2Zmc2V0MSA9IHdpZGdldE9mZnNldDJNb2RlbE9mZnNldChnZXRTb3VyY2VWaWV3ZXIoKSwgc2VsZWN0aW9uLngpOwotCQkJCWludCBvZmZzZXQyID0gd2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KGdldFNvdXJjZVZpZXdlcigpLCBzZWxlY3Rpb24ueSk7Ci0JCQkJU3RyaW5nIHRleHQgPSBudWxsOwotCQkJCWlmIChvZmZzZXQxICE9IG9mZnNldDIpCi0JCQkJCXRleHQgPSAiWyIgKyBvZmZzZXQxICsgIi0iICsgb2Zmc2V0MiArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQllbHNlCi0JCQkJCXRleHQgPSAiWyAiICsgb2Zmc2V0MSArICIgXSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCWZpZWxkLnNldFRleHQodGV4dCA9PSBudWxsID8gZkVycm9yTGFiZWwgOiB0ZXh0KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNhMjYxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5JQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JbmZvcm1hdGlvblByZXNlbnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnByZXNlbnRhdGlvbi5JUHJlc2VudGF0aW9uUmVjb25jaWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Ib3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dFNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5DaGFpbmVkUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkLkhUTUxUZXh0UHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuaHlwZXJsaW5rLkhpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMuQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mby5CZXN0TWF0Y2hIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uVGV4dEhvdmVyTWFuYWdlcjsKLQotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBzb3VyY2Ugdmlld2VyIHVzZWQgYnkgU3RydWN0dXJlZFRleHRFZGl0b3IuPGJyIC8+Ci0gKiBOb3RlOiBXaGlsZSBJU291cmNlVmlld2VyIGlzIHBhc3NlZCBpbiBmb3IgZWFjaCBnZXQgY29uZmlndXJhdGlvbiwgY2xpZW50cwotICogc2hvdWxkIGNyZWF0ZSBhIG5ldyB2aWV3ZXIgY29uZmlndXJhdGlvbiBpbnN0YW5jZSBmb3IgZWFjaCBpbnN0YW5jZSBvZgotICogc291cmNlIHZpZXdlciBhcyBzb21lIG1ldGhvZHMgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIG9mIGFuIG9iamVjdCwKLSAqIHJlZ2FyZGxlc3Mgb2YgdGhlIHNvdXJjZXZpZXdlci4KLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlCi0gKiBzcGVjaWZpYyB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXIKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIFRleHRTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIGNyZWF0aW5nIGEgc2Vjb25kIGFzc2lzdGFudCB0aGF0Ci0JICogaXMgYWRkZWQgdG8gYSB2aWV3ZXIgY2FuIGNhdXNlIG9kZCBrZXktZWF0aW5nIGJ5IHRoZSB3cm9uZyBvbmUuCi0JICovCi0JcHJpdmF0ZSBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudCBmQ29udGVudEFzc2lzdGFudCA9IG51bGw7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIElSZWNvbmNpbGVyIGZSZWNvbmNpbGVyOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3RydWN0dXJlZCB0ZXh0IHZpZXdlciBjb25maWd1cmF0aW9uLgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JCS8vIGluaXRpYWxpemUgZlByZWZlcmVuY2VTdG9yZSB3aXRoIHNhbWUgcHJlZmVyZW5jZSBzdG9yZSB1c2VkIGluCi0JCS8vIFN0cnVjdHVyZWRUZXh0RWRpdG9yCi0JCWZQcmVmZXJlbmNlU3RvcmUgPSBjcmVhdGVDb21iaW5lZFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIHByZWZlcmVuY2Ugc3RvcmUgdGhhdCBjb21iaW5lcyB0aGUgc291cmNlIGVkaXRvciBwcmVmZXJlbmNlcwotCSAqIHdpdGggdGhlIGJhc2UgZWRpdG9yJ3MgcHJlZmVyZW5jZXMuCi0JICogCi0JICogQHJldHVybiBJUHJlZmVyZW5jZVN0b3JlCi0JICovCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGNyZWF0ZUNvbWJpbmVkUHJlZmVyZW5jZVN0b3JlKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHNzZUVkaXRvclByZWZzID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlJUHJlZmVyZW5jZVN0b3JlIGJhc2VFZGl0b3JQcmVmcyA9IEVkaXRvcnNVSS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJcmV0dXJuIG5ldyBDaGFpbmVkUHJlZmVyZW5jZVN0b3JlKG5ldyBJUHJlZmVyZW5jZVN0b3JlW117c3NlRWRpdG9yUHJlZnMsIGJhc2VFZGl0b3JQcmVmc30pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFubm90YXRpb24gaG92ZXIgd2hpY2ggd2lsbCBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiB0byBiZQotCSAqIHNob3duIGluIGEgaG92ZXIgcG9wdXAgd2luZG93IHdoZW4gcmVxdWVzdGVkIGZvciB0aGUgZ2l2ZW4gc291cmNlCi0JICogdmlld2VyLjxiciAvPgotCSAqIE5vdGU6IENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGJlY2F1c2UgdGhpcyBtZXRob2QgcmV0dXJucyBhCi0JICogc3BlY2lhbGx5IGNvbmZpZ3VyZWQgQW5ub3RhdGlvbiBIb3ZlciBmb3IgdGhlIFN0cnVjdHVyZWRUZXh0Vmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhbiBhbm5vdGF0aW9uIGhvdmVyIHNwZWNpYWxseSBjb25maWd1cmVkIGZvcgotCSAqICAgICAgICAgU3RydWN0dXJlZFRleHRWaWV3ZXIKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSUFubm90YXRpb25Ib3ZlciBnZXRBbm5vdGF0aW9uSG92ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLyoKLQkJICogVGhpcyBpbXBsbWVudGF0aW9uIHJldHVybnMgYW4gYW5ub3RhdGlvbiBob3ZlciB0aGF0IHdvcmtzIHdpdGgKLQkJICogU3RydWN0dXJlZFRleHRWaWV3ZXIgYW5kIGJyZWFrcG9pbnRzLiBJbXBvcnRhbnQhIG11c3QgcmVtZW1iZXIgdG8KLQkJICogcmVsZWFzZSBpdCB3aGVuIGRvbmUgd2l0aCBpdCAoZHVyaW5nIHZpZXdlci51bmNvbmZpZ3VyZSkKLQkJICovCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIHBhcnRpdGlvbmluZyBmb3IgdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIuIFRoZQotCSAqIHBhcnRpdGlvbmluZyBpcyB1c2VkIHdoZW4gdGhlIHF1ZXJ5aW5nIGNvbnRlbnQgdHlwZXMgZnJvbSB0aGUgc291cmNlCi0JICogdmlld2VyJ3MgaW5wdXQgZG9jdW1lbnQuPGJyIC8+Ci0JICogTm90ZTogQ2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXQgdGhpcyB0aW1lLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgY29uZmlndXJlZCBwYXJ0aXRpb25pbmcKLQkgKiBAc2VlICNnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIpCi0JICovCi0JZmluYWwgcHVibGljIFN0cmluZyBnZXRDb25maWd1cmVkRG9jdW1lbnRQYXJ0aXRpb25pbmcoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLyoKLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGRlZmF1bHQgc3RydWN0dXJlZCB0ZXh0IHBhcnRpdGlvbmluZwotCQkgKi8KLQkJcmV0dXJuIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JfQotCi0JcHVibGljIGludFtdIGdldENvbmZpZ3VyZWRUZXh0SG92ZXJTdGF0ZU1hc2tzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQkJLyoKLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGNvbmZpZ3VyZWQgdGV4dCBob3ZlciBzdGF0ZSBtYXNrcyBmb3IKLQkJICogU3RydWN0dXJlZFRleHRWaWV3ZXJzCi0JCSAqLwotCQlUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3JbXSBob3ZlckRlc2NzID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5nZXRUZXh0SG92ZXJzKCk7Ci0JCWludCBzdGF0ZU1hc2tzW10gPSBuZXcgaW50W2hvdmVyRGVzY3MubGVuZ3RoXTsKLQkJaW50IHN0YXRlTWFza3NMZW5ndGggPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGhvdmVyRGVzY3MubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChob3ZlckRlc2NzW2ldLmlzRW5hYmxlZCgpKSB7Ci0JCQkJaW50IGogPSAwOwotCQkJCWludCBzdGF0ZU1hc2sgPSBjb21wdXRlU3RhdGVNYXNrKGhvdmVyRGVzY3NbaV0uZ2V0TW9kaWZpZXJTdHJpbmcoKSk7Ci0JCQkJd2hpbGUgKGogPCBzdGF0ZU1hc2tzTGVuZ3RoKSB7Ci0JCQkJCWlmIChzdGF0ZU1hc2tzW2pdID09IHN0YXRlTWFzaykKLQkJCQkJCWJyZWFrOwotCQkJCQlqKys7Ci0JCQkJfQotCQkJCWlmIChqID09IHN0YXRlTWFza3NMZW5ndGgpCi0JCQkJCXN0YXRlTWFza3Nbc3RhdGVNYXNrc0xlbmd0aCsrXSA9IHN0YXRlTWFzazsKLQkJCX0KLQkJfQotCQlpZiAoc3RhdGVNYXNrc0xlbmd0aCA9PSBob3ZlckRlc2NzLmxlbmd0aCkKLQkJCXJldHVybiBzdGF0ZU1hc2tzOwotCi0JCWludFtdIHNob3J0ZW5lZFN0YXRlTWFza3MgPSBuZXcgaW50W3N0YXRlTWFza3NMZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHN0YXRlTWFza3MsIDAsIHNob3J0ZW5lZFN0YXRlTWFza3MsIDAsIHN0YXRlTWFza3NMZW5ndGgpOwotCQlyZXR1cm4gc2hvcnRlbmVkU3RhdGVNYXNrczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IGFzc2lzdGFudCByZWFkeSB0byBiZSB1c2VkIHdpdGggdGhlIGdpdmVuIHNvdXJjZQotCSAqIHZpZXdlci48YnIgLz4KLQkgKiBOb3RlOiBUaGUgc2FtZSBpbnN0YW5jZSBvZiBJQ29udGVudEFzc2lzdGFudCBpcyByZXR1cm5lZCByZWdhcmRsZXNzIG9mCi0JICogdGhlIHNvdXJjZSB2aWV3ZXIgcGFzc2VkIGluLgotCSAqIDxwPgotCSAqIENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkLCBjbGllbnRzIHdhbnRpbmcgdG8gYWRkCi0JICogdGhlaXIgb3duIHByb2Nlc3NvcnMgc2hvdWxkIG92ZXJyaWRlCi0JICogPGNvZGU+Z2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcnMoSVNvdXJjZVZpZXdlciwgU3RyaW5nKTwvY29kZT4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29udGVudCBhc3Npc3RhbnQKLQkgKiBAc2VlICNnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyLCBTdHJpbmcpCi0JICovCi0JZmluYWwgcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvbnRlbnRBc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLyoKLQkJICogTm90ZTogVGhpcyBtZXRob2Qgd2FzIG1hZGUgZmluYWwgc28gdGhhdCBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdCBpcwotCQkgKiBhbHdheXMgdXNlZCBhbmQgY29udGVudCBhc3Npc3QgZXh0ZW5zaW9uIHBvaW50IGFsd2F5cyB3b3Jrcy4KLQkJICovCi0JCWlmIChmQ29udGVudEFzc2lzdGFudCA9PSBudWxsKSB7Ci0JCQlmQ29udGVudEFzc2lzdGFudCA9IG5ldyBTdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudCgpOwotCi0JCQkvLyBjb250ZW50IGFzc2lzdGFudCBjb25maWd1cmF0aW9ucwotCQkJZkNvbnRlbnRBc3Npc3RhbnQuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcikpOwotCQkJZkNvbnRlbnRBc3Npc3RhbnQuZW5hYmxlQXV0b0FjdGl2YXRpb24odHJ1ZSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5zZXRBdXRvQWN0aXZhdGlvbkRlbGF5KDUwMCk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5zZXRQcm9wb3NhbFBvcHVwT3JpZW50YXRpb24oSUNvbnRlbnRBc3Npc3RhbnQuUFJPUE9TQUxfT1ZFUkxBWSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5zZXRDb250ZXh0SW5mb3JtYXRpb25Qb3B1cE9yaWVudGF0aW9uKElDb250ZW50QXNzaXN0YW50LkNPTlRFWFRfSU5GT19BQk9WRSk7Ci0JCQlmQ29udGVudEFzc2lzdGFudC5zZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKGdldEluZm9ybWF0aW9uQ29udHJvbENyZWF0b3Ioc291cmNlVmlld2VyKSk7Ci0KLQkJCS8vIGFkZCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzIGZvciBlYWNoIHBhcnRpdGlvbiB0eXBlCi0JCQlTdHJpbmdbXSB0eXBlcyA9IGdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmcgdHlwZSA9IHR5cGVzW2ldOwotCi0JCQkJLy8gYWRkIGFsbCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzIGZvciBjdXJyZW50IHBhcnRpdG9uIHR5cGUKLQkJCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMgPSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhzb3VyY2VWaWV3ZXIsIHR5cGUpOwotCQkJCWlmIChwcm9jZXNzb3JzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaiA9IDA7IGogPCBwcm9jZXNzb3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCQlmQ29udGVudEFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKHByb2Nlc3NvcnNbal0sIHR5cGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmQ29udGVudEFzc2lzdGFudDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBjb250ZW50Ci0JICogYXNzaXN0IGluIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyIGFuZCBmb3IgdGhlIGdpdmVuIHBhcnRpdGlvbiB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBzb3VyY2Ugdmlld2VyIHRvIGJlIGNvbmZpZ3VyZWQgYnkgdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdHlwZSBmb3Igd2hpY2ggdGhlIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMKLQkgKiAgICAgICAgICAgIGFyZSBhcHBsaWNhYmxlCi0JICogQHJldHVybiBJQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgb3IgbnVsbCBpZiBzaG91bGQgbm90IGJlIHN1cHBvcnRlZAotCSAqLwotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIGdldENvbnRlbnRBc3Npc3RQcm9jZXNzb3JzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb250ZW50IGZvcm1hdHRlciByZWFkeSB0byBiZSB1c2VkIHdpdGggdGhlIGdpdmVuIHNvdXJjZQotCSAqIHZpZXdlci4KLQkgKiA8cD4KLQkgKiBJdCBpcyBub3QgcmVjb21tZW5kZWQgdGhhdCBjbGllbnRzIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIGl0IG1heQotCSAqIGJlY29tZSA8Y29kZT5maW5hbDwvY29kZT4gaW4gdGhlIGZ1dHVyZSBhbmQgcmVwbGFjZWQgYnkgYW4gZXh0ZW5zaWJsZQotCSAqIGZyYW1ld29yay4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGEgY29udGVudCBmb3JtYXR0ZXIgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZm9ybWF0dGluZyBzaG91bGQKLQkgKiAgICAgICAgIG5vdCBiZSBzdXBwb3J0ZWQKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoeXBlcmxpbmsgcHJlc2VudGVyIGZvciB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci48YnIgLz4KLQkgKiBOb3RlOiBDbGllbnRzIGNhbm5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBiZWNhdXNlIHRoaXMgbWV0aG9kIHJldHVybnMgYQotCSAqIHNwZWNpYWxseSBjb25maWd1cmVkIGh5cGVybGluayBwcmVzZW50ZXIgZm9yIHRoZSBTdHJ1Y3R1cmVkVGV4dFZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBoeXBlcmxpbmsgcHJlc2VudGVyIHNwZWNpYWxseSBjb25maWd1cmVkIGZvcgotCSAqICAgICAgICAgU3RydWN0dXJlZFRleHRWaWV3ZXIKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSUh5cGVybGlua1ByZXNlbnRlciBnZXRIeXBlcmxpbmtQcmVzZW50ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJLyoKLQkJICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgaHlwZXJsaW5rIHByZXNlbnRlciB0aGF0IHVzZXMKLQkJICogSGlnaGxpdGhlciBpbnN0ZWFkIG9mIFByZXNlbnRhdGlvblJlY29uY2lsZXIKLQkJICovCi0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpIHsKLQkJCXJldHVybiBzdXBlci5nZXRIeXBlcmxpbmtQcmVzZW50ZXIoc291cmNlVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gbmV3IEhpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyKGZQcmVmZXJlbmNlU3RvcmUpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgY3JlYXRvci4gVGhlIGNyZWF0b3IgaXMgYSBmYWN0b3J5Ci0JICogY3JlYXRpbmcgaW5mb3JtYXRpb24gY29udHJvbHMgZm9yIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLjxiciAvPgotCSAqIE5vdGU6IENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGF0IHRoaXMgdGltZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIGluZm9ybWF0aW9uIGNvbnRyb2wgY3JlYXRvcgotCSAqLwotCWZpbmFsIHB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCS8vIHVzZWQgYnkgaG92ZXIgaGVscAotCQlyZXR1cm4gbmV3IElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yKCkgewotCQkJcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2wgY3JlYXRlSW5mb3JtYXRpb25Db250cm9sKFNoZWxsIHBhcmVudCkgewotCQkJCXJldHVybiBuZXcgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQsIFNXVC5OT05FLCBuZXcgSFRNTFRleHRQcmVzZW50ZXIodHJ1ZSkpOwotCQkJfQotCQl9OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGluZm9ybWF0aW9uIHByZXNlbnRlciByZWFkeSB0byBiZSB1c2VkIHdpdGggdGhlIGdpdmVuCi0JICogc291cmNlIHZpZXdlci4KLQkgKiA8cD4KLQkgKiBDbGllbnRzIGNhbm5vdCBvdmVycmlkZSB0aGlzIG1ldGhvZC4gSW5zdGVhZCwgY2xpZW50cyB3YW50aW5nIHRvIGFkZAotCSAqIHRoZWlyIG93biBpbmZvcm1hdGlvbiBwcm92aWRlcnMgc2hvdWxkIG92ZXJyaWRlCi0JICogPGNvZGU+Z2V0SW5mb3JtYXRpb25Qcm92aWRlcihJU291cmNlVmlld2VyLCBTdHJpbmcpPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBjb250ZW50IGFzc2lzdGFudAotCSAqIEBzZWUgI2dldEluZm9ybWF0aW9uUHJvdmlkZXIoSVNvdXJjZVZpZXdlciwgU3RyaW5nKQotCSAqLwotCWZpbmFsIHB1YmxpYyBJSW5mb3JtYXRpb25QcmVzZW50ZXIgZ2V0SW5mb3JtYXRpb25QcmVzZW50ZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJSW5mb3JtYXRpb25QcmVzZW50ZXIgcHJlc2VudGVyID0gbmV3IEluZm9ybWF0aW9uUHJlc2VudGVyKGdldEluZm9ybWF0aW9uUHJlc2VudGVyQ29udHJvbENyZWF0b3Ioc291cmNlVmlld2VyKSk7Ci0KLQkJLy8gaW5mb3JtYXRpb24gcHJlc2VudGVyIGNvbmZpZ3VyYXRpb25zCi0JCXByZXNlbnRlci5zZXRTaXplQ29uc3RyYWludHMoNjAsIDEwLCB0cnVlLCB0cnVlKTsKLQkJcHJlc2VudGVyLnNldERvY3VtZW50UGFydGl0aW9uaW5nKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpKTsKLQotCQkvLyBhZGQgaW5mb3JtYXRpb24gcHJvdmlkZXJzIGZvciBlYWNoIHBhcnRpdGlvbiB0eXBlCi0JCVN0cmluZ1tdIHR5cGVzID0gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhzb3VyY2VWaWV3ZXIpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgdHlwZSA9IHR5cGVzW2ldOwotCi0JCQlJSW5mb3JtYXRpb25Qcm92aWRlciBwcm92aWRlciA9IGdldEluZm9ybWF0aW9uUHJvdmlkZXIoc291cmNlVmlld2VyLCB0eXBlKTsKLQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJcHJlc2VudGVyLnNldEluZm9ybWF0aW9uUHJvdmlkZXIocHJvdmlkZXIsIHR5cGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHByZXNlbnRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlciB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgaW5mb3JtYXRpb24KLQkgKiBwcmVzZW50YXRpb24gaW4gdGhlIGdpdmVuIHNvdXJjZSB2aWV3ZXIgYW5kIGZvciB0aGUgZ2l2ZW4gcGFydGl0aW9uCi0JICogdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUgZm9yIHdoaWNoIHRoZSBpbmZvcm1hdGlvbiBwcm92aWRlciBpcwotCSAqICAgICAgICAgICAgYXBwbGljYWJsZQotCSAqIEByZXR1cm4gSUluZm9ybWF0aW9uUHJvdmlkZXIgb3IgbnVsbCBpZiBzaG91bGQgbm90IGJlIHN1cHBvcnRlZAotCSAqLwotCXByb3RlY3RlZCBJSW5mb3JtYXRpb25Qcm92aWRlciBnZXRJbmZvcm1hdGlvblByb3ZpZGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgY29udHJvbCBjcmVhdG9yLiBUaGUgY3JlYXRvciBpcyBhCi0JICogZmFjdG9yeSBjcmVhdGluZyB0aGUgcHJlc2VudGVyIGNvbnRyb2xzIGZvciB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yCi0JICovCi0JcHJpdmF0ZSBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRJbmZvcm1hdGlvblByZXNlbnRlckNvbnRyb2xDcmVhdG9yKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJaW50IHNoZWxsU3R5bGUgPSBTV1QuUkVTSVpFIHwgU1dULlRPT0w7Ci0JCQkJaW50IHN0eWxlID0gU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMOwotCQkJCXJldHVybiBuZXcgRGVmYXVsdEluZm9ybWF0aW9uQ29udHJvbChwYXJlbnQsIHNoZWxsU3R5bGUsIHN0eWxlLCBuZXcgSFRNTFRleHRQcmVzZW50ZXIoZmFsc2UpKTsKLQkJCX0KLQkJfTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaW5lIHN0eWxlIHByb3ZpZGVycyB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igc3ludGF4Ci0JICogaGlnaGxpZ2h0aW5nIGluIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLgotCSAqIDxwPgotCSAqIE5vdCBmdWxseSBBUEkgc2luY2UgcmV0dXJuIHR5cGUgTGluZVN0eWxlUHJvdmlkZXIgaXMgbm90IEFQSS4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqICAgICAgICAgICAgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB3aGljaCB0aGUgbGluZVN0eWxlUHJvdmlkZXJzIGFyZQotCSAqICAgICAgICAgICAgYXBwbGljYWJsZQotCSAqIEByZXR1cm4gTGluZVN0eWxlUHJvdmRlcnMgb3IgbnVsbCBpZiBzaG91bGQgbm90IGJlIHN1cHBvcnRlZAotCSAqLwotCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRWaWV3ZXIgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgcHJlc2VudGF0aW9uCi0JICogcmVjb25jaWxlciwgc28gY2xpZW50cyBjYW5ub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSB0aGVpciBvd24KLQkgKiBwcmVzZW50YXRpb24gcmVjb25jaWxlci4gPGJyIC8+Ci0JICogU2VlIDxjb2RlPmdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyLCBTdHJpbmcpPC9jb2RlPiBmb3IKLQkgKiBhbHRlcm5hdGl2ZSB3YXkgdG8gcHJvdmlkZSBoaWdobGlnaHRpbmcgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFsd2F5cyByZXR1cm5zIG51bGwKLQkgKiBAc2VlICNnZXRMaW5lU3R5bGVQcm92aWRlcnMoSVNvdXJjZVZpZXdlciwgU3RyaW5nKQotCSAqLwotCWZpbmFsIHB1YmxpYyBJUHJlc2VudGF0aW9uUmVjb25jaWxlciBnZXRQcmVzZW50YXRpb25SZWNvbmNpbGVyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCS8qCi0JCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBudWxsIGJlY2F1c2UgU3RydWN0dXJlZFRleHRWaWV3ZXIgZG9lcwotCQkgKiBub3QgdXNlIHByZXNlbnRhdGlvbiByZWNvbmNpbGVyCi0JCSAqLwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWNvbmNpbGVyIHJlYWR5IHRvIGJlIHVzZWQgd2l0aCB0aGUgZ2l2ZW4gc291cmNlIHZpZXdlci48YnIgLz4KLQkgKiBOb3RlOiBUaGUgc2FtZSBpbnN0YW5jZSBvZiBJUmVjb25jaWxlciBpcyByZXR1cm5lZCByZWdhcmRsZXNzIG9mIHRoZQotCSAqIHNvdXJjZSB2aWV3ZXIgcGFzc2VkIGluLgotCSAqIDxwPgotCSAqIENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kLiBJbnN0ZWFkLCBjbGllbnRzIHdhbnRpbmcgdG8gYWRkCi0JICogdGhlaXIgb3duIHJlY29uY2lsaW5nIHN0cmF0ZWd5IHNob3VsZCB1c2UgdGhlCi0JICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLnNvdXJjZXZhbGlkYXRpb248L2NvZGU+Ci0JICogZXh0ZW5zaW9uIHBvaW50LgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc291cmNlVmlld2VyCi0JICogICAgICAgICAgICB0aGUgc291cmNlIHZpZXdlciB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSByZWNvbmNpbGVyCi0JICovCi0JZmluYWwgcHVibGljIElSZWNvbmNpbGVyIGdldFJlY29uY2lsZXIoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJYm9vbGVhbiByZWNvbmNpbGluZ0VuYWJsZWQgPSBmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUyk7Ci0JCWlmIChzb3VyY2VWaWV3ZXIgPT0gbnVsbCB8fCAhcmVjb25jaWxpbmdFbmFibGVkKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLyoKLQkJICogT25seSBjcmVhdGUgcmVjb25jaWxlciBpZiBzb3VyY2V2aWV3ZXIgaXMgcHJlc2VudAotCQkgKi8KLQkJaWYgKGZSZWNvbmNpbGVyID09IG51bGwgJiYgc291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IgcmVjb25jaWxlciA9IG5ldyBTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yKCk7Ci0KLQkJCS8vIHJlY29uY2lsZXIgY29uZmlndXJhdGlvbnMKLQkJCXJlY29uY2lsZXIuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHNvdXJjZVZpZXdlcikpOwotCi0JCQlmUmVjb25jaWxlciA9IHJlY29uY2lsZXI7Ci0JCX0KLQkJcmV0dXJuIGZSZWNvbmNpbGVyOwotCX0KLQotCXB1YmxpYyBJVGV4dEhvdmVyIGdldFRleHRIb3ZlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlLCBpbnQgc3RhdGVNYXNrKSB7Ci0JCUlUZXh0SG92ZXIgdGV4dEhvdmVyID0gbnVsbDsKLQotCQkvKgotCQkgKiBSZXR1cm5zIGEgZGVmYXVsdCBwcm9ibGVtLCBhbm5vdGF0aW9uLCBhbmQgYmVzdCBtYXRjaCBob3ZlcgotCQkgKiBkZXBlbmRpbmcgb24gc3RhdGVNYXNrCi0JCSAqLwotCQlUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3JbXSBob3ZlckRlc2NzID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKS5nZXRUZXh0SG92ZXJzKCk7Ci0JCWludCBpID0gMDsKLQkJd2hpbGUgKGkgPCBob3ZlckRlc2NzLmxlbmd0aCAmJiB0ZXh0SG92ZXIgPT0gbnVsbCkgewotCQkJaWYgKGhvdmVyRGVzY3NbaV0uaXNFbmFibGVkKCkgJiYgY29tcHV0ZVN0YXRlTWFzayhob3ZlckRlc2NzW2ldLmdldE1vZGlmaWVyU3RyaW5nKCkpID09IHN0YXRlTWFzaykgewotCQkJCVN0cmluZyBob3ZlclR5cGUgPSBob3ZlckRlc2NzW2ldLmdldElkKCk7Ci0JCQkJaWYgKFRleHRIb3Zlck1hbmFnZXIuUFJPQkxFTV9IT1ZFUi5lcXVhbHNJZ25vcmVDYXNlKGhvdmVyVHlwZSkpCi0JCQkJCXRleHRIb3ZlciA9IG5ldyBQcm9ibGVtQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yKCk7Ci0JCQkJZWxzZSBpZiAoVGV4dEhvdmVyTWFuYWdlci5BTk5PVEFUSU9OX0hPVkVSLmVxdWFsc0lnbm9yZUNhc2UoaG92ZXJUeXBlKSkKLQkJCQkJdGV4dEhvdmVyID0gbmV3IEFubm90YXRpb25Ib3ZlclByb2Nlc3NvcigpOwotCQkJCWVsc2UgaWYgKFRleHRIb3Zlck1hbmFnZXIuQ09NQklOQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKQotCQkJCQl0ZXh0SG92ZXIgPSBuZXcgQmVzdE1hdGNoSG92ZXIobnVsbCk7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIHRleHRIb3ZlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB1bmRvIG1hbmFnZXIgZm9yIHRoZSBnaXZlbiBzb3VyY2Ugdmlld2VyLjxiciAvPgotCSAqIE5vdGU6IENsaWVudHMgY2Fubm90IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGJlY2F1c2UgdGhpcyBtZXRob2QgcmV0dXJucyBhCi0JICogc3BlY2lhbGx5IGNvbmZpZ3VyZWQgdW5kbyBtYW5hZ2VyIGZvciB0aGUgU3RydWN0dXJlZFRleHRWaWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHNvdXJjZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHNvdXJjZSB2aWV3ZXIgdG8gYmUgY29uZmlndXJlZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFuIHVuZG8gbWFuYWdlciBzcGVjaWFsbHkgY29uZmlndXJlZCBmb3IgU3RydWN0dXJlZFRleHRWaWV3ZXIKLQkgKi8KLQlmaW5hbCBwdWJsaWMgSVVuZG9NYW5hZ2VyIGdldFVuZG9NYW5hZ2VyKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCS8qCi0JCSAqIFRoaXMgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhbiBVbmRvTWFuYWdlciB0aGF0IGlzIHVzZWQgZXhjbHVzaXZlbHkKLQkJICogaW4gU3RydWN0dXJlZFRleHRWaWV3ZXIKLQkJICovCi0JCXJldHVybiBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJVbmRvTWFuYWdlcigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlclVuZG9NYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJVbmRvTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzc5N2M1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9TdHJ1Y3R1cmVkVGV4dFZpZXdlclVuZG9NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci0KLQotLyoqCi0gKiBVbmRvIG1hbmFnZXIgZXhjbHVzaXZlbHkgZm9yIFN0cnVjdHVyZWRUZXh0Vmlld2VycyBPTkxZLiBUaGlzIHVuZG8gbWFuYWdlcgotICogaXMgYXdhcmUgdGhhdCBzdHJ1Y3R1cmVkIGRvY3VtZW50cyBoYXZlIHRoZWlyIG93biB1bmRvIG1hbmFnZXIuIFRoaXMKLSAqIGhhbmRsZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIElVbmRvTWFuYWdlciBhbmQgSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXIuCi0gKi8KLWNsYXNzIFN0cnVjdHVyZWRUZXh0Vmlld2VyVW5kb01hbmFnZXIgaW1wbGVtZW50cyBJVW5kb01hbmFnZXIgewotCWNsYXNzIFVuZG9Ob3RpZmllciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJaWYgKChmVW5kb01hbmFnZXIgIT0gbnVsbCkgJiYgKGV2ZW50ICE9IG51bGwpKSB7Ci0JCQkJaWYgKGV2ZW50LmdldFNlbGVjdGlvbigpIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJZlVuZG9NYW5hZ2VyLmZvcmNlRW5kT2ZQZW5kaW5nQ29tbWFuZCh0aGlzLCAoKElUZXh0U2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0T2Zmc2V0KCksICgoSVRleHRTZWxlY3Rpb24pIGV2ZW50LmdldFNlbGVjdGlvbigpKS5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRUZXh0Vmlld2VyIGZUZXh0Vmlld2VyID0gbnVsbDsKLQlwcml2YXRlIElTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIGZVbmRvTWFuYWdlciA9IG51bGw7Ci0JcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGZVbmRvTm90aWZpZXIgPSBuZXcgVW5kb05vdGlmaWVyKCk7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI2JlZ2luQ29tcG91bmRDaGFuZ2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ29tcG91bmRDaGFuZ2UoKSB7Ci0JCS8vIGZvcndhcmQgdGhlIHJlcXVlc3QgdG8gdGhlIG1vZGVsLWJhc2VkIHVuZG8gbWFuYWdlcgotCQlpZiAoZlVuZG9NYW5hZ2VyICE9IG51bGwpCi0JCQlmVW5kb01hbmFnZXIuYmVnaW5SZWNvcmRpbmcoZlRleHRWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIEFzc29jaWF0ZXMgYSB2aWV3ZXIgdG8gdGhpcyB1bmRvIG1hbmFnZXIgYW5kIGFsc28gYXR0ZW1wdHMgdG8gZ2V0IHRoZQotCSAqIGNvcnJlY3QgZG9jdW1lbnQtc3BlY2lmaWMgdW5kbyBtYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIgLQotCSAqICAgICAgICAgICAgQXNzdW1lcyB2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcgotCSAqLwotCXB1YmxpYyB2b2lkIGNvbm5lY3QoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGZ1dHVyZV9UT0RPIGNvdWxkIHByb2JhYmx5IG9wdGltaXplIHRoaXMgdG8gY2hlY2sgaWYgYWxyZWFkeQotCQkvLyBjb25uZWN0ZWQgdG8gc2FtZSB2aWV3ZXIvdW5kbyBtYW5hZ2VyLCBkb250IGRvIGFueXRoaW5nCi0KLQkJLy8gZGlzY29ubmVjdCBmcm9tIGFueSBvbGQgbWFuYWdlci92aWV3ZXIKLQkJZGlzY29ubmVjdCgpOwotCi0JCS8vIGNvbm5lY3QgdG8gbmV3IHZpZXdlci91bmRvIG1hbmFnZXIKLQkJZlRleHRWaWV3ZXIgPSAoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlcjsKLQkJSURvY3VtZW50IGRvYyA9IGZUZXh0Vmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2M7Ci0JCQlzZXREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlciNkaXNjb25uZWN0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCQkvLyBkaXNjb25uZWN0IHRoZSB2aWV3ZXIgZnJvbSB0aGUgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJZlRleHRWaWV3ZXIucmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZVbmRvTm90aWZpZXIpOwotCQkJZlVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoZlRleHRWaWV3ZXIpOwotCQl9Ci0KLQkJLy8gbnVsbCBvdXQgdGhlIHZpZXdlciBhbmQgdW5kbyBtYW5hZ2VyCi0JCWZUZXh0Vmlld2VyID0gbnVsbDsKLQkJZlVuZG9NYW5hZ2VyID0gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI2VuZENvbXBvdW5kQ2hhbmdlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRDb21wb3VuZENoYW5nZSgpIHsKLQkJLy8gZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkKLQkJCWZVbmRvTWFuYWdlci5lbmRSZWNvcmRpbmcoZlRleHRWaWV3ZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjcmVkbygpCi0JICovCi0JcHVibGljIHZvaWQgcmVkbygpIHsKLQkJLy8gZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkKLQkJCWZVbmRvTWFuYWdlci5yZWRvKGZUZXh0Vmlld2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI3JlZG9hYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWRvYWJsZSgpIHsKLQkJYm9vbGVhbiBjYW5SZWRvID0gZmFsc2U7Ci0KLQkJLy8gZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkKLQkJCWNhblJlZG8gPSBmVW5kb01hbmFnZXIucmVkb2FibGUoKTsKLQotCQlyZXR1cm4gY2FuUmVkbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI3Jlc2V0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldCgpIHsKLQkJLy8gY2Fubm90IHJlYWxseSByZXNldCBtb2RlbC1iYXNlZCB1bmRvIG1hbmFnZXIgYmVjYXVzZSBvdGhlciBjbGllbnRzCi0JCS8vIHdpbGwgYmUgYWZmZWN0ZWQKLQl9Ci0KLQkvKioKLQkgKiBEaXNjb25uZWN0IGZyb20gdGhlIG9sZCB1bmRvIG1hbmFnZXIgYW5kIGNvbm5lY3QgdG8gdGhlIHVuZG8gbWFuYWdlcgotCSAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmV3IGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIGRvY3VtZW50IGlzIG5vdCBudWxsCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAoZlVuZG9NYW5hZ2VyICE9IG51bGwpIHsKLQkJCWZUZXh0Vmlld2VyLnJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmVW5kb05vdGlmaWVyKTsKLQkJCWZVbmRvTWFuYWdlci5kaXNjb25uZWN0KGZUZXh0Vmlld2VyKTsKLQkJfQotCi0JCWZVbmRvTWFuYWdlciA9IGRvY3VtZW50LmdldFVuZG9NYW5hZ2VyKCk7Ci0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJZlVuZG9NYW5hZ2VyLmNvbm5lY3QoZlRleHRWaWV3ZXIpOwotCQkJZlRleHRWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGZVbmRvTm90aWZpZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklVbmRvTWFuYWdlciNzZXRNYXhpbWFsVW5kb0xldmVsKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNYXhpbWFsVW5kb0xldmVsKGludCB1bmRvTGV2ZWwpIHsKLQkJLy8gY2Fubm90IHJlYWxseSBzZXQgbWF4aW1hbCB1bmRvIGxldmVsIG9uIG1vZGVsLWJhc2VkIHVuZG8gbWFuYWdlcgotCQkvLyBiZWNhdXNlIG90aGVyIGNsaWVudHMgd2lsbCBiZSBhZmZlY3RlZAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVW5kb01hbmFnZXIjdW5kbygpCi0JICovCi0JcHVibGljIHZvaWQgdW5kbygpIHsKLQkJLy8gZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkKLQkJCWZVbmRvTWFuYWdlci51bmRvKGZUZXh0Vmlld2VyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVVuZG9NYW5hZ2VyI3VuZG9hYmxlKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB1bmRvYWJsZSgpIHsKLQkJYm9vbGVhbiBjYW5VbmRvID0gZmFsc2U7Ci0KLQkJLy8gZm9yd2FyZCB0aGUgcmVxdWVzdCB0byB0aGUgbW9kZWwtYmFzZWQgdW5kbyBtYW5hZ2VyCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkKLQkJCWNhblVuZG8gPSBmVW5kb01hbmFnZXIudW5kb2FibGUoKTsKLQotCQlyZXR1cm4gY2FuVW5kbzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQWJzdHJhY3REcm9wQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQWJzdHJhY3REcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzcxYWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0Fic3RyYWN0RHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0KLS8qKgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3REcm9wQWN0aW9uIGltcGxlbWVudHMgSURyb3BBY3Rpb24gewotCi0JLyoKLQkgKiBSZXBsYWNlcyB0YXJnZXRFZGl0b3IncyBjdXJyZW50IHNlbGVjdGlvbiBieSAidGV4dCIKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpbnNlcnQoU3RyaW5nIHRleHQsIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQubGVuZ3RoKCkgPT0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gbnVsbDsKLQotCQlJU291cmNlRWRpdGluZ1RleHRUb29scyB0b29scyA9IChJU291cmNlRWRpdGluZ1RleHRUb29scykgdGFyZ2V0RWRpdG9yLmdldEFkYXB0ZXIoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MpOwotCQlpZiAodG9vbHMgIT0gbnVsbCkgewotCQkJZG9jID0gdG9vbHMuZ2V0RG9jdW1lbnQoKTsKLQkJCXNlbGVjdGlvbiA9IHRvb2xzLmdldFNlbGVjdGlvbigpOwotCQl9Ci0KLQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCWlmICh0YXJnZXRFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgdGFyZ2V0RWRpdG9yOwotCQl9Ci0JCWlmICh0ZXh0RWRpdG9yID09IG51bGwpIHsKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpICgoSUFkYXB0YWJsZSkgdGFyZ2V0RWRpdG9yKS5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJfQotCQlpZiAodGV4dEVkaXRvciA9PSBudWxsICYmIHRvb2xzICE9IG51bGwgJiYgdG9vbHMuZ2V0RWRpdG9yUGFydCgpIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIHRvb2xzLmdldEVkaXRvclBhcnQoKTsKLQkJfQotCQlpZiAodGV4dEVkaXRvciA9PSBudWxsICYmIHRvb2xzICE9IG51bGwgJiYgdG9vbHMuZ2V0RWRpdG9yUGFydCgpICE9IG51bGwpIHsKLQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIHRvb2xzLmdldEVkaXRvclBhcnQoKS5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24gPT0gbnVsbCAmJiB0ZXh0RWRpdG9yICE9IG51bGwpIHsKLQkJCXNlbGVjdGlvbiA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJfQotCQlpZiAoZG9jID09IG51bGwgJiYgdGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQlkb2MgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQl9Ci0KLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQl0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQl0cnkgewotCQkJCWRvYy5yZXBsYWNlKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCksIHRleHQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCAmJiB0ZXh0U2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzcCA9IHRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCUlUZXh0U2VsZWN0aW9uIHNlbCA9IG5ldyBUZXh0U2VsZWN0aW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHQubGVuZ3RoKCkpOwotCQkJc3Auc2V0U2VsZWN0aW9uKHNlbCk7Ci0JCQl0ZXh0RWRpdG9yLnNlbGVjdEFuZFJldmVhbChzZWwuZ2V0T2Zmc2V0KCksIHNlbC5nZXRMZW5ndGgoKSk7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZERhdGEoT2JqZWN0IGRhdGEpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gcnVuKERyb3BUYXJnZXRFdmVudCBldmVudCwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9DYXJldE1lZGlhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvQ2FyZXRNZWRpYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzhkNDY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9DYXJldE1lZGlhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50cy5DYXJldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHMuSUNhcmV0TGlzdGVuZXI7Ci0KLS8qKgotICogSGFzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBsaXN0ZW5pbmcgZm9yIGtleSBldmVudHMsIGFuZCBtb3VzZSBldmVudHMsCi0gKiBkZWNpZGluZyBpZiB0aGUgY2FyZXQgaGFzIG1vdmVkICh3aXRob3V0IGEgdGV4dCBjaGFuZ2UpLCBhbmQgaWYgc28sIHdpbGwKLSAqIG5vdGlmeSBDYXJldExpc3RlbmVycyB0aGF0IHRoZSBjYXJldCBoYXMgbW92ZWQuIE9iamVjdHMgd2hpY2ggYXJlCi0gKiBpbnRlcmVzdGVkIGluIEFMTCBjYXJldCBwb3N0aW9uIGNoYW5nZXMgd2lsbCBhbHNvIGhhdmUgdG8gbGlzdGVuIGZvcgotICogdGV4dENoYW5nZWQgZXZlbnRzLgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIENhcmV0TWVkaWF0b3IgaW1wbGVtZW50cyBMaXN0ZW5lciB7Ci0KLQljbGFzcyBDYXJldE1lZGlhdG9yTGlzdGVuZXIgaW1wbGVtZW50cyBLZXlMaXN0ZW5lciwgTW91c2VMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZSkgewotCQkJaW50ZXJuYWxLZXlQcmVzc2VkKGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZSkgewotCQkJaW50ZXJuYWxLZXlSZWxlYXNlZChlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG91YmxlQ2xpY2soTW91c2VFdmVudCBlKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlpbnRlcm5hbE1vdXNlRG93bihlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQlpbnRlcm5hbE1vdXNlVXAoZSk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBSZWZyZXNoRGVsYXlKb2IgZXh0ZW5kcyBKb2IgewotCQlwcml2YXRlIGludCBmRGVsYXkgPSAwOwotCQlSZWZyZXNoRGVsYXlKb2IoaW50IGRlbGF5KSB7Ci0JCQlzdXBlcihTU0VVSU1lc3NhZ2VzLmNhcmV0X3VwZGF0ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCWZEZWxheSA9IGRlbGF5OwotCQl9Ci0KLQkJLyoqCi0JCSAqIFNldHVwIGEgZGVsYXllZCBDYXJldEV2ZW50IGZpcmluZwotCQkgKi8KLQkJdm9pZCB0b3VjaCgpIHsKLQkJCWNhbmNlbCgpOwotCQkJc2NoZWR1bGUoZkRlbGF5KTsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCWhhbmRsZUV2ZW50KG51bGwpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0JCi0JUmVmcmVzaERlbGF5Sm9iIGZEZWxheWVyID0gbnVsbDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVMQVkgPSAzMDA7Ci0KLQkvKiogdXNlZCBqdXN0IGZvciBkZWJ1ZyBwcmludCBvdXRzICovCi0JcHJpdmF0ZSBsb25nIGVuZFRpbWU7Ci0JcHJpdmF0ZSBsb25nIHN0YXJ0VGltZTsKLQotCXByb3RlY3RlZCBJQ2FyZXRMaXN0ZW5lcltdIGZDYXJldExpc3RlbmVyczsKLQlwcm90ZWN0ZWQgQ2FyZXRNZWRpYXRvckxpc3RlbmVyIGludGVybmFsTGlzdGVuZXI7Ci0JcHJvdGVjdGVkIFN0eWxlZFRleHQgdGV4dFdpZGdldDsKLQotCS8qKgotCSAqIENhcmV0TWVkaWF0b3IgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ2FyZXRNZWRpYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYXJldE1lZGlhdG9yIGNvbnN0cnVjdG9yIGNvbW1lbnQuIE11c3QgYWx3YXlzIHByb3ZpZGUgdGhlIHdpZGdldCBpdHMKLQkgKiBzdXBwb3NlZCB0byBsaXN0ZW4gdG8uCi0JICovCi0JcHVibGljIENhcmV0TWVkaWF0b3IoU3R5bGVkVGV4dCBzdHlsZWRUZXh0V2lkZ2V0KSB7Ci0JCXRoaXMoKTsKLQkJc2V0VGV4dFdpZGdldChzdHlsZWRUZXh0V2lkZ2V0KTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkQ2FyZXRMaXN0ZW5lcihJQ2FyZXRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiQ2FyZXRNZWRpYXRvcjo6YWRkQ2FyZXRMaXN0ZW5lci4gUmVxdWVzdCB0byBhZGQgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gY2FyZXRsaXN0bmVyLiIpOy8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8gbWFrZSBzdXJlIGxpc3RlbmVyIGlzIG5vdCBhbHJlYWR5IGluIGxpc3RlbmluZyBhcnJheQotCQkvLyAoYW5kIGlmIGl0IGlzLCBwcmludCBhIHdhcm5pbmcgdG8gYWlkIGRlYnVnZ2luZywgaWYgbmVlZGVkKQotCi0JCWlmIChVdGlsaXRpZXMuY29udGFpbnMoZkNhcmV0TGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkNhcmV0TWVkaWF0b3I6OmFkZENhcmV0TGlzdGVuZXIuIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIGFkZGVkIG1vcmUgdGhhbiBvbmNlLiAiKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJDYXJldE1lZGlhdG9yOjphZGRDYXJldExpc3RlbmVyLiBBZGRpbmcgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gY2FyZXQgbWVkaWF0b3IuIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBvbGRTaXplID0gMDsKLQkJCWlmIChmQ2FyZXRMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCS8vIG5vcm1hbGx5IHdvbid0IGJlIG51bGwsIGJ1dCB3ZSBuZWVkIHRvIGJlIHN1cmUsIGZvciBmaXJzdAotCQkJCS8vIHRpbWUgdGhyb3VnaAotCQkJCW9sZFNpemUgPSBmQ2FyZXRMaXN0ZW5lcnMubGVuZ3RoOwotCQkJfQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCUlDYXJldExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElDYXJldExpc3RlbmVyW25ld1NpemVdOwotCQkJaWYgKGZDYXJldExpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLmFycmF5Y29weShmQ2FyZXRMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQl9Ci0JCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJLy8KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZDYXJldExpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmlyZUNhcmV0RXZlbnQoQ2FyZXRFdmVudCBldmVudCkgewotCQlpZiAoZkNhcmV0TGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCS8vIHdlIG11c3QgYXNzaWduIGxpc3RlbmVycyB0byBsb2NhbCB2YXJpYWJsZSB0byBiZSB0aHJlYWQgc2FmZSwKLQkJCS8vIHNpbmNlIHRoZSBhZGQgYW5kIHJlbW92ZSBsaXN0bmVyIG1ldGhvZHMKLQkJCS8vIGNhbiBjaGFuZ2UgdGhpcyBvYmplY3QncyBhY3R1YWwgaW5zdGFuY2Ugb2YgdGhlIGxpc3RlbmVyIGFycmF5Ci0JCQkvLyBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCQkvLyAoYW5kIHNpbmNlIG9iamVjdCBhc3NpZ25tZW50IGlzIGF0b21pYywgd2UgZG9uJ3QgbmVlZCB0bwotCQkJLy8gc3luY2hyb25pemUKLQkJCUlDYXJldExpc3RlbmVyW10gaG9sZExpc3RlbmVycyA9IGZDYXJldExpc3RlbmVyczsKLQkJCS8vCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGhvbGRMaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlob2xkTGlzdGVuZXJzW2ldLmNhcmV0TW92ZWQoZXZlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaGFuZGxlRXZlbnQoRXZlbnQgZSkgewotCQlEaXNwbGF5IGRpc3BsYXkgPSBudWxsOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z0NhcmV0TWVkaWF0b3IpIHsKLQkJCWVuZFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiVGltZXIgZmlyZWQ6ICIgKyAoZW5kVGltZSAtIHN0YXJ0VGltZSkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQkvLyBjaGVjayBpZiAnb2tUb1VzZScKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRpc3BsYXkgPSB0ZXh0V2lkZ2V0LmdldERpc3BsYXkoKTsKLQkJCWlmICgoZGlzcGxheSAhPSBudWxsKSAmJiAoIWRpc3BsYXkuaXNEaXNwb3NlZCgpKSkgewotCQkJCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQlmaXJlQ2FyZXRFdmVudChuZXcgQ2FyZXRFdmVudCh0ZXh0V2lkZ2V0LCB0ZXh0V2lkZ2V0LmdldENhcmV0T2Zmc2V0KCkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxLZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJZkRlbGF5ZXIuY2FuY2VsKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW50ZXJuYWxLZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCXN3aXRjaCAoZS5rZXlDb2RlKSB7Ci0JCQljYXNlIFNXVC5BUlJPV19ET1dOIDoKLQkJCWNhc2UgU1dULkFSUk9XX1VQIDoKLQkJCWNhc2UgU1dULkFSUk9XX0xFRlQgOgotCQkJY2FzZSBTV1QuQVJST1dfUklHSFQgOgotCQkJY2FzZSBTV1QuSE9NRSA6Ci0JCQljYXNlIFNXVC5FTkQgOgotCQkJY2FzZSBTV1QuUEFHRV9ET1dOIDoKLQkJCWNhc2UgU1dULlBBR0VfVVAgOiB7Ci0JCQkJZkRlbGF5ZXIudG91Y2goKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJLy8gYWx3YXlzIHVwZGF0ZSBjdXJzb3IgcG9zdGlvbiwgZXZlbiBkdXJpbmcgbm9ybWFsIHR5cGluZwotCQkJCS8vICh0aGUgbG9naWMgbWF5IGxvb2sgZnVubnksIHNpbmNlIHdlIGFsd2F5cyB0byB0aGUgc2FtZQotCQkJCS8vIHRoaW5nLCBidXQgd2UgaGF2ZW4ndCBhbHdheXMgZG9uZSB0aGUgc2FtZSB0aGluZywgc28gSQotCQkJCS8vIHdhbnRlZCB0byBsZWF2ZSB0aGF0IGZhY3QgZG9jdW1lbnRlZCB2aWEgY29kZS4pCi0JCQkJZkRlbGF5ZXIudG91Y2goKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGludGVybmFsTW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQlmRGVsYXllci5jYW5jZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbnRlcm5hbE1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCS8vIE5vdGUsIGV2ZW4gZHVyaW5nIGEgc3dpcGUgc2VsZWN0LCB3aGVuIHRoZSBtb3VzZSBidXR0b24gZ29lcyB1cCwKLQkJLy8gYW5kIHRoZSB3aWRnZXQgaXMKLQkJLy8gcXVlcmllZCBmb3IgdGhlIGN1cnJlbnQgY2FyZXQgcG9zdGlvbiwgaXQgYWx3YXlzIHJldHVybnMgdGhlCi0JCS8vIGJlZ2lubmluZyBvZiB0aGUgc2VsZWN0aW9uLAotCQkvLyB3aGljaCBpcyBkZXNpcmFibGUgKGF0IGxlYXN0IGZvciB0aGUga25vd24gdXNlIG9mIHRoaXMgZmVhdHVyZSwKLQkJLy8gd2hpY2ggaXMgdG8gc2lnbmFsCi0JCS8vIHRoYXQgdGhlIHByb3BlcnR5IHNoZWV0IGNhbiB1cGRhdGUgaXRzZWxmLgotCQlmRGVsYXllci50b3VjaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWZEZWxheWVyLmNhbmNlbCgpOwotCQlpZiAodGV4dFdpZGdldCAhPSBudWxsICYmICF0ZXh0V2lkZ2V0LmlzRGlzcG9zZWQoKSkgewotCQkJdGV4dFdpZGdldC5yZW1vdmVLZXlMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRleHRXaWRnZXQucmVtb3ZlTW91c2VMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRleHRXaWRnZXQgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlbW92ZUNhcmV0TGlzdGVuZXIoSUNhcmV0TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJaWYgKChmQ2FyZXRMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUgcmVxdWVzdAotCQkJaWYgKFV0aWxpdGllcy5jb250YWlucyhmQ2FyZXRMaXN0ZW5lcnMsIGxpc3RlbmVyKSkgewotCQkJCWludCBvbGRTaXplID0gZkNhcmV0TGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCUlDYXJldExpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElDYXJldExpc3RlbmVyW25ld1NpemVdOwotCQkJCWludCBpbmRleCA9IDA7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvbGRTaXplOyBpKyspIHsKLQkJCQkJaWYgKGZDYXJldExpc3RlbmVyc1tpXSA9PSBsaXN0ZW5lcikgeyAvLyBpZ25vcmUKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZSBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQluZXdMaXN0ZW5lcnNbaW5kZXgrK10gPSBmQ2FyZXRMaXN0ZW5lcnNbaV07Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gbm93IHRoYXQgd2UgaGF2ZSBhIG5ldyBhcnJheSwgbGV0J3Mgc3dpdGNoIGl0IGZvciB0aGUgb2xkCi0JCQkJLy8gb25lCi0JCQkJZkNhcmV0TGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dFdpZGdldChTdHlsZWRUZXh0IG5ld1RleHRXaWRnZXQpIHsKLQkJaWYoZkRlbGF5ZXIgPT0gbnVsbCkgewotCQkJZkRlbGF5ZXIgPSBuZXcgUmVmcmVzaERlbGF5Sm9iKERFTEFZKTsKLQkJfQotCi0JCS8vIHVuaG9vayBmcm9tIHByZXZpb3VzLCBpZiBhbnkKLQkJaWYgKHRoaXMudGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQlmRGVsYXllci5jYW5jZWwoKTsKLQkJCXRoaXMudGV4dFdpZGdldC5yZW1vdmVLZXlMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJCXRoaXMudGV4dFdpZGdldC5yZW1vdmVNb3VzZUxpc3RlbmVyKGludGVybmFsTGlzdGVuZXIpOwotCQl9Ci0KLQkJdGhpcy50ZXh0V2lkZ2V0ID0gbmV3VGV4dFdpZGdldDsKLQotCQlpZiAoaW50ZXJuYWxMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlpbnRlcm5hbExpc3RlbmVyID0gbmV3IENhcmV0TWVkaWF0b3JMaXN0ZW5lcigpOwotCQl9Ci0KLQkJaWYgKHRoaXMudGV4dFdpZGdldCAhPSBudWxsKSB7Ci0JCQl0aGlzLnRleHRXaWRnZXQuYWRkS2V5TGlzdGVuZXIoaW50ZXJuYWxMaXN0ZW5lcik7Ci0JCQl0aGlzLnRleHRXaWRnZXQuYWRkTW91c2VMaXN0ZW5lcihpbnRlcm5hbExpc3RlbmVyKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjg5OTZiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9FeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogU2ltcGxlIGdlbmVyaWMgSUQgdG8gY2xhc3MgdG8gbWFwcGluZy4gTG9hZHMgYSBzcGVjaWZpZWQgY2xhc3MgZGVmaW5lZCBpbiBhCi0gKiBjb25maWd1cmF0aW9uIGVsZW1lbnQgd2l0aCB0aGUgbWF0Y2hpbmcgdHlwZSBhbmQgdGFyZ2V0IElELiBFeGFtcGxlCi0gKiBwbHVnaW4ueG1sIHNlY3Rpb246Ci0gKiAKLSAqICZsdDtleHRlbnNpb24KLSAqIHBvaW50PSZxdW90O29yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdG9yQ29uZmlndXJhdGlvbiZxdW90OyZndDtjb250ZW50b3V0bGluZWNvbmZpZ3VyYXRpb24KLSAqIHRhcmdldD0mcXVvdDtvcmcuZWNsaXBzZS53c3Quc3NlLmR0ZC5jb3JlLmR0ZHNvdXJjZSZxdW90OwotICogY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5kdGQudmlld3MuY29udGVudG91dGxpbmUuRFREQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uJnF1b3Q7LyZndDsKLSAqICZsdDsvZXh0ZW5zaW9uJmd0OwotICogCi0gKiBVc2VkIGluIGNvZGUgYnkgZ2V0Q29uZmlndXJhdGlvbigmcXVvdDtjb250ZW50b3V0bGluZWNvbmZpZ3VyYXRpb24mcXVvdDssCi0gKiAmcXVvdDtvcmcuZWNsaXBzZS53c3QuZHRkLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yRFREJnF1b3Q7KTsKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQkvKioKLQkgKiBFeHRlbnNpb24gdHlwZSB0byBwYXNzIGludG8gZ2V0Q29uZmlndXJhdGlvbnMgdG8gZ2V0IGNvbnRlbnQgb3V0bGluZQotCSAqIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UT1VUTElORUNPTkZJR1VSQVRJT04gPSAiY29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCS8qKgotCSAqIEV4dGVuc2lvbiB0eXBlIHRvIHBhc3MgaW50byBnZXRDb25maWd1cmF0aW9ucyB0byBnZXQgcHJvcGVydHkgc2hlZXQKLQkgKiBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlTSEVFVENPTkZJR1VSQVRJT04gPSAicHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24iOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogRXh0ZW5zaW9uIHR5cGUgdG8gcGFzcyBpbnRvIGdldENvbmZpZ3VyYXRpb25zIHRvIGdldCBzb3VyY2Ugdmlld2VyCi0JICogY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNPVVJDRVZJRVdFUkNPTkZJR1VSQVRJT04gPSAic291cmNlVmlld2VyQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UQVJHRVQgPSAidGFyZ2V0IjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdVUkFUSU9OID0gInByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBNYXAgY29uZmlndXJhdGlvbk1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1RpbWUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9leHRlbmRlZGNvbmZpZ3VyYXRpb25idWlsZGVyL3RpbWUiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGSU5JVElPTiA9ICJwcm92aXNpb25hbERlZmluaXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVQX0VYVEVOREVEQ09ORklHVVJBVElPTiA9ICJlZGl0b3JDb25maWd1cmF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIgaW5zdGFuY2UgPSBudWxsOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFID0gInZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWcgZWxlbWVudCBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGNsYXNzQXR0cmlidXRlCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGNhcnJ5aW5nIHRoZSBjbGFzcwotCSAqIEByZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0IGlmIHN1Y2Nlc3NmdWwuIElmIGFuIGVycm9yIG9jY3VycyB3aGVuCi0JICogICAgICAgICAgY3JlYXRlaW5nIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLCB0aGUgZXhjZXB0aW9uIGlzIGxvZ2dlZCwgYW5kCi0JICogICAgICAgICAgbnVsbCByZXR1cm5lZC4KLQkgKi8KLQlzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgZmluYWwgU3RyaW5nIGNsYXNzQXR0cmlidXRlLCBmaW5hbCBTdHJpbmcgdGFyZ2V0SUQpIHsKLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdFswXSA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGFzc0F0dHJpYnV0ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCBhbmQgbG9nIEFOWSBleGNlcHRpb24gd2hpbGUgY3JlYXRpbmcgdGhlIGV4dGVuc2lvbgotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIGxvYWRpbmcgY2xhc3MgIiArIGNsYXNzQXR0cmlidXRlICsgIiBmb3IgIiArIHRhcmdldElELCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludAotCQkJCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXJyb3IgbG9hZGluZyBjbGFzcyAiICsgY2xhc3NBdHRyaWJ1dGUgKyAiIGZvciAiICsgdGFyZ2V0SUQsIGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlsb25nIHRpbWUwID0gMDsKLQotCXByaXZhdGUgRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgY3JlYXRlQ29uZmlndXJhdGlvbnMoTGlzdCBjb25maWd1cmF0aW9ucywgU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgY29uZmlndXJhdGlvbnMuZ2V0KGkpOwotCQkJaWYgKChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoZXh0ZW5zaW9uVHlwZSkgfHwgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhDT05GSUdVUkFUSU9OKSAmJiBleHRlbnNpb25UeXBlLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSkpKSkpIHsKLQkJCQlTdHJpbmdbXSB0YXJnZXRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UQVJHRVQpKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRhcmdldHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHRhcmdldElELmVxdWFscyh0YXJnZXRzW2pdLnRyaW0oKSkpIHsKLQkJCQkJCU9iamVjdCBvID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIEFUVF9DTEFTUywgdGFyZ2V0SUQpOwotCQkJCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCQkJCXJlc3VsdC5hZGQobyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGZpbmRDb25maWd1cmF0aW9uRWxlbWVudHMoTGlzdCBjb25maWd1cmF0aW9ucywgU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdOwotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlndXJhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgY29uZmlndXJhdGlvbnMuZ2V0KGkpOwotCQkJaWYgKChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoZXh0ZW5zaW9uVHlwZSkgfHwgKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFscyhERUZJTklUSU9OKSAmJiBleHRlbnNpb25UeXBlLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSkpKSkpIHsKLQkJCQlTdHJpbmdbXSB0YXJnZXRzID0gU3RyaW5nVXRpbHMudW5wYWNrKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UQVJHRVQpKTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHRhcmdldHMubGVuZ3RoOyBqKyspIHsKLQkJCQkJaWYgKHRhcmdldElELmVxdWFscyh0YXJnZXRzW2pdLnRyaW0oKSkpIHsKLQkJCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgcmVzdWx0LnRvQXJyYXkobmV3IElDb25maWd1cmF0aW9uRWxlbWVudFswXSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBnaXZlbiBleHRlbnNpb25UeXBlIG1hdGNoaW5nIHRoZQotCSAqIHRhcmdldElELCBpZiBvbmUgaXMgYXZhaWxhYmxlLiBJZiBtb3JlIHRoYW4gb25lIGNvbmZpZ3VyYXRpb24gaXMKLQkgKiBkZWZpbmVkLCB0aGUgZmlyc3Qgb25lIGZvdW5kIGlzIHJldHVybmVkLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25UeXBlCi0JICogQHBhcmFtIHRhcmdldElECi0JICogQHJldHVybiBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0LCBpZiBvbmUgd2FzIGRlZmluZWQKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldENvbmZpZ3VyYXRpb24oU3RyaW5nIGV4dGVuc2lvblR5cGUsIFN0cmluZyB0YXJnZXRJRCkgewotCQlpZiAodGFyZ2V0SUQgPT0gbnVsbCB8fCB0YXJnZXRJRC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCUxpc3QgY29uZmlndXJhdGlvbnMgPSBnZXRDb25maWd1cmF0aW9ucyhleHRlbnNpb25UeXBlLCB0YXJnZXRJRCk7Ci0JCWlmIChjb25maWd1cmF0aW9ucy5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25zLmdldCgwKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCBjb25maWd1cmF0aW9ucyBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvblR5cGUgbWF0Y2hpbmcgdGhlCi0JICogdGFyZ2V0SUQsIGlmIGFueSBhcmUgYXZhaWxhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBleHRlbnNpb25UeXBlCi0JICogQHBhcmFtIHRhcmdldElECi0JICogQHJldHVybiBhIExpc3Qgb2YgY29uZmlndXJhdGlvbiBvYmplY3RzLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZSBlbXB0eQotCSAqLwotCXB1YmxpYyBMaXN0IGdldENvbmZpZ3VyYXRpb25zKFN0cmluZyBleHRlbnNpb25UeXBlLCBTdHJpbmcgdGFyZ2V0SUQpIHsKLQkJaWYgKHRhcmdldElEID09IG51bGwgfHwgdGFyZ2V0SUQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQlpZiAoY29uZmlndXJhdGlvbk1hcCA9PSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9uTWFwID0gbmV3IEhhc2hNYXAoMCk7Ci0JCQlzeW5jaHJvbml6ZWQgKGNvbmZpZ3VyYXRpb25NYXApIHsKLQkJCQlyZWFkUmVnaXN0cnkoUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgU1NFVUlQbHVnaW4uSUQsIEVQX0VYVEVOREVEQ09ORklHVVJBVElPTik7Ci0JCQkJaWYgKGRlYnVnVGltZSkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI3JlYWRSZWdpc3RyeSgpOiAgIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJTGlzdCBleHRlbnNpb25zID0gKExpc3QpIGNvbmZpZ3VyYXRpb25NYXAuZ2V0KGV4dGVuc2lvblR5cGUpOwotCQlMaXN0IGNvbmZpZ3VyYXRpb25zID0gY3JlYXRlQ29uZmlndXJhdGlvbnMoZXh0ZW5zaW9ucywgZXh0ZW5zaW9uVHlwZSwgdGFyZ2V0SUQpOwotCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQlpZiAoIWNvbmZpZ3VyYXRpb25zLmlzRW1wdHkoKSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldENvbmZpZ3VyYXRpb24oIiArIGV4dGVuc2lvblR5cGUgKyAiLCAiICsgdGFyZ2V0SUQgKyAiKTogY29uZmlndXJhdGlvbnMgbG9hZGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjZ2V0Q29uZmlndXJhdGlvbigiICsgZXh0ZW5zaW9uVHlwZSArICIsICIgKyB0YXJnZXRJRCArICIpOiByYW4gaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJcmV0dXJuIGNvbmZpZ3VyYXRpb25zOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIGRlY2xhcmVkIGRlZmluaXRpb25zIGZvciB0aGUgZ2l2ZW4gZXh0ZW5zaW9uVHlwZSBtYXRjaGluZwotCSAqIHRoZSB0YXJnZXRJRCwgaWYgYW55IGFyZSBhdmFpbGFibGUuCi0JICogCi0JICogQHBhcmFtIGV4dGVuc2lvblR5cGUKLQkgKiBAcGFyYW0gdGFyZ2V0SUQKLQkgKiBAcmV0dXJuIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zLCBlbXB0eSBpZiBub25lIHdlcmUKLQkgKiAgICAgICAgIGRlY2xhcmVkCi0JICovCi0JcHVibGljIFN0cmluZ1tdIGdldERlZmluaXRpb25zKFN0cmluZyBleHRlbnNpb25UeXBlLCBTdHJpbmcgdGFyZ2V0SUQpIHsKLQkJaWYgKHRhcmdldElEID09IG51bGwgfHwgdGFyZ2V0SUQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQl9Ci0JCWlmIChjb25maWd1cmF0aW9uTWFwID09IG51bGwpIHsKLQkJCWNvbmZpZ3VyYXRpb25NYXAgPSBuZXcgSGFzaE1hcCgwKTsKLQkJCXN5bmNocm9uaXplZCAoY29uZmlndXJhdGlvbk1hcCkgewotCQkJCXJlYWRSZWdpc3RyeShQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBTU0VVSVBsdWdpbi5JRCwgRVBfRVhURU5ERURDT05GSUdVUkFUSU9OKTsKLQkJCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjcmVhZFJlZ2lzdHJ5KCk6ICAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQl0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IGRlZmluaXRpb25zID0gKExpc3QpIGNvbmZpZ3VyYXRpb25NYXAuZ2V0KGV4dGVuc2lvblR5cGUpOwotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IGZpbmRDb25maWd1cmF0aW9uRWxlbWVudHMoZGVmaW5pdGlvbnMsIGV4dGVuc2lvblR5cGUsIHRhcmdldElEKTsKLQkJU3RyaW5nW10gdmFsdWVzID0gbmV3IFN0cmluZ1tlbGVtZW50cy5sZW5ndGhdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotCQkJdmFsdWVzW2ldID0gZWxlbWVudHNbaV0uZ2V0QXR0cmlidXRlKFZBTFVFKTsKLQkJfQotCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQlpZiAodmFsdWVzLmxlbmd0aCA+IDApCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNnZXREZWZpbml0aW9ucygiICsgZXh0ZW5zaW9uVHlwZSArICIsICIgKyB0YXJnZXRJRCArICIpOiBkZWZpbml0aW9uIGxvYWRlZCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERlZmluaXRpb25zKCIgKyBleHRlbnNpb25UeXBlICsgIiwgIiArIHRhcmdldElEICsgIik6IHJhbiBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJfQotCQlyZXR1cm4gdmFsdWVzOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmIChuYW1lLmVxdWFscyhDT05GSUdVUkFUSU9OKSB8fCBuYW1lLmVxdWFscyhERUZJTklUSU9OKSkKLQkJCW5hbWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFlQRSk7Ci0JCUxpc3QgY29uZmlndXJhdGlvbnMgPSAoTGlzdCkgY29uZmlndXJhdGlvbk1hcC5nZXQobmFtZSk7Ci0JCWlmIChjb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQljb25maWd1cmF0aW9ucyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCQljb25maWd1cmF0aW9uTWFwLnB1dChuYW1lLCBjb25maWd1cmF0aW9ucyk7Ci0JCX0KLQkJY29uZmlndXJhdGlvbnMuYWRkKGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmN2Y3NDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0V4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVN0YXR1c0xpbmVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JVG9vbEJhck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5TZXBhcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUtleUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JTaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5BY3Rpb25EZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLklFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU291cmNlRWRpdGluZ1RleHRUb29sczsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgdGhlIHJlZ2lzdHJ5IGZvciBleHRlbnNpb25zIHRoYXQgcGx1ZyBpbnRvICdlZGl0b3JBY3Rpb25zJwotICogZXh0ZW5zaW9uIHBvaW50LgotICovCi0KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwdWJsaWMgY2xhc3MgRXh0ZW5kZWRDb250cmlidXRvciBpbXBsZW1lbnRzIElFeHRlbmRlZENvbnRyaWJ1dG9yLCBJTWVudUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgYWN0aXZlRXh0ZW5kZWRFZGl0b3IgPSBudWxsOwotCi0JCXByaXZhdGUgTGlzdCBjYWNoZTsKLQkJcHJpdmF0ZSBNYXAgbWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJcHJpdmF0ZSBJTWVudU1hbmFnZXIgbWVudUJhciA9IG51bGw7Ci0KLQkJcHJpdmF0ZSBTZXQgbWVudXMgPSBuZXcgSGFzaFNldCgpOwotCi0JCXB1YmxpYyBFeHRlbmRlZENvbnRyaWJ1dG9yKExpc3QgY2FjaGUpIHsKLQkJCXRoaXMuY2FjaGUgPSBjYWNoZTsKLQkJfQotCi0JCXByaXZhdGUgSUV4dGVuZGVkU2ltcGxlRWRpdG9yIGNvbXB1dGVFeHRlbmRlZEVkaXRvcihmaW5hbCBJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJCUlFeHRlbmRlZFNpbXBsZUVkaXRvciBzaW1wbGVFZGl0b3IgPSBudWxsOwotCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElFeHRlbmRlZFNpbXBsZUVkaXRvcikgewotCQkJCXNpbXBsZUVkaXRvciA9IChJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIGVkaXRvcjsKLQkJCX0KLQkJCWlmIChlZGl0b3IgIT0gbnVsbCAmJiBzaW1wbGVFZGl0b3IgPT0gbnVsbCkgewotCQkJCWZpbmFsIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzID0gKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBlZGl0b3IuZ2V0QWRhcHRlcihJU291cmNlRWRpdGluZ1RleHRUb29scy5jbGFzcyk7Ci0JCQkJaWYgKHRvb2xzICE9IG51bGwpIHsKLQkJCQkJc2ltcGxlRWRpdG9yID0gbmV3IElFeHRlbmRlZFNpbXBsZUVkaXRvcigpIHsKLQkJCQkJCXB1YmxpYyBpbnQgZ2V0Q2FyZXRQb3NpdGlvbigpIHsKLQkJCQkJCQlyZXR1cm4gdG9vbHMuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJCQkJCQlyZXR1cm4gdG9vbHMuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIElFZGl0b3JQYXJ0IGdldEVkaXRvclBhcnQoKSB7Ci0JCQkJCQkJcmV0dXJuIHRvb2xzLmdldEVkaXRvclBhcnQoKTsKLQkJCQkJCX0KLQotCQkJCQkJcHVibGljIFBvaW50IGdldFNlbGVjdGlvblJhbmdlKCkgewotCQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRvb2xzLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCXJldHVybiBuZXcgUG9pbnQoc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJfQotCi0JCQkJCX07Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHNpbXBsZUVkaXRvcjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJCW1lbnVCYXIgPSBtZW51OwotCQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZS5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWVudUVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBvYmo7Ci0JCQkJCWlmICgobWVudUVsZW1lbnQuZ2V0TmFtZSgpKS5lcXVhbHMoVEFHX01FTlUpKSB7Ci0JCQkJCQljb250cmlidXRlTWVudShtZW51RWxlbWVudCwgbWVudSwgdHJ1ZSk7Ci0JCQkJCQlpZiAoZGVidWdNZW51KQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvTWVudSgpIGFkZGVkOiAiICsgbWVudUVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQWN0aW9uRGVzY3JpcHRvcikgewotCQkJCQl0cnkgewotCQkJCQkJQWN0aW9uRGVzY3JpcHRvciBhZCA9IChBY3Rpb25EZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlJTWVudU1hbmFnZXIgbW0gPSBjb250cmlidXRlTWVudUFjdGlvbihhZCwgbWVudSwgdHJ1ZSwgZmFsc2UpOwotCQkJCQkJaWYgKG1tICE9IG51bGwpIHsKLQkJCQkJCQltYXAucHV0KGFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKSwgbW0pOwotCQkJCQkJCW1tLmFkZE1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJCQkJCQltZW51cy5hZGQobW0pOwotCQkJCQkJCWlmIChkZWJ1Z01lbnUpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvTWVudSgpIGFkZGVkOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImNvbnRyaWJ1dGluZyB0byBtZW51IiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChkZWJ1Z0NvbnRyaWJ1dGVUaW1lKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvTWVudSgpOiByYW4gaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjYWNoZS5zaXplKCk7IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkgewotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgbWVudUVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBvYmo7Ci0JCQkJCWlmICgobWVudUVsZW1lbnQuZ2V0TmFtZSgpKS5lcXVhbHMoVEFHX1BPUFVQTUVOVSkpIHsKLQkJCQkJCWNvbnRyaWJ1dGVNZW51KG1lbnVFbGVtZW50LCBtZW51LCB0cnVlKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBY3Rpb25EZXNjcmlwdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJCUlBY3Rpb24gYSA9IGFkLmdldEFjdGlvbigpOwotCQkJCQkJaWYgKGEgaW5zdGFuY2VvZiBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIHsKLQkJCQkJCQkvLyB1bmNhdWdodCBleGNlcHRpb25zIGNvdWxkIGNhdXNlIHRoZSBtZW51IHRvIG5vdAotCQkJCQkJCS8vIGJlIHNob3duCi0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJaWYgKCgoYWQuZ2V0UG9wdXBNZW51UGF0aCgpICE9IG51bGwpIHx8IChhZC5nZXRQb3B1cE1lbnVHcm91cCgpICE9IG51bGwpKSAmJiAoYSBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKSkgewotCQkJCQkJCQkgICAgKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZylhKS5yZWFsaXplKCk7Ci0JCQkJCQkJCX0KLQotCQkJCQkJCQlJRXh0ZW5kZWRFZGl0b3JBY3Rpb24gZWVhID0gKElFeHRlbmRlZEVkaXRvckFjdGlvbikgYTsKLQkJCQkJCQkJZWVhLnNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKGFjdGl2ZUV4dGVuZGVkRWRpdG9yKTsKLQkJCQkJCQkJZWVhLnVwZGF0ZSgpOwotCQkJCQkJCQlpZiAoZWVhLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQkJCQlJTWVudU1hbmFnZXIgcGFyZW50ID0gY29udHJpYnV0ZU1lbnVBY3Rpb24oYWQsIG1lbnUsIHRydWUsIHRydWUpOwotCQkJCQkJCQkJaWYgKGRlYnVnUG9wdXAgJiYgcGFyZW50ICE9IG51bGwpCi0JCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Qb3B1cE1lbnUoKSBhZGRlZDogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlJTWVudU1hbmFnZXIgcGFyZW50ID0gY29udHJpYnV0ZU1lbnVBY3Rpb24oYWQsIG1lbnUsIHRydWUsIHRydWUpOwotCQkJCQkJCWlmIChkZWJ1Z1BvcHVwICYmIHBhcmVudCAhPSBudWxsKQotCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1BvcHVwTWVudSgpIGFkZGVkOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImNvbnRyaWJ1dGluZyB0byBwb3B1cCIsIGUpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZGVidWdDb250cmlidXRlVGltZSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1BvcHVwTWVudSgpOiByYW4gaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpIHsKLQkJCS8vIG5vdGhpbmcgZnJvbSBoZXJlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aW9uRGVzY3JpcHRvcikgewotCQkJCQl0cnkgewotCQkJCQkJQWN0aW9uRGVzY3JpcHRvciBhZCA9IChBY3Rpb25EZXNjcmlwdG9yKSBvYmo7Ci0JCQkJCQlJQWN0aW9uIGEgPSBhZC5nZXRBY3Rpb24oKTsKLQkJCQkJCWlmIChhIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSB7Ci0JCQkJCQkJaWYgKCgoYWQuZ2V0VG9vbGJhclBhdGgoKSAhPSBudWxsKSB8fCAoYWQuZ2V0VG9vbGJhckdyb3VwKCkgIT0gbnVsbCkpICYmIChhIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcpKSB7Ci0JCQkJCQkJICAgICgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcpYSkucmVhbGl6ZSgpOwotCQkJCQkJCX0KLQkJCQkJCQlJRXh0ZW5kZWRFZGl0b3JBY3Rpb24gZWVhID0gKElFeHRlbmRlZEVkaXRvckFjdGlvbikgYTsKLQkJCQkJCQllZWEuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IoYWN0aXZlRXh0ZW5kZWRFZGl0b3IpOwotCQkJCQkJCWVlYS51cGRhdGUoKTsKLQkJCQkJCQlpZiAoZWVhLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCQkJCWJvb2xlYW4gY29udHJpYnV0ZWQgPSBjb250cmlidXRlVG9vbGJhckFjdGlvbihhZCwgbWFuYWdlciwgdHJ1ZSk7Ci0JCQkJCQkJCWlmIChkZWJ1Z1Rvb2xiYXIgJiYgY29udHJpYnV0ZWQpCi0JCQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2NvbnRyaWJ1dGVUb1Rvb2xCYXIoKSBhZGRlZDogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlpZiAoZGVidWdUb29sYmFyKQotCQkJCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNjb250cmlidXRlVG9Ub29sQmFyKCk6IFtza2lwcGVkXSAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlib29sZWFuIGNvbnRyaWJ1dGVkID0gY29udHJpYnV0ZVRvb2xiYXJBY3Rpb24oYWQsIG1hbmFnZXIsIHRydWUpOwotCQkJCQkJCWlmIChkZWJ1Z1Rvb2xiYXIgJiYgY29udHJpYnV0ZWQpCi0JCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvVG9vbEJhcigpIGFkZGVkOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImNvbnRyaWJ1dGluZyB0byB0b29sYmFyIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChkZWJ1Z0NvbnRyaWJ1dGVUaW1lKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbihnZXRDbGFzcygpLmdldE5hbWUoKSArICIjY29udHJpYnV0ZVRvVG9vbEJhcigpOiByYW4gaW4gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUwKSArICJtcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlJdGVyYXRvciBpdCA9IG1lbnVzLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG8gaW5zdGFuY2VvZiBJTWVudU1hbmFnZXIpIHsKLQkJCQkJKChJTWVudU1hbmFnZXIpIG8pLnJlbW92ZU1lbnVMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMsIElXb3JrYmVuY2hQYWdlIHBhZ2UpIHsKLQkJCS8vIG5vdGhpbmcgZnJvbSBoZXJlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJCS8vIHNsb3dzIGRvd24gdGhlIG1lbnUgYW5kIGludGVyZmVyZXMgd2l0aCBpdCBmb3Igb3RoZXIgZWRpdG9yczsKLQkJCS8vIG9wdGltaXplIG9uIHZpc2liaWxpdHkKLQkJCUlFZGl0b3JTaXRlIHNpdGUgPSBudWxsOwotCQkJYm9vbGVhbiBhY3RpdmVFZGl0b3JJc1Zpc2libGUgPSBmYWxzZTsKLQotCQkJaWYgKGFjdGl2ZUV4dGVuZGVkRWRpdG9yICE9IG51bGwgJiYgYWN0aXZlRXh0ZW5kZWRFZGl0b3IuZ2V0RWRpdG9yUGFydCgpICE9IG51bGwpCi0JCQkJc2l0ZSA9IGFjdGl2ZUV4dGVuZGVkRWRpdG9yLmdldEVkaXRvclBhcnQoKS5nZXRFZGl0b3JTaXRlKCk7Ci0JCQlpZiAoc2l0ZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJLy8gRWNsaXBzZSBidWcgNDg3ODQgLSBbTVBFXSBDbGFzc0Nhc3QgZXhjZXB0aW9uIFdvcmtiZW5jaCBwYWdlCi0JCQkvLyBpc1BhcnRWaXNpYWJsZSBmb3IgTXVsdGlQYWdlU2l0ZQotCQkJaWYgKHNpdGUgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JTaXRlKSB7Ci0JCQkJT2JqZWN0IG11bHRpUGFnZUVkaXRvciA9ICgoTXVsdGlQYWdlRWRpdG9yU2l0ZSkgc2l0ZSkuZ2V0TXVsdGlQYWdlRWRpdG9yKCk7Ci0JCQkJYWN0aXZlRWRpdG9ySXNWaXNpYmxlID0gbXVsdGlQYWdlRWRpdG9yLmVxdWFscyhzaXRlLmdldFBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKSkgfHwgbXVsdGlQYWdlRWRpdG9yLmVxdWFscyhzaXRlLmdldFBhZ2UoKS5nZXRBY3RpdmVQYXJ0KCkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWN0aXZlRWRpdG9ySXNWaXNpYmxlID0gc2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRQYXJ0U2VydmljZSgpLmdldEFjdGl2ZVBhcnQoKS5lcXVhbHMoYWN0aXZlRXh0ZW5kZWRFZGl0b3IuZ2V0RWRpdG9yUGFydCgpKTsKLQkJCX0KLQkJCS8vIGR1ZSB0byBhIGRlbGF5IGNsYXNzIGxvYWRpbmcsIGRvbid0IHJldHVybiBub3cKLS8vCQkJaWYgKCFhY3RpdmVFZGl0b3JJc1Zpc2libGUpCi0vLwkJCQlyZXR1cm47Ci0KLQkJCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBtZW51LmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXMgPT0gbnVsbCB8fCBpdGVtcy5sZW5ndGggPT0gMCkKLQkJCQlyZXR1cm47Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHsKLQkJCQkvLyBhZGQgbWVudSBsaXN0ZW5lciB0byBzdWJtZW51Ci0JCQkJaWYgKGl0ZW1zW2ldIGluc3RhbmNlb2YgSU1lbnVNYW5hZ2VyKSB7Ci0JCQkJCSgoSU1lbnVNYW5hZ2VyKSBpdGVtc1tpXSkuYWRkTWVudUxpc3RlbmVyKHRoaXMpOwotCQkJCQltZW51cy5hZGQoaXRlbXNbaV0pOwotCQkJCX0KLQkJCX0KLQotCQkJU2V0IGtleXMgPSBtYXAua2V5U2V0KCk7Ci0JCQlJdGVyYXRvciBpdCA9IGtleXMuaXRlcmF0b3IoKTsKLQkJCWJvb2xlYW4gbmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUgPSBmYWxzZTsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gKElDb250cmlidXRpb25JdGVtKSBpdC5uZXh0KCk7Ci0JCQkJSU1lbnVNYW5hZ2VyIG1tID0gKElNZW51TWFuYWdlcikgbWFwLmdldChpdGVtKTsKLQkJCQlpZiAobWVudS5nZXRJZCgpICE9IG51bGwgJiYgbWVudS5nZXRJZCgpLmVxdWFscyhtbS5nZXRJZCgpKSAmJiBpdGVtIGluc3RhbmNlb2YgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSkgewotCQkJCQl0cnkgewotCQkJCQkJSUFjdGlvbiBhY3Rpb24gPSAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGl0ZW0pLmdldEFjdGlvbigpOwotCi0JCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcpIHsKLQkJCQkJCSAgICBJRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZyBlZWEgPSAoSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcpYWN0aW9uOwotCQkJCQkJICAgIGlmIChlZWEuaXNSZWFsaXplZCgpID09IGZhbHNlKSB7Ci0JCQkJCQkgICAgICAgIGVlYS5yZWFsaXplKCk7Ci0JCQkJCQkgICAgICAgIG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlID0gdHJ1ZTsKLQkJCQkJCSAgICB9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChhY3RpdmVFZGl0b3JJc1Zpc2libGUgfHwgbmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUpIHsKLQkJCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSVVwZGF0ZSkgewotCQkJCQkJCQkoKElVcGRhdGUpIGFjdGlvbikudXBkYXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCi0JCQkJCQlpZiAoYWN0aXZlRWRpdG9ySXNWaXNpYmxlIHx8IG5lZWRBY3Rpb25Db250cmlidXRpb25JdGVtVXBkYXRlKSB7Ci0JCQkJCQkJYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLQkJCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSB7Ci0JCQkJCQkJCXZpc2libGUgPSAoKElFeHRlbmRlZEVkaXRvckFjdGlvbikgYWN0aW9uKS5pc1Zpc2libGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaXRlbS5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmVlZEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW1VcGRhdGUpIHsKLQkJCQkJCSAgICAoKEFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0paXRlbSkudXBkYXRlKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInVwZGF0aW5nIGFjdGlvbnMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFjdGl2ZUVkaXRvcklzVmlzaWJsZSB8fCBuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSkgewotCQkJICAgIGlmIChuZWVkQWN0aW9uQ29udHJpYnV0aW9uSXRlbVVwZGF0ZSkgewotCQkJICAgICAgICAvLyB0aGUgYWN0aW9uIGlzIHJlYWxpemVkIHNvIHRoYXQgbmVlZCB0byB1cGRhdGUgdGhlIG1lbnUgdy8KLQkJCSAgICAgICAgLy8gZm9yY2Ugc2V0IHRvIHRydWUKLQkJCSAgICAgICAgbWVudS51cGRhdGUodHJ1ZSk7Ci0JCQkgICAgfSBlbHNlIHsKLQkJCSAgICAgICAgbWVudS51cGRhdGUoZmFsc2UpOwotCQkJICAgIH0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBlZGl0b3IpIHsKLQkJCWFjdGl2ZUV4dGVuZGVkRWRpdG9yID0gY29tcHV0ZUV4dGVuZGVkRWRpdG9yKGVkaXRvcik7Ci0JCQlJS2V5QmluZGluZ1NlcnZpY2Ugc3ZjID0gKGVkaXRvciAhPSBudWxsKSA/IGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0S2V5QmluZGluZ1NlcnZpY2UoKSA6IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNhY2hlLnNpemUoKTsgaSsrKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGNhY2hlLmdldChpKTsKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgQWN0aW9uRGVzY3JpcHRvcikgewotCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJdHJ5IHsKLQkJCQkJCUlBY3Rpb24gYWN0aW9uID0gYWQuZ2V0QWN0aW9uKCk7Ci0JCQkJCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSB7Ci0JCQkJCQkJKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pIGFjdGlvbikuc2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IoYWN0aXZlRXh0ZW5kZWRFZGl0b3IpOwotCQkJCQkJCSgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhY3Rpb24pLnVwZGF0ZSgpOwotCQkJCQkJCS8vIHVwZGF0ZSB2aXNpYmlsaXR5IHJpZ2h0IG5vdyBzbyB0aGF0IHRoZSBtZW51Ci0JCQkJCQkJLy8gd2lsbCBzaG93L2hpZGUgcHJvcGVybHkKLQkJCQkJCQlpZiAoISgoSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSBhY3Rpb24pLmlzVmlzaWJsZSgpICYmIGFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKSAhPSBudWxsKQotCQkJCQkJCQlhZC5nZXRDb250cmlidXRpb25JdGVtKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQkJaWYgKHN2YyAhPSBudWxsICYmIGFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSAhPSBudWxsKSB7Ci0JCQkJCQkJCXN2Yy5yZWdpc3RlckFjdGlvbihhY3Rpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oInNldHRpbmcgYWN0aXZlIGVkaXRvciBvbiBhY3Rpb25zIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG1lbnVCYXIgIT0gbnVsbCAmJiBlZGl0b3IgIT0gbnVsbCkgewotCQkJCS8vIENsYXNzIGNseiA9IGVkaXRvci5nZXRDbGFzcygpOwotCQkJCS8vIHdoaWxlIChjbHogIT0gbnVsbCkgewotCQkJCS8vIGlmIChjbHouZ2V0TmFtZSgpLmVxdWFscyh0YXJnZXRJRCkpIHsKLQkJCQkvLyBjb250cmlidXRlVG9NZW51KG1lbnVCYXIpOwotCQkJCS8vIGJyZWFrOwotCQkJCS8vIH0KLQkJCQkvLyBjbHogPSBjbHouZ2V0U3VwZXJjbGFzcygpOwotCQkJCS8vIH0KLQkJCQlpZiAodGFyZ2V0SURzLmNvbnRhaW5zKGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0SWQoKSkpIHsKLQkJCQkJY29udHJpYnV0ZVRvTWVudShtZW51QmFyKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sYmFyQWN0aW9ucygpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2FjaGUuc2l6ZSgpOyBpKyspIHsKLQkJCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJCWlmIChvYmogaW5zdGFuY2VvZiBBY3Rpb25EZXNjcmlwdG9yKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlBY3Rpb25EZXNjcmlwdG9yIGFkID0gKEFjdGlvbkRlc2NyaXB0b3IpIG9iajsKLQkJCQkJCWlmIChhZC5nZXRUb29sYmFyUGF0aCgpICE9IG51bGwpIHsKLQkJCQkJCQlJQWN0aW9uIGFjdGlvbiA9IGFkLmdldEFjdGlvbigpOwotCQkJCQkJCWlmIChhY3Rpb24gaW5zdGFuY2VvZiBJVXBkYXRlKSB7Ci0JCQkJCQkJCSgoSVVwZGF0ZSkgYWN0aW9uKS51cGRhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJ1cGRhdGluZyB0b29sYmFyIGFjdGlvbnMiLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9MQUJFTCA9ICJsYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QQVRIID0gInBhdGgiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEFSR0VUX0lEID0gInRhcmdldElEIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z0NvbnRyaWJ1dGVUaW1lID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2NvbnRyaWJ1dGV0aW1lIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdNZW51ID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL2RlYnVnbWVudSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJDsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQb3B1cCA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z3BvcHVwIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkOwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1JlYWRUaW1lID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZXh0ZW5kZWRlZGl0b3JhY3Rpb25idWlsZGVyL3JlYWR0aW1lIikpOyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBib29sZWFuIGRlYnVnVG9vbGJhciA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2V4dGVuZGVkZWRpdG9yYWN0aW9uYnVpbGRlci9kZWJ1Z3Rvb2xiYXIiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5ERURfRURJVE9SID0gImV4dGVuZGVkRWRpdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfRVhURU5ERURfRURJVE9SX0FDVElPTlMgPSAiZXh0ZW5kZWRFZGl0b3JBY3Rpb25zIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0FDVElPTiA9ICJhY3Rpb24iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVFJJQlVUSU9OX1RZUEUgPSAiZWRpdG9yQ29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX01FTlUgPSAibWVudSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUE9QVVBNRU5VID0gInBvcHVwbWVudSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUlVMRVJNRU5VID0gInJ1bGVybWVudSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfU0VQQVJBVE9SID0gInNlcGFyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBMaXN0IHJlYWRpbmdDYWNoZTsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0Q29udHJpYnV0aW9uVGFnOwotCXByb3RlY3RlZCBMaXN0IHRhcmdldElEczsKLQotCS8qKgotCSAqIFRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBtZW51IGZyb20gdGhlIGluZm9ybWF0aW9uIGluIHRoZSBtZW51IGNvbmZpZ3VyYXRpb24gZWxlbWVudAotCSAqIGFuZCBhZGRzIGl0IGludG8gdGhlIHByb3ZpZGVkIG1lbnUgbWFuYWdlci4gSWYgJ2FwcGVuZElmTWlzc2luZycgaXMKLQkgKiB0cnVlLCBhbmQgbWVudSBwYXRoIHNsb3QgaXMgbm90IGZvdW5kLCBpdCB3aWxsIGJlIGNyZWF0ZWQgYW5kIG1lbnUgd2lsbAotCSAqIGJlIGFkZGVkIGludG8gaXQuIE90aGVyd2lzZSwgYWRkIG9wZXJhdGlvbiB3aWxsIGZhaWwuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZU1lbnUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IG1lbnVFbGVtZW50LCBJTWVudU1hbmFnZXIgbW5nLCBib29sZWFuIGFwcGVuZElmTWlzc2luZykgewotCQkvLyBHZXQgY29uZmlnIGRhdGEuCi0JCVN0cmluZyBpZCA9IG1lbnVFbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlTdHJpbmcgbGFiZWwgPSBtZW51RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0xBQkVMKTsKLQkJU3RyaW5nIHBhdGggPSBtZW51RWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BBVEgpOwotCQlpZiAobGFiZWwgPT0gbnVsbCkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChsYWJlbCA9PSBudWxsKTogIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gQ2FsY3VsYXRlIG1lbnUgcGF0aCBhbmQgZ3JvdXAuCi0JCVN0cmluZyBncm91cCA9IG51bGw7Ci0JCWlmIChwYXRoICE9IG51bGwpIHsKLQkJCWludCBsb2MgPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAobG9jICE9IC0xKSB7Ci0JCQkJZ3JvdXAgPSBwYXRoLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJCQlwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGFzc3VtZSB0aGF0IHBhdGggcmVwcmVzZW50cyBhIHNsb3QKLQkJCQkvLyBzbyBhY3R1YWwgcGF0aCBwb3J0aW9uIHNob3VsZCBiZSBudWxsCi0JCQkJZ3JvdXAgPSBwYXRoOwotCQkJCXBhdGggPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJLy8gRmluZCBwYXJlbnQgbWVudS4KLQkJSU1lbnVNYW5hZ2VyIHBhcmVudCA9IG1uZzsKLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJcGFyZW50ID0gbW5nLmZpbmRNZW51VXNpbmdQYXRoKHBhdGgpOwotCQkJaWYgKHBhcmVudCA9PSBudWxsKSB7Ci0JCQkJLy8gTG9nZ2VyLmxvZygiSW52YWxpZCBNZW51IEV4dGVuc2lvbiAoUGF0aCBpcyBpbnZhbGlkKTogIiArCi0JCQkJLy8gaWQpOy8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBJTWVudU1hbmFnZXIuZmluZE1lbnVVc2luZ1BhdGgoKSByZXR1cm5zIGludmlzaWJsZSBtZW51IGl0ZW0gaWYKLQkJCS8vIHRoZSBtYW5hZ2VyIGNhbid0IGZpbmQKLQkJCS8vIHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgY3JlYXRlIG5ldyBNZW51TWFuYWdlciBmb3IgaXQuCi0JCQkvLyBJIGRvbid0IGtub3cgdGhpcyBpcyBhIHNwZWNpZmljYXRpb24gb3IgYnVnLgotCQkJLy8gQW55d2F5LCB0byBlbnN1cmUgdGhlIG1lbnUgY2FuIGJlIHZpc2libGUsIHNldFZpc2libGUodHJ1ZSkKLQkJCS8vIG5lZWRzIHRvIGJlIGNhbGxlZC4KLQkJCXBhcmVudC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0KLQkJLy8gRmluZCByZWZlcmVuY2UgZ3JvdXAuCi0JCWlmIChncm91cCA9PSBudWxsKQotCQkJZ3JvdXAgPSBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUzsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2VwID0gcGFyZW50LmZpbmQoZ3JvdXApOwotCQlpZiAoc2VwID09IG51bGwpIHsKLQkJCWlmIChhcHBlbmRJZk1pc3NpbmcpCi0JCQkJcGFyZW50LmFkZChuZXcgU2VwYXJhdG9yKGdyb3VwKSk7Ci0JCQllbHNlIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgTWVudSBFeHRlbnNpb24gKEdyb3VwIGlzIGludmFsaWQpOiAiICsgaWQpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJLy8gSWYgdGhlIG1lbnUgZG9lcyBub3QgZXhpc3QgY3JlYXRlIGl0LgotCQlJTWVudU1hbmFnZXIgbmV3TWVudSA9IHBhcmVudC5maW5kTWVudVVzaW5nUGF0aChpZCk7Ci0JCWlmIChuZXdNZW51ID09IG51bGwpCi0JCQluZXdNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKGxhYmVsLCBpZCk7Ci0KLQkJLy8gQ3JlYXRlIHNlcGFyYXRvcnMuCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkcmVuID0gbWVudUVsZW1lbnQuZ2V0Q2hpbGRyZW4oVEFHX1NFUEFSQVRPUik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWNvbnRyaWJ1dGVTZXBhcmF0b3IobmV3TWVudSwgY2hpbGRyZW5baV0pOwotCQl9Ci0KLQkJLy8gQWRkIG5ldyBtZW51Ci0JCXRyeSB7Ci0JCQlwYXJlbnQuaW5zZXJ0QWZ0ZXIoZ3JvdXAsIG5ld01lbnUpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChHcm91cCBpcyBtaXNzaW5nKTogIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29udHJpYnV0ZXMgYWN0aW9uIGZyb20gYWN0aW9uIGRlc2NyaXB0b3IgaW50byB0aGUgcHJvdmlkZWQgbWVudQotCSAqIG1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIElNZW51TWFuYWdlciBjb250cmlidXRlTWVudUFjdGlvbihBY3Rpb25EZXNjcmlwdG9yIGFkLCBJTWVudU1hbmFnZXIgbWVudSwgYm9vbGVhbiBhcHBlbmRJZk1pc3NpbmcsIGJvb2xlYW4gcG9wdXBtZW51KSB7Ci0JCWlmIChhZC5nZXRDb250cmlidXRpb25JdGVtKCkgPT0gbnVsbCB8fCBhZC5nZXRBY3Rpb24oKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gR2V0IGNvbmZpZyBkYXRhLgotCQlTdHJpbmcgbXBhdGggPSBwb3B1cG1lbnUgPyBhZC5nZXRQb3B1cE1lbnVQYXRoKCkgOiBhZC5nZXRNZW51UGF0aCgpOwotCQlTdHJpbmcgbWdyb3VwID0gcG9wdXBtZW51ID8gYWQuZ2V0UG9wdXBNZW51R3JvdXAoKSA6IGFkLmdldE1lbnVHcm91cCgpOwotCQlpZiAobXBhdGggPT0gbnVsbCAmJiBtZ3JvdXAgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIEZpbmQgcGFyZW50IG1lbnUuCi0JCUlNZW51TWFuYWdlciBwYXJlbnQgPSBtZW51OwotCQlpZiAobXBhdGggIT0gbnVsbCkgewotCQkJcGFyZW50ID0gcGFyZW50LmZpbmRNZW51VXNpbmdQYXRoKG1wYXRoKTsKLQkJCWlmIChwYXJlbnQgPT0gbnVsbCkgewotCQkJCS8vIExvZ2dlci5sb2coIkludmFsaWQgTWVudSBFeHRlbnNpb24gKFBhdGggaXMgaW52YWxpZCk6ICIgKwotCQkJCS8vIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQl9Ci0JCQkvLyBJTWVudU1hbmFnZXIuZmluZE1lbnVVc2luZ1BhdGgoKSByZXR1cm5zIGludmlzaWJsZSBtZW51IGl0ZW0gaWYKLQkJCS8vIHRoZSBtYW5hZ2VyIGNhbid0IGZpbmQKLQkJCS8vIHRoZSBzcGVjaWZpZWQgcGF0aCBhbmQgY3JlYXRlIG5ldyBNZW51TWFuYWdlciBmb3IgaXQuCi0JCQkvLyBJIGRvbid0IGtub3cgdGhpcyBpcyBhIHNwZWNpZmljYXRpb24gb3IgYnVnLgotCQkJLy8gQW55d2F5LCB0byBlbnN1cmUgdGhlIG1lbnUgY2FuIGJlIHZpc2libGUsIHNldFZpc2libGUodHJ1ZSkKLQkJCS8vIG5lZWRzIHRvIGJlIGNhbGxlZC4KLQkJCXBhcmVudC5zZXRWaXNpYmxlKHRydWUpOwotCQl9Ci0KLQkJLy8gRmlyc3QgcmVtb3ZlIGV4aXN0aW5nIG1lbnUgaXRlbQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gcGFyZW50LmZpbmQoYWQuZ2V0SWQoKSk7Ci0JCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCXBhcmVudC5yZW1vdmUoYWQuZ2V0SWQoKSk7Ci0JCX0KLQotCQkvLyBGaW5kIHJlZmVyZW5jZSBncm91cC4KLQkJaWYgKG1ncm91cCA9PSBudWxsKQotCQkJbWdyb3VwID0gSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlM7Ci0JCUlDb250cmlidXRpb25JdGVtIHNlcCA9IHBhcmVudC5maW5kKG1ncm91cCk7Ci0JCWlmIChzZXAgPT0gbnVsbCkgewotCQkJaWYgKGFwcGVuZElmTWlzc2luZykKLQkJCQlwYXJlbnQuYWRkKHNlcCA9IG5ldyBTZXBhcmF0b3IobWdyb3VwKSk7Ci0JCQllbHNlIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgTWVudSBFeHRlbnNpb24gKEdyb3VwIGlzIGludmFsaWQpOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCS8vIEFkZCBhY3Rpb24uCi0JCXRyeSB7Ci0JCQlpZiAocG9wdXBtZW51KSB7Ci0JCQkJLy8gQ29udGV4dCBtZW51IG5lZWQgYSBuZXdseSBjcmVhdGVkIGNvbnRyaWJ1dGlvbiBpdGVtCi0JCQkJaWYgKHNlcCAhPSBudWxsICYmIHNlcC5pc0dyb3VwTWFya2VyKCkpCi0JCQkJCXBhcmVudC5hcHBlbmRUb0dyb3VwKHNlcC5nZXRJZCgpLCBhZC5nZXRBY3Rpb24oKSk7Ci0JCQkJZWxzZQotCQkJCQlwYXJlbnQuaW5zZXJ0QWZ0ZXIobWdyb3VwLCBhZC5nZXRBY3Rpb24oKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBOb3JtYWwgbWVudSBuZWVkIHRvIGFkZCBleGlzdGluZyBjb250cmlidXRpb24gaXRlbSB0bwotCQkJCS8vIHJlbW92ZSBpdCBmcm9tIG1lbnUgbGlzdGVuZXIKLQkJCQlpZiAoc2VwICE9IG51bGwgJiYgc2VwLmlzR3JvdXBNYXJrZXIoKSkKLQkJCQkJcGFyZW50LmFwcGVuZFRvR3JvdXAoc2VwLmdldElkKCksIGFkLmdldENvbnRyaWJ1dGlvbkl0ZW0oKSk7Ci0JCQkJZWxzZQotCQkJCQlwYXJlbnQuaW5zZXJ0QWZ0ZXIobWdyb3VwLCBhZC5nZXRDb250cmlidXRpb25JdGVtKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIE1lbnUgRXh0ZW5zaW9uIChHcm91cCBpcyBtaXNzaW5nKTogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQlwYXJlbnQgPSBudWxsOwotCQl9Ci0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmFtZWQgbWVudSBzZXBhcmF0b3IgZnJvbSB0aGUgaW5mb3JtYXRpb24gaW4gdGhlCi0JICogY29uZmlndXJhdGlvbiBlbGVtZW50LiBJZiB0aGUgc2VwYXJhdG9yIGFscmVhZHkgZXhpc3RzIGRvIG5vdCBjcmVhdGUgYQotCSAqIHNlY29uZC4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjb250cmlidXRlU2VwYXJhdG9yKElNZW51TWFuYWdlciBtZW51LCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgaWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRSk7Ci0JCWlmIChpZCA9PSBudWxsIHx8IGlkLmxlbmd0aCgpIDw9IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlDb250cmlidXRpb25JdGVtIHNlcCA9IG1lbnUuZmluZChpZCk7Ci0JCWlmIChzZXAgIT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJbWVudS5hZGQobmV3IFNlcGFyYXRvcihpZCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBDb250cmlidXRlcyBhY3Rpb24gZnJvbSB0aGUgYWN0aW9uIGRlc2NyaXB0b3IgaW50byB0aGUgcHJvdmlkZWQgdG9vbAotCSAqIGJhciBtYW5hZ2VyLgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGNvbnRyaWJ1dGVUb29sYmFyQWN0aW9uKEFjdGlvbkRlc2NyaXB0b3IgYWQsIElUb29sQmFyTWFuYWdlciB0b29sYmFyLCBib29sZWFuIGFwcGVuZElmTWlzc2luZykgewotCQlpZiAoYWQuZ2V0Q29udHJpYnV0aW9uSXRlbSgpID09IG51bGwgfHwgYWQuZ2V0QWN0aW9uKCkgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQkvLyBHZXQgY29uZmlnIGRhdGEuCi0JCVN0cmluZyB0cGF0aCA9IGFkLmdldFRvb2xiYXJQYXRoKCk7Ci0JCVN0cmluZyB0Z3JvdXAgPSBhZC5nZXRUb29sYmFyR3JvdXAoKTsKLQkJaWYgKHRwYXRoID09IG51bGwgJiYgdGdyb3VwID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gRmlyc3QgcmVtb3ZlIGV4aXN0aW5nIHRvb2xiYXIgaXRlbQotCQlJQ29udHJpYnV0aW9uSXRlbSBpdGVtID0gdG9vbGJhci5maW5kKGFkLmdldElkKCkpOwotCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQl0b29sYmFyLnJlbW92ZShhZC5nZXRJZCgpKTsKLQkJfQotCi0JCS8vIEZpbmQgcmVmZXJlbmNlIGdyb3VwLgotCQlpZiAodGdyb3VwID09IG51bGwpCi0JCQl0Z3JvdXAgPSBJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1CX0FERElUSU9OUzsKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2VwID0gdG9vbGJhci5maW5kKHRncm91cCk7Ci0JCWlmIChzZXAgPT0gbnVsbCkgewotCQkJaWYgKGFwcGVuZElmTWlzc2luZykKLQkJCQl0b29sYmFyLmFkZChuZXcgU2VwYXJhdG9yKHRncm91cCkpOwotCQkJZWxzZSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJJbnZhbGlkIFRvb2xiYXIgRXh0ZW5zaW9uIChHcm91cCBpcyBpbnZhbGlkKTogIiArIGFkLmdldElkKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGFjdGlvbiB0byB0b29sIGJhci4KLQkJdHJ5IHsKLQkJCWlmIChzZXAgIT0gbnVsbCAmJiBzZXAuaXNHcm91cE1hcmtlcigpKQotCQkJCXRvb2xiYXIuYXBwZW5kVG9Hcm91cChzZXAuZ2V0SWQoKSwgYWQuZ2V0QWN0aW9uKCkpOwotCQkJZWxzZQotCQkJCXRvb2xiYXIuaW5zZXJ0QWZ0ZXIodGdyb3VwLCBhZC5nZXRBY3Rpb24oKSk7Ci0JCX0KLQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkludmFsaWQgVG9vbGJhciBFeHRlbnNpb24gKEdyb3VwIGlzIG1pc3NpbmcpOiAiICsgYWQuZ2V0SWQoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGZhY3RvcnkgbWV0aG9kIHJldHVybnMgYSBuZXcgQWN0aW9uRGVzY3JpcHRvciBmb3IgdGhlCi0JICogY29uZmlndXJhdGlvbiBlbGVtZW50LiBJdCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgQWN0aW9uRGVzY3JpcHRvciBjcmVhdGVBY3Rpb25EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCUFjdGlvbkRlc2NyaXB0b3IgYWQgPSBudWxsOwotCQl0cnkgewotCQkJYWQgPSBuZXcgQWN0aW9uRGVzY3JpcHRvcihlbGVtZW50KTsKLQkJCS8vIHRoZXNlIGNhc2VzIGxpa2UgImNsYXNzIG5vdCBmb3VuZCIgYXJlIGhhbmRsZWQKLQkJCS8vIGF0IGxvd2VyIGxldmVsLCBzbyBubyBhY3Rpb24gaWYgZm9ybWVkLiBJbiB0aGF0Ci0JCQkvLyBjYXNlLCB3ZSBhbHNvIGRvbid0IHdhbnQgdG8gZm9ybSBhbiBhY3Rpb24gZGVzY3JpcHRvci4KLQkJCWlmICgoYWQgIT0gbnVsbCkgJiYgKGFkLmdldEFjdGlvbigpID09IG51bGwpKSB7Ci0JCQkJYWQgPSBudWxsOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLnRyYWNlRXhjZXB0aW9uKEVYVEVOREVEX0VESVRPUiwgZSk7Ci0JCQlhZCA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIGFkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcnQgSUQgYXR0cmlidXRlIHRoYXQgaXMgZXhwZWN0ZWQgaW4gdGhlCi0JICogdGFyZ2V0IGV4dGVuc2lvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldElEKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UQVJHRVRfSUQpOwotCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIj8/PyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyBlZGl0b3IgY29udHJpYnV0b3IgaWYgc3BlY2lmaWVkIGRpcmVjdGx5IGluIHRoZSAnZWRpdG9yJwotCSAqIGV4dGVuc2lvbiBwb2ludCwgYW5kIGFsbCBleHRlcm5hbCBjb250cmlidXRpb25zIGZvciB0aGlzIGVkaXRvcidzIElECi0JICogcmVnaXN0ZXJlZCBpbiAnZWRpdG9yQWN0aW9ucycgZXh0ZW5zaW9uIHBvaW50LgotCSAqLwotCXB1YmxpYyBJRXh0ZW5kZWRDb250cmlidXRvciByZWFkQWN0aW9uRXh0ZW5zaW9ucyhTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmV0dXJuIHJlYWRBY3Rpb25FeHRlbnNpb25zKG5ldyBTdHJpbmdbXXtlZGl0b3JJZH0pOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIGVkaXRvciBjb250cmlidXRvciBpZiBzcGVjaWZpZWQgZGlyZWN0bHkgaW4gdGhlICdlZGl0b3InCi0JICogZXh0ZW5zaW9uIHBvaW50LCBhbmQgYWxsIGV4dGVybmFsIGNvbnRyaWJ1dGlvbnMgZm9yIHRoaXMgZWRpdG9yJ3MgSUQKLQkgKiByZWdpc3RlcmVkIGluICdlZGl0b3JBY3Rpb25zJyBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHVibGljIElFeHRlbmRlZENvbnRyaWJ1dG9yIHJlYWRBY3Rpb25FeHRlbnNpb25zKFN0cmluZ1tdIGlkcykgewotCQlsb25nIHRpbWUwID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCUV4dGVuZGVkQ29udHJpYnV0b3IgZXh0ID0gbnVsbDsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoaWRzLCBUQUdfQ09OVFJJQlVUSU9OX1RZUEUsIFBMX0VYVEVOREVEX0VESVRPUl9BQ1RJT05TKTsKLQkJaWYgKGRlYnVnUmVhZFRpbWUpIHsKLQkJCVN0cmluZyBpZGxpc3QgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGlkcy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpZHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWRsaXN0ICs9IGlkc1tpXTsKLQkJCQkJaWYgKGkgPCBpZHMubGVuZ3RoIC0gMSkKLQkJCQkJCWlkbGlzdCArPSAiLCI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI3JlYWRBY3Rpb25FeHRlbnNpb25zKCIgKyBpZGxpc3QgKyAiKTogcmVhZCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIFsiICsgKHJlYWRpbmdDYWNoZSAhPSBudWxsID8gcmVhZGluZ0NhY2hlLnNpemUoKSA6IDApICsgIiBjb250cmlidXRpb25zXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCX0KLQkJaWYgKHJlYWRpbmdDYWNoZSAhPSBudWxsKSB7Ci0JCQlleHQgPSBuZXcgRXh0ZW5kZWRDb250cmlidXRvcihyZWFkaW5nQ2FjaGUpOwotCQkJcmVhZGluZ0NhY2hlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZXh0OwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nW10gaWRzLCBTdHJpbmcgdGFnLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJcmVhZGluZ0NhY2hlID0gbnVsbDsKLQkJdGFyZ2V0SURzID0gQXJyYXlzLmFzTGlzdChpZHMpOwotCQl0YXJnZXRDb250cmlidXRpb25UYWcgPSB0YWc7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlYWRSZWdpc3RyeShyZWdpc3RyeSwgUExVR0lOX0lELCBleHRlbnNpb25Qb2ludCk7Ci0JfQotCi0JLyoqCi0JICogSW1wbGVtZW50cyBhYnN0cmFjdCBtZXRob2QgdG8gaGFuZGxlIHRoZSBwcm92aWRlZCBYTUwgZWxlbWVudCBpbiB0aGUKLQkgKiByZWdpc3RyeS4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCVN0cmluZyBpZCA9IGdldFRhcmdldElEKGVsZW1lbnQpOwotCQkJaWYgKGlkID09IG51bGwgfHwgIXRhcmdldElEcy5jb250YWlucyhpZCkpIHsKLQkJCQkvLyBUaGlzIGlzIG5vdCBvZiBpbnRlcmVzdCB0byB1cyAtIGRvbid0IGdvIGRlZXBlcgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX01FTlUpKSB7Ci0JCQlpZiAocmVhZGluZ0NhY2hlID09IG51bGwpCi0JCQkJcmVhZGluZ0NhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJcmVhZGluZ0NhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBlbGVtZW50IC0gZG9uJ3QgZ28gaW50byBpdAotCQl9Ci0JCWVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX1BPUFVQTUVOVSkpIHsKLQkJCWlmIChyZWFkaW5nQ2FjaGUgPT0gbnVsbCkKLQkJCQlyZWFkaW5nQ2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlyZWFkaW5nQ2FjaGUuYWRkKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7IC8vIGp1c3QgY2FjaGUgdGhlIGVsZW1lbnQgLSBkb24ndCBnbyBpbnRvIGl0Ci0JCX0KLQkJZWxzZSBpZiAodGFnLmVxdWFscyhUQUdfUlVMRVJNRU5VKSkgewotCQkJaWYgKHJlYWRpbmdDYWNoZSA9PSBudWxsKQotCQkJCXJlYWRpbmdDYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlYWRpbmdDYWNoZS5hZGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgZWxlbWVudCAtIGRvbid0IGdvIGludG8gaXQKLQkJfQotCQllbHNlIGlmICh0YWcuZXF1YWxzKFRBR19BQ1RJT04pKSB7Ci0JCQlpZiAocmVhZGluZ0NhY2hlID09IG51bGwpCi0JCQkJcmVhZGluZ0NhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJQWN0aW9uRGVzY3JpcHRvciBhZCA9IGNyZWF0ZUFjdGlvbkRlc2NyaXB0b3IoZWxlbWVudCk7Ci0JCQlpZiAoYWQgIT0gbnVsbCkKLQkJCQlyZWFkaW5nQ2FjaGUuYWRkKGFkKTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBhY3Rpb24gLSBkb24ndCBnbyBpbnRvCi0JCX0KLQkJZWxzZSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZWFkRWxlbWVudENoaWxkcmVuKGVsZW1lbnQpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0V4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQyNWMyZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvRXh0ZW5kZWRFZGl0b3JEcm9wVGFyZ2V0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5ETkQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkZpbGVUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FyZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5UcmFuc2ZlckJ1aWxkZXIuVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZzsKLQotLyoqCi0gKiBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyIGV4dGVuZHMgRHJvcFRhcmdldEFkYXB0ZXIgewotCi0JcHJpdmF0ZSBQb2ludCBjYXJldCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmdbXSBlZGl0b3JJZHM7Ci0JcHJpdmF0ZSBpbnQgb3JnT2Zmc2V0ID0gMDsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJVGV4dFZpZXdlciB0ZXh0Vmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIHVzZVByb3h5OwotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIoYm9vbGVhbiB1c2VQcm94eSkgZm9yCi0JICogICAgICAgICAgICAgdGhlIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIEV4dGVuZGVkRWRpdG9yRHJvcFRhcmdldEFkYXB0ZXIoKSB7Ci0JCXRoaXMoZmFsc2UpOwotCX0KLQotCXB1YmxpYyBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyKGJvb2xlYW4gdXNlUHJveHkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy51c2VQcm94eSA9IHVzZVByb3h5OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGRvRHJvcChUcmFuc2ZlciB0cmFuc2ZlciwgRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCVRyYW5zZmVyQnVpbGRlciB0YiA9IG5ldyBUcmFuc2ZlckJ1aWxkZXIodXNlUHJveHkpOwotCi0JCUlEcm9wQWN0aW9uW10gYXMgPSBudWxsOwotCQlpZiAoZWRpdG9ySWRzICE9IG51bGwgJiYgZWRpdG9ySWRzLmxlbmd0aCA+IDApCi0JCQlhcyA9IHRiLmdldERyb3BBY3Rpb25zKGVkaXRvcklkcywgdHJhbnNmZXIpOwotCQllbHNlCi0JCQlhcyA9IHRiLmdldERyb3BBY3Rpb25zKGdldFRhcmdldEVkaXRvcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpLCB0cmFuc2Zlcik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhcy5sZW5ndGg7ICsraSkgewotCQkJSURyb3BBY3Rpb24gZGEgPSBhc1tpXTsKLQkJCVRyYW5zZmVyIGFjdHVhbFRyYW5zZmVyOwotCQkJaWYgKHRyYW5zZmVyIGluc3RhbmNlb2YgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZykgewotCQkJCWFjdHVhbFRyYW5zZmVyID0gKChUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKSB0cmFuc2ZlcikuZ2V0VHJhbnNmZXJDbGFzcygpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJYWN0dWFsVHJhbnNmZXIgPSB0cmFuc2ZlcjsKLQkJCX0KLQkJCWlmIChhY3R1YWxUcmFuc2ZlciBpbnN0YW5jZW9mIEZpbGVUcmFuc2ZlcikgewotCQkJCWlmIChldmVudC5kYXRhID09IG51bGwpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJObyBkYXRhIGluIERyb3BUYXJnZXRFdmVudCBmcm9tICIgKyBldmVudC53aWRnZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0JCQkJU3RyaW5nW10gc3RycyA9IChTdHJpbmdbXSkgZXZlbnQuZGF0YTsKLQkJCQlib29sZWFuW10gYnMgPSBuZXcgYm9vbGVhbltzdHJzLmxlbmd0aF07Ci0JCQkJaW50IGMgPSAwOwotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgc3Rycy5sZW5ndGg7ICsraikgewotCQkJCQlic1tqXSA9IGZhbHNlOwotCQkJCQlpZiAoZGEuaXNTdXBwb3J0ZWREYXRhKHN0cnNbal0pKSB7Ci0JCQkJCQlldmVudC5kYXRhID0gbmV3IFN0cmluZ1tde3N0cnNbal19OwotCQkJCQkJaWYgKCFkYS5ydW4oZXZlbnQsIHRhcmdldEVkaXRvcikpIHsKLQkJCQkJCQlic1tqXSA9IHRydWU7Ci0JCQkJCQkJYysrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJYnNbal0gPSB0cnVlOwotCQkJCQkJYysrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjID09IDApIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJaW50IGsgPSAwOwotCQkJCVN0cmluZ1tdIHJlc3RzID0gbmV3IFN0cmluZ1tjXTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0cnMubGVuZ3RoOyArK2opIHsKLQkJCQkJaWYgKGJzW2pdKQotCQkJCQkJcmVzdHNbaysrXSA9IHN0cnNbal07Ci0JCQkJfQotCQkJCWV2ZW50LmRhdGEgPSByZXN0czsKLQkJCX0KLQkJCWVsc2UgaWYgKGRhLmlzU3VwcG9ydGVkRGF0YShldmVudC5kYXRhKSkgewotCQkJCWlmIChkYS5ydW4oZXZlbnQsIHRhcmdldEVkaXRvcikpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdFbnRlcihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJY2FyZXQgPSBudWxsOwotCQlUcmFuc2ZlckRhdGEgZGF0YSA9IG51bGw7Ci0JCVRyYW5zZmVyW10gdHMgPSBnZXRUcmFuc2ZlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cy5sZW5ndGg7IGkrKykgewotCQkJZm9yIChpbnQgaiA9IDA7IGogPCBldmVudC5kYXRhVHlwZXMubGVuZ3RoOyBqKyspIHsKLQkJCQlpZiAodHNbaV0uaXNTdXBwb3J0ZWRUeXBlKGV2ZW50LmRhdGFUeXBlc1tqXSkpIHsKLQkJCQkJZGF0YSA9IGV2ZW50LmRhdGFUeXBlc1tqXTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRhdGEgIT0gbnVsbCkgewotCQkJCWV2ZW50LmN1cnJlbnREYXRhVHlwZSA9IGRhdGE7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQlvcmdPZmZzZXQgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRDYXJldE9mZnNldCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgZHJhZ0xlYXZlKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlpZiAodGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQlTdHlsZWRUZXh0IHN0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQlzdC5zZXRDYXJldE9mZnNldChvcmdPZmZzZXQpOwotCQkJc3QucmVkcmF3KCk7Ci0JCQlzdC51cGRhdGUoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQlldmVudC5vcGVyYXRpb25zICY9IH5ETkQuRFJPUF9NT1ZFOwotCQlldmVudC5kZXRhaWwgPSBETkQuRFJPUF9DT1BZOwotCi0JCWlmICh0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCVBvaW50IHB0ID0gdG9Db250cm9sKG5ldyBQb2ludChldmVudC54LCBldmVudC55KSk7Ci0JCQlTdHlsZWRUZXh0IHN0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0KLQkJCS8vIGF1dG8gc2Nyb2xsCi0JCQlSZWN0YW5nbGUgY2EgPSBzdC5nZXRDbGllbnRBcmVhKCk7Ci0JCQlpbnQgbWFyZ2luID0gc3QuZ2V0TGluZUhlaWdodCgpOwotCi0JCQlpZiAocHQueSA8IG1hcmdpbikgeyAvLyB1cAotCQkJCXN0Lmludm9rZUFjdGlvbihTVC5MSU5FX1VQKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHB0LnkgPiBjYS5oZWlnaHQgLSBtYXJnaW4pIHsgLy8gZG93bgotCQkJCXN0Lmludm9rZUFjdGlvbihTVC5MSU5FX0RPV04pOwotCQkJfQotCi0JCQkvLyBkcmF3IGluc2VydGlvbiBwb2ludAotCQkJaW50IG9mZnNldCA9IGdldERyb3BPZmZzZXQoc3QsIHB0KTsKLQkJCWlmIChvZmZzZXQgIT0gc3QuZ2V0Q2FyZXRPZmZzZXQoKSkgewotCQkJCXN0LnNldENhcmV0T2Zmc2V0KG9mZnNldCk7Ci0JCQkJc3Quc2V0U2VsZWN0aW9uKG9mZnNldCk7Ci0JCQl9Ci0KLQkJCVBvaW50IG5ld0NhcmV0ID0gc3QuZ2V0TG9jYXRpb25BdE9mZnNldChvZmZzZXQpOwotCQkJaWYgKG5ld0NhcmV0LmVxdWFscyhjYXJldCkpCi0JCQkJcmV0dXJuOwotCi0JCQlDYXJldCBjdCA9IHN0LmdldENhcmV0KCk7Ci0JCQlQb2ludCBzaXplID0gY3QuZ2V0U2l6ZSgpOwotCi0JCQlHQyBnYyA9IG5ldyBHQyhzdCk7Ci0JCQlnYy5zZXRMaW5lV2lkdGgoc2l6ZS54KTsKLQotCQkJLy8gZXJhc2Ugb2xkIGNhcmV0Ci0JCQlpZiAoY2FyZXQgIT0gbnVsbCkgewotCQkJCUNvbG9yIG9yaWdpbmFsRm9yZWdyb3VuZCA9IGdjLmdldEZvcmVncm91bmQoKTsKLQkJCQlnYy5zZXRGb3JlZ3JvdW5kKHN0LmdldEJhY2tncm91bmQoKSk7Ci0JCQkJZ2MuZHJhd1JlY3RhbmdsZShjYXJldC54LCBjYXJldC55LCBzaXplLngsIHNpemUueSk7Ci0JCQkJZ2Muc2V0Rm9yZWdyb3VuZChvcmlnaW5hbEZvcmVncm91bmQpOwotCQkJfQotCi0JCQlzdC5yZWRyYXcoKTsKLQkJCXN0LnVwZGF0ZSgpOwotCi0JCQkvLyBkcmF3IG5ldyBjYXJldAotCQkJY2FyZXQgPSBuZXdDYXJldDsKLQkJCWlmIChjdC5nZXRJbWFnZSgpICE9IG51bGwpCi0JCQkJZ2MuZHJhd0ltYWdlKGN0LmdldEltYWdlKCksIGNhcmV0LngsIGNhcmV0LnkpOwotCQkJZWxzZSB7Ci0JCQkJZ2MuZHJhd0xpbmUoY2FyZXQueCwgY2FyZXQueSwgY2FyZXQueCwgY2FyZXQueSArIHNpemUueSk7Ci0JCQl9Ci0KLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGRyb3AoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5vcGVyYXRpb25zID09IERORC5EUk9QX05PTkUpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCkgewotCQkJUG9pbnQgcHQgPSB0b0NvbnRyb2wobmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLQkJCVN0eWxlZFRleHQgc3QgPSB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQotCQkJaW50IG9mZnNldCA9IGdldERyb3BPZmZzZXQoc3QsIHB0KTsKLQkJCWlmIChvZmZzZXQgIT0gc3QuZ2V0Q2FyZXRPZmZzZXQoKSkgewotCQkJCXN0LnNldENhcmV0T2Zmc2V0KG9mZnNldCk7Ci0JCQl9Ci0KLQkJCS8vIElTZWxlY3Rpb25Qcm92aWRlciBzcCA9IHRleHRWaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCS8vIElTZWxlY3Rpb24gc2VsID0gbmV3IFRleHRTZWxlY3Rpb24ob2Zmc2V0LCAwKTsKLQkJCS8vIHNwLnNldFNlbGVjdGlvbihzZWwpOwotCQkJLy8gQlVHMTQ1MzkyIC0gbmVlZCB0byBhY2NvdW50IGZvciBmb2xkZWQgcmVnaW9ucwotCQkJaWYgKHRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCQlvZmZzZXQgPSAoKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdGV4dFZpZXdlcikud2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KG9mZnNldCk7Ci0JCQl9Ci0JCQl0ZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2Uob2Zmc2V0LCAwKTsKLQkJfQotCi0JCVRyYW5zZmVyW10gdHMgPSBnZXRUcmFuc2ZlcnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKHRzW2ldLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpKSB7Ci0JCQkJaWYgKGRvRHJvcCh0c1tpXSwgZXZlbnQpKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0RHJvcE9mZnNldChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJUG9pbnQgcHQgPSBnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLnRvQ29udHJvbChuZXcgUG9pbnQoZXZlbnQueCwgZXZlbnQueSkpOwotCQlTdHlsZWRUZXh0IHN0ID0gdGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCXJldHVybiBnZXREcm9wT2Zmc2V0KHN0LCBwdCk7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0RHJvcE9mZnNldChTdHlsZWRUZXh0IHN0LCBQb2ludCBwdCkgewotCQlpbnQgb2Zmc2V0ID0gc3QuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJdHJ5IHsKLQkJCW9mZnNldCA9IHN0LmdldE9mZnNldEF0TG9jYXRpb24ocHQpOwotCQl9Ci0JCWNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotCQkJLy8gVGhpcyBpcyBub3JtYWwgY2FzZSBpZiBtb3VzZSBjdXJzb3IgaXMgb24gb3V0c2lkZSBvZiB2YWxpZAotCQkJLy8gdGV4dC4KLQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCVBvaW50IHAgPSBuZXcgUG9pbnQoKHB0LnggPiAwID8gcHQueCA6IDApLCBwdC55KTsKLQkJCS8vIHNlYXJjaCBuZWFyZXN0IGNoYXJhY3RlcgotCQkJZm9yICg7IHAueCA+IC0xOyBwLngtLSkgewotCQkJCXRyeSB7Ci0JCQkJCW9mZnNldCA9IHN0LmdldE9mZnNldEF0TG9jYXRpb24ocCk7Ci0KLQkJCQkJLyoKLQkJCQkJICogTm93IHRoYXQgYSB2YWxpZCBvZmZzZXQgaGFzIGJlZW4gZm91bmQsIHRyeSB0byBwbGFjZSBhdAotCQkJCQkgKiB0aGUgZW5kIG9mIHRoZSBsaW5lCi0JCQkJCSAqLwotCQkJCQkvKgotCQkJCQkgKiBwYXJ0aWFsIGxpbmUgZm9sZGluZyBpbnZhbGlkYXRlcyBhbnkgIm1vdmUgdG8gRU9MIgotCQkJCQkgKiBhY3Rpb24gd2UgbWlnaHQgdGFrZQotCQkJCQkgKi8KLQkJCQkJLy8gaWYgKHRleHRWaWV3ZXIgIT0gbnVsbCAmJiB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkgIT0KLQkJCQkJLy8gbnVsbCkgewotCQkJCQkvLyBJUmVnaW9uIGxpbmVJbmZvID0gbnVsbDsKLQkJCQkJLy8gdHJ5IHsKLQkJCQkJLy8gaWYgKHRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCQkJLy8gbGluZUluZm8gPQotCQkJCQkvLyB0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoKChJVGV4dFZpZXdlckV4dGVuc2lvbjUpdGV4dFZpZXdlcikud2lkZ2V0T2Zmc2V0Mk1vZGVsT2Zmc2V0KG9mZnNldCkpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIGVsc2UgewotCQkJCQkvLyBsaW5lSW5mbyA9Ci0JCQkJCS8vIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCQkJCQkvLyB9Ci0JCQkJCS8vIH0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCS8vIH0KLQkJCQkJLy8gaWYgKGxpbmVJbmZvICE9IG51bGwpCi0JCQkJCS8vIG9mZnNldCA9IGxpbmVJbmZvLmdldE9mZnNldCgpICsgbGluZUluZm8uZ2V0TGVuZ3RoKCk7Ci0JCQkJCS8vIH0KLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotCQkJCX0KLQkJCX0KLQotCQkJaWYgKCFmb3VuZCkgewotCQkJCW9mZnNldCA9IHN0LmdldENoYXJDb3VudCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvZmZzZXQ7Ci0JfQotCi0JcHVibGljIElFZGl0b3JQYXJ0IGdldFRhcmdldEVkaXRvcigpIHsKLQkJcmV0dXJuIHRhcmdldEVkaXRvcjsKLQl9Ci0KLQlwdWJsaWMgSVRleHRWaWV3ZXIgZ2V0VGV4dFZpZXdlcigpIHsKLQkJcmV0dXJuIHRleHRWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyW10KLQkgKi8KLQlwdWJsaWMgVHJhbnNmZXJbXSBnZXRUcmFuc2ZlcnMoKSB7Ci0JCWlmICh0cmFuc2ZlcnMgPT0gbnVsbCkgewotCQkJVHJhbnNmZXJCdWlsZGVyIHRiID0gbmV3IFRyYW5zZmVyQnVpbGRlcih1c2VQcm94eSk7Ci0JCQlpZiAoZWRpdG9ySWRzID09IG51bGwgfHwgZWRpdG9ySWRzLmxlbmd0aCA9PSAwKQotCQkJCXRyYW5zZmVycyA9IHRiLmdldERyb3BUYXJnZXRUcmFuc2ZlcnMoZ2V0VGFyZ2V0RWRpdG9yKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCQkJZWxzZQotCQkJCXRyYW5zZmVycyA9IHRiLmdldERyb3BUYXJnZXRUcmFuc2ZlcnMoZWRpdG9ySWRzKTsKLQkJfQotCQlyZXR1cm4gdHJhbnNmZXJzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRhcmdldEVkaXRvcihJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJdGhpcy50YXJnZXRFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0SURzKFN0cmluZ1tdIGlkcykgewotCQllZGl0b3JJZHMgPSBpZHM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dFZpZXdlcihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCXRoaXMudGV4dFZpZXdlciA9IHRleHRWaWV3ZXI7Ci0JfQotCi0JcHJpdmF0ZSBQb2ludCB0b0NvbnRyb2woUG9pbnQgcG9pbnQpIHsKLQkJcmV0dXJuICh0ZXh0Vmlld2VyICE9IG51bGwgPyB0ZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKS50b0NvbnRyb2wocG9pbnQpIDogcG9pbnQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9GaWxlRHJvcEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0ZpbGVEcm9wQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4YTNiMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0ZpbGVEcm9wQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUm9vdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIEFjdGlvbiBmb3IgZmlsZSBkcm9wCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWxlRHJvcEFjdGlvbiBleHRlbmRzIEFic3RyYWN0RHJvcEFjdGlvbiB7Ci0JcHVibGljIGJvb2xlYW4gcnVuKERyb3BUYXJnZXRFdmVudCBldmVudCwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCVN0cmluZ1tdIHN0cnMgPSAoU3RyaW5nW10pIGV2ZW50LmRhdGE7Ci0JCWlmIChzdHJzID09IG51bGwgfHwgc3Rycy5sZW5ndGggPT0gMCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJU3RyaW5nIHN0ciA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgc3Rycy5sZW5ndGg7ICsraSkgewotCQkJSVBhdGggcGF0aCA9IG5ldyBQYXRoKHN0cnNbaV0pOwotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0JCQlJRmlsZSBmaWxlID0gcm9vdC5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcGF0aCA9IGZpbGUuZ2V0UHJvamVjdFJlbGF0aXZlUGF0aCgpOwotCQkJfQotCi0JCQlzdHIgKz0gIlwiIiArIHBhdGgudG9TdHJpbmcoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJcmV0dXJuIGluc2VydChzdHIsIHRhcmdldEVkaXRvcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0Zvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YmFkZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0Zvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQlwcml2YXRlIHN0YXRpYyBGb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyIGluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpIHsKLQkJCWluc3RhbmNlID0gbmV3IEZvcm1hdFByb2Nlc3NvcnNFeHRlbnNpb25SZWFkZXIoKTsKLQotCQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJCWluc3RhbmNlLnJlYWRSZWdpc3RyeShyZWdpc3RyeSwgIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZSIsICJmb3JtYXRQcm9jZXNzb3JzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JIFRPRE86IHByaXZhdGUgZmllbGQgbmV2ZXIgcmVhZCBsb2NhbGx5Ci0JU3RyaW5nIHByb2Nlc3NvckNsYXNzTmFtZTsKLQotCXB1YmxpYyBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBnZXRGb3JtYXRQcm9jZXNzb3IoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJaWYgKGNvbnRlbnRUeXBlSWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGZvcm1hdFByb2Nlc3NvciA9IG51bGw7Ci0JCWlmIChtYXAuY29udGFpbnNLZXkoY29udGVudFR5cGVJZCkpIHsKLQkJCWZvcm1hdFByb2Nlc3NvciA9IChJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcikgbWFwLmdldChjb250ZW50VHlwZUlkKTsKLQkJfSBlbHNlIHsKLQkJCUlDb250ZW50VHlwZU1hbmFnZXIgbWFuYWdlciA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpOwotCQkJSUNvbnRlbnRUeXBlIHF1ZXJ5Q29udGVudFR5cGUgPSBtYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQkJYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotCQkJZm9yIChJdGVyYXRvciBpdGVyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykgewotCQkJCVN0cmluZyBlbGVtZW50Q29udGVudFR5cGVJZCA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotCQkJCUlDb250ZW50VHlwZSBlbGVtZW50Q29udGVudFR5cGUgPSBtYW5hZ2VyLmdldENvbnRlbnRUeXBlKGVsZW1lbnRDb250ZW50VHlwZUlkKTsKLQkJCQlpZiAocXVlcnlDb250ZW50VHlwZS5pc0tpbmRPZihlbGVtZW50Q29udGVudFR5cGUpKSB7Ci0JCQkJCWZvcm1hdFByb2Nlc3NvciA9IChJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcikgbWFwLmdldChlbGVtZW50Q29udGVudFR5cGVJZCk7Ci0JCQkJCW1hcC5wdXQoY29udGVudFR5cGVJZCwgZm9ybWF0UHJvY2Vzc29yKTsKLQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghZm91bmQpCi0JCQkJbWFwLnB1dChjb250ZW50VHlwZUlkLCBudWxsKTsKLQkJfQotCi0JCXJldHVybiBmb3JtYXRQcm9jZXNzb3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlciNyZWFkRWxlbWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50KQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoInByb2Nlc3NvciIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBjb250ZW50VHlwZUlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImNvbnRlbnRUeXBlSWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHByb2Nlc3NvckNsYXNzTmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgcGx1Z2luSUQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JRCk7Ci0KLQkJCXRyeSB7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgcHJvY2Vzc29yID0gKElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yKWJ1bmRsZS5sb2FkQ2xhc3MocHJvY2Vzc29yQ2xhc3NOYW1lKS5uZXdJbnN0YW5jZSgpOwotCQkJCW1hcC5wdXQoY29udGVudFR5cGVJZCwgcHJvY2Vzc29yKTsKLQotCQkJCXJldHVybiB0cnVlOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQl9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Hb3RvQW5ub3RhdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0dvdG9Bbm5vdGF0aW9uQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZWRlZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0dvdG9Bbm5vdGF0aW9uQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWRpdG9yU3RhdHVzTGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci0KLS8qKgotICogQmFzZWQgb24gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLmphdmFlZGl0b3IuR290b0Fubm90YXRpb25BY3Rpb24gYW5kCi0gKiB0aGUgb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLkphdmFFZGl0b3IncyBnb3RvRXJyb3IoKSBtZXRob2QuIFJld3JpdHRlbgotICogYmFzZWQgb24gMy4wTTcgdmVyc2lvbiB0byBvcGVyYXRlIGdlbmVyaWNhbGx5LgotICogCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkdvdG9Bbm5vdGF0aW9uQWN0aW9uCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEdvdG9Bbm5vdGF0aW9uQWN0aW9uIGV4dGVuZHMgVGV4dEVkaXRvckFjdGlvbiB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9kZWJ1ZyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL2dvdG9OZXh0QW5ub3RhdGlvbiIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBzdGF0dXMgbGluZSBvbiBzZWxlY3Rpb24gY2hhbmdlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgU3RhdHVzTGluZUNsZWFyZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJSVN0YXR1c0xpbmVNYW5hZ2VyIGZTdGF0dXNMaW5lTWFuYWdlciA9IG51bGw7Ci0KLQkJcHJvdGVjdGVkIFN0YXR1c0xpbmVDbGVhcmVyKElTdGF0dXNMaW5lTWFuYWdlciBtZ3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQlmU3RhdHVzTGluZU1hbmFnZXIgPSBtZ3I7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIjc2VsZWN0aW9uQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoU3RhdHVzTGluZUNsZWFyZXIudGhpcyk7Ci0KLQkJCWZTdGF0dXNMaW5lTWFuYWdlci5zZXRFcnJvck1lc3NhZ2UobnVsbCwgbnVsbCk7Ci0JCQlmU3RhdHVzTGluZU1hbmFnZXIuc2V0TWVzc2FnZShudWxsLCBudWxsKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBmRm9yd2FyZDsKLQlwcml2YXRlIFN0cmluZyBmTGFiZWw7Ci0KLQlwcml2YXRlIFN0cmluZyBmUHJlZml4OwotCi0JLyoqCi0JICogQHBhcmFtIHByZWZpeAotCSAqIEBwYXJhbSBlZGl0b3IKLQkgKi8KLQlwdWJsaWMgR290b0Fubm90YXRpb25BY3Rpb24oU3RyaW5nIHByZWZpeCwgYm9vbGVhbiBmb3J3YXJkKSB7Ci0JCXN1cGVyKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgcHJlZml4LCBudWxsKTsKLQkJZkZvcndhcmQgPSBmb3J3YXJkOwotCQlmUHJlZml4ID0gcHJlZml4OwotCQlmTGFiZWwgPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGZQcmVmaXgpOwotCX0KLQotCS8qCi0JICogVGhpcyBpcyB0aGUgZGVmYXVsdCBsYWJlbCB1c2VkIGZvciBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdExhYmVsKCkgewotCQlyZXR1cm4gZkxhYmVsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXREZXNjcmlwdGlvbigpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIGdldERlZmF1bHRMYWJlbCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFubm90YXRpb24gY2xvc2VzdCB0byB0aGUgZ2l2ZW4gcmFuZ2UgcmVzcGVjdGluZyB0aGUgZ2l2ZW4KLQkgKiBkaXJlY3Rpb24uIElmIGFuIGFubm90YXRpb24gaXMgZm91bmQsIHRoZSBhbm5vdGF0aW9ucyBjdXJyZW50IHBvc2l0aW9uCi0JICogaXMgY29waWVkIGludG8gdGhlIHByb3ZpZGVkIGFubm90YXRpb24gcG9zaXRpb24uCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIHJlZ2lvbiBvZmZzZXQKLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgcmVnaW9uIGxlbmd0aAotCSAqIEBwYXJhbSBmb3J3YXJkCi0JICogICAgICAgICAgICA8Y29kZT50cnVlPC9jb2RlPiBmb3IgZm9yd2FyZHMsIDxjb2RlPmZhbHNlPC9jb2RlPiBmb3IKLQkgKiAgICAgICAgICAgIGJhY2t3YXJkCi0JICogQHBhcmFtIGFubm90YXRpb25Qb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIG9mIHRoZSBmb3VuZCBhbm5vdGF0aW9uCi0JICogQHJldHVybiB0aGUgZm91bmQgYW5ub3RhdGlvbgotCSAqLwotCXByb3RlY3RlZCBBbm5vdGF0aW9uIGdldE5leHRBbm5vdGF0aW9uKGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW5ndGgsIGJvb2xlYW4gZm9yd2FyZCwgUG9zaXRpb24gYW5ub3RhdGlvblBvc2l0aW9uKSB7Ci0JCUFubm90YXRpb24gbmV4dEFubm90YXRpb24gPSBudWxsOwotCQlQb3NpdGlvbiBuZXh0QW5ub3RhdGlvblBvc2l0aW9uID0gbnVsbDsKLQkJQW5ub3RhdGlvbiBjb250YWluaW5nQW5ub3RhdGlvbiA9IG51bGw7Ci0JCVBvc2l0aW9uIGNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24gPSBudWxsOwotCQlib29sZWFuIGN1cnJlbnRBbm5vdGF0aW9uID0gZmFsc2U7Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0VGV4dEVkaXRvcigpLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCWludCBlbmRPZkRvY3VtZW50ID0gZG9jdW1lbnQuZ2V0TGVuZ3RoKCk7Ci0JCWludCBkaXN0YW5jZSA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCS8vIGV4dGVybmFsIGZpbGVzIG1heSBub3QgaGF2ZSBhbiBhbm5vdGF0aW9uIG1vZGVsCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc05hdmlnYXRpb25UYXJnZXQoYSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldFBvc2l0aW9uKGEpOwotCQkJCWlmIChwID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKGZvcndhcmQgJiYgcC5vZmZzZXQgPT0gb2Zmc2V0IHx8ICFmb3J3YXJkICYmIHAub2Zmc2V0ICsgcC5nZXRMZW5ndGgoKSA9PSBvZmZzZXQgKyBsZW5ndGgpIHsKLQkJCQkJaWYgKGNvbnRhaW5pbmdBbm5vdGF0aW9uID09IG51bGwgfHwgKGZvcndhcmQgJiYgcC5sZW5ndGggPj0gY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbi5sZW5ndGggfHwgIWZvcndhcmQgJiYgcC5sZW5ndGggPj0gY29udGFpbmluZ0Fubm90YXRpb25Qb3NpdGlvbi5sZW5ndGgpKSB7Ci0JCQkJCQljb250YWluaW5nQW5ub3RhdGlvbiA9IGE7Ci0JCQkJCQljb250YWluaW5nQW5ub3RhdGlvblBvc2l0aW9uID0gcDsKLQkJCQkJCWN1cnJlbnRBbm5vdGF0aW9uID0gcC5sZW5ndGggPT0gbGVuZ3RoOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnQgY3VycmVudERpc3RhbmNlID0gMDsKLQotCQkJCQlpZiAoZm9yd2FyZCkgewotCQkJCQkJY3VycmVudERpc3RhbmNlID0gcC5nZXRPZmZzZXQoKSAtIG9mZnNldDsKLQkJCQkJCWlmIChjdXJyZW50RGlzdGFuY2UgPCAwKSB7Ci0JCQkJCQkJY3VycmVudERpc3RhbmNlID0gZW5kT2ZEb2N1bWVudCArIGN1cnJlbnREaXN0YW5jZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKGN1cnJlbnREaXN0YW5jZSA8IGRpc3RhbmNlIHx8IGN1cnJlbnREaXN0YW5jZSA9PSBkaXN0YW5jZSAmJiBwLmxlbmd0aCA8IG5leHRBbm5vdGF0aW9uUG9zaXRpb24ubGVuZ3RoKSB7Ci0JCQkJCQkJZGlzdGFuY2UgPSBjdXJyZW50RGlzdGFuY2U7Ci0JCQkJCQkJbmV4dEFubm90YXRpb24gPSBhOwotCQkJCQkJCW5leHRBbm5vdGF0aW9uUG9zaXRpb24gPSBwOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJY3VycmVudERpc3RhbmNlID0gb2Zmc2V0ICsgbGVuZ3RoIC0gKHAuZ2V0T2Zmc2V0KCkgKyBwLmxlbmd0aCk7Ci0JCQkJCQlpZiAoY3VycmVudERpc3RhbmNlIDwgMCkKLQkJCQkJCQljdXJyZW50RGlzdGFuY2UgPSBlbmRPZkRvY3VtZW50ICsgY3VycmVudERpc3RhbmNlOwotCi0JCQkJCQlpZiAoY3VycmVudERpc3RhbmNlIDwgZGlzdGFuY2UgfHwgY3VycmVudERpc3RhbmNlID09IGRpc3RhbmNlICYmIHAubGVuZ3RoIDwgbmV4dEFubm90YXRpb25Qb3NpdGlvbi5sZW5ndGgpIHsKLQkJCQkJCQlkaXN0YW5jZSA9IGN1cnJlbnREaXN0YW5jZTsKLQkJCQkJCQluZXh0QW5ub3RhdGlvbiA9IGE7Ci0JCQkJCQkJbmV4dEFubm90YXRpb25Qb3NpdGlvbiA9IHA7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24gIT0gbnVsbCAmJiAoIWN1cnJlbnRBbm5vdGF0aW9uIHx8IG5leHRBbm5vdGF0aW9uID09IG51bGwpKSB7Ci0JCQlhbm5vdGF0aW9uUG9zaXRpb24uc2V0T2Zmc2V0KGNvbnRhaW5pbmdBbm5vdGF0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJYW5ub3RhdGlvblBvc2l0aW9uLnNldExlbmd0aChjb250YWluaW5nQW5ub3RhdGlvblBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCXJldHVybiBjb250YWluaW5nQW5ub3RhdGlvbjsKLQkJfQotCQlpZiAobmV4dEFubm90YXRpb25Qb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uUG9zaXRpb24uc2V0T2Zmc2V0KG5leHRBbm5vdGF0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJYW5ub3RhdGlvblBvc2l0aW9uLnNldExlbmd0aChuZXh0QW5ub3RhdGlvblBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJfQotCi0JCXJldHVybiBuZXh0QW5ub3RhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIElTdGF0dXNMaW5lTWFuYWdlciBnZXRTdGF0dXNMaW5lTWFuYWdlcigpIHsKLQkJLy8gVGhlIG9yaWdpbmFsIEphdmFFZGl0b3IgTTcgaW1wbGVtZW50YXRpb24gbWFkZSB1c2Ugb2YgYW4gYWRhcHRlciwKLQkJLy8gYnV0IHRoYXQgYXBwcm9hY2gKLQkJLy8gZmFpbHMgd2l0aCBhIE11bHRpUGFnZUVkaXRvclNpdGUKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChwYWdlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJaWYgKGVkaXRvciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IGVkaXRvci5nZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJaWYgKGNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCXJldHVybiAoKEVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBjb250cmlidXRvcikuZ2V0QWN0aW9uQmFycygpLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdExhYmVsKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZ2V0RGVmYXVsdExhYmVsKCk7Ci0JfQotCi0JLyoqCi0JICogSnVtcHMgdG8gdGhlIGVycm9yIG5leHQgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBkaXJlY3Rpb24gYmFzZWQgb2ZmCi0JICogSmF2YUVkaXRvciNnb3RvQW5ub3RhdGlvbigpCi0JICogCi0JICogQHBhcmFtIGZvcndhcmQKLQkgKiAgICAgICAgICAgIGlzIHRoZSBkaXJlY3Rpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBnb3RvQW5ub3RhdGlvbihib29sZWFuIGZvcndhcmQpIHsKLQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJUG9zaXRpb24gcG9zaXRpb24gPSBuZXcgUG9zaXRpb24oMCwgMCk7Ci0JCWlmIChmYWxzZSAvKiBkZWxheWVkIC0gc2VlIGJ1ZyAxODMxNiAqLykgewotCQkJZ2V0TmV4dEFubm90YXRpb24oc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCksIGZvcndhcmQsIHBvc2l0aW9uKTsKLQkJCWdldFRleHRFZGl0b3IoKS5zZWxlY3RBbmRSZXZlYWwocG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJfQotCQllbHNlIC8qIG5vIGRlbGF5IC0gc2VlIGJ1ZyAxODMxNiAqL3sKLQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldE5leHRBbm5vdGF0aW9uKHNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgc2VsZWN0aW9uLmdldExlbmd0aCgpLCBmb3J3YXJkLCBwb3NpdGlvbik7Ci0JCQlJRWRpdG9yU3RhdHVzTGluZSBlZGl0b3JTdGF0dXNMaW5lID0gKElFZGl0b3JTdGF0dXNMaW5lKSBnZXRUZXh0RWRpdG9yKCkuZ2V0QWRhcHRlcihJRWRpdG9yU3RhdHVzTGluZS5jbGFzcyk7Ci0JCQlpZiAoZWRpdG9yU3RhdHVzTGluZSAhPSBudWxsKSB7Ci0JCQkJZWRpdG9yU3RhdHVzTGluZS5zZXRNZXNzYWdlKHRydWUsIG51bGwsIG51bGwpOwotCQkJCWVkaXRvclN0YXR1c0xpbmUuc2V0TWVzc2FnZShmYWxzZSwgbnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJU3RhdHVzTGluZU1hbmFnZXIgbWdyID0gZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJCQlpZiAobWdyICE9IG51bGwpIHsKLQkJCQkJbWdyLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQkJbWdyLnNldE1lc3NhZ2UobnVsbCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXVwZGF0ZUFubm90YXRpb25WaWV3cyhhbm5vdGF0aW9uKTsKLQkJCQlpZiAoX2RlYnVnKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2VsZWN0IGFuZCByZXZlYWwgIiArIGFubm90YXRpb24uZ2V0VHlwZSgpICsgIkAiICsgcG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyAiOiIgKyBwb3NpdGlvbi5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJfQotCQkJCWdldFRleHRFZGl0b3IoKS5zZWxlY3RBbmRSZXZlYWwocG9zaXRpb24uZ2V0T2Zmc2V0KCksIHBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCQlpZiAoZWRpdG9yU3RhdHVzTGluZSAhPSBudWxsKSB7Ci0JCQkJCWVkaXRvclN0YXR1c0xpbmUuc2V0TWVzc2FnZSh0cnVlLCBudWxsLCBudWxsKTsKLQkJCQkJZWRpdG9yU3RhdHVzTGluZS5zZXRNZXNzYWdlKGZhbHNlLCBhbm5vdGF0aW9uLmdldFRleHQoKSwgbnVsbCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlJU3RhdHVzTGluZU1hbmFnZXIgbWdyID0gZ2V0U3RhdHVzTGluZU1hbmFnZXIoKTsKLQkJCQkJaWYgKG1nciAhPSBudWxsKSB7Ci0JCQkJCQltZ3Iuc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJCQkJbWdyLnNldE1lc3NhZ2UobnVsbCwgYW5ub3RhdGlvbi5nZXRUZXh0KCkpOwotCQkJCQl9Ci0JCQkJCWdldFRleHRFZGl0b3IoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgU3RhdHVzTGluZUNsZWFyZXIobWdyKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBhbm5vdGF0aW9uIGlzIGNvbmZpZ3VyZWQgYXMgYSB0YXJnZXQgZm9yIHRoZQotCSAqICJHbyB0byBOZXh0L1ByZXZpb3VzIEFubm90YXRpb24iIGFjdGlvbnMKLQkgKiAKLQkgKiBAcGFyYW0gYW5ub3RhdGlvbgotCSAqICAgICAgICAgICAgdGhlIGFubm90YXRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgaXMgYSB0YXJnZXQsIDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlCi0JICogQHNlZSBFY2xpcHNlIDMuMAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGlzTmF2aWdhdGlvblRhcmdldChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBFZGl0b3JzVUkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJQW5ub3RhdGlvblByZWZlcmVuY2UgcHJlZmVyZW5jZSA9IEVkaXRvcnNVSS5nZXRBbm5vdGF0aW9uUHJlZmVyZW5jZUxvb2t1cCgpLmdldEFubm90YXRpb25QcmVmZXJlbmNlKGFubm90YXRpb24pOwotCQkvLyBTZWUgYnVnIDQxNjg5Ci0JCS8vIFN0cmluZyBrZXk9IGZvcndhcmQgPyBwcmVmZXJlbmNlLmdldElzR29Ub05leHROYXZpZ2F0aW9uVGFyZ2V0S2V5KCkKLQkJLy8gOiBwcmVmZXJlbmNlLmdldElzR29Ub1ByZXZpb3VzTmF2aWdhdGlvblRhcmdldEtleSgpOwotCQlTdHJpbmcga2V5ID0gcHJlZmVyZW5jZSA9PSBudWxsID8gbnVsbCA6IHByZWZlcmVuY2UuZ2V0SXNHb1RvTmV4dE5hdmlnYXRpb25UYXJnZXRLZXkoKTsKLQkJcmV0dXJuIChrZXkgIT0gbnVsbCAmJiBwcmVmZXJlbmNlcy5nZXRCb29sZWFuKGtleSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZ290b0Fubm90YXRpb24oZkZvcndhcmQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEVkaXRvcihJVGV4dEVkaXRvciBlZGl0b3IpIHsKLQkJc3VwZXIuc2V0RWRpdG9yKGVkaXRvcik7Ci0JCXVwZGF0ZSgpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgdGhlIGFubm90YXRpb24gdmlld3MgdGhhdCBzaG93IHRoZSBnaXZlbiBhbm5vdGF0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUFubm90YXRpb25WaWV3cyhBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJSU1hcmtlciBtYXJrZXIgPSBudWxsOwotCQlpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIE1hcmtlckFubm90YXRpb24pCi0JCQltYXJrZXIgPSAoKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldE1hcmtlcigpOwotCi0JCWlmIChtYXJrZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJCQlJVmlld1BhcnQgdmlldyA9IG51bGw7Ci0JCQkJCQlpZiAobWFya2VyLmlzU3VidHlwZU9mKElNYXJrZXIuUFJPQkxFTSkpIHsKLQkJCQkJCQl2aWV3ID0gcGFnZS5maW5kVmlldyhJUGFnZUxheW91dC5JRF9QUk9CTEVNX1ZJRVcpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobWFya2VyLmlzU3VidHlwZU9mKElNYXJrZXIuVEFTSykpIHsKLQkJCQkJCQl2aWV3ID0gcGFnZS5maW5kVmlldyhJUGFnZUxheW91dC5JRF9UQVNLX0xJU1QpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobWFya2VyLmlzU3VidHlwZU9mKElNYXJrZXIuQk9PS01BUkspKSB7Ci0JCQkJCQkJdmlldyA9IHBhZ2UuZmluZFZpZXcoSVBhZ2VMYXlvdXQuSURfQk9PS01BUktTKTsKLQkJCQkJCX0KLQkJCQkJCS8vIElmIHRoZSB2aWV3IGlzbid0IG9wZW4gb24gdGhpcyBwZXJzcGVjdGl2ZSwgZG9uJ3QKLQkJCQkJCS8vIGludGVyYWN0IHdpdGggaXQKLQkJCQkJCWlmICh2aWV3ICE9IG51bGwpIHsKLQkJCQkJCQlNZXRob2QgbWV0aG9kID0gdmlldy5nZXRDbGFzcygpLmdldE1ldGhvZCgic2V0U2VsZWN0aW9uIiwgbmV3IENsYXNzW117SVN0cnVjdHVyZWRTZWxlY3Rpb24uY2xhc3MsIGJvb2xlYW4uY2xhc3N9KTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmIChtZXRob2QgIT0gbnVsbCkgewotCQkJCQkJCQltZXRob2QuaW52b2tlKHZpZXcsIG5ldyBPYmplY3RbXXtuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihtYXJrZXIpLCBCb29sZWFuLlRSVUV9KTsKLQkJCQkJCQkJcGFnZS5icmluZ1RvVG9wKHZpZXcpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGlnbm9yZSBleGNlcHRpb25zLCBkb24ndCB1cGRhdGUgYW55IG9mIHRoZSBsaXN0cywganVzdCBzZXQKLQkJCS8vIHN0YXR1c2xpbmUKLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCQkvLwotCQkJfQotCQkJY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJCWNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHgpIHsKLQkJCQkvLwotCQkJfQotCQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geCkgewotCQkJCS8vCi0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUFjdGlvblZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lBY3Rpb25WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFkNmVhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUFjdGlvblZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElBY3Rpb25WYWxpZGF0b3IgewotCWJvb2xlYW4gaXNWYWxpZEFjdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lEcm9wQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSURyb3BBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMyYTcwYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSURyb3BBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURyb3BBY3Rpb24gewotCi0KLQkvKioKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgRHJvcFRhcmdldEV2ZW50LmRhdGEgd2lsbCBiZSBwYXNzZWQuCi0JICogQHJldHVybiBib29sZWFuIHRydWUgZm9yIHN1cHBvcnRlZCBkYXRhIHR5cGUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N1cHBvcnRlZERhdGEoT2JqZWN0IGRhdGEpOwotCi0JLyoqCi0JICogQHJldHVybiBib29sZWFuIHRydWUgZm9yIHRoZSBhY3Rpb24gaXMgYWN0dWFsbHkgcHJvY2Vzc2VkIGZhbHNlIGZvciB0aGUKLQkgKiAgICAgICAgIGFjdGlvbiBpcyBub3QgcHJvY2Vzc2VkLgotCSAqLwotCXB1YmxpYyBib29sZWFuIHJ1bihEcm9wVGFyZ2V0RXZlbnQgZXZlbnQsIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODM5ZmYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLQotcHVibGljIGludGVyZmFjZSBJRXh0ZW5kZWRDb250cmlidXRvciBleHRlbmRzIElFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciwgSVBvcHVwTWVudUNvbnRyaWJ1dG9yIHsKLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KTsKLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUoSVN0YXR1c0xpbmVNYW5hZ2VyIG1hbmFnZXIpOwotCi0JcHVibGljIHZvaWQgY29udHJpYnV0ZVRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgbWFuYWdlcik7Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sYmFyQWN0aW9ucygpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZEVkaXRvckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZEVkaXRvckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzQ3NzM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRFZGl0b3JBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuZGVkRWRpdG9yQWN0aW9uIGV4dGVuZHMgSVVwZGF0ZSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBhY3Rpb24gaXRlbSBpcyB2aXNpYmxlCi0JICogCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGl0ZW0gaXMgdmlzaWJsZSwgYW5kCi0JICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCk7Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhY3RpdmUgZWRpdG9yIGZvciB0aGUgYWN0aW9uLiBJbXBsZW1lbnRvcnMgc2hvdWxkIGRpc2Nvbm5lY3QKLQkgKiBmcm9tIHRoZSBvbGQgZWRpdG9yLCBjb25uZWN0IHRvIHRoZSBuZXcgZWRpdG9yLCBhbmQgdXBkYXRlIHRoZSBhY3Rpb24KLQkgKiB0byByZWZsZWN0IHRoZSBuZXcgZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXRFZGl0b3IKLQkgKiAgICAgICAgICAgIHRoZSBuZXcgZWRpdG9yIHRhcmdldAotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKElFeHRlbmRlZFNpbXBsZUVkaXRvciB0YXJnZXRFZGl0b3IpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZE1hcmt1cEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZE1hcmt1cEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzVlYWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JRXh0ZW5kZWRNYXJrdXBFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogSUV4dGVuZGVkTWFya3VwRWRpdG9yCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSB0aGUgZWRpdG9yJ3MgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgYWRhcHRlciBhbmQgY2FzdCB0bwotICogICAgICAgICAgICAgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgd2hlbiBhcHByb3ByaWF0ZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFeHRlbmRlZE1hcmt1cEVkaXRvciAgewotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgLSB1c2UgdGhlIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmdldE5vZGUoaW50KSBtZXRob2QKLQkgKiAgICAgICAgICAgICB3aXRoIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmdldENhcmV0T2Zmc2V0KCkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Q2FyZXROb2RlKCk7Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIHVzZSBtZXRob2Qgb24gSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gc29tZSBlZGl0b3JzIHdpbGwgcHJvdmlkZSB0aGUgbGlzdCBvZiBzZWxlY3RlZCBub2RlcyBhcwotCSAqICAgICAgICAgICAgIHBhcnQgb2YgSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuZ2V0U2VsZWN0aW9uKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkU2ltcGxlRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSUV4dGVuZGVkU2ltcGxlRWRpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5M2FkNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lFeHRlbmRlZFNpbXBsZUVkaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0vKioKLSAqIEBkZXByZWNhdGVkLCBvYnRhaW4gYSBJU291cmNlRWRpdGluZ1RleHRUb29scyBhZGFwdGVyIGZyb20gdGhlIGVkaXRvciBwYXJ0Ci0gKi8KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLQotcHVibGljIGludGVyZmFjZSBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgewotCi0JcHVibGljIGludCBnZXRDYXJldFBvc2l0aW9uKCk7Ci0KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCk7Ci0KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpOwotCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvblJhbmdlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JTW9kZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhN2Q3MzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU1vZGVsUHJvdmlkZXIgZXh0ZW5kcyBJRG9jdW1lbnRQcm92aWRlciB7Ci0JSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbChPYmplY3QgZWxlbWVudCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVBvcHVwTWVudUNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVBvcHVwTWVudUNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZTUxOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lQb3B1cE1lbnVDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVBvcHVwTWVudUNvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVJlbGVhc2FibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUmVsZWFzYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODA2ODE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JUmVsZWFzYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1wdWJsaWMgaW50ZXJmYWNlIElSZWxlYXNhYmxlIHsKLQkvKioKLQkgKiBHZW5lcmljIGNhdGNoLWFsbCBmb3IgcmVsZWFzaW5nIHJlc291cmNlcyBhbmQgb3RoZXIgcmVmZXJlbmNlcwotCSAqLwotCXZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDI1NTgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCS8qKgotCSAqIEVuYWJsZXMgZGlzYWJsZXMgYWN0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byB0aGUgc291cmNlIHZpZXdlciAoYW5kCi0JICogc2hvdWxkIG9ubHkgd29yayB3aGVuIHRoZSBzb3VyY2Ugdmlld2VyIGlzIGVuYWJsZWQpCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKiAgICAgICAgICAgIHRydWUgaWYgc291cmNlIHZpZXdlciBpcyBjdXJyZW50bHkgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0lUZW1wb3JhcnlBbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVRlbXBvcmFyeUFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMyNTYzMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvSVRlbXBvcmFyeUFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotcHVibGljIGludGVyZmFjZSBJVGVtcG9yYXJ5QW5ub3RhdGlvbiB7Ci0JT2JqZWN0IGdldEtleSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjI2NWU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCi0JfQotCi0JLyoqCi0JICogUHJpbnRzIG1lc3NhZ2UgdG8gbG9nIGlmIGNhdGVnb3J5IG1hdGNoZXMgL2RlYnVnL3RyYWNlZmlsdGVyIG9wdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGV4dCB0byBwcmludAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqICAgICAgICAgICAgY2F0ZWdvcnkgb2YgdGhlIG1lc3NhZ2UsIHRvIGJlIGNvbXBhcmVkIHdpdGgKLQkgKiAgICAgICAgICAgIC9kZWJ1Zy90cmFjZWZpbHRlcgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAoaXNUcmFjaW5nKGNhdGVnb3J5KSkgewotCQkJbWVzc2FnZSA9IChtZXNzYWdlICE9IG51bGwpID8gbWVzc2FnZSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5PSywgUExVR0lOX0lELCBJU3RhdHVzLk9LLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShQTFVHSU5fSUQpOwotCQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjU2ZDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1ByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZUNvbnZlcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMuQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi0KLXB1YmxpYyBjbGFzcyBQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyI2luaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVEZWZhdWx0UHJlZmVyZW5jZXMoKSB7Ci0JCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJLy8gdXNlIHRoZSBiYXNlIGFubm90YXRpb24gJiBxdWljayBkaWZmIHByZWZlcmVuY2UgcGFnZQotCQlFZGl0b3JzVUkudXNlQW5ub3RhdGlvbnNQcmVmZXJlbmNlUGFnZShzdG9yZSk7Ci0JCUVkaXRvcnNVSS51c2VRdWlja0RpZmZQcmVmZXJlbmNlUGFnZShzdG9yZSk7Ci0KLQkJLy8gbGV0IGFubm90YXRpb25zIHNob3cgdXAgaW4gdGhlIHZlcnRpY2FsIHJ1bGVyIGlmIHRoYXQncyB3aGF0IHRoZQotCQkvLyBwcmVmZXJlbmNlIGlzCi0JCS8vCQkvLyB0aGVzZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGhhdmUgYSBkaWZmZXJlbnQgZGVmYXVsdCB2YWx1ZSB0aGFuCi0JCS8vIHRoZSBvbmUgdGhlIGJhc2UgcHJvdmlkZXMKLQkJLy8JCXN0b3JlLnNldERlZmF1bHQoImVycm9ySW5kaWNhdGlvbkluVmVydGljYWxSdWxlciIsIGZhbHNlKTsKLQkJLy8gLy8kTk9OLU5MUy0xJAotCQkvLwkJc3RvcmUuc2V0RGVmYXVsdCgid2FybmluZ0luZGljYXRpb25JblZlcnRpY2FsUnVsZXIiLCBmYWxzZSk7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQotCQkvLyB0aGVzZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGFyZSBub3QgcGFydCBvZiBiYXNlIHRleHQgZWRpdG9yCi0JCS8vIHByZWZlcmVuY2UKLQkJc3RvcmUuc2V0RGVmYXVsdChDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TLCB0cnVlKTsKLQotCQlzZXRNYXRjaGluZ0JyYWNrZXRzUHJlZmVyZW5jZXMoc3RvcmUpOwotCi0JCS8vIGhvdmVyIGhlbHAgcHJlZmVyZW5jZXMgYXJlIG5vdCBwYXJ0IG9mIGJhc2UgdGV4dCBlZGl0b3IgcHJlZmVyZW5jZQotCQlTdHJpbmcgbW9kMk5hbWUgPSBBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5NT0QyKTsgLy8gU1dULkNPTU1BTkQKLQkJLy8gb24gTWFjOwotCQkvLyBTV1QuQ09OVFJPTAotCQkvLyBlbHNld2hlcmUKLQkJc3RvcmUuc2V0RGVmYXVsdChFZGl0b3JQcmVmZXJlbmNlTmFtZXMuRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTLCAiY29tYmluYXRpb25Ib3Zlcnx0cnVlfDA7cHJvYmxlbUhvdmVyfGZhbHNlfDA7ZG9jdW1lbnRhdGlvbkhvdmVyfGZhbHNlfDA7YW5ub3RhdGlvbkhvdmVyfHRydWV8IiArIG1vZDJOYW1lKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHNldCBkZWZhdWx0IHJlYWQtb25seSBmb3JlZ3JvdW5kIGNvbG9yIHNjYWxlIHZhbHVlCi0JCXN0b3JlLnNldERlZmF1bHQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlJFQURfT05MWV9GT1JFR1JPVU5EX1NDQUxFLCAzMCk7Ci0JCQotCQkvLyBzZXQgZGVmYXVsdCBlbmFibGUgZm9sZGluZyB2YWx1ZQotCQlzdG9yZS5zZXREZWZhdWx0KElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5GT0xESU5HX0VOQUJMRUQsIGZhbHNlKTsKLQkJCi0JCS8vIHNldCBkZWZhdWx0IGZvciBzaG93IG1lc3NhZ2UgZGlhbG9nIHdoZW4gdW5rbm93biBjb250ZW50IHR5cGUgaW4gZWRpdG9yCi0JCXN0b3JlLnNldERlZmF1bHQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHLCB0cnVlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2V0TWF0Y2hpbmdCcmFja2V0c1ByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJLy8gbWF0Y2hpbmcgYnJhY2tldHMgaXMgbm90IHBhcnQgb2YgYmFzZSB0ZXh0IGVkaXRvciBwcmVmZXJlbmNlCi0JCXN0b3JlLnNldERlZmF1bHQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTLCB0cnVlKTsKLQkJUHJlZmVyZW5jZUNvbnZlcnRlci5zZXREZWZhdWx0KHN0b3JlLCBFZGl0b3JQcmVmZXJlbmNlTmFtZXMuTUFUQ0hJTkdfQlJBQ0tFVFNfQ09MT1IsIG5ldyBSR0IoMTkyLCAxOTIsIDE5MikpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYjBiOWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1JlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyb3BUYXJnZXRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0KLXB1YmxpYyBjbGFzcyBSZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIgZXh0ZW5kcyBFeHRlbmRlZEVkaXRvckRyb3BUYXJnZXRBZGFwdGVyIHsKLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIFJlYWRPbmx5QXdhcmVEcm9wVGFyZ2V0QWRhcHRlcihib29sZWFuIHVzZVByb3h5KSBmb3IKLQkgKiAgICAgICAgICAgICB0aGUgcGVyZm9ybWFuY2UKLQkgKi8KLQlwdWJsaWMgUmVhZE9ubHlBd2FyZURyb3BUYXJnZXRBZGFwdGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBSZWFkT25seUF3YXJlRHJvcFRhcmdldEFkYXB0ZXIoYm9vbGVhbiB1c2VQcm94eSkgewotCQlzdXBlcih1c2VQcm94eSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0VGV4dFZpZXdlcigpLmdldERvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCWlmICgoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5jb250YWluc1JlYWRPbmx5KGdldERyb3BPZmZzZXQoZXZlbnQpLCAwKSkgewotCQkJCWV2ZW50Lm9wZXJhdGlvbnMgPSBETkQuRFJPUF9OT05FOwotCQkJCWV2ZW50LmRldGFpbCA9IERORC5EUk9QX05PTkU7Ci0JCQkJZ2V0VGV4dFZpZXdlcigpLmdldFRleHRXaWRnZXQoKS5yZWRyYXcoKTsKLQkJCQlnZXRUZXh0Vmlld2VyKCkuZ2V0VGV4dFdpZGdldCgpLnVwZGF0ZSgpOwotCQkJCWdldFRleHRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCkuZ2V0RGlzcGxheSgpLmJlZXAoKTsKLQkJCX0KLQkJfQotCQlzdXBlci5kcm9wKGV2ZW50KTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU1NFVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODgwOWI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgU1NFIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU1NFVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFJlc291cmNlQnVuZGxlIGdldFJlc291cmNlQnVuZGxlKCkgewotCQl0cnkgewotCQkJaWYgKGZSZXNvdXJjZUJ1bmRsZSA9PSBudWxsKQotCQkJCWZSZXNvdXJjZUJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShCVU5ETEVfTkFNRSk7Ci0JCX0KLQkJY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiB4KSB7Ci0JCQlmUmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VCdW5kbGU7Ci0JfQotCi0JcHJpdmF0ZSBTU0VVSU1lc3NhZ2VzKCkgewotCQkvLyBjYW5ub3QgY3JlYXRlIG5ldyBpbnN0YW5jZQotCX0KLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBTU0VVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFcnJvcl9vcGVuaW5nX2ZpbGVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9GaWxlX2lzX3JlYWRfb25seTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfMzJjb25jYXRfRVhDXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNdWx0aXBsZV9lcnJvcnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VuZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5kb19UZXh0X0NoYW5nZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VbmRvX18wX19fQ3RybF9aX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmRvX19fMF9fX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfUmVkb19UZXh0X0NoYW5nZV9fQ3RybF9ZX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWRvX1RleHRfQ2hhbmdlX19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1JlZG9fXzBfX19DdHJsX1lfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlZG9fX18wX19fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdE1lbnVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X0RvY3VtZW50X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRfQWN0aXZlX0VsZW1lbnRzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0X0N1dF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dF9QYXN0ZV9VSV87Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwX0RvY3VtZW50X1VJXzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9DdXRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0N1dF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9DdXRfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0N1dF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29weV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29weV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db3B5X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db3B5X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9QYXN0ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfUGFzdGVfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfUGFzdGVfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX1Bhc3RlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9EZWxldGVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0RlbGV0ZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9EZWxldGVfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0RlbGV0ZV9kZXNjcmlwdGlvbjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RQcm9wb3NhbHNfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdFByb3Bvc2Fsc190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRBc3Npc3RQcm9wb3NhbHNfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQmxvY2tDb21tZW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFudXBEb2N1bWVudF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0RG9jdW1lbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0RG9jdW1lbnRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXREb2N1bWVudF9pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXREb2N1bWVudF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3RpdmVFbGVtZW50c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3RpdmVFbGVtZW50c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGl2ZUVsZW1lbnRzX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGl2ZUVsZW1lbnRzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPcGVuRmlsZUZyb21Tb3VyY2VfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dUb29sdGlwRGVzY19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93VG9vbHRpcERlc2NfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93VG9vbHRpcERlc2NfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd1Rvb2x0aXBEZXNjX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dF9TaGlmdF9SaWdodF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dF9TaGlmdF9MZWZ0X1VJXzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF80Y29uY2F0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfdHlwZV9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcmVncm91bmRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhY2tncm91bmRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJvbGRfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEl0YWxpY3NfVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVzdG9yZV9EZWZhdWx0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfdGV4dF9fVUlfOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnJlYWtwb2ludF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCcmVha3BvaW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQWRkQnJlYWtwb2ludF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCcmVha3BvaW50X2Vycm9yX2RpYWxvZ190aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCcmVha3BvaW50X2Vycm9yX2RpYWxvZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUJyZWFrcG9pbnRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQnJlYWtwb2ludF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRvZ2dsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5hYmxlQnJlYWtwb2ludF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmFibGVCcmVha3BvaW50X3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5hYmxlQnJlYWtwb2ludF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNhYmxlQnJlYWtwb2ludF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEaXNhYmxlQnJlYWtwb2ludF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERpc2FibGVCcmVha3BvaW50X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX2FkZF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19yZW1vdmVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfdGl0bGUxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX2FkZGluZ19tZXNzYWdlMTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0Q29sb3JQYWdlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yTW9kZWxVdGlsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yTW9kZWxVdGlsXzE7Ci0KLQkvLyBUT0RPOiBUaGVzZSBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSBpcwotCS8vIGRlbGV0ZWQKLQkvLyB3ZWIgY29udGVudCBzZXR0aW5ncwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0RlZmF1bHRfSFRNTF9ET0NUWVBFX0lEX19fMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9DU1NfcHJvZmlsZV9fXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfVGFyZ2V0X0RldmljZV9fXzM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfVG9nZ2xlSW5zZXJ0TW9kZV9sYWJlbDsKLQotCS8vCi0JLy8gVGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiBXb3JrYmVuY2ggbWVudSBiYXIKLQkvLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4cGFuZFNlbGVjdGlvblRvTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTb3VyY2VNZW51X2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZE9jY3VycmVuY2VzQWN0aW9uUHJvdmlkZXJfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW1vdmVBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTaG93UHJvcGVydGllc0FjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFic3RyYWN0T3Blbk9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aW9uRGVsZWdhdGVfam9iTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aW9uRGVsZWdhdGVfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3Rpb25EZWxlZ2F0ZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdEFjdGlvbkRlbGVnYXRlXzU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV80MDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ1ByZWZlcmVuY2VUYWJfNjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl83OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzE5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzIwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzIyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzIzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzI5OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzMwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlVGFiXzMxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdQcmVmZXJlbmNlUGFnZV8zMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnUHJlZmVyZW5jZVRhYl8zMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrVGFnRXhjbHVzaW9uVGFiXzAxOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tUYWdFeGNsdXNpb25UYWJfMDI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza1RhZ0V4Y2x1c2lvblRhYl8wMzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMjsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVQcmVmZXJlbmNlUGFnZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5vTW9kaWZpY2F0aW9uQ29tcGxldGlvblByb3Bvc2FsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50QWN0aW9uXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdEJyZWFrcG9pbnRBY3Rpb25fMDsKLQkvLyBVc2VkIGluIFN0cnVjdHVyZWQgVGV4dCBFZGl0b3IgUHJlZmVyZW5jZSBQYWdlIC8gSG92ZXJzIFRhYgotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9ob3ZlclByZWZlcmVuY2VzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfa2V5TW9kaWZpZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVySXNOb3RWYWxpZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVySXNOb3RWYWxpZEZvckhvdmVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfZHVwbGljYXRlTW9kaWZpZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9uYW1lQ29sdW1uVGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllckNvbHVtblRpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfZGVsaW1pdGVyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0RGVsaW1pdGVyQW5kTW9kaWZpZXJBbmREZWxpbWl0ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnRNb2RpZmllckFuZERlbGltaXRlcjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2luc2VydERlbGltaXRlckFuZE1vZGlmaWVyOwotCi0JLy8gdXNlZCBkeW5hbWljYWxseQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbWJpbmF0aW9uSG92ZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgY29tYmluYXRpb25Ib3Zlcl9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHByb2JsZW1Ib3Zlcl9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9ibGVtSG92ZXJfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBkb2N1bWVudGF0aW9uSG92ZXJfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgZG9jdW1lbnRhdGlvbkhvdmVyX2Rlc2M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgYW5ub3RhdGlvbkhvdmVyX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGFubm90YXRpb25Ib3Zlcl9kZXNjOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZXNBY3Rpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJlZmVyZW5jZU1hbmFnZXJfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5XzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd1ZpZXdfZXJyb3JUaXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwcm9jX2RpcnR5X3JlZ2lvbnNfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRleHRIb3Zlck1ha2VTdGlja3lIaW50OwotCi0JLy8gRW5jb2RpbmcKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdQcmVmZXJlbmNlUGFnZV8xOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYnVzeTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBjYXJldF91cGRhdGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMDsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV85OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzExOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEyOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE1OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE2OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE3OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE4OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE5OwotCi0JLyoKLQkgKiAqKioqKkJlbG93IGFyZSBwb3NzaWJseSB1bnVzZWQgc3RyaW5ncyB0aGF0IG1heSBiZSByZW1vdmVkICoqKioqCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2F2ZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbl9FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvYmxlbXNfRHVyaW5nX1NhdmVfQXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNhdmVfY291bGRfbm90X2JlX2NvbXBsZXRlX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBNYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZW1vdmluZ190aXRsZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfcmVtb3ZpbmdfbWVzc2FnZTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfcmV0cmlldmluZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEpTUFNvdXJjZVByZWZlcmVuY2VQYWdlRGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX2Vycm9yX3NhdmVfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfZXJyb3Jfc2F2ZV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3Jfd2FybmluZ19zYXZlX2RlbGV0ZTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByZXZpb3VzX2Fubm90YXRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV4dF9hbm5vdGF0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblR5cGVzX0Vycm9yczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbm5vdGF0aW9uVHlwZXNfV2FybmluZ3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblR5cGVzX1Rhc2tzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UeXBlc19TZWFyY2hSZXN1bHRzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFubm90YXRpb25UeXBlc19Cb29rbWFya3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQW5ub3RhdGlvblR5cGVzX090aGVyczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9XaW5kb3dzX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9XaW5kb3dzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfZGVzY3JpcHRpb247Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvVU5JWF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvVU5JWF90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9VTklYX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9Db252ZXJ0VG9VTklYX2Rlc2NyaXB0aW9uOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb01hY19sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvTWFjX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX0NvbnZlcnRUb01hY19pbWFnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfQ29udmVydFRvTWFjX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnZlcnRMaW5lRGVsaW1pdGVyc01lbnVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRmluZE9jY3VycmVuY2VzX2xhYmVsOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydExpbmVEZWxpbWl0ZXJzVG9DUkxGQWN0aW9uRGVsZWdhdGVfam9iTmFtZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydExpbmVEZWxpbWl0ZXJzVG9DUkxGQWN0aW9uRGVsZWdhdGVfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV80OwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9hbm5vdGF0aW9uUm9sbG92ZXI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9zaG93QWZmb3JkYW5jZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2VuYWJsZWQ7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBCYXNpY0ZpbmRPY2N1cnJlbmNlc0FjdGlvbl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEJhc2ljU2VhcmNoTGFiZWxQcm92aWRlcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5hdmlnYXRpb25QcmVmZXJlbmNlVGFiXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZpbGVNb2RlbFByb3ZpZGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkZhY2VOb2RlQWRhcHRlcl8wOwotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29uZmlndXJlUHJvamVjdFNldHRpbmdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbmZpZ3VyZVdvcmtzcGFjZVNldHRpbmdzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuYWJsZVByb2plY3RTZXR0aW5nczsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIExvYWRpbmdSZWZlcmVuY2VkR3JhbW1hcnM7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb2xkaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX1RvZ2dsZV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX1RvZ2dsZV90b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fVG9nZ2xlX2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fVG9nZ2xlX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fRXhwYW5kQWxsX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFByb2plY3Rpb25fRXhwYW5kQWxsX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9FeHBhbmRBbGxfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9FeHBhbmRBbGxfaW1hZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0NvbGxhcHNlQWxsX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9qZWN0aW9uX0NvbGxhcHNlQWxsX2ltYWdlOwotCi0JLy8gVGhlc2Ugc3RyaW5ncyBhcmUgYWNjZXNzZWQgdXNpbmcgcmVzb3VyY2UgYnVuZGxlIGFuZCBpbiBwcm9wZXJ0aWVzCi0JLy8gZmlsZSwgbmVlZCB0byB1c2UgJy4nIGluc3RlYWQgb2YgJ18nIGluIHNvbWUga2V5cwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlQm9va21hcmtzX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19yZW1vdmVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfYWRkX2RpYWxvZ19tZXNzYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfZXJyb3JfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VCb29rbWFya3NfZXJyb3JfZGlhbG9nX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2ltYWdlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfYWRkX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19yZW1vdmVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9kaWFsb2dfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9kaWFsb2dfbWVzc2FnZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfTWFuYWdlVGFza3NfZXJyb3JfZGlhbG9nX3RpdGxlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRvcl9NYW5hZ2VUYXNrc19lcnJvcl9kaWFsb2dfbWVzc2FnZTsKLQkvKgotCSAqICoqKioqQWJvdmUgYXJlIHBvc3NpYmx5IHVudXNlZCBzdHJpbmdzIHRoYXQgbWF5IGJlIHJlbW92ZWQqKioqKgotCSAqLwotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlZFRleHRFZGl0b3JfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duQ29udGVudFR5cGVEaWFsb2dfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duQ29udGVudFR5cGVEaWFsb2dfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVbmtub3duQ29udGVudFR5cGVEaWFsb2dfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHlsZWRUZXh0Q29sb3JQaWNrZXJfMDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNzgzZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlRhc2tTY2FubmluZ1NjaGVkdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm8uVGV4dEhvdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgU1NFVUlQbHVnaW4gZXh0ZW5kcyBBYnN0cmFjdFVJUGx1Z2luIHsKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgU1NFVUlQbHVnaW4gaW5zdGFuY2UgPSBudWxsOwotCi0JcHVibGljIHN0YXRpYyBTU0VVSVBsdWdpbiBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgU1NFVUlQbHVnaW4gZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFRleHRIb3Zlck1hbmFnZXIgZlRleHRIb3Zlck1hbmFnZXI7Ci0KLQlwdWJsaWMgU1NFVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0ZXh0IGhvdmVyIG1hbmFnZXIKLQkgKiAKLQkgKiBAcmV0dXJuIFRleHRIb3Zlck1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgVGV4dEhvdmVyTWFuYWdlciBnZXRUZXh0SG92ZXJNYW5hZ2VyKCkgewotCQlpZiAoZlRleHRIb3Zlck1hbmFnZXIgPT0gbnVsbCkgewotCQkJZlRleHRIb3Zlck1hbmFnZXIgPSBuZXcgVGV4dEhvdmVyTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBmVGV4dEhvdmVyTWFuYWdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdGFydChjb250ZXh0KTsKLQkJLyoqCi0JCSAqIElmIHRoZSB1c2VyIHN0YXJ0cyB0aGUgd29ya2JlbmNoIHdpdGgKLQkJICogLURvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXI9b2ZmLCB0aGUgc2Nhbm5lciBzaG91bGQgYmUKLQkJICogZGlzYWJsZWQKLQkJICovCi0JCVN0cmluZyBzY2FuID0gU3lzdGVtLmdldFByb3BlcnR5KCJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoc2NhbiA9PSBudWxsIHx8ICFzY2FuLmVxdWFsc0lnbm9yZUNhc2UoIm9mZiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCVRhc2tTY2FubmluZ1NjaGVkdWxlci5zdGFydHVwKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0b3AoY29udGV4dCk7Ci0JCVRhc2tTY2FubmluZ1NjaGVkdWxlci5zaHV0ZG93bigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TU0VVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZTIwYzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1NTRVVJUGx1Z2luUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FcnJvcl9vcGVuaW5nX2ZpbGVfVUlfPUVycm9yIG9wZW5pbmcgZmlsZQotX1VJX0ZpbGVfaXNfcmVhZF9vbmx5PUZpbGUgezB9IGlzIHJlYWQtb25seS4KLV8zMmNvbmNhdF9FWENfPUVkaXRvciBjb3VsZCBub3QgYmUgb3BlbiBvbiB7MH0KLU11bHRpcGxlX2Vycm9ycz1NdWx0aXBsZSBhbm5vdGF0aW9ucyBmb3VuZCBhdCB0aGlzIGxpbmU6Ci1fVW5kb19UZXh0X0NoYW5nZV9fQ3RybF9aX1VJXz0mVW5kbyBUZXh0IENoYW5nZSBAQ3RybCtaCi1VbmRvX1RleHRfQ2hhbmdlX19VSV89VW5kbyBUZXh0IENoYW5nZS4KLV9VbmRvX18wX19fQ3RybF9aX1VJXz0mVW5kbyB7MH0gQEN0cmwrWgotVW5kb19fXzBfX19VSV89VW5kbzogezB9LgotX1JlZG9fVGV4dF9DaGFuZ2VfX0N0cmxfWV9VSV89JlJlZG8gVGV4dCBDaGFuZ2UgQEN0cmwrWQotUmVkb19UZXh0X0NoYW5nZV9fVUlfPVJlZG8gVGV4dCBDaGFuZ2UuCi1fUmVkb19fMF9fX0N0cmxfWV9VSV89JlJlZG8gezB9IEBDdHJsK1kKLVJlZG9fX18wX19fVUlfPVJlZG86IHswfS4KLUZvcm1hdE1lbnVfbGFiZWw9RiZvcm1hdAotRm9ybWF0X0RvY3VtZW50X1VJXz1Gb3JtYXQgRG9jdW1lbnQKLUZvcm1hdF9BY3RpdmVfRWxlbWVudHNfVUlfPUZvcm1hdCBBY3RpdmUgRWxlbWVudHMKLVRleHRfQ3V0X1VJXz1UZXh0IEN1dAotVGV4dF9QYXN0ZV9VSV89VGV4dCBQYXN0ZQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotQ2xlYW51cF9Eb2N1bWVudF9VSV89Q2xlYW51cCBEb2N1bWVudAotCi1FZGl0b3JfQ3V0X2xhYmVsPUN1JnRAQ3RybCtYCi1FZGl0b3JfQ3V0X3Rvb2x0aXA9Q3V0Ci1FZGl0b3JfQ3V0X2ltYWdlPQotRWRpdG9yX0N1dF9kZXNjcmlwdGlvbj1DdXQKLQotRWRpdG9yX0NvcHlfbGFiZWw9JkNvcHlAQ3RybCtDCi1FZGl0b3JfQ29weV90b29sdGlwPUNvcHkKLUVkaXRvcl9Db3B5X2ltYWdlPQotRWRpdG9yX0NvcHlfZGVzY3JpcHRpb249Q29weQotCi1FZGl0b3JfUGFzdGVfbGFiZWw9JlBhc3RlQEN0cmwrVgotRWRpdG9yX1Bhc3RlX3Rvb2x0aXA9UGFzdGUKLUVkaXRvcl9QYXN0ZV9pbWFnZT0KLUVkaXRvcl9QYXN0ZV9kZXNjcmlwdGlvbj1QYXN0ZQotCi1FZGl0b3JfRGVsZXRlX2xhYmVsPSZEZWxldGVARGVsZXRlCi1FZGl0b3JfRGVsZXRlX3Rvb2x0aXA9RGVsZXRlCi1FZGl0b3JfRGVsZXRlX2ltYWdlPQotRWRpdG9yX0RlbGV0ZV9kZXNjcmlwdGlvbj1EZWxldGUKLQotQ29udGVudEFzc2lzdFByb3Bvc2Fsc19sYWJlbD1Db24mdGVudCBBc3Npc3QKLUNvbnRlbnRBc3Npc3RQcm9wb3NhbHNfdG9vbHRpcD1Db250ZW50IEFzc2lzdAotQ29udGVudEFzc2lzdFByb3Bvc2Fsc19kZXNjcmlwdGlvbj1Db250ZW50IEFzc2lzdAotCi1RdWlja0ZpeF9sYWJlbD0mUXVpY2sgRml4Ci1RdWlja0ZpeF90b29sdGlwPVF1aWNrIEZpeAotUXVpY2tGaXhfaW1hZ2U9Ci1RdWlja0ZpeF9kZXNjcmlwdGlvbj1RdWljayBGaXgKLQotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnJmxlIENvbW1lbnQKLVRvZ2dsZUNvbW1lbnRfdG9vbHRpcD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF9pbWFnZT0KLVRvZ2dsZUNvbW1lbnRfZGVzY3JpcHRpb249VG9nZ2xlIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF9sYWJlbD1BZGQgJkJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfaW1hZ2U9Ci1BZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbD1SZW1vdmUgQmxvYyZrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfaW1hZ2U9Ci1SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249UmVtb3ZlIEJsb2NrIENvbW1lbnQKLUNsZWFudXBEb2N1bWVudF9sYWJlbD1DJmxlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotQ2xlYW51cERvY3VtZW50X2ltYWdlPQotQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uPUNsZWFudXAgRG9jdW1lbnQKLUZvcm1hdERvY3VtZW50X2xhYmVsPSZEb2N1bWVudAotRm9ybWF0RG9jdW1lbnRfdG9vbHRpcD1Gb3JtYXQgRG9jdW1lbnQKLUZvcm1hdERvY3VtZW50X2ltYWdlPQotRm9ybWF0RG9jdW1lbnRfZGVzY3JpcHRpb249Rm9ybWF0IERvY3VtZW50Ci1Gb3JtYXRBY3RpdmVFbGVtZW50c19sYWJlbD1BY3QmaXZlIEVsZW1lbnRzCi1Gb3JtYXRBY3RpdmVFbGVtZW50c190b29sdGlwPUZvcm1hdCBBY3RpdmUgRWxlbWVudHMKLUZvcm1hdEFjdGl2ZUVsZW1lbnRzX2ltYWdlPQotRm9ybWF0QWN0aXZlRWxlbWVudHNfZGVzY3JpcHRpb249Rm9ybWF0IEFjdGl2ZSBFbGVtZW50cwotT3BlbkZpbGVGcm9tU291cmNlX2xhYmVsPU9wJmVuIFNlbGVjdGlvbgotT3BlbkZpbGVGcm9tU291cmNlX3Rvb2x0aXA9T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLU9wZW5GaWxlRnJvbVNvdXJjZV9pbWFnZT0KLU9wZW5GaWxlRnJvbVNvdXJjZV9kZXNjcmlwdGlvbj1PcGVuIGFuIGVkaXRvciBvbiB0aGUgc2VsZWN0ZWQgbGluawotU2hvd1Rvb2x0aXBEZXNjX2xhYmVsPVNob3cgJlRvb2x0aXAgRGVzY3JpcHRpb24KLVNob3dUb29sdGlwRGVzY190b29sdGlwPURpc3BsYXlzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudAotU2hvd1Rvb2x0aXBEZXNjX2ltYWdlPQotU2hvd1Rvb2x0aXBEZXNjX2Rlc2NyaXB0aW9uPURpc3BsYXlzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPSZFbmNsb3NpbmcgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb249RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIGVuY2xvc2luZyBlbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsPSZOZXh0IEVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBuZXh0IHNpYmxpbmcKLVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsPSZQcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD0mUmVzdG9yZSBMYXN0IFNlbGVjdGlvbgotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV90b29sdGlwPVJlc3RvcmUgbGFzdCBzZWxlY3Rpb24KLVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfZGVzY3JpcHRpb249UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgotVGV4dF9TaGlmdF9SaWdodF9VSV89VGV4dCBTaGlmdCBSaWdodAotVGV4dF9TaGlmdF9MZWZ0X1VJXz1UZXh0IFNoaWZ0IExlZnQKLQotXzRjb25jYXQ9Jyd7MH0nJyBpcyBub3QgYSB2YWxpZCBpbnB1dAotIyMgVGhlIGZvbGxvd2luZyBzdHJpbmdzIGFyZSBmb3IgIlhNTC0+WE1MIFNvdXJjZS0+WE1MIFN0eWxlIiBQcmVmZXJlbmNlcywgIldlYiBUb29scy0+U291cmNlLT5IVE1MIFN0eWxlIiBQcmVmZXJlbmNlcywgYW5kICJXZWIgVG9vbHMtPlNvdXJjZS0+SmF2YVNjcmlwdCBTdHlsZSIgUHJlZmVyZW5jZXMKLUNvbnRlbnRfdHlwZV9fVUlfPUNvJm50ZW50IHR5cGU6Ci1Gb3JlZ3JvdW5kX1VJXz0mRm9yZWdyb3VuZDoKLUJhY2tncm91bmRfVUlfPSZCYWNrZ3JvdW5kOgotQm9sZF9VSV89QiZvbGQKLUl0YWxpY3NfVUk9SXRhbGljcwotUmVzdG9yZV9EZWZhdWx0X1VJXz0mUmVzdG9yZSBEZWZhdWx0Ci1TYW1wbGVfdGV4dF9fVUlfPSZTYW1wbGUgdGV4dDoKLSMjCi1BZGRCcmVha3BvaW50X2xhYmVsPUFkZCAmQnJlYWtwb2ludAotQWRkQnJlYWtwb2ludF90b29sdGlwPUFkZCBCcmVha3BvaW50Ci1BZGRCcmVha3BvaW50X2Rlc2NyaXB0aW9uPUFkZCBCcmVha3BvaW50Ci1BZGRCcmVha3BvaW50X2Vycm9yX2RpYWxvZ190aXRsZT1BZGQgQnJlYWtwb2ludAotQWRkQnJlYWtwb2ludF9lcnJvcl9kaWFsb2dfbWVzc2FnZT1DYW5ub3QgYWRkIGJyZWFrcG9pbnQKLSMjCi1Ub2dnbGVCcmVha3BvaW50X2xhYmVsPVRvZ2dsZSBCcmVha3BvaW50Ci1Ub2dnbGVCcmVha3BvaW50X3Rvb2x0aXA9VG9nZ2xlIEJyZWFrcG9pbnQKLVRvZ2dsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb249VG9nZ2xlIEJyZWFrcG9pbnQKLSMjCi1FbmFibGVCcmVha3BvaW50X2xhYmVsPUVuYWJsZSBCcmVha3BvaW50Ci1FbmFibGVCcmVha3BvaW50X3Rvb2x0aXA9RW5hYmxlIEJyZWFrcG9pbnQKLUVuYWJsZUJyZWFrcG9pbnRfZGVzY3JpcHRpb249RW5hYmxlIEJyZWFrcG9pbnQKLSMjCi1EaXNhYmxlQnJlYWtwb2ludF9sYWJlbD1EaXNhYmxlIEJyZWFrcG9pbnQKLURpc2FibGVCcmVha3BvaW50X3Rvb2x0aXA9RGlzYWJsZSBCcmVha3BvaW50Ci1EaXNhYmxlQnJlYWtwb2ludF9kZXNjcmlwdGlvbj1EaXNhYmxlIEJyZWFrcG9pbnQKLSMjCi1NYW5hZ2VCcmVha3BvaW50c19hZGRfbGFiZWw9QWRkICZCcmVha3BvaW50Ci1NYW5hZ2VCcmVha3BvaW50c19yZW1vdmVfbGFiZWw9UmVtb3ZlIEJyZWFrcG9pbnQKLU1hbmFnZUJyZWFrcG9pbnRzX3Rvb2x0aXA9QWRkL1JlbW92ZSBCcmVha3BvaW50Ci1NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfdGl0bGUxPUFkZCBCcmVha3BvaW50Ci1NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9hZGRpbmdfbWVzc2FnZTE9Q2Fubm90IGFkZCBicmVha3BvaW50Ci0KLUFic3RyYWN0Q29sb3JQYWdlRGVzY3JpcHRpb249Q3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIGJ5IHNlbGVjdGluZyB0aGUgdHlwZSBvZiB0ZXh0IHdob3NlIHN0eWxlIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSBmcm9tIGVpdGhlciB0aGUgY29tYm8gYm94IG9yIHRoZSBzYW1wbGUgdGV4dCBhcmVhCi0jIwotRWRpdG9yTW9kZWxVdGlsXzA9bW9kZWwgaW4gaW52YWxpZCBzdGF0ZQotRWRpdG9yTW9kZWxVdGlsXzE9VGhlcmUgd2FzIGEgcHJvYmxlbSBhZGRpbmcgYWRhcHRlciBmYWN0b3JpZXMKLQotIyB3ZWIgY29udGVudCBzZXR0aW5ncwotVUlfRGVmYXVsdF9IVE1MX0RPQ1RZUEVfSURfX18xPSZEb2N1bWVudCB0eXBlOgotVUlfQ1NTX3Byb2ZpbGVfX18yPSZDU1MgcHJvZmlsZToKLVVJX1RhcmdldF9EZXZpY2VfX18zPSZUYXJnZXQgZGV2aWNlOgotCi1FZGl0b3JfVG9nZ2xlSW5zZXJ0TW9kZV9sYWJlbD1TbWEmcnQgSW5zZXJ0IE1vZGUKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgVGhlc2Ugc3RyaW5ncyBhcmUgdXNlZCBpbiBXb3JrYmVuY2ggbWVudSBiYXIKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1FeHBhbmRTZWxlY3Rpb25Ub01lbnVfbGFiZWw9RSZ4cGFuZCBTZWxlY3Rpb24gVG8KLVNvdXJjZU1lbnVfbGFiZWw9JlNvdXJjZQotIwotRmluZE9jY3VycmVuY2VzQWN0aW9uUHJvdmlkZXJfMD1DdXJyZW50IHNlbGVjdGlvbiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgc2VhcmNoYWJsZSBlbGVtZW50Ci1SZW1vdmVBY3Rpb25fMD1SZW1vdmUgUHJvcGVydHkKLVNob3dQcm9wZXJ0aWVzQWN0aW9uXzA9UCZyb3BlcnRpZXMKLUNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wPUNvbGxhcHNlIEFsbAotQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzE9TGluayB3aXRoIEVkaXRvcgotQWJzdHJhY3RPcGVuT25fMD1DdXJyZW50IHRleHQgc2VsZWN0aW9uIGRvZXMgbm90IHJlc29sdmUgdG8gYSBmaWxlCi1Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9qb2JOYW1lPUZvcm1hdHRpbmcgZG9jdW1lbnRzCi1Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2U9RXhjZXB0aW9ucyBvY2N1cnJlZCB3aGlsZSBmb3JtYXR0aW5nIGRvY3VtZW50cwotRm9ybWF0QWN0aW9uRGVsZWdhdGVfMz1Gb3JtYXR0aW5nIHswfQotRm9ybWF0QWN0aW9uRGVsZWdhdGVfND1FeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZm9ybWF0dGluZyBkb2N1bWVudCB7MH0KLUZvcm1hdEFjdGlvbkRlbGVnYXRlXzU9TWFsZm9ybWVkSW5wdXRFeGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgZm9ybWF0dGluZyBkb2N1bWVudCB7MH0KLVRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMD1SZWFkLU9ubHkgdGV4dCBzdHlsZQotVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYl8xPVJlYWQtT25seSBjb250cmFzdCBwZXJjZW50YWdlOgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yPU1hdGNoaW5nIGJyYWNrZXRzIGhpZ2hsaWdodAotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV82PVRoZSBmb2xsb3dpbmcgcHJlZmVyZW5jZXMgYXBwbHkgdG8gdGhlIEhUTUwsIEpTUCwgWE1MLCBhbmQgb3RoZXIgc291cmNlIGVkaXRvcnMuCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIwPUhpZ2hsaWdodCAmbWF0Y2hpbmcgYnJhY2tldHMKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjM9QXBwZWFyYW5jZSBjbyZsb3Igb3B0aW9uczoKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMjQ9QyZvbG9yOgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zMD0mUmVwb3J0IHByb2JsZW1zIGFzIHlvdSB0eXBlCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM3PUVtcHR5IGlucHV0Ci1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM4PWlzIG5vdCBhIHZhbGlkIGlucHV0LgotU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOT1JbmZvcm0gd2hlbiB1bnN1cHBvcnRlZCBjb250ZW50IHR5cGUgaXMgaW4gZWRpdG9yCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzQwPUFsc28gc2VlIHRoZSA8YT4nJ3swfScnPC9hPiBwcmVmZXJlbmNlcy4KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzA9TG93Ci1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xPU5vcm1hbAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMj1IaWdoCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8zPU4vQQotVGFza1RhZ1ByZWZlcmVuY2VUYWJfNT1UYXNrIFRhZwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfNj1UYWc6Ci1UYXNrVGFnUHJlZmVyZW5jZVRhYl83PVByaW9yaXR5OgotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTI9VGFnCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xMz1Qcmlvcml0eQotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTQ9TmV3Li4uCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNT1FZGl0Li4uCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8xNj1SZW1vdmUKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE3PVNlbGVjdCBBbGwKLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzE4PURlc2VsZWN0IEFsbAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMTk9Tm90ZTogdGFncyBhcmUgY2FzZSBpbnNlbnNpdGl2ZQotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjA9VGFzayBUYWdzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yMj1UYXNrIFRhZ3MgU2V0dGluZ3MgQ2hhbmdlZAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjM9VGhlIHRhc2sgdGFncyBzZXR0aW5ncyBoYXZlIGNoYW5nZWQuICBNYWtlIHRoZXNlIGNoYW5nZXMgZWZmZWN0aXZlIG5vdz8KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzI0PVllcwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjU9Tm8KLVRhc2tUYWdQcmVmZXJlbmNlVGFiXzI2PUNhbmNlbAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjc9U2Nhbm5pbmcgZmlsZXMgZm9yIHRhc2tzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8yOD1kZXRlY3Rpb24gYWJvcnRlZAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMjk9ZGV0ZWN0aW9uIGNvbXBsZXRlZAotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzA9ZGV0ZWN0aW9uIGVuY291bnRlcmVkIGVycm9ycwotVGFza1RhZ1ByZWZlcmVuY2VUYWJfMzE9RW5hYmxlIHNlYXJjaGluZyBmb3IgVGFzayBUYWdzCi1UYXNrVGFnUHJlZmVyZW5jZVBhZ2VfMzI9Q2xlYW4gYW5kIHJlZGV0ZWN0IFRhc2tzCi1UYXNrVGFnUHJlZmVyZW5jZVRhYl8zMz1UYWdzIGluIGNvbW1lbnRzIGluZGljYXRpbmcgVGFza3M6Ci1UYXNrVGFnRXhjbHVzaW9uVGFiXzAxPUZpbHRlcnMKLVRhc2tUYWdFeGNsdXNpb25UYWJfMDI9U2NhbiB0aGUgc2VsZWN0ZWQgQ29udGVudCBUeXBlczoKLVRhc2tUYWdFeGNsdXNpb25UYWJfMDM9QWZmZWN0ZWQgQ29udGVudCBUeXBlczoKLQotUHJvcGVydHlQcmVmZXJlbmNlUGFnZV8wMT1Qcm9qZWN0IFNwZWNpZmljIENvbmZpZ3VyYXRpb24KLVByb3BlcnR5UHJlZmVyZW5jZVBhZ2VfMDI9U2VsZWN0IHRoZSBwcm9qZWN0IHRvIGNvbmZpZ3VyZToKLQotRmlsZVByZWZlcmVuY2VQYWdlXzA9RXhwYW5kIHRoZSB0cmVlIHRvIGVkaXQgcHJlZmVyZW5jZXMgZm9yIGEgc3BlY2lmaWMgY29udGVudCB0eXBlLgotTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWxfMD1ObyBjb3JyZWN0aW9ucyBhdmFpbGFibGUKLVRvZ2dsZUJyZWFrcG9pbnRBY3Rpb25fMD1Ub2dnbGUgJkJyZWFrcG9pbnRzCi1NYW5hZ2VCcmVha3BvaW50QWN0aW9uXzA9JkVuYWJsZSBCcmVha3BvaW50cwotTWFuYWdlQnJlYWtwb2ludEFjdGlvbl8xPSZEaXNhYmxlIEJyZWFrcG9pbnRzCi1FZGl0QnJlYWtwb2ludEFjdGlvbl8wPUJyZWFrcG9pbnQgJlByb3BlcnRpZXMuLi4KLSMjIFVzZWQgaW4gU3RydWN0dXJlZCBUZXh0IEVkaXRvciBQcmVmZXJlbmNlIFBhZ2UgLyBIb3ZlcnMgVGFiCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX3RpdGxlPUhvdmVycwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9ob3ZlclByZWZlcmVuY2VzPVRleHQgJkhvdmVyIGtleSBtb2RpZmllciBwcmVmZXJlbmNlczoKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfa2V5TW9kaWZpZXI9UHJlc3NlZCBrZXkgJm1vZGlmaWVyIHdoaWxlIGhvdmVyaW5nOgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZXNjcmlwdGlvbj1EZXNjcmlwdGlvbjoKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJJc05vdFZhbGlkPU1vZGlmaWVyICcnezB9JycgaXMgbm90IHZhbGlkLgotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllcklzTm90VmFsaWRGb3JIb3Zlcj1Nb2RpZmllciAnJ3swfScnIGZvciAnJ3sxfScnIGhvdmVyIGlzIG5vdCB2YWxpZC4KLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfZHVwbGljYXRlTW9kaWZpZXI9Jyd7MH0nJyBob3ZlciB1c2VzIHRoZSBzYW1lIG1vZGlmaWVyIGFzICcnezF9JycgaG92ZXIuCi1UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX25hbWVDb2x1bW5UaXRsZT1UZXh0IEhvdmVyIE5hbWUKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJDb2x1bW5UaXRsZT1QcmVzc2VkIEtleSBNb2RpZmllciBXaGlsZSBIb3ZlcmluZwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZWxpbWl0ZXI9KwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnREZWxpbWl0ZXJBbmRNb2RpZmllckFuZERlbGltaXRlcj1cICsgezB9ICsKLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0TW9kaWZpZXJBbmREZWxpbWl0ZXI9XCB7MH0gKwotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnREZWxpbWl0ZXJBbmRNb2RpZmllcj1cICsgezB9Ci1jb21iaW5hdGlvbkhvdmVyX2xhYmVsPUNvbWJpbmVkIEhvdmVyCi1jb21iaW5hdGlvbkhvdmVyX2Rlc2M9VHJpZXMgdGhlIGhvdmVycyBpbiB0aGUgc2VxdWVuY2UgbGlzdGVkIGluIHRoZSB0YWJsZSBiZWxvdyB0aGlzIG9uZSBhbmQgdXNlcyB0aGUgb25lIHdoaWNoIGZpdHMgYmVzdCBmb3IgdGhlIHNlbGVjdGVkIGVsZW1lbnQgYW5kIHRoZSBjdXJyZW50IGNvbnRleHQuCi1wcm9ibGVtSG92ZXJfbGFiZWw9UHJvYmxlbSBEZXNjcmlwdGlvbgotcHJvYmxlbUhvdmVyX2Rlc2M9U2hvd3MgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBzZWxlY3RlZCBwcm9ibGVtLgotZG9jdW1lbnRhdGlvbkhvdmVyX2xhYmVsPURvY3VtZW50YXRpb24gRGVzY3JpcHRpb24KLWRvY3VtZW50YXRpb25Ib3Zlcl9kZXNjPVNob3dzIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBzZWxlY3RlZCBlbGVtZW50LgotYW5ub3RhdGlvbkhvdmVyX2xhYmVsPUFubm90YXRpb24gRGVzY3JpcHRpb24KLWFubm90YXRpb25Ib3Zlcl9kZXNjPVNob3dzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgc2VsZWN0ZWQgYW5ub3RhdGlvbi4KLUVkaXRTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VzQWN0aW9uXzA9RWRpdG9yIFByZWZlcmVuY2VzCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzA9QXBwZWFyYW5jZQotUHJlZmVyZW5jZU1hbmFnZXJfMD1PcmlnaW5hbCBFcnJvcjoKLQotT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wPXswfSAtIHsxfSBPY2N1cnJlbmNlcyBpbiB7Mn0KLU9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMj1maWxlCi1TaG93Vmlld19lcnJvclRpdGxlPVByb2JsZW1zIFNob3dpbmcgVmlldwotcHJvY19kaXJ0eV9yZWdpb25zXzAgPSBQcm9jZXNzaW5nIERpcnR5IFJlZ2lvbnMKLQotdGV4dEhvdmVyTWFrZVN0aWNreUhpbnQ9UHJlc3MgJyd7MH0nJyBmb3IgZm9jdXMuCi0KLSMjIEVuY29kaW5nCi1FbmNvZGluZ1ByZWZlcmVuY2VQYWdlXzA9RW5jb2Rpbmcgc2V0dGluZ3MgZm9yIFdlYiBhbmQgWE1MIGZpbGVzOgotRW5jb2RpbmdQcmVmZXJlbmNlUGFnZV8xPVVzZSAzIGJ5dGUgQk9NIChCeXRlIE9yZGVyIE1hcmspIHdoZW4gc2F2aW5nIFVURi04IGVuY29kZWQgZmlsZXMKLWJ1c3k9YnVzeQotY2FyZXRfdXBkYXRlPWNhcmV0IHVwZGF0ZQotRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2VfMD1FeHBhbmQgdGhlIHRyZWUgdG8gZWRpdCBwcmVmZXJlbmNlcyBmb3IgYSBzcGVjaWZpYyBjb250ZW50IHR5cGUuCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8wPVNlbGVjdGlvbiBJbmZvcm1hdGlvbjoKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzI9UGFydGl0aW9ucwotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMz1JVGV4dFJlZ2lvbnMKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzQ9U3RydWN0dXJlZCBNb2RlbCBDb250ZW50LVR5cGU6IAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNT1Nb2RlbCBIYW5kbGVyOiAKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzY9RG9jdW1lbnQgQ2xhc3M6IAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNz1Eb2N1bWVudCBQcm92aWRlciBDbGFzczogCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV84PVBhcnRpdGlvbmluZ3M6Ci1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV85PVN0YXJ0Ci1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMD1MZW5ndGgKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzExPVR5cGUKLU9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEyPUlucHV0IFR5cGU6IAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTM9UGFydGl0aW9uZXI6IAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTQ9U2VsZWN0aW9uCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNT1TdGFydAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTY9TGVuZ3RoCi1PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNz1UZXh0IExlbmd0aAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTg9Q29udGV4dAotT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTk9V29ya2JlbmNoIFNlbGVjdGlvbgotCi1TdHJ1Y3R1cmVkVGV4dEVkaXRvcl8wPVVuc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSB3YXJuaW5nCi1Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMD1VbnN1cHBvcnRlZCBDb250ZW50IFR5cGUKLVVua25vd25Db250ZW50VHlwZURpYWxvZ18xPURvIG5vdCBzaG93IHRoaXMgbWVzc2FnZSBhZ2FpbgotVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nXzI9VW5zdXBwb3J0ZWQgY29udGVudCB0eXBlIGluIGVkaXRvci5cblRvIGFzc29jaWF0ZSBmaWxlIGV4dGVuc2lvbiB3aXRoIGEgc3VwcG9ydGVkIGNvbnRlbnQgdHlwZSxcbnBsZWFzZSBzZWUgPGE+Q29udGVudCBUeXBlcyBQcmVmZXJlbmNlIFBhZ2U8L2E+Ci0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBCZWxvdyBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVNhdmVfbGFiZWw9JlNhdmUKLUFuX2Vycm9yX2hhc19vY2N1cnJlZF93aGVuX0VSUk9SXz1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiByZXRyaWV2aW5nIHJlc291cmNlcyBmb3IgdGhlIHNvdXJjZSBlZGl0b3IuIFRoZSBFY2xpcHNlIFdvcmtiZW5jaCBpbnN0YWxsYXRpb24gbWF5IGhhdmUgYmVlbiBjb3JydXB0ZWQuCi0jIyBzYXZlIGFzIHByb2JsZW1zIChuZXh0IHR3bykgc2hvdWxkIG1hdGNoIHdoYXQgaXMgaW4gd29ya2JlbmNoCi1Qcm9ibGVtc19EdXJpbmdfU2F2ZV9Bc19VSV89UHJvYmxlbXMgRHVyaW5nIFNhdmUgQXMuLi4KLVNhdmVfY291bGRfbm90X2JlX2NvbXBsZXRlX1VJXz1TYXZlIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQuCi1NYW5hZ2VCcmVha3BvaW50c19lcnJvcl9yZW1vdmluZ190aXRsZTE9UmVtb3ZlIEJyZWFrcG9pbnQKLU1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX3JlbW92aW5nX21lc3NhZ2UxPUNhbm5vdCByZW1vdmUgYnJlYWtwb2ludAotTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfcmV0cmlldmluZ19tZXNzYWdlPVJldHJpZXZpbmcgbWFya2VycyBmYWlsZWQ6Ci1KU1BTb3VyY2VQcmVmZXJlbmNlUGFnZURlc2NyaXB0aW9uPUVtYmVkZGVkIGNvbnRlbnQgdHlwZVwncyBzb3VyY2UgcHJlZmVyZW5jZXMgd2lsbCBiZSB1c2VkLiBTZWxlY3QgdGhlIGZpbGUgdHlwZSBmb3IgY3VzdG9taXphdGlvbgotIyBUaGUgZm9sbG93aW5nIGxpbmVzIGNvcGllZCBmcm9tIG9yZ1xlY2xpcHNlXHVpXGVkaXRvcnNcdGV4dFxUZXh0RWRpdG9yTWVzc2FnZXMucHJvcGVydGllcyBpbiBvcmcuZWNsaXBzZS51aSBwbHVnaW4KLUVkaXRvcl9lcnJvcl9zYXZlX21lc3NhZ2U9U2F2ZSBjb3VsZCBub3QgYmUgY29tcGxldGVkLiB7MH0KLUVkaXRvcl9lcnJvcl9zYXZlX3RpdGxlPVByb2JsZW1zIER1cmluZyBTYXZlIEFzLi4uCi1FZGl0b3Jfd2FybmluZ19zYXZlX2RlbGV0ZT1UaGUgb3JpZ2luYWwgZmlsZSAnJ3swfScnIGhhcyBiZWVuIGRlbGV0ZWQuCi0KLSMgYWN0aW9ucwotUHJldmlvdXNfYW5ub3RhdGlvbj1QcmV2aW91cyBBbm5vdGF0aW9uCi1OZXh0X2Fubm90YXRpb249TmV4dCBBbm5vdGF0aW9uCi0jIEFubm90YXRpb24gVHlwZXMKLUFubm90YXRpb25UeXBlc19FcnJvcnM9RXJyb3JzCi1Bbm5vdGF0aW9uVHlwZXNfV2FybmluZ3M9V2FybmluZ3MKLUFubm90YXRpb25UeXBlc19UYXNrcz1UYXNrcwotQW5ub3RhdGlvblR5cGVzX1NlYXJjaFJlc3VsdHM9U2VhcmNoIFJlc3VsdHMKLUFubm90YXRpb25UeXBlc19Cb29rbWFya3M9Qm9va21hcmtzCi1Bbm5vdGF0aW9uVHlwZXNfT3RoZXJzPU90aGVycwotCi1FZGl0b3JfQ29udmVydFRvV2luZG93c19sYWJlbD0mV2luZG93cwotRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gV2luZG93cwotRWRpdG9yX0NvbnZlcnRUb1dpbmRvd3NfaW1hZ2U9Ci1FZGl0b3JfQ29udmVydFRvV2luZG93c19kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gV2luZG93cwotCi1FZGl0b3JfQ29udmVydFRvVU5JWF9sYWJlbD0mVU5JWAotRWRpdG9yX0NvbnZlcnRUb1VOSVhfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gVU5JWAotRWRpdG9yX0NvbnZlcnRUb1VOSVhfaW1hZ2U9Ci1FZGl0b3JfQ29udmVydFRvVU5JWF9kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gVU5JWAotCi1FZGl0b3JfQ29udmVydFRvTWFjX2xhYmVsPSZNYWMKLUVkaXRvcl9Db252ZXJ0VG9NYWNfdG9vbHRpcD1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gTWFjCi1FZGl0b3JfQ29udmVydFRvTWFjX2ltYWdlPQotRWRpdG9yX0NvbnZlcnRUb01hY19kZXNjcmlwdGlvbj1Db252ZXJ0cyBsaW5lIGRlbGltaXRlcnMgdG8gTWFjCi1Db252ZXJ0TGluZURlbGltaXRlcnNNZW51X2xhYmVsPUNvJm52ZXJ0IExpbmUgRGVsaW1pdGVycyB0bwotRmluZE9jY3VycmVuY2VzX2xhYmVsPU8mY2N1cnJlbmNlcyBpbiBGaWxlCi0KLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2pvYk5hbWU9Q29udmVydGluZyBsaW5lIGRlbGltaXRlcnMKLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlX2Vycm9yU3RhdHVzTWVzc2FnZT1FeGNlcHRpb25zIG9jY3VycmVkIHdoaWxlIGNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzCi1Db252ZXJ0TGluZURlbGltaXRlcnNUb0NSTEZBY3Rpb25EZWxlZ2F0ZV8zPUNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzIGZvciB7MH0KLUNvbnZlcnRMaW5lRGVsaW1pdGVyc1RvQ1JMRkFjdGlvbkRlbGVnYXRlXzQ9RXhjZXB0aW9uIG9jY3VycmVkIHdoaWxlIGNvbnZlcnRpbmcgbGluZSBkZWxpbWl0ZXJzIGZvciBkb2N1bWVudCB7MH0KLVRleHRIb3ZlclByZWZlcmVuY2VUYWJfYW5ub3RhdGlvblJvbGxvdmVyPSZFbmFibGUgYW5ub3RhdGlvbiByb2xsLW92ZXIgKG9uIG5ldyBlZGl0b3JzKQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9zaG93QWZmb3JkYW5jZT0mU2hvdyBhZmZvcmRhbmNlIGluIGhvdmVyIG9uIGhvdyB0byBtYWtlIGl0IHN0aWNreQotVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9lbmFibGVkPSZFbmFibGVkCi0KLUJhc2ljRmluZE9jY3VycmVuY2VzQWN0aW9uXzA9cmVnaW9uIG1hdGNoOgotQmFzaWNTZWFyY2hMYWJlbFByb3ZpZGVyXzA9bGluZQotTmF2aWdhdGlvblByZWZlcmVuY2VUYWJfMD1Nb2RpZmllciAnJ3swfScnIGlzIG5vdCB2YWxpZC4KLU9jY3VycmVuY2VzU2VhcmNoUXVlcnlfMT17MH0gLSAxIE9jY3VycmVuY2UgaW4gezF9Ci1GaWxlTW9kZWxQcm92aWRlcl8wPUVycm9yIHJlbG9hZGluZyB7MH0KLUpGYWNlTm9kZUFkYXB0ZXJfMD1VcGRhdGUgT3V0bGluZQotCi1Db25maWd1cmVQcm9qZWN0U2V0dGluZ3M9Q29uZmlndXJlIFByb2plY3QgU3BlY2lmaWMgU2V0dGluZ3MuLi4KLUNvbmZpZ3VyZVdvcmtzcGFjZVNldHRpbmdzPUNvbmZpZ3VyZSBXb3Jrc3BhY2UgU2V0dGluZ3MuLi4KLUVuYWJsZVByb2plY3RTZXR0aW5ncz1FbmFibGUgcHJvamVjdCBzcGVjaWZpYyBzZXR0aW5ncwotCi1Mb2FkaW5nUmVmZXJlbmNlZEdyYW1tYXJzPUxvYWRpbmcgcmVmZXJlbmNlZCBncmFtbWFycwotCi0jIyBGb2xkaW5nCi1Gb2xkaW5nPUZvbGRpbmcKLVN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMz1FbmFibGUgJmZvbGRpbmcKLVByb2plY3Rpb25fVG9nZ2xlX2xhYmVsPSAmRW5hYmxlIEZvbGRpbmcKLVByb2plY3Rpb25fVG9nZ2xlX3Rvb2x0aXA9IFRvZ2dsZXMgRm9sZGluZwotUHJvamVjdGlvbl9Ub2dnbGVfZGVzY3JpcHRpb249IFRvZ2dsZXMgZm9sZGluZyBmb3IgdGhlIGN1cnJlbnQgZWRpdG9yCi1Qcm9qZWN0aW9uX1RvZ2dsZV9pbWFnZT0KLVByb2plY3Rpb25fRXhwYW5kQWxsX2xhYmVsPSBFeHBhbmQgJkFsbAotUHJvamVjdGlvbl9FeHBhbmRBbGxfdG9vbHRpcD0gRXhwYW5kcyBBbGwgQ29sbGFwc2VkIFJlZ2lvbnMKLVByb2plY3Rpb25fRXhwYW5kQWxsX2Rlc2NyaXB0aW9uPSBFeHBhbmRzIGFueSBjb2xsYXBzZWQgcmVnaW9ucyBpbiB0aGUgY3VycmVudCBlZGl0b3IKLVByb2plY3Rpb25fRXhwYW5kQWxsX2ltYWdlPQotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9sYWJlbD0gQ29sbGFwc2UgQSZsbAotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF90b29sdGlwPSBDb2xsYXBzZXMgQWxsIEV4cGFuZGVkIFJlZ2lvbnMKLVByb2plY3Rpb25fQ29sbGFwc2VBbGxfZGVzY3JpcHRpb249IENvbGxhcHNlIGFueSBleHBhbmRlZCByZWdpb25zIGluIHRoZSBjdXJyZW50IGVkaXRvcgotUHJvamVjdGlvbl9Db2xsYXBzZUFsbF9pbWFnZT0KLQotIyMgVGhlc2UgYXJlIGNvcGllZCBmcm9tIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuRWRpdG9yTWVzc2FnZXMucHJvcGVydGllcwotIyMgVGhleSBhcmUgbmVlZGVkIHRlbXBvcmFyaWx5IHVudGlsIENNVkMgZGVmZWN0IDIwMzE1OCAvIEJ1Z3ppbGxhIGRlZmVjdCAyMDA1NCBpcyBmaXhlZAotRWRpdG9yX01hbmFnZUJvb2ttYXJrc190b29sdGlwPUFkZHMgYW5kIFJlbW92ZXMgQm9va21hcmtzCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2ltYWdlPQotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19kZXNjcmlwdGlvbj1BZGRzIGFuZCByZW1vdmVzIEJvb2ttYXJrcwotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfbGFiZWw9QWRkIEJvbyZrbWFyay4uLgotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19yZW1vdmVfbGFiZWw9UmVtb3ZlIEJvbyZrbWFyawotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX3RpdGxlPUFkZCBCb29rbWFyawotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19hZGRfZGlhbG9nX21lc3NhZ2U9RW50ZXIgQm9va21hcmsgbmFtZQotRWRpdG9yX01hbmFnZUJvb2ttYXJrc19lcnJvcl9kaWFsb2dfdGl0bGU9TWFuYWdpbmcgQm9va21hcmtzCi1FZGl0b3JfTWFuYWdlQm9va21hcmtzX2Vycm9yX2RpYWxvZ19tZXNzYWdlPVByb2JsZW1zIG1hbmFnaW5nIGJvb2ttYXJrcwotCi1FZGl0b3JfTWFuYWdlVGFza3NfdG9vbHRpcD1BZGRzIGFuZCBSZW1vdmVzIFRhc2tzCi1FZGl0b3JfTWFuYWdlVGFza3NfaW1hZ2U9Ci1FZGl0b3JfTWFuYWdlVGFza3NfZGVzY3JpcHRpb249QWRkcyBhbmQgcmVtb3ZlcyBUYXNrcwotRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9sYWJlbD1BZGQgJlRhc2suLi4KLUVkaXRvcl9NYW5hZ2VUYXNrc19yZW1vdmVfbGFiZWw9UmVtb3ZlICZUYXNrCi1FZGl0b3JfTWFuYWdlVGFza3NfYWRkX2RpYWxvZ190aXRsZT1BZGQgVGFzawotRWRpdG9yX01hbmFnZVRhc2tzX2FkZF9kaWFsb2dfbWVzc2FnZT1FbnRlciBUYXNrIGRlc2NyaXB0aW9uCi1FZGl0b3JfTWFuYWdlVGFza3NfZXJyb3JfZGlhbG9nX3RpdGxlPU1hbmFnaW5nIFRhc2tzCi1FZGl0b3JfTWFuYWdlVGFza3NfZXJyb3JfZGlhbG9nX21lc3NhZ2U9UHJvYmxlbXMgbWFuYWdpbmcgdGFza3MKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyBBYm92ZSBhcmUgcG9zc2libHkgdW51c2VkIHN0cmluZ3MgdGhhdCBtYXkgYmUgcmVtb3ZlZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotU3R5bGVkVGV4dENvbG9yUGlja2VyXzA9UGljayBhIGNvbG9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU2hvd1ZpZXdBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TaG93Vmlld0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTQzZjAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TaG93Vmlld0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkVycm9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotCi0vKioKLSAqIFN1cmZhY2VzIGEgVmlldy4KLSAqIAotICogQGF1dGhvciBOaXRpbiBEYWh5YWJoYWkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFNob3dWaWV3QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFNob3dWaWV3QWN0aW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZXh0Ci0JICovCi0JcHVibGljIFNob3dWaWV3QWN0aW9uKFN0cmluZyB0ZXh0KSB7Ci0JCXN1cGVyKHRleHQpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIGltYWdlCi0JICovCi0JcHVibGljIFNob3dWaWV3QWN0aW9uKFN0cmluZyB0ZXh0LCBJbWFnZURlc2NyaXB0b3IgaW1hZ2UpIHsKLQkJc3VwZXIodGV4dCwgaW1hZ2UpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0ZXh0Ci0JICogQHBhcmFtIHN0eWxlCi0JICovCi0JcHVibGljIFNob3dWaWV3QWN0aW9uKFN0cmluZyB0ZXh0LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIodGV4dCwgc3R5bGUpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFZpZXdJRCgpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uI3J1bigpCi0JICovCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlzdXBlci5ydW4oKTsKLQkJc2hvd1ZpZXcoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb24jcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotCQlzdXBlci5ydW5XaXRoRXZlbnQoZXZlbnQpOwotCQlzaG93VmlldygpOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2hvd1ZpZXcoKSB7Ci0JCUlXb3JrYmVuY2hXaW5kb3cgd2luZG93ID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlwYWdlLnNob3dWaWV3KGdldFZpZXdJRCgpKTsKLQkJCX0gY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCQlFcnJvckRpYWxvZy5vcGVuRXJyb3Iod2luZG93LmdldFNoZWxsKCksIFNTRVVJTWVzc2FnZXMuU2hvd1ZpZXdfZXJyb3JUaXRsZSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWUuZ2V0TWVzc2FnZSgpLCBlLmdldFN0YXR1cygpKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdG9yYWdlTW9kZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0b3JhZ2VNb2RlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3NmNjMDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0b3JhZ2VNb2RlbFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVN0b3JhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5GaWxlRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuU3RvcmFnZURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWxlbWVudFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvZGVkUmVhZGVyQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnLkJyZWFrcG9pbnRSdWxlckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JNb2RlbFV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQ7Ci0KLS8qKgotICogQSBTdG9yYWdlRG9jdW1lbnRQcm92aWRlciB0aGF0IGlzIElTdHJ1Y3R1cmVkTW9kZWwgYXdhcmUKLSAqLwotcHVibGljIGNsYXNzIFN0b3JhZ2VNb2RlbFByb3ZpZGVyIGV4dGVuZHMgU3RvcmFnZURvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJTW9kZWxQcm92aWRlciB7Ci0KLQlwcml2YXRlIGNsYXNzIEludGVybmFsRWxlbWVudFN0YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBJRWxlbWVudFN0YXRlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGVsZW1lbnRDb250ZW50QWJvdXRUb0JlUmVwbGFjZWQ6ICIgKyAoKElFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJLy8gd2UganVzdCBmb3J3YXJkIHRoZSBldmVudAotCQkJU3RvcmFnZU1vZGVsUHJvdmlkZXIudGhpcy5maXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChlbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDb250ZW50UmVwbGFjZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWlmIChkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZWxlbWVudENvbnRlbnRSZXBsYWNlZDogIiArICgoSUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCVN0b3JhZ2VJbmZvIGluZm8gPSAoU3RvcmFnZUluZm8pIGdldEVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCi0JCQkvKioKLQkJCSAqIEZvcmNlIGEgcmVsb2FkIG9mIHRoZSBtYXJrZXJzIGludG8gYW5ub3RhdGlvbnMgc2luY2UgdGhlaXIKLQkJCSAqIHByZXZpb3VzIFBvc2l0aW9ucyBoYXZlIGJlZW4gZGVsZXRlZC4gRGlzY29ubmVjdGluZyBhbmQKLQkJCSAqIHJlY29ubmVjdGluZyBmb3JjZXMgYSBjYWxsIHRvIHRoZSBwcml2YXRlIGNhdGNodXBXaXRoTWFya2VycwotCQkJICogbWV0aG9kLgotCQkJICovCi0JCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZk1vZGVsICE9IG51bGwpIHsKLQkJCQlpbmZvLmZNb2RlbC5kaXNjb25uZWN0KGluZm8uZkRvY3VtZW50KTsKLQkJCX0KLQotCQkJUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGlubmVyZG9jdW1lbnQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyB1cGRhdGUgZG9jdW1lbnQgZnJvbSBpbnB1dCdzIGNvbnRlbnRzCi0JCQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IG5ldyBDb2RlZFJlYWRlckNyZWF0b3IoY2FsY3VsYXRlSUQoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbSgoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKS5nZXRDb250ZW50cygpKSk7Ci0JCQkJcmVhZGVyID0gY29kZWRSZWFkZXJDcmVhdG9yLmdldENvZGVkUmVhZGVyKCk7Ci0KLQkJCQlpbm5lcmRvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGluZm8uZkRvY3VtZW50OwotCi0JCQkJaW50IG9yaWdpbmFsTGVuZ3RoVG9SZXBsYWNlID0gaW5uZXJkb2N1bWVudC5nZXRMZW5ndGgoKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJaW50IGJ1ZmZlclNpemUgPSAyMDQ4OwotCQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKLQkJCQlpbnQgblJlYWQgPSAwOwotCQkJCWJvb2xlYW4gZW9mID0gZmFsc2U7Ci0JCQkJd2hpbGUgKCFlb2YpIHsKLQkJCQkJblJlYWQgPSByZWFkZXIucmVhZChidWZmZXIsIDAsIGJ1ZmZlclNpemUpOwotCQkJCQlpZiAoblJlYWQgPT0gLTEpIHsKLQkJCQkJCWVvZiA9IHRydWU7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgMCwgblJlYWQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlubmVyZG9jdW1lbnQucmVwbGFjZVRleHQodGhpcywgMCwgb3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UsIHN0cmluZ0J1ZmZlci50b1N0cmluZygpLCB0cnVlKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZWFkZXIuY2xvc2UoKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCS8vIHdvdWxkIGJlIGhpZ2hseSB1bnVzdWFsCi0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gZm9yd2FyZCB0aGUgZXZlbnQKLQkJCWlmIChpbmZvLmZDYW5CZVNhdmVkKSB7Ci0JCQkJaW5mby5mQ2FuQmVTYXZlZCA9IGZhbHNlOwotCQkJCWFkZFVuY2hhbmdlZEVsZW1lbnRMaXN0ZW5lcnMoZWxlbWVudCwgaW5mbyk7Ci0JCQl9Ci0JCQlmaXJlRWxlbWVudENvbnRlbnRSZXBsYWNlZChlbGVtZW50KTsKLQkJCWZpcmVFbGVtZW50RGlydHlTdGF0ZUNoYW5nZWQoZWxlbWVudCwgZmFsc2UpOwotCi0JCQlpZiAoaW5mbyAhPSBudWxsICYmIGluZm8uZk1vZGVsICE9IG51bGwpIHsKLQkJCQlpbmZvLmZNb2RlbC5jb25uZWN0KGluZm8uZkRvY3VtZW50KTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnREZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlpZiAoZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGVsZW1lbnREZWxldGVkOiAiICsgKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCS8vIHdlIGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQKLQkJCVN0b3JhZ2VNb2RlbFByb3ZpZGVyLnRoaXMuZmlyZUVsZW1lbnREZWxldGVkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKE9iamVjdCBlbGVtZW50LCBib29sZWFuIGlzRGlydHkpIHsKLQkJCWlmIChkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkOiAiICsgKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldE5hbWUoKSArICIgKCIgKyBpc0RpcnR5ICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCX0KLQkJCS8vIHdlIGp1c3QgZm9yd2FyZCB0aGUgZXZlbnQKLQkJCVN0b3JhZ2VNb2RlbFByb3ZpZGVyLnRoaXMuZmlyZUVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChlbGVtZW50LCBpc0RpcnR5KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRNb3ZlZChPYmplY3Qgb3JpZ2luYWxFbGVtZW50LCBPYmplY3QgbW92ZWRFbGVtZW50KSB7Ci0JCQlpZiAoZGVidWdFbGVtZW50U3RhdGVsaXN0ZW5lcikgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGVsZW1lbnRNb3ZlZCAiICsgb3JpZ2luYWxFbGVtZW50ICsgIiAtLT4gIiArIG1vdmVkRWxlbWVudCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJLy8gd2UganVzdCBmb3J3YXJkIHRoZSBldmVudAotCQkJU3RvcmFnZU1vZGVsUHJvdmlkZXIudGhpcy5maXJlRWxlbWVudE1vdmVkKG9yaWdpbmFsRWxlbWVudCwgbW92ZWRFbGVtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIENvbGxlY3Rpb24gb2YgaW5mbyB0aGF0IGdvZXMgd2l0aCBhIG1vZGVsLgotCSAqLwotCXByaXZhdGUgY2xhc3MgTW9kZWxJbmZvIHsKLQkJcHVibGljIElFZGl0b3JJbnB1dCBmRWxlbWVudDsKLQkJcHVibGljIGJvb2xlYW4gZlNob3VsZFJlbGVhc2VPbkluZm9EaXNwb3NlOwotCQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBmU3RydWN0dXJlZE1vZGVsOwotCi0JCXB1YmxpYyBNb2RlbEluZm8oSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElFZGl0b3JJbnB1dCBlbGVtZW50LCBib29sZWFuIHNlbGZDcmVhdGVkKSB7Ci0JCQlmRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQlmU3RydWN0dXJlZE1vZGVsID0gc3RydWN0dXJlZE1vZGVsOwotCQkJZlNob3VsZFJlbGVhc2VPbkluZm9EaXNwb3NlID0gc2VsZkNyZWF0ZWQ7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z0VsZW1lbnRTdGF0ZWxpc3RlbmVyID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvc3RvcmFnZW1vZGVscHJvdmlkZXIvZWxlbWVudHN0YXRlbGlzdGVuZXIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCXN0YXRpYyBmaW5hbCBib29sZWFuIGRlYnVnT3BlcmF0aW9ucyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3N0b3JhZ2Vtb2RlbHByb3ZpZGVyL29wZXJhdGlvbnMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBzdGF0aWMgU3RvcmFnZU1vZGVsUHJvdmlkZXIgZkluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFN0b3JhZ2VNb2RlbFByb3ZpZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpCi0JCQlmSW5zdGFuY2UgPSBuZXcgU3RvcmFnZU1vZGVsUHJvdmlkZXIoKTsKLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIElFbGVtZW50U3RhdGVMaXN0ZW5lciBmSW50ZXJuYWxMaXN0ZW5lcjsKLQkvKiogSVN0cnVjdHVyZWRNb2RlbCBpbmZvcm1hdGlvbiBvZiBhbGwgY29ubmVjdGVkIGVsZW1lbnRzICovCi0JcHJpdmF0ZSBNYXAgZk1vZGVsSW5mb01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZSZXVzZU1vZGVsRG9jdW1lbnQgPSB0cnVlOwotCi0JcHJpdmF0ZSBTdG9yYWdlTW9kZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkludGVybmFsTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxFbGVtZW50U3RhdGVMaXN0ZW5lcigpOwotCX0KLQotCVN0cmluZyBjYWxjdWxhdGVCYXNlTG9jYXRpb24oSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlTdHJpbmcgbG9jYXRpb24gPSBudWxsOwotCQl0cnkgewotCQkJSVN0b3JhZ2Ugc3RvcmFnZSA9IGlucHV0LmdldFN0b3JhZ2UoKTsKLQkJCWlmIChzdG9yYWdlICE9IG51bGwpIHsKLQkJCQlJUGF0aCBzdG9yYWdlUGF0aCA9IHN0b3JhZ2UuZ2V0RnVsbFBhdGgoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IHN0b3JhZ2UuZ2V0TmFtZSgpOwotCQkJCWlmIChzdG9yYWdlUGF0aCAhPSBudWxsKSB7Ci0JCQkJCS8vIElmIHRoZXkgYXJlIGRpZmZlcmVudCwgdGhlIElTdG9yYWdlIGNvbnRyYWN0IGlzIG5vdAotCQkJCQkvLyBiZWluZyBob25vcmVkCi0JCQkJCS8vIChodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NzMwOTgpLgotCQkJCQkvLyBGYXZvciB0aGUgbmFtZS4KLQkJCQkJaWYgKCFzdG9yYWdlUGF0aC5sYXN0U2VnbWVudCgpLmVxdWFscyhuYW1lKSkgewotCQkJCQkJSVBhdGggd29ya2luZ1BhdGggPSBzdG9yYWdlUGF0aC5hZGRUcmFpbGluZ1NlcGFyYXRvcigpOwotCQkJCQkJbG9jYXRpb24gPSB3b3JraW5nUGF0aC5hcHBlbmQobmFtZSkudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWxvY2F0aW9uID0gc3RvcmFnZVBhdGgubWFrZUFic29sdXRlKCkudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCQkJbG9jYXRpb24gPSBuYW1lOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobG9jYXRpb24gPT0gbnVsbCkKLQkJCQlsb2NhdGlvbiA9IGlucHV0LmdldE5hbWUoKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JU3RyaW5nIGNhbGN1bGF0ZUlEKElTdG9yYWdlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJLyoqCi0JCSAqIFR5cGljYWxseSBDVlMgd2lsbCByZXR1cm4gYSBwYXRoIG9mICJmaWxlbmFtZS5leHQiIGFuZCB0aGUgaW5wdXQncwotCQkgKiBuYW1lIHdpbGwgYmUgImZpbGVuYW1lLmV4dCB2ZXJzaW9uIi4gVGhlIHBhdGggbXVzdCBiZSB1c2VkIHRvIGxvYWQKLQkJICogdGhlIG1vZGVsIHNvIHRoYXQgdGhlIHN1ZmZpeCB3aWxsIGJlIGF2YWlsYWJsZSB0byBjb21wdXRlIHRoZQotCQkgKiBjb250ZW50VHlwZSBwcm9wZXJseS4gVGhlIGVkaXRvciBpbnB1dCBuYW1lIGNhbiB0aGVuIGJlIHNldCBhcyB0aGUKLQkJICogYmFzZSBsb2NhdGlvbiBmb3IgZGlzcGxheSBvbiB0aGUgZWRpdG9yIHRpdGxlIGJhci4KLQkJICogCi0JCSAqLwotCQlTdHJpbmcgcGF0aCA9IG51bGw7Ci0JCWJvb2xlYW4gYWRkSGFzaCA9IGZhbHNlOwotCQl0cnkgewotCQkJSVN0b3JhZ2Ugc3RvcmFnZSA9IGlucHV0LmdldFN0b3JhZ2UoKTsKLQkJCWlmIChzdG9yYWdlICE9IG51bGwpIHsKLQkJCQlJUGF0aCBzdG9yYWdlUGF0aCA9IHN0b3JhZ2UuZ2V0RnVsbFBhdGgoKTsKLQkJCQlTdHJpbmcgbmFtZSA9IHN0b3JhZ2UuZ2V0TmFtZSgpOwotCQkJCS8vIGlmIGVpdGhlciB0aGUgbmFtZSBvciBzdG9yYWdlIHBhdGggYXJlIG51bGwgb3IgdGhleSBhcmUKLQkJCQkvLyBpZGVudGljYWwsIGFkZCBhIGhhc2ggdG8gaXQgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MKLQkJCQlhZGRIYXNoID0gc3RvcmFnZVBhdGggPT0gbnVsbCB8fCBzdG9yYWdlUGF0aC50b1N0cmluZygpLmVxdWFscyhuYW1lKTsKLQkJCQlpZiAoc3RvcmFnZVBhdGggIT0gbnVsbCkgewotCQkJCQkvLyBJZiB0aGV5IGFyZSBkaWZmZXJlbnQsIHRoZSBJU3RvcmFnZSBjb250cmFjdCBpcyBub3QKLQkJCQkJLy8gYmVpbmcgaG9ub3JlZAotCQkJCQkvLyAoaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTczMDk4KS4KLQkJCQkJLy8gRmF2b3IgdGhlIG5hbWUuCi0JCQkJCWlmICghc3RvcmFnZVBhdGgubGFzdFNlZ21lbnQoKS5lcXVhbHMobmFtZSkpIHsKLQkJCQkJCUlQYXRoIHdvcmtpbmdQYXRoID0gc3RvcmFnZVBhdGguYWRkVHJhaWxpbmdTZXBhcmF0b3IoKTsKLQkJCQkJCXBhdGggPSB3b3JraW5nUGF0aC5hcHBlbmQobmFtZSkudG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXBhdGggPSBzdG9yYWdlUGF0aC5tYWtlQWJzb2x1dGUoKS50b1N0cmluZygpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChwYXRoID09IG51bGwpCi0JCQkJCXBhdGggPSBuYW1lOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAocGF0aCA9PSBudWxsKQotCQkJCXBhdGggPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChhZGRIYXNoKQotCQkJcGF0aCA9IGlucHV0Lmhhc2hDb2RlKCkgKyBwYXRoOwotCQlyZXR1cm4gcGF0aDsKLQl9Ci0KLQkvLyBwdWJsaWMgYm9vbGVhbiBjYW5TYXZlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkvLyByZXR1cm4gZmFsc2U7Ci0JLy8gfQotCi0JcHJvdGVjdGVkIElBbm5vdGF0aW9uTW9kZWwgY3JlYXRlQW5ub3RhdGlvbk1vZGVsKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBudWxsOwotCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlQW5ub3RhdGlvbk1vZGVsIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVBbm5vdGF0aW9uTW9kZWwgZm9yICIgKyBlbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCA9IChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJU3RyaW5nIGNvbnRlbnRUeXBlID0gKGdldE1vZGVsKGlucHV0KSAhPSBudWxsID8gZ2V0TW9kZWwoaW5wdXQpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpIDogbnVsbCk7Ci0JCQlTdHJpbmcgZXh0ID0gQnJlYWtwb2ludFJ1bGVyQWN0aW9uLmdldEZpbGVFeHRlbnNpb24oKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCQlJUmVzb3VyY2UgcmVzID0gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlKGlucHV0LCBjb250ZW50VHlwZSwgZXh0KTsKLQkJCVN0cmluZyBpZCA9IGlucHV0LmdldE5hbWUoKTsKLQkJCWlmIChpbnB1dC5nZXRTdG9yYWdlKCkgIT0gbnVsbCAmJiBpbnB1dC5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKSAhPSBudWxsKSB7Ci0JCQkJaWQgPSBpbnB1dC5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpOwotCQkJfQotCQkJLy8gd2UgY2FuIG9ubHkgY3JlYXRlIGEgcmVzb3VyY2UgbWFya2VyIGFubm90YXRpb25tb2RlbCBvZmYgb2YgYQotCQkJLy8gdmFsaWQgcmVzb3VyY2UKLQkJCWlmIChyZXMgIT0gbnVsbCkKLQkJCQltb2RlbCA9IG5ldyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwocmVzLCBpZCk7Ci0JCQllbHNlCi0JCQkJbW9kZWwgPSBuZXcgQW5ub3RhdGlvbk1vZGVsKCk7Ci0JCX0KLQkJaWYgKG1vZGVsID09IG51bGwpIHsKLQkJCW1vZGVsID0gc3VwZXIuY3JlYXRlQW5ub3RhdGlvbk1vZGVsKGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGNyZWF0ZURvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkKLQkJCQl0cnkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVEb2N1bWVudCBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlRG9jdW1lbnQgZm9yICIgKyBlbGVtZW50ICsgIihleGNlcHRpb24gY2F1Z2h0KSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQllbHNlIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3JhZ2VNb2RlbFByb3ZpZGVyOiBjcmVhdGVEb2N1bWVudCBmb3IgIiArIGVsZW1lbnQpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQkvLyBUaGUgZm9sbG93aW5nIGlzIGxhcmdlbHkgY29waWVkIGZyb20gRmlsZU1vZGVsUHJvdmlkZXIKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFZGl0b3JJbnB1dCkgewotCQkJLy8gY3JlYXRlIGEgbmV3IElEb2N1bWVudCBmb3IgdGhlIGVsZW1lbnQ7IHNob3VsZCBhbHdheXMgcmVmbGVjdAotCQkJLy8gdGhlIGNvbnRlbnRzIG9mIHRoZSByZXNvdXJjZQotCQkJTW9kZWxJbmZvIGluZm8gPSBnZXRNb2RlbEluZm9Gb3IoKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm8gY29ycmVzcG9uZGluZyBtb2RlbCBpbmZvIGZvdW5kIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBpbmZvLmZTdHJ1Y3R1cmVkTW9kZWw7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCWlmICghZlJldXNlTW9kZWxEb2N1bWVudCAmJiBlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCQlSZWFkZXIgcmVhZGVyID0gbnVsbDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBpbm5lcmRvY3VtZW50ID0gbnVsbDsKLQkJCQkJdHJ5IHsKLQkJCQkJCS8vIHVwZGF0ZSBkb2N1bWVudCBmcm9tIGlucHV0J3MgY29udGVudHMKLQotCQkJCQkJQ29kZWRSZWFkZXJDcmVhdG9yIGNvZGVkUmVhZGVyQ3JlYXRvciA9IG5ldyBDb2RlZFJlYWRlckNyZWF0b3IoY2FsY3VsYXRlSUQoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLCBVdGlsaXRpZXMuZ2V0TWFya1N1cHBvcnRlZFN0cmVhbSgoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKS5nZXRDb250ZW50cygpKSk7Ci0JCQkJCQlyZWFkZXIgPSBjb2RlZFJlYWRlckNyZWF0b3IuZ2V0Q29kZWRSZWFkZXIoKTsKLQotCQkJCQkJaW5uZXJkb2N1bWVudCA9IG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQkJCQlpbnQgb3JpZ2luYWxMZW5ndGhUb1JlcGxhY2UgPSBpbm5lcmRvY3VtZW50LmdldExlbmd0aCgpOwotCi0JCQkJCQkvKgotCQkJCQkJICogVE9ET19mdXR1cmU6IHdlIGNvdWxkIGltcGxlbWVudCB3aXRoIHNlcXVlbnRpYWwKLQkJCQkJCSAqIHJld3JpdGUsIGlmIHdlIGRvbid0IHBpY2t1cCBhdXRvbWF0aWNhbGx5IGZyb20KLQkJCQkJCSAqIEZpbGVCdWZmZXIgc3VwcG9ydCwgc28gbm90IHNvIG11Y2ggaGFzIHRvIGJlIHB1bGxlZAotCQkJCQkJICogaW50byBtZW1vcnkgKGFzIGFuIGV4dHJhIGJpZyBzdHJpbmcpLCBidXQgd2UgbmVlZAotCQkJCQkJICogdG8gY2FycnkgdGhhdCBBUEkgdGhyb3VnaCBzbyB0aGF0IFN0cnVjdHVyZWRNb2RlbAotCQkJCQkJICogaXMgbm90IG5vdGlmaWVkIHVudGlsIGRvbmUuCi0JCQkJCQkgKi8KLQotCQkJCQkJLy8gaW5uZXJkb2N1bWVudC5zdGFydFNlcXVlbnRpYWxSZXdyaXRlKHRydWUpOwotCQkJCQkJLy8gaW5uZXJkb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLAotCQkJCQkJLy8gaW5uZXJkb2N1bWVudC5nZXRMZW5ndGgoKSwgIiIpOwotCQkJCQkJU3RyaW5nQnVmZmVyIHN0cmluZ0J1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCWludCBidWZmZXJTaXplID0gMjA0ODsKLQkJCQkJCWNoYXJbXSBidWZmZXIgPSBuZXcgY2hhcltidWZmZXJTaXplXTsKLQkJCQkJCWludCBuUmVhZCA9IDA7Ci0JCQkJCQlib29sZWFuIGVvZiA9IGZhbHNlOwotCQkJCQkJd2hpbGUgKCFlb2YpIHsKLQkJCQkJCQluUmVhZCA9IHJlYWRlci5yZWFkKGJ1ZmZlciwgMCwgYnVmZmVyU2l6ZSk7Ci0JCQkJCQkJaWYgKG5SZWFkID09IC0xKSB7Ci0JCQkJCQkJCWVvZiA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGJ1ZmZlciwgMCwgblJlYWQpOwotCQkJCQkJCQkvLyBpbm5lcmRvY3VtZW50LnJlcGxhY2VUZXh0KHRoaXMsCi0JCQkJCQkJCS8vIGlubmVyZG9jdW1lbnQuZ2V0TGVuZ3RoKCksIDAsIG5ldwotCQkJCQkJCQkvLyBTdHJpbmcoYnVmZmVyLCAwLCBuUmVhZCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGlnbm9yZSByZWFkLW9ubHkgc2V0dGluZ3MgaWYgcmV2ZXJ0aW5nIHdob2xlCi0JCQkJCQkvLyBkb2N1bWVudAotCQkJCQkJaW5uZXJkb2N1bWVudC5yZXBsYWNlVGV4dCh0aGlzLCAwLCBvcmlnaW5hbExlbmd0aFRvUmVwbGFjZSwgc3RyaW5nQnVmZmVyLnRvU3RyaW5nKCksIHRydWUpOwotCQkJCQkJbW9kZWwuc2V0RGlydHlTdGF0ZShmYWxzZSk7Ci0KLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJCWZpbmFsbHkgewotCQkJCQkJaWYgKHJlYWRlciAhPSBudWxsKSB7Ci0JCQkJCQkJdHJ5IHsKLQkJCQkJCQkJcmVhZGVyLmNsb3NlKCk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlMSkgewotCQkJCQkJCQkvLyB3b3VsZCBiZSBoaWdobHkgdW51c3VhbAotCQkJCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUxKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpZiAoaW5uZXJkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBpbm5lcmRvY3VtZW50LnN0b3BTZXF1ZW50aWFsUmV3cml0ZSgpOwotCQkJCQkJLy8gfQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCQkJZG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIEFsc28gY3JlYXRlIE1vZGVsSW5mbyAtIGV4dHJhIHJlc291cmNlIHN5bmNocm9uaXphdGlvbiBjbGFzc2VzIHNob3VsZAotCSAqIGJlIHN0b3JlZCB3aXRoaW4gdGhlIE1vZGVsSW5mbwotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50SW5mbyBjcmVhdGVFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkvLyBjcmVhdGUgdGhlIGNvcnJlc3BvbmRpbmcgTW9kZWxJbmZvIGlmIG5lY2Vzc2FyeQotCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpCi0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlRWxlbWVudEluZm8gZm9yICIgKyAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGVsZW1lbnQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZUVsZW1lbnRJbmZvIGZvciAiICsgZWxlbWVudCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJZWxzZQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZUVsZW1lbnRJbmZvIGZvciAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWlmIChnZXRNb2RlbEluZm9Gb3IoKElFZGl0b3JJbnB1dCkgZWxlbWVudCkgPT0gbnVsbCkgewotCQkJY3JlYXRlTW9kZWxJbmZvKChJRWRpdG9ySW5wdXQpIGVsZW1lbnQpOwotCQl9Ci0KLQkJRWxlbWVudEluZm8gaW5mbyA9IHN1cGVyLmNyZWF0ZUVsZW1lbnRJbmZvKGVsZW1lbnQpOwotCQlyZXR1cm4gaW5mbzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVNb2RlbEluZm8oSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCWlmIChnZXRNb2RlbEluZm9Gb3IoaW5wdXQpID09IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gc2VsZkNyZWF0ZU1vZGVsKGlucHV0KTsKLQkJCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCWNyZWF0ZU1vZGVsSW5mbyhpbnB1dCwgc3RydWN0dXJlZE1vZGVsLCB0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFRvIGJlIHVzZWQgd2hlbiBtb2RlbCBpcyBwcm92aWRlZCB0byB1cywgZW5zdXJlcyB0aGF0IHdoZW4gc2V0SW5wdXQgaXMKLQkgKiB1c2VkIG9uIHRoaXMgaW5wdXQsIHRoZSBnaXZlbiBtb2RlbCB3aWxsIGJlIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlTW9kZWxJbmZvKElFZGl0b3JJbnB1dCBpbnB1dCwgSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIGJvb2xlYW4gcmVsZWFzZU1vZGVsT25EaXNjb25uZWN0KSB7Ci0JCS8vIHdlIGhhdmUgdG8gbWFrZSBzdXJlIGZhY3RvcmllcyBhcmUgYWRkZWQsIHdoZXRoZXIgd2UgY3JlYXRlZCBvcgotCQkvLyBub3QuCi0JCWlmIChnZXRNb2RlbEluZm9Gb3IoaW5wdXQpICE9IG51bGwgfHwgZ2V0TW9kZWxJbmZvRm9yKHN0cnVjdHVyZWRNb2RlbCkgIT0gbnVsbCkgewotCQkJaWYgKGRlYnVnT3BlcmF0aW9ucykgewotCQkJCWlmIChpbnB1dCBpbnN0YW5jZW9mIElTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQotCQkJCQl0cnkgewotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogRFVQTElDQVRFIGNyZWF0ZU1vZGVsSW5mbyBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpLmdldFN0b3JhZ2UoKS5nZXRGdWxsUGF0aCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IERVUExJQ0FURSBjcmVhdGVNb2RlbEluZm8gZm9yICIgKyBpbnB1dCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic3RvcmFnZU1vZGVsUHJvdmlkZXI6IERVUExJQ0FURSBjcmVhdGVNb2RlbEluZm8gZm9yICIgKyBpbnB1dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZGVidWdPcGVyYXRpb25zKSB7Ci0JCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlTW9kZWxJbmZvIGZvciAiICsgKChJU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogY3JlYXRlTW9kZWxJbmZvIGZvciAiICsgaW5wdXQgKyAiKGV4Y2VwdGlvbiBjYXVnaHQpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGNyZWF0ZU1vZGVsSW5mbyBmb3IgIiArIGlucHV0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCSgoSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSBpbnB1dCkuYWRkRWxlbWVudFN0YXRlTGlzdGVuZXIoZkludGVybmFsTGlzdGVuZXIpOwotCQl9Ci0KLQkJRWRpdG9yTW9kZWxVdGlsLmFkZEZhY3Rvcmllc1RvKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJTW9kZWxJbmZvIG1vZGVsSW5mbyA9IG5ldyBNb2RlbEluZm8oc3RydWN0dXJlZE1vZGVsLCBpbnB1dCwgcmVsZWFzZU1vZGVsT25EaXNjb25uZWN0KTsKLQkJZk1vZGVsSW5mb01hcC5wdXQoaW5wdXQsIG1vZGVsSW5mbyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzcG9zZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50LCBFbGVtZW50SW5mbyBpbmZvKSB7Ci0JCWlmIChkZWJ1Z09wZXJhdGlvbnMpIHsKLQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCXRyeSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGRpc3Bvc2VFbGVtZW50SW5mbyBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZUVsZW1lbnRJbmZvIGZvciAiICsgZWxlbWVudCArICIoZXhjZXB0aW9uIGNhdWdodCkiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZUVsZW1lbnRJbmZvIGZvciAiICsgZWxlbWVudCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSUVkaXRvcklucHV0KSB7Ci0JCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSAoSUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJTW9kZWxJbmZvIG1vZGVsSW5mbyA9IGdldE1vZGVsSW5mb0ZvcihpbnB1dCk7Ci0JCQlkaXNwb3NlTW9kZWxJbmZvKG1vZGVsSW5mbyk7Ci0JCX0KLQkJc3VwZXIuZGlzcG9zZUVsZW1lbnRJbmZvKGVsZW1lbnQsIGluZm8pOwotCX0KLQotCS8qKgotCSAqIGRpc2Nvbm5lY3QgZnJvbSB0aGlzIG1vZGVsIGluZm8KLQkgKiAKLQkgKiBAcGFyYW0gaW5mbwotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2VNb2RlbEluZm8oTW9kZWxJbmZvIGluZm8pIHsKLQkJaWYgKGRlYnVnT3BlcmF0aW9ucykgewotCQkJaWYgKGluZm8uZkVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZU1vZGVsSW5mbyBmb3IgIiArICgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5mby5mRWxlbWVudCkuZ2V0U3RvcmFnZSgpLmdldEZ1bGxQYXRoKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdG9yYWdlTW9kZWxQcm92aWRlcjogZGlzcG9zZU1vZGVsSW5mbyBmb3IgIiArIGluZm8uZkVsZW1lbnQgKyAiKGV4Y2VwdGlvbiBjYXVnaHQpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RvcmFnZU1vZGVsUHJvdmlkZXI6IGRpc3Bvc2VNb2RlbEluZm8gZm9yICIgKyBpbmZvLmZFbGVtZW50KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKGluZm8uZkVsZW1lbnQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQlpZiAoaW5mby5mRWxlbWVudCBpbnN0YW5jZW9mIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCSgoSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSBpbmZvLmZFbGVtZW50KS5yZW1vdmVFbGVtZW50U3RhdGVMaXN0ZW5lcihmSW50ZXJuYWxMaXN0ZW5lcik7Ci0JCQl9Ci0JCQlpZiAoaW5mby5mU2hvdWxkUmVsZWFzZU9uSW5mb0Rpc3Bvc2UpIHsKLQkJCQlpbmZvLmZTdHJ1Y3R1cmVkTW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQkJZk1vZGVsSW5mb01hcC5yZW1vdmUoaW5mby5mRWxlbWVudCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0RG9jdW1lbnRQcm92aWRlciNkb1Jlc2V0RG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGRvUmVzZXREb2N1bWVudChPYmplY3QgZWxlbWVudCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWZSZXVzZU1vZGVsRG9jdW1lbnQgPSBmYWxzZTsKLQkJc3VwZXIuZG9SZXNldERvY3VtZW50KGVsZW1lbnQsIG1vbml0b3IpOwotCQlmUmV1c2VNb2RlbERvY3VtZW50ID0gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyI2RvU2F2ZURvY3VtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGJvb2xlYW4pCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9TYXZlRG9jdW1lbnQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBPYmplY3QgZWxlbWVudCwgSURvY3VtZW50IGRvY3VtZW50LCBib29sZWFuIG92ZXJ3cml0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQluZXcgRmlsZURvY3VtZW50UHJvdmlkZXIoKS5zYXZlRG9jdW1lbnQobW9uaXRvciwgZWxlbWVudCwgZG9jdW1lbnQsIG92ZXJ3cml0ZSk7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoSUVkaXRvcklucHV0IGVsZW1lbnQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCByZXN1bHQgPSBudWxsOwotCQlNb2RlbEluZm8gaW5mbyA9IGdldE1vZGVsSW5mb0ZvcihlbGVtZW50KTsKLQkJaWYgKGluZm8gIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gaW5mby5mU3RydWN0dXJlZE1vZGVsOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklNb2RlbFByb3ZpZGVyI2dldE1vZGVsKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0TW9kZWwoT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRWRpdG9ySW5wdXQpCi0JCQlyZXR1cm4gZ2V0TW9kZWwoKElFZGl0b3JJbnB1dCkgZWxlbWVudCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgTW9kZWxJbmZvIGdldE1vZGVsSW5mb0ZvcihJRWRpdG9ySW5wdXQgZWxlbWVudCkgewotCQlNb2RlbEluZm8gcmVzdWx0ID0gKE1vZGVsSW5mbykgZk1vZGVsSW5mb01hcC5nZXQoZWxlbWVudCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBNb2RlbEluZm8gZ2V0TW9kZWxJbmZvRm9yKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCU1vZGVsSW5mbyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCU1vZGVsSW5mb1tdIG1vZGVsSW5mb3MgPSAoTW9kZWxJbmZvW10pIGZNb2RlbEluZm9NYXAudmFsdWVzKCkudG9BcnJheShuZXcgTW9kZWxJbmZvWzBdKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbW9kZWxJbmZvcy5sZW5ndGg7IGkrKykgewotCQkJCU1vZGVsSW5mbyBpbmZvID0gbW9kZWxJbmZvc1tpXTsKLQkJCQlpZiAoc3RydWN0dXJlZE1vZGVsLmVxdWFscyhpbmZvLmZTdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCXJlc3VsdCA9IGluZm87Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBsb2FkTW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHJldHVybiBJU3RydWN0dXJlZE1vZGVsCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkTW9kZWwgbG9hZE1vZGVsKElTdG9yYWdlRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGxvYWRNb2RlbChpbnB1dCwgZmFsc2UpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBsb2FkTW9kZWwuCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIGxvZ0V4Y2VwdGlvbnMKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkTW9kZWwKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBsb2FkTW9kZWwoSVN0b3JhZ2VFZGl0b3JJbnB1dCBpbnB1dCwgYm9vbGVhbiBsb2dFeGNlcHRpb25zKSB7Ci0JCVN0cmluZyBpZCA9IGNhbGN1bGF0ZUlEKGlucHV0KTsKLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJSW5wdXRTdHJlYW0gY29udGVudHMgPSBudWxsOwotCQl0cnkgewotCQkJY29udGVudHMgPSBpbnB1dC5nZXRTdG9yYWdlKCkuZ2V0Q29udGVudHMoKTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBub1N0b3JhZ2VFeGMpIHsKLQkJCWlmIChsb2dFeGNlcHRpb25zKQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5fMzJjb25jYXRfRVhDXywgbmV3IE9iamVjdFtde2lucHV0LmdldE5hbWUoKX0pLCBub1N0b3JhZ2VFeGMpOwotCQl9Ci0KLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSB1bmlxdWUKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoaWQsIGNvbnRlbnRzLCBudWxsKTsKLQkJCW1vZGVsLnNldEJhc2VMb2NhdGlvbihjYWxjdWxhdGVCYXNlTG9jYXRpb24oaW5wdXQpKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJaWYgKGxvZ0V4Y2VwdGlvbnMpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihOTFMuYmluZChTU0VVSU1lc3NhZ2VzLl8zMmNvbmNhdF9FWENfLCBuZXcgT2JqZWN0W117aW5wdXR9KSwgZSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoY29udGVudHMgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWNvbnRlbnRzLmNsb3NlKCk7Ci0JCQkJfQotCQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIG5vdGhpbmcKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaW5wdXQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIHNlbGZDcmVhdGVNb2RlbChJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJcmV0dXJuIGxvYWRNb2RlbCgoSVN0b3JhZ2VFZGl0b3JJbnB1dCkgaW5wdXQpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTkzZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSUxvY2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5BYnN0cmFjdERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Db25maWd1cmFibGVMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50QWRhcHRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZXBhaXJhYmxlRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnByb2plY3Rpb24uUHJvamVjdGlvbkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5UZXh0Q2hhbmdpbmdFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLklMb2NrYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci0KLQotLyoqCi0gKiBBZGFwdHMgSVN0cnVjdHVyZWREb2N1bWVudCBldmVudHMgYW5kIG1ldGhvZHMgdG8gU3R5bGVkVGV4dENvbnRlbnQgZXZlbnRzCi0gKiBhbmQgbWV0aG9kcwotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciBpbXBsZW1lbnRzIElEb2N1bWVudEFkYXB0ZXIsIElEb2N1bWVudEFkYXB0ZXJFeHRlbnNpb24gewotCi0JcHJpdmF0ZSBjbGFzcyBEb2N1bWVudENsb25lIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudCB7Ci0KLQotCQkvKioKLQkJICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBjbG9uZSB3aXRoIHRoZSBnaXZlbiBjb250ZW50LgotCQkgKiAKLQkJICogQHBhcmFtIGNvbnRlbnQKLQkJICogICAgICAgICAgICB0aGUgY29udGVudAotCQkgKiBAcGFyYW0gbGluZURlbGltaXRlcnMKLQkJICogICAgICAgICAgICB0aGUgbGluZSBkZWxpbWl0ZXJzCi0JCSAqLwotCQlwdWJsaWMgRG9jdW1lbnRDbG9uZShTdHJpbmcgY29udGVudCwgU3RyaW5nW10gbGluZURlbGltaXRlcnMpIHsKLQkJCXN1cGVyKCk7Ci0JCQlzZXRUZXh0U3RvcmUobmV3IFN0cmluZ1RleHRTdG9yZShjb250ZW50KSk7Ci0JCQlDb25maWd1cmFibGVMaW5lVHJhY2tlciB0cmFja2VyID0gbmV3IENvbmZpZ3VyYWJsZUxpbmVUcmFja2VyKGxpbmVEZWxpbWl0ZXJzKTsKLQkJCXNldExpbmVUcmFja2VyKHRyYWNrZXIpOwotCQkJZ2V0VHJhY2tlcigpLnNldChjb250ZW50KTsKLQkJCWNvbXBsZXRlSW5pdGlhbGl6YXRpb24oKTsKLQkJfQotCX0KLQotCS8vIEEgcHJlLW5vdGlmaWNhdGlvbiBsaXN0ZW5lciBmb3IgdGhlIHZpZXdlcidzIERvY3VtZW50Ci0JY2xhc3MgRG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElEb2N1bWVudExpc3RlbmVyIHsKLQkJcHJvdGVjdGVkIGJvb2xlYW4gYWxsVGV4dENoYW5nZWQgPSBmYWxzZTsKLQotCQlwcm90ZWN0ZWQgRG9jdW1lbnRFdmVudCBjdXJyZW50RXZlbnQ7Ci0KLQkJc3luY2hyb25pemVkIHB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkKLQkJCQlyZXR1cm47Ci0KLQkJCXBlbmRpbmdEb2N1bWVudENoYW5nZWRFdmVudCA9IHRydWU7Ci0JCQlhbGxUZXh0Q2hhbmdlZCA9IGV2ZW50LmdldE9mZnNldCgpIDw9IDAgJiYgZXZlbnQuZ2V0TGVuZ3RoKCkgPj0gU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0JCQljdXJyZW50RXZlbnQgPSBldmVudDsKLQotCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLnJlbGF5VGV4dENoYW5naW5nKGV2ZW50LmdldE9mZnNldCgpLCBldmVudC5nZXRMZW5ndGgoKSwgZXZlbnQuZ2V0VGV4dCgpKTsKLQkJfQotCi0JCXN5bmNocm9uaXplZCBwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpCi0JCQkJcmV0dXJuOwotCi0JCQlpZiAoY3VycmVudEV2ZW50ICE9IG51bGwgJiYgZXZlbnQgPT0gY3VycmVudEV2ZW50KSB7Ci0JCQkJaWYgKGFsbFRleHRDaGFuZ2VkKSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5yZWxheVRleHRTZXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRlbXAgd29yayBhcm91bmQgZm9yIGltbWVkaWF0ZSB0aHJlYWQKLQkJCQkJLy8gcHJvYmxlbS4KLQkJCQkJLy8gc2hvdWxkIGhhdmUgbW9yZSBnZW5lcmFsIHNvbHV0aW9uCi0JCQkJCS8vIHNvb24uICdzeW5jRXhlYycgYXJlIHJ1bW9yZWQgdG8gYmUKLQkJCQkJLy8gcHJvbmUgdG8gaGFuZy4KLQkJCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLnJlbGF5VGV4dENoYW5nZWQoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWN1cnJlbnRFdmVudCA9IG51bGw7Ci0JCQlwZW5kaW5nRG9jdW1lbnRDaGFuZ2VkRXZlbnQgPSBmYWxzZTsKLQkJCWhhbmRsZVBlbmRpbmdFdmVudHMoKTsKLQkJCWxhc3RFdmVudCA9IG51bGw7Ci0KLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ1RleHRTdG9yZSBpbXBsZW1lbnRzIElUZXh0U3RvcmUgewotCi0JCXByaXZhdGUgU3RyaW5nIGZDb250ZW50OwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIGEgbmV3IHN0cmluZyB0ZXh0IHN0b3JlIHdpdGggdGhlIGdpdmVuIGNvbnRlbnQuCi0JCSAqIAotCQkgKiBAcGFyYW0gY29udGVudAotCQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50Ci0JCSAqLwotCQlwdWJsaWMgU3RyaW5nVGV4dFN0b3JlKFN0cmluZyBjb250ZW50KSB7Ci0JCQlBc3NlcnQuaXNOb3ROdWxsKGNvbnRlbnQsICJjb250ZW50IGNhbiBub3QgYmUgbnVsbCB3aGVuIHNldHRpbmcgdGV4dCBzdG9yZSIpOyAvLyROT04tTkxTLTEkCi0JCQlmQ29udGVudCA9IGNvbnRlbnQ7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTdG9yZSNnZXQoaW50KQotCQkgKi8KLQkJcHVibGljIGNoYXIgZ2V0KGludCBvZmZzZXQpIHsKLQkJCXJldHVybiBmQ29udGVudC5jaGFyQXQob2Zmc2V0KTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFN0b3JlI2dldChpbnQsIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0KGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJCXJldHVybiBmQ29udGVudC5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjZ2V0TGVuZ3RoKCkKLQkJICovCi0JCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQkJcmV0dXJuIGZDb250ZW50Lmxlbmd0aCgpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjcmVwbGFjZShpbnQsIGludCwKLQkJICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcmVwbGFjZShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U3RvcmUjc2V0KGphdmEubGFuZy5TdHJpbmcpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIHRleHQpIHsKLQkJfQotCi0JfQotCi0JLyoqCi0JICogQ2hhbmdlcyB0byB0aGUgRG9jdW1lbnQvSVN0cnVjdHVyZWREb2N1bWVudCBjYW4gZXh0ZW5kIGJleW9uZCB0aGUgdGV4dAotCSAqIGNoYW5nZSBhcmVhIGFuZCByZXF1aXJlIG1vcmUgcmVkcmF3aW5nIHRvIGtlZXAgdGhlIGhpbGlnaHRpbmcgY29ycmVjdC4KLQkgKiBUaGUgZXZlbnQgbXVzdCBiZSBzYXZlZCBzbyB0aGF0IHRoZSByZWRyYXcgaXMgb25seSBzZW50IGFmdGVyIGEKLQkgKiB0ZXh0Q2hhbmdlZCBldmVudCBpcyByZWNlaXZlZC4KLQkgKi8KLQljbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciB7Ci0KLQkJcHVibGljIHZvaWQgbmV3TW9kZWwoTmV3RG9jdW1lbnRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJCS8vIGlmCi0JCQkJLy8gKFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5mU3RvcFJlbGF5aW5nQ2hhbmdlcykKLQkJCQkvLyB7Ci0JCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2tpcHBlZCByZWxheWluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCS8vIHNob3VsZCB1c2UgdGV4dFNldCB3aGVuIGFsbCBjb250ZW50cyBoYXZlCi0JCQkvLyBjaGFuZ2VkCi0JCQkvLyBvdGhlcndpc2UgbmVlZCB0byB1c2UgdGhlIHBhaXIgb2YKLQkJCS8vIHRleHRDaGFuZ2luZyBhbmQKLQkJCS8vIHRleHRDaGFuZ2VkLgotCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmxhc3RFdmVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbm9DaGFuZ2UoZmluYWwgTm9DaGFuZ2VFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNraXBwZWQgcmVsYXlpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LnJlYXNvbiA9PSBOb0NoYW5nZUV2ZW50LlJFQURfT05MWV9TVEFURV9DSEFOR0UpIHsKLQkJCQlpZiAocGVuZGluZ0RvY3VtZW50Q2hhbmdlZEV2ZW50KSB7Ci0JCQkJCWlmIChsYXN0RXZlbnRRdWV1ZSA9PSBudWxsKSB7Ci0JCQkJCQlsYXN0RXZlbnRRdWV1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJfQotCQkJCQlsYXN0RXZlbnRRdWV1ZS5hZGQoc3RydWN0dXJlZERvY3VtZW50RXZlbnQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmxhc3RFdmVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG5vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCQkvLyBpZgotCQkJCS8vIChTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMuZlN0b3BSZWxheWluZ0NoYW5nZXMpCi0JCQkJLy8gewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCByZWxheWluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5sYXN0RXZlbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQkJLy8gaWYKLQkJCQkvLyAoU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlci50aGlzLmZTdG9wUmVsYXlpbmdDaGFuZ2VzKQotCQkJCS8vIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJub3QgcmVsYXlpbmcgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInNhdmluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMubGFzdEV2ZW50ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCQkvLyBpZgotCQkJCS8vIChTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyLnRoaXMuZlN0b3BSZWxheWluZ0NoYW5nZXMpCi0JCQkJLy8gewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCByZWxheWluZyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCAiICsgc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigic2F2aW5nIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCVN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIudGhpcy5sYXN0RXZlbnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkcgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiByZWRyYXdCYWNrZ3JvdW5kID0gdHJ1ZTsKLQotCS8qKiBUaGUgdmlzaWJsZSBjaGlsZCBkb2N1bWVudC4gKi8KLQlwcml2YXRlIFByb2plY3Rpb25Eb2N1bWVudCBmQ2hpbGREb2N1bWVudDsKLQotCS8qKiBUaGUgbWFzdGVyIGRvY3VtZW50ICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKiBUaGUgZG9jdW1lbnQgY2xvbmUgZm9yIHRoZSBub24tZm9yd2FyZGluZyBjYXNlLiAqLwotCXByaXZhdGUgSURvY3VtZW50IGZEb2N1bWVudENsb25lOwotCi0JLy8gb25seSB1c2UgdGhpcyB0ZW1wIHdvcmsgYXJvdW5kIGlmIG9uIEdUSwotCS8vIGl0IGNhdXNlcyBmdW5ueSAiY3Vyc29yIGJsaW5raW5nIiBpZiB1c2VkIG9uIHdpbmRvd3MKLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gZm9yY2VSZWRyYXdPblJlZ2lvbkNoYW5nZWQgPSBQbGF0Zm9ybS5nZXRXUygpLmVxdWFscygiZ3RrIik7IC8vJE5PTi1OTFMtMSQKLQkvKiogVGhlIG9yaWdpbmFsIGNvbnRlbnQgKi8KLQlwcml2YXRlIFN0cmluZyBmT3JpZ2luYWxDb250ZW50OwotCS8qKiBUaGUgb3JpZ2luYWwgbGluZSBkZWxpbWl0ZXJzICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBmT3JpZ2luYWxMaW5lRGVsaW1pdGVyczsKLQotCXByaXZhdGUgaW50IGZTdG9wUmVsYXlpbmdDaGFuZ2VzUmVxdWVzdHMgPSAwOwotCi0JcHJpdmF0ZSBTdHlsZWRUZXh0IGZTdHlsZWRUZXh0V2lkZ2V0OwotCi0JLyoqIFRoZSByZWdpc3RlcmVkIHRleHQgY2hhbmdlZCBsaXN0ZW5lcnMgKi8KLQlUZXh0Q2hhbmdlTGlzdGVuZXJbXSBmVGV4dENoYW5nZUxpc3RlbmVyczsKLQlwcm90ZWN0ZWQgRG9jdW1lbnRMaXN0ZW5lciBpbnRlcm5hbERvY3VtZW50TGlzdGVuZXI7Ci0KLQkvLyBUaGUgbGlzdGVuZXJzIGZvciByZWxheWluZyBEb2N1bWVudEV2ZW50cyBhbmQKLQkvLyByZXF1ZXN0aW5nIHJlcGFpbnRzCi0JLy8gYWZ0ZXIgbW9kaWZpY2F0aW9uCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgaW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLQotCXByb3RlY3RlZCBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCBsYXN0RXZlbnQgPSBudWxsOwotCUxpc3QgbGFzdEV2ZW50UXVldWU7Ci0JYm9vbGVhbiBwZW5kaW5nRG9jdW1lbnRDaGFuZ2VkRXZlbnQ7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLQkvKioKLQkgKiBURVNUIE9OTFkgLSBURVNUIE9OTFkgLSBURVNUIE9OTFkgTk9UIEFQSSB1c2UgdGhpcyBjb25zdHJ1Y3RvciBvbmx5IGZvcgotCSAqIHRlc3RzLiBDcmVhdGVzIGEgbmV3IGRvY3VtZW50IGFkYXB0ZXIgd2hpY2ggaXMgaW5pdGlhbGxseSBub3QgY29ubmVjdGVkCi0JICogdG8gYW55IGRvY3VtZW50LgotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyKCkgewotCi0JCWludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIoKTsKLQkJaW50ZXJuYWxEb2N1bWVudExpc3RlbmVyID0gbmV3IERvY3VtZW50TGlzdGVuZXIoKTsKLQkJLy8gZm9yIHRlc3Rpbmcgb25seQotCQkvLyBzZXREb2N1bWVudChnZXRNb2RlbE1hbmFnZXIoKS5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZGVudGlmaWVyRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBkb2N1bWVudCBhZGFwdGVyIHdoaWNoIGlzIGluaXRpYWxsbHkgbm90IGNvbm5lY3RlZCB0byBhbnkKLQkgKiBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcihTdHlsZWRUZXh0IHN0eWxlZFRleHRXaWRnZXQpIHsKLQotCQkvLyBkbyBub3QgdXNlICd0aGlzKCknIGluIHRoaXMgY2FzZQotCQlzdXBlcigpOwotCQlpbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKCk7Ci0JCWludGVybmFsRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKCk7Ci0JCWZTdHlsZWRUZXh0V2lkZ2V0ID0gc3R5bGVkVGV4dFdpZGdldDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgX3NldERvY3VtZW50KElEb2N1bWVudCBuZXdEb2MpIHsKLQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50KS5yZW1vdmVEb2N1bWVudENoYW5nZWRMaXN0ZW5lcihpbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCQlmRG9jdW1lbnQgPSBuZXdEb2M7Ci0JCWlmICghaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJZkRvY3VtZW50Q2xvbmUgPSBudWxsOwotCQkJZk9yaWdpbmFsQ29udGVudCA9IGdldERvY3VtZW50KCkgIT0gbnVsbCA/IGdldERvY3VtZW50KCkuZ2V0KCkgOiBudWxsOwotCQkJZk9yaWdpbmFsTGluZURlbGltaXRlcnMgPSBnZXREb2N1bWVudCgpICE9IG51bGwgPyBnZXREb2N1bWVudCgpLmdldExlZ2FsTGluZURlbGltaXRlcnMoKSA6IG51bGw7Ci0JCX0KLQotCQlpZiAoREVCVUcgJiYgZkRvY3VtZW50ICE9IG51bGwgJiYgIShmRG9jdW1lbnQgaW5zdGFuY2VvZiBJTG9ja2FibGUpKSB7Ci0KLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiV2FybmluZzogbm9uIElMb2NrYWJsZSBkb2N1bWVudCB1c2VkIGluIFN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXIiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgICBkb2N1bWVudCB1cGRhdGVzIG9uIG5vbi1kaXNwbGF5IHRocmVhZCB3aWxsIG5vdCBiZSBzYWZlIGlmIGVkaXRvciBvcGVuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZkRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChJU3RydWN0dXJlZERvY3VtZW50KSBmRG9jdW1lbnQpLmFkZERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKGludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHRDb250ZW50I2FkZFRleHRDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgYWRkVGV4dENoYW5nZUxpc3RlbmVyKFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCS8vIG1ha2Ugc3VyZSBsaXN0ZW5lciBpcyBub3QgYWxyZWFkeSBpbiBsaXN0ZW5pbmcKLQkJLy8gKGFuZCBpZiBpdCBpcywgcHJpbnQgYSB3YXJuaW5nIHRvIGFpZCBkZWJ1Z2dpbmcsCi0JCS8vIGlmIG5lZWRlZCkKLQotCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKGZUZXh0Q2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXI6OmFkZFRleHRDaGFuZ2VkTGlzdGVuZXJzLiBsaXN0ZW5lciAiICsgbGlzdGVuZXIgKyAiIHdhcyBhZGRlZCBtb3JlIHRoYW4gb25jZS4gIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWREb2N1bWVudFRvVGV4dEFkYXB0ZXI6OmFkZFRleHRDaGFuZ2VkTGlzdGVuZXJzLiBBZGRpbmcgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gdGV4dCBhZGFwdGVyLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaW50IG9sZFNpemUgPSAwOwotCQkJaWYgKGZUZXh0Q2hhbmdlTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkvLyBub3JtYWxseSB3b24ndCBiZSBudWxsLCBidXQgd2UgbmVlZCB0byBiZQotCQkJCS8vIHN1cmUsIGZvciBmaXJzdCB0aW1lIHRocm91Z2gKLQkJCQlvbGRTaXplID0gZlRleHRDaGFuZ2VMaXN0ZW5lcnMubGVuZ3RoOwotCQkJfQotCQkJaW50IG5ld1NpemUgPSBvbGRTaXplICsgMTsKLQkJCVRleHRDaGFuZ2VMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXJbbmV3U2l6ZV07Ci0JCQlpZiAoZlRleHRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5hcnJheWNvcHkoZlRleHRDaGFuZ2VMaXN0ZW5lcnMsIDAsIG5ld0xpc3RlbmVycywgMCwgb2xkU2l6ZSk7Ci0JCQl9Ci0JCQkvLyBhZGQgbGlzdGVuZXIgdG8gbGFzdCBwb3NpdGlvbgotCQkJbmV3TGlzdGVuZXJzW25ld1NpemUgLSAxXSA9IGxpc3RlbmVyOwotCQkJLy8KLQkJCS8vIG5vdyBzd2l0Y2ggbmV3IGZvciBvbGQKLQkJCWZUZXh0Q2hhbmdlTGlzdGVuZXJzID0gbmV3TGlzdGVuZXJzOwotCQkJLy8KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHRDb250ZW50I2dldENoYXJDb3VudCgpCi0JICovCi0JcHVibGljIGludCBnZXRDaGFyQ291bnQoKSB7Ci0KLQkJLy8gZ2V0RG9jdW1lbnQgY2FuIHNvbWV0aW1lcyBiZSBudWxsIGR1cmluZyBzdGFydHVwCi0JCS8vIGFuZCBkaXNwb3NlCi0JCWludCByZXN1bHQgPSAwOwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTYWZlRG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgSURvY3VtZW50IGdldENsb25lZERvY3VtZW50KCkgewotCQlpZiAoZkRvY3VtZW50Q2xvbmUgPT0gbnVsbCkgewotCQkJU3RyaW5nIGNvbnRlbnQgPSBmT3JpZ2luYWxDb250ZW50ID09IG51bGwgPyAiIiA6IGZPcmlnaW5hbENvbnRlbnQ7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZ1tdIGRlbGltcyA9IGZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzID09IG51bGwgPyBEZWZhdWx0TGluZVRyYWNrZXIuREVMSU1JVEVSUyA6IGZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzOwotCQkJZkRvY3VtZW50Q2xvbmUgPSBuZXcgRG9jdW1lbnRDbG9uZShjb250ZW50LCBkZWxpbXMpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRDbG9uZTsKLQl9Ci0KLQlEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJLy8gTm90ZTogdGhlIHdvcmtiZW5jaCBzaG91bGQgYWx3YXlzIGhhdmUgYSBkaXNwbGF5Ci0JCS8vICh1bmxlc3MgcnVubmluZyBoZWFkbGVzcyksIHdoZXJlYXMgRGlzcGxheS5nZXRDdXJyZW50KCkKLQkJLy8gb25seSByZXR1cm5zIHRoZSBkaXNwbGF5IGlmIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZAotCQkvLyBoYXMgb25lLgotCQlpZiAoUGxhdGZvcm1VSS5pc1dvcmtiZW5jaFJ1bm5pbmcoKSkKLQkJCXJldHVybiBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldERpc3BsYXkoKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdmlzaWJsZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIElEb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0KLQkJaWYgKGZDaGlsZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gZkRvY3VtZW50OwotCQlyZXR1cm4gZkNoaWxkRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyByZWdpb24gaW4gbWFzdGVyIGRvY3VtZW50IG9mIGdpdmVuIHJlZ2lvbiAoc2hvdWxkIGJlIHJlZ2lvbiBpbgotCSAqIHByb2plY3Rpb24gZG9jdW1lbnQpCi0JICogCi0JICogQHJldHVybiByZWdpb24gaWYgbm8gcHJvamVjdGlvbiBkb2N1bWVudCBleGlzdHMsIHJlZ2lvbiBvZiBtYXN0ZXIKLQkgKiAgICAgICAgIGRvY3VtZW50IGlmIHBvc3NpYmxlLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgSVJlZ2lvbiBnZXRQcm9qZWN0aW9uVG9NYXN0ZXJSZWdpb24oSVJlZ2lvbiByZWdpb24pIHsKLQkJSVJlZ2lvbiBvcmlnaW5hbFJlZ2lvbiA9IHJlZ2lvbjsKLQkJaWYgKGZDaGlsZERvY3VtZW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJb3JpZ2luYWxSZWdpb24gPSBmQ2hpbGREb2N1bWVudC5nZXRQcm9qZWN0aW9uTWFwcGluZygpLnRvT3JpZ2luUmVnaW9uKHJlZ2lvbik7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gb3JpZ2luYWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBvZmZzZXQgaW4gcHJvamVjdGlvbiBkb2N1bWVudCBvZiBnaXZlbiBvZmZzZXQgKHNob3VsZCBiZSBvZmZzZXQKLQkgKiBpbiBtYXN0ZXIgZG9jdW1lbnQpCi0JICogCi0JICogQHJldHVybiBvZmZzZXQgaWYgbm8gcHJvamVjdGlvbiBkb2N1bWVudCBleGlzdHMsIG9mZnNldCBvZiBwcm9qZWN0aW9uCi0JICogICAgICAgICBkb2N1bWVudCBpZiBwb3NzaWJsZSwgLTEgb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0TWFzdGVyVG9Qcm9qZWN0aW9uT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJaW50IG9yaWdpbmFsT2Zmc2V0ID0gb2Zmc2V0OwotCQlpZiAoZkNoaWxkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlvcmlnaW5hbE9mZnNldCA9IGZDaGlsZERvY3VtZW50LmdldFByb2plY3Rpb25NYXBwaW5nKCkudG9JbWFnZU9mZnNldChvZmZzZXQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9yaWdpbmFsT2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldCB3aXRob3V0IGRlbGltaXRlcnMuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgb2Zmc2V0IG9mIHRoZSBsaW5lIHRvIHJldHVybi4gRG9lcyBub3QgaW5jbHVkZSBkZWxpbWl0ZXJzIG9mCi0JICogICAgICAgICAgICBwcmVjZWVkaW5nIGxpbmVzLiBPZmZzZXQgMCBpcyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQotCSAqICAgICAgICAgICAgZG9jdW1lbnQuCi0JICogQHJldHVybiB0aGUgbGluZSB0ZXh0IHdpdGhvdXQgZGVsaW1pdGVycwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldExpbmUoaW50IGxpbmVOdW1iZXIpIHsKLQotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGxpbmVOdW1iZXIgPj0gZ2V0TGluZUNvdW50KCkpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRldmVsb3BtZW50IERlYnVnOiBJU3RydWN0dXJlZERvY3VtZW50OmdldExpbmUoKSBlcnJvci4gbGluZU51bWJlciByZXF1ZXN0ZWQgKCIgKyBsaW5lTnVtYmVyICsgIikgd2FzIGdyZWF0ZXIgdGhhbiBudW1iZXIgb2YgbGluZXMoIiArIGdldExpbmVDb3VudCgpICsgIikuIEVtcHR5U3RyaW5nIHJldHVybmVkIik7IC8vJE5PTi1OTFMtMSQvLyROT04tTkxTLTMkLy8kTk9OLU5MUy0yJAotCQkJfQotCQkJcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCQl9Ci0JCWVsc2UgewotCQkJSURvY3VtZW50IGRvYyA9IGdldFNhZmVEb2N1bWVudCgpOwotCQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVJlZ2lvbiByID0gZG9jLmdldExpbmVJbmZvcm1hdGlvbihsaW5lTnVtYmVyKTsKLQkJCQkJaWYgKHIuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlyZXN1bHQgPSBkb2MuZ2V0KHIuZ2V0T2Zmc2V0KCksIHIuZ2V0TGVuZ3RoKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXJlc3VsdCA9IEVNUFRZX1NUUklORzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUcmllcyB0byByZXBhaXIgdGhlIGxpbmUgaW5mb3JtYXRpb24uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQKLQkgKiBAc2VlIElSZXBhaXJhYmxlRG9jdW1lbnQjcmVwYWlyTGluZUluZm9ybWF0aW9uKCkKLQkgKiBAc2VlIEVjbGlwc2UgMy4wCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlcGFpckxpbmVJbmZvcm1hdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVJlcGFpcmFibGVEb2N1bWVudCkgewotCQkJSVJlcGFpcmFibGVEb2N1bWVudCByZXBhaXJhYmxlID0gKElSZXBhaXJhYmxlRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJcmVwYWlyYWJsZS5yZXBhaXJMaW5lSW5mb3JtYXRpb24oKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgbGluZSBpbmRleCBhdCB0aGUgZ2l2ZW4gY2hhcmFjdGVyIG9mZnNldC4KLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBvZmZzZXQgb2YgdGhlIGxpbmUgdG8gcmV0dXJuLiBUaGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZQotCSAqICAgICAgICAgICAgZG9jdW1lbnQgaXMgYXQgb2Zmc2V0IDAuIEFuIG9mZnNldCBvZiBnZXRMZW5ndGgoKSBpcyB2YWxpZAotCSAqICAgICAgICAgICAgYW5kIHNob3VsZCBhbnN3ZXIgdGhlIG51bWJlciBvZiBsaW5lcy4KLQkgKiBAcmV0dXJuIHRoZSBsaW5lIGluZGV4LiBUaGUgZmlyc3QgbGluZSBpcyBhdCBpbmRleCAwLiBJZiB0aGUgY2hhcmFjdGVyCi0JICogICAgICAgICBhdCBvZmZzZXQgaXMgYSBkZWxpbWl0ZXIgY2hhcmFjdGVyLCBhbnN3ZXIgdGhlIGxpbmUgaW5kZXggb2YKLQkgKiAgICAgICAgIHRoZSBsaW5lIHRoYXQgaXMgZGVsaW1pdGVkLiBGb3IgZXhhbXBsZSwgdGV4dCA9ICJcclxuXHJcbiIsCi0JICogICAgICAgICBkZWxpbWl0ZXIgPSAiXHJcbiIsIHRoZW46IGdldExpbmVBdE9mZnNldCgwKSA9PSAwCi0JICogICAgICAgICBnZXRMaW5lQXRPZmZzZXQoMSkgPT0gMCBnZXRMaW5lQXRPZmZzZXQoMikgPT0gMQotCSAqICAgICAgICAgZ2V0TGluZUF0T2Zmc2V0KDMpID09IDEgZ2V0TGluZUF0T2Zmc2V0KDQpID09IDIKLQkgKi8KLQlwdWJsaWMgaW50IGdldExpbmVBdE9mZnNldChpbnQgb2Zmc2V0KSB7Ci0KLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IGRvYy5nZXRMaW5lT2ZPZmZzZXQob2Zmc2V0KTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJcmVwYWlyTGluZUluZm9ybWF0aW9uKGRvYyk7Ci0JCQkJdHJ5IHsKLQkJCQkJcmVzdWx0ID0gZG9jLmdldExpbmVPZk9mZnNldChvZmZzZXQpOwotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geDIpIHsKLQkJCQkJLy8gc2hvdWxkIG5vdCBvY2N1ciwgYnV0IHNlZW1zIHRvIGZvciBwcm9qZWN0aW9uCi0JCQkJCS8vIGRvY3VtZW50cywgcmVsYXRlZCB0byByZXBhaW50aW5nIG92ZXJ2aWV3IHJ1bGVyCi0JCQkJCXJlc3VsdCA9IDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRMaW5lQ291bnQoKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0U2FmZURvY3VtZW50KCk7Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZG9jLmdldE51bWJlck9mTGluZXMoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHRDb250ZW50I2dldExpbmVEZWxpbWl0ZXIKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExpbmVEZWxpbWl0ZXIoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoZ2V0UGFyZW50RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCXJlc3VsdCA9ICgoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0UGFyZW50RG9jdW1lbnQoKSkuZ2V0TGluZURlbGltaXRlcigpOwotCQl9Ci0JCWVsc2UgewotCQkJSURvY3VtZW50IGRvYyA9IGdldFNhZmVEb2N1bWVudCgpOwotCQkJcmVzdWx0ID0gVGV4dFV0aWxpdGllcy5nZXREZWZhdWx0TGluZURlbGltaXRlcihkb2MpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBjaGFyYWN0ZXIgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGdpdmVuIGxpbmUuCi0JICogPHA+Ci0JICogCi0JICogQHBhcmFtIGxpbmVJbmRleAotCSAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIGxpbmUuIFRoZSBmaXJzdCBsaW5lIGlzIGF0IGluZGV4IDAuCi0JICogQHJldHVybiBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIGxpbmUuIFRoZSBmaXJzdAotCSAqICAgICAgICAgY2hhcmFjdGVyIG9mIHRoZSBkb2N1bWVudCBpcyBhdCBvZmZzZXQgMC4gVGhlIHJldHVybiB2YWx1ZQotCSAqICAgICAgICAgc2hvdWxkIGluY2x1ZGUgbGluZSBkZWxpbWl0ZXJzLiBGb3IgZXhhbXBsZSwgdGV4dCA9Ci0JICogICAgICAgICAiXHJcbnRlc3RcclxuIiwgZGVsaW1pdGVyID0gIlxyXG4iLCB0aGVuOiBnZXRPZmZzZXRBdExpbmUoMCkgPT0KLQkgKiAgICAgICAgIDAgZ2V0T2Zmc2V0QXRMaW5lKDEpID09IDIgZ2V0T2Zmc2V0QXRMaW5lKDIpID09IDggTk9URTogV2hlbgotCSAqICAgICAgICAgdGhlcmUgaXMgbm8gdGV4dCAoaS5lLiwgbm8gbGluZXMpLCBnZXRPZmZzZXRBdExpbmUoMCkgaXMgYQotCSAqICAgICAgICAgdmFsaWQgY2FsbCB0aGF0IHNob3VsZCByZXR1cm4gMC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldEF0TGluZShpbnQgbGluZUluZGV4KSB7Ci0KLQkJaW50IHJlc3VsdCA9IDA7Ci0JCUlEb2N1bWVudCBkb2MgPSBnZXRTYWZlRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdCA9IGRvYy5nZXRMaW5lT2Zmc2V0KGxpbmVJbmRleCk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlc3VsdCA9IDA7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJlbnQgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwYXJlbnQgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBnZXRQYXJlbnREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHRoZSBkb2N1bWVudCB0byB1c2UgZm9yIHJlcXVlc3QgZnJvbSB0aGUgU3R5bGVkVGV4dCB3aWRnZXQuIEl0cwotCSAqIGVpdGhlciB0aGUgbGl2ZSBkb2N1bW5ldCBvciBhIGNsb25lIG9mIGl0LCBkZXBlbmRpbmcgb24gc3RvcC9yZXN1bWUKLQkgKiBzdGF0ZS4KLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudCBnZXRTYWZlRG9jdW1lbnQoKSB7Ci0JCUlEb2N1bWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJcmVzdWx0ID0gZ2V0Q2xvbmVkRG9jdW1lbnQoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG5vdGUsIHRoaXMgZG9jdW1lbnQgY2FuIGJlIG5vcm1hbCBzdHJ1Y3R1cmVkIHRleHQgZG9jdW1lbnQsCi0JCQkvLyBvciB0aGUgcHJvamVjdGlvbi9jaGlsZCBkb2N1bWVudAotCQkJcmVzdWx0ID0gZ2V0RG9jdW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0Ci0JICovCi0JU3R5bGVkVGV4dCBnZXRTdHlsZWRUZXh0V2lkZ2V0KCkgewotCQlyZXR1cm4gZlN0eWxlZFRleHRXaWRnZXQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgYXQgdGhlIGdpdmVuIHJhbmdlLgotCSAqIDxwPgotCSAqIAotCSAqIEBwYXJhbSBzdGFydAotCSAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgdGV4dCB0byByZXR1cm4uIE9mZnNldCAwIGlzIHRoZQotCSAqICAgICAgICAgICAgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBkb2N1bWVudC4KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0IHRvIHJldHVybgotCSAqIEByZXR1cm4gdGhlIHRleHQgYXQgdGhlIGdpdmVuIHJhbmdlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0UmFuZ2UoaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJSURvY3VtZW50IGRvYyA9IGdldFNhZmVEb2N1bWVudCgpOwotCQkJcmVzdWx0ID0gZG9jLmdldChzdGFydCwgbGVuZ3RoKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogYXNzdW1lIG9ubHkgZm9yICJubyBjaGFuZ2UiIGV2ZW50cywgZm9yIG5vdwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBlbmRpbmdFdmVudHMoKSB7Ci0KLQkJaWYgKGxhc3RFdmVudFF1ZXVlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsYXN0RXZlbnRRdWV1ZS5pdGVyYXRvcigpOwotCQl3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQlOb0NoYW5nZUV2ZW50IG5vQ2hhbmdlRXZlbnQgPSAoTm9DaGFuZ2VFdmVudCkgaXRlcmF0b3IubmV4dCgpOwotCQkJcmVkcmF3Tm9DaGFuZ2Uobm9DaGFuZ2VFdmVudCk7Ci0JCX0KLQotCQlsYXN0RXZlbnRRdWV1ZSA9IG51bGw7Ci0JCWxhc3RFdmVudCA9IG51bGw7Ci0JfQotCi0JYm9vbGVhbiBpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpIHsKLQkJcmV0dXJuIGZTdG9wUmVsYXlpbmdDaGFuZ2VzUmVxdWVzdHMgPiAwOwotCX0KLQotCS8qKgotCSAqIHRoaXMgbWV0aG9kIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIG9ubHkgZm9yIHJlYWQgb25seSByZWdpb24gY2hhbmdlcy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWRyYXdOb0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpCi0JCQlyZXR1cm47Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJtYXliZSByZWRyYXcgc3R1ZmYiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJaW50IHN0YXJ0T2Zmc2V0ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKTsKLQkJcmVkcmF3UmFuZ2VXaXRoTGVuZ3RoKHN0YXJ0T2Zmc2V0LCBsZW5ndGgpOwotCi0JfQotCi0JLyoqCi0JICogUmVxdWVzdCBhIHJlZHJhdyBvZiB0aGUgdGV4dCByYW5nZSBvY2N1cGllZCBieSB0aGUgZ2l2ZW4KLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudAotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZHJhd05vZGVzUmVwbGFjZWQoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkKLQkJCXJldHVybjsKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1heWJlIHJlZHJhdyBzdHVmZiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJLy8ganVzdCB0aGUgbmV3IHN0dWZmCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXROZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0KLQkJaW50IG5OZXdOb2RlcyA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChuTmV3Tm9kZXMgPiAwKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0Tm9kZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdE5vZGUgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0obk5ld05vZGVzIC0gMSk7Ci0JCQlyZWRyYXdSYW5nZShmaXJzdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSwgbGFzdE5vZGUuZ2V0RW5kT2Zmc2V0KCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVkcmF3cyB0aGUgZ2l2ZSBvZmZzZXRzIGluIHRlcm1zIG9mIHRoZSBTdHJ1Y3R1cmVkRG9jdW1lbnQuIElmIG9ubHkKLQkgKiBwYXJ0IG9mIHRoZSBtb2RlbCBpcyB2aXNpYmxlLCBlbnN1cmVzIHRoYXQgb25seSB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mCi0JICogdGhlIGdpdmVuIHJhbmdlIGlzIHJlZHJhd24uCi0JICogCi0JICogQHBhcmFtIHN0YXJ0TW9kZWxPZmZzZXQKLQkgKiBAcGFyYW0gZW5kTW9kZWxPZmZzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVkcmF3UmFuZ2UoZmluYWwgaW50IHN0YXJ0TW9kZWxPZmZzZXQsIGZpbmFsIGludCBlbmRNb2RlbE9mZnNldCkgewotCi0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWRyYXcgc3R1ZmY6ICIgKyBzdGFydE1vZGVsT2Zmc2V0ICsgIi0iICsgZW5kTW9kZWxPZmZzZXQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoZkNoaWxkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlnZXRTdHlsZWRUZXh0V2lkZ2V0KCkucmVkcmF3UmFuZ2Uoc3RhcnRNb2RlbE9mZnNldCwgZW5kTW9kZWxPZmZzZXQgLSBzdGFydE1vZGVsT2Zmc2V0LCByZWRyYXdCYWNrZ3JvdW5kKTsKLQkJCQl9Ci0JCQl9OwotCQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQotCQl9Ci0JCWVsc2UgewotCQkJaW50IGhpZ2ggPSBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpOwotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gZ2V0TWFzdGVyVG9Qcm9qZWN0aW9uT2Zmc2V0KHN0YXJ0TW9kZWxPZmZzZXQpOwotCi0JCQlpbnQgZW5kT2Zmc2V0ID0gZ2V0TWFzdGVyVG9Qcm9qZWN0aW9uT2Zmc2V0KGVuZE1vZGVsT2Zmc2V0KTsKLQotCQkJLy8gaWYgb2Zmc2V0cyB3ZXJlIG5vdCB2aXNpYmxlLCBqdXN0IHRyeSB0byByZWRyYXcgZXZlcnl0aGluZyBpbgotCQkJLy8gdGhlIGNoaWxkIGRvY3VtZW50Ci0JCQkvLyAvLyBub3QgdmlzaWJsZQotCQkJLy8gaWYgKGVuZE9mZnNldCA8IDAgfHwgc3RhcnRPZmZzZXQgPiBoaWdoKQotCQkJLy8gcmV0dXJuOwotCQkJLy8gcmVzdHJpY3QgbG93ZXIgYm91bmQKLQkJCWlmIChzdGFydE9mZnNldCA8IDApIHsKLQkJCQlzdGFydE9mZnNldCA9IDA7Ci0JCQl9Ci0JCQkvLyByZXN0cmljdCB1cHBlciBib3VuZAotCQkJLy8gaWYgKGVuZE9mZnNldCA+IGhpZ2gpIHsKLQkJCS8vIGVuZE9mZnNldCA9IGhpZ2g7Ci0JCQkvLyB9Ci0JCQlpZiAoZW5kT2Zmc2V0IDwgMCkgewotCQkJCWVuZE9mZnNldCA9IGhpZ2g7Ci0JCQl9Ci0KLQkJCWludCBsZW5ndGggPSBlbmRPZmZzZXQgLSBzdGFydE9mZnNldDsKLQkJCS8vIHJlZHJhd0JhY2tncm91bmQgd2l0aCBmYWxzZSB3b3VsZCBiZSBmYXN0ZXIKLQkJCS8vIGJ1dCBhc3N1bWVzIGJhY2tncm91bmQgKG9yIGZvbnQpIGlzIG5vdAotCQkJLy8gY2hhbmdpbmcKLQkJCWZpbmFsIGludCBmaW5hbFN0YXJ0T2Zmc2V0ID0gc3RhcnRPZmZzZXQ7Ci0JCQlmaW5hbCBpbnQgZmluYWxsZW5ndGggPSBsZW5ndGg7Ci0KLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0U3R5bGVkVGV4dFdpZGdldCgpLnJlZHJhd1JhbmdlKGZpbmFsU3RhcnRPZmZzZXQsIGZpbmFsbGVuZ3RoLCByZWRyYXdCYWNrZ3JvdW5kKTsKLQkJCQl9Ci0JCQl9OwotCQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVkcmF3cyB0aGUgZ2l2ZSBvZmZzZXRzIGluIHRlcm1zIG9mIHRoZSBGbGF0IE5vZGUgbW9kZWwuIElmIG9ubHkgcGFydAotCSAqIG9mIHRoZSBtb2RlbCBpcyB2aXNpYmxlLCBlbnN1cmVzIHRoYXQgb25seSB0aGUgdmlzaWJsZSBwb3J0aW9uIG9mIHRoZQotCSAqIGdpdmVuIHJhbmdlIGlzIHJlZHJhd24uCi0JICogCi0JICogQHBhcmFtIHN0YXJ0TW9kZWxPZmZzZXQKLQkgKiBAcGFyYW0gZW5kTW9kZWxPZmZzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVkcmF3UmFuZ2VXaXRoTGVuZ3RoKGZpbmFsIGludCBzdGFydE1vZGVsT2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoKSB7Ci0KLQkJaWYgKGdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlZHJhdyBzdHVmZjogIiArIHN0YXJ0TW9kZWxPZmZzZXQgKyAiLSIgKyBsZW5ndGgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlpZiAoZkNoaWxkRG9jdW1lbnQgPT0gbnVsbCkgewotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlnZXRTdHlsZWRUZXh0V2lkZ2V0KCkucmVkcmF3UmFuZ2Uoc3RhcnRNb2RlbE9mZnNldCwgbGVuZ3RoLCByZWRyYXdCYWNrZ3JvdW5kKTsKLQkJCQl9Ci0JCQl9OwotCQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQkJfQotCQllbHNlIHsKLQkJCWludCBoaWdoID0gZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJCS8vIFRPRE8gbmVlZCB0byB0YWtlIGludG8gYWNjb3VudCBzZWdtZW50ZWQgdmlzaWJsZSByZWdpb25zCi0JCQlpbnQgc3RhcnRPZmZzZXQgPSBnZXRNYXN0ZXJUb1Byb2plY3Rpb25PZmZzZXQoc3RhcnRNb2RlbE9mZnNldCk7Ci0JCQkvLyBub3QgdmlzaWJsZQotCQkJaWYgKHN0YXJ0T2Zmc2V0ID4gaGlnaCB8fCBsZW5ndGggPCAxKQotCQkJCXJldHVybjsKLQkJCS8vIHJlc3RyaWN0IGxvd2VyIGJvdW5kCi0JCQlpZiAoc3RhcnRPZmZzZXQgPCAwKSB7Ci0JCQkJc3RhcnRPZmZzZXQgPSAwOwotCQkJfQotCQkJaW50IGVuZE9mZnNldCA9IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoIC0gMTsKLQkJCS8vIHJlc3RyaWN0IHVwcGVyIGJvdW5kCi0JCQlpZiAoZW5kT2Zmc2V0ID4gaGlnaCkgewotCQkJCWVuZE9mZnNldCA9IGhpZ2g7Ci0JCQl9Ci0KLQkJCS8vIG5vdGU6IGxlbmd0aCBvZiB0aGUgY2hpbGQgZG9jdW1uZXQgc2hvdWxkIGJlCi0JCQkvLyB1cGRhdGVkLAotCQkJLy8gbmVlZCB0byBpbnZlc3RpZ2F0ZSB3aHkgaXRzIG5vdCBhdCB0aGlzCi0JCQkvLyBwb2ludCwgYnV0IGlzCi0JCQkvLyBwcm9iYWJseSBqdXN0IGJlY2F1c2UgdGhlIGRvY3VtZW50IGV2ZW50Ci0JCQkvLyBoYW5kbGluZyBpcyBub3QKLQkJCS8vIGNvbXBsZXRlbHkgZmluaXNoZWQuCi0JCQlpbnQgbmV3TGVuZ3RoID0gZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQ7IC8vIGQyODMwMDcKLQotCQkJLy8gcmVkcmF3QmFja2dyb3VuZCB3aXRoIGZhbHNlIHdvdWxkIGJlIGZhc3RlcgotCQkJLy8gYnV0IGFzc3VtZXMgYmFja2dyb3VuZCAob3IgZm9udCkgaXMgbm90Ci0JCQkvLyBjaGFuZ2luZwotCQkJZmluYWwgaW50IGZpbmFsU3RhcnRPZmZzZXQgPSBzdGFydE9mZnNldDsKLQkJCWZpbmFsIGludCBmaW5hbE5ld0xlbmd0aCA9IG5ld0xlbmd0aDsKLQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJZ2V0U3R5bGVkVGV4dFdpZGdldCgpLnJlZHJhd1JhbmdlKGZpbmFsU3RhcnRPZmZzZXQsIGZpbmFsTmV3TGVuZ3RoLCByZWRyYXdCYWNrZ3JvdW5kKTsKLQkJCQl9Ci0JCQl9OwotCQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgYSByZWRyYXcgb2YgdGhlIHRleHQgcmFuZ2Ugb2NjdXBpZWQgYnkgdGhlIGdpdmVuCi0JICogUmVnaW9uQ2hhbmdlZEV2ZW50IGZvciBjZXJ0YWluIChub3QgYWxsKSBJVGV4dFJlZ2lvbiBjb250ZXh0cwotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlZHJhd1JlZ2lvbkNoYW5nZWQoUmVnaW9uQ2hhbmdlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0KLQkJaWYgKGlzU3RvcHBlZEZvcndhcmRpbmdDaGFuZ2VzKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigibWF5YmUgcmVkcmF3IHN0dWZmIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0KLQkJLy8gKG5zZCkgVE9ETzogdHJ5IHRvIG1ha2UgdGhpcyByZWxpYWJsZSBzb21laG93Ci0JCS8vIHdpdGhvdXQgYmVpbmcgZGlyZWN0bHkgY29udGVudCBkZXBlbmRlbnQKLQkJLy8gaWYgKChyZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgfHwKLQkJLy8gKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuQkxPQ0tfVEVYVCkgfHwKLQkJLy8gKHR5cGUgPT0gWE1MSlNQUmVnaW9uQ29udGV4dHMuSlNQX0NPTlRFTlQpKSB7Ci0JCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJLy8gLy8gcmVkcmF3IGJhY2tncm91bmQgb2YgZmFsc2UgaXMgZmFzdGVyLAotCQkvLyAvLyBidXQgYXNzdW1lcyBiYWNrZ3JvdW5kIChvciBmb250KSBpcyBub3QKLQkJLy8gY2hhbmdpbmcKLQkJLy8gcmVkcmF3UmFuZ2UoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSwKLQkJLy8gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHJlZ2lvbikpOwotCQkvLyB9Ci0JCWlmIChmb3JjZVJlZHJhd09uUmVnaW9uQ2hhbmdlZCkgewotCQkJLy8gd29ya2Fyb3VuZCBmb3IgcmVkcmF3aW5nIHByb2JsZW1zIG9uIExpbnV4LUdUSwotCQkJaW50IHN0YXJ0T2Zmc2V0ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kT2Zmc2V0ID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0T2Zmc2V0KCkgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXRMZW5ndGgoKTsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBzdGFydExpbmUgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5mRG9jdW1lbnQuZ2V0TGluZUluZm9ybWF0aW9uT2ZPZmZzZXQoc3RhcnRPZmZzZXQpOwotCQkJCUlSZWdpb24gZW5kTGluZSA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmZEb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChlbmRPZmZzZXQpOwotCQkJCWlmIChzdGFydExpbmUgIT0gbnVsbCAmJiBlbmRMaW5lICE9IG51bGwpIHsKLQkJCQkJcmVkcmF3UmFuZ2Uoc3RhcnRMaW5lLmdldE9mZnNldCgpLCBlbmRMaW5lLmdldE9mZnNldCgpICsgZW5kTGluZS5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBub3RoaW5nIGZvciBub3cKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcXVlc3QgYSByZWRyYXcgb2YgdGhlIHRleHQgcmFuZ2Ugb2NjdXBpZWQgYnkgdGhlIGdpdmVuCi0JICogUmVnaW9uc1JlcGxhY2VkRXZlbnQKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWRyYXdSZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgc3RydWN0dXJlZERvY3VtZW50RXZlbnQpIHsKLQotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkKLQkJCXJldHVybjsKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIm1heWJlIHJlZHJhdyBzdHVmZiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudC5nZXROZXdSZWdpb25zKCk7Ci0JCWludCBuUmVnaW9ucyA9IG5ld1JlZ2lvbnMuc2l6ZSgpOwotCQlpZiAoblJlZ2lvbnMgPiAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KDApOwotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IG5ld1JlZ2lvbnMuZ2V0KG5SZWdpb25zIC0gMSk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlyZWRyYXdSYW5nZShmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChmaXJzdFJlZ2lvbiksIGZsYXROb2RlLmdldEVuZE9mZnNldChsYXN0UmVnaW9uKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWRyYXdUZXh0Q2hhbmdlZCgpIHsKLQotCQlpZiAobGFzdEV2ZW50ICE9IG51bGwpIHsKLQkJCS8vIHVwZGF0ZSBkaXNwbGF5LCBzaW5jZSBzb21lIGNhc2VzIGNhbiBlZmZlY3QKLQkJCS8vIGhpZ2hsaWdodGluZyBiZXlvbmQgdGhlIGNoYW5nZWQgdGV4dCBhcmVhLgotCQkJaWYgKGxhc3RFdmVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkJCXJlZHJhd05vZGVzUmVwbGFjZWQoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50KSBsYXN0RXZlbnQpOwotCQkJaWYgKGxhc3RFdmVudCBpbnN0YW5jZW9mIFJlZ2lvbnNSZXBsYWNlZEV2ZW50KQotCQkJCXJlZHJhd1JlZ2lvbnNSZXBsYWNlZCgoUmVnaW9uc1JlcGxhY2VkRXZlbnQpIGxhc3RFdmVudCk7Ci0JCQlpZiAobGFzdEV2ZW50IGluc3RhbmNlb2YgUmVnaW9uQ2hhbmdlZEV2ZW50KQotCQkJCXJlZHJhd1JlZ2lvbkNoYW5nZWQoKFJlZ2lvbkNoYW5nZWRFdmVudCkgbGFzdEV2ZW50KTsKLQkJCS8vIG1vdmVkIGZvbGxvd2luZyBsaW5lIHRvICdkb2N1bWVudCBjaGFuZ2VkJyBzbwotCQkJLy8gdGhlICJsYXN0IGV2ZW50IiBjYW4gYmUKLQkJCS8vIHJlLWRyYXduIGFmdGVyIHBlbmRpbmcgcmUtZHJhd3MKLQkJCS8vIGxhc3RFdmVudCA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZW5kcyBhIHRleHQgcmVwbGFjZSBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsYXlUZXh0Q2hhbmdlZCgpIHsKLQotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTk9UIHJlbGF5aW5nIHRleHQgY2hhbmdlZCAoIiArIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbGF5aW5nIHRleHQgY2hhbmdlZCAoIiArIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlmaW5hbCBUZXh0Q2hhbmdlZEV2ZW50IHRleHRDaGFuZ2VkRXZlbnQgPSBuZXcgVGV4dENoYW5nZWRFdmVudCh0aGlzKTsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlCi0JCS8vIHRoZSBhZGQgYW5kIHJlbW92ZSBsaXN0ZW5lcgotCQkvLyBtZXRob2RzIGNhbiBjaGFuZ2UgdGhlIGFjdHVhbCBpbnN0YW5jZSBvZiB0aGUKLQkJLy8gbGlzdGVuZXIgYXJyYXkgZnJvbSBhbm90aGVyIHRocmVhZAotCi0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChmVGV4dENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCU9iamVjdFtdIGhvbGRMaXN0ZW5lcnMgPSBmVGV4dENoYW5nZUxpc3RlbmVyczsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkvLyB0aGlzIGlzIGEgc2FmZSBjYXN0LCBzaW5jZSBhZGRMaXN0ZW5lcnMKLQkJCQkJCS8vIHJlcXVpcmVzIGEgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyCi0JCQkJCQkoKFRleHRDaGFuZ2VMaXN0ZW5lcikgaG9sZExpc3RlbmVyc1tpXSkudGV4dENoYW5nZWQodGV4dENoYW5nZWRFdmVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JCXJlZHJhd1RleHRDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogU2VuZHMgYSB0ZXh0IGNoYW5nZSB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWxheVRleHRDaGFuZ2luZyhpbnQgcmVxdWVzdGVkU3RhcnQsIGludCByZXF1ZXN0ZWRMZW5ndGgsIFN0cmluZyByZXF1ZXN0ZWRDaGFuZ2UpIHsKLQotCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTk9UIHJlbGF5aW5nIHRleHQgY2hhbmdpbmc6ICIgKyByZXF1ZXN0ZWRTdGFydCArICI6IiArIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oInJlbGF5aW5nIHRleHQgY2hhbmdpbmc6ICIgKyByZXF1ZXN0ZWRTdGFydCArICI6IiArIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlsYXN0RXZlbnQgPSBudWxsOwotCQl0cnkgewotCQkJZmluYWwgVGV4dENoYW5naW5nRXZlbnQgdGV4dENoYW5naW5nRXZlbnQgPSBuZXcgVGV4dENoYW5naW5nRXZlbnQodGhpcyk7Ci0KLQkJCXRleHRDaGFuZ2luZ0V2ZW50LnN0YXJ0ID0gcmVxdWVzdGVkU3RhcnQ7Ci0JCQl0ZXh0Q2hhbmdpbmdFdmVudC5yZXBsYWNlQ2hhckNvdW50ID0gcmVxdWVzdGVkTGVuZ3RoOwotCQkJdGV4dENoYW5naW5nRXZlbnQubmV3Q2hhckNvdW50ID0gKHJlcXVlc3RlZENoYW5nZSA9PSBudWxsID8gMCA6IHJlcXVlc3RlZENoYW5nZS5sZW5ndGgoKSk7Ci0JCQl0ZXh0Q2hhbmdpbmdFdmVudC5yZXBsYWNlTGluZUNvdW50ID0gZ2V0RG9jdW1lbnQoKS5nZXROdW1iZXJPZkxpbmVzKHJlcXVlc3RlZFN0YXJ0LCByZXF1ZXN0ZWRMZW5ndGgpIC0gMTsKLQkJCXRleHRDaGFuZ2luZ0V2ZW50Lm5ld1RleHQgPSByZXF1ZXN0ZWRDaGFuZ2U7Ci0JCQl0ZXh0Q2hhbmdpbmdFdmVudC5uZXdMaW5lQ291bnQgPSAocmVxdWVzdGVkQ2hhbmdlID09IG51bGwgPyAwIDogZ2V0RG9jdW1lbnQoKS5jb21wdXRlTnVtYmVyT2ZMaW5lcyhyZXF1ZXN0ZWRDaGFuZ2UpKTsKLQotCQkJLy8gd2UgbXVzdCBhc3NpZ24gbGlzdGVuZXJzIHRvIGxvY2FsIHZhcmlhYmxlLAotCQkJLy8gc2luY2UgdGhlIGFkZCBhbmQgcmVtb3ZlIGxpc3RuZXIKLQkJCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZQotCQkJLy8gbGlzdGVuZXIgYXJyYXkgZnJvbSBhbm90aGVyIHRocmVhZAotCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQlpZiAoZlRleHRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQkJVGV4dENoYW5nZUxpc3RlbmVyW10gaG9sZExpc3RlbmVycyA9IGZUZXh0Q2hhbmdlTGlzdGVuZXJzOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJLy8gdGhpcyBpcyBhIHNhZmUgY2FzdCwgc2luY2UKLQkJCQkJCQkvLyBhZGRMaXN0ZW5lcnMgcmVxdWlyZXMgYQotCQkJCQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcgotCQkJCQkJCWhvbGRMaXN0ZW5lcnNbaV0udGV4dENoYW5naW5nKHRleHRDaGFuZ2luZ0V2ZW50KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0JCQlydW5PbkRpc3BsYXlUaHJlYWRJZk5lZWRlZGUocnVubmFibGUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2VuZHMgYSB0ZXh0IHNldCBldmVudCB0byBhbGwgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMuIFdpZGdldCBzaG91bGQKLQkgKiByZWRyYXcgaXRzZWxmIGF1dG9tYXRpY2FsbHkuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVsYXlUZXh0U2V0KCkgewotCi0JCWlmIChpc1N0b3BwZWRGb3J3YXJkaW5nQ2hhbmdlcygpKSB7Ci0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQgJiYgZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJOT1QgcmVsYXlpbmcgdGV4dCBzZXQgKCIgKyBnZXREb2N1bWVudCgpLmdldExlbmd0aCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50ICYmIGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWxheWluZyB0ZXh0IHNldCAoIiArIGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkgKyAiKSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCQlsYXN0RXZlbnQgPSBudWxsOwotCQlmaW5hbCBUZXh0Q2hhbmdlZEV2ZW50IHRleHRDaGFuZ2VkRXZlbnQgPSBuZXcgVGV4dENoYW5nZWRFdmVudCh0aGlzKTsKLQotCQkvLyB3ZSBtdXN0IGFzc2lnbiBsaXN0ZW5lcnMgdG8gbG9jYWwgdmFyaWFibGUsIHNpbmNlCi0JCS8vIHRoZSBhZGQgYW5kIHJlbW92ZSBsaXN0bmVyCi0JCS8vIG1ldGhvZHMgY2FuIGNoYW5nZSB0aGUgYWN0dWFsIGluc3RhbmNlIG9mIHRoZQotCQkvLyBsaXN0ZW5lciBhcnJheSBmcm9tIGFub3RoZXIgdGhyZWFkCi0JCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCWlmIChmVGV4dENoYW5nZUxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCVRleHRDaGFuZ2VMaXN0ZW5lcltdIGhvbGRMaXN0ZW5lcnMgPSBmVGV4dENoYW5nZUxpc3RlbmVyczsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBob2xkTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlob2xkTGlzdGVuZXJzW2ldLnRleHRTZXQodGV4dENoYW5nZWRFdmVudCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShydW5uYWJsZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHRDb250ZW50I3JlbW92ZVRleHRDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlRleHRDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlVGV4dENoYW5nZUxpc3RlbmVyKGZpbmFsIFRleHRDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCi0JCWlmICgoZlRleHRDaGFuZ2VMaXN0ZW5lcnMgIT0gbnVsbCkgJiYgKGxpc3RlbmVyICE9IG51bGwpKSB7Ci0JCQkvLyBpZiBpdHMgbm90IGluIHRoZSBsaXN0ZW5lcnMsIHdlJ2xsIGlnbm9yZSB0aGUKLQkJCS8vIHJlcXVlc3QKLQkJCWlmICghVXRpbGl0aWVzLmNvbnRhaW5zKGZUZXh0Q2hhbmdlTGlzdGVuZXJzLCBsaXN0ZW5lcikpIHsKLQkJCQlpZiAoRGVidWcuZGlzcGxheVdhcm5pbmdzKSB7Ci0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcjo6cmVtb3ZlVGV4dENoYW5nZWRMaXN0ZW5lcnMuIGxpc3RlbmVyICIgKyBsaXN0ZW5lciArICIgd2FzIG5vdCBwcmVzZW50LiAiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkRG9jdW1lbnRUb1RleHRBZGFwdGVyOjphZGRUZXh0Q2hhbmdlZExpc3RlbmVycy4gUmVtb3ZpbmcgYW4gaW5zdGFuY2Ugb2YgIiArIGxpc3RlbmVyLmdldENsYXNzKCkgKyAiIGFzIGEgbGlzdGVuZXIgb24gdGV4dCBhZGFwdGVyLiIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlmaW5hbCBpbnQgb2xkU2l6ZSA9IGZUZXh0Q2hhbmdlTGlzdGVuZXJzLmxlbmd0aDsKLQkJCQlpbnQgbmV3U2l6ZSA9IG9sZFNpemUgLSAxOwotCQkJCWZpbmFsIFRleHRDaGFuZ2VMaXN0ZW5lcltdIG5ld0xpc3RlbmVycyA9IG5ldyBUZXh0Q2hhbmdlTGlzdGVuZXJbbmV3U2l6ZV07Ci0KLQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2xkU2l6ZTsgaSsrKSB7Ci0JCQkJCQkJaWYgKGZUZXh0Q2hhbmdlTGlzdGVuZXJzW2ldICE9IGxpc3RlbmVyKSB7Ci0JCQkJCQkJCS8vIGNvcHkgb2xkIHRvIG5ldyBpZiBpdHMgbm90IHRoZQotCQkJCQkJCQkvLyBvbmUgd2UgYXJlIHJlbW92aW5nCi0JCQkJCQkJCW5ld0xpc3RlbmVyc1tpbmRleCsrXSA9IGZUZXh0Q2hhbmdlTGlzdGVuZXJzW2ldOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX07Ci0JCQkJcnVuT25EaXNwbGF5VGhyZWFkSWZOZWVkZWRlKHJ1bm5hYmxlKTsKLQkJCQkvLyBub3cgdGhhdCB3ZSBoYXZlIGEgbmV3IGFycmF5LCBsZXQncwotCQkJCS8vIHN3aXRjaCBpdCBmb3IgdGhlIG9sZCBvbmUKLQkJCQlmVGV4dENoYW5nZUxpc3RlbmVycyA9IG5ld0xpc3RlbmVyczsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFJlcGxhY2UgdGhlIHRleHQgd2l0aCAibmV3VGV4dCIgc3RhcnRpbmcgYXQgcG9zaXRpb24gInN0YXJ0IiBmb3IgYQotCSAqIGxlbmd0aCBvZiAicmVwbGFjZUxlbmd0aCIuCi0JICogPHA+Ci0JICogSW1wbGVtZW50b3JzIGhhdmUgdG8gbm90aWZ5IFRleHRDaGFuZ2VkIGxpc3RlbmVycyBhZnRlciB0aGUgY29udGVudCBoYXMKLQkgKiBiZWVuIHVwZGF0ZWQuIFRoZSBUZXh0Q2hhbmdlZEV2ZW50IHNob3VsZCBiZSBzZXQgYXMgZm9sbG93czoKLQkgKiA8dWw+Ci0JICogPGxpPmV2ZW50LnR5cGUgPSBTV1QuVGV4dFJlcGxhY2VkCi0JICogPGxpPmV2ZW50LnN0YXJ0ID0gc3RhcnQgb2YgdGhlIHJlcGxhY2VkIHRleHQKLQkgKiA8bGk+ZXZlbnQubnVtUmVwbGFjZWRMaW5lcyA9IG51bWJlciBvZiByZXBsYWNlZCBsaW5lcwotCSAqIDxsaT5ldmVudC5udW1OZXdMaW5lcyA9IG51bWJlciBvZiBuZXcgbGluZXMKLQkgKiA8bGk+ZXZlbnQucmVwbGFjZWRMZW5ndGggPSBsZW5ndGggb2YgdGhlIHJlcGxhY2VkIHRleHQKLQkgKiA8bGk+ZXZlbnQubmV3TGVuZ3RoID0gbGVuZ3RoIG9mIHRoZSBuZXcgdGV4dAotCSAqIDwvdWw+Ci0JICogPGI+Tk9URTogPC9iPiBudW1OZXdMaW5lcyBpcyB0aGUgbnVtYmVyIG9mIGluc2VydGVkIGxpbmVzIGFuZAotCSAqIG51bVJlcGxhY2VkTGluZXMgaXMgdGhlIG51bWJlciBvZiBkZWxldGVkIGxpbmVzIGJhc2VkIG9uIHRoZSBjaGFuZ2UKLQkgKiB0aGF0IG9jY3VycyB2aXN1YWxseS4gRm9yIGV4YW1wbGU6Ci0JICogPHVsPgotCSAqIDxsaT4ocmVwbGFjZWRUZXh0LCBuZXdUZXh0KSA9PT4gKG51bVJlcGxhY2VkTGluZXMsIG51bU5ld0xpbmVzKQotCSAqIDxsaT4oIiIsICJcbiIpID09PiAoMCwgMSkKLQkgKiA8bGk+KCJcblxuIiwgImEiKSA9PT4gKDIsIDApCi0JICogPGxpPigiYSIsICJcblxuIikgPT0+ICgwLCAyKQotCSAqIDxsaT4oIlxuIiwgIiIpID09PiAoMSwgMCkKLQkgKiA8L3VsPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gc3RhcnQKLQkgKiAgICAgICAgICAgIHN0YXJ0IG9mZnNldCBvZiB0ZXh0IHRvIHJlcGxhY2UsIG5vbmUgb2YgdGhlIG9mZnNldHMgaW5jbHVkZQotCSAqICAgICAgICAgICAgZGVsaW1pdGVycyBvZiBwcmVjZWVkaW5nIGxpbmVzLCBvZmZzZXQgMCBpcyB0aGUgZmlyc3QKLQkgKiAgICAgICAgICAgIGNoYXJhY3RlciBvZiB0aGUgZG9jdW1lbnQKLQkgKiBAcGFyYW0gcmVwbGFjZUxlbmd0aAotCSAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IG9mIHRleHQgdG8gcmVwbGFjZQotCSAqIEBwYXJhbSBuZXdUZXh0Ci0JICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGV4dCB0byByZXBsYWNlCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZVRleHRSYW5nZShpbnQgc3RhcnQsIGludCByZXBsYWNlTGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCi0JCWlmIChnZXRQYXJlbnREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJLy8gdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpbml0aWF0ZXMgdGhlICJjaGFuZ2luZyIKLQkJCS8vIGFuZCAiY2hhbmdlZCIgZXZlbnRzLgotCQkJLy8gdGhleSBhcmUgYm90aCBmaXJlZCBieSB0aGUgdGltZSB0aGlzIG1ldGhvZAotCQkJLy8gcmV0dXJucy4KLQkJCUlSZWdpb24gcmVnaW9uID0gZ2V0UHJvamVjdGlvblRvTWFzdGVyUmVnaW9uKG5ldyBSZWdpb24oc3RhcnQsIHJlcGxhY2VMZW5ndGgpKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCSgoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0UGFyZW50RG9jdW1lbnQoKSkucmVwbGFjZVRleHQodGhpcywgcmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCksIHRleHQpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBkZWZhdWx0IGlzIHRvIGp1c3QgdHJ5IGFuZCByZXBsYWNlIHRleHQgcmFuZ2UgaW4gY3VycmVudCBkb2N1bWVudAotCQl0cnkgewotCQkJZ2V0RG9jdW1lbnQoKS5yZXBsYWNlKHN0YXJ0LCByZXBsYWNlTGVuZ3RoLCB0ZXh0KTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRBZGFwdGVyRXh0ZW5zaW9uI3Jlc3VtZUZvcndhcmRpbmdEb2N1bWVudENoYW5nZXMoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc3VtZUZvcndhcmRpbmdEb2N1bWVudENoYW5nZXMoKSB7Ci0KLQkJLy8gZnJvbSByZS1yZWFkaW5nIHRoZSB0ZXh0U2V0IEFQSSBpbiBTdHlsZWRUZXh0LCB3ZQotCQkvLyBtdXN0IGNhbGwKLQkJLy8gdGV4dFNldCBpZiBhbGwgdGhlIGNvbnRlbnRzIGNoYW5nZWQuIElmIGFsbCB0aGUKLQkJLy8gY29udGVudHMgZGlkCi0JCS8vIG5vdCBjaGFuZ2UsIHdlIG5lZWQgdG8gY2FsbCB0aGUgcGFpciBvZiBBUElzLAotCQkvLyB0ZXh0Q2hhbmdpbmcgYW5kCi0JCS8vIHRleHRDaGFuZ2VkLiBTbywgaWYgd2UgZXZlciBrZWVwIGNhcmVmdWwgdHJhY2sgb2YKLQkJLy8gY2hhbmdlcwotCQkvLyBkdXJpbmcgc3RvcCBmb3J3YXJkaW5nIGFuZCByZXN1bWUgZm9yd2FyZGluZywgd2UKLQkJLy8gY2FuCi0JCS8vIGludmVzdGlnYXRlIGNoYW5nZSBtYWtlIHVzZSBvZiB0aGUgcGFpciBvZiBBUElzLgotCQlmU3RvcFJlbGF5aW5nQ2hhbmdlc1JlcXVlc3RzLS07Ci0JCWlmIChmU3RvcFJlbGF5aW5nQ2hhbmdlc1JlcXVlc3RzID09IDApIHsKLQkJCS8vIGZJc0ZvcndhcmRpbmc9IHRydWU7Ci0JCQlmRG9jdW1lbnRDbG9uZSA9IG51bGw7Ci0JCQlmT3JpZ2luYWxDb250ZW50ID0gbnVsbDsKLQkJCWZPcmlnaW5hbExpbmVEZWxpbWl0ZXJzID0gbnVsbDsKLQkJCS8vIGZpcmVUZXh0U2V0KCk7Ci0JCQlyZWxheVRleHRTZXQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgJ1J1bm5hYmxlJyBzaG91bGQgYmUgdmVyeSBicmllZiwgYW5kIHNob3VsZCBub3QgImNhbGwgb3V0IiB0bwotCSAqIG90aGVyIGNvZGUgd2hpY2ggaXRzZWxmIG1pZ2h0IGNhbGwgc3luY0V4ZWMsIG9yIGRlYWRsb2NrIG1pZ2h0IG9jY3VyLgotCSAqIAotCSAqIEBwYXJhbSByCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJ1bk9uRGlzcGxheVRocmVhZElmTmVlZGVkZShSdW5uYWJsZSByKSB7Ci0JCS8vIGlmIHRoZXJlIGlzIG5vIERpc3BsYXkgYXQgYWxsICh0aGF0IGlzLCBydW5uaW5nIGhlYWRsZXNzKSwKLQkJLy8gb3IgaWYgd2UgYXJlIGFscmVhZHkgcnVubmluZyBvbiB0aGUgZGlzcGxheSB0aHJlYWQsIHRoZW4KLQkJLy8gc2ltcGx5IGV4ZWN1dGUgdGhlIHJ1bm5hYmxlLgotCQlpZiAoZ2V0RGlzcGxheSgpID09IG51bGwgfHwgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkgPT0gZ2V0RGlzcGxheSgpLmdldFRocmVhZCgpKSkgewotCQkJci5ydW4oKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIG90aGVyd2lzZSBmb3JjZSB0aGUgcnVubmFibGUgdG8gcnVuIG9uIHRoZSBkaXNwbGF5IHRocmVhZC4KLQkJCS8vCi0JCQkvLyBJdHMgdW5jbGVhciBpZiB3ZSBuZWVkIHRoaXMgYXQgYWxsLCBvbmNlCi0JCQkvLyB3ZSAiZm9yY2UiIGRvY3VtZW50IHVwZGF0ZSB0byBhbHdheXMgdGFrZSBwbGFjZSBvbiBkaXNwbGF5Ci0JCQkvLyB0aHJlYWQuCi0JCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJCWlmIChkb2MgaW5zdGFuY2VvZiBJTG9ja2FibGUpIHsKLQotCQkJCUlMb2NrIGxvY2sgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCWxvY2sgPSAoKElMb2NrYWJsZSkgZG9jKS5nZXRMb2NrT2JqZWN0KCk7Ci0JCQkJCWxvY2suYWNxdWlyZSgpOwotCQkJCQlnZXREaXNwbGF5KCkuc3luY0V4ZWMocik7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAobG9jayAhPSBudWxsKSB7Ci0JCQkJCQlsb2NrLnJlbGVhc2UoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGVsc2UsIGlnbm9yZSEsIHNpbmNlIHJpc2sgb2YgZGVhZGxvY2sKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJub24gbG9ja2FibGUgZG9jdW1lbnQgdXNlZCBmb3Igc3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3TW9kZWwKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQotCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQlnZXREb2N1bWVudCgpLnJlbW92ZVByZW5vdGlmaWVkRG9jdW1lbnRMaXN0ZW5lcihpbnRlcm5hbERvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0JCWxhc3RFdmVudCA9IG51bGw7Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIFByb2plY3Rpb25Eb2N1bWVudCkgewotCQkJZkNoaWxkRG9jdW1lbnQgPSAoUHJvamVjdGlvbkRvY3VtZW50KSBkb2N1bWVudDsKLQkJCV9zZXREb2N1bWVudChmQ2hpbGREb2N1bWVudC5nZXRNYXN0ZXJEb2N1bWVudCgpKTsKLQkJfQotCQllbHNlIHsKLQkJCWZDaGlsZERvY3VtZW50ID0gbnVsbDsKLQkJCV9zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCX0KLQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJZ2V0RG9jdW1lbnQoKS5hZGRQcmVub3RpZmllZERvY3VtZW50TGlzdGVuZXIoaW50ZXJuYWxEb2N1bWVudExpc3RlbmVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgSURvY3VtZW50I3NldFRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyBzdHJpbmcpIHsKLQotCQlpZiAoaXNTdG9wcGVkRm9yd2FyZGluZ0NoYW5nZXMoKSkgewotCQkJZkRvY3VtZW50Q2xvbmUgPSBudWxsOwotCQkJZk9yaWdpbmFsQ29udGVudCA9IGdldERvY3VtZW50KCkuZ2V0KCk7Ci0JCQlmT3JpZ2luYWxMaW5lRGVsaW1pdGVycyA9IGdldERvY3VtZW50KCkuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpOwotCQl9Ci0JCWVsc2UgaWYgKGdldFBhcmVudERvY3VtZW50KCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50KCkpLnNldFRleHQodGhpcywgc3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCWdldERvY3VtZW50KCkuc2V0KHN0cmluZyk7Ci0JCX0KLQkJcmVsYXlUZXh0U2V0KCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2FzIGFkZGVkIHRvIG1ha2UgdGVzdGluZyBlYXNpZXIuIE5vcm1hbGx5LCB0aGUgd2lkZ2V0IGlzCi0JICogc3BlY2lmaWVkIG9uIHRoZSBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRXaWRnZXQoU3R5bGVkVGV4dCB3aWRnZXQpIHsKLQotCQlmU3R5bGVkVGV4dFdpZGdldCA9IHdpZGdldDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50QWRhcHRlckV4dGVuc2lvbiNzdG9wRm9yd2FyZGluZ0RvY3VtZW50Q2hhbmdlcygpCi0JICovCi0JcHVibGljIHZvaWQgc3RvcEZvcndhcmRpbmdEb2N1bWVudENoYW5nZXMoKSB7Ci0KLQkJZlN0b3BSZWxheWluZ0NoYW5nZXNSZXF1ZXN0cysrOwotCQkvLyBvbmx5IG5lZWQgdG8gdGFrZSBzbmFwc2hvdCBvbiBmaXJzdCByZXF1ZXN0Ci0JCWlmIChmU3RvcFJlbGF5aW5nQ2hhbmdlc1JlcXVlc3RzID09IDEpIHsKLQkJCWZEb2N1bWVudENsb25lID0gbnVsbDsKLQkJCWZPcmlnaW5hbENvbnRlbnQgPSBnZXREb2N1bWVudCgpLmdldCgpOwotCQkJZk9yaWdpbmFsTGluZURlbGltaXRlcnMgPSBnZXREb2N1bWVudCgpLmdldExlZ2FsTGluZURlbGltaXRlcnMoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkTGluZUNoYW5nZUhvdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZExpbmVDaGFuZ2VIb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVkYzMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkTGluZUNoYW5nZUhvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuTGluZUNoYW5nZUhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0vKioKLSAqIEVzY2FwZXMgZGlmZiBob3ZlciBwcmVzZW50YXRpb24gdGV4dCAoY29udmVydHMgPCB0byAmbHQ7ID4gdG8gJmd0OyBldGMuLi4pCi0gKiBzbyB0aGF0IGh0bWwgaW4gdGhlIGRpZmYgZmlsZSAoZGlzcGxheWVkIGluIGhvdmVyKSBpc24ndCBwcmVzZW50ZWQgYXMgc3R5bGUKLSAqIChib2xkLCBpdGFsaWMsIGNvbG9ycywgZXRjLi4uKQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZExpbmVDaGFuZ2VIb3ZlciBleHRlbmRzIExpbmVDaGFuZ2VIb3ZlciB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbkhvdmVyRXh0ZW5zaW9uI2dldEhvdmVyQ29udHJvbENyZWF0b3IoKQotCSAqLwotCXB1YmxpYyBJSW5mb3JtYXRpb25Db250cm9sQ3JlYXRvciBnZXRIb3ZlckNvbnRyb2xDcmVhdG9yKCkgewotCQkvLyB1c2UgdGhlIGRlZmF1bHQgaW5mb3JtYXRpb24gY29udHJvbCBjcmVhdG9yIHRoYXQganVzdCBkaXNwbGF5cyB0ZXh0Ci0JCS8vIGFzIHRleHQsIG5vdCBodG1sIGNvbnRlbnQKLQkJLy8gYmVjYXVzZSB0aGVyZSBpcyBubyBzcGVjaWFsIGh0bWwgdGhhdCBzaG91bGQgYmUgcHJlc2VudGVkIHdoZW4ganVzdAotCQkvLyBzaG93aW5nIGRpZmYKLQkJLy8gaW4gdGhlIGZ1dHVyZSwgc291cmNldmlld2VyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhpcyBwbGFpbgotCQkvLyB0ZXh0IGNvbnRyb2wgbGlrZSBqYXZhIHVzZXMKLQkJLy8gU291cmNlVmlld2VySW5mb3JtYXRpb25Db250cm9sCi0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCk7Ci0JCQl9Ci0JCX07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk3YmI1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25QcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2hhcmVkSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci0KLQotLyoqCi0gKiBUaGlzIGlzIG92ZXJyaWRkZW4gdG8gZ2V0IGFyb3VuZCB0aGUgcHJvYmxlbSBvZiBiZWluZyByZWdpc3RlcmVkIGFzIGEKLSAqIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmNvcmUucHJvYmxlbW1hcmtlciByYXRoZXIgdGhhbiBhCi0gKiBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlLnByb2JsZW1tYXJrZXIgY2F1c2luZyBhbGwgcHJvYmxlbXMgdG8gYmUgc2tpcHBlZAotICogaW4gdGhlIE92ZXJ2aWV3UnVsZXIKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIGV4dGVuZHMgTWFya2VyQW5ub3RhdGlvbiBpbXBsZW1lbnRzIElBbm5vdGF0aW9uUHJlc2VudGF0aW9uIHsKLQkvLyBjb250cm9scyBpZiBpY29uIHNob3VsZCBiZSBwYWludGVkIGdyYXkKLQlwcml2YXRlIGJvb2xlYW4gZklzR3JheWVkID0gZmFsc2U7Ci0JU3RyaW5nIGZBbm5vdGF0aW9uVHlwZSA9IG51bGw7Ci0KLQlTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbihJTWFya2VyIG1hcmtlcikgewotCQlzdXBlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QW5ub3RhdGlvblR5cGUoKSB7Ci0JCXJldHVybiBmQW5ub3RhdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogRXZlbnR1YWxseSB3aWxsIGhhdmUgdG8gdXNlIElBbm5vdGF0aW9uUHJlc2VudGF0aW9uICYKLQkgKiBJQW5ub3RhdGlvbkV4dGVuc2lvbgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJBbm5vdGF0aW9uI2dldEltYWdlKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXkpCi0JICovCi0JcHJvdGVjdGVkIEltYWdlIGdldEltYWdlKERpc3BsYXkgZGlzcGxheSkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCWlmIChmQW5ub3RhdGlvblR5cGUgPT0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUikgewotCQkJaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLQkJfQotCQllbHNlIGlmIChmQW5ub3RhdGlvblR5cGUgPT0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HKSB7Ci0JCQlpbWFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0JCX0KLQkJZWxzZSBpZiAoZkFubm90YXRpb25UeXBlID09IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfSU5GTykgewotCQkJaW1hZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldFNoYXJlZEltYWdlcygpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfSU5GT19UU0spOwotCQl9Ci0KLQkJaWYgKGltYWdlICE9IG51bGwgJiYgaXNHcmF5ZWQoKSkKLQkJCXNldEltYWdlKGdldEdyYXlJbWFnZShkaXNwbGF5LCBpbWFnZSkpOwotCQllbHNlCi0JCQlzZXRJbWFnZShpbWFnZSk7Ci0KLQkJcmV0dXJuIHN1cGVyLmdldEltYWdlKGRpc3BsYXkpOwotCX0KLQotCXByaXZhdGUgSW1hZ2UgZ2V0R3JheUltYWdlKERpc3BsYXkgZGlzcGxheSwgSW1hZ2UgaW1hZ2UpIHsKLQkJaWYgKGltYWdlICE9IG51bGwpIHsKLQkJCVN0cmluZyBrZXkgPSBJbnRlZ2VyLnRvU3RyaW5nKGltYWdlLmhhc2hDb2RlKCkpOwotCQkJLy8gbWFrZSBzdXJlIHdlIGNhY2hlIHRoZSBncmF5IGltYWdlCi0JCQlJbWFnZSBncmF5SW1hZ2UgPSBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KGtleSk7Ci0JCQlpZiAoZ3JheUltYWdlID09IG51bGwpIHsKLQkJCQlncmF5SW1hZ2UgPSBuZXcgSW1hZ2UoZGlzcGxheSwgaW1hZ2UsIFNXVC5JTUFHRV9HUkFZKTsKLQkJCQlKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KGtleSwgZ3JheUltYWdlKTsKLQkJCX0KLQkJCWltYWdlID0gZ3JheUltYWdlOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0dyYXllZCgpIHsKLQkJcmV0dXJuIGZJc0dyYXllZDsKLQl9Ci0KLQlwdWJsaWMgZmluYWwgdm9pZCBzZXRHcmF5ZWQoYm9vbGVhbiBncmF5ZWQpIHsKLQkJZklzR3JheWVkID0gZ3JheWVkOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHRoZSBhbm5vdGF0aW9uJ3MgaWNvbiByZXByZXNlbnRhdGlvbiBhbmQgaXRzIGRyYXdpbmcgbGF5ZXIKLQkgKiBiYXNlZCB1cG9uIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSB1bmRlcmx5aW5nIG1hcmtlci4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QW5ub3RhdGlvblR5cGUoKSB7Ci0KLQkJSU1hcmtlciBtYXJrZXIgPSBnZXRNYXJrZXIoKTsKLQkJZkFubm90YXRpb25UeXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9VTktOT1dOOwotCQl0cnkgewotCQkJaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJTWFya2VyLlBST0JMRU0pKSB7Ci0JCQkJaW50IHNldmVyaXR5ID0gbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLlNFVkVSSVRZLCAtMSk7Ci0JCQkJc3dpdGNoIChzZXZlcml0eSkgewotCQkJCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfRVJST1IgOgotCQkJCQkJZkFubm90YXRpb25UeXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUjsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIElNYXJrZXIuU0VWRVJJVFlfV0FSTklORyA6Ci0JCQkJCQlmQW5ub3RhdGlvblR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkc7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBJTWFya2VyLlNFVkVSSVRZX0lORk8gOgotCQkJCQkJZkFubm90YXRpb25UeXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9JTkZPOwotCQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjVlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5NYXJrZXJVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JQnJlYWtwb2ludENvbnN0YW50czsKLQotCi0vKioKLSAqIFNvdXJjZSBlZGl0b3IgcmVzb3VyY2UgbWFya2VyIGFubm90YXRpb24gbW9kZWwgaW1wbGVtZW50YXRpb24KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbCBleHRlbmRzIFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTRUNPTkRBUllfSURfS0VZID0gSUJyZWFrcG9pbnRDb25zdGFudHMuUkVTT1VSQ0VfUEFUSDsKLQlwcm90ZWN0ZWQgSVJlc291cmNlIGZNYXJrZXJSZXNvdXJjZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZTZWNvbmRhcnlNYXJrZXJBdHRyaWJ1dGVWYWx1ZTsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJc3VwZXIocmVzb3VyY2UpOwotCQlmTWFya2VyUmVzb3VyY2UgPSByZXNvdXJjZTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIHNlY29uZGFyeUlEKSB7Ci0JCXN1cGVyKHJlc291cmNlKTsKLQkJZk1hcmtlclJlc291cmNlID0gcmVzb3VyY2U7Ci0JCWZTZWNvbmRhcnlNYXJrZXJBdHRyaWJ1dGVWYWx1ZSA9IHNlY29uZGFyeUlEOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCNjcmVhdGVNYXJrZXJBbm5vdGF0aW9uKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHJvdGVjdGVkIE1hcmtlckFubm90YXRpb24gY3JlYXRlTWFya2VyQW5ub3RhdGlvbihJTWFya2VyIG1hcmtlcikgewotCQkvKgotCQkgKiBXZSBuZWVkIHRvIGRvIHNvbWUgc3BlY2lhbCBwcm9jZXNzaW5nIGlmIG1hcmtlciBpcyBhIHZhbGlkYXRpb24KLQkJICogKGFrYSBwcm9ibGVtKSBtYXJrZXIgb3IgaWYgbWFya2VyIGlzIGEgYnJlYWtwb2ludCBtYXJrZXIgc28gY3JlYXRlCi0JCSAqIGEgc3BlY2lhbCBtYXJrZXIgYW5ub3RhdGlvbiBmb3IgdGhvc2UgbWFya2Vycy4gT3RoZXJ3aXNlLCB1c2UKLQkJICogZGVmYXVsdC4KLQkJICovCi0JCWlmIChNYXJrZXJVdGlsaXRpZXMuaXNNYXJrZXJUeXBlKG1hcmtlciwgSU1hcmtlci5QUk9CTEVNKSkgewotCQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbihtYXJrZXIpOwotCQl9Ci0JCXJldHVybiBzdXBlci5jcmVhdGVNYXJrZXJBbm5vdGF0aW9uKG1hcmtlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsI2dldE1hcmtlclBvc2l0aW9uKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHVibGljIFBvc2l0aW9uIGdldE1hcmtlclBvc2l0aW9uKElNYXJrZXIgbWFya2VyKSB7Ci0JCVBvc2l0aW9uIHBvcyA9IHN1cGVyLmdldE1hcmtlclBvc2l0aW9uKG1hcmtlcik7Ci0KLQkJLy8gaWYgKChwb3MgPT0gbnVsbCB8fCBwb3MuZ2V0TGVuZ3RoKCkgPT0gMCkgJiYgbWFya2VyLmdldFR5cGUoKSA9PQotCQkvLyBJSW50ZXJuYWxEZWJ1Z1VJQ29uc3RhbnRzLkFOTl9JTlNUUl9QT0lOVEVSX0NVUlJFTlQpIHsKLQkJaWYgKHBvcyA9PSBudWxsIHx8IHBvcy5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkvLyBXZSBwcm9iYWJseSBzaG91bGQgY3JlYXRlIHBvc2l0aW9uIGZyb20gbWFya2VyIGlmIG1hcmtlcgotCQkJLy8gYXR0cmlidXRlcyBzcGVjaWZ5IGEgdmFsaWQgcG9zaXRpb24KLQkJCXBvcyA9IGNyZWF0ZVBvc2l0aW9uRnJvbU1hcmtlcihtYXJrZXIpOwotCQl9Ci0KLQkJcmV0dXJuIHBvczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwjaXNBY2NlcHRhYmxlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBY2NlcHRhYmxlKElNYXJrZXIgbWFya2VyKSB7Ci0JCXRyeSB7Ci0JCQlPYmplY3QgYXR0ciA9IG1hcmtlci5nZXRBdHRyaWJ1dGUoSUJyZWFrcG9pbnRDb25zdGFudHMuQVRUUl9ISURERU4pOwotCQkJaWYgKGF0dHIgIT0gbnVsbCAmJiAoKEJvb2xlYW4pIGF0dHIpLmVxdWFscyhCb29sZWFuLlRSVUUpKQotCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZ25vcmUKLQkJfQotCi0JCWlmIChmU2Vjb25kYXJ5TWFya2VyQXR0cmlidXRlVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBzdXBlci5pc0FjY2VwdGFibGUobWFya2VyKTsKLQkJU3RyaW5nIG1hcmtlclNlY29uZGFyeU1hcmtlckF0dHJpYnV0ZVZhbHVlID0gbWFya2VyLmdldEF0dHJpYnV0ZShTRUNPTkRBUllfSURfS0VZLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiBpc1NhbWVGaWxlID0gZlNlY29uZGFyeU1hcmtlckF0dHJpYnV0ZVZhbHVlLmVxdWFsc0lnbm9yZUNhc2UobWFya2VyU2Vjb25kYXJ5TWFya2VyQXR0cmlidXRlVmFsdWUpOwotCQlyZXR1cm4gc3VwZXIuaXNBY2NlcHRhYmxlKG1hcmtlcikgJiYgaXNTYW1lRmlsZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODQ0Nzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWxGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeTsKLQotLyoqCi0gKiAKLSAqIEBhdXRob3IgbnNkCi0gKiAKLSAqIFVzZWQgYnkgdGhlIG9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuYW5ub3RhdGlvbk1vZGVsQ3JlYXRpb24gZXh0ZW5zaW9uCi0gKiBwb2ludAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSBleHRlbmRzIFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSB7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5JQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSNjcmVhdGVBbm5vdGF0aW9uTW9kZWwob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoKQotCSAqLwotCXB1YmxpYyBJQW5ub3RhdGlvbk1vZGVsIGNyZWF0ZUFubm90YXRpb25Nb2RlbChJUGF0aCBsb2NhdGlvbikgewotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFdvcmtzcGFjZUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJaWYgKGZpbGUgIT0gbnVsbCkgewotCQkJbW9kZWwgPSBuZXcgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKGZpbGUpOwotCQl9Ci0JCWVsc2UgewotCQkJbW9kZWwgPSBuZXcgU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsKFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCksIGxvY2F0aW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmQzZTMzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3Zlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5EZWJ1Z1VJVG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcudWkuSURlYnVnTW9kZWxQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Ib3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIgaW1wbGVtZW50cyBJQW5ub3RhdGlvbkhvdmVyIHsKLQotCS8qKgotCSAqIFByb3ZpZGVzIGEgc2V0IG9mIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGNyZWF0aW5nIEhUTUwgcGFnZXMuIFRha2VuCi0JICogZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5IVE1MUHJpbnRlcgotCSAqLwotCWNsYXNzIEhUTUxQcmludGVyIHsKLQotCQlIVE1MUHJpbnRlcigpIHsKLQkJfQotCi0JCXZvaWQgYWRkQnVsbGV0KFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBidWxsZXQpIHsKLQkJCWlmIChidWxsZXQgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIjxsaT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQoYnVsbGV0KTsKLQkJCQlidWZmZXIuYXBwZW5kKCI8L2xpPiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQl2b2lkIGFkZFBhZ2VFcGlsb2coU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQkJYnVmZmVyLmFwcGVuZCgiPC9mb250PjwvYm9keT48L2h0bWw+Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXZvaWQgYWRkUGFnZVByb2xvZyhTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCQlpbnNlcnRQYWdlUHJvbG9nKGJ1ZmZlciwgYnVmZmVyLmxlbmd0aCgpKTsKLQkJfQotCi0JCXZvaWQgYWRkUGFyYWdyYXBoKFN0cmluZ0J1ZmZlciBidWZmZXIsIFJlYWRlciBwYXJhZ3JhcGhSZWFkZXIpIHsKLQkJCWlmIChwYXJhZ3JhcGhSZWFkZXIgIT0gbnVsbCkKLQkJCQlhZGRQYXJhZ3JhcGgoYnVmZmVyLCByZWFkKHBhcmFncmFwaFJlYWRlcikpOwotCQl9Ci0KLQkJdm9pZCBhZGRQYXJhZ3JhcGgoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHBhcmFncmFwaCkgewotCQkJaWYgKHBhcmFncmFwaCAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZCgiPHA+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQlidWZmZXIuYXBwZW5kKHBhcmFncmFwaCk7Ci0JCQl9Ci0JCX0KLQotCQl2b2lkIGFkZFNtYWxsSGVhZGVyKFN0cmluZ0J1ZmZlciBidWZmZXIsIFN0cmluZyBoZWFkZXIpIHsKLQkJCWlmIChoZWFkZXIgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoIjxoNT4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCWJ1ZmZlci5hcHBlbmQoaGVhZGVyKTsKLQkJCQlidWZmZXIuYXBwZW5kKCI8L2g1PiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgY29udmVydFRvSFRNTENvbnRlbnQoU3RyaW5nIGNvbnRlbnQpIHsKLQkJCWNvbnRlbnQgPSByZXBsYWNlKGNvbnRlbnQsICc8JywgIiZsdDsiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHJlcGxhY2UoY29udGVudCwgJz4nLCAiJmd0OyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQl2b2lkIGVuZEJ1bGxldExpc3QoU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQkJYnVmZmVyLmFwcGVuZCgiPC91bD4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJdm9pZCBpbnNlcnRQYWdlUHJvbG9nKFN0cmluZ0J1ZmZlciBidWZmZXIsIGludCBwb3NpdGlvbikgewotCQkJYnVmZmVyLmluc2VydChwb3NpdGlvbiwgIjxodG1sPjxib2R5IHRleHQ9XCIjMDAwMDAwXCIgYmdjb2xvcj1cIiNGRkZGODhcIj48Zm9udCBzaXplPS0xPiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlTdHJpbmcgcmVhZChSZWFkZXIgcmQpIHsKLQotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWNoYXJbXSByZWFkQnVmZmVyID0gbmV3IGNoYXJbMjA0OF07Ci0KLQkJCXRyeSB7Ci0JCQkJaW50IG4gPSByZC5yZWFkKHJlYWRCdWZmZXIpOwotCQkJCXdoaWxlIChuID4gMCkgewotCQkJCQlidWZmZXIuYXBwZW5kKHJlYWRCdWZmZXIsIDAsIG4pOwotCQkJCQluID0gcmQucmVhZChyZWFkQnVmZmVyKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIHgpIHsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyByZXBsYWNlKFN0cmluZyB0ZXh0LCBjaGFyIGMsIFN0cmluZyBzKSB7Ci0KLQkJCWludCBwcmV2aW91cyA9IDA7Ci0JCQlpbnQgY3VycmVudCA9IHRleHQuaW5kZXhPZihjLCBwcmV2aW91cyk7Ci0KLQkJCWlmIChjdXJyZW50ID09IC0xKQotCQkJCXJldHVybiB0ZXh0OwotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJd2hpbGUgKGN1cnJlbnQgPiAtMSkgewotCQkJCWJ1ZmZlci5hcHBlbmQodGV4dC5zdWJzdHJpbmcocHJldmlvdXMsIGN1cnJlbnQpKTsKLQkJCQlidWZmZXIuYXBwZW5kKHMpOwotCQkJCXByZXZpb3VzID0gY3VycmVudCArIDE7Ci0JCQkJY3VycmVudCA9IHRleHQuaW5kZXhPZihjLCBwcmV2aW91cyk7Ci0JCQl9Ci0JCQlidWZmZXIuYXBwZW5kKHRleHQuc3Vic3RyaW5nKHByZXZpb3VzKSk7Ci0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCXZvaWQgc3RhcnRCdWxsZXRMaXN0KFN0cmluZ0J1ZmZlciBidWZmZXIpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIjx1bD4iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJRGVidWdNb2RlbFByZXNlbnRhdGlvbiBmRGVidWdNb2RlbFByZXNlbnRhdGlvbjsKLQotCXByaXZhdGUgSFRNTFByaW50ZXIgcHJpbnRlciA9IG5ldyBIVE1MUHJpbnRlcigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgZGlzdGFuY2UgdG8gdGhlIHJ1bGVyIGxpbmUuCi0JICovCi0JcHJpdmF0ZSBpbnQgY29tcGFyZVJ1bGVyTGluZShQb3NpdGlvbiBwb3NpdGlvbiwgSURvY3VtZW50IGRvY3VtZW50LCBpbnQgbGluZSkgewotCi0JCWlmIChwb3NpdGlvbi5nZXRPZmZzZXQoKSA+IC0xICYmIHBvc2l0aW9uLmdldExlbmd0aCgpID4gLTEpIHsKLQkJCXRyeSB7Ci0JCQkJaW50IG1hcmtlckxpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWlmIChsaW5lID09IG1hcmtlckxpbmUpCi0JCQkJCXJldHVybiAxOwotCQkJCWlmIChtYXJrZXJMaW5lIDw9IGxpbmUgJiYgbGluZSA8PSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyBwb3NpdGlvbi5nZXRMZW5ndGgoKSkpCi0JCQkJCXJldHVybiAyOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIHgpIHsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAwOwotCX0KLQotCS8qCi0JICogRm9ybWF0cyB0aGUgbWVzc2FnZSBvZiB0aGlzIGhvdmVyIHRvIGZpdCBvbnRvIHRoZSBzY3JlZW4uCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybWF0SG92ZXJUZXh0KFN0cmluZyB0ZXh0LCBJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGxpbmVEZWxpbSA9IG5ldyBTdHJpbmcoKTsKLQkJdHJ5IHsKLQkJCWxpbmVEZWxpbSA9IHNvdXJjZVZpZXdlci5nZXREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoMCk7Ci0JCX0KLQkJY2F0Y2ggKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0JCQkvLyBza2lwLCBqdXN0IHVzZSBkZWZhdWx0Ci0JCX0KLQkJRGlzcGxheSBkaXNwbGF5ID0gc291cmNlVmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCk7Ci0KLQkJLy8gcmVwbGFjZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGV4dCB3aXRoIGh0bWwgZW50aXR5IChsaWtlIDwsID4sICYKLQkJLy8gdG8gJmx0OywgJmd0OywgJiY7KQotCQl0ZXh0ID0gU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQodGV4dCk7Ci0KLQkJUmVhZGVyIHRleHRSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKHRleHQpOwotCQlHQyBnYyA9IG5ldyBHQyhkaXNwbGF5KTsKLQkJdHJ5IHsKLQkJCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJCVN0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyIHJlYWRlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dExpbmVCcmVha2luZ1JlYWRlcih0ZXh0UmVhZGVyLCBnYywgZ2V0SG92ZXJXaWR0aChkaXNwbGF5KSk7Ci0JCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotCQkJCWlmIChidWYubGVuZ3RoKCkgIT0gMCkgewotCQkJCQlidWYuYXBwZW5kKGxpbmVEZWxpbSk7Ci0JCQkJfQotCQkJCWJ1Zi5hcHBlbmQobGluZSk7Ci0JCQkJbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJfQotCQkJcmVzdWx0ID0gYnVmLnRvU3RyaW5nKCk7Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleGNlcHRpb24pOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZ2MuZGlzcG9zZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBGb3JtYXRzIHNldmVyYWwgbWVzc2FnZSBhcyBIVE1MIHRleHQuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZm9ybWF0TXVsdGlwbGVIb3ZlclRleHQoTGlzdCBtZXNzYWdlcykgewotCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCXByaW50ZXIuYWRkUGFnZVByb2xvZyhidWZmZXIpOwotCQlwcmludGVyLmFkZFBhcmFncmFwaChidWZmZXIsIFNTRVVJTWVzc2FnZXMuTXVsdGlwbGVfZXJyb3JzKTsgLy8kTk9OLU5MUy0xJAotCi0JCXByaW50ZXIuc3RhcnRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0JCUl0ZXJhdG9yIGUgPSBtZXNzYWdlcy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpCi0JCQlwcmludGVyLmFkZEJ1bGxldChidWZmZXIsIHByaW50ZXIuY29udmVydFRvSFRNTENvbnRlbnQoKFN0cmluZykgZS5uZXh0KCkpKTsKLQkJcHJpbnRlci5lbmRCdWxsZXRMaXN0KGJ1ZmZlcik7Ci0KLQkJcHJpbnRlci5hZGRQYWdlRXBpbG9nKGJ1ZmZlcik7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElWZXJ0aWNhbFJ1bGVySG92ZXIjZ2V0SG92ZXJJbmZvKElTb3VyY2VWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgaW50IGxpbmVOdW1iZXIpIHsKLQkJSU1hcmtlciBtYXJrZXIgPSBnZXRNYXJrZXIoc291cmNlVmlld2VyLCBsaW5lTnVtYmVyKTsKLQkJTGlzdCBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3QobWFya2VyID09IG51bGwgPyAwIDogMSk7Ci0JCWlmIChtYXJrZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nIHRleHQgPSBtYXJrZXIuZ2V0QXR0cmlidXRlKElNYXJrZXIuTUVTU0FHRSwgKFN0cmluZykgbnVsbCk7Ci0JCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJbWVzc2FnZXMuYWRkKHRleHQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKG1hcmtlci5pc1N1YnR5cGVPZihJQnJlYWtwb2ludC5CUkVBS1BPSU5UX01BUktFUikpIHsKLQkJCQkJCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCQkJCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gbWFuYWdlci5nZXRCcmVha3BvaW50cygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJCQkJCUlCcmVha3BvaW50IGJyZWFrcG9pbnQgPSBicmVha3BvaW50c1tpXTsKLQkJCQkJCQlpZiAoYnJlYWtwb2ludC5nZXRNYXJrZXIoKS5lcXVhbHMobWFya2VyKSkgewotCQkJCQkJCQlpZiAoZkRlYnVnTW9kZWxQcmVzZW50YXRpb24gPT0gbnVsbCkgewotCQkJCQkJCQkJZkRlYnVnTW9kZWxQcmVzZW50YXRpb24gPSBEZWJ1Z1VJVG9vbHMubmV3RGVidWdNb2RlbFByZXNlbnRhdGlvbigpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCXRleHQgPSBmRGVidWdNb2RlbFByZXNlbnRhdGlvbi5nZXRUZXh0KGJyZWFrcG9pbnQpOwotCQkJCQkJCQlpZiAodGV4dCAhPSBudWxsKSB7Ci0JCQkJCQkJCQltZXNzYWdlcy5hZGQodGV4dCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlMaXN0IHRlbXBvcmFyeUFubm90YXRpb25zID0gZ2V0VGVtcG9yYXJ5QW5ub3RhdGlvbnNGb3JMaW5lKHNvdXJjZVZpZXdlciwgbGluZU51bWJlcik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGVtcG9yYXJ5QW5ub3RhdGlvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gKChBbm5vdGF0aW9uKSB0ZW1wb3JhcnlBbm5vdGF0aW9ucy5nZXQoaSkpLmdldFRleHQoKTsKLQkJCWlmIChtZXNzYWdlICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGR1cGxpY2F0ZWQgPSBmYWxzZTsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IG1lc3NhZ2VzLnNpemUoKTsgaisrKQotCQkJCQlkdXBsaWNhdGVkID0gZHVwbGljYXRlZCB8fCBtZXNzYWdlcy5nZXQoaikuZXF1YWxzKG1lc3NhZ2UpOwotCQkJCWlmICghZHVwbGljYXRlZCkgewotCQkJCQltZXNzYWdlcy5hZGQobWVzc2FnZSk7Ci0JCQkJfQotCi0JCQl9Ci0JCQllbHNlCi0JCQkJbWVzc2FnZXMuYWRkKCgoSVRlbXBvcmFyeUFubm90YXRpb24pIHRlbXBvcmFyeUFubm90YXRpb25zLmdldChpKSkudG9TdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKG1lc3NhZ2VzLnNpemUoKSA+IDEpCi0JCQlyZXR1cm4gZm9ybWF0TXVsdGlwbGVIb3ZlclRleHQobWVzc2FnZXMpOwotCQllbHNlIGlmIChtZXNzYWdlcy5zaXplKCkgPiAwKQotCQkJcmV0dXJuIGZvcm1hdEhvdmVyVGV4dChtZXNzYWdlcy5nZXQoMCkudG9TdHJpbmcoKSwgc291cmNlVmlld2VyKTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0SG92ZXJXaWR0aChEaXNwbGF5IGRpc3BsYXkpIHsKLQkJUmVjdGFuZ2xlIGRpc3BsYXlCb3VuZHMgPSBkaXNwbGF5LmdldEJvdW5kcygpOwotCQlpbnQgaG92ZXJXaWR0aCA9IGRpc3BsYXlCb3VuZHMud2lkdGggLSAoZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpLnggLSBkaXNwbGF5Qm91bmRzLngpOwotCQlob3ZlcldpZHRoIC09IDEyOyAvLyBYWFg6IEFkZCBzb21lIHNwYWNlIHRvIHRoZSBib3JkZXIsIFJldmlzaXQKLQkJaWYgKGhvdmVyV2lkdGggPCAyMDApIHsKLQkJCWhvdmVyV2lkdGggPSAyMDA7Ci0JCX0KLQkJcmV0dXJuIGhvdmVyV2lkdGg7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBvbmUgbWFya2VyIHdoaWNoIGluY2x1ZGVzIHRoZSBydWxlcidzIGxpbmUgb2YgYWN0aXZpdHkuCi0JICovCi0JcHJpdmF0ZSBJTWFya2VyIGdldE1hcmtlcihJU291cmNlVmlld2VyIHZpZXdlciwgaW50IGxpbmUpIHsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IHZpZXdlci5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgZXhhY3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW5jbHVkaW5nID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGUgPSBtb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGUubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJTWFya2VyQW5ub3RhdGlvbiBhID0gKE1hcmtlckFubm90YXRpb24pIG87Ci0JCQkJc3dpdGNoIChjb21wYXJlUnVsZXJMaW5lKG1vZGVsLmdldFBvc2l0aW9uKGEpLCBkb2N1bWVudCwgbGluZSkpIHsKLQkJCQkJY2FzZSAxIDoKLQkJCQkJCWV4YWN0LmFkZChhLmdldE1hcmtlcigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDIgOgotCQkJCQkJaW5jbHVkaW5nLmFkZChhLmdldE1hcmtlcigpKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBzZWxlY3QoZXhhY3QsIGluY2x1ZGluZyk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBvbmUgbWFya2VyIHdoaWNoIGluY2x1ZGVzIHRoZSBydWxlcidzIGxpbmUgb2YgYWN0aXZpdHkuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFRlbXBvcmFyeUFubm90YXRpb25zRm9yTGluZShJU291cmNlVmlld2VyIHZpZXdlciwgaW50IGxpbmUpIHsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IHZpZXdlci5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgZXhhY3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3QgaW5jbHVkaW5nID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCUl0ZXJhdG9yIGUgPSBtb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlPYmplY3QgbyA9IGUubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJCUlUZW1wb3JhcnlBbm5vdGF0aW9uIGEgPSAoSVRlbXBvcmFyeUFubm90YXRpb24pIG87Ci0JCQkJUG9zaXRpb24gcG9zaXRpb24gPSBtb2RlbC5nZXRQb3NpdGlvbigoQW5ub3RhdGlvbikgYSk7Ci0JCQkJaWYgKHBvc2l0aW9uID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJc3dpdGNoIChjb21wYXJlUnVsZXJMaW5lKHBvc2l0aW9uLCBkb2N1bWVudCwgbGluZSkpIHsKLQkJCQkJY2FzZSAxIDoKLQkJCQkJCWV4YWN0LmFkZChhKTsKLQkJCQkJCWJyZWFrOwotCQkJCQljYXNlIDIgOgotCQkJCQkJaW5jbHVkaW5nLmFkZChhKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBleGFjdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVJlbGVhc2FibGUjcmVsZWFzZSgpCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJaWYgKGZEZWJ1Z01vZGVsUHJlc2VudGF0aW9uICE9IG51bGwpIHsKLQkJCWZEZWJ1Z01vZGVsUHJlc2VudGF0aW9uLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNlbGVjdHMgb25lIG1hcmtlciBmcm9tIHRoZSB0d28gbGlzdHMuCi0JICovCi0JcHJpdmF0ZSBJTWFya2VyIHNlbGVjdChMaXN0IGZpcnN0Q2hvaWNlLCBMaXN0IHNlY29uZENob2ljZSkgewotCQlpZiAoIWZpcnN0Q2hvaWNlLmlzRW1wdHkoKSkKLQkJCXJldHVybiAoSU1hcmtlcikgZmlyc3RDaG9pY2UuZ2V0KDApOwotCQlpZiAoIXNlY29uZENob2ljZS5pc0VtcHR5KCkpCi0JCQlyZXR1cm4gKElNYXJrZXIpIHNlY29uZENob2ljZS5nZXQoMCk7Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dExpbmVCcmVha2luZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDBmYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1N0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLQotLyoKLSAqIE5vdCBhIHJlYWwgcmVhZGVyLiBDb3VsZCBjaGFuZ2UgaWYgcmVxdWVzdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dExpbmVCcmVha2luZ1JlYWRlciB7Ci0JcHJpdmF0ZSBHQyBmR0M7Ci0JcHJpdmF0ZSBpbnQgZkluZGV4OwotCXByaXZhdGUgU3RyaW5nIGZMaW5lOwotCXByaXZhdGUgaW50IGZNYXhXaWR0aDsKLQotCXByaXZhdGUgQnVmZmVyZWRSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSByZWFkZXIgdGhhdCBicmVha3MgYW4gaW5wdXQgdGV4dCB0byBmaXQgaW4gYSBnaXZlbiB3aWR0aC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVhZGVyCi0JICogICAgICAgICAgICBSZWFkZXIgb2YgdGhlIGlucHV0IHRleHQKLQkgKiBAcGFyYW0gZ2MKLQkgKiAgICAgICAgICAgIFRoZSBncmFwaGljIGNvbnRleHQgdGhhdCBkZWZpbmVzIHRoZSBjdXJyZW50bHkgdXNlZCBmb250Ci0JICogICAgICAgICAgICBzaXplcwotCSAqIEBwYXJhbSBtYXhMaW5lV2lkdGgKLQkgKiAgICAgICAgICAgIFRoZSBtYXggd2lkdGggKHBpeGVzKSB3aGVyZSB0aGUgdGV4dCBoYXMgdG8gZml0IGluCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0TGluZUJyZWFraW5nUmVhZGVyKFJlYWRlciByZWFkZXIsIEdDIGdjLCBpbnQgbWF4TGluZVdpZHRoKSB7Ci0JCWZSZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIocmVhZGVyKTsKLQkJZkdDID0gZ2M7Ci0JCWZNYXhXaWR0aCA9IG1heExpbmVXaWR0aDsKLQkJZkxpbmUgPSBudWxsOwotCQlmSW5kZXggPSAwOwotCX0KLQotCXByaXZhdGUgaW50IGZpbmROZXh0QnJlYWtJbmRleChpbnQgY3VyckluZGV4KSB7Ci0JCWludCBjdXJyV2lkdGggPSAwOwotCQlpbnQgbGluZUxlbmd0aCA9IGZMaW5lLmxlbmd0aCgpOwotCi0JCXdoaWxlIChjdXJySW5kZXggPCBsaW5lTGVuZ3RoKSB7Ci0JCQljaGFyIGNoID0gZkxpbmUuY2hhckF0KGN1cnJJbmRleCk7Ci0JCQlpbnQgbmV4dEluZGV4ID0gY3VyckluZGV4ICsgMTsKLQkJCS8vIGxlYWRpbmcgd2hpdGVzcGFjZXMgYXJlIGNvdW50ZWQgdG8gdGhlIGZvbGxvd2luZyB3b3JkCi0JCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkpIHsKLQkJCQl3aGlsZSAobmV4dEluZGV4IDwgbGluZUxlbmd0aCAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGZMaW5lLmNoYXJBdChuZXh0SW5kZXgpKSkgewotCQkJCQluZXh0SW5kZXgrKzsKLQkJCQl9Ci0JCQl9Ci0JCQl3aGlsZSAobmV4dEluZGV4IDwgbGluZUxlbmd0aCAmJiAhQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmTGluZS5jaGFyQXQobmV4dEluZGV4KSkpIHsKLQkJCQluZXh0SW5kZXgrKzsKLQkJCX0KLQkJCVN0cmluZyB3b3JkID0gZkxpbmUuc3Vic3RyaW5nKGN1cnJJbmRleCwgbmV4dEluZGV4KTsKLQkJCWludCB3b3JkV2lkdGggPSBmR0MudGV4dEV4dGVudCh3b3JkKS54OwotCQkJaW50IG5leHRXaWR0aCA9IHdvcmRXaWR0aCArIGN1cnJXaWR0aDsKLQkJCWlmIChuZXh0V2lkdGggPiBmTWF4V2lkdGggJiYgd29yZFdpZHRoIDwgZk1heFdpZHRoKSB7Ci0JCQkJcmV0dXJuIGN1cnJJbmRleDsKLQkJCX0KLQkJCWN1cnJXaWR0aCA9IG5leHRXaWR0aDsKLQkJCWN1cnJJbmRleCA9IG5leHRJbmRleDsKLQkJfQotCQlyZXR1cm4gY3VyckluZGV4OwotCX0KLQotCXByaXZhdGUgaW50IGZpbmRXb3JkQmVnaW4oaW50IGlkeCkgewotCQl3aGlsZSAoaWR4IDwgZkxpbmUubGVuZ3RoKCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmTGluZS5jaGFyQXQoaWR4KSkpIHsKLQkJCWlkeCsrOwotCQl9Ci0JCXJldHVybiBpZHg7Ci0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIG5leHQgbGluZS4gVGhlIGxlbmd0aHMgb2YgdGhlIGxpbmUgd2lsbCBub3QgZXhjZWVkIHRoZSBnaXZlZAotCSAqIG1heGltdW0gd2lkdGguCi0JICovCi0JcHVibGljIFN0cmluZyByZWFkTGluZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChmTGluZSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbGluZSA9IGZSZWFkZXIucmVhZExpbmUoKTsKLQkJCWlmIChsaW5lID09IG51bGwpIHsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJCWludCBsaW5lTGVuID0gZkdDLnRleHRFeHRlbnQobGluZSkueDsKLQkJCWlmIChsaW5lTGVuIDwgZk1heFdpZHRoKSB7Ci0JCQkJcmV0dXJuIGxpbmU7Ci0JCQl9Ci0JCQlmTGluZSA9IGxpbmU7Ci0JCQlmSW5kZXggPSAwOwotCQl9Ci0JCWludCBicmVha0lkeCA9IGZpbmROZXh0QnJlYWtJbmRleChmSW5kZXgpOwotCQlTdHJpbmcgcmVzID0gZkxpbmUuc3Vic3RyaW5nKGZJbmRleCwgYnJlYWtJZHgpOwotCQlpZiAoYnJlYWtJZHggPCBmTGluZS5sZW5ndGgoKSkgewotCQkJZkluZGV4ID0gZmluZFdvcmRCZWdpbihicmVha0lkeCk7Ci0JCX0gZWxzZSB7Ci0JCQlmTGluZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHJlczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjFkZmUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBUaGlzIGV2ZW50IGlzIHVzZWQgYnkgdGhlIFNvdXJjZUVkaXRvclRyZWVWaWV3ZXIgdG8gdGVsbCB0aGUKLSAqIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgdGhhdCB0aGUgc2VsZWN0aW9uIHJlYWxseSBjYW1lIGZyb20gYSB1c2VyIGNsaWNrIG9uCi0gKiB0aGUgY29udGVudCBvdXRsaW5lciwgaW5zdGVhZCBvZiBiZWluZyBzZXQgcHJvZ3JhbWF0aWNhbGx5LgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudCB7Ci0KLQkvKioKLQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCSAqLwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50KElTZWxlY3Rpb25Qcm92aWRlciBzb3VyY2UsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXN1cGVyKHNvdXJjZSwgc2VsZWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvU3RydWN0dXJlZFRleHRWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTZmODgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9TdHJ1Y3R1cmVkVGV4dFZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklDb250ZW50Rm9ybWF0dGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5wcm9qZWN0aW9uLlByb2plY3Rpb25Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JT3ZlcnZpZXdSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVmVyaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWRpdG9yU3RhdHVzTGluZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5TdHJ1Y3R1cmVkQ29udGVudENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uVW5kb0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5IaWdobGlnaHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFZpZXdlciBleHRlbmRzIFByb2plY3Rpb25WaWV3ZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRTZWxlY3Rpb25NZWRpYXRvciB7Ci0JLyoqIFRleHQgb3BlcmF0aW9uIGNvZGVzICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJBU0UgPSBQcm9qZWN0aW9uVmlld2VyLkNPTExBUFNFX0FMTDsgLy8gc2VlCi0JLy8gUHJvamVjdGlvblZpZXdlci5DT0xMQVBTRV9BTEwKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0xFQU5VUF9ET0NVTUVOVCA9IEJBU0UgKyAxOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEZPUk1BVF9BQ1RJVkVfRUxFTUVOVFMgPSBCQVNFICsgMzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTX1RFWFQgPSBTU0VVSU1lc3NhZ2VzLkZvcm1hdF9BY3RpdmVfRWxlbWVudHNfVUlfOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9STUFUX0RPQ1VNRU5UID0gQkFTRSArIDI7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9ET0NVTUVOVF9URVhUID0gU1NFVUlNZXNzYWdlcy5Gb3JtYXRfRG9jdW1lbnRfVUlfOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVJQ0tfRklYID0gQkFTRSArIDQ7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFRfQ1VUID0gU1NFVUlNZXNzYWdlcy5UZXh0X0N1dF9VSV87IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9QQVNURSA9IFNTRVVJTWVzc2FnZXMuVGV4dF9QYXN0ZV9VSV87IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TSElGVF9MRUZUID0gU1NFVUlNZXNzYWdlcy5UZXh0X1NoaWZ0X0xlZnRfVUlfOyAvLyROT04tTkxTLTEkID0gIlRleHQgU2hpZnQgTGVmdCIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9TSElGVF9SSUdIVCA9IFNTRVVJTWVzc2FnZXMuVGV4dF9TaGlmdF9SaWdodF9VSV87IC8vJE5PTi1OTFMtMSQgPSAiVGV4dCBTaGlmdCBSaWdodCIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFRSQUNFX0VYQ0VQVElPTlMgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGZCYWNrZ3JvdW5kdXBkYXRlSW5Qcm9ncmVzczsKLQlwcml2YXRlIFN0cnVjdHVyZWRDb250ZW50Q2xlYW51cEhhbmRsZXIgZkNvbnRlbnRDbGVhbnVwSGFuZGxlciA9IG51bGw7Ci0JcHJpdmF0ZSBJQ29udGVudEFzc2lzdGFudCBmQ29ycmVjdGlvbkFzc2lzdGFudDsKLQlwcml2YXRlIGJvb2xlYW4gZkNvcnJlY3Rpb25Bc3Npc3RhbnRJbnN0YWxsZWQ7Ci0JcHJpdmF0ZSBJRG9jdW1lbnRBZGFwdGVyIGZEb2NBZGFwdGVyOwotCi0JcHJpdmF0ZSBIaWdobGlnaHRlciBmSGlnaGxpZ2h0ZXI7Ci0KLQkvLyBwcml2YXRlIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgZlZpZXdlclNlbGVjdGlvbk1hbmFnZXI7Ci0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXIjU291cmNlVmlld2VyKENvbXBvc2l0ZSwKLQkgKiAgICAgIElWZXJ0aWNhbFJ1bGVyLCBJT3ZlcnZpZXdSdWxlciwgYm9vbGVhbiwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBJVmVydGljYWxSdWxlciB2ZXJ0aWNhbFJ1bGVyLCBJT3ZlcnZpZXdSdWxlciBvdmVydmlld1J1bGVyLCBib29sZWFuIHNob3dBbm5vdGF0aW9uc092ZXJ2aWV3LCBpbnQgc3R5bGVzKSB7Ci0JCXN1cGVyKHBhcmVudCwgdmVydGljYWxSdWxlciwgb3ZlcnZpZXdSdWxlciwgc2hvd0Fubm90YXRpb25zT3ZlcnZpZXcsIHN0eWxlcyk7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGJlZXAoKSB7Ci0JCWdldFRleHRXaWRnZXQoKS5nZXREaXNwbGF5KCkuYmVlcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGJlZ2luQmFja2dyb3VuZFVwZGF0ZSgpIHsKLQkJZkJhY2tncm91bmR1cGRhdGVJblByb2dyZXNzID0gdHJ1ZTsKLQkJZGlzYWJsZVJlZHJhd2luZygpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dE9wZXJhdGlvblRhcmdldCNjYW5Eb09wZXJhdGlvbihpbnQpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuRG9PcGVyYXRpb24oaW50IG9wZXJhdGlvbikgewotCQlpZiAoZkJhY2tncm91bmR1cGRhdGVJblByb2dyZXNzKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJc3dpdGNoIChvcGVyYXRpb24pIHsKLQkJCWNhc2UgQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMgOiB7Ci0JCQkJLy8gKHBhKSBpZiBwb3NpdGlvbiBpc24ndCBSRUFEX09OTFkgKGNvbnRhaW5zUmVhZE9ubHkoKQotCQkJCS8vIHJldHVybnMgZmFsc2UpLAotCQkJCS8vIE90aGVyd2lzZSwgeW91IERPIHdhbnQgY29udGVudCBhc3Npc3QgKHJldHVybiB0cnVlKQotCQkJCUlEb2N1bWVudCBkb2MgPSBnZXREb2N1bWVudCgpOwotCQkJCWlmIChkb2MgIT0gbnVsbCAmJiBkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJCXJldHVybiBpc0VkaXRhYmxlKCkgJiYgKCEoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYykuY29udGFpbnNSZWFkT25seShnZXRTZWxlY3RlZFJhbmdlKCkueCwgMCkpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgUVVJQ0tfRklYIDogewotCQkJCXJldHVybiBpc0VkaXRhYmxlKCk7Ci0JCQl9Ci0JCQljYXNlIENMRUFOVVBfRE9DVU1FTlQgOiB7Ci0JCQkJcmV0dXJuIChmQ29udGVudENsZWFudXBIYW5kbGVyICE9IG51bGwgJiYgaXNFZGl0YWJsZSgpKTsKLQkJCX0KLQkJCWNhc2UgRk9STUFUX0RPQ1VNRU5UIDoKLQkJCWNhc2UgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA6IHsKLQkJCQlyZXR1cm4gKGZDb250ZW50Rm9ybWF0dGVyICE9IG51bGwgJiYgaXNFZGl0YWJsZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIuY2FuRG9PcGVyYXRpb24ob3BlcmF0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBTaG91bGQgYmUgaWRlbnRpY2FsIHRvIHN1cGVyY2xhc3MgdmVyc2lvbi4gUGx1cywgd2UgZ2V0IG91ciBvd24gc3BlY2lhbAotCSAqIEhpZ2hsaWdodGVyLiBQbHVzIHdlIHVuaW5zdGFsbCBiZWZvcmUgaW5zdGFsbGluZy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25maWd1cmUoU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0KLQkJaWYgKGdldFRleHRXaWRnZXQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXNldERvY3VtZW50UGFydGl0aW9uaW5nKGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHRoaXMpKTsKLQotCQkvLyBhbHdheXMgdW5pbnN0YWxsIGhpZ2hsaWdodGVyIGFuZCBudWxsIGl0IG91dCBvbiBuZXcgY29uZmlndXJhdGlvbgotCQlpZiAoZkhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZIaWdobGlnaHRlci51bmluc3RhbGwoKTsKLQkJCWZIaWdobGlnaHRlciA9IG51bGw7Ci0JCX0KLQotCQkvLyBpbnN0YWxsIGNvbnRlbnQgdHlwZSBpbmRlcGVuZGVudCBwbHVnaW5zCi0JCWlmIChmUHJlc2VudGF0aW9uUmVjb25jaWxlciAhPSBudWxsKQotCQkJZlByZXNlbnRhdGlvblJlY29uY2lsZXIudW5pbnN0YWxsKCk7Ci0JCWZQcmVzZW50YXRpb25SZWNvbmNpbGVyID0gY29uZmlndXJhdGlvbi5nZXRQcmVzZW50YXRpb25SZWNvbmNpbGVyKHRoaXMpOwotCQlpZiAoZlByZXNlbnRhdGlvblJlY29uY2lsZXIgIT0gbnVsbCkKLQkJCWZQcmVzZW50YXRpb25SZWNvbmNpbGVyLmluc3RhbGwodGhpcyk7Ci0KLQkJSVJlY29uY2lsZXIgbmV3UmVjb25jaWxlciA9IGNvbmZpZ3VyYXRpb24uZ2V0UmVjb25jaWxlcih0aGlzKTsKLQotCQlpZiAobmV3UmVjb25jaWxlciAhPSBmUmVjb25jaWxlciB8fCBuZXdSZWNvbmNpbGVyID09IG51bGwgfHwgZlJlY29uY2lsZXIgPT0gbnVsbCkgewotCi0JCQlpZiAoZlJlY29uY2lsZXIgIT0gbnVsbCkgewotCQkJCWZSZWNvbmNpbGVyLnVuaW5zdGFsbCgpOwotCQkJfQotCi0JCQlmUmVjb25jaWxlciA9IG5ld1JlY29uY2lsZXI7Ci0KLQkJCWlmIChmUmVjb25jaWxlciAhPSBudWxsKSB7Ci0JCQkJZlJlY29uY2lsZXIuaW5zdGFsbCh0aGlzKTsKLQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9Mzg1OAotCQkJCS8vIHN0aWxsIG5lZWQgc2V0IGRvY3VtZW50IG9uIHRoZSByZWNvbmNpbGVyIChzdHJhdGVnaWVzKQotCQkJCSgoU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvcikgZlJlY29uY2lsZXIpLnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotCQkJfQotCQl9Ci0KLQkJSUNvbnRlbnRBc3Npc3RhbnQgbmV3QXNzaXN0YW50ID0gY29uZmlndXJhdGlvbi5nZXRDb250ZW50QXNzaXN0YW50KHRoaXMpOwotCQlpZiAobmV3QXNzaXN0YW50ICE9IGZDb250ZW50QXNzaXN0YW50IHx8IG5ld0Fzc2lzdGFudCA9PSBudWxsIHx8IGZDb250ZW50QXNzaXN0YW50ID09IG51bGwpIHsKLQkJCWlmIChmQ29udGVudEFzc2lzdGFudCAhPSBudWxsKQotCQkJCWZDb250ZW50QXNzaXN0YW50LnVuaW5zdGFsbCgpOwotCi0JCQlmQ29udGVudEFzc2lzdGFudCA9IG5ld0Fzc2lzdGFudDsKLQotCQkJaWYgKGZDb250ZW50QXNzaXN0YW50ICE9IG51bGwpIHsKLQkJCQlmQ29udGVudEFzc2lzdGFudC5pbnN0YWxsKHRoaXMpOwotCQkJCWZDb250ZW50QXNzaXN0YW50SW5zdGFsbGVkID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIDI0ODAzNgotCQkJCS8vIGRpc2FibGUgdGhlIGNvbnRlbnQgYXNzaXN0IG9wZXJhdGlvbiBpZiBubyBjb250ZW50Ci0JCQkJLy8gYXNzaXN0YW50Ci0JCQkJZW5hYmxlT3BlcmF0aW9uKENPTlRFTlRBU1NJU1RfUFJPUE9TQUxTLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ29udGVudEZvcm1hdHRlciA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29udGVudEZvcm1hdHRlcih0aGlzKTsKLQotCQkvLyBkbyBub3QgdW5pbnN0YWxsIG9sZCBpbmZvcm1hdGlvbiBwcmVzZW50ZXIgaWYgaXQncyB0aGUgc2FtZQotCQlJSW5mb3JtYXRpb25QcmVzZW50ZXIgbmV3SW5mb3JtYXRpb25QcmVzZW50ZXIgPSBjb25maWd1cmF0aW9uLmdldEluZm9ybWF0aW9uUHJlc2VudGVyKHRoaXMpOwotCQlpZiAobmV3SW5mb3JtYXRpb25QcmVzZW50ZXIgPT0gbnVsbCB8fCBmSW5mb3JtYXRpb25QcmVzZW50ZXIgPT0gbnVsbCB8fCAhKG5ld0luZm9ybWF0aW9uUHJlc2VudGVyLmVxdWFscyhmSW5mb3JtYXRpb25QcmVzZW50ZXIpKSkgewotCQkJaWYgKGZJbmZvcm1hdGlvblByZXNlbnRlciAhPSBudWxsKQotCQkJCWZJbmZvcm1hdGlvblByZXNlbnRlci51bmluc3RhbGwoKTsKLQkJCWZJbmZvcm1hdGlvblByZXNlbnRlciA9IG5ld0luZm9ybWF0aW9uUHJlc2VudGVyOwotCQkJaWYgKGZJbmZvcm1hdGlvblByZXNlbnRlciAhPSBudWxsKQotCQkJCWZJbmZvcm1hdGlvblByZXNlbnRlci5pbnN0YWxsKHRoaXMpOwotCQl9Ci0KLQkJLy8gZGlzY29ubmVjdCBmcm9tIHRoZSBvbGQgdW5kbyBtYW5hZ2VyIGJlZm9yZSBzZXR0aW5nIHRoZSBuZXcgb25lCi0JCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJZlVuZG9NYW5hZ2VyLmRpc2Nvbm5lY3QoKTsKLQkJfQotCQlzZXRVbmRvTWFuYWdlcihjb25maWd1cmF0aW9uLmdldFVuZG9NYW5hZ2VyKHRoaXMpKTsKLQotCQkvLyByZWxlYXNlIG9sZCBhbm5vdGF0aW9uIGhvdmVyIGJlZm9yZSBzZXR0aW5nIG5ldyBvbmUKLQkJaWYgKGZBbm5vdGF0aW9uSG92ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcikgewotCQkJKChTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcikgZkFubm90YXRpb25Ib3ZlcikucmVsZWFzZSgpOwotCQl9Ci0JCXNldEFubm90YXRpb25Ib3Zlcihjb25maWd1cmF0aW9uLmdldEFubm90YXRpb25Ib3Zlcih0aGlzKSk7Ci0KLQkJLy8gcmVsZWFzZSBvbGQgYW5ub3RhdGlvbiBob3ZlciBiZWZvcmUgc2V0dGluZyBuZXcgb25lCi0JCWlmIChmT3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSB7Ci0JCQkoKFN0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkhvdmVyKSBmT3ZlcnZpZXdSdWxlckFubm90YXRpb25Ib3ZlcikucmVsZWFzZSgpOwotCQl9Ci0JCXNldE92ZXJ2aWV3UnVsZXJBbm5vdGF0aW9uSG92ZXIoY29uZmlndXJhdGlvbi5nZXRBbm5vdGF0aW9uSG92ZXIodGhpcykpOwotCi0JCWdldFRleHRXaWRnZXQoKS5zZXRUYWJzKGNvbmZpZ3VyYXRpb24uZ2V0VGFiV2lkdGgodGhpcykpOwotCQlzZXRIb3ZlckNvbnRyb2xDcmVhdG9yKGNvbmZpZ3VyYXRpb24uZ2V0SW5mb3JtYXRpb25Db250cm9sQ3JlYXRvcih0aGlzKSk7Ci0KLQkJLy8gaWYgaHlwZXJsaW5rIG1hbmFnZXIgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCB1bmluc3RhbGwgaXQKLQkJaWYgKGZIeXBlcmxpbmtNYW5hZ2VyICE9IG51bGwpIHsKLQkJCXNldEh5cGVybGlua0RldGVjdG9ycyhudWxsLCBTV1QuTk9ORSk7Ci0JCX0KLQkJc2V0SHlwZXJsaW5rUHJlc2VudGVyKGNvbmZpZ3VyYXRpb24uZ2V0SHlwZXJsaW5rUHJlc2VudGVyKHRoaXMpKTsKLQkJSUh5cGVybGlua0RldGVjdG9yW10gaHlwZXJsaW5rRGV0ZWN0b3JzID0gY29uZmlndXJhdGlvbi5nZXRIeXBlcmxpbmtEZXRlY3RvcnModGhpcyk7Ci0JCWludCBldmVudFN0YXRlTWFzayA9IGNvbmZpZ3VyYXRpb24uZ2V0SHlwZXJsaW5rU3RhdGVNYXNrKHRoaXMpOwotCQlzZXRIeXBlcmxpbmtEZXRlY3RvcnMoaHlwZXJsaW5rRGV0ZWN0b3JzLCBldmVudFN0YXRlTWFzayk7Ci0KLQkJLy8gaW5zdGFsbCBjb250ZW50IHR5cGUgc3BlY2lmaWMgcGx1Z2lucwotCQlTdHJpbmdbXSB0eXBlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyh0aGlzKTsKLQotCQkvLyBjbGVhciBhdXRvaW5kZW50L2F1dG9lZGl0IHN0cmF0ZWdpZXMKLQkJZkF1dG9JbmRlbnRTdHJhdGVnaWVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJU3RyaW5nIHQgPSB0eXBlc1tpXTsKLQkJCXNldEF1dG9FZGl0U3RyYXRlZ2llcyhjb25maWd1cmF0aW9uLmdldEF1dG9FZGl0U3RyYXRlZ2llcyh0aGlzLCB0KSwgdCk7Ci0JCQlzZXRUZXh0RG91YmxlQ2xpY2tTdHJhdGVneShjb25maWd1cmF0aW9uLmdldERvdWJsZUNsaWNrU3RyYXRlZ3kodGhpcywgdCksIHQpOwotCi0JCQlpbnRbXSBzdGF0ZU1hc2tzID0gY29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkVGV4dEhvdmVyU3RhdGVNYXNrcyh0aGlzLCB0KTsKLQkJCWlmIChzdGF0ZU1hc2tzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHN0YXRlTWFza3MubGVuZ3RoOyBqKyspIHsKLQkJCQkJaW50IHN0YXRlTWFzayA9IHN0YXRlTWFza3Nbal07Ci0JCQkJCXNldFRleHRIb3Zlcihjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcih0aGlzLCB0LCBzdGF0ZU1hc2spLCB0LCBzdGF0ZU1hc2spOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldFRleHRIb3Zlcihjb25maWd1cmF0aW9uLmdldFRleHRIb3Zlcih0aGlzLCB0KSwgdCwgSVRleHRWaWV3ZXJFeHRlbnNpb24yLkRFRkFVTFRfSE9WRVJfU1RBVEVfTUFTSyk7Ci0JCQl9Ci0KLQkJCVN0cmluZ1tdIHByZWZpeGVzID0gY29uZmlndXJhdGlvbi5nZXRJbmRlbnRQcmVmaXhlcyh0aGlzLCB0KTsKLQkJCWlmIChwcmVmaXhlcyAhPSBudWxsICYmIHByZWZpeGVzLmxlbmd0aCA+IDApCi0JCQkJc2V0SW5kZW50UHJlZml4ZXMocHJlZml4ZXMsIHQpOwotCi0JCQlwcmVmaXhlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0RGVmYXVsdFByZWZpeGVzKHRoaXMsIHQpOwotCQkJaWYgKHByZWZpeGVzICE9IG51bGwgJiYgcHJlZml4ZXMubGVuZ3RoID4gMCkKLQkJCQlzZXREZWZhdWx0UHJlZml4ZXMocHJlZml4ZXMsIHQpOwotCi0JCQkvLyBhZGQgaGlnaGxpZ2h0ZXIvbGluZXN0eWxlcHJvdmlkZXIKLQkJCS8vIEJVRzEzOTc1MyAtIG9ubHkgY3JlYXRlIEhpZ2hsaWdodGVyIGlmIHdlIGhhdmUgYSB2YWxpZCBkb2N1bWVudAotCQkJaWYgKGNvbmZpZ3VyYXRpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gJiYgZ2V0RG9jdW1lbnQoKSBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9ICgoU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSBjb25maWd1cmF0aW9uKS5nZXRMaW5lU3R5bGVQcm92aWRlcnModGhpcywgdCk7Ci0JCQkJaWYgKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgcHJvdmlkZXJzLmxlbmd0aDsgKytqKSB7Ci0JCQkJCQkvLyBkZWxheSBjcmVhdGlvbiBvZiBoaWdobGlnaHRlciB0aWxsCi0JCQkJCQkvLyBsaW5lc3R5bGVwcm92aWRlciBuZWVkcyB0byBiZSBhZGRlZAotCQkJCQkJaWYgKGZIaWdobGlnaHRlciA9PSBudWxsKQotCQkJCQkJCWZIaWdobGlnaHRlciA9IG5ldyBIaWdobGlnaHRlcigpOwotCQkJCQkJZkhpZ2hsaWdodGVyLmFkZFByb3ZpZGVyKHQsIHByb3ZpZGVyc1tqXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbml0aWFsaXplIGhpZ2hsaWdodGVyIGFmdGVyIGxpbmVzdHlsZXByb3ZpZGVycyB3ZXJlIGFkZGVkCi0JCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZkhpZ2hsaWdodGVyLnNldERvY3VtZW50UGFydGl0aW9uaW5nKGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHRoaXMpKTsKLQkJCWZIaWdobGlnaHRlci5zZXREb2N1bWVudCgoSVN0cnVjdHVyZWREb2N1bWVudCkgZ2V0RG9jdW1lbnQoKSk7Ci0JCQlmSGlnaGxpZ2h0ZXIuaW5zdGFsbCh0aGlzKTsKLQkJfQotCi0JCWFjdGl2YXRlUGx1Z2lucygpOwotCi0JCWZDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKiBAcGFyYW0gZW5kT2Zmc2V0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWluc1JlYWRPbmx5KElEb2N1bWVudCBkb2N1bWVudCwgaW50IHN0YXJ0T2Zmc2V0LCBpbnQgZW5kT2Zmc2V0KSB7Ci0KLQkJaW50IHN0YXJ0ID0gc3RhcnRPZmZzZXQ7Ci0JCWludCBlbmQgPSBlbmRPZmZzZXQ7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCQl9Ci0JCWVsc2UgewotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgUHJvamVjdGlvbkRvY3VtZW50KSB7Ci0JCQkJSURvY3VtZW50IGRvYyA9ICgoUHJvamVjdGlvbkRvY3VtZW50KSBkb2N1bWVudCkuZ2V0TWFzdGVyRG9jdW1lbnQoKTsKLQkJCQlpZiAoZG9jIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZG9jOwotCQkJCQlpbnQgYWRqdXN0ID0gKChQcm9qZWN0aW9uRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRQcm9qZWN0aW9uTWFwcGluZygpLmdldENvdmVyYWdlKCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJCXN0YXJ0ID0gYWRqdXN0ICsgc3RhcnQ7Ci0JCQkJCWVuZCA9IGFkanVzdCArIGVuZDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZW5kIC0gc3RhcnQ7Ci0JCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkoc3RhcnQsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSURvY3VtZW50QWRhcHRlciBjcmVhdGVEb2N1bWVudEFkYXB0ZXIoKSB7Ci0KLQkJZkRvY0FkYXB0ZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50VG9UZXh0QWRhcHRlcihnZXRUZXh0V2lkZ2V0KCkpOwotCQlyZXR1cm4gZkRvY0FkYXB0ZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0T3BlcmF0aW9uVGFyZ2V0I2RvT3BlcmF0aW9uKGludCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb09wZXJhdGlvbihpbnQgb3BlcmF0aW9uKSB7Ci0KLQkJUG9pbnQgc2VsZWN0aW9uID0gZ2V0VGV4dFdpZGdldCgpLmdldFNlbGVjdGlvbigpOwotCQlpbnQgY3Vyc29yUG9zaXRpb24gPSBzZWxlY3Rpb24ueDsKLQkJaW50IHNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCXN3aXRjaCAob3BlcmF0aW9uKSB7Ci0JCQljYXNlIENVVCA6Ci0JCQkJYmVnaW5SZWNvcmRpbmcoVEVYVF9DVVQsIFRFWFRfQ1VULCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQlzdXBlci5kb09wZXJhdGlvbihvcGVyYXRpb24pOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBQQVNURSA6Ci0JCQkJYmVnaW5SZWNvcmRpbmcoVEVYVF9QQVNURSwgVEVYVF9QQVNURSwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJc3VwZXIuZG9PcGVyYXRpb24ob3BlcmF0aW9uKTsKLQkJCQlzZWxlY3Rpb24gPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJY3Vyc29yUG9zaXRpb24gPSBzZWxlY3Rpb24ueDsKLQkJCQlzZWxlY3Rpb25MZW5ndGggPSBzZWxlY3Rpb24ueSAtIHNlbGVjdGlvbi54OwotCQkJCWVuZFJlY29yZGluZyhjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgQ09OVEVOVEFTU0lTVF9QUk9QT1NBTFMgOgotCQkJCS8vIG1heWJlIG5vdCBjb25maWd1cmVkPwotCQkJCWlmIChmQ29udGVudEFzc2lzdGFudCAhPSBudWxsICYmIGlzRWRpdGFibGUoKSkgewotCQkJCQkvLyBDTVZDIDI2MzI2OQotCQkJCQkvLyBuZWVkIGFuIGV4cGxpY2l0IGNoZWNrIGhlcmUgYmVjYXVzZSB0aGUKLQkJCQkJLy8gY29udGVudEFzc2lzdEFjdGlvbiBpcyBubyBsb25nZXIgYmVpbmcgdXBkYXRlZCBvbgotCQkJCQkvLyBjdXJzb3IKLQkJCQkJLy8gcG9zaXRpb24KLQkJCQkJaWYgKGNhbkRvT3BlcmF0aW9uKENPTlRFTlRBU1NJU1RfUFJPUE9TQUxTKSkgewotCQkJCQkJU3RyaW5nIGVyciA9IGZDb250ZW50QXNzaXN0YW50LnNob3dQb3NzaWJsZUNvbXBsZXRpb25zKCk7Ci0JCQkJCQlpZiAoZXJyICE9IG51bGwpIHsKLQkJCQkJCQkvLyBkb24ndCB3YW5uYSBiZWVwIGlmIHRoZXJlIGlzIG5vIGVycm9yCi0JCQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5kaXNwbGF5RXJyb3JNZXNzYWdlKGVycik7Ci0JCQkJCQl9Ci0JCQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJYmVlcCgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OIDoKLQkJCQlpZiAoZkNvbnRlbnRBc3Npc3RhbnQgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgZXJyID0gZkNvbnRlbnRBc3Npc3RhbnQuc2hvd0NvbnRleHRJbmZvcm1hdGlvbigpOwotCQkJCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyKTsKLQkJCQkJUGxhdGZvcm1TdGF0dXNMaW5lVXRpbC5hZGRPbmVUaW1lQ2xlYXJMaXN0ZW5lcigpOwotCQkJCQkvLyBzZXRFcnJvck1lc3NhZ2UoZXJyKTsKLQkJCQkJLy8gbmV3IE9uZVRpbWVMaXN0ZW5lcihnZXRUZXh0V2lkZ2V0KCksIG5ldwotCQkJCQkvLyBDbGVhckVycm9yTWVzc2FnZSgpKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFFVSUNLX0ZJWCA6Ci0JCQkJaWYgKGlzRWRpdGFibGUoKSAmJiBmQ29ycmVjdGlvbkFzc2lzdGFudCAhPSBudWxsICYmIGZDb3JyZWN0aW9uQXNzaXN0YW50SW5zdGFsbGVkKSB7Ci0JCQkJCVN0cmluZyBtc2cgPSBmQ29ycmVjdGlvbkFzc2lzdGFudC5zaG93UG9zc2libGVDb21wbGV0aW9ucygpOwotCQkJCQlzZXRFcnJvck1lc3NhZ2UobXNnKTsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNISUZUX1JJR0hUIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX1NISUZUX1JJR0hULCBURVhUX1NISUZUX1JJR0hULCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJCQl1cGRhdGVJbmRlbnRhdGlvblByZWZpeGVzKCk7Ci0JCQkJc3VwZXIuZG9PcGVyYXRpb24oU0hJRlRfUklHSFQpOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBTSElGVF9MRUZUIDoKLQkJCQliZWdpblJlY29yZGluZyhURVhUX1NISUZUX0xFRlQsIFRFWFRfU0hJRlRfTEVGVCwgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCQkJdXBkYXRlSW5kZW50YXRpb25QcmVmaXhlcygpOwotCQkJCXN1cGVyLmRvT3BlcmF0aW9uKFNISUZUX0xFRlQpOwotCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQljdXJzb3JQb3NpdGlvbiA9IHNlbGVjdGlvbi54OwotCQkJCXNlbGVjdGlvbkxlbmd0aCA9IHNlbGVjdGlvbi55IC0gc2VsZWN0aW9uLng7Ci0JCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBGT1JNQVRfRE9DVU1FTlQgOgotCQkJCXRyeSB7Ci0JCQkJCS8vIGJlZ2luIHJlY29yZGluZwotCQkJCQliZWdpblJlY29yZGluZyhGT1JNQVRfRE9DVU1FTlRfVEVYVCwgRk9STUFUX0RPQ1VNRU5UX1RFWFQsIGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCi0JCQkJCS8vIGZvcm1hdAotCQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGdldE1vZGVsQ292ZXJhZ2UoKTsKLQkJCQkJaWYgKGZDb250ZW50Rm9ybWF0dGVyIGluc3RhbmNlb2YgSUNvbnRlbnRGb3JtYXR0ZXJFeHRlbnNpb24pIHsKLQkJCQkJCUlDb250ZW50Rm9ybWF0dGVyRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IChJQ29udGVudEZvcm1hdHRlckV4dGVuc2lvbikgZkNvbnRlbnRGb3JtYXR0ZXI7Ci0JCQkJCQlJRm9ybWF0dGluZ0NvbnRleHQgY29udGV4dCA9IG5ldyBGb3JtYXR0aW5nQ29udGV4dCgpOwotCQkJCQkJY29udGV4dC5zZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9ET0NVTUVOVCwgQm9vbGVhbi5UUlVFKTsKLQkJCQkJCWNvbnRleHQuc2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfUkVHSU9OLCByZWdpb24pOwotCQkJCQkJZXh0ZW5zaW9uLmZvcm1hdChnZXREb2N1bWVudCgpLCBjb250ZXh0KTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWZDb250ZW50Rm9ybWF0dGVyLmZvcm1hdChnZXREb2N1bWVudCgpLCByZWdpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJY3Vyc29yUG9zaXRpb24gPSBzZWxlY3Rpb24ueDsKLQkJCQkJc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA6Ci0JCQkJdHJ5IHsKLQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCWJlZ2luUmVjb3JkaW5nKEZPUk1BVF9BQ1RJVkVfRUxFTUVOVFNfVEVYVCwgRk9STUFUX0FDVElWRV9FTEVNRU5UU19URVhULCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQotCQkJCQkvLyBmb3JtYXQKLQkJCQkJUG9pbnQgcyA9IGdldFNlbGVjdGVkUmFuZ2UoKTsKLQkJCQkJSVJlZ2lvbiByZWdpb24gPSBuZXcgUmVnaW9uKHMueCwgcy55KTsKLQkJCQkJZkNvbnRlbnRGb3JtYXR0ZXIuZm9ybWF0KGdldERvY3VtZW50KCksIHJlZ2lvbik7Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQkvLyBlbmQgcmVjb3JkaW5nCi0JCQkJCXNlbGVjdGlvbiA9IGdldFRleHRXaWRnZXQoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJY3Vyc29yUG9zaXRpb24gPSBzZWxlY3Rpb24ueDsKLQkJCQkJc2VsZWN0aW9uTGVuZ3RoID0gc2VsZWN0aW9uLnkgLSBzZWxlY3Rpb24ueDsKLQkJCQkJZW5kUmVjb3JkaW5nKGN1cnNvclBvc2l0aW9uLCBzZWxlY3Rpb25MZW5ndGgpOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCXN1cGVyLmRvT3BlcmF0aW9uKG9wZXJhdGlvbik7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kUmVjb3JkaW5nKGludCBjdXJzb3JQb3NpdGlvbiwgaW50IHNlbGVjdGlvbkxlbmd0aCkgewotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvYzsKLQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVuZG9NYW5hZ2VyID0gc3RydWN0dXJlZERvY3VtZW50LmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQl1bmRvTWFuYWdlci5lbmRSZWNvcmRpbmcodGhpcywgY3Vyc29yUG9zaXRpb24sIHNlbGVjdGlvbkxlbmd0aCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUT0RPOiBob3cgdG8gaGFuZGxlIG90aGVyIGRvY3VtZW50IHR5cGVzPwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKFN0cmluZyBsYWJlbCwgU3RyaW5nIGRlc2NyaXB0aW9uLCBpbnQgY3Vyc29yUG9zaXRpb24sIGludCBzZWxlY3Rpb25MZW5ndGgpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2M7Ci0JCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bmRvTWFuYWdlciA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRVbmRvTWFuYWdlcigpOwotCQkJdW5kb01hbmFnZXIuYmVnaW5SZWNvcmRpbmcodGhpcywgbGFiZWwsIGRlc2NyaXB0aW9uLCBjdXJzb3JQb3NpdGlvbiwgc2VsZWN0aW9uTGVuZ3RoKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFRPRE86IGhvdyB0byBoYW5kbGUgb3RoZXIgZG9jdW1lbnQgdHlwZXM/Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlbmRCYWNrZ3JvdW5kVXBkYXRlKCkgewotCQlmQmFja2dyb3VuZHVwZGF0ZUluUHJvZ3Jlc3MgPSBmYWxzZTsKLQkJZW5hYmxlZFJlZHJhd2luZygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoKSB7Ci0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dFZpZXdlcjo6aGFuZGxlRGlzcG9zZSBlbnRyeSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkvLyBiZWZvcmUgd2UgZGlzcG9zZSwgd2Ugc2V0IGEgc3BlY2lhbCAiZW1wdHkiIHNlbGVjdGlvbiwgdG8gcHJldmVudAotCQkvLyB0aGUgImxlYWsgb25lIGRvY3VtZW50IiB0aGF0Ci0JCS8vIG90aGVyd2lzZSBvY2N1cnMgd2hlbiBlZGl0b3IgY2xvc2VkIChzaW5jZSBsYXN0IHNlbGVjdGlvbiBzdGF5cyBpbgotCQkvLyBTZWxlY3RlZFJlc291cmNlTWFuYWdlci4KLQkJLy8gdGhlIG9jY3VyYW5jZSBvZiB0aGUgImxlYWsiIGlzbid0IHNvIGJhZCwgYnV0IG1ha2VzIGRlYnVnZ2luZyBvdGhlcgotCQkvLyBsZWFrcyB2ZXJ5IGhhcmQuCi0JCXNldFNlbGVjdGlvbihUZXh0U2VsZWN0aW9uLmVtcHR5U2VsZWN0aW9uKCkpOwotCi0JCWlmIChmSGlnaGxpZ2h0ZXIgIT0gbnVsbCkgewotCQkJZkhpZ2hsaWdodGVyLnVuaW5zdGFsbCgpOwotCQkJZkhpZ2hsaWdodGVyID0gbnVsbDsKLQkJfQotCQlzdXBlci5oYW5kbGVEaXNwb3NlKCk7Ci0KLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0Vmlld2VyOjpoYW5kbGVEaXNwb3NlIGV4aXQiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JLyoKLQkgKiBPdmVycmlkZGVuIGZvciBzcGVjaWFsIHN1cHBvcnQgb2YgYmFja2dyb3VuZCB1cGRhdGUgYW5kIHJlYWQtb25seQotCSAqIHJlZ2lvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVWZXJpZnlFdmVudChWZXJpZnlFdmVudCBlKSB7Ci0JCUlSZWdpb24gbW9kZWxSYW5nZSA9IGV2ZW50Mk1vZGVsUmFuZ2UoZSk7Ci0JCWlmIChleHBvc2VNb2RlbFJhbmdlKG1vZGVsUmFuZ2UpKSB7Ci0JCQllLmRvaXQgPSBmYWxzZTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChmRXZlbnRDb25zdW1lciAhPSBudWxsKSB7Ci0JCQlmRXZlbnRDb25zdW1lci5wcm9jZXNzRXZlbnQoZSk7Ci0JCQlpZiAoIWUuZG9pdCkKLQkJCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGZCYWNrZ3JvdW5kdXBkYXRlSW5Qcm9ncmVzcykgewotCQkJZS5kb2l0ID0gZmFsc2U7Ci0JCQliZWVwKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJLy8gZm9yIHJlYWQtb25seSBzdXBwb3J0Ci0JCWlmIChjb250YWluc1JlYWRPbmx5KGdldFZpc2libGVEb2N1bWVudCgpLCBlLnN0YXJ0LCBlLmVuZCkpIHsKLQkJCWUuZG9pdCA9IGZhbHNlOwotCQkJYmVlcCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXN1cGVyLmhhbmRsZVZlcmlmeUV2ZW50KGUpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24geCkgewotCQkJLy8gbm90ZSwgd2UgY2F0Y2ggYW5kIGxvZyBhbnkgZXhjZXB0aW9uLAotCQkJLy8gc2luY2UgYW4gb3RoZXJ3aXNlIGNhbiBhY3R1YWxseSBwcmV2ZW50IHR5cGluZyEKLQkJCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTExMzE4Ci0KLQkJCWlmIChUUkFDRV9FWENFUFRJT05TKQotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIlN0cnVjdHVyZWRUZXh0Vmlld2VyLmV4Y2VwdGlvbi52ZXJpZnlUZXh0IiwgeCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0JfQotCi0JcHVibGljIGludCBtb2RlbExpbmUyV2lkZ2V0TGluZShpbnQgbW9kZWxMaW5lKSB7Ci0JCS8qKgotCQkgKiBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIGEgd29ya2Fyb3VuZCBmb3IgQnVnIDg1NzA5Ci0JCSAqLwotCQlpZiAoZkluZm9ybWF0aW9uTWFwcGluZyA9PSBudWxsKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQl0cnkgewotCQkJCQlJUmVnaW9uIG1vZGVsTGluZVJlZ2lvbiA9IGdldERvY3VtZW50KCkuZ2V0TGluZUluZm9ybWF0aW9uKG1vZGVsTGluZSk7Ci0JCQkJCUlSZWdpb24gcmVnaW9uID0gZ2V0TW9kZWxDb3ZlcmFnZSgpOwotCQkJCQlpZiAobW9kZWxMaW5lUmVnaW9uICE9IG51bGwgJiYgcmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWludCBtb2RlbEVuZCA9IG1vZGVsTGluZVJlZ2lvbi5nZXRPZmZzZXQoKSArIG1vZGVsTGluZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJCWludCByZWdpb25FbmQgPSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkvLyByZXR1cm5zIC0xIGlmIG1vZGVsTGluZSBpcyBpbnZhbGlkCi0JCQkJCQlpZiAoKG1vZGVsTGluZVJlZ2lvbi5nZXRPZmZzZXQoKSA8IHJlZ2lvbi5nZXRPZmZzZXQoKSkgfHwgKG1vZGVsRW5kID4gcmVnaW9uRW5kKSkKLQkJCQkJCQlyZXR1cm4gLTE7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gcmV0dXJucyAtMSBpZiBtb2RlbExpbmUgaXMgaW52YWxpZAotCQkJCQlyZXR1cm4gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5tb2RlbExpbmUyV2lkZ2V0TGluZShtb2RlbExpbmUpOwotCX0KLQotCXB1YmxpYyBpbnQgbW9kZWxPZmZzZXQyV2lkZ2V0T2Zmc2V0KGludCBtb2RlbE9mZnNldCkgewotCQkvKioKLQkJICogbmVlZCB0byBvdmVycmlkZSB0aGlzIG1ldGhvZCBhcyBhIHdvcmthcm91bmQgZm9yIEJ1ZyA4NTcwOQotCQkgKi8KLQkJaWYgKGZJbmZvcm1hdGlvbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBnZXRNb2RlbENvdmVyYWdlKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkvLyByZXR1cm5zIC0xIGlmIG1vZGVsT2Zmc2V0IGlzIGludmFsaWQKLQkJCQlpZiAobW9kZWxPZmZzZXQgPCByZWdpb24uZ2V0T2Zmc2V0KCkgfHwgbW9kZWxPZmZzZXQgPiAocmVnaW9uLmdldE9mZnNldCgpICsgcmVnaW9uLmdldExlbmd0aCgpKSkKLQkJCQkJcmV0dXJuIC0xOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5tb2RlbE9mZnNldDJXaWRnZXRPZmZzZXQobW9kZWxPZmZzZXQpOwotCX0KLQotCXB1YmxpYyBJUmVnaW9uIG1vZGVsUmFuZ2UyV2lkZ2V0UmFuZ2UoSVJlZ2lvbiBtb2RlbFJhbmdlKSB7Ci0JCS8vIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBtZXRob2QgYXMgd29ya2Fyb3VuZCBmb3IgQnVnODU3MDkKLQkJaWYgKGZJbmZvcm1hdGlvbk1hcHBpbmcgPT0gbnVsbCkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBnZXRNb2RlbENvdmVyYWdlKCk7Ci0JCQlpZiAocmVnaW9uICE9IG51bGwgJiYgbW9kZWxSYW5nZSAhPSBudWxsKSB7Ci0JCQkJaW50IG1vZGVsRW5kID0gbW9kZWxSYW5nZS5nZXRPZmZzZXQoKSArIG1vZGVsUmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0JCQkJaW50IHJlZ2lvbkVuZCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkvLyByZXR1cm5zIG51bGwgaWYgbW9kZWxSYW5nZSBpcyBpbnZhbGlkCi0JCQkJaWYgKChtb2RlbFJhbmdlLmdldE9mZnNldCgpIDwgcmVnaW9uLmdldE9mZnNldCgpKSB8fCAobW9kZWxFbmQgPiByZWdpb25FbmQpKQotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwZXIubW9kZWxSYW5nZTJXaWRnZXRSYW5nZShtb2RlbFJhbmdlKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBjb3JyZWN0aW9uIGFzc2lzdGFudCBmb3IgdGhlIHZpZXdlci4gVGhpcyBtZXRob2QgaXMgdGVtcG9yYXJ5Ci0JICogd29ya2Fyb3VuZCB1bnRpbCB0aGUgYmFzZSBhZGRzIGEgZ2VuZXJpYyB3YXkgdG8gYWRkCi0JICogcXVpY2tmaXgvcXVpY2thc3Npc3QuCi0JICogCi0JICogQHBhcmFtIGNvcnJlY3Rpb25Bc3Npc3RhbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb3JyZWN0aW9uQXNzaXN0YW50KElDb250ZW50QXNzaXN0YW50IGNvcnJlY3Rpb25Bc3Npc3RhbnQpIHsKLQkJLy8gY29ycmVjdGlvbiBhc3Npc3RhbnQKLQkJaWYgKGZDb3JyZWN0aW9uQXNzaXN0YW50ICE9IG51bGwpCi0JCQlmQ29ycmVjdGlvbkFzc2lzdGFudC51bmluc3RhbGwoKTsKLQkJZkNvcnJlY3Rpb25Bc3Npc3RhbnQgPSBjb3JyZWN0aW9uQXNzaXN0YW50OwotCQlpZiAoZkNvcnJlY3Rpb25Bc3Npc3RhbnQgIT0gbnVsbCkgewotCQkJLy8gY29uZmlndXJhdGlvbgotCQkJaWYgKGZDb3JyZWN0aW9uQXNzaXN0YW50IGluc3RhbmNlb2YgQ29udGVudEFzc2lzdGFudCkgewotCQkJCSgoQ29udGVudEFzc2lzdGFudCkgZkNvcnJlY3Rpb25Bc3Npc3RhbnQpLnNldERvY3VtZW50UGFydGl0aW9uaW5nKGdldERvY3VtZW50UGFydGl0aW9uaW5nKCkpOwotCQkJfQotCi0JCQlmQ29ycmVjdGlvbkFzc2lzdGFudC5pbnN0YWxsKHRoaXMpOwotCQkJZkNvcnJlY3Rpb25Bc3Npc3RhbnRJbnN0YWxsZWQgPSB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gZGlzYWJsZSB0aGUgY29ycmVjdGlvbiBhc3Npc3Qgb3BlcmF0aW9uIGlmIG5vIGNvcnJlY3Rpb24KLQkJCS8vIGFzc2lzdGFudAotCQkJZW5hYmxlT3BlcmF0aW9uKFFVSUNLX0ZJWCwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyI3NldERvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbCwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCwgaW50IG1vZGVsUmFuZ2VPZmZzZXQsIGludCBtb2RlbFJhbmdlTGVuZ3RoKSB7Ci0JCS8vIHBhcnRpYWwgZml4IGZvcjoKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTE5NzAKLQkJLy8gd2hlbiBvdXIgZG9jdW1lbnQgaXMgc2V0LCBlc3BlY2lhbGx5IHRvIG51bGwgZHVyaW5nIGNsb3NlLAotCQkvLyBpbW1lZGlhdGVseSB1bmluc3RhbGwgdGhlIHJlY29uY2lsZXIuCi0JCS8vIHRoaXMgaXMgdG8gYXZvaWQgYW4gdW5uZWNlc3NhcnkgZmluYWwgInJlY29uY2lsZSIKLQkJLy8gdGhhdCBibG9ja3MgZGlzcGxheSB0aHJlYWQKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpIHsKLQkJCWlmIChmUmVjb25jaWxlciAhPSBudWxsKSB7Ci0JCQkJZlJlY29uY2lsZXIudW5pbnN0YWxsKCk7Ci0JCQl9Ci0JCX0KLQotCQlzdXBlci5zZXREb2N1bWVudChkb2N1bWVudCwgYW5ub3RhdGlvbk1vZGVsLCBtb2RlbFJhbmdlT2Zmc2V0LCBtb2RlbFJhbmdlTGVuZ3RoKTsKLQotCQlpZiAoZG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IChJU3RydWN0dXJlZERvY3VtZW50KSBkb2N1bWVudDsKLQotCQkJLy8gbm90aWZ5IGhpZ2hsaWdodGVyCi0JCQl1cGRhdGVIaWdobGlnaHRlcihzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCQkvLyBzZXQgZG9jdW1lbnQgaW4gdGhlIHZpZXdlci1iYXNlZCB1bmRvIG1hbmFnZXIKLQkJCWlmIChmVW5kb01hbmFnZXIgIT0gbnVsbCkgewotCQkJCWZVbmRvTWFuYWdlci5kaXNjb25uZWN0KCk7Ci0JCQkJZlVuZG9NYW5hZ2VyLmNvbm5lY3QodGhpcyk7Ci0JCQl9Ci0JCQkvLyBDYXJldEV2ZW50IGlzIG5vdCBzZW50IHRvIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgYWZ0ZXIgU2F2ZSBBcy4KLQkJCS8vIE5lZWQgdG8gbm90aWZ5IFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgaGVyZS4KLQkJCS8vIG5vdGlmeVZpZXdlclNlbGVjdGlvbk1hbmFnZXIoZ2V0U2VsZWN0ZWRSYW5nZSgpLngsCi0JCQkvLyBnZXRTZWxlY3RlZFJhbmdlKCkueSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2UgdGhlIGFjdGl2ZSBlZGl0b3IgdG8gc2V0IGEgc3RhdHVzIGxpbmUgbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtc2cKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCUlFZGl0b3JTdGF0dXNMaW5lIHN0YXR1c0xpbmUgPSAoSUVkaXRvclN0YXR1c0xpbmUpIGVkaXRvci5nZXRBZGFwdGVyKElFZGl0b3JTdGF0dXNMaW5lLmNsYXNzKTsKLQkJCQkJaWYgKHN0YXR1c0xpbmUgIT0gbnVsbCkKLQkJCQkJCXN0YXR1c0xpbmUuc2V0TWVzc2FnZSh0cnVlLCBtc2csIG51bGwpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFVuaW5zdGFsbHMgYW55dGhpbmcgdGhhdCB3YXMgaW5zdGFsbGVkIGJ5IGNvbmZpZ3VyZQotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKCkgewotCQlMb2dnZXIudHJhY2UoIlNvdXJjZSBFZGl0b3IiLCAiU3RydWN0dXJlZFRleHRWaWV3ZXI6OnVuY29uZmlndXJlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlpZiAoZkhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCWZIaWdobGlnaHRlci51bmluc3RhbGwoKTsKLQkJCWZIaWdobGlnaHRlciA9IG51bGw7Ci0JCX0KLQkJaWYgKGZDb3JyZWN0aW9uQXNzaXN0YW50ICE9IG51bGwpIHsKLQkJCWZDb3JyZWN0aW9uQXNzaXN0YW50LnVuaW5zdGFsbCgpOwotCQl9Ci0KLQkJaWYgKGZBbm5vdGF0aW9uSG92ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcikgewotCQkJKChTdHJ1Y3R1cmVkVGV4dEFubm90YXRpb25Ib3ZlcikgZkFubm90YXRpb25Ib3ZlcikucmVsZWFzZSgpOwotCQl9Ci0KLQkJaWYgKGZPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIHsKLQkJCSgoU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSG92ZXIpIGZPdmVydmlld1J1bGVyQW5ub3RhdGlvbkhvdmVyKS5yZWxlYXNlKCk7Ci0JCX0KLQotCQkvLyBkb2Vzbid0IHNlZW0gdG8gYmUgaGFuZGxlZCBlbHNld2hlcmUsIHNvIHdlJ2xsIGJlIHN1cmUgZXJyb3IKLQkJLy8gbWVzc2FnZXMncyBhcmUgY2xlYXJlZC4KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCXN1cGVyLnVuY29uZmlndXJlKCk7Ci0JCWZDb25maWd1cmF0aW9uID0gbnVsbDsKLQkJTG9nZ2VyLnRyYWNlKCJTb3VyY2UgRWRpdG9yIiwgIlN0cnVjdHVyZWRUZXh0Vmlld2VyOjp1bmNvbmZpZ3VyZSBleGl0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uSURvY3VtZW50U2VsZWN0aW9uTWVkaWF0b3IjdW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnVuZG8uVW5kb0RvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgdW5kb09wZXJhdGlvblNlbGVjdGlvbkNoYW5nZWQoVW5kb0RvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50LmdldFJlcXVlc3RlcigpICE9IG51bGwgJiYgZXZlbnQuZ2V0UmVxdWVzdGVyKCkuZXF1YWxzKHRoaXMpICYmIGV2ZW50LmdldERvY3VtZW50KCkuZXF1YWxzKGdldERvY3VtZW50KCkpKSB7Ci0JCQkvLyBCVUcxMDc2ODc6IFVuZG8vcmVkbyBkbyBub3Qgc2Nyb2xsIGVkaXRvcgotCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oZXZlbnQuZ2V0T2Zmc2V0KCksIGV2ZW50LmdldExlbmd0aCgpKTsKLQkJCXNldFNlbGVjdGlvbihzZWxlY3Rpb24sIHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUhpZ2hsaWdodGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJLy8gaWYgaGlnaGxpZ2h0ZXIgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LCBpbml0aWFsaXplIGFuZCBpbnN0YWxsIGl0Ci0JCWlmIChmSGlnaGxpZ2h0ZXIgPT0gbnVsbCAmJiBmQ29uZmlndXJhdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbikgewotCQkJU3RyaW5nW10gdHlwZXMgPSBmQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHRoaXMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewotCQkJCVN0cmluZyB0ID0gdHlwZXNbaV07Ci0KLQkJCQkvLyBhZGQgaGlnaGxpZ2h0ZXIvbGluZXN0eWxlcHJvdmlkZXIKLQkJCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9ICgoU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKSBmQ29uZmlndXJhdGlvbikuZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHRoaXMsIHQpOwotCQkJCWlmIChwcm92aWRlcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IHByb3ZpZGVycy5sZW5ndGg7ICsraikgewotCQkJCQkJLy8gZGVsYXkgY3JlYXRpb24gb2YgaGlnaGxpZ2h0ZXIgdGlsbAotCQkJCQkJLy8gbGluZXN0eWxlcHJvdmlkZXIgbmVlZHMgdG8gYmUgYWRkZWQKLQkJCQkJCS8vIGRvIG5vdCBjcmVhdGUgaGlnaGxpZ2h0ZXIgaWYgbm8gdmFsaWQgZG9jdW1lbnQKLQkJCQkJCWlmIChmSGlnaGxpZ2h0ZXIgPT0gbnVsbCkKLQkJCQkJCQlmSGlnaGxpZ2h0ZXIgPSBuZXcgSGlnaGxpZ2h0ZXIoKTsKLQkJCQkJCWZIaWdobGlnaHRlci5hZGRQcm92aWRlcih0LCBwcm92aWRlcnNbal0pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpbml0aWFsaXplIGhpZ2hsaWdodGVyIGFmdGVyIGxpbmVzdHlsZXByb3ZpZGVycyB3ZXJlIGFkZGVkCi0JCQlpZiAoZkhpZ2hsaWdodGVyICE9IG51bGwpIHsKLQkJCQlmSGlnaGxpZ2h0ZXIuc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoZkNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZERvY3VtZW50UGFydGl0aW9uaW5nKHRoaXMpKTsKLQkJCQlmSGlnaGxpZ2h0ZXIuaW5zdGFsbCh0aGlzKTsKLQkJCX0KLQkJfQotCQlpZiAoZkhpZ2hsaWdodGVyICE9IG51bGwpCi0JCQlmSGlnaGxpZ2h0ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIE1ha2Ugc3VyZSBpbmRlbnRhdGlvbiBpcyBjb3JyZWN0IGJlZm9yZSB1c2luZy4KLQkgKi8KLQlwcml2YXRlIHZvaWQgdXBkYXRlSW5kZW50YXRpb25QcmVmaXhlcygpIHsKLQkJU291cmNlVmlld2VyQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gZkNvbmZpZ3VyYXRpb247Ci0JCWlmIChmQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmdbXSB0eXBlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyh0aGlzKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlTdHJpbmdbXSBwcmVmaXhlcyA9IGNvbmZpZ3VyYXRpb24uZ2V0SW5kZW50UHJlZml4ZXModGhpcywgdHlwZXNbaV0pOwotCQkJCWlmIChwcmVmaXhlcyAhPSBudWxsICYmIHByZWZpeGVzLmxlbmd0aCA+IDApCi0JCQkJCXNldEluZGVudFByZWZpeGVzKHByZWZpeGVzLCB0eXBlc1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVGV4dERyb3BBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9UZXh0RHJvcEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2QxOTZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9UZXh0RHJvcEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRHJvcFRhcmdldEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotCi0vKioKLSAqIFRleHREcm9wQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0RHJvcEFjdGlvbiBleHRlbmRzIEFic3RyYWN0RHJvcEFjdGlvbiB7Ci0JcHVibGljIGJvb2xlYW4gcnVuKERyb3BUYXJnZXRFdmVudCBldmVudCwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCXJldHVybiBpbnNlcnQoKFN0cmluZykgZXZlbnQuZGF0YSwgdGFyZ2V0RWRpdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVHJhbnNmZXJCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVHJhbnNmZXJCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkMDg5ZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1RyYW5zZmVyQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbDsKLQotCi0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXJEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkRyb3BBY3Rpb25Qcm94eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogQnVpbGRzIGRyb3AgdGFyZ2V0IHRyYW5zZmVycywgZHJhZyBzb3VyY2UgdHJhbnNmZXJzLCBhbmQgZHJvcCBhY3Rpb25zCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2ZlckJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9NRVRIT0QgPSAibWV0aG9kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QUklPUklUWSA9ICJwcmlvcml0eSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0lOR0xFVE9OID0gInNpbmdsZXRvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVEFSR0VUX0lEID0gInRhcmdldElEIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9UUkFOU0ZFUl9JRCA9ICJ0cmFuc2ZlcklEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1RpbWUgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS90cmFuc2ZlcmJ1aWxkZXIvdGltZSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfRFJBR19TT1VSQ0VfVFJBTlNGRVJTID0gImRyYWdTb3VyY2VUcmFuc2ZlcnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfRFJPUF9UQVJHRVRfVFJBTlNGRVJTID0gImRyb3BUYXJnZXRUcmFuc2ZlcnMiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nW10gUFJJT1JJVElFUyA9IHsiaGlnaGVzdCIsICJoaWdoIiwgIm1pZCIsICJsb3ciLCAibG93ZXN0In07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RSQUdfU09VUkNFX0NPTlRSSUJVVElPTiA9ICJkcmFnU291cmNlQ29udHJpYnV0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19EUk9QX0FDVElPTiA9ICJkcm9wQWN0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19EUk9QX1RBUkdFVF9DT05UUklCVVRJT04gPSAiZHJvcFRhcmdldENvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19UUkFOU0ZFUiA9ICJ0cmFuc2ZlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgYm9vbGVhbiB1c2VQcm94eTsKLQotCWNsYXNzIFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcgZXh0ZW5kcyBUcmFuc2ZlciB7Ci0JICAgIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQ7Ci0JICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzQXR0cmlidXRlOwotCSAgICBwcml2YXRlIFRyYW5zZmVyIHByb3h5OwotICAgICAgICBwcml2YXRlIE1ldGhvZCBnZXRUeXBlSWRzTWV0aG9kLCBnZXRUeXBlTmFtZXNNZXRob2QsIGphdmFUb05hdGl2ZU1ldGhvZCwgbmF0aXZlVG9KYXZhTWV0aG9kOwotCi0JICAgIFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcoKSB7Ci0JICAgICAgICBzdXBlcigpOwotCSAgICB9Ci0KLQkgICAgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZyhJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxtLCBTdHJpbmcgY2xzQXR0cikgewotCSAgICAgICAgc3VwZXIoKTsKLQkgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsbTsKLQkgICAgICAgIHRoaXMuY2xhc3NBdHRyaWJ1dGUgPSBjbHNBdHRyOwotCSAgICB9Ci0JICAgIAotCSAgICBwcml2YXRlIFRyYW5zZmVyIG5ld0luc3RhbmNlKCkgewotCSAgICAgICAgaWYgKChlbGVtZW50ICE9IG51bGwpICYmIChjbGFzc0F0dHJpYnV0ZSAhPSBudWxsKSkgewotCQkgICAgICAgIE9iamVjdCBvID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFRyYW5zZmVyKSB7Ci0JCSAgICAgICAgICAgIGVsZW1lbnQgPSBudWxsOwotCQkgICAgICAgICAgICBjbGFzc0F0dHJpYnV0ZSA9IG51bGw7Ci0JCSAgICAgICAgICAgIHJldHVybiAoVHJhbnNmZXIpbzsKLQkJICAgICAgICB9Ci0JICAgICAgICB9Ci0JICAgICAgICByZXR1cm4gbnVsbDsKLQkgICAgfQotCi0JICAgIHB1YmxpYyBUcmFuc2ZlckRhdGFbXSBnZXRTdXBwb3J0ZWRUeXBlcygpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLQkgICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiBuZXcgVHJhbnNmZXJEYXRhWzBdOwotICAgICAgICB9Ci0gICAgICAgIHByb3RlY3RlZCBpbnRbXSBnZXRUeXBlSWRzKCkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChnZXRUeXBlSWRzTWV0aG9kID09IG51bGwpIHsKLSAgICAJICAgICAgICAgICAgQ2xhc3MgcnVudGltZUNsYXNzID0gcHJveHkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVudGltZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgCSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgIAkgICAgICAgICAgICAgICAgZ2V0VHlwZUlkc01ldGhvZCA9IHJ1bnRpbWVDbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgiZ2V0VHlwZUlkcyIsIG5ldyBDbGFzc1swXSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGVJZHNNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZ2V0VHlwZUlkc01ldGhvZCA9PSBudWxsKSAmJiAoZSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZ2V0VHlwZUlkc01ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlZCBJbnRlZ2VyW10gcmV0dXJuIHR5cGUgdG8gaW50W10KLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIHIgPSAoaW50W10pZ2V0VHlwZUlkc01ldGhvZC5pbnZva2UocHJveHksIG5ldyBPYmplY3RbMF0pOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChyICE9IG51bGwpICYmIChyLmxlbmd0aCA+IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50W10gcmV0ID0gbmV3IGludFtyLmxlbmd0aF07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IHIubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0W2ldID0gcltpXTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZTMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFR5cGVOYW1lcygpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoZ2V0VHlwZU5hbWVzTWV0aG9kID09IG51bGwpIHsKLSAgICAJICAgICAgICAgICAgQ2xhc3MgcnVudGltZUNsYXNzID0gcHJveHkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVudGltZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgCSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgIAkgICAgICAgICAgICAgICAgZ2V0VHlwZU5hbWVzTWV0aG9kID0gcnVudGltZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRUeXBlTmFtZXMiLCBuZXcgQ2xhc3NbMF0pOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUeXBlTmFtZXNNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlMSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBlMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZTIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2xhc3MgPSBydW50aW1lQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOwotICAgICAgICAJICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICgoZ2V0VHlwZU5hbWVzTWV0aG9kID09IG51bGwpICYmIChlICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChnZXRUeXBlTmFtZXNNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlnZXRUeXBlTmFtZXNNZXRob2QuaW52b2tlKHByb3h5LCBuZXcgT2JqZWN0WzBdKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMik7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZTMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZTMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCSAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0gICAgICAgIH0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRUeXBlKFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLQkgICAgICAgICAgICByZXR1cm4gcHJveHkuaXNTdXBwb3J0ZWRUeXBlKHRyYW5zZmVyRGF0YSk7Ci0JICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgamF2YVRvTmF0aXZlKE9iamVjdCBvYmplY3QsIFRyYW5zZmVyRGF0YSB0cmFuc2ZlckRhdGEpIHsKLQkgICAgICAgIGlmIChwcm94eSA9PSBudWxsKSB7Ci0JICAgICAgICAgICAgcHJveHkgPSBuZXdJbnN0YW5jZSgpOwotCSAgICAgICAgfQotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoamF2YVRvTmF0aXZlTWV0aG9kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3MgcnVudGltZUNsYXNzID0gcHJveHkuZ2V0Q2xhc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAocnVudGltZUNsYXNzICE9IG51bGwpIHsKLSAgICAgICAgCSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgIAkgICAgICAgICAgICAgICAgamF2YVRvTmF0aXZlTWV0aG9kID0gcnVudGltZUNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJqYXZhVG9OYXRpdmUiLCBuZXcgQ2xhc3NbXXtvYmplY3QuZ2V0Q2xhc3MoKSwgdHJhbnNmZXJEYXRhLmdldENsYXNzKCl9KTsvLyROT04tTkxTLTEkCi0gICAgICAgIAkgICAgICAgICAgICAgICAgamF2YVRvTmF0aXZlTWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZTEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0gZTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNsYXNzID0gcnVudGltZUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKLSAgICAgICAgCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKGphdmFUb05hdGl2ZU1ldGhvZCA9PSBudWxsKSAmJiAoZSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoamF2YVRvTmF0aXZlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUb05hdGl2ZU1ldGhvZC5pbnZva2UocHJveHksIG5ldyBPYmplY3RbXXtvYmplY3QsIHRyYW5zZmVyRGF0YX0pOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBuYXRpdmVUb0phdmEoVHJhbnNmZXJEYXRhIHRyYW5zZmVyRGF0YSkgewotCSAgICAgICAgaWYgKHByb3h5ID09IG51bGwpIHsKLQkgICAgICAgICAgICBwcm94eSA9IG5ld0luc3RhbmNlKCk7Ci0JICAgICAgICB9Ci0JICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChuYXRpdmVUb0phdmFNZXRob2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBDbGFzcyBydW50aW1lQ2xhc3MgPSBwcm94eS5nZXRDbGFzcygpOwotICAgICAgICAgICAgICAgICAgICBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChydW50aW1lQ2xhc3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVUb0phdmFNZXRob2QgPSBydW50aW1lQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoIm5hdGl2ZVRvSmF2YSIsIG5ldyBDbGFzc1tde3RyYW5zZmVyRGF0YS5nZXRDbGFzcygpfSk7Ly8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVRvSmF2YU1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9IGUxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBlMikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDbGFzcyA9IHJ1bnRpbWVDbGFzcy5nZXRTdXBlcmNsYXNzKCk7Ci0gICAgICAgIAkgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKChuYXRpdmVUb0phdmFNZXRob2QgPT0gbnVsbCkgJiYgKGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5hdGl2ZVRvSmF2YU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgCSAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlVG9KYXZhTWV0aG9kLmludm9rZShwcm94eSwgbmV3IE9iamVjdFtde3RyYW5zZmVyRGF0YX0pOwotICAgIAkgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUyKSB7Ci0gICAgICAgICAgICAgICAgICAgCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUyKTsKLSAgICAJICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlMykgewotICAgICAgICAgICAgICAgICAgIAkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMyk7Ci0gICAgCSAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCgpOwotICAgICAgICB9Ci0gICAgICAgIFRyYW5zZmVyIGdldFRyYW5zZmVyQ2xhc3MoKSB7Ci0JICAgICAgICBpZiAocHJveHkgPT0gbnVsbCkgewotCSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoKTsKLQkgICAgICAgIH0KLQkgICAgICAgIHJldHVybiBwcm94eTsKLSAgICAgICAgfQotCX0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIE9iamVjdCBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQotCQlPYmplY3Qgb2JqID0gbnVsbDsKLQotCQlTdHJpbmcgc2luZ2xldG9uID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1NJTkdMRVRPTik7Ci0JCVN0cmluZyBtZXRob2QgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTUVUSE9EKTsKLQkJaWYgKFRSVUUuZXF1YWxzSWdub3JlQ2FzZShzaW5nbGV0b24pICYmIG1ldGhvZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCVN0cmluZyBuYW1lID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQkJCUNsYXNzIGNscyA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCkubG9hZENsYXNzKG5hbWUpOwotCQkJCU1ldGhvZCBtdGQgPSBjbHMuZ2V0TWV0aG9kKG1ldGhvZCwgbmV3IENsYXNzW117fSk7Ci0KLQkJCQlvYmogPSBtdGQuaW52b2tlKG51bGwsIG51bGwpOwotCQkJfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2JqID0gbnVsbDsKLQkJCX0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0JCQkJb2JqID0gbnVsbDsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotCQkJCW9iaiA9IG51bGw7Ci0JCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQlvYmogPSBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJb2JqID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJfQotCi0JCXJldHVybiBvYmo7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gY2xhc3NBdHRyaWJ1dGUKLQkgKiBAcmV0dXJuIE9iamVjdAotCSAqIEB0aHJvd3MgQ29yZUV4Y2VwdGlvbgotCSAqLwotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUV4dGVuc2lvbihmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgZmluYWwgU3RyaW5nIGNsYXNzQXR0cmlidXRlKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFsxXTsKLQkJU3RyaW5nIHBsdWdpbklkID0gZWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCWlmIChidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCi0JfQotCi0JcHJvdGVjdGVkIExpc3QgY2FjaGU7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRDb250cmlidXRpb25UYWc7Ci0KLQlwcm90ZWN0ZWQgTGlzdCB0YXJnZXRJRHM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gSURyb3BBY3Rpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSURyb3BBY3Rpb24gY3JlYXRlRHJvcEFjdGlvbihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJb2JqID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIElEcm9wQWN0aW9uKSA/IChJRHJvcEFjdGlvbikgRHJvcEFjdGlvblByb3h5Lm5ld0luc3RhbmNlKG9iaikgOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSB0cmFuc2ZlcklkCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHJvdGVjdGVkIElEcm9wQWN0aW9uW10gY3JlYXRlRHJvcEFjdGlvbnMoU3RyaW5nIHRyYW5zZmVySWQpIHsKLQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElEcm9wQWN0aW9uWzBdOwotCi0JCWZpbmFsIGludCBudW0gPSBjYWNoZS5zaXplKCk7Ci0JCWlmIChudW0gPT0gMCkKLQkJCXJldHVybiBuZXcgSURyb3BBY3Rpb25bMF07Ci0KLQkJSURyb3BBY3Rpb25bXSBhcyA9IG5ldyBJRHJvcEFjdGlvbltudW1dOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgUFJJT1JJVElFUy5sZW5ndGg7IHArKykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCQlpZiAoIShUQUdfRFJPUF9BQ1RJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSkgfHwgISh0cmFuc2ZlcklkLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVFJBTlNGRVJfSUQpKSkpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKFBSSU9SSVRJRVNbcF0uZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUklPUklUWSkpIHx8IChwID09IDIgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1BSSU9SSVRZKSA9PSBudWxsKSkgewotCQkJCQlJRHJvcEFjdGlvbiBhID0gY3JlYXRlRHJvcEFjdGlvbihlbGVtZW50KTsKLQkJCQkJaWYgKGEgIT0gbnVsbCkgewotCQkJCQkJYXNbal0gPSBhOwotCQkJCQkJaisrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG51bSA9PSBqKQotCQkJcmV0dXJuIGFzOwotCi0JCUlEcm9wQWN0aW9uW10gYXMyID0gbmV3IElEcm9wQWN0aW9uW2pdOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGo7IGkrKykgewotCQkJYXMyW2ldID0gYXNbaV07Ci0JCX0KLQotCQlyZXR1cm4gYXMyOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBUcmFuc2ZlcgotCSAqLwotCXByb3RlY3RlZCBUcmFuc2ZlciBjcmVhdGVUcmFuc2ZlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCSAgICBPYmplY3Qgb2JqID0gbnVsbDsKLQkgICAgaWYgKHVzZVByb3h5KSB7Ci0JICAgICAgICBvYmogPSBuZXcgVHJhbnNmZXJQcm94eUZvckRlbGF5TG9hZGluZyhlbGVtZW50LCBBVFRfQ0xBU1MpOwotCSAgICB9IGVsc2UgewotCSAgICAgICAgb2JqID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JICAgIH0KLQkJaWYgKG9iaiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgVHJhbnNmZXIpID8gKFRyYW5zZmVyKSBvYmogOiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gVHJhbnNmZXJbXQotCSAqLwotCXByb3RlY3RlZCBUcmFuc2ZlcltdIGNyZWF0ZVRyYW5zZmVycygpIHsKLQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFRyYW5zZmVyWzBdOwotCi0JCWZpbmFsIGludCBudW0gPSBjYWNoZS5zaXplKCk7Ci0JCWlmIChudW0gPT0gMCkKLQkJCXJldHVybiBuZXcgVHJhbnNmZXJbMF07Ci0KLQkJVHJhbnNmZXJbXSB0cyA9IG5ldyBUcmFuc2ZlcltudW1dOwotCQlpbnQgaiA9IDA7Ci0JCWZvciAoaW50IHAgPSAwOyBwIDwgUFJJT1JJVElFUy5sZW5ndGg7IHArKykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBudW07IGkrKykgewotCQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCQlpZiAoIVRBR19UUkFOU0ZFUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJCQljb250aW51ZTsKLQotCQkJCWlmIChQUklPUklUSUVTW3BdLmVxdWFscyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFJJT1JJVFkpKSB8fCAocCA9PSAyICYmIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9QUklPUklUWSkgPT0gbnVsbCkpIHsKLQkJCQkJVHJhbnNmZXIgdCA9IGNyZWF0ZVRyYW5zZmVyKGVsZW1lbnQpOwotCQkJCQlpZiAodCAhPSBudWxsKSB7Ci0JCQkJCQl0c1tqXSA9IHQ7Ci0JCQkJCQlqKys7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAobnVtID09IGopCi0JCQlyZXR1cm4gdHM7Ci0KLQkJVHJhbnNmZXJbXSB0czIgPSBuZXcgVHJhbnNmZXJbal07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgajsgaSsrKSB7Ci0JCQl0czJbaV0gPSB0c1tpXTsKLQkJfQotCi0JCXJldHVybiB0czI7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0RHJhZ1NvdXJjZVRyYW5zZmVycyhTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmV0dXJuIGdldERyYWdTb3VyY2VUcmFuc2ZlcnMobmV3IFN0cmluZ1tde2VkaXRvcklkfSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkcwotCSAqIEByZXR1cm4gVHJhbnNmZXJbXQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlcltdIGdldERyYWdTb3VyY2VUcmFuc2ZlcnMoU3RyaW5nW10gZWRpdG9ySWRzKSB7Ci0JCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoZWRpdG9ySWRzLCBUQUdfRFJBR19TT1VSQ0VfQ09OVFJJQlVUSU9OLCBQTF9EUkFHX1NPVVJDRV9UUkFOU0ZFUlMpOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IGNyZWF0ZVRyYW5zZmVycygpOwotCQlpZiAoZGVidWdUaW1lKQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNnZXREcmFnU291cmNlVHJhbnNmZXJzKCIgKyBlZGl0b3JJZHMgKyAiKTogIiArIHRyYW5zZmVycy5sZW5ndGggKyAiIHRyYW5zZmVycyBjcmVhdGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQlyZXR1cm4gdHJhbnNmZXJzOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXREcm9wQWN0aW9ucyhTdHJpbmcgZWRpdG9ySWQsIFRyYW5zZmVyIHRyYW5zZmVyKSBmb3IgdGhlIHBlcmZvcm1hbmNlCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHBhcmFtIGNsYXNzTmFtZQotCSAqIEByZXR1cm4gSURyb3BBY3Rpb25bXQotCSAqLwotCXB1YmxpYyBJRHJvcEFjdGlvbltdIGdldERyb3BBY3Rpb25zKFN0cmluZyBlZGl0b3JJZCwgU3RyaW5nIHRyYW5zZmVyQ2xhc3NOYW1lKSB7Ci0JCXJldHVybiBnZXREcm9wQWN0aW9ucyhuZXcgU3RyaW5nW117ZWRpdG9ySWR9LCB0cmFuc2ZlckNsYXNzTmFtZSk7Ci0JfQotCQotCS8qKgotCSAqIEBwYXJhbSBlZGl0b3JJZAotCSAqIEBwYXJhbSBjbGFzcwotCSAqIEByZXR1cm4gSURyb3BBY3Rpb25bXQotCSAqLwotCXB1YmxpYyBJRHJvcEFjdGlvbltdIGdldERyb3BBY3Rpb25zKFN0cmluZyBlZGl0b3JJZCwgVHJhbnNmZXIgdHJhbnNmZXIpIHsKLQkJcmV0dXJuIGdldERyb3BBY3Rpb25zKG5ldyBTdHJpbmdbXXtlZGl0b3JJZH0sIHRyYW5zZmVyKTsKLQl9Ci0JLyoqCi0JICogQGRlcHJlY2F0ZWQgdXNlIGdldERyb3BBY3Rpb25zKFN0cmluZ1tdIGVkaXRvcklkcywgVHJhbnNmZXIgdHJhbnNmZXIpIGZvciB0aGUgcGVyZm9ybWFuY2UKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHVibGljIElEcm9wQWN0aW9uW10gZ2V0RHJvcEFjdGlvbnMoU3RyaW5nW10gZWRpdG9ySWRzLCBTdHJpbmcgdHJhbnNmZXJDbGFzc05hbWUpIHsKLQkJbG9uZyB0aW1lMCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQlyZWFkQ29udHJpYnV0aW9ucyhlZGl0b3JJZHMsIFRBR19EUk9QX1RBUkdFVF9DT05UUklCVVRJT04sIFBMX0RST1BfVEFSR0VUX1RSQU5TRkVSUyk7Ci0JCVN0cmluZyB0cmFuc2ZlcklkID0gZ2V0VHJhbnNmZXJJZE9mQ2xhc3NOYW1lKHRyYW5zZmVyQ2xhc3NOYW1lKTsKLQkJSURyb3BBY3Rpb25bXSBhY3Rpb25zID0gY3JlYXRlRHJvcEFjdGlvbnModHJhbnNmZXJJZCk7Ci0JCWlmIChkZWJ1Z1RpbWUpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiI2dldERyb3BBY3Rpb25zKCIgKyBlZGl0b3JJZHMgKyAiKTogIiArIGFjdGlvbnMubGVuZ3RoICsgIiBkcm9wIGFjdGlvbnMgY3JlYXRlZCBpbiAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZTApICsgIm1zIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJcmV0dXJuIGFjdGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHBhcmFtIGNsYXNzCi0JICogQHJldHVybiBJRHJvcEFjdGlvbltdCi0JICovCi0JcHVibGljIElEcm9wQWN0aW9uW10gZ2V0RHJvcEFjdGlvbnMoU3RyaW5nW10gZWRpdG9ySWRzLCBUcmFuc2ZlciB0cmFuc2ZlcikgewotCSAgICBTdHJpbmcgdHJhbnNmZXJDbGFzc05hbWU7Ci0JICAgIGlmICh0cmFuc2ZlciBpbnN0YW5jZW9mIFRyYW5zZmVyUHJveHlGb3JEZWxheUxvYWRpbmcpIHsKLQkgICAgICAgIHRyYW5zZmVyQ2xhc3NOYW1lID0gKChUcmFuc2ZlclByb3h5Rm9yRGVsYXlMb2FkaW5nKXRyYW5zZmVyKS5nZXRUcmFuc2ZlckNsYXNzKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JICAgIH0gZWxzZSB7Ci0JICAgICAgICB0cmFuc2ZlckNsYXNzTmFtZSA9IHRyYW5zZmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCSAgICB9Ci0JICAgIHJldHVybiBnZXREcm9wQWN0aW9ucyhlZGl0b3JJZHMsIHRyYW5zZmVyQ2xhc3NOYW1lKTsKLQl9Ci0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkCi0JICogQHJldHVybiBUcmFuc2ZlcltdCi0JICovCi0JcHVibGljIFRyYW5zZmVyW10gZ2V0RHJvcFRhcmdldFRyYW5zZmVycyhTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmV0dXJuIGdldERyb3BUYXJnZXRUcmFuc2ZlcnMobmV3IFN0cmluZ1tde2VkaXRvcklkfSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklkcwotCSAqIEByZXR1cm4gVHJhbnNmZXJbXQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlcltdIGdldERyb3BUYXJnZXRUcmFuc2ZlcnMoU3RyaW5nW10gZWRpdG9ySWRzKSB7Ci0JCWxvbmcgdGltZTAgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoZWRpdG9ySWRzLCBUQUdfRFJPUF9UQVJHRVRfQ09OVFJJQlVUSU9OLCBQTF9EUk9QX1RBUkdFVF9UUkFOU0ZFUlMpOwotCQlUcmFuc2ZlcltdIHRyYW5zZmVycyA9IGNyZWF0ZVRyYW5zZmVycygpOwotCQlpZiAoZGVidWdUaW1lKSB7Ci0JCQlTdHJpbmcgaWRsaXN0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChlZGl0b3JJZHMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWRpdG9ySWRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWlkbGlzdCArPSBlZGl0b3JJZHNbaV07Ci0JCQkJCWlmIChpIDwgZWRpdG9ySWRzLmxlbmd0aCAtIDEpCi0JCQkJCQlpZGxpc3QgKz0gIiwiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCQkJU3lzdGVtLm91dC5wcmludGxuKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiNnZXREcm9wVGFyZ2V0VHJhbnNmZXJzKCIgKyBpZGxpc3QgKyAiKTogIiArIHRyYW5zZmVycy5sZW5ndGggKyAiIHRyYW5zZmVycyBjcmVhdGVkIGluICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lMCkgKyAibXMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQl9Ci0JCXJldHVybiB0cmFuc2ZlcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFydCBJRCBhdHRyaWJ1dGUgdGhhdCBpcyBleHBlY3RlZCBpbiB0aGUKLQkgKiB0YXJnZXQgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldElEKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UQVJHRVRfSUQpOwotCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIj8/PyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY2xhc3NOYW1lCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRUcmFuc2ZlcklkT2ZDbGFzc05hbWUoU3RyaW5nIGNsYXNzTmFtZSkgewotCQlTdHJpbmcgaWQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBpbnQgbnVtID0gY2FjaGUuc2l6ZSgpOwotCQlpZiAoY2xhc3NOYW1lID09IG51bGwgfHwgY2FjaGUgPT0gbnVsbCB8fCBudW0gPT0gMCkKLQkJCXJldHVybiBpZDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJaWYgKG9iaiBpbnN0YW5jZW9mIElDb25maWd1cmF0aW9uRWxlbWVudCkgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gKElDb25maWd1cmF0aW9uRWxlbWVudCkgb2JqOwotCQkJCWlmIChjbGFzc05hbWUuZXF1YWxzKGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUykpKSB7Ci0JCQkJCWlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIChpZC5sZW5ndGgoKSAhPSAwID8gaWQgOiBjbGFzc05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdGFnCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nW10gaWRzLCBTdHJpbmcgdGFnLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJY2FjaGUgPSBudWxsOwotCQl0YXJnZXRJRHMgPSBBcnJheXMuYXNMaXN0KGlkcyk7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCVN0cmluZyBpZCA9IGdldFRhcmdldElEKGVsZW1lbnQpOwotCQkJaWYgKGlkID09IG51bGwgfHwgIXRhcmdldElEcy5jb250YWlucyhpZCkpIHsKLQkJCQkvLyBUaGlzIGlzIG5vdCBvZiBpbnRlcmVzdCB0byB1cyAtIGRvbid0IGdvIGRlZXBlcgotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX1RSQU5TRkVSKSkgewotCQkJaWYgKGNhY2hlID09IG51bGwpCi0JCQkJY2FjaGUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQljYWNoZS5hZGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgZWxlbWVudCAtIGRvbid0IGdvIGludG8gaXQKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19EUk9QX0FDVElPTikpIHsKLQkJCWlmIChjYWNoZSA9PSBudWxsKQotCQkJCWNhY2hlID0gbmV3IEFycmF5TGlzdCgpOwotCQkJLy9jYWNoZS5hZGQoY3JlYXRlQWN0aW9uRGVzY3JpcHRvcihlbGVtZW50KSk7Ci0JCQljYWNoZS5hZGQoZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsgLy8ganVzdCBjYWNoZSB0aGUgYWN0aW9uIC0gZG9uJ3QgZ28gaW50bwotCQl9IGVsc2UgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCS8qKgotCSAqIEBkZXByZWNhdGVkIC0gdXNlIFRyYW5zZmVyQnVpbGRlcihib29sZWFuIHVzZVByb3h5KSBmb3IgdGhlIHBlcmZvcm1hbmNlCi0JICovCi0JcHVibGljIFRyYW5zZmVyQnVpbGRlcigpIHsKLSAgICAgICAgdGhpcyhmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIFRyYW5zZmVyQnVpbGRlcihib29sZWFuIHVzZVByb3h5KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMudXNlUHJveHkgPSB1c2VQcm94eTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZDJmODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL1Vua25vd25Db250ZW50VHlwZURpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci0KLS8qKgotICogTWVzc2FnZSBkaWFsb2cgaW5mb3JtaW5nIHVzZXIgdGhhdCBhbiBlZGl0b3Igd2FzIG9wZW4gb24gdW5zdXBwb3J0ZWQKLSAqIGNvbnRlbnQgdHlwZQotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nIGV4dGVuZHMgTWVzc2FnZURpYWxvZ1dpdGhUb2dnbGUgewotCi0JcHVibGljIFVua25vd25Db250ZW50VHlwZURpYWxvZyhTaGVsbCBwYXJlbnQsIElQcmVmZXJlbmNlU3RvcmUgc3RvcmUsIFN0cmluZyBrZXkpIHsKLQkJLy8gc2V0IG1lc3NhZ2UgdG8gbnVsbCBpbiBzdXBlciBzbyB0aGF0IG1lc3NhZ2UgZG9lcyBub3QgYXBwZWFyIHR3aWNlCi0JCXN1cGVyKHBhcmVudCwgU1NFVUlNZXNzYWdlcy5Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMCwgbnVsbCwgbnVsbCwgSU5GT1JNQVRJT04sIG5ldyBTdHJpbmdbXXtJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMfSwgMCwgU1NFVUlNZXNzYWdlcy5Vbmtub3duQ29udGVudFR5cGVEaWFsb2dfMSwgZmFsc2UpOwotCQlzZXRQcmVmU3RvcmUoc3RvcmUpOwotCQlzZXRQcmVmS2V5KGtleSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0KLQkJLy8gb3ZlcndyaXR0ZW4gc28gdGhhdCB2YWx1ZSBzdG9yZWQgaXMgYm9vbGVhbiwgbm90IHN0cmluZwotCQlpZiAoYnV0dG9uSWQgIT0gSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQgJiYgZ2V0VG9nZ2xlU3RhdGUoKSAmJiBnZXRQcmVmU3RvcmUoKSAhPSBudWxsICYmIGdldFByZWZLZXkoKSAhPSBudWxsKSB7Ci0JCQlzd2l0Y2ggKGJ1dHRvbklkKSB7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19JRCA6Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLllFU19UT19BTExfSUQgOgotCQkJCWNhc2UgSURpYWxvZ0NvbnN0YW50cy5QUk9DRUVEX0lEIDoKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuT0tfSUQgOgotCQkJCQlnZXRQcmVmU3RvcmUoKS5zZXRWYWx1ZShnZXRQcmVmS2V5KCksIGZhbHNlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJRGlhbG9nQ29uc3RhbnRzLk5PX0lEIDoKLQkJCQljYXNlIElEaWFsb2dDb25zdGFudHMuTk9fVE9fQUxMX0lEIDoKLQkJCQkJZ2V0UHJlZlN0b3JlKCkuc2V0VmFsdWUoZ2V0UHJlZktleSgpLCB0cnVlKTsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJc3VwZXIuY3JlYXRlTWVzc2FnZUFyZWEoY29tcG9zaXRlKTsKLQkJTGluayBtZXNzYWdlTGluayA9IG5ldyBMaW5rKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQltZXNzYWdlTGluay5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVW5rbm93bkNvbnRlbnRUeXBlRGlhbG9nXzIpOwotCQltZXNzYWdlTGluay5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlsaW5rQ2xpY2tlZCgpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgbGlua0NsaWNrZWQoKSB7Ci0JCVN0cmluZyBwYWdlSWQgPSAib3JnLmVjbGlwc2UudWkucHJlZmVyZW5jZVBhZ2VzLkNvbnRlbnRUeXBlcyI7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZmVyZW5jZURpYWxvZyBkaWFsb2cgPSBQcmVmZXJlbmNlc1V0aWwuY3JlYXRlUHJlZmVyZW5jZURpYWxvZ09uKGdldFNoZWxsKCksIHBhZ2VJZCwgbmV3IFN0cmluZ1tde3BhZ2VJZH0sIG51bGwpOwotCQlkaWFsb2cub3BlbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzRlMzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkdyb3VwTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5BY3Rpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5UZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERUFjdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5SZXRhcmdldFRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Hb3RvQW5ub3RhdGlvbkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZENvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnVpLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGluc2lkZSBtdWx0aSBwYWdlIGVkaXRvcidzCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciwgc2luY2UgY2FzY2FkZWQgaW5pdCgpIGNhbGwgZnJvbSB0aGUKLSAqIEFjdGlvbkJhckNvbnRyaWJ1dG9yIHdpbGwgY2F1c2VzIGV4Y2VwdGlvbiBhbmQgaXQgbGVhZHMgdG8gbG9zZSB3aG9sZQotICogdG9vbGJhcnMuCi0gKiAKLSAqIEluc3RlYWQsIHVzZSBTb3VyY2VQYWdlQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yIG9mCi0gKiBtdWx0aSBwYWdlIGVkaXRvci4KLSAqIAotICogTm90ZSB0aGF0IHRoaXMgY2xhc3MgaXMgc3RpbGwgdmFsaWQgZm9yIHNpbmdsZSBwYWdlIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQWN0aW9uQ29udHJpYnV0b3IgZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IsIElFeHRlbmRlZENvbnRyaWJ1dG9yIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgYm9vbGVhbiBfc2hvd0RlYnVnU3RhdHVzID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvYWN0aW9uY29udHJpYnV0b3IvZGVidWdzdGF0dXNmaWVsZHMiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRURJVE9SX0lEUyA9IHsib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgSUV4dGVuZGVkQ29udHJpYnV0b3IgZXh0ZW5kZWRDb250cmlidXRvcjsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZBZGRCbG9ja0NvbW1lbnQgPSBudWxsOwotCi0JcHJvdGVjdGVkIFNlcGFyYXRvciBmQ29tbWFuZHNTZXBhcmF0b3IgPSBudWxsOwotCi0JcHJpdmF0ZSBPZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbSBmRGVidWdTdGF0dXNPZmZzZXQgPSBudWxsOwotCXByb3RlY3RlZCBNZW51TWFuYWdlciBmRXhwYW5kU2VsZWN0aW9uVG9NZW51ID0gbnVsbDsKLQlwcm90ZWN0ZWQgR3JvdXBNYXJrZXIgZk1lbnVBZGRpdGlvbnNHcm91cE1hcmtlciA9IG51bGw7Ci0JcHJvdGVjdGVkIEdvdG9Bbm5vdGF0aW9uQWN0aW9uIGZOZXh0QW5ub3RhdGlvbiA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgR290b0Fubm90YXRpb25BY3Rpb24gZlByZXZpb3VzQW5ub3RhdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmUmVtb3ZlQmxvY2tDb21tZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uIGZTaGlmdExlZnQgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlNoaWZ0UmlnaHQgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ0FjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmU3RydWN0dXJlU2VsZWN0UHJldmlvdXNBY3Rpb24gPSBudWxsOwotCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmVG9nZ2xlQ29tbWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbjsKLQlwcm90ZWN0ZWQgR3JvdXBNYXJrZXIgZlRvb2xiYXJBZGRpdGlvbnNHcm91cE1hcmtlciA9IG51bGw7Ci0JcHJvdGVjdGVkIFNlcGFyYXRvciBmVG9vbGJhclNlcGFyYXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgQWN0aW9uQ29udHJpYnV0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJUmVzb3VyY2VCdW5kbGUgcmVzb3VyY2VCdW5kbGUgPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCk7Ci0KLQkJZkNvbW1hbmRzU2VwYXJhdG9yID0gbmV3IFNlcGFyYXRvcigpOwotCi0JCS8vIGVkaXQgY29tbWFuZHMKLQkJZlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ0FjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfRU5DTE9TSU5HICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuRE9UKTsKLQkJZlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ0FjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5TVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORyk7Ci0KLQkJZlN0cnVjdHVyZVNlbGVjdE5leHRBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX05FWFQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQlmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5TVFJVQ1RVUkVfU0VMRUNUX05FWFQpOwotCi0JCWZTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c0FjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfUFJFVklPVVMgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQlmU3RydWN0dXJlU2VsZWN0UHJldmlvdXNBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUyk7Ci0KLQkJZlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlBY3Rpb24gPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0hJU1RPUlkgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQlmU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5TVFJVQ1RVUkVfU0VMRUNUX0hJU1RPUlkpOwotCi0JCWZFeHBhbmRTZWxlY3Rpb25Ub01lbnUgPSBuZXcgTWVudU1hbmFnZXIoU1NFVUlNZXNzYWdlcy5FeHBhbmRTZWxlY3Rpb25Ub01lbnVfbGFiZWwpOyAvLyROT04tTkxTLTEkCi0JCWZFeHBhbmRTZWxlY3Rpb25Ub01lbnUuYWRkKGZTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdBY3Rpb24pOwotCQlmRXhwYW5kU2VsZWN0aW9uVG9NZW51LmFkZChmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbik7Ci0JCWZFeHBhbmRTZWxlY3Rpb25Ub01lbnUuYWRkKGZTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c0FjdGlvbik7Ci0JCWZFeHBhbmRTZWxlY3Rpb25Ub01lbnUuYWRkKGZTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uKTsKLQotCQkvLyBzb3VyY2UgY29tbWFuZHMKLQkJZlNoaWZ0UmlnaHQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TSElGVF9SSUdIVCArIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkRPVCk7Ci0JCWZTaGlmdFJpZ2h0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuU0hJRlRfUklHSFQpOwotCi0JCWZTaGlmdExlZnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TSElGVF9MRUZUICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuRE9UKTsKLQkJZlNoaWZ0TGVmdC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoSVRleHRFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLlNISUZUX0xFRlQpOwotCi0JCWZUb2dnbGVDb21tZW50ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfVE9HR0xFX0NPTU1FTlQgKyBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5ET1QpOwotCQlmVG9nZ2xlQ29tbWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfQ09NTUVOVCk7Ci0KLQkJZkFkZEJsb2NrQ29tbWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0FERF9CTE9DS19DT01NRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuRE9UKTsKLQkJZkFkZEJsb2NrQ29tbWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5BRERfQkxPQ0tfQ09NTUVOVCk7Ci0KLQkJZlJlbW92ZUJsb2NrQ29tbWVudCA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1JFTU9WRV9CTE9DS19DT01NRU5UICsgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuRE9UKTsKLQkJZlJlbW92ZUJsb2NrQ29tbWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5SRU1PVkVfQkxPQ0tfQ09NTUVOVCk7Ci0KLQkJLy8gZ290byBwcmV2L25leHQgZXJyb3IKLQkJLy8gQ01WQyAyNDkwMTcgZm9yIEphdmFFZGl0b3IgY29uc2lzdGFuY3kKLQkJZlByZXZpb3VzQW5ub3RhdGlvbiA9IG5ldyBHb3RvQW5ub3RhdGlvbkFjdGlvbigiUHJldmlvdXNfYW5ub3RhdGlvbiIsIGZhbHNlKTsgLy8kTk9OLU5MUy0xJAotCQlmUHJldmlvdXNBbm5vdGF0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UudWkubmF2aWdhdGUucHJldmlvdXMiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZOZXh0QW5ub3RhdGlvbiA9IG5ldyBHb3RvQW5ub3RhdGlvbkFjdGlvbigiTmV4dF9hbm5vdGF0aW9uIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZk5leHRBbm5vdGF0aW9uLnNldEFjdGlvbkRlZmluaXRpb25JZCgib3JnLmVjbGlwc2UudWkubmF2aWdhdGUubmV4dCIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gUmVhZCBhY3Rpb24gZXh0ZW5zaW9ucy4KLQkJRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyKCk7Ci0JCWV4dGVuZGVkQ29udHJpYnV0b3IgPSBidWlsZGVyLnJlYWRBY3Rpb25FeHRlbnNpb25zKGdldEV4dGVuc2lvbklEcygpKTsKLQotCQlmTWVudUFkZGl0aW9uc0dyb3VwTWFya2VyID0gbmV3IEdyb3VwTWFya2VyKFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkdST1VQX05BTUVfTUVOVV9BRERJVElPTlMpOwotCQlmVG9vbGJhclNlcGFyYXRvciA9IG5ldyBTZXBhcmF0b3IoKTsKLQkJZlRvb2xiYXJBZGRpdGlvbnNHcm91cE1hcmtlciA9IG5ldyBHcm91cE1hcmtlcihTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5HUk9VUF9OQU1FX1RPT0xCQVJfQURESVRJT05TKTsKLQotCQlmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICJFZGl0b3IuVG9nZ2xlSW5zZXJ0TW9kZS4iLCBJQWN0aW9uLkFTX0NIRUNLX0JPWCk7IC8vJE5PTi1OTFMtMSQKLQkJZlRvZ2dsZUluc2VydE1vZGVBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5UT0dHTEVfSU5TRVJUX01PREUpOwotCi0JCWlmIChfc2hvd0RlYnVnU3RhdHVzKSB7Ci0JCQlmRGVidWdTdGF0dXNPZmZzZXQgPSBuZXcgT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0oU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU1RBVFVTX0NBVEVHT1JZX09GRlNFVCwgdHJ1ZSwgMjApOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCS8vIGVkaXQgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIGVkaXRNZW51ID0gbWVudS5maW5kTWVudVVzaW5nUGF0aChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCk7Ci0JCWlmIChlZGl0TWVudSAhPSBudWxsKSB7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbik7Ci0JCQllZGl0TWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCWVkaXRNZW51LmFkZChmRXhwYW5kU2VsZWN0aW9uVG9NZW51KTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZNZW51QWRkaXRpb25zR3JvdXBNYXJrZXIpOwotCQl9Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCVN0cmluZyBzb3VyY2VNZW51TGFiZWwgPSBTU0VVSU1lc3NhZ2VzLlNvdXJjZU1lbnVfbGFiZWw7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHNvdXJjZU1lbnVJZCA9ICJzb3VyY2VNZW51SWQiOyAvLyBUaGlzIGlzIGp1c3QgYSBtZW51IGlkLiBObyAvLyROT04tTkxTLTEkCi0JCS8vIG5lZWQgdG8gdHJhbnNsYXRlLgotCQkvLyAvLyROT04tTkxTLTEkCi0JCUlNZW51TWFuYWdlciBzb3VyY2VNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKHNvdXJjZU1lbnVMYWJlbCwgc291cmNlTWVudUlkKTsKLQkJbWVudS5pbnNlcnRBZnRlcihJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk1fRURJVCwgc291cmNlTWVudSk7Ci0JCWlmIChzb3VyY2VNZW51ICE9IG51bGwpIHsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQlzb3VyY2VNZW51LmFkZChmVG9nZ2xlQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmQWRkQmxvY2tDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZSZW1vdmVCbG9ja0NvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0UmlnaHQpOwotCQkJc291cmNlTWVudS5hZGQoZlNoaWZ0TGVmdCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCQkvLyBhZGQgbm90aGluZwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvU3RhdHVzTGluZShJU3RhdHVzTGluZU1hbmFnZXIgbWFuYWdlcikgewotCQlpZiAoX3Nob3dEZWJ1Z1N0YXR1cykgewotCQkJbWFuYWdlci5hZGQoZkRlYnVnU3RhdHVzT2Zmc2V0KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvVG9vbEJhcihJVG9vbEJhck1hbmFnZXIgdG9vbEJhck1hbmFnZXIpIHsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGZUb29sYmFyU2VwYXJhdG9yKTsKLQkJdG9vbEJhck1hbmFnZXIuYWRkKGZUb29sYmFyQWRkaXRpb25zR3JvdXBNYXJrZXIpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9NZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb01lbnUobWVudSk7Ci0KLQkJYWRkVG9NZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb24uSVBvcHVwTWVudUNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1BvcHVwTWVudShvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIgbWVudSkgewotCi0JCWFkZFRvUG9wdXBNZW51KG1lbnUpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1N0YXR1c0xpbmUob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJYWRkVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvU3RhdHVzTGluZShtYW5hZ2VyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb250cmlidXRlVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCQlzdXBlci5jb250cmlidXRlVG9Ub29sQmFyKHRvb2xCYXJNYW5hZ2VyKTsKLQotCQlhZGRUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gbmVlZCB0byBjYWxsIHNldEFjdGl2ZUVkaXRvciBiZWZvcmUgc3VwZXIuZGlzcG9zZSBiZWNhdXNlIGluIGJvdGgKLQkJLy8gc2V0QWN0aXZlRWRpdG9yICYgc3VwZXIuc2V0QWN0aXZlRWRpdG9yIGlmIGdldEVkaXRvclBhcnQgPT0KLQkJLy8gYWN0aXZlRWRpdG9yLAotCQkvLyB0aGUgbWV0aG9kIGlzIGp1c3QgcmV0dXJuZWQuIHNvIHRvIGdldCBib3RoIG1ldGhvZHMgdG8gcnVuLAotCQkvLyBzZXRBY3RpdmVFZGl0b3IKLQkJLy8gbmVlZHMgdG8gYmUgY2FsbGVkIHNvIHRoYXQgaXQgY29ycmVjdGx5IGNhbGxzIHN1cGVyLnNldEFjdGl2ZUVkaXRvcgotCQlzZXRBY3RpdmVFZGl0b3IobnVsbCk7Ci0KLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yOwotCQlpZiAodGV4dEVkaXRvciA9PSBudWxsICYmIGVkaXRvciAhPSBudWxsKQotCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQlyZXR1cm4gdGV4dEVkaXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNpbml0KG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzLAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2UpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uQmFycyBiYXJzLCBJV29ya2JlbmNoUGFnZSBwYWdlKSB7Ci0JCXN1cGVyLmluaXQoYmFycywgcGFnZSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGdldEFjdGl2ZUVkaXRvclBhcnQoKSA9PSBhY3RpdmVFZGl0b3IpCi0JCQlyZXR1cm47Ci0JCXN1cGVyLnNldEFjdGl2ZUVkaXRvcihhY3RpdmVFZGl0b3IpOwotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkcy5HT1RPX05FWFRfQU5OT1RBVElPTiwgZk5leHRBbm5vdGF0aW9uKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuR09UT19QUkVWSU9VU19BTk5PVEFUSU9OLCBmUHJldmlvdXNBbm5vdGF0aW9uKTsKLQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihBY3Rpb25GYWN0b3J5LlBSRVZJT1VTLmdldElkKCksIGZQcmV2aW91c0Fubm90YXRpb24pOwotCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKEFjdGlvbkZhY3RvcnkuTkVYVC5nZXRJZCgpLCBmTmV4dEFubm90YXRpb24pOwotCi0JCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJYWN0aW9uQmFycy5zZXRHbG9iYWxBY3Rpb25IYW5kbGVyKElERUFjdGlvbkZhY3RvcnkuQUREX1RBU0suZ2V0SWQoKSwgZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElERUFjdGlvbkZhY3RvcnkuQUREX1RBU0suZ2V0SWQoKSkpOwotCQkJCWFjdGlvbkJhcnMuc2V0R2xvYmFsQWN0aW9uSGFuZGxlcihJREVBY3Rpb25GYWN0b3J5LkJPT0tNQVJLLmdldElkKCksIGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJREVBY3Rpb25GYWN0b3J5LkJPT0tNQVJLLmdldElkKCkpKTsKLQkJCX0KLQkJfQotCi0JCWZTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORykpOwotCQlmU3RydWN0dXJlU2VsZWN0TmV4dEFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfTkVYVCkpOwotCQlmU3RydWN0dXJlU2VsZWN0UHJldmlvdXNBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX1BSRVZJT1VTKSk7Ci0JCWZTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9ISVNUT1JZKSk7Ci0KLQkJZlNoaWZ0UmlnaHQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBJVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5TSElGVF9SSUdIVCkpOwotCQlmU2hpZnRMZWZ0LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU0hJRlRfTEVGVCkpOwotCi0JCWZUb2dnbGVDb21tZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfVE9HR0xFX0NPTU1FTlQpKTsKLQkJZkFkZEJsb2NrQ29tbWVudC5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIFN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLkFDVElPTl9OQU1FX0FERF9CTE9DS19DT01NRU5UKSk7Ci0JCWZSZW1vdmVCbG9ja0NvbW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9SRU1PVkVfQkxPQ0tfQ09NTUVOVCkpOwotCi0JCS8vIGdvIHRvIHByZXYvbmV4dCBlcnJvcgotCQkvLyBDTVZDIDI0OTAxNyBmb3IgSmF2YUVkaXRvciBjb25zaXN0YW5jeQotCQlmUHJldmlvdXNBbm5vdGF0aW9uLnNldEVkaXRvcih0ZXh0RWRpdG9yKTsKLQkJZk5leHRBbm5vdGF0aW9uLnNldEVkaXRvcih0ZXh0RWRpdG9yKTsKLQotCQlmVG9nZ2xlSW5zZXJ0TW9kZUFjdGlvbi5zZXRBY3Rpb24oZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlRPR0dMRV9JTlNFUlRfTU9ERSkpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpIHsKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCX0KLQotCQlpZiAoX3Nob3dEZWJ1Z1N0YXR1cyAmJiB0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24pIHsKLQkJCSgoSVRleHRFZGl0b3JFeHRlbnNpb24pIHRleHRFZGl0b3IpLnNldFN0YXR1c0ZpZWxkKGZEZWJ1Z1N0YXR1c09mZnNldCwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuU1RBVFVTX0NBVEVHT1JZX09GRlNFVCk7Ci0JCQlmRGVidWdTdGF0dXNPZmZzZXQuc2V0QWN0aXZlRWRpdG9yKHRleHRFZGl0b3IpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciNzZXRWaWV3ZXJTcGVjaWZpY0NvbnRyaWJ1dGlvbnNFbmFibGVkKGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJZlNoaWZ0UmlnaHQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlNoaWZ0TGVmdC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmTmV4dEFubm90YXRpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlByZXZpb3VzQW5ub3RhdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0JCS8qCi0JCSAqIGZDb21tZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7IGZVbmNvbW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJICovCi0JCWZUb2dnbGVDb21tZW50LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZBZGRCbG9ja0NvbW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZlJlbW92ZUJsb2NrQ29tbWVudC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkvLyBjb252ZXJ0IGxpbmUgZGVsaW1pdGVycyBhcmUgbm90IHNvdXJjZSB2aWV3ZXItc3BlY2lmaWMKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9uLklFeHRlbmRlZENvbnRyaWJ1dG9yI3VwZGF0ZVRvb2xiYXJBY3Rpb25zKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCB1cGRhdGVUb29sYmFyQWN0aW9ucygpIHsKLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkgewotCQkJZXh0ZW5kZWRDb250cmlidXRvci51cGRhdGVUb29sYmFyQWN0aW9ucygpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uRGVmaW5pdGlvbklkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aW9uRGVmaW5pdGlvbklkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjZkYWUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkRlZmluaXRpb25JZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBkZWZpbml0aW9ucyBpZHMgZm9yIGVkaXRvciBhY3Rpb25zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIEFjdGlvbkRlZmluaXRpb25JZHMgewotCS8vVE9ETzogQ2FuIHRoZXNlIGJlIGJldHRlciBkZWZpbmVkIHdpdGggYSAicGx1Z2luIHByZWZpeCIgdG8gYmUgbW9yZSBwb3J0YWJsZT8gCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0JMT0NLX0NPTU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0xFQU5VUF9ET0NVTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNsZWFudXAuZG9jdW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVESVRfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5icmVha3BvaW50cy5lZGl0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRklORF9PQ0NVUlJFTkNFUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNlYXJjaC5maW5kLm9jY3VycmVuY2VzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmZvcm1hdC5hY3RpdmUuZWxlbWVudHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRfRE9DVU1FTlQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5mb3JtYXQuZG9jdW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkZPUk1BVElPTiA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNob3cuamF2YWRvYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BTkFHRV9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmJyZWFrcG9pbnRzLm1hbmFnZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE9QRU5fRklMRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLm9wZW4uZmlsZS5mcm9tLnNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFFVSUNLX0ZJWCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudGV4dC5qYXZhLmNvcnJlY3Rpb24uYXNzaXN0LnByb3Bvc2FscyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFJFTU9WRV9CTE9DS19DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkucmVtb3ZlLmJsb2NrLmNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QuZW5jbG9zaW5nIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9ISVNUT1JZID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5sYXN0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9ORVhUID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5uZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QucHJldmlvdXMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBUT0dHTEVfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRvZ2dsZS5jb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9HR0xFX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuYnJlYWtwb2ludHMudG9nZ2xlIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVU5DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudW5jb21tZW50IjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3RpdmVFZGl0b3JBY3Rpb25IYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3RpdmVFZGl0b3JBY3Rpb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTVkNjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvQWN0aXZlRWRpdG9yQWN0aW9uSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi0vKioKLSAqIEBkZXByZWNhdGVkIGFjdGlvbnMgYXJlIG5vdCBwcm9wZXJseSBhY3RpdmF0ZWQgd2l0aCB0aGlzIGhhbmRsZXIgc28gZG8gbm90Ci0gKiAgICAgICAgICAgICB1c2UKLSAqLwotcHVibGljIGNsYXNzIEFjdGl2ZUVkaXRvckFjdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBJQWN0aW9uIHsKLQotCXByaXZhdGUgU3RyaW5nIGZBY3Rpb25JZDsKLQlwcml2YXRlIElXb3JrYmVuY2hTaXRlIGZTaXRlOwotCXByaXZhdGUgSUFjdGlvbiBmVGFyZ2V0QWN0aW9uOwotCi0JcHVibGljIEFjdGl2ZUVkaXRvckFjdGlvbkhhbmRsZXIoSVdvcmtiZW5jaFNpdGUgc2l0ZSwgU3RyaW5nIGlkKSB7Ci0JCXN1cGVyKCk7Ci0JCWZBY3Rpb25JZCA9IGlkOwotCQlmU2l0ZSA9IHNpdGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0QWNjZWxlcmF0b3IoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0QWNjZWxlcmF0b3IoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0QWNjZWxlcmF0b3IoKSA6IDApOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0QWN0aW9uRGVmaW5pdGlvbklkKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFjdGlvbkRlZmluaXRpb25JZCgpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0RGVzY3JpcHRpb24oKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SGVscExpc3RlbmVyKCkKLQkgKi8KLQlwdWJsaWMgSGVscExpc3RlbmVyIGdldEhlbHBMaXN0ZW5lcigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRIZWxwTGlzdGVuZXIoKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoKSA6IG51bGwpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKSArIGhhc2hDb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRJbWFnZURlc2NyaXB0b3IoKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJcmV0dXJuIChmVGFyZ2V0QWN0aW9uICE9IG51bGwgPyBmVGFyZ2V0QWN0aW9uLmdldEltYWdlRGVzY3JpcHRvcigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRNZW51Q3JlYXRvcigpCi0JICovCi0JcHVibGljIElNZW51Q3JlYXRvciBnZXRNZW51Q3JlYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRTdHlsZSgpCi0JICovCi0JcHVibGljIGludCBnZXRTdHlsZSgpIHsKLQkJcmV0dXJuIElBY3Rpb24uQVNfUFVTSF9CVVRUT047Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uZ2V0VGV4dCgpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5nZXRUb29sVGlwVGV4dCgpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0NoZWNrZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hlY2tlZCgpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5pc0NoZWNrZWQoKSA6IHRydWUpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jaXNFbmFibGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCXVwZGF0ZVRhcmdldEFjdGlvbigpOwotCQlyZXR1cm4gKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCA/IGZUYXJnZXRBY3Rpb24uaXNFbmFibGVkKCkgOiBmYWxzZSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNpc0hhbmRsZWQoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSGFuZGxlZCgpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCXJldHVybiAoZlRhcmdldEFjdGlvbiAhPSBudWxsID8gZlRhcmdldEFjdGlvbi5pc0hhbmRsZWQoKSA6IGZhbHNlKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3JlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJdXBkYXRlVGFyZ2V0QWN0aW9uKCk7Ci0JCWlmIChmVGFyZ2V0QWN0aW9uICE9IG51bGwpCi0JCQlmVGFyZ2V0QWN0aW9uLnJ1bigpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuV2l0aEV2ZW50KG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bldpdGhFdmVudChFdmVudCBldmVudCkgewotCQl1cGRhdGVUYXJnZXRBY3Rpb24oKTsKLQkJaWYgKGZUYXJnZXRBY3Rpb24gIT0gbnVsbCkKLQkJCWZUYXJnZXRBY3Rpb24ucnVuV2l0aEV2ZW50KGV2ZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgU1VQUE9SVEVECi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRBY2NlbGVyYXRvcihpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWNjZWxlcmF0b3IoaW50IGtleWNvZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEFjdGlvbkRlZmluaXRpb25JZChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFjdGlvbkRlZmluaXRpb25JZChTdHJpbmcgaWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldENoZWNrZWQoYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGVzY3JpcHRpb24oamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgdGV4dCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RW5hYmxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRIZWxwTGlzdGVuZXIob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5IZWxwTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SGVscExpc3RlbmVyKEhlbHBMaXN0ZW5lciBsaXN0ZW5lcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SG92ZXJJbWFnZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEhvdmVySW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SWQoamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0TWVudUNyZWF0b3Iob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51Q3JlYXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNZW51Q3JlYXRvcihJTWVudUNyZWF0b3IgY3JlYXRvcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldFRvb2xUaXBUZXh0KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9vbFRpcFRleHQoU3RyaW5nIHRleHQpIHsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgdXBkYXRlVGFyZ2V0QWN0aW9uKCkgewotCQlpZiAoZlNpdGUgIT0gbnVsbCAmJiBmU2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKSAhPSBudWxsICYmIGZTaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKSAhPSBudWxsKSB7Ci0JCQlJRWRpdG9yUGFydCBwYXJ0ID0gZlNpdGUuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJSVRleHRFZGl0b3IgZWRpdG9yID0gbnVsbDsKLQkJCWlmIChwYXJ0IGluc3RhbmNlb2YgSVRleHRFZGl0b3IpCi0JCQkJZWRpdG9yID0gKElUZXh0RWRpdG9yKSBwYXJ0OwotCQkJZWxzZQotCQkJCWVkaXRvciA9IChJVGV4dEVkaXRvcikgKHBhcnQgIT0gbnVsbCA/IHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcykgOiBudWxsKTsKLQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCWZUYXJnZXRBY3Rpb24gPSBlZGl0b3IuZ2V0QWN0aW9uKGZBY3Rpb25JZCk7Ci0JCQl9IGVsc2UgewotCQkJCWZUYXJnZXRBY3Rpb24gPSBudWxsOwotCQkJfQotCQl9IGVsc2UKLQkJCWZUYXJnZXRBY3Rpb24gPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAxNTY2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlRleHRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2xlYW51cEFjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCXByb3RlY3RlZCBEaWFsb2cgZkNsZWFudXBEaWFsb2c7Ci0KLQlwdWJsaWMgQ2xlYW51cEFjdGlvbihSZXNvdXJjZUJ1bmRsZSBidW5kbGUsIFN0cmluZyBwcmVmaXgsIElUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgRGlhbG9nIGdldENsZWFudXBEaWFsb2coU2hlbGwgc2hlbGwpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IElTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBnZXRDbGVhbnVwUHJvY2Vzc29yKCk7Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChnZXRUZXh0RWRpdG9yKCkgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcikgewotCQkJZmluYWwgU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yID0gKFN0cnVjdHVyZWRUZXh0RWRpdG9yKSBnZXRUZXh0RWRpdG9yKCk7Ci0JCQlEaWFsb2cgY2xlYW51cERpYWxvZyA9IGdldENsZWFudXBEaWFsb2coZWRpdG9yLmdldFNpdGUoKS5nZXRTaGVsbCgpKTsKLQkJCWlmIChjbGVhbnVwRGlhbG9nICE9IG51bGwpIHsKLQkJCQlpZiAoY2xlYW51cERpYWxvZy5vcGVuKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQkJCS8vIHNldHVwIHJ1bm5hYmxlCi0JCQkJCVJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gZ2V0Q2xlYW51cFByb2Nlc3NvcigpOwotCQkJCQkJCWlmIChjbGVhbnVwUHJvY2Vzc29yICE9IG51bGwpCi0JCQkJCQkJCWNsZWFudXBQcm9jZXNzb3IuY2xlYW51cE1vZGVsKGVkaXRvci5nZXRNb2RlbCgpKTsKLQkJCQkJCX0KLQkJCQkJfTsKLQotCQkJCQkvLyBUT0RPOiBtYWtlIGluZGVwZW5kZW50IG9mICdtb2RlbCcuCi0JCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBlZGl0b3IuZ2V0TW9kZWwoKTsKLQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJLy8gYmVnaW4gcmVjb3JkaW5nCi0JCQkJCQkJSVRleHRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkJLy8gdGVsbCB0aGUgbW9kZWwgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gbWFrZSBhIGJpZwotCQkJCQkJCS8vIG1vZGVsIGNoYW5nZQotCQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJCQkJLy8gcnVuCi0JCQkJCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUoZWRpdG9yLmdldFRleHRWaWV3ZXIoKS5nZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCQl9IGZpbmFsbHkgewotCQkJCQkJCS8vIHRlbGwgdGhlIG1vZGVsIHRoYXQgd2UgYXJlIGRvbmUgd2l0aCB0aGUgYmlnCi0JCQkJCQkJLy8gbW9kZWwKLQkJCQkJCQkvLyBjaGFuZ2UKLQkJCQkJCQltb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQotCQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0Zvcm1hdEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9Gb3JtYXRBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjZjNjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL0Zvcm1hdEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk11bHRpU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmV4Y2VwdGlvbnMuTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Gb3JtYXRQcm9jZXNzb3JzRXh0ZW5zaW9uUmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgRm9ybWF0QWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIHsKLQotCWNsYXNzIEZvcm1hdEpvYiBleHRlbmRzIEpvYiB7Ci0KLQkJcHVibGljIEZvcm1hdEpvYihTdHJpbmcgbmFtZSkgewotCQkJc3VwZXIobmFtZSk7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGNvbnRhaW5lcgotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGludCBnZXRSZXNvdXJjZUNvdW50KElSZXNvdXJjZVtdIG1lbWJlcnMpIHsKLQkJCWludCBjb3VudCA9IDA7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChtZW1iZXJzW2ldIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBtZW1iZXJzW2ldOwotCQkJCQl0cnkgewotCQkJCQkJY291bnQgKz0gZ2V0UmVzb3VyY2VDb3VudChjb250YWluZXIubWVtYmVycygpKTsKLQkJCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBza2lwIGNvdW50aW5nCi0JCQkJCX0KLQkJCQl9IGVsc2UKLQkJCQkJY291bnQrKzsKLQkJCX0KLQotCQkJcmV0dXJuIGNvdW50OwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBlbGVtZW50cwotCQkgKiBAcmV0dXJuCi0JCSAqLwotCQlwcml2YXRlIGludCBnZXRSZXNvdXJjZUNvdW50KE9iamVjdFtdIGVsZW1lbnRzKSB7Ci0JCQlpbnQgY291bnQgPSAwOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKGVsZW1lbnRzW2ldIGluc3RhbmNlb2YgSUNvbnRhaW5lcikgewotCQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBlbGVtZW50c1tpXTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWNvdW50ICs9IGdldFJlc291cmNlQ291bnQoY29udGFpbmVyLm1lbWJlcnMoKSk7Ci0JCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJLy8gc2tpcCBjb3VudGluZwotCQkJCQl9Ci0JCQkJfSBlbHNlCi0JCQkJCWNvdW50Kys7Ci0JCQl9Ci0KLQkJCXJldHVybiBjb3VudDsKLQkJfQotCi0JCXByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQotCQkJT2JqZWN0W10gZWxlbWVudHMgPSBmU2VsZWN0aW9uLnRvQXJyYXkoKTsKLQkJCWludCByZXNvdXJjZUNvdW50ID0gZ2V0UmVzb3VyY2VDb3VudChlbGVtZW50cyk7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgcmVzb3VyY2VDb3VudCk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZWxlbWVudHNbaV0gaW5zdGFuY2VvZiBJUmVzb3VyY2UpIHsKLQkJCQkJcHJvY2Vzcyhtb25pdG9yLCAoSVJlc291cmNlKSBlbGVtZW50c1tpXSk7Ci0JCQkJCW1vbml0b3Iud29ya2VkKDEpOwotCQkJCX0KLQkJCX0KLQkJCW1vbml0b3IuZG9uZSgpOwotCi0JCQlpZiAoZkVycm9yU3RhdHVzLmdldENoaWxkcmVuKCkubGVuZ3RoID4gMCkgewotCQkJCXN0YXR1cyA9IGZFcnJvclN0YXR1czsKLQkJCQlmRXJyb3JTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMoU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfZXJyb3JTdGF0dXNNZXNzYWdlLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlyZXR1cm4gc3RhdHVzOwotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIE11bHRpU3RhdHVzIGZFcnJvclN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9lcnJvclN0YXR1c01lc3NhZ2UsIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJRmlsZSBmaWxlKSB7Ci0JCXRyeSB7Ci0JCQltb25pdG9yLndvcmtlZCgxKTsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gY29udGVudERlc2NyaXB0aW9uID0gZmlsZS5nZXRDb250ZW50RGVzY3JpcHRpb24oKTsKLQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IGNvbnRlbnREZXNjcmlwdGlvbi5nZXRDb250ZW50VHlwZSgpOwotCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gZ2V0Rm9ybWF0UHJvY2Vzc29yKGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkJaWYgKGZvcm1hdFByb2Nlc3NvciAhPSBudWxsICYmIChtb25pdG9yID09IG51bGwgfHwgIW1vbml0b3IuaXNDYW5jZWxlZCgpKSkgewotCQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV8zLCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCQltb25pdG9yLnN1YlRhc2sobWVzc2FnZSk7Ci0JCQkJZm9ybWF0UHJvY2Vzc29yLnNldFByb2dyZXNzTW9uaXRvcihtb25pdG9yKTsKLQkJCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0RmlsZShmaWxlKTsKLQkJCX0KLQkJfSBjYXRjaCAoTWFsZm9ybWVkSW5wdXRFeGNlcHRpb25XaXRoRGV0YWlsIGUpIHsKLQkJCVN0cmluZyBtZXNzYWdlID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV81LCBuZXcgU3RyaW5nW117ZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfSk7Ci0JCQlmRXJyb3JTdGF0dXMuYWRkKG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJSUZpbGUgZmlsZSA9IChJRmlsZSkgcmVzb3VyY2U7Ci0KLQkJCWlmIChtb25pdG9yID09IG51bGwgfHwgIW1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCWZvcm1hdChtb25pdG9yLCBmaWxlKTsKLQkJfSBlbHNlIGlmIChyZXNvdXJjZSBpbnN0YW5jZW9mIElDb250YWluZXIpIHsKLQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCi0JCQl0cnkgewotCQkJCUlSZXNvdXJjZVtdIG1lbWJlcnMgPSBjb250YWluZXIubWVtYmVycygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAobW9uaXRvciA9PSBudWxsIHx8ICFtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJCWZvcm1hdChtb25pdG9yLCBtZW1iZXJzW2ldKTsKLQkJCQl9Ci0JCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgbWVzc2FnZSA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuRm9ybWF0QWN0aW9uRGVsZWdhdGVfNCwgbmV3IFN0cmluZ1tde3Jlc291cmNlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKX0pOwotCQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcihTdHJpbmcgY29udGVudFR5cGVJZCkgewotCQlyZXR1cm4gRm9ybWF0UHJvY2Vzc29yc0V4dGVuc2lvblJlYWRlci5nZXRJbnN0YW5jZSgpLmdldEZvcm1hdFByb2Nlc3Nvcihjb250ZW50VHlwZUlkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSm9iIGdldEpvYigpIHsKLQkJcmV0dXJuIG5ldyBGb3JtYXRKb2IoU1NFVUlNZXNzYWdlcy5Gb3JtYXRBY3Rpb25EZWxlZ2F0ZV9qb2JOYW1lKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZSNwcm9jZXNzKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3MoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yLCBJUmVzb3VyY2UgcmVzb3VyY2UpIHsKLQkJZm9ybWF0KG1vbml0b3IsIHJlc291cmNlKTsKLQotCQl0cnkgewotCQkJcmVzb3VyY2UucmVmcmVzaExvY2FsKElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSwgbnVsbCk7Ci0JCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJU3RyaW5nIG1lc3NhZ2UgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLkZvcm1hdEFjdGlvbkRlbGVnYXRlXzQsIG5ldyBTdHJpbmdbXXtyZXNvdXJjZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCl9KTsKLQkJCWZFcnJvclN0YXR1cy5hZGQobmV3IFN0YXR1cyhJU3RhdHVzLkVSUk9SLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5FUlJPUiwgbWVzc2FnZSwgZSkpOwotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlJlc291cmNlQWN0aW9uRGVsZWdhdGUjcHJvY2Vzc29yQXZhaWxhYmxlKG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZSkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzb3JBdmFpbGFibGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChyZXNvdXJjZS5pc0FjY2Vzc2libGUoKSkgewotCQkJdHJ5IHsKLQkJCQlpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJRmlsZSkgewotCQkJCQlJRmlsZSBmaWxlID0gKElGaWxlKSByZXNvdXJjZTsKLQotCQkJCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBudWxsOwotCQkJCQlJQ29udGVudERlc2NyaXB0aW9uIGNvbnRlbnREZXNjcmlwdGlvbiA9IGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJCWlmIChjb250ZW50RGVzY3JpcHRpb24gIT0gbnVsbCkgewotCQkJCQkJSUNvbnRlbnRUeXBlIGNvbnRlbnRUeXBlID0gY29udGVudERlc2NyaXB0aW9uLmdldENvbnRlbnRUeXBlKCk7Ci0JCQkJCQlmb3JtYXRQcm9jZXNzb3IgPSBnZXRGb3JtYXRQcm9jZXNzb3IoY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKGZvcm1hdFByb2Nlc3NvciAhPSBudWxsKQotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAocmVzb3VyY2UgaW5zdGFuY2VvZiBJQ29udGFpbmVyKSB7Ci0JCQkJCUlDb250YWluZXIgY29udGFpbmVyID0gKElDb250YWluZXIpIHJlc291cmNlOwotCQkJCQlJUmVzb3VyY2VbXSBtZW1iZXJzOwotCQkJCQltZW1iZXJzID0gY29udGFpbmVyLm1lbWJlcnMoKTsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZW1iZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlib29sZWFuIGF2YWlsYWJsZSA9IHByb2Nlc3NvckF2YWlsYWJsZShtZW1iZXJzW2ldKTsKLQotCQkJCQkJaWYgKGF2YWlsYWJsZSkgewotCQkJCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2FjdGlvbnMvUmVzb3VyY2VBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTI2ODZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL1Jlc291cmNlQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci0KLXB1YmxpYyBjbGFzcyBSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLQotCXByb3RlY3RlZCBKb2IgZ2V0Sm9iKCkgewotCQkvLyBSZXNvdXJjZUFjdGlvbkRlbGVnYXRlIGRvZXMgbm90IGNyZWF0ZSBiYWNrZ3JvdW5kIGpvYgotCQkvLyBzdWJjbGFzcyBjcmVhdGVzIHRoZSBiYWNrZ3JvdW5kIGpvYiBmb3IgdGhlIGFjdGlvbgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBwcm9jZXNzb3JBdmFpbGFibGUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCS8vIFJlc291cmNlQWN0aW9uRGVsZWdhdGUgcmV0dXJucyBmYWxzZSBieSBkZWZhdWx0Ci0JCS8vIHN1YmNsYXNzIHJldHVybnMgdHJ1ZSBpZiBwcm9jZXNzb3IgaXMgYXZhaWxhYmxlOyBmYWxzZSBvdGhlcndpc2UKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3J1bihvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZTZWxlY3Rpb24gIT0gbnVsbCAmJiAhZlNlbGVjdGlvbi5pc0VtcHR5KCkpIHsKLQkJCUpvYiBqb2IgPSBnZXRKb2IoKTsKLQkJCWlmIChqb2IgIT0gbnVsbCkKLQkJCQlqb2Iuc2NoZWR1bGUoKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlI3NlbGVjdGlvbkNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlmU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlib29sZWFuIGF2YWlsYWJsZSA9IGZhbHNlOwotCi0JCQlPYmplY3RbXSBlbGVtZW50cyA9IGZTZWxlY3Rpb24udG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChlbGVtZW50c1tpXSBpbnN0YW5jZW9mIElSZXNvdXJjZSkgewotCQkJCQlhdmFpbGFibGUgPSBwcm9jZXNzb3JBdmFpbGFibGUoKElSZXNvdXJjZSkgZWxlbWVudHNbaV0pOwotCi0JCQkJCWlmIChhdmFpbGFibGUpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWFjdGlvbi5zZXRFbmFibGVkKGF2YWlsYWJsZSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL1N0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvYWN0aW9ucy9TdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDQxMWIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9hY3Rpb25zL1N0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0FERF9CTE9DS19DT01NRU5UID0gIkFkZEJsb2NrQ29tbWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0NMRUFOVVBfRE9DVU1FTlQgPSAiQ2xlYW51cERvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfQ09NTUVOVCA9ICJDb21tZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfQ09OVEVOVEFTU0lTVF9DT05URVhUX0lORk9STUFUSU9OID0gIkNvbnRlbnRBc3Npc3RDb250ZXh0SW5mb3JtYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUyA9ICJDb250ZW50QXNzaXN0UHJvcG9zYWxzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfRklORF9PQ0NVUlJFTkNFUyA9ICJGaW5kT2NjdXJyZW5jZXMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUyA9ICJGb3JtYXRBY3RpdmVFbGVtZW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0ZPUk1BVF9ET0NVTUVOVCA9ICJGb3JtYXREb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX0lORk9STUFUSU9OID0gIlNob3dUb29sdGlwRGVzYyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX01BTkFHRV9CUkVBS1BPSU5UUyA9ICJNYW5hZ2VCcmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX09QRU5fRklMRSA9ICJPcGVuRmlsZUZyb21Tb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9RVUlDS19GSVggPSAiUXVpY2tGaXgiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9SRU1PVkVfQkxPQ0tfQ09NTUVOVCA9ICJSZW1vdmVCbG9ja0NvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0VOQ0xPU0lORyA9ICJTdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmciOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9TVFJVQ1RVUkVfU0VMRUNUX0hJU1RPUlkgPSAiU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1NUUlVDVFVSRV9TRUxFQ1RfTkVYVCA9ICJTdHJ1Y3R1cmVTZWxlY3ROZXh0IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUNUSU9OX05BTUVfU1RSVUNUVVJFX1NFTEVDVF9QUkVWSU9VUyA9ICJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFDVElPTl9OQU1FX1RPR0dMRV9DT01NRU5UID0gIlRvZ2dsZUNvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBQ1RJT05fTkFNRV9VTkNPTU1FTlQgPSAiVW5jb21tZW50IjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBET1QgPSAiLiI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgR1JPVVBfTkFNRV9NRU5VX0FERElUSU9OUyA9ICJNZW51QWRkaXRpb25zIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgR1JPVVBfTkFNRV9UT09MQkFSX0FERElUSU9OUyA9ICJUb29sYmFyQWRkaXRpb25zIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RBVFVTX0NBVEVHT1JZX09GRlNFVCA9ICJPZmZzZXQiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwNGYwZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZW50YXNzaXN0LklTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuY29udGVudGFzc2lzdC5JU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci0KLS8qKgotICogQSBwcm9jZXNzb3IgdGhhdCBhZ2dyZWdhdGVzIHRoZSBwcm9wb3NhbHMgb2YgbXVsdGlwbGUgb3RoZXIgcHJvY2Vzc29ycy4KLSAqIFdoZW4gcHJvcG9zYWxzIGFyZSByZXF1ZXN0ZWQsIHRoZSBjb250YWluZWQgcHJvY2Vzc29ycyBhcmUgcXVlcmllZCBpbiB0aGUKLSAqIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCB0byB0aGUgY29tcG91bmQgb2JqZWN0LiBDb3BpZWQgZnJvbQotICogb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yLgotICogTW9kaWZpY2F0aW9uIHdhcyBtYWRlIHRvIGFkZCBhIGRpc3Bvc2UoKSBtZXRob2QuCi0gKi8KLWNsYXNzIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciBpbXBsZW1lbnRzIElDb250ZW50QXNzaXN0UHJvY2Vzc29yLCBJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIFdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24gaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uIHsKLQkJcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uIGZJbmZvOwotCQlwcml2YXRlIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGZQcm9jZXNzb3I7Ci0KLQkJV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbihJQ29udGV4dEluZm9ybWF0aW9uIGluZm8sIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvcikgewotCQkJZkluZm8gPSBpbmZvOwotCQkJZlByb2Nlc3NvciA9IHByb2Nlc3NvcjsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCQlyZXR1cm4gZkluZm8uZXF1YWxzKG9iaik7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uI2dldENvbnRleHREaXNwbGF5U3RyaW5nKCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dERpc3BsYXlTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZkluZm8uZ2V0Q29udGV4dERpc3BsYXlTdHJpbmcoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24jZ2V0SW1hZ2UoKQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQkJcmV0dXJuIGZJbmZvLmdldEltYWdlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uI2dldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpIHsKLQkJCXJldHVybiBmSW5mby5nZXRJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmcoKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNoYXNoQ29kZSgpCi0JCSAqLwotCQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQkJcmV0dXJuIGZJbmZvLmhhc2hDb2RlKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCQkgKi8KLQkJcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJCXJldHVybiBmSW5mby50b1N0cmluZygpOwotCQl9Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yKCkgewotCQkJcmV0dXJuIGZQcm9jZXNzb3I7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHsKLQkJTGlzdCBmVmFsaWRhdG9ycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBmVmFsaWRhdG9yOwotCi0JCXZvaWQgYWRkKElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCQlmVmFsaWRhdG9ycy5hZGQodmFsaWRhdG9yKTsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IjaW5zdGFsbChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiwKLQkJICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQkJLy8gaW5zdGFsbCBlaXRoZXIgdGhlIHZhbGlkYXRvciBpbiB0aGUgaW5mbywgb3IgYWxsIHZhbGlkYXRvcnMKLQkJCWZWYWxpZGF0b3IgPSBnZXRWYWxpZGF0b3IoaW5mbyk7Ci0JCQlpZiAoZlZhbGlkYXRvciAhPSBudWxsKQotCQkJCWZWYWxpZGF0b3IuaW5zdGFsbChpbmZvLCB2aWV3ZXIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJZWxzZSB7Ci0JCQkJZm9yIChJdGVyYXRvciBpdCA9IGZWYWxpZGF0b3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2ID0gKElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIGl0Lm5leHQoKTsKLQkJCQkJdi5pbnN0YWxsKGluZm8sIHZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRWYWxpZGF0b3IoSUNvbnRleHRJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlpZiAoaW5mbyBpbnN0YW5jZW9mIFdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24pIHsKLQkJCQlXcmFwcGVkQ29udGV4dEluZm9ybWF0aW9uIHdyYXAgPSAoV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbikgaW5mbzsKLQkJCQlyZXR1cm4gd3JhcC5nZXRQcm9jZXNzb3IoKS5nZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKTsKLQkJCX0KLQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2lzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoaW50KQotCQkgKi8KLQkJcHVibGljIGJvb2xlYW4gaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChpbnQgZG9jdW1lbnRQb3NpdGlvbikgewotCQkJLy8gdXNlIGVpdGhlciB0aGUgdmFsaWRhdG9yIGluIHRoZSBpbmZvLCBvciBhbGwgdmFsaWRhdG9ycwotCQkJYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0JCQlpZiAoZlZhbGlkYXRvciAhPSBudWxsKQotCQkJCWlzVmFsaWQgPSBmVmFsaWRhdG9yLmlzQ29udGV4dEluZm9ybWF0aW9uVmFsaWQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQllbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlZhbGlkYXRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIHYgPSAoSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcikgaXQubmV4dCgpOwotCQkJCQlpc1ZhbGlkIHw9IHYuaXNDb250ZXh0SW5mb3JtYXRpb25WYWxpZChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gaXNWYWxpZDsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG91bmRDb250ZW50QXNzaXN0VmFsaWRhdG9yRXggZXh0ZW5kcyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3IgaW1wbGVtZW50cyBJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgewotCi0JCS8qCi0JCSAqIEBzZWUgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2luc3RhbGwoSUNvbnRleHRJbmZvcm1hdGlvbiwKLQkJICogICAgICBJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBpbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBpbnN0YWxsKElDb250ZXh0SW5mb3JtYXRpb24gaW5mbywgSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkvLyBpbnN0YWxsIGVpdGhlciB0aGUgdmFsaWRhdG9yIGluIHRoZSBpbmZvLCBvciBhbGwgdmFsaWRhdG9ycwotCQkJZlZhbGlkYXRvciA9IGdldFZhbGlkYXRvcihpbmZvKTsKLQkJCWlmIChmVmFsaWRhdG9yIGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKQotCQkJCSgoSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSBmVmFsaWRhdG9yKS5pbnN0YWxsKGluZm8sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQllbHNlIHsKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlZhbGlkYXRvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJCQlpZiAoaXQubmV4dCgpIGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKQotCQkJCQkJKChJU3ViamVjdENvbnRyb2xDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IpIGl0Lm5leHQoKSkuaW5zdGFsbChpbmZvLCBjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBmaW5hbCBTZXQgZlByb2Nlc3NvcnMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBvbmUgY2hpbGQgcHJvY2Vzc29yLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzb3IKLQkgKiAgICAgICAgICAgIHRoZSBwcm9jZXNzb3IgdG8gYWRkCi0JICovCi0JcHVibGljIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcihJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJYWRkKHByb2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIHByb2Nlc3NvciB0byB0aGlzIGNvbXBvdW5kIHByb2Nlc3Nvci4KLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgcHJvY2Vzc29yIHRvIGFkZAotCSAqLwotCXB1YmxpYyB2b2lkIGFkZChJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChwcm9jZXNzb3IpOwotCQlmUHJvY2Vzc29ycy5hZGQocHJvY2Vzc29yKTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgcHJvY2Vzc29yIGZyb20gdGhpcyBjb21wb3VuZCBwcm9jZXNzb3IuCi0JICogCi0JICogQHBhcmFtIHByb2Nlc3NvcgotCSAqICAgICAgICAgICAgdGhlIHByb2Nlc3NvciB0byByZW1vdmUKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmUoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWZQcm9jZXNzb3JzLnJlbW92ZShwcm9jZXNzb3IpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgYW5kIGFkZHMgYWxsIHNwZWNpZmllZCBwcm9jZXNzb3JzLgotCSAqIAotCSAqIEBwYXJhbSBwcm9jZXNzb3JzCi0JICovCi0JcHVibGljIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcihJQ29udGVudEFzc2lzdFByb2Nlc3NvcltdIHByb2Nlc3NvcnMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9jZXNzb3JzLmxlbmd0aDsgaSsrKSB7Ci0JCQlhZGQocHJvY2Vzc29yc1tpXSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlMaXN0IHJldCA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCWlmIChwcm9wb3NhbHMgIT0gbnVsbCkKLQkJCQlyZXQuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvcG9zYWxzKSk7Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHJldC50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3JldC5zaXplKCldKTsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIG9iamVjdHMgYXJlIHdyYXBwZXIgb2JqZWN0cyBhcm91bmQgdGhlIHJlYWwgaW5mb3JtYXRpb24KLQkgKiBjb250YWluZXJzLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBjb21wdXRlQ29udGV4dEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUxpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCUlDb250ZXh0SW5mb3JtYXRpb25bXSBpbmZvcm1hdGlvbnMgPSBwLmNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24odmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCQlpZiAoaW5mb3JtYXRpb25zICE9IG51bGwpCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcm1hdGlvbnMubGVuZ3RoOyBpKyspCi0JCQkJCXJldC5hZGQobmV3IFdyYXBwZWRDb250ZXh0SW5mb3JtYXRpb24oaW5mb3JtYXRpb25zW2ldLCBwKSk7Ci0JCX0KLQkJcmV0dXJuIChJQ29udGV4dEluZm9ybWF0aW9uW10pIHJldC50b0FycmF5KG5ldyBJQ29udGV4dEluZm9ybWF0aW9uW3JldC5zaXplKCldKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCVNldCByZXQgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJY2hhcltdIGNoYXJzID0gcC5nZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKTsKLQkJCWlmIChjaGFycyAhPSBudWxsKQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY2hhcnMubGVuZ3RoOyBpKyspCi0JCQkJCXJldC5hZGQobmV3IENoYXJhY3RlcihjaGFyc1tpXSkpOwotCQl9Ci0KLQkJY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbcmV0LnNpemUoKV07Ci0JCWludCBpID0gMDsKLQkJZm9yIChJdGVyYXRvciBpdCA9IHJldC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7IGkrKykgewotCQkJQ2hhcmFjdGVyIGNoID0gKENoYXJhY3RlcikgaXQubmV4dCgpOwotCQkJY2hhcnNbaV0gPSBjaC5jaGFyVmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gY2hhcnM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlTZXQgcmV0ID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0Lm5leHQoKTsKLQkJCWNoYXJbXSBjaGFycyA9IHAuZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCk7Ci0JCQlpZiAoY2hhcnMgIT0gbnVsbCkKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKQotCQkJCQlyZXQuYWRkKG5ldyBDaGFyYWN0ZXIoY2hhcnNbaV0pKTsKLQkJfQotCi0JCWNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW3JldC5zaXplKCldOwotCQlpbnQgaSA9IDA7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSByZXQuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyBpKyspIHsKLQkJCUNoYXJhY3RlciBjaCA9IChDaGFyYWN0ZXIpIGl0Lm5leHQoKTsKLQkJCWNoYXJzW2ldID0gY2guY2hhclZhbHVlKCk7Ci0JCX0KLQkJcmV0dXJuIGNoYXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGZpcnN0IG5vbi0gPGNvZGU+bnVsbDwvY29kZT4gZXJyb3IgbWVzc2FnZSBvZiBhbnkKLQkgKiBjb250YWluZWQgcHJvY2Vzc29yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBwcm9jZXNzb3IgaGFzIGFuCi0JICogZXJyb3IgbWVzc2FnZS4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRFcnJvck1lc3NhZ2UoKQotCSAqIEByZXR1cm4ge0Bpbmhlcml0RG9jfQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJU3RyaW5nIGVyciA9IHAuZ2V0RXJyb3JNZXNzYWdlKCk7Ci0JCQlpZiAoZXJyICE9IG51bGwpCi0JCQkJcmV0dXJuIGVycjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB7QGluaGVyaXREb2N9Ci0JICogPHA+Ci0JICogVGhlIHJldHVybmVkIHZhbGlkYXRvciBpcyBhIHdyYXBwZXIgYXJvdW5kIHRoZSB2YWxpZGF0b3JzIHByb3ZpZGVkIGJ5Ci0JICogdGhlIGNoaWxkIHByb2Nlc3NvcnMuCi0JICogPC9wPgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IgZ2V0Q29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKCkgewotCQlib29sZWFuIGhhc1ZhbGlkYXRvciA9IGZhbHNlOwotCQlib29sZWFuIGhhc0V4dGVuc2lvbiA9IGZhbHNlOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2ID0gcC5nZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKTsKLQkJCWlmICh2IGluc3RhbmNlb2YgSVN1YmplY3RDb250cm9sQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yKSB7Ci0JCQkJaGFzRXh0ZW5zaW9uID0gdHJ1ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWVsc2UgaWYgKHYgIT0gbnVsbCkgewotCQkJCWhhc1ZhbGlkYXRvciA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3IgdmFsaWRhdG9yID0gbnVsbDsKLQkJaWYgKGhhc0V4dGVuc2lvbikKLQkJCXZhbGlkYXRvciA9IG5ldyBDb21wb3VuZENvbnRlbnRBc3Npc3RWYWxpZGF0b3JFeCgpOwotCQllbHNlIGlmIChoYXNWYWxpZGF0b3IpCi0JCQl2YWxpZGF0b3IgPSBuZXcgQ29tcG91bmRDb250ZW50QXNzaXN0VmFsaWRhdG9yKCk7Ci0KLQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKQotCQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQkJSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB2ID0gcC5nZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKTsKLQkJCQlpZiAodiAhPSBudWxsKQotCQkJCQl2YWxpZGF0b3IuYWRkKHYpOwotCQkJfQotCi0JCXJldHVybiB2YWxpZGF0b3I7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSUNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElDb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wgY29udGVudEFzc2lzdFN1YmplY3RDb250cm9sLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJTGlzdCByZXQgPSBuZXcgTGlua2VkTGlzdCgpOwotCQlmb3IgKEl0ZXJhdG9yIGl0ID0gZlByb2Nlc3NvcnMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG8gPSBpdC5uZXh0KCk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIHsKLQkJCQlJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yIHAgPSAoSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvcikgbzsKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsW10gcHJvcG9zYWxzID0gcC5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCQlpZiAocHJvcG9zYWxzICE9IG51bGwpCi0JCQkJCXJldC5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm9wb3NhbHMpKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSByZXQudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtyZXQuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICoge0Bpbmhlcml0RG9jfQotCSAqIDxwPgotCSAqIFRoZSByZXR1cm5lZCBvYmplY3RzIGFyZSB3cmFwcGVyIG9iamVjdHMgYXJvdW5kIHRoZSByZWFsIGluZm9ybWF0aW9uCi0JICogY29udGFpbmVycy4KLQkgKiA8L3A+Ci0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5jb250ZW50YXNzaXN0LklTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RTdWJqZWN0LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJQ29udGVudEFzc2lzdFN1YmplY3RDb250cm9sIGNvbnRlbnRBc3Npc3RTdWJqZWN0Q29udHJvbCwgaW50IGRvY3VtZW50T2Zmc2V0KSB7Ci0JCUxpc3QgcmV0ID0gbmV3IExpbmtlZExpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpdCA9IGZQcm9jZXNzb3JzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCU9iamVjdCBvID0gaXQubmV4dCgpOwotCQkJaWYgKG8gaW5zdGFuY2VvZiBJU3ViamVjdENvbnRyb2xDb250ZW50QXNzaXN0UHJvY2Vzc29yKSB7Ci0JCQkJSVN1YmplY3RDb250cm9sQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElTdWJqZWN0Q29udHJvbENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIG87Ci0JCQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIGluZm9ybWF0aW9ucyA9IHAuY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihjb250ZW50QXNzaXN0U3ViamVjdENvbnRyb2wsIGRvY3VtZW50T2Zmc2V0KTsKLQkJCQlpZiAoaW5mb3JtYXRpb25zICE9IG51bGwpCi0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaW5mb3JtYXRpb25zLmxlbmd0aDsgaSsrKQotCQkJCQkJcmV0LmFkZChuZXcgV3JhcHBlZENvbnRleHRJbmZvcm1hdGlvbihpbmZvcm1hdGlvbnNbaV0sIHApKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElDb250ZXh0SW5mb3JtYXRpb25bXSkgcmV0LnRvQXJyYXkobmV3IElDb250ZXh0SW5mb3JtYXRpb25bcmV0LnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIERpc3Bvc2Ugb2YgYW55IGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgdGhhdCBuZWVkIGRpc3Bvc2luZwotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIGdvIHRocm91Z2ggbGlzdCBvZiBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzIGFuZCBkaXNwb3NlCi0JCWZvciAoSXRlcmF0b3IgaXQgPSBmUHJvY2Vzc29ycy5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7KSB7Ci0JCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gKElDb250ZW50QXNzaXN0UHJvY2Vzc29yKSBpdC5uZXh0KCk7Ci0JCQlpZiAocCBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJKChJUmVsZWFzYWJsZSkgcCkucmVsZWFzZSgpOwotCQkJfQotCQl9Ci0JCWZQcm9jZXNzb3JzLmNsZWFyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGVudEFzc2lzdFV0aWxzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZW50QXNzaXN0VXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMTJjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZW50QXNzaXN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICogIAotICovCi1wdWJsaWMgY2xhc3MgQ29udGVudEFzc2lzdFV0aWxzIHsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNsb3Nlc3QgSW5kZXhlZFJlZ2lvbiBmb3IgdGhlIG9mZnNldCBhbmQgdmlld2VyIGFsbG93aW5nCi0JICogZm9yIGRpZmZlcmVuY2VzIGJldHdlZW4gdmlld2VyIG9mZnNldHMgYW5kIG1vZGVsIHBvc2l0aW9ucy4gbm90ZTogdGhpcwotCSAqIG1ldGhvZCByZXR1cm5zIGFuIEluZGV4ZWRSZWdpb24gZm9yIHJlYWQgb25seQotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB2aWV3ZXIgd2hvc2UgZG9jdW1lbnQgaXMgdXNlZCB0byBjb21wdXRlIHRoZSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gZG9jdW1lbnRPZmZzZXQKLQkgKiAgICAgICAgICAgIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRvY3VtZW50IGZvciB3aGljaCBjb21wbGV0aW9ucyBzaG91bGQKLQkgKiAgICAgICAgICAgIGJlIGNvbXB1dGVkCi0JICogQHJldHVybiBhbiBJbmRleGVkUmVnaW9uCi0JICovCi0JcHVibGljIHN0YXRpYyBJbmRleGVkUmVnaW9uIGdldE5vZGVBdChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCi0JCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUluZGV4ZWRSZWdpb24gbm9kZSA9IG51bGw7Ci0JCUlNb2RlbE1hbmFnZXIgbW0gPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJaWYgKG1tICE9IG51bGwpCi0JCQltb2RlbCA9IG1tLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaW50IGxhc3RPZmZzZXQgPSBkb2N1bWVudE9mZnNldDsKLQkJCQlub2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihkb2N1bWVudE9mZnNldCk7Ci0JCQkJd2hpbGUgKG5vZGUgPT0gbnVsbCAmJiBsYXN0T2Zmc2V0ID49IDApIHsKLQkJCQkJbGFzdE9mZnNldC0tOwotCQkJCQlub2RlID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihsYXN0T2Zmc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjbG9zZXN0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm9yIHRoZSBvZmZlc3QgYW5kCi0JICogdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRPZmZzZXQKLQkgKiBAcmV0dXJuIHRoZSBjbG9zZXN0IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm9yIHRoZSBvZmZlc3QgYW5kCi0JICogICAgICAgICB2aWV3ZXIuCi0JICovCi0JcHVibGljIHN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uID0gbnVsbDsKLQkJaWYgKHZpZXdlciA9PSBudWxsIHx8IHZpZXdlci5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbGFzdE9mZnNldCA9IGRvY3VtZW50T2Zmc2V0OwotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IChJU3RydWN0dXJlZERvY3VtZW50KSB2aWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJc2RSZWdpb24gPSBkb2MuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRPZmZzZXQpOwotCQl3aGlsZSAoc2RSZWdpb24gPT0gbnVsbCAmJiBsYXN0T2Zmc2V0ID49IDApIHsKLQkJCWxhc3RPZmZzZXQtLTsKLQkJCXNkUmVnaW9uID0gZG9jLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGxhc3RPZmZzZXQpOwotCQl9Ci0JCXJldHVybiBzZFJlZ2lvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMzc5OWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXJFeHRlbnNpb241OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgSUNvbXBsZXRpb25Qcm9wb3NhbCB3aG9zZSB2YWx1ZXMgY2FuIGJlIHJlYWQgYWZ0ZXIKLSAqIGNyZWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbiwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIsIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgewotICAgIAotCXByaXZhdGUgU3RyaW5nIGZBZGRpdGlvbmFsUHJvcG9zYWxJbmZvOwotCi0gICAgcHJpdmF0ZSBJQ29udGV4dEluZm9ybWF0aW9uIGZDb250ZXh0SW5mb3JtYXRpb247Ci0KLSAgICBwcml2YXRlIGludCBmQ3Vyc29yUG9zaXRpb24gPSAwOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlTdHJpbmc7Ci0KLSAgICBwcml2YXRlIEltYWdlIGZJbWFnZTsKLQotICAgIHByaXZhdGUgaW50IGZPcmlnaW5hbFJlcGxhY2VtZW50TGVuZ3RoOwotCi0gICAgcHJpdmF0ZSBpbnQgZlJlbGV2YW5jZSA9IElSZWxldmFuY2VDb25zdGFudHMuUl9OT05FOwotCi0gICAgcHJpdmF0ZSBpbnQgZlJlcGxhY2VtZW50TGVuZ3RoID0gMDsKLQotICAgIHByaXZhdGUgaW50IGZSZXBsYWNlbWVudE9mZnNldCA9IDA7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBmUmVwbGFjZW1lbnRTdHJpbmcgPSBudWxsOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGZVcGRhdGVMZW5ndGhPblZhbGlkYXRlOwotCi0gICAgcHJpdmF0ZSBjaGFyW10gZlRyaWdnZXJzOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3Igd2l0aCByZWxldmFuY2UgYW5kIHJlcGxhY2VtZW50IGxlbmd0aCB1cGRhdGUgZmxhZy4KLSAgICAgKiAKLSAgICAgKiBJZiB0aGUgPGNvZGU+dXBkYXRlUmVwbGFjZW1lbnRMZW5ndGhPblZhbGlkYXRlPC9jb2RlPiBmbGFnIGlzIHRydWUsCi0gICAgICogdGhlbiB3aGVuIHRoZSB1c2VyIHR5cGVzLCB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIHdpbGwgYmUgaW5jcmVtZW50ZWQgYnkKLSAgICAgKiB0aGUgbnVtYmVyIG9mIG5ldyBjaGFyYWN0ZXJzIGluc2VydGVkIGZyb20gdGhlIG9yaWdpbmFsIHBvc2l0aW9uLgotICAgICAqIE90aGVyd2lzZSB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIHdpbGwgbm90IGNoYW5nZSBvbiB2YWxpZGF0ZS4KLSAgICAgKiAKLSAgICAgKiBleC4KLSAgICAgKiAKLSAgICAgKiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjZW1lbnQgbGVuZ3RoIGlzIDQgPHRhZyBpfG5hbWU9ImF0dHIiPiAtCi0gICAgICogdGhlIHJlcGxhY2VtZW50IGxlbmd0aCBpcyBub3cgNSA8dGFnIGlkfG5hbWU9ImF0dHIiPiAtIHRoZSByZXBsYWNlbWVudAotICAgICAqIGxlbmd0aCBpcyBub3cgNiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjZW1lbnRsZW5ndGggaXMgbm93IDQgYWdhaW4KLSAgICAgKiA8dGFnIHxuYW1lPSJhdHRyIj4gLSB0aGUgcmVwbGFjbWVudCBsZW5ndGggcmVtYWlucyA0Ci0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcsIGludCByZXBsYWNlbWVudE9mZnNldCwgaW50IHJlcGxhY2VtZW50TGVuZ3RoLCBpbnQgY3Vyc29yUG9zaXRpb24sIEltYWdlIGltYWdlLCBTdHJpbmcgZGlzcGxheVN0cmluZywKLSAgICAgICAgICAgIElDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm9ybWF0aW9uLCBTdHJpbmcgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgaW50IHJlbGV2YW5jZSwgYm9vbGVhbiB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGUpIHsKLSAgICAgICAgZlJlcGxhY2VtZW50U3RyaW5nID0gcmVwbGFjZW1lbnRTdHJpbmc7Ci0gICAgICAgIGZSZXBsYWNlbWVudE9mZnNldCA9IHJlcGxhY2VtZW50T2Zmc2V0OwotICAgICAgICBmUmVwbGFjZW1lbnRMZW5ndGggPSByZXBsYWNlbWVudExlbmd0aDsKLSAgICAgICAgZkN1cnNvclBvc2l0aW9uID0gY3Vyc29yUG9zaXRpb247Ci0gICAgICAgIGZJbWFnZSA9IGltYWdlOwotICAgICAgICBmRGlzcGxheVN0cmluZyA9IGRpc3BsYXlTdHJpbmc7Ci0gICAgICAgIGZDb250ZXh0SW5mb3JtYXRpb24gPSBjb250ZXh0SW5mb3JtYXRpb247Ci0gICAgICAgIGZBZGRpdGlvbmFsUHJvcG9zYWxJbmZvID0gYWRkaXRpb25hbFByb3Bvc2FsSW5mbzsKLSAgICAgICAgZlJlbGV2YW5jZSA9IHJlbGV2YW5jZTsKLSAgICAgICAgZlVwZGF0ZUxlbmd0aE9uVmFsaWRhdGUgPSB1cGRhdGVSZXBsYWNlbWVudExlbmd0aE9uVmFsaWRhdGU7Ci0gICAgICAgIGZPcmlnaW5hbFJlcGxhY2VtZW50TGVuZ3RoID0gZlJlcGxhY2VtZW50TGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoU3RyaW5nIHJlcGxhY2VtZW50U3RyaW5nLCBpbnQgcmVwbGFjZW1lbnRPZmZzZXQsIGludCByZXBsYWNlbWVudExlbmd0aCwgaW50IGN1cnNvclBvc2l0aW9uLCBJbWFnZSBpbWFnZSwgU3RyaW5nIGRpc3BsYXlTdHJpbmcsCi0gICAgICAgICAgICBJQ29udGV4dEluZm9ybWF0aW9uIGNvbnRleHRJbmZvcm1hdGlvbiwgU3RyaW5nIGFkZGl0aW9uYWxQcm9wb3NhbEluZm8sIGludCByZWxldmFuY2UpIHsKLSAgICAgICAgdGhpcyhyZXBsYWNlbWVudFN0cmluZywgcmVwbGFjZW1lbnRPZmZzZXQsIHJlcGxhY2VtZW50TGVuZ3RoLCBjdXJzb3JQb3NpdGlvbiwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIGNvbnRleHRJbmZvcm1hdGlvbiwgYWRkaXRpb25hbFByb3Bvc2FsSW5mbywgcmVsZXZhbmNlLCB0cnVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhcHBseShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLSAgICAgICAgQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IENvbXBsZXRpb25Qcm9wb3NhbChnZXRSZXBsYWNlbWVudFN0cmluZygpLCBnZXRSZXBsYWNlbWVudE9mZnNldCgpLCBnZXRSZXBsYWNlbWVudExlbmd0aCgpLCBnZXRDdXJzb3JQb3NpdGlvbigpLCBnZXRJbWFnZSgpLCBnZXREaXNwbGF5U3RyaW5nKCksCi0gICAgICAgICAgICAgICAgZ2V0Q29udGV4dEluZm9ybWF0aW9uKCksIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSk7Ci0gICAgICAgIHByb3Bvc2FsLmFwcGx5KGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotICAgICAqICAgICAgY2hhciwgaW50KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCwgY2hhciB0cmlnZ2VyLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgZ2V0Q3Vyc29yUG9zaXRpb24oKSwgZ2V0SW1hZ2UoKSwgZ2V0RGlzcGxheVN0cmluZygpLAotICAgICAgICAgICAgICAgIGdldENvbnRleHRJbmZvcm1hdGlvbigpLCBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkpOwotICAgICAgICAvLyB3ZSBjdXJyZW50bHkgZG9uJ3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3Igd2hpY2ggY2hhcmFjdGVyCi0gICAgICAgIC8vIHNlbGVjdGVkIHRoZSBwcm9wb3NhbCwgYW5kIHdoZXJlIHRoZSBjdXJzb3Igb2Zmc2V0IGlzCi0gICAgICAgIC8vIGJ1dCB3ZSBtaWdodCBpbiB0aGUgZnV0dXJlLi4uCi0gICAgICAgIHByb3Bvc2FsLmFwcGx5KGRvY3VtZW50KTsKLSAgICAgICAgLy8gd2Ugd2FudCB0byBDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXIudXBkYXRlUHJlc2VudGF0aW9uKCkgaGVyZQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0gICAgICAgIElEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotICAgICAgICAvLyBDTVZDIDI1MjYzNCB0byBjb21wZW5zYXRlIGZvciAiaW52aXNpYmxlIiBpbml0aWFsIHJlZ2lvbgotICAgICAgICBpbnQgY2FyZXRPZmZzZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCk7Ci0gICAgICAgIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLSAgICAgICAgICAgIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0gICAgICAgICAgICBjYXJldE9mZnNldCA9IGV4dGVuc2lvbi53aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQoY2FyZXRPZmZzZXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FyZXRPZmZzZXQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCkgKyB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNhcmV0T2Zmc2V0ID09IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkpIHsKLSAgICAgICAgICAgIGFwcGx5KGRvY3VtZW50KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIHRleHQgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGNhcmV0IFBvc2l0aW9uIGFzIHRoaXMKLSAgICAgICAgICAgIC8vIGNhdXNlcyB0aGUgY3Vyc29yIHRvIG1vdmUgb24gaXRzIG93bgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBpbnQgZW5kT2Zmc2V0T2ZDaGFuZ2VzID0gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSArIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBwb3J0aW9uIG9mIHRoZSBuZXcgdGV4dCB0aGF0IGNvbWVzIGFmdGVyIHRoZQotICAgICAgICAgICAgICAgIC8vIGN1cnJlbnQgY2FyZXQgcG9zaXRpb24KLSAgICAgICAgICAgICAgICBpZiAoZW5kT2Zmc2V0T2ZDaGFuZ2VzID49IGNhcmV0T2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA9IGdldFJlcGxhY2VtZW50T2Zmc2V0KCkgKyBnZXRSZXBsYWNlbWVudExlbmd0aCgpIC0gY2FyZXRPZmZzZXQ7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwcmVDYXJldFJlcGxhY2VtZW50TGVuZ3RoID0gZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKS5sZW5ndGgoKSAtIChlbmRPZmZzZXRPZkNoYW5nZXMgLSBjYXJldE9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIioqIHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoIHdhcyBuZWdhdGl2ZTogIiArIHBvc3RDYXJldFJlcGxhY2VtZW50TGVuZ3RoKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IGEgcXVpY2sgZml4IHdoaWxlIEkgZmlndXJlIG91dCB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlbWVudCBsZW5ndGggaXMgc3VwcG9zZWQgdG8gYmUKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGVhY2ggY2FzZSwgb3RoZXJ3aXNlIHdlJ2xsIGdldCBuZWdhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwbGFjbWVudCBsZW5ndGggc29tZXRpbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICBwb3N0Q2FyZXRSZXBsYWNlbWVudExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVwbGFjZShjYXJldE9mZnNldCwgcG9zdENhcmV0UmVwbGFjZW1lbnRMZW5ndGgsIGdldFJlcGxhY2VtZW50U3RyaW5nKCkuc3Vic3RyaW5nKHByZUNhcmV0UmVwbGFjZW1lbnRMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBwb3J0aW9uIG9mIHRoZSBuZXcgdGV4dCB0aGF0IGNvbWVzIGJlZm9yZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGNhcmV0IHBvc2l0aW9uCi0gICAgICAgICAgICAgICAgLy8gRG9uZSBzZWNvbmQgc2luY2Ugb2Zmc2V0cyB3b3VsZCBjaGFuZ2UgZm9yIHRoZSBwb3N0IHRleHQKLSAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UKLSAgICAgICAgICAgICAgICAvLyBPdXRyaWdodCBpbnNlcnRpb25zIGFyZSBoYW5kbGVkIGhlcmUKLSAgICAgICAgICAgICAgICBpZiAoY2FyZXRPZmZzZXQgPiBnZXRSZXBsYWNlbWVudE9mZnNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBwcmVDYXJldFRleHRMZW5ndGggPSBjYXJldE9mZnNldCAtIGdldFJlcGxhY2VtZW50T2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlcGxhY2UoZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgcHJlQ2FyZXRUZXh0TGVuZ3RoLCBnZXRSZXBsYWNlbWVudFN0cmluZygpLnN1YnN0cmluZygwLCBwcmVDYXJldFRleHRMZW5ndGgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0gICAgICAgICAgICAgICAgYXBwbHkoZG9jdW1lbnQpOwotICAgICAgICAgICAgfSBjYXRjaCAoU3RyaW5nSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgYXBwbHkoZG9jdW1lbnQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotICAgICAgICAvLyByZXR1cm4gZlByb3Bvc2FsLmdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKTsKLSAgICAgICAgcmV0dXJuIGZBZGRpdGlvbmFsUHJvcG9zYWxJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLSAgICAgICAgLy8gcmV0dXJuIGZQcm9wb3NhbC5nZXRDb250ZXh0SW5mb3JtYXRpb24oKTsKLSAgICAgICAgcmV0dXJuIGZDb250ZXh0SW5mb3JtYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGV4dEluZm9ybWF0aW9uKElDb250ZXh0SW5mb3JtYXRpb24gY29udGV4dEluZm8pIHsKLSAgICAgICAgZkNvbnRleHRJbmZvcm1hdGlvbiA9IGNvbnRleHRJbmZvOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJzb3JQb3NpdGlvbigpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgaW50IGdldEN1cnNvclBvc2l0aW9uKCkgewotICAgICAgICByZXR1cm4gZkN1cnNvclBvc2l0aW9uOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEN1cnNvclBvc2l0aW9uKGludCBwb3MpIHsKLSAgICAgICAgZkN1cnNvclBvc2l0aW9uID0gcG9zOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERpc3BsYXlTdHJpbmcoU3RyaW5nIG5ld0Rpc3BsYXlTdHJpbmcpIHsKLSAgICAJZkRpc3BsYXlTdHJpbmcgPSBuZXdEaXNwbGF5U3RyaW5nOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0gICAgICAgIC8vIHJldHVybiBmUHJvcG9zYWwuZ2V0RGlzcGxheVN0cmluZygpOwotICAgICAgICByZXR1cm4gZkRpc3BsYXlTdHJpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldEltYWdlKCkgewotICAgICAgICAvLyByZXR1cm4gZlByb3Bvc2FsLmdldEltYWdlKCk7Ci0gICAgICAgIHJldHVybiBmSW1hZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRSZWxldmFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBmUmVsZXZhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VtZW50TGVuZ3RoKGludCBuZXdSZXBsYWNlbWVudExlbmd0aCkgewotICAgICAgICBmUmVwbGFjZW1lbnRMZW5ndGggPSBuZXdSZXBsYWNlbWVudExlbmd0aDsKLSAgICB9ICAKLSAgICBwdWJsaWMgaW50IGdldFJlcGxhY2VtZW50TGVuZ3RoKCkgewotICAgICAgICByZXR1cm4gZlJlcGxhY2VtZW50TGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSB7Ci0gICAgICAgIHJldHVybiBmUmVwbGFjZW1lbnRPZmZzZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRSZXBsYWNlbWVudFN0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIGZSZXBsYWNlbWVudFN0cmluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUG9pbnQgZ2V0U2VsZWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCkgewotICAgICAgICAvLyByZXR1cm4gZlByb3Bvc2FsLmdldFNlbGVjdGlvbihkb2N1bWVudCk7Ci0gICAgICAgIENvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoZ2V0UmVwbGFjZW1lbnRTdHJpbmcoKSwgZ2V0UmVwbGFjZW1lbnRPZmZzZXQoKSwgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgZ2V0Q3Vyc29yUG9zaXRpb24oKSwgZ2V0SW1hZ2UoKSwgZ2V0RGlzcGxheVN0cmluZygpLAotICAgICAgICAgICAgICAgIGdldENvbnRleHRJbmZvcm1hdGlvbigpLCBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkpOwotICAgICAgICByZXR1cm4gcHJvcG9zYWwuZ2V0U2VsZWN0aW9uKGRvY3VtZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uI2dldFRyaWdnZXJDaGFyYWN0ZXJzKCkKLSAgICAgKi8KLQotICAgIHB1YmxpYyBjaGFyW10gZ2V0VHJpZ2dlckNoYXJhY3RlcnMoKSB7Ci0gICAgICAgIHJldHVybiBmVHJpZ2dlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VHJpZ2dlckNoYXJhY3RlcnMoY2hhcltdIHRyaWdnZXJzKSB7Ci0gICAgICAgIGZUcmlnZ2VycyA9IHRyaWdnZXJzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24jaXNWYWxpZEZvcihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLSAgICAgKiAgICAgIGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkRm9yKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gdmFsaWRhdGUoZG9jdW1lbnQsIG9mZnNldCwgbnVsbCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLSAgICAgKiAgICAgIGJvb2xlYW4pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0gICAgfQotCi0gICAgLy8gY29kZSBpcyBib3Jyb3dlZCBmcm9tIEphdmFDb21wbGV0aW9uUHJvcG9zYWwKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBzdGFydHNXaXRoKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgU3RyaW5nIHdvcmQpIHsKLQkKLSAgICAJaW50IHdvcmRMZW5ndGggPSB3b3JkID09IG51bGwgPyAwIDogd29yZC5sZW5ndGgoKTsKLSAgICAgICAgaWYgKG9mZnNldCA+IGZSZXBsYWNlbWVudE9mZnNldCArIHdvcmRMZW5ndGgpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGludCBsZW5ndGggPSBvZmZzZXQgLSBmUmVwbGFjZW1lbnRPZmZzZXQ7Ci0gICAgICAgICAgICBTdHJpbmcgc3RhcnQgPSBkb2N1bWVudC5nZXQoZlJlcGxhY2VtZW50T2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgICAgICAgICByZXR1cm4gd29yZC5zdWJzdHJpbmcoMCwgbGVuZ3RoKS5lcXVhbHNJZ25vcmVDYXNlKHN0YXJ0KTsKLSAgICAgICAgfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3Vuc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1bnNlbGVjdGVkKElUZXh0Vmlld2VyIHZpZXdlcikgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIGJvcnJvd2VkIGZyb20gSmF2YUNvbXBsZXRpb25Qcm9wb3NhbAotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotICAgICAqICAgICAgaW50LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdmFsaWRhdGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0LCBEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPCBmUmVwbGFjZW1lbnRPZmZzZXQpCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gdmFsaWRhdGVkID0gc3RhcnRzV2l0aChkb2N1bWVudCwgb2Zmc2V0LCBmRGlzcGxheVN0cmluZyk7Ci0KLSAgICAgICAgaWYgKGZVcGRhdGVMZW5ndGhPblZhbGlkYXRlKSB7Ci0KLSAgICAgICAgICAgIC8vIGl0IHdvdWxkIGJlIGJldHRlciB0byB1c2UgIm9yaWdpbmFsQ3Vyc29yUG9zaXRpb24iIGluc3RlYWQgb2YKLSAgICAgICAgICAgIC8vIGdldFJlcGxhY2VtZW50T2Zmc2V0KCksIGJ1dCB3ZSBkb24ndCBoYXZlIHRoYXQgaW5mby4KLSAgICAgICAgICAgIGludCBuZXdMZW5ndGggPSBvZmZzZXQgLSBnZXRSZXBsYWNlbWVudE9mZnNldCgpOwotICAgICAgICAgICAgaW50IGRlbHRhID0gbmV3TGVuZ3RoIC0gZk9yaWdpbmFsUmVwbGFjZW1lbnRMZW5ndGg7Ci0gICAgICAgICAgICBmUmVwbGFjZW1lbnRMZW5ndGggPSBkZWx0YSArIGZPcmlnaW5hbFJlcGxhY2VtZW50TGVuZ3RoOwotICAgICAgICAgICAgCi0gICAgICAgIAkvLyBpZiBpdCdzIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgcmVwbGFjZW1lbnQgb2Zmc2V0IGlzCi0gICAgICAgICAgICAvLyBnb2luZyB0byBiZSBvbmUgb2ZmIGZyb20gdGhlIGFjdHVhbCBjdXJzb3Igb2Zmc2V0Li4uCi0gICAgICAgIAljaGFyIGZpcnN0Q2hhciA9IGRvY3VtZW50LmdldCgpLmNoYXJBdChnZXRSZXBsYWNlbWVudE9mZnNldCgpKTsKLSAgICAgICAgCWlmKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpCi0gICAgICAgIAkJZlJlcGxhY2VtZW50TGVuZ3RoICsrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWxpZGF0ZWQ7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXBsYWNlbWVudE9mZnNldCBUaGUgZlJlcGxhY2VtZW50T2Zmc2V0IHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudE9mZnNldChpbnQgcmVwbGFjZW1lbnRPZmZzZXQpIHsKLSAgICAgICAgZlJlcGxhY2VtZW50T2Zmc2V0ID0gcmVwbGFjZW1lbnRPZmZzZXQ7Ci0gICAgfQotICAgIC8qKgotICAgICAqIEBwYXJhbSByZXBsYWNlbWVudFN0cmluZyBUaGUgZlJlcGxhY2VtZW50U3RyaW5nIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudFN0cmluZyhTdHJpbmcgcmVwbGFjZW1lbnRTdHJpbmcpIHsKLSAgICAgICAgZlJlcGxhY2VtZW50U3RyaW5nID0gcmVwbGFjZW1lbnRTdHJpbmc7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjdiMTBlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLS8qKgotICogQ29tcGxldGlvblByb3Bvc2FsIHdpdGggYSByZWxldmFuY2UgdmFsdWUuIFRoZSByZWxldmFuY2UgdmFsdWUgaXMgdXNlZCB0bwotICogc29ydCB0aGUgY29tcGxldGlvbiBwcm9wb3NhbHMuIFByb3Bvc2FscyB3aXRoIGhpZ2hlciByZWxldmFuY2Ugc2hvdWxkIGJlCi0gKiBsaXN0ZWQgYmVmb3JlIHByb3Bvc2FscyB3aXRoIGxvd2VyIHJlbGV2YW5jZS4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGludGVyZmFjZSBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIHsKLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWxldmFuY2Ugb2YgdGhlIHByb3Bvc2FsLgotCSAqLwotCWludCBnZXRSZWxldmFuY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lSZWxldmFuY2VDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0lSZWxldmFuY2VDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1YTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9JUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotcHVibGljIGludGVyZmFjZSBJUmVsZXZhbmNlQ29uc3RhbnRzIHsKLQlpbnQgUl9OT05FID0gMDsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1N0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TdHJ1Y3R1cmVkQ29udGVudEFzc2lzdGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGVlNmE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1N0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDb250ZW50QXNzaXN0YW50IGV4dGVuZHMgQ29udGVudEFzc2lzdGFudCB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfQVNTSVNUX1BST0NFU1NPUl9FWFRFTkRFRF9JRCA9ICJjb250ZW50YXNzaXN0cHJvY2Vzc29yIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogcGVyc29uYWwgbGlzdCBvZiBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3JzCi0JICovCi0JcHJpdmF0ZSBNYXAgZlByb2Nlc3NvcnM7Ci0JLyoqCi0JICogbGlzdCBvZiBwYXJ0aXRpb24gdHlwZXMgd2hlcmUgZXh0ZW5kZWQgcHJvY2Vzc29ycyBoYXZlIGJlZW4gaW5zdGFsbGVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlczsKLQotCS8qKgotCSAqIEVhY2ggc2V0IGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciBpcyBwbGFjZWQgaW5zaWRlIGEKLQkgKiBDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3Igd2hpY2ggYWxsb3dzIG11bHRpcGxlIHByb2Nlc3NvcnMgcGVyCi0JICogcGFydGl0aW9uIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gcHJvY2Vzc29yCi0JICogICAgICAgICAgICB0aGUgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIHRvIHJlZ2lzdGVyLCBvcgotCSAqICAgICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gdG8gcmVtb3ZlIGFuIGV4aXN0aW5nIG9uZQotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdHlwZSB1bmRlciB3aGljaCB0byByZWdpc3RlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAoZlByb2Nlc3NvcnMgPT0gbnVsbCkKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEhhc2hNYXAoKTsKLQotCQlDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY29tcG91bmRQcm9jZXNzb3IgPSBnZXRFeGlzdGluZ0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IocGFydGl0aW9uVHlwZSk7Ci0KLQkJLy8gaWYgcHJvY2Vzc29yIGlzIG51bGwsIHlvdSB3YW50IHRvIHJlbW92ZSBhbGwgcHJvY2Vzc29ycyBvZgotCQkvLyBjb250ZW50VHlwZQotCQlpZiAocHJvY2Vzc29yID09IG51bGwgJiYgY29tcG91bmRQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJY29tcG91bmRQcm9jZXNzb3IuZGlzcG9zZSgpOwotCQkJZlByb2Nlc3NvcnMucmVtb3ZlKHBhcnRpdGlvblR5cGUpOwotCQkJY29tcG91bmRQcm9jZXNzb3IgPSBudWxsOwotCQl9Ci0JCWlmIChwcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGEgbmV3IGNvbXBvdW5kcHJvY2VzcyBpZiB0aGVyZSBhbHJlYWR5IGlzbnQgb25lCi0JCQlpZiAoY29tcG91bmRQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJCWNvbXBvdW5kUHJvY2Vzc29yID0gbmV3IENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcigpOwotCQkJfQotCQkJLy8gYWRkIHByb2Nlc3NvciB0byBjb21wb3VuZCBwcm9jZXNzb3IKLQkJCWNvbXBvdW5kUHJvY2Vzc29yLmFkZChwcm9jZXNzb3IpOwotCQkJLy8gYWRkIGNvbXBvdW5kIHByb2Nlc29yIHRvIHByb2Nlc3NvcnMgbGlzdCAod2lsbCByZXBsYWNlIG9sZCBvbmUsCi0JCQkvLyBldmVuIGlmIHNhbWUgaW5zdGFuY2UpCi0JCQlmUHJvY2Vzc29ycy5wdXQocGFydGl0aW9uVHlwZSwgY29tcG91bmRQcm9jZXNzb3IpOwotCQl9Ci0JCXN1cGVyLnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29tcG91bmRQcm9jZXNzb3IsIHBhcnRpdGlvblR5cGUpOwotCX0KLQotCXByaXZhdGUgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldEV4aXN0aW5nQ29udGVudEFzc2lzdFByb2Nlc3NvcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgY29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gbnVsbDsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihwYXJ0aXRpb25UeXBlKTsKLQkJaWYgKHByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQlpZiAocHJvY2Vzc29yIGluc3RhbmNlb2YgQ29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yKSB7Ci0JCQkJY29tcG91bmRDb250ZW50QXNzaXN0UHJvY2Vzc29yID0gKENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcikgcHJvY2Vzc29yOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU3RydWN0dXJlZENvbnRlbnRBc3Npc3RhbnQgdXNlIENvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvciIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbXBvdW5kQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvciB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gY29udGVudAotCSAqIHR5cGUuIEFsc28gaW5zdGFsbHMgYW55IGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgdGhhdCB3ZXJlIGFkZGVkIGJ5Ci0JICogZXh0ZW5zaW9uIHBvaW50LgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50VHlwZQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGNvbnRlbnQgZm9yIHdoaWNoIHRoaXMgY29udGVudCBhc3Npc3RhbnQgaXMKLQkgKiAgICAgICAgICAgIHRvIGJlIHJlcXVlc3RlZAotCSAqIEByZXR1cm4gYW4gaW5zdGFuY2UgY29udGVudCBhc3Npc3QgcHJvY2Vzc29yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmCi0JICogICAgICAgICBub25lIGV4aXN0cyBmb3IgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUKLQkgKi8KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAoZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzID09IG51bGwgfHwgIWZJbnN0YWxsZWRFeHRlbmRlZENvbnRlbnRUeXBlcy5jb250YWlucyhwYXJ0aXRpb25UeXBlKSkgewotCQkJLy8gZ2V0IGV4dGVuZGVkIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5Ci0JCQkvLyBiZWVuIHNldAotCQkJTGlzdCBwcm9jZXNzb3JzID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldENvbmZpZ3VyYXRpb25zKENPTlRFTlRfQVNTSVNUX1BST0NFU1NPUl9FWFRFTkRFRF9JRCwgcGFydGl0aW9uVHlwZSk7Ci0JCQlpZiAocHJvY2Vzc29ycyAhPSBudWxsICYmICFwcm9jZXNzb3JzLmlzRW1wdHkoKSkgewotCQkJCUl0ZXJhdG9yIGl0ZXIgPSBwcm9jZXNzb3JzLml0ZXJhdG9yKCk7Ci0JCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgaXRlci5uZXh0KCk7Ci0JCQkJCXNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IocHJvY2Vzc29yLCBwYXJ0aXRpb25UeXBlKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBhZGQgcGFydGl0aW9uIHR5cGUgdG8gbGlzdCBvZiBleHRlbmRlZCBwYXJ0aXRpb24gdHlwZXMKLQkJCS8vIGluc3RhbGxlZCAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCBhbnkgZXh0ZW5kZWQgY29udGVudAotCQkJLy8gYXNzaXN0IHByb2Nlc3NvcnMgd2VyZSBpbnN0YWxsZWQgYmVjYXVzZSBkb250IHdhbnQgdG8gbG9vayBpdAotCQkJLy8gdXAgZXZlcnkgdGltZSkKLQkJCWlmIChmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMgPT0gbnVsbCkKLQkJCQlmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMuYWRkKHBhcnRpdGlvblR5cGUpOwotCQl9Ci0KLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yID0gc3VwZXIuZ2V0Q29udGVudEFzc2lzdFByb2Nlc3NvcihwYXJ0aXRpb25UeXBlKTsKLQkJcmV0dXJuIHByb2Nlc3NvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKSB7Ci0JCS8vIGRpc3Bvc2Ugb2YgYWxsIGNvbnRlbnQgYXNzaXN0IHByb2Nlc3NvcnMKLQkJaWYgKGZQcm9jZXNzb3JzICE9IG51bGwgJiYgIWZQcm9jZXNzb3JzLmlzRW1wdHkoKSkgewotCQkJQ29sbGVjdGlvbiBjb2xsZWN0aW9uID0gZlByb2Nlc3NvcnMudmFsdWVzKCk7Ci0JCQlJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJKChDb21wb3VuZENvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGl0ZXIubmV4dCgpKS5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQlmUHJvY2Vzc29ycy5jbGVhcigpOwotCQl9Ci0JCS8vIGNsZWFyIG91dCBsaXN0IG9mIGluc3RhbGxlZCBjb250ZW50IHR5cGVzCi0JCWlmIChmSW5zdGFsbGVkRXh0ZW5kZWRDb250ZW50VHlwZXMgIT0gbnVsbCkgewotCQkJZkluc3RhbGxlZEV4dGVuZGVkQ29udGVudFR5cGVzLmNsZWFyKCk7Ci0JCX0KLQkJc3VwZXIudW5pbnN0YWxsKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0NvbmZpZ3VyYWJsZUNvbnRlbnRPdXRsaW5lUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjRiNTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Db25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU2FmZVJ1bm5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uR3JvdXBNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5NZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkRlbGVnYXRpbmdEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkRlbGVnYXRpbmdEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlNhZmVSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Eb3VibGVDbGlja0V2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklEb3VibGVDbGlja0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRyYWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuVHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTWVudTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5Tb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5JU2hvd0luVGFyZ2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuSVNob3dJblRhcmdldExpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5TaG93SW5Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5JQ29udGVudE91dGxpbmVQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uOwotCi0KLXB1YmxpYyBjbGFzcyBDb25maWd1cmFibGVDb250ZW50T3V0bGluZVBhZ2UgZXh0ZW5kcyBDb250ZW50T3V0bGluZVBhZ2UgaW1wbGVtZW50cyBJQWRhcHRhYmxlIHsKLQkvKgotCSAqIE1lbnUgbGlzdGVuZXIgdG8gY3JlYXRlIHRoZSBhZGRpdGlvbnMgZ3JvdXAgYW5kIGFkZCBhbnkgbWVudSBpdGVtcwotCSAqIGNvbnRyaWJ1dGVkIGJ5IHRoZSBjb25maWd1cmF0aW9uOyByZXF1aXJlZCBzaW5jZSB0aGUgY29udGV4dCBtZW51IGlzCi0JICogY2xlYXJlZCBldmVyeSB0aW1lIGl0IGlzIHNob3duCi0JICovCi0JY2xhc3MgQWRkaXRpb25Hcm91cEFkZGVyIGltcGxlbWVudHMgSU1lbnVMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWFuYWdlcikgewotCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSBpdGVtcyA9IG1hbmFnZXIuZ2V0SXRlbXMoKTsKLQkJCWlmIChpdGVtcy5sZW5ndGggPiAwICYmIGl0ZW1zW2l0ZW1zLmxlbmd0aCAtIDFdLmdldElkKCkgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIuaW5zZXJ0QWZ0ZXIoaXRlbXNbaXRlbXMubGVuZ3RoIC0gMV0uZ2V0SWQoKSwgbmV3IEdyb3VwTWFya2VyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQltYW5hZ2VyLmFkZChuZXcgR3JvdXBNYXJrZXIoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NQl9BRERJVElPTlMpKTsKLQkJCX0KLQotCQkJLy8gYWRkIGNvbmZpZ3VyYXRpb24ncyBtZW51IGl0ZW1zCi0JCQlJTWVudUxpc3RlbmVyIGxpc3RlbmVyID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldE1lbnVMaXN0ZW5lcihnZXRUcmVlVmlld2VyKCkpOwotCQkJaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKLQkJCQlsaXN0ZW5lci5tZW51QWJvdXRUb1Nob3cobWFuYWdlcik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm92aWRlcyBkb3VibGUtY2xpY2sgcmVnaXN0cmF0aW9uIHNvIGl0IGNhbiBiZSBkb25lIGJlZm9yZSB0aGUgQ29udHJvbAotCSAqIGlzIGNyZWF0ZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBEb3VibGVDbGlja1Byb3ZpZGVyIGltcGxlbWVudHMgSURvdWJsZUNsaWNrTGlzdGVuZXIgewotCQlwcml2YXRlIElEb3VibGVDbGlja0xpc3RlbmVyW10gbGlzdGVuZXJzID0gbnVsbDsKLQotCQl2b2lkIGFkZERvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgbmV3TGlzdGVuZXIpIHsKLQkJCWlmIChsaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJCWxpc3RlbmVycyA9IG5ldyBJRG91YmxlQ2xpY2tMaXN0ZW5lcltde25ld0xpc3RlbmVyfTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlEb3VibGVDbGlja0xpc3RlbmVyW10gbmV3TGlzdGVuZXJzID0gbmV3IElEb3VibGVDbGlja0xpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGggKyAxXTsKLQkJCQlTeXN0ZW0uYXJyYXljb3B5KGxpc3RlbmVycywgMCwgbmV3TGlzdGVuZXJzLCAwLCBsaXN0ZW5lcnMubGVuZ3RoKTsKLQkJCQluZXdMaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aF0gPSBuZXdMaXN0ZW5lcjsKLQkJCQlsaXN0ZW5lcnMgPSBuZXdMaXN0ZW5lcnM7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb3VibGVDbGljayhEb3VibGVDbGlja0V2ZW50IGV2ZW50KSB7Ci0JCQlmaXJlRG91YmxlQ2xpY2tFdmVudChldmVudCk7Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmlyZURvdWJsZUNsaWNrRXZlbnQoZmluYWwgRG91YmxlQ2xpY2tFdmVudCBldmVudCkgewotCQkJSURvdWJsZUNsaWNrTGlzdGVuZXJbXSBmaXJpbmdMaXN0ZW5lcnMgPSBsaXN0ZW5lcnM7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpcmluZ0xpc3RlbmVycy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIElEb3VibGVDbGlja0xpc3RlbmVyIGwgPSBmaXJpbmdMaXN0ZW5lcnNbaV07Ci0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbC5kb3VibGVDbGljayhldmVudCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCXZvaWQgcmVtb3ZlRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBvbGRMaXN0ZW5lcikgewotCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJaWYgKGxpc3RlbmVycy5sZW5ndGggPT0gMSAmJiBsaXN0ZW5lcnNbMF0uZXF1YWxzKG9sZExpc3RlbmVyKSkgewotCQkJCQlsaXN0ZW5lcnMgPSBudWxsOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJTGlzdCBuZXdMaXN0ZW5lcnMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QobGlzdGVuZXJzKSk7Ci0JCQkJCW5ld0xpc3RlbmVycy5yZW1vdmUob2xkTGlzdGVuZXIpOwotCQkJCQlsaXN0ZW5lcnMgPSAoSURvdWJsZUNsaWNrTGlzdGVuZXJbXSkgbmV3TGlzdGVuZXJzLnRvQXJyYXkobmV3IElEb3VibGVDbGlja0xpc3RlbmVyW2xpc3RlbmVycy5sZW5ndGggLSAxXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogTGlzdGVucyB0byBwb3N0IHNlbGVjdGlvbiBmcm9tIHRoZSBzZWxlY3Rpb24gc2VydmljZSwgYXBwbHlpbmcgaXQgdG8KLQkgKiB0aGUgdHJlZSB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3N0U2VsZWN0aW9uU2VydmljZUxpc3RlbmVyIGltcGxlbWVudHMgSVNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkJLy8gZnJvbSBzZWxlY3Rpb24gc2VydmljZQotCQkJaWYgKF9ERUJVRykgewotCQkJCV9ERUJVR19USU1FID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQl9IC8qCi0JCQkJICogQnVnIDEzNjMxMCwgdW5sZXNzIHRoaXMgcGFnZSBpcyB0aGF0IHBhcnQncwotCQkJCSAqIElDb250ZW50T3V0bGluZVBhZ2UsIGlnbm9yZSB0aGUgc2VsZWN0aW9uIGNoYW5nZQotCQkJCSAqLwotCQkJaWYgKHBhcnQgPT0gbnVsbCB8fCBwYXJ0LmdldEFkYXB0ZXIoSUNvbnRlbnRPdXRsaW5lUGFnZS5jbGFzcykgPT0gQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlLnRoaXMpIHsKLQkJCQlJU2VsZWN0aW9uIHZhbGlkQ29udGVudFNlbGVjdGlvbiA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRTZWxlY3Rpb24oZ2V0VHJlZVZpZXdlcigpLCBzZWxlY3Rpb24pOwotCi0JCQkJYm9vbGVhbiBpc0xpbmtlZCA9IGdldENvbmZpZ3VyYXRpb24oKS5pc0xpbmtlZFdpdGhFZGl0b3IoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAoaXNMaW5rZWQpIHsKLQkJCQkJZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbih2YWxpZENvbnRlbnRTZWxlY3Rpb24sIHRydWUpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChfREVCVUcpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIihPOiIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBfREVCVUdfVElNRSkgKyAibXMpICIgKyBwYXJ0ICsgIiA6ICIgKyBzZWxlY3Rpb24pOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRm9yd2FyZHMgcG9zdC1zZWxlY3Rpb24gZnJvbSB0aGUgdHJlZSB2aWV3ZXIgdG8gdGhlIGxpc3RlbmVycyB3aGlsZQotCSAqIGFjdGluZyBhcyB0aGlzIHBhZ2UncyBzZWxlY3Rpb24gcHJvdmlkZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBTZWxlY3Rpb25Qcm92aWRlciBpbXBsZW1lbnRzIElQb3N0U2VsZWN0aW9uUHJvdmlkZXIgewotCQlwcml2YXRlIGNsYXNzIFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKCFpc0ZpcmluZ1NlbGVjdGlvbigpKSB7Ci0JCQkJCWZpcmVTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50LCBwb3N0TGlzdGVuZXJzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGNsYXNzIFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQlpZiAoIWlzRmlyaW5nU2VsZWN0aW9uKCkpIHsKLQkJCQkJZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQsIGxpc3RlbmVycyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSBib29sZWFuIGlzRmlyaW5nU2VsZWN0aW9uID0gZmFsc2U7Ci0JCXByaXZhdGUgTGlzdGVuZXJMaXN0IGxpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcG9zdExpc3RlbmVycyA9IG5ldyBMaXN0ZW5lckxpc3QoKTsKLQkJcHJpdmF0ZSBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpOwotCQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgc2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpOwotCi0JCXB1YmxpYyB2b2lkIGFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJcG9zdExpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZmlyZVNlbGVjdGlvbkNoYW5nZWQoZmluYWwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50LCBMaXN0ZW5lckxpc3QgbGlzdGVuZXJMaXN0KSB7Ci0JCQlpc0ZpcmluZ1NlbGVjdGlvbiA9IHRydWU7Ci0JCQlPYmplY3RbXSBsaXN0ZW5lcnMgPSBsaXN0ZW5lckxpc3QuZ2V0TGlzdGVuZXJzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7ICsraSkgewotCQkJCWZpbmFsIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbCA9IChJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJU2FmZVJ1bm5lci5ydW4obmV3IFNhZmVSdW5uYWJsZSgpIHsKLQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJbC5zZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJfQotCQkJaXNGaXJpbmdTZWxlY3Rpb24gPSBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGdldFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQlyZXR1cm4gcG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLQkJfQotCi0JCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJCWlmIChnZXRUcmVlVmlld2VyKCkgIT0gbnVsbCkgewotCQkJCXJldHVybiBnZXRUcmVlVmlld2VyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RydWN0dXJlZFNlbGVjdGlvbi5FTVBUWTsKLQkJfQotCi0JCXB1YmxpYyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGdldFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXJldHVybiBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0ZpcmluZ1NlbGVjdGlvbigpIHsKLQkJCXJldHVybiBpc0ZpcmluZ1NlbGVjdGlvbjsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZVBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJcG9zdExpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCWxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCQlpZiAoIWlzRmlyaW5nU2VsZWN0aW9uKSB7Ci0JCQkJZ2V0VHJlZVZpZXdlcigpLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTaG93SW5UYXJnZXQgaW1wbGVtZW50cyBJU2hvd0luVGFyZ2V0IHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXQjc2hvdyhvcmcuZWNsaXBzZS51aS5wYXJ0LlNob3dJbkNvbnRleHQpCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBzaG93KFNob3dJbkNvbnRleHQgY29udGV4dCkgewotCQkJc2V0U2VsZWN0aW9uKGNvbnRleHQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJcmV0dXJuIGdldFRyZWVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKS5lcXVhbHMoY29udGV4dC5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiBOVUxMX0NPTkZJR1VSQVRJT04gPSBuZXcgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uKCkgewotCQlwdWJsaWMgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJCXJldHVybiBuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGlucHV0Q2hhbmdlZChWaWV3ZXIgdmlld2VyLCBPYmplY3Qgb2xkSW5wdXQsIE9iamVjdCBuZXdJbnB1dCkgewotCQkJCX0KLQkJCX07Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVExJTkVfQ09OVEVYVF9NRU5VX0lEID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3IuT3V0bGluZUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUTElORV9DT05URVhUX01FTlVfU1VGRklYID0gIi5zb3VyY2UuT3V0bGluZUNvbnRleHQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBfREVCVUcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9jb250ZW50T3V0bGluZSIpKTsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJDsKLQotCXByaXZhdGUgbG9uZyBfREVCVUdfVElNRSA9IDA7Ci0KLQlwcml2YXRlIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZkFjdGl2ZURyYWdMaXN0ZW5lcnM7Ci0JcHJpdmF0ZSBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGZBY3RpdmVEcm9wTGlzdGVuZXJzOwotCXByaXZhdGUgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGZDb25maWd1cmF0aW9uOwotCi0JcHJpdmF0ZSBNZW51IGZDb250ZXh0TWVudTsKLQlwcml2YXRlIFN0cmluZyBmQ29udGV4dE1lbnVJZDsKLQotCXByaXZhdGUgTWVudU1hbmFnZXIgZkNvbnRleHRNZW51TWFuYWdlcjsKLQlwcml2YXRlIERvdWJsZUNsaWNrUHJvdmlkZXIgZkRvdWJsZUNsaWNrUHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBEZWxlZ2F0aW5nRHJhZ0FkYXB0ZXIgZkRyYWdBZGFwdGVyOwotCXByaXZhdGUgRHJhZ1NvdXJjZSBmRHJhZ1NvdXJjZTsKLQlwcml2YXRlIERlbGVnYXRpbmdEcm9wQWRhcHRlciBmRHJvcEFkYXB0ZXI7Ci0JcHJpdmF0ZSBEcm9wVGFyZ2V0IGZEcm9wVGFyZ2V0OwotCXByaXZhdGUgSUVkaXRvclBhcnQgZkVkaXRvcjsKLQlwcml2YXRlIElNZW51TGlzdGVuZXIgZkdyb3VwQWRkZXIgPSBudWxsOwotCXByaXZhdGUgT2JqZWN0IGZJbnB1dCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBmSW5wdXRDb250ZW50VHlwZUlkZW50aWZpZXIgPSBudWxsOwotCXByaXZhdGUgSVNlbGVjdGlvbkxpc3RlbmVyIGZTZWxlY3Rpb25MaXN0ZW5lciA9IG51bGw7Ci0KLQlTZWxlY3Rpb25Qcm92aWRlciBmU2VsZWN0aW9uUHJvdmlkZXIgPSBudWxsOwotCi0JLyoqCi0JICogQSBDb250ZW50T3V0bGluZVBhZ2UgdGhhdCBhYnN0cmFjdCBhcyBtdWNoIGJlaGF2aW9yIGFzIHBvc3NpYmxlIGF3YXkKLQkgKiBmcm9tIHRoZSBDb250cm9scyBhbmQgdmFyaWVzIGl0IGJ5IGNvbnRlbnQgdHlwZS4KLQkgKi8KLQlwdWJsaWMgQ29uZmlndXJhYmxlQ29udGVudE91dGxpbmVQYWdlKCkgewotCQlzdXBlcigpOwotCQlmR3JvdXBBZGRlciA9IG5ldyBBZGRpdGlvbkdyb3VwQWRkZXIoKTsKLQkJZlNlbGVjdGlvblByb3ZpZGVyID0gbmV3IFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyIHRvIGEgbGlzdCBvZiB0aG9zZSBub3RpZmllZCB3aGVuIHNvbWVvbmUgZG91YmxlLWNsaWNrcwotCSAqIGluIHRoZSBwYWdlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdMaXN0ZW5lciAtCi0JICogICAgICAgICAgICB0aGUgbGlzdGVuZXIgdG8gYWRkCi0JICovCi0JcHVibGljIHZvaWQgYWRkRG91YmxlQ2xpY2tMaXN0ZW5lcihJRG91YmxlQ2xpY2tMaXN0ZW5lciBuZXdMaXN0ZW5lcikgewotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIgPSBuZXcgRG91YmxlQ2xpY2tQcm92aWRlcigpOwotCQl9Ci0JCWZEb3VibGVDbGlja1Byb3ZpZGVyLmFkZERvdWJsZUNsaWNrTGlzdGVuZXIobmV3TGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNvbXB1dGVDb250ZXh0TWVudUlEKCkgewotCQlTdHJpbmcgaWQgPSBudWxsOwotCQlpZiAoZklucHV0Q29udGVudFR5cGVJZGVudGlmaWVyICE9IG51bGwpIHsKLQkJCWlkID0gZklucHV0Q29udGVudFR5cGVJZGVudGlmaWVyICsgT1VUTElORV9DT05URVhUX01FTlVfU1VGRklYOwotCQl9Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIENvbnRlbnRPdXRsaW5lUGFnZSNjcmVhdGVDb250cm9sCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyLmNyZWF0ZUNvbnRyb2wocGFyZW50KTsKLQotCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJZkVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCX0KLQotCQlmRHJhZ0FkYXB0ZXIgPSBuZXcgRGVsZWdhdGluZ0RyYWdBZGFwdGVyKCk7Ci0JCWZEcmFnU291cmNlID0gbmV3IERyYWdTb3VyY2UoZ2V0Q29udHJvbCgpLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkspOwotCQlmRHJvcEFkYXB0ZXIgPSBuZXcgRGVsZWdhdGluZ0Ryb3BBZGFwdGVyKCk7Ci0JCWZEcm9wVGFyZ2V0ID0gbmV3IERyb3BUYXJnZXQoZ2V0Q29udHJvbCgpLCBETkQuRFJPUF9DT1BZIHwgRE5ELkRST1BfTU9WRSB8IERORC5EUk9QX0xJTkspOwotCi0JCXNldENvbmZpZ3VyYXRpb24oZ2V0Q29uZmlndXJhdGlvbigpKTsKLQotCQkvKgotCQkgKiBDb250ZW50T3V0bGluZVBhZ2Ugb25seSBpbXBsZW1lbnRzIElTZWxlY3Rpb25Qcm92aWRlciB3aGlsZSB0aGUKLQkJICogdHJlZSB2aWV3ZXIgaW1wbGVtZW50cyBib3RoIElTZWxlY3Rpb25Qcm92aWRlciBhbmQKLQkJICogSVBvc3RTZWxlY3Rpb25Qcm92aWRlci4gVXNlIGFuIElTZWxlY3Rpb25Qcm92aWRlciB0aGF0IGxpc3RlbnMgdG8KLQkJICogcG9zdCBzZWxlY3Rpb24gZnJvbSB0aGUgdHJlZSB2aWV3ZXIgYW5kIGZvcndhcmQgb25seSBwb3N0IHNlbGVjdGlvbgotCQkgKiB0byB0aGUgc2VsZWN0aW9uIHNlcnZpY2UuCi0JCSAqLwotCQlnZXRUcmVlVmlld2VyKCkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0UG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpKTsKLQkJZ2V0VHJlZVZpZXdlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkpOwotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkRvdWJsZUNsaWNrUHJvdmlkZXIgPSBuZXcgRG91YmxlQ2xpY2tQcm92aWRlcigpOwotCQl9Ci0JCWdldFRyZWVWaWV3ZXIoKS5hZGREb3VibGVDbGlja0xpc3RlbmVyKGZEb3VibGVDbGlja1Byb3ZpZGVyKTsKLQkJZ2V0U2l0ZSgpLnNldFNlbGVjdGlvblByb3ZpZGVyKGZTZWxlY3Rpb25Qcm92aWRlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5yZW1vdmVQb3N0U2VsZWN0aW9uTGlzdGVuZXIoZ2V0U2VsZWN0aW9uU2VydmljZUxpc3RlbmVyKCkpOwotCQlpZiAoZkRvdWJsZUNsaWNrUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJZ2V0VHJlZVZpZXdlcigpLnJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoZkRvdWJsZUNsaWNrUHJvdmlkZXIpOwotCQl9Ci0KLQkJLy8gZGlzcG9zZSBtZW51IGNvbnRyb2xzCi0JCWlmIChmQ29udGV4dE1lbnUgIT0gbnVsbCkgewotCQkJZkNvbnRleHRNZW51LmRpc3Bvc2UoKTsKLQkJfQotCQlpZiAoZkNvbnRleHRNZW51TWFuYWdlciAhPSBudWxsKSB7Ci0JCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZU1lbnVMaXN0ZW5lcihmR3JvdXBBZGRlcik7Ci0JCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJZkNvbnRleHRNZW51TWFuYWdlci5kaXNwb3NlKCk7Ci0JCX0KLQkJc2V0Q29uZmlndXJhdGlvbihOVUxMX0NPTkZJR1VSQVRJT04pOwotCQlzdXBlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUFkYXB0YWJsZSNnZXRBZGFwdGVyKGphdmEubGFuZy5DbGFzcykKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEFkYXB0ZXIoQ2xhc3Mga2V5KSB7Ci0JCU9iamVjdCBhZGFwdGVyID0gbnVsbDsKLQkJaWYgKGtleS5lcXVhbHMoSVNob3dJblRhcmdldC5jbGFzcykpIHsKLQkJCWFkYXB0ZXIgPSBuZXcgU2hvd0luVGFyZ2V0KCk7Ci0JCX0KLQkJZmluYWwgSUVkaXRvclBhcnQgZWRpdG9yID0gZkVkaXRvcjsKLQotCQlpZiAoa2V5LmVxdWFscyhJU2hvd0luU291cmNlLmNsYXNzKSAmJiBlZGl0b3IgIT0gbnVsbCkgewotCQkJYWRhcHRlciA9IG5ldyBJU2hvd0luU291cmNlKCkgewotCQkJCXB1YmxpYyBTaG93SW5Db250ZXh0IGdldFNob3dJbkNvbnRleHQoKSB7Ci0JCQkJCXJldHVybiBuZXcgU2hvd0luQ29udGV4dChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSwgZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoSVNob3dJblRhcmdldExpc3QuY2xhc3MpICYmIGVkaXRvciAhPSBudWxsKSB7Ci0JCQlhZGFwdGVyID0gZWRpdG9yLmdldEFkYXB0ZXIoa2V5KTsKLQkJfQotCQlyZXR1cm4gYWRhcHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRoZSBjdXJyZW50bHkgdXNlZCBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbiA9IE5VTExfQ09ORklHVVJBVElPTjsKLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlciNnZXRTZWxlY3Rpb24oKQotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldFNlbGVjdGlvbigpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKTsKLQl9Ci0KLQlwcml2YXRlIElTZWxlY3Rpb25MaXN0ZW5lciBnZXRTZWxlY3Rpb25TZXJ2aWNlTGlzdGVuZXIoKSB7Ci0JCWlmIChmU2VsZWN0aW9uTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJZlNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFBvc3RTZWxlY3Rpb25TZXJ2aWNlTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gZlNlbGVjdGlvbkxpc3RlbmVyOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlQm9va1ZpZXdQYWdlI2luaXQob3JnLmVjbGlwc2UudWkucGFydC5JUGFnZVNpdGUpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdChJUGFnZVNpdGUgcGFnZVNpdGUpIHsKLQkJc3VwZXIuaW5pdChwYWdlU2l0ZSk7Ci0JCXBhZ2VTaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5hZGRQb3N0U2VsZWN0aW9uTGlzdGVuZXIoZ2V0U2VsZWN0aW9uU2VydmljZUxpc3RlbmVyKCkpOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgYSBsaXN0ZW5lciB0byBhIGxpc3Qgb2YgdGhvc2Ugbm90aWZpZWQgd2hlbiBzb21lb25lCi0JICogZG91YmxlLWNsaWNrcyBpbiB0aGUgcGFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gb2xkTGlzdGVuZXIgLQotCSAqICAgICAgICAgICAgdGhlIGxpc3RlbmVyIHRvIHJlbW92ZQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIoSURvdWJsZUNsaWNrTGlzdGVuZXIgb2xkTGlzdGVuZXIpIHsKLQkJaWYgKGZEb3VibGVDbGlja1Byb3ZpZGVyICE9IG51bGwpIHsKLQkJCWZEb3VibGVDbGlja1Byb3ZpZGVyLnJlbW92ZURvdWJsZUNsaWNrTGlzdGVuZXIob2xkTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29uZmlndXJlcyAob3IgcmVjb25maWd1cmVzKSB0aGUgcGFnZSBhY2NvcmRpbmcgdG8gdGhlIGdpdmVuCi0JICogY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbmZpZ3VyYXRpb24oQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKLQkJLy8gaW50ZW50aW9uYWxseSBkbyBub3QgY2hlY2sgdG8gc2VlIGlmIHRoZSBuZXcgY29uZmlndXJhdGlvbiAhPSBvbGQKLQkJLy8gY29uZmlndXJhdGlvbgotCQlpZiAoZ2V0VHJlZVZpZXdlcigpICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSB0aGUga2V5IGxpc3RlbmVycwotCQkJaWYgKGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJS2V5TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0S2V5TGlzdGVuZXJzKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKGxpc3RlbmVycyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlnZXRDb250cm9sKCkucmVtb3ZlS2V5TGlzdGVuZXIobGlzdGVuZXJzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJSUNvbnRyaWJ1dGlvbk1hbmFnZXIgdG9vbGJhciA9IGdldFNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0VG9vbEJhck1hbmFnZXIoKTsKLQkJCWlmICh0b29sYmFyICE9IG51bGwpIHsKLQkJCQlJQ29udHJpYnV0aW9uSXRlbVtdIHRvb2xiYXJJdGVtcyA9IGdldENvbmZpZ3VyYXRpb24oKS5nZXRUb29sYmFyQ29udHJpYnV0aW9ucyhnZXRUcmVlVmlld2VyKCkpOwotCQkJCWlmICh0b29sYmFySXRlbXMgIT0gbnVsbCAmJiB0b29sYmFySXRlbXMubGVuZ3RoID4gMCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHRvb2xiYXJJdGVtcy5sZW5ndGg7IGkrKykgewotCQkJCQkJdG9vbGJhci5yZW1vdmUodG9vbGJhckl0ZW1zW2ldKTsKLQkJCQkJfQotCQkJCQl0b29sYmFyLnVwZGF0ZShmYWxzZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlJQ29udHJpYnV0aW9uTWFuYWdlciBtZW51YmFyID0gZ2V0U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpOwotCQkJaWYgKG1lbnViYXIgIT0gbnVsbCkgewotCQkJCUlDb250cmlidXRpb25JdGVtW10gbWVudUl0ZW1zID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldE1lbnVDb250cmlidXRpb25zKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKG1lbnVJdGVtcyAhPSBudWxsICYmIG1lbnVJdGVtcy5sZW5ndGggPiAwKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQltZW51YmFyLnJlbW92ZShtZW51SXRlbXNbaV0pOwotCQkJCQl9Ci0JCQkJCW1lbnViYXIucmVtb3ZlKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTUJfQURESVRJT05TKTsKLQkJCQkJbWVudWJhci51cGRhdGUoZmFsc2UpOwotCQkJCX0KLQkJCX0KLQkJCS8vIGNsZWFyIHRoZSBEbkQgbGlzdGVuZXJzIGFuZCB0cmFuc2ZlciB0eXBlcwotCQkJaWYgKGZEcmFnQWRhcHRlciAhPSBudWxsICYmICFmRHJhZ0FkYXB0ZXIuaXNFbXB0eSgpICYmIGZEcmFnU291cmNlICE9IG51bGwgJiYgIWZEcmFnU291cmNlLmlzRGlzcG9zZWQoKSAmJiBmRHJhZ1NvdXJjZS5nZXRUcmFuc2ZlcigpLmxlbmd0aCA+IDApIHsKLQkJCQlpZiAoZkFjdGl2ZURyYWdMaXN0ZW5lcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZBY3RpdmVEcmFnTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlmRHJhZ0FkYXB0ZXIucmVtb3ZlRHJhZ1NvdXJjZUxpc3RlbmVyKGZBY3RpdmVEcmFnTGlzdGVuZXJzW2ldKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmQWN0aXZlRHJhZ0xpc3RlbmVycyA9IG51bGw7Ci0JCQkJZkRyYWdTb3VyY2UucmVtb3ZlRHJhZ0xpc3RlbmVyKGZEcmFnQWRhcHRlcik7Ci0JCQkJZkRyYWdTb3VyY2Uuc2V0VHJhbnNmZXIobmV3IFRyYW5zZmVyWzBdKTsKLQkJCX0KLQkJCWlmIChmRHJvcEFkYXB0ZXIgIT0gbnVsbCAmJiAhZkRyb3BBZGFwdGVyLmlzRW1wdHkoKSAmJiBmRHJvcFRhcmdldCAhPSBudWxsICYmICFmRHJvcFRhcmdldC5pc0Rpc3Bvc2VkKCkgJiYgZkRyb3BUYXJnZXQuZ2V0VHJhbnNmZXIoKS5sZW5ndGggPiAwKSB7Ci0JCQkJaWYgKGZBY3RpdmVEcm9wTGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQWN0aXZlRHJvcExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQkJZkRyb3BBZGFwdGVyLnJlbW92ZURyb3BUYXJnZXRMaXN0ZW5lcihmQWN0aXZlRHJvcExpc3RlbmVyc1tpXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZkFjdGl2ZURyb3BMaXN0ZW5lcnMgPSBudWxsOwotCQkJCWZEcm9wVGFyZ2V0LnJlbW92ZURyb3BMaXN0ZW5lcihmRHJvcEFkYXB0ZXIpOwotCQkJCWZEcm9wVGFyZ2V0LnNldFRyYW5zZmVyKG5ldyBUcmFuc2ZlclswXSk7Ci0JCQl9Ci0JCQlnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29udGVudFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSkuaW5wdXRDaGFuZ2VkKGdldFRyZWVWaWV3ZXIoKSwgZklucHV0LCBudWxsKTsKLQkJCS8vIHJlbGVhc2UgYW55IHRpZXMgdG8gdGhpcyB0cmVlIHZpZXdlcgotCQkJZ2V0Q29uZmlndXJhdGlvbigpLnVuY29uZmlndXJlKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCX0KLQotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0KLQkJaWYgKGdldFRyZWVWaWV3ZXIoKSAhPSBudWxsICYmIGdldENvbnRyb2woKSAhPSBudWxsICYmICFnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQkvLyAocmUpc2V0IHRoZSBwcm92aWRlcnMKLQkJCWdldFRyZWVWaWV3ZXIoKS5zZXRMYWJlbFByb3ZpZGVyKGdldENvbmZpZ3VyYXRpb24oKS5nZXRMYWJlbFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSkpOwotCQkJZ2V0VHJlZVZpZXdlcigpLnNldENvbnRlbnRQcm92aWRlcihnZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29udGVudFByb3ZpZGVyKGdldFRyZWVWaWV3ZXIoKSkpOwotCi0JCQkvLyB2aWV3IHRvb2xiYXIKLQkJCUlDb250cmlidXRpb25NYW5hZ2VyIHRvb2xiYXIgPSBnZXRTaXRlKCkuZ2V0QWN0aW9uQmFycygpLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCQlpZiAodG9vbGJhciAhPSBudWxsKSB7Ci0JCQkJSUNvbnRyaWJ1dGlvbkl0ZW1bXSB0b29sYmFySXRlbXMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0VG9vbGJhckNvbnRyaWJ1dGlvbnMoZ2V0VHJlZVZpZXdlcigpKTsKLQkJCQlpZiAodG9vbGJhckl0ZW1zICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0b29sYmFySXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCXRvb2xiYXIuYWRkKHRvb2xiYXJJdGVtc1tpXSk7Ci0JCQkJCX0KLQkJCQkJdG9vbGJhci51cGRhdGUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdmlldyBtZW51Ci0JCQlJQ29udHJpYnV0aW9uTWFuYWdlciBtZW51ID0gZ2V0U2l0ZSgpLmdldEFjdGlvbkJhcnMoKS5nZXRNZW51TWFuYWdlcigpOwotCQkJaWYgKG1lbnUgIT0gbnVsbCkgewotCQkJCUlDb250cmlidXRpb25JdGVtW10gbWVudUl0ZW1zID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldE1lbnVDb250cmlidXRpb25zKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQkJaWYgKG1lbnVJdGVtcyAhPSBudWxsKSB7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbWVudUl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQltZW51SXRlbXNbaV0uc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJCW1lbnUuYWRkKG1lbnVJdGVtc1tpXSk7Ci0JCQkJCQltZW51SXRlbXNbaV0udXBkYXRlKCk7Ci0JCQkJCX0KLQkJCQkJbWVudS51cGRhdGUodHJ1ZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gYWRkIHRoZSBhbGxvd2VkIERuRCBsaXN0ZW5lcnMgYW5kIHR5cGVzCi0JCQlUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltdIGRyYWdMaXN0ZW5lcnMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQlpZiAoZkRyYWdBZGFwdGVyICE9IG51bGwgJiYgZHJhZ0xpc3RlbmVycy5sZW5ndGggPiAwKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkcmFnTGlzdGVuZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWZEcmFnQWRhcHRlci5hZGREcmFnU291cmNlTGlzdGVuZXIoZHJhZ0xpc3RlbmVyc1tpXSk7Ci0JCQkJfQotCQkJCWZBY3RpdmVEcmFnTGlzdGVuZXJzID0gZHJhZ0xpc3RlbmVyczsKLQkJCQlmRHJhZ1NvdXJjZS5hZGREcmFnTGlzdGVuZXIoZkRyYWdBZGFwdGVyKTsKLQkJCQlmRHJhZ1NvdXJjZS5zZXRUcmFuc2ZlcihmRHJhZ0FkYXB0ZXIuZ2V0VHJhbnNmZXJzKCkpOwotCQkJfQotCQkJVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXSBkcm9wTGlzdGVuZXJzID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhnZXRUcmVlVmlld2VyKCkpOwotCQkJaWYgKGZEcm9wQWRhcHRlciAhPSBudWxsICYmIGRyb3BMaXN0ZW5lcnMubGVuZ3RoID4gMCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZHJvcExpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlmRHJvcEFkYXB0ZXIuYWRkRHJvcFRhcmdldExpc3RlbmVyKGRyb3BMaXN0ZW5lcnNbaV0pOwotCQkJCX0KLQkJCQlmQWN0aXZlRHJvcExpc3RlbmVycyA9IGRyb3BMaXN0ZW5lcnM7Ci0JCQkJZkRyb3BUYXJnZXQuYWRkRHJvcExpc3RlbmVyKGZEcm9wQWRhcHRlcik7Ci0JCQkJZkRyb3BUYXJnZXQuc2V0VHJhbnNmZXIoZkRyb3BBZGFwdGVyLmdldFRyYW5zZmVycygpKTsKLQkJCX0KLQkJCS8vIGFkZCB0aGUga2V5IGxpc3RlbmVycwotCQkJS2V5TGlzdGVuZXJbXSBsaXN0ZW5lcnMgPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0S2V5TGlzdGVuZXJzKGdldFRyZWVWaWV3ZXIoKSk7Ci0JCQlpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewotCQkJCQlnZXRDb250cm9sKCkuYWRkS2V5TGlzdGVuZXIobGlzdGVuZXJzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoZklucHV0ICE9IG51bGwpIHsKLQkJCXNldElucHV0KGZJbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogICAgICAgICAgICBUaGUgSUVkaXRvclBhcnQgdGhhdCAib3ducyIgdGhpcyBwYWdlLiBVc2VkIHRvIHN1cHBvcnQgdGhlCi0JICogICAgICAgICAgICAiU2hvdyBJbi4uLiIgbWVudS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFZGl0b3JQYXJ0KElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlmRWRpdG9yID0gZWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdJbnB1dAotCSAqICAgICAgICAgICAgVGhlIGlucHV0IGZvciB0aGUgcGFnZSdzIHZpZXdlci4gU2hvdWxkIG9ubHkgYmUgc2V0IGFmdGVyIGEKLQkgKiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gaGFzIGJlZW4gYXBwbGllZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dChPYmplY3QgbmV3SW5wdXQpIHsKLQkJZklucHV0ID0gbmV3SW5wdXQ7Ci0JCS8qCi0JCSAqIEludGVudGlvbmFsbHkgbm90IG9wdGltaXplZCBmb3IgY2hlY2tpbmcgbmV3IGlucHV0IHZzLiBvbGQgaW5wdXQgc28KLQkJICogdGhhdCBhbnkgZXhpc3RpbmcgY29udGVudCBwcm92aWRlcnMgY2FuIGJlIHVwZGF0ZWQKLQkJICovCi0JCWlmIChnZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJZ2V0VHJlZVZpZXdlcigpLnNldElucHV0KGZJbnB1dCk7Ci0JCQl1cGRhdGVDb250ZXh0TWVudUlkKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaWQgLQotCSAqICAgICAgICAgICAgdGhlIGNvbnRlbnQgdHlwZSBpZGVudGlmaWVyIHRvIHVzZSBmb3IgZnVydGhlciBleHRlbnNpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJbnB1dENvbnRlbnRUeXBlSWRlbnRpZmllcihTdHJpbmcgaWQpIHsKLQkJZklucHV0Q29udGVudFR5cGVJZGVudGlmaWVyID0gaWQ7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyB0aGUgb3V0bGluZSBwYWdlJ3MgY29udGV4dCBtZW51IGZvciB0aGUgY3VycmVudCBpbnB1dAotCSAqLwotCXByaXZhdGUgdm9pZCB1cGRhdGVDb250ZXh0TWVudUlkKCkgewotCQlTdHJpbmcgY29tcHV0ZWRDb250ZXh0TWVudUlkID0gbnVsbDsKLQkJLy8gdXBkYXRlIG91dGxpbmUgdmlldydzIGNvbnRleHQgbWVudSBjb250cm9sIGFuZCBJRAotCi0JCWlmIChmRWRpdG9yID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBnZXRTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCWZFZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJfQotCQl9Ci0KLQkJY29tcHV0ZWRDb250ZXh0TWVudUlkID0gY29tcHV0ZUNvbnRleHRNZW51SUQoKTsKLQotCQlpZiAoY29tcHV0ZWRDb250ZXh0TWVudUlkID09IG51bGwpIHsKLQkJCWNvbXB1dGVkQ29udGV4dE1lbnVJZCA9IE9VVExJTkVfQ09OVEVYVF9NRU5VX0lEOwotCQl9Ci0KLQkJLyoKLQkJICogVXBkYXRlIG91dGxpbmUgY29udGV4dCBtZW51IGlkIGlmIHVwZGF0aW5nIHRvIGEgbmV3IGlkIG9yIGlmCi0JCSAqIGNvbnRleHQgbWVudSBpcyBub3QgYWxyZWFkeSBzZXQgdXAKLQkJICovCi0JCWlmICghY29tcHV0ZWRDb250ZXh0TWVudUlkLmVxdWFscyhmQ29udGV4dE1lbnVJZCkgfHwgKGZDb250ZXh0TWVudSA9PSBudWxsKSkgewotCQkJZkNvbnRleHRNZW51SWQgPSBjb21wdXRlZENvbnRleHRNZW51SWQ7Ci0KLQkJCWlmIChnZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCS8vIGRpc3Bvc2Ugb2YgcHJldmlvdXMgY29udGV4dCBtZW51Ci0JCQkJaWYgKGZDb250ZXh0TWVudSAhPSBudWxsKSB7Ci0JCQkJCWZDb250ZXh0TWVudS5kaXNwb3NlKCk7Ci0JCQkJfQotCQkJCWlmIChmQ29udGV4dE1lbnVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQkJZkNvbnRleHRNZW51TWFuYWdlci5yZW1vdmVNZW51TGlzdGVuZXIoZkdyb3VwQWRkZXIpOwotCQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLnJlbW92ZUFsbCgpOwotCQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLmRpc3Bvc2UoKTsKLQkJCQl9Ci0KLQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyID0gbmV3IE1lbnVNYW5hZ2VyKGZDb250ZXh0TWVudUlkLCBmQ29udGV4dE1lbnVJZCk7Ci0JCQkJZkNvbnRleHRNZW51TWFuYWdlci5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0KLQkJCQlmQ29udGV4dE1lbnVNYW5hZ2VyLmFkZE1lbnVMaXN0ZW5lcihmR3JvdXBBZGRlcik7Ci0KLQkJCQlmQ29udGV4dE1lbnUgPSBmQ29udGV4dE1lbnVNYW5hZ2VyLmNyZWF0ZUNvbnRleHRNZW51KGdldENvbnRyb2woKSk7Ci0JCQkJZ2V0Q29udHJvbCgpLnNldE1lbnUoZkNvbnRleHRNZW51KTsKLQotCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KGZDb250ZXh0TWVudUlkLCBmQ29udGV4dE1lbnVNYW5hZ2VyLCB0aGlzKTsKLQotCQkJCS8qCi0JCQkJICogYWxzbyByZWdpc3RlciB0aGlzIG1lbnUgZm9yIHNvdXJjZSBwYWdlIHBhcnQgYW5kIHN0cnVjdHVyZWQKLQkJCQkgKiB0ZXh0IG91dGxpbmUgdmlldyBpZHMKLQkJCQkgKi8KLQkJCQlpZiAoZkVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBwYXJ0SWQgPSBmRWRpdG9yLmdldFNpdGUoKS5nZXRJZCgpOwotCQkJCQlpZiAocGFydElkICE9IG51bGwpIHsKLQkJCQkJCWdldFNpdGUoKS5yZWdpc3RlckNvbnRleHRNZW51KHBhcnRJZCArIE9VVExJTkVfQ09OVEVYVF9NRU5VX1NVRkZJWCwgZkNvbnRleHRNZW51TWFuYWdlciwgdGhpcyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZ2V0U2l0ZSgpLnJlZ2lzdGVyQ29udGV4dE1lbnUoT1VUTElORV9DT05URVhUX01FTlVfSUQsIGZDb250ZXh0TWVudU1hbmFnZXIsIHRoaXMpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9JSkZhY2VOb2RlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTk2ZDVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9JSkZhY2VOb2RlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUpGYWNlTm9kZUFkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBub2RlKTsKLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBUaGVzZSBhcmUgdGhlIHRvcCBsZXZlbCBpdGVtcyBpbiBhIGxpc3QsIHRyZWUsIHRhYmxlLCBldGMuLi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG5vZGUpOwotCi0JLyoqCi0JICogRmV0Y2hlcyB0aGUgbGFiZWwgaW1hZ2Ugc3BlY2lmaWMgdG8gdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIEltYWdlIGdldExhYmVsSW1hZ2UoT2JqZWN0IG5vZGUpOwotCi0JLyoqCi0JICogRmV0Y2hlcyB0aGUgbGFiZWwgdGV4dCBzcGVjaWZpYyB0byB0aGlzIG9iamVjdCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsVGV4dChPYmplY3Qgbm9kZSk7Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3Qgbm9kZSk7Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3Qgbm9kZSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDdmZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0lKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpOwotCi0JLyoqCi0JICogcmV0dXJucyAiY29weSIgc28gbm8gb25lIGNhbiBtb2RpZnkgb3VyIGxpc3QuIEl0cyBpcyBhIHNoYWxsb3cgY29weS4KLQkgKi8KLQlwdWJsaWMgQ29sbGVjdGlvbiBnZXRMaXN0ZW5lcnMoKTsKLQotCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKE9iamVjdCBsaXN0ZW5lcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTUzOGMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotCi0vKioKLSAqIEFuIElBY3Rpb24uQVNfQ0hFQ0tfQk9YIGFjdGlvbiB0aGF0IHNldHMgYW5kIGdldHMgaXRzIGNoZWNrZWQgc3RhdGUgYWxvbmcKLSAqIHdpdGggYSB2YWx1ZSBmcm9tIGEgcHJlZmVyZW5jZSBzdG9yZS4gU2hvdWxkIGJlIHVzZWQgd2l0aAotICogUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIHRvIGxpc3RlbiB0byBjaGFuZ2VzIGluIHRoZQotICogc3RvcmUgYW5kIHVwZGF0ZSB0aGUgY2hlY2tlZCBzdGF0ZSBmcm9tIFByb3BlcnR5Q2hhbmdlRXZlbnRzLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gaW1wbGVtZW50cyBJVXBkYXRlIHsKLQlwcml2YXRlIFN0cmluZyBmUHJlZmVyZW5jZUtleTsKLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlN0b3JlOwotCXByaXZhdGUgYm9vbGVhbiBmVXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlID0gdHJ1ZTsKLQotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbihTdHJpbmcgdGV4dCwgSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIHByZWZlcmVuY2VLZXksIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7Ci0JCXN1cGVyKHRleHQsIElBY3Rpb24uQVNfQ0hFQ0tfQk9YKTsKLQkJZlByZWZlcmVuY2VLZXkgPSBwcmVmZXJlbmNlS2V5OwotCQlmU3RvcmUgPSBzdG9yZTsKLQkJZlN0b3JlLnNldERlZmF1bHQoZ2V0UHJlZmVyZW5jZUtleSgpLCBkZWZhdWx0VmFsdWUpOwotCQlzZXRJZChnZXRQcmVmZXJlbmNlS2V5KCkpOwotCQlzZXRDaGVja2VkKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oZ2V0UHJlZmVyZW5jZUtleSgpKSk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBvcmRlclByZWZlcmVuY2VLZXkuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQcmVmZXJlbmNlS2V5KCkgewotCQlyZXR1cm4gZlByZWZlcmVuY2VLZXk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBzdG9yZS4KLQkgKi8KLQlwdWJsaWMgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBmU3RvcmU7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB1cGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UoKSB7Ci0JCXJldHVybiBmVXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHJ1bigpIHsKLQkJc3VwZXIucnVuKCk7Ci0JCWZTdG9yZS5zZXRWYWx1ZShnZXRQcmVmZXJlbmNlS2V5KCksIGlzQ2hlY2tlZCgpKTsKLQkJaWYgKCFpc1VwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZSgpKQotCQkJdXBkYXRlKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZQotCSAqICAgICAgICAgICAgVGhlIHVwZGF0ZUZyb21Qcm9wZXJ0eUNoYW5nZSB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlKGJvb2xlYW4gdXBkYXRlRnJvbVByb3BlcnR5Q2hhbmdlKSB7Ci0JCWZVcGRhdGVGcm9tUHJvcGVydHlDaGFuZ2UgPSB1cGRhdGVGcm9tUHJvcGVydHlDaGFuZ2U7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzZXRDaGVja2VkKGZTdG9yZS5nZXRCb29sZWFuKGdldFByZWZlcmVuY2VLZXkoKSkpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1Byb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzY0MmVhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlOwotCi0vKioKLSAqIEEgbGlzdGVuZXIgb24gdGhlIGdpdmVuIGFjdGlvbidzIFByZWZlcmVuY2VTdG9yZS4gSXQgY2FsbHMgLnVwZGF0ZSgpIG9uIHRoZQotICogYWN0aW9uIHdoZW4gdGhlIGdpdmVuIGtleSBjaGFuZ2VzIHZhbHVlLgotICovCi1wdWJsaWMgY2xhc3MgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIGV4dGVuZHMgQWN0aW9uQ29udHJpYnV0aW9uSXRlbSB7Ci0KLQlwcml2YXRlIGNsYXNzIFByZWZlcmVuY2VVcGRhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQkJaWYgKGV2ZW50LmdldFByb3BlcnR5KCkuZXF1YWxzKGZQcm9wZXJ0eSkpIHsKLQkJCQlpZiAoZGVidWcpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGZQcm9wZXJ0eSArICIgcHJlZmVyZW5jZSBjaGFuZ2VkLCB1cGRhdGluZyAiICsgZ2V0QWN0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJCSgoSVVwZGF0ZSkgZ2V0QWN0aW9uKCkpLnVwZGF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0Jc3RhdGljIGZpbmFsIGJvb2xlYW4gZGVidWcgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9wcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0iKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQ7Ci0KLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZMaXN0ZW5lciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGZQcm9wZXJ0eSA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGZTdG9yZTsKLQotCXB1YmxpYyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0oUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gYWN0aW9uKSB7Ci0JCXN1cGVyKGFjdGlvbik7Ci0JCWZQcm9wZXJ0eSA9IGFjdGlvbi5nZXRQcmVmZXJlbmNlS2V5KCk7Ci0JCWZTdG9yZSA9IGFjdGlvbi5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJZkxpc3RlbmVyID0gbmV3IFByZWZlcmVuY2VVcGRhdGVMaXN0ZW5lcigpOwotCQljb25uZWN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY29ubmVjdCgpIHsKLQkJaWYgKGRlYnVnKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uQ29udHJpYnV0aW9uSXRlbSBzdGFydGVkIGxpc3RlbmluZyBmb3IgIiArIGZQcm9wZXJ0eSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlpZiAoZlN0b3JlICE9IG51bGwpIHsKLQkJCWZTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotCQlpZiAoZGVidWcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIHN0b3BwZWQgbGlzdGVuaW5nIGZvciAiICsgZlByb3BlcnR5KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWlmIChmU3RvcmUgIT0gbnVsbCkgewotCQkJZlN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJZGlzY29ubmVjdCgpOwotCQlmUHJvcGVydHkgPSBudWxsOwotCQlmU3RvcmUgPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCWlmIChnZXRBY3Rpb24oKS5nZXRJZCgpICE9IG51bGwpCi0JCQlyZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKLQkJZWxzZQotCQkJcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIih0ZXh0PSIgKyBnZXRBY3Rpb24oKS5nZXRUZXh0KCkgKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db21ib0xpc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db21ib0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZWI1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBQZW9wbGUgc2hvdWxkIG1hbmFnZSB0aGVpciBvd24gY29tYm8vbGlzdAotICovCi1wdWJsaWMgY2xhc3MgQ29tYm9MaXN0IHsKLQlwcml2YXRlIENvbWJvIGNvbWJvOwotCi0KLQlwcml2YXRlIExpc3QgbGlzdDsKLQotCXB1YmxpYyBDb21ib0xpc3QoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCWNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgc3R5bGUpOwotCQlsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCi0JLyoKLQkgKiBmb2xsb3dpbmcgbWV0aG9kcyBpcyBvcmlnaW5hbCBtZXRob2Qgb2YgQ29tYm8gY2xhc3MuCi0JICovCi0JcHVibGljIHZvaWQgYWRkKFN0cmluZyBrZXkpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5hZGQoa2V5KTsKLQkJbGlzdC5hZGQoa2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGtleSwgaW50IGluZGV4KSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8uYWRkKGtleSwgaW5kZXgpOwotCQlsaXN0LmFkZChpbmRleCwga2V5KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJY29tYm8uYWRkKGtleSk7Ci0JCWxpc3QuYWRkKHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJY2hlY2tFcnJvcigpOwotCQljb21iby5hZGQoa2V5LCBpbmRleCk7Ci0JCWxpc3QuYWRkKGluZGV4LCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRm9jdXNMaXN0ZW5lcihGb2N1c0xpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWNvbWJvLmFkZEZvY3VzTGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZE1vZGlmeUxpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY29tYm8uYWRkTW9kaWZ5TGlzdGVuZXIobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFNlbGVjdGlvbkxpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJY29tYm8uYWRkU2VsZWN0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRXJyb3IoKSB7Ci0JCWlmICghaXNDb25zaXN0ZW5jeSgpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiRGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBudW1iZXIgb2Yga2V5c1siICsgY29tYm8uZ2V0SXRlbUNvdW50KCkgKyAiXSBhbmQgdGhlIG51bWJlciBvZiB2YWx1ZXNbIiArIGxpc3Quc2l6ZSgpICsgIl0gaW4gQ29tYm9MaXN0Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50IGNvbXB1dGVTaXplKGludCB3SGludCwgaW50IGhIaW50KSB7Ci0JCXJldHVybiBjb21iby5jb21wdXRlU2l6ZSh3SGludCwgaEhpbnQpOwotCX0KLQotCXB1YmxpYyBNYXAgY3JlYXRlSGFzaHRhYmxlKCkgewotCQljaGVja0Vycm9yKCk7Ci0JCU1hcCBtID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspCi0JCQltLnB1dChjb21iby5nZXRJdGVtKGkpLCBsaXN0LmdldChpKSk7Ci0JCXJldHVybiBtOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0KGludCBpKSB7Ci0JCWNvbWJvLmRlc2VsZWN0KGkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlc2VsZWN0QWxsKCkgewotCQljb21iby5kZXNlbGVjdEFsbCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCXJldHVybiBjb21iby5lcXVhbHMob2JqKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZXhjaGFuZ2VQb3NpdGlvbihpbnQgaSwgaW50IGopIHsKLQkJU3RyaW5nIHRtcEtleSA9IGdldEl0ZW0oaSk7Ci0JCU9iamVjdCB0bXBWYWx1ZSA9IGxpc3QucmVtb3ZlKGkpOwotCi0JCWNvbWJvLnNldEl0ZW0oaSwgZ2V0SXRlbShqKSk7Ci0JCWxpc3QuYWRkKGksIGxpc3QucmVtb3ZlKGogLSAxKSk7Ci0KLQkJY29tYm8uc2V0SXRlbShqLCB0bXBLZXkpOwotCQlsaXN0LmFkZChqLCB0bXBWYWx1ZSk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzQXNLZXkoU3RyaW5nIHN0cikgewotCQlpZiAoY29tYm8uaW5kZXhPZihzdHIpID49IDApCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGV4aXN0c0FzVmFsdWUoU3RyaW5nIHN0cikgewotCQlpZiAobGlzdC5pbmRleE9mKHN0cikgPj0gMCkKLQkJCXJldHVybiB0cnVlOwotCQllbHNlCi0JCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEVuYWJsZWQoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEl0ZW0oaW50IGluZGV4KSB7Ci0JCXJldHVybiBjb21iby5nZXRJdGVtKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldEl0ZW1Db3VudCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0S2V5KFN0cmluZyB2YWx1ZSkgewotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJY2hlY2tFcnJvcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmICghbGlzdC5nZXQoaSkuZXF1YWxzKHZhbHVlKSkKLQkJCQljb250aW51ZTsKLQkJCWluZGV4ID0gaTsKLQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpbmRleCAhPSAtMSkKLQkJCXJldHVybiBjb21iby5nZXRJdGVtKGluZGV4KTsKLQkJZWxzZQotCQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRMYXlvdXREYXRhKCkgewotCQlyZXR1cm4gY29tYm8uZ2V0TGF5b3V0RGF0YSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VsZWN0ZWRWYWx1ZSgpIHsKLQkJY2hlY2tFcnJvcigpOwotCQlpbnQgaW5kZXggPSBnZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBnZXRWYWx1ZShnZXRJdGVtKGluZGV4KSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRTZWxlY3Rpb25JbmRleCgpIHsKLQkJcmV0dXJuIGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlyZXR1cm4gY29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIGtleSkgewotCQlpZiAoa2V5ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWNoZWNrRXJyb3IoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb21iby5nZXRJdGVtQ291bnQoKTsgaSsrKSB7Ci0JCQlpZiAoIWNvbWJvLmdldEl0ZW0oaSkuZXF1YWxzKGtleSkpCi0JCQkJY29udGludWU7Ci0JCQlpbmRleCA9IGk7Ci0JCQlicmVhazsKLQkJfQotCQlpZiAoaW5kZXggIT0gLTEpCi0JCQlyZXR1cm4gKFN0cmluZykgbGlzdC5nZXQoaW5kZXgpOwotCQllbHNlCi0JCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgaW50IGluZGV4T2YoU3RyaW5nIHN0cikgewotCQlyZXR1cm4gY29tYm8uaW5kZXhPZihzdHIpOwotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNDb25zaXN0ZW5jeSgpIHsKLQotCQlpZiAobGlzdC5zaXplKCkgPT0gY29tYm8uZ2V0SXRlbUNvdW50KCkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJZWxzZQotCQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLnJlbW92ZShpbmRleCk7Ci0JCWxpc3QucmVtb3ZlKGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmUoU3RyaW5nIHN0cikgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLnJlbW92ZShzdHIpOwotCQlsaXN0LnJlbW92ZShzdHIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdChpbnQgaW5kZXgpIHsKLQkJY29tYm8uc2VsZWN0KGluZGV4KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQljb21iby5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldEZvY3VzKCkgewotCQlyZXR1cm4gY29tYm8uc2V0Rm9jdXMoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRJdGVtKGludCBpbmRleCwgU3RyaW5nIHN0cikgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLnNldEl0ZW0oaW5kZXgsIHN0cik7Ci0JCWxpc3QucmVtb3ZlKGluZGV4KTsKLQkJbGlzdC5hZGQoaW5kZXgsIHN0cik7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SXRlbShTdHJpbmdbXSBzdHJBcnJheSkgewotCQljaGVja0Vycm9yKCk7Ci0JCWNvbWJvLnNldEl0ZW1zKHN0ckFycmF5KTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzdHJBcnJheS5sZW5ndGg7IGkrKykKLQkJCWxpc3QuYWRkKHN0ckFycmF5W2ldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMYXlvdXQob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGF5b3V0IGxvKSB7Ci0JCWNvbWJvLnNldExheW91dChsbyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGF5b3V0RGF0YShPYmplY3QgbGF5b3V0RGF0YSkgewotCQljb21iby5zZXRMYXlvdXREYXRhKGxheW91dERhdGEpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlbGVjdGlvbihQb2ludCBwb2ludCkgewotCQljb21iby5zZXRTZWxlY3Rpb24ocG9pbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHN0cikgewotCQljb21iby5zZXRUZXh0KHN0cik7Ci0JfQotCi0JcHVibGljIHZvaWQgc29ydEJ5S2V5KGludCBvZmZzZXQpIHsKLQkJaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gdGhpcy5jb21iby5nZXRJdGVtQ291bnQoKSAtIDEpCi0JCQlyZXR1cm47Ci0JCWNoZWNrRXJyb3IoKTsKLQkJLy8KLQkJZm9yIChpbnQgaSA9IG9mZnNldDsgaSA8IGNvbWJvLmdldEl0ZW1Db3VudCgpIC0gMTsgaSsrKSB7Ci0JCQlmb3IgKGludCBqID0gaSArIDE7IGogPCBjb21iby5nZXRJdGVtQ291bnQoKTsgaisrKSB7Ci0JCQkJaWYgKGdldEl0ZW0oaSkuY29tcGFyZVRvKGdldEl0ZW0oaikpID4gMCkgewotCQkJCQlleGNoYW5nZVBvc2l0aW9uKGksIGopOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvbnRlbnRwcm9wZXJ0aWVzL3VpL0NvbWJvTGlzdE9uUHJvcGVydHlQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ2YzUxNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50cHJvcGVydGllcy51aTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGVvcGxlIHNob3VsZCBtYW5hZ2UgdGhlaXIgb3duIGNvbWJvL2xpc3QKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGV4dGVuZHMgQ29tYm9MaXN0IHsKLQotCi0JcHJpdmF0ZSBTdHJpbmcgY3VycmVudEFwcGx5VmFsdWU7Ci0KLQlwdWJsaWMgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlKSB7Ci0JCXN1cGVyKHBhcmVudCwgc3R5bGUpOwotCX0KLQotCXB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0QXBwbHlWYWx1ZSgpIHsKLQkJcmV0dXJuIGN1cnJlbnRBcHBseVZhbHVlOwotCX0KLQotCXB1YmxpYyBmaW5hbCB2b2lkIHNldEFwcGx5VmFsdWUoU3RyaW5nIGN1cnJlbnRBcHBseVZhbHVlKSB7Ci0JCXRoaXMuY3VycmVudEFwcGx5VmFsdWUgPSBjdXJyZW50QXBwbHlWYWx1ZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb250ZW50cHJvcGVydGllcy91aS9Db250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxNTAxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29udGVudHByb3BlcnRpZXMvdWkvQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuUHJvcGVydHlQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ29udGVudFNldHRpbmdzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMuQ29udGVudFNldHRpbmdzQ3JlYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLklDb250ZW50U2V0dGluZ3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZQotICogICAgICAgICAgICAgb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudHByb3BlcnRpZXMudWkuV2ViQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlCi0gKiAgICAgICAgICAgICBvcgotICogICAgICAgICAgICAgZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLmNvbnRlbnRwcm9wZXJ0aWVzLnVpLkNTU1dlYkNvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZQotICogICAgICAgICAgICAgaW5zdGVhZAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudFNldHRpbmdzUHJvcGVydHlQYWdlIGV4dGVuZHMgUHJvcGVydHlQYWdlIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBJU3RhdHVzIFNUQVRVU19FUlJPUiA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuSU5GTywgIkVSUk9SIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGZvciB2YWxpZGF0ZUVkaXQoKQotCXByaXZhdGUgc3RhdGljIGZpbmFsIElTdGF0dXMgU1RBVFVTX09LID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5PSywgIk9LIiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIE1ldGhvZCB2YWxpZGF0ZUVkaXQuCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlCi0JICogQHBhcmFtIGNvbnRleHQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsCi0JICogQHJldHVybiBJU3RhdHVzCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyB2YWxpZGF0ZUVkaXQoSUZpbGUgZmlsZSwgU2hlbGwgY29udGV4dCkgewotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKLQkJaWYgKCEoZmlsZS5pc1JlYWRPbmx5KCkpKQotCQkJcmV0dXJuIFNUQVRVU19PSzsKLQotCQlJUGF0aCBmdWxsSVBhdGggPSBmaWxlLmdldExvY2F0aW9uKCk7Ci0KLQkJZmluYWwgbG9uZyBiZWZvcmVNb2RpZmllZEZyb21KYXZhSU8gPSBmdWxsSVBhdGgudG9GaWxlKCkubGFzdE1vZGlmaWVkKCk7Ci0JCWZpbmFsIGxvbmcgYmVmb3JlTW9kaWZpZWRGcm9tSUZpbGUgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0KLQkJSVN0YXR1cyBzdGF0dXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkudmFsaWRhdGVFZGl0KG5ldyBJRmlsZVtde2ZpbGV9LCBjb250ZXh0KTsKLQkJaWYgKCFzdGF0dXMuaXNPSygpKQotCQkJcmV0dXJuIHN0YXR1czsKLQotCQlmaW5hbCBsb25nIGFmdGVyTW9kaWZpZWRGcm9tSmF2YUlPID0gZnVsbElQYXRoLnRvRmlsZSgpLmxhc3RNb2RpZmllZCgpOwotCQlmaW5hbCBsb25nIGFmdGVyTW9kaWZpZWRGcm9tSUZpbGUgPSBmaWxlLmdldE1vZGlmaWNhdGlvblN0YW1wKCk7Ci0KLQkJaWYgKGJlZm9yZU1vZGlmaWVkRnJvbUphdmFJTyAhPSBhZnRlck1vZGlmaWVkRnJvbUphdmFJTykgewotCQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBtYW5hZ2VyLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGZpbGUpOwotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlpZiAoIW1vZGVsLmlzRGlydHkoKSkgewotCQkJCQl0cnkgewotCQkJCQkJZmlsZS5yZWZyZXNoTG9jYWwoSVJlc291cmNlLkRFUFRIX09ORSwgbnVsbCk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQkJcmV0dXJuIFNUQVRVU19FUlJPUjsKLQkJCQkJfQotCQkJCQlmaW5hbGx5IHsKLQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAoKGJlZm9yZU1vZGlmaWVkRnJvbUphdmFJTyAhPSBhZnRlck1vZGlmaWVkRnJvbUphdmFJTykgfHwgKGJlZm9yZU1vZGlmaWVkRnJvbUlGaWxlICE9IGFmdGVyTW9kaWZpZWRGcm9tSUZpbGUpKSB7Ci0JCQkvLyB0aGUgZmlsZSBpcyByZXBsYWNlZC4gTW9kaWZpY2F0aW9uIGNhbm5vdCBiZQotCQkJLy8gYXBwbGllZC4KLQkJCXJldHVybiBTVEFUVVNfRVJST1I7Ci0JCX0KLQkJcmV0dXJuIFNUQVRVU19PSzsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2VbXSBjb21ibzsKLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNvbXBvc2l0ZTsKLQotCXByb3RlY3RlZCBJQ29udGVudFNldHRpbmdzIGNvbnRlbnRTZXR0aW5nczsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIENTU19MQUJFTCA9IFNTRVVJTWVzc2FnZXMuVUlfQ1NTX3Byb2ZpbGVfX18yOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBERVZJQ0VfTEFCRUwgPSBTU0VVSU1lc3NhZ2VzLlVJX1RhcmdldF9EZXZpY2VfX18zOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERPQ1VNRU5UX0xBQkVMID0gU1NFVUlNZXNzYWdlcy5VSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzE7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgaW50IG51bWJlck9mQ29tYm87Ci0JcHJvdGVjdGVkIGludCBudW1Db2xzID0gMTsKLQlwcm90ZWN0ZWQgaW50IG51bVJvd3MgPSAxOwotCXByb3RlY3RlZCBDb21wb3NpdGUgcHJvcGVydHlQYWdlOwotCi0JcHVibGljIENvbnRlbnRTZXR0aW5nc1Byb3BlcnR5UGFnZSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2xlYW5VcCgpIHsKLQkJLy8gQXJlIFRoZXJlIGFueSB3YXkgdG8gZ3VhcmFudGVlIHRvIGNhbGwgY2xlYW5VcCgpIHRvIHJlLWxvYWQKLQkJLy8gZG93bmxvYWRlZCAuY29udGVudHNldHRpbmdzIGZpbGUKLQkJLy8gYWZ0ZXIgQ29udGVudFNldHRpbmdzLnJlbGVhc2VDYWNoZSgpIGluIENvbnRlbnRTZXR0aW5nU2VsZkhhbmRsZXIKLQkJLy8gY2xhc3MsIHdoaWNoIGlzIGNhbGxlZCBieSByZXNvdXJjZUNoYW5nZUV2ZW50Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29tYm9MaXN0T25Qcm9wZXJ0eVBhZ2UgY3JlYXRlQ29tYm9Cb3hPZihTdHJpbmcgdGl0bGUpIHsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwcm9wZXJ0eVBhZ2UsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0aXRsZSk7Ci0JCWlmICh0aXRsZSAhPSBudWxsICYmIHRpdGxlLnN0YXJ0c1dpdGgoU1NFVUlNZXNzYWdlcy5VSV9EZWZhdWx0X0hUTUxfRE9DVFlQRV9JRF9fXzEpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDEwOwotCQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJfQotCQlDb21ib0xpc3RPblByb3BlcnR5UGFnZSBjb21ibyA9IG5ldyBDb21ib0xpc3RPblByb3BlcnR5UGFnZShwcm9wZXJ0eVBhZ2UsIFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQkvLyBkYXRhLmhvcml6b250YWxBbGlnbm1lbnQ9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMsIGludCBudW1Sb3dzKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCi0JCS8vIEdyaWRMYXlvdXQKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IG51bUNvbHVtbnM7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBHcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQkvLyBkYXRhLmhvcml6b250YWxTcGFuPW51bUNvbHVtbnM7Ci0JCS8vIGRhdGEudmVydGljYWxTcGFuPW51bVJvd3M7Ci0KLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJY29udGVudFNldHRpbmdzID0gQ29udGVudFNldHRpbmdzQ3JlYXRvci5jcmVhdGUoKTsKLQotCQlwcm9wZXJ0eVBhZ2UgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCBudW1Db2xzLCBudW1Sb3dzKTsKLQotCQljcmVhdGVTZXR0aW5nc1BhZ2VHVUkoKTsKLQotCQlyZXR1cm4gcHJvcGVydHlQYWdlOwotCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjcmVhdGVTZXR0aW5nc1BhZ2VHVUkoKTsKLQotCS8vIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGFwcGx5U2VsZWN0ZWRQcm9wZXJ0eVZhbHVlKFN0cmluZyBzdHIsaW50Ci0JLy8gaW5kZXgpOwotCXByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGRlbGV0ZU5vbmVQcm9wZXJ0eShpbnQgaW5kZXgpOwotCi0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzSW5pdFZhbHVlQ2hhbmdlZChTdHJpbmcgYmVmb3JlLCBTdHJpbmcgYWZ0ZXIpIHsKLQkJaWYgKGJlZm9yZSA9PSBudWxsICYmIGFmdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChiZWZvcmUgIT0gbnVsbCAmJiBiZWZvcmUuZXF1YWxzKGFmdGVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JCS8vIHNlbGVjdGVkKGFwcGxpZWQpIGl0ZW0gaXMgcmVzdG9yZWQuCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZDb21ibzsgaSsrKSB7Ci0JCQkvLyBTdHJpbmcgYXBwbGllZFZhbHVlID0gY29tYm9baV0uZ2V0QXBwbHlWYWx1ZSgpOwotCQkJLy8gc2V0U2VsZWN0aW9uSXRlbShjb21ib1tpXSxhcHBsaWVkVmFsdWUpOwotCQkJY29tYm9baV0uc2VsZWN0KDApOyAvLyBzZWxlY3Qgbm9uZS4KLQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCU1hcCBwcm9wZXJ0aWVzID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpZiAodmFsaWRhdGVTdGF0ZSgpID09IGZhbHNlKSB7Ci0JCQljbGVhblVwKCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQ29tYm87IGkrKykgewotCQkJLy8gZ2V0IHNlbGVjdGVkIGl0ZW0gaW4gQ29tYm8gYm94LgotCQkJU3RyaW5nIHN0ciA9IGNvbWJvW2ldLmdldFNlbGVjdGVkVmFsdWUoKTsKLQkJCWlmIChzdHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCS8vIGlmIG5vIGNoYW5nZSwgc2tpcCBzZXRQcm9wZXJ0eQotCQkJaWYgKCFpc0luaXRWYWx1ZUNoYW5nZWQoY29tYm9baV0uZ2V0QXBwbHlWYWx1ZSgpLCBzdHIpKQotCQkJCWNvbnRpbnVlOwotCQkJLy8gaWYgTk9ORSBpcyBzZWxlY3RlZCwgZGVsZXRlIGF0dHIgaW5zdGFuY2UgKGFuZCB3cml0ZQotCQkJLy8gLmNvbnRlbnRzZXR0aW5ncy4pCi0JCQlpZiAoc3RyICE9IG51bGwgJiYgc3RyLmxlbmd0aCgpID09IDApCi0JCQkJZGVsZXRlTm9uZVByb3BlcnR5KGkpOwotCQkJZWxzZQotCQkJCXB1dFNlbGVjdGVkUHJvcGVydHlJbnRvKHByb3BlcnRpZXMsIHN0ciwgaSk7Ci0JCQkvLyBhcHBseVNlbGVjdGVkUHJvcGVydHlWYWx1ZShzdHIsaSk7Ci0KLQkJCS8vIHNldCBhcHBseSB2YWx1ZSBpbiBDb21ib0xpc3RPblByb3BlcnR5UGFnZS4KLQkJCWNvbWJvW2ldLnNldEFwcGx5VmFsdWUoc3RyKTsKLQkJfQotCQlpZiAocHJvcGVydGllcyAhPSBudWxsICYmICFwcm9wZXJ0aWVzLmlzRW1wdHkoKSkKLQkJCWNvbnRlbnRTZXR0aW5ncy5zZXRQcm9wZXJ0aWVzKChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSwgcHJvcGVydGllcyk7Ci0JCWlmIChwcm9wZXJ0aWVzICE9IG51bGwpCi0JCQlwcm9wZXJ0aWVzLmNsZWFyKCk7Ci0JCXByb3BlcnRpZXMgPSBudWxsOwotCQlpZiAoIWNvbnRlbnRTZXR0aW5ncy5leGlzdHNQcm9wZXJ0aWVzKChJUmVzb3VyY2UpIHN1cGVyLmdldEVsZW1lbnQoKSkpCi0JCQljb250ZW50U2V0dGluZ3MuZGVsZXRlQWxsUHJvcGVydGllcygoSVJlc291cmNlKSBzdXBlci5nZXRFbGVtZW50KCkpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBwdXRTZWxlY3RlZFByb3BlcnR5SW50byhNYXAgcHJvcGVydGllcywgU3RyaW5nIHN0ciwgaW50IGkpOwotCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTZWxlY3Rpb25JdGVtKENvbWJvTGlzdE9uUHJvcGVydHlQYWdlIGNvbWJvLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvbWJvLmdldEl0ZW1Db3VudCgpIDw9IDApCi0JCQlyZXR1cm47Ci0JCWNvbWJvLnNldEFwcGx5VmFsdWUodmFsdWUpOwotCQlTdHJpbmcgaXRlbSA9IGNvbWJvLmdldEtleSh2YWx1ZSk7Ci0JCWlmIChpdGVtICE9IG51bGwpCi0JCQljb21iby5zZWxlY3QoY29tYm8uaW5kZXhPZihpdGVtKSk7Ci0JCWVsc2UKLQkJCWNvbWJvLnNlbGVjdCgwKTsKLQotCX0KLQotCS8qCi0JICogVmFsaWRhdGUgRWRpdC4gU2ltaWxhciBmdW5jdGlvbiB3aWxsIGJlIGluIEhUTUxDb21tYW5kLmphdmEKLQkgKiBDb250ZW50U2V0dGluZ3NQcm9wZXJ0eVBhZ2UuamF2YSBDU1NBY3Rpb25NYW5hZ2VyLmphdmEKLQkgKiBEZXNpZ25SZWRvQWN0aW9uLmphdmEgRGVzaWduVW5kb0FjdGlvbi5qYXZhCi0JICogSFRNTENvbnZlcnNpb25Qcm9jZXNzb3IuamF2YQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZVN0YXRlKCkgewotCi0JCS8vIGdldCBJRmlsZSBvZiAuY29udGVudHNldHRpbmdzCi0JCWZpbmFsIFN0cmluZyBuYW1lID0gQ29udGVudFNldHRpbmdzLmdldENvbnRlbnRTZXR0aW5nc05hbWUoKTsKLQkJZmluYWwgSVJlc291cmNlIHJlc291cmNlID0gKElSZXNvdXJjZSkgc3VwZXIuZ2V0RWxlbWVudCgpOwotCQlmaW5hbCBJUHJvamVjdCBwcm9qZWN0ID0gcmVzb3VyY2UuZ2V0UHJvamVjdCgpOwotCQlJRmlsZSBmaWxlID0gcHJvamVjdC5nZXRGaWxlKG5hbWUpOwotCi0JCWlmIChmaWxlICE9IG51bGwgJiYgIWZpbGUuZXhpc3RzKCkpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gSXMgdGhpcyByZWFsbHkgT0s/Ci0JCS8vIElmIGZhbHNlIHNob3VsZCBiZSByZXR1cm5lZCwKLQkJLy8gVGhpcyBzdGF0ZW1hbnQgY2FuIGJlIHJlbW92ZWQsCi0JCS8vIHNpbmNlIE1vZGVsTWFuYWdlclV0aWwudmFsaWRhdGVFZGl0KCkKLQkJLy8gcmV0dXJucyBlcnJvciB0byB0aGlzIGNhc2UuCi0KLQkJU2hlbGwgc2hlbGwgPSBnZXRDb250cm9sKCkuZ2V0U2hlbGwoKTsKLQkJSVN0YXR1cyBzdGF0dXMgPSB2YWxpZGF0ZUVkaXQoZmlsZSwgc2hlbGwpOwotCQlyZXR1cm4gc3RhdHVzLmlzT0soKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvbnRyaWJ1dGVkUHJvY2Vzc29yRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29udHJpYnV0ZWRQcm9jZXNzb3JEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNmRmMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29udHJpYnV0ZWRQcm9jZXNzb3JEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBDb250cmlidXRlZFByb2Nlc3NvckRlc2NyaXB0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZDb25maWd1cmF0aW9uRWxlbWVudDsKLQlwcml2YXRlIE9iamVjdCBmUHJvY2Vzc29ySW5zdGFuY2U7Ci0KLQlwdWJsaWMgQ29udHJpYnV0ZWRQcm9jZXNzb3JEZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWZDb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWZQcm9jZXNzb3JJbnN0YW5jZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRQcm9jZXNzb3IoKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCWlmIChmUHJvY2Vzc29ySW5zdGFuY2UgPT0gbnVsbCAmJiBmQ29uZmlndXJhdGlvbkVsZW1lbnQgIT0gbnVsbCkgewotCQkJZlByb2Nlc3Nvckluc3RhbmNlID0gZkNvbmZpZ3VyYXRpb25FbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1MpOwotCQl9Ci0JCXJldHVybiBmUHJvY2Vzc29ySW5zdGFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmExMWZkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci0KLS8qKgotICogUHJvdmlkZXMgdGhlIGFwcHJvcHJpYXRlIGNvcnJlY3Rpb24gYXNzaXN0YW50IGZvciBhIGdpdmVuIHNvdXJjZSB2aWV3ZXIuCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIGEgcGxhY2Vob2xkZXIgdW50aWwgdGhlIGJhc2UgaW1wbGVtZW50cyBhIGNvbW1vbgotICogd2F5IGZvciBxdWlja2ZpeC9xdWljayBhc3Npc3QuCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBDb3JyZWN0aW9uQXNzaXN0YW50UHJvdmlkZXIgewotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvcnJlY3Rpb24gYXNzaXN0YW50IGZvciB0aGUgZ2l2ZW4gc291cmNldmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2VWaWV3ZXIKLQkgKiBAcmV0dXJuCi0JICovCi0JYWJzdHJhY3QgcHVibGljIElDb250ZW50QXNzaXN0YW50IGdldENvcnJlY3Rpb25Bc3Npc3RhbnQoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vSVF1aWNrQXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0ZTA5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JUXVpY2tBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIElRdWlja0Fzc2lzdFByb2Nlc3NvciB7Ci0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9jZXNzb3IgY2FuIGFzc2lzdCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LiBUaGlzIHRlc3QKLQkgKiBzaG91bGQgYmUgYW4gb3B0aW1pc3RpYyBndWVzcyBhbmQgYmUgZXh0cmVtbHkgY2hlYXAuCi0JICovCi0JYm9vbGVhbiBjYW5Bc3Npc3QoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KTsKLQotCS8qKgotCSAqIENvbGxlY3RzIHByb3Bvc2FscyBmb3IgYXNzaXN0YW50IGF0IHRoZSBnaXZlbiBvZmZzZXQuCi0JICovCi0JSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGdldFByb3Bvc2FscyhTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHRocm93cyBDb3JlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vSVF1aWNrRml4UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JUXVpY2tGaXhQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0NDFhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JUXVpY2tGaXhQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBJUXVpY2tGaXhQcm9jZXNzb3IgewotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2Vzc29yIGNhbiBmaXggdGhlIGdpdmVuIHByb2JsZW0uIFRoaXMgdGVzdAotCSAqIHNob3VsZCBiZSBhbiBvcHRpbWlzdGljIGd1ZXNzIGFuZCBiZSBleHRyZW1seSBjaGVhcC4KLQkgKi8KLQlib29sZWFuIGNhbkZpeChBbm5vdGF0aW9uIGFubm5vdGF0aW9uKTsKLQotCS8qKgotCSAqIENvbGxlY3RzIHByb3Bvc2FscyBmb3IgZml4aW5nIHRoZSBnaXZlbiBwcm9ibGVtLgotCSAqLwotCUlDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRQcm9wb3NhbHMoQW5ub3RhdGlvbiBhbm5ub3RhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4YmI1My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Ob01vZGlmaWNhdGlvbkNvbXBsZXRpb25Qcm9wb3NhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5vTW9kaWZpY2F0aW9uQ29tcGxldGlvblByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2FwcGx5KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElEb2N1bWVudCBkb2N1bWVudCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldENvbnRleHRJbmZvcm1hdGlvbigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldERpc3BsYXlTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIFNTRVVJTWVzc2FnZXMuTm9Nb2RpZmljYXRpb25Db21wbGV0aW9uUHJvcG9zYWxfMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vU3RydWN0dXJlZENvcnJlY3Rpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4M2I5Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci0KLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRDb3JyZWN0aW9uUHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgewotCXByb3RlY3RlZCBJQW5ub3RhdGlvbk1vZGVsIGZBbm5vdGF0aW9uTW9kZWw7Ci0JcHJvdGVjdGVkIElRdWlja0Fzc2lzdFByb2Nlc3NvciBmUXVpY2tBc3Npc3RQcm9jZXNzb3I7Ci0JcHJvdGVjdGVkIElRdWlja0ZpeFByb2Nlc3NvciBmUXVpY2tGaXhQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZENvcnJlY3Rpb25Qcm9jZXNzb3IoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJZkFubm90YXRpb25Nb2RlbCA9IHNvdXJjZVZpZXdlci5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWlja0Fzc2lzdFByb3Bvc2FscyhTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIEFycmF5TGlzdCBwcm9wb3NhbHMsIGludCBkb2N1bWVudE9mZnNldCkgewotCQl0cnkgewotCQkJSVF1aWNrQXNzaXN0UHJvY2Vzc29yIHByb2Nlc3NvciA9IGdldFF1aWNrQXNzaXN0UHJvY2Vzc29yKCk7Ci0JCQlpZiAocHJvY2Vzc29yICE9IG51bGwgJiYgcHJvY2Vzc29yLmNhbkFzc2lzdCh2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KSkgewotCQkJCUlDb21wbGV0aW9uUHJvcG9zYWxbXSByZXMgPSBwcm9jZXNzb3IuZ2V0UHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCQkJCWlmIChyZXMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHJlcy5sZW5ndGg7IGsrKykgewotCQkJCQkJcHJvcG9zYWxzLmFkZChyZXNba10pOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRRdWlja0ZpeFByb3Bvc2FscyhTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIEFycmF5TGlzdCBwcm9wb3NhbHMsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlJdGVyYXRvciBpdGVyID0gZkFubm90YXRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQlBbm5vdGF0aW9uIGFubm90YXRpb24gPSAoQW5ub3RhdGlvbikgaXRlci5uZXh0KCk7Ci0JCQlQb3NpdGlvbiBwb3MgPSBmQW5ub3RhdGlvbk1vZGVsLmdldFBvc2l0aW9uKGFubm90YXRpb24pOwotCQkJaWYgKHBvcyAhPSBudWxsICYmIGRvY3VtZW50T2Zmc2V0ID49IHBvcy5vZmZzZXQgJiYgZG9jdW1lbnRPZmZzZXQgPD0gcG9zLm9mZnNldCArIHBvcy5sZW5ndGgpIHsKLQkJCQlJUXVpY2tGaXhQcm9jZXNzb3IgcHJvY2Vzc29yID0gZ2V0UXVpY2tGaXhQcm9jZXNzb3IoKTsKLQkJCQlpZiAocHJvY2Vzc29yICE9IG51bGwgJiYgcHJvY2Vzc29yLmNhbkZpeChhbm5vdGF0aW9uKSkgewotCQkJCQl0cnkgewotCQkJCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlcyA9IHByb2Nlc3Nvci5nZXRQcm9wb3NhbHMoYW5ub3RhdGlvbik7Ci0JCQkJCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQkJCQlmb3IgKGludCBrID0gMDsgayA8IHJlcy5sZW5ndGg7IGsrKykgewotCQkJCQkJCQlwcm9wb3NhbHMuYWRkKHJlc1trXSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJQXJyYXlMaXN0IHByb3Bvc2FscyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCWFkZFF1aWNrRml4UHJvcG9zYWxzKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBwcm9wb3NhbHMsIGRvY3VtZW50T2Zmc2V0KTsKLQotCQkJaWYgKHByb3Bvc2Fscy5pc0VtcHR5KCkpIHsKLQkJCQlhZGRRdWlja0Fzc2lzdFByb3Bvc2FscygoU3RydWN0dXJlZFRleHRWaWV3ZXIpIHZpZXdlciwgcHJvcG9zYWxzLCBkb2N1bWVudE9mZnNldCk7Ci0JCQl9Ci0JCX0KLQotCQlpZiAocHJvcG9zYWxzLmlzRW1wdHkoKSkKLQkJCXByb3Bvc2Fscy5hZGQobmV3IE5vTW9kaWZpY2F0aW9uQ29tcGxldGlvblByb3Bvc2FsKCkpOwotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29tcGxldGlvblByb3Bvc2FsQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKQotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0RXJyb3JNZXNzYWdlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElRdWlja0Fzc2lzdFByb2Nlc3NvciBnZXRRdWlja0Fzc2lzdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIElRdWlja0ZpeFByb2Nlc3NvciBnZXRRdWlja0ZpeFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0JyZWFrcG9pbnRSdWxlckFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0JyZWFrcG9pbnRSdWxlckFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDdkNjQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9CcmVha3BvaW50UnVsZXJBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklWZXJ0aWNhbFJ1bGVySW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXJ0U2VydmljZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU3RvcmFnZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJyZWFrcG9pbnRSdWxlckFjdGlvbiBleHRlbmRzIEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCi0JcHJvdGVjdGVkIGNsYXNzIE1vdXNlVXBkYXRlciBpbXBsZW1lbnRzIE1vdXNlTGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJLy8gZG8gbm90aGluZyAoaGVyZSkKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlRG93bihNb3VzZUV2ZW50IGUpIHsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGdldEZpbGVFeHRlbnNpb24oSUVkaXRvcklucHV0IGlucHV0KSB7Ci0JCUlQYXRoIHBhdGggPSBudWxsOwotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJU3RvcmFnZUVkaXRvcklucHV0KSB7Ci0JCQl0cnkgewotCQkJCXBhdGggPSAoKElTdG9yYWdlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHBhdGggIT0gbnVsbCkgewotCQkJcmV0dXJuIHBhdGguZ2V0RmlsZUV4dGVuc2lvbigpOwotCQl9Ci0JCVN0cmluZyBuYW1lID0gaW5wdXQuZ2V0TmFtZSgpOwotCQlpbnQgaW5kZXggPSBuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0JCWlmIChpbmRleCA9PSAtMSkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoaW5kZXggPT0gKG5hbWUubGVuZ3RoKCkgLSAxKSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIElSZXNvdXJjZSBnZXRSZXNvdXJjZShJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gbnVsbDsKLQotCQlpZiAoaW5wdXQgaW5zdGFuY2VvZiBJRmlsZUVkaXRvcklucHV0KQotCQkJcmVzb3VyY2UgPSAoKElGaWxlRWRpdG9ySW5wdXQpIGlucHV0KS5nZXRGaWxlKCk7Ci0JCWlmIChyZXNvdXJjZSA9PSBudWxsKQotCQkJcmVzb3VyY2UgPSAoSVJlc291cmNlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwpCi0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQotCQlJRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gbnVsbDsKLQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFdvcmtiZW5jaCgpOwotCQkJaWYgKHdvcmtiZW5jaCAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCQkJaWYgKHdpbmRvdyAhPSBudWxsKSB7Ci0JCQkJCUlQYXJ0U2VydmljZSBzZXJ2aWNlID0gd2luZG93LmdldFBhcnRTZXJ2aWNlKCk7Ci0JCQkJCWlmIChzZXJ2aWNlICE9IG51bGwpIHsKLQkJCQkJCU9iamVjdCBwYXJ0ID0gc2VydmljZS5nZXRBY3RpdmVQYXJ0KCk7Ci0JCQkJCQlpZiAocGFydCAhPSBudWxsICYmIHBhcnQgaW5zdGFuY2VvZiBJRWRpdG9yUGFydCkgewotCQkJCQkJCWVkaXRvclBhcnQgPSAoSUVkaXRvclBhcnQpIHBhcnQ7Ci0JCQkJCQkJaWYgKGVkaXRvclBhcnQgIT0gbnVsbCkgewotCQkJCQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IG51bGw7Ci0JCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCQlpZiAoZWRpdG9yUGFydCBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQkJCQkJCQkJdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yUGFydDsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmICh0ZXh0RWRpdG9yID09IG51bGwpIHsKLQkJCQkJCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCQkJCQkJCUlEb2N1bWVudCB0ZXh0RG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChpbnB1dCk7Ci0JCQkJCQkJCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHREb2N1bWVudCk7Ci0JCQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJCQkJCQkJcmVzb3VyY2UgPSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2UoaW5wdXQsIG1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpLCBnZXRGaWxlRXh0ZW5zaW9uKGlucHV0KSk7Ci0JCQkJCQkJCQkJfQotCQkJCQkJCQkJfQotCQkJCQkJCQkJaWYgKHJlc291cmNlID09IG51bGwpIHsKLQkJCQkJCQkJCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzID0gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmdldEJyZWFrcG9pbnRQcm92aWRlcnMoZWRpdG9yUGFydCwgbnVsbCwgZ2V0RmlsZUV4dGVuc2lvbihpbnB1dCkpOwotCQkJCQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJzLmxlbmd0aCAmJiByZXNvdXJjZSA9PSBudWxsOyBpKyspIHsKLQkJCQkJCQkJCQkJcmVzb3VyY2UgPSBwcm92aWRlcnNbaV0uZ2V0UmVzb3VyY2UoaW5wdXQpOwotCQkJCQkJCQkJCX0KLQkJCQkJCQkJCX0KLQkJCQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCQkJCX0gZmluYWxseSB7Ci0JCQkJCQkJCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCQkJCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzb3VyY2U7Ci0JfQotCi0JcHJvdGVjdGVkIE1vdXNlTGlzdGVuZXIgZk1vdXNlTGlzdGVuZXIgPSBudWxsOwotCi0JcHJvdGVjdGVkIElWZXJ0aWNhbFJ1bGVySW5mbyBmUnVsZXJJbmZvID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVRleHRFZGl0b3IgZlRleHRFZGl0b3IgPSBudWxsOwotCi0JcHVibGljIEJyZWFrcG9pbnRSdWxlckFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIElWZXJ0aWNhbFJ1bGVySW5mbyBydWxlckluZm8pIHsKLQkJc3VwZXIoKTsKLQkJZlRleHRFZGl0b3IgPSBlZGl0b3I7Ci0JCWlmKHJ1bGVySW5mbyAhPSBudWxsKSB7Ci0JCQlmUnVsZXJJbmZvID0gcnVsZXJJbmZvOwotCQkJZk1vdXNlTGlzdGVuZXIgPSBuZXcgTW91c2VVcGRhdGVyKCk7Ci0JCQlydWxlckluZm8uZ2V0Q29udHJvbCgpLmFkZE1vdXNlTGlzdGVuZXIoZk1vdXNlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgPGNvZGU+QWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWw8L2NvZGU+IG9mIHRoZQotCSAqIGVkaXRvcidzIGlucHV0LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1hcmtlciBhbm5vdGF0aW9uIG1vZGVsCi0JICovCi0JcHJvdGVjdGVkIEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbCgpIHsKLQkJSURvY3VtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBwcm92aWRlci5nZXRBbm5vdGF0aW9uTW9kZWwoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCWlmIChtb2RlbCBpbnN0YW5jZW9mIEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsKQotCQkJcmV0dXJuIChBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCkgbW9kZWw7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQnJlYWtwb2ludFtdIGdldEJyZWFrcG9pbnRzKElNYXJrZXJbXSBtYXJrZXJzKSB7Ci0JCUlCcmVha3BvaW50TWFuYWdlciBtYW5hZ2VyID0gRGVidWdQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJyZWFrcG9pbnRNYW5hZ2VyKCk7Ci0JCUxpc3QgYnJlYWtwb2ludHMgPSBuZXcgQXJyYXlMaXN0KG1hcmtlcnMubGVuZ3RoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gbWFuYWdlci5nZXRCcmVha3BvaW50KG1hcmtlcnNbaV0pOwotCQkJaWYgKGJyZWFrcG9pbnQgIT0gbnVsbCkgewotCQkJCWJyZWFrcG9pbnRzLmFkZChicmVha3BvaW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElCcmVha3BvaW50W10pIGJyZWFrcG9pbnRzLnRvQXJyYXkobmV3IElCcmVha3BvaW50WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSA8Y29kZT5JRG9jdW1lbnQ8L2NvZGU+IG9mIHRoZSBlZGl0b3IncyBpbnB1dC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBkb2N1bWVudCBvZiB0aGUgZWRpdG9yJ3MgaW5wdXQKLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlJRG9jdW1lbnRQcm92aWRlciBwcm92aWRlciA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKTsKLQkJcmV0dXJuIHByb3ZpZGVyLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIG1hcmtlcnMgd2hpY2ggaW5jbHVkZSB0aGUgcnVsZXIncyBsaW5lIG9mIGFjdGl2aXR5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgbWFya2VycyB3aGljaCBpbmNsdWRlIHRoZSBydWxlcidzIGxpbmUgb2YgYWN0aXZpdHkKLQkgKi8KLQlwcm90ZWN0ZWQgSU1hcmtlcltdIGdldE1hcmtlcnMoKSB7Ci0JCUxpc3QgbWFya2VycyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZSgpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlBYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiBhbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCAmJiByZXNvdXJjZS5leGlzdHMoKSkgewotCQkJdHJ5IHsKLQkJCQlJTWFya2VyW10gYWxsTWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKElCcmVha3BvaW50LkJSRUFLUE9JTlRfTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJaWYgKGFsbE1hcmtlcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChpbmNsdWRlc1J1bGVyTGluZShhbm5vdGF0aW9uTW9kZWwuZ2V0TWFya2VyUG9zaXRpb24oYWxsTWFya2Vyc1tpXSksIGRvY3VtZW50KSkgewotCQkJCQkJCW1hcmtlcnMuYWRkKGFsbE1hcmtlcnNbaV0pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoSU1hcmtlcltdKSBtYXJrZXJzLnRvQXJyYXkobmV3IElNYXJrZXJbMF0pOwotCX0KLQotCXByb3RlY3RlZCBJUmVzb3VyY2UgZ2V0UmVzb3VyY2UoKSB7Ci0JCUlFZGl0b3JJbnB1dCBpbnB1dCA9IGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpOwotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBnZXRSZXNvdXJjZShpbnB1dCk7Ci0JCXJldHVybiByZXNvdXJjZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHJ1bGVySW5mby4KLQkgKi8KLQlwdWJsaWMgSVZlcnRpY2FsUnVsZXJJbmZvIGdldFJ1bGVySW5mbygpIHsKLQkJcmV0dXJuIGZSdWxlckluZm87Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0ZXh0RWRpdG9yLgotCSAqLwotCXB1YmxpYyBJVGV4dEVkaXRvciBnZXRUZXh0RWRpdG9yKCkgewotCQlyZXR1cm4gZlRleHRFZGl0b3I7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWFya2VycygpIHsKLQkJSVJlc291cmNlIHJlc291cmNlID0gZ2V0UmVzb3VyY2UoKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlpZiAocmVzb3VyY2UgIT0gbnVsbCAmJiBtb2RlbCAhPSBudWxsICYmIHJlc291cmNlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlNYXJrZXJbXSBhbGxNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSUJyZWFrcG9pbnQuTElORV9CUkVBS1BPSU5UX01BUktFUiwgdHJ1ZSwgSVJlc291cmNlLkRFUFRIX1pFUk8pOwotCQkJCWlmIChhbGxNYXJrZXJzICE9IG51bGwpIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxNYXJrZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQlpZiAoaW5jbHVkZXNSdWxlckxpbmUobW9kZWwuZ2V0TWFya2VyUG9zaXRpb24oYWxsTWFya2Vyc1tpXSksIGRvY3VtZW50KSkgewotCQkJCQkJCXJldHVybiB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHdoZXRoZXIgYSBwb3NpdGlvbiBpbmNsdWRlcyB0aGUgcnVsZXIncyBsaW5lIG9mIGFjdGl2aXR5LgotCSAqIAotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIHRvIGJlIGNoZWNrZWQKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGUgcG9zaXRpb24gcmVmZXJzIHRvCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGUgbGluZSBpcyBpbmNsdWRlZCBieSB0aGUgZ2l2ZW4KLQkgKiAgICAgICAgIHBvc2l0aW9uCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZXNSdWxlckxpbmUoUG9zaXRpb24gcG9zaXRpb24sIElEb2N1bWVudCBkb2N1bWVudCkgewotCQlpZiAocG9zaXRpb24gIT0gbnVsbCAmJiBmUnVsZXJJbmZvICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJaW50IG1hcmtlckxpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWludCBsaW5lID0gZ2V0UnVsZXJJbmZvKCkuZ2V0TGluZU9mTGFzdE1vdXNlQnV0dG9uQWN0aXZpdHkoKTsKLQkJCQlpZiAobGluZSA9PSBtYXJrZXJMaW5lKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkvLyBjb21tZW50ZWQgYmVjYXVzZSBvZiAiMUdFVU9aOTogSVRQSlVJOkFMTCAtIENvbmZ1c2luZyBVSQotCQkJCS8vIGZvcgotCQkJCS8vIG11bHRpbGluZSBCb29rbWFya3MgYW5kIFRhc2tzIgotCQkJCS8vIHJldHVybiAobWFya2VyTGluZSA8PSBsaW5lICYmIGxpbmUgPD0KLQkJCQkvLyBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocG9zaXRpb24uZ2V0T2Zmc2V0KCkgKwotCQkJCS8vIHBvc2l0aW9uLmdldExlbmd0aCgpKSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0RlYnVnVGV4dEVkaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0RlYnVnVGV4dEVkaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWM5Yjg0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9EZWJ1Z1RleHRFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVidWc7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLmZpbGVidWZmZXJzLkZpbGVCdWZmZXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uU2VwYXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRmlsZUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYWdlTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQYXRoRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVN0b3JhZ2VFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRmlsZURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5TdG9yYWdlRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklTaG93SW5UYXJnZXRMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWxlbWVudFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclJ1bGVyQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5FeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklQb3B1cE1lbnVDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuYnJlYWtwb2ludC5JRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQ7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIG5pdGluCi0gKiAKLSAqIEEgdGV4dCBlZGl0b3IgY2FwYWJsZSBvZiB1c2luZyB0aGUgSUJyZWFrcG9pbnRQcm92aWRlciBmcmFtZXdvcmsuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSBjbGllbnRzIHdobyB3aXNoIHRvIHVzZSB0aGUKLSAqIElCcmVha3BvaW50UHJvdmlkZXIgZnJhbWV3b3JrIGJ1dCBub3QgdGhlIFN0cnVjdHVyZWRUZXh0RWRpdG9yLCBlLmcuIFZCUwotICogc291cmNlIGVkaXRvcnMuIEl0IGlzIHByb3ZpZGVkIEFTLUlTIGFuZCBtYXJrZWQgaW50ZXJuYWwgYXMgaXQgaXMKLSAqIHVuc3VwcG9ydGVkIGFuZCBzdWJqZWN0IHRvIGNoYW5nZSBhdCBhbnkgdGltZS4KLSAqLwotcHVibGljIGNsYXNzIERlYnVnVGV4dEVkaXRvciBleHRlbmRzIFRleHRFZGl0b3IgewotCi0JcHJpdmF0ZSBjbGFzcyBTaG93SW5UYXJnZXRMaXN0ZXIgaW1wbGVtZW50cyBJU2hvd0luVGFyZ2V0TGlzdCB7Ci0JCXB1YmxpYyBTdHJpbmdbXSBnZXRTaG93SW5UYXJnZXRJZHMoKSB7Ci0JCQlyZXR1cm4gZlNob3dJblRhcmdldElkczsKLQkJfQotCX0KLQotCS8qKgotCSAqIERvY3VtZW50UHJvdmlkZXIgZm9yIElTdG9yYWdlRWRpdG9ySW5wdXRzIC0gc3VwcG9ydHMKLQkgKiBJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQgbm90aWZpY2F0aW9ucyBhbmQgYXNzaWduaW5nIGJyZWFrcG9pbnQKLQkgKiBtYXJrZXJzLgotCSAqLwotCWNsYXNzIFN0b3JhZ2VJbnB1dERvY3VtZW50UHJvdmlkZXIgZXh0ZW5kcyBTdG9yYWdlRG9jdW1lbnRQcm92aWRlciBpbXBsZW1lbnRzIElFbGVtZW50U3RhdGVMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBJQW5ub3RhdGlvbk1vZGVsIGNyZWF0ZUFubm90YXRpb25Nb2RlbChPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IG51bGw7Ci0JCQlJU3RvcmFnZUVkaXRvcklucHV0IHN0b3JhZ2VJbnB1dCA9IChJU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJU3RyaW5nIGV4dCA9IEJyZWFrcG9pbnRSdWxlckFjdGlvbi5nZXRGaWxlRXh0ZW5zaW9uKHN0b3JhZ2VJbnB1dCk7Ci0JCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IGdldEVkaXRvcklucHV0Q29udGVudFR5cGVzKHN0b3JhZ2VJbnB1dCk7Ci0JCQlJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyByZXMgPT0gbnVsbCAmJiBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZXMgPSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0UmVzb3VyY2Uoc3RvcmFnZUlucHV0LCB0eXBlc1tpXS5nZXRJZCgpLCBleHQpOwotCQkJfQotCQkJU3RyaW5nIGlkID0gc3RvcmFnZUlucHV0LmdldE5hbWUoKTsKLQkJCWlmIChzdG9yYWdlSW5wdXQuZ2V0U3RvcmFnZSgpICE9IG51bGwpIHsKLQkJCQlJUGF0aCBmdWxsUGF0aCA9IHN0b3JhZ2VJbnB1dC5nZXRTdG9yYWdlKCkuZ2V0RnVsbFBhdGgoKTsKLQkJCQlpZiAoZnVsbFBhdGggIT0gbnVsbCkKLQkJCQkJaWQgPSBmdWxsUGF0aC50b1N0cmluZygpOwotCQkJCWVsc2UKLQkJCQkJaWQgPSBzdG9yYWdlSW5wdXQuZ2V0TmFtZSgpOwotCQkJfQotCQkJaWYgKHJlcyAhPSBudWxsKQotCQkJCW1vZGVsID0gbmV3IFN0cnVjdHVyZWRSZXNvdXJjZU1hcmtlckFubm90YXRpb25Nb2RlbChyZXMsIGlkKTsKLQkJCWVsc2UKLQkJCQltb2RlbCA9IG5ldyBTdHJ1Y3R1cmVkUmVzb3VyY2VNYXJrZXJBbm5vdGF0aW9uTW9kZWwoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKSwgaWQpOwotCi0JCQlyZXR1cm4gbW9kZWw7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgQWJzdHJhY3REb2N1bWVudFByb3ZpZGVyLkVsZW1lbnRJbmZvIGNyZWF0ZUVsZW1lbnRJbmZvKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgewotCQkJCSgoSUV4dGVuZGVkU3RvcmFnZUVkaXRvcklucHV0KSBlbGVtZW50KS5hZGRFbGVtZW50U3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJCX0KLQkJCXJldHVybiBzdXBlci5jcmVhdGVFbGVtZW50SW5mbyhlbGVtZW50KTsKLQkJfQotCi0JCXByb3RlY3RlZCB2b2lkIGRpc3Bvc2VFbGVtZW50SW5mbyhPYmplY3QgZWxlbWVudCwgRWxlbWVudEluZm8gaW5mbykgewotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJRXh0ZW5kZWRTdG9yYWdlRWRpdG9ySW5wdXQpIHsKLQkJCQkoKElFeHRlbmRlZFN0b3JhZ2VFZGl0b3JJbnB1dCkgZWxlbWVudCkucmVtb3ZlRWxlbWVudFN0YXRlTGlzdGVuZXIodGhpcyk7Ci0JCQl9Ci0JCQlzdXBlci5kaXNwb3NlRWxlbWVudEluZm8oZWxlbWVudCwgaW5mbyk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5TdG9yYWdlRG9jdW1lbnRQcm92aWRlciNkb1NhdmVEb2N1bWVudChvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvciwKLQkJICogICAgICBqYXZhLmxhbmcuT2JqZWN0LCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwgYm9vbGVhbikKLQkJICovCi0JCXByb3RlY3RlZCB2b2lkIGRvU2F2ZURvY3VtZW50KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGVsZW1lbnQsIElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCS8vIHVudGVzdGVkCi0JCQluZXcgRmlsZURvY3VtZW50UHJvdmlkZXIoKS5zYXZlRG9jdW1lbnQobW9uaXRvciwgZWxlbWVudCwgZG9jdW1lbnQsIG92ZXJ3cml0ZSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbGVtZW50Q29udGVudEFib3V0VG9CZVJlcGxhY2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JCQlmaXJlRWxlbWVudENvbnRlbnRBYm91dFRvQmVSZXBsYWNlZChlbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnRDb250ZW50UmVwbGFjZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWZpcmVFbGVtZW50Q29udGVudFJlcGxhY2VkKGVsZW1lbnQpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudERlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWZpcmVFbGVtZW50RGVsZXRlZChlbGVtZW50KTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVsZW1lbnREaXJ0eVN0YXRlQ2hhbmdlZChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiBpc0RpcnR5KSB7Ci0JCQlmaXJlRWxlbWVudERpcnR5U3RhdGVDaGFuZ2VkKGVsZW1lbnQsIGlzRGlydHkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZWxlbWVudE1vdmVkKE9iamVjdCBvcmlnaW5hbEVsZW1lbnQsIE9iamVjdCBtb3ZlZEVsZW1lbnQpIHsKLQkJCWZpcmVFbGVtZW50TW92ZWQob3JpZ2luYWxFbGVtZW50LCBtb3ZlZEVsZW1lbnQpOwotCQl9Ci0JfQotCi0JU3RyaW5nW10gZlNob3dJblRhcmdldElkcyA9IG5ldyBTdHJpbmdbXXtJUGFnZUxheW91dC5JRF9SRVNfTkFWfTsKLQlwcml2YXRlIElTaG93SW5UYXJnZXRMaXN0IGZTaG93SW5UYXJnZXRMaXN0QWRhcHRlciA9IG5ldyBTaG93SW5UYXJnZXRMaXN0ZXIoKTsKLQotCUlEb2N1bWVudFByb3ZpZGVyIGZTdG9yYWdlSW5wdXREb2N1bWVudFByb3ZpZGVyID0gbnVsbDsKLQotCXB1YmxpYyBEZWJ1Z1RleHRFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuVGV4dEVkaXRvciNjcmVhdGVBY3Rpb25zKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBY3Rpb25zKCkgewotCQlzdXBlci5jcmVhdGVBY3Rpb25zKCk7Ci0KLQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IgQWN0aW9uIC0gdG9nZ2xlIGJyZWFrcG9pbnRzCi0JCUlBY3Rpb24gYWN0aW9uID0gbmV3IFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpKSB7Ci0JCQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKElEb2N1bWVudCBkb2N1bWVudCkgewotCQkJCUlMb2NhdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gKElMb2NhdGlvblByb3ZpZGVyKSBnZXRFZGl0b3JJbnB1dCgpLmdldEFkYXB0ZXIoSUxvY2F0aW9uUHJvdmlkZXIuY2xhc3MpOwotCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCUlQYXRoIGxvY2F0aW9uID0gcHJvdmlkZXIuZ2V0UGF0aChnZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJcmV0dXJuIGRldGVjdENvbnRlbnRUeXBlKGxvY2F0aW9uKS5nZXRJZCgpOwotCQkJCX0KLQkJCQllbHNlIGlmIChnZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkgewotCQkJCQlJUGF0aCBsb2NhdGlvbiA9ICgoSVBhdGhFZGl0b3JJbnB1dCkgZ2V0RWRpdG9ySW5wdXQoKSkuZ2V0UGF0aCgpOwotCQkJCQlyZXR1cm4gZGV0ZWN0Q29udGVudFR5cGUobG9jYXRpb24pLmdldElkKCk7Ci0JCQkJfQotCQkJCXJldHVybiBJQ29udGVudFR5cGVNYW5hZ2VyLkNUX1RFWFQ7Ci0JCQl9Ci0JCX07Ci0JCXNldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLlRPR0dMRV9CUkVBS1BPSU5UUywgYWN0aW9uKTsKLQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IgQWN0aW9uIC0gbWFuYWdlIGJyZWFrcG9pbnRzCi0JCWFjdGlvbiA9IG5ldyBNYW5hZ2VCcmVha3BvaW50QWN0aW9uKHRoaXMsIGdldFZlcnRpY2FsUnVsZXIoKSk7Ci0JCXNldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLk1BTkFHRV9CUkVBS1BPSU5UUywgYWN0aW9uKTsKLQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IgQWN0aW9uIC0gZWRpdCBicmVha3BvaW50cwotCQlhY3Rpb24gPSBuZXcgRWRpdEJyZWFrcG9pbnRBY3Rpb24odGhpcywgZ2V0VmVydGljYWxSdWxlcigpKTsKLQkJc2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuRURJVF9CUkVBS1BPSU5UUywgYWN0aW9uKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0aGUgU2hvdyBJbiBUYXJnZXQgSURzIGZyb20gdGhlIEV4dGVuZGVkIENvbmZpZ3VyYXRpb24gZXh0ZW5zaW9uCi0JICogcG9pbnQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmdbXSBjcmVhdGVTaG93SW5UYXJnZXRJZHMoKSB7Ci0JCUxpc3QgYWxsSWRzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlciBidWlsZGVyID0gRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlci5nZXRJbnN0YW5jZSgpOwotCQlTdHJpbmdbXSBjb25maWd1cmF0aW9uSWRzID0gZ2V0Q29uZmlndXJhdGlvblBvaW50cygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbmZpZ3VyYXRpb25JZHMubGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZ1tdIGRlZmluaXRpb25zID0gYnVpbGRlci5nZXREZWZpbml0aW9ucygic2hvd2ludGFyZ2V0IiwgY29uZmlndXJhdGlvbklkc1tpXSk7IC8vJE5PTi1OTFMtMSQKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVmaW5pdGlvbnMubGVuZ3RoOyBqKyspIHsKLQkJCQlTdHJpbmcgc29tZUlkcyA9IGRlZmluaXRpb25zW2pdOwotCQkJCWlmIChzb21lSWRzICE9IG51bGwgJiYgc29tZUlkcy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJU3RyaW5nW10gaWRzID0gU3RyaW5nVXRpbHMudW5wYWNrKHNvbWVJZHMpOwotCQkJCQlmb3IgKGludCBrID0gMDsgayA8IGlkcy5sZW5ndGg7IGsrKykgewotCQkJCQkJLy8gdHJpbSwganVzdCB0byBrZWVwIHRoaW5ncyBjbGVhbgotCQkJCQkJU3RyaW5nIGlkID0gaWRzW2tdLnRyaW0oKTsKLQkJCQkJCWlmICghYWxsSWRzLmNvbnRhaW5zKGlkKSkgewotCQkJCQkJCWFsbElkcy5hZGQoaWQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKCFhbGxJZHMuY29udGFpbnMoSVBhZ2VMYXlvdXQuSURfUkVTX05BVikpIHsKLQkJCWFsbElkcy5hZGQoSVBhZ2VMYXlvdXQuSURfUkVTX05BVik7Ci0JCX0KLQkJcmV0dXJuIChTdHJpbmdbXSkgYWxsSWRzLnRvQXJyYXkobmV3IFN0cmluZ1swXSk7Ci0JfQotCi0JSUNvbnRlbnRUeXBlIGRldGVjdENvbnRlbnRUeXBlKElQYXRoIGxvY2F0aW9uKSB7Ci0JCUlDb250ZW50VHlwZSB0eXBlID0gbnVsbDsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBGaWxlQnVmZmVycy5nZXRXb3Jrc3BhY2VGaWxlQXRMb2NhdGlvbihsb2NhdGlvbik7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsKSB7Ci0JCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQkJSUNvbnRlbnREZXNjcmlwdGlvbiBkID0gbnVsbDsKLQkJCQl0cnkgewotCQkJCQkvLyBPcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCQlkID0gKChJRmlsZSkgcmVzb3VyY2UpLmdldENvbnRlbnREZXNjcmlwdGlvbigpOwotCQkJCQlpZiAoZCAhPSBudWxsKSB7Ci0JCQkJCQl0eXBlID0gZC5nZXRDb250ZW50VHlwZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gU2hvdWxkIG5vdCBiZSBwb3NzaWJsZSBnaXZlbiB0aGUgYWNjZXNzaWJsZSBhbmQgZmlsZQotCQkJCQkvLyB0eXBlIGNoZWNrIGFib3ZlCi0JCQkJfQotCQkJCWlmICh0eXBlID09IG51bGwpIHsKLQkJCQkJdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcihyZXNvdXJjZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUZpbGUgZmlsZSA9IEZpbGVCdWZmZXJzLmdldFN5c3RlbUZpbGVBdExvY2F0aW9uKGxvY2F0aW9uKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJbnB1dFN0cmVhbSBpbnB1dCA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJaW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOwotCQkJCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZmluZENvbnRlbnRUeXBlRm9yKGlucHV0LCBsb2NhdGlvbi50b09TU3RyaW5nKCkpOwotCQkJCX0KLQkJCQljYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChpbnB1dCAhPSBudWxsKSB7Ci0JCQkJCQl0cnkgewotCQkJCQkJCWlucHV0LmNsb3NlKCk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoSU9FeGNlcHRpb24gZTEpIHsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJCXR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoZmlsZS5nZXROYW1lKCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQl0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoSUNvbnRlbnRUeXBlTWFuYWdlci5DVF9URVhUKTsKLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3RUZXh0RWRpdG9yI2VkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3cob3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0b3JDb250ZXh0TWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51KSB7Ci0JCXN1cGVyLmVkaXRvckNvbnRleHRNZW51QWJvdXRUb1Nob3cobWVudSk7Ci0KLQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGMgPSBnZXRFZGl0b3JTaXRlKCkuZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJaWYgKGMgaW5zdGFuY2VvZiBJUG9wdXBNZW51Q29udHJpYnV0b3IpIHsKLQkJCSgoSVBvcHVwTWVudUNvbnRyaWJ1dG9yKSBjKS5jb250cmlidXRlVG9Qb3B1cE1lbnUobWVudSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvbkJ1aWxkZXIoKTsKLQkJCUlFeHRlbmRlZENvbnRyaWJ1dG9yIHBtYyA9IGJ1aWxkZXIucmVhZEFjdGlvbkV4dGVuc2lvbnMoZ2V0Q29uZmlndXJhdGlvblBvaW50cygpKTsKLQkJCWlmIChwbWMgIT0gbnVsbCkgewotCQkJCXBtYy5zZXRBY3RpdmVFZGl0b3IodGhpcyk7Ci0JCQkJcG1jLmNvbnRyaWJ1dGVUb1BvcHVwTWVudShtZW51KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklBZGFwdGFibGUjZ2V0QWRhcHRlcihqYXZhLmxhbmcuQ2xhc3MpCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGFwdGVyKENsYXNzIHJlcXVpcmVkKSB7Ci0JCS8vIE5hdmlnYXRlIGFjdGlvbiBzZXQgbWVudQotCQlpZiAoSVNob3dJblRhcmdldExpc3QuY2xhc3MuZXF1YWxzKHJlcXVpcmVkKSkKLQkJCXJldHVybiBmU2hvd0luVGFyZ2V0TGlzdEFkYXB0ZXI7Ci0JCXJldHVybiBzdXBlci5nZXRBZGFwdGVyKHJlcXVpcmVkKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRDb25maWd1cmF0aW9uUG9pbnRzKCkgewotCQlyZXR1cm4gQ29uZmlndXJhdGlvblBvaW50Q2FsY3VsYXRvci5nZXRDb25maWd1cmF0aW9uUG9pbnRzKHRoaXMsIGdldElucHV0Q29udGVudFR5cGUoZ2V0RWRpdG9ySW5wdXQoKSksIENvbmZpZ3VyYXRpb25Qb2ludENhbGN1bGF0b3IuU09VUkNFLCBEZWJ1Z1RleHRFZGl0b3IuY2xhc3MpOwotCX0KLQotCUlDb250ZW50VHlwZVtdIGdldEVkaXRvcklucHV0Q29udGVudFR5cGVzKElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IG51bGw7Ci0JCUlSZXNvdXJjZSByZXNvdXJjZSA9IG51bGw7Ci0KLQkJaWYgKGlucHV0LmdldEFkYXB0ZXIoSUZpbGUuY2xhc3MpICE9IG51bGwpIHsKLQkJCXJlc291cmNlID0gKElGaWxlKSBpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKTsKLQkJfQotCQllbHNlIGlmIChpbnB1dC5nZXRBZGFwdGVyKElGaWxlLmNsYXNzKSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZSA9IChJUmVzb3VyY2UpIGlucHV0LmdldEFkYXB0ZXIoSVJlc291cmNlLmNsYXNzKTsKLQkJfQotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpID09IElSZXNvdXJjZS5GSUxFICYmIHJlc291cmNlLmlzQWNjZXNzaWJsZSgpKSB7Ci0JCQlJQ29udGVudERlc2NyaXB0aW9uIGQgPSBudWxsOwotCQkJdHJ5IHsKLQkJCQkvLyBvcHRpbWl6ZWQgZGVzY3JpcHRpb24gbG9va3VwLCBtaWdodCBub3Qgc3VjY2VlZAotCQkJCWQgPSAoKElGaWxlKSByZXNvdXJjZSkuZ2V0Q29udGVudERlc2NyaXB0aW9uKCk7Ci0JCQkJaWYgKGQgIT0gbnVsbCkgewotCQkJCQl0eXBlcyA9IG5ldyBJQ29udGVudFR5cGVbXXtkLmdldENvbnRlbnRUeXBlKCl9OwotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBzaG91bGQgbm90IGJlIHBvc3NpYmxlIGdpdmVuIHRoZSBhY2Nlc3NpYmxlIGFuZCBmaWxlIHR5cGUKLQkJCQkvLyBjaGVjayBhYm92ZQotCQkJfQotCQl9Ci0JCWlmICh0eXBlcyA9PSBudWxsKSB7Ci0JCQl0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IoaW5wdXQuZ2V0TmFtZSgpKTsKLQkJfQotCQlyZXR1cm4gdHlwZXM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGVkaXRvcklucHV0Ci0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldElucHV0Q29udGVudFR5cGUoSUVkaXRvcklucHV0IGVkaXRvcklucHV0KSB7Ci0JCUlDb250ZW50VHlwZVtdIHR5cGVzID0gZ2V0RWRpdG9ySW5wdXRDb250ZW50VHlwZXMoZWRpdG9ySW5wdXQpOwotCQlpZiAodHlwZXMgIT0gbnVsbCkgewotCQkJcmV0dXJuIHR5cGVzWzBdLmdldElkKCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0RlYnVnZ2luZ0F2YWlsYWJsZSgpIHsKLQkJYm9vbGVhbiBkZWJ1Z2dpbmdBdmFpbGFibGUgPSBmYWxzZTsKLQkJSUNvbnRlbnRUeXBlW10gdHlwZXMgPSBnZXRFZGl0b3JJbnB1dENvbnRlbnRUeXBlcyhnZXRFZGl0b3JJbnB1dCgpKTsKLQkJZm9yIChpbnQgaSA9IDA7ICFkZWJ1Z2dpbmdBdmFpbGFibGUgJiYgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWJ1Z2dpbmdBdmFpbGFibGUgPSBkZWJ1Z2dpbmdBdmFpbGFibGUgfHwgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlci5nZXRJbnN0YW5jZSgpLmlzQXZhaWxhYmxlKHR5cGVzW2ldLmdldElkKCksIEJyZWFrcG9pbnRSdWxlckFjdGlvbi5nZXRGaWxlRXh0ZW5zaW9uKGdldEVkaXRvcklucHV0KCkpKTsKLQkJfQotCQlyZXR1cm4gZGVidWdnaW5nQXZhaWxhYmxlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJ1bGVyQ29udGV4dE1lbnVBYm91dFRvU2hvdyhJTWVudU1hbmFnZXIgbWVudSkgewotCQlpZiAoaXNEZWJ1Z2dpbmdBdmFpbGFibGUoKSkgewotCQkJbWVudS5hZGQoZ2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuVE9HR0xFX0JSRUFLUE9JTlRTKSk7Ci0JCQltZW51LmFkZChnZXRBY3Rpb24oQWN0aW9uRGVmaW5pdGlvbklkcy5NQU5BR0VfQlJFQUtQT0lOVFMpKTsKLQkJCW1lbnUuYWRkKGdldEFjdGlvbihBY3Rpb25EZWZpbml0aW9uSWRzLkVESVRfQlJFQUtQT0lOVFMpKTsKLQkJCW1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBnZXRDbGFzcygpLmdldE5hbWUoKSArICIgY291bGQgbm90IGVuYWJsZSBkZWJ1Z2dpbmcgYWN0aW9ucyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc3VwZXIucnVsZXJDb250ZXh0TWVudUFib3V0VG9TaG93KG1lbnUpOwotCX0KLQotCS8qKgotCSAqIEVuc3VyZSB0aGF0IHRoZSBjb3JyZWN0IElEb2N1bWVudFByb3ZpZGVyIGlzIHVzZWQuIEZvciBJRmlsZSBhbmQgRmlsZXMsCi0JICogdGhlIGRlZmF1bHQgcHJvdmlkZXIgd2l0aCBhIHNwZWNpZmllZCBBbm5vdGF0aW9uTW9kZWxGYWN0b3J5IGlzIHVzZWQuCi0JICogRm9yIFN0b3JhZ2VFZGl0b3JJbnB1dHMsIHVzZSBhIGN1c3RvbSBwcm92aWRlciB0aGF0IGNyZWF0ZXMgYSB1c2FibGUKLQkgKiBSZXNvdXJjZUFubm90YXRpb25Nb2RlbAotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3Ijc2V0RG9jdW1lbnRQcm92aWRlcihvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RG9jdW1lbnRQcm92aWRlcihJRWRpdG9ySW5wdXQgaW5wdXQpIHsKLQkJaWYgKGlucHV0IGluc3RhbmNlb2YgSVN0b3JhZ2VFZGl0b3JJbnB1dCAmJiAhKGlucHV0IGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkpIHsKLQkJCWlmIChmU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlciA9PSBudWxsKSB7Ci0JCQkJZlN0b3JhZ2VJbnB1dERvY3VtZW50UHJvdmlkZXIgPSBuZXcgU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlcigpOwotCQkJfQotCQkJc2V0RG9jdW1lbnRQcm92aWRlcihmU3RvcmFnZUlucHV0RG9jdW1lbnRQcm92aWRlcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlzdXBlci5zZXREb2N1bWVudFByb3ZpZGVyKGlucHV0KTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdFRleHRFZGl0b3IjdXBkYXRlQ29udGVudERlcGVuZGVudEFjdGlvbnMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUNvbnRlbnREZXBlbmRlbnRBY3Rpb25zKCkgewotCQlzdXBlci51cGRhdGVDb250ZW50RGVwZW5kZW50QWN0aW9ucygpOwotCQlpZiAoaXNEZWJ1Z2dpbmdBdmFpbGFibGUoKSkgewotCQkJc2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJVTEVSX0RPVUJMRV9DTElDSywgZ2V0QWN0aW9uKEFjdGlvbkRlZmluaXRpb25JZHMuVE9HR0xFX0JSRUFLUE9JTlRTKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBUaGUgRGVmYXVsdCBUZXh0IEVkaXRvciB1c2VzIGVkaXRvckNvbnRyaWJ1dGlvbiB0byBwZXJmb3JtIHRoaXMKLQkJCS8vIG1hcHBpbmcsIGJ1dCBzaW5jZSBpdCByZWxpZXMgb24gdGhlIElFZGl0b3JTaXRlIElELCBpdCBjYW4ndCBiZQotCQkJLy8gcmVsaWVkIG9uIGZvciBNdWx0aVBhZ2VFZGl0b3JQYXJ0cy4gSW5zdGVhZCwgZm9yY2UgdGhlIGFjdGlvbgotCQkJLy8gcmVnaXN0cmF0aW9uIG1hbnVhbGx5LgotCQkJc2V0QWN0aW9uKElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJVTEVSX0RPVUJMRV9DTElDSywgbmV3IE1hcmtlclJ1bGVyQWN0aW9uKFNTRVVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKSwgIkVkaXRvci5NYW5hZ2VCb29rbWFya3MuIiwgdGhpcywgZ2V0VmVydGljYWxSdWxlcigpLCBJTWFya2VyLkJPT0tNQVJLLCB0cnVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmU2hvd0luVGFyZ2V0SWRzID0gY3JlYXRlU2hvd0luVGFyZ2V0SWRzKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL0VkaXRCcmVha3BvaW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvRWRpdEJyZWFrcG9pbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFjNDRhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvRWRpdEJyZWFrcG9pbnRBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZWJ1ZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUubW9kZWwuSUJyZWFrcG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5Qcm9wZXJ0eURpYWxvZ0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIEVkaXRCcmVha3BvaW50QWN0aW9uIGV4dGVuZHMgQnJlYWtwb2ludFJ1bGVyQWN0aW9uIHsKLQlwcm90ZWN0ZWQgSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IG51bGw7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIHJ1bGVySW5mbwotCSAqLwotCXB1YmxpYyBFZGl0QnJlYWtwb2ludEFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIElWZXJ0aWNhbFJ1bGVyIHJ1bGVySW5mbykgewotCQlzdXBlcihlZGl0b3IsIHJ1bGVySW5mbyk7Ci0JCXNldFRleHQoU1NFVUlNZXNzYWdlcy5FZGl0QnJlYWtwb2ludEFjdGlvbl8wKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUHJvcGVydHlEaWFsb2dBY3Rpb24gYWN0aW9uID0gbmV3IFByb3BlcnR5RGlhbG9nQWN0aW9uKGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCksIG5ldyBJU2VsZWN0aW9uUHJvdmlkZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBhZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIElTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQkJCXJldHVybiBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihicmVha3BvaW50cyk7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIHJlbW92ZVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJLy8gZG8gbm90aGluZwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBzZXRTZWxlY3Rpb24oSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0JCX0pOwotCQlhY3Rpb24ucnVuKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlib29sZWFuIGVuYWJsZVRoaXNBY3Rpb24gPSBoYXNNYXJrZXJzKCk7Ci0JCXNldEVuYWJsZWQoZW5hYmxlVGhpc0FjdGlvbik7Ci0JCWJyZWFrcG9pbnRzID0gZ2V0QnJlYWtwb2ludHMoZ2V0TWFya2VycygpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvTWFuYWdlQnJlYWtwb2ludEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL01hbmFnZUJyZWFrcG9pbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjN2FjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvTWFuYWdlQnJlYWtwb2ludEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JVmVydGljYWxSdWxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLQotLyoqCi0gKiBNYW5hZ2VCcmVha3BvaW50QWN0aW9uIC0gRW5hYmxlcyBhbmQgRGlzYWJsZXMKLSAqLwotcHVibGljIGNsYXNzIE1hbmFnZUJyZWFrcG9pbnRBY3Rpb24gZXh0ZW5kcyBCcmVha3BvaW50UnVsZXJBY3Rpb24gewotCi0JcHJvdGVjdGVkIElCcmVha3BvaW50W10gYnJlYWtwb2ludHMgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBkb0VuYWJsZSA9IHRydWU7Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIHJ1bGVySW5mbwotCSAqLwotCXB1YmxpYyBNYW5hZ2VCcmVha3BvaW50QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXIgcnVsZXJJbmZvKSB7Ci0JCXN1cGVyKGVkaXRvciwgcnVsZXJJbmZvKTsKLQkJc2V0RW5hYmxlZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZUJyZWFrcG9pbnRzKElCcmVha3BvaW50W10gYnJlYWtwb2ludHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBicmVha3BvaW50cy5sZW5ndGg7IGkrKykgewotCQkJdHJ5IHsKLQkJCQlicmVha3BvaW50c1tpXS5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlbmFibGVCcmVha3BvaW50cyhJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJYnJlYWtwb2ludHNbaV0uc2V0RW5hYmxlZCh0cnVlKTsKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmIChkb0VuYWJsZSkKLQkJCWVuYWJsZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzKTsKLQkJZWxzZQotCQkJZGlzYWJsZUJyZWFrcG9pbnRzKGJyZWFrcG9pbnRzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCS8vIGRvRW5hYmxlIG1lYW5zICJlbmFibGUiIGluc3RlYWQgb2YgImRpc2FibGUiCi0JCWRvRW5hYmxlID0gdHJ1ZTsKLQkJYnJlYWtwb2ludHMgPSBnZXRCcmVha3BvaW50cyhnZXRNYXJrZXJzKCkpOwotCQlmb3IgKGludCBpID0gMDsgZG9FbmFibGUgJiYgaSA8IGJyZWFrcG9pbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlJQnJlYWtwb2ludCBicmVha3BvaW50ID0gYnJlYWtwb2ludHNbaV07Ci0JCQl0cnkgewotCQkJCWlmIChicmVha3BvaW50LmlzRW5hYmxlZCgpKSB7Ci0JCQkJCWRvRW5hYmxlID0gZmFsc2U7Ci0JCQkJfQotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiYnJlYWtwb2ludCBub3QgcmVzcG9uZGluZyB0byBpc0VuYWJsZWQ6ICIgKyBicmVha3BvaW50LCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXNldEVuYWJsZWQoYnJlYWtwb2ludHMgIT0gbnVsbCAmJiBicmVha3BvaW50cy5sZW5ndGggPiAwKTsKLQkJaWYgKGRvRW5hYmxlKQotCQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMCk7IC8vJE5PTi1OTFMtMSQKLQkJZWxzZQotCQkJc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk1hbmFnZUJyZWFrcG9pbnRBY3Rpb25fMSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50QWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVidWcvVG9nZ2xlQnJlYWtwb2ludEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDkzN2JmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5EZWJ1Z1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLklCcmVha3BvaW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy5jb3JlLm1vZGVsLklCcmVha3BvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVZlcnRpY2FsUnVsZXJJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLkJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTb3VyY2VFZGl0aW5nVGV4dFRvb2xzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5icmVha3BvaW50LklCcmVha3BvaW50UHJvdmlkZXI7Ci0KLS8qKgotICogVG9nZ2xlQnJlYWtwb2ludEFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgVG9nZ2xlQnJlYWtwb2ludEFjdGlvbiBleHRlbmRzIEJyZWFrcG9pbnRSdWxlckFjdGlvbiB7Ci0JSUFjdGlvbiBmRmFsbGJhY2tBY3Rpb247Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICogQHBhcmFtIHJ1bGVySW5mbwotCSAqLwotCXB1YmxpYyBUb2dnbGVCcmVha3BvaW50QWN0aW9uKElUZXh0RWRpdG9yIGVkaXRvciwgSVZlcnRpY2FsUnVsZXJJbmZvIHJ1bGVySW5mbykgewotCQlzdXBlcihlZGl0b3IsIHJ1bGVySW5mbyk7Ci0JCXNldFRleHQoU1NFVUlNZXNzYWdlcy5Ub2dnbGVCcmVha3BvaW50QWN0aW9uXzApOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24oSVRleHRFZGl0b3IgZWRpdG9yLCBJVmVydGljYWxSdWxlckluZm8gcnVsZXJJbmZvLCBJQWN0aW9uIGZhbGxiYWNrQWN0aW9uKSB7Ci0JCXRoaXMoZWRpdG9yLCBydWxlckluZm8pOwotCQlmRmFsbGJhY2tBY3Rpb24gPSBmYWxsYmFja0FjdGlvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjcmVhdGVCcmVha3BvaW50cyhpbnQgbGluZU51bWJlcikgewotCQkvKgotCQkgKiBOb3RlOiB3ZSdsbCBhbHdheXMgYWxsb3cgcHJvY2Vzc2luZyB0byBjb250aW51ZSwgZXZlbiBmb3IgYSAicmVhZAotCQkgKiBvbmx5IiBJU3RvcmFnZUVkaXRvcklucHV0LCBmb3IgdGhlIEFjdGl2ZVNjcmlwdCBkZWJ1Z2dlci4gQnV0IHRoaXMKLQkJICogbWVhbnMgc29tZXRpbWVzIHRoZSBBY3RpdmVTY3JpcHQgcHJvdmlkZXIgbWlnaHQgZ2V0IGFuIGlucHV0IGZyb20KLQkJICogQ1ZTIG9yIHNvbWV0aGluZyB0aGF0IGlzIG5vdCByZWxhdGVkIHRvIGRlYnVnZ2luZy4KLQkJICovCi0KLQkJSVRleHRFZGl0b3IgZWRpdG9yID0gZ2V0VGV4dEVkaXRvcigpOwotCQlJRWRpdG9ySW5wdXQgaW5wdXQgPSBlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChpbnB1dCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCVN0cmluZyBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlKGRvY3VtZW50KTsKLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVycyA9IEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRCcmVha3BvaW50UHJvdmlkZXJzKGVkaXRvciwgY29udGVudFR5cGUsIGdldEZpbGVFeHRlbnNpb24oaW5wdXQpKTsKLQotCQlpbnQgcG9zID0gLTE7Ci0JCUlTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRvb2xzID0gKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBlZGl0b3IuZ2V0QWRhcHRlcihJU291cmNlRWRpdGluZ1RleHRUb29scy5jbGFzcyk7Ci0JCWlmICh0b29scyAhPSBudWxsKSB7Ci0JCQlwb3MgPSB0b29scy5nZXRDYXJldE9mZnNldCgpOwotCQl9Ci0KLQkJZmluYWwgaW50IG4gPSBwcm92aWRlcnMubGVuZ3RoOwotCQlMaXN0IGVycm9ycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0JCQl0cnkgewotCQkJCWlmIChEZWJ1Zy5kZWJ1Z0JyZWFrcG9pbnRzKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocHJvdmlkZXJzW2ldLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBhZGRpbmcgYnJlYWtwb2ludCB0byBsaW5lICIgKyBsaW5lTnVtYmVyKTsgLy8kTk9OLU5MUy0xJAotCQkJCUlTdGF0dXMgc3RhdHVzID0gcHJvdmlkZXJzW2ldLmFkZEJyZWFrcG9pbnQoZG9jdW1lbnQsIGlucHV0LCBsaW5lTnVtYmVyLCBwb3MpOwotCQkJCWlmIChzdGF0dXMgIT0gbnVsbCAmJiAhc3RhdHVzLmlzT0soKSkgewotCQkJCQllcnJvcnMuYWRkKHN0YXR1cyk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWVycm9ycy5hZGQoZS5nZXRTdGF0dXMoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gd2hpbGUgYWRkaW5nIGJyZWFrcG9pbnQiLCB0KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKGVycm9ycy5zaXplKCkgPiAwKSB7Ci0JCQlTaGVsbCBzaGVsbCA9IGVkaXRvci5nZXRTaXRlKCkuZ2V0U2hlbGwoKTsKLQkJCU11bHRpU3RhdHVzIGFsbFN0YXR1cyA9IG5ldyBNdWx0aVN0YXR1cyhTU0VVSVBsdWdpbi5JRCwgSVN0YXR1cy5JTkZPLCAoSVN0YXR1c1tdKSBlcnJvcnMudG9BcnJheShuZXcgSVN0YXR1c1swXSksIFNTRVVJTWVzc2FnZXMuTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX21lc3NhZ2UxLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQkJLyoKLQkJCSAqIFNob3cgZm9yIGNvbmRpdGlvbnMgbW9yZSBzZXZlcmUgdGhhbiBJTkZPIG9yIHdoZW4gbm8KLQkJCSAqIGJyZWFrcG9pbnRzIHdlcmUgY3JlYXRlZAotCQkJICovCi0JCQlpZiAoYWxsU3RhdHVzLmdldFNldmVyaXR5KCkgPiBJU3RhdHVzLklORk8gfHwgZ2V0QnJlYWtwb2ludHMoZ2V0TWFya2VycygpKS5sZW5ndGggPCAxKSB7Ci0JCQkJRXJyb3JEaWFsb2cub3BlbkVycm9yKHNoZWxsLCBTU0VVSU1lc3NhZ2VzLk1hbmFnZUJyZWFrcG9pbnRzX2Vycm9yX2FkZGluZ190aXRsZTEsIFNTRVVJTWVzc2FnZXMuTWFuYWdlQnJlYWtwb2ludHNfZXJyb3JfYWRkaW5nX21lc3NhZ2UxLCBhbGxTdGF0dXMpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogQWx0aG91Z2ggbm8gZXJyb3JzIHdlcmUgcmVwb3J0ZWQsIG5vIGJyZWFrcG9pbnRzIGV4aXN0IG9uIHRoaXMgbGluZQotCQkgKiBhZnRlciBoYXZpbmcgcnVuIHRoZSBleGlzdGluZyBwcm92aWRlcnMuIFJ1biB0aGUgZmFsbGJhY2sgYWN0aW9uLgotCQkgKi8KLQkJZWxzZSBpZiAoZkZhbGxiYWNrQWN0aW9uICE9IG51bGwgJiYgIWhhc01hcmtlcnMoKSkgewotCQkJaWYgKGZGYWxsYmFja0FjdGlvbiBpbnN0YW5jZW9mIElTZWxlY3Rpb25MaXN0ZW5lcikgewotCQkJCSgoSVNlbGVjdGlvbkxpc3RlbmVyKSBmRmFsbGJhY2tBY3Rpb24pLnNlbGVjdGlvbkNoYW5nZWQobnVsbCwgbnVsbCk7Ci0JCQl9Ci0JCQlmRmFsbGJhY2tBY3Rpb24ucnVuKCk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSU1vZGVsTWFuYWdlciBtZ3IgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCQlTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOwotCi0JCUlEb2N1bWVudFByb3ZpZGVyIHByb3ZpZGVyID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpOwotCQlpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBJRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbjQpIHsKLQkJCXRyeSB7Ci0JCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSAoKElEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uNCkgcHJvdmlkZXIpLmdldENvbnRlbnRUeXBlKGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJCWlmICh0eXBlICE9IG51bGwpCi0JCQkJCWNvbnRlbnRUeXBlID0gdHlwZS5nZXRJZCgpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCS8qCi0JCQkJICogQSBmYWlsdXJlIGFjY2Vzc2luZyB0aGUgdW5kZXJseWluZyBzdG9yZSByZWFsbHkgaXNuJ3QKLQkJCQkgKiBpbnRlcmVzdGluZywgYWx0aG91Z2ggaXQgY2FuIGJlIGEgcHJvYmxlbSBmb3IKLQkJCQkgKiBJU3RvcmFnZUVkaXRvcklucHV0cy4KLQkJCQkgKi8KLQkJCX0KLQkJfQotCi0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbW9kZWwgPSBtZ3IuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCWNvbnRlbnRUeXBlID0gbW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVCcmVha3BvaW50cyhpbnQgbGluZU51bWJlcikgewotCQlJQnJlYWtwb2ludE1hbmFnZXIgYnJlYWtwb2ludE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJSUJyZWFrcG9pbnRbXSBicmVha3BvaW50cyA9IGdldEJyZWFrcG9pbnRzKGdldE1hcmtlcnMoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCXRyeSB7Ci0JCQkJYnJlYWtwb2ludHNbaV0uZ2V0TWFya2VyKCkuZGVsZXRlKCk7Ci0JCQkJYnJlYWtwb2ludE1hbmFnZXIucmVtb3ZlQnJlYWtwb2ludChicmVha3BvaW50c1tpXSwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaW50IGxpbmVOdW1iZXIgPSBmUnVsZXJJbmZvLmdldExpbmVPZkxhc3RNb3VzZUJ1dHRvbkFjdGl2aXR5KCkgKyAxOwotCQlib29sZWFuIGRvQWRkID0gIWhhc01hcmtlcnMoKTsKLQkJaWYgKGRvQWRkKQotCQkJY3JlYXRlQnJlYWtwb2ludHMobGluZU51bWJlcik7Ci0JCWVsc2UKLQkJCXJlbW92ZUJyZWFrcG9pbnRzKGxpbmVOdW1iZXIpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVXBkYXRlI3VwZGF0ZSgpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZWJ1Zy9Ub2dnbGVCcmVha3BvaW50c1RhcmdldC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwZGQzMTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2RlYnVnL1RvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlYnVnOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmRlYnVnLmNvcmUuRGVidWdQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5JQnJlYWtwb2ludE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZGVidWcuY29yZS5tb2RlbC5JQnJlYWtwb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5BYnN0cmFjdE1hcmtlckFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotCi0vKioKLSAqIEBhdXRob3IgbnNkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2dnbGVCcmVha3BvaW50c1RhcmdldCBpbXBsZW1lbnRzIElUb2dnbGVCcmVha3BvaW50c1RhcmdldCB7Ci0Jc3RhdGljIGZpbmFsIElUb2dnbGVCcmVha3BvaW50c1RhcmdldCBpbnN0YW5jZSA9IG5ldyBUb2dnbGVCcmVha3BvaW50c1RhcmdldCgpOwotCi0JcHVibGljIHN0YXRpYyBJVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKi8KLQlwcml2YXRlIFRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjY2FuVG9nZ2xlTGluZUJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblRvZ2dsZUxpbmVCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlJVGV4dEVkaXRvciBlZGl0b3IgPSAoSVRleHRFZGl0b3IpIHBhcnQuZ2V0QWRhcHRlcihJVGV4dEVkaXRvci5jbGFzcyk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikgewotCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudChlZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpID4gLTEpIHsKLQkJCQlpbnQgbGluZU51bWJlciA9IC0xOwotCQkJCXRyeSB7Ci0JCQkJCWxpbmVOdW1iZXIgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQodGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJCWlmIChsaW5lTnVtYmVyID49IDApIHsKLQkJCQkJVG9nZ2xlQnJlYWtwb2ludEFjdGlvbiB0b2dnbGVyID0gbmV3IFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24oZWRpdG9yLCBudWxsKTsKLQkJCQkJdG9nZ2xlci51cGRhdGUoKTsKLQkJCQkJcmV0dXJuIHRvZ2dsZXIuaXNFbmFibGVkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I2NhblRvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblRvZ2dsZU1ldGhvZEJyZWFrcG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I2NhblRvZ2dsZVdhdGNocG9pbnRzKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblRvZ2dsZVdhdGNocG9pbnRzKElXb3JrYmVuY2hQYXJ0IHBhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwcml2YXRlIElCcmVha3BvaW50W10gZ2V0QnJlYWtwb2ludHMoSVJlc291cmNlIHJlc291cmNlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIEFic3RyYWN0TWFya2VyQW5ub3RhdGlvbk1vZGVsIG1vZGVsLCBpbnQgbGluZU51bWJlcikgewotCQlMaXN0IG1hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmIChyZXNvdXJjZSAhPSBudWxsICYmIG1vZGVsICE9IG51bGwgJiYgcmVzb3VyY2UuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSU1hcmtlcltdIGFsbE1hcmtlcnMgPSByZXNvdXJjZS5maW5kTWFya2VycyhJQnJlYWtwb2ludC5MSU5FX0JSRUFLUE9JTlRfTUFSS0VSLCB0cnVlLCBJUmVzb3VyY2UuREVQVEhfWkVSTyk7Ci0JCQkJaWYgKGFsbE1hcmtlcnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbE1hcmtlcnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCVBvc2l0aW9uIHAgPSBtb2RlbC5nZXRNYXJrZXJQb3NpdGlvbihhbGxNYXJrZXJzW2ldKTsKLQkJCQkJCWludCBtYXJrZXJMaW5lID0gLTE7Ci0JCQkJCQl0cnkgewotCQkJCQkJCW1hcmtlckxpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQocC5nZXRPZmZzZXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZTEpIHsKLQkJCQkJCX0KLQkJCQkJCWlmIChtYXJrZXJMaW5lID09IGxpbmVOdW1iZXIpIHsKLQkJCQkJCQltYXJrZXJzLmFkZChhbGxNYXJrZXJzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIHgpIHsKLQkJCX0KLQkJfQotCQlJQnJlYWtwb2ludE1hbmFnZXIgbWFuYWdlciA9IERlYnVnUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCcmVha3BvaW50TWFuYWdlcigpOwotCQlMaXN0IGJyZWFrcG9pbnRzID0gbmV3IEFycmF5TGlzdChtYXJrZXJzLnNpemUoKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJSUJyZWFrcG9pbnQgYnJlYWtwb2ludCA9IG1hbmFnZXIuZ2V0QnJlYWtwb2ludCgoSU1hcmtlcikgbWFya2Vycy5nZXQoaSkpOwotCQkJaWYgKGJyZWFrcG9pbnQgIT0gbnVsbCkgewotCQkJCWJyZWFrcG9pbnRzLmFkZChicmVha3BvaW50KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElCcmVha3BvaW50W10pIGJyZWFrcG9pbnRzLnRvQXJyYXkobmV3IElCcmVha3BvaW50WzBdKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmRlYnVnLnVpLmFjdGlvbnMuSVRvZ2dsZUJyZWFrcG9pbnRzVGFyZ2V0I3RvZ2dsZUxpbmVCcmVha3BvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0b2dnbGVMaW5lQnJlYWtwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJSVRleHRFZGl0b3IgZWRpdG9yID0gKElUZXh0RWRpdG9yKSBwYXJ0LmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaW50IGxpbmVOdW1iZXIgPSAtMTsKLQkJCXRyeSB7Ci0JCQkJbGluZU51bWJlciA9IGRvY3VtZW50LmdldExpbmVPZk9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQl9Ci0JCQlpZiAobGluZU51bWJlciA+PSAwKSB7Ci0JCQkJVG9nZ2xlQnJlYWtwb2ludEFjdGlvbiB0b2dnbGVyID0gbmV3IFRvZ2dsZUJyZWFrcG9pbnRBY3Rpb24oZWRpdG9yLCBudWxsKTsKLQkJCQl0b2dnbGVyLnVwZGF0ZSgpOwotCQkJCWlmICh0b2dnbGVyLmlzRW5hYmxlZCgpKSB7Ci0JCQkJCUlSZXNvdXJjZSByZXNvdXJjZSA9IHRvZ2dsZXIuZ2V0UmVzb3VyY2UoKTsKLQkJCQkJQWJzdHJhY3RNYXJrZXJBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSB0b2dnbGVyLmdldEFubm90YXRpb25Nb2RlbCgpOwotCQkJCQlJQnJlYWtwb2ludFtdIGJyZWFrcG9pbnRzID0gZ2V0QnJlYWtwb2ludHMocmVzb3VyY2UsIGRvY3VtZW50LCBtb2RlbCwgbGluZU51bWJlcik7Ci0JCQkJCWlmIChicmVha3BvaW50cy5sZW5ndGggPiAwKSB7Ci0JCQkJCQlJQnJlYWtwb2ludE1hbmFnZXIgYnJlYWtwb2ludE1hbmFnZXIgPSBEZWJ1Z1BsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnJlYWtwb2ludE1hbmFnZXIoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYnJlYWtwb2ludHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlicmVha3BvaW50c1tpXS5nZXRNYXJrZXIoKS5kZWxldGUoKTsKLQkJCQkJCQlicmVha3BvaW50TWFuYWdlci5yZW1vdmVCcmVha3BvaW50KGJyZWFrcG9pbnRzW2ldLCB0cnVlKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXRvZ2dsZXIuY3JlYXRlQnJlYWtwb2ludHMobGluZU51bWJlciArIDEpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5kZWJ1Zy51aS5hY3Rpb25zLklUb2dnbGVCcmVha3BvaW50c1RhcmdldCN0b2dnbGVNZXRob2RCcmVha3BvaW50cyhvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCB0b2dnbGVNZXRob2RCcmVha3BvaW50cyhJV29ya2JlbmNoUGFydCBwYXJ0LCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuZGVidWcudWkuYWN0aW9ucy5JVG9nZ2xlQnJlYWtwb2ludHNUYXJnZXQjdG9nZ2xlV2F0Y2hwb2ludHMob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb24pCi0JICovCi0JcHVibGljIHZvaWQgdG9nZ2xlV2F0Y2hwb2ludHMoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL0hUTUwyVGV4dFJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTDJUZXh0UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1YTYzNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTDJUZXh0UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZGVyaXZlZDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QdXNoYmFja1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci0KLS8qCi0gKiBDb3BpZWQgZnJvbSBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkudGV4dC5IVE1MMlRleHRSZWFkZXIgTW9kaWZpY2F0aW9ucwotICogd2VyZSBtYWRlIHRvIGFkZCBici8gdGFnIGFuZCBmaXggd2FybmluZ3MKLSAqLwotLyoqCi0gKiBSZWFkcyB0aGUgdGV4dCBjb250ZW50cyBmcm9tIGEgcmVhZGVyIG9mIEhUTUwgY29udGVudHMgYW5kIHRyYW5zbGF0ZXMgdGhlCi0gKiB0YWdzIG9yIGN1dCB0aGVtIG91dC4KLSAqLwotcHVibGljIGNsYXNzIEhUTUwyVGV4dFJlYWRlciBleHRlbmRzIFN1YnN0aXR1dGlvblRleHRSZWFkZXIgewotCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORz0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXAgZmdFbnRpdHlMb29rdXA7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0IGZnVGFnczsKLQotCXN0YXRpYyB7Ci0KLQkJZmdUYWdzPSBuZXcgSGFzaFNldCgpOwotCQlmZ1RhZ3MuYWRkKCJiIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgiYnIiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJici8iKTsvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImg1Iik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgicCIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImRsIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgiZHQiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJkZCIpOyAvLyROT04tTkxTLTEkCi0JCWZnVGFncy5hZGQoImxpIik7IC8vJE5PTi1OTFMtMSQKLQkJZmdUYWdzLmFkZCgidWwiKTsgLy8kTk9OLU5MUy0xJAotCQlmZ1RhZ3MuYWRkKCJwcmUiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZnRW50aXR5TG9va3VwPSBuZXcgSGFzaE1hcCg3KTsKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJsdCIsICI8Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZ0VudGl0eUxvb2t1cC5wdXQoImd0IiwgIj4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWZnRW50aXR5TG9va3VwLnB1dCgibmJzcCIsICIgIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZ0VudGl0eUxvb2t1cC5wdXQoImFtcCIsICImIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlmZ0VudGl0eUxvb2t1cC5wdXQoImNpcmMiLCAiXiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJZmdFbnRpdHlMb29rdXAucHV0KCJ0aWxkZSIsICJ+Iik7IC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0xJAotCQlmZ0VudGl0eUxvb2t1cC5wdXQoInF1b3QiLCAiXCIiKTsJCSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQlwcml2YXRlIGludCBmQ291bnRlcj0gMDsKLQlwcml2YXRlIFRleHRQcmVzZW50YXRpb24gZlRleHRQcmVzZW50YXRpb247Ci0JcHJpdmF0ZSBpbnQgZkJvbGQ9IDA7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0T2Zmc2V0PSAtMTsKLQlwcml2YXRlIGJvb2xlYW4gZkluUGFyYWdyYXBoPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZklzUHJlZm9ybWF0dGVkVGV4dD0gZmFsc2U7Ci0KLQkvKioKLQkgKiBUcmFuc2Zvcm1zIHRoZSBodG1sIHRleHQgZnJvbSB0aGUgcmVhZGVyIHRvIGZvcm1hdHRlZCB0ZXh0LgotCSAqIEBwYXJhbSBwcmVzZW50YXRpb24gSWYgbm90IDxjb2RlPm51bGw8L2NvZGU+LCBmb3JtYXR0aW5ncyB3aWxsIGJlIGFwcGxpZWQgdG8KLQkgKiB0aGUgcHJlc2VudGF0aW9uLgotCSovCi0JcHVibGljIEhUTUwyVGV4dFJlYWRlcihSZWFkZXIgcmVhZGVyLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCQlzdXBlcihuZXcgUHVzaGJhY2tSZWFkZXIocmVhZGVyKSk7Ci0JCWZUZXh0UHJlc2VudGF0aW9uPSBwcmVzZW50YXRpb247Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGM9IHN1cGVyLnJlYWQoKTsKLQkJaWYgKGMgIT0gLTEpCi0JCQkrKyBmQ291bnRlcjsKLQkJcmV0dXJuIGM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RhcnRCb2xkKCkgewotCQlpZiAoZkJvbGQgPT0gMCkKLQkJCWZTdGFydE9mZnNldD0gZkNvdW50ZXI7Ci0JCSsrIGZCb2xkOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0YXJ0UHJlZm9ybWF0dGVkVGV4dCgpIHsKLQkJZklzUHJlZm9ybWF0dGVkVGV4dD0gdHJ1ZTsKLQkJc2V0U2tpcFdoaXRlc3BhY2UoZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3BQcmVmb3JtYXR0ZWRUZXh0KCkgewotCQlmSXNQcmVmb3JtYXR0ZWRUZXh0PSBmYWxzZTsKLQkJc2V0U2tpcFdoaXRlc3BhY2UodHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcEJvbGQoKSB7Ci0JCS0tIGZCb2xkOwotCQlpZiAoZkJvbGQgPT0gMCkgewotCQkJaWYgKGZUZXh0UHJlc2VudGF0aW9uICE9IG51bGwpIHsKLQkJCQlmVGV4dFByZXNlbnRhdGlvbi5hZGRTdHlsZVJhbmdlKG5ldyBTdHlsZVJhbmdlKGZTdGFydE9mZnNldCwgZkNvdW50ZXIgLSBmU3RhcnRPZmZzZXQsIG51bGwsIG51bGwsIFNXVC5CT0xEKSk7Ci0JCQl9Ci0JCQlmU3RhcnRPZmZzZXQ9IC0xOwotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LlN1YnN0aXR1dGlvblRleHRSZWFkZXIjY29tcHV0ZVN1YnN0aXR1dGlvbihpbnQpCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlU3Vic3RpdHV0aW9uKGludCBjKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCWlmIChjID09ICc8JykKLQkJCXJldHVybiAgcHJvY2Vzc0hUTUxUYWcoKTsKLQkJZWxzZSBpZiAoYyA9PSAnJicpCi0JCQlyZXR1cm4gcHJvY2Vzc0VudGl0eSgpOwotCQllbHNlIGlmIChmSXNQcmVmb3JtYXR0ZWRUZXh0KQotCQkJcmV0dXJuIHByb2Nlc3NQcmVmb3JtYXR0ZWRUZXh0KGMpOwotCi0JCXJldHVybiBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGh0bWwyVGV4dChTdHJpbmcgaHRtbCkgewotCi0JCWlmIChodG1sID09IG51bGwgfHwgaHRtbC5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQotCQlTdHJpbmcgdGFnPSBodG1sOwotCQlpZiAoJy8nID09IHRhZy5jaGFyQXQoMCkpCi0JCQl0YWc9IHRhZy5zdWJzdHJpbmcoMSk7Ci0KLQkJaWYgKCFmZ1RhZ3MuY29udGFpbnModGFnKSkKLQkJCXJldHVybiBFTVBUWV9TVFJJTkc7Ci0KLQotCQlpZiAoInByZSIuZXF1YWxzKGh0bWwpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXJ0UHJlZm9ybWF0dGVkVGV4dCgpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmICgiL3ByZSIuZXF1YWxzKGh0bWwpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXN0b3BQcmVmb3JtYXR0ZWRUZXh0KCk7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0KLQkJaWYgKGZJc1ByZWZvcm1hdHRlZFRleHQpCi0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCi0JCWlmICgiYiIuZXF1YWxzKGh0bWwpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXN0YXJ0Qm9sZCgpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmICgiaDUiLmVxdWFscyhodG1sKSB8fCAiZHQiLmVxdWFscyhodG1sKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXN0YXJ0Qm9sZCgpOwotCQkJcmV0dXJuIEVNUFRZX1NUUklORzsKLQkJfQotCi0JCWlmICgiZGwiLmVxdWFscyhodG1sKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIExJTkVfREVMSU07Ci0KLQkJaWYgKCJkZCIuZXF1YWxzKGh0bWwpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gIlx0IjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmICgibGkiLmVxdWFscyhodG1sKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIExJTkVfREVMSU0gKyAiXHQiICsgIi0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJaWYgKCIvYiIuZXF1YWxzKGh0bWwpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXN0b3BCb2xkKCk7Ci0JCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCQl9Ci0KLQkJaWYgKCJwIi5lcXVhbHMoaHRtbCkpICB7IC8vJE5PTi1OTFMtMSQKLQkJCWZJblBhcmFncmFwaD0gdHJ1ZTsKLQkJCXJldHVybiBMSU5FX0RFTElNOwotCQl9Ci0KLQkJaWYgKCJiciIuZXF1YWxzKGh0bWwpIHx8ICJici8iLmVxdWFscyhodG1sKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlyZXR1cm4gTElORV9ERUxJTTsKLQotCQlpZiAoIi9wIi5lcXVhbHMoaHRtbCkpICB7IC8vJE5PTi1OTFMtMSQKLQkJCWJvb2xlYW4gaW5QYXJhZ3JhcGg9IGZJblBhcmFncmFwaDsKLQkJCWZJblBhcmFncmFwaD0gZmFsc2U7Ci0JCQlyZXR1cm4gaW5QYXJhZ3JhcGggPyBFTVBUWV9TVFJJTkcgOiBMSU5FX0RFTElNOwotCQl9Ci0KLQkJaWYgKCIvaDUiLmVxdWFscyhodG1sKSB8fCAiL2R0Ii5lcXVhbHMoaHRtbCkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlzdG9wQm9sZCgpOwotCQkJcmV0dXJuIExJTkVfREVMSU07Ci0JCX0KLQotCQlpZiAoIi9kZCIuZXF1YWxzKGh0bWwpKSAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gTElORV9ERUxJTTsKLQotCQlyZXR1cm4gRU1QVFlfU1RSSU5HOwotCX0KLQotCS8qCi0JICogQSAnPCcgaGFzIGJlZW4gcmVhZC4gUHJvY2VzcyBhIGh0bWwgdGFnCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgcHJvY2Vzc0hUTUxUYWcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCVN0cmluZ0J1ZmZlciBidWY9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaW50IGNoOwotCQlkbyB7Ci0KLQkJCWNoPSBuZXh0Q2hhcigpOwotCi0JCQl3aGlsZSAoY2ggIT0gLTEgJiYgY2ggIT0gJz4nKSB7Ci0JCQkJYnVmLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoKGNoYXIpIGNoKSk7Ci0JCQkJY2g9IG5leHRDaGFyKCk7Ci0JCQkJaWYgKGNoID09ICciJyl7Ci0JCQkJCWJ1Zi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKChjaGFyKSBjaCkpOwotCQkJCQljaD0gbmV4dENoYXIoKTsKLQkJCQkJd2hpbGUgKGNoICE9IC0xICYmIGNoICE9ICciJyl7Ci0JCQkJCQlidWYuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZSgoY2hhcikgY2gpKTsKLQkJCQkJCWNoPSBuZXh0Q2hhcigpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChjaCA9PSAnPCcpewotCQkJCQl1bnJlYWQoY2gpOwotCQkJCQlyZXR1cm4gJzwnICsgYnVmLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoY2ggPT0gLTEpCi0JCQkJcmV0dXJuIG51bGw7Ci0KLQkJCWludCB0YWdMZW49IGJ1Zi5sZW5ndGgoKTsKLQkJCS8vIG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50IGZvciBjb21tZW50cwotCQkJaWYgKCh0YWdMZW4gPj0gMyAmJiAiIS0tIi5lcXVhbHMoYnVmLnN1YnN0cmluZygwLCAzKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkmJiAhKHRhZ0xlbiA+PSA1ICYmICItLSIuZXF1YWxzKGJ1Zi5zdWJzdHJpbmcodGFnTGVuIC0gMikpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJLy8gdW5maW5pc2hlZCBjb21tZW50Ci0JCQkJYnVmLmFwcGVuZChjaCk7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9IHdoaWxlICh0cnVlKTsKLQotCQlyZXR1cm4gaHRtbDJUZXh0KGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzUHJlZm9ybWF0dGVkVGV4dChpbnQgYykgewotCQlpZiAgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JCQlmQ291bnRlcisrOwotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQotCXByaXZhdGUgdm9pZCB1bnJlYWQoaW50IGNoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQkoKFB1c2hiYWNrUmVhZGVyKSBnZXRSZWFkZXIoKSkudW5yZWFkKGNoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGVudGl0eTJUZXh0KFN0cmluZyBzeW1ib2wpIHsKLQkJaWYgKHN5bWJvbC5sZW5ndGgoKSA+IDEgJiYgc3ltYm9sLmNoYXJBdCgwKSA9PSAnIycpIHsKLQkJCWludCBjaDsKLQkJCXRyeSB7Ci0JCQkJaWYgKHN5bWJvbC5jaGFyQXQoMSkgPT0gJ3gnKSB7Ci0JCQkJCWNoPSBJbnRlZ2VyLnBhcnNlSW50KHN5bWJvbC5zdWJzdHJpbmcoMiksIDE2KTsKLQkJCQl9IGVsc2UgewotCQkJCQljaD0gSW50ZWdlci5wYXJzZUludChzeW1ib2wuc3Vic3RyaW5nKDEpLCAxMCk7Ci0JCQkJfQotCQkJCXJldHVybiBFTVBUWV9TVFJJTkcgKyAoY2hhciljaDsKLQkJCX0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIHByb2JsZW0/Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlTdHJpbmcgc3RyPSAoU3RyaW5nKSBmZ0VudGl0eUxvb2t1cC5nZXQoc3ltYm9sKTsKLQkJCWlmIChzdHIgIT0gbnVsbCkgewotCQkJCXJldHVybiBzdHI7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuICImIiArIHN5bWJvbDsgLy8gbm90IGZvdW5kIC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIEEgJyYnIGhhcyBiZWVuIHJlYWQuIFByb2Nlc3MgYSBlbnRpdHkKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBwcm9jZXNzRW50aXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJU3RyaW5nQnVmZmVyIGJ1Zj0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g9IG5leHRDaGFyKCk7Ci0JCXdoaWxlIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KChjaGFyKWNoKSB8fCBjaCA9PSAnIycpIHsKLQkJCWJ1Zi5hcHBlbmQoKGNoYXIpIGNoKTsKLQkJCWNoPSBuZXh0Q2hhcigpOwotCQl9Ci0KLQkJaWYgKGNoID09ICc7JykKLQkJCXJldHVybiBlbnRpdHkyVGV4dChidWYudG9TdHJpbmcoKSk7Ci0KLQkJYnVmLmluc2VydCgwLCAnJicpOwotCQlpZiAoY2ggIT0gLTEpCi0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MVGV4dFByZXNlbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvSFRNTFRleHRQcmVzZW50ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NDM1Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9IVE1MVGV4dFByZXNlbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0UHJlc2VudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkhUTUxUZXh0UHJlc2VudGVyCi0gKiBNb2RpZmljYXRpb25zIHdlcmUgbWFkZSB0byB1c2Ugb3duIExvZ2dlciB0byBsb2cgZXhjZXB0aW9uLCBhbmQgdGhlCi0gKiBlbGxpcHNlcyBjb25zdGFudAotICovCi1wdWJsaWMgY2xhc3MgSFRNTFRleHRQcmVzZW50ZXIgaW1wbGVtZW50cyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sLklJbmZvcm1hdGlvblByZXNlbnRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVMTElQU0VTID0gIi4uLiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9ERUxJTSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIGludCBmQ291bnRlcjsKLQlwcml2YXRlIGJvb2xlYW4gZkVuZm9yY2VVcHBlckxpbmVMaW1pdDsKLQotCXB1YmxpYyBIVE1MVGV4dFByZXNlbnRlcihib29sZWFuIGVuZm9yY2VVcHBlckxpbmVMaW1pdCkgewotCQlzdXBlcigpOwotCQlmRW5mb3JjZVVwcGVyTGluZUxpbWl0ID0gZW5mb3JjZVVwcGVyTGluZUxpbWl0OwotCX0KLQotCXB1YmxpYyBIVE1MVGV4dFByZXNlbnRlcigpIHsKLQkJdGhpcyh0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVhZGVyIGNyZWF0ZVJlYWRlcihTdHJpbmcgaG92ZXJJbmZvLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCQlyZXR1cm4gbmV3IEhUTUwyVGV4dFJlYWRlcihuZXcgU3RyaW5nUmVhZGVyKGhvdmVySW5mbyksIHByZXNlbnRhdGlvbik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRhcHRUZXh0UHJlc2VudGF0aW9uKFRleHRQcmVzZW50YXRpb24gcHJlc2VudGF0aW9uLCBpbnQgb2Zmc2V0LCBpbnQgaW5zZXJ0TGVuZ3RoKSB7Ci0KLQkJaW50IHlvdXJzU3RhcnQgPSBvZmZzZXQ7Ci0JCWludCB5b3Vyc0VuZCA9IG9mZnNldCArIGluc2VydExlbmd0aCAtIDE7Ci0JCXlvdXJzRW5kID0gTWF0aC5tYXgoeW91cnNTdGFydCwgeW91cnNFbmQpOwotCi0JCUl0ZXJhdG9yIGUgPSBwcmVzZW50YXRpb24uZ2V0QWxsU3R5bGVSYW5nZUl0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCi0JCQlTdHlsZVJhbmdlIHJhbmdlID0gKFN0eWxlUmFuZ2UpIGUubmV4dCgpOwotCi0JCQlpbnQgbXlTdGFydCA9IHJhbmdlLnN0YXJ0OwotCQkJaW50IG15RW5kID0gcmFuZ2Uuc3RhcnQgKyByYW5nZS5sZW5ndGggLSAxOwotCQkJbXlFbmQgPSBNYXRoLm1heChteVN0YXJ0LCBteUVuZCk7Ci0KLQkJCWlmIChteUVuZCA8IHlvdXJzU3RhcnQpCi0JCQkJY29udGludWU7Ci0KLQkJCWlmIChteVN0YXJ0IDwgeW91cnNTdGFydCkKLQkJCQlyYW5nZS5sZW5ndGggKz0gaW5zZXJ0TGVuZ3RoOwotCQkJZWxzZQotCQkJCXJhbmdlLnN0YXJ0ICs9IGluc2VydExlbmd0aDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHN0cmluZywgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQotCQlpbnQgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aCgpOwotCQlidWZmZXIuYXBwZW5kKHN0cmluZyk7Ci0KLQkJaWYgKHByZXNlbnRhdGlvbiAhPSBudWxsKQotCQkJYWRhcHRUZXh0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbiwgZkNvdW50ZXIsIGxlbmd0aCk7Ci0KLQkJZkNvdW50ZXIgKz0gbGVuZ3RoOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldEluZGVudChTdHJpbmcgbGluZSkgewotCQlpbnQgbGVuZ3RoID0gbGluZS5sZW5ndGgoKTsKLQotCQlpbnQgaSA9IDA7Ci0JCXdoaWxlIChpIDwgbGVuZ3RoICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UobGluZS5jaGFyQXQoaSkpKQotCQkJKytpOwotCi0JCXJldHVybiAoaSA9PSBsZW5ndGggPyBsaW5lIDogbGluZS5zdWJzdHJpbmcoMCwgaSkpICsgIiAiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiBAc2VlIElIb3ZlckluZm9ybWF0aW9uUHJlc2VudGVyI3VwZGF0ZVByZXNlbnRhdGlvbihEaXNwbGF5IGRpc3BsYXksCi0JICogICAgICBTdHJpbmcsIFRleHRQcmVzZW50YXRpb24sIGludCwgaW50KQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdXBkYXRlUHJlc2VudGF0aW9uKERpc3BsYXkgZGlzcGxheSwgU3RyaW5nIGhvdmVySW5mbywgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24sIGludCBtYXhXaWR0aCwgaW50IG1heEhlaWdodCkgewotCi0JCWlmIChob3ZlckluZm8gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUdDIGdjID0gbmV3IEdDKGRpc3BsYXkpOwotCQl0cnkgewotCi0JCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJaW50IG1heE51bWJlck9mTGluZXMgPSBNYXRoLnJvdW5kKG1heEhlaWdodCAvIGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCkpOwotCi0JCQlmQ291bnRlciA9IDA7Ci0JCQlMaW5lQnJlYWtpbmdSZWFkZXIgcmVhZGVyID0gbmV3IExpbmVCcmVha2luZ1JlYWRlcihjcmVhdGVSZWFkZXIoaG92ZXJJbmZvLCBwcmVzZW50YXRpb24pLCBnYywgbWF4V2lkdGgpOwotCi0JCQlib29sZWFuIGxhc3RMaW5lRm9ybWF0dGVkID0gZmFsc2U7Ci0JCQlTdHJpbmcgbGFzdExpbmVJbmRlbnQgPSBudWxsOwotCi0JCQlTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOwotCQkJYm9vbGVhbiBsaW5lRm9ybWF0dGVkID0gcmVhZGVyLmlzRm9ybWF0dGVkTGluZSgpOwotCQkJYm9vbGVhbiBmaXJzdExpbmVQcm9jZXNzZWQgPSBmYWxzZTsKLQotCQkJd2hpbGUgKGxpbmUgIT0gbnVsbCkgewotCi0JCQkJaWYgKGZFbmZvcmNlVXBwZXJMaW5lTGltaXQgJiYgbWF4TnVtYmVyT2ZMaW5lcyA8PSAwKQotCQkJCQlicmVhazsKLQotCQkJCWlmIChmaXJzdExpbmVQcm9jZXNzZWQpIHsKLQkJCQkJaWYgKCFsYXN0TGluZUZvcm1hdHRlZCkKLQkJCQkJCWFwcGVuZChidWZmZXIsIExJTkVfREVMSU0sIG51bGwpOwotCQkJCQllbHNlIHsKLQkJCQkJCWFwcGVuZChidWZmZXIsIExJTkVfREVMSU0sIHByZXNlbnRhdGlvbik7Ci0JCQkJCQlpZiAobGFzdExpbmVJbmRlbnQgIT0gbnVsbCkKLQkJCQkJCQlhcHBlbmQoYnVmZmVyLCBsYXN0TGluZUluZGVudCwgcHJlc2VudGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWFwcGVuZChidWZmZXIsIGxpbmUsIG51bGwpOwotCQkJCWZpcnN0TGluZVByb2Nlc3NlZCA9IHRydWU7Ci0KLQkJCQlsYXN0TGluZUZvcm1hdHRlZCA9IGxpbmVGb3JtYXR0ZWQ7Ci0JCQkJaWYgKCFsaW5lRm9ybWF0dGVkKQotCQkJCQlsYXN0TGluZUluZGVudCA9IG51bGw7Ci0JCQkJZWxzZSBpZiAobGFzdExpbmVJbmRlbnQgPT0gbnVsbCkKLQkJCQkJbGFzdExpbmVJbmRlbnQgPSBnZXRJbmRlbnQobGluZSk7Ci0KLQkJCQlsaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7Ci0JCQkJbGluZUZvcm1hdHRlZCA9IHJlYWRlci5pc0Zvcm1hdHRlZExpbmUoKTsKLQotCQkJCW1heE51bWJlck9mTGluZXMtLTsKLQkJCX0KLQotCQkJaWYgKGxpbmUgIT0gbnVsbCAmJiBidWZmZXIubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJYXBwZW5kKGJ1ZmZlciwgTElORV9ERUxJTSwgbGluZUZvcm1hdHRlZCA/IHByZXNlbnRhdGlvbiA6IG51bGwpOwotCQkJCWFwcGVuZChidWZmZXIsIEVMTElQU0VTLCBwcmVzZW50YXRpb24pOwotCQkJfQotCi0JCQlyZXR1cm4gdHJpbShidWZmZXIsIHByZXNlbnRhdGlvbik7Ci0KLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0KLQkJfSBmaW5hbGx5IHsKLQkJCWdjLmRpc3Bvc2UoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3RyaW5nIHRyaW0oU3RyaW5nQnVmZmVyIGJ1ZmZlciwgVGV4dFByZXNlbnRhdGlvbiBwcmVzZW50YXRpb24pIHsKLQotCQlpbnQgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCgpOwotCi0JCWludCBlbmQgPSBsZW5ndGggLSAxOwotCQl3aGlsZSAoZW5kID49IDAgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShidWZmZXIuY2hhckF0KGVuZCkpKQotCQkJLS1lbmQ7Ci0KLQkJaWYgKGVuZCA9PSAtMSkKLQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCWlmIChlbmQgPCBsZW5ndGggLSAxKQotCQkJYnVmZmVyLmRlbGV0ZShlbmQgKyAxLCBsZW5ndGgpOwotCQllbHNlCi0JCQllbmQgPSBsZW5ndGg7Ci0KLQkJaW50IHN0YXJ0ID0gMDsKLQkJd2hpbGUgKHN0YXJ0IDwgZW5kICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoYnVmZmVyLmNoYXJBdChzdGFydCkpKQotCQkJKytzdGFydDsKLQotCQlidWZmZXIuZGVsZXRlKDAsIHN0YXJ0KTsKLQkJcHJlc2VudGF0aW9uLnNldFJlc3VsdFdpbmRvdyhuZXcgUmVnaW9uKHN0YXJ0LCBidWZmZXIubGVuZ3RoKCkpKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL0xpbmVCcmVha2luZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvTGluZUJyZWFraW5nUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZjdmNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvTGluZUJyZWFraW5nUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5CcmVha0l0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotCi0vKioKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LkxpbmVCcmVha2luZ1JlYWRlci4KLSAqIE1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlIHRvIGZpeCB3YXJuaW5ncy4KLSAqLwotLyoKLSAqIE5vdCBhIHJlYWwgcmVhZGVyLiBDb3VsZCBjaGFuZ2UgaWYgcmVxdWVzdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBMaW5lQnJlYWtpbmdSZWFkZXIgewotCXByaXZhdGUgR0MgZkdDOwotCi0JcHJpdmF0ZSBTdHJpbmcgZkxpbmU7Ci0KLQlwcml2YXRlIEJyZWFrSXRlcmF0b3IgZkxpbmVCcmVha0l0ZXJhdG9yOwotCXByaXZhdGUgaW50IGZNYXhXaWR0aDsKLQlwcml2YXRlIGludCBmT2Zmc2V0OwotCi0KLQlwcml2YXRlIEJ1ZmZlcmVkUmVhZGVyIGZSZWFkZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgcmVhZGVyIHRoYXQgYnJlYWtzIGFuIGlucHV0IHRleHQgdG8gZml0IGluIGEgZ2l2ZW4gd2lkdGguCi0JICogCi0JICogQHBhcmFtIHJlYWRlcgotCSAqICAgICAgICAgICAgUmVhZGVyIG9mIHRoZSBpbnB1dCB0ZXh0Ci0JICogQHBhcmFtIGdjCi0JICogICAgICAgICAgICBUaGUgZ3JhcGhpYyBjb250ZXh0IHRoYXQgZGVmaW5lcyB0aGUgY3VycmVudGx5IHVzZWQgZm9udAotCSAqICAgICAgICAgICAgc2l6ZXMKLQkgKiBAcGFyYW0gbWF4TGluZVdpZHRoCi0JICogICAgICAgICAgICBUaGUgbWF4IHdpZHRoIChwaXhlcykgd2hlcmUgdGhlIHRleHQgaGFzIHRvIGZpdCBpbgotCSAqLwotCXB1YmxpYyBMaW5lQnJlYWtpbmdSZWFkZXIoUmVhZGVyIHJlYWRlciwgR0MgZ2MsIGludCBtYXhMaW5lV2lkdGgpIHsKLQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZWFkZXIpOwotCQlmR0MgPSBnYzsKLQkJZk1heFdpZHRoID0gbWF4TGluZVdpZHRoOwotCQlmT2Zmc2V0ID0gMDsKLQkJZkxpbmUgPSBudWxsOwotCQlmTGluZUJyZWFrSXRlcmF0b3IgPSBCcmVha0l0ZXJhdG9yLmdldExpbmVJbnN0YW5jZSgpOwotCX0KLQotCXByaXZhdGUgaW50IGZpbmROZXh0QnJlYWtPZmZzZXQoaW50IGN1cnJPZmZzZXQpIHsKLQkJaW50IGN1cnJXaWR0aCA9IDA7Ci0JCWludCBuZXh0T2Zmc2V0ID0gZkxpbmVCcmVha0l0ZXJhdG9yLmZvbGxvd2luZyhjdXJyT2Zmc2V0KTsKLQkJd2hpbGUgKG5leHRPZmZzZXQgIT0gQnJlYWtJdGVyYXRvci5ET05FKSB7Ci0JCQlTdHJpbmcgd29yZCA9IGZMaW5lLnN1YnN0cmluZyhjdXJyT2Zmc2V0LCBuZXh0T2Zmc2V0KTsKLQkJCWludCB3b3JkV2lkdGggPSBmR0MudGV4dEV4dGVudCh3b3JkKS54OwotCQkJaW50IG5leHRXaWR0aCA9IHdvcmRXaWR0aCArIGN1cnJXaWR0aDsKLQkJCWlmIChuZXh0V2lkdGggPiBmTWF4V2lkdGgpIHsKLQkJCQlpZiAoY3VycldpZHRoID4gMCkgewotCQkJCQlyZXR1cm4gY3Vyck9mZnNldDsKLQkJCQl9Ci0JCQkJcmV0dXJuIG5leHRPZmZzZXQ7Ci0JCQl9Ci0JCQljdXJyV2lkdGggPSBuZXh0V2lkdGg7Ci0JCQljdXJyT2Zmc2V0ID0gbmV4dE9mZnNldDsKLQkJCW5leHRPZmZzZXQgPSBmTGluZUJyZWFrSXRlcmF0b3IubmV4dCgpOwotCQl9Ci0JCXJldHVybiBuZXh0T2Zmc2V0OwotCX0KLQotCXByaXZhdGUgaW50IGZpbmRXb3JkQmVnaW4oaW50IGlkeCkgewotCQl3aGlsZSAoaWR4IDwgZkxpbmUubGVuZ3RoKCkgJiYgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShmTGluZS5jaGFyQXQoaWR4KSkpIHsKLQkJCWlkeCsrOwotCQl9Ci0JCXJldHVybiBpZHg7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNGb3JtYXR0ZWRMaW5lKCkgewotCQlyZXR1cm4gZkxpbmUgIT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZWFkcyB0aGUgbmV4dCBsaW5lLiBUaGUgbGVuZ3RocyBvZiB0aGUgbGluZSB3aWxsIG5vdCBleGNlZWQgdGhlIGdpdmVkCi0JICogbWF4aW11bSB3aWR0aC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHJlYWRMaW5lKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGZMaW5lID09IG51bGwpIHsKLQkJCVN0cmluZyBsaW5lID0gZlJlYWRlci5yZWFkTGluZSgpOwotCQkJaWYgKGxpbmUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQotCQkJaW50IGxpbmVMZW4gPSBmR0MudGV4dEV4dGVudChsaW5lKS54OwotCQkJaWYgKGxpbmVMZW4gPCBmTWF4V2lkdGgpIHsKLQkJCQlyZXR1cm4gbGluZTsKLQkJCX0KLQkJCWZMaW5lID0gbGluZTsKLQkJCWZMaW5lQnJlYWtJdGVyYXRvci5zZXRUZXh0KGxpbmUpOwotCQkJZk9mZnNldCA9IDA7Ci0JCX0KLQkJaW50IGJyZWFrT2Zmc2V0ID0gZmluZE5leHRCcmVha09mZnNldChmT2Zmc2V0KTsKLQkJU3RyaW5nIHJlczsKLQkJaWYgKGJyZWFrT2Zmc2V0ICE9IEJyZWFrSXRlcmF0b3IuRE9ORSkgewotCQkJcmVzID0gZkxpbmUuc3Vic3RyaW5nKGZPZmZzZXQsIGJyZWFrT2Zmc2V0KTsKLQkJCWZPZmZzZXQgPSBmaW5kV29yZEJlZ2luKGJyZWFrT2Zmc2V0KTsKLQkJCWlmIChmT2Zmc2V0ID09IGZMaW5lLmxlbmd0aCgpKSB7Ci0JCQkJZkxpbmUgPSBudWxsOwotCQkJfQotCQl9IGVsc2UgewotCQkJcmVzID0gZkxpbmUuc3Vic3RyaW5nKGZPZmZzZXQpOwotCQkJZkxpbmUgPSBudWxsOwotCQl9Ci0JCXJldHVybiByZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Rlcml2ZWQvU2luZ2xlQ2hhclJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDk3ZDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL1NpbmdsZUNoYXJSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5kZXJpdmVkOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotLyoKLSAqIENvcGllZCBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC5jb3JleHQuamF2YWRvYy5TaW5nbGVDaGFyUmVhZGVyLgotICogTW9kaWZpY2F0aW9uIHdhcyBtYWRlIHRvIGZpeCBzdGF0ZW1lbnQgdW5uZWNlc3NhcmlseSBuZXN0ZWQgd2l0aGluIGVsc2UKLSAqIGNsYXVzZSB3YXJuaW5nIGluIHJlYWQoLi4pLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU2luZ2xlQ2hhclJlYWRlciBleHRlbmRzIFJlYWRlciB7Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKCkKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkKGNoYXJbXSxpbnQsaW50KQotCSAqLwotCXB1YmxpYyBpbnQgcmVhZChjaGFyIGNidWZbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGVuZCA9IG9mZiArIGxlbjsKLQkJZm9yIChpbnQgaSA9IG9mZjsgaSA8IGVuZDsgaSsrKSB7Ci0JCQlpbnQgY2ggPSByZWFkKCk7Ci0JCQlpZiAoY2ggPT0gLTEpIHsKLQkJCQlpZiAoaSA9PSBvZmYpIHsKLQkJCQkJcmV0dXJuIC0xOwotCQkJCX0KLQkJCQlyZXR1cm4gaSAtIG9mZjsKLQkJCX0KLQkJCWNidWZbaV0gPSAoY2hhcikgY2g7Ci0JCX0KLQkJcmV0dXJuIGxlbjsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBjb250ZW50IGFzIGEgU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpbnQgY2g7Ci0JCXdoaWxlICgoY2ggPSByZWFkKCkpICE9IC0xKSB7Ci0JCQlidWYuYXBwZW5kKChjaGFyKSBjaCk7Ci0JCX0KLQkJcmV0dXJuIGJ1Zi50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL1N1YnN0aXR1dGlvblRleHRSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9kZXJpdmVkL1N1YnN0aXR1dGlvblRleHRSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkOWI2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZGVyaXZlZC9TdWJzdGl0dXRpb25UZXh0UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi0vKgotICogQ29waWVkIGZyb20gb3JnLmVjbGlwc2UuamR0LmludGVybmFsLnVpLnRleHQuU3Vic3RpdHV0aW9uVGV4dFJlYWRlci4KLSAqIE1vZGlmaWNhdGlvbnMgd2VyZSBtYWRlIHRvIHJlYWQoKSB0byBhbGxvdyB3aGl0ZXNwYWNlcyBhbmQgZml4ZWQgc3RhdGVtZW50Ci0gKiB1bm5lY2Vzc2FyaWx5IG5lc3RlZCB3aXRoaW4gZWxzZSBjbGF1c2Ugd2FybmluZyBpbiBuZXh0Q2hhcigpCi0gKi8KLS8qKgotICogUmVhZHMgdGhlIHRleHQgY29udGVudHMgZnJvbSBhIHJlYWRlciBhbmQgY29tcHV0ZXMgZm9yIGVhY2ggY2hhcmFjdGVyIGEKLSAqIHBvdGVudGlhbCBzdWJzdGl0dXRpb24uIFRoZSBzdWJzdGl0dXRpb24gbWF5IGVhdCBtb3JlIGNoYXJhY3RlcnMgdGhhbiBvbmx5Ci0gKiB0aGUgb25lIHBhc3NlZCBpbnRvIHRoZSBjb21wdXRhdGlvbiByb3V0aW5lLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3Vic3RpdHV0aW9uVGV4dFJlYWRlciBleHRlbmRzIFNpbmdsZUNoYXJSZWFkZXIgewotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9ERUxJTSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiLCAiXG4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQlwcml2YXRlIFJlYWRlciBmUmVhZGVyOwotCXByb3RlY3RlZCBib29sZWFuIGZXYXNXaGl0ZVNwYWNlOwotCXByaXZhdGUgaW50IGZDaGFyQWZ0ZXJXaGl0ZVNwYWNlOwotCi0JLyoqCi0JICogVGVsbHMgd2hldGhlciB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIGFyZSBza2lwcGVkLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBmU2tpcFdoaXRlU3BhY2UgPSB0cnVlOwotCi0JcHJpdmF0ZSBib29sZWFuIGZSZWFkRnJvbUJ1ZmZlcjsKLQlwcml2YXRlIFN0cmluZ0J1ZmZlciBmQnVmZmVyOwotCXByaXZhdGUgaW50IGZJbmRleDsKLQotCi0JcHJvdGVjdGVkIFN1YnN0aXR1dGlvblRleHRSZWFkZXIoUmVhZGVyIHJlYWRlcikgewotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlmQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmSW5kZXggPSAwOwotCQlmUmVhZEZyb21CdWZmZXIgPSBmYWxzZTsKLQkJZkNoYXJBZnRlcldoaXRlU3BhY2UgPSAtMTsKLQkJZldhc1doaXRlU3BhY2UgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0byBjb21wdXRlIHRoZSBzdWJzdGl0dXRpb24gZm9yIHRoZSBnaXZlbiBjaGFyYWN0ZXIgYW5kIGlmCi0JICogbmVjZXNzYXJ5IHN1YnNlcXVlbnQgY2hhcmFjdGVycy4gVXNlIDxjb2RlPm5leHRDaGFyPC9jb2RlPiB0byByZWFkCi0JICogc3Vic2VxdWVudCBjaGFyYWN0ZXJzLgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgY29tcHV0ZVN1YnN0aXR1dGlvbihpbnQgYykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50ZXJuYWwgcmVhZGVyLgotCSAqLwotCXByb3RlY3RlZCBSZWFkZXIgZ2V0UmVhZGVyKCkgewotCQlyZXR1cm4gZlJlYWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3Rlci4KLQkgKi8KLQlwcm90ZWN0ZWQgaW50IG5leHRDaGFyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJZlJlYWRGcm9tQnVmZmVyID0gKGZCdWZmZXIubGVuZ3RoKCkgPiAwKTsKLQkJaWYgKGZSZWFkRnJvbUJ1ZmZlcikgewotCQkJY2hhciBjaCA9IGZCdWZmZXIuY2hhckF0KGZJbmRleCsrKTsKLQkJCWlmIChmSW5kZXggPj0gZkJ1ZmZlci5sZW5ndGgoKSkgewotCQkJCWZCdWZmZXIuc2V0TGVuZ3RoKDApOwotCQkJCWZJbmRleCA9IDA7Ci0JCQl9Ci0JCQlyZXR1cm4gY2g7Ci0JCX0KLQkJaW50IGNoID0gZkNoYXJBZnRlcldoaXRlU3BhY2U7Ci0JCWlmIChjaCA9PSAtMSkgewotCQkJY2ggPSBmUmVhZGVyLnJlYWQoKTsKLQkJfQotCQlpZiAoZlNraXBXaGl0ZVNwYWNlICYmIENoYXJhY3Rlci5pc1doaXRlc3BhY2UoKGNoYXIpIGNoKSkgewotCQkJZG8gewotCQkJCWNoID0gZlJlYWRlci5yZWFkKCk7Ci0JCQl9IHdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKChjaGFyKSBjaCkpOwotCQkJaWYgKGNoICE9IC0xKSB7Ci0JCQkJZkNoYXJBZnRlcldoaXRlU3BhY2UgPSBjaDsKLQkJCQlyZXR1cm4gJyAnOwotCQkJfQotCQl9IGVsc2UgewotCQkJZkNoYXJBZnRlcldoaXRlU3BhY2UgPSAtMTsKLQkJfQotCQlyZXR1cm4gY2g7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBSZWFkZXIjcmVhZCgpCi0JICovCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGM7Ci0JCWRvIHsKLQotCQkJYyA9IG5leHRDaGFyKCk7Ci0JCQl3aGlsZSAoIWZSZWFkRnJvbUJ1ZmZlcikgewotCQkJCVN0cmluZyBzID0gY29tcHV0ZVN1YnN0aXR1dGlvbihjKTsKLQkJCQlpZiAocyA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQlpZiAocy5sZW5ndGgoKSA+IDApCi0JCQkJCWZCdWZmZXIuaW5zZXJ0KDAsIHMpOwotCQkJCWMgPSBuZXh0Q2hhcigpOwotCQkJfQotCi0JCX0gd2hpbGUgKGZTa2lwV2hpdGVTcGFjZSAmJiBmV2FzV2hpdGVTcGFjZSAmJiAoKGMgPT0gJyAnKSAmJiAhZlJlYWRGcm9tQnVmZmVyKSk7Ci0JCS8qCi0JCSAqIFNTRTogRm9yIGFib3ZlIGFuZCBiZWxvdyBjaGVjaywgaWYgd2hpdGVzcGFjZSBpcyByZWFkIGZyb20gYnVmZmVyLAotCQkgKiBkbyBub3Qgc2tpcAotCQkgKi8KLQkJZldhc1doaXRlU3BhY2UgPSAoKGMgPT0gJyAnICYmICFmUmVhZEZyb21CdWZmZXIpIHx8IGMgPT0gJ1xyJyB8fCBjID09ICdcbicpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZWFkeSgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcmVhZHkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZlJlYWRlci5yZWFkeSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgUmVhZGVyI2Nsb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZSZWFkZXIuY2xvc2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIFJlYWRlciNyZXNldCgpCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmUmVhZGVyLnJlc2V0KCk7Ci0JCWZXYXNXaGl0ZVNwYWNlID0gdHJ1ZTsKLQkJZkNoYXJBZnRlcldoaXRlU3BhY2UgPSAtMTsKLQkJZkJ1ZmZlci5zZXRMZW5ndGgoMCk7Ci0JCWZJbmRleCA9IDA7Ci0JfQotCi0JcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0U2tpcFdoaXRlc3BhY2UoYm9vbGVhbiBzdGF0ZSkgewotCQlmU2tpcFdoaXRlU3BhY2UgPSBzdGF0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1NraXBwaW5nV2hpdGVzcGFjZSgpIHsKLQkJcmV0dXJuIGZTa2lwV2hpdGVTcGFjZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdC91dGlsL1NoYXJlZEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdC91dGlsL1NoYXJlZEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTE1ODMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXQvdXRpbC9TaGFyZWRFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXQudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBTaGFyZWRFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfQ09MTEFQU0VBTEwgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RMQ0xfQ09MTEFQU0VBTEw7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfREVMRVRFID0gRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19ETENMX0RFTEVURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9TWU5DRUQgPSBFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RMQ0xfU1lOQ0VEOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX0NPTExBUFNFQUxMID0gRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FTENMX0NPTExBUFNFQUxMOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX0RFTEVURSA9IEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRUxDTF9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfU1lOQ0VEID0gRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FTENMX1NZTkNFRDsKLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgc3BlY2lmaWVkIGltYWdlIGZyb20gdGhlIHNvdXJjZSBlZGl0b3IgcGx1Z2luJ3MgaW1hZ2UKLQkgKiByZWdpc3RyeS4gTm90ZTogVGhlIHJldHVybmVkIDxjb2RlPkltYWdlPC9jb2RlPiBpcyBtYW5hZ2VkIGJ5IHRoZQotCSAqIHdvcmtiZW5jaDsgY2xpZW50cyBtdXN0IDxiPm5vdCA8L2I+IGRpc3Bvc2Ugb2YgdGhlIHJldHVybmVkIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBzeW1ib2xpY05hbWUKLQkgKiAgICAgICAgICAgIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBpbWFnZTsgdGhlcmUgYXJlIGNvbnN0YW50cyBkZWNsYXJlZAotCSAqICAgICAgICAgICAgaW4gdGhpcyBjbGFzcyBmb3IgYnVpbGQtaW4gaW1hZ2VzIHRoYXQgY29tZSB3aXRoIHRoZSBzb3VyY2UKLQkgKiAgICAgICAgICAgIGVkaXRvcgotCSAqIEByZXR1cm4gdGhlIGltYWdlLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlIGdldEltYWdlKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2Uoc3ltYm9saWNOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgZm9yIHNwZWNpZmllZCBpbWFnZSBmcm9tIHRoZSBzb3VyY2UKLQkgKiBlZGl0b3IgcGx1Z2luJ3MgaW1hZ2UgcmVnaXN0cnkuIFVubGlrZSA8Y29kZT5JbWFnZTwvY29kZT5zLCBpbWFnZQotCSAqIGRlc2NyaXB0b3JzIHRoZW1zZWx2ZXMgZG8gbm90IG5lZWQgdG8gYmUgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIHN5bWJvbGljTmFtZQotCSAqICAgICAgICAgICAgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGltYWdlOyB0aGVyZSBhcmUgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogICAgICAgICAgICBpbiB0aGlzIGludGVyZmFjZSBmb3IgYnVpbGQtaW4gaW1hZ2VzIHRoYXQgY29tZSB3aXRoIHRoZQotCSAqICAgICAgICAgICAgc291cmNlIGVkaXRvcgotCSAqIEByZXR1cm4gdGhlIGltYWdlIGRlc2NyaXB0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgc3ltYm9saWNOYW1lKSB7Ci0JCXJldHVybiBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihzeW1ib2xpY05hbWUpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yTW9kZWxVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvck1vZGVsVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGRjYTY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yTW9kZWxVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlNhZmVSdW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5TYWZlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuQXNzZXJ0OwotCi0KLS8qKgotICogSU5URVJOQUwgVVNBR0UgT05MWQotICogCi0gKiBAYXV0aG9yIG5zZAotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yTW9kZWxVdGlsIHsKLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBhZGRGYWN0b3JpZXNUbyhmaW5hbCBJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpZiAoc3RydWN0dXJlZE1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCQotCQlBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGFkYXB0ZXJSZWdpc3RyeSA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCk7Ci0JCVN0cmluZyBjb250ZW50VHlwZUlkID0gc3RydWN0dXJlZE1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpOwotCi0JCUl0ZXJhdG9yIGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzID0gbnVsbDsKLQkJaWYgKGFkYXB0ZXJSZWdpc3RyeSBpbnN0YW5jZW9mIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24pIHsKLQkJCWFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzID0gKChBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5RXh0ZW5zaW9uKSBhZGFwdGVyUmVnaXN0cnkpLmdldEFkYXB0ZXJGYWN0b3JpZXMoY29udGVudFR5cGVJZCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlhZGFwdGVyRmFjdG9yeVByb3ZpZGVycyA9IGFkYXB0ZXJSZWdpc3RyeS5nZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci0JCX0KLQotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgU1NFVUlNZXNzYWdlcy5FZGl0b3JNb2RlbFV0aWxfMCk7IC8vJE5PTi1OTFMtMSQKLQkJLy8gQWRkIGFsbCB0aG9zZSBhcHByb3ByaWF0ZSBmb3IgdGhpcyBwYXJ0aWN1bGFyIHR5cGUgb2YgY29udGVudAotCQl3aGlsZSAoYWRhcHRlckZhY3RvcnlQcm92aWRlcnMuaGFzTmV4dCgpKSB7Ci0JCQl0cnkgewotCQkJCWZpbmFsIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgcHJvdmlkZXIgPSAoQWRhcHRlckZhY3RvcnlQcm92aWRlcikgYWRhcHRlckZhY3RvcnlQcm92aWRlcnMubmV4dCgpOwotCQkJCS8qCi0JCQkJICogQ29udGVudFR5cGUgbWlnaHQgaGF2ZSBhbHJlYWR5IGJlZW4gY2hlY2tlZCBhYm92ZSwgdGhpcwotCQkJCSAqIGNoZWNrIGlzIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRhYmlsaXR5IGZvciB0aG9zZSB0aGF0Ci0JCQkJICogZG9uJ3Qgc3BlY2lmeSBhIGNvbnRlbnQgdHlwZQotCQkJCSAqLwotCQkJCWlmIChwcm92aWRlci5pc0ZvcihzdHJ1Y3R1cmVkTW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCkpKSB7Ci0JCQkJCVNhZmVSdW5uZXIucnVuKG5ldyBTYWZlUnVubmFibGUoU1NFVUlNZXNzYWdlcy5FZGl0b3JNb2RlbFV0aWxfMSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQkJCQkJcHJvdmlkZXIuYWRkQWRhcHRlckZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJCQkJCQkJfQotCQkJCQkJCQl9KTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0VkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ODYzM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBpbWFnZXMgcHJvdmlkZWQgYnkgdGhpcyBwbHVnLWluLgotICogCi0gKiBOT1RFOiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuIEZvciBpbWFnZXMgdXNlZCBleHRlcm5hbGx5LCBwbGVhc2UgdXNlIHRoZQotICogU2hhcmVkKioqSW1hZ2VIZWxwZXIgY2xhc3MgaW5zdGVhZC4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgewotCXByaXZhdGUgc3RhdGljIEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEdldHMgdGhlIGluc3RhbmNlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIEVkaXRvclBsdWdpbkltYWdlSGVscGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKQotCQkJaW5zdGFuY2UgPSBuZXcgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIoKTsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8vCSBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIFBMVUdJTklEID0gU1NFVUlQbHVnaW4uSUQ7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGZyb20gdGhlIGdpdmVuIHJlc291cmNlIGFuZCBhZGRzIHRoZSBpbWFnZSB0byB0aGUKLQkgKiBpbWFnZSByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiBAcmV0dXJuIEltYWdlCi0JICovCi0JcHJpdmF0ZSBJbWFnZSBjcmVhdGVJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBnZXRJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0KLQkJaWYgKGRlc2MgIT0gbnVsbCkgewotCQkJaW1hZ2UgPSBkZXNjLmNyZWF0ZUltYWdlKCk7Ci0JCQkvLyBkb250IGFkZCB0aGUgbWlzc2luZyBpbWFnZSBkZXNjcmlwdG9yIGltYWdlIHRvIHRoZSBpbWFnZQotCQkJLy8gcmVnaXN0cnkKLQkJCWlmICghZGVzYy5lcXVhbHMoSW1hZ2VEZXNjcmlwdG9yLmdldE1pc3NpbmdJbWFnZURlc2NyaXB0b3IoKSkpCi0JCQkJZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGltYWdlIGRlc2NyaXB0b3IgZnJvbSB0aGUgZ2l2ZW4gaW1hZ2VGaWxlUGF0aCBhbmQgYWRkcyB0aGUKLQkgKiBpbWFnZSBkZXNjcmlwdG9yIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiBhbiBpbWFnZQotCSAqIGRlc2NyaXB0b3IgY291bGQgbm90IGJlIGNyZWF0ZWQsIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yCi0JICogaXMgcmV0dXJuZWQgYnV0IG5vdCBhZGRlZCB0byB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeS4KLQkgKiAKLQkgKiBAcGFyYW0gaW1hZ2VGaWxlUGF0aAotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIGltYWdlIGRlc2NyaXB0b3IgZm9yIGltYWdlRmlsZVBhdGggb3IgZGVmYXVsdAotCSAqICAgICAgICAgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kCi0JICovCi0JcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZUZpbGVQYXRoKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBBYnN0cmFjdFVJUGx1Z2luLmltYWdlRGVzY3JpcHRvckZyb21QbHVnaW4oUExVR0lOSUQsIGltYWdlRmlsZVBhdGgpOwotCQlpZiAoaW1hZ2VEZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCWdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkucHV0KGltYWdlRmlsZVBhdGgsIGltYWdlRGVzY3JpcHRvcik7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotCQl9Ci0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZSByZWdpc3RyeS4KLQkgKiBJZiB0aGUgaW1hZ2UgY2Fubm90IGJlIHJldHJpZXZlZCwgYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBhdAotCSAqIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2Ugb3IgbnVsbCBpZiBvbmUgY291bGQKLQkgKiAgICAgICAgIG5vdCBiZSBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2UgaW1hZ2UgPSBnZXRJbWFnZVJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCS8vIGNyZWF0ZSBhbiBpbWFnZQotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UKLQkgKiBkZXNjcmlwdG9yIHJlZ2lzdHJ5LiBJZiB0aGUgaW1hZ2UgZGVzY3JpcHRvciBjYW5ub3QgYmUgcmV0cmlldmVkLAotCSAqIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhdCB0aGUgbG9jYXRpb24gc3BlY2lmaWVkCi0JICogaW4gcmVzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIHJlc291cmNlCi0JICogICAgICAgICAgICB0aGUgaW1hZ2UgZGVzY3JpcHRvciB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2VEZXNjcmlwdG9yIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jYXRlZCB3aXRoIHJlc291cmNlIG9yCi0JICogICAgICAgICB0aGUgZGVmYXVsdCAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiBvbmUgY291bGQgbm90IGJlCi0JICogICAgICAgICBmb3VuZAotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gbnVsbDsKLQkJT2JqZWN0IG8gPSBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCS8vY3JlYXRlIGEgZGVzY3JpcHRvcgotCQkJaW1hZ2VEZXNjcmlwdG9yID0gY3JlYXRlSW1hZ2VEZXNjcmlwdG9yKHJlc291cmNlKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IChJbWFnZURlc2NyaXB0b3IpIG87Ci0JCX0KLQkJcmV0dXJuIGltYWdlRGVzY3JpcHRvcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEhhc2hNYXAgLSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSGFzaE1hcCBnZXRJbWFnZURlc2NyaXB0b3JSZWdpc3RyeSgpIHsKLQkJaWYgKGZJbWFnZURlc2NSZWdpc3RyeSA9PSBudWxsKQotCQkJZkltYWdlRGVzY1JlZ2lzdHJ5ID0gbmV3IEhhc2hNYXAoKTsKLQkJcmV0dXJuIGZJbWFnZURlc2NSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBJbWFnZVJlZ2lzdHJ5IC0gaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBJbWFnZVJlZ2lzdHJ5IGdldEltYWdlUmVnaXN0cnkoKSB7Ci0JCXJldHVybiBKRmFjZVJlc291cmNlcy5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvRWRpdG9yUGx1Z2luSW1hZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiMzg4NDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9FZGl0b3JQbHVnaW5JbWFnZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLS8qKgotICogQnVuZGxlIG9mIG1vc3QgaW1hZ2VzIHVzZWQgYnkgdGhlIFNvdXJjZSBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIEVkaXRvclBsdWdpbkltYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfQ1RPT0wxNl9TUEVMTENIRUNLID0gImljb25zL2Z1bGwvY3Rvb2wxNi9zcGVsbGNoZWNrLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRExDTF9DT0xMQVBTRUFMTCA9ICJpY29ucy9mdWxsL2RsY2wxNi9jb2xsYXBzZWFsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfREVMRVRFID0gImljb25zL2Z1bGwvZGxjbDE2L2RlbGV0ZS5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RMQ0xfU1lOQ0VEID0gImljb25zL2Z1bGwvZGxjbDE2L3N5bmNlZC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MMTZfU1BFTExDSEVDSyA9ICJpY29ucy9mdWxsL2R0b29sMTYvc3BlbGxjaGVjay5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VMQ0xfQ09MTEFQU0VBTEwgPSAiaWNvbnMvZnVsbC9lbGNsMTYvY29sbGFwc2VhbGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX0RFTEVURSA9ICJpY29ucy9mdWxsL2VsY2wxNi9kZWxldGUuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FTENMX1NZTkNFRCA9ICJpY29ucy9mdWxsL2VsY2wxNi9zeW5jZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTDE2X1NQRUxMQ0hFQ0sgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L3NwZWxsY2hlY2suZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfT0NDX01BVENIID0gImljb25zL2Z1bGwvb2JqMTYvb2NjX21hdGNoLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUFJFRkVSRU5DRVMgPSAiaWNvbnMvZnVsbC9vYmoxNi9wcmVmZXJlbmNlcy5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QUk9QX1BTID0gImljb25zL2Z1bGwvb2JqMTYvcHJvcF9wcy5naWYiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdhMmRiZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIFNvdXJjZSBFZGl0b3IuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkLgotICogPC9wPgotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0KLQkvLyBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFNTRVVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0JLy8gQWJzdHJhY3QgU291cmNlIEVkaXRvciBDb250ZXh0IE1lbnUKLQkvLyBDb250ZW50IEFzc2lzdAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRNTlVfQ09OVEVOVEFTU0lTVF9IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEwMTAiOyAvLyROT04tTkxTLTEkCi0JLy8gRm9ybWF0IERvY3VtZW50Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVE1OVV9GT1JNQVRfRE9DX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxtMTAzMCI7IC8vJE5PTi1OTFMtMSQKLQkvLyBGb3JtYXQgQWN0aXZlIEVsZW1lbnRzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVE1OVV9GT1JNQVRfRUxFTUVOVFNfSEVMUElEID0gUFJFRklYICsgInhtbG0xMDQwIjsgLy8kTk9OLU5MUy0xJAotCS8vIENsZWFudXAgRG9jdW1lbnQKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UTU5VX0NMRUFOVVBfRE9DX0hFTFBJRCA9IFBSRUZJWCArCi0JLy8gInhtbG0xMDUwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gUHJvcGVydGllcwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRNTlVfUFJPUEVSVElFU19IRUxQSUQgPSBQUkVGSVggKyAieG1sbTEwNzAiOyAvLyROT04tTkxTLTEkCi0KLQkvLyBTdHJ1Y3R1cmVkIFRleHQgRWRpdG9yIFByZWZlcmVuY2UgUGFnZQotCS8vIEFwcGVhcmFuY2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGU1RFX0FQUEVBUkFOQ0VfSEVMUElEID0gUFJFRklYICsgInN0ZWQwMDAxIjsgLy8kTk9OLU5MUy0xJAotCS8vIEhvdmVycwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZTVEVfSE9WRVJTX0hFTFBJRCA9IFBSRUZJWCArICJzdGVkMDAwMyI7IC8vJE5PTi1OTFMtMSQKLQotLy8JLy8gUmVhZC1Pbmx5IFRleHQgU3R5bGUKLS8vCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZXRUJYX1JFQURPTkxZX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAwMSI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFdlYiBhbmQgWE1MIFByZWZlcmVuY2UgUGFnZQotCS8vIFRhc2sgVGFncwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZXRUJYX1RBU0tUQUdTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDAwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFNvdXJjZSBFZGl0b3IgVmlldwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9TT1VSQ0VfVklFV19IRUxQSUQgPSBQUkVGSVggKyAieG1sbTIwMDAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZWRpdG9yL1N0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmZmYmNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9lZGl0b3IvU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uNDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLQotCi0vKioKLSAqIEBhdXRob3Igbml0aW4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRQcm92aWRlciwgSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24sIElEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uNCB7Ci0JcHJpdmF0ZSBzdGF0aWMgU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlciBfaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cnVjdHVyZWRNb2RlbERvY3VtZW50UHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JewotCQlfaW5zdGFuY2UgPSBuZXcgU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlcigpOwotCX0KLQotCXByaXZhdGUgU3RydWN0dXJlZE1vZGVsRG9jdW1lbnRQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjYWJvdXRUb0NoYW5nZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9DaGFuZ2UoT2JqZWN0IGVsZW1lbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjYWRkRWxlbWVudFN0YXRlTGlzdGVuZXIob3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRWxlbWVudFN0YXRlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkRWxlbWVudFN0YXRlTGlzdGVuZXIoSUVsZW1lbnRTdGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2NhblNhdmVEb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblNhdmVEb2N1bWVudChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gKChJU3RydWN0dXJlZE1vZGVsKSBlbGVtZW50KS5pc0RpcnR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2NoYW5nZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGFuZ2VkKE9iamVjdCBlbGVtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2Nvbm5lY3QoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBjb25uZWN0KE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2Rpc2Nvbm5lY3QoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNjb25uZWN0KE9iamVjdCBlbGVtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyI2dldEFubm90YXRpb25Nb2RlbChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjZ2V0RG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkTW9kZWwpIGVsZW1lbnQpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNnZXRNb2RpZmljYXRpb25TdGFtcChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBsb25nIGdldE1vZGlmaWNhdGlvblN0YW1wKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkTW9kZWwpIGVsZW1lbnQpLmdldFN5bmNocm9uaXphdGlvblN0YW1wKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI2dldFN0YXR1cyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIGdldFN0YXR1cyhPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjZ2V0U3luY2hyb25pemF0aW9uU3RhbXAoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgbG9uZyBnZXRTeW5jaHJvbml6YXRpb25TdGFtcChPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjaXNEZWxldGVkKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jaXNNb2RpZmlhYmxlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNNb2RpZmlhYmxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiNpc1JlYWRPbmx5KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNSZWFkT25seShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklEb2N1bWVudFByb3ZpZGVyRXh0ZW5zaW9uI2lzU3RhdGVWYWxpZGF0ZWQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1N0YXRlVmFsaWRhdGVkKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjbXVzdFNhdmVEb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIG11c3RTYXZlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuICgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuaXNEaXJ0eSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlciNyZW1vdmVFbGVtZW50U3RhdGVMaXN0ZW5lcihvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklFbGVtZW50U3RhdGVMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbGVtZW50U3RhdGVMaXN0ZW5lcihJRWxlbWVudFN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjcmVzZXREb2N1bWVudChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0RG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXIjc2F2ZURvY3VtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2F2ZURvY3VtZW50KElQcm9ncmVzc01vbml0b3IgbW9uaXRvciwgT2JqZWN0IGVsZW1lbnQsIElEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBvdmVyd3JpdGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCSgoSVN0cnVjdHVyZWRNb2RlbCkgZWxlbWVudCkuc2F2ZSgpOwotCQl9Ci0JCWNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiNzZXRDYW5TYXZlRG9jdW1lbnQoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDYW5TYXZlRG9jdW1lbnQoT2JqZWN0IGVsZW1lbnQpIHsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSURvY3VtZW50UHJvdmlkZXJFeHRlbnNpb24jc3luY2hyb25pemUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzeW5jaHJvbml6ZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiN1cGRhdGVTdGF0ZUNhY2hlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlU3RhdGVDYWNoZShPYmplY3QgZWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlckV4dGVuc2lvbiN2YWxpZGF0ZVN0YXRlKGphdmEubGFuZy5PYmplY3QsCi0JICogICAgICBqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbGlkYXRlU3RhdGUoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBjb21wdXRhdGlvbkNvbnRleHQpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRUeXBlIGdldENvbnRlbnRUeXBlKE9iamVjdCBlbGVtZW50KSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZSgoKElTdHJ1Y3R1cmVkTW9kZWwpIGVsZW1lbnQpLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0FjdGlvbkRlc2NyaXB0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vQWN0aW9uRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjYxNWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vQWN0aW9uRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklBY3Rpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotCi0vKioKLSAqIFdoZW4gJ2FjdGlvbicgdGFnIGlzIGZvdW5kIGluIHRoZSByZWdpc3RyeSwgYW4gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMKLSAqIGNyZWF0ZWQuIEl0IGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiBvYmplY3QgYW5kIGNhcHR1cmVzIGluZm9ybWF0aW9uCi0gKiB0aGF0IGlzIGxhdGVyIHVzZWQgdG8gYWRkIHRoaXMgYWN0aW9uIG9iamVjdCBpbnRvIG1lbnUvdG9vbCBiYXIuIFRoaXMgY2xhc3MKLSAqIGlzIHJldXNlZCBmb3IgZ2xvYmFsICh3b3JrYmVuY2gpIG1lbnUvdG9vbCBiYXIsIHBvcHVwIG1lbnUgYWN0aW9ucywgYXMgd2VsbAotICogYXMgdmlldydzIHB1bGxkb3duIGFuZCBsb2NhbCB0b29sIGJhci4KLSAqLwotcHVibGljIGNsYXNzIEFjdGlvbkRlc2NyaXB0b3IgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9BQ0NFTEVSQVRPUiA9ICJhY2NlbGVyYXRvciI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0RFRklOSVRJT05fSUQgPSAiZGVmaW5pdGlvbklkIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9ERVNDUklQVElPTiA9ICJkZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRElTQUJMRURJQ09OID0gImRpc2FibGVkSWNvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfSEVMUF9DT05URVhUX0lEID0gImhlbHBDb250ZXh0SWQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0hPVkVSSUNPTiA9ICJob3Zlckljb24iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lDT04gPSAiaWNvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfTEFCRUwgPSAibGFiZWwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX01FTlVCQVJfUEFUSCA9ICJtZW51YmFyUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfUE9QVVBNRU5VX1BBVEggPSAicG9wdXBtZW51UGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU1RBVEUgPSAic3RhdGUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1RPT0xCQVJfUEFUSCA9ICJ0b29sYmFyUGF0aCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVE9PTFRJUCA9ICJ0b29sdGlwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWcgZWxlbWVudCBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGNsYXNzQXR0cmlidXRlCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGNhcnJ5aW5nIHRoZSBjbGFzcwotCSAqIEByZXR1cm5zIHRoZSBleHRlbnNpb24gb2JqZWN0IGlmIHN1Y2Nlc3NmdWwuIElmIGFuIGVycm9yIG9jY3VycyB3aGVuCi0JICogICAgICAgICAgY3JlYXRlaW5nIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLCB0aGUgZXhjZXB0aW9uIGlzIGxvZ2dlZCwgYW5kCi0JICogICAgICAgICAgbnVsbCByZXR1cm5lZC4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgewotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQkvLyBJZiBwbHVnaW4gaGFzIGJlZW4gbG9hZGVkIGNyZWF0ZSBleHRlbnNpb24uCi0JCS8vIE90aGVyd2lzZSwgc2hvdyBidXN5IGN1cnNvciB0aGVuIGNyZWF0ZSBleHRlbnNpb24uCi0JCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRSkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHRbMF0gPSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhc3NBdHRyaWJ1dGUpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCBhbmQgbG9nIEFOWSBleGNlcHRpb24gZnJvbSBleHRlbnNpb24gcG9pbnQKLQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0WzBdID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludAotCQkJCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdFswXTsKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oZmluYWwgT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGlkOwotCi0JcHJpdmF0ZSBBY3Rpb25Db250cmlidXRpb25JdGVtIGl0ZW07Ci0JcHJpdmF0ZSBTdHJpbmcgbWVudUdyb3VwOwotCXByaXZhdGUgU3RyaW5nIG1lbnVQYXRoOwotCXByaXZhdGUgU3RyaW5nIHBvcHVwbWVudUdyb3VwOwotCXByaXZhdGUgU3RyaW5nIHBvcHVwbWVudVBhdGg7Ci0JcHJpdmF0ZSBTdHJpbmcgdG9vbGJhckdyb3VwOwotCXByaXZhdGUgU3RyaW5nIHRvb2xiYXJQYXRoOwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBkZXNjcmlwdG9yIHdpdGggdGhlIHRhcmdldFR5cGUKLQkgKi8KLQlwdWJsaWMgQWN0aW9uRGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgYWN0aW9uRWxlbWVudCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCi0JCS8vIENhbGN1bGF0ZSBtZW51IGFuZCB0b29sYmFyIHBhdGhzLgotCQlTdHJpbmcgbXBhdGggPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTUVOVUJBUl9QQVRIKTsKLQkJU3RyaW5nIG1ncm91cCA9IG51bGw7Ci0JCWlmIChtcGF0aCAhPSBudWxsKSB7Ci0JCQlpbnQgbG9jID0gbXBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChsb2MgIT0gLTEpIHsKLQkJCQltZ3JvdXAgPSBtcGF0aC5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCQkJbXBhdGggPSBtcGF0aC5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbWdyb3VwID0gbXBhdGg7Ci0JCQkJbXBhdGggPSBudWxsOwotCQkJfQotCQl9Ci0JCW1lbnVQYXRoID0gbXBhdGg7Ci0JCW1lbnVHcm91cCA9IG1ncm91cDsKLQotCQlTdHJpbmcgcHBhdGggPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUE9QVVBNRU5VX1BBVEgpOwotCQlTdHJpbmcgcGdyb3VwID0gbnVsbDsKLQkJaWYgKHBwYXRoICE9IG51bGwpIHsKLQkJCWludCBsb2MgPSBwcGF0aC5sYXN0SW5kZXhPZignLycpOwotCQkJaWYgKGxvYyAhPSAtMSkgewotCQkJCXBncm91cCA9IHBwYXRoLnN1YnN0cmluZyhsb2MgKyAxKTsKLQkJCQlwcGF0aCA9IHBwYXRoLnN1YnN0cmluZygwLCBsb2MpOwotCQkJfSBlbHNlIHsKLQkJCQlwZ3JvdXAgPSBwcGF0aDsKLQkJCQlwcGF0aCA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcG9wdXBtZW51UGF0aCA9IHBwYXRoOwotCQlwb3B1cG1lbnVHcm91cCA9IHBncm91cDsKLQotCQlTdHJpbmcgdHBhdGggPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfVE9PTEJBUl9QQVRIKTsKLQkJU3RyaW5nIHRncm91cCA9IG51bGw7Ci0JCWlmICh0cGF0aCAhPSBudWxsKSB7Ci0JCQlpbnQgbG9jID0gdHBhdGgubGFzdEluZGV4T2YoJy8nKTsKLQkJCWlmIChsb2MgIT0gLTEpIHsKLQkJCQl0Z3JvdXAgPSB0cGF0aC5zdWJzdHJpbmcobG9jICsgMSk7Ci0JCQkJdHBhdGggPSB0cGF0aC5zdWJzdHJpbmcoMCwgbG9jKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdGdyb3VwID0gdHBhdGg7Ci0JCQkJdHBhdGggPSBudWxsOwotCQkJfQotCQl9Ci0JCXRvb2xiYXJQYXRoID0gdHBhdGg7Ci0JCXRvb2xiYXJHcm91cCA9IHRncm91cDsKLQotCQkvLyBDcmVhdGUgYWN0aW9uLgotCQlJQWN0aW9uIGFjdGlvbiA9IGNyZWF0ZUFjdGlvbihhY3Rpb25FbGVtZW50KTsKLQkJaWYgKGFjdGlvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBsYWJlbCA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MQUJFTCk7Ci0JCWlmIChsYWJlbCAhPSBudWxsKQotCQkJYWN0aW9uLnNldFRleHQobGFiZWwpOwotCi0JCWlkID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJaWYgKGlkID09IG51bGwpIHsKLQkJCWlkID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJfQotCQlpZiAoaWQgIT0gbnVsbCkKLQkJCWFjdGlvbi5zZXRJZChpZCk7Ci0KLQkJU3RyaW5nIGRlZklkID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFRklOSVRJT05fSUQpOwotCQlpZiAoZGVmSWQgIT0gbnVsbCAmJiBkZWZJZC5sZW5ndGgoKSAhPSAwKSB7Ci0JCQlhY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKGRlZklkKTsKLQkJfQotCi0JCVN0cmluZyB0b29sdGlwID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX1RPT0xUSVApOwotCQlpZiAodG9vbHRpcCAhPSBudWxsKQotCQkJYWN0aW9uLnNldFRvb2xUaXBUZXh0KHRvb2x0aXApOwotCi0JCVN0cmluZyBoZWxwQ29udGV4dElkID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0hFTFBfQ09OVEVYVF9JRCk7Ci0JCWlmIChoZWxwQ29udGV4dElkICE9IG51bGwpIHsKLQkJCVN0cmluZyBmdWxsSUQgPSBoZWxwQ29udGV4dElkOwotCQkJaWYgKGhlbHBDb250ZXh0SWQuaW5kZXhPZigiLiIpID09IC0xKSAvLyROT04tTkxTLTEkCi0JCQkJLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2UgYXV0byBxdWFsaWZ5IHRoZSBpZCBpZiBpdCBpcwotCQkJCS8vIG5vdCBxdWFsaWZpZWQpCi0JCQkJZnVsbElEID0gYWN0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSArICIuIiArIGhlbHBDb250ZXh0SWQ7IC8vJE5PTi1OTFMtMSQKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoYWN0aW9uLCBmdWxsSUQpOwotCQl9Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotCi0JCVN0cmluZyBzdGF0ZSA9IGFjdGlvbkVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TVEFURSk7Ci0JCWlmIChzdGF0ZSAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0Q2hlY2tlZChzdGF0ZS5lcXVhbHMoInRydWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCVN0cmluZyBpY29uID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lDT04pOwotCQlpZiAoaWNvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3JGcm9tRXh0ZW5zaW9uKGFjdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCksIGljb24pKTsKLQkJfQotCi0JCVN0cmluZyBob3Zlckljb24gPSBhY3Rpb25FbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSE9WRVJJQ09OKTsKLQkJaWYgKGhvdmVySWNvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0SG92ZXJJbWFnZURlc2NyaXB0b3IoSW1hZ2VVdGlsLmdldEltYWdlRGVzY3JpcHRvckZyb21FeHRlbnNpb24oYWN0aW9uRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKSwgaG92ZXJJY29uKSk7Ci0JCX0KLQotCQlTdHJpbmcgZGlzYWJsZWRJY29uID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0RJU0FCTEVESUNPTik7Ci0JCWlmIChkaXNhYmxlZEljb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3JGcm9tRXh0ZW5zaW9uKGFjdGlvbkVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCksIGRpc2FibGVkSWNvbikpOwotCQl9Ci0KLQkJU3RyaW5nIGFjY2VsZXJhdG9yID0gYWN0aW9uRWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0FDQ0VMRVJBVE9SKTsKLQkJaWYgKGFjY2VsZXJhdG9yICE9IG51bGwpCi0JCQlwcm9jZXNzQWNjZWxlcmF0b3IoYWN0aW9uLCBhY2NlbGVyYXRvcik7Ci0KLQkJaXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKGFjdGlvbik7Ci0JfQotCi0JLyoqCi0JICogUGFyc2VzIHRoZSBnaXZlbiBhY2NlbGVyYXRvciB0ZXh0LCBhbmQgY29udmVydHMgaXQgdG8gYW4gYWNjZWxlcmF0b3IKLQkgKiBrZXkgY29kZS4KLQkgKiAKLQkgKiBAcGFyYW0gYWNjZWxlcmF0b3JUZXh0Ci0JICogICAgICAgICAgICB0aGUgYWNjZWxlcmF0b3IgdGV4dAotCSAqIEByZXN1bHQgdGhlIFNXVCBrZXkgY29kZSwgb3IgMCBpZiB0aGVyZSBpcyBubyBhY2NlbGVyYXRvcgotCSAqLwotCXByaXZhdGUgaW50IGNvbnZlcnRBY2NlbGVyYXRvcihTdHJpbmcgYWNjZWxlcmF0b3JUZXh0KSB7Ci0JCWludCBhY2NlbGVyYXRvciA9IDA7Ci0JCVN0cmluZ1Rva2VuaXplciBzdG9rID0gbmV3IFN0cmluZ1Rva2VuaXplcihhY2NlbGVyYXRvclRleHQsICIrIik7IC8vJE5PTi1OTFMtMSQKLQotCQlpbnQga2V5Q29kZSA9IC0xOwotCi0JCWJvb2xlYW4gaGFzTW9yZVRva2VucyA9IHN0b2suaGFzTW9yZVRva2VucygpOwotCQl3aGlsZSAoaGFzTW9yZVRva2VucykgewotCQkJU3RyaW5nIHRva2VuID0gc3Rvay5uZXh0VG9rZW4oKTsKLQkJCWhhc01vcmVUb2tlbnMgPSBzdG9rLmhhc01vcmVUb2tlbnMoKTsKLQkJCS8vIEV2ZXJ5IHRva2VuIGV4Y2VwdCB0aGUgbGFzdCBtdXN0IGJlIG9uZSBvZiB0aGUgbW9kaWZpZXJzCi0JCQkvLyBDdHJsLCBTaGlmdCwgb3IgQWx0LgotCQkJaWYgKGhhc01vcmVUb2tlbnMpIHsKLQkJCQlpbnQgbW9kaWZpZXIgPSBBY3Rpb24uZmluZE1vZGlmaWVyKHRva2VuKTsKLQkJCQlpZiAobW9kaWZpZXIgIT0gMCkgewotCQkJCQlhY2NlbGVyYXRvciB8PSBtb2RpZmllcjsKLQkJCQl9IGVsc2UgeyAvL0xlYXZlIGlmIHRoZXJlIGFyZSBub25lCi0JCQkJCXJldHVybiAwOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJa2V5Q29kZSA9IEFjdGlvbi5maW5kS2V5Q29kZSh0b2tlbik7Ci0JCQl9Ci0JCX0KLQkJaWYgKGtleUNvZGUgIT0gLTEpIHsKLQkJCWFjY2VsZXJhdG9yIHw9IGtleUNvZGU7Ci0JCX0KLQkJcmV0dXJuIGFjY2VsZXJhdG9yOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgSUFjdGlvbiBjcmVhdGVBY3Rpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGFjdGlvbkVsZW1lbnQpIHsKLQkJT2JqZWN0IGFjdGlvbiA9IG5ldyBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nKGFjdGlvbkVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JCWlmIChhY3Rpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoYWN0aW9uIGluc3RhbmNlb2YgSUFjdGlvblZhbGlkYXRvcikgewotCQkJaWYgKCEoKElBY3Rpb25WYWxpZGF0b3IpIGFjdGlvbikuaXNWYWxpZEFjdGlvbigpKQotCQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAoYWN0aW9uIGluc3RhbmNlb2YgSUFjdGlvbiA/IChJQWN0aW9uKSBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Lm5ld0luc3RhbmNlKGFjdGlvbikgOiBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBhY3Rpb24gb2JqZWN0IGhlbGQgaW4gdGhpcyBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJQWN0aW9uIGdldEFjdGlvbigpIHsKLQkJcmV0dXJuIChpdGVtICE9IG51bGwgPyBpdGVtLmdldEFjdGlvbigpIDogbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgSUNvbnRyaWJ1dGlvbkl0ZW0gb2JqZWN0IGhlbGQgaW4gdGhpcyBkZXNjcmlwdG9yLgotCSAqLwotCXB1YmxpYyBJQ29udHJpYnV0aW9uSXRlbSBnZXRDb250cmlidXRpb25JdGVtKCkgewotCQlyZXR1cm4gaXRlbTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFjdGlvbidzIGlkIGFzIGRlZmluZWQgaW4gdGhlIHJlZ2lzdHJ5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG5hbWVkIHNsb3QgKGdyb3VwKSBpbiB0aGUgbWVudSB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUKLQkgKiBhZGRlZC4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE1lbnVHcm91cCgpIHsKLQkJcmV0dXJuIG1lbnVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIG1lbnUgcGF0aCB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgYWRkZWQuIElmIG51bGwsIHRoZQotCSAqIGFjdGlvbiB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIHRoZSBtZW51LgotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRNZW51UGF0aCgpIHsKLQkJcmV0dXJuIG1lbnVQYXRoOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgbmFtZWQgc2xvdCAoZ3JvdXApIGluIHRoZSBwb3B1cCBtZW51IHdoZXJlIHRoaXMgYWN0aW9uIHNob3VsZAotCSAqIGJlIGFkZGVkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UG9wdXBNZW51R3JvdXAoKSB7Ci0JCXJldHVybiBwb3B1cG1lbnVHcm91cDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHBvcHVwIG1lbnUgcGF0aCB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgYWRkZWQuIElmIG51bGwsIHRoZQotCSAqIGFjdGlvbiB3aWxsIG5vdCBiZSBhZGRlZCBpbnRvIHRoZSBwb3B1cCBtZW51LgotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRQb3B1cE1lbnVQYXRoKCkgewotCQlyZXR1cm4gcG9wdXBtZW51UGF0aDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBuYW1lZCBzbG90IChncm91cCkgaW4gdGhlIHRvb2wgYmFyIHdoZXJlIHRoaXMgYWN0aW9uIHNob3VsZAotCSAqIGJlIGFkZGVkLgotCSAqLwotCi0JcHVibGljIFN0cmluZyBnZXRUb29sYmFyR3JvdXAoKSB7Ci0JCXJldHVybiB0b29sYmFyR3JvdXA7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBwYXRoIGluIHRoZSB0b29sIGJhciB3aGVyZSB0aGlzIGFjdGlvbiBzaG91bGQgYmUgYWRkZWQuIElmCi0JICogbnVsbCwgYWN0aW9uIHdpbGwgbm90IGJlIGFkZGVkIHRvIHRoZSB0b29sIGJhci4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xiYXJQYXRoKCkgewotCQlyZXR1cm4gdG9vbGJhclBhdGg7Ci0JfQotCi0JLyoqCi0JICogUHJvY2VzcyB0aGUgYWNjZWxlcmF0b3IgZGVmaW5pdGlvbi4gSWYgaXQgaXMgYSBudW1iZXIgdGhlbiBwcm9jZXNzIHRoZQotCSAqIGNvZGUgZGlyZWN0bHkgLSBpZiBub3QgdGhlbiBwYXJzZSBpdCBhbmQgY3JlYXRlIHRoZSBjb2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NBY2NlbGVyYXRvcihJQWN0aW9uIGFjdGlvbiwgU3RyaW5nIGFjY2VsZXJhdG9yVGV4dCkgewotCi0JCWlmIChhY2NlbGVyYXRvclRleHQubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQkvL0lzIGl0IGEgbnVtZXJpYyBkZWZpbml0aW9uPwotCQlpZiAoQ2hhcmFjdGVyLmlzRGlnaXQoYWNjZWxlcmF0b3JUZXh0LmNoYXJBdCgwKSkpIHsKLQkJCXRyeSB7Ci0JCQkJYWN0aW9uLnNldEFjY2VsZXJhdG9yKEludGVnZXIudmFsdWVPZihhY2NlbGVyYXRvclRleHQpLmludFZhbHVlKCkpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSW52YWxpZCBhY2NlbGVyYXRvciBkZWNsYXJhdGlvbjogIiArIGlkKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9IGVsc2UKLQkJCWFjdGlvbi5zZXRBY2NlbGVyYXRvcihjb252ZXJ0QWNjZWxlcmF0b3IoYWNjZWxlcmF0b3JUZXh0KSk7Ci0JfQotCi0JLyoqCi0JICogRm9yIGRlYnVnZ2luZyBvbmx5LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiAiQWN0aW9uRGVzY3JpcHRvcigiICsgaWQgKyAiKSI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9CcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0JyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEzM2Y0ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0JyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuSUJyZWFrcG9pbnRQcm92aWRlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogUmVhZHMgYnJlYWtwb2ludCBleHRlbnNpb24gcmVnaXN0b3J5IGFuZCByZXR1cm5zIGJyZWFrcG9pbnQgcHJvdmlkZXIKLSAqIGluc3RhbmNlcwotICovCi1wdWJsaWMgY2xhc3MgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlciBleHRlbmRzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0JLy8gcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NPTlRFTlRfVFlQRVMgPSAiY29udGVudFR5cGVzIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfRVhURU5TSU9OUyA9ICJleHRlbnNpb25zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIgaW5zdGFuY2U7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMX0JSRUFLUE9JTlQgPSAiYnJlYWtwb2ludCI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQlJFQUtQT0lOVF9DT05UUklCVVRJT04gPSAiYnJlYWtwb2ludENvbnRyaWJ1dGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BST1ZJREVSID0gInByb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBDcmVhdGVzIGFuIGV4ZWN1dGFibGUgZXh0ZW5zaW9uLiBAcGFyYW0gZWxlbWVudCB0aGUgY29uZmlnIGVsZW1lbnQKLQkgKiBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlCi0JICogY2FycnlpbmcgdGhlIGNsYXNzIEByZXR1cm4gdGhlIGV4dGVuc2lvbiBvYmplY3QgQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0Jc3RhdGljIE9iamVjdCBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGZpbmFsIElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBmaW5hbCBTdHJpbmcgY2xhc3NBdHRyaWJ1dGUpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihjbGFzc0F0dHJpYnV0ZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb25maWcgZWxlbWVudCBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uCi0JICogQHBhcmFtIGNsYXNzQXR0cmlidXRlCi0JICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGNhcnJ5aW5nIHRoZSBjbGFzcwotCSAqIEByZXR1cm4gdGhlIGV4dGVuc2lvbiBvYmplY3QKLQkgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLQkgKi8KLQlwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgewotCQkvLyBJZiBwbHVnaW4gaGFzIGJlZW4gbG9hZGVkIGNyZWF0ZSBleHRlbnNpb24uCi0JCS8vIE90aGVyd2lzZSwgc2hvdyBidXN5IGN1cnNvciB0aGVuIGNyZWF0ZSBleHRlbnNpb24uCi0JCWZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRSkgewotCQkJdHJ5IHsKLQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsIGNsYXNzQXR0cmlidXRlKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JLyoqCi0JICogcmV0dXJucyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcgotCSAqIAotCSAqIEByZXR1cm4gQnJlYWtwb2ludFByb3ZpZGVyQnVpbGRlcgotCSAqLwotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIEJyZWFrcG9pbnRQcm92aWRlckJ1aWxkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChpbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlpbnN0YW5jZSA9IG5ldyBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcGFyYW0gZQotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihPYmplY3RbXSByZXN1bHQsIFRocm93YWJsZSBlKSB7Ci0JCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCXJlc3VsdFswXSA9IG51bGw7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYWNoZTsKLQlwcml2YXRlIE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRDb250cmlidXRpb25UYWc7Ci0KLQkvKgotCSAqIENvbnN0cnVjdG9yCi0JICovCi0JcHJpdmF0ZSBCcmVha3BvaW50UHJvdmlkZXJCdWlsZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qCi0JICogQ3JlYXRlcyBhIGJyZWFrcG9pbnQgcHJvdmlkZXIgb2JqZWN0IHRvIGdpdmVuIGVsZW1lbnQgQHBhcmFtIGVsZW1lbnQKLQkgKiBjb25maWd1cmF0aW9uIGVsZW1lbnQgb2JqZWN0IEByZXR1cm4gSUJyZWFrcG9pbnRQcm92aWRlcgotCSAqLwotCXByb3RlY3RlZCBJQnJlYWtwb2ludFByb3ZpZGVyIGNyZWF0ZUJyZWFrcG9pbnRQcm92aWRlcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlPYmplY3Qgb2JqID0gY3JlYXRlRXh0ZW5zaW9uKGVsZW1lbnQsIEFUVF9DTEFTUyk7Ci0JCWlmIChvYmogPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKG9iaiBpbnN0YW5jZW9mIElCcmVha3BvaW50UHJvdmlkZXIpID8gKElCcmVha3BvaW50UHJvdmlkZXIpIG9iaiA6IG51bGw7Ci0JfQotCi0JLyoKLQkgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGJyZWFrcG9pbnQgcHJvdmlkZXJzIG1hdGNoaW5nIHRoZSBnaXZlbiBrZXkgdG8gdGhlCi0JICogdmFsdWUgb2YgdGhlIElDb25maWd1cmF0aW9uRWxlbWVudCBhdHRyaWJ1dGUgImF0dHJOYW1lIiBAcmV0dXJuCi0JICogSUJyZWFrcG9pbnRQcm92aWRlcltdCi0JICovCi0JcHJvdGVjdGVkIElCcmVha3BvaW50UHJvdmlkZXJbXSBjcmVhdGVCcmVha3BvaW50UHJvdmlkZXJzKFN0cmluZyBhdHRyTmFtZSwgU3RyaW5nIGtleSkgewotCQlpZiAoY2FjaGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgSUJyZWFrcG9pbnRQcm92aWRlclswXTsKLQotCQlmaW5hbCBpbnQgbnVtID0gY2FjaGUuc2l6ZSgpOwotCQlpZiAobnVtID09IDApCi0JCQlyZXR1cm4gbmV3IElCcmVha3BvaW50UHJvdmlkZXJbMF07Ci0KLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIGJwID0gbmV3IElCcmVha3BvaW50UHJvdmlkZXJbbnVtXTsKLQkJaW50IGogPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG51bTsgaSsrKSB7Ci0JCQlPYmplY3Qgb2JqID0gY2FjaGUuZ2V0KGkpOwotCQkJaWYgKCEob2JqIGluc3RhbmNlb2YgSUNvbmZpZ3VyYXRpb25FbGVtZW50KSkKLQkJCQljb250aW51ZTsKLQotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSAoSUNvbmZpZ3VyYXRpb25FbGVtZW50KSBvYmo7Ci0JCQlpZiAoIVRBR19QUk9WSURFUi5lcXVhbHMoZWxlbWVudC5nZXROYW1lKCkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlib29sZWFuIGRvQ3JlYXRlID0gZmFsc2U7Ci0KLQkJCVN0cmluZyBhdHRyVmFsdWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoYXR0ck5hbWUpOwotCi0JCQlpZiAoYXR0clZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoYXR0clZhbHVlcywgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJCVN0cmluZyB0eXBlID0gdG9rZW5pemVyLm5leHRUb2tlbigpOwotCQkJCQlpZiAodHlwZS50cmltKCkuZXF1YWxzSWdub3JlQ2FzZShrZXkudHJpbSgpKSkgewotCQkJCQkJZG9DcmVhdGUgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChkb0NyZWF0ZSkgewotCQkJCUlCcmVha3BvaW50UHJvdmlkZXIgYiA9IGNyZWF0ZUJyZWFrcG9pbnRQcm92aWRlcihlbGVtZW50KTsKLQkJCQlpZiAoYiAhPSBudWxsKSB7Ci0JCQkJCWJwW2pdID0gYjsKLQkJCQkJaisrOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlCcmVha3BvaW50UHJvdmlkZXJbXSBicDIgPSBuZXcgSUJyZWFrcG9pbnRQcm92aWRlcltqXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBqOyBpKyspIHsKLQkJCWJwMltpXSA9IGJwW2ldOwotCQl9Ci0KLQkJcmV0dXJuIGJwMjsKLQl9Ci0KLQkvKgotCSAqIFJldHVybnMgYSBtYXRjaGluZyBhcnJheSBvZiBleHRlbnNpb24gcG9pbnRzIG1hdGNoaW5nIHRoaXMga2V5LiBEb2Vzbid0Ci0JICogY2F1c2UgaW5zdGFudGlhdGlvbiBvZiBwcm92aWRlcnMuIEByZXR1cm4gSUJyZWFrcG9pbnRQcm92aWRlcltdCi0JICovCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGZpbmRFbGVtZW50cyhTdHJpbmcga2V5KSB7Ci0JCWluaXRDYWNoZSgpOwotCi0JCWlmIChjYWNoZSA9PSBudWxsIHx8IGNhY2hlLnNpemUoKSA9PSAwKQotCQkJcmV0dXJuIG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF07Ci0KLQkJaW50IG51bSA9IGNhY2hlLnNpemUoKTsKLQkJTGlzdCBlbGVtZW50cyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLQkJCU9iamVjdCBvYmogPSBjYWNoZS5nZXQoaSk7Ci0JCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJQ29uZmlndXJhdGlvbkVsZW1lbnQpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIG9iajsKLQkJCWlmICghVEFHX1BST1ZJREVSLmVxdWFscyhlbGVtZW50LmdldE5hbWUoKSkpCi0JCQkJY29udGludWU7Ci0KLQkJCWJvb2xlYW4gYWRkID0gZmFsc2U7Ci0JCQlTdHJpbmcgdHlwZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ09OVEVOVF9UWVBFUyk7Ci0JCQlTdHJpbmcgZXh0cyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9FWFRFTlNJT05TKTsKLQotCQkJaWYgKHR5cGVzID09IG51bGwgJiYgZXh0cyA9PSBudWxsKSB7Ci0JCQkJYWRkID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKCFhZGQgJiYgdHlwZXMgIT0gbnVsbCAmJiB0eXBlcy5sZW5ndGgoKSA+IDApIHsKLQkJCQlJQ29udGVudFR5cGUgdGVzdFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShrZXkpOwotCQkJCVN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHR5cGVzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7Ci0JCQkJCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKHR5cGUpOwotCQkJCQlpZiAoY29udGVudFR5cGUgIT0gbnVsbCAmJiB0ZXN0VHlwZSAhPSBudWxsICYmIGNvbnRlbnRUeXBlLmlzS2luZE9mKHRlc3RUeXBlKSkgewotCQkJCQkJYWRkID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAoIWFkZCAmJiBleHRzICE9IG51bGwpIHsKLQkJCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihleHRzLCAiLCIpOyAvLyROT04tTkxTLTEkCi0JCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJU3RyaW5nIGV4dCA9IHRva2VuaXplci5uZXh0VG9rZW4oKTsKLQkJCQkJaWYgKGV4dC50cmltKCkuZXF1YWxzKGtleS50cmltKCkpKSB7Ci0JCQkJCQlhZGQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChhZGQpIHsKLQkJCQllbGVtZW50cy5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSkgZWxlbWVudHMudG9BcnJheShuZXcgSUNvbmZpZ3VyYXRpb25FbGVtZW50WzBdKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJyZWFrcG9pbnQgcHJvdmlkZXJzIGZvciBhIHNwZWNpZmllZCBjb250ZW50IHR5cGUKLQkgKiBoYW5kbGVyCi0JICogCi0JICogQHBhcmFtIGhhbmRsZXIKLQkgKiAgICAgICAgICAgIGEgY29udGVudCB0eXBlIGhhbmRsZXIKLQkgKiBAcGFyYW0gZXh0Ci0JICogICAgICAgICAgICBmaWxlIGV4dGVuc2lvbgotCSAqIEByZXR1cm4gSUJyZWFrcG9pbnRQcm92aWRlcltdCi0JICovCi0JcHVibGljIElCcmVha3BvaW50UHJvdmlkZXJbXSBnZXRCcmVha3BvaW50UHJvdmlkZXJzKElFZGl0b3JQYXJ0IGVkaXRvcnBhcnQsIFN0cmluZyBjb250ZW50VHlwZUlELCBTdHJpbmcgZXh0KSB7Ci0JCWluaXRDYWNoZSgpOwotCi0JCS8vIEdldCBicmVha3BvaW50IHByb3ZpZGVycyBmb3IgdGhpcyBjb250ZW50IHR5cGUgaGFuZGxlcgotCQlJQnJlYWtwb2ludFByb3ZpZGVyW10gcHJvdmlkZXJzMSA9IG5ldyBJQnJlYWtwb2ludFByb3ZpZGVyWzBdOwotCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlEKTsKLQkJTGlzdCBob2xkUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdCgyKTsKLQkJd2hpbGUgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMgPSAoSUJyZWFrcG9pbnRQcm92aWRlcltdKSBtYXAuZ2V0KGNvbnRlbnRUeXBlLmdldElkKCkpOwotCQkJaWYgKHByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQkJcHJvdmlkZXJzID0gY3JlYXRlQnJlYWtwb2ludFByb3ZpZGVycyhBVFRfQ09OVEVOVF9UWVBFUywgY29udGVudFR5cGUuZ2V0SWQoKSk7Ci0JCQkJaWYgKHByb3ZpZGVycyAhPSBudWxsKSB7Ci0JCQkJCW1hcC5wdXQoY29udGVudFR5cGUuZ2V0SWQoKSwgcHJvdmlkZXJzKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBwcm92aWRlcnMgd2VyZSByZXRyaWV2ZWQgZnJvbSBjYWNoZSBvciBuZXdseSBjcmVhdGVkCi0JCQlpZihwcm92aWRlcnMgIT0gbnVsbCkgewotCQkJCWhvbGRQcm92aWRlcnMuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvdmlkZXJzKSk7Ci0JCQl9Ci0JCQljb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0JCX0KLQkJcHJvdmlkZXJzMSA9IChJQnJlYWtwb2ludFByb3ZpZGVyW10pIGhvbGRQcm92aWRlcnMudG9BcnJheShuZXcgSUJyZWFrcG9pbnRQcm92aWRlcltob2xkUHJvdmlkZXJzLnNpemUoKV0pOwotCi0JCS8vIEdldCBicmVha3BvaW50IHByb3ZpZGVycyBmb3IgdGhpcyBleHRlbnNpb24KLQkJSUJyZWFrcG9pbnRQcm92aWRlcltdIHByb3ZpZGVyczIgPSBuZXcgSUJyZWFrcG9pbnRQcm92aWRlclswXTsKLQkJaWYgKGV4dCAhPSBudWxsKSB7Ci0JCQlwcm92aWRlcnMyID0gKElCcmVha3BvaW50UHJvdmlkZXJbXSkgbWFwLmdldChleHQpOwotCQkJaWYgKHByb3ZpZGVyczIgPT0gbnVsbCkgewotCQkJCXByb3ZpZGVyczIgPSBjcmVhdGVCcmVha3BvaW50UHJvdmlkZXJzKEFUVF9FWFRFTlNJT05TLCBleHQpOwotCQkJCWlmIChwcm92aWRlcnMyICE9IG51bGwpIHsKLQkJCQkJbWFwLnB1dChleHQsIHByb3ZpZGVyczIpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCS8vIGNyZWF0ZSBzaW5nbGUgaGFzaCBzZXQgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uCi0JCVNldCBzID0gbmV3IEhhc2hTZXQoKTsKLQkJcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChwcm92aWRlcnMxKSk7Ci0JCXMuYWRkQWxsKEFycmF5cy5hc0xpc3QocHJvdmlkZXJzMikpOwotCi0JCS8vIGNyZWF0ZSBJQnJlYWtwb2ludFByb3ZpZGVyW10gdG8gcmV0dXJuCi0JCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMgPSBuZXcgSUJyZWFrcG9pbnRQcm92aWRlcltzLnNpemUoKV07Ci0JCUl0ZXJhdG9yIGl0ciA9IHMuaXRlcmF0b3IoKTsKLQkJaW50IGkgPSAwOwotCQlJU291cmNlRWRpdGluZ1RleHRUb29scyB0b29scyA9IG51bGw7Ci0JCWlmIChlZGl0b3JwYXJ0ICE9IG51bGwgJiYgaXRyLmhhc05leHQoKSkKLQkJCXRvb2xzID0gKElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzKSBlZGl0b3JwYXJ0LmdldEFkYXB0ZXIoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MpOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJcHJvdmlkZXJzW2ldID0gKElCcmVha3BvaW50UHJvdmlkZXIpIGl0ci5uZXh0KCk7Ci0JCQlwcm92aWRlcnNbaV0uc2V0U291cmNlRWRpdGluZ1RleHRUb29scyh0b29scyk7Ci0JCQlpKys7Ci0JCX0KLQkJcmV0dXJuIHByb3ZpZGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgcmVzb3VyY2UgZnJvbSBnaXZlbiBwYXJhbWV0ZXJzCi0JICogCi0JICogQHBhcmFtIGlucHV0Ci0JICogQHBhcmFtIGhhbmRsZXIKLQkgKiBAcGFyYW0gZXh0Ci0JICogQHJldHVybiBJUmVzb3VyY2UKLQkgKi8KLQlwdWJsaWMgSVJlc291cmNlIGdldFJlc291cmNlKElFZGl0b3JJbnB1dCBpbnB1dCwgU3RyaW5nIGNvbnRlbnRUeXBlLCBTdHJpbmcgZXh0KSB7Ci0JCUlCcmVha3BvaW50UHJvdmlkZXJbXSBwcm92aWRlcnMgPSBnZXRCcmVha3BvaW50UHJvdmlkZXJzKG51bGwsIGNvbnRlbnRUeXBlLCBleHQpOwotCQlJUmVzb3VyY2UgcmVzID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlcnMubGVuZ3RoOyBpKyspIHsKLQkJCXJlcyA9IHByb3ZpZGVyc1tpXS5nZXRSZXNvdXJjZShpbnB1dCk7Ci0JCQlpZiAocmVzICE9IG51bGwpIHsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0Q2FjaGUoKSB7Ci0JCWlmIChjYWNoZSA9PSBudWxsKSB7Ci0JCQljYWNoZSA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXJlYWRDb250cmlidXRpb25zKFRBR19CUkVBS1BPSU5UX0NPTlRSSUJVVElPTiwgUExfQlJFQUtQT0lOVCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGJyZWFrcG9pbnQgcHJvdmlkZXJzIGZvciBhIHNwZWNpZmllZCBjb250ZW50IHR5cGUKLQkgKiBoYW5kbGVyCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogICAgICAgICAgICBhIGNvbnRlbnQgdHlwZSBJRCBvciBudWxsCi0JICogQHBhcmFtIGV4dAotCSAqICAgICAgICAgICAgYSBmaWxlbmFtZSBleHRlbnNpb24gb3IgbnVsbAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQXZhaWxhYmxlKFN0cmluZyBjb250ZW50VHlwZSwgU3RyaW5nIGV4dCkgewotCQlib29sZWFuIGF2YWlsYWJsZSA9IGZhbHNlOwotCQlpZiAoZXh0ICE9IG51bGwpCi0JCQlhdmFpbGFibGUgPSBmaW5kRWxlbWVudHMoZXh0KS5sZW5ndGggPiAwOwotCQlpZiAoIWF2YWlsYWJsZSAmJiBjb250ZW50VHlwZSAhPSBudWxsKQotCQkJYXZhaWxhYmxlID0gZmluZEVsZW1lbnRzKGNvbnRlbnRUeXBlKS5sZW5ndGggPiAwOwotCQlyZXR1cm4gYXZhaWxhYmxlOwotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nIHRhZywgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdGFnID0gZWxlbWVudC5nZXROYW1lKCk7Ci0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQllbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QUk9WSURFUikpIHsKLQkJCWNhY2hlLmFkZChlbGVtZW50KTsKLQkJCXJldHVybiB0cnVlOyAvLyBqdXN0IGNhY2hlIHRoZSBlbGVtZW50IC0gZG9uJ3QgZ28gaW50byBpdAotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0Ryb3BBY3Rpb25Qcm94eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9Ecm9wQWN0aW9uUHJveHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVlYmY0ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0Ryb3BBY3Rpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51bmRvLklTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkU2ltcGxlRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXh0ZW5zaW9ucy5JU2VsZlZhbGlkYXRlRWRpdEFjdGlvbjsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIERyb3BBY3Rpb25Qcm94eSBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyIHsKLQlwdWJsaWMgc3RhdGljIE9iamVjdCBuZXdJbnN0YW5jZShPYmplY3Qgb2JqKSB7Ci0JCU9iamVjdCBpbnN0YW5jZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlTZXQgc2V0ID0gbmV3IEhhc2hTZXQoKTsKLQkJCUNsYXNzIGNsYXp6ID0gb2JqLmdldENsYXNzKCk7Ci0JCQl3aGlsZSAoY2xhenogIT0gbnVsbCkgewotCQkJCUNsYXNzW10gaW50ZXJmYWNlcyA9IGNsYXp6LmdldEludGVyZmFjZXMoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJc2V0LmFkZChpbnRlcmZhY2VzW2ldKTsKLQkJCQl9Ci0JCQkJY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCQl9Ci0JCQlDbGFzc1tdIGNsYXNzZXMgPSBuZXcgQ2xhc3Nbc2V0LnNpemUoKV07Ci0JCQlJdGVyYXRvciBpdHIgPSBzZXQuaXRlcmF0b3IoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpdHIuaGFzTmV4dCgpKSB7Ci0JCQkJY2xhc3Nlc1tpXSA9IChDbGFzcykgaXRyLm5leHQoKTsKLQkJCQlpKys7Ci0JCQl9Ci0JCQlpbnN0YW5jZSA9IFByb3h5Lm5ld1Byb3h5SW5zdGFuY2Uob2JqLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSwgY2xhc3NlcywgbmV3IERyb3BBY3Rpb25Qcm94eShvYmopKTsKLQkJfSBjYXRjaCAoRXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHdoaWxlIHByb3h5aW5nIGEgZHJvcCBhY3Rpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJaW5zdGFuY2UgPSBvYmo7Ci0JCX0KLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXByaXZhdGUgSUV4dGVuZGVkU2ltcGxlRWRpdG9yIGVkaXRvciA9IG51bGw7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGZSZWNvcmRlcjsKLQlwcml2YXRlIE9iamVjdCBvYmo7Ci0KLQlwcml2YXRlIERyb3BBY3Rpb25Qcm94eShPYmplY3Qgb2JqKSB7Ci0JCXRoaXMub2JqID0gb2JqOwotCX0KLQotCXByaXZhdGUgdm9pZCBiZWdpblJlY29yZGluZygpIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQlkb2N1bWVudCA9IGVkaXRvci5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQkJZlJlY29yZGVyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCQkvLyBQcmVwYXJlIGZvciBVbmRvCi0JCQlpZiAoZlJlY29yZGVyICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZFRleHRVbmRvTWFuYWdlciB1bSA9IGZSZWNvcmRlci5nZXRVbmRvTWFuYWdlcigpOwotCQkJCWlmICh1bSAhPSBudWxsKSB7Ci0JCQkJCWlmICh0aGlzLm9iaiBpbnN0YW5jZW9mIElBY3Rpb24pCi0JCQkJCQl1bS5iZWdpblJlY29yZGluZyh0aGlzLCAoKElBY3Rpb24pIHRoaXMub2JqKS5nZXRUZXh0KCksICgoSUFjdGlvbikgdGhpcy5vYmopLmdldERlc2NyaXB0aW9uKCkpOwotCQkJCQllbHNlCi0JCQkJCQl1bS5iZWdpblJlY29yZGluZyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kUmVjb3JkaW5nKCkgewotCQlpZiAoZlJlY29yZGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVtID0gZlJlY29yZGVyLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQlpZiAodW0gIT0gbnVsbCkKLQkJCQl1bS5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQlmUmVjb3JkZXIucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQlmUmVjb3JkZXIgPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlciNpbnZva2UoT2JqZWN0LCBNZXRob2QsCi0JICogICAgICBPYmplY3RbXSkKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtLCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKLQkJT2JqZWN0IHJlc3VsdDsKLQkJU3RyaW5nIG5hbWUgPSBtLmdldE5hbWUoKTsKLQkJdHJ5IHsKLQkJCWlmIChuYW1lLmVxdWFscygiZXF1YWxzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIFdvcmthcm91bmQgZm9yIEpESydzIGJ1ZyA0NjUyODc2Ci0JCQkJLy8gImVxdWFscyIgYWx3YXlzIHJldHVybnMgZmFsc2UgZXZlbiBpZiBib3RoCi0JCQkJLy8gSW52b2NhdGlvbkhhbmRsZXIKLQkJCQkvLyBjbGFzcwotCQkJCS8vIGhvbGQgdGhlIHNhbWUgb2JqZWN0cwotCQkJCS8vIFNlZQotCQkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80NjUyODc2Lmh0bWwKLQkJCQkvLyBUaGlzIHByb2JsZW0gaXMgaW4gdGhlIElCTSBTREsgMS4zLjEKLQkJCQkvLyBidXQgSSBkb24ndCBzZWUgdGhlIGJ1ZyBpbiBTdW4ncyBKREsgMS40LjEgKGJldGEpCi0JCQkJT2JqZWN0IGFyZyA9IGFyZ3NbMF07Ci0JCQkJcmV0dXJuIChwcm94eS5nZXRDbGFzcygpID09IGFyZy5nZXRDbGFzcygpICYmIGVxdWFscyhQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihhcmcpKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygicnVuIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChhcmdzWzFdIGluc3RhbmNlb2YgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSB7Ci0JCQkJCWVkaXRvciA9IChJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIGFyZ3NbMV07Ci0JCQkJfQotCQkJCWJlZ2luUmVjb3JkaW5nKCk7Ci0JCQkJaWYgKChlZGl0b3IgIT0gbnVsbCkgJiYgIShvYmogaW5zdGFuY2VvZiBJU2VsZlZhbGlkYXRlRWRpdEFjdGlvbikpIHsKLQkJCQkJCi0JCQkJCS8vIFRPRE86IGNsZWFudXAgdmFsaWRhdGVFZGl0Ci0JCQkJCS8vIGp1c3QgbGVhdmluZyB0aGlzIGNoZWNrIGFuZCBmb2xsb3dpbmcgY29kZSBoZXJlIGZvciB0cmFuc2l0aW9uLiAKLQkJCQkJLy8gSSBhc3N1bWUgd2UnbGwgcmVtb3ZlIGFsbCBuZWVkIGZvciAndmFsaWRhdGVFZGl0JwotCQkJCQkvLyBvciBtb3ZlIHRvIHBsYXRmb3JtIGVkaXRvcidzIHZhbGlkYXRlU3RhdGUgCi0JCQkJCQotLy8JCQkJCUlTdGF0dXMgc3RhdHVzID0gZWRpdG9yLnZhbGlkYXRlRWRpdChnZXREaXNwbGF5KCkuZ2V0QWN0aXZlU2hlbGwoKSk7Ci0vLwkJCQkJaWYgKCFzdGF0dXMuaXNPSygpKSB7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBtLmludm9rZShvYmosIGFyZ3MpOwotCQl9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCXRocm93IGUuZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0JCX0gZmluYWxseSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoInJ1biIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQllbmRSZWNvcmRpbmcoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyYzdiYmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnVuZG8uSVN0cnVjdHVyZWRUZXh0VW5kb01hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLklTZWxmVmFsaWRhdGVFZGl0QWN0aW9uOwotCi0KLS8qKgotICogQmVnaW5zIGFuZCBlbmRzIFVuZG9NYW5hZ2VyIHJlY29yZGluZyBhcm91bmQgcnVuKCkgYW5kIHJ1bldpdGhFdmVudCguLi4pCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5IGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgewotCXB1YmxpYyBzdGF0aWMgT2JqZWN0IG5ld0luc3RhbmNlKE9iamVjdCBvYmopIHsKLQkJU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0JCUNsYXNzIGNsYXp6ID0gb2JqLmdldENsYXNzKCk7Ci0JCXdoaWxlIChjbGF6eiAhPSBudWxsKSB7Ci0JCQlDbGFzc1tdIGludGVyZmFjZXMgPSBjbGF6ei5nZXRJbnRlcmZhY2VzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGludGVyZmFjZXMubGVuZ3RoOyBpKyspIHsKLQkJCQlzZXQuYWRkKGludGVyZmFjZXNbaV0pOwotCQkJfQotCQkJY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7Ci0JCX0KLQkJQ2xhc3NbXSBjbGFzc2VzID0gbmV3IENsYXNzW3NldC5zaXplKCldOwotCQlJdGVyYXRvciBpdHIgPSBzZXQuaXRlcmF0b3IoKTsKLQkJaW50IGkgPSAwOwotCQl3aGlsZSAoaXRyLmhhc05leHQoKSkgewotCQkJY2xhc3Nlc1tpXSA9IChDbGFzcykgaXRyLm5leHQoKTsKLQkJCWkrKzsKLQkJfQotCQlyZXR1cm4gUHJveHkubmV3UHJveHlJbnN0YW5jZShvYmouZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLCBjbGFzc2VzLCBuZXcgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eShvYmopKTsKLQl9Ci0KLQlwcml2YXRlIElFeHRlbmRlZFNpbXBsZUVkaXRvciBlZGl0b3IgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWRNb2RlbCBmUmVjb3JkZXI7Ci0JcHJpdmF0ZSBPYmplY3Qgb2JqOwotCi0JcHJpdmF0ZSBFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5KE9iamVjdCBvYmopIHsKLQkJdGhpcy5vYmogPSBvYmo7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luUmVjb3JkaW5nKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCWRvY3VtZW50ID0gZWRpdG9yLmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCQlmUmVjb3JkZXIgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGRvY3VtZW50KTsKLQkJCS8vIFByZXBhcmUgZm9yIFVuZG8KLQkJCWlmIChmUmVjb3JkZXIgIT0gbnVsbCkgewotCQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVtID0gZlJlY29yZGVyLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQkJaWYgKHVtICE9IG51bGwpIHsKLQkJCQkJdW0uYmVnaW5SZWNvcmRpbmcodGhpcywgKChJQWN0aW9uKSB0aGlzLm9iaikuZ2V0VGV4dCgpLCAoKElBY3Rpb24pIHRoaXMub2JqKS5nZXREZXNjcmlwdGlvbigpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZW5kUmVjb3JkaW5nKCkgewotCQlpZiAoZlJlY29yZGVyICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkVGV4dFVuZG9NYW5hZ2VyIHVtID0gZlJlY29yZGVyLmdldFVuZG9NYW5hZ2VyKCk7Ci0JCQlpZiAodW0gIT0gbnVsbCkgewotCQkJCXVtLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCX0KLQkJCWZSZWNvcmRlci5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCWZSZWNvcmRlciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyI2ludm9rZShPYmplY3QsIE1ldGhvZCwKLQkgKiAgICAgIE9iamVjdFtdKQotCSAqLwotCXB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG0sIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgewotCQlPYmplY3QgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBtLmdldE5hbWUoKTsKLQkJdHJ5IHsKLQkJCWlmIChuYW1lLmVxdWFscygiZXF1YWxzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCS8vIFdvcmthcm91bmQgZm9yIEpESydzIGJ1ZyA0NjUyODc2Ci0JCQkJLy8gImVxdWFscyIgYWx3YXlzIHJldHVybnMgZmFsc2UgZXZlbiBpZiBib3RoCi0JCQkJLy8gSW52b2NhdGlvbkhhbmRsZXIKLQkJCQkvLyBjbGFzcwotCQkJCS8vIGhvbGQgdGhlIHNhbWUgb2JqZWN0cwotCQkJCS8vIFNlZQotCQkJCS8vIGh0dHA6Ly9kZXZlbG9wZXIuamF2YS5zdW4uY29tL2RldmVsb3Blci9idWdQYXJhZGUvYnVncy80NjUyODc2Lmh0bWwKLQkJCQkvLyBUaGlzIHByb2JsZW0gaXMgaW4gdGhlIElCTSBTREsgMS4zLjEKLQkJCQkvLyBidXQgSSBkb24ndCBzZWUgdGhlIGJ1ZyBpbiBTdW4ncyBKREsgMS40LjEgKGJldGEpCi0JCQkJT2JqZWN0IGFyZyA9IGFyZ3NbMF07Ci0JCQkJcmV0dXJuIChwcm94eS5nZXRDbGFzcygpID09IGFyZy5nZXRDbGFzcygpICYmIGVxdWFscyhQcm94eS5nZXRJbnZvY2F0aW9uSGFuZGxlcihhcmcpKSkgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygicnVuV2l0aEV2ZW50IikgfHwgbmFtZS5lcXVhbHMoInJ1biIpKSB7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQKLQkJCQliZWdpblJlY29yZGluZygpOwotCQkJCWlmICgoZWRpdG9yICE9IG51bGwpICYmICEodGhpcy5vYmogaW5zdGFuY2VvZiBJU2VsZlZhbGlkYXRlRWRpdEFjdGlvbikpIHsKLQkJCQkJCi0JCQkJCS8vIFRPRE86IGNsZWFudXAgdmFsaWRhdGVFZGl0Ci0JCQkJCS8vIGp1c3QgbGVhdmluZyB0aGlzIGNoZWNrIGFuZCBmb2xsb3dpbmcgY29kZSBoZXJlIGZvciB0cmFuc2l0aW9uLiAKLQkJCQkJLy8gSSBhc3N1bWUgd2UnbGwgcmVtb3ZlIGFsbCBuZWVkIGZvciAndmFsaWRhdGVFZGl0JwotCQkJCQkvLyBvciBtb3ZlIHRvIHBsYXRmb3JtIGVkaXRvcidzIHZhbGlkYXRlU3RhdGUgCi0KLS8vCQkJCQlJU3RhdHVzIHN0YXR1cyA9IGVkaXRvci52YWxpZGF0ZUVkaXQoZ2V0RGlzcGxheSgpLmdldEFjdGl2ZVNoZWxsKCkpOwotLy8JCQkJCWlmICghc3RhdHVzLmlzT0soKSkgewotLy8JCQkJCQlyZXR1cm4gbnVsbDsKLS8vCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChuYW1lLmVxdWFscygic2V0QWN0aXZlRXh0ZW5kZWRFZGl0b3IiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGFyZ3NbMF0gaW5zdGFuY2VvZiBJRXh0ZW5kZWRTaW1wbGVFZGl0b3IpIHsKLQkJCQkJZWRpdG9yID0gKElFeHRlbmRlZFNpbXBsZUVkaXRvcikgYXJnc1swXTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXN1bHQgPSBtLmludm9rZSh0aGlzLm9iaiwgYXJncyk7Ci0JCX0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlLmdldFRhcmdldEV4Y2VwdGlvbigpKTsKLQkJCS8vdGhyb3cgZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQlpZiAobmFtZS5lcXVhbHMoInJ1bldpdGhFdmVudCIpIHx8IG5hbWUuZXF1YWxzKCJydW4iKSkgeyAvLyROT04tTkxTLTEkICAvLyROT04tTkxTLTIkCi0JCQkJLy8gb25seSBleHBvc2UgdXNlci1kcml2ZW4gZXhjZXB0aW9ucyBmcm9tICJydW5uaW5nIiB0byB0aGUKLQkJCQkvLyB1c2VyCi0JCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQl9IGZpbmFsbHkgewotCQkJaWYgKG5hbWUuZXF1YWxzKCJydW5XaXRoRXZlbnQiKSB8fCBuYW1lLmVxdWFscygicnVuIikpIHsgLy8kTk9OLU5MUy0xJCAgLy8kTk9OLU5MUy0yJAotCQkJCWVuZFJlY29yZGluZygpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9FeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1NjVkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0V4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVDcmVhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuTGlzdGVuZXJMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkhlbHBMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRFZGl0b3JBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JRXh0ZW5kZWRTaW1wbGVFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotcHVibGljIGNsYXNzIEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcgaW1wbGVtZW50cyBJRXh0ZW5kZWRFZGl0b3JBY3Rpb24sIElFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLCBJQWN0aW9uIHsKLSAgICBwcml2YXRlIElBY3Rpb24gcHJveHk7Ci0gICAgcHJpdmF0ZSBJQWN0aW9uIGR1bW15ID0gbmV3IEFjdGlvbigpIHsgLy8gdGhpcyBpcyBmb3IgbWFpbmx5IGl0cyBwcm9wZXJ0eSBjaGFuZ2Ugbm90aWZ5Li4uCi0gICAgfTsKLSAgICAvLyBwcm94eSdlZCBwcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgcF9pZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfaWQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgcF90ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF90ZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIHBfdG9vbFRpcFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX3Rvb2xUaXBUZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIHBfYWN0aW9uRGVmaW5pdGlvbklkOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9hY3Rpb25EZWZpbml0aW9uSWQ7Ci0gICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgcF9pbWFnZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfaW1hZ2U7Ci0gICAgcHJpdmF0ZSBJbWFnZURlc2NyaXB0b3IgcF9ob3ZlckltYWdlOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9ob3ZlckltYWdlOwotICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIHBfZGlzYWJsZWRJbWFnZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfZGlzYWJsZWRJbWFnZTsKLSAgICBwcml2YXRlIGludCBwX2FjY2VsZXJhdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9hY2NlbGVyYXRvcjsKLSAgICBwcml2YXRlIGludCBwX3N0eWxlID0gQVNfUFVTSF9CVVRUT047Ci0gICAgLy9wcml2YXRlIGJvb2xlYW4gc2V0X3Bfc3R5bGU7Ci0gICAgcHJpdmF0ZSBIZWxwTGlzdGVuZXIgcF9oZWxwTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2hlbHBMaXN0ZW5lcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gcF9lbmFibGVkID0gdHJ1ZTsgLy8gc2hvdWxkIGJlIHNhbWUgYXMgd2hhdCBpcyBkb25lIGluCi0gICAgcHJpdmF0ZSBib29sZWFuIHNldF9wX2VuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBMaXN0ZW5lckxpc3QgcF9saXN0ZW5lcnMgPSBuZXcgTGlzdGVuZXJMaXN0KDMpOwotICAgIHByaXZhdGUgYm9vbGVhbiBzZXRfcF9saXN0ZW5lcnM7Ci0gICAgcHJpdmF0ZSBib29sZWFuIHBfY2hlY2tlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfY2hlY2tlZDsKLSAgICBwcml2YXRlIElFeHRlbmRlZFNpbXBsZUVkaXRvciBwX3RhcmdldEVkaXRvcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gc2V0X3BfdGFyZ2V0RWRpdG9yOwotCXByaXZhdGUgYm9vbGVhbiBwX2lzdmlzaWJsZSA9IHRydWU7IC8vIHNob3VsZCBiZSB0cnVlCi0JCi0JcHJpdmF0ZSBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudDsKLQlwcml2YXRlIFN0cmluZyBjbGFzc0F0dHJpYnV0ZTsKLQotCSAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIHBfbGlzdGVuZXJzLmFkZChsaXN0ZW5lcik7Ci0gICAgICAgIHNldF9wX2xpc3RlbmVycyA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEFjY2VsZXJhdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEFjY2VsZXJhdG9yKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0QWNjZWxlcmF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9hY2NlbGVyYXRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEFjdGlvbkRlZmluaXRpb25JZCgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRBY3Rpb25EZWZpbml0aW9uSWQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9hY3Rpb25EZWZpbml0aW9uSWQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREZXNjcmlwdGlvbigpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogZ2V0RGVzY3JpcHRpb24iKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfZGlzYWJsZWRJbWFnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEhlbHBMaXN0ZW5lcigpCi0gICAgICovCi0gICAgcHVibGljIEhlbHBMaXN0ZW5lciBnZXRIZWxwTGlzdGVuZXIoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRIZWxwTGlzdGVuZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9oZWxwTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNnZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRIb3ZlckltYWdlRGVzY3JpcHRvcigpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldEhvdmVySW1hZ2VEZXNjcmlwdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaG92ZXJJbWFnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldElkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0SWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9pZDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldEltYWdlRGVzY3JpcHRvcigpCi0gICAgICovCi0gICAgcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRJbWFnZURlc2NyaXB0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9pbWFnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldE1lbnVDcmVhdG9yKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgSU1lbnVDcmVhdG9yIGdldE1lbnVDcmVhdG9yKCkgewotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHBfaWQgKyAiOiBnZXRNZW51Q3JlYXRvciIpOwotICAgICAgICAvLyAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0TWVudUNyZWF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFN0eWxlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFN0eWxlKCkgewotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJveHkuZ2V0U3R5bGUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9zdHlsZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI2dldFRleHQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHByb3h5LmdldFRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF90ZXh0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jZ2V0VG9vbFRpcFRleHQoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9vbFRpcFRleHQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5nZXRUb29sVGlwVGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwX3Rvb2xUaXBUZXh0OwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jaXNDaGVja2VkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NoZWNrZWQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pc0NoZWNrZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9jaGVja2VkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jaXNFbmFibGVkKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBwcm94eS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcF9lbmFibGVkOwotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcF9saXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgZHVtbXkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gaWYgdGhpcyBoYXMgYSBrZXkgYWNjZWxlcmF0b3IsIGZpcnN0IHVwZGF0ZSB0aGlzIGFjdGlvbiBhbmQgdG8KLSAgICAgICAgICAgIC8vIHNlZSBpZiB0aGlzIGFjdGlvbiBpcyBlbmFibGVkIG9yIG5vdC4KLSAgICAgICAgICAgIGlmICgocHJveHkuZ2V0QWNjZWxlcmF0b3IoKSA+IDApIHx8IChwcm94eS5nZXRBY3Rpb25EZWZpbml0aW9uSWQoKSAhPSBudWxsKSkgewotICAgICAgICAgICAgICAgIHVwZGF0ZSgpOwotICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoKSA9PSB0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHByb3h5LnJ1bigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJveHkucnVuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3J1bldpdGhFdmVudChvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoRXZlbnQgZXZlbnQpIHsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgLy8gc2FtZSBhcyBydW4oKQotICAgICAgICAgICAgaWYgKChwcm94eS5nZXRBY2NlbGVyYXRvcigpID4gMCkgfHwgKHByb3h5LmdldEFjdGlvbkRlZmluaXRpb25JZCgpICE9IG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCgpID09IHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJveHkucnVuV2l0aEV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb3h5LnJ1bldpdGhFdmVudChldmVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEFjdGlvbkRlZmluaXRpb25JZChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFjdGlvbkRlZmluaXRpb25JZChTdHJpbmcgaWQpIHsKLSAgICAgICAgcF9hY3Rpb25EZWZpbml0aW9uSWQgPSBpZDsKLSAgICAgICAgc2V0X3BfYWN0aW9uRGVmaW5pdGlvbklkID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0QWN0aW9uRGVmaW5pdGlvbklkKGlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEFjdGlvbkRlZmluaXRpb25JZChpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldENoZWNrZWQoYm9vbGVhbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDaGVja2VkKGJvb2xlYW4gY2hlY2tlZCkgewotICAgICAgICBwX2NoZWNrZWQgPSBjaGVja2VkOwotICAgICAgICBzZXRfcF9jaGVja2VkID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0Q2hlY2tlZChjaGVja2VkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldENoZWNrZWQoY2hlY2tlZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldERlc2NyaXB0aW9uKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nIHRleHQpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogc2V0RGVzY3JpcHRpb24iKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0RGVzY3JpcHRpb24odGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXREZXNjcmlwdGlvbih0ZXh0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3Iob3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotICAgICAgICBwX2Rpc2FibGVkSW1hZ2UgPSBuZXdJbWFnZTsKLSAgICAgICAgc2V0X3BfZGlzYWJsZWRJbWFnZSA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldERpc2FibGVkSW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0RW5hYmxlZChib29sZWFuKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHBfZW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgIHNldF9wX2VuYWJsZWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0SGVscExpc3RlbmVyKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuSGVscExpc3RlbmVyKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhlbHBMaXN0ZW5lcihIZWxwTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgcF9oZWxwTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgc2V0X3BfaGVscExpc3RlbmVyID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0SGVscExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEhlbHBMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEhvdmVySW1hZ2VEZXNjcmlwdG9yKG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRIb3ZlckltYWdlRGVzY3JpcHRvcihJbWFnZURlc2NyaXB0b3IgbmV3SW1hZ2UpIHsKLSAgICAgICAgcF9ob3ZlckltYWdlID0gbmV3SW1hZ2U7Ci0gICAgICAgIHNldF9wX2hvdmVySW1hZ2UgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldElkKGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgIHBfaWQgPSBpZDsKLSAgICAgICAgc2V0X3BfaWQgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRJZChpZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRJZChpZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEltYWdlRGVzY3JpcHRvcihvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvciBuZXdJbWFnZSkgewotICAgICAgICBwX2ltYWdlID0gbmV3SW1hZ2U7Ci0gICAgICAgIHNldF9wX2ltYWdlID0gdHJ1ZTsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0SW1hZ2VEZXNjcmlwdG9yKG5ld0ltYWdlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEltYWdlRGVzY3JpcHRvcihuZXdJbWFnZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldE1lbnVDcmVhdG9yKG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUNyZWF0b3IpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVudUNyZWF0b3IoSU1lbnVDcmVhdG9yIGNyZWF0b3IpIHsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwX2lkICsgIjogc2V0TWVudUNyZWF0b3IiKTsKLSAgICAgICAgLy8gICAgICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICBpZiAocHJveHkgIT0gbnVsbCkgewotICAgICAgICAgICAgcHJveHkuc2V0TWVudUNyZWF0b3IoY3JlYXRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRNZW51Q3JlYXRvcihjcmVhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jc2V0VGV4dChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHRleHQpIHsKLSAgICAgICAgcF90ZXh0ID0gdGV4dDsKLSAgICAgICAgc2V0X3BfdGV4dCA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldFRleHQodGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIAlkdW1teS5zZXRUZXh0KHRleHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNzZXRUb29sVGlwVGV4dChqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFRvb2xUaXBUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgIHBfdG9vbFRpcFRleHQgPSB0ZXh0OwotICAgICAgICBzZXRfcF90b29sVGlwVGV4dCA9IHRydWU7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHByb3h5LnNldFRvb2xUaXBUZXh0KHRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAJZHVtbXkuc2V0VG9vbFRpcFRleHQodGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIChub24tSmF2YWRvYykKLSAgICAgKiAKLSAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uI3NldEFjY2VsZXJhdG9yKGludCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBY2NlbGVyYXRvcihpbnQga2V5Y29kZSkgewotICAgICAgICBwX2FjY2VsZXJhdG9yID0ga2V5Y29kZTsKLSAgICAgICAgc2V0X3BfYWNjZWxlcmF0b3IgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmIChwcm94eSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwcm94eS5zZXRBY2NlbGVyYXRvcihrZXljb2RlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgCWR1bW15LnNldEFjY2VsZXJhdG9yKGtleWNvZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZEVkaXRvckFjdGlvbiNzZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihjb20uaWJtLnNzZS5lZGl0b3IuZXh0ZW5zaW9uLklFeHRlbmRlZFNpbXBsZUVkaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFeHRlbmRlZEVkaXRvcihJRXh0ZW5kZWRTaW1wbGVFZGl0b3IgdGFyZ2V0RWRpdG9yKSB7Ci0JCXBfdGFyZ2V0RWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCQlzZXRfcF90YXJnZXRFZGl0b3IgPSB0cnVlOwotICAgICAgICAvLyBkb24ndCByZWFsaXplIGNsYXNzLgotICAgICAgICAvLyByZWFsaXplKCk7Ci0gICAgICAgIGlmICgocHJveHkgIT0gbnVsbCkgJiYgKHByb3h5IGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSkgewotICAgICAgICAgICAgKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pcHJveHkpLnNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0gICAgICAgIH0KLQl9Ci0KLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBjb20uaWJtLnNzZS5lZGl0b3IuZXh0ZW5zaW9uLklFeHRlbmRlZEVkaXRvckFjdGlvbiNpc1Zpc2libGUoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzVmlzaWJsZSgpIHsKLSAgICAgICAgLy8gZG9uJ3QgcmVhbGl6ZSBjbGFzcy4KLSAgICAgICAgLy8gcmVhbGl6ZSgpOwotICAgICAgICBpZiAoKHByb3h5ICE9IG51bGwpICYmIChwcm94eSBpbnN0YW5jZW9mIElFeHRlbmRlZEVkaXRvckFjdGlvbikpIHsKLSAgICAgICAgICAgIHJldHVybiAoKElFeHRlbmRlZEVkaXRvckFjdGlvbilwcm94eSkuaXNWaXNpYmxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBfaXN2aXNpYmxlOwotCX0KLQotICAgIC8qCi0gICAgICogKG5vbi1KYXZhZG9jKQotICAgICAqIAotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jaXNIYW5kbGVkCi0gICAgICovCi0JcHVibGljIGJvb2xlYW4gaXNIYW5kbGVkKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gc2VlIEFjdGlvbkRlc2NyaXB0b3IjY3JlYXRlRXh0ZW5zaW9uCi0JcHJpdmF0ZSBzdGF0aWMgSUFjdGlvbiBuZXdJbnN0YW5jZShmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxtLCBmaW5hbCBTdHJpbmcgY2xhKSB7Ci0JCWZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJQnVuZGxlIGJ1bmRsZT0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsbS5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCAmJiBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFKSB7Ci0JCQl0cnkgewotCQkJCXJlc3VsdFswXSA9IGVsbS5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBjYXRjaCBhbmQgbG9nIEFOWSBleGNlcHRpb24gZnJvbSBleHRlbnNpb24gcG9pbnQKLQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShudWxsLCBuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJcmVzdWx0WzBdID0gZWxtLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oY2xhKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGNhdGNoIGFuZCBsb2cgQU5ZIGV4Y2VwdGlvbiBmcm9tIGV4dGVuc2lvbiBwb2ludAotCQkJCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQkJaWYgKChyZXN1bHRbMF0gIT0gbnVsbCkgJiYgKHJlc3VsdFswXSBpbnN0YW5jZW9mIElBY3Rpb24pKSB7Ci0JCQlyZXR1cm4gKElBY3Rpb24pcmVzdWx0WzBdOwotCQl9Ci0JCXJldHVybiBudWxsOwotICAgIH0KLQkKLQlwcml2YXRlIHN0YXRpYyB2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oZmluYWwgT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQotCS8qKgotICAgICAqIEluc3RhbnRpYXRlIGEgcmVhbCBjbGFzcyBoZXJlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVhbGl6ZSgpIHsKLSAgICAgICAgaWYgKChwcm94eSA9PSBudWxsKSAmJiAoZWxlbWVudCAhPSBudWxsKSAmJiAoY2xhc3NBdHRyaWJ1dGUgIT0gbnVsbCkpIHsKLSAgICAgICAgICAgIHByb3h5ID0gbmV3SW5zdGFuY2UoZWxlbWVudCwgY2xhc3NBdHRyaWJ1dGUpOwotCSAgICAgICAgaWYgKHByb3h5ICE9IG51bGwpIHsKLQkgICAgICAgICAgICBlbGVtZW50ID0gbnVsbDsKLQkgICAgICAgICAgICBjbGFzc0F0dHJpYnV0ZSA9IG51bGw7Ci0JICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHByb3h5J2VkIHByb3BlcnRpZXMKLQkgICAgICAgICAgICBpZiAoc2V0X3BfbGlzdGVuZXJzID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfbGlzdGVuZXJzLnNpemUoKSA+IDApIHsKLQkgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGwgPSBwX2xpc3RlbmVycy5nZXRMaXN0ZW5lcnMoKTsKLQkgICAgICAgICAgICAgICAgICAgIGludCBscyA9IGwubGVuZ3RoOwotCSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsczsgaSsrKSB7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgcGwgPSAoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpIGxbaV07Ci0JICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwbCk7Ci0JICAgICAgICAgICAgICAgICAgICAgICAgZHVtbXkucmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihwbCk7IC8vIHJlbW92ZSBsaXN0ZW5lciBmcm9tIGR5bW15IHNvIHRoYXQgd2UgZG9uJ3Qgc2VuZCBub3RpZmljYXRpb25zIHR3aWNlIGFueW1vcmUKLQkgICAgICAgICAgICAgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfYWNjZWxlcmF0b3IgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBwcm94eS5zZXRBY2NlbGVyYXRvcihwX2FjY2VsZXJhdG9yKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2FjdGlvbkRlZmluaXRpb25JZCA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX2FjdGlvbkRlZmluaXRpb25JZCAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRBY3Rpb25EZWZpbml0aW9uSWQocF9hY3Rpb25EZWZpbml0aW9uSWQpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9jaGVja2VkID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgcHJveHkuc2V0Q2hlY2tlZChwX2NoZWNrZWQpOwotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfZGlzYWJsZWRJbWFnZSA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX2Rpc2FibGVkSW1hZ2UgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IocF9kaXNhYmxlZEltYWdlKTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfZW5hYmxlZCA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIHByb3h5LnNldEVuYWJsZWQocF9lbmFibGVkKTsKLQkgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgaWYgKHNldF9wX2hlbHBMaXN0ZW5lciA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX2hlbHBMaXN0ZW5lciAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRIZWxwTGlzdGVuZXIocF9oZWxwTGlzdGVuZXIpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9ob3ZlckltYWdlID09IHRydWUpIHsKLQkgICAgICAgICAgICAgICAgaWYgKHBfaG92ZXJJbWFnZSAhPSBudWxsKSB7Ci0JICAgICAgICAgICAgICAgICAgICBwcm94eS5zZXRIb3ZlckltYWdlRGVzY3JpcHRvcihwX2hvdmVySW1hZ2UpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9pZCA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX2lkICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldElkKHBfaWQpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF9pbWFnZSA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX2ltYWdlICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldEltYWdlRGVzY3JpcHRvcihwX2ltYWdlKTsKLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgICAgICBpZiAoc2V0X3BfdGV4dCA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX3RleHQgIT0gbnVsbCkgewotCSAgICAgICAgICAgICAgICAgICAgcHJveHkuc2V0VGV4dChwX3RleHQpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF90b29sVGlwVGV4dCA9PSB0cnVlKSB7Ci0JICAgICAgICAgICAgICAgIGlmIChwX3Rvb2xUaXBUZXh0ICE9IG51bGwpIHsKLQkgICAgICAgICAgICAgICAgICAgIHByb3h5LnNldFRvb2xUaXBUZXh0KHBfdG9vbFRpcFRleHQpOwotCSAgICAgICAgICAgICAgICB9Ci0JICAgICAgICAgICAgfQotCSAgICAgICAgICAgIGlmIChzZXRfcF90YXJnZXRFZGl0b3IgPT0gdHJ1ZSkgewotCSAgICAgICAgICAgICAgICBpZiAocF90YXJnZXRFZGl0b3IgIT0gbnVsbCkgewotCQkJCSAgICAgICAgaWYgKHByb3h5IGluc3RhbmNlb2YgSUV4dGVuZGVkRWRpdG9yQWN0aW9uKSB7Ci0JCQkJICAgICAgICAgICAgKChJRXh0ZW5kZWRFZGl0b3JBY3Rpb24pcHJveHkpLnNldEFjdGl2ZUV4dGVuZGVkRWRpdG9yKHBfdGFyZ2V0RWRpdG9yKTsKLQkJCQkgICAgICAgIH0KLQkgICAgICAgICAgICAgICAgfQotCSAgICAgICAgICAgIH0KLQkgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhbGl6ZWQoKSB7Ci0gICAgICAgIHJldHVybiAocHJveHkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAobm9uLUphdmFkb2MpCi0gICAgICogCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0gICAgICAgIC8vIGRvbid0IHJlYWxpemUgY2xhc3MuCi0gICAgICAgIC8vIHJlYWxpemUoKTsKLSAgICAgICAgaWYgKChwcm94eSAhPSBudWxsKSAmJiAocHJveHkgaW5zdGFuY2VvZiBJVXBkYXRlKSkgewotICAgICAgICAgICAgKChJVXBkYXRlKSBwcm94eSkudXBkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXQgYSByZWFsIGFjdGlvbiBjbGFzcwotICAgICAqLwotICAgIHB1YmxpYyBJQWN0aW9uIGdldEFjdGlvbigpIHsKLSAgICAgICAgcmVhbGl6ZSgpOwotICAgICAgICByZXR1cm4gcHJveHk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBUaGVzZSBhcmUgQWN0aW9ucydzIGNvbnN0cnVjdG9ycwotICAgICAqLwotICAgIEV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcoKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgIH0KLSAgICBwdWJsaWMgRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZyhmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgZmluYWwgU3RyaW5nIGNsYXNzQXR0cmlidXRlKSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgICAgIHRoaXMuY2xhc3NBdHRyaWJ1dGUgPSBjbGFzc0F0dHJpYnV0ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0lFeHRlbmRlZEVkaXRvckFjdGlvblByb3h5Rm9yRGVsYXlMb2FkaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxNTJjYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JRXh0ZW5kZWRFZGl0b3JBY3Rpb25Qcm94eUZvckRlbGF5TG9hZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSUV4dGVuZGVkRWRpdG9yQWN0aW9uUHJveHlGb3JEZWxheUxvYWRpbmcgewotICAgIHB1YmxpYyBJQWN0aW9uIGdldEFjdGlvbigpOwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVhbGl6ZWQoKTsKLSAgICBwdWJsaWMgdm9pZCByZWFsaXplKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0ltYWdlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9JbWFnZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRlYzY5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZXh0ZW5zaW9uL0ltYWdlVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbjsKLQotCi0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VVdGlsIHsKLQotCi0JLyoqCi0JICogQ29udmVuaWVuY2UgTWV0aG9kLiBSZXR1cm5zIGFuIEltYWdlRGVzY3JpcHRvciB3aG9zZSBwYXRoLCByZWxhdGl2ZSB0bwotCSAqIHRoZSBwbHVnaW4gY29udGFpbmluZyB0aGUgPGNvZGU+ZXh0ZW5zaW9uPC9jb2RlPiBpcwotCSAqIDxjb2RlPnN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lPC9jb2RlPi4gSWYgdGhlcmUgaXNuJ3QgYW55IHZhbHVlCi0JICogYXNzb2NpYXRlZCB3aXRoIHRoZSBuYW1lIHRoZW4gPGNvZGU+bnVsbAotCSAqIDwvY29kZT4gaXMgcmV0dXJuZWQuCi0JICogCi0JICogVGhpcyBtZXRob2QgaXMgY29udmVuaWVuY2UgYW5kIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSBieSB0aGUgd29ya2JlbmNoCi0JICogYmVjYXVzZSBpdCBleHBsaWNpdGx5IHVzZXMgdGhlIHdvcmtiZW5jaCdzIHJlZ2lzdHJ5IGZvcgotCSAqIGNhY2hpbmcvcmV0cmlldmluZyBpbWFnZXMgZnJvbSBvdGhlciBleHRlbnNpb25zIC0tIG90aGVyIHBsdWdpbnMgbXVzdAotCSAqIHVzZXIgdGhlaXIgb3duIHJlZ2lzdHJ5LiBUaGlzIGNvbnZlbmllbmNlIG1ldGhvZCBpcyBzdWJqZWN0IHRvIHJlbW92YWwuCi0JICogCi0JICogTm90ZTogc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUgbXVzdCBub3QgaGF2ZSBhbnkgbGVhZGluZyAiLiIgb3IgcGF0aAotCSAqIHNlcGFyYXRvcnMgLyBvciBcIElTVidzIHNob3VsZCB1c2UgaWNvbnMvbXlzYW1wbGUuZ2lmIGFuZCBub3QKLQkgKiAuL2ljb25zL215c2FtcGxlLmdpZgotCSAqIAotCSAqIE5vdGU6IFRoaXMgY29uc3VsdHMgdGhlIHBsdWdpbiBmb3IgZXh0ZW5zaW9uIGFuZCBvYnRhaW5zIGl0cwotCSAqIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4gYWxsIHJlcXVlc3RlZCBpbWFnZXMgYXJlIGFzc3VtZWQgdG8gYmUgaW4gYQotCSAqIGRpcmVjdG9yeSBiZWxvdyBhbmQgcmVsYXRpdmUgdG8gdGhhdCBwbHVnaW5zIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCi0JICovCi0JcHVibGljIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yRnJvbUV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbiwgU3RyaW5nIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKSB7Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKTsKLQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShwbHVnaW5JZCk7Ci0JCXJldHVybiBnZXRJbWFnZURlc2NyaXB0b3JGcm9tQnVuZGxlKGJ1bmRsZSwgc3ViZGlyZWN0b3J5QW5kRmlsZW5hbWUpOwotCX0KLQotCS8qKgotCSAqIENvbnZlbmllbmNlIE1ldGhvZC4gUmV0dXJuIGFuIEltYWdlRGVzY3JpcHRvciB3aG9zZSBwYXRoIHJlbGF0aXZlIHRvCi0JICogdGhlIHBsdWdpbiBkZXNjcmliZWQgYnkgPGNvZGU+YnVuZGxlPC9jb2RlPiBpcwotCSAqIDxjb2RlPnN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lPC9jb2RlPi4gUmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIG5vIGltYWdlIGNvdWxkIGJlIGZvdW5kLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIGlzIGNvbnZlbmllbmNlIGFuZCBvbmx5IGludGVuZGVkIGZvciB1c2UgYnkgdGhlIHdvcmtiZW5jaAotCSAqIGJlY2F1c2UgaXQgZXhwbGljaXRseSB1c2VzIHRoZSB3b3JrYmVuY2gncyByZWdpc3RyeSBmb3IKLQkgKiBjYWNoaW5nL3JldHJpZXZpbmcgaW1hZ2VzIGZyb20gb3RoZXIgZXh0ZW5zaW9ucyAtLSBvdGhlciBwbHVnaW5zIG11c3QKLQkgKiB1c2VyIHRoZWlyIG93biByZWdpc3RyeS4gVGhpcyBjb252ZW5pZW5jZSBtZXRob2QgaXMgc3ViamVjdCB0byByZW1vdmFsLgotCSAqIAotCSAqIE5vdGU6IHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lIG11c3Qgbm90IGhhdmUgYW55IGxlYWRpbmcgIi4iIG9yIHBhdGgKLQkgKiBzZXBhcmF0b3JzIC8gb3IgXCBJU1YncyBzaG91bGQgdXNlIGljb25zL215c2FtcGxlLmdpZiBhbmQgbm90Ci0JICogLi9pY29ucy9teXNhbXBsZS5naWYKLQkgKiAKLQkgKiBOb3RlOiBUaGlzIGNvbnN1bHRzIHRoZSBwbHVnaW4gZm9yIGV4dGVuc2lvbiBhbmQgb2J0YWlucyBpdHMKLQkgKiBpbnN0YWxsYXRpb24gbG9jYXRpb24uIGFsbCByZXF1ZXN0ZWQgaW1hZ2VzIGFyZSBhc3N1bWVkIHRvIGJlIGluIGEKLQkgKiBkaXJlY3RvcnkgYmVsb3cgYW5kIHJlbGF0aXZlIHRvIHRoYXQgcGx1Z2lucyBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvckZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKSB7Ci0KLQkJVVJMIHBhdGggPSBidW5kbGUuZ2V0RW50cnkoIi8iKTsgLy8kTk9OLU5MUy0xJAotCQlVUkwgZnVsbFBhdGhTdHJpbmcgPSBudWxsOwotCQl0cnkgewotCQkJZnVsbFBhdGhTdHJpbmcgPSBuZXcgVVJMKHBhdGgsIHN1YmRpcmVjdG9yeUFuZEZpbGVuYW1lKTsKLQkJCXJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChmdWxsUGF0aFN0cmluZyk7Ci0JCX0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2V4dGVuc2lvbi9SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDQ0NGNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9leHRlbnNpb24vUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGx1Z2luUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlNvcnRlcjsKLQotCi0vKioKLSAqIFRlbXBsYXRlIGltcGxlbWVudGF0aW9uIG9mIGEgcmVnaXN0cnkgcmVhZGVyIHRoYXQgY3JlYXRlcyBvYmplY3RzCi0gKiByZXByZXNlbnRpbmcgcmVnaXN0cnkgY29udGVudHMuIFR5cGljYWxseSwgYW4gZXh0ZW5zaW9uIGNvbnRhaW5zIG9uZQotICogZWxlbWVudCwgYnV0IHRoaXMgcmVhZGVyIGhhbmRsZXMgbXVsdGlwbGUgZWxlbWVudHMgcGVyIGV4dGVuc2lvbi4KLSAqIAotICogVG8gc3RhcnQgcmVhZGluZyB0aGUgZXh0ZW5zaW9ucyBmcm9tIHRoZSByZWdpc3RyeSBmb3IgYW4gZXh0ZW5zaW9uIHBvaW50LAotICogY2FsbCB0aGUgbWV0aG9kIDxjb2RlPnJlYWRSZWdpc3RyeTwvY29kZT4uCi0gKiAKLSAqIFRvIHJlYWQgY2hpbGRyZW4gb2YgYW4gSUNvbmZpZ3VyYXRpb25FbGVtZW50LCBjYWxsIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRFbGVtZW50Q2hpbGRyZW48L2NvZGU+IGZyb20geW91ciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kCi0gKiA8Y29kZT5yZWFkRWxlbWVudDwvY29kZT4sIGFzIGl0IHdpbGwgbm90IGJlIGRvbmUgYnkgZGVmYXVsdC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFJlZ2lzdHJ5UmVhZGVyIHsKLQotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0RFU0NSSVBUSU9OID0gImRlc2NyaXB0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXByb3RlY3RlZCBSZWdpc3RyeVJlYWRlcigpIHsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBleHRyYWN0cyBkZXNjcmlwdGlvbiBhcyBhIHN1YmVsZW1lbnQgb2YgdGhlIGdpdmVuIGVsZW1lbnQuCi0JICogCi0JICogQHJldHVybiBkZXNjcmlwdGlvbiBzdHJpbmcgaWYgZGVmaW5lZCwgb3IgZW1wdHkgc3RyaW5nIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERlc2NyaXB0aW9uKElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWcpIHsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBjb25maWcuZ2V0Q2hpbGRyZW4oVEFHX0RFU0NSSVBUSU9OKTsKLQkJaWYgKGNoaWxkcmVuLmxlbmd0aCA+PSAxKSB7Ci0JCQlyZXR1cm4gY2hpbGRyZW5bMF0uZ2V0VmFsdWUoKTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIHRoZSBlcnJvciBpbiB0aGUgd29ya2JlbmNoIGxvZyB1c2luZyB0aGUgcHJvdmlkZWQgdGV4dCBhbmQgdGhlCi0JICogaW5mb3JtYXRpb24gaW4gdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dFcnJvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIHRleHQpIHsKLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpOwotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKCJQbHVnaW4gIiArIGV4dGVuc2lvbi5nZXROYW1lc3BhY2UoKSArICIsIGV4dGVuc2lvbiAiICsgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblBvaW50VW5pcXVlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJYnVmLmFwcGVuZCgiXG4iICsgdGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIGJ1Zi50b1N0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgdmVyeSBjb21tb24gcmVnaXN0cnkgZXJyb3Igd2hlbiBhIHJlcXVpcmVkIGF0dHJpYnV0ZSBpcyBtaXNzaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ01pc3NpbmdBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCWxvZ0Vycm9yKGVsZW1lbnQsICJSZXF1aXJlZCBhdHRyaWJ1dGUgJyIgKyBhdHRyaWJ1dGVOYW1lICsgIicgbm90IGRlZmluZWQiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBMb2dzIGEgcmVnaXN0cnkgZXJyb3Igd2hlbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50IGlzIHVua25vd24uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nVW5rbm93bkVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlVua25vd24gZXh0ZW5zaW9uIHRhZyBmb3VuZDogIiArIGVsZW1lbnQuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEFwcGx5IGEgcmVwcm9kdWNhYmxlIG9yZGVyIHRvIHRoZSBsaXN0IG9mIGV4dGVuc2lvbnMgcHJvdmlkZWQsIHN1Y2gKLQkgKiB0aGF0IHRoZSBvcmRlciB3aWxsIG5vdCBjaGFuZ2UgYXMgZXh0ZW5zaW9ucyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgSUV4dGVuc2lvbltdIG9yZGVyRXh0ZW5zaW9ucyhJRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucykgewotCQkvLyBCeSBkZWZhdWx0LCB0aGUgb3JkZXIgaXMgYmFzZWQgb24gcGx1Z2luIGlkIHNvcnRlZAotCQkvLyBpbiBhc2NlbmRpbmcgb3JkZXIuIFRoZSBvcmRlciBmb3IgYSBwbHVnaW4gcHJvdmlkaW5nCi0JCS8vIG1vcmUgdGhhbiBvbmUgZXh0ZW5zaW9uIGZvciBhbiBleHRlbnNpb24gcG9pbnQgaXMKLQkJLy8gZGVwZW5kZW50IGluIHRoZSBvcmRlciBsaXN0ZWQgaW4gdGhlIFhNTCBmaWxlLgotCQlTb3J0ZXIgc29ydGVyID0gbmV3IFNvcnRlcigpIHsKLQkJCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGV4dGVuc2lvbjEsIE9iamVjdCBleHRlbnNpb24yKSB7Ci0JCQkJU3RyaW5nIHMxID0gKChJRXh0ZW5zaW9uKSBleHRlbnNpb24xKS5nZXROYW1lc3BhY2UoKS50b1VwcGVyQ2FzZSgpOwotCQkJCVN0cmluZyBzMiA9ICgoSUV4dGVuc2lvbikgZXh0ZW5zaW9uMikuZ2V0TmFtZXNwYWNlKCkudG9VcHBlckNhc2UoKTsKLQkJCQkvL1JldHVybiB0cnVlIGlmIGVsZW1lbnRUd28gaXMgJ2dyZWF0ZXIgdGhhbicgZWxlbWVudE9uZQotCQkJCXJldHVybiBzMi5jb21wYXJlVG8oczEpID4gMDsKLQkJCX0KLQkJfTsKLQotCQlPYmplY3RbXSBzb3J0ZWQgPSBzb3J0ZXIuc29ydChleHRlbnNpb25zKTsKLQkJSUV4dGVuc2lvbltdIHNvcnRlZEV4dGVuc2lvbiA9IG5ldyBJRXh0ZW5zaW9uW3NvcnRlZC5sZW5ndGhdOwotCQlTeXN0ZW0uYXJyYXljb3B5KHNvcnRlZCwgMCwgc29ydGVkRXh0ZW5zaW9uLCAwLCBzb3J0ZWQubGVuZ3RoKTsKLQkJcmV0dXJuIHNvcnRlZEV4dGVuc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJbXBsZW1lbnQgdGhpcyBtZXRob2QgdG8gcmVhZCBlbGVtZW50J3MgYXR0cmlidXRlcy4gSWYgY2hpbGRyZW4gc2hvdWxkCi0JICogYWxzbyBiZSByZWFkLCB0aGVuIGltcGxlbWVudG9yIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nCi0JICogPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4uIEltcGxlbWVudG9yIGlzIGFsc28gcmVzcG9uc2libGUKLQkgKiBmb3IgbG9nZ2luZyBtaXNzaW5nIGF0dHJpYnV0ZXMuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGVsZW1lbnQgd2FzIHJlY29nbml6ZWQsIGZhbHNlIGlmIG5vdC4KLQkgKi8KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBSZWFkIHRoZSBlbGVtZW50J3MgY2hpbGRyZW4uIFRoaXMgaXMgY2FsbGVkIGJ5IHRoZSBzdWJjbGFzcycKLQkgKiByZWFkRWxlbWVudCBtZXRob2Qgd2hlbiBpdCB3YW50cyB0byByZWFkIHRoZSBjaGlsZHJlbiBvZiB0aGUgZWxlbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudENoaWxkcmVuKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJlYWRFbGVtZW50cyhlbGVtZW50LmdldENoaWxkcmVuKCkpOwotCX0KLQotCS8qKgotCSAqIFJlYWQgZWFjaCBlbGVtZW50IG9uZSBhdCBhIHRpbWUgYnkgY2FsbGluZyB0aGUgc3ViY2xhc3MgaW1wbGVtZW50YXRpb24KLQkgKiBvZiA8Y29kZT5yZWFkRWxlbWVudDwvY29kZT4uCi0JICogCi0JICogTG9ncyBhbiBlcnJvciBpZiB0aGUgZWxlbWVudCB3YXMgbm90IHJlY29nbml6ZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmICghcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pKQotCQkJCWxvZ1Vua25vd25FbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWQgb25lIGV4dGVuc2lvbiBieSBsb29waW5nIHRocm91Z2ggaXRzIGNvbmZpZ3VyYXRpb24gZWxlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZEV4dGVuc2lvbihJRXh0ZW5zaW9uIGV4dGVuc2lvbikgewotCQlyZWFkRWxlbWVudHMoZXh0ZW5zaW9uLmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpKTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KElQbHVnaW5SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZXh0ZW5zaW9ucyA9IG9yZGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQlyZWFkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotCQotCS8qKgotCSAqIFN0YXJ0IHRoZSByZWdpc3RyeSByZWFkaW5nIHByb2Nlc3MgdXNpbmcgdGhlIHN1cHBsaWVkIHBsdWdpbiBJRCBhbmQKLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZFJlZ2lzdHJ5KElFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIHBsdWdpbklkLCBTdHJpbmcgZXh0ZW5zaW9uUG9pbnQpIHsKLQkJSUV4dGVuc2lvblBvaW50IHBvaW50ID0gcmVnaXN0cnkuZ2V0RXh0ZW5zaW9uUG9pbnQocGx1Z2luSWQsIGV4dGVuc2lvblBvaW50KTsKLQkJaWYgKHBvaW50ICE9IG51bGwpIHsKLQkJCUlFeHRlbnNpb25bXSBleHRlbnNpb25zID0gcG9pbnQuZ2V0RXh0ZW5zaW9ucygpOwotCQkJZXh0ZW5zaW9ucyA9IG9yZGVyRXh0ZW5zaW9ucyhleHRlbnNpb25zKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykKLQkJCQlyZWFkRXh0ZW5zaW9uKGV4dGVuc2lvbnNbaV0pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE3YWQyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXR0aW5nU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5mb3JtYXQ7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVHlwZWRQb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5IGV4dGVuZHMgQ29udGV4dEJhc2VkRm9ybWF0dGluZ1N0cmF0ZWd5IHsKLQotCS8qKiBEb2N1bWVudHMgdG8gYmUgZm9ybWF0dGVkIGJ5IHRoaXMgc3RyYXRlZ3kgKi8KLQlwcml2YXRlIGZpbmFsIExpbmtlZExpc3QgZkRvY3VtZW50cyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmRm9ybWF0UHJvY2Vzc29yOwotCS8qKiBQYXJ0aXRpb25zIHRvIGJlIGZvcm1hdHRlZCBieSB0aGlzIHN0cmF0ZWd5ICovCi0JcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0IGZQYXJ0aXRpb25zID0gbmV3IExpbmtlZExpc3QoKTsKLQlwcml2YXRlIElSZWdpb24gZlJlZ2lvbjsKLQotCS8qKgotCSAqIEBwYXJhbSBmb3JtYXRQcm9jZXNzb3IKLQkgKi8KLQlwdWJsaWMgU3RydWN0dXJlZEZvcm1hdHRpbmdTdHJhdGVneShJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IpIHsKLQkJc3VwZXIoKTsKLQotCQlmRm9ybWF0UHJvY2Vzc29yID0gZm9ybWF0UHJvY2Vzc29yOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXQoKSB7Ci0JCXN1cGVyLmZvcm1hdCgpOwotCi0JCWZpbmFsIElEb2N1bWVudCBkb2N1bWVudCA9IChJRG9jdW1lbnQpIGZEb2N1bWVudHMucmVtb3ZlRmlyc3QoKTsKLQkJZmluYWwgVHlwZWRQb3NpdGlvbiBwYXJ0aXRpb24gPSAoVHlwZWRQb3NpdGlvbikgZlBhcnRpdGlvbnMucmVtb3ZlRmlyc3QoKTsKLQotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBwYXJ0aXRpb24gIT0gbnVsbCAmJiBmUmVnaW9uICE9IG51bGwgJiYgZkZvcm1hdFByb2Nlc3NvciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZGb3JtYXRQcm9jZXNzb3IuZm9ybWF0RG9jdW1lbnQoZG9jdW1lbnQsIGZSZWdpb24uZ2V0T2Zmc2V0KCksIGZSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RhcnRzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuZm9ybWF0dGVyLklGb3JtYXR0aW5nQ29udGV4dCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBmb3JtYXR0ZXJTdGFydHMoZmluYWwgSUZvcm1hdHRpbmdDb250ZXh0IGNvbnRleHQpIHsKLQkJc3VwZXIuZm9ybWF0dGVyU3RhcnRzKGNvbnRleHQpOwotCi0JCWZQYXJ0aXRpb25zLmFkZExhc3QoY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9QQVJUSVRJT04pKTsKLQkJZkRvY3VtZW50cy5hZGRMYXN0KGNvbnRleHQuZ2V0UHJvcGVydHkoRm9ybWF0dGluZ0NvbnRleHRQcm9wZXJ0aWVzLkNPTlRFWFRfTUVESVVNKSk7Ci0JCWZSZWdpb24gPSAoSVJlZ2lvbikgY29udGV4dC5nZXRQcm9wZXJ0eShGb3JtYXR0aW5nQ29udGV4dFByb3BlcnRpZXMuQ09OVEVYVF9SRUdJT04pOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmZvcm1hdHRlci5Db250ZXh0QmFzZWRGb3JtYXR0aW5nU3RyYXRlZ3kjZm9ybWF0dGVyU3RvcHMoKQotCSAqLwotCXB1YmxpYyB2b2lkIGZvcm1hdHRlclN0b3BzKCkgewotCQlzdXBlci5mb3JtYXR0ZXJTdG9wcygpOwotCi0JCWZQYXJ0aXRpb25zLmNsZWFyKCk7Ci0JCWZEb2N1bWVudHMuY2xlYXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0hpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0hpZ2hsaWdodGVySHlwZXJsaW5rUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwODVmYTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL2h5cGVybGluay9IaWdobGlnaHRlckh5cGVybGlua1ByZXNlbnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5oeXBlcmxpbms7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtQcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotCi0vKioKLSAqIFRoZSBpcyBhbG1vc3QgYW4gZXhhY3QgY29weSBvZiBEZWZhdWx0SHlwZXJsaW5rUHJlc2VudGVyLiBIb3dldmVyIHRoaXMKLSAqIGh5cGVybGluayBwcmVzZW50ZXIgd29ya3Mgd2l0aCB0aGUgU3RydWN0dXJlZFRleHRFZGl0b3IncyBIaWdobGlnaHRlcgotICogaW5zdGVhZCBvZiBUZXh0UHJlc2VudGF0aW9uLgotICogCi0gKiBUaGUgbWFpbiBkaWZmZXJlbmNlIGlzIDxjb2RlPnRleHQucmVkcmF3UmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIHRydWUpOzwvY29kZT4KLSAqIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHBhc3NpbmcgZmFsc2UgZm9yIGNsZWFyQmFja2dyb3VuZC4gQWxzbyBhbGwgbWVudGlvbiBvZgotICogVGV4dFByZXNlbnRhdGlvbiB3YXMgcmVtb3ZlZCBzaW5jZSBpdCBkb2VzIG5vdCByZWFsbHkgYXBwbHkuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuRGVmYXVsdEh5cGVybGlua1ByZXNlbnRlcgotICovCi1wdWJsaWMgY2xhc3MgSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIgaW1wbGVtZW50cyBJSHlwZXJsaW5rUHJlc2VudGVyLCBQYWludExpc3RlbmVyLCBJVGV4dElucHV0TGlzdGVuZXIsIElEb2N1bWVudExpc3RlbmVyLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBob2xkcyB0aGUgY29sb3IgdXNlZCBmb3IgaHlwZXJsaW5rcy4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPlN0cmluZzwvY29kZT4uIEEgUkdCIGNvbG9yIHZhbHVlIGVuY29kZWQgYXMgYQotCSAqIHN0cmluZyB1c2luZyBjbGFzcyA8Y29kZT5QcmVmZXJlbmNlQ29udmVydGVyPC9jb2RlPgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLlN0cmluZ0NvbnZlcnRlcgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyCi0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSFlQRVJMSU5LX0NPTE9SID0gImh5cGVybGlua0NvbG9yIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKiogVGhlIHRleHQgdmlld2VyLiAqLwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlRleHRWaWV3ZXI7Ci0JLyoqIFRoZSBoYW5kIGN1cnNvci4gKi8KLQlwcml2YXRlIEN1cnNvciBmQ3Vyc29yOwotCS8qKiBUaGUgbGluayBjb2xvci4gKi8KLQlwcml2YXRlIENvbG9yIGZDb2xvcjsKLQkvKiogVGVsbHMgd2hldGhlciB0byBkaXNwb3NlIHRoZSBjb2xvciBvbiB1bmluc3RhbGwuICovCi0JcHJpdmF0ZSBib29sZWFuIGZEaXNwb3NlQ29sb3I7Ci0JLyoqIFRoZSBjdXJyZW50bHkgYWN0aXZlIHJlZ2lvbi4gKi8KLQlwcml2YXRlIElSZWdpb24gZkFjdGl2ZVJlZ2lvbjsKLQkvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgc3R5bGUgcmFuZ2UgYXMgcG9zaXRpb24uICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBmUmVtZW1iZXJlZFBvc2l0aW9uOwotCS8qKiBUaGUgb3B0aW9uYWwgcHJlZmVyZW5jZSBzdG9yZSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlOwotCi0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGRlZmF1bHQgaHlwZXJsaW5rIHByZXNlbnRlciB3aGljaCB1c2VzCi0JICoge0BsaW5rICNIWVBFUkxJTktfQ09MT1J9dG8gcmVhZCB0aGUgY29sb3IgZnJvbSB0aGUgZ2l2ZW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlLgotCSAqIAotCSAqIEBwYXJhbSBzdG9yZQotCSAqICAgICAgICAgICAgdGhlIHByZWZlcmVuY2Ugc3RvcmUKLQkgKi8KLQlwdWJsaWMgSGlnaGxpZ2h0ZXJIeXBlcmxpbmtQcmVzZW50ZXIoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSkgewotCQlmUHJlZmVyZW5jZVN0b3JlID0gc3RvcmU7Ci0JCWZEaXNwb3NlQ29sb3IgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgZGVmYXVsdCBoeXBlcmxpbmsgcHJlc2VudGVyLgotCSAqIAotCSAqIEBwYXJhbSBjb2xvcgotCSAqICAgICAgICAgICAgdGhlIGh5cGVybGluayBjb2xvciwgdG8gYmUgZGlzcG9zZWQgYnkgdGhlIGNhbGxlcgotCSAqLwotCXB1YmxpYyBIaWdobGlnaHRlckh5cGVybGlua1ByZXNlbnRlcihDb2xvciBjb2xvcikgewotCQlmRGlzcG9zZUNvbG9yID0gZmFsc2U7Ci0JCWZDb2xvciA9IGNvbG9yOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblNob3dNdWx0aXBsZUh5cGVybGlua3MoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzaG93SHlwZXJsaW5rcyhJSHlwZXJsaW5rW10gaHlwZXJsaW5rcykgewotCQlBc3NlcnQuaXNMZWdhbChoeXBlcmxpbmtzICE9IG51bGwgJiYgaHlwZXJsaW5rcy5sZW5ndGggPT0gMSk7Ci0JCWhpZ2hsaWdodFJlZ2lvbihoeXBlcmxpbmtzWzBdLmdldEh5cGVybGlua1JlZ2lvbigpKTsKLQkJYWN0aXZhdGVDdXJzb3IoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBoaWRlSHlwZXJsaW5rcygpIHsKLQkJcmVwYWlyUmVwcmVzZW50YXRpb24oKTsKLQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5zdGFsbChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCUFzc2VydC5pc05vdE51bGwodGV4dFZpZXdlcik7Ci0JCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQkJZlRleHRWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmlzRGlzcG9zZWQoKSkgewotCQkJdGV4dC5hZGRQYWludExpc3RlbmVyKHRoaXMpOwotCQkJaWYgKGZQcmVmZXJlbmNlU3RvcmUgIT0gbnVsbCkKLQkJCQlmQ29sb3IgPSBjcmVhdGVDb2xvcihmUHJlZmVyZW5jZVN0b3JlLCBIWVBFUkxJTktfQ09MT1IsIHRleHQuZ2V0RGlzcGxheSgpKTsKLQkJfQotCi0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlmVGV4dFZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQotCQlpZiAoZkNvbG9yICE9IG51bGwpIHsKLQkJCWlmIChmRGlzcG9zZUNvbG9yKQotCQkJCWZDb2xvci5kaXNwb3NlKCk7Ci0JCQlmQ29sb3IgPSBudWxsOwotCQl9Ci0KLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCi0JCVN0eWxlZFRleHQgdGV4dCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgIT0gbnVsbCAmJiAhdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0LnJlbW92ZVBhaW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJZlRleHRWaWV3ZXIgPSBudWxsOwotCi0JCWlmIChmUHJlZmVyZW5jZVN0b3JlICE9IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3IoQ29sb3IgY29sb3IpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChmVGV4dFZpZXdlcik7Ci0JCWZDb2xvciA9IGNvbG9yOwotCX0KLQotCXByaXZhdGUgdm9pZCBoaWdobGlnaHRSZWdpb24oSVJlZ2lvbiByZWdpb24pIHsKLQotCQlpZiAocmVnaW9uLmVxdWFscyhmQWN0aXZlUmVnaW9uKSkKLQkJCXJldHVybjsKLQotCQlyZXBhaXJSZXByZXNlbnRhdGlvbigpOwotCi0JCVN0eWxlZFRleHQgdGV4dCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCi0JCS8vIFVuZGVybGluZQotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmIChmVGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKHJlZ2lvbik7Ci0JCQlpZiAod2lkZ2V0UmFuZ2UgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCW9mZnNldCA9IHdpZGdldFJhbmdlLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gd2lkZ2V0UmFuZ2UuZ2V0TGVuZ3RoKCk7Ci0KLQkJfQotCQllbHNlIHsKLQkJCW9mZnNldCA9IHJlZ2lvbi5nZXRPZmZzZXQoKSAtIGZUZXh0Vmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8vIG5lZWRzIHRvIGNsZWFuIGJhY2tncm91bmQgZHVlIHRvIFN0cnVjdHVyZWRUZXh0RWRpdG9yJ3MgaGlnaGxpZ2h0ZXIKLQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0KLQkJLy8gSW52YWxpZGF0ZSByZWdpb24gPT0+IGFwcGx5IHRleHQgcHJlc2VudGF0aW9uCi0JCWZBY3RpdmVSZWdpb24gPSByZWdpb247Ci0KLQkJaWYgKGZUZXh0Vmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb24yKQotCQkJKChJVGV4dFZpZXdlckV4dGVuc2lvbjIpIGZUZXh0Vmlld2VyKS5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbihyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCWVsc2UKLQkJCWZUZXh0Vmlld2VyLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFjdGl2YXRlQ3Vyc29yKCkgewotCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCQlpZiAoZkN1cnNvciA9PSBudWxsKQotCQkJZkN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9IQU5EKTsKLQkJdGV4dC5zZXRDdXJzb3IoZkN1cnNvcik7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q3Vyc29yKCkgewotCQlTdHlsZWRUZXh0IHRleHQgPSBmVGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwgJiYgIXRleHQuaXNEaXNwb3NlZCgpKQotCQkJdGV4dC5zZXRDdXJzb3IobnVsbCk7Ci0KLQkJaWYgKGZDdXJzb3IgIT0gbnVsbCkgewotCQkJZkN1cnNvci5kaXNwb3NlKCk7Ci0JCQlmQ3Vyc29yID0gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCByZXBhaXJSZXByZXNlbnRhdGlvbigpIHsKLQotCQlpZiAoZkFjdGl2ZVJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSBmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0KLQkJcmVzZXRDdXJzb3IoKTsKLQotCQkvLyBJbnZhbGlkYXRlID09PiByZW1vdmUgYXBwbGllZCB0ZXh0IHByZXNlbnRhdGlvbgotCQlpZiAoZlRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjIpCi0JCQkoKElUZXh0Vmlld2VyRXh0ZW5zaW9uMikgZlRleHRWaWV3ZXIpLmludmFsaWRhdGVUZXh0UHJlc2VudGF0aW9uKG9mZnNldCwgbGVuZ3RoKTsKLQkJZWxzZQotCQkJZlRleHRWaWV3ZXIuaW52YWxpZGF0ZVRleHRQcmVzZW50YXRpb24oKTsKLQotCQkvLyBSZW1vdmUgdW5kZXJsaW5lCi0JCWlmIChmVGV4dFZpZXdlciBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJb2Zmc2V0ID0gZXh0ZW5zaW9uLm1vZGVsT2Zmc2V0MldpZGdldE9mZnNldChvZmZzZXQpOwotCQl9Ci0JCWVsc2UgewotCQkJb2Zmc2V0IC09IGZUZXh0Vmlld2VyLmdldFZpc2libGVSZWdpb24oKS5nZXRPZmZzZXQoKTsKLQkJfQotCQl0cnkgewotCQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCi0JCQkvLyBuZWVkcyB0byBjbGVhbiBiYWNrZ3JvdW5kIGR1ZSB0byBTdHJ1Y3R1cmVkVGV4dEVkaXRvcidzCi0JCQkvLyBoaWdobGlnaHRlcgotCQkJdGV4dC5yZWRyYXdSYW5nZShvZmZzZXQsIGxlbmd0aCwgdHJ1ZSk7Ci0KLQkJfQotCQljYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsKLQkJCS8vIGlnbm9yZSAtIGRvIG5vdCBsb2cKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBQYWludExpc3RlbmVyI3BhaW50Q29udHJvbChQYWludEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHBhaW50Q29udHJvbChQYWludEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQWN0aXZlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gZlRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCWludCBvZmZzZXQgPSAwOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAoZlRleHRWaWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIGZUZXh0Vmlld2VyOwotCQkJSVJlZ2lvbiB3aWRnZXRSYW5nZSA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKGZBY3RpdmVSZWdpb24pOwotCQkJaWYgKHdpZGdldFJhbmdlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvZmZzZXQgPSB3aWRnZXRSYW5nZS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHdpZGdldFJhbmdlLmdldExlbmd0aCgpOwotCi0JCX0KLQkJZWxzZSB7Ci0KLQkJCUlSZWdpb24gcmVnaW9uID0gZlRleHRWaWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJaWYgKCFpbmNsdWRlcyhyZWdpb24sIGZBY3RpdmVSZWdpb24pKQotCQkJCXJldHVybjsKLQotCQkJb2Zmc2V0ID0gZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSAtIHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IGZBY3RpdmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCX0KLQotCQkvLyBzdXBwb3J0IGZvciBCSURJCi0JCVBvaW50IG1pbkxvY2F0aW9uID0gZ2V0TWluaW11bUxvY2F0aW9uKHRleHQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJUG9pbnQgbWF4TG9jYXRpb24gPSBnZXRNYXhpbXVtTG9jYXRpb24odGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotCi0JCWludCB4MSA9IG1pbkxvY2F0aW9uLng7Ci0JCWludCB4MiA9IG1heExvY2F0aW9uLnggLSAxOwotCQlpbnQgeSA9IG1pbkxvY2F0aW9uLnkgKyB0ZXh0LmdldExpbmVIZWlnaHQoKSAtIDE7Ci0KLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJaWYgKGZDb2xvciAhPSBudWxsICYmICFmQ29sb3IuaXNEaXNwb3NlZCgpKQotCQkJZ2Muc2V0Rm9yZWdyb3VuZChmQ29sb3IpOwotCQllbHNlIGlmIChmQ29sb3IgPT0gbnVsbCAmJiAhKG9mZnNldCA8IDAgJiYgb2Zmc2V0ID49IHRleHQuZ2V0Q2hhckNvdW50KCkpKSB7Ci0JCQlTdHlsZVJhbmdlIHN0eWxlID0gdGV4dC5nZXRTdHlsZVJhbmdlQXRPZmZzZXQob2Zmc2V0KTsKLQkJCWlmIChzdHlsZSAhPSBudWxsKQotCQkJCWdjLnNldEZvcmVncm91bmQoc3R5bGUuZm9yZWdyb3VuZCk7Ci0JCX0KLQkJZ2MuZHJhd0xpbmUoeDEsIHksIHgyLCB5KTsKLQl9Ci0KLQlwcml2YXRlIFBvaW50IGdldE1pbmltdW1Mb2NhdGlvbihTdHlsZWRUZXh0IHRleHQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IG1heCA9IHRleHQuZ2V0Q2hhckNvdW50KCk7Ci0JCVJlY3RhbmdsZSBib3VuZHMgPSB0ZXh0LmdldEJvdW5kcygpOwotCQlQb2ludCBtaW5Mb2NhdGlvbiA9IG5ldyBQb2ludChib3VuZHMud2lkdGgsIGJvdW5kcy5oZWlnaHQpOwotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJaW50IGsgPSBvZmZzZXQgKyBpOwotCQkJaWYgKGsgPCAwIHx8IGsgPiBtYXgpCi0JCQkJYnJlYWs7Ci0KLQkJCVBvaW50IGxvY2F0aW9uID0gdGV4dC5nZXRMb2NhdGlvbkF0T2Zmc2V0KGspOwotCQkJaWYgKGxvY2F0aW9uLnggPCBtaW5Mb2NhdGlvbi54KQotCQkJCW1pbkxvY2F0aW9uLnggPSBsb2NhdGlvbi54OwotCQkJaWYgKGxvY2F0aW9uLnkgPCBtaW5Mb2NhdGlvbi55KQotCQkJCW1pbkxvY2F0aW9uLnkgPSBsb2NhdGlvbi55OwotCQl9Ci0KLQkJcmV0dXJuIG1pbkxvY2F0aW9uOwotCX0KLQotCXByaXZhdGUgUG9pbnQgZ2V0TWF4aW11bUxvY2F0aW9uKFN0eWxlZFRleHQgdGV4dCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlQb2ludCBtYXhMb2NhdGlvbiA9IG5ldyBQb2ludCgwLCAwKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8PSBsZW5ndGg7IGkrKykgewotCQkJaW50IGsgPSBvZmZzZXQgKyBpOwotCQkJaWYgKGsgPCAwIHx8IGsgPiB0ZXh0LmdldENoYXJDb3VudCgpKQotCQkJCWJyZWFrOwotCi0JCQlQb2ludCBsb2NhdGlvbiA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldChrKTsKLQkJCWlmIChsb2NhdGlvbi54ID4gbWF4TG9jYXRpb24ueCkKLQkJCQltYXhMb2NhdGlvbi54ID0gbG9jYXRpb24ueDsKLQkJCWlmIChsb2NhdGlvbi55ID4gbWF4TG9jYXRpb24ueSkKLQkJCQltYXhMb2NhdGlvbi55ID0gbG9jYXRpb24ueTsKLQkJfQotCi0JCXJldHVybiBtYXhMb2NhdGlvbjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaW5jbHVkZXMoSVJlZ2lvbiByZWdpb24sIElSZWdpb24gcG9zaXRpb24pIHsKLQkJcmV0dXJuIHBvc2l0aW9uLmdldE9mZnNldCgpID49IHJlZ2lvbi5nZXRPZmZzZXQoKSAmJiBwb3NpdGlvbi5nZXRPZmZzZXQoKSArIHBvc2l0aW9uLmdldExlbmd0aCgpIDw9IHJlZ2lvbi5nZXRPZmZzZXQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGRvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCWlmIChmQWN0aXZlUmVnaW9uICE9IG51bGwpIHsKLQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBuZXcgUG9zaXRpb24oZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKSwgZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQl0cnkgewotCQkJCWV2ZW50LmdldERvY3VtZW50KCkuYWRkUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZlJlbWVtYmVyZWRQb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAoIWZSZW1lbWJlcmVkUG9zaXRpb24uaXNEZWxldGVkKCkpIHsKLQotCQkJCWV2ZW50LmdldERvY3VtZW50KCkucmVtb3ZlUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQkJZkFjdGl2ZVJlZ2lvbiA9IG5ldyBSZWdpb24oZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRPZmZzZXQoKSwgZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0KLQkJCQlTdHlsZWRUZXh0IHdpZGdldCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCQlpZiAod2lkZ2V0ICE9IG51bGwgJiYgIXdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJd2lkZ2V0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCWhpZGVIeXBlcmxpbmtzKCk7Ci0JCQkJCQl9Ci0JCQkJCX0pOwotCQkJCX0KLQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JCQkJaGlkZUh5cGVybGlua3MoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChvbGRJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQloaWRlSHlwZXJsaW5rcygpOwotCQlvbGRJbnB1dC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lciNpbnB1dERvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCWlmIChuZXdJbnB1dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQluZXdJbnB1dC5hZGREb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBjb2xvciBmcm9tIHRoZSBpbmZvcm1hdGlvbiBzdG9yZWQgaW4gdGhlIGdpdmVuIHByZWZlcmVuY2UKLQkgKiBzdG9yZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3RvcmUKLQkgKiAgICAgICAgICAgIHRoZSBwcmVmZXJlbmNlIHN0b3JlCi0JICogQHBhcmFtIGtleQotCSAqICAgICAgICAgICAgdGhlIGtleQotCSAqIEBwYXJhbSBkaXNwbGF5Ci0JICogICAgICAgICAgICB0aGUgZGlzcGxheQotCSAqIEByZXR1cm4gdGhlIGNvbG9yIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2gKLQkgKiAgICAgICAgIGluZm9ybWF0aW9uIGF2YWlsYWJsZQotCSAqLwotCXByaXZhdGUgQ29sb3IgY3JlYXRlQ29sb3IoSVByZWZlcmVuY2VTdG9yZSBzdG9yZSwgU3RyaW5nIGtleSwgRGlzcGxheSBkaXNwbGF5KSB7Ci0KLQkJUkdCIHJnYiA9IG51bGw7Ci0KLQkJaWYgKHN0b3JlLmNvbnRhaW5zKGtleSkpIHsKLQotCQkJaWYgKHN0b3JlLmlzRGVmYXVsdChrZXkpKQotCQkJCXJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0RGVmYXVsdENvbG9yKHN0b3JlLCBrZXkpOwotCQkJZWxzZQotCQkJCXJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3Ioc3RvcmUsIGtleSk7Ci0KLQkJCWlmIChyZ2IgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IENvbG9yKGRpc3BsYXksIHJnYik7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlpZiAoIUhZUEVSTElOS19DT0xPUi5lcXVhbHMoZXZlbnQuZ2V0UHJvcGVydHkoKSkpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGZEaXNwb3NlQ29sb3IgJiYgZkNvbG9yICE9IG51bGwgJiYgIWZDb2xvci5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ29sb3IuZGlzcG9zZSgpOwotCQlmQ29sb3IgPSBudWxsOwotCi0JCVN0eWxlZFRleHQgdGV4dFdpZGdldCA9IGZUZXh0Vmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpCi0JCQlmQ29sb3IgPSBjcmVhdGVDb2xvcihmUHJlZmVyZW5jZVN0b3JlLCBIWVBFUkxJTktfQ09MT1IsIHRleHRXaWRnZXQuZ2V0RGlzcGxheSgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL09wZW5IeXBlcmxpbmtBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvT3Blbkh5cGVybGlua0FjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTk0NTIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9oeXBlcmxpbmsvT3Blbkh5cGVybGlua0FjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSUh5cGVybGluazsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UZXh0RWRpdG9yQWN0aW9uOwotCi0vKioKLSAqIE9wZW4gaHlwZXJsaW5rIGFjdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbkh5cGVybGlua0FjdGlvbiBleHRlbmRzIFRleHRFZGl0b3JBY3Rpb24gewotCXByaXZhdGUgSUh5cGVybGlua0RldGVjdG9yW10gZkh5cGVybGlua0RldGVjdG9yczsKLQlwcml2YXRlIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyOwotCi0JcHVibGljIE9wZW5IeXBlcmxpbmtBY3Rpb24oUmVzb3VyY2VCdW5kbGUgYnVuZGxlLCBTdHJpbmcgcHJlZml4LCBJVGV4dEVkaXRvciBlZGl0b3IsIElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlzdXBlcihidW5kbGUsIHByZWZpeCwgZWRpdG9yKTsKLQkJZlRleHRWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SHlwZXJsaW5rRGV0ZWN0b3JzKElIeXBlcmxpbmtEZXRlY3RvcltdIGRldGVjdG9ycykgewotCQlmSHlwZXJsaW5rRGV0ZWN0b3JzID0gZGV0ZWN0b3JzOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJaWYgKGZIeXBlcmxpbmtEZXRlY3RvcnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiA9PSBudWxsIHx8ICEoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCUlSZWdpb24gcmVnaW9uID0gbmV3IFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJSUh5cGVybGluayBoeXBlcmxpbmsgPSBudWxsOwotCi0JCXN5bmNocm9uaXplZCAoZkh5cGVybGlua0RldGVjdG9ycykgewotCQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGZIeXBlcmxpbmtEZXRlY3RvcnMubGVuZ3RoOyBpIDwgbGVuZ3RoICYmIGh5cGVybGluayA9PSBudWxsOyBpKyspIHsKLQkJCQlJSHlwZXJsaW5rRGV0ZWN0b3IgZGV0ZWN0b3IgPSBmSHlwZXJsaW5rRGV0ZWN0b3JzW2ldOwotCQkJCWlmIChkZXRlY3RvciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQotCQkJCUlIeXBlcmxpbmtbXSBoeXBlcmxpbmtzID0gZGV0ZWN0b3IuZGV0ZWN0SHlwZXJsaW5rcyhmVGV4dFZpZXdlciwgcmVnaW9uLCBmYWxzZSk7Ci0JCQkJaWYgKGh5cGVybGlua3MgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlpZiAoaHlwZXJsaW5rcy5sZW5ndGggPiAwKQotCQkJCQloeXBlcmxpbmsgPSBoeXBlcmxpbmtzWzBdOwotCQkJfQotCQl9Ci0JCWlmIChoeXBlcmxpbmsgIT0gbnVsbCkgewotCQkJLyoqCi0JCQkgKiBGb3JjZSB0aGUgaGlnaGxpZ2h0IHJhbmdlIHRvIGNoYW5nZSB3aGVuIHRoZSBoeXBlcmxpbmsgaXMKLQkJCSAqIG9wZW5lZCBieSBhbHRlcmluZyB0aGUgaGlnaGxpZ2h0ZWQgcmFuZ2UgYmVmb3JlaGFuZC4KLQkJCSAqLwotCQkJZ2V0VGV4dEVkaXRvcigpLnNldEhpZ2hsaWdodFJhbmdlKE1hdGgubWF4KDAsIHJlZ2lvbi5nZXRPZmZzZXQoKSAtIDEpLCAwLCBmYWxzZSk7Ci0JCQloeXBlcmxpbmsub3BlbigpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9BYnN0cmFjdE9wZW5Pbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9BYnN0cmFjdE9wZW5Pbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDU5YzQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vQWJzdHJhY3RPcGVuT24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QucHJvZ3JhbS5Qcm9ncmFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QYXJ0SW5pdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLlBsYXRmb3JtU3RhdHVzTGluZVV0aWw7Ci0KLQotLyoqCi0gKiBUaGlzIGFjdGlvbiBjbGFzcyByZXRyaWV2ZXMgdGhlIGxpbmsvZmlsZSBzZWxlY3RlZCBieSB0aGUgY3Vyc29yIGFuZAotICogYXR0ZW1wdHMgdG8gb3BlbiB0aGUgbGluay9maWxlIGluIHRoZSBkZWZhdWx0IGVkaXRvciBvciB3ZWIgYnJvd3NlcgotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RPcGVuT24gaW1wbGVtZW50cyBJT3Blbk9uIHsKLQlwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIENBTk5PVF9PUEVOID0gU1NFVUlNZXNzYWdlcy5BYnN0cmFjdE9wZW5Pbl8wOyAvLyROT04tTkxTLTEkCi0JLy8gZG9jdW1lbnQgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCBvcGVuCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTCA9ICJmaWxlOi8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQotCWFic3RyYWN0IHByb3RlY3RlZCBJUmVnaW9uIGRvR2V0T3Blbk9uUmVnaW9uKGludCBvZmZzZXQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgZG9PcGVuT24oSVJlZ2lvbiByZWdpb24pOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudCBhc3NvY2lhdGVkIHdpdGggb3BlbiBvbgotCSAqIAotCSAqIEByZXR1cm4gSURvY3VtZW50Ci0JICovCi0JcHVibGljIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHRoZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmaWxlIG5hbWUKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZW5hbWUKLQkgKiBAcmV0dXJuIGVkaXRvciBpZCBvZiB0aGUgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gZmlsZSBuYW1lCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RWRpdG9ySWQoU3RyaW5nIGZpbGVuYW1lKSB7Ci0JCUlXb3JrYmVuY2ggd29ya2JlbmNoID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKTsKLQkJSUVkaXRvclJlZ2lzdHJ5IGVkaXRvclJlZ2lzdHJ5ID0gd29ya2JlbmNoLmdldEVkaXRvclJlZ2lzdHJ5KCk7Ci0JCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBlZGl0b3JSZWdpc3RyeS5nZXREZWZhdWx0RWRpdG9yKGZpbGVuYW1lKTsKLQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBkZXNjcmlwdG9yLmdldElkKCk7Ci0JCXJldHVybiBFZGl0b3JzVUkuREVGQVVMVF9URVhUX0VESVRPUl9JRDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIElGaWxlIGZyb20gdGhlIGdpdmVuIHVyaSBpZiBwb3NzaWJsZSwgbnVsbCBpZiBjYW5ub3QgZmluZAotCSAqIGZpbGUgZnJvbSB1cmkuCi0JICogCi0JICogQHBhcmFtIGZpbGVTdHJpbmcKLQkgKiAgICAgICAgICAgIGZpbGUgc3lzdGVtIHBhdGgKLQkgKiBAcmV0dXJuIHJldHVybnMgSUZpbGUgaWYgZmlsZVN0cmluZyBleGlzdHMgaW4gdGhlIHdvcmtzcGFjZQotCSAqLwotCXByb3RlY3RlZCBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJLy8gdXNlIHRoZSBiYXNlIGxvY2F0aW9uIHRvIG9idGFpbiB0aGUgaW4td29ya3NwYWNlIElGaWxlCi0JCQkJSUZpbGUgbW9kZWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKG1vZGVsLmdldEJhc2VMb2NhdGlvbigpKSk7Ci0JCQkJaWYgKG1vZGVsRmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIGZpbmQgdGhlIHJlZmVyZW5jZWQgZmlsZSdzIGxvY2F0aW9uIG9uIGRpc2sKLQkJCQkJVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCQlpZiAocmVzb2x2ZXIgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIGZpbGVzeXN0ZW1Mb2NhdGlvbiA9IHJlc29sdmVyLmdldExvY2F0aW9uQnlVUkkoZmlsZVN0cmluZyk7Ci0JCQkJCQlpZiAoZmlsZXN5c3RlbUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJCQlJRmlsZVtdIHdvcmtzcGFjZUZpbGVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5maW5kRmlsZXNGb3JMb2NhdGlvbihuZXcgUGF0aChmaWxlc3lzdGVtTG9jYXRpb24pKTsKLQkJCQkJCQkvLyBmYXZvciBhIHdvcmtzcGFjZSBmaWxlIGluIHRoZSBzYW1lIHByb2plY3QKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHdvcmtzcGFjZUZpbGVzLmxlbmd0aCAmJiBmaWxlID09IG51bGw7IGkrKykgewotCQkJCQkJCQlpZiAod29ya3NwYWNlRmlsZXNbaV0uZ2V0UHJvamVjdCgpLmVxdWFscyhtb2RlbEZpbGUuZ2V0UHJvamVjdCgpKSkgewotCQkJCQkJCQkJZmlsZSA9IHdvcmtzcGFjZUZpbGVzW2ldOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCS8vIGlmIG5vbmUgd2VyZSBpbiB0aGUgc2FtZSBwcm9qZWN0LCBqdXN0IHBpY2sgb25lCi0JCQkJCQkJaWYgKGZpbGUgPT0gbnVsbCAmJiB3b3Jrc3BhY2VGaWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWZpbGUgPSB3b3Jrc3BhY2VGaWxlc1swXTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCWlmIChmaWxlID09IG51bGwgJiYgZmlsZVN0cmluZy5zdGFydHNXaXRoKCIvIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChmaWxlU3RyaW5nKSk7Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLklPcGVuT24jZ2V0T3Blbk9uUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldE9wZW5PblJlZ2lvbihJRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0KSB7Ci0JCUlSZWdpb24gcmVnaW9uOwotCQkvLyBzZXQgdGhlIGRvY3VtZW50IGZvciB0aGlzIGFjdGlvbgotCQlzZXREb2N1bWVudChkb2MpOwotCQlyZWdpb24gPSBkb0dldE9wZW5PblJlZ2lvbihvZmZzZXQpOwotCQkvLyByZXNldCB0aGUgZG9jdW1lbnQgYmFjayB0byBudWxsIGZvciB0aGlzIGFjdGlvbgotCQlzZXREb2N1bWVudChudWxsKTsKLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBUcnkgdG8gb3BlbiB0aGUgZXh0ZXJuYWwgZmlsZSwgZmlsZVN0cmluZyBpbiBpdHMgZGVmYXVsdCBlZGl0b3IKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqIEByZXR1cm4gSUVkaXRvclBhcnQgZWRpdG9yIG9wZW5lZCBvciBudWxsIGlmIGVkaXRvciBjb3VsZCBub3QgYmUgb3BlbmVkCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG9wZW5FeHRlcm5hbEZpbGUoU3RyaW5nIGZpbGVTdHJpbmcpIHsKLQkJLy8gZmlsZSBkb2VzIG5vdCBleGlzdCBpbiB3b3Jrc3BhY2Ugc28gdHJ5IHRvIG9wZW4gdXNpbmcgc3lzdGVtIGVkaXRvcgotCQlGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlU3RyaW5nKTsKLQkJLy8gdHJ5IHRvIG9wZW4gZXhpc3RpbmcgZXh0ZXJuYWwgZmlsZSBpZiBpdCBleGlzdHMKLQkJaWYgKGZpbGUuZXhpc3RzKCkpIHsKLQkJCUlFZGl0b3JJbnB1dCBpbnB1dCA9IG5ldyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChmaWxlKTsKLQkJCVN0cmluZyBlZGl0b3JJZCA9IGdldEVkaXRvcklkKGZpbGVTdHJpbmcpOwotCi0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlyZXR1cm4gcGFnZS5vcGVuRWRpdG9yKGlucHV0LCBlZGl0b3JJZCwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyB1c2VyIHRoYXQgb3BlbiBvbiBzZWxlY3Rpb24gYWN0aW9uIGNvdWxkIG5vdCBzdWNjZXNzZnVsbHkgb3BlbgotCSAqIHRoZSBzZWxlY3Rpb24gKHdyaXRlcyBtZXNzYWdlIG9uIHN0YXR1cyBiYXIgYW5kIGJlZXBzKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG9wZW5GaWxlRmFpbGVkKCkgewotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoQ0FOTk9UX09QRU4pOwotCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogT3BlbnMgdGhlIElGaWxlLCBpbnB1dCBpbiBpdHMgZGVmYXVsdCBlZGl0b3IsIGlmIHBvc3NpYmxlLCBhbmQgcmV0dXJucwotCSAqIHRoZSBlZGl0b3Igb3BlbmVkLiBQb3NzaWJsZSByZWFzb25zIGZvciBmYWlsdXJlOiBpbnB1dCBjYW5ub3QgYmUgZm91bmQsCi0JICogaW5wdXQgZG9lcyBub3QgZXhpc3QgaW4gd29ya2JlbmNoLCBlZGl0b3IgY2Fubm90IGJlIG9wZW5lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIElFZGl0b3JQYXJ0IGVkaXRvciBvcGVuZWQgb3IgbnVsbCBpZiBpbnB1dCA9PSBudWxsIG9yIGRvZXMgbm90Ci0JICogICAgICAgICBleGlzdCwgZXh0ZXJuYWwgZWRpdG9yIHdhcyBvcGVuZWQsIGVkaXRvciBjb3VsZCBub3QgYmUgb3BlbmVkCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JQYXJ0IG9wZW5GaWxlSW5FZGl0b3IoSUZpbGUgaW5wdXQpIHsKLQkJaWYgKGlucHV0ICE9IG51bGwgJiYgaW5wdXQuZXhpc3RzKCkpIHsKLQkJCXRyeSB7Ci0JCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCXJldHVybiBJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgdHJ1ZSk7Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvLyBvbgotCi0JLyoqCi0JICogT3BlbnMgdGhlIGFwcHJvcHJpYXRlIGVkaXRvciBmb3IgZmlsZVN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBmaWxlU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgb3BlbkZpbGVJbkVkaXRvcihTdHJpbmcgZmlsZVN0cmluZykgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQlpZiAoZmlsZVN0cmluZyAhPSBudWxsKSB7Ci0JCQkvLyBvcGVuIHdlYiBicm93c2VyIGlmIHRoaXMgaXMgYSB3ZWIgYWRkcmVzcwotCQkJU3RyaW5nIHRlbXAgPSBmaWxlU3RyaW5nLnRvTG93ZXJDYXNlKCk7Ci0JCQlpZiAodGVtcC5zdGFydHNXaXRoKEhUVFBfUFJPVE9DT0wpKSB7Ci0JCQkJUHJvZ3JhbS5sYXVuY2goZmlsZVN0cmluZyk7IC8vIGxhdW5jaGVzIHdlYiBicm93c2VyL2V4ZWN1dGFibGUKLQkJCQkvLyBhc3NvY2lhdGVkIHdpdGggdXJpCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJLy8gY2hvcCBvZmYgdGhlIGZpbGUgcHJvdG9jb2wKLQkJCWlmICh0ZW1wLnN0YXJ0c1dpdGgoRklMRV9QUk9UT0NPTCkpIHsKLQkJCQlmaWxlU3RyaW5nID0gZmlsZVN0cmluZy5zdWJzdHJpbmcoRklMRV9QUk9UT0NPTC5sZW5ndGgoKSk7Ci0JCQl9Ci0KLQkJCS8vIHRyeSB0byBsb2NhdGUgdGhlIGZpbGUgaW4gdGhlIHdvcmtzcGFjZSBhbmQgcmV0dXJuIGFuIElGaWxlIGlmCi0JCQkvLyBmb3VuZAotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZmlsZVN0cmluZyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJLy8gZmlsZSBleGlzdHMgaW4gd29ya3NwYWNlCi0JCQkJZWRpdG9yID0gb3BlbkZpbGVJbkVkaXRvcihmaWxlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGZpbGUgZG9lcyBub3QgZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJZWRpdG9yID0gb3BlbkV4dGVybmFsRmlsZShmaWxlU3RyaW5nKTsKLQkJCX0KLQkJfQotCQkvLyBubyBlZGl0b3Igd2FzIG9wZW5lZAotCQlpZiAoZWRpdG9yID09IG51bGwpIHsKLQkJCW9wZW5GaWxlRmFpbGVkKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSU9wZW5PbiNvcGVuT24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgb3Blbk9uKElEb2N1bWVudCBkb2MsIElSZWdpb24gcmVnaW9uKSB7Ci0JCS8vIHNldCB0aGUgZG9jdW1lbnQgZm9yIHRoaXMgYWN0aW9uCi0JCXNldERvY3VtZW50KGRvYyk7Ci0JCS8vIGlmIG5vIHJlZ2lvbiB3YXMgZ2l2ZW4gdGhpcyBhY3Rpb24gZmFpbHMKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJb3BlbkZpbGVGYWlsZWQoKTsKLQkJZWxzZQotCQkJZG9PcGVuT24ocmVnaW9uKTsKLQkJLy8gcmVzZXQgdGhlIGRvY3VtZW50IGJhY2sgdG8gbnVsbCBmb3IgdGhpcyBhY3Rpb24KLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBjdXJyZW50IGRvY3VtZW50IGFzc29jaWF0ZWQgd2l0aCBvcGVuIG9uCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThlYjY1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGVyc2lzdGFibGVFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5JTG9jYXRpb25Qcm92aWRlcjsKLQotLyoqCi0gKiBFZGl0b3JJbnB1dCBmb3IgZXh0ZXJuYWwgZmlsZXMuIENvcGllZCBmcm9tCi0gKiBvcmcuZWNsaXBzZS51aS5pbnRlcm5hbC5lZGl0b3JzLnRleHQuSmF2YUZpbGVFZGl0b3JJbnB1dAotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW1wbGVtZW50cyBJRWRpdG9ySW5wdXQsIElMb2NhdGlvblByb3ZpZGVyIHsKLQotCXByaXZhdGUgRmlsZSBmRmlsZTsKLQotCXB1YmxpYyBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dChGaWxlIGZpbGUpIHsKLQkJc3VwZXIoKTsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotCQlpZiAobyA9PSB0aGlzKQotCQkJcmV0dXJuIHRydWU7Ci0KLQkJaWYgKG8gaW5zdGFuY2VvZiBFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgewotCQkJRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgaW5wdXQgPSAoRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIG87Ci0JCQlyZXR1cm4gZkZpbGUuZXF1YWxzKGlucHV0LmZGaWxlKTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2V4aXN0cygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gZXhpc3RzKCkgewotCQlyZXR1cm4gZkZpbGUuZXhpc3RzKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJTG9jYXRpb25Qcm92aWRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gdGhpczsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuSUxvY2F0aW9uUHJvdmlkZXIjZ2V0UGF0aChqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJUGF0aCBnZXRQYXRoKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBlbGVtZW50OwotCQkJcmV0dXJuIG5ldyBQYXRoKGlucHV0LmZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFBlcnNpc3RhYmxlKCkKLQkgKi8KLQlwdWJsaWMgSVBlcnNpc3RhYmxlRWxlbWVudCBnZXRQZXJzaXN0YWJsZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dCNnZXRUb29sVGlwVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUb29sVGlwVGV4dCgpIHsKLQkJcmV0dXJuIGZGaWxlLmdldEFic29sdXRlUGF0aCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2hhc2hDb2RlKCkKLQkgKi8KLQlwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotCQlyZXR1cm4gZkZpbGUuaGFzaENvZGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL0lPcGVuT24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vSU9wZW5Pbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzRiMjkyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vSU9wZW5Pbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIE9wZW4gT24uLi4gbmF2aWdhdGlvbgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU9wZW5PbiB7Ci0JLyoqCi0JICogUmV0dXJucyB0aGUgZW50aXJlIHJlZ2lvbiByZWxldmFudCB0byB0aGUgY3VycmVudCBvZmZzZXQgd2hlcmUgYW4KLQkgKiBvcGVuYWJsZSBzb3VyY2UgcmVnaW9uIGlzIGZvdW5kLiBudWxsIGlmIG9mZnNldCBkb2VzIG5vdCBjb250YWluIGFuCi0JICogb3BlbmFibGUgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqICAgICAgICAgICAgSURvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHJldHVybiBJUmVnaW9uIGVudGlyZSByZWdpb24gb2Ygb3BlbmFibGUgc291cmNlCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0T3Blbk9uUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCk7Ci0KLQkvKioKLQkgKiBPcGVucyB0aGUgZmlsZS9zb3VyY2UgcmVsZXZhbnQgdG8gcmVnaW9uIGlmIHBvc3NpYmxlLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIElUZXh0Vmlld2VyCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqICAgICAgICAgICAgUmVnaW9uIHRvIGV4YW1pbmUKLQkgKi8KLQlwdWJsaWMgdm9pZCBvcGVuT24oSURvY3VtZW50IGRvY3VtZW50LCBJUmVnaW9uIHJlZ2lvbik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5GaWxlSHlwZXJsaW5rVHJhY2tlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuRmlsZUh5cGVybGlua1RyYWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRlODY1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5GaWxlSHlwZXJsaW5rVHJhY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5vcGVub247Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyRXh0ZW5zaW9uNTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZWRUZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlBhaW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ3Vyc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci0KLQotLyoqCi0gKiBAZGVwcmVjYXRlZCBVc2Ugb3JnLmVjbGlwc2UuamZhY2UudGV4dC5oeXBlcmxpbmsuSHlwZXJsaW5rTWFuYWdlcgotICovCi1wdWJsaWMgY2xhc3MgT3BlbkZpbGVIeXBlcmxpbmtUcmFja2VyIGltcGxlbWVudHMgS2V5TGlzdGVuZXIsIE1vdXNlTGlzdGVuZXIsIE1vdXNlTW92ZUxpc3RlbmVyLCBGb2N1c0xpc3RlbmVyLCBQYWludExpc3RlbmVyLCBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciwgSURvY3VtZW50TGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0KLQkvKiogVGhlIHNlc3Npb24gaXMgYWN0aXZlLiAqLwotCXByaXZhdGUgYm9vbGVhbiBmQWN0aXZlOwotCi0JLyoqIFRoZSBjdXJyZW50bHkgYWN0aXZlIHN0eWxlIHJhbmdlLiAqLwotCXByaXZhdGUgSVJlZ2lvbiBmQWN0aXZlUmVnaW9uOwotCS8qKiBQcmVmZXJlbmNlIGtleSBmb3IgYnJvd3Nlci1saWtlIGxpbmtzIHRvIGJlIGVuYWJsZWQgKi8KLQlwcml2YXRlIFN0cmluZyBmQnJvd3Nlckxpa2VMaW5rc0tleU1vZGlmaWVyS2V5OwotCi0JLyoqIFRoZSBsaW5rIGNvbG9yLiAqLwotCXByaXZhdGUgQ29sb3IgZkNvbG9yOwotCS8qKiBUaGUgaGFuZCBjdXJzb3IuICovCi0JcHJpdmF0ZSBDdXJzb3IgZkN1cnNvcjsKLQkvKiogVGhlIGtleSBtb2RpZmllciBtYXNrLiAqLwotCXByaXZhdGUgaW50IGZLZXlNb2RpZmllck1hc2s7Ci0JLyoqIFByZWZlcmVuY2Uga2V5IGZvciBoeXBlcmxpbmsgdW5kZXJsaW5lIGNvbG9yICovCi0JcHJpdmF0ZSBTdHJpbmcgZkxpbmtDb2xvcktleTsKLQkvKiogVGhlIHByZWZlcmVuY2Ugc3RvcmUgKi8KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZTsKLQkvKiogVGhlIGN1cnJlbnRseSBhY3RpdmUgc3R5bGUgcmFuZ2UgYXMgcG9zaXRpb24uICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBmUmVtZW1iZXJlZFBvc2l0aW9uOwotCi0JLyoqIFRoZSB0ZXh0IHZpZXdlciB0aGlzIGh5cGVybGluayB0cmFja2VyIGlzIGFzc29jaWF0ZWQgd2l0aCAqLwotCXByaXZhdGUgSVRleHRWaWV3ZXIgZlRleHRWaWV3ZXI7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIE9wZW5GaWxlSHlwZXJsaW5rVHJhY2tlcihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgYWN0aXZhdGVDdXJzb3IoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0JCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCQlpZiAoZkN1cnNvciA9PSBudWxsKQotCQkJZkN1cnNvciA9IG5ldyBDdXJzb3IoZGlzcGxheSwgU1dULkNVUlNPUl9IQU5EKTsKLQkJdGV4dC5zZXRDdXJzb3IoZkN1cnNvcik7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgY29tcHV0ZVN0YXRlTWFzayhTdHJpbmcgbW9kaWZpZXJzKSB7Ci0JCWlmIChtb2RpZmllcnMgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsKLQotCQlpZiAobW9kaWZpZXJzLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gU1dULk5PTkU7Ci0KLQkJaW50IHN0YXRlTWFzayA9IDA7Ci0JCVN0cmluZ1Rva2VuaXplciBtb2RpZmllclRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobW9kaWZpZXJzLCAiLDsuOistKiAiKTsgLy8kTk9OLU5MUy0xJAotCQl3aGlsZSAobW9kaWZpZXJUb2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlpbnQgbW9kaWZpZXIgPSBFZGl0b3JVdGlsaXR5LmZpbmRMb2NhbGl6ZWRNb2RpZmllcihtb2RpZmllclRva2VuaXplci5uZXh0VG9rZW4oKSk7Ci0JCQlpZiAobW9kaWZpZXIgPT0gMCB8fCAoc3RhdGVNYXNrICYgbW9kaWZpZXIpID09IG1vZGlmaWVyKQotCQkJCXJldHVybiAtMTsKLQkJCXN0YXRlTWFzayA9IHN0YXRlTWFzayB8IG1vZGlmaWVyOwotCQl9Ci0JCXJldHVybiBzdGF0ZU1hc2s7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbG9yIGZyb20gdGhlIGluZm9ybWF0aW9uIHN0b3JlZCBpbiB0aGUgZ2l2ZW4gcHJlZmVyZW5jZQotCSAqIHN0b3JlLiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5mb3JtYXRpb24KLQkgKiBhdmFpbGFibGUuCi0JICovCi0JcHJpdmF0ZSBDb2xvciBjcmVhdGVDb2xvcihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcga2V5LCBEaXNwbGF5IGRpc3BsYXkpIHsKLQotCQlSR0IgcmdiID0gbnVsbDsKLQotCQlpZiAoc3RvcmUuY29udGFpbnMoa2V5KSkgewotCi0JCQlpZiAoc3RvcmUuaXNEZWZhdWx0KGtleSkpCi0JCQkJcmdiID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXREZWZhdWx0Q29sb3Ioc3RvcmUsIGtleSk7Ci0JCQllbHNlCi0JCQkJcmdiID0gUHJlZmVyZW5jZUNvbnZlcnRlci5nZXRDb2xvcihzdG9yZSwga2V5KTsKLQkJfQotCi0JCXJldHVybiBFZGl0b3JVdGlsaXR5LmdldENvbG9yKHJnYik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZSgpIHsKLQkJZGVhY3RpdmF0ZShmYWxzZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGVhY3RpdmF0ZShib29sZWFuIHJlZHJhd0FsbCkgewotCQlpZiAoIWZBY3RpdmUpCi0JCQlyZXR1cm47Ci0KLQkJcmVwYWlyUmVwcmVzZW50YXRpb24ocmVkcmF3QWxsKTsKLQkJZkFjdGl2ZSA9IGZhbHNlOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZBY3RpdmUgJiYgZkFjdGl2ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlmUmVtZW1iZXJlZFBvc2l0aW9uID0gbmV3IFBvc2l0aW9uKGZBY3RpdmVSZWdpb24uZ2V0T2Zmc2V0KCksIGZBY3RpdmVSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJdHJ5IHsKLQkJCQlldmVudC5nZXREb2N1bWVudCgpLmFkZFBvc2l0aW9uKGZSZW1lbWJlcmVkUG9zaXRpb24pOwotCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkgewotCQkJCWZSZW1lbWJlcmVkUG9zaXRpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50TGlzdGVuZXIjZG9jdW1lbnRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQlpZiAoZlJlbWVtYmVyZWRQb3NpdGlvbiAhPSBudWxsKSB7Ci0JCQlpZiAoIWZSZW1lbWJlcmVkUG9zaXRpb24uaXNEZWxldGVkKCkpIHsKLQotCQkJCWV2ZW50LmdldERvY3VtZW50KCkucmVtb3ZlUG9zaXRpb24oZlJlbWVtYmVyZWRQb3NpdGlvbik7Ci0JCQkJZkFjdGl2ZVJlZ2lvbiA9IG5ldyBSZWdpb24oZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRPZmZzZXQoKSwgZlJlbWVtYmVyZWRQb3NpdGlvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0KLQkJCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCVN0eWxlZFRleHQgd2lkZ2V0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJCQkJaWYgKHdpZGdldCAhPSBudWxsICYmICF3aWRnZXQuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQl3aWRnZXQuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQlkZWFjdGl2YXRlKCk7Ci0JCQkJCQkJfQotCQkJCQkJfSk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJZkFjdGl2ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJZlJlbWVtYmVyZWRQb3NpdGlvbiA9IG51bGw7Ci0JCQkJZGVhY3RpdmF0ZSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lciNmb2N1c0dhaW5lZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgZm9jdXNHYWluZWQoRm9jdXNFdmVudCBlKSB7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuRm9jdXNMaXN0ZW5lciNmb2N1c0xvc3Qob3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0V2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGV2ZW50KSB7Ci0JCWRlYWN0aXZhdGUoKTsKLQl9Ci0KLQlwcml2YXRlIGludCBnZXRDdXJyZW50VGV4dE9mZnNldCgpIHsKLQkJdHJ5IHsKLQkJCVN0eWxlZFRleHQgdGV4dCA9IGdldFRleHRWaWV3ZXIoKS5nZXRUZXh0V2lkZ2V0KCk7Ci0JCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJCXJldHVybiAtMTsKLQotCQkJRGlzcGxheSBkaXNwbGF5ID0gdGV4dC5nZXREaXNwbGF5KCk7Ci0JCQlQb2ludCBhYnNvbHV0ZVBvc2l0aW9uID0gZGlzcGxheS5nZXRDdXJzb3JMb2NhdGlvbigpOwotCQkJUG9pbnQgcmVsYXRpdmVQb3NpdGlvbiA9IHRleHQudG9Db250cm9sKGFic29sdXRlUG9zaXRpb24pOwotCi0JCQlpbnQgd2lkZ2V0T2Zmc2V0ID0gdGV4dC5nZXRPZmZzZXRBdExvY2F0aW9uKHJlbGF0aXZlUG9zaXRpb24pOwotCQkJaWYgKGdldFRleHRWaWV3ZXIoKSBpbnN0YW5jZW9mIElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgewotCQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSBnZXRUZXh0Vmlld2VyKCk7Ci0JCQkJcmV0dXJuIGV4dGVuc2lvbi53aWRnZXRPZmZzZXQyTW9kZWxPZmZzZXQod2lkZ2V0T2Zmc2V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHdpZGdldE9mZnNldCArIGdldFRleHRWaWV3ZXIoKS5nZXRWaXNpYmxlUmVnaW9uKCkuZ2V0T2Zmc2V0KCk7Ci0JCQl9Ci0KLQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiAtMTsKLQkJfQotCX0KLQotCXByaXZhdGUgUG9pbnQgZ2V0TWF4aW11bUxvY2F0aW9uKFN0eWxlZFRleHQgdGV4dCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlQb2ludCBtYXhMb2NhdGlvbiA9IG5ldyBQb2ludChJbnRlZ2VyLk1JTl9WQUxVRSwgSW50ZWdlci5NSU5fVkFMVUUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGxlbmd0aDsgaSsrKSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldChvZmZzZXQgKyBpKTsKLQotCQkJaWYgKGxvY2F0aW9uLnggPiBtYXhMb2NhdGlvbi54KQotCQkJCW1heExvY2F0aW9uLnggPSBsb2NhdGlvbi54OwotCQkJaWYgKGxvY2F0aW9uLnkgPiBtYXhMb2NhdGlvbi55KQotCQkJCW1heExvY2F0aW9uLnkgPSBsb2NhdGlvbi55OwotCQl9Ci0KLQkJcmV0dXJuIG1heExvY2F0aW9uOwotCX0KLQotCXByaXZhdGUgUG9pbnQgZ2V0TWluaW11bUxvY2F0aW9uKFN0eWxlZFRleHQgdGV4dCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlQb2ludCBtaW5Mb2NhdGlvbiA9IG5ldyBQb2ludChJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDw9IGxlbmd0aDsgaSsrKSB7Ci0JCQlQb2ludCBsb2NhdGlvbiA9IHRleHQuZ2V0TG9jYXRpb25BdE9mZnNldChvZmZzZXQgKyBpKTsKLQotCQkJaWYgKGxvY2F0aW9uLnggPCBtaW5Mb2NhdGlvbi54KQotCQkJCW1pbkxvY2F0aW9uLnggPSBsb2NhdGlvbi54OwotCQkJaWYgKGxvY2F0aW9uLnkgPCBtaW5Mb2NhdGlvbi55KQotCQkJCW1pbkxvY2F0aW9uLnkgPSBsb2NhdGlvbi55OwotCQl9Ci0KLQkJcmV0dXJuIG1pbkxvY2F0aW9uOwotCX0KLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXROZXdQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCXByaXZhdGUgSVRleHRWaWV3ZXIgZ2V0VGV4dFZpZXdlcigpIHsKLQkJcmV0dXJuIGZUZXh0Vmlld2VyOwotCX0KLQotCXByaXZhdGUgdm9pZCBoaWdobGlnaHRSZWdpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIHJlZ2lvbikgewotCi0JCWlmIChyZWdpb24uZXF1YWxzKGZBY3RpdmVSZWdpb24pKQotCQkJcmV0dXJuOwotCi0JCXJlcGFpclJlcHJlc2VudGF0aW9uKCk7Ci0KLQkJU3R5bGVkVGV4dCB0ZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKTsKLQkJaWYgKHRleHQgPT0gbnVsbCB8fCB0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCi0JCS8vIFVuZGVybGluZQotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IDA7Ci0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0JCQlJUmVnaW9uIHdpZGdldFJhbmdlID0gZXh0ZW5zaW9uLm1vZGVsUmFuZ2UyV2lkZ2V0UmFuZ2UobmV3IFJlZ2lvbihyZWdpb24uZ2V0T2Zmc2V0KCksIHJlZ2lvbi5nZXRMZW5ndGgoKSkpOwotCQkJaWYgKHdpZGdldFJhbmdlID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlvZmZzZXQgPSB3aWRnZXRSYW5nZS5nZXRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IHdpZGdldFJhbmdlLmdldExlbmd0aCgpOwotCi0JCX0gZWxzZSB7Ci0JCQlvZmZzZXQgPSByZWdpb24uZ2V0T2Zmc2V0KCkgLSB2aWV3ZXIuZ2V0VmlzaWJsZVJlZ2lvbigpLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQl9Ci0JCS8vIG5lZWQgY2xlYXJCYWNrZ3JvdW5kIHRvIGJlIHRydWUgZm9yIHBhaW50IGV2ZW50IHRvIGJlIGZpcmVkCi0JCXRleHQucmVkcmF3UmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIHRydWUpOwotCi0JCWZBY3RpdmVSZWdpb24gPSByZWdpb247Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVzKElSZWdpb24gcmVnaW9uLCBJUmVnaW9uIHBvc2l0aW9uKSB7Ci0JCXJldHVybiBwb3NpdGlvbi5nZXRPZmZzZXQoKSA+PSByZWdpb24uZ2V0T2Zmc2V0KCkgJiYgcG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyBwb3NpdGlvbi5nZXRMZW5ndGgoKSA8PSByZWdpb24uZ2V0T2Zmc2V0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyI2lucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJaWYgKG9sZElucHV0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWRlYWN0aXZhdGUoKTsKLQkJb2xkSW5wdXQucmVtb3ZlRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXIjaW5wdXREb2N1bWVudENoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQlpZiAobmV3SW5wdXQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbmV3SW5wdXQuYWRkRG9jdW1lbnRMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJZlByZWZlcmVuY2VTdG9yZSA9IHN0b3JlOwotCQlJVGV4dFZpZXdlciB0ZXh0Vmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAodGV4dFZpZXdlciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0eWxlZFRleHQgdGV4dCA9IHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCXVwZGF0ZUNvbG9yKHRleHRWaWV3ZXIpOwotCi0JCXRleHRWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIodGhpcyk7Ci0KLQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkKLQkJCWRvY3VtZW50LmFkZERvY3VtZW50TGlzdGVuZXIodGhpcyk7Ci0KLQkJdGV4dC5hZGRLZXlMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LmFkZE1vdXNlTW92ZUxpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LmFkZEZvY3VzTGlzdGVuZXIodGhpcyk7Ci0JCXRleHQuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLQotCQl1cGRhdGVLZXlNb2RpZmllck1hc2soKTsKLQotCQlmUHJlZmVyZW5jZVN0b3JlLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXIja2V5UHJlc3NlZChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGtleVByZXNzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQotCQlpZiAoZkFjdGl2ZSkgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKGV2ZW50LmtleUNvZGUgIT0gZktleU1vZGlmaWVyTWFzaykgewotCQkJZGVhY3RpdmF0ZSgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZkFjdGl2ZSA9IHRydWU7Ci0KLQkJLy8JCQlyZW1vdmVkIGZvciAjMjU4NzEKLQkJLy8KLQkJLy8JCQlJU291cmNlVmlld2VyIHZpZXdlcj0gZ2V0U291cmNlVmlld2VyKCk7Ci0JCS8vCQkJaWYgKHZpZXdlciA9PSBudWxsKQotCQkvLwkJCQlyZXR1cm47Ci0JCS8vCQkJCi0JCS8vCQkJSVJlZ2lvbiByZWdpb249IGdldEN1cnJlbnRUZXh0UmVnaW9uKHZpZXdlcik7Ci0JCS8vCQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkvLwkJCQlyZXR1cm47Ci0JCS8vCQkJCi0JCS8vCQkJaGlnaGxpZ2h0UmVnaW9uKHZpZXdlciwgcmVnaW9uKTsKLQkJLy8JCQlhY3RpdmF0ZUN1cnNvcih2aWV3ZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyI2tleVJlbGVhc2VkKG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQga2V5UmVsZWFzZWQoS2V5RXZlbnQgZXZlbnQpIHsKLQotCQlpZiAoIWZBY3RpdmUpCi0JCQlyZXR1cm47Ci0KLQkJZGVhY3RpdmF0ZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VEb3VibGVDbGljayhvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUxpc3RlbmVyI21vdXNlRG93bihvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQotCQlpZiAoIWZBY3RpdmUpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGV2ZW50LnN0YXRlTWFzayAhPSBmS2V5TW9kaWZpZXJNYXNrKSB7Ci0JCQlkZWFjdGl2YXRlKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAoZXZlbnQuYnV0dG9uICE9IDEpIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTW92ZUxpc3RlbmVyI21vdXNlTW92ZShvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpIHsKLQotCQlpZiAoZXZlbnQud2lkZ2V0IGluc3RhbmNlb2YgQ29udHJvbCAmJiAhKChDb250cm9sKSBldmVudC53aWRnZXQpLmlzRm9jdXNDb250cm9sKCkpIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICghZkFjdGl2ZSkgewotCQkJaWYgKGV2ZW50LnN0YXRlTWFzayAhPSBmS2V5TW9kaWZpZXJNYXNrKQotCQkJCXJldHVybjsKLQkJCS8vIG1vZGlmaWVyIHdhcyBhbHJlYWR5IHByZXNzZWQKLQkJCWZBY3RpdmUgPSB0cnVlOwotCQl9Ci0KLQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAodmlld2VyID09IG51bGwpIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoZXZlbnQuc3RhdGVNYXNrICYgU1dULkJVVFRPTjEpICE9IDAgJiYgdGV4dC5nZXRTZWxlY3Rpb25Db3VudCgpICE9IDApIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IGdldEN1cnJlbnRUZXh0T2Zmc2V0KCk7Ci0JCUlPcGVuT24gb3Blbk9uID0gT3Blbk9uUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuT24oZ2V0VGV4dFZpZXdlcigpLmdldERvY3VtZW50KCksIG9mZnNldCk7Ci0JCWlmIChvcGVuT24gIT0gbnVsbCkgewotCQkJcmVnaW9uID0gb3Blbk9uLmdldE9wZW5PblJlZ2lvbihnZXRUZXh0Vmlld2VyKCkuZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KTsKLQkJfQotCQlpZiAocmVnaW9uID09IG51bGwgfHwgcmVnaW9uLmdldExlbmd0aCgpID09IDApIHsKLQkJCXJlcGFpclJlcHJlc2VudGF0aW9uKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQloaWdobGlnaHRSZWdpb24odmlld2VyLCByZWdpb24pOwotCQlhY3RpdmF0ZUN1cnNvcih2aWV3ZXIpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXIjbW91c2VVcChvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsKLQotCQlpZiAoIWZBY3RpdmUpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGUuYnV0dG9uICE9IDEpIHsKLQkJCWRlYWN0aXZhdGUoKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWJvb2xlYW4gd2FzQWN0aXZlID0gZkN1cnNvciAhPSBudWxsOwotCQlJUmVnaW9uIHByZXZpb3VzUmVnaW9uID0gZkFjdGl2ZVJlZ2lvbjsKLQotCQlkZWFjdGl2YXRlKCk7Ci0KLQkJaWYgKHdhc0FjdGl2ZSkgewotCQkJSU9wZW5PbiBvcGVuT24gPSBPcGVuT25Qcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldE9wZW5PbihnZXRUZXh0Vmlld2VyKCkuZ2V0RG9jdW1lbnQoKSwgcHJldmlvdXNSZWdpb24uZ2V0T2Zmc2V0KCkpOwotCQkJaWYgKG9wZW5PbiAhPSBudWxsKSB7Ci0JCQkJb3Blbk9uLm9wZW5PbihnZXRUZXh0Vmlld2VyKCkuZ2V0RG9jdW1lbnQoKSwgcHJldmlvdXNSZWdpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFBhaW50TGlzdGVuZXIjcGFpbnRDb250cm9sKFBhaW50RXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJaWYgKGZBY3RpdmVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlJVGV4dFZpZXdlciB2aWV3ZXIgPSBnZXRUZXh0Vmlld2VyKCk7Ci0JCWlmICh2aWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHlsZWRUZXh0IHRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0KLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSAwOwotCi0JCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQotCQkJSVRleHRWaWV3ZXJFeHRlbnNpb241IGV4dGVuc2lvbiA9IChJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHZpZXdlcjsKLQkJCUlSZWdpb24gd2lkZ2V0UmFuZ2UgPSBleHRlbnNpb24ubW9kZWxSYW5nZTJXaWRnZXRSYW5nZShmQWN0aXZlUmVnaW9uKTsKLQkJCWlmICh3aWRnZXRSYW5nZSA9PSBudWxsKQotCQkJCXJldHVybjsKLQotCQkJb2Zmc2V0ID0gd2lkZ2V0UmFuZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQlsZW5ndGggPSB3aWRnZXRSYW5nZS5nZXRMZW5ndGgoKTsKLQotCQl9IGVsc2UgewotCi0JCQlJUmVnaW9uIHJlZ2lvbiA9IHZpZXdlci5nZXRWaXNpYmxlUmVnaW9uKCk7Ci0JCQlpZiAoIWluY2x1ZGVzKHJlZ2lvbiwgZkFjdGl2ZVJlZ2lvbikpCi0JCQkJcmV0dXJuOwotCi0JCQlvZmZzZXQgPSBmQWN0aXZlUmVnaW9uLmdldE9mZnNldCgpIC0gcmVnaW9uLmdldE9mZnNldCgpOwotCQkJbGVuZ3RoID0gZkFjdGl2ZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJfQotCi0JCS8vIHN1cHBvcnQgZm9yIGJpZGkKLQkJUG9pbnQgbWluTG9jYXRpb24gPSBnZXRNaW5pbXVtTG9jYXRpb24odGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotCQlQb2ludCBtYXhMb2NhdGlvbiA9IGdldE1heGltdW1Mb2NhdGlvbih0ZXh0LCBvZmZzZXQsIGxlbmd0aCk7Ci0KLQkJaW50IHgxID0gbWluTG9jYXRpb24ueDsKLQkJaW50IHgyID0gbWluTG9jYXRpb24ueCArIG1heExvY2F0aW9uLnggLSBtaW5Mb2NhdGlvbi54IC0gMTsKLQkJaW50IHkgPSBtaW5Mb2NhdGlvbi55ICsgdGV4dC5nZXRMaW5lSGVpZ2h0KCkgLSAxOwotCi0JCUdDIGdjID0gZXZlbnQuZ2M7Ci0JCWlmIChmQ29sb3IgIT0gbnVsbCAmJiAhZkNvbG9yLmlzRGlzcG9zZWQoKSkKLQkJCWdjLnNldEZvcmVncm91bmQoZkNvbG9yKTsKLQkJZ2MuZHJhd0xpbmUoeDEsIHksIHgyLCB5KTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIjcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCWlmIChldmVudC5nZXRQcm9wZXJ0eSgpLmVxdWFscyhmTGlua0NvbG9yS2V5KSkgewotCQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJCXVwZGF0ZUNvbG9yKHZpZXdlcik7Ci0JCX0gZWxzZSBpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoZkJyb3dzZXJMaWtlTGlua3NLZXlNb2RpZmllcktleSkpIHsKLQkJCXVwZGF0ZUtleU1vZGlmaWVyTWFzaygpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGFpclJlcHJlc2VudGF0aW9uKCkgewotCQlyZXBhaXJSZXByZXNlbnRhdGlvbihmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlcGFpclJlcHJlc2VudGF0aW9uKGJvb2xlYW4gcmVkcmF3QWxsKSB7Ci0KLQkJaWYgKGZBY3RpdmVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgb2Zmc2V0ID0gZkFjdGl2ZVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IGZBY3RpdmVSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZBY3RpdmVSZWdpb24gPSBudWxsOwotCi0JCUlUZXh0Vmlld2VyIHZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHZpZXdlciAhPSBudWxsKSB7Ci0KLQkJCXJlc2V0Q3Vyc29yKHZpZXdlcik7Ci0KLQkJCS8vIFJlbW92ZSB1bmRlcmxpbmUKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCQlJVGV4dFZpZXdlckV4dGVuc2lvbjUgZXh0ZW5zaW9uID0gKElUZXh0Vmlld2VyRXh0ZW5zaW9uNSkgdmlld2VyOwotCQkJCW9mZnNldCA9IGV4dGVuc2lvbi5tb2RlbE9mZnNldDJXaWRnZXRPZmZzZXQob2Zmc2V0KTsKLQkJCX0gZWxzZSB7Ci0JCQkJb2Zmc2V0IC09IHZpZXdlci5nZXRWaXNpYmxlUmVnaW9uKCkuZ2V0T2Zmc2V0KCk7Ci0JCQl9Ci0JCQl0cnkgewotCQkJCVN0eWxlZFRleHQgdGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0KLQkJCQkvLyBuZWVkIGNsZWFyQmFja2dyb3VuZCB0byBiZSB0cnVlIGZvciBwYWludCBldmVudCB0byBiZSBmaXJlZAotCQkJCXRleHQucmVkcmF3UmFuZ2Uob2Zmc2V0LCBsZW5ndGgsIHRydWUpOwotCQkJfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKHgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlc2V0Q3Vyc29yKElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlTdHlsZWRUZXh0IHRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCAhPSBudWxsICYmICF0ZXh0LmlzRGlzcG9zZWQoKSkKLQkJCXRleHQuc2V0Q3Vyc29yKG51bGwpOwotCi0JCWlmIChmQ3Vyc29yICE9IG51bGwpIHsKLQkJCWZDdXJzb3IuZGlzcG9zZSgpOwotCQkJZkN1cnNvciA9IG51bGw7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRIeXBlcmxpbmtQcmVmZXJlbmNlS2V5cyhTdHJpbmcgbGlua0NvbG9yS2V5LCBTdHJpbmcgYnJvd3Nlckxpa2VMaW5rc0tleU1vZGlmaWVyS2V5KSB7Ci0JCWZMaW5rQ29sb3JLZXkgPSBsaW5rQ29sb3JLZXk7Ci0JCWZCcm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXkgPSBicm93c2VyTGlrZUxpbmtzS2V5TW9kaWZpZXJLZXk7Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoZkN1cnNvciAhPSBudWxsKSB7Ci0JCQlmQ3Vyc29yLmRpc3Bvc2UoKTsKLQkJCWZDdXJzb3IgPSBudWxsOwotCQl9Ci0KLQkJSVRleHRWaWV3ZXIgdGV4dFZpZXdlciA9IGdldFRleHRWaWV3ZXIoKTsKLQkJaWYgKHRleHRWaWV3ZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQl0ZXh0Vmlld2VyLnJlbW92ZVRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCi0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpCi0JCQlkb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCi0JCUlQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlID0gZ2V0TmV3UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWlmIChwcmVmZXJlbmNlU3RvcmUgIT0gbnVsbCkKLQkJCXByZWZlcmVuY2VTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCi0JCVN0eWxlZFRleHQgdGV4dCA9IHRleHRWaWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCXRleHQucmVtb3ZlS2V5TGlzdGVuZXIodGhpcyk7Ci0JCXRleHQucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5yZW1vdmVNb3VzZU1vdmVMaXN0ZW5lcih0aGlzKTsKLQkJdGV4dC5yZW1vdmVGb2N1c0xpc3RlbmVyKHRoaXMpOwotCQl0ZXh0LnJlbW92ZVBhaW50TGlzdGVuZXIodGhpcyk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUNvbG9yKElUZXh0Vmlld2VyIHZpZXdlcikgewotCQlTdHlsZWRUZXh0IHRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpOwotCQlpZiAodGV4dCA9PSBudWxsIHx8IHRleHQuaXNEaXNwb3NlZCgpKQotCQkJcmV0dXJuOwotCi0JCURpc3BsYXkgZGlzcGxheSA9IHRleHQuZ2V0RGlzcGxheSgpOwotCQlmQ29sb3IgPSBjcmVhdGVDb2xvcihnZXROZXdQcmVmZXJlbmNlU3RvcmUoKSwgZkxpbmtDb2xvcktleSwgZGlzcGxheSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUtleU1vZGlmaWVyTWFzaygpIHsKLQkJU3RyaW5nIG1vZGlmaWVycyA9IGdldE5ld1ByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhmQnJvd3Nlckxpa2VMaW5rc0tleU1vZGlmaWVyS2V5KTsKLQkJZktleU1vZGlmaWVyTWFzayA9IGNvbXB1dGVTdGF0ZU1hc2sobW9kaWZpZXJzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25BY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0ODc4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklFeHRlbmRlZFNpbXBsZUVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci0KLQotLyoqCi0gKiBEZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBJT3BlbkZpbGVBY3Rpb24gdG8gY2FsbCBiYXNlZCBvbiBjdXJyZW50Ci0gKiBwYXJ0aXRpb24uCi0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBiYXNlIHN1cHBvcnQgZm9yIGh5cGVybGluayBuYXZpZ2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuT25BY3Rpb24gZXh0ZW5kcyBUZXh0RWRpdG9yQWN0aW9uIHsKLQlwdWJsaWMgT3Blbk9uQWN0aW9uKFJlc291cmNlQnVuZGxlIGJ1bmRsZSwgU3RyaW5nIHByZWZpeCwgSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCXN1cGVyKGJ1bmRsZSwgcHJlZml4LCBlZGl0b3IpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb24jcnVuKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JTaXRlKCkuZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlJVGV4dEVkaXRvciBlZGl0b3IgPSBnZXRUZXh0RWRpdG9yKCk7Ci0KLQkJCQkvLyBmaWd1cmUgb3V0IGN1cnJlbnQgb2Zmc2V0Ci0JCQkJaW50IG9mZnNldCA9IC0xOwotCQkJCUlTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIHRleHRUb29scyA9IChJU291cmNlRWRpdGluZ1RleHRUb29scykgZ2V0VGV4dEVkaXRvcigpLmdldEFkYXB0ZXIoSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MpOwotCQkJCWlmICh0ZXh0VG9vbHMgIT0gbnVsbCkgewotCQkJCQlvZmZzZXQgPSB0ZXh0VG9vbHMuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZWRpdG9yIGluc3RhbmNlb2YgSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSB7Ci0JCQkJCW9mZnNldCA9ICgoSUV4dGVuZGVkU2ltcGxlRWRpdG9yKSBlZGl0b3IpLmdldENhcmV0UG9zaXRpb24oKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChlZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSAhPSBudWxsKSB7Ci0JCQkJCQlJU2VsZWN0aW9uIHNlbCA9IGVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKHNlbCBpbnN0YW5jZW9mIElUZXh0U2VsZWN0aW9uKSB7Ci0JCQkJCQkJb2Zmc2V0ID0gKChJVGV4dFNlbGVjdGlvbikgc2VsKS5nZXRPZmZzZXQoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQlJT3Blbk9uIG9wZW5PbiA9IE9wZW5PblByb3ZpZGVyLmdldEluc3RhbmNlKCkuZ2V0T3Blbk9uKGRvY3VtZW50LCBvZmZzZXQpOwotCQkJCWlmIChvcGVuT24gIT0gbnVsbCkgewotCQkJCQlvcGVuT24ub3Blbk9uKGRvY3VtZW50LCBuZXcgUmVnaW9uKG9mZnNldCwgMCkpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25CdWlsZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYyZGU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5leHRlbnNpb24uUmVnaXN0cnlSZWFkZXI7Ci0KLQotLyoqCi0gKiBSZWFkcyBleHRlbnNpb25zIGZvciBvcGVuIG9uIGV4dGVuc2lvbiBwb2ludCwKLSAqIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuZXh0ZW5zaW9ucy5vcGVub24KLSAqIAotICogQGRlcHJlY2F0ZWQgVXNlIGJhc2Ugc3VwcG9ydCBmb3IgaHlwZXJsaW5rIG5hdmlnYXRpb24KLSAqLwotcHVibGljIGNsYXNzIE9wZW5PbkJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgT3Blbk9uQnVpbGRlciBmSW5zdGFuY2U7Ci0JLy8gZXh0ZW5zaW9uIHBvaW50IElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfT1BFTk9OID0gIm9wZW5vbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05URU5UX1RZUEVfSURFTlRJRklFUiA9ICJjb250ZW50dHlwZWlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfT1BFTk9OID0gIm9wZW5vbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUEFSVElUSU9OX1RZUEUgPSAicGFydGl0aW9udHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIHJldHVybnMgc2luZ2xldG9uIGluc3RhbmNlIG9mIE9wZW5PbkJ1aWxkZXIKLQkgKiAKLQkgKiBAcmV0dXJuIE9wZW5PbkJ1aWxkZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBPcGVuT25CdWlsZGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBPcGVuT25CdWlsZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudENvbnRlbnRUeXBlOwotCXByaXZhdGUgT3Blbk9uRGVmaW5pdGlvbiBmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBMaXN0IGZPcGVuT25EZWZzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgdGFyZ2V0Q29udHJpYnV0aW9uVGFnOwotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFydCBJRCBhdHRyaWJ1dGUgdGhhdCBpcyBleHBlY3RlZCBpbiB0aGUKLQkgKiB0YXJnZXQgZXh0ZW5zaW9uLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldElkKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9JRCk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE9wZW5PbkNsYXNzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsbCB0aGUgb3BlbiBvbiBkZWZpbml0aW9uIG9iamVjdHMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIE9wZW5PbkRlZmluaXRpb25bXSBnZXRPcGVuT25EZWZpbml0aW9ucygpIHsKLQkJaW5pdENhY2hlKCk7Ci0JCXJldHVybiAoT3Blbk9uRGVmaW5pdGlvbltdKSBmT3Blbk9uRGVmcy50b0FycmF5KG5ldyBPcGVuT25EZWZpbml0aW9uW2ZPcGVuT25EZWZzLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYWxsIHRoZSBvcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0cyB2YWxpZCBmb3IKLQkgKiBjb250ZW50VHlwZS9wYXJ0aXRpb25UeXBlCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcmV0dXJuIGlmIGVpdGhlciBjb250ZW50VHlwZSBvciBwYXJ0aXRpb25UeXBlIGlzIG51bGwsIG51bGwgaXMKLQkgKiAgICAgICAgIHJldHVybmVkCi0JICovCi0JcHVibGljIE9wZW5PbkRlZmluaXRpb25bXSBnZXRPcGVuT25EZWZpbml0aW9ucyhTdHJpbmcgY29udGVudFR5cGUsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmIChjb250ZW50VHlwZSA9PSBudWxsIHx8IHBhcnRpdGlvblR5cGUgPT0gbnVsbCkgewotCQkJLy8gc2hvdWxkIG5vdCBiZSBhYmxlIHRvIGRlZmluZSBhbiBvcGVub24gd2l0aG91dCBhIGNvbnRlbnQgdHlwZQotCQkJLy8gYnV0IGlmIGl0IHdlcmUgcG9zc2libGUgdGhlbiB3b3VsZCBuZWVkIHRvIHNlYXJjaCBhbGwgb3Blbm9uCi0JCQkvLyBkZWZpbml0aW9ucyBmb3IKLQkJCS8vIGRlZmluaXRpb25zIHdpdGggZW1wdHkgY29udGVudFR5cGUgbGlzdAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQkvLyBlbnRpcmUgbGlzdCBvZiBvcGVub24gZGVmaW5pdGlvbiBvYmplY3RzCi0JCU9wZW5PbkRlZmluaXRpb25bXSBhbGxEZWZzID0gZ2V0T3Blbk9uRGVmaW5pdGlvbnMoKTsKLQkJLy8gY3VycmVudCBsaXN0IG9mIG9wZW4gb24gZGVmaW5pdGlvbnMgdmFsaWQgZm9yCi0JCS8vIGNvbnRlbnRUeXBlL3BhcnRpdGlvblR5cGUKLQkJTGlzdCBkZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBkZWZhdWx0IGRlZmluaXRpb25zIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIGVuZCBvZiBsaXN0IG9mIG9wZW4gb24KLQkJLy8gZGVmaW5pdGlvbnMKLQkJTGlzdCBsYXN0RGVmcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGFsbERlZnMubGVuZ3RoOyArK2kpIHsKLQkJCS8vIGZvciBlYWNoIG9uZSBjaGVjayBpZiBpdCBjb250YWlucyBjb250ZW50VHlwZQotCQkJTGlzdCBwYXJ0aXRpb25zID0gKExpc3QpIGFsbERlZnNbaV0uZ2V0Q29udGVudFR5cGVzKCkuZ2V0KGNvbnRlbnRUeXBlKTsKLQkJCWlmIChwYXJ0aXRpb25zICE9IG51bGwpIHsKLQkJCQkvLyB0aGlzIG9wZW5vbiBkZWZpbml0aW9uIGlzIHZhbGlkIGZvciBhbGwgcGFydGl0aW9uIHR5cGVzIGZvcgotCQkJCS8vIHRoaXMgY29udGVudCB0eXBlCi0JCQkJaWYgKHBhcnRpdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJCS8vIHRoaXMgd2lsbCBiZSBhZGRlZCB0byBlbmQgb2YgbGlzdCBiZWNhdXNlIHRoaXMgaXMKLQkJCQkJLy8gY29uc2lkZXJlZCBhIGRlZmF1bHQgb3Blbm9uCi0JCQkJCWxhc3REZWZzLmFkZChhbGxEZWZzW2ldKTsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBleGFtaW5lIHRoZSBwYXJ0aXRpb24gdHlwZXMgb2YgdGhpcyBvcGVub24KLQkJCQkJaW50IGogPSAwOyAvLyBjdXJyZW50IGluZGV4IGluIGxpc3Qgb2YgcGFydGl0aW9ucwotCQkJCQlib29sZWFuIGFkZGVkID0gZmFsc2U7IC8vIG9wZW5vbiBoYXMgYmVlbiBhZGRlZCB0byBsaXN0Ci0JCQkJCXdoaWxlIChqIDwgcGFydGl0aW9ucy5zaXplKCkgJiYgIWFkZGVkKSB7Ci0JCQkJCQkvLyB0aGlzIG9wZW5vbiBkZWZpbml0aW9uIGFwcGxpZXMgdG8gcGFydGl0aW9uVHlwZSBzbwotCQkJCQkJLy8gYWRkIHRvIGxpc3Qgb2YgdmFsaWQgb3Blbm9ucwotCQkJCQkJaWYgKHBhcnRpdGlvblR5cGUuZXF1YWxzKHBhcnRpdGlvbnMuZ2V0KGopKSkgewotCQkJCQkJCWRlZnMuYWRkKGFsbERlZnNbaV0pOwotCQkJCQkJCWFkZGVkID0gdHJ1ZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJLy8gY29udGludWUgY2hlY2tpbmcgdG8gc2VlIGlmIHRoaXMgb3Blbm9uCi0JCQkJCQkJLy8gZGVmaW5pdGlvbiBpcyB2YWxpZCBmb3IgY3VycmVudCBwYXJ0aXRpb25UeXBlCi0JCQkJCQkJKytqOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIGFwcGVuZCB0aGUgZGVmYXVsdCBvcGVub24gZGVmaW5pdGlvbnMKLQkJZGVmcy5hZGRBbGwobGFzdERlZnMpOwotCi0JCS8vIHJldHVybiB0aGUgbGlzdAotCQlyZXR1cm4gKE9wZW5PbkRlZmluaXRpb25bXSkgZGVmcy50b0FycmF5KG5ldyBPcGVuT25EZWZpbml0aW9uW2RlZnMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluaXRDYWNoZSgpIHsKLQkJaWYgKGZPcGVuT25EZWZzID09IG51bGwpIHsKLQkJCWZPcGVuT25EZWZzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJCXJlYWRDb250cmlidXRpb25zKFRBR19PUEVOT04sIFBMX09QRU5PTik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgc3BlY2lmeWluZyBhCi0JICogY29udGVudCB0eXBlIGZvciB0aGUgY3VycmVudCBvcGVuIG9uIHRhZy4gQXNzdW1lcyB0aGF0IHRoZXJlIGlzIGEgdmFsaWQKLQkgKiBjdXJyZW50IG9wZW4gb24gZGVmaW5pdGlvbiBvYmplY3QuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIGNvbnRlbnR0eXBlaWRlbnRpZmllciBjb25maWd1cmF0aW9uIGVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbnRlbnRUeXBlVGFnKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGFkZCB0byBjdXJyZW50IG9wZW5PbkRlZmluaXRpb24KLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0KLQkJaWYgKHRoZUlkICE9IG51bGwpIHsKLQkJCWZDdXJyZW50Q29udGVudFR5cGUgPSB0aGVJZDsKLQkJCWZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbi5hZGRDb250ZW50VHlwZUlkKGZDdXJyZW50Q29udGVudFR5cGUpOwotCQl9IGVsc2UgewotCQkJZkN1cnJlbnRDb250ZW50VHlwZSA9IG51bGw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzZXMgZWxlbWVudCB3aGljaCBzaG91bGQgYmUgYSBjb25maWd1cmF0aW9uIGVsZW1lbnQgc3BlY2lmeWluZyBhbgotCSAqIG9wZW4gb24gb2JqZWN0LiBDcmVhdGVzIGEgbmV3IG9wZW4gb24gZGVmaW5pdGlvbiBvYmplY3QgYW5kIGFkZHMgaXQgdG8KLQkgKiB0aGUgbGlzdCBvZiBvcGVuIG9uIGRlZmluaXRpb24gb2JqZWN0cwotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcGVub24gY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NPcGVuT25UYWcoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0JCVN0cmluZyB0aGVDbGFzcyA9IGdldE9wZW5PbkNsYXNzKGVsZW1lbnQpOwotCi0JCWlmICh0aGVJZCAhPSBudWxsICYmIHRoZUNsYXNzICE9IG51bGwpIHsKLQkJCS8vIHN0YXJ0IGJ1aWxkaW5nIG5ldyBPcGVuT25EZWZpbml0aW9uCi0JCQlmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBuZXcgT3Blbk9uRGVmaW5pdGlvbih0aGVJZCwgdGhlQ2xhc3MsIGVsZW1lbnQpOwotCQkJZk9wZW5PbkRlZnMuYWRkKGZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbik7Ci0JCX0gZWxzZSB7Ci0JCQlmQ3VycmVudE9wZW5PbkRlZmluaXRpb24gPSBudWxsOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2VzIGVsZW1lbnQgd2hpY2ggc2hvdWxkIGJlIGEgY29uZmlndXJhdGlvbiBlbGVtZW50IHNwZWNpZnlpbmcgYQotCSAqIHBhcnRpdGlvbiB0eXBlIGZvciB0aGUgY3VycmVudCBvcGVuIG9uL2NvbnRlbnQgdHlwZSB0YWcuIEFzc3VtZXMgdGhhdAotCSAqIHRoZXJlIGlzIGEgdmFsaWQgY3VycmVudCBvcGVuIG9uL2NvbnRlbnQgdHlwZSB0YWcuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHBhcnRpdGlvbnR5cGUgY29uZmlndXJhdGlvbiBlbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3NQYXJ0aXRpb25UeXBlVGFnKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCS8vIGFkZCB0byBjdXJyZW50IG9wZW5PbkRlZmluaXRpb24vY29udGVudFR5cGUKLQkJU3RyaW5nIHRoZUlkID0gZ2V0SWQoZWxlbWVudCk7Ci0KLQkJaWYgKHRoZUlkICE9IG51bGwpIHsKLQkJCWZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbi5hZGRQYXJ0aXRpb25UeXBlKGZDdXJyZW50Q29udGVudFR5cGUsIHRoZUlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlYWRzIHRoZSBjb250cmlidXRpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciB0aGUgcHJvdmlkZWQgd29ya2JlbmNoCi0JICogcGFydCBhbmQgdGhlIHByb3ZpZGVkIGV4dGVuc2lvbiBwb2ludCBJRC4KLQkgKiAKLQkgKiBAcGFyYW0gdGFnCi0JICogQHBhcmFtIGV4dGVuc2lvblBvaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVhZENvbnRyaWJ1dGlvbnMoU3RyaW5nIHRhZywgU3RyaW5nIGV4dGVuc2lvblBvaW50KSB7Ci0JCXRhcmdldENvbnRyaWJ1dGlvblRhZyA9IHRhZzsKLQkJSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gUGxhdGZvcm0uZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQkJcmVhZFJlZ2lzdHJ5KHJlZ2lzdHJ5LCBQTFVHSU5fSUQsIGV4dGVuc2lvblBvaW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZXh0ZW5zaW9uLlJlZ2lzdHJ5UmVhZGVyI3JlYWRFbGVtZW50KG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQpCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCi0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCXByb2Nlc3NPcGVuT25UYWcoZWxlbWVudCk7Ci0KLQkJCS8vIG1ha2Ugc3VyZSBwcm9jZXNzaW5nIG9mIGN1cnJlbnQgb3BlbiBvbiB0YWcgcmVzdWx0ZWQgaW4gYQotCQkJLy8gY3VycmVudCBvcGVuIG9uIGRlZmluaXRpb24KLQkJCS8vIGJlZm9yZSBjb250aW51ZSByZWFkaW5nIHRoZSBjaGlsZHJlbgotCQkJaWYgKGZDdXJyZW50T3Blbk9uRGVmaW5pdGlvbiAhPSBudWxsKSB7Ci0JCQkJcmVhZEVsZW1lbnRDaGlsZHJlbihlbGVtZW50KTsKLQkJCX0KLQkJCXJldHVybiB0cnVlOwotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0NPTlRFTlRfVFlQRV9JREVOVElGSUVSKSkgewotCQkJcHJvY2Vzc0NvbnRlbnRUeXBlVGFnKGVsZW1lbnQpOwotCi0JCQkvLyBtYWtlIHN1cmUgcHJvY2Vzc2luZyBvZiBjdXJyZW50IGNvbnRlbnQgdHlwZSByZXN1bHRlZCBpbiBhCi0JCQkvLyB2YWxpZCBjb250ZW50IHR5cGUKLQkJCS8vIGJlZm9yZSByZWFkaW5nIHRoZSBjaGlsZHJlbgotCQkJaWYgKGZDdXJyZW50Q29udGVudFR5cGUgIT0gbnVsbCkgewotCQkJCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QQVJUSVRJT05fVFlQRSkpIHsKLQkJCXByb2Nlc3NQYXJ0aXRpb25UeXBlVGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL29wZW5vbi9PcGVuT25EZWZpbml0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5MTU5ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwub3Blbm9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogT3BlbiBvbiBkZWZpbml0aW9uIG9iamVjdAotICogCi0gKiBAZGVwcmVjYXRlZCBVc2UgYmFzZSBzdXBwb3J0IGZvciBoeXBlcmxpbmsgbmF2aWdhdGlvbgotICovCi1wdWJsaWMgY2xhc3MgT3Blbk9uRGVmaW5pdGlvbiB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzTmFtZSA9IG51bGw7Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmQ29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOwotCi0JLy8gYSBoYXNoIG1hcCBvZiBjb250ZW50IHR5cGUgSWRzIChTdHJpbmcpIHRoYXQgcG9pbnRzIHRvIGxpc3RzIG9mCi0JLy8gcGFyaXRpb24gdHlwZXMgKExpc3Qgb2YgU3RyaW5ncykKLQkvLyBjb250ZW50VHlwZUlkIC0+IExpc3QocGFyaXRpb25UeXBlLCBwYXJpdGlvblR5cGUsIHBhcnRpdGlvblR5cGUsIC4uLikKLQkvLyBjb250ZW50VHlwZUlkMiAtPiBMaXN0KHBhcnRpdGlvblR5cGUsIHBhcnRpdGlvblR5cGUsIC4uLikKLQkvLyAuLi4KLQlwcml2YXRlIEhhc2hNYXAgZkNvbnRlbnRUeXBlcyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZklkID0gbnVsbDsKLQotCS8qKgotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSBjbGFzczEKLQkgKiBAcGFyYW0gY29uZmlndXJhdGlvbkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgT3Blbk9uRGVmaW5pdGlvbihTdHJpbmcgaWQsIFN0cmluZyBjbGFzczEsIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uRWxlbWVudCkgewotCQlzdXBlcigpOwotCQlmSWQgPSBpZDsKLQkJZkNsYXNzTmFtZSA9IGNsYXNzMTsKLQkJZkNvbmZpZ3VyYXRpb25FbGVtZW50ID0gY29uZmlndXJhdGlvbkVsZW1lbnQ7Ci0JCWZDb250ZW50VHlwZXMgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZENvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJaWYgKCFmQ29udGVudFR5cGVzLmNvbnRhaW5zS2V5KGNvbnRlbnRUeXBlSWQpKQotCQkJZkNvbnRlbnRUeXBlcy5wdXQoY29udGVudFR5cGVJZCwgbmV3IEFycmF5TGlzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXJ0aXRpb25UeXBlKFN0cmluZyBjb250ZW50VHlwZUlkLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlpZiAoIWZDb250ZW50VHlwZXMuY29udGFpbnNLZXkoY29udGVudFR5cGVJZCkpCi0JCQlmQ29udGVudFR5cGVzLnB1dChjb250ZW50VHlwZUlkLCBuZXcgQXJyYXlMaXN0KCkpOwotCi0JCUxpc3QgcGFydGl0aW9uTGlzdCA9IChMaXN0KSBmQ29udGVudFR5cGVzLmdldChjb250ZW50VHlwZUlkKTsKLQkJcGFydGl0aW9uTGlzdC5hZGQocGFydGl0aW9uVHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBleHRlbnNpb24uIElmIHRoZSBleHRlbnNpb24gcGx1Z2luIGhhcyBub3QgYmVlbiBsb2FkZWQgYQotCSAqIGJ1c3kgY3Vyc29yIHdpbGwgYmUgYWN0aXZhdGVkIGR1cmluZyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvYWQuCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5TmFtZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICovCi0JcHJpdmF0ZSBPYmplY3QgY3JlYXRlRXh0ZW5zaW9uKFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJLy8gSWYgcGx1Z2luIGhhcyBiZWVuIGxvYWRlZCBjcmVhdGUgZXh0ZW5zaW9uLgotCQkvLyBPdGhlcndpc2UsIHNob3cgYnVzeSBjdXJzb3IgdGhlbiBjcmVhdGUgZXh0ZW5zaW9uLgotCQlmaW5hbCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCA9IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCk7Ci0JCWZpbmFsIFN0cmluZyBuYW1lID0gcHJvcGVydHlOYW1lOwotCi0JCWZpbmFsIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07Ci0JCVN0cmluZyBwbHVnaW5JZCA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0TmFtZXNwYWNlKCk7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLkFDVElWRSkgewotCQkJdHJ5IHsKLQkJCQlyZXR1cm4gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKG5hbWUpOwotCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJaGFuZGxlQ3JlYXRlRXhlY3V0YWJsZUV4Y2VwdGlvbihyZXN1bHQsIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJQnVzeUluZGljYXRvci5zaG93V2hpbGUobnVsbCwgbmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCXJlc3VsdFswXSA9IGVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbihuYW1lKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCXJldHVybiByZXN1bHRbMF07Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBJT3Blbk9uIGZvciB0aGlzIGRlZmluaXRpb24KLQkgKi8KLQlwdWJsaWMgSU9wZW5PbiBjcmVhdGVPcGVuT24oKSB7Ci0JCUlPcGVuT24gb3Blbk9uID0gbnVsbDsKLQotCQlpZiAoZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCkgewotCQkJb3Blbk9uID0gKElPcGVuT24pIGNyZWF0ZUV4dGVuc2lvbihPcGVuT25CdWlsZGVyLkFUVF9DTEFTUyk7Ci0JCX0KLQotCQlyZXR1cm4gb3Blbk9uOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkNsYXNzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lKCkgewotCQlyZXR1cm4gZkNsYXNzTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZDb25maWd1cmF0aW9uRWxlbWVudC4KLQkgKi8KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25FbGVtZW50OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkNvbnRlbnRUeXBlcy4KLQkgKi8KLQlwdWJsaWMgSGFzaE1hcCBnZXRDb250ZW50VHlwZXMoKSB7Ci0JCXJldHVybiBmQ29udGVudFR5cGVzOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZklkLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBmSWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlc3VsdAotCSAqIEBwYXJhbSBlCi0JICovCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJVbmFibGUgdG8gY3JlYXRlIG9wZW4gb246ICIgKyBnZXRJZCgpLCBlKTsgLy8kTk9OLU5MUy0xJAotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9vcGVub24vT3Blbk9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZkOTBiOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvb3Blbm9uL09wZW5PblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLm9wZW5vbjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmc7Ci0KLQotLyoqCi0gKiBEZXRlcm1pbmVzIHRoZSBhcHByb3ByaWF0ZSBJT3Blbk9uIHRvIGNhbGwgYmFzZWQgb24gY3VycmVudCBwYXJ0aXRpb24uCi0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBiYXNlIHN1cHBvcnQgZm9yIGh5cGVybGluayBuYXZpZ2F0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBPcGVuT25Qcm92aWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgT3Blbk9uUHJvdmlkZXIgZkluc3RhbmNlOwotCi0JLyoqCi0JICogcmV0dXJucyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgT3Blbk9uUHJvdmlkZXIKLQkgKiAKLQkgKiBAcmV0dXJuIE9wZW5PblByb3ZpZGVyCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgT3Blbk9uUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7Ci0JCWlmIChmSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZkluc3RhbmNlID0gbmV3IE9wZW5PblByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiBkb2N1bWVudAotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIGRvY3VtZW50IGlzIG5vdCBudWxsCi0JICogQHJldHVybiBTdHJpbmcgY29udGVudCB0eXBlIG9mIGdpdmVuIGRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZShJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCi0JCUlNb2RlbE1hbmFnZXIgbWdyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IG1nci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCXR5cGUgPSBtb2RlbC5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHR5cGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgSU9wZW5PbiBmb3IgdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJT3Blbk9uIGdldE9wZW5PbihJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJSU9wZW5PbiBvcGVuT24gPSBudWxsOwotCi0JCS8vIGRldGVybWluZSB0aGUgY3VycmVudCBwYXJ0aXRpb24KLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBjb250ZW50VHlwZUlEID0gZ2V0Q29udGVudFR5cGUoZG9jdW1lbnQpOwotCQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKGRvY3VtZW50LCBvZmZzZXQpOwotCi0JCQlJQ29udGVudFR5cGUgY29udGVudFR5cGUgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlEKTsKLQotCQkJd2hpbGUgKG9wZW5PbiA9PSBudWxsICYmIGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCQkvLyBRdWVyeSBPcGVuT25CdWlsZGVyIGFuZCBnZXQgdGhlIGxpc3Qgb2YgT3Blbk9ucyBmb3IgdGhlCi0JCQkJLy8gY3VycmVudCBwYXJ0aXRpb24KLQkJCQlPcGVuT25EZWZpbml0aW9uW10gZGVmcyA9IE9wZW5PbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXRPcGVuT25EZWZpbml0aW9ucyhjb250ZW50VHlwZS5nZXRJZCgpLCBwYXJ0aXRpb25UeXBlKTsKLQkJCQljb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlLmdldEJhc2VUeXBlKCk7Ci0KLQkJCQkvLyBJZiBtb3JlIHRoYW4gMSBvcGVub24gaXMgcmV0dXJuZWQsIG5lZWQgdG8gZnVydGhlciBjaGVjawotCQkJCS8vIHdoaWNoIE9wZW5PbiBpcyB0aGUgYXBwcm9wcmlhdGUgb25lIHRvIHJldHVybgotCQkJCS8vIGZvciBub3cganVzdCByZXR1cm5pbmcgdGhlIGZpcnN0IG9uZQotCQkJCWlmIChkZWZzICE9IG51bGwgJiYgZGVmcy5sZW5ndGggPiAwKSB7Ci0JCQkJCW9wZW5PbiA9IGRlZnNbMF0uY3JlYXRlT3Blbk9uKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG9wZW5PbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBwYXJ0aXRpb24gdHlwZSBsb2NhdGVkIGF0IG9mZnNldCBpbiB0aGUgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgYXNzdW1lcyBkb2N1bWVudCBpcyBub3QgbnVsbAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIFN0cmluZyBwYXJ0aXRpb24gdHlwZQotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQpIHsKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQl0cnkgewotCQkJLy8gVE9ETzogcHJvdmlkZSBwYXJ0aXRpb25pbmcgaW5mb3JtYXRpb24gc28gd2UncmUgbm90IHVzaW5nIGEgZGVmYXVsdCBsaWtlIHRoaXMKLQkJCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQl0eXBlID0gVGV4dFV0aWxpdGllcy5nZXRDb250ZW50VHlwZShkb2N1bWVudCwgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgb2Zmc2V0LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJSVR5cGVkUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXR5cGUgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdHlwZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRWRpdG9yUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRWRpdG9yUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMzBjNzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi0vKioKLSAqIFByZWZlcmVuY2Uga2V5cyBmb3IgU1NFIFVJCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0b3JQcmVmZXJlbmNlTmFtZXMgewotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGNvbnRyb2xzIG9uLXRoZS1mbHkgdmFsaWRhdGlvbgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUyA9IGdldEV2YWx1YXRlVGVtcG9yYXJ5UHJvYmxlbXNLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRFdmFsdWF0ZVRlbXBvcmFyeVByb2JsZW1zS2V5KCkgewotCQlyZXR1cm4gImV2YWx1YXRlVGVtcG9yYXJ5UHJvYmxlbXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBicmFja2V0IG1hdGNoaW5nIGhpZ2hsaWdodGluZwotCSAqIGlzIHR1cm5lZCBvbiBvciBvZmYuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUFUQ0hJTkdfQlJBQ0tFVFMgPSBnZXRNYXRjaGluZ0JyYWNrZXRzS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdCcmFja2V0c0tleSgpIHsKLQkJcmV0dXJuICJtYXRjaGluZ0JyYWNrZXRzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjb2xvciB1c2VkIHRvIGhpZ2hsaWdodCBtYXRjaGluZwotCSAqIGJyYWNrZXRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQSBSR0IgY29sb3IgdmFsdWUgZW5jb2RlZCBhcyBhCi0JICogc3RyaW5nIHVzaW5nIGNsYXNzIDxjb2RlPlByZWZlcmVuY2VDb252ZXJ0ZXI8L2NvZGU+Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1BVENISU5HX0JSQUNLRVRTX0NPTE9SID0gZ2V0TWF0Y2hpbmdCcmFja2V0c0NvbG9yS2V5KCk7Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TWF0Y2hpbmdCcmFja2V0c0NvbG9yS2V5KCkgewotCQlyZXR1cm4gIm1hdGNoaW5nQnJhY2tldHNDb2xvciI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBBIG5hbWVkIHByZWZlcmVuY2UgdGhhdCBkZWZpbmVzIHRoZSBrZXkgZm9yIHRoZSBob3ZlciBtb2RpZmllcnMuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMgPSBnZXRUZXh0SG92ZXJNb2RpZmllcnNLZXkoKTsKLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUZXh0SG92ZXJNb2RpZmllcnNLZXkoKSB7Ci0JCXJldHVybiAiaG92ZXJNb2RpZmllcnMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgZGVmaW5lcyByZWFkIG9ubHkgY29udHJhc3Qgc2NhbGUuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9PTkxZX0ZPUkVHUk9VTkRfU0NBTEUgPSBnZXRSZWFkT25seUZvcmVncm91bmRTY2FsZUtleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFJlYWRPbmx5Rm9yZWdyb3VuZFNjYWxlS2V5KCkgewotCQlyZXR1cm4gInJlYWRPbmx5Rm9yZWdyb3VuZFNjYWxlIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGRlZmluZXMgd2hldGhlciBvciBub3QgdG8gc2hvdyBhIG1lc3NhZ2UgZGlhbG9nCi0JICogaW5mb3JtaW5nIHVzZXIgb2YgdW5rbm93biBjb250ZW50IHR5cGUgaW4gZWRpdG9yLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHID0gInNob3dVbmtub3duQ29udGVudFR5cGVNc2ciOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL092ZXJsYXlQcmVmZXJlbmNlU3RvcmUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYwNTRmZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLQotLyoqCi0gKiBBbiBvdmVybGF5aW5nIHByZWZlcmVuY2Ugc3RvcmUuIGNvcGllZCBmcm9tIEpEVAotICovCi1wdWJsaWMgY2xhc3MgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBpbXBsZW1lbnRzIElQcmVmZXJlbmNlU3RvcmUgewotCi0JcHVibGljIHN0YXRpYyBjbGFzcyBPdmVybGF5S2V5IHsKLQotCQlUeXBlRGVzY3JpcHRvciBmRGVzY3JpcHRvcjsKLQkJU3RyaW5nIGZLZXk7Ci0KLQkJcHVibGljIE92ZXJsYXlLZXkoVHlwZURlc2NyaXB0b3IgZGVzY3JpcHRvciwgU3RyaW5nIGtleSkgewotCQkJZkRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotCQkJZktleSA9IGtleTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydHlMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQotCQkvKgotCQkgKiBAc2VlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyI3Byb3BlcnR5Q2hhbmdlKFByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlPdmVybGF5S2V5IGtleSA9IGZpbmRPdmVybGF5S2V5KGV2ZW50LmdldFByb3BlcnR5KCkpOwotCQkJaWYgKGtleSAhPSBudWxsKQotCQkJCXByb3BhZ2F0ZVByb3BlcnR5KGZQYXJlbnQsIGtleSwgZlN0b3JlKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUeXBlRGVzY3JpcHRvciB7Ci0JCXByaXZhdGUgVHlwZURlc2NyaXB0b3IoKSB7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIEJPT0xFQU4gPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIERPVUJMRSA9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgRkxPQVQgPSBuZXcgVHlwZURlc2NyaXB0b3IoKTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGVEZXNjcmlwdG9yIElOVCA9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgTE9ORyA9IG5ldyBUeXBlRGVzY3JpcHRvcigpOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZURlc2NyaXB0b3IgU1RSSU5HID0gbmV3IFR5cGVEZXNjcmlwdG9yKCk7Ci0JcHJpdmF0ZSBib29sZWFuIGZMb2FkZWQ7Ci0JcHJpdmF0ZSBPdmVybGF5S2V5W10gZk92ZXJsYXlLZXlzOwotCi0KLQlJUHJlZmVyZW5jZVN0b3JlIGZQYXJlbnQ7Ci0KLQlwcml2YXRlIFByb3BlcnR5TGlzdGVuZXIgZlByb3BlcnR5TGlzdGVuZXI7Ci0JSVByZWZlcmVuY2VTdG9yZSBmU3RvcmU7Ci0KLQotCXB1YmxpYyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmUgcGFyZW50LCBPdmVybGF5S2V5W10gb3ZlcmxheUtleXMpIHsKLQkJZlBhcmVudCA9IHBhcmVudDsKLQkJZk92ZXJsYXlLZXlzID0gb3ZlcmxheUtleXM7Ci0JCWZTdG9yZSA9IG5ldyBQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5cyB0byBhZGQgdG8gdGhlIGxpc3Qgb2Ygb3ZlcmxheSBrZXlzLgotCSAqIDxwPgotCSAqIE5vdGU6IFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB7QGxpbmsgI2xvYWQoKX1pcyBjYWxsZWQuCi0JICogPC9wPgotCSAqIAotCSAqIEBwYXJhbSBrZXlzCi0JICogQHBsYW5uZWRmb3IgMy4wCi0JICovCi0JcHVibGljIHZvaWQgYWRkS2V5cyhPdmVybGF5S2V5W10ga2V5cykgewotCQlBc3NlcnQuaXNUcnVlKCFmTG9hZGVkKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChrZXlzKTsKLQotCQlpbnQgb3ZlcmxheUtleXNMZW5ndGggPSBmT3ZlcmxheUtleXMubGVuZ3RoOwotCQlPdmVybGF5S2V5W10gcmVzdWx0ID0gbmV3IE92ZXJsYXlLZXlba2V5cy5sZW5ndGggKyBvdmVybGF5S2V5c0xlbmd0aF07Ci0KLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IG92ZXJsYXlLZXlzTGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlyZXN1bHRbaV0gPSBmT3ZlcmxheUtleXNbaV07Ci0KLQkJZm9yIChpbnQgaSA9IDAsIGxlbmd0aCA9IGtleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspCi0JCQlyZXN1bHRbb3ZlcmxheUtleXNMZW5ndGggKyBpXSA9IGtleXNbaV07Ci0KLQkJZk92ZXJsYXlLZXlzID0gcmVzdWx0OwotCi0JCWlmIChmTG9hZGVkKQotCQkJbG9hZCgpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2FkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIpCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgewotCQlmU3RvcmUuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjY29udGFpbnMoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuY29udGFpbnMobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGNvdmVycyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoZmluZE92ZXJsYXlLZXkoa2V5KSAhPSBudWxsKTsKLQl9Ci0KLQlPdmVybGF5S2V5IGZpbmRPdmVybGF5S2V5KFN0cmluZyBrZXkpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmT3ZlcmxheUtleXNbaV0uZktleS5lcXVhbHMoa2V5KSkKLQkJCQlyZXR1cm4gZk92ZXJsYXlLZXlzW2ldOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2ZpcmVQcm9wZXJ0eUNoYW5nZUV2ZW50KFN0cmluZywgT2JqZWN0LCBPYmplY3QpCi0JICovCi0JcHVibGljIHZvaWQgZmlyZVByb3BlcnR5Q2hhbmdlRXZlbnQoU3RyaW5nIG5hbWUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWZTdG9yZS5maXJlUHJvcGVydHlDaGFuZ2VFdmVudChuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEJvb2xlYW4oU3RyaW5nKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRCb29sZWFuKFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0Qm9vbGVhbihTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRCb29sZWFuKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHREb3VibGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0RGVmYXVsdERvdWJsZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHREb3VibGUobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdEZsb2F0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdEZsb2F0KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldERlZmF1bHRJbnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludChTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZlN0b3JlLmdldERlZmF1bHRJbnQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdExvbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBsb25nIGdldERlZmF1bHRMb25nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdExvbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjZ2V0RGVmYXVsdFN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0U3RyaW5nKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RGVmYXVsdFN0cmluZyhuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXREb3VibGUoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBkb3VibGUgZ2V0RG91YmxlKFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0RG91YmxlKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldEZsb2F0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRGbG9hdChuYW1lKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNnZXRJbnQoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0SW50KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiBmU3RvcmUuZ2V0SW50KG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldExvbmcoU3RyaW5nKQotCSAqLwotCXB1YmxpYyBsb25nIGdldExvbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRMb25nKG5hbWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI2dldFN0cmluZyhTdHJpbmcpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5nZXRTdHJpbmcobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjaXNEZWZhdWx0KFN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIGZTdG9yZS5pc0RlZmF1bHQobmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbG9hZCgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlsb2FkUHJvcGVydHkoZlBhcmVudCwgZk92ZXJsYXlLZXlzW2ldLCBmU3RvcmUsIHRydWUpOwotCi0JCWZMb2FkZWQgPSB0cnVlOwotCi0JfQotCi0JcHVibGljIHZvaWQgbG9hZERlZmF1bHRzKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZPdmVybGF5S2V5cy5sZW5ndGg7IGkrKykKLQkJCXNldFRvRGVmYXVsdChmT3ZlcmxheUtleXNbaV0uZktleSk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGxvYWRQcm9wZXJ0eShJUHJlZmVyZW5jZVN0b3JlIG9yZ2luLCBPdmVybGF5S2V5IGtleSwgSVByZWZlcmVuY2VTdG9yZSB0YXJnZXQsIGJvb2xlYW4gZm9yY2VJbml0aWFsaXphdGlvbikgewotCQlUeXBlRGVzY3JpcHRvciBkID0ga2V5LmZEZXNjcmlwdG9yOwotCQlpZiAoQk9PTEVBTiA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgdHJ1ZSk7Ci0JCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yZ2luLmdldEJvb2xlYW4oa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0Qm9vbGVhbihrZXkuZktleSkpOwotCi0JCX0gZWxzZSBpZiAoRE9VQkxFID09IGQpIHsKLQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxLjBEKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0RG91YmxlKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdERvdWJsZShrZXkuZktleSkpOwotCi0JCX0gZWxzZSBpZiAoRkxPQVQgPT0gZCkgewotCi0JCQlpZiAoZm9yY2VJbml0aWFsaXphdGlvbikKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIDEuMEYpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRGbG9hdChrZXkuZktleSkpOwotCQkJdGFyZ2V0LnNldERlZmF1bHQoa2V5LmZLZXksIG9yZ2luLmdldERlZmF1bHRGbG9hdChrZXkuZktleSkpOwotCi0JCX0gZWxzZSBpZiAoSU5UID09IGQpIHsKLQotCQkJaWYgKGZvcmNlSW5pdGlhbGl6YXRpb24pCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCAxKTsKLQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgb3JnaW4uZ2V0SW50KGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdEludChrZXkuZktleSkpOwotCi0JCX0gZWxzZSBpZiAoTE9ORyA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgMUwpOwotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRMb25nKGtleS5mS2V5KSk7Ci0JCQl0YXJnZXQuc2V0RGVmYXVsdChrZXkuZktleSwgb3JnaW4uZ2V0RGVmYXVsdExvbmcoa2V5LmZLZXkpKTsKLQotCQl9IGVsc2UgaWYgKFNUUklORyA9PSBkKSB7Ci0KLQkJCWlmIChmb3JjZUluaXRpYWxpemF0aW9uKQotCQkJCXRhcmdldC5zZXRWYWx1ZShrZXkuZktleSwgIjEiKTsgLy8kTk9OLU5MUy0xJAotCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmdpbi5nZXRTdHJpbmcoa2V5LmZLZXkpKTsKLQkJCXRhcmdldC5zZXREZWZhdWx0KGtleS5mS2V5LCBvcmdpbi5nZXREZWZhdWx0U3RyaW5nKGtleS5mS2V5KSk7Ci0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI25lZWRzU2F2aW5nKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBuZWVkc1NhdmluZygpIHsKLQkJcmV0dXJuIGZTdG9yZS5uZWVkc1NhdmluZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb3BhZ2F0ZSgpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmT3ZlcmxheUtleXMubGVuZ3RoOyBpKyspCi0JCQlwcm9wYWdhdGVQcm9wZXJ0eShmU3RvcmUsIGZPdmVybGF5S2V5c1tpXSwgZlBhcmVudCk7Ci0JfQotCi0Jdm9pZCBwcm9wYWdhdGVQcm9wZXJ0eShJUHJlZmVyZW5jZVN0b3JlIG9yZ2luLCBPdmVybGF5S2V5IGtleSwgSVByZWZlcmVuY2VTdG9yZSB0YXJnZXQpIHsKLQotCQlpZiAob3JnaW4uaXNEZWZhdWx0KGtleS5mS2V5KSkgewotCQkJaWYgKCF0YXJnZXQuaXNEZWZhdWx0KGtleS5mS2V5KSkKLQkJCQl0YXJnZXQuc2V0VG9EZWZhdWx0KGtleS5mS2V5KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCVR5cGVEZXNjcmlwdG9yIGQgPSBrZXkuZkRlc2NyaXB0b3I7Ci0JCWlmIChCT09MRUFOID09IGQpIHsKLQotCQkJYm9vbGVhbiBvcmlnaW5WYWx1ZSA9IG9yZ2luLmdldEJvb2xlYW4oa2V5LmZLZXkpOwotCQkJYm9vbGVhbiB0YXJnZXRWYWx1ZSA9IHRhcmdldC5nZXRCb29sZWFuKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9IGVsc2UgaWYgKERPVUJMRSA9PSBkKSB7Ci0KLQkJCWRvdWJsZSBvcmlnaW5WYWx1ZSA9IG9yZ2luLmdldERvdWJsZShrZXkuZktleSk7Ci0JCQlkb3VibGUgdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0RG91YmxlKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9IGVsc2UgaWYgKEZMT0FUID09IGQpIHsKLQotCQkJZmxvYXQgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRGbG9hdChrZXkuZktleSk7Ci0JCQlmbG9hdCB0YXJnZXRWYWx1ZSA9IHRhcmdldC5nZXRGbG9hdChrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChJTlQgPT0gZCkgewotCi0JCQlpbnQgb3JpZ2luVmFsdWUgPSBvcmdpbi5nZXRJbnQoa2V5LmZLZXkpOwotCQkJaW50IHRhcmdldFZhbHVlID0gdGFyZ2V0LmdldEludChrZXkuZktleSk7Ci0JCQlpZiAodGFyZ2V0VmFsdWUgIT0gb3JpZ2luVmFsdWUpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfSBlbHNlIGlmIChMT05HID09IGQpIHsKLQotCQkJbG9uZyBvcmlnaW5WYWx1ZSA9IG9yZ2luLmdldExvbmcoa2V5LmZLZXkpOwotCQkJbG9uZyB0YXJnZXRWYWx1ZSA9IHRhcmdldC5nZXRMb25nKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBvcmlnaW5WYWx1ZSkKLQkJCQl0YXJnZXQuc2V0VmFsdWUoa2V5LmZLZXksIG9yaWdpblZhbHVlKTsKLQotCQl9IGVsc2UgaWYgKFNUUklORyA9PSBkKSB7Ci0KLQkJCVN0cmluZyBvcmlnaW5WYWx1ZSA9IG9yZ2luLmdldFN0cmluZyhrZXkuZktleSk7Ci0JCQlTdHJpbmcgdGFyZ2V0VmFsdWUgPSB0YXJnZXQuZ2V0U3RyaW5nKGtleS5mS2V5KTsKLQkJCWlmICh0YXJnZXRWYWx1ZSAhPSBudWxsICYmIG9yaWdpblZhbHVlICE9IG51bGwgJiYgIXRhcmdldFZhbHVlLmVxdWFscyhvcmlnaW5WYWx1ZSkpCi0JCQkJdGFyZ2V0LnNldFZhbHVlKGtleS5mS2V5LCBvcmlnaW5WYWx1ZSk7Ci0KLQkJfQotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3B1dFZhbHVlKFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHB1dFZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5wdXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjcmVtb3ZlUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCWZTdG9yZS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0RGVmYXVsdChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0RGVmYXVsdChTdHJpbmcsIGRvdWJsZSkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0KFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgZmxvYXQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldERlZmF1bHQoU3RyaW5nLCBsb25nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXREZWZhdWx0KG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXREZWZhdWx0KFN0cmluZywgU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldERlZmF1bHQobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFRvRGVmYXVsdChTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VG9EZWZhdWx0KFN0cmluZyBuYW1lKSB7Ci0JCWZTdG9yZS5zZXRUb0RlZmF1bHQobmFtZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBib29sZWFuIHZhbHVlKSB7Ci0JCWlmIChjb3ZlcnMobmFtZSkpCi0JCQlmU3RvcmUuc2V0VmFsdWUobmFtZSwgdmFsdWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBJUHJlZmVyZW5jZVN0b3JlI3NldFZhbHVlKFN0cmluZywgZG91YmxlKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyBuYW1lLCBkb3VibGUgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBmbG9hdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgbmFtZSwgZmxvYXQgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGludCB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVByZWZlcmVuY2VTdG9yZSNzZXRWYWx1ZShTdHJpbmcsIGxvbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIGxvbmcgdmFsdWUpIHsKLQkJaWYgKGNvdmVycyhuYW1lKSkKLQkJCWZTdG9yZS5zZXRWYWx1ZShuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElQcmVmZXJlbmNlU3RvcmUjc2V0VmFsdWUoU3RyaW5nLCBTdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgewotCQlpZiAoY292ZXJzKG5hbWUpKQotCQkJZlN0b3JlLnNldFZhbHVlKG5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdGFydCgpIHsKLQkJaWYgKGZQcm9wZXJ0eUxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyID0gbmV3IFByb3BlcnR5TGlzdGVuZXIoKTsKLQkJCWZQYXJlbnQuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzdG9wKCkgewotCQlpZiAoZlByb3BlcnR5TGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZlBhcmVudC5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZQcm9wZXJ0eUxpc3RlbmVyKTsKLQkJCWZQcm9wZXJ0eUxpc3RlbmVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9UYWJGb2xkZXJMYXlvdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9UYWJGb2xkZXJMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiODkwMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvVGFiRm9sZGVyTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxheW91dDsKLQotLyoqCi0gKiBDb3BpZWQgZnJvbSBKRFQKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFRhYkZvbGRlckxheW91dCBleHRlbmRzIExheW91dCB7Ci0KLQlwcm90ZWN0ZWQgUG9pbnQgY29tcHV0ZVNpemUoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgaW50IHdIaW50LCBpbnQgaEhpbnQsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQgJiYgaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQlyZXR1cm4gbmV3IFBvaW50KHdIaW50LCBoSGludCk7Ci0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWludCBjb3VudCA9IGNoaWxkcmVuLmxlbmd0aDsKLQkJaW50IG1heFdpZHRoID0gMCwgbWF4SGVpZ2h0ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlDb250cm9sIGNoaWxkID0gY2hpbGRyZW5baV07Ci0JCQlQb2ludCBwdCA9IGNoaWxkLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCwgZmx1c2hDYWNoZSk7Ci0JCQltYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBwdC54KTsKLQkJCW1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgcHQueSk7Ci0JCX0KLQotCQlpZiAod0hpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQltYXhXaWR0aCA9IHdIaW50OwotCQlpZiAoaEhpbnQgIT0gU1dULkRFRkFVTFQpCi0JCQltYXhIZWlnaHQgPSBoSGludDsKLQotCQlyZXR1cm4gbmV3IFBvaW50KG1heFdpZHRoLCBtYXhIZWlnaHQpOwotCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbGF5b3V0KENvbXBvc2l0ZSBjb21wb3NpdGUsIGJvb2xlYW4gZmx1c2hDYWNoZSkgewotCQlSZWN0YW5nbGUgcmVjdCA9IGNvbXBvc2l0ZS5nZXRDbGllbnRBcmVhKCk7Ci0KLQkJQ29udHJvbFtdIGNoaWxkcmVuID0gY29tcG9zaXRlLmdldENoaWxkcmVuKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKLQkJCWNoaWxkcmVuW2ldLnNldEJvdW5kcyhyZWN0KTsKLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0Q29sb3JQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RDb2xvclBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjODFmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2Nyb2xsZWRDb21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29sb3JQYWdlIGV4dGVuZHMgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSB7Ci0JcHJvdGVjdGVkIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcm90ZWN0ZWQgU3R5bGVkVGV4dENvbG9yUGlja2VyIGZQaWNrZXIgPSBudWxsOwotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29sb3JpbmcgZ3JvdXAgdXNlZCBpbiBjcmVhdGVDb250ZW50cyBUaGlzIG1ldGhvZCBjYW4gYmUKLQkgKiBvdmVyd3JpdHRlbiB0byBzZXQgdGhlIHRleHQgb2YgdGhlIGdyb3VwIG9yIHByb3ZpZGUgYW4gaW5mb3BvcAotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29sb3JpbmdDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgY29sb3JpbmdDb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQkJcmV0dXJuIGNvbG9yaW5nQ29tcG9zaXRlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJLy8gY3JlYXRlIHNjcm9sbGJhcnMgZm9yIHRoaXMgcHJlZmVyZW5jZSBwYWdlIHdoZW4gbmVlZGVkCi0JCWZpbmFsIFNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IG5ldyBTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0JCXNjMS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJQ29tcG9zaXRlIHBhZ2VDb21wb25lbnQgPSBjcmVhdGVDb21wb3NpdGUoc2MxLCAxKTsKLQkJc2MxLnNldENvbnRlbnQocGFnZUNvbXBvbmVudCk7Ci0JCXNldFNpemUocGFnZUNvbXBvbmVudCk7Ci0KLQkJTGFiZWwgZGVzY0xhYmVsID0gY3JlYXRlRGVzY3JpcHRpb25MYWJlbChwYWdlQ29tcG9uZW50LCBTU0VVSU1lc3NhZ2VzLkFic3RyYWN0Q29sb3JQYWdlRGVzY3JpcHRpb24pOyAvLyROT04tTkxTLTEkCi0JCUNvbXBvc2l0ZSBjb2xvcmluZ0NvbXBvc2l0ZSA9IGNyZWF0ZUNvbG9yaW5nQ29tcG9zaXRlKHBhZ2VDb21wb25lbnQpOwotCQljcmVhdGVDb250ZW50c0ZvclBpY2tlcihjb2xvcmluZ0NvbXBvc2l0ZSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSAoR3JpZERhdGEpIGRlc2NMYWJlbC5nZXRMYXlvdXREYXRhKCk7Ci0JCWdkLndpZHRoSGludCA9IChjb2xvcmluZ0NvbXBvc2l0ZS5jb21wdXRlU2l6ZShTV1QuREVGQVVMVCwgU1dULkRFRkFVTFQpKS54OwotCQlzZXRTaXplKHBhZ2VDb21wb25lbnQpOwotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBTdHlsZWRUZXh0Q29sb3JQaWNrZXIgdXNlZCBpbiBjcmVhdGVDb250ZW50cyBUaGlzIG1ldGhvZAotCSAqIGNhbiBiZSBvdmVyd3JpdHRlbiB0byBzZXQgdXAgU3R5bGVkVGV4dENvbG9yUGlja2VyIGRpZmZlcmVudGx5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JQaWNrZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgdGhlIGNvbG9yIHBpY2tlcgotCQlmUGlja2VyID0gbmV3IFN0eWxlZFRleHRDb2xvclBpY2tlcihwYXJlbnQsIFNXVC5OVUxMKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlmUGlja2VyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJZlBpY2tlci5zZXRQcmVmZXJlbmNlU3RvcmUoZk92ZXJsYXlTdG9yZSk7Ci0JCXNldHVwUGlja2VyKGZQaWNrZXIpOwotCi0JCWZQaWNrZXIuc2V0VGV4dChnZXRTYW1wbGVUZXh0KCkpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBkZXNjcmlwdGlvbiBsYWJlbCBkaXNwbGF5ZWQgYXQgdG9wIG9mIHByZWZlcmVuY2UgcGFnZS4gVGhpcwotCSAqIG1ldGhvZC9sYWJlbCBpcyB1c2VkIGluc3RlYWQgb2YgUHJlZmVyZW5jZVBhZ2UncyBkZXNjcmlwdGlvbiBsYWJlbAotCSAqIGJlY2F1c2UgdGhlIFNjcm9sbGVkQ29tcG9zaXRlIGNvbnRhaW5lZCBpbiB0aGlzIHBhZ2Ugd2lsbCBub3QgZnVsbHkKLQkgKiB3b3JrIChob3Jpem9udGFsIHNjcm9sbGluZykgd2l0aCBQcmVmZXJlbmNlUGFnZSdzIGRlc2NyaXB0aW9uIGxhYmVsLgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVEZXNjcmlwdGlvbkxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyBkZXNjcmlwdGlvbikgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUIHwgU1dULldSQVApOwotCQlsYWJlbC5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWRhdGEuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgY29tcG9zaXRlIGNvbnRyb2wgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICovCi0KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBncm91cDsKLQl9Ci0KLQkvKioKLQkgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGNyZWF0ZXMgYSBsYWJlbCBpbnN0YW5jZSBhbmQgc2V0cyB0aGUgZGVmYXVsdAotCSAqIGxheW91dCBkYXRhLgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJbGFiZWwuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZVB1c2hCdXR0b24oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlidXR0b24uc2V0VGV4dChsYWJlbCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIHRleHQgaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0Ci0JICogZGF0YS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJVGV4dCB0ZXh0ZmllbGQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJdGV4dGZpZWxkLnNldFRleHQodGV4dCk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCXRleHRmaWVsZC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gdGV4dGZpZWxkOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQkJaWYgKGZQaWNrZXIgIT0gbnVsbCAmJiAhZlBpY2tlci5pc0Rpc3Bvc2VkKCkpCi0JCQlmUGlja2VyLnJlbGVhc2VQaWNrZXJSZXNvdXJjZXMoKTsKLQkJaWYgKGZPdmVybGF5U3RvcmUgIT0gbnVsbCkgewotCQkJZk92ZXJsYXlTdG9yZS5zdG9wKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3R5bGVkVGV4dENvbG9yUGlja2VyIGdldFBpY2tlcigpIHsKLQkJcmV0dXJuIGZQaWNrZXI7Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRTYW1wbGVUZXh0KCk7Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplcyB0aGlzIHByZWZlcmVuY2UgcGFnZSBmb3IgdGhlIGdpdmVuIHdvcmtiZW5jaC4KLQkgKiA8cD4KLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSBhcyB0aGUgcHJlZmVyZW5jZSBwYWdlIGlzIGJlaW5nCi0JICogY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQuIENsaWVudHMgbXVzdCBub3QgY2FsbCB0aGlzIG1ldGhvZC4KLQkgKiA8L3A+Ci0JICogCi0JICogQHBhcmFtIHdvcmtiZW5jaAotCSAqICAgICAgICAgICAgdGhlIHdvcmtiZW5jaAotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSVdvcmtiZW5jaCB3b3JrYmVuY2gpIHsKLQkJZk92ZXJsYXlTdG9yZSA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlKGdldFByZWZlcmVuY2VTdG9yZSgpLCBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkpOwotCQlmT3ZlcmxheVN0b3JlLmxvYWQoKTsKLQkJZk92ZXJsYXlTdG9yZS5zdGFydCgpOwotCX0KLQotCS8qKgotCSAqIEluaXRpYWxpemVzIHN0YXRlcyBvZiB0aGUgY29udHJvbHMgdXNpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlCi0JICogcHJlZmVyZW5jZSBzdG9yZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZPdmVybGF5U3RvcmUubG9hZERlZmF1bHRzKCk7Ci0JCWZQaWNrZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZk92ZXJsYXlTdG9yZS5wcm9wYWdhdGUoKTsKLQkJIHNhdmVQcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgc2F2ZVByZWZlcmVuY2VzKCkgewotCQkvLyBzYXZlIHBsdWdpbiBwcmVmZXJlbmNlcyBoZXJlCi0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc2l6ZSBvZiBjb21wb3NpdGUgdG8gdGhlIGRlZmF1bHQgdmFsdWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBOb3RlOiBUaGUgZm9udCBpcyBzZXQgaGVyZSBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgY2xhc3MgaW5oZXJpdGluZwotCQkJLy8gICAgICAgdGhpcyBiYXNlIGNsYXNzIG1heSBhZGQgd2lkZ2V0cyB0byB0aGUgZGlhbG9nLiAgIHNldFNpemUKLQkJCS8vICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHdlIGdvIGxpdmUuCi0JCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0Ci0JCQkvLyBoYXMgc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcik7Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSkgewotCQlib29sZWFuIGRvU2hyaW5rID0gZmFsc2U7Ci0JCS8vIGxpbWl0ZXIsIGZvciB0aGUgcmVhbGx5IGh1Z2UgZm9udHMKLQkJaWYgKHZpc2libGUpIHsKLQkJCWdldFBpY2tlcigpLnJlZnJlc2goKTsKLQkJCWludCB4ID0gTWF0aC5taW4oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngsIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoICogOSAvIDEwKTsKLQkJCWludCB5ID0gTWF0aC5taW4oZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLnksIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCAqIDkgLyAxMCk7Ci0JCQlib29sZWFuIHNocmlua1dpZHRoID0gKHggIT0gZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkuZ2V0U2l6ZSgpLngpOwotCQkJYm9vbGVhbiBzaHJpbmtIZWlnaHQgPSAoeSAhPSBnZXRDb250cm9sKCkuZ2V0U2hlbGwoKS5nZXRTaXplKCkueSk7Ci0JCQlkb1NocmluayA9IHNocmlua1dpZHRoIHx8IHNocmlua0hlaWdodDsKLQkJCWlmIChkb1NocmluaykgewotCQkJCS8vIG1vZGlmeSBqdXN0IHRoZSBoZWlnaHQKLQkJCQlpZiAoc2hyaW5rSGVpZ2h0ICYmICFzaHJpbmtXaWR0aCkKLQkJCQkJZ2V0U2hlbGwoKS5zZXRCb3VuZHMoZ2V0U2hlbGwoKS5nZXRMb2NhdGlvbigpLngsIDAsIGdldFNoZWxsKCkuZ2V0U2l6ZSgpLngsIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLmhlaWdodCk7Ci0JCQkJLy8gbW9kaWZ5IGp1c3QgdGhlIHdpZHRoCi0JCQkJZWxzZSBpZiAoIXNocmlua0hlaWdodCAmJiBzaHJpbmtXaWR0aCkKLQkJCQkJZ2V0U2hlbGwoKS5zZXRCb3VuZHMoMCwgZ2V0U2hlbGwoKS5nZXRMb2NhdGlvbigpLnksIGdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuZ2V0Q2xpZW50QXJlYSgpLndpZHRoLCBnZXRTaGVsbCgpLmdldFNpemUoKS55KTsKLQkJCQkvLyBjaGFuZ2UgdGhlIGVudGlyZSBzaGVsbCBzaXplIHRvIG9ubHkgZmlsbCB0aGUgZGlzcGxheSwgYW5kCi0JCQkJLy8gbW92ZSBpdCB0byB0aGUgb3JpZ2luCi0JCQkJZWxzZQotCQkJCQlnZXRTaGVsbCgpLnNldEJvdW5kcygwLCAwLCBnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLmdldENsaWVudEFyZWEoKS53aWR0aCwgZ2V0Q29udHJvbCgpLmdldERpc3BsYXkoKS5nZXRDbGllbnRBcmVhKCkuaGVpZ2h0KTsKLQkJCX0KLQkJfQotCQlzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQlpZiAoZG9TaHJpbmspIHsKLQkJCWdldENvbnRyb2woKS5nZXRTaGVsbCgpLnJlZHJhdygpOwotCQkJZ2V0Q29udHJvbCgpLmdldFNoZWxsKCkudXBkYXRlKCk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNlOWU5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkJ1c3lJbmRpY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiAocGEpIHdoeSBpcyB0aGlzIGNsYXNzIGFic3RyYWN0IGlmIHRoZXJlIGFyZSBubyBhYnN0cmFjdCBtZXRob2RzPwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyLCBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBpbnQgV0lEVEhfVkFMSURBVElPTl9MT1dFUl9MSU1JVCA9IDA7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIGludCBXSURUSF9WQUxJREFUSU9OX1VQUEVSX0xJTUlUID0gOTk5OyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgQnV0dG9uIGNyZWF0ZUNoZWNrQm94KENvbXBvc2l0ZSBncm91cCwgU3RyaW5nIGxhYmVsKSB7Ci0JCUJ1dHRvbiBidXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuQ0hFQ0sgfCBTV1QuTEVGVCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAwOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXJldHVybiBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShwYXJlbnQpOwotCX0KLQotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVEcm9wRG93bkJveChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbWJvIGNvbWJvQm94ID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQljb21ib0JveC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBjb21ib0JveDsKLQl9Ci0KLQlwcm90ZWN0ZWQgR3JvdXAgY3JlYXRlR3JvdXAoQ29tcG9zaXRlIHBhcmVudCwgaW50IG51bUNvbHVtbnMpIHsKLQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlncm91cC5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlncm91cC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBncm91cDsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTGFiZWwoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIHRleHQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTEVGVCk7Ci0JCWxhYmVsLnNldFRleHQodGV4dCk7Ci0KLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlUmFkaW9CdXR0b24oQ29tcG9zaXRlIGdyb3VwLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5DRU5URVI7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBidXR0b247Ci0JfQotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjcmVhdGVTY3JvbGxlZENvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCS8vIGNyZWF0ZSBzY3JvbGxiYXJzIGZvciB0aGlzIHBhcmVudCB3aGVuIG5lZWRlZAotCQlmaW5hbCBTY3JvbGxlZENvbXBvc2l0ZSBzYzEgPSBuZXcgU2Nyb2xsZWRDb21wb3NpdGUocGFyZW50LCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwpOwotCQlzYzEuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUoc2MxLCAxKTsKLQkJc2MxLnNldENvbnRlbnQoY29tcG9zaXRlKTsKLQotCQkvLyBub3QgY2FsbGluZyBzZXRTaXplIGZvciBjb21wb3NpdGUgd2lsbCByZXN1bHQgaW4gYSBibGFuayBjb21wb3NpdGUsCi0JCS8vIHNvIGNhbGxpbmcgaXQgaGVyZSBpbml0aWFsbHkKLQkJLy8gc2V0U2l6ZSBhY3R1YWxseSBuZWVkcyB0byBiZSBjYWxsZWQgYWZ0ZXIgYWxsIGNvbnRyb2xzIGFyZSBjcmVhdGVkLAotCQkvLyBzbyBzY3JvbGxlZENvbXBvc2l0ZQotCQkvLyBoYXMgY29ycmVjdCBtaW5TaXplCi0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlU2VwYXJhdG9yKENvbXBvc2l0ZSBwYXJlbnQsIGludCBjb2x1bW5TcGFuKSB7Ci0JCS8vIENyZWF0ZSBhIHNwYWNlciBsaW5lCi0JCUxhYmVsIHNlcGFyYXRvciA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0KLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTEwpOwotCQlkYXRhLnZlcnRpY2FsQWxpZ25tZW50ID0gR3JpZERhdGEuQ0VOVEVSOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxTcGFuID0gY29sdW1uU3BhbjsKLQotCQlzZXBhcmF0b3Iuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIHNlcGFyYXRvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCkgewotCQlUZXh0IHRleHQgPSBuZXcgVGV4dChwYXJlbnQsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQotCQkvL0dyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkNFTlRFUjsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVZhbHVlcygpIHsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gbG9hZFByZWZlcmVuY2VzKCkgewotCQlCdXN5SW5kaWNhdG9yLnNob3dXaGlsZShnZXRDb250cm9sKCkuZ2V0RGlzcGxheSgpLCBuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaW5pdGlhbGl6ZVZhbHVlcygpOwotCQkJCXZhbGlkYXRlVmFsdWVzKCk7Ci0JCQkJZW5hYmxlVmFsdWVzKCk7Ci0JCQl9Ci0JCX0pOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJLy8gSWYgd2UgYXJlIGNhbGxlZCB0b28gZWFybHksIGkuZS4gYmVmb3JlIHRoZSBjb250cm9scyBhcmUgY3JlYXRlZAotCQkvLyB0aGVuIHJldHVybgotCQkvLyB0byBhdm9pZCBudWxsIHBvaW50ZXIgZXhjZXB0aW9ucwotCQlpZiAoZS53aWRnZXQgIT0gbnVsbCAmJiBlLndpZGdldC5pc0Rpc3Bvc2VkKCkpCi0JCQlyZXR1cm47Ci0KLQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJZW5hYmxlVmFsdWVzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCXNhdmVQcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBzYXZlUHJlZmVyZW5jZXMoKSB7Ci0JCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGdldENvbnRyb2woKS5nZXREaXNwbGF5KCksIG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlzdG9yZVZhbHVlcygpOwotCQkJfQotCQl9KTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0SW52YWxpZElucHV0TWVzc2FnZShTdHJpbmcgd2lkdGhUZXh0KSB7Ci0JCVN0cmluZyBtc2cgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLl80Y29uY2F0LCAobmV3IE9iamVjdFtde3dpZHRoVGV4dH0pKTsKLQkJc2V0RXJyb3JNZXNzYWdlKG1zZyk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0U2l6ZShDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0JCWlmIChjb21wb3NpdGUgIT0gbnVsbCkgewotCQkJLy8gTm90ZTogVGhlIGZvbnQgaXMgc2V0IGhlcmUgaW4gYW50aWNpcGF0aW9uIHRoYXQgdGhlIGNsYXNzIGluaGVyaXRpbmcKLQkJCS8vICAgICAgIHRoaXMgYmFzZSBjbGFzcyBtYXkgYWRkIHdpZGdldHMgdG8gdGhlIGRpYWxvZy4gICBzZXRTaXplCi0JCQkvLyAgICAgICBpcyBhc3N1bWVkIHRvIGJlIGNhbGxlZCBqdXN0IGJlZm9yZSB3ZSBnbyBsaXZlLgotCQkJYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0JCQlQb2ludCBtaW5TaXplID0gY29tcG9zaXRlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQljb21wb3NpdGUuc2V0U2l6ZShtaW5TaXplKTsKLQkJCS8vIHNldCBzY3JvbGxiYXIgY29tcG9zaXRlJ3MgbWluIHNpemUgc28gcGFnZSBpcyBleHBhbmRhYmxlIGJ1dAotCQkJLy8gaGFzIHNjcm9sbGJhcnMgd2hlbiBuZWVkZWQKLQkJCWlmIChjb21wb3NpdGUuZ2V0UGFyZW50KCkgaW5zdGFuY2VvZiBTY3JvbGxlZENvbXBvc2l0ZSkgewotCQkJCVNjcm9sbGVkQ29tcG9zaXRlIHNjMSA9IChTY3JvbGxlZENvbXBvc2l0ZSkgY29tcG9zaXRlLmdldFBhcmVudCgpOwotCQkJCXNjMS5zZXRNaW5TaXplKG1pblNpemUpOwotCQkJCXNjMS5zZXRFeHBhbmRIb3Jpem9udGFsKHRydWUpOwotCQkJCXNjMS5zZXRFeHBhbmRWZXJ0aWNhbCh0cnVlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJd2lkZ2V0U2VsZWN0ZWQoZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkvLyBJZiB3ZSBhcmUgY2FsbGVkIHRvbyBlYXJseSwgaS5lLiBiZWZvcmUgdGhlIGNvbnRyb2xzIGFyZSBjcmVhdGVkCi0JCS8vIHRoZW4gcmV0dXJuCi0JCS8vIHRvIGF2b2lkIG51bGwgcG9pbnRlciBleGNlcHRpb25zCi0JCWlmIChlLndpZGdldCAhPSBudWxsICYmIGUud2lkZ2V0LmlzRGlzcG9zZWQoKSkKLQkJCXJldHVybjsKLQotCQl2YWxpZGF0ZVZhbHVlcygpOwotCQllbmFibGVWYWx1ZXMoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQWJzdHJhY3RQcmVmZXJlbmNlVGFiLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0MDFmM2YuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0Fic3RyYWN0UHJlZmVyZW5jZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci0KLS8qKgotICogR2VuZXJpYyBwcmVmZXJlbmNlIHRhYiBwYWdlIHRoYXQgY29udGFpbnMgaGVscGZ1bCBtZXRob2RzCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0UHJlZmVyZW5jZVRhYiBpbXBsZW1lbnRzIElQcmVmZXJlbmNlVGFiIHsKLQotCU1hcCBmQ2hlY2tCb3hlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmQ2hlY2tCb3hMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGJ1dHRvbiksIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9OwotCXByaXZhdGUgUHJlZmVyZW5jZVBhZ2UgZk1haW5QcmVmZXJlbmNlUGFnZTsKLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGZOdW1iZXJGaWVsZExpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCW51bWJlckZpZWxkQ2hhbmdlZCgoVGV4dCkgZS53aWRnZXQpOwotCQl9Ci0JfTsKLQlwcml2YXRlIEFycmF5TGlzdCBmTnVtYmVyRmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUgZk92ZXJsYXlTdG9yZTsKLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGZUZXh0RmllbGRMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlUZXh0IHRleHQgPSAoVGV4dCkgZS53aWRnZXQ7Ci0JCQlmT3ZlcmxheVN0b3JlLnNldFZhbHVlKChTdHJpbmcpIGZUZXh0RmllbGRzLmdldCh0ZXh0KSwgdGV4dC5nZXRUZXh0KCkpOwotCQl9Ci0JfTsKLQlNYXAgZlRleHRGaWVsZHMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBhZGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBrZXksIGludCBpbmRlbnRhdGlvbikgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dChsYWJlbCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gaW5kZW50YXRpb247Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGZDaGVja0JveExpc3RlbmVyKTsKLQotCQlmQ2hlY2tCb3hlcy5wdXQoY2hlY2tCb3gsIGtleSk7Ci0KLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gYXJyYXkgb2Ygc2l6ZSAyOiAtIGZpcnN0IGVsZW1lbnQgaXMgb2YgdHlwZQotCSAqIDxjb2RlPkxhYmVsPC9jb2RlPi0gc2Vjb25kIGVsZW1lbnQgaXMgb2YgdHlwZSA8Y29kZT5UZXh0PC9jb2RlPgotCSAqIFVzZSA8Y29kZT5nZXRMYWJlbENvbnRyb2w8L2NvZGU+IGFuZCA8Y29kZT5nZXRUZXh0Q29udHJvbDwvY29kZT4gdG8KLQkgKiBnZXQgdGhlIDIgY29udHJvbHMuCi0JICovCi0JcHJpdmF0ZSBDb250cm9sW10gYWRkTGFiZWxsZWRUZXh0RmllbGQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5LCBpbnQgdGV4dExpbWl0LCBpbnQgaW5kZW50YXRpb24sIGJvb2xlYW4gaXNOdW1iZXIpIHsKLQkJTGFiZWwgbGFiZWxDb250cm9sID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYWJlbENvbnRyb2wuc2V0VGV4dChsYWJlbCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2QuaG9yaXpvbnRhbEluZGVudCA9IGluZGVudGF0aW9uOwotCQlsYWJlbENvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJVGV4dCB0ZXh0Q29udHJvbCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5TSU5HTEUpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0JFR0lOTklORyk7Ci0JCWdkLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyh0ZXh0Q29udHJvbCwgdGV4dExpbWl0ICsgMSk7Ci0JCXRleHRDb250cm9sLnNldExheW91dERhdGEoZ2QpOwotCQl0ZXh0Q29udHJvbC5zZXRUZXh0TGltaXQodGV4dExpbWl0KTsKLQkJZlRleHRGaWVsZHMucHV0KHRleHRDb250cm9sLCBrZXkpOwotCQlpZiAoaXNOdW1iZXIpIHsKLQkJCWZOdW1iZXJGaWVsZHMuYWRkKHRleHRDb250cm9sKTsKLQkJCXRleHRDb250cm9sLmFkZE1vZGlmeUxpc3RlbmVyKGZOdW1iZXJGaWVsZExpc3RlbmVyKTsKLQkJfSBlbHNlIHsKLQkJCXRleHRDb250cm9sLmFkZE1vZGlmeUxpc3RlbmVyKGZUZXh0RmllbGRMaXN0ZW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gbmV3IENvbnRyb2xbXXtsYWJlbENvbnRyb2wsIHRleHRDb250cm9sfTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBhZGRUZXh0RmllbGQoQ29tcG9zaXRlIGNvbXBvc2l0ZSwgU3RyaW5nIGxhYmVsLCBTdHJpbmcga2V5LCBpbnQgdGV4dExpbWl0LCBpbnQgaW5kZW50YXRpb24sIGJvb2xlYW4gaXNOdW1iZXIpIHsKLQkJcmV0dXJuIGdldFRleHRDb250cm9sKGFkZExhYmVsbGVkVGV4dEZpZWxkKGNvbXBvc2l0ZSwgbGFiZWwsIGtleSwgdGV4dExpbWl0LCBpbmRlbnRhdGlvbiwgaXNOdW1iZXIpKTsKLQl9Ci0KLQkvKioKLQkgKiBBcHBsaWVzIHRoZSBzdGF0dXMgdG8gdGhlIHN0YXR1cyBsaW5lIG9mIGEgZGlhbG9nIHBhZ2UuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFwcGx5VG9TdGF0dXNMaW5lKElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLk9LIDoKLQkJCQlmTWFpblByZWZlcmVuY2VQYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJCQlmTWFpblByZWZlcmVuY2VQYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQlmTWFpblByZWZlcmVuY2VQYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQlmTWFpblByZWZlcmVuY2VQYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQlmTWFpblByZWZlcmVuY2VQYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZiAobWVzc2FnZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCW1lc3NhZ2UgPSBudWxsOwotCQkJCX0KLQkJCQlmTWFpblByZWZlcmVuY2VQYWdlLnNldE1lc3NhZ2UobnVsbCk7Ci0JCQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHdpZHRoIG9mIHRoZSBnaXZlbgotCSAqIG51bWJlciBvZiBjaGFyYWN0ZXJzLiBUaGlzIG1ldGhvZCB3YXMgY29waWVkIGZyb20KLQkgKiBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZ1BhZ2UKLQkgKiA8cD4KLQkgKiAKLQkgKiBAcGFyYW0gYQotCSAqICAgICAgICAgICAgY29udHJvbCBpbiB0aGUgcGFnZQotCSAqIEBwYXJhbSBjaGFycwotCSAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzCi0JICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHBpeGVscwotCSAqLwotCXByaXZhdGUgaW50IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscyhDb250cm9sIHRlc3RDb250cm9sLCBpbnQgY2hhcnMpIHsKLQkJLy8gQ29tcHV0ZSBhbmQgc3RvcmUgYSBmb250IG1ldHJpYwotCQlHQyBnYyA9IG5ldyBHQyh0ZXN0Q29udHJvbCk7Ci0JCWdjLnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0RGlhbG9nRm9udCgpKTsKLQkJRm9udE1ldHJpY3MgZm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQlnYy5kaXNwb3NlKCk7Ci0KLQkJLy8gdGVzdCBmb3IgZmFpbHVyZSB0byBpbml0aWFsaXplIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0JCWlmIChmb250TWV0cmljcyA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBEaWFsb2cuY29udmVydFdpZHRoSW5DaGFyc1RvUGl4ZWxzKGZvbnRNZXRyaWNzLCBjaGFycyk7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmTWFpblByZWZlcmVuY2VQYWdlLgotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlUGFnZSBnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXJldHVybiBmTWFpblByZWZlcmVuY2VQYWdlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZk92ZXJsYXlTdG9yZS4KLQkgKi8KLQlwcm90ZWN0ZWQgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBnZXRPdmVybGF5U3RvcmUoKSB7Ci0JCXJldHVybiBmT3ZlcmxheVN0b3JlOwotCX0KLQotCXByaXZhdGUgVGV4dCBnZXRUZXh0Q29udHJvbChDb250cm9sW10gbGFiZWxsZWRUZXh0RmllbGQpIHsKLQkJcmV0dXJuIChUZXh0KSBsYWJlbGxlZFRleHRGaWVsZFsxXTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgewotCQlJdGVyYXRvciBlID0gZkNoZWNrQm94ZXMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlCdXR0b24gYiA9IChCdXR0b24pIGUubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGZDaGVja0JveGVzLmdldChiKTsKLQkJCWIuc2V0U2VsZWN0aW9uKGZPdmVybGF5U3RvcmUuZ2V0Qm9vbGVhbihrZXkpKTsKLQkJfQotCi0JCWUgPSBmVGV4dEZpZWxkcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCVRleHQgdCA9IChUZXh0KSBlLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBmVGV4dEZpZWxkcy5nZXQodCk7Ci0JCQl0LnNldFRleHQoZk92ZXJsYXlTdG9yZS5nZXRTdHJpbmcoa2V5KSk7Ci0JCX0KLQl9Ci0KLQl2b2lkIG51bWJlckZpZWxkQ2hhbmdlZChUZXh0IHRleHRDb250cm9sKSB7Ci0JCVN0cmluZyBudW1iZXIgPSB0ZXh0Q29udHJvbC5nZXRUZXh0KCk7Ci0JCUlTdGF0dXMgc3RhdHVzID0gdmFsaWRhdGVQb3NpdGl2ZU51bWJlcihudW1iZXIpOwotCQlpZiAoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKQotCQkJZk92ZXJsYXlTdG9yZS5zZXRWYWx1ZSgoU3RyaW5nKSBmVGV4dEZpZWxkcy5nZXQodGV4dENvbnRyb2wpLCBudW1iZXIpOwotCQl1cGRhdGVTdGF0dXMoc3RhdHVzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbWFpblByZWZlcmVuY2VQYWdlCi0JICogICAgICAgICAgICBUaGUgZk1haW5QcmVmZXJlbmNlUGFnZSB0byBzZXQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TWFpblByZWZlcmVuY2VQYWdlKFByZWZlcmVuY2VQYWdlIG1haW5QcmVmZXJlbmNlUGFnZSkgewotCQlmTWFpblByZWZlcmVuY2VQYWdlID0gbWFpblByZWZlcmVuY2VQYWdlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvdmVybGF5U3RvcmUKLQkgKiAgICAgICAgICAgIFRoZSBmT3ZlcmxheVN0b3JlIHRvIHNldC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPdmVybGF5U3RvcmUoT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBvdmVybGF5U3RvcmUpIHsKLQkJZk92ZXJsYXlTdG9yZSA9IG92ZXJsYXlTdG9yZTsKLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgc3RhdHVzIG9mIG1haW4gcHJlZmVyZW5jZSBwYWdlCi0JICogCi0JICogQHBhcmFtIHN0YXR1cwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVN0YXR1cyhJU3RhdHVzIHN0YXR1cykgewotCQlpZiAoIXN0YXR1cy5tYXRjaGVzKElTdGF0dXMuRVJST1IpKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZOdW1iZXJGaWVsZHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgZk51bWJlckZpZWxkcy5nZXQoaSk7Ci0JCQkJSVN0YXR1cyBzID0gdmFsaWRhdGVQb3NpdGl2ZU51bWJlcih0ZXh0LmdldFRleHQoKSk7Ci0JCQkJc3RhdHVzID0gcy5nZXRTZXZlcml0eSgpID4gc3RhdHVzLmdldFNldmVyaXR5KCkgPyBzIDogc3RhdHVzOwotCQkJfQotCQl9Ci0KLQkJZk1haW5QcmVmZXJlbmNlUGFnZS5zZXRWYWxpZCghc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpOwotCQlhcHBseVRvU3RhdHVzTGluZShzdGF0dXMpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVBvc2l0aXZlTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKLQkJU3RhdHVzSW5mbyBzdGF0dXMgPSBuZXcgU3RhdHVzSW5mbygpOwotCQlpZiAobnVtYmVyLmxlbmd0aCgpID09IDApIHsKLQkJCXN0YXR1cy5zZXRFcnJvcihTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzcpOwotCQl9IGVsc2UgewotCQkJdHJ5IHsKLQkJCQlpbnQgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KG51bWJlcik7Ci0JCQkJaWYgKHZhbHVlIDwgMCkKLQkJCQkJc3RhdHVzLnNldEVycm9yKG51bWJlciArIFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOCk7Ci0JCQl9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotCQkJCXN0YXR1cy5zZXRFcnJvcihudW1iZXIgKyBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2NGQ2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFDQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUNvbnRyb2xFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkRpc3Bvc2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29sb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLQotLyoqCi0gKiBBICJidXR0b24iIG9mIGEgY2VydGFpbiBjb2xvciBkZXRlcm1pbmVkIGJ5IHRoZSBjb2xvciBwaWNrZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2xvckVkaXRvciB7Ci0JQnV0dG9uIGZCdXR0b247Ci0JQ29sb3IgZkNvbG9yOwotCVJHQiBmQ29sb3JWYWx1ZTsKLQotCXByaXZhdGUgUG9pbnQgZkV4dGVudDsKLQlJbWFnZSBmSW1hZ2U7Ci0KLQlwdWJsaWMgQ29sb3JFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCWZCdXR0b24gPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULlBVU0gpOwotCQlmRXh0ZW50ID0gY29tcHV0ZUltYWdlU2l6ZShwYXJlbnQpOwotCQlmSW1hZ2UgPSBuZXcgSW1hZ2UocGFyZW50LmdldERpc3BsYXkoKSwgZkV4dGVudC54LCBmRXh0ZW50LnkpOwotCi0JCUdDIGdjID0gbmV3IEdDKGZJbWFnZSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZkJ1dHRvbi5nZXRCYWNrZ3JvdW5kKCkpOwotCQlnYy5maWxsUmVjdGFuZ2xlKDAsIDAsIGZFeHRlbnQueCwgZkV4dGVudC55KTsKLQkJZ2MuZGlzcG9zZSgpOwotCi0JCWZCdXR0b24uc2V0SW1hZ2UoZkltYWdlKTsKLQotCQkvLyBidWcyNTQxIC0gYXNzb2NpYXRlIGNvbG9yIHZhbHVlIHRvIGJ1dHRvbidzIHZhbHVlIGZpZWxkCi0JCWZCdXR0b24uZ2V0QWNjZXNzaWJsZSgpLmFkZEFjY2Vzc2libGVDb250cm9sTGlzdGVuZXIobmV3IEFjY2Vzc2libGVDb250cm9sQWRhcHRlcigpIHsKLQkJCS8qKgotCQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIjZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJCWlmIChnZXRDb2xvclZhbHVlKCkgIT0gbnVsbCkKLQkJCQkJCWUucmVzdWx0ID0gZ2V0Q29sb3JWYWx1ZSgpLnRvU3RyaW5nKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWUucmVzdWx0ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJCUNvbG9yRGlhbG9nIGNvbG9yRGlhbG9nID0gbmV3IENvbG9yRGlhbG9nKGZCdXR0b24uZ2V0U2hlbGwoKSk7Ci0JCQkJY29sb3JEaWFsb2cuc2V0UkdCKGZDb2xvclZhbHVlKTsKLQkJCQlSR0IgbmV3Q29sb3IgPSBjb2xvckRpYWxvZy5vcGVuKCk7Ci0JCQkJaWYgKG5ld0NvbG9yICE9IG51bGwpIHsKLQkJCQkJZkNvbG9yVmFsdWUgPSBuZXdDb2xvcjsKLQkJCQkJdXBkYXRlQ29sb3JJbWFnZSgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJZkJ1dHRvbi5hZGREaXNwb3NlTGlzdGVuZXIobmV3IERpc3Bvc2VMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldERpc3Bvc2VkKERpc3Bvc2VFdmVudCBldmVudCkgewotCQkJCWlmIChmSW1hZ2UgIT0gbnVsbCkgewotCQkJCQlmSW1hZ2UuZGlzcG9zZSgpOwotCQkJCQlmSW1hZ2UgPSBudWxsOwotCQkJCX0KLQkJCQlpZiAoZkNvbG9yICE9IG51bGwpIHsKLQkJCQkJZkNvbG9yLmRpc3Bvc2UoKTsKLQkJCQkJZkNvbG9yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByb3RlY3RlZCBQb2ludCBjb21wdXRlSW1hZ2VTaXplKENvbnRyb2wgd2luZG93KSB7Ci0JCUdDIGdjID0gbmV3IEdDKHdpbmRvdyk7Ci0JCUZvbnQgZiA9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5ERUZBVUxUX0ZPTlQpOwotCQlnYy5zZXRGb250KGYpOwotCQlpbnQgaGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlQb2ludCBwID0gbmV3IFBvaW50KGhlaWdodCAqIDMgLSA2LCBoZWlnaHQpOwotCQlyZXR1cm4gcDsKLQl9Ci0KLQlwdWJsaWMgQnV0dG9uIGdldEJ1dHRvbigpIHsKLQkJcmV0dXJuIGZCdXR0b247Ci0JfQotCi0JcHVibGljIFJHQiBnZXRDb2xvclZhbHVlKCkgewotCQlyZXR1cm4gZkNvbG9yVmFsdWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29sb3JWYWx1ZShSR0IgcmdiKSB7Ci0JCWZDb2xvclZhbHVlID0gcmdiOwotCQl1cGRhdGVDb2xvckltYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ29sb3JJbWFnZSgpIHsKLQotCQlEaXNwbGF5IGRpc3BsYXkgPSBmQnV0dG9uLmdldERpc3BsYXkoKTsKLQotCQlHQyBnYyA9IG5ldyBHQyhmSW1hZ2UpOwotCQlnYy5zZXRGb3JlZ3JvdW5kKGRpc3BsYXkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCWdjLmRyYXdSZWN0YW5nbGUoMCwgMiwgZkV4dGVudC54IC0gMSwgZkV4dGVudC55IC0gNCk7Ci0KLQkJaWYgKGZDb2xvciAhPSBudWxsKQotCQkJZkNvbG9yLmRpc3Bvc2UoKTsKLQotCQlmQ29sb3IgPSBuZXcgQ29sb3IoZGlzcGxheSwgZkNvbG9yVmFsdWUpOwotCQlnYy5zZXRCYWNrZ3JvdW5kKGZDb2xvcik7Ci0JCWdjLmZpbGxSZWN0YW5nbGUoMSwgMywgZkV4dGVudC54IC0gMiwgZkV4dGVudC55IC0gNSk7Ci0JCWdjLmRpc3Bvc2UoKTsKLQotCQlmQnV0dG9uLnNldEltYWdlKGZJbWFnZSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThhZWZkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvQ29sb3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDb2xvckhlbHBlciB7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQk9MRCA9ICJib2xkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkFNRSA9ICJuYW1lIjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNUWUxFX1NFUEFSQVRPUiA9ICJ8IjsgLy8kTk9OLU5MUy0xJCAKLQotCS8qKgotCSAqIFJldHVybiBhbiBSR0IgU3RyaW5nIGdpdmVuIHRoZSBpbnQgciwgZywgYiB2YWx1ZXMKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRDb2xvclN0cmluZyhpbnQgciwgaW50IGcsIGludCBiKSB7Ci0JCXJldHVybiAiIyIgKyBnZXRIZXhTdHJpbmcociwgMikgKyBnZXRIZXhTdHJpbmcoZywgMikgKyBnZXRIZXhTdHJpbmcoYiwgMik7Ly8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRIZXhTdHJpbmcoaW50IHZhbHVlLCBpbnQgbWluV2lkdGgpIHsKLQkJU3RyaW5nIGhleFN0cmluZyA9IEludGVnZXIudG9IZXhTdHJpbmcodmFsdWUpOwotCQlmb3IgKGludCBpID0gaGV4U3RyaW5nLmxlbmd0aCgpOyBpIDwgbWluV2lkdGg7IGkrKykgewotCQkJaGV4U3RyaW5nID0gIjAiICsgaGV4U3RyaW5nOy8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaGV4U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlcyBhIHByZWZlcmVuY2Ugc3RyaW5nIHRvIGJlIHBsYWNlZCBpbiBwcmVmZXJlbmNlcyBmcm9tIHRoZQotCSAqIGdpdmVuIFN0cmluZyBhcnJheS4KLQkgKiAKLQkgKiBAcGFyYW0gc3R5bGVQcmVmcwotCSAqICAgICAgICAgICAgYXNzdW1lcyBub3QgbnVsbCBhbmQgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIFN0cmluZ1swXSA9Ci0JICogICAgICAgICAgICBGb3JlZ3JvdW5kIFJHQiBTdHJpbmcsIFN0cmluZ1sxXSA9IEJhY2tncm91bmQgUkdCIFN0cmluZywKLQkgKiAgICAgICAgICAgIFN0cmluZ1syXSA9IEJvbGQgdHJ1ZS9mYWxzZQotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGluIHRoZSBmb3JtIG9mIEZvcmVncm91bmQgUkdCIFN0cmluZyB8IEJhY2tncm91bmQgUkdCCi0JICogICAgICAgICBTdHJpbmcgfCBCb2xkIHRydWUvZmFsc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBwYWNrU3R5bGVQcmVmZXJlbmNlcyhTdHJpbmdbXSBzdHlsZVByZWZzKSB7Ci0JCVN0cmluZ0J1ZmZlciBzdHlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAoc3R5bGVQcmVmcy5sZW5ndGggPT0gMykgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLQkJCQlTdHJpbmcgcyA9IHN0eWxlUHJlZnNbaV07Ci0JCQkJc3R5bGVTdHJpbmcuYXBwZW5kKHMpOwotCi0JCQkJLy8gYWRkIGluIHRoZSBzZXBhcmF0b3IgKGV4Y2VwdCBvbiBsYXN0IGl0ZXJhdGlvbikKLQkJCQlpZiAoaSAhPSAyKSB7Ci0JCQkJCXN0eWxlU3RyaW5nLmFwcGVuZCgiICIgKyBTVFlMRV9TRVBBUkFUT1IgKyAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gc3R5bGVTdHJpbmcudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLQkgKiBAcGFyYW0gYW5SR0JTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFJHQiB0b1JHQihTdHJpbmcgYW5SR0JTdHJpbmcpIHsKLQkJUkdCIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChhblJHQlN0cmluZy5sZW5ndGgoKSA+IDYgJiYgYW5SR0JTdHJpbmcuY2hhckF0KDApID09ICcjJykgewotCQkJaW50IHIgPSAwOwotCQkJaW50IGcgPSAwOwotCQkJaW50IGIgPSAwOwotCQkJdHJ5IHsKLQkJCQlyID0gSW50ZWdlci52YWx1ZU9mKGFuUkdCU3RyaW5nLnN1YnN0cmluZygxLCAzKSwgMTYpLmludFZhbHVlKCk7Ci0JCQkJZyA9IEludGVnZXIudmFsdWVPZihhblJHQlN0cmluZy5zdWJzdHJpbmcoMywgNSksIDE2KS5pbnRWYWx1ZSgpOwotCQkJCWIgPSBJbnRlZ2VyLnZhbHVlT2YoYW5SR0JTdHJpbmcuc3Vic3RyaW5nKDUsIDcpLCAxNikuaW50VmFsdWUoKTsKLQkJCQlyZXN1bHQgPSBuZXcgUkdCKHIsIGcsIGIpOwotCQkJfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mRXhjKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQ291bGQgbm90IGxvYWQgaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2UgZm9yIGNvbG9yICIgKyBhblJHQlN0cmluZywgbmZFeGMpOy8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBhblJHQgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHRvUkdCU3RyaW5nKFJHQiBhblJHQikgewotCQlpZiAoYW5SR0IgPT0gbnVsbCkKLQkJCXJldHVybiAiIzAwMDAwMCI7Ly8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVkID0gSW50ZWdlci50b0hleFN0cmluZyhhblJHQi5yZWQpOwotCQl3aGlsZSAocmVkLmxlbmd0aCgpIDwgMikKLQkJCXJlZCA9ICIwIiArIHJlZDsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBncmVlbiA9IEludGVnZXIudG9IZXhTdHJpbmcoYW5SR0IuZ3JlZW4pOwotCQl3aGlsZSAoZ3JlZW4ubGVuZ3RoKCkgPCAyKQotCQkJZ3JlZW4gPSAiMCIgKyBncmVlbjsvLyROT04tTkxTLTEkCi0JCVN0cmluZyBibHVlID0gSW50ZWdlci50b0hleFN0cmluZyhhblJHQi5ibHVlKTsKLQkJd2hpbGUgKGJsdWUubGVuZ3RoKCkgPCAyKQotCQkJYmx1ZSA9ICIwIiArIGJsdWU7Ly8kTk9OLU5MUy0xJAotCQlyZXR1cm4gIiMiICsgcmVkICsgZ3JlZW4gKyBibHVlOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgZm9yZWdyb3VuZCAoUkdCIFN0cmluZyksIGJhY2tncm91bmQgKFJHQiBTdHJpbmcpLCBib2xkCi0JICogKGJvb2xlYW4gU3RyaW5nKSBmcm9tIHRoZSBnaXZlbiBwcmVmZXJlbmNlIHN0cmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gcHJlZmVyZW5jZQotCSAqICAgICAgICAgICAgc2hvdWxkIGJlIGluIHRoZSBmb3JtIG9mIEZvcmVncm91bmQgUkdCIFN0cmluZyB8IEJhY2tncm91bmQKLQkgKiAgICAgICAgICAgIFJHQiBTdHJpbmcgfCBCb2xkIHRydWUvZmFsc2UKLQkgKiBAcmV0dXJuIFN0cmluZ1tdIHdoZXJlIFN0cmluZ1swXSA9IEZvcmVncm91bmQgUkdCIFN0cmluZywgU3RyaW5nWzFdID0KLQkgKiAgICAgICAgIEJhY2tncm91bmQgUkdCIFN0cmluZywgU3RyaW5nWzJdID0gQm9sZCB0cnVlL2ZhbHNlIE9SIG51bGwgaWYKLQkgKiAgICAgICAgIHJhbiBpbnRvIHByb2JsZW1zIGV4dHJhY3RpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHVucGFja1N0eWxlUHJlZmVyZW5jZXMoU3RyaW5nIHByZWZlcmVuY2UpIHsKLQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IG51bGw7Ci0JCWlmIChwcmVmZXJlbmNlICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIocHJlZmVyZW5jZSwgU1RZTEVfU0VQQVJBVE9SKTsKLQkJCWlmIChzdC5jb3VudFRva2VucygpID09IDMpIHsKLQkJCQlTdHJpbmcgZm9yZWdyb3VuZCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlTdHJpbmcgYmFja2dyb3VuZCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlTdHJpbmcgYm9sZCA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQotCQkJCXN0eWxlUHJlZnMgPSBuZXcgU3RyaW5nWzNdOwotCQkJCXN0eWxlUHJlZnNbMF0gPSBmb3JlZ3JvdW5kOwotCQkJCXN0eWxlUHJlZnNbMV0gPSBiYWNrZ3JvdW5kOwotCQkJCXN0eWxlUHJlZnNbMl0gPSBib2xkOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHN0eWxlUHJlZnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9Db2xvck5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NjA5NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0NvbG9yTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ29sb3JOYW1lcyB7Ci0JU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQk9MRCA9ICJib2xkIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBDT0xPUiA9ICJjb2xvciI7IC8vJE5PTi1OTFMtMSQKLQotCVN0cmluZyBDT0xPUlMgPSAiY29sb3JzIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBGT1JFR1JPVU5EID0gImZvcmVncm91bmQiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIElUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0KLQlTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0VtcHR5RmlsZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiNGIxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvRW1wdHlGaWxlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TY3JvbGxlZENvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBFbXB0eUZpbGVQcmVmZXJlbmNlUGFnZSBleHRlbmRzIFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlIHsKLQotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotCQkKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTlVMTCk7Ci0KLQkJLy8gR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIEdyaWREYXRhCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEluZGVudCA9IDA7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IGNyZWF0ZVNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCk7Ci0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gU1NFVUlNZXNzYWdlcy5FbXB0eUZpbGVQcmVmZXJlbmNlUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCS8vIHNvbWUgdGhlbWVzIG9uIEdUSyBoYXZlIGRpZmZlcmVudCBiYWNrZ3JvdW5kIGNvbG9ycyBmb3IgVGV4dCBhbmQgTGFiZWxzCi0JCXRleHQuc2V0QmFja2dyb3VuZChjb21wb3NpdGUuZ2V0QmFja2dyb3VuZCgpKTsKLQkJdGV4dC5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBDb21wb3NpdGUgY3JlYXRlU2Nyb2xsZWRDb21wb3NpdGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBjcmVhdGUgc2Nyb2xsYmFycyBmb3IgdGhpcyBwYXJlbnQgd2hlbiBuZWVkZWQKLQkJZmluYWwgU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gbmV3IFNjcm9sbGVkQ29tcG9zaXRlKHBhcmVudCwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQkJc2MxLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gY3JlYXRlQ29tcG9zaXRlKHNjMSwgMSk7Ci0JCXNjMS5zZXRDb250ZW50KGNvbXBvc2l0ZSk7Ci0KLQkJLy8gbm90IGNhbGxpbmcgc2V0U2l6ZSBmb3IgY29tcG9zaXRlIHdpbGwgcmVzdWx0IGluIGEgYmxhbmsgY29tcG9zaXRlLAotCQkvLyBzbyBjYWxsaW5nIGl0IGhlcmUgaW5pdGlhbGx5Ci0JCS8vIHNldFNpemUgYWN0dWFsbHkgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIGFsbCBjb250cm9scyBhcmUgY3JlYXRlZCwKLQkJLy8gc28gc2Nyb2xsZWRDb21wb3NpdGUKLQkJLy8gaGFzIGNvcnJlY3QgbWluU2l6ZQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRTaXplKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJaWYgKGNvbXBvc2l0ZSAhPSBudWxsKSB7Ci0JCQkvLyBOb3RlOiBUaGUgZm9udCBpcyBzZXQgaGVyZSBpbiBhbnRpY2lwYXRpb24gdGhhdCB0aGUgY2xhc3MgaW5oZXJpdGluZwotCQkJLy8gICAgICAgdGhpcyBiYXNlIGNsYXNzIG1heSBhZGQgd2lkZ2V0cyB0byB0aGUgZGlhbG9nLiAgIHNldFNpemUKLQkJCS8vICAgICAgIGlzIGFzc3VtZWQgdG8gYmUgY2FsbGVkIGp1c3QgYmVmb3JlIHdlIGdvIGxpdmUuCi0JCQlhcHBseURpYWxvZ0ZvbnQoY29tcG9zaXRlKTsKLQkJCVBvaW50IG1pblNpemUgPSBjb21wb3NpdGUuY29tcHV0ZVNpemUoU1dULkRFRkFVTFQsIFNXVC5ERUZBVUxUKTsKLQkJCWNvbXBvc2l0ZS5zZXRTaXplKG1pblNpemUpOwotCQkJLy8gc2V0IHNjcm9sbGJhciBjb21wb3NpdGUncyBtaW4gc2l6ZSBzbyBwYWdlIGlzIGV4cGFuZGFibGUgYnV0Ci0JCQkvLyBoYXMgc2Nyb2xsYmFycyB3aGVuIG5lZWRlZAotCQkJaWYgKGNvbXBvc2l0ZS5nZXRQYXJlbnQoKSBpbnN0YW5jZW9mIFNjcm9sbGVkQ29tcG9zaXRlKSB7Ci0JCQkJU2Nyb2xsZWRDb21wb3NpdGUgc2MxID0gKFNjcm9sbGVkQ29tcG9zaXRlKSBjb21wb3NpdGUuZ2V0UGFyZW50KCk7Ci0JCQkJc2MxLnNldE1pblNpemUobWluU2l6ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZEhvcml6b250YWwodHJ1ZSk7Ci0JCQkJc2MxLnNldEV4cGFuZFZlcnRpY2FsKHRydWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0ZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0ZpbGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTVhZjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9GaWxlUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFiRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLlNTRUNvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuVGFiRm9sZGVyTGF5b3V0OwotCi1wdWJsaWMgY2xhc3MgRmlsZVByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVRhYltdIGZUYWJzID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21wb3NpdGUgY3JlYXRlQ29tcG9zaXRlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBudW1Db2x1bW5zKSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5VTEwpOwotCi0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gbnVtQ29sdW1uczsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsSW5kZW50ID0gMDsKLQkJZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTExfVkVSVElDQUw7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTDsKLQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBjcmVhdGVDb21wb3NpdGUocGFyZW50LCAxKTsKLQotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBTU0VVSU1lc3NhZ2VzLkZpbGVQcmVmZXJlbmNlUGFnZV8wOyAvLyROT04tTkxTLTEkCi0JCWNyZWF0ZUxhYmVsKGNvbXBvc2l0ZSwgZGVzY3JpcHRpb24pOwotCQljcmVhdGVMYWJlbChjb21wb3NpdGUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCVRhYkZvbGRlciBmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlmb2xkZXIuc2V0TGF5b3V0KG5ldyBUYWJGb2xkZXJMYXlvdXQoKSk7Ci0JCWZvbGRlci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotLy8JCVRhYkl0ZW0gdGFza0l0ZW0gPSBuZXcgVGFiSXRlbShmb2xkZXIsIFNXVC5OT05FKTsKLS8vCQlJUHJlZmVyZW5jZVRhYiB0YXNrc1RhYiA9IG5ldyBUYXNrVGFnUHJlZmVyZW5jZVRhYigpOwotLy8JCXRhc2tJdGVtLnNldFRleHQodGFza3NUYWIuZ2V0VGl0bGUoKSk7Ci0vLwkJQ29udHJvbCB0YXNrVGFncyA9IHRhc2tzVGFiLmNyZWF0ZUNvbnRlbnRzKGZvbGRlcik7Ci0vLwkJdGFza0l0ZW0uc2V0Q29udHJvbCh0YXNrVGFncyk7Ci0KLQkJVGFiSXRlbSB0cmFuc2x1Y2VuY2VJdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCUlQcmVmZXJlbmNlVGFiIHRyYW5zbHVjZW5jZVRhYiA9IG5ldyBUcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiKHRoaXMpOwotCQl0cmFuc2x1Y2VuY2VJdGVtLnNldFRleHQodHJhbnNsdWNlbmNlVGFiLmdldFRpdGxlKCkpOwotCQlDb250cm9sIHRyYW5zbHVjZW5jZUNvbnRyb2wgPSB0cmFuc2x1Y2VuY2VUYWIuY3JlYXRlQ29udGVudHMoZm9sZGVyKTsKLQkJdHJhbnNsdWNlbmNlSXRlbS5zZXRDb250cm9sKHRyYW5zbHVjZW5jZUNvbnRyb2wpOwotCi0JCWZUYWJzID0gbmV3IElQcmVmZXJlbmNlVGFiW117Lyp0YXNrc1RhYiwqLyB0cmFuc2x1Y2VuY2VUYWJ9OwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZUxhYmVsKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZyB0ZXh0KSB7Ci0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcmVudCwgU1dULkxFRlQpOwotCQlsYWJlbC5zZXRUZXh0KHRleHQpOwotCi0JCS8vR3JpZERhdGEKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggZGVza3RvcCkgewotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJc3VwZXIucGVyZm9ybUFwcGx5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1BcHBseSgpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlzdXBlci5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybURlZmF1bHRzKCk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VQYWdlI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIG9rID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlRhYnMubGVuZ3RoOyBpKyspIHsKLQkJCWZUYWJzW2ldLnBlcmZvcm1PaygpOwotCQl9Ci0JCVNTRUNvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlyZXR1cm4gb2s7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL0lQcmVmZXJlbmNlVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSVByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkNDExZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvSVByZWZlcmVuY2VUYWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotCi1wdWJsaWMgaW50ZXJmYWNlIElQcmVmZXJlbmNlVGFiIHsKLQotCUNvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHRhYkZvbGRlcik7Ci0KLQlTdHJpbmcgZ2V0VGl0bGUoKTsKLQotCXZvaWQgcGVyZm9ybUFwcGx5KCk7Ci0KLQl2b2lkIHBlcmZvcm1EZWZhdWx0cygpOwotCi0Jdm9pZCBwZXJmb3JtT2soKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdGF0dXNJbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3RhdHVzSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWU1YmI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdGF0dXNJbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLQotLyoqCi0gKiBBIHNldHRhYmxlIElTdGF0dXMuIENhbiBiZSBhbiBlcnJvciwgd2FybmluZywgaW5mbyBvciBvay4gRm9yIGVycm9yLCBpbmZvCi0gKiBhbmQgd2FybmluZyBzdGF0ZXMsIGEgbWVzc2FnZSBkZXNjcmliZXMgdGhlIHByb2JsZW0uCi0gKiAKLSAqIFRoaXMgY2xhc3Mgd2FzIGNvcGllZCBmcm9tIG90aGVyIFN0YXR1c0luZm8gY2xhc3NlcyB0aGF0IGFyZSBsb2NhdGVkIGluCi0gKiBpbnRlcm5hbCBwYWNrYWdlcwotICovCi1jbGFzcyBTdGF0dXNJbmZvIGltcGxlbWVudHMgSVN0YXR1cyB7Ci0JLyoqIFRoZSBzZXZlcml0eSBvZiB0aGlzIHN0YXR1cy4gKi8KLQlwcml2YXRlIGludCBmU2V2ZXJpdHk7Ci0KLQkvKiogVGhlIG1lc3NhZ2Ugb2YgdGhpcyBzdGF0dXMuICovCi0JcHJpdmF0ZSBTdHJpbmcgZlN0YXR1c01lc3NhZ2U7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgc3RhdHVzIHNldCB0byBPSyAobm8gbWVzc2FnZSkuCi0JICovCi0JcHVibGljIFN0YXR1c0luZm8oKSB7Ci0JCXRoaXMoT0ssIG51bGwpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBzdGF0dXMgd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkgYW5kIG1lc3NhZ2UuCi0JICogCi0JICogQHBhcmFtIHNldmVyaXR5Ci0JICogICAgICAgICAgICB0aGUgc2V2ZXJpdHkgb2YgdGhpcyBzdGF0dXM6IEVSUk9SLCBXQVJOSU5HLCBJTkZPIGFuZCBPSy4KLQkgKiBAcGFyYW0gbWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIG1lc3NhZ2Ugb2YgdGhpcyBzdGF0dXMuIEFwcGxpZXMgb25seSBmb3IgRVJST1IsIFdBUk5JTkcKLQkgKiAgICAgICAgICAgIGFuZCBJTkZPLgotCSAqLwotCXB1YmxpYyBTdGF0dXNJbmZvKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJZlN0YXR1c01lc3NhZ2UgPSBtZXNzYWdlOwotCQlmU2V2ZXJpdHkgPSBzZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsd2F5cyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlIElTdGF0dXMjZ2V0Q2hpbGRyZW4oKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzW10gZ2V0Q2hpbGRyZW4oKSB7Ci0JCXJldHVybiBuZXcgSVN0YXR1c1swXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsd2F5cyB0aGUgZXJyb3Igc2V2ZXJpdHkuCi0JICogCi0JICogQHNlZSBJU3RhdHVzI2dldENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29kZSgpIHsKLQkJcmV0dXJuIGZTZXZlcml0eTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsd2F5cyA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiAKLQkgKiBAc2VlIElTdGF0dXMjZ2V0RXhjZXB0aW9uKCkKLQkgKi8KLQlwdWJsaWMgVGhyb3dhYmxlIGdldEV4Y2VwdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdGF0dXMjZ2V0TWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotCQlyZXR1cm4gZlN0YXR1c01lc3NhZ2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdGF0dXMjZ2V0UGx1Z2luKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFBsdWdpbigpIHsKLQkJcmV0dXJuIEVkaXRvcnNVSS5QTFVHSU5fSUQ7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElTdGF0dXMjZ2V0U2V2ZXJpdHkoKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKSB7Ci0JCXJldHVybiBmU2V2ZXJpdHk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc3RhdHVzIGluZGljYXRlcyBhbiBlcnJvci4KLQkgKiAKLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgc3RhdHVzIGhhcyBzZXZlcml0eQotCSAqICAgICAgICAge0BsaW5rIElTdGF0dXMjRVJST1J9YW5kIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0Vycm9yKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuRVJST1I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc3RhdHVzIGluZGljYXRlcyBhbiBpbmZvLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzdGF0dXMgaGFzIHNldmVyaXR5Ci0JICogICAgICAgICB7QGxpbmsgSVN0YXR1cyNJTkZPfWFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbmZvKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFsd2F5cyA8Y29kZT5mYWxzZTwvY29kZT4uCi0JICogCi0JICogQHNlZSBJU3RhdHVzI2lzTXVsdGlTdGF0dXMoKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzTXVsdGlTdGF0dXMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXMjaXNPSygpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNPSygpIHsKLQkJcmV0dXJuIGZTZXZlcml0eSA9PSBJU3RhdHVzLk9LOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHN0YXR1cyBpbmRpY2F0ZXMgYSB3YXJuaW5nLgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBzdGF0dXMgaGFzIHNldmVyaXR5Ci0JICogICAgICAgICB7QGxpbmsgSVN0YXR1cyNXQVJOSU5HfWFuZCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNXYXJuaW5nKCkgewotCQlyZXR1cm4gZlNldmVyaXR5ID09IElTdGF0dXMuV0FSTklORzsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVN0YXR1cyNtYXRjaGVzKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKGludCBzZXZlcml0eU1hc2spIHsKLQkJcmV0dXJuIChmU2V2ZXJpdHkgJiBzZXZlcml0eU1hc2spICE9IDA7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIEVSUk9SLgotCSAqIAotCSAqIEBwYXJhbSBlcnJvck1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBlcnJvciBtZXNzYWdlIHdoaWNoIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcsIGJ1dCBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RXJyb3IoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlBc3NlcnQuaXNOb3ROdWxsKGVycm9yTWVzc2FnZSk7Ci0JCWZTdGF0dXNNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCQlmU2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXR1cyB0byBJTkZPLgotCSAqIAotCSAqIEBwYXJhbSBpbmZvTWVzc2FnZQotCSAqICAgICAgICAgICAgdGhlIGluZm8gbWVzc2FnZSB3aGljaCBjYW4gYmUgYW4gZW1wdHkgc3RyaW5nLCBidXQgbm90Ci0JICogICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEluZm8oU3RyaW5nIGluZm9NZXNzYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaW5mb01lc3NhZ2UpOwotCQlmU3RhdHVzTWVzc2FnZSA9IGluZm9NZXNzYWdlOwotCQlmU2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIE9LLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldE9LKCkgewotCQlmU3RhdHVzTWVzc2FnZSA9IG51bGw7Ci0JCWZTZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgc3RhdHVzIHRvIFdBUk5JTkcuCi0JICogCi0JICogQHBhcmFtIHdhcm5pbmdNZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgd2FybmluZyBtZXNzYWdlIHdoaWNoIGNhbiBiZSBhbiBlbXB0eSBzdHJpbmcsIGJ1dCBub3QKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+Ci0JICovCi0JcHVibGljIHZvaWQgc2V0V2FybmluZyhTdHJpbmcgd2FybmluZ01lc3NhZ2UpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbCh3YXJuaW5nTWVzc2FnZSk7Ci0JCWZTdGF0dXNNZXNzYWdlID0gd2FybmluZ01lc3NhZ2U7Ci0JCWZTZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGJiZDU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLklNZXNzYWdlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlQ29udmVydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BQ0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5kaWFsb2dzLlByZWZlcmVuY2VMaW5rQXJlYTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5JV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5PdmVybGF5UHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuVGFiRm9sZGVyTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbi5JU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcy5Db21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogR3V0dGVkIHZlcnNpb24gb2YgSmF2YUVkaXRvclByZWZlcmVuY2VQYWdlCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlIGV4dGVuZHMgUHJlZmVyZW5jZVBhZ2UgaW1wbGVtZW50cyBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgQ29sb3JFZGl0b3IgZkFwcGVhcmFuY2VDb2xvckVkaXRvcjsKLQlwcml2YXRlIExpc3QgZkFwcGVhcmFuY2VDb2xvckxpc3Q7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZ1tdW10gZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbCA9IG5ldyBTdHJpbmdbXVtde3tTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMiwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SfX07IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE1hcCBmQ2hlY2tCb3hlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJpdmF0ZSBTZWxlY3Rpb25MaXN0ZW5lciBmQ2hlY2tCb3hMaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCUJ1dHRvbiBidXR0b24gPSAoQnV0dG9uKSBlLndpZGdldDsKLQkJCWZPdmVybGF5U3RvcmUuc2V0VmFsdWUoKFN0cmluZykgZkNoZWNrQm94ZXMuZ2V0KGJ1dHRvbiksIGJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCX0KLQl9OwotCi0JcHJpdmF0ZSBNYXAgZkNvbG9yQnV0dG9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwcml2YXRlIEFycmF5TGlzdCBmTnVtYmVyRmllbGRzID0gbmV3IEFycmF5TGlzdCgpOwotCXByaXZhdGUgT3ZlcmxheVByZWZlcmVuY2VTdG9yZSBmT3ZlcmxheVN0b3JlOwotCS8qKiBCdXR0b24gY29udHJvbGxpbmcgZGVmYXVsdCBzZXR0aW5nIG9mIHRoZSBzZWxlY3RlZCByZWZlcmVuY2UgcHJvdmlkZXIuICovCi0JLy8gVE9ETzogcHJpdmF0ZSBmaWVsZCBuZXZlciByZWFkIGxvY2FsbHkKLQlCdXR0b24gZlNldERlZmF1bHRCdXR0b247Ci0JcHJpdmF0ZSBJUHJlZmVyZW5jZVRhYltdIGZUYWJzID0gbnVsbDsKLQlwcml2YXRlIE1hcCBmVGV4dEZpZWxkcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZSgpIHsKLQkJc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzYpOyAvLyROT04tTkxTLTEkCi0JCXNldFByZWZlcmVuY2VTdG9yZShTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCkpOwotCi0JCWZPdmVybGF5U3RvcmUgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSwgY3JlYXRlT3ZlcmxheVN0b3JlS2V5cygpKTsKLQl9Ci0KLQlwcml2YXRlIEJ1dHRvbiBhZGRDaGVja0JveChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwsIFN0cmluZyBrZXksIGludCBpbmRlbnRhdGlvbikgewotCQlCdXR0b24gY2hlY2tCb3ggPSBuZXcgQnV0dG9uKHBhcmVudCwgU1dULkNIRUNLKTsKLQkJY2hlY2tCb3guc2V0VGV4dChsYWJlbCk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcpOwotCQlnZC5ob3Jpem9udGFsSW5kZW50ID0gaW5kZW50YXRpb247Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJY2hlY2tCb3guc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWNoZWNrQm94LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGZDaGVja0JveExpc3RlbmVyKTsKLQotCQlmQ2hlY2tCb3hlcy5wdXQoY2hlY2tCb3gsIGtleSk7Ci0KLQkJcmV0dXJuIGNoZWNrQm94OwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIHN0YXR1cyB0byB0aGUgc3RhdHVzIGxpbmUgb2YgYSBkaWFsb2cgcGFnZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBseVRvU3RhdHVzTGluZShEaWFsb2dQYWdlIHBhZ2UsIElTdGF0dXMgc3RhdHVzKSB7Ci0JCVN0cmluZyBtZXNzYWdlID0gc3RhdHVzLmdldE1lc3NhZ2UoKTsKLQkJc3dpdGNoIChzdGF0dXMuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJU3RhdHVzLk9LIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5OT05FKTsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5XQVJOSU5HIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5XQVJOSU5HKTsKLQkJCQlwYWdlLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgSVN0YXR1cy5JTkZPIDoKLQkJCQlwYWdlLnNldE1lc3NhZ2UobWVzc2FnZSwgSU1lc3NhZ2VQcm92aWRlci5JTkZPUk1BVElPTik7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlpZiAobWVzc2FnZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCW1lc3NhZ2UgPSBudWxsOwotCQkJCX0KLQkJCQlwYWdlLnNldE1lc3NhZ2UobnVsbCk7Ci0JCQkJcGFnZS5zZXRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENvbnRyb2wgY3JlYXRlQXBwZWFyYW5jZVBhZ2UoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgYXBwZWFyYW5jZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlhcHBlYXJhbmNlQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCVN0cmluZyBsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8yMDsgLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTLCAwKTsKLQotCQlsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zMDsgLy8kTk9OLU5MUy0xJAotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUywgMCk7Ci0KLQkJUHJlZmVyZW5jZUxpbmtBcmVhIGNvbnRlbnRUeXBlQXJlYSA9IG5ldyBQcmVmZXJlbmNlTGlua0FyZWEoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULk5PTkUsICJWYWxpZGF0aW9uUHJlZmVyZW5jZVBhZ2UiLCBTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfNDAsIChJV29ya2JlbmNoUHJlZmVyZW5jZUNvbnRhaW5lcikgZ2V0Q29udGFpbmVyKCksIG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwgfCBHcmlkRGF0YS5HUkFCX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxJbmRlbnQgPSAyMDsKLQkJY29udGVudFR5cGVBcmVhLmdldENvbnRyb2woKS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWxhYmVsID0gU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM5OwotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHLCAwKTsKLQotCQlsYWJlbCA9IFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOwotCQlhZGRDaGVja0JveChhcHBlYXJhbmNlQ29tcG9zaXRlLCBsYWJlbCwgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLkZPTERJTkdfRU5BQkxFRCwgMCk7Ci0KLQkJTGFiZWwgbCA9IG5ldyBMYWJlbChhcHBlYXJhbmNlQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZ2QuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoMSkgLyAyOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWwgPSBuZXcgTGFiZWwoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULkxFRlQpOwotCQlsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzIzKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIGVkaXRvckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoYXBwZWFyYW5jZUNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQllZGl0b3JDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTCB8IEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWVkaXRvckNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmQXBwZWFyYW5jZUNvbG9yTGlzdCA9IG5ldyBMaXN0KGVkaXRvckNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscyg1KTsKLQkJZkFwcGVhcmFuY2VDb2xvckxpc3Quc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJQ29tcG9zaXRlIHN0eWxlc0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZWRpdG9yQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5tYXJnaW5IZWlnaHQgPSAwOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXN0eWxlc0NvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJc3R5bGVzQ29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCWwgPSBuZXcgTGFiZWwoc3R5bGVzQ29tcG9zaXRlLCBTV1QuTEVGVCk7Ci0JCS8vIG5lZWRzIHRvIGJlIG1hZGUgZmluYWwgc28gbGFiZWwgY2FuIGJlIHNldCBpbgotCQkvLyBmb3JlZ3JvdW5kY29sb3JidXR0b24ncyBhY2MgbGlzdGVuZXIKLQkJZmluYWwgU3RyaW5nIGJ1dHRvbkxhYmVsID0gU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzI0OyAvLyROT04tTkxTLTEkIAotCQlsLnNldFRleHQoYnV0dG9uTGFiZWwpOwotCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuQkVHSU5OSU5HOwotCQlsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZBcHBlYXJhbmNlQ29sb3JFZGl0b3IgPSBuZXcgQ29sb3JFZGl0b3Ioc3R5bGVzQ29tcG9zaXRlKTsKLQkJQnV0dG9uIGZvcmVncm91bmRDb2xvckJ1dHRvbiA9IGZBcHBlYXJhbmNlQ29sb3JFZGl0b3IuZ2V0QnV0dG9uKCk7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWZvcmVncm91bmRDb2xvckJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlmQXBwZWFyYW5jZUNvbG9yTGlzdC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWhhbmRsZUFwcGVhcmFuY2VDb2xvckxpc3RTZWxlY3Rpb24oKTsKLQkJCX0KLQkJfSk7Ci0JCWZvcmVncm91bmRDb2xvckJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWludCBpID0gZkFwcGVhcmFuY2VDb2xvckxpc3QuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCQlTdHJpbmcga2V5ID0gZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbFtpXVsxXTsKLQotCQkJCVByZWZlcmVuY2VDb252ZXJ0ZXIuc2V0VmFsdWUoZk92ZXJsYXlTdG9yZSwga2V5LCBmQXBwZWFyYW5jZUNvbG9yRWRpdG9yLmdldENvbG9yVmFsdWUoKSk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGJ1ZzI1NDEgLSBhc3NvY2lhdGUgY29sb3IgbGFiZWwgdG8gYnV0dG9uJ3MgbGFiZWwgZmllbGQKLQkJZm9yZWdyb3VuZENvbG9yQnV0dG9uLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikKLQkJCQkJZS5yZXN1bHQgPSBidXR0b25MYWJlbDsKLQkJCX0KLQkJfSk7Ci0KLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChhcHBlYXJhbmNlQ29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRlNURV9BUFBFQVJBTkNFX0hFTFBJRCk7Ci0JCXJldHVybiBhcHBlYXJhbmNlQ29tcG9zaXRlOwotCX0KLQotCS8qCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhDb21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBuZWVkIHRvIGNyZWF0ZSB0YWJzIGJlZm9yZSBsb2FkaW5nL3N0YXJ0aW5nIG92ZXJsYXlzdG9yZSBpbiBjYXNlCi0JCS8vIHRhYnMgYWxzbyBhZGQgdmFsdWVzCi0JCUlQcmVmZXJlbmNlVGFiIGhvdmVyc1RhYiA9IG5ldyBUZXh0SG92ZXJQcmVmZXJlbmNlVGFiKHRoaXMsIGZPdmVybGF5U3RvcmUpOwotCi0JCWZPdmVybGF5U3RvcmUubG9hZCgpOwotCQlmT3ZlcmxheVN0b3JlLnN0YXJ0KCk7Ci0KLQkJVGFiRm9sZGVyIGZvbGRlciA9IG5ldyBUYWJGb2xkZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWZvbGRlci5zZXRMYXlvdXQobmV3IFRhYkZvbGRlckxheW91dCgpKTsKLQkJZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCVRhYkl0ZW0gaXRlbSA9IG5ldyBUYWJJdGVtKGZvbGRlciwgU1dULk5PTkUpOwotCQlpdGVtLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzApOyAvLyROT04tTkxTLTEkCi0JCWl0ZW0uc2V0Q29udHJvbChjcmVhdGVBcHBlYXJhbmNlUGFnZShmb2xkZXIpKTsKLQotCQlpdGVtID0gbmV3IFRhYkl0ZW0oZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCWl0ZW0uc2V0VGV4dChob3ZlcnNUYWIuZ2V0VGl0bGUoKSk7Ci0JCWl0ZW0uc2V0Q29udHJvbChob3ZlcnNUYWIuY3JlYXRlQ29udGVudHMoZm9sZGVyKSk7Ci0KLQkJZlRhYnMgPSBuZXcgSVByZWZlcmVuY2VUYWJbXXtob3ZlcnNUYWJ9OwotCi0JCWluaXRpYWxpemUoKTsKLQotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KGZvbGRlcik7Ci0JCXJldHVybiBmb2xkZXI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIFByZWZlcmVuY2VQYWdlI2NyZWF0ZUNvbnRyb2woQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChnZXRDb250cm9sKCksCi0JCS8vIElKYXZhSGVscENvbnRleHRJZHMuSkFWQV9FRElUT1JfUFJFRkVSRU5DRV9QQUdFKTsKLQl9Ci0KLQlwcml2YXRlIE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUFycmF5TGlzdCBvdmVybGF5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTX0NPTE9SKSk7Ci0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLk1BVENISU5HX0JSQUNLRVRTKSk7Ci0KLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuRVZBTFVBVEVfVEVNUE9SQVJZX1BST0JMRU1TKSk7Ci0JCW92ZXJsYXlLZXlzLmFkZChuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5KE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuQk9PTEVBTiwgRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlNIT1dfVU5LTk9XTl9DT05URU5UX1RZUEVfTVNHKSk7Ci0KLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5CT09MRUFOLCBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIuRk9MRElOR19FTkFCTEVEKSk7Ci0KLQkJT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W10ga2V5cyA9IG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbb3ZlcmxheUtleXMuc2l6ZSgpXTsKLQkJb3ZlcmxheUtleXMudG9BcnJheShrZXlzKTsKLQkJcmV0dXJuIGtleXM7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIERpYWxvZ1BhZ2UjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJaWYgKGZPdmVybGF5U3RvcmUgIT0gbnVsbCkgewotCQkJZk92ZXJsYXlTdG9yZS5zdG9wKCk7Ci0JCQlmT3ZlcmxheVN0b3JlID0gbnVsbDsKLQkJfQotCi0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlQXBwZWFyYW5jZUNvbG9yTGlzdFNlbGVjdGlvbigpIHsKLQkJaW50IGkgPSBmQXBwZWFyYW5jZUNvbG9yTGlzdC5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcga2V5ID0gZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbFtpXVsxXTsKLQkJUkdCIHJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoZk92ZXJsYXlTdG9yZSwga2V5KTsKLQkJZkFwcGVhcmFuY2VDb2xvckVkaXRvci5zZXRDb2xvclZhbHVlKHJnYik7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSNpbml0KCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElXb3JrYmVuY2ggd29ya2JlbmNoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8KLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaW5pdGlhbGl6ZUZpZWxkcygpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgZkFwcGVhcmFuY2VDb2xvckxpc3RNb2RlbC5sZW5ndGg7IGkrKykKLQkJCWZBcHBlYXJhbmNlQ29sb3JMaXN0LmFkZChmQXBwZWFyYW5jZUNvbG9yTGlzdE1vZGVsW2ldWzBdKTsKLQkJZkFwcGVhcmFuY2VDb2xvckxpc3QuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJaWYgKGZBcHBlYXJhbmNlQ29sb3JMaXN0ICE9IG51bGwgJiYgIWZBcHBlYXJhbmNlQ29sb3JMaXN0LmlzRGlzcG9zZWQoKSkgewotCQkJCQlmQXBwZWFyYW5jZUNvbG9yTGlzdC5zZWxlY3QoMCk7Ci0JCQkJCWhhbmRsZUFwcGVhcmFuY2VDb2xvckxpc3RTZWxlY3Rpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplRmllbGRzKCkgewotCQlJdGVyYXRvciBlID0gZkNvbG9yQnV0dG9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUNvbG9yRWRpdG9yIGMgPSAoQ29sb3JFZGl0b3IpIGUubmV4dCgpOwotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGZDb2xvckJ1dHRvbnMuZ2V0KGMpOwotCQkJUkdCIHJnYiA9IFByZWZlcmVuY2VDb252ZXJ0ZXIuZ2V0Q29sb3IoZk92ZXJsYXlTdG9yZSwga2V5KTsKLQkJCWMuc2V0Q29sb3JWYWx1ZShyZ2IpOwotCQl9Ci0KLQkJZSA9IGZDaGVja0JveGVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJQnV0dG9uIGIgPSAoQnV0dG9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSAoU3RyaW5nKSBmQ2hlY2tCb3hlcy5nZXQoYik7Ci0JCQliLnNldFNlbGVjdGlvbihmT3ZlcmxheVN0b3JlLmdldEJvb2xlYW4oa2V5KSk7Ci0JCX0KLQotCQllID0gZlRleHRGaWVsZHMua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlUZXh0IHQgPSAoVGV4dCkgZS5uZXh0KCk7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgZlRleHRGaWVsZHMuZ2V0KHQpOwotCQkJdC5zZXRUZXh0KGZPdmVybGF5U3RvcmUuZ2V0U3RyaW5nKGtleSkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlByZWZlcmVuY2VQYWdlI3BlcmZvcm1BcHBseSgpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUFwcGx5KCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmVGFic1tpXS5wZXJmb3JtQXBwbHkoKTsKLQkJfQotCQlzdXBlci5wZXJmb3JtQXBwbHkoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgUHJlZmVyZW5jZVBhZ2UjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZPdmVybGF5U3RvcmUubG9hZERlZmF1bHRzKCk7Ci0KLQkJaW5pdGlhbGl6ZUZpZWxkcygpOwotCi0JCWhhbmRsZUFwcGVhcmFuY2VDb2xvckxpc3RTZWxlY3Rpb24oKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUYWJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmVGFic1tpXS5wZXJmb3JtRGVmYXVsdHMoKTsKLQkJfQotCi0JCXN1cGVyLnBlcmZvcm1EZWZhdWx0cygpOwotCi0JCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBubyBuZWVkIGZvciBhIHZpZXdlcgotCQkvLyBmUHJldmlld1ZpZXdlci5pbnZhbGlkYXRlVGV4dFByZXNlbnRhdGlvbigpOwotCX0KLQotCS8qCi0JICogQHNlZSBQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmVGFicy5sZW5ndGg7IGkrKykgewotCQkJZlRhYnNbaV0ucGVyZm9ybU9rKCk7Ci0JCX0KLQotCQlmT3ZlcmxheVN0b3JlLnByb3BhZ2F0ZSgpOwotCQlTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0KLQkJLy8gdGFiIHdpZHRoIGlzIGFsc28gYSBtb2RlbC1zaWRlIHByZWZlcmVuY2Ugc28gbmVlZCB0byBzZXQgaXQKLQkJLy8gVE9ETyBuZWVkIHRvIGhhbmRsZSB0YWIgd2lkdGggZm9yIGZvcm1hdHRlciBzb21laG93Ci0JCS8vIGludCB0YWJXaWR0aCA9Ci0JCS8vIGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEludChBYnN0cmFjdERlY29yYXRlZFRleHRFZGl0b3JQcmVmZXJlbmNlQ29uc3RhbnRzLkVESVRPUl9UQUJfV0lEVEgpOwotCQkvLyBNb2RlbFBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25Nb2RlbFByZWZlcmVuY2VOYW1lcy5UQUJfV0lEVEgsCi0JCS8vIHRhYldpZHRoKTsKLQkJLy8gTW9kZWxQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiB0cnVlOwotCX0KLQotCXZvaWQgdXBkYXRlU3RhdHVzKElTdGF0dXMgc3RhdHVzKSB7Ci0JCWlmICghc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZk51bWJlckZpZWxkcy5zaXplKCk7IGkrKykgewotCQkJCVRleHQgdGV4dCA9IChUZXh0KSBmTnVtYmVyRmllbGRzLmdldChpKTsKLQkJCQlJU3RhdHVzIHMgPSB2YWxpZGF0ZVBvc2l0aXZlTnVtYmVyKHRleHQuZ2V0VGV4dCgpKTsKLQkJCQlzdGF0dXMgPSBzLmdldFNldmVyaXR5KCkgPiBzdGF0dXMuZ2V0U2V2ZXJpdHkoKSA/IHMgOiBzdGF0dXM7Ci0JCQl9Ci0JCX0KLQotCQlzZXRWYWxpZCghc3RhdHVzLm1hdGNoZXMoSVN0YXR1cy5FUlJPUikpOwotCQlhcHBseVRvU3RhdHVzTGluZSh0aGlzLCBzdGF0dXMpOwotCX0KLQotCXByaXZhdGUgSVN0YXR1cyB2YWxpZGF0ZVBvc2l0aXZlTnVtYmVyKFN0cmluZyBudW1iZXIpIHsKLQkJU3RhdHVzSW5mbyBzdGF0dXMgPSBuZXcgU3RhdHVzSW5mbygpOwotCQlpZiAobnVtYmVyLmxlbmd0aCgpID09IDApIHsKLQkJCXN0YXR1cy5zZXRFcnJvcihTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZWRUZXh0RWRpdG9yUHJlZmVyZW5jZVBhZ2VfMzcpOwotCQl9Ci0JCWVsc2UgewotCQkJdHJ5IHsKLQkJCQlpbnQgdmFsdWUgPSBJbnRlZ2VyLnBhcnNlSW50KG51bWJlcik7Ci0JCQkJaWYgKHZhbHVlIDwgMCkKLQkJCQkJc3RhdHVzLnNldEVycm9yKG51bWJlciArIFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlZFRleHRFZGl0b3JQcmVmZXJlbmNlUGFnZV8zOCk7Ci0JCQl9Ci0JCQljYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLQkJCQlzdGF0dXMuc2V0RXJyb3IobnVtYmVyICsgU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVkVGV4dEVkaXRvclByZWZlcmVuY2VQYWdlXzM4KTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3RhdHVzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9TdHlsZWRUZXh0Q29sb3JQaWNrZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZiYjA5OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvU3R5bGVkVGV4dENvbG9yUGlja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkRpY3Rpb25hcnk7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0QXR0cmlidXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQUNDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJsZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVSYW5nZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5LZXlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuVHJhdmVyc2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlRyYXZlcnNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Gb250OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUGFsZXR0ZURhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbG9yRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBjb25maWd1cmFibGUgYnkgc2V0dGluZyAzIHByb3BlcnRpZXM6IDEpIGFuIGFycmF5IG9mIFN0cmluZ3MKLSAqIGFzIHRoZSBzdHlsZU5hbWVzOyBvbmUgdW5pcXVlIGVudHJ5IGZvciBldmVyeSBzdHlsZSB0eXBlIG1lYW50IHRvIGJlCi0gKiBjb25maWd1cmFibGUgYnkgdGhlIHVzZXIgMikgYSBEaWN0aW9uYXJ5IG9mIGRlc2NyaXB0aW9ucywgbWFwcGluZyB0aGUKLSAqIHN0eWxlTmFtZXMgdG8gdW5pcXVlIGRlc2NyaXB0aW9ucyAtIG1lYW50IGZvciB1c2Ugd2l0aGluIHRoZSBzZWxlY3Rpb24KLSAqIENvbWJvQm94IFRPRE8gKHBhKSB0aGlzIHNob3VsZCBwcm9iYWJseSBiZSB3b3JraW5nIG9mZiBkb2N1bWVudCBwYXJ0aXRpb25zCi0gKiBub3cgKDIuMSspIDMpIGEgRGljdGlvbmFyeSBtYXBwaW5nIHBhcnNlZCBJVGV4dFJlZ2lvbiBjb250ZXh0cyAoc3RyaW5ncykgdG8KLSAqIHRoZSBsb2NhbGx5IGRlZmluZWQgc3R5bGVOYW1lcwotICogIAotICovCi1wdWJsaWMgY2xhc3MgU3R5bGVkVGV4dENvbG9yUGlja2VyIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgY2xhc3MgRGVzY3JpcHRpb25Tb3J0ZXIgZXh0ZW5kcyBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuU29ydGVyIHsKLQkJQ29sbGF0b3IgY29sbGF0b3IgPSBDb2xsYXRvci5nZXRJbnN0YW5jZSgpOwotCi0JCXB1YmxpYyBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGVsZW1lbnRPbmUsIE9iamVjdCBlbGVtZW50VHdvKSB7Ci0JCQkvKioKLQkJCSAqIFJldHVybnMgdHJ1ZSBpZiBlbGVtZW50VHdvIGlzICdncmVhdGVyIHRoYW4nIGVsZW1lbnRPbmUgVGhpcyBpcwotCQkJICogdGhlICdvcmRlcmluZycgbWV0aG9kIG9mIHRoZSBzb3J0IG9wZXJhdGlvbi4gRWFjaCBzdWJjbGFzcwotCQkJICogb3ZlcmlkZXMgdGhpcyBtZXRob2Qgd2l0aCB0aGUgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiB0aGUKLQkJCSAqICdncmVhdGVyIHRoYW4nIGNvbmNlcHQgZm9yIHRoZSBvYmplY3RzIGJlaW5nIHNvcnRlZC4KLQkJCSAqLwotCQkJcmV0dXJuIChjb2xsYXRvci5jb21wYXJlKGVsZW1lbnRPbmUudG9TdHJpbmcoKSwgZWxlbWVudFR3by50b1N0cmluZygpKSkgPCAwOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS0dST1VORCA9ICJiYWNrZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJPTEQgPSAiYm9sZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT0xPUiA9ICJjb2xvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIG5hbWVzIGZvciBwcmVmZXJlbmNlIGVsZW1lbnRzIC4uLiBub24tTkxTCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElUQUxJQyA9ICJpdGFsaWMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJuYW1lIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBib29sZWFuIHNob3dJdGFsaWMgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lciBiYWNrZ3JvdW5kQWNjTGlzdGVuZXIgPSBuZXcgQWNjZXNzaWJsZUNvbnRyb2xBZGFwdGVyKCkgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5zd3QuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIjZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIGdldFZhbHVlKEFjY2Vzc2libGVDb250cm9sRXZlbnQgZSkgewotCQkJaWYgKGUuY2hpbGRJRCA9PSBBQ0MuQ0hJTERJRF9TRUxGKSB7Ci0JCQkJZS5yZXN1bHQgPSBnZXRDb2xvckJ1dHRvblZhbHVlKGZCYWNrZ3JvdW5kKTsKLQkJCX0KLQkJfQotCX07Ci0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGJ1dHRvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQl3aWRnZXRTZWxlY3RlZChlKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyBuYW1lZFN0eWxlID0gZ2V0U3R5bGVOYW1lKGZTdHlsZUNvbWJvLmdldEl0ZW0oZlN0eWxlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpOwotCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlpZiAoZS53aWRnZXQgPT0gZkZvcmVncm91bmQpIHsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldFByZWZlcmVuY2VLZXkobmFtZWRTdHlsZSkpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1swXTsKLQkJCQkJLy8gb3BlbiBjb2xvciBkaWFsb2cgdG8gZ2V0IG5ldyBjb2xvcgotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBjaGFuZ2VDb2xvcihvbGRWYWx1ZSk7Ci0KLQkJCQkJaWYgKCFuZXdWYWx1ZS5lcXVhbHMob2xkVmFsdWUpKSB7Ci0JCQkJCQlzdHlsZVByZWZzWzBdID0gbmV3VmFsdWU7Ci0JCQkJCQlTdHJpbmcgbmV3UHJlZlN0cmluZyA9IENvbG9ySGVscGVyLnBhY2tTdHlsZVByZWZlcmVuY2VzKHN0eWxlUHJlZnMpOwotCQkJCQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoZ2V0UHJlZmVyZW5jZUtleShuYW1lZFN0eWxlKSwgbmV3UHJlZlN0cmluZyk7Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKGUud2lkZ2V0ID09IGZCYWNrZ3JvdW5kKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgKG5ld2x5IG9sZCkgc3R5bGUKLQkJCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhnZXRQcmVmZXJlbmNlS2V5KG5hbWVkU3R5bGUpKTsKLQkJCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBvbGRWYWx1ZSA9IHN0eWxlUHJlZnNbMV07Ci0JCQkJCS8vIG9wZW4gY29sb3IgZGlhbG9nIHRvIGdldCBuZXcgY29sb3IKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gY2hhbmdlQ29sb3Iob2xkVmFsdWUpOwotCi0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1sxXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKGdldFByZWZlcmVuY2VLZXkobmFtZWRTdHlsZSksIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBmQm9sZCkgewotCQkJCS8vIGdldCBjdXJyZW50IChuZXdseSBvbGQpIHN0eWxlCi0JCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoZ2V0UHJlZmVyZW5jZUtleShuYW1lZFN0eWxlKSk7Ci0JCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQkJaWYgKHN0eWxlUHJlZnMgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgb2xkVmFsdWUgPSBzdHlsZVByZWZzWzJdOwotCQkJCQlTdHJpbmcgbmV3VmFsdWUgPSBTdHJpbmcudmFsdWVPZihmQm9sZC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1syXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKGdldFByZWZlcmVuY2VLZXkobmFtZWRTdHlsZSksIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzaG93SXRhbGljICYmIGUud2lkZ2V0ID09IGZJdGFsaWMpIHsKLQkJCQkvLyBnZXQgY3VycmVudCAobmV3bHkgb2xkKSBzdHlsZQotCQkJCVN0cmluZyBwcmVmU3RyaW5nID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0U3RyaW5nKGdldFByZWZlcmVuY2VLZXkobmFtZWRTdHlsZSkpOwotCQkJCVN0cmluZ1tdIHN0eWxlUHJlZnMgPSBDb2xvckhlbHBlci51bnBhY2tTdHlsZVByZWZlcmVuY2VzKHByZWZTdHJpbmcpOwotCQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIG9sZFZhbHVlID0gc3R5bGVQcmVmc1szXTsKLQkJCQkJU3RyaW5nIG5ld1ZhbHVlID0gU3RyaW5nLnZhbHVlT2YoZkl0YWxpYy5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCWlmICghbmV3VmFsdWUuZXF1YWxzKG9sZFZhbHVlKSkgewotCQkJCQkJc3R5bGVQcmVmc1szXSA9IG5ld1ZhbHVlOwotCQkJCQkJU3RyaW5nIG5ld1ByZWZTdHJpbmcgPSBDb2xvckhlbHBlci5wYWNrU3R5bGVQcmVmZXJlbmNlcyhzdHlsZVByZWZzKTsKLQkJCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFZhbHVlKGdldFByZWZlcmVuY2VLZXkobmFtZWRTdHlsZSksIG5ld1ByZWZTdHJpbmcpOwotCQkJCQkJcmVmcmVzaCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBmQ2xlYXJTdHlsZSkgewotCQkJCWdldFByZWZlcmVuY2VTdG9yZSgpLnNldFRvRGVmYXVsdChnZXRQcmVmZXJlbmNlS2V5KG5hbWVkU3R5bGUpKTsKLQkJCQlyZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQl9OwotCi0JcHJvdGVjdGVkIFNlbGVjdGlvbkxpc3RlbmVyIGNvbWJvTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXdpZGdldFNlbGVjdGVkKGUpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJaW50IHNlbGVjdGVkSW5kZXggPSBmU3R5bGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gc2VsZWN0ZWRJbmRleCA+PSAwID8gZlN0eWxlQ29tYm8uZ2V0SXRlbShzZWxlY3RlZEluZGV4KSA6IG51bGw7Ci0JCQlhY3RpdmF0ZShnZXRTdHlsZU5hbWUoZGVzY3JpcHRpb24pKTsKLQkJfQotCX07Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQmFja2dyb3VuZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZkJhY2tncm91bmRMYWJlbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZCb2xkOwotCXByb3RlY3RlZCBCdXR0b24gZkNsZWFyU3R5bGU7Ci0JLy8gRGljdGlvbmFyeSBtYXBwaW5nIHRoZSBJVGV4dFJlZ2lvbiB0eXBlcyBhYm92ZSB0byBjb2xvciBuYW1lcywgd2hpY2gKLQkvLyBhcmUsIGluIHR1cm4sIGF0dHJpYnV0ZXMKLQlwcm90ZWN0ZWQgRGljdGlvbmFyeSBmQ29udGV4dFN0eWxlTWFwID0gbnVsbDsKLQlwcm90ZWN0ZWQgQ29sb3IgZkRlZmF1bHRCYWNrZ3JvdW5kID0gZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpOwotCi0JcHJvdGVjdGVkIENvbG9yIGZEZWZhdWx0Rm9yZWdyb3VuZCA9IGdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9GT1JFR1JPVU5EKTsKLQkvLyBEaWN0aW9uYXJ5IG1hcHBpbmcgdGhlIElUZXh0UmVnaW9uIHR5cGVzIGFib3ZlIHRvIGRpc3BsYXkgc3RyaW5ncywgZm9yCi0JLy8gdXNlIGluIHRoZSBjb21ibyBib3gKLQlwcm90ZWN0ZWQgRGljdGlvbmFyeSBmRGVzY3JpcHRpb25zID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZGb3JlZ3JvdW5kOwotCXByb3RlY3RlZCBMYWJlbCBmRm9yZWdyb3VuZExhYmVsOwotLy8JcHJpdmF0ZSBTdHJpbmcgZkdlbmVyYXRvcktleTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGZJbnB1dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEJ1dHRvbiBmSXRhbGljOwotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZOb2RlcyA9IG51bGw7Ci0JLy8gZGVmZWN0IDIwMDc2NCAtIEFDQzpkaXNwbGF5IHZhbHVlcyBmb3IgY29sb3IgYnV0dG9ucwotCXByb3RlY3RlZCBBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyIGZvcmVncm91bmRBY2NMaXN0ZW5lciA9IG5ldyBBY2Nlc3NpYmxlQ29udHJvbEFkYXB0ZXIoKSB7Ci0JCS8qKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnN3dC5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2libGVDb250cm9sQWRhcHRlciNnZXRWYWx1ZShBY2Nlc3NpYmxlQ29udHJvbEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZ2V0VmFsdWUoQWNjZXNzaWJsZUNvbnRyb2xFdmVudCBlKSB7Ci0JCQlpZiAoZS5jaGlsZElEID09IEFDQy5DSElMRElEX1NFTEYpIHsKLQkJCQllLnJlc3VsdCA9IGdldENvbG9yQnV0dG9uVmFsdWUoZkZvcmVncm91bmQpOwotCQkJfQotCQl9Ci0JfTsKLQkvLyBBIFJlZ2lvblBhcnNlciwgd2hpY2ggd2lsbCB0dXJuIHRoZSBpbnB1dCBpbnRvCi0JLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihzKSBhbmQgUmVnaW9ucwotCXByb3RlY3RlZCBSZWdpb25QYXJzZXIgZlBhcnNlciA9IG51bGw7Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZTsKLQlwcm90ZWN0ZWQgQ29tYm8gZlN0eWxlQ29tYm8gPSBudWxsOwotCS8vIFRoZSBsaXN0IG9mIHN1cHBvcnRlZCBJVGV4dFJlZ2lvbiB0eXBlcyBbU3RyaW5nc10KLQlwcm90ZWN0ZWQgTGlzdCBmU3R5bGVMaXN0ID0gbnVsbDsKLQotCS8vIGNvbnRyb2xzIGluIHBpY2tlcgotCXByb3RlY3RlZCBTdHlsZWRUZXh0IGZUZXh0ID0gbnVsbDsKLQotCS8qKgotCSAqIFhNTFRleHRDb2xvclBpY2tlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZQotCSAqIEBwYXJhbSBzdHlsZQotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFN0eWxlZFRleHRDb2xvclBpY2tlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUpIHsKLQkJc3VwZXIocGFyZW50LCBzdHlsZSk7Ci0JCS8vR3JpZExheW91dAotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMTsKLQkJc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNyZWF0ZUNvbnRyb2xzKHRoaXMpOwotCX0KLQotCS8vIGFjdGl2YXRlIGNvbnRyb2xzIGJhc2VkIG9uIHRoZSBnaXZlbiBsb2NhbCBjb2xvciB0eXBlCi0JcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkgewotCQkJZkZvcmVncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlmQmFja2dyb3VuZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkJvbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlpZiAoc2hvd0l0YWxpYykKLQkJCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCWZCYWNrZ3JvdW5kTGFiZWwuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCX0gCi0JCWVsc2UgewkJCi0JCQlmRm9yZWdyb3VuZC5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJhY2tncm91bmQuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCWZDbGVhclN0eWxlLnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQlmQm9sZC5zZXRFbmFibGVkKHRydWUpOwotCQkJaWYgKHNob3dJdGFsaWMpCi0JCQkJZkl0YWxpYy5zZXRFbmFibGVkKHRydWUpOwotCQkJZkZvcmVncm91bmRMYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJZkJhY2tncm91bmRMYWJlbC5zZXRFbmFibGVkKHRydWUpOwotCQkJCi0JCX0KLQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGUobmFtZWRTdHlsZSk7Ci0JCUNvbG9yIGNvbG9yID0gYXR0cmlidXRlLmdldEZvcmVncm91bmQoKTsKLQkJaWYgKGNvbG9yID09IG51bGwpIHsKLQkJCWNvbG9yID0gZkRlZmF1bHRGb3JlZ3JvdW5kOwotCQl9Ci0JCWlmIChmRm9yZWdyb3VuZC5nZXRTaXplKCkueCA+IDAgJiYgZkZvcmVncm91bmQuZ2V0U2l6ZSgpLnkgPiAwICYmIChmRm9yZWdyb3VuZC5nZXRJbWFnZSgpID09IG51bGwgfHwgZkZvcmVncm91bmQuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKSA9PSBudWxsIHx8IGZGb3JlZ3JvdW5kLmdldEltYWdlKCkuZ2V0SW1hZ2VEYXRhKCkuZ2V0UkdCcygpID09IG51bGwgfHwgZkZvcmVncm91bmQuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKS5nZXRSR0JzKCkubGVuZ3RoIDwgMSB8fCAhZkZvcmVncm91bmQuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKS5nZXRSR0JzKClbMF0uZXF1YWxzKGNvbG9yLmdldFJHQigpKSkpIHsKLQkJCWlmIChmRm9yZWdyb3VuZC5nZXRJbWFnZSgpICE9IG51bGwpCi0JCQkJZkZvcmVncm91bmQuZ2V0SW1hZ2UoKS5kaXNwb3NlKCk7Ci0JCQlJbWFnZSBmb3JlZ3JvdW5kID0gbmV3IEltYWdlKGdldERpc3BsYXkoKSwgbmV3IEltYWdlRGF0YShmRm9yZWdyb3VuZC5nZXRTaXplKCkueCwgZkZvcmVncm91bmQuZ2V0U2l6ZSgpLnksIDEsIG5ldyBQYWxldHRlRGF0YShuZXcgUkdCW117Y29sb3IuZ2V0UkdCKCl9KSkpOwotCQkJZkZvcmVncm91bmQuc2V0SW1hZ2UoZm9yZWdyb3VuZCk7Ci0JCX0KLQkJY29sb3IgPSBhdHRyaWJ1dGUuZ2V0QmFja2dyb3VuZCgpOwotCQlpZiAoY29sb3IgPT0gbnVsbCkgewotCQkJY29sb3IgPSBmRGVmYXVsdEJhY2tncm91bmQ7Ci0JCX0KLQkJaWYgKGZCYWNrZ3JvdW5kLmdldFNpemUoKS54ID4gMCAmJiBmQmFja2dyb3VuZC5nZXRTaXplKCkueSA+IDAgJiYgKGZCYWNrZ3JvdW5kLmdldEltYWdlKCkgPT0gbnVsbCB8fCBmQmFja2dyb3VuZC5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpID09IG51bGwgfHwgZkJhY2tncm91bmQuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKS5nZXRSR0JzKCkgPT0gbnVsbCB8fCBmQmFja2dyb3VuZC5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpLmdldFJHQnMoKS5sZW5ndGggPCAxIHx8ICFmQmFja2dyb3VuZC5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpLmdldFJHQnMoKVswXS5lcXVhbHMoY29sb3IuZ2V0UkdCKCkpKSkgewotCQkJaWYgKGZCYWNrZ3JvdW5kLmdldEltYWdlKCkgIT0gbnVsbCkKLQkJCQlmQmFja2dyb3VuZC5nZXRJbWFnZSgpLmRpc3Bvc2UoKTsKLQkJCUltYWdlIGJhY2tncm91bmQgPSBuZXcgSW1hZ2UoZ2V0RGlzcGxheSgpLCBuZXcgSW1hZ2VEYXRhKGZCYWNrZ3JvdW5kLmdldFNpemUoKS54LCBmQmFja2dyb3VuZC5nZXRTaXplKCkueSwgMSwgbmV3IFBhbGV0dGVEYXRhKG5ldyBSR0JbXXtjb2xvci5nZXRSR0IoKX0pKSk7Ci0JCQlmQmFja2dyb3VuZC5zZXRJbWFnZShiYWNrZ3JvdW5kKTsKLQkJfQotCQlmQm9sZC5zZXRTZWxlY3Rpb24oKGF0dHJpYnV0ZS5nZXRTdHlsZSgpICYgU1dULkJPTEQpICE9IDApOwotCQlpZiAoc2hvd0l0YWxpYykKLQkJCWZJdGFsaWMuc2V0U2VsZWN0aW9uKChhdHRyaWJ1dGUuZ2V0U3R5bGUoKSAmIFNXVC5JVEFMSUMpICE9IDApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFwcGx5U3R5bGVzKCkgewotCQlpZiAoZlRleHQgPT0gbnVsbCB8fCBmVGV4dC5pc0Rpc3Bvc2VkKCkgfHwgZklucHV0ID09IG51bGwgfHwgZklucHV0Lmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCS8vCQlMaXN0IHJlZ2lvbnMgPSBmUGFyc2VyLmdldFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gZk5vZGVzOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IG5vZGUuZ2V0UmVnaW9ucygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gY3VycmVudFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCS8vIGxvb2t1cCB0aGUgbG9jYWwgY29sb3JpbmcgdHlwZSBhbmQgYXBwbHkgaXQKLQkJCQlTdHJpbmcgbmFtZWRTdHlsZSA9IChTdHJpbmcpIGdldENvbnRleHRTdHlsZU1hcCgpLmdldChjdXJyZW50UmVnaW9uLmdldFR5cGUoKSk7Ci0JCQkJaWYgKG5hbWVkU3R5bGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJVGV4dEF0dHJpYnV0ZSBhdHRyaWJ1dGUgPSBnZXRBdHRyaWJ1dGUobmFtZWRTdHlsZSk7Ci0JCQkJaWYgKGF0dHJpYnV0ZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlTdHlsZVJhbmdlIHN0eWxlID0gbmV3IFN0eWxlUmFuZ2Uobm9kZS5nZXRTdGFydE9mZnNldChjdXJyZW50UmVnaW9uKSwgY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSwgYXR0cmlidXRlLmdldEZvcmVncm91bmQoKSwgYXR0cmlidXRlLmdldEJhY2tncm91bmQoKSwgYXR0cmlidXRlLmdldFN0eWxlKCkpOwotCQkJCWZUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotCQkJfQotCQkJbm9kZSA9IG5vZGUuZ2V0TmV4dCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBSR0IgY2hhbmdlQ29sb3IoUkdCIHN0YXJ0VmFsdWUpIHsKLQkJQ29sb3JEaWFsb2cgY29sb3JEbGcgPSBuZXcgQ29sb3JEaWFsb2coZ2V0U2hlbGwoKSk7Ci0JCWlmIChzdGFydFZhbHVlICE9IG51bGwpCi0JCQljb2xvckRsZy5zZXRSR0Ioc3RhcnRWYWx1ZSk7Ci0JCWlmKGNvbG9yRGxnLmdldFRleHQoKSA9PSBudWxsIHx8IGNvbG9yRGxnLmdldFRleHQoKS5sZW5ndGgoKSA9PSAwKQotCQkJY29sb3JEbGcuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlN0eWxlZFRleHRDb2xvclBpY2tlcl8wKTsKLQkJY29sb3JEbGcub3BlbigpOwotCQlSR0IgbmV3UkdCID0gY29sb3JEbGcuZ2V0UkdCKCk7Ci0JCWlmIChuZXdSR0IgIT0gbnVsbCkKLQkJCXJldHVybiBuZXdSR0I7Ci0JCXJldHVybiBzdGFydFZhbHVlOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGNoYW5nZUNvbG9yKFN0cmluZyByZ2IpIHsKLQkJU3RyaW5nIGNoYW5nZWRDb2xvciA9ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JCVJHQiBuZXdDb2xvciA9IGNoYW5nZUNvbG9yKENvbG9ySGVscGVyLnRvUkdCKHJnYikpOwotCQkvLyBudWxsIGNoZWNrIHRvIHNlZSBpZiB1c2luZyBkZWZhdWx0IHZhbHVlCi0JCWlmIChuZXdDb2xvciAhPSBudWxsKQotCQkJY2hhbmdlZENvbG9yID0gQ29sb3JIZWxwZXIudG9SR0JTdHJpbmcobmV3Q29sb3IpOwotCQlyZXR1cm4gY2hhbmdlZENvbG9yOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNsb3NlKCkgewotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgc2l6ZSBvZiBjb2xvciBidXR0b24gY29waWVkIGZyb20KLQkgKiBvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwudWkucHJlZmVyZW5jZXMuQ29sb3JFZGl0b3IgMSBtb2RpZmljYXRpb24gLQotCSAqIGFkZGVkIDQgdG8gZmluYWwgaGVpZ2h0Ci0JICovCi0JcHJpdmF0ZSBQb2ludCBjb21wdXRlSW1hZ2VTaXplKENvbnRyb2wgd2luZG93KSB7Ci0JCUdDIGdjID0gbmV3IEdDKHdpbmRvdyk7Ci0JCUZvbnQgZiA9IEpGYWNlUmVzb3VyY2VzLmdldEZvbnRSZWdpc3RyeSgpLmdldChKRmFjZVJlc291cmNlcy5ERUZBVUxUX0ZPTlQpOwotCQlnYy5zZXRGb250KGYpOwotCQlpbnQgaGVpZ2h0ID0gZ2MuZ2V0Rm9udE1ldHJpY3MoKS5nZXRIZWlnaHQoKTsKLQkJZ2MuZGlzcG9zZSgpOwotCQlQb2ludCBwID0gbmV3IFBvaW50KGhlaWdodCAqIDMgLSA2LCBoZWlnaHQgKyA0KTsKLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhbiBuZXcgY2hlY2tib3ggaW5zdGFuY2UgYW5kIHNldHMgdGhlIGRlZmF1bHQgbGF5b3V0IGRhdGEuCi0JICogCi0JICogQHBhcmFtIGdyb3VwCi0JICogICAgICAgICAgICB0aGUgY29tcG9zaXRlIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgY2hlY2tib3gKLQkgKiBAcGFyYW0gbGFiZWwKLQkgKiAgICAgICAgICAgIHRoZSBzdHJpbmcgdG8gc2V0IGludG8gdGhlIGNoZWNrYm94Ci0JICogQHJldHVybiB0aGUgbmV3IGNoZWNrYm94Ci0JICovCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlQ2hlY2tCb3goQ29tcG9zaXRlIGdyb3VwLCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyB8IFNXVC5DRU5URVIpOwotCQlpZiAobGFiZWwgIT0gbnVsbCkKLQkJCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0VORDsKLQkJLy8JZGF0YS52ZXJ0aWNhbEFsaWdubWVudCA9IEdyaWREYXRhLlZFUlRJQ0FMX0FMSUdOX0ZJTEw7Ci0JCWJ1dHRvbi5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gYnV0dG9uOwotCX0KLQotCXByaXZhdGUgQ29tYm8gY3JlYXRlQ29tYm8oQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gbGFiZWxzLCBpbnQgc2VsZWN0ZWRJdGVtKSB7Ci0JCUNvbWJvIGNvbWJvID0gbmV3IENvbWJvKHBhcmVudCwgU1dULkRST1BfRE9XTiB8IFNXVC5SRUFEX09OTFkpOwotCQljb21iby5zZXRJdGVtcyhsYWJlbHMpOwotCQlpZiAoc2VsZWN0ZWRJdGVtID49IDApCi0JCQljb21iby5zZWxlY3Qoc2VsZWN0ZWRJdGVtKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5IT1JJWk9OVEFMX0FMSUdOX0ZJTEw7Ci0JCWNvbWJvLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21ibzsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGNvbXBvc2l0ZSBjb250cm9sIGFuZCBzZXRzIHRoZSBkZWZhdWx0IGxheW91dCBkYXRhLgotCSAqLwotCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZUNvbXBvc2l0ZShDb21wb3NpdGUgcGFyZW50LCBpbnQgbnVtQ29sdW1ucykgewotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJLy9HcmlkTGF5b3V0Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSBudW1Db2x1bW5zOwotCQlsYXlvdXQuaG9yaXpvbnRhbFNwYWNpbmcgPSA1OwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gZmFsc2U7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJLy9HcmlkRGF0YQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfVkVSVElDQUwpOwotCQlkYXRhLmdyYWJFeGNlc3NWZXJ0aWNhbFNwYWNlID0gZmFsc2U7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVI7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRyb2xzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIHN0eWxlUm93ID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMyk7Ci0JCS8vIHJvdyAxIC0gY29udGVudCB0eXBlIGxhYmVsLCBjb21ibyBib3gsIHJlc3RvcmUgZGVmYXVsdHMKLQkJY3JlYXRlTGFiZWwoc3R5bGVSb3csIFNTRVVJTWVzc2FnZXMuQ29udGVudF90eXBlX19VSV8pOyAvLyROT04tTkxTLTEkID0gIkNvbnRlbnQgdHlwZToiCi0JCS8vIENvbnRleHRzIGNvbWJvIGJveAotCQlmU3R5bGVDb21ibyA9IGNyZWF0ZUNvbWJvKHN0eWxlUm93LCBuZXcgU3RyaW5nWzBdLCAtMSk7Ci0JCWZDbGVhclN0eWxlID0gY3JlYXRlUHVzaEJ1dHRvbihzdHlsZVJvdywgU1NFVUlNZXNzYWdlcy5SZXN0b3JlX0RlZmF1bHRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJSZXN0b3JlIERlZmF1bHQiCi0JCUNvbXBvc2l0ZSBzdHlsZVJvdzI7Ci0JCWlmIChzaG93SXRhbGljKQotCQkJc3R5bGVSb3cyID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgNyk7Ci0JCWVsc2UKLQkJCXN0eWxlUm93MiA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDYpOwotCQkvLyByb3cgMiAtIGZvcmVncm91bmQgbGFiZWwsIGJ1dHRvbiwgYmFja2dyb3VuZCBsYWJlbCwgYnV0dG9uLCBib2xkLAotCQkvLyBpdGFsaWNzPwotCQlmRm9yZWdyb3VuZExhYmVsID0gY3JlYXRlTGFiZWwoc3R5bGVSb3cyLCBTU0VVSU1lc3NhZ2VzLkZvcmVncm91bmRfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJGb3JlZ3JvdW5kIgotCQlmRm9yZWdyb3VuZCA9IGNyZWF0ZVB1c2hCdXR0b24oc3R5bGVSb3cyLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJc2V0QWNjZXNzaWJsZShmRm9yZWdyb3VuZCwgZkZvcmVncm91bmRMYWJlbC5nZXRUZXh0KCkpOwotCQlmRm9yZWdyb3VuZC5nZXRBY2Nlc3NpYmxlKCkuYWRkQWNjZXNzaWJsZUNvbnRyb2xMaXN0ZW5lcihmb3JlZ3JvdW5kQWNjTGlzdGVuZXIpOyAvLyBkZWZlY3QKLQkJLy8gMjAwNzY0Ci0JCS8vIC0KLQkJLy8gQUNDOmRpc3BsYXkKLQkJLy8gdmFsdWVzCi0JCS8vIGZvcgotCQkvLyBjb2xvcgotCQkvLyBidXR0b25zCi0JCVBvaW50IGJ1dHRvblNpemUgPSBjb21wdXRlSW1hZ2VTaXplKHBhcmVudCk7Ci0JCSgoR3JpZERhdGEpIGZGb3JlZ3JvdW5kLmdldExheW91dERhdGEoKSkud2lkdGhIaW50ID0gYnV0dG9uU2l6ZS54OwotCQkoKEdyaWREYXRhKSBmRm9yZWdyb3VuZC5nZXRMYXlvdXREYXRhKCkpLmhlaWdodEhpbnQgPSBidXR0b25TaXplLnk7Ci0JCWZCYWNrZ3JvdW5kTGFiZWwgPSBjcmVhdGVMYWJlbChzdHlsZVJvdzIsIFNTRVVJTWVzc2FnZXMuQmFja2dyb3VuZF9VSV8pOyAvLyROT04tTkxTLTEkID0gIkJhY2tncm91bmQiCi0JCWZCYWNrZ3JvdW5kID0gY3JlYXRlUHVzaEJ1dHRvbihzdHlsZVJvdzIsICIiKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRBY2Nlc3NpYmxlKGZCYWNrZ3JvdW5kLCBmQmFja2dyb3VuZExhYmVsLmdldFRleHQoKSk7Ci0JCWZCYWNrZ3JvdW5kLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlQ29udHJvbExpc3RlbmVyKGJhY2tncm91bmRBY2NMaXN0ZW5lcik7IC8vIGRlZmVjdAotCQkvLyAyMDA3NjQKLQkJLy8gLQotCQkvLyBBQ0M6ZGlzcGxheQotCQkvLyB2YWx1ZXMKLQkJLy8gZm9yCi0JCS8vIGNvbG9yCi0JCS8vIGJ1dHRvbnMKLQkJKChHcmlkRGF0YSkgZkJhY2tncm91bmQuZ2V0TGF5b3V0RGF0YSgpKS53aWR0aEhpbnQgPSBidXR0b25TaXplLng7Ci0JCSgoR3JpZERhdGEpIGZCYWNrZ3JvdW5kLmdldExheW91dERhdGEoKSkuaGVpZ2h0SGludCA9IGJ1dHRvblNpemUueTsKLQkJY3JlYXRlTGFiZWwoc3R5bGVSb3cyLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZkJvbGQgPSBjcmVhdGVDaGVja0JveChzdHlsZVJvdzIsIFNTRVVJTWVzc2FnZXMuQm9sZF9VSV8pOwotCQlpZiAoc2hvd0l0YWxpYykKLQkJCWZJdGFsaWMgPSBjcmVhdGVDaGVja0JveChzdHlsZVJvdzIsIFNTRVVJTWVzc2FnZXMuSXRhbGljc19VSSk7Ci0JCS8vCQkvLyBEZWZhdWx0cyBjaGVja2JveAotCQlmRm9yZWdyb3VuZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJZkJhY2tncm91bmQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCWZDbGVhclN0eWxlLnNldEVuYWJsZWQoZmFsc2UpOwotCQlmQm9sZC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJaWYgKHNob3dJdGFsaWMpCi0JCQlmSXRhbGljLnNldEVuYWJsZWQoZmFsc2UpOwotCQlmRm9yZWdyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQlmQmFja2dyb3VuZExhYmVsLnNldEVuYWJsZWQoZmFsc2UpOwotCQlDb21wb3NpdGUgc2FtcGxlID0gY3JlYXRlQ29tcG9zaXRlKHBhcmVudCwgMSk7Ci0JCWNyZWF0ZUxhYmVsKHNhbXBsZSwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQkvLyBCVUcxNDEwODkgLSBtYWtlIHN1cmUgdGV4dCBpcyBsZWZ0LWFsaWduZWQKLQkJZlRleHQgPSBuZXcgU3R5bGVkVGV4dChzYW1wbGUsIFNXVC5MRUZUX1RPX1JJR0hUIHwgU1dULk1VTFRJIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMIHwgU1dULkJPUkRFUiB8IFNXVC5SRUFEX09OTFkpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWZUZXh0LnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZUZXh0LnNldEVkaXRhYmxlKGZhbHNlKTsKLQkJZlRleHQuc2V0QmFja2dyb3VuZChmRGVmYXVsdEJhY2tncm91bmQpOwotCQlmVGV4dC5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldFRleHRGb250KCkpOwotCQlmVGV4dC5hZGRLZXlMaXN0ZW5lcihnZXRUZXh0S2V5TGlzdGVuZXIoKSk7Ci0JCWZUZXh0LmFkZFNlbGVjdGlvbkxpc3RlbmVyKGdldFRleHRTZWxlY3Rpb25MaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkTW91c2VMaXN0ZW5lcihnZXRUZXh0TW91c2VMaXN0ZW5lcigpKTsKLQkJZlRleHQuYWRkVHJhdmVyc2VMaXN0ZW5lcihnZXRUcmF2ZXJzZUxpc3RlbmVyKCkpOyAvLyBkZWZlY3QgMjIwMzc3IC0KLQkJLy8gUHJvdmlkZSB0YWIKLQkJLy8gdHJhdmVyc2FsIGZvcgotCQkvLyBmVGV4dCB3aWRnZXQKLQkJc2V0QWNjZXNzaWJsZShmVGV4dCwgU1NFVUlNZXNzYWdlcy5TYW1wbGVfdGV4dF9fVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICImU2FtcGxlIHRleHQ6IgotCQlmRm9yZWdyb3VuZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0JCWZCYWNrZ3JvdW5kLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1dHRvbkxpc3RlbmVyKTsKLQkJZkNsZWFyU3R5bGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIoYnV0dG9uTGlzdGVuZXIpOwotCQlmQm9sZC5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0JCWlmIChzaG93SXRhbGljKQotCQkJZkl0YWxpYy5hZGRTZWxlY3Rpb25MaXN0ZW5lcihidXR0b25MaXN0ZW5lcik7Ci0JCWZTdHlsZUNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGNvbWJvTGlzdGVuZXIpOwotCX0KLQotCS8qKgotCSAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgY3JlYXRlcyBhIGxhYmVsIGluc3RhbmNlIGFuZCBzZXRzIHRoZSBkZWZhdWx0Ci0JICogbGF5b3V0IGRhdGEuCi0JICovCi0JcHJpdmF0ZSBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlsYWJlbC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gbGFiZWw7Ci0JfQotCi0JcHJpdmF0ZSBCdXR0b24gY3JlYXRlUHVzaEJ1dHRvbihDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgbGFiZWwpIHsKLQkJQnV0dG9uIGJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuUFVTSCk7Ci0JCWJ1dHRvbi5zZXRUZXh0KGxhYmVsKTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkvLwlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlidXR0b24uc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJcmV0dXJuIGJ1dHRvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWVkU3R5bGUpIHsKLQkJVGV4dEF0dHJpYnV0ZSB0YSA9IG5ldyBUZXh0QXR0cmlidXRlKGdldERlZmF1bHRGb3JlZ3JvdW5kKCksIGdldERlZmF1bHRCYWNrZ3JvdW5kKCksIFNXVC5OT1JNQUwpOwotCi0JCWlmIChuYW1lZFN0eWxlICE9IG51bGwgJiYgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgIT0gbnVsbCkgewotCQkJU3RyaW5nIHByZWZTdHJpbmcgPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoZ2V0UHJlZmVyZW5jZUtleShuYW1lZFN0eWxlKSk7Ci0JCQlTdHJpbmdbXSBzdHlsZVByZWZzID0gQ29sb3JIZWxwZXIudW5wYWNrU3R5bGVQcmVmZXJlbmNlcyhwcmVmU3RyaW5nKTsKLQkJCWlmIChzdHlsZVByZWZzICE9IG51bGwpIHsKLQkJCQlSR0IgZm9yZWdyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMF0pOwotCQkJCVJHQiBiYWNrZ3JvdW5kID0gQ29sb3JIZWxwZXIudG9SR0Ioc3R5bGVQcmVmc1sxXSk7Ci0KLQkJCQlpbnQgZm9udE1vZGlmaWVyID0gU1dULk5PUk1BTDsKLQkJCQlib29sZWFuIGJvbGQgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1syXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJaWYgKGJvbGQpCi0JCQkJCWZvbnRNb2RpZmllciA9IGZvbnRNb2RpZmllciB8IFNXVC5CT0xEOwotCi0JCQkJaWYgKHNob3dJdGFsaWMpIHsKLQkJCQkJYm9vbGVhbiBpdGFsaWMgPSBCb29sZWFuLnZhbHVlT2Yoc3R5bGVQcmVmc1szXSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJCWlmIChpdGFsaWMpCi0JCQkJCQlmb250TW9kaWZpZXIgPSBmb250TW9kaWZpZXIgfCBTV1QuSVRBTElDOwotCQkJCX0KLQotCQkJCXRhID0gbmV3IFRleHRBdHRyaWJ1dGUoKGZvcmVncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGZvcmVncm91bmQpIDogbnVsbCwgKGJhY2tncm91bmQgIT0gbnVsbCkgPyBFZGl0b3JVdGlsaXR5LmdldENvbG9yKGJhY2tncm91bmQpIDogbnVsbCwgZm9udE1vZGlmaWVyKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdGE7Ci0JfQotCi0JLy8gZGVmZWN0IDIwMDc2NCAtIEFDQzpkaXNwbGF5IHZhbHVlcyBmb3IgY29sb3IgYnV0dG9ucwotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nIC0gY29sb3IgQnV0dG9uIGIncyBjdXJyZW50IFJCRyB2YWx1ZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENvbG9yQnV0dG9uVmFsdWUoQnV0dG9uIGIpIHsKLQkJaWYgKChiID09IG51bGwpIHx8IChiLmdldEltYWdlKCkgPT0gbnVsbCkgfHwgKGIuZ2V0SW1hZ2UoKS5nZXRJbWFnZURhdGEoKSA9PSBudWxsKSB8fCAoYi5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpLmdldFJHQnMoKSA9PSBudWxsKSB8fCAoYi5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpLmdldFJHQnMoKVswXSA9PSBudWxsKSkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsID0gYi5nZXRJbWFnZSgpLmdldEltYWdlRGF0YSgpLmdldFJHQnMoKVswXS50b1N0cmluZygpOwotCQlyZXR1cm4gdmFsOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBnZXRQcmVmZXJlbmNlU3RvcmUgaW5zdGVhZCBsZWZ0IGZvciBsZWdhY3kgY2xpZW50cywKLQkgKiAgICAgICAgICAgICBkZWxldGUgYnkgV1RQIE00Ci0JICovCi0JcHVibGljIE5vZGUgZ2V0Q29sb3JzTm9kZSgpIHsKLQkJLy9yZXR1cm4gZkNvbG9yc05vZGU7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkRpY3Rpb25hcnkKLQkgKi8KLQlwdWJsaWMgRGljdGlvbmFyeSBnZXRDb250ZXh0U3R5bGVNYXAoKSB7Ci0JCXJldHVybiBmQ29udGV4dFN0eWxlTWFwOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0JICovCi0JcHVibGljIENvbG9yIGdldERlZmF1bHRCYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gZkRlZmF1bHRCYWNrZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yCi0JICovCi0JcHVibGljIENvbG9yIGdldERlZmF1bHRGb3JlZ3JvdW5kKCkgewotCQlyZXR1cm4gZkRlZmF1bHRGb3JlZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gamF2YS51dGlsLkRpY3Rpb25hcnkKLQkgKi8KLQlwdWJsaWMgRGljdGlvbmFyeSBnZXREZXNjcmlwdGlvbnMoKSB7Ci0JCXJldHVybiBmRGVzY3JpcHRpb25zOwotCX0KLQotCXB1YmxpYyBGb250IGdldEZvbnQoKSB7Ci0JCXJldHVybiBmVGV4dC5nZXRGb250KCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROYW1lZFN0eWxlQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQkvLyBlbnN1cmUgdGhlIG9mZnNldCBpcyBjbGVhbgotCQlpZiAob2Zmc2V0ID49IGZJbnB1dC5sZW5ndGgoKSkKLQkJCXJldHVybiBnZXROYW1lZFN0eWxlQXRPZmZzZXQoZklucHV0Lmxlbmd0aCgpIC0gMSk7Ci0JCWVsc2UgaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm4gZ2V0TmFtZWRTdHlsZUF0T2Zmc2V0KDApOwotCQkvLyBmaW5kIHRoZSBJVGV4dFJlZ2lvbiBhdCB0aGlzIG9mZnNldAotCQlpZiAoZk5vZGVzID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhTm9kZSA9IGZOb2RlczsKLQkJd2hpbGUgKGFOb2RlICE9IG51bGwgJiYgIWFOb2RlLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpCi0JCQlhTm9kZSA9IGFOb2RlLmdldE5leHQoKTsKLQkJaWYgKGFOb2RlICE9IG51bGwpIHsKLQkJCS8vIGZpbmQgdGhlIElUZXh0UmVnaW9uJ3MgQ29udGV4dCBhdCB0aGlzIG9mZnNldAotCQkJSVRleHRSZWdpb24gaW50ZXJlc3QgPSBhTm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGludGVyZXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAob2Zmc2V0ID4gYU5vZGUuZ2V0VGV4dEVuZE9mZnNldChpbnRlcmVzdCkpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlTdHJpbmcgcmVnaW9uQ29udGV4dCA9IGludGVyZXN0LmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25Db250ZXh0ID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQkvLyBmaW5kIHRoZSBuYW1lZCBzdHlsZSAoaW50ZXJuYWwvc2VsZWN0YWJsZSBuYW1lKSBmb3IgdGhhdAotCQkJLy8gY29udGV4dAotCQkJU3RyaW5nIG5hbWVkU3R5bGUgPSAoU3RyaW5nKSBnZXRDb250ZXh0U3R5bGVNYXAoKS5nZXQocmVnaW9uQ29udGV4dCk7Ci0JCQlpZiAobmFtZWRTdHlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIG5hbWVkU3R5bGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0KLQlwdWJsaWMgUmVnaW9uUGFyc2VyIGdldFBhcnNlcigpIHsKLQkJcmV0dXJuIGZQYXJzZXI7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQganVzdCBrZXkga2V5IChubyBuZWVkIGZvciBnZW5lcmF0b3IpCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UHJlZmVyZW5jZUtleShTdHJpbmcga2V5KSB7Ci0JCVN0cmluZyBuZXdLZXkgPSBrZXk7Ci0vLwkJaWYgKGZHZW5lcmF0b3JLZXkgIT0gbnVsbCkgewotLy8JCQluZXdLZXkgPSBQcmVmZXJlbmNlS2V5R2VuZXJhdG9yLmdlbmVyYXRlS2V5KGtleSwgZkdlbmVyYXRvcktleSk7Ci0vLwkJfQotCQlyZXR1cm4gbmV3S2V5OwotCX0KLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCXJldHVybiBmUHJlZmVyZW5jZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nW10KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRTdHlsZUxpc3QoKSB7Ci0JCXJldHVybiBmU3R5bGVMaXN0OwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFN0eWxlTmFtZShTdHJpbmcgZGVzY3JpcHRpb24pIHsKLQkJaWYgKGRlc2NyaXB0aW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHN0eWxlTmFtZSA9IG51bGw7Ci0JCWphdmEudXRpbC5FbnVtZXJhdGlvbiBrZXlzID0gZ2V0RGVzY3JpcHRpb25zKCkua2V5cygpOwotCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJU3RyaW5nIHRlc3QgPSBrZXlzLm5leHRFbGVtZW50KCkudG9TdHJpbmcoKTsKLQkJCWlmIChnZXREZXNjcmlwdGlvbnMoKS5nZXQodGVzdCkuZXF1YWxzKGRlc2NyaXB0aW9uKSkgewotCQkJCXN0eWxlTmFtZSA9IHRlc3Q7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHN0eWxlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmSW5wdXQ7Ci0JfQotCi0JcHJpdmF0ZSBLZXlMaXN0ZW5lciBnZXRUZXh0S2V5TGlzdGVuZXIoKSB7Ci0JCXJldHVybiBuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGtleVJlbGVhc2VkKEtleUV2ZW50IGUpIHsKLQkJCQlpZiAoZS53aWRnZXQgaW5zdGFuY2VvZiBTdHlsZWRUZXh0KSB7Ci0JCQkJCWludCB4ID0gKChTdHlsZWRUZXh0KSBlLndpZGdldCkuZ2V0Q2FyZXRPZmZzZXQoKTsKLQkJCQkJc2VsZWN0Q29sb3JBdE9mZnNldCh4KTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JcHJpdmF0ZSBNb3VzZUxpc3RlbmVyIGdldFRleHRNb3VzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IE1vdXNlTGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpbnQgeCA9ICgoU3R5bGVkVGV4dCkgZS53aWRnZXQpLmdldENhcmV0T2Zmc2V0KCk7Ci0JCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoeCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCXByaXZhdGUgU2VsZWN0aW9uTGlzdGVuZXIgZ2V0VGV4dFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlzZWxlY3RDb2xvckF0T2Zmc2V0KGUueCk7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLQkJCQl9Ci0JCQl9Ci0KLS8vIENvbW1lbnRlZCBvdXQgd2hlbiBtb3ZpbmcgdG8gUkMyIHRvIHJlbW92ZSAidW51c2VkIiBlcnJvci93YXJuaW5nCQkJCi0vLwkJCXB1YmxpYyB2b2lkIHdpZGdldERvdWJsZVNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLS8vCQkJCXNlbGVjdENvbG9yQXRPZmZzZXQoZS54KTsKLS8vCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLS8vCQkJCQkoKFN0eWxlZFRleHQpIGUud2lkZ2V0KS5zZXRTZWxlY3Rpb24oZS54KTsKLS8vCQkJCX0KLS8vCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJc2VsZWN0Q29sb3JBdE9mZnNldChlLngpOwotCQkJCWlmIChlLndpZGdldCBpbnN0YW5jZW9mIFN0eWxlZFRleHQpIHsKLQkJCQkJKChTdHlsZWRUZXh0KSBlLndpZGdldCkuc2V0U2VsZWN0aW9uKGUueCk7Ci0JCQkJfQotCQkJfQotCQl9OwotCX0KLQotCS8vIGRlZmVjdCAyMjAzNzcgLSBQcm92aWRlIHRhYiB0cmF2ZXJzYWwgZm9yIGZUZXh0IHdpZGdldAotCXByaXZhdGUgVHJhdmVyc2VMaXN0ZW5lciBnZXRUcmF2ZXJzZUxpc3RlbmVyKCkgewotCQlyZXR1cm4gbmV3IFRyYXZlcnNlTGlzdGVuZXIoKSB7Ci0JCQkvKioKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5UcmF2ZXJzZUxpc3RlbmVyI2tleVRyYXZlcnNlZChUcmF2ZXJzZUV2ZW50KQotCQkJICovCi0JCQlwdWJsaWMgdm9pZCBrZXlUcmF2ZXJzZWQoVHJhdmVyc2VFdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0IGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCQlpZiAoKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfTkVYVCkgfHwgKGUuZGV0YWlsID09IFNXVC5UUkFWRVJTRV9UQUJfUFJFVklPVVMpKQotCQkJCQkJZS5kb2l0ID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLy8gcmVmcmVzaCB0aGUgR1VJIGFmdGVyIGEgY29sb3IgY2hhbmdlCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJZlRleHQuc2V0UmVkcmF3KGZhbHNlKTsKLQkJaW50IHNlbGVjdGVkSW5kZXggPSBmU3R5bGVDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBzZWxlY3RlZEluZGV4ID49IDAgPyBmU3R5bGVDb21iby5nZXRJdGVtKHNlbGVjdGVkSW5kZXgpIDogbnVsbDsKLQkJYWN0aXZhdGUoZ2V0U3R5bGVOYW1lKGRlc2NyaXB0aW9uKSk7Ci0JCS8vIHVwZGF0ZSBGb250Ci0JCWZUZXh0LnNldEZvbnQoSkZhY2VSZXNvdXJjZXMuZ2V0VGV4dEZvbnQoKSk7Ci0JCS8vIHJlYXBwbHlTdHlsZXMKLQkJYXBwbHlTdHlsZXMoKTsKLQkJZlRleHQuc2V0UmVkcmF3KHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VQaWNrZXJSZXNvdXJjZXMoKSB7Ci0JCWlmIChmRm9yZWdyb3VuZCAhPSBudWxsICYmICFmRm9yZWdyb3VuZC5pc0Rpc3Bvc2VkKCkgJiYgZkZvcmVncm91bmQuZ2V0SW1hZ2UoKSAhPSBudWxsKQotCQkJZkZvcmVncm91bmQuZ2V0SW1hZ2UoKS5kaXNwb3NlKCk7Ci0JCWlmIChmQmFja2dyb3VuZCAhPSBudWxsICYmICFmQmFja2dyb3VuZC5pc0Rpc3Bvc2VkKCkgJiYgZkJhY2tncm91bmQuZ2V0SW1hZ2UoKSAhPSBudWxsKQotCQkJZkJhY2tncm91bmQuZ2V0SW1hZ2UoKS5kaXNwb3NlKCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNlbGVjdENvbG9yQXRPZmZzZXQoaW50IG9mZnNldCkgewotCQlTdHJpbmcgbmFtZWRTdHlsZSA9IGdldE5hbWVkU3R5bGVBdE9mZnNldChvZmZzZXQpOwotCQlpZiAobmFtZWRTdHlsZSA9PSBudWxsKSB7Ci0JCQlmU3R5bGVDb21iby5kZXNlbGVjdEFsbCgpOwotCQkJYWN0aXZhdGUobnVsbCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJU3RyaW5nIGRlc2NyaXB0aW9uID0gKFN0cmluZykgZ2V0RGVzY3JpcHRpb25zKCkuZ2V0KG5hbWVkU3R5bGUpOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGl0ZW1Db3VudCA9IGZTdHlsZUNvbWJvLmdldEl0ZW1Db3VudCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1Db3VudDsgaSsrKSB7Ci0JCQlpZiAoZlN0eWxlQ29tYm8uZ2V0SXRlbShpKS5lcXVhbHMoZGVzY3JpcHRpb24pKSB7Ci0JCQkJZlN0eWxlQ29tYm8uc2VsZWN0KGkpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCWFjdGl2YXRlKG5hbWVkU3R5bGUpOwotCX0KLQotCS8qKgotCSAqIFNwZWNpZmljYWxseSBzZXQgdGhlIHJlcG9ydGluZyBuYW1lIG9mIGEgY29udHJvbCBmb3IgYWNjZXNzaWJpbGl0eQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRBY2Nlc3NpYmxlKENvbnRyb2wgY29udHJvbCwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKGNvbnRyb2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJZmluYWwgU3RyaW5nIG4gPSBuYW1lOwotCQljb250cm9sLmdldEFjY2Vzc2libGUoKS5hZGRBY2Nlc3NpYmxlTGlzdGVuZXIobmV3IEFjY2Vzc2libGVBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgZ2V0TmFtZShBY2Nlc3NpYmxlRXZlbnQgZSkgewotCQkJCWlmIChlLmNoaWxkSUQgPT0gQUNDLkNISUxESURfU0VMRikKLQkJCQkJZS5yZXN1bHQgPSBuOwotCQkJfQotCQl9KTsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0UHJlZmVyZW5jZVN0b3JlIGluc3RlYWQgbGVmdCBmb3IgbGVnYWN5IGNsaWVudHMsCi0JICogICAgICAgICAgICAgZGVsZXRlIGJ5IFdUUCBNNAotCSAqLwotCXB1YmxpYyB2b2lkIHNldENvbG9yc05vZGUoTm9kZSBuZXdDb2xvcnNOb2RlKSB7Ci0JCS8vZkNvbG9yc05vZGUgPSBuZXdDb2xvcnNOb2RlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdDb250ZXh0U3R5bGVNYXAKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgbmV3Q29udGV4dFN0eWxlTWFwKSB7Ci0JCWZDb250ZXh0U3R5bGVNYXAgPSBuZXdDb250ZXh0U3R5bGVNYXA7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld0RlZmF1bHRCYWNrZ3JvdW5kCi0JICogICAgICAgICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3IKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0QmFja2dyb3VuZChDb2xvciBuZXdEZWZhdWx0QmFja2dyb3VuZCkgewotCQlmRGVmYXVsdEJhY2tncm91bmQgPSBuZXdEZWZhdWx0QmFja2dyb3VuZDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2Ugc2V0UHJlZmVyZW5jZVN0b3JlIGluc3RlYWQgbGVmdCBmb3IgbGVnYWN5IGNsaWVudHMsCi0JICogICAgICAgICAgICAgZGVsZXRlIGJ5IFdUUCBNNAotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRDb2xvcnNOb2RlKE5vZGUgbmV3RGVmYXVsdENvbG9yc05vZGUpIHsKLQkJLy9mRGVmYXVsdENvbG9yc05vZGUgPSBuZXdEZWZhdWx0Q29sb3JzTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbmV3RGVmYXVsdEZvcmVncm91bmQKLQkgKiAgICAgICAgICAgIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERlZmF1bHRGb3JlZ3JvdW5kKENvbG9yIG5ld0RlZmF1bHRGb3JlZ3JvdW5kKSB7Ci0JCWZEZWZhdWx0Rm9yZWdyb3VuZCA9IG5ld0RlZmF1bHRGb3JlZ3JvdW5kOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdEZXNjcmlwdGlvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5EaWN0aW9uYXJ5Ci0JICovCi0JcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb25zKERpY3Rpb25hcnkgbmV3RGVzY3JpcHRpb25zKSB7Ci0JCWZEZXNjcmlwdGlvbnMgPSBuZXdEZXNjcmlwdGlvbnM7Ci0JCXVwZGF0ZVN0eWxlTGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvbnQoRm9udCBmb250KSB7Ci0JCWZUZXh0LnNldEZvbnQoZm9udCk7Ci0JCWZUZXh0LnJlZHJhdygpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIGdlbmVyYXRvciBrZXkgc2hvdWxkIG5vIGxvbmdlciBiZSBuZWVkZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3JLZXkoU3RyaW5nIGtleSkgewotLy8JCWZHZW5lcmF0b3JLZXkgPSBrZXk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5ld1BhcnNlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFBhcnNlcihSZWdpb25QYXJzZXIgbmV3UGFyc2VyKSB7Ci0JCWZQYXJzZXIgPSBuZXdQYXJzZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJlZmVyZW5jZVN0b3JlKElQcmVmZXJlbmNlU3RvcmUgc3RvcmUpIHsKLQkJZlByZWZlcmVuY2VTdG9yZSA9IHN0b3JlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBuZXdTdHlsZUxpc3QKLQkgKiAgICAgICAgICAgIFN0cmluZ1tdCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3R5bGVMaXN0KExpc3QgbmV3U3R5bGVMaXN0KSB7Ci0JCWZTdHlsZUxpc3QgPSBuZXdTdHlsZUxpc3Q7Ci0JCXVwZGF0ZVN0eWxlTGlzdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHQoU3RyaW5nIHMpIHsKLQkJZklucHV0ID0gczsKLQkJZ2V0UGFyc2VyKCkucmVzZXQobmV3IENoYXJBcnJheVJlYWRlcihmSW5wdXQudG9DaGFyQXJyYXkoKSkpOwotCQlmTm9kZXMgPSBnZXRQYXJzZXIoKS5nZXREb2N1bWVudFJlZ2lvbnMoKTsKLQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJMZW5ndGggb2YgaW5wdXQ6ICIgLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy0xJAotCQkJCQkJKyBzLmxlbmd0aCgpICsgIiwgIiAvLyROT04tTkxTLTEkCi0JCQkJCQkrIGdldFBhcnNlcigpLmdldFJlZ2lvbnMoKS5zaXplKCkgKyAiIHJlZ2lvbnMuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZUZXh0ICE9IG51bGwpCi0JCQlmVGV4dC5zZXRUZXh0KHMpOwotCQlhcHBseVN0eWxlcygpOwotCX0KLQotCi0KLQkvKioKLQkgKiBAcmV0dXJuIG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SR0IKLQkgKiBAcGFyYW0gYW5SR0JTdHJpbmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZGVmYXVsdFJHQgotCSAqICAgICAgICAgICAgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQgotCSAqLwotCS8vIFRPRE86IG5ldmVyIHVzZWQKLQkgUkdCIHRvUkdCKFN0cmluZyBhblJHQlN0cmluZywgUkdCIGRlZmF1bHRSR0IpIHsKLQkJUkdCIHJlc3VsdCA9IENvbG9ySGVscGVyLnRvUkdCKGFuUkdCU3RyaW5nKTsKLQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJcmV0dXJuIGRlZmF1bHRSR0I7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVN0eWxlTGlzdCgpIHsKLQkJaWYgKGZTdHlsZUxpc3QgPT0gbnVsbCB8fCBmRGVzY3JpcHRpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVN0cmluZ1tdIGRlc2NyaXB0aW9ucyA9IG5ldyBTdHJpbmdbZlN0eWxlTGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdHlsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLQkJCWlmIChmU3R5bGVMaXN0LmdldChpKSAhPSBudWxsKQotCQkJCWRlc2NyaXB0aW9uc1tpXSA9IChTdHJpbmcpIGdldERlc2NyaXB0aW9ucygpLmdldChmU3R5bGVMaXN0LmdldChpKSk7Ci0JCQllbHNlCi0JCQkJZGVzY3JpcHRpb25zW2ldID0gKFN0cmluZykgZlN0eWxlTGlzdC5nZXQoaSk7Ci0JCX0KLQkJT2JqZWN0W10gc29ydGVkT2JqZWN0cyA9IG5ldyBEZXNjcmlwdGlvblNvcnRlcigpLnNvcnQoZGVzY3JpcHRpb25zKTsKLQkJU3RyaW5nW10gc29ydGVkRGVzY3JpcHRpb25zID0gbmV3IFN0cmluZ1tkZXNjcmlwdGlvbnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXNvcnRlZERlc2NyaXB0aW9uc1tpXSA9IHNvcnRlZE9iamVjdHNbaV0udG9TdHJpbmcoKTsKLQkJfQotCQlmU3R5bGVDb21iby5zZXRJdGVtcyhzb3J0ZWREZXNjcmlwdGlvbnMpOwotCQlmU3R5bGVDb21iby5zZWxlY3QoMCk7IC8vZGVmZWN0IDIxOTg1NSAtIGluaXRpYWxseSBzZWxlY3QgZmlyc3QgaXRlbQotCQkvLyBpbiBjb21ib0JveAotCQkvLwkJZlN0eWxlQ29tYm8uZGVzZWxlY3RBbGwoKTsKLQl9Ci0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGV4dEhvdmVyUHJlZmVyZW5jZVRhYi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL3VpL1RleHRIb3ZlclByZWZlcmVuY2VUYWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA5MjM5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVGV4dEhvdmVyUHJlZmVyZW5jZVRhYi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5BcnJheUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNoZWNrU3RhdGVDaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DaGVja2JveFRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDaGVja1N0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuRm9udE1ldHJpY3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLlRleHRIb3Zlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLlRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuRWRpdG9yVXRpbGl0eTsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIHRhYiBmb3IgU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBob3ZlciBoZWxwIHByZWZlcmVuY2VzCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIFRleHRIb3ZlclByZWZlcmVuY2VUYWIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VUYWIgewotCi0JcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbFRhYmxlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJVGFibGVMYWJlbFByb3ZpZGVyIHsKLQkJcHVibGljIEludGVybmFsVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJY2FzZSAwIDogLy8gdGV4dCBob3ZlciBsYWJlbAotCQkJCQlyZXR1cm4gKChUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3IpIGVsZW1lbnQpLmdldExhYmVsKCk7Ci0KLQkJCQljYXNlIDEgOiAvLyB0ZXh0IGhvdmVyIHN0YXRlIG1hc2sKLQkJCQkJcmV0dXJuICgoVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yKSBlbGVtZW50KS5nZXRNb2RpZmllclN0cmluZygpOwotCi0JCQkJZGVmYXVsdCA6Ci0JCQkJCWJyZWFrOwotCQkJfQotCi0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVIgPSBTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfZGVsaW1pdGVyOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBUZXh0IGZEZXNjcmlwdGlvbjsKLQlwcml2YXRlIFRhYmxlIGZIb3ZlclRhYmxlOwotCXByaXZhdGUgVGFibGVWaWV3ZXIgZkhvdmVyVGFibGVWaWV3ZXI7Ci0JcHJpdmF0ZSBUYWJsZUNvbHVtbiBmTW9kaWZpZXJDb2x1bW47Ci0JLy8gZm9yIHRoaXMgcHJlZmVyZW5jZSBwYWdlCi0JcHJpdmF0ZSBUZXh0IGZNb2RpZmllckVkaXRvcjsKLQlwcml2YXRlIFRhYmxlQ29sdW1uIGZOYW1lQ29sdW1uOwotCi0JcHJpdmF0ZSBUZXh0SG92ZXJEZXNjcmlwdG9yW10gZlRleHRIb3ZlcnM7IC8vIGN1cnJlbnQgbGlzdCBvZiB0ZXh0IGhvdmVycwotCi0JcHVibGljIFRleHRIb3ZlclByZWZlcmVuY2VUYWIoUHJlZmVyZW5jZVBhZ2UgbWFpblByZWZlcmVuY2VQYWdlLCBPdmVybGF5UHJlZmVyZW5jZVN0b3JlIHN0b3JlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWFpblByZWZlcmVuY2VQYWdlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChzdG9yZSk7Ci0JCXNldE1haW5QcmVmZXJlbmNlUGFnZShtYWluUHJlZmVyZW5jZVBhZ2UpOwotCQlzZXRPdmVybGF5U3RvcmUoc3RvcmUpOwotCQlnZXRPdmVybGF5U3RvcmUoKS5hZGRLZXlzKGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLklQcmVmZXJlbmNlVGFiI2NyZWF0ZUNvbnRlbnRzKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgdGFiRm9sZGVyKSB7Ci0JCUNvbXBvc2l0ZSBob3ZlckNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlob3ZlckNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKTsKLQkJaG92ZXJDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJLy8gY29tbWVudGVkIG91dCB1bnRpbCB0aGVzZSBwcmVmZXJlbmNlcyBhcmUgYWN0dWFsbHkgaGFuZGxlZCBpbiBzb21lCi0JCS8vIHdheQotCQkvLwkJU3RyaW5nIHJvbGxPdmVyTGFiZWw9Ci0JCS8vIFJlc291cmNlSGFuZGxlci5nZXRTdHJpbmcoIlRleHRIb3ZlclByZWZlcmVuY2VUYWIuYW5ub3RhdGlvblJvbGxvdmVyIik7Ci0JCS8vIC8vJE5PTi1OTFMtMSQKLQkJLy8JCWFkZENoZWNrQm94KGhvdmVyQ29tcG9zaXRlLCByb2xsT3ZlckxhYmVsLAotCQkvLyBDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMuRURJVE9SX0FOTk9UQVRJT05fUk9MTF9PVkVSLCAwKTsKLQkJLy8KLQkJLy8JCS8vIEFmZm9yZGFuY2UgY2hlY2tib3gKLQkJLy8JCVN0cmluZyBzaG93QWZmb3JkYW5jZUxhYmVsID0KLQkJLy8gUmVzb3VyY2VIYW5kbGVyLmdldFN0cmluZygiVGV4dEhvdmVyUHJlZmVyZW5jZVRhYi5zaG93QWZmb3JkYW5jZSIpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCS8vCQlhZGRDaGVja0JveChob3ZlckNvbXBvc2l0ZSwgc2hvd0FmZm9yZGFuY2VMYWJlbCwKLQkJLy8gQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9TSE9XX1RFWFRfSE9WRVJfQUZGT1JEQU5DRSwgMCk7Ci0KLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoaG92ZXJDb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfaG92ZXJQcmVmZXJlbmNlcyk7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCBmYWxzZSwgMiwgMSk7Ci0JCWdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5CRUdJTk5JTkc7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZIb3ZlclRhYmxlVmlld2VyID0gQ2hlY2tib3hUYWJsZVZpZXdlci5uZXdDaGVja0xpc3QoaG92ZXJDb21wb3NpdGUsIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIgfCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQkvLyBIb3ZlciB0YWJsZQotCQlmSG92ZXJUYWJsZSA9IGZIb3ZlclRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCWZIb3ZlclRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCWZIb3ZlclRhYmxlLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwNDUwNwotCSAgICBHQyBnYyA9IG5ldyBHQyhmSG92ZXJUYWJsZSk7Ci0JICAgIGdjLnNldEZvbnQoZkhvdmVyVGFibGUuZ2V0Rm9udCgpKTsKLQkgICAgRm9udE1ldHJpY3MgZm9udE1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCSAgICBnYy5kaXNwb3NlKCk7Ci0JCWludCBoZWlnaHRIaW50ID0gRGlhbG9nLmNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoZm9udE1ldHJpY3MsIDcpOwotCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJCi0JCWZIb3ZlclRhYmxlLnNldExheW91dERhdGEoZ2QpOwotCi0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSwgMTQwLCB0cnVlKSk7Ci0JCXRhYmxlTGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSwgMTQwLCB0cnVlKSk7Ci0JCWZIb3ZlclRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJZkhvdmVyVGFibGUuYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkxpc3RlbmVyKCkgewotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaGFuZGxlSG92ZXJMaXN0U2VsZWN0aW9uKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCWZOYW1lQ29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKGZIb3ZlclRhYmxlLCBTV1QuTk9ORSk7Ci0JCWZOYW1lQ29sdW1uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX25hbWVDb2x1bW5UaXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJZk5hbWVDb2x1bW4uc2V0UmVzaXphYmxlKHRydWUpOwotCi0JCWZNb2RpZmllckNvbHVtbiA9IG5ldyBUYWJsZUNvbHVtbihmSG92ZXJUYWJsZSwgU1dULk5PTkUpOwotCQlmTW9kaWZpZXJDb2x1bW4uc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfbW9kaWZpZXJDb2x1bW5UaXRsZSk7IC8vJE5PTi1OTFMtMSQKLQkJZk1vZGlmaWVyQ29sdW1uLnNldFJlc2l6YWJsZSh0cnVlKTsKLQotCQlmSG92ZXJUYWJsZVZpZXdlci5zZXRVc2VIYXNobG9va3VwKHRydWUpOwotCQlmSG92ZXJUYWJsZVZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIobmV3IEFycmF5Q29udGVudFByb3ZpZGVyKCkpOwotCQlmSG92ZXJUYWJsZVZpZXdlci5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJbnRlcm5hbFRhYmxlTGFiZWxQcm92aWRlcigpKTsKLQkJKChDaGVja2JveFRhYmxlVmlld2VyKSBmSG92ZXJUYWJsZVZpZXdlcikuYWRkQ2hlY2tTdGF0ZUxpc3RlbmVyKG5ldyBJQ2hlY2tTdGF0ZUxpc3RlbmVyKCkgewotCQkJLyoKLQkJCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JQ2hlY2tTdGF0ZUxpc3RlbmVyI2NoZWNrU3RhdGVDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCkKLQkJCSAqLwotCQkJcHVibGljIHZvaWQgY2hlY2tTdGF0ZUNoYW5nZWQoQ2hlY2tTdGF0ZUNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCVN0cmluZyBpZCA9ICgoVGV4dEhvdmVyRGVzY3JpcHRvcikgZXZlbnQuZ2V0RWxlbWVudCgpKS5nZXRJZCgpOwotCQkJCWlmIChpZCA9PSBudWxsKQotCQkJCQlyZXR1cm47Ci0KLQkJCQlUZXh0SG92ZXJNYW5hZ2VyLlRleHRIb3ZlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGdldFRleHRIb3Zlck1hbmFnZXIoKS5nZXRUZXh0SG92ZXJzKCk7Ci0JCQkJVGV4dEhvdmVyTWFuYWdlci5UZXh0SG92ZXJEZXNjcmlwdG9yIGhvdmVyQ29uZmlnID0gbnVsbDsKLQkJCQlpbnQgaSA9IDAsIGxlbmd0aCA9IGZUZXh0SG92ZXJzLmxlbmd0aDsKLQkJCQl3aGlsZSAoaSA8IGxlbmd0aCkgewotCQkJCQlpZiAoaWQuZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldElkKCkpKSB7Ci0JCQkJCQlob3ZlckNvbmZpZyA9IGZUZXh0SG92ZXJzW2ldOwotCQkJCQkJaG92ZXJDb25maWcuc2V0RW5hYmxlZChldmVudC5nZXRDaGVja2VkKCkpOwotCQkJCQkJZk1vZGlmaWVyRWRpdG9yLnNldEVuYWJsZWQoZXZlbnQuZ2V0Q2hlY2tlZCgpKTsKLQkJCQkJCWZIb3ZlclRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihkZXNjcmlwdG9yc1tpXSkpOwotCQkJCQl9Ci0JCQkJCWkrKzsKLQkJCQl9Ci0KLQkJCQloYW5kbGVIb3Zlckxpc3RTZWxlY3Rpb24oKTsKLQkJCQl1cGRhdGVTdGF0dXMoaG92ZXJDb25maWcpOwotCQkJfQotCQl9KTsKLQotCQkvLyBUZXh0IGZpZWxkIGZvciBtb2RpZmllciBzdHJpbmcKLQkJbGFiZWwgPSBuZXcgTGFiZWwoaG92ZXJDb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfa2V5TW9kaWZpZXIpOyAvLyROT04tTkxTLTEkCi0JCWZNb2RpZmllckVkaXRvciA9IG5ldyBUZXh0KGhvdmVyQ29tcG9zaXRlLCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9GSUxMKTsKLQkJZk1vZGlmaWVyRWRpdG9yLnNldExheW91dERhdGEoZ2QpOwotCi0JCWZNb2RpZmllckVkaXRvci5hZGRLZXlMaXN0ZW5lcihuZXcgS2V5TGlzdGVuZXIoKSB7Ci0JCQlwcml2YXRlIGJvb2xlYW4gaXNNb2RpZmllckNhbmRpZGF0ZTsKLQotCQkJcHVibGljIHZvaWQga2V5UHJlc3NlZChLZXlFdmVudCBlKSB7Ci0JCQkJaXNNb2RpZmllckNhbmRpZGF0ZSA9IGUua2V5Q29kZSA+IDAgJiYgZS5jaGFyYWN0ZXIgPT0gMCAmJiBlLnN0YXRlTWFzayA9PSAwOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBrZXlSZWxlYXNlZChLZXlFdmVudCBlKSB7Ci0JCQkJaWYgKGlzTW9kaWZpZXJDYW5kaWRhdGUgJiYgZS5zdGF0ZU1hc2sgPiAwICYmIGUuc3RhdGVNYXNrID09IGUuc3RhdGVNYXNrICYmIGUuY2hhcmFjdGVyID09IDApIHsvLyAmJgotCQkJCQkvLyBlLnRpbWUKLQkJCQkJLy8gLXRpbWUKLQkJCQkJLy8gPAotCQkJCQkvLyAxMDAwKQotCQkJCQkvLyB7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gZk1vZGlmaWVyRWRpdG9yLmdldFRleHQoKTsKLQkJCQkJUG9pbnQgc2VsZWN0aW9uID0gZk1vZGlmaWVyRWRpdG9yLmdldFNlbGVjdGlvbigpOwotCQkJCQlpbnQgaSA9IHNlbGVjdGlvbi54IC0gMTsKLQkJCQkJd2hpbGUgKGkgPiAtMSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRleHQuY2hhckF0KGkpKSkgewotCQkJCQkJaS0tOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gbmVlZHNQcmVmaXhEZWxpbWl0ZXIgPSBpID4gLTEgJiYgIVN0cmluZy52YWx1ZU9mKHRleHQuY2hhckF0KGkpKS5lcXVhbHMoREVMSU1JVEVSKTsKLQotCQkJCQlpID0gc2VsZWN0aW9uLnk7Ci0JCQkJCXdoaWxlIChpIDwgdGV4dC5sZW5ndGgoKSAmJiBDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKHRleHQuY2hhckF0KGkpKSkgewotCQkJCQkJaSsrOwotCQkJCQl9Ci0JCQkJCWJvb2xlYW4gbmVlZHNQb3N0Zml4RGVsaW1pdGVyID0gaSA8IHRleHQubGVuZ3RoKCkgJiYgIVN0cmluZy52YWx1ZU9mKHRleHQuY2hhckF0KGkpKS5lcXVhbHMoREVMSU1JVEVSKTsKLQotCQkJCQlTdHJpbmcgaW5zZXJ0U3RyaW5nOwotCi0JCQkJCWlmIChuZWVkc1ByZWZpeERlbGltaXRlciAmJiBuZWVkc1Bvc3RmaXhEZWxpbWl0ZXIpCi0JCQkJCQlpbnNlcnRTdHJpbmcgPSBOTFMuYmluZChTU0VVSU1lc3NhZ2VzLlRleHRIb3ZlclByZWZlcmVuY2VUYWJfaW5zZXJ0RGVsaW1pdGVyQW5kTW9kaWZpZXJBbmREZWxpbWl0ZXIsIG5ldyBTdHJpbmdbXXtBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKGUuc3RhdGVNYXNrKX0pOwotCQkJCQllbHNlIGlmIChuZWVkc1ByZWZpeERlbGltaXRlcikKLQkJCQkJCWluc2VydFN0cmluZyA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnREZWxpbWl0ZXJBbmRNb2RpZmllciwgbmV3IFN0cmluZ1tde0FjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoZS5zdGF0ZU1hc2spfSk7Ci0JCQkJCWVsc2UgaWYgKG5lZWRzUG9zdGZpeERlbGltaXRlcikKLQkJCQkJCWluc2VydFN0cmluZyA9IE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9pbnNlcnRNb2RpZmllckFuZERlbGltaXRlciwgbmV3IFN0cmluZ1tde0FjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoZS5zdGF0ZU1hc2spfSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWluc2VydFN0cmluZyA9IEFjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoZS5zdGF0ZU1hc2spOwotCi0JCQkJCWlmIChpbnNlcnRTdHJpbmcgIT0gbnVsbCkKLQkJCQkJCWZNb2RpZmllckVkaXRvci5pbnNlcnQoaW5zZXJ0U3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCi0JCWZNb2RpZmllckVkaXRvci5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQloYW5kbGVNb2RpZmllck1vZGlmaWVkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIERlc2NyaXB0aW9uCi0JCUxhYmVsIGRlc2NyaXB0aW9uTGFiZWwgPSBuZXcgTGFiZWwoaG92ZXJDb21wb3NpdGUsIFNXVC5MRUZUKTsKLQkJZGVzY3JpcHRpb25MYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9kZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuVkVSVElDQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlkZXNjcmlwdGlvbkxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQlmRGVzY3JpcHRpb24gPSBuZXcgVGV4dChob3ZlckNvbXBvc2l0ZSwgU1dULkxFRlQgfCBTV1QuV1JBUCB8IFNXVC5NVUxUSSB8IFNXVC5SRUFEX09OTFkgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlLCAyLCAxKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmRGVzY3JpcHRpb24uc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJaW5pdGlhbGl6ZSgpOwotCi0JCURpYWxvZy5hcHBseURpYWxvZ0ZvbnQoaG92ZXJDb21wb3NpdGUpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoaG92ZXJDb21wb3NpdGUsIElIZWxwQ29udGV4dElkcy5QUkVGU1RFX0hPVkVSU19IRUxQSUQpOwotCQlyZXR1cm4gaG92ZXJDb21wb3NpdGU7Ci0JfQotCi0JcHJpdmF0ZSBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBjcmVhdGVPdmVybGF5U3RvcmVLZXlzKCkgewotCQlBcnJheUxpc3Qgb3ZlcmxheUtleXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJb3ZlcmxheUtleXMuYWRkKG5ldyBPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXkoT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5TVFJJTkcsIEVkaXRvclByZWZlcmVuY2VOYW1lcy5FRElUT1JfVEVYVF9IT1ZFUl9NT0RJRklFUlMpKTsKLQotCQlPdmVybGF5UHJlZmVyZW5jZVN0b3JlLk92ZXJsYXlLZXlbXSBrZXlzID0gbmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtvdmVybGF5S2V5cy5zaXplKCldOwotCQlvdmVybGF5S2V5cy50b0FycmF5KGtleXMpOwotCQlyZXR1cm4ga2V5czsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZW5lcmF0ZVRleHRIb3ZlclN0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUZXh0SG92ZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlidWYuYXBwZW5kKGZUZXh0SG92ZXJzW2ldLmdldElkKCkpOwotCQkJYnVmLmFwcGVuZChUZXh0SG92ZXJNYW5hZ2VyLkhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IpOwotCQkJYnVmLmFwcGVuZChCb29sZWFuLnRvU3RyaW5nKGZUZXh0SG92ZXJzW2ldLmlzRW5hYmxlZCgpKSk7Ci0JCQlidWYuYXBwZW5kKFRleHRIb3Zlck1hbmFnZXIuSE9WRVJfQVRUUklCVVRFX1NFUEFSQVRPUik7Ci0JCQlTdHJpbmcgbW9kaWZpZXIgPSBmVGV4dEhvdmVyc1tpXS5nZXRNb2RpZmllclN0cmluZygpOwotCQkJaWYgKG1vZGlmaWVyID09IG51bGwgfHwgbW9kaWZpZXIubGVuZ3RoKCkgPT0gMCkKLQkJCQltb2RpZmllciA9IFRleHRIb3Zlck1hbmFnZXIuTk9fTU9ESUZJRVI7Ci0JCQlidWYuYXBwZW5kKG1vZGlmaWVyKTsKLQkJCWJ1Zi5hcHBlbmQoVGV4dEhvdmVyTWFuYWdlci5IT1ZFUl9TRVBBUkFUT1IpOwotCQl9Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQlwcml2YXRlIFRleHRIb3Zlck1hbmFnZXIgZ2V0VGV4dEhvdmVyTWFuYWdlcigpIHsKLQkJcmV0dXJuIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLklQcmVmZXJlbmNlVGFiI2dldFRpdGxlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlyZXR1cm4gU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX3RpdGxlOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jdm9pZCBoYW5kbGVIb3Zlckxpc3RTZWxlY3Rpb24oKSB7Ci0JCWludCBpID0gZkhvdmVyVGFibGUuZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQotCQlpZiAoaSA9PSAtMSkgewotCQkJaWYgKGZIb3ZlclRhYmxlLmdldFNlbGVjdGlvbkNvdW50KCkgPT0gMCkKLQkJCQlmTW9kaWZpZXJFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlib29sZWFuIGVuYWJsZWQgPSBmVGV4dEhvdmVyc1tpXS5pc0VuYWJsZWQoKTsKLQkJZk1vZGlmaWVyRWRpdG9yLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZNb2RpZmllckVkaXRvci5zZXRUZXh0KGZUZXh0SG92ZXJzW2ldLmdldE1vZGlmaWVyU3RyaW5nKCkpOwotCQlTdHJpbmcgZGVzY3JpcHRpb24gPSBmVGV4dEhvdmVyc1tpXS5nZXREZXNjcmlwdGlvbigpOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCWRlc2NyaXB0aW9uID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJZkRlc2NyaXB0aW9uLnNldFRleHQoZGVzY3JpcHRpb24pOwotCX0KLQotCXByaXZhdGUgdm9pZCBoYW5kbGVNb2RpZmllck1vZGlmaWVkKCkgewotCQlpbnQgaSA9IGZIb3ZlclRhYmxlLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpID09IC0xKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBtb2RpZmllcnMgPSBmTW9kaWZpZXJFZGl0b3IuZ2V0VGV4dCgpOwotCQlmVGV4dEhvdmVyc1tpXS5zZXRNb2RpZmllclN0cmluZyhtb2RpZmllcnMpOwotCi0JCS8vIHVwZGF0ZSB0YWJsZQotCQlmSG92ZXJUYWJsZVZpZXdlci5yZWZyZXNoKGZUZXh0SG92ZXJzW2ldKTsKLQotCQl1cGRhdGVTdGF0dXMoZlRleHRIb3ZlcnNbaV0pOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlyZXN0b3JlRnJvbU92ZXJsYXkoKTsKLQkJZkhvdmVyVGFibGVWaWV3ZXIuc2V0SW5wdXQoZlRleHRIb3ZlcnMpOwotCi0JCWluaXRpYWxpemVGaWVsZHMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlVGFiI2luaXRpYWxpemVGaWVsZHMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVGaWVsZHMoKSB7Ci0JCXN1cGVyLmluaXRpYWxpemVGaWVsZHMoKTsKLQotCQlmTW9kaWZpZXJFZGl0b3Iuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCS8vIGluaXRpYWxpemUgY2hlY2tib3hlcyBpbiBob3ZlciB0YWJsZQotCQlmb3IgKGludCBpID0gMDsgaSA8IGZUZXh0SG92ZXJzLmxlbmd0aDsgaSsrKQotCQkJZkhvdmVyVGFibGUuZ2V0SXRlbShpKS5zZXRDaGVja2VkKGZUZXh0SG92ZXJzW2ldLmlzRW5hYmxlZCgpKTsKLQkJZkhvdmVyVGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJcGVyZm9ybU9rKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLklQcmVmZXJlbmNlVGFiI3BlcmZvcm1EZWZhdWx0cygpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnVpLklQcmVmZXJlbmNlVGFiI3BlcmZvcm1PaygpCi0JICovCi0JcHVibGljIHZvaWQgcGVyZm9ybU9rKCkgewotCQlTdHJpbmcgdGV4dEhvdmVyU3RyaW5nID0gZ2VuZXJhdGVUZXh0SG92ZXJTdHJpbmcoKTsKLQkJZ2V0T3ZlcmxheVN0b3JlKCkuc2V0VmFsdWUoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9URVhUX0hPVkVSX01PRElGSUVSUywgdGV4dEhvdmVyU3RyaW5nKTsKLQkJZ2V0VGV4dEhvdmVyTWFuYWdlcigpLnJlc2V0VGV4dEhvdmVycygpOyAvLyBub3RpZnkgdGV4dCBob3ZlciBtYW5hZ2VyCi0JCS8vIGl0IHNob3VsZCByZXNldCB0byBnZXQKLQkJLy8gbGF0ZXN0IHByZWZlcmVuY2VzCi0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIGZUZXh0SG92ZXJzIHdpdGggdGV4dCBob3ZlciBkZXNjcmlwdGlvbiBmcm9tIHRoZSBvdmVybGF5Ci0JICogc3RvcmUgKHdoaWNoIGlzIHRoZSBwcmVmZXJlbmNlcykKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVzdG9yZUZyb21PdmVybGF5KCkgewotCQlTdHJpbmcgZGVzY3JpcHRvcnNTdHJpbmcgPSBnZXRPdmVybGF5U3RvcmUoKS5nZXRTdHJpbmcoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLkVESVRPUl9URVhUX0hPVkVSX01PRElGSUVSUyk7Ci0JCWZUZXh0SG92ZXJzID0gZ2V0VGV4dEhvdmVyTWFuYWdlcigpLmdlbmVyYXRlVGV4dEhvdmVyRGVzY3JpcHRvcnMoZGVzY3JpcHRvcnNTdHJpbmcpOwotCX0KLQotCXZvaWQgdXBkYXRlU3RhdHVzKFRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvciBob3ZlckNvbmZpZykgewotCQlJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKCk7Ci0KLQkJaWYgKGhvdmVyQ29uZmlnICE9IG51bGwgJiYgaG92ZXJDb25maWcuaXNFbmFibGVkKCkgJiYgRWRpdG9yVXRpbGl0eS5jb21wdXRlU3RhdGVNYXNrKGhvdmVyQ29uZmlnLmdldE1vZGlmaWVyU3RyaW5nKCkpID09IC0xKQotCQkJc3RhdHVzID0gbmV3IFN0YXR1c0luZm8oSVN0YXR1cy5FUlJPUiwgTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX21vZGlmaWVySXNOb3RWYWxpZCwgbmV3IFN0cmluZ1tde2hvdmVyQ29uZmlnLmdldE1vZGlmaWVyU3RyaW5nKCl9KSk7Ci0KLQkJaW50IGkgPSAwOwotCQlIYXNoTWFwIHN0YXRlTWFza3MgPSBuZXcgSGFzaE1hcChmVGV4dEhvdmVycy5sZW5ndGgpOwotCQl3aGlsZSAoc3RhdHVzLmlzT0soKSAmJiBpIDwgZlRleHRIb3ZlcnMubGVuZ3RoKSB7Ci0JCQlpZiAoZlRleHRIb3ZlcnNbaV0uaXNFbmFibGVkKCkpIHsKLQkJCQlTdHJpbmcgbGFiZWwgPSBmVGV4dEhvdmVyc1tpXS5nZXRMYWJlbCgpOwotCQkJCUludGVnZXIgc3RhdGVNYXNrID0gbmV3IEludGVnZXIoRWRpdG9yVXRpbGl0eS5jb21wdXRlU3RhdGVNYXNrKGZUZXh0SG92ZXJzW2ldLmdldE1vZGlmaWVyU3RyaW5nKCkpKTsKLQkJCQlpZiAoc3RhdGVNYXNrLmludFZhbHVlKCkgPT0gLTEpCi0JCQkJCXN0YXR1cyA9IG5ldyBTdGF0dXNJbmZvKElTdGF0dXMuRVJST1IsIE5MUy5iaW5kKFNTRVVJTWVzc2FnZXMuVGV4dEhvdmVyUHJlZmVyZW5jZVRhYl9tb2RpZmllcklzTm90VmFsaWRGb3JIb3ZlciwgbmV3IFN0cmluZ1tde2ZUZXh0SG92ZXJzW2ldLmdldE1vZGlmaWVyU3RyaW5nKCksIGxhYmVsfSkpOwotCQkJCWVsc2UgaWYgKHN0YXRlTWFza3MuY29udGFpbnNLZXkoc3RhdGVNYXNrKSkKLQkJCQkJc3RhdHVzID0gbmV3IFN0YXR1c0luZm8oSVN0YXR1cy5FUlJPUiwgTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy5UZXh0SG92ZXJQcmVmZXJlbmNlVGFiX2R1cGxpY2F0ZU1vZGlmaWVyLCBuZXcgU3RyaW5nW117bGFiZWwsIChTdHJpbmcpIHN0YXRlTWFza3MuZ2V0KHN0YXRlTWFzayl9KSk7Ci0JCQkJZWxzZQotCQkJCQlzdGF0ZU1hc2tzLnB1dChzdGF0ZU1hc2ssIGxhYmVsKTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCi0JCXVwZGF0ZVN0YXR1cyhzdGF0dXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvdWkvVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODliNDFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy91aS9UcmFuc2x1Y2VuY3lQcmVmZXJlbmNlVGFiLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5GaWVsZEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JbnRlZ2VyRmllbGRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLlN0cmluZ0ZpZWxkRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQXNzZXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi1wdWJsaWMgY2xhc3MgVHJhbnNsdWNlbmN5UHJlZmVyZW5jZVRhYiBpbXBsZW1lbnRzIElQcmVmZXJlbmNlVGFiIHsKLQotCXByaXZhdGUgUHJlZmVyZW5jZVBhZ2UgZk1haW5QcmVmZXJlbmNlUGFnZTsKLQlwcml2YXRlIEludGVnZXJGaWVsZEVkaXRvciBmVHJhbnNsdWNlbmN5U2NhbGUgPSBudWxsOwotCXByaXZhdGUgZmluYWwgaW50IE1BWF9QRVJDRU5UQUdFID0gMTAwOwotCi0JcHJpdmF0ZSBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB2YWxpZGl0eUNoYW5nZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZXZlbnQuZ2V0UHJvcGVydHkoKS5lcXVhbHMoRmllbGRFZGl0b3IuSVNfVkFMSUQpKQotCQkJCXVwZGF0ZVZhbGlkU3RhdGUoKTsKLQkJfQotCX07Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWIoUHJlZmVyZW5jZVBhZ2UgbWFpblByZWZlcmVuY2VQYWdlKSB7Ci0JCUFzc2VydC5pc05vdE51bGwobWFpblByZWZlcmVuY2VQYWdlKTsKLQkJc2V0TWFpblByZWZlcmVuY2VQYWdlKG1haW5QcmVmZXJlbmNlUGFnZSk7Ci0JfQotCi0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjY3JlYXRlQ29udGVudHMob3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlKQotCSAqLwotCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSB0YWJGb2xkZXIpIHsKLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiRm9sZGVyLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJU3RyaW5nIHRleHQgPSBTU0VVSU1lc3NhZ2VzLlRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMTsgLy8kTk9OLU5MUy0xJAotCQlmVHJhbnNsdWNlbmN5U2NhbGUgPSBuZXcgSW50ZWdlckZpZWxkRWRpdG9yKEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRSwgdGV4dCwgY29tcG9zaXRlKTsKLQotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0RXJyb3JNZXNzYWdlKEpGYWNlUmVzb3VyY2VzLmdldFN0cmluZygiU3RyaW5nRmllbGRFZGl0b3IuZXJyb3JNZXNzYWdlIikpOy8vJE5PTi1OTFMtMSQKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldFByZWZlcmVuY2VTdG9yZShnZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zZXRQcmVmZXJlbmNlUGFnZShnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSk7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5zZXRUZXh0TGltaXQoSW50ZWdlci50b1N0cmluZyhNQVhfUEVSQ0VOVEFHRSkubGVuZ3RoKCkpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0VmFsaWRhdGVTdHJhdGVneShTdHJpbmdGaWVsZEVkaXRvci5WQUxJREFURV9PTl9LRVlfU1RST0tFKTsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnNldFZhbGlkUmFuZ2UoMCwgTUFYX1BFUkNFTlRBR0UpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUubG9hZCgpOwotCQlmVHJhbnNsdWNlbmN5U2NhbGUuc2V0UHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih2YWxpZGl0eUNoYW5nZUxpc3RlbmVyKTsKLQotLy8JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoY29tcG9zaXRlLCBJSGVscENvbnRleHRJZHMuUFJFRldFQlhfUkVBRE9OTFlfSEVMUElEKTsKLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UuCi0JICovCi0JcHJpdmF0ZSBQcmVmZXJlbmNlUGFnZSBnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSB7Ci0JCXJldHVybiBmTWFpblByZWZlcmVuY2VQYWdlOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgcHJlZmVyZW5jZSBzdG9yZSB1c2VkIGluIHRoaXMgdGFiCi0JICovCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjZ2V0VGl0bGUoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7Ci0JCXJldHVybiBTU0VVSU1lc3NhZ2VzLlRyYW5zbHVjZW5jeVByZWZlcmVuY2VUYWJfMDsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtQXBwbHkoKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1BcHBseSgpIHsKLQkJZlRyYW5zbHVjZW5jeVNjYWxlLnN0b3JlKCk7Ci0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMudWkuSVByZWZlcmVuY2VUYWIjcGVyZm9ybURlZmF1bHRzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRGVmYXVsdHMoKSB7Ci0JCWZUcmFuc2x1Y2VuY3lTY2FsZS5sb2FkRGVmYXVsdCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5JUHJlZmVyZW5jZVRhYiNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyB2b2lkIHBlcmZvcm1PaygpIHsKLQkJcGVyZm9ybUFwcGx5KCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1haW5QcmVmZXJlbmNlUGFnZQotCSAqICAgICAgICAgICAgVGhlIGZNYWluUHJlZmVyZW5jZVBhZ2UgdG8gc2V0LgotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNYWluUHJlZmVyZW5jZVBhZ2UoUHJlZmVyZW5jZVBhZ2UgbWFpblByZWZlcmVuY2VQYWdlKSB7Ci0JCWZNYWluUHJlZmVyZW5jZVBhZ2UgPSBtYWluUHJlZmVyZW5jZVBhZ2U7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZVZhbGlkU3RhdGUoKSB7Ci0JCWlmIChnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKSAhPSBudWxsKSB7Ci0JCQlnZXRNYWluUHJlZmVyZW5jZVBhZ2UoKS5zZXRWYWxpZChmVHJhbnNsdWNlbmN5U2NhbGUuaXNWYWxpZCgpKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL0lTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb2plY3Rpb24vSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZDlhZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb2plY3Rpb24vSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLQotLyoqCi0gKiBJbXBsZW1lbnRvcnMgb2YgdGhpcyBpbnRlcmZhY2Ugd2hpY2ggd2lsbCBjcmVhdGUgYW5kIG1haW50YWluCi0gKiB7QGxpbmsgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbn0KLSAqIG9iamVjdHMgdGhhdCBkZWZpbmUgZm9sZGVkIHJlZ2lvbnMgaW4gdGhlIHRoZQotICoge0BsaW5rIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcn1mb3IgYQotICogc3RydWN0dXJlZCBtb2RlbC4KLSAqLwotcHVibGljIGludGVyZmFjZSBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gInN0cnVjdHVyZWR0ZXh0Zm9sZGluZ3Byb3ZpZGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBmb2xkaW5nIGlzIGVuYWJsZWQgaW4gdGhlCi0JICogU3RydWN0dXJlZCBUZXh0IGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT0xESU5HX0VOQUJMRUQgPSAiZm9sZGluZ0VuYWJsZWQiOyAvLyROT04tTkxTLTEkIAotCi0JLy8gY29waWVkIGludGVyZmFjZSBmcm9tCi0JLy8gb3JnLmVjbGlwc2UuamR0LnVpLnRleHQuZm9sZGluZy5JSmF2YUZvbGRpbmdTdHJ1Y3R1cmVQcm92aWRlcgotCS8qKgotCSAqIEluc3RhbGxzIHRoaXMgc3RydWN0dXJlIHByb3ZpZGVyIG9uIHRoZSBnaXZlbiB2aWV3ZXIuIEltcGxlbWVudGF0aW9ucwotCSAqIHNob3VsZCBsaXN0ZW4gdG8gdGhlIHByb2plY3Rpb24gZXZlbnRzIGdlbmVyYXRlZCBieSA8Y29kZT52aWV3ZXI8L2NvZGU+Ci0JICogYW5kIGVuYWJsZSAvIGRpc2FibGUgZ2VuZXJhdGlvbiBvZiBwcm9qZWN0aW9uIHN0cnVjdHVyZSBhY2NvcmRpbmdseS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgcHJvamVjdGlvbiB2aWV3ZXIgdGhhdCBkaXNwbGF5cyB0aGUgYW5ub3RhdGlvbnMgY3JlYXRlZAotCSAqICAgICAgICAgICAgYnkgdGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXIKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKTsKLQotCS8qKgotCSAqIFVuaW5zdGFsbHMgdGhpcyBzdHJ1Y3R1cmUgcHJvdmlkZXIuIEFueSByZWZlcmVuY2VzIHRvIHZpZXdlcnMgc2hvdWxkIGJlCi0JICogY2xlYXJlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCB1bmluc3RhbGwoKTsKLQotCS8qKgotCSAqIEluaXRpYWxpemUgdGhpcyBwcm92aWRlciB3aXRoIHRoZSBjb3JyZWN0IGRvY3VtZW50LiBBc3N1bWVzIHByb2plY3Rpb24KLQkgKiBpcyBlbmFibGVkLiAob3RoZXJ3aXNlLCBvbmx5IGluc3RhbGwgd291bGQgaGF2ZSBiZWVuIGNhbGxlZCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BZGFwdGVyUHJvcGVydHlTaGVldEVudHJ5TGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQWRhcHRlclByb3BlcnR5U2hlZXRFbnRyeUxhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwYTUzYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9BZGFwdGVyUHJvcGVydHlTaGVldEVudHJ5TGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3BlcnRpZXM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotcHVibGljIGNsYXNzIEFkYXB0ZXJQcm9wZXJ0eVNoZWV0RW50cnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0JCQlyZXR1cm4gKChJUHJvcGVydHlTaGVldEVudHJ5KSBlbGVtZW50KS5nZXRJbWFnZSgpOwotCQl9Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSVByb3BlcnR5U2hlZXRFbnRyeSBlbnRyeSA9IChJUHJvcGVydHlTaGVldEVudHJ5KSAoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmdldEFkYXB0ZXJGb3IoSVByb3BlcnR5U2hlZXRFbnRyeS5jbGFzcyk7Ci0JCQlpZiAoZW50cnkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZW50cnkuZ2V0SW1hZ2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUHJvcGVydHlTaGVldEVudHJ5KSB7Ci0JCQlyZXR1cm4gKChJUHJvcGVydHlTaGVldEVudHJ5KSBlbGVtZW50KS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JCX0KLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJUHJvcGVydHlTaGVldEVudHJ5IGVudHJ5ID0gKElQcm9wZXJ0eVNoZWV0RW50cnkpICgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuZ2V0QWRhcHRlckZvcihJUHJvcGVydHlTaGVldEVudHJ5LmNsYXNzKTsKLQkJCWlmIChlbnRyeSAhPSBudWxsKQotCQkJCXJldHVybiBlbnRyeS5nZXRWYWx1ZUFzU3RyaW5nKCk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0NvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MjM1ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LklQYWdlU2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0RW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uOwotCi0KLS8qKgotICogQSBjb25maWd1cmFibGUgSVByb3BlcnR5U2hlZXRQYWdlIHNpbmNlIHRoZSBzdGFuZGFyZCBQcm9wZXJ0eVNoZWV0UGFnZSBkb2VzCi0gKiBub3QgZXhwb3NlIGl0cyB2aWV3ZXIgZmllbGQuCi0gKi8KLQotcHVibGljIGNsYXNzIENvbmZpZ3VyYWJsZVByb3BlcnR5U2hlZXRQYWdlIGV4dGVuZHMgUHJvcGVydHlTaGVldFBhZ2UgewotCXByaXZhdGUgY2xhc3MgTnVsbFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGV4dGVuZHMgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gewotCQlwdWJsaWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVRyA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Byb3BlcnR5U2hlZXQiKSk7IC8vJE5PTi1OTFMtMSQgIC8vJE5PTi1OTFMtMiQ7OwotCi0JcHJpdmF0ZSBsb25nIF9ERUJVR19USU1FID0gMDsKLQotCXByaXZhdGUgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0JcHJpdmF0ZSBPYmplY3RbXSBmU2VsZWN0ZWRFbnRyaWVzID0gbnVsbDsKLQlwcml2YXRlIElTZWxlY3Rpb24gZklucHV0ID0gbnVsbDsKLQlwcml2YXRlIElNZW51TWFuYWdlciBmTWVudU1hbmFnZXI7Ci0KLQlwcml2YXRlIFJlbW92ZUFjdGlvbiBmUmVtb3ZlQWN0aW9uOwotCi0JcHJpdmF0ZSBJU3RhdHVzTGluZU1hbmFnZXIgZlN0YXR1c0xpbmVNYW5hZ2VyOwotCi0JcHJpdmF0ZSBJVG9vbEJhck1hbmFnZXIgZlRvb2xCYXJNYW5hZ2VyOwotCi0JcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBOVUxMX0NPTkZJR1VSQVRJT04gPSBuZXcgTnVsbFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCk7Ci0KLQlwdWJsaWMgQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXNldFByb3BlcnR5U291cmNlUHJvdmlkZXIoZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5U291cmNlUHJvdmlkZXIodGhpcykpOwotCQlzdXBlci5jcmVhdGVDb250cm9sKHBhcmVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc2V0Q29uZmlndXJhdGlvbihudWxsKTsKLQkJZ2V0U2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNlbGVjdGlvblNlcnZpY2UoKS5yZW1vdmVQb3N0U2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwdWJsaWMgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJaWYgKGZDb25maWd1cmF0aW9uID09IG51bGwpCi0JCQlmQ29uZmlndXJhdGlvbiA9IE5VTExfQ09ORklHVVJBVElPTjsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGhhbmRsZUVudHJ5U2VsZWN0aW9uKElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCWlmIChnZXRDb250cm9sKCkgIT0gbnVsbCAmJiAhZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSAmJiBzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJc3VwZXIuaGFuZGxlRW50cnlTZWxlY3Rpb24oc2VsZWN0aW9uKTsKLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCWZTZWxlY3RlZEVudHJpZXMgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLnRvQXJyYXkoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZTZWxlY3RlZEVudHJpZXMgPSBudWxsOwotCQkJfQotCQkJZlJlbW92ZUFjdGlvbi5zZXRFbmFibGVkKCFzZWxlY3Rpb24uaXNFbXB0eSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVBhZ2VTaXRlIHBhZ2VTaXRlKSB7Ci0JCXN1cGVyLmluaXQocGFnZVNpdGUpOwotCQlwYWdlU2l0ZS5nZXRXb3JrYmVuY2hXaW5kb3coKS5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuYWRkUG9zdFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1ha2VDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJc3VwZXIubWFrZUNvbnRyaWJ1dGlvbnMobWVudU1hbmFnZXIsIHRvb2xCYXJNYW5hZ2VyLCBzdGF0dXNMaW5lTWFuYWdlcik7Ci0JCWZNZW51TWFuYWdlciA9IG1lbnVNYW5hZ2VyOwotCQlmVG9vbEJhck1hbmFnZXIgPSB0b29sQmFyTWFuYWdlcjsKLQkJZlN0YXR1c0xpbmVNYW5hZ2VyID0gc3RhdHVzTGluZU1hbmFnZXI7Ci0KLQkJZlJlbW92ZUFjdGlvbiA9IG5ldyBSZW1vdmVBY3Rpb24odGhpcyk7Ci0JCXRvb2xCYXJNYW5hZ2VyLmFkZChmUmVtb3ZlQWN0aW9uKTsKLQkJbWVudU1hbmFnZXIuYWRkKGZSZW1vdmVBY3Rpb24pOwotCQlnZXRDb25maWd1cmF0aW9uKCkuYWRkQ29udHJpYnV0aW9ucyhtZW51TWFuYWdlciwgdG9vbEJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyKTsKLQotCQltZW51TWFuYWdlci51cGRhdGUodHJ1ZSk7Ci0JfQotCi0Jdm9pZCByZW1vdmUoKSB7Ci0JCWlmIChmU2VsZWN0ZWRFbnRyaWVzICE9IG51bGwpIHsKLQkJCU9iamVjdFtdIGVudHJpZXMgPSBmU2VsZWN0ZWRFbnRyaWVzOwotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmSW5wdXQ7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwgJiYgIXNlbGVjdGlvbi5pc0VtcHR5KCkgJiYgc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJUHJvcGVydHlTb3VyY2Ugc291cmNlID0gZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5U291cmNlUHJvdmlkZXIodGhpcykuZ2V0UHJvcGVydHlTb3VyY2UoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSk7Ci0JCQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZSBpbnN0YW5jZW9mIElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbikgewotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmIChlbnRyaWVzW2ldIGluc3RhbmNlb2YgSVByb3BlcnR5U2hlZXRFbnRyeSkgewotCQkJCQkJCUlQcm9wZXJ0eVNoZWV0RW50cnkgZW50cnkgPSAoSVByb3BlcnR5U2hlZXRFbnRyeSkgZW50cmllc1tpXTsKLQkJCQkJCQkoKElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbikgc291cmNlKS5yZW1vdmVQcm9wZXJ0eShlbnRyeS5nZXREaXNwbGF5TmFtZSgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qCi0JICogRmlsdGVyIHRoZSBzZWxlY3Rpb24gdGhyb3VnaCB0aGUgY3VycmVudCBDb25maWd1cmF0aW9uLiBOb3QgZXZlcnkKLQkgKiBzZWxlY3Rpb24gcmVjZWl2ZWQgaXMgYSBTdHJ1Y3R1cmVkIHNlbGVjdGlvbiBub3IgYXJlIHRoZSBTdHJ1Y3R1cmVkCi0JICogc2VsZWN0aW9uJ3MgZWxlbWVudHMgYWxsIHRvIGJlIGRpc3BsYXllZC4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTZWxlY3Rpb25MaXN0ZW5lciNzZWxlY3Rpb25DaGFuZ2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0LAotCSAqICAgICAgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uKQotCSAqLwotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSVdvcmtiZW5jaFBhcnQgcGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKF9ERUJVRykgewotCQkJX0RFQlVHX1RJTUUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJfQotCQlpZiAoZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgZ2V0Q29udHJvbCgpLmlzVmlzaWJsZSgpICYmICFnZXRDb250cm9sKCkuaXNGb2N1c0NvbnRyb2woKSkgewotCQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBnZXRDb25maWd1cmF0aW9uKCkuZ2V0SW5wdXRTZWxlY3Rpb24ocGFydCwgc2VsZWN0aW9uKTsKLQkJCS8qCi0JCQkgKiBEbyBzb21lIG1pbm9yIGNhY2hpbmcgb2YgdGhlIHNlbGVjdGlvbi4KLQkJCSAqIAotCQkJICogQXMgYSBQcm9wZXJ0eVNoZWV0UGFnZSwgd2UndmUgYWx3YXlzIG5vdGlmaWVkIG9mIHNlbGVjdGlvbgotCQkJICogY2hhbmdlcywgYnV0IHdlJ3ZlIGFsc28gc3Vic2NyaWJlZCB0byBwb3N0IHNlbGVjdGlvbgotCQkJICogbm90aWZpY2F0aW9uIHNvIHdlIGNhbiB0cmFjayBjYXJldCBtb3ZlbWVudHMgaW4gc291cmNlIHZpZXdlcnMuCi0JCQkgKiBXaGVuIHNlbGVjdGluZyBhIGJsb2NrIG9mIHRleHQsIHdlJ3JlIHRodXMgbm90aWZpZWQgb2YgdGhlIG5ldwotCQkJICogc2VsZWN0aW9uIHR3aWNlLiBSZW1lbWJlcmluZyB3aGF0IG91ciBsYXN0ICplZmZlY3RpdmUqCi0JCQkgKiBzZWxlY3Rpb24gd2FzIGFsbG93cyB1cyB0byBjdXQgb3V0IG1vc3Qgb2YgdGhlCi0JCQkgKiBkb3VibGUtbm90aWZpY2F0aW9uIHBlbmFsdHkuCi0JCQkgKi8KLQkJCWlmICghcHJlZmVycmVkU2VsZWN0aW9uLmVxdWFscyhmSW5wdXQpKSB7Ci0JCQkJZklucHV0ID0gcHJlZmVycmVkU2VsZWN0aW9uOwotCQkJCWZTZWxlY3RlZEVudHJpZXMgPSBudWxsOwotCQkJCXN1cGVyLnNlbGVjdGlvbkNoYW5nZWQocGFydCwgcHJlZmVycmVkU2VsZWN0aW9uKTsKLQkJCX0KLQotCQkJaWYgKF9ERUJVRykgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKFA6c2VydmljZSAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gX0RFQlVHX1RJTUUpICsgIm1zKSAiICsgcGFydCArICIgOiAiICsgKChJU3RydWN0dXJlZFNlbGVjdGlvbikgcHJlZmVycmVkU2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAoX0RFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIltza2lwcGVkXSAoUDoiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gX0RFQlVHX1RJTUUpICsgIm1zKSAiICsgcGFydCArICIgOiAiICsgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0JICogICAgICAgICAgICBUaGUgY29uZmlndXJhdGlvbiB0byBzZXQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7Ci0JCWlmIChmQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7Ci0JCQlmQ29uZmlndXJhdGlvbi5yZW1vdmVDb250cmlidXRpb25zKGZNZW51TWFuYWdlciwgZlRvb2xCYXJNYW5hZ2VyLCBmU3RhdHVzTGluZU1hbmFnZXIpOwotCQkJZkNvbmZpZ3VyYXRpb24udW5jb25maWd1cmUoKTsKLQkJfQotCi0JCWZDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKLQotCQlpZiAoZkNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgewotCQkJc2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihmQ29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKHRoaXMpKTsKLQkJCWZDb25maWd1cmF0aW9uLmFkZENvbnRyaWJ1dGlvbnMoZk1lbnVNYW5hZ2VyLCBmVG9vbEJhck1hbmFnZXIsIGZTdGF0dXNMaW5lTWFuYWdlcik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb2N1cygpIHsKLQkJc3VwZXIuc2V0Rm9jdXMoKTsKLQotCQlJV29ya2JlbmNoV2luZG93IHdvcmtiZW5jaFdpbmRvdyA9IGdldFNpdGUoKS5nZXRXb3JrYmVuY2hXaW5kb3coKTsKLQkJSVdvcmtiZW5jaFBhZ2UgYWN0aXZlUGFnZSA9IHdvcmtiZW5jaFdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCWlmIChhY3RpdmVQYWdlICE9IG51bGwpIHsKLQkJCUlFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvciA9IGFjdGl2ZVBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQlpZiAoYWN0aXZlRWRpdG9yICE9IG51bGwpIHsKLQkJCQlJRWRpdG9yU2l0ZSBlZGl0b3JTaXRlID0gYWN0aXZlRWRpdG9yLmdldEVkaXRvclNpdGUoKTsKLQkJCQlpZiAoZWRpdG9yU2l0ZSAhPSBudWxsKSB7Ci0JCQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGVkaXRvclNpdGUuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCQkJaWYgKHNlbGVjdGlvblByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQkJCXNlbGVjdGlvbkNoYW5nZWQoYWN0aXZlRWRpdG9yLCBzZWxlY3Rpb25Qcm92aWRlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvQ3VzdG9tUHJvcGVydHlEZXNjcmlwdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2OTA0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9DdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5RGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvciBleHRlbmRzIFByb3BlcnR5RGVzY3JpcHRvciB7Ci0KLQlwcm90ZWN0ZWQgQ2xhc3MgY2VsbEVkaXRvckNsYXNzID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGggYSB1bmlxdWUgbmFtZSBhbmQgYSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIGlkCi0JICogICAgICAgICAgICB0aGUgaWQgZm9yIHRoZSBwcm9wZXJ0eQotCSAqIEBwYXJhbSBkaXNwbGF5TmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgdG8gZGlzcGxheSBmb3IgdGhlIHByb3BlcnR5Ci0JICovCi0JcHVibGljIEN1c3RvbVByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QgaWQsIFN0cmluZyBuZXdEaXNwbGF5TmFtZSwgQ2xhc3MgZWRpdG9yQ2xhc3MpIHsKLQkJc3VwZXIoaWQsIG5ld0Rpc3BsYXlOYW1lKTsKLQkJc2V0RGVzY3JpcHRpb24oKFN0cmluZykgaWQpOwotCQlzZXRDZWxsRWRpdG9yQ2xhc3MoZWRpdG9yQ2xhc3MpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIHdpdGggYSB1bmlxdWUgbmFtZSBhbmQgYSBkaXNwbGF5IG5hbWUuCi0JICogCi0JICogQHBhcmFtIHVuaXF1ZU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSB1bmlxdWUgbmFtZSBvZiB0aGUgcHJvcGVydHkKLQkgKiBAcGFyYW0gZGlzcGxheU5hbWUKLQkgKiAgICAgICAgICAgIHRoZSBuYW1lIHRvIGRpc3BsYXkgZm9yIHRoZSBwcm9wZXJ0eQotCSAqLwotCXB1YmxpYyBDdXN0b21Qcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIHVuaXF1ZU5hbWUsIFN0cmluZyBuZXdEaXNwbGF5TmFtZSkgewotCQl0aGlzKHVuaXF1ZU5hbWUsIG5ld0Rpc3BsYXlOYW1lLCBUZXh0Q2VsbEVkaXRvci5jbGFzcyk7Ci0JfQotCi0JcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQlyZXR1cm4gZ2V0UHJvcGVydHlFZGl0b3IocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgQ2xhc3MgZ2V0Q2VsbEVkaXRvckNsYXNzKCkgewotCQlyZXR1cm4gY2VsbEVkaXRvckNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGVkaXRvciB1c2VkIHRvIGVkaXQgdGhlIHByb3BlcnR5LgotCSAqIAotCSAqIEByZXR1cm4gYW4gZWRpdG9yIGZvciB0aGUgcHJvcGVydHkKLQkgKi8KLQlwcm90ZWN0ZWQgQ2VsbEVkaXRvciBnZXRQcm9wZXJ0eUVkaXRvcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWlmIChnZXRDZWxsRWRpdG9yQ2xhc3MoKSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBudWxsOwotCQl0cnkgewotCQkJY29uc3RydWN0b3IgPSBnZXRDZWxsRWRpdG9yQ2xhc3MoKS5nZXREZWNsYXJlZENvbnN0cnVjdG9yKG5ldyBDbGFzc1tde0NvbXBvc2l0ZS5jbGFzc30pOwotCQl9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gbnNtZSkgewotCQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvcihwYXJlbnQpOwotCQl9Ci0JCWlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXJldHVybiAoQ2VsbEVkaXRvcikgY29uc3RydWN0b3IubmV3SW5zdGFuY2UobmV3IE9iamVjdFtde3BhcmVudH0pOwotCQkJfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBpZSkgewotCQkJfSBjYXRjaCAoamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBpdGUpIHsKLQkJCX0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gaWFlKSB7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5ldyBUZXh0Q2VsbEVkaXRvcihwYXJlbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENlbGxFZGl0b3JDbGFzcyhDbGFzcyBuZXdDZWxsRWRpdG9yQ2xhc3MpIHsKLQkJY2VsbEVkaXRvckNsYXNzID0gbmV3Q2VsbEVkaXRvckNsYXNzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1JlbW92ZUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvUmVtb3ZlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OGIyNDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvUmVtb3ZlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLQotcHVibGljIGNsYXNzIFJlbW92ZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JcHJpdmF0ZSBDb25maWd1cmFibGVQcm9wZXJ0eVNoZWV0UGFnZSBmUGFnZTsKLQotCXB1YmxpYyBSZW1vdmVBY3Rpb24oQ29uZmlndXJhYmxlUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlzdXBlcigpOwotCQlmUGFnZSA9IHBhZ2U7Ci0JCXNldFRleHQoZ2V0VGV4dCgpKTsKLQkJc2V0VG9vbFRpcFRleHQoZ2V0VGV4dCgpKTsKLQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRUxDTF9ERUxFVEUpKTsKLQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19ETENMX0RFTEVURSkpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbiNnZXRUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBTU0VVSU1lc3NhZ2VzLlJlbW92ZUFjdGlvbl8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbiNydW4oKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJZlBhZ2UucmVtb3ZlKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2hvd1Byb3BlcnRpZXNBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1Nob3dQcm9wZXJ0aWVzQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhYmIzNzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU2hvd1Byb3BlcnRpZXNBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TaG93Vmlld0FjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi0vKioKLSAqIFN1cmZhY2VzIHRoZSBQcm9wZXJ0aWVzIHZpZXcKLSAqIAotICogQGF1dGhvciBOaXRpbiBEYWh5YWJoYWkKLSAqLwotcHVibGljIGNsYXNzIFNob3dQcm9wZXJ0aWVzQWN0aW9uIGV4dGVuZHMgU2hvd1ZpZXdBY3Rpb24gewotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBWSUVXX0lEID0gIm9yZy5lY2xpcHNlLnVpLnZpZXdzLlByb3BlcnR5U2hlZXQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgU2hvd1Byb3BlcnRpZXNBY3Rpb24oKSB7Ci0JCXN1cGVyKFNTRVVJTWVzc2FnZXMuU2hvd1Byb3BlcnRpZXNBY3Rpb25fMCwgRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPUF9QUykpOyAvLyROT04tTkxTLTEkCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAodGhpcywgSUhlbHBDb250ZXh0SWRzLkNPTlRNTlVfUFJPUEVSVElFU19IRUxQSUQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld0lEKCkgewotCQlyZXR1cm4gVklFV19JRDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcHJlZmVyZW5jZXMvQ29tbW9uRWRpdG9yUHJlZmVyZW5jZU5hbWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwOWY4MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3ByZWZlcmVuY2VzL0NvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLkVkaXRvclByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBDb21tb24gZWRpdG9yIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IHRoZSBTdHJ1Y3R1cmVkIFRleHQgRWRpdG9yLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIENvbW1vbkVkaXRvclByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBDb21tb25FZGl0b3JQcmVmZXJlbmNlTmFtZXMoKSB7Ci0JCS8vIGVtcHR5IHByaXZhdGUgY29uc3RydWN0b3Igc28gdXNlcnMgY2Fubm90IGluc3RhbnRpYXRlIGNsYXNzCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgYXMteW91LXR5cGUgdmFsaWRhdGlvbgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVWQUxVQVRFX1RFTVBPUkFSWV9QUk9CTEVNUyA9IEVkaXRvclByZWZlcmVuY2VOYW1lcy5FVkFMVUFURV9URU1QT1JBUllfUFJPQkxFTVM7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNjZGViMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci0KLQotcHVibGljIGludGVyZmFjZSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIHsKLQotCXB1YmxpYyB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpOwotCi0JLy8gVE9ET19pc3N1ZTogSURvY3VtZW50VHlwZUhhbmRsZXIgZG9lc24ndCBzZWVtIGNvcnJlY3QgaW4gdGhpcyBBUEkuCi0JLy8gcmVleGFtaW5lIGFuZCBzZWUgaWYgc2hvdWxkIGJlIE1vZGVsSGFuZGxlciwgb3IgQ29udGVudFR5cGVJZGVudGlmZXIKLQkvLyBpbnN0ZWFkLgotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYWRkIHRob3NlIGZhY3RvcmllcyByZWxhdGVkIHRvIGVtYmVkZGVkIGNvbnRlbnQKLQkgKiB0eXBlCi0JICovCi0JcHVibGljIHZvaWQgcmVpbml0aWFsaXplRmFjdG9yaWVzKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjE5OTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGhpcyBpcyBiYXNpY2FsbHkgYSAiZmFjdG9yeSBmb3IgZmFjdG9yaWVzIi4gSXQgaXMgdG8gdXNlZCB0byBhc3NvY2lhdGUKLSAqICJlZGl0IHRpbWUiIEFkYXB0ZXJGYWN0b3JpZXMgd2l0aCBhIFN0cnVjdHVyZWRNb2RlbCwgYmFzZWQgb24gdGhlCi0gKiBJU3RydWN0dXJlZE1vZGVsJ3MgQ29udGVudFR5cGVEZXNjcmlwdGlvbi4gSW4gcGx1Z2luLnhtbCBmaWxlcywgdGhlcmUKLSAqIHNob3VsZCBiZSBhbiBBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIGRlZmluZWQgZm9yIGV2ZXJ5IGRlZmluaXRpb24gb2YKLSAqIENvbnRlbnRUeXBlRGVzY3JpcHRpb24uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGFuIEl0ZXJhdG9yIG92ZXIgYSBDb2xsZWN0aW9uIG9mIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXJzCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBJdGVyYXRvciBnZXRBZGFwdGVyRmFjdG9yaWVzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIyOWYyMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgaW50ZXJmYWNlIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24gewotCUl0ZXJhdG9yIGdldEFkYXB0ZXJGYWN0b3JpZXMoU3RyaW5nIGNvbnRlbnRUeXBlSUQpOwotCi0JTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KFN0cmluZyBjb250ZW50VHlwZUlEKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZjViYmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbCBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnksIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlFeHRlbnNpb24gewotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBzdGF0aWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBpbnN0YW5jZSA9IG51bGw7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIHB1YmxpYyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwoKTsKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8gdGhpcyBtYXAgZXhpc3RzIHNvIHRoZXJlIGlzIG9ubHkgb25lIHByb3ZpZGVyCi0JLy8gaW5zdGFuY2Ugbm90IGR1cGxpY2F0ZSBwcm92aWRlcnMgZm9yIGRpZmZlcmVudCBjb250ZW50IHR5cGVzCi0JcHJpdmF0ZSBIYXNoTWFwIGFkYXB0ZXJQcm92aWRlcnMgPSBudWxsOwotCi0JcHJpdmF0ZSBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JLyoqCi0JICogVGhpcyBIYXNoTWFwIGNvbnRhaW5zOiBbY29udGVudFR5cGVJZCAtPiBlbGVtZW50MnByb3ZpZGVyTWFwXSB8IFYKLQkgKiBbY29uZmlndXJhdGlvbkVsZW1lbnQgLT4gQWRhcHRlckZhY3RvcnlQcm92aWRlcl0KLQkgKiAKLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgaGFzaE1hcCA9IG51bGw7Ci0KLQkvLyBwcm92aWRlcnMgd2l0aCBubyBjb250ZW50IHR5cGUgYXNzb2NpYXRlZAotCS8vIGp1c3QgYWRkZWQgdGhyb3VnaCB0aGUgYWRkKC4uLikgbWV0aG9kCi0JcHJpdmF0ZSBIYXNoU2V0IHVuYXNzb2NpYXRlZFByb3ZpZGVycyA9IG51bGw7Ci0KLQlwcml2YXRlIEFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlJbXBsKCkgewotCQlzdXBlcigpOwotCQl0aGlzLmhhc2hNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQl0aGlzLnVuYXNzb2NpYXRlZFByb3ZpZGVycyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXRoaXMuYWRhcHRlclByb3ZpZGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJLy8gZG9lc24ndCBpbnN0YW50aWF0ZSBjbGFzc2VzLCBqdXN0IHN0b3JlcyBjb25maWd1cmF0aW9uIGVsZW1lbnRzCi0JCUFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIucmVhZFJlZ2lzdHJ5KGhhc2hNYXApOwotCX0KLQotCXZvaWQgYWRkKEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgYWRhcHRlckZhY3RvcnlQcm92aWRlcikgewotCQl0aGlzLnVuYXNzb2NpYXRlZFByb3ZpZGVycy5hZGQoYWRhcHRlckZhY3RvcnlQcm92aWRlcik7Ci0JfQotCi0JcHVibGljIEl0ZXJhdG9yIGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJHRVRUSU5HIEFMTCBBREFQVEVSIEZBQ1RPUklFUyIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gYWRkIHByb3ZpZGVycyB0aGF0IGhhdmUgbm8gY29udGVudCB0eXBlIHNwZWNpZmljYXRpb24KLQkJcmVzdWx0cy5hZGRBbGwodGhpcy51bmFzc29jaWF0ZWRQcm92aWRlcnMpOwotCQlJdGVyYXRvciBpdCA9IHRoaXMuaGFzaE1hcC5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCWNvbnRlbnRUeXBlSWQgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0KLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiArIGZvcjogIiArIGNvbnRlbnRUeXBlSWQpOyAvLyROT04tTkxTLTEkCi0KLQkJCXJlc3VsdHMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QoY29udGVudFR5cGVJZCkpOwotCQl9Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlyZXR1cm4gcmVzdWx0cy5pdGVyYXRvcigpOwotCX0KLQotCXB1YmxpYyBJdGVyYXRvciBnZXRBZGFwdGVyRmFjdG9yaWVzKFN0cmluZyBjb250ZW50VHlwZUlEKSB7Ci0JCWlmIChERUJVRykgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJHRVRUSU5HIEFEQVBURVIgRkFDVE9SSUVTIGZvcjogIiArIGNvbnRlbnRUeXBlSUQpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlMaXN0IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJLy8gYWRkIHByb3ZpZGVycyB0aGF0IGhhdmUgbm8gY29udGVudCB0eXBlIHNwZWNpZmljYXRpb24KLQkJcmVzdWx0cy5hZGRBbGwodW5hc3NvY2lhdGVkUHJvdmlkZXJzKTsKLQotCQkvLyBhZGQgdW5rbm93biBjb250ZW50IHR5cGUgcHJvdmlkZXJzIChmb3IgYmFja3dhcmRzIGNvbXBhdGFiaWxpdHkpCi0JCXJlc3VsdHMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QoQWRhcHRlckZhY3RvcnlSZWdpc3RyeVJlYWRlci5VTktOT1dOX0NPTlRFTlRfVFlQRSkpOwotCi0JCS8vIGFkZCBwcm92aWRlcnMgZm9yIHNwZWNpZmljIGNvbnRlbnQgdHlwZQotCQlyZXN1bHRzLmFkZEFsbChnZXRBZGFwdGVyRmFjdG9yaWVzQXNMaXN0KFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSUQpKSk7Ci0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXJldHVybiByZXN1bHRzLml0ZXJhdG9yKCk7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3Rvcmllc0FzTGlzdChJQ29udGVudFR5cGUgY29udGVudFR5cGUpIHsKLQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBjb250ZW50VHlwZTsKLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQl3aGlsZSAodHlwZSAhPSBudWxsICYmICF0eXBlLmdldElkKCkuZXF1YWxzKElDb250ZW50VHlwZU1hbmFnZXIuQ1RfVEVYVCkpIHsKLQkJCXJlc3VsdHMuYWRkQWxsKGdldEFkYXB0ZXJGYWN0b3JpZXNBc0xpc3QodHlwZS5nZXRJZCgpKSk7Ci0JCQl0eXBlID0gdHlwZS5nZXRCYXNlVHlwZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFVzaW5nIHRoaXMgbmV3IEFQSSwgb25seSBBZGFwdGVyRmFjdG9yeVByb3ZpZGVycyBmb3IgYSBjZXJ0YWluIGNvbnRlbnQKLQkgKiB0eXBlIGFyZSBpbnN0YW50aWF0ZWQuIFRoaXMgd2lsbCBhbGxvdyBmb3IgdGhlIG1pbmltdW0gbnVtYmVyIG9mCi0JICogcGx1Z2lucyB0byBiZSBsb2FkZWQgcmF0aGVyIHRoYW4gYWxsIHRoYXQgaW1wbGVtZW50IHRoZSBhZGFwdGVyIGZhY3RvcnkKLQkgKiBleHRlbnNpb24gcG9pbnQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSUQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIExpc3QgZ2V0QWRhcHRlckZhY3Rvcmllc0FzTGlzdChTdHJpbmcgY29udGVudFR5cGVJRCkgewotCi0JCUxpc3QgcmVzdWx0cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBnZXQgZWxlbWVudDJQcm92aWRlciBtYXAgZm9yIHNwZWNpZmllZCBjb250ZW50IHR5cGUKLQkJT2JqZWN0IG8gPSBoYXNoTWFwLmdldChjb250ZW50VHlwZUlEKTsKLQkJaWYgKG8gIT0gbnVsbCkgewotCQkJLy8gaW5zdGFudGlhdGUgaWYgbmVjZXNzYXJ5IGZyb20KLQkJCS8vIGVsZW1lbnQyYWRhcHRlckZhY3RvcnlQcm92aWRlcgotCQkJLy8gbWFwCi0JCQlNYXAgZWxlbWVudDJQcm92aWRlciA9IChNYXApIG87Ci0JCQlJdGVyYXRvciBpdCA9IGVsZW1lbnQyUHJvdmlkZXIua2V5U2V0KCkuaXRlcmF0b3IoKTsKLQkJCUlDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJCVN0cmluZyBjbGFzc25hbWUgPSBudWxsOwotCQkJT2JqZWN0IGV4aXN0aW5nID0gbnVsbDsKLQkJCUFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgcCA9IG51bGw7Ci0JCQl3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0JCQkJZWxlbWVudCA9IChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIGl0Lm5leHQoKTsKLQkJCQlvID0gZWxlbWVudDJQcm92aWRlci5nZXQoZWxlbWVudCk7Ci0JCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCQkvLyB0aGlzIHByb3ZpZGVyIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAotCQkJCQlpZiAoREVCVUcpCi0JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFscmVhZHkgY3JlYXRlZDogIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUykpOyAvLyROT04tTkxTLTEkCi0KLQkJCQkJcmVzdWx0cy5hZGQobyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBuZWVkIHRvIGNyZWF0ZSB0aGUgcHJvdmlkZXIKLQkJCQkJdHJ5IHsKLQkJCQkJCWNsYXNzbmFtZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUyk7Ci0KLQkJCQkJCWlmIChERUJVRykKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFib3V0IHRvIGNyZWF0ZTogIiArIGNsYXNzbmFtZSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJCQkJLy8gY2hlY2sgaWYgd2UgY3JlYXRlZCBvbmUgYWxyZWFkeQotCQkJCQkJZXhpc3RpbmcgPSB0aGlzLmFkYXB0ZXJQcm92aWRlcnMuZ2V0KGNsYXNzbmFtZSk7Ci0JCQkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewotCQkJCQkJCS8vIHRoaXMgaXMgdGhlIG9ubHkgcGxhY2UKLQkJCQkJCQkvLyBBZGFwdGVyRmFjdG9yeVByb3ZpZGVycwotCQkJCQkJCS8vIGFyZSBjcmVhdGVkCi0JCQkJCQkJcCA9IChBZGFwdGVyRmFjdG9yeVByb3ZpZGVyKSBlbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQVRUX0NMQVNTKTsgLy8gJE5PTi1OTFMtMSQKLQkJCQkJCQl0aGlzLmFkYXB0ZXJQcm92aWRlcnMucHV0KGNsYXNzbmFtZSwgcCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwID0gKEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIpIGV4aXN0aW5nOwotCQkJCQkJfQotCi0JCQkJCQkvLyBhZGQgdG8gZWxlbWVudDJQcm92aWRlciBmb3IgdGhpcyBjb250ZW50VHlwZQotCQkJCQkJZWxlbWVudDJQcm92aWRlci5wdXQoZWxlbWVudCwgcCk7Ci0JCQkJCQkvLyBhZGQgdG8gcmVzdWx0cyB0byByZXR1cm4gZm9yIHRoaXMgbWV0aG9kCi0JCQkJCQlyZXN1bHRzLmFkZChwKTsKLQotCQkJCQl9Ci0JCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vIGlmIHRoZSBwcm92aWRlciB0aHJvd3MgYW55IGV4Y2VwdGlvbiwganVzdCBsb2cKLQkJCQkJCS8vIGFuZAotCQkJCQkJLy8gY29udGludWUKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3JlZ2lzdHJ5L0FkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVkNDlkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBqdXN0IGNvbnZlcnRzIHdoYXQncyBpbiB0aGUgcGx1Z2lucyByZWdpc3RyeSBpbnRvIGEgZm9ybSBtb3JlCi0gKiBlYXNpbHkgdXNlYWJsZSBieSBvdGhlcnMsIHRoZSBDb250ZW50VHlwZVJlZ2lzdHJ5LgotICovCi1jbGFzcyBBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfQ0xBU1MgPSAiY2xhc3MiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBBVFRfSUQgPSAiaWQiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0JLy8KLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBUQUdfQ09OVEVOVF9UWVBFID0gImNvbnRlbnRUeXBlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVEFHX05BTUUgPSAiYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFVOS05PV05fQ09OVEVOVF9UWVBFID0gInVua25vd24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBhZGRzIGNvbmZpZ3VyYXRpb24gZWxlbWVudCB0byBjb250ZW50VHlwZUlkIG1hcCBbY29udGVudFR5cGVJZCAtPgotCSAqIGVsZW1lbnQycHJvdmlkZXJNYXBdIHwgViBbZWxlbWVudCAtPiBwcm92aWRlcl0KLQkgKiAKLQkgKiBOT1RFOiB0aGlzIGRvZXNuJ3QgY3JlYXRlIHRoZSBwcm92aWRlciB5ZXQsIHRoYXQgbXVzdCBiZSBkb25lIG9uIGRlbWFuZAotCSAqIGFuZCBzdG9yZWQgaW4gdGhlIGFwcHJvcHJpYXRlIGVsZW1lbnQycHJvdmlkZXIKLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWQKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqLwotCXByaXZhdGUgc3RhdGljIHZvaWQgYWRkRWxlbWVudEZvckNvbnRlbnRUeXBlKEhhc2hNYXAgbWFwLCBTdHJpbmcgY29udGVudFR5cGVJZCwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQotCQlPYmplY3QgbyA9IG1hcC5nZXQoY29udGVudFR5cGVJZCk7Ci0JCWlmIChvID09IG51bGwpIHsKLQkJCUhhc2hNYXAgZWxlbWVudDJwcm92aWRlciA9IG5ldyBIYXNoTWFwKCk7Ci0JCQkvLyBkb24ndCBjcmVhdGUgdGhlIGV4ZWN1dGFibGUgZXh0ZW5zaW9uIHlldAotCQkJZWxlbWVudDJwcm92aWRlci5wdXQoZWxlbWVudCwgbnVsbCk7Ci0JCQltYXAucHV0KGNvbnRlbnRUeXBlSWQsIGVsZW1lbnQycHJvdmlkZXIpOwotCi0JCQlpZiAoREVCVUcpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJhZGRlZCAiICsgZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKSArICIsIGJ1dCBkaWRuJ3QgY3JlYXRlIGV4ZWMgZXh0ZW5zaW9uIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJLy8gYWRkIGVsZW1lbnQgdG8gdW5rbm93biBsaXN0IChub3QgZXhlY3V0YWJsZSBleHQgeWV0Li4uKQotCQkJSGFzaE1hcCBlbGVtZW50MnByb3ZpZGVyID0gKEhhc2hNYXApIG87Ci0JCQllbGVtZW50MnByb3ZpZGVyLnB1dChlbGVtZW50LCBudWxsKTsKLQotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiYWRkZWQgIiArIGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9DTEFTUykgKyAiIHRvIHVua25vd24gbGlzdCwgYnV0IGRpZG4ndCBjcmVhdGUgZXhlYyBleHRlbnNpb24iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiB0aGUgbWFwIHBhc3NlZCBpbjogW2NvbnRlbnRUeXBlSWQgLT4gZWxlbWVudDJwcm92aWRlck1hcF0gfCBWIFtlbGVtZW50IC0+Ci0JICogcHJvdmlkZXJdCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcGFyYW0gbWFwCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgQWRhcHRlckZhY3RvcnlQcm92aWRlciByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgSGFzaE1hcCBtYXApIHsKLQotCQlBZGFwdGVyRmFjdG9yeVByb3ZpZGVyIGFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgPSBudWxsOwotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJdHJ5IHsKLQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKTsKLQkJCQlib29sZWFuIHNwZWNpZmllZENvbnRlbnRUeXBlID0gZmFsc2U7Ci0JCQkJaWYgKGNoaWxkcmVuICE9IG51bGwgJiYgY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCQkvLyBjb250ZW50IHR5cGVzIGFyZSBzcGVjaWZpZWQKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKGNoaWxkcmVuW2ldLmdldE5hbWUoKS5lcXVhbHMoVEFHX0NPTlRFTlRfVFlQRSkpIHsKLQkJCQkJCQkvLyBpdCdzIHBvc3NpYmxlIHRvIGhhdmUgbm9uLWNvbnRlbnRUeXBlIGNoaWxkcmVudAotCQkJCQkJCXNwZWNpZmllZENvbnRlbnRUeXBlID0gdHJ1ZTsKLQkJCQkJCQlTdHJpbmcgY29udGVudFR5cGUgPSBjaGlsZHJlbltpXS5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCQkJCQlhZGRFbGVtZW50Rm9yQ29udGVudFR5cGUobWFwLCBjb250ZW50VHlwZSwgZWxlbWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKCFzcGVjaWZpZWRDb250ZW50VHlwZSkgewotCQkJCQkvLyBubyBjb250ZW50IHR5cGUgYXNzb2NpYXRpb24KLQkJCQkJYWRkRWxlbWVudEZvckNvbnRlbnRUeXBlKG1hcCwgVU5LTk9XTl9DT05URU5UX1RZUEUsIGVsZW1lbnQpOwotCQkJCX0KLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgdGhlIHByb3ZpZGVyIHRocm93cyBhbnkgZXhjZXB0aW9uLCBqdXN0IGxvZyBhbmQgY29udGludWUKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JCXJldHVybiBhZGFwdGVyRmFjdG9yeVByb3ZpZGVyOwotCX0KLQotCS8qKgotCSAqIFdlIHNpbXBseSByZXF1aXJlIGFuICdhZGQnIG1ldGhvZCwgb2Ygd2hhdCBldmVyIGl0IGlzIHdlIGFyZSB0byByZWFkCi0JICogaW50bwotCSAqLwotCXN0YXRpYyB2b2lkIHJlYWRSZWdpc3RyeShIYXNoTWFwIG1hcCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldLCBtYXApOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWdFbGVtZW50ID0gbnVsbDsKLQotCS8vICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEQVBURVJfQ0xBU1MgPSAiYWRhcHRlckNsYXNzIjsKLQkvLyAvLyROT04tTkxTLTEkCi0JLy8gICAgcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgRE9DX1RZUEVfSUQgPSAiZG9jVHlwZUlkIjsgLy8kTk9OLU5MUy0xJAotCS8vICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfVFlQRV9MSVNUID0gIm1pbWVUeXBlTGlzdCI7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCS8vCi0JLyoqCi0JICogQ29udGVudFR5cGVSZWdpc3RyeVJlYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCUFkYXB0ZXJGYWN0b3J5UmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0Fic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxOTRhNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0Fic3RyYWN0TGluZVN0eWxlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkNvbG9ySGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwcml2YXRlIGNsYXNzIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBJUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciB7Ci0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lciNwcm9wZXJ0eUNoYW5nZShvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQkvLyBoYXZlIHRvIGRvIGl0IHRoaXMgd2F5IHNvIG90aGVycyBjYW4gb3ZlcnJpZGUgdGhlIG1ldGhvZAotCQkJaGFuZGxlUHJvcGVydHlDaGFuZ2UoZXZlbnQpOwotCQl9Ci0JfQotCi0JLy8gcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkvLyBOb3RlOiB0aGUgdmFyPXguY2xhc3MgY29udHJ1Y3RzIHdlcmUgcHV0IGludG8gdGhpcyBtZXRob2QKLQkvLyBhcyBhIHdvcmthcm91bmQgZm9yIHNsb3cgVkFKYXZhIGNsYXNzIGxvb2t1cHMuIFRoZXkgY29tcGlsZXIKLQkvLyBhc3NpZ25zIHRoZW0gdG8gYSB2YXJpYWJsZSBpbiB0aGUgSkRLLCBidXQgQ2xhc3MuZm9yTmFtZSgieCIpCi0JLy8gaW4gVkFKYXZhLiBJdCBpcyB3b3JrYXJvdW5kIHNwZWNpZmljIGZvciBWQUphdmEgZW52aXJvbm1lbnQsIHNvIGNvdWxkCi0JLy8gYmUgc2ltcGxpZmllZCBpbiBmdXR1cmUuCi0Jc3RhdGljIENsYXNzIExpbmVTdHlsZVByb3ZpZGVyQ2xhc3MgPSBMaW5lU3R5bGVQcm92aWRlci5jbGFzczsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJpdmF0ZSBIaWdobGlnaHRlciBmSGlnaGxpZ2h0ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZJbml0aWFsaXplZDsKLQlwcml2YXRlIFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZlByZWZlcmVuY2VMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCk7Ci0KLQkvKiogQ29udGFpbnMgYWxsIHRleHQgYXR0cmlidXRlcyBwcmV0YWluaW5nIHRvIHRoaXMgbGluZSBzdHlsZSBwcm92aWRlciAqLwotCXByaXZhdGUgSGFzaE1hcCBmVGV4dEF0dHJpYnV0ZXMgPSBudWxsOwotCi0JLy8gd2Uga2VlcCB0cmFjayBvZiBMb2dNZXNzYWdlIHRvIGF2b2lkIHdyaXRpbmcgaHVuZHJlZHMgb2YgbWVzc2FnZXMsCi0JLy8gYnV0IHN0aWxsIGdpdmUgYSBoaW50IHRoYXQgc29tZXRoaW5nIGlzIHdyb25nIHdpdGggYXR0cmlidXRlUHJvdmlkZXJzCi0JLy8gYW5kL29yIHJlZ2lvbnMuCi0JLy8gSXQncyBvbmx5IHdyaXR0ZW4gaW4gdGhlIGNhc2Ugb2YgYSBwcm9ncmFtIGVycm9yLCBidXQgdGhlcmUncyBubyB1c2UKLQkvLyBhZGRpbmcKLQkvLyBzYWx0IHRvIHRoZSB3b3VuZC4KLQkvLyBwcml2YXRlIGJvb2xlYW4gd3JvdGVPbmVMb2dNZXNzYWdlOwotCS8qKgotCSAqLwotCXByb3RlY3RlZCBBYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyKCkgewotCX0KLQotCS8qKgotCSAqIExvb2tzIHVwIHRoZSBjb2xvcktleSBpbiB0aGUgcHJlZmVyZW5jZSBzdG9yZSBhbmQgYWRkcyB0aGUgc3R5bGUKLQkgKiBpbmZvcm1hdGlvbiB0byBsaXN0IG9mIFRleHRBdHRyaWJ1dGVzCi0JICogCi0JICogQHBhcmFtIGNvbG9yS2V5Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGV4dEF0dHJpYnV0ZShTdHJpbmcgY29sb3JLZXkpIHsKLQkJaWYgKGdldENvbG9yUHJlZmVyZW5jZXMoKSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgcHJlZlN0cmluZyA9IGdldENvbG9yUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoY29sb3JLZXkpOwotCQkJU3RyaW5nW10gc3R5bGVQcmVmcyA9IENvbG9ySGVscGVyLnVucGFja1N0eWxlUHJlZmVyZW5jZXMocHJlZlN0cmluZyk7Ci0JCQlpZiAoc3R5bGVQcmVmcyAhPSBudWxsKSB7Ci0JCQkJUkdCIGZvcmVncm91bmQgPSBDb2xvckhlbHBlci50b1JHQihzdHlsZVByZWZzWzBdKTsKLQkJCQlSR0IgYmFja2dyb3VuZCA9IENvbG9ySGVscGVyLnRvUkdCKHN0eWxlUHJlZnNbMV0pOwotCQkJCWJvb2xlYW4gYm9sZCA9IEJvb2xlYW4udmFsdWVPZihzdHlsZVByZWZzWzJdKS5ib29sZWFuVmFsdWUoKTsKLQkJCQlnZXRUZXh0QXR0cmlidXRlcygpLnB1dChjb2xvcktleSwgY3JlYXRlVGV4dEF0dHJpYnV0ZShmb3JlZ3JvdW5kLCBiYWNrZ3JvdW5kLCBib2xkKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21tb25Jbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0KLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZIaWdobGlnaHRlciA9IGhpZ2hsaWdodGVyOwotCX0KLQotCS8qKgotCSAqIHRoaXMgdmVyc2lvbiBkb2VzICJ0cmltIiByZWdpb25zIHRvIG1hdGNoIHJlcXVlc3QKLQkgKi8KLQlwcml2YXRlIFN0eWxlUmFuZ2UgY3JlYXRlU3R5bGVSYW5nZShJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbiwgVGV4dEF0dHJpYnV0ZSBhdHRyLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJaW50IHN0YXJ0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQocmVnaW9uKTsKLQkJaWYgKHN0YXJ0IDwgc3RhcnRPZmZzZXQpCi0JCQlzdGFydCA9IHN0YXJ0T2Zmc2V0OwotCQlpbnQgbWF4T2Zmc2V0ID0gc3RhcnRPZmZzZXQgKyBsZW5ndGg7Ci0JCWludCBlbmQgPSBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKTsgLy8gdXNlIGdldCBsZW5ndGggZGlyZWN0bHkKLQkJLy8gaW5zdGVhZCBvZiBlbmQtc3RhcnQ/Ci0JCWlmIChlbmQgPiBtYXhPZmZzZXQpCi0JCQllbmQgPSBtYXhPZmZzZXQ7Ci0JCVN0eWxlUmFuZ2UgcmVzdWx0ID0gbmV3IFN0eWxlUmFuZ2Uoc3RhcnQsIGVuZCAtIHN0YXJ0LCBhdHRyLmdldEZvcmVncm91bmQoKSwgYXR0ci5nZXRCYWNrZ3JvdW5kKCksIGF0dHIuZ2V0U3R5bGUoKSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBjcmVhdGVUZXh0QXR0cmlidXRlKFJHQiBmb3JlZ3JvdW5kLCBSR0IgYmFja2dyb3VuZCwgYm9vbGVhbiBib2xkKSB7Ci0JCXJldHVybiBuZXcgVGV4dEF0dHJpYnV0ZSgoZm9yZWdyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoZm9yZWdyb3VuZCkgOiBudWxsLCAoYmFja2dyb3VuZCAhPSBudWxsKSA/IEVkaXRvclV0aWxpdHkuZ2V0Q29sb3IoYmFja2dyb3VuZCkgOiBudWxsLCBib2xkID8gU1dULkJPTEQgOiBTV1QuTk9STUFMKTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgVGV4dEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGVGb3IoSVRleHRSZWdpb24gcmVnaW9uKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGdldENvbG9yUHJlZmVyZW5jZXMoKTsKLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBIaWdobGlnaHRlciBnZXRIaWdobGlnaHRlcigpIHsKLQkJcmV0dXJuIGZIaWdobGlnaHRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBoYXNodGFibGUgY29udGFpbmluZyBhbGwgdGhlIHRleHQgYXR0cmlidXRlcyBmb3IgdGhpcyBsaW5lCi0JICogc3R5bGUgcHJvdmlkZXIuIExhemlseSBjcmVhdGVzIGEgaGFzaHRhYmxlIGlmIG9uZSBoYXMgbm90IGFscmVhZHkgYmVlbgotCSAqIGNyZWF0ZWQuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBIYXNoTWFwIGdldFRleHRBdHRyaWJ1dGVzKCkgewotCQlpZiAoZlRleHRBdHRyaWJ1dGVzID09IG51bGwpIHsKLQkJCWZUZXh0QXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlsb2FkQ29sb3JzKCk7Ci0JCX0KLQkJcmV0dXJuIGZUZXh0QXR0cmlidXRlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIGZvcmNlIGEgZnVsbCB1cGRhdGUgb2YgdGhlIHRleHQgdmlld2VyCi0JCWZIaWdobGlnaHRlci5yZWZyZXNoRGlzcGxheSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKSB7Ci0KLQkJY29tbW9uSW5pdChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGhpZ2hsaWdodGVyKTsKLQotCQlpZiAoaXNJbml0aWFsaXplZCgpKQotCQkJcmV0dXJuOwotCi0JCXJlZ2lzdGVyUHJlZmVyZW5jZU1hbmFnZXIoKTsKLQotCQlzZXRJbml0aWFsaXplZCh0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IExpbmVTdHlsZVByb3ZpZGVyQ2xhc3M7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLQkJcmV0dXJuIGZJbml0aWFsaXplZDsKLQl9Ci0JCi0JYWJzdHJhY3QgcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpOwotCi0JcHVibGljIGJvb2xlYW4gcHJlcGFyZVJlZ2lvbnMoSVR5cGVkUmVnaW9uIHR5cGVkUmVnaW9uLCBpbnQgbGluZVJlcXVlc3RTdGFydCwgaW50IGxpbmVSZXF1ZXN0TGVuZ3RoLCBDb2xsZWN0aW9uIGhvbGRSZXN1bHRzKSB7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25TdGFydE9mZnNldCA9IHR5cGVkUmVnaW9uLmdldE9mZnNldCgpOwotCQlmaW5hbCBpbnQgcGFydGl0aW9uTGVuZ3RoID0gdHlwZWRSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZ2V0RG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwYXJ0aXRpb25TdGFydE9mZnNldCk7Ci0JCWJvb2xlYW4gaGFuZGxlZCA9IGZhbHNlOwotCi0JCWhhbmRsZWQgPSBwcmVwYXJlVGV4dFJlZ2lvbnMoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBwYXJ0aXRpb25TdGFydE9mZnNldCwgcGFydGl0aW9uTGVuZ3RoLCBob2xkUmVzdWx0cyk7Ci0KLQkJcmV0dXJuIGhhbmRsZWQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqIEBwYXJhbSBzdGFydAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcGFyYW0gaG9sZFJlc3VsdHMKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIHByZXBhcmVUZXh0UmVnaW9uKElUZXh0UmVnaW9uQ29sbGVjdGlvbiBibG9ja2VkUmVnaW9uLCBpbnQgcGFydGl0aW9uU3RhcnRPZmZzZXQsIGludCBwYXJ0aXRpb25MZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25FbmRPZmZzZXQgPSBwYXJ0aXRpb25TdGFydE9mZnNldCArIHBhcnRpdGlvbkxlbmd0aCAtIDE7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gYmxvY2tlZFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWludCBuUmVnaW9ucyA9IHJlZ2lvbnMuc2l6ZSgpOwotCQlTdHlsZVJhbmdlIHN0eWxlUmFuZ2UgPSBudWxsOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWdpb25zOyBpKyspIHsKLQkJCXJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJVGV4dEF0dHJpYnV0ZSBhdHRyID0gbnVsbDsKLQkJCVRleHRBdHRyaWJ1dGUgcHJldmlvdXNBdHRyID0gbnVsbDsKLQkJCWlmIChibG9ja2VkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPiBwYXJ0aXRpb25FbmRPZmZzZXQpCi0JCQkJYnJlYWs7Ci0JCQlpZiAoYmxvY2tlZFJlZ2lvbi5nZXRFbmRPZmZzZXQocmVnaW9uKSA8PSBwYXJ0aXRpb25TdGFydE9mZnNldCkKLQkJCQljb250aW51ZTsKLQotCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCWhhbmRsZWQgPSBwcmVwYXJlVGV4dFJlZ2lvbigoSVRleHRSZWdpb25Db2xsZWN0aW9uKSByZWdpb24sIHBhcnRpdGlvblN0YXJ0T2Zmc2V0LCBwYXJ0aXRpb25MZW5ndGgsIGhvbGRSZXN1bHRzKTsKLQkJCX0gZWxzZSB7Ci0KLQkJCQlhdHRyID0gZ2V0QXR0cmlidXRlRm9yKHJlZ2lvbik7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQloYW5kbGVkID0gdHJ1ZTsKLQkJCQkJLy8gaWYgdGhpcyByZWdpb24ncyBhdHRyIGlzIHRoZSBzYW1lIGFzIHByZXZpb3VzIG9uZSwgdGhlbgotCQkJCQkvLyBqdXN0IGFkanVzdCB0aGUgcHJldmlvdXMgc3R5bGUgcmFuZ2UKLQkJCQkJLy8gaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBpbnN0YW5jZSBvZiBvbmUKLQkJCQkJLy8gbm90ZTogdG8gdXNlICdlcXVhbHMnIGluIHRoaXMgY2FzZSBpcyBpbXBvcnRhbnQsIHNpbmNlCi0JCQkJCS8vIHNvbWV0aW1lcwotCQkJCQkvLyBkaWZmZXJlbnQgaW5zdGFuY2VzIG9mIGF0dHJpYnV0ZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBhCi0JCQkJCS8vIHJlZ2lvbiwgZXZlbiB0aGUKLQkJCQkJLy8gdGhlIGF0dHJpYnV0ZSBoYXMgdGhlIHNhbWUgdmFsdWVzLgotCQkJCQkvLyBUT0RPOiB0aGlzIG5lZWRzIHRvIGJlIGltcHJvdmVkIHRvIGhhbmRsZSByZWFkb25seQotCQkJCQkvLyByZWdpb25zIGNvcnJlY3RseQotCQkJCQlpZiAoKHN0eWxlUmFuZ2UgIT0gbnVsbCkgJiYgKHByZXZpb3VzQXR0ciAhPSBudWxsKSAmJiAocHJldmlvdXNBdHRyLmVxdWFscyhhdHRyKSkpIHsKLQkJCQkJCXN0eWxlUmFuZ2UubGVuZ3RoICs9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCXN0eWxlUmFuZ2UgPSBjcmVhdGVTdHlsZVJhbmdlKGJsb2NrZWRSZWdpb24sIHJlZ2lvbiwgYXR0ciwgcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCk7Ci0JCQkJCQlob2xkUmVzdWx0cy5hZGQoc3R5bGVSYW5nZSk7Ci0JCQkJCQkvLyB0ZWNobmljYWxseSBzcGVha2luZywgd2UgZG9uJ3QgbmVlZCB0byB1cGRhdGUKLQkJCQkJCS8vIHByZXZpb3VzQXR0cgotCQkJCQkJLy8gaW4gdGhlIG90aGVyIGNhc2UsIGJlY2F1c2UgdGhlIG90aGVyIGNhc2UgaXMgd2hlbgotCQkJCQkJLy8gaXQgaGFzbid0IGNoYW5nZWQKLQkJCQkJCXByZXZpb3VzQXR0ciA9IGF0dHI7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlwcmV2aW91c0F0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaGFuZGxlZDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gcHJlcGFyZVRleHRSZWdpb25zKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpbnQgcGFydGl0aW9uU3RhcnRPZmZzZXQsIGludCBwYXJ0aXRpb25MZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0JCWZpbmFsIGludCBwYXJ0aXRpb25FbmRPZmZzZXQgPSBwYXJ0aXRpb25TdGFydE9mZnNldCArIHBhcnRpdGlvbkxlbmd0aCAtIDE7Ci0JCXdoaWxlIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSA8PSBwYXJ0aXRpb25FbmRPZmZzZXQpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCQlpbnQgblJlZ2lvbnMgPSByZWdpb25zLnNpemUoKTsKLQkJCVN0eWxlUmFuZ2Ugc3R5bGVSYW5nZSA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5SZWdpb25zOyBpKyspIHsKLQkJCQlyZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCQlUZXh0QXR0cmlidXRlIGF0dHIgPSBudWxsOwotCQkJCVRleHRBdHRyaWJ1dGUgcHJldmlvdXNBdHRyID0gbnVsbDsKLQkJCQlpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgPiBwYXJ0aXRpb25FbmRPZmZzZXQpCi0JCQkJCWJyZWFrOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KHJlZ2lvbikgPD0gcGFydGl0aW9uU3RhcnRPZmZzZXQpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQloYW5kbGVkID0gcHJlcGFyZVRleHRSZWdpb24oKElUZXh0UmVnaW9uQ29sbGVjdGlvbikgcmVnaW9uLCBwYXJ0aXRpb25TdGFydE9mZnNldCwgcGFydGl0aW9uTGVuZ3RoLCBob2xkUmVzdWx0cyk7Ci0JCQkJfSBlbHNlIHsKLQotCQkJCQlhdHRyID0gZ2V0QXR0cmlidXRlRm9yKHJlZ2lvbik7Ci0JCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJCWhhbmRsZWQgPSB0cnVlOwotCQkJCQkJLy8gaWYgdGhpcyByZWdpb24ncyBhdHRyIGlzIHRoZSBzYW1lIGFzIHByZXZpb3VzIG9uZSwKLQkJCQkJCS8vIHRoZW4ganVzdCBhZGp1c3QgdGhlIHByZXZpb3VzIHN0eWxlIHJhbmdlCi0JCQkJCQkvLyBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIG9mIG9uZQotCQkJCQkJLy8gbm90ZTogdG8gdXNlICdlcXVhbHMnIGluIHRoaXMgY2FzZSBpcyBpbXBvcnRhbnQsCi0JCQkJCQkvLyBzaW5jZSBzb21ldGltZXMKLQkJCQkJCS8vIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgYXR0cmlidXRlcyBhcmUgYXNzb2NpYXRlZAotCQkJCQkJLy8gd2l0aCBhIHJlZ2lvbiwgZXZlbiB0aGUKLQkJCQkJCS8vIHRoZSBhdHRyaWJ1dGUgaGFzIHRoZSBzYW1lIHZhbHVlcy4KLQkJCQkJCS8vIFRPRE86IHRoaXMgbmVlZHMgdG8gYmUgaW1wcm92ZWQgdG8gaGFuZGxlIHJlYWRvbmx5Ci0JCQkJCQkvLyByZWdpb25zIGNvcnJlY3RseQotCQkJCQkJaWYgKChzdHlsZVJhbmdlICE9IG51bGwpICYmIChwcmV2aW91c0F0dHIgIT0gbnVsbCkgJiYgKHByZXZpb3VzQXR0ci5lcXVhbHMoYXR0cikpKSB7Ci0JCQkJCQkJc3R5bGVSYW5nZS5sZW5ndGggKz0gcmVnaW9uLmdldExlbmd0aCgpOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlzdHlsZVJhbmdlID0gY3JlYXRlU3R5bGVSYW5nZShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlZ2lvbiwgYXR0ciwgcGFydGl0aW9uU3RhcnRPZmZzZXQsIHBhcnRpdGlvbkxlbmd0aCk7Ci0JCQkJCQkJaG9sZFJlc3VsdHMuYWRkKHN0eWxlUmFuZ2UpOwotCQkJCQkJCS8vIHRlY2huaWNhbGx5IHNwZWFraW5nLCB3ZSBkb24ndCBuZWVkIHRvIHVwZGF0ZQotCQkJCQkJCS8vIHByZXZpb3VzQXR0cgotCQkJCQkJCS8vIGluIHRoZSBvdGhlciBjYXNlLCBiZWNhdXNlIHRoZSBvdGhlciBjYXNlIGlzCi0JCQkJCQkJLy8gd2hlbiBpdCBoYXNuJ3QgY2hhbmdlZAotCQkJCQkJCXByZXZpb3VzQXR0ciA9IGF0dHI7Ci0JCQkJCQl9Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlwcmV2aW91c0F0dHIgPSBudWxsOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKERlYnVnLnN5bnRheEhpZ2hsaWdodGluZyAmJiAhaGFuZGxlZCkgewotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIm5vdCBoYW5kbGVkIGluIHByZXBhcmVSZWdpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCQlzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TmV4dCgpOwotCQl9Ci0JCXJldHVybiBoYW5kbGVkOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWdpc3RlclByZWZlcmVuY2VNYW5hZ2VyKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHByZWYgPSBnZXRDb2xvclByZWZlcmVuY2VzKCk7Ci0JCWlmIChwcmVmICE9IG51bGwpIHsKLQkJCXByZWYuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcihmUHJlZmVyZW5jZUxpc3RlbmVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXVuUmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpOwotCQlpZiAoZlRleHRBdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWZUZXh0QXR0cmlidXRlcy5jbGVhcigpOwotCQkJZlRleHRBdHRyaWJ1dGVzID0gbnVsbDsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGluaXRpYWxpemVkLgotCSAqIAotCSAqIEBwYXJhbSBpbml0aWFsaXplZAotCSAqICAgICAgICAgICAgVGhlIGluaXRpYWxpemVkIHRvIHNldAotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRJbml0aWFsaXplZChib29sZWFuIGluaXRpYWxpemVkKSB7Ci0JCXRoaXMuZkluaXRpYWxpemVkID0gaW5pdGlhbGl6ZWQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHVuUmVnaXN0ZXJQcmVmZXJlbmNlTWFuYWdlcigpIHsKLQkJSVByZWZlcmVuY2VTdG9yZSBwcmVmID0gZ2V0Q29sb3JQcmVmZXJlbmNlcygpOwotCQlpZiAocHJlZiAhPSBudWxsKSB7Ci0JCQlwcmVmLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlByZWZlcmVuY2VMaXN0ZW5lcik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvSGlnaGxpZ2h0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9IaWdobGlnaHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2VlNjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9IaWdobGlnaHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTA2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlckV4dGVuc2lvbjU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uTGluZVN0eWxlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlJHQjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRDb25maWd1cmF0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbC5FZGl0b3JVdGlsaXR5OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdG8gZGlyZWN0bHkgbWVkaWF0ZSBiZXR3ZWVuIHRoZSBTdHJ1Y3R1cmVkIERvY3VtZW50IGRhdGEKLSAqIHN0cnVjdHVyZSBhbmQgdGhlIHRleHQgd2lkZ2V0J3MgdGV4dCBhbmQgZXZlbnRzLiBJdCBhc3N1bWVzIHRoZXJlIG9ubHkgdGhlCi0gKiBtb2RlbCBpcyBpbnRlcmVzdGVkIGluIHRleHQgZXZlbnRzLCBhbmQgYWxsIG90aGVyIHZpZXdzIHdpbGwgd29yayBmcm9tIHRoYXQKLSAqIG1vZGVsLiBDaGFuZ2VzIHRvIHRoZSB0ZXh0IHdpZGdldHMgaW5wdXQgY2FuIGNhdXNlIGNoYW5nZXMgaW4gdGhlIG1vZGVsLAotICogd2hpY2ggaW4gdHVybiBjYXVzZSBjaGFuZ2VzIHRvIHRoZSB3aWRnZXQncyBkaXNwbGF5LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBIaWdobGlnaHRlciBpbXBsZW1lbnRzIElIaWdobGlnaHRlciB7Ci0KLQkvKioKLQkgKiBBIHV0aWxpdHkgY2xhc3MgdG8gZG8gdmFyaW91cyBjb2xvciBtYW5pcHVsYXRpb25zCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBZVVZfUkdCQ29udmVydGVyIHsKLQkJLyoqCi0JCSAqIFRoaXMgY2xhc3MgImhvbGRzIiB0aGUgWVVWIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIFJHQiBjb2xvcgotCQkgKi8KLQkJcHJpdmF0ZSBjbGFzcyBZVVYgewotCi0JCQljbGFzcyBOb3JtYWxpemVkUkdCIHsKLQkJCQlkb3VibGUgYmx1ZTsKLQkJCQlkb3VibGUgZ3JlZW47Ci0JCQkJcHJpdmF0ZSBmaW5hbCBkb3VibGUgbWF4UkdCID0gMjU2LjA7Ci0JCQkJZG91YmxlIHJlZDsKLQotCQkJCXB1YmxpYyBOb3JtYWxpemVkUkdCKFJHQiByZ2IpIHsKLQkJCQkJLy8gZmlyc3Qgbm9ybWFsaXplIHRvIGJldHdlZW4gMCAtIDEKLQkJCQkJcmVkID0gcmdiLnJlZCAvIG1heFJHQjsKLQkJCQkJZ3JlZW4gPSByZ2IuZ3JlZW4gLyBtYXhSR0I7Ci0JCQkJCWJsdWUgPSByZ2IuYmx1ZSAvIG1heFJHQjsKLQotCQkJCQlyZWQgPSBnYW1tYU5vcm1hbGl6ZWQocmVkKTsKLQkJCQkJZ3JlZW4gPSBnYW1tYU5vcm1hbGl6ZWQoZ3JlZW4pOwotCQkJCQlibHVlID0gZ2FtbWFOb3JtYWxpemVkKGJsdWUpOwotCi0JCQkJfQotCQkJfQotCi0JCQlwcml2YXRlIE5vcm1hbGl6ZWRSR0Igbm9ybWFsaXplZFJHQjsKLQotCQkJUkdCIG9yaWdpbmFsUkdCOwotCQkJcHJpdmF0ZSBkb3VibGUgdSA9IC0xOwotCQkJcHJpdmF0ZSBkb3VibGUgdiA9IC0xOwotCQkJcHJpdmF0ZSBkb3VibGUgeSA9IC0xOwotCi0JCQlwcml2YXRlIFlVVigpIHsKLQkJCQlzdXBlcigpOwotCQkJfQotCi0JCQlwdWJsaWMgWVVWKGRvdWJsZSB5LCBkb3VibGUgdSwgZG91YmxlIHYpIHsKLQkJCQl0aGlzKCk7Ci0JCQkJdGhpcy55ID0geTsKLQkJCQl0aGlzLnUgPSB1OwotCQkJCXRoaXMudiA9IHY7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBZVVYoUkdCIHJnYikgewotCQkJCXRoaXMoKTsKLQkJCQlvcmlnaW5hbFJHQiA9IHJnYjsKLQkJCQlub3JtYWxpemVkUkdCID0gbmV3IE5vcm1hbGl6ZWRSR0IocmdiKTsKLQkJCQkvLyBmb3JjZSBjYWxjdWxhdGlvbnMKLQkJCQlnZXRZKCk7Ci0JCQkJZ2V0VigpOwotCQkJCWdldFUoKTsKLQkJCX0KLQotCQkJLyoqCi0JCQkgKiBub3JtYWxpemUgdG8gImF2ZXJhZ2UiIGdhbW1hIDIuMjIyMiBvciAxLzAuNDUKLQkJCSAqLwotCQkJZG91YmxlIGdhbW1hTm9ybWFsaXplZChkb3VibGUgY29sb3JDb21wb25lbnQpIHsKLQkJCQlpZiAoY29sb3JDb21wb25lbnQgPCAwLjAxOCkgewotCQkJCQlyZXR1cm4gY29sb3JDb21wb25lbnQgKiAwLjQ1OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJcmV0dXJuIDEuMDk5ICogTWF0aC5wb3coY29sb3JDb21wb25lbnQsIDAuNDUpIC0gMC4wOTk7Ci0JCQkJfQotCQkJfQotCi0JCQkvKioKLQkJCSAqIEByZXR1cm4gUkdCIGJhc2VkIG9uIG9yaWdpbmFsIFJHQiBhbmQgY3VycmVudCBZVVYgdmFsdWVzOwotCQkJICovCi0JCQlwdWJsaWMgUkdCIGdldFJHQigpIHsKLQkJCQlSR0IgcmVzdWx0ID0gbnVsbDsKLQkJCQlkb3VibGUgciA9IGdldFkoKSArIDEuMTQgKiBnZXRWKCk7Ci0JCQkJZG91YmxlIGcgPSBnZXRZKCkgLSAwLjM5NSAqIGdldFUoKSAtIDAuNTggKiBnZXRWKCk7Ci0JCQkJZG91YmxlIGIgPSBnZXRZKCkgKyAyLjAzMiAqIGdldFUoKTsKLQotCQkJCWludCByZWQgPSAoaW50KSAoaW52ZXJzZUdhbW1hTm9ybWFsaXplZChyKSAqIDI1Nik7Ci0JCQkJaW50IGdyZWVuID0gKGludCkgKGludmVyc2VHYW1tYU5vcm1hbGl6ZWQoZykgKiAyNTYpOwotCQkJCWludCBibHVlID0gKGludCkgKGludmVyc2VHYW1tYU5vcm1hbGl6ZWQoYikgKiAyNTYpOwotCQkJCWlmIChyZWQgPCAwKQotCQkJCQlyZWQgPSAwOwotCQkJCWVsc2UgaWYgKHJlZCA+IDI1NSkKLQkJCQkJcmVkID0gMjU1OwotCQkJCWlmIChncmVlbiA8IDApCi0JCQkJCWdyZWVuID0gMDsKLQkJCQllbHNlIGlmIChncmVlbiA+IDI1NSkKLQkJCQkJZ3JlZW4gPSAyNTU7Ci0JCQkJaWYgKGJsdWUgPCAwKQotCQkJCQlibHVlID0gMDsKLQkJCQllbHNlIGlmIChibHVlID4gMjU1KQotCQkJCQlibHVlID0gMjU1OwotCi0JCQkJcmVzdWx0ID0gbmV3IFJHQihyZWQsIGdyZWVuLCBibHVlKTsKLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIGdldFUoKSB7Ci0JCQkJaWYgKHUgPT0gLTEpIHsKLQkJCQkJdSA9IDAuNDk0OSAqIChub3JtYWxpemVkUkdCLmJsdWUgLSBnZXRZKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gdTsKLQotCQkJfQotCi0JCQlwdWJsaWMgZG91YmxlIGdldFYoKSB7Ci0JCQkJaWYgKHYgPT0gLTEpIHsKLQkJCQkJdiA9IDAuODc3ICogKG5vcm1hbGl6ZWRSR0IucmVkIC0gZ2V0WSgpKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHY7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBkb3VibGUgZ2V0WSgpIHsKLQkJCQlpZiAoeSA9PSAtMSkgewotCQkJCQl5ID0gMC4yOTkgKiBub3JtYWxpemVkUkdCLnJlZCArIDAuNTg3ICogbm9ybWFsaXplZFJHQi5ncmVlbiArIDAuMTE0ICogbm9ybWFsaXplZFJHQi5ibHVlOwotCQkJCX0KLQkJCQlyZXR1cm4geTsKLQkJCX0KLQotCQkJZG91YmxlIGludmVyc2VHYW1tYU5vcm1hbGl6ZWQoZG91YmxlIGNvbG9yQ29tcG9uZW50KSB7Ci0JCQkJaWYgKGNvbG9yQ29tcG9uZW50IDwgMC4wMTgpIHsKLQkJCQkJcmV0dXJuIGNvbG9yQ29tcG9uZW50ICogLjIyMjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJldHVybiBNYXRoLnBvdygoKC45MDk5ICogY29sb3JDb21wb25lbnQgKyAwLjA5KSksIDIuMjIpOwotCQkJCX0KLQkJCX0KLQotCQl9Ci0KLQkJcHVibGljIFlVVl9SR0JDb252ZXJ0ZXIoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGRvdWJsZSBjYWxjdWxhdGVZQ29tcG9uZW50KENvbG9yIHRhcmdldENvbG9yKSB7Ci0JCQlyZXR1cm4gbmV3IFlVVih0YXJnZXRDb2xvci5nZXRSR0IoKSkuZ2V0WSgpOwotCQl9Ci0KLQkJcHVibGljIFJHQiB0cmFuc2Zvcm1SR0IoUkdCIG9yaWdpbmFsUkdCLCBkb3VibGUgc2NhbGVGYWN0b3IsIGRvdWJsZSB0YXJnZXQpIHsKLQkJCVJHQiB0cmFuc2Zvcm1lZFJHQiA9IG51bGw7Ci0JCQkvLyBDQ0lSNjAxIHl1diA9IG5ldyBDQ0lSNjAxKG9yaWdpbmFsUkdCKTsKLQkJCVlVViB5dXYgPSBuZXcgWVVWKG9yaWdpbmFsUkdCKTsKLQkJCWRvdWJsZSB5ID0geXV2LmdldFkoKTsKLQkJCS8vIHplcm8gaXMgYmxhY2ssIG9uZSBpcyB3aGl0ZQotCQkJaWYgKHkgPCB0YXJnZXQpIHsKLQkJCQkvLyBpcyAiZGFyayIgbWFrZSBsaWdodGVyCi0JCQkJeSA9IHkgKyAoKHRhcmdldCAtIHkpICogc2NhbGVGYWN0b3IpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaXMgImxpZ2h0IiBtYWtlIGRhcmtlcgotCQkJCXkgPSB5IC0gKCh5IC0gdGFyZ2V0KSAqIHNjYWxlRmFjdG9yKTsKLQkJCX0KLQkJCS8vIHl1di5zZXRZKHkpOwotCQkJWVVWIG5ld1lVViA9IG5ldyBZVVYoeSwgeXV2LmdldFUoKSwgeXV2LmdldFYoKSk7Ci0JCQkvLyBDQ0lSNjAxIG5ld1lVViA9IG5ldyBDQ0lSNjAxKHksIHl1di5nZXRDYjYwMSgpLAotCQkJLy8geXV2LmdldENyNjAxKCkpOwotCQkJdHJhbnNmb3JtZWRSR0IgPSBuZXdZVVYuZ2V0UkdCKCk7Ci0JCQlyZXR1cm4gdHJhbnNmb3JtZWRSR0I7Ci0JCX0KLQotCQlwdWJsaWMgUkdCIHRyYW5zZm9ybVJHQlRvR3JleShSR0Igb3JpZ2luYWxSR0IsIGRvdWJsZSBzY2FsZUZhY3RvciwgZG91YmxlIHRhcmdldCkgewotCQkJUkdCIHRyYW5zZm9ybWVkUkdCID0gbnVsbDsKLQkJCS8vIHdlIGxlZnQgdGhlICJmdWxsIiBBUEkgbWV0aG9kIHNpZ25hdHVyZSwgYnV0IHRoaXMKLQkJCS8vIHZlcnNpb24gZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgb3JpZ2luYWxSR0IsIHRob3VnaAotCQkJLy8gaXQgbWlnaHQgc29tZWRheS4KLQkJCS8vIGZvciBub3csIHdlJ2xsIHNpbXBseSBtYWtlIHRoZSBuZXcgUkdCIGdyZXksIGVpdGhlciBhIGxpdHRsZQotCQkJLy8gbGlnaHRlciwgb3IgYSBsaXR0bGUgZGFya2VyIHRoYW4gYmFja2dyb3VuZC4KLQkJCWRvdWJsZSB5ID0gMDsKLQkJCWRvdWJsZSBtaWQgPSAwLjU7Ci0JCQkvLyB6ZXJvIGlzIGJsYWNrLCBvbmUgaXMgd2hpdGUKLQkJCWlmICh0YXJnZXQgPCBtaWQpIHsKLQkJCQkvLyBpcyAiZGFyayIgbWFrZSBsaWdodGVyCi0JCQkJeSA9IHRhcmdldCArIHNjYWxlRmFjdG9yOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gaXMgImxpZ2h0IiBtYWtlIGRhcmtlcgotCQkJCXkgPSB0YXJnZXQgLSBzY2FsZUZhY3RvcjsKLQkJCX0KLQkJCWludCBjID0gKGludCkgTWF0aC5yb3VuZCh5ICogMjU1KTsKLQkJCS8vIGp1c3QgdG8gZ2F1cmQgYWdhaW5zdCBtaXMtdXNlLCBvciBzY2FsZSdzIHZhbHVlcyBncmVhdGVyCi0JCQkvLyB0aGFuIG1pZCBwb2ludCAoYW5kIHBvc3NpYmx5IHJvdW5kaW5nIGVycm9yKQotCQkJaWYgKGMgPiAyNTUpCi0JCQkJYyA9IDI1NTsKLQkJCWlmIChjIDwgMCkKLQkJCQljID0gMDsKLQkJCXRyYW5zZm9ybWVkUkdCID0gbmV3IFJHQihjLCBjLCBjKTsKLQkJCXJldHVybiB0cmFuc2Zvcm1lZFJHQjsKLQkJfQotCX0KLQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgZmluYWwgU3R5bGVSYW5nZVtdIEVNUFRZX1NUWUxFX1JBTkdFID0gbmV3IFN0eWxlUmFuZ2VbMF07Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU1RZTEVfUFJPVklERVJfRVhURU5ERURfSUQgPSAibGluZXN0eWxlcHJvdmlkZXIiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9OVU1CRVJfU1RZTEVTID0gNTAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMRUZUX1NUWUxFU19TSVpFID0gMjAwOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSSUdIVF9TVFlMRVNfU0laRSA9IDIwMDsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlERExFX1NUWUxFU19TSVpFID0gMTsKLQotCXByaXZhdGUgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgZkZvcmVncm91bmRTY2FsZUxpc3RlbmVyID0gbmV3IElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKCkgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlJFQURfT05MWV9GT1JFR1JPVU5EX1NDQUxFLmVxdWFscyhldmVudC5nZXRQcm9wZXJ0eSgpKSkgewotCQkJCUlQcmVmZXJlbmNlU3RvcmUgZWRpdG9yU3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJcmVhZE9ubHlGb3JlZ3JvdW5kU2NhbGVGYWN0b3IgPSBlZGl0b3JTdG9yZS5nZXRJbnQoRWRpdG9yUHJlZmVyZW5jZU5hbWVzLlJFQURfT05MWV9GT1JFR1JPVU5EX1NDQUxFKTsKLQkJCQlkaXNwb3NlQ29sb3JUYWJsZSgpOwotCQkJCXJlZnJlc2hEaXNwbGF5KCk7Ci0JCQl9Ci0JCX0KLQl9OwotCXByaXZhdGUgTGlzdCBmSG9sZFN0eWxlUmVzdWx0czsKLQlwcml2YXRlIFN0cmluZyBmUGFydGl0aW9uaW5nID0gSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORzsKLQotCXByaXZhdGUgaW50IGZTYXZlZExlbmd0aCA9IC0xOwotCXByaXZhdGUgaW50IGZTYXZlZE9mZnNldCA9IC0xOwotCXByaXZhdGUgU3R5bGVSYW5nZVtdIGZTYXZlZFJhbmdlcyA9IG51bGw7Ci0KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZlN0cnVjdHVyZWREb2N1bWVudDsKLQlwcml2YXRlIE1hcCBmVGFibGVPZlByb3ZpZGVyczsKLQotCXByaXZhdGUgTWFwIGZFeHRlbmRlZFByb3ZpZGVyczsKLQotCXByb3RlY3RlZCBmaW5hbCBMaW5lU3R5bGVQcm92aWRlciBOT09QX1BST1ZJREVSID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyRm9yTm9PcCgpOwotCi0JcHJpdmF0ZSBkb3VibGUgcmVhZE9ubHlCYWNrZ3JvdW5kU2NhbGVGYWN0b3IgPSAxMDsKLQlwcml2YXRlIEhhc2h0YWJsZSByZWFkT25seUNvbG9yVGFibGU7Ci0JZG91YmxlIHJlYWRPbmx5Rm9yZWdyb3VuZFNjYWxlRmFjdG9yID0gMzA7Ci0KLQlwcml2YXRlIFlVVl9SR0JDb252ZXJ0ZXIgcmdiQ29udmVydGVyOwotCXByaXZhdGUgSVRleHRWaWV3ZXIgdGV4dFZpZXdlcjsKLQlwcml2YXRlIFN0eWxlZFRleHQgdGV4dFdpZGdldDsKLQotCXB1YmxpYyBIaWdobGlnaHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JCS8vIGluIHRoZSAnbGltaXRTaXplJyBtZXRob2QsIHdlIG1ha2UgdGhpcyBzdHJvbmcgYXNzdW1wdGlvbiwgc28sIHdpbGwgY2hlY2sgaGVyZSwgCi0JCS8vIHNvIGlmIHR3ZWFrZWQgaW4gZnV0dXJlLCB3ZSdsbCBnZXQgYSBxdWljayByZW1pbmRlci4gCi0JCWlmIChMRUZUX1NUWUxFU19TSVpFICsgTUlERExFX1NUWUxFU19TSVpFICsgUklHSFRfU1RZTEVTX1NJWkUgPiBNQVhfTlVNQkVSX1NUWUxFUykgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSGlnaGxpZ2hlciBjb25zdGFudHMgYXJlIG5vdCBkZWZpbmVkIGNvcnJlY3RseSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eVJhbmdlKGludCBzdGFydCwgaW50IGxlbmd0aCwgQ29sbGVjdGlvbiBob2xkUmVzdWx0cykgewotCQlTdHlsZVJhbmdlIHJlc3VsdCA9IG5ldyBTdHlsZVJhbmdlKCk7Ci0JCXJlc3VsdC5zdGFydCA9IHN0YXJ0OwotCQlyZXN1bHQubGVuZ3RoID0gbGVuZ3RoOwotCQlob2xkUmVzdWx0cy5hZGQocmVzdWx0KTsKLQl9Ci0KLQkvKioKLQkgKiBSZWdpc3RlcnMgYSBnaXZlbiBsaW5lIHN0eWxlIHByb3ZpZGVyIGZvciBhIHBhcnRpY3VsYXIgcGFydGl0aW9uIHR5cGUuCi0JICogSWYgdGhlcmUgaXMgYWxyZWFkeSBhIGxpbmUgc3R5bGUgcHJvdmlkZXIgcmVnaXN0ZXJlZCBmb3IgdGhpcyB0eXBlLCB0aGUKLQkgKiBuZXcgbGluZSBzdHlsZSBwcm92aWRlciBpcyByZWdpc3RlcmVkIGluc3RlYWQgb2YgdGhlIG9sZCBvbmUuCi0JICogCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBwYXJ0aXRpb24gdHlwZSB1bmRlciB3aGljaCB0byByZWdpc3RlcgotCSAqIEBwYXJhbSB0aGUKLQkgKiAgICAgICAgICAgIGxpbmUgc3R5bGUgcHJvdmlkZXIgdG8gcmVnaXN0ZXIsIG9yIDxjb2RlPm51bGw8L2NvZGU+IHRvCi0JICogICAgICAgICAgICByZW1vdmUgYW4gZXhpc3Rpbmcgb25lCi0JICovCi0JcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoU3RyaW5nIHBhcnRpdGlvblR5cGUsIExpbmVTdHlsZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0JCWdldFRhYmxlT2ZQcm92aWRlcnMoKS5wdXQocGFydGl0aW9uVHlwZSwgcHJvdmlkZXIpOwotCX0KLQotCS8qKgotCSAqIEFkanVzdCB0aGUgc3R5bGUgcmFuZ2VzJyBzdGFydCBhbmQgbGVuZ3RoIHNvIHRoYXQgdGhleSByZWZlciB0byB0aGUKLQkgKiB0ZXh0dmlld2VyIHdpZGdldCdzIHJhbmdlIGluc3RlYWQgb2YgdGhlIHRleHR2aWV3ZXIncyBkb2N1bWVudCByYW5nZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmFuZ2VzCi0JICogQHBhcmFtIGFkanVzdG1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGp1c3QoU3R5bGVSYW5nZVtdIHJhbmdlcywgaW50IGFkanVzdG1lbnQpIHsKLQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCi0JCWlmIChhZGp1c3RtZW50ICE9IDApIHsKLQkJCS8vIGp1c3QgdXNlIHRoZSBhZGp1c3RtZW50IHZhbHVlCi0JCQkvLyBjb252ZXJ0IGRvY3VtZW50IHJlZ2lvbnMgYmFjayB0byB3aWRnZXQgcmVnaW9ucwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkvLyBqdXN0IGFkanVzdCB0aGUgcmFuZ2UgdXNpbmcgdGhlIGdpdmVuIGFkanVzdG1lbnQKLQkJCQlyYW5nZXNbaV0uc3RhcnQgKz0gYWRqdXN0bWVudDsKLQkJCX0KLQkJfQotCQllbHNlIGlmICh2aWV3ZXIgaW5zdGFuY2VvZiBJVGV4dFZpZXdlckV4dGVuc2lvbjUpIHsKLQkJCS8vIHVzZSBJVGV4dFZpZXdlckV4dGVuc2lvbjUKLQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0KLQkJCS8vIGNvbnZlcnQgZG9jdW1lbnQgcmVnaW9ucyBiYWNrIHRvIHdpZGdldCByZWdpb25zCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewotCQkJCS8vIGdldCBkb2N1bWVudCByYW5nZSwgdGFraW5nIGludG8gYWNjb3VudCBmb2xkaW5nCi0JCQkJLy8gcmVnaW9ucyBpbiB2aWV3ZXIKLQkJCQlJUmVnaW9uIHJlZ2lvbiA9IGV4dGVuc2lvbi5tb2RlbFJhbmdlMldpZGdldFJhbmdlKG5ldyBSZWdpb24ocmFuZ2VzW2ldLnN0YXJ0LCByYW5nZXNbaV0ubGVuZ3RoKSk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCXJhbmdlc1tpXS5zdGFydCA9IHJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQkJcmFuZ2VzW2ldLmxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQl9IC8vIGVsc2Ugd2hhdCBoYXBwZW5zIGlmIHJlZ2lvbiBpcyBub3QgZm91bmQ/IQotCQkJfQotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCAtIFJlYWQgT25seSBhcmVhcyBoYXZlIHVuY2hhbmdlZCBiYWNrZ3JvdW5kIGNvbG9ycwotCSAqLwotCXZvaWQgYWRqdXN0QmFja2dyb3VuZChTdHlsZVJhbmdlIHN0eWxlUmFuZ2UpIHsKLQkJUkdCIG9sZFJHQiA9IG51bGw7Ci0JCUNvbG9yIG9sZENvbG9yID0gc3R5bGVSYW5nZS5iYWNrZ3JvdW5kOwotCQlpZiAob2xkQ29sb3IgPT0gbnVsbCkgewotCQkJb2xkQ29sb3IgPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0QmFja2dyb3VuZCgpOwotCQl9Ci0JCW9sZFJHQiA9IG9sZENvbG9yLmdldFJHQigpOwotCQlDb2xvciBuZXdDb2xvciA9IGdldENhY2hlZENvbG9yRm9yKG9sZFJHQik7Ci0JCWlmIChuZXdDb2xvciA9PSBudWxsKSB7Ci0JCQlkb3VibGUgdGFyZ2V0ID0gZ2V0UkdCQ29udmVydGVyKCkuY2FsY3VsYXRlWUNvbXBvbmVudChvbGRDb2xvcik7Ci0JCQkvLyBpZiBiYWNrZ3JvdW5kIGlzICJsaWdodCIgbWFrZSBpdCBkYXJrZXIsIGFuZCB2aWNlIHZlcnNhCi0JCQlpZiAodGFyZ2V0IDwgMC41KQotCQkJCXRhcmdldCA9IDEuMDsKLQkJCWVsc2UKLQkJCQl0YXJnZXQgPSAwLjA7Ci0JCQlSR0IgbmV3UkdCID0gZ2V0UkdCQ29udmVydGVyKCkudHJhbnNmb3JtUkdCKG9sZFJHQiwgcmVhZE9ubHlCYWNrZ3JvdW5kU2NhbGVGYWN0b3IgLyAxMDAuMCwgdGFyZ2V0KTsKLQotCQkJY2FjaGVDb2xvcihvbGRSR0IsIG5ld1JHQik7Ci0JCQluZXdDb2xvciA9IGdldENhY2hlZENvbG9yRm9yKG9sZFJHQik7Ci0JCX0KLQkJc3R5bGVSYW5nZS5iYWNrZ3JvdW5kID0gbmV3Q29sb3I7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGFkanVzdEZvcmVncm91bmQoU3R5bGVSYW5nZSBzdHlsZVJhbmdlKSB7Ci0JCVJHQiBvbGRSR0IgPSBudWxsOwotCQkvLyBDb2xvciBvbGRDb2xvciA9IHN0eWxlUmFuZ2UuZm9yZWdyb3VuZDsKLQkJQ29sb3Igb2xkQ29sb3IgPSBzdHlsZVJhbmdlLmJhY2tncm91bmQ7Ci0JCWlmIChvbGRDb2xvciA9PSBudWxsKSB7Ci0JCQkvLyBvbGRSR0IgPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0Rm9yZWdyb3VuZCgpLmdldFJHQigpOwotCQkJb2xkQ29sb3IgPSBnZXRUZXh0V2lkZ2V0KCkuZ2V0QmFja2dyb3VuZCgpOwotCQkJb2xkUkdCID0gb2xkQ29sb3IuZ2V0UkdCKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvbGRSR0IgPSBvbGRDb2xvci5nZXRSR0IoKTsKLQkJfQotCQlDb2xvciBuZXdDb2xvciA9IGdldENhY2hlZENvbG9yRm9yKG9sZFJHQik7Ci0JCWlmIChuZXdDb2xvciA9PSBudWxsKSB7Ci0JCQkvLyBtYWtlIHRleHQgImNsb3NlciB0byIgYmFja2dyb3VuZCBsdW1hbmVuY2UKLQkJCWRvdWJsZSB0YXJnZXQgPSBnZXRSR0JDb252ZXJ0ZXIoKS5jYWxjdWxhdGVZQ29tcG9uZW50KG9sZENvbG9yKTsKLQkJCVJHQiBuZXdSR0IgPSBnZXRSR0JDb252ZXJ0ZXIoKS50cmFuc2Zvcm1SR0JUb0dyZXkob2xkUkdCLCByZWFkT25seUZvcmVncm91bmRTY2FsZUZhY3RvciAvIDEwMC4wLCB0YXJnZXQpOwotCi0JCQkvLyBzYXZlIGNvbnZlcnNpb24sIHNvIGNhbGN1bGF0aW9ucyBvbmx5IG5lZWQgdG8gYmUgZG9uZSBvbmNlCi0JCQljYWNoZUNvbG9yKG9sZFJHQiwgbmV3UkdCKTsKLQkJCW5ld0NvbG9yID0gZ2V0Q2FjaGVkQ29sb3JGb3Iob2xkUkdCKTsKLQkJfQotCQlzdHlsZVJhbmdlLmZvcmVncm91bmQgPSBuZXdDb2xvcjsKLQl9Ci0KLQkvKioKLQkgKiBDYWNoZSByZWFkLW9ubHkgY29sb3IuCi0JICogCi0JICogQHBhcmFtIG9sZFJHQgotCSAqIEBwYXJhbSBuZXdDb2xvcgotCSAqLwotCXByaXZhdGUgdm9pZCBjYWNoZUNvbG9yKFJHQiBvbGRSR0IsIFJHQiBuZXdDb2xvcikgewotCQlpZiAocmVhZE9ubHlDb2xvclRhYmxlID09IG51bGwpIHsKLQkJCXJlYWRPbmx5Q29sb3JUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJfQotCQlyZWFkT25seUNvbG9yVGFibGUucHV0KG9sZFJHQiwgbmV3Q29sb3IpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZXN1bHQKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHlsZVJhbmdlW10gY29udmVydFJlYWRPbmx5UmVnaW9ucyhTdHlsZVJhbmdlW10gcmVzdWx0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCi0JCS8qKgotCQkgKiAoZG13KSBGb3IgY2xpZW50L3Byb3ZpZGVyIHNpbXBsaWNpdHkgKGFuZCBjb25zaXN0ZW50IGxvb2sgYW5kIGZlZWwpCi0JCSAqIHdlJ2xsIGhhbmRsZSByZWFkb25seSByZWdpb25zIGluIG9uZSBzcG90LCBoZXJlIGluIHRoZSBIaWdobGlnaHRlci4KLQkJICogQ3VycmVudGx5IGl0IGlzIGEgZmFpciBhc3N1bXB0aW9uIHRoYXQgZWFjaCByZWFkb25seSByZWdpb24gd2lsbCBiZQotCQkgKiBvbiBhbiBJVGV4dFJlZ2lvbiBib3VuZGFyeSwgc28gd2UgY29tYmluZSBjb25zZWN1dGl2ZSBzdHlsZXMgd2hlbgotCQkgKiBmb3VuZCB0byBiZSBlcXVpdmFsZW50LiBQbHVzLCBmb3Igbm93LCB3ZSdsbCBqdXN0IGFkanVzdAotCQkgKiBmb3JlZ3JvdW5kLiBFdmVudHVhbGx5IHdpbGwgdXNlIGEgImRpbW1pbmciIGFsZ3Jvcml0aG0gdG8gYWRqdXN0Ci0JCSAqIGNvbG9yJ3Mgc2F0dWF0aW9uL2JyaWdodG5lc3MuCi0JCSAqLwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50LmNvbnRhaW5zUmVhZE9ubHkoc3RhcnQsIGxlbmd0aCkpIHsKLQkJCS8vIHNvbWV0aGluZyBpcyByZWFkLW9ubHkgaW4gdGhlIGxpbmUsIHNvIGdvIHRocm91Z2ggZWFjaCBzdHlsZSwKLQkJCS8vIGFuZCBhZGp1c3QKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3R5bGVSYW5nZSBzdHlsZVJhbmdlID0gcmVzdWx0W2ldOwotCQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQuY29udGFpbnNSZWFkT25seShzdHlsZVJhbmdlLnN0YXJ0LCBzdHlsZVJhbmdlLmxlbmd0aCkpIHsKLQkJCQkJYWRqdXN0Rm9yZWdyb3VuZChzdHlsZVJhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBDbGVhciBvdXQgdGhlIHJlYWRPbmx5Q29sb3JUYWJsZQotCSAqLwotCXZvaWQgZGlzcG9zZUNvbG9yVGFibGUoKSB7Ci0JCWlmIChyZWFkT25seUNvbG9yVGFibGUgIT0gbnVsbCkgewotCQkJcmVhZE9ubHlDb2xvclRhYmxlLmNsZWFyKCk7Ci0JCX0KLQkJcmVhZE9ubHlDb2xvclRhYmxlID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIGdldCBleGlzdGluZyByZWFkLW9ubHkgY29sb3JzLgotCSAqLwotCXByaXZhdGUgQ29sb3IgZ2V0Q2FjaGVkQ29sb3JGb3IoUkdCIG9sZFJHQikgewotCQlDb2xvciByZXN1bHQgPSBudWxsOwotCi0JCWlmIChyZWFkT25seUNvbG9yVGFibGUgIT0gbnVsbCkgewotCQkJUkdCIHJlYWRPbmx5UkdCID0gKFJHQikgcmVhZE9ubHlDb2xvclRhYmxlLmdldChvbGRSR0IpOwotCQkJcmVzdWx0ID0gRWRpdG9yVXRpbGl0eS5nZXRDb2xvcihyZWFkT25seVJHQik7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZlN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKiBBZGp1c3QgdGhlIGdpdmVuIHdpZGdldCBvZmZzZXQgYW5kIGxlbmd0aCBzbyB0aGF0IHRoZXkgYXJlIHRoZQotCSAqIHRleHR2aWV3ZXIgZG9jdW1lbnQncyBvZmZzZXQgYW5kIGxlbmd0aCwgdGFraW5nIGludG8gYWNjb3VudCB3aGF0IGlzCi0JICogYWN0dWFsbHkgdmlzaWJsZSBpbiB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiBAcmV0dXJuIGEgcmVnaW9uIGNvbnRhaW5pbmcgdGhlIG9mZnNldCBhbmQgbGVuZ3RoIHdpdGhpbiB0aGUKLQkgKiAgICAgICAgIHRleHR2aWV3ZXIncyBkb2N1bWVudCBvciBudWxsIGlmIHRoZSBvZmZzZXQgaXMgbm90IHdpdGhpbiB0aGUKLQkgKiAgICAgICAgIGRvY3VtZW50Ci0JICovCi0JcHJpdmF0ZSBJUmVnaW9uIGdldERvY3VtZW50UmFuZ2VGcm9tV2lkZ2V0UmFuZ2UoaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQlJUmVnaW9uIHN0eWxlUmVnaW9uID0gbnVsbDsKLQkJSVRleHRWaWV3ZXIgdmlld2VyID0gZ2V0VGV4dFZpZXdlcigpOwotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSB7Ci0JCQkvLyBnZXQgZG9jdW1lbnQgcmFuZ2UsIHRha2luZyBpbnRvIGFjY291bnQgZm9sZGluZyByZWdpb25zIGluCi0JCQkvLyB2aWV3ZXIKLQkJCUlUZXh0Vmlld2VyRXh0ZW5zaW9uNSBleHRlbnNpb24gPSAoSVRleHRWaWV3ZXJFeHRlbnNpb241KSB2aWV3ZXI7Ci0JCQlzdHlsZVJlZ2lvbiA9IGV4dGVuc2lvbi53aWRnZXRSYW5nZTJNb2RlbFJhbmdlKG5ldyBSZWdpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGdldCBkb2N1bWVudCByYW5nZSwgdGFraW5nIGludG8gYWNjb3VudCB2aWV3ZXIgdmlzaWJsZSByZWdpb24KLQkJCS8vIGdldCB2aXNpYmxlIHJlZ2lvbiBpbiB2aWV3ZXIKLQkJCUlSZWdpb24gdnIgPSBudWxsOwotCQkJaWYgKHZpZXdlciAhPSBudWxsKQotCQkJCXZyID0gdmlld2VyLmdldFZpc2libGVSZWdpb24oKTsKLQkJCWVsc2UKLQkJCQl2ciA9IG5ldyBSZWdpb24oMCwgZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSk7Ci0KLQkJCS8vIGlmIG9mZnNldCBpcyBub3Qgd2l0aGluIHZpc2libGUgcmVnaW9uLCB0aGVuIHdlIGRvbid0IHJlYWxseQotCQkJLy8gY2FyZQotCQkJaWYgKG9mZnNldCA8PSB2ci5nZXRMZW5ndGgoKSkgewotCQkJCS8vIEFkanVzdCB0aGUgb2Zmc2V0IHRvIGJlIHdpdGhpbiB2aXNpYmxlIHJlZ2lvbgotCQkJCXN0eWxlUmVnaW9uID0gbmV3IFJlZ2lvbihvZmZzZXQgKyB2ci5nZXRPZmZzZXQoKSwgbGVuZ3RoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gc3R5bGVSZWdpb247Ci0JfQotCi0KLQlwcml2YXRlIE1hcCBnZXRFeHRlbmRlZFByb3ZpZGVycygpIHsKLQkJaWYgKGZFeHRlbmRlZFByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQlmRXh0ZW5kZWRQcm92aWRlcnMgPSBuZXcgSGFzaE1hcCgzKTsKLQkJfQotCQlyZXR1cm4gZkV4dGVuZGVkUHJvdmlkZXJzOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRQcm92aWRlckZvci4KLQkgKiAKLQkgKiBAcGFyYW0gdHlwZWRSZWdpb24KLQkgKiBAcmV0dXJuIExpbmVTdHlsZVByb3ZpZGVyCi0JICovCi0JcHJpdmF0ZSBMaW5lU3R5bGVQcm92aWRlciBnZXRQcm92aWRlckZvcihJVHlwZWRSZWdpb24gdHlwZWRSZWdpb24pIHsKLQkJU3RyaW5nIHR5cGUgPSB0eXBlZFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCUxpbmVTdHlsZVByb3ZpZGVyIHJlc3VsdCA9IChMaW5lU3R5bGVQcm92aWRlcikgZlRhYmxlT2ZQcm92aWRlcnMuZ2V0KHR5cGUpOwotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCS8vIE5PVCBZRVQgRklOQUxJWkVEIC0gRE8gTk9UIENPTlNJREVSIEFTIEFQSQotCQkJc3luY2hyb25pemVkIChnZXRFeHRlbmRlZFByb3ZpZGVycygpKSB7Ci0JCQkJaWYgKCFnZXRFeHRlbmRlZFByb3ZpZGVycygpLmNvbnRhaW5zS2V5KHR5cGUpKSB7Ci0JCQkJCUxpbmVTdHlsZVByb3ZpZGVyIHByb3ZpZGVyID0gKExpbmVTdHlsZVByb3ZpZGVyKSBFeHRlbmRlZENvbmZpZ3VyYXRpb25CdWlsZGVyLmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbihMSU5FX1NUWUxFX1BST1ZJREVSX0VYVEVOREVEX0lELCB0eXBlKTsKLQkJCQkJZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5wdXQodHlwZSwgcHJvdmlkZXIpOwotCQkJCQlpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCQkJcHJvdmlkZXIuaW5pdChnZXREb2N1bWVudCgpLCB0aGlzKTsKLQkJCQkJfQotCQkJCQlyZXN1bHQgPSBwcm92aWRlcjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IChMaW5lU3R5bGVQcm92aWRlcikgZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5nZXQodHlwZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJcmVzdWx0ID0gTk9PUF9QUk9WSURFUjsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgWVVWX1JHQkNvbnZlcnRlciBnZXRSR0JDb252ZXJ0ZXIoKSB7Ci0JCWlmIChyZ2JDb252ZXJ0ZXIgPT0gbnVsbCkgewotCQkJcmdiQ29udmVydGVyID0gbmV3IFlVVl9SR0JDb252ZXJ0ZXIoKTsKLQkJfQotCQlyZXR1cm4gcmdiQ29udmVydGVyOwotCX0KLQotCXByaXZhdGUgTWFwIGdldFRhYmxlT2ZQcm92aWRlcnMoKSB7Ci0JCWlmIChmVGFibGVPZlByb3ZpZGVycyA9PSBudWxsKSB7Ci0JCQlmVGFibGVPZlByb3ZpZGVycyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0KLQkJcmV0dXJuIGZUYWJsZU9mUHJvdmlkZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHRWaWV3ZXIuCi0JICogCi0JICogQHJldHVybiBJVGV4dFZpZXdlcgotCSAqLwotCXB1YmxpYyBJVGV4dFZpZXdlciBnZXRUZXh0Vmlld2VyKCkgewotCQlyZXR1cm4gdGV4dFZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0eWxlZFRleHQgZ2V0VGV4dFdpZGdldCgpIHsKLQkJcmV0dXJuIHRleHRXaWRnZXQ7Ci0JfQotCi0JLyoqCi0JICogSW5zdGFsbHMgaGlnaGxpZ2h0ZXIgc3VwcG9ydCBvbiB0aGUgZ2l2ZW4gdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHZpZXdlciBvbiB3aGljaCBjb250ZW50IGFzc2lzdCB3aWxsIHdvcmsKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnN0YWxsKElUZXh0Vmlld2VyIG5ld1RleHRWaWV3ZXIpIHsKLQkJdGhpcy50ZXh0Vmlld2VyID0gbmV3VGV4dFZpZXdlcjsKLQotCQlJUHJlZmVyZW5jZVN0b3JlIGVkaXRvclN0b3JlID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQllZGl0b3JTdG9yZS5hZGRQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKGZGb3JlZ3JvdW5kU2NhbGVMaXN0ZW5lcik7Ci0JCXJlYWRPbmx5Rm9yZWdyb3VuZFNjYWxlRmFjdG9yID0gZWRpdG9yU3RvcmUuZ2V0SW50KEVkaXRvclByZWZlcmVuY2VOYW1lcy5SRUFEX09OTFlfRk9SRUdST1VORF9TQ0FMRSk7Ci0KLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCkgewotCQkJdGV4dFdpZGdldC5yZW1vdmVMaW5lU3R5bGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCQl0ZXh0V2lkZ2V0ID0gbmV3VGV4dFZpZXdlci5nZXRUZXh0V2lkZ2V0KCk7Ci0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwpIHsKLQkJCXRleHRXaWRnZXQuYWRkTGluZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlyZWZyZXNoRGlzcGxheSgpOwotCX0KLQotCXB1YmxpYyBTdHlsZVJhbmdlW10gbGluZUdldFN0eWxlKGludCBldmVudExpbmVPZmZzZXQsIGludCBldmVudExpbmVMZW5ndGgpIHsKLQkJU3R5bGVSYW5nZVtdIGV2ZW50U3R5bGVzID0gRU1QVFlfU1RZTEVfUkFOR0U7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RG9jdW1lbnQoKSA9PSBudWxsIHx8IGV2ZW50TGluZUxlbmd0aCA9PSAwKSB7Ci0JCQkJLy8gZ2V0RG9jdW1lbnQoKSA9PSBudWxsCi0JCQkJLy8gZHVyaW5nIGluaXRpYWxpemF0aW9uLCB0aGlzIGlzIHNvbWV0aW1lcyBjYWxsZWQgYmVmb3JlIG91cgotCQkJCS8vIHN0cnVjdHVyZWQKLQkJCQkvLyBpcyBzZXQsIGluIHdoaWNoIGNhc2Ugd2Ugc2V0IHN0eWxlcyB0byBiZSB0aGUgZW1wdHkgc3R5bGUKLQkJCQkvLyByYW5nZQotCQkJCS8vIChldmVudC5zdHlsZXMgY2FuIG5vdCBiZSBudWxsKQotCi0JCQkJLy8gZXZlbnRMaW5lTGVuZ3RoID09IDAKLQkJCQkvLyB3ZSBzb21ldGltZXMgZ2V0IG9kZCByZXF1ZXN0cyBmcm9tIHRoZSB2ZXJ5IGxhc3QgQ1JMRiBpbgotCQkJCS8vIHRoZQotCQkJCS8vIGRvY3VtZW50Ci0JCQkJLy8gaXQgaGFzIG5vIGxlbmd0aCwgYW5kIHRoZXJlIGlzIG5vIG5vZGUgZm9yIGl0IQotCQkJCWV2ZW50U3R5bGVzID0gRU1QVFlfU1RZTEVfUkFOR0U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvKgotCQkJCSAqIExpbmVTdHlsZVByb3ZpZGVycyB3b3JrIHVzaW5nIGFic29sdXRlIGRvY3VtZW50IG9mZnNldHMuIFRvCi0JCQkJICogc3VwcG9ydCB2aXNpYmxlIHJlZ2lvbnMsIGFkanVzdCB0aGUgcmVxdWVzdGVkIHJhbmdlIHVwIHRvCi0JCQkJICogdGhlIGZ1bGwgZG9jdW1lbnQgb2Zmc2V0cy4KLQkJCQkgKi8KLQkJCQlJUmVnaW9uIHN0eWxlUmVnaW9uID0gZ2V0RG9jdW1lbnRSYW5nZUZyb21XaWRnZXRSYW5nZShldmVudExpbmVPZmZzZXQsIGV2ZW50TGluZUxlbmd0aCk7Ci0JCQkJaWYgKHN0eWxlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0ID0gc3R5bGVSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCQkJCWludCBsZW5ndGggPSBzdHlsZVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQotCQkJCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGdldERvY3VtZW50KCksIGZQYXJ0aXRpb25pbmcsIHN0YXJ0LCBsZW5ndGgsIGZhbHNlKTsKLQkJCQkJZXZlbnRTdHlsZXMgPSBwcmVwYXJlU3R5bGVSYW5nZXNBcnJheShwYXJ0aXRpb25zLCBzdGFydCwgbGVuZ3RoKTsKLQotCQkJCQkvKgotCQkJCQkgKiBJZiB0aGVyZSBpcyBhIHN1YnRleHQgb2Zmc2V0LCB0aGUgc3R5bGUgcmFuZ2VzIG11c3QgYmUKLQkJCQkJICogYWRqdXN0ZWQgdG8gdGhlIGV4cGVjdGVkIG9mZnNldHMganVzdCBjaGVjayBpZgotCQkJCQkgKiBldmVudExpbmVPZmZzZXQgaXMgZGlmZmVyZW50IHRoYW4gc3RhcnQgdGhlbiBhZGp1c3QsCi0JCQkJCSAqIG90aGVyd2lzZSB1IGNhbiBsZWF2ZSBpdCBhbG9uZSB1bmxlc3MgdGhlcmUgaXMgc3BlY2lhbAotCQkJCQkgKiBoYW5kbGluZyBmb3IgaXRleHR2aWV3ZXJleHRlbnNpb241PwotCQkJCQkgKi8KLQkJCQkJaWYgKHN0YXJ0ICE9IGV2ZW50TGluZU9mZnNldCkgewotCQkJCQkJaW50IG9mZnNldCA9IDA7Ci0JCQkJCQkvLyBmaWd1cmUgb3V0IHZpc2libGUgcmVnaW9uIHRvIHVzZSBmb3IgYWRqdXN0bWVudAotCQkJCQkJLy8gb25seSBhZGp1c3QgaWYgbmVlZCB0bwotCQkJCQkJaWYgKCEoZ2V0VGV4dFZpZXdlcigpIGluc3RhbmNlb2YgSVRleHRWaWV3ZXJFeHRlbnNpb241KSkgewotCQkJCQkJCUlSZWdpb24gdnIgPSBnZXRUZXh0Vmlld2VyKCkuZ2V0VmlzaWJsZVJlZ2lvbigpOwotCQkJCQkJCWlmICh2ciAhPSBudWxsKSB7Ci0JCQkJCQkJCW9mZnNldCA9IHZyLmdldE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWFkanVzdChldmVudFN0eWxlcywgLW9mZnNldCk7Ci0JCQkJCX0KLQotCQkJCQlldmVudFN0eWxlcyA9IGxpbWl0U2l6ZShldmVudFN0eWxlcyk7Ci0JCQkJCQotCQkJCQkvLyBmb3IgZGVidWdnaW5nIG9ubHkKLQkJCQkJaWYgKERFQlVHKSB7Ci0JCQkJCQlpZiAoIXZhbGlkKGV2ZW50U3R5bGVzLCBldmVudExpbmVPZmZzZXQsIGV2ZW50TGluZUxlbmd0aCkpIHsKLQkJCQkJCQlMb2dnZXIubG9nKExvZ2dlci5XQVJOSU5HLCAiSGlnaGxpZ2h0ZXI6OmxpbmVHZXRTdHlsZSBmb3VuZCBpbnZhbGlkIHN0eWxlcyBhdCBvZmZzZXQgIiArIGV2ZW50TGluZU9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJfQotCi0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBpZiBBTlkgZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgaGlnaGxpZ2h0aW5nLAotCQkJLy8ganVzdCByZXR1cm4gIm5vIGhpZ2hsaWdodGluZyIKLQkJCWV2ZW50U3R5bGVzID0gRU1QVFlfU1RZTEVfUkFOR0U7Ci0JCQlpZiAoRGVidWcuc3ludGF4SGlnaGxpZ2h0aW5nKSB7Ci0JCQkJU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gZHVyaW5nIGhpZ2hsaWdodGluZyEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGV2ZW50U3R5bGVzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIHRvIGNlbnRyYWxpemUgdGhlIGxvZ2ljIGluIGxpbWl0aW5nIHRoZSBvdmVyYWxsIG51bWJlciBvZiBzdHlsZSByYW5nZXMKLQkgKiB0aGF0IG1ha2UgaXQgdG8gdGhlIHN0eWxlZCB0ZXh0IHdpZGdldC4gCi0JICogCi0JICogVG9vIG1hbnkgc3R5bGVzIHNlbnQgdG8gU3R5bGVkVGV4dCByZXN1bHRzIGluIGFwcGFyZW50LCBidXQgbm90IHJlYWwsIAotCSAqIGhhbmdzIG9mIEVjbGlwc2UgRGlzcGxheSB0aHJlYWQuIFNlZSAgCi0JICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwODgwNgotCSAqIAotCSAqIEBwYXJhbSBldmVudFN0eWxlcwotCSAqIEByZXR1cm4KLQkgKi8KLQkgcHJpdmF0ZSBTdHlsZVJhbmdlW10gbGltaXRTaXplKFN0eWxlUmFuZ2VbXSBldmVudFN0eWxlcykgewotCQkKLQkJLy8gcXVpY2sgcmV0dXJuIHdpdGggc2FtZSBvYmplY3QgaWYgbm90IG1vZGlmaWNhdGlvbiBuZWVkZWQKLQkJaWYgKGV2ZW50U3R5bGVzLmxlbmd0aCA8IE1BWF9OVU1CRVJfU1RZTEVTKSB7Ci0JCQlyZXR1cm4gZXZlbnRTdHlsZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB3ZSBjb3VsZCBqdXN0IHRha2UgdGhlIGVhc3kgd2F5IG91dCBhbmQgdHJ1bmNhdGUsIGJ1dCB3aWxsIAotCQkJLy8gYmUgbXVjaCBiZXR0ZXIgYXBwZWFyaW5nIGlmIGJvdGggdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGFuZCB0aGUgCi0JCQkvLyBlbmQgb2YgdGhlIGxpbmUgYXJlIGRpc3BsYXllZCB3aXRoIHN0eWxlcy4gU2luY2UgdGhlc2UgYXJlIGJvdGgKLQkJCS8vIHRoZSBwYXJ0cyBvZiB0aGUgbGluZSBhIHVzZXIgaXMgbGlrZWx5IHRvIGxvb2sgYXQuIFRoZSBtaWRkbGUgb2YgdGhlIAotCQkJLy8gbGluZSB3aWxsIHN0aWxsIGJlICJwbGFpbiIuIFByZXN1bWFibHksIHRoZSB1c2VyIHdvdWxkIHJlLWZvcm1hdCB0aGUgCi0JCQkvLyBmaWxlIHRvIGF2b2lkIGxvbmcgbGluZXMsIHNvIHVubGlrZWx5IHRvIHNlZSB0aGUgbWlkZGxlLiAKLQkJCVN0eWxlUmFuZ2VbXSBuZXdSYW5nZXMgPSBuZXcgU3R5bGVSYW5nZVtMRUZUX1NUWUxFU19TSVpFICsgUklHSFRfU1RZTEVTX1NJWkUgKyBNSURETEVfU1RZTEVTX1NJWkVdOyAKLQkJCVN5c3RlbS5hcnJheWNvcHkoZXZlbnRTdHlsZXMsIDAsIG5ld1JhbmdlcywgMCwgTEVGVF9TVFlMRVNfU0laRSk7Ci0JCQkvLwotCQkJLy8gZG8gZW5kLCBiZWZvcmUgd2UgZG8gbWlkZGxlCi0JCQlTeXN0ZW0uYXJyYXljb3B5KGV2ZW50U3R5bGVzLCBldmVudFN0eWxlcy5sZW5ndGgtUklHSFRfU1RZTEVTX1NJWkUsIG5ld1JhbmdlcywgTEVGVF9TVFlMRVNfU0laRSArIE1JRERMRV9TVFlMRVNfU0laRSwgUklHSFRfU1RZTEVTX1NJWkUpOwotCQkJLy8KLQkJCS8vIHRlY2huaWNhbGx5LCB3ZSBzaG91bGQgY29tcHV0ZSB0aGUgZXhhY3QgbWlkZGxlIGFzIG9uZSBiaWcgc3R5bGUgcmFuZ2UsIAotCQkJLy8gd2l0aCBkZWZhdWx0IGNvbG9ycyBhbmQgc3R5bGVzLCBzbyBpZiBzb21lb25lIGRvZXMgYWN0dWFsbHkgdHlwZSBvciB3b3JrIHdpdGggCi0JCQkvLyBkb2N1bW5ldCBhcyBpcywgd2lsbCBzdGlsbCBiZSBjb3JyZWN0LiAKLQkJCS8vCi0JCQlTdHlsZVJhbmdlIGFsbEJsYW5rID0gbmV3IFN0eWxlUmFuZ2UoKTsKLQkJCVN0eWxlUmFuZ2UgbGFzdEtub3duID0gbmV3UmFuZ2VzW0xFRlRfU1RZTEVTX1NJWkUgLSAxXTsKLQkJCWFsbEJsYW5rLnN0YXJ0ID0gbGFzdEtub3duLnN0YXJ0ICsgbGFzdEtub3duLmxlbmd0aDsKLQkJCVN0eWxlUmFuZ2UgbmV4dEtub3duID0gbmV3UmFuZ2VzW0xFRlRfU1RZTEVTX1NJWkUgKyBNSURETEVfU1RZTEVTX1NJWkUgKyAxXTsKLQkJCWFsbEJsYW5rLmxlbmd0aCA9IG5leHRLbm93bi5zdGFydCAtIGFsbEJsYW5rLnN0YXJ0OwotCQkJbmV3UmFuZ2VzW0xFRlRfU1RZTEVTX1NJWkVdID0gYWxsQmxhbms7Ci0JCQlyZXR1cm4gbmV3UmFuZ2VzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQSBwYXNzdGhyb3VnaCBtZXRob2QgdGhhdCBleHRyYWN0cyByZWxldmFudCBkYXRhIGZyb20gdGhlCi0JICogTGluZVN0eWxlRXZlbnQgYW5kIHBhc3NlcyBpdCBhbG9uZy4gVGhpcyBtZXRob2Qgd2FzIHNlcGFyYXRlZCBmb3IKLQkgKiBwZXJmb3JtYW5jZSB0ZXN0aW5nIHB1cnBvc2VzLgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5MaW5lU3R5bGVMaXN0ZW5lciNsaW5lR2V0U3R5bGUoTGluZVN0eWxlRXZlbnQpCi0JICovCi0JcHVibGljIHZvaWQgbGluZUdldFN0eWxlKExpbmVTdHlsZUV2ZW50IGV2ZW50KSB7Ci0JCWludCBvZmZzZXQgPSBldmVudC5saW5lT2Zmc2V0OwotCQlpbnQgbGVuZ3RoID0gZXZlbnQubGluZVRleHQubGVuZ3RoKCk7Ci0KLQkJLyoKLQkJICogRm9yIHNvbWUgcmVhc29uLCB3ZSBhcmUgc29tZXRpbWVzIGFza2VkIGZvciB0aGUgc2FtZSBzdHlsZSByYW5nZQotCQkgKiBvdmVyIGFuZCBvdmVyIGFnYWluLiBUaGlzIHdhcyBmb3VuZCB0byBoYXBwZW4gZHVyaW5nICdyZXZlcnQnIG9mIGEKLQkJICogZmlsZSB3aXRoIG9uZSBsaW5lIGluIGl0IHRoYXQgaXMgNDBLIGxvbmchIFNvLCB3aGlsZSB3ZSBkb24ndCBrbm93Ci0JCSAqIHJvb3QgY2F1c2UsIGNhY2hpbmcgdGhlIHN0eWxlZCByYW5nZXMgaW4gY2FzZSB0aGUgZXhhY3Qgc2FtZQotCQkgKiByZXF1ZXN0IGlzIG1hZGUgbXVsdGlwbGUgdGltZXMgc2VlbXMgbGlrZSBjaGVhcCBpbnN1cmFuY2UuCi0JCSAqLwotCQlpZiAob2Zmc2V0ID09IGZTYXZlZE9mZnNldCAmJiBsZW5ndGggPT0gZlNhdmVkTGVuZ3RoICYmIGZTYXZlZFJhbmdlcyAhPSBudWxsKSB7Ci0JCQlldmVudC5zdHlsZXMgPSBmU2F2ZWRSYW5nZXM7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBuZWVkIHRvIGFzc2lnbiB0aGlzIGFycmF5IGhlcmUsIG9yIGVsc2UgdGhlIGZpZWxkIHdvbid0IGdldAotCQkJLy8gdXBkYXRlZAotCQkJZXZlbnQuc3R5bGVzID0gbGluZUdldFN0eWxlKG9mZnNldCwgbGVuZ3RoKTsKLQkJCS8vIG5vdyBzYXZlZCAiY2FjaGVkIGRhdGEiIGZvciByZXBlYXRlZCByZXF1ZXN0cyB3aGljaCBhcmUgZXhhY2x0eQotCQkJLy8gc2FtZQotCQkJZlNhdmVkT2Zmc2V0ID0gb2Zmc2V0OwotCQkJZlNhdmVkTGVuZ3RoID0gbGVuZ3RoOwotCQkJZlNhdmVkUmFuZ2VzID0gZXZlbnQuc3R5bGVzOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTm90ZTogaXRzIHZlcnkgaW1wb3J0YW50IHRoaXMgbWV0aG9kIG5ldmVyIHJldHVybiBudWxsLCB3aGljaCBpcyB3aHkKLQkgKiB0aGUgZmluYWwgbnVsbCBjaGVjayBpcyBpbiBhIGZpbmFsbHkgY2xhdXNlCi0JICovCi0KLQlwcm90ZWN0ZWQgU3R5bGVSYW5nZVtdIHByZXBhcmVTdHlsZVJhbmdlc0FycmF5KElUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMsIGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCi0JCVN0eWxlUmFuZ2VbXSByZXN1bHQgPSBFTVBUWV9TVFlMRV9SQU5HRTsKLQotCQlpZiAoZkhvbGRTdHlsZVJlc3VsdHMgPT0gbnVsbCkgewotCQkJZkhvbGRTdHlsZVJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0KHBhcnRpdGlvbnMubGVuZ3RoKTsKLQkJfQotCQllbHNlIHsKLQkJCWZIb2xkU3R5bGVSZXN1bHRzLmNsZWFyKCk7Ci0JCX0KLQotCQkvLyBUT0RPOiBtYWtlIHNvbWUgb2YgdGhlc2UgaW5zdGFuY2UgdmFyaWFibGVzIHRvIHByZXZlbnQgY3JlYXRpb24gb24KLQkJLy8gc3RhY2sKLQkJTGluZVN0eWxlUHJvdmlkZXIgY3VycmVudExpbmVTdHlsZVByb3ZpZGVyID0gbnVsbDsKLQkJYm9vbGVhbiBoYW5kbGVkID0gZmFsc2U7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJSVR5cGVkUmVnaW9uIGN1cnJlbnRQYXJ0aXRpb24gPSBwYXJ0aXRpb25zW2ldOwotCQkJY3VycmVudExpbmVTdHlsZVByb3ZpZGVyID0gZ2V0UHJvdmlkZXJGb3IoY3VycmVudFBhcnRpdGlvbik7Ci0JCQljdXJyZW50TGluZVN0eWxlUHJvdmlkZXIuaW5pdChnZXREb2N1bWVudCgpLCB0aGlzKTsKLQkJCWhhbmRsZWQgPSBjdXJyZW50TGluZVN0eWxlUHJvdmlkZXIucHJlcGFyZVJlZ2lvbnMoY3VycmVudFBhcnRpdGlvbiwgY3VycmVudFBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgY3VycmVudFBhcnRpdGlvbi5nZXRMZW5ndGgoKSwgZkhvbGRTdHlsZVJlc3VsdHMpOwotCQkJaWYgKERlYnVnLnN5bnRheEhpZ2hsaWdodGluZyAmJiAhaGFuZGxlZCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRGlkIG5vdCBoYW5kbGUgaGlnaGxpZ2h0aW5nIGluIEhpZ2hsaWdodGVyIGlubmVyIHdoaWxlIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCWludCByZXN1bHRTaXplID0gZkhvbGRTdHlsZVJlc3VsdHMuc2l6ZSgpOwotCQlpZiAocmVzdWx0U2l6ZSA+IDApIHsKLQkJCXJlc3VsdCA9IChTdHlsZVJhbmdlW10pIGZIb2xkU3R5bGVSZXN1bHRzLnRvQXJyYXkobmV3IFN0eWxlUmFuZ2VbZkhvbGRTdHlsZVJlc3VsdHMuc2l6ZSgpXSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBFTVBUWV9TVFlMRV9SQU5HRTsKLQkJfQotCQlyZXN1bHQgPSBjb252ZXJ0UmVhZE9ubHlSZWdpb25zKHJlc3VsdCwgc3RhcnQsIGxlbmd0aCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaERpc3BsYXkoKSB7Ci0JCWlmICh0ZXh0V2lkZ2V0ICE9IG51bGwgJiYgIXRleHRXaWRnZXQuaXNEaXNwb3NlZCgpKQotCQkJdGV4dFdpZGdldC5yZWRyYXcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWZyZXNoRGlzcGxheShpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpCi0JCQl0ZXh0V2lkZ2V0LnJlZHJhd1JhbmdlKHN0YXJ0LCBsZW5ndGgsIHRydWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWdldFRhYmxlT2ZQcm92aWRlcnMoKS5yZW1vdmUocGFydGl0aW9uVHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWREb2N1bWVudDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudFBhcnRpdGlvbmluZyhTdHJpbmcgcGFydGl0aW9uaW5nKSB7Ci0JCWlmIChwYXJ0aXRpb25pbmcgIT0gbnVsbCkgewotCQkJZlBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQkJfQotCQllbHNlIHsKLQkJCWZQYXJ0aXRpb25pbmcgPSBJRG9jdW1lbnRFeHRlbnNpb24zLkRFRkFVTFRfUEFSVElUSU9OSU5HOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVW5pbnN0YWxscyBoaWdobGlnaHRlciBzdXBwb3J0IGZyb20gdGhlIHRleHQgdmlld2VyIGl0IGhhcyBwcmV2aW91c2x5Ci0JICogYmUgaW5zdGFsbGVkIG9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKHRleHRXaWRnZXQgIT0gbnVsbCAmJiAhdGV4dFdpZGdldC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCXRleHRXaWRnZXQucmVtb3ZlTGluZVN0eWxlTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQkJdGV4dFdpZGdldCA9IG51bGw7Ci0KLQkJQ29sbGVjdGlvbiBwcm92aWRlcnMgPSBnZXRUYWJsZU9mUHJvdmlkZXJzKCkudmFsdWVzKCk7Ci0JCUl0ZXJhdG9yIGl0ZXJhdG9yID0gcHJvdmlkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUxpbmVTdHlsZVByb3ZpZGVyIGxpbmVTdHlsZVByb3ZpZGVyID0gKExpbmVTdHlsZVByb3ZpZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlsaW5lU3R5bGVQcm92aWRlci5yZWxlYXNlKCk7Ci0JCQkvLyB0aGlzIHJlbW92ZSBwcm9iYWJseSBpc24ndCBzdHJpY3RseSBuZWVkZWQsIHNpbmNlCi0JCQkvLyB0eXBpY2FsbHkgaGlnaGxpZ2h0ZXIgaW5zdGFuY2UgYXMgYSB3aG9sZSB3aWxsIGdvCi0JCQkvLyBhd2F5IC4uLiBidXQgaW4gY2FzZSB0aGF0IGV2ZXIgY2hhbmdlcywgdGhpcyBzZWVtcyBsaWtlCi0JCQkvLyBhIGJldHRlciBzdHlsZS4KLQkJCWl0ZXJhdG9yLnJlbW92ZSgpOwotCQl9Ci0KLQkJc3luY2hyb25pemVkIChnZXRFeHRlbmRlZFByb3ZpZGVycygpKSB7Ci0JCQlwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0KGdldEV4dGVuZGVkUHJvdmlkZXJzKCkudmFsdWVzKCkpOwotCQkJZ2V0RXh0ZW5kZWRQcm92aWRlcnMoKS5jbGVhcigpOwotCQl9Ci0JCWl0ZXJhdG9yID0gcHJvdmlkZXJzLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCUxpbmVTdHlsZVByb3ZpZGVyIGxpbmVTdHlsZVByb3ZpZGVyID0gKExpbmVTdHlsZVByb3ZpZGVyKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQlpZiAobGluZVN0eWxlUHJvdmlkZXIgIT0gbnVsbCkgewotCQkJCWxpbmVTdHlsZVByb3ZpZGVyLnJlbGVhc2UoKTsKLQkJCQlpdGVyYXRvci5yZW1vdmUoKTsKLQkJCX0KLQkJfQotCi0JCUlQcmVmZXJlbmNlU3RvcmUgZWRpdG9yU3RvcmUgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCWVkaXRvclN0b3JlLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZkZvcmVncm91bmRTY2FsZUxpc3RlbmVyKTsKLQkJZGlzcG9zZUNvbG9yVGFibGUoKTsKLQotCQkvLyBjbGVhciBvdXQgY2FjaGVkIHZhcmlhYmxlcyAoZDI4Mjg5NCkKLQkJZlNhdmVkT2Zmc2V0ID0gLTE7Ci0JCWZTYXZlZExlbmd0aCA9IC0xOwotCQlmU2F2ZWRSYW5nZXMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFB1cmVseSBhIGRlYnVnZ2luZyBhaWRlLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiB2YWxpZChTdHlsZVJhbmdlW10gZXZlbnRTdHlsZXMsIGludCBzdGFydE9mZnNldCwgaW50IGxpbmVMZW5ndGgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGV2ZW50U3R5bGVzICE9IG51bGwpIHsKLQkJCWlmIChldmVudFN0eWxlcy5sZW5ndGggPiAwKSB7Ci0JCQkJU3R5bGVSYW5nZSBmaXJzdCA9IGV2ZW50U3R5bGVzWzBdOwotCQkJCVN0eWxlUmFuZ2UgbGFzdCA9IGV2ZW50U3R5bGVzW2V2ZW50U3R5bGVzLmxlbmd0aCAtIDFdOwotCQkJCWlmIChzdGFydE9mZnNldCA+IGZpcnN0LnN0YXJ0KSB7Ci0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW50IGxpbmVFbmRPZmZzZXQgPSBzdGFydE9mZnNldCArIGxpbmVMZW5ndGg7Ci0JCQkJCWludCBsYXN0T2Zmc2V0ID0gbGFzdC5zdGFydCArIGxhc3QubGVuZ3RoOwotCQkJCQlpZiAobGFzdE9mZnNldCA+IGxpbmVFbmRPZmZzZXQpIHsKLQkJCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGEgemVybyBsZW5ndGggYXJyYXkgaXMgb2sKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0lIaWdobGlnaHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0lIaWdobGlnaHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTJmZjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9JSGlnaGxpZ2h0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkxpbmVTdHlsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogQGF1dGhvciBkYXZpZHcKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIaWdobGlnaHRlciBleHRlbmRzIExpbmVTdHlsZUxpc3RlbmVyIHsKLQl2b2lkIGFkZFByb3ZpZGVyKFN0cmluZyBwYXJ0aXRpb25UeXBlLCBMaW5lU3R5bGVQcm92aWRlciBwcm92aWRlcik7Ci0KLQl2b2lkIGluc3RhbGwoSVRleHRWaWV3ZXIgdmlld2VyKTsKLQotCXZvaWQgcmVtb3ZlUHJvdmlkZXIoU3RyaW5nIHBhcnRpdGlvblR5cGUpOwotCi0Jdm9pZCBzZXREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCi0Jdm9pZCB1bmluc3RhbGwoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMGNmNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL3N0eWxlL0xpbmVTdHlsZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgTGluZVN0eWxlUHJvdmlkZXIgewotCi0JLyoqCi0JICogSW5pdGlhbGl6ZXMgdGhpcyBwcm92aWRlciBmb3IgdGhlIGdpdmVuIEhpZ2hsaWdodGVyIGFuZCBkb2N1bWVudC4gVGhpcwotCSAqIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIGJlZm9yZSBwcmVwYXJlUmVnaW9ucyBpcyBjYWxsZWQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIGhpZ2hsaWdodGVyCi0JICovCi0Jdm9pZCBpbml0KElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIEhpZ2hsaWdodGVyIGhpZ2hsaWdodGVyKTsKLQotCS8qKgotCSAqIE9wdGlvbmFsbHkgYXBwZW5kcyBTdHlsZVJhbmdlcyB0byB0aGUgc3R5bGVSYW5nZXMgQ29sbGVjdGlvbiwgaW4gb3JkZXIsCi0JICogYW5kIG9ubHkgY292ZXJpbmcgdGhlIGdpdmVuIHJhbmdlIHdpdGhpbiB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGN1cnJlbnRSZWdpb24gLQotCSAqICAgICAgICAgICAgdGhlIGN1cnJlbnQgZG9jdW1lbnQgcGFydGl0aW9uCi0JICogQHBhcmFtIHN0YXJ0Ci0JICogQHBhcmFtIGxlbmd0aAotCSAqIEBwYXJhbSBzdHlsZVJhbmdlcwotCSAqIEByZXR1cm4gd2hldGhlciB0aGlzIExpbmVTdHlsZVByb3ZpZGVyIGhhbmRsZWQgdGhlIHJlcXVlc3Q7IGhhbmRsaW5nCi0JICogICAgICAgICBpbmNsdWRlcyBub3QgYWRkaW5nIFN0eWxlUmFuZ2VzIGlmIHRoYXQgaXMgc3RpbGwgdGhlIGNvcnJlY3QKLQkgKiAgICAgICAgIGJlaGF2aW9yCi0JICovCi0JYm9vbGVhbiBwcmVwYXJlUmVnaW9ucyhJVHlwZWRSZWdpb24gY3VycmVudFJlZ2lvbiwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoLCBDb2xsZWN0aW9uIHN0eWxlUmFuZ2VzKTsKLQotCS8qKgotCSAqIEluc3RydWN0cyB0aGlzIHByb3ZpZGVyIHRvIGZyZWUgdXAgYW55ICJyZXNvdXJjZXMiIGl0IG1pZ2h0IGJlIGhvbGRpbmcKLQkgKiBvbiB0byAoc3VjaCBhcyBsaXN0ZW5pbmcgZm9yIHByZWZlcmVuY2UgY2hhbmdlcykuIEl0IGlzIG9ubHkgY2FsbGVkCi0JICogb25jZSBpbiB0aGUgbGlmZXRpbWUgb2YgdGhpcyBwcm92aWRlci4KLQkgKi8KLQl2b2lkIHJlbGVhc2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvck5vT3AuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvck5vT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjljNTFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JOb09wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGU7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgYnkgZGVmYXVsdCwgaWYgbm8gYXR0cmlidXRlIHByb3ZpZGVyIGlzIGZvdW5kIGZvciBhCi0gKiBjZXJ0YWluIHJlZ2lvbiB0eXBlLiBJdHMgcHJvYmFibHkgYW4gZXJyb3IgaW4gYSBmYWN0b3J5IHNvbWV3aGVyZSBpZiBhbgotICogYWRhcHRlciBpcyBub3QgZm91bmQsIGJ1dCB0aGlzIGNsYXNzIGFsbG93cyB0aGUgbG9naWMgdG8gcHJvY2VlZCBiYXNpY2FsbHkKLSAqIHNpbXBseSBwcm92aWRpbmcgZGVmYXVsdCBjb2xvcmVkIHN5bnRheCBoaWdobGlnaHRpbmcuCi0gKiAKLSAqIE5vdCB0byBiZSBzdWJjbGFzc2VkLgotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgTGluZVN0eWxlUHJvdmlkZXJGb3JOb09wIGltcGxlbWVudHMgTGluZVN0eWxlUHJvdmlkZXIgewotCi0JcHVibGljIHZvaWQgaW5pdChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBIaWdobGlnaHRlciBoaWdobGlnaHRlcikgewotCQkvLyBub3RoaW5nIHRvIGRvCi0JfQotCQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5zdHlsZS5BYnN0cmFjdExpbmVTdHlsZVByb3ZpZGVyI3ByZXBhcmVSZWdpb25zKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uLAotCSAqICAgICAgaW50LCBpbnQsIGphdmEudXRpbC5Db2xsZWN0aW9uKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHByZXBhcmVSZWdpb25zKElUeXBlZFJlZ2lvbiBjdXJyZW50UmVnaW9uLCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIENvbGxlY3Rpb24gaG9sZFJlc3VsdHMpIHsKLQkJLy8gYWRkIG5vdGhpbmcsIGJ1dCBzYXkgaGFuZGxlZC4KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FlMDRmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0Fic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklBbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVJlbGVhc2FibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uOwotCi0KLS8qKgotICogQSBiYXNlIFJlY29uY2lsaW5nU3RyYXRlZ3kuIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQKLSAqIGNyZWF0ZVJlY29uY2lsZVN0ZXBzKCkuIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBrbm93IGFib3V0Ci0gKiBJU3RydWN0dXJlZERvY3VtZW50LCBvbmx5IElEb2N1bWVudC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IGltcGxlbWVudHMgSVJlY29uY2lsaW5nU3RyYXRlZ3ksIElSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uLCBJUmVsZWFzYWJsZSB7Ci0KLQkvKiogZGVidWcgZmxhZyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8vIHRoZXNlIGxpbWl0cyBhcmUgc2FmZXR5cyBmb3IgInJ1bmF3YXkiIHZhbGlkYXRpb24gY2FzZXMKLQkvLyBzaG91bGQgYmUgdXNlZCB0byBzYWZlZ3VhcmQgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGxvb3BzIG9yIHBvdGVudGlhbGx5Ci0JLy8gbG9uZyBhbm5vdGF0aW9ucwotCS8vIChzaW5jZSB0aGUgcGFpbnRlciBzZWVtcyB0byBhZmZlY3QgcGVyZm9ybWFuY2Ugd2hlbiBwYWludGluZyBsb25nCi0JLy8gYW5ub3RhdGlvbnMpCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5OT1RBVElPTl9MRU5HVEhfTElNSVQgPSAyNTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTEVNRU5UX0VSUk9SX0xJTUlUID0gMjU7Ci0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCS8vIHByaXZhdGUgSVJlY29uY2lsZVN0ZXAgZkZpcnN0U3RlcCA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvZ3Jlc3NNb25pdG9yIGZQcm9ncmVzc01vbml0b3IgPSBudWxsOwotCXByaXZhdGUgSVNvdXJjZVZpZXdlciBmU291cmNlVmlld2VyID0gbnVsbDsKLS8vCXByaXZhdGUgQ29tcGFyYXRvciBmQ29tcGFyYXRvcjsKLQotCS8vIGxpc3Qgb2YgInZhbGlkYXRvciIgYW5ub3RhdGlvbnMKLQkvLyBmb3IgZ3JheS91bi1ncmF5IGNhcGFiaWxpdHkKLQlwcml2YXRlIEhhc2hTZXQgZk1hcmtlckFubm90YXRpb25zID0gbnVsbDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgc3RyYXRlZ3kuIFRoZSBlZGl0b3IgcGFyYW1ldGVyIGlzIGZvciBhY2Nlc3MgdG8gdGhlCi0JICogYW5ub3RhdGlvbiBtb2RlbC4KLQkgKiAKLQkgKiBAcGFyYW0gZWRpdG9yCi0JICovCi0JcHVibGljIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCWZTb3VyY2VWaWV3ZXIgPSBzb3VyY2VWaWV3ZXI7Ci0JCWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHdoZXJlIHdlIGFkZCByZXN1bHRzIHRvIHRoZSBhbm5vdGF0aW9uTW9kZWwsIGRvaW5nIGFueSBzcGVjaWFsCi0JICogImV4dHJhIiBwcm9jZXNzaW5nLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFJlc3VsdFRvQW5ub3RhdGlvbk1vZGVsKElSZWNvbmNpbGVSZXN1bHQgcmVzdWx0KSB7Ci0JCWlmICghKHJlc3VsdCBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJcmV0dXJuOwotCQkvLyBjYW4gYmUgbnVsbCB3aGVuIGNsb3NpbmcgdGhlIGVkaXRvcgotCQlpZiAoZ2V0QW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wQW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSByZXN1bHQ7Ci0KLQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKHRlbXBBbm5vdGF0aW9uKTsKLQkJCWlmIChzbWEgIT0gbnVsbCkgewotCQkJCS8vIHVuLWdyYXkgb3V0IHRoZSBtYXJrZXIgYW5ub3RhdGlvbgotCQkJCXNtYS5zZXRHcmF5ZWQoZmFsc2UpOwotCQkJfQotCi0JCQlnZXRBbm5vdGF0aW9uTW9kZWwoKS5hZGRBbm5vdGF0aW9uKHRlbXBBbm5vdGF0aW9uLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBvYmplY3QKLQkgKiBAcmV0dXJuIGlmIHRoaXMgc3RyYXRlZ3kgaXMgcmVzcG9uaXNibGUgZm9yIGFkZGluZyB0aGlzIHR5cGUgb2Yga2V5Ci0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuSGFuZGxlUGFydGl0aW9uKFN0cmluZyBwYXJ0aXRpb24pIHsKLQkJLy8gU3RyaW5nW10gaGF5c3RhY2sgPSBnZXRQYXJ0aXRpb25UeXBlcygpOwotCQkvLyBmb3IgKGludCBpID0gMDsgaSA8IGhheXN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIGlmIChoYXlzdGFja1tpXS5lcXVhbHMocGFydGl0aW9uKSkKLQkJLy8gcmV0dXJuIHRydWU7Ci0JCS8vIH0KLQkJLy8gcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLy8gLyoqCi0JLy8gKiBAcGFyYW0gc3RlcAotCS8vICogQHJldHVybgotCS8vICovCi0JLy8gcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApIHsKLQkvLyBpZiAoZkZpcnN0U3RlcCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKQotCS8vIHJldHVybiAoKFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKSBmRmlyc3RTdGVwKS5pc1NpYmxpbmdTdGVwKHN0ZXApOwotCS8vIHJldHVybiBmYWxzZTsKLQkvLyB9Ci0KLQkvKioKLQkgKiBUaGlzIGlzIHdoZXJlIHlvdSBzaG91bGQgY3JlYXRlIHRoZSBzdGVwcyBmb3IgdGhpcyBzdHJhdGVneQotCSAqLwotCWFic3RyYWN0IHB1YmxpYyB2b2lkIGNyZWF0ZVJlY29uY2lsZVN0ZXBzKCk7Ci0KLQkvKioKLQkgKiBSZW1vdmUgQUxMIHRlbXBvcmFyeSBhbm5vdGF0aW9ucyB0aGF0IHRoaXMgc3RyYXRlZ3kgY2FuIGhhbmRsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGdldEFsbEFubm90YXRpb25zVG9SZW1vdmUoKSB7Ci0JCUxpc3QgcmVtb3ZhbHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCWlmIChhbm5vdGF0aW9uTW9kZWwgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaSA9IGFubm90YXRpb25Nb2RlbC5nZXRBbm5vdGF0aW9uSXRlcmF0b3IoKTsKLQkJCXdoaWxlIChpLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBvYmogPSBpLm5leHQoKTsKLQkJCQlpZiAoIShvYmogaW5zdGFuY2VvZiBJVGVtcG9yYXJ5QW5ub3RhdGlvbikpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJSVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChJVGVtcG9yYXJ5QW5ub3RhdGlvbikgb2JqOwotCQkJCVJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gKFJlY29uY2lsZUFubm90YXRpb25LZXkpIGFubm90YXRpb24uZ2V0S2V5KCk7Ci0JCQkJLy8gdGhlbiBpZiB0aGlzIHN0cmF0ZWd5IGtub3dzIGhvdyB0byBhZGQvcmVtb3ZlIHRoaXMKLQkJCQkvLyBwYXJ0aXRpb24gdHlwZQotCQkJCWlmIChjYW5IYW5kbGVQYXJ0aXRpb24oa2V5LmdldFBhcnRpdGlvblR5cGUoKSkgLyoKLQkJCQkJCQkJCQkJCQkJCQkgKiAmJgotCQkJCQkJCQkJCQkJCQkJCSAqIGNvbnRhaW5zU3RlcChrZXkuZ2V0U3RlcCgpKQotCQkJCQkJCQkJCQkJCQkJCSAqLykKLQkJCQkJcmVtb3ZhbHMuYWRkKGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiAoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSByZW1vdmFscy50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3JlbW92YWxzLnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJQW5ub3RhdGlvbk1vZGVsIGdldEFubm90YXRpb25Nb2RlbCgpIHsKLQkJSUFubm90YXRpb25Nb2RlbCBtb2RlbCA9IG51bGw7Ci0JCWlmIChmU291cmNlVmlld2VyICE9IG51bGwpIHsKLQkJCW1vZGVsID0gZlNvdXJjZVZpZXdlci5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gbW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIFRlbXBvcmFyeUFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9uc1RvUmVtb3ZlKERpcnR5UmVnaW9uIGRyLCBMaXN0IHN0ZXBzUnVuKSB7Ci0KLQkJTGlzdCByZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCS8vIGNhbiBiZSBudWxsIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yCi0JCWlmIChnZXRBbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0KLQkJCS8vIGNsZWFyIHZhbGlkYXRvciBhbm5vdGF0aW9ucwotCQkJZ2V0TWFya2VyQW5ub3RhdGlvbnMoKS5jbGVhcigpOwotCi0JCQlJdGVyYXRvciBpID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0KLQkJCQlPYmplY3Qgb2JqID0gaS5uZXh0KCk7Ci0KLQkJCQkvLyBjaGVjayBpZiBpdCdzIGEgdmFsaWRhdG9yIG1hcmtlciBhbm5vdGF0aW9uCi0JCQkJLy8gaWYgaXQgaXMgc2F2ZSBpdCBmb3IgY29tcGFyaXNpb24gbGF0ZXIgKHRvICJncmF5IiBpY29ucykKLQkJCQlpZiAob2JqIGluc3RhbmNlb2YgU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24pIHsKLQkJCQkJU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gc21hID0gKFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uKSBvYmo7Ci0KLQkJCQkJaWYgKHNtYS5nZXRBbm5vdGF0aW9uVHlwZSgpID09IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1IgfHwgc21hLmdldEFubm90YXRpb25UeXBlKCkgPT0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HKQotCQkJCQkJZk1hcmtlckFubm90YXRpb25zLmFkZChzbWEpOwotCQkJCX0KLQotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJCQljb250aW51ZTsKLQotCQkJCVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBvYmo7Ci0JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSAoUmVjb25jaWxlQW5ub3RhdGlvbktleSkgYW5ub3RhdGlvbi5nZXRLZXkoKTsKLQotCQkJCS8vIHRoZW4gaWYgdGhpcyBzdHJhdGVneSBrbm93cyBob3cgdG8gYWRkL3JlbW92ZSB0aGlzCi0JCQkJLy8gcGFydGl0aW9uIHR5cGUKLQkJCQlpZiAoY2FuSGFuZGxlUGFydGl0aW9uKGtleS5nZXRQYXJ0aXRpb25UeXBlKCkpICYmIHN0ZXBzUnVuLmNvbnRhaW5zKGtleS5nZXRTdGVwKCkpKSB7Ci0JCQkJCWlmIChrZXkuZ2V0U2NvcGUoKSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwgJiYgYW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLm92ZXJsYXBzV2l0aChkci5nZXRPZmZzZXQoKSwgZHIuZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCQlyZW1vdmUuYWRkKGFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGtleS5nZXRTY29wZSgpID09IFJlY29uY2lsZUFubm90YXRpb25LZXkuVE9UQUwpIHsKLQkJCQkJCXJlbW92ZS5hZGQoYW5ub3RhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChUZW1wb3JhcnlBbm5vdGF0aW9uW10pIHJlbW92ZS50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3JlbW92ZS5zaXplKCldKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zU3RlcChJUmVjb25jaWxlU3RlcCBzdGVwKTsKLQotCS8qKgotCSAqIEdldHMgcGFydGl0aW9uIHR5cGVzIGZyb20gYWxsIHN0ZXBzIGluIHRoaXMgc3RyYXRlZ3kuCi0JICogCi0JICogQHJldHVybiBwYXJpdGlvbiB0eXBlcyBmcm9tIGFsbCBzdGVwcwotCSAqLwotCS8vIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkvLyBpZiAoZkZpcnN0U3RlcCBpbnN0YW5jZW9mIFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKQotCS8vIHJldHVybiAoKFN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwKSBmRmlyc3RTdGVwKS5nZXRQYXJ0aXRpb25UeXBlcygpOwotCS8vIHJldHVybiBuZXcgU3RyaW5nWzBdOwotCS8vIH0KLQlwdWJsaWMgdm9pZCBpbml0KCkgewotCQljcmVhdGVSZWNvbmNpbGVTdGVwcygpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5RXh0ZW5zaW9uI2luaXRpYWxSZWNvbmNpbGUoKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxSZWNvbmNpbGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDYW5jZWxlZCgpIHsKLQkJaWYgKERFQlVHICYmIChmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwgJiYgZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCIqKiBTVFJBVEVHWSBDQU5DRUxFRCAqKjoiICsgdGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3IgIT0gbnVsbCAmJiBmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBQcm9jZXNzIHRoZSByZXN1bHRzIGZyb20gdGhlIHJlY29uY2lsZSBzdGVwcyBpbiB0aGlzIHN0cmF0ZWd5LgotCSAqIAotCSAqIEBwYXJhbSByZXN1bHRzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHByb2Nlc3MoZmluYWwgSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMpIHsKLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBTVEFSVElORyBQUk9DRVNTIE1FVEhPRCB3aXRoICgiICsgcmVzdWx0cy5sZW5ndGggKyAiKSByZXN1bHRzIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWlmIChyZXN1bHRzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aCAmJiBpIDwgRUxFTUVOVF9FUlJPUl9MSU1JVCAmJiAhaXNDYW5jZWxlZCgpOyBpKyspIHsKLQotCQkJaWYgKGlzQ2FuY2VsZWQoKSkgewotCQkJCWlmIChERUJVRykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPioqIFBST0NFU1MgKGFkZGluZykgV0FTIENBTkNFTExFRCAqKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuOwotCQkJfQotCQkJYWRkUmVzdWx0VG9Bbm5vdGF0aW9uTW9kZWwocmVzdWx0c1tpXSk7Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN0cmluZ0J1ZmZlciB0cmFjZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0cy5sZW5ndGg7IGorKykKLQkJCQl0cmFjZVN0cmluZy5hcHBlbmQoIlxuICgrKSA6IiArIHJlc3VsdHNbal0gKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBQUk9DRVNTSU5HICgiICsgcmVzdWx0cy5sZW5ndGggKyAiKSByZXN1bHRzIGluIEFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5ICIgKyB0cmFjZVN0cmluZyk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3kjcmVjb25jaWxlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCS8vIG5vdCB1c2VkCi0JCS8vIHdlIG9ubHkgaGF2ZSB2YWxpZGF0b3Igc3RyYXRlZ3kgbm93Ci0KLQkJLy8gLy8gZXh0ZXJuYWwgZmlsZXMgbWF5IGJlIG51bGwKLQkJLy8gaWYgKGlzQ2FuY2VsZWQoKSB8fCBmRmlyc3RTdGVwID09IG51bGwpCi0JCS8vIHJldHVybjsKLQkJLy8KLQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGFubm90YXRpb25zVG9SZW1vdmUgPSBuZXcKLQkJLy8gVGVtcG9yYXJ5QW5ub3RhdGlvblswXTsKLQkJLy8gSVJlY29uY2lsZVJlc3VsdFtdIGFubm90YXRpb25zVG9BZGQgPSBuZXcgSVJlY29uY2lsZVJlc3VsdFswXTsKLQkJLy8gU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAgc3RydWN0dXJlZFN0ZXAgPSAoU3RydWN0dXJlZFJlY29uY2lsZVN0ZXApCi0JCS8vIGZGaXJzdFN0ZXA7Ci0JCS8vICAgICAgICAKLQkJLy8gYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldEFubm90YXRpb25zVG9SZW1vdmUoZGlydHlSZWdpb24pOwotCQkvLyBhbm5vdGF0aW9uc1RvQWRkID0gc3RydWN0dXJlZFN0ZXAucmVjb25jaWxlKGRpcnR5UmVnaW9uLAotCQkvLyBzdWJSZWdpb24pOwotCQkvLyAgICAgICAgCi0JCS8vIHNtYXJ0UHJvY2Vzcyhhbm5vdGF0aW9uc1RvUmVtb3ZlLCBhbm5vdGF0aW9uc1RvQWRkKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcGFydGl0aW9uCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3kjcmVjb25jaWxlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoSVJlZ2lvbiBwYXJ0aXRpb24pIHsKLQkJLy8gbm90IHVzZWQsIHdlIHVzZToKLQkJLy8gcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikKLQl9Ci0KLQkvKioKLQkgKiBDYWxscyByZWxlYXNlKCkgb24gYWxsIHRoZSBzdGVwcyBpbiB0aGlzIHN0cmF0ZWd5LiBDdXJyZW50bHkgZG9uZSBpbgotCSAqIFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IuU291cmNlV2lkZ2V0RGlzcG9zZUxpc3RlbmVyI3dpZGdldERpc3Bvc2VkKC4uLikKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQkvLyByZWxlYXNlIHN0ZXBzIChlYWNoIHN0ZXAgY2FsbHMgcmVsZWFzZSBvbiB0aGUgbmV4dCkKLQkJLy8gaWYgKGZGaXJzdFN0ZXAgIT0gbnVsbCAmJiBmRmlyc3RTdGVwIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpCi0JCS8vICgoSVJlbGVhc2FibGUpIGZGaXJzdFN0ZXApLnJlbGVhc2UoKTsKLQkJLy8gd2UgZG9uJ3QgdG8gbnVsbCBvdXQgdGhlIHN0ZXBzLCBpbiBjYXNlCi0JCS8vIGl0J3MgcmVjb25maWd1cmVkIGxhdGVyCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFubm90YXRpb25zKFRlbXBvcmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9uc1RvUmVtb3ZlKSB7Ci0KLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJLy8gY2FuIGJlIG51bGwgd2hlbiBjbG9zaW5nIHRoZSBlZGl0b3IKLQkJaWYgKGFubm90YXRpb25Nb2RlbCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGFubm90YXRpb25zVG9SZW1vdmUubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0JCQkJCWlmIChERUJVRykKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4qKiBSRU1PVkFMIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKGFubm90YXRpb25zVG9SZW1vdmVbaV0pOwotCQkJCWlmIChzbWEgIT0gbnVsbCkgewotCQkJCQkvLyBncmF5IG91dCB0aGUgbWFya2VyIGFubm90YXRpb24KLQkJCQkJc21hLnNldEdyYXllZCh0cnVlKTsKLQkJCQl9Ci0JCQkJLy8gcmVtb3ZlIHRoZSB0ZW1wIG9uZQotCQkJCWFubm90YXRpb25Nb2RlbC5yZW1vdmVBbm5vdGF0aW9uKGFubm90YXRpb25zVG9SZW1vdmVbaV0pOwotCi0JCQl9Ci0JCX0KLQotCQlpZiAoREVCVUcpIHsKLQkJCVN0cmluZ0J1ZmZlciB0cmFjZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGkrKykKLQkJCQl0cmFjZVN0cmluZy5hcHBlbmQoIlxuICgtKSA6IiArIGFubm90YXRpb25zVG9SZW1vdmVbaV0gKyAiOlxuIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBSRU1PVkVEICgiICsgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGggKyAiKSBhbm5vdGF0aW9ucyBpbiBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSA6IiArIHRyYWNlU3RyaW5nKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKFRlbXBvcmFyeUFubm90YXRpb24gdGVtcEFubm90YXRpb24pIHsKLQotCQlJdGVyYXRvciBpdCA9IGdldE1hcmtlckFubm90YXRpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJU3RydWN0dXJlZE1hcmtlckFubm90YXRpb24gbWFya2VyQW5ub3RhdGlvbiA9IChTdHJ1Y3R1cmVkTWFya2VyQW5ub3RhdGlvbikgaXQubmV4dCgpOwotCQkJU3RyaW5nIG1lc3NhZ2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJdHJ5IHsKLQkJCQltZXNzYWdlID0gKFN0cmluZykgbWFya2VyQW5ub3RhdGlvbi5nZXRNYXJrZXIoKS5nZXRBdHRyaWJ1dGUoSU1hcmtlci5NRVNTQUdFKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCQkvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIGNoZWNrIGxpbmUgbnVtYmVyIGhlcmUuLi4KLQkJCWlmIChtZXNzYWdlICE9IG51bGwgJiYgbWVzc2FnZS5lcXVhbHModGVtcEFubm90YXRpb24uZ2V0VGV4dCgpKSkKLQkJCQlyZXR1cm4gbWFya2VyQW5ub3RhdGlvbjsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWxsQW5ub3RhdGlvbnMoKSB7Ci0JCXJlbW92ZUFubm90YXRpb25zKGdldEFsbEFubm90YXRpb25zVG9SZW1vdmUoKSk7Ci0JfQotCi0JLyoqCi0JICogU2V0IHRoZSBkb2N1bWVudCBmb3IgdGhpcyBzdHJhdGVneS4KLQkgKiAKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneSNzZXREb2N1bWVudChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQotCQkvLyByZW1vdmUgYWxsIG9sZCBhbm5vdGF0aW9ucyBzaW5jZSBpdCdzIGEgbmV3IGRvY3VtZW50Ci0JCXJlbW92ZUFsbEFubm90YXRpb25zKCk7Ci0KLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZWxlYXNlKCk7Ci0KLQkJLy8gaWYgKGdldEZpcnN0U3RlcCgpICE9IG51bGwpCi0JCS8vIGdldEZpcnN0U3RlcCgpLnNldElucHV0TW9kZWwobmV3IERvY3VtZW50QWRhcHRlcihkb2N1bWVudCkpOwotCi0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG1vbml0b3IKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneUV4dGVuc2lvbiNzZXRQcm9ncmVzc01vbml0b3Iob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJvZ3Jlc3NNb25pdG9yKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkvLyBmUHJvZ3Jlc3NNb25pdG9yID0gbW9uaXRvcjsKLQkJLy8gaWYgKGZGaXJzdFN0ZXAgIT0gbnVsbCkKLQkJLy8gZkZpcnN0U3RlcC5zZXRQcm9ncmVzc01vbml0b3IoZlByb2dyZXNzTW9uaXRvcik7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2sgaWYgdGhlIGFubm90YXRpb24gaXMgYWxyZWFkeSB0aGVyZSwgaWYgaXQgaXMsIG5vIG5lZWQgdG8gcmVtb3ZlCi0JICogb3IgYWRkIGFnYWluLiBUaGlzIHdpbGwgYXZvaWQgYSBsb3Qgb2YgImZsaWNrZXJpbmciIGJlaGF2aW9yLgotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uc1RvUmVtb3ZlCi0JICogQHBhcmFtIGFubm90YXRpb25zVG9BZGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzbWFydFByb2Nlc3MoVGVtcG9yYXJ5QW5ub3RhdGlvbltdIGFubm90YXRpb25zVG9SZW1vdmUsIElSZWNvbmNpbGVSZXN1bHRbXSBhbm5vdGF0aW9uc1RvQWRkKSB7Ci0vLwkJQ29tcGFyYXRvciBjb21wID0gZ2V0VGVtcG9yYXJ5QW5ub3RhdGlvbkNvbXBhcmF0b3IoKTsKLS8vCQlMaXN0IHNvcnRlZFJlbW92YWxzID0gQXJyYXlzLmFzTGlzdChhbm5vdGF0aW9uc1RvUmVtb3ZlKTsKLS8vCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZFJlbW92YWxzLCBjb21wKTsKLS8vCi0vLwkJTGlzdCBzb3J0ZWRBZGRpdGlvbnMgPSBBcnJheXMuYXNMaXN0KGFubm90YXRpb25zVG9BZGQpOwotLy8JCUNvbGxlY3Rpb25zLnNvcnQoc29ydGVkQWRkaXRpb25zLCBjb21wKTsKLS8vCi0vLwkJTGlzdCBmaWx0ZXJlZFJlbW92YWxzID0gbmV3IEFycmF5TGlzdChzb3J0ZWRSZW1vdmFscyk7Ci0vLwkJTGlzdCBmaWx0ZXJlZEFkZGl0aW9ucyA9IG5ldyBBcnJheUxpc3Qoc29ydGVkQWRkaXRpb25zKTsKLS8vCi0vLwkJYm9vbGVhbiBpZ25vcmUgPSBmYWxzZTsKLS8vCQlpbnQgbGFzdEZvdW5kQWRkZWQgPSAwOwotLy8JCWZvciAoaW50IGkgPSAwOyBpIDwgc29ydGVkUmVtb3ZhbHMuc2l6ZSgpOyBpKyspIHsKLS8vCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiByZW1vdmFsID0gKFRlbXBvcmFyeUFubm90YXRpb24pIHNvcnRlZFJlbW92YWxzLmdldChpKTsKLS8vCQkJZm9yIChpbnQgaiA9IGxhc3RGb3VuZEFkZGVkOyBqIDwgc29ydGVkQWRkaXRpb25zLnNpemUoKTsgaisrKSB7Ci0vLwkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIGFkZGl0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIHNvcnRlZEFkZGl0aW9ucy5nZXQoaik7Ci0vLwkJCQkvLyBxdWljayBwb3NpdGlvbiBjaGVjayBoZXJlCi0vLwkJCQlpZiAocmVtb3ZhbC5nZXRQb3NpdGlvbigpLmVxdWFscyhhZGRpdGlvbi5nZXRQb3NpdGlvbigpKSkgewotLy8JCQkJCWxhc3RGb3VuZEFkZGVkID0gajsKLS8vCQkJCQkvLyByZW1vdmUgcGVyZm9ybXMgVGVtcG9yYXJ5QW5ub3RhdGlvbi5lcXVhbHMoKQotLy8JCQkJCS8vIHdoaWNoIGNoZWNrcyB0ZXh0IGFzIHdlbGwKLS8vCQkJCQlmaWx0ZXJlZEFkZGl0aW9ucy5yZW1vdmUoYWRkaXRpb24pOwotLy8JCQkJCWlnbm9yZSA9IHRydWU7Ci0vLwkJCQkJaWYgKERFQlVHKQotLy8JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiB+IHNtYXJ0IHByb2Nlc3MgaWdub3Jpbmc6ICIgKyByZW1vdmFsLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkpOyAvLyROT04tTkxTLTEkCi0vLwkJCQkJYnJlYWs7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJaWYgKGlnbm9yZSkgewotLy8JCQkJZmlsdGVyZWRSZW1vdmFscy5yZW1vdmUocmVtb3ZhbCk7Ci0vLwkJCX0KLS8vCQkJaWdub3JlID0gZmFsc2U7Ci0vLwkJfQotCQlpZiAoZ2V0QW5ub3RhdGlvbk1vZGVsKCkgaW5zdGFuY2VvZiBJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uKSB7Ci0vLwkJCVRlbXBvcmFyeUFubm90YXRpb25bXSBmaWx0ZXJlZFJlbW92YWxBcnJheSA9IChUZW1wb3JhcnlBbm5vdGF0aW9uW10pIGZpbHRlcmVkUmVtb3ZhbHMudG9BcnJheShuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbltmaWx0ZXJlZFJlbW92YWxzLnNpemUoKV0pOwotLy8JCQkvLyBhcHBseSAiZ3JleSItbmVzcwotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkUmVtb3ZhbEFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0vLwkJCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0vLwkJCQkJaWYgKERFQlVHKQotLy8JCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+KiogcmVwbGFjaW5nIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotLy8JCQkJCXJldHVybjsKLS8vCQkJCX0KLS8vCQkJCVN0cnVjdHVyZWRNYXJrZXJBbm5vdGF0aW9uIHNtYSA9IGdldENvcnJlc3BvbmRpbmdNYXJrZXJBbm5vdGF0aW9uKGZpbHRlcmVkUmVtb3ZhbEFycmF5W2ldKTsKLS8vCQkJCWlmIChzbWEgIT0gbnVsbCkgewotLy8JCQkJCS8vIGdyYXkgb3V0IHRoZSBtYXJrZXIgYW5ub3RhdGlvbgotLy8JCQkJCXNtYS5zZXRHcmF5ZWQodHJ1ZSk7Ci0vLwkJCQl9Ci0vLwkJCX0KLS8vCQkJTWFwIGFubm90YXRpb25zVG9BZGRNYXAgPSBuZXcgSGFzaE1hcCgpOwotLy8JCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkQWRkaXRpb25zLnNpemUoKTsgaSsrKSB7Ci0vLwkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRlbXBvcmFyeUFubm90YXRpb24gPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZmlsdGVyZWRBZGRpdGlvbnMuZ2V0KGkpOwotLy8JCQkJYW5ub3RhdGlvbnNUb0FkZE1hcC5wdXQodGVtcG9yYXJ5QW5ub3RhdGlvbiwgdGVtcG9yYXJ5QW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpKTsKLS8vCQkJfQotLy8JCQlpZiAoaXNDYW5jZWxlZCgpKSB7Ci0vLwkJCQlpZiAoREVCVUcpCi0vLwkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPioqIFBST0NFU1MgKHJlcGxhY2luZykgV0FTIENBTkNFTExFRCAqKiIpOyAvLyROT04tTkxTLTEkCi0vLwkJCQlyZXR1cm47Ci0vLwkJCX0KLS8vCQkJLyoKLS8vCQkJICogVXNpbmcgdGhlIGV4dGVuc2lvbiBtZWFucyB3ZSBjYW4ndCBlbmZvcmNlIHRoZQotLy8JCQkgKiBFTEVNRU5UX0VSUk9SX0xJTUlUIGxpbWl0LgotLy8JCQkgKi8KLS8vCQkJKChJQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uKSBnZXRBbm5vdGF0aW9uTW9kZWwoKSkucmVwbGFjZUFubm90YXRpb25zKGZpbHRlcmVkUmVtb3ZhbEFycmF5LCBhbm5vdGF0aW9uc1RvQWRkTWFwKTsKLQotCQkJTWFwIGFubm90YXRpb25zVG9BZGRNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbm5vdGF0aW9uc1RvQWRkLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wb3JhcnlBbm5vdGF0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb25zVG9BZGRbaV07Ci0JCQkJYW5ub3RhdGlvbnNUb0FkZE1hcC5wdXQodGVtcG9yYXJ5QW5ub3RhdGlvbiwgdGVtcG9yYXJ5QW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpKTsKLQkJCX0KLQkJCWlmIChpc0NhbmNlbGVkKCkpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiW3RyYWNlIHJlY29uY2lsZXJdID4qKiBQUk9DRVNTIChyZXBsYWNpbmcpIFdBUyBDQU5DRUxMRUQgKioiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCSgoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgZ2V0QW5ub3RhdGlvbk1vZGVsKCkpLnJlcGxhY2VBbm5vdGF0aW9ucyhhbm5vdGF0aW9uc1RvUmVtb3ZlLCBhbm5vdGF0aW9uc1RvQWRkTWFwKTsKLQkJfQotCQllbHNlIHsKLS8vCQkJcmVtb3ZlQW5ub3RhdGlvbnMoKFRlbXBvcmFyeUFubm90YXRpb25bXSkgZmlsdGVyZWRSZW1vdmFscy50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW2ZpbHRlcmVkUmVtb3ZhbHMuc2l6ZSgpXSkpOwotLy8JCQlwcm9jZXNzKChJUmVjb25jaWxlUmVzdWx0W10pIGZpbHRlcmVkQWRkaXRpb25zLnRvQXJyYXkobmV3IElSZWNvbmNpbGVSZXN1bHRbZmlsdGVyZWRBZGRpdGlvbnMuc2l6ZSgpXSkpOwotCQkJcmVtb3ZlQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnNUb1JlbW92ZSk7Ci0JCQlwcm9jZXNzKGFubm90YXRpb25zVG9BZGQpOwotCQl9Ci0JfQotCi0vLwlwcml2YXRlIENvbXBhcmF0b3IgZ2V0VGVtcG9yYXJ5QW5ub3RhdGlvbkNvbXBhcmF0b3IoKSB7Ci0vLwkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpIHsKLS8vCQkJZkNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLS8vCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYXJnMCwgT2JqZWN0IGFyZzEpIHsKLS8vCQkJCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRhMSA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhcmcwOwotLy8JCQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGEyID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFyZzE7Ci0vLwkJCQkJaW50IHJlc3VsdCA9IHRhMS5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpIC0gdGEyLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCk7Ci0vLwkJCQkJaWYocmVzdWx0ICE9IDApCi0vLwkJCQkJCXJldHVybiByZXN1bHQ7Ci0vLwkJCQkJcmV0dXJuIENvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZSh0YTEuZ2V0VGV4dCgpLCB0YTIuZ2V0VGV4dCgpKTsKLS8vCQkJCX0KLS8vCQkJfTsKLS8vCQl9Ci0vLwkJcmV0dXJuIGZDb21wYXJhdG9yOwotLy8JfQotCi0JcHVibGljIEhhc2hTZXQgZ2V0TWFya2VyQW5ub3RhdGlvbnMoKSB7Ci0JCWlmIChmTWFya2VyQW5ub3RhdGlvbnMgPT0gbnVsbCkKLQkJCWZNYXJrZXJBbm5vdGF0aW9ucyA9IG5ldyBIYXNoU2V0KCk7Ci0JCXJldHVybiBmTWFya2VyQW5ub3RhdGlvbnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9EaXJ0eVJlZ2lvblByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9EaXJ0eVJlZ2lvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmRmZTI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRGlydHlSZWdpb25Qcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50RXh0ZW5zaW9uMzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRJbnB1dExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci0KLS8qKgotICogVGhpcyBKb2IgaG9sZHMgYSBxdWV1ZSBvZiB1cGRhdGVzIGZyb20gdGhlIGVkaXRvciAoRGlydHlSZWdpb25zKSB0bwotICogcHJvY2Vzcy4gV2hlbiBhIG5ldyByZXF1ZXN0IGNvbWVzIGluLCB0aGUgY3VycmVudCBydW4gaXMgY2FuY2VsZWQsIHRoZSBuZXcKLSAqIHJlcXVlc3QgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCB0aGVuIHRoZSBqb2IgaXMgcmUtc2NoZWR1bGVkLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgRGlydHlSZWdpb25Qcm9jZXNzb3IgZXh0ZW5kcyBKb2IgaW1wbGVtZW50cyBJUmVjb25jaWxlciwgSVJlY29uY2lsZXJFeHRlbnNpb24sIElDb25maWd1cmFibGVSZWNvbmNpbGVyIHsKLQljbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJLy8gc2F2ZSBwYXJ0aXRpb24gdHlwZSAodG8gc2VlIGlmIGl0IGNoYW5nZXMgaW4gZG9jdW1lbnRDaGFuZ2VkKCkpCi0JCQlmTGFzdFBhcnRpdGlvbnMgPSBnZXRQYXJ0aXRpb25zKGV2ZW50LmdldE9mZnNldCgpLCBldmVudC5nZXRMZW5ndGgoKSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJaWYgKHBhcnRpdGlvbnNDaGFuZ2VkKGV2ZW50KSkgewotCQkJCS8vIHBhX1RPRE8KLQkJCQkvLyB0aGlzIGlzIGEgc2ltcGxlIHdheSB0byBlbnN1cmUgb2xkCi0JCQkJLy8gYW5ub3RhdGlvbnMgYXJlIHJlbW92ZWQgd2hlbiBwYXJ0aXRpb24gY2hhbmdlcwotCi0JCQkJLy8gaXQgbWlnaHQgYmUgYSBwZXJmb3JtYW5jZSBoaXQgdGhvdWdoCi0JCQkJc2V0RW50aXJlRG9jdW1lbnREaXJ0eShnZXREb2N1bWVudCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8qCi0JCQkJICogTm90ZSB0aGF0IGNyZWF0aW5nIERpcnR5UmVnaW9ucyAqbm93KiBtZWFucyB0aGF0IHRoZSB3cm9uZwotCQkJCSAqIHRleHQgbWF5IGJlIGluY2x1ZGVkCi0JCQkJICovCi0JCQkJRGlydHlSZWdpb24gZHIgPSBudWxsOwotCQkJCWlmIChldmVudC5nZXRMZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCS8qCi0JCQkJCSAqIEl0J3MgYW4gaW5zZXJ0LS0gd2UgdXNlIHRleHQgbGVuZ3RoIHRob3VnaCBzbyB0aGF0IHRoZQotCQkJCQkgKiBuZXcgcmVnaW9uIGdldHMgdmFsaWRhdGVkLi4uCi0JCQkJCSAqLwotCQkJCQlkciA9IGNyZWF0ZURpcnR5UmVnaW9uKGV2ZW50LmdldE9mZnNldCgpLCAwLCBEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKCIiLmVxdWFscyhldmVudC5nZXRUZXh0KCkpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCS8vIGl0J3MgYSBkZWxldGUKLQkJCQkJCWRyID0gY3JlYXRlRGlydHlSZWdpb24oZXZlbnQuZ2V0T2Zmc2V0KCksIGV2ZW50LmdldExlbmd0aCgpLCBEaXJ0eVJlZ2lvbi5SRU1PVkUpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaXQncyBhIHJlcGxhY2UKLQkJCQkJCWRyID0gY3JlYXRlRGlydHlSZWdpb24oZXZlbnQuZ2V0T2Zmc2V0KCksIGV2ZW50LmdldExlbmd0aCgpLCBEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJCQl9Ci0JCQkJfQotCQkJCXByb2Nlc3NEaXJ0eVJlZ2lvbihkcik7Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQ2hlY2tzIHByZXZpb3VzIHBhcnRpdGlvbnMgZnJvbSB0aGUgc3BhbiBvZiB0aGUgZXZlbnQgdy8gdGhlIG5ldwotCQkgKiBwYXJ0aXRpb25zIGZyb20gdGhlIHNwYW4gb2YgdGhlIGV2ZW50LiBJZiBwYXJ0aXRpb25zIGNoYW5nZWQsCi0JCSAqIHJldHVybiB0cnVlLCBlbHNlIHJldHVybiBmYWxzZQotCQkgKiAKLQkJICogQHBhcmFtIGV2ZW50Ci0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgYm9vbGVhbiBwYXJ0aXRpb25zQ2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQlib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKLQkJCWludCBsZW5ndGggPSBldmVudC5nZXRMZW5ndGgoKTsKLQotCQkJaWYgKGV2ZW50LmdldExlbmd0aCgpID09IDAgJiYgZXZlbnQuZ2V0VGV4dCgpLmxlbmd0aCgpID4gMCkgewotCQkJCS8vIGl0J3MgYW4gaW5zZXJ0LCB3ZSB3YW50IHBhcnRpdGlvbnMgb2YgdGhlIG5ldyB0ZXh0Ci0JCQkJbGVuZ3RoID0gZXZlbnQuZ2V0VGV4dCgpLmxlbmd0aCgpOwotCQkJfQotCi0JCQlTdHJpbmdbXSBuZXdQYXJ0aXRpb25zID0gZ2V0UGFydGl0aW9ucyhldmVudC5nZXRPZmZzZXQoKSwgbGVuZ3RoKTsKLQkJCWlmIChmTGFzdFBhcnRpdGlvbnMgIT0gbnVsbCkgewotCQkJCWlmIChmTGFzdFBhcnRpdGlvbnMubGVuZ3RoICE9IG5ld1BhcnRpdGlvbnMubGVuZ3RoKSB7Ci0JCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTGFzdFBhcnRpdGlvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCWlmICghZkxhc3RQYXJ0aXRpb25zW2ldLmVxdWFscyhuZXdQYXJ0aXRpb25zW2ldKSkgewotCQkJCQkJCWNoYW5nZWQgPSB0cnVlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGNoYW5nZWQ7Ci0JCX0KLQotCi0JfQotCi0JLyoqCi0JICogUmVjb25jaWxlcyB0aGUgZW50aXJlIGRvY3VtZW50IHdoZW4gdGhlIGRvY3VtZW50IGluIHRoZSB2aWV3ZXIgaXMKLQkgKiBjaGFuZ2VkLiBUaGlzIGhhcHBlbnMgd2hlbiB0aGUgZG9jdW1lbnQgaXMgaW5pdGlhbGx5IG9wZW5lZCwgYXMgd2VsbCBhcwotCSAqIGFmdGVyIGEgc2F2ZS1hcy4KLQkgKiAKLQkgKiBBbHNvIHNlZSBwcm9jZXNzUG9zdE1vZGVsRXZlbnQoLi4uKSBmb3Igc2ltaWxhciBiZWhhdmlvciB3aGVuIGRvY3VtZW50Ci0JICogZm9yIHRoZSBtb2RlbCBpcyBjaGFuZ2VkLgotCSAqLwotCWNsYXNzIFRleHRJbnB1dExpc3RlbmVyIGltcGxlbWVudHMgSVRleHRJbnB1dExpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgaW5wdXREb2N1bWVudEFib3V0VG9CZUNoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCQloYW5kbGVJbnB1dERvY3VtZW50Q2hhbmdlZChvbGRJbnB1dCwgbmV3SW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqIGRlYnVnIGZsYWcgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBVUERBVEVfREVMQVkgPSA3NTA7Ci0KLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByaXZhdGUgbG9uZyBmRGVsYXk7Ci0KLQotCS8qKiBsb2NhbCBxdWV1ZSBvZiBkaXJ0eSByZWdpb25zIChjcmVhdGVkIGhlcmUpIHRvIGJlIHJlY29uY2lsZWQgKi8KLQlwcml2YXRlIExpc3QgZkRpcnR5UmVnaW9uUXVldWUgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRMaXN0KG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkvKiogZG9jdW1lbnQgdGhhdCB0aGlzIHJlY29uY2lsZXIgd29ya3Mgb24gKi8KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCi0JcHJpdmF0ZSBJRG9jdW1lbnRMaXN0ZW5lciBmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKCk7Ci0JLyoqCi0JICogc2V0IHRydWUgYWZ0ZXIgZmlyc3QgaW5zdGFsbCB0byBwcmV2ZW50IGR1cGxpY2F0ZSB3b3JrIGRvbmUgaW4gdGhlCi0JICogaW5zdGFsbCBtZXRob2QgKHNpbmNlIGluc3RhbGwgZ2V0cyBjYWxsZWQgbXVsdGlwbGUgdGltZXMpCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0luc3RhbGxlZCA9IGZhbHNlOwotCi0JLyoqCi0JICogc28gd2UgY2FuIHRlbGwgaWYgYSBwYXJ0aXRpb24gY2hhbmdlZCBhZnRlciB0aGUgbGFzdCBlZGl0Ci0JICovCi0JU3RyaW5nW10gZkxhc3RQYXJ0aXRpb25zOwotCi0JTGlzdCBmTm9uSW5jcmVtZW50YWxTdHJhdGVnaWVzQWxyZWFkeVByb2Nlc3NlZCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0KLQkvKioKLQkgKiBUaGUgcGFydGl0aW9uaW5nIHRoaXMgcmVjb25jaWxlciB1c2VzLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZQYXJ0aXRpb25pbmc7Ci0KLQlNYXAgZlJlY29uY2lsaW5nU3RyYXRlZ2llcyA9IG51bGw7Ci0KLQkvKiogZm9yIGluaXRpYWwgcmVjb25jaWxlIHdoZW4gZG9jdW1lbnQgaXMgb3BlbmVkICovCi0JcHJpdmF0ZSBUZXh0SW5wdXRMaXN0ZW5lciBmVGV4dElucHV0TGlzdGVuZXIgPSBudWxsOwotCS8qKiB0aGUgdGV4dCB2aWV3ZXIgKi8KLQlwcml2YXRlIElUZXh0Vmlld2VyIGZWaWV3ZXI7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IKLQkgKi8KLQlwdWJsaWMgRGlydHlSZWdpb25Qcm9jZXNzb3IoKSB7Ci0JCS8vIGluaXQgam9iIHN0dWZmCi0JCXN1cGVyKFNTRVVJTWVzc2FnZXMucHJvY19kaXJ0eV9yZWdpb25zXzApOyAvLyROT04tTkxTLTEkCi0JCXNldFByaW9yaXR5KEpvYi5MT05HKTsKLQkJc2V0U3lzdGVtKHRydWUpOwotCi0JCS8vIGluaXQgcmVjb25jaWxlciBzdHVmZgotCQlzZXREZWxheShVUERBVEVfREVMQVkpOwotCQlmUmVjb25jaWxpbmdTdHJhdGVnaWVzID0gbmV3IEhhc2hNYXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBnaXZlbiByZXNvdXJjZSB0byB0aGUgc2V0IG9mIHJlc291cmNlcyB0aGF0IG5lZWQgcmVmcmVzaGluZy4KLQkgKiBTeW5jaHJvbml6ZWQgaW4gb3JkZXIgdG8gcHJvdGVjdCB0aGUgY29sbGVjdGlvbiBkdXJpbmcgYWRkLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqLwotCXByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgYWRkUmVxdWVzdChEaXJ0eVJlZ2lvbiBuZXdEaXJ0eVJlZ2lvbikgewotCQkvLyBOT1RFOiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYSBsb3Qgc28gbWFrZSBzdXJlIGl0J3MgZmFzdAotCQlMaXN0IGRpcnR5UmVnaW9uUXVldWUgPSBnZXREaXJ0eVJlZ2lvblF1ZXVlKCk7Ci0JCWZvciAoSXRlcmF0b3IgaXQgPSBkaXJ0eVJlZ2lvblF1ZXVlLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTspIHsKLQkJCS8vIGdvIHRocm91Z2ggbGlzdCBvZiBleGlzdGluZyBkaXJ0eSByZWdpb25zIGFuZCBjaGVjayBpZiBhbnkKLQkJCS8vIGRpcnR5IHJlZ2lvbnMgbmVlZCB0byBiZSBkaXNjYXJkZWQKLQkJCURpcnR5UmVnaW9uIGN1cnJlbnRFeGlzdGluZyA9IChEaXJ0eVJlZ2lvbikgaXQubmV4dCgpOwotCQkJRGlydHlSZWdpb24gb3V0ZXIgPSBnZXRPdXRlclJlZ2lvbihjdXJyZW50RXhpc3RpbmcsIG5ld0RpcnR5UmVnaW9uKTsKLQkJCS8vIGlmIHdlIGFscmVhZHkgaGF2ZSBhIHJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIG5ldyByZXF1ZXN0LAotCQkJLy8gZGlzY2FyZCB0aGUgbmV3IHJlcXVlc3QKLQkJCWlmIChvdXRlciA9PSBjdXJyZW50RXhpc3RpbmcpCi0JCQkJcmV0dXJuOwotCQkJLy8gaWYgbmV3IHJlcXVlc3QgY29udGFpbnMgYW55IGV4aXN0aW5nIHJlcXVlc3RzLAotCQkJLy8gcmVtb3ZlIHRob3NlCi0JCQlpZiAob3V0ZXIgPT0gbmV3RGlydHlSZWdpb24pCi0JCQkJaXQucmVtb3ZlKCk7Ci0JCX0KLQkJZGlydHlSZWdpb25RdWV1ZS5hZGQobmV3RGlydHlSZWdpb24pOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHN1YmNsYXNzZXMgdGhhdCBwcm9jZXNzaW5nIG9mIG11bHRpcGxlIGRpcnR5IHJlZ2lvbnMgaGFzIGJlZ3VuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYmVnaW5Qcm9jZXNzaW5nKCkgewotCQkvLyBkbyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoRGlydHlSZWdpb24gZGlydHlSZWdpb24pIHsKLQkJaW50IGRyT2Zmc2V0ID0gZGlydHlSZWdpb24uZ2V0T2Zmc2V0KCk7Ci0JCWludCBkckxlbmd0aCA9IGRpcnR5UmVnaW9uLmdldExlbmd0aCgpOwotCi0JCXJldHVybiBjb21wdXRlUGFydGl0aW9uaW5nKGRyT2Zmc2V0LCBkckxlbmd0aCk7Ci0JfQotCi0JcHJvdGVjdGVkIElUeXBlZFJlZ2lvbltdIGNvbXB1dGVQYXJ0aXRpb25pbmcoaW50IGRyT2Zmc2V0LCBpbnQgZHJMZW5ndGgpIHsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0JCWludCBkb2NMZW5ndGggPSBkb2MuZ2V0TGVuZ3RoKCk7Ci0KLQkJSVR5cGVkUmVnaW9uW10gdHIgPSBuZXcgSVR5cGVkUmVnaW9uWzBdOwotCi0JCWlmIChkck9mZnNldCA+IGRvY0xlbmd0aCkgewotCQkJZHJPZmZzZXQgPSBkb2NMZW5ndGg7Ci0JCQlkckxlbmd0aCA9IDA7Ci0JCX0KLQkJZWxzZSBpZiAoZHJPZmZzZXQgKyBkckxlbmd0aCA+IGRvY0xlbmd0aCkgewotCQkJZHJMZW5ndGggPSBkb2NMZW5ndGggLSBkck9mZnNldDsKLQkJfQotCi0JCXRyeSB7Ci0JCQkvLyBkaXJ0eSByZWdpb24gbWF5IHNwYW4gbXVsdGlwbGUgcGFydGl0aW9ucwotCQkJdHIgPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZG9jLCBnZXREb2N1bWVudFBhcnRpdGlvbmluZygpLCBkck9mZnNldCwgZHJMZW5ndGgsIHRydWUpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgaW5mbyA9ICJkcjogWyIgKyBkck9mZnNldCArICI6IiArIGRyTGVuZ3RoICsgIl0gZG9jOiBbIiArIGRvY0xlbmd0aCArICJdICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaW5mbywgZSk7Ci0JCQl0ciA9IG5ldyBJVHlwZWRSZWdpb25bMF07Ci0JCX0KLQkJcmV0dXJuIHRyOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIG9uZSBkaXJ0eSByZWdpb24gY29udGFpbnMgdGhlIG90aGVyIGFuZCBpZiBzbywKLQkgKiB3aGljaCBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMgaXQuCi0JICogCi0JICogQHBhcmFtIHJvb3QKLQkgKiBAcGFyYW0gcG9zc2libGUKLQkgKiBAcmV0dXJuIHRoZSBvdXRlciBkaXJ0eSByZWdpb24gaWYgaXQgY29udGFpbnMgdGhlIG90aGVyIGRpcnR5IHJlZ2lvbiwKLQkgKiAgICAgICAgIG51bGwgb3RoZXJ3aXNlCi0JICovCi0JcHJvdGVjdGVkIERpcnR5UmVnaW9uIGdldE91dGVyUmVnaW9uKERpcnR5UmVnaW9uIHJvb3QsIERpcnR5UmVnaW9uIHBvc3NpYmxlKSB7Ci0JCURpcnR5UmVnaW9uIG91dGVyID0gbnVsbDsKLQkJaWYgKGlzQ29udGFpbmVkKHJvb3QsIHBvc3NpYmxlKSkKLQkJCW91dGVyID0gcm9vdDsKLQkJZWxzZSBpZiAoaXNDb250YWluZWQocG9zc2libGUsIHJvb3QpKQotCQkJb3V0ZXIgPSBwb3NzaWJsZTsKLQkJcmV0dXJuIG91dGVyOwotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gZGV0ZXJtaW5lIG9mIGEgInBvc3NpYmxlIiBkaXJ0eSByZWdpb24gY2FuIGJlIGRpc2NhcmRlZCBpbgotCSAqIGZhdm9yIG9mIHVzaW5nIGp1c3QgdGhlICJyb290IiBkaXJ0eSByZWdpb24uCi0JICogCi0JICogQHJldHVybiBpZiB0aGUgcm9vdCBkaXJ0eSByZWdpb24gY29udGFpbnMgcG9zc2libGUsIHJldHVybiB0cnVlLAotCSAqICAgICAgICAgb3RoZXJ3aXNlIHJldHVybiBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbnRhaW5lZChEaXJ0eVJlZ2lvbiByb290LCBEaXJ0eVJlZ2lvbiBwb3NzaWJsZSkgewotCQlpbnQgcm9vdFN0YXJ0ID0gcm9vdC5nZXRPZmZzZXQoKTsKLQkJaW50IHJvb3RFbmQgPSByb290U3RhcnQgKyByb290LmdldExlbmd0aCgpOwotCQlpbnQgcG9zc1N0YXJ0ID0gcG9zc2libGUuZ2V0T2Zmc2V0KCk7Ci0JCWludCBwb3NzRW5kID0gcG9zc1N0YXJ0ICsgcG9zc2libGUuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChyb290U3RhcnQgPD0gcG9zc1N0YXJ0ICYmIHJvb3RFbmQgPj0gcG9zc0VuZCkKLQkJCXJldHVybiB0cnVlOwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIERpcnR5UmVnaW9uIGNyZWF0ZURpcnR5UmVnaW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCURpcnR5UmVnaW9uIGR1cnR5ID0gbnVsbDsKLQkJSURvY3VtZW50IGRvYyA9IGdldERvY3VtZW50KCk7Ci0KLQkJaWYgKGRvYyAhPSBudWxsKSB7Ci0JCQkvLyBzYWZldHkgZm9yIEJMRQotCQkJaW50IGRvY0xlbiA9IGRvYy5nZXRMZW5ndGgoKTsKLQkJCWlmIChvZmZzZXQgPiBkb2NMZW4pIHsKLQkJCQlvZmZzZXQgPSBkb2NMZW47Ci0JCQkJbGVuZ3RoID0gMDsKLQkJCX0KLQkJCWVsc2UgaWYgKG9mZnNldCArIGxlbmd0aCA+PSBkb2NMZW4pCi0JCQkJbGVuZ3RoID0gZG9jTGVuIC0gb2Zmc2V0OwotCQkJdHJ5IHsKLQkJCQlkdXJ0eSA9IG5ldyBEaXJ0eVJlZ2lvbihvZmZzZXQsIGxlbmd0aCwgdHlwZSwgZG9jLmdldChvZmZzZXQsIGxlbmd0aCkpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlTdHJpbmcgaW5mbyA9ICJkcjogWyIgKyBvZmZzZXQgKyAiOiIgKyBsZW5ndGggKyAiXSBkb2M6IFsiICsgZG9jTGVuICsgIl0gIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oaW5mbywgZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGR1cnR5OwotCX0KLQotCXByb3RlY3RlZCBEaXJ0eVJlZ2lvbiBjcmVhdGVEaXJ0eVJlZ2lvbihJVHlwZWRSZWdpb24gdHIsIFN0cmluZyB0eXBlKSB7Ci0JCXJldHVybiBjcmVhdGVEaXJ0eVJlZ2lvbih0ci5nZXRPZmZzZXQoKSwgdHIuZ2V0TGVuZ3RoKCksIHR5cGUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZsdXNoRGlydHlSZWdpb25RdWV1ZSgpIHsKLQkJZkRpcnR5UmVnaW9uUXVldWUuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBOb3RpZmllcyBzdWJjbGFzc2VzIHRoYXQgcHJvY2Vzc2luZyBvZiBtdWx0aXBsZSBkaXJ0eSByZWdpb25zIGhhcwotCSAqIGVuZGVkLCBmb3Igbm93Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZW5kUHJvY2Vzc2luZygpIHsKLQkJLy8gZG8gbm90aGluZyBieSBkZWZhdWx0Ci0JfQotCi0JLyoqCi0JICogRGVsYXkgYmV0d2VlbiBwcm9jZXNzaW5nIG9mIERpcnR5UmVnaW9ucy4KLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JbG9uZyBnZXREZWxheSgpIHsKLQkJcmV0dXJuIGZEZWxheTsKLQl9Ci0KLQlMaXN0IGdldERpcnR5UmVnaW9uUXVldWUoKSB7Ci0JCXJldHVybiBmRGlydHlSZWdpb25RdWV1ZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgSURvY3VtZW50IG9uIHdoaWNoIHRoaXMgcmVjb25jaWxlciBvcGVyYXRlcwotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSB7Ci0JCWlmIChmUGFydGl0aW9uaW5nID09IG51bGwpCi0JCQlyZXR1cm4gSURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklORzsKLQkJcmV0dXJuIGZQYXJ0aXRpb25pbmc7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvbnMoaW50IGRyT2Zmc2V0LCBpbnQgZHJMZW5ndGgpIHsKLQotCQlJVHlwZWRSZWdpb25bXSByZWdpb25zID0gbmV3IElUeXBlZFJlZ2lvblswXTsKLQkJaW50IGRvY0xlbmd0aCA9IGdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCk7Ci0KLQkJaWYgKGRyT2Zmc2V0ID4gZG9jTGVuZ3RoKSB7Ci0JCQlkck9mZnNldCA9IGRvY0xlbmd0aDsKLQkJCWRyTGVuZ3RoID0gMDsKLQkJfQotCQllbHNlIGlmIChkck9mZnNldCArIGRyTGVuZ3RoID4gZG9jTGVuZ3RoKSB7Ci0JCQlkckxlbmd0aCA9IGRvY0xlbmd0aCAtIGRyT2Zmc2V0OwotCQl9Ci0KLQkJdHJ5IHsKLQkJCXJlZ2lvbnMgPSBUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZ2V0RG9jdW1lbnQoKSwgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSwgZHJPZmZzZXQsIGRyTGVuZ3RoLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJCXJlZ2lvbnMgPSBuZXcgSVR5cGVkUmVnaW9uWzBdOwotCQl9Ci0JCVN0cmluZ1tdIHBhcnRpdGlvbnMgPSBuZXcgU3RyaW5nW3JlZ2lvbnMubGVuZ3RoXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKQotCQkJcGFydGl0aW9uc1tpXSA9IHJlZ2lvbnNbaV0uZ2V0VHlwZSgpOwotCQlyZXR1cm4gcGFydGl0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWNvbmNpbGluZyBzdHJhdGVneSByZWdpc3RlcmVkIHdpdGggdGhlIHJlY29uY2lsZXIgZm9yIHRoZQotCSAqIHNwZWNpZmllZCBwYXJ0aXRpb24gdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gcGFydGl0aW9uVHlwZQotCSAqICAgICAgICAgICAgdGhlIHBhcnRpdGlvbiB0eXBlIGZvciB3aGljaCB0byBkZXRlcm1pbmUgdGhlIHJlY29uY2lsaW5nCi0JICogICAgICAgICAgICBzdHJhdGVneQotCSAqIAotCSAqIEByZXR1cm4gdGhlIHJlY29uY2lsaW5nIHN0cmF0ZWd5IHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBwYXJ0aXRpb24KLQkgKiAgICAgICAgIHR5cGUsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vIHN1Y2ggc3RyYXRlZ3kKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlciNnZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIElSZWNvbmNpbGluZ1N0cmF0ZWd5IGdldFJlY29uY2lsaW5nU3RyYXRlZ3koU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKElSZWNvbmNpbGluZ1N0cmF0ZWd5KSBmUmVjb25jaWxpbmdTdHJhdGVnaWVzLmdldChwYXJ0aXRpb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBhbHNvIHN5bmNocm9uaXplZCBiZWNhdXNlIGl0IGFjY2Vzc2VzIHRoZSBmUmVxdWVzdHMgcXVldWUKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBjdXJyZW50bHkgcmVxdWVzdGVkIE5vZGVzIHRvIHJlZnJlc2gKLQkgKi8KLQlwcml2YXRlIHN5bmNocm9uaXplZCBEaXJ0eVJlZ2lvbltdIGdldFJlcXVlc3RzKCkgewotCQlEaXJ0eVJlZ2lvbltdIHRvUmVmcmVzaCA9IChEaXJ0eVJlZ2lvbltdKSBmRGlydHlSZWdpb25RdWV1ZS50b0FycmF5KG5ldyBEaXJ0eVJlZ2lvbltmRGlydHlSZWdpb25RdWV1ZS5zaXplKCldKTsKLQkJZkRpcnR5UmVnaW9uUXVldWUuY2xlYXIoKTsKLQkJcmV0dXJuIHRvUmVmcmVzaDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSB0ZXh0IHZpZXdlciB0aGlzIHJlY29uY2lsZXIgaXMgaW5zdGFsbGVkIG9uLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHRleHQgdmlld2VyIHRoaXMgcmVjb25jaWxlciBpcyBpbnN0YWxsZWQgb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRWaWV3ZXIgZ2V0VGV4dFZpZXdlcigpIHsKLQkJcmV0dXJuIGZWaWV3ZXI7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG9sZElucHV0Ci0JICogQHBhcmFtIG5ld0lucHV0Ci0JICovCi0Jdm9pZCBoYW5kbGVJbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkvLyBkb24ndCBib3RoZXIgaWYgcmVjb25jaWxlciBub3QgaW5zdGFsbGVkCi0JCWlmIChpc0luc3RhbGxlZCgpKSB7Ci0KLQkJCXJlY29uY2lsZXJEb2N1bWVudENoYW5nZWQobmV3SW5wdXQpOwotCQkJc2V0RG9jdW1lbnQobmV3SW5wdXQpOwotCQkJc2V0RW50aXJlRG9jdW1lbnREaXJ0eShuZXdJbnB1dCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlciNpbnN0YWxsKElUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluc3RhbGwoSVRleHRWaWV3ZXIgdGV4dFZpZXdlcikgewotCQkvLyB3ZSBtaWdodCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgd2l0aCB0aGUgc2FtZSB2aWV3ZS5yLAotCQkvLyBtYXliZSBhZnRlciBiZWluZyB1bmluc3RhbGxlZCBhcyB3ZWxsLCBzbyB0cmFjayBzZXBhcmF0ZWx5Ci0JCWlmICghaXNJbnN0YWxsZWQoKSkgewotCQkJZlZpZXdlciA9IHRleHRWaWV3ZXI7Ci0JCQlmVGV4dElucHV0TGlzdGVuZXIgPSBuZXcgVGV4dElucHV0TGlzdGVuZXIoKTsKLQkJCXRleHRWaWV3ZXIuYWRkVGV4dElucHV0TGlzdGVuZXIoZlRleHRJbnB1dExpc3RlbmVyKTsKLQkJCXNldEluc3RhbGxlZCh0cnVlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoZSB2aWV3ZXIgaGFzIGJlZW4gc2V0IG9uIHRoaXMgUmVjb25jaWxlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZpZXdlciBoYXMgYmVlbiBzZXQgb24gdGhpcyBSZWNvbmNpbGVyLCBmYWxzZQotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW5zdGFsbGVkKCkgewotCQlyZXR1cm4gZklzSW5zdGFsbGVkOwotCX0KLQotCS8qKgotCSAqIFN1YmNsYXNzZXMgc2hvdWxkIGltcGxlbWVudCBmb3Igc3BlY2lmaWMgaGFuZGxpbmcgb2YgZGlydHkgcmVnaW9ucy4gVGhlCi0JICogbWV0aG9kIGlzIGludm9rZWQgZm9yIGVhY2ggZGlydHkgcmVnaW9uIGluIHRoZSBKb2IncyBxdWV1ZS4KLQkgKiAKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0JCS8qCi0JCSAqIEJyZWFrIHRoZSBkaXJ0eSByZWdpb24gaW50byBhIHNlcXVlbmNlIG9mIHBhcnRpdGlvbnMgYW5kIGZpbmQgdGhlCi0JCSAqIGNvcnJlc3BvbmRpbmcgc3RyYXRlZ3kgdG8gcmVjb25jaWxlIHRob3NlIHBhcnRpdGlvbnMuIElmIGEgc3RyYXRlZ3kKLQkJICogaW1wbGVtZW50cyBJTm9uSW5jcmVtZW50YWxSZWNvbmNpbGluZ1N0cmF0ZWd5LCBvbmx5IGNhbGwgaXQgb25jZQotCQkgKiByZWdhcmRsZXNzIG9mIHRoZSBudW1iZXIgYW5kIHR5cGVzIG9mIHBhcnRpdGlvbnMuCi0JCSAqLwotCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zID0gY29tcHV0ZVBhcnRpdGlvbmluZyhkaXJ0eVJlZ2lvbik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJSVJlY29uY2lsaW5nU3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRSZWNvbmNpbGluZ1N0cmF0ZWd5KHBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpKTsKLQkJCWlmIChzdHJhdGVneSAhPSBudWxsKSB7Ci0JCQkJc3RyYXRlZ3kucmVjb25jaWxlKHBhcnRpdGlvbnNbaV0pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW52b2tlIGRpcnR5IHJlZ2lvbiBwcm9jZXNzaW5nLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgcHJvY2Vzc0RpcnR5UmVnaW9uKERpcnR5UmVnaW9uIGRyKSB7Ci0JCWlmIChkciA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWNhbmNlbCgpOwotCQlhZGRSZXF1ZXN0KGRyKTsKLQkJc2NoZWR1bGUoZ2V0RGVsYXkoKSk7Ci0KLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkIHJlcXVlc3QgZm9yOiBbIiArIGRyLmdldFRleHQoKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJxdWV1ZSBzaXplIGlzIG5vdzogIiArIGdldERpcnR5UmVnaW9uUXVldWUoKS5zaXplKCkpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZWluaXRpYWxpemVzIGxpc3RlbmVycyBhbmQgc2V0cyBuZXcgZG9jdW1lbnQgb25hbGwgc3RyYXRlZ2llcy4KLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5BYnN0cmFjdFJlY29uY2lsZXIjcmVjb25jaWxlckRvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQpCi0JICovCi0Jdm9pZCByZWNvbmNpbGVyRG9jdW1lbnRDaGFuZ2VkKElEb2N1bWVudCBuZXdEb2N1bWVudCkgewotCQlJRG9jdW1lbnQgY3VycmVudERvYyA9IGdldERvY3VtZW50KCk7Ci0KLQkJLy8gdW5ob29rIG9sZCBkb2N1bWVudCBsaXN0ZW5lcgotCQlpZiAoY3VycmVudERvYyAhPSBudWxsKQotCQkJY3VycmVudERvYy5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQkJLy8gaG9vayB1cCBuZXcgZG9jdW1lbnQgbGlzdGVuZXIKLQkJaWYgKG5ld0RvY3VtZW50ICE9IG51bGwpCi0JCQluZXdEb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKGZEb2N1bWVudExpc3RlbmVyKTsKLQotCQkvLyBzZXRzIGRvY3VtZW50IG9uIGFsbCBzdHJhdGVnaWVzCi0JCXNldERvY3VtZW50KG5ld0RvY3VtZW50KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCUlTdGF0dXMgc3RhdHVzID0gU3RhdHVzLk9LX1NUQVRVUzsKLQkJdHJ5IHsKLQkJCWJlZ2luUHJvY2Vzc2luZygpOwotCi0JCQlEaXJ0eVJlZ2lvbltdIHRvUmVmcmVzaCA9IGdldFJlcXVlc3RzKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvUmVmcmVzaC5sZW5ndGg7IGkrKykgewotCQkJCWlmIChtb25pdG9yLmlzQ2FuY2VsZWQoKSkKLQkJCQkJdGhyb3cgbmV3IE9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uKCk7Ci0JCQkJcHJvY2Vzcyh0b1JlZnJlc2hbaV0pOwotCQkJfQotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEwMzY3NgotCQkJLy8gc3RvcCBlcnJvcnMgZnJvbSBwb3BwaW5nIHVwIGEgZGlhbG9nCi0JCQkvLyBmcm9tIHRoZSBqb2IgbWFuYWdlcgotCi0JCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTA2MDUyCi0JCQkvLyBkb24ndCBsb2cgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24KLQkJCWlmICghKGUgaW5zdGFuY2VvZiBPcGVyYXRpb25DYW5jZWxlZEV4Y2VwdGlvbikpCi0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigicHJvYmxlbSB3aXRoIHJlY29uY2lsaW5nIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWVuZFByb2Nlc3NpbmcoKTsKLQotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREZWxheShsb25nIGRlbGF5KSB7Ci0JCWZEZWxheSA9IGRlbGF5OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2MpIHsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGRvY3VtZW50IHBhcnRpdGlvbmluZyBmb3IgdGhpcyByZWNvbmNpbGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25pbmcKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCBwYXJ0aXRpb25pbmcgZm9yIHRoaXMgcmVjb25jaWxlcgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50UGFydGl0aW9uaW5nKFN0cmluZyBwYXJ0aXRpb25pbmcpIHsKLQkJZlBhcnRpdGlvbmluZyA9IHBhcnRpdGlvbmluZzsKLQl9Ci0KLQkvKioKLQkgKiBCYXNpY2FsbHkgbWVhbnMgcHJvY2VzcyB0aGUgZW50aXJlIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVudGlyZURvY3VtZW50RGlydHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0KLQkJLy8gbWFrZSB0aGUgZW50aXJlIGRvY3VtZW50IGRpcnR5Ci0JCS8vIHRoaXMgYWxzbyBoYXBwZW5zIG9uIGEgInNhdmUgYXMiCi0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGlzSW5zdGFsbGVkKCkpIHsKLQotCQkJLy8gc2luY2Ugd2UncmUgbWFya2luZyB0aGUgZW50aXJlIGRvYyBkaXJ0eQotCQkJZ2V0RGlydHlSZWdpb25RdWV1ZSgpLmNsZWFyKCk7Ci0JCQlEaXJ0eVJlZ2lvbiBlbnRpcmVEb2N1bWVudCA9IGNyZWF0ZURpcnR5UmVnaW9uKDAsIGRvY3VtZW50LmdldExlbmd0aCgpLCBEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJcHJvY2Vzc0RpcnR5UmVnaW9uKGVudGlyZURvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBpc0luc3RhbGxlZAotCSAqICAgICAgICAgICAgVGhlIGlzSW5zdGFsbGVkIHRvIHNldC4KLQkgKi8KLQl2b2lkIHNldEluc3RhbGxlZChib29sZWFuIGlzSW5zdGFsbGVkKSB7Ci0JCWZJc0luc3RhbGxlZCA9IGlzSW5zdGFsbGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlY29uY2lsaW5nU3RyYXRlZ3koU3RyaW5nIHBhcnRpdGlvblR5cGUsIElSZWNvbmNpbGluZ1N0cmF0ZWd5IHN0cmF0ZWd5KSB7Ci0JCWlmIChwYXJ0aXRpb25UeXBlID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCWlmIChzdHJhdGVneSA9PSBudWxsKSB7Ci0JCQlmUmVjb25jaWxpbmdTdHJhdGVnaWVzLnJlbW92ZShwYXJ0aXRpb25UeXBlKTsKLQkJfQotCQllbHNlIHsKLQkJCWZSZWNvbmNpbGluZ1N0cmF0ZWdpZXMucHV0KHBhcnRpdGlvblR5cGUsIHN0cmF0ZWd5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVyI3VuaW5zdGFsbCgpCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJLy8gcmVtb3ZlcyB3aWRnZXQgbGlzdGVuZXIKLQkJCWdldFRleHRWaWV3ZXIoKS5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcihmVGV4dElucHV0TGlzdGVuZXIpOwotCQkJc2V0SW5zdGFsbGVkKGZhbHNlKTsKLQkJCS8vIHJlbW92ZXMgZG9jdW1lbnQgbGlzdGVuZXJzCi0JCQlyZWNvbmNpbGVyRG9jdW1lbnRDaGFuZ2VkKG51bGwpOwotCQl9Ci0JCXNldERvY3VtZW50KG51bGwpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RvY3VtZW50QWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9Eb2N1bWVudEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGEwOWQyNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RvY3VtZW50QWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxhYmxlTW9kZWw7Ci0KLS8qKgotICogQWRhcHRzIGFuIDxjb2RlPklEb2N1bWVudDwvY29kZT4gdG8gYSA8Y29kZT5JUmVjb25jaWxhYmxlTW9kZWw8L2NvZGU+LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudEFkYXB0ZXIgaW1wbGVtZW50cyBJUmVjb25jaWxhYmxlTW9kZWwgewotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHRleHQgbW9kZWwgYWRhcHRlciBmb3IgdGhlIGdpdmVuIGRvY3VtZW50LgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCWZEb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBtb2RlbCdzIGRvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIG1vZGVsJ3MgaW5wdXQgZG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSURvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzExNTIxMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0RvY3VtZW50UmVnaW9uUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5WYWxpZGF0b3JCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5WYWxpZGF0b3JNZXRhRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuVmFsaWRhdG9yU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zcGVsbGluZy5TcGVsbGNoZWNrU3RyYXRlZ3k7Ci0KLS8qKgotICogQWRkcyB0byBEaXJ0eVJlZ2lvblByb2Nlc3NvciBKb2I6IC0gSURvY3VtZW50TGlzdGVuZXIgLSBWYWxpZGF0b3JTdHJhdGVneSAtCi0gKiBUZXh0IHZpZXdlcihkaXNwb3NlLCBpbnB1dCBjaGFuZ2VkKSBsaXN0ZW5lcnMuIC0gZGVmYXVsdCwgc3BlbGxpbmcsIGFuZAotICogdmFsaWRhdG9yIHN0cmF0ZWdpZXMgLSBEaXJ0eVJlZ2lvbiBwcm9jZXNzaW5nIGxvZ2ljLgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRSZWdpb25Qcm9jZXNzb3IgZXh0ZW5kcyBEaXJ0eVJlZ2lvblByb2Nlc3NvciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHX1ZBTElEQVRPUlMgPSB0cnVlOy8vIEJvb2xlYW4uVFJVRS50b1N0cmluZygpLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlclZhbGlkYXRvcnMiKSk7Ci0JLy8gLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQSBzdHJhdGVneSB0byB1c2UgdGhlIGRlZmluZWQgZGVmYXVsdCBTcGVsbGluZyBzZXJ2aWNlLgotCSAqLwotCXByaXZhdGUgU3BlbGxjaGVja1N0cmF0ZWd5IGZTcGVsbGNoZWNrU3RyYXRlZ3k7Ci0KLQkvKioKLQkgKiBUaGUgc3RyYXRlZ3kgdGhhdCBydW5zIHZhbGlkYXRvcnMgY29udHJpYnV0ZWQgdmlhCi0JICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLnNvdXJjZXZhbGlkYXRpb248L2NvZGU+Ci0JICogZXh0ZW5zaW9uIHBvaW50Ci0JICovCi0JcHJpdmF0ZSBWYWxpZGF0b3JTdHJhdGVneSBmVmFsaWRhdG9yU3RyYXRlZ3k7Ci0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBTU0VfVUlfSUQgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCB2b2lkIGJlZ2luUHJvY2Vzc2luZygpIHsKLQkJc3VwZXIuYmVnaW5Qcm9jZXNzaW5nKCk7Ci0JCVZhbGlkYXRvclN0cmF0ZWd5IHZhbGlkYXRvclN0cmF0ZWd5ID0gZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKTsKLQkJaWYgKHZhbGlkYXRvclN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCXZhbGlkYXRvclN0cmF0ZWd5LmJlZ2luUHJvY2Vzc2luZygpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZW5kUHJvY2Vzc2luZygpIHsKLQkJc3VwZXIuZW5kUHJvY2Vzc2luZygpOwotCQlWYWxpZGF0b3JTdHJhdGVneSB2YWxpZGF0b3JTdHJhdGVneSA9IGdldFZhbGlkYXRvclN0cmF0ZWd5KCk7Ci0JCWlmICh2YWxpZGF0b3JTdHJhdGVneSAhPSBudWxsKSB7Ci0JCQl2YWxpZGF0b3JTdHJhdGVneS5lbmRQcm9jZXNzaW5nKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKElEb2N1bWVudCBkb2MpIHsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIGNvbnRlbnRUeXBlSWQgPSBudWxsOwotCi0JCS8vIHBhX1RPRE8gaXQgd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIGdldCBmaWxlbmFtZSBmcm9tCi0JCS8vIElEb2N1bWVudC4uLgotCQkvLyBiZWNhdXNlIGl0IHNlZW1zIHRoYXQgZ2V0dGluZyBjb250ZW50IHR5cGUgZnJvbSBpbnB1dCBzdHJlYW0KLQkJLy8gaXNuJ3QgYWxsIHRoYXQgYWNjdXJhdGUgKGVnLiB3LyBhIGphdmFzY3JpcHQgZmlsZSkKLQotCQkvLyBJQ29udGVudFR5cGUgY3QgPQotCQkvLyBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5maW5kQ29udGVudFR5cGVGb3IoInRlc3QuanMiKTsKLQkJSUNvbnRlbnRUeXBlIGN0ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlDb250ZW50RGVzY3JpcHRpb24gZGVzYyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldERlc2NyaXB0aW9uRm9yKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkb2MuZ2V0KCkuZ2V0Qnl0ZXMoKSksIG51bGwsIElDb250ZW50RGVzY3JpcHRpb24uQUxMKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQljdCA9IGRlc2MuZ2V0Q29udGVudFR5cGUoKTsKLQkJCQlpZiAoY3QgIT0gbnVsbCkKLQkJCQkJY29udGVudFR5cGVJZCA9IGN0LmdldElkKCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGp1c3QgYmFpbAotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZUlkOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kgZ2V0U3BlbGxjaGVja1N0cmF0ZWd5KCkgewotCQlpZiAoZlNwZWxsY2hlY2tTdHJhdGVneSA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlKGdldERvY3VtZW50KCkpOwotCQkJaWYgKGNvbnRlbnRUeXBlSWQgIT0gbnVsbCkgewotCQkJCWlmIChnZXRUZXh0Vmlld2VyKCkgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyKSB7Ci0JCQkJCUlTb3VyY2VWaWV3ZXIgdmlld2VyID0gKElTb3VyY2VWaWV3ZXIpIGdldFRleHRWaWV3ZXIoKTsKLQkJCQkJZlNwZWxsY2hlY2tTdHJhdGVneSA9IG5ldyBTcGVsbGNoZWNrU3RyYXRlZ3kodmlld2VyLCBjb250ZW50VHlwZUlkKTsKLQkJCQkJZlNwZWxsY2hlY2tTdHJhdGVneS5zZXREb2N1bWVudChnZXREb2N1bWVudCgpKTsKLQkJCQkJZlNwZWxsY2hlY2tTdHJhdGVneS5zZXREb2N1bWVudFBhcnRpdGlvbmluZyhnZXREb2N1bWVudFBhcnRpdGlvbmluZygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZTcGVsbGNoZWNrU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBWYWxpZGF0b3JTdHJhdGVneS4KLQkgKi8KLQlwcm90ZWN0ZWQgVmFsaWRhdG9yU3RyYXRlZ3kgZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKSB7Ci0JCWlmIChmVmFsaWRhdG9yU3RyYXRlZ3kgPT0gbnVsbCkgewotCQkJVmFsaWRhdG9yU3RyYXRlZ3kgdmFsaWRhdG9yU3RyYXRlZ3kgPSBudWxsOwotCi0JCQlpZiAoZ2V0VGV4dFZpZXdlcigpIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlcikgewotCQkJCUlTb3VyY2VWaWV3ZXIgdmlld2VyID0gKElTb3VyY2VWaWV3ZXIpIGdldFRleHRWaWV3ZXIoKTsKLQkJCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IG51bGw7Ci0KLQkJCQlJRG9jdW1lbnQgZG9jID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCQkJY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlKGRvYyk7Ci0KLQkJCQlpZiAoY29udGVudFR5cGVJZCAhPSBudWxsKSB7Ci0JCQkJCXZhbGlkYXRvclN0cmF0ZWd5ID0gbmV3IFZhbGlkYXRvclN0cmF0ZWd5KHZpZXdlciwgY29udGVudFR5cGVJZCk7Ci0JCQkJCVZhbGlkYXRvckJ1aWxkZXIgdkJ1aWxkZXIgPSBuZXcgVmFsaWRhdG9yQnVpbGRlcigpOwotCQkJCQlWYWxpZGF0b3JNZXRhRGF0YVtdIHZtZHMgPSB2QnVpbGRlci5nZXRWYWxpZGF0b3JNZXRhRGF0YShTU0VfVUlfSUQpOwotCQkJCQlMaXN0IGVuYWJsZWRWYWxpZGF0b3JzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJCQkJLyogaWYgYW55ICJtdXN0IiBoYW5kbGUgdGhpcyBjb250ZW50IHR5cGUsIGp1c3QgYWRkIHRoZW0gKi8KLQkJCQkJYm9vbGVhbiBmb3VuZFNwZWNpZmljQ29udGVudFR5cGVWYWxpZGF0b3JzID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCQkJaWYgKHZtZHNbaV0ubXVzdEhhbmRsZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpKSB7Ci0JCQkJCQkJaWYgKERFQlVHX1ZBTElEQVRPUlMpCi0JCQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGNvbnRlbnRUeXBlSWQgKyAiIHVzaW5nIHNwZWNpZmljIHZhbGlkYXRvciAiICsgdm1kc1tpXS5nZXRWYWxpZGF0b3JJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWZvdW5kU3BlY2lmaWNDb250ZW50VHlwZVZhbGlkYXRvcnMgPSB0cnVlOwotCQkJCQkJCWVuYWJsZWRWYWxpZGF0b3JzLmFkZCh2bWRzW2ldKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoIWZvdW5kU3BlY2lmaWNDb250ZW50VHlwZVZhbGlkYXRvcnMpIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdm1kcy5sZW5ndGg7IGkrKykgewotCQkJCQkJCWlmICh2bWRzW2ldLmNhbkhhbmRsZUNvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpKSB7Ci0JCQkJCQkJCWlmIChERUJVR19WQUxJREFUT1JTKQotCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgY29udGVudFR5cGVJZCArICIgdXNpbmcgaW5oZXJpdGVkKD8pIHZhbGlkYXRvciAiICsgdm1kc1tpXS5nZXRWYWxpZGF0b3JJZCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQllbmFibGVkVmFsaWRhdG9ycy5hZGQodm1kc1tpXSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW5hYmxlZFZhbGlkYXRvcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJCXZhbGlkYXRvclN0cmF0ZWd5LmFkZFZhbGlkYXRvck1ldGFEYXRhKChWYWxpZGF0b3JNZXRhRGF0YSkgZW5hYmxlZFZhbGlkYXRvcnMuZ2V0KGkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZWYWxpZGF0b3JTdHJhdGVneSA9IHZhbGlkYXRvclN0cmF0ZWd5OwotCQl9Ci0JCXJldHVybiBmVmFsaWRhdG9yU3RyYXRlZ3k7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2VzcyhEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbikgewotCQlpZiAoIWlzSW5zdGFsbGVkKCkpCi0JCQlyZXR1cm47Ci0KLQkJc3VwZXIucHJvY2VzcyhkaXJ0eVJlZ2lvbik7Ci0KLQkJLy8gQWxzbyBjYWxsIHRoZSB2YWxpZGF0aW9uIGFuZCBzcGVsbC1jaGVjayBzdHJhdGVnaWVzCi0JCUlUeXBlZFJlZ2lvbltdIHBhcnRpdGlvbnMgPSBjb21wdXRlUGFydGl0aW9uaW5nKGRpcnR5UmVnaW9uKTsKLQotCQlEaXJ0eVJlZ2lvbiBkaXJ0eSA9IG51bGw7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJLy8gW3NvdXJjZV12YWxpZGF0b3IgKGV4dGVuc2lvbikgZm9yIHRoaXMgcGFydGl0aW9uCi0JCQlpZiAoZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKSAhPSBudWxsKSB7Ci0JCQkJZGlydHkgPSBjcmVhdGVEaXJ0eVJlZ2lvbihwYXJ0aXRpb25zW2ldLCBEaXJ0eVJlZ2lvbi5JTlNFUlQpOwotCQkJCWdldFZhbGlkYXRvclN0cmF0ZWd5KCkucmVjb25jaWxlKHBhcnRpdGlvbnNbaV0sIGRpcnR5KTsKLQkJCX0KLQkJfQotCi0JCS8vIHNpbmdsZSBzcGVsbC1jaGVjayBmb3IgZXZlcnl0aGluZwotCQlpZiAoZ2V0U3BlbGxjaGVja1N0cmF0ZWd5KCkgIT0gbnVsbCkgewotCQkJZ2V0U3BlbGxjaGVja1N0cmF0ZWd5KCkucmVjb25jaWxlKGRpcnR5UmVnaW9uLCBkaXJ0eVJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKSB7Ci0JCXN1cGVyLnNldERvY3VtZW50KGRvYyk7Ci0JCUlSZWNvbmNpbGluZ1N0cmF0ZWd5IHZhbGlkYXRvclN0cmF0ZWd5ID0gZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKTsKLQkJaWYgKHZhbGlkYXRvclN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCXZhbGlkYXRvclN0cmF0ZWd5LnNldERvY3VtZW50KGRvYyk7Ci0JCX0KLQkJaWYgKGZTcGVsbGNoZWNrU3RyYXRlZ3kgIT0gbnVsbCkgewotCQkJZlNwZWxsY2hlY2tTdHJhdGVneS5zZXREb2N1bWVudChkb2MpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5EaXJ0eVJlZ2lvblByb2Nlc3NvciN1bmluc3RhbGwoKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuaW5zdGFsbCgpIHsKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQotCQkJY2FuY2VsKCk7Ci0KLQkJCUlSZWNvbmNpbGluZ1N0cmF0ZWd5IHZhbGlkYXRvclN0cmF0ZWd5ID0gZ2V0VmFsaWRhdG9yU3RyYXRlZ3koKTsKLQotCQkJaWYgKHZhbGlkYXRvclN0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQlpZiAodmFsaWRhdG9yU3RyYXRlZ3kgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkKLQkJCQkJKChJUmVsZWFzYWJsZSkgdmFsaWRhdG9yU3RyYXRlZ3kpLnJlbGVhc2UoKTsKLQkJCX0KLQkJCWlmIChmU3BlbGxjaGVja1N0cmF0ZWd5ICE9IG51bGwpIHsKLQkJCQlmU3BlbGxjaGVja1N0cmF0ZWd5LnNldERvY3VtZW50KG51bGwpOwotCQkJfQotCQl9Ci0JCXN1cGVyLnVuaW5zdGFsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSUNvbmZpZ3VyYWJsZVJlY29uY2lsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSUNvbmZpZ3VyYWJsZVJlY29uY2lsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY4YjI4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lDb25maWd1cmFibGVSZWNvbmNpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5OwotCi0vKioKLSAqIEEgcmVjb25jaWxlciB0aGF0IGFsbG93cyBJUmVjb25jaWxpbmdTdHJhdGVnaWVzIHRvIGJlIGFzc2lnbmVkIHRvIHBhcnRpdGlvbgotICogdHlwZXMuIFRoZSByZWNvbmNpbGVyIHdpbGwgY2FsbCB0aGUgcmVnaXN0ZXJlZCBJUmVjb25jaWxpbmdTdHJhdGVneSB3aGVuCi0gKiBkaXJ0eSByZWdpb25zIHdoaWNoIGNvbnRhaW4gcGFydGl0aW9ucyBvZiBhIHNwZWNpZmljIHR5cGUgbmVlZCB0byBiZQotICogcmVjb25jaWxlZC4KLSAqIAotICogQHNpbmNlIDEuMQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDb25maWd1cmFibGVSZWNvbmNpbGVyIHsKLQkvKioKLQkgKiBTZXRzIHRoZSByZWNvbmNpbGluZyBzdHJhdGVneSBmb3IgdGhlIHJlY29uY2lsZXIgdG8gdXNlIGZvciB0aGUKLQkgKiBzcGVjaWZpZWQgY29udGVudCB0eXBlLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogICAgICAgICAgICB0aGUgcGFydGl0aW9uIHR5cGUKLQkgKiBAcGFyYW0gc3RyYXRlZ3kKLQkgKiAgICAgICAgICAgIHRoZSByZWNvbmNpbGluZyBzdHJhdGVneQotCSAqLwotCXZvaWQgc2V0UmVjb25jaWxpbmdTdHJhdGVneShTdHJpbmcgcGFydGl0aW9uVHlwZSwgSVJlY29uY2lsaW5nU3RyYXRlZ3kgc3RyYXRlZ3kpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTJkZjBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVJlY29uY2lsZUFubm90YXRpb25LZXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci0KLS8qKgotICogRGVmaW5lcyBhbiBhbm5vdGF0aW9uIGtleSB0aGF0IHRoZQotICogPGNvZGU+QWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3k8L2NvZGU+IGtub3dzIGhvdyB0bwotICogcmVtb3ZlIGFwcHJvcHJpYXRlbHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIG5vdCBBUEksIHRoaXMgd2lsbCBwcm9iYWJseSBqdXN0IGJlY29tZSBhbiBhYnN0cmFjdCBjbGFzcwotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IHsKLQlzdGF0aWMgZmluYWwgaW50IFBBUlRJQUwgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgVE9UQUwgPSAwOwotCi0JU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoKTsKLQotCS8vaW50IGdldFNjb3BlKCk7Ci0KLQlJUmVjb25jaWxlU3RlcCBnZXRTdGVwKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9JU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FiYjVmOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVTdGVwOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKiBAZGVwcmVjYXRlZCBzdGlsbCB3b3JraW5nIG91dCBBUEkgKG9yIGlmIGFueXRoaW5nIGhlcmUgc2hvdWxkIGJlIEFQSSkKLSAqIAotICogSW50ZXJmYWNlIGZvciBhIHN0ZXAgaW4gU3RydWN0dXJlZFJlZ2lvblByb2Nlc3NvciBmcmFtZXdvcmsuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwIGV4dGVuZHMgSVJlY29uY2lsZVN0ZXAgewotCS8qKgotCSAqIFBhcnRpdGlvbnMgZm9yIHdoaWNoIHRoaXMgc3RlcCBjYW4gYWRkL3JlbW92ZSBhbm5vdGlvbnMKLQkgKiAKLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIHRoZSBwYXJ0aXRpb25zIGZvciB3aGljaCB0aGlzIHN0ZXAgY2FuIGFkZC9yZW1vdmUKLQkgKiAgICAgICAgIGFubm90aW9ucwotCSAqLwotCVN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBzY29wZSBmb3Igd2hpY2ggdGhpcyBzdGVwIGFkZHMgYW5ub3RhdGlvbnMuCi0JICogCi0JICogQHJldHVybiB0aGUgc2NvcGUgZm9yIHdoaWNoIHRoaXMgc3RlcCBhZGRzIGFubm90YXRpb25zCi0JICovCi0JLy9pbnQgZ2V0U2NvcGUoKTsKLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgc3RlcCBpcyBlcXVhbCB0byB0aGlzIHN0ZXAgb3IgYW55IG9mIHRoZSBzaWJsaW5nCi0JICogc3RlcHMuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNTaWJsaW5nU3RlcChJUmVjb25jaWxlU3RlcCBzdGVwKTsKLQotCS8qKgotCSAqIEFkZHMgYXdhcmVuZXNzIHRoYXQgdGhlIFJlY29uY2lsZXIgaXMgcmVjb25jaWxpbmcgdGhlIGVudGlyZSBkb2N1bWVudAotCSAqIHRoaXMgY2FsbC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24KLQkgKiBAcGFyYW0gc3ViUmVnaW9uCi0JICogQHBhcmFtIHJlZnJlc2hBbGwKLQkgKiBAcmV0dXJuCi0JICovCi0JSVJlY29uY2lsZVJlc3VsdFtdIHJlY29uY2lsZShEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVJlZ2lvbiBzdWJSZWdpb24sIGJvb2xlYW4gcmVmcmVzaEFsbCk7Ci0KLQkvKioKLQkgKiBVc2VkIHRvIHJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgU3RyYXRlZ3kuIEZvciBleGFtcGxlOiBhbnkgZmxhZ3MgdGhhdAotCSAqIG5lZWQgdG8gYmUgcmVzZXQgYWZ0ZXIgYSBsb25nIHJ1bm5pbmcgb3BlcmF0aW9uIGxpa2UgcHJvY2Vzc0FsbCgpLgotCSAqLwotCXZvaWQgcmVzZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVN0cnVjdHVyZWRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL0lTdHJ1Y3R1cmVkUmVjb25jaWxpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjQ0MTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvSVN0cnVjdHVyZWRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsaW5nU3RyYXRlZ3k7Ci0KLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIHN0cnVjdHVyZWQgcmVjb25jaWxpbmcgc3RyYXRlZ2llcy4KLSAqIAotICogQGRlcHJlY2F0ZWQgZG9lc24ndCBuZWVkIHRvIGJlIEFQSSBhbmQgbWlnaHQgZ28gYXdheQotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgaW50ZXJmYWNlIElTdHJ1Y3R1cmVkUmVjb25jaWxpbmdTdHJhdGVneSBleHRlbmRzIElSZWNvbmNpbGluZ1N0cmF0ZWd5IHsKLQkvKioKLQkgKiBBZGRzIGF3YXJlbmVzcyB0aGF0IHRoZSByZWNvbmNpbGVyIGlzIHByb2Nlc3NpbmcgdGhlIGVudGlyZSBkb2N1bWVudAotCSAqIHZpYSByZWZyZXNoQWxsIGZsYWcuCi0JICogCi0JICogQHBhcmFtIGRpcnR5UmVnaW9uCi0JICogQHBhcmFtIHN1YlJlZ2lvbgotCSAqIEBwYXJhbSByZWZyZXNoQWxsCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbiwgYm9vbGVhbiByZWZyZXNoQWxsKTsKLQotCS8qKgotCSAqIFVzZWQgdG8gcmVzZXQgdGhlIHN0YXRlIG9mIHRoZSBTdHJhdGVneS4gRm9yIGV4YW1wbGU6IGFueSBmbGFncyB0aGF0Ci0JICogbmVlZCB0byBiZSByZXNldCBhZnRlciBhIGxvbmcgcnVubmluZyBvcGVyYXRpb24gbGlrZSBwcm9jZXNzQWxsKCkuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvUmVjb25jaWxlQW5ub3RhdGlvbktleS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9SZWNvbmNpbGVBbm5vdGF0aW9uS2V5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhODllMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9SZWNvbmNpbGVBbm5vdGF0aW9uS2V5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVTdGVwOwotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgPGNvZGU+SVJlY29uY2lsZUFubm90YXRpb25LZXk8L2NvZGU+IG5vdGU6IGNsaWVudHMKLSAqIHNob3VsZCB1c2UgdGhlIG1ldGhvZCBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCNjcmVhdGVLZXkoU3RyaW5nCi0gKiBwYXJ0aXRpb25UeXBlLCBpbnQgc2NvcGUpCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IHsKLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQQVJUSUFMID0gMTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1RBTCA9IDA7Ci0gICAgCi0JcHJpdmF0ZSBTdHJpbmcgZlBhcnRpdGlvblR5cGUgPSBudWxsOwotCi0JcHJpdmF0ZSBJUmVjb25jaWxlU3RlcCBmUmVjb25jaWxlU3RlcCA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlNjb3BlOwotCi0JcHVibGljIFJlY29uY2lsZUFubm90YXRpb25LZXkoSVJlY29uY2lsZVN0ZXAgc3RlcCwgU3RyaW5nIHBhcnRpdGlvblR5cGUsIGludCBzY29wZSkgewotCQlmUmVjb25jaWxlU3RlcCA9IHN0ZXA7Ci0JCWZQYXJ0aXRpb25UeXBlID0gcGFydGl0aW9uVHlwZTsKLQkJZlNjb3BlID0gc2NvcGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKCkgewotCQlyZXR1cm4gZlBhcnRpdGlvblR5cGU7Ci0JfQotCi0JcHVibGljIGludCBnZXRTY29wZSgpIHsKLQkJcmV0dXJuIGZTY29wZTsKLQl9Ci0KLQlwdWJsaWMgSVJlY29uY2lsZVN0ZXAgZ2V0U3RlcCgpIHsKLQkJcmV0dXJuIGZSZWNvbmNpbGVTdGVwOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmdldENsYXNzKCkgKyAiXHJcbmlkOiAiICsgZlBhcnRpdGlvblR5cGU7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWNvbmNpbGVTdGVwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YTg4NzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS9TdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5BYnN0cmFjdFJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLkRpcnR5UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxhYmxlTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS50ZXh0LklTdHJ1Y3R1cmVkUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogUmVjb25jaWxlU3RlcCB0aGF0IGtub3dzIGFib3V0IHRoZSBhbm5vdGF0aW9uIHRoYXQgaXQgYWRkcyB0byB0aGUKLSAqIEFubm90YXRpb25Nb2RlbC4gSXQga25vd3MgaG93IHRvIGNyZWF0ZSBhbiBhbm5vdGF0aW9uIGtleSAoZm9yIHNtYXJ0Ci0gKiByZW1vdmFsIGxhdGVyKSBJdCBrbm93cyB0aGUgcGFydGl0aW9uIHR5cGVzIG9uIHdoaWNoIGl0IGNhbiBvcGVyYXRlLiBJdAotICoga25vd3MgdGhlIHNjb3BlIG9uIHdoaWNoIGl0IG9wZXJhdGVzIChmb3Igc2hvcnQgY2lyY3VpdGluZykgSXQga25vd3MgaWYgdGhlCi0gKiBSZWNvbmNpbGVyIGlzIHJlY29uY2lsaW5nIHRoZSBlbnRpcmUgZG9jdW1lbnQuCi0gKiAKLSAqIENsaWVudHMgbXVzdCBzdWJjbGFzcyB0aGlzIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAgZXh0ZW5kcyBBYnN0cmFjdFJlY29uY2lsZVN0ZXAgaW1wbGVtZW50cyBJUmVsZWFzYWJsZSB7Ci0KLQkvKiogZGVidWcgZmxhZyAqLwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyam9iIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJUmVjb25jaWxlUmVzdWx0W10gRU1QVFlfUkVDT05DSUxFX1JFU1VMVF9TRVQgPSBuZXcgSVJlY29uY2lsZVJlc3VsdFswXTsKLQkKLQkvKioKLQkgKiBJdCdzIHBvc3NpYmxlIGZvciBhIHBhcnRpYWwgc3RlcCB0byBnZXQgY2FsbGVkIG9uIHRoZSBzYW1lIGFyZWEgdHdpY2UKLQkgKiAoYXMgdy8gYSBmdWxsIGRvY3VtZW50IHJlY29uY2lsZSkgdGhpcyBsaXN0IGtlZXBzIHRyYWNrIG9mIGFyZWEgYWxyZWFkeQotCSAqIGNvdmVyZWQuIFNob3VsZCBiZSByZXNldCgpIGFmdGVyIHRoZSAiYmF0Y2giIG9mIHJlY29uY2lsaW5nIGlzCi0JICogZmluaXNoZWQuCi0JICovCi0JcHJpdmF0ZSBIYXNoU2V0IGZQYXJ0aXRpb25UeXBlcyA9IG51bGw7Ci0KLQlwdWJsaWMgU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAoKSB7Ci0JCXN1cGVyKCk7Ci0JCWZQYXJ0aXRpb25UeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0JfQotCi0JcHVibGljIFJlY29uY2lsZUFubm90YXRpb25LZXkgY3JlYXRlS2V5KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIGludCBzY29wZSkgewotCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihzZFJlZ2lvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gKHRyICE9IG51bGwpID8gdHIuZ2V0VHlwZSgpIDogSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OOwotCQlyZXR1cm4gY3JlYXRlS2V5KHBhcnRpdGlvblR5cGUsIHNjb3BlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gc2RSZWdpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVHlwZWRSZWdpb24gdHIgPSBudWxsOwotCQlpZiAoIXNkUmVnaW9uLmlzRGVsZXRlZCgpKQotCQkJdHIgPSBnZXRQYXJ0aXRpb24oc2RSZWdpb24uZ2V0UGFyZW50RG9jdW1lbnQoKSwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCXJldHVybiB0cjsKLQl9Ci0KLQlwcml2YXRlIElUeXBlZFJlZ2lvbiBnZXRQYXJ0aXRpb24oSURvY3VtZW50IGRvYywgaW50IG9mZnNldCkgewotCQlJVHlwZWRSZWdpb24gdHIgPSBudWxsOwotCQkvLyBub3Qgc3VyZSB3aHkgZG9jdW1lbnQgd291bGQgZXZlciBiZSBudWxsLCBidXQgcHV0IGluIHRoaXMgCi0JCS8vIGd1YXJkIGZvciAKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg2MDY5Ci0JCWlmIChkb2MgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0ciA9IFRleHRVdGlsaXRpZXMuZ2V0UGFydGl0aW9uKGRvYywgSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORywgb2Zmc2V0LCBmYWxzZSk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJaWYgKERFQlVHKQotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGdldHRpbmcgcGFydGl0aW9uIGF0OiAiICsgb2Zmc2V0LCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiB0cjsKLQl9Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCB1c2UgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGFubm90YXRpb24ga2V5cyBhcyBpdAotCSAqIHJlZ2lzdGVycyB0aGUga2V5IGZvciByZW1vdmFsIGxhdGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogQHBhcmFtIHNjb3BlCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGNyZWF0ZUtleShTdHJpbmcgcGFydGl0aW9uVHlwZSwgaW50IHNjb3BlKSB7Ci0JCWZQYXJ0aXRpb25UeXBlcy5hZGQocGFydGl0aW9uVHlwZSk7Ci0JCXJldHVybiBuZXcgUmVjb25jaWxlQW5ub3RhdGlvbktleSh0aGlzLCBwYXJ0aXRpb25UeXBlLCBzY29wZSk7Ci0JfQotCi0JcHJvdGVjdGVkIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJSURvY3VtZW50IGRvYyA9IG51bGw7Ci0JCUlSZWNvbmNpbGFibGVNb2RlbCByTW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAock1vZGVsIGluc3RhbmNlb2YgRG9jdW1lbnRBZGFwdGVyKSB7Ci0JCQlkb2MgPSAoKERvY3VtZW50QWRhcHRlcikgck1vZGVsKS5nZXREb2N1bWVudCgpOwotCQl9Ci0JCXJldHVybiBkb2M7Ci0JfQotCi0JcHVibGljIElSZWNvbmNpbGFibGVNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGdldElucHV0TW9kZWwoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFBhcnRpdGlvblR5cGUoSURvY3VtZW50IGRvYywgaW50IG9mZnNldCkgewotCQlJVHlwZWRSZWdpb24gdHIgPSBnZXRQYXJ0aXRpb24oZG9jLCBvZmZzZXQpOwotCQlyZXR1cm4gKHRyICE9IG51bGwpID8gdHIuZ2V0VHlwZSgpIDogSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRQYXJ0aXRpb25UeXBlcygpIHsKLQkJLy8gdXNpbmcgaGFzaCBzZXQgdG8gYXV0b21hdGljYWxseSBnZXQgcmlkIG9mIGR1cGVzCi0JCUhhc2hTZXQgdGVtcFJlc3VsdHMgPSBuZXcgSGFzaFNldCgpOwotCQkvLyBhZGQgdGhlc2UgcGFydGl0aW9uIHR5cGVzCi0JCXRlbXBSZXN1bHRzLmFkZEFsbChmUGFydGl0aW9uVHlwZXMpOwotCQlyZXR1cm4gKFN0cmluZ1tdKSB0ZW1wUmVzdWx0cy50b0FycmF5KG5ldyBTdHJpbmdbdGVtcFJlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50IHNEb2MgPSBudWxsOwotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlzRG9jID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGdldERvY3VtZW50KCk7Ci0JCXJldHVybiBzRG9jOwotCX0KLQotCS8qKgotCSAqIFJlbW92ZXMgZHVwbGljYXRlcy4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzdWx0czEKLQkgKiBAcGFyYW0gcmVzdWx0czIKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIElSZWNvbmNpbGVSZXN1bHRbXSBtZXJnZShJUmVjb25jaWxlUmVzdWx0W10gcmVzdWx0czEsIElSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzMikgewotCQlpZiAocmVzdWx0czEgPT0gbnVsbCkKLQkJCXJldHVybiByZXN1bHRzMjsKLQkJaWYgKHJlc3VsdHMyID09IG51bGwpCi0JCQlyZXR1cm4gcmVzdWx0czE7Ci0KLQkJTGlzdCByZXN1bHRzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXN1bHRzLmFkZEFsbChBcnJheXMuYXNMaXN0KHJlc3VsdHMxKSk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0czIubGVuZ3RoOyBpKyspIHsKLQkJCXJlc3VsdHMuYWRkKHJlc3VsdHMyW2ldKTsKLQkJfQotCQlyZXR1cm4gKElSZWNvbmNpbGVSZXN1bHRbXSkgcmVzdWx0cy50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W3Jlc3VsdHMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuQWJzdHJhY3RSZWNvbmNpbGVTdGVwI3JlY29uY2lsZU1vZGVsKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbiwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwcm90ZWN0ZWQgSVJlY29uY2lsZVJlc3VsdFtdIHJlY29uY2lsZU1vZGVsKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQlyZXR1cm4gRU1QVFlfUkVDT05DSUxFX1JFU1VMVF9TRVQ7Ci0JfQotCi0JLyoqCi0JICogUmVsZWFzZSByZXNvdXJjZXMgdXNlZCBieSB0aGUgc3RlcCBoZXJlIGFzIG5lZWRlZC4gQmUgc3VyZSB0byBjYWxsCi0JICogc3VwZXIucmVsZWFzZSgpIHdoZW4geW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGFzIHRvIHByb3BhZ2F0ZSB0aGUKLQkgKiByZWxlYXNlIHRocm91Z2ggYWxsIHN0ZXBzLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIAotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlZ2lvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzBmMzk3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFJlZ2lvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExpZmVjeWNsZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci0KLS8qKgotICogQW4gSVN0cnVjdHVyZWRNb2RlbCBhd2FyZSBSZWdpb24gUHJvY2Vzc29yLiBBZGRzIE1vZGVsTGlmZWN5Y2xlIGxpc3RlbmVyLgotICogTW9kZWxMaWZlY3ljbGUgbGlzdGVuZXIgbm90aWZpZXMgdXMgdGhhdCBzb21lIHJlaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8KLSAqIHRha2UgcGxhY2UuCi0gKiAKLSAqIE1vZGVsIGF3YXJlICJwcm9jZXNzKCkiIEltcGxlbWVudHMgYSBJbmRleGVkUmVnaW9uLWJhc2VkICJjb250YWlucygpIgotICogbWV0aG9kIHVzaW5nIElTdHJ1Y3R1cmVkTW9kZWwuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRSZWdpb25Qcm9jZXNzb3IgZXh0ZW5kcyBEb2N1bWVudFJlZ2lvblByb2Nlc3NvciB7Ci0KLQljbGFzcyBNb2RlbExpZmVjeWNsZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIgewotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIjcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5Nb2RlbExpZmVjeWNsZUV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcHJvY2Vzc1Bvc3RNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQotCQkJLy8gaWYgdW5kZXJseWluZyBTdHJ1Y3R1cmVkRG9jdW1lbnQgY2hhbmdlZCwgbmVlZCB0byByZWNvbm5lY3QgaXQKLQkJCS8vIGhlcmUuLi4KLQkJCS8vIGV4LiBmaWxlIGlzIG1vZGlmaWVkIG91dHNpZGUgdGhlIHdvcmtiZW5jaAotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX0RPQ1VNRU5UX0NIQU5HRUQpIHsKLQotCQkJCS8vIGNoZWNrIHRoYXQgaXQncyB0aGlzIG1vZGVsIHRoYXQgY2hhbmdlZAotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgdGhpc01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCQl0cnkgewotCQkJCQlpZiAodGhpc01vZGVsICE9IG51bGwgJiYgZXZlbnQuZ2V0TW9kZWwoKS5lcXVhbHModGhpc01vZGVsKSkgewotCi0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHNEb2MgPSBldmVudC5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJTdHJ1Y3R1cmVkUmVnaW9uUHJvY2Vzc29yOiBET0NVTUVOVCBNT0RFTCBDSEFOR0VEIFRPOiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbihzRG9jLmdldCgpKTsKLQkJCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlzZXREb2N1bWVudChzRG9jKTsKLQkJCQkJCS8vIHByb3BhZ2F0ZSBkb2N1bWVudCBjaGFuZ2UKLQkJCQkJCS8vIHNldERvY3VtZW50T25BbGxTdHJhdGVnaWVzKHNEb2MpOwotCQkJCQkJLy8gZW5zdXJlIHRoYXQgdGhlIGRvY3VtZW50IGlzIHJlLXJlY29uY2lsZWQKLQkJCQkJCXNldEVudGlyZURvY3VtZW50RGlydHkoc0RvYyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmICh0aGlzTW9kZWwgIT0gbnVsbCkKLQkJCQkJCXRoaXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIjcHJvY2Vzc1ByZU1vZGVsRXZlbnQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLk1vZGVsTGlmZWN5Y2xlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwcm9jZXNzUHJlTW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0KLQkJCWlmIChldmVudC5nZXRUeXBlKCkgPT0gTW9kZWxMaWZlY3ljbGVFdmVudC5NT0RFTF9ET0NVTUVOVF9DSEFOR0VEKSB7Ci0KLQkJCQlmbHVzaERpcnR5UmVnaW9uUXVldWUoKTsKLQkJCQkvLyBub3RlOiBvbGQgYW5ub3RhdGlvbnMgYXJlIHJlbW92ZWQgdmlhIHRoZSBzdHJhdGVnaWVzIG9uCi0JCQkJLy8gQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kjc2V0RG9jdW1lbnQoLi4uKQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciBmTGlmZUN5Y2xlTGlzdGVuZXIgPSBuZXcgTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5EaXJ0eVJlZ2lvblByb2Nlc3NvciNnZXRPdXRlclJlZ2lvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24pCi0JICovCi0JcHJvdGVjdGVkIERpcnR5UmVnaW9uIGdldE91dGVyUmVnaW9uKERpcnR5UmVnaW9uIHJvb3QsIERpcnR5UmVnaW9uIHBvc3NpYmxlKSB7Ci0JCS8vIGZpcnN0IHRyeSBzaW1wbGUgcmVnaW9uIGNoZWNrIGlmIG9uZSByZWdpb24gY29udGFpbnMgdGhlIG90aGVyCi0JCURpcnR5UmVnaW9uIG91dGVyID0gc3VwZXIuZ2V0T3V0ZXJSZWdpb24ocm9vdCwgcG9zc2libGUpOwotCQlpZiAob3V0ZXIgPT0gbnVsbCkgewotCQkJLy8gbm93IGNvbXBhcmUgbm9kZXMKLQkJCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCUluZGV4ZWRSZWdpb24gcm9vdFJlZ2lvbiA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJvb3QuZ2V0T2Zmc2V0KCkpOwotCQkJCQlJbmRleGVkUmVnaW9uIHBvc3NSZWdpb24gPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihwb3NzaWJsZS5nZXRPZmZzZXQoKSk7Ci0JCQkJCWlmIChyb290UmVnaW9uICE9IG51bGwgJiYgcG9zc1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgcm9vdFN0YXJ0ID0gcm9vdFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJaW50IHBvc3NTdGFydCA9IHBvc3NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCS8vIGZpcnN0IGp1c3QgY2hlY2sgaWYgcm9vdHJlZ2lvbiBzdGFydHMgYmVmb3JlCi0JCQkJCQkvLyBwb3NzcmVnaW9uCi0JCQkJCQlpZiAocm9vdFN0YXJ0IDw9IHBvc3NTdGFydCkgewotCQkJCQkJCS8vIGNoZWNrIGlmIHBvc3NyZWdpb24gaXMgaW5zaWRlIHJvb3RyZWdpb24KLQkJCQkJCQlvdXRlciA9IF9nZXRPdXRlclJlZ2lvbihyb290LCBwb3NzaWJsZSwgc01vZGVsLCByb290U3RhcnQsIHBvc3NTdGFydCk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQkvLyBvdGhlcndpc2UgaWYgcm9vdHJlZ2lvbiBpcyBpbnNpZGUgcG9zc3JlZ2lvbgotCQkJCQkJCW91dGVyID0gX2dldE91dGVyUmVnaW9uKHBvc3NpYmxlLCByb290LCBzTW9kZWwsIHBvc3NTdGFydCwgcm9vdFN0YXJ0KTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBvdXRlcjsKLQl9Ci0KLQkvKioKLQkgKiBBc3N1bWVzIHRoYXQgd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQsIHJlZ2lvbjEncyBub2RlIHN0YXJ0IG9mZnNldCA+PQotCSAqIHJlZ2lvbjIncyBub2RlIHN0YXJ0IG9mZnNldC4gRGV0ZXJtaW5lcyBpZiByZWdpb24xIGNvbnRhaW5zIHJlZ2lvbjIgb3IKLQkgKiB2aWNlIHZlcnNhLiBSZXR1cm5zIHJlZ2lvbjEgaWY6Ci0JICogPHVsPgotCSAqIDxsaT5yZWdpb24xJ3Mgbm9kZSByZWdpb24gPT0gcmVnaW9uMidzIG5vZGUgcmVnaW9uPC9saT4KLQkgKiA8bGk+cmVnaW9uMSdzIG5vZGUgcmVnaW9uIGNvbnRhaW5zIHJlZ2lvbjIncyBub2RlIHJlZ2lvbjwvbGk+Ci0JICogPC91bD4KLQkgKiBSZXR1cm5zIHJlZ2lvbjIgaWY6Ci0JICogPHVsPgotCSAqIDxsaT5yZWdpb24xJ3Mgbm9kZSByZWdpb24gYW5kIHJlZ2lvbjIncyBub2RlIHJlZ2lvbiBzdGFydHMgYXQgc2FtZQotCSAqIG9mZnNldCBidXQgcmVnaW9uMidzIG5vZGUgcmVnaW9uIGlzIGxvbmdlcjwvbGk+Ci0JICogPC91bD4KLQkgKiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBwYXJhbSByZWdpb24xCi0JICogQHBhcmFtIHJlZ2lvbjIKLQkgKiBAcGFyYW0gc01vZGVsCi0JICogQHBhcmFtIHJlZ2lvbjFOb2RlU3RhcnQKLQkgKiBAcGFyYW0gcmVnaW9uMk5vZGVTdGFydAotCSAqIEByZXR1cm4gb3V0ZXIgZGlydHkgcmVnaW9uIG9yIG51bGwgaWYgbm9uZSBleGlzdHMuCi0JICovCi0JcHJpdmF0ZSBEaXJ0eVJlZ2lvbiBfZ2V0T3V0ZXJSZWdpb24oRGlydHlSZWdpb24gcmVnaW9uMSwgRGlydHlSZWdpb24gcmVnaW9uMiwgSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwsIGludCByZWdpb24xTm9kZVN0YXJ0LCBpbnQgcmVnaW9uMk5vZGVTdGFydCkgewotCQlEaXJ0eVJlZ2lvbiBvdXRlciA9IG51bGw7Ci0JCWludCByZWdpb24xTm9kZUVuZCA9IC0xOwotCQlpbnQgcmVnaW9uMk5vZGVFbmQgPSAtMTsKLQkJLy8gdGhlbiBjaGVjayBpZiByZWdpb24xJ3MgZW5kIGFwcGVhcnMgYWZ0ZXIKLQkJLy8gcmVnaW9uMidzIGVuZAotCQlJbmRleGVkUmVnaW9uIHJlZ2lvbjFFbmROb2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ocmVnaW9uMS5nZXRPZmZzZXQoKSArIHJlZ2lvbjEuZ2V0TGVuZ3RoKCkpOwotCQlpZiAocmVnaW9uMUVuZE5vZGUgPT0gbnVsbCkgewotCQkJLy8gaWYgbm8gZW5kLCBqdXN0IGFzc3VtZSByZWdpb24gc3BhbnMgYWxsIHRoZQotCQkJLy8gd2F5IHRvIHRoZSBlbmQgc28gaXQgaW5jbHVkZXMgb3RoZXIgcmVnaW9uCi0JCQlvdXRlciA9IHJlZ2lvbjE7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZWdpb24xTm9kZUVuZCA9IHJlZ2lvbjFFbmROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJSW5kZXhlZFJlZ2lvbiByZWdpb24yRW5kTm9kZSA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHJlZ2lvbjIuZ2V0T2Zmc2V0KCkgKyByZWdpb24yLmdldExlbmd0aCgpKTsKLQkJCXJlZ2lvbjJOb2RlRW5kID0gcmVnaW9uMkVuZE5vZGUgIT0gbnVsbCA/IHJlZ2lvbjJFbmROb2RlLmdldEVuZE9mZnNldCgpIDogZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKTsKLQkJCWlmIChyZWdpb24xTm9kZUVuZCA+PSByZWdpb24yTm9kZUVuZCkgewotCQkJCS8vIHJvb3QgY29udGFpbnMgb3IgaXMgZXF1YWwgdG8gcG9zc2libGUKLQkJCQlvdXRlciA9IHJlZ2lvbjE7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24xTm9kZVN0YXJ0ID09IHJlZ2lvbjJOb2RlU3RhcnQgJiYgcmVnaW9uMk5vZGVFbmQgPj0gcmVnaW9uMU5vZGVFbmQpIHsKLQkJCQkvLyBwb3NzaWJsZSBjb250YWlucyByb290IGJlY2F1c2UgdGhleQotCQkJCS8vIGJvdGggc3RhcnQgYXQgc2FtZSBwbGFjZSBidXQgcG9zc2libGUKLQkJCQkvLyBpcyBsb25nZXIKLQkJCQlvdXRlciA9IHJlZ2lvbjI7Ci0JCQl9Ci0JCX0KLQkJaWYgKERFQlVHKSB7Ci0JCQlpZiAob3V0ZXIgIT0gbnVsbCkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW5nIGlmIFsiICsgcmVnaW9uMU5vZGVTdGFydCArICI6IiArIHJlZ2lvbjFOb2RlRW5kICsgIl0gY29udGFpbnMgWyIgKyByZWdpb24yTm9kZVN0YXJ0ICsgIjoiICsgcmVnaW9uMk5vZGVFbmQgKyAiXSAuLi4gIiArIG91dGVyLnRvU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCWVsc2UKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoZWNraW5nIGlmIFsiICsgcmVnaW9uMU5vZGVTdGFydCArICI6IiArIHJlZ2lvbjFOb2RlRW5kICsgIl0gY29udGFpbnMgWyIgKyByZWdpb24yTm9kZVN0YXJ0ICsgIjoiICsgcmVnaW9uMk5vZGVFbmQgKyAiXSAuLi4gTk8gQ09OVEFJTiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJfQotCQlyZXR1cm4gb3V0ZXI7Ci0JfQotCi0JLyoqCi0JICogV2UgYWxyZWFkeSBrbm93IGNvbnRlbnQgdHlwZSBmcm9tIHdoZW4gd2UgY3JlYXRlZCB0aGUgbW9kZWwsIHNvIGp1c3QKLQkgKiB1c2UgdGhhdC4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldENvbnRlbnRUeXBlKElEb2N1bWVudCBkb2MpIHsKLQotCQlTdHJpbmcgY29udGVudFR5cGVJZCA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jKTsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRUeXBlSWQgPSBzTW9kZWwuZ2V0Q29udGVudFR5cGVJZGVudGlmaWVyKCk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JCXJldHVybiBjb250ZW50VHlwZUlkOwotCX0KLQotCi0JLyoqCi0JICogUmVtZW1iZXIgdG8gcmVsZWFzZSBtb2RlbCBhZnRlciB1c2UhIQotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkTW9kZWwgZ2V0U3RydWN0dXJlZE1vZGVsRm9yUmVhZChJRG9jdW1lbnQgZG9jKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJaWYgKGRvYyAhPSBudWxsKQotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2MpOwotCQlyZXR1cm4gc01vZGVsOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBkb2N1bWVudAotCSAqLwotCXByaXZhdGUgdm9pZCBob29rVXBNb2RlbExpZmVjeWNsZUxpc3RlbmVyKElEb2N1bWVudCBkb2N1bWVudCkgewotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQl0cnkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJc01vZGVsLmFkZE1vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoZkxpZmVDeWNsZUxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uKSB7Ci0JCWlmIChnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gdXNlIHN0cnVjdHVyZWQgbW9kZWwgdG8gZGV0ZXJtaW5lIGFyZWEgdG8gcHJvY2VzcwotCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0RG9jdW1lbnQoKSk7Ci0JCXRyeSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQlpbnQgc3RhcnQgPSBkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kID0gc3RhcnQgKyBkaXJ0eVJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQlJbmRleGVkUmVnaW9uIGlyU3RhcnQgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydCk7Ci0JCQkJSW5kZXhlZFJlZ2lvbiBpckVuZCA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKGVuZCk7Ci0KLQkJCQlpZiAoaXJTdGFydCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0ID0gTWF0aC5taW4oc3RhcnQsIGlyU3RhcnQuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJfQotCQkJCWlmIChpckVuZCAhPSBudWxsKSB7Ci0JCQkJCWVuZCA9IE1hdGgubWF4KGVuZCwgaXJFbmQuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJCX0KLQkJCQlzdXBlci5wcm9jZXNzKGNyZWF0ZURpcnR5UmVnaW9uKHN0YXJ0LCBlbmQgLSBzdGFydCwgRGlydHlSZWdpb24uSU5TRVJUKSk7Ci0JCQl9Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVpbml0aWFsaXplcyBsaXN0ZW5lcnMgYW5kIHNldHMgbmV3IGRvY3VtZW50IG9uYWxsIHN0cmF0ZWdpZXMuCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuQWJzdHJhY3RSZWNvbmNpbGVyI3JlY29uY2lsZXJEb2N1bWVudENoYW5nZWQoSURvY3VtZW50KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlY29uY2lsZXJEb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG5ld0RvY3VtZW50KSB7Ci0KLQkJSURvY3VtZW50IGN1cnJlbnREb2MgPSBnZXREb2N1bWVudCgpOwotCi0JCS8vIHVuaG9vayBvbGQgbGlmZWN5Y2xlIGxpc3RuZXIKLQkJdW5ob29rTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihjdXJyZW50RG9jKTsKLQkJLy8gYWRkIG5ldyBsaWZlY3ljbGUgbGlzdGVuZXIKLQkJaWYgKG5ld0RvY3VtZW50ICE9IG51bGwpCi0JCQlob29rVXBNb2RlbExpZmVjeWNsZUxpc3RlbmVyKG5ld0RvY3VtZW50KTsKLQotCQlzdXBlci5yZWNvbmNpbGVyRG9jdW1lbnRDaGFuZ2VkKG5ld0RvY3VtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgdW5ob29rTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBnZXRTdHJ1Y3R1cmVkTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVtb3ZlTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcihmTGlmZUN5Y2xlTGlzdGVuZXIpOwotCi0JCX0KLQkJZmluYWxseSB7Ci0JCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCi0JCS8vIHJlbW92ZXMgbW9kZWwgbGlzdGVuZXJzCi0JCXVuaG9va01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoZ2V0RG9jdW1lbnQoKSk7Ci0JCXN1cGVyLnVuaW5zdGFsbCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1N0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2VlZmQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0KLS8qKgotICogVXNlcyBJU3RydWN0dXJlZE1vZGVsIG5vZGVzIHRvIGNoZWNrICJvdmVybGFwcygpIiB3aGVuIGdldHRpbmcgYW5ub3RhdGlvbnMgdG8gcmVtb3ZlLgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kgewotCQotCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneShJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlzdXBlcihzb3VyY2VWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyBpZiB0aGlzIHBvc2l0aW9uIG92ZXJsYXBzIGFueSBvZiB0aGUgU3RydWN0dXJlZERvY3VtZW50IHJlZ2lvbnMnCi0JICogY29ycmVzdHBvbmRpbmcgSW5kZXhlZFJlZ2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gcG9zCi0JICogQHBhcmFtIGRyCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwb3NpdGlvbiBvdmVybGFwcyBhbnkgb2YgdGhlIHJlZ2lvbnMsIG90aGVyd2lzZQotCSAqICAgICAgICAgZmFsc2UuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gb3ZlcmxhcHMoUG9zaXRpb24gcG9zLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uW10gc2RSZWdpb25zKSB7Ci0JCWludCBzdGFydCA9IC0xOwotCQlpbnQgZW5kID0gLTE7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2RSZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCSAgICBpZighc2RSZWdpb25zW2ldLmlzRGVsZXRlZCgpKSB7Ci0gICAgCQkJSW5kZXhlZFJlZ2lvbiBjb3JyZXNwb25kaW5nID0gZ2V0Q29ycmVzcG9uZGluZ05vZGUoc2RSZWdpb25zW2ldKTsKLSAgICAgICAgICAgICAgICBpZihjb3JyZXNwb25kaW5nICE9IG51bGwpIHsKLSAgICAgICAgCQkJaWYgKHN0YXJ0ID09IC0xIHx8IHN0YXJ0ID4gY29ycmVzcG9uZGluZy5nZXRTdGFydE9mZnNldCgpKQotICAgICAgICAJCQkJc3RhcnQgPSBjb3JyZXNwb25kaW5nLmdldFN0YXJ0T2Zmc2V0KCk7Ci0gICAgICAgIAkJCWlmIChlbmQgPT0gLTEgfHwgZW5kIDwgY29ycmVzcG9uZGluZy5nZXRFbmRPZmZzZXQoKSkKLSAgICAgICAgCQkJCWVuZCA9IGNvcnJlc3BvbmRpbmcuZ2V0RW5kT2Zmc2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCQl9Ci0JCXJldHVybiBwb3Mub3ZlcmxhcHNXaXRoKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBub2RlIGZvciB0aGUgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLgotCSAqIAotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbm9kZSBmb3Igc2RSZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDb3JyZXNwb25kaW5nTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLSAgICAgICAgSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzTW9kZWwgIT0gbnVsbCkgCi0gICAgICAgICAgICAgICAgaW5kZXhlZFJlZ2lvbiA9IHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0KCkpOyAgICAKLSAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgIGlmIChzTW9kZWwgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICBzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL1RlbXBvcmFyeUFubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMWEwNWM4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvVGVtcG9yYXJ5QW5ub3RhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25BY2Nlc3NFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25QcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSW1hZ2VVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuR0M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ2FudmFzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC5FZGl0b3JzVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Bbm5vdGF0aW9uUHJlZmVyZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVRlbXBvcmFyeUFubm90YXRpb247Ci0KLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBJVGVtcG9yYXJ5QW5ub3RhdGlvbiBACi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgVGVtcG9yYXJ5QW5ub3RhdGlvbiBleHRlbmRzIEFubm90YXRpb24gaW1wbGVtZW50cyBJVGVtcG9yYXJ5QW5ub3RhdGlvbiwgSVJlY29uY2lsZVJlc3VsdCwgSUFubm90YXRpb25QcmVzZW50YXRpb24gewotCS8vIHJlbWVtYmVyIHRvIGNoYW5nZSB0aGVzZSBpZiBpdCBjaGFuZ2VzIGluIHRoZSBleHRlbnNpb24gcG9pbnQKLQkvLyBtYXkgbmVlZCBhIGRpZmZlcmVudCBob21lIGZvciB0aGVtIGluIHRoZSBmdXR1cmUsIGJ1dCB0aGV5J3JlIGhlcmUgZm9yCi0JLy8gbm93Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RfRVJST1IgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLmVycm9yIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEFOTk9UX0lORk8gPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLmluZm8iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBwYV9UT0RPIHdoYXQgc2hvdWxkIHRoZSBJRCBiZSBmb3IgdGhpcz8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBBTk5PVF9VTktOT1dOID0gQW5ub3RhdGlvbi5UWVBFX1VOS05PV047Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQU5OT1RfV0FSTklORyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAud2FybmluZyI7IC8vJE5PTi1OTFMtMSQKLQotICAgIC8vIGNvcGllZCBmcm9tIENvbXBpbGF0aW9uVW5pdERvY3VtZW50UHJvdmlkZXIuUHJvYmxlbUFubm90YXRpb24KLSAgICAvL1hYWDogVG8gYmUgZnVsbHkgY29ycmVjdCB0aGVzZSBjb25zdGFudHMgc2hvdWxkIGJlIG5vbi1zdGF0aWMKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTkZPX0xBWUVSOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfTEFZRVI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfTEFZRVI7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBBbm5vdGF0aW9uUHJlZmVyZW5jZUxvb2t1cCBsb29rdXA9IEVkaXRvcnNVSS5nZXRBbm5vdGF0aW9uUHJlZmVyZW5jZUxvb2t1cCgpOwotICAgICAgICBJTkZPX0xBWUVSPSBjb21wdXRlTGF5ZXIoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5pbmZvIiwgbG9va3VwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBXQVJOSU5HX0xBWUVSPSBjb21wdXRlTGF5ZXIoIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC53YXJuaW5nIiwgbG9va3VwKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBFUlJPUl9MQVlFUj0gY29tcHV0ZUxheWVyKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuZXJyb3IiLCBsb29rdXApOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGludCBjb21wdXRlTGF5ZXIoU3RyaW5nIGFubm90YXRpb25UeXBlLCBBbm5vdGF0aW9uUHJlZmVyZW5jZUxvb2t1cCBsb29rdXApIHsKLSAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uPSBuZXcgQW5ub3RhdGlvbihhbm5vdGF0aW9uVHlwZSwgZmFsc2UsIG51bGwpOwotICAgICAgICBBbm5vdGF0aW9uUHJlZmVyZW5jZSBwcmVmZXJlbmNlPSBsb29rdXAuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYW5ub3RhdGlvbik7Ci0gICAgICAgIGlmIChwcmVmZXJlbmNlICE9IG51bGwpCi0gICAgICAgICAgICByZXR1cm4gcHJlZmVyZW5jZS5nZXRQcmVzZW50YXRpb25MYXllcigpICsgMTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcmV0dXJuIElBbm5vdGF0aW9uQWNjZXNzRXh0ZW5zaW9uLkRFRkFVTFRfTEFZRVIgKyAxOwotICAgIH0KLSAgICAKLSAgICAKLQlwcml2YXRlIE9iamVjdCBmQWRkaXRpb25hbEZpeEluZm8gPSBudWxsOwotCi0JcHJpdmF0ZSBPYmplY3QgZktleSA9IG51bGw7Ci0JcHJpdmF0ZSBQb3NpdGlvbiBmUG9zaXRpb24gPSBudWxsOwotCi0JcHJpdmF0ZSBpbnQgZlByb2JsZW1JRDsKLQotICAgIHByaXZhdGUgaW50IGZMYXllciA9IERFRkFVTFRfTEFZRVI7Ci0gICAgCi0gICAgcHJpdmF0ZSBJbWFnZSBmSW1hZ2UgPSBudWxsOwotCi0JcHVibGljIFRlbXBvcmFyeUFubm90YXRpb24oUG9zaXRpb24gcCwgU3RyaW5nIHR5cGUsIFN0cmluZyBtZXNzYWdlLCBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSkgewotCQlzdXBlcigpOwotCQlmUG9zaXRpb24gPSBwOwotCQlzZXRUeXBlKHR5cGUpOwotCQlmS2V5ID0ga2V5OwotCQlzZXRUZXh0KG1lc3NhZ2UpOwotICAgICAgICBpbml0TGF5ZXIoKTsKLSAgICAgICAgaW5pdEltYWdlKCk7Ci0JfQotCi0JcHVibGljIFRlbXBvcmFyeUFubm90YXRpb24oUG9zaXRpb24gcCwgU3RyaW5nIHR5cGUsIFN0cmluZyBtZXNzYWdlLCBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSwgaW50IHByb2JsZW1JZCkgewotCQlzdXBlcigpOwotCQlmUG9zaXRpb24gPSBwOwotCQlmS2V5ID0ga2V5OwotCQlzZXRUeXBlKHR5cGUpOwotCQlzZXRUZXh0KG1lc3NhZ2UpOwotCQlmUHJvYmxlbUlEID0gcHJvYmxlbUlkOwotICAgICAgICBpbml0TGF5ZXIoKTsKLSAgICAgICAgaW5pdEltYWdlKCk7Ci0JfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRMYXllcigpIHsKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyB0eXBlID0gZ2V0VHlwZSgpOwotICAgICAgICBpZih0eXBlLmVxdWFscyhBTk5PVF9FUlJPUikpIHsKLSAgICAgICAgICAgIGZMYXllciA9IEVSUk9SX0xBWUVSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYodHlwZS5lcXVhbHMoQU5OT1RfV0FSTklORykpIHsKLSAgICAgICAgICAgIGZMYXllciA9IFdBUk5JTkdfTEFZRVI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih0eXBlLmVxdWFscyhBTk5PVF9JTkZPKSkgewotICAgICAgICAgICAgZkxheWVyID0gSU5GT19MQVlFUjsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgaW5pdEltYWdlKCkgewotICAgICAgICAvLyBsYXRlciB3ZSBjYW4gYWRkIHN1cHBvcnQgZm9yIHF1aWNrIGZpeCBpbWFnZXMuCi0gICAgICAgIFN0cmluZyB0eXBlID0gZ2V0VHlwZSgpOwotICAgICAgICBpZih0eXBlLmVxdWFscyhBTk5PVF9FUlJPUikpIHsKLSAgICAgICAgICAgIGZJbWFnZSA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZih0eXBlLmVxdWFscyhBTk5PVF9XQVJOSU5HKSkgewotICAgICAgICAgICAgZkltYWdlID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmKHR5cGUuZXF1YWxzKEFOTk9UX0lORk8pKSB7Ci0gICAgICAgICAgICBmSW1hZ2UgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBqYXZhLmxhbmcuT2JqZWN0I2VxdWFscyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0JCS8vIHRoaXMgY2hlY2sgZG9lc24ndCB0YWtlIGludG8gY29uc2lkZXJhdGlvbiB0aGF0IGFubm90YXRpb24KLQkJLy8gcG9zaXRpb25zIHRoYXQgY2hhbmdlIGZyb20gYSB0ZXh0IGVkaXQgYmVmb3JlIGl0Ci0JCS8vIHdlIHNob3VsZCBiZSBjaGVja2luZyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBzdGlsbCBvbiB0aGUgc2FtZSBsaW5lLAotCQkvLyBhbmQgdGhlIGRpc3RhbmNlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIGlzIHRoZSBzYW1lCi0JCWlmIChvYmogaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0KLQkJCVRlbXBvcmFyeUFubm90YXRpb24gdGEgPSAoVGVtcG9yYXJ5QW5ub3RhdGlvbikgb2JqOwotCi0gICAgICAgICAgICBib29sZWFuIHNhbWVQb3NpdGlvbiA9IHRhLmdldFBvc2l0aW9uKCkuZXF1YWxzKHRoaXMuZ2V0UG9zaXRpb24oKSk7Ci0gICAgICAgICAgICBib29sZWFuIHNhbWVUZXh0ID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIGlmKHRhLmdldFRleHQoKSAhPSBudWxsICYmIHRoaXMuZ2V0VGV4dCgpICE9IG51bGwgJiYgdGEuZ2V0VGV4dCgpLmVxdWFscyh0aGlzLmdldFRleHQoKSkpCi0gICAgICAgICAgICAgICAgc2FtZVRleHQgPSB0cnVlOwotICAgICAgICAgICAgZWxzZSBpZih0YS5nZXRUZXh0KCApPT0gbnVsbCAmJiB0aGlzLmdldFRleHQoKSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHNhbWVUZXh0ID0gdHJ1ZTsKLSAgICAgICAgICAgIAotCQkJcmV0dXJuICBzYW1lVGV4dCAmJiBzYW1lUG9zaXRpb247Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOwotCX0KLQotCS8qKgotCSAqIEFkZGl0aW9uYWwgaW5mbyByZXF1aXJlZCB0byBmaXggdGhpcyBwcm9ibGVtLgotCSAqIAotCSAqIEByZXR1cm4gYW4gT2JqZWN0IHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvIG9uIGhvdyB0byBmaXggdGhpcwotCSAqICAgICAgICAgcHJvYmxlbSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBub25lCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRBZGRpdGlvbmFsRml4SW5mbygpIHsKLQkJcmV0dXJuIGZBZGRpdGlvbmFsRml4SW5mbzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuSVRlbXBvcmFyeUFubm90YXRpb24jZ2V0RGVzY3JpcHRpb24oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiBnZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIE9iamVjdCBnZXRLZXkoKSB7Ci0JCXJldHVybiBmS2V5OwotCX0KLQotCXB1YmxpYyBQb3NpdGlvbiBnZXRQb3NpdGlvbigpIHsKLQkJcmV0dXJuIGZQb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIHByb2JsZW1JRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFByb2JsZW1JRCgpIHsKLQkJcmV0dXJuIGZQcm9ibGVtSUQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uI2lzUGVyc2lzdGVudCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNQZXJzaXN0ZW50KCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHVzZWZ1bCB0byBmaXhpbmcgdGhpcyBwcm9ibGVtLgotCSAqIAotCSAqIEBwYXJhbSBhbgotCSAqICAgICAgICAgICAgT2JqZWN0IHRoYXQgY29udGFpbnMgYWRkaXRpb25hbCBpbmZvIG9uIGhvdyB0byBmaXggdGhpcwotCSAqICAgICAgICAgICAgcHJvYmxlbQotCSAqLwotCXB1YmxpYyB2b2lkIHNldEFkZGl0aW9uYWxGaXhJbmZvKE9iamVjdCBpbmZvKSB7Ci0JCWZBZGRpdGlvbmFsRml4SW5mbyA9IGluZm87Ci0JfQotCi0gICAgcHVibGljIGludCBnZXRMYXllcigpIHsKLSAgICAgICAgcmV0dXJuIGZMYXllcjsKLSAgICB9Ci0gICAgCi0gICAgLyoKLSAgICAgKiBAc2VlIEFubm90YXRpb24jcGFpbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYWludChHQyBnYywgQ2FudmFzIGNhbnZhcywgUmVjdGFuZ2xlIHIpIHsKLSAgICAgICAgLy9pbml0aWFsaXplSW1hZ2VzKCk7Ci0gICAgICAgIGlmIChmSW1hZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIEltYWdlVXRpbGl0aWVzLmRyYXdJbWFnZShmSW1hZ2UsIGdjLCBjYW52YXMsIHIsIFNXVC5DRU5URVIsIFNXVC5UT1ApOwotICAgIH0KLSAgICAKLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIiIgKyBmUG9zaXRpb24uZ2V0T2Zmc2V0KCkgKyAnOicgKyBmUG9zaXRpb24uZ2V0TGVuZ3RoKCkgKyAiOiAiICsgZ2V0VGV4dCgpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9Bbm5vdGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvQW5ub3RhdGlvbkluZm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5NDIwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9Bbm5vdGF0aW9uSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0vKioKLSAqIEhvbGRzIGluZm8gdG8gY3JlYXRlIGEgVGVtcG9yYXJ5QW5ub3RhdGlvbi4KLSAqCi0gKiBAc2luY2UgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uSW5mbyB7Ci0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTk9fUFJPQkxFTV9JRCA9IC0xOwotCXByaXZhdGUJSU1lc3NhZ2UgZk1lc3NhZ2UgPSBudWxsOwotCXByaXZhdGUgT2JqZWN0IGZBZGRpdGlvbmFsRml4SW5mbyA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlByb2JsZW1JZCA9IE5PX1BST0JMRU1fSUQ7Ci0JCi0JcHVibGljIEFubm90YXRpb25JbmZvKElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJZk1lc3NhZ2UgPSBtZXNzYWdlOwotCQkKLQl9Ci0JcHVibGljIEFubm90YXRpb25JbmZvKElNZXNzYWdlIG1lc3NhZ2UsIGludCBwcm9ibGVtSWQsIE9iamVjdCBhZGRpdGlvbmFsRml4SW5mbykgewotCQl0aGlzKG1lc3NhZ2UpOwotCQlmUHJvYmxlbUlkID0gcHJvYmxlbUlkOwotCQlmQWRkaXRpb25hbEZpeEluZm8gPSBhZGRpdGlvbmFsRml4SW5mbzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIElNZXNzYWdlIGdldE1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmTWVzc2FnZTsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIE9iamVjdCBnZXRBZGRpdGlvbmFsRml4SW5mbygpIHsKLQkJcmV0dXJuIGZBZGRpdGlvbmFsRml4SW5mbzsKLQl9Ci0JCi0JcHVibGljIGZpbmFsIGludCBnZXRQcm9ibGVtSWQoKSB7Ci0JCXJldHVybiBmUHJvYmxlbUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0lTb3VyY2VWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0lTb3VyY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUwOTk3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9JU291cmNlVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0aW9uQ29udGV4dDsKLQotLyoqCi0gKiBJbnRlcmZhY2UgdG8gYWxsb3cgZm9yICJwYXJ0aWFsIGRvY3VtZW50IiBhcyB5b3UgdHlwZSB2YWxpZGF0aW9uLgotICoKLSAqLwotcHVibGljIGludGVyZmFjZSBJU291cmNlVmFsaWRhdG9yIHsKLQkKLQkvKioKLQkgKiBBcyB5b3UgdHlwZSB2YWxpZGF0aW9uIGlzIGdldHRpbmcgImhvb2tlZCB1cCIgdG8gdGhpcyBJRG9jdW1lbnQuCi0JICogVGhpcyBpcyB0aGUgaW5zdGFuY2Ugb2YgSURvY3VtZW50IHRoYXQgdGhlIHZhbGlkYXRvciBzaG91bGQKLQkgKiBvcGVyYXRlIG9uIGZvciBlYWNoIHZhbGlkYXRlIGNhbGwuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICovCi0Jdm9pZCBjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCk7Ci0JCi0JLyoqCi0JICogVGhlIHNhbWUgSURvY3VtZW50IHBhc3NlZCBpbiBmcm9tIHRoZSBjb25uZWN0KCkgbWV0aG9kLgotCSAqIFRoaXMgaW5kaWNhdGVzIHRoYXQgYXMgeW91IHR5cGUgdmFsaWRhdGlvbiBpcyAic2h1dHRpbmcgZG93biIKLQkgKiBmb3IgdGhpcyBJRG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICovCi0Jdm9pZCBkaXNjb25uZWN0KElEb2N1bWVudCBkb2N1bWVudCk7Ci0JCi0JLyoqCi0JICogTGlrZSBJVmFsaWRhdG9yI3ZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikKLQkgKiBleGNlcHQgcGFzc2VzIHRoZSBkaXJ0eSByZWdpb24sIHNvIGRvY3VtZW50IHZhbGlkYXRpb24gY2FuIGJlIGJldHRlcgotCSAqIG9wdGltaXplZC4KLQkgKiAKLQkgKiBAcGFyYW0gZGlydHlSZWdpb24KLQkgKiBAcGFyYW0gaGVscGVyCi0JICogQHBhcmFtIHJlcG9ydGVyCi0JICovCi0Jdm9pZCB2YWxpZGF0ZShJUmVnaW9uIGRpcnR5UmVnaW9uLCBJVmFsaWRhdGlvbkNvbnRleHQgaGVscGVyLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0luY3JlbWVudGFsSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiM2NlMzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotCi0KLQotcHVibGljIGNsYXNzIEluY3JlbWVudGFsSGVscGVyIGltcGxlbWVudHMgSVZhbGlkYXRpb25Db250ZXh0IHsKLQlwcml2YXRlIElQcm9qZWN0IGZQcm9qZWN0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlVSSSA9IG51bGw7Ci0JCi0JcHVibGljIEluY3JlbWVudGFsSGVscGVyKElEb2N1bWVudCBzb3VyY2VEb2N1bWVudCwgSVByb2plY3QgcHJvamVjdCkgewotCQlzdXBlcigpOwotCQlmUHJvamVjdCA9IHByb2plY3Q7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKSB7Ci0JCXJldHVybiByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgSVByb2plY3QgZ2V0UHJvamVjdCgpIHsKLQkJcmV0dXJuIGZQcm9qZWN0OwotCX0KLQotCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdCBsb2FkTW9kZWwoU3RyaW5nIHN5bWJvbGljTmFtZSwgT2JqZWN0W10gcGFybXMpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0Jdm9pZCBzZXRVUkkoU3RyaW5nIHVyaSkgewotCQlmVVJJID0gdXJpOwotCX0KLQkKLQlwdWJsaWMgU3RyaW5nW10gZ2V0VVJJcygpIHsKLQkJaWYoZlVSSSAhPSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtmVVJJfTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbMF07Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxSZXBvcnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvSW5jcmVtZW50YWxSZXBvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjdkYWU3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL0luY3JlbWVudGFsUmVwb3J0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiBSaWdodCBub3cgd2UnbGwgb25seSB1c2Ugb25lIHJlcG9ydGVyIHBlciB2YWxpZGF0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBJbmNyZW1lbnRhbFJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQlwcml2YXRlIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvcjsKLQlwcml2YXRlIEhhc2hNYXAgbWVzc2FnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHVibGljIEluY3JlbWVudGFsUmVwb3J0ZXIoSVByb2dyZXNzTW9uaXRvciBwcm9ncmVzc01vbml0b3IpIHsKLQkJc3VwZXIoKTsKLQkJZlByb2dyZXNzTW9uaXRvciA9IHByb2dyZXNzTW9uaXRvcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJTWVzc2FnZSBtZXNzYWdlKSB7Ci0JCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSk7Ci0JCWFkZEFubm90YXRpb25JbmZvKHZhbGlkYXRvciwgaW5mbyk7Ci0JfQotCi0JcHVibGljIGZpbmFsIHZvaWQgYWRkQW5ub3RhdGlvbkluZm8oSVZhbGlkYXRvciB2YWxpZGF0b3IsIEFubm90YXRpb25JbmZvIGluZm8pIHsKLQkJT2JqZWN0IGV4aXN0aW5nVmFsdWUgPSBtZXNzYWdlcy5nZXQodmFsaWRhdG9yKTsKLQkJaWYgKGV4aXN0aW5nVmFsdWUgIT0gbnVsbCkgewotCQkJKChIYXNoU2V0KSBleGlzdGluZ1ZhbHVlKS5hZGQoaW5mbyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlIYXNoU2V0IG5ld1ZhbHVlID0gbmV3IEhhc2hTZXQoMSk7Ci0JCQluZXdWYWx1ZS5hZGQoaW5mbyk7Ci0JCQltZXNzYWdlcy5wdXQodmFsaWRhdG9yLCBuZXdWYWx1ZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwbGF5U3VidGFzayhJVmFsaWRhdG9yIHZhbGlkYXRvciwgSU1lc3NhZ2UgbWVzc2FnZSkgewotCQlpZiAoKG1lc3NhZ2UgPT0gbnVsbCkgfHwgKG1lc3NhZ2UuZXF1YWxzKCIiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChmUHJvZ3Jlc3NNb25pdG9yICE9IG51bGwpIHsKLQkJCWZQcm9ncmVzc01vbml0b3Iuc3ViVGFzayhtZXNzYWdlLmdldFRleHQodmFsaWRhdG9yLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkpOwotCQl9Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TWVzc2FnZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBtZXNzYWdlcyBpcyBhIGxpc3Qgb2Y6Ci0JCS8vIHZhbGlkYXRvcnMgPT4gSGFzaFNldChBbm5vdGF0aW9uSW5mbzEsIEFubm90YXRpb25JbmZvMiwgLi4uKQotCQkvLyAob25lIEhhc2hTZXQgcGVyIHZhbGlkYXRvci4uLikKLQkJT2JqZWN0W10gbGlzdHMgPSBtZXNzYWdlcy52YWx1ZXMoKS50b0FycmF5KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGlzdHMubGVuZ3RoOyBpKyspIHsKLQkJCUl0ZXJhdG9yIGl0ID0gKChIYXNoU2V0KWxpc3RzW2ldKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCUFubm90YXRpb25JbmZvIGluZm8gPSAoQW5ub3RhdGlvbkluZm8pIGl0Lm5leHQoKTsKLQkJCQlyZXN1bHQuYWRkKGluZm8uZ2V0TWVzc2FnZSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkKLQlwdWJsaWMgQW5ub3RhdGlvbkluZm9bXSBnZXRBbm5vdGF0aW9uSW5mbygpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCU9iamVjdFtdIGluZm9zID0gbWVzc2FnZXMudmFsdWVzKCkudG9BcnJheSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZm9zLmxlbmd0aDsgaSsrKSB7Ci0JCQlyZXN1bHQuYWRkQWxsKChIYXNoU2V0KWluZm9zW2ldKTsKLQkJfQotCQlyZXR1cm4gKEFubm90YXRpb25JbmZvW10pcmVzdWx0LnRvQXJyYXkobmV3IEFubm90YXRpb25JbmZvW3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKLQkJaWYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGZQcm9ncmVzc01vbml0b3IuaXNDYW5jZWxlZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IgdmFsaWRhdG9yKSB7Ci0JCU9iamVjdCBvID0gbWVzc2FnZXMuZ2V0KHZhbGlkYXRvcik7Ci0JCWlmKG8gIT0gbnVsbCAmJiBvIGluc3RhbmNlb2YgSGFzaFNldCkgewotCQkJKChIYXNoU2V0KW8pLmNsZWFyKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVBbGxNZXNzYWdlcyhJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iamVjdCkgewotCQlyZW1vdmVBbGxNZXNzYWdlcyh2YWxpZGF0b3IpOwotCX0KLQotCS8vIGdyb3VwIG5hbWVzIGFyZSB1bnN1cHBvcnRlZAotCXB1YmxpYyB2b2lkIHJlbW92ZU1lc3NhZ2VTdWJzZXQoSVZhbGlkYXRvciB2YWxpZGF0b3IsIE9iamVjdCBvYmosIFN0cmluZyBncm91cE5hbWUpIHsKLQkJcmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9SZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9SZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNmQzMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUudmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsYWJsZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5JUmVjb25jaWxlUmVzdWx0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlN0cnVjdHVyZWRSZWNvbmNpbGVTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiBBIHJlY29uY2lsZSBzdGVwIGZvciBhbiBJVmFsaWRhdG9yIGZvciByZWNvbmNpbGUuIFVzZWQgdGhlIHJlY29uY2lsZQotICogZnJhbWV3b3JrIHRvIGNyZWF0ZSBUZW1wb3JhcnlBbm5vdGF0aW9ucyBmcm9tIHRoZSB2YWxpZGF0b3IgbWVzc2FnZXMuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBSZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yIGV4dGVuZHMgU3RydWN0dXJlZFJlY29uY2lsZVN0ZXAgewotCi0JLyoqIGRlYnVnIGZsYWcgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUc7Ci0Jc3RhdGljIHsKLQkJU3RyaW5nIHZhbHVlID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC5zc2UudWkvZGVidWcvcmVjb25jaWxlcmpvYiIpOyAvLyROT04tTkxTLTEkCi0JCURFQlVHID0gdmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5lcXVhbHNJZ25vcmVDYXNlKCJ0cnVlIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIElSZWNvbmNpbGVSZXN1bHRbXSBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVCA9IG5ldyBJUmVjb25jaWxlUmVzdWx0WzBdOwotCXByaXZhdGUgSW5jcmVtZW50YWxIZWxwZXIgZkhlbHBlciA9IG51bGw7Ci0JcHJpdmF0ZSBJbmNyZW1lbnRhbFJlcG9ydGVyIGZSZXBvcnRlciA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgZlNjb3BlID0gLTE7Ci0JcHJpdmF0ZSBJVmFsaWRhdG9yIGZWYWxpZGF0b3IgPSBudWxsOwotCi0KLQlwdWJsaWMgUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvcihJVmFsaWRhdG9yIHYsIGludCBzY29wZSkgewotCQlzdXBlcigpOwotCi0JCWlmICh2ID09IG51bGwpCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2YWxpZGF0b3IgY2Fubm90IGJlIG51bGwiKTsgLy8kTk9OLU5MUy0xJAotCi0JCWZWYWxpZGF0b3IgPSB2OwotCQlmU2NvcGUgPSBzY29wZTsKLQl9Ci0KLQkvKioKLQkgKiBDb252ZXJ0cyBhIG1hcCBvZiBJVmFsaWRhdG9yRm9yUmVjb25jaWxlIHRvIExpc3QgdG8gYW5ub3RhdGlvbnMgYmFzZWQKLQkgKiBvbiB0aG9zZSBtZXNzYWdlcwotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlcwotCSAqIEByZXR1cm4KLQkgKi8KLS8vCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gY3JlYXRlQW5ub3RhdGlvbnMoTGlzdCBtZXNzYWdlTGlzdCkgewotLy8JCUxpc3QgYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0vLwkJZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlTGlzdC5zaXplKCk7IGkrKykgewotLy8JCQlJTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IChJTWVzc2FnZSkgbWVzc2FnZUxpc3QuZ2V0KGkpOwotLy8KLS8vCQkJaW50IG9mZnNldCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldE9mZnNldCgpOwotLy8KLS8vCQkJaWYgKG9mZnNldCA8IDApCi0vLwkJCQljb250aW51ZTsKLS8vCi0vLwkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IG51bGw7Ci0vLwkJCXRyeSB7Ci0vLwkJCQltZXNzYWdlVGV4dCA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFRleHQodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpKTsKLS8vCQkJfQotLy8JCQljYXRjaCAoRXhjZXB0aW9uIHQpIHsKLS8vCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImV4Y2VwdGlvbiByZXBvcnRpbmcgbWVzc2FnZSBmcm9tIHZhbGlkYXRvciIsIHQpOyAvLyROT04tTkxTLTEkCi0vLwkJCQljb250aW51ZTsKLS8vCQkJfQotLy8JCQkKLS8vCQkJU3RyaW5nIHR5cGUgPSBnZXRTZXZlcml0eSh2YWxpZGF0aW9uTWVzc2FnZSk7Ci0vLwkJCS8vIHRoaXMgcG9zaXRpb24gc2VlbXMgbGlrZSBpdCB3b3VsZCBiZSBwb3NzaWJseSBiZSB0aGUgd3JvbmcKLS8vCQkJLy8gbGVuZ3RoCi0vLwkJCWludCBsZW5ndGggPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRMZW5ndGgoKTsKLS8vCQkJaWYgKGxlbmd0aCA+PSAwKSB7Ci0vLwkJCQlQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKTsKLS8vCQkJCVJlY29uY2lsZUFubm90YXRpb25LZXkga2V5ID0gY3JlYXRlS2V5KGdldFBhcnRpdGlvblR5cGUoZ2V0RG9jdW1lbnQoKSwgb2Zmc2V0KSwgZ2V0U2NvcGUoKSk7Ci0vLwkJCQlhbm5vdGF0aW9ucy5hZGQobmV3IFRlbXBvcmFyeUFubm90YXRpb24ocCwgdHlwZSwgbWVzc2FnZVRleHQsIGtleSkpOwotLy8JCQl9Ci0vLwkJfQotLy8KLS8vCQlyZXR1cm4gKElSZWNvbmNpbGVSZXN1bHRbXSkgYW5ub3RhdGlvbnMudG9BcnJheShuZXcgSVJlY29uY2lsZVJlc3VsdFthbm5vdGF0aW9ucy5zaXplKCldKTsKLS8vCX0KLQotCS8qKgotCSAqIENvbnZlcnRzIGEgbWFwIG9mIElWYWxpZGF0b3JGb3JSZWNvbmNpbGUgdG8gTGlzdCB0byBhbm5vdGF0aW9ucyBiYXNlZAotCSAqIG9uIHRob3NlIG1lc3NhZ2VzCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VzCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gY3JlYXRlQW5ub3RhdGlvbnMoQW5ub3RhdGlvbkluZm9bXSBpbmZvcykgewotCQkKLQkKLQkJTGlzdCBhbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmZvcy5sZW5ndGg7IGkrKykgewotCQkJCi0JCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gaW5mb3NbaV07Ci0JCQkKLQkJCUlNZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gaW5mby5nZXRNZXNzYWdlKCk7Ci0JCQlpbnQgb2Zmc2V0ID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0T2Zmc2V0KCk7Ci0JCQlpZiAob2Zmc2V0IDwgMCkKLQkJCQljb250aW51ZTsKLQotCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gbnVsbDsKLQkJCXRyeSB7Ci0JCQkJbWVzc2FnZVRleHQgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRUZXh0KHZhbGlkYXRpb25NZXNzYWdlLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIHQpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJleGNlcHRpb24gcmVwb3J0aW5nIG1lc3NhZ2UgZnJvbSB2YWxpZGF0b3IiLCB0KTsgLy8kTk9OLU5MUy0xJAotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJU3RyaW5nIHR5cGUgPSBnZXRTZXZlcml0eSh2YWxpZGF0aW9uTWVzc2FnZSk7Ci0JCQkvLyB0aGlzIHBvc2l0aW9uIHNlZW1zIGxpa2UgaXQgd291bGQgYmUgcG9zc2libHkgYmUgdGhlIHdyb25nCi0JCQkvLyBsZW5ndGgKLQkJCWludCBsZW5ndGggPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRMZW5ndGgoKTsKLQkJCWlmIChsZW5ndGggPj0gMCkgewotCi0JCQkJUG9zaXRpb24gcCA9IG5ldyBQb3NpdGlvbihvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSBjcmVhdGVLZXkoZ2V0UGFydGl0aW9uVHlwZShnZXREb2N1bWVudCgpLCBvZmZzZXQpLCBnZXRTY29wZSgpKTsKLQkJCQkKLQkJCQlpZihpbmZvLmdldFByb2JsZW1JZCgpID09IEFubm90YXRpb25JbmZvLk5PX1BST0JMRU1fSUQpIHsKLQkJCQkJLy8gY3JlYXRlIGFuIGFubm90YXRpb24gdy8gbm8gZml4IGluZm8KLQkJCQkJYW5ub3RhdGlvbnMuYWRkKG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uKHAsIHR5cGUsIG1lc3NhZ2VUZXh0LCBrZXkpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIGNyZWF0ZSBhbiBhbm5vdGF0aW9uIHcvIHByb2JsZW0gSUQgYW5kIGZpeCBpbmZvCi0JCQkJCVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uKHAsIHR5cGUsIG1lc3NhZ2VUZXh0LCBrZXksIGluZm8uZ2V0UHJvYmxlbUlkKCkpOwotCQkJCQlhbm5vdGF0aW9uLnNldEFkZGl0aW9uYWxGaXhJbmZvKGluZm8uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSk7Ci0JCQkJCWFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJUmVjb25jaWxlUmVzdWx0W10pIGFubm90YXRpb25zLnRvQXJyYXkobmV3IElSZWNvbmNpbGVSZXN1bHRbYW5ub3RhdGlvbnMuc2l6ZSgpXSk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U2V2ZXJpdHkoSU1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UpIHsKLQkJU3RyaW5nIHR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX0lORk87Ci0JCXN3aXRjaCAodmFsaWRhdGlvbk1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSkgewotCQkJY2FzZSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZIDoKLQkJCQl0eXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUjsKLQkJCQlicmVhazsKLQkJCWNhc2UgSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZIDoKLQkJCQl0eXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HOwotCQkJCWJyZWFrOwotCQkJY2FzZSBJTWVzc2FnZS5MT1dfU0VWRVJJVFkgOgotCQkJCXR5cGUgPSBUZW1wb3JhcnlBbm5vdGF0aW9uLkFOTk9UX1dBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElNZXNzYWdlLkVSUk9SX0FORF9XQVJOSU5HIDoKLQkJCQl0eXBlID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiB0eXBlOwotCX0KLQkKLQlwcml2YXRlIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQlJRmlsZSBmaWxlID0gbnVsbDsKLQkJdHJ5IHsKLQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChnZXREb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQkJCS8vIFRoZSBiYXNlTG9jYXRpb24gbWF5IGJlIGEgcGF0aCBvbiBkaXNrIG9yIHJlbGF0aXZlIHRvIHRoZQotCQkJCS8vIHdvcmtzcGFjZSByb290LiBEb24ndCB0cmFuc2xhdGUgb24tZGlzayBwYXRocyB0bwotCQkJCS8vIGluLXdvcmtzcGFjZSByZXNvdXJjZXMuCi0JCQkJSVBhdGggYmFzZVBhdGggPSBuZXcgUGF0aChiYXNlTG9jYXRpb24pOwotCQkJCWlmIChiYXNlUGF0aC5zZWdtZW50Q291bnQoKSA+IDEgJiYgIWJhc2VQYXRoLnRvRmlsZSgpLmV4aXN0cygpKSB7Ci0JCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JcHJpdmF0ZSBJbmNyZW1lbnRhbEhlbHBlciBnZXRIZWxwZXIoSVByb2plY3QgcHJvamVjdCkgewotCQlpZiAoZkhlbHBlciA9PSBudWxsKQotCQkJZkhlbHBlciA9IG5ldyBJbmNyZW1lbnRhbEhlbHBlcihnZXREb2N1bWVudCgpLCBwcm9qZWN0KTsKLQkJcmV0dXJuIGZIZWxwZXI7Ci0JfQotCi0JcHJpdmF0ZSBJbmNyZW1lbnRhbFJlcG9ydGVyIGdldFJlcG9ydGVyKCkgewotCQlpZiAoZlJlcG9ydGVyID09IG51bGwpCi0JCQlmUmVwb3J0ZXIgPSBuZXcgSW5jcmVtZW50YWxSZXBvcnRlcihnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCXJldHVybiBmUmVwb3J0ZXI7Ci0JfQotCi0JLyoqCi0JICogSWYgdGhpcyB2YWxpZGF0b3IgaXMgcGFydGlhbCBvciB0b3RhbAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFNjb3BlKCkgewotCQlyZXR1cm4gZlNjb3BlOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXRpYWxSZWNvbmNpbGUoKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgSVJlY29uY2lsZVJlc3VsdFtdIHJlY29uY2lsZU1vZGVsKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQlpZiAoREVCVUcpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlt0cmFjZSByZWNvbmNpbGVyXSA+IHJlY29uY2lsaW5nIG1vZGVsIGluIFZBTElEQVRPUiBzdGVwIHcvIGRpcnR5IHJlZ2lvbjogWyIgKyBkaXJ0eVJlZ2lvbi5nZXRUZXh0KCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQlJUmVjb25jaWxlUmVzdWx0W10gcmVzdWx0cyA9IEVNUFRZX1JFQ09OQ0lMRV9SRVNVTFRfU0VUOwotCQlpZiAoZGlydHlSZWdpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpZihmVmFsaWRhdG9yIGluc3RhbmNlb2YgSVNvdXJjZVZhbGlkYXRvcikgewotCQkJCQlyZXN1bHRzID0gdmFsaWRhdGUoZGlydHlSZWdpb24sIHN1YlJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXN1bHRzID0gdmFsaWRhdGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiRVhFUFRJT04gSU4gUkVDT05DSUxFIFNURVAgRk9SIFZBTElEQVRPUiIsIGV4KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJaWYgKERFQlVHKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJbdHJhY2UgcmVjb25jaWxlcl0gPiBWQUxJREFUT1Igc3RlcCBkb25lIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgZGVidWdTdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCJWYWxpZGF0b3JTdGVwOiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZlZhbGlkYXRvciAhPSBudWxsKQotCQkJZGVidWdTdHJpbmcuYXBwZW5kKGZWYWxpZGF0b3IuZ2V0Q2xhc3MoKS50b1N0cmluZygpKTsKLQkJcmV0dXJuIGRlYnVnU3RyaW5nLnRvU3RyaW5nKCk7Ci0JfQotCQotCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gdmFsaWRhdGUoKSB7Ci0JCUlSZWNvbmNpbGVSZXN1bHRbXSByZXN1bHRzID0gRU1QVFlfUkVDT05DSUxFX1JFU1VMVF9TRVQ7Ci0KLQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQotCQl0cnkgewotCQkJSW5jcmVtZW50YWxIZWxwZXIgaGVscGVyID0gZ2V0SGVscGVyKGZpbGUgIT0gbnVsbCA/IGZpbGUuZ2V0UHJvamVjdCgpIDogbnVsbCk7Ci0JCQlJbmNyZW1lbnRhbFJlcG9ydGVyIHJlcG9ydGVyID0gZ2V0UmVwb3J0ZXIoKTsKLQotCQkJaWYgKGZpbGUgIT0gbnVsbCAmJiBmaWxlLmV4aXN0cygpKSB7Ci0JCQkJaGVscGVyLnNldFVSSShmaWxlLmdldEZ1bGxQYXRoKCkudG9TdHJpbmcoKSk7Ci0JCQl9Ci0KLQkJCWZWYWxpZGF0b3IudmFsaWRhdGUoaGVscGVyLCByZXBvcnRlcik7Ci0KLQkJCS8vIHJlc3VsdHMgPSBjcmVhdGVBbm5vdGF0aW9ucyhyZXBvcnRlci5nZXRNZXNzYWdlcygpKTsKLQkJCXJlc3VsdHMgPSBjcmVhdGVBbm5vdGF0aW9ucyhyZXBvcnRlci5nZXRBbm5vdGF0aW9uSW5mbygpKTsKLQkJCXJlcG9ydGVyLnJlbW92ZUFsbE1lc3NhZ2VzKGZWYWxpZGF0b3IpOwotCQkJCi0JCQlmVmFsaWRhdG9yLmNsZWFudXAocmVwb3J0ZXIpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0czsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0SW5wdXRNb2RlbChJUmVjb25jaWxhYmxlTW9kZWwgaW5wdXRNb2RlbCkgewotCQlpZihpbnB1dE1vZGVsIGluc3RhbmNlb2YgRG9jdW1lbnRBZGFwdGVyKSB7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSAoKERvY3VtZW50QWRhcHRlcilpbnB1dE1vZGVsKS5nZXREb2N1bWVudCgpOwotCQkJaWYoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCWlmKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJU291cmNlVmFsaWRhdG9yKSB7Ci0JCQkJCS8vIG5vdGlmeSB0aGF0IGRvY3VtZW50IGNvbm5lY3RpbmcKLQkJCQkJKChJU291cmNlVmFsaWRhdG9yKWZWYWxpZGF0b3IpLmNvbm5lY3QoZG9jdW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlzdXBlci5zZXRJbnB1dE1vZGVsKGlucHV0TW9kZWwpOwotCX0KLQkKLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlpZihmVmFsaWRhdG9yIGluc3RhbmNlb2YgSVNvdXJjZVZhbGlkYXRvcikgewotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJCWlmKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkvLyBub3RpZnkgdGhhdCBkb2N1bWVudCBkaXNjb25uZWN0aW5nCi0JCQkJKChJU291cmNlVmFsaWRhdG9yKWZWYWxpZGF0b3IpLmRpc2Nvbm5lY3QoZG9jdW1lbnQpOwotCQkJfQotCQkJZlZhbGlkYXRvci5jbGVhbnVwKGdldFJlcG9ydGVyKCkpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQl9Ci0JCi0JcHJvdGVjdGVkIElSZWNvbmNpbGVSZXN1bHRbXSB2YWxpZGF0ZShEaXJ0eVJlZ2lvbiBkaXJ0eVJlZ2lvbiwgSVJlZ2lvbiBzdWJSZWdpb24pIHsKLQkJSVJlY29uY2lsZVJlc3VsdFtdIHJlc3VsdHMgPSBFTVBUWV9SRUNPTkNJTEVfUkVTVUxUX1NFVDsKLQotCQlJRmlsZSBmaWxlID0gZ2V0RmlsZSgpOwotCi0JCXRyeSB7Ci0JCQlJbmNyZW1lbnRhbEhlbHBlciBoZWxwZXIgPSBnZXRIZWxwZXIoZmlsZSAhPSBudWxsID8gZmlsZS5nZXRQcm9qZWN0KCkgOiBudWxsKTsKLQkJCS8qCi0JCQkgKiBTZXR0aW5nIHRoZSBVUkkgaXNuJ3QgbmVjZXNzYXJ5IGZvciBhbGwgc291cmNlIHZhbGlkYXRvcnMsIHdlCi0JCQkgKiBjYW4gc3RpbGwgY29udGludWUgd2l0aG91dCBpdAotCQkJICovCi0JCQlpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpIHsKLQkJCQloZWxwZXIuc2V0VVJJKGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLQkJCX0KLQotCQkJaWYgKGZWYWxpZGF0b3IgaW5zdGFuY2VvZiBJU291cmNlVmFsaWRhdG9yKSB7Ci0JCQkJSW5jcmVtZW50YWxSZXBvcnRlciByZXBvcnRlciA9IGdldFJlcG9ydGVyKCk7Ci0JCQkJKChJU291cmNlVmFsaWRhdG9yKSBmVmFsaWRhdG9yKS52YWxpZGF0ZShkaXJ0eVJlZ2lvbiwgaGVscGVyLCByZXBvcnRlcik7Ci0JCQkJLy8gY2FsbCBJVmFsaWRhdG9yLmNsZWFudXAoKSBkdXJpbmcgcmVsZWFzZSgpCi0JCQkJLy8gcmVzdWx0cyA9IGNyZWF0ZUFubm90YXRpb25zKHJlcG9ydGVyLmdldE1lc3NhZ2VzKCkpOwotCQkJCXJlc3VsdHMgPSBjcmVhdGVBbm5vdGF0aW9ucyhyZXBvcnRlci5nZXRBbm5vdGF0aW9uSW5mbygpKTsKLQkJCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyhmVmFsaWRhdG9yKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvckJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExZjA4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmV4dGVuc2lvbi5SZWdpc3RyeVJlYWRlcjsKLQotCi0vKioKLSAqIEJhc2VkIG9mZiBvZiBUcmFuc2ZlckJ1aWxkZXIuIFJlYWRzIHRoZSBleHRlbnNpb24gcG9pbnQgZm9yCi0gKiA8Y29kZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmV4dGVuc2lvbnMuc291cmNldmFsaWRhdGlvbjwvY29kZT4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvckJ1aWxkZXIgZXh0ZW5kcyBSZWdpc3RyeVJlYWRlciB7Ci0gICAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfU0NPUEUgPSAic2NvcGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFZhbGlkYXRvck1ldGFEYXRhW10gRU1UUFlfVk1EX0FSUkFZID0gbmV3IFZhbGlkYXRvck1ldGFEYXRhWzBdOwotCi0JLy8gZXh0ZW5zaW9uIHBvaW50IElECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExfU09VUkNFX1ZBTElEQVRJT04gPSAic291cmNldmFsaWRhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DT05URU5UX1RZUEVfSURFTlRJRklFUiA9ICJjb250ZW50VHlwZUlkZW50aWZpZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1BBUlRJVElPTl9UWVBFID0gInBhcnRpdGlvblR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVkFMSURBVE9SID0gInZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNFX0ZJTFRFUiA9ICJyZWNvbmNpbGVfdmFsaWRhdG9yIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVRSA9ICJ0cnVlIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgU3RyaW5nIGZDdXJyZW50Q1RJRDsKLQlwcml2YXRlIFZhbGlkYXRvck1ldGFEYXRhIGZDdXJyZW50Vk1EID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZlZtZHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRDb250cmlidXRpb25UYWc7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXRJRDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIFVOS05PV04gPSAiPz8/IjsgLy8kTk9OLU5MUy0xJAotICAgIAotCS8qKgotCSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHBhcnQgSUQgYXR0cmlidXRlIHRoYXQgaXMgZXhwZWN0ZWQgaW4gdGhlCi0JICogdGFyZ2V0IGV4dGVuc2lvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRJRChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgdmFsdWUgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfSUQpOwotCQlyZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogVU5LTk9XTjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0NMQVNTKTsKLQkJcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6IFVOS05PV047IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWRpdG9ySWQKLQkgKiBAcmV0dXJuIFRyYW5zZmVyW10KLQkgKi8KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGFbXSBnZXRWYWxpZGF0b3JNZXRhRGF0YShTdHJpbmcgZWRpdG9ySWQpIHsKLQkJcmVhZENvbnRyaWJ1dGlvbnMoZWRpdG9ySWQsIFRBR19WQUxJREFUT1IsIFBMX1NPVVJDRV9WQUxJREFUSU9OKTsKLQkJcmV0dXJuIChWYWxpZGF0b3JNZXRhRGF0YVtdKSBmVm1kcy50b0FycmF5KG5ldyBWYWxpZGF0b3JNZXRhRGF0YVtmVm1kcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRvclNjb3BlKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCVN0cmluZyB2YWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9TQ09QRSk7Ci0JCXJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUgOiBVTktOT1dOOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogUmVhZHMgdGhlIGNvbnRyaWJ1dGlvbnMgZnJvbSB0aGUgcmVnaXN0cnkgZm9yIHRoZSBwcm92aWRlZCB3b3JrYmVuY2gKLQkgKiBwYXJ0IGFuZCB0aGUgcHJvdmlkZWQgZXh0ZW5zaW9uIHBvaW50IElELgotCSAqIAotCSAqIEBwYXJhbSBpZAotCSAqIEBwYXJhbSB0YWcKLQkgKiBAcGFyYW0gZXh0ZW5zaW9uUG9pbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkQ29udHJpYnV0aW9ucyhTdHJpbmcgaWQsIFN0cmluZyB0YWcsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQl0YXJnZXRJRCA9IGlkOwotCQl0YXJnZXRDb250cmlidXRpb25UYWcgPSB0YWc7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCXJlYWRSZWdpc3RyeShyZWdpc3RyeSwgUExVR0lOX0lELCBleHRlbnNpb25Qb2ludCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIHRhZyA9IGVsZW1lbnQuZ2V0TmFtZSgpOwotCQkvL2llLiB0YXJnZXRDb250cmlidXRpb25UYWcgPT0gdmFsaWRhdG9yCi0JCWlmICh0YWcuZXF1YWxzKHRhcmdldENvbnRyaWJ1dGlvblRhZykpIHsKLQkJCVN0cmluZyB2SWQgPSBnZXRJRChlbGVtZW50KTsKLQkJCVN0cmluZyB2Q2xhc3MgPSBnZXRWYWxpZGF0b3JDbGFzcyhlbGVtZW50KTsKLQkJCVN0cmluZyB2U2NvcGUgPSBnZXRWYWxpZGF0b3JTY29wZShlbGVtZW50KTsKLQotCQkJaWYgKHZJZCA9PSBudWxsKSB7Ci0JCQkJLy8gVGhpcyBpcyBub3Qgb2YgaW50ZXJlc3QgdG8gdXMgLSBkb24ndCBnbyBkZWVwZXIKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCS8vIHN0YXJ0IGJ1aWxkaW5nIGEgVk1ECi0JCQlmQ3VycmVudFZNRCA9IG5ldyBWYWxpZGF0b3JNZXRhRGF0YShlbGVtZW50LCB2SWQsIHZDbGFzcywgdlNjb3BlKTsKLQkJCWZWbWRzLmFkZChmQ3VycmVudFZNRCk7Ci0KLQkJCWlmIChMb2dnZXIuaXNUcmFjaW5nKFZhbGlkYXRvckJ1aWxkZXIuVFJBQ0VfRklMVEVSKSkKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImFkZGVkIHJlY29uY2lsZSB2YWxpZGF0b3I6ICIgKyB2SWQgKyAiOiIgKyB2Q2xhc3MgKyAiOiIgKyB2U2NvcGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9IGVsc2UgaWYgKHRhZy5lcXVhbHMoVEFHX0NPTlRFTlRfVFlQRV9JREVOVElGSUVSKSkgewotCQkJLy8gYWRkIHRvIGN1cnJlbnQgVk1ECi0JCQlmQ3VycmVudENUSUQgPSBnZXRJRChlbGVtZW50KTsKLQkJCWZDdXJyZW50Vk1ELmFkZENvbnRlbnRUeXBlSWQoZkN1cnJlbnRDVElEKTsKLQkJfSBlbHNlIGlmICh0YWcuZXF1YWxzKFRBR19QQVJUSVRJT05fVFlQRSkpIHsKLQkJCS8vIGFkZCB0byBjdXJyZW50IFZNRAotCQkJU3RyaW5nIHBhcnRpdGlvblR5cGUgPSBnZXRJRChlbGVtZW50KTsKLQkJCWZDdXJyZW50Vk1ELmFkZFBhcml0aW9uVHlwZShmQ3VycmVudENUSUQsIHBhcnRpdGlvblR5cGUpOwotCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJlYWRFbGVtZW50Q2hpbGRyZW4oZWxlbWVudCk7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yTWV0YURhdGEuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvck1ldGFEYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YmNkY2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3JlY29uY2lsZS92YWxpZGF0b3IvVmFsaWRhdG9yTWV0YURhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uQnVzeUluZGljYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0KLS8qKgotICogT2JqZWN0IHRoYXQgaG9sZHMgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gdGhlIGNyZWF0aW9uIG9mIGEgdmFsaWRhdG9yIGZvcgotICogdGhlIHJlY29uY2lsaW5nIGZyYW1ld29yay4KLSAqIAotICogQGF1dGhvciBwYXZlcnksbml0aW5kCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JNZXRhRGF0YSB7Ci0JcHJpdmF0ZSBTdHJpbmcgZkNsYXNzID0gbnVsbDsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmQ29uZmlndXJhdGlvbkVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZJZCA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgZlNjb3BlOwotCi0JLy8gYSBoYXNoIG1hcCBvZiBleHBsaWNpdGx5IGRlY2xhcmVkIGNvbnRlbnQgdHlwZSBJZHMgKFN0cmluZykgdGhhdCBwb2ludHMgdG8gbGlzdHMgb2YKLQkvLyBwYXJ0aXRpb24gdHlwZXMgKExpc3Qgb2YgU3RyaW5ncykKLQkvLyBjb250ZW50VHlwZUlkIC0+IExpc3QocGFyaXRpb25UeXBlLCBwYXJpdGlvblR5cGUsIHBhcnRpdGlvblR5cGUsIC4uLikKLQkvLyBjb250ZW50VHlwZUlkMiAtPiBMaXN0KHBhcnRpdGlvblR5cGUsIHBhcnRpdGlvblR5cGUsIC4uLikKLQkvLyAuLi4KLQlwcml2YXRlIEhhc2hNYXAgZk1hdHJpeCA9IG51bGw7Ci0KLQlwdWJsaWMgVmFsaWRhdG9yTWV0YURhdGEoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIFN0cmluZyB2SWQsIFN0cmluZyB2Q2xhc3MsIFN0cmluZyB2U2NvcGUpIHsKLQkJZklkID0gdklkOwotCQlmQ2xhc3MgPSB2Q2xhc3M7Ci0JCWZDb25maWd1cmF0aW9uRWxlbWVudCA9IGVsZW1lbnQ7Ci0JCWZTY29wZSA9IHZTY29wZTsKLQkJZk1hdHJpeCA9IG5ldyBIYXNoTWFwKCk7Ci0JfQotCi0gICAgLyoqCi0gICAgICogVE9ETzogVGhpcyBleGFjdCBtZXRob2QgaXMgYWxzbyBpbiBWYWxpZGF0b3JTdHJhdGVneS4gU2hvdWxkIGJlIGluIGEgY29tbW9uIHBsYWNlLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjb250ZW50VHlwZUlkCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nW10gY2FsY3VsYXRlUGFyZW50Q29udGVudFR5cGVJZHMoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQotICAgICAgICBTZXQgcGFyZW50VHlwZXMgPSBuZXcgSGFzaFNldCgpOwotICAgICAgICAKLSAgICAgICAgSUNvbnRlbnRUeXBlTWFuYWdlciBjdE1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsgICAgCi0gICAgICAgIElDb250ZW50VHlwZSBjdCA9IGN0TWFuYWdlci5nZXRDb250ZW50VHlwZShjb250ZW50VHlwZUlkKTsKLSAgICAgICAgU3RyaW5nIGlkID0gY29udGVudFR5cGVJZDsKLQotICAgICAgICB3aGlsZShjdCAhPSBudWxsICYmIGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcGFyZW50VHlwZXMuYWRkKGlkKTsKLSAgICAgICAgICAgIGN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGlkKTsKLSAgICAgICAgICAgIGlmKGN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJQ29udGVudFR5cGUgYmFzZVR5cGUgPSBjdC5nZXRCYXNlVHlwZSgpOwotICAgICAgICAgICAgICAgIGlkID0gKGJhc2VUeXBlICE9IG51bGwpID8gYmFzZVR5cGUuZ2V0SWQoKSA6IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChTdHJpbmdbXSlwYXJlbnRUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbcGFyZW50VHlwZXMuc2l6ZSgpXSk7Ci0gICAgfQotICAgIAotCXB1YmxpYyB2b2lkIGFkZENvbnRlbnRUeXBlSWQoU3RyaW5nIGNvbnRlbnRUeXBlSWQpIHsKLQkJaWYgKCFmTWF0cml4LmNvbnRhaW5zS2V5KGNvbnRlbnRUeXBlSWQpKQotCQkJZk1hdHJpeC5wdXQoY29udGVudFR5cGVJZCwgbmV3IEFycmF5TGlzdCgpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRQYXJpdGlvblR5cGUoU3RyaW5nIGNvbnRlbnRUeXBlSWQsIFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCWlmICghZk1hdHJpeC5jb250YWluc0tleShjb250ZW50VHlwZUlkKSkKLQkJCWZNYXRyaXgucHV0KGNvbnRlbnRUeXBlSWQsIG5ldyBBcnJheUxpc3QoKSk7Ci0KLQkJTGlzdCBwYXJ0aXRpb25MaXN0ID0gKExpc3QpIGZNYXRyaXguZ2V0KGNvbnRlbnRUeXBlSWQpOwotCQlwYXJ0aXRpb25MaXN0LmFkZChwYXJ0aXRpb25UeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB2YWxpZGF0b3IgZXhwbGljaXRseSBkZWNsYXJlZCB0aGF0IGl0IGNvdWxkIGhhbmRsZQotCSAqICAgICAgICAgdGhpcyBjb250ZW50IHR5cGUgb3IgYW55IG9mIGl0cyBwYXJlbnQgY29udGVudCB0eXBlcwotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICAvLyBuZWVkIHRvIGl0ZXJhdGUgaGllcmFyY2h5Ci0gICAgICAgIFN0cmluZ1tdIGNvbnRlbnRIaWVyYXJjaHkgPSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhjb250ZW50VHlwZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudEhpZXJhcmNoeS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYoZk1hdHJpeC5jb250YWluc0tleShjb250ZW50SGllcmFyY2h5W2ldKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlCi0JICogQHJldHVybiB3aGV0aGVyIHRoaXMgdmFsaWRhdG9yIGV4cGxpY2l0bHkgZGVjbGFyZWQgdGhhdCBpdCBjb3VsZCBoYW5kbGUKLQkgKiAgICAgICAgIHRoaXMgY29udGVudCB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gbXVzdEhhbmRsZUNvbnRlbnRUeXBlKFN0cmluZyBjb250ZW50VHlwZSkgewotICAgICAgICByZXR1cm4gZk1hdHJpeC5jb250YWluc0tleShjb250ZW50VHlwZSk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGNvbnRlbnRUeXBlSWRzCi0JICogQHBhcmFtIHBhcnRpdGlvblR5cGUKLQkgKiBAcmV0dXJuIHdoZXRoZXIgdGhpcyB2YWxpZGF0b3IgZGVjbGFyZWQgdGhhdCBpdCBjb3VsZCBoYW5kbGUgdGhpcwotCSAqICAgICAgICAgY29udGVudCB0eXBlLCBvciBvbmUgb2YgaXRzIHBhcmVudCBjb250ZW50IHR5cGVzLCBhbmQgcGFydGl0aW9uCi0JICogICAgICAgICB0eXBlCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlUGFydGl0aW9uVHlwZShTdHJpbmcgY29udGVudFR5cGVJZHNbXSwgU3RyaW5nIHBhcml0aW9uVHlwZSkgewotICAgICAgICBmb3IoaW50IGk9MDsgaTxjb250ZW50VHlwZUlkcy5sZW5ndGg7IGkrKykgewotICAgIAkJaWYgKGZNYXRyaXguY29udGFpbnNLZXkoY29udGVudFR5cGVJZHNbaV0pKSB7Ci0gICAgCQkJTGlzdCBwYXJ0aXRpb25zID0gKExpc3QpIGZNYXRyaXguZ2V0KGNvbnRlbnRUeXBlSWRzW2ldKTsKLSAgICAJCQlmb3IgKGludCBqID0gMDsgaiA8IHBhcnRpdGlvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAJCQkJaWYgKHBhcml0aW9uVHlwZS5lcXVhbHMocGFydGl0aW9ucy5nZXQoaikpKQotICAgIAkJCQkJcmV0dXJuIHRydWU7Ci0gICAgCQkJfQotICAgIAkJfQotICAgICAgICB9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JT2JqZWN0IGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQsIGZpbmFsIFN0cmluZyBjbGFzc0F0dHJpYnV0ZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlPYmplY3Qgb2JqID0gbnVsbDsKLQkJb2JqID0gZWxlbWVudC5jcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGNsYXNzQXR0cmlidXRlKTsKLQkJcmV0dXJuIG9iajsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIGV4dGVuc2lvbi4gSWYgdGhlIGV4dGVuc2lvbiBwbHVnaW4gaGFzIG5vdCBiZWVuIGxvYWRlZCBhCi0JICogYnVzeSBjdXJzb3Igd2lsbCBiZSBhY3RpdmF0ZWQgZHVyaW5nIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9hZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIEBwYXJhbSBjbGFzc0F0dHJpYnV0ZQotCSAqIEByZXR1cm4gT2JqZWN0Ci0JICogQHRocm93cyBDb3JlRXhjZXB0aW9uCi0JICovCi0JcHVibGljIE9iamVjdCBjcmVhdGVFeHRlbnNpb24oKSB7Ci0JCS8vIElmIHBsdWdpbiBoYXMgYmVlbiBsb2FkZWQgY3JlYXRlIGV4dGVuc2lvbi4KLQkJLy8gT3RoZXJ3aXNlLCBzaG93IGJ1c3kgY3Vyc29yIHRoZW4gY3JlYXRlIGV4dGVuc2lvbi4KLQkJZmluYWwgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBnZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotCQlmaW5hbCBPYmplY3RbXSByZXN1bHQgPSBuZXcgT2JqZWN0WzFdOwotCQlTdHJpbmcgcGx1Z2luSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKHBsdWdpbklkKTsKLQkJaWYgKGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5BQ1RJVkUpIHsKLQkJCXRyeSB7Ci0JCQkJcmV0dXJuIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oZWxlbWVudCwgImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCWhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24ocmVzdWx0LCBlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKG51bGwsIG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXN1bHRbMF0gPSBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uKGVsZW1lbnQsICJjbGFzcyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQloYW5kbGVDcmVhdGVFeGVjdXRhYmxlRXhjZXB0aW9uKHJlc3VsdCwgZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0WzBdOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gYSB2YWxpZGF0b3IgaW5zdGFuY2UgYmFzZWQgb24gdGhpcyBWYWxpZGF0b3JNZXRhRGF0YSBpbnN0YW5jZQotCSAqLwotCXB1YmxpYyBJVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHsKLQkJT2JqZWN0IG9iaiA9IG51bGw7Ci0JCW9iaiA9IGNyZWF0ZUV4dGVuc2lvbigpOwotCQlpZiAob2JqID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCXJldHVybiAob2JqIGluc3RhbmNlb2YgSVZhbGlkYXRvcikgPyAoSVZhbGlkYXRvcikgb2JqIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGdldENvbmZpZ3VyYXRpb25FbGVtZW50KCkgewotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25FbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yQ2xhc3MoKSB7Ci0JCXJldHVybiBmQ2xhc3M7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JJZCgpIHsKLQkJcmV0dXJuIGZJZDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVzdWx0Ci0JICogQHBhcmFtIGUKLQkgKi8KLQl2b2lkIGhhbmRsZUNyZWF0ZUV4ZWN1dGFibGVFeGNlcHRpb24oT2JqZWN0W10gcmVzdWx0LCBUaHJvd2FibGUgZSkgewotCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQlyZXN1bHRbMF0gPSBudWxsOwotCX0KLQkvKioKLQkgKiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMIG9yICBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwKLQkgKiBAcmV0dXJuCi0JICovCi0gICAgcHVibGljIGludCBnZXRWYWxpZGF0b3JTY29wZSgpIHsKLSAgICAgICAgcmV0dXJuIGZTY29wZS5lcXVhbHNJZ25vcmVDYXNlKCJ0b3RhbCIpID8gUmVjb25jaWxlQW5ub3RhdGlvbktleS5UT1RBTCA6IFJlY29uY2lsZUFubm90YXRpb25LZXkuUEFSVElBTDsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICAKLQkvKioKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjdG9TdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBkZWJ1Z1N0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoIlZhbGlkYXRvck1ldGFEYXRhOiIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChmSWQgIT0gbnVsbCkKLQkJCWRlYnVnU3RyaW5nLmFwcGVuZCgiIFtpZDoiICsgZklkICsgIl0iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBkZWJ1Z1N0cmluZy50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvcmVjb25jaWxlL3ZhbGlkYXRvci9WYWxpZGF0b3JTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWZkZmI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9yZWNvbmNpbGUvdmFsaWRhdG9yL1ZhbGlkYXRvclN0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklSZWxlYXNhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkRvY3VtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLkNvbmZpZ3VyYXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlByb2plY3RDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25SZWdpc3RyeVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3I7Ci0KLQotLyoqCi0gKiBTcGVjaWFsIHZhbGlkYXRvciBzdHJhdGVneS4gUnVucyB2YWxpZGF0b3Igc3RlcHMgY29udHJpYnV0ZWQgdmlhIHRoZQotICogPGNvZGU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLnNvdXJjZXZhbGlkYXRpb248L2NvZGU+IGV4dGVuc2lvbgotICogcG9pbnQKLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRvclN0cmF0ZWd5IGV4dGVuZHMgU3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5IHsKLQotCXByaXZhdGUgU3RyaW5nW10gZkNvbnRlbnRUeXBlSWRzID0gbnVsbDsKLQlwcml2YXRlIExpc3QgZk1ldGFEYXRhID0gbnVsbDsKLQkvKiogdmFsaWRhdG9yIGlkIChhcyBkZWNsYXJlZCBpbiBleHQgcG9pbnQpIC0+IFJlY29uY2lsZVN0ZXBGb3JWYWxpZGF0b3IgKiAqLwotCXByaXZhdGUgSGFzaE1hcCBmVmlkVG9WU3RlcE1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBQcm9qZWN0Q29uZmlndXJhdGlvbiBmUHJvamVjdENvbmZpZ3VyYXRpb24gPSBudWxsOwotCi0JLyoKLQkgKiBMaXN0IG9mIFZhbGlkYXRvck1ldGFEYXRhcyBvZiB0b3RhbCBzY29wZSB2YWxpZGF0b3JzIHRoYXQgaGF2ZSBiZWVuIHJ1bgotCSAqIHNpbmNlIGJlZ2luUHJvY2Vzc2luZygpIHdhcyBjYWxsZWQuCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW47Ci0KLQlwdWJsaWMgVmFsaWRhdG9yU3RyYXRlZ3koSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlzdXBlcihzb3VyY2VWaWV3ZXIpOwotCQlmTWV0YURhdGEgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZDb250ZW50VHlwZUlkcyA9IGNhbGN1bGF0ZVBhcmVudENvbnRlbnRUeXBlSWRzKGNvbnRlbnRUeXBlKTsKLQkJZlZpZFRvVlN0ZXBNYXAgPSBuZXcgSGFzaE1hcCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFZhbGlkYXRvck1ldGFEYXRhKFZhbGlkYXRvck1ldGFEYXRhIHZtZCkgewotCQlmTWV0YURhdGEuYWRkKHZtZCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYmVnaW5Qcm9jZXNzaW5nKCkgewotCQlpZiAoZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1biA9PSBudWxsKQotCQkJZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1biA9IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29udGVudCB0eXBlIHBhc3NlZCBpbiBzaG91bGQgYmUgdGhlIG1vc3Qgc3BlY2lmaWMgb25lLiBUT0RPOiBUaGlzCi0JICogZXhhY3QgbWV0aG9kIGlzIGFsc28gaW4gVmFsaWRhdG9yTWV0YURhdGEuIFNob3VsZCBiZSBpbiBhIGNvbW1vbiBwbGFjZS4KLQkgKiAKLQkgKiBAcGFyYW0gY29udGVudFR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmdbXSBjYWxjdWxhdGVQYXJlbnRDb250ZW50VHlwZUlkcyhTdHJpbmcgY29udGVudFR5cGVJZCkgewotCi0JCVNldCBwYXJlbnRUeXBlcyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQkJSUNvbnRlbnRUeXBlTWFuYWdlciBjdE1hbmFnZXIgPSBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKTsKLQkJSUNvbnRlbnRUeXBlIGN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGNvbnRlbnRUeXBlSWQpOwotCQlTdHJpbmcgaWQgPSBjb250ZW50VHlwZUlkOwotCi0JCXdoaWxlIChjdCAhPSBudWxsICYmIGlkICE9IG51bGwpIHsKLQotCQkJcGFyZW50VHlwZXMuYWRkKGlkKTsKLQkJCWN0ID0gY3RNYW5hZ2VyLmdldENvbnRlbnRUeXBlKGlkKTsKLQkJCWlmIChjdCAhPSBudWxsKSB7Ci0JCQkJSUNvbnRlbnRUeXBlIGJhc2VUeXBlID0gY3QuZ2V0QmFzZVR5cGUoKTsKLQkJCQlpZCA9IChiYXNlVHlwZSAhPSBudWxsKSA/IGJhc2VUeXBlLmdldElkKCkgOiBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiAoU3RyaW5nW10pIHBhcmVudFR5cGVzLnRvQXJyYXkobmV3IFN0cmluZ1twYXJlbnRUeXBlcy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5IYW5kbGVQYXJ0aXRpb24oU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJVmFsaWRhdG9yTWV0YURhdGEgdm1kID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmTWV0YURhdGEuc2l6ZSgpOyBpKyspIHsKLQkJCXZtZCA9IChWYWxpZGF0b3JNZXRhRGF0YSkgZk1ldGFEYXRhLmdldChpKTsKLQkJCWlmICh2bWQuY2FuSGFuZGxlUGFydGl0aW9uVHlwZShnZXRDb250ZW50VHlwZUlkcygpLCBwYXJ0aXRpb25UeXBlKSkKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gY29udGFpbnNTdGVwKElSZWNvbmNpbGVTdGVwIHN0ZXApIHsKLQkJcmV0dXJuIGZWaWRUb1ZTdGVwTWFwLmNvbnRhaW5zVmFsdWUoc3RlcCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlY29uY2lsZS5BYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneSNjcmVhdGVSZWNvbmNpbGVTdGVwcygpCi0JICovCi0JcHVibGljIHZvaWQgY3JlYXRlUmVjb25jaWxlU3RlcHMoKSB7Ci0JCS8vIGRvIG5vdGhpbmcsIHN0ZXBzIGFyZSBjcmVhdGVkCi0JfQotCi0JcHVibGljIHZvaWQgZW5kUHJvY2Vzc2luZygpIHsKLQkJZlRvdGFsU2NvcGVWYWxpZGF0b3JzQWxyZWFkeVJ1bi5jbGVhcigpOwotCX0KLQotCS8qKgotCSAqIEFsbCBjb250ZW50IHR5cGVzIG9uIHdoaWNoIHRoaXMgVmFsaWRhdG9yU3RyYXRlZ3kgY2FuIHJ1bgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29udGVudFR5cGVJZHMoKSB7Ci0JCXJldHVybiBmQ29udGVudFR5cGVJZHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRyCi0JICogICAgICAgICAgICBQYXJ0aXRpb24gb2YgdGhlIHJlZ2lvbiB0byByZWNvbmNpbGUuCi0JICogQHBhcmFtIGRyCi0JICogICAgICAgICAgICBEaXJ0eSByZWdpb24gcmVwcmVzZW50YXRpb24gb2YgdGhlIHR5cGVkIHJlZ2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHJlY29uY2lsZShJVHlwZWRSZWdpb24gdHIsIERpcnR5UmVnaW9uIGRyKSB7Ci0KLQkJaWYgKGlzQ2FuY2VsZWQoKSkKLQkJCXJldHVybjsKLQotCQlJRG9jdW1lbnQgZG9jID0gZ2V0RG9jdW1lbnQoKTsKLQkJLy8gZm9yIGV4dGVybmFsIGZpbGVzLCB0aGlzIGNhbiBiZSBudWxsCi0JCWlmIChkb2MgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgcGFydGl0aW9uVHlwZSA9IHRyLmdldFR5cGUoKTsKLQotCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBudWxsOwotCQlMaXN0IGFubm90YXRpb25zVG9BZGQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUxpc3Qgc3RlcHNSYW5PblRoaXNEaXJ0eVJlZ2lvbiA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCS8qCi0JCSAqIExvb3AgdGhyb3VnaCBhbGwgb2YgdGhlIHJlbGV2YW50IHZhbGlkYXRvciBtZXRhIGRhdGEgdG8gZmluZAotCQkgKiBzdXBwb3J0aW5nIHZhbGlkYXRvcnMgZm9yIHRoaXMgcGFydGl0aW9uIHR5cGUuIERvbid0IGNoZWNrCi0JCSAqIHRoaXMuY2FuSGFuZGxlUGFydGl0aW9uKCkgYmVmb3JlLWhhbmQgc2luY2UgaXQganVzdCBsb29wcyB0aHJvdWdoCi0JCSAqIGFuZCBjYWxscyB2bWQuY2FuSGFuZGxlUGFydGl0aW9uVHlwZSgpLi4ud2hpY2ggd2UncmUgYWxyZWFkeSBkb2luZwotCQkgKiBoZXJlIGFueXdheSB0byBmaW5kIHRoZSByaWdodCB2bWQuCi0JCSAqLwotCQlmb3IgKGludCBpID0gMDsgaSA8IGZNZXRhRGF0YS5zaXplKCkgJiYgIWlzQ2FuY2VsZWQoKTsgaSsrKSB7Ci0JCQl2bWQgPSAoVmFsaWRhdG9yTWV0YURhdGEpIGZNZXRhRGF0YS5nZXQoaSk7Ci0JCQlpZiAodm1kLmNhbkhhbmRsZVBhcnRpdGlvblR5cGUoZ2V0Q29udGVudFR5cGVJZHMoKSwgcGFydGl0aW9uVHlwZSkpIHsKLQkJCQkvKgotCQkJCSAqIENoZWNrIGlmIHZhbGlkYXRvciBpcyBlbmFibGVkIGFjY29yZGluZyB0byB2YWxpZGF0aW9uCi0JCQkJICogcHJlZmVyZW5jZXMgYmVmb3JlIGF0dGVtcHRpbmcgdG8gY3JlYXRlL3VzZSBpdAotCQkJCSAqLwotCQkJCWlmIChpc1ZhbGlkYXRvckVuYWJsZWQodm1kKSkgewotCQkJCQlpbnQgdmFsaWRhdG9yU2NvcGUgPSB2bWQuZ2V0VmFsaWRhdG9yU2NvcGUoKTsKLQkJCQkJUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvciB2YWxpZGF0b3JTdGVwID0gbnVsbDsKLQkJCQkJLy8gZ2V0IHN0ZXAgZm9yIHBhcnRpdGlvbiB0eXBlCi0JCQkJCU9iamVjdCBvID0gZlZpZFRvVlN0ZXBNYXAuZ2V0KHZtZC5nZXRWYWxpZGF0b3JJZCgpKTsKLQkJCQkJaWYgKG8gIT0gbnVsbCkgewotCQkJCQkJdmFsaWRhdG9yU3RlcCA9IChSZWNvbmNpbGVTdGVwRm9yVmFsaWRhdG9yKSBvOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaWYgZG9lc24ndCBleGlzdCwgY3JlYXRlIG9uZQotCQkJCQkJSVZhbGlkYXRvciB2YWxpZGF0b3IgPSB2bWQuY3JlYXRlVmFsaWRhdG9yKCk7Ci0KLQkJCQkJCXZhbGlkYXRvclN0ZXAgPSBuZXcgUmVjb25jaWxlU3RlcEZvclZhbGlkYXRvcih2YWxpZGF0b3IsIHZhbGlkYXRvclNjb3BlKTsKLQkJCQkJCXZhbGlkYXRvclN0ZXAuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvYykpOwotCi0JCQkJCQlmVmlkVG9WU3RlcE1hcC5wdXQodm1kLmdldFZhbGlkYXRvcklkKCksIHZhbGlkYXRvclN0ZXApOwotCQkJCQl9Ci0KLQkJCQkJaWYgKCFmVG90YWxTY29wZVZhbGlkYXRvcnNBbHJlYWR5UnVuLmNvbnRhaW5zKHZtZCkpIHsKLQkJCQkJCWFubm90YXRpb25zVG9BZGQuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsaWRhdG9yU3RlcC5yZWNvbmNpbGUoZHIsIGRyKSkpOwotCQkJCQkJc3RlcHNSYW5PblRoaXNEaXJ0eVJlZ2lvbi5hZGQodmFsaWRhdG9yU3RlcCk7Ci0KLQkJCQkJCWlmICh2YWxpZGF0b3JTY29wZSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMKSB7Ci0JCQkJCQkJLy8gbWFyayB0aGlzIHZhbGlkYXRvciBhcyAicnVuIgotCQkJCQkJCWZUb3RhbFNjb3BlVmFsaWRhdG9yc0FscmVhZHlSdW4uYWRkKHZtZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlUZW1wb3JhcnlBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldEFubm90YXRpb25zVG9SZW1vdmUoZHIsIHN0ZXBzUmFuT25UaGlzRGlydHlSZWdpb24pOwotCQlpZiAoYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGggKyBhbm5vdGF0aW9uc1RvQWRkLnNpemUoKSA+IDApCi0JCQlzbWFydFByb2Nlc3MoYW5ub3RhdGlvbnNUb1JlbW92ZSwgKElSZWNvbmNpbGVSZXN1bHRbXSkgYW5ub3RhdGlvbnNUb0FkZC50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W2Fubm90YXRpb25zVG9BZGQuc2l6ZSgpXSkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXN1cGVyLnJlbGVhc2UoKTsKLQkJSXRlcmF0b3IgaXQgPSBmVmlkVG9WU3RlcE1hcC52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQlJUmVjb25jaWxlU3RlcCBzdGVwID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJc3RlcCA9IChJUmVjb25jaWxlU3RlcCkgaXQubmV4dCgpOwotCQkJaWYgKHN0ZXAgaW5zdGFuY2VvZiBJUmVsZWFzYWJsZSkKLQkJCQkoKElSZWxlYXNhYmxlKSBzdGVwKS5yZWxlYXNlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLkFic3RyYWN0U3RydWN0dXJlZFRleHRSZWNvbmNpbGluZ1N0cmF0ZWd5I3NldERvY3VtZW50KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50KQotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCkgewotCi0JCXN1cGVyLnNldERvY3VtZW50KGRvY3VtZW50KTsKLQotCQkvLyB2YWxpZGF0b3Igc3RlcHMgYXJlIGluICJmVklkVG9WU3RlcE1hcCIgKGFzIG9wcG9zZWQgdG8gZkZpcnN0U3RlcCA+Ci0JCS8vIG5leHQgc3RlcCBldGMuLi4pCi0JCUl0ZXJhdG9yIGl0ID0gZlZpZFRvVlN0ZXBNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKLQkJSVJlY29uY2lsZVN0ZXAgc3RlcCA9IG51bGw7Ci0JCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCXN0ZXAgPSAoSVJlY29uY2lsZVN0ZXApIGl0Lm5leHQoKTsKLQkJCXN0ZXAuc2V0SW5wdXRNb2RlbChuZXcgRG9jdW1lbnRBZGFwdGVyKGRvY3VtZW50KSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDaGVja3MgaWYgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYWNjb3JkaW5nIHRvIFZhbGlkYXRpb24gcHJlZmVyZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gdm1kCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRvckVuYWJsZWQoVmFsaWRhdG9yTWV0YURhdGEgdm1kKSB7Ci0JCWJvb2xlYW4gZW5hYmxlZCA9IHRydWU7Ci0JCVByb2plY3RDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBnZXRQcm9qZWN0Q29uZmlndXJhdGlvbigpOwotCQlvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5WYWxpZGF0b3JNZXRhRGF0YSBtZXRhZGF0YSA9IFZhbGlkYXRpb25SZWdpc3RyeVJlYWRlci5nZXRSZWFkZXIoKS5nZXRWYWxpZGF0b3JNZXRhRGF0YSh2bWQuZ2V0VmFsaWRhdG9yQ2xhc3MoKSk7Ci0JCWlmIChjb25maWd1cmF0aW9uICE9IG51bGwgJiYgbWV0YWRhdGEgIT0gbnVsbCkgewotCQkJaWYgKCFjb25maWd1cmF0aW9uLmlzQnVpbGRFbmFibGVkKG1ldGFkYXRhKSAmJiAhY29uZmlndXJhdGlvbi5pc01hbnVhbEVuYWJsZWQobWV0YWRhdGEpKQotCQkJCWVuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlyZXR1cm4gZW5hYmxlZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIGN1cnJlbnQgdmFsaWRhdGlvbiBwcm9qZWN0IGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gY3VycmVudCBwcm9qZWN0Ci0JICogKHdoaWNoIGlzIGJhc2VkIG9uIGN1cnJlbnQgZG9jdW1lbnQpCi0JICogCi0JICogQHJldHVybiBQcm9qZWN0Q29uZmlndXJhdGlvbgotCSAqLwotCXByaXZhdGUgUHJvamVjdENvbmZpZ3VyYXRpb24gZ2V0UHJvamVjdENvbmZpZ3VyYXRpb24oKSB7Ci0JCWlmIChmUHJvamVjdENvbmZpZ3VyYXRpb24gPT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlJUHJvamVjdCBwcm9qZWN0ID0gZmlsZS5nZXRQcm9qZWN0KCk7Ci0JCQkJaWYgKHByb2plY3QgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJZlByb2plY3RDb25maWd1cmF0aW9uID0gQ29uZmlndXJhdGlvbk1hbmFnZXIuZ2V0TWFuYWdlcigpLmdldFByb2plY3RDb25maWd1cmF0aW9uKHByb2plY3QpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiBmUHJvamVjdENvbmZpZ3VyYXRpb247Ci0JfQotCi0JLyoqCi0JICogR2V0cyBJRmlsZSBmcm9tIGN1cnJlbnQgZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIElGaWxlIHRoZSBJRmlsZSwgbnVsbCBpZiBubyBzdWNoIGZpbGUgZXhpc3RzCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKCkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSUZpbGUgZmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQltb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZ2V0RG9jdW1lbnQoKSk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJCVN0cmluZyBiYXNlTG9jYXRpb24gPSBtb2RlbC5nZXRCYXNlTG9jYXRpb24oKTsKLQkJCQkvLyBUaGUgYmFzZUxvY2F0aW9uIG1heSBiZSBhIHBhdGggb24gZGlzayBvciByZWxhdGl2ZSB0byB0aGUKLQkJCQkvLyB3b3Jrc3BhY2Ugcm9vdC4gRG9uJ3QgdHJhbnNsYXRlIG9uLWRpc2sgcGF0aHMgdG8KLQkJCQkvLyBpbi13b3Jrc3BhY2UgcmVzb3VyY2VzLgotCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgoYmFzZUxvY2F0aW9uKTsKLQkJCQlpZiAoYmFzZVBhdGguc2VnbWVudENvdW50KCkgPiAxKSB7Ci0JCQkJCWZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGUoYmFzZVBhdGgpOwotCQkJCQkvKgotCQkJCQkgKiBJZiB0aGUgSUZpbGUgZG9lc24ndCAgZXhpc3QsIG1ha2Ugc3VyZSBpdCdzIG5vdAotCQkJCQkgKiByZXR1cm5lZAotCQkJCQkgKi8KLQkJCQkJaWYgKCFmaWxlLmV4aXN0cygpKQotCQkJCQkJZmlsZSA9IG51bGw7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTGFiZWxQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9CYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzZDU0MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoTGFiZWxQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLQotCi0KLS8qKgotICogQmFzaWMgbGFiZWwgcHJvdmlkZXIgdGhhdCBqdXN0IHByb3ZpZGVzIGFuIGltYWdlIGFuZCBkZWZhdWx0IHRleHQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBCYXNpY1NlYXJjaExhYmVsUHJvdmlkZXIgaW1wbGVtZW50cyBJTGFiZWxQcm92aWRlciB7Ci0KLQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX09DQ19NQVRDSCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0KLQkJU3RyaW5nQnVmZmVyIHRleHQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgTWF0Y2gpIHsKLQkJCU1hdGNoIG0gPSAoTWF0Y2gpIGVsZW1lbnQ7Ci0KLQkJCUlNYXJrZXIgbWFya2VyID0gKElNYXJrZXIpIG0uZ2V0RWxlbWVudCgpOwotCQkJaWYgKG1hcmtlci5leGlzdHMoKSkgewotCQkJCVN0cmluZyByZXN1bHRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl0cnkgewotCQkJCQlyZXN1bHRUZXh0ID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShJTWFya2VyLk1FU1NBR0UpOwotCQkJCX0gY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCQl0ZXh0LmFwcGVuZChyZXN1bHRUZXh0KTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRleHQuYXBwZW5kKGVsZW1lbnQudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9CYXNpY1NlYXJjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE2ZmJkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0Jhc2ljU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLk5ld1NlYXJjaFVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIEJhc2ljU2VhcmNoUXVlcnkgaW1wbGVtZW50cyBJU2VhcmNoUXVlcnkgewotCi0JLyoqIGF0dHJpYnV0ZSB0byBpZGVudGlmeSBtYXJrZXJzIGFkZGVkIGJ5IGZpbmQgb2NjdXJyZW5jZXMgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX09DQ1VSUkVOQ0VTX01BUktFUiA9ICJvY2N1cnJlbmNlc19tYXJrZXIiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBpbnQgTElORV9MRU5HVEhfTElNSVQgPSAyMDA7Ci0KLQkvKiogdGhlIGZpbGUgd2UncmUgc2VhcmNoaW5nICogKi8KLQlwcml2YXRlIElGaWxlIGZGaWxlID0gbnVsbDsKLQkvKiogb2NjdXJyZW5jZSBzZWFyY2ggbWF0Y2hlcyAqICovCi0JcHJpdmF0ZSBMaXN0IGZNYXRjaGVzID0gbnVsbDsKLQotCXB1YmxpYyBCYXNpY1NlYXJjaFF1ZXJ5KElGaWxlIGZpbGUpIHsKLQkJdGhpcy5mRmlsZSA9IGZpbGU7Ci0JCXRoaXMuZk1hdGNoZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgbWF0Y2hTdGFydCwgaW50IG1hdGNoRW5kKSB7Ci0KLQkJdHJ5IHsKLQkJCWludCBsaW5lTnVtYmVyID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KG1hdGNoU3RhcnQpOwotCQkJaW50IGxpbmVTdGFydCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQobGluZU51bWJlcik7Ci0JCQlpbnQgbGluZUxlbmd0aCA9IGRvY3VtZW50LmdldExpbmVMZW5ndGgobGluZU51bWJlcik7Ci0KLQkJCVN0cmluZyBzZWFyY2hSZXN1bHRTdHJpbmcgPSBkb2N1bWVudC5nZXQoKS5zdWJzdHJpbmcobGluZVN0YXJ0LCBsaW5lU3RhcnQgKyBsaW5lTGVuZ3RoKS50cmltKCk7Ci0KLQkJCS8vIGNyZWF0ZSBzZWFyY2ggbWFya2VyIChzbyBhbm5vdGF0aW9ucyBzaG93IHVwIGluIGVkaXRvcikKLQkJCUlNYXJrZXIgbWFya2VyID0gY3JlYXRlU2VhcmNoTWFya2VyKG1hdGNoU3RhcnQsIG1hdGNoRW5kLCBsaW5lTnVtYmVyLCBzZWFyY2hSZXN1bHRTdHJpbmcpOwotCi0JCQlhZGRNYXRjaChuZXcgTWF0Y2gobWFya2VyLCBNYXRjaC5VTklUX0NIQVJBQ1RFUiwgbWF0Y2hTdGFydCwgbWF0Y2hTdGFydCArIG1hdGNoRW5kKSk7Ci0KLQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRNYXRjaChNYXRjaCBtYXRjaCkgewotCQlpZiAobWF0Y2ggIT0gbnVsbCkKLQkJCXRoaXMuZk1hdGNoZXMuYWRkKG1hdGNoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjY2FuUmVydW4oKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhblJlcnVuKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2NhblJ1bkluQmFja2dyb3VuZCgpCi0JICovCi0JcHVibGljIGJvb2xlYW4gY2FuUnVuSW5CYWNrZ3JvdW5kKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhck1hdGNoZXMoKSB7Ci0JCXRoaXMuZk1hdGNoZXMuY2xlYXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1hcmtlciBjcmVhdGVTZWFyY2hNYXJrZXIoaW50IG1hdGNoU3RhcnQsIGludCBtYXRjaEVuZCwgaW50IGxpbmVOdW1iZXIsIFN0cmluZyBzZWFyY2hSZXN1bHRTdHJpbmcpIHsKLQotCQlJTWFya2VyIG1hcmtlciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlpZiAoZ2V0RmlsZSgpICE9IG51bGwpIHsKLQotCQkJCW1hcmtlciA9IGdldEZpbGUoKS5jcmVhdGVNYXJrZXIoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUik7Ci0JCQkJSGFzaE1hcCBhdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXAoNik7Ci0KLQkJCQlNYXJrZXJVdGlsaXRpZXMuc2V0Q2hhclN0YXJ0KGF0dHJpYnV0ZXMsIG1hdGNoU3RhcnQpOwotCQkJCU1hcmtlclV0aWxpdGllcy5zZXRDaGFyRW5kKGF0dHJpYnV0ZXMsIG1hdGNoRW5kKTsKLQkJCQlNYXJrZXJVdGlsaXRpZXMuc2V0TGluZU51bWJlcihhdHRyaWJ1dGVzLCBsaW5lTnVtYmVyKTsKLQotCQkJCS8vIHRoaXMgbWlnaHQgYmUgYmFkIGlmIGxpbmUgb2YgdGV4dCBpcyBWRVJZIGxvbmc/Ci0JCQkJaWYgKHNlYXJjaFJlc3VsdFN0cmluZy5sZW5ndGgoKSA+IExJTkVfTEVOR1RIX0xJTUlUKQotCQkJCQlzZWFyY2hSZXN1bHRTdHJpbmcgPSBzZWFyY2hSZXN1bHRTdHJpbmcuc3Vic3RyaW5nKDAsIExJTkVfTEVOR1RIX0xJTUlUKSArICIuLi4iOyAvLyROT04tTkxTLTEkCi0JCQkJTWFya2VyVXRpbGl0aWVzLnNldE1lc3NhZ2UoYXR0cmlidXRlcywgc2VhcmNoUmVzdWx0U3RyaW5nKTsKLQotCQkJCS8vIHNvIHdlIGNhbiByZW1vdmUgdGhlbSBsYXRlcgotCQkJCWF0dHJpYnV0ZXMucHV0KEFUVFJfT0NDVVJSRU5DRVNfTUFSS0VSLCBuZXcgQm9vbGVhbih0cnVlKSk7Ci0KLQkJCQltYXJrZXIuc2V0QXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBtYXJrZXI7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGRlbGV0ZU9jY3VycmVuY2VzTWFya2VycygpIHsKLQotCQlmaW5hbCBMaXN0IHJlbW92YWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQl0cnkgewotCQkJLy8gY2xlYXIgYWxsIG9sZCBmaW5kIG9jY3VycmVuY2VzIG1hcmtlcnMKLQkJCUlNYXJrZXJbXSBzZWFyY2hNYXJrZXJzID0gZkZpbGUuZmluZE1hcmtlcnMoTmV3U2VhcmNoVUkuU0VBUkNIX01BUktFUiwgZmFsc2UsIElSZXNvdXJjZS5ERVBUSF9aRVJPKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2VhcmNoTWFya2Vycy5sZW5ndGg7IGkrKykgewotCQkJCU9iamVjdCBvID0gc2VhcmNoTWFya2Vyc1tpXS5nZXRBdHRyaWJ1dGUoQmFzaWNTZWFyY2hRdWVyeS5BVFRSX09DQ1VSUkVOQ0VTX01BUktFUik7Ci0JCQkJaWYgKG8gIT0gbnVsbCAmJiAoKEJvb2xlYW4pIG8pLmJvb2xlYW5WYWx1ZSgpID09IHRydWUpCi0JCQkJCXJlbW92YWxzLmFkZChzZWFyY2hNYXJrZXJzW2ldKTsKLQotCQkJfQotCi0JCQlpZiAocmVtb3ZhbHMuc2l6ZSgpID4gMCkgewotCQkJCUlXb3Jrc3BhY2VSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBJV29ya3NwYWNlUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBDb3JlRXhjZXB0aW9uIHsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVtb3ZhbHMuc2l6ZSgpOyBpKyspCi0JCQkJCQkJKChJTWFya2VyKSByZW1vdmFscy5nZXQoaSkpLmRlbGV0ZSgpOwotCQkJCQl9Ci0JCQkJfTsKLQkJCQlSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkucnVuKHJ1bm5hYmxlLCBudWxsKTsKLQkJCX0KLQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhlIGFjdXRhbCB3b3JrIG9mIHRoZSBxdWVyeS4gV2lsbCBiZSBydW4gaW4gYSBiYWNrZ3JvdW5kIEpvYgotCSAqIGF1dG9tYXRpY2FsbHkgaWYgY2FuUnVuSW5CYWNrZ3JvdW5kKC4uKSByZXR1cm5zIHRydWUuCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByb3RlY3RlZCBJU3RhdHVzIGRvUXVlcnkoKSB7Ci0JCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCX0KLQotCS8qCi0JICogcHVibGljIHRvIGF2b2lkIHN5bnRoZXRpYyBtZXRob2QgYWNjZXNzIGZyb20gaW5uZXIgY2xhc3MKLQkgKi8KLQlwdWJsaWMgSUZpbGUgZ2V0RmlsZSgpIHsKLQkJcmV0dXJuIHRoaXMuZkZpbGU7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldExhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgTWF0Y2hbXSBnZXRNYXRjaGVzKCkgewotCQkvLyBnZXQgcmlkIG9mIHRoZSBvbGQgbWFya2VycwotCQlpZihmRmlsZS5leGlzdHMoKSkgewotCQkJZGVsZXRlT2NjdXJyZW5jZXNNYXJrZXJzKCk7Ci0JCQlkb1F1ZXJ5KCk7Ci0JCX0KLQkJcmV0dXJuIChNYXRjaFtdKSB0aGlzLmZNYXRjaGVzLnRvQXJyYXkobmV3IE1hdGNoW3RoaXMuZk1hdGNoZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5I2dldFNlYXJjaFJlc3VsdCgpCi0JICovCi0JcHVibGljIElTZWFyY2hSZXN1bHQgZ2V0U2VhcmNoUmVzdWx0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB1c2VkIGluIHNlYXJjaCByZXN1bHQgZGlzcGxheSBsYWJlbHMKLQkgKiAKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWFyY2hUZXh0KCkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS5JU2VhcmNoUXVlcnkjcnVuKG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJLy8gZGVmZXIgdG8gImdldCguLi4pIgotCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4YmI0MWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9GaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUeXBlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWwuUGxhdGZvcm1TdGF0dXNMaW5lVXRpbDsKLQotLyoqCi0gKiBQZXJmb3JtcyB0aGUgYXBwcm9wcmlhdGUgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGFjdGlvbiBjYWxsIGJhc2VkIG9uCi0gKiBzZWxlY3Rpb24uIENsaWVudHMgY2FuIGFkZCBwcm9jZXNzb3JzIGZvciBkaWZmZXJlbnQgcGFydGl0aW9ucyB2aWEKLSAqIDxjb2RlPmdldFByb2Nlc3NvcnM8L2NvZGU+Ci0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNfbGFiZWwpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJYm9vbGVhbiBva2F5ID0gZmFsc2U7Ci0JCWlmIChmRWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3IpIHsKLQkJCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpIGZFZGl0b3I7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0VGV4dFNlbGVjdGlvbih0ZXh0RWRpdG9yKTsKLQkJCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgPSBnZXRQcm9jZXNzb3JGb3JDdXJyZW50U2VsZWN0aW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQlpZiAoZmluZE9jY3VycmVuY2VQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQlpZiAodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpIGluc3RhbmNlb2YgSUZpbGVFZGl0b3JJbnB1dCkgewotCQkJCQkJSUZpbGUgZmlsZSA9ICgoSUZpbGVFZGl0b3JJbnB1dCkgdGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKS5nZXRGaWxlKCk7Ci0JCQkJCQlva2F5ID0gZmluZE9jY3VycmVuY2VQcm9jZXNzb3IuZmluZE9jY3VycmVuY2VzKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLCBmaWxlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAob2theSkgewotCQkJLy8gY2xlYXIgc3RhdHVzIG1lc3NhZ2UKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gU1NFVUlNZXNzYWdlcy5GaW5kT2NjdXJyZW5jZXNBY3Rpb25Qcm92aWRlcl8wOyAvLyROT04tTkxTLTEkCi0JCQlQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmRpc3BsYXlFcnJvck1lc3NhZ2UoZXJyb3JNZXNzYWdlKTsKLQkJCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuYWRkT25lVGltZUNsZWFyTGlzdGVuZXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGNsZWFyIHN0YXR1cyBtZXNzYWdlCi0JCVBsYXRmb3JtU3RhdHVzTGluZVV0aWwuY2xlYXJTdGF0dXNMaW5lKCk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBhcHByb3ByaWF0ZSBmaW5kIG9jY3VycmVuY2VzIHByb2Nlc3NvcgotCSAqIAotCSAqIEBwYXJhbSBkb2N1bWVudCAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICogQHBhcmFtIHRleHRTZWxlY3Rpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgZ2V0UHJvY2Vzc29yRm9yQ3VycmVudFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJLy8gY2hlY2sgaWYgd2UgaGF2ZSBhbiBhY3Rpb24gdGhhdCdzIGVuYWJsZWQgb24gdGhlIGN1cnJlbnQgcGFydGl0aW9uCi0JCUlUeXBlZFJlZ2lvbiB0ciA9IGdldFBhcnRpdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCVN0cmluZyBwYXJ0aXRpb24gPSB0ciAhPSBudWxsID8gdHIuZ2V0VHlwZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlJdGVyYXRvciBpdCA9IGdldFByb2Nlc3NvcnMoKS5pdGVyYXRvcigpOwotCQlGaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3IgYWN0aW9uID0gbnVsbDsKLQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJYWN0aW9uID0gKEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvcikgaXQubmV4dCgpOwotCQkJLy8gd2UganVzdCBjaG9vc2UgdGhlIGZpcnN0IGFjdGlvbiB0aGF0IGNhbiBoYW5kbGUgdGhlIHBhcnRpdGlvbgotCQkJaWYgKGFjdGlvbi5lbmFibGVkRm9yUGFyaXRpdGlvbihwYXJ0aXRpb24pKQotCQkJCXJldHVybiBhY3Rpb247Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBJVHlwZWRSZWdpb24gZ2V0UGFydGl0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKHRleHRTZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlyZWdpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCXJlZ2lvbiA9IG51bGw7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlZ2lvbjsKLQl9Ci0KLQlwcml2YXRlIElUZXh0U2VsZWN0aW9uIGdldFRleHRTZWxlY3Rpb24oSVRleHRFZGl0b3IgdGV4dEVkaXRvcikgewotCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiAhc2VsZWN0aW9uLmlzRW1wdHkoKSkgewotCQkJdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQl9Ci0JCXJldHVybiB0ZXh0U2VsZWN0aW9uOwotCX0KLQotCWFic3RyYWN0IHByb3RlY3RlZCBMaXN0IGdldFByb2Nlc3NvcnMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL0ZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzlkMDlmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkuSVNlYXJjaFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnNlYXJjaC51aS5OZXdTZWFyY2hVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLS8qKgotICogPHA+Ci0gKiBGaW5kcyBvY2N1cnJlbmNlcyBvZiBhIHNwZWNpZmllZCByZWdpb24gdHlwZSB3LyByZWdpb24gdGV4dCBpbiBhbgotICogSVN0cnVjdHVyZWREb2N1bWVudC4gQ2xpZW50cyBtdXN0IGltcGxlbWVudCBnZXRQYXJ0aXRpb25UeXBlcygpIGFuZAotICogZ2V0UmVnaW9uVHlwZXMoKSB0byBpbmRpY2F0ZSB3aGljaCBwYXJ0aXRpb24gdHlwZXMgYW5kIHJlZ2lvbiB0eXBlcyBpdCBjYW4KLSAqIG9wZXJhdGUgb24uCi0gKiA8L3A+Ci0gKiAKLSAqIDxwPgotICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgPGNvZGU+Z2V0U2VhcmNoUXVlcnkoKTwvY29kZT4gaW4gb3JkZXIgdG8gcHJvdmlkZQotICogdGhlaXIgb3duIHR5cGUgb2YgInNlYXJjaCIgKGVnLiBzZWFyY2hpbmcgZm9yIFhNTCBzdGFydCB0YWdzLCBzZWFyY2hpbmcgZm9yCi0gKiBKYXZhIGVsZW1lbnRzLCBldGMuLi4pCi0gKiA8L3A+Ci0gKiAKLSAqLwotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0JcHVibGljIGJvb2xlYW4gZmluZE9jY3VycmVuY2VzKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiwgSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGZpbmRPY2N1cnJlbmNlcyA9IGZhbHNlOwotCi0JCS8vIGRldGVybWluZSBpZiBhY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90Ci0JCWlmIChkb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50OwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldCh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJSVRleHRSZWdpb24gciA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCWlmIChyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIHR5cGUgPSByLmdldFR5cGUoKTsKLQkJCQkJaWYgKGVuYWJsZWRGb3JSZWdpb25UeXBlKHR5cGUpKSB7Ci0JCQkJCQlTdHJpbmcgbWF0Y2hUZXh0ID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLQotCQkJCQkJLy8gZmlyc3Qgb2YgYWxsIGFjdGl2YXRlIHRoZSB2aWV3Ci0JCQkJCQlOZXdTZWFyY2hVSS5hY3RpdmF0ZVNlYXJjaFJlc3VsdFZpZXcoKTsKLQotCQkJCQkJaWYgKG1hdGNoVGV4dCAhPSBudWxsICYmIHR5cGUgIT0gbnVsbCkgewotCQkJCQkJCUlTZWFyY2hRdWVyeSBzZWFyY2hRdWVyeSA9IGdldFNlYXJjaFF1ZXJ5KGZpbGUsIHN0cnVjdHVyZWREb2N1bWVudCwgbWF0Y2hUZXh0LCB0eXBlLCB0ZXh0U2VsZWN0aW9uKTsKLQkJCQkJCQlpZiAoc2VhcmNoUXVlcnkgIT0gbnVsbCkgewotCQkJCQkJCQlpZiAoc2VhcmNoUXVlcnkuY2FuUnVuSW5CYWNrZ3JvdW5kKCkpCi0JCQkJCQkJCQlOZXdTZWFyY2hVSS5ydW5RdWVyeUluQmFja2dyb3VuZChzZWFyY2hRdWVyeSk7Ci0JCQkJCQkJCWVsc2UKLQkJCQkJCQkJCU5ld1NlYXJjaFVJLnJ1blF1ZXJ5SW5Gb3JlZ3JvdW5kKG51bGwsIHNlYXJjaFF1ZXJ5KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZmluZE9jY3VycmVuY2VzID0gdHJ1ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmluZE9jY3VycmVuY2VzOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZWdpb25UeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBjYW4gb3BlcmF0ZSBvbiB0aGlzIHJlZ2lvbgotCSAqICAgICAgICAgdHlwZSAoSVRleHRSZWdpb24pLCBvdGhlcndpc2UgZmFsc2UuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGVuYWJsZWRGb3JSZWdpb25UeXBlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0KLQkJU3RyaW5nW10gYWNjZXB0ID0gZ2V0UmVnaW9uVHlwZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhY2NlcHQubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChyZWdpb25UeXBlLmVxdWFscyhhY2NlcHRbaV0pKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGVuYWJsZSBmaW5kIG9jY3VycmVuY2VzIG9uIGNlcnRhaW4KLQkgKiBwYXJ0aXRpb24ocykuCi0JICovCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFN0cmluZ1tdIGdldFBhcnRpdGlvblR5cGVzKCk7Ci0KLQkvKioKLQkgKiBDbGllbnRzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIGVuYWJsZSBmaW5kIG9jY3VycmVuY2VzIG9uIGRpZmZlcmVudAotCSAqIHJlZ2lvbiB0eXBlKHMpLgotCSAqLwotCWFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWdpb25UeXBlcygpOwotCi0JLyoqCi0JICogQ2xpZW50cyBzaG91bGQgb3ZlcnJpZGUgdG8gcHJvdmlkZSB0aGVpciBvd24gc2VhcmNoIGZvciB0aGUgZmlsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgSVNlYXJjaFF1ZXJ5IGdldFNlYXJjaFF1ZXJ5KElGaWxlIGZpbGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyByZWdpb25UZXh0LCBTdHJpbmcgcmVnaW9uVHlwZSwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlyZXR1cm4gbmV3IE9jY3VycmVuY2VzU2VhcmNoUXVlcnkoZmlsZSwgZG9jdW1lbnQsIHJlZ2lvblRleHQsIHJlZ2lvblR5cGUpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwYXJ0aXRpb25UeXBlCi0JICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIGFjdGlvbiBjYW4gb3BlcmF0ZSBvbiB0aGlzIHR5cGUgb2YKLQkgKiAgICAgICAgIHBhcnRpdGlvbiwgb3RoZXJ3aXNlIDxjb2RlPmZhbHNlPC9jb2RlPi4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlbmFibGVkRm9yUGFyaXRpdGlvbihTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlTdHJpbmdbXSBhY2NlcHQgPSBnZXRQYXJ0aXRpb25UeXBlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGFjY2VwdC5sZW5ndGg7IGkrKykgewotCQkJaWYgKHBhcnRpdGlvblR5cGUuZXF1YWxzKGFjY2VwdFtpXSkpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEyNTFmZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBPY2N1cnJlbmNlc0NvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCXByb3RlY3RlZCBmaW5hbCBPYmplY3RbXSBFTVBUWV9BUlJBWSA9IG5ldyBPYmplY3RbMF07Ci0JcHJpdmF0ZSBPY2N1cnJlbmNlc1NlYXJjaFJlc3VsdCBmUmVzdWx0ID0gbnVsbDsKLQlwcml2YXRlIFRhYmxlVmlld2VyIGZUYWJsZVZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaWYgKHRoaXMuZlJlc3VsdCAhPSBudWxsKQotCQkJdGhpcy5mUmVzdWx0LmNsZWFyTWF0Y2hlcygpOwotCQlpZiAodGhpcy5mVGFibGVWaWV3ZXIgIT0gbnVsbCkKLQkJCXRoaXMuZlRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlciNkaXNwb3NlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgZWxlbWVudHNDaGFuZ2VkKE9iamVjdFtdIHVwZGF0ZWRFbGVtZW50cykgewotCi0JCS8vVE9ETzogY29waWVkIGZyb20gSmF2YVNlYXJjaFRhYmxlQ29udGVudFByb3ZpZGVyCi0JCWludCBhZGRDb3VudCA9IDA7Ci0JCWludCByZW1vdmVDb3VudCA9IDA7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdXBkYXRlZEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7Ci0JCQlpZiAodGhpcy5mUmVzdWx0LmdldE1hdGNoQ291bnQodXBkYXRlZEVsZW1lbnRzW2ldKSA+IDApIHsKLQkJCQlpZiAodGhpcy5mVGFibGVWaWV3ZXIudGVzdEZpbmRJdGVtKHVwZGF0ZWRFbGVtZW50c1tpXSkgIT0gbnVsbCkKLQkJCQkJdGhpcy5mVGFibGVWaWV3ZXIucmVmcmVzaCh1cGRhdGVkRWxlbWVudHNbaV0pOwotCQkJCWVsc2UKLQkJCQkJdGhpcy5mVGFibGVWaWV3ZXIuYWRkKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJYWRkQ291bnQrKzsKLQkJCX0gZWxzZSB7Ci0JCQkJdGhpcy5mVGFibGVWaWV3ZXIucmVtb3ZlKHVwZGF0ZWRFbGVtZW50c1tpXSk7Ci0JCQkJcmVtb3ZlQ291bnQrKzsKLQkJCX0KLQkJfQotCX0KLQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyI2dldEVsZW1lbnRzKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQotCQl0aGlzLmZSZXN1bHQgPSAoT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQpIGlucHV0RWxlbWVudDsKLQkJcmV0dXJuIHRoaXMuZlJlc3VsdC5nZXRNYXRjaGVzKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXIjaW5wdXRDaGFuZ2VkKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyLAotCSAqICAgICAgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgVGFibGVWaWV3ZXIpCi0JCQl0aGlzLmZUYWJsZVZpZXdlciA9IChUYWJsZVZpZXdlcikgdmlld2VyOwotCQl0aGlzLmZSZXN1bHQgPSAoT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQpIG5ld0lucHV0OwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goKSB7Ci0KLQkJaWYgKHRoaXMuZlRhYmxlVmlld2VyICE9IG51bGwpCi0JCQl0aGlzLmZUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNkOTAzNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlUnVubmFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBCYXNpYyBJU2VhcmNoUXVlcnkgdGhhdCBmaW5kcyBtYXRjaGVzIG9mIHJlZ2lvbiB0eXBlIGFuZCByZWdpb24gdGV4dC4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE9jY3VycmVuY2VzU2VhcmNoUXVlcnkgZXh0ZW5kcyBCYXNpY1NlYXJjaFF1ZXJ5IHsKLQotCS8qKgotCSAqIFdlIG5lZWQgYSBydW5uYWJsZSBzbyB0aGF0IHRoZSBzZWFyY2ggbWFya2VycyBzaG93IHVwIGluIHRoZSBsaXZlCi0JICogZG9jdW1lbnQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBGaW5kUmVnaW9ucyBpbXBsZW1lbnRzIElXb3Jrc3BhY2VSdW5uYWJsZSB7Ci0KLQkJcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50IGZGaW5kUmVnaW9uc0RvY3VtZW50ID0gbnVsbDsKLQkJcHJpdmF0ZSBTdHJpbmcgZk1hdGNoTmFtZSA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZNYXRjaFJlZ2lvblR5cGUgPSBudWxsOwotCi0JCXB1YmxpYyBGaW5kUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgbWF0Y2hUZXh0LCBTdHJpbmcgbWF0Y2hSZWdpb25UeXBlKSB7Ci0KLQkJCXRoaXMuZkZpbmRSZWdpb25zRG9jdW1lbnQgPSBkb2N1bWVudDsKLQkJCXRoaXMuZk1hdGNoTmFtZSA9IG1hdGNoVGV4dDsKLQkJCXRoaXMuZk1hdGNoUmVnaW9uVHlwZSA9IG1hdGNoUmVnaW9uVHlwZTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBmaW5kT2NjdXJyZW5jZXMoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0KLQkJCWlmICghaXNDYW5jZWxlZChtb25pdG9yKSkgewotCi0JCQkJaW50IG1hdGNoU3RhcnQgPSAtMTsKLQkJCQlpbnQgbWF0Y2hFbmQgPSAtMTsKLQkJCQlTdHJpbmcgZmluZFJlZ2lvblRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCi0JCQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBudWxsOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudCA9IHRoaXMuZkZpbmRSZWdpb25zRG9jdW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkJCS8vIHRoaXMgaXMgdGhlIG1haW4gbG9vcCB0aGF0IGl0ZXJhdGVzIHRoZSBkb2N1bWVudAotCQkJCXdoaWxlIChjdXJyZW50ICE9IG51bGwgJiYgIWlzQ2FuY2VsZWQobW9uaXRvcikpIHsKLQkJCQkJcmVnaW9ucyA9IGN1cnJlbnQuZ2V0UmVnaW9ucygpOwotCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpICYmICFpc0NhbmNlbGVkKG1vbml0b3IpOyBpKyspIHsKLQotCQkJCQkJciA9IHJlZ2lvbnMuZ2V0KGkpOwotCi0JCQkJCQkvLyBtYXliZSB0aGlzIGlzIHRoZSBlcXVhbHMgY2hlY2sgd2hlcmUgc29tZSB2YWxpZAotCQkJCQkJLy8gbWF0Y2hlcyBhcmUgZmFpbGluZyAobGlrZSBzZWFyY2hpbmcgb24gZW5kIHRhZykKLQkJCQkJCWlmIChyLmdldFR5cGUoKS5lcXVhbHModGhpcy5mTWF0Y2hSZWdpb25UeXBlKSAmJiBjdXJyZW50LmdldFRleHQocikuZXF1YWxzKHRoaXMuZk1hdGNoTmFtZSkpIHsKLQotCQkJCQkJCWZpbmRSZWdpb25UZXh0ID0gY3VycmVudC5nZXRUZXh0KHIpOwotCi0JCQkJCQkJLy8gcmVnaW9uIGZvdW5kCi0JCQkJCQkJbWF0Y2hTdGFydCA9IGN1cnJlbnQuZ2V0U3RhcnRPZmZzZXQocik7Ci0JCQkJCQkJbWF0Y2hFbmQgPSBtYXRjaFN0YXJ0ICsgZmluZFJlZ2lvblRleHQudHJpbSgpLmxlbmd0aCgpOwotCi0JCQkJCQkJYWRkTWF0Y2godGhpcy5mRmluZFJlZ2lvbnNEb2N1bWVudCwgbWF0Y2hTdGFydCwgbWF0Y2hFbmQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWN1cnJlbnQgPSBjdXJyZW50LmdldE5leHQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIGJvb2xlYW4gaXNDYW5jZWxlZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCXJldHVybiBtb25pdG9yICE9IG51bGwgJiYgbW9uaXRvci5pc0NhbmNlbGVkKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0KLQkJCXRyeSB7Ci0JCQkJZmluZE9jY3VycmVuY2VzKG1vbml0b3IpOwotCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLy8gZW5kIGlubmVyIGNsYXNzIEZpbmRSZWdpb25zCi0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGZSZWdpb25UZXh0ID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmUmVnaW9uVHlwZSA9IG51bGw7Ci0KLQlwdWJsaWMgT2NjdXJyZW5jZXNTZWFyY2hRdWVyeShJRmlsZSBmaWxlLCBJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcmVnaW9uVGV4dCwgU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJc3VwZXIoZmlsZSk7Ci0JCXRoaXMuZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCXRoaXMuZlJlZ2lvblRleHQgPSByZWdpb25UZXh0OwotCQl0aGlzLmZSZWdpb25UeXBlID0gcmVnaW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjYW5SZXJ1bigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhblJ1bkluQmFja2dyb3VuZCgpIHsKLQkJLy8gcGFfVE9ETyBpbnZlc3RpZ2F0ZSB3aGF0IGlzIHJlcXVpcmVkIHRvIGRvIHRoaXMgc2FmZWx5Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VhcmNoLkJhc2ljU2VhcmNoUXVlcnkjZG9RdWVyeSgpCi0JICovCi0JcHJvdGVjdGVkIElTdGF0dXMgZG9RdWVyeSgpIHsKLQotCQljbGVhck1hdGNoZXMoKTsKLQotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCUZpbmRSZWdpb25zIGZpbmRSZWdpb25zID0gbmV3IEZpbmRSZWdpb25zKHRoaXMuZkRvY3VtZW50LCB0aGlzLmZSZWdpb25UZXh0LCB0aGlzLmZSZWdpb25UeXBlKTsKLQkJdHJ5IHsKLQkJCVJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4oZmluZFJlZ2lvbnMsIG51bGwpOwotCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCXN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgU1NFVUlQbHVnaW4uSUQsIElTdGF0dXMuT0ssICIiLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBzdGF0dXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7Ci0JCVN0cmluZyBmaWxlbmFtZSA9IFNTRVVJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8yOyAvLyROT04tTkxTLTEkICJmaWxlIgotCQlpZiAoZ2V0RmlsZSgpICE9IG51bGwpCi0JCQlmaWxlbmFtZSA9IGdldEZpbGUoKS5nZXROYW1lKCkudG9TdHJpbmcoKTsKLQkJcmV0dXJuIGZpbGVuYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoKSB7Ci0JCVN0cmluZyBsYWJlbCA9IFNTRVVJTWVzc2FnZXMuT2NjdXJyZW5jZXNTZWFyY2hRdWVyeV8wOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZ1tdIGFyZ3MgPSB7Z2V0U2VhcmNoVGV4dCgpLCBnZXRPY2N1cnJlbmNlc0NvdW50VGV4dCgpLCBnZXRGaWxlbmFtZSgpfTsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGxhYmVsLCBhcmdzKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0T2NjdXJyZW5jZXNDb3VudFRleHQoKSB7Ci0JCVN0cmluZyBjb3VudCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCS8vIHBhX1RPRE8gZHluYW1pY2FsbHkgY2hhbmdlIGNvdW50Ci0JCXJldHVybiBjb3VudDsKLQl9Ci0KLQlwdWJsaWMgSVNlYXJjaFJlc3VsdCBnZXRTZWFyY2hSZXN1bHQoKSB7Ci0JCXJldHVybiBuZXcgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRTZWFyY2hUZXh0KCkgewotCQlyZXR1cm4gdGhpcy5mUmVnaW9uVGV4dDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmN2Y3MTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlYXJjaC9PY2N1cnJlbmNlc1NlYXJjaFJlc3VsdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLklTZWFyY2hRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5JRmlsZU1hdGNoQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUZpbGVFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmVkaXRvci5FZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotLyoqCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgT2NjdXJyZW5jZXNTZWFyY2hSZXN1bHQgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hSZXN1bHQgaW1wbGVtZW50cyBJRWRpdG9yTWF0Y2hBZGFwdGVyLCBJRmlsZU1hdGNoQWRhcHRlciB7Ci0KLQlwcml2YXRlIElTZWFyY2hRdWVyeSBmUXVlcnkgPSBudWxsOwotCXByaXZhdGUgZmluYWwgTWF0Y2hbXSBOT19NQVRDSEVTID0gbmV3IE1hdGNoWzBdOwotCi0JcHVibGljIE9jY3VycmVuY2VzU2VhcmNoUmVzdWx0KElTZWFyY2hRdWVyeSBxdWVyeSkgewotCQl0aGlzLmZRdWVyeSA9IHF1ZXJ5OwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyTWF0Y2hlcygpIHsKLQkJaWYgKGdldFF1ZXJ5KCkgaW5zdGFuY2VvZiBPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5KQotCQkJKChPY2N1cnJlbmNlc1NlYXJjaFF1ZXJ5KSBnZXRRdWVyeSgpKS5jbGVhck1hdGNoZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklFZGl0b3JNYXRjaEFkYXB0ZXIjY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0LAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIE1hdGNoW10gY29tcHV0ZUNvbnRhaW5lZE1hdGNoZXMoQWJzdHJhY3RUZXh0U2VhcmNoUmVzdWx0IHJlc3VsdCwgSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0KLQkJSUVkaXRvcklucHV0IGVkaXRvcklucHV0ID0gZWRpdG9yLmdldEVkaXRvcklucHV0KCk7Ci0JCWlmIChlZGl0b3JJbnB1dCBpbnN0YW5jZW9mIElGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUlGaWxlRWRpdG9ySW5wdXQgZmlsZUVkaXRvcklucHV0ID0gKElGaWxlRWRpdG9ySW5wdXQpIGVkaXRvcklucHV0OwotCQkJcmV0dXJuIGNvbXB1dGVDb250YWluZWRNYXRjaGVzKHJlc3VsdCwgZmlsZUVkaXRvcklucHV0LmdldEZpbGUoKSk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMuTk9fTUFUQ0hFUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LklGaWxlTWF0Y2hBZGFwdGVyI2NvbXB1dGVDb250YWluZWRNYXRjaGVzKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlKQotCSAqLwotCXB1YmxpYyBNYXRjaFtdIGNvbXB1dGVDb250YWluZWRNYXRjaGVzKEFic3RyYWN0VGV4dFNlYXJjaFJlc3VsdCByZXN1bHQsIElGaWxlIGZpbGUpIHsKLQkJcmV0dXJuIGdldE1hdGNoZXMoKTsKLQl9Ci0KLQlwdWJsaWMgSUVkaXRvck1hdGNoQWRhcHRlciBnZXRFZGl0b3JNYXRjaEFkYXB0ZXIoKSB7Ci0JCXJldHVybiB0aGlzOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUZpbGVNYXRjaEFkYXB0ZXIjZ2V0RmlsZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKE9iamVjdCBlbGVtZW50KSB7Ci0JCS8vIHJldHVybiB0aGUgZmlsZSBmb3IgdGhlIG1hdGNoCi0JCUlGaWxlIGZpbGUgPSBudWxsOwotCQkvL1N5c3RlbS5vdXQucHJpbnRsbigiZ2V0IGZpbGUgZm9yOiIrZWxlbWVudCk7Ci0JCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSU1hcmtlcikgewotCQkJSVJlc291cmNlIHIgPSAoKElNYXJrZXIpIGVsZW1lbnQpLmdldFJlc291cmNlKCk7Ci0JCQlpZiAociBpbnN0YW5jZW9mIElGaWxlKSB7Ci0JCQkJZmlsZSA9IChJRmlsZSkgcjsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmlsZTsKLQl9Ci0KLQlwdWJsaWMgSUZpbGVNYXRjaEFkYXB0ZXIgZ2V0RmlsZU1hdGNoQWRhcHRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9PQ0NfTUFUQ0gpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbGFiZWwgc2hvd3MgdXAgaW4gdGhlIHNlYXJjaCBoaXN0b3J5Ci0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbCgpIHsKLQkJcmV0dXJuIGdldFF1ZXJ5KCkuZ2V0TGFiZWwoKTsKLQl9Ci0KLQlwdWJsaWMgTWF0Y2hbXSBnZXRNYXRjaGVzKCkgewotCQkvLyBlbnN1cmUgdGhhdCBxdWVyeSBpcyBkb25lIHJ1bm5pbmcKLQkJcmV0dXJuICgoT2NjdXJyZW5jZXNTZWFyY2hRdWVyeSkgZ2V0UXVlcnkoKSkuZ2V0TWF0Y2hlcygpOwotCX0KLQotCXB1YmxpYyBJU2VhcmNoUXVlcnkgZ2V0UXVlcnkoKSB7Ci0JCXJldHVybiB0aGlzLmZRdWVyeTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2x0aXAoKSB7Ci0JCXJldHVybiBnZXRMYWJlbCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuSUVkaXRvck1hdGNoQWRhcHRlciNpc1Nob3duSW5FZGl0b3Iob3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuTWF0Y2gsCi0JICogICAgICBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1Nob3duSW5FZGl0b3IoTWF0Y2ggbWF0Y2gsIElFZGl0b3JQYXJ0IGVkaXRvcikgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VhcmNoL09jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNTZWFyY2hWaWV3UGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDU0MTMxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWFyY2gvT2NjdXJyZW5jZXNTZWFyY2hWaWV3UGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5NYXRjaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotCi0vKioKLSAqIEJhc2UgcGFnZSBmb3IgT2NjdXJyZW5jZXMgaW4gZmlsZSBzZWFyY2ggcmVzdWx0cy4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotcHVibGljIGNsYXNzIE9jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UgZXh0ZW5kcyBBYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSB7Ci0KLQlwcml2YXRlIE9jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHVibGljIE9jY3VycmVuY2VzU2VhcmNoVmlld1BhZ2UoKSB7Ci0JCXN1cGVyKEFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlLkZMQUdfTEFZT1VUX0ZMQVQpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjY2xlYXIoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsZWFyKCkgewotCQlpZiAodGhpcy5mQ29udGVudFByb3ZpZGVyICE9IG51bGwpCi0JCQl0aGlzLmZDb250ZW50UHJvdmlkZXIuY2xlYXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRhYmxlVmlld2VyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVWaWV3ZXIpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlVGFibGVWaWV3ZXIoVGFibGVWaWV3ZXIgdmlld2VyKSB7Ci0KLQkJLy8gcGFfVE9ETyBuZWVkIHNvcnRlcj8KLQkJdmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IEJhc2ljU2VhcmNoTGFiZWxQcm92aWRlcigpKTsKLQkJdGhpcy5mQ29udGVudFByb3ZpZGVyID0gbmV3IE9jY3VycmVuY2VzQ29udGVudFByb3ZpZGVyKCk7Ci0JCXZpZXdlci5zZXRDb250ZW50UHJvdmlkZXIodGhpcy5mQ29udGVudFByb3ZpZGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0LkFic3RyYWN0VGV4dFNlYXJjaFZpZXdQYWdlI2NvbmZpZ3VyZVRyZWVWaWV3ZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZVRyZWVWaWV3ZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJLy8gbm90IHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5zZWFyY2gudWkudGV4dC5BYnN0cmFjdFRleHRTZWFyY2hWaWV3UGFnZSNlbGVtZW50c0NoYW5nZWQoamF2YS5sYW5nLk9iamVjdFtdKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVsZW1lbnRzQ2hhbmdlZChPYmplY3RbXSBvYmplY3RzKSB7Ci0JCWlmICh0aGlzLmZDb250ZW50UHJvdmlkZXIgIT0gbnVsbCkgewotCQkJdGhpcy5mQ29udGVudFByb3ZpZGVyLmVsZW1lbnRzQ2hhbmdlZChvYmplY3RzKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZvcmNlUmVmcmVzaCgpIHsKLQkJdGhpcy5mQ29udGVudFByb3ZpZGVyLnJlZnJlc2goKTsKLQl9Ci0KLQlwcml2YXRlIElXb3JrYmVuY2hQYWdlIGdldEFjdGl2ZVBhZ2UoKSB7Ci0KLQkJSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IHdvcmtiZW5jaC5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJaWYgKHdpbmRvdyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB3b3JrYmVuY2guZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2UjZ2V0RGlzcGxheWVkTWF0Y2hlcyhqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBNYXRjaFtdIGdldERpc3BsYXllZE1hdGNoZXMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTI2NDAKLQkJLy8gd2Ugb25seSBldmVyIHNob3cgb25lIGF0IGEgdGltZSwgdGhlIGVsZW1lbnQgcGFzc2VkIGluIGlzIHRoZSBtYXRjaAotCQkvLyBzdXBlciB3YXMgcmV0dXJuaW5nIG51bGwKLQkJcmV0dXJuIG5ldyBNYXRjaFtdeyhNYXRjaCkgZWxlbWVudH07Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHNob3coSU1hcmtlciBtYXJrZXIpIHsKLQotCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsKLQkJaWYgKHJlc291cmNlID09IG51bGwgfHwgIXJlc291cmNlLmV4aXN0cygpKQotCQkJcmV0dXJuOwotCi0JCUlXb3JrYmVuY2hQYWdlIGFjdGl2ZVBhZ2UgPSBnZXRBY3RpdmVQYWdlKCk7Ci0JCXRyeSB7Ci0JCQlpZiAoYWN0aXZlUGFnZSAhPSBudWxsKSB7Ci0KLQkJCQkvLyBvcGVuIGVkaXRvciBpZiBuZWVkZWQKLQkJCQlJREUub3BlbkVkaXRvcihnZXRBY3RpdmVQYWdlKCksIG1hcmtlcik7Ci0KLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBhY3RpdmVQYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQkJCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJCQlJR290b01hcmtlciBnb3RvTWFya2VyID0gKElHb3RvTWFya2VyKSBlZGl0b3IuZ2V0QWRhcHRlcihJR290b01hcmtlci5jbGFzcyk7Ci0JCQkJCWlmIChnb3RvTWFya2VyICE9IG51bGwpCi0JCQkJCQlnb3RvTWFya2VyLmdvdG9NYXJrZXIobWFya2VyKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfSBjYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJLy8gcG9zc2libGUgZXhjZXB0aW9uIHRyeWluZyB0byBvcGVuIGVkaXRvcgotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc2VhcmNoLnVpLnRleHQuQWJzdHJhY3RUZXh0U2VhcmNoVmlld1BhZ2Ujc2hvd01hdGNoKG9yZy5lY2xpcHNlLnNlYXJjaC51aS50ZXh0Lk1hdGNoLAotCSAqICAgICAgaW50LCBpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2hvd01hdGNoKE1hdGNoIG1hdGNoLCBpbnQgY3VycmVudE9mZnNldCwgaW50IGN1cnJlbnRMZW5ndGgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCU9iamVjdCBvID0gbWF0Y2guZ2V0RWxlbWVudCgpOwotCQlpZiAobyBpbnN0YW5jZW9mIElNYXJrZXIpIHsKLQkJCXNob3coKElNYXJrZXIpIG8pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TZWxlY3Rpb25IaXN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbkhpc3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNTIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1NlbGVjdGlvbkhpc3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci0KLXB1YmxpYyBjbGFzcyBTZWxlY3Rpb25IaXN0b3J5IHsKLQlwcml2YXRlIElUZXh0RWRpdG9yIGZFZGl0b3I7Ci0JcHJpdmF0ZSBMaXN0IGZIaXN0b3J5OwotCXByaXZhdGUgTGlzdCBmSGlzdG9yeUFjdGlvbnM7Ci0JcHJpdmF0ZSBpbnQgZlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyQ291bnRlcjsKLQlwcml2YXRlIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgZlNlbGVjdGlvbkxpc3RlbmVyOwotCi0JcHVibGljIFNlbGVjdGlvbkhpc3RvcnkoSVRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZkVkaXRvciA9IGVkaXRvcjsKLQkJZkhpc3RvcnkgPSBuZXcgQXJyYXlMaXN0KDMpOwotCQlmU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJaWYgKGZTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckNvdW50ZXIgPT0gMCkKLQkJCQkJZmx1c2goKTsKLQkJCX0KLQkJfTsKLQkJZkVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihmU2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5yZW1vdmVTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWlmIChmSGlzdG9yeSAhPSBudWxsICYmICFmSGlzdG9yeS5pc0VtcHR5KCkpIHsKLQkJCWZIaXN0b3J5LmNsZWFyKCk7Ci0JCX0KLQkJaWYgKGZIaXN0b3J5QWN0aW9ucyAhPSBudWxsICYmICFmSGlzdG9yeUFjdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQlmSGlzdG9yeUFjdGlvbnMuY2xlYXIoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGZsdXNoKCkgewotCQlpZiAoZkhpc3RvcnkuaXNFbXB0eSgpKQotCQkJcmV0dXJuOwotCQlmSGlzdG9yeS5jbGVhcigpOwotCQl1cGRhdGVIaXN0b3J5QWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0TGFzdCgpIHsKLQkJaWYgKGlzRW1wdHkoKSkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgc2l6ZSA9IGZIaXN0b3J5LnNpemUoKTsKLQkJSVJlZ2lvbiByZXN1bHQgPSAoSVJlZ2lvbikgZkhpc3RvcnkucmVtb3ZlKHNpemUgLSAxKTsKLQkJdXBkYXRlSGlzdG9yeUFjdGlvbigpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKSB7Ci0JCWZTZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lckNvdW50ZXIrKzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gZkhpc3RvcnkuaXNFbXB0eSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpIHsKLQkJZlNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyQ291bnRlci0tOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbWVtYmVyKElSZWdpb24gcmVnaW9uKSB7Ci0JCWZIaXN0b3J5LmFkZChyZWdpb24pOwotCQl1cGRhdGVIaXN0b3J5QWN0aW9uKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0SGlzdG9yeUFjdGlvbihJQWN0aW9uIGFjdGlvbikgewotCQlBc3NlcnQuaXNOb3ROdWxsKGFjdGlvbik7Ci0JCQotCQlpZiAoZkhpc3RvcnlBY3Rpb25zID09IG51bGwpCi0JCQlmSGlzdG9yeUFjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWlmICghZkhpc3RvcnlBY3Rpb25zLmNvbnRhaW5zKGFjdGlvbikpCi0JCQlmSGlzdG9yeUFjdGlvbnMuYWRkKGFjdGlvbik7Ci0JCQotCQkvLyB1cGRhdGUgYWN0aW9uCi0JCWlmIChmSGlzdG9yeSAhPSBudWxsICYmICFmSGlzdG9yeS5pc0VtcHR5KCkpCi0JCQlhY3Rpb24uc2V0RW5hYmxlZCh0cnVlKTsKLQkJZWxzZQotCQkJYWN0aW9uLnNldEVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVIaXN0b3J5QWN0aW9uKCkgewotCQlpZiAoZkhpc3RvcnlBY3Rpb25zICE9IG51bGwgJiYgIWZIaXN0b3J5QWN0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCWJvb2xlYW4gZW5hYmxlZCA9IGZhbHNlOwotCQkJaWYgKGZIaXN0b3J5ICE9IG51bGwgJiYgIWZIaXN0b3J5LmlzRW1wdHkoKSkKLQkJCQllbmFibGVkID0gdHJ1ZTsKLQotCQkJSXRlcmF0b3IgaXRlciA9IGZIaXN0b3J5QWN0aW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0JCQkJKChJQWN0aW9uKWl0ZXIubmV4dCgpKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlU2VsZWN0QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOGYyZjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCB1c2UgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIGluc3RlYWQKLSAqLwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgU3RydWN0dXJlU2VsZWN0QWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRFZGl0b3IgZkVkaXRvciA9IG51bGw7Ci0JcHJvdGVjdGVkIFNlbGVjdGlvbkhpc3RvcnkgZkhpc3Rvcnk7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsID0gbnVsbDsKLQlwcm90ZWN0ZWQgU3RydWN0dXJlZFRleHRWaWV3ZXIgZlZpZXdlciA9IG51bGw7Ci0KLQlwdWJsaWMgU3RydWN0dXJlU2VsZWN0QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcigpOwotCi0JCUFzc2VydC5pc05vdE51bGwoZWRpdG9yKTsKLQkJZkVkaXRvciA9IGVkaXRvcjsKLQkJZkhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCWZWaWV3ZXIgPSBlZGl0b3IuZ2V0VGV4dFZpZXdlcigpOwotCQlmTW9kZWwgPSBlZGl0b3IuZ2V0TW9kZWwoKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChmVmlld2VyKTsKLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKCk7Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKGludCBvZmZzZXQpIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQotCQlpbnQgbGFzdE9mZnNldCA9IG9mZnNldDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZkVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZkVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlpbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihsYXN0T2Zmc2V0KTsKLQkJCQl3aGlsZSAoaW5kZXhlZFJlZ2lvbiA9PSBudWxsICYmIGxhc3RPZmZzZXQgPj0gMCkgewotCQkJCQlsYXN0T2Zmc2V0LS07Ci0JCQkJCWluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGluZGV4ZWRSZWdpb247Ci0JfQotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24oTm9kZSBub2RlLCBSZWdpb24gcmVnaW9uKTsKLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJUmVnaW9uIGN1cnJlbnRSZWdpb24gPSBuZXcgUmVnaW9uKGZWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLngsIGZWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLnkpOwotCQlpZiAoY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSA9PSBmVmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkpCi0JCQlyZXR1cm47Ci0KLQkJSW5kZXhlZFJlZ2lvbiBjdXJzb3JJbmRleGVkUmVnaW9uID0gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbigpOwotCQlpZiAoY3Vyc29ySW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgY3Vyc29yTm9kZSA9IChOb2RlKSBjdXJzb3JJbmRleGVkUmVnaW9uOwotCi0JCQkvLyB1c2UgcGFyZW50IG5vZGUgZm9yIGVtcHR5IHRleHQgbm9kZQotCQkJaWYgKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJY3Vyc29yTm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJaWYgKGN1cnNvck5vZGUgaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKQotCQkJCQljdXJzb3JJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIGN1cnNvck5vZGU7Ci0JCQl9Ci0KLQkJCVJlZ2lvbiBjdXJzb3JOb2RlUmVnaW9uID0gbmV3IFJlZ2lvbihjdXJzb3JJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIGN1cnNvckluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSBjdXJzb3JJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IGN1cnJlbnRSZWdpb24uZ2V0T2Zmc2V0KCkgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSBjdXJyZW50UmVnaW9uLmdldE9mZnNldCgpICsgY3VycmVudFJlZ2lvbi5nZXRMZW5ndGgoKSAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50UmVnaW9uLmdldE9mZnNldCgpICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJyZW50UmVnaW9uLmdldExlbmd0aCgpKQotCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbihjdXJzb3JOb2RlLCBjdXJyZW50UmVnaW9uKTsKLQkJCWVsc2UKLQkJCQluZXdSZWdpb24gPSBjdXJzb3JOb2RlUmVnaW9uOwotCi0JCQlpZiAobmV3UmVnaW9uICE9IG51bGwpIHsKLQkJCQlmSGlzdG9yeS5yZW1lbWJlcihjdXJyZW50UmVnaW9uKTsKLQkJCQl0cnkgewotCQkJCQlmSGlzdG9yeS5pZ25vcmVTZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQkJCWZFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2OTc0NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVVwZGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlU2VsZWN0SGlzdG9yeUFjdGlvbiBleHRlbmRzIFN0cnVjdHVyZVNlbGVjdEFjdGlvbiBpbXBsZW1lbnRzIElVcGRhdGUgewotCXB1YmxpYyBTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5QWN0aW9uKFN0cnVjdHVyZWRUZXh0RWRpdG9yIGVkaXRvcikgewotCQlzdXBlcihlZGl0b3IpOwotCQlzZXRUZXh0KFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbCk7IC8vJE5PTi1OTFMtMSQKLQkJc2V0VG9vbFRpcFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXApOyAvLyROT04tTkxTLTEkCi0JCXNldERlc2NyaXB0aW9uKFNTRVVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9kZXNjcmlwdGlvbik7IC8vJE5PTi1OTFMtMSQKLQotCQl1cGRhdGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihOb2RlIG5vZGUsIFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlJUmVnaW9uIG9sZCA9IGZIaXN0b3J5LmdldExhc3QoKTsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZIaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQlmRWRpdG9yLnNlbGVjdEFuZFJldmVhbChvbGQuZ2V0T2Zmc2V0KCksIG9sZC5nZXRMZW5ndGgoKSk7Ci0JCQl9IGZpbmFsbHkgewotCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQlzZXRFbmFibGVkKCFmSGlzdG9yeS5pc0VtcHR5KCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTBjMjRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkRlbGVnYXRlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld1BhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZSBpbXBsZW1lbnRzIElFZGl0b3JBY3Rpb25EZWxlZ2F0ZSwgSUFjdGlvbkRlbGVnYXRlMiwgSVZpZXdBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBJRWRpdG9yUGFydCBmRWRpdG9yOwotCXByaXZhdGUgU2VsZWN0aW9uSGlzdG9yeSBmSGlzdG9yeTsKLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWZFZGl0b3IgPSBudWxsOwotCQlmSGlzdG9yeSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdChJVmlld1BhcnQgdmlldykgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZkVkaXRvcjsKLQotCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0ZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSB0ZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXREb2N1bWVudCh0ZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCQkJLy8gZGV0ZXJtaW5lIGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbiAmJiBkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPCBkb2N1bWVudC5nZXRMZW5ndGgoKSkgewotCQkJCQkvLyBnZXQgY3VycmVudCBpbmRleGVkIHJlZ2lvbgotCQkJCQlJbmRleGVkUmVnaW9uIGN1cnNvckluZGV4ZWRSZWdpb24gPSBnZXRDdXJzb3JJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uKTsKLQotCQkJCQkvLyBkZXRlcm1pbmUgbmV3IHNlbGVjdGlvbiBiYXNlZCBvbiBjdXJyZW50IGluZGV4ZWQgcmVnaW9uCi0JCQkJCVJlZ2lvbiBuZXdTZWxlY3Rpb25SZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24oY3Vyc29ySW5kZXhlZFJlZ2lvbiwgdGV4dFNlbGVjdGlvbik7Ci0KLQkJCQkJLy8gc2VsZWN0IG5ldyBzZWxlY3Rpb24KLQkJCQkJaWYgKG5ld1NlbGVjdGlvblJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlmSGlzdG9yeS5yZW1lbWJlcihuZXcgUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpKTsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJZkhpc3RvcnkuaWdub3JlU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCQkJCXRleHRFZGl0b3Iuc2VsZWN0QW5kUmV2ZWFsKG5ld1NlbGVjdGlvblJlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3U2VsZWN0aW9uUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJCWZpbmFsbHkgewotCQkJCQkJCWZIaXN0b3J5Lmxpc3RlblRvU2VsZWN0aW9uQ2hhbmdlcygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJQWN0aW9uIGFjdGlvbiwgSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWZFZGl0b3IgPSB0YXJnZXRFZGl0b3I7Ci0JCWlmIChmRWRpdG9yICE9IG51bGwpCi0JCQlmSGlzdG9yeSA9IChTZWxlY3Rpb25IaXN0b3J5KSBmRWRpdG9yLmdldEFkYXB0ZXIoU2VsZWN0aW9uSGlzdG9yeS5jbGFzcyk7Ci0JCWVsc2UKLQkJCWZIaXN0b3J5ID0gbnVsbDsKLQl9Ci0JCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pOwotCQotCWFic3RyYWN0IHByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbik7Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBwcm9iYWJseSBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCBieSB1c2luZyBuZXcgc2VsZWN0aW9uIHByb3ZpZGVyCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgSW5kZXhlZFJlZ2lvbiBnZXRJbmRleGVkUmVnaW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCkgewotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWludCBsYXN0T2Zmc2V0ID0gb2Zmc2V0OwotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGxhc3RPZmZzZXQpOwotCQkJCXdoaWxlIChpbmRleGVkUmVnaW9uID09IG51bGwgJiYgbGFzdE9mZnNldCA+PSAwKSB7Ci0JCQkJCWxhc3RPZmZzZXQtLTsKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24obGFzdE9mZnNldCk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZGM1YzguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotCi0vKioKLSAqIFNlbGVjdGlvbiBoaXN0b3J5IGFjdGlvbiBkZWxlZ2F0ZS4gS2VlcHMgdHJhY2sgb2Ygc2VsZWN0aW9uIHdpdGhpbiBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0SGlzdG9yeUFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHJpdmF0ZSBTZWxlY3Rpb25IaXN0b3J5IGZIaXN0b3J5OwotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJZkVkaXRvciA9IG51bGw7Ci0JCWZIaXN0b3J5ID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChTU0VVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oU1NFVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSVZpZXdQYXJ0IHZpZXcpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlJUmVnaW9uIG9sZCA9IGZIaXN0b3J5LmdldExhc3QoKTsKLQkJaWYgKG9sZCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWZIaXN0b3J5Lmlnbm9yZVNlbGVjdGlvbkNoYW5nZXMoKTsKLQkJCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkoKElUZXh0RWRpdG9yKSBmRWRpdG9yKS5zZWxlY3RBbmRSZXZlYWwob2xkLmdldE9mZnNldCgpLCBvbGQuZ2V0TGVuZ3RoKCkpOwotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJZkhpc3RvcnkubGlzdGVuVG9TZWxlY3Rpb25DaGFuZ2VzKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoSUFjdGlvbiBhY3Rpb24sIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCQlpZiAoZkVkaXRvciAhPSBudWxsKQotCQkJZkhpc3RvcnkgPSAoU2VsZWN0aW9uSGlzdG9yeSkgZkVkaXRvci5nZXRBZGFwdGVyKFNlbGVjdGlvbkhpc3RvcnkuY2xhc3MpOwotCQllbHNlCi0JCQlmSGlzdG9yeSA9IG51bGw7Ci0JCWlmIChmSGlzdG9yeSAhPSBudWxsKSB7Ci0JCQlmSGlzdG9yeS5zZXRIaXN0b3J5QWN0aW9uKGFjdGlvbik7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxjaGVja1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvc3BlbGxpbmcvU3BlbGxjaGVja1N0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMDFjMTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3NwZWxsaW5nL1NwZWxsY2hlY2tTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zcGVsbGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSW5zdGFuY2VTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQucmVjb25jaWxlci5EaXJ0eVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVJlc3VsdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuSVJlY29uY2lsZVN0ZXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5JUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlByb3BlcnR5Q2hhbmdlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LkVkaXRvcnNVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlcy5TY29wZWRQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5zcGVsbGluZy5JU3BlbGxpbmdQcm9ibGVtQ29sbGVjdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdFbmdpbmVEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdQcm9ibGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3Iuc3BlbGxpbmcuU3BlbGxpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5Eb2N1bWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5TdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5TdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuVGVtcG9yYXJ5QW5ub3RhdGlvbjsKLQotLyoqCi0gKiBBIHJlY29uY2lsaW5nIHN0cmF0ZWd5IHRoYXQgcXVlcmllcyB0aGUgU3BlbGxpbmdTZXJ2aWNlIHVzaW5nIGl0cyBkZWZhdWx0Ci0gKiBlbmdpbmUuIFJlc3VsdHMgYXJlIHNob3cgYXMgdGVtcG9yYXJ5IGFubm90YXRpb25zLgotICogCi0gKiBAc2luY2UgMS41Ci0gKi8KLXB1YmxpYyBjbGFzcyBTcGVsbGNoZWNrU3RyYXRlZ3kgZXh0ZW5kcyBTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kgewotCi0JY2xhc3MgU3BlbGxDaGVja1ByZWZlcmVuY2VMaXN0ZW5lciBpbXBsZW1lbnRzIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJlc3RpbmdQcm9wZXJ0eShPYmplY3QgcHJvcGVydHkpIHsKLQkJCXJldHVybiBTcGVsbGluZ1NlcnZpY2UuUFJFRkVSRU5DRV9TUEVMTElOR19FTkFCTEVELmVxdWFscyhwcm9wZXJ0eSkgfHwgU3BlbGxpbmdTZXJ2aWNlLlBSRUZFUkVOQ0VfU1BFTExJTkdfRU5HSU5FLmVxdWFscyhwcm9wZXJ0eSk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoaXNJbnRlcmVzdGluZ1Byb3BlcnR5KGV2ZW50LmdldFByb3BlcnR5KCkpKSB7Ci0JCQkJaWYgKGV2ZW50LmdldE9sZFZhbHVlKCkgPT0gbnVsbCB8fCBldmVudC5nZXROZXdWYWx1ZSgpID09IG51bGwgfHwgIWV2ZW50LmdldE5ld1ZhbHVlKCkuZXF1YWxzKGV2ZW50LmdldE9sZFZhbHVlKCkpKSB7Ci0JCQkJCXJlY29uY2lsZSgpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgU3BlbGxpbmdQcm9ibGVtQ29sbGVjdG9yIGltcGxlbWVudHMgSVNwZWxsaW5nUHJvYmxlbUNvbGxlY3RvciB7Ci0JCUxpc3QgYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJcHVibGljIHZvaWQgYWNjZXB0KFNwZWxsaW5nUHJvYmxlbSBwcm9ibGVtKSB7Ci0JCQlUZW1wb3JhcnlBbm5vdGF0aW9uIGFubm90YXRpb24gPSBuZXcgVGVtcG9yYXJ5QW5ub3RhdGlvbihuZXcgUG9zaXRpb24ocHJvYmxlbS5nZXRPZmZzZXQoKSwgcHJvYmxlbS5nZXRMZW5ndGgoKSksIFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfV0FSTklORywgcHJvYmxlbS5nZXRNZXNzYWdlKCksIGZSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KTsKLQkJCS8qCi0JCQkgKiBUT0RPOiBjcmVhdGUgYW5kIHVzZSBhbiBJUXVpY2tGaXhQcm9jZXNzb3IgdGhhdCB1c2VzCi0JCQkgKiBwcm9ibGVtLmdldFByb3Bvc2FscygpIGZvciBmaXhlcyBbbm90ZSwgdGhlIGRlZmF1bHQgZW5naW5lCi0JCQkgKiBkb2Vzbid0IHByb3Bvc2UgZml4ZXMsIGF0IGxlYXN0IHdpdGhvdXQgYSBkaWN0aW9uYXJ5XS4KLQkJCSAqLwotCQkJYW5ub3RhdGlvbi5zZXRBZGRpdGlvbmFsRml4SW5mbyhwcm9ibGVtKTsKLQkJCWFubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKLQkJCWlmIChfREVCVUdfU1BFTExJTkcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCBwcm9ibGVtLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBiZWdpbkNvbGxlY3RpbmcoKSB7Ci0JCX0KLQotCQl2b2lkIGNsZWFyKCkgewotCQkJYW5ub3RhdGlvbnMuY2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGVuZENvbGxlY3RpbmcoKSB7Ci0JCX0KLQotCQlJUmVjb25jaWxlUmVzdWx0W10gZ2V0UmVzdWx0cygpIHsKLQkJCXJldHVybiAoSVJlY29uY2lsZVJlc3VsdFtdKSBhbm5vdGF0aW9ucy50b0FycmF5KG5ldyBJUmVjb25jaWxlUmVzdWx0W2Fubm90YXRpb25zLnNpemUoKV0pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBTcGVsbGluZ1N0ZXAgZXh0ZW5kcyBTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCB7Ci0JCXByb3RlY3RlZCBJUmVjb25jaWxlUmVzdWx0W10gcmVjb25jaWxlTW9kZWwoZmluYWwgRGlydHlSZWdpb24gZGlydHlSZWdpb24sIElSZWdpb24gc3ViUmVnaW9uKSB7Ci0JCQlTcGVsbGluZ1NlcnZpY2Ugc2VydmljZSA9IGdldFNwZWxsaW5nU2VydmljZShmQ29udGVudFR5cGVJZCArICIuIiArIFNwZWxsaW5nU2VydmljZS5QUkVGRVJFTkNFX1NQRUxMSU5HX0VOR0lORSk7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChfREVCVUdfU1BFTExJTkcpIHsKLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiU3BlbGwgY2hlY2tpbmcgWyIgKyBzdWJSZWdpb24uZ2V0T2Zmc2V0KCkgKyAiLSIgKyAoc3ViUmVnaW9uLmdldE9mZnNldCgpICsgc3ViUmVnaW9uLmdldExlbmd0aCgpKSArICJdIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQl9Ci0JCQlpZiAoZ2V0RG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkJc2VydmljZS5jaGVjayhnZXREb2N1bWVudCgpLCBuZXcgSVJlZ2lvbltde3N1YlJlZ2lvbn0sIGZTcGVsbGluZ0NvbnRleHQsIGZQcm9ibGVtQ29sbGVjdG9yLCBnZXRQcm9ncmVzc01vbml0b3IoKSk7Ci0JCQl9Ci0JCQlJUmVjb25jaWxlUmVzdWx0W10gcmVzdWx0cyA9IGZQcm9ibGVtQ29sbGVjdG9yLmdldFJlc3VsdHMoKTsKLQkJCWZQcm9ibGVtQ29sbGVjdG9yLmNsZWFyKCk7Ci0JCQlyZXR1cm4gcmVzdWx0czsKLQkJfQotCX0KLQotCXN0YXRpYyBmaW5hbCBib29sZWFuIF9ERUJVR19TUEVMTElORyA9IEJvb2xlYW4udmFsdWVPZihQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWNvbmNpbGVyU3BlbGxpbmciKSkuYm9vbGVhblZhbHVlKCk7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQU5OT1RBVElPTl9UWVBFID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5zcGVsbGluZyI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTkRFRF9CVUlMREVSX1RZUEUgPSAic3BlbGxpbmdzdXBwb3J0IjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfVFlQRSA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRlbXAuc3BlbGxpbmciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIFN0cmluZyBmQ29udGVudFR5cGVJZCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBmRG9jdW1lbnRQYXJ0aXRpb25pbmc7Ci0KLQlTcGVsbGluZ1Byb2JsZW1Db2xsZWN0b3IgZlByb2JsZW1Db2xsZWN0b3IgPSBuZXcgU3BlbGxpbmdQcm9ibGVtQ29sbGVjdG9yKCk7Ci0KLQkvKgotCSAqIEtleWluZyBvdXIgVGVtcG9yYXJ5IEFubm90YXRpb25zIGJhc2VkIG9uIHRoZSBwYXJ0aXRpb24gZG9lc24ndCBoZWxwCi0JICogdGhpcyBzdHJhdGVneSB0byBvbmx5IHJlbW92ZSBpdHMgb3duIFRlbXBvcmFyeUFubm90YXRpb25zIHNpbmNlIGl0J3MKLQkgKiBwb3NzaWJseSBydW4gb24gYWxsIHBhcnRpdGlvbnMuIEluc3RlYWQsIHNldCB0aGUga2V5IHRvIHVzZSBhbgotCSAqIGFyYml0cmFyeSBwYXJ0aXRpb24gdHlwZSB0aGF0IHdlIGNhbiBjaGVjayBmb3IgdXNpbmcgb3VyIG93bgotCSAqIGltcGxlbWVudGF0aW9uIG9mIGdldEFubm90YXRpb25zVG9SZW1vdmUoRGlydHlSZWdpb24pLgotCSAqIAotCSAqIFZhbHVlIGluaXRpYWxpemVkIHRocm91Z2gKLQkgKiAKLQkgKiBzdXBlcihJU291cmNlVmlld2VyKS0+c3VwZXIuaW5pdCgpLT5jcmVhdGVSZWNvbmNpbGVTdGVwcygpCi0JICovCi0JUmVjb25jaWxlQW5ub3RhdGlvbktleSBmUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLQlwcml2YXRlIElQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyIGZTcGVsbENoZWNrUHJlZmVyZW5jZUxpc3RlbmVyOwotCi0JU3BlbGxpbmdDb250ZXh0IGZTcGVsbGluZ0NvbnRleHQ7Ci0KLQkvKgotCSAqIFZhbHVlIGluaXRpYWxpemVkIHRocm91Z2gKLQkgKiAKLQkgKiBzdXBlcihJU291cmNlVmlld2VyKS0+c3VwZXIuaW5pdCgpLT5jcmVhdGVSZWNvbmNpbGVTdGVwcygpCi0JICovCi0JSVJlY29uY2lsZVN0ZXAgZlNwZWxsaW5nU3RlcDsKLQotCVN0cmluZ1tdIGZTdXBwb3J0ZWRQYXJ0aXRpb25UeXBlczsKLQotCXB1YmxpYyBTcGVsbGNoZWNrU3RyYXRlZ3koSVNvdXJjZVZpZXdlciB2aWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZUlkKSB7Ci0JCXN1cGVyKHZpZXdlcik7Ci0JCWZDb250ZW50VHlwZUlkID0gY29udGVudFR5cGVJZDsKLQotCQlmU3BlbGxpbmdDb250ZXh0ID0gbmV3IFNwZWxsaW5nQ29udGV4dCgpOwotCQlmU3BlbGxpbmdDb250ZXh0LnNldENvbnRlbnRUeXBlKFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKGZDb250ZW50VHlwZUlkKSk7Ci0JCWZSZWNvbmNpbGVBbm5vdGF0aW9uS2V5ID0gbmV3IFJlY29uY2lsZUFubm90YXRpb25LZXkoZlNwZWxsaW5nU3RlcCwgS0VZX0NPTlRFTlRfVFlQRSwgUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMKTsKLQotCQlTdHJpbmdbXSBkZWZpbml0aW9ucyA9IEV4dGVuZGVkQ29uZmlndXJhdGlvbkJ1aWxkZXIuZ2V0SW5zdGFuY2UoKS5nZXREZWZpbml0aW9ucyhFWFRFTkRFRF9CVUlMREVSX1RZUEUsIGZDb250ZW50VHlwZUlkKTsKLQkJTGlzdCBkZWZzID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGRlZmluaXRpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQlkZWZzLmFkZEFsbChBcnJheXMuYXNMaXN0KFN0cmluZ1V0aWxzLnVucGFjayhkZWZpbml0aW9uc1tpXSkpKTsKLQkJfQotCQlmU3VwcG9ydGVkUGFydGl0aW9uVHlwZXMgPSAoU3RyaW5nW10pIGRlZnMudG9BcnJheShuZXcgU3RyaW5nW2RlZnMuc2l6ZSgpXSk7Ci0KLQkJZlNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIgPSBuZXcgU3BlbGxDaGVja1ByZWZlcmVuY2VMaXN0ZW5lcigpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGNvbnRhaW5zU3RlcChJUmVjb25jaWxlU3RlcCBzdGVwKSB7Ci0JCXJldHVybiBmU3BlbGxpbmdTdGVwLmVxdWFscyhzdGVwKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVSZWNvbmNpbGVTdGVwcygpIHsKLQkJZlNwZWxsaW5nU3RlcCA9IG5ldyBTcGVsbGluZ1N0ZXAoKTsKLQl9Ci0KLQlTdHJpbmcgZ2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnRQYXJ0aXRpb25pbmcgPT0gbnVsbCA/IElEb2N1bWVudEV4dGVuc2lvbjMuREVGQVVMVF9QQVJUSVRJT05JTkcgOiBmRG9jdW1lbnRQYXJ0aXRpb25pbmc7Ci0JfQotCi0JcHJpdmF0ZSBUZW1wb3JhcnlBbm5vdGF0aW9uW10gZ2V0U3BlbGxpbmdBbm5vdGF0aW9uc1RvUmVtb3ZlKElSZWdpb24gcmVnaW9uKSB7Ci0JCUxpc3QgdG9SZW1vdmUgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZ2V0QW5ub3RhdGlvbk1vZGVsKCk7Ci0JCS8vIGNhbiBiZSBudWxsIHdoZW4gY2xvc2luZyB0aGUgZWRpdG9yCi0JCWlmIChnZXRBbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpID0gYW5ub3RhdGlvbk1vZGVsLmdldEFubm90YXRpb25JdGVyYXRvcigpOwotCQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQkJT2JqZWN0IG9iaiA9IGkubmV4dCgpOwotCQkJCWlmICghKG9iaiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pKQotCQkJCQljb250aW51ZTsKLQotCQkJCVRlbXBvcmFyeUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBvYmo7Ci0JCQkJUmVjb25jaWxlQW5ub3RhdGlvbktleSBrZXkgPSAoUmVjb25jaWxlQW5ub3RhdGlvbktleSkgYW5ub3RhdGlvbi5nZXRLZXkoKTsKLQotCQkJCS8vIHRoZW4gaWYgdGhpcyBzdHJhdGVneSBrbm93cyBob3cgdG8gYWRkL3JlbW92ZSB0aGlzCi0JCQkJLy8gcGFydGl0aW9uIHR5cGUKLQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5LmVxdWFscyhmUmVjb25jaWxlQW5ub3RhdGlvbktleSkpIHsKLQkJCQkJUG9zaXRpb24gcG9zaXRpb24gPSBhbm5vdGF0aW9uLmdldFBvc2l0aW9uKCk7Ci0JCQkJCWlmIChrZXkuZ2V0U2NvcGUoKSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlBBUlRJQUwgJiYgcG9zaXRpb24ub3ZlcmxhcHNXaXRoKHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQkJdG9SZW1vdmUuYWRkKGFubm90YXRpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGtleS5nZXRTY29wZSgpID09IFJlY29uY2lsZUFubm90YXRpb25LZXkuVE9UQUwpIHsKLQkJCQkJCXRvUmVtb3ZlLmFkZChhbm5vdGF0aW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXJldHVybiAoVGVtcG9yYXJ5QW5ub3RhdGlvbltdKSB0b1JlbW92ZS50b0FycmF5KG5ldyBUZW1wb3JhcnlBbm5vdGF0aW9uW3RvUmVtb3ZlLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBlbmdpbmVJRAotCSAqIEByZXR1cm4gdGhlIFNwZWxsaW5nU2VydmljZSB3aXRoIHRoZSBwcmVmZXJyZWQgZW5naW5lCi0JICovCi0JU3BlbGxpbmdTZXJ2aWNlIGdldFNwZWxsaW5nU2VydmljZShTdHJpbmcgZW5naW5lSUQpIHsKLQkJU3BlbGxpbmdTZXJ2aWNlIGRlZmF1bHRTZXJ2aWNlID0gRWRpdG9yc1VJLmdldFNwZWxsaW5nU2VydmljZSgpOwotCi0JCVNwZWxsaW5nU2VydmljZSBwcmVmZXJyZWRTZXJ2aWNlID0gZGVmYXVsdFNlcnZpY2U7Ci0KLQkJaWYgKGVuZ2luZUlEICE9IG51bGwpIHsKLQkJCS8qCi0JCQkgKiBTZXQgdXAgYSBwcmVmZXJlbmNlIHN0b3JlIGluZGljYXRpbmcgdGhhdCB0aGUgZ2l2ZW4gZW5naW5lCi0JCQkgKiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IHByZWZlcmVuY2Ugc3RvcmUncwotCQkJICogZGVmYXVsdAotCQkJICovCi0JCQlTcGVsbGluZ0VuZ2luZURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IGRlZmF1bHRTZXJ2aWNlLmdldFNwZWxsaW5nRW5naW5lRGVzY3JpcHRvcnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAoZW5naW5lSUQuZXF1YWxzKGRlc2NyaXB0b3JzW2ldLmdldElkKCkpKSB7Ci0JCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBuZXcgU2NvcGVkUHJlZmVyZW5jZVN0b3JlKG5ldyBJbnN0YW5jZVNjb3BlKCksIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQkJCXN0b3JlLnNldFZhbHVlKFNwZWxsaW5nU2VydmljZS5QUkVGRVJFTkNFX1NQRUxMSU5HX0VOR0lORSwgZW5naW5lSUQpOwotCQkJCQlwcmVmZXJyZWRTZXJ2aWNlID0gbmV3IFNwZWxsaW5nU2VydmljZShzdG9yZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcHJlZmVycmVkU2VydmljZTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWRQYXJ0aXRpb25UeXBlKFN0cmluZyB0eXBlKSB7Ci0JCWJvb2xlYW4gc3VwcG9ydGVkID0gZmFsc2U7Ci0JCWlmIChmU3VwcG9ydGVkUGFydGl0aW9uVHlwZXMgPT0gbnVsbCB8fCBmU3VwcG9ydGVkUGFydGl0aW9uVHlwZXMubGVuZ3RoID09IDApIHsKLQkJCXN1cHBvcnRlZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTdXBwb3J0ZWRQYXJ0aXRpb25UeXBlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICh0eXBlLmVxdWFscyhmU3VwcG9ydGVkUGFydGl0aW9uVHlwZXNbaV0pKSB7Ci0JCQkJCXN1cHBvcnRlZCA9IHRydWU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gc3VwcG9ydGVkOwotCX0KLQotCXZvaWQgcmVjb25jaWxlKCkgewotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJSVJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IG5ldyBSZWdpb24oMCwgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpOwotCQkJcmVjb25jaWxlKGRvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnJlY29uY2lsZXIuRGlydHlSZWdpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIHZvaWQgcmVjb25jaWxlKERpcnR5UmVnaW9uIGRpcnR5UmVnaW9uLCBJUmVnaW9uIHN1YlJlZ2lvbikgewotCQlpZiAoaXNDYW5jZWxlZCgpKQotCQkJcmV0dXJuOwotCi0JCVRlbXBvcmFyeUFubm90YXRpb25bXSBhbm5vdGF0aW9uc1RvUmVtb3ZlID0gbnVsbDsKLQkJSVJlY29uY2lsZVJlc3VsdFtdIGFubm90YXRpb25zVG9BZGQgPSBudWxsOwotCQlTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCBzdHJ1Y3R1cmVkU3RlcCA9IChTdHJ1Y3R1cmVkUmVjb25jaWxlU3RlcCkgZlNwZWxsaW5nU3RlcDsKLQkJSUFubm90YXRpb25Nb2RlbCBhbm5vdGF0aW9uTW9kZWwgPSBnZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXREb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQlJVHlwZWRSZWdpb25bXSBwYXJ0aXRpb25zID0gVGV4dFV0aWxpdGllcy5jb21wdXRlUGFydGl0aW9uaW5nKGRvY3VtZW50LCBnZXREb2N1bWVudFBhcnRpdGlvbmluZygpLCBkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCksIHRydWUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFydGl0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoaXNTdXBwb3J0ZWRQYXJ0aXRpb25UeXBlKHBhcnRpdGlvbnNbaV0uZ2V0VHlwZSgpKSkgewotCQkJCQkJYW5ub3RhdGlvbnNUb1JlbW92ZSA9IGdldFNwZWxsaW5nQW5ub3RhdGlvbnNUb1JlbW92ZShwYXJ0aXRpb25zW2ldKTsKLQkJCQkJCWFubm90YXRpb25zVG9BZGQgPSBzdHJ1Y3R1cmVkU3RlcC5yZWNvbmNpbGUoZGlydHlSZWdpb24sIHBhcnRpdGlvbnNbaV0pOwotCi0JCQkJCQlpZiAoYW5ub3RhdGlvbk1vZGVsIGluc3RhbmNlb2YgSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgewotCQkJCQkJCUlBbm5vdGF0aW9uTW9kZWxFeHRlbnNpb24gbW9kZWxFeHRlbnNpb24gPSAoSUFubm90YXRpb25Nb2RlbEV4dGVuc2lvbikgYW5ub3RhdGlvbk1vZGVsOwotCQkJCQkJCU1hcCBhbm5vdGF0aW9uc1RvQWRkTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFubm90YXRpb25zVG9BZGQubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJYW5ub3RhdGlvbnNUb0FkZE1hcC5wdXQoYW5ub3RhdGlvbnNUb0FkZFtqXSwgKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uc1RvQWRkW2pdKS5nZXRQb3NpdGlvbigpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJbW9kZWxFeHRlbnNpb24ucmVwbGFjZUFubm90YXRpb25zKGFubm90YXRpb25zVG9SZW1vdmUsIGFubm90YXRpb25zVG9BZGRNYXApOwotCQkJCQkJfQotCi0JCQkJCQllbHNlIHsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGFubm90YXRpb25zVG9BZGQubGVuZ3RoOyBqKyspIHsKLQkJCQkJCQkJYW5ub3RhdGlvbk1vZGVsLmFkZEFubm90YXRpb24oKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb25zVG9BZGRbal0sICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgYW5ub3RhdGlvbnNUb0FkZFtqXSkuZ2V0UG9zaXRpb24oKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYW5ub3RhdGlvbnNUb1JlbW92ZS5sZW5ndGg7IGorKykgewotCQkJCQkJCQlhbm5vdGF0aW9uTW9kZWwucmVtb3ZlQW5ub3RhdGlvbihhbm5vdGF0aW9uc1RvUmVtb3ZlW2pdKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcnRpdGlvbgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGluZ1N0cmF0ZWd5I3JlY29uY2lsZShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0KLQlwdWJsaWMgdm9pZCByZWNvbmNpbGUoSVJlZ2lvbiBwYXJ0aXRpb24pIHsKLQkJRGlydHlSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gZ2V0RG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gbmV3IERpcnR5UmVnaW9uKHBhcnRpdGlvbi5nZXRPZmZzZXQoKSwgcGFydGl0aW9uLmdldExlbmd0aCgpLCBEaXJ0eVJlZ2lvbi5JTlNFUlQsIGRvY3VtZW50LmdldChwYXJ0aXRpb24uZ2V0T2Zmc2V0KCksIHBhcnRpdGlvbi5nZXRMZW5ndGgoKSkpOwotCQkJCXJlY29uY2lsZShyZWdpb24sIHJlZ2lvbik7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpLnJlbW92ZVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0KLQkJc3VwZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaWYgKGZTcGVsbGluZ1N0ZXAgPT0gbnVsbCkgewotCQkJCWNyZWF0ZVJlY29uY2lsZVN0ZXBzKCk7Ci0JCQl9Ci0JCQlmU3BlbGxpbmdTdGVwLnNldElucHV0TW9kZWwobmV3IERvY3VtZW50QWRhcHRlcihkb2N1bWVudCkpOwotCQl9Ci0KLQkJaWYgKGdldERvY3VtZW50KCkgIT0gbnVsbCkgewotCQkJRWRpdG9yc1VJLmdldFByZWZlcmVuY2VTdG9yZSgpLmFkZFByb3BlcnR5Q2hhbmdlTGlzdGVuZXIoZlNwZWxsQ2hlY2tQcmVmZXJlbmNlTGlzdGVuZXIpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRQYXJ0aXRpb25pbmcoU3RyaW5nIHBhcnRpdGlvbmluZykgewotCQlmRG9jdW1lbnRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmc7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Fic3RyYWN0SG92ZXJQcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Fic3RyYWN0SG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVhMjc5Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9BYnN0cmFjdEhvdmVyUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmJpbmRpbmdzLlRyaWdnZXJTZXF1ZW5jZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRlZmF1bHRJbmZvcm1hdGlvbkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JSW5mb3JtYXRpb25Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmtleXMuSUJpbmRpbmdTZXJ2aWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmRlcml2ZWQuSFRNTFRleHRQcmVzZW50ZXI7Ci0KLS8qKgotICogQWJzdHJhY3QgY2xhc3MgZm9yIHByb3ZpZGluZyBob3ZlciBpbmZvcm1hdGlvbiBmb3IgU291cmNlIGVkaXRvci4gSW5jbHVkZXMKLSAqIGEgaG92ZXIgY29udHJvbCBjcmVhdG9yIHdoaWNoIGhhcyB0aGUgIlByZXNzIEYyIGZvciBmb2N1cyIgbWVzc2FnZSBidWlsdAotICogaW4uCi0gKiAKLSAqIEBzaW5jZSBXVFAgMS41Ci0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdEhvdmVyUHJvY2Vzc29yIGltcGxlbWVudHMgSVRleHRIb3ZlciwgSVRleHRIb3ZlckV4dGVuc2lvbiB7Ci0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXJFeHRlbnNpb24jZ2V0SG92ZXJDb250cm9sQ3JlYXRvcigpCi0JICovCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEhvdmVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCXJldHVybiBuZXcgSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3IoKSB7Ci0JCQlwdWJsaWMgSUluZm9ybWF0aW9uQ29udHJvbCBjcmVhdGVJbmZvcm1hdGlvbkNvbnRyb2woU2hlbGwgcGFyZW50KSB7Ci0JCQkJcmV0dXJuIG5ldyBEZWZhdWx0SW5mb3JtYXRpb25Db250cm9sKHBhcmVudCwgU1dULk5PTkUsIG5ldyBIVE1MVGV4dFByZXNlbnRlcih0cnVlKSwgZ2V0VG9vbHRpcEFmZm9yZGFuY2VTdHJpbmcoKSk7Ci0JCQl9Ci0JCX07Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2hvcnQgY3V0IGFzc2lnbmVkIHRvIHRoZSBzdWIgbWVudSBvciA8Y29kZT5udWxsPC9jb2RlPgotCSAqIGlmIG5vIHNob3J0IGN1dCBpcyBhc3NpZ25lZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzaG9ydCBjdXQgYXMgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRTaG9ydEN1dFN0cmluZygpIHsKLQkJZmluYWwgSVdvcmtiZW5jaCB3b3JrYmVuY2ggPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpOwotCQlmaW5hbCBJQmluZGluZ1NlcnZpY2UgYmluZGluZ1NlcnZpY2UgPSAoSUJpbmRpbmdTZXJ2aWNlKSB3b3JrYmVuY2guZ2V0QWRhcHRlcihJQmluZGluZ1NlcnZpY2UuY2xhc3MpOwotCQlmaW5hbCBUcmlnZ2VyU2VxdWVuY2VbXSBhY3RpdmVCaW5kaW5ncyA9IGJpbmRpbmdTZXJ2aWNlLmdldEFjdGl2ZUJpbmRpbmdzRm9yKEFjdGlvbkRlZmluaXRpb25JZHMuSU5GT1JNQVRJT04pOwotCQlpZiAoYWN0aXZlQmluZGluZ3MubGVuZ3RoID4gMCkgewotCQkJcmV0dXJuIGFjdGl2ZUJpbmRpbmdzWzBdLmZvcm1hdCgpOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdG9vbCB0aXAgYWZmb3JkYW5jZSBzdHJpbmcuCi0JICogCi0JICogQHJldHVybiB0aGUgYWZmb3JkYW5jZSBzdHJpbmcgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgZGlzYWJsZWQgb3Igbm8KLQkgKiAgICAgICAgIGtleSBiaW5kaW5nIGlzIGRlZmluZWQKLQkgKiBAc2luY2UgMy4wCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VG9vbHRpcEFmZm9yZGFuY2VTdHJpbmcoKSB7Ci0JCVN0cmluZyBzdGlja3kgPSBudWxsOwotCQlTdHJpbmcga2V5U2VxdWVuY2UgPSBnZXRTaG9ydEN1dFN0cmluZygpOwotCQlpZiAoa2V5U2VxdWVuY2UgIT0gbnVsbCkgewotCQkJc3RpY2t5ID0gTkxTLmJpbmQoU1NFVUlNZXNzYWdlcy50ZXh0SG92ZXJNYWtlU3RpY2t5SGludCwga2V5U2VxdWVuY2UpOwotCQl9Ci0JCXJldHVybiBzdGlja3k7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4NDc1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQW5ub3RhdGlvbk1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5lZGl0b3JzLnRleHQuRWRpdG9yc1VJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQW5ub3RhdGlvblByZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5DaGFpbmVkUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLklUZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotCi0vKioKLSAqIEhvdmVyIGhlbHAgdGhhdCBkaXNwbGF5cyBhbm5vdGF0aW9ucyBzaG93biBpbiB0ZXh0IG9mIGVkaXRvci4gQ3VycmVudGx5LAotICogdGhpcyB0ZXh0IGhvdmVyIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBBYnN0cmFjdFRleHRIb3ZlclByb2Nlc3Nvci4KLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIExJU1RfQkVHSU4gPSAiPHVsPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9FTEVNRU5UID0gIjxsaT4iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkFHUkFQSF9FTkQgPSAiPC9wPiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQUdSQVBIX1NUQVJUID0gIjxwPiI7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQotCS8qKgotCSAqIAotCSAqLwotCXB1YmxpYyBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogRm9ybWF0cyBhIG1zZyB0byBhIHByb3BlciBodG1sIG1lc3NhZ2UKLQkgKiAKLQkgKiBAcGFyYW0gbXNnIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbXNnIGlzIG5laXRoZXIgbnVsbCBub3IgZW1wdHkgc3RyaW5nCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGZvcm1hdE1lc3NhZ2UoU3RyaW5nIG1zZykgewotCQlTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWYuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCk7Ci0JCWJ1Zi5hcHBlbmQoU3RyaW5nVXRpbHMuY29udmVydFRvSFRNTENvbnRlbnQobXNnKSk7Ci0JCWJ1Zi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCXJldHVybiBidWYudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBGb3JtYXRzIG11bHRpcGxlIG1lc3NhZ2VzIGludG8gcHJvcGVyIGh0bWwgbWVzc2FnZQotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlcwotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBmb3JtYXRNZXNzYWdlcyhMaXN0IG1lc3NhZ2VzKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1ZmZlci5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUKTsKLQkJYnVmZmVyLmFwcGVuZChTU0VVSU1lc3NhZ2VzLk11bHRpcGxlX2Vycm9ycyk7IC8vJE5PTi1OTFMtMSQKLQkJYnVmZmVyLmFwcGVuZChMSVNUX0JFR0lOKTsKLQotCQlJdGVyYXRvciBlID0gbWVzc2FnZXMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlidWZmZXIuYXBwZW5kKExJU1RfRUxFTUVOVCk7Ci0JCQlidWZmZXIuYXBwZW5kKFN0cmluZ1V0aWxzLmNvbnZlcnRUb0hUTUxDb250ZW50KChTdHJpbmcpIGUubmV4dCgpKSk7Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIGFubm90YXRpb24uIChjb3BpZWQKLQkgKiBmcm9tIG9yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC51aS50ZXh0LmphdmEuaG92ZXIuQW5ub3RhdGlvbkhvdmVyKQotCSAqIAotCSAqIEBwYXJhbSBhbm5vdGF0aW9uCi0JICogICAgICAgICAgICB0aGUgYW5ub3RhdGlvbgotCSAqIEByZXR1cm4gdGhlIGFubm90YXRpb24gcHJlZmVyZW5jZSBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub25lCi0JICovCi0JcHJpdmF0ZSBBbm5vdGF0aW9uUHJlZmVyZW5jZSBnZXRBbm5vdGF0aW9uUHJlZmVyZW5jZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQotCQlpZiAoYW5ub3RhdGlvbi5pc01hcmtlZERlbGV0ZWQoKSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gRWRpdG9yc1VJLmdldEFubm90YXRpb25QcmVmZXJlbmNlTG9va3VwKCkuZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYW5ub3RhdGlvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCUlBbm5vdGF0aW9uTW9kZWwgbW9kZWwgPSAoKFNvdXJjZVZpZXdlcikgdmlld2VyKS5nZXRBbm5vdGF0aW9uTW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUxpc3QgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc0Fubm90YXRpb25WYWxpZChhKSkKLQkJCQkJY29udGludWU7Ci0KLQkJCQlQb3NpdGlvbiBwID0gbW9kZWwuZ2V0UG9zaXRpb24oYSk7Ci0JCQkJLy8gY2hlY2sgaWYgdGhpcyBpcyBhbiBhbm5vdGF0aW9uIGluIHRoZSByZWdpb24gd2UgYXJlCi0JCQkJLy8gY29uY2VybmVkIHdpdGgKLQkJCQlpZiAocC5vdmVybGFwc1dpdGgoaG92ZXJSZWdpb24uZ2V0T2Zmc2V0KCksIGhvdmVyUmVnaW9uLmdldExlbmd0aCgpKSkgewotCQkJCQlTdHJpbmcgbXNnID0gYS5nZXRUZXh0KCk7Ci0JCQkJCWlmICgobXNnICE9IG51bGwpICYmIG1zZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQkvLyBpdCBpcyBwb3NzaWJsZSBmb3IgdGVtcG9yYXJ5IGFubm90YXRpb25zIHRvCi0JCQkJCQkvLyBkdXBsaWNhdGUgb3RoZXIgYW5ub3RhdGlvbnMgc28gbWFrZSBzdXJlIG5vdCB0byBhZGQKLQkJCQkJCS8vIGR1cHMKLQkJCQkJCWlmIChhIGluc3RhbmNlb2YgSVRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQkJCQlib29sZWFuIGR1cGxpY2F0ZWQgPSBmYWxzZTsKLQkJCQkJCQlpbnQgaiA9IDA7Ci0JCQkJCQkJd2hpbGUgKGogPCBtZXNzYWdlcy5zaXplKCkgJiYgIWR1cGxpY2F0ZWQpIHsKLQkJCQkJCQkJZHVwbGljYXRlZCA9IG1lc3NhZ2VzLmdldChqKS5lcXVhbHMobXNnKTsKLQkJCQkJCQkJKytqOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoIWR1cGxpY2F0ZWQpIHsKLQkJCQkJCQkJbWVzc2FnZXMuYWRkKG1zZyk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbWVzc2FnZXMuYWRkKG1zZyk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAobWVzc2FnZXMuc2l6ZSgpID4gMSkgewotCQkJCXJldHVybiBmb3JtYXRNZXNzYWdlcyhtZXNzYWdlcyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChtZXNzYWdlcy5zaXplKCkgPiAwKSB7Ci0JCQkJcmV0dXJuIGZvcm1hdE1lc3NhZ2UobWVzc2FnZXMuZ2V0KDApLnRvU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlJQW5ub3RhdGlvbk1vZGVsIG1vZGVsID0gKChTb3VyY2VWaWV3ZXIpIHRleHRWaWV3ZXIpLmdldEFubm90YXRpb25Nb2RlbCgpOwotCQlSZWdpb24gaG92ZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlBbm5vdGF0aW9uIGEgPSAoQW5ub3RhdGlvbikgZS5uZXh0KCk7Ci0JCQkJaWYgKCFpc0Fubm90YXRpb25WYWxpZChhKSkKLQkJCQkJY29udGludWU7Ci0JCQkJUG9zaXRpb24gcCA9IG1vZGVsLmdldFBvc2l0aW9uKGEpOwotCQkJCWlmIChwLmluY2x1ZGVzKG9mZnNldCkpIHsKLQkJCQkJLy8gZmluZCB0aGUgc21hbGxlc3QgcmVnaW9uIGNvbnRhaW5pbmcgb2Zmc2V0Ci0JCQkJCWlmICgoaG92ZXJSZWdpb24gPT0gbnVsbCkgfHwgKGhvdmVyUmVnaW9uLmdldExlbmd0aCgpID4gcC5nZXRMZW5ndGgoKSkpIHsKLQkJCQkJCWhvdmVyUmVnaW9uID0gbmV3IFJlZ2lvbihwLmdldE9mZnNldCgpLCBwLmdldExlbmd0aCgpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gaG92ZXJSZWdpb247Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIHRoZSBwcmVmZXJlbmNlIHN0b3JlIElmIG5vIHByZWZlcmVuY2Ugc3RvcmUgaXMgY3VycmVudGx5Ci0JICogc3RvcmVkLCByZXRyZWl2ZSB0aGUgYXBwcm9wcmlhdGUgcHJlZmVyZW5jZSBzdG9yZQotCSAqLwotCXByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpIHsKLQkJCUlQcmVmZXJlbmNlU3RvcmUgc3NlRWRpdG9yUHJlZnMgPSBTU0VVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQlJUHJlZmVyZW5jZVN0b3JlIGJhc2VFZGl0b3JQcmVmcyA9IEVkaXRvcnNVSS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQkJCWZQcmVmZXJlbmNlU3RvcmUgPSBuZXcgQ2hhaW5lZFByZWZlcmVuY2VTdG9yZShuZXcgSVByZWZlcmVuY2VTdG9yZVtde3NzZUVkaXRvclByZWZzLCBiYXNlRWRpdG9yUHJlZnN9KTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlib29sZWFuIGlzQW5ub3RhdGlvblZhbGlkKEFubm90YXRpb24gYSkgewotCQlBbm5vdGF0aW9uUHJlZmVyZW5jZSBwcmVmZXJlbmNlID0gZ2V0QW5ub3RhdGlvblByZWZlcmVuY2UoYSk7Ci0JCWlmIChwcmVmZXJlbmNlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyB0ZXh0UHJlZmVyZW5jZUtleSA9IHByZWZlcmVuY2UuZ2V0VGV4dFByZWZlcmVuY2VLZXkoKTsKLQkJU3RyaW5nIGhpZ2hsaWdodFByZWZlcmVuY2VLZXkgPSBwcmVmZXJlbmNlLmdldEhpZ2hsaWdodFByZWZlcmVuY2VLZXkoKTsKLQkJaWYgKHRleHRQcmVmZXJlbmNlS2V5ID09IG51bGwgfHwgIShnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKHRleHRQcmVmZXJlbmNlS2V5KSkgfHwgaGlnaGxpZ2h0UHJlZmVyZW5jZUtleSA9PSBudWxsIHx8IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oaGlnaGxpZ2h0UHJlZmVyZW5jZUtleSkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Jlc3RNYXRjaEhvdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9CZXN0TWF0Y2hIb3Zlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTFjNjZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL0Jlc3RNYXRjaEhvdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUluZm9ybWF0aW9uQ29udHJvbENyZWF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBQcm92aWRlcyB0aGUgYmVzdCBob3ZlciBoZWxwIGRvY3VtZW50YXRpb24gKGJ5IHVzaW5nIG90aGVyIGhvdmVyIGhlbHAKLSAqIHByb2Nlc3NvcnMpIFByaW9yaXR5IG9mIGhvdmVyIGhlbHAgcHJvY2Vzc29ycyBpczogUHJvYmxlbUhvdmVyUHJvY2Vzc29yLAotICogVGFnSW5mb1Byb2Nlc3NvciwgQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yCi0gKi8KLXB1YmxpYyBjbGFzcyBCZXN0TWF0Y2hIb3ZlciBpbXBsZW1lbnRzIElUZXh0SG92ZXIsIElUZXh0SG92ZXJFeHRlbnNpb24gewotCXByaXZhdGUgSVRleHRIb3ZlciBmQmVzdE1hdGNoSG92ZXI7IC8vIGN1cnJlbnQgYmVzdCBtYXRjaCB0ZXh0IGhvdmVyCi0JcHJpdmF0ZSBJVGV4dEhvdmVyIGZUYWdJbmZvSG92ZXI7IC8vIGRvY3VtZW50YXRpb24vaW5mb3JtYXRpb24gaG92ZXIKLQlwcml2YXRlIExpc3QgZlRleHRIb3ZlcnM7IC8vIGxpc3Qgb2YgdGV4dCBob3ZlcnMgdG8gY29uc2lkZXIgaW4gYmVzdAotCS8vIG1hdGNoCi0KLQlwdWJsaWMgQmVzdE1hdGNoSG92ZXIoSVRleHRIb3ZlciBpbmZvdGFnaG92ZXIpIHsKLQkJZlRhZ0luZm9Ib3ZlciA9IGluZm90YWdob3ZlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBsaXN0IG9mIHRleHQgaG92ZXJzIGFwcGxpY2FibGUgdG8gdGhpcyBiZXN0IG1hdGNoIGhvdmVyCi0JICogcHJvY2Vzc29yCi0JICogCi0JICogQHJldHVybiBMaXN0IG9mIElUZXh0SG92ZXIgLSBpbiBhYnN0cmFjdCBjbGFzcyB0aGlzIGlzIGVtcHR5IGxpc3QKLQkgKi8KLQlwcml2YXRlIExpc3QgY3JlYXRlVGV4dEhvdmVyc0xpc3QoKSB7Ci0JCUxpc3QgaG92ZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkvLyBpZiBjdXJyZW50bHkgZGVidWdnaW5nLCB0aGVuIGFkZCB0aGUgZGVidWcgaG92ZXIgdG8gdGhlIGxpc3Qgb2YKLQkJLy8gYmVzdCBtYXRjaAotCQlpZiAoTG9nZ2VyLmlzVHJhY2luZyhEZWJ1Z0luZm9Ib3ZlclByb2Nlc3Nvci5UUkFDRUZJTFRFUikpIHsKLQkJCWhvdmVyTGlzdC5hZGQobmV3IERlYnVnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCQl9Ci0KLQkJaG92ZXJMaXN0LmFkZChuZXcgUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3NvcigpKTsKLQkJaWYgKGZUYWdJbmZvSG92ZXIgIT0gbnVsbCkgewotCQkJaG92ZXJMaXN0LmFkZChmVGFnSW5mb0hvdmVyKTsKLQkJfQotCQlob3Zlckxpc3QuYWRkKG5ldyBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IoKSk7Ci0JCXJldHVybiBob3Zlckxpc3Q7Ci0JfQotCi0JcHVibGljIElJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGdldEhvdmVyQ29udHJvbENyZWF0b3IoKSB7Ci0JCUlJbmZvcm1hdGlvbkNvbnRyb2xDcmVhdG9yIGNyZWF0b3IgPSBudWxsOwotCi0JCWlmIChmQmVzdE1hdGNoSG92ZXIgaW5zdGFuY2VvZiBJVGV4dEhvdmVyRXh0ZW5zaW9uKSB7Ci0JCQljcmVhdG9yID0gKChJVGV4dEhvdmVyRXh0ZW5zaW9uKSBmQmVzdE1hdGNoSG92ZXIpLmdldEhvdmVyQ29udHJvbENyZWF0b3IoKTsKLQkJfQotCQlyZXR1cm4gY3JlYXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlckluZm8ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gaG92ZXJSZWdpb24pIHsKLQkJU3RyaW5nIGRpc3BsYXlUZXh0ID0gbnVsbDsKLQotCQkvLyBhbHJlYWR5IGhhdmUgYSBiZXN0IG1hdGNoIGhvdmVyIHBpY2tlZCBvdXQgZnJvbSBnZXRIb3ZlclJlZ2lvbiBjYWxsCi0JCWlmIChmQmVzdE1hdGNoSG92ZXIgIT0gbnVsbCkgewotCQkJZGlzcGxheVRleHQgPSBmQmVzdE1hdGNoSG92ZXIuZ2V0SG92ZXJJbmZvKHZpZXdlciwgaG92ZXJSZWdpb24pOwotCQl9Ci0JCS8vIGVpdGhlciBoYWQgbm8gYmVzdCBtYXRjaCBob3ZlciBvciBiZXN0IG1hdGNoIGhvdmVyIHJldHVybmVkIG51bGwKLQkJaWYgKGRpc3BsYXlUZXh0ID09IG51bGwpIHsKLQkJCS8vIGdvIHRocm91Z2ggbGlzdCBvZiB0ZXh0IGhvdmVycyBhbmQgcmV0dXJuIGZpcnN0IGRpc3BsYXkgc3RyaW5nCi0JCQlJdGVyYXRvciBpID0gZ2V0VGV4dEhvdmVycygpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoKGkuaGFzTmV4dCgpKSAmJiAoZGlzcGxheVRleHQgPT0gbnVsbCkpIHsKLQkJCQlJVGV4dEhvdmVyIGhvdmVyID0gKElUZXh0SG92ZXIpIGkubmV4dCgpOwotCQkJCWRpc3BsYXlUZXh0ID0gaG92ZXIuZ2V0SG92ZXJJbmZvKHZpZXdlciwgaG92ZXJSZWdpb24pOwotCQkJfQotCQl9Ci0JCXJldHVybiBkaXNwbGF5VGV4dDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlclJlZ2lvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJUmVnaW9uIGdldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJUmVnaW9uIGhvdmVyUmVnaW9uID0gbnVsbDsKLQotCQkvLyBnbyB0aHJvdWdoIGxpc3Qgb2YgdGV4dCBob3ZlcnMgYW5kIHJldHVybiBmaXJzdCBob3ZlciByZWdpb24KLQkJSVRleHRIb3ZlciBob3ZlciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGkgPSBnZXRUZXh0SG92ZXJzKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKChpLmhhc05leHQoKSkgJiYgKGhvdmVyUmVnaW9uID09IG51bGwpKSB7Ci0JCQlob3ZlciA9IChJVGV4dEhvdmVyKSBpLm5leHQoKTsKLQkJCWhvdmVyUmVnaW9uID0gaG92ZXIuZ2V0SG92ZXJSZWdpb24odmlld2VyLCBvZmZzZXQpOwotCQl9Ci0KLQkJLy8gc3RvcmUgdGhlIHRleHQgaG92ZXIgcHJvY2Vzc29yIHRoYXQgZm91bmQgcmVnaW9uCi0JCWlmIChob3ZlclJlZ2lvbiAhPSBudWxsKQotCQkJZkJlc3RNYXRjaEhvdmVyID0gaG92ZXI7Ci0JCWVsc2UKLQkJCWZCZXN0TWF0Y2hIb3ZlciA9IG51bGw7Ci0KLQkJcmV0dXJuIGhvdmVyUmVnaW9uOwotCX0KLQotCXByaXZhdGUgTGlzdCBnZXRUZXh0SG92ZXJzKCkgewotCQlpZiAoZlRleHRIb3ZlcnMgPT0gbnVsbCkgewotCQkJZlRleHRIb3ZlcnMgPSBjcmVhdGVUZXh0SG92ZXJzTGlzdCgpOwotCQl9Ci0JCXJldHVybiBmVGV4dEhvdmVyczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9EZWJ1Z0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vRGVidWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUyOTJhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9EZWJ1Z0luZm9Ib3ZlclByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRhZ2luZm87Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVR5cGVkUmVnaW9uOwotCi0vKioKLSAqIFByb3ZpZGVzIGRlYnVnIGhvdmVyIGhlbHAKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIKLSAqLwotcHVibGljIGNsYXNzIERlYnVnSW5mb0hvdmVyUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RIb3ZlclByb2Nlc3NvciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVIgPSAiZGVidWdpbmZvaG92ZXIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0KLQlwdWJsaWMgRGVidWdJbmZvSG92ZXJQcm9jZXNzb3IoKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIjZ2V0SG92ZXJJbmZvKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb24pCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIb3ZlckluZm8oSVRleHRWaWV3ZXIgdmlld2VyLCBJUmVnaW9uIGhvdmVyUmVnaW9uKSB7Ci0JCVN0cmluZyBkaXNwbGF5VGV4dCA9IG51bGw7Ci0JCWlmICgoaG92ZXJSZWdpb24gPT0gbnVsbCkgfHwgKHZpZXdlciA9PSBudWxsKSB8fCAodmlld2VyLmdldERvY3VtZW50KCkgPT0gbnVsbCkpIHsKLQkJCWRpc3BsYXlUZXh0ID0gbnVsbDsKLQkJfQotCQllbHNlIHsKLQkJCWludCBvZmZzZXQgPSBob3ZlclJlZ2lvbi5nZXRPZmZzZXQoKTsKLQotCQkJSVR5cGVkUmVnaW9uIHJlZ2lvbjsKLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gdmlld2VyLmdldERvY3VtZW50KCkuZ2V0UGFydGl0aW9uKG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWRpc3BsYXlUZXh0ID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRpc3BsYXlUZXh0ID0gIk51bGwgUmVnaW9uIHdhcyByZXR1cm5lZD8hIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJZGlzcGxheVRleHQgPSAiQmFkTG9jYXRpb25FeGNlcHRpb24gT2NjdXJyZWQhPyI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQl9Ci0JCXJldHVybiBkaXNwbGF5VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSByZWdpb24gdG8gaG92ZXIgdGhlIHRleHQgb3ZlciBiYXNlZCBvbiB0aGUgb2Zmc2V0LgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHBhcmFtIG9mZnNldAotCSAqIAotCSAqIEByZXR1cm4gSVJlZ2lvbiByZWdpb24gdG8gaG92ZXIgb3ZlciBpZiBvZmZzZXQgaXMgbm90IG92ZXIgaW52YWxpZAotCSAqICAgICAgICAgd2hpdGVzcGFjZS4gb3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNlZSBJVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlJVHlwZWRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaWYgKCh0ZXh0Vmlld2VyID09IG51bGwpIHx8ICh0ZXh0Vmlld2VyLmdldERvY3VtZW50KCkgPT0gbnVsbCkpIHsKLQkJCXJlZ2lvbiA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0KLQkJCXRyeSB7Ci0JCQkJcmVnaW9uID0gdGV4dFZpZXdlci5nZXREb2N1bWVudCgpLmdldFBhcnRpdGlvbihvZmZzZXQpOwotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQlyZWdpb24gPSBudWxsOwotCQkJfQotCQl9Ci0JCXJldHVybiByZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vUHJvYmxlbUFubm90YXRpb25Ib3ZlclByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE0YzAzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC90YWdpbmZvL1Byb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkRlZmF1bHRNYXJrZXJBbm5vdGF0aW9uQWNjZXNzOwotCi0vKioKLSAqIEhvdmVyIGhlbHAgdGhhdCBkaXNwbGF5cyBwcm9ibGVtIGFubm90YXRpb25zIHdoZW4gc2hvd24gaW4gdGV4dCBvZiBlZGl0b3IuCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIFByb2JsZW1Bbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IgZXh0ZW5kcyBBbm5vdGF0aW9uSG92ZXJQcm9jZXNzb3IgewotCi0JLy8gdGhlc2Ugc3RyaW5ncyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhbm5vdGF0aW9uVHlwZXMgZXh0ZW5zaW9uIGluCi0JLy8gb3JnLmVjbGlwc2UudWkuZWRpdG9ycyBwbHVnaW4KLQkvLyBpZiB0aG9zZSBzdHJpbmdzIGNoYW5nZSwgdGhlbiB0aGVzZSBzdHJpbmdzIG5lZWQgdG8gY2hhbmdlIGFzIHdlbGwKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBBTk5PVEFUSU9OX0VSUk9SID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVtcC5lcnJvciI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBwcml2YXRlIFN0cmluZyBBTk5PVEFUSU9OX1dBUk5JTkcgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZW1wLndhcm5pbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBEZWZhdWx0TWFya2VyQW5ub3RhdGlvbkFjY2VzcyBmQW5ub3RhdGlvbkFjY2VzcyA9IG5ldyBEZWZhdWx0TWFya2VyQW5ub3RhdGlvbkFjY2VzcygpOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBQcm9ibGVtQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRhZ2luZm8uQW5ub3RhdGlvbkhvdmVyUHJvY2Vzc29yI2lzQW5ub3RhdGlvblZhbGlkKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb24pCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNBbm5vdGF0aW9uVmFsaWQoQW5ub3RhdGlvbiBhKSB7Ci0JCVN0cmluZyB0eXBlID0gYS5nZXRUeXBlKCk7Ci0JCWlmIChmQW5ub3RhdGlvbkFjY2Vzcy5pc1N1YnR5cGUodHlwZSwgQU5OT1RBVElPTl9FUlJPUikgfHwgZkFubm90YXRpb25BY2Nlc3MuaXNTdWJ0eXBlKHR5cGUsIEFOTk9UQVRJT05fV0FSTklORykpCi0JCQlyZXR1cm4gc3VwZXIuaXNBbm5vdGF0aW9uVmFsaWQoYSk7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9UZXh0SG92ZXJNYW5hZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGFnaW5mby9UZXh0SG92ZXJNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyOWFmMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RhZ2luZm8vVGV4dEhvdmVyTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dEhvdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuRWRpdG9yUHJlZmVyZW5jZU5hbWVzOwotCi0vKioKLSAqIE1hbmFnZXMgdGV4dCBob3ZlcnMgZm9yIFN0cnVjdHVyZWQgVGV4dCBlZGl0b3JzCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIFRleHRIb3Zlck1hbmFnZXIgewotCS8qKgotCSAqIENvbnRhaW5zIGRlc2NyaXB0aW9uIG9mIGEgdGV4dCBob3ZlcgotCSAqLwotCXB1YmxpYyBjbGFzcyBUZXh0SG92ZXJEZXNjcmlwdG9yIHsKLQkJcHJpdmF0ZSBTdHJpbmcgZkRlc2NyaXB0aW9uOwotCQlwcml2YXRlIGJvb2xlYW4gZkVuYWJsZWQ7Ci0JCXByaXZhdGUgU3RyaW5nIGZJZDsKLQkJcHJpdmF0ZSBTdHJpbmcgZkxhYmVsOwotCQlwcml2YXRlIFN0cmluZyBmTW9kaWZpZXJTdHJpbmc7Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBpZAotCQkgKiBAcGFyYW0gbGFiZWwKLQkJICogQHBhcmFtIGRlc2MKLQkJICovCi0JCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYykgewotCQkJZklkID0gaWQ7Ci0JCQlmTGFiZWwgPSBsYWJlbDsKLQkJCWZEZXNjcmlwdGlvbiA9IGRlc2M7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGlkCi0JCSAqIEBwYXJhbSBsYWJlbAotCQkgKiBAcGFyYW0gZGVzYwotCQkgKiBAcGFyYW0gZW5hYmxlZAotCQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkJICovCi0JCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yKFN0cmluZyBpZCwgU3RyaW5nIGxhYmVsLCBTdHJpbmcgZGVzYywgYm9vbGVhbiBlbmFibGVkLCBTdHJpbmcgbW9kaWZpZXJTdHJpbmcpIHsKLQkJCWZJZCA9IGlkOwotCQkJZkxhYmVsID0gbGFiZWw7Ci0JCQlmRGVzY3JpcHRpb24gPSBkZXNjOwotCQkJZkVuYWJsZWQgPSBlbmFibGVkOwotCQkJZk1vZGlmaWVyU3RyaW5nID0gbW9kaWZpZXJTdHJpbmc7Ci0JCX0KLQotCQkvKioKLQkJICogQHJldHVybiBSZXR1cm5zIHRoZSBmRGVzY3JpcHRpb24uCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotCQkJcmV0dXJuIGZEZXNjcmlwdGlvbjsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZJZC4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCQlyZXR1cm4gZklkOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkxhYmVsCi0JCSAqLwotCQlwdWJsaWMgU3RyaW5nIGdldExhYmVsKCkgewotCQkJcmV0dXJuIGZMYWJlbDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcmV0dXJuIFJldHVybnMgdGhlIGZNb2RpZmllclN0cmluZy4KLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TW9kaWZpZXJTdHJpbmcoKSB7Ci0JCQlyZXR1cm4gZk1vZGlmaWVyU3RyaW5nOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgZkVuYWJsZWQuCi0JCSAqLwotCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0JCQlyZXR1cm4gZkVuYWJsZWQ7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGVuYWJsZWQKLQkJICogICAgICAgICAgICBUaGUgZkVuYWJsZWQgdG8gc2V0LgotCQkgKi8KLQkJcHVibGljIHZvaWQgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLQkJCWZFbmFibGVkID0gZW5hYmxlZDsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gbW9kaWZpZXJTdHJpbmcKLQkJICogICAgICAgICAgICBUaGUgZk1vZGlmaWVyU3RyaW5nIHRvIHNldC4KLQkJICovCi0JCXB1YmxpYyB2b2lkIHNldE1vZGlmaWVyU3RyaW5nKFN0cmluZyBtb2RpZmllclN0cmluZykgewotCQkJZk1vZGlmaWVyU3RyaW5nID0gbW9kaWZpZXJTdHJpbmc7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBTk5PVEFUSU9OX0hPVkVSID0gImFubm90YXRpb25Ib3ZlciI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGxpc3Qgb2YgZGlmZmVyZW50IHR5cGVzIG9mIFNvdXJjZSBlZGl0b3IgaG92ZXJzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NQklOQVRJT05fSE9WRVIgPSAiY29tYmluYXRpb25Ib3ZlciI7IC8vJE5PTi1OTFMtMSQKLQkvLyBob3ZlciBkZXNjcmlwdGlvbnMgYXJlIGluIC5wcm9wZXJ0aWVzIGZpbGUgd2l0aCB0aGUga2V5IGluIHRoZSBmb3JtIG9mCi0JLy8gIltpZF1fZGVzYyIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVTQ1JJUFRJT05fS0VZID0gIl9kZXNjIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERPQ1VNRU5UQVRJT05fSE9WRVIgPSAiZG9jdW1lbnRhdGlvbkhvdmVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IgPSAifCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT1ZFUl9TRVBBUkFUT1IgPSAiOyI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIGhvdmVyIGxhYmVscyBhcmUgaW4gLnByb3BlcnRpZXMgZmlsZSB3aXRoIHRoZSBrZXkgaW4gdGhlIGZvcm0gb2YKLQkvLyAiW2lkXV9sYWJlbCIKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfS0VZID0gIl9sYWJlbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX01PRElGSUVSID0gIjAiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPQkxFTV9IT1ZFUiA9ICJwcm9ibGVtSG92ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBURVhUX0hPVkVSX0lEUyA9IG5ldyBTdHJpbmdbXXtDT01CSU5BVElPTl9IT1ZFUiwgUFJPQkxFTV9IT1ZFUiwgRE9DVU1FTlRBVElPTl9IT1ZFUiwgQU5OT1RBVElPTl9IT1ZFUn07Ci0JLyoqCi0JICogQ3VycmVudCBsaXN0IG9mIFN0cnVjdHVyZWQgVGV4dCBlZGl0b3IgdGV4dCBob3ZlcnMKLQkgKi8KLQlwcml2YXRlIFRleHRIb3ZlckRlc2NyaXB0b3JbXSBmVGV4dEhvdmVyczsKLQotCXB1YmxpYyBUZXh0SG92ZXJNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZSBhIGJlc3QgbWF0Y2ggaG92ZXIgd2l0aCB0aGUgZ2l2ZSB0ZXh0IGhvdmVyIGFzIHRoZSBkb2N1bWVudGF0aW9uCi0JICogaG92ZXIKLQkgKiAKLQkgKiBAcGFyYW0gaW5mb0hvdmVyCi0JICogQHJldHVybiBJVGV4dEhvdmVyCi0JICovCi0JcHVibGljIElUZXh0SG92ZXIgY3JlYXRlQmVzdE1hdGNoSG92ZXIoSVRleHRIb3ZlciBpbmZvSG92ZXIpIHsKLQkJcmV0dXJuIG5ldyBCZXN0TWF0Y2hIb3ZlcihpbmZvSG92ZXIpOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYXRlIGEgbGlzdCBvZiB0ZXh0IGhvdmVyIGRlc2NyaXB0b3JzIGZyb20gdGhlIGdpdmVuIGRlbGltaXRlZAotCSAqIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB0ZXh0SG92ZXJTdHJpbmdzCi0JICogQHJldHVybgotCSAqLwotCXB1YmxpYyBUZXh0SG92ZXJEZXNjcmlwdG9yW10gZ2VuZXJhdGVUZXh0SG92ZXJEZXNjcmlwdG9ycyhTdHJpbmcgdGV4dEhvdmVyU3RyaW5ncykgewotCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHRleHRIb3ZlclN0cmluZ3MsIEhPVkVSX1NFUEFSQVRPUik7Ci0KLQkJLy8gcmVhZCBmcm9tIHByZWZlcmVuY2UgYW5kIGxvYWQgaWQtZGVzY3JpcHRvciBtYXBwaW5nIHRvIGEgaGFzaCB0YWJsZQotCQlIYXNoTWFwIGlkVG9Nb2RpZmllciA9IG5ldyBIYXNoTWFwKHN0LmNvdW50VG9rZW5zKCkpOwotCQl3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7Ci0JCQlTdHJpbmcgdGV4dEhvdmVyU3RyaW5nID0gc3QubmV4dFRva2VuKCk7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgc3QyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0ZXh0SG92ZXJTdHJpbmcsIEhPVkVSX0FUVFJJQlVURV9TRVBBUkFUT1IpOwotCQkJaWYgKHN0Mi5jb3VudFRva2VucygpID09IDMpIHsKLQkJCQlTdHJpbmcgaWQgPSBzdDIubmV4dFRva2VuKCk7Ci0JCQkJYm9vbGVhbiBlbmFibGVkID0gQm9vbGVhbi52YWx1ZU9mKHN0Mi5uZXh0VG9rZW4oKSkuYm9vbGVhblZhbHVlKCk7Ci0JCQkJU3RyaW5nIG1vZGlmaWVyU3RyaW5nID0gc3QyLm5leHRUb2tlbigpOwotCQkJCWlmIChtb2RpZmllclN0cmluZy5lcXVhbHMoTk9fTU9ESUZJRVIpKQotCQkJCQltb2RpZmllclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0KLQkJCQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGlkICsgTEFCRUxfS0VZKTsKLQkJCQkJZGVzY3JpcHRpb24gPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKGlkICsgREVTQ1JJUFRJT05fS0VZKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJVGV4dEhvdmVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRIb3ZlckRlc2NyaXB0b3IoaWQsIGxhYmVsLCBkZXNjcmlwdGlvbiwgZW5hYmxlZCwgbW9kaWZpZXJTdHJpbmcpOwotCQkJCS8vIHNob3VsZCBjaGVjayB0byBzZWUgaWYgaWRzIGFwcGVhciBtb3JlIHRoYW4gb25jZQotCQkJCWlkVG9Nb2RpZmllci5wdXQoaWQsIGRlc2NyaXB0b3IpOwotCQkJfQotCQl9Ci0KLQkJLy8gZ28gdGhyb3VnaCBhbGwgZGVmaW5lZCB0ZXh0IGhvdmVycyBhbmQgbWF0Y2ggd2l0aCB0aGVpciBwcmVmZXJlbmNlCi0JCVRleHRIb3ZlckRlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBUZXh0SG92ZXJEZXNjcmlwdG9yW1RFWFRfSE9WRVJfSURTLmxlbmd0aF07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgVEVYVF9IT1ZFUl9JRFMubGVuZ3RoOyBpKyspIHsKLQkJCVRleHRIb3ZlckRlc2NyaXB0b3IgZGVzYyA9IChUZXh0SG92ZXJEZXNjcmlwdG9yKSBpZFRvTW9kaWZpZXIuZ2V0KFRFWFRfSE9WRVJfSURTW2ldKTsKLQkJCWlmIChkZXNjICE9IG51bGwpIHsKLQkJCQlkZXNjcmlwdG9yc1tpXSA9IGRlc2M7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlTdHJpbmcgbGFiZWwgPSBudWxsOwotCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IG51bGw7Ci0JCQkJdHJ5IHsKLQkJCQkJbGFiZWwgPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKFRFWFRfSE9WRVJfSURTW2ldICsgTEFCRUxfS0VZKTsKLQkJCQkJZGVzY3JpcHRpb24gPSBTU0VVSU1lc3NhZ2VzLmdldFJlc291cmNlQnVuZGxlKCkuZ2V0U3RyaW5nKFRFWFRfSE9WRVJfSURTW2ldICsgREVTQ1JJUFRJT05fS0VZKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJZGVzY3JpcHRvcnNbaV0gPSBuZXcgVGV4dEhvdmVyRGVzY3JpcHRvcihURVhUX0hPVkVSX0lEU1tpXSwgbGFiZWwsIGRlc2NyaXB0aW9uKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZGVzY3JpcHRvcnM7Ci0JfQotCi0JcHJpdmF0ZSBJUHJlZmVyZW5jZVN0b3JlIGdldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRleHQgaG92ZXJzIGZvciBTdHJ1Y3R1cmVkIFRleHQgZWRpdG9yLiBJZiBmVGV4dEhvdmVyIGhhcwotCSAqIG5vdCBiZWVuIGluaXRpYWxpZWQsIGl0IHdpbGwgYmUgaW5pdGlhbGl6ZWQuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBmVGV4dEhvdmVycy4KLQkgKi8KLQlwdWJsaWMgVGV4dEhvdmVyRGVzY3JpcHRvcltdIGdldFRleHRIb3ZlcnMoKSB7Ci0JCWlmIChmVGV4dEhvdmVycyA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgdGV4dEhvdmVyU3RyaW5ncyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhFZGl0b3JQcmVmZXJlbmNlTmFtZXMuRURJVE9SX1RFWFRfSE9WRVJfTU9ESUZJRVJTKTsKLQkJCWZUZXh0SG92ZXJzID0gZ2VuZXJhdGVUZXh0SG92ZXJEZXNjcmlwdG9ycyh0ZXh0SG92ZXJTdHJpbmdzKTsKLQkJfQotCQlyZXR1cm4gZlRleHRIb3ZlcnM7Ci0JfQotCi0JLyoqCi0JICogU2V0cyBmVGV4dEhvdmVycyB0byBudWxsIHNvIHRoYXQgbmV4dCB0aW1lIGdldFRleHRIb3ZlcnMgaXMgY2FsbGVkLAotCSAqIGZUZXh0SG92ZXJzIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIGxhdGVzdCBwcmVmZXJlbmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldFRleHRIb3ZlcnMoKSB7Ci0JCWZUZXh0SG92ZXJzID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGV4dC9Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdGV4dC9Eb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZDIwZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3RleHQvRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50ZXh0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogTWF0Y2hlcyB0aGUgc3RhcnQgYW5kIGVuZGluZyBjaGFyYWN0ZXJzIG9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIHdpdGgKLSAqIHRoZSBnaXZlbiBhbGxvd2VkIHR5cGVzLiBOb3RlIHRoYXQgRWNsaXBzZSBSM004IG9ubHkgcGFpbnRzIHNpbmdsZQotICogY2hhcmFjdGVyLXdpZGUgbWF0Y2hlcyBhbmQgdGhpcyBpc24ndCB0cnVlIHBhaXIgbWF0Y2hpbmcgYmVoYXZpb3IuIFNlZSBSRkUKLSAqICM1NjgzNiBhdCBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9NTY4MzYuCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGltcGxlbWVudHMgSUNoYXJhY3RlclBhaXJNYXRjaGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gImNoYXJhY3RlcnBhaXJtYXRjaGVyIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGludCBmQW5jaG9yOwotCi0JcHJvdGVjdGVkIElDaGFyYWN0ZXJQYWlyTWF0Y2hlciBmTmV4dE1hdGNoZXI7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBmUmVnaW9uVHlwZXM7Ci0KLQlwdWJsaWMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcihTdHJpbmdbXSB2YWxpZENvbnRleHRzLCBJQ2hhcmFjdGVyUGFpck1hdGNoZXIgbmV4dE1hdGNoZXIpIHsKLQkJZlJlZ2lvblR5cGVzID0gQXJyYXlzLmFzTGlzdCh2YWxpZENvbnRleHRzKTsKLQkJZk5leHRNYXRjaGVyID0gbmV4dE1hdGNoZXI7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklDaGFyYWN0ZXJQYWlyTWF0Y2hlciNjbGVhcigpCi0JICovCi0JcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0JCWlmIChmTmV4dE1hdGNoZXIgIT0gbnVsbCkKLQkJCWZOZXh0TWF0Y2hlci5jbGVhcigpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUNoYXJhY3RlclBhaXJNYXRjaGVyI2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWlmIChmTmV4dE1hdGNoZXIgIT0gbnVsbCkKLQkJCWZOZXh0TWF0Y2hlci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjZ2V0QW5jaG9yKCkKLQkgKi8KLQlwdWJsaWMgaW50IGdldEFuY2hvcigpIHsKLQkJaWYgKGZBbmNob3IgPCAwICYmIGZOZXh0TWF0Y2hlciAhPSBudWxsKQotCQkJcmV0dXJuIGZOZXh0TWF0Y2hlci5nZXRBbmNob3IoKTsKLQkJcmV0dXJuIGZBbmNob3I7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JQ2hhcmFjdGVyUGFpck1hdGNoZXIjbWF0Y2gob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gbWF0Y2goSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCWlmKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID49IGRvY3VtZW50LmdldExlbmd0aCgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCQotCQlJUmVnaW9uIG1hdGNoID0gbnVsbDsKLQkJaWYgKCFmUmVnaW9uVHlwZXMuaXNFbXB0eSgpICYmIGRvY3VtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGRvY3VtZW50KS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJaWYgKGRvY1JlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJLy8gbG9vayBhdCB0aGUgcHJldmlvdXMgZG9jdW1lbnQgcmVnaW9uIGZpcnN0IHNpbmNlIGl0cyBlbmQgPT0KLQkJCQkvLyB0aGlzIG9uZSdzIHN0YXJ0Ci0JCQkJaWYgKGRvY1JlZ2lvbi5nZXRQcmV2aW91cygpICE9IG51bGwgJiYgZG9jUmVnaW9uLmdldFByZXZpb3VzKCkuZ2V0RW5kT2Zmc2V0KCkgPT0gb2Zmc2V0ICYmIGZSZWdpb25UeXBlcy5jb250YWlucyhkb2NSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRUeXBlKCkpKSB7Ci0JCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuUklHSFQ7Ci0JCQkJCW1hdGNoID0gbmV3IFJlZ2lvbihkb2NSZWdpb24uZ2V0UHJldmlvdXMoKS5nZXRTdGFydE9mZnNldCgpLCAxKTsKLQkJCQl9Ci0JCQkJLy8gY2hlY2sgZm9yIG9mZnNldCBpbiB0aGUgbGFzdCB0ZXh0IHJlZ2lvbiBmb3IgYSBtYXRjaCB0bwotCQkJCS8vIGRvY3VtZW50IHJlZ2lvbiBzdGFydCBvZmZzZXQKLQkJCQllbHNlIGlmIChmUmVnaW9uVHlwZXMuY29udGFpbnMoZG9jUmVnaW9uLmdldFR5cGUoKSkgJiYgZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGRvY1JlZ2lvbi5nZXRMYXN0UmVnaW9uKCkpIDw9IG9mZnNldCAmJiBvZmZzZXQgPD0gZG9jUmVnaW9uLmdldEVuZE9mZnNldChkb2NSZWdpb24uZ2V0TGFzdFJlZ2lvbigpKSkgewotCQkJCQlmQW5jaG9yID0gSUNoYXJhY3RlclBhaXJNYXRjaGVyLlJJR0hUOwotCQkJCQltYXRjaCA9IG5ldyBSZWdpb24oZG9jUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCksIDEpOwotCQkJCX0KLQkJCQkvLyBjaGVjayBmb3Igb2Zmc2V0IGluIHRoZSBmaXJzdCB0ZXh0IHJlZ2lvbiBmb3IgYSBtYXRjaCB0bwotCQkJCS8vIGRvY3VtZW50IHJlZ2lvbiBlbmQgb2Zmc2V0Ci0JCQkJZWxzZSBpZiAoZlJlZ2lvblR5cGVzLmNvbnRhaW5zKGRvY1JlZ2lvbi5nZXRUeXBlKCkpKSB7Ci0JCQkJCWlmIChkb2NSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZG9jUmVnaW9uLmdldEZpcnN0UmVnaW9uKCkpIDw9IG9mZnNldCAmJiBvZmZzZXQgPD0gZG9jUmVnaW9uLmdldEVuZE9mZnNldChkb2NSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKSkpIHsKLQkJCQkJCWZBbmNob3IgPSBJQ2hhcmFjdGVyUGFpck1hdGNoZXIuTEVGVDsKLQkJCQkJCW1hdGNoID0gbmV3IFJlZ2lvbihkb2NSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgLSAxLCAxKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAobWF0Y2ggPT0gbnVsbCAmJiBmTmV4dE1hdGNoZXIgIT0gbnVsbCkgewotCQkJZkFuY2hvciA9IC0xOwotCQkJbWF0Y2ggPSBmTmV4dE1hdGNoZXIubWF0Y2goZG9jdW1lbnQsIG9mZnNldCk7Ci0JCX0KLQkJcmV0dXJuIG1hdGNoOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91aS9PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL09mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmYTdiZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL09mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudEV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRVdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5yZWNvbmNpbGVyLklSZWNvbmNpbGVTdGVwOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSUFubm90YXRpb25Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkFycmF5Q29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU2FzaEZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUF0dGFjaG1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1MYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TYXNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYkZvbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UYWJJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVNlbGVjdGlvblNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuTWFya2VyQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLk1hcmtlclV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlNpbXBsZU1hcmtlckFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTb3VyY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuVGV4dFByb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbmluZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5SZWNvbmNpbGVBbm5vdGF0aW9uS2V5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLlRlbXBvcmFyeUFubm90YXRpb247Ci0KLS8qKgotICogQGF1dGhvciBuc2QgQSBTdGF0dXMgTGluZSBjb250cmlidXRpb24gaW50ZW5kZWQgdG8gZGlzcGxheSB0aGUgc2VsZWN0ZWQKLSAqICAgICAgICAgb2Zmc2V0cyBpbiBhbiBlZGl0b3IuIERvdWJsZS1jbGlja2luZyBzaG93cyBpbmZvcm1hdGlvbiBhYm91dAotICogICAgICAgICBwYXJ0aXRpb25zLCBkb2N1bWVudCByZWdpb25zLCBhbm5vdGF0aW9ucywgYW5kIHNlbGVjdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtIGV4dGVuZHMgU3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW0gewotCi0JY2xhc3MgQW5ub3RhdGlvblByb3BlcnR5U291cmNlIGltcGxlbWVudHMgSVByb3BlcnR5U291cmNlIHsKLQkJQW5ub3RhdGlvbiBmQW5ub3RhdGlvbiA9IG51bGw7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBmRGVzY3JpcHRvcnMgPSBudWxsOwotCQlTdHJpbmdbXSBURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTID0gbmV3IFN0cmluZ1tdeyJQYXJ0aXRpb24gVHlwZSIsICJTdGVwIiwgIlNjb3BlIiwgIk9mZnNldCIsICJMZW5ndGgiLCAiRGVzY3JpcHRpb24ifTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkIC8vJE5PTi1OTFMtNiQKLQotCQlwdWJsaWMgQW5ub3RhdGlvblByb3BlcnR5U291cmNlKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJc3VwZXIoKTsKLQkJCWZBbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3JbXSBnZXRQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQkJaWYgKGZEZXNjcmlwdG9ycyA9PSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkJTWFwIGF0dHJzID0gKChTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0TWFya2VyKCkuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJT2JqZWN0W10ga2V5cyA9IGF0dHJzLmtleVNldCgpLnRvQXJyYXkoKTsKLQotCQkJCQkJZkRlc2NyaXB0b3JzID0gbmV3IElQcm9wZXJ0eURlc2NyaXB0b3Jba2V5cy5sZW5ndGhdOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3Ioa2V5c1tpXS50b1N0cmluZygpLCBrZXlzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJCWZEZXNjcmlwdG9yc1tpXSA9IGRlc2NyaXB0b3I7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJCQlPYmplY3Qga2V5ID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0S2V5KCk7Ci0JCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5IGluc3RhbmNlb2YgUmVjb25jaWxlQW5ub3RhdGlvbktleSkgewotCQkJCQkJCVN0cmluZ1tdIGtleXMgPSBURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTOwotCQkJCQkJCWZEZXNjcmlwdG9ycyA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2tleXMubGVuZ3RoXTsKLQkJCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQkJVGV4dFByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3Ioa2V5c1tpXS50b1N0cmluZygpLCBrZXlzW2ldLnRvU3RyaW5nKCkpOwotCQkJCQkJCQlmRGVzY3JpcHRvcnNbaV0gPSBkZXNjcmlwdG9yOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZEZXNjcmlwdG9ycyA9PSBudWxsKQotCQkJCWZEZXNjcmlwdG9ycyA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yWzBdOwotCQkJcmV0dXJuIGZEZXNjcmlwdG9yczsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgaWQpIHsKLQkJCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCQlpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJT2JqZWN0IG87Ci0JCQkJdHJ5IHsKLQkJCQkJbyA9ICgoU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZXMoKS5nZXQoaWQpOwotCQkJCQlpZiAobyAhPSBudWxsKSB7Ci0JCQkJCQl2YWx1ZSA9IG8udG9TdHJpbmcoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJaWYgKFRFTVBPUkFSWV9BTk5PVEFUSU9OX0tFWVNbMF0uZXF1YWxzKGlkKSkgewotCQkJCQlPYmplY3Qga2V5ID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0S2V5KCk7Ci0JCQkJCWlmIChrZXkgIT0gbnVsbCAmJiBrZXkgaW5zdGFuY2VvZiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSB7Ci0JCQkJCQl2YWx1ZSA9ICgoUmVjb25jaWxlQW5ub3RhdGlvbktleSkga2V5KS5nZXRQYXJ0aXRpb25UeXBlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1sxXS5lcXVhbHMoaWQpKSB7Ci0JCQkJCU9iamVjdCBrZXkgPSAoKFRlbXBvcmFyeUFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRLZXkoKTsKLQkJCQkJaWYgKGtleSAhPSBudWxsICYmIGtleSBpbnN0YW5jZW9mIFJlY29uY2lsZUFubm90YXRpb25LZXkpIHsKLQkJCQkJCUlSZWNvbmNpbGVTdGVwIHN0ZXAgPSAoKFJlY29uY2lsZUFubm90YXRpb25LZXkpIGtleSkuZ2V0U3RlcCgpOwotCQkJCQkJaWYgKHN0ZXAgIT0gbnVsbCkgewotCQkJCQkJCXZhbHVlID0gc3RlcC5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChURU1QT1JBUllfQU5OT1RBVElPTl9LRVlTWzJdLmVxdWFscyhpZCkpIHsKLQkJCQkJT2JqZWN0IGtleSA9ICgoVGVtcG9yYXJ5QW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldEtleSgpOwotCQkJCQlpZiAoa2V5ICE9IG51bGwgJiYga2V5IGluc3RhbmNlb2YgUmVjb25jaWxlQW5ub3RhdGlvbktleSkgewotCQkJCQkJaW50IHNjb3BlID0gKChSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSBrZXkpLmdldFNjb3BlKCk7Ci0JCQkJCQlpZiAoc2NvcGUgPT0gUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMKSB7Ci0JCQkJCQkJdmFsdWUgPSAiUEFSVElBTCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCX0KLQkJCQkJCWlmIChzY29wZSA9PSBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5LlRPVEFMKSB7Ci0JCQkJCQkJdmFsdWUgPSAiVE9UQUwiOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1szXS5lcXVhbHMoaWQpKSB7Ci0JCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJUG9zaXRpb24gcCA9IGFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihmQW5ub3RhdGlvbik7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gU3RyaW5nLnZhbHVlT2YocC5nZXRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1s0XS5lcXVhbHMoaWQpKSB7Ci0JCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJUG9zaXRpb24gcCA9IGFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihmQW5ub3RhdGlvbik7Ci0JCQkJCWlmIChwICE9IG51bGwpIHsKLQkJCQkJCXZhbHVlID0gU3RyaW5nLnZhbHVlT2YocC5nZXRMZW5ndGgoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVNUE9SQVJZX0FOTk9UQVRJT05fS0VZU1s1XS5lcXVhbHMoaWQpKSB7Ci0JCQkJCXZhbHVlID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBmQW5ub3RhdGlvbikuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdmFsdWU7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5U2V0KE9iamVjdCBpZCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpZCkgewotCQkJdHJ5IHsKLQkJCQlpZiAoZkFubm90YXRpb24gaW5zdGFuY2VvZiBTaW1wbGVNYXJrZXJBbm5vdGF0aW9uKSB7Ci0JCQkJCSgoU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgZkFubm90YXRpb24pLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZXMoKS5yZW1vdmUoaWQpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5VmFsdWUoT2JqZWN0IGlkLCBPYmplY3QgdmFsdWUpIHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGZBbm5vdGF0aW9uIGluc3RhbmNlb2YgU2ltcGxlTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkoKE1hcmtlckFubm90YXRpb24pIGZBbm5vdGF0aW9uKS5nZXRNYXJrZXIoKS5zZXRBdHRyaWJ1dGUoaWQudG9TdHJpbmcoKSwgdmFsdWUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFRlbXBvcmFyeUFubm90YXRpb24pIHsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfQotCX0KLQotCWNsYXNzIEluZm9ybWF0aW9uRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCQlJRG9jdW1lbnQgZkRvY3VtZW50ID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGZUZXh0RWRpdG9yLmdldEVkaXRvcklucHV0KCkpOwotCi0JCXB1YmxpYyBJbmZvcm1hdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCkgewotCQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVBbm5vdGF0aW9uVGFiQ29udGVudHMoQ29tcG9zaXRlIGFubm90YXRpb25zVGFiQ29tcG9zaXRlKSB7Ci0JCQlhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YSgpKTsKLQotCQkJZmluYWwgQ29tcG9zaXRlIGFubm90YXRpb25zQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShhbm5vdGF0aW9uc1RhYkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJYW5ub3RhdGlvbnNDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJCWZpbmFsIFRhYmxlVmlld2VyIGFubm90YXRpb25zVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIoYW5ub3RhdGlvbnNDb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuSF9TQ1JPTEwgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuQk9SREVSKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0Q29udGVudFByb3ZpZGVyKG5ldyBBcnJheUNvbnRlbnRQcm92aWRlcigpKTsKLQkJCWFubm90YXRpb25zVGFibGUuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJYW5ub3RhdGlvbnNUYWJsZS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQkJCVN0cmluZ1tdIGNvbHVtbnMgPSBuZXcgU3RyaW5nW117IkxpbmUiLCAiT3duZXIiLCAiVHlwZSIsICJDbGFzcyIsICJNZXNzYWdlIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJYW5ub3RhdGlvbnNUYWJsZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGFkZExpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCX0KLQotCQkJCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCXJldHVybiBudWxsOwotCQkJCX0KLQotCQkJCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBlbGVtZW50OwotCQkJCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0JCQkJCXN3aXRjaCAoY29sdW1uSW5kZXgpIHsKLQkJCQkJCWNhc2UgMCA6Ci0JCQkJCQkJdGV4dCA9IGdldExpbmVOdW1iZXIoYW5ub3RhdGlvbik7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDEgOgotCQkJCQkJCXRleHQgPSBnZXRPd25lcihhbm5vdGF0aW9uKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMiA6Ci0JCQkJCQkJdGV4dCA9IGdldFR5cGUoYW5ub3RhdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlicmVhazsKLQkJCQkJCWNhc2UgMyA6Ci0JCQkJCQkJdGV4dCA9IGFubm90YXRpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQljYXNlIDQgOgotCQkJCQkJCXRleHQgPSBhbm5vdGF0aW9uLmdldFRleHQoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAodGV4dCA9PSBudWxsKQotCQkJCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0ZXh0OwotCQkJCX0KLQotCi0JCQkJcHJpdmF0ZSBTdHJpbmcgZ2V0T3duZXIoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCQkJCVN0cmluZyBvd25lciA9IG51bGw7Ci0JCQkJCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkJb3duZXIgPSAoKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldE1hcmtlcigpLmdldEF0dHJpYnV0ZSgib3duZXIiLCAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCQkJCQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQkJCQlPYmplY3Qga2V5ID0gKChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uKS5nZXRLZXkoKTsKLQkJCQkJCWlmIChrZXkgIT0gbnVsbCkgewotCQkJCQkJCWlmIChrZXkgaW5zdGFuY2VvZiBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5KSB7Ci0JCQkJCQkJCWtleSA9IGtleS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKGtleSAhPSBudWxsKQotCQkJCQkJCQlvd25lciA9IGtleS50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybiBvd25lcjsKLQkJCQl9Ci0KLQkJCQlwcml2YXRlIFN0cmluZyBnZXRUeXBlKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0JCQkJCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikgewotCQkJCQkJdHlwZSA9IE1hcmtlclV0aWxpdGllcy5nZXRNYXJrZXJUeXBlKCgoTWFya2VyQW5ub3RhdGlvbikgYW5ub3RhdGlvbikuZ2V0TWFya2VyKCkpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJdHlwZSA9IGFubm90YXRpb24uZ2V0VHlwZSgpOwotCQkJCQl9Ci0JCQkJCWlmICh0eXBlID09IG51bGwpCi0JCQkJCQl0eXBlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJcmV0dXJuIHR5cGU7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQkJCX0pOwotCi0JCQlUYWJsZUxheW91dCB0bGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5zLmxlbmd0aF07Ci0JCQlpbnQgY29sdW1uV2lkdGhzW10gPSBuZXcgaW50W117RGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyAxNCwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA3LCBEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRCb3VuZHMoKS53aWR0aCAvIDcsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gMTQsIERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEJvdW5kcygpLndpZHRoIC8gN307Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbHVtbnMubGVuZ3RoOyBpKyspIHsKLQkJCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMSkpOwotCQkJCVRhYmxlQ29sdW1uIHRjID0gbmV3IFRhYmxlQ29sdW1uKGFubm90YXRpb25zVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoY29sdW1uc1tpXSk7Ci0JCQkJdGMuc2V0UmVzaXphYmxlKHRydWUpOwotCQkJCXRjLnNldFdpZHRoKGNvbHVtbldpZHRoc1tpXSk7Ci0JCQl9Ci0JCQlhbm5vdGF0aW9uc1RhYmxlLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0Q29sdW1uUHJvcGVydGllcyhjb2x1bW5zKTsKLQkJCUxpc3QgbWF0Y2hpbmdBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkgewotCQkJCUlBbm5vdGF0aW9uTW9kZWwgYW5ub3RhdGlvbk1vZGVsID0gZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldEFubm90YXRpb25Nb2RlbChmVGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQlpZiAoYW5ub3RhdGlvbk1vZGVsICE9IG51bGwpIHsKLQkJCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBhbm5vdGF0aW9uTW9kZWwuZ2V0QW5ub3RhdGlvbkl0ZXJhdG9yKCk7Ci0JCQkJCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJCUFubm90YXRpb24gZWxlbWVudCA9IChBbm5vdGF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJCQlpZiAodHJ1ZSkgewotCQkJCQkJCW1hdGNoaW5nQW5ub3RhdGlvbnMuYWRkKGVsZW1lbnQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJYW5ub3RhdGlvbnNUYWJsZS5zZXRTb3J0ZXIobmV3IFZpZXdlclNvcnRlcigpKTsKLQkJCWFubm90YXRpb25zVGFibGUuc2V0SW5wdXQobWF0Y2hpbmdBbm5vdGF0aW9ucyk7Ci0KLQkJCWZpbmFsIFNhc2ggc2FzaCA9IG5ldyBTYXNoKGFubm90YXRpb25zQ29tcG9zaXRlLCBTV1QuSE9SSVpPTlRBTCk7Ci0KLQkJCWZpbmFsIFByb3BlcnR5U2hlZXRQYWdlIHByb3BlcnR5U2hlZXQgPSBuZXcgUHJvcGVydHlTaGVldFBhZ2UoKTsKLQkJCXByb3BlcnR5U2hlZXQuY3JlYXRlQ29udHJvbChhbm5vdGF0aW9uc0NvbXBvc2l0ZSk7Ci0JCQlwcm9wZXJ0eVNoZWV0LnNldFByb3BlcnR5U291cmNlUHJvdmlkZXIobmV3IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKCkgewotCQkJCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgQW5ub3RhdGlvbikgewotCQkJCQkJSVByb3BlcnR5U291cmNlIGFubm90YXRpb25Qcm9wZXJ0eVNvdXJjZSA9IG5ldyBBbm5vdGF0aW9uUHJvcGVydHlTb3VyY2UoKChBbm5vdGF0aW9uKSBvYmplY3QpKTsKLQkJCQkJCXJldHVybiBhbm5vdGF0aW9uUHJvcGVydHlTb3VyY2U7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWFubm90YXRpb25zVGFibGUuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXByb3BlcnR5U2hlZXQuc2VsZWN0aW9uQ2hhbmdlZChudWxsLCBldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfSk7Ci0KLQkJCWZpbmFsIEZvcm1MYXlvdXQgZm9ybSA9IG5ldyBGb3JtTGF5b3V0KCk7Ci0JCQlhbm5vdGF0aW9uc0NvbXBvc2l0ZS5zZXRMYXlvdXQoZm9ybSk7Ci0KLQkJCUZvcm1EYXRhIHRhYmxlRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJdGFibGVEYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXRhYmxlRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoc2FzaCwgMik7Ci0JCQl0YWJsZURhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXRhYmxlRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJYW5ub3RhdGlvbnNUYWJsZS5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YSh0YWJsZURhdGEpOwotCi0JCQlGb3JtRGF0YSBwcm9wZXJ0aWVzRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJcHJvcGVydGllc0RhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KHNhc2gsIDIpOwotCQkJcHJvcGVydGllc0RhdGEubGVmdCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJCXByb3BlcnRpZXNEYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCQlwcm9wZXJ0aWVzRGF0YS5ib3R0b20gPSBuZXcgRm9ybUF0dGFjaG1lbnQoMTAwLCAwKTsKLQkJCXByb3BlcnR5U2hlZXQuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEocHJvcGVydGllc0RhdGEpOwotCi0JCQlmaW5hbCBGb3JtRGF0YSBzYXNoRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQkJc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDYwLCAwKTsKLQkJCXNhc2hEYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQoMCwgMCk7Ci0JCQlzYXNoRGF0YS5yaWdodCA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkJc2FzaC5zZXRMYXlvdXREYXRhKHNhc2hEYXRhKTsKLQkJCXNhc2guYWRkTGlzdGVuZXIoU1dULlNlbGVjdGlvbiwgbmV3IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGUpIHsKLQkJCQkJc2FzaERhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIGUueSk7Ci0JCQkJCWFubm90YXRpb25zQ29tcG9zaXRlLmxheW91dCgpOwotCQkJCX0KLQkJCX0pOwotCQkJYW5ub3RhdGlvbnNDb21wb3NpdGUucGFjayh0cnVlKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2cjY3JlYXRlRGlhbG9nQXJlYShvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JCSAqLwotCQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsID0gZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbDsKLQkJCXBhcmVudC5nZXRTaGVsbCgpLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8wICsgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArICItIiArICh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSkpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJCVRleHQgZG9jdW1lbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZG9jdW1lbnRUeXBlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlkb2N1bWVudFR5cGVMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNiArIGZEb2N1bWVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJVGV4dCBkb2N1bWVudFByb3ZpZGVyTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZG9jdW1lbnRQcm92aWRlckxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJZG9jdW1lbnRQcm92aWRlckxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV83ICsgZlRleHRFZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQlUZXh0IGVkaXRvcklucHV0TGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJZWRpdG9ySW5wdXRMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWVkaXRvcklucHV0TGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEyICsgZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJVGV4dCBtb2RlbENvbnRlbnRUeXBlTGFiZWwgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuUkVBRF9PTkxZKTsKLQkJCQlnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKTsKLQkJCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQkJbW9kZWxDb250ZW50VHlwZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCW1vZGVsQ29udGVudFR5cGVMYWJlbC5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fNCArIG1vZGVsLmdldENvbnRlbnRUeXBlSWRlbnRpZmllcigpKTsgLy8kTk9OLU5MUy0xJAotCi0JCQkJVGV4dCBtb2RlbEhhbmRsZXJDb250ZW50VHlwZUxhYmVsID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCB8IFNXVC5SRUFEX09OTFkpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQltb2RlbEhhbmRsZXJDb250ZW50VHlwZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCQkJCW1vZGVsSGFuZGxlckNvbnRlbnRUeXBlTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzUgKyBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKSArICIgKCIgKyBtb2RlbC5nZXRNb2RlbEhhbmRsZXIoKS5nZXRBc3NvY2lhdGVkQ29udGVudFR5cGVJZCgpICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQotCQkJCUxhYmVsIGJsYW5rUm93ID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJCQlibGFua1Jvdy5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCX0KLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0KLQkJCVRhYkZvbGRlciB0YWJmb2xkZXIgPSBuZXcgVGFiRm9sZGVyKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJdGFiZm9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlUYWJJdGVtIHBhcnRpdGlvblRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQlwYXJ0aXRpb25UYWIuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzIpOyAvLyROT04tTkxTLTEkCi0JCQlDb21wb3NpdGUgcGFydGl0aW9ucyA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQlwYXJ0aXRpb25UYWIuc2V0Q29udHJvbChwYXJ0aXRpb25zKTsKLQkJCWNyZWF0ZVBhcnRpdGlvblRhYkNvbnRlbnRzKHBhcnRpdGlvbnMpOwotCi0JCQlUYWJJdGVtIGFubm90YXRpb25zVGFiID0gbmV3IFRhYkl0ZW0odGFiZm9sZGVyLCBTV1QuQk9SREVSKTsKLQkJCWFubm90YXRpb25zVGFiLnNldFRleHQoIkFubm90YXRpb25zIik7IC8vJE5PTi1OTFMtMSQKLQkJCUNvbXBvc2l0ZSBhbm5vdGF0aW9ucyA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQlhbm5vdGF0aW9uc1RhYi5zZXRDb250cm9sKGFubm90YXRpb25zKTsKLQkJCWNyZWF0ZUFubm90YXRpb25UYWJDb250ZW50cyhhbm5vdGF0aW9ucyk7Ci0KLQkJCS8vIG9ubHkgY3JlYXRlIHRoZSBJVGV4dFJlZ2lvbnMgdGFiIGZvciBJU3RydWN0dXJlZERvY3VtZW50cwotCQkJaWYgKGZEb2N1bWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlUYWJJdGVtIHJlZ2lvblRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQkJcmVnaW9uVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8zKTsgLy8kTk9OLU5MUy0xJAotCQkJCVNhc2hGb3JtIHJlZ2lvbnMgPSBuZXcgU2FzaEZvcm0odGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQkJcmVnaW9ucy5zZXRPcmllbnRhdGlvbihTV1QuSE9SSVpPTlRBTCk7Ci0JCQkJcmVnaW9uVGFiLnNldENvbnRyb2wocmVnaW9ucyk7Ci0JCQkJY3JlYXRlUmVnaW9uVGFiQ29udGVudHMocmVnaW9ucyk7Ci0JCQl9Ci0KLQkJCVRhYkl0ZW0gZWRpdG9yU2VsZWN0aW9uVGFiID0gbmV3IFRhYkl0ZW0odGFiZm9sZGVyLCBTV1QuQk9SREVSKTsKLQkJCWVkaXRvclNlbGVjdGlvblRhYi5zZXRUZXh0KFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTQpOwotCQkJQ29tcG9zaXRlIGVkaXRvclNlbGVjdGlvbkNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQllZGl0b3JTZWxlY3Rpb25UYWIuc2V0Q29udHJvbChlZGl0b3JTZWxlY3Rpb25Db21wb3NpdGUpOwotCQkJZmlsbFNlbGVjdGlvblRhYkNvbnRlbnRzKGVkaXRvclNlbGVjdGlvbkNvbXBvc2l0ZSwgZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSk7Ci0KLQkJCUlFZGl0b3JTaXRlIHNpdGUgPSBmVGV4dEVkaXRvci5nZXRFZGl0b3JTaXRlKCk7Ci0JCQlpZiAoc2l0ZSAhPSBudWxsKSB7Ci0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpOwotCQkJCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJCQlJU2VsZWN0aW9uU2VydmljZSBzZXJ2aWNlID0gd2luZG93LmdldFNlbGVjdGlvblNlcnZpY2UoKTsKLQkJCQkJaWYgKHNlcnZpY2UgIT0gbnVsbCAmJiAhc2VydmljZS5nZXRTZWxlY3Rpb24oKS5lcXVhbHMoZlRleHRFZGl0b3IuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5nZXRTZWxlY3Rpb24oKSkpIHsKLQkJCQkJCVRhYkl0ZW0gc2VsZWN0aW9uU2VydmljZVRhYiA9IG5ldyBUYWJJdGVtKHRhYmZvbGRlciwgU1dULkJPUkRFUik7Ci0JCQkJCQlzZWxlY3Rpb25TZXJ2aWNlVGFiLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xOSk7Ci0JCQkJCQlDb21wb3NpdGUgc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGFiZm9sZGVyLCBTV1QuTk9ORSk7Ci0JCQkJCQlzZWxlY3Rpb25TZXJ2aWNlVGFiLnNldENvbnRyb2woc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSk7Ci0JCQkJCQlmaWxsU2VsZWN0aW9uVGFiQ29udGVudHMoc2VsZWN0aW9uU2VydmljZUNvbXBvc2l0ZSwgc2VydmljZS5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBjb21wb3NpdGU7Ci0JCX0KLQotCQkvKioKLQkJICogQHBhcmFtIGFyZWEKLQkJICovCi0JCXByaXZhdGUgdm9pZCBjcmVhdGVQYXJ0aXRpb25UYWJDb250ZW50cyhDb21wb3NpdGUgYXJlYSkgewotCQkJYXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlhcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCQlDb21wb3NpdGUgcGFydGlvbmluZ0NvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoYXJlYSwgU1dULk5PTkUpOwotCQkJcGFydGlvbmluZ0NvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJCXBhcnRpb25pbmdDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0KLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHBhcnRpb25pbmdDb21wb3NpdGUsIFNXVC5TSU5HTEUpOwotCQkJbGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzgpOyAvLyROT04tTkxTLTEkCi0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIGZhbHNlLCBmYWxzZSkpOwotCQkJZmluYWwgQ29tYm8gcGFydGl0aW9uaW5nQ29tYm8gPSBuZXcgQ29tYm8ocGFydGlvbmluZ0NvbXBvc2l0ZSwgU1dULlJFQURfT05MWSk7Ci0JCQlwYXJ0aXRpb25pbmdDb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0KLQkJCWZpbmFsIExhYmVsIHBhcnRpdGlvbmVySW5zdGFuY2VMYWJlbCA9IG5ldyBMYWJlbChwYXJ0aW9uaW5nQ29tcG9zaXRlLCBTV1QuU0lOR0xFKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgZmFsc2UpOwotCQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQkJcGFydGl0aW9uZXJJbnN0YW5jZUxhYmVsLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlmaW5hbCBUYWJsZVZpZXdlciBmUGFydGl0aW9uVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIocGFydGlvbmluZ0NvbXBvc2l0ZSwgU1dULkZVTExfU0VMRUNUSU9OKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgdHJ1ZSwgdHJ1ZSk7Ci0JCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCQlmUGFydGl0aW9uVGFibGUuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoZ2QpOwotCQkJZlBhcnRpdGlvblRhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQlmUGFydGl0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJZlBhcnRpdGlvblRhYmxlLmdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQkJU3RyaW5nW10gY29sdW1ucyA9IG5ldyBTdHJpbmdbXXtTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzksIFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTAsIFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTF9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJZlBhcnRpdGlvblRhYmxlLnNldExhYmVsUHJvdmlkZXIobmV3IElUYWJsZUxhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJfQotCi0JCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IChJVHlwZWRSZWdpb24pIGVsZW1lbnQ7Ci0JCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCQkJY2FzZSAwIDoKLQkJCQkJCQl0ZXh0ID0gSW50ZWdlci50b1N0cmluZyhwYXJ0aXRpb24uZ2V0T2Zmc2V0KCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAxIDoKLQkJCQkJCQl0ZXh0ID0gSW50ZWdlci50b1N0cmluZyhwYXJ0aXRpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJY2FzZSAyIDoKLQkJCQkJCQl0ZXh0ID0gcGFydGl0aW9uLmdldFR5cGUoKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlpZiAodGV4dCA9PSBudWxsKQotCQkJCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiB0ZXh0OwotCQkJCX0KLQotCQkJCXB1YmxpYyBib29sZWFuIGlzTGFiZWxQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQkJCXJldHVybiBmYWxzZTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJfQotCQkJfSk7Ci0JCQlUYWJsZUxheW91dCB0bGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvcltjb2x1bW5zLmxlbmd0aF07Ci0JCQlpbnQgY29sdW1uV2lkdGhzW10gPSBuZXcgaW50W117RGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyAxNCwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyAxNCwgRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Qm91bmRzKCkud2lkdGggLyA1fTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1ucy5sZW5ndGg7IGkrKykgewotCQkJCXRsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSgxKSk7Ci0JCQkJVGFibGVDb2x1bW4gdGMgPSBuZXcgVGFibGVDb2x1bW4oZlBhcnRpdGlvblRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJCQl0Yy5zZXRUZXh0KGNvbHVtbnNbaV0pOwotCQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCQl0Yy5zZXRXaWR0aChjb2x1bW5XaWR0aHNbaV0pOwotCQkJfQotCQkJZlBhcnRpdGlvblRhYmxlLnNldENlbGxFZGl0b3JzKGNlbGxFZGl0b3JzKTsKLQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtbnMpOwotCQkJZmluYWwgU3RyaW5nW10gcGFydGl0aW9uaW5ncyA9IChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJRG9jdW1lbnRFeHRlbnNpb24zKSA/ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgZkRvY3VtZW50KS5nZXRQYXJ0aXRpb25pbmdzKCkgOiBuZXcgU3RyaW5nW117SURvY3VtZW50RXh0ZW5zaW9uMy5ERUZBVUxUX1BBUlRJVElPTklOR307Ci0JCQlwYXJ0aXRpb25pbmdDb21iby5zZXRJdGVtcyhwYXJ0aXRpb25pbmdzKTsKLQkJCXBhcnRpdGlvbmluZ0NvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWw7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlTdHJpbmcgcGFydGl0aW9uZXJUZXh0ID0gZkRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMyA/ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgZkRvY3VtZW50KS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZ0NvbWJvLmdldEl0ZW0ocGFydGl0aW9uaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpLnRvU3RyaW5nKCkgOiAoIiIgKyBmRG9jdW1lbnQuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJcGFydGl0aW9uZXJJbnN0YW5jZUxhYmVsLnNldFRleHQoU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xMyArIHBhcnRpdGlvbmVyVGV4dCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRJbnB1dChUZXh0VXRpbGl0aWVzLmNvbXB1dGVQYXJ0aXRpb25pbmcoZkRvY3VtZW50LCBwYXJ0aXRpb25pbmdDb21iby5nZXRJdGVtKHBhcnRpdGlvbmluZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCkpLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpLCB0cnVlKSk7Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQkJCQlmUGFydGl0aW9uVGFibGUuc2V0SW5wdXQobmV3IElUeXBlZFJlZ2lvblswXSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9KTsKLQkJCXRyeSB7Ci0JCQkJaWYgKHBhcnRpdGlvbmluZ3MubGVuZ3RoID4gMCkgewotCQkJCQlTdHJpbmcgc2VsZWN0ZWRQYXJ0aXRpb25pbmcgPSBwYXJ0aXRpb25pbmdDb21iby5nZXRJdGVtKDApOwotCQkJCQlpZiAoVXRpbGl0aWVzLmNvbnRhaW5zKHBhcnRpdGlvbmluZ3MsIElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkcpKSB7Ci0JCQkJCQlzZWxlY3RlZFBhcnRpdGlvbmluZyA9IElTdHJ1Y3R1cmVkUGFydGl0aW9uaW5nLkRFRkFVTFRfU1RSVUNUVVJFRF9QQVJUSVRJT05JTkc7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHBhcnRpdGlvbmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlpZiAocGFydGl0aW9uaW5nc1tpXS5lcXVhbHMoSVN0cnVjdHVyZWRQYXJ0aXRpb25pbmcuREVGQVVMVF9TVFJVQ1RVUkVEX1BBUlRJVElPTklORykpIHsKLQkJCQkJCQkJcGFydGl0aW9uaW5nQ29tYm8uc2VsZWN0KGkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCXBhcnRpdGlvbmluZ0NvbWJvLnNlbGVjdCgwKTsKLQkJCQkJfQotCQkJCQlJU2VsZWN0aW9uIHNlbCA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCUlUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHNlbDsKLQkJCQkJSVR5cGVkUmVnaW9uW10gcGFydGl0aW9ucyA9IFRleHRVdGlsaXRpZXMuY29tcHV0ZVBhcnRpdGlvbmluZyhmRG9jdW1lbnQsIHNlbGVjdGVkUGFydGl0aW9uaW5nLCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQkJZlBhcnRpdGlvblRhYmxlLnNldElucHV0KHBhcnRpdGlvbnMpOwotCQkJCQlTdHJpbmcgcGFydGl0aW9uZXJUZXh0ID0gZkRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uMyA/ICgoSURvY3VtZW50RXh0ZW5zaW9uMykgZkRvY3VtZW50KS5nZXREb2N1bWVudFBhcnRpdGlvbmVyKHBhcnRpdGlvbmluZ0NvbWJvLmdldEl0ZW0ocGFydGl0aW9uaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpLnRvU3RyaW5nKCkgOiAoIiIgKyBmRG9jdW1lbnQuZ2V0RG9jdW1lbnRQYXJ0aXRpb25lcigpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlwYXJ0aXRpb25lckluc3RhbmNlTGFiZWwuc2V0VGV4dChTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzEzICsgcGFydGl0aW9uZXJUZXh0KTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVNlbGVjdGlvbiBzZWwgPSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWw7Ci0JCQkJCWZQYXJ0aXRpb25UYWJsZS5zZXRJbnB1dChmRG9jdW1lbnQuY29tcHV0ZVBhcnRpdGlvbmluZyh0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUxKSB7Ci0JCQkJZlBhcnRpdGlvblRhYmxlLnNldElucHV0KG5ldyBJVHlwZWRSZWdpb25bMF0pOwotCQkJfQotCQkJcGFydGl0aW9uaW5nQ29tYm8uc2V0Rm9jdXMoKTsKLQkJfQotCi0JCS8qKgotCQkgKiBAcGFyYW0gY29tcG9zaXRlCi0JCSAqIEByZXR1cm4KLQkJICovCi0JCXByaXZhdGUgQ29tcG9zaXRlIGNyZWF0ZVJlZ2lvblRhYkNvbnRlbnRzKFNhc2hGb3JtIHNhc2hGb3JtKSB7Ci0JCQlJU2VsZWN0aW9uIHNlbCA9IGZUZXh0RWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQlmaW5hbCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gKElUZXh0U2VsZWN0aW9uKSBzZWw7Ci0JCQlmaW5hbCBMaXN0IGRvY3VtZW50UmVnaW9ucyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCWlmIChmRG9jdW1lbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZkRvY3VtZW50OwotCQkJCWludCBwb3MgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwb3MpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kUmVnaW9uID0gc3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGVuZCk7Ci0JCQkJaWYgKHBvcyA8IGVuZCkgewotCQkJCQl3aGlsZSAoZG9jUmVnaW9uICE9IGVuZFJlZ2lvbikgewotCQkJCQkJZG9jdW1lbnRSZWdpb25zLmFkZChkb2NSZWdpb24pOwotCQkJCQkJZG9jUmVnaW9uID0gZG9jUmVnaW9uLmdldE5leHQoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlkb2N1bWVudFJlZ2lvbnMuYWRkKGRvY1JlZ2lvbik7Ci0JCQl9Ci0KLQkJCWZpbmFsIFRyZWVWaWV3ZXIgdHJlZSA9IG5ldyBUcmVlVmlld2VyKHNhc2hGb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkJZmluYWwgU3RyaW5nIFNUQVJUID0gU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNTsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgU3RyaW5nIExFTkdUSCA9IFNTRVVJTWVzc2FnZXMuT2Zmc2V0U3RhdHVzTGluZUNvbnRyaWJ1dGlvbkl0ZW1fMTY7IC8vJE5PTi1OTFMtMSQKLQkJCWZpbmFsIFN0cmluZyBURVhUTEVOR1RIID0gU1NFVUlNZXNzYWdlcy5PZmZzZXRTdGF0dXNMaW5lQ29udHJpYnV0aW9uSXRlbV8xNzsgLy8kTk9OLU5MUy0xJAotCQkJZmluYWwgU3RyaW5nIENPTlRFWFQgPSBTU0VVSU1lc3NhZ2VzLk9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtXzE4OyAvLyROT04tTkxTLTEkCi0JCQl0cmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJTGlzdCBjaGlsZHJlbiA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZEFsbChkb2N1bWVudFJlZ2lvbnMpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb25Db2xsZWN0aW9uKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIHBhcmVudEVsZW1lbnQpLmdldFJlZ2lvbnMoKS50b0FycmF5KCkpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb24pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZChuZXcgS2V5VmFsdWVQYWlyKENPTlRFWFQsICgoSVRleHRSZWdpb24pIHBhcmVudEVsZW1lbnQpLmdldFR5cGUoKSkpOwotCQkJCQkJY2hpbGRyZW4uYWRkKG5ldyBLZXlWYWx1ZVBhaXIoU1RBUlQsIEludGVnZXIudG9TdHJpbmcoKChJVGV4dFJlZ2lvbikgcGFyZW50RWxlbWVudCkuZ2V0U3RhcnQoKSkpKTsKLQkJCQkJCWNoaWxkcmVuLmFkZChuZXcgS2V5VmFsdWVQYWlyKFRFWFRMRU5HVEgsIEludGVnZXIudG9TdHJpbmcoKChJVGV4dFJlZ2lvbikgcGFyZW50RWxlbWVudCkuZ2V0VGV4dExlbmd0aCgpKSkpOwotCQkJCQkJY2hpbGRyZW4uYWRkKG5ldyBLZXlWYWx1ZVBhaXIoTEVOR1RILCBJbnRlZ2VyLnRvU3RyaW5nKCgoSVRleHRSZWdpb24pIHBhcmVudEVsZW1lbnQpLmdldExlbmd0aCgpKSkpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgSVRleHRSZWdpb25MaXN0KSB7Ci0JCQkJCQljaGlsZHJlbi5hZGQoQXJyYXlzLmFzTGlzdCgoKElUZXh0UmVnaW9uTGlzdCkgcGFyZW50RWxlbWVudCkudG9BcnJheSgpKSk7Ci0JCQkJCX0KLQkJCQkJaWYgKHBhcmVudEVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0JCQkJCQljaGlsZHJlbi5hZGRBbGwoKENvbGxlY3Rpb24pIHBhcmVudEVsZW1lbnQpOwotCQkJCQl9Ci0JCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKLQkJCQkJCWNoaWxkcmVuLmFkZEFsbChBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgcGFyZW50RWxlbWVudCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBjaGlsZHJlbi50b0FycmF5KCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuIG5ldyBPYmplY3RbXXt0ZXh0U2VsZWN0aW9ufTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCQlyZXR1cm4gKChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlbGVtZW50KS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJCQlyZXR1cm4gKChJVGV4dFJlZ2lvbkNvbnRhaW5lcikgZWxlbWVudCkuZ2V0UGFyZW50KCk7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJfQotCi0JCQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJcmV0dXJuICEoZWxlbWVudCBpbnN0YW5jZW9mIEtleVZhbHVlUGFpcik7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJfQotCQkJfSk7Ci0JCQl0cmVlLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgS2V5VmFsdWVQYWlyKQotCQkJCQkJcmV0dXJuICgoS2V5VmFsdWVQYWlyKSBlbGVtZW50KS5mS2V5LnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKSArICI6ICIgKyAoKEtleVZhbHVlUGFpcikgZWxlbWVudCkuZlZhbHVlOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlbGVtZW50OwotCQkJCQkJaW50IHBhY2thZ2VOYW1lTGVuZ3RoID0gZG9jdW1lbnRSZWdpb24uZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLmxlbmd0aCgpOwotCQkJCQkJaWYgKHBhY2thZ2VOYW1lTGVuZ3RoID4gMCkKLQkJCQkJCQlwYWNrYWdlTmFtZUxlbmd0aCsrOwotCQkJCQkJU3RyaW5nIG5hbWUgPSBkb2N1bWVudFJlZ2lvbi5nZXRDbGFzcygpLmdldE5hbWUoKS5zdWJzdHJpbmcocGFja2FnZU5hbWVMZW5ndGgpOwotCQkJCQkJU3RyaW5nIHRleHQgPSAiWyIgKyBkb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgIi0iICsgZG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyAiXSAiICsgbmFtZSArICJAIiArIGVsZW1lbnQuaGFzaENvZGUoKSArICIgIiArIGRvY3VtZW50UmVnaW9uLmdldFR5cGUoKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQlyZXR1cm4gdGV4dDsKLQkJCQkJfQotCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElUZXh0UmVnaW9uKSB7Ci0JCQkJCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gKElUZXh0UmVnaW9uKSBlbGVtZW50OwotCQkJCQkJaW50IHBhY2thZ2VOYW1lTGVuZ3RoID0gdGV4dFJlZ2lvbi5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkubGVuZ3RoKCk7Ci0JCQkJCQlpZiAocGFja2FnZU5hbWVMZW5ndGggPiAwKQotCQkJCQkJCXBhY2thZ2VOYW1lTGVuZ3RoKys7Ci0JCQkJCQlTdHJpbmcgbmFtZSA9IHRleHRSZWdpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCkuc3Vic3RyaW5nKHBhY2thZ2VOYW1lTGVuZ3RoKTsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gIlsiICsgdGV4dFJlZ2lvbi5nZXRTdGFydCgpICsgIi0iICsgdGV4dFJlZ2lvbi5nZXRFbmQoKSArICJdICIgKyBuYW1lICsgIkAiICsgZWxlbWVudC5oYXNoQ29kZSgpICsgIiAiICsgdGV4dFJlZ2lvbi5nZXRUeXBlKCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQgLy8kTk9OLU5MUy01JAotCQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJCX0KLQkJCQkJcmV0dXJuIHN1cGVyLmdldFRleHQoZWxlbWVudCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQl0cmVlLnNldElucHV0KGZEb2N1bWVudCk7Ci0KLQotCQkJZmluYWwgVGV4dCBkaXNwbGF5VGV4dCA9IG5ldyBUZXh0KHNhc2hGb3JtLCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwgfCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCQlkaXNwbGF5VGV4dC5zZXRCYWNrZ3JvdW5kKHNhc2hGb3JtLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKSk7Ci0JCQl0cmVlLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQlpZiAoZXZlbnQuZ2V0U2VsZWN0aW9uKCkgaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkJT2JqZWN0IG8gPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBldmVudC5nZXRTZWxlY3Rpb24oKSkuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0JCQkJCQlpZiAobyBpbnN0YW5jZW9mIEtleVZhbHVlUGFpcikKLQkJCQkJCQlkaXNwbGF5VGV4dC5zZXRUZXh0KCgoS2V5VmFsdWVQYWlyKSBvKS5mVmFsdWUudG9TdHJpbmcoKSk7Ci0JCQkJCQllbHNlIGlmIChvIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0ID0gKElUZXh0U2VsZWN0aW9uKSBvOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoZkRvY3VtZW50LmdldCh0ZXh0LmdldE9mZnNldCgpLCB0ZXh0LmdldExlbmd0aCgpKSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobyBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29sbGVjdGlvbikgewotCQkJCQkJCUlUZXh0UmVnaW9uQ29sbGVjdGlvbiByZWdpb24gPSAoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBvOwotCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQocmVnaW9uLmdldEZ1bGxUZXh0KCkpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCWRpc3BsYXlUZXh0LnNldFRleHQoIiIgKyBvKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlzYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXXszLCAyfSk7Ci0JCQlyZXR1cm4gc2FzaEZvcm07Ci0JCX0KLQotCQlwcml2YXRlIHZvaWQgZmlsbFNlbGVjdGlvblRhYkNvbnRlbnRzKENvbXBvc2l0ZSBhcmVhLCBJU2VsZWN0aW9uIHNlbCkgewotCQkJYXJlYS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0JCQlhcmVhLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCQlMYWJlbCB0eXBlTmFtZSA9IG5ldyBMYWJlbChhcmVhLCBTV1QuV1JBUCk7Ci0JCQl0eXBlTmFtZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlKSk7Ci0JCQl0eXBlTmFtZS5zZXRUZXh0KCJDbGFzczogIiArIHNlbC5nZXRDbGFzcygpLmdldE5hbWUoKSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJaWYgKHNlbCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQkJKG5ldyBMYWJlbChhcmVhLCBTV1QuTk9ORSkpLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKFNXVC5GSUxMLCBTV1QuRklMTCwgZmFsc2UsIGZhbHNlKSk7Ci0JCQkJU2FzaEZvcm0gc3RydWN0dXJlZFNhc2hGb3JtID0gbmV3IFNhc2hGb3JtKGFyZWEsIFNXVC5OT05FKTsKLQkJCQlzdHJ1Y3R1cmVkU2FzaEZvcm0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoU1dULkZJTEwsIFNXVC5GSUxMLCB0cnVlLCB0cnVlKSk7Ci0JCQkJc3RydWN0dXJlZFNhc2hGb3JtLnNldE9yaWVudGF0aW9uKFNXVC5WRVJUSUNBTCk7Ci0KLQkJCQlmaW5hbCBUYWJsZVZpZXdlciBzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUgPSBuZXcgVGFibGVWaWV3ZXIoc3RydWN0dXJlZFNhc2hGb3JtLCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuU0lOR0xFIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMIHwgU1dULkJPUkRFUik7Ci0KLQkJCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRUYWJsZSgpLnNldExpbmVzVmlzaWJsZSh0cnVlKTsKLQotCQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5zZXRMYWJlbFByb3ZpZGVyKG5ldyBJVGFibGVMYWJlbFByb3ZpZGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJCQl9Ci0KLQkJCQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCQkJCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJCQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCQlzd2l0Y2ggKGNvbHVtbkluZGV4KSB7Ci0JCQkJCQkJCWNhc2UgMCA6IHsKLQkJCQkJCQkJCXRleHQgPSBTdHJpbmcudmFsdWVPZigoKExpc3QpIHN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5nZXRJbnB1dCgpKS5pbmRleE9mKGVsZW1lbnQpKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWNhc2UgMSA6IHsKLQkJCQkJCQkJCXRleHQgPSBlbGVtZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJCQlicmVhazsKLQkJCQkJCQkJY2FzZSAyIDogewotCQkJCQkJCQkJdGV4dCA9IGVsZW1lbnQudG9TdHJpbmcoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCWRlZmF1bHQgOgotCQkJCQkJCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJcmV0dXJuIHRleHQ7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkJCQl9Ci0JCQkJfSk7Ci0KLQkJCQlUYWJsZUxheW91dCB0bGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCQkJdGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKDcsIHRydWUpKTsKLQkJCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoMjgsIHRydWUpKTsKLQkJCQl0bGF5b3V0LmFkZENvbHVtbkRhdGEobmV3IENvbHVtbldlaWdodERhdGEoNTAsIHRydWUpKTsKLQkJCQlzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKS5zZXRMYXlvdXQodGxheW91dCk7Ci0KLQkJCQlUYWJsZUNvbHVtbiB0YyA9IG5ldyBUYWJsZUNvbHVtbihzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoIkl0ZW0iKTsgLy8kTk9OLU5MUy0xJAotCQkJCXRjLnNldFJlc2l6YWJsZSh0cnVlKTsKLQkJCQl0Yy5zZXRXaWR0aCg0MCk7Ci0KLQkJCQl0YyA9IG5ldyBUYWJsZUNvbHVtbihzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKSwgU1dULk5PTkUpOwotCQkJCXRjLnNldFRleHQoIkNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQkJdGMuc2V0V2lkdGgoNDApOwotCi0JCQkJdGMgPSBuZXcgVGFibGVDb2x1bW4oc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLmdldFRhYmxlKCksIFNXVC5OT05FKTsKLQkJCQl0Yy5zZXRUZXh0KCJUZXh0Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQl0Yy5zZXRSZXNpemFibGUodHJ1ZSk7Ci0JCQkJdGMuc2V0V2lkdGgoNDApOwotCi0JCQkJc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLnNldENvbnRlbnRQcm92aWRlcihuZXcgQXJyYXlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCQkJZmluYWwgTGlzdCBpbnB1dCA9ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbCkudG9MaXN0KCk7Ci0JCQkJc3RydWN0dXJlZFNlbGVjdGlvblRhYmxlLnNldElucHV0KGlucHV0KTsKLQotCQkJCWZpbmFsIFRyZWVWaWV3ZXIgaW5mb1RyZWUgPSBuZXcgVHJlZVZpZXdlcihzdHJ1Y3R1cmVkU2FzaEZvcm0sIFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCB8IFNXVC5CT1JERVIpOwotCQkJCWluZm9UcmVlLnNldExhYmVsUHJvdmlkZXIobmV3IExhYmVsUHJvdmlkZXIoKSB7Ci0JCQkJCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBUcmVlVmlld2VyICYmIGluZm9UcmVlLmdldElucHV0KCkgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQkJCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXJGb3IgPSAoKElOb2RlTm90aWZpZXIpIGluZm9UcmVlLmdldElucHV0KCkpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJCQkJCWlmIChhZGFwdGVyRm9yICE9IG51bGwgJiYgYWRhcHRlckZvciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKSB7Ci0JCQkJCQkJCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXJGb3I7Ci0JCQkJCQkJCXJldHVybiBhZGFwdGVyLmdldExhYmVsSW1hZ2UoKGluZm9UcmVlLmdldElucHV0KCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gc3VwZXIuZ2V0SW1hZ2UoZWxlbWVudCk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdldFRleHQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgQ2xhc3MpIHsKLQkJCQkJCQlyZXR1cm4gIkNsYXNzOiAiICsgKChDbGFzcykgZWxlbWVudCkuZ2V0TmFtZSgpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLQkJCQkJCQlyZXR1cm4gIlJlZ2lzdGVyZWQgQWRhcHRlcnM6IjsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJUmVnaW9uKSB7Ci0JCQkJCQkJcmV0dXJuICJJbmRleGVkIFJlZ2lvbiBvZmZzZXQgc3BhbjogWyIgKyAoKElSZWdpb24pIGVsZW1lbnQpLmdldE9mZnNldCgpICsgIi0iICsgKChJUmVnaW9uKSBlbGVtZW50KS5nZXRMZW5ndGgoKSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCX0KLQkJCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgVHJlZVZpZXdlciAmJiBpbmZvVHJlZS5nZXRJbnB1dCgpIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJCUlKRmFjZU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoSUpGYWNlTm9kZUFkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgaW5mb1RyZWUuZ2V0SW5wdXQoKSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJCQkJCQlyZXR1cm4gYWRhcHRlci5nZXRMYWJlbFRleHQoKGluZm9UcmVlLmdldElucHV0KCkpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlyZXR1cm4gc3VwZXIuZ2V0VGV4dChlbGVtZW50KTsKLQkJCQkJfQotCQkJCX0pOwotCQkJCWluZm9UcmVlLnNldENvbnRlbnRQcm92aWRlcihuZXcgSVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IHBhcmVudEVsZW1lbnQpIHsKLQkJCQkJCWlmIChwYXJlbnRFbGVtZW50IGluc3RhbmNlb2YgQ29sbGVjdGlvbikKLQkJCQkJCQlyZXR1cm4gKChDb2xsZWN0aW9uKSBwYXJlbnRFbGVtZW50KS50b0FycmF5KCk7Ci0JCQkJCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQkJCQlMaXN0IGVsZW1lbnRzID0gbmV3IEFycmF5TGlzdCg0KTsKLQkJCQkJCWlmIChpbnB1dEVsZW1lbnQgIT0gbnVsbCkgewotCQkJCQkJCWlmIChpbnB1dEVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyICYmICgoSU5vZGVOb3RpZmllcikgaW5wdXRFbGVtZW50KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKSAhPSBudWxsKSB7Ci0JCQkJCQkJCWVsZW1lbnRzLmFkZChpbmZvVHJlZSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsZW1lbnRzLmFkZChpbnB1dEVsZW1lbnQuZ2V0Q2xhc3MoKSk7Ci0JCQkJCQkJaWYgKGlucHV0RWxlbWVudCBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJCQkJZWxlbWVudHMuYWRkKG5ldyBSZWdpb24oKChJbmRleGVkUmVnaW9uKSBpbnB1dEVsZW1lbnQpLmdldFN0YXJ0T2Zmc2V0KCksICgoSW5kZXhlZFJlZ2lvbikgaW5wdXRFbGVtZW50KS5nZXRFbmRPZmZzZXQoKSkpOwotCQkJCQkJCX0KLQkJCQkJCQlpZiAoaW5wdXRFbGVtZW50IGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJCQkJCQllbGVtZW50cy5hZGQoKChJTm9kZU5vdGlmaWVyKSBpbnB1dEVsZW1lbnQpLmdldEFkYXB0ZXJzKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCXJldHVybiBlbGVtZW50cy50b0FycmF5KCk7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZHJlbihPYmplY3QgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIGVsZW1lbnQgaW5zdGFuY2VvZiBDb2xsZWN0aW9uOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCXN0cnVjdHVyZWRTZWxlY3Rpb25UYWJsZS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJCQlpbnQgc2VsZWN0aW9uSW5kZXggPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uVGFibGUuZ2V0VGFibGUoKS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQkJCQkJaWYgKHNlbGVjdGlvbkluZGV4ICE9IC0xKSB7Ci0JCQkJCQkJaW5mb1RyZWUuc2V0SW5wdXQoaW5wdXQuZ2V0KHNlbGVjdGlvbkluZGV4KSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlpbmZvVHJlZS5zZXRJbnB1dChldmVudC5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpKTsKLQkJCQkJCX0KLQkJCQkJCWluZm9UcmVlLmV4cGFuZFRvTGV2ZWwoMik7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJCXN0cnVjdHVyZWRTYXNoRm9ybS5zZXRXZWlnaHRzKG5ldyBpbnRbXXszLCAyfSk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXRMaW5lTnVtYmVyKEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQkJaW50IGxpbmUgPSAtMTsKLQkJCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgTWFya2VyQW5ub3RhdGlvbikgewotCQkJCWxpbmUgPSBNYXJrZXJVdGlsaXRpZXMuZ2V0TGluZU51bWJlcigoKE1hcmtlckFubm90YXRpb24pIGFubm90YXRpb24pLmdldE1hcmtlcigpKTsvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJQW5ub3RhdGlvbk1vZGVsIGFubm90YXRpb25Nb2RlbCA9IGZUZXh0RWRpdG9yLmdldERvY3VtZW50UHJvdmlkZXIoKS5nZXRBbm5vdGF0aW9uTW9kZWwoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJUG9zaXRpb24gcCA9IGFubm90YXRpb25Nb2RlbC5nZXRQb3NpdGlvbihhbm5vdGF0aW9uKTsKLQkJCQlpZiAocCAhPSBudWxsICYmICFwLmlzRGVsZXRlZCgpKSB7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlsaW5lID0gZkRvY3VtZW50LmdldExpbmVPZk9mZnNldChwLmdldE9mZnNldCgpKTsKLQkJCQkJfQotCQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIEludGVnZXIudG9TdHJpbmcobGluZSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgY2xhc3MgS2V5VmFsdWVQYWlyIHsKLQkJT2JqZWN0IGZLZXk7Ci0JCVN0cmluZyBmVmFsdWU7Ci0KLQkJcHVibGljIEtleVZhbHVlUGFpcihPYmplY3Qga2V5LCBTdHJpbmcgdmFsdWUpIHsKLQkJCWZLZXkgPSBrZXk7Ci0JCQlmVmFsdWUgPSB2YWx1ZTsKLQkJfQotCX0KLQotCWNsYXNzIFNob3dFZGl0b3JJbmZvcm1hdGlvbkFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXB1YmxpYyBTaG93RWRpdG9ySW5mb3JtYXRpb25BY3Rpb24oKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJLyoqCi0JCQkgKiBUT0RPOiBQcm92aWRlIGEgbW9yZSB1c2VmdWwgY29udHJvbCwgbWF5YmUgYSB0YWJsZSB3aGVyZSB0aGUKLQkJCSAqIHNlbGVjdGlvbiBzaG93cyB5b3UgdGhlIHBhcnRpdGlvbidzIHRleHQgaW4gYSBTdHlsZWRUZXh0IHBhbmUKLQkJCSAqIGJlbmVhdGggaXQuCi0JCQkgKi8KLQkJCXN1cGVyLnJ1bigpOwotCQkJbmV3IEluZm9ybWF0aW9uRGlhbG9nKCgoQ29udHJvbCkgZlRleHRFZGl0b3IuZ2V0QWRhcHRlcihDb250cm9sLmNsYXNzKSkuZ2V0U2hlbGwoKSkub3BlbigpOwotCQl9Ci0JfQotCi0JSUFjdGlvbiBmU2hvd0VkaXRvckluZm9ybWF0aW9uQWN0aW9uID0gbmV3IFNob3dFZGl0b3JJbmZvcm1hdGlvbkFjdGlvbigpOwotCi0JSVRleHRFZGl0b3IgZlRleHRFZGl0b3IgPSBudWxsOwotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICovCi0JcHVibGljIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKFN0cmluZyBpZCkgewotCQlzdXBlcihpZCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGlkCi0JICogQHBhcmFtIHZpc2libGUKLQkgKiBAcGFyYW0gd2lkdGhJbkNoYXJzCi0JICovCi0JcHVibGljIE9mZnNldFN0YXR1c0xpbmVDb250cmlidXRpb25JdGVtKFN0cmluZyBpZCwgYm9vbGVhbiB2aXNpYmxlLCBpbnQgd2lkdGhJbkNoYXJzKSB7Ci0JCXN1cGVyKGlkLCB2aXNpYmxlLCB3aWR0aEluQ2hhcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEFjdGl2ZUVkaXRvcihJVGV4dEVkaXRvciB0ZXh0RWRpdG9yKSB7Ci0JCWZUZXh0RWRpdG9yID0gdGV4dEVkaXRvcjsKLQkJc2V0QWN0aW9uSGFuZGxlcihmU2hvd0VkaXRvckluZm9ybWF0aW9uQWN0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdWkvU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3VpL1N0cnVjdHVyZWRUZXh0QW5ub3RhdGlvbkltYWdlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgzNWVkYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdWkvU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnVpOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFubm90YXRpb25JbWFnZVByb3ZpZGVyOwotCi0vKioKLSAqIEltYWdlIHByb3ZpZGVyIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGFubm90YXRpb25zLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciBpbXBsZW1lbnRzIElBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSUFubm90YXRpb25JbWFnZVByb3ZpZGVyI2dldEltYWdlRGVzY3JpcHRvcihqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZURlc2NyaXRwb3JJZCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0JCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklBbm5vdGF0aW9uSW1hZ2VQcm92aWRlciNnZXRJbWFnZURlc2NyaXB0b3JJZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Bbm5vdGF0aW9uKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SW1hZ2VEZXNjcmlwdG9ySWQoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JQW5ub3RhdGlvbkltYWdlUHJvdmlkZXIjZ2V0TWFuYWdlZEltYWdlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb24pCi0JICovCi0JcHVibGljIEltYWdlIGdldE1hbmFnZWRJbWFnZShBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKLQkJLy8gZnV0dXJlIHJldHVybiBkaWZmZXJlbnQgdHlwZXMgb2YgbWFuYWdlZCBpbWFnZXMgYXMgSkRUIGRvZXMKLQkJLy8gZWcuIG92ZXJsYXkgaWNvbiBpbWFnZXMsICJncmF5ZWQiIGltYWdlcywgcXVpY2sgZml4YWJsZSwgZXRjLi4uCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvQXNzZXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyYTViMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Bc3NlcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotCi0vKioKLSAqIDxjb2RlPkFzc2VydDwvY29kZT4gaXMgdXNlZnVsIGZvciBmb3IgZW1iZWRkaW5nIHJ1bnRpbWUgc2FuaXR5IGNoZWNrcyBpbgotICogY29kZS4gVGhlIHByZWRpY2F0ZSBtZXRob2RzIGFsbCB0ZXN0IGEgY29uZGl0aW9uIGFuZCB0aHJvdyBzb21lIHR5cGUgb2YKLSAqIHVuY2hlY2tlZCBleGNlcHRpb24gaWYgdGhlIGNvbmRpdGlvbiBkb2VzIG5vdCBob2xkLgotICogPHA+Ci0gKiBBc3NlcnRpb24gZmFpbHVyZSBleGNlcHRpb25zLCBsaWtlIG1vc3QgcnVudGltZSBleGNlcHRpb25zLCBhcmUgdGhyb3duIHdoZW4KLSAqIHNvbWV0aGluZyBpcyBtaXNiZWhhdmluZy4gQXNzZXJ0aW9uIGZhaWx1cmVzIGFyZSBpbnZhcmlhYmx5IHVuc3BlY2lmaWVkCi0gKiBiZWhhdmlvcjsgY29uc2VxdWVudGx5LCBjbGllbnRzIHNob3VsZCBuZXZlciByZWx5IG9uIHRoZXNlIGJlaW5nIHRocm93bgotICogKGFuZCBjZXJ0YWlubHkgc2hvdWxkIG5vdCBiZWluZyBjYXRjaGluZyB0aGVtIHNwZWNpZmljYWxseSkuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlcnQgewotCi0JLyoqCi0JICogPGNvZGU+QXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uPC9jb2RlPiBpcyBhIHJ1bnRpbWUgZXhjZXB0aW9uIHRocm93bgotCSAqIGJ5IHNvbWUgb2YgdGhlIG1ldGhvZHMgaW4gPGNvZGU+QXNzZXJ0PC9jb2RlPi4KLQkgKiA8cD4KLQkgKiBUaGlzIGNsYXNzIGlzIG5vdCBkZWNsYXJlZCBwdWJsaWMgdG8gcHJldmVudCBzb21lIG1pc3VzZXM7IHByb2dyYW1zCi0JICogdGhhdCBjYXRjaCBvciBvdGhlcndpc2UgZGVwZW5kIG9uIGFzc2VydGlvbiBmYWlsdXJlcyBhcmUgc3VzY2VwdGlibGUgdG8KLQkgKiB1bmV4cGVjdGVkIGJyZWFrYWdlIHdoZW4gYXNzZXJ0aW9ucyBpbiB0aGUgY29kZSBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4KLQkgKiA8L3A+Ci0JICovCi0JY2xhc3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0JCS8qKgotCQkgKiBDb21tZW50IGZvciA8Y29kZT5zZXJpYWxWZXJzaW9uVUlEPC9jb2RlPgotCQkgKi8KLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkJLyoqCi0JCSAqIENvbnN0cnVjdHMgYSBuZXcgZXhjZXB0aW9uLgotCQkgKi8KLQkJcHVibGljIEFzc2VydGlvbkZhaWxlZEV4Y2VwdGlvbigpIHsKLQkJCXN1cGVyKCk7Ci0JCX0KLQotCQkvKioKLQkJICogQ29uc3RydWN0cyBhIG5ldyBleGNlcHRpb24gd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZS4KLQkJICovCi0JCXB1YmxpYyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24oU3RyaW5nIGRldGFpbCkgewotCQkJc3VwZXIoZGV0YWlsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEFzc2VydHMgdGhhdCBhbiBhcmd1bWVudCBpcyBsZWdhbC4gSWYgdGhlIGdpdmVuIGJvb2xlYW4gaXMgbm90Ci0JICogPGNvZGU+dHJ1ZTwvY29kZT4sIGFuIDxjb2RlPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvY29kZT4gaXMKLQkgKiB0aHJvd24uIFRoZSBnaXZlbiBtZXNzYWdlIGlzIGluY2x1ZGVkIGluIHRoYXQgZXhjZXB0aW9uLCB0byBhaWQKLQkgKiBkZWJ1Z2dpbmcuCi0JICogCi0JICogQHBhcmFtIGV4cHJlc3Npb24KLQkgKiAgICAgICAgICAgIHRoZSBvdXRjb2RlIG9mIHRoZSBjaGVjawotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBjaGVjayBwYXNzZXMgKGRvZXMgbm90IHJldHVybiBpZiB0aGUKLQkgKiAgICAgICAgIGNoZWNrIGZhaWxzKQotCSAqIEBleGNlcHRpb24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgaWYgdGhlIGxlZ2FsaXR5IHRlc3QgZmFpbGVkCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzTGVnYWwoYm9vbGVhbiBleHByZXNzaW9uLCBTdHJpbmcgbWVzc2FnZSkgewotCQlpZiAoIWV4cHJlc3Npb24pCi0JCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG1lc3NhZ2UpOwotCQlyZXR1cm4gZXhwcmVzc2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBub3QgPGNvZGU+bnVsbDwvY29kZT4uIElmIHRoaXMgaXMKLQkgKiBub3QgdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuCi0JICogbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gb2JqZWN0Ci0JICogICAgICAgICAgICB0aGUgdmFsdWUgdG8gdGVzdAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0aGUgbWVzc2FnZSB0byBpbmNsdWRlIGluIHRoZSBleGNlcHRpb24KLQkgKiBAZXhjZXB0aW9uIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIGlmIHRoZSBvYmplY3QgaXMgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIHZvaWQgaXNOb3ROdWxsKE9iamVjdCBvYmplY3QsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmIChvYmplY3QgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIGJvb2xlYW4gaXMgPGNvZGU+dHJ1ZTwvY29kZT4uIElmIHRoaXMgaXMgbm90Ci0JICogdGhlIGNhc2UsIHNvbWUga2luZCBvZiB1bmNoZWNrZWQgZXhjZXB0aW9uIGlzIHRocm93bi4gVGhlIGdpdmVuIG1lc3NhZ2UKLQkgKiBpcyBpbmNsdWRlZCBpbiB0aGF0IGV4Y2VwdGlvbiwgdG8gYWlkIGRlYnVnZ2luZy4KLQkgKiAKLQkgKiBAcGFyYW0gZXhwcmVzc2lvbgotCSAqICAgICAgICAgICAgdGhlIG91dGNvZGUgb2YgdGhlIGNoZWNrCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRoZSBtZXNzYWdlIHRvIGluY2x1ZGUgaW4gdGhlIGV4Y2VwdGlvbgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGNoZWNrIHBhc3NlcyAoZG9lcyBub3QgcmV0dXJuIGlmIHRoZQotCSAqICAgICAgICAgY2hlY2sgZmFpbHMpCi0JICovCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGlzVHJ1ZShib29sZWFuIGV4cHJlc3Npb24sIFN0cmluZyBtZXNzYWdlKSB7Ci0JCWlmICghZXhwcmVzc2lvbikgewotCQkJdGhyb3cgbmV3IEFzc2VydCgpLm5ldyBBc3NlcnRpb25GYWlsZWRFeGNlcHRpb24obWVzc2FnZSk7Ci0JCX0KLQkJcmV0dXJuIGV4cHJlc3Npb247Ci0JfQotCi0JLyogVGhpcyBjbGFzcyBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW5zdGFudGlhdGVkLiAqLwotCXByaXZhdGUgQXNzZXJ0KCkgewotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL0VkaXRvclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL0VkaXRvclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQ1MDIxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9FZGl0b3JVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLQotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUkdCOwotCi0vKioKLSAqIEhlbHBmdWwgbWV0aG9kcyB0byBiZSB1c2VkIHdpdGggdGhlIFNvdXJjZSBFZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIEVkaXRvclV0aWxpdHkgewotCi0JLyoqCi0JICogQXBwZW5kcyB0byBtb2RpZmllciBzdHJpbmcgb2YgdGhlIGdpdmVuIFNXVCBtb2RpZmllciBiaXQgdG8gdGhlIGdpdmVuCi0JICogbW9kaWZpZXJTdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVyU3RyaW5nCi0JICogICAgICAgICAgICB0aGUgbW9kaWZpZXIgc3RyaW5nCi0JICogQHBhcmFtIG1vZGlmaWVyCi0JICogICAgICAgICAgICBhbiBpbnQgd2l0aCBTV1QgbW9kaWZpZXIgYml0Ci0JICogQHJldHVybiB0aGUgY29uY2F0ZW5hdGVkIG1vZGlmaWVyIHN0cmluZwotCSAqLwotCXByaXZhdGUgc3RhdGljIFN0cmluZyBhcHBlbmRNb2RpZmllclN0cmluZyhTdHJpbmcgbW9kaWZpZXJTdHJpbmcsIGludCBtb2RpZmllcikgewotCQlpZiAobW9kaWZpZXJTdHJpbmcgPT0gbnVsbCkKLQkJCW1vZGlmaWVyU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG5ld01vZGlmaWVyU3RyaW5nID0gQWN0aW9uLmZpbmRNb2RpZmllclN0cmluZyhtb2RpZmllcik7Ci0JCWlmIChtb2RpZmllclN0cmluZy5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIG5ld01vZGlmaWVyU3RyaW5nOwotCQlyZXR1cm4gbW9kaWZpZXJTdHJpbmcgKyAiICsgIiArIG5ld01vZGlmaWVyU3RyaW5nOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIHN0YXRlIG1hc2sgZm9yIHRoZSBnaXZlbiBtb2RpZmllciBzdHJpbmcuCi0JICogCi0JICogQHBhcmFtIG1vZGlmaWVycwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB3aXRoIHRoZSBtb2RpZmllcnMsIHNlcGFyYXRlZCBieSAnKycsICctJywgJzsnLAotCSAqICAgICAgICAgICAgJywnIG9yICcuJwotCSAqIEByZXR1cm4gdGhlIHN0YXRlIG1hc2sgb3IgLTEgaWYgdGhlIGlucHV0IGlzIGludmFsaWQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU3RhdGVNYXNrKFN0cmluZyBtb2RpZmllcnMpIHsKLQkJaWYgKG1vZGlmaWVycyA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCi0JCWlmIChtb2RpZmllcnMubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBTV1QuTk9ORTsKLQotCQlpbnQgc3RhdGVNYXNrID0gMDsKLQkJU3RyaW5nVG9rZW5pemVyIG1vZGlmaWVyVG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcihtb2RpZmllcnMsICIsOy46Ky0qICIpOyAvLyROT04tTkxTLTEkCi0JCXdoaWxlIChtb2RpZmllclRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCWludCBtb2RpZmllciA9IEVkaXRvclV0aWxpdHkuZmluZExvY2FsaXplZE1vZGlmaWVyKG1vZGlmaWVyVG9rZW5pemVyLm5leHRUb2tlbigpKTsKLQkJCWlmIChtb2RpZmllciA9PSAwIHx8IChzdGF0ZU1hc2sgJiBtb2RpZmllcikgPT0gbW9kaWZpZXIpCi0JCQkJcmV0dXJuIC0xOwotCQkJc3RhdGVNYXNrID0gc3RhdGVNYXNrIHwgbW9kaWZpZXI7Ci0JCX0KLQkJcmV0dXJuIHN0YXRlTWFzazsKLQl9Ci0KLQkvKioKLQkgKiBNYXBzIHRoZSBsb2NhbGl6ZWQgbW9kaWZpZXIgbmFtZSB0byBhIGNvZGUgaW4gdGhlIHNhbWUgbWFubmVyIGFzCi0JICogI2ZpbmRNb2RpZmllci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBTV1QgbW9kaWZpZXIgYml0LCBvciA8Y29kZT4wPC9jb2RlPiBpZiBubyBtYXRjaCB3YXMgZm91bmQKLQkgKiBAc2VlIGZpbmRNb2RpZmllcgotCSAqLwotCXB1YmxpYyBzdGF0aWMgaW50IGZpbmRMb2NhbGl6ZWRNb2RpZmllcihTdHJpbmcgdG9rZW4pIHsKLQkJaWYgKHRva2VuID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5DVFJMKSkpCi0JCQlyZXR1cm4gU1dULkNUUkw7Ci0JCWlmICh0b2tlbi5lcXVhbHNJZ25vcmVDYXNlKEFjdGlvbi5maW5kTW9kaWZpZXJTdHJpbmcoU1dULlNISUZUKSkpCi0JCQlyZXR1cm4gU1dULlNISUZUOwotCQlpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5BTFQpKSkKLQkJCXJldHVybiBTV1QuQUxUOwotCQlpZiAodG9rZW4uZXF1YWxzSWdub3JlQ2FzZShBY3Rpb24uZmluZE1vZGlmaWVyU3RyaW5nKFNXVC5DT01NQU5EKSkpCi0JCQlyZXR1cm4gU1dULkNPTU1BTkQ7Ci0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogVGVtcG9yYXJ5IG1ldGhvZCB0byBoZWxwIG1pZ3JhdGUgZnJvbSB1c2luZyBTdHJ1Y3R1cmVkVGV4dENvbG9ycyB0bwotCSAqIHVzaW5nIGJhc2UgQ29sb3JSZWdpc3RyeS4gSW5zdGVhZCBvZiB1c2luZyBzeW1ib2xpYyBuYW1lcyBpbiB0aGUgY29sb3IKLQkgKiByZWdpc3RyeSwgd2UgYXJlIGN1cnJlbnRseSBtYXBwaW5nIHRoZSByZ2IudG9TdHJpbmcgdmFsdWUgdG8KLQkgKiBjb3JyZXNwb25kaW5nIGNvbG9yLgotCSAqIAotCSAqIEBwYXJhbSByZ2IKLQkgKiBAcmV0dXJuIENvbG9yCi0JICovCi0JcHVibGljIHN0YXRpYyBDb2xvciBnZXRDb2xvcihSR0IgcmdiKSB7Ci0JCWlmIChyZ2IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGdldCB0aGUgY29sb3IgZnJvbSB0aGUgcGxhdGZvcm0gY29sb3IgcmVnaXN0cnkKLQkJQ29sb3IgY29sb3IgPSBKRmFjZVJlc291cmNlcy5nZXRDb2xvclJlZ2lzdHJ5KCkuZ2V0KHJnYi50b1N0cmluZygpKTsKLQotCQkvLyBpZiB0aGUgcGxhdGZvcm0gY29sb3IgcmVnaXN0cnkgZG9lcyBub3QgaGF2ZSB0aGlzIGNvbG9yIHlldCwgYWRkIHRvCi0JCS8vIHRoZSByZWdpc3RyeQotCQlpZiAoY29sb3IgPT0gbnVsbCkgewotCQkJSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLnB1dChyZ2IudG9TdHJpbmcoKSwgcmdiKTsKLQkJCWNvbG9yID0gSkZhY2VSZXNvdXJjZXMuZ2V0Q29sb3JSZWdpc3RyeSgpLmdldChyZ2IudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGlmaWVyIHN0cmluZyBmb3IgdGhlIGdpdmVuIFNXVCBtb2RpZmllciBtb2RpZmllciBiaXRzLgotCSAqIAotCSAqIEBwYXJhbSBzdGF0ZU1hc2sKLQkgKiAgICAgICAgICAgIHRoZSBTV1QgbW9kaWZpZXIgYml0cwotCSAqIEByZXR1cm4gdGhlIG1vZGlmaWVyIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE1vZGlmaWVyU3RyaW5nKGludCBzdGF0ZU1hc2spIHsKLQkJU3RyaW5nIG1vZGlmaWVyU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ1RSTCkgPT0gU1dULkNUUkwpCi0JCQltb2RpZmllclN0cmluZyA9IGFwcGVuZE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyU3RyaW5nLCBTV1QuQ1RSTCk7Ci0JCWlmICgoc3RhdGVNYXNrICYgU1dULkFMVCkgPT0gU1dULkFMVCkKLQkJCW1vZGlmaWVyU3RyaW5nID0gYXBwZW5kTW9kaWZpZXJTdHJpbmcobW9kaWZpZXJTdHJpbmcsIFNXVC5BTFQpOwotCQlpZiAoKHN0YXRlTWFzayAmIFNXVC5TSElGVCkgPT0gU1dULlNISUZUKQotCQkJbW9kaWZpZXJTdHJpbmcgPSBhcHBlbmRNb2RpZmllclN0cmluZyhtb2RpZmllclN0cmluZywgU1dULlNISUZUKTsKLQkJaWYgKChzdGF0ZU1hc2sgJiBTV1QuQ09NTUFORCkgPT0gU1dULkNPTU1BTkQpCi0JCQltb2RpZmllclN0cmluZyA9IGFwcGVuZE1vZGlmaWVyU3RyaW5nKG1vZGlmaWVyU3RyaW5nLCBTV1QuQ09NTUFORCk7Ci0KLQkJcmV0dXJuIG1vZGlmaWVyU3RyaW5nOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1BsYXRmb3JtU3RhdHVzTGluZVV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1BsYXRmb3JtU3RhdHVzTGluZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMzNDRlNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9QbGF0Zm9ybVN0YXR1c0xpbmVVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlZFRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5WZXJpZnlLZXlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5WZXJpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLQotCi0vKioKLSAqIFV0aWxpdHkgdG8gZGlzcGxheSAoYW5kL29yIGNsZWFyKSBtZXNzYWdlcyBvbiB0aGUgc3RhdHVzIGxpbmUuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsIHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIENsZWFyRXJyb3JNZXNzYWdlIGltcGxlbWVudHMgUnVubmFibGUgewotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlkaXNwbGF5TWVzc2FnZShudWxsKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFVzZWQgdG8gY2xlYXIgbWVzc2FnZSBvbiBmb2N1cyBsb3NzLCBjaGFuZ2Ugb2Ygc2VsZWN0aW9uLCBrZXkgdHlwZSwKLQkgKiBldGMuLi4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBjbGFzcyBPbmVUaW1lTGlzdGVuZXIgZXh0ZW5kcyBGb2N1c0FkYXB0ZXIgaW1wbGVtZW50cyBWZXJpZnlLZXlMaXN0ZW5lciwgU2VsZWN0aW9uTGlzdGVuZXIsIE1vdXNlTGlzdGVuZXIgewotCi0JCXByaXZhdGUgUnVubmFibGUgZlJ1bm5lciA9IG51bGw7Ci0JCXByaXZhdGUgU3R5bGVkVGV4dCBmU3R5bGVkVGV4dDsKLQotCQlwdWJsaWMgT25lVGltZUxpc3RlbmVyKFN0eWxlZFRleHQgdGFyZ2V0LCBSdW5uYWJsZSByKSB7Ci0JCQlmU3R5bGVkVGV4dCA9IHRhcmdldDsKLQkJCWZSdW5uZXIgPSByOwotCQkJZlN0eWxlZFRleHQuYWRkVmVyaWZ5S2V5TGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5hZGRGb2N1c0xpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCQlmU3R5bGVkVGV4dC5hZGRNb3VzZUxpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZm9jdXNMb3N0KEZvY3VzRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQl1bmhvb2tBbmRSdW4oKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vdXNlVXAoTW91c2VFdmVudCBlKSB7Ci0JCQkvLwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHVuaG9va0FuZFJ1bigpIHsKLQkJCWZTdHlsZWRUZXh0LnJlbW92ZVZlcmlmeUtleUxpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQucmVtb3ZlRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdHlsZWRUZXh0LnJlbW92ZVNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlN0eWxlZFRleHQucmVtb3ZlTW91c2VMaXN0ZW5lcih0aGlzKTsKLQkJCWZTdHlsZWRUZXh0LmdldERpc3BsYXkoKS5hc3luY0V4ZWMoZlJ1bm5lcik7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB2ZXJpZnlLZXkoVmVyaWZ5RXZlbnQgZXZlbnQpIHsKLQkJCXVuaG9va0FuZFJ1bigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCXVuaG9va0FuZFJ1bigpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJdW5ob29rQW5kUnVuKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTdGF0dXMgbGluZSB3aWxsIGJlIGNsZWFyZWQgdy8ga2V5IHR5cGUsIG9yIHNlbGVjdGlvbiBjaGFuZ2UKLQkgKiAKLQkgKiBAcGFyYW0gd2lkZ2V0Ci0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCkgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBnZXRBY3RpdmVFZGl0b3IoKTsKLQkJYm9vbGVhbiBhZGRlZCA9IGZhbHNlOwotCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCUNvbnRyb2wgY29udHJvbCA9IChDb250cm9sKSBlZGl0b3IuZ2V0QWRhcHRlcihDb250cm9sLmNsYXNzKTsKLQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgU3R5bGVkVGV4dCkgewotCQkJCWFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKCgoU3R5bGVkVGV4dCkgY29udHJvbCkpOwotCQkJCWFkZGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlpZiAoIWFkZGVkKSB7Ci0JCQkvLyBjbGVhciB0aGUgZXJyb3IgbWVzc2FnZSBpbW1lZGlhdGVseQotCQkJZGlzcGxheU1lc3NhZ2UobnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyB2b2lkIGFkZE9uZVRpbWVDbGVhckxpc3RlbmVyKFN0eWxlZFRleHQgd2lkZ2V0KSB7Ci0JCW5ldyBPbmVUaW1lTGlzdGVuZXIod2lkZ2V0LCBuZXcgQ2xlYXJFcnJvck1lc3NhZ2UoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2xlYXJzIHRoZSBzdGF0dXMgbGluZSBpbW1lZGlhdGVseQotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhclN0YXR1c0xpbmUoKSB7Ci0JCWRpc3BsYXlNZXNzYWdlKG51bGwpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYSBtZXNzYWdlIG9uIHRoZSBzdGF0dXMgbGluZSAod2l0aCBhIGJlZXApCi0JICogCi0JICogQHBhcmFtIG1zZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgdm9pZCBkaXNwbGF5RXJyb3JNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJZGlzcGxheU1lc3NhZ2UobXNnKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCkuYmVlcCgpOwotCX0KLQotCS8qKgotCSAqIERpc3BsYXkgYSBtZXNzYWdlIG9uIHRoZSBzdGF0dXMgbGluZSAobm8gYmVlcCkKLQkgKiAKLQkgKiBAcGFyYW0gbXNnCi0JICovCi0JcHVibGljIHN0YXRpYyB2b2lkIGRpc3BsYXlNZXNzYWdlKFN0cmluZyBtc2cpIHsKLQkJSUVkaXRvclBhcnQgZWRpdG9yID0gZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCWlmIChlZGl0b3IgIT0gbnVsbCkgewotCQkJZWRpdG9yLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJzKCkuZ2V0U3RhdHVzTGluZU1hbmFnZXIoKS5zZXRFcnJvck1lc3NhZ2UobXNnKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgSUVkaXRvclBhcnQgZ2V0QWN0aXZlRWRpdG9yKCkgewotCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBudWxsOwotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgPT0gbnVsbCkgewotCQkJd2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLQkJfQotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkKLQkJCQllZGl0b3IgPSBwYWdlLmdldEFjdGl2ZUVkaXRvcigpOwotCQl9Ci0JCXJldHVybiBlZGl0b3I7Ci0JfQotCi0JcHJpdmF0ZSBQbGF0Zm9ybVN0YXR1c0xpbmVVdGlsKCkgewotCQkvLyBmb3JjZSB1c2Ugb2Ygc2luZ2xldG9uCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1JlZ2lzdHJ5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODU5N2UuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3V0aWwvUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudXRpbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25SZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBsdWdpblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGVtcGxhdGUgaW1wbGVtZW50YXRpb24gb2YgYSByZWdpc3RyeSByZWFkZXIgdGhhdCBjcmVhdGVzIG9iamVjdHMKLSAqIHJlcHJlc2VudGluZyByZWdpc3RyeSBjb250ZW50cy4gVHlwaWNhbGx5LCBhbiBleHRlbnNpb24gY29udGFpbnMgb25lCi0gKiBlbGVtZW50LCBidXQgdGhpcyByZWFkZXIgaGFuZGxlcyBtdWx0aXBsZSBlbGVtZW50cyBwZXIgZXh0ZW5zaW9uLgotICogCi0gKiBUbyBzdGFydCByZWFkaW5nIHRoZSBleHRlbnNpb25zIGZyb20gdGhlIHJlZ2lzdHJ5IGZvciBhbiBleHRlbnNpb24gcG9pbnQsCi0gKiBjYWxsIHRoZSBtZXRob2QgPGNvZGU+cmVhZFJlZ2lzdHJ5PC9jb2RlPi4KLSAqIAotICogVG8gcmVhZCBjaGlsZHJlbiBvZiBhbiBJQ29uZmlndXJhdGlvbkVsZW1lbnQsIGNhbGwgdGhlIG1ldGhvZAotICogPGNvZGU+cmVhZEVsZW1lbnRDaGlsZHJlbjwvY29kZT4gZnJvbSB5b3VyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QKLSAqIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPiwgYXMgaXQgd2lsbCBub3QgYmUgZG9uZSBieSBkZWZhdWx0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVnaXN0cnlSZWFkZXIgewotCi0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHJvdGVjdGVkIFJlZ2lzdHJ5UmVhZGVyKCkgewotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGV4dHJhY3RzIGRlc2NyaXB0aW9uIGFzIGEgc3ViZWxlbWVudCBvZiB0aGUgZ2l2ZW4gZWxlbWVudC4KLQkgKiAKLQkgKiBAcmV0dXJuIGRlc2NyaXB0aW9uIHN0cmluZyBpZiBkZWZpbmVkLCBvciBlbXB0eSBzdHJpbmcgaWYgbm90LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZykgewotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZHJlbiA9IGNvbmZpZy5nZXRDaGlsZHJlbihUQUdfREVTQ1JJUFRJT04pOwotCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID49IDEpIHsKLQkJCXJldHVybiBjaGlsZHJlblswXS5nZXRWYWx1ZSgpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgdGhlIGVycm9yIGluIHRoZSB3b3JrYmVuY2ggbG9nIHVzaW5nIHRoZSBwcm92aWRlZCB0ZXh0IGFuZCB0aGUKLQkgKiBpbmZvcm1hdGlvbiBpbiB0aGUgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGxvZ0Vycm9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGV4dCkgewotCQlJRXh0ZW5zaW9uIGV4dGVuc2lvbiA9IGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWJ1Zi5hcHBlbmQoIlBsdWdpbiAiICsgZXh0ZW5zaW9uLmdldE5hbWVzcGFjZSgpICsgIiwgZXh0ZW5zaW9uICIgKyBleHRlbnNpb24uZ2V0RXh0ZW5zaW9uUG9pbnRVbmlxdWVJZGVudGlmaWVyKCkpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlidWYuYXBwZW5kKCJcbiIgKyB0ZXh0KTsgLy8kTk9OLU5MUy0xJAotCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgYnVmLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqIExvZ3MgYSB2ZXJ5IGNvbW1vbiByZWdpc3RyeSBlcnJvciB3aGVuIGEgcmVxdWlyZWQgYXR0cmlidXRlIGlzIG1pc3NpbmcuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9nTWlzc2luZ0F0dHJpYnV0ZShJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLQkJbG9nRXJyb3IoZWxlbWVudCwgIlJlcXVpcmVkIGF0dHJpYnV0ZSAnIiArIGF0dHJpYnV0ZU5hbWUgKyAiJyBub3QgZGVmaW5lZCIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIExvZ3MgYSByZWdpc3RyeSBlcnJvciB3aGVuIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgaXMgdW5rbm93bi4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBsb2dVbmtub3duRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlsb2dFcnJvcihlbGVtZW50LCAiVW5rbm93biBleHRlbnNpb24gdGFnIGZvdW5kOiAiICsgZWxlbWVudC5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQXBwbHkgYSByZXByb2R1Y2FibGUgb3JkZXIgdG8gdGhlIGxpc3Qgb2YgZXh0ZW5zaW9ucyBwcm92aWRlZCwgc3VjaAotCSAqIHRoYXQgdGhlIG9yZGVyIHdpbGwgbm90IGNoYW5nZSBhcyBleHRlbnNpb25zIGFyZSBhZGRlZCBvciByZW1vdmVkLgotCSAqLwotCXByb3RlY3RlZCBJRXh0ZW5zaW9uW10gb3JkZXJFeHRlbnNpb25zKElFeHRlbnNpb25bXSBleHRlbnNpb25zKSB7Ci0JCS8vIEJ5IGRlZmF1bHQsIHRoZSBvcmRlciBpcyBiYXNlZCBvbiBwbHVnaW4gaWQgc29ydGVkCi0JCS8vIGluIGFzY2VuZGluZyBvcmRlci4gVGhlIG9yZGVyIGZvciBhIHBsdWdpbiBwcm92aWRpbmcKLQkJLy8gbW9yZSB0aGFuIG9uZSBleHRlbnNpb24gZm9yIGFuIGV4dGVuc2lvbiBwb2ludCBpcwotCQkvLyBkZXBlbmRlbnQgaW4gdGhlIG9yZGVyIGxpc3RlZCBpbiB0aGUgWE1MIGZpbGUuCi0JCVNvcnRlciBzb3J0ZXIgPSBuZXcgU29ydGVyKCkgewotCQkJcHVibGljIGJvb2xlYW4gY29tcGFyZShPYmplY3QgZXh0ZW5zaW9uMSwgT2JqZWN0IGV4dGVuc2lvbjIpIHsKLQkJCQlTdHJpbmcgczEgPSAoKElFeHRlbnNpb24pIGV4dGVuc2lvbjEpLmdldE5hbWVzcGFjZSgpLnRvVXBwZXJDYXNlKCk7Ci0JCQkJU3RyaW5nIHMyID0gKChJRXh0ZW5zaW9uKSBleHRlbnNpb24yKS5nZXROYW1lc3BhY2UoKS50b1VwcGVyQ2FzZSgpOwotCQkJCS8vUmV0dXJuIHRydWUgaWYgZWxlbWVudFR3byBpcyAnZ3JlYXRlciB0aGFuJyBlbGVtZW50T25lCi0JCQkJcmV0dXJuIHMyLmNvbXBhcmVUbyhzMSkgPiAwOwotCQkJfQotCQl9OwotCi0JCU9iamVjdFtdIHNvcnRlZCA9IHNvcnRlci5zb3J0KGV4dGVuc2lvbnMpOwotCQlJRXh0ZW5zaW9uW10gc29ydGVkRXh0ZW5zaW9uID0gbmV3IElFeHRlbnNpb25bc29ydGVkLmxlbmd0aF07Ci0JCVN5c3RlbS5hcnJheWNvcHkoc29ydGVkLCAwLCBzb3J0ZWRFeHRlbnNpb24sIDAsIHNvcnRlZC5sZW5ndGgpOwotCQlyZXR1cm4gc29ydGVkRXh0ZW5zaW9uOwotCX0KLQotCS8qKgotCSAqIEltcGxlbWVudCB0aGlzIG1ldGhvZCB0byByZWFkIGVsZW1lbnQncyBhdHRyaWJ1dGVzLiBJZiBjaGlsZHJlbiBzaG91bGQKLQkgKiBhbHNvIGJlIHJlYWQsIHRoZW4gaW1wbGVtZW50b3IgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKLQkgKiA8Y29kZT5yZWFkRWxlbWVudENoaWxkcmVuPC9jb2RlPi4gSW1wbGVtZW50b3IgaXMgYWxzbyByZXNwb25zaWJsZQotCSAqIGZvciBsb2dnaW5nIG1pc3NpbmcgYXR0cmlidXRlcy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZWxlbWVudCB3YXMgcmVjb2duaXplZCwgZmFsc2UgaWYgbm90LgotCSAqLwotCXByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIFJlYWQgdGhlIGVsZW1lbnQncyBjaGlsZHJlbi4gVGhpcyBpcyBjYWxsZWQgYnkgdGhlIHN1YmNsYXNzJwotCSAqIHJlYWRFbGVtZW50IG1ldGhvZCB3aGVuIGl0IHdhbnRzIHRvIHJlYWQgdGhlIGNoaWxkcmVuIG9mIHRoZSBlbGVtZW50LgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50Q2hpbGRyZW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJcmVhZEVsZW1lbnRzKGVsZW1lbnQuZ2V0Q2hpbGRyZW4oKSk7Ci0JfQotCi0JLyoqCi0JICogUmVhZCBlYWNoIGVsZW1lbnQgb25lIGF0IGEgdGltZSBieSBjYWxsaW5nIHRoZSBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvbgotCSAqIG9mIDxjb2RlPnJlYWRFbGVtZW50PC9jb2RlPi4KLQkgKiAKLQkgKiBMb2dzIGFuIGVycm9yIGlmIHRoZSBlbGVtZW50IHdhcyBub3QgcmVjb2duaXplZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudHMoSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJaWYgKCFyZWFkRWxlbWVudChlbGVtZW50c1tpXSkpCi0JCQkJbG9nVW5rbm93bkVsZW1lbnQoZWxlbWVudHNbaV0pOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmVhZCBvbmUgZXh0ZW5zaW9uIGJ5IGxvb3BpbmcgdGhyb3VnaCBpdHMgY29uZmlndXJhdGlvbiBlbGVtZW50cy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkRXh0ZW5zaW9uKElFeHRlbnNpb24gZXh0ZW5zaW9uKSB7Ci0JCXJlYWRFbGVtZW50cyhleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCkpOwotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSByZWFkUmVnaXN0cnkoSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoSVBsdWdpblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogU3RhcnQgdGhlIHJlZ2lzdHJ5IHJlYWRpbmcgcHJvY2VzcyB1c2luZyB0aGUgc3VwcGxpZWQgcGx1Z2luIElEIGFuZAotCSAqIGV4dGVuc2lvbiBwb2ludC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZWFkUmVnaXN0cnkoSUV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBTdHJpbmcgcGx1Z2luSWQsIFN0cmluZyBleHRlbnNpb25Qb2ludCkgewotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChwbHVnaW5JZCwgZXh0ZW5zaW9uUG9pbnQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUV4dGVuc2lvbltdIGV4dGVuc2lvbnMgPSBwb2ludC5nZXRFeHRlbnNpb25zKCk7Ci0JCQlleHRlbnNpb25zID0gb3JkZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKQotCQkJCXJlYWRFeHRlbnNpb24oZXh0ZW5zaW9uc1tpXSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdXRpbC9Tb3J0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2VlMDFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC91dGlsL1NvcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnV0aWw7Ci0KLQotCi0vKioKLSAqIFRoZSBTb3J0T3BlcmF0aW9uIHRha2VzIGEgY29sbGVjdGlvbiBvZiBvYmplY3RzIGFuZCByZXR1cm5zIGEgc29ydGVkCi0gKiBjb2xsZWN0aW9uIG9mIHRoZXNlIG9iamVjdHMuIENvbmNyZXRlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHByb3ZpZGUgdGhlCi0gKiBjcml0ZXJpYSBmb3IgdGhlIHNvcnRpbmcgb2YgdGhlIG9iamVjdHMgYmFzZWQgb24gdGhlIHR5cGUgb2YgdGhlIG9iamVjdHMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTb3J0ZXIgewotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGVsZW1lbnRUd28gaXMgJ2dyZWF0ZXIgdGhhbicgZWxlbWVudE9uZSBUaGlzIGlzIHRoZQotCSAqICdvcmRlcmluZycgbWV0aG9kIG9mIHRoZSBzb3J0IG9wZXJhdGlvbi4gRWFjaCBzdWJjbGFzcyBvdmVyaWRlcyB0aGlzCi0JICogbWV0aG9kIHdpdGggdGhlIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgdGhlICdncmVhdGVyIHRoYW4nIGNvbmNlcHQKLQkgKiBmb3IgdGhlIG9iamVjdHMgYmVpbmcgc29ydGVkLgotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbXBhcmUoT2JqZWN0IGVsZW1lbnRPbmUsIE9iamVjdCBlbGVtZW50VHdvKTsKLQotCS8qKgotCSAqIFNvcnQgdGhlIG9iamVjdHMgaW4gc29ydGVkIGNvbGxlY3Rpb24gYW5kIHJldHVybiB0aGF0IGNvbGxlY3Rpb24uCi0JICovCi0JcHJpdmF0ZSBPYmplY3RbXSBxdWlja1NvcnQoT2JqZWN0W10gc29ydGVkQ29sbGVjdGlvbiwgaW50IGxlZnQsIGludCByaWdodCkgewotCQlpbnQgb3JpZ2luYWxMZWZ0ID0gbGVmdDsKLQkJaW50IG9yaWdpbmFsUmlnaHQgPSByaWdodDsKLQkJT2JqZWN0IG1pZCA9IHNvcnRlZENvbGxlY3Rpb25bKGxlZnQgKyByaWdodCkgLyAyXTsKLQotCQlkbyB7Ci0JCQl3aGlsZSAoY29tcGFyZShzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdLCBtaWQpKQotCQkJCWxlZnQrKzsKLQkJCXdoaWxlIChjb21wYXJlKG1pZCwgc29ydGVkQ29sbGVjdGlvbltyaWdodF0pKQotCQkJCXJpZ2h0LS07Ci0JCQlpZiAobGVmdCA8PSByaWdodCkgewotCQkJCU9iamVjdCB0bXAgPSBzb3J0ZWRDb2xsZWN0aW9uW2xlZnRdOwotCQkJCXNvcnRlZENvbGxlY3Rpb25bbGVmdF0gPSBzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XTsKLQkJCQlzb3J0ZWRDb2xsZWN0aW9uW3JpZ2h0XSA9IHRtcDsKLQkJCQlsZWZ0Kys7Ci0JCQkJcmlnaHQtLTsKLQkJCX0KLQkJfSB3aGlsZSAobGVmdCA8PSByaWdodCk7Ci0KLQkJaWYgKG9yaWdpbmFsTGVmdCA8IHJpZ2h0KQotCQkJc29ydGVkQ29sbGVjdGlvbiA9IHF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBvcmlnaW5hbExlZnQsIHJpZ2h0KTsKLQkJaWYgKGxlZnQgPCBvcmlnaW5hbFJpZ2h0KQotCQkJc29ydGVkQ29sbGVjdGlvbiA9IHF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCBsZWZ0LCBvcmlnaW5hbFJpZ2h0KTsKLQotCQlyZXR1cm4gc29ydGVkQ29sbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYSBuZXcgc29ydGVkIGNvbGxlY3Rpb24gZnJvbSB0aGlzIHVuc29ydGVkIGNvbGxlY3Rpb24uIFNvcnQKLQkgKiB1c2luZyBxdWljayBzb3J0LgotCSAqLwotCXB1YmxpYyBPYmplY3RbXSBzb3J0KE9iamVjdFtdIHVuU29ydGVkQ29sbGVjdGlvbikgewotCQlpbnQgc2l6ZSA9IHVuU29ydGVkQ29sbGVjdGlvbi5sZW5ndGg7Ci0JCU9iamVjdFtdIHNvcnRlZENvbGxlY3Rpb24gPSBuZXcgT2JqZWN0W3NpemVdOwotCi0JCS8vY29weSB0aGUgYXJyYXkgc28gY2FuIHJldHVybiBhIG5ldyBzb3J0ZWQgY29sbGVjdGlvbgotCQlTeXN0ZW0uYXJyYXljb3B5KHVuU29ydGVkQ29sbGVjdGlvbiwgMCwgc29ydGVkQ29sbGVjdGlvbiwgMCwgc2l6ZSk7Ci0JCWlmIChzaXplID4gMSkKLQkJCXF1aWNrU29ydChzb3J0ZWRDb2xsZWN0aW9uLCAwLCBzaXplIC0gMSk7Ci0KLQkJcmV0dXJuIHNvcnRlZENvbGxlY3Rpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0NhcmV0RXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9DYXJldEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOGZhMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0NhcmV0RXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqIAotICogU2ltcGx5IGhvbGRzIGRhdGEgdG8gYmUgcGFzc2VkIHRvIENhcmV0RXZlbnRMaXN0ZW5lcnMKLSAqLwotcHVibGljIGNsYXNzIENhcmV0RXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgewotCi0JLyoqCi0JICogQ29tbWVudCBmb3IgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQkvLyBpbml0aWFsaXplIHRvIGltcG9zc2libGUgbG9jYXRpb24KLQlpbnQgZlBvc2l0aW9uID0gLTE7Ci0KLQkvKioKLQkgKiBkb2VzbnQndCBtYWtlIHNlbnNlIHRvIGhhdmUgYSBDYXJldEV2ZW50IHdpdGhvdXQgdGhlIENhcmV0IHBvc3Rpb24sIHNvCi0JICogdXNlIG90aGVyIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIENhcmV0RXZlbnQoT2JqZWN0IHNvdXJjZSkgewotCQlzdXBlcihzb3VyY2UpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgdGhlIHByZWZlcnJlZCBjb25zdHJ1Y3Rvci4KLQkgKi8KLQlwdWJsaWMgQ2FyZXRFdmVudChPYmplY3Qgc291cmNlLCBpbnQgcG9zaXRpb24pIHsKLQkJc3VwZXIoc291cmNlKTsKLQkJc2V0UG9zaXRpb24ocG9zaXRpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zaXRpb247Ci0JfQotCi0Jdm9pZCBzZXRQb3NpdGlvbihpbnQgbmV3UG9zaXRpb24pIHsKLQkJZlBvc2l0aW9uID0gbmV3UG9zaXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lDYXJldExpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSUNhcmV0TGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBiMTllYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSUNhcmV0TGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGludGVyZmFjZSBJQ2FyZXRMaXN0ZW5lciBleHRlbmRzIGphdmEudXRpbC5FdmVudExpc3RlbmVyIHsKLQlwdWJsaWMgdm9pZCBjYXJldE1vdmVkKENhcmV0RXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lOb2RlU2VsZWN0aW9uTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JTm9kZVNlbGVjdGlvbkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNWMwZWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL0lOb2RlU2VsZWN0aW9uTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotCi0vKioKLSAqIEBkZXByZWNhdGVkIC0gdXNlIGJhc2Ugc2VsZWN0aW9uIG5vdGlmaWNhdGlvbgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSU5vZGVTZWxlY3Rpb25MaXN0ZW5lciB7Ci0Jdm9pZCBub2RlU2VsZWN0aW9uQ2hhbmdlZChOb2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JVGV4dFNlbGVjdGlvbkxpc3RlbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvSVRleHRTZWxlY3Rpb25MaXN0ZW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjgzYmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9JVGV4dFNlbGVjdGlvbkxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgLSB1c2UgYmFzZSBzZWxlY3Rpb24gbm90aWZpY2F0aW9uCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVRleHRTZWxlY3Rpb25MaXN0ZW5lciB7Ci0Jdm9pZCB0ZXh0U2VsZWN0aW9uQ2hhbmdlZChUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvaW50ZXJuYWwvdmlldy9ldmVudHMvTm9kZVNlbGVjdGlvbkNoYW5nZWRFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTQwYTdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9Ob2RlU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwudmlldy5ldmVudHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIE5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlpbnQgZkNhcmV0UG9zaXRpb247Ci0KLQlMaXN0IGZTZWxlY3RlZE5vZGVzOwotCi0JcHVibGljIE5vZGVTZWxlY3Rpb25DaGFuZ2VkRXZlbnQoT2JqZWN0IHNvdXJjZSwgTGlzdCBzZWxlY3RlZE5vZGVzLCBpbnQgY2FyZXRQb3NpdGlvbikgewotCQlzdXBlcihzb3VyY2UpOwotCQlmU2VsZWN0ZWROb2RlcyA9IHNlbGVjdGVkTm9kZXM7Ci0JCWZDYXJldFBvc2l0aW9uID0gY2FyZXRQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldENhcmV0UG9zaXRpb24oKSB7Ci0JCXJldHVybiBmQ2FyZXRQb3NpdGlvbjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCkgewotCQlyZXR1cm4gZlNlbGVjdGVkTm9kZXM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL1RleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS9pbnRlcm5hbC92aWV3L2V2ZW50cy9UZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZGJmNGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL2ludGVybmFsL3ZpZXcvZXZlbnRzL1RleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC52aWV3LmV2ZW50czsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCAtIHVzZSBiYXNlIHNlbGVjdGlvbiBub3RpZmljYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFRleHRTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBqYXZhLnV0aWwuRXZlbnRPYmplY3QgewotCS8qKgotCSAqIENvbW1lbnQgZm9yIDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQlpbnQgZlRleHRTZWxlY3Rpb25FbmQ7Ci0KLQlpbnQgZlRleHRTZWxlY3Rpb25TdGFydDsKLQotCXB1YmxpYyBUZXh0U2VsZWN0aW9uQ2hhbmdlZEV2ZW50KE9iamVjdCBzb3VyY2UsIGludCB0ZXh0U2VsZWN0aW9uU3RhcnQsIGludCB0ZXh0U2VsZWN0aW9uRW5kKSB7Ci0JCXN1cGVyKHNvdXJjZSk7Ci0JCWZUZXh0U2VsZWN0aW9uU3RhcnQgPSB0ZXh0U2VsZWN0aW9uU3RhcnQ7Ci0JCWZUZXh0U2VsZWN0aW9uRW5kID0gdGV4dFNlbGVjdGlvbkVuZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRTZWxlY3Rpb25FbmQoKSB7Ci0JCXJldHVybiBmVGV4dFNlbGVjdGlvbkVuZDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRTZWxlY3Rpb25TdGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0U2VsZWN0aW9uU3RhcnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL0NvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2YwZDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9jb250ZW50b3V0bGluZS9Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQ29udHJpYnV0aW9uSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5Qcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5lZGl0b3IuRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0vKioKLSAqIEJhc2ljIENvbmZpZ3VyYXRpb24gY2xhc3MgZm9yIE91dGxpbmUgUGFnZXMKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBBZGQgYSBjb2xsYXBzZSBhY3Rpb24gdG8gaGVscCB3aXRoIG5hdmlnYXRpb24uCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDb2xsYXBzZVRyZWVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCQlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXIgPSBudWxsOwotCi0JCXB1YmxpYyBDb2xsYXBzZVRyZWVBY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJCXN1cGVyKFNTRVVJTWVzc2FnZXMuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzAsIEFTX1BVU0hfQlVUVE9OKTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKENPTExBUFNFX0UpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoQ09MTEFQU0VfRCk7Ci0JCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQkJZlRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQlzdXBlci5ydW4oKTsKLQkJCWZUcmVlVmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUb2dnbGVzIHdoZXRoZXIgaW5jb21pbmcgc2VsZWN0aW9uIG5vdGlmaWNhdGlvbiBhZmZlY3RzIHVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUb2dnbGVMaW5rQWN0aW9uIGV4dGVuZHMgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb24gewotCQlwdWJsaWMgVG9nZ2xlTGlua0FjdGlvbihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZSkgewotCQkJc3VwZXIoU1NFVUlNZXNzYWdlcy5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb25fMSwgc3RvcmUsIHByZWZlcmVuY2UsIHRydWUpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoU1lOQ0VEX0QpOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKFNZTkNFRF9FKTsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlKCkgewotCQkJc3VwZXIudXBkYXRlKCk7Ci0JCQlzZXRMaW5rV2l0aEVkaXRvcihpc0NoZWNrZWQoKSk7Ci0JCX0KLQl9Ci0KLQlJbWFnZURlc2NyaXB0b3IgQ09MTEFQU0VfRCA9IEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRExDTF9DT0xMQVBTRUFMTCk7Ci0JSW1hZ2VEZXNjcmlwdG9yIENPTExBUFNFX0UgPSBFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VMQ0xfQ09MTEFQU0VBTEwpOwotCi0JcHJpdmF0ZSBib29sZWFuIGZJc0xpbmtXaXRoRWRpdG9yID0gZmFsc2U7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyOwotCXByaXZhdGUgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBmTWVudUNvbnRyaWJ1dGlvbnMgPSBudWxsOwotCXByaXZhdGUgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBmVG9vbGJhckNvbnRyaWJ1dGlvbnMgPSBudWxsOwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9VVExJTkVfTElOS19QUkVGID0gIm91dGxpbmUtbGluay1lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0JSW1hZ2VEZXNjcmlwdG9yIFNZTkNFRF9EID0gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19ETENMX1NZTkNFRCk7Ci0JSW1hZ2VEZXNjcmlwdG9yIFNZTkNFRF9FID0gRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FTENMX1NZTkNFRCk7Ci0KLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotCSAqLwotCXB1YmxpYyBDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyB0aGUgY29udHJpYnV0aW9ucyBmb3IgdGhlIHZpZXcncyBsb2NhbCBtZW51LiBTdWJjbGFzc2VzIHNob3VsZAotCSAqIG1lcmdlIHRoZWlyIGNvbnRyaWJ1dGlvbnMgd2l0aCB0aGVzZS4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBtZW51IGNvbnRyaWJ1dGlvbnMKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjcmVhdGVNZW51Q29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlJQ29udHJpYnV0aW9uSXRlbSB0b2dnbGVMaW5rSXRlbSA9IG5ldyBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0obmV3IFRvZ2dsZUxpbmtBY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCksIE9VVExJTkVfTElOS19QUkVGKSk7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bXXt0b2dnbGVMaW5rSXRlbX07Ci0JCXJldHVybiBpdGVtczsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSB0b29sYmFyIGNvbnRyaWJ1dGlvbnMuIFN1YmNsYXNzZXMgc2hvdWxkIG1lcmdlIHRoZWlyCi0JICogY29udHJpYnV0aW9ucyB3aXRoIHRoZXNlLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRvb2xiYXIgY29udHJpYnV0aW9ucwotCSAqLwotCXByb3RlY3RlZCBJQ29udHJpYnV0aW9uSXRlbVtdIGNyZWF0ZVRvb2xiYXJDb250cmlidXRpb25zKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCUlDb250cmlidXRpb25JdGVtIGNvbGxhcHNlQWxsSXRlbSA9IG5ldyBBY3Rpb25Db250cmlidXRpb25JdGVtKG5ldyBDb2xsYXBzZVRyZWVBY3Rpb24odmlld2VyKSk7Ci0JCUlDb250cmlidXRpb25JdGVtW10gaXRlbXMgPSBuZXcgSUNvbnRyaWJ1dGlvbkl0ZW1bXXtjb2xsYXBzZUFsbEl0ZW19OwotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgQ29udGVudFByb3ZpZGVyIHRvIHVzZSB3aXRoIHRoZSBnaXZlbiB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIElDb250ZW50UHJvdmlkZXIgdG8gdXNlIHdpdGggdGhpcyB2aWV3ZXIKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgSUNvbnRlbnRQcm92aWRlciBnZXRDb250ZW50UHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpOwotCi0JLyoqCi0JICogUmV0dXJucyBhbiBhcnJheSBvZiBLZXlMaXN0ZW5lcnMgdG8gYXR0YWNoIHRvIHRoZSBnaXZlbiB2aWV3ZXIncwotCSAqIGNvbnRyb2wgb3IgbnVsbC4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiBhbiBhcnJheSBvZiBLZXlMaXN0ZW5lcnMgdG8gYXR0YWNoIHRvIHRoZSBUcmVlVmlld2VyJ3MgQ29udHJvbCwKLQkgKiAgICAgICAgIG9yIG51bGwuIFRoZSBsaXN0ZW5lcnMgc2hvdWxkIGFkaGVyZSB0byB0aGUgS2V5RXZlbnQuZG9pdCBmaWVsZAotCSAqICAgICAgICAgdG8gZW5zdXJlIHByb3BlciBiZWhhdmlvcnMuIE9yZGVyaW5nIG9mIHRoZSBldmVudCBub3RpZmljYXRpb25zCi0JICogICAgICAgICBpcyBkZXBlbmRlbnQgb24gdGhlIENvbnRyb2wgaW4gdGhlIFRyZWVWaWV3ZXIuCi0JICovCi0JcHVibGljIEtleUxpc3RlbmVyW10gZ2V0S2V5TGlzdGVuZXJzKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIExhYmVsUHJvdmlkZXIgZm9yIHRoZSBpdGVtcyB3aXRoaW4gdGhlIGdpdmVuIHZpZXdlci4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICogQHJldHVybiB0aGUgSUxhYmVsUHJvdmlkZXIgZm9yIGl0ZW1zIHdpdGhpbiB0aGUgdmlld2VyCi0JICovCi0JcHVibGljIElMYWJlbFByb3ZpZGVyIGdldExhYmVsUHJvdmlkZXIoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZMYWJlbFByb3ZpZGVyID09IG51bGwpCi0JCQlmTGFiZWxQcm92aWRlciA9IG5ldyBMYWJlbFByb3ZpZGVyKCk7Ci0JCXJldHVybiBmTGFiZWxQcm92aWRlcjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZW51IGNvbnRyaWJ1dGlvbiBpdGVtcyBmb3IgdGhlIGxvY2FsIG1lbnUgaW4gdGhlIG91dGxpbmUuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gSUNvbnRyaWJ1dGlvbkl0ZW1bXSBmb3IgdGhlIGxvY2FsIG1lbnUKLQkgKi8KLQlwdWJsaWMgZmluYWwgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBnZXRNZW51Q29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZk1lbnVDb250cmlidXRpb25zID09IG51bGwpIHsKLQkJCWZNZW51Q29udHJpYnV0aW9ucyA9IGNyZWF0ZU1lbnVDb250cmlidXRpb25zKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIGZNZW51Q29udHJpYnV0aW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBtZW51IGxpc3RlbmVyIHRvIG5vdGlmeSB3aGVuIHRoZSBnaXZlbiB2aWV3ZXIncyBjb250ZXh0Ci0JICogbWVudSBpcyBhYm91dCB0byBiZSBzaG93biBvciBudWxsLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRoZSBJTWVudUxpc3RlbmVyIHRvIG5vdGlmeSB3aGVuIHRoZSB2aWV3ZXIncyBjb250ZXh0IG1lbnUgaXMKLQkgKiAgICAgICAgIGFib3V0IHRvIGJlIHNob3duLCBvciBudWxsCi0JICovCi0JcHVibGljIElNZW51TGlzdGVuZXIgZ2V0TWVudUxpc3RlbmVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIFByZWZlcmVuY2VTdG9yZSB0byB1c2UgZm9yIHRoaXMgY29uZmlndXJhdGlvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBwcmVmZXJlbmNlIHN0b3JlIGluIHdoaWNoIHRvIHJlbWVtYmVyIHByZWZlcmVuY2VzIChzdWNoIGFzCi0JICogICAgICAgICB0aGUgbGluay13aXRoLWVkaXRvciB0b2dnbGUgc3RhdGUpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gU1NFVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSAoZmlsdGVyZWQpIHNlbGVjdGlvbiBmcm9tIHRoZSBnaXZlbiBzZWxlY3Rpb24uCi0JICogCi0JICogQHBhcmFtIHNlbGVjdGlvbgotCSAqICAgICAgICAgICAgbW9kZWwgc2VsZWN0aW9uCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gVGhlIChmaWx0ZXJlZCkgc2VsZWN0aW9uIGZyb20gdGhpcyBldmVudC4gVXNlcyBpbmNsdWRlIG1hcHBpbmcKLQkgKiAgICAgICAgIG1vZGVsIHNlbGVjdGlvbiBvbnRvIGVsZW1lbnRzIHByb3ZpZGVkIGJ5IHRoZSBjb250ZW50IHByb3ZpZGVyLgotCSAqICAgICAgICAgU2hvdWxkIG9ubHkgcmV0dXJuIGVsZW1lbnRzIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgVHJlZQotCSAqICAgICAgICAgQ29udHJvbC4KLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXJldHVybiBzZWxlY3Rpb247Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBjb250cmlidXRpb24gaXRlbXMgZm9yIHRoZSBsb2NhbCB0b29sYmFyIGluIHRoZSBvdXRsaW5lLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIElDb250cmlidXRpb25JdGVtW10gZm9yIHRoZSBsb2NhbCB0b29sYmFyCi0JICovCi0JcHVibGljIGZpbmFsIElDb250cmlidXRpb25JdGVtW10gZ2V0VG9vbGJhckNvbnRyaWJ1dGlvbnMoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZUb29sYmFyQ29udHJpYnV0aW9ucyA9PSBudWxsKSB7Ci0JCQlmVG9vbGJhckNvbnRyaWJ1dGlvbnMgPSBjcmVhdGVUb29sYmFyQ29udHJpYnV0aW9ucyh2aWV3ZXIpOwotCQl9Ci0JCXJldHVybiBmVG9vbGJhckNvbnRyaWJ1dGlvbnM7Ci0JfQotCi0JLyoqCi0JICogQWRvcHRlZCBzaW5jZSB5b3UgY2FuJ3QgZWFzaWx5IHJlbW92ZURyYWdTdXBwb3J0IGZyb20KLQkgKiBTdHJ1Y3R1cmVkVmlld2Vycy4KLQkgKiAKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYW4gYXJyYXkgb2YgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJzKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlyZXR1cm4gbmV3IFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyWzBdOwotCX0KLQotCS8qKgotCSAqIEFkb3B0ZWQgc2luY2UgeW91IGNhbid0IGVhc2lseSByZW1vdmVEcm9wU3VwcG9ydCBmcm9tCi0JICogU3RydWN0dXJlZFZpZXdlcnMuCi0JICogCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIGFuIGFycmF5IG9mIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycwotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJcmV0dXJuIG5ldyBUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lclswXTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgbm9kZSBzZWxlY3Rpb24gY2hhbmdlcyBhZmZlY3Qgc2VsZWN0aW9uIGluIHRoZQotCSAqIFRyZWVWaWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHRyZWVWaWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSBUcmVlVmlld2VyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbmZpZ3VyYXRpb24KLQkgKiBAcmV0dXJuIHRydWUgaWYgb3V0bGluZSBpcyBjdXJyZW50bHkgbGlua2VkIHRvIHNlbGVjdGlvbiBpbiBlZGl0b3IsCi0JICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xpbmtlZFdpdGhFZGl0b3IoVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXJldHVybiBmSXNMaW5rV2l0aEVkaXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHdoZXRoZXIgb3Igbm90IG91dGxpbmUgdmlldyBzaG91bGQgYmUgbGlua2VkIHdpdGggc2VsZWN0aW9uIGluCi0JICogZWRpdG9yLgotCSAqIAotCSAqIEBwYXJhbSBpc0xpbmtXaXRoRWRpdG9yCi0JICogICAgICAgICAgICBUaGUgaXNMaW5rV2l0aEVkaXRvciB0byBzZXQuCi0JICovCi0Jdm9pZCBzZXRMaW5rV2l0aEVkaXRvcihib29sZWFuIGlzTGlua1dpdGhFZGl0b3IpIHsKLQkJZklzTGlua1dpdGhFZGl0b3IgPSBpc0xpbmtXaXRoRWRpdG9yOwotCX0KLQotCS8qKgotCSAqIEdlbmVyYWwgaG9vayBmb3IgcmVzb3VyY2UgcmVsZWFzaW5nIGFuZCBsaXN0ZW5lciByZW1vdmFsIHdoZW4KLQkgKiBjb25maWd1cmF0aW9ucyBjaGFuZ2Ugb3IgdGhlIHZpZXdlciBpcyBkaXNwb3NlZCBvZi4gVGhpcyBpbXBsZW1lbnRhdGlvbgotCSAqIHN0b3BzIG9mIGFueSByZW1haW5pbmcgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtIGZyb20KLQkgKiBwcmVmZXJlbmNlIGxpc3RlbmluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgVHJlZVZpZXdlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoVHJlZVZpZXdlciB2aWV3ZXIpIHsKLQkJaWYgKGZUb29sYmFyQ29udHJpYnV0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZUb29sYmFyQ29udHJpYnV0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmVG9vbGJhckNvbnRyaWJ1dGlvbnNbaV0gaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJKChQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGZUb29sYmFyQ29udHJpYnV0aW9uc1tpXSkuZGlzY29ubmVjdCgpOwotCQkJCX0KLQkJCX0KLQkJCWZUb29sYmFyQ29udHJpYnV0aW9ucyA9IG51bGw7Ci0JCX0KLQkJaWYgKGZNZW51Q29udHJpYnV0aW9ucyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZNZW51Q29udHJpYnV0aW9ucy5sZW5ndGg7IGkrKykgewotCQkJCWlmIChmTWVudUNvbnRyaWJ1dGlvbnNbaV0gaW5zdGFuY2VvZiBQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIHsKLQkJCQkJKChQcm9wZXJ0eUNoYW5nZVVwZGF0ZUFjdGlvbkNvbnRyaWJ1dGlvbkl0ZW0pIGZNZW51Q29udHJpYnV0aW9uc1tpXSkuZGlzY29ubmVjdCgpOwotCQkJCX0KLQkJCX0KLQkJCWZNZW51Q29udHJpYnV0aW9ucyA9IG51bGw7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC5zc2UudWkvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdWkvdmlld3MvcHJvcGVydGllcy9JUHJvcGVydHlTb3VyY2VFeHRlbnNpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzRlZWU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL0lQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLS8qKgotICogRGVjbGFyZXMgdGhhdCB0aGlzIElQcm9wZXJ0eVNvdXJjZSBtaWdodCBzdXBwb3J0IG91dHJpZ2h0IHJlbW92YWwgb2YgYQotICogcHJvcGVydHkKLSAqIAotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbiB7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IG1hdGNoaW5nIHRoZSBnaXZlbiBuYW1lIGNhbiBiZSByZW1vdmVkLAotCSAqIGZhbHNlIG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5Ci0JICogQHJldHVybiB3aGV0aGVyIHRoZSBwcm9wZXJ0eSBtYXRjaGluZyB0aGlzIG5hbWUgY2FuIGJlIHJlbW92ZWQKLQkgKi8KLQlib29sZWFuIGlzUHJvcGVydHlSZW1vdmFibGUoT2JqZWN0IG5hbWUpOwotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gZGlzcGxheWVkIG5hbWUuIElmIG5vIHN1Y2ggcHJvcGVydHkKLQkgKiBleGlzdHMsIG5vdGhpbmcgaXMgZG9uZS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgdGhlIGRpc3BsYXllZCBuYW1lIG9mIHRoZSBwcm9wZXJ0eQotCSAqLwotCXZvaWQgcmVtb3ZlUHJvcGVydHkoT2JqZWN0IG5hbWUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91aS92aWV3cy9wcm9wZXJ0aWVzL1Byb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4OWUzOGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VpL3ZpZXdzL3Byb3BlcnRpZXMvUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklTdGF0dXNMaW5lTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSVRvb2xCYXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyOwotCi0KLS8qKgotICogQ29uZmlndXJhdGlvbiBjbGFzcyBmb3IgUHJvcGVydHkgU2hlZXQgUGFnZXMuIE5vdCBmaW5hbGl6ZWQuCi0gKiAKLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIHsKLQkvKioKLQkgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uKCkgewotCQkvLyBNdXN0IGhhdmUgZW1wdHkgY29uc3RydWN0b3IgdG8gY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbgotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgY29udHJpYnV0aW9uIG1lbnUgaXRlbXMgdG8gdGhlIGdpdmVuIG1lbnVNYW5hZ2VyLCB0b29sYmFyTWFuYWdlciwKLQkgKiBzdGF0dXNMaW5lTWFuYWdlci4KLQkgKiAKLQkgKiBAcGFyYW0gbWVudU1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbCBtZW51IG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICogQHBhcmFtIHRvb2xCYXJNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgbG9jYWwgdG9vbGJhciBtYW5hZ2VyIG9mIHRoZSBwcm9wZXJ0eSBzaGVldAotCSAqIEBwYXJhbSBzdGF0dXNMaW5lTWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIHN0YXR1cyBsaW5lIG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICovCi0JcHVibGljIHZvaWQgYWRkQ29udHJpYnV0aW9ucyhJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlciwgSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBbGxvd3MgZm9yIGZpbHRlcmF0aW9uIG9mIHNlbGVjdGlvbiBiZWZvcmUgYmVpbmcgc2VudCB0byB0aGUgdmlld2VyLgotCSAqIAotCSAqIEBwYXJhbSBzZWxlY3RpbmdQYXJ0Ci0JICogICAgICAgICAgICBtYXkgYmUgbnVsbAotCSAqIEBwYXJhbSBzZWxlY3Rpb24KLQkgKiAgICAgICAgICAgIG1vZGVsIHNlbGVjdGlvbgotCSAqIEByZXR1cm4gdGhlIChmaWx0ZXJlZCkgc2VsZWN0aW9uIHRvIGJlIHNlbnQgdG8gdGhlIHZpZXdlcgotCSAqLwotCXB1YmxpYyBJU2VsZWN0aW9uIGdldElucHV0U2VsZWN0aW9uKElXb3JrYmVuY2hQYXJ0IHNlbGVjdGluZ1BhcnQsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTZWxlY3Rpb24gcHJlZmVycmVkU2VsZWN0aW9uID0gc2VsZWN0aW9uOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCS8vIGRvbid0IHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBzZWxlY3RlZCBub2RlCi0JCQlpZiAoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5zaXplKCkgPiAxKQotCQkJCXByZWZlcnJlZFNlbGVjdGlvbiA9IFN0cnVjdHVyZWRTZWxlY3Rpb24uRU1QVFk7Ci0JCX0KLQkJcmV0dXJuIHByZWZlcnJlZFNlbGVjdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb3JyZWN0IElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyLgotCSAqIAotCSAqIEBwYXJhbSBwYWdlCi0JICogICAgICAgICAgICB0aGUgcGFnZSB0byBiZSBjb25maWd1cmVkIGJ5IHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gdGhlIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIGZvciB0aGUgZ2l2ZW4gcGFnZQotCSAqLwotCXB1YmxpYyBhYnN0cmFjdCBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBnZXRQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyKElQcm9wZXJ0eVNoZWV0UGFnZSBwYWdlKTsKLQotCS8qKgotCSAqIFJlbW92ZXMgY29udHJpYnV0aW9uIG1lbnUgaXRlbXMgZnJvbSB0aGUgZ2l2ZW4gbWVudU1hbmFnZXIsCi0JICogdG9vbGJhck1hbmFnZXIsIHN0YXR1c0xpbmVNYW5hZ2VyLgotCSAqIAotCSAqIEBwYXJhbSBtZW51TWFuYWdlcgotCSAqICAgICAgICAgICAgdGhlIGxvY2FsIG1lbnUgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKiBAcGFyYW0gdG9vbEJhck1hbmFnZXIKLQkgKiAgICAgICAgICAgIHRoZSBsb2NhbCB0b29sYmFyIG1hbmFnZXIgb2YgdGhlIHByb3BlcnR5IHNoZWV0Ci0JICogQHBhcmFtIHN0YXR1c0xpbmVNYW5hZ2VyCi0JICogICAgICAgICAgICB0aGUgc3RhdHVzIGxpbmUgbWFuYWdlciBvZiB0aGUgcHJvcGVydHkgc2hlZXQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDb250cmlidXRpb25zKElNZW51TWFuYWdlciBtZW51TWFuYWdlciwgSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyLCBJU3RhdHVzTGluZU1hbmFnZXIgc3RhdHVzTGluZU1hbmFnZXIpIHsKLQkJLy8gZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIEdlbmVyYWwgaG9vayBmb3IgcmVzb3VyY2UgcmVsZWFzaW5nIGFuZCBsaXN0ZW5lciByZW1vdmFsIHdoZW4KLQkgKiBjb25maWd1cmF0aW9ucyBjaGFuZ2UuCi0JICovCi0JcHVibGljIHZvaWQgdW5jb25maWd1cmUoKSB7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Rlc3RUb2MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3Rlc3RUb2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTQyYjkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS90ZXN0VG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MKLQlsYWJlbD0iVGVzdCBUT0MiCi0JdG9waWM9Imh0bWwvdG9jLmh0bWwiPgotCTxsaW5rIHRvYz0idG9jLnhtbCIgLz4KLTwvdG9jPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS90b2MueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzBiYjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpL3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iU2FtcGxlIFRhYmxlIG9mIENvbnRlbnRzIj4KLQk8dG9waWMKLQkJbGFiZWw9Ik1haW4gVG9waWMiCi0JCWhyZWY9Imh0bWwvbWFpbnRvcGljLmh0bWwiPgotCQk8dG9waWMKLQkJCWxhYmVsPSJTdWIgVG9waWMiCi0JCQlocmVmPSJodG1sL3N1YnRvcGljLmh0bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9Ik1haW4gVG9waWMgMiIgLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jbGFzc3BhdGgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2RjYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmNsYXNzcGF0aAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Y2xhc3NwYXRoPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMtY29udGVudG1vZGVsIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjLXNlYXJjaCIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYy12YWxpZGF0aW9uIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjLWNhdGFsb2ciIGtpbmQ9InNyYyIvPgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJzcmMtZW1mTW9kZWxTeW5jaCIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLmpkdC5sYXVuY2hpbmcuSlJFX0NPTlRBSU5FUiIga2luZD0iY29uIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9Im9yZy5lY2xpcHNlLnBkZS5jb3JlLnJlcXVpcmVkUGx1Z2lucyIga2luZD0iY29uIj4KLQkJPGFjY2Vzc3J1bGVzPgotCQkJPGFjY2Vzc3J1bGUga2luZD0iYWNjZXNzaWJsZSIgcGF0dGVybj0ib3JnL2VjbGlwc2Uvd3N0LyoqIi8+Ci0JCTwvYWNjZXNzcnVsZXM+Ci0JPC9jbGFzc3BhdGhlbnRyeT4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0iYmluIiBraW5kPSJvdXRwdXQiLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3M2Y4YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDggKzAsMCBAQAotYmluCi10ZW1wLmZvbGRlcgotYnVpbGQueG1sCi14bWxtb2RlbC5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZV8xLjAuMC5qYXIKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MGRmODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLm9wdGlvbnMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC54bWwuY29yZS9kZWJ1Zz10cnVlCi1vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvZGVidWcvdHJhY2VmaWx0ZXI9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDE3NTE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWM1NzUwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmM0MzBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgQXVnIDE5IDE2OjMxOjQzIEVEVCAyMDA2DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTDEwTmFtZXMuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2U2NWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0lJQotCi0ldGFibGUKLSVwdWJsaWMKLSVmaW5hbAotJWNsYXNzIFhNTDEwTmFtZXMKLSVmdW5jdGlvbiBpc1ZhbGlkWE1MMTBOYW1lCi0ldHlwZSBib29sZWFuCi0ldW5pY29kZQotJWlnbm9yZWNhc2UKLSVidWZmZXIgMjA0OAotJWFwaXByaXZhdGUKLQotUyA9IChceDIwIHwgXHgwOSB8IFx4MEQgfCBceDBBKQotCi1CYXNlQ2hhciA9IFtcdTAwNDEtXHUwMDVBXHUwMDYxLVx1MDA3QVx1MDBDMC1cdTAwRDZcdTAwRDgtXHUwMEY2XHUwMEY4LVx1MDBGRlx1MDEwMC1cdTAxMzFcdTAxMzQtXHUwMTNFXHUwMTQxLVx1MDE0OFx1MDE0QS1cdTAxN0VcdTAxODAtXHUwMUMzXHUwMUNELVx1MDFGMFx1MDFGNC1cdTAxRjVcdTAxRkEtXHUwMjE3XHUwMjUwLVx1MDJBOFx1MDJCQi1cdTAyQzFcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzQ0VcdTAzRDAtXHUwM0Q2XHUwM0RBXHUwM0RDXHUwM0RFXHUwM0UwXHUwM0UyLVx1MDNGM1x1MDQwMS1cdTA0MENcdTA0MEUtXHUwNDRGXHUwNDUxLVx1MDQ1Q1x1MDQ1RS1cdTA0ODFcdTA0OTAtXHUwNEM0XHUwNEM3LVx1MDRDOFx1MDRDQi1cdTA0Q0NcdTA0RDAtXHUwNEVCXHUwNEVFLVx1MDRGNVx1MDRGOC1cdTA0RjlcdTA1MzEtXHUwNTU2XHUwNTU5XHUwNTYxLVx1MDU4Nlx1MDVEMC1cdTA1RUFcdTA1RjAtXHUwNUYyXHUwNjIxLVx1MDYzQVx1MDY0MS1cdTA2NEFcdTA2NzEtXHUwNkI3XHUwNkJBLVx1MDZCRVx1MDZDMC1cdTA2Q0VcdTA2RDAtXHUwNkQzXHUwNkQ1XHUwNkU1LVx1MDZFNlx1MDkwNS1cdTA5MzlcdTA5M0RcdTA5NTgtXHUwOTYxXHUwOTg1LVx1MDk4Q1x1MDk4Ri1cdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5REMtXHUwOUREXHUwOURGLVx1MDlFMVx1MDlGMC1cdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGLVx1MEExMFx1MEExMy1cdTBBMjhcdTBBMkEtXHUwQTMwXHUwQTMyLVx1MEEzM1x1MEEzNS1cdTBBMzZcdTBBMzgtXHUwQTM5XHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE3Mi1cdTBBNzRcdTBBODUtXHUwQThCXHUwQThEXHUwQThGLVx1MEE5MVx1MEE5My1cdTBBQThcdTBBQUEtXHUwQUIwXHUwQUIyLVx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkRcdTBBRTBcdTBCMDUtXHUwQjBDXHUwQjBGLVx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyLVx1MEIzM1x1MEIzNi1cdTBCMzlcdTBCM0RcdTBCNUMtXHUwQjVEXHUwQjVGLVx1MEI2MVx1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OS1cdTBCOUFcdTBCOUNcdTBCOUUtXHUwQjlGXHUwQkEzLVx1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI1XHUwQkI3LVx1MEJCOVx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzNcdTBDMzUtXHUwQzM5XHUwQzYwLVx1MEM2MVx1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0RFXHUwQ0UwLVx1MENFMVx1MEQwNS1cdTBEMENcdTBEMEUtXHUwRDEwXHUwRDEyLVx1MEQyOFx1MEQyQS1cdTBEMzlcdTBENjAtXHUwRDYxXHUwRTAxLVx1MEUyRVx1MEUzMFx1MEUzMi1cdTBFMzNcdTBFNDAtXHUwRTQ1XHUwRTgxLVx1MEU4Mlx1MEU4NFx1MEU4Ny1cdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUEtXHUwRUFCXHUwRUFELVx1MEVBRVx1MEVCMFx1MEVCMi1cdTBFQjNcdTBFQkRcdTBFQzAtXHUwRUM0XHUwRjQwLVx1MEY0N1x1MEY0OS1cdTBGNjlcdTEwQTAtXHUxMEM1XHUxMEQwLVx1MTBGNlx1MTEwMFx1MTEwMi1cdTExMDNcdTExMDUtXHUxMTA3XHUxMTA5XHUxMTBCLVx1MTEwQ1x1MTEwRS1cdTExMTJcdTExM0NcdTExM0VcdTExNDBcdTExNENcdTExNEVcdTExNTBcdTExNTQtXHUxMTU1XHUxMTU5XHUxMTVGLVx1MTE2MVx1MTE2M1x1MTE2NVx1MTE2N1x1MTE2OVx1MTE2RC1cdTExNkVcdTExNzItXHUxMTczXHUxMTc1XHUxMTlFXHUxMUE4XHUxMUFCXHUxMUFFLVx1MTFBRlx1MTFCNy1cdTExQjhcdTExQkFcdTExQkMtXHUxMUMyXHUxMUVCXHUxMUYwXHUxMUY5XHUxRTAwLVx1MUU5Qlx1MUVBMC1cdTFFRjlcdTFGMDAtXHUxRjE1XHUxRjE4LVx1MUYxRFx1MUYyMC1cdTFGNDVcdTFGNDgtXHUxRjREXHUxRjUwLVx1MUY1N1x1MUY1OVx1MUY1Qlx1MUY1RFx1MUY1Ri1cdTFGN0RcdTFGODAtXHUxRkI0XHUxRkI2LVx1MUZCQ1x1MUZCRVx1MUZDMi1cdTFGQzRcdTFGQzYtXHUxRkNDXHUxRkQwLVx1MUZEM1x1MUZENi1cdTFGREJcdTFGRTAtXHUxRkVDXHUxRkYyLVx1MUZGNFx1MUZGNi1cdTFGRkNcdTIxMjZcdTIxMkEtXHUyMTJCXHUyMTJFXHUyMTgwLVx1MjE4Mlx1MzA0MS1cdTMwOTRcdTMwQTEtXHUzMEZBXHUzMTA1LVx1MzEyQ1x1QUMwMC1cdUQ3QTNdCi0KLUlkZW9ncmFwaGljID0gW1x1NEUwMC1cdTlGQTVcdTMwMDdcdTMwMjEtXHUzMDI5XQotCi1Db21iaW5pbmdDaGFyID0gW1x1MDMwMC1cdTAzNDVcdTAzNjAtXHUwMzYxXHUwNDgzLVx1MDQ4Nlx1MDU5MS1cdTA1QTFcdTA1QTMtXHUwNUI5XHUwNUJCLVx1MDVCRFx1MDVCRlx1MDVDMS1cdTA1QzJcdTA1QzRcdTA2NEItXHUwNjUyXHUwNjcwXHUwNkQ2LVx1MDZEQ1x1MDZERC1cdTA2REZcdTA2RTAtXHUwNkU0XHUwNkU3LVx1MDZFOFx1MDZFQS1cdTA2RURcdTA5MDEtXHUwOTAzXHUwOTNDXHUwOTNFLVx1MDk0Q1x1MDk0RFx1MDk1MS1cdTA5NTRcdTA5NjItXHUwOTYzXHUwOTgxLVx1MDk4M1x1MDlCQ1x1MDlCRVx1MDlCRlx1MDlDMC1cdTA5QzRcdTA5QzctXHUwOUM4XHUwOUNCLVx1MDlDRFx1MDlEN1x1MDlFMi1cdTA5RTNcdTBBMDJcdTBBM0NcdTBBM0VcdTBBM0ZcdTBBNDAtXHUwQTQyXHUwQTQ3LVx1MEE0OFx1MEE0Qi1cdTBBNERcdTBBNzAtXHUwQTcxXHUwQTgxLVx1MEE4M1x1MEFCQ1x1MEFCRS1cdTBBQzVcdTBBQzctXHUwQUM5XHUwQUNCLVx1MEFDRFx1MEIwMS1cdTBCMDNcdTBCM0NcdTBCM0UtXHUwQjQzXHUwQjQ3LVx1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTYtXHUwQjU3XHUwQjgyLVx1MEI4M1x1MEJCRS1cdTBCQzJcdTBCQzYtXHUwQkM4XHUwQkNBLVx1MEJDRFx1MEJEN1x1MEMwMS1cdTBDMDNcdTBDM0UtXHUwQzQ0XHUwQzQ2LVx1MEM0OFx1MEM0QS1cdTBDNERcdTBDNTUtXHUwQzU2XHUwQzgyLVx1MEM4M1x1MENCRS1cdTBDQzRcdTBDQzYtXHUwQ0M4XHUwQ0NBLVx1MENDRFx1MENENS1cdTBDRDZcdTBEMDItXHUwRDAzXHUwRDNFLVx1MEQ0M1x1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDREXHUwRDU3XHUwRTMxXHUwRTM0LVx1MEUzQVx1MEU0Ny1cdTBFNEVcdTBFQjFcdTBFQjQtXHUwRUI5XHUwRUJCLVx1MEVCQ1x1MEVDOC1cdTBFQ0RcdTBGMTgtXHUwRjE5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFXHUwRjNGXHUwRjcxLVx1MEY4NFx1MEY4Ni1cdTBGOEJcdTBGOTAtXHUwRjk1XHUwRjk3XHUwRjk5LVx1MEZBRFx1MEZCMS1cdTBGQjdcdTBGQjlcdTIwRDAtXHUyMERDXHUyMEUxXHUzMDJBLVx1MzAyRlx1MzA5OVx1MzA5QV0KLQotRGlnaXQgPSAgW1x1MDAzMC1cdTAwMzlcdTA2NjAtXHUwNjY5XHUwNkYwLVx1MDZGOVx1MDk2Ni1cdTA5NkZcdTA5RTYtXHUwOUVGXHUwQTY2LVx1MEE2Rlx1MEFFNi1cdTBBRUZcdTBCNjYtXHUwQjZGXHUwQkU3LVx1MEJFRlx1MEM2Ni1cdTBDNkZcdTBDRTYtXHUwQ0VGXHUwRDY2LVx1MEQ2Rlx1MEU1MC1cdTBFNTlcdTBFRDAtXHUwRUQ5XHUwRjIwLVx1MEYyOV0KLQotRXh0ZW5kZXIgPSBbXHUwMEI3XHUwMkQwXHUwMkQxXHUwMzg3XHUwNjQwXHUwRTQ2XHUwRUM2XHUzMDA1XHUzMDMxLVx1MzAzNVx1MzA5RC1cdTMwOUVcdTMwRkMtXHUzMEZFXQotCi1MZXR0ZXIgPSAoe0Jhc2VDaGFyfSB8IHtJZGVvZ3JhcGhpY30pCi0KLU5hbWVDaGFyID0gKHtMZXR0ZXJ9IHwge0RpZ2l0fSB8IC4gfCAtIHwgXyB8IDogfCB7Q29tYmluaW5nQ2hhcn0gfCB7RXh0ZW5kZXJ9KQotCi1OYW1lID0gKHtMZXR0ZXJ9IHwgXyB8IDogKSAoe05hbWVDaGFyfSkqCi0KLQotCi0lewotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICovCi0JcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0JCXRoaXMuenpSZWFkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotCQl9Ci0JCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotCQkJLy8gIm5vdCIKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0lfQotCi0KLQotCi0lJQotCi08WVlJTklUSUFMPgotewotCi0JLy8gZG9uJ3QgbWF0Y2ggaWYgY29udGFpbnMgdHJhaWxpbmcgb3IgZW1iZWRkZWQgc3BhY2UKLQl7TmFtZX0ge1N9KyAgICAgICAgIHtyZXR1cm4gZmFsc2U7fQotCXtOYW1lfSB7U30rIHtOYW1lfSAge3JldHVybiBmYWxzZTt9Ci0KLQl7TmFtZX0gICAgICAgICAgICAgIHtyZXR1cm4gdHJ1ZTt9Ci0KLQkvLyBtYXRjaCBhbnl0aGluZyBzaG91bGQgY29tZSBsYXN0Ci0JLiAgICAgICAgICAgICAgICAgICB7cmV0dXJuIGZhbHNlO30KLQotfQotCi0KLS8vIHRoaXMgcnVsZSBhbHdheXMgaW4gZWZmZWN0Ci08PEVPRj4+Ci17Ci0Je3JldHVybiBmYWxzZTt9Ci19Ci0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L0hlYWRQYXJzZXJzL1hNTEhlYWRUb2tlbml6ZXIuakZsZXgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNTBhMzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleAorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKm5sc1hYWCovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLkVuY29kaW5nUGFyc2VyQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5YTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzOwotCi0KLSUlCi0KLSV7Ci0KLQotCXByaXZhdGUgYm9vbGVhbiBoYXNNb3JlID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgTUFYX1RPX1NDQU4gPSA4MDAwOwotCVN0cmluZ0J1ZmZlciBzdHJpbmcgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JLy8gc3RhdGUgc3RhY2sgZm9yIGVhc2llciBzdGF0ZSBoYW5kbGluZwotCXByaXZhdGUgSW50U3RhY2sgZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQlwcml2YXRlIFN0cmluZyB2YWx1ZVRleHQgPSBudWxsOwotCi0KLQlwdWJsaWMgWE1MSGVhZFRva2VuaXplcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkgIHB1YmxpYyB2b2lkIHJlc2V0IChSZWFkZXIgaW4pIHsKLSAgICAgICAgICAgICAgICAvKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gICAgICAgICAgICAgICAgenpSZWFkZXIgPSBpbjsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgICAgICAgICAgICAgICB6elN0YXRlID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAgICAgICAgICAgICAgIC8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLSAgICAgICAgICAgICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gICAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5maWxsKHp6QnVmZmVyLCAoY2hhcikwKTsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gICAgICAgICAgICAgICAgenpNYXJrZWRQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBzdGF0ZSB0byBiZSBpbmNsdWRlZCBpbiB5eXRleHQgKi8KLSAgICAgICAgICAgICAgICB6elB1c2hiYWNrUG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6Q3VycmVudFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICB6elN0YXJ0UmVhZCA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAgICAgKiBlbmRSZWFkIG1hcmtzIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgYnVmZmVyLCB0aGF0IGhhcyBiZWVuIHJlYWQKLSAgICAgICAgICAgICAgICAgKiBmcm9tIGlucHV0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgenpFbmRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICAgICAgICAgICAgICAgIHl5bGluZSA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgICAgICAgICAgICAgICB5eWNoYXIgPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQKLSAgICAgICAgICAgICAgICAgKiBvZiB0aGUgbWF0Y2hlZCB0ZXh0Ci0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsKLQotCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwotICAJCQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotJX0KLQotJWVvZnsKLQloYXNNb3JlPWZhbHNlOwotJWVvZn0KLQotJXB1YmxpYwotJWNsYXNzIFhNTEhlYWRUb2tlbml6ZXIKLSVmdW5jdGlvbiBwcmltR2V0TmV4dFRva2VuCi0ldHlwZSBTdHJpbmcKLSVjaGFyCi0ldW5pY29kZQotJWlnbm9yZWNhc2UgCi0vLyVkZWJ1ZwotJXN3aXRjaAotJWJ1ZmZlciA4MTkyCi0KLVVURjE2QkUgPSBceEZFXHhGRgotVVRGMTZMRSA9IFx4RkZceEZFCi1VVEY4M0J5dGVCT00gPSBceEVGXHhCQlx4QkYKLQotLy9TcGFjZUNoYXIgPSBbXHgyMFx4MDldCi0KLS8vIFszXSBTIDo6PSAoMHgyMCB8IDB4OSB8IDB4RCB8IDB4QSkrCi1TID0gW1x4MjBceDA5XHgwRFx4MEFdCi0KLUJlZ2luQXR0cmliZVZhbHVlID0ge1N9KiBcPSB7U30qCi0KLUxpbmVUZXJtaW5hdG9yID0gXHJ8XG4KLQotCi0lc3RhdGUgU1RfWE1MRGVjbAotJXN0YXRlIFF1b3RlZEF0dHJpYnV0ZVZhbHVlCi0lc3RhdGUgRFFfU1RSSU5HCi0lc3RhdGUgU1FfU1RSSU5HCi0lc3RhdGUgVW5EZWxpbWl0ZWRTdHJpbmcKLQotJSUKLQotCi08WVlJTklUSUFMPiAgCi17Ci0JLy8gZm9yY2UgdG8gc3RhcnQgYXQgYmVnaW5uaW5nIG9mIGxpbmUgKF4pIGFuZCBhdCBiZWdpbm5pbmcgb2YgZmlsZSAoeXljaGFyID09IDApCi0JXntVVEYxNkJFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkJFO319Ci0JXntVVEYxNkxFfSAgIAkJe2lmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO319Ci0JXntVVEY4M0J5dGVCT019ICAgCXtpZiAoeXljaGFyID09IDAgKSB7aGFzTW9yZSA9IGZhbHNlOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NO319Ci0JCi0JLy8gZm9yY2UgdG8gYmUgc3RhcnRlZCBvbiBmaXJzdCBsaW5lLCBidXQgd2UgZG8gYWxsb3cgcHJlY2VlZGluZyBzcGFjZXMKLQleIHtTfSogIjxcP3htbCIge1N9KyB7aWYgKHl5Y2hhciA9PSAwICkge3l5YmVnaW4oU1RfWE1MRGVjbCk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xTdGFydDt9fQotCQotfQkKLQkKLTxTVF9YTUxEZWNsPiAKLXsKLQkidmVyc2lvbiIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247fQotCSJlbmNvZGluZyIge0JlZ2luQXR0cmliZVZhbHVlfSB7cHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2Rpbmc7fQotCS8vIG5vdGUgdGhlICJmb3JjZWQgZW5kIiAodmlhICdoYXNNb3JlPWZhbHNlJykgb25jZSB0aGUgZW5kIG9mIFhNTCBEZWNsYXJhdGlvbiBmb3VuZAotCS8vIFRoaXMgaXMgc2luY2Ugbm9uLWFzY2lpIGNoYXJzIG1heSBmb2xsb3cgYW5kIG1heSBjYXVzZSBJT0V4Y2VwdGlvbnMgd2hpY2ggd291bGQgbm90IG9jY3VyIG9uY2Ugc3RyZWFtIGlzIAotCS8vIHJlYWQgd2l0aCBpbmNvcnJlY3QgZW5jb2RpbmcgKHN1Y2ggYXMgaWYgcGxhdGZvcm0gZW5jb2RpbmcgaXMgaW4gZWZmZWN0IHVudGlsIHRydWUgZW5jb2RpbmcgZGV0ZWN0ZWQpLiAKLQkiXD8+IiAgICB7eXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7fQotfQkKLQotCQotCi08UXVvdGVkQXR0cmlidXRlVmFsdWU+Ci17Ci0JXCIgICAgICAgICAgICAgICAgICAgICAgeyB5eWJlZ2luKERRX1NUUklORyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7IH0KLQlcJwkJCXsgeXliZWdpbihTUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOyB9Ci0JLy8gaW4gdGhpcyBzdGF0ZSwgYW55dGhpbmcgb3RoZXIgdGhhbiBhIHNwYWNlIGNoYXJhY3RlciBjYW4gc3RhcnQgYW4gdW5kZWxpbWl0ZWQgc3RyaW5nCi0Je1N9Ki4gICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTsgeXliZWdpbihVbkRlbGltaXRlZFN0cmluZyk7IHN0cmluZy5zZXRMZW5ndGgoMCk7fQotCi19CQotCi0KLTxEUV9TVFJJTkc+Ci17Ci0KLQlcIiAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpOyBwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxTUV9TVFJJTkc+Ci17Ci0KLQlcJyAgICAgICAgICAgICAgICAgICAgICB7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWU7fQotICAJe0xpbmVUZXJtaW5hdG9yfSAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JIiU+IgkJCXsgeXlwdXNoYmFjaygyKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSc8JwkJCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS4JCQl7IHN0cmluZy5hcHBlbmQoIHl5dGV4dCgpICk7IH0KLQotCi19Ci0KLTxVbkRlbGltaXRlZFN0cmluZz4KLXsKLQotCXtTfSAgICAgICAgICAgICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVuRGVsaW1pdGVkU3RyaW5nVmFsdWU7IH0KLSAgCXtMaW5lVGVybWluYXRvcn0gICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCSJcPz4iCQkJeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTt9Ci0JJzwnCQotCXsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7fQotCS8vIHRoZXNlIGFyZSBhIGJpdCBzcGVjaWFsLCBzaW5jZSB3ZSBzdGFydGVkIGFuIHVuZGVsaW1pdCBzdHJpbmcsIGJ1dCBmb3VuZCBhIHF1b3RlIC4uLiBwcm9iYWJseSBpbmRpY2F0ZXMgYSBtaXNzaW5nIGJlZ2lubmluZyBxdW90ZQotCVwnCQkJeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTt9Ci0JCi0JXCIJCQl7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5JbnZhbGlkVGVybWludGF0ZWRVbkRlbGltaXRlZFN0cmluZ1ZhbHVlO30KLQkKLQkuCQkJeyBzdHJpbmcuYXBwZW5kKCB5eXRleHQoKSApOyB9Ci0KLX0KLQotLy8gVGhlICJtYXRjaCBhbnl0aGluZyIgcnVsZSBzaG91bGQgYWx3YXlzIGJlIGluIGVmZmVjdCBleGNlcHQgZm9yIHdoZW4gbG9va2luZyBmb3IgZW5kIG9mIHN0cmluZwotLy8gKFRoYXQgaXMsIHJlbWVtYmVyIHRvIHVwZGF0ZSBzdGF0ZSBsaXN0IGlmL3doZW4gbmV3IHN0YXRlcyBhZGRlZCkKLTxZWUlOSVRJQUwsIFNUX1hNTERlY2wsIFF1b3RlZEF0dHJpYnV0ZVZhbHVlPgotewotLy8gdGhpcyBpcyB0aGUgZmFsbGJhY2sgKG1hdGNoICJhbnl0aGluZyIpIHJ1bGUgIChmb3IgdGhpcyBzY2FubmVyLCBpbnB1dCBpcyBpZ25vcmVkLCBhbmQgcG9zaXRpb24gYWR2YW5jZWQsIGlmIG5vdCByZWNvZ25pemVkKQotLnxcbiAgICAgICAgICAgICAge2lmICh5eWNoYXIgPiBNQVhfVE9fU0NBTikge2hhc01vcmU9ZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5NQVhfQ0hBUlNfUkVBQ0hFRDt9fQotfQotCi0vLyB0aGlzIHJ1bGUgYWx3YXlzIGluIGVmZmVjdAotPDxFT0Y+PiAgICAgICAgIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7fQotCi0JClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGROYW1lcy54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5NzU2My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9EZXZUaW1lU3VwcG9ydC9idWlsZE5hbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IlhNTDEwTmFtZXMiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUwxME5hbWVzLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IlhNTDEwTmFtZXMiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvYnVpbGRQYXJzZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYxOWRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL0RldlRpbWVTdXBwb3J0L2J1aWxkUGFyc2VyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCBuYW1lPSJ0b2tlbml6ZXIiIGRlZmF1bHQ9IkhlYWRUb2tlbml6ZXIiPgotCQotCTwhLS0gTm90ZTogZm9yIEVjbGlwc2UgZW52LiwgdGhlIEpGbGV4IDEuNCBqYXIgc2hvdWxkIGJlIGFkZGVkIAotCXRvIHRoZSBhbnQgZ2xvYmFsIGVudHJpZXMgIC0tPgotCTx0YXNrZGVmIGNsYXNzbmFtZT0iSkZsZXguYW50dGFzay5KRmxleFRhc2siIG5hbWU9ImpmbGV4IiAvPgotCQkKLQk8dGFyZ2V0IG5hbWU9ImluaXQiPgotCQk8cHJvcGVydHkgbmFtZT0ic3JjLmZpbGUiIHZhbHVlPSJYTUxIZWFkVG9rZW5pemVyLmpGbGV4Ii8+CQkJCi0JCTxwcm9wZXJ0eSBuYW1lPSJzcmMuZGlyIiB2YWx1ZT0iSGVhZFBhcnNlcnMiLz4KLQkJPHByb3BlcnR5IG5hbWU9ImRlc3QuZGlyIiB2YWx1ZT0iLi4vc3JjIi8+Ci0JCTwhLS0gdG91Y2ggY2F1c2VzIHRvIGFsd2F5cyBidWlsZCwgcmVtb3ZlIGZvciByZWFsICdtYWtlJyBiZWhhdmlvciAtLT4KLQkJPHRvdWNoIGZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iLz4KLQkJCQkJCi0JPC90YXJnZXQ+Ci0KLQk8dGFyZ2V0IG5hbWU9IkhlYWRUb2tlbml6ZXIiIGRlcGVuZHM9ImluaXQiPgotCQk8YW50Y2FsbCB0YXJnZXQ9InJ1bi1qZmxleCIvPgotCTwvdGFyZ2V0PgotCi0JPHRhcmdldCBuYW1lPSJydW4tamZsZXgiIGRlcGVuZHM9ImluaXQiPgotCQk8amZsZXgKLQkgICAgCWZpbGU9IiR7c3JjLmRpcn0vJHtzcmMuZmlsZX0iCi0JICAgIAlkZXN0ZGlyPSIke2Rlc3QuZGlyfSIKLQkJCXZlcmJvc2U9InRydWUiCi0JCQlub2Jhaz0idHJ1ZSIKLQkJCXRpbWU9Im9uIgotCSAgICAvPgotCTwvdGFyZ2V0PgotCQotCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJmNGZhMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMS4xMDEucXVhbGlmaWVyCi1CdW5kbGUtQWN0aXZhdG9yOiBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQ7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5pbXBsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3Rvcnk7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnk7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5O3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGU7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQ7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmc7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeTt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXM7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0ZTt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb247eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7eC1mcmllbmRzOj0iY29tLmlibS5ldG9vbHMuZW1mLmV2ZW50LG9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpLG9yZy5lY2xpcHNlLndzdC54bWwudWksb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLG9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTt4LWZyaWVuZHM6PSJjb20uaWJtLmV0b29scy5lbWYuZXZlbnQsb3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlLG9yZy5lY2xpcHNlLndzdC5kdGQudWksb3JnLmVjbGlwc2Uud3N0LnhtbC51aSxvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uO3gtZnJpZW5kczo9ImNvbS5pYm0uZXRvb2xzLmVtZi5ldmVudCxvcmcuZWNsaXBzZS53c3QuZHRkLmNvcmUsb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSxvcmcuZWNsaXBzZS53c3QueG1sLnVpLG9yZy5lY2xpcHNlLndzdC54c2QuY29yZSxvcmcuZWNsaXBzZS53c3QueHNkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dAotUmVxdWlyZS1CdW5kbGU6IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXI7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamVtLnV0aWw7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlsxLjIuMCwxLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS5lbWYuZWNvcmUuZWRpdDtyZXNvbHV0aW9uOj1vcHRpb25hbDtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5lbWY7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZS54bWk7cmVzb2x1dGlvbjo9b3B0aW9uYWw7YnVuZGxlLXZlcnNpb249IlsyLjIuMCwyLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5jb21tb24uZW1md29ya2JlbmNoLmludGVncmF0aW9uO3Jlc29sdXRpb246PW9wdGlvbmFsO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIGNvbS5pYm0uaWN1O2J1bmRsZS12ZXJzaW9uPSJbMy40LjQsNC4wLjApIiwKLSBvcmcuYXBhY2hlLnhlcmNlczt2aXNpYmlsaXR5Oj1yZWV4cG9ydDtidW5kbGUtdmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlOyBleGNlcHRpb25zPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUiCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9SRUFETUUudHh0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNjQ2Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVEhlIFhNTCBzcGVjaWZpYyBtb2RlbCBpbXBsZW1lbnRhdGlvbi4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9hYm91dC5odG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjY4YTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICAub3B0aW9ucyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIHNjaGVtYS8KLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zcmMuaW5jbHVkZXMgPSBjb21wb25lbnQueG1sLFwKLSAgICAgICAgICAgICAgIGJ1aWxkLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgc2NoZW1hLyxcCi0gICAgICAgICAgICAgICBEZXZUaW1lU3VwcG9ydC8KLXNvdXJjZS4uID0gc3JjLWNhdGFsb2csXAotICAgICAgICAgICBzcmMtY29udGVudG1vZGVsLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uLyxcCi0gICAgICAgICAgIHNyYy8sXAotICAgICAgICAgICBzcmMtZW1mTW9kZWxTeW5jaC8sXAotICAgICAgICAgICBzcmMtc2VhcmNoLwotCi1vdXRwdXQuLiA9IGJpbi8KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2NvbXBvbmVudC54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9jb21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDYxZWIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNvbXBvbmVudCB4bWxucz0iaHR0cDovL2VjbGlwc2Uub3JnL3d0cC9yZWxlbmcvdG9vbHMvY29tcG9uZW50LW1vZGVsIiBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sIj4KLQk8Y29tcG9uZW50LWRlcGVuZHMgdW5yZXN0cmljdGVkPSJ0cnVlIj48L2NvbXBvbmVudC1kZXBlbmRzPgotCTxwbHVnaW4gaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPGRlc2NyaXB0aW9uIHVybD0iaHR0cDovL2VjbGlwc2Uub3JnL3dlYnRvb2xzL3dzdC9jb21wb25lbnRzL3htbC9vdmVydmlldy5odG1sIiAvPgotCTxwYWNrYWdlIG5hbWU9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUwiIHN1YmNsYXNzPSJ0cnVlIiBpbnN0YW50aWF0ZT0idHJ1ZSIgLz4KLQk8L3BhY2thZ2U+Ci0JPHBhY2thZ2UgbmFtZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZSIgYXBpPSJmYWxzZSI+Ci0JCTx0eXBlIG5hbWU9IlhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGFja2FnZSBuYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXMiIGFwaT0iZmFsc2UiPgotCQk8dHlwZSBuYW1lPSJYTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIgc3ViY2xhc3M9InRydWUiIGluc3RhbnRpYXRlPSJ0cnVlIiAvPgotCTwvcGFja2FnZT4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5zb3VyY2UiIGZyYWdtZW50PSJmYWxzZSIgLz4KLQk8cGx1Z2luIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlIiBmcmFnbWVudD0iZmFsc2UiIC8+Ci0JPHBsdWdpbiBpZD0ib3JnLmFwYWNoZS54ZXJjZXMiIGZyYWdtZW50PSJmYWxzZSIgLz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkNTRmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi1wbHVnaW5OYW1lPVN0cnVjdHVyZWQgU291cmNlIFhNTCBNb2RlbAotU3RydWN0dXJlZF9YTUxfRG9jdW1lbnRfRmFjdG9yeV9FeHRlbnNpb24ubmFtZT1TdHJ1Y3R1cmVkIFhNTCBEb2N1bWVudCBGYWN0b3J5IEV4dGVuc2lvbgotWE1MX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhNTCAoSWxsZm9ybWVkKQotIyBjb250ZW50bW9kZWwgc3RyaW5ncwotQ29udGVudF9Nb2RlbF9Eb2N1bWVudF9GYWN0b3JpZXNfRXh0ZW5zaW9uLm5hbWU9Q29udGVudCBNb2RlbCBEb2N1bWVudCBGYWN0b3JpZXMKLUNvbnRlbnRfTW9kZWxfQW5ub3RhdGlvbl9GaWxlc19FeHRlbnNpb24ubmFtZT1Db250ZW50IE1vZGVsIEFubm90YXRpb24gRmlsZXMKLU1vZGVsX1F1ZXJ5X0V4dGVuc2lvbi5uYW1lPU1vZGVsIFF1ZXJ5IEV4dGVuc2lvbgotWE1MX0NhdGFsb2dfQ29udHJpYnV0aW9uc19FeHRlbnNpb25fUG9pbnQubmFtZT1YTUwgQ2F0YWxvZyBDb250cmlidXRpb25zIEV4dGVuc2lvbiBQb2ludAotWFNMX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhTTAotWE1JX0NvbnRlbnRfVHlwZT1YTUkKLVhNTF9WYWxpZGF0b3IubmFtZT1YTUwgVmFsaWRhdG9yCi1YTUxfVmFsaWRhdGlvbl9FcnJvcl9DdXN0b21pemVyLm5hbWU9WE1MIFZhbGlkYXRvciBFcnJvciBDdXN0b21pemVyIEV4dGVuc2lvbiBQb2ludApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzE1ZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotICAgPCEtLSBBbiBleHRlbnNpb24gZm9yIGNvbnRyaWJ1dGluZyBhIFhNTCB2YWxpZGF0aW9uIGVycm9yIGN1c3RvbWl6ZXIuIC0tPgotICAgPGV4dGVuc2lvbi1wb2ludCBpZD0iZXJyb3JDdXN0b21pemVyIiBuYW1lPSIlWE1MX1ZhbGlkYXRpb25fRXJyb3JfQ3VzdG9taXplci5uYW1lIiBzY2hlbWE9InNjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZCIvPgotCi0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIiPgotCQk8L21vZGVsSGFuZGxlcj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUubW9kZWxIYW5kbGVyIj4KLQkJPG1vZGVsSGFuZGxlcgotCQkJZGVmYXVsdD0idHJ1ZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyLk1vZGVsSGFuZGxlckZvclhNTCIKLQkJCWFzc29jaWF0ZWRDb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIyIj4KLQkJPC9tb2RlbEhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmVtYmVkZGVkVHlwZUhhbmRsZXIiPgotCQk8ZW1iZWRkZWRUeXBlSGFuZGxlcgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuRW1iZWRkZWRYTUwiPgotCQk8L2VtYmVkZGVkVHlwZUhhbmRsZXI+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGFza3NjYW5uZXIiPgotCQk8c2Nhbm5lcgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrcy5YTUxGaWxlVGFza1NjYW5uZXIiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRhc2tzLlhNTEZpbGVUYXNrU2Nhbm5lciIKLQkJCWNvbnRlbnRUeXBlSWRzPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotCTwvZXh0ZW5zaW9uPgotCSAKLSAgIDwhLS0gSGVyZSB3ZSBkZWZpbmUgYSBuZXcgZXh0ZW5zaW9uIHBvaW50LiAgVGhpcyBleHRlbnNpb24gcG9pbnQgaXMgdXNlZAotICAgICAgICB0byBwcm9ncmFtbWF0aWNhbGx5IGNvbnRyaWJ1dGUgY2F0YWxvZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZy4gLS0+Ci0gICA8ZXh0ZW5zaW9uLXBvaW50IGlkPSJjYXRhbG9nQ29udHJpYnV0aW9ucyIgbmFtZT0iJVhNTF9DYXRhbG9nX0NvbnRyaWJ1dGlvbnNfRXh0ZW5zaW9uX1BvaW50Lm5hbWUiIHNjaGVtYT0ic2NoZW1hL2NhdGFsb2dDb250cmlidXRpb25zLmV4c2QiLz4KLQotICAgPCEtLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBleHRlbmRzIHRoZSBDb21tb24gRXh0ZW5zYmlsZSBVUkkgUmVzb2x2ZXIgc28gdGhhdAotICAgICAgICB0aGUgWE1MIENhdGFsb2cgY2FuIHBhcnRpY2lwYXJlIGluIHJlc29sdmluZyBwcm9jZXNzZXMuIC0tPgotICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5yZXNvbHZlckV4dGVuc2lvbnMiPgotICAgICAgPHJlc29sdmVyRXh0ZW5zaW9uCi0gICAgICAgICAgICBzdGFnZT0icG9zdG5vcm1hbGl6YXRpb24iCi0gICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uIj4KLSAgICAgIDwvcmVzb2x2ZXJFeHRlbnNpb24+Ci0gICA8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudGZhY3RvcmllcyIKLQkJbmFtZT0iJVN0cnVjdHVyZWRfWE1MX0RvY3VtZW50X0ZhY3RvcnlfRXh0ZW5zaW9uLm5hbWUiPgotCQk8ZmFjdG9yeQotCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZmlsZWJ1ZmZlcnMuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5IiAvPgotCTwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24KLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUuZmlsZWJ1ZmZlcnMuZG9jdW1lbnRDcmVhdGlvbiIKLQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5kb2N1bWVudGZhY3RvcmllczIiCi0JCW5hbWU9IiVTdHJ1Y3R1cmVkX1hNTF9Eb2N1bWVudF9GYWN0b3J5X0V4dGVuc2lvbi5uYW1lIj4KLQkJPGZhY3RvcnkKLQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZpbGVidWZmZXJzLkJhc2ljU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS50ZWFtLmNvcmUuZmlsZVR5cGVzIj4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieHNsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249InhzbHQiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0iZGFkeCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ3c2RsIj4KLQkJPC9maWxlVHlwZXM+Ci0JCTxmaWxlVHlwZXMKLQkJCXR5cGU9InRleHQiCi0JCQlleHRlbnNpb249Im5zdCI+Ci0JCTwvZmlsZVR5cGVzPgotCQk8ZmlsZVR5cGVzCi0JCQl0eXBlPSJ0ZXh0IgotCQkJZXh0ZW5zaW9uPSJ4bWkiPgotCQk8L2ZpbGVUeXBlcz4KLQkJPGZpbGVUeXBlcwotCQkJdHlwZT0idGV4dCIKLQkJCWV4dGVuc2lvbj0ieHNkIj4KLQkJPC9maWxlVHlwZXM+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmZvcm1hdFByb2Nlc3NvcnMiPgotCQk8cHJvY2Vzc29yCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUwiCi0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9wcm9jZXNzb3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWwseHNsLHhzbHQsd3NkbCx4c2QsZXhzZCx4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNTF9Db250ZW50X1R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWlkPSJ4bWxzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS50ZXh0IgotCQkJZGVmYXVsdC1jaGFyc2V0PSJVVEYtOCI+Ci0JCQk8ZGVzY3JpYmVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZS5Db250ZW50RGVzY3JpYmVyRm9yWE1MIiAvPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50VHlwZXMiPgotCQk8Y29udGVudC10eXBlCi0JCQlmaWxlLWV4dGVuc2lvbnM9InhzbCx4c2x0IgotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlWFNMX0NvbnRlbnRfVHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJaWQ9InhzbHNvdXJjZSIKLQkJCWJhc2UtdHlwZT0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCIKLQkJCWRlZmF1bHQtY2hhcnNldD0iVVRGLTgiPgotCQk8L2NvbnRlbnQtdHlwZT4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMDMwODMgLS0+XAotCTwhLS0gIEZZSTogdGhpcyB4bWkgdHlwZSAqc2hvdWxkKiBiZSBkZWZpbmVkIGluIEVNRiwgYnV0LCBzaW5jZSBpc24ndAotCQkJd2Ugd2lsbCBoZXJlLiBJbiBmdXR1cmUgdmVyc2lvbnMgaXMgY291bGQgYmUgcmVtb3ZlZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJZmlsZS1leHRlbnNpb25zPSJ4bWkiCi0JCQlwcmlvcml0eT0ibG93IgotCQkJbmFtZT0iJVhNSV9Db250ZW50X1R5cGUiCi0JCQlpZD0ieG1pc291cmNlIgotCQkJYmFzZS10eXBlPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJPC9jb250ZW50LXR5cGU+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGluaXRpYWxpemUgeG1sIGNvcmUgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJkb2N1bWVudEZhY3RvcmllcyIgbmFtZT0iJUNvbnRlbnRfTW9kZWxfRG9jdW1lbnRfRmFjdG9yaWVzX0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9kb2N1bWVudEZhY3Rvcmllcy5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJtb2RlbFF1ZXJ5RXh0ZW5zaW9ucyIgbmFtZT0iJU1vZGVsX1F1ZXJ5X0V4dGVuc2lvbi5uYW1lIiBzY2hlbWE9InNjaGVtYS9tb2RlbFF1ZXJ5RXh0ZW5zaW9ucy5leHNkIi8+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhbm5vdGF0aW9uRmlsZXMiIG5hbWU9IiVDb250ZW50X01vZGVsX0Fubm90YXRpb25fRmlsZXNfRXh0ZW5zaW9uLm5hbWUiIHNjaGVtYT0ic2NoZW1hL2Fubm90YXRpb25GaWxlcy5leHNkIi8+CQotCQkKLQk8ZXh0ZW5zaW9uIAotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5qZW0udXRpbC51aUNvbnRleHRTZW5zaXRpdmVDbGFzcyI+Ci0gICAgICAgPHVpQ29udGV4dFNlbnNpdGl2ZUNsYXNzCi0gICAgICAgICAgICBjb250ZXh0PSJVSSIKLSAgICAgICAgICAgIGtleT0icmVuZGVyZXJGYWN0b3J5IgotICAgICAgICAgICAgY2xhc3NOYW1lPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbC5FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5Ij4KLSAgICAgICA8L3VpQ29udGV4dFNlbnNpdGl2ZUNsYXNzPgotICAgICAgIDx1aUNvbnRleHRTZW5zaXRpdmVDbGFzcwotICAgICAgICAgIGtleT0iVmFsaWRhdGVFZGl0Q29udGV4dCIKLSAgICAgICAgICBjbGFzc05hbWU9Im9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLnZhbGlkYXRlZWRpdC5WYWxpZGF0ZUVkaXRIZWFkbGVzc0NvbnRleHQiCi0gICAgICAgICAgY29udGV4dD0iSGVhZGxlc3MiPgotICAgICAgPC91aUNvbnRleHRTZW5zaXRpdmVDbGFzcz4KLSAgPC9leHRlbnNpb24+Ci0gIDwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhNTCB2YWxpZGF0b3Igd2l0aCB0aGUgdmFsaWRhdGlvbiAJCS0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotIDxleHRlbnNpb24KLSBpZD0ieG1sVmFsaWRhdG9yIgotCQluYW1lPSIlWE1MX1ZhbGlkYXRvci5uYW1lIgotICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi52YWxpZGF0b3IiPgotICAgIDx2YWxpZGF0b3I+Ci0gICAgPCEtLSBUaGVyZSBpcyBhIGN1c3RvbSBYTUwgdmFsaWRhdG9yIGZvciBFSkJzIC0tPgotCQkJPHByb2plY3ROYXR1cmUKLQkJCQlpbmNsdWRlPSJmYWxzZSIKLQkJCQlpZD0ib3JnLmVjbGlwc2UuanN0LmoyZWUuZWpiLkVKQk5hdHVyZSI+Ci0JCQk8L3Byb2plY3ROYXR1cmU+Ci0JCQk8IS0tIFRoZXJlIGlzIGEgY3VzdG9tIFhNTCB2YWxpZGF0b3IgZm9yIEVBUnMgLS0+Ci0JCQk8cHJvamVjdE5hdHVyZQotCQkJCWluY2x1ZGU9ImZhbHNlIgotCQkJCWlkPSJvcmcuZWNsaXBzZS5qc3QuajJlZS5FQVJOYXR1cmUiPgotCQkJPC9wcm9qZWN0TmF0dXJlPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQljYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLQkJCQluYW1lRmlsdGVyPSIqLnhtbCI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxmaWx0ZXIKLQkJCQlvYmplY3RDbGFzcz0ib3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGUiCi0JCQkJY2FzZVNlbnNpdGl2ZT0iZmFsc2UiCi0JCQkJbmFtZUZpbHRlcj0iKi5ncGgiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCWNhc2VTZW5zaXRpdmU9ImZhbHNlIgotCQkJCW5hbWVGaWx0ZXI9Iioud2RvLWNvbm5lY3Rpb25zIj4KLQkJCTwvZmlsdGVyPgotCQkJPGZpbHRlcgotCQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCQljYXNlU2Vuc2l0aXZlPSJmYWxzZSIKLQkJCQluYW1lRmlsdGVyPSIqLnRsZCIgLz4KLQkJCQkKLSAgICA8aGVscGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuSGVscGVyIj4KLQkJCTwvaGVscGVyPgotCQkJCi0gICAgICAgPHJ1bgotICAgICAgICAgICAgIGFzeW5jPSJ0cnVlIgotICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciIKLSAgICAgICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgIGZ1bGxCdWlsZD0idHJ1ZSIKLSAgICAgICAgICAgICBpbmNyZW1lbnRhbD0idHJ1ZSIvPgotICAgIDwvdmFsaWRhdG9yPgotIDwvZXh0ZW5zaW9uPgotCi08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9hbm5vdGF0aW9uRmlsZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQxN2Y1NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvYW5ub3RhdGlvbkZpbGVzLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGlkPSJhbm5vdGF0aW9uRmlsZXMiIG5hbWU9IkNvbnRlbnQgTW9kZWwgQW5ub3RhdGlvbiBGaWxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iYW5ub3RhdGlvbkZpbGUiIG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iYW5ub3RhdGlvbkZpbGUiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJsb2NhdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwdWJsaWNJZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2NhdGFsb2dDb250cmlidXRpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzkwNTk3Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvY2F0YWxvZ0NvbnRyaWJ1dGlvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImNhdGFsb2dDb250cmlidXRpb25zIiBuYW1lPSJYTUwgQ2F0YWxvZyBDb250cmlidXRpb25zIEV4dGVuc2lvbiBQb2ludCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgdG8gc3BlY2lmeSBlbnRyaWVzIGZvciBYTUwgQ2F0YWxvZy4gIENhdGFsb2cgZW50cmllcyBoYXZlIGZvcm1hdCBzcGVjaWZpZWQgaW4gJmx0O2EgaHJlZj0mcXVvdDtodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2NvbW1pdHRlZXMvZG93bmxvYWQucGhwLzE0MDQxL3htbC1jYXRhbG9ncy5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvY29tbWl0dGVlcy9lbnRpdHkvc3BlYy5odG1sJmx0Oy9hJmd0Oy4gIAotRWFjaCBjYXRhbG9nIGV4dGVuc2lvbiBjb25zaXN0cyBvZiBhIHNpbmdsZSBjYXRhbG9nQ29udHJpYnV0aW9uIGVsZW1lbnQuCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8Y2hvaWNlPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJjYXRhbG9nQ29udHJpYnV0aW9uIi8+Ci0gICAgICAgICA8L2Nob2ljZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iY2F0YWxvZ0NvbnRyaWJ1dGlvbiI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIGNhdGFsb2dDb250cmlidXRpb24gZWxlbWVudCBtYXkgaGF2ZSBpZCwgYW5kIGl0IGlzIGp1c3QgYSBjb250YWluZXIgZm9yIHRoZSBjb250cmlidXRlZCBjYXRhbG9nIGVudHJpZXMuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9InB1YmxpYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICAgICAgPGVsZW1lbnQgcmVmPSJzeXN0ZW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0idXJpIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im5leHRDYXRhbG9nIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgY2F0YWxvZyB0byB3aGljaCBlbnRyaWVzIHdpbGwgYmUgYWRkZWQuIENvdWxkIGJlICZxdW90O2RlZmF1bHQmcXVvdDssIGFuZCBpZiBvbW1pdGVkLCBlbnRyaWVzIGFyZSBhZGRlZCB0byB0aGUgZGVmYXVsdCB3b3Jrc3BhY2UgY2F0YWxvZy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0icHVibGljIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgcHVibGljIGVsZW1lbnQgYXNzb2NpYXRlcyBhIFVSSSByZWZlcmVuY2Ugd2l0aCB0aGUgcHVibGljIGlkZW50aXRpZXIgcG9ydGlvbiBvZiBhbiBleHRlcm5hbCBpZGVudGlmaWVyLgotICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPHNlcXVlbmNlPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGVsZW1lbnQsIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InB1YmxpY0lkIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSBwdWJsaWMgaWRlbnRpZmllciBwb3J0aW9uIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGF0dHJpYnV0ZSBjb3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLnhtbCBmaWxlLCB1c2UgcGxhdGZvcm06LyBvciBmaWxlOi8gcHJvdG9jb2xzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJ3ZWJVUkwiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3MgZm9yIHRoZSBwdWJsaWMgSUQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0ic3lzdGVtIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgc3lzdGVtIGVsZW1lbnRzIGFzc29jaWF0ZXMgYSBVUkkgcmVmZXJlbmNlIHdpdGggdGhlIHN5c3RlbSBpZGVudGlmaWVyIG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIKLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIElkIG9mIHRoZSBlbGVtZW50LCBvcHRpb25hbC4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJzeXN0ZW1JZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgc3lzdGVtIGlkZW50aWZpZXIgcG9ydGlvbiBvZiBhbiBleHRlcm5hbCBpZGVudGlmaWVyLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InVyaSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHVyaSBhdHRyaWJ1dGUgY291bGQgYmUgcmVsYXRpdmUgdG8gdGhlIHBsdWdpbi54bWwgZmlsZSwgdXNlIHBsYXRmb3JtOi8gb3IgZmlsZTovIHByb3RvY29scy4KLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9InJlc291cmNlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9InVyaSI+Ci0gICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgVGhlIHVyaSBlbGVtZW50IGFzc29jaWF0ZXMgYSBVUkkgcmVmZXJlbmNlIHdpdGggdGhlIGEgVVJJIHJlZmVyZW5jZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFuIGV4dGVybmFsIGlkZW50aWZpZXIuCi0gICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICA8L2Fubm90YXRpb24+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBJZCBvZiB0aGUgZWxlbWVudCwgb3B0aW9uYWwuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0idXJpIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIFRoZSB2YWx1ZSBvZiB0aGUgdXJpIGF0dHJpYnV0ZSBjb3VsZCBiZSByZWxhdGl2ZSB0byB0aGUgcGx1Z2luLnhtbCBmaWxlLCB1c2UgcGxhdGZvcm06LyBvciBmaWxlOi8gcHJvdG9jb2xzLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUga2luZD0icmVzb3VyY2UiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIEEgVVJJIHJlZmVyZW5jZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGFuIGV4dGVybmFsIGlkZW50aXRpZXIuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im5leHRDYXRhbG9nIj4KLSAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICBUaGUgbmV4dENhdGFsb2cgZWxlbWVudHMgaW5kaWNhdGUgYWRkaXRpb25hbCBjYXRhbG9nIGVudHJ5IGZpbGUocykgdG8gYmUgY29uc2lkZXJlZCBkdXJpbmcgdGhlIHByb2Nlc3Mgb2YgcmVzb2x1dGlvbi4KLSAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgSWQgb2YgdGhlIGVsZW1lbnQsIG9wdGlvbmFsLgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImNhdGFsb2ciIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSB1cmkgYXR0cmlidXRlIGNvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBwbHVnaW4ueG1sIGZpbGUsIHVzZSBwbGF0Zm9ybTovIG9yIGZpbGU6LyBwcm90b2NvbHMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJyZXNvdXJjZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAxLjAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24gCi0gICAgICAgICBwb2ludD0mcXVvdDtvcmcuZWNsaXBzZS53c3QueG1sLnVyaXJlc29sdmVyLmNhdGFsb2dDb250cmlidXRpb25zJnF1b3Q7Jmd0OwotICAgICAgJmx0O2NhdGFsb2dDb250cmlidXRpb24mZ3Q7IAotICAgICAgICAgJmx0O3N5c3RlbSAKLSAgICAgICAgICAgICAgIHN5c3RlbUlkPSZxdW90O2h0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvJnF1b3Q7Ci0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2Qvd3NkbC54bWwmcXVvdDsgJmd0OyAKLSAgICAgICAgICAgICZsdDtwcm9wZXJ0eSAKLSAgICAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7d2ViVVJMJnF1b3Q7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L3N5c3RlbSZndDsKLSAgICAgICAgICZsdDt1cmkKLSAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7aHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9zb2FwLyZxdW90OyAKLSAgICAgICAgICAgICAgIHVyaT0mcXVvdDtkYXRhL3hzZC9zb2FwLnhzZCZxdW90Oy8mZ3Q7IAotICAgICAgICAgJmx0O3B1YmxpYwotICAgICAgICAgICAgICAgcHVibGljSWQ9JnF1b3Q7aHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtJnF1b3Q7Ci0gICAgICAgICAgICAgICB1cmk9JnF1b3Q7ZGF0YS94c2QvWFNMU2NoZW1hLnhzZCZxdW90OyZndDsKLSAgICAgICAgICAgICZsdDtwcm9wZXJ0eSAKLSAgICAgICAgICAgICAgICAgIG5hbWU9JnF1b3Q7d2ViVVJMJnF1b3Q7Ci0gICAgICAgICAgICAgICAgICB2YWx1ZT0mcXVvdDtodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyZxdW90Oy8mZ3Q7Ci0gICAgICAgICAmbHQ7L3B1YmxpYyZndDsKLSAgICAgICAgICZsdDtuZXh0Q2F0YWxvZwotICAgICAgICAgICAgICAgaWQ9JnF1b3Q7bmVzdGVkQ2F0YWxvZyZxdW90OyAKLSAgICAgICAgICAgICAgIGNhdGFsb2c9JnF1b3Q7ZGF0YS9jYXRhbG9nMS54bWwmcXVvdDsvJmd0OyAKLSAgICAgICZsdDsvY2F0YWxvZ0NvbnRyaWJ1dGlvbiZndDsgCi0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL2RvY3VtZW50RmFjdG9yaWVzLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQwZDkwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZG9jdW1lbnRGYWN0b3JpZXMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9ImRvY3VtZW50RmFjdG9yaWVzIiBuYW1lPSJDb250ZW50IE1vZGVsIERvY3VtZW50IEZhY3RvcmllcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBpbnRlcm5hbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGFueSBvdGhlciBwbHVnaW5zLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZmFjdG9yeSIvPgotICAgICAgICAgPC9zZXF1ZW5jZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0icG9pbnQiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYSBmdWxseSBxdWFsaWZpZWQgaWRlbnRpZmllciBvZiB0aGUgdGFyZ2V0IGV4dGVuc2lvbiBwb2ludAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIGlkZW50aWZpZXIgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSB0cmFuc2xhdGFibGU9InRydWUiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGVsZW1lbnQgbmFtZT0iZmFjdG9yeSI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICA8YXBwSW5mbz4KLSAgICAgICAgICAgICAgICAgIDxtZXRhLmF0dHJpYnV0ZSBraW5kPSJqYXZhIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9InNpbmNlIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICZsdDtiJmd0O1RoaXMgZXh0ZW5zaW9uIHBvaW50IGlzIGludGVybmFsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgYW55IG90aGVyIHBsdWdpbnMuJmx0Oy9iJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJleGFtcGxlcyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iYXBpSW5mbyIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgCi0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImNvcHlyaWdodCIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuJmx0O2JyJmd0OwotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSAKLWF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyAKLXRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0ICZsdDthCi1ocmVmPSZxdW90O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJnF1b3Q7Jmd0O2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sJmx0Oy9hJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi08L3NjaGVtYT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NjaGVtYS9lcnJvckN1c3RvbWl6ZXIuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA4ZjE5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvZXJyb3JDdXN0b21pemVyLmV4c2QKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0gU2NoZW1hIGZpbGUgd3JpdHRlbiBieSBQREUgLS0+Ci08c2NoZW1hIHRhcmdldE5hbWVzcGFjZT0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIj4KLTxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zY2hlbWEgcGx1Z2luPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiIGlkPSJlcnJvckN1c3RvbWl6ZXIiIG5hbWU9IlhNTCBWYWxpZGF0aW9uIEVycm9yIEN1c3RvbWl6ZXIiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGVycm9yIGN1c3RvbWl6ZXIgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhIGNsaWVudCB0byBjb250cmlidXRlIGFuIGVycm9yIGN1c3RvbWl6ZXIgZm9yIGEgc3BlY2lmaWMgbmFtZXNwYWNlLiBUaGUgZXJyb3IgY3VzdG9taXplciBjYW4gcHJvdmlkZSBlcnJvciBtZXNzYWdlcyB0aGF0IGFyZSBtb3JlIGRvbWFpbiBzcGVjaWZpYyB0aGFuIHRoZSBnZW5lcmljIGVycm9yIG1lc3NhZ2VzIHByb3ZpZGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGdlbmVyaWMgWE1MIHZhbGlkYXRvci4KLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGVsZW1lbnQgbmFtZT0iZXh0ZW5zaW9uIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxzZXF1ZW5jZT4KLSAgICAgICAgICAgIDxlbGVtZW50IHJlZj0iZXJyb3JDdXN0b21pemVyIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhIGZ1bGx5IHF1YWxpZmllZCBpZGVudGlmaWVyIG9mIHRoZSB0YXJnZXQgZXh0ZW5zaW9uIHBvaW50Ci0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InN0cmluZyI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgYW4gb3B0aW9uYWwgaWRlbnRpZmllciBvZiB0aGUgZXh0ZW5zaW9uIGluc3RhbmNlCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBuYW1lIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIHRyYW5zbGF0YWJsZT0idHJ1ZSIvPgotICAgICAgICAgICAgICAgPC9hcHBJbmZvPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8ZWxlbWVudCBuYW1lPSJlcnJvckN1c3RvbWl6ZXIiPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lc3BhY2UiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIG5hbWVzcGFjZSBmb3Igd2hpY2ggdGhpcyBlcnJvciBjdXN0b21pemVyIHdpbGwgY29uc2lkZXIgZXJyb3IgY3VzdG9taXphdGlvbnMuCi0gICAgICAgICAgICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iY2xhc3MiIHR5cGU9InN0cmluZyIgdXNlPSJyZXF1aXJlZCI+Ci0gICAgICAgICAgICA8YW5ub3RhdGlvbj4KLSAgICAgICAgICAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgICAgVGhlIGNsYXNzIHRoYXQgaW1wbGVtZW50cyAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgPC9hbm5vdGF0aW9uPgotICAgICAgICAgPC9hdHRyaWJ1dGU+Ci0gICAgICA8L2NvbXBsZXhUeXBlPgotICAgPC9lbGVtZW50PgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJzaW5jZSIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAmbHQ7YiZndDtUaGlzIGV4dGVuc2lvbiBwb2ludCBpcyBwYXJ0IG9mIGFuIGludGVyaW0gQVBJIHRoYXQgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQgYW5kIGV4cGVjdGVkIHRvIGNoYW5nZSBzaWduaWZpY2FudGx5IGJlZm9yZSByZWFjaGluZyBzdGFiaWxpdHkuIEl0IGlzIGJlaW5nIG1hZGUgYXZhaWxhYmxlIGF0IHRoaXMgZWFybHkgc3RhZ2UgdG8gc29saWNpdCBmZWVkYmFjayBmcm9tIHBpb25lZXJpbmcgYWRvcHRlcnMgb24gdGhlIHVuZGVyc3RhbmRpbmcgdGhhdCBhbnkgY29kZSB0aGF0IHVzZXMgdGhpcyBBUEkgd2lsbCBhbG1vc3QgY2VydGFpbmx5IGJlIGJyb2tlbiAocmVwZWF0ZWRseSkgYXMgdGhlIEFQSSBldm9sdmVzLiZsdDsvYiZndDsKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iZXhhbXBsZXMiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgVGhlIGZvbGxvd2luZyBpcyBhbiBleGFtcGxlIG9mIGFuIEVycm9yIEN1c3RvbWl6ZXIgY29udHJpYnV0aW9uOgotJmx0O3ByZSZndDsKLSAgICZsdDtleHRlbnNpb24KLSAgICAgICAgIGlkPSZxdW90O3NhbXBsZUVycm9yQ3VzdG9taXplciZxdW90OwotICAgICAgICAgbmFtZT0mcXVvdDtTYW1wbGUgRXJyb3IgQ3VzdG9taXplciZxdW90OwotICAgICAgICAgcG9pbnQ9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmVycm9yQ3VzdG9taXplciZxdW90OyZndDsKLSAgICAgICZsdDtlcnJvckN1c3RvbWl6ZXIKLSAgICAgICAgICAgIG5hbWVzcGFjZT0mcXVvdDtodHRwOi8vc2FtcGxlLm5hbWVzcGFjZSZxdW90OwotICAgICAgICAgICAgY2xhc3M9JnF1b3Q7b3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLlNhbXBsZUVycm9yQ3VzdG9taXplciZxdW90Oy8mZ3Q7Ci0gICAmbHQ7L2V4dGVuc2lvbiZndDsKLSZsdDsvcHJlJmd0OwotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIFRoZSBzdXBwbGllZCBjbGFzcyBtdXN0IGltcGxlbWVudCAmbHQ7Y29kZSZndDtvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXImbHQ7L2NvZGUmZ3Q7LgotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc2NoZW1hL21vZGVsUXVlcnlFeHRlbnNpb25zLmV4c2QgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNkZGYwMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zY2hlbWEvbW9kZWxRdWVyeUV4dGVuc2lvbnMuZXhzZAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLSBTY2hlbWEgZmlsZSB3cml0dGVuIGJ5IFBERSAtLT4KLTxzY2hlbWEgdGFyZ2V0TmFtZXNwYWNlPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZSIgaWQ9Im1vZGVsUXVlcnlFeHRlbnNpb25zIiBuYW1lPSJNb2RlbCBRdWVyeSBFeHRlbnNpb24iLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9Im1vZGVsUXVlcnlFeHRlbnNpb24iLz4KLSAgICAgICAgIDwvc2VxdWVuY2U+Ci0gICAgICAgICA8YXR0cmlidXRlIG5hbWU9InBvaW50IiB0eXBlPSJzdHJpbmciIHVzZT0icmVxdWlyZWQiPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGEgZnVsbHkgcXVhbGlmaWVkIGlkZW50aWZpZXIgb2YgdGhlIHRhcmdldCBleHRlbnNpb24gcG9pbnQKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICBhbiBvcHRpb25hbCBpZGVudGlmaWVyIG9mIHRoZSBleHRlbnNpb24gaW5zdGFuY2UKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIGFuIG9wdGlvbmFsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBpbnN0YW5jZQotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9Im1vZGVsUXVlcnlFeHRlbnNpb24iPgotICAgICAgPGNvbXBsZXhUeXBlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjbGFzcyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgIDxhcHBJbmZvPgotICAgICAgICAgICAgICAgICAgPG1ldGEuYXR0cmlidXRlIGtpbmQ9ImphdmEiLz4KLSAgICAgICAgICAgICAgIDwvYXBwSW5mbz4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJjb250ZW50VHlwZSIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTE3YTVmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci1wdWJsaWMgY2xhc3MgQ2F0YWxvZyBpbXBsZW1lbnRzIElDYXRhbG9nCi17Ci0KLQljbGFzcyBDYXRhbG9nTFMKLQl7Ci0JCXB1YmxpYyB2b2lkIGxvYWQoKQotCQl7Ci0JCX0KLQotCQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2F2ZSgpCi0JCXsKLQkJCXRyeQotCQkJewotCQkJCW5ldyBDYXRhbG9nV3JpdGVyKCkud3JpdGUoQ2F0YWxvZy50aGlzLCBsb2NhdGlvbik7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJfQotCQl9Ci0JfQotCi0JY2xhc3MgRGVmYXVsdENhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCU5leHRDYXRhbG9nIHVzZXJDYXRhbG9nUmVmZXJlbmNlID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0JCQl1c2VyQ2F0YWxvZ1JlZmVyZW5jZS5zZXRJZChYTUxDb3JlUGx1Z2luLlVTRVJfQ0FUQUxPR19JRCk7Ci0JCQl1c2VyQ2F0YWxvZ1JlZmVyZW5jZS5zZXRDYXRhbG9nTG9jYXRpb24oVVNFUl9DQVRBTE9HX0ZJTEUpOwotCQkJYWRkQ2F0YWxvZ0VsZW1lbnQodXNlckNhdGFsb2dSZWZlcmVuY2UpOwotCi0JCQlOZXh0Q2F0YWxvZyBzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0JCQlzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlLnNldElkKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQpOwotCQkJc3lzdGVtQ2F0YWxvZ1JlZmVyZW5jZS5zZXRDYXRhbG9nTG9jYXRpb24oU1lTVEVNX0NBVEFMT0dfRklMRSk7Ci0JCQlhZGRDYXRhbG9nRWxlbWVudChzeXN0ZW1DYXRhbG9nUmVmZXJlbmNlKTsKLQotCQkJLyoKLQkJCSAqIEhlcmUgd2Ugc2F2ZSB0aGUgZmlsZSBpbiBvcmRlciB0byAncmVmbGVjdCcgdGhlIGNhdGFsb2cgdGhhdAotCQkJICogd2UndmUgY3JlYXRlZCBmcm9tIHBsdWctaW4gZXh0ZW5zaW9ucyB0byBkaXNrLiBUaGUgJ2RlZmF1bHQnCi0JCQkgKiBjYXRhbG9nIGlzIG9ubHkgZXZlciB3cml0dGVuIHRvIGRpc2sgYW5kIG5ldmVyIHJlYWQgZnJvbSBkaXNrLgotCQkJICovCi0JCQlzYXZlKCk7Ci0JCX0KLQl9Ci0KLQljbGFzcyBJbnRlcm5hbFJlc29sdmVyCi0JewotCQlwcm90ZWN0ZWQgTWFwIHB1YmxpY01hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQkJcHJvdGVjdGVkIE1hcCBzeXN0ZW1NYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXByb3RlY3RlZCBNYXAgdXJpTWFwID0gbmV3IEhhc2hNYXAoKTsKLQotCQlJbnRlcm5hbFJlc29sdmVyKCkKLQkJewotCQkJZm9yIChJdGVyYXRvciBpID0gY2F0YWxvZ0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQlJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSAoSUNhdGFsb2dFbGVtZW50KSBpLm5leHQoKTsKLQkJCQlpZiAoY2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKQotCQkJCXsKLQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBjYXRhbG9nRWxlbWVudDsKLQkJCQkJTWFwIG1hcCA9IGdldEVudHJ5TWFwKGVudHJ5LmdldEVudHJ5VHlwZSgpKTsKLQkJCQkJbWFwLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgTWFwIGdldEVudHJ5TWFwKGludCBlbnRyeVR5cGUpCi0JCXsKLQkJCU1hcCBtYXAgPSBzeXN0ZW1NYXA7Ci0JCQlzd2l0Y2ggKGVudHJ5VHlwZSkKLQkJCXsKLQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJCQltYXAgPSBwdWJsaWNNYXA7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk6Ci0JCQkJbWFwID0gdXJpTWFwOwotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlicmVhazsKLQkJCX0KLQkJCXJldHVybiBtYXA7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1hcHBlZFVSSShNYXAgbWFwLCBTdHJpbmcga2V5KQotCQl7Ci0JCQlDYXRhbG9nRW50cnkgZW50cnkgPSAoQ2F0YWxvZ0VudHJ5KSBtYXAuZ2V0KGtleSk7Ci0JCQlpZihlbnRyeSA9PSBudWxsKSByZXR1cm4gbnVsbDsKLQkJCVN0cmluZyB1cmkgPSBlbnRyeS5nZXRVUkkoKTsKLQkJCXRyeQotCQkJewotICAgICAgICAgICAgICAgIC8vIFRPRE8gQ1MgOiBkbyB3ZSByZWFsbHkgd2FudCB0byByZXNvbHZlIHRoZXNlIGhlcmU/Ci0gICAgICAgICAgICAgICAgLy8gSSdtIGd1ZXNzaW5nIHdlIHNob3VsZCByZXR1cm4gdGhlICdwbGF0Zm9ybTonIGZvcm0gb2YgdGhlIFVSSQotICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjYWxsZXIuCi0gICAgICAgICAgICAgICAgaWYgKHVyaS5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgIHsgIAotCQkJCSAgVVJMIGVudHJ5VVJMID0gbmV3IFVSTChlbnRyeS5nZXRBYnNvbHV0ZVBhdGgodXJpKSk7ICAgICAgICAgICAgICAgIAotCQkJCSAgdXJpID0gUGxhdGZvcm0ucmVzb2x2ZShlbnRyeVVSTCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBlbnN1cmUgVVJJJ3MgYXJlIG9mIGZvcm0gImZpbGU6Ly8vRDovWFhYIiBhbmQgTk9UICAKLSAgICAgICAgICAgICAgICAgIC8vICJmaWxlOkQ6L1hYWCIuICBPdGhlcndpc2UgdGhlIEVNRiBVUkkgY2xhc3MgZ2V0cyBjb25mdXNlZAotICAgICAgICAgICAgICAgICAgLy8gKHNlZSBidWcgMTAzNjA3KSAKLSAgICAgICAgICAgICAgICAgIFN0cmluZyBGSUxFX1NDSEVNRSA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIGlmICh1cmkuc3RhcnRzV2l0aChGSUxFX1NDSEVNRSkgJiYgIXVyaS5zdGFydHNXaXRoKEZJTEVfU0NIRU1FICsgIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1cmkgPSBGSUxFX1NDSEVNRSArICIvLy8iICsgdXJpLnN1YnN0cmluZyhGSUxFX1NDSEVNRS5sZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgIH0gIAotICAgICAgICAgICAgICAgIHJldHVybiB1cmk7IAotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJCXsKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgcmVzb2x2ZVB1YmxpYyhTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLQkJCQl0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotCQl7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHB1YmxpY01hcCwgcHVibGljSWQpOwotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IGdldE1hcHBlZFVSSShzeXN0ZW1NYXAsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCS8vIG91ciBjbGllbnRzIHVzZWQgdG8gcGFzcyBuYW1lc3BhY2UgaW4gcGxhY2Ugb2YgcHVibGljIGlkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHVyaSBtYXAgZm9yIHRob3NlCi0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gZ2V0TWFwcGVkVVJJKHVyaU1hcCwgcHVibGljSWQpOwotCQkJfQotCQkJaWYgKHJlc3VsdCA9PSBudWxsKQotCQkJewotCQkJCXJlc3VsdCA9IHJlc29sdmVTdWJvcmRpbmF0ZUNhdGFsb2dzKAotCQkJCQkJSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQywgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHJlc29sdmVTeXN0ZW0oU3RyaW5nIHN5c3RlbUlkKQotCQkJCXRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JCXsKLQkJCVN0cmluZyByZXN1bHQgPSBnZXRNYXBwZWRVUkkoc3lzdGVtTWFwLCBzeXN0ZW1JZCk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZVN1Ym9yZGluYXRlQ2F0YWxvZ3MoCi0JCQkJCQlJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNLCBudWxsLCBzeXN0ZW1JZCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0JCQkJSU9FeGNlcHRpb24KLQkJewotCQkJU3RyaW5nIHJlc3VsdCA9IGdldE1hcHBlZFVSSSh1cmlNYXAsIHVyaSk7Ci0JCQlpZiAocmVzdWx0ID09IG51bGwpCi0JCQl7Ci0JCQkJcmVzdWx0ID0gcmVzb2x2ZVN1Ym9yZGluYXRlQ2F0YWxvZ3MoCi0JCQkJCQlJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJLCBudWxsLCB1cmkpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCWNsYXNzIFN5c3RlbUNhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCW5ldyBDYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlcihDYXRhbG9nLnRoaXMpLnJlYWRSZWdpc3RyeSgpOwotCi0JCQkvKgotCQkJICogSGVyZSB3ZSBzYXZlIHRoZSBmaWxlIGluIG9yZGVyIHRvICdyZWZsZWN0JyB0aGUgY2F0YWxvZyB0aGF0Ci0JCQkgKiB3ZSd2ZSBjcmVhdGVkIGZyb20gcGx1Z2luIGV4dGVuc2lvbnMgdG8gZGlzay4gCi0JCQkgKiBUaGUgJ3N5c3RlbScgY2F0YWxvZyBpcyBvbmx5IGV2ZXIgd3JpdHRlbiB0byBkaXNrIGFuZCBuZXZlciByZWFkIGZyb20gZGlzay4KLQkJCSAqLwotCQkJc2F2ZSgpOwotCQl9Ci0JfQotCi0JY2xhc3MgVXNlckNhdGFsb2dMUyBleHRlbmRzIENhdGFsb2dMUwotCXsKLQkJcHVibGljIHZvaWQgbG9hZCgpCi0JCXsKLQkJCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJCXRyeQotCQkJewotCQkJCVVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLQkJCQlpbnB1dFN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0JCQkJYm9vbGVhbiBvbGROb3RpZmljYXRpb25FbmFibGVkID0gaXNOb3RpZmljYXRpb25FbmFibGVkKCk7Ci0JCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQkJY2xlYXIoKTsKLQkJCQl0cnkKLQkJCQl7Ci0JCQkJCUNhdGFsb2dSZWFkZXIucmVhZChDYXRhbG9nLnRoaXMsIGlucHV0U3RyZWFtKTsKLQkJCQl9IGZpbmFsbHkKLQkJCQl7Ci0JCQkJCXNldE5vdGlmaWNhdGlvbkVuYWJsZWQob2xkTm90aWZpY2F0aW9uRW5hYmxlZCk7Ci0JCQkJfQotCQkJCW5vdGlmeUNoYW5nZWQoKTsKLQkJCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQkJewotCQkJfSBmaW5hbGx5Ci0JCQl7Ci0JCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0JCQkJewotCQkJCQl0cnkKLQkJCQkJewotCQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JCQkJCXsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19GSUxFID0gImRlZmF1bHRfY2F0YWxvZy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fQ0FUQUxPR19GSUxFID0gInN5c3RlbV9jYXRhbG9nLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJfQ0FUQUxPR19GSUxFID0gInVzZXJfY2F0YWxvZy54bWwiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGJhc2U7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBjYXRhbG9nRWxlbWVudHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ0xTIGNhdGFsb2dMUzsKLQotCXByb3RlY3RlZCBTdHJpbmcgaWQ7Ci0KLQlwcm90ZWN0ZWQgSW50ZXJuYWxSZXNvbHZlciBpbnRlcm5hbFJlc29sdmVyOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3RpZmljYXRpb25FbmFibGVkOwotCi0JcHJvdGVjdGVkIExpc3QgbGlzdGVuZXJMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHJvdGVjdGVkIFN0cmluZyBsb2NhdGlvbjsKLQotCXByb3RlY3RlZCBDYXRhbG9nU2V0IHJlc291cmNlU2V0OwotCi0JcHVibGljIENhdGFsb2coQ2F0YWxvZ1NldCBjYXRhbG9nUmVzb3VyY2VTZXQsIFN0cmluZyBpZCwgU3RyaW5nIGxvY2F0aW9uKQotCXsKLQkJdGhpcy5yZXNvdXJjZVNldCA9IGNhdGFsb2dSZXNvdXJjZVNldDsKLQkJdGhpcy5pZCA9IGlkOwotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0KLQkJaWYgKFhNTENvcmVQbHVnaW4uREVGQVVMVF9DQVRBTE9HX0lELmVxdWFscyhpZCkpCi0JCXsKLQkJCWNhdGFsb2dMUyA9IG5ldyBEZWZhdWx0Q2F0YWxvZ0xTKCk7Ci0JCX0gZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5TWVNURU1fQ0FUQUxPR19JRC5lcXVhbHMoaWQpKQotCQl7Ci0JCQljYXRhbG9nTFMgPSBuZXcgU3lzdGVtQ2F0YWxvZ0xTKCk7Ci0JCX0gZWxzZQotCQl7Ci0JCQljYXRhbG9nTFMgPSBuZXcgVXNlckNhdGFsb2dMUygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpCi0JewotCQljYXRhbG9nRWxlbWVudHMuYWRkKGVsZW1lbnQpOwotCQllbGVtZW50LnNldE93bmVyQ2F0YWxvZyh0aGlzKTsKLQkJaW50ZXJuYWxSZXNvbHZlciA9IG51bGw7Ci0JCW5vdGlmeUFkZEVsZW1lbnQoZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkRW50cmllc0Zyb21DYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpCi0JewotCQl0cnkKLQkJewotCQkJc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChmYWxzZSk7Ci0JCQlpZiAoY2F0YWxvZyAhPSBudWxsKQotCQkJewotCQkJCUlDYXRhbG9nRWxlbWVudFtdIGVudHJpZXMgPSAoKENhdGFsb2cpY2F0YWxvZykuZ2V0Q2F0YWxvZ0VsZW1lbnRzKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKQotCQkJCXsKLQkJCQkJQ2F0YWxvZ0VsZW1lbnQgY2xvbmUgPSAoQ2F0YWxvZ0VsZW1lbnQpKChDYXRhbG9nRWxlbWVudCllbnRyaWVzW2ldKS5jbG9uZSgpOwotCQkJCQlhZGRDYXRhbG9nRWxlbWVudChjbG9uZSk7Ci0JCQkJfQotCQkJfSBlbHNlCi0JCQl7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJhcmd1bWVudCB3YXMgbnVsbCBpbiBDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZmluYWxseQotCQl7Ci0JCQlzZXROb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQl9Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcikKLQl7Ci0JCWxpc3RlbmVyTGlzdC5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFyKCkKLQl7Ci0JCWNhdGFsb2dFbGVtZW50cy5jbGVhcigpOwotCQlpbnRlcm5hbFJlc29sdmVyID0gbnVsbDsKLQkJbm90aWZ5Q2hhbmdlZCgpOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoaW50IHR5cGUpCi0JewotCQlzd2l0Y2ggKHR5cGUpCi0JCXsKLQkJY2FzZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWToKLQkJCXJldHVybiBuZXcgQ2F0YWxvZ0VudHJ5KCk7Ci0JCWNhc2UgSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HOgotCQkJcmV0dXJuIG5ldyBOZXh0Q2F0YWxvZygpOwotCQljYXNlIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM6Ci0JCQlyZXR1cm4gbmV3IENhdGFsb2dFbnRyeShJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfUFVCTElDKTsKLQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOgotCQkJcmV0dXJuIG5ldyBDYXRhbG9nRW50cnkoSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSk7Ci0JCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSToKLQkJCXJldHVybiBuZXcgQ2F0YWxvZ0VudHJ5KElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkkpOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIG5ldyBDYXRhbG9nRWxlbWVudCh0eXBlKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZSgpCi0JewotCQlyZXR1cm4gYmFzZTsKLQl9Ci0KLQlwcml2YXRlIExpc3QgZ2V0Q2F0YWxvZ0VsZW1lbnRzKGludCB0eXBlKQotCXsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlDYXRhbG9nRWxlbWVudFtdIGVsZW1lbnRzID0gKElDYXRhbG9nRWxlbWVudFtdKSBjYXRhbG9nRWxlbWVudHMKLQkJCQkudG9BcnJheShuZXcgSUNhdGFsb2dFbGVtZW50W2NhdGFsb2dFbGVtZW50cy5zaXplKCldKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJewotCQkJSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQgPSBlbGVtZW50c1tpXTsKLQkJCWlmIChlbGVtZW50LmdldFR5cGUoKSA9PSB0eXBlKQotCQkJewotCQkJCXJlc3VsdC5hZGQoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeVtdIGdldENhdGFsb2dFbnRyaWVzKCkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gZ2V0Q2F0YWxvZ0VsZW1lbnRzKElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKTsKLQkJcmV0dXJuIChJQ2F0YWxvZ0VudHJ5W10pIHJlc3VsdAotCQkJCS50b0FycmF5KG5ldyBJQ2F0YWxvZ0VudHJ5W3Jlc3VsdC5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ2F0YWxvZ1NldCBnZXRDYXRhbG9nU2V0KCkKLQl7Ci0JCXJldHVybiByZXNvdXJjZVNldDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkKLQl7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldExvY2F0aW9uKCkKLQl7Ci0JCXJldHVybiBsb2NhdGlvbjsKLQl9Ci0KLQlwdWJsaWMgSU5leHRDYXRhbG9nW10gZ2V0TmV4dENhdGFsb2dzKCkKLQl7Ci0JCUxpc3QgcmVzdWx0ID0gZ2V0Q2F0YWxvZ0VsZW1lbnRzKElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRyk7Ci0JCXJldHVybiAoSU5leHRDYXRhbG9nW10pIHJlc3VsdC50b0FycmF5KG5ldyBJTmV4dENhdGFsb2dbcmVzdWx0LnNpemUoKV0pOwotCX0KLQotCXByb3RlY3RlZCBJbnRlcm5hbFJlc29sdmVyIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpCi0JewotCQlpZiAoaW50ZXJuYWxSZXNvbHZlciA9PSBudWxsKQotCQl7Ci0JCQlpbnRlcm5hbFJlc29sdmVyID0gbmV3IEludGVybmFsUmVzb2x2ZXIoKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJuYWxSZXNvbHZlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05vdGlmaWNhdGlvbkVuYWJsZWQoKQotCXsKLQkJcmV0dXJuIGlzTm90aWZpY2F0aW9uRW5hYmxlZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQljYXRhbG9nTFMubG9hZCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUFkZEVsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVudHJ5KQotCXsKLQkJaWYgKGlzTm90aWZpY2F0aW9uRW5hYmxlZCkKLQkJewotCQkJSUNhdGFsb2dFdmVudCBldmVudCA9IG5ldyBDYXRhbG9nRXZlbnQodGhpcywgZW50cnksCi0JCQkJCUlDYXRhbG9nRXZlbnQuRUxFTUVOVF9BRERFRCk7Ci0JCQlub3RpZnlMaXN0ZW5lcnMoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2hhbmdlZCgpCi0JewotCQlJQ2F0YWxvZ0V2ZW50IGV2ZW50ID0gbmV3IENhdGFsb2dFdmVudCh0aGlzLCBudWxsLAotCQkJCUlDYXRhbG9nRXZlbnQuQ0hBTkdFRCk7Ci0JCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5TGlzdGVuZXJzKElDYXRhbG9nRXZlbnQgZXZlbnQpCi0JewotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWxpc3QuYWRkQWxsKGxpc3RlbmVyTGlzdCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyID0gKElDYXRhbG9nTGlzdGVuZXIpIGkubmV4dCgpOwotCQkJbGlzdGVuZXIuY2F0YWxvZ0NoYW5nZWQoZXZlbnQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5UmVtb3ZlRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWlmIChpc05vdGlmaWNhdGlvbkVuYWJsZWQpCi0JCXsKLQkJCUlDYXRhbG9nRXZlbnQgZXZlbnQgPSBuZXcgQ2F0YWxvZ0V2ZW50KHRoaXMsIGVsZW1lbnQsCi0JCQkJCUlDYXRhbG9nRXZlbnQuRUxFTUVOVF9SRU1PVkVEKTsKLQkJCW5vdGlmeUxpc3RlbmVycyhldmVudCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCkKLQl7Ci0JCWNhdGFsb2dFbGVtZW50cy5yZW1vdmUoZWxlbWVudCk7Ci0JCWludGVybmFsUmVzb2x2ZXIgPSBudWxsOwotCQlub3RpZnlSZW1vdmVFbGVtZW50KGVsZW1lbnQpOwotCQkKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZW1vdmVMaXN0ZW5lcihJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyKQotCXsKLQkJbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlUHVibGljKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotCQkJdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLQl7Ci0JCXJldHVybiBnZXRPckNyZWF0ZUludGVybmFsUmVzb2x2ZXIoKS5yZXNvbHZlUHVibGljKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlU3Vib3JkaW5hdGVDYXRhbG9ncyhpbnQgZW50cnlUeXBlLCBTdHJpbmcgcHVibGljSWQsCi0JCQlTdHJpbmcgc3lzdGVtSWQpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0JewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotCQl7Ci0JCQlJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0JCQlJQ2F0YWxvZyBjYXRhbG9nID0gbmV4dENhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCQl7Ci0JCQkJc3dpdGNoIChlbnRyeVR5cGUpCi0JCQkJewotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlUHVibGljKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTToKLQkJCQkJcmVzdWx0ID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJOgotCQkJCQlyZXN1bHQgPSBjYXRhbG9nLnJlc29sdmVVUkkoc3lzdGVtSWQpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJCXsKLQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlU3lzdGVtKFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLQkJCUlPRXhjZXB0aW9uCi0JewotCQlyZXR1cm4gZ2V0T3JDcmVhdGVJbnRlcm5hbFJlc29sdmVyKCkucmVzb2x2ZVN5c3RlbShzeXN0ZW1JZCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyByZXNvbHZlVVJJKFN0cmluZyB1cmkpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sCi0JCQlJT0V4Y2VwdGlvbgotCXsKLQkJcmV0dXJuIGdldE9yQ3JlYXRlSW50ZXJuYWxSZXNvbHZlcigpLnJlc29sdmVVUkkodXJpKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzYXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0JewotCQljYXRhbG9nTFMuc2F2ZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEJhc2UoU3RyaW5nIGJhc2UpCi0JewotCQl0aGlzLmJhc2UgPSBiYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pCi0JewotCQl0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0Tm90aWZpY2F0aW9uRW5hYmxlZChib29sZWFuIGIpCi0JewotCQlpc05vdGlmaWNhdGlvbkVuYWJsZWQgPSBiOwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnRbXSBnZXRDYXRhbG9nRWxlbWVudHMoKQotCXsKLQkJcmV0dXJuIChJQ2F0YWxvZ0VsZW1lbnRbXSkgY2F0YWxvZ0VsZW1lbnRzLnRvQXJyYXkobmV3IElDYXRhbG9nRWxlbWVudFtjYXRhbG9nRWxlbWVudHMuc2l6ZSgpXSk7Ci0JfQotCQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjQ5Njk2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dDb250cmlidXRvclJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkludmFsaWRSZWdpc3RyeU9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi1wdWJsaWMgY2xhc3MgQ2F0YWxvZ0NvbnRyaWJ1dG9yUmVnaXN0cnlSZWFkZXIKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNhdGFsb2dDb250cmlidXRpb25zIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ09OVFJJQlVUSU9OID0gImNhdGFsb2dDb250cmlidXRpb24iOyAvLyROT04tTkxTLTEkCi0gIC8qCi0gICAqIHRoaXMgaXMgYSBzYW1wbGUgZXhwdGVuc2lvbiAKLSAgICogPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNhdGFsb2dDb250cmlidXRpb25zIj4gCi0gICAqIDxjYXRhbG9nQ29udHJpYnV0aW9uPgotICAgKiAgICA8dXJpCi0gICAqICAgICAgICAgICAgIG5hbWU9Imh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iIAotICAgKiAgICAgICAgICAgICB1cmk9InhzZC9zb2FwLnhzZCIvPiAKLSAgICogICAJPHB1YmxpYwotICAgKiAgICAgICAgICBwdWJsaWNJZD0iLS8vVzNDLy9EVEQgWEhUTUwgMS4xLy9FTiIKLSAgICogICAgICAgICAgdXJpPSJkdGRzL3hodG1sMTEtZmxhdC5kdGQiLz4gCi0gICAqICAJPG5leHRDYXRhbG9nIGlkPSJuZXN0ZWRDYXRhbG9nIiBjYXRhbG9nPSJkYXRhL2NhdGFsb2cxLnhtbCIvPiAKLSAgICogIDwvY2F0YWxvZ0NvbnRyaWJ1dGlvbj4gCi0gICAqICA8L2V4dGVuc2lvbj4KLSAgICogIAotICAgKi8KLSAgcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBkZWNsYXJpbmdFeHRlbnNpb25JZDsKLSAgCi0gIHByb3RlY3RlZCBDYXRhbG9nQ29udHJpYnV0b3JSZWdpc3RyeVJlYWRlcihJQ2F0YWxvZyBhQ2F0YWxvZykKLSAgewotICAgIGNhdGFsb2cgPSBhQ2F0YWxvZzsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGlmIChwb2ludCAhPSBudWxsKQotICAgIHsKLSAgICAgIElDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICByZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFN0cmluZyByZXNvbHZlUGF0aChVUkwgcGxhdGZvcm1VUkwsIFN0cmluZyBwYXRoKSAKLSAgeyAgICAgIAotCVN0cmluZyBmaWxlTG9jYXRpb24gPSBwYXRoOwotCWludCBqYXJQYXRoU3RhcnQgPSBwYXRoLmluZGV4T2YoImphcjoiKTsgLy8kTk9OLU5MUy0xJAotCWphclBhdGhTdGFydCA9IGphclBhdGhTdGFydCA8IDAgPyAwIDogamFyUGF0aFN0YXJ0ICsgImphcjoiLmxlbmd0aCgpOyAvLyROT04tTkxTLTEkCi0JaW50IGphclBhdGhFbmQgPSBwYXRoLmluZGV4T2YoIiEiKTsgLy8kTk9OLU5MUy0xJAotCWphclBhdGhFbmQgPSBqYXJQYXRoRW5kIDwgMCA/IHBhdGgubGVuZ3RoKCkgOiBqYXJQYXRoRW5kOwotCWZpbGVMb2NhdGlvbiA9IHBhdGguc3Vic3RyaW5nKGphclBhdGhTdGFydCwgamFyUGF0aEVuZCk7Ci0JCi0JU3RyaW5nIHJlc3VsdCA9IHBhdGg7Ci0JU3RyaW5nIHJlc29sdmVkTG9jYXRpb24gPSBmaWxlTG9jYXRpb247Ci0JVVJMIHJlc29sdmVkVVJMID0gbnVsbDsKLSAgICBpZiAoZmlsZUxvY2F0aW9uLnN0YXJ0c1dpdGgoInBsYXRmb3JtOi9wbHVnaW4iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIC8vIHRoaXMgaXMgdGhlIHNwZWNsaWFsIGNhc2UsIHdoZXJlIHRoZSByZXNvdXJjZSBpcyBsb2NhdGVkIHJlbGF0aXZlIAotICAgICAgLy8gdG8gYW5vdGhlciBwbHVnaW4gKG5vdCB0aGUgb25lIHRoYXQgZGVjbGFyZXMgdGhlIGV4dGVuc2lvbiBwb2ludCkKLSAgICAgIC8vCi0JCXRyeQotCQl7Ci0JCQlyZXNvbHZlZFVSTCA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChmaWxlTG9jYXRpb24pKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLQkJewotCQkJLy8gZG8gbm90aGluZwotCQl9IAotICAgIH0KLSAgICBlbHNlewotICAgIAkgLy8gdGhpcyBpcyB0aGUgdHlwaWNhbCBjYXNlLCB3aGVyZSB0aGUgcmVzb3VyY2UgaXMgbG9jYXRlZCByZWxhdGl2ZQotICAgICAgICAvLyB0byB0aGUgcGx1Z2luIHRoYXQgZGVjbGFyZXMgdGhlIGV4dGVuc2lvbiBwb2ludAotICAgIAkgdHJ5IHsKLSAgICAJICAgICAJcmVzb2x2ZWRVUkwgPSBuZXcgVVJMKFBsYXRmb3JtLnJlc29sdmUocGxhdGZvcm1VUkwpLCBmaWxlTG9jYXRpb24pOwotICAgIAkgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgIAkgICAgCS8vIGRvIG5vdGhpbmcKLSAgICAJIH0KLSAgICB9Ci0gICAKLSAgIGlmKHJlc29sdmVkVVJMICE9IG51bGwpewotICAgIAlyZXNvbHZlZExvY2F0aW9uID0gcmVzb2x2ZWRVUkwudG9FeHRlcm5hbEZvcm0oKS5yZXBsYWNlKCdcXCcsICcvJyk7Ci0gICAgCXJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlRmlyc3QoZmlsZUxvY2F0aW9uLCByZXNvbHZlZExvY2F0aW9uKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBVUkwgZ2V0UGxhdGZvcm1VUkwoU3RyaW5nIHBsdWdpbklkKXsKLQkgIEJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUocGx1Z2luSWQpOwotCQlpZiAoYnVuZGxlICE9IG51bGwpCi0JCXsKLQkJCVVSTCBidW5kbGVFbnRyeSA9IGJ1bmRsZS5nZXRFbnRyeSgiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkKLQkJCWlmKGJ1bmRsZUVudHJ5ICE9IG51bGwpewotCQkJCXRyeQotCQkJCXsKLQkJCQkJcmV0dXJuIFBsYXRmb3JtLnJlc29sdmUoYnVuZGxlRW50cnkpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0JCQkJewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIHJlc29sdmVQYXRoKFN0cmluZyBwYXRoKQotICB7Ci0JICByZXR1cm4gcmVzb2x2ZVBhdGgoZ2V0UGxhdGZvcm1VUkwoZGVjbGFyaW5nRXh0ZW5zaW9uSWQpLCBwYXRoKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgdHJ5Ci0gICAgewotCSAgZGVjbGFyaW5nRXh0ZW5zaW9uSWQgPSBlbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpOwotICAgIH0KLSAgICBjYXRjaCAoSW52YWxpZFJlZ2lzdHJ5T2JqZWN0RXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKFRBR19DT05UUklCVVRJT04uZXF1YWxzKGVsZW1lbnQuZ2V0TmFtZSgpKSl7Ci0gICAgCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCW1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCW1hcHBpbmdJbmZvRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJKTsKLSAgICAJcHJvY2Vzc01hcHBpbmdJbmZvRWxlbWVudHMobWFwcGluZ0luZm9FbGVtZW50TGlzdCk7Ci0gICAgCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIG5leHRDYXRhbG9nRWxlbWVudExpc3QgPSBlbGVtZW50LmdldENoaWxkcmVuKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfTkVYVF9DQVRBTE9HKTsKLSAgICAJcHJvY2Vzc05leHRDYXRhbG9nRWxlbWVudHMobmV4dENhdGFsb2dFbGVtZW50TGlzdCk7Ci0gICAgCQotICAgIH0KLSAgICAKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzTWFwcGluZ0luZm9FbGVtZW50cyhJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBjaGlsZEVsZW1lbnRMaXN0KQotICB7Ci0gICAgaWYgKGNhdGFsb2cgPT0gbnVsbCkKLSAgICAgIHJldHVybjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRWxlbWVudExpc3QubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNoaWxkRWxlbWVudCA9IGNoaWxkRWxlbWVudExpc3RbaV07Ci0gICAgICBTdHJpbmcgbmFtZSA9IGNoaWxkRWxlbWVudC5nZXROYW1lKCk7Ci0gICAgICBTdHJpbmcga2V5ID0gbnVsbDsKLQkKLSAgICAgIGludCB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLSAgICAgIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1BVQkxJQy5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIGtleSA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpOwotICAgICAgICB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJLmVxdWFscyhuYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FKTsKLSAgICAgICAgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9VUkk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRy5lcXVhbHMobmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHByb2Nlc3NOZXh0Q2F0YWxvZ0VsZW1lbnRzKG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXXtjaGlsZEVsZW1lbnR9KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoa2V5ID09IG51bGwgfHwga2V5LmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgU3RyaW5nIGVudHJ5VVJJID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkkpOyAvLyBtYW5kYXRvcnkKLSAgICAgIGlmIChlbnRyeVVSSSA9PSBudWxsIHx8IGVudHJ5VVJJLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfdXJpX25vdF9zZXQpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0gICAgICBpZiAoY2F0YWxvZ0VsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KQotICAgICAgewotICAgICAgICBJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gKElDYXRhbG9nRW50cnkpIGNhdGFsb2dFbGVtZW50OwotICAgICAgICBlbnRyeS5zZXRLZXkoa2V5KTsKLQkJU3RyaW5nIHJlc29sdmVkUGF0aCA9IHJlc29sdmVQYXRoKGVudHJ5VVJJKTsKLQkJZW50cnkuc2V0VVJJKHJlc29sdmVkUGF0aCk7Ci0gICAgICAgIFN0cmluZyBpZCA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOyAvLyBvcHRpb25hbAotICAgICAgICBpZiAoaWQgIT0gbnVsbCAmJiAhaWQuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgZW50cnkuc2V0SWQoaWQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBwcm9jZXNzIGFueSBvdGhlciBhdHRyaWJ1dGVzCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBjaGlsZEVsZW1lbnQuZ2V0QXR0cmlidXRlTmFtZXMoKVtqXTsKLSAgICAgICAgaWYgKCFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRykgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQkFTRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gY2hpbGRFbGVtZW50LmdldEF0dHJpYnV0ZShhdHRyTmFtZSk7Ci0gICAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmICFhdHRyVmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhdGFsb2dFbGVtZW50LnNldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChjYXRhbG9nRWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOZXh0Q2F0YWxvZ0VsZW1lbnRzKElDb25maWd1cmF0aW9uRWxlbWVudFtdIGNoaWxkRWxlbWVudExpc3QpCi0gIHsKLSAgICBpZiAoY2F0YWxvZyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRFbGVtZW50TGlzdC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnQgY2hpbGRFbGVtZW50ID0gY2hpbGRFbGVtZW50TGlzdFtpXTsKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRyk7IC8vIG1hbmRhdG9yeQotICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0KTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSBuZXcgTmV4dENhdGFsb2coKTsKLQkgIFN0cmluZyByZXNvbHZlZFBhdGggPSByZXNvbHZlUGF0aChsb2NhdGlvbik7Ci0gICAgICBuZXh0Q2F0YWxvZy5zZXRDYXRhbG9nTG9jYXRpb24ocmVzb2x2ZWRQYXRoKTsKLQkgIFN0cmluZyBpZCA9IGNoaWxkRWxlbWVudC5nZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOwotCSAgaWYgKGlkICE9IG51bGwgJiYgIWlkLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgCi0JCSAgbmV4dENhdGFsb2cuc2V0SWQoaWQpOwotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChuZXh0Q2F0YWxvZyk7Ci0gICAgfQotICB9Ci0gIAotIAotIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZmQwOGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci0KLQotcHVibGljIGNsYXNzIENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0JaW50IHR5cGU7Ci0KLQlTdHJpbmcgaWQ7Ci0KLQlNYXAgYXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlJQ2F0YWxvZyBvd25lckNhdGFsb2c7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0VsZW1lbnQoaW50IGFUeXBlKQotCXsKLQkJc3VwZXIoKTsKLQkJdHlwZSA9IGFUeXBlOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VHlwZSgpCi0JewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lKQotCXsKLQkJcmV0dXJuIChTdHJpbmcpIGF0dHJpYnV0ZXMuZ2V0KG5hbWUpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZVZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0JewotCQlhdHRyaWJ1dGVzLnB1dChuYW1lLCB2YWx1ZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZXMoKQotCXsKLQkJQ29sbGVjdGlvbiBjID0gYXR0cmlidXRlcy52YWx1ZXMoKTsKLQkJU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1tjLnNpemUoKV07Ci0JCWF0dHJpYnV0ZXMua2V5U2V0KCkudG9BcnJheShyZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotCXsKLQkJcmV0dXJuIGlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkKLQl7Ci0JCXRoaXMuaWQgPSBpZDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2cgZ2V0T3duZXJDYXRhbG9nKCkKLQl7Ci0JCXJldHVybiBvd25lckNhdGFsb2c7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0T3duZXJDYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpCi0JewotCQl0aGlzLm93bmVyQ2F0YWxvZyA9IGNhdGFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgbWFrZUFic29sdXRlKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBsb2NhdGlvbikKLQl7Ci0JCVVSTCBsb2NhbCA9IG51bGw7Ci0JCWxvY2F0aW9uID0gbG9jYXRpb24ucmVwbGFjZSgnXFwnLCAnLycpOwotCQl0cnkKLQkJewotCQkJVVJMIGJhc2VVUkwgPSBuZXcgVVJMKGJhc2VMb2NhdGlvbik7Ci0JCQlsb2NhbCA9IG5ldyBVUkwoYmFzZVVSTCwgbG9jYXRpb24pOwotCQl9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLQkJewotCQl9Ci0KLQkJaWYgKGxvY2FsICE9IG51bGwpCi0JCXsKLQkJCXJldHVybiBsb2NhbC50b1N0cmluZygpOwotCQl9IGVsc2UKLQkJewotCQkJcmV0dXJuIGxvY2F0aW9uOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoU3RyaW5nIHBhdGgpCi0JewotCQl0cnkKLQkJewotCQkJVVJJIHVyaSA9IG5ldyBVUkkocGF0aCk7Ci0JCQlpZiAodXJpLmlzQWJzb2x1dGUoKSkKLQkJCXsKLQkJCQlyZXR1cm4gcGF0aDsKLQkJCX0KLQkJfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpCi0JCXsKLQkJfQotCi0JCVN0cmluZyByZXN1bHQgPSBwYXRoOwotCQlDYXRhbG9nIGNhdGFsb2cgPSAoQ2F0YWxvZykgZ2V0T3duZXJDYXRhbG9nKCk7Ci0JCWlmIChjYXRhbG9nICE9IG51bGwpCi0JCXsKLQkJCVN0cmluZyBiYXNlID0gY2F0YWxvZy5nZXRCYXNlKCk7Ci0JCQlpZiAoYmFzZSA9PSBudWxsIHx8IGJhc2UuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCWJhc2UgPSBjYXRhbG9nLmdldExvY2F0aW9uKCk7Ci0JCQl9Ci0JCQlyZXN1bHQgPSBtYWtlQWJzb2x1dGUoYmFzZSwgcGF0aCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JICAvKgotCSAgICogU2luY2Ugd2UgZG9uJ3QgaGF2ZSBldmVudHMgbm90aWZpY2F0aW9ucyBmb3IgZW50cnkgcHJvcGVydGllcywgY2xvbmUoKQotCSAgICogY291bGQgYWxsb3cgdG8gY29weSBhbmQgZWRpdCBlbnRyeSBhbmQgdGhlbiByZXBsYWNlIGl0IGluIGNhdGFsb2cuIEVudHJ5Ci0JICAgKiByZXBsYWNlbWVudCB3aWxsIHNpZ25hbCBJQ2F0YWxvZ0V2ZW50IEByZXR1cm4KLQkgICAqLwotCSAgcHVibGljIE9iamVjdCBjbG9uZSgpCi0JICB7Ci0JCUlDYXRhbG9nRWxlbWVudCBlbGVtZW50ID0gb3duZXJDYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotCSAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gZ2V0QXR0cmlidXRlcygpOyAgIAotCSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspCi0JICAgIHsKLQkgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2ldOwotCSAgICAgIFN0cmluZyBhdHRyVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSk7Ci0JICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLQkgICAgfQotCQllbGVtZW50LnNldE93bmVyQ2F0YWxvZyhvd25lckNhdGFsb2cpOwotCQllbGVtZW50LnNldElkKGlkKTsKLQkgICAgcmV0dXJuIGVsZW1lbnQ7Ci0JICB9Ci0KLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFbnRyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MjQzNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnkgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudCBpbXBsZW1lbnRzIElDYXRhbG9nRW50cnksIENsb25lYWJsZQotewotICBpbnQgZW50cnlUeXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLSAgU3RyaW5nIGtleTsKLSAgU3RyaW5nIHVyaTsKLQotICBwcm90ZWN0ZWQgQ2F0YWxvZ0VudHJ5KGludCBhbkVudHJ5VHlwZSkKLSAgewotICAgIHN1cGVyKElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKTsKLSAgICBlbnRyeVR5cGUgPSBhbkVudHJ5VHlwZTsKLSAgfQotCi0gIHByb3RlY3RlZCBDYXRhbG9nRW50cnkoKQotICB7Ci0gICAgc3VwZXIoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RW50cnlUeXBlKGludCB2YWx1ZSkKLSAgewotICAgIGVudHJ5VHlwZSA9IHZhbHVlOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbnRyeVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGVudHJ5VHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBrZXkgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkKLSAgewotICAgIHJldHVybiBrZXk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRVUkkoU3RyaW5nIHZhbHVlKQotICB7Ci0gICAgdXJpID0gdmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotICAgIENhdGFsb2dFbnRyeSBlbnRyeSA9IChDYXRhbG9nRW50cnkpc3VwZXIuY2xvbmUoKTsKLQllbnRyeS5zZXRFbnRyeVR5cGUoZW50cnlUeXBlKTsKLSAgICBlbnRyeS5zZXRLZXkoa2V5KTsKLSAgICBlbnRyeS5zZXRVUkkodXJpKTsKLSAgICByZXR1cm4gZW50cnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0V2ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMmY2M2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0V2ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci0KLQotcHVibGljIGNsYXNzIENhdGFsb2dFdmVudCBpbXBsZW1lbnRzIElDYXRhbG9nRXZlbnQKLXsKLSAgcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0gIHByb3RlY3RlZCBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQ7Ci0gIHByb3RlY3RlZCBpbnQgZXZlbnRUeXBlOwotCi0gIHB1YmxpYyBDYXRhbG9nRXZlbnQoQ2F0YWxvZyBjYXRhbG9nLCBJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCwgaW50IGV2ZW50VHlwZSkKLSAgewotICAgIHRoaXMuY2F0YWxvZyA9IGNhdGFsb2c7Ci0gICAgdGhpcy5jYXRhbG9nRWxlbWVudCA9IGVsZW1lbnQ7Ci0gICAgdGhpcy5ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gIH0KLQotICBwdWJsaWMgSUNhdGFsb2cgZ2V0Q2F0YWxvZygpCi0gIHsKLSAgICByZXR1cm4gY2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0Q2F0YWxvZ0VsZW1lbnQoKQotICB7Ci0gICAgcmV0dXJuIGNhdGFsb2dFbGVtZW50OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIGV2ZW50VHlwZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1JlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzE3ZDc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIAotICogCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBDYXRhbG9nUmVhZGVyCi17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWFkKENhdGFsb2cgeG1sQ2F0YWxvZywgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgcGFyc2VyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShpbnB1dCksIG5ldyBDYXRhbG9nQ29udGVudEhhbmRsZXIoeG1sQ2F0YWxvZykpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIExvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIENhdGFsb2dDb250ZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ2F0YWxvZyBjYXRhbG9nOwotICAgIHByb3RlY3RlZCBTdGFjayBiYXNlVVJJU3RhY2sgPSBuZXcgU3RhY2soKTsKLQotICAgIHB1YmxpYyBDYXRhbG9nQ29udGVudEhhbmRsZXIoQ2F0YWxvZyB4bWxDYXRhbG9nKQotICAgIHsKLSAgICAgIHRoaXMuY2F0YWxvZyA9IHhtbENhdGFsb2c7Ci0gICAgICBiYXNlVVJJU3RhY2sucHVzaCh4bWxDYXRhbG9nLmdldEJhc2UoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgLy8gc2V0IGJhc2UKLSAgICAgIFN0cmluZyBiYXNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQkFTRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChiYXNlICE9IG51bGwgJiYgIWJhc2UuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICAgIGJhc2VVUklTdGFjay5wdXNoKGJhc2UpOyAgICAKLSAgICAgIH0KLQotCSAgLy8gcHJvY2Vzc2luZyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSBzdGFydAotCSAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5UQUdfVVNFUl9FTlRSWSkpCi0gICAgICB7Ci0JCWludCB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgQ29tcGF0YWJpbGl0eUNvbnN0YW50cy5BVFRfVFlQRSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHR5cGVOYW1lICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAodHlwZU5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZSgiU1lTVEVNIikgPT0gMCkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIHR5cGUgPSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfU1lTVEVNOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCQkgIElDYXRhbG9nRWxlbWVudCBjYXRhbG9nRWxlbWVudCA9IGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQodHlwZSk7Ci0JICAgICAgaWYgKGNhdGFsb2dFbGVtZW50IGluc3RhbmNlb2YgQ2F0YWxvZ0VudHJ5KQotCSAgICAgIHsKLQkgICAgICAgIENhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoQ2F0YWxvZ0VudHJ5KSBjYXRhbG9nRWxlbWVudDsKLQkJICAgIFN0cmluZyBrZXkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9JRCk7ICAgCQkgICAgIC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGNhdGFsb2dFbnRyeS5zZXRLZXkoa2V5KTsKLQkgICAgICAgIFN0cmluZyBlbnRyeVVyaSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIENvbXBhdGFiaWxpdHlDb25zdGFudHMuQVRUX1VSSSk7ICAgIC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIGNhdGFsb2dFbnRyeS5zZXRVUkkoVVJJSGVscGVyLmVuc3VyZVVSSVByb3RvY29sRm9ybWF0KGVudHJ5VXJpKSk7ICAKLQkgICAgICAgIFN0cmluZyB3ZWJVUkwgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBDb21wYXRhYmlsaXR5Q29uc3RhbnRzLkFUVF9XRUJfVVJMKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHdlYlVSTCAhPSBudWxsKQotCQkJewotCQkJCWNhdGFsb2dFbnRyeS5zZXRBdHRyaWJ1dGVWYWx1ZSgKLQkJCQkJCUlDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMLCB3ZWJVUkwpOwotCQkJfQotCSAgICAgIH0KLQkJICBjYXRhbG9nLmFkZENhdGFsb2dFbGVtZW50KGNhdGFsb2dFbGVtZW50KTsKLQkJICByZXR1cm47Ci0gICAgICB9Ci0JICAvLyAgcHJvY2Vzc2luZyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eSBzdGFydAotICAgICAgCi0JICBpbnQgdHlwZSA9IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0JICBTdHJpbmcga2V5ID0gbnVsbDsKLQkgLy9kdyBTdHJpbmcgY2F0YWxvZ0lkID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQpOwotICAgICAgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICBrZXkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX1NZU1RFTS5lcXVhbHMobG9jYWxOYW1lKSkKLSAgICAgIHsKLSAgICAgICAga2V5ID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiIiwgT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfU1lTVEVNX0lEKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICBrZXkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB0eXBlID0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfTkVYVF9DQVRBTE9HLmVxdWFscyhsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmV4dENhdGFsb2dJZCA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0lEKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIiIsIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0cpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIE5leHRDYXRhbG9nIGRlbGVnYXRlID0gbmV3IE5leHRDYXRhbG9nKCk7Ci0gICAgICAgIGRlbGVnYXRlLnNldENhdGFsb2dMb2NhdGlvbihsb2NhdGlvbik7ICAKLSAgICAgICAgZGVsZWdhdGUuc2V0SWQobmV4dENhdGFsb2dJZCk7Ci0gICAgICAgIGNhdGFsb2cuYWRkQ2F0YWxvZ0VsZW1lbnQoZGVsZWdhdGUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBlbHNlewotICAgIAkgIC8vIGRvIG5vdCBoYW5kbGUgb3RoZXIgZW50cmllcwotICAgIAkgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCBrZXkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfa2V5X25vdF9zZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgZW50cnlVUkkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCIiLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkkpOyAvLyBtYW5kYXRvcnkgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGVudHJ5VVJJID09IG51bGwgfHwgZW50cnlVUkkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfZW50cnlfdXJpX25vdF9zZXQpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gCi0gICAgICBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBjYXRhbG9nLmNyZWF0ZUNhdGFsb2dFbGVtZW50KHR5cGUpOwotICAgICAgaWYgKGNhdGFsb2dFbGVtZW50IGluc3RhbmNlb2YgQ2F0YWxvZ0VudHJ5KQotICAgICAgewotICAgICAgICBDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKENhdGFsb2dFbnRyeSkgY2F0YWxvZ0VsZW1lbnQ7Ci0gICAgICAgIGNhdGFsb2dFbnRyeS5zZXRLZXkoa2V5KTsgCi0gICAgICAgIGNhdGFsb2dFbnRyeS5zZXRVUkkoVVJJSGVscGVyLmVuc3VyZVVSSVByb3RvY29sRm9ybWF0KGVudHJ5VVJJKSk7ICAgICAKLSAgICAgIH0KLSAgICAgIC8vIHByb2Nlc3MgYW55IG90aGVyIGF0dHJpYnV0ZXMKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzLmdldExvY2FsTmFtZShqKTsKLSAgICAgICAgaWYgKCFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfVVJJKSAmJiAhYXR0ck5hbWUuZXF1YWxzKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX05BTUUpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfUFVCTElDX0lEKQotICAgICAgICAgICAgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQpICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQ0FUQUxPRykgJiYgIWF0dHJOYW1lLmVxdWFscyhPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCkKLSAgICAgICAgICAgICYmICFhdHRyTmFtZS5lcXVhbHMoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfQkFTRSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgYXR0clZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShhdHRyTmFtZSk7Ci0gICAgICAgICAgaWYgKGF0dHJWYWx1ZSAhPSBudWxsICYmICFhdHRyVmFsdWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNhdGFsb2dFbGVtZW50LnNldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lLCBhdHRyVmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgY2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChjYXRhbG9nRWxlbWVudCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmIChiYXNlVVJJU3RhY2suc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgYmFzZVVSSVN0YWNrLnBvcCgpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgfSAgCi0gIAotICAvLyBmb3IgYmFja3dhcmQgY29tcGF0YWJpbGl0eQotICBpbnRlcmZhY2UgQ29tcGF0YWJpbGl0eUNvbnN0YW50c3sKLQkgIAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX1hNTF9DQVRBTE9HX1NFVFRJTkdTID0gIlhNTENhdGFsb2dTZXR0aW5ncyI7IC8vJE5PTi1OTFMtMSQKLQkgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19JRF9VU0VSX0VOVFJJRVMgPSAiVXNlckVudHJpZXMiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfVVNFUl9FTlRSWSA9ICJVc2VyRW50cnkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJUWVBFIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0lEID0gIklEIjsgLy8kTk9OLU5MUy0xJAotCSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX1VSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0JICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfV0VCX1VSTCA9ICJXRUJfVVJMIjsgLy8kTk9OLU5MUy0xJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMjBlNTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ1NldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLQotcHVibGljIGNsYXNzIENhdGFsb2dTZXQgewotCXByb3RlY3RlZCBNYXAgdXJpUmVzb3VyY2VNYXAgPSBuZXcgSGFzaE1hcCgpOwotCXByb3RlY3RlZCBNYXAgY2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb25zID0gbmV3IEhhc2hNYXAoKTsKLQlwdWJsaWMgQ2F0YWxvZ1NldCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIGEgQ2F0YWxvZyB3aXRoIHRoZSBnaXZlbiBJRC4gIElmIG9uZSBpcyBub3QgZm91bmQsIGNyZWF0ZSBvbmUgYXQgdGhlIGdpdmVuIFVSSS4KLQkgKiAKLQkgKiBAcGFyYW0gaWQKLQkgKiBAcGFyYW0gdXJpIC0gdGhlIFVSSSwgdGhlIHBhcmVudCBvZiB0aGlzIGZpbGUgcGF0aCBtdXN0IGFscmVhZHkgZXhpc3QKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENhdGFsb2cgbG9va3VwT3JDcmVhdGVDYXRhbG9nKFN0cmluZyBpZCwgU3RyaW5nIHVyaSkgewotCQlDYXRhbG9nIGNhdGFsb2cgPSBnZXRDYXRhbG9nKGlkLCB1cmkpOwotCQlpZiAoY2F0YWxvZyA9PSBudWxsKSB7Ci0JCQljYXRhbG9nID0gbmV3IENhdGFsb2codGhpcywgaWQsIHVyaSk7Ci0JCQl0cnkgewotCQkJCWNhdGFsb2cubG9hZCgpOwotCQkJCXVyaVJlc291cmNlTWFwLnB1dCh1cmksIGNhdGFsb2cpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gd2UgY2F0Y2ggYW5kIGxvZyBhbGwgZXhjZXB0aW9ucywgdG8gZGlzYWxsb3cKLQkJCQkvLyBvbmUgYmFkIGV4dGVuc2lvbiBpbnRlcmZlcmluZyB3aXRoIG90aGVycwotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oImVycm9yIGxvYWRpbmcgY2F0YWxvZzogIiArIGlkICsgIiAiICsgdXJpLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNhdGFsb2c7Ci0JfQotCi0JcHJpdmF0ZSBDYXRhbG9nIGdldENhdGFsb2coU3RyaW5nIGlkLCBTdHJpbmcgdXJpKSB7Ci0JCXJldHVybiAoQ2F0YWxvZykgdXJpUmVzb3VyY2VNYXAuZ2V0KHVyaSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oU3RyaW5nIGxvZ2ljYWxVUkksIFN0cmluZyBhY3R1YWxVUkkpIHsKLQkJY2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb25zLnB1dChsb2dpY2FsVVJJLCBhY3R1YWxVUkkpOwotCX0KLQotCS8vIE5ldmVyIHVzZWQ/Ci0JcHVibGljIFN0cmluZyBnZXRDYXRhbG9nUGVyc2lzdGVuY2VMb2NhdGlvbihTdHJpbmcgaWQpIHsKLQkJcmV0dXJuIChTdHJpbmcpIGNhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9ucy5nZXQoaWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dXcml0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0MTUwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9DYXRhbG9nV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLS8qKgotICogV3JpdGUgT0FTSVMgWE1MIENhdGFsb2cgZm9ybWF0Ci0gKiAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENhdGFsb2dXcml0ZXIKLXsKLSAgcHJpdmF0ZSBEb2N1bWVudCBkb2M7Ci0KLSAgcHVibGljIHZvaWQgd3JpdGUoSUNhdGFsb2cgeG1sQ2F0YWxvZywgU3RyaW5nIHVyaSkgdGhyb3dzIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIHZpc2l0Q2F0YWxvZyh4bWxDYXRhbG9nKTsKLSAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gZ2V0T3V0cHV0U3RyZWFtKHVyaSk7Ci0gICAgc2VyaWFsaXplKG91dHB1dFN0cmVhbSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZShJQ2F0YWxvZyBjYXRhbG9nLCBPdXRwdXRTdHJlYW0gb3MpIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoY2F0YWxvZyAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0Q2F0YWxvZyhjYXRhbG9nKTsKLSAgICAgIHNlcmlhbGl6ZShvcyk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHZpc2l0Q2F0YWxvZyhJQ2F0YWxvZyB4bWxDYXRhbG9nKQotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZG9jID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld0RvY3VtZW50QnVpbGRlcigpLm5ld0RvY3VtZW50KCk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLSAgICB9Ci0gICAgaWYgKGRvYyA9PSBudWxsKQotICAgICAgcmV0dXJuOwotICAgIEVsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5uYW1lc3BhY2VOYW1lLCBPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX0NBVEFMT0cpOwotICAgIGRvYy5hcHBlbmRDaGlsZChjYXRhbG9nRWxlbWVudCk7Ci0gICAgcHJvY2Vzc0NhdGFsb2dFbnRyaWVzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgICBwcm9jZXNzTmV4dENhdGFsb2dzKHhtbENhdGFsb2csIGNhdGFsb2dFbGVtZW50KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2F0YWxvZ0VudHJpZXMoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICBJQ2F0YWxvZ0VudHJ5W10gY2F0YWxvZ0VudHJpZXMgPSBjYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCk7Ci0gIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0YWxvZ0VudHJpZXMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGNhdGFsb2dFbnRyaWVzW2ldOwotICAgICAgU3RyaW5nIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgU3RyaW5nIHVyaSA9IGVudHJ5LmdldFVSSSgpOwotCSAgU3RyaW5nIGlkID0gZW50cnkuZ2V0SWQoKTsKLQkgIEVsZW1lbnQgY2hpbGRFbGVtZW50ID0gbnVsbDsKLQkgCi0gICAgIHN3aXRjaCAoZW50cnkuZ2V0RW50cnlUeXBlKCkpCi0gICAgICB7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfUFVCTElDKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9QVUJMSUNfSUQsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfU1lTVEVNKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9TWVNURU1fSUQsIGtleSk7Ci0gICAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX1VSSSwgdXJpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSSA6Ci0gICAgICAgICAgY2hpbGRFbGVtZW50ID0gcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5UQUdfVVJJKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9OQU1FLCBrZXkpOwotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9VUkksIHVyaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0IDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQkgIGlmKGNoaWxkRWxlbWVudCAhPSBudWxsICYmIGlkICE9IG51bGwgJiYgIWlkLmVxdWFscygiIikpeyAvLyROT04tTkxTLTEkCi0JCSAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShPQVNJU0NhdGFsb2dDb25zdGFudHMuQVRUUl9JRCwgaWQpOwotCSAgfQotICAgICAgCi0gICAgICBTdHJpbmdbXSBhdHRyaWJ1dGVzID0gZW50cnkuZ2V0QXR0cmlidXRlcygpOyAgIAotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBhdHRyaWJ1dGVzW2pdOwotICAgICAgICBpZiAoYXR0ck5hbWUgIT0gbnVsbCAmJiAhYXR0ck5hbWUuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0JCSAgU3RyaW5nIGF0dHJWYWx1ZSA9IGVudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKGF0dHJOYW1lKTsKLSAgICAgICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwgJiYgYXR0clZhbHVlICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgY2hpbGRFbGVtZW50LnNldEF0dHJpYnV0ZShhdHRyTmFtZSwgYXR0clZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChjaGlsZEVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKGNoaWxkRWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NOZXh0Q2F0YWxvZ3MoSUNhdGFsb2cgY2F0YWxvZywgRWxlbWVudCBwYXJlbnQpCi0gIHsKLSAgICAvLyBoYW5kbGUgY2F0YWxvZyBlbnRyaWVzCi0gICAgSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gY2F0YWxvZy5nZXROZXh0Q2F0YWxvZ3MoKTsKLSAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9IG51bGw7Ci0gICAvL2R3IFN0cmluZyBhdHRyVmFsdWUgPSBudWxsOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIElOZXh0Q2F0YWxvZyBkZWxlZ2F0ZSA9IG5leHRDYXRhbG9nc1tpXTsKLSAgICAgIGNoaWxkRWxlbWVudCA9IHBhcmVudC5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlRWxlbWVudChPQVNJU0NhdGFsb2dDb25zdGFudHMuVEFHX05FWFRfQ0FUQUxPRyk7Ci0gICAgICBpZiAoY2hpbGRFbGVtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZEVsZW1lbnQpOwotICAgICAgICBTdHJpbmcgbG9jYXRpb24gPSBkZWxlZ2F0ZS5nZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjaGlsZEVsZW1lbnQuc2V0QXR0cmlidXRlKE9BU0lTQ2F0YWxvZ0NvbnN0YW50cy5BVFRSX0NBVEFMT0csIGxvY2F0aW9uKTsKLSAgICAgICAgfQotCQkgU3RyaW5nIGlkID0gZGVsZWdhdGUuZ2V0SWQoKTsKLQkJIGlmIChpZCAhPSBudWxsKQotCQkgewotCQkJIGNoaWxkRWxlbWVudC5zZXRBdHRyaWJ1dGUoT0FTSVNDYXRhbG9nQ29uc3RhbnRzLkFUVFJfSUQsIGlkKTsKLQkJIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgc2VyaWFsaXplKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBGaWxlTm90Rm91bmRFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgICByZXR1cm47Ci0gICAgdHJ5Ci0gICAgewotICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuSU5ERU5ULCAieWVzIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KE91dHB1dEtleXMuTUVUSE9ELCAieG1sIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIC8vIFVubGVzcyBhIHdpZHRoIGlzIHNldCwgdGhlcmUgd2lsbCBiZSBvbmx5IGxpbmUgYnJlYWtzIGJ1dCBubwotICAgICAgLy8gaW5kZW50YXRpb24uCi0gICAgICAvLyBUaGUgSUJNIEpESyBhbmQgdGhlIFN1biBKREsgZG9uJ3QgYWdyZWUgb24gdGhlIHByb3BlcnR5IG5hbWUsCi0gICAgICAvLyBzbyB3ZSBzZXQgdGhlbSBib3RoLgotICAgICAgLy8KLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hhbGFufWluZGVudC1hbW91bnQiLCAiMiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFByb3BlcnR5KCJ7aHR0cDovL3htbC5hcGFjaGUub3JnL3hzbHR9aW5kZW50LWFtb3VudCIsICIyIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIGVuY29kaW5nID0gIlVURi04IjsgLy8gVEJEIC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChlbmNvZGluZyAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkVOQ09ESU5HLCBlbmNvZGluZyk7Ci0gICAgICB9Ci0gICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2MpLCBuZXcgU3RyZWFtUmVzdWx0KG91dHB1dFN0cmVhbSkpOwotICAgIH0KLSAgICBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShTdHJpbmcgdXJpKSB0aHJvd3MgRmlsZU5vdEZvdW5kRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZpbGVQYXRoID0gcmVtb3ZlUHJvdG9jb2wodXJpKTsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZShmaWxlUGF0aCk7Ci0gICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotICAgIHJldHVybiBzdHJlYW07Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlbW92ZVByb3RvY29sKFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOyAgCi0gICAgU3RyaW5nIHByb3RvY29sX3BhdHRlcm4gPSAiOiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YocHJvdG9jb2xfcGF0dGVybik7Ci0gICAgICBpZiAoaW5kZXggPiAyKQotICAgICAgewotICAgICAgICByZXN1bHQgPSByZXN1bHQuc3Vic3RyaW5nKGluZGV4ICsgcHJvdG9jb2xfcGF0dGVybi5sZW5ndGgoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL05leHRDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjBmMjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvTmV4dENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgUmFqIE1hbmRheWFtLCBJQk0KLSAqICAgICAgICAgICAxMzY0MDAgTmV4dENhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKSB0YWtlcyBhIGxvdCBvZiB0aW1lIGNvbXB1dGluZyBjb25zdGFudCBpbmZvcm1hdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotCi0KLXB1YmxpYyBjbGFzcyBOZXh0Q2F0YWxvZyBleHRlbmRzIENhdGFsb2dFbGVtZW50IGltcGxlbWVudHMgSU5leHRDYXRhbG9nCi17Ci0gIHByaXZhdGUgU3RyaW5nIGxvY2F0aW9uOwotICBwcml2YXRlIElDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nOwotCi0gIHB1YmxpYyBOZXh0Q2F0YWxvZygpCi0gIHsKLSAgICBzdXBlcihJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpOwotICB9Ci0gICAgCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkKLSAgewotICAgIHJldHVybiBsb2NhdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBJQ2F0YWxvZyBnZXRSZWZlcmVuY2VkQ2F0YWxvZygpCi0gIHsKLSAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZWZlcmVuY2VkQ2F0YWxvZyA9ICgoQ2F0YWxvZylvd25lckNhdGFsb2cpLmdldENhdGFsb2dTZXQoKS5sb29rdXBPckNyZWF0ZUNhdGFsb2coZ2V0SWQoKSwgZ2V0QWJzb2x1dGVQYXRoKGxvY2F0aW9uKSk7Ci0gICAgfQotICAgIHJldHVybiByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldENhdGFsb2dMb2NhdGlvbihTdHJpbmcgdXJpKQotICB7Ci0gICAgbG9jYXRpb24gPSB1cmk7Ci0gICAgcmVmZXJlbmNlZENhdGFsb2cgPSBudWxsOwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0IGNsb25lKCkKLSAgewotCU5leHRDYXRhbG9nIG5leHRDYXRhbG9nID0gKE5leHRDYXRhbG9nKXN1cGVyLmNsb25lKCk7Ci0JbmV4dENhdGFsb2cuc2V0Q2F0YWxvZ0xvY2F0aW9uKGxvY2F0aW9uKTsKLSAgICByZXR1cm4gbmV4dENhdGFsb2c7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL09BU0lTQ2F0YWxvZ0NvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvT0FTSVNDYXRhbG9nQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYTA3NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvT0FTSVNDYXRhbG9nQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1wdWJsaWMgaW50ZXJmYWNlIE9BU0lTQ2F0YWxvZ0NvbnN0YW50cwotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBuYW1lc3BhY2VOYW1lID0gInVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUeXBlcyBvZiB0aGUgY2F0YWxvZyBlbnRyaWVzICovCi0gIC8qKiBUaGUgQ0FUQUxPRyBlbGVtZW50IG5hbWUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DQVRBTE9HID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgR1JPVVAgY2F0YWxvZyBlbnRyeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0dST1VQID0gImdyb3VwIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFBVQkxJQyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfUFVCTElDID0gInB1YmxpYyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqIFRoZSBTWVNURU0gY2F0YWxvZyBldG5yeS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX1NZU1RFTSA9ICJzeXN0ZW0iOyAvLyROT04tTkxTLTEkCi0gIC8qKiBUaGUgVVJJIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19VUkkgPSAidXJpIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFJFV1JJVEVfU1lTVEVNIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVdSSVRFX1NZU1RFTSA9ICJyZXdyaXRlU3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIFJFV1JJVEVfVVJJIGNhdGFsb2cgZW50cnkuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19SRVdSSVRFX1VSSSA9ICJyZXdyaXRlUHVibGljIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1BVQkxJQyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfUFVCTElDID0gImRlbGVnYXRlUHVibGljIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1NZU1RFTSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfU1lTVEVNID0gImRlbGVnYXRlU3lzdGVtIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIERFTEVHQVRFX1VSSSBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfREVMRUdBVEVfVVJJID0gImRlbGVnYXRlVXJpIjsgLy8kTk9OLU5MUy0xJAotICAvKiogVGhlIE5FWFRfQ0FUQUxPRyBjYXRhbG9nIGVudHJ5LiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfTkVYVF9DQVRBTE9HID0gIm5leHRDYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlcyAqLwotICAvKiogQXR0cmlidXRlIGlkIHVzZWQgaW4gYWxsIGNhdGFsb2cgZW50cmllcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0lEID0gImlkIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlIGlkIGJhc2UgaW4gYWxsIGNhdGFsb2cgZW50cmllcyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX0JBU0UgPSAieG1sOmJhc2UiOyAvLyROT04tTkxTLTEkCi0gIC8qKiBBdHRyaWJ1dGUgaWQgcHJlZmVyZSBpbiBjYXRhbG9nIGVudHJpZXM6IENBVEFMT0csIEdST1VQICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFJFRkVSRSA9ICJwcmVmZXJlIjsgLy8kTk9OLU5MUy0xJAotICAvKiogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFBVQkxJQyAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1BVQkxJQ19JRCA9ICJwdWJsaWNJZCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBTWVNURU0KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfU1lTVEVNX0lEID0gInN5c3RlbUlkIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IFVSSQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9OQU1FID0gIm5hbWUiOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUFVCTElDLCBVUkkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfVVJJID0gInVyaSI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBSRVdSSVRFX1NZU1RFTSwgREVMRUdBVEVfU1lTVEVNCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1NZU1RFTV9JRF9TVEFSVF9TVFJJTkcgPSAic3lzdGVtSWRTdGFydFN0cmluZyI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBSRVdSSVRFX1NZU1RFTSwgUkVXUklURV9VUkkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUkVXUklURV9QUkVGSVggPSAicmV3cml0ZVByZWZpeCI7IC8vJE5PTi1OTFMtMSQKLSAgLyoqCi0gICAqIEF0dHJpYnV0ZSB1c2VkIGluIGNhdGFsb2cgZW50cmllcyBvZiB0eXBlOiBERUxFR0FURV9QVUJMSUMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJfUFVCTElDX0lEX1NUQVJUX1NUUklORyA9ICJwdWJsaWNJZFN0YXJ0U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotICAvKioKLSAgICogQXR0cmlidXRlIHVzZWQgaW4gY2F0YWxvZyBlbnRyaWVzIG9mIHR5cGU6IERFTEVHQVRFX1BVQkxJQywKLSAgICogREVMRUdBVEVfU1lTVEVNLCBERUxFR0FURV9VUkksIE5FWFRfQ0FUQUxPRwotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9DQVRBTE9HID0gImNhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0gIC8qKgotICAgKiBBdHRyaWJ1dGUgdXNlZCBpbiBjYXRhbG9nIGVudHJpZXMgb2YgdHlwZTogUkVXUklURV9VUkksIERFTEVHQVRFX1VSSQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUl9VUklfU1RBUlRfU1RSSU5HID0gInVyaVN0YXJ0U3RyaW5nIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1VSSVJlc29sdmVyRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzFlOTVkNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlckV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2c7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGluamVjdCB0aGUgWE1MQ2F0YWxvZyByZXNvbHV0aW9uIGJlaGF2aW91ciBpbnRvIHRoZQotICogQ29tbW9uIEV4dGVuc2libGUgVVJJIFJlc29sdmVyLiBUaGlzIGNsYXNzIGlzIHJlZmVyZW5jZWQgaW4gdGhlIFhNTCBDYXRhbG9nCi0gKiBwbHVnaW4ncyBwbHVnaW4ueG1sIGZpbGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nVVJJUmVzb2x2ZXJFeHRlbnNpb24gaW1wbGVtZW50cyBVUklSZXNvbHZlckV4dGVuc2lvbgotewotICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoSUZpbGUgZmlsZSwgU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICAvLyBpZiB3ZSBoYXZlIGNhdGFsb2cgaW4gYSBwcm9qZWN0IHdlIG1heSBhZGQgaXQKLSAgICAvLyB0byB0aGUgY2F0YWxvZyBtYW5hZ2VyIGZpcnN0Ci0gICAgSUNhdGFsb2cgY2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0gICAgaWYgKGNhdGFsb2cgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9udWxsX2NhdGFsb2cpOwotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIFN0cmluZyByZXNvbHZlZCA9IG51bGw7Ci0gICAgaWYgKHN5c3RlbUlkICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlU3lzdGVtKHN5c3RlbUlkKTsKLSAgICAgICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXNvbHZlZCA9IGNhdGFsb2cucmVzb2x2ZVVSSShzeXN0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gbWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmwpOwotICAgICAgICByZXNvbHZlZCA9IG51bGw7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gaWUpCi0gICAgICB7Ci0gICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbik7Ci0gICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgewotICAgICAgaWYgKHB1YmxpY0lkICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIC8vIENTIDogdGhpcyBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBidWcgOTY3NzIKLSAgICAgICAgLy8KLSAgICAgICAgLy8gRm9yIHNjaGVtYXMgd2UgYWx3YXlzIHVzZSBsb2NhdGlvbnMgd2hlcmUgYXZhaWxhYmxlIGFuZCBvbmx5IHVzZQotICAgICAgICAvLyBuYW1lc3BhY2Ugd2hlbiBubyBsb2NhdGlvbiBpcyBzcGVjaWZpZWQuICBGb3IgWE1MIGVudGl0aWVzIChzdWNoIGFzIERPQ1RZUEUpIAotICAgICAgICAvLyBkZWZhdWx0IGFsd2F5cyB1dGlsaXplIHRoZSBwdWJsaWMgY2F0YWxvZyBlbnRyeS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gVGhpcyBsYW1lIHRlc3QgYmVsb3cgcm91Z2hseSBkaXNjcmltaW5hdGUgYmV0d2VlbiBzY2hlbWEgYW5kIFhNTCBlbnRpdGllcy4KLSAgICAgICAgLy8gVE9ETyAoYnVnIDEwMzI0MykgcmVtb3ZlIHRoaXMgbGFtZSB0ZXN0IG9uY2Ugd2UgbW92ZSB0byB0aGUgbmV3IFVSSVJlc29sdmVyIEFQSQotICAgICAgICAvLyBzaW5jZSB0aGUgbmV3IEFQSSBpcyBleHBsaWNpdCBhYm91dCBuYW1lc3BhY2UgYW5kIHB1YmxpY0lkCi0gICAgICAgIC8vIAotICAgICAgICBpZiAoIShzeXN0ZW1JZCAhPSBudWxsICYmIHN5c3RlbUlkLmVuZHNXaXRoKCIueHNkIikpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXNvbHZlZCA9IGNhdGFsb2cucmVzb2x2ZVB1YmxpYyhwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgICAgICAgICAgaWYgKHJlc29sdmVkID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc29sdmVkID0gY2F0YWxvZy5yZXNvbHZlVVJJKHB1YmxpY0lkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBtZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUl9ERUJVRywgWE1MQ29yZU1lc3NhZ2VzLkNhdGFsb2dfcmVzb2x1dGlvbl9tYWxmb3JtZWRfdXJsKTsKLSAgICAgICAgICAgIHJlc29sdmVkID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGllKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIExvZ2dlci5sb2coTG9nZ2VyLkVSUk9SX0RFQlVHLCBYTUxDb3JlTWVzc2FnZXMuQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbik7Ci0gICAgICAgICAgICByZXNvbHZlZCA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXNvbHZlZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZWNiNGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsIG9iamVjdCAnPGVtPjxiPkNhdGFsb2c8L2I+PC9lbT4nLgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSUNhdGFsb2cKLXsKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNhdGFsb2cgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICogQHJldHVybiBjYXRhbG9nIGlkIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTZXRzIGNhdGFsb2cgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKTsKLSAgICAKLSAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbihTdHJpbmcgbG9jYXRpb24pOwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYXRpb24oKTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2FibGUgUFVCTElDIG9yIFNZU1RFTSBpZGVudGlmaWVyLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHNlYXJjaGVzIHRoZSBDYXRhbG9nIGFuZCByZXR1cm5zIHRoZSBzeXN0ZW0gaWRlbnRpZmllcgotICAgICAqIHNwZWNpZmllZCBmb3IgdGhlIGdpdmVuIHN5c3RlbSBvciBwdWJsaWMgaWRlbnRpZmllcnMuIElmIG5vIGFwcHJvcHJpYXRlCi0gICAgICogUFVCTElDIG9yIFNZU1RFTSBlbnRyeSBpcyBmb3VuZCBpbiB0aGUgQ2F0YWxvZywgbnVsbCBpcyByZXR1cm5lZC4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHB1YmxpY0lkCi0gICAgICogICAgICAgICAgICBUaGUgcHVibGljIGlkZW50aWZpZXIgdG8gbG9jYXRlIGluIHRoZSBjYXRhbG9nLiBQdWJsaWMKLSAgICAgKiAgICAgICAgICAgIGlkZW50aWZpZXJzIGFyZSBub3JtYWxpemVkIGJlZm9yZSBjb21wYXJpc29uLgotICAgICAqIEBwYXJhbSBzeXN0ZW1JZAotICAgICAqICAgICAgICAgICAgVGhlIG5vbWluYWwgc3lzdGVtIGlkZW50aWZpZXIgZm9yIHRoZSBlbnRpdHkgaW4gcXVlc3Rpb24gKGFzCi0gICAgICogICAgICAgICAgICBwcm92aWRlZCBpbiB0aGUgc291cmNlIGRvY3VtZW50KS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBmb3JtYWwgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBzdWJvcmRpbmF0ZSBjYXRhbG9nIGNhbm5vdAotICAgICAqICAgICAgICAgICAgIGJlIHR1cm5lZCBpbnRvIGEgdmFsaWQgVVJMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFcnJvciByZWFkaW5nIHN1Ym9yZGluYXRlIGNhdGFsb2cgZmlsZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSBzeXN0ZW0gaWRlbnRpZmllciB0byB1c2UuIE5vdGUgdGhhdCB0aGUgbm9taW5hbCBzeXN0ZW0KLSAgICAgKiAgICAgICAgIGlkZW50aWZpZXIgaXMgbm90IHJldHVybmVkIGlmIGEgbWF0Y2ggaXMgbm90IGZvdW5kIGluIHRoZQotICAgICAqICAgICAgICAgY2F0YWxvZywgaW5zdGVhZCBudWxsIGlzIHJldHVybmVkIHRvIGluZGljYXRlIHRoYXQgbm8gbWF0Y2ggd2FzCi0gICAgICogICAgICAgICBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVQdWJsaWMoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICAgICAgICB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgYXBwbGljYWJsZSBTWVNURU0gc3lzdGVtIGlkZW50aWZpZXIuCi0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogSWYgYSBTWVNURU0gZW50cnkgZXhpc3RzIGluIHRoZSBDYXRhbG9nIGZvciB0aGUgc3lzdGVtIElEIHNwZWNpZmllZCwKLSAgICAgKiByZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogPHA+Ci0gICAgICogT24gV2luZG93cy1iYXNlZCBvcGVyYXRpbmcgc3lzdGVtcywgdGhlIGNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc3lzdGVtCi0gICAgICogaWRlbnRpZmllciBwcm92aWRlZCBhbmQgdGhlIFNZU1RFTSBlbnRyaWVzIGluIHRoZSBDYXRhbG9nIGlzCi0gICAgICogY2FzZS1pbnNlbnNpdGl2ZS4KLSAgICAgKiA8L3A+Ci0gICAgICogCi0gICAgICogQHBhcmFtIHN5c3RlbUlkCi0gICAgICogICAgICAgICAgICBUaGUgc3lzdGVtIElEIHRvIGxvY2F0ZSBpbiB0aGUgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCBzeXN0ZW0gaWRlbnRpZmllci4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgICAqICAgICAgICAgICAgIFRoZSBmb3JtYWwgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBzdWJvcmRpbmF0ZSBjYXRhbG9nIGNhbm5vdAotICAgICAqICAgICAgICAgICAgIGJlIHR1cm5lZCBpbnRvIGEgdmFsaWQgVVJMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFcnJvciByZWFkaW5nIHN1Ym9yZGluYXRlIGNhdGFsb2cgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVTeXN0ZW0oU3RyaW5nIHN5c3RlbUlkKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLAotICAgICAgICAgICAgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGFwcGxpY2FibGUgVVJJLgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIElmIGEgVVJJIGVudHJ5IGV4aXN0cyBpbiB0aGUgQ2F0YWxvZyBmb3IgdGhlIFVSSSBzcGVjaWZpZWQsIHJldHVybiB0aGUKLSAgICAgKiBtYXBwZWQgdmFsdWUuCi0gICAgICogPC9wPgotICAgICAqIAotICAgICAqIDxwPgotICAgICAqIFVSSSBjb21wYXJpc29uIGlzIGNhc2Ugc2Vuc2l0aXZlLgotICAgICAqIDwvcD4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICogICAgICAgICAgICBUaGUgVVJJIHRvIGxvY2F0ZSBpbiB0aGUgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCBVUkkuCi0gICAgICogCi0gICAgICogQHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBUaGUgc3lzdGVtIGlkZW50aWZpZXIgb2YgYSBzdWJvcmRpbmF0ZSBjYXRhbG9nIGNhbm5vdCBiZQotICAgICAqICAgICAgICAgICAgIHR1cm5lZCBpbnRvIGEgdmFsaWQgVVJMLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBFcnJvciByZWFkaW5nIHN1Ym9yZGluYXRlIGNhdGFsb2cgZmlsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIHVyaSkgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiwKLSAgICAgICAgICAgIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBjYXRhbG9nIGVsZW1lbnQgdG8gdGhlIGNvbGxlY3Rpb24gb2YgdGhlIGNhdGFsb2cgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVsZW1lbnQgLQotICAgICAqICAgICAgICAgICAgY2F0YWxvZyBlbGVtZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBjYXRhbG9nIGVsZW1lbnQgZnJvbSB0aGUgY29sbGVjdGlvbiBvZiB0aGUgY2F0YWxvZyBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZWxlbWVudCAtCi0gICAgICogICAgICAgICAgICBjYXRhbG9nIGVsZW1lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMgb2YgdHlwZSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWQotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cwotICAgICAqLwotICAgIHB1YmxpYyBJQ2F0YWxvZ0VudHJ5W10gZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgY2F0YWxvZyBlbGVtZW50cyBvZiB0eXBlCi0gICAgICogSUNhdGFsb2dFbGVtZW50LlRZUEVfREVMRUdBVEUKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIGNhdGFsb2cgZWxlbWVudHMKLSAgICAgKi8KLSAgICBwdWJsaWMgSU5leHRDYXRhbG9nW10gZ2V0TmV4dENhdGFsb2dzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIG5ldyBjYXRhbG9nIGVsZW1lbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUuIElmIHRoZSB0eXBlIGlzIG9uZQotICAgICAqIG9mIEVMRU1FTlRfVFlQRSwgdGhlIHJlc3VsdCBlbnRyeSB3aWxsIGhhdmUgY29ycmVzcG9uZGluZyBpbnRlcmZhY2UuCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoaW50IHR5cGUpOwotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhbGwgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBjYXRhbG9nLgotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCk7Ci0gICAgCi0gICAgLy9wdWJsaWMgdm9pZCBsb2FkKCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIAotICAgIHB1YmxpYyB2b2lkIHNhdmUoKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKgotICAgICAqIExvYWRzIGNhdGFsb2cgZnJvbSB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uLiBFeHBlY3RpbmcgT0FTSVMgWE1MIENhdGFsb2cKLSAgICAgKiBmb3JtYXQKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gLQotICAgICAqICAgICAgICAgICAgdXJpIG9mIHRoZSBmaWxlIHdoZXJlIGNhdGFsb2cgd2lsbCBiZSBzYXZlZAotCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAtCi0gICAgICogICAgICAgICAgICAgcHJvYmxlbSBsb2FkaW5nIGZpbGUKLSAgICAgKiAKLSAgICAgKi8KLSAgICAvL3B1YmxpYyB2b2lkIGxvYWQoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qCi0gICAgICogU2F2ZXMgY2F0YWxvZyB0byB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIE9BU0lTIFhNTCBDYXRhbG9nIGZvcm1hdAotICAgICAqIAotICAgICAqIEBwYXJhbSBsb2NhdGlvbiAtCi0gICAgICogICAgICAgICAgICB1cmkgb2YgdGhlIGZpbGUgd2hlcmUgY2F0YWxvZyB3aWxsIGJlIHNhdmVkCi0KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIC0KLSAgICAgKiAgICAgICAgICAgICBwcm9ibGVtIHNhdmluZyBmaWxlCi0gICAgICogCi0gICAgICovCi0gICAgLy9wdWJsaWMgdm9pZCBzYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGNvcGllcyBhbGwgY2F0YWxvZyBlbnRyaWVzIGZyb20gc291cmNlIGNhdGFsb2cgdG8gdGhpcyBvbmUuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNhdGFsb2cgLQotICAgICAqICAgICAgICAgICAgc291cmNlIGNhdGFsb2cKLSAgICAgKiBAcGFyYW0gaW5jbHVkZU5lc3RlZCAtCi0gICAgICogICAgICAgICAgICBhIGJvb2xlYW4gZmxhZyBpbmRpY2F0aW5nIHdldGhlciB0byBpbmNsdWRlIGVudHJpZXMgb2YgdGhlCi0gICAgICogICAgICAgICAgICBzYW1lIHR5cGUgZnJvbSB0aGUgbmVzdGVkIGNhdGFsb2dzCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkRW50cmllc0Zyb21DYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpOwotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGxpc3RlbmVyIG9mIHRoZSBjYXRhbG9nIGV2ZW50cwotICAgICAqIAotICAgICAqIEBwYXJhbSBsaXN0ZW5lciAtCi0gICAgICogICAgICAgICAgICBsaXN0ZW5lciBvZiB0aGUgY2F0YWxvZyBldmVudHMKLSAgICAgKiBAc2VlIElDYXRhbG9nRXZlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJQ2F0YWxvZ0xpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgYSBsaXN0ZW5lciBvZiB0aGUgY2F0YWxvZyBldmVudHMKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbGlzdGVuZXIgLQotICAgICAqICAgICAgICAgICAgbGlzdGVuZXIgb2YgdGhlIGNhdGFsb2cgZXZlbnRzCi0gICAgICogQHNlZSBJQ2F0YWxvZ0V2ZW50Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUNhdGFsb2dMaXN0ZW5lciBsaXN0ZW5lcik7ICAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VsZW1lbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWEzZDJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbDsKLQotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRWxlbWVudAotewotICAgIC8qKiBUeXBlcyBvZiB0aGUgY2F0YWxvZyBlbnRyaWVzICovCi0gICAgLyoqIFRoZSBQVUJMSUMsIFVSSSBvciBTWVNURU0gQ2F0YWxvZyBFbnRyeS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0VOVFJZID0gMTsKLQotICAgIC8qKiBUaGUgTkVYVF9DQVRBTE9HIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX05FWFRfQ0FUQUxPRyA9IDEwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICc8ZW0+PGI+VHlwZTwvYj48L2VtPicgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnPGVtPlR5cGU8L2VtPicgYXR0cmlidXRlLgotICAgICAqLwotICAgIGludCBnZXRUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlIHdpdGggc3BlY2lmaWVkIG5hbWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSB3aXRoIHNwZWNpZmllZCBuYW1lLgotICAgICAqIEBzZWUgI3NldEF0dHJpYnV0ZVZhbHVlKFN0cmluZykKLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWVkIGF0dHJpYnV0ZS4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0aGF0IHdpbGwgYmUgc2V0Ci0gICAgICogQHBhcmFtIHZhbHVlCi0gICAgICogICAgICAgICAgICB0aGUgbmV3IHZhbHVlIG9mIHRoZSBuYW1lZCBhdHRyaWJ1dGUuCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVmFsdWUoKQotICAgICAqLwotICAgIHZvaWQgc2V0QXR0cmlidXRlVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGF0dHJpYnV0ZSBuYW1lcyBmb3IgYW55IGR5bmFtaWMgYXR0cmlidXRlcyB0aGF0IG1heSBleGlzdAotICAgICAqIAotICAgICAqIEByZXR1cm4gYXJyYXkgb2YgYXR0cmlidXRlIG5hbWVzCi0gICAgICogQHNlZSAjZ2V0QXR0cmlidXRlVmFsdWUoKQotICAgICAqIEBzZWUgI3NldEF0dHJpYnV0ZVZhbHVlKFN0cmluZykKLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVzKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBlbGVtZW50J3MgaWQgc3RyaW5nCi0gICAgICogCi0gICAgICogQHJldHVybiBlbGVtZW50J3MgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpOwotICAgIAotICAgIC8qKgotICAgICAqIFNldHMgZWxlbWVudCdzIGlkIHN0cmluZwotICAgICAqIAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCk7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgc2V0T3duZXJDYXRhbG9nKElDYXRhbG9nIGNhdGFsb2cpOwotICAgIAotICAgIHB1YmxpYyBJQ2F0YWxvZyBnZXRPd25lckNhdGFsb2coKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRW50cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRW50cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzMzAxOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0VudHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRW50cnkgZXh0ZW5kcyBJQ2F0YWxvZ0VsZW1lbnQKLXsKLSAgICAvKiogVGhlIFNZU1RFTSBDYXRhbG9nIEVudHJ5IHR5cGUuICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU5UUllfVFlQRV9QVUJMSUMgPSAyOwotCi0gICAgLyoqIFRoZSBTWVNURU0gQ2F0YWxvZyBFbnRyeSB0eXBlLiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVOVFJZX1RZUEVfU1lTVEVNID0gMzsKLQotICAgIC8qKiBUaGUgVVJJIENhdGFsb2cgRW50cnkgdHlwZS4gKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTlRSWV9UWVBFX1VSSSA9IDQ7Ci0KLSAgICAvKiogQXR0cmlidXRlIG5hbWUgZm9yIFdlYiBhZGRyZXNzIG9mIGNhdGFsb2cgZW50cnkgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSX1dFQl9VUkwgPSAid2ViVVJMIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGVudHJ5VHlwZQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVudHJ5VHlwZShpbnQgZW50cnlUeXBlKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVudHJ5VHlwZSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHBhcmFtIGtleQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEtleShTdHJpbmcga2V5KTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VVJJKCk7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VVJJKFN0cmluZyB1cmkpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSUNhdGFsb2dFdmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmZkYjNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nRXZlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIAotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQgYnkgY2xpZW50cy4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nRXZlbnQKLXsKLSAgICAvKiogKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDSEFOR0VEID0gMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQURERUQgPSAxOwotCi0gICAgLyoqICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9SRU1PVkVEID0gMjsKLQotICAgIC8qKiAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVMRU1FTlRfQ0hBTkdFRCA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRFdmVudFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgSUNhdGFsb2cgZ2V0Q2F0YWxvZygpOwotCi0gICAgLyoqCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBJQ2F0YWxvZ0VsZW1lbnQgZ2V0Q2F0YWxvZ0VsZW1lbnQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jYXRhbG9nL3Byb3Zpc2lvbmFsL0lDYXRhbG9nTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBjNDRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JQ2F0YWxvZ0xpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7Ci0KLQotLyoqCi0gKiBUaGUgY2xpZW50cyBvZiB0aGUgY2F0YWxvZyB0aGF0IHdhbnQgdG8gbGlzdGVuIHRvIGNhdGFsb2cgY2hhbmdlcyBzaG91bGQKLSAqIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KLSAqIAotICogQHNlZSBJQ2F0YWxvZywgSUNhdGFsb2dFdmVudCwKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElDYXRhbG9nTGlzdGVuZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyCi17Ci0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgYWxsb3dzIHRvIHJlYWN0IHRvIGNhdGFsb2cgZXZlbnRzCi0gICAgICogCi0gICAgICogQHBhcmFtIGV2ZW50IC0KLSAgICAgKiAgICAgICAgICAgIGFuIGV2ZW50IHRoYXQgY2xpZW50IHNob3VsZCByZWFjdCB0bwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhdGFsb2dDaGFuZ2VkKElDYXRhbG9nRXZlbnQgZXZlbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NhdGFsb2cvcHJvdmlzaW9uYWwvSU5leHRDYXRhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JTmV4dENhdGFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0ZTAwYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2F0YWxvZy9wcm92aXNpb25hbC9JTmV4dENhdGFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIAotICogQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbmV4dENhdGFsb2cgT0FTSVMgWE1MIGNhdGFsb2cgZWxlbWVudC4gT2JqZWN0IG9mIHRoZQotICogY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlIHdvdWxkIHNlcnZlIGFzIGEgcmVmZXJlbmNlIHRvIHRoZQotICogY2F0YWxvZyBvYmplY3QuCi0gKiAKLSAqIEBzZWUgSUNhdGFsb2csIElDYXRhbG9nRWxlbWVudAotICogCi0gKiBUaGlzIGludGVyZmFjZSBjdXJyZW50bHkgaXMgdXNlZCBvbmx5IGJ5IHRoZSBjYXRhbG9nIGl0c2VsZi4gTmVlZCB0byBmaW5kIGlmCi0gKiB0aGVyZSBhcmUgYW55IGNsaWVudHMgdGhhdCBuZWVkIGl0LgotICogCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGlzIG5vdCBpbnRlbmRlZCB0byBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzLgotICogPC9wPgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSU5leHRDYXRhbG9nIGV4dGVuZHMgSUNhdGFsb2dFbGVtZW50Ci17Ci0gICAgLyoqCi0gICAgICogU2V0IGxvY2F0aW9uIG9mIHRoZSByZWZlcmVuY2VkIGNhdGFsb2cuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaSAtCi0gICAgICogICAgICAgICAgICBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhdGFsb2dMb2NhdGlvbihTdHJpbmcgdXJpKTsKLQotICAgIC8qKgotICAgICAqIEdldCBsb2NhdGlvbiB1cmkgb2YgdGhlIHJlZmVyZW5jZWQgY2F0YWxvZy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGxvY2F0aW9uIHVyaSBvZiB0aGUgcmVmZXJlbmNlZCBjYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRDYXRhbG9nTG9jYXRpb24oKTsKLSAgICAKLSAgICBwdWJsaWMgSUNhdGFsb2cgZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQotICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BbnlFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01BbnlFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjZDA2NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQW55RWxlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNQW55RWxlbWVudCBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUFueUVsZW1lbnQgZXh0ZW5kcyBDTUNvbnRlbnQgewotLyoqCi0gKiBnZXROYW1lc3BhY2VVUkkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUF0dHJpYnV0ZURlY2xhcmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjFhNWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNQXR0cmlidXRlRGVjbGFyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLQotLyoqCi0gKiBBdHRyaWJ1dGVEZWNsYXJhdGlvbiBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGV4dGVuZHMgQ01Ob2RlIHsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT1BUSU9OQUwgICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUVVJUkVEICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGSVhFRCAgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJPSElCSVRFRCA9IDQ7Ci0vKioKLSAqIGdldEF0dHJOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRBdHRyTmFtZSgpOwotLyoqCi0gKiBnZXRBdHRyVHlwZSBtZXRob2QKLSAqIEByZXR1cm4gQ01EYXRhVHlwZQotICovCi1DTURhdGFUeXBlIGdldEF0dHJUeXBlKCk7Ci0vKioKLSAqIGdldERlZmF1bHRWYWx1ZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICogQGRlcHJlY2F0ZWQgLS0gdG8gYmUgcmVwbGFjZWQgaW4gZnV0dXJlIHdpdGggYWRkaXRpb25hbCBDTURhdGFUeXBlIG1ldGhvZHMgKGN1cnJlbnRseSBmb3VuZCBvbiBDTURhdGFUeXBlSGVscGVyKQotICovCi1TdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCk7Ci0vKioKLSAqIGdldEVudW1BdHRyIG1ldGhvZAotICogQHJldHVybiBqYXZhLnV0aWwuRW51bWVyYXRpb24KLSAqIEBkZXByZWNhdGVkIC0tIHRvIGJlIHJlcGxhY2VkIGluIGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwgQ01EYXRhVHlwZSBtZXRob2RzIChjdXJyZW50bHkgZm91bmQgb24gQ01EYXRhVHlwZUhlbHBlcikKLSAqLwotRW51bWVyYXRpb24gZ2V0RW51bUF0dHIoKTsKLS8qKgotICogZ2V0VXNhZ2UgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICovCi1pbnQgZ2V0VXNhZ2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUNvbnRlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VjZWU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Db250ZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Db250ZW50IGV4dGVuZHMgQ01Ob2RlCi17Ci0vKioKLSAqIGdldE1heE9jY3VyIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBJZiAtMSwgaXQncyBVTkJPVU5ERUQuCi0gKi8KLWludCBnZXRNYXhPY2N1cigpOwotLyoqCi0gKiBnZXRNaW5PY2N1ciBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogSWYgMCwgaXQncyBPUFRJT05BTC4KLSAqIElmIDEsIGl0J3MgUkVRVUlSRUQuCi0gKi8KLWludCBnZXRNaW5PY2N1cigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRGF0YVR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURhdGFUeXBlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOTNhYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRGF0YVR5cGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTURhdGFUeXBlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01EYXRhVHlwZSBleHRlbmRzIENNTm9kZSB7Ci0gICAgCi0gIC8vIHRvZG8uLi4gYXQgc29tZSBwb2ludCB3ZSBzaG91bGQgcmVtb3ZlIHRoZXNlIG5hbWVzIHRvCi0gIC8vIGF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdmlhIHRoZSBpbnRlcmZhY2VzCi0gIC8vCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQSA9ICJDREFUQSI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIElEID0gIklEIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgSURSRUYgPSAiSURSRUYiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiRU5USVRZIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRJRVMgPSAiRU5USVRJRVMiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBOT1RBVElPTiA9ICJOT1RBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU4gPSAiTk1UT0tFTiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIE5NVE9LRU5TID0gIk5NVE9LRU5TIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgTlVNQkVSID0gIk5VTUJFUiI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFVSSSA9ICJVUkkiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBFTlVNID0gIkVOVU0iOyAvLyROT04tTkxTLTEkCi0KLSAgc3RhdGljIGZpbmFsIGludCBJTVBMSUVEX1ZBTFVFX05PTkUgICAgICAgICAgICAgPSAxOwotICBzdGF0aWMgZmluYWwgaW50IElNUExJRURfVkFMVUVfRklYRUQgICAgICAgICAgICA9IDI7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgSU1QTElFRF9WQUxVRV9ERUZBVUxUICAgICAgICAgID0gMzsKLQotLyoqCi0gKiBnZXRUeXBlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotICovCi1TdHJpbmcgZ2V0RGF0YVR5cGVOYW1lKCk7ICAgIAotCi0vKioKLSAqIGdldEltcGxpZWRWYWx1ZUtpbmQgbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICoKLSAqIFJldHVybnMgb25lIG9mIDoKLSAqIElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCwgSU1QTElFRF9WQUxVRV9ERUZBVUxULgotICovICAgICAgCi0KLWludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCk7ICAKLQotLyoqCi0gKiBnZXRUeXBlTmFtZSBtZXRob2QKLSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZyAgCi0gKgotICogUmV0dXJucyB0aGUgaW1wbGllZCB2YWx1ZSBvciBudWxsIGlmIG5vbmUgZXhpc3RzLgotICovCi1TdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCk7Ci0KLS8qKgotICogZ2V0VHlwZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmdbXQotICoKLSAqLwotU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCi0vKioKLSAqIGdldFR5cGVOYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKgotICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN1aXRhYmxlIGRlZmF1bHQgdmFsdWUgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhIHR5cGUgaXMgY3JlYXRlZC4KLSAqIFRoaXMgcmV0dXJucyBudWxsIG9mIGEgc3VpdGFibGUgZGVmYXVsdCBpcyBub3QgYXZhaWxhYmxlLgotICovCi1TdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0ZTRmMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRG9jdW1lbnQgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudCBleHRlbmRzIENNTm9kZSB7Ci0vKioKLSAqIGdldEVsZW1lbnRzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRWxlbWVudERlY2xhcmF0aW9uCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCk7Ci0vKioKLSAqIGdldEVudGl0aWVzIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVkTm9kZU1hcAotICoKLSAqIFJldHVybnMgQ01OYW1lZE5vZGVNYXAgb2YgRW50aXR5RGVjbGFyYXRpb24KLSAqLwotQ01OYW1lZE5vZGVNYXAgZ2V0RW50aXRpZXMoKTsKLS8qKgotICogZ2V0TmFtZXNwYWNlIG1ldGhvZAotICogQHJldHVybiBDTU5hbWVzcGFjZQotICovCi1DTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1MjU5My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Eb2N1bWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWw7Ci0KLS8qKgotICogQ01Eb2N1bWVudGF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRhdGlvbiBleHRlbmRzIENNTm9kZSB7ICAgICAgICAKLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOwotICBwdWJsaWMgU3RyaW5nIGdldExhbmd1YWdlKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDQxOGQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRWxlbWVudERlY2xhcmF0aW9uIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRWxlbWVudERlY2xhcmF0aW9uIGV4dGVuZHMgQ01Db250ZW50IHsKLSAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQU5ZID0gMDsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFTVBUWSA9IDE7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCA9IDI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlYRUQgPSAzOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBDREFUQSA9IDQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0RBVEEgPSA1OyAvLyB0b2RvLi4uIGNsYXJpZnkgdGhpcyBvbmUKLS8qKgotICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLSAqIEByZXR1cm4gQ01OYW1lZE5vZGVNYXAKLSAqCi0gKiBSZXR1cm5zIENNTmFtZWROb2RlTWFwIG9mIEF0dHJpYnV0ZURlY2xhcmF0aW9uCi0gKi8KLUNNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKTsKLS8qKgotICogZ2V0Q01Db250ZW50IG1ldGhvZAotICogQHJldHVybiBDTUNvbnRlbnQKLSAqCi0gKiBSZXR1cm5zIHRoZSByb290IG5vZGUgb2YgdGhpcyBlbGVtZW50J3MgY29udGVudCBtb2RlbC4KLSAqIFRoaXMgY2FuIGJlIGFuIENNRWxlbWVudERlY2xhcmF0aW9uIG9yIGEgQ01Hcm91cAotICovCi1DTUNvbnRlbnQgZ2V0Q29udGVudCgpOwotLyoqCi0gKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogUmV0dXJucyBvbmUgb2YgOgotICogQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEuCi0gKi8KLXB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKTsKLS8qKgotICogZ2V0RWxlbWVudE5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldEVsZW1lbnROYW1lKCk7Ci0KLS8qKgotICogZ2V0RGF0YVR5cGUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpOwotCi0vKioKLSAqIGdldExvY2FsRWxlbWVudHMgbWV0aG9kCi0gKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0gKgotICogUmV0dXJucyBhIGxpc3Qgb2YgbG9jYWxseSBkZWZpbmVkIGVsZW1lbnRzLgotICovCi1DTU5hbWVkTm9kZU1hcCBnZXRMb2NhbEVsZW1lbnRzKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbnRpdHlEZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNRW50aXR5RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2MjQ5NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01FbnRpdHlEZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNRW50aXR5RGVjbGFyYXRpb24gaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01FbnRpdHlEZWNsYXJhdGlvbiBleHRlbmRzIENNTm9kZSB7Ci0gIAotLyoqCi0gKiBnZXROYW1lIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXROYW1lKCk7Ci0vKioKLSAqIGdldFZhbHVlIG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLVN0cmluZyBnZXRWYWx1ZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTUdyb3VwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkNDlhMTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNR3JvdXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTUdyb3VwIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNR3JvdXAgZXh0ZW5kcyBDTUNvbnRlbnQgewotICAKLQlzdGF0aWMgZmluYWwgaW50IEFMTCA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBDSE9JQ0UgPSAyOwotCXN0YXRpYyBmaW5hbCBpbnQgU0VRVUVOQ0UgPSAxOwotLyoqCi0gKiBnZXRDaGlsZE5vZGVzIG1ldGhvZAotICogQHJldHVybiBDTU5vZGVMaXN0Ci0gKgotICogUmV0dXJucyBjaGlsZCBDTU5vZGVMaXN0LCB3aGljaCBpbmNsdWRlcyBFbGVtZW50RGVmaW5pdGlvbiBvciBDTUVsZW1lbnQuCi0gKi8KLUNNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpOwotCi0vKioKLSAqIGdldE9wZXJhdGlvbiBtZXRob2QKLSAqIEByZXR1cm4gaW50Ci0gKgotICogUmV0dXJucyBvbmUgb2YgOgotICogQUxPTkUgKGEpLCBTRVFVRU5DRSAoYSxiKSwgQ0hPSUNFIChhfGIpLCBBTEwgKGEmYikuCi0gKi8KLWludCBnZXRPcGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZWROb2RlTWFwLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjYjRjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lZE5vZGVNYXAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0vKioKLSAqIE5hbWVkQ01Ob2RlTWFwCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01OYW1lZE5vZGVNYXAgewotLyoqCi0gKiBnZXRMZW5ndGggbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICovCi1pbnQgZ2V0TGVuZ3RoKCk7Ci0vKioKLSAqIGdldE5hbWVkSXRlbSBtZXRob2QKLSAqIEByZXR1cm4gQ01Ob2RlCi0gKiBAcGFyYW0gbmFtZSBqYXZhLmxhbmcuU3RyaW5nCi0gKi8KLUNNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpOwotLyoqCi0gKiBpdGVtIG1ldGhvZAotICogQHJldHVybiBDTU5vZGUKLSAqIEBwYXJhbSBpbmRleCBpbnQKLSAqLwotQ01Ob2RlIGl0ZW0oaW50IGluZGV4KTsKLQotLyoqCi0gKgotICovCi1JdGVyYXRvciBpdGVyYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTmFtZXNwYWNlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQyNjA3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01OYW1lc3BhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5hbWVzcGFjZSBpbnRlcmZhY2UKLSAqLwotcHVibGljIGludGVyZmFjZSBDTU5hbWVzcGFjZSBleHRlbmRzIENNTm9kZSB7Ci0gIAotLyoqCi0gKiBnZXRQcmVmaXggbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldFByZWZpeCgpOwotLyoqCi0gKiBnZXRVUkkgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldFVSSSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg4M2JjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9DTU5vZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotLyoqCi0gKiBDTU5vZGUgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlIHsgICAgICAgIAotICAKLSAgc3RhdGljIGZpbmFsIGludCBBTllfRUxFTUVOVCAgICAgICAgICAgPSAxOwotCXN0YXRpYyBmaW5hbCBpbnQgQVRUUklCVVRFX0RFQ0xBUkFUSU9OID0gMjsKLQlzdGF0aWMgZmluYWwgaW50IERBVEFfVFlQRSAgICAgICAgICAgICA9IDM7Ci0Jc3RhdGljIGZpbmFsIGludCBET0NVTUVOVCAgICAgICAgICAgICAgPSA0OwotCXN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9ERUNMQVJBVElPTiAgID0gNTsKLQlzdGF0aWMgZmluYWwgaW50IEVOVElUWV9ERUNMQVJBVElPTiAgICA9IDY7Ci0Jc3RhdGljIGZpbmFsIGludCBHUk9VUCAgICAgICAgICAgICAgICAgPSA3OwotICBzdGF0aWMgZmluYWwgaW50IE5BTUVfU1BBQ0UgICAgICAgICAgICA9IDg7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgRE9DVU1FTlRBVElPTiAgICAgICAgID0gOTsKLS8qKgotICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0gKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLSAqLwotU3RyaW5nIGdldE5vZGVOYW1lKCk7Ci0vKioKLSAqIGdldE5vZGVUeXBlIG1ldGhvZAotICogQHJldHVybiBpbnQKLSAqCi0gKiBSZXR1cm5zIG9uZSBvZiA6Ci0gKgotICovCi1pbnQgZ2V0Tm9kZVR5cGUoKTsKLQotLyoqCi0gKiBzdXBwb3J0cyBtZXRob2QKLSAqIEByZXR1cm4gYm9vbGVhbgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgQ01Ob2RlIHN1cHBvcnRzIGEgc3BlY2lmaWVkIHByb3BlcnR5Ci0gKgotICovCi1ib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0vKioKLSAqIGdldFByb3BlcnR5IG1ldGhvZAotICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0gKgotICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLSAqCi0gKi8KLU9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKTsgLy90b2RvIHRocm93IHVuc3VwcG9ydGVkIHByb3BlcnR5IGV4Y2VwdGlvbgotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NNTm9kZUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg0YjM4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvQ01Ob2RlTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsOwotCi0vKioKLSAqIENNTm9kZUxpc3QgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlTGlzdCB7Ci0gIAotLyoqCi0gKiBnZXRMZW5ndGggbWV0aG9kCi0gKiBAcmV0dXJuIGludAotICovCi1pbnQgZ2V0TGVuZ3RoKCk7Ci0vKioKLSAqIGl0ZW0gbWV0aG9kCi0gKiBAcmV0dXJuIENNTm9kZQotICogQHBhcmFtIGluZGV4IGludAotICovCi1DTU5vZGUgaXRlbShpbnQgaW5kZXgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTJjYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmZhY3RvcnkuQ01Eb2N1bWVudEZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXI7Ci0KLQotLyoqCi0gKiBDb250ZW50TW9kZWxNYW5hZ2VyIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZW50TW9kZWxNYW5hZ2VyIGV4dGVuZHMgUGx1Z2luIHsKLQkvLyBwcml2YXRlIHN0YXRpYyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5IGluZmVycmVkR3JhbW1hckZhY3Rvcnk7Ci0JcHJpdmF0ZSBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5IGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnk7Ci0JcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb250ZW50TW9kZWxNYW5hZ2VyIGluc3RhbmNlOwotCi0JcHVibGljIENvbnRlbnRNb2RlbE1hbmFnZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb250ZW50TW9kZWxNYW5hZ2VyIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotCQkJaW5zdGFuY2UgPSBuZXcgQ29udGVudE1vZGVsTWFuYWdlcigpOwotCQl9Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmksIFN0cmluZyByZXNvdXJjZVR5cGUpIHsKLQkJaWYgKHJlc291cmNlVHlwZSA9PSBudWxsICYmIHVyaSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSB1cmkubGFzdEluZGV4T2YoIi4iKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzb3VyY2VUeXBlID0gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotCQl9Ci0KLQkJaWYgKHJlc291cmNlVHlwZSAhPSBudWxsKSB7Ci0JCQlyZXNvdXJjZVR5cGUgPSByZXNvdXJjZVR5cGUudG9Mb3dlckNhc2UoKTsKLQkJfQotCQlDTURvY3VtZW50RmFjdG9yeSBmYWN0b3J5ID0gZ2V0Q01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnkocmVzb3VyY2VUeXBlKTsKLQkJcmV0dXJuIGZhY3RvcnkgIT0gbnVsbCA/IGZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCh1cmkpIDogbnVsbDsKLQl9Ci0KLQotCXByaXZhdGUgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSBnZXRDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlpZiAoY21Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQljbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5ID0gbmV3IENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCW5ldyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKGNtRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBjbURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5OwotCX0KLQotCi0JcHVibGljIExpc3QgZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCXJldHVybiBnZXRBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCkuZ2V0QW5ub3RhdGlvbkZpbGVzSW5mb3MocHVibGljSWQpOwotCX0KLQotCXByaXZhdGUgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSBnZXRBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5KCkgewotCQlpZiAoYW5ub3RhdGlvbkZpbGVSZWdpc3RyeSA9PSBudWxsKSB7Ci0JCQlhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5ID0gbmV3IEFubm90YXRpb25GaWxlUmVnaXN0cnkoKTsKLQkJCW5ldyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyKGFubm90YXRpb25GaWxlUmVnaXN0cnkpLnJlYWRSZWdpc3RyeSgpOwotCQl9Ci0JCXJldHVybiBhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MGIyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0gICAgICAgICAKLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uCi17ICAgICAgIAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGhhc2h0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQW5ub3RhdGlvbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFNwZWMoU3RyaW5nIHNwZWMpCi0gIHsKLSAgICBoYXNodGFibGUucHV0KCJzcGVjIiwgc3BlYyk7IC8vJE5PTi1OTFMtMSQKLSAgfSAgICAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgewotICAgIHJldHVybiAoU3RyaW5nKWhhc2h0YWJsZS5nZXQoInNwZWMiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gICAgICAKLSAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaGFzaHRhYmxlLnB1dChuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsgICAgIAotICAgIHJldHVybiAoU3RyaW5nKWhhc2h0YWJsZS5nZXQocHJvcGVydHlOYW1lKTsKLSAgfSAgICAKLQotICBwdWJsaWMgTGlzdCBnZXRBdHRyaWJ1dGVMaXN0KCkKLSAgewotICAgIHJldHVybiBudWxsOyAvLyB0b2RvCi0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9hbm5vdGF0aW9uL0Fubm90YXRpb25NYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU3NTM1MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5hbm5vdGF0aW9uLkFubm90YXRpb25GaWxlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb24uQW5ub3RhdGlvbkZpbGVQYXJzZXI7Ci0KLQotLyoqCi0gKiBBbm5vdGF0aW9uTWFwCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uTWFwIHsKLQlwcm90ZWN0ZWQgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCXByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCXByb3RlY3RlZCBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSA9IHRydWU7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbk1hcCgpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXNlU2Vuc2l0aXZlKGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKSB7Ci0JCXRoaXMuaXNDYXNlU2Vuc2l0aXZlID0gaXNDYXNlU2Vuc2l0aXZlOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEFubm90YXRpb24oQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCVN0cmluZyBzcGVjID0gYW5ub3RhdGlvbi5nZXRTcGVjKCk7Ci0JCWlmIChzcGVjICE9IG51bGwpIHsKLQkJCWxpc3QuYWRkKGFubm90YXRpb24pOwotCQkJU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihzcGVjLCAiW118XHRcblxyXGYgIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY21Ob2RlU3BlYyA9IHN0Lm5leHRUb2tlbigpOwotCQkJCWFkZEFubm90YXRpb25Gb3JDTU5vZGVTcGVjKGNtTm9kZVNwZWMsIGFubm90YXRpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkQW5ub3RhdGlvbkZvckNNTm9kZVNwZWMoU3RyaW5nIGNtTm9kZVNwZWMsIEFubm90YXRpb24gYW5ub3RhdGlvbikgewotCQlTdHJpbmcga2V5ID0gaXNDYXNlU2Vuc2l0aXZlID8gY21Ob2RlU3BlYyA6IGNtTm9kZVNwZWMudG9Mb3dlckNhc2UoKTsKLQkJTGlzdCBsaXN0ID0gKExpc3QpIGhhc2h0YWJsZS5nZXQoa2V5KTsKLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCQkJaGFzaHRhYmxlLnB1dChrZXksIGxpc3QpOwotCQl9Ci0JCWxpc3QuYWRkKGFubm90YXRpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoU3RyaW5nIGNtTm9kZVNwZWMsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBrZXkgPSBpc0Nhc2VTZW5zaXRpdmUgPyBjbU5vZGVTcGVjIDogY21Ob2RlU3BlYy50b0xvd2VyQ2FzZSgpOwotCQlMaXN0IGFubm90YXRpb25MaXN0ID0gKExpc3QpIGhhc2h0YWJsZS5nZXQoa2V5KTsKLQkJaWYgKGFubm90YXRpb25MaXN0ICE9IG51bGwpIHsKLQkJCWZvciAoSXRlcmF0b3IgaSA9IGFubm90YXRpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCUFubm90YXRpb24gYW5ub3RhdGlvbiA9IChBbm5vdGF0aW9uKSBpLm5leHQoKTsKLQkJCQlyZXN1bHQgPSBhbm5vdGF0aW9uLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0JCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoQ01Ob2RlIGNtTm9kZSwgU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJU3RyaW5nIGNtTm9kZVNwZWMgPSAoU3RyaW5nKSBjbU5vZGUuZ2V0UHJvcGVydHkoInNwZWMiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY21Ob2RlU3BlYyA9PSBudWxsKSB7Ci0JCQljbU5vZGVTcGVjID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0JCX0KLQkJaWYgKGNtTm9kZVNwZWMgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gZ2V0UHJvcGVydHkoY21Ob2RlU3BlYywgcHJvcGVydHlOYW1lKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFubm90YXRpb25zKCkgewotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBsb2FkKFN0cmluZyB1cmksIFN0cmluZyBidW5kbGVJZCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUFubm90YXRpb25GaWxlUGFyc2VyIHBhcnNlciA9IG5ldyBBbm5vdGF0aW9uRmlsZVBhcnNlcigpOwotCQlBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8gPSBuZXcgQW5ub3RhdGlvbkZpbGVJbmZvKHVyaSwgYnVuZGxlSWQpOwotCQlwYXJzZXIucGFyc2UodGhpcywgZmlsZUluZm8pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUFueUVsZW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BbnlFbGVtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGM4ZjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUFueUVsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLQotCi1wdWJsaWMgY2xhc3MgQ01BbnlFbGVtZW50SW1wbCBleHRlbmRzIENNQ29udGVudEltcGwgaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBuYW1lc3BhY2VVUkk7ICAKLQotICBwdWJsaWMgQ01BbnlFbGVtZW50SW1wbChTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgbWluT2NjdXIgPSAtMTsKLSAgfSAgICAgICAgICAgICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTm9kZU5hbWUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB1cmkgIT0gbnVsbCA/ICgiYW55IyIgKyB1cmkpIDogImFueSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBDTU5vZGUKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gY29tcHV0ZU5vZGVOYW1lKG5hbWVzcGFjZVVSSSk7Ci0gIH0KLSAKLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQU5ZX0VMRU1FTlQ7Ci0gIH0gCi0KLSAgLy8gaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLSAgLy8KLSAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKQotICB7Ci0gICAgcmV0dXJuIG5hbWVzcGFjZVVSSTsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkYWFhYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbgotewotICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLSAgcHJvdGVjdGVkIFN0cmluZyBub2RlTmFtZTsgICAgCi0gIHByb3RlY3RlZCBpbnQgdXNhZ2U7ICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgY21Eb2N1bWVudDsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJlZml4UXVhbGlmaWNhdGlvbjsKLSAgcHJvdGVjdGVkIExpc3QgeHNpVHlwZXM7Ci0gICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbChTdHJpbmcgbm9kZU5hbWUsIGludCB1c2FnZSkKLSAgewotICAgIHRoaXMobm9kZU5hbWUsIHVzYWdlLCBudWxsKTsKLSAgfSAgICAgCi0KLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsKFN0cmluZyBub2RlTmFtZSwgaW50IHVzYWdlLCBDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7ICAgICAgICAKLSAgICB0aGlzLm5vZGVOYW1lID0gbm9kZU5hbWU7Ci0gICAgdGhpcy51c2FnZSA9IHVzYWdlOwotICAgIHRoaXMuZGF0YVR5cGUgPSBkYXRhVHlwZTsgCi0gIH0gICAgCi0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIE9iamVjdCByZXN1bHQgPSBudWxsOyAgIAotICAgIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJDTURvY3VtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjbURvY3VtZW50OwotICAgIH0gCi0gICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiWFNJVHlwZXMiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0geHNpVHlwZXM7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uc1ByZWZpeFF1YWxpZmljYXRpb24iKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHByZWZpeFF1YWxpZmljYXRpb24gPyAicXVhbGlmaWVkIiA6ICJ1bnF1YWxpZmllZCI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0UHJlZml4UXVhbGlmaWNhdGlvbihib29sZWFuIHF1YWxpZmllZCkKLSAgewotICAgIHByZWZpeFF1YWxpZmljYXRpb24gPSBxdWFsaWZpZWQ7Ci0gIH0gICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldFhTSVR5cGVzKExpc3QgbGlzdCkKLSAgewotICAgIHhzaVR5cGVzID0gbGlzdDsKLSAgfQotICAgICAKLSAgcHVibGljIHZvaWQgc2V0Q01Eb2N1bWVudChDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsKLSAgICB0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbm9kZU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEF0dHJOYW1lKCkKLSAgewotICAgIHJldHVybiBub2RlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEF0dHJUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlID0gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldFVzYWdlKCkKLSAgewotICAgIHJldHVybiB1c2FnZTsKLSAgfQotICAgICAgICAgICAKLSAgLyoqIEBkZXByZWNhdGVkICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgewotICAgIHJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotICB9ICAgICAgICAgICAgICAgICAKLQotICAvKiogQGRlcHJlY2F0ZWQgKi8KLSAgcHVibGljIEVudW1lcmF0aW9uIGdldEVudW1BdHRyKCkKLSAgewotICAgIHJldHVybiBudWxsOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNQ29udGVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjllODI4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Db250ZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIENNQ29udGVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Db250ZW50Ci17Ci0gIHByb3RlY3RlZCBpbnQgbWluT2NjdXIgPSAwOwotICBwcm90ZWN0ZWQgaW50IG1heE9jY3VyID0gLTE7ICAgICAgIAotICAgICAgICAgICAgICAgIAotICAvLyBpbXBsZW1lbnRzIENNQ29udGVudAotICAvLwotICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgewotICAgIHJldHVybiBtYXhPY2N1cjsKLSAgfSAgICAgICAgICAKLSAKLSAgcHVibGljIGludCBnZXRNaW5PY2N1cigpCi0gIHsKLSAgICByZXR1cm4gbWluT2NjdXI7Ci0gIH0gIAotICAgICAKLSAgLy8gaW1wbGVtZW50YXRpb24gc3BlY2lmaWMKLSAgLy8KLSAgcHVibGljIHZvaWQgc2V0TWF4T2NjdXIoaW50IG4pCi0gIHsKLSAgICBtYXhPY2N1ciA9IG47Ci0gIH0gICAgICAgICAgCi0gCi0gIHB1YmxpYyB2b2lkIHNldE1pbk9jY3VyKGludCBuKQotICB7Ci0gICAgbWluT2NjdXIgPSBuOwotICB9ICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRGF0YVR5cGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01EYXRhVHlwZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2NGY3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01EYXRhVHlwZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVJbXBsIGV4dGVuZHMgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNRGF0YVR5cGUKLXsKLSAgcHJvdGVjdGVkIFN0cmluZyBkYXRhVHlwZU5hbWU7Ci0gIHByb3RlY3RlZCBTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWVzOyAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgaW5zdGFuY2VWYWx1ZTsKLQotICBwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSwgU3RyaW5nIGluc3RhbmNlVmFsdWUpCi0gIHsKLSAgICB0aGlzLmRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlTmFtZTsKLSAgICB0aGlzLmluc3RhbmNlVmFsdWUgPSBpbnN0YW5jZVZhbHVlOwotICAgIHRoaXMuZW51bWVyYXRlZFZhbHVlcyA9IG5ldyBTdHJpbmdbMF07Ci0gIH0KLQotICBwdWJsaWMgQ01EYXRhVHlwZUltcGwoU3RyaW5nIGRhdGFUeXBlTmFtZSwgU3RyaW5nW10gZW51bWVyYXRlZFZhbHVlcykKLSAgewotICAgIHRoaXMuZGF0YVR5cGVOYW1lID0gZGF0YVR5cGVOYW1lOwotICAgIHRoaXMuZW51bWVyYXRlZFZhbHVlcyA9IGVudW1lcmF0ZWRWYWx1ZXM7ICAgCi0gICAgdGhpcy5pbnN0YW5jZVZhbHVlID0gZW51bWVyYXRlZFZhbHVlc1swXTsKLSAgfQotCi0KLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIGRhdGFUeXBlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0SW1wbGllZFZhbHVlS2luZCgpCi0gIHsKLSAgICByZXR1cm4gSU1QTElFRF9WQUxVRV9OT05FOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpCi0gIHsKLSAgICByZXR1cm4gZW51bWVyYXRlZFZhbHVlczsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCkKLSAgewotICAgIHJldHVybiBpbnN0YW5jZVZhbHVlOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Eb2N1bWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURvY3VtZW50SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjcyZDY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTURvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEltcGwgZXh0ZW5kcyBDTU5vZGVJbXBsIGltcGxlbWVudHMgQ01Eb2N1bWVudAotewotICBwcm90ZWN0ZWQgU3RyaW5nIHRhcmdldE5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBsb2NhbEVsZW1lbnRQb29sOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGFueUVsZW1lbnRzOwotCi0gIHB1YmxpYyBDTURvY3VtZW50SW1wbChTdHJpbmcgdGFyZ2V0TmFtZXNwYWNlKQotICB7Ci0gICAgdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgewotICAgIHJldHVybiBET0NVTUVOVDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0gIH0KLSAKLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IHRhcmdldE5hbWVzcGFjZTsKLSAgICB9ICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gZWxlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldEFueUVsZW1lbnRzKCkKLSAgeyAKLSAgICBpZiAoYW55RWxlbWVudHMgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBhbnlFbGVtZW50cyA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFueUVsZW1lbnRzOwotICB9Ci0gIAotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXBJbXBsIGdldExvY2FsRWxlbWVudFBvb2woKQotICB7IAotICAgIGlmIChsb2NhbEVsZW1lbnRQb29sID09IG51bGwpCi0gICAgewotICAgICAgbG9jYWxFbGVtZW50UG9vbCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gbG9jYWxFbGVtZW50UG9vbDsKLSAgfQotCi0gIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpCi0gIHsKLSAgICByZXR1cm4gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICB9Ci0KLSAgcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpCi0gIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRWxlbWVudERlY2xhcmF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWY1NzRlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVsZW1lbnREZWNsYXJhdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLQotCi1wdWJsaWMgY2xhc3MgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgQ01Db250ZW50SW1wbCBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgCi0gIHByb3RlY3RlZCBDTURvY3VtZW50IGNtRG9jdW1lbnQ7Ci0gIHByb3RlY3RlZCBDTU5hbWVkTm9kZU1hcEltcGwgYXR0cmlidXRlTWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIGxvY2FsRWxlbWVudE1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgcHJvdGVjdGVkIENNQ29udGVudCBjb250ZW50OwotICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNMb2NhbDsKLQotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKENNRG9jdW1lbnQgY21Eb2N1bWVudCwgU3RyaW5nIG5hbWUpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gIH0gICAgIAotCi0gIC8vIGltcGxlbWVudHMgQ01Ob2RlCi0gIC8vCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAKLSAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gRUxFTUVOVF9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAKLSAgICBPYmplY3QgcmVzdWx0ID0gbnVsbDsgICAgICAgICAgICAgICAKLSAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscygiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgcmVzdWx0ID0gaXNMb2NhbCA/ICJ1bnF1YWxpZmllZCIgOiAicXVhbGlmaWVkIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfSAgICAKLSAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKCJDTURvY3VtZW50IikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICByZXN1bHQgPSBjbURvY3VtZW50OyAgICAgICAKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAgICAgICAgICAgCi0gIC8vIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24KLSAgLy8KLSAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKQotICB7Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZU1hcDsKLSAgfSAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBDTUNvbnRlbnQgZ2V0Q29udGVudCgpCi0gIHsKLSAgICByZXR1cm4gY29udGVudDsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIE1JWEVEOwotICB9ICAgICAgICAgICAgCi0KLSAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldERhdGFUeXBlKCkKLSAgeyAKLSAgICByZXR1cm4gZGF0YVR5cGU7Ci0gIH0KLQotICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpCi0gIHsgCi0gICAgcmV0dXJuIGxvY2FsRWxlbWVudE1hcDsKLSAgfSAKLSAgICAKLSAgLy8KLSAgLy8KLSAgcHVibGljIHZvaWQgc2V0Q29udGVudChDTUNvbnRlbnQgY21Db250ZW50KQotICB7Ci0gICAgY29udGVudCA9IGNtQ29udGVudDsKLSAgfSAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgc2V0RGF0YVR5cGUoQ01EYXRhVHlwZSBjbURhdGFUeXBlKQotICB7Ci0gICAgZGF0YVR5cGUgPSBjbURhdGFUeXBlOwotICB9Ci0KLSAgcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCBnZXRBdHRyaWJ1dGVNYXAoKQotICB7Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZU1hcDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsKGJvb2xlYW4gaXNMb2NhbCkKLSAgewotICAgIHRoaXMuaXNMb2NhbCA9IGlzTG9jYWw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUVudGl0eURlY2xhcmF0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRW50aXR5RGVjbGFyYXRpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MWI3ZjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNRW50aXR5RGVjbGFyYXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCBleHRlbmRzIENNTm9kZUltcGwgaW1wbGVtZW50cyBDTUVudGl0eURlY2xhcmF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgdmFsdWU7Ci0KLSAgcHVibGljIENNRW50aXR5RGVjbGFyYXRpb25JbXBsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEVOVElUWV9ERUNMQVJBVElPTjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICB7Ci0gICAgcmV0dXJuIG5hbWU7Ci0gIH0KLSAKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpCi0gIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLX0gICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTUdyb3VwSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNR3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NGZmMmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNR3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgQ01Hcm91cEltcGwgZXh0ZW5kcyBDTUNvbnRlbnRJbXBsIGltcGxlbWVudHMgQ01Hcm91cAotewotICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBub2RlTGlzdDsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBpbnQgb3BlcmF0b3I7ICAKLQotICBwdWJsaWMgQ01Hcm91cEltcGwoQ01Ob2RlTGlzdCBub2RlTGlzdCwgaW50IG9wZXJhdG9yKQotICB7Ci0gICAgdGhpcy5ub2RlTGlzdCA9IG5vZGVMaXN0OwotICAgIHRoaXMub3BlcmF0b3IgPSBvcGVyYXRvcjsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICB7Ci0gICAgcmV0dXJuIEdST1VQOwotICB9Ci0gCi0gIHB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVMaXN0OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRPcGVyYXRvcigpCi0gIHsKLSAgICByZXR1cm4gb3BlcmF0b3I7Ci0gIH0gCi19ICAgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01OYW1lZE5vZGVNYXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MDJiYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTmFtZWROb2RlTWFwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljOwotCi1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBDTU5hbWVkTm9kZU1hcEltcGwgaW1wbGVtZW50cyBDTU5hbWVkTm9kZU1hcCAKLXsKLSAgcHVibGljIHN0YXRpYyBDTU5hbWVkTm9kZU1hcEltcGwgRU1QVFlfTkFNRURfTk9ERV9NQVAgPSBuZXcgQ01OYW1lZE5vZGVNYXBJbXBsKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgdGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0KLSAgLyoqCi0gICAqIENNTmFtZWROb2RlTWFwSW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotICAgKi8KLSAgcHVibGljIENNTmFtZWROb2RlTWFwSW1wbCgpCi0gIHsKLSAgCXN1cGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogZ2V0TGVuZ3RoIG1ldGhvZAotICAgKiBAcmV0dXJuIGludAotICAgKi8KLSAgcHVibGljIGludCBnZXRMZW5ndGgoKQotICB7Ci0gIAlyZXR1cm4gdGFibGUuc2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIGdldE5hbWVkSXRlbSBtZXRob2QKLSAgICogQHJldHVybiBDTU5vZGUKLSAgICogQHBhcmFtIG5hbWUgamF2YS5sYW5nLlN0cmluZwotICAgKi8KLSAgcHVibGljIENNTm9kZSBnZXROYW1lZEl0ZW0oU3RyaW5nIG5hbWUpCi0gIHsKLSAgCXJldHVybiAoQ01Ob2RlKXRhYmxlLmdldChuYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBpdGVtIG1ldGhvZAotICAgKiBAcmV0dXJuIENNTm9kZQotICAgKiBAcGFyYW0gaW5kZXggaW50Ci0gICAqLwotICBwdWJsaWMgQ01Ob2RlIGl0ZW0oaW50IGluZGV4KQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IHNpemUgPSB0YWJsZS5zaXplKCk7Ci0gICAgaWYgKGluZGV4IDwgc2l6ZSkKLSAgICB7Ci0gICAgICBFbnVtZXJhdGlvbiB2YWx1ZXMgPSB0YWJsZS5lbGVtZW50cygpOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBpbmRleDsgaSsrKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQ01Ob2RlKXZhbHVlcy5uZXh0RWxlbWVudCgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICBwdWJsaWMgSGFzaHRhYmxlIGdldEhhc2h0YWJsZSgpCi0gIHsKLSAgICAgICAgICByZXR1cm4gdGFibGU7Ci0gIH0KLSAgCi0gIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpCi0gIHsKLSAgICAgICAgICByZXR1cm4gdGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfSAgICAgICAgCi0gIAotICBwdWJsaWMgdm9pZCBwdXQoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIHRhYmxlLnB1dChjbU5vZGUuZ2V0Tm9kZU5hbWUoKSwgY21Ob2RlKTsKLSAgfQotfQotICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvYmFzaWMvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2NlY2UwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ01Ob2RlSW1wbCBpbXBsZW1lbnRzIENNTm9kZQoteyAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0luZmVycmVkID0gZmFsc2U7Ci0gICAKLSAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLSAgfQotIAotICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IAotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgeyAgICAgICAgICAgICAgCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKCJpc0luZmVycmVkIi5lcXVhbHMocHJvcGVydHlOYW1lKSkgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGlzSW5mZXJyZWQgPyBCb29sZWFuLlRSVUUgOiBCb29sZWFuLkZBTFNFOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gIHB1YmxpYyB2b2lkIHNldEluZmVycmVkKGJvb2xlYW4gaXNJbmZlcnJlZCkKLSAgewotICAgIHRoaXMuaXNJbmZlcnJlZCA9IGlzSW5mZXJyZWQ7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9iYXNpYy9DTU5vZGVMaXN0SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MjM1MTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2Jhc2ljL0NNTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLQotcHVibGljIGNsYXNzIENNTm9kZUxpc3RJbXBsIGltcGxlbWVudHMgQ01Ob2RlTGlzdCAKLXsKLSAgcHVibGljIHN0YXRpYyBDTU5vZGVMaXN0SW1wbCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoQ29sbGVjdGlvbnMuRU1QVFlfTElTVCk7Ci0gIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLSAgcHVibGljIENNTm9kZUxpc3RJbXBsKCkKLSAgewotICAgIHRoaXMobmV3IFZlY3RvcigpKTsKLSAgfQotCi0gIHB1YmxpYyBDTU5vZGVMaXN0SW1wbChMaXN0IGxpc3QpCi0gIHsKLSAgICB0aGlzLmxpc3QgPSBsaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIGdldExlbmd0aCBtZXRob2QKLSAgICogQHJldHVybiBpbnQKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkKLSAgewotICAgIHJldHVybiBsaXN0LnNpemUoKTsKLSAgfQotICAvKioKLSAgICogaXRlbSBtZXRob2QKLSAgICogQHJldHVybiBDTU5vZGUKLSAgICogQHBhcmFtIGluZGV4IGludAotICAgKi8KLSAgcHVibGljIENNTm9kZSBpdGVtKGludCBpbmRleCkKLSAgewotICAgIHJldHVybiAoQ01Ob2RlKWxpc3QuZ2V0KGluZGV4KTsKLSAgfQotICAKLSAgcHVibGljIExpc3QgZ2V0TGlzdCgpCi0gIHsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotICAKLSAgcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkKLSAgewotICAgIHJldHVybiBsaXN0Lml0ZXJhdG9yKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICByZXR1cm4gbGlzdC5jb250YWlucyhjbU5vZGUpOwotICB9IAotICAKLSAgcHVibGljIHZvaWQgYWRkKENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBsaXN0LmFkZChjbU5vZGUpOwotICB9ICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNTcxZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0vLyB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGJ1aWxkIGEgZ3JhbW1hciBkb2N1bWVudCBnaXZlbiBhIGxvY2FsIGZpbGUgbmFtZQotLy8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudEZhY3RvcnkKLXsgICAKLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MTE2YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yCi17Ci0gIHByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGZFbGVtZW50OwotICBwcml2YXRlIENNRG9jdW1lbnRGYWN0b3J5IGZhY3Rvcnk7Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvcihJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIHRoaXMuZkVsZW1lbnQgPSBlbGVtZW50OwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnRGYWN0b3J5IGdldEZhY3RvcnkoKQotICB7Ci0gICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZmFjdG9yeSA9IChDTURvY3VtZW50RmFjdG9yeSkgZkVsZW1lbnQuY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgICBMb2dnZXIubG9nRXhjZXB0aW9uKCJFeGNlcHRpb24gbG9hZGluZyBDTURvY3VtZW50RmFjdG9yeSIsZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMxNTRmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvZmFjdG9yeS9DTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuZmFjdG9yeTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLyoqCi0gKiAKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSAKLXsKLQlwcm90ZWN0ZWQgc3RhdGljIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgaW5zdGFuY2U7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUkVTT1VSQ0VfVFlQRSA9ICIqIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIE1hcCByZXNvdXJjZVR5cGVNYXAgPSBuZXcgSGFzaE1hcCgpOwotCi0JcHJvdGVjdGVkIFZlY3RvciBkb2N1bWVudEJ1aWxkZXJMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0JcHVibGljIENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkoKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgcHV0RmFjdG9yeShTdHJpbmcgcmVzb3VyY2VUeXBlLCBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IgZmFjdG9yeURlc2NyaXB0b3IpIHsKLQkJcmVzb3VyY2VUeXBlTWFwLnB1dChyZXNvdXJjZVR5cGUsIGZhY3RvcnlEZXNjcmlwdG9yKTsKLQl9Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnkgZ2V0RmFjdG9yeShTdHJpbmcgcmVzb3VyY2VUeXBlKSB7Ci0JCUNNRG9jdW1lbnRGYWN0b3J5RGVzY3JpcHRvciBmYWN0b3J5RGVzY3JpcHRvciA9IG51bGw7Ci0JCWlmIChyZXNvdXJjZVR5cGUgIT0gbnVsbCkgewotCQkJZmFjdG9yeURlc2NyaXB0b3IgPSAoQ01Eb2N1bWVudEZhY3RvcnlEZXNjcmlwdG9yKSByZXNvdXJjZVR5cGVNYXAuZ2V0KHJlc291cmNlVHlwZSk7Ci0JCX0KLQkJaWYgKGZhY3RvcnlEZXNjcmlwdG9yID09IG51bGwpIHsKLQkJCS8vIChkbXcpIGlzc3VlOiBhIGRlZmF1bHQgdHlwZSBvZiAnKicgbWVhbnMgd2hhdD8gcmVnaXN0ZXJlZCBhcwotCQkJLy8gJyonIGlzIHRoZSB3YXkgdGhpcyB3b3JrcyBub3cuIGlzIHRoYXQgdGhlIGludGVudD8gT3Igc2hvdWxkIGl0Ci0JCQkvLyBtZWFuIHJlZ2lzdGVyZWQgYXMgYW55IG90aGVyIHR5cGU/Ci0JCQlmYWN0b3J5RGVzY3JpcHRvciA9IChDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IpIHJlc291cmNlVHlwZU1hcC5nZXQoREVGQVVMVF9SRVNPVVJDRV9UWVBFKTsKLQkJfQotCQlyZXR1cm4gZmFjdG9yeURlc2NyaXB0b3IgIT0gbnVsbCA/IGZhY3RvcnlEZXNjcmlwdG9yLmdldEZhY3RvcnkoKSA6IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ZhY3RvcnkvQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjlkYWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9mYWN0b3J5L0NNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5OwotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJkb2N1bWVudEZhY3RvcmllcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZmFjdG9yeSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0NMQVNTID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfVFlQRSA9ICJ0eXBlIjsgICAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBTdHJpbmcgcGx1Z2luSWQsIGV4dGVuc2lvblBvaW50SWQ7Ci0gIAotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeTsKLSAgCi0gIHB1YmxpYyBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5UmVhZGVyKENNRG9jdW1lbnRGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpCi0gIHsKLSAgCXRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0gIHsKLSAgICBTdHJpbmcgYnVuZGxlaWQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIjsgLy8kTk9OLU5MUy0xJAotICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0RXh0ZW5zaW9uUG9pbnQoYnVuZGxlaWQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0gICAgaWYgKHBvaW50ICE9IG51bGwpCi0gICAgewotICAgICAgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKQotICAgIHsKLSAgICAgIFN0cmluZyBmYWN0b3J5Q2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotICAgICAgU3RyaW5nIGZpbGVuYW1lRXh0ZW5zaW9ucyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9UWVBFKTsKLSAgICAgIGlmIChmYWN0b3J5Q2xhc3MgIT0gbnVsbCAmJiBmaWxlbmFtZUV4dGVuc2lvbnMgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBDTURvY3VtZW50RmFjdG9yeURlc2NyaXB0b3IoZWxlbWVudCk7Ci0gICAgICAgICAgZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGZpbGVuYW1lRXh0ZW5zaW9ucywgIiwiKTsgc3QuaGFzTW9yZVRva2VucygpOyApIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgCVN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCXJlZ2lzdHJ5LnB1dEZhY3RvcnkodG9rZW4sIGRlc2NyaXB0b3IpOwkKLSAgICAgICAgICB9ICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZUluZm8uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzYxYjE5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlSW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLS8qKgotICogQ29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYW5ub3RhdGlvbiBmaWxlcwotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkZpbGVJbmZvIHsKLQlwcml2YXRlIFN0cmluZyBmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbjsKLQlwcml2YXRlIFN0cmluZyBmQnVuZGxlSWQ7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVJbmZvKFN0cmluZyBhbm5vdGF0aW9uRmlsZUxvY2F0aW9uLCBTdHJpbmcgYnVuZGxlSWQpIHsKLQkJZkFubm90YXRpb25GaWxlTG9jYXRpb24gPSBhbm5vdGF0aW9uRmlsZUxvY2F0aW9uOwotCQlmQnVuZGxlSWQgPSBidW5kbGVJZDsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBhbm5vdGF0aW9uIGZpbGUgYXMgb3JpZ2luYWxseSBzcGVjaWZpZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFubm90YXRpb25GaWxlTG9jYXRpb24oKSB7Ci0JCXJldHVybiBmQW5ub3RhdGlvbkZpbGVMb2NhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIGJ1bmRsZSBpZCB3aGVyZSB0aGUgYW5ub3RhdGlvbiBmaWxlIGlzIGxvY2F0ZWQuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEJ1bmRsZUlkKCkgewotCQlyZXR1cm4gZkJ1bmRsZUlkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTczMDgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uTWFwOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25GaWxlUGFyc2VyIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURfQU5OT1RBVElPTlMgPSAiYWJzdHJhY3RHcmFtbWFyQW5ub3RhdGlvbnMiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX0lEX0FOTk9UQVRJT04gPSAiYW5ub3RhdGlvbiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfSURfUFJPUEVSVFkgPSAicHJvcGVydHkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gcGFyc2UgYW4gYW5ub3RhdGlvbiBmaWxlIGFuZCBzdG9yZSB0aGUKLQkgKiBjb250ZW50cyBpbnRvIGFuIGFubm90YXRpb25NYXAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcGFyc2UoQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwLCBJbnB1dFN0cmVhbSBpbnB1dCwgQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJLy8gbW92ZSB0byBYZXJjZXMtMi4uLi4gYWRkICdjb250ZXh0Q2xhc3NMb2FkZXInIHN0dWZmCi0JCUNsYXNzTG9hZGVyIHByZXZDbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7Ci0JCXRyeSB7Ci0JCQlTQVhQYXJzZXJGYWN0b3J5IGZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0JCQlmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCQkJU0FYUGFyc2VyIHBhcnNlciA9IGZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0JCQlwYXJzZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0KSwgbmV3IEFubm90YXRpb25NYXBDb250ZW50SGFuZGxlcihhbm5vdGF0aW9uTWFwLCBmaWxlSW5mbykpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIocHJldkNsYXNzTG9hZGVyKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBwYXJzZSBhbiBhbm5vdGF0aW9uIGZpbGUgYW5kIHN0b3JlIHRoZQotCSAqIGNvbnRlbnRzIGludG8gYW4gYW5ub3RhdGlvbk1hcAotCSAqLwotCXB1YmxpYyB2b2lkIHBhcnNlKEFubm90YXRpb25NYXAgbWFwLCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHRocm93cyBFeGNlcHRpb24gewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlVUkwgdXJsID0gUGxhdGZvcm0uZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoZmlsZUluZm8uZ2V0QnVuZGxlSWQoKSksIFBhdGguZnJvbU9TU3RyaW5nKGZpbGVJbmZvLmdldEFubm90YXRpb25GaWxlTG9jYXRpb24oKSkpOwotCQkJaWYgKHVybCAhPSBudWxsKSB7Ci0JCQkJaW5wdXRTdHJlYW0gPSB1cmwub3BlblN0cmVhbSgpOwotCQkJCXBhcnNlKG1hcCwgaW5wdXRTdHJlYW0sIGZpbGVJbmZvKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCXRocm93IChlKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCXRyeSB7Ci0JCQkJaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkJCQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIGNsYXNzIEFubm90YXRpb25NYXBDb250ZW50SGFuZGxlciBleHRlbmRzIERlZmF1bHRIYW5kbGVyIHsKLQkJcHJpdmF0ZSBBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXA7Ci0JCXByaXZhdGUgQW5ub3RhdGlvbiBjdXJyZW50QW5ub3RhdGlvbjsKLQkJcHJpdmF0ZSBTdHJpbmcgY3VycmVudFByb3BlcnR5TmFtZTsKLQkJcHJpdmF0ZSBTdHJpbmdCdWZmZXIgcHJvcGVydHlWYWx1ZUJ1ZmZlcjsKLQkJcHJpdmF0ZSBSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZTsKLQkJcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZUluZm8gZkZpbGVJbmZvOwotCi0JCXB1YmxpYyBBbm5vdGF0aW9uTWFwQ29udGVudEhhbmRsZXIoQW5ub3RhdGlvbk1hcCBhbm5vdGF0aW9uTWFwLCBBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8pIHsKLQkJCXRoaXMuYW5ub3RhdGlvbk1hcCA9IGFubm90YXRpb25NYXA7Ci0JCQl0aGlzLmZGaWxlSW5mbyA9IGZpbGVJbmZvOwotCQl9Ci0KLQkJcHJpdmF0ZSBVUkwgZ2VuZXJhdGVQcm9wZXJ0aWVzRmlsZVVSTChBbm5vdGF0aW9uRmlsZUluZm8gZmlsZUluZm8sIFN0cmluZyBwcm9wZXJ0aWVzTG9jYXRpb24pIHsKLQkJCVVSTCBwcm9wZXJ0aWVzVVJMID0gbnVsbDsKLQotCQkJLy8gcHJlcGVuZCAkbmwkIHZhcmlhYmxlIHRvIGxvY2F0aW9uCi0JCQlJUGF0aCBhbm5vdGF0aW9uUGF0aCA9IFBhdGguZnJvbU9TU3RyaW5nKCIkbmwkLyIgKyBmaWxlSW5mby5nZXRBbm5vdGF0aW9uRmlsZUxvY2F0aW9uKCkpOyAvLyROT04tTkxTLTEkCi0JCQkvLyByZW1vdmUgdGhlIGFubm90YXRpb24ueG1sIGZpbGUKLQkJCUlQYXRoIGFubm90YXRpb25Gb2xkZXIgPSBhbm5vdGF0aW9uUGF0aC5yZW1vdmVMYXN0U2VnbWVudHMoMSk7Ci0JCQkvLyBhcHBlbmQgbG9jYXRpb24gb2YgcHJvcGVydGlsZXMgZmlsZQotCQkJSVBhdGggcHJvcGVydGllc0ZpbGUgPSBhbm5vdGF0aW9uRm9sZGVyLmFwcGVuZChwcm9wZXJ0aWVzTG9jYXRpb24pOwotCQkJLy8gYXBwZW5kIC5wcm9wZXJ0aWVzIGV4dGVuc2lvbiBpZiBuZWVkZWQKLQkJCWlmIChwcm9wZXJ0aWVzRmlsZS5nZXRGaWxlRXh0ZW5zaW9uKCkgPT0gbnVsbCkKLQkJCQlwcm9wZXJ0aWVzRmlsZSA9IHByb3BlcnRpZXNGaWxlLmFkZEZpbGVFeHRlbnNpb24oInByb3BlcnRpZXMiKTsgLy8kTk9OLU5MUy0xJAotCQkJLy8gY3JlYXRlIGEgVVJMIG91dCBvZiB0aGUgcHJvcGVydGllcyBmaWxlIGxvY2F0aW9uCi0JCQlwcm9wZXJ0aWVzVVJMID0gUGxhdGZvcm0uZmluZChQbGF0Zm9ybS5nZXRCdW5kbGUoZmlsZUluZm8uZ2V0QnVuZGxlSWQoKSksIHByb3BlcnRpZXNGaWxlKTsKLQkJCXJldHVybiBwcm9wZXJ0aWVzVVJMOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCXByb3BlcnR5VmFsdWVCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfQU5OT1RBVElPTlMpKSB7Ci0JCQkJaW50IGF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlc0xlbmd0aDsgaSsrKSB7Ci0JCQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlcy5nZXRMb2NhbE5hbWUoaSk7Ci0JCQkJCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoaSk7Ci0JCQkJCWlmIChhdHRyaWJ1dGVOYW1lLmVxdWFscygicHJvcGVydGllc0xvY2F0aW9uIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJVVJMIGJ1bmRsZVVSTCA9IGdlbmVyYXRlUHJvcGVydGllc0ZpbGVVUkwoZkZpbGVJbmZvLCBhdHRyaWJ1dGVWYWx1ZSk7Ci0JCQkJCQlpZiAoYnVuZGxlVVJMICE9IG51bGwpIHsKLQkJCQkJCQlJbnB1dFN0cmVhbSBidW5kbGVTdHJlYW0gPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCWJ1bmRsZVN0cmVhbSA9IGJ1bmRsZVVSTC5vcGVuU3RyZWFtKCk7Ci0JCQkJCQkJCXJlc291cmNlQnVuZGxlID0gbmV3IFByb3BlcnR5UmVzb3VyY2VCdW5kbGUoYnVuZGxlU3RyZWFtKTsKLQkJCQkJCQl9Ci0JCQkJCQkJY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJdHJ5IHsKLQkJCQkJCQkJCWlmIChidW5kbGVTdHJlYW0gIT0gbnVsbCkKLQkJCQkJCQkJCQlidW5kbGVTdHJlYW0uY2xvc2UoKTsKLQkJCQkJCQkJfQotCQkJCQkJCQljYXRjaCAoSU9FeGNlcHRpb24geCkgewotCQkJCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgeC5nZXRNZXNzYWdlKCksIHgpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKGF0dHJpYnV0ZU5hbWUuZXF1YWxzKCJjYXNlU2Vuc2l0aXZlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJaWYgKGF0dHJpYnV0ZVZhbHVlLnRyaW0oKS5lcXVhbHMoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlhbm5vdGF0aW9uTWFwLnNldENhc2VTZW5zaXRpdmUoZmFsc2UpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfQU5OT1RBVElPTikpIHsKLQkJCQljdXJyZW50QW5ub3RhdGlvbiA9IG51bGw7Ci0JCQkJU3RyaW5nIHNwZWNWYWx1ZSA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoInNwZWMiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChzcGVjVmFsdWUgIT0gbnVsbCkgewotCQkJCQljdXJyZW50QW5ub3RhdGlvbiA9IG5ldyBBbm5vdGF0aW9uKCk7Ci0JCQkJCWN1cnJlbnRBbm5vdGF0aW9uLnNldFNwZWMoc3BlY1ZhbHVlKTsKLQkJCQl9Ci0JCQkJYW5ub3RhdGlvbk1hcC5hZGRBbm5vdGF0aW9uKGN1cnJlbnRBbm5vdGF0aW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGxvY2FsTmFtZS5lcXVhbHMoVEFHX0lEX1BST1BFUlRZKSkgewotCQkJCWlmIChjdXJyZW50QW5ub3RhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWN1cnJlbnRQcm9wZXJ0eU5hbWUgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJuYW1lIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7Ci0JCQlpZiAoY3VycmVudFByb3BlcnR5TmFtZSAhPSBudWxsICYmIGN1cnJlbnRBbm5vdGF0aW9uICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJvcGVydHlWYWx1ZSA9IHByb3BlcnR5VmFsdWVCdWZmZXIudG9TdHJpbmcoKTsKLQkJCQlpZiAocHJvcGVydHlWYWx1ZSAhPSBudWxsKSB7Ci0JCQkJCWlmIChwcm9wZXJ0eVZhbHVlLnN0YXJ0c1dpdGgoIiUiKSAmJiByZXNvdXJjZUJ1bmRsZSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0JCQkJCXsKLQkJCQkJCXRyeSB7Ci0JCQkJCQkJcHJvcGVydHlWYWx1ZSA9IHJlc291cmNlQnVuZGxlLmdldFN0cmluZyhwcm9wZXJ0eVZhbHVlLnN1YnN0cmluZygxKSk7Ci0JCQkJCQl9Ci0JCQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJCQkvLyBpZ25vcmUgYW55IGV4Y2VwdGlvbiB0aGF0IG9jY3VycyB3aGlsZSB0cnlpbmcKLQkJCQkJCQkvLyB0byBmZXRjaCBhIHJlc291cmNlCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudEFubm90YXRpb24uc2V0UHJvcGVydHkoY3VycmVudFByb3BlcnR5TmFtZSwgcHJvcGVydHlWYWx1ZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAobG9jYWxOYW1lLmVxdWFscyhUQUdfSURfQU5OT1RBVElPTikpIHsKLQkJCQljdXJyZW50QW5ub3RhdGlvbiA9IG51bGw7Ci0JCQl9Ci0JCQllbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKFRBR19JRF9QUk9QRVJUWSkpIHsKLQkJCQljdXJyZW50UHJvcGVydHlOYW1lID0gbnVsbDsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpIHsKLQkJCWlmIChjdXJyZW50UHJvcGVydHlOYW1lICE9IG51bGwgJiYgY3VycmVudEFubm90YXRpb24gIT0gbnVsbCkgewotCQkJCXByb3BlcnR5VmFsdWVCdWZmZXIuYXBwZW5kKGNoLCBzdGFydCwgbGVuZ3RoKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkwOTRjZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYXNzb2NpYXRlIG9uZSBvciBtb3JlIGFubm90YXRpb24gZmlsZXMgd2l0aCBhIGdyYW1tYXIKLSAqIGZpbGUuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFubm90YXRpb25GaWxlUmVnaXN0cnkgewotCXByaXZhdGUgTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeSgpIHsKLQkJbmV3IEFubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIodGhpcykucmVhZFJlZ2lzdHJ5KCk7Ci0JfQotCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgTGlzdCBnZXRBbm5vdGF0aW9uRmlsZXNJbmZvcyhTdHJpbmcgcHVibGljSWQpIHsKLQkJTGlzdCB0aGVMaXN0ID0gKExpc3QpIG1hcC5nZXQocHVibGljSWQpOwotCQlyZXR1cm4gdGhlTGlzdCAhPSBudWxsID8gdGhlTGlzdCA6IG5ldyBBcnJheUxpc3QoKTsKLQl9Ci0JCQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRBbm5vdGF0aW9uRmlsZShTdHJpbmcgcHVibGljSWQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQlMaXN0IGZpbGVJbmZvcyA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJaWYgKGZpbGVJbmZvcyA9PSBudWxsKSB7Ci0JCQlmaWxlSW5mb3MgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQltYXAucHV0KHB1YmxpY0lkLCBmaWxlSW5mb3MpOwotCQl9Ci0JCWZpbGVJbmZvcy5hZGQoZmlsZUluZm8pOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBbm5vdGF0aW9uRmlsZShTdHJpbmcgcHVibGljSWQsIEFubm90YXRpb25GaWxlSW5mbyBmaWxlSW5mbykgewotCQlMaXN0IGZpbGVJbmZvcyA9IChMaXN0KSBtYXAuZ2V0KHB1YmxpY0lkKTsKLQkJaWYgKGZpbGVJbmZvcyAhPSBudWxsKSB7Ci0JCQlmaWxlSW5mb3MucmVtb3ZlKGZpbGVJbmZvKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25GaWxlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY3OGQ4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyB0aGUgcGx1Z2luIG1hbmlmZXN0cyBhbmQgYWRkcyBlYWNoIHNwZWNpZmllZCBncmFtYW1yCi0gKiBhbm5vdGF0aW9uIGZpbGUgd2l0aCB0aGUgQW5ub3RhdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5UmVhZGVyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiYW5ub3RhdGlvbkZpbGVzIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gImFubm90YXRpb25GaWxlIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9QVUJMSUNfSUQgPSAicHVibGljSWQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnk7Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbkZpbGVSZWdpc3RyeVJlYWRlcihBbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5IGFubm90YXRpb25GaWxlUmVnaXN0cnkpIHsKLQkJdGhpcy5hbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5ID0gYW5ub3RhdGlvbkZpbGVSZWdpc3RyeTsKLQl9Ci0KLQkvKioKLQkgKiByZWFkIGZyb20gcGx1Z2luIHJlZ2lzdHJ5IGFuZCBwYXJzZSBpdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZWFkUmVnaXN0cnkoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCVN0cmluZyBwbHVnaW5JZCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCUlFeHRlbnNpb25Qb2ludCBwb2ludCA9IGV4dGVuc2lvblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KHBsdWdpbklkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZWxlbWVudHMgPSBwb2ludC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQlyZWFkRWxlbWVudChlbGVtZW50c1tpXSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZWFkRWxlbWVudCgpIC0gcGFyc2UgYW5kIGRlYWwgd2l0aCBhbiBleHRlbnNpb24gbGlrZToKLQkgKiAKLQkgKiA8ZXh0ZW5zaW9uCi0JICogcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbF9pbXBsZW1lbnRhdGlvbiI+Ci0JICogPHV0aWxfaW1wbGVtZW50YXRpb24gY2xhc3MgPQotCSAqIGNvcmcuZWNsaXBzZS53c3QuYmFzZXV0aWwuQ01VdGlsSW1wbGVtZW50YXRpb25JbXBsIC8+IDwvZXh0ZW5zaW9uPgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlYWRFbGVtZW50KElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHMoVEFHX05BTUUpKSB7Ci0JCQlTdHJpbmcgcHVibGljSWQgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfUFVCTElDX0lEKTsKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9MT0NBVElPTik7Ci0JCQlpZiAocHVibGljSWQgIT0gbnVsbCAmJiBsb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJU3RyaW5nIGJ1bmRsZUlkID0gZWxlbWVudC5nZXROYW1lc3BhY2UoKTsKLQkJCQkJQW5ub3RhdGlvbkZpbGVJbmZvIGZpbGVJbmZvID0gbmV3IEFubm90YXRpb25GaWxlSW5mbyhsb2NhdGlvbiwgYnVuZGxlSWQpOwotCQkJCQlhbm5vdGF0aW9uRmlsZVJlZ2lzdHJ5LmFkZEFubm90YXRpb25GaWxlKHB1YmxpY0lkLCBmaWxlSW5mbyk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGFkZGluZyBhbm5vdGF0aW9uIGZpbGUgIiArIGxvY2F0aW9uLCBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9Bbm5vdGF0aW9uVXRpbGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWNmYzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL0Fubm90YXRpb25VdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmFubm90YXRpb24uQW5ub3RhdGlvbk1hcDsKLQotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQW5ub3RhdGlvblV0aWxpdHkgewotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2FkQW5ub3RhdGlvbnNGb3JHcmFtbWFyKFN0cmluZyBwdWJsaWNJZCwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCUxpc3QgYW5ub3RhdGlvbkZpbGVzID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmdldEFubm90YXRpb25GaWxlc0luZm9zKHB1YmxpY0lkKTsKLQkJQW5ub3RhdGlvbk1hcCBtYXAgPSAoQW5ub3RhdGlvbk1hcCkgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiYW5ub3RhdGlvbk1hcCIpOyAvLyROT04tTkxTLTEkCi0JCWlmIChtYXAgIT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpID0gYW5ub3RhdGlvbkZpbGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCXRyeSB7Ci0JCQkJCUFubm90YXRpb25GaWxlSW5mbyBhbm5vdGF0aW9uRmlsZUluZm8gPSAoQW5ub3RhdGlvbkZpbGVJbmZvKSBpLm5leHQoKTsKLQkJCQkJQW5ub3RhdGlvbkZpbGVQYXJzZXIgcGFyc2VyID0gbmV3IEFubm90YXRpb25GaWxlUGFyc2VyKCk7Ci0JCQkJCXBhcnNlci5wYXJzZShtYXAsIGFubm90YXRpb25GaWxlSW5mbyk7Ci0JCQkJfQotCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvYW5ub3RhdGlvbi9SZXNvdXJjZUJ1bmRsZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzNlMTkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9hbm5vdGF0aW9uL1Jlc291cmNlQnVuZGxlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLQotCi1wdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVIZWxwZXIKLXsKLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkksIExvY2FsZSB0YXJnZXRMb2NhbGUpIHRocm93cyBFeGNlcHRpb24KLSAgewotCSAgLy8gdHJ5IHRvIGxvYWQgYnVuZGxlIGZyb20gdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiB0aGUgcmVzb3VyY2VVUkkKLSAgICAvLyB3ZSBtYWtlIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIHJlc291cmNlVVJJIHBvaW50cyB0byB0aGUgbG9jYWwgZmlsZSBzeXN0ZW0KLSAgICAgICAgIAotICAgIGludCBpbmRleCA9IHJlc291cmNlVVJJLmxhc3RJbmRleE9mKCIvIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggPT0gLTEpCi0gICAgewotICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiSW52YWxpZCByZXNvdXJjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIC8vIEJlbG93IHdlIHNldCAncmVzb3VyY2VEaXJlY3RvcnknIHNvIHRoYXQgaXQgZW5kcyB3aXRoIGEgJy8nLgotICAgIC8vIEhlcmUncyBhbiBleGNlcnB0IGZyb20gdGhlIENsYXNzTG9hZGVyIEphdmFkb2MgLi4uCi0gICAgLy8gQW55IFVSTCB0aGF0IGVuZHMgd2l0aCBhICcvJyBpcyBhc3N1bWVkIHRvIHJlZmVyIHRvIGEgZGlyZWN0b3J5LiBPdGhlcndpc2UsIHRoZSBVUkwgaXMgYXNzdW1lZAotICAgIC8vIHRvIHJlZmVyIHRvIGEgSkFSIGZpbGUgd2hpY2ggd2lsbCBiZSBvcGVuZWQgYXMgbmVlZGVkLiAKLSAgICAvLwotICAgIFN0cmluZyByZXNvdXJjZURpcmVjdG9yeSA9IHJlc291cmNlVVJJLnN1YnN0cmluZygwLCBpbmRleCArIDEpOwotICAgIFN0cmluZyByZXNvdXJjZUJ1bmRsZU5hbWUgPSByZXNvdXJjZVVSSS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLSAgICAKLSAgICAvLyBjcmVhdGUgYSBjbGFzcyBsb2FkZXIgd2l0aCBhIGNsYXNzIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHJlc291cmNlIGJ1bmRsZSdzIGxvY2F0aW9uCi0gICAgLy8gICAgICAgICAKLSAgICBVUkxbXSBjbGFzc3BhdGggPSBuZXcgVVJMWzFdOwotICAgIGNsYXNzcGF0aFswXSA9IFBsYXRmb3JtLnJlc29sdmUobmV3IFVSTChyZXNvdXJjZURpcmVjdG9yeSkpOwotCSAgQ2xhc3NMb2FkZXIgcmVzb3VyY2VMb2FkZXIgPSBuZXcgVVJMQ2xhc3NMb2FkZXIoY2xhc3NwYXRoLCBudWxsKTsgCi0gICAgICAgCi0gIAlyZXR1cm4gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKHJlc291cmNlQnVuZGxlTmFtZSwgdGFyZ2V0TG9jYWxlLCByZXNvdXJjZUxvYWRlcik7Ci0JfSAgCi0KLSAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZShTdHJpbmcgcmVzb3VyY2VVUkkpIHRocm93cyBFeGNlcHRpb24gCi0gIHsKLQkgIHJldHVybiBnZXRSZXNvdXJjZUJ1bmRsZShyZXNvdXJjZVVSSSwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYWM1OTI3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNQW55RWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRG9jdW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Hcm91cEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5hbWVkTm9kZU1hcEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTU5vZGVMaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotIAotCi1wdWJsaWMgY2xhc3MgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeQoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBJbmZlcnJlZEdyYW1tYXJGYWN0b3J5KCkKLSAgewotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnRJbXBsIGNtZG9jdW1lbnQgPW5ldyBDTURvY3VtZW50SW1wbCh1cmkpOwotICAgIGNtZG9jdW1lbnQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgcmV0dXJuIGNtZG9jdW1lbnQ7Ci0gIH0gICAgCi0gCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBjcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihDTURvY3VtZW50IGNtRG9jdW1lbnQsIEVsZW1lbnQgZWxlbWVudCwgYm9vbGVhbiBpc0xvY2FsKQotICB7Ci0gICAgU3RyaW5nIGxvY2FsTmFtZSA9IGVsZW1lbnQuZ2V0TG9jYWxOYW1lKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTURvY3VtZW50SW1wbCBjbURvY3VtZW50SW1wbCA9IChDTURvY3VtZW50SW1wbCljbURvY3VtZW50OwotCi0gICAgQ01OYW1lZE5vZGVNYXBJbXBsIGVsZW1lbnRNYXAgPSBpc0xvY2FsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5hbWVkTm9kZU1hcEltcGwpY21Eb2N1bWVudEltcGwuZ2V0TG9jYWxFbGVtZW50UG9vbCgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5hbWVkTm9kZU1hcEltcGwpY21Eb2N1bWVudEltcGwuZ2V0RWxlbWVudHMoKTsKLQotICAgIENNRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbkltcGwpZWxlbWVudE1hcC5nZXROYW1lZEl0ZW0obG9jYWxOYW1lKTsKLSAgICBpZiAoZWQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY3JlYXRlIGVkICIgKyBsb2NhbE5hbWUpOwotICAgICAgZWQgPSBuZXcgQ01FbGVtZW50RGVjbGFyYXRpb25JbXBsKGNtRG9jdW1lbnQsIGxvY2FsTmFtZSk7Ci0gICAgICBlZC5zZXRJbmZlcnJlZCh0cnVlKTsKLSAgICAgIGVkLnNldExvY2FsKGlzTG9jYWwpOwotICAgICAgZWQuc2V0TWF4T2NjdXIoMSk7Ci0gICAgICBDTUdyb3VwSW1wbCBncm91cCA9IG5ldyBDTUdyb3VwSW1wbChuZXcgQ01Ob2RlTGlzdEltcGwoKSwgQ01Hcm91cC5DSE9JQ0UpOwotICAgICAgZ3JvdXAuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICBncm91cC5zZXRNaW5PY2N1cigwKTsKLSAgICAgIGdyb3VwLnNldE1heE9jY3VyKC0xKTsKLSAgICAgIGVkLnNldENvbnRlbnQoZ3JvdXApOyAgICAgICAgICAgIAotICAgICAgZWxlbWVudE1hcC5wdXQoZWQpOwotICAgIH0gCi0KLSAgICAvLyBsb29rdXAgb3IgY3JlYXRlIHRoZSBhdHRyaWJ1dGVzCi0gICAgLy8KLSAgICBOYW1lZE5vZGVNYXAgYXR0cmlidXRlTWFwID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IGF0dHJpYnV0ZU1hcExlbmd0aCA9IGF0dHJpYnV0ZU1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZU1hcExlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWF0dHJpYnV0ZU1hcC5pdGVtKGkpOwotICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwgYWQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwpZWQuZ2V0QXR0cmlidXRlTWFwKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICBpZiAoYWQgPT0gbnVsbCkKLSAgICAgIHsgICAgIAotICAgICAgICAvLyB0b2RvLi4uIHVzZSBhbiBhdHRyaWJ1dGUgcG9vbCB0byBiZSBtb3JlIGVmZmljaWVudD8KLSAgICAgICAgYWQgPSBuZXcgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbkltcGwoYXR0ci5nZXROb2RlTmFtZSgpLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLSAgICAgICAgYWQuc2V0SW5mZXJyZWQodHJ1ZSk7Ci0gICAgICAgIGVkLmdldEF0dHJpYnV0ZU1hcCgpLnB1dChhZCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlZDsKLSAgfSAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZUNNQ29udGVudChDTURvY3VtZW50IHBhcmVudENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBDTURvY3VtZW50IGNoaWxkQ01Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gY2hpbGRFZCwgYm9vbGVhbiBpc0xvY2FsLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgLy8gYWRkIGVsZW1lbnQgdG8gdGhlIHBhcmVudCdzIGNvbnRlbnQKLSAgICAvLyBjb25zaWRlciBhbGwgY29udGVudCB0byBiZSBvZiB0aGUgZm9ybSAoQSB8IEIgfCBDKSogICAgCi0gICAgLy8KLSAgICBDTUdyb3VwSW1wbCBncm91cCA9IChDTUdyb3VwSW1wbClwYXJlbnRFZC5nZXRDb250ZW50KCk7Ci0gICAgQ01Ob2RlTGlzdEltcGwgZ3JvdXBDaGlsZE5vZGVMaXN0ID0gKENNTm9kZUxpc3RJbXBsKWdyb3VwLmdldENoaWxkTm9kZXMoKTsKLQotICAgIGlmIChwYXJlbnRDTURvY3VtZW50ID09IGNoaWxkQ01Eb2N1bWVudCkKLSAgICB7Ci0gICAgICBpZiAoIWdyb3VwQ2hpbGROb2RlTGlzdC5jb250YWlucyhjaGlsZEVkKSkKLSAgICAgIHsKLSAgICAgICAgZ3JvdXBDaGlsZE5vZGVMaXN0LmFkZChjaGlsZEVkKTsKLSAgICAgIH0KLSAgICAgIGlmIChpc0xvY2FsKQotICAgICAgewotICAgICAgICBDTU5hbWVkTm9kZU1hcEltcGwgbG9jYWxFbGVtZW50TWFwID0gKENNTmFtZWROb2RlTWFwSW1wbClwYXJlbnRFZC5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0gICAgICAgIGxvY2FsRWxlbWVudE1hcC5wdXQoY2hpbGRFZCk7Ci0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgZWxzZQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTUFueUVsZW1lbnQgY21BbnlFbGVtZW50ID0gbG9va3VwT3JDcmVhdGVDTUFueUVsZW1lbnQoKENNRG9jdW1lbnRJbXBsKXBhcmVudENNRG9jdW1lbnQsIHVyaSk7Ci0gICAgICBpZiAoIWdyb3VwQ2hpbGROb2RlTGlzdC5jb250YWlucyhjbUFueUVsZW1lbnQpKQotICAgICAgewotICAgICAgICBncm91cENoaWxkTm9kZUxpc3QuYWRkKGNtQW55RWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfSAgICAgIAotICB9ICAgCi0KLSAgcHJvdGVjdGVkIENNQW55RWxlbWVudCBsb29rdXBPckNyZWF0ZUNNQW55RWxlbWVudChDTURvY3VtZW50SW1wbCBwYXJlbnRDTURvY3VtZW50LCBTdHJpbmcgdXJpKQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXBJbXBsIGFueUVsZW1lbnRNYXAgPSBwYXJlbnRDTURvY3VtZW50LmdldEFueUVsZW1lbnRzKCk7Ci0gICAgQ01BbnlFbGVtZW50SW1wbCBhbnlFbGVtZW50ID0gKENNQW55RWxlbWVudEltcGwpYW55RWxlbWVudE1hcC5nZXROYW1lZEl0ZW0oQ01BbnlFbGVtZW50SW1wbC5jb21wdXRlTm9kZU5hbWUodXJpKSk7Ci0gICAgaWYgKGFueUVsZW1lbnQgPT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0ZSBhbnlFbGVtZW50ICIgKyB1cmkpOwotICAgICAgYW55RWxlbWVudCA9IG5ldyBDTUFueUVsZW1lbnRJbXBsKHVyaSk7Ci0gICAgICBhbnlFbGVtZW50LnNldEluZmVycmVkKHRydWUpOwotICAgICAgYW55RWxlbWVudE1hcC5wdXQoYW55RWxlbWVudCk7Ci0gICAgfQotICAgIHJldHVybiBhbnlFbGVtZW50OwotICB9IAotICAgICAgCi0KLSAgcHVibGljIHZvaWQgZGVidWdQcmludChDb2xsZWN0aW9uIGNvbGxlY3Rpb24pCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpdGVyID0gY29sbGVjdGlvbi5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWl0ZXIubmV4dCgpOyAKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjbURvY3VtZW50ICgiICsgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpICsiKSIpOyAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIENNTmFtZWROb2RlTWFwSW1wbCBlbGVtZW50TWFwID0gKENNTmFtZWROb2RlTWFwSW1wbCljbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWxlbWVudE1hcC5pdGVtKGkpOwotICAgICAgICBDTURlc2NyaXB0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiICBFTEVNRU5UICIgKyBlZC5nZXROb2RlTmFtZSgpICsgIiA9ICIgKyBidWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oZWQpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB9Ci0gICAgfQotICB9ICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTZiZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbjsKLQotLyoqCi0gKiBEZXNjcmliZXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSA8Y29kZT5tb2RlbFF1ZXJ5RXh0ZW5zaW9uPC9jb2RlPiBleHRlbnNpb24KLSAqIHBvaW50LgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcgotewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9UWVBFX0FUVFJJQlVURSA9ICJjb250ZW50VHlwZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUVTUEFDRV9BVFRSSUJVVEUgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xBU1NfQVRUUklCVVRFID0gImNsYXNzIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBjb25maWd1cmF0aW9uOwotICBwcml2YXRlIFN0cmluZyBjb250ZW50VHlwZUlkOwotICBwcml2YXRlIFN0cmluZyBuYW1lc3BhY2U7Ci0gIHByaXZhdGUgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb247Ci0KLSAgcHVibGljIE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgY29uZmlndXJhdGlvbiA9IGVsZW1lbnQ7Ci0gIH0KLQotICBwdWJsaWMgTW9kZWxRdWVyeUV4dGVuc2lvbiBjcmVhdGVNb2RlbFF1ZXJ5RXh0ZW5zaW9uKCkgdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgewotICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIGV4dGVuc2lvbiA9IChNb2RlbFF1ZXJ5RXh0ZW5zaW9uKSBjb25maWd1cmF0aW9uLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oQ0xBU1NfQVRUUklCVVRFKTsKLSAgICB9ICAKLSAgICByZXR1cm4gZXh0ZW5zaW9uOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZUlkKCkKLSAgewotICAgIGlmIChjb250ZW50VHlwZUlkID09IG51bGwpCi0gICAgewotICAgICAgY29udGVudFR5cGVJZCA9IGNvbmZpZ3VyYXRpb24uZ2V0QXR0cmlidXRlKENPTlRFTlRfVFlQRV9BVFRSSUJVVEUpOwotICAgIH0KLSAgICByZXR1cm4gY29udGVudFR5cGVJZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBuYW1lc3BhY2UgPSBjb25maWd1cmF0aW9uLmdldEF0dHJpYnV0ZShOQU1FU1BBQ0VfQVRUUklCVVRFKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWVzcGFjZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTljYjFjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0gICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuZXh0ZW5zaW9uLk1vZGVsUXVlcnlFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotcHVibGljIGNsYXNzIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbCBpbXBsZW1lbnRzIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyCi17ICAgICAgICAgICAKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeSBtb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkgPSBuZXcgTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgcHVibGljIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsgICAgICAKLSAgICBTdHJpbmcgY29udGVudFR5cGVJZCA9IGdldENvbnRlbnRUeXBlSWQoZWxlbWVudCk7Ci0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IGdldE5hbWVzcGFjZShjbU5vZGUpOwotICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmdldEFwcGxpY2FibGVFeHRlbnNpb25zKGNvbnRlbnRUeXBlSWQsIG5hbWVzcGFjZSkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24paS5uZXh0KCk7Ci0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBudWxsOwotICAgICAgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pCi0gICAgICB7ICAKLSAgICAgICAgdmFsdWVzID0gZXh0ZW5zaW9uLmdldEF0dHJpYnV0ZVZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB2YWx1ZXMgPSBleHRlbnNpb24uZ2V0RWxlbWVudFZhbHVlcyhlbGVtZW50LCBuYW1lc3BhY2UsIG5hbWUpOyAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkQWxsKEFycmF5cy5hc0xpc3QodmFsdWVzKSk7Ci0gICAgICB9ICAKLSAgICB9ICAKLSAgICByZXR1cm4gbGlzdDsgIAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIGZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KExpc3QgY21ub2RlcywgRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZUlkID0gZ2V0Q29udGVudFR5cGVJZChlbGVtZW50KTsKLSAgICBTdHJpbmcgcGFyZW50TmFtZXNwYWNlID0gZWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQotCUxpc3QgbW9kZWxRdWVyeUV4dGVuc2lvbnMgPSBtb2RlbFF1ZXJ5RXh0ZW5zaW9uUmVnaXN0cnkuZ2V0QXBwbGljYWJsZUV4dGVuc2lvbnMoY29udGVudFR5cGVJZCwgcGFyZW50TmFtZXNwYWNlKTsKLQkKLSAgICBmb3IgKEl0ZXJhdG9yIGogPSBjbW5vZGVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpai5uZXh0KCk7ICAKLSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBnZXROYW1lc3BhY2UoY21Ob2RlKTsKLSAgICAgIFN0cmluZyBuYW1lID0gY21Ob2RlLmdldE5vZGVOYW1lKCk7Ci0gICAgICAKLSAgICAgIGJvb2xlYW4gaW5jbHVkZSA9IHRydWU7Ci0gICAgICBmb3IoaW50IGsgPSAwOyBrIDwgbW9kZWxRdWVyeUV4dGVuc2lvbnMuc2l6ZSgpICYmIGluY2x1ZGU7IGsrKykgewotICAgICAgewotICAgICAgICAgIE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uID0gKE1vZGVsUXVlcnlFeHRlbnNpb24pbW9kZWxRdWVyeUV4dGVuc2lvbnMuZ2V0KGspOwotICAgICAgICAgIGluY2x1ZGUgPSBleHRlbnNpb24uaXNBcHBsaWNhYmxlQ2hpbGRFbGVtZW50KGVsZW1lbnQsIG5hbWVzcGFjZSwgbmFtZSk7Ci0gICAgICAgICAgaWYgKCFpbmNsdWRlKQotCQkgIHsKLSAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY21Ob2RlIGZyb20gdGhlIGxpc3QKLSAgICAgICAgICAgIGoucmVtb3ZlKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXROYW1lc3BhY2UoQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgICAgICAgICAgCi0gICAgeyAgICAgCi0gICAgICBuYW1lc3BhY2UgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gbmFtZXNwYWNlOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBnZXRDb250ZW50VHlwZUlkKE5vZGUgbm9kZSkKLSAgewotICAgIFN0cmluZyBjb250ZW50VHlwZUlkID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLSAgICB7Ci0gICAgICBJRE9NTm9kZSBkb21Ob2RlID0gKElET01Ob2RlKSBub2RlOwotICAgICAgY29udGVudFR5cGVJZCA9IGRvbU5vZGUuZ2V0TW9kZWwoKS5nZXRDb250ZW50VHlwZUlkZW50aWZpZXIoKTsKLSAgICB9ICAgCi0gICAgcmV0dXJuIGNvbnRlbnRUeXBlSWQ7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjYxZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlFeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uOwotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUV4dGVuc2lvblJlZ2lzdHJ5Ci17Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVOU0lPTl9QT0lOVF9JRCA9ICJtb2RlbFF1ZXJ5RXh0ZW5zaW9ucyI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAibW9kZWxRdWVyeUV4dGVuc2lvbiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBMaXN0IGRlc2NyaXB0b3JzOwotCi0gIHB1YmxpYyBMaXN0IGdldEFwcGxpY2FibGVFeHRlbnNpb25zKFN0cmluZyBjb250ZW50VHlwZUlkLCBTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmIChjb250ZW50VHlwZUlkICE9IG51bGwpCi0gICAgewotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0xvYWRlZCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVzY3JpcHRvcnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gKE1vZGVsUXVlcnlFeHRlbnNpb25EZXNjcmlwdG9yKSBpLm5leHQoKTsKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlSWQuZXF1YWxzKGRlc2NyaXB0b3IuZ2V0Q29udGVudFR5cGVJZCgpKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChkZXNjcmlwdG9yLmdldE5hbWVzcGFjZSgpID09IG51bGwgfHwgIGRlc2NyaXB0b3IuZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbiBleHRlbnNpb24gPSBkZXNjcmlwdG9yLmNyZWF0ZU1vZGVsUXVlcnlFeHRlbnNpb24oKTsKLSAgICAgICAgICAgICAgbGlzdC5hZGQoZXh0ZW5zaW9uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIAlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ibGVtIGNyZWF0aW5nIG1vZGVsIHF1ZXJ5IGV4dGVuc2lvbiIsIGUpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLSAgCi0gIC8qCi0gICAqICBUT0RPIDogY29uc2lkZXIgcHJvdmlkaW5nIGEgbm9uLXBsdWdpbiBtZWFucyBhZGQvcmVtb3ZlIGV4dGVuc2lvbnMKLSAgICogICAKLSAgcHVibGljIHZvaWQgYWRkRXh0ZW5zaW9uKE1vZGVsUXVlcnlFeHRlbnNpb24gZXh0ZW5zaW9uKQotICB7ICAgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUV4dGVuc2lvbihNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVwcmVjYXRlZCBleHRlbnNpb24pCi0gIHsKLSAgfSovCi0KLSAgLyoqCi0gICAqIFJlYWRzIGFsbCBleHRlbnNpb25zLgotICAgKiA8cD4KLSAgICogVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZSBpbiBvcmRlciB0byByZWxvYWQgZnJvbSBhIGNoYW5nZWQKLSAgICogZXh0ZW5zaW9uIHJlZ2lzdHJ5LgotICAgKiA8L3A+Ci0gICAqLwotICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJlbG9hZEV4dGVuc2lvbnMoKQotICB7Ci0gICAgZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgU3RyaW5nIGJ1bmRsZWlkID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQgICAgICAKLSAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKGJ1bmRsZWlkLCBFWFRFTlNJT05fUE9JTlRfSUQpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTW9kZWxRdWVyeUV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uRGVzY3JpcHRvcihlbGVtZW50c1tpXSk7Ci0gICAgICBkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhlIGV4dGVuc2lvbnMgaGF2ZSBiZWVuIGxvYWRlZCBhdCBsZWFzdCBvbmNlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZUV4dGVuc2lvbnNMb2FkZWQoKQotICB7Ci0gICAgaWYgKGRlc2NyaXB0b3JzID09IG51bGwpCi0gICAgewotICAgICAgcmVsb2FkRXh0ZW5zaW9ucygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01EYXRhVHlwZVZhbHVlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTURhdGFUeXBlVmFsdWVIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5YzEyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTURhdGFUeXBlVmFsdWVIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci0KLQotcHVibGljIGNsYXNzIENNRGF0YVR5cGVWYWx1ZUhlbHBlcgotewotICBwcm90ZWN0ZWQgaW50IGlkQ291bnQgPSAwOwotCi0KLSAgcHVibGljIFN0cmluZyBnZXRWYWx1ZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgewotICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7Ci0gICAgICAgCi0gICAgaWYgKGlzWFNJVHlwZShhZCkpICAgICAgICAgCi0gICAgeyAgICAgICAKLSAgICAgIExpc3QgbGlzdCA9IGdldFF1YWxpZmllZFhTSVR5cGVzKGFkLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICB2YWx1ZSA9IGxpc3Quc2l6ZSgpID4gMCA/IChTdHJpbmcpbGlzdC5nZXQoMCkgOiBudWxsOwotICAgIH0gCi0KLSAgICAvLyBzaGFtZWxlc3MgaGFjawotICAgIC8vCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgaWYgKGFkLmdldEF0dHJOYW1lKCkuZXF1YWxzKCJ4bWw6bGFuZyIpKSAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICB2YWx1ZSA9ICJFTiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gYWQuZ2V0QXR0clR5cGUoKTsKLSAgICAgIGlmIChkYXRhVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2YWx1ZSA9IGdldFZhbHVlKGRhdGFUeXBlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgICBTdHJpbmcgdmFsdWUgPSBudWxsOwotICAgIHZhbHVlID0gZGF0YVR5cGUuZ2V0SW1wbGllZFZhbHVlKCk7Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBkYXRhVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0gICAgICBpZiAodmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDApCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gdmFsdWVzWzBdOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHZhbHVlID0gZGF0YVR5cGUuZ2VuZXJhdGVJbnN0YW5jZVZhbHVlKCk7Ci0gICAgfSAgICAgICAgICAgICAgIAotCi0gICAgLy8gSGVyZSBpcyBhIHNwZWNpYWwgY2FzZSB3aGVyZSB3ZSBoYW5kbGUgRFREJ3MgSUQgcmVsYXRlZCBkYXRhdHlwZXMuCi0gICAgLy8gVGhlc2UgdmFsdWVzIG11c3QgYmUgZ2VuZXJhdGVkL3ZhbGlkYXRlIGJ5IGNvbnNpZGVyaW5nIHRoZSBlbnRpcmUgeG1sIGZpbGUKLSAgICAvLyBzbyB3ZSBjYW4ndCByZWx5IG9uIHRoZSAnZ2VuZXJhdGVJbnN0YW5jZVZhbHVlJyBtZXRob2QuCi0gICAgLy8KLSAgICAvLyB0b2RvLi4uIGZpbmQgYSBuaWNlciB3YXkgdG8gaGFuZGxlIHRoaXMgICAgCi0gICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIGRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlLmdldERhdGFUeXBlTmFtZSgpOwotICAgICAgaWYgKGRhdGFUeXBlTmFtZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoZGF0YVR5cGVOYW1lLmVxdWFscygiSUQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmFsdWUgPSAiaWR2YWx1ZSIgKyBpZENvdW50Kys7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChkYXRhVHlwZU5hbWUuZXF1YWxzKCJJRFJFRiIpIHx8IGRhdGFUeXBlTmFtZS5lcXVhbHMoIklEUkVGUyIpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgewotICAgICAgICAgIHZhbHVlID0gImlkdmFsdWUwIjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgCi0gICAgcmV0dXJuIHZhbHVlOwotICB9IAotICAgICAgCi0KLSAgcHVibGljIGJvb2xlYW4gaXNWYWxpZEVtcHR5VmFsdWUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgeyAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IGFkLmdldEF0dHJUeXBlKCk7Ci0gICAgaWYgKGRhdGFUeXBlICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gKFN0cmluZylkYXRhVHlwZS5nZXRQcm9wZXJ0eSgiaXNWYWxpZEVtcHR5VmFsdWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHByb3BlcnR5VmFsdWUgIT0gbnVsbCAmJiBwcm9wZXJ0eVZhbHVlLmVxdWFscygiZmFsc2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gaXNYU0lUeXBlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gIHsgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmIChhZC5nZXROb2RlTmFtZSgpLmVxdWFscygidHlwZSIpKSAgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWFkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VOYW1lID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKG5hbWVzcGFjZU5hbWUgIT0gbnVsbCAmJiBuYW1lc3BhY2VOYW1lLmVxdWFscygiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAKLQotICBwdWJsaWMgTGlzdCBnZXRRdWFsaWZpZWRYU0lUeXBlcyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkLCBOYW1lc3BhY2VUYWJsZSB0YWJsZSkKLSAgeyAgICAgICAgICAKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTGlzdCB4c2lUeXBlcyA9IChMaXN0KWFkLmdldFByb3BlcnR5KCJYU0lUeXBlcyIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKHhzaVR5cGVzICE9IG51bGwgJiYgeHNpVHlwZXMuc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2lUeXBlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgeyAKLSAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZE5hbWUgPSAoU3RyaW5nKWkubmV4dCgpOwotICAgICAgICBTdHJpbmdbXSBjb21wb25lbnRzID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVSSVF1YWxpZmllZE5hbWVDb21wb25lbnRzKHVyaVF1YWxpZmllZE5hbWUpOyAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSB0YWJsZS5nZXRQcmVmaXhGb3JVUkkoY29tcG9uZW50c1swXSAhPSBudWxsID8gY29tcG9uZW50c1swXSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICI6IiArIGNvbXBvbmVudHNbMV0gOiAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50c1sxXTsKLSAgICAgICAgbGlzdC5hZGQodHlwZU5hbWUpOwotICAgICAgfQotICAgIH0gICAgICAgICAgIAotICAgIHJldHVybiBsaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvQ01WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjczZjQ0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9DTVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNVmlzaXRvcjsKLQotCi0KLXB1YmxpYyBjbGFzcyBDTVZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvciBzdHJpbmdDb250ZW50Q29tcGFyaXRvciA9IG5ldyBTdHJpbmdFbGVtZW50Q29udGVudENvbXBhcmF0b3IoKTsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBncmFwaE5vZGVUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAvKioKLSAgICogR3JhcGhOb2RlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEdyYXBoTm9kZQotICB7Ci0gICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgIHB1YmxpYyBib29sZWFuIGlzVGVybWluYWw7Ci0gICAgcHVibGljIFZlY3RvciBhcmNMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIEdyYXBoTm9kZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEFyYyhBcmMgYXJjKQotICAgIHsKLSAgICAgIGFyY0xpc3QuYWRkRWxlbWVudChhcmMpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICAgIHsKLSAgICAgIHJldHVybiAiW0dyYXBoTm9kZSAiICsgbmFtZSArICJdIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogQXJjCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEFyYwotICB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVCAgPSAxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFUEVBVCAgID0gMjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPUFRJT05BTCA9IDM7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFVl9JTiAgPSA0OwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9VVF9ORVhUID0gNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSU5LICAgICA9IDY7Ci0KLSAgICBwdWJsaWMgaW50IGtpbmQ7Ci0gICAgcHVibGljIFN0cmluZyBuYW1lOwotICAgIHB1YmxpYyBHcmFwaE5vZGUgbm9kZTsKLSAgICBwdWJsaWMgQ01Ob2RlIGNtTm9kZTsKLQotICAgIHB1YmxpYyBBcmMoaW50IGtpbmQsIEdyYXBoTm9kZSBub2RlLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIHRoaXMoa2luZCwgIiIsIG5vZGUsIGNtTm9kZSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQXJjKGludCBraW5kLCBTdHJpbmcgbmFtZSwgR3JhcGhOb2RlIG5vZGUsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgIHRoaXMua2luZCA9IGtpbmQ7Ci0gICAgICB0aGlzLm5vZGUgPSBub2RlOwotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICogR3JhcGhHZW5lcmF0b3IKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgR3JhcGhHZW5lcmF0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgewotICAgIHB1YmxpYyBpbnQgaW5kZW50OwotICAgIHB1YmxpYyBpbnQgY291bnQ7Ci0gICAgcHVibGljIEdyYXBoTm9kZSBzdGFydEdyYXBoTm9kZTsKLSAgICBwdWJsaWMgQ29udGV4dCBjb250ZXh0OwotCi0gICAgcHJvdGVjdGVkIHN0YXRpYyBjbGFzcyBDb250ZXh0Ci0gICAgewotICAgICAgR3JhcGhOb2RlIGZyb207Ci0gICAgICBHcmFwaE5vZGUgdG87Ci0KLSAgICAgIENvbnRleHQoR3JhcGhOb2RlIGZyb20sIEdyYXBoTm9kZSB0bykKLSAgICAgIHsKLSAgICAgICAgdGhpcy5mcm9tID0gZnJvbTsKLSAgICAgICAgdGhpcy50byA9IHRvOwotICAgICAgfQotCi0gICAgICBHcmFwaE5vZGUgZ2V0TGFzdEdyYXBoTm9kZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAodG8gIT0gbnVsbCkgPyB0byA6IGZyb207Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBwcm90ZWN0ZWQgR3JhcGhHZW5lcmF0b3IoKQotICAgIHsKLSAgICAgIHN0YXJ0R3JhcGhOb2RlID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KHN0YXJ0R3JhcGhOb2RlLCBudWxsKTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCB2b2lkIGdlbmVyYXRlR3JhcGgoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLQotICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDTU5vZGUoZWQuZ2V0Q29udGVudCgpKTsKLSAgICAgIH0KLSAgICAgIC8vIENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQS4uLiBubyBncmFwaCByZXF1aXJlZAotICAgICAgLy8gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZLi4uIG5vIGdyYXBoIHJlcXVpcmVkCi0gICAgICBjb250ZXh0LmdldExhc3RHcmFwaE5vZGUoKS5pc1Rlcm1pbmFsID0gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0R3JhcGhOb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICJuIiArIGNvdW50Kys7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0KLQotICAgIHByb3RlY3RlZCBHcmFwaE5vZGUgZ2V0U3RhcnRHcmFwaE5vZGUoKQotICAgIHsKLSAgICAgIHJldHVybiBzdGFydEdyYXBoTm9kZTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqICAgICAgICAgICAgICAgIHJlcGVhdAotICAgICAqICAgICAgICAgICAgICstLS0tIy0tLS0tKwotICAgICAqICAgICAgICAgICAgIHwgICAgICAgICAgfAotICAgICAqICAgICAgICAgICAgIHYgICAgICAgICAgfAotICAgICAqICBwcmV2IC0tIy0+IGluIC0tJ3gnLT4gb3V0IC0tIy0+IG5leHQKLSAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCi0gICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotICAgICAqICArLS0tLS0tLS0tLS0tLS0tLSMtLS0tLS0tLS0tLS0tLSsKLSAgICAgKiAgICAgICAgICAgICAgICBvcHRpb25hbAotICAgICAqCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXJjcyhHcmFwaE5vZGUgaW4sIEdyYXBoTm9kZSBvdXQsIENNQ29udGVudCBjbUNvbnRlbnQpCi0gICAgewotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBjbUNvbnRlbnQsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVBcmNzKEdyYXBoTm9kZSBpbiwgR3JhcGhOb2RlIG91dCwgQ01Db250ZW50IGNtQ29udGVudCwgYm9vbGVhbiBpc0FsbEdyb3VwKQotICAgIHsKLSAgICAgIC8vcHJpbnRsbigiK2NyZWF0ZUFyY3MoKSAiICsgZWQuZ2V0RGVzY3JpcHRpb24oKSArICIgIiArIGVkLmdldE1pbk9jY3VyKCkpOwotICAgICAgR3JhcGhOb2RlIHByZXYgPSBjb250ZXh0LmZyb207Ci0gICAgICBHcmFwaE5vZGUgbmV4dCA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLQotICAgICAgcHJldi5hZGRBcmMobmV3IEFyYyhBcmMuUFJFVl9JTiwgaW4sIGNtQ29udGVudCkpOwotICAgICAgb3V0LmFkZEFyYyhuZXcgQXJjKEFyYy5PVVRfTkVYVCwgbmV4dCwgY21Db250ZW50KSk7Ci0KLSAgICAgIGlmIChjb250ZXh0LnRvICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5leHQuYWRkQXJjKG5ldyBBcmMoQXJjLkxJTkssIGNvbnRleHQudG8sIGNtQ29udGVudCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBjb250ZXh0LmZyb20gPSBuZXh0OwotICAgICAgfQotCi0gICAgICBpZiAoY21Db250ZW50LmdldE1pbk9jY3VyKCkgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgLy8gdG9kby4uLiBzaG91bGQgd2Ugc2VlIGlmIGFuIG9wdGlvbmFsIGFyYyBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkPwotICAgICAgICBwcmV2LmFkZEFyYyhuZXcgQXJjKEFyYy5PUFRJT05BTCwgbmV4dCwgY21Db250ZW50KSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjbUNvbnRlbnQuZ2V0TWF4T2NjdXIoKSA9PSAtMSB8fCBjbUNvbnRlbnQuZ2V0TWF4T2NjdXIoKSA+IDEgfHwgaXNBbGxHcm91cCkKLSAgICAgIHsKLSAgICAgICAgb3V0LmFkZEFyYyhuZXcgQXJjKEFyYy5SRVBFQVQsIGluLCBjbUNvbnRlbnQpKTsKLSAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsKLSAgICAgIENvbnRleHQgcHJldkNvbnRleHQgPSBjb250ZXh0OwotICAgICAgR3JhcGhOb2RlIGluID0gbmV3IEdyYXBoTm9kZSgiKCIgKyBnZXRHcmFwaE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICBHcmFwaE5vZGUgb3V0ID0gbmV3IEdyYXBoTm9kZSgiKSIgKyBnZXRHcmFwaE5vZGVOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0KLSAgICAgIGludCBncm91cE9wZXJhdG9yID0gZ3JvdXAuZ2V0T3BlcmF0b3IoKTsKLSAgICAgIGlmIChncm91cE9wZXJhdG9yID09IENNR3JvdXAuU0VRVUVOQ0UpCi0gICAgICB7Ci0gICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dChpbiwgbnVsbCk7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICAgIGNvbnRleHQuZnJvbS5hZGRBcmMobmV3IEFyYyhBcmMuTElOSywgb3V0LCBncm91cCkpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZ3JvdXBPcGVyYXRvciA9PSBDTUdyb3VwLkNIT0lDRSB8fAotICAgICAgICAgICAgICAgZ3JvdXBPcGVyYXRvciA9PSBDTUdyb3VwLkFMTCkKLSAgICAgIHsKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0KGluLCBvdXQpOwotICAgICAgICBzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotICAgICAgfQotCi0gICAgICBjb250ZXh0ID0gcHJldkNvbnRleHQ7Ci0gICAgICBjcmVhdGVBcmNzKGluLCBvdXQsIGdyb3VwLCBncm91cE9wZXJhdG9yID09IENNR3JvdXAuQUxMKTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgewotICAgICAgR3JhcGhOb2RlIGluID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgR3JhcGhOb2RlIG91dCA9IG5ldyBHcmFwaE5vZGUoZ2V0R3JhcGhOb2RlTmFtZSgpKTsKLSAgICAgIGNyZWF0ZUFyY3MoaW4sIG91dCwgZWQpOwotICAgICAgaW4uYWRkQXJjKG5ldyBBcmMoQXJjLkVMRU1FTlQsIGVkLmdldEVsZW1lbnROYW1lKCksIG91dCwgZWQpKTsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNQW55RWxlbWVudChDTUFueUVsZW1lbnQgYW55RWxlbWVudCkKLSAgICB7Ci0gICAgICBHcmFwaE5vZGUgaW4gPSBuZXcgR3JhcGhOb2RlKGdldEdyYXBoTm9kZU5hbWUoKSk7Ci0gICAgICBHcmFwaE5vZGUgb3V0ID0gbmV3IEdyYXBoTm9kZShnZXRHcmFwaE5vZGVOYW1lKCkpOwotICAgICAgY3JlYXRlQXJjcyhpbiwgb3V0LCBhbnlFbGVtZW50KTsKLSAgICAgIGluLmFkZEFyYyhuZXcgQXJjKEFyYy5FTEVNRU5ULCAiYW55Iiwgb3V0LCBhbnlFbGVtZW50KSk7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gIH0KLQotICAvLyB0b2RvLi4gaW1wbGVtZW50IGNhY2hlIHN0cmF0ZWd5IGhvb2ssIGhhbmRsZSBuYW1lIHNwYWNlcywgbG9jYWxzIGV0Yy4KLSAgLy8KLSAgcHVibGljIEdyYXBoTm9kZSBsb29rdXBPckNyZWF0ZUdyYXBoKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBPYmplY3Qga2V5ID0gZWxlbWVudDsKLSAgICBHcmFwaE5vZGUgbm9kZSA9IChHcmFwaE5vZGUpZ3JhcGhOb2RlVGFibGUuZ2V0KGtleSk7Ci0gICAgaWYgKG5vZGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBub2RlID0gY3JlYXRlR3JhcGgoZWxlbWVudCk7Ci0gICAgICBncmFwaE5vZGVUYWJsZS5wdXQoa2V5LCBub2RlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5vZGU7Ci0gIH0KLQotICBwdWJsaWMgR3JhcGhOb2RlIGNyZWF0ZUdyYXBoKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQpCi0gIHsKLSAgICBHcmFwaEdlbmVyYXRvciBnZW5lcmF0b3IgPSBuZXcgR3JhcGhHZW5lcmF0b3IoKTsKLSAgICBnZW5lcmF0b3IuZ2VuZXJhdGVHcmFwaChlbGVtZW50KTsKLSAgICByZXR1cm4gZ2VuZXJhdG9yLmdldFN0YXJ0R3JhcGhOb2RlKCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHByaW50R3JhcGgoR3JhcGhOb2RlIG5vZGUsIFZlY3RvciBuYW1lZEFyY0xpc3QsIFZlY3RvciB1bmFtZWRBcmNMaXN0LCBpbnQgaW5kZW50KQotICB7Ci0gICAgLy9TdHJpbmcgZGVjb3JhdGlvbiA9IG5vZGUuaXNUZXJtaW5hbCA/ICIgKiIgOiAiIjsKLSAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJHcmFwaE5vZGU6IiArIG5vZGUubmFtZSArIGRlY29yYXRpb24pOwotCi0gICAgaW5kZW50ICs9IDI7Ci0gICAgZm9yIChFbnVtZXJhdGlvbiBlID0gbm9kZS5hcmNMaXN0LmVsZW1lbnRzKCkgOyBlLmhhc01vcmVFbGVtZW50cygpIDspCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpZS5uZXh0RWxlbWVudCgpOwotICAgICAgLy9ib29sZWFuIHZpc2l0ID0gZmFsc2U7Ci0gICAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJBcmM6IiArIGFyYy5uYW1lICsgIiAoIiArIGFyYy5raW5kICsgIikiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgLy90YWJsZS5hZGQoY3VycmVudEdyYW1tYXJPYmplY3QsIGFyYy5ncmFtbWFyT2JqZWN0KTsKLSAgICAgICAgaWYgKCFuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIG5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICB1bmFtZWRBcmNMaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICAgIHByaW50R3JhcGgoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCF1bmFtZWRBcmNMaXN0LmNvbnRhaW5zKGFyYykpCi0gICAgICAgIHsKLSAgICAgICAgICB1bmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIHByaW50R3JhcGgoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludEdyYXBoKEdyYXBoTm9kZSBub2RlKQotICB7Ci0gICAgcHJpbnRHcmFwaChub2RlLCBuZXcgVmVjdG9yKCksIG5ldyBWZWN0b3IoKSwgMCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlRWxlbWVudExpc3QoRWxlbWVudExpc3QgbGlzdCwgR3JhcGhOb2RlIG5vZGUsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0LCBib29sZWFuIGxvb3BGbGFnKQotICB7Ci0gICAgLy9wcmludGxuKCIrdmFsaWRhdGVFbGVtZW50TGlzdCAiICsgbm9kZSArICIgIiArIGxpc3QpOwotICAgIGlmIChsaXN0ID09IG51bGwgJiYgbm9kZS5pc1Rlcm1pbmFsKQotICAgIHsKLSAgICAgIHJlc3VsdC5pc1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgICBib29sZWFuIHRyYXZlcnNlQXJjID0gZmFsc2U7Ci0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChsaXN0ICE9IG51bGwgJiYgY29tcGFyYXRvci5tYXRjaGVzKGxpc3QuaGVhZCwgYXJjLmNtTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbG9vcEZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgIHRyYXZlcnNlQXJjID0gdHJ1ZTsKLSAgICAgICAgICAgIGxpc3QgPSBsaXN0LnRhaWw7IC8vIGluY3JlbWVudCBvdXIgcG9zaXRpb24gaW4gdGhlIGxpc3QKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgICAgewotICAgICAgICAgIGlmICghbG9vcEZsYWcpCi0gICAgICAgICAgewotICAgICAgICAgICAgdHJhdmVyc2VBcmMgPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBsb29wRmxhZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdHJhdmVyc2VBcmMgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHRyYXZlcnNlQXJjKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gdGVzdCB0byBzZWUgaWYgd2UgY2FuIHB1c2ggdGhpcyBhcmMgZHVlIHRvIGZhY2V0IGNvbnN0cmFpbnRzCi0gICAgICAgICAgLy8KLSAgICAgICAgICBpZiAocmVzdWx0LmNhblB1c2goYXJjKSkKLSAgICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgICAgLy8gc2VlIGlmIHRoaXMgYXJjIGxlYWRzIHRvIGEgY29ycmVjdCBzb2x1dGlvbiAgICAgICAgICAKLSAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFyYyk7Ci0gICAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnRMaXN0KGxpc3QsIGFyYy5ub2RlLCBjb21wYXJhdG9yLCByZXN1bHQsIGxvb3BGbGFnKTsKLSAgICAgICAgICAgIGlmIChyZXN1bHQuaXNWYWxpZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQucG9wKGFyYyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgRWxlbWVudExpc3QgY3JlYXRlRWxlbWVudExpc3QoaW50IGNvbnRlbnRUeXBlLCBMaXN0IHYsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgRWxlbWVudExpc3QgZmlyc3QgPSBudWxsOwotICAgIEVsZW1lbnRMaXN0IHByZXYgPSBudWxsOwotCi0gICAgaW50IHNpemUgPSB2LnNpemUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IHYuZ2V0KGkpOwotICAgICAgaWYgKG8gIT0gbnVsbCAmJiAhY29tcGFyYXRvci5pc0lnbm9yYWJsZShvKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgICB7Ci0gICAgICAgICAgRWxlbWVudExpc3QgbGlzdCA9IG5ldyBFbGVtZW50TGlzdCgpOwotICAgICAgICAgIGxpc3QuaGVhZCA9IG87Ci0KLSAgICAgICAgICBpZiAocHJldiAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHByZXYudGFpbCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaXJzdCA9IGxpc3Q7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByZXYgPSBsaXN0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQuaXNWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIHJlc3VsdC5lcnJvckluZGV4ID0gaTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JNZXNzYWdlID0gIkVsZW1lbnQgY2FuIG5vdCBpbmNsdWRlIFBDREFUQSBjb250ZW50IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmaXJzdDsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgdmFsaWRhdGUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgZWxlbWVudENvbnRlbnQsIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvciBjb21wYXJhdG9yLCBSZXN1bHQgcmVzdWx0KQotICB7Ci0gICAgaW50IGNvbnRlbnRUeXBlID0gZWQuZ2V0Q29udGVudFR5cGUoKTsKLQotICAgIGlmIChjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5NSVhFRCB8fAotICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UKQotICAgIHsKLSAgICAgIEVsZW1lbnRMaXN0IGVsZW1lbnRMaXN0ID0gY3JlYXRlRWxlbWVudExpc3QoY29udGVudFR5cGUsIGVsZW1lbnRDb250ZW50LCBjb21wYXJhdG9yLCByZXN1bHQpOwotICAgICAgaWYgKHJlc3VsdC5pc1ZhbGlkID09IHRydWUpCi0gICAgICB7ICAKLSAgICAgICAgLy8gZGVmZWN0IDIyNjIxMyAuLi4gZWxlbWVudHMgd2l0aCBhIGxhcmdlIG51bWJlciBvZiBjaGlsZHJlbiB3aWxsIGNhdXNlIHRoZSByZWN1cnNpb24gYmFzZWQgdmFsaWRhdGlvbgotICAgICAgICAvLyBhbGdvcml0aG0gdG8gc3RhY2sgb3ZlcmZsb3cgLi4uIGFzIGEgcXVpY2sgZml4IGFzc3VtZSBhbnkgZWxlbWVudCB3aXRoIGEgbGFyZ2UgbnVtYmVyIG9mIGNoaWxkcmVuIGlzIHZhbGlkICAgICAgICAKLSAgICAgICAgaWYgKGVsZW1lbnRDb250ZW50LnNpemUoKSA8IDUwMCkKLSAgICAgICAgewotICAgICAgICAgIGJvb2xlYW4gaXNHcmFwaFZhbGlkYXRpb25OZWVkZWQgPSAhKGVsZW1lbnRMaXN0ID09IG51bGwgJiYgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQpOwotICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIGV4bGljaXR5IGhhbmRsZSAnQWxsJyBncm91cHMKLSAgICAgICAgICAvLwotICAgICAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgICAgIGlmIChjb250ZW50LmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cCljb250ZW50OwotICAgICAgICAgICAgaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5BTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGlzR3JhcGhWYWxpZGF0aW9uTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgIHZhbGlkYXRBbGxHcm91cENvbnRlbnQoZWxlbWVudENvbnRlbnQsIGNvbXBhcmF0b3IsIGdyb3VwLCByZXN1bHQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgIH0gIAotICAgICAgICAgIAotICAgICAgICAgIGlmIChpc0dyYXBoVmFsaWRhdGlvbk5lZWRlZCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyB2YWxpZGF0ZSB0aGUgZWxlbWVudExpc3QgdXNpbmcgYSBncmFwaAotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBHcmFwaE5vZGUgbm9kZSA9IGxvb2t1cE9yQ3JlYXRlR3JhcGgoZWQpOwotICAgICAgICAgICAgdmFsaWRhdGVFbGVtZW50TGlzdChlbGVtZW50TGlzdCwgbm9kZSwgY29tcGFyYXRvciwgcmVzdWx0LCBmYWxzZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRDb250ZW50LnNpemUoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGVsZW1lbnRDb250ZW50LmdldChpKTsKLSAgICAgICAgaWYgKGNvbXBhcmF0b3IuaXNFbGVtZW50KG8pKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICByZXN1bHQuZXJyb3JJbmRleCA9IGk7Ci0gICAgICAgICAgcmVzdWx0LmVycm9yTWVzc2FnZSA9ICJFbGVtZW50IG1heSBvbmx5IGluY2x1ZGUgUENEQVRBIGNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0gICAgewotICAgICAgaW50IHNpemUgPSBlbGVtZW50Q29udGVudC5zaXplKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBlbGVtZW50Q29udGVudC5nZXQoaSk7Ci0gICAgICAgIGlmICghY29tcGFyYXRvci5pc0lnbm9yYWJsZShvKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdC5pc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgcmVzdWx0LmVycm9ySW5kZXggPSBpOwotICAgICAgICAgIHJlc3VsdC5lcnJvck1lc3NhZ2UgPSAiRWxlbWVudCBtYXkgbm90IGNvbnRhaW4gUENEQVRBIG9yIEVsZW1lbnQgY29udGVudCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAvL2Vsc2UgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWSkKLSAgICAvLyB7Ci0gICAgLy8gICBhc3N1bWUgZWxlbWVudENvbnRlbnQgd2lsbCBhbHdheXMgYmUgdmFsaWQgZm9yIHRoaXMgY29udGVudCB0eXBlCi0gICAgLy8gfQotICB9Ci0gICAgCi0gIHN0YXRpYyBjbGFzcyBJdGVtQ291bnQKLSAgewotICAgIGludCBjb3VudCA9IDA7ICAgIAotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgdmFsaWRhdEFsbEdyb3VwQ29udGVudChMaXN0IGVsZW1lbnRDb250ZW50LCBFbGVtZW50Q29udGVudENvbXBhcmF0b3IgY29tcGFyYXRvciwgQ01Hcm91cCBhbGxHcm91cCwgUmVzdWx0IHJlc3VsdCkgCi0gIHsKLSAgICBib29sZWFuIGlzVmFsaWQgPSB0cnVlOwotICAgIGJvb2xlYW4gaXNQYXJ0aWFsbHlWYWxpZCA9IHRydWU7Ci0gICAgSGFzaE1hcCBtYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgIENNTm9kZUxpc3QgbGlzdCA9IGFsbEdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBqID0gbGlzdC5nZXRMZW5ndGgoKSAtIDE7IGogPj0gMDsgai0tKQotICAgIHsKLSAgICAgIENNTm9kZSBub2RlID0gbGlzdC5pdGVtKGopOyAgICAgIAotICAgICAgaWYgKG1hcC5nZXQobm9kZSkgPT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBtYXAucHV0KG5vZGUsIG5ldyBJdGVtQ291bnQoKSk7Ci0gICAgICB9ICAKLSAgICB9ICAgIAotICAgIGludCB2YWxpZGl0aW9uQ291bnQgPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGVsZW1lbnRDb250ZW50Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyB2YWxpZGl0aW9uQ291bnQrKykKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGkubmV4dCgpOyAgICAgICAgCi0gICAgICBpZiAoY29tcGFyYXRvci5pc0VsZW1lbnQobykpCi0gICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgLy8gdGVzdCB0byBzZWUgaWYgdGhlIGVsZW1lbnQgaXMgbGlzdGVkIGluIHRoZSBhbGwgZ3JvdXAKLSAgICAgICAgLy8KLSAgICAgICAgQ01Ob2RlIG1hdGNoaW5nQ01Ob2RlID0gbnVsbDsKLSAgICAgICAgZm9yIChpbnQgaiA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZSBub2RlID0gbGlzdC5pdGVtKGopOwotICAgICAgICAgIGlmIChjb21wYXJhdG9yLm1hdGNoZXMobywgbm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF0Y2hpbmdDTU5vZGUgPSBub2RlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSAgICAgICAgICAgICAKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAobWF0Y2hpbmdDTU5vZGUgPT0gbnVsbCkKLSAgICAgICAgeyAgICAgCi0gICAgICAgICAgaXNQYXJ0aWFsbHlWYWxpZCA9IGZhbHNlOwotICAgICAgICAgIGlzVmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgIAotICAgICAgICAgIC8vIHRlc3QgdG8gc2VlIHRoYXQgdGhlIGVsZW1lbnQgb2NjdXJzIG9ubHkgb25jZQotICAgICAgICAgIC8vCi0gICAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpbWFwLmdldChtYXRjaGluZ0NNTm9kZSk7Ci0gICAgICAgICAgaWYgKGl0ZW1Db3VudCAhPSBudWxsKQotICAgICAgICAgIHsgIAotICAgICAgICAgICAgaWYgKGl0ZW1Db3VudC5jb3VudCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIHdlIGRvbid0IHdhbnQgdG8gYWxsb3cgdG9vIG1hbnkgZWxlbWVudHMhCi0gICAgICAgICAgICAgIC8vIHdlIGNvbnNpZGVyICdub3QgZW5vdWdoJyB0byBiZSBwYXJ0aWFsbHkgdmFsaWQuLi4gYnV0IG5vdCAndG9vIG1hbnknCi0gICAgICAgICAgICAgIGlzUGFydGlhbGx5VmFsaWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgaXRlbUNvdW50LmNvdW50Kys7Ci0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0gIAotICAgICAgfSAgCi0gICAgfQotICAgIGlmIChpc1ZhbGlkKQotICAgIHsgIAotICAgICAgZm9yIChpbnQgaiA9IGxpc3QuZ2V0TGVuZ3RoKCkgLSAxOyBqID49IDA7IGotLSkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIG5vZGUgPSBsaXN0Lml0ZW0oaik7ICAgICAgCi0gICAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICAgIHsgIAotICAgICAgICAgIENNQ29udGVudCBjb250ZW50ID0gKENNQ29udGVudClub2RlOwotICAgICAgICAgIEl0ZW1Db3VudCBpdGVtQ291bnQgPSAoSXRlbUNvdW50KW1hcC5nZXQobm9kZSk7Ci0vLyAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJjb250ZW50ICIgKyBjb250ZW50LmdldE5vZGVOYW1lKCkgKyAiICIgKyBjb250ZW50LmdldE1pbk9jY3VyKCkpOwotICAgICAgICAgIGlmIChpdGVtQ291bnQuY291bnQgPCBjb250ZW50LmdldE1pbk9jY3VyKCkpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9ICAKLSAgICAgICAgfSAgCi0gICAgICB9Ci0gICAgfQotICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBFbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCAmJiBpc1BhcnRpYWxseVZhbGlkKQotICAgIHsKLSAgICAgICgoRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQpcmVzdWx0KS5zZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KHZhbGlkaXRpb25Db3VudCk7Ci0gICAgfSAgCi0gICAgcmVzdWx0LmlzVmFsaWQgPSBpc1ZhbGlkOwotICB9ICAKLSAgCi0gIAotICBwdWJsaWMgdm9pZCBnZXRPcmlnaW5BcnJheShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBlbGVtZW50Q29udGVudCwgRWxlbWVudENvbnRlbnRDb21wYXJhdG9yIGNvbXBhcmF0b3IsIEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0IHJlc3VsdCkKLSAgewotICAgIENNTm9kZVtdIGNtTm9kZUFycmF5ID0gbnVsbDsKLSAgICB2YWxpZGF0ZShlZCwgZWxlbWVudENvbnRlbnQsIGNvbXBhcmF0b3IsIHJlc3VsdCk7Ci0gICAgaWYgKHJlc3VsdC5pc1ZhbGlkKQotICAgIHsKLSAgICAgIENNRGF0YVR5cGUgZGF0YVR5cGUgPSBlZC5nZXREYXRhVHlwZSgpOwotICAgICAgaW50IHNpemUgPSBlbGVtZW50Q29udGVudC5zaXplKCk7Ci0gICAgICBjbU5vZGVBcnJheSA9IG5ldyBDTU5vZGVbc2l6ZV07Ci0gICAgICBWZWN0b3Igb3JpZ2luTGlzdCA9IHJlc3VsdC5nZXRFbGVtZW50T3JpZ2luTGlzdCgpOwotICAgICAgaW50IG9yaWdpbkxpc3RTaXplID0gb3JpZ2luTGlzdC5zaXplKCk7IAotICAgICAgaW50IG9yaWdpbkxpc3RJbmRleCA9IDA7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgIHsKLSAgICAgICAgT2JqZWN0IG8gPSBlbGVtZW50Q29udGVudC5nZXQoaSk7Ci0gICAgICAgIGlmIChjb21wYXJhdG9yLmlzRWxlbWVudChvKSkKLSAgICAgICAgeyAgICAgCi0gICAgICAgICAgaWYgKG9yaWdpbkxpc3RJbmRleCA8IG9yaWdpbkxpc3RTaXplKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGNtTm9kZUFycmF5W2ldID0gKENNTm9kZSlvcmlnaW5MaXN0LmdldChvcmlnaW5MaXN0SW5kZXgpOwotICAgICAgICAgICAgb3JpZ2luTGlzdEluZGV4Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGNvbXBhcmF0b3IuaXNQQ0RhdGEobykpCi0gICAgICAgIHsKLSAgICAgICAgICBjbU5vZGVBcnJheVtpXSA9IGRhdGFUeXBlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVsc2UgdGhlIENNTm9kZSBhdCB0aGlzIGluZGV4IGlzIG51bGwKLSAgICAgIH0KLSAgICAgIHJlc3VsdC5zZXRPcmlnaW5BcnJheShjbU5vZGVBcnJheSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgY29sbGVjdE5hbWVkQXJjcyhHcmFwaE5vZGUgbm9kZSwgTGlzdCBuYW1lZEFyY0xpc3QsIGludCBpbmRlbnQpCi0gIHsKLSAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJHcmFwaE5vZGU6IiArIG5vZGUubmFtZSArIGRlY29yYXRpb24pOwotICAgIGluZGVudCArPSAyOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKSA7KQotICAgIHsKLSAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiQXJjOiIgKyBhcmMubmFtZSArICIgKCIgKyBhcmMua2luZCArICIpIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICB7IAotICAgICAgICBpZiAoIW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIGNvbGxlY3ROYW1lZEFyY3MoYXJjLm5vZGUsIG5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kICE9IEFyYy5SRVBFQVQgJiYgYXJjLmtpbmQgIT0gQXJjLk9QVElPTkFMKQotICAgICAgewotICAgICAgICBjb2xsZWN0TmFtZWRBcmNzKGFyYy5ub2RlLCBuYW1lZEFyY0xpc3QsIGluZGVudCArIDIpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgCi0gIHByaXZhdGUgTGlzdCBnZXRNYXRjaGluZ0FyY3MoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyBlbGVtZW50TmFtZSkKLSAgewotICAgIExpc3QgYXJjTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBHcmFwaE5vZGUgZ3JhcGhOb2RlID0gbG9va3VwT3JDcmVhdGVHcmFwaChlZCk7Ci0gICAgaWYgKGVsZW1lbnROYW1lID09IG51bGwpCi0gICAgewotICAgICAgLy8gaGVyZSB3ZSBhZGQgdGhlICdyb290JyBhcmMKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGdyYXBoTm9kZS5hcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpIDspCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLlBSRVZfSU4pCi0gICAgICAgIHsKLSAgICAgICAgICBhcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsgCi0gICAgICBMaXN0IG5hbWVkQXJjcyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIGNvbGxlY3ROYW1lZEFyY3MoZ3JhcGhOb2RlLCBuYW1lZEFyY3MsIDApOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZWRBcmNzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgICBpZiAoYXJjLmNtTm9kZSAhPSBudWxsICYmIGVsZW1lbnROYW1lLmVxdWFscyhhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpKQotICAgICAgICB7ICAKLSAgICAgICAgICBhcmNMaXN0LmFkZChhcmMpOwotICAgICAgICB9ICAKLSAgICAgIH0gIAotICAgIH0gICAgICAKLSAgICByZXR1cm4gYXJjTGlzdDsKLSAgfQotCi0gIAotICBwcml2YXRlIHZvaWQgY29sbGVjdE5leHRTaWJsaW5ncyhHcmFwaE5vZGUgbm9kZSwgTGlzdCBuZXh0U2libGluZ0xpc3QsIExpc3QgbmFtZWRBcmNMaXN0LCBMaXN0IHVuYW1lZEFyY0xpc3QsIGludCBpbmRlbnQpCi0gIHsKLSAgICAvL3ByaW50bG5JbmRlbnRlZChpbmRlbnQsICJHcmFwaE5vZGU6IiArIG5vZGUubmFtZSArIGRlY29yYXRpb24pOwotICAgIGluZGVudCArPSAyOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG5vZGUuYXJjTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEFyYyBhcmMgPSAoQXJjKWkubmV4dCgpOwotICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgeyAgICAgICAKLSAgICAgICAgaWYgKCFuYW1lZEFyY0xpc3QuY29udGFpbnMoYXJjKSkKLSAgICAgICAgewotICAgICAgICAgIGlmIChhcmMuY21Ob2RlICE9IG51bGwpCi0gICAgICAgICAgeyAgCi0gICAgICAgICAgICBuZXh0U2libGluZ0xpc3QuYWRkKGFyYy5jbU5vZGUpOwotICAgICAgICAgICAgaWYgKGFyYy5jbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiB8fAotICAgICAgICAgICAgICAgIGFyYy5jbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQU5ZX0VMRU1FTlQpCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgbmFtZWRBcmNMaXN0LmFkZChhcmMpOwotICAgICAgICAgICAgICBDTUNvbnRlbnQgY21Ob2RlID0gKENNQ29udGVudClhcmMuY21Ob2RlOyAKLSAgICAgICAgICAgICAgaWYgKGNtTm9kZS5nZXRNaW5PY2N1cigpID09IDApCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB1bmFtZWRBcmNMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIGNvbGxlY3ROZXh0U2libGluZ3MoYXJjLm5vZGUsIG5leHRTaWJsaW5nTGlzdCwgbmFtZWRBcmNMaXN0LCB1bmFtZWRBcmNMaXN0LCBpbmRlbnQgKyAyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICghdW5hbWVkQXJjTGlzdC5jb250YWlucyhhcmMpKQotICAgICAgICB7Ci0gICAgICAgICAgdW5hbWVkQXJjTGlzdC5hZGQoYXJjKTsKLSAgICAgICAgICBjb2xsZWN0TmV4dFNpYmxpbmdzKGFyYy5ub2RlLCBuZXh0U2libGluZ0xpc3QsIG5hbWVkQXJjTGlzdCwgdW5hbWVkQXJjTGlzdCwgaW5kZW50ICsgMik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAKLSAgfQotICAgIAotICBwdWJsaWMgQ01Ob2RlW10gZ2V0TmV4dFNpYmxpbmdzKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgZWxlbWVudE5hbWUpCi0gIHsKLSAgICBMaXN0IGFyY0xpc3QgPSBnZXRNYXRjaGluZ0FyY3MoZWQsIGVsZW1lbnROYW1lKTsKLSAgICBMaXN0IG5leHRTaWJsaW5nTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBhcmNMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgQXJjIGFyYyA9IChBcmMpaS5uZXh0KCk7Ci0gICAgICBjb2xsZWN0TmV4dFNpYmxpbmdzKGFyYy5ub2RlLCBuZXh0U2libGluZ0xpc3QsIG5ldyBBcnJheUxpc3QoKSwgbmV3IEFycmF5TGlzdCgpLCAwKTsgICAgICAKLSAgICB9ICAKLSAgICBDTU5vZGVbXSByZXN1bHQgPSBuZXcgQ01Ob2RlW25leHRTaWJsaW5nTGlzdC5zaXplKCldOwotICAgIG5leHRTaWJsaW5nTGlzdC50b0FycmF5KHJlc3VsdCk7ICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludCgiZ2V0TmV4dFNpYmxpbmcoIiArZWxlbWVudE5hbWUgKyAiKSIpOwotICAgIC8vZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgLy97Ci0gICAgLy8gIFN5c3RlbS5vdXQucHJpbnQoIlsiICsgcmVzdWx0W2ldLmdldE5vZGVOYW1lKCkgKyAiXSIpOwotICAgIC8vfSAgCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3VsdAotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCA9IHRydWU7Ci0gICAgcHVibGljIGludCBlcnJvckluZGV4ID0gLTE7Ci0gICAgcHVibGljIFN0cmluZyBlcnJvck1lc3NhZ2U7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRUcmF2ZXJzZWQ7IC8vIGRldGVjdHMgaWYgYSByZXBlYXQgaGFzIGJlZW4gdHJhdmVyc2VkCi0KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5QdXNoKEFyYyBhcmMpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHB1c2goQXJjIGFyYykKLSAgICB7Ci0gICAgICAvLyBvdmVyaWRlIHRoaXMgbWV0aG9kIHRvIHJlY29yZCB0cmF2ZXJzZWQgbm9kZXMKLSAgICB9Ci0gICAgcHVibGljIHZvaWQgcG9wKEFyYyBhcmMpCi0gICAgewotICAgICAgLy8gb3ZlcmlkZSB0aGlzIG1ldGhvZCB0byByZWNvcmQgdHJhdmVyc2VkIG5vZGVzCi0gICAgfQotICAgIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheSgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0IGV4dGVuZHMgUmVzdWx0Ci0gIHsgIAotICAgIHByb3RlY3RlZCBMaXN0IGFjdGl2ZUl0ZW1Db3VudExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgcHJvdGVjdGVkIExpc3QgaW5hY3RpdmVJdGVtQ291bnRMaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAKLSAgICBwcm90ZWN0ZWQgVmVjdG9yIGVsZW1lbnRPcmlnaW5TdGFjayA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcm90ZWN0ZWQgQ01Ob2RlW10gb3JpZ2luQXJyYXkgPSBudWxsOwotICAgIHByb3RlY3RlZCBpbnQgcGFydGlhbFZhbGlkYXRpb25Db3VudCA9IDA7Ci0KLSAgICAKLSAgICAvLyB0aGlzIG1ldGhvZCBpcyB1c2VkIHRvIHN1cHBvcnQgZmFjZXQgY291bnRzCi0gICAgLy8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5QdXNoKEFyYyBhcmMpCi0gICAgeyAgICAgCi0gICAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgICAgICAKLSAgICAgIHRyeQotICAgICAgeyAgICAgICAgCi0gICAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgICB7ICAgICAgICAgIAotICAgICAgICAgIGlmIChhcmMuY21Ob2RlIGluc3RhbmNlb2YgQ01Db250ZW50KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNQ29udGVudCBjb250ZW50ID0gKENNQ29udGVudClhcmMuY21Ob2RlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gZG8gJ3NwZWNpYWwnIGZhY2V0IGNoZWNraW5nIGlmIHRoZSBtYXhPY2N1cnMgaXMgPiAxCi0gICAgICAgICAgICAvLyB2YWx1ZXMgb2YgJzAnIGFuZCAnLTEnICh1bmJvdW5kZWQpIHdvcmsgJ2ZvciBmcmVlJyB3aXRob3V0IGFueSBzcGVjaWFsIGNoZWNraW5nCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgaWYgKGNvbnRlbnQuZ2V0TWF4T2NjdXIoKSA+IDEpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIC8vIGhlcmUgd2UgbmVlZCB0byBjb21wdXRlIGlmIHdlIGNhbiBkbyBhbm90aGVyIHJlcGVhdAotICAgICAgICAgICAgICAvLyBpZiB3ZSBpbmNyZWFzZSB0aGUgcmVwZWF0IGNvdW50IGJ5ICcxJyB3aWxsIHRoaXMgdmlvbGF0ZSB0aGUgbWF4T2NjdXJzCi0gICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgIGlmIChpdGVtQ291bnQuY291bnQgKyAxID49IGNvbnRlbnQuZ2V0TWF4T2NjdXIoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiY2FuUHVzaCBSRVBFQVQgKCIgKyBpdGVtQ291bnQuY291bnQgKyAiKSIgKyBjb250ZW50LmdldE5vZGVOYW1lKCkgKyAiIHJlc3VsdD0gIiArIHJlc3VsdCk7ICAgICAgICAgICAgCi0gICAgICAgICAgfSAKLSAgICAgICAgfSAgICAgICAKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIH0KLSAgICAgIC8vU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgcHVzaChBcmMgYXJjKQotICAgIHsKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXB1c2goIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgZWxlbWVudE9yaWdpblN0YWNrLmFkZChhcmMuY21Ob2RlKTsKLSAgICAgICAgcGFydGlhbFZhbGlkYXRpb25Db3VudCA9IE1hdGgubWF4KGVsZW1lbnRPcmlnaW5TdGFjay5zaXplKCksIHBhcnRpYWxWYWxpZGF0aW9uQ291bnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlBSRVZfSU4pCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wdXNoKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGFjdGl2ZUl0ZW1Db3VudExpc3QuYWRkKG5ldyBJdGVtQ291bnQoKSk7ICAgCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuT1VUX05FWFQpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXB1c2goIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpICsgIlsiICsgYXJjICsgIl0iKTsKLSAgICAgICAgaW50IHNpemUgPSBhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKTsKLSAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoc2l6ZSAtIDEpOwotICAgICAgICBhY3RpdmVJdGVtQ291bnRMaXN0LnJlbW92ZShzaXplIC0gMSk7Ci0gICAgICAgIGluYWN0aXZlSXRlbUNvdW50TGlzdC5hZGQoaXRlbUNvdW50KTsgCi0gICAgICB9ICAgICAgCi0gICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUkVQRUFUKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcHVzaCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBJdGVtQ291bnQgaXRlbUNvdW50ID0gKEl0ZW1Db3VudClhY3RpdmVJdGVtQ291bnRMaXN0LmdldChhY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKSAtIDEpOwotICAgICAgICBpdGVtQ291bnQuY291bnQrKzsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oInJlcGVhdCgiICsgaXRlbUNvdW50LmNvdW50ICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgIH0gICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBvcChBcmMgYXJjKQotICAgIHsKLSAgICAgIGlmIChhcmMua2luZCA9PSBBcmMuRUxFTUVOVCkKLSAgICAgIHsKLSAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIltYXXBvcCgiICsgYXJjLmtpbmQgKyAiKSIgKyBhcmMuY21Ob2RlLmdldE5vZGVOYW1lKCkpOwotICAgICAgICBpbnQgc2l6ZSA9IGVsZW1lbnRPcmlnaW5TdGFjay5zaXplKCk7Ci0gICAgICAgIGVsZW1lbnRPcmlnaW5TdGFjay5yZW1vdmUoc2l6ZSAtIDEpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlBSRVZfSU4pCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wb3AoIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgYWN0aXZlSXRlbUNvdW50TGlzdC5yZW1vdmUoYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCkgLSAxKTsgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLk9VVF9ORVhUKQotICAgICAgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiW1hdcG9wKCIgKyBhcmMua2luZCArICIpIiArIGFyYy5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGludCBzaXplID0gaW5hY3RpdmVJdGVtQ291bnRMaXN0LnNpemUoKTsKLSAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpaW5hY3RpdmVJdGVtQ291bnRMaXN0LmdldChzaXplIC0gMSk7Ci0gICAgICAgIGluYWN0aXZlSXRlbUNvdW50TGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgICAgICBhY3RpdmVJdGVtQ291bnRMaXN0LmFkZChpdGVtQ291bnQpOyAgICAgCi0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKGFyYy5raW5kID09IEFyYy5SRVBFQVQpCi0gICAgICB7Ci0gICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJbWF1wb3AoIiArIGFyYy5raW5kICsgIikiICsgYXJjLmNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgSXRlbUNvdW50IGl0ZW1Db3VudCA9IChJdGVtQ291bnQpYWN0aXZlSXRlbUNvdW50TGlzdC5nZXQoYWN0aXZlSXRlbUNvdW50TGlzdC5zaXplKCkgLSAxKTsKLSAgICAgICAgaXRlbUNvdW50LmNvdW50LS07Ci0gICAgICB9ICAgICAKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmVjdG9yIGdldEVsZW1lbnRPcmlnaW5MaXN0KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZWxlbWVudE9yaWdpblN0YWNrOwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheSgpCi0gICAgewotICAgICAgcmV0dXJuIG9yaWdpbkFycmF5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9yaWdpbkFycmF5KENNTm9kZVtdIG9yaWdpbkFycmF5KQotICAgIHsKLSAgICAgIHRoaXMub3JpZ2luQXJyYXkgPSBvcmlnaW5BcnJheTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGludCBnZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFydGlhbFZhbGlkYXRpb25Db3VudDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KGludCBwYXJ0aWFsVmFsaWRhdGlvbkNvdW50KQotICAgIHsKLSAgICAgIHRoaXMucGFydGlhbFZhbGlkYXRpb25Db3VudCA9IHBhcnRpYWxWYWxpZGF0aW9uQ291bnQ7Ci0gICAgfQotICB9ICAKLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGF0aFJlY29yZGluZ1Jlc3VsdCBleHRlbmRzIFJlc3VsdAotICB7Ci0gICAgcHJvdGVjdGVkIFZlY3RvciBhcmNMaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIHZvaWQgcHVzaChBcmMgYXJjKQotICAgIHsKLSAgICAgIGFyY0xpc3QuYWRkKGFyYyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcG9wKEFyYyBhcmMpCi0gICAgewotICAgICAgaW50IHNpemUgPSBhcmNMaXN0LnNpemUoKTsKLSAgICAgIGFyY0xpc3QucmVtb3ZlKHNpemUgLSAxKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRBcmNMaXN0KCkKLSAgICB7Ci0gICAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXJjTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQXJjIGFyYyA9IChBcmMpaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAoYXJjLmtpbmQgPT0gQXJjLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChhcmMpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGlzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbE5vZGUgZ2V0TWF0Y2hNb2RlbCgpCi0gICAgewotICAgICAgTWF0Y2hNb2RlbE5vZGVCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWF0Y2hNb2RlbE5vZGVCdWlsZGVyKGFyY0xpc3QpOwotICAgICAgYnVpbGRlci5idWlsZE1hdGNoTW9kZWwoKTsKLSAgICAgIHJldHVybiBidWlsZGVyLmdldFJvb3QoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWF0Y2hNb2RlbE5vZGUKLSAgewotICAgIHB1YmxpYyBDTU5vZGUgY21Ob2RlOwotICAgIHB1YmxpYyBMaXN0IGNoaWxkcmVuID0gbmV3IFZlY3RvcigpOwotICAgIHB1YmxpYyBPYmplY3QgZGF0YTsKLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsTm9kZShNYXRjaE1vZGVsTm9kZSBwYXJlbnQsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnRNb2RlbChpbnQgaW5kZW50KQotICAgIHsKLSAgICAgIC8vU3RyaW5nIGNtTm9kZU5hbWUgPSBjbU5vZGUgIT0gbnVsbCA/IGNtTm9kZS5nZXROb2RlTmFtZSgpIDogIm51bGwiOwotICAgICAgLy9wcmludGxuSW5kZW50ZWQoaW5kZW50LCAiTWF0Y2hNb2RlbE5vZGUgOiAiICsgY21Ob2RlTmFtZSk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIE1hdGNoTW9kZWxOb2RlIGNoaWxkID0gKE1hdGNoTW9kZWxOb2RlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgY2hpbGQucHJpbnRNb2RlbChpbmRlbnQgKyAyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hdGNoTW9kZWxOb2RlQnVpbGRlcgotICB7Ci0gICAgcHJvdGVjdGVkIExpc3QgYXJjTGlzdDsKLSAgICBwcm90ZWN0ZWQgTGlzdCBzdGFjayA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcm90ZWN0ZWQgTWF0Y2hNb2RlbE5vZGUgcm9vdDsKLSAgICBwcm90ZWN0ZWQgTWF0Y2hNb2RlbE5vZGUgY3VycmVudDsKLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsTm9kZUJ1aWxkZXIoTGlzdCBhcmNMaXN0KQotICAgIHsKLSAgICAgIHRoaXMuYXJjTGlzdCA9IGFyY0xpc3Q7Ci0gICAgICByb290ID0gbmV3IE1hdGNoTW9kZWxOb2RlKG51bGwsIG51bGwpOwotICAgICAgcHVzaChyb290KTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBwdXNoKE1hdGNoTW9kZWxOb2RlIG5vZGUpCi0gICAgewotICAgICAgY3VycmVudCA9IG5vZGU7Ci0gICAgICBzdGFjay5hZGQobm9kZSk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgcG9wKCkKLSAgICB7Ci0gICAgICBpbnQgc2l6ZSA9IHN0YWNrLnNpemUoKTsKLSAgICAgIHN0YWNrLnJlbW92ZShzaXplIC0gMSk7Ci0gICAgICBjdXJyZW50ID0gKE1hdGNoTW9kZWxOb2RlKXN0YWNrLmdldChzaXplIC0gMik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDTUdyb3VwKENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgcmV0dXJuIGNtTm9kZSAhPSBudWxsICYmIGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5HUk9VUDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBidWlsZE1hdGNoTW9kZWwoKQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBhcmNMaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBBcmMgYXJjID0gKEFyYylpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgaWYgKGFyYy5raW5kID09IEFyYy5FTEVNRU5UKQotICAgICAgICB7Ci0gICAgICAgICAgY3VycmVudC5jaGlsZHJlbi5hZGQobmV3IE1hdGNoTW9kZWxOb2RlKGN1cnJlbnQsIGFyYy5jbU5vZGUpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChhcmMua2luZCA9PSBBcmMuUFJFVl9JTikKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0NNR3JvdXAoYXJjLmNtTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgTWF0Y2hNb2RlbE5vZGUgbmV3TW9kZWxOb2RlID0gbmV3IE1hdGNoTW9kZWxOb2RlKGN1cnJlbnQsIGFyYy5jbU5vZGUpOwotICAgICAgICAgICAgY3VycmVudC5jaGlsZHJlbi5hZGQobmV3TW9kZWxOb2RlKTsKLSAgICAgICAgICAgIHB1c2gobmV3TW9kZWxOb2RlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLk9VVF9ORVhUKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGlzQ01Hcm91cChhcmMuY21Ob2RlKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwb3AoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoYXJjLmtpbmQgPT0gQXJjLlJFUEVBVCkKLSAgICAgICAgewotICAgICAgICAgIGlmIChpc0NNR3JvdXAoYXJjLmNtTm9kZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcG9wKCk7Ci0gICAgICAgICAgICBNYXRjaE1vZGVsTm9kZSBuZXdNb2RlbE5vZGUgPSBuZXcgTWF0Y2hNb2RlbE5vZGUoY3VycmVudCwgYXJjLmNtTm9kZSk7Ci0gICAgICAgICAgICBjdXJyZW50LmNoaWxkcmVuLmFkZChuZXdNb2RlbE5vZGUpOwotICAgICAgICAgICAgcHVzaChuZXdNb2RlbE5vZGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBNYXRjaE1vZGVsTm9kZSBnZXRSb290KCkKLSAgICB7Ci0gICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGludGVyZmFjZSBFbGVtZW50Q29udGVudENvbXBhcmF0b3IKLSAgewotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JhYmxlKE9iamVjdCBvKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BDRGF0YShPYmplY3Qgbyk7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KE9iamVjdCBvKTsKLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKE9iamVjdCBvLCBDTU5vZGUgY21Ob2RlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIGxpbmtlZCBsaXN0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEVsZW1lbnRMaXN0Ci0gIHsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGhlYWQ7Ci0gICAgcHJvdGVjdGVkIEVsZW1lbnRMaXN0IHRhaWw7Ci0KLSAgICBwdWJsaWMgc3RhdGljIEVsZW1lbnRMaXN0IGNyZWF0ZShMaXN0IHYpCi0gICAgewotICAgICAgRWxlbWVudExpc3QgZmlyc3QgPSBudWxsOwotICAgICAgRWxlbWVudExpc3QgcHJldiA9IG51bGw7Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB2Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBPYmplY3QgbyA9IGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIEVsZW1lbnRMaXN0IGxpc3QgPSBuZXcgRWxlbWVudExpc3QoKTsKLSAgICAgICAgICBsaXN0LmhlYWQgPSBvOwotCi0gICAgICAgICAgaWYgKHByZXYgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBwcmV2LnRhaWwgPSBsaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgZmlyc3QgPSBsaXN0OwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmV2ID0gbGlzdDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZpcnN0OwotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9ICJbIiArIGhlYWQgKyAiXSwiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotICAgICAgaWYgKHRhaWwgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nICs9IHRhaWwudG9TdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHN0cmluZzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RyaW5nRWxlbWVudENvbnRlbnRDb21wYXJhdG9yCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0VsZW1lbnRDb250ZW50Q29tcGFyYXRvciBpbXBsZW1lbnRzIEVsZW1lbnRDb250ZW50Q29tcGFyYXRvcgotICB7Ci0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGUoT2JqZWN0IG8pCi0gICAgewotICAgICAgU3RyaW5nIHN0cmluZyA9IG8udG9TdHJpbmcoKTsKLSAgICAgIHJldHVybiBzdHJpbmcuc3RhcnRzV2l0aCgiISIpIHx8IHN0cmluZy5zdGFydHNXaXRoKCI/Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUENEYXRhKE9iamVjdCBvKQotICAgIHsKLSAgICAgIFN0cmluZyBzdHJpbmcgPSBvLnRvU3RyaW5nKCk7Ci0gICAgICByZXR1cm4gc3RyaW5nLnN0YXJ0c1dpdGgoIiciKSB8fCBzdHJpbmcuc3RhcnRzV2l0aCgiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbGVtZW50KE9iamVjdCBvKQotICAgIHsKLSAgICAgIHJldHVybiAhaXNJZ25vcmFibGUobykgJiYgIWlzUENEYXRhKG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXMoT2JqZWN0IG8sIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgIHsgCi0gICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlOwotICAgICAgICBTdHJpbmcgbmFtZSA9IG8udG9TdHJpbmcoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0ID0gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGVsZW1lbnQuZ2V0RWxlbWVudE5hbWUoKSk7ICAgICAgICAKLQotICAgICAgICAvLyBUT0RPLi4uIGhlcmUncyB3ZSBjb25zaWRlciBzdWJzdGl0dXRpb24gZ3JvdXBzLi4uIHJldmlzaXQgdG8gc2VlIGlmIHRoaXMgc2hvdWxkIGJlIG1vdmVkIGludG8gdmFsaWRhdG9yIGNvZGUKLSAgICAgICAgaWYgKCFyZXN1bHQpCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGVMaXN0IGNtTm9kZUxpc3QgPSAoQ01Ob2RlTGlzdCllbGVtZW50LmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAoY21Ob2RlTGlzdCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBjbU5vZGVMaXN0TGVuZ3RoID0gY21Ob2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICAgIGlmIChjbU5vZGVMaXN0TGVuZ3RoID4gMSkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjbU5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBhbHRlcm5hdGl2ZUNNRWxlbWVudERlY2xhcmF0aW9uID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtTm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYWx0TmFtZSA9IGFsdGVybmF0aXZlQ01FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKTsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuYW1lLmVxdWFsc0lnbm9yZUNhc2UoYWx0TmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgICAKLSAgICAgIH0gICAKLSAgICAgIGVsc2UgaWYgKGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BTllfRUxFTUVOVCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgc3RyaW5nID0gby50b1N0cmluZygpOwotICAgICAgICBpZiAoc3RyaW5nLmVxdWFscygiKiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIENNQW55RWxlbWVudCBhbnlFbGVtZW50ID0gKENNQW55RWxlbWVudCljbU5vZGU7Ci0gICAgICAgICAgU3RyaW5nIGFueUVsZW1lbnRVUkkgPSBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyAgICAKLSAgICAgICAgICBpZiAoYW55RWxlbWVudFVSSSAhPSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKGFueUVsZW1lbnRVUkkuZXF1YWxzKCIjI2FueSIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoYW55RWxlbWVudFVSSS5lcXVhbHMoIiMjb3RoZXIiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgeyAgICAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7ICAgIAotICAgICAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudClhbnlFbGVtZW50LmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGV4Y2x1ZGVkVVJJID0gKFN0cmluZyljbURvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvdGFyZ2V0TmFtZXNwYWNlVVJJIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICBpZiAoZXhjbHVkZWRVUkkgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgU3RyaW5nIHNwZWNpZmllZFVSSSA9IGdldFVSSUZvckNvbnRlbnRTcGVjaWZpY2F0aW9uKHN0cmluZyk7Ci0gICAgICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVkVVJJICE9IG51bGwgJiYgZXhjbHVkZWRVUkkuZXF1YWxzKHNwZWNpZmllZFVSSSkpCi0gICAgICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgZWxzZSBpZiAoYW55RWxlbWVudFVSSS5lcXVhbHMoIiMjdGFyZ2V0TmFtZXNwYWNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpYW55RWxlbWVudC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgeyAgICAgCi0gICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldE5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNwZWNpZmllZFVSSSA9IGdldFVSSUZvckNvbnRlbnRTcGVjaWZpY2F0aW9uKHN0cmluZyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNwZWNpZmllZFVSSSAhPSBudWxsICYmICF0YXJnZXROYW1lc3BhY2VVUkkuZXF1YWxzKHNwZWNpZmllZFVSSSkpCi0gICAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0gCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgIAotICAgICAgICAgICAgeyAgICAgICAgCi0gICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgIFN0cmluZyBzcGVjaWZpZWRVUkkgPSBnZXRVUklGb3JDb250ZW50U3BlY2lmaWNhdGlvbihzdHJpbmcpOwotICAgICAgICAgICAgICBpZiAoc3BlY2lmaWVkVVJJICE9IG51bGwgJiYgIWFueUVsZW1lbnRVUkkuZXF1YWxzKHNwZWNpZmllZFVSSSkpCi0gICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIH0gICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9ICAKLSAgICAgICAgICBlbHNlIAotICAgICAgICAgIHsgICAgICAgICAgCi0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgIH0gICAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgIAotICAgIAotCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRVUklGb3JDb250ZW50U3BlY2lmaWNhdGlvbihTdHJpbmcgc3BlY2lmaWNhdGlvbikKLSAgICB7ICAgICAgICAgICAKLSAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgICAgaW50IGluZGV4ID0gc3BlY2lmaWNhdGlvbi5pbmRleE9mKCJdIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgIHJlc3VsdCA9IHNwZWNpZmljYXRpb24uc3Vic3RyaW5nKDEsIGluZGV4KTsKLSAgICAgIH0gCi0gICAgICByZXR1cm4gcmVzdWx0OyAgCi0gICAgfQotICB9ICAgICAgCi0KLSAgcHVibGljIHN0YXRpYyBMaXN0IGNyZWF0ZVN0cmluZ0xpc3QoU3RyaW5nIGFyZ1tdLCBpbnQgc3RhcnRJbmRleCkKLSAgewotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoaW50IGkgPSBzdGFydEluZGV4OyBpIDwgYXJnLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKGFyZ1tpXSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvRE9NVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9ET01WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM0ZGY5Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9ET01WYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBBIHNwZWNpYWwgQ01WYWxpZGF0b3IgdGhhdCBrbm93cyBhYm91dCBET01zCi0gKi8KLXB1YmxpYyBjbGFzcyBET01WYWxpZGF0b3IgZXh0ZW5kcyBDTVZhbGlkYXRvcgoteyAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG5vZGUpCi0gIHsgICAKLSAgICByZXR1cm4gRE9NTmFtZXNwYWNlSGVscGVyLmdldE5hbWVzcGFjZVVSSShub2RlKTsKLSAgICAvL3JldHVybiBub2RlLmdldE5hbWVzcGFjZVVSSSgpOwotICB9Ci0gICAgICAgICAgCi0KLSAgLy8KLSAgLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSBoYWNrISEKLSAgLy8KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRGYWxsYmFja05hbWVwYWNlVVJJKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgCi0gICAgU3RyaW5nIGZhbGxiYWNrTmFtZXBhY2VVUkkgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWVkLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIGZhbGxiYWNrTmFtZXBhY2VVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgICAvLyROT04tTkxTLTEkCi0gICAgfSAgCi0gICAgcmV0dXJuIGZhbGxiYWNrTmFtZXBhY2VVUkk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlIHRoZSBFbGVtZW50J3MgTm9kZUxpc3QgYXMgYSBMaXN0IG9mIHN0cmluZ3MgdGhhdCB0aGUgdmFsaWRhdG9yIHJlY29nbml6ZXMKLSAgICovCi0gIHB1YmxpYyBMaXN0IGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIGlzTmFtZXNwYWNlQXdhcmUgPSBpc05hbWVzcGFjZUF3YXJlKGVkKTsKLSAgICBWZWN0b3IgdiA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAKLSAgICBmb3IgKE5vZGUgY2hpbGROb2RlID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkTm9kZSAhPSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkKLSAgICB7IAotICAgICAgdi5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb24oY2hpbGROb2RlLCBpc05hbWVzcGFjZUF3YXJlLCBpc05hbWVzcGFjZUF3YXJlID8gZ2V0RmFsbGJhY2tOYW1lcGFjZVVSSShlZCkgOiBudWxsKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLQotICBwdWJsaWMgTGlzdCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoTGlzdCBub2RlTGlzdCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlID0gaXNOYW1lc3BhY2VBd2FyZShlZCk7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7ICAgICAgICAgICAgCi0gCi0gICAgZm9yIChJdGVyYXRvciBpID0gbm9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLSAgICAgIHYuYWRkKGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uKG5vZGUsIGlzTmFtZXNwYWNlQXdhcmUsIGdldEZhbGxiYWNrTmFtZXBhY2VVUkkoZWQpKSk7Ci0gICAgfQotICAgIHJldHVybiB2OwotICB9Ci0KLQotICAvKioKLSAgICogRW5jb2RlIHRoZSBOb2RlIGFzIGEgc3RyaW5nIHRoYXQgdGhlIHZhbGlkYXRvciByZWNvZ25pemVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uKE5vZGUgbm9kZSwgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlLCBTdHJpbmcgZmFsbGJhY2tOYW1lcGFjZVVSSSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICBzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsgIAotICAgICAgICBTdHJpbmcgbm9kZU5hbWUgPSBub2RlLmdldE5vZGVOYW1lKCk7ICAKLSAgICAgICAgaWYgKG5vZGVOYW1lLnN0YXJ0c1dpdGgoImpzcDoiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQgPSAiISI7IC8vIHRyZWF0IGl0IGFzIGEgY29tbWVudCBzbyB0aGF0IGl0J3MgaWdub3JlZCBieSB0aGUgdmFsaWRhdG9yIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNOYW1lc3BhY2VBd2FyZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0VW5wcmVmaXhlZE5hbWUobm9kZU5hbWUpOwotICAgICAgICAgICAgU3RyaW5nIHVyaSA9IGdldE5hbWVzcGFjZVVSSShub2RlKTsKLSAgICAgICAgICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gIlsiICsgdXJpICsgIl0iICsgcmVzdWx0OyAgICAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0gCi0gICAgICAgICAgICBlbHNlIGlmIChmYWxsYmFja05hbWVwYWNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9ICJbIiArIGZhbGxiYWNrTmFtZXBhY2VVUkkgKyAiXSIgKyByZXN1bHQ7ICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSAgCi0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5vZGVOYW1lOwotICAgICAgICAgIH0KLSAgICAgICAgfSAgICAgICAgCi0gICAgICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuKCJyZXN1bHQgIiArIHJlc3VsdCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9ICI/IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotICAgICAgewotICAgICAgICByZXN1bHQgPSAiISI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gIlwiIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5URVhUX05PREUgOgotICAgICAgewotICAgICAgICBTdHJpbmcgZGF0YSA9ICgoVGV4dClub2RlKS5nZXREYXRhKCk7Ci0gICAgICAgIC8vIGhlcmUgd2UgdGVzdCB0byBzZWUgaWYgdGhlIHRlc3Qgbm9kZSBpcyAnaWdub3JhYmxlJwotICAgICAgICBpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEudHJpbSgpLmxlbmd0aCgpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9ICJcIiIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAiISI7IC8vIHRvZG8uLi4gdXNlIGFub3RoZXIgc3ltYm9sPyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIExpc3QgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgc3dpdGNoIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSkKLSAgICB7Ci0gICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgIHsgICAgICAgICAKLSAgICAgICAgbGlzdC5hZGQoY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25Gb3JDTUVsZW1lbnREZWNsYXJhdGlvbigoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Ob2RlKSk7ICAgCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIlwiIiArIGNtTm9kZS5nZXROb2RlTmFtZSgpICsgIlwiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkdST1VQIDoKLSAgICAgIHsKLSAgICAgICAgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0Rm9yQ01Hcm91cCgoQ01Hcm91cCljbU5vZGUsIGxpc3QpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgQ01Ob2RlLkFOWV9FTEVNRU5UIDoKLSAgICAgIHsKLSAgICAgICAgbGlzdC5hZGQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGRlZmF1bHQgOgotICAgICAgewotICAgICAgICBsaXN0LmFkZCgiISIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBsaXN0OwotICB9Ci0gICAgIAotCi0gIC8qKgotICAgKiAKLSAgICovICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkZvckNNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAKLSAgICBDTURvY3VtZW50IGRvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyB1cmkgPSBkb2N1bWVudCAhPSBudWxsID8gKFN0cmluZylkb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpIDogbnVsbDsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBzdHJpbmcgPSBlZC5nZXROb2RlTmFtZSgpOwotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgCi0gICAgICBzdHJpbmcgPSAiWyIgKyB1cmkgKyAiXSIgKyBzdHJpbmc7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZXR1cm4gc3RyaW5nOwotICB9Ci0gIAotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdEZvckNNR3JvdXAoQ01Hcm91cCBncm91cCwgTGlzdCBsaXN0KQotICB7ICAgICAgICAgCi0gICAgQ01Hcm91cENvbnRlbnRWaXNpdG9yIHZpc2l0b3IgPSBuZXcgQ01Hcm91cENvbnRlbnRWaXNpdG9yKGdyb3VwLCBsaXN0KTsKLSAgICB2aXNpdG9yLnZpc2l0Q01Ob2RlKGdyb3VwKTsKLSAgfSAKLSAgICAgCi0gIHByb3RlY3RlZCBjbGFzcyBDTUdyb3VwQ29udGVudFZpc2l0b3IgZXh0ZW5kcyBDTVZpc2l0b3IKLSAgeyAgCi0gICAgcHJvdGVjdGVkIENNR3JvdXAgcm9vdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGxpc3Q7Ci0KLSAgICBwdWJsaWMgQ01Hcm91cENvbnRlbnRWaXNpdG9yKENNR3JvdXAgcm9vdCwgTGlzdCBsaXN0KQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB0aGlzLnJvb3QgPSByb290OyAgICAgICAgCi0gICAgICB0aGlzLmxpc3QgPSBsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gICAgeyAgICAgICAgICAgCi0gICAgICBpZiAoZWQuZ2V0TWluT2NjdXIoKSA+IDApCi0gICAgICB7Ci0gICAgICAgIGxpc3QuYWRkKGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uRm9yQ01FbGVtZW50RGVjbGFyYXRpb24oZWQpKTsKLSAgICAgIH0KLSAgICB9ICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUFueUVsZW1lbnQoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gICAgeyAgIAotICAgICAgbGlzdC5hZGQoIioiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChncm91cCA9PSByb290IHx8IGdyb3VwLmdldE1pbk9jY3VyKCkgPiAwKQotICAgICAgewotICAgICAgICBpbnQgb3AgPSBncm91cC5nZXRPcGVyYXRvcigpOwotICAgICAgICBpZiAob3AgPT0gQ01Hcm91cC5TRVFVRU5DRSkKLSAgICAgICAgewotICAgICAgICAgIHN1cGVyLnZpc2l0Q01Hcm91cChncm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAob3AgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgICAgIHsKLSAgICAgICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICAgIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgICAgewotICAgICAgICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbSgwKSk7Ci0gICAgICAgICAgfSAgICAgIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgeyAKLSAgICByZXR1cm4gZWQgIT0gbnVsbCA/IGVkLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvaXNOYW1lU3BhY2VBd2FyZSIpICE9IG51bGwgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotICB9Ci0gICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgRWxlbWVudFBhdGhSZWNvcmRpbmdSZXN1bHQgcmVzdWx0ID0gbmV3IEVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0KCk7Ci0gICAgZ2V0T3JpZ2luQXJyYXkoZWQsIGNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChlbGVtZW50LCBlZCksIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQuZ2V0T3JpZ2luQXJyYXkoKTsKLSAgfQotICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBNYXRjaE1vZGVsTm9kZSBnZXRNYXRjaE1vZGVsKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBNYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSA9IG51bGw7Ci0gICAgUGF0aFJlY29yZGluZ1Jlc3VsdCByZXN1bHQgPSBuZXcgUGF0aFJlY29yZGluZ1Jlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QoZWxlbWVudCwgZWQpLCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICBpZiAocmVzdWx0LmlzVmFsaWQpCi0gICAgewotICAgICAgbWF0Y2hNb2RlbE5vZGUgPSByZXN1bHQuZ2V0TWF0Y2hNb2RlbCgpOwotICAgIH0KLSAgICByZXR1cm4gbWF0Y2hNb2RlbE5vZGU7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gIHB1YmxpYyBMaXN0IGNsb25lKExpc3QgbGlzdCkKLSAgeyAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IFZlY3RvcihsaXN0LnNpemUoKSk7Ci0gICAgcmVzdWx0LmFkZEFsbChsaXN0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IGluc2VydEluZGV4LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgICAgICAgICAKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIGluc2VydChjbG9uZWRMaXN0LCBpbnNlcnRJbmRleCwgY21Ob2RlKTsKLSAgICBib29sZWFuIHJlc3VsdCA9IGlzUGFydGlhbGx5VmFsaWQoZWQsIGNsb25lZExpc3QpOyAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IGluc2VydEluZGV4LCBMaXN0IGNtTm9kZUxpc3QpCi0gIHsgICAgICAgICAgICAgIAotICAgIExpc3QgY2xvbmVkTGlzdCA9IGNsb25lKGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgaW5zZXJ0KGNsb25lZExpc3QsIGluc2VydEluZGV4LCBjbU5vZGVMaXN0KTsKLSAgICByZXR1cm4gaXNWYWxpZChlZCwgY2xvbmVkTGlzdCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVtb3ZlKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgpCi0gIHsKLSAgICByZXR1cm4gY2FuUmVtb3ZlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0YXJ0UmVtb3ZlSW5kZXgsIHN0YXJ0UmVtb3ZlSW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbnQgc3RhcnRSZW1vdmVJbmRleCwgaW50IGVuZFJlbW92ZUluZGV4KQotICB7Ci0gICAgTGlzdCBjbG9uZWRMaXN0ID0gY2xvbmUoY29udGVudFNwZWNpZmljYXRpb25MaXN0KTsKLSAgICByZW1vdmUoY2xvbmVkTGlzdCwgc3RhcnRSZW1vdmVJbmRleCwgZW5kUmVtb3ZlSW5kZXgpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIGludCBzdGFydFJlbW92ZUluZGV4LCBpbnQgZW5kUmVtb3ZlSW5kZXgsIENNTm9kZSBjbU5vZGUpCi0gIHsKLSAgICBMaXN0IGNsb25lZExpc3QgPSBjbG9uZShjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIHJlbW92ZShjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBlbmRSZW1vdmVJbmRleCk7IAotICAgIGluc2VydChjbG9uZWRMaXN0LCBzdGFydFJlbW92ZUluZGV4LCBjbU5vZGUpOwotICAgIHJldHVybiBpc1ZhbGlkKGVkLCBjbG9uZWRMaXN0KTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKi8gICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0KQotICB7Ci0gICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICB2YWxpZGF0ZShlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBzdHJpbmdDb250ZW50Q29tcGFyaXRvciwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0LmlzVmFsaWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1BhcnRpYWxseVZhbGlkKENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkKLSAgewotICAgIENNVmFsaWRhdG9yLkVsZW1lbnRQYXRoUmVjb3JkaW5nUmVzdWx0IHJlc3VsdCA9IG5ldyBDTVZhbGlkYXRvci5FbGVtZW50UGF0aFJlY29yZGluZ1Jlc3VsdCgpOwotICAgIHZhbGlkYXRlKGVkLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QsIHN0cmluZ0NvbnRlbnRDb21wYXJpdG9yLCByZXN1bHQpOwotICAgIGludCBjb3VudCA9IGdldEVsZW1lbnRDb3VudChjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbGVtZW50T3JpZ2luTGlzdCAiICsgcmVzdWx0LmdldFBhcnRpYWxWYWxpZGF0aW9uQ291bnQoKSArICJ2cyIgKyBjb3VudCk7Ci0gICAgcmV0dXJuIHJlc3VsdC5nZXRQYXJ0aWFsVmFsaWRhdGlvbkNvdW50KCkgPj0gY291bnQ7Ci0gIH0gIAotICAKLSAgcHVibGljIGludCBnZXRFbGVtZW50Q291bnQoTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpCi0gIHsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIGlmIChzdHJpbmdDb250ZW50Q29tcGFyaXRvci5pc0VsZW1lbnQoaS5uZXh0KCkpKQotICAgICAgewotICAgICAgICBjb3VudCsrOwotICAgICAgfSAgCi0gICAgfSAgCi0gICAgcmV0dXJuIGNvdW50OwotICB9Ci0KLSAgcHJvdGVjdGVkIFJlc3VsdCB2YWxpZGF0ZShDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBSZXN1bHQoKTsKLSAgICB2YWxpZGF0ZShlZCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGVsZW1lbnQsIGVkKSwgc3RyaW5nQ29udGVudENvbXBhcml0b3IsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlKExpc3Qgc3RyaW5nTGlzdCwgaW50IHN0YXJ0UmVtb3ZlSW5kZXgsIGludCBlbmRSZW1vdmVJbmRleCkKLSAgewotICAgIGlmIChzdGFydFJlbW92ZUluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGZvciAoaW50IGkgPSBzdGFydFJlbW92ZUluZGV4OyBpIDw9IGVuZFJlbW92ZUluZGV4OyBpKyspCi0gICAgICB7Ci0gICAgICAgIHN0cmluZ0xpc3QucmVtb3ZlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluc2VydChMaXN0IHN0cmluZ0xpc3QsIGludCBpbnNlcnRJbmRleCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIGlmIChpbnNlcnRJbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBzdHJpbmdMaXN0LmFkZEFsbChpbnNlcnRJbmRleCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNtTm9kZSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGluc2VydChMaXN0IHN0cmluZ0xpc3QsIGludCBpbnNlcnRJbmRleCwgTGlzdCBjbU5vZGVMaXN0KQotICB7Ci0gICAgaWYgKGluc2VydEluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGludCBpbnNlcnRMaXN0U2l6ZSA9IGNtTm9kZUxpc3Quc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IGluc2VydExpc3RTaXplIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSAoQ01Ob2RlKWNtTm9kZUxpc3QuZ2V0KGkpOwotICAgICAgICBzdHJpbmdMaXN0LmFkZEFsbChpbnNlcnRJbmRleCwgY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNtTm9kZSkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODBhZGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudE1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi0KLS8qKgotICogVGhlIENNRG9jdW1lbnRNYW5hZ2VyIGNhbiBiZSB2aXN1YWxpemVkIGFzIGEgdGFibGUgb2YgQ01Eb2N1bWVudAotICogcmVmZXJlbmNlcywgZWFjaCB3aXRoIGEgY29ycmVzcG9uZGluZyBlbnRyeSBpbiBhIENNRG9jdW1lbnQgY2FjaGUuIFRoZQotICogQ01Eb2N1bWVudE1hbmFnZXIgYWxzbyBwZXJmb3JtcyB0aGUgdGFzayBvZiBsb2FkaW5nIENNRG9jdW1lbnRzIHByb3ZpZGluZwotICogc3VwcG9ydCBmb3Igc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBsb2FkaW5nLgotICogCi0gKiBwdWJsaWNJZFRhYmxlIENNRG9jdW1lbnRDYWNoZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IHB1YmxpY0lkIHwgcmVzb2x2ZWRVUkkgfCAtPiB8Ci0gKiByZXNvbHZlZFVSSSB8IHN0YXR1cyB8IENNRG9jdW1lbnQgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IChudWxsKSB8IGZpbGU6L3guZHRkIHwgfAotICogZmlsZToveC5kdGQgfCBsb2FkaW5nIHwgKG51bGwpIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCBodHRwOi8uLi4gfCBmaWxlOi95LnhzZCB8IHwKLSAqIGZpbGU6L3kueHNkIHwgbG9hZGVkIHwgfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudE1hbmFnZXIgewotCS8qKgotCSAqIFRoaXMgcHJvcGVydHkgc3BlY2lmaWVzIFdIRU4gQ01Eb2N1bWVudHMgYXJlIGxvYWRlZC4gU2V0dGluZyB0aGlzCi0JICogcHJvcGVydHkgdG8gdHJ1ZSBhbGxvd3MgdGhlIENNRG9jdW1lbnRNYW5hZ2VyIHRvIGxvYWQgQ01Eb2N1bWVudHMgb24KLQkgKiBkZW1hbmQuIFNldHRpbmdzIHRoaXMgcHJvcGVydHkgYSBmYWxzZSBwdXRzIHRoZSBvbnVzIG9uIHRoZSBjbGllbnQgdG8KLQkgKiBjYWxsIGFkZENNRG9jdW1lbnRSZWZlcmVuY2UoKSB0byBleHBsaWNpdHkgdHJpZ2dlciBhIGxvYWQuIFRoaXMgYWxsb3dzCi0JICogdGhlIGNsaWVudCB0byBjb250cm9sIGV4YWN0bHkgd2hlbiBsb2FkaW5nIHNob3VsZCB0YWtlIHBsYWNlLiApCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQVVUT19MT0FEID0gImF1dG9Mb2FkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogVGhpcyBwcm9wZXJ0eSBzcGVjaWZpZXMgSE9XIENNRG9jdW1lbnRzIGFyZSBsb2FkZWQuIFdoZW4gc2V0IHRvIGZhbHNlLAotCSAqIHRoZSBnZXRDTURvY3VtZW50KCkgbWV0aG9kIHdpbGwgbG9hZCB0aGUgQ01Eb2N1bWVudCBzeW5jaHJvbm91c2x5IGFuZAotCSAqIHJldHVybiBhIENNRG9jdW1lbnQgb2JqZWN0IHdoZW4gbG9hZGluZyBpcyBzdWNjZXNzZnVsLiBXaGVuIHNldCB0bwotCSAqIHRydWUsIHRoZSBnZXRDTURvY3VtZW50KCkgd2lsbCBsb2FkIHRoZSBDTURvY3VtZW50IGFzeW5jaHJvbm91c2x5IGFuZAotCSAqIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIG51bGwuIFdoZW4gbG9hZGluZyBpcyBjb21wbGV0ZSwgdGhlCi0JICogQ01Eb2N1bWVudE1hbmFnZXIgd2lsbCBpbmZvcm0gaXRzIGxpc3RlbmVycyB0aGF0IHRoZSBDTURvY3VtZW50IGhhcwotCSAqIGJlZW4gbG9hZGVkLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0FTWU5DX0xPQUQgPSAiYXN5bmNMb2FkIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVVNFX0NBQ0hFRF9SRVNPTFZFRF9VUkkgPSAidXNlQ2FjaGVkUmVzb3ZsZWRVUkkiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTZXQgdGhlIGVuYWJsZWQgc3RhdGUgb2YgYSBwcm9wZXJ0eS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eUVuYWJsZWQoU3RyaW5nIHByb3BlcnR5TmFtZSwgYm9vbGVhbiBlbmFibGVkKTsKLQotCS8qKgotCSAqIEdldCB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgcHJvcGVydHkuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0UHJvcGVydHlFbmFibGVkKFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotCi0JLyoqCi0JICogQWRkcyBhIGxpc3RlbmVyLiBMaXN0ZW5lcnMgc2hvdWxkIGV4cGVjdCB0byByZWNlaXZlIGNhbGwgYmFja3Mgb24gYQotCSAqIHNlY29uZGFyeSB0aHJlYWQgd2hlbiBhc3luY2hyb25vdXNseSBsb2FkaW5nIGlzIHVzZWQuCi0JICovCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBSZW1vdmVzIGEgbGlzdGVuZXIuCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLQkvKioKLQkgKiBMb29rdXAgb3IgY3JlYXRlIGEgQ01Eb2N1bWVudCAoZGVwZW5kaW5nIG9uIFBST1BFUlRZX0FVVE9fTE9BRCkuCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHBhcmFtIHR5cGUgLQotCSAqICAgICAgICAgICAgJ2R0ZCcsICd4c2QnLCAndGxkJywgZXRjLiBpZiBudWxsIGlzIGdpdmVuIGFzIHRoZSB0eXBlLCB0aGVuCi0JICogICAgICAgICAgICB0aGUgdHlwZSBpcyBjYWxjdWxhdGVkIGFzIGxhc3Qgc2VnbWVudCAoZS5nLiBmaWxlIGV4dGVuc2lvbikKLQkgKiAgICAgICAgICAgIG9mIHRoZSByZXNvbHZlZCBVUkkKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpOwotCi0JLyoqCi0JICogTG9va3VwIGEgQ01Eb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBHZXQgdGhlIHN0YXR1cyBvZiBhIENNRG9jdW1lbnQuCi0JICovCi0JcHVibGljIGludCBnZXRDTURvY3VtZW50U3RhdHVzKFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgQ01Eb2N1bWVudCBhbmQgYWRkcyB0aGUgYXNzb2NpYXRlZCBDTURvY3VtZW50IHJlZmVyZW5jZQotCSAqIGluZm9ybWF0aW9uIHRvIHRoZSB0YWJsZS4gQ2FsbGluZyB0aGlzIG1ldGhvZCBhbHdheXMgdHJpZ2dlcnMgYQotCSAqIENNRG9jdW1lbnQgbG9hZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50UmVmZXJlbmNlKFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgdHlwZSk7Ci0KLQkvKioKLQkgKiBBZGQgYW4gZXhpc3RpbmdDTURvY3VtZW50IGFuZCB0aGUgcmVmZXJlbmNlIGluZm9ybWF0aW9uIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRDTURvY3VtZW50KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpOwotCi0JLyoqCi0JICogUmVtb3ZlIGFsbCBlbnRyaWVzIGZyb20gdGhlIHRhYmxlLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZmVyZW5jZXMoKTsKLQotCS8qKgotCSAqIEdldCB0aGUgQ01Eb2N1bWVudENhY2hlIHRoYXQgaXMgdXNlZCB0byBzdG9yZSBsb2FkZWQgQ01Eb2N1bWVudHMgYW5kCi0JICogYXNzb2NpYXRlZCBzdGF0dXMuCi0JICovCi0JcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKTsKLQotCS8qKgotCSAqIEJ1aWxkcyBhIENNRG9jdW1lbnQgZ2l2ZW4gYSByZXNvdWx2ZWRVUkkuIE5vdGUgdGhhdCBubyBlbnRyaWVzIGFyZQotCSAqIGFkZGVkIHRvIHRoZSB0YWJsZS4KLQkgKi8KLQlwdWJsaWMgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQwYmVlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGVMaXN0ZW5lcjsKLQotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgZXh0ZW5kcyBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcgoteyAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlciwgU3RyaW5nIHByb3BlcnR5TmFtZSk7Ci19ICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGRmY2I4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5OwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudFJlZmVyZW5jZQotewotICBwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCk7Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L0NNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiYTMwZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLSAKLS8qKgotICogVGhlIGludGVyZmFjZSBpcyB1c2VkIHRvIGFic3RyYWN0IHRoZSB0YXNrIG9mIGNvbXB1dGluZyB0aGUgZG9jdW1lbnQgcmVmZXJlbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBET00KLSAqIG9yIGEgcGFydGljdWxhciBub2RlIHdpdGhpbiB0aGUgRE9NLiAgCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyCi17Ci0gIExpc3QgZ2V0Q01Eb2N1bWVudFJlZmVyZW5jZXMoTm9kZSBub2RlLCBib29sZWFuIGRlZXApOwotICBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvTW9kZWxRdWVyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODVlNzNkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb24uTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgcGVyZm9ybWluZyBoaWdoZXIgbGV2ZWwgcXVlcmllcyBiYXNlZCBvbgotICogYSB4bWwgbW9kZWwgKERPTSkgYW5kIG9uZSBvciBtb3JlIGFzc29jaWF0ZWQgY29udGVudCBtb2RlbHMgKENNRG9jdW1lbnQpLgotICoKLSAqIFRoZSBxdWVyaWVzIHByb3ZpZGVkIGNhbiBiZSBvcmdhbml6ZWQgaW50byB0aHJlZSBncm91cHM6Ci0gKgotICogMSkgRE9NIE5vZGUgdG8gQ01Ob2RlIG1hcHBpbmcKLSAqICAgICAgR2l2ZW4gYSBncmFtbWF0aWNhbGx5IHZhbGlkIERPTSBOb2RlIHRoZSBjb3JyZXNwb25kaW5nIENNTm9kZSBjYW4gYmUgZGV0ZXJtaW5lZC4KLSAqICAgICAgKGkuZS4gRWxlbWVudCAtPiBDTUVsZW1lbnREZWNsYXJhdGlvbiwgQXR0ciAtPiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLCBDaGFyYWN0ZXJEYXRhIC0+IENNRGF0YVR5cGUpCi0gKgotICogMikgRE9NIGVkaXRpbmcgdGVzdHMgKCJDYW4gSSBkbyB0aGlzPyIpCi0gKiAgICAgIFF1ZXN0aW9ucyBzdWNoIGFzIGNhbkluc2VydCwgY2FuUmVtb3ZlLCBjYW5SZXBsYWNlIGNhbiBhc3Npc3QgaW4gdGhlIGVkaXRpbmcgb2YgYSBET00uCi0gKgotICogICAgICBUaGUgdmFsaWRpdHlDaGVja2luZyBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZSBzdHJpY3RuZXNzIG9mIHRoZSB2YWxpZGl0eSB0ZXN0aW5nIHRoYXQgb2NjdXJzLgotICoKLSAqICAgICAgLSBWQUxJRElUWV9OT05FICAgIDogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgRWxlbWVudCBpcyBpZ25vcmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHRoZSBjb250ZW50IG1vZGVsIGlzIGNvbnNpZGVyZWQuCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgbW9zdCB1c2VmdWwgZm9yIGNvZGVhc3Npc3QgcmVsYXRlZCBxdWVyaWVzLgotICoKLSAqICAgICAgLSBWQUxJRElUWV9TVFJJQ1QgIDogVGhlIGN1cnJlbnQgY29udGVudCBvZiB0aGUgRWxlbWVudCBpcyBjb25zaWRlcmVkLgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5zIHRydWUgb25seSBpZiB0aGUgb3BlcmF0aW9uIHByZXNlcnZlcyBjb250ZW50IHZhbGlkaXR5LgotICogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCB3aGVuIERPTSBlZGl0aW5nIG5lZWRzIHRvIGJlIGNvbnN0cmFpbmVkIHRvIG1haW50YWluIHZhbGlkaXR5LgotICoKLSAqICAgICAgLSBWQUxJRElUWV9QQVJUSUFMIDogU29tZSBvcHRpbWl6ZWQgY29tcHJvbWlzZSBiZXR3ZWVuIHRoZSB0d28gb3B0aW9ucyBhYm92ZS4KLSAqCi0gKiAzKSBET00gZWRpdGluZyBhY3Rpb25zICgiV2hhdCBjYW4gSSBkbyBoZXJlPyIpCi0gKiAgICAgIFRoZXNlIG1ldGhvZHMgcmV0dXJuIE1vZGVsUXVlcnlBY3Rpb25zIHRoYXQgYXJlIHJlbGV2YW50IGF0IHNvbWUgc3BlY2lmaWVkIERPTSBOb2RlLgotICogICAgICBUaGUgYWN0aW9ucyBpbmRpY2F0ZSB3aGF0IGtpbmRzIG9mIERPTSBOb2RlIGNhbiBiZSBpbnNlcnRlZCB3aGVyZSAoYXQgd2hhdCBpbmRleCkuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBWQUxJRElUWV9OT05FID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMSURJVFlfUEFSVElBTCA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZBTElESVRZX1NUUklDVCA9IDI7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9BTEwgPSAweEZGOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0FUVFJJQlVURVMgPSAweDAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0NISUxEX05PREVTID0gMHgwMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5DTFVERV9TRVFVRU5DRV9HUk9VUFMgPSAweDA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX1RFWFRfTk9ERVMgPSAweDA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkNMVURFX0VOQ0xPU0lOR19SRVBMQUNFX0FDVElPTlMgPSAweDEwOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfTU9ERV9VTkNPTlNUUkFJTkVEID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRURJVF9NT0RFX0NPTlNUUkFJTkVEX0xFTklFTlQ9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QgPSAyOwotCi0KLSAgdm9pZCBzZXRFZGl0TW9kZShpbnQgZWRpdE1vZGUpOwotCi0gIGludCAgZ2V0RWRpdE1vZGUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgQ01Eb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBET00gTm9kZS4KLSAgICogb3IgbnVsbCBpZiBubyBDTURvY3VtZW50IGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTURvY3VtZW50IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KE5vZGUgbm9kZSk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgQ01Ob2RlIGZvciB0aGUgRE9NIE5vZGUKLSAgICogb3IgbnVsbCBpZiBubyBDTU5vZGUgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTUF0dHJpYnV0ZSBmb3IgdGhlIERPTSBOb2RlCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Ob2RlIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBDTUF0dHJpYnV0ZSBmb3IgdGhlIERPTSBOb2RlCi0gICAqIG9yIG51bGwgaWYgbm8gQ01Ob2RlIGlzIGFwcHJvcHJpYXRlIGZvciB0aGUgRE9NIE5vZGUuCi0gICAqLwotICBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgaXMgdmFsaWQKLSAgICovCi0gIGJvb2xlYW4gaXNDb250ZW50VmFsaWQoRWxlbWVudCBlbGVtZW50KTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgQ01Ob2RlIG9mIHRoZSBwYXJlbnQgZWxlbWVudCdzIGNvbnRlbnQgbW9kZWwKLSAgICogdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgbm9kZQotICAgKi8KLSAgQ01Ob2RlIGdldE9yaWdpbihOb2RlIG5vZGUpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIENNTm9kZXMgb2YgdGhlIHBhcmVudCBlbGVtZW50J3MgY29udGVudCBtb2RlbAotICAgKiB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBub2RlCi0gICAqLwotICBDTU5vZGVbXSBnZXRPcmlnaW5BcnJheShFbGVtZW50IGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBhbGwgQ01Ob2RlICdtZXRhIGRhdGEnIHRoYXQgbWF5IGJlIHBvdGVudGlhbGx5IGFkZGVkIHRvIHRoZSBlbGVtZW50LgotICAgKi8KLSAgTGlzdCBnZXRBdmFpbGFibGVDb250ZW50KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucyk7Ci0KLSAgLyoqCi0gICAqIENhbiBhIERPTSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENNTm9kZSAnbWV0YSBkYXRhJyBiZSBhZGRlZCB0byB0aGUgcGFyZW50Ci0gICAqLwotICBib29sZWFuIGNhbkluc2VydChFbGVtZW50IHBhcmVudCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiBtdWx0aXBsZSBET00gTm9kZXMgY29ycmVzcG9uZGluZyB0byB0aGUgbGlzdCBvZiBDTU5vZGUgJ21ldGEgZGF0YScgYmUgYWRkZWQgdG8gdGhlIHBhcmVudAotICAgKi8KLSAgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIExpc3QgY21Ob2RlTGlzdCwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgRE9NIE5vZGUgYmUgcmVtb3ZlZAotICAgKi8KLSAgYm9vbGVhbiBjYW5SZW1vdmUoTm9kZSBub2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgbGlzdCBvZiBET00gTm9kZXMgYmUgcmVtb3ZlZAotICAgKi8KLSAgYm9vbGVhbiBjYW5SZW1vdmUoTGlzdCBub2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpOwotCi0gIC8qKgotICAgKiBDYW4gdGhlIGNoaWxkcmVuIHdpdGhpbiB0aGUgaW5kaWNhdGVkIGluZGljZXMgYmUgcmVwbGFjZWQgd2l0aCBhIERPTSBOb2RlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIENNTm9kZSAnbWV0YSBkYXRhJwotICAgKi8KLSAgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBDTU5vZGUgY21Ob2RlLCBpbnQgdmFsaWRpdHlDaGVja2luZyk7Ci0KLSAgLyoqCi0gICAqIENhbiB0aGUgY2hpbGRyZW4gd2l0aGluIHRoZSBpbmRpY2F0ZWQgaW5kaWNlcyBiZSByZXBsYWNlZCB3aXRoIG11bHRpcGxlIERPTSBOb2RlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBsaXN0IG9mIENNTm9kZSAnbWV0YSBkYXRhJwotICAgKi8KLSAgYm9vbGVhbiBjYW5SZXBsYWNlKEVsZW1lbnQgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBMaXN0IGNtTm9kZUxpc3QsIGludCB2YWxpZGl0eUNoZWNraW5nKTsKLQotICAvKioKLSAgICoKLSAgICovCi0gIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KTsKLQotICAvKioKLSAgICoKLSAgICovCi0gIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhEb2N1bWVudCBwYXJlbnQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHJlcGxhY2UgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHBhcmVudCdzIGNvbnRlbnQKLSAgICovCi0gIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSBsaXN0IG9mIHJlcGxhY2UgYWN0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgb24gdGhlIHNlbGVjdGVkIGNoaWxkcmVuIG9mIHRoYXQgcGFyZW50IAotICAgKi8KLSAgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIExpc3Qgc2VsZWN0ZWRDaGlsZHJlbiwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogIEBkZXByZWNhdGVkIC0gdXNlIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoKQotICAgKi8KLSAgTGlzdCBnZXREYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZHMgcmV0dXJuIGFuIGFycmF5IG9mIHBvc3NpYmxlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBkYXRhdHlwZSBvZiB0aGUgQ01Ob2RlIChlaXRoZXIgYW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBvciBhIENNRWxlbWVudERlY2xhcmF0aW9uKQotICAgKi8KLSAgU3RyaW5nW10gZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgYSBDTURvY3VtZW50TWFuYWdlciBpcyBub3QgdXNlZCBieSB0aGUgTW9kZWxRdWVyeQotICAgKi8KLSAgQ01Eb2N1bWVudE1hbmFnZXIgZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIHRoZSBNb2RlbFF1ZXJ5IGRvZXNuJ3Qgc3VwcG9ydCB0aGUgdXNlIG9mIGV4dGVuc2lvbnMKLSAgICovCi0gIE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyIGdldEV4dGVuc2lvbk1hbmFnZXIoKTsgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVjYmE3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5QWN0aW9uCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOU0VSVCAgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRU1PVkUgID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVQTEFDRSA9IDQ7Ci0KLSAgcHVibGljIGludCBnZXRLaW5kKCk7Ci0gIC8qKgotICAgKiBpZiBzdGFydCBpbmRleCA9PSAtMSB0aGVuIG5vIGluc2VydCBpcyBwb3NzaWJsZQotICAgKiBpZiBzdGFydCBpbmRleCAhPSAtMSBhbmQgZW5kSW5kZXggPT0gLTEgdGhlbiBhbiBpbnNlcnQgYXQgYW55IHBvc2l0aW9uIGlzIHBvc3NpYmxlCi0gICAqLwotICBwdWJsaWMgaW50IGdldFN0YXJ0SW5kZXgoKTsKLSAgcHVibGljIGludCBnZXRFbmRJbmRleCgpOwotICBwdWJsaWMgTm9kZSBnZXRQYXJlbnQoKTsKLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoKTsKLSAgcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YSgpOwotICBwdWJsaWMgdm9pZCBzZXRVc2VyRGF0YShPYmplY3Qgb2JqZWN0KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmNkMTdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLS8qKgotICogCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgTW9kZWxRdWVyeUNNUHJvdmlkZXIKLXsKLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKTsKLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0Q01EYXRhVHlwZShUZXh0IHRleHQpOyAKLSAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihBdHRyIGF0dHIpOwotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5Q01Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY0NGFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlDTVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1vZGVsUXVlcnlDTVByb3ZpZGVyCi17Ci0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBDTURvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIERPTSBOb2RlLgotICAgKiBvciBudWxsIGlmIG5vIENNRG9jdW1lbnQgaXMgYXBwcm9wcmlhdGUgZm9yIHRoZSBET00gTm9kZS4KLSAgICovCi0gIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeS9leHRlbnNpb24vTW9kZWxRdWVyeUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGI1ODY2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uCi17ICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9TVFJJTkdfQVJSQVkgPSB7fTsKLSAgCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVWYWx1ZXMoRWxlbWVudCBvd25lckVsZW1lbnQsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIEVNUFRZX1NUUklOR19BUlJBWTsKLSAgfQotICAKLSAgcHVibGljIFN0cmluZ1tdIGdldEVsZW1lbnRWYWx1ZXMoTm9kZSBwYXJlbnROb2RlLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkKLSAgewotICAgIHJldHVybiBFTVBUWV9TVFJJTkdfQVJSQVk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBib29sZWFuIGlzQXBwbGljYWJsZUNoaWxkRWxlbWVudChOb2RlIHBhcmVudE5vZGUsIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBuYW1lKQotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5L2V4dGVuc2lvbi9Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhM2E0NmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnkvZXh0ZW5zaW9uL01vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5leHRlbnNpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxRdWVyeUV4dGVuc2lvbk1hbmFnZXIKLXsKLSAgTGlzdCBnZXREYXRhVHlwZVZhbHVlcyhFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgdm9pZCBmaWx0ZXJBdmFpbGFibGVFbGVtZW50Q29udGVudChMaXN0IGF2YWlsYWJsZUNvbnRlbnQsIEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0Jhc2VBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyMWQ0YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyCi17ICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIEJhc2VBc3NvY2lhdGlvblByb3ZpZGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIENNTm9kZSBnZXRDTU5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpCi0gICAgewotICAgICAgY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQXR0cilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01EYXRhVHlwZSgoVGV4dClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBDTURhdGFUeXBlIGdldENNRGF0YVR5cGUoVGV4dCB0ZXh0KQotICB7Ci0gICAgQ01EYXRhVHlwZSByZXN1bHQgPSBudWxsOwotICAgIE5vZGUgcGFyZW50Tm9kZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpOwotICAgIGlmIChwYXJlbnROb2RlICE9IG51bGwgJiYgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpcGFyZW50Tm9kZSk7Ci0gICAgICByZXN1bHQgPSBlZC5nZXREYXRhVHlwZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgewotICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudExvYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzYzMzMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9DTURvY3VtZW50TG9hZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VUYWJsZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudExvYWRlcgoteyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotICBwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXI7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzSW5mZXJyZWRHcmFtbWFyRW5hYmxlZCA9IHRydWU7ICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGU7Ci0gIHByb3RlY3RlZCBpbnQgY291bnQgPSAwOwotICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKGRvY3VtZW50LCBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIpCi0gIHsgICAKLSAgICB0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50TWFuYWdlciA9IGNtRG9jdW1lbnRNYW5hZ2VyOyAgCQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBsb2FkQ01Eb2N1bWVudHMoKQotICB7ICAgICAgICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tbG9hZENNRG9jdW1lbnRzIC0tLS0tLS0tLS0tLSIpOyAgICAgICAgICAKLSAgICAvL2xvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgIAotICAgIGJvb2xlYW4gd2Fsa0RvY3VtZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICAKLSAgICBjbURvY3VtZW50TWFuYWdlci5yZW1vdmVBbGxSZWZlcmVuY2VzKCk7Ci0gICAgICAKLSAgICBTdHJpbmdbXSBkb2N0eXBlSW5mbyA9IFhNTEFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotICAgIGlmIChkb2N0eXBlSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGxvYWQgdGhlIGRvY3R5cGUgaWYgcmVxdWlyZWQKLSAgICAgIHdhbGtEb2N1bWVudCA9IGhhbmRsZUdyYW1tYXIoZG9jdHlwZUluZm9bMF0sIGRvY3R5cGVJbmZvWzFdLCAiRFREIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgRWxlbWVudCBlbGVtZW50ID0gZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpOwotICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBuZXcgQ01Eb2N1bWVudExvYWRpbmdOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7ICAgCi0gICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgICAgIGlmIChuYW1lc3BhY2VUYWJsZS5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpCi0gICAgICAgIHsgICAKLSAgICAgICAgICB3YWxrRG9jdW1lbnQgPSB0cnVlOwotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJpc05hbWVzcGFjZUF3YXJlIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlVGFibGUgPSBudWxsOwotICAgICAgICAgIHdhbGtEb2N1bWVudCA9IGlzSW5mZXJyZWRHcmFtbWFyRW5hYmxlZDsKLSAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiaXMgTk9UIG5hbWVzcGFjZUF3YXJlIik7Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfSAgCi0gICAgfSAKLQotICAgIGlmICh3YWxrRG9jdW1lbnQpCi0gICAgewotICAgICAgdmlzaXROb2RlKGRvY3VtZW50KTsgICAKLSAgICB9IAotCi0gICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBlbGFwc2VkIHRpbWUgKCIgKyBjb3VudCArICIpID0gIiArIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHRpbWUpKTsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gaGFuZGxlR3JhbW1hcihTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsgICAgICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgCi0gICAgaW50IHN0YXR1cyA9IGNtRG9jdW1lbnRNYW5hZ2VyLmdldENNRG9jdW1lbnRTdGF0dXMocHVibGljSWQpOwotICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEKQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnRNYW5hZ2VyLmFkZENNRG9jdW1lbnRSZWZlcmVuY2UocHVibGljSWQsIHN5c3RlbUlkLCB0eXBlKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBlbHNlIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19FUlJPUikKLSAgICB7Ci0gICAgICByZXN1bHQgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotICAgIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAKLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7Ci0gIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudE5TKEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgdmlzaXRDaGlsZE5vZGVzKGVsZW1lbnQpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgIGlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBjb3VudCsrOyAgICAgICAKLQotICAgICAgRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsgICAgCi0gICAgICBpZiAobmFtZXNwYWNlVGFibGUgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaGFuZGxlRWxlbWVudChlbGVtZW50KTsgCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGhhbmRsZUVsZW1lbnROUyhlbGVtZW50KTsKLSAgICAgIH0gICAgICAgICAgICAKLSAgICB9Ci0gICAgZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKQotICAgIHsKLSAgICAgIHZpc2l0Q2hpbGROb2Rlcyhub2RlKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q2hpbGROb2RlcyhOb2RlIG5vZGUpCi0gIHsgICAKLQkgIGZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIAotICAgIHsKLQkgICAgdmlzaXROb2RlKGNoaWxkKTsKLSAgICB9Ci0JfSAgICAgICAgICAgICAKLQotCi0gIHByb3RlY3RlZCBjbGFzcyBDTURvY3VtZW50TG9hZGluZ05hbWVzcGFjZVRhYmxlIGV4dGVuZHMgTmFtZXNwYWNlVGFibGUKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBuZXdOYW1lc3BhY2VMaXN0OwotCi0gICAgcHVibGljIENNRG9jdW1lbnRMb2FkaW5nTmFtZXNwYWNlVGFibGUoRG9jdW1lbnQgZG9jdW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHN1cGVyKGRvY3VtZW50KTsgICAgIAotICAgIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgYWRkRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIG5ld05hbWVzcGFjZUxpc3QgPSBudWxsOwotICAgICAgc3VwZXIuYWRkRWxlbWVudChlbGVtZW50KTsgIAotICAgICAgaWYgKG5ld05hbWVzcGFjZUxpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gbmV3TmFtZXNwYWNlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgICAgaGFuZGxlR3JhbW1hcihpbmZvLnVyaSwgaW5mby5sb2NhdGlvbkhpbnQsICJYU0QiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgCi0gICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhTdHJpbmcga2V5LCBOYW1lc3BhY2VJbmZvIGluZm8pCi0gICAgewotICAgICAgc3VwZXIuaW50ZXJuYWxBZGROYW1lc3BhY2VJbmZvKGtleSwgaW5mbyk7ICAgICAgICAgICAKLSAgICAgIGlmIChuZXdOYW1lc3BhY2VMaXN0ID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5ld05hbWVzcGFjZUxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB9Ci0gICAgICBuZXdOYW1lc3BhY2VMaXN0LmFkZChpbmZvKTsgICAgCi0gICAgfSAgICAgICAgICAgICAgICAgICAgIAotICB9Ci0KLSAgCi0gIHByb3RlY3RlZCBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgRWxlbWVudCByZXN1bHQgPSBudWxsOwotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudE1hbmFnZXJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhOWRjMWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRNYW5hZ2VySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5Db250ZW50TW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uVXRpbGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIENNRG9jdW1lbnRNYW5hZ2VySW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRNYW5hZ2VyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGU7Ci0gIHByb3RlY3RlZCBDTURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIgY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgVmVjdG9yKCk7IAotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHByb3BlcnR5VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIHByb3RlY3RlZCBIYXNodGFibGUgcHVibGljSWRUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICAgICAgIAotICBwdWJsaWMgQ01Eb2N1bWVudE1hbmFnZXJJbXBsKENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGUsIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlciBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5jbURvY3VtZW50Q2FjaGUgPSBjbURvY3VtZW50Q2FjaGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMuY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyID0gY21Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotICAgIHNldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9BVVRPX0xPQUQsIHRydWUpOwotICAgIHNldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSwgZmFsc2UpOwotICB9ICAgICAgICAgCi0KLSAgICAgICAKLSAgcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKQotICB7Ci0gICAgcmV0dXJuIGNtRG9jdW1lbnRDYWNoZTsKLSAgfQotCi0gCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lLCBib29sZWFuIHZhbHVlKQotICB7Ci0gICAgcHJvcGVydHlUYWJsZS5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0ZW5lckxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyID0gKENNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpaS5uZXh0KCk7Ci0gICAgICBsaXN0ZW5lci5wcm9wZXJ0eUNoYW5nZWQodGhpcywgcHJvcGVydHlOYW1lKTsKLSAgICB9Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAgICAgCi0gIHB1YmxpYyBib29sZWFuIGdldFByb3BlcnR5RW5hYmxlZChTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgT2JqZWN0IG9iamVjdCA9IHByb3BlcnR5VGFibGUuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIG9iamVjdC5lcXVhbHMoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LmFkZChsaXN0ZW5lcik7Ci0gICAgY21Eb2N1bWVudENhY2hlLmFkZExpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciBsaXN0ZW5lcikKLSAgewotICAgIGxpc3RlbmVyTGlzdC5yZW1vdmUobGlzdGVuZXIpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAgCi0gICAgICAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9va3VwUmVzb2x2ZWRVUkkoU3RyaW5nIHB1YmxpY0lkKQotICB7Ci0gICAgU3RyaW5nIGtleSA9IHB1YmxpY0lkICE9IG51bGwgPyBwdWJsaWNJZCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChTdHJpbmcpcHVibGljSWRUYWJsZS5nZXQoa2V5KTsKLSAgfQotICAgIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgbG9va3VwT3JDcmVhdGVSZXNvbHZlZFVSSShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkKLSAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsgICAgICAgICAgICAgICAgICAKLQotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKGdldFByb3BlcnR5RW5hYmxlZChQUk9QRVJUWV9VU0VfQ0FDSEVEX1JFU09MVkVEX1VSSSkpCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSAoU3RyaW5nKXB1YmxpY0lkVGFibGUuZ2V0KGtleSk7Ci0gICAgfSAgIAotCi0gICAgaWYgKHJlc29sdmVkVVJJID09IG51bGwpCi0gICAgewotICAgICAgcmVzb2x2ZWRVUkkgPSBjbURvY3VtZW50UmVmZXJlbmNlUHJvdmlkZXIucmVzb2x2ZUdyYW1tYXJVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICAgIGlmIChyZXNvbHZlZFVSSSA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXNvbHZlZFVSSSA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBwdWJsaWNJZFRhYmxlLnB1dChrZXksIHJlc29sdmVkVVJJKTsgICAgIAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgIAotICAKLSAgICByZXR1cm4gcmVzb2x2ZWRVUkk7Ci0gIH0KLQotCi0gIHB1YmxpYyBpbnQgZ2V0Q01Eb2N1bWVudFN0YXR1cyhTdHJpbmcgcHVibGljSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaW50IHN0YXR1cyA9IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRDsgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbG9va3VwUmVzb2x2ZWRVUkkocHVibGljSWQpOwotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLSAgfSAgICAKLSAgICAgICAgICAgICAgCi0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChTdHJpbmcgcHVibGljSWQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gY21Eb2N1bWVudENhY2hlLmdldENNRG9jdW1lbnQocmVzb2x2ZWRVUkkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotICAKLQotICAvKiAobm9uLUphdmFkb2MpCi0gKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlciNnZXRDTURvY3VtZW50KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gKi8KLXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsKLQotICAgIGlmIChnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVVUT19MT0FEKSkKLSAgICB7Ci0gICAgICByZXNvbHZlZFVSSSA9IGxvb2t1cE9yQ3JlYXRlUmVzb2x2ZWRVUkkocHVibGljSWQsIHN5c3RlbUlkKTsKLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXNvbHZlZFVSSSA9IGxvb2t1cFJlc29sdmVkVVJJKHB1YmxpY0lkKTsKLSAgICB9IAotCi0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50Q2FjaGUuZ2V0U3RhdHVzKHJlc29sdmVkVVJJKTsKLSAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FERUQpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBjbURvY3VtZW50ID0gY21Eb2N1bWVudENhY2hlLmdldENNRG9jdW1lbnQocmVzb2x2ZWRVUkkpOwotICAgICAgfSAgIAotICAgICAgZWxzZSBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRCkKLSAgICAgIHsgICAgIAotICAgICAgICBpZiAoZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FVVE9fTE9BRCkpCi0gICAgICAgIHsKLSAgICAgICAgICBjbURvY3VtZW50ID0gbG9hZENNRG9jdW1lbnQocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlLCBnZXRQcm9wZXJ0eUVuYWJsZWQoUFJPUEVSVFlfQVNZTkNfTE9BRCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjbURvY3VtZW50OyAgIAotICB9IAotICAKLSAgcHVibGljIHZvaWQgYWRkQ01Eb2N1bWVudFJlZmVyZW5jZShTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSBsb29rdXBPckNyZWF0ZVJlc29sdmVkVVJJKHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0gICAgaWYgKHJlc29sdmVkVVJJICE9IG51bGwgJiYgcmVzb2x2ZWRVUkkubGVuZ3RoKCkgPiAwKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpbnQgc3RhdHVzID0gY21Eb2N1bWVudENhY2hlLmdldFN0YXR1cyhyZXNvbHZlZFVSSSk7Ci0gICAgICBpZiAoc3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTk9UX0xPQURFRCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGxvYWRDTURvY3VtZW50KHB1YmxpY0lkLCByZXNvbHZlZFVSSSwgdHlwZSwgZ2V0UHJvcGVydHlFbmFibGVkKFBST1BFUlRZX0FTWU5DX0xPQUQpKTsKLSAgICAgIH0gICAgICAgICAKLSAgICB9IAotICB9Ci0gICAgIAotCi0gIHB1YmxpYyB2b2lkIGFkZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyByZXNvbHZlZFVSSSwgU3RyaW5nIHR5cGUsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgewotICAgIFN0cmluZyBrZXkgPSBwdWJsaWNJZCAhPSBudWxsID8gcHVibGljSWQgOiAiIjsgLy8kTk9OLU5MUy0xJAotICAgIHB1YmxpY0lkVGFibGUucHV0KGtleSwgcmVzb2x2ZWRVUkkpOwotICAgIGNtRG9jdW1lbnRDYWNoZS5wdXRDTURvY3VtZW50KHJlc29sdmVkVVJJLCBjbURvY3VtZW50KTsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgbG9hZENNRG9jdW1lbnQoZmluYWwgU3RyaW5nIHB1YmxpY0lkLCBmaW5hbCBTdHJpbmcgcmVzb2x2ZWRVUkksIGZpbmFsIFN0cmluZyB0eXBlLCBib29sZWFuIGFzeW5jKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJhYm91dCB0byBidWlsZCBDTURvY3VtZW50KCIgKyBwdWJsaWNJZCArICIsICIgKyB1bnJlc29sdmVkVVJJICsgIiA9ICIgKyByZXNvbHZlZFVSSSArICIpIik7Ci0gICAgaWYgKGFzeW5jKQotICAgIHsgICAgIAotICAgICAgY21Eb2N1bWVudENhY2hlLnNldFN0YXR1cyhyZXNvbHZlZFVSSSwgQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FESU5HKTsKLSAgICAgIC8vVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQobmV3IEFzeW5jQnVpbGRPcGVyYXRpb24ocHVibGljSWQsIHJlc29sdmVkVVJJLCB0eXBlKSk7Ci0gICAgICAvL3RocmVhZC5zdGFydCgpOwotICAgICAgSm9iIGpvYiA9IG5ldyBKb2IoWE1MQ29yZU1lc3NhZ2VzLmxvYWRpbmcgKyByZXNvbHZlZFVSSSkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYmVsb25nc1RvKE9iamVjdCBmYW1pbHkpCi0gICAgICAgIHsKLSAgICAgICAgICBib29sZWFuIHJlc3VsdCA9IChmYW1pbHkgPT0gQ01Eb2N1bWVudE1hbmFnZXIuY2xhc3MpOwotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByb3RlY3RlZCBJU3RhdHVzIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgIAkgIGJ1aWxkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAJICBMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIGpvYi5zY2hlZHVsZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgeyAgICAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IGJ1aWxkQ01Eb2N1bWVudChwdWJsaWNJZCwgcmVzb2x2ZWRVUkksIHR5cGUpOwotICAgIH0gICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotICAgIAotCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ01Eb2N1bWVudCBidWlsZENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgcmVzb2x2ZWRVUkksIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGNtRG9jdW1lbnRDYWNoZS5zZXRTdGF0dXMocmVzb2x2ZWRVUkksIENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BRElORyk7Ci0gIAotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsgICAgICAgICAKLSAgICBpbnQgeCA9IDE7Ci0gICAgeCsrOwotICAgIGlmIChyZXNvbHZlZFVSSSAhPSBudWxsICYmIHJlc29sdmVkVVJJLmxlbmd0aCgpID4gMCkKLSAgICB7Ci0gICAgICAvLyBUT0RPLi4uIHBhc3MgdGhlIFRZUEUgdGhydSB0byB0aGUgQ01Eb2N1bWVudEJ1aWxkZXIKLSAgICAgIHJlc3VsdCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KHJlc29sdmVkVVJJLCB0eXBlKTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCAhPSBudWxsKQotICAgIHsgCi0gICAgICAvLyBsb2FkIHRoZSBhbm5vdGF0aW9uIGZpbGVzIGZvciB0aGUgZG9jdW1lbnQgCi0gICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkKLSAgICAgIHsgICAgCi0gICAgICAgIEFubm90YXRpb25VdGlsaXR5LmxvYWRBbm5vdGF0aW9uc0ZvckdyYW1tYXIocHVibGljSWQsIHJlc3VsdCk7Ci0gICAgICB9Ci0gICAgICBjbURvY3VtZW50Q2FjaGUucHV0Q01Eb2N1bWVudChyZXNvbHZlZFVSSSwgcmVzdWx0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnRDYWNoZS5zZXRTdGF0dXMocmVzb2x2ZWRVUkksIENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9IAotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUFsbFJlZmVyZW5jZXMoKQotICB7Ci0gICAgLy8gVE9ETy4uLiBpbml0aWF0ZSBhIHRpbWVkIHJlbGVhc2Ugb2YgdGhlIGVudHJpZXMgaW4gdGhlIENNRG9jdW1lbnRDYWNoZQotICAgIHB1YmxpY0lkVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gIH0KLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0NNRG9jdW1lbnRSZWZlcmVuY2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyYjhhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50UmVmZXJlbmNlOwotCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50UmVmZXJlbmNlCi17ICAgICAgICAgICAgICAKLSAgcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JZDsKLSAgcHJvdGVjdGVkIFN0cmluZyBwdWJsaWNJZDsKLQotICBwdWJsaWMgQ01Eb2N1bWVudFJlZmVyZW5jZUltcGwoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICB0aGlzLnB1YmxpY0lkID0gcHVibGljSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5zeXN0ZW1JZCA9IHN5c3RlbUlkOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBwdWJsaWNJZDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gc3lzdGVtSWQ7Ci0gIH0gICAgICAKLSAgCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuICJbIiArIHB1YmxpY0lkICsgIiwgIiArIHN5c3RlbUlkICsgIl0iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwYTQ2MzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL0luZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuaW50ZXJuYWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlciBleHRlbmRzIENNRG9jdW1lbnRMb2FkZXIKLXsgICAgIAotICBwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbjsKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnQgaW5mZXJyZWRDTURvY3VtZW50OwotICBwcm90ZWN0ZWQgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5OwotICBwcm90ZWN0ZWQgSGFzaHRhYmxlIGNyZWF0ZWRDTURvY3VtZW50VGFibGU7Ci0KLSAgcHVibGljIEluZmVycmVkR3JhbW1hckJ1aWxkaW5nQ01Eb2N1bWVudExvYWRlcihEb2N1bWVudCBkb2N1bWVudCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzKGRvY3VtZW50LCBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkpOwotICB9Ci0gIAotICBwdWJsaWMgSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyKERvY3VtZW50IGRvY3VtZW50LCBDTURvY3VtZW50TWFuYWdlciBjbURvY3VtZW50TWFuYWdlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgc3VwZXIoZG9jdW1lbnQsIGNtRG9jdW1lbnRNYW5hZ2VyKTsKLSAgICBjcmVhdGVkQ01Eb2N1bWVudFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgICAgICAgICAgICAKLSAgICBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5ID0gbmV3IEluZmVycmVkR3JhbW1hckZhY3RvcnkoKTsKLSAgfSAgICAgCi0KLSAgICAgCi0gIHB1YmxpYyB2b2lkIGxvYWRDTURvY3VtZW50cygpCi0gIHsgICAKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLWxvYWRDTURvY3VtZW50cyAtLS0tLS0tLS0tLS0iKTsgICAgICAgICAgCi0gICAgaWYgKGluZmVycmVkR3JhbW1hckZhY3RvcnkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvL2xvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAgICAgc3VwZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0gICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiLS0tIGVsYXBzZWQgdGltZSAoIiArIGNvdW50ICsgIikgPSAiICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gdGltZSkpOwotICAgICAgLy9pbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmRlYnVnUHJpbnQoY3JlYXRlZENNRG9jdW1lbnRUYWJsZS52YWx1ZXMoKSk7Ci0gICAgfQotICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgaGFuZGxlRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgICAgICAgICAgICAgCi0gICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgIHsgICAgIAotICAgICAgU3RyaW5nIGNhY2hlS2V5ID0gImluZmVycmVkLWRvY3VtZW50IjsgICAgICAgICAgICAgICAgICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCgiIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgY21Eb2N1bWVudE1hbmFnZXIuYWRkQ01Eb2N1bWVudCgiIiwgIiIsIGNhY2hlS2V5LCAiRFREIiwgaW5mZXJyZWRDTURvY3VtZW50KTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIGNyZWF0ZWRDTURvY3VtZW50VGFibGUucHV0KGNhY2hlS2V5LCBpbmZlcnJlZENNRG9jdW1lbnQpOwotICAgIH0gCi0KLSAgICBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uID0gaW5mZXJyZWRHcmFtbWFyRmFjdG9yeS5jcmVhdGVDTUVsZW1lbnREZWNsYXJhdGlvbihpbmZlcnJlZENNRG9jdW1lbnQsIGVsZW1lbnQsIGZhbHNlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAKLSAgICBpZiAocGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Db250ZW50KGluZmVycmVkQ01Eb2N1bWVudCwgcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiwgaW5mZXJyZWRDTURvY3VtZW50LCBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBmYWxzZSwgbnVsbCk7Ci0gICAgfSAgICAgCi0gICAgICAgCi0KLSAgICB2aXNpdENoaWxkTm9kZXMoZWxlbWVudCk7ICAgCi0gICAgICAgICAgIAotICAgIC8vIHJlc2V0IHRoZSAnY3VycmVudCcgc3RhdGUgdG8gaW5pdGFsIHZhbHVlcwotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICB9Ci0gIAotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZUVsZW1lbnROUyhFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIENNRG9jdW1lbnQgcGFyZW50SW5mZXJyZWRDTURvY3VtZW50ID0gaW5mZXJyZWRDTURvY3VtZW50OwotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uOwotICAgICAgICAKLSAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBudWxsOwotCi0gICAgLy8gYnkgYWRkaW5nIHRoZSBlbGVtZW50IHRvIHRoZSBuYW1lc3BhY2VUYWJsZSwgaGFuZGxlR3JhbW1hcigpIHdpbGwgZ2V0IGNhbGxlZCBmb3IgYW55IHNjaGVtYSByZWZlcmVuY2VzCi0gICAgaWYgKGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpICE9IGRvY3VtZW50KQotICAgIHsKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnQoZWxlbWVudCk7Ci0gICAgfQotCi0gICAgU3RyaW5nIHByZWZpeCA9IGVsZW1lbnQuZ2V0UHJlZml4KCk7Ci0gICAgU3RyaW5nIHVyaSA9IG5hbWVzcGFjZVRhYmxlLmdldFVSSUZvclByZWZpeChwcmVmaXgpOwotCi0gICAgaWYgKHVyaSA9PSBudWxsICYmIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpID09IGRvY3VtZW50KQotICAgIHsKLSAgICAgIC8vIHdoZW4gdGhpcyBpcyB0aGUgcm9vdCBlbGVtZW50Ci0gICAgICAvLyB3ZSBuZWVkIHRvIGFkZCBhbiBpbXBsaWVkICJubyBuYW1lc3BhY2Ugc2NoZW1hIGxvY2F0aW9uIgotICAgICAgdXJpID0gIm9tbWl0dGVkLW5hbWVzcGFjZSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZE5hbWVzcGFjZUluZm8ocHJlZml4LCB1cmksICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gIAotCi0gICAgLy8gaGVyZSdzIHdoZXJlIHdlIHVwZGF0ZSB0aGUgaW5mZXJyZWQgZ3JhbW1hciBpZiByZXF1aXJlZAotICAgIC8vIAotICAgIGJvb2xlYW4gY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24gPSB0cnVlOwotICAgICAgICAgIAotICAgIGJvb2xlYW4gaXNMb2NhbCA9ICh1cmkgPT0gbnVsbCAmJiBwcmVmaXggPT0gbnVsbCk7ICAgICAgICAgCi0gICAgaWYgKGlzTG9jYWwpCi0gICAgeyAgICAgICAgICAKLSAgICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRG9jdW1lbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgLy8gdGhpcyBpcyBhIGxvY2FsIGVsZW1lbnQuLi4gYW5kIHRoZSBwYXJlbnQgaXMgbm90IGluZmVycmVkIChlLmcpIGl0IGhhcyBhIGtub3duIGdyYW1tYXIKLSAgICAgICAgLy8gc28gd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiBmb3IgdGhpcyBlbGVtZW50Ci0gICAgICAgIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uID0gZmFsc2U7IAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHVyaSA9ICJvbW1pdHRlZC1uYW1lc3BhY2UiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24pCi0gICAgeyAgICAgICAgICAgIAotICAgICAgaWYgKGlzTG9jYWwpCi0gICAgICB7Ci0gICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IHBhcmVudEluZmVycmVkQ01Eb2N1bWVudDsKLSAgICAgICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01FbGVtZW50RGVjbGFyYXRpb24oaW5mZXJyZWRDTURvY3VtZW50LCBlbGVtZW50LCB0cnVlKTsgICAgICAgCi0gICAgICB9ICAgICAgICAgIAotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBib29sZWFuIGNyZWF0ZUNNRG9jdW1lbnQgPSBmYWxzZTsKLQotICAgICAgICBTdHJpbmcgY2FjaGVLZXkgPSAiaW5mZXJyZWQtZG9jdW1lbnQiICsgdXJpOyAgLy8kTk9OLU5MUy0xJAotICAgICAgICBpbmZlcnJlZENNRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljcmVhdGVkQ01Eb2N1bWVudFRhYmxlLmdldChjYWNoZUtleSk7Ci0KLSAgICAgICAgaWYgKGluZmVycmVkQ01Eb2N1bWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gd2UgZG9uJ3QgaGF2ZSBhbiBpbmZlcnJlZCBkb2N1bWVudCBmb3IgdGhpcyB1cmkgeWV0Li4uIGxldCdzIHNlZSBvZiB3ZSBuZWVkIG9uZQotICAgICAgICAgIGludCBzdGF0dXMgPSBjbURvY3VtZW50TWFuYWdlci5nZXRDTURvY3VtZW50U3RhdHVzKHVyaSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChzdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19OT1RfTE9BREVEIHx8IHN0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIC8vIHRoZSBjYWNoZSBkb2VzIG5vdCBjb250YWluIGEgJ3Byb3BlcicgQ01Eb2N1bWVudCBmb3IgdGhpcyB1cmkKLSAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY3JlYXRlIGFuIGluZmVycmVkIG9uZQotICAgICAgICAgICAgY3JlYXRlQ01Eb2N1bWVudCA9IHRydWU7Ci0gICAgICAgICAgfSAKLSAgICAgICAgfSAKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNyZWF0ZUNNRG9jdW1lbnQpCi0gICAgICAgIHsgICAgICAgICAgIAotICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJlbmNvdW50ZXJlZCBlbGVtZW50IHsiICsgZWxlbWVudC5nZXROb2RlTmFtZSgpICsgIn0gLi4uIGNyZWF0aW5nIGluZmVycmVkIENNRG9jdW1lbnQgZm9yICIgKyB1cmkpOwotICAgICAgICAgIGluZmVycmVkQ01Eb2N1bWVudCA9IGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Eb2N1bWVudCh1cmkpOwotICAgICAgICAgIGNtRG9jdW1lbnRNYW5hZ2VyLmFkZENNRG9jdW1lbnQodXJpLCAiIiwgY2FjaGVLZXksICJYU0QiLCBpbmZlcnJlZENNRG9jdW1lbnQpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICBjcmVhdGVkQ01Eb2N1bWVudFRhYmxlLnB1dChjYWNoZUtleSwgaW5mZXJyZWRDTURvY3VtZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbmZlcnJlZENNRG9jdW1lbnQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb24gPSBpbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKGluZmVycmVkQ01Eb2N1bWVudCwgZWxlbWVudCwgZmFsc2UpOwotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgIGlmIChwYXJlbnRJbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGluZmVycmVkR3JhbW1hckZhY3RvcnkuY3JlYXRlQ01Db250ZW50KHBhcmVudEluZmVycmVkQ01Eb2N1bWVudCwgcGFyZW50SW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiwgaW5mZXJyZWRDTURvY3VtZW50LCBpbmZlcnJlZENNRWxlbWVudERlY2xhcmF0aW9uLCBpc0xvY2FsLCB1cmkpOwotICAgICAgfSAKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgICAgICAgCi0gICAgdmlzaXRDaGlsZE5vZGVzKGVsZW1lbnQpOwotICAgICAgCi0gICAgLy8gcmVzZXQgdGhlICdjdXJyZW50JyBzdGF0ZSB0byBpbml0YWwgdmFsdWVzCi0gICAgaW5mZXJyZWRDTUVsZW1lbnREZWNsYXJhdGlvbiA9IHBhcmVudEluZmVycmVkQ01FbGVtZW50RGVjbGFyYXRpb247Ci0gICAgaW5mZXJyZWRDTURvY3VtZW50ID0gcGFyZW50SW5mZXJyZWRDTURvY3VtZW50OwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9Nb2RlbFF1ZXJ5QWN0aW9uSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0OTE0ZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlBY3Rpb25IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuQ01WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyCi17Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5SW1wbCBtb2RlbFF1ZXJ5OwotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgQWN0aW9uIGltcGxlbWVudHMgTW9kZWxRdWVyeUFjdGlvbgotICB7Ci0gICAgcHVibGljIGludCBraW5kOwotICAgIHB1YmxpYyBpbnQgc3RhcnRJbmRleDsKLSAgICBwdWJsaWMgaW50IGVuZEluZGV4OwotICAgIHB1YmxpYyBOb2RlIHBhcmVudDsKLSAgICBwdWJsaWMgQ01Ob2RlIGNtTm9kZTsKLSAgICBwdWJsaWMgT2JqZWN0IHVzZXJEYXRhOwotCi0gICAgcHVibGljIEFjdGlvbihpbnQga2luZCwgTm9kZSBwYXJlbnQsIENNTm9kZSBjbU5vZGUpCi0gICAgewotICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIEFjdGlvbihpbnQga2luZCwgTm9kZSBwYXJlbnQsIENNTm9kZSBjbU5vZGUsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpCi0gICAgewotICAgICAgdGhpcy5raW5kID0ga2luZDsKLSAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwotICAgICAgdGhpcy5jbU5vZGUgPSBjbU5vZGU7Ci0gICAgICB0aGlzLnN0YXJ0SW5kZXggPSBzdGFydEluZGV4OwotICAgICAgdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4OwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0S2luZCgpCi0gICAgewotICAgICAgcmV0dXJuIGtpbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTdGFydEluZGV4KCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3RhcnRJbmRleDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldEVuZEluZGV4KCkKLSAgICB7Ci0gICAgICByZXR1cm4gZW5kSW5kZXg7Ci0gICAgfQotCi0gICAgcHVibGljIE5vZGUgZ2V0UGFyZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gcGFyZW50OwotICAgIH0KLQotICAgIHB1YmxpYyBDTU5vZGUgZ2V0Q01Ob2RlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gY21Ob2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoKQotICAgIHsKLSAgICAgIHJldHVybiB1c2VyRGF0YTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VyRGF0YShPYmplY3Qgb2JqZWN0KQotICAgIHsKLSAgICAgIHVzZXJEYXRhID0gb2JqZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHBlcmZvcm1BY3Rpb24oKQotICAgIHsKLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKE1vZGVsUXVlcnlJbXBsIG1vZGVsUXVlcnkpCi0gIHsKLSAgICB0aGlzLm1vZGVsUXVlcnkgPSBtb2RlbFF1ZXJ5OwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBnZXRBbGxBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICB9Ci0KLQotICAvLyBpbnNlcnQgYWN0aW9ucwotICAvLwotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluZGV4LCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMpICE9IDApCi0gICAgewotICAgICAgZ2V0SW5zZXJ0QXR0cmlidXRlQWN0aW9ucyhwYXJlbnQsIGVkLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgICB9Ci0gICAgaW5jbHVkZU9wdGlvbnMgJj0gfk1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTOwotICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMpICE9IDApCi0gICAgewotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25zQXRJbmRleChwYXJlbnQsIGVkLCBpbmRleCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25zKHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25MaXN0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgZ2V0SW5zZXJ0QXR0cmlidXRlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICAvLyBnZXQgYWN0aW9ucyBmb3IgZWFjaCBpbnNlcnRhYmxlIGF0dHJpYnV0ZQotICAgIC8vCi0gICAgTGlzdCBhdmFpbGFibGVBdHRyaWJ1dGVMaXN0ID0gbW9kZWxRdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KHBhcmVudCwgZWQsIE1vZGVsUXVlcnkuSU5DTFVERV9BVFRSSUJVVEVTKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGF2YWlsYWJsZUF0dHJpYnV0ZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICBpZiAobW9kZWxRdWVyeS5jYW5JbnNlcnQocGFyZW50LCBlZCwgYWQsIDAsIHZhbGlkaXR5Q2hlY2tpbmcpKQotICAgICAgewotICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgcGFyZW50LCBhZCk7Ci0gICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25zQXRJbmRleChFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAvLyBnZXQgYWN0aW9ucyBmb3IgZWFjaCBpbnNlcnRhYmxlIGF0dHJpYnV0ZQotICAgIC8vCi0gICAgaW50IHNpemUgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpOwotICAgIGlmIChpbmRleCA8PSBzaXplKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gbW9kZWxRdWVyeS5nZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50LCBlZCk7IAotICAgICAgTGlzdCBhdmFpbGFibGVDaGlsZE5vZGVMaXN0ID0gbW9kZWxRdWVyeS5nZXRBdmFpbGFibGVDb250ZW50KHBhcmVudCwgZWQsIGluY2x1ZGVPcHRpb25zKTsKLQotICAgICAgYm9vbGVhbiBpc1NpbXBsZUNob2ljZSA9IGlzU2ltcGxlQ2hvaWNlR3JvdXBDb250ZW50TW9kZWwoZWQpOwotICAgICAKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGF2YWlsYWJsZUNoaWxkTm9kZUxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGNtTm9kZSA9IChDTU5vZGUpaS5uZXh0KCk7ICAgICAgCi0gICAgICAgIGlmIChpc1NpbXBsZUNob2ljZSB8fCBtb2RlbFF1ZXJ5LmNhbkluc2VydChwYXJlbnQsIGVkLCBjbU5vZGUsIGluZGV4LCB2YWxpZGl0eUNoZWNraW5nLCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QpKQotICAgICAgICB7Ci0gICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQsIHBhcmVudCwgY21Ob2RlLCBpbmRleCwgaW5kZXgpOwotICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgIAotIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1NpbXBsZUNob2ljZUdyb3VwQ29udGVudE1vZGVsKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7ICAgICAgIAotICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0gICAgQ01Ob2RlIGNtTm9kZSA9IGVkLmdldENvbnRlbnQoKTsKLSAgICBpZiAoY21Ob2RlICE9IG51bGwgJiYgY21Ob2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQKQotICAgIHsKLSAgICAgIENNR3JvdXAgY21Hcm91cCA9IChDTUdyb3VwKWNtTm9kZTsKLSAgICAgIGlmIChjbUdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UgJiYgY21Hcm91cC5nZXRNYXhPY2N1cigpID09IC0xKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgICAgQ01Ob2RlTGlzdCBsaXN0ID0gY21Hcm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSBsaXN0LmdldExlbmd0aCgpIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAobGlzdC5pdGVtKGkpLmdldE5vZGVUeXBlKCkgIT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIGludCBzaXplID0gcGFyZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsKLSAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IG1vZGVsUXVlcnkuZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudCwgZWQpOwotICAgIExpc3QgYXZhaWxhYmxlQ2hpbGROb2RlTGlzdCA9IG1vZGVsUXVlcnkuZ2V0QXZhaWxhYmxlQ29udGVudChwYXJlbnQsIGVkLCBpbmNsdWRlT3B0aW9ucyk7Ci0KLSAgICBib29sZWFuIGlzU2ltcGxlQ2hvaWNlID0gaXNTaW1wbGVDaG9pY2VHcm91cENvbnRlbnRNb2RlbChlZCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gYXZhaWxhYmxlQ2hpbGROb2RlTGlzdC5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTU5vZGUgY21Ob2RlID0gKENNTm9kZSlpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmb3IgKGludCBpID0gc2l6ZTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIGlmIChpc1NpbXBsZUNob2ljZSB8fCBtb2RlbFF1ZXJ5LmNhbkluc2VydChwYXJlbnQsIGVkLCBjbU5vZGUsIGksIHZhbGlkaXR5Q2hlY2tpbmcsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCkpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgcGFyZW50LCBjbU5vZGUsIGksIGkpOwotICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKERvY3VtZW50IHBhcmVudCwgQ01Eb2N1bWVudCBjbURvY3VtZW50LCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIC8vIGdldCB0aGUgcm9vdCBlbGVtZW50IGFuZCBkb2N0eXBlIGluZGV4IChpZiBhbnkpCi0gICAgLy8KLSAgICBpbnQgZG9jdHlwZUluZGV4ID0gLTE7Ci0gICAgRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBudWxsOwotICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgaWYgKGNoaWxkTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICByb290RWxlbWVudCA9IChFbGVtZW50KWNoaWxkTm9kZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgZG9jdHlwZSA9IChEb2N1bWVudFR5cGUpY2hpbGROb2RlOwotICAgICAgICBkb2N0eXBlSW5kZXggPSBpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHJvb3QgZWxlbWVudHMgYXJlIG9ubHkgYWRkZWQgYWZ0ZXIgdGhlIGRvY3R5cGUgKGlmIGFueSkKLSAgICBpZiAocm9vdEVsZW1lbnQgPT0gbnVsbCAmJiBpbmRleCA+IGRvY3R5cGVJbmRleCkKLSAgICB7Ci0gICAgICBDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgICBpbnQgbWFwTGVuZ3RoID0gbWFwLmdldExlbmd0aCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBMZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgQ01Ob2RlIGNtTm9kZSA9IG1hcC5pdGVtKGkpOwotCi0gICAgICAgIGJvb2xlYW4gY2FuQWRkID0gdHJ1ZTsKLSAgICAgICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gTW9kZWxRdWVyeS5WQUxJRElUWV9TVFJJQ1QpCi0gICAgICAgIHsKLSAgICAgICAgICBjYW5BZGQgPSBkb2N0eXBlID09IG51bGwgfHwgZG9jdHlwZS5nZXROYW1lKCkuZXF1YWxzKGNtTm9kZS5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjYW5BZGQpCi0gICAgICAgIHsKLSAgICAgICAgICBBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbihNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCwgcGFyZW50LCBjbU5vZGUsIGluZGV4LCBpbmRleCk7Ci0gICAgICAgICAgYWN0aW9uTGlzdC5hZGQoYWN0aW9uKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25UYWJsZShFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCB2YWxpZGl0eUNoZWNraW5nLCBIYXNodGFibGUgYWN0aW9uVGFibGUpCi0gIHsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5jbHVkZU9wdGlvbnMsIGludCB2YWxpZGl0eUNoZWNraW5nLCBMaXN0IGFjdGlvbkxpc3QpCi0gIHsKLSAgICBDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSA9IG1vZGVsUXVlcnkuZ2V0VmFsaWRhdG9yKCkuZ2V0TWF0Y2hNb2RlbChlZCwgcGFyZW50KTsKLSAgICBpZiAobWF0Y2hNb2RlbE5vZGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBNYXRjaE1vZGVsVmlzaXRvciB2aXNpdG9yID0gbmV3IE1hdGNoTW9kZWxWaXNpdG9yKHBhcmVudCwgYWN0aW9uTGlzdCk7Ci0gICAgICB2aXNpdG9yLnZpc2l0TWF0Y2hNb2RlbE5vZGUobWF0Y2hNb2RlbE5vZGUpOwotICAgIH0gICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IHNlbGVjdGVkQ2hpbGRyZW4sIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIGludFtdIHJhbmdlID0gZ2V0UmFuZ2UocGFyZW50LCBzZWxlY3RlZENoaWxkcmVuKTsKLSAgICBpZiAocmFuZ2UgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgIAotICAgICAgaWYgKGlzQ29udGlndW91cyhwYXJlbnQsIHJhbmdlLCBzZWxlY3RlZENoaWxkcmVuKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCB0ZW1wTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgZ2V0UmVwbGFjZUFjdGlvbnMocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIHRlbXBMaXN0KTsKLSAgICAgICAgaWYgKChpbmNsdWRlT3B0aW9ucyAmIE1vZGVsUXVlcnkuSU5DTFVERV9FTkNMT1NJTkdfUkVQTEFDRV9BQ1RJT05TKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVtb3ZlQWN0aW9uc05vdENvbnRhaW5pbmdSYW5nZSh0ZW1wTGlzdCwgcmFuZ2VbMF0sIHJhbmdlWzFdKTsgICAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZW1vdmVBY3Rpb25zTm90TWF0Y2hpbmdSYW5nZSh0ZW1wTGlzdCwgcmFuZ2VbMF0sIHJhbmdlWzFdKTsgICAgCi0gICAgICAgIH0KLSAgICAgICAgYWN0aW9uTGlzdC5hZGRBbGwodGVtcExpc3QpOwotICAgICAgfQotICAgIH0gICAKLSAgICAKLSAgICBpZiAoc2VsZWN0ZWRDaGlsZHJlbi5zaXplKCkgPT0gMSkKLSAgICB7Ci0gICAgICBOb2RlIG5vZGUgPSAoTm9kZSlzZWxlY3RlZENoaWxkcmVuLmdldCgwKTsKLSAgICAgIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgRWxlbWVudCBjaGlsZEVsZW1lbnQgPSAoRWxlbWVudClub2RlOyAgICAgICAKLSAgICAgICAgQ01Ob2RlIGNoaWxkRWQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKGNoaWxkRWxlbWVudCk7Ci0gICAgICAgIGlmIChjaGlsZEVkICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAKLQotICAgICAgICAgIENNTm9kZSBjaGlsZE9yaWdpbj0gbW9kZWxRdWVyeS5nZXRPcmlnaW4oY2hpbGRFbGVtZW50KTsKLQotICAgICAgICAgIENNTm9kZUxpc3QgY21Ob2RlTGlzdCA9IGNoaWxkT3JpZ2luICE9IG51bGwgPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDTU5vZGVMaXN0KWNoaWxkT3JpZ2luLmdldFByb3BlcnR5KCJTdWJzdGl0dXRpb25Hcm91cCIpIDogLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENNTm9kZUxpc3QpY2hpbGRFZC5nZXRQcm9wZXJ0eSgiU3Vic3RpdHV0aW9uR3JvdXAiKTsgLy8kTk9OLU5MUy0xJAotCi0gICAgICAgICAgaWYgKGNtTm9kZUxpc3QgIT0gbnVsbCAmJiBjbU5vZGVMaXN0LmdldExlbmd0aCgpID4gMSkKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgaW50IHJlcGxhY2VJbmRleCA9IGdldEluZGV4KHBhcmVudCwgY2hpbGRFbGVtZW50KTsKLSAgICAgICAgICAgIFN0cmluZyBjaGlsZEVkTmFtZSA9IGNoaWxkRWQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY21Ob2RlTGlzdC5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgICAgICAgeyAgICAgICAgIAotICAgICAgICAgICAgICBDTU5vZGUgc3Vic3RpdHV0aW9uID0gY21Ob2RlTGlzdC5pdGVtKGkpOwotICAgICAgICAgICAgICBpZiAoIXN1YnN0aXR1dGlvbi5nZXROb2RlTmFtZSgpLmVxdWFscyhjaGlsZEVkTmFtZSkgJiYgIUJvb2xlYW4uVFJVRS5lcXVhbHMoc3Vic3RpdHV0aW9uLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWN0aW9uIGFjdGlvbiA9IG5ldyBBY3Rpb24oTW9kZWxRdWVyeUFjdGlvbi5SRVBMQUNFLCBwYXJlbnQsIGNtTm9kZUxpc3QuaXRlbShpKSwgcmVwbGFjZUluZGV4LCByZXBsYWNlSW5kZXgpOwotICAgICAgICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICB9Ci0gIH0gICAgIAotICAgICAgICAgICAKLSAgCi0gIC8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0ZWQgbm9kZXMgYXJlIGNvbnRpZ3VvdXMKLSAgLy8gIAotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbnRpZ3VvdXMoRWxlbWVudCBwYXJlbnQsIGludFtdIHJhbmdlLCBMaXN0IHNlbGVjdGVkTm9kZUxpc3QpCi0gIHsgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCS8vIGlzc3VlOiBub2RlTGlzdExlbmd0aCB3YXMgbmV2ZXIgcmVhZCwgYnV0IGluIHRoZW9yeSwgCi0JLy8gbm9kZWxMaXN0LmdldExlbmd0aCgpIG1pZ2h0IGNhdXNlIHNvbWUgY2xlYXJpbmcgb2YgY2FjaGVkIAotCS8vIGRhdGEsIG9yIHNvbWV0aGluZywgc28gbGVhdmluZyBpbiBhIHBvdGVudGlhbCBtZWFuaW5nbGVzcyBjYWxsLCBmb3Igbm93LgotICAgIC8vaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0Jbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IHJhbmdlWzBdOyBpIDwgcmFuZ2VbMV07IGkrKykKLSAgICB7ICAgICAgIAotICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsgICAgCi0gICAgICBpZiAoIWlzV2hpdGVzcGFjZU5vZGUobm9kZSkgJiYgIXNlbGVjdGVkTm9kZUxpc3QuY29udGFpbnMobm9kZSkpCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9ICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotIAotIAotICBwcm90ZWN0ZWQgaW50W10gZ2V0UmFuZ2UoRWxlbWVudCBwYXJlbnQsIExpc3QgbGlzdCkKLSAgewotICAgIGludFtdIHJlc3VsdCA9IG51bGw7Ci0gICAgaW50IGZpcnN0ID0gLTE7Ci0gICAgaW50IGxhc3QgPSAtMTsgICAgICAgICAgICAgICAgICAgICAKLQotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspCi0gICAgeyAgICAgICAKLSAgICAgIE5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7ICAgIAotICAgICAgaWYgKGxpc3QuY29udGFpbnMobm9kZSkpCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICBmaXJzdCA9IChmaXJzdCA9PSAtMSkgPyBpIDogTWF0aC5taW4oZmlyc3QsIGkpOyAgICAgICAgCi0gICAgICAgIGxhc3QgPSBNYXRoLm1heChsYXN0LCBpKTsKLSAgICAgIH0gICAgCi0gICAgfQotICAgCi0gICAgaWYgKGZpcnN0ICE9IC0xICYmIGxhc3QhPSAtMSkKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgcmVzdWx0ID0gbmV3IGludFsyXTsKLSAgICAgIHJlc3VsdFswXSA9IGZpcnN0OwotICAgICAgcmVzdWx0WzFdID0gbGFzdDsKLSAgICB9ICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzV2hpdGVzcGFjZU5vZGUoTm9kZSBub2RlKQotICB7Ci0gICAgcmV0dXJuIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJgotICAgICAgICAgICBub2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwOwotICB9IAotCi0KLSAgcHJvdGVjdGVkIGludCBnZXRJbmRleChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGQpCi0gIHsKLSAgICBOb2RlTGlzdCBub2RlTGlzdCA9IHBhcmVudE5vZGUuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBpbmRleCA9IC0xOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgaWYgKG5vZGVMaXN0Lml0ZW0oaSkgPT0gY2hpbGQpCi0gICAgICB7Ci0gICAgICAgIGluZGV4ID0gaTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLSAgfSAgICAgICAgICAgICAgICAgICAgCi0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0FjdGlvbkNvbnRhaW5pbmdSYW5nZShNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgewotICAgIGludCBhY3Rpb25TdGFydEluZGV4ID0gYWN0aW9uLmdldFN0YXJ0SW5kZXgoKTsKLSAgICBpbnQgYWN0aW9uRW5kSW5kZXggPSBhY3Rpb24uZ2V0RW5kSW5kZXgoKTsKLQotICAgIHJldHVybiAoYWN0aW9uU3RhcnRJbmRleCA8PSBzdGFydEluZGV4ICYmCi0gICAgICAgICAgICBhY3Rpb25FbmRJbmRleCA+PSBlbmRJbmRleCk7Ci0gIH0gCi0gICAgICAgICAgIAotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQWN0aW9uTWF0Y2hpbmdSYW5nZShNb2RlbFF1ZXJ5QWN0aW9uIGFjdGlvbiwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgewotICAgIGludCBhY3Rpb25TdGFydEluZGV4ID0gYWN0aW9uLmdldFN0YXJ0SW5kZXgoKTsKLSAgICBpbnQgYWN0aW9uRW5kSW5kZXggPSBhY3Rpb24uZ2V0RW5kSW5kZXgoKTsKLSAgICByZXR1cm4gKGFjdGlvblN0YXJ0SW5kZXggPT0gc3RhcnRJbmRleCAmJiAgICAgICAgCi0gICAgICAgICAgICBhY3Rpb25FbmRJbmRleCA9PSBlbmRJbmRleCk7Ci0gIH0gCi0gICAgICAgICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZUFjdGlvbnNOb3RDb250YWluaW5nUmFuZ2UoTGlzdCBhY3Rpb25MaXN0LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICB7Ci0gICAgZm9yIChpbnQgaSA9IGFjdGlvbkxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbilhY3Rpb25MaXN0LmdldChpKTsKLSAgICAgIGlmICghaXNBY3Rpb25Db250YWluaW5nUmFuZ2UoYWN0aW9uLCBzdGFydEluZGV4LCBlbmRJbmRleCkpCi0gICAgICB7Ci0gICAgICAgIGFjdGlvbkxpc3QucmVtb3ZlKGkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgcmVtb3ZlQWN0aW9uc05vdE1hdGNoaW5nUmFuZ2UoTGlzdCBhY3Rpb25MaXN0LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KQotICB7Ci0gICAgZm9yIChpbnQgaSA9IGFjdGlvbkxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgewotICAgICAgTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbilhY3Rpb25MaXN0LmdldChpKTsKLSAgICAgIGlmICghaXNBY3Rpb25NYXRjaGluZ1JhbmdlKGFjdGlvbiwgc3RhcnRJbmRleCwgZW5kSW5kZXgpKQotICAgICAgewotICAgICAgICBhY3Rpb25MaXN0LnJlbW92ZShpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWF0Y2hNb2RlbFZpc2l0b3IKLSAgewotICAgIGludCBpbmRlbnQ7Ci0gICAgaW50IGVsZW1lbnRJbmRleDsKLSAgICBOb2RlIHBhcmVudDsKLSAgICBMaXN0IGFjdGlvbkxpc3Q7Ci0KLSAgICBwdWJsaWMgTWF0Y2hNb2RlbFZpc2l0b3IoTm9kZSBwYXJlbnQsIExpc3QgYWN0aW9uTGlzdCkKLSAgICB7Ci0gICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgIHRoaXMuYWN0aW9uTGlzdCA9IGFjdGlvbkxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBpbmRleE9mTmV4dEVsZW1lbnQoaW50IHN0YXJ0KQotICAgIHsKLSAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLSAgICAgIGludCBsZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgIGludCByZXN1bHQgPSBsZW5ndGg7Ci0gICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBsZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLSAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNYXRjaE1vZGVsTm9kZShDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSkKLSAgICB7Ci0gICAgICBpbnQgc3RhcnRJbmRleCA9IGluZGV4T2ZOZXh0RWxlbWVudChlbGVtZW50SW5kZXgpOwotCi0gICAgICAvL1N0cmluZyBjbU5vZGVOYW1lID0gbWF0Y2hNb2RlbE5vZGUuY21Ob2RlICE9IG51bGwgPyBtYXRjaE1vZGVsTm9kZS5jbU5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsKLSAgICAgIC8vcHJpbnRJbmRlbnRlZChpbmRlbnQsICIrTWF0Y2hNb2RlbE5vZGUgOiAiICsgY21Ob2RlTmFtZSArICAiICIgKyBzdGFydEluZGV4KTsKLQotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbWF0Y2hNb2RlbE5vZGUuY2hpbGRyZW4uaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlIGNoaWxkID0gKENNVmFsaWRhdG9yLk1hdGNoTW9kZWxOb2RlKWl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgdmlzaXRNYXRjaE1vZGVsTm9kZShjaGlsZCk7Ci0gICAgICB9Ci0gICAgICBpbmRlbnQgLT0gMjsKLQotICAgICAgaWYgKG1hdGNoTW9kZWxOb2RlLmNtTm9kZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgbm9kZVR5cGUgPSBtYXRjaE1vZGVsTm9kZS5jbU5vZGUuZ2V0Tm9kZVR5cGUoKTsKLSAgICAgICAgaWYgKG5vZGVUeXBlID09IENNTm9kZS5HUk9VUCkKLSAgICAgICAgewotICAgICAgICAgIENNR3JvdXAgZ3JvdXAgPSAoQ01Hcm91cCltYXRjaE1vZGVsTm9kZS5jbU5vZGU7Ci0gICAgICAgICAgaWYgKGdyb3VwLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UpCi0gICAgICAgICAgewotICAgICAgICAgICAgYWRkUmVwbGFjZUFjdGlvbnMobWF0Y2hNb2RlbE5vZGUsIGdyb3VwLCBzdGFydEluZGV4LCBlbGVtZW50SW5kZXggLSAxKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAobm9kZVR5cGUgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pCi0gICAgICAgIHsKLSAgICAgICAgICBlbGVtZW50SW5kZXggPSBzdGFydEluZGV4ICsgMTsKLSAgICAgICAgfQotICAgICAgICAvL3ByaW50SW5kZW50ZWQoaW5kZW50LCAiLU1hdGNoTW9kZWxOb2RlIDogIiArIGNtTm9kZU5hbWUgKyAgIiAiICsgKGVsZW1lbnRJbmRleCAtIDEpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRSZXBsYWNlQWN0aW9ucyhDTVZhbGlkYXRvci5NYXRjaE1vZGVsTm9kZSBtYXRjaE1vZGVsTm9kZSwgQ01Hcm91cCBncm91cCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkKLSAgICB7Ci0gICAgICBDTU5vZGUgZXhjbHVkZUNNTm9kZSA9IG51bGw7Ci0gICAgICBpZiAobWF0Y2hNb2RlbE5vZGUuY2hpbGRyZW4uc2l6ZSgpID4gMCkKLSAgICAgIHsKLSAgICAgICAgQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUgY2hpbGQgPSAoQ01WYWxpZGF0b3IuTWF0Y2hNb2RlbE5vZGUpbWF0Y2hNb2RlbE5vZGUuY2hpbGRyZW4uZ2V0KDApOwotICAgICAgICBleGNsdWRlQ01Ob2RlID0gY2hpbGQuY21Ob2RlOwotICAgICAgfQotCi0gICAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBDTU5vZGUgYWx0ZXJuYXRpdmUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoYWx0ZXJuYXRpdmUgIT0gZXhjbHVkZUNNTm9kZSkKLSAgICAgICAgewotICAgICAgICAgIEFjdGlvbiBhY3Rpb24gPSBuZXcgQWN0aW9uKE1vZGVsUXVlcnlBY3Rpb24uUkVQTEFDRSwgcGFyZW50LCBhbHRlcm5hdGl2ZSwgc3RhcnRJbmRleCwgZW5kSW5kZXgpOwotICAgICAgICAgIGFjdGlvbkxpc3QuYWRkKGFjdGlvbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvL3B1YmxpYyBzdGF0aWMgdm9pZCBwcmludEluZGVudGVkKGludCBpbmRlbnQsIFN0cmluZyBzdHJpbmcpCi0gIC8vewotICAvLyAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgLy8gIHsKLSAgLy8gICAgU3lzdGVtLm91dC5wcmludCgiICIpOwotICAvLyAgfQotICAvLyAgU3lzdGVtLm91dC5wcmludGxuKHN0cmluZyk7Ci0gIC8vfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL01vZGVsUXVlcnlJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhMDMyYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvTW9kZWxRdWVyeUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5tb2RlbHF1ZXJ5aW1wbC5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsLkNNRGF0YVR5cGVWYWx1ZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuRE9NVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LmV4dGVuc2lvbi5Nb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01WaXNpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZVRhYmxlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsYXJnZSBwb3J0aW9uIG9mIHRoZSBNb2RlbFF1ZXJ5IGludGVyZmFjZXMuCi0gKiBTb21lIHdvcmsgaXMgZGVsZWdhdGVkIHRvIHRoZSBET01IZWxwZXIsIENNRG9jdW1lbnRNYW5hZ2VyLCBhbmQgRE9NVmFsaWRhdG9yLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUltcGwgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5Ci17Ci0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBtb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlcjsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlBY3Rpb25IZWxwZXIgbW9kZWxRdWVyeUFjdGlvbkhlbHBlcjsKLSAgcHJvdGVjdGVkIERPTVZhbGlkYXRvciB2YWxpZGF0b3I7ICAgCi0gIHByb3RlY3RlZCBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlckltcGwgZXh0ZW5zaW9uTWFuYWdlcjsgICAKLSAgcHJvdGVjdGVkIENNRGF0YVR5cGVWYWx1ZUhlbHBlciB2YWx1ZUhlbHBlcjsKLSAgcHJvdGVjdGVkIGludCBlZGl0TW9kZSA9IEVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1Q7Ci0KLSAgcHVibGljIE1vZGVsUXVlcnlJbXBsKE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKQotICB7Ci0gICAgdGhpcy5tb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciA9IG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIgPSBjcmVhdGVNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKCk7Ci0gICAgdmFsaWRhdG9yID0gbmV3IERPTVZhbGlkYXRvcigpOyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBleHRlbnNpb25NYW5hZ2VyID0gbmV3IE1vZGVsUXVlcnlFeHRlbnNpb25NYW5hZ2VySW1wbCgpOwotICAgIHZhbHVlSGVscGVyID0gbmV3IENNRGF0YVR5cGVWYWx1ZUhlbHBlcigpOwotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBpbnQgZ2V0RWRpdE1vZGUoKQotICB7Ci0gICAgcmV0dXJuIGVkaXRNb2RlOwotICB9Ci0gICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCBzZXRFZGl0TW9kZShpbnQgZWRpdE1vZGUpCi0gIHsKLSAgICB0aGlzLmVkaXRNb2RlID1lZGl0TW9kZTsKLSAgfQotCi0KLSAgLy8gZmFjdG9yeSBtZXRob2RzCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyIGNyZWF0ZU1vZGVsUXVlcnlBY3Rpb25IZWxwZXIoKQotICB7Ci0gICAgcmV0dXJuIG5ldyBNb2RlbFF1ZXJ5QWN0aW9uSGVscGVyKHRoaXMpOwotICB9IAotCi0gIHB1YmxpYyBET01WYWxpZGF0b3IgZ2V0VmFsaWRhdG9yKCkKLSAgewotICAgIHJldHVybiB2YWxpZGF0b3I7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0gIH0KLQotICBwdWJsaWMgQ01Ob2RlIGdldENNTm9kZShOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01Ob2RlKG5vZGUpOwotICB9Ci0KLSAgcHVibGljIENNRGF0YVR5cGUgZ2V0Q01EYXRhVHlwZShUZXh0IHRleHQpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIuZ2V0Q01EYXRhVHlwZSh0ZXh0KTsKLSAgfQotCi0gIHB1YmxpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oQXR0ciBhdHRyKQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0gIH0KLQotICBwdWJsaWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgcmV0dXJuIG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICB9Ci0gICAKLSAgcHVibGljIENNRG9jdW1lbnRNYW5hZ2VyIGdldENNRG9jdW1lbnRNYW5hZ2VyKCkKLSAgewotICAgIENNRG9jdW1lbnRNYW5hZ2VyIHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY2lhdGlvblByb3ZpZGVyID0gKFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gICAgICByZXN1bHQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0gICAgfSAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gICAgICAgCi0KLSAgLyoqCi0gICAqIEBkZXByZWN0ZWQgLSB1c2UgMyBhcmcgdmVyc2lvbiBiZWxvdwotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0Q01Eb2N1bWVudExpc3QoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdXJpKQotICB7ICAgICAgICAKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLSAgfQotCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRMaXN0KEVsZW1lbnQgZWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgCi0gICAgTGlzdCByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgICAKLSAgICAgIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgeG1sQXNzb2NpYXRpb25Qcm92aWRlciA9IChYTUxBc3NvY2lhdGlvblByb3ZpZGVyKW1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyOwotICAgICAKLSAgICAgIC8vIHRvZG8uLi4gcmV2aXN0Li4uIGhhbmRsZSBlYWNoICMjdGhpbmcgZXhwbGljaXRseQotICAgICAgLy8gICAgICAgICAgCi0gICAgICBpZiAodXJpID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHVyaSA9ICIjI2FueSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gICAgICAgICAgICAgICAKLQotICAgICAgaWYgKHVyaS5lcXVhbHMoIiMjdGFyZ2V0TmFtZXNwYWNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gKENNRG9jdW1lbnQpZWQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7ICAKLSAgICAgICAgICByZXN1bHQuYWRkKGNtRG9jdW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh1cmkuZXF1YWxzKCIjI2FueSIpIHx8IHVyaS5lcXVhbHMoIiMjb3RoZXIiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgZXhjbHVkZWRVUkkgPSBudWxsOwotICAgICAgICBpZiAodXJpLmVxdWFscygiIyNvdGhlciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCllZC5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgZXhjbHVkZWRVUkkgPSAoU3RyaW5nKWNtRG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy90YXJnZXROYW1lc3BhY2VVUkkiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGNvbnNpZGVyIGFsbCBvZiB0aGUgc2NoZW1hIHJlbGF0ZWQgdG8gdGhpcyBkb2N1bWVudAotICAgICAgICAvLwotICAgICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgICBMaXN0IGxpc3QgPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOwotICAgICAgICAgIGlmIChpbmZvLnVyaSAhPSBudWxsICYmICFpbmZvLnVyaS5lcXVhbHMoZXhjbHVkZWRVUkkpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNRG9jdW1lbnQgZG9jdW1lbnQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnQoaW5mby51cmksIGluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQuYWRkKGRvY3VtZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gICAKLSAgICAgIGVsc2UKLSAgICAgIHsgICAgICAgIAotICAgICAgICBDTURvY3VtZW50IGRvY3VtZW50ID0geG1sQXNzb2NpYXRpb25Qcm92aWRlci5nZXRDTURvY3VtZW50KGVsZW1lbnQsIHVyaSk7Ci0gICAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0LmFkZChkb2N1bWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgCi0KLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKG1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyIGluc3RhbmNlb2YgWE1MQXNzb2NpYXRpb25Qcm92aWRlcikKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgWE1MQXNzb2NpYXRpb25Qcm92aWRlciB4bWxBc3NvY2lhdGlvblByb3ZpZGVyID0gKFhNTEFzc29jaWF0aW9uUHJvdmlkZXIpbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXI7Ci0gICAgICByZXN1bHQgPSB4bWxBc3NvY2lhdGlvblByb3ZpZGVyLmdldENNRG9jdW1lbnQoZWxlbWVudCwgdXJpKTsKLSAgICB9Ci0gICAgLy9Db250ZW50TW9kZWxNYW5hZ2VyLnByaW50bG4oIk1vZGVsUXVlcnlJbXBsLmdldENNRG9jdW1lbnQoIiArIGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSArICIsICIgKyB1cmkgKyAiKSA9ICIgKyByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAgICAgICAgICAgICAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIHJldHVybiBpc0NvbnRlbnRWYWxpZChlZCwgZWxlbWVudCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbnRlbnRWYWxpZChDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7ICAgIAotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsgCi0gICAgICAvLyBmaXJzdCBjaGVjayB0byBzZWUgaWYgYWxsIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGVzIGFyZSBwcmVzZW50Ci0gICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgaW50IG1hcExlbmd0aCA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwTGVuZ3RoOyBpKyspCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKW1hcC5pdGVtKGkpOwotICAgICAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShhZCwgZWxlbWVudCwgbnVsbCk7Ci0gICAgICAgIGlmIChhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0gICAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgICAgQXR0ciBhdHRyID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKGF0dHJpYnV0ZU5hbWUpOwotICAgICAgICAgICBpZiAoYXR0ciA9PSBudWxsKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBub3cgY2hlY2sgdG8gc2VlIG9mIHRoZSBjaGlsZHJlbiB2YWxpZGF0ZSBwcm9wZXJseQotICAgICAgLy8KLSAgICAgIGlmIChyZXN1bHQpIAotICAgICAgewotICAgICAgICBDTU5vZGVbXSBvcmlnaW5BcnJheSA9IGdldE9yaWdpbkFycmF5KGVsZW1lbnQpOwotICAgICAgICByZXN1bHQgPSBvcmlnaW5BcnJheSAhPSBudWxsICYmIG9yaWdpbkFycmF5Lmxlbmd0aCA9PSBlbGVtZW50LmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIENNTm9kZSBnZXRPcmlnaW4oTm9kZSBub2RlKQotICB7Ci0gICAgQ01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0gICAgLy8gdG9kby4uLiBtYWtlIHN1cmUgcGFyZW50IGlzIHJpZ2h0Ci0gICAgLy8KLSAgICBOb2RlIHBhcmVudE5vZGUgPSBnZXRQYXJlbnRPck93bmVyTm9kZShub2RlKTsKLSAgICBpZiAocGFyZW50Tm9kZSAhPSBudWxsICYmIHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudClwYXJlbnROb2RlOwotICAgICAgQ01Ob2RlW10gYXJyYXkgPSBnZXRPcmlnaW5BcnJheShwYXJlbnRFbGVtZW50KTsKLSAgICAgIGlmIChhcnJheSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleE9mTm9kZShwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSwgbm9kZSk7Ci0gICAgICAgIGlmIChpbmRleCA8IGFycmF5Lmxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGFycmF5W2luZGV4XTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENNTm9kZVtdIGdldE9yaWdpbkFycmF5KEVsZW1lbnQgZWxlbWVudCkKLSAgewotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0gICAgcmV0dXJuIChlZCAhPSBudWxsKSA/IGdldFZhbGlkYXRvcigpLmdldE9yaWdpbkFycmF5KGVkLCBlbGVtZW50KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEluZGV4T2ZOb2RlKE5vZGVMaXN0IG5vZGVMaXN0LCBOb2RlIG5vZGUpCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gLTE7Ci0gICAgaW50IHNpemUgPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgaWYgKG5vZGVMaXN0Lml0ZW0oaSkgPT0gbm9kZSkKLSAgICAgICB7Ci0gICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIENNTm9kZSAnbWV0YSBkYXRhJyB0aGF0IG1heSBiZSBwb3RlbnRpYWxseSBhZGRlZCB0byB0aGUgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBMaXN0IGdldEF2YWlsYWJsZUNvbnRlbnQoRWxlbWVudCBlbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgaW50IGluY2x1ZGVPcHRpb25zKQotICB7Ci0gICAgQXZhaWxhYmxlQ29udGVudENNVmlzaXRvciB2aXNpdG9yID0gbmV3IEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoZWxlbWVudCwgZWQpOwotICAgIExpc3QgbGlzdCA9IHZpc2l0b3IuY29tcHV0ZUF2YWlsYWJsZUNvbnRlbnQoaW5jbHVkZU9wdGlvbnMpOwotICAgIGlmIChleHRlbnNpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBleHRlbnNpb25NYW5hZ2VyLmZpbHRlckF2YWlsYWJsZUVsZW1lbnRDb250ZW50KGxpc3QsIGVsZW1lbnQsIGVkKTsKLSAgICB9ICAKLSAgICByZXR1cm4gbGlzdDsKLSAgfSAgCi0KLQotICBwdWJsaWMgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIENNTm9kZSBjbU5vZGUsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICBib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnQpOwotICAgIGlmIChlZCAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGNhbkluc2VydChwYXJlbnQsIGVkLCBjbU5vZGUsIGluZGV4LCB2YWxpZGl0eUNoZWNraW5nKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCwgQ01Ob2RlIGNtTm9kZSwgaW50IGluZGV4LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIHJldHVybiBjYW5JbnNlcnQocGFyZW50LCBlZCwgY21Ob2RlLCBpbmRleCwgdmFsaWRpdHlDaGVja2luZywgbnVsbCk7Ci0gIH0gICAgICAgICAKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBjYW5JbnNlcnQoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBDTU5vZGUgY21Ob2RlLCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nLCBPYmplY3QgcmV1c2VhYmxlRGF0YSkKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLSAgICBzd2l0Y2ggKGNtTm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6Ci0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmNvbXB1dGVOYW1lKGNtTm9kZSwgcGFyZW50LCBudWxsKTsKLSAgICAgICAgcmVzdWx0ID0gcGFyZW50LmdldEF0dHJpYnV0ZU5vZGUoYXR0cmlidXRlTmFtZSkgPT0gbnVsbDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OIDoKLSAgICAgIGNhc2UgQ01Ob2RlLkdST1VQIDoKLSAgICAgIHsKLSAgICAgICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gVkFMSURJVFlfU1RSSUNUKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIGNyZWF0ZSBsaXN0ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IG51bGw7Ci0gICAgICAgICAgaWYgKHJldXNlYWJsZURhdGEgIT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gKExpc3QpcmV1c2VhYmxlRGF0YTsKLSAgICAgICAgICB9ICAgIAotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KHBhcmVudCwgZWQpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXN1bHQgPSBnZXRWYWxpZGF0b3IoKS5jYW5JbnNlcnQoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCwgaW5kZXgsIGNtTm9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIENNTm9kZS5EQVRBX1RZUEUgOgotICAgICAgewotICAgICAgICBpbnQgY29udGVudFR5cGUgPSBlZC5nZXRDb250ZW50VHlwZSgpOwotICAgICAgICByZXN1bHQgPSAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSB8fAotICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuSW5zZXJ0KEVsZW1lbnQgcGFyZW50LCBMaXN0IGNtTm9kZUxpc3QsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICAvLyB0b2RvCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZShOb2RlIG5vZGUsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgICAgIAotICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IFZBTElESVRZX1NUUklDVCkKLSAgICB7Ci0gICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICBzd2l0Y2ggKG5vZGVUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIE5vZGUuQVRUUklCVVRFX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbigoQXR0cilub2RlKTsKLSAgICAgICAgICBpZiAoYWQgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSAoYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLk9QVElPTkFMKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERToKLSAgICAgICAgewotICAgICAgICAgIE5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgIGlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpcGFyZW50Tm9kZTsKLSAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0gICAgICAgICAgICBpZiAoZWQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgTGlzdCBjb250ZW50U3BlY2lmaWNhdGlvbkxpc3QgPSBnZXRWYWxpZGF0b3IoKS5jcmVhdGVDb250ZW50U3BlY2lmaWNhdGlvbkxpc3QocGFyZW50RWxlbWVudCwgZWQpOwotICAgICAgICAgICAgICBpbnQgaW5kZXggPSBnZXRJbmRleE9mTm9kZShwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSwgbm9kZSk7Ci0gICAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmNhblJlbW92ZShlZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotCi0gIHB1YmxpYyBib29sZWFuIGNhblJlbW92ZShMaXN0IG5vZGVMaXN0LCBpbnQgdmFsaWRpdHlDaGVja2luZykKLSAgewotICAgIGJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotICAgIGlmICh2YWxpZGl0eUNoZWNraW5nID09IFZBTElESVRZX1NUUklDVCkKLSAgICB7Ci0gICAgICBFbGVtZW50IHBhcmVudEVsZW1lbnQgPSBudWxsOwotICAgICAgTGlzdCBjaGlsZExpc3QgPSBudWxsOwotCi0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBub2RlTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSlpLm5leHQoKTsKLQotICAgICAgICBpZiAocGFyZW50RWxlbWVudCA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGFyZW50RWxlbWVudCA9IGdldFBhcmVudE9yT3duZXJFbGVtZW50KG5vZGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBhcmVudEVsZW1lbnQgIT0gZ2V0UGFyZW50T3JPd25lckVsZW1lbnQobm9kZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIHBhcmVudCBhcmUgdGhlIHNhbWUKLSAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotICAgICAgICBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICAgICAgewotICAgICAgICAgIGlmICghY2FuUmVtb3ZlKG5vZGUsIHZhbGlkaXR5Q2hlY2tpbmcpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGlmIChjaGlsZExpc3QgPT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjaGlsZExpc3QgPSBub2RlTGlzdFRvTGlzdChwYXJlbnRFbGVtZW50LmdldENoaWxkTm9kZXMoKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNoaWxkTGlzdC5yZW1vdmUobm9kZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHJlc3VsdCAmJiBjaGlsZExpc3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihwYXJlbnRFbGVtZW50KTsKLSAgICAgICAgaWYgKGVkICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIExpc3QgY29udGVudFNwZWNpZmljYXRpb25MaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGNoaWxkTGlzdCwgZWQpOwotICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmlzVmFsaWQoZWQsIGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gY2FuUmVwbGFjZShFbGVtZW50IHBhcmVudCwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCwgQ01Ob2RlIGNtTm9kZSwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGNhblJlcGxhY2UoRWxlbWVudCBwYXJlbnQsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgsIExpc3QgY21Ob2RlTGlzdCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSAgICAgCi0gICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIGV4cGVyaW1lbnRhbC4uLiB1c2UgYXQgeW91ciBvd24gcmlzawotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gY2FuV3JhcChFbGVtZW50IGNoaWxkRWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gd3JhcEVsZW1lbnQsIGludCB2YWxpZGl0eUNoZWNraW5nKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOyAgCi0gICAgTm9kZSBwYXJlbnROb2RlID0gY2hpbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIEVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KXBhcmVudE5vZGU7ICAgICAgCi0gICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotICAgICAgaWYgKHBhcmVudEVkICE9IG51bGwpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKHZhbGlkaXR5Q2hlY2tpbmcgPT0gVkFMSURJVFlfU1RSSUNUKQotICAgICAgICB7Ci0gICAgICAgICAgaW50IGluZGV4ID0gZ2V0SW5kZXhPZk5vZGUocGFyZW50RWxlbWVudC5nZXRDaGlsZE5vZGVzKCksIGNoaWxkRWxlbWVudCk7Ci0KLSAgICAgICAgICBMaXN0IGNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdCA9IGdldFZhbGlkYXRvcigpLmNyZWF0ZUNvbnRlbnRTcGVjaWZpY2F0aW9uTGlzdChwYXJlbnRFbGVtZW50LCBwYXJlbnRFZCk7Ci0gICAgICAgICAgTGlzdCBzdWJMaXN0ID0gY29udGVudFNwZWNpZmljYXRpb25MaXN0LnN1Ykxpc3QoaW5kZXgsIGluZGV4ICsgMSk7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0VmFsaWRhdG9yKCkuY2FuUmVwbGFjZShwYXJlbnRFZCwgY29udGVudFNwZWNpZmljYXRpb25MaXN0LCBpbmRleCwgaW5kZXgsIHdyYXBFbGVtZW50KTsKLSAgICAgICAgICBpZiAocmVzdWx0KQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGdldFZhbGlkYXRvcigpLmlzVmFsaWQod3JhcEVsZW1lbnQsIHN1Ykxpc3QpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfSAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0QWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IGluY2x1ZGVPcHRpb25zLCBpbnQgdmFsaWRpdHlDaGVja2luZywgTGlzdCBhY3Rpb25MaXN0KQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudCwgZWQsIGluZGV4LCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRJbnNlcnRBY3Rpb25zKERvY3VtZW50IHBhcmVudCwgQ01Eb2N1bWVudCBjbURvY3VtZW50LCBpbnQgaW5kZXgsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0SW5zZXJ0QWN0aW9ucyhwYXJlbnQsIGNtRG9jdW1lbnQsIGluZGV4LCBpbmNsdWRlT3B0aW9ucywgdmFsaWRpdHlDaGVja2luZywgYWN0aW9uTGlzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRSZXBsYWNlQWN0aW9ucyhFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0UmVwbGFjZUFjdGlvbnMocGFyZW50LCBlZCwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9ICAgICAgICAgICAgICAgICAgICAgCi0KLSAgcHVibGljIHZvaWQgZ2V0UmVwbGFjZUFjdGlvbnMoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBMaXN0IHNlbGVjdGVkQ2hpbGRyZW4sIGludCBpbmNsdWRlT3B0aW9ucywgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIExpc3QgYWN0aW9uTGlzdCkKLSAgewotICAgIG1vZGVsUXVlcnlBY3Rpb25IZWxwZXIuZ2V0UmVwbGFjZUFjdGlvbnMocGFyZW50LCBlZCwgc2VsZWN0ZWRDaGlsZHJlbiwgaW5jbHVkZU9wdGlvbnMsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZ2V0SW5zZXJ0Q2hpbGROb2RlQWN0aW9uVGFibGUoRWxlbWVudCBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgdmFsaWRpdHlDaGVja2luZywgSGFzaHRhYmxlIGFjdGlvblRhYmxlKQotICB7Ci0gICAgbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRJbnNlcnRDaGlsZE5vZGVBY3Rpb25UYWJsZShwYXJlbnQsIGVkLCB2YWxpZGl0eUNoZWNraW5nLCBhY3Rpb25UYWJsZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBnZXRBY3Rpb25UYWJsZShFbGVtZW50IHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCwgaW50IHZhbGlkaXR5Q2hlY2tpbmcsIEhhc2h0YWJsZSBhY3Rpb25UYWJsZSkKLSAgewotICAgIC8vbW9kZWxRdWVyeUFjdGlvbkhlbHBlci5nZXRBbGxBY3Rpb25zKHBhcmVudCwgZWQsIHZhbGlkaXR5Q2hlY2tpbmcsIGFjdGlvbkxpc3QpOwotICB9Ci0KLQotICAvLyBzb21lIGhlbHBlciBtZXRob2RzCi0gIC8vCi0gIHByb3RlY3RlZCBOb2RlIGdldFBhcmVudE9yT3duZXJOb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHJldHVybiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpID8KLSAgICAgICAgICAgKChBdHRyKW5vZGUpLmdldE93bmVyRWxlbWVudCgpIDoKLSAgICAgICAgICAgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRWxlbWVudCBnZXRQYXJlbnRPck93bmVyRWxlbWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICBOb2RlIHBhcmVudCA9IGdldFBhcmVudE9yT3duZXJOb2RlKG5vZGUpOwotICAgIHJldHVybiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpID8gKEVsZW1lbnQpcGFyZW50IDogbnVsbDsKLSAgfQotICAgICAgICAgICAgICAgCi0KLSAgcHJvdGVjdGVkIExpc3Qgbm9kZUxpc3RUb0xpc3QoTm9kZUxpc3Qgbm9kZUxpc3QpCi0gIHsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIFZlY3RvciB2ID0gbmV3IFZlY3RvcihzaXplKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2LmFkZChub2RlTGlzdC5pdGVtKGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0gICAKLSAgIAotICAvKioKLSAgcHJvdGVjdGVkIExpc3QgZ2V0Q01Ob2RlTGlzdChOb2RlTGlzdCBub2RlTGlzdCkKLSAgewotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKHNpemUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHYuYWRkKGdldENNTm9kZShub2RlTGlzdC5pdGVtKGkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHY7Ci0gIH0KLSAgKi8gIAotCi0gIHB1YmxpYyBjbGFzcyBBdmFpbGFibGVDb250ZW50Q01WaXNpdG9yIGV4dGVuZHMgQ01WaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgSGFzaHRhYmxlIGNoaWxkTm9kZVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICAgIHB1YmxpYyBIYXNodGFibGUgYXR0cmlidXRlVGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgcHVibGljIEVsZW1lbnQgcm9vdEVsZW1lbnQ7Ci0gICAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RFbGVtZW50RGVjbGFyYXRpb247IAotICAgIHB1YmxpYyBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaW5jbHVkZVNlcXVlbmNlR3JvdXBzOwotCi0gICAgcHVibGljIEF2YWlsYWJsZUNvbnRlbnRDTVZpc2l0b3IoRWxlbWVudCByb290RWxlbWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgdGhpcy5yb290RWxlbWVudCA9IHJvb3RFbGVtZW50OwotICAgICAgdGhpcy5yb290RWxlbWVudERlY2xhcmF0aW9uID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEtleShDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIFN0cmluZyBrZXkgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IChDTURvY3VtZW50KWNtTm9kZS5nZXRQcm9wZXJ0eSgiQ01Eb2N1bWVudCIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgIGlmIChuYW1lc3BhY2VVUkkgIT0gbnVsbCkKLSAgICAgICAgeyAgIAotICAgICAgICAgIGtleSA9ICJbIiArIG5hbWVzcGFjZVVSSSArICJdIiArIGtleTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvVGFibGUoSGFzaHRhYmxlIHRhYmxlLCBDTU5vZGUgY21Ob2RlKQotICAgIHsKLSAgICAgIFN0cmluZyBub2RlTmFtZSA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotICAgICAgaWYgKG5vZGVOYW1lICE9IG51bGwgJiYgbm9kZU5hbWUubGVuZ3RoKCkgPiAwKQotICAgICAgeyAgCi0gICAgICAgIHRhYmxlLnB1dChnZXRLZXkoY21Ob2RlKSwgY21Ob2RlKTsKLSAgICAgIH0gIAotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0IGNvbXB1dGVBdmFpbGFibGVDb250ZW50KGludCBpbmNsdWRlT3B0aW9ucykKLSAgICB7ICAgICAgICAgICAgICAgICAgIAotICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7ICAKLQotICAgICAgaW50IGNvbnRlbnRUeXBlID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXRDb250ZW50VHlwZSgpOwotICAgICAgaW5jbHVkZVNlcXVlbmNlR3JvdXBzID0gKChpbmNsdWRlT3B0aW9ucyAmIElOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTKSAhPSAwKTsKLSAgICAgIHZpc2l0Q01Ob2RlKHJvb3RFbGVtZW50RGVjbGFyYXRpb24pOwotICAgICAgCi0gICAgICBpZiAoKGluY2x1ZGVPcHRpb25zICYgSU5DTFVERV9BVFRSSUJVVEVTKSAhPSAwKQotICAgICAgewotICAgICAgICB2LmFkZEFsbChhdHRyaWJ1dGVUYWJsZS52YWx1ZXMoKSk7Ci0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gbmlsbGFibGVBdHRyaWJ1dGUgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbilyb290RWxlbWVudERlY2xhcmF0aW9uLmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbmlsbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBpZiAobmlsbGFibGVBdHRyaWJ1dGUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHYuYWRkKG5pbGxhYmxlQXR0cmlidXRlKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0KLSAgICAgIGlmICgoaW5jbHVkZU9wdGlvbnMgJiBJTkNMVURFX0NISUxEX05PREVTKSAhPSAwKQotICAgICAgeyAgICAgIAotICAgICAgICBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uTUlYRUQgfHwKLSAgICAgICAgICAgIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVMRU1FTlQpCi0gICAgICAgIHsKLSAgICAgICAgICB2LmFkZEFsbChjaGlsZE5vZGVUYWJsZS52YWx1ZXMoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29udGVudFR5cGUgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZKQotICAgICAgICB7ICAgICAgCi0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gIChDTURvY3VtZW50KXJvb3RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ01OYW1lZE5vZGVNYXAgZWxlbWVudHMgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7ICAgICAgICAgICAgCi0gICAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBlbGVtZW50cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB2LmFkZChpLm5leHQoKSk7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8Ci0gICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEgfHwgCi0gICAgICAgICAgICBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlkpCi0gICAgICAgIHsKLSAgICAgICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbi5nZXREYXRhVHlwZSgpOwotICAgICAgICAgIGlmIChkYXRhVHlwZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHYuYWRkKGRhdGFUeXBlKTsKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB2OwotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICAgIHsgICAgICAgICAgICAKLSAgICAgIFN0cmluZyB1cmkgPSBhbnlFbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBMaXN0IGxpc3QgPSBnZXRDTURvY3VtZW50TGlzdChyb290RWxlbWVudCwgcm9vdEVsZW1lbnREZWNsYXJhdGlvbiwgdXJpKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTURvY3VtZW50IGNtZG9jdW1lbnQgPSAoQ01Eb2N1bWVudClpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIGlmIChjbWRvY3VtZW50ICE9IG51bGwpCi0gICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGNtZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICAgICAgICBpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIENNTm9kZSBlZCA9IG1hcC5pdGVtKGkpOyAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgYWRkVG9UYWJsZShjaGlsZE5vZGVUYWJsZSxlZCk7Ci0gICAgICAgICAgfSAgICAgICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpCi0gICAgewotICAgICAgc3VwZXIudmlzaXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGFkKTsKLSAgICAgIGF0dHJpYnV0ZVRhYmxlLnB1dChhZC5nZXROb2RlTmFtZSgpLCBhZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgICB7Ci0gICAgICBpZiAoZWQgPT0gcm9vdEVsZW1lbnREZWNsYXJhdGlvbiAmJiAhaXNSb290VmlzaXRlZCkKLSAgICAgIHsKLSAgICAgICAgaXNSb290VmlzaXRlZCA9IHRydWU7Ci0gICAgICAgIHN1cGVyLnZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgYWRkVG9UYWJsZShjaGlsZE5vZGVUYWJsZSxlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBDTU5vZGVMaXN0IHN1YnN0aXR1dGlvbkdyb3VwID0gKENNTm9kZUxpc3QpZWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaWYgKHN1YnN0aXR1dGlvbkdyb3VwICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBoYW5kbGVTdWJzdGl0dXRpb25Hcm91cChzdWJzdGl0dXRpb25Hcm91cCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHJvdGVjdGVkIHZvaWQgaGFuZGxlU3Vic3RpdHV0aW9uR3JvdXAoQ01Ob2RlTGlzdCBzdWJzdGl0dXRpb25Hcm91cCkKLSAgICB7Ci0gICAgICBpbnQgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGggPSBzdWJzdGl0dXRpb25Hcm91cC5nZXRMZW5ndGgoKTsKLSAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cExlbmd0aCA+IDEpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3Vic3RpdHV0aW9uR3JvdXBMZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIENNTm9kZSBlZCA9IHN1YnN0aXR1dGlvbkdyb3VwLml0ZW0oaSk7Ci0gICAgICAgICAgaWYgKCFCb29sZWFuLlRSVUUuZXF1YWxzKGVkLmdldFByb3BlcnR5KCJBYnN0cmFjdCIpKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHsKLSAgICAgICAgICAgIGFkZFRvVGFibGUoY2hpbGROb2RlVGFibGUsZWQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICAgIHsKLSAgICAgIGlmIChpbmNsdWRlU2VxdWVuY2VHcm91cHMpCi0gICAgICB7Ci0gICAgICAgIGlmIChncm91cC5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuU0VRVUVOQ0UgJiYKLSAgICAgICAgICAgIGdyb3VwLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSA+IDEgJiYKLSAgICAgICAgICAgIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KGdyb3VwKSkKLSAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBjaGlsZE5vZGVUYWJsZS5wdXQoZ3JvdXAsIGdyb3VwKTsKLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgICBzdXBlci52aXNpdENNR3JvdXAoZ3JvdXApOwotICAgIH0gICAKLQotICAgIHB1YmxpYyBib29sZWFuIGluY2x1ZGVzUmVxdWlyZWRDb250ZW50KENNR3JvdXAgZ3JvdXApCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0VmFsaWRhdG9yKCkuY3JlYXRlQ29udGVudFNwZWNpZmljYXRpb25MaXN0KGdyb3VwKTsKLSAgICAgIHJldHVybiBsaXN0LnNpemUoKSA+IDE7Ci0gICAgfQotICB9ICAgIAotCi0gCi0gIC8qKgotICAgKiBAZGVwcmVjdGVkIC0gdXNlIGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoKQotICAgKi8KLSAgcHVibGljIExpc3QgZ2V0RGF0YVR5cGVWYWx1ZXMoRWxlbWVudCBlbGVtZW50LCBDTU5vZGUgY21Ob2RlKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGNtTm9kZSkpOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBtZXRob2RzIHJldHVybiBhbiBhcnJheSBvZiBwb3NzaWJsZSB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgZGF0YXR5cGUgb2YgdGhlIENNTm9kZSAoZWl0aGVyIGFuIENNQXR0cmlidXRlRGVjbGFyYXRpb24gb3IgYSBDTUVsZW1lbnREZWNsYXJhdGlvbikKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSkKLSAgewotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKGNtTm9kZSAhPSBudWxsKQotICAgIHsgICAgICAgCi0gICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gbnVsbDsKLSAgICAgIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKQotICAgICAgewotICAgICAgICBkYXRhVHlwZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiljbU5vZGUpLmdldEF0dHJUeXBlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjbU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikKLSAgICAgIHsKLSAgICAgICAgZGF0YVR5cGUgPSAoKENNRWxlbWVudERlY2xhcmF0aW9uKWNtTm9kZSkuZ2V0RGF0YVR5cGUoKTsKLSAgICAgIH0gICAgICAgICAKLSAgICAgCi0gICAgICBTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWVzID0gZGF0YVR5cGUgIT0gbnVsbCA/IGRhdGFUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSA6IG51bGw7ICAgICAgCi0gICAgICBpZiAoZW51bWVyYXRlZFZhbHVlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1lcmF0ZWRWYWx1ZXMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBsaXN0LmFkZChlbnVtZXJhdGVkVmFsdWVzW2ldKTsKLSAgICAgICAgfSAKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgYWRkVmFsdWVzRm9yWFNJVHlwZShlbGVtZW50LCBjbU5vZGUsIGxpc3QpOwotICAgIAotICAgIGlmIChleHRlbnNpb25NYW5hZ2VyICE9IG51bGwpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBsaXN0LmFkZEFsbChleHRlbnNpb25NYW5hZ2VyLmdldERhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGNtTm9kZSkpOwotICAgIH0gICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpbnQgbGlzdFNpemUgPSBsaXN0LnNpemUoKTsKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nW2xpc3RTaXplXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyBpKyspCi0gICAgewotICAgICAgcmVzdWx0W2ldID0gKFN0cmluZylsaXN0LmdldChpKTsKLSAgICB9ICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBhZGRWYWx1ZXNGb3JYU0lUeXBlKEVsZW1lbnQgZWxlbWVudCwgQ01Ob2RlIGNtTm9kZSwgTGlzdCBsaXN0KQotICB7ICAgICAgICAgICAgICAgCi0gICAgaWYgKGNtTm9kZSAhPSBudWxsICYmIGNtTm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04pIAotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pY21Ob2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaWYgKHZhbHVlSGVscGVyLmlzWFNJVHlwZShhZCkpCi0gICAgICB7ICAgICAgICAgICAgIAotICAgICAgICBOYW1lc3BhY2VUYWJsZSB0YWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0gICAgICAgIHRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgICBsaXN0LmFkZEFsbCh2YWx1ZUhlbHBlci5nZXRRdWFsaWZpZWRYU0lUeXBlcyhhZCwgdGFibGUpKTsgICAgIAotICAgICAgfQotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyBNb2RlbFF1ZXJ5RXh0ZW5zaW9uTWFuYWdlciBnZXRFeHRlbnNpb25NYW5hZ2VyKCkKLSAgewotICAgIHJldHVybiBleHRlbnNpb25NYW5hZ2VyOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1NpbXBsZUFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVlMmE3ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvbW9kZWxxdWVyeWltcGwvU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlDTVByb3ZpZGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW1wbGVBc3NvY2lhdGlvblByb3ZpZGVyIGV4dGVuZHMgQmFzZUFzc29jaWF0aW9uUHJvdmlkZXIKLXsKLSAgcHJvdGVjdGVkIE1vZGVsUXVlcnlDTVByb3ZpZGVyIG1vZGVsUXVlcnlDTVByb3ZpZGVyOwotICAgICAgICAgIAotICBwdWJsaWMgU2ltcGxlQXNzb2NpYXRpb25Qcm92aWRlcihNb2RlbFF1ZXJ5Q01Qcm92aWRlciBtb2RlbFF1ZXJ5Q01Qcm92aWRlcikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLm1vZGVsUXVlcnlDTVByb3ZpZGVyID0gbW9kZWxRdWVyeUNNUHJvdmlkZXI7Ci0gIH0KLQotICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUpCi0gIHsKLSAgICByZXR1cm4gbW9kZWxRdWVyeUNNUHJvdmlkZXIuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGVsZW1lbnQpOwotICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgeyAgICAgICAgCi0gICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAgICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC9tb2RlbHF1ZXJ5aW1wbC9YTUxBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NzgyZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL21vZGVscXVlcnlpbXBsL1hNTEFzc29jaWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudFJlZmVyZW5jZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlVGFibGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgZXh0ZW5kcyBCYXNlQXNzb2NpYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnRSZWZlcmVuY2VQcm92aWRlcgoteyAgICAgICAgICAgICAgCi0gIHByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlOyAKLSAgcHJvdGVjdGVkIENNRG9jdW1lbnRNYW5hZ2VySW1wbCBkb2N1bWVudE1hbmFnZXI7Ci0KLSAgcHVibGljIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNtRG9jdW1lbnRDYWNoZSkKLSAgewotICAgIHRoaXMuY21Eb2N1bWVudENhY2hlID0gY21Eb2N1bWVudENhY2hlOyAKLSAgICBkb2N1bWVudE1hbmFnZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJJbXBsKGNtRG9jdW1lbnRDYWNoZSwgdGhpcyk7Ci0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgQ01Eb2N1bWVudE1hbmFnZXIgZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKQotICB7Ci0gICAgcmV0dXJuIGRvY3VtZW50TWFuYWdlcjsKLSAgfQotIAotICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gZ2V0RG9jdHlwZUluZm8oRG9jdW1lbnQgZG9jdW1lbnQpCi0gIHsgICAKLSAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotICAgIERvY3VtZW50VHlwZSBkb2N0eXBlID0gZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCi0gICAgLy8gZGVmZWN0IDIwNjgzMyAuLi4gaGVyZSB3ZSB0ZXN0IGZvciBEVERzIHRoYXQgYXJlIGRlY2xhcmVkIGlubGluZQotICAgIC8vIHNpbmNlIHdlIGN1cnJlbnRseSBoYXZlIG5vIHdheSBvZiBtYWtpbmcgdXNlIG9mIGlubGluZSBEVERzIHdlIGluZ29yZSB0aGVtCi0gICAgLy8gc28gdGhhdCB0aGUgaW1wbGljdCBEVEQgKGlmIGFueSkgY2FuIGJlIHVzZWQKLSAgICBpZiAoZG9jdHlwZSAhPSBudWxsICYmIChkb2N0eXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCB8fCBkb2N0eXBlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkpCi0gICAgewotICAgICAgcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICAgIHJlc3VsdFswXSA9IGRvY3R5cGUuZ2V0UHVibGljSWQoKTsKLSAgICAgIHJlc3VsdFsxXSA9IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKTsKLSAgICB9ICAgCi0gICAgZWxzZSBpZiAoZ2V0SW1wbGljdERvY3R5cGUoZG9jdW1lbnQpICE9IG51bGwpCi0gICAgewotICAgICAgcmVzdWx0ID0gZ2V0SW1wbGljdERvY3R5cGUoZG9jdW1lbnQpOwotICAgIH0gICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0KLQotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZ1tdIGdldEltcGxpY3REb2N0eXBlKERvY3VtZW50IGRvY3VtZW50KQotICB7IAotICAgIFN0cmluZ1tdIHJlc3VsdCA9IG51bGw7Ci0gICAgLyoKLSAgICBET01FeHRlbnNpb24gZG9tRXh0ZW5zaW9uID0gRE9NRXh0ZW5zaW9uUHJvdmlkZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldERPTUV4dGVuc2lvbihkb2N1bWVudCk7Ci0gICAgaWYgKGRvbUV4dGVuc2lvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGRvbUV4dGVuc2lvbi5nZXRJbXBsaWNpdERvY3R5cGUoKTsKLSAgICB9Ki8KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQoTm9kZSBub2RlKQotICB7ICAgICAgICAKLSAgICByZXR1cm4gZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQobm9kZSwgdHJ1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ01Eb2N1bWVudCBnZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChOb2RlIG5vZGUsIGJvb2xlYW4gZ2V0RG9jdW1lbnRGcm9tQ01Ob2RlKQotICB7ICAgICAgICAgICAgCi0gICAgQ01Eb2N1bWVudCByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudClub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAKLSAgICAgIFN0cmluZ1tdIGRvY3R5cGVJbmZvID0gZ2V0RG9jdHlwZUluZm8oZG9jdW1lbnQpOwotCi0gICAgICBpZiAoZG9jdHlwZUluZm8gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudChkb2N0eXBlSW5mb1swXSwgZG9jdHlwZUluZm9bMV0sICJEVEQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgLy8gZGVmZWN0IDIxMTIzNiAuLi4gaW4gc29tZSBjYXNlcyBjYWxsaW5nIHRoaXMgbWV0aG9kIGNhbiByZXN1bHQgaW4gYSBjeWNsZQotICAgICAgLy8gd2UgdXNlIHRoZSBnZXREb2N1bWVudEZyb21DTU5vZGUgYXMgYSBmbGFnIHRvIGF2b2lkIHRoaXMgCi0gICAgICAvLyBUT0RPLi4uIHNlZSBpZiB0aGVyZSBpcyBhIHdheSB0byByZS1vcmdhbml6ZSB0byBhdm9pZCB0aGUgbmVlZCBmb3IgdGhpcyBmbGFnCi0gICAgICBlbHNlIGlmIChnZXREb2N1bWVudEZyb21DTU5vZGUpCi0gICAgICB7Ci0gICAgICAgIENNTm9kZSBjbU5vZGUgPSBnZXRDTU5vZGUobm9kZSk7Ci0gICAgICAgIGlmIChjbU5vZGUgIT0gbnVsbCkgICAgICAgCi0gICAgICAgIHsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgLy8gdG9kby4uLiBhZGQgYSBnZXRDTURvY3VtZW50KCkgbWV0aG9kcyB0byBDTU5vZGUKLSAgICAgICAgICAvLyBmb3Igbm93IHVzZSB0aGUgZ2V0UHJvcGVydHkgaW50ZXJmYWNlCi0gICAgICAgICAgcmVzdWx0ID0gKENNRG9jdW1lbnQpY21Ob2RlLmdldFByb3BlcnR5KCJDTURvY3VtZW50Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGxvY2F0aW5nIENNRG9jdW1lbnQgZm9yICIgKyBub2RlLCBlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgIAotCi0gICAgICAKLSAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpCi0gIHsKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgTmFtZXNwYWNlVGFibGUgbmFtZXNwYWNlVGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgIG5hbWVzcGFjZVRhYmxlLmFkZEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgIE5hbWVzcGFjZUluZm8gbmFtZXNwYWNlSW5mbyA9IG5hbWVzcGFjZVRhYmxlLmdldE5hbWVzcGFjZUluZm9Gb3JVUkkodXJpKTsKLSAgICBpZiAobmFtZXNwYWNlSW5mbyAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGdldENNRG9jdW1lbnQobmFtZXNwYWNlSW5mby51cmksIG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgIAotICAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQsIFN0cmluZyB0eXBlKQotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIC8vU3RyaW5nIHJlc29sdmVkR3JhbW1hclVSSSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBwdWJsaWNJZCwgc3lzdGVtSWQpOwotICAgIHJldHVybiBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgc3lzdGVtSWQsIHR5cGUpOyAgCi0gIH0KLQotICAvL3B1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAvL3sgICAgICAgICAgICAgICAgICAgCi0gIC8vICAvL1N0cmluZyByZXNvbHZlZEdyYW1tYXJVUkkgPSByZXNvbHZlR3JhbW1hclVSSShkb2N1bWVudCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgLy8gIHJldHVybiBkb2N1bWVudE1hbmFnZXIuZ2V0Q01Eb2N1bWVudChwdWJsaWNJZCwgc3lzdGVtSWQpOyAgCi0gIC8vfQotICAgCi0gIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICByZXR1cm4gcmVzb2x2ZUdyYW1tYXJVUkkobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzcGVjaWFsaXplZCBpbiBvcmRlciB0byBpbXBsZW1lbnQgc3BlY2lhbGl6ZWQgdXJpIHJlc29sdXRpb24KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZUdyYW1tYXJVUkkoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICB7Ci0gICAgcmV0dXJuIHN5c3RlbUlkOwotICB9Ci0gIAotCi0gIHB1YmxpYyBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpCi0gIHsgCi0gICAgQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsgCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBTdHJpbmdbXSBkb2N0eXBlSW5mbyA9IGdldERvY3R5cGVJbmZvKGRvY3VtZW50KTsKLSAgICBpZiAoZG9jdHlwZUluZm8gIT0gbnVsbCkKLSAgICB7ICAgCi0gICAgICAvLyB3ZSBoYXZlIGRldGVjdGVkIGRvY3R5cGUgaW5mb3JtYXRpb24gc28gd2UgYXNzdW1lIHRoYXQgd2UgY2FuIGxvY2F0ZSB0aGUgQ01FbGVtZW50RGVjbGFyYXRpb24gCi0gICAgICAvLyBpbiB0aGUgQ01Eb2N1bWVudCdzIHRhYmxlIG9mIGdsb2JhbCBlbGVtZW50cyAKLSAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KGVsZW1lbnQsIGZhbHNlKTsKLQotICAgICAgLy8gVE9ETy4uLiBjb25zaWRlciByZXBsYWNpbmcgYWJvdmUgd2l0aCAKLSAgICAgIC8vIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoZG9jdW1lbnQsIGRvY3R5cGVJbmZvWzBdLCBkb2N0eXBlSW5mb1sxXSk7Ci0KLSAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKWNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXROYW1lZEl0ZW0oZWxlbWVudC5nZXROb2RlTmFtZSgpKTsgICAgCi0gICAgICAgICAgICAgICAgIAotICAgICAgICAvLyB0aGlzIGlzIGEgaGFjayB0byBnZXQgb3VyIHhzbCBjb2RlIGFzc2lzdCB3b3JraW5nLi4uIHdlIG1pZ2h0IHdhbnQgdG8gaGFuZGxlIHNpbWlsYXIKLSAgICAgICAgLy8gZ3JhbW1hciBiZWhhdmlvdXIgdmlhIHNvbWUgZXN0YWJsaXNoZWQgbW9kZWwgcXVlcnkgc2V0dGluZyAKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsICYmIGdldEltcGxpY3REb2N0eXBlKGRvY3VtZW50KSAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLSAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpcGFyZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAgIAotICAgIGVsc2UKLSAgICB7ICAKLSAgICAgIC8vIGhlcmUgd2UgdXNlIGEgbmFtZXNwYWNlVGFibGUgdG8gY29uc2lkZXIgaWYgdGhlIHJvb3QgZWxlbWVudCBoYXMgYW55IG5hbWVzcGFjZSBpbmZvcm1hdGlvbgotICAgICAgLy8KLSAgICAgIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLSAgICAgIExpc3QgbGlzdCA9IE5hbWVzcGFjZVRhYmxlLmdldEVsZW1lbnRMaW5lYWdlKGVsZW1lbnQpOwotICAgICAgRWxlbWVudCByb290RWxlbWVudCA9IChFbGVtZW50KWxpc3QuZ2V0KDApOwotICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChyb290RWxlbWVudCk7Ci0gICAgICAgICAKLSAgICAgIGlmIChuYW1lc3BhY2VUYWJsZS5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gd2UgYXNzdW1lIHRoYXQgdGhpcyBpcyBhbiBYTUxTY2hlbWEgc3R5bGUgbmFtZXNwYWNlIGF3YXJlIGRvY3VtZW50Ci0gICAgICAgIHJlc3VsdCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQsIGxpc3QsIG5hbWVzcGFjZVRhYmxlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsgCi0gICAgICAgIC8vIHdlIGFzc3VtZSB0aGF0IHRoaXMgaXMgYW4gaW5mZXJyZWQgQ01Eb2N1bWVudCBmb3IgYSBEVEQgc3R5bGUgJ25hbWVzcGFjZWxlc3MnIGRvY3VtZW50Ci0gICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQoIiIsICIiLCAiRFREIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY21Eb2N1bWVudC5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShlbGVtZW50LmdldE5vZGVOYW1lKCkpOyAKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gICAgICAgICAgICAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAKLSAgICAgCi0KLSAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgdGFyZ2V0RWxlbWVudCwgTGlzdCBsaXN0LCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgeyAgICAgICAgIAotICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGN1cnJlbnRFRCA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgeyAgICAKLSAgICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgaSsrKQotICAgICAgewotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudClsaXN0LmdldChpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBub2RlTmFtZSA9IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLSAgICAgICAgU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKG5vZGVOYW1lKTsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRQcmVmaXgobm9kZU5hbWUpOwotIAotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0gCi0gICAgICAgIC8vIHNlZSBpZiB0aGUgZWxlbWVudCBpcyBhIGxvY2FsIG9mIHRoZSBjdXJyZW50RUQKLSAgICAgICAgLy8gICAgICAgICAgICAgCi0gICAgICAgIGlmIChjdXJyZW50RUQgIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pY3VycmVudEVELmdldExvY2FsRWxlbWVudHMoKS5nZXROYW1lZEl0ZW0odW5wcmVmaXhlZE5hbWUpOwotICAgICAgICB9IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAoZWQgPT0gbnVsbCkgCi0gICAgICAgIHsgICAgICAgICAgICAgICAKLSAgICAgICAgICBOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvRm9yUHJlZml4KHByZWZpeCk7ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIGlmIChuYW1lc3BhY2VJbmZvICE9IG51bGwpIAotICAgICAgICAgIHsKLSAgICAgICAgICAgIENNRG9jdW1lbnQgY21Eb2N1bWVudCA9IGdldENNRG9jdW1lbnQobmFtZXNwYWNlSW5mby51cmksIG5hbWVzcGFjZUluZm8ubG9jYXRpb25IaW50LCAiWFNEIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpCi0gICAgICAgICAgICB7IAotICAgICAgICAgICAgICBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbiljbURvY3VtZW50LmdldEVsZW1lbnRzKCkuZ2V0TmFtZWRJdGVtKHVucHJlZml4ZWROYW1lKTsgICAKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIGN1cnJlbnRFRCA9IGVkOyAgICAgCi0KLSAgICAgICAgLy8gaGFuZGxlIFhTSVR5cGUgICAgIAotICAgICAgICBpZiAoY3VycmVudEVEICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBkZXJpdmVkRUQgPSBnZXREZXJpdmVkQ01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCwgY3VycmVudEVELCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgICAgaWYgKGRlcml2ZWRFRCAhPSBudWxsKQotICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIGN1cnJlbnRFRCA9IGRlcml2ZWRFRDsKLSAgICAgICAgICB9ICAgIAotICAgICAgICB9Ci0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7IAotICAgICAgTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGxvY2F0aW5nIGVsZW1lbnQgZGVjbGFyYXRpb24gZm9yICIgKyB0YXJnZXRFbGVtZW50LCBlKTsgLy8kTk9OLU5MUy0xJAotICAgIH0gCi0gIAotICAgIHJldHVybiBjdXJyZW50RUQ7Ci0gIH0gIAotICAgICAgCi0KLSAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotICAgIFN0cmluZyB4c2lQcmVmaXggPSBuYW1lc3BhY2VUYWJsZS5nZXRQcmVmaXhGb3JVUkkoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoeHNpUHJlZml4ICE9IG51bGwpCi0gICAgewotICAgICAgU3RyaW5nIHhzaVR5cGVWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKHhzaVByZWZpeCArICI6dHlwZSIpOyAvLyROT04tTkxTLTEkCi0gICAgICBpZiAoeHNpVHlwZVZhbHVlICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgU3RyaW5nIHR5cGVQcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KHhzaVR5cGVWYWx1ZSk7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZSh4c2lUeXBlVmFsdWUpOwotICAgICAgICBTdHJpbmcgdHlwZVVSSSA9IG5hbWVzcGFjZVRhYmxlLmdldFVSSUZvclByZWZpeCh0eXBlUHJlZml4KTsKLSAgICAgICAgU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lID0gdHlwZU5hbWU7Ci0gICAgICAgIGlmICh0eXBlVVJJICE9IG51bGwgJiYgdHlwZVVSSS5sZW5ndGgoKSA+IDApIAotICAgICAgICB7Ci0gICAgICAgICAgdXJpUXVhbGlmaWVkVHlwZU5hbWUgPSAiWyIgKyAgdHlwZVVSSSArICJdIiArIHR5cGVOYW1lOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICByZXN1bHQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWQuZ2V0UHJvcGVydHkoIkRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb249IiArIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsgICAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi0KLQotICBwdWJsaWMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikKLSAgewotICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLSAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgIGlmIChlbGVtZW50ICE9IG51bGwpCi0gICAgewotICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLSAgICAgIGlmIChlZCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICByZXN1bHQgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbillZC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgIC8vIHRyeSB0byBnZXQgdGhlIHVucHJlZml4ZWQgbmFtZSAgICAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgbmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgcmVzdWx0ID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pZWQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShuYW1lKTsKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB0b2RvLi4uIHBlcmhhcHMgdGhpcyBpcyBhIGdsb2JhbGx5IGRlZmluZWQgYXR0cmlidXRlLi4uIAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgICAgICAgICAKLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIGxpc3Qgb2YgQ01Eb2N1bWVudFJlZmVyZW5jZXMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBub2RlIG9yIHN1YnRyZWUKLSAgICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgTGlzdCBnZXRDTURvY3VtZW50UmVmZXJlbmNlcyhOb2RlIG5vZGUsIGJvb2xlYW4gZGVlcCkKLSAgeyAKLSAgICBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsgIAotICAgIERvY3VtZW50IGRvY3VtZW50ID0gKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpID8gKERvY3VtZW50KW5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICBEb2N1bWVudFR5cGUgZG9jdHlwZSA9IGRvY3VtZW50LmdldERvY3R5cGUoKTsKLSAgICAvLyBkZWZlY3QgMjA2ODMzIC4uLiBoZXJlIHdlIHRlc3QgZm9yIERURHMgdGhhdCBhcmUgZGVjbGFyZWQgaW5saW5lCi0gICAgLy8gc2luY2Ugd2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIG1ha2luZyB1c2Ugb2YgaW5saW5lIERURHMgd2UgaW5nb3JlIHRoZW0KLSAgICAvLyBzbyB0aGF0IHRoZSBpbXBsaWN0IERURCAoaWYgYW55KSBjYW4gYmUgdXNlZAotICAgIGlmIChkb2N0eXBlICE9IG51bGwgJiYgKGRvY3R5cGUuZ2V0UHVibGljSWQoKSAhPSBudWxsIHx8IGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHVyaSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBkb2N0eXBlLmdldFB1YmxpY0lkKCksIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSk7Ci0gICAgICByZXN1bHQuYWRkKG5ldyBDTURvY3VtZW50UmVmZXJlbmNlSW1wbChkb2N0eXBlLmdldFB1YmxpY0lkKCksIHVyaSkpOwotICAgIH0gICAKLSAgICBlbHNlIGlmIChnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCkgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgCi0gICAgICBTdHJpbmdbXSBpbXBsaWNpdERvY3R5cGUgPSBnZXRJbXBsaWN0RG9jdHlwZShkb2N1bWVudCk7Ci0gICAgICBTdHJpbmcgdXJpID0gcmVzb2x2ZUdyYW1tYXJVUkkoZG9jdW1lbnQsIGltcGxpY2l0RG9jdHlwZVswXSwgaW1wbGljaXREb2N0eXBlWzFdKTsKLSAgICAgIHJlc3VsdC5hZGQobmV3IENNRG9jdW1lbnRSZWZlcmVuY2VJbXBsKGltcGxpY2l0RG9jdHlwZVswXSwgdXJpKSk7Ci0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGVsc2UKLSAgICB7ICAgCi0gICAgICBOYW1lc3BhY2VUYWJsZSBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotCQkgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoZGVlcCkKLSAgICAgIHsKLSAgICAgICAgYWRkQ2hpbGRFbGVtZW50c1RvTmFtZXNwYWNlVGFibGUobm9kZSwgbmFtZXNwYWNlVGFibGUpOwotICAgICAgfQotCSAgICBMaXN0IGxpc3QgPSBuYW1lc3BhY2VUYWJsZS5nZXROYW1lc3BhY2VJbmZvTGlzdCgpOwotCQkgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSAKLSAgICAgIHsKLQkJCSAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOyAgICAKLSAgICAgICAgU3RyaW5nIHVyaSA9IHJlc29sdmVHcmFtbWFyVVJJKGRvY3VtZW50LCBpbmZvLnVyaSwgaW5mby5sb2NhdGlvbkhpbnQpOwotICAgICAgICByZXN1bHQuYWRkKG5ldyBDTURvY3VtZW50UmVmZXJlbmNlSW1wbChpbmZvLnVyaSwgdXJpKSk7Ci0JCSAgfQkKLSAgICB9IAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDaGlsZEVsZW1lbnRzVG9OYW1lc3BhY2VUYWJsZShOb2RlIG5vZGUsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLQkgIGlmIChub2RlTGlzdCAhPSBudWxsKSAKLSAgICB7Ci0JCSAgaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSAKLSAgICAgIHsKLQkJCSAgTm9kZSBjaGlsZE5vZGUgPSBub2RlTGlzdC5pdGVtKGkpOwotICAgICAgICBpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgIHsgICAKLSAgICAgICAgICBuYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50KChFbGVtZW50KWNoaWxkTm9kZSk7Ci0gICAgICAgICAgYWRkQ2hpbGRFbGVtZW50c1RvTmFtZXNwYWNlVGFibGUoY2hpbGROb2RlLCBuYW1lc3BhY2VUYWJsZSk7Ci0gICAgICAgIH0KLQkJICB9Ci0JICB9Ci0gIH0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRGVzY3JpcHRpb25CdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwODQ1MjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01EZXNjcmlwdGlvbkJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBDTURlc2NyaXB0aW9uQnVpbGRlciBleHRlbmRzIENNVmlzaXRvcgotewotICBwcm90ZWN0ZWQgU3RyaW5nQnVmZmVyIHNiOwotICBwcm90ZWN0ZWQgQ01Ob2RlIHJvb3Q7Ci0gIHByb3RlY3RlZCBib29sZWFuIGlzUm9vdFZpc2l0ZWQ7Ci0KLSAgcHVibGljIFN0cmluZyBidWlsZERlc2NyaXB0aW9uKENNTm9kZSBub2RlKQotICB7Ci0gICAgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgcm9vdCA9IG5vZGU7Ci0gICAgaXNSb290VmlzaXRlZCA9IGZhbHNlOwotICAgIHZpc2l0Q01Ob2RlKG5vZGUpOwotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9ICAgICAgIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7Ci0gICAgc2IuYXBwZW5kKCJuYW1lc3BhY2U6dXJpPVwiIiArIGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCkgKyAiXCIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRGF0YVR5cGUoQ01EYXRhVHlwZSBkYXRhVHlwZSkKLSAgewotICAgIHNiLmFwcGVuZCgiI1BDREFUQSIpOyAvLyROT04tTkxTLTEkCi0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNRG9jdW1lbnQoQ01Eb2N1bWVudCBkb2N1bWVudCkKLSAgewotICAgIENNTmFtZWROb2RlTWFwIG1hcCA9IGRvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0gICAgaW50IHNpemUgPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobWFwLml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Hcm91cChDTUdyb3VwIGdyb3VwKQotICB7Ci0gICAgaW50IG9wID0gZ3JvdXAuZ2V0T3BlcmF0b3IoKTsKLSAgICBpZiAob3AgPT0gQ01Hcm91cC5BTEwpCi0gICAgewotICAgICAgc2IuYXBwZW5kKCJhbGwiKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHNiLmFwcGVuZCgiKCIpOyAvLyROT04tTkxTLTEkCi0KLSAgICBTdHJpbmcgc2VwYXJhdG9yID0gIiwgIjsgLy8kTk9OLU5MUy0xJAotCi0gICAgaWYgKG9wID09IENNR3JvdXAuQ0hPSUNFKQotICAgIHsKLSAgICAgIHNlcGFyYXRvciA9ICIgfCAiOyAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGdyb3VwLmdldENoaWxkTm9kZXMoKTsKLSAgICBpbnQgc2l6ZSA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG5vZGVMaXN0Lml0ZW0oaSkpOwotICAgICAgaWYgKGkgPCBzaXplIC0gMSkKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKHNlcGFyYXRvcik7Ci0gICAgICB9Ci0gICAgfQotICAgIHNiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgYWRkT2NjdXJlbmNlU3ltYm9sKGdyb3VwKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsKLSAgICBpZiAoZWQgPT0gcm9vdCAmJiAhaXNSb290VmlzaXRlZCkKLSAgICB7Ci0gICAgICBpc1Jvb3RWaXNpdGVkID0gdHJ1ZTsKLSAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgaWYgKGNvbnRlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNvbnRlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBDTU5vZGUuR1JPVVApCi0gICAgICAgIHsKLSAgICAgICAgICBzYi5hcHBlbmQoIigiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotICAgICAgICAgIHNiLmFwcGVuZCgiKSIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUoY29udGVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNiLmFwcGVuZChlZC5nZXRFbGVtZW50TmFtZSgpKTsKLSAgICAgIGFkZE9jY3VyZW5jZVN5bWJvbChlZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkT2NjdXJlbmNlU3ltYm9sKENNQ29udGVudCBjb250ZW50KQotICB7Ci0gICAgaW50IG1pbiA9IGNvbnRlbnQuZ2V0TWluT2NjdXIoKTsKLSAgICBpbnQgbWF4ID0gY29udGVudC5nZXRNYXhPY2N1cigpOwotICAgIGlmIChtaW4gPT0gMCkKLSAgICB7Ci0gICAgICBpZiAobWF4ID4gMSB8fCBtYXggPT0gLTEpCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHNiLmFwcGVuZCgiPyIpOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKG1heCA+IDEgfHwgbWF4ID09IC0xKQotICAgIHsKLSAgICAgIHNiLmFwcGVuZCgiKyIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9DTURvY3VtZW50Q2FjaGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJhOTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLQotLyoqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQ01Eb2N1bWVudENhY2hlCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfTk9UX0xPQURFRCA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNUQVRVU19MT0FESU5HICAgID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RBVFVTX0xPQURFRCAgICAgPSAzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTVEFUVVNfRVJST1IgICAgICA9IDQ7Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEVudHJ5Ci0gIHsKLSAgICBwdWJsaWMgU3RyaW5nIHVyaTsKLSAgICBwdWJsaWMgaW50IHN0YXR1cyA9IFNUQVRVU19OT1RfTE9BREVEOwotICAgIHB1YmxpYyBmbG9hdCBwcm9ncmVzczsKLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotCi0gICAgcHVibGljIEVudHJ5KFN0cmluZyB1cmkpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMudXJpID0gdXJpOyAgICAgICAgIAotICAgIH0KLQotICAgIHB1YmxpYyBFbnRyeShTdHJpbmcgdXJpLCBpbnQgc3RhdHVzLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHRoaXMudXJpID0gdXJpOwotICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7ICAgICAgCi0gICAgICB0aGlzLmNtRG9jdW1lbnQgPSBjbURvY3VtZW50OwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlOwotICBwcm90ZWN0ZWQgTGlzdCBsaXN0ZW5lckxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLQotICAvKioKLSAgICogdGVtcG9yYXJpbHkgcHVibGljIHVudGlsIGNhY2hpbmcgcHJvYmxlbSBpcyBzb2x2ZWQKLSAgICovCi0gIHB1YmxpYyBDTURvY3VtZW50Q2FjaGUoKQotICB7Ci0gICAgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBsaXN0ZW5lckxpc3QuYWRkKGxpc3RlbmVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgbGlzdGVuZXJMaXN0LnJlbW92ZShsaXN0ZW5lcik7Ci0gIH0gICAKLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoU3RyaW5nIGdyYW1tYXJVUkkpCi0gIHsKLSAgICBDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKGdyYW1tYXJVUkkgIT0gbnVsbCkKLSAgICB7ICAKLSAgICAgIEVudHJ5IGVudHJ5ID0gKEVudHJ5KWhhc2h0YWJsZS5nZXQoZ3JhbW1hclVSSSk7Ci0gICAgICBpZiAoZW50cnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZW50cnkuY21Eb2N1bWVudDsKLSAgICAgIH0gICAKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLQotICAvKioKLSAgICoKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKFN0cmluZyBncmFtbWFyVVJJKQotICB7Ci0gICAgaW50IHJlc3VsdCA9IFNUQVRVU19OT1RfTE9BREVEOwotICAgIGlmIChncmFtbWFyVVJJICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSloYXNodGFibGUuZ2V0KGdyYW1tYXJVUkkpOwotICAgICAgaWYgKGVudHJ5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGVudHJ5LnN0YXR1czsKLSAgICAgIH0gICAgICAKLSAgICAgIAotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgRW50cnkgbG9va3VwT3JDcmVhdGUoU3RyaW5nIGdyYW1tYXJVUkkpCi0gIHsKLSAgICBFbnRyeSBlbnRyeSA9IChFbnRyeSloYXNodGFibGUuZ2V0KGdyYW1tYXJVUkkpOwotICAgIGlmIChlbnRyeSA9PSBudWxsKQotICAgIHsKLSAgICAgIGVudHJ5ID0gbmV3IEVudHJ5KGdyYW1tYXJVUkkpOyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBoYXNodGFibGUucHV0KGdyYW1tYXJVUkksIGVudHJ5KTsKLSAgICB9Ci0gICAgcmV0dXJuIGVudHJ5OwotICB9Ci0KLSAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBwdXRDTURvY3VtZW50KFN0cmluZyBncmFtbWFyVVJJLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBpZiAoZ3JhbW1hclVSSSAhPSBudWxsICYmIGNtRG9jdW1lbnQgIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBFbnRyeSBlbnRyeSA9IGxvb2t1cE9yQ3JlYXRlKGdyYW1tYXJVUkkpOwotICAgICAgaW50IG9sZFN0YXR1cyA9IGVudHJ5LnN0YXR1czsKLSAgICAgIGVudHJ5LnN0YXR1cyA9IFNUQVRVU19MT0FERUQ7Ci0gICAgICBlbnRyeS5jbURvY3VtZW50ID0gY21Eb2N1bWVudDsgIAotICAgICAgbm90aWZ5Q2FjaGVVcGRhdGVkKGdyYW1tYXJVUkksIG9sZFN0YXR1cywgZW50cnkuc3RhdHVzLCBlbnRyeS5jbURvY3VtZW50KTsgIAotICAgIH0KLSAgfQotICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoU3RyaW5nIGdyYW1tYXJVUkksIGludCBzdGF0dXMpCi0gIHsKLSAgICBpZiAoZ3JhbW1hclVSSSAhPSBudWxsKQotICAgIHsKLSAgICAgIEVudHJ5IGVudHJ5ID0gbG9va3VwT3JDcmVhdGUoZ3JhbW1hclVSSSk7Ci0gICAgICBpbnQgb2xkU3RhdHVzID0gZW50cnkuc3RhdHVzOwotICAgICAgZW50cnkuc3RhdHVzID0gc3RhdHVzOwotICAgICAgbm90aWZ5Q2FjaGVVcGRhdGVkKGdyYW1tYXJVUkksIG9sZFN0YXR1cywgZW50cnkuc3RhdHVzLCBlbnRyeS5jbURvY3VtZW50KTsgICAKLSAgICB9Ci0gIH0KLSAgICAgCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXIoKQotICB7Ci0gICAgaGFzaHRhYmxlLmNsZWFyKCk7Ci0gICAgbm90aWZ5Q2FjaGVDbGVhcmVkKCk7Ci0gIH0gIAotCi0gIC8qKgotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgbm90aWZ5Q2FjaGVVcGRhdGVkKFN0cmluZyB1cmksIGludCBvbGRTdGF0dXMsIGludCBuZXdTdGF0dXMsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkKLSAgeyAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBsaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lciBsaXN0ZW5lciA9IChDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLmNhY2hlVXBkYXRlZCh0aGlzLCB1cmksIG9sZFN0YXR1cywgbmV3U3RhdHVzLCBjbURvY3VtZW50KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG5vdGlmeUNhY2hlQ2xlYXJlZCgpCi0gIHsgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBsaXN0LmFkZEFsbChsaXN0ZW5lckxpc3QpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBDTURvY3VtZW50Q2FjaGVMaXN0ZW5lciBsaXN0ZW5lciA9IChDTURvY3VtZW50Q2FjaGVMaXN0ZW5lcilpLm5leHQoKTsKLSAgICAgIGxpc3RlbmVyLmNhY2hlQ2xlYXJlZCh0aGlzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyBMaXN0IGdldENNRG9jdW1lbnRzKCkKLSAgewotICAJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOyAgCQotICAJZm9yIChJdGVyYXRvciBpID0gaGFzaHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gIAl7Ci0gIAkJRW50cnkgZW50cnkgPSAoRW50cnkpaS5uZXh0KCk7Ci0gIAkJbGlzdC5hZGQoZW50cnkuY21Eb2N1bWVudCk7Ci0gIAl9Ci0gIAlyZXR1cm4gbGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNRG9jdW1lbnRDYWNoZUxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1NWY0ZGQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01Eb2N1bWVudENhY2hlTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotCi0KLS8qKgotICogdG9kby4uLiBhZGQgbW9yZSBpbnRlcmZhY2UgbWV0aG9kcwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRDYWNoZUxpc3RlbmVyCi17Ci0gIC8qKiBUZWxscyB0aGUgY2xpZW50IHRoYXQgdGhlIGNhY2hlIGhhcyBiZWVuIGNsZWFyZWQuCi0gICAqICBUaGlzIGdpdmVzIGNsaWVudHMgYW4gb3Bwb3J0dW5pdHkgdG8gZmx1c2ggYW55IHN0YXRlIHRoYXQgZGVwZW5kcyBvbiB0aGUgQ01Eb2N1bWVudAotICAgKiAgc2luY2UgdGhpcyBDTURvY3VtZW50IHdpbGwgYmUgcmVjb21wdXRlZCBvbiBhIHN1YnNlcXVlbnQgJ2xvb2t1cCcgcmVxdWVzdAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSk7IAotCi0gIC8qKiAKLSAgICogIFRlbGxzIHRoZSBjbGllbnQgdGhhdCB0aGUgY2FjaGUgaGFzIGJlZW4gdXBkYXRlZC4gIAotICAgKi8KLSAgcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NNVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01WaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTE0YzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ01WaXNpdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLQotcHVibGljIGNsYXNzIENNVmlzaXRvcgotewotICBwcm90ZWN0ZWQgaW50IGluZGVudCA9IDA7Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTU5vZGUoQ01Ob2RlIG5vZGUpCi0gIHsKLSAgICBpZiAobm9kZSAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5wcmludGxuSW5kZW50ZWQoInZpc2l0Q01Ob2RlIDogIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKSArICIgIiArIG5vZGUpOwotICAgICAgaW5kZW50ICs9IDI7Ci0gICAgICBpbnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0gICAgICBzd2l0Y2ggKG5vZGVUeXBlKQotICAgICAgewotICAgICAgICBjYXNlIENNTm9kZS5BTllfRUxFTUVOVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNQW55RWxlbWVudCgoQ01BbnlFbGVtZW50KW5vZGUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oKENNQXR0cmlidXRlRGVjbGFyYXRpb24pbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuREFUQV9UWVBFIDoKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0Q01EYXRhVHlwZSgoQ01EYXRhVHlwZSlub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5ET0NVTUVOVCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNRG9jdW1lbnQoKENNRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKChDTUVsZW1lbnREZWNsYXJhdGlvbilub2RlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIENNTm9kZS5HUk9VUCA6Ci0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdENNR3JvdXAoKENNR3JvdXApbm9kZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGluZGVudCAtPSAyOwotICAgIH0KLSAgfQotICAgICAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01Eb2N1bWVudChDTURvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgQ01OYW1lZE5vZGVNYXAgbWFwID0gZG9jdW1lbnQuZ2V0RWxlbWVudHMoKTsKLSAgICBpbnQgc2l6ZSA9IG1hcC5nZXRMZW5ndGgoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICB2aXNpdENNTm9kZShtYXAuaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZ3JvdXApCi0gIHsKLSAgICBDTU5vZGVMaXN0IG5vZGVMaXN0ID0gZ3JvdXAuZ2V0Q2hpbGROb2RlcygpOwotICAgIGludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0gICAgewotICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbShpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkKLSAgewotICAgIENNTmFtZWROb2RlTWFwIG5vZGVNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgaW50IHNpemUgPSBub2RlTWFwLmdldExlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQotICAgIHsKLSAgICAgIHZpc2l0Q01Ob2RlKG5vZGVNYXAuaXRlbShpKSk7Ci0gICAgfQotCi0gICAgdmlzaXRDTU5vZGUoZWQuZ2V0Q29udGVudCgpKTsKLQotICAgIHZpc2l0Q01EYXRhVHlwZShlZC5nZXREYXRhVHlwZSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0NvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWNkMDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQW55RWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotCi0gICAgICAgICAgICAgICAgICAgCi0vKioKLSAqIFRoaXMgY2xhc3MgbGV0cyB5b3UgdHJhdmVyc2UgYSAnQ00nIG1vZGVsIHByb3ZpZGluZyBjYWxsYmFja3MgdG8gYnVpbGQgY29udGVudC4KLSAqLwotcHVibGljIGNsYXNzIENvbnRlbnRCdWlsZGVyIGV4dGVuZHMgQ01WaXNpdG9yCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVSUxEX0FMTF9DT05URU5UID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UID0gMjsKLSAgcHJvdGVjdGVkIGludCBidWlsZFBvbGljeSA9IEJVSUxEX0FMTF9DT05URU5UOwotCi0gIHByb3RlY3RlZCBib29sZWFuIGFsd2F5c1Zpc2l0OwotICBwcm90ZWN0ZWQgVmVjdG9yIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHVibGljIENvbnRlbnRCdWlsZGVyKCkKLSAgewotICB9Ci0gICAgICAgICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIHNldEJ1aWxkUG9saWN5KGludCBidWlsZFBvbGljeSkKLSAgewotICAgIHRoaXMuYnVpbGRQb2xpY3kgPSBidWlsZFBvbGljeTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QnVpbGRQb2xpY3koKQotICB7Ci0gICAgcmV0dXJuIGJ1aWxkUG9saWN5OwotICB9ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAKLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW55RWxlbWVudE5vZGUoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gIHsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnROb2RlU3RhcnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpCi0gIHsgICAgICAKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUVsZW1lbnROb2RlRW5kKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVUZXh0Tm9kZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gIH0gCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQXR0cmlidXRlTm9kZShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZSkKLSAgewotICB9IAotIAotICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICB7Ci0gICAgaW50IGZvcmNlZE1pbiA9IChidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fCBhbHdheXNWaXNpdCkgPyAxIDogMDsKLSAgICBpbnQgbWluID0gTWF0aC5tYXgoZWQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLSAgICBpZiAobWluID4gMCAmJiAhdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5jb250YWlucyhlZCkpCi0gICAgewotICAgICAgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5hZGQoZWQpOwotICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspCi0gICAgICB7ICAgICAgIAotICAgICAgICBjcmVhdGVFbGVtZW50Tm9kZVN0YXJ0KGVkKTsgICAgICAgCi0gICAgICAgIAotICAgICAgICAvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgICAgIC8vIHdlIGR1cGxpY2F0ZSB0aGUgY29kZSB3aXRoIHNvbWUgbWlub3IgbW9kaWZpY2F0aW9ucwotICAgICAgICBDTU5hbWVkTm9kZU1hcCBub2RlTWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotICAgICAgICBpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGopKTsKLSAgICAgICAgfQotCi0gICAgICAgIENNQ29udGVudCBjb250ZW50ID0gZWQuZ2V0Q29udGVudCgpOwotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUoY29udGVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZWQuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpCi0gICAgICAgIHsKLSAgICAgICAgICBDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLSAgICAgICAgICBpZiAoZGF0YVR5cGUgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2aXNpdENNRGF0YVR5cGUoZGF0YVR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBlbmQgZHVwbGljYXRpb24KLSAgICAgICAgY3JlYXRlRWxlbWVudE5vZGVFbmQoZWQpOyAgCi0gICAgICB9Ci0gICAgICBpbnQgc2l6ZSA9IHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3Quc2l6ZSgpOwotICAgICAgdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5yZW1vdmUoc2l6ZSAtIDEpOwotICAgIH0KLSAgfQotICAgIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01EYXRhVHlwZShDTURhdGFUeXBlIGRhdGFUeXBlKQotICB7Ci0gICAgY3JlYXRlVGV4dE5vZGUoZGF0YVR5cGUpOyAgIAotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB2aXNpdENNR3JvdXAoQ01Hcm91cCBlKQotICB7IAotICAgIGludCBmb3JjZWRNaW4gPSAoYnVpbGRQb2xpY3kgPT0gQlVJTERfQUxMX0NPTlRFTlQgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0gICAgaW50IG1pbiA9IE1hdGgubWF4KGUuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICB7ICAgCi0gICAgICBpZiAoZS5nZXRPcGVyYXRvcigpID09IENNR3JvdXAuQ0hPSUNFKQotICAgICAgewotICAgICAgICAvLyBhZGQgb25seSAxIGVsZW1lbnQgZnJvbSB0aGUgZ3JvdXAKLSAgICAgICAgLy8gdG9kby4uLiBwZXJoYXBzIGFkZCBzb21ldGhpbmcgb3RoZXIgdGhhbiB0aGUgZmlyc3Qgb25lICAgICAgICAKLSAgICAgICAgQ01Ob2RlTGlzdCBub2RlTGlzdCA9IGUuZ2V0Q2hpbGROb2RlcygpOwotICAgICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRDTU5vZGUobm9kZUxpc3QuaXRlbSgwKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgLy8gU0VRVUVOQ0UsIEFMTAotICAgICAgewotICAgICAgICAvLyB2aXNpdCBhbGwgb2YgdGhlIGNvbnRlbnQKLSAgICAgICAgc3VwZXIudmlzaXRDTUdyb3VwKGUpOwotICAgICAgfQotICAgIH0KLSAgfSAKLQotICBwdWJsaWMgdm9pZCB2aXNpdENNQXR0cmlidXRlRGVjbGFyYXRpb24oQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCkKLSAgewotICAgIGlmIChhbHdheXNWaXNpdCB8fAotICAgICAgICBidWlsZFBvbGljeSA9PSBCVUlMRF9BTExfQ09OVEVOVCB8fAotICAgICAgICBhZC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpCi0gICAgewotICAgICAgY3JlYXRlQXR0cmlidXRlTm9kZShhZCk7ICAgICAgCi0gICAgfQotICB9ICAgICAgICAgICAgICAgICAgICAgCi0gIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KQotICB7ICAKLSAgICBpbnQgZm9yY2VkTWluID0gKGJ1aWxkUG9saWN5ID09IEJVSUxEX0FMTF9DT05URU5UIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotICAgIGFsd2F5c1Zpc2l0ID0gZmFsc2U7IAotICAgIGludCBtaW4gPSBNYXRoLm1heChhbnlFbGVtZW50LmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtaW47IGkrKykKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGNyZWF0ZUFueUVsZW1lbnROb2RlKGFueUVsZW1lbnQpOwotICAgIH0KLSAgfSAgICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NQ29udGVudEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA3NjJlZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGludGVyZmFjZSBET01Db250ZW50QnVpbGRlcgotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9PUFRJT05BTF9BVFRSSUJVVEVTID0gMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfT1BUSU9OQUxfRUxFTUVOVFMgPSAxPDwxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9GSVJTVF9DSE9JQ0UgPSAxPDwyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCVUlMRF9URVhUX05PREVTID0gMTw8MzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVJTERfRklSU1RfU1VCU1RJVFVUSU9OID0gMTw8NDsKLSAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IAotICAgIEJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCA9Ci0gICAgICBCVUlMRF9GSVJTVF9DSE9JQ0UKLSAgICAgIHwgQlVJTERfVEVYVF9OT0RFUzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgCi0gICAgQlVJTERfQUxMX0NPTlRFTlQgPSAKLSAgICAgIEJVSUxEX09QVElPTkFMX0FUVFJJQlVURVMgCi0gICAgICB8IEJVSUxEX09QVElPTkFMX0VMRU1FTlRTIAotICAgICAgfCBCVUlMRF9GSVJTVF9DSE9JQ0UKLSAgICAgIHwgQlVJTERfVEVYVF9OT0RFUzsKLSAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9CVUlMRF9CTEFOS19URVhUX05PREVTID0gImJ1aWxkQmxhbmtUZXh0Tm9kZXMiOyAvLyROT04tTkxTLTEkCi0gIAotICBwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgYnVpbGRQb2xpY3kpOwotICBwdWJsaWMgaW50ICBnZXRCdWlsZFBvbGljeSgpOwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgdmFsdWUpOwotICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpOwotICBwdWJsaWMgTGlzdCBnZXRSZXN1bHQoKTsKLSAgcHVibGljIHZvaWQgYnVpbGQoTm9kZSBwYXJlbnQsIENNTm9kZSBjaGlsZCk7Ci0gIHB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbikgdGhyb3dzIEV4Y2VwdGlvbjsKLSAgcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uLCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB0aHJvd3MgRXhjZXB0aW9uOwotICBwdWJsaWMgdm9pZCBjcmVhdGVEZWZhdWx0Q29udGVudChOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHRocm93cyBFeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01Db250ZW50QnVpbGRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjU3YzVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTUNvbnRlbnRCdWlsZGVySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuQ01EYXRhVHlwZVZhbHVlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIHRvZG8uLi4gY29tbW9uIHVwIHRoaXMgY29kZSB3aXRoICdDb250ZW50QnVpbGRlcicKLSAqLwotcHVibGljIGNsYXNzIERPTUNvbnRlbnRCdWlsZGVySW1wbCBleHRlbmRzIENNVmlzaXRvciBpbXBsZW1lbnRzIERPTUNvbnRlbnRCdWlsZGVyIHsKLQlwcm90ZWN0ZWQgaW50IGJ1aWxkUG9saWN5ID0gQlVJTERfQUxMX0NPTlRFTlQ7Ci0JcHJvdGVjdGVkIEhhc2h0YWJsZSBwcm9wZXJ0eVRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgTGlzdCByZXN1bHRMaXN0OwotCXByb3RlY3RlZCBEb2N1bWVudCBkb2N1bWVudDsKLQlwcm90ZWN0ZWQgTm9kZSBjdXJyZW50UGFyZW50OwotCXByb3RlY3RlZCBOb2RlIHRvcFBhcmVudDsKLQlwcm90ZWN0ZWQgVmVjdG9yIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gYXR0YWNoTm9kZXNUb1BhcmVudCA9IHRydWU7Ci0JcHJvdGVjdGVkIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlOwotCi0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgcm9vdEVsZW1lbnQ7IC8vIHRoaXMgaXMgdXNlZCBvbmx5IHRlcG9yYXJpbHkgdmlhCi0JCQkJCQkJCQkvLyBjcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQKLQlwcm90ZWN0ZWQgRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0OwotCi0JcHVibGljIGJvb2xlYW4gc3VwcmVzc0NyZWF0aW9uT2ZEb2N0eXBlQW5kWE1MRGVjbGFyYXRpb247Ci0KLQlwcm90ZWN0ZWQgQ01EYXRhVHlwZVZhbHVlSGVscGVyIHZhbHVlSGVscGVyID0gbmV3IENNRGF0YVR5cGVWYWx1ZUhlbHBlcigpOwotCi0JcHJvdGVjdGVkIGludCBudW1PZlJlcGVhdGFibGVFbGVtZW50cyA9IDE7Ci0JcHJvdGVjdGVkIFN0YWNrIGNtR3JvdXBTdGFjayA9IG5ldyBTdGFjaygpOwotCi0JcHVibGljIGludGVyZmFjZSBFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0IHsKLQkJcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChFbGVtZW50IGVsZW1lbnQsIFN0cmluZyB1cmkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQoRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KSB7Ci0JCXRoaXMuZXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCA9IGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQ7Ci0JfQotCi0JcHVibGljIERPTUNvbnRlbnRCdWlsZGVySW1wbChEb2N1bWVudCBkb2N1bWVudCkgewotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCW5hbWVzcGFjZVRhYmxlID0gbmV3IE5hbWVzcGFjZVRhYmxlKGRvY3VtZW50KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRCdWlsZFBvbGljeShpbnQgYnVpbGRQb2xpY3kpIHsKLQkJdGhpcy5idWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0QnVpbGRQb2xpY3koKSB7Ci0JCXJldHVybiBidWlsZFBvbGljeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEFsbENvbnRlbnQoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX0FMTF9DT05URU5UKSA9PSBCVUlMRF9BTExfQ09OVEVOVDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE9wdGlvbmFsRWxlbWVudHMoaW50IHBvbGljeSkgewotCQlyZXR1cm4gKHBvbGljeSAmIEJVSUxEX09QVElPTkFMX0VMRU1FTlRTKSA9PSBCVUlMRF9PUFRJT05BTF9FTEVNRU5UUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZE9wdGlvbmFsQXR0cmlidXRlcyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUykgPT0gQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEZpcnN0Q2hvaWNlKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9GSVJTVF9DSE9JQ0UpID09IEJVSUxEX0ZJUlNUX0NIT0lDRTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZFRleHROb2RlcyhpbnQgcG9saWN5KSB7Ci0JCXJldHVybiAocG9saWN5ICYgQlVJTERfVEVYVF9OT0RFUykgPT0gQlVJTERfVEVYVF9OT0RFUzsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBidWlsZEZpcnN0U3Vic3RpdHV0aW9uKGludCBwb2xpY3kpIHsKLQkJcmV0dXJuIChwb2xpY3kgJiBCVUlMRF9GSVJTVF9TVUJTVElUVVRJT04pID09IEJVSUxEX0ZJUlNUX1NVQlNUSVRVVElPTjsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXRSZXN1bHQoKSB7Ci0JCXJldHVybiByZXN1bHRMaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUsIE9iamVjdCB2YWx1ZSkgewotCQlwcm9wZXJ0eVRhYmxlLnB1dChwcm9wZXJ0eU5hbWUsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJcmV0dXJuIHByb3BlcnR5VGFibGUuZ2V0KHByb3BlcnR5TmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgYnVpbGQoTm9kZSBwYXJlbnQsIENNTm9kZSBjaGlsZCkgewotCQlyZXN1bHRMaXN0ID0gbmV3IFZlY3RvcigpOwotCQl0b3BQYXJlbnQgPSBwYXJlbnQ7Ci0JCWN1cnJlbnRQYXJlbnQgPSBwYXJlbnQ7Ci0JCWlmIChwYXJlbnQgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQluYW1lc3BhY2VUYWJsZS5hZGRFbGVtZW50TGluZWFnZSgoRWxlbWVudCkgcGFyZW50KTsKLQkJfQotCQlhdHRhY2hOb2Rlc1RvUGFyZW50ID0gZmFsc2U7Ci0JCWFsd2F5c1Zpc2l0ID0gdHJ1ZTsKLQkJdmlzaXRDTU5vZGUoY2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRSb290Q29udGVudChDTURvY3VtZW50IGNtRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbiwgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLQkJY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KGNtRG9jdW1lbnQsIHJvb3RDTUVsZW1lbnREZWNsYXJhdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgY3JlYXRlRGVmYXVsdFJvb3RDb250ZW50KENNRG9jdW1lbnQgY21Eb2N1bWVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcm9vdENNRWxlbWVudERlY2xhcmF0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQkJU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSA9IGNtRG9jdW1lbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJaWYgKCFzdXByZXNzQ3JlYXRpb25PZkRvY3R5cGVBbmRYTUxEZWNsYXJhdGlvbikgewotCQkJLy8gVE9ETyBjcy4uLiBpbnZlc3RpZ2F0ZSB0byBzZWUgaWYgdGhpcyBjb2RlIHBhdGggaXMgZXZlciB1c2VkLAotCQkJLy8gZG9lc24ndCBzZWVtIHRvIGJlCi0JCQkvLyBmb3Igbm93IEknbSBzZXR0aW5nIHRoZSBlbmNvZGluZyB0byBVVEYtOCBqdXN0IGluY2FzZSB0aGlzIGNvZGUKLQkJCS8vIHBhdGggaXMgdXNlZCBzb21ld2hlcmUKLQkJCS8vCi0JCQlTdHJpbmcgcGlWYWx1ZSA9ICJ2ZXJzaW9uPVwiMS4wXCIiOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgZW5jb2RpbmcgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQlwaVZhbHVlICs9ICIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCIiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgICAgICAKLQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbigieG1sIiwgcGlWYWx1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKHBpKTsKLQotCQkJLy8gaWYgd2UgaGF2ZSBhICdkdGQnIHRoZW4gYWRkIGEgRE9DVFlQRSB0YWcKLQkJCS8vCi0JCQlpZiAoZ3JhbW1hckZpbGVOYW1lICE9IG51bGwgJiYgZ3JhbW1hckZpbGVOYW1lLmVuZHNXaXRoKCJkdGQiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCURPTUltcGxlbWVudGF0aW9uIGRvbUltcGwgPSBkb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQkJCURvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSBkb21JbXBsLmNyZWF0ZURvY3VtZW50VHlwZShyb290Q01FbGVtZW50RGVjbGFyYXRpb24uZ2V0RWxlbWVudE5hbWUoKSwgZ3JhbW1hckZpbGVOYW1lLCBncmFtbWFyRmlsZU5hbWUpOwotCQkJCWRvY3VtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50VHlwZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpZiB3ZSBoYXZlIGEgc2NoZW1hIGFkZCBhbiB4c2k6c2NoZW1hTG9jYXRpb24gYXR0cmlidXRlCi0JCS8vCi0JCWlmIChncmFtbWFyRmlsZU5hbWUgIT0gbnVsbCAmJiBncmFtbWFyRmlsZU5hbWUuZW5kc1dpdGgoInhzZCIpICYmIG5hbWVzcGFjZUluZm9MaXN0ICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIgbWFuYWdlciA9IG5ldyBET01OYW1lc3BhY2VJbmZvTWFuYWdlcigpOwotCQkJU3RyaW5nIG5hbWUgPSByb290Q01FbGVtZW50RGVjbGFyYXRpb24uZ2V0Tm9kZU5hbWUoKTsKLQkJCWlmIChuYW1lc3BhY2VJbmZvTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKTsKLQkJCQlpZiAoaW5mby5wcmVmaXggIT0gbnVsbCAmJiBpbmZvLnByZWZpeC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJbmFtZSA9IGluZm8ucHJlZml4ICsgIjoiICsgbmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCX0KLQkJCXJvb3RFbGVtZW50ID0gY3JlYXRlRWxlbWVudChyb290Q01FbGVtZW50RGVjbGFyYXRpb24sIG5hbWUsIGRvY3VtZW50KTsKLQkJCW1hbmFnZXIuYWRkTmFtZXNwYWNlSW5mbyhyb290RWxlbWVudCwgbmFtZXNwYWNlSW5mb0xpc3QsIHRydWUpOwotCQl9Ci0JCWNyZWF0ZURlZmF1bHRDb250ZW50KGRvY3VtZW50LCByb290Q01FbGVtZW50RGVjbGFyYXRpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZURlZmF1bHRDb250ZW50KE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCQljdXJyZW50UGFyZW50ID0gcGFyZW50OwotCQlhbHdheXNWaXNpdCA9IHRydWU7Ci0JCXZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oZWQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQpIHsKLQkJU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0JCXJldHVybiBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoY21Ob2RlLCBwYXJlbnQsIHByZWZpeCwgbmFtZXNwYWNlVGFibGUpOwotCX0KLQotCS8vIG92ZXJpZGUgdGhlIGZvbGxvd2luZyAnY3JlYXRlJyBtZXRob2RzIHRvIGNvbnRyb2wgaG93IG5vZGVzIGFyZSBjcmVhdGVkCi0JLy8KLQlwcm90ZWN0ZWQgRWxlbWVudCBjcmVhdGVFbGVtZW50KENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBTdHJpbmcgbmFtZSwgTm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSk7Ci0JfQotCi0JcHJvdGVjdGVkIEF0dHIgY3JlYXRlQXR0cmlidXRlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQsIFN0cmluZyBuYW1lLCBOb2RlIHBhcmVudCkgewotCQlyZXR1cm4gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBUZXh0IGNyZWF0ZVRleHROb2RlKENNRGF0YVR5cGUgZGF0YVR5cGUsIFN0cmluZyB2YWx1ZSwgTm9kZSBwYXJlbnQpIHsKLQkJcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQdXNoUGFyZW50KEVsZW1lbnQgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZVBvcFBhcmVudChFbGVtZW50IGVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JfQotCi0JLy8gVGhlIHJhbmdlIG11c3QgYmUgYmV0d2VlbiAxIGFuZCA5OS4KLQlwdWJsaWMgdm9pZCBzZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cyhpbnQgaSkgewotCQludW1PZlJlcGVhdGFibGVFbGVtZW50cyA9IGk7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpIHsKLQkJcmV0dXJuIG51bU9mUmVwZWF0YWJsZUVsZW1lbnRzOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01FbGVtZW50RGVjbGFyYXRpb24oQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJaW50IGZvcmNlZE1pbiA9IChidWlsZE9wdGlvbmFsRWxlbWVudHMoYnVpbGRQb2xpY3kpIHx8IGFsd2F5c1Zpc2l0KSA/IDEgOiAwOwotCQlpbnQgbWluID0gTWF0aC5tYXgoZWQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQotCQkvLyBDb3JyZWN0IHRoZSBtaW4gdmFsdWUgaWYgdGhlIGVsZW1lbnQgaXMgY29udGFpbmVkIGluCi0JCS8vIGEgZ3JvdXAuCi0JCWlmICghY21Hcm91cFN0YWNrLmlzRW1wdHkoKSkgewotCQkJQ01Hcm91cCBncm91cCA9IChDTUdyb3VwKSBjbUdyb3VwU3RhY2sucGVlaygpOwotCQkJaW50IGdtaW4gPSBncm91cC5nZXRNaW5PY2N1cigpOwotCQkJaWYgKGdtaW4gPT0gMCkKLQkJCQlpZiAoYnVpbGRPcHRpb25hbEVsZW1lbnRzKGJ1aWxkUG9saWN5KSkgeyAKLQkJCQkJLyogZG8gbm90aGluZzogbWluID0gbWluICovCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQltaW4gPSBtaW4gKiBnbWluOyAvLyBtaW4gPSAwCi0JCQkJfQotCQkJZWxzZSB7Ci0JCQkJbWluID0gbWluICogZ21pbjsKLQkJCX0KLQkJfQotCi0JCWludCBtYXggPSBNYXRoLm1pbihlZC5nZXRNYXhPY2N1cigpLCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpKTsKLQkJaWYgKG1heCA8IG1pbikKLQkJCW1heCA9IG1pbjsKLQotCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCi0JCS8vIE5vdGUgLSBlZCBtYXkgbm90IGJlIGFic3RyYWN0IGJ1dCBoYXMgc3Vic3RpdHV0aW9uR3JvdXBzCi0JCS8vIGludm9sdmVkLgotCQlpZiAoYnVpbGRGaXJzdFN1YnN0aXR1dGlvbihidWlsZFBvbGljeSkgfHwgaXNBYnN0cmFjdChlZCkpIC8vIGxlYXZlCi0JCQkJCQkJCQkJCQkJCQkJCS8vIHRoaXMKLQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGJhY2t3YXJkCi0JCQkJCQkJCQkJCQkJCQkJCS8vIGNvbXBhdGliaWxpdHkKLQkJCQkJCQkJCQkJCQkJCQkJLy8gZm9yIG5vdwotCQl7Ci0JCQkvLyBOb3RlIC0gVG8gY2hhbmdlIHNvIHRoYXQgaWYgZWQgaXMgb3B0aW9uYWwsIHdlIGRvIG5vdAotCQkJLy8gZ2VuZXJhdGUgYW55dGhpbmcgaGVyZS4KLQkJCWVkID0gZ2V0U3Vic3RpdHV0aW9uKGVkKTsKLQotCQkJLy8gTm90ZSAtIHRoZSByZXR1cm5lZCBlZCBtYXkgYmUgYW4gYWJzdHJhY3QgZWxlbWVudCBpbgotCQkJLy8gd2hpY2ggY2FzZSB0aGUgeG1sIHdpbGwgYmUgaW52YWxpZC4KLQkJfQotCi0JCWlmIChtaW4gPiAwICYmICF2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmNvbnRhaW5zKGVkKSkgewotCQkJdmlzaXRlZENNRWxlbWVudERlY2xhcmF0aW9uTGlzdC5hZGQoZWQpOwotCQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4OyBpKyspIHsKLQkJCQkvLyBjcmVhdGUgYW4gRWxlbWVudCBmb3IgZWFjaAotCQkJCUVsZW1lbnQgZWxlbWVudCA9IG51bGw7Ci0JCQkJaWYgKHJvb3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJZWxlbWVudCA9IHJvb3RFbGVtZW50OwotCQkJCQlyb290RWxlbWVudCA9IG51bGw7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbGVtZW50ID0gY3JlYXRlRWxlbWVudChlZCwgY29tcHV0ZU5hbWUoZWQsIGN1cnJlbnRQYXJlbnQpLCBjdXJyZW50UGFyZW50KTsKLQkJCQl9Ci0KLQkJCQkvLyB2aXNpdCB0aGUgY2hpbGRyZW4gb2YgdGhlIEdyYW1tYXJFbGVtZW50Ci0JCQkJTm9kZSBvbGRQYXJlbnQgPSBjdXJyZW50UGFyZW50OwotCQkJCWN1cnJlbnRQYXJlbnQgPSBlbGVtZW50OwotCQkJCWhhbmRsZVB1c2hQYXJlbnQoZWxlbWVudCwgZWQpOwotCi0JCQkJbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudChlbGVtZW50KTsKLQotCQkJCWJvb2xlYW4gb2xkQXR0YWNoTm9kZXNUb1BhcmVudCA9IGF0dGFjaE5vZGVzVG9QYXJlbnQ7Ci0JCQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IHRydWU7Ci0KLQkJCQkvLyBpbnN0ZWFkIG9mIGNhbGxpbmcgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbigpCi0JCQkJLy8gd2UgZHVwbGljYXRlIHRoZSBjb2RlIHdpdGggc29tZSBtaW5vciBtb2RpZmljYXRpb25zCi0JCQkJQ01OYW1lZE5vZGVNYXAgbm9kZU1hcCA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQlpbnQgc2l6ZSA9IG5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCQkJZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKLQkJCQkJdmlzaXRDTU5vZGUobm9kZU1hcC5pdGVtKGopKTsKLQkJCQl9Ci0KLQkJCQlDTUNvbnRlbnQgY29udGVudCA9IGVkLmdldENvbnRlbnQoKTsKLQkJCQlpZiAoY29udGVudCAhPSBudWxsKSB7Ci0JCQkJCXZpc2l0Q01Ob2RlKGNvbnRlbnQpOwotCQkJCX0KLQotCQkJCWlmIChlZC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkgewotCQkJCQlDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLQkJCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJCXZpc2l0Q01EYXRhVHlwZShkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJLy8gZW5kIGR1cGxpY2F0aW9uCi0JCQkJYXR0YWNoTm9kZXNUb1BhcmVudCA9IG9sZEF0dGFjaE5vZGVzVG9QYXJlbnQ7Ci0JCQkJaGFuZGxlUG9wUGFyZW50KGVsZW1lbnQsIGVkKTsKLQkJCQljdXJyZW50UGFyZW50ID0gb2xkUGFyZW50OwotCQkJCWxpbmtOb2RlKGVsZW1lbnQpOwotCQkJfQotCQkJaW50IHNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJCXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QucmVtb3ZlKHNpemUgLSAxKTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgdmlzaXRDTURhdGFUeXBlKENNRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJVGV4dCB0ZXh0ID0gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQotCQkvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eToKLQkJLy8gUHJldmlvdXMgY29kZSB1c2VzIGEgcHJvcGVydHkgdmFsdWUgYnV0IG5ldyBvbmUgdXNlcwotCQkvLyBidWlsZFBvbGljeS4KLQkJaWYgKGdldFByb3BlcnR5KFBST1BFUlRZX0JVSUxEX0JMQU5LX1RFWFRfTk9ERVMpICE9IG51bGwgJiYgZ2V0UHJvcGVydHkoUFJPUEVSVFlfQlVJTERfQkxBTktfVEVYVF9OT0RFUykuZXF1YWxzKCJ0cnVlIikpIC8vJE5PTi1OTFMtMSQKLQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgXiBCVUlMRF9URVhUX05PREVTOwotCi0JCWlmIChidWlsZFRleHROb2RlcyhidWlsZFBvbGljeSkpIHsKLQkJCXZhbHVlID0gdmFsdWVIZWxwZXIuZ2V0VmFsdWUoZGF0YVR5cGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQlpZiAoY3VycmVudFBhcmVudCAhPSBudWxsICYmIGN1cnJlbnRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl2YWx1ZSA9IGN1cnJlbnRQYXJlbnQuZ2V0Tm9kZU5hbWUoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXZhbHVlID0gInBjZGF0YSI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl2YWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJdGV4dCA9IGNyZWF0ZVRleHROb2RlKGRhdGFUeXBlLCB2YWx1ZSwgY3VycmVudFBhcmVudCk7Ci0JCWxpbmtOb2RlKHRleHQpOwotCX0KLQotCi0JcHVibGljIHZvaWQgdmlzaXRDTUdyb3VwKENNR3JvdXAgZSkgewotCQljbUdyb3VwU3RhY2sucHVzaChlKTsKLQotCQlpbnQgZm9yY2VkTWluID0gKGJ1aWxkT3B0aW9uYWxFbGVtZW50cyhidWlsZFBvbGljeSkgfHwgYWx3YXlzVmlzaXQpID8gMSA6IDA7Ci0JCWludCBtaW4gPSBNYXRoLm1heChlLmdldE1pbk9jY3VyKCksIGZvcmNlZE1pbik7Ci0KLQkJaW50IG1heCA9IDA7Ci0JCWlmIChlLmdldE1heE9jY3VyKCkgPT0gLTEpIC8vIHVuYm91bmRlZAotCQkJbWF4ID0gZ2V0TnVtT2ZSZXBlYXRhYmxlRWxlbWVudHMoKTsKLQkJZWxzZQotCQkJbWF4ID0gTWF0aC5taW4oZS5nZXRNYXhPY2N1cigpLCBnZXROdW1PZlJlcGVhdGFibGVFbGVtZW50cygpKTsKLQotCQlpZiAobWF4IDwgbWluKQotCQkJbWF4ID0gbWluOwotCi0JCWFsd2F5c1Zpc2l0ID0gZmFsc2U7Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWF4OyBpKyspIHsKLQkJCWlmIChlLmdldE9wZXJhdG9yKCkgPT0gQ01Hcm91cC5DSE9JQ0UgJiYgYnVpbGRGaXJzdENob2ljZShidWlsZFBvbGljeSkpIHsKLQkJCQlDTU5vZGUgaGludE5vZGUgPSBudWxsOwotCi0JCQkJLy8gdG9kby4uLiB0aGUgQ01Hcm91cCBzaG91bGQgc3BlY2lmeSB0aGUgaGludC4uLiBidXQgaXQgc2VlbXMKLQkJCQkvLyBhcyB0aG91Z2gKLQkJCQkvLyB0aGUgWWFtYXRvIGd1eXMgYXJlIG1ha2luZyB0aGUgQ01FbGVtZW50IHNwZWNpZnkgdGhlIGhpbnQuCi0JCQkJLy8gSSBkbyBpdCB0aGF0IHdheSBmb3Igbm93IHVudGlsLi4uIHdlIHNob3VsZCBmaXggdGhpcyBwb3N0Ci0JCQkJLy8gR0EKLQkJCQkvLyAgICAKLQkJCQlpbnQgbGlzdFNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJCQlpZiAobGlzdFNpemUgPiAwKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LmdldChsaXN0U2l6ZSAtIDEpOwotCQkJCQlPYmplY3QgY29udGVudEhpbnQgPSBlZC5nZXRQcm9wZXJ0eSgiY29udGVudEhpbnQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQlpZiAoY29udGVudEhpbnQgaW5zdGFuY2VvZiBDTU5vZGUpIHsKLQkJCQkJCWhpbnROb2RlID0gKENNTm9kZSkgY29udGVudEhpbnQ7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBzZWUgaWYgdGhpcyBoaW50IGNvcnJlc3BvbmRzIHRvIGEgdmFsaWQgY2hvaWNlCi0JCQkJLy8KLQkJCQlDTU5vZGUgY21Ob2RlID0gbnVsbDsKLQotCQkJCWlmIChoaW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaW50IG5vZGVMaXN0TGVuZ3RoID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgbm9kZUxpc3RMZW5ndGg7IGorKykgewotCQkJCQkJaWYgKGhpbnROb2RlID09IG5vZGVMaXN0Lml0ZW0oaikpIHsKLQkJCQkJCQljbU5vZGUgPSBoaW50Tm9kZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIGlmIG5vIGNtTm9kZSBoYXMgYmVlbiBkZXRlcm1pbmVkIGZyb20gdGhlIGhpbnQsIGp1c3QgdXNlCi0JCQkJLy8gdGhlIGZpcnN0IGNob2ljZQotCQkJCS8vCi0JCQkJaWYgKGNtTm9kZSA9PSBudWxsKSB7Ci0JCQkJCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSBlLmdldENoaWxkTm9kZXMoKTsKLQkJCQkJaWYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkgewotCQkJCQkJY21Ob2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChjbU5vZGUgIT0gbnVsbCkgewotCQkJCQl2aXNpdENNTm9kZShjbU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLkFMTCAvLyBBTEwKLQkJCQkJCXx8IGUuZ2V0T3BlcmF0b3IoKSA9PSBDTUdyb3VwLlNFUVVFTkNFKSAvLyBTRVFVRU5DRQotCQkJewotCQkJCS8vIHZpc2l0IGFsbCBvZiB0aGUgY29udGVudAotCQkJCXN1cGVyLnZpc2l0Q01Hcm91cChlKTsKLQkJCX0KLQkJfQotCi0JCWNtR3JvdXBTdGFjay5wb3AoKTsKLQl9Ci0KLQlzdGF0aWMgaW50IGNvdW50ID0gMDsKLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCWlmIChhbHdheXNWaXNpdCB8fCBidWlsZE9wdGlvbmFsQXR0cmlidXRlcyhidWlsZFBvbGljeSkgfHwgYWQuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQlhbHdheXNWaXNpdCA9IGZhbHNlOwotCQkJU3RyaW5nIG5hbWUgPSBjb21wdXRlTmFtZShhZCwgY3VycmVudFBhcmVudCk7Ci0JCQlTdHJpbmcgdmFsdWUgPSB2YWx1ZUhlbHBlci5nZXRWYWx1ZShhZCwgbmFtZXNwYWNlVGFibGUpOwotCQkJQXR0ciBhdHRyID0gY3JlYXRlQXR0cmlidXRlKGFkLCBuYW1lLCBjdXJyZW50UGFyZW50KTsKLQkJCWF0dHIuc2V0VmFsdWUodmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlsaW5rTm9kZShhdHRyKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQWJzdHJhY3QoQ01Ob2RlIGVkKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlPYmplY3QgdmFsdWUgPSBlZC5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmVzdWx0ID0gKHZhbHVlID09IEJvb2xlYW4uVFJVRSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3Vic3RpdHV0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IGVkOwotCQlDTU5vZGVMaXN0IGwgPSAoQ01Ob2RlTGlzdCkgZWQuZ2V0UHJvcGVydHkoIlN1YnN0aXR1dGlvbkdyb3VwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGwgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlDTU5vZGUgY2FuZGlkYXRlID0gbC5pdGVtKGkpOwotCQkJCWlmICghaXNBYnN0cmFjdChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikpIHsKLQkJCQkJcmVzdWx0ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjYW5kaWRhdGU7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRQYXJlbnRDTUVsZW1lbnREZWNsYXJhdGlvbigpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQlpbnQgbGlzdFNpemUgPSB2aXNpdGVkQ01FbGVtZW50RGVjbGFyYXRpb25MaXN0LnNpemUoKTsKLQkJaWYgKGxpc3RTaXplID4gMCkgewotCQkJZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIHZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuZ2V0KGxpc3RTaXplIC0gMSk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHZpc2l0Q01BbnlFbGVtZW50KENNQW55RWxlbWVudCBhbnlFbGVtZW50KSB7Ci0JCS8vIGluZ25vcmUgYnVpbGRQb2xpY3kgZm9yIEFOWSBlbGVtZW50cy4uLiBvbmx5IGNyZWF0ZSBlbGVtZW50cyBpZgotCQkvLyBhYnNvbHV0ZWx5IG5lZWRlZAotCQkvLwotCQlpbnQgZm9yY2VkTWluID0gYWx3YXlzVmlzaXQgPyAxIDogMDsKLQkJaW50IG1pbiA9IE1hdGgubWF4KGFueUVsZW1lbnQuZ2V0TWluT2NjdXIoKSwgZm9yY2VkTWluKTsKLQkJYWx3YXlzVmlzaXQgPSBmYWxzZTsKLQotCQlTdHJpbmcgdXJpID0gYW55RWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKTsKLQkJU3RyaW5nIHRhcmdldE5TUHJvcGVydHkgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSI7IC8vJE5PTi1OTFMtMSQKLQkJQ01Eb2N1bWVudCBwYXJlbnRDTURvY3VtZW50ID0gKENNRG9jdW1lbnQpIGFueUVsZW1lbnQuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG51bGw7Ci0KLQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwYXJlbnRDTURvY3VtZW50ID0gIiArIHBhcmVudENNRG9jdW1lbnQpOwotCQkvLyAvLyROT04tTkxTLTEkCi0JCWlmIChwYXJlbnRDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCWlmICh1cmkgPT0gbnVsbCB8fCB1cmkuc3RhcnRzV2l0aCgiIyMiKSB8fCB1cmkuZXF1YWxzKHBhcmVudENNRG9jdW1lbnQuZ2V0UHJvcGVydHkodGFyZ2V0TlNQcm9wZXJ0eSkpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJZWQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoZ2V0UGFyZW50Q01FbGVtZW50RGVjbGFyYXRpb24oKSwgcGFyZW50Q01Eb2N1bWVudCk7Ci0JCQl9Ci0JCX0KLQotCi0JCWlmIChlZCA9PSBudWxsICYmIGV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgIT0gbnVsbCAmJiB1cmkgIT0gbnVsbCAmJiAhdXJpLnN0YXJ0c1dpdGgoIiMjIikgJiYgY3VycmVudFBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJQ01Eb2N1bWVudCBleHRlcm5hbENNRG9jdW1lbnQgPSBleHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0LmdldENNRG9jdW1lbnQoKEVsZW1lbnQpIGN1cnJlbnRQYXJlbnQsIHVyaSk7Ci0JCQlpZiAoZXh0ZXJuYWxDTURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQllZCA9IGdldFN1aXRhYmxlRWxlbWVudChudWxsLCBleHRlcm5hbENNRG9jdW1lbnQpOwotCQkJfQotCQl9Ci0KLQkJZm9yIChpbnQgaSA9IDE7IGkgPD0gbWluOyBpKyspIHsKLQkJCWlmIChlZCAhPSBudWxsKSB7Ci0JCQkJdmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlFbGVtZW50IGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJBTlktRUxFTUVOVCIpOyAvLyROT04tTkxTLTEkCi0JCQkJbGlua05vZGUoZWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0U3VpdGFibGVFbGVtZW50KENNTmFtZWROb2RlTWFwIG5hbWVOb2RlTWFwKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0JCWludCBzaXplID0gbmFtZU5vZGVNYXAuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjYW5kaWRhdGUgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIG5hbWVOb2RlTWFwLml0ZW0oaSk7Ci0JCQlpZiAoIXZpc2l0ZWRDTUVsZW1lbnREZWNsYXJhdGlvbkxpc3QuY29udGFpbnMoY2FuZGlkYXRlKSkgewotCQkJCXJlc3VsdCA9IGNhbmRpZGF0ZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRTdWl0YWJsZUVsZW1lbnQoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIENNRG9jdW1lbnQgY21Eb2N1bWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCi0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRTdWl0YWJsZUVsZW1lbnQoZWQuZ2V0TG9jYWxFbGVtZW50cygpKTsKLQkJfQotCi0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiBjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IGdldFN1aXRhYmxlRWxlbWVudChjbURvY3VtZW50LmdldEVsZW1lbnRzKCkpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGxpbmtOb2RlKE5vZGUgbm9kZSkgewotCQlpZiAoYXR0YWNoTm9kZXNUb1BhcmVudCAmJiBjdXJyZW50UGFyZW50ICE9IG51bGwpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCSgoRWxlbWVudCkgY3VycmVudFBhcmVudCkuc2V0QXR0cmlidXRlTm9kZSgoQXR0cikgbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljdXJyZW50UGFyZW50LmFwcGVuZENoaWxkKG5vZGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHJlc3VsdExpc3QgIT0gbnVsbCkgewotCQkJcmVzdWx0TGlzdC5hZGQobm9kZSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFBvcHVsYXRlRG9jdW1lbnRGcm9tR3JhbW1hckZpbGUoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBncmFtbWFyRmlsZU5hbWUsIFN0cmluZyByb290RWxlbWVudE5hbWUsIGJvb2xlYW4gaGFjaykgewotCQl0cnkgewotCQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQoZ3JhbW1hckZpbGVOYW1lLCBudWxsKTsKLQkJCUNNTmFtZWROb2RlTWFwIGVsZW1lbnRNYXAgPSBjbURvY3VtZW50LmdldEVsZW1lbnRzKCk7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50ID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBlbGVtZW50TWFwLmdldE5hbWVkSXRlbShyb290RWxlbWVudE5hbWUpOwotCi0JCQlET01Db250ZW50QnVpbGRlckltcGwgY29udGVudEJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKGRvY3VtZW50KTsKLQkJCWNvbnRlbnRCdWlsZGVyLnN1cHJlc3NDcmVhdGlvbk9mRG9jdHlwZUFuZFhNTERlY2xhcmF0aW9uID0gaGFjazsKLQkJCWNvbnRlbnRCdWlsZGVyLmNyZWF0ZURlZmF1bHRSb290Q29udGVudChjbURvY3VtZW50LCBlbGVtZW50KTsKLQotCQkJU3lzdGVtLm91dC5wcmludGxuKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJCURPTVdyaXRlciB3cml0ZXIgPSBuZXcgRE9NV3JpdGVyKCk7Ci0JCQlpZiAoaGFjaykgewotCQkJCXdyaXRlci5wcmludChkb2N1bWVudCwgZ3JhbW1hckZpbGVOYW1lKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXdyaXRlci5wcmludChkb2N1bWVudCk7Ci0JCQl9Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiRXJyb3I6ICIgKyBlKTsgLy8kTk9OLU5MUy0xJAotCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJfQotCX0KLQotCS8vIHRlc3QKLQkvLwotCS8qCi0JICogcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ1tdKSB7IGlmIChhcmcubGVuZ3RoID49IDIpIHsgdHJ5IHsKLQkgKiBDTURvY3VtZW50RmFjdG9yeVJlZ2lzdHJ5LmdldEluc3RhbmNlKCkucmVnaXN0ZXJDTURvY3VtZW50QnVpbGRlcldpdGhDbGFzc05hbWUoIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9maW1wbC5DTURvY3VtZW50QnVpbGRlckltcGwiKTsKLQkgKiAKLQkgKiBTdHJpbmcgZ3JhbW1hckZpbGVOYW1lID0gYXJnWzBdOyBTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gYXJnWzFdOwotCSAqIAotCSAqIERvY3VtZW50IGRvY3VtZW50ID0KLQkgKiAoRG9jdW1lbnQpQ2xhc3MuZm9yTmFtZSgib3JnLmFwYWNoZS54ZXJjZXMuZG9tLkRvY3VtZW50SW1wbCIpLm5ld0luc3RhbmNlKCk7Ci0JICogdGVzdFBvcHVsYXRlRG9jdW1lbnRGcm9tR3JhbW1hckZpbGUoZG9jdW1lbnQsIGdyYW1tYXJGaWxlTmFtZSwKLQkgKiByb290RWxlbWVudE5hbWUsIHRydWUpOyB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCSAqIFN5c3RlbS5vdXQucHJpbnRsbigiRE9NQ29udGVudEJ1aWxkZXJJbXBsIGVycm9yIik7IGUucHJpbnRTdGFja1RyYWNlKCk7IH0gfQotCSAqIGVsc2UgeyBTeXN0ZW0ub3V0LnByaW50bG4oIlVzYWdlIDogamF2YQotCSAqIG9yZy5lY2xpcHNlLndzdC54bWwudXRpbC5ET01Db250ZW50QnVpbGRpbmdDTVZpc2l0b3IgZ3JhbW1hckZpbGVOYW1lCi0JICogcm9vdEVsZW1lbnROYW1lIik7IH0gfQotCSAqLwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIwOTZkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRE9NTmFtZXNwYWNlSGVscGVyCi17ICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBnZXRVUklGb3JQcmVmaXgoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkgIFN0cmluZyBuc0F0dHJOYW1lID0gbnVsbDsKLQkgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSAKLSAgICB7Ci0JCSAgbnNBdHRyTmFtZSA9ICJ4bWxuczoiICsgcHJlZml4OyAvLyROT04tTkxTLTEkCi0JICB9Ci0JICBlbHNlIAotICAgIHsKLQkJICBuc0F0dHJOYW1lID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCSAgfQotICAgICAgICAgICAgCi0gICAgLy8gYXNzdW1lIHRoZSBub2RlIGlzIHF1YWxpZmllZC4uLiBsb29rIHVwIHRoZSBVUkkgYmFzZSBvbiB0aGUgcHJlZml4Ci0gICAgLy8KLQkgIGZvciAoTm9kZSBub2RlID0gZWxlbWVudDsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIAotICAgIHsKLQkgICAJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgRWxlbWVudCB0aGVFbGVtZW50ID0gKEVsZW1lbnQpbm9kZTsKLQkJICAgIEF0dHIgYXR0ciA9IHRoZUVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJICAgIGlmIChhdHRyICE9IG51bGwpIAotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gYXR0ci5nZXRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICAgICAgIAotICAgIC8vIHNlZSBpZiB3ZSBjYW4gZmluZCBzb21lIGluZm8gZnJvbSBhbiAnaW1wbGljaXQnIG5hbWVzcGFjZQotICAgIC8vCi0gICAgaWYgKHJlc3VsdCA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlVGFibGUgdGFibGUgPSBuZXcgTmFtZXNwYWNlVGFibGUoZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkpOwotICAgICAgcmVzdWx0ID0gdGFibGUuZ2V0VVJJRm9yUHJlZml4KHByZWZpeCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0JfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShOb2RlIG5vZGUpCi0gIHsgICAgICAgICAgICAKLSAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgIHsgICAgICAgICAgICAgICAKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KW5vZGU7Ci0gICAgICBTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLSAgICAgIHJlc3VsdCA9IGdldFVSSUZvclByZWZpeChlbGVtZW50LCBwcmVmaXgpOwotICAgIH0KLSAgICBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkKLSAgICB7ICAgICAgCi0gICAgICBBdHRyIGF0dHIgPSAoQXR0cilub2RlOwotICAgICAgU3RyaW5nIHByZWZpeCA9IGF0dHIuZ2V0UHJlZml4KCk7Ci0gICAgICByZXN1bHQgPSBnZXRVUklGb3JQcmVmaXgoYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgcHJlZml4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAgICAgICAgICAgICAgCi0KLSAgLy8gdG9kby4uLiB0aGlzIGlzIGFuIHVnbHkgaGFjay4uLiBuZWVkcyB0byBiZSBmaXhlZAotICAvLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlUHJlZml4KENNTm9kZSBjbU5vZGUsIE5vZGUgcGFyZW50Tm9kZSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIGZvciAoTm9kZSBub2RlID0gcGFyZW50Tm9kZTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpCi0gICAgewotICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0UHJlZml4KG5vZGUuZ2V0Tm9kZU5hbWUoKSk7Ci0gICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgICAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFN0cmluZyBuYW1lKQotICB7Ci0gICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwotICAgIH0KLSAgICByZXR1cm4gcHJlZml4OwotICB9Ci0KLQotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRVbnByZWZpeGVkTmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIGludCBpbmRleCA9IG5hbWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZTsKLSAgfQotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgpCi0gIHsgICAgIAotICAgIHJldHVybiBjb21wdXRlTmFtZShjbU5vZGUsIHBhcmVudCwgcHJlZml4LCBudWxsKTsKLSAgfSAgIAotCi0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29tcHV0ZU5hbWUoQ01Ob2RlIGNtTm9kZSwgTm9kZSBwYXJlbnQsIFN0cmluZyBwcmVmaXgsIE5hbWVzcGFjZVRhYmxlIG5hbWVzcGFjZVRhYmxlKQotICB7Ci0gICAgU3RyaW5nIHJlc3VsdCA9IGNtTm9kZS5nZXROb2RlTmFtZSgpOwotCi0gICAgLy8gaWYgdGhlIGNtTm9kZSBoYXMgYSBoYXJkIGNvZGVkIHByZWZpeCB0aGVuIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcKLSAgICAvLwotICAgIGlmIChnZXRQcmVmaXgocmVzdWx0KSA9PSBudWxsKQotICAgIHsgICAgICAgICAgICAgIAotICAgICAgU3RyaW5nIHF1YWxpZmljYXRpb24gPSAoU3RyaW5nKWNtTm9kZS5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAvLyBzZWUgaWYgd2UgbmVlZCBhIG5hbWVzcGFjZSBwcmVmaXgKLSAgICAgIC8vCi0gICAgICBpZiAocXVhbGlmaWNhdGlvbiAhPSBudWxsICYmIHF1YWxpZmljYXRpb24uZXF1YWxzKCJxdWFsaWZpZWQiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBpZiAocHJlZml4ID09IG51bGwpICAgICAgICAgICAgICAgICAKLSAgICAgICAgewotICAgICAgICAgIC8vIHRvZG8uLi4gYWRkIGdldENNRG9jdW1lbnQoKSBtZXRob2QgdG8gQ01Ob2RlCi0gICAgICAgICAgLy8gZm9yIG5vdyB1c2UgdGhpcyBnZXRQcm9wZXJ0eSgpIGhhY2sKLSAgICAgICAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCljbU5vZGUuZ2V0UHJvcGVydHkoIkNNRG9jdW1lbnQiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChjbURvY3VtZW50ICE9IG51bGwpICAgICAgICAgIAotICAgICAgICAgIHsgICAgIAotICAgICAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSIpOyAgICAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBpZiAobmFtZXNwYWNlVVJJICE9IG51bGwpCi0gICAgICAgICAgICB7ICAgCi0gICAgICAgICAgICAgIC8vIHVzZSB0aGUgTmFtZXNwYWNlVGFibGUgdG8gZmlndXJlIG91dCB0aGUgY29ycmVjdCBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlIHVyaQotICAgICAgICAgICAgICAvLyAgICAgIAotICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVGFibGUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgPyAoRG9jdW1lbnQpcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICBuYW1lc3BhY2VUYWJsZSA9IG5ldyBOYW1lc3BhY2VUYWJsZShkb2N1bWVudCk7Ci0gICAgICAgICAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEVsZW1lbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlVGFibGUuYWRkRWxlbWVudExpbmVhZ2UoKEVsZW1lbnQpcGFyZW50KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZXNwYWNlVGFibGUuZ2V0UHJlZml4Rm9yVVJJKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gcHJlZml4ICsgIjoiICsgcmVzdWx0OyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgIH0gICAgCi0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gIAotICAKLQotICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGdldFVSSVF1YWxpZmllZE5hbWVDb21wb25lbnRzKFN0cmluZyB1cmlRdWFsaWZpZWROYW1lKQotICB7Ci0gICAgU3RyaW5nW10gcmVzdWx0ID0gbmV3IFN0cmluZ1syXTsKLSAgICBpbnQgZmlyc3RJbmRleCA9IHVyaVF1YWxpZmllZE5hbWUuaW5kZXhPZigiWyIpOyAvLyROT04tTkxTLTEkCi0gICAgaW50IGxhc3RJbmRleCA9IHVyaVF1YWxpZmllZE5hbWUuaW5kZXhPZigiXSIpOyAvLyROT04tTkxTLTEkCi0gICAgaWYgKGZpcnN0SW5kZXggIT0gLTEgJiYgbGFzdEluZGV4ID4gZmlyc3RJbmRleCkKLSAgICB7Ci0gICAgICByZXN1bHRbMF0gPSB1cmlRdWFsaWZpZWROYW1lLnN1YnN0cmluZyhmaXJzdEluZGV4ICsgMSwgbGFzdEluZGV4KTsKLSAgICAgIHJlc3VsdFsxXSA9IHVyaVF1YWxpZmllZE5hbWUuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEpOwotICAgIH0gIAotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXN1bHRbMV0gPSB1cmlRdWFsaWZpZWROYW1lOwotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICByZXR1cm4gcmVzdWx0OwotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFjZjhlNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9ET01OYW1lc3BhY2VJbmZvTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKiBET01OYW1lc3BhY2VJbmZvTWFuYWdlciAgICAgICAgICAKLSAqCi0gKgotICovCi1wdWJsaWMgY2xhc3MgRE9NTmFtZXNwYWNlSW5mb01hbmFnZXIKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTSV9VUkkgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiOyAvLyROT04tTkxTLTEkCi0KLSAgcHVibGljIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCkKLSAgewotICB9ICAgICAgICAgICAgICAgICAKLQotICBwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdChFbGVtZW50IGVsZW1lbnQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvUmVhZGVyIHJlYWRlciA9IG5ldyBOYW1lc3BhY2VJbmZvUmVhZGVyKCk7Ci0gICAgcmV0dXJuIHJlYWRlci5nZXROYW1lc3BhY2VJbmZvTGlzdChlbGVtZW50KTsKLSAgfSAgICAgICAgICAgIAotICAgCi0gIHB1YmxpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZUluZm8oRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAKLSAgICBOYW1lc3BhY2VJbmZvUmVtb3ZlciByZW1vdmVyID0gbmV3IE5hbWVzcGFjZUluZm9SZW1vdmVyKCk7Ci0gICAgcmVtb3Zlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mbyhFbGVtZW50IGVsZW1lbnQsIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QsIGJvb2xlYW4gbmVlZHNYU0kpCi0gIHsgIAotICAgIC8vIGZpcnN0IHdlIGNyZWF0ZSBhbiB4bWxucyBhdHRyaWJ1dGUgZm9yIGVhY2ggbmFtZXNwYWNlCi0gICAgLy8gICAgICAgICAgICAgICAgICAgCi0gICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHNjaGVtYUxvY2F0aW9uVmFsdWUgPSAiIjsgICAgICAvLyROT04tTkxTLTEkCi0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbylpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBuc0luZm8ubm9ybWFsaXplKCk7Ci0gICAgICAgICAgICAgICAKLSAgICAgIGlmIChuc0luZm8udXJpICE9IG51bGwpIAotICAgICAgeyAgICAgICAgICAgIAotICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSBuc0luZm8ucHJlZml4ICE9IG51bGwgPyAieG1sbnM6IiArIG5zSW5mby5wcmVmaXggOiAieG1sbnMiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgQXR0ciBuYW1lc3BhY2VBdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGF0dHJOYW1lKTsgIAotICAgICAgICBuYW1lc3BhY2VBdHRyLnNldFZhbHVlKG5zSW5mby51cmkpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUobmFtZXNwYWNlQXR0cik7ICAgCi0KLSAgICAgICAgLy8gaW4gdGhpcyBjYXNlIHdlIHVzZSB0aGUgYXR0cmlidXRlICJ4c2k6c2NoZW1hTG9jYXRpb24iCi0gICAgICAgIC8vIGhlcmUgd2UgYnVpbGQgdXAgaXRzIHZhbHVlCi0gICAgICAgIC8vCi0gICAgICAgIGlmIChuc0luZm8ubG9jYXRpb25IaW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9IG5zSW5mby51cmk7Ci0gICAgICAgICAgc2NoZW1hTG9jYXRpb25WYWx1ZSArPSAiICI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBzY2hlbWFMb2NhdGlvblZhbHVlICs9IG5zSW5mby5sb2NhdGlvbkhpbnQ7Ci0gICAgICAgICAgc2NoZW1hTG9jYXRpb25WYWx1ZSArPSAiICI7ICAgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfSAgIAotCi0gICAgICAgIGlmIChuc0luZm8udXJpLmVxdWFscyhYU0lfVVJJKSkKLSAgICAgICAgewotICAgICAgICAgIG5lZWRzWFNJID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0gICAgIAotICAgICAgZWxzZSBpZiAobnNJbmZvLmxvY2F0aW9uSGludCAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBpbiB0aGlzIGNhc2Ugd2UgdXNlIHRoZSBhdHRyaWJ1dGUgInhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIgotICAgICAgICAvLwotICAgICAgICBBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoInhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uIik7ICAgLy8kTk9OLU5MUy0xJAotICAgICAgICBhdHRyLnNldFZhbHVlKG5zSW5mby5sb2NhdGlvbkhpbnQpOwotICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgICB9IAotICAgIH0gCi0KLSAgICBpZiAobmVlZHNYU0kpCi0gICAgewotICAgICAgLy8gd2UgYWRkIGFuIHhtbG5zOnhzaSBhdHRyaWJ1dGUgdG8gZGVmaW5lICd4c2k6c2NoZW1hTG9jYXRpb24nIGF0dHJpYnV0ZQotICAgICAgLy8gICAKLSAgICAgIEF0dHIgYXR0ciA9IGRvY3VtZW50LmNyZWF0ZUF0dHJpYnV0ZSgieG1sbnM6eHNpIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGF0dHIuc2V0VmFsdWUoWFNJX1VSSSk7Ci0gICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0gICAgfQotCi0gICAgaWYgKHNjaGVtYUxvY2F0aW9uVmFsdWUubGVuZ3RoKCkgPiAwKQotICAgIHsKLSAgICAgIC8vIGNyZWF0ZSB0aGUgInhzaTpzY2hlbWFMb2NhdGlvbiIgYXR0cmlidXRlCi0gICAgICAvLwotICAgICAgQXR0ciBhdHRyID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKCJ4c2k6c2NoZW1hTG9jYXRpb24iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgYXR0ci5zZXRWYWx1ZShzY2hlbWFMb2NhdGlvblZhbHVlKTsKLSAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgfSAKLSAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5hbWVzcGFjZUluZm9SZWFkZXIgZXh0ZW5kcyBOYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yCi0gIHsgIAotICAgIHByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoRWxlbWVudCBlbGVtZW50KQotICAgIHsKLSAgICAgIHZpc2l0RWxlbWVudChlbGVtZW50KTsKLSAgICAgIHJldHVybiBuYW1lc3BhY2VJbmZvTGlzdDsKLSAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgIAotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGNyZWF0ZU5hbWVzcGFjZUluZm8oKTsKLSAgICAgIGluZm8ubG9jYXRpb25IaW50ID0gdmFsdWU7ICAgICAgCi0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSkKLSAgICB7ICAgICAgICAgICAKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGNyZWF0ZU5hbWVzcGFjZUluZm8oKTsKLSAgICAgIGluZm8udXJpID0gdXJpOwotICAgICAgaW5mby5wcmVmaXggPSBwcmVmaXg7ICAgICAgCi0gICAgICBzdXBlci52aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCBwcmVmaXgsIHVyaSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICAgIHsgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSk7ICAgICAgICAgICAgCi0gICAgICBpZiAoaW5mbyAhPSBudWxsKQotICAgICAgewotICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGluZm8gPSBjcmVhdGVOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgIGluZm8udXJpID0gdXJpOwotICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsKLSAgICAgIH0KLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGdldE5hbWVzcGFjZUluZm9Gb3JVUkkoU3RyaW5nIHVyaSkKLSAgICB7ICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyByZXN1bHQgPSBudWxsOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8paS5uZXh0KCk7Ci0gICAgICAgIGlmIChpbmZvLnVyaSAhPSBudWxsICYmIGluZm8udXJpLmVxdWFscyh1cmkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gaW5mbzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAgICAgICAgIAotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9ICAgICAKLQotICAgIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGNyZWF0ZU5hbWVzcGFjZUluZm8oKQotICAgIHsKLSAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICBuYW1lc3BhY2VJbmZvTGlzdC5hZGQoaW5mbyk7Ci0gICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0gIH0KLSAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgLyoqCi0gICAqCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE5hbWVzcGFjZUluZm9SZW1vdmVyIGV4dGVuZHMgTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvcgotICB7ICAgICAgICAgICAgICAgICAgIAotICAgIHByb3RlY3RlZCBMaXN0IGF0dHJpYnV0ZXNUb1JlbW92ZSA9IG5ldyBWZWN0b3IoKTsKLQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZU5hbWVzcGFjZUluZm8oRWxlbWVudCBlbGVtZW50KQotICAgIHsgIAotICAgICAgdmlzaXRFbGVtZW50KGVsZW1lbnQpOwotICAgICAgcmVtb3ZlQXR0cmlidXRlcygpOwotICAgIH0gICAKLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgICB7Ci0gICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuYWRkKGF0dHIpOwotICAgIH0gICAgICAgIAotICAgIAotICAgIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgICB7ICAgCi0gICAgICBhdHRyaWJ1dGVzVG9SZW1vdmUuYWRkKGF0dHIpOwotICAgICAgc3VwZXIudmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgbmFtZXNwYWNlUHJlZml4LCBuYW1lc3BhY2VVUkkpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgIGF0dHJpYnV0ZXNUb1JlbW92ZS5hZGQoYXR0cik7Ci0gICAgfSAgIAotCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlcygpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gYXR0cmlidXRlc1RvUmVtb3ZlLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEF0dHIgYXR0ciA9IChBdHRyKWkubmV4dCgpOwotICAgICAgICBFbGVtZW50IGVsZW1lbnQgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotICAgICAgICBpZiAoZWxlbWVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGVOb2RlKGF0dHIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgIAotICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NVmlzaXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWI2YmQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVZpc2l0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLS8vIHRvZG8uLiBtb3ZlIHRoaXMgY2xhc3MgdG8gYW5vdGhlciBwYWNrYWdlIChwZXJoYXBzIHhtbHV0aWxpdHkpCi0vLwotcHVibGljIGNsYXNzIERPTVZpc2l0b3IKLXsgICAgICAgICAKLSAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgewotICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgIHsKLSAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0QXR0cigoQXR0cilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDREFUQVNlY3Rpb24oKENEQVRBU2VjdGlvbilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRDb21tZW50KChDb21tZW50KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXREb2N1bWVudCgoRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0RG9jdW1lbnRUeXBlKChEb2N1bWVudFR5cGUpbm9kZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICB7Ci0gICAgICAgIHZpc2l0RWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgIHsKLSAgICAgICAgdmlzaXRUZXh0KChUZXh0KW5vZGUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9ICAKLSAgfSAgICAKLSAgICAKLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAKLSAgICB2aXNpdENoaWxkTm9kZXNIZWxwZXIoZG9jdW1lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXREb2N1bWVudFR5cGUoRG9jdW1lbnRUeXBlIGRvY3R5cGUpCi0gIHsgICAgICAgICAKLQotICB9ICAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAKLSAgICB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoZWxlbWVudCk7Ci0gICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGVsZW1lbnQpOwotICB9IAotIAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0QXR0cihBdHRyIGF0dHIpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFRleHQoVGV4dCB0ZXh0KQotICB7ICAgIAotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdmlzaXRDREFUQVNlY3Rpb24oQ0RBVEFTZWN0aW9uIGNkYXRhU2VjdGlvbikKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gIH0gICAgIAotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gIHsgICAgICAgICAgICAgICAgICAgCi0gIH0gICAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbihQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGkpCi0gIHsgICAgCi0gIH0KLSAKLQotICBwcm90ZWN0ZWQgdm9pZCB2aXNpdENoaWxkTm9kZXNIZWxwZXIoTm9kZSBub2RlKQotICB7Ci0gICAgTm9kZUxpc3QgY2hpbGRyZW4gPSBub2RlLmdldENoaWxkTm9kZXMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgdmlzaXROb2RlKGNoaWxkcmVuLml0ZW0oaSkpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHZpc2l0QXR0cmlidXRlc0hlbHBlcihOb2RlIG5vZGUpCi0gIHsKLSAgICBOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKyApCi0gICAgewotICAgICAgdmlzaXROb2RlKG1hcC5pdGVtKGkpKTsKLSAgICB9Ci0gIH0gICAgICAgICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0RPTVdyaXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NV3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MDdkNWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvRE9NV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGlzIGEgaGFja2VkIHVwIGRvbSB3cml0ZXIgc3RvbGVuIGZyb20gYSBYZXJjZXMgc2FtcGxlLgotICogSSdkIGxpa2UgdG8gdXNlIGFuIGV4aXNpdG5nICdnZW5lcmljIERPTScgd3JpdGVyCi0gKiBJZiBhbnlvbmUgY2FuIGZpbmQgc3VjaCBhIHRoaW5nIHRoZW4gcGxlYXNlIGdvIGFoZWFkIGFuZCBqdW5rIHRoaXMuCi0gKgotICogQHZlcnNpb24KLSAqLwotcHVibGljIGNsYXNzIERPTVdyaXRlcgotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBmb3JtYXR0aW5nRW5hYmxlZCA9IHRydWU7Ci0gICBwcm90ZWN0ZWQgYm9vbGVhbiBvdXRwdXREb2N0eXBlRW5hYmxlZCA9IHRydWU7Ci0gICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgb3V0OwotICAgcHJvdGVjdGVkIGludCBpbmRlbnQgPSAwOyAgCi0KLSAgIHB1YmxpYyBET01Xcml0ZXIoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICAgewotICAgICB0aGlzKFN5c3RlbS5vdXQpOwotICAgfQotCi0gICBwdWJsaWMgRE9NV3JpdGVyKE91dHB1dFN0cmVhbSBvdXRwdXRTdGVhbSkKLSAgIHsKLSAgICAgb3V0ID0gbmV3IFByaW50V3JpdGVyKG91dHB1dFN0ZWFtKTsKLSAgIH0KLQotICAgcHVibGljIERPTVdyaXRlcihXcml0ZXIgd3JpdGVyKQotICAgewotICAgICBvdXQgPSBuZXcgUHJpbnRXcml0ZXIod3JpdGVyKTsKLSAgIH0KLQotICAgcHVibGljIHZvaWQgc2V0Rm9ybWF0dGluZ0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKQotICAgewotICAgICBmb3JtYXR0aW5nRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICB9Ci0KLSAgIHB1YmxpYyBib29sZWFuIGdldEZvcm1hdHRpbmdFbmFibGVkKCkKLSAgIHsKLSAgICAgcmV0dXJuIGZvcm1hdHRpbmdFbmFibGVkOwotICAgfQotCi0gICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREb2N0eXBlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gICB7Ci0gICAgIG91dHB1dERvY3R5cGVFbmFibGVkID0gZW5hYmxlZDsKLSAgIH0KLQotICAgcHVibGljIGNsYXNzIFhNTFZpc2l0b3IKLSAgIHsKLSAgICAgcHJvdGVjdGVkIGJvb2xlYW4gY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzID0gZmFsc2U7Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXROb2RlKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIHN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKQotICAgICAgIHsKLSAgICAgICAgIGNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0QXR0cigoQXR0cilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRDREFUQVNlY3Rpb24oKENEQVRBU2VjdGlvbilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRDb21tZW50KChDb21tZW50KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICAgIGNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXREb2N1bWVudCgoRG9jdW1lbnQpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RG9jdW1lbnRUeXBlKChEb2N1bWVudFR5cGUpbm9kZSk7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgICAgY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0gICAgICAgICB7Ci0gICAgICAgICAgIHZpc2l0RWxlbWVudCgoRWxlbWVudClub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbilub2RlKTsKLSAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICB9Ci0gICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFIDoKLSAgICAgICAgIHsKLSAgICAgICAgICAgdmlzaXRUZXh0KChUZXh0KW5vZGUpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgIH0KLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdERvY3VtZW50KERvY3VtZW50IGRvY3VtZW50KQotICAgICB7Ci0gICAgICAgdmlzaXRDaGlsZE5vZGVzSGVscGVyKGRvY3VtZW50KTsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RG9jdW1lbnRUeXBlKERvY3VtZW50VHlwZSBkb2N0eXBlKQotICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICBpZiAob3V0cHV0RG9jdHlwZUVuYWJsZWQpCi0gICAgICAgewotICAgICAgICAgU3RyaW5nIGRhdGEgPSBnZXREb2N1bWVudFR5cGVEYXRhKGRvY3R5cGUpOwotICAgICAgICAgcHJpbnQoIjwhRE9DVFlQRSAiICsgZGF0YSArICI+Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgaWYgKCFkb1Nob3coZWxlbWVudCkpCi0gICAgICAgICByZXR1cm47Ci0KLSAgICAgICBib29sZWFuIHBhcmVudEVsZW1lbnRIYXNDaGlsZE5vZGVzID0gY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzOwotICAgICAgIGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyA9IGhhc0NoaWxkRWxlbWVudHMoZWxlbWVudCk7Ci0KLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChlbGVtZW50LmdldE5vZGVOYW1lKCkpOwotICAgICAgIHZpc2l0QXR0cmlidXRlc0hlbHBlcihlbGVtZW50KTsKLQotICAgICAgIGJvb2xlYW4gaGFzQ2hpbGROb2RlcyA9IGVsZW1lbnQuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID4gMDsgICAgICAgICAgICAgICAgCi0gICAgICAgYm9vbGVhbiBpc1Jvb3RFbGVtZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREU7Ci0gICAgICAgaWYgKGhhc0NoaWxkTm9kZXMgfHwgaXNSb290RWxlbWVudCkKLSAgICAgICB7Ci0gICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzIHx8IGlzUm9vdEVsZW1lbnQpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgfQotICAgICAgICAgZWxzZQotICAgICAgICAgewotICAgICAgICAgICBwcmludCgiPiIpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICB9Ci0gICAgICAgICBpbmRlbnQgKz0gMjsKLSAgICAgICAgIHZpc2l0Q2hpbGROb2Rlc0hlbHBlcihlbGVtZW50KTsKLSAgICAgICAgIGluZGVudCAtPSAyOwotCi0gICAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzIHx8IGlzUm9vdEVsZW1lbnQpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgICB9Ci0gICAgICAgICBwcmludCgiPC8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgcHJpbnQoZWxlbWVudC5nZXROb2RlTmFtZSgpKTsKLSAgICAgICAgIHByaW50bG4oIj4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLSAgICAgICBlbHNlCi0gICAgICAgewotICAgICAgICAgcHJpbnRsbigiLz4iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIH0KLQotICAgICAgIGN1cnJlbnRFbGVtZW50SGFzQ2hpbGRFbGVtZW50cyA9IHBhcmVudEVsZW1lbnRIYXNDaGlsZE5vZGVzOwotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyKEF0dHIgYXR0cikKLSAgICAgewotICAgICAgIHByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChhdHRyLmdldE5vZGVOYW1lKCkpOwotICAgICAgIHByaW50KCI9XCIiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEoYXR0ci5nZXRWYWx1ZSgpKSk7Ci0gICAgICAgcHJpbnQoIlwiIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0VGV4dChUZXh0IHRleHQpCi0gICAgIHsKLSAgICAgICBpZiAoY3VycmVudEVsZW1lbnRIYXNDaGlsZEVsZW1lbnRzKQotICAgICAgIHsKLSAgICAgICAgIHByaW50SW5kZW50KCk7Ci0gICAgICAgICBwcmludChjcmVhdGVQcmludGFibGVDaGFyYWN0ZXJEYXRhKHRleHQuZ2V0Tm9kZVZhbHVlKCkpKTsKLSAgICAgICAgIHByaW50bG4oKTsKLSAgICAgICB9Ci0gICAgICAgZWxzZQotICAgICAgIHsKLSAgICAgICAgIHByaW50KGNyZWF0ZVByaW50YWJsZUNoYXJhY3RlckRhdGEodGV4dC5nZXROb2RlVmFsdWUoKSkpOwotICAgICAgIH0KLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0Q0RBVEFTZWN0aW9uKENEQVRBU2VjdGlvbiBjZGF0YVNlY3Rpb24pCi0gICAgIHsKLSAgICAgfQotCi0gICAgIHB1YmxpYyB2b2lkIHZpc2l0Q29tbWVudChDb21tZW50IGNvbW1lbnQpCi0gICAgIHsKLSAgICAgICBwcmludEluZGVudCgpOwotICAgICAgIHByaW50KCI8IS0tIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChjb21tZW50LmdldE5vZGVWYWx1ZSgpKTsKLSAgICAgICBwcmludGxuKCItLT4iKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKQotICAgICB7Ci0gICAgICAgcHJpbnRJbmRlbnQoKTsKLSAgICAgICBwcmludCgiPD8iKTsgLy8kTk9OLU5MUy0xJAotICAgICAgIHByaW50KHBpLmdldE5vZGVOYW1lKCkpOwotICAgICAgIHByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICBwcmludChwaS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgICAgcHJpbnRsbigiPz4iKTsgLy8kTk9OLU5MUy0xJAotICAgICB9Ci0gICAgICAgICAgICAgCi0KLSAgICAgcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRFbGVtZW50cyhOb2RlIG5vZGUpCi0gICAgIHsKLSAgICAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIGlmIChjaGlsZHJlbi5pdGVtKGkpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpCi0gICAgICAgICB7Ci0gICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICB9Ci0KLSAgICAgcHVibGljIHZvaWQgdmlzaXRDaGlsZE5vZGVzSGVscGVyKE5vZGUgbm9kZSkKLSAgICAgewotICAgICAgIE5vZGVMaXN0IGNoaWxkcmVuID0gbm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKQotICAgICAgIHsKLSAgICAgICAgIHZpc2l0Tm9kZShjaGlsZHJlbi5pdGVtKGkpKTsKLSAgICAgICB9Ci0gICAgIH0KLQotICAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZXNIZWxwZXIoTm9kZSBub2RlKQotICAgICB7Ci0gICAgICAgTmFtZWROb2RlTWFwIG1hcCA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwLmdldExlbmd0aCgpOyBpKysgKQotICAgICAgIHsKLSAgICAgICAgIHZpc2l0Tm9kZShtYXAuaXRlbShpKSk7Ci0gICAgICAgfQotICAgICB9Ci0gICB9Ci0KLSAgLyoqIGFuIHVnbHkgaGFjayB1bnRpbCBJIHJlc3RydWN0IHRoaXMgY29kZSBhIGxpdHRsZQotICAgKiAgCi0gICAqLyAgCi0gIHByb3RlY3RlZCBib29sZWFuIGRvU2hvdyhFbGVtZW50IGVsZW1lbnQpICAgIAotICB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiBjb252ZXJ0cyBET00gdGV4dCB2YWx1ZXMgdG8gJ3ByaW50YWJsZScgdmFsdWVzIAotICAgKiAgLSBjb252ZXJ0cyAnJicgdG8gJyZhbXA7JwotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVQcmludGFibGVDaGFyYWN0ZXJEYXRhKFN0cmluZyBzdHJpbmcpCi0gIHsgICAgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIGludCBpbmRleCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgaW50IGFtcGVyc2FuZEluZGV4ID0gc3RyaW5nLmluZGV4T2YoIiYiLCBpbmRleCk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChhbXBlcnNhbmRJbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ICs9IHN0cmluZy5zdWJzdHJpbmcoaW5kZXgsIGFtcGVyc2FuZEluZGV4KTsKLSAgICAgICAgcmVzdWx0ICs9ICImYW1wOyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgaW5kZXggPSBhbXBlcnNhbmRJbmRleCArIDE7IAotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IAotICAgIHJlc3VsdCArPSBzdHJpbmcuc3Vic3RyaW5nKGluZGV4KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLQotICAvKiogUHJpbnRzIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmVjdXJzaXZlbHkuICovCi0gIHB1YmxpYyB2b2lkIHByaW50KE5vZGUgbm9kZSkKLSAgewotICAgIC8vIGlzIHRoZXJlIGFueXRoaW5nIHRvIGRvPwotICAgIGlmIChub2RlICE9IG51bGwpCi0gICAgewotICAgICAgWE1MVmlzaXRvciB2aXNpdG9yID0gbmV3IFhNTFZpc2l0b3IoKTsKLSAgICAgIHZpc2l0b3IudmlzaXROb2RlKG5vZGUpOwotICAgIH0KLSAgICBvdXQuZmx1c2goKTsKLSAgfQotCi0gIC8qKiBhIHRlbXBvcmFyeSBoYWNrIHRvIHdvcmthcm91bmQgb3VyIGluYWJpbGl0eSB0byBjcmVhdGUgYSBEb2N1bWVudFR5cGUgdGFnKi8KLSAgcHVibGljIHZvaWQgcHJpbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBncmFtbWFyVVJMKQotICB7Ci0gICAgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLSAgICBpZiAoZ3JhbW1hclVSTC5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBpbnQgbGFzdFNsYXNoSW5kZXggPSBNYXRoLm1heChncmFtbWFyVVJMLmxhc3RJbmRleE9mKCIvIiksIGdyYW1tYXJVUkwubGFzdEluZGV4T2YoIlxcIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIGlmIChsYXN0U2xhc2hJbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgc3lzdGVtSWQgPSBncmFtbWFyVVJMLnN1YnN0cmluZyhsYXN0U2xhc2hJbmRleCArIDEpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludChkb2N1bWVudCwgIlVURi04IiwgZ3JhbW1hclVSTCwgbnVsbCwgc3lzdGVtSWQpOyAvLyROT04tTkxTLTEkCi0KLSAgfQotCi0gIC8qKiBhIHRlbXBvcmFyeSBoYWNrIHRvIHdvcmthcm91bmQgb3VyIGluYWJpbGl0eSB0byBjcmVhdGUgYSBEb2N1bWVudFR5cGUgdGFnKi8KLSAgcHVibGljIHZvaWQgcHJpbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBlbmNvZGluZywgU3RyaW5nIGdyYW1tYXJGaWxlTmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gIHsKLSAgICBvdXQucHJpbnRsbigiPD94bWwgdmVyc2lvbj1cIjEuMFwiIiArICIgZW5jb2Rpbmc9XCIiICsgZW5jb2RpbmcgKyAiXCI/PiIpOyAgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgaWYgKGdyYW1tYXJGaWxlTmFtZS5lbmRzV2l0aCgiLmR0ZCIpKSAvLyROT04tTkxTLTEkCi0gICAgewotICAgICAgU3RyaW5nIGRvY1R5cGVMaW5lID0gIjwhRE9DVFlQRSAiICsgZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Tm9kZU5hbWUoKSArICIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICBpZiAocHVibGljSWQgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICJQVUJMSUMgXCIiICsgcHVibGljSWQgKyAiXCIgIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZG9jVHlwZUxpbmUgKz0gIlwiIiArIHN5c3RlbUlkICsgIlwiICI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICB9Ci0gICAgICAgIGRvY1R5cGVMaW5lICs9ICI+IjsgLy8kTk9OLU5MUy0xJAotICAgICAgICBvdXQucHJpbnRsbihkb2NUeXBlTGluZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBkb2NUeXBlTGluZSArPSAiU1lTVEVNIFwiIiArIHN5c3RlbUlkICsgIlwiID4iOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgb3V0LnByaW50bG4oZG9jVHlwZUxpbmUpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludChkb2N1bWVudCk7Ci0gIH0gIAotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldERvY3VtZW50VHlwZURhdGEoRG9jdW1lbnRUeXBlIGRvY3R5cGUpCi0gIHsKLSAgICBTdHJpbmcgZGF0YSA9IGRvY3R5cGUuZ2V0TmFtZSgpOwotICAgIGlmIChkb2N0eXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBkYXRhICs9ICIgUFVCTElDIFwiIiArIGRvY3R5cGUuZ2V0UHVibGljSWQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIHN5c3RlbUlkID0gZG9jdHlwZS5nZXRTeXN0ZW1JZCgpOwotICAgICAgaWYgKHN5c3RlbUlkID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN5c3RlbUlkID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGRhdGEgKz0gIiBcIiIgKyBzeXN0ZW1JZCArICJcIiI7ICAgICAgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBkYXRhICs9ICIgU1lTVEVNIFwiIiArIGRvY3R5cGUuZ2V0U3lzdGVtSWQoKSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIH0KLSAgICByZXR1cm4gZGF0YTsKLSAgfSAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigpCi0gIHsKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oc3RyaW5nKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludChzdHJpbmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50SW5kZW50KCkKLSAgeyAgICAgICAgICAgICAKLSAgICBpZiAoZm9ybWF0dGluZ0VuYWJsZWQpCi0gICAgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50KCIgIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICB9Ci0gIH0gICAgICAgCi0KLSAgcHVibGljIHZvaWQgcHJpbnQoU3RyaW5nIHN0cmluZykKLSAgewotICAgIG91dC5wcmludChzdHJpbmcpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL0luZmVycmVkR3JhbW1hckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZkNDZmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9JbmZlcnJlZEdyYW1tYXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vLyB0aGlzIGludGVyZmFjZSBpcyB1c2VkIHRvIGJ1aWxkIGEgZ3JhbW1hciBkb2N1bWVudCBnaXZlbiBhIGxvY2FsIGZpbGUgbmFtZQotLy8KLXB1YmxpYyBpbnRlcmZhY2UgSW5mZXJyZWRHcmFtbWFyRmFjdG9yeQoteyAgIAotICBwdWJsaWMgQ01Eb2N1bWVudCBjcmVhdGVDTURvY3VtZW50KFN0cmluZyB1cmkpOyAKLSAgcHVibGljIENNRWxlbWVudERlY2xhcmF0aW9uIGNyZWF0ZUNNRWxlbWVudERlY2xhcmF0aW9uKENNRG9jdW1lbnQgY21Eb2N1bWVudCwgRWxlbWVudCBlbGVtZW50LCBib29sZWFuIGlzTG9jYWwpOwotICBwdWJsaWMgdm9pZCBjcmVhdGVDTUNvbnRlbnQoQ01Eb2N1bWVudCBwYXJlbnRDTURvY3VtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgQ01Eb2N1bWVudCBjaGlsZENNRG9jdW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGNoaWxkRWQsIGJvb2xlYW4gaXNMb2NhbCwgU3RyaW5nIHVyaSk7Ci0gIHB1YmxpYyB2b2lkIGRlYnVnUHJpbnQoQ29sbGVjdGlvbiBjb2xsZWN0aW9uKTsgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VBdHRyaWJ1dGVWaXNpdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MThjNWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlQXR0cmlidXRlVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci0KLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLXsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU0NIRU1BX0lOU1RBTkNFX1VSSSA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIFN0cmluZyB4c2lQcmVmaXggPSAieHNpIjsgLy8kTk9OLU5MUy0xJAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIG5hbWVzcGFjZVByZWZpeCwgU3RyaW5nIG5hbWVzcGFjZVVSSSkKLSAgeyAgIAotICAgIGlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKFhNTF9TQ0hFTUFfSU5TVEFOQ0VfVVJJKSkKLSAgICB7Ci0gICAgICB4c2lQcmVmaXggPSBuYW1lc3BhY2VQcmVmaXg7Ci0gICAgfQotICB9IAotCi0gIHB1YmxpYyB2b2lkIHZpc2l0WFNJTm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgewotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvbkF0dHJpYnV0ZShBdHRyIGF0dHIsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodmFsdWUpOyAgICAgICAgICAKLSAgICB3aGlsZSAodHJ1ZSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbnNVUkkgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0gICAgICBTdHJpbmcgbG9jYXRpb25IaW50ID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOyAgICAgICAgICAgIAotICAgICAgaWYgKG5zVVJJICE9IG51bGwgJiYgbG9jYXRpb25IaW50ICE9IG51bGwpCi0gICAgICB7ICAgIAotICAgICAgICB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKG5zVVJJLCBsb2NhdGlvbkhpbnQpOyAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lTY2hlbWFMb2NhdGlvblZhbHVlUGFpcihTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYXRpb25IaW50KQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnQoRWxlbWVudCBlbGVtZW50KQotICB7Ci0gICAgTmFtZWROb2RlTWFwIG1hcCA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotICAgIGludCBtYXBMZW5ndGggPSBtYXAuZ2V0TGVuZ3RoKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBMZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBBdHRyIGF0dHIgPSAoQXR0ciltYXAuaXRlbShpKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSBET01OYW1lc3BhY2VIZWxwZXIuZ2V0UHJlZml4KGF0dHIuZ2V0TmFtZSgpKTsKLSAgICAgIFN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyLmdldE5hbWUoKSk7Ci0gICAgICBpZiAocHJlZml4ICE9IG51bGwgJiYgdW5wcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHByZWZpeC5lcXVhbHMoInhtbG5zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgewotICAgICAgICAgIHZpc2l0WE1MTmFtZXNwYWNlQXR0cmlidXRlKGF0dHIsIHVucHJlZml4ZWROYW1lLCBhdHRyLmdldFZhbHVlKCkpOwotICAgICAgICB9IAotICAgICAgICBlbHNlIGlmIChwcmVmaXguZXF1YWxzKHhzaVByZWZpeCkgJiYgdW5wcmVmaXhlZE5hbWUuZXF1YWxzKCJzY2hlbWFMb2NhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKGF0dHIsIGF0dHIuZ2V0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHJlZml4LmVxdWFscyh4c2lQcmVmaXgpICYmIHVucHJlZml4ZWROYW1lLmVxdWFscygibm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbiIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICB2aXNpdFhTSU5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb25BdHRyaWJ1dGUoYXR0ciwgYXR0ci5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAodW5wcmVmaXhlZE5hbWUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKHVucHJlZml4ZWROYW1lLmVxdWFscygieG1sbnMiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoYXR0ciwgIiIsIGF0dHIuZ2V0VmFsdWUoKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgfQotICAgICAgfSAgICAgIAotICAgIH0KLSAgfSAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudG1vZGVsL3V0aWwvTmFtZXNwYWNlSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGFhZjEyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZUluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm8KLXsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIFN0cmluZyB1cmk7Ci0gIHB1YmxpYyBTdHJpbmcgcHJlZml4OwotICBwdWJsaWMgU3RyaW5nIGxvY2F0aW9uSGludDsKLSAgcHVibGljIGJvb2xlYW4gaXNQcmVmaXhSZXF1aXJlZDsgCi0gIHByb3RlY3RlZCBIYXNodGFibGUgaGFzaHRhYmxlOwotCi0gIHB1YmxpYyBOYW1lc3BhY2VJbmZvKCkKLSAgewotICB9Ci0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8oU3RyaW5nIHVyaSwgU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMudXJpID0gdXJpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7Ci0gICAgdGhpcy5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gIH0gICAKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyhOYW1lc3BhY2VJbmZvIHRoYXQpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHRoaXMudXJpID0gdGhhdC51cmk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICB0aGlzLnByZWZpeCA9IHRoYXQucHJlZml4OwotICAgIHRoaXMubG9jYXRpb25IaW50ID0gdGhhdC5sb2NhdGlvbkhpbnQ7Ci0gICAgLy8gdG9kby4uLiBzZWUgaWYgd2UgbmVlZCB0byBjbG9uZSB0aGUgaGFzdGFibGUgCi0gIH0KLQotICBwdWJsaWMgdm9pZCBub3JtYWxpemUoKQotICB7Ci0gICAgdXJpID0gZ2V0Tm9ybWFsaXplZFZhbHVlKHVyaSk7Ci0gICAgcHJlZml4ICA9IGdldE5vcm1hbGl6ZWRWYWx1ZShwcmVmaXgpOwotICAgIGxvY2F0aW9uSGludD0gZ2V0Tm9ybWFsaXplZFZhbHVlKGxvY2F0aW9uSGludCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE5vcm1hbGl6ZWRWYWx1ZShTdHJpbmcgc3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIChzdHJpbmcgIT0gbnVsbCAmJiBzdHJpbmcudHJpbSgpLmxlbmd0aCgpID09IDApID8gbnVsbCA6IHN0cmluZzsKLSAgfQotICAgIAotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmIChoYXNodGFibGUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBoYXNodGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0gICAgfQotICAgIGhhc2h0YWJsZS5wdXQocHJvcGVydHksIHZhbHVlKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuIChoYXNodGFibGUgIT0gbnVsbCkgPyBoYXNodGFibGUuZ2V0KHByb3BlcnR5KSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgY2xvbmVOYW1lc3BhY2VJbmZvTGlzdChMaXN0IG9sZExpc3QpCi0gIHsgIAotICAgIExpc3QgbmV3TGlzdCA9IG5ldyBWZWN0b3Iob2xkTGlzdC5zaXplKCkpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IG9sZExpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBOYW1lc3BhY2VJbmZvIG9sZEluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgIG5ld0xpc3QuYWRkKG5ldyBOYW1lc3BhY2VJbmZvKG9sZEluZm8pKTsKLSAgICB9ICAgICAgICAgICAgICAgCi0gICAgcmV0dXJuIG5ld0xpc3Q7Ci0gIH0KLX0gICAgICAKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50bW9kZWwvdXRpbC9OYW1lc3BhY2VUYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODJkYTE3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnRtb2RlbC91dGlsL05hbWVzcGFjZVRhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIAotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VUYWJsZSBleHRlbmRzIE5hbWVzcGFjZUF0dHJpYnV0ZVZpc2l0b3IKLXsgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBIYXNodGFibGUgaGFzaHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCi0gIHB1YmxpYyBOYW1lc3BhY2VUYWJsZShEb2N1bWVudCBkb2N1bWVudCkKLSAgeyAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vRE9NRXh0ZW5zaW9uIGRvbUV4dGVuc2lvbiA9IERPTUV4dGVuc2lvblByb3ZpZGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5nZXRET01FeHRlbnNpb24oZG9jdW1lbnQpOwotICAgIC8vaWYgKGRvbUV4dGVuc2lvbiAhPSBudWxsKQotICAgIC8veyAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgLy8gIGFkZE5hbWVzcGFjZUluZm9MaXN0KGRvbUV4dGVuc2lvbi5nZXRJbXBsaWN0TmFtZXNwYWNlSW5mb0xpc3QoKSwgdHJ1ZSk7Ci0gICAgLy8gfQotICB9ICAgCi0KLSAgcHJpdmF0ZSBOYW1lc3BhY2VUYWJsZSgpCi0gIHsgICAgICAgIAotICB9ICAKLQotICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUVuY291bnRlcmVkKCkKLSAgewotICAgIHJldHVybiBoYXNodGFibGUudmFsdWVzKCkuc2l6ZSgpID4gMDsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4Rm9yVVJJKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIE5hbWVzcGFjZUluZm8gZW50cnkgPSBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSwgdHJ1ZSk7Ci0gICAgaWYgKGVudHJ5ICE9IG51bGwpIAotICAgIHsKLSAgICAgIHJlc3VsdCA9IGVudHJ5LnByZWZpeDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgICAgIAotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VVJJRm9yUHJlZml4KFN0cmluZyBwcmVmaXgpCi0gIHsgICAgICAgICAgIAotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IGdldE5hbWVzcGFjZUluZm9Gb3JQcmVmaXgocHJlZml4KTsKLSAgICBpZiAoaW5mbyAhPSBudWxsKSAKLSAgICB7Ci0gICAgICByZXN1bHQgPSBpbmZvLnVyaTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gICAgCi0KLSAgICAgICAgICAKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNNYXRjaGluZ1N0cmluZyhTdHJpbmcgYSwgU3RyaW5nIGIpCi0gIHsKLSAgICByZXR1cm4gKChhID09IG51bGwgJiYgYiA9PSBudWxsKSB8fCAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSkpOwotICB9Ci0gICAKLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKFN0cmluZyB1cmkpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIHJldHVybiBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKHVyaSwgZmFsc2UpOwotICB9Ci0KLQotICBwdWJsaWMgTmFtZXNwYWNlSW5mbyBnZXROYW1lc3BhY2VJbmZvRm9yVVJJKFN0cmluZyB1cmksIGJvb2xlYW4gdGVzdEltcGxpZWQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvIHJlc3VsdCA9IG51bGw7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gaGFzaHRhYmxlLnZhbHVlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgeyAgICAgICAgICAgICAgICAgICAgCi0gICAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKWkubmV4dCgpOyAKLSAgICAgIGlmIChpc01hdGNoaW5nU3RyaW5nKG5zSW5mby51cmksIHVyaSkpCi0gICAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gbnNJbmZvOwotICAgICAgICBpZiAodGVzdEltcGxpZWQgJiYgbnNJbmZvLmdldFByb3BlcnR5KCJpc0ltcGxpZWQiKSAhPSBudWxsKSAvLyROT04tTkxTLTEkCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBjb250aW51ZQotICAgICAgICB9ICAgICAgICAgICAgCi0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gCi0KLQotICBwdWJsaWMgdm9pZCBzZXRMb2NhdGlvbkhpbnRGb3JVUkkoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgeyAgICAgIAotICAgLy8gTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGhhc2h0YWJsZS52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsgICAgICAgICAgICAgICAgICAgIAotICAgICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsgCi0gICAgICBpZiAoaXNNYXRjaGluZ1N0cmluZyhuc0luZm8udXJpLCB1cmkpKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIG5zSW5mby5sb2NhdGlvbkhpbnQgPSBsb2NhdGlvbkhpbnQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gICAgCi0KLSAgcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mb0ZvclByZWZpeChTdHJpbmcgcHJlZml4KQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBwcmVmaXggPSBwcmVmaXggIT0gbnVsbCA/IHByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgcmV0dXJuIChOYW1lc3BhY2VJbmZvKWhhc2h0YWJsZS5nZXQocHJlZml4KTsKLSAgfSAgIAotCi0KLSAgcHVibGljIHZvaWQgdmlzaXRYTUxOYW1lc3BhY2VBdHRyaWJ1dGUoQXR0ciBhdHRyLCBTdHJpbmcgbmFtZXNwYWNlUHJlZml4LCBTdHJpbmcgbmFtZXNwYWNlVVJJKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgTmFtZXNwYWNlSW5mbyBuc0luZm8gPSBuZXcgTmFtZXNwYWNlSW5mbygpOyAgICAgIAotICAgIG5zSW5mby5wcmVmaXggPSBuYW1lc3BhY2VQcmVmaXg7Ci0gICAgbnNJbmZvLnVyaSA9IG5hbWVzcGFjZVVSSTsgICAgICAKLSAgIAotICAgIE5hbWVzcGFjZUluZm8gbWF0Y2hpbmdOYW1lc3BhY2VJbmZvID0gZ2V0TmFtZXNwYWNlSW5mb0ZvclVSSShuYW1lc3BhY2VVUkkpOwotICAgIGlmIChtYXRjaGluZ05hbWVzcGFjZUluZm8gIT0gbnVsbCkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBuc0luZm8ubG9jYXRpb25IaW50ID0gbWF0Y2hpbmdOYW1lc3BhY2VJbmZvLmxvY2F0aW9uSGludDsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLQotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhuYW1lc3BhY2VQcmVmaXgsIG5zSW5mbyk7Ci0KLSAgICBzdXBlci52aXNpdFhNTE5hbWVzcGFjZUF0dHJpYnV0ZShhdHRyLCBuYW1lc3BhY2VQcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gIH0gCi0gICAgICAgICAgICAgICAgIAotICBwdWJsaWMgdm9pZCB2aXNpdFhTSVNjaGVtYUxvY2F0aW9uVmFsdWVQYWlyKFN0cmluZyB1cmksIFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBzZXRMb2NhdGlvbkhpbnRGb3JVUkkodXJpLCBsb2NhdGlvbkhpbnQpOwotICB9ICAgCi0KLSAgcHVibGljIHZvaWQgYWRkTmFtZXNwYWNlSW5mbyhOYW1lc3BhY2VJbmZvIGluZm8pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcga2V5ICA9IChpbmZvLnByZWZpeCAhPSBudWxsKSA/IGluZm8ucHJlZml4IDogIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBpbnRlcm5hbEFkZE5hbWVzcGFjZUluZm8oa2V5LCBpbmZvKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhTdHJpbmcga2V5LCBOYW1lc3BhY2VJbmZvIGluZm8pCi0gIHsKLSAgICBoYXNodGFibGUucHV0KGtleSwgaW5mbyk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QsIGJvb2xlYW4gaXNJbXBsaWVkKQotICB7ICAgICAgIAotICAgIGlmIChsaXN0ICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbylpLm5leHQoKTsKLSAgICAgICAgTmFtZXNwYWNlSW5mbyBjbG9uZSA9IG5ldyBOYW1lc3BhY2VJbmZvKGluZm8pOyAgICAKLSAgICAgICAgaWYgKGlzSW1wbGllZCkKLSAgICAgICAgewotICAgICAgICAgIGNsb25lLnNldFByb3BlcnR5KCJpc0ltcGxpZWQiLCAidHJ1ZSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgfQotICAgICAgICBhZGROYW1lc3BhY2VJbmZvKGNsb25lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBhZGROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpCi0gIHsgIAotICAgIGFkZE5hbWVzcGFjZUluZm9MaXN0KGxpc3QsIGZhbHNlKTsgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgdmlzaXRYU0lOb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uQXR0cmlidXRlKEF0dHIgYXR0ciwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICAgIGFkZE5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24obG9jYXRpb25IaW50KTsKLSAgfSAKLQotICBwdWJsaWMgdm9pZCBhZGROb05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uKFN0cmluZyBsb2NhdGlvbkhpbnQpCi0gIHsKLSAgICBOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7ICAgICAgCi0gICAgbnNJbmZvLnByZWZpeCA9IG51bGw7Ci0gICAgbnNJbmZvLnVyaSA9ICIiOyAgICAgICAvLyROT04tTkxTLTEkCi0gICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsgIAotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbygiIiwgbnNJbmZvKTsgLy8kTk9OLU5MUy0xJAotICB9IAotCi0gIHB1YmxpYyB2b2lkIGFkZE5hbWVzcGFjZUluZm8oU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2F0aW9uSGludCkKLSAgewotICAgIE5hbWVzcGFjZUluZm8gbnNJbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsgICAgICAKLSAgICBuc0luZm8ucHJlZml4ID0gcHJlZml4OwotICAgIG5zSW5mby51cmkgPSB1cmk7ICAgICAgCi0gICAgbnNJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludDsgIAotICAgIGludGVybmFsQWRkTmFtZXNwYWNlSW5mbyhwcmVmaXggIT0gbnVsbCA/IHByZWZpeCA6ICIiLCBuc0luZm8pOyAvLyROT04tTkxTLTEkCi0gIH0gCi0KLSAgcHVibGljIHZvaWQgYWRkRWxlbWVudChFbGVtZW50IGVsZW1lbnQpCi0gIHsgICAKLSAgICB2aXNpdEVsZW1lbnQoZWxlbWVudCk7ICAKLSAgfSAgICAgIAotICAgICAgICAgCi0gIHB1YmxpYyB2b2lkIGFkZEVsZW1lbnRMaW5lYWdlKEVsZW1lbnQgdGFyZ2V0RWxlbWVudCkKLSAgewotICAgIExpc3QgbGlzdCA9IE5hbWVzcGFjZVRhYmxlLmdldEVsZW1lbnRMaW5lYWdlKHRhcmdldEVsZW1lbnQpOyAgICAgICAgICAgICAgICAgCi0gICAgZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KWkubmV4dCgpOwotICAgICAgYWRkRWxlbWVudChlbGVtZW50KTsKLSAgICB9ICAgICAgICAgICAgCi0gIH0KLQotICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0RWxlbWVudExpbmVhZ2UoRWxlbWVudCBlbGVtZW50KQotICB7ICAgICAgICAgIAotICAgIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOyAgICAgICAgICAgICAKLSAgICBmb3IgKE5vZGUgbm9kZSA9IGVsZW1lbnQ7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKQotICAgICAgewotICAgICAgICByZXN1bHQuYWRkKDAsIG5vZGUpOyAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgICAKLQotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXROYW1lc3BhY2VJbmZvQ29sbGVjdGlvbigpCi0gIHsgICAgICAgICAgICAgIAotICAgIHJldHVybiBoYXNodGFibGUudmFsdWVzKCk7Ci0gIH0gCi0KLSAgcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBsaXN0LmFkZEFsbChoYXNodGFibGUudmFsdWVzKCkpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci19IApkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzY4ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbWYyeG1sOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLkVPYmplY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi5yZXNvdXJjZS5FTUYyRE9NQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuVHJhbnNsYXRvclJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnV0aWxpdGllcy5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYudXRpbGl0aWVzLkRPTVV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRmVhdHVyZVZhbHVlQ29udmVyc2lvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRWxlbWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFQWRhcHRlciBleHRlbmRzIEVNRjJET01BZGFwdGVySW1wbCBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JcHVibGljIEVNRjJET01TU0VBZGFwdGVyKE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIobm9kZSwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCX0KLQotCXB1YmxpYyBFTUYyRE9NU1NFQWRhcHRlcihOb3RpZmllciBvYmplY3QsIE5vZGUgbm9kZSwgRU1GMkRPTVJlbmRlcmVyIHJlbmRlcmVyLCBUcmFuc2xhdG9yIHRyYW5zbGF0b3IpIHsKLQkJc3VwZXIob2JqZWN0LCBub2RlLCByZW5kZXJlciwgdHJhbnNsYXRvcik7Ci0JfQotCi0JcHVibGljIEVNRjJET01TU0VBZGFwdGVyKFRyYW5zbGF0b3JSZXNvdXJjZSByZXNvdXJjZSwgRG9jdW1lbnQgZG9jdW1lbnQsIEVNRjJET01SZW5kZXJlciByZW5kZXJlciwgVHJhbnNsYXRvciB0cmFuc2xhdG9yKSB7Ci0JCXN1cGVyKHJlc291cmNlLCBkb2N1bWVudCwgcmVuZGVyZXIsIHRyYW5zbGF0b3IpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY2FsY0luZGVudFN0cmluZyhOb2RlIG5vZGUpIHsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlLmdldFBhcmVudE5vZGUoKSwgIk5vZGUgbXVzdCBiZSBjb25uZWN0ZWQgaW50byB0aGUgdHJlZSIpOyAvLyROT04tTkxTLTEkCi0KLQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQlTdHJpbmcgaW5kZW50U3RyaW5nID0gZ2V0TmV3bGluZVN0cmluZyhub2RlKTsKLQotCQkvLyBGaW5kIGluZGVudGF0aW9uIHN0cmluZyBmb3IgdGhpcyBub2RlIGJhc2VkIG9uIGl0cyBzaWJsaW5nIG9yCi0JCS8vIHBhcmVudAotCQlOb2RlIHByZXZpb3VzU2libGluZyA9IERPTVV0aWxpdGllcy5nZXRQcmV2aW91c05vZGVTaWJsaW5nKG5vZGUpOwotCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwpIHsKLQkJCWluZGVudFN0cmluZyA9IHByaW1HZXRJbmRlbnRTdHJpbmcocHJldmlvdXNTaWJsaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBwYXJlbnRJbmRlbnRTdHJpbmcgPSBwcmltR2V0SW5kZW50U3RyaW5nKHBhcmVudCk7Ci0JCQlpbmRlbnRTdHJpbmcgPSBwYXJlbnRJbmRlbnRTdHJpbmcgKyBET01VdGlsaXRpZXMuSU5ERU5UX1NUUklORzsKLQkJfQotCQlyZXR1cm4gaW5kZW50U3RyaW5nOwotCX0KLQotCS8qCi0JICogUHJpbnRzIG91dCBhIERPTSBub3RpZmljYXRpb24gZm9yIGRlYnVnZ2luZy4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBkZWJ1Z0RPTU5vdGlmeShJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCWlmIChmRGVidWcpIHsKLQkJCVN0cmluZyBub3RpZlR5cGUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJc3dpdGNoIChldmVudFR5cGUpIHsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQUREIDoKLQkJCQkJbm90aWZUeXBlID0gIkFERCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlJFTU9WRSA6Ci0JCQkJCW5vdGlmVHlwZSA9ICJSRU1PVkUiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCQlub3RpZlR5cGUgPSAiQ0hBTkdFIjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQljYXNlIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEIDoKLQkJCQkJbm90aWZUeXBlID0gIkNPTlRFTlRfQ0hBTkdFRCI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIDoKLQkJCQkJbm90aWZUeXBlID0gIlNUUlVDVFVSRV9DSEFOR0UiOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIkRPTSBDaGFuZ2U6ICIgKyBub3RpZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRub3RpZmllciAgICAgIDogIiArIG5vdGlmaWVyKTsgLy8kTk9OLU5MUy0xJAotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgIlx0Y2hhbmdlZEZlYXR1cmU6ICIgKyBjaGFuZ2VkRmVhdHVyZSk7IC8vJE5PTi1OTFMtMSQKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk9fREVCVUcsICJcdG9sZFZhbHVlICAgICAgOiAiICsgb2xkVmFsdWUpOyAvLyROT04tTkxTLTEkCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPX0RFQlVHLCAiXHRuZXdWYWx1ZSAgICAgIDogIiArIG5ld1ZhbHVlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZGlzYWJsZVVuZG9NYW5hZ2VtZW50SWZOZWNlc3NhcnkoKSB7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldFhNTE1vZGVsKCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsICYmIG1vZGVsLmdldFVuZG9NYW5hZ2VyKCkgIT0gbnVsbCkKLQkJCW1vZGVsLmRpc2FibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVVuZG9NYW5hZ2VtZW50KCkgewotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRYTUxNb2RlbCgpOwotCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5nZXRVbmRvTWFuYWdlcigpICE9IG51bGwpCi0JCQltb2RlbC5lbmFibGVVbmRvTWFuYWdlbWVudCgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TmV3bGluZVN0cmluZyhOb2RlIG5vZGUpIHsKLQkJLyoKLQkJICogV2Ugc2hvdWxkIGFsd2F5cyBoYXZlIElET01Ob2RlLCBhbmQgSVN0cnVjdHVyZWREb2N1bWVudCwgYW5kCi0JCSAqIGNvbnNxdWVudGx5IGEgdmFsaWQgInByZWZlcnJlZCIgbGluZSBkZWxpbWl0ZXIsIGJ1dCBqdXN0IHRvIGJlCi0JCSAqIHNhZmUsIHdlJ2xsIGFzc2lnbiBzb21ldGhpbmcgYnkgZGVmYXVsdC4KLQkJICovCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50ID0geG1sTm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gRE9NVXRpbGl0aWVzLk5FV0xJTkVfU1RSSU5HOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKSB7Ci0JCWlmIChnZXROb2RlKCkgIT0gbnVsbCkKLQkJCXJldHVybiAoKElET01Ob2RlKSBnZXROb2RlKCkpLmdldE1vZGVsKCk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRYTUxOb2RlKCkgewotCQlyZXR1cm4gKElET01Ob2RlKSBnZXROb2RlKCk7Ci0JfQotCi0JLyoKLQkgKiBEbyBub3RoaW5nIGZvciBTU0UsIHdlIHdpbGwgdG9sZXJhdGUgYW55dGhpbmcgdGhleSBhZGQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVGZWF0dXJlVmFsdWVDb252ZXJzaW9uRXhjZXB0aW9uKEZlYXR1cmVWYWx1ZUNvbnZlcnNpb25FeGNlcHRpb24gZXgpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCS8qCi0JICogRG8gbm90aGluZyBmb3IgU1NFLCB3ZSB3aWxsIHRvbGVyYXRlIGFueXRoaW5nIHRoZXkgYWRkCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaGFuZGxlSW52YWxpZE11bHRpTm9kZXMoU3RyaW5nIG5vZGVOYW1lKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbmRlbnQoTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlBc3NlcnQuaXNOb3ROdWxsKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCAiTm9kZSBtdXN0IGJlIGNvbm5lY3RlZCBpbnRvIHRoZSB0cmVlIik7IC8vJE5PTi1OTFMtMSQKLQkJQXNzZXJ0LmlzTm90TnVsbChub2RlKTsKLQotCQlTdHJpbmcgaW5kZW50U3RyaW5nID0gY2FsY0luZGVudFN0cmluZyhub2RlKTsKLQotCQkvLyBJbmRlbnQgYmVmb3JlIHRoZSBzdGFydCB0YWcKLQkJaW5kZW50U3RhcnRUYWcoaW5kZW50U3RyaW5nLCBub2RlLCBtYXApOwotCi0JCS8vIEluZGVudCBiZWZvcmUgdGhlIGVuZCB0YWcKLQkJaW5kZW50RW5kVGFnKGluZGVudFN0cmluZywgbm9kZSwgbWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBJbmRlbnQgYmVmb3JlIHRoZSBlbmQgdGFnIG9mIHRoZSA8bm9kZT5wYXNzZWQgaW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50RW5kVGFnKFN0cmluZyBpbmRlbnRTdHJpbmcsIE5vZGUgbm9kZSwgVHJhbnNsYXRvciBtYXApIHsKLQkJaWYgKCFtYXAuc2hvdWxkSW5kZW50RW5kVGFnKCkpCi0JCQlyZXR1cm47Ci0JCVN0cmluZyBkb21QYXRoID0gbWFwLmdldERPTVBhdGgoKTsKLQotCQlpZiAoKCFtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiAhbWFwLmlzRE9NVGV4dFZhbHVlKCkpIHx8IChtYXAuaXNNYW5hZ2VkQnlQYXJlbnQoKSAmJiBkb21QYXRoLmxlbmd0aCgpICE9IDApICYmIG5vZGUuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoZG9tUGF0aCkpIHsKLQkJCVRleHQgbmV3V1MgPSBub2RlLmdldE93bmVyRG9jdW1lbnQoKS5jcmVhdGVUZXh0Tm9kZShnZXROZXdsaW5lU3RyaW5nKG5vZGUpICsgaW5kZW50U3RyaW5nKTsgLy8kTk9OLU5MUy0xJAotCQkJRE9NVXRpbGl0aWVzLmluc2VydEJlZm9yZU5vZGUobm9kZSwgbmV3V1MsIG51bGwpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogSW5kZW50IGJlZm9yZSB0aGUgc3RhcnQgdGFnIG9mIHRoZSA8bm9kZT5wYXNzZWQgaW4uCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5kZW50U3RhcnRUYWcoU3RyaW5nIGluZGVudFN0cmluZywgTm9kZSBub2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlUZXh0IG5ld1dTID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoZ2V0TmV3bGluZVN0cmluZyhub2RlKSArIGluZGVudFN0cmluZyk7IC8vJE5PTi1OTFMtMSQKLQkJRE9NVXRpbGl0aWVzLmluc2VydEFmdGVyTm9kZShwYXJlbnQsIG5ld1dTLCBET01VdGlsaXRpZXMuZ2V0UHJldmlvdXNOb2RlU2libGluZyhub2RlKSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNFbXB0eVRhZyhFbGVtZW50IHBhcmVudCkgewotCQlyZXR1cm4gKChFbGVtZW50SW1wbCkgcGFyZW50KS5pc0VtcHR5VGFnKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgRE9NIG5vZGUgY2hhbmdlcy4gSXQgYXR0ZW1wdHMgdG8gdXBkYXRlCi0JICogTU9GIG9iamVjdCBiYXNlZCBvbiB0aGUgY2hhbmdlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQotCQlpZiAoIWlzTm90aWZpY2F0aW9uRW5hYmxlZCgpKQotCQkJcmV0dXJuOwotCi0JCWRlYnVnRE9NTm90aWZ5KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwotCi0JCWlmIChub3RpZmllciAhPSBnZXROb2RlKCkgJiYgZXZlbnRUeXBlICE9IElOb2RlTm90aWZpZXIuQ0hBTkdFKSB7Ci0JCQkvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIHRoZSBub3RpZmljYXRpb24gd2FzIHNlbnQgZnJvbSBhCi0JCQkvLyBzdWIgbm9kZS4gVXNlIHRoZSBub3RpZmllcnMgbmFtZSB0byBkZXRlcm1pbmUgd2hpY2gKLQkJCS8vIE1PRiBmZWF0dXJlIHRvIHVwZGF0ZS4gTm90ZSB0aGF0IGlzIGlzIGFzc3VtZWQgdGhhdCBpZgotCQkJLy8gdGhlIGV2ZW50VHlwZSBpcyBDSEFOR0UgdGhlbiBpdCBhdHRyaWJ1dGUgb24gYSBwYXRoIG5vZGUKLQkJCS8vIGNoYW5naW5nLiBUaGlzIHdhcyBwdXQgaW4gZm9yIHRoZSBFR0wgZ3JvdXAuCi0JCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBFbGVtZW50KSB7Ci0JCQkJaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VEIHx8IGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCB8fCBldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpIHsKLQkJCQkJRWxlbWVudCBub3RpZnlpbmdOb2RlID0gKEVsZW1lbnQpIG5vdGlmaWVyOwotCQkJCQlUcmFuc2xhdG9yIG1hcCA9IGZpbmRUcmFuc2xhdG9yKG5vdGlmeWluZ05vZGUuZ2V0Tm9kZU5hbWUoKSwgZmFsc2UpOwotCQkJCQlpZiAobWFwICE9IG51bGwpCi0JCQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcCwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIFVwZGF0ZSBldmVyeXRoaW5nIG9uIFNUUlVDVFVSRV9DSEFOR0Ugb3IgQ09OVEVOVF9DSEFOR0UuCi0JCQkvLyBPdGhlciBldmVudCB0eXBlcyBvY2N1ciB0b28gb2Z0ZW4uCi0JCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEKSB7Ci0JCQkJdXBkYXRlTU9GKCk7Ci0JCQl9Ci0JCQkvLyBVcGRhdGUganVzdCB0aGUgYXR0cmlidXRlIHRoYXQgY2hhbmdlZC4KLQkJCWVsc2UgaWYgKGV2ZW50VHlwZSA9PSBJTm9kZU5vdGlmaWVyLkNIQU5HRSkgewotCQkJCVRyYW5zbGF0b3IgbWFwID0gZmluZFRyYW5zbGF0b3IoY2hhbmdlZEZlYXR1cmUudG9TdHJpbmcoKSwgdHJ1ZSk7Ci0JCQkJaWYgKG1hcCAhPSBudWxsKQotCQkJCQl1cGRhdGVNT0ZGZWF0dXJlKG1hcCwgZ2V0Tm9kZSgpLCBnZXRFT2JqZWN0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcG9zdFVwZGF0ZURPTUZlYXR1cmUoVHJhbnNsYXRvciBtYXAsIE5vZGUgbm9kZSwgRU9iamVjdCBtb2ZPYmplY3QpIHsKLQkJZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVVcGRhdGVET01GZWF0dXJlKFRyYW5zbGF0b3IgbWFwLCBOb2RlIG5vZGUsIEVPYmplY3QgbW9mT2JqZWN0KSB7Ci0JCXN1cGVyLnByZVVwZGF0ZURPTUZlYXR1cmUobWFwLCBub2RlLCBtb2ZPYmplY3QpOwotCQlkaXNhYmxlVW5kb01hbmFnZW1lbnRJZk5lY2Vzc2FyeSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByaW1BZGRET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkuYWRkQWRhcHRlcigoRU1GMkRPTVNTRUFkYXB0ZXIpIGFuQWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihFT2JqZWN0IG1vZk9iamVjdCwgVHJhbnNsYXRvciBjaGlsZE1hcCkgewotCQlFbGVtZW50IG5ld05vZGUgPSBjcmVhdGVOZXdOb2RlKG1vZk9iamVjdCwgY2hpbGRNYXApOwotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VBZGFwdGVyKG1vZk9iamVjdCwgbmV3Tm9kZSwgZlJlbmRlcmVyLCBjaGlsZE1hcCk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGFuIGFkYXB0ZXIgZm9yIGEgY2hpbGQgRE9NIG5vZGUKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZSBUaGUgbm9kZSB0byBjcmVhdGUgdGhlIGFkYXB0ZXIgZm9yLgotCSAqLwotCXByb3RlY3RlZCBFTUYyRE9NQWRhcHRlciBwcmltQ3JlYXRlQWRhcHRlcihOb2RlIG5vZGUsIFRyYW5zbGF0b3IgY2hpbGRNYXApIHsKLQkJcmV0dXJuIG5ldyBFTUYyRE9NU1NFQWRhcHRlcihub2RlLCBmUmVuZGVyZXIsIGNoaWxkTWFwKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgRU1GMkRPTUFkYXB0ZXIgcHJpbUdldEV4aXN0aW5nQWRhcHRlcihOb2RlIGFOb2RlKSB7Ci0JCXJldHVybiAoRU1GMkRPTUFkYXB0ZXIpICgoSURPTU5vZGUpIGFOb2RlKS5nZXRFeGlzdGluZ0FkYXB0ZXIoRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHByaW1HZXRJbmRlbnRTdHJpbmcoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZmxhdE1vZGVsID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCWludCBub2RlU3RhcnRPZmYgPSAoKElET01Ob2RlKSBub2RlKS5nZXRTdGFydE9mZnNldCgpOwotCi0JCWludCBzdGFydE9mZiA9IE1hdGgubWF4KDAsIG5vZGVTdGFydE9mZiAtIDEwMCk7Ci0JCWludCBlbmRPZmYgPSBub2RlU3RhcnRPZmY7Ci0KLQkJdHJ5IHsKLQkJCVN0cmluZyB0ZXh0ID0gZmxhdE1vZGVsLmdldChzdGFydE9mZiwgZW5kT2ZmIC0gc3RhcnRPZmYpOwotCi0JCQlpbnQgaW54ID0gdGV4dC5sZW5ndGgoKSAtIDE7Ci0JCQlpZiAoaW54ID49IDApIHsKLQkJCQlmb3IgKDsgaW54ID49IDA7IGlueC0tKSB7Ci0JCQkJCWNoYXIgY2ggPSB0ZXh0LmNoYXJBdChpbngpOwotCQkJCQlpZiAoQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaCkgJiYgY2ggIT0gJ1xuJyAmJiBjaCAhPSAnXHInKSB7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlpbngrKzsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKGlueCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJfQotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZW1vdmVET01BZGFwdGVyKE5vZGUgYU5vZGUsIEVNRjJET01BZGFwdGVyIGFuQWRhcHRlcikgewotCQkoKElET01Ob2RlKSBhTm9kZSkucmVtb3ZlQWRhcHRlcigoRU1GMkRPTVNTRUFkYXB0ZXIpIGFuQWRhcHRlcik7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCByZW9yZGVyRE9NQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIGNoaWxkTm9kZSwgTm9kZSBpbnNlcnRCZWZvcmVOb2RlLCBUcmFuc2xhdG9yIG1hcCkgewotCQlzdXBlci5yZW9yZGVyRE9NQ2hpbGQocGFyZW50Tm9kZSwgY2hpbGROb2RlLCBpbnNlcnRCZWZvcmVOb2RlLCBtYXApOwotCQkvLyBTaW5jZSByZW9yZGVyaW5nIGRlbGV0ZXMgYWxsIHRoZSB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgbm9kZSwgd2UKLQkJLy8gbXVzdCBpbmRlbnQgLgotCQlpZiAoaW5zZXJ0QmVmb3JlTm9kZSAhPSBudWxsICYmIGluc2VydEJlZm9yZU5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCWluZGVudFN0YXJ0VGFnKGNhbGNJbmRlbnRTdHJpbmcoaW5zZXJ0QmVmb3JlTm9kZSksIGluc2VydEJlZm9yZU5vZGUsIG1hcCk7Ci0JCWVsc2UKLQkJCWluZGVudFN0YXJ0VGFnKGNhbGNJbmRlbnRTdHJpbmcoY2hpbGROb2RlKSwgY2hpbGROb2RlLCBtYXApOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEVtcHR5VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQkoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5zZXRFbXB0eVRhZyh0cnVlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVET00oKSB7Ci0JCWlmICghaXNOb3RpZmljYXRpb25FbmFibGVkKCkpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlkaXNhYmxlVW5kb01hbmFnZW1lbnRJZk5lY2Vzc2FyeSgpOwotCQkJcHJpbVVwZGF0ZURPTSgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJZW5hYmxlVW5kb01hbmFnZW1lbnQoKTsKLQkJfQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmNlNDI5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1lbWZNb2RlbFN5bmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbWYyeG1sL0VNRjJET01TU0VSZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICoKLSAqIENvbnRyaWJ1dG9yczoKLSAqIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVtZjJ4bWw7Ci0KLQotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUudXRpbC5FY29yZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamVtLnV0aWwuZW1mLndvcmtiZW5jaC5Qcm9qZWN0UmVzb3VyY2VTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5pbnRlcm5hbC5lbWYucmVzb3VyY2UuRU1GMkRPTVJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlRyYW5zbGF0b3JSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmludGVybmFsLmVtZi51dGlsaXRpZXMuRE9NVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLldvcmtiZW5jaFJlc291cmNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1md29ya2JlbmNoLmludGVncmF0aW9uLlJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuTW9kZWxMaWZlY3ljbGVFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTGlmZWN5Y2xlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbFN0YXRlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFUmVuZGVyZXIgZXh0ZW5kcyBFTUYyRE9NUmVuZGVyZXIgaW1wbGVtZW50cyBJTW9kZWxTdGF0ZUxpc3RlbmVyLCBJTW9kZWxMaWZlY3ljbGVMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGFib3V0VG9DaGFuZ2VOb2RlID0gbnVsbDsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzQmF0Y2hDaGFuZ2VzID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNTYXZpbmcgPSBmYWxzZTsKLQotCXByaXZhdGUgSU1vZGVsTWFuYWdlciBtb2RlbE1hbmFnZXI7Ci0KLQkvKiogVGhlIFhNTCBET00gbW9kZWwgKi8KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIHhtbE1vZGVsOwotCi0JLyoqIFVzZWQgaW50ZXJuYWxseTsgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIHhtbCBtb2RlbCAqLwotCXByb3RlY3RlZCBTdHJpbmcgeG1sTW9kZWxJZDsKLQotCXByb3RlY3RlZCBib29sZWFuIHhtbE1vZGVsUmV2ZXJ0ZWQgPSBmYWxzZTsKLQotCXB1YmxpYyBFTUYyRE9NU1NFUmVuZGVyZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yUmVhZCgpIHsKLQkJaWYgKCFyZXNvdXJjZS5pc05ldygpKSB7Ci0JCQlTdHJpbmcgaWQgPSBnZXRNb2RlbE1hbmFnZXJJZCgpOwotCQkJZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoaWQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgYWNjZXNzRm9yV3JpdGUoKSB7Ci0JCW1vZGVsQWNjZXNzRm9yV3JpdGUoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZWUgYmF0Y2hNb2RlbEVuZAotCSAqIAotCSAqLwotCi0JcHVibGljIHZvaWQgYmF0Y2hNb2RlRW5kKCkgewotCQlnZXRYTUxNb2RlbCgpLmNoYW5nZWRNb2RlbCgpOwotCQlzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKHRydWUpOwotCQlpc0JhdGNoQ2hhbmdlcyA9IGZhbHNlOwotCX0KLQotCS8qKgotCSAqIGJhdGNoTW9kZVN0YXJ0IGFuZCBiYXRjaE1vZGVFbmQgaXMgYSBwYWlyIHRoYXQgY29udHJvbHMgbm90aWZpY2F0aW9ucywKLQkgKiBhbmQgdHJlYWQgYWNjZXNzLiBUaGV5IHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIGluIGEgdHJ5L2ZpbmFsbHkgYmxvY2suCi0JICogCi0JICogc2V0QmF0Y2hNb2RlbCBiZWdpbnMgdGhlIHByb2Nlc3Npbmcgd2hlcmUgbm90aWZpY2F0aW9ucyBhcmUgbm90IHNlbnQKLQkgKiBvdXQgb24gZWFjaCBjaGFuZ2UsIGJ1dCBzYXZlZCB1cCB1bnRpbCB0aGUgZW5kQmF0Y2hNb2RlIGNhbGxlZC4KLQkgKiAKLQkgKiBUaGlzIHBhaXIgb2YgY2FsbHMgY2FuIGFsc28sIGluZGlyZWN0bHksICJsb2NrIiB0aGUgRE9NIE1vZGVsIHRvIGFjY2VzcwotCSAqIGZyb20gb25seSBvbmUgdGhyZWFkLCBzbyBpdCBzaG91bGQgbm90IGJlIGxvY2tlZCBmb3IgbG9uZyBwZXJpb2RzIG9mCi0JICogdGltZS4gVGhhdCdzIGFsc28gd2h5IGl0IGlzIGltcG9ydGFudCB0byBoYXZlIHRoZSBlbmRCYXRjaE1vZGUgaW4gYQotCSAqIGZpbmFsbHkgYmxvY2sgdG8gYmUgc3VyZSBpdCBpcyBhbHdheXMgY2FsbGVkLCBvciB0aGUgRE9NIHdpbGwgYmUgbGVmdAotCSAqIGluIGEgbG9ja2VkLCB1bnVzYWJsZSwgc3RhdGUgYW5kIG9ubHkgc2hvcnRseSBhd2F5IGZyb20gc2V2ZXJlcmUKLQkgKiBwcm9ncmFtIGVycm9yLgotCSAqIAotCSAqIDxwcmU+PGNvZGU+Ci0JICogRXhhbXBsZQotCSAqIDwvY29kZT4KLQkgKiAgCi0JICogIHRyeSB7IAotCSAqICAJCWJhdGNoTW9kZWxTdGFydCgpOwotCSAqICAJCS4uLmRvIGEgc29tZSB3b3JrIC4uLgotCSAqICAJCX0KLQkgKiAgCWZpbmFsbHkgewotCSAqICAJCWVuZEJhdGNoTW9kZSgpOwotCSAqICAJCX0KLQkgKiAgCi0JICogIAotCSAqIDwvcHJlPgotCSAqLwotCXB1YmxpYyB2b2lkIGJhdGNoTW9kZVN0YXJ0KCkgewotCQlpc0JhdGNoQ2hhbmdlcyA9IHRydWU7Ci0JCWdldFhNTE1vZGVsKCkuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCXNldFJvb3ROb2RlQWRhcHRlck5vdGlmaWNhdGlvbkVuYWJsZWQoZmFsc2UpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjYWNoZVN5bmNocm9uaXphdGlvblN0YW1wKCkgewotCQlJRmlsZSBmaWxlID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuZ2V0RmlsZShyZXNvdXJjZSk7Ci0JCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJCXhtbE1vZGVsLnJlc2V0U3luY2hyb25pemF0aW9uU3RhbXAoZmlsZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgRG9jdW1lbnQgZ2l2ZW4KLQkgKiAKLQkgKiBAYVJlc291cmNlLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURvY3VtZW50KCkgewotCQlUcmFuc2xhdG9yUmVzb3VyY2UgcmVzID0gZ2V0UmVzb3VyY2UoKTsKLQkJcmVzLnNldERlZmF1bHRzKCk7Ci0JCUlGaWxlIGZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJSW5wdXRTdHJlYW0gaXMgPSBET01VdGlsaXRpZXMuY3JlYXRlSGVhZGVySW5wdXRTdHJlYW0ocmVzLmdldERvY3R5cGUoKSwgcmVzLmdldFB1YmxpY0lkKCksIHJlcy5nZXRTeXN0ZW1JZCgpKTsKLQkJaWYgKGlzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQl0cnkgewotCQkJCUxpc3QgZm9sZGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlJQ29udGFpbmVyIGNvbnRhaW5lciA9IGZpbGUuZ2V0UGFyZW50KCk7Ci0JCQkJd2hpbGUgKG51bGwgIT0gY29udGFpbmVyICYmICFjb250YWluZXIuZXhpc3RzKCkgJiYgY29udGFpbmVyIGluc3RhbmNlb2YgSUZvbGRlcikgewotCQkJCQlmb2xkZXJzLmFkZChjb250YWluZXIpOwotCQkJCQljb250YWluZXIgPSBjb250YWluZXIuZ2V0UGFyZW50KCk7Ci0JCQkJfQotCQkJCUlGb2xkZXIgZm9sZGVyID0gbnVsbDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGZvbGRlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJZm9sZGVyID0gKElGb2xkZXIpIGZvbGRlcnMuZ2V0KGkpOwotCQkJCQlmb2xkZXIuY3JlYXRlKHRydWUsIHRydWUsIG51bGwpOwotCQkJCX0KLQkJCQlmaWxlLmNyZWF0ZShpcywgdHJ1ZSwgbnVsbCk7Ci0JCQkJZmlsZS5zZXRMb2NhbCh0cnVlLCAxLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlMSk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAobnVsbCAhPSBpcykgewotCQkJCQlpcy5jbG9zZSgpOwotCQkJCX0KLQkJCX0KLQkJCWluaXRpYWxpemVYTUxNb2RlbChmaWxlLCB0cnVlKTsKLQkJfQotCQljYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiSVdBRTAwMTdFIFVuZXhwZWN0ZWQgSU8gZXhjZXB0aW9uIG9jY3VycmVkIGNyZWF0aW5nIHhtbCBkb2N1bWVudCIpOy8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZURPTVRyZWVJZk5lY2Vzc2FyeSgpIHsKLQkJaWYgKG5lZWRzVG9DcmVhdGVET00pCi0JCQljcmVhdGVET01UcmVlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIEVNRjJET01BZGFwdGVyIGNyZWF0ZVJvb3RET01BZGFwdGVyKCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VBZGFwdGVyKGdldFJlc291cmNlKCksIGRvY3VtZW50LCB0aGlzLCBnZXRSZXNvdXJjZSgpLmdldFJvb3RUcmFuc2xhdG9yKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRlUmVnaXN0ZXJBc01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJeG1sTW9kZWwucmVtb3ZlTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkZVJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKQotCQkJeG1sTW9kZWwucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkZXJlZ2lzdGVyRnJvbVhNTE1vZGVsKCkgewotCQlkZVJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJZGVSZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCQkvLyBUaGlzIHRyeS9jYXRjaCBibG9jayBpcyBhIGhhY2sgdG8gZml4IGRlZmVjdCAyMDQxMTQuIFRoaXMgb2NjdXJzCi0JCS8vIGJlY2F1c2UKLQkJLy8gdGhlIG1vZGVsIG1hbmFnZXIgcGx1Z2luIGlzIHNodXQgZG93biBhbmQgdW5sb2FkZWQgYmVmb3JlIHRoZSBqMmVlCi0JCS8vIHBsdWdpbi4KLQkJLy8gQ2FsbGluZyBnZXRNb2RlbE1hbmFnZXIoKSBjYW4gcmVzdWx0IGluIGEgY2xhc3MgY2FzdCBleGNlcHRpb24gdGhhdAotCQkvLyBzaG91bGQKLQkJLy8gYmUgaWdub3JlZC4KLQkJLy8gTW9kZWxNYW5hZ2VyIG1nciA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlnZXRNb2RlbE1hbmFnZXIoKTsKLQkJfQotCQljYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGV4YykgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQlpbnQgd3JpdGVDb3VudCA9IHJlc291cmNlLmdldFdyaXRlQ291bnQoKTsKLQkJCWludCByZWFkQ291bnQgPSByZXNvdXJjZS5nZXRSZWFkQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgd3JpdGVDb3VudDsgaSsrKQotCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCQkJZm9yIChpbnQgaWkgPSAwOyBpaSA8IHJlYWRDb3VudDsgaWkrKykKLQkJCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlFTUYyRE9NQWRhcHRlciBhZGFwdGVyID0gKEVNRjJET01BZGFwdGVyKSBFY29yZVV0aWwuZ2V0QWRhcHRlcihyZXNvdXJjZS5lQWRhcHRlcnMoKSwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIucmVtb3ZlQWRhcHRlcnMoYWRhcHRlci5nZXROb2RlKCkpOwotCQl9Ci0JCXhtbE1vZGVsID0gbnVsbDsKLQkJeG1sTW9kZWxJZCA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgZG9TYXZlKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0JCXRyeSB7Ci0JCQlpc1NhdmluZyA9IHRydWU7Ci0JCQlpZiAobnVsbCAhPSBvdXRwdXRTdHJlYW0pIHsKLQkJCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbih0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIiBzaG91bGQgbm90IHVzZSBhbiBPdXRwdXRTdHJlYW0gZm9yIHNhdmluZyIpO30gLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRE9NVHJlZUlmTmVjZXNzYXJ5KCk7Ci0JCQlSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIgc3luY2hyb25pemVyID0gKFJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplcikgKChQcm9qZWN0UmVzb3VyY2VTZXQpIHJlc291cmNlLmdldFJlc291cmNlU2V0KCkpLmdldFN5bmNocm9uaXplcigpOwotCQkJSUZpbGUgYUZpbGUgPSBXb3JrYmVuY2hSZXNvdXJjZUhlbHBlci5nZXRGaWxlKHJlc291cmNlKTsKLQkJCXRyeSB7Ci0JCQkJc3luY2hyb25pemVyLnByZVNhdmUoYUZpbGUpOwotCQkJCXhtbE1vZGVsLnNhdmUoYUZpbGUpOwotCQkJfQotCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZXgpIHsKLQkJCQlzeW5jaHJvbml6ZXIucmVtb3ZlRnJvbVJlY2VudGx5U2F2ZWRMaXN0KGFGaWxlKTsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCX0KLQkJCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlzU2F2aW5nID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgRU1GMkRPTUFkYXB0ZXIgZ2V0RXhpc3RpbmdET01BZGFwdGVyKE5vZGUgbm9kZSkgewotCQlJRE9NTm9kZSB4Tm9kZSA9IChJRE9NTm9kZSkgbm9kZTsKLQkJcmV0dXJuIChFTUYyRE9NU1NFQWRhcHRlcikgeE5vZGUuZ2V0QWRhcHRlckZvcihFTUYyRE9NQWRhcHRlci5BREFQVEVSX0NMQVNTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU1vZGVsTWFuYWdlciBnZXRNb2RlbE1hbmFnZXIoKSB7Ci0JCWlmIChtb2RlbE1hbmFnZXIgPT0gbnVsbCkKLQkJCW1vZGVsTWFuYWdlciA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCk7Ci0JCXJldHVybiBtb2RlbE1hbmFnZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIGlkIHVzZWQgdG8ga2V5IHRoZSBYTUwgcmVzb3VyY2UgaW4gdGhlIFhNTCBNb2RlbE1hbmFnZXIuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2RlbE1hbmFnZXJJZCgpIHsKLQkJaWYgKHhtbE1vZGVsSWQgPT0gbnVsbCkgewotCQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUoZ2V0UmVzb3VyY2UoKSk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWxJZCA9IGdldE1vZGVsTWFuYWdlcigpLmNhbGN1bGF0ZUlkKGZpbGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJeG1sTW9kZWxJZCA9IHJlc291cmNlLmdldFVSSSgpICsgTG9uZy50b1N0cmluZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHhtbE1vZGVsSWQ7Ci0JfQotCi0JcHJvdGVjdGVkIFJlc291cmNlU2V0IGdldFJlc291cmNlU2V0KCkgewotCQlyZXR1cm4gcmVzb3VyY2UgPT0gbnVsbCA/IG51bGwgOiByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgRE9NIG1vZGVsIGZvciB0aGlzIHJlc291cmNlLgotCSAqLwotCXB1YmxpYyBJRE9NTW9kZWwgZ2V0WE1MTW9kZWwoKSB7Ci0JCXJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTE1vZGVsSWQoKSB7Ci0JCXJldHVybiB4bWxNb2RlbElkOwotCX0KLQotCXByaXZhdGUgSURPTU1vZGVsIGluaXRpYWxpemVYTUxNb2RlbChJRmlsZSBmaWxlLCBib29sZWFuIGZvcldyaXRlKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24gewotCQlpZiAoZmlsZSA9PSBudWxsIHx8ICFmaWxlLmV4aXN0cygpKQotCQkJdGhyb3cgbmV3IEZpbGVOb3RGb3VuZEV4Y2VwdGlvbigoZmlsZSA9PSBudWxsKSA/ICJudWxsIiA6IGZpbGUuZ2V0RnVsbFBhdGgoKS50b09TU3RyaW5nKCkpOyAvLyROT04tTkxTLTEkCi0JCXRyeSB7Ci0JCQlpZiAoZm9yV3JpdGUpIHsKLQkJCQlzZXRYTUxNb2RlbCgoSURPTU1vZGVsKSBnZXRNb2RlbE1hbmFnZXIoKS5nZXRNb2RlbEZvckVkaXQoZmlsZSkpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJc2V0WE1MTW9kZWwoKElET01Nb2RlbCkgZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0TW9kZWxGb3JSZWFkKGZpbGUpKTsKLQkJCX0KLQkJCXNldFhNTE1vZGVsSWQoZ2V0WE1MTW9kZWwoKS5nZXRJZCgpKTsKLQkJCW5lZWRzVG9DcmVhdGVET00gPSBmYWxzZTsKLQkJfQotCQljYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJU3RyaW5nIGlkID0gZ2V0TW9kZWxNYW5hZ2VyKCkuY2FsY3VsYXRlSWQoZmlsZSk7Ci0JCXN5bmNSZWZlcmVuY2VDb3VudHMoaWQsIGZvcldyaXRlKTsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQlkb2N1bWVudCA9IHhtbE1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXJldHVybiB4bWxNb2RlbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0JhdGNoTW9kZSgpIHsKLQkJcmV0dXJuIGlzQmF0Y2hDaGFuZ2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWQoKSB7Ci0JCXJldHVybiAoZ2V0WE1MTW9kZWwoKSAhPSBudWxsICYmIGdldFhNTE1vZGVsKCkuaXNEaXJ0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZCgpIHsKLQkJaWYgKGdldFJlc291cmNlU2V0KCkgPT0gbnVsbCB8fCB4bWxNb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4geG1sTW9kZWwuaXNTaGFyZWQoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc1NoYXJlZEZvcldyaXRlKCkgewotCQlpZiAoZ2V0UmVzb3VyY2VTZXQoKSA9PSBudWxsIHx8IHhtbE1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB4bWxNb2RlbC5pc1NoYXJlZEZvckVkaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBsb2FkRG9jdW1lbnQoSW5wdXRTdHJlYW0gaW4sIE1hcCBvcHRpb25zKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpZiAobnVsbCAhPSBpbikgewotCQkJdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSArICIgc2hvdWxkIG5vdCB1c2UgYW4gSW5wdXRTdHJlYW0gZm9yIGxvYWRpbmciKTt9IC8vJE5PTi1OTFMtMSQKLQkJSUZpbGUgZmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQlpbml0aWFsaXplWE1MTW9kZWwoZmlsZSwgKHJlc291cmNlLmdldFdyaXRlQ291bnQoKSAhPSAwKSk7Ci0JCWNhY2hlU3luY2hyb25pemF0aW9uU3RhbXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYW5hZ2VzRE9NQWRhcHRlcnMoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAobW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgIT0gbnVsbCkKLQkJCWFib3V0VG9DaGFuZ2VOb2RlID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIG1vZGVsQWNjZXNzRm9yV3JpdGUoKSB7Ci0JCVN0cmluZyBpZCA9IGdldE1vZGVsTWFuYWdlcklkKCk7Ci0JCWdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JFZGl0KGlkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RlbENoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQlpZiAoaXNCYXRjaENoYW5nZXMpCi0JCQlyZXR1cm47Ci0JCXRyeSB7Ci0JCQlpZiAoYWJvdXRUb0NoYW5nZU5vZGUgIT0gbnVsbCAmJiBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSAhPSBudWxsICYmIG1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gYWJvdXRUb0NoYW5nZU5vZGUpIHsKLQkJCQltb2RlbEFjY2Vzc0ZvcldyaXRlKCk7Ci0JCQkJdHJ5IHsKLQkJCQkJeG1sTW9kZWxSZXZlcnRlZCA9IHRydWU7Ci0JCQkJCXJlc291cmNlLnVubG9hZCgpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJaWYgKGdldFhNTE1vZGVsKCkgIT0gbnVsbCkKLQkJCQkJCWdldFhNTE1vZGVsKCkucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJYWJvdXRUb0NoYW5nZU5vZGUgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJaWYgKCFpc0RpcnR5ICYmIHJlc291cmNlLmlzTW9kaWZpZWQoKSkgeyAvLyBUaGUgWE1MTW9kZWwgd2FzIHNhdmVkCi0JCQlyZXNvdXJjZS5zZXRNb2RpZmllZChmYWxzZSk7Ci0JCQlsb25nIHN0YW1wID0gV29ya2JlbmNoUmVzb3VyY2VIZWxwZXIuY29tcHV0ZU1vZGlmaWNhdGlvblN0YW1wKHJlc291cmNlKTsKLQkJCVdvcmtiZW5jaFJlc291cmNlSGVscGVyLnNldFN5bmhyb25pemF0aW9uU3RhbXAocmVzb3VyY2UsIHN0YW1wKTsKLQkJCVJlc291cmNlU2V0V29ya2JlbmNoRWRpdFN5bmNocm9uaXplciBzeW5jaHJvbml6ZXIgPSAoUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyKSAoKFByb2plY3RSZXNvdXJjZVNldCkgcmVzb3VyY2UuZ2V0UmVzb3VyY2VTZXQoKSkuZ2V0U3luY2hyb25pemVyKCk7Ci0JCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJc3luY2hyb25pemVyLnByZVNhdmUoYUZpbGUpOwotCQl9Ci0JCWlmIChpc0RpcnR5KQotCQkJcmVzb3VyY2Uuc2V0TW9kaWZpZWQodHJ1ZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kZWxSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJLy8gRG8gbm90aGluZwotCX0KLQotCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VNb3ZlZChJU3RydWN0dXJlZE1vZGVsIG9sZE1vZGVsLCBJU3RydWN0dXJlZE1vZGVsIG5ld01vZGVsKSB7Ci0JCS8vIERvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQganVzdCBwcmlvciB0byBiZWluZyByZW1vdmVkIGZyb20gdGhlIFJlc291cmNlU2V0LgotCSAqIEVuc3VyZSB0aGF0IGFsbCByZWZlcmVuY2UgY291bnRzIHRvIHRoZSBYTUxNb2RlbCBhcmUgcmVtb3ZlZC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwcmVEZWxldGUoKSB7Ci0JCWlmIChyZXNvdXJjZS5pc0xvYWRlZCgpKQotCQkJZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByZVVubG9hZCgpIHsKLQkJZGVyZWdpc3RlckZyb21YTUxNb2RlbCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NQb3N0TW9kZWxFdmVudChNb2RlbExpZmVjeWNsZUV2ZW50IGV2ZW50KSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCX0KLQotCXB1YmxpYyB2b2lkIHByb2Nlc3NQcmVNb2RlbEV2ZW50KE1vZGVsTGlmZWN5Y2xlRXZlbnQgZXZlbnQpIHsKLQkJaWYgKCFpc1NhdmluZykgewotCQkJaWYgKGV2ZW50LmdldFR5cGUoKSA9PSBNb2RlbExpZmVjeWNsZUV2ZW50Lk1PREVMX1NBVkVEKSB7Ci0JCQkJUmVzb3VyY2VTZXRXb3JrYmVuY2hFZGl0U3luY2hyb25pemVyIHN5bmNocm9uaXplciA9IChSZXNvdXJjZVNldFdvcmtiZW5jaEVkaXRTeW5jaHJvbml6ZXIpICgoUHJvamVjdFJlc291cmNlU2V0KSByZXNvdXJjZS5nZXRSZXNvdXJjZVNldCgpKS5nZXRTeW5jaHJvbml6ZXIoKTsKLQkJCQlJRmlsZSBhRmlsZSA9IFdvcmtiZW5jaFJlc291cmNlSGVscGVyLmdldEZpbGUocmVzb3VyY2UpOwotCQkJCXN5bmNocm9uaXplci5wcmVTYXZlKGFGaWxlKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgcmVnaXN0ZXJBc01vZGVsTGlmZWN5Y2xlTGlzdGVuZXIoKSB7Ci0JCXRoaXMueG1sTW9kZWwuYWRkTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBJbnNlcnQgdGhlIG1ldGhvZCdzIGRlc2NyaXB0aW9uIGhlcmUuIENyZWF0aW9uIGRhdGU6ICg5LzcvMjAwMSAxMDo0OTo1MwotCSAqIEFNKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlZ2lzdGVyQXNNb2RlbFN0YXRlTGlzdGVuZXIoKSB7Ci0JCXRoaXMueG1sTW9kZWwuYWRkTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQl4bWxNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbVdyaXRlKCkgewotCQlpZiAoeG1sTW9kZWwgIT0gbnVsbCkKLQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbW92ZURPTUFkYXB0ZXIoTm9kZSBhTm9kZSwgRU1GMkRPTUFkYXB0ZXIgYW5BZGFwdGVyKSB7Ci0JCSgoSURPTU5vZGUpIGFOb2RlKS5yZW1vdmVBZGFwdGVyKChFTUYyRE9NU1NFQWRhcHRlcikgYW5BZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmplbS5pbnRlcm5hbC51dGlsLmVtZi54bWwuRU1GMkRPTVJlbmRlcmVyI3JlcGxhY2VEb2N1bWVudFR5cGUoamF2YS5sYW5nLlN0cmluZywKLQkgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0JICovCi0JcHVibGljIHZvaWQgcmVwbGFjZURvY3VtZW50VHlwZShTdHJpbmcgZG9jVHlwZU5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlSW1wbCkgZG9jdW1lbnQuZ2V0RG9jdHlwZSgpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAocHVibGljSWQgPT0gbnVsbCAmJiBzeXN0ZW1JZCA9PSBudWxsKQotCQkJZG9jdW1lbnQucmVtb3ZlQ2hpbGQoZG9jVHlwZSk7Ci0JCWVsc2UgewotCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCQlkb2NUeXBlLnNldFN5c3RlbUlkKHN5c3RlbUlkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBkZXByZWNhdGVkIHVzZSBiYXRjaE1vZGVTdGFydCBhbmQgQmF0Y2hNb2RlRW5kIGluc3RlYWQgZXZlbiBpZiB5b3UgZG8KLQkgKiAgICAgICAgICAgICBub3QgdXNlIGJhdGNoTW9kZWxTdGFydC9FbmQsIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSB0aGUKLQkgKiAgICAgICAgICAgICB0cnkvZmluYWxseSBwYXR0ZXJuIGRvY3VtZW50ZWQgdGhlcmUuCi0JICovCi0KLQlwdWJsaWMgdm9pZCBzZXRCYXRjaE1vZGUoYm9vbGVhbiBpc0JhdGNoKSB7Ci0KLQkJLy8gVGhpcyBpcyBzb21lIGV4dHJhIHByb2Nlc3NpbmcgZm9yIGNsaWVudHMgdG8ga25vdyB0aGV5IG1heSBiZSB1c2luZwotCQkvLyBpbmNvcnJlY3RseQotCQlpZiAoaXNCYXRjaCkgewotCQkJaWYgKGlzQmF0Y2hDaGFuZ2VzKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GT19ERUJVRywgInNldEJhdGNoIHdhcyBzZXQgdG8gdHJ1ZSB3aGVuIGl0IHdhcyBhbHJlYWR5IHRydWUuIFRoaXMgY2FuIGJlIGFuIGluZGljYXRpb24gb2YgaW52YWxpZCBjYWxsaW5nIG9yZGVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0KLQkJaWYgKGlzQmF0Y2gpIHsKLQkJCWJhdGNoTW9kZVN0YXJ0KCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQliYXRjaE1vZGVFbmQoKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBzZXRSb290Tm9kZUFkYXB0ZXJOb3RpZmljYXRpb25FbmFibGVkKGJvb2xlYW4gYikgewotCQlFT2JqZWN0IHJvb3QgPSByZXNvdXJjZS5nZXRSb290T2JqZWN0KCk7Ci0JCWlmIChyb290ICE9IG51bGwpIHsKLQkJCUVNRjJET01BZGFwdGVyIGFkYXB0ZXIgPSAoRU1GMkRPTUFkYXB0ZXIpIEVjb3JlVXRpbC5nZXRFeGlzdGluZ0FkYXB0ZXIocm9vdCwgRU1GMkRPTUFkYXB0ZXIuQURBUFRFUl9DTEFTUyk7Ci0JCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQkJYWRhcHRlci5zZXROb3RpZmljYXRpb25FbmFibGVkKGIpOwotCQkJCWlmIChiKQotCQkJCQlhZGFwdGVyLnVwZGF0ZURPTSgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBET00gbW9kZWwgZm9yIHRoaXMgcmVzb3VyY2UuCi0JICovCi0JcHVibGljIHZvaWQgc2V0WE1MTW9kZWwoSURPTU1vZGVsIHhtbE1vZGVsKSB7Ci0JCWRlUmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlkZVJlZ2lzdGVyQXNNb2RlbExpZmVjeWNsZUxpc3RlbmVyKCk7Ci0JCXRoaXMueG1sTW9kZWwgPSB4bWxNb2RlbDsKLQkJcmVnaXN0ZXJBc01vZGVsU3RhdGVMaXN0ZW5lcigpOwotCQlyZWdpc3RlckFzTW9kZWxMaWZlY3ljbGVMaXN0ZW5lcigpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFhNTE1vZGVsSWQoU3RyaW5nIGlkKSB7Ci0JCXhtbE1vZGVsSWQgPSBpZDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgc3luY1JlZmVyZW5jZUNvdW50cyhTdHJpbmcgaWQsIGJvb2xlYW4gZm9yV3JpdGUpIHsKLQkJaW50IGVkaXRJbmRleCA9IDAsIHJlYWRJbmRleCA9IDA7Ci0JCWlmIChmb3JXcml0ZSkKLQkJCWVkaXRJbmRleCsrOwotCQllbHNlCi0JCQlyZWFkSW5kZXgrKzsKLQkJaW50IHdyaXRlQ291bnQgPSByZXNvdXJjZS5nZXRXcml0ZUNvdW50KCk7Ci0JCWludCByZWFkQ291bnQgPSByZXNvdXJjZS5nZXRSZWFkQ291bnQoKTsKLQkJZm9yIChpbnQgaSA9IHdyaXRlQ291bnQ7IGkgPiBlZGl0SW5kZXg7IGktLSkKLQkJCW1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChpZCk7Ci0JCWZvciAoaW50IGkgPSByZWFkQ291bnQ7IGkgPiByZWFkSW5kZXg7IGktLSkKLQkJCW1vZGVsTWFuYWdlci5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChpZCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gdXNlU3RyZWFtc0ZvcklPKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gd2FzUmV2ZXJ0ZWQoKSB7Ci0JCXJldHVybiB4bWxNb2RlbFJldmVydGVkOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtZW1mTW9kZWxTeW5jaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZW1mMnhtbC9FTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiOWQ5OTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLWVtZk1vZGVsU3luY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VtZjJ4bWwvRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW1mMnhtbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uaW50ZXJuYWwuZW1mLnJlc291cmNlLlJlbmRlcmVyRmFjdG9yeTsKLQotLyoqCi0gKiBAYXV0aG9yIHNjaGFjaGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5IGV4dGVuZHMgUmVuZGVyZXJGYWN0b3J5IHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSBJTlNUQU5DRSA9IG5ldyBFTUYyRE9NU1NFUmVuZGVyZXJGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgRU1GMkRPTVNTRVJlbmRlcmVyRmFjdG9yeSgpIHsKLQkJLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgotCX0KLQotCi0JcHVibGljIFJlbmRlcmVyIGNyZWF0ZVJlbmRlcmVyKCkgewotCQlyZXR1cm4gbmV3IEVNRjJET01TU0VSZW5kZXJlcigpOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9Db21wb25lbnRTZWFyY2hDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzFkY2RlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9Db21wb25lbnRTZWFyY2hDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50U2VhcmNoQ29udHJpYnV0b3IgIHsKLQotCXByb3RlY3RlZCBIYXNoTWFwIGRlY2xhcmF0aW9uczsKLQotCXByb3RlY3RlZCBIYXNoTWFwIHJlZmVyZW5jZXM7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gbmFtZXNwYWNlczsKLQotCXB1YmxpYyBDb21wb25lbnRTZWFyY2hDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybiBnZXREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBjb21wb25lbnROYW1lKSB7Ci0JCXJldHVybiAoWE1MU2VhcmNoUGF0dGVybikgZ2V0RGVjbGFyYXRpb25zKCkuZ2V0KGNvbXBvbmVudE5hbWUpOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0RGVjbGFyYXRpb25zKCkgewotCQlpZiAoZGVjbGFyYXRpb25zID09IG51bGwpIHsKLQkJCWluaXRpYWxpemVEZWNsYXJhdGlvbnMoKTsKLQkJfQotCQlyZXR1cm4gZGVjbGFyYXRpb25zOwotCX0KLQotCXByb3RlY3RlZCBNYXAgZ2V0UmVmZXJlbmNlcygpIHsKLQkJaWYgKHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJaW5pdGlhbGl6ZVJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gcmVmZXJlbmNlczsKLQl9Ci0KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybltdIGdldFJlZmVyZW5jZXNQYXR0ZXJucyhRdWFsaWZpZWROYW1lIGNvbXBvbmVudE5hbWUpIHsKLQkJTGlzdCByZWZlcmVuY2VzID0gKExpc3QpIGdldFJlZmVyZW5jZXMoKS5nZXQoY29tcG9uZW50TmFtZSk7Ci0JCWlmIChyZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCXJldHVybiAoWE1MU2VhcmNoUGF0dGVybltdKSByZWZlcmVuY2VzCi0JCQkJCS50b0FycmF5KG5ldyBYTUxTZWFyY2hQYXR0ZXJuW3JlZmVyZW5jZXMuc2l6ZSgpXSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hQYXR0ZXJuWzBdOwotCX0KLQkKLQkKLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhRdWFsaWZpZWROYW1lIGNvbXBvbmVudE5hbWUpewotCQlyZXR1cm4gZ2V0UmVmZXJlbmNlc1BhdHRlcm5zKGNvbXBvbmVudE5hbWUpLmxlbmd0aCA+IDAgfHwKLQkJCWdldERlY2xhcmF0aW9uUGF0dGVybihjb21wb25lbnROYW1lKSAhPSBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRTdXBwb3J0ZWROYW1lc3BhY2VzKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplRGVjbGFyYXRpb25zKCk7Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBpbml0aWFsaXplUmVmZXJlbmNlcygpOwotCi0JcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgaW5pdGlhbGl6ZVN1cHBvcnRlZE5hbWVzcGFjZXMoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9UYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxYjdjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9UYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotCi1wdWJsaWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlUmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIFNlYXJjaFBhdHRlcm4gewotCQotCVN0cmluZyBuYW1lc3BhY2VVUkk7Ci0JCi0JcHVibGljIFRhcmdldE5hbWVzcGFjZVJlZmVyZW5jZVBhdHRlcm4oaW50IG1hdGNoUnVsZSwgU3RyaW5nIG5hbWVzcGFjZXVyaSkgewotCQlzdXBlcihtYXRjaFJ1bGUpOwotCQluYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2V1cmk7Ci0JfQotCQotCXB1YmxpYyBUYXJnZXROYW1lc3BhY2VSZWZlcmVuY2VQYXR0ZXJuKFN0cmluZyBuYW1lc3BhY2V1cmkpIHsKLQkJc3VwZXIoKTsKLQkJbmFtZXNwYWNlVVJJID0gbmFtZXNwYWNldXJpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWY0NzViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlF1YWxpZmllZE5hbWU7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4gZXh0ZW5kcyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuIHsKLQotCXB1YmxpYyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lLCBpbnQgbWF0Y2hSdWxlKSB7Ci0JCXN1cGVyKG51bGwsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lLCBtYXRjaFJ1bGUpOwotCQkKLQl9Ci0KLQlwdWJsaWMgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JfQotCQotCXB1YmxpYyBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4oUXVhbGlmaWVkTmFtZSBlbGVtZW50UU5hbWUsIFF1YWxpZmllZE5hbWUgdHlwZVFOYW1lKSB7Ci0JCXN1cGVyKG51bGwsIGVsZW1lbnRRTmFtZSwgdHlwZVFOYW1lKTsKLQl9Ci0KLQkKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjhhOGE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybiBleHRlbmRzIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm57Ci0KLQlwdWJsaWMgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUsIGludCBtYXRjaFJ1bGUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUsIG1hdGNoUnVsZSk7Ci0JCQotCX0KLQotCXB1YmxpYyBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSk7Ci0JCQotCX0KLQkKLQlwdWJsaWMgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybihRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIobnVsbCwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQkKLQl9Ci0JCi0JCi0JCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL1hNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2FiZDA0Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uQ29tcG9uZW50U2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uUXVhbGlmaWVkTmFtZTsKLQotLyoqCi0gKiBYTUwgY29tcG9uZW50IHNlYXJjaCBwYXR0ZXJuIGlzIGEgY29tcG9zaXRlIHBhdHRlcm4gdGhhdCBjb21iaW5lcyBYTUwgZWxlbWVudCBwYXR0ZXJuLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4gZXh0ZW5kcyBDb21wb25lbnRTZWFyY2hQYXR0ZXJuIHsKLQkKLQkvKioKLQkgKiBDb250YWluaW5nIGVsZW1lbnQgcGF0dGVybnMKLQkgKi8KLQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRyZW4gPSBuZXcgWE1MU2VhcmNoUGF0dGVyblswXTsKLQkKLQotCXB1YmxpYyBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKElGaWxlIGZpbGUsIFF1YWxpZmllZE5hbWUgZWxlbWVudFFOYW1lLCBRdWFsaWZpZWROYW1lIHR5cGVRTmFtZSwgaW50IG1hdGNoUnVsZSkgewotCQlzdXBlcihmaWxlLCBlbGVtZW50UU5hbWUsIHR5cGVRTmFtZSwgbWF0Y2hSdWxlKTsKLQkJCi0JfQotCi0KLQlwdWJsaWMgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybihJRmlsZSBmaWxlLCBRdWFsaWZpZWROYW1lIGVsZW1lbnRRTmFtZSwgUXVhbGlmaWVkTmFtZSB0eXBlUU5hbWUpIHsKLQkJc3VwZXIoZmlsZSwgZWxlbWVudFFOYW1lLCB0eXBlUU5hbWUpOwotCQkKLQl9Ci0KLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybltdIGdldENoaWxkcmVuKCl7Ci0JCXJldHVybiBjaGlsZHJlbjsKLQl9Ci0JCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRyZW4oWE1MU2VhcmNoUGF0dGVybltdIHBhdHRlcm5zKXsKLQkJY2hpbGRyZW4gPSBwYXR0ZXJuczsKLQkJCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGFydGljaXBhbnQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJjZWZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXJ0aWNpcGFudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudERlY2xhcmF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkZpbGVSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnRTZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkNvbXBvbmVudFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLkZpbGVSZWZlcmVuY2VQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guc2NvcGUuQ29udGVudFR5cGVTZWFyY2hTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnNjb3BlLlNlYXJjaFNjb3BlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuSVhNTFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuWE1MU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuLlhNTFF1aWNrU2NhbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFhNTFNlYXJjaFBhcnRpY2lwYW50IGV4dGVuZHMgU2VhcmNoUGFydGljaXBhbnQgewotCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgYm9vbGVhbiBkZWJ1Z1BlcmYgPSAidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC9wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXB1YmxpYyBYTUxTZWFyY2hQYXJ0aWNpcGFudCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkKLQkvKgotIHB1YmxpYyAgYm9vbGVhbiBpbml0aWFsaXplKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nW10gY29udGVudFR5cGVzKXsKLQkJCi0JICAgIHN1cGVyLmluaXRpYWxpemUocGF0dGVybiwgY29udGVudFR5cGVzKTsKLQkJdGhpcy5zdXBwb3J0ZWRDb250ZW50VHlwZXMgPSBjb250ZW50VHlwZXM7Ci0JCQotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybil7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfSovCi0KLQkKLQotCXB1YmxpYyBTZWFyY2hEb2N1bWVudCBjcmVhdGVTZWFyY2hEb2N1bWVudChTdHJpbmcgZG9jdW1lbnRQYXRoKSB7Ci0KLQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hEb2N1bWVudChkb2N1bWVudFBhdGgsIHRoaXMpOwotCi0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICJYTUwgc2VhcmNoIHBhcnRpY2lwYW50IjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0KLQlwcml2YXRlIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaERvY3VtZW50IGRvY3VtZW50LAotCQkJU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCi0gICAgICAgIC8vIFRPRE8uLi4gdXRpbGl6ZSBzZWFyY2ggb3B0aW9ucyAodGhhdCBzaG91bGQgZ2V0IHBhc3NlZCBkb3duIHZpYSB0aGUgU2VhcmNoRW5naW5lKQotICAgICAgICAvLyB0byBzcGVjaWZ5IGlmIGFjY3VyYXRlIHNvdXJjZSBjb29yZGluYXRlcyBhcmUgcmVxJ2QgaWYgbm90LCBzaW1wbHkgdXNlIHRoZSBTQVggcmVzdWx0cwotICAgICAgICAvLwotICAgICAgICBpZiAocGF0dGVybi5nZXRNYXRjaFJ1bGUoKSA9PSBTZWFyY2hQYXR0ZXJuLlJfUEFUVEVSTl9NQVRDSCkKLSAgICAgICAgeyAgICAgICAgICAKLSAgICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZG9jdW1lbnQuZ2V0UGF0aCgpKSk7Ci0gICAgICAgICAgLy8gVE9ETy4uIGRvbid0IGFzc3VtZSB0aGUgY2F0ZWdvcnkgaXMgQ09NUE9ORU5UX0RFQ0wuLi4gaGFuZGxlIGFueSBhcmJpdGFydHkgY2F0ZWdvcnkKLSAgICAgICAgICBFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0wsIG51bGwsIDApOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPLi4gZG9uJ3QgYXNzdW1lIHRoaXMgaXMganVzdCBhIGNvbXBvbmVudCBkZWNsYXJhdGlvbiBlbnRyeSAgICAgICAgICAgIAotICAgICAgICAgICAgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSBlbnRyeSA9IChDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5KWVudHJpZXNbaV07Ci0gICAgICAgICAgICBTZWFyY2hNYXRjaCBzZWFyY2hNYXRjaCA9IG5ldyBTZWFyY2hNYXRjaChudWxsLCAwLCAwLCBmaWxlKTsKLSAgICAgICAgICAgIHNlYXJjaE1hdGNoLm1hcC5wdXQoIm5hbWUiLCBlbnRyeS5nZXROYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICBzZWFyY2hNYXRjaC5tYXAucHV0KCJtZXRhTmFtZSIsIGVudHJ5LmdldE1ldGFOYW1lKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVxdWVzdG9yLmFjY2VwdFNlYXJjaE1hdGNoKHNlYXJjaE1hdGNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsgICAgICAgICAgICAgIAotICAgICAgICAgICAgfQotICAgICAgICAgIH0gIAotICAgICAgICB9Ci0gICAgICAgIGVsc2UgCi0gICAgICAgIHsgIGlmIChkb2N1bWVudC5nZXRNb2RlbCgpIGluc3RhbmNlb2YgSURPTU1vZGVsKSB7Ci0JCQlJRE9NTW9kZWwgZG9tTW9kZWwgPSAoSURPTU1vZGVsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQkJSURPTUVsZW1lbnQgY29udGV4dE5vZGUgPSAoSURPTUVsZW1lbnQpIGRvbU1vZGVsLmdldERvY3VtZW50KCkKLQkJCQkJLmdldERvY3VtZW50RWxlbWVudCgpOwotCQkJRE9NVmlzaXRvciB2aXNpdG9yID0gbmV3IERPTVZpc2l0b3IoZG9jdW1lbnQuZ2V0UGF0aCgpLCBwYXR0ZXJuLAotCQkJCQlyZXF1ZXN0b3IpOwotCQkJdmlzaXRvci52aXNpdChjb250ZXh0Tm9kZSk7Ci0JCX0KLSAgICAgICAgfQotCX0KLQkKLQlwcml2YXRlIFBhdHRlcm5NYXRjaGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZU9iamVjdCwgQ2xhc3MgYWRhcHRlclR5cGUpIHsKLQkJaWYgKFBhdHRlcm5NYXRjaGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyVHlwZSkgJiYKLQkJCQkoYWRhcHRhYmxlT2JqZWN0IGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybiB8fAotCQkJCWFkYXB0YWJsZU9iamVjdCBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFNlYXJjaFBhdHRlcm4pICkgewotCQkJcmV0dXJuIG5ldyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcigpOwotCQl9IAotCQlyZXR1cm4gbnVsbDsgCi0JfQotCi0JcHJpdmF0ZSBjbGFzcyBET01WaXNpdG9yIHsKLQotCQlTdHJpbmcgcGF0aDsKLQkJU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotCQlTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yOwotCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyOwotCi0JCQotCQlwcm90ZWN0ZWQgRE9NVmlzaXRvcihTdHJpbmcgcGF0aCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLAotCQkJCVNlYXJjaFJlcXVlc3RvciByZXF1ZXN0b3IpIHsKLQkJCXN1cGVyKCk7Ci0JCQl0aGlzLnBhdGggPSBwYXRoOwotCQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJCQotCQkJbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlcilwYXR0ZXJuLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQltYXRjaGVyID0gZ2V0QWRhcHRlcihwYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQl9Ci0JCQl0aGlzLnJlcXVlc3RvciA9IHJlcXVlc3RvcjsKLQkJfQotCi0JCXByaXZhdGUgdm9pZCB2aXNpdChOb2RlIG5vZGUpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQltYXRjaCgoRWxlbWVudClub2RlKTsKLQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQlOb2RlIGFOb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCQkJdmlzaXQoYU5vZGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXByaXZhdGUgdm9pZCBtYXRjaChFbGVtZW50IG5vZGUpIHsKLQkJCUlGaWxlIGZpbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldEZpbGVGb3JMb2NhdGlvbigKLQkJCQkJbmV3IFBhdGgocGF0aCkpOwotCQkJaWYobWF0Y2hlciAhPSBudWxsKXsKLQkJCQltYXRjaGVyLmxvY2F0ZU1hdGNoZXMocGF0dGVybiwgZmlsZSwgbm9kZSwgcmVxdWVzdG9yKTsKLQkJCX0KLQotCQkJCi0JCX0KLQotCX0KLQotCXB1YmxpYyBTZWFyY2hTY29wZSBzZWxlY3REb2N1bWVudExvY2F0aW9ucyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIFNlYXJjaFNjb3BlIHNjb3BlLCBNYXAgc2VhcmNoT3B0aW9ucywgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCS8qCi0JCSAqIGdhdGUgIzE6IHJlZHVjZSB0aGUgc2NvcGUgdG8gdGhlIGZpbGVzIHdpdGggdGhlIGNvbnRlbnQgdHlwZSB0aGF0Ci0JCSAqIGNvdWxkIGJlIHNlYXJjaGVkIHVzaW5nIHRoaXMgcGFydGljaXBhbnQKLQkJICovIAotCQlTdHJpbmdbXSBjb250ZW50VHlwZXMgPSBnZXRTdXBwb3J0ZWRDb250ZW50VHlwZXMoKTsJCi0JCWlmKGNvbnRlbnRUeXBlcyAhPSBudWxsICYmIGNvbnRlbnRUeXBlcy5sZW5ndGggPiAwKXsKLQkJCXNjb3BlID0gbmV3IENvbnRlbnRUeXBlU2VhcmNoU2NvcGUoc2NvcGUsIGNvbnRlbnRUeXBlcyk7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLnNlbGVjdERvY3VtZW50TG9jYXRpb25zKHBhdHRlcm4sIHNjb3BlLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IENvbXBvbmVudFNlYXJjaENvbnRyaWJ1dG9yIGdldFNlYXJjaENvbnRyaWJ1dG9yKCk7Ci0KLQotCXB1YmxpYyB2b2lkIGJlZ2luU2VhcmNoaW5nKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgTWFwIHNlYXJjaE9wdGlvbnMpIHsKLQkJCi0JCXN1cGVyLmJlZ2luU2VhcmNoaW5nKHBhdHRlcm4sIHNlYXJjaE9wdGlvbnMpOwotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuKXsKLQkJCVhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybiBjb21wb25lbnRQYXR0ZXJuID0gKFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybilwYXR0ZXJuOwotCQkJWE1MU2VhcmNoUGF0dGVybiBjaGlsZFBhdHRlcm4gPSBnZXRTZWFyY2hDb250cmlidXRvcigpLmdldERlY2xhcmF0aW9uUGF0dGVybihjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJaWYoY2hpbGRQYXR0ZXJuICE9IG51bGwpewotCQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZShjb21wb25lbnRQYXR0ZXJuLmdldE5hbWUoKS5nZXRMb2NhbE5hbWUoKSk7Ci0JCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoY29tcG9uZW50UGF0dGVybi5nZXROYW1lKCkuZ2V0TmFtZXNwYWNlKCkpOwotCSAgICAgCQkJY29tcG9uZW50UGF0dGVybi5zZXRDaGlsZHJlbihuZXcgWE1MU2VhcmNoUGF0dGVybltde2NoaWxkUGF0dGVybn0pOwotCQkJfQotCQkJCi0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybil7Ci0JCQlYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuIGNvbXBvbmVudFBhdHRlcm4gPSAoWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybilwYXR0ZXJuOwotCQkJWE1MU2VhcmNoUGF0dGVybltdIGNoaWxkUGF0dGVybnMgPSBnZXRTZWFyY2hDb250cmlidXRvcigpLmdldFJlZmVyZW5jZXNQYXR0ZXJucyhjb21wb25lbnRQYXR0ZXJuLmdldE1ldGFOYW1lKCkpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJWE1MU2VhcmNoUGF0dGVybiBjaGlsZFBhdHRlcm4gPSBjaGlsZFBhdHRlcm5zW2ldOwotCQkJCWNoaWxkUGF0dGVybi5zZXRTZWFyY2hOYW1lKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldExvY2FsTmFtZSgpKTsKLQkJCQljaGlsZFBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKGNvbXBvbmVudFBhdHRlcm4uZ2V0TmFtZSgpLmdldE5hbWVzcGFjZSgpKTsJCQkJCi0JCQl9Ci0JCQljb21wb25lbnRQYXR0ZXJuLnNldENoaWxkcmVuKGNoaWxkUGF0dGVybnMpOwotCQkJCi0JCX0KLQl9Ci0JCi0JCi0JLyoqCi0JICogVGhlIGludGVuZCBvZiB0aGlzIG1ldGhvZCBpcyB0byBsaW1pdCB0aGUgc2VhcmNoIHRvIHRoZSBmaWxlcyB0aGF0IGhhdmUgY29udGVudCAKLQkgKiB3aGljaCBjYW4gYmUgc2VhcmNoZWQgZm9yIHRoZSBnaXZlbiBwYXR0ZXJuLiBJdCBpcyBjYWxsZWQgZnJvbSAKLQkgKiB7QGxpbmsgI3NlbGVjdERvY3VtZW50TG9jYXRpb25zKFNlYXJjaFBhdHRlcm4sIFNlYXJjaFNjb3BlLCBJUHJvZ3Jlc3NNb25pdG9yKX0KLQkgKiAKLQkgKiBAcGFyYW0gcGF0dGVybiB0aGUgc2VhcmNoIHBhdHRlcm4gdGhhdCBpcyBzZWFyY2hlZCBmb3IKLQkgKiBAcmV0dXJuIGNvbnRlbnQgdHlwZSdzIHVuaXF1ZSBpZGVudGlmaWVycyB0aGF0IGNvdWxkIGJlIHNlYXJjaGVkIGZvciB0aGUgZ2l2ZW4gcGF0dGVybi4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ29udGVudFR5cGVzKCk7Ci0KLQlwdWJsaWMgdm9pZCBwb3B1bGF0ZVNlYXJjaERvY3VtZW50KFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKXBhdHRlcm4uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQltYXRjaGVyID0gZ2V0QWRhcHRlcihwYXR0ZXJuLCBQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCX0KLQkJWE1MUXVpY2tTY2FuLnBvcHVsYXRlU2VhcmNoRG9jdW1lbnQoZG9jdW1lbnQsIG1hdGNoZXIsIHBhdHRlcm4pOwkJCi0JfQotCi0JcHVibGljIHZvaWQgbG9jYXRlTWF0Y2hlcyhTZWFyY2hEb2N1bWVudFNldCBkb2N1bWVudFNldCwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTZWFyY2hTY29wZSBzY29wZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvciwgTWFwIHNlYXJjaE9wdGlvbnMsIElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgdGhyb3dzIENvcmVFeGNlcHRpb24KLQl7Ci0JCWxvbmcgdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCQkKLQkJLy8gVE9ETzogdXNlIHRoZSBmaWxlIHJlZmVyZW5jZSBlbnRyaWVzIGluIHRoZSBkb2N1bWVudHMgdG8gcmVkdWNlIHRoZSBzY29wZSB0byB0aGUgcmVmZXJlbmNlZCBmaWxlcyBvbmx5Ci0JCS8vIFNlYXJjaERvY3VtZW50W10gZG9jdW1lbnRzID0gZG9jdW1lbnRTZXQuZ2V0U2VhcmNoRG9jdW1lbnRzKGlkKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgLy8gY2hlY2sgdG8gc2VlIGlmIHRoZSBzZWFyY2ggcGF0dGVybiBpcyBxdWFsaWZpZWQgYnkgYSBmaWxlIGxvY2F0aW9uCi0gICAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGNhc2UgdGhlbiB3ZSBjYW4gdXNlIGZpbGUgc2NvcGluZyBydWxlcyB0byBwcnVuZSB0aGUgbWF0Y2hlcwotICAgICAgICBJRmlsZSB0YXJnZXRGaWxlID0gbnVsbDsKLSAgICAgICAgaWYgKHBhdHRlcm4gaW5zdGFuY2VvZiBDb21wb25lbnRTZWFyY2hQYXR0ZXJuKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50U2VhcmNoUGF0dGVybiBjb21wb25lbnRTZWFyY2hQYXR0ZXJuID0gKENvbXBvbmVudFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLSAgICAgICAgICB0YXJnZXRGaWxlID0gY29tcG9uZW50U2VhcmNoUGF0dGVybi5nZXRGaWxlKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0JCQotICAgICAgICAKLQkJLy8gaGVyZSB3ZSBzaG91bGQgaGF2ZSBpbiBzY29wZSBvbmx5IHJlZmVyZW5jZWQgZmlsZXMKLQkJSUZpbGVbXSBmaWxlcyA9IHNjb3BlLmVuY2xvc2luZ0ZpbGVzKCk7ICAKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLQkJewotCQkJSUZpbGUgZmlsZSA9IGZpbGVzW2ldOwotCQkJU3RyaW5nIHBhdGggPSBmaWxlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKTsKLQkJCVNlYXJjaERvY3VtZW50IGRvY3VtZW50ID0gZG9jdW1lbnRTZXQuZ2V0U2VhcmNoRG9jdW1lbnQocGF0aCwgaWQpOyAKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJeyAgICAgICAgICAgICAgCi0JCQlFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKGdldFNlYXJjaEVudHJ5Q2F0ZWdvcnkocGF0dGVybiksIG51bGwsIDApOyAgICAgICAgICAgCi0JCQlpZiAoKGVudHJpZXMgIT0gbnVsbCAmJiBlbnRyaWVzLmxlbmd0aCA+IDApIHx8IChzZWFyY2hPcHRpb25zICE9IG51bGwgJiYgc2VhcmNoT3B0aW9ucy5nZXQoInNlYXJjaERpcnR5Q29udGVudCIpICE9IG51bGwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvL2ZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykKLSAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgIC8vICBFbnRyeSBlbnRyeSA9IGVudHJpZXNbal07Ci0gICAgICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImVudHJ5ICIgKyBlbnRyeS5nZXRDYXRlZ29yeSgpICsgIiAiICsgZW50cnkuZ2V0S2V5KCkgKyAiICIgKyBlbnRyeS5nZXRDbGFzcygpLmdldE5hbWUoKSk7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgLy99ICAKLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIGJvb2xlYW4gaXNJblNjb3BlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgaWYgKHRhcmdldEZpbGUgIT0gbnVsbCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIGlzSW5TY29wZSA9IGlzTGlua2VkKGRvY3VtZW50U2V0LCAiZmlsZTovLy8iICsgcGF0aCwgImZpbGU6Ly8vIiArIHRhcmdldEZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICAgICAgICAvL2lmIChwYXRoLmVuZHNXaXRoKCJDYW5jZWxTZWxlY3Rpb24ud3NkbCIpICAmJiBwYXRoLmluZGV4T2YoImNsb25lMSIpICE9IC0xKQotICAgICAgICAgICAgICAgICAgLy97Ci0gICAgICAgICAgICAgICAgICAvLyAgZmlsZVJlZmVyZW5jZVRhYmxlLmRlYnVnKHF1YWxpZmllZFBhdGgsIDAsIDUpOwotICAgICAgICAgICAgICAgICAgLy99ICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgIAotICAgICAgICAgICAgICBpZiAoaXNJblNjb3BlKQotICAgICAgICAgICAgICB7IAotCQkJICAgIHRoaXMubG9jYXRlTWF0Y2hlcyhwYXR0ZXJuLCBkb2N1bWVudCwgcmVxdWVzdG9yLCBzZWFyY2hPcHRpb25zLCBtb25pdG9yKTsKLSAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICB9Ci0JCQl9Ci0JCX0KLQkJCi0JCQotCQlpZiAoZGVidWdQZXJmKQotCQl7Ci0JCQlTeXN0ZW0ub3V0Ci0JCQkJCS5wcmludGxuKCIiIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkrIGdldERlc2NyaXB0aW9uKCkKLQkJCQkJCQkrICI6ICIgKyAoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSB0aW1lKSArICJtcyBmb3IgbG9jYXRlTWF0Y2hlcyIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJfQotCi0JCQotCX0KLSAgICAKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNMaW5rZWQoU2VhcmNoRG9jdW1lbnRTZXQgc2V0LCBTdHJpbmcgc291cmNlLCBTdHJpbmcgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiBpc0xpbmtlZChzZXQsIHNvdXJjZSwgdGFyZ2V0LCBuZXcgSGFzaE1hcCgpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTGlua2VkKFNlYXJjaERvY3VtZW50U2V0IHNldCwgU3RyaW5nIHNvdXJjZSwgU3RyaW5nIHRhcmdldCwgSGFzaE1hcCB2aXNpdGVkKQotICAgIHsKLSAgICAgIGlmIChzb3VyY2UuZXF1YWxzKHRhcmdldCkpCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgCi0gICAgICBTdHJpbmcgZmlsZVByb3RvY29sID0gImZpbGU6Ly8vIjsgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKHNvdXJjZS5zdGFydHNXaXRoKGZpbGVQcm90b2NvbCkpCi0gICAgICB7ICAgIAotICAgICAgICAKLSAgICAgIFNlYXJjaERvY3VtZW50IGRvY3VtZW50ID0gc2V0Ll90ZW1wR2V0U2VhcmNoRG9jdW1ldG4oc291cmNlLnN1YnN0cmluZyhmaWxlUHJvdG9jb2wubGVuZ3RoKCkpKTsgICAgICAKLSAgICAgIGlmIChkb2N1bWVudCAhPSBudWxsKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsgICAgICAgIAotICAgICAgICBFbnRyeVtdIGVudHJpZXMgPSBkb2N1bWVudC5nZXRFbnRyaWVzKElYTUxTZWFyY2hDb25zdGFudHMuUkVGLCBudWxsLCAwKTsKLSAgICAgICAgU3RyaW5nW10gcmVzb2x2ZUVudHJ5ID0gbmV3IFN0cmluZ1tlbnRyaWVzLmxlbmd0aF07ICAgICAgICAKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbnRyaWVzLmxlbmd0aDsgaisrKQotICAgICAgICB7Ci0gICAgICAgICAgRW50cnkgZW50cnkgPSBlbnRyaWVzW2pdOwotICAgICAgICAgIGlmIChlbnRyeSBpbnN0YW5jZW9mIEZpbGVSZWZlcmVuY2VFbnRyeSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlUmVmZXJlbmNlRW50cnkgZmlsZVJlZmVyZW5jZUVudHJ5ID0gKEZpbGVSZWZlcmVuY2VFbnRyeSllbnRyeTsKLSAgICAgICAgICAgIC8vIFRPRE8uLiByZWNvcmQgYW4gdXRpbGl6ZSB0aGUgcHVibGljIGlkIGZyb20gdGhlIGZpbGVSZWZlcmVuY2VFbnRyeQotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIGlmIChmaWxlUmVmZXJlbmNlRW50cnkuZ2V0UmVsYXRpdmVGaWxlUGF0aCgpICE9IG51bGwpCi0gICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgU3RyaW5nIHJlc29sdmVkVVJJID0gdXJpUmVzb2x2ZXIucmVzb2x2ZShzb3VyY2UsIG51bGwsIGZpbGVSZWZlcmVuY2VFbnRyeS5nZXRSZWxhdGl2ZUZpbGVQYXRoKCkpOwotICAgICAgICAgICAgICByZXNvbHZlRW50cnlbal0gPSByZXNvbHZlZFVSSTsKLSAgICAgICAgICAgICAgaWYgKHJlc29sdmVkVVJJLmVxdWFscyh0YXJnZXQpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgICAgCi0gICAgICAgICAgICB9ICAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbm93IHNlZSBpZiB0aGVyZSdzIGFuIGluZGlyZWN0IGxpbmsgZnJvbSB0aGUgc291cmNlIHRvIHRoZSB0YXJnZXQKLSAgICAgICAgLy8gd2Uga2VlcCB0cmFjayBvZiB0aGUgbm9kZXMgd2UndmUgYWxyZWFkeSB2aXNpdGVkIHRvIGF2b2lkIGN5Y2xlcwotICAgICAgICBpZiAodmlzaXRlZC5nZXQoc291cmNlKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdmlzaXRlZC5wdXQoc291cmNlLCBCb29sZWFuLlRSVUUpOwotICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZW50cmllcy5sZW5ndGg7IGorKykKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBTdHJpbmcgcmVzb2x2ZWRVUkkgPSByZXNvbHZlRW50cnlbal07Ci0gICAgICAgICAgICBpZiAocmVzb2x2ZWRVUkkgIT0gbnVsbCAmJiBpc0xpbmtlZChzZXQsIHJlc29sdmVFbnRyeVtqXSwgdGFyZ2V0LCB2aXNpdGVkKSkgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgIAotICAgICAgICAgIH0gICAgCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICB9ICAgICAgICAgICAgCi0gICAgICB9IAotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgIAotICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFNlYXJjaEVudHJ5Q2F0ZWdvcnkoU2VhcmNoUGF0dGVybiBwYXR0ZXJuKXsKLQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudERlY2xhcmF0aW9uUGF0dGVybil7Ci0JCQlyZXR1cm4gSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfREVDTDsKLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRSZWZlcmVuY2VQYXR0ZXJuKXsKLQkJCXJldHVybiBJWE1MU2VhcmNoQ29uc3RhbnRzLkNPTVBPTkVOVF9SRUY7Ci0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgRmlsZVJlZmVyZW5jZVBhdHRlcm4pewotCQkgICByZXR1cm4gSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfUkVGOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0gICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXR0ZXJuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvWE1MU2VhcmNoUGF0dGVybi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlM2I1OGUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9YTUxTZWFyY2hQYXR0ZXJuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLQotcHVibGljIGNsYXNzIFhNTFNlYXJjaFBhdHRlcm4gZXh0ZW5kcyBTZWFyY2hQYXR0ZXJuewotCQotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGVsZW1lbnROYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGVOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzZWFyY2hOYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBzZWFyY2hOYW1lc3BhY2UgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHBhcmVudE5hbWUgPSBudWxsOwotICAgIHByaXZhdGUgaW50IGRlcHRoID0gLTE7Ci0KLSAgICBwdWJsaWMgWE1MU2VhcmNoUGF0dGVybihTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lLFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAJdGhpcyhlbGVtZW50TmFtZXNwYWNlLCBwYXJlbnRFbGVtZW50TmFtZSwgZWxlbWVudE5hbWUsIGF0dHJpYnV0ZU5hbWUsIC0xKTsKLSAgICB9Ci0JCi0JcHVibGljIFhNTFNlYXJjaFBhdHRlcm4oU3RyaW5nIGVsZW1lbnROYW1lc3BhY2UsIFN0cmluZyBlbGVtZW50TmFtZSwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUpIHsKLSAgICAgICB0aGlzKGVsZW1lbnROYW1lc3BhY2UsIG51bGwsIGVsZW1lbnROYW1lLCBhdHRyaWJ1dGVOYW1lLCAtMSk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgZGVwdGgpIHsKLSAgICAJdGhpcyhlbGVtZW50TmFtZXNwYWNlLCBudWxsLCBlbGVtZW50TmFtZSwgYXR0cmlidXRlTmFtZSwgZGVwdGgpOyAgICAgICAKLSAgICB9Ci0gICAgICAgICAgIAotICAgIHByaXZhdGUgWE1MU2VhcmNoUGF0dGVybihTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSwgU3RyaW5nIHBhcmVudEVsZW1lbnROYW1lLCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBpbnQgZGVwdGgpIHsKLSAgICAgICAgc3VwZXIoKTsKLSAgICAgICAgdGhpcy5hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLSAgICAgICAgdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotICAgICAgICB0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnRFbGVtZW50TmFtZTsKLSAgICAgICAgdGhpcy5lbGVtZW50TmFtZXNwYWNlID0gZWxlbWVudE5hbWVzcGFjZTsKLSAgICAgICAgdGhpcy5kZXB0aCA9IGRlcHRoOwotICAgIH0KLSAgICAKLQlwdWJsaWMgWE1MU2VhcmNoUGF0dGVybigpewotCQkKLQl9Ci0JCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOYW1lKCkgewotCQlyZXR1cm4gYXR0cmlidXRlTmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZXNwYWNlKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNlYXJjaE5hbWUoKSB7Ci0JCXJldHVybiBzZWFyY2hOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2VhcmNoTmFtZXNwYWNlKCkgewotCQlyZXR1cm4gc2VhcmNoTmFtZXNwYWNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFNlYXJjaE5hbWUoU3RyaW5nIHNlYXJjaE5hbWUpIHsKLQkJdGhpcy5zZWFyY2hOYW1lID0gc2VhcmNoTmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTZWFyY2hOYW1lc3BhY2UoU3RyaW5nIHNlYXJjaE5hbWVzcGFjZSkgewotCQl0aGlzLnNlYXJjaE5hbWVzcGFjZSA9IHNlYXJjaE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOYW1lKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCXRoaXMuYXR0cmlidXRlTmFtZSA9IGF0dHJpYnV0ZU5hbWU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbGVtZW50TmFtZXNwYWNlKFN0cmluZyBlbGVtZW50TmFtZXNwYWNlKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWVzcGFjZSA9IGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCi0gIHB1YmxpYyBpbnQgZ2V0RGVwdGgoKQotICB7Ci0gICAgcmV0dXJuIGRlcHRoOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RGVwdGgoaW50IGRlcHRoKQotICB7Ci0gICAgdGhpcy5kZXB0aCA9IGRlcHRoOwotICB9Ci0KLXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQlyZXR1cm4gcGFyZW50TmFtZTsKLX0KLQotcHVibGljIHZvaWQgc2V0UGFyZW50TmFtZShTdHJpbmcgcGFyZW50TmFtZSkgewotCXRoaXMucGFyZW50TmFtZSA9IHBhcmVudE5hbWU7Ci19Ci0JCi0KLQkKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9JWE1MU2VhcmNoQ29uc3RhbnRzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9JWE1MU2VhcmNoQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNjBkODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvSVhNTFNlYXJjaENvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guaW1wbDsKLQotcHVibGljIGludGVyZmFjZSBJWE1MU2VhcmNoQ29uc3RhbnRzCi17Ci0JCVN0cmluZyBSRUY9ICJvdXRMaW5rIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgQ09NUE9ORU5UX0RFQ0wgPSAiY29tcG9uZW50RGVjbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIENPTVBPTkVOVF9SRUYgPSAiY29tcG9uZW50RGVjbCI7IC8vJE5PTi1OTFMtMSQKLQkKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FlMjJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9pbXBsL01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5pbXBsOwotCi1pbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotcHVibGljIGNsYXNzIE1lc3NhZ2VzIGV4dGVuZHMgTkxTIHsKLQkKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVORExFX05BTUUgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tZXNzYWdlcyI7Ly8kTk9OLU5MUy0xJAotCi0JCi0Jc3RhdGljIHsKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgTWVzc2FnZXMuY2xhc3MpOwotCX0KLQlwcml2YXRlIE1lc3NhZ2VzKCkgewotCQkvLyBEbyBub3QgaW5zdGFudGlhdGUKLQl9Ci0JCi0JLyoqCi0JICogQmluZCB0aGUgZ2l2ZW4gbWVzc2FnZSdzIHN1YnN0aXR1dGlvbiBsb2NhdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlcy4KLQkgKiAKLQkgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBiZSBtYW5pcHVsYXRlZAotCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJcmV0dXJuIGJpbmQobWVzc2FnZSwgbnVsbCk7Ci0JfQotCQotCS8qKgotCSAqIEJpbmQgdGhlIGdpdmVuIG1lc3NhZ2UncyBzdWJzdGl0dXRpb24gbG9jYXRpb25zIHdpdGggdGhlIGdpdmVuIHN0cmluZyB2YWx1ZXMuCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYmUgbWFuaXB1bGF0ZWQKLQkgKiBAcGFyYW0gYmluZGluZyB0aGUgb2JqZWN0IHRvIGJlIGluc2VydGVkIGludG8gdGhlIG1lc3NhZ2UKLQkgKiBAcmV0dXJuIHRoZSBtYW5pcHVsYXRlZCBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBiaW5kKFN0cmluZyBtZXNzYWdlLCBPYmplY3QgYmluZGluZykgewotCQlyZXR1cm4gYmluZChtZXNzYWdlLCBuZXcgT2JqZWN0W10ge2JpbmRpbmd9KTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCi0JICogQHBhcmFtIGJpbmRpbmcxIEFuIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCi0JICogQHBhcmFtIGJpbmRpbmcyIEEgc2Vjb25kIG9iamVjdCB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBtZXNzYWdlCi0JICogQHJldHVybiB0aGUgbWFuaXB1bGF0ZWQgU3RyaW5nCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgYmluZChTdHJpbmcgbWVzc2FnZSwgT2JqZWN0IGJpbmRpbmcxLCBPYmplY3QgYmluZGluZzIpIHsKLQkJcmV0dXJuIGJpbmQobWVzc2FnZSwgbmV3IE9iamVjdFtdIHtiaW5kaW5nMSwgYmluZGluZzJ9KTsKLQl9Ci0KLQkvKioKLQkgKiBCaW5kIHRoZSBnaXZlbiBtZXNzYWdlJ3Mgc3Vic3RpdHV0aW9uIGxvY2F0aW9ucyB3aXRoIHRoZSBnaXZlbiBzdHJpbmcgdmFsdWVzLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGJlIG1hbmlwdWxhdGVkCi0JICogQHBhcmFtIGJpbmRpbmdzIEFuIGFycmF5IG9mIG9iamVjdHMgdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbWVzc2FnZQotCSAqIEByZXR1cm4gdGhlIG1hbmlwdWxhdGVkIFN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGJpbmQoU3RyaW5nIG1lc3NhZ2UsIE9iamVjdFtdIGJpbmRpbmdzKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChtZXNzYWdlLCBiaW5kaW5ncyk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9YTUxTZWFyY2hEb2N1bWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvWE1MU2VhcmNoRG9jdW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkwOGFkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9YTUxTZWFyY2hEb2N1bWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5FbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5YTUxTZWFyY2hQYXJ0aWNpcGFudDsKLQotcHVibGljIGNsYXNzIFhNTFNlYXJjaERvY3VtZW50IGV4dGVuZHMgU2VhcmNoRG9jdW1lbnQgewotCQotCUlET01Nb2RlbCBtb2RlbDsKLQlNYXAgZW50cmllcyA9IG5ldyBIYXNoTWFwKCk7IC8vIGNhdGVnb3J5IC0+IHNldCAoZW50cnkpCQotCi0JcHVibGljIFhNTFNlYXJjaERvY3VtZW50KFN0cmluZyBkb2N1bWVudFBhdGgsIFhNTFNlYXJjaFBhcnRpY2lwYW50IHBhcnRpY2lwYW50KSB7Ci0JCXN1cGVyKGRvY3VtZW50UGF0aCwgcGFydGljaXBhbnQpOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0TW9kZWwoKSB7Ci0JCWlmKG1vZGVsID09IG51bGwpewotICAgICAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oImNyZWF0aW5nIERPTSBmb3IgIiArIGdldFBhdGgoKSk7Ci0JCQlJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24obmV3IFBhdGgoZ2V0UGF0aCgpKSk7Ci0JCQlpZihmaWxlICE9IG51bGwpewotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gKElET01Nb2RlbClTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldE1vZGVsRm9yRWRpdChmaWxlKTsKLQkJCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfSBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCQkJfQotCQkJCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1vZGVsOwotCX0KLQotCXB1YmxpYyBFbnRyeVtdIGdldEVudHJpZXMoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcga2V5LCBpbnQgbWF0Y2hSdWxlKQotCXsKLQkJLy8gVE9ETyB1c2UgbWF0Y2hSdWxlCi0JCVNldCByZXN1bHRzID0gbmV3IEhhc2hTZXQoKTsKLQkJaWYoY2F0ZWdvcnkgIT0gbnVsbCl7Ci0JCQlTZXQgdmFsdWVzID0gKFNldCllbnRyaWVzLmdldChjYXRlZ29yeSk7Ci0JCQlpZih2YWx1ZXMgPT0gbnVsbCl7Ci0JCQkJcmV0dXJuIG5ldyBFbnRyeVswXTsKLQkJCX0KLQkJCWlmKGtleSA9PSBudWxsIHx8ICIiLmVxdWFscyhrZXkpIHx8ICIqIi5lcXVhbHMoa2V5KSl7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCS8vIGVudHJpZXMgd2l0aCBhbnkga2V5IGluIHRoZSBnaXZlbiBjYXRlZ29yeQotCQkJCXJlc3VsdHMuYWRkQWxsKHZhbHVlcyk7Ci0JCQl9Ci0JCQllbHNlewotCQkJCS8vIGVudHJpZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUgZ2l2ZW4gY2F0ZWdvcnkKLQkJCQlmb3IgKEl0ZXJhdG9yIGl0ZXIgPSB2YWx1ZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotCQkJCXsKLQkJCQkJRW50cnkgZW50cnkgPSAoRW50cnkpIGl0ZXIubmV4dCgpOwotCQkJCQlpZihrZXkuZXF1YWxzKGVudHJ5LmdldEtleSgpKSl7Ci0JCQkJCQlyZXN1bHRzLmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQkKLQkJfQotCQlyZXR1cm4gKEVudHJ5W10pIHJlc3VsdHMudG9BcnJheShuZXcgRW50cnlbcmVzdWx0cy5zaXplKCldKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwdXRFbnRyeShFbnRyeSBlbnRyeSkKLQl7Ci0JCWlmKGVudHJ5LmdldENhdGVnb3J5KCkgIT0gbnVsbCl7Ci0JCQlTZXQgdmFsdWVzID0gKFNldCllbnRyaWVzLmdldChlbnRyeS5nZXRDYXRlZ29yeSgpKTsKLQkJCWlmKHZhbHVlcyA9PSBudWxsKXsKLQkJCQllbnRyaWVzLnB1dChlbnRyeS5nZXRDYXRlZ29yeSgpLCB2YWx1ZXM9bmV3IEhhc2hTZXQoKSk7Ci0JCQl9Ci0JCQl2YWx1ZXMuYWRkKGVudHJ5KTsKLQkJfQotCQkKLQl9Ci0KLSAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkKLSAgICB7ICAgICAKLSAgICAgIGlmIChtb2RlbCAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIG1vZGVsLnJlbGVhc2VGcm9tRWRpdCgpOyAgICAgICAgCi0gICAgICB9ICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL2ltcGwvbWVzc2FnZXMucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvaW1wbC9tZXNzYWdlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9QYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTBmNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1BhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoTWF0Y2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5TZWFyY2hQYXJ0aWNpcGFudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaFJlcXVlc3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLnBhdHRlcm4uU2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgbWF0Y2hpbmcgaW1wbGVtZW50YXRpb24uICAKLSAqIDxwPgotICogU3ViY2xhc3NlcyBvZiB0aGUgUGF0dGVybk1hdGNoZXMgc2hvdWxkIHByb3ZpZGUgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHNwZWNpZmljIHBhdHRlcm4gbWF0Y2hpbmcuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFN1YmNsYXNzZXMgb2YgdGhlIFBhdHRlcm5NYXRjaGVzIHNob3VsZCBiZSBzZXQgYXMgYWRhcHRlcnMgZm9yIHRoZSBwYXR0ZXJucyB0aGF0IHRoZXkgbWF0Y2guCi0gKiA8L3A+Ci0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU2VhcmNoUGFydGljaXBhbnQjc2VsZWN0RG9jdW1lbnRMb2NhdGlvbnMoKX0gd2lsbCBjYWxsIAotICogeyBAbGluayBQYXR0ZXJuTWF0Y2hlciNtYXRjaGVzKCkgfSBvbiB0aGUgYWRhcHRlciBvbiBwYXR0ZXJuIG1hdGNoZXIuCi0gKiAKLSAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBTZWFyY2hQYXJ0aWNpcGFudCNsb2NhdGVNYXRjaGVzKCl9IHdpbGwgY2FsbCAKLSAqIHsgQGxpbmsgUGF0dGVybk1hdGNoZXIjbG9jYXRlTWF0Y2hlcygpIH0gb24gdGhlIGFkYXB0ZXIgb24gcGF0dGVybiBtYXRjaGVyLgotICoKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFBhdHRlcm5NYXRjaGVyIHsKLQkKLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGRpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uIHRvIHRoZSByZXF1ZXN0b3IgaWYgdGhlcmUgYXJlIG1hdGNoZXMKLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIG9ubHkgYW5zd2VycyBpZiB0aGUgcGF0dGVybiBtYXRjaGVzIGVsZW1lbnQsIGl0IGRvZXMgbm90IGdpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uCi0JICovCi0JcHVibGljIGFic3RyYWN0IGJvb2xlYW4gbWF0Y2hlcyhTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIE9iamVjdCBlbGVtZW50KTsKLSAgICAKLSAgICBwcm90ZWN0ZWQgU2VhcmNoTWF0Y2ggY3JlYXRlU2VhcmNoTWF0Y2goSUZpbGUgZmlsZSwgQXR0ciBhdHRyaWJ1dGVOb2RlKQotICAgIHsKLSAgICAgICAgaW50IHN0YXJ0ID0gMDsKLSAgICAgICAgaW50IGxlbmd0aCA9IDA7Ci0gICAgICAgIGlmKGF0dHJpYnV0ZU5vZGUgaW5zdGFuY2VvZiBJRE9NQXR0cil7Ci0gICAgICAgICAgICBJRE9NQXR0ciBkb21BdHRyID0gKElET01BdHRyKWF0dHJpYnV0ZU5vZGU7Ci0gICAgICAgICAgICBzdGFydCA9IGRvbUF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotICAgICAgICAgICAgbGVuZ3RoID0gZG9tQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKS5sZW5ndGgoKTsKLSAgICAgICAgfQotICAgICAgICBTZWFyY2hNYXRjaCBtYXRjaCA9IG5ldyBTZWFyY2hNYXRjaChhdHRyaWJ1dGVOb2RlLCBzdGFydCwgbGVuZ3RoLCBmaWxlKTsKLSAgICAgICAgcmV0dXJuIG1hdGNoOwotICAgIH0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRNYXRjaChTZWFyY2hQYXR0ZXJuIHBhdHRlcm4sIElGaWxlIGZpbGUsIEF0dHIgYXR0cmlidXRlTm9kZSwgU2VhcmNoUmVxdWVzdG9yIHJlcXVlc3RvcikgewotICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiYWRkTWF0Y2ggIiArIHBhdHRlcm4gKyAiICIgKyBhdHRyaWJ1dGVOb2RlLmdldE5hbWUoKSArICI9IiArIGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWUoKSk7Ci0JCWlmIChhdHRyaWJ1dGVOb2RlICE9IG51bGwpIHsKLQkJCQlTZWFyY2hNYXRjaCBtYXRjaCA9IGNyZWF0ZVNlYXJjaE1hdGNoKGZpbGUsIGF0dHJpYnV0ZU5vZGUpOyAgICAgICAgICAgICAgICAKLQkJCQlpZihyZXF1ZXN0b3IgIT0gbnVsbCl7Ci0JCQkJCXRyeSB7Ci0JCQkJCQlyZXF1ZXN0b3IuYWNjZXB0U2VhcmNoTWF0Y2gobWF0Y2gpOwotCQkJCQl9IGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJCS8vZG8gbm90aGluZwotCQkJCQl9Ci0JCQkJfQotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvbWF0Y2hpbmcvU0FYU2VhcmNoRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVjNGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9TQVhTZWFyY2hFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlczsKLQotcHVibGljIGNsYXNzIFNBWFNlYXJjaEVsZW1lbnR7Ci0JQXR0cmlidXRlcyBhdHRyaWJ1dGVzOwotCVN0cmluZyBlbGVtZW50TmFtZTsKLQlTdHJpbmcgZWxlbWVudE5hbWVzcGFjZTsKLQlNYXAgbmFtZXNwYWNlTWFwID0gbmV3IEhhc2hNYXAoKTsgLy8gTWFwIG9mIHN0cmluZyBwcmVmaXgga2V5cyBhbmQgbmFtZXNwYWNlCi0JU3RyaW5nIHRhcmdldE5hbWVzcGFjZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIHBhcmVudE5hbWU7Ci0gICAgaW50IGRlcHRoID0gLTE7Ci0JCi0JcHVibGljIFNBWFNlYXJjaEVsZW1lbnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCXB1YmxpYyBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVzOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnROYW1lKCkgewotCQlyZXR1cm4gZWxlbWVudE5hbWU7Ci0JfQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIGVsZW1lbnROYW1lc3BhY2U7Ci0JfQotCXB1YmxpYyBNYXAgZ2V0TmFtZXNwYWNlTWFwKCkgewotCQlyZXR1cm4gbmFtZXNwYWNlTWFwOwotCX0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLQkJdGhpcy5hdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWUoU3RyaW5nIGVsZW1lbnROYW1lKSB7Ci0JCXRoaXMuZWxlbWVudE5hbWUgPSBlbGVtZW50TmFtZTsKLQl9Ci0JcHVibGljIHZvaWQgc2V0RWxlbWVudE5hbWVzcGFjZShTdHJpbmcgZWxlbWVudE5hbWVzcGFjZSkgewotCQl0aGlzLmVsZW1lbnROYW1lc3BhY2UgPSBlbGVtZW50TmFtZXNwYWNlOwotCX0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VNYXAoTWFwIG5hbWVzcGFjZU1hcCkgewotCQl0aGlzLm5hbWVzcGFjZU1hcCA9IG5hbWVzcGFjZU1hcDsKLQl9Ci0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0YXJnZXROYW1lc3BhY2UpIHsKLQkJdGhpcy50YXJnZXROYW1lc3BhY2UgPSB0YXJnZXROYW1lc3BhY2U7Ci0JfQotICBwdWJsaWMgaW50IGdldERlcHRoKCkKLSAgewotICAgIHJldHVybiBkZXB0aDsKLSAgfQotICBwdWJsaWMgdm9pZCBzZXREZXB0aChpbnQgZGVwdGgpCi0gIHsKLSAgICB0aGlzLmRlcHRoID0gZGVwdGg7Ci0gIH0KLXB1YmxpYyBTdHJpbmcgZ2V0UGFyZW50TmFtZSgpIHsKLQlyZXR1cm4gcGFyZW50TmFtZTsKLX0KLXB1YmxpYyB2b2lkIHNldFBhcmVudE5hbWUoU3RyaW5nIHBhcmVudE5hbWUpIHsKLQl0aGlzLnBhcmVudE5hbWUgPSBwYXJlbnROYW1lOwotfQotCQotCQotCQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9tYXRjaGluZy9YTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiOWMzZDMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXNlYXJjaC9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc2VhcmNoL21hdGNoaW5nL1hNTFNlYXJjaFBhdHRlcm5NYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLlNlYXJjaE1hdGNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guU2VhcmNoUmVxdWVzdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLlhNTFNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTFNlYXJjaFBhdHRlcm5NYXRjaGVyIGV4dGVuZHMgUGF0dGVybk1hdGNoZXJ7Ci0JCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVOYW1lc3BhY2VGb3JQcmVmaXgoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgcHJlZml4KQotCXsKLQkgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCSAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkKLQkgIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJewotCQkgIEVsZW1lbnQgZSA9IChFbGVtZW50KW5vZGU7Ci0JCSAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCkgPyAoInhtbG5zOiIgKyBwcmVmaXgpIDogInhtbG5zIjsgIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkgIHJlc3VsdCA9IGUuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOwotCQkgIGlmIChyZXN1bHQgIT0gbnVsbCkKLQkJICB7Ci0JCQkgYnJlYWs7ICAKLQkJICB9CSAgCi0JCX0JCi0JICB9CSAgCi0JICByZXR1cm4gcmVzdWx0OwotCX0KLQkKLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWE1MU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBFbGVtZW50IGRvbUVsZW1lbnQpIHsKLQkKLQkJCXBhdHRlcm4uc2V0RWxlbWVudE5hbWUoZG9tRWxlbWVudC5nZXRMb2NhbE5hbWUoKSk7Ci0JCQlwYXR0ZXJuLnNldEVsZW1lbnROYW1lc3BhY2UoZG9tRWxlbWVudC5nZXROYW1lc3BhY2VVUkkoKSk7Ci0gICAgICAgICAgICAvLyBUT0RPIChjcykgc2V0IHRoZSBkZXB0aCBhdHRyaWJ1dGUgb24gdGhlIHBhdHRlcm4KLSAgICAgICAgICAgIC8vCi0JCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSBkb21FbGVtZW50LmdldEF0dHJpYnV0ZShwYXR0ZXJuLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQkgaWYoYWN0dWFsVmFsdWUgIT0gbnVsbCl7Ci0JCQkJCWludCBuID0gYWN0dWFsVmFsdWUuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmKG4gPiAwKXsKLQkJCQkJCVN0cmluZyBwcmVmaXggPSBhY3R1YWxWYWx1ZS5zdWJzdHJpbmcoMCwgbik7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUuc3Vic3RyaW5nKG4rMSkpOyAgICAgIAotCQkJCQkJCi0JCQkJCQlTdHJpbmcgbmFtZXNwYWNlID0gY29tcHV0ZU5hbWVzcGFjZUZvclByZWZpeChkb21FbGVtZW50LCBwcmVmaXgpOwotCQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UobmFtZXNwYWNlKTsKLQkJCQkJCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwYXR0ZXJuLnNldFNlYXJjaE5hbWUoYWN0dWFsVmFsdWUpOwotCQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoZG9tRWxlbWVudC5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0QXR0cmlidXRlKCJ0YXJnZXROYW1lc3BhY2UiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJICAgIH0KLQkJCi0JfQotCQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemUoWE1MU2VhcmNoUGF0dGVybiBwYXR0ZXJuLCBTQVhTZWFyY2hFbGVtZW50IHNheEVsZW1lbnQpIHsKLQkJCi0JCXBhdHRlcm4uc2V0RWxlbWVudE5hbWUoc2F4RWxlbWVudC5nZXRFbGVtZW50TmFtZSgpKTsKLQkJcGF0dGVybi5zZXRFbGVtZW50TmFtZXNwYWNlKHNheEVsZW1lbnQuZ2V0RWxlbWVudE5hbWVzcGFjZSgpKTsKLSAgICAgICAgcGF0dGVybi5zZXREZXB0aChzYXhFbGVtZW50LmdldERlcHRoKCkpOwotICAgICAgICBwYXR0ZXJuLnNldFBhcmVudE5hbWUoc2F4RWxlbWVudC5nZXRQYXJlbnROYW1lKCkpOwotCQlTdHJpbmcgYWN0dWFsVmFsdWUgPSBzYXhFbGVtZW50LmdldEF0dHJpYnV0ZXMoKS5nZXRWYWx1ZShwYXR0ZXJuLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCSBpZihhY3R1YWxWYWx1ZSAhPSBudWxsKXsKLQkJCQlpbnQgbiA9IGFjdHVhbFZhbHVlLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWlmKG4gPiAwKXsKLQkJCQkJU3RyaW5nIHByZWZpeCA9IGFjdHVhbFZhbHVlLnN1YnN0cmluZygwLCBuKTsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lKGFjdHVhbFZhbHVlLnN1YnN0cmluZyhuKzEpKTsKLQkJCQkJcGF0dGVybi5zZXRTZWFyY2hOYW1lc3BhY2UoKFN0cmluZylzYXhFbGVtZW50LmdldE5hbWVzcGFjZU1hcCgpLmdldChwcmVmaXgpKTsKLQkJCQkKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZShhY3R1YWxWYWx1ZSk7Ci0JCQkJCXBhdHRlcm4uc2V0U2VhcmNoTmFtZXNwYWNlKHNheEVsZW1lbnQuZ2V0VGFyZ2V0TmFtZXNwYWNlKCkpOwotCQkJCX0KLQkJICAgIH0KLQkKLQl9Ci0JCi0JWE1MU2VhcmNoUGF0dGVybiBzZWFyY2hQYXR0ZXJuOwotCQotCXB1YmxpYyBYTUxTZWFyY2hQYXR0ZXJuTWF0Y2hlcigpIHsKLQkJc3VwZXIoKTsKLQkJCi0JfQotCi0JCi0KLQkKLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBkb2VzIGRpdmUgYWN0dWFsIG1hdGNoIGxvY2F0aW9uIHRvIHRoZSByZXF1ZXN0b3IgaWYgdGhlcmUgYXJlIG1hdGNoZXMKLQkgKi8KLQkKLQlwdWJsaWMgdm9pZCBsb2NhdGVNYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgSUZpbGUgZmlsZSwgRWxlbWVudCBlbGVtZW50LCBTZWFyY2hSZXF1ZXN0b3IgcmVxdWVzdG9yKSB7Ci0JCWlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXsKLQkJCVhNTFNlYXJjaFBhdHRlcm5bXSBjaGlsZFBhdHRlcm5zID0gKChYTUxDb21wb25lbnRTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldENoaWxkcmVuKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkUGF0dGVybnMubGVuZ3RoOyBpKyspIHsKLQkJCQlQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyID0gKFBhdHRlcm5NYXRjaGVyKWNoaWxkUGF0dGVybnNbaV0uZ2V0QWRhcHRlcihQYXR0ZXJuTWF0Y2hlci5jbGFzcyk7Ci0JCQkJaWYobWF0Y2hlciA9PSBudWxsKXsKLQkJCQkJbWF0Y2hlciA9IHRoaXM7Ci0JCQkJfQotCQkJCWlmKG1hdGNoZXIgIT0gbnVsbCl7Ci0JCQkJCW1hdGNoZXIubG9jYXRlTWF0Y2hlcyhjaGlsZFBhdHRlcm5zW2ldLCBmaWxlLCBlbGVtZW50LCByZXF1ZXN0b3IpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxTZWFyY2hQYXR0ZXJuKXsKLQkJCWlmKG1hdGNoZXMocGF0dGVybiwgZWxlbWVudCkpewotCQkJCUF0dHIgYXR0cmlidXRlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKCgoWE1MU2VhcmNoUGF0dGVybilwYXR0ZXJuKS5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQkJCWFkZE1hdGNoKHBhdHRlcm4sIGZpbGUsIGF0dHJpYnV0ZSwgcmVxdWVzdG9yKTsKLQkJCX0KLQkJCi0JCX0KLQl9Ci0JCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgb25seSBhbnN3ZXJzIGlmIHRoZSBwYXR0ZXJuIG1hdGNoZXMgZWxlbWVudCwgaXQgZG9lcyBub3QgZ2l2ZSBhY3R1YWwgbWF0Y2ggbG9jYXRpb24KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKFNlYXJjaFBhdHRlcm4gcGF0dGVybiwgT2JqZWN0IGVsZW1lbnQpewotCQlpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybil7Ci0JCQlYTUxTZWFyY2hQYXR0ZXJuW10gY2hpbGRQYXR0ZXJucyA9ICgoWE1MQ29tcG9uZW50U2VhcmNoUGF0dGVybilwYXR0ZXJuKS5nZXRDaGlsZHJlbigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUGF0dGVybk1hdGNoZXIgbWF0Y2hlciA9IChQYXR0ZXJuTWF0Y2hlciljaGlsZFBhdHRlcm5zW2ldLmdldEFkYXB0ZXIoUGF0dGVybk1hdGNoZXIuY2xhc3MpOwotCQkJCWlmKG1hdGNoZXIgPT0gbnVsbCl7Ci0JCQkJCW1hdGNoZXIgPSB0aGlzOwotCQkJCX0KLQkJCQlpZihtYXRjaGVyICE9IG51bGwpewotCQkJCQlpZihtYXRjaGVyLm1hdGNoZXMoY2hpbGRQYXR0ZXJuc1tpXSwgZWxlbWVudCkpewotCQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJCi0JCQl9Ci0JCX0KLQkJZWxzZSBpZihwYXR0ZXJuIGluc3RhbmNlb2YgWE1MU2VhcmNoUGF0dGVybil7Ci0JCQkKLQkJCVhNTFNlYXJjaFBhdHRlcm4gcG9zc2libGVNYXRjaCA9IG5ldyBYTUxTZWFyY2hQYXR0ZXJuKCk7Ci0JCQlwb3NzaWJsZU1hdGNoLnNldEF0dHJpYnV0ZU5hbWUoKChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm4pLmdldEF0dHJpYnV0ZU5hbWUoKSk7Ci0JCQlpZihlbGVtZW50IGluc3RhbmNlb2YgRWxlbWVudCl7Ci0JCQkJaW5pdGlhbGl6ZShwb3NzaWJsZU1hdGNoLCAoRWxlbWVudCllbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYoZWxlbWVudCBpbnN0YW5jZW9mIFNBWFNlYXJjaEVsZW1lbnQpewotCQkJCWluaXRpYWxpemUocG9zc2libGVNYXRjaCwgKFNBWFNlYXJjaEVsZW1lbnQpZWxlbWVudCk7Ci0JCQl9Ci0JCQlzZWFyY2hQYXR0ZXJuID0gKFhNTFNlYXJjaFBhdHRlcm4pcGF0dGVybjsKLQkJCXJldHVybiBtYXRjaGVzUGF0dGVybihwb3NzaWJsZU1hdGNoKTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCQotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoZXNQYXR0ZXJuKFNlYXJjaFBhdHRlcm4gcGF0dGVybikgewotCQlpZihzZWFyY2hQYXR0ZXJuICE9IG51bGwgJiYgcGF0dGVybiBpbnN0YW5jZW9mIFhNTFNlYXJjaFBhdHRlcm4pewotCQkJWE1MU2VhcmNoUGF0dGVybiBkZWNvZGVkUGF0dGVybiA9IChYTUxTZWFyY2hQYXR0ZXJuKXBhdHRlcm47Ci0gICAgICAgICAgICBpZihzZWFyY2hQYXR0ZXJuLmdldEVsZW1lbnROYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldEVsZW1lbnROYW1lKCkpICYmICAgICAgICAgICAgICAgICAgICAKLQkJCQkJc2VhcmNoUGF0dGVybi5nZXRFbGVtZW50TmFtZXNwYWNlKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldEVsZW1lbnROYW1lc3BhY2UoKSkpeyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBpZihzZWFyY2hQYXR0ZXJuLmdldFBhcmVudE5hbWUoKSAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgZGVjb2RlZFBhdHRlcm4uZ2V0UGFyZW50TmFtZSgpICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAhc2VhcmNoUGF0dGVybi5nZXRQYXJlbnROYW1lKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFBhcmVudE5hbWUoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgCi0gICAgICAgICAgICAgICAgfSAgCi0gICAgICAgICAgICAgICAgaWYoc2VhcmNoUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7ICAKLSAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoIioiLmVxdWFscyhzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKSkpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9ICAKLSAgICAgICAgICAgICAgICBlbHNlIGlmKHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZXNwYWNlKCkgPT0gbnVsbCl7Ci0JCQkJCXJldHVybiBzZWFyY2hQYXR0ZXJuLmdldFNlYXJjaE5hbWUoKS5lcXVhbHMoZGVjb2RlZFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZXsKLQkJCQkJcmV0dXJuIHNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZSgpLmVxdWFscyhkZWNvZGVkUGF0dGVybi5nZXRTZWFyY2hOYW1lKCkpICYmCi0JCQkJCXNlYXJjaFBhdHRlcm4uZ2V0U2VhcmNoTmFtZXNwYWNlKCkuZXF1YWxzKGRlY29kZWRQYXR0ZXJuLmdldFNlYXJjaE5hbWVzcGFjZSgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0JCi0gICAgCi0gICAgcHJvdGVjdGVkIFNlYXJjaE1hdGNoIGNyZWF0ZVNlYXJjaE1hdGNoKElGaWxlIGZpbGUsIEF0dHIgYXR0cmlidXRlTm9kZSkKLSAgICB7Ci0gICAgICBTZWFyY2hNYXRjaCBtYXRjaCA9IHN1cGVyLmNyZWF0ZVNlYXJjaE1hdGNoKGZpbGUsIGF0dHJpYnV0ZU5vZGUpOwotICAgICAgLy8gdG9kby4uLiByZW1vdmUgdGhpcyB1Z2x5IGhhY2shIQotICAgICAgaWYgKCJuYW1lIi5lcXVhbHMoYXR0cmlidXRlTm9kZS5nZXROYW1lKCkpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIFF1YWxpZmllZE5hbWUgcXVhbGlmaWVkTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKCJ0b2RvLWNvbXB1dGUtdGFyZ2V0TmFtZXNwYWNlIiwgYXR0cmlidXRlTm9kZS5nZXRWYWx1ZSgpKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICBtYXRjaC5tYXAucHV0KCJuYW1lIiwgcXVhbGlmaWVkTmFtZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIC8vRWxlbWVudCBlbGVtZW50ID0gYXR0cmlidXRlTm9kZS5nZXRPd25lckRvY3VtZW50KCkuZ2V0RG9jdW1lbnRFbGVtZW50KCk7Ci0gICAgICAvL2lmIChlbGVtZW50LmdldEF0dHJpYnV0ZSgidGFyZ2V0TmFtZXNwYWNlIikpCi0gICAgICAvL3sgICAgICAgIAotICAgICAgLy99ICAKLSAgICAgIHJldHVybiBtYXRjaDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2Nhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTY2NjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLnF1aWNrc2NhbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2guZG9jdW1lbnQuU2VhcmNoRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5wYXR0ZXJuLlNlYXJjaFBhdHRlcm47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNlYXJjaC5tYXRjaGluZy5QYXR0ZXJuTWF0Y2hlcjsKLWltcG9ydCBvcmcueG1sLnNheC5FcnJvckhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbgotewotICAgIC8qCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyBmdWxsRmlsZVBhdGgpCi0JewotCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKCk7Ci0JCXBhcnNlRmlsZShmdWxsRmlsZVBhdGgsIGhhbmRsZXIpOwotCQlyZXR1cm4gaGFuZGxlci5nZXRUYXJnZXROYW1lc3BhY2UoKTsKLQl9Ki8KLQkKLQkvKgotCSAqIFJldHVybnMgaW5mb3JtYXRpb24gYWJvdXQgbWF0Y2hlcyBlbmNvdW50ZXJlZCBiYXNlZCBvbiB0aGUgY3JpdGVyaWEKLQkgKiBwcm92aWRlZC4KLQkgKgotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBoYXNNYXRjaChTdHJpbmcgZnVsbEZpbGVQYXRoLCBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pCi0JewotCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyID0gbmV3IFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKG1hdGNoZXIsIHBhdHRlcm4pOwotCQlwYXJzZUZpbGUoZnVsbEZpbGVQYXRoLCBoYW5kbGVyKTsKLQkJcmV0dXJuIGhhbmRsZXIuaGFzTWF0Y2goKTsKLQl9Ki8KLQkKLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gcG9wdWxhdGVTZWFyY2hEb2N1bWVudChTZWFyY2hEb2N1bWVudCBkb2N1bWVudCwgUGF0dGVybk1hdGNoZXIgbWF0Y2hlciwgU2VhcmNoUGF0dGVybiBwYXR0ZXJuKQotCXsKLQkJWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIgaGFuZGxlciA9IG5ldyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihkb2N1bWVudCwgbWF0Y2hlciwgcGF0dGVybik7Ci0JCXBhcnNlRmlsZShkb2N1bWVudC5nZXRQYXRoKCksIGhhbmRsZXIpOwotCQlyZXR1cm4gaGFuZGxlci5oYXNNYXRjaCgpOwotCX0KLQotICAgIHByaXZhdGUgc3RhdGljIFhNTFJlYWRlciByZWFkZXI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgWE1MUmVhZGVyIGdldE9yQ3JlYXRlUmVhZGVyKCkKLSAgICB7Ci0gICAgICAgaWYgKHJlYWRlciA9PSBudWxsKQotICAgICAgIHsKLSAgICAgICAgIHRyeQotICAgICAgICAgewotICAgICAgICAgIFNBWFBhcnNlciBwYXJzZXIgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgcmVhZGVyID0gcGFyc2VyLmdldFhNTFJlYWRlcigpOyAgCi0gICAgICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICByZWFkZXIuc2V0RXJyb3JIYW5kbGVyKG5ldyBJbnRlcm5hbEVycm9ySGFuZGxlcigpKTsgICAgICAgICAgCi0gICAgICAgICB9Ci0gICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICB7ICAgICAgICAgICAKLSAgICAgICAgIH0KLSAgICAgICB9IAotICAgICAgIHJldHVybiByZWFkZXI7Ci0gICAgfQotICAgIAotICAgIHN0YXRpYyBjbGFzcyBJbnRlcm5hbEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlcgotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIGVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgeyAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIAotICAgICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7ICAgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgc3RhdGljIHZvaWQgcGFyc2VGaWxlKFN0cmluZyBmdWxsRmlsZVBhdGgsCi0JCQlYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlciBoYW5kbGVyKQotCXsKLQkJRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKLQkJdHJ5Ci0JCXsgICAgICAgICAgICAKLQkJCWlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShuZXcgRmlsZShmdWxsRmlsZVBhdGgpKTsKLQkJCVhNTFJlYWRlciByZWFkZXIgPSBnZXRPckNyZWF0ZVJlYWRlcigpOwotICAgICAgICAgICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKGhhbmRsZXIpOwotCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oInBhcnNlRmlsZSIgKyByZWFkZXIgKyAiICgiICsgIGZ1bGxGaWxlUGF0aCArICIpIik7CQkJCi0JCQlyZWFkZXIucGFyc2UobmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCQl7Ci0JCQkvLyBza2lwIHRoZSBmaWxlCi0JCX0gCi0JCWZpbmFsbHl7Ci0JCQlpZihpbnB1dFN0cmVhbSAhPSBudWxsKXsKLQkJCQl0cnkgewotCQkJCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gY2FuIG5vdCBkbyBtdWNoIAotCQkJCX0KLQkJCX0KLQkJCQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy1zZWFyY2gvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NlYXJjaC9xdWlja3NjYW4vWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVkODdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtc2VhcmNoL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zZWFyY2gvcXVpY2tzY2FuL1hNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gucXVpY2tzY2FuOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkNvbXBvbmVudERlY2xhcmF0aW9uRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi5jb3JlLnNlYXJjaC5kb2N1bWVudC5Db21wb25lbnRSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LkZpbGVSZWZlcmVuY2VFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLmNvcmUuc2VhcmNoLmRvY3VtZW50LlNlYXJjaERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24uY29yZS5zZWFyY2gucGF0dGVybi5TZWFyY2hQYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50RGVjbGFyYXRpb25QYXR0ZXJuOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2guWE1MQ29tcG9uZW50UmVmZXJlbmNlUGF0dGVybjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLmltcGwuSVhNTFNlYXJjaENvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc2VhcmNoLm1hdGNoaW5nLlBhdHRlcm5NYXRjaGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zZWFyY2gubWF0Y2hpbmcuU0FYU2VhcmNoRWxlbWVudDsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLkRlZmF1bHRIYW5kbGVyOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBTQVggY29udGVudCBoYW5kbGVyLCBpdCBzaG91bGQgYmUgcmVjeWNsZWQgYmVmb3JlIHNjYW5uaW5nIGEgZmlsZSBmb3IgdGhlIG5ldyBTZWFyY2hQYXR0ZXJuLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLQlwcml2YXRlIE1hcCBuYW1lc3BhY2VNYXAgPSBuZXcgSGFzaE1hcCgpOyAvLyBNYXAgb2Ygc3RyaW5nIHByZWZpeCBrZXlzIGFuZCBuYW1lc3BhY2UKLQlwcml2YXRlIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQotCXByaXZhdGUgU2VhcmNoUGF0dGVybiBwYXR0ZXJuOwotCXByaXZhdGUgU2VhcmNoRG9jdW1lbnQgZG9jdW1lbnQ7ICAvLyB3ZSdsbCBhZGQgdXNlZnVsIGVudHJpZXMgaW4gdGhlIHNlYXJjaCBkb2N1bWVudCBhcyB3ZSBwYXJzaW5nCi0JcHJpdmF0ZSBTQVhTZWFyY2hFbGVtZW50IHNlYXJjaEVsZW1lbnQgPSBuZXcgU0FYU2VhcmNoRWxlbWVudCgpOwotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01hdGNoID0gZmFsc2U7Ci0JcHJpdmF0ZSBTdGFjayBjdXJyZW50UGF0aCA9IG5ldyBTdGFjaygpOwotCXByaXZhdGUgUGF0dGVybk1hdGNoZXIgbWF0Y2hlcjsKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxTQ0hFTUFfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXU0RMX05BTUVTUEFDRSA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyI7IC8vJE5PTi1OTFMtMSQKLQotCQotCXB1YmxpYyBYTUxRdWlja1NjYW5Db250ZW50SGFuZGxlcihQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKLQl9Ci0JCi0JcHVibGljIFhNTFF1aWNrU2NhbkNvbnRlbnRIYW5kbGVyKFNlYXJjaERvY3VtZW50IGRvY3VtZW50LCBQYXR0ZXJuTWF0Y2hlciBtYXRjaGVyLCBTZWFyY2hQYXR0ZXJuIHBhdHRlcm4pIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5wYXR0ZXJuID0gcGF0dGVybjsKLQkJdGhpcy5tYXRjaGVyID0gbWF0Y2hlcjsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCX0KLQkKLQlwdWJsaWMgWE1MUXVpY2tTY2FuQ29udGVudEhhbmRsZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwKLQkJCUF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotCXsJCi0JCS8vIFNlYXJjaCBmb3IgdGFyZ2V0TmFtZXNwYWNlIGlmIHdlIGhhdmVuJ3QgZW5jb3VudGVyZWQgaXQgeWV0LgotCQlpZiAodGFyZ2V0TmFtZXNwYWNlLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJaW50IG5BdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbkF0dHJpYnV0ZXM7IGkrKykKLQkJCXsKLQkJCQlpZiAoInRhcmdldE5hbWVzcGFjZSIuZXF1YWxzKGF0dHJpYnV0ZXMuZ2V0UU5hbWUoaSkpKSAvLyROT04tTkxTLTEkCi0JCQkJewotCQkJCQl0YXJnZXROYW1lc3BhY2UgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNvbGxlY3QgbGluayBpbmZvCi0gICAgCi0gICAgLy8gVE9ETyBUaGlzIGNvZGUgc2hvdWxkIGJlIHJlZmFjdG9yZWQgdG8gZGVsZWdhdGUgdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi0gICAgLy8gZGV0ZWN0IGxpbmtzIGJldHdlZW4gZmlsZXMgdG8gdGhlIHNlYXJjaCBwcm92aWRlcnMvY29udHJpYnV0b3JzLgotICAgIC8vIFRoZSBjdXJyZW50IGNvZGUgb25seSBoYW5kbGVzIHRoZSBYU0QgYW5kIFdTREwgY2FzZXMuIAotICAgIAotCQlpZigiaW1wb3J0Ii5lcXVhbHMobG9jYWxOYW1lKSAmJiBuYW1lc3BhY2VNYXRjaGVzKHVyaSkpeyAvLyROT04tTkxTLTEkCi0JCQlGaWxlUmVmZXJlbmNlRW50cnkgZG9jdW1lbnRFbnRyeSA9IG5ldyBGaWxlUmVmZXJlbmNlRW50cnkoKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5SRUYpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRLZXkoImltcG9ydCIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZXNwYWNlID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgibmFtZXNwYWNlIik7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBsb2NhdGlvbiA9IGF0dHJpYnV0ZXMuZ2V0VmFsdWUoZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKHVyaSkpOyAvLyROT04tTkxTLTEkCi0JCQlkb2N1bWVudEVudHJ5LnNldFB1YmxpY0lkZW50aWZpZXIobmFtZXNwYWNlKTsKLQkJCWRvY3VtZW50RW50cnkuc2V0UmVsYXRpdmVGaWxlUGF0aChsb2NhdGlvbik7ICAgICAgICAgICAgCi0JCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJfQotCQlpZigoInJlZGVmaW5lIi5lcXVhbHMobG9jYWxOYW1lKXx8ICJpbmNsdWRlIi5lcXVhbHMobG9jYWxOYW1lKSkgJiYgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJbmFtZXNwYWNlTWF0Y2hlcyh1cmkpKXsKLQkJCUZpbGVSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IEZpbGVSZWZlcmVuY2VFbnRyeSgpOwotCQkJZG9jdW1lbnRFbnRyeS5zZXRDYXRlZ29yeShJWE1MU2VhcmNoQ29uc3RhbnRzLlJFRik7Ci0JCQlkb2N1bWVudEVudHJ5LnNldEtleSgiaW5jbHVkZSIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbG9jYXRpb24gPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGdldExvY2F0aW9uQXR0cmlidXRlTmFtZSh1cmkpKTsgLy8kTk9OLU5MUy0xJAotCQkJZG9jdW1lbnRFbnRyeS5zZXRQdWJsaWNJZGVudGlmaWVyKHVyaSk7Ci0JCQlkb2N1bWVudEVudHJ5LnNldFJlbGF0aXZlRmlsZVBhdGgobG9jYXRpb24pOwotCQkJZG9jdW1lbnQucHV0RW50cnkoZG9jdW1lbnRFbnRyeSk7Ci0JCX0KLQkJCi0JCQotICAgICAgICAvLyBpc3N1ZSAoY3MpIHlvdSBtYXkgd2FudCB0byB0cnkgcGVyZiBtZWFzdXJlbWVudHMgdG8gY29tcGF0ZSByZXVzaW5nIHRoZSBzYW1lCi0gICAgICAgIC8vIGluc3RhbmNlIG9mIGEgU0FYU2VhcmNoRWxlbWVudCBpbnN0ZWFkIG9mIG5ld2luZyBvbmUgZWFjaCB0aW1lIAotCQkvL1hNTFNlYXJjaFBhdHRlcm4uU0FYU2VhcmNoRWxlbWVudCBzZWFyY2hFbGVtZW50ID0gbmV3IFhNTFNlYXJjaFBhdHRlcm4uU0FYU2VhcmNoRWxlbWVudCgpOwotCQlzZWFyY2hFbGVtZW50LnNldEVsZW1lbnROYW1lKGxvY2FsTmFtZSk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0RWxlbWVudE5hbWVzcGFjZSh1cmkpOwotCQlzZWFyY2hFbGVtZW50LnNldEF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0TmFtZXNwYWNlTWFwKG5hbWVzcGFjZU1hcCk7Ci0JCXNlYXJjaEVsZW1lbnQuc2V0VGFyZ2V0TmFtZXNwYWNlKHRhcmdldE5hbWVzcGFjZSk7Ci0JCWlmIChjdXJyZW50UGF0aC5zaXplKCkgPiAwKQotCQl7Ci0JCSAgU3RyaW5nIHBhcmVudE5hbWUgPSAoU3RyaW5nKWN1cnJlbnRQYXRoLnBlZWsoKTsKLQkJICBzZWFyY2hFbGVtZW50LnNldFBhcmVudE5hbWUocGFyZW50TmFtZSk7Ci0JCX0JCQkKLQkKLQotCQlpZihtYXRjaGVyICE9IG51bGwpewotCQkJaWYobWF0Y2hlci5tYXRjaGVzKHBhdHRlcm4sIHNlYXJjaEVsZW1lbnQpKXsKLQkJCQloYXNNYXRjaCA9IHRydWU7Ci0JCQkJaWYocGF0dGVybiBpbnN0YW5jZW9mIFhNTENvbXBvbmVudFJlZmVyZW5jZVBhdHRlcm4pewotCQkJCQlDb21wb25lbnRSZWZlcmVuY2VFbnRyeSBkb2N1bWVudEVudHJ5ID0gbmV3IENvbXBvbmVudFJlZmVyZW5jZUVudHJ5KCk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0Q2F0ZWdvcnkoSVhNTFNlYXJjaENvbnN0YW50cy5DT01QT05FTlRfUkVGKTsKLQkJCQkJUXVhbGlmaWVkTmFtZSBuYW1lID0gbmV3IFF1YWxpZmllZE5hbWUodXJpLCBsb2NhbE5hbWUpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldEtleShuYW1lLnRvU3RyaW5nKCkpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldE5hbWUobmFtZSk7Ci0JCQkJCWRvY3VtZW50LnB1dEVudHJ5KGRvY3VtZW50RW50cnkpOwotCQkJCX0KLQkJCQllbHNlIGlmKHBhdHRlcm4gaW5zdGFuY2VvZiBYTUxDb21wb25lbnREZWNsYXJhdGlvblBhdHRlcm4pewotCQkJCQlDb21wb25lbnREZWNsYXJhdGlvbkVudHJ5IGRvY3VtZW50RW50cnkgPSBuZXcgQ29tcG9uZW50RGVjbGFyYXRpb25FbnRyeSgpOwotCQkJCQlkb2N1bWVudEVudHJ5LnNldENhdGVnb3J5KElYTUxTZWFyY2hDb25zdGFudHMuQ09NUE9ORU5UX0RFQ0wpOwotICAgICAgICAgICAgICAgICAgICBRdWFsaWZpZWROYW1lIG5hbWUgPSBuZXcgUXVhbGlmaWVkTmFtZSh0YXJnZXROYW1lc3BhY2UsIGF0dHJpYnV0ZXMuZ2V0VmFsdWUoIm5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJUXVhbGlmaWVkTmFtZSBtZXRhTmFtZSA9IG5ldyBRdWFsaWZpZWROYW1lKHVyaSwgbG9jYWxOYW1lKTsgICAgICAgICAgICAgICAgICAgIAotCQkJCQlkb2N1bWVudEVudHJ5LnNldEtleShuYW1lLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBkb2N1bWVudEVudHJ5LnNldE5hbWUobmFtZSk7Ci0JCQkJCWRvY3VtZW50RW50cnkuc2V0TWV0YU5hbWUobWV0YU5hbWUpOwotCQkJCQlkb2N1bWVudC5wdXRFbnRyeShkb2N1bWVudEVudHJ5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY3VycmVudFBhdGgucHVzaChsb2NhbE5hbWUpOyAvLyROT04tTkxTLTEkCQkKLQl9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0TG9jYXRpb25BdHRyaWJ1dGVOYW1lKFN0cmluZyB1cmkpCi0gIHsKLSAgICBpZiAoWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModXJpKSkKLSAgICB7Ci0gICAgICByZXR1cm4gInNjaGVtYUxvY2F0aW9uIjsKLSAgICB9Ci0gICAgCi0gICAgZWxzZSBpZiAoV1NETF9OQU1FU1BBQ0UuZXF1YWxzKHVyaSkpCi0gICAgewotICAgICAgcmV0dXJuICJsb2NhdGlvbiI7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAiIjsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBuYW1lc3BhY2VNYXRjaGVzKFN0cmluZyB1cmkpCi0gIHsKLSAgICByZXR1cm4gWE1MU0NIRU1BX05BTUVTUEFDRS5lcXVhbHModXJpKSB8fAotICAgICAgICAgIFdTRExfTkFNRVNQQUNFLmVxdWFscyh1cmkpOwotICB9Ci0JCi0JcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcU5hbWUpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQljdXJyZW50UGF0aC5wb3AoKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsYmFjayBmb3IgU0FYIHBhcnNlcgotCSAqIAotCSAqIEBzZWUgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXIjc3RhcnRQcmVmaXhNYXBwaW5nKGphdmEubGFuZy5TdHJpbmcsCi0JICogICAgICBqYXZhLmxhbmcuU3RyaW5nKQotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0UHJlZml4TWFwcGluZyhTdHJpbmcgYXJnMCwgU3RyaW5nIGFyZzEpCi0JCQl0aHJvd3MgU0FYRXhjZXB0aW9uCi0JewotCQlpZiAoYXJnMCAhPSBudWxsICYmIGFyZzAubGVuZ3RoKCkgPiAwKQotCQl7Ci0JCQl0aGlzLm5hbWVzcGFjZU1hcC5wdXQoYXJnMCwgYXJnMSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYXJnZXROYW1lc3BhY2UoU3RyaW5nIHRhcmdldE5hbWVzcGFjZSkgewotCQl0aGlzLnRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNNYXRjaCgpIHsKLQkJcmV0dXJuIGhhc01hdGNoOwotCX0KLQotCQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1ZhbGlkYXRvckhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdG9ySGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1NDRjNzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vVmFsaWRhdG9ySGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguZXh0LkxleGljYWxIYW5kbGVyOwotCi0vKioKLSAqIEEgaGVscGVyIGNsYXNzIGZvciB0aGUgWE1MIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBDcmFpZyBTYWx0ZXIsIElCTQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9ySGVscGVyCi17ICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIHB1YmxpYyBMaXN0IG5hbWVzcGFjZVVSSUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gIHB1YmxpYyBib29sZWFuIGlzR3JhbW1hckVuY291bnRlcmVkID0gZmFsc2U7ICAgIAotICBwdWJsaWMgYm9vbGVhbiBpc0RUREVuY291bnRlcmVkID0gZmFsc2U7Ci0gIHB1YmxpYyBib29sZWFuIGlzTmFtZXNwYWNlRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHVibGljIFN0cmluZyBzY2hlbWFMb2NhdGlvblN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0gIHB1YmxpYyBpbnQgbnVtRFRERWxlbWVudHMgPSAwOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0b3JIZWxwZXIoKQotICB7Ci0gIH0KLSAKLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYTUwgUmVhZGVyLgotICAgKiAKLSAgICogQHJldHVybiBBbiBYTUwgUmVhZGVyIGlmIG9uZSBjYW4gYmUgY3JlYXRlZCBvciBudWxsLgotICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgotICAgKi8KLSAgcHJvdGVjdGVkIFhNTFJlYWRlciBjcmVhdGVYTUxSZWFkZXIoU3RyaW5nIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7ICAgICAKLSAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAKLSAgICByZWFkZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoKTsgICAgIAotICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZS1wcmVmaXhlcyIsIHRydWUpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy9ub252YWxpZGF0aW5nL2xvYWQtZXh0ZXJuYWwtZHRkIiwgZmFsc2UpOyAvLyROT04tTkxTLTEkCi0gICAgcmVhZGVyLnNldENvbnRlbnRIYW5kbGVyKG5ldyBNeUNvbnRlbnRIYW5kbGVyKHVyaSkpOwotICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIobmV3IEludGVybmFsRXJyb3JIYW5kbGVyKCkpOyAKLQotICAgIExleGljYWxIYW5kbGVyIGxleGljYWxIYW5kbGVyID0gbmV3IExleGljYWxIYW5kbGVyKCkKLSAgICB7ICAgICAgCi0gICAgICBwdWJsaWMgdm9pZCBzdGFydERURCAoU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgewotICAgICAgICBpc0dyYW1tYXJFbmNvdW50ZXJlZCA9IHRydWU7ICAgCi0gICAgICAgIGlzRFRERW5jb3VudGVyZWQgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBlbmREVEQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0RW50aXR5KFN0cmluZyBuYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGVuZEVudGl0eShTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBzdGFydENEQVRBKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgICAgewotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCBlbmRDREFUQSgpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICAgIHsKLSAgICAgIH0KLSAKLSAgICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQgKGNoYXIgY2hbXSwgaW50IHN0YXJ0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgICB7Ci0gICAgICB9Ci0gICAgfTsKLSAgICByZWFkZXIuc2V0UHJvcGVydHkoImh0dHA6Ly94bWwub3JnL3NheC9wcm9wZXJ0aWVzL2xleGljYWwtaGFuZGxlciIsIGxleGljYWxIYW5kbGVyKTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIHJldHVybiByZWFkZXI7Ci0gIH0gIAotCi0gIC8qKgotICAgKiBBbiBlcnJvciBoYW5kbGVyIHRvIHN1cHByZXNzIGVycm9yIGFuZCB3YXJuaW5nIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBJbnRlcm5hbEVycm9ySGFuZGxlciBpbXBsZW1lbnRzIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcgotICB7Ci0JcHVibGljIEludGVybmFsRXJyb3JIYW5kbGVyKCkKLQl7Ci0JICBzdXBlcigpOwotCX0KLQkKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgd2FybmluZyhTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICB9Ci0KLSAKLSAgLyoqCi0gICAqIEZpZ3VyZXMgb3V0IHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgZm9yIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSB1cmkgb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlciBBIGhlbHBlciB0byByZXNvbHZlIGxvY2F0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbXB1dGVWYWxpZGF0aW9uSW5mb3JtYXRpb24oU3RyaW5nIHVyaSwgUmVhZGVyIGNoYXJhY3RlclN0cmVhbSwgVVJJUmVzb2x2ZXIgdXJpUmVzb2x2ZXIpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBYTUxSZWFkZXIgcmVhZGVyID0gY3JlYXRlWE1MUmVhZGVyKHVyaSk7ICAKLSAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICBpbnB1dFNvdXJjZS5zZXRDaGFyYWN0ZXJTdHJlYW0oY2hhcmFjdGVyU3RyZWFtKTsKLSAgICAgIHJlYWRlci5wYXJzZShpbnB1dFNvdXJjZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7ICAgICAKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKGUpOwotICAgIH0KLSAgfQotICAKLSAKLQotICAvKioKLSAgICogSGFuZGxlIHRoZSBjb250ZW50IHdoaWxlIHBhcnNpbmcgdGhlIGZpbGUuCi0gICAqLwotICBjbGFzcyBNeUNvbnRlbnRIYW5kbGVyIGV4dGVuZHMgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcgotICB7ICAgICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguRXJyb3JIYW5kbGVyI2Vycm9yKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIGJvb2xlYW4gaXNSb290RWxlbWVudCA9IHRydWU7Ci0gICAgU3RyaW5nIGJhc2VVUkk7Ci0gICAgCi0gICAgTXlDb250ZW50SGFuZGxlcihTdHJpbmcgdXJpKQotICAgIHsKLSAgICAgIHRoaXMuYmFzZVVSSSA9IHVyaTsgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBlKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgIH0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGUpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgfQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgU3RyaW5nIHByZWZpeCA9IG51bGw7Ci0gICAgICBpbnQgaW5kZXggPSBuYW1lLmluZGV4T2YoIjoiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgaWYgKGluZGV4ICE9IC0xKQotICAgICAgewotICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcHJlZml4OwotICAgIH0gICAgCi0gICAgICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5wcmVmaXhlZE5hbWUoU3RyaW5nIG5hbWUpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gbmFtZS5pbmRleE9mKCI6Iik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXhlZE5hbWUoU3RyaW5nIHByZWZpeCwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJlZml4ICE9IG51bGwgJiYgcHJlZml4Lmxlbmd0aCgpID4gMCA/IHByZWZpeCArICI6IiArIGxvY2FsTmFtZSA6IGxvY2FsTmFtZTsgICAgICAvLyROT04tTkxTLTEkCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyByYXdOYW1lLCBBdHRyaWJ1dGVzIGF0dHMpCi0gICAgeyAgICAgIAotICAgICAgLy9TdHJpbmcgZXhwbGljaXRMb2NhdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaXNSb290RWxlbWVudCkKLSAgICAgIHsgIAotICAgICAgICAKLSAgICAgICAgaXNSb290RWxlbWVudCA9IGZhbHNlOyAgCi0gICAgICAgIGludCBuQXR0cyA9IGF0dHMuZ2V0TGVuZ3RoKCk7ICAgIAotICAgICAgICBTdHJpbmcgc2NoZW1hSW5zdGFuY2VQcmVmaXggPSBudWxsOwotICAgICAgICBmb3IgKGludCBpID0wOyBpIDwgbkF0dHM7IGkrKykKLSAgICAgICAgeyAgICAgICAgICAgICAgCi0gICAgICAgICAgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRzLmdldFFOYW1lKGkpOyAgICAgICAKLSAgICAgICAgICBpZiAoYXR0cmlidXRlTmFtZS5lcXVhbHMoInhtbG5zIikgfHwgYXR0cmlidXRlTmFtZS5zdGFydHNXaXRoKCJ4bWxuczoiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpc05hbWVzcGFjZUVuY291bnRlcmVkID0gdHJ1ZTsgICAgCi0gICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBhdHRzLmdldFZhbHVlKGkpOyAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCgiaHR0cDovL3d3dy53My5vcmcvIikgJiYgdmFsdWUuZW5kc1dpdGgoIi9YTUxTY2hlbWEtaW5zdGFuY2UiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjaGVtYUluc3RhbmNlUHJlZml4ID0gYXR0cmlidXRlTmFtZS5lcXVhbHMoInhtbG5zIikgPyAiIiA6IGdldFVucHJlZml4ZWROYW1lKGF0dHJpYnV0ZU5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSBnZXRQcmVmaXgocmF3TmFtZSk7Ci0gICAgICAgIFN0cmluZyByb290RWxlbWVudE5hbWVzcGFjZURlY2xhcmF0aW9uTmFtZSA9IChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSA/ICJ4bWxuczoiICsgcHJlZml4IDogInhtbG5zIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIFN0cmluZyByb290RWxlbWVudE5hbWVzcGFjZSA9IHJvb3RFbGVtZW50TmFtZXNwYWNlRGVjbGFyYXRpb25OYW1lICE9IG51bGwgPyBhdHRzLmdldFZhbHVlKHJvb3RFbGVtZW50TmFtZXNwYWNlRGVjbGFyYXRpb25OYW1lKSA6IG51bGw7ICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICAvLyBmaXJzdCB3ZSB1c2UgYW55ICd4c2k6c2NoZW1hTG9jYXRpb24nIG9yICd4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbicgYXR0cmlidXRlCi0gICAgICAgIC8vIHRvIGRldGVybWluZSBhIGxvY2F0aW9uCi0gICAgICAgIGlmIChzY2hlbWFJbnN0YW5jZVByZWZpeCAhPSBudWxsKQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgbG9jYXRpb24gPSBhdHRzLmdldFZhbHVlKGdldFByZWZpeGVkTmFtZShzY2hlbWFJbnN0YW5jZVByZWZpeCwgIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iKSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICBpZiAobG9jYXRpb24gPT0gbnVsbCkKLSAgICAgICAgICB7ICAgICAgICAgICAgCi0gICAgICAgIAlTdHJpbmcgc2NoZW1hTG9jID0gYXR0cy5nZXRWYWx1ZShnZXRQcmVmaXhlZE5hbWUoc2NoZW1hSW5zdGFuY2VQcmVmaXgsICJzY2hlbWFMb2NhdGlvbiIpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGxvY2F0aW9uID0gZ2V0U2NoZW1hTG9jYXRpb25Gb3JOYW1lc3BhY2Uoc2NoZW1hTG9jLCByb290RWxlbWVudE5hbWVzcGFjZSk7Ci0gICAgICAgICAgfSAgCi0gICAgICAgIH0gIAotICAgICAgICBpZiAocm9vdEVsZW1lbnROYW1lc3BhY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHJvb3RFbGVtZW50TmFtZXNwYWNlID0gIiI7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGxvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKGJhc2VVUkksIHJvb3RFbGVtZW50TmFtZXNwYWNlLCBsb2NhdGlvbik7ICAgIAotICAgICAgICBsb2NhdGlvbiA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24oYmFzZVVSSSwgcm9vdEVsZW1lbnROYW1lc3BhY2UsIGxvY2F0aW9uKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIAotICAgICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBudWxsOwotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKGxvY2F0aW9uKTsKLSAgICAgICAgICAgIGlzID0gdXJsLm9wZW5TdHJlYW0oKTsKLSAgICAgICAgICAgIGlzR3JhbW1hckVuY291bnRlcmVkID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAJLy8gRG8gbm90aGluZy4KLSAgICAgICAgICB9Ci0gICAgICAgICAgZmluYWxseQotICAgICAgICAgIHsKLSAgICAgICAgCWlmKGlzICE9IG51bGwpCi0gICAgICAgIAl7Ci0gICAgICAgIAkgIHRyeQotICAgICAgICAJICB7Ci0gICAgICAgIAkgICAgaXMuY2xvc2UoKTsKLSAgICAgICAgCSAgfQotICAgICAgICAJICBjYXRjaChFeGNlcHRpb24gZSkKLSAgICAgICAgCSAgewotICAgICAgICAJCS8vIERvIG5vdGhpbmcuCi0gICAgICAgIAkgIH0KLSAgICAgICAgCX0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gICAgICAgIAotICAgICAgfQotICAgIH0gICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LmV4dC5EZWNsSGFuZGxlciNlbGVtZW50RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVsZW1lbnREZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgbW9kZWwpIAotICAgIHsKLSAgICAgIG51bURUREVsZW1lbnRzKys7Ci0gICAgfQotICAgIAotICAgIC8vIFRoZSB4c2lTY2hlbWFMb2NhdGlvblZhbHVlIGlzIGEgbGlzdCBvZiBuYW1lc3BhY2UvbG9jYXRpb24gcGFpcnMgdGhhdCBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgCi0gICAgLy8gdGhpcyBtZXRob2Qgd2Fsa3MgdGhlIGxpc3Qgb2YgcGFpcnMgbG9va2luZyBmb3IgdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UgYW5kIHJldHVybnMgdGhlIGFzc29jaWF0ZWQKLSAgICAvLyBsb2NhdGlvbi4KLSAgICAvLyAgIAotICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2NoZW1hTG9jYXRpb25Gb3JOYW1lc3BhY2UoU3RyaW5nIHhzaVNjaGVtYUxvY2F0aW9uVmFsdWUsIFN0cmluZyBuYW1lc3BhY2UpCi0gICAgeyAgICAgIAotICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoeHNpU2NoZW1hTG9jYXRpb25WYWx1ZSAhPSBudWxsICYmIG5hbWVzcGFjZSAhPSBudWxsKQotICAgICAgewotICAgICAgICAKLSAgICAgICAgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcih4c2lTY2hlbWFMb2NhdGlvblZhbHVlKTsKLSAgICAgICAgd2hpbGUoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYoc3QubmV4dFRva2VuKCkuZXF1YWxzKG5hbWVzcGFjZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWYoc3QuaGFzTW9yZVRva2VucygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICByZXN1bHQgPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmKHN0Lmhhc01vcmVUb2tlbnMoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgc3QubmV4dFRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gICAgICAgICAKLSAgfSAgIAotICAgICAgIAotICAKLSAgLyoqCi0gICAqIFJlcGxhY2UgYWxsIGluc3RhbmNlcyBpbiB0aGUgc3RyaW5nIG9mIHRoZSBvbGQgcGF0dGVybiB3aXRoIHRoZSBuZXcgcGF0dGVybi4KLSAgICogCi0gICAqIEBwYXJhbSBzdHJpbmcgVGhlIHN0cmluZyB0byByZXBsYWNlIHRoZSBwYXR0ZXJucyBpbi4KLSAgICogQHBhcmFtIG9sZFBhdHRlcm4gVGhlIG9sZCBwYXR0ZXJuIHRvIHJlcGxhY2UuCi0gICAqIEBwYXJhbSBuZXdQYXR0ZXJuIFRoZSBwYXR0ZXJuIHVzZWQgZm9yIHJlcGxhY2VtZW50LgotICAgKiBAcmV0dXJuIFRoZSBtb2RpZmllZCBzdHJpbmcgd2l0aCBhbGwgb2NjdXJyYW5jZXMgb2Ygb2xkUGF0dGVybiByZXBsYWNlZCBieSBuZXcgUGF0dGVybi4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIHN0cmluZywgU3RyaW5nIG9sZFBhdHRlcm4sIFN0cmluZyBuZXdQYXR0ZXJuKQotICB7ICAgICAKLSAgICBpbnQgaW5kZXggPSAwOwotICAgIHdoaWxlIChpbmRleCAhPSAtMSkKLSAgICB7Ci0gICAgICBpbmRleCA9IHN0cmluZy5pbmRleE9mKG9sZFBhdHRlcm4sIGluZGV4KTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyBuZXdQYXR0ZXJuICsgc3RyaW5nLnN1YnN0cmluZyhpbmRleCArIG9sZFBhdHRlcm4ubGVuZ3RoKCkpOwotICAgICAgICBpbmRleCA9IGluZGV4ICsgb2xkUGF0dGVybi5sZW5ndGgoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0cmluZzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTI3MDgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEFuIFhNTCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYWxsb3dzIHNldHRpbmcgc3BlY2lmaWMgY29uZmlndXJhdGlvbgotICogaW5mb3JtYXRpb24gZm9yIGEgV1RQIFhNTCB2YWxpZGF0aW9uIHJ1bi4gQW55IGZlYXR1cmVzIGFuZCBwcm9wZXJ0aWVzCi0gKiBzZXQgb24gdGhpcyBjb25maWd1cmF0aW9uIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCB0aG9zZSBmcm9tCi0gKiBwYXJzZXJzIHN1Y2ggYXMgWGVyY2VzLiAoVGhpcyBvYmplY3QgZG9lcyBub3QgYnkgZGVmYXVsdCB3cmFwIGZlYXR1cmVzCi0gKiBhbmQgcHJvcGVydGllcyBmcm9tIHNwZWNpZmljIHBhcnNlcnMuKQotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFdBUk5fTk9fR1JBTU1BUiA9ICJXQVJOX05PX0dSQU1NQVIiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgYm9vbGVhbiB3YXJuX25vX2dyYW1tYXJfdmFsdWUgPSBmYWxzZTsKLSAgCi0gIC8qKgotICAgKiBTZXQgYSBmZWF0dXJlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgdG8gc2V0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogCQlUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZmVhdHVyZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoV0FSTl9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIHdhcm5fbm9fZ3JhbW1hcl92YWx1ZSA9IHZhbHVlOwotCWVsc2UKLQkgIHRocm93IG5ldyBFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGZlYXR1cmUuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCBkZWZpbmVkCi0gICAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGZlYXR1cmUncyB2YWx1ZSwgdHJ1ZSBvciBmYWxzZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoV0FSTl9OT19HUkFNTUFSLmVxdWFscyhmZWF0dXJlKSkKLQkgIHJldHVybiB3YXJuX25vX2dyYW1tYXJfdmFsdWU7Ci0JCi0JdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTc5YmYzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25JbmZvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhNTExvY2F0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcjsKLQotCi0vKioKLSAqIEEgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiBvYmplY3Qgc3BlY2lmaWMgdG8gWE1MIHZhbGlkYXRvcnMuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uSW5mbyBleHRlbmRzIFZhbGlkYXRpb25JbmZvIGltcGxlbWVudHMgWE1MVmFsaWRhdGlvblJlcG9ydAotewotICBwcm90ZWN0ZWQgYm9vbGVhbiBncmFtbWFyRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gZHRkRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gbmFtZXNwYWNlRW5jb3VudGVyZWQgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGludCBlbGVtZW50RGVjbENvdW50ID0gMDsKLSAgcHJvdGVjdGVkIFN0cmluZyBjdXJyZW50RXJyb3JLZXk7Ci0gIHByb3RlY3RlZCBPYmplY3QgbWVzc2FnZUFyZ3VtZW50c1tdID0gbnVsbDsKLSAgcHJvdGVjdGVkIFhNTExvY2F0b3IgbG9jYXRvciA9IG51bGw7Ci0gIHByb3RlY3RlZCBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyIGVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIgPSBudWxsOwotICAKLSAgLyoqCi0gICAqIEEgc3RhY2sgb2Ygc3RhcnQgdGFnIGxvY2F0aW9ucywgdXNlZCB0byBtb3ZlIGVycm9ycwotICAgKiByZXBvcnRlZCBhdCB0aGUgY2xvc2UgdGFnIHRvIGJlIHJlcG9ydGVkIGF0IHRoZSBzdGFydCB0YWcuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RhY2sgc3RhcnRFbGVtZW50TG9jYXRpb25zID0gbmV3IFN0YWNrKCk7Ci0gIAotICAvKioKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhpcyByZXBvcnQgZGVzY3JpYmVzLgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25JbmZvKFN0cmluZyB1cmkpCi0gIHsKLSAgICBzdXBlcih1cmkpOwotICB9Ci0gIAotICBwdWJsaWMgYm9vbGVhbiBpc0dyYW1tYXJFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gZ3JhbW1hckVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHdoZXRoZXIgYSBncmFtbWFyIGhhcyBiZWVuIGVuY291bnRlcmVkIG9yIG5vdC4KLSAgICogCi0gICAqIEBwYXJhbSBncmFtbWFyRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBncmFtbWFyIGhhcyBiZWVuIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRHcmFtbWFyRW5jb3VudGVyZWQoYm9vbGVhbiBncmFtbWFyRW5jb3VudGVyZWQpCi0gIHsKLSAgICB0aGlzLmdyYW1tYXJFbmNvdW50ZXJlZCA9IGdyYW1tYXJFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQoKQotICB7Ci0gICAgcmV0dXJuIGR0ZEVuY291bnRlcmVkICYmIGVsZW1lbnREZWNsQ291bnQgPT0gMDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB3aGV0aGVyIGEgRFREIHdpdGhvdXQgYW4gZWxlbWVudCBkZWNsYXJhdGlvbiB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gZHRkV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkIFNldCB0cnVlIGlmIGEgRFREIHdpdGhvdXQgYW4KLSAgICogICAgICAgICBlbGVtZW50IGRlY2xhcmF0aW9uIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RFRERW5jb3VudGVyZWQoYm9vbGVhbiBkdGRFbmNvdW50ZXJlZCkKLSAgewotICAgIHRoaXMuZHRkRW5jb3VudGVyZWQgPSBkdGRFbmNvdW50ZXJlZDsKLSAgfQotICAKLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpCi0gIHsKLSAgICByZXR1cm4gbmFtZXNwYWNlRW5jb3VudGVyZWQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgd2hldGhlciBhIG5hbWVzcGFjZSB3YXMgZW5jb3VudGVyZWQuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlRW5jb3VudGVyZWQgU2V0IHRydWUgaWYgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VFbmNvdW50ZXJlZChib29sZWFuIG5hbWVzcGFjZUVuY291bnRlcmVkKQotICB7Ci0gICAgdGhpcy5uYW1lc3BhY2VFbmNvdW50ZXJlZCA9IG5hbWVzcGFjZUVuY291bnRlcmVkOwotICB9Ci0gIAotICAvKioKLSAgICogSW5jcmVhc2UgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gY291bnQgZm9yIERURCBlbGVtZW50cyBieSBvbmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbmNyZWFzZUVsZW1lbnREZWNsYXJhdGlvbkNvdW50KCkKLSAgewotICAgIHRoaXMuZWxlbWVudERlY2xDb3VudCsrOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBudW1iZXIgb2YgRFREIGVsZW1lbnRzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHBhcmFtIGNvdW50IFRoZSBudW1iZXIgb2YgRFREIGVsZW1lbnRzIGVuY291bnRlcmVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RWxlbWVudERlY2xhcmF0aW9uQ291bnQoaW50IGNvdW50KQotICB7Ci0gIAllbGVtZW50RGVjbENvdW50ID0gY291bnQ7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIFhNTCBsb2NhdG9yIGlmIG9uZSBoYXMgYmVlbiBzcGVjaWZpZWQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBYTUwgbG9jYXRvciBpZiBvbmUgaGFzIGJlZW4gc3BlY2lmaWVkIG9yIG51bGwuCi0gICAqLwotICBwdWJsaWMgWE1MTG9jYXRvciBnZXRYTUxMb2NhdG9yKCkKLSAgewotICAgIHJldHVybiBsb2NhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogU2V0IHRoZSBYTUxMb2NhdG9yLgotICAgKiAKLSAgICogQHBhcmFtIGxvY2F0b3IgVGhlIFhNTExvY2F0b3IgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0WE1MTG9jYXRvcihYTUxMb2NhdG9yIGxvY2F0b3IpCi0gIHsKLSAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IGVycm9yIGtleS4KLSAgICogCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgY3VycmVudEVycm9yS2V5LgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50RXJyb3JLZXkoKQotICB7Ci0gICAgcmV0dXJuIGN1cnJlbnRFcnJvcktleTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCB0aGUgY3VycmVudCBlcnJvciBrZXkuCi0gICAqIAotICAgKiBAcGFyYW0gY3VycmVudEVycm9yS2V5IFRoZSBjdXJyZW50RXJyb3JLZXkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q3VycmVudEVycm9yS2V5KFN0cmluZyBjdXJyZW50RXJyb3JLZXkpCi0gIHsKLSAgICB0aGlzLmN1cnJlbnRFcnJvcktleSA9IGN1cnJlbnRFcnJvcktleTsKLSAgfQotCi1wdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpIHsKLQlyZXR1cm4gbWVzc2FnZUFyZ3VtZW50czsKLX0KLQotCi1wdWJsaWMgdm9pZCBzZXRNZXNzYWdlQXJndW1lbnRzKE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpIHsKLQl0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHN0YXJ0IGVsZW1lbnRzIGxvY2F0aW9ucy4KLSAgICogCi0gICAqIEByZXR1cm4gCi0gICAqIAkJQSBzdGFjayBjb250YWluaW5nIHRoZSBzdGFydCBlbGVtZW50IGxvY2F0aW9ucy4KLSAgICovCi0gIHByb3RlY3RlZCBTdGFjayBnZXRTdGFydEVsZW1lbnRMb2NhdGlvbnMoKQotICB7Ci0gICAgcmV0dXJuIHN0YXJ0RWxlbWVudExvY2F0aW9uczsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgZXJyb3IgY3VzdG9taXphdGlvbiBtYW5hZ2VyIGZvciB0aGlzIHZhbGlkYXRpb24gcnVuLgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJVGhlIGVycm9yIGN1c3RvbWl6YXRpb24gbWFuYWdlciBmb3IgdGhpcyB2YWxpZGF0aW9uIHJ1bi4KLSAgICovCi0gIHByb3RlY3RlZCBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyIGdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKQotICB7Ci0JICBpZihlcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyID09IG51bGwpCi0JICB7Ci0JCSAgZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlciA9IG5ldyBFcnJvckN1c3RvbWl6YXRpb25NYW5hZ2VyKCk7Ci0JICB9Ci0JICByZXR1cm4gZXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcjsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0aW9uTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDAyMmZlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25NZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBWYWxpZGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uTWVzc2FnZXMgZXh0ZW5kcyBOTFMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi54bWx2YWxpZGF0aW9uIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUFJPQkxFTVNfVkFMSURBVElOR19VTktOT1dOX0hPU1Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfRklMRV9OT1RfRk9VTkQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfV0FSTl9OT19HUkFNTUFSOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTFZhbGlkYXRpb25NZXNzYWdlcy5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBYTUxWYWxpZGF0aW9uTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblJlcG9ydC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblJlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjk0ZDljLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgcmVwcmVzZW50aW9uIGEgdmFsaWRhdGlvbiByZXBvcnQgZm9yIFhNTCB2YWxpZGF0aW9uLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MVmFsaWRhdGlvblJlcG9ydCBleHRlbmRzIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBncmFtbWFyIHdhcyBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgYSBncmFtbWFyIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNHcmFtbWFyRW5jb3VudGVyZWQoKTsKLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuYW1lc3BhY2Ugd2FzIGVuY291bnRlcmVkLgotICAgKiAKLSAgICogQHJldHVybiBUcnVlIGlmIGEgbmFtZXNwYWNlIHdhcyBlbmNvdW50ZXJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCgpOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciBhIERURCB3aXRob3V0IGVsZW1lbnQgZGVjbGFyYXRpb25zIHdhcyBlbmNvdW50ZXJlZC4KLSAgICogCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiBhIERURCB3aXRob3V0IGVsZW1lbnQgZGVjbGFyYXRpb25zIHdhcyBlbmNvdW50ZXJlZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzRFREV2l0aG91dEVsZW1lbnREZWNsYXJhdGlvbkVuY291bnRlcmVkKCk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YTUxWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmNkMmZkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVW5rbm93bkhvc3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5pbXBsLlhNTEVycm9yUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxBdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxMb2NhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLlhOSUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTGF6eVVSTElucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZy5Mb2dnZXJGYWN0b3J5OwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5EZWZhdWx0SGFuZGxlcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHBlcmZvcm1zIHZhbGlkYXRpb24gdXNpbmcgYSB4ZXJjZXMgc2F4IHBhcnNlci4gIAotICogSGVyZSdzIGEgcXVpY2sgb3ZlcnZpZXcgb2YgdGhlIGRldGFpbHMgOiAKLSAqICAgLSBhbiBFcnJvckhhbmRsZXIgaXMgdXNlZCB0byBjb2xsZWN0IGVycm9ycyBpbnRvIGEgbGlzdCAoc28gdGhleSBtYXkgYmUgZGlzcGxheWVkIGJ5IHRoZSBVSSkKLSAqICAgLSBhbiBFbnRpdHlSZXNvbHZlciBpcyB1c2VkIGFsb25nIHdpdGggdGhlIHhlcmNlcyAiZXh0ZXJuYWwtc2NoZW1hTG9jYXRpb24iIHByb3BlcnR5IHRvIGltcGxlbWVudCBYTUwgQ2F0YWxvZyBzdXBwb3J0Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaVJlc29sdmVyID0gbnVsbDsKLSAgcHJvdGVjdGVkIEhhc2h0YWJsZSBpbmdvcmVkRXJyb3JLZXlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLSAgcHJvdGVjdGVkIFNldCBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0ID0gbmV3IFRyZWVTZXQoKTsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBJR05PUkVfQUxXQVlTID0gIklHTk9SRV9BTFdBWVMiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wgPSAiSUdOT1JFX0lGX0RURF9XSVRIT1VUX0VMRU1FTlRfREVDTCI7IC8vJE5PTi1OTFMtMSQKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFTUFUVVJFX0VPRiA9ICJQcmVtYXR1cmVFT0YiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfRUxFTUVOVF9UWVBFX01VU1RfTUFUQ0hfRE9DVFlQRURFQ0wgPSAiUm9vdEVsZW1lbnRUeXBlTXVzdE1hdGNoRG9jdHlwZWRlY2wiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE1TR19FTEVNRU5UX05PVF9ERUNMQVJFRCA9ICJNU0dfRUxFTUVOVF9OT1RfREVDTEFSRUQiOyAvLyROT04tTkxTLTEkCi0gIAotICAvLyBXVFAgWE1MIHZhbGlkYXRvciBzcGVjaWZpYyBrZXkuCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIE5PX0dSQU1NQVJfRk9VTkQgPSAiTk9fR1JBTU1BUl9GT1VORCI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX05PVF9GT1VORF9LRVkgPSAiRklMRV9OT1RfRk9VTkQiOyAvLyROT04tTkxTLTEkCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRvcigpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIC8vIEhlcmUgd2UgYWRkIHNvbWUgZXJyb3Iga2V5cyB0aGF0IHdlIG5lZWQgdG8gZmlsdGVyIG91dCB3aGVuIHdlJ3JlIHZhbGlkYXRpb24gCi0gICAgLy8gYWdhaW5zdCBhIERURCB3aXRob3V0IGFueSBlbGVtZW50IGRlY2xhcmF0aW9ucy4gICAgICAgCi0gICAgaW5nb3JlZEVycm9yS2V5VGFibGUucHV0KFBSRU1BVFVSRV9FT0YsIElHTk9SRV9BTFdBWVMpOwotICAgIGluZ29yZWRFcnJvcktleVRhYmxlLnB1dChST09UX0VMRU1FTlRfVFlQRV9NVVNUX01BVENIX0RPQ1RZUEVERUNMLCBJR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMKTsKLSAgICBpbmdvcmVkRXJyb3JLZXlUYWJsZS5wdXQoTVNHX0VMRU1FTlRfTk9UX0RFQ0xBUkVELCBJR05PUkVfSUZfRFREX1dJVEhPVVRfRUxFTUVOVF9ERUNMKTsKLSAgICAKLSAgICAvLyBIZXJlIHdlIGFkZCBzb21lIGVycm9yIGtleXMgdGhhdCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yLgotICAgIC8vIFRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3aWxsIGJlIGFkanVzdGVkIHRvIHBsYWNlIHRoZSBtZXNzYWdlIG9uIHRoZSBsaW5lIG9mIHRoZSBzdGFydGluZwotICAgIC8vIGVsZW1lbnQgaW5zdGVhZCBvZiBvbiB0aGUgbGluZSBvZiB0aGUgY2xvc2luZyBlbGVtZW50LgotICAgIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuYWRkKCJNU0dfQ09OVEVOVF9JTlZBTElEIik7Ci0gICAgYWRqdXN0TG9jYXRpb25FcnJvcktleVNldC5hZGQoIk1TR19DT05URU5UX0lOQ09NUExFVEUiKTsKLSAgICBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmFkZCgiY3ZjLWNvbXBsZXgtdHlwZS4yLjQuYiIpOwotICAgIGFkanVzdExvY2F0aW9uRXJyb3JLZXlTZXQuYWRkKCJjdmMtY29tcGxleC10eXBlLjIuMyIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCB0aGUgVVJJIFJlc29sdmVyIHRvIHVzZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlSZXNvbHZlciBUaGUgVVJJIFJlc29sdmVyIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaVJlc29sdmVyKQotICB7Ci0gICAgdGhpcy51cmlSZXNvbHZlciA9IHVyaVJlc29sdmVyOwotICAgIC8vZW50aXR5UmVzb2x2ZXIgPSBuZXcgTXlFbnRpdHlSZXNvbHZlcih1cmlSZXNvbHZlcik7Ci0gIH0KLQotIAotICAvKioKLSAgICogQ3JlYXRlIGFuIFhNTCBSZWFkZXIuCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIFhNTCByZWFkZXIgb3IgbnVsbCBpZiB1bnN1Y2Nlc3NmdWwuCi0gICAqIEB0aHJvd3MgRXhjZXB0aW9uCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MUmVhZGVyIGNyZWF0ZVhNTFJlYWRlcihmaW5hbCBYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvLCBYTUxFbnRpdHlSZXNvbHZlciBlbnRpdHlSZXNvbHZlcikgdGhyb3dzIEV4Y2VwdGlvbgotICB7ICAgICAKLSAgICBYTUxSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAvLyBtb3ZlIHRvIFhlcmNlcy0yLi4uIGFkZCB0aGUgY29udGV4dENsYXNzTG9hZGVyIHN0dWZmCi0gICAgQ2xhc3NMb2FkZXIgcHJldkNsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOwotICAgICAgU3RhbmRhcmRQYXJzZXJDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgTXlTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24odmFsaW5mbyk7Ci0gICAgICByZWFkZXIgPSBuZXcgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5TQVhQYXJzZXIoY29uZmlndXJhdGlvbikKLSAgICAgIHsKLSAgICAJcHJpdmF0ZSBYTUxMb2NhdG9yIGxvY2F0b3IgPSBudWxsOwotICAgIAkKLSAgICAgICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuQWJzdHJhY3RTQVhQYXJzZXIjc3RhcnREb2N1bWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvciwgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLk5hbWVzcGFjZUNvbnRleHQsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnREb2N1bWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MTG9jYXRvciB0aGVMb2NhdG9yLCBqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nLCBOYW1lc3BhY2VDb250ZXh0IG5zY29udGV4dCwgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMgYXVncykgCi0gICAgICAgIHsKLSAgICAgICAgICBsb2NhdG9yID0gdGhlTG9jYXRvcjsKLSAgICAgICAgICB2YWxpbmZvLnNldFhNTExvY2F0b3IodGhlTG9jYXRvcik7Ci0gICAgICAgICAgc3VwZXIuc3RhcnREb2N1bWVudCh0aGVMb2NhdG9yLCBlbmNvZGluZywgbnNjb250ZXh0LCBhdWdzKTsgCi0gICAgICAgIH0KLQotICAgICAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMucGFyc2Vycy5BYnN0cmFjdFNBWFBhcnNlciNzdGFydEVsZW1lbnQob3JnLmFwYWNoZS54ZXJjZXMueG5pLlFOYW1lLCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MQXR0cmlidXRlcywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLkF1Z21lbnRhdGlvbnMpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoUU5hbWUgYXJnMCwgWE1MQXR0cmlidXRlcyBhcmcxLCBBdWdtZW50YXRpb25zIGFyZzIpIHRocm93cyBYTklFeGNlcHRpb24gCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnB1c2gobmV3IExvY2F0aW9uQ29vcmRpbmF0ZShsb2NhdG9yLmdldExpbmVOdW1iZXIoKSwgbG9jYXRvci5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCQkgIHN1cGVyLnN0YXJ0RWxlbWVudChhcmcwLCBhcmcxLCBhcmcyKTsKLQkJfQotICAgICAgICAKLQkJLyogKG5vbi1KYXZhZG9jKQotCQkgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuQWJzdHJhY3RTQVhQYXJzZXIjZW5kRWxlbWVudChvcmcuYXBhY2hlLnhlcmNlcy54bmkuUU5hbWUsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5BdWdtZW50YXRpb25zKQotCQkgKi8KLQkJcHVibGljIHZvaWQgZW5kRWxlbWVudChRTmFtZSBhcmcwLCBBdWdtZW50YXRpb25zIGFyZzEpIHRocm93cyBYTklFeGNlcHRpb24gewotCQkJc3VwZXIuZW5kRWxlbWVudChhcmcwLCBhcmcxKTsKLQkJCXZhbGluZm8uZ2V0U3RhcnRFbGVtZW50TG9jYXRpb25zKCkucG9wKCk7Ci0JCX0KLSAgICAgIH07Ci0KLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvY29udGludWUtYWZ0ZXItZmF0YWwtZXJyb3IiLCBmYWxzZSk7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlLXByZWZpeGVzIiwgdmFsaW5mby5pc05hbWVzcGFjZUVuY291bnRlcmVkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0RmVhdHVyZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLCB2YWxpbmZvLmlzTmFtZXNwYWNlRW5jb3VudGVyZWQoKSk7ICAgICAgICAgICAgICAgLy8kTk9OLU5MUy0xJAotICAgICAgcmVhZGVyLnNldEZlYXR1cmUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgdmFsaW5mby5pc0dyYW1tYXJFbmNvdW50ZXJlZCgpKTsgIC8vJE5PTi1OTFMtMSQKLSAgICAgIHJlYWRlci5zZXRGZWF0dXJlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLCB2YWxpbmZvLmlzR3JhbW1hckVuY291bnRlcmVkKCkpOyAvLyROT04tTkxTLTEkCi0gICAgICByZWFkZXIuc2V0Q29udGVudEhhbmRsZXIobmV3IERlZmF1bHRIYW5kbGVyKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBxTmFtZSwgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICB2YWxpbmZvLmdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKS5zdGFydEVsZW1lbnQodXJpLCBsb2NhbE5hbWUpOyAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLSAgICAgICAgICB2YWxpbmZvLmdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKS5lbmRFbGVtZW50KHVyaSwgbG9jYWxOYW1lKTsKLSAgICAgICAgfQotICAgICAgfSk7ICAgICAgCi0gICAgICAKLSAgICAgIC8vIE1IIG1ha2Ugc3VyZSB2YWxpZGF0aW9uIHdvcmtzIGV2ZW4gd2hlbiBhIGN1c3RvbWVyIGVudGl0eVJlc29sdmVyIGlzIG5vdGUgc2V0IChpLmUuIHZpYSBzZXRVUklSZXNvbHZlcigpKQotICAgICAgaWYgKGVudGl0eVJlc29sdmVyICE9IG51bGwpCi0gICAgICB7ICAKLSAgICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8vYXBhY2hlLm9yZy94bWwvcHJvcGVydGllcy9pbnRlcm5hbC9lbnRpdHktcmVzb2x2ZXIiLCBlbnRpdHlSZXNvbHZlcik7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0gIAotICAgICAgcmVhZGVyLnNldFByb3BlcnR5KCJodHRwOi8veG1sLm9yZy9zYXgvcHJvcGVydGllcy9kZWNsYXJhdGlvbi1oYW5kbGVyIiwgbmV3IE15RGVjbEhhbmRsZXIoKSk7ICAgICAgLy8kTk9OLU5MUy0xJAotICAgIH0gCi0gICAgY2F0Y2goRXhjZXB0aW9uIGUpCi0gICAgeyAKLSAgICAgIC8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2U7Ci0gICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihwcmV2Q2xhc3NMb2FkZXIpOwotICAgIH0KLSAgICByZXR1cm4gcmVhZGVyOwotICB9ICAKLQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGZpbGUgbG9jYXRlZCBhdCB0aGUgZ2l2ZW4gVVJJLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcmV0dXJuIFJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB2YWxpZGF0ZSh1cmksIG51bGwsIG5ldyBYTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpKTsgIAotICB9Ci0KLSAgZmluYWwgU3RyaW5nIGNyZWF0ZVN0cmluZ0ZvcklucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKQotICB7Ci0gICAgLy8gSGVyZSB3ZSBhcmUgcmVhZGluZyB0aGUgZmlsZSBhbmQgc3RvcmluZyB0byBhIHN0cmluZ2J1ZmZlci4KLSAgICBTdHJpbmdCdWZmZXIgZmlsZVN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJbnB1dFN0cmVhbVJlYWRlciBpbnB1dFJlYWRlciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgIlVURi04Iik7Ci0gICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoaW5wdXRSZWFkZXIpOwotICAgICAgY2hhcltdIGNoYXJzID0gbmV3IGNoYXJbMTAyNF07Ci0gICAgICBpbnQgbnVtYmVyUmVhZCA9IHJlYWRlci5yZWFkKGNoYXJzKTsKLSAgICAgIHdoaWxlIChudW1iZXJSZWFkICE9IC0xKQotICAgICAgewotICAgICAgICBmaWxlU3RyaW5nLmFwcGVuZChjaGFycywgMCwgbnVtYmVyUmVhZCk7Ci0gICAgICAgIG51bWJlclJlYWQgPSByZWFkZXIucmVhZChjaGFycyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvL1RPRE86IGxvZyBlcnJvciBtZXNzYWdlCi0gICAgICAvL2UucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICAgIHJldHVybiBmaWxlU3RyaW5nLnRvU3RyaW5nKCk7Ci0gIH0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiAKLSAgICogQHBhcmFtIHVyaSBUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gdGhlIGlucHV0U3RyZWFtIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlCi0gICAqIEByZXR1cm4gUmV0dXJucyBhbiBYTUwgdmFsaWRhdGlvbiByZXBvcnQuCi0gICAqLwotICBwdWJsaWMgWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotCXJldHVybiB2YWxpZGF0ZSh1cmksIGlucHV0U3RyZWFtLCBuZXcgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKSk7Ci0gIH0KLSAgLyoqCi0gICAqIFZhbGlkYXRlIHRoZSBpbnB1dFN0cmVhbQotICAgKiAKLSAgICogQHBhcmFtIHVyaSAKLSAgICogCQlUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0KLSAgICogCQlUaGUgaW5wdXRTdHJlYW0gb2YgdGhlIGZpbGUgdG8gdmFsaWRhdGUKLSAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KLSAgICogCQlBIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdmFsaWRhdGlvbiBzZXNzaW9uLgotICAgKiBAcmV0dXJuIAotICAgKiAJCVJldHVybnMgYW4gWE1MIHZhbGlkYXRpb24gcmVwb3J0LgotICAgKi8KLSAgcHVibGljIFhNTFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gIHsKLSAgICBSZWFkZXIgcmVhZGVyMSA9IG51bGw7IC8vIFVzZWQgZm9yIHRoZSBwcmVwYXJzZS4KLSAgICBSZWFkZXIgcmVhZGVyMiA9IG51bGw7IC8vIFVzZWQgZm9yIHZhbGlkYXRpb24gcGFyc2UuCi0gICAgCi0gICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpCi0gICAgeyAgCi0gICAgICBTdHJpbmcgc3RyaW5nID0gY3JlYXRlU3RyaW5nRm9ySW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOwotICAgICAgcmVhZGVyMSA9IG5ldyBTdHJpbmdSZWFkZXIoc3RyaW5nKTsKLSAgICAgIHJlYWRlcjIgPSBuZXcgU3RyaW5nUmVhZGVyKHN0cmluZyk7Ci0gICAgfSAKLSAgICAgICAgCi0gICAgWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbyA9IG5ldyBYTUxWYWxpZGF0aW9uSW5mbyh1cmkpOwotICAgIE15RW50aXR5UmVzb2x2ZXIgZW50aXR5UmVzb2x2ZXIgPSBuZXcgTXlFbnRpdHlSZXNvbHZlcih1cmlSZXNvbHZlcik7IAotICAgIFZhbGlkYXRvckhlbHBlciBoZWxwZXIgPSBuZXcgVmFsaWRhdG9ySGVscGVyKCk7IAotICAgIHRyeQotICAgIHsgIAotICAgICAgICBoZWxwZXIuY29tcHV0ZVZhbGlkYXRpb25JbmZvcm1hdGlvbih1cmksIHJlYWRlcjEsIHVyaVJlc29sdmVyKTsKLSAgICAgICAgdmFsaW5mby5zZXREVERFbmNvdW50ZXJlZChoZWxwZXIuaXNEVERFbmNvdW50ZXJlZCk7Ci0gICAgICAgIHZhbGluZm8uc2V0RWxlbWVudERlY2xhcmF0aW9uQ291bnQoaGVscGVyLm51bURUREVsZW1lbnRzKTsKLSAgICAgICAgdmFsaW5mby5zZXROYW1lc3BhY2VFbmNvdW50ZXJlZChoZWxwZXIuaXNOYW1lc3BhY2VFbmNvdW50ZXJlZCk7Ci0gICAgICAgIHZhbGluZm8uc2V0R3JhbW1hckVuY291bnRlcmVkKGhlbHBlci5pc0dyYW1tYXJFbmNvdW50ZXJlZCk7Ci0gICAgICAgIAotICAgICAgICBYTUxSZWFkZXIgcmVhZGVyID0gY3JlYXRlWE1MUmVhZGVyKHZhbGluZm8sIGVudGl0eVJlc29sdmVyKTsKLSAgICAgICAgWE1MRXJyb3JIYW5kbGVyIGVycm9yaGFuZGxlciA9IG5ldyBYTUxFcnJvckhhbmRsZXIodmFsaW5mbyk7Ci0gICAgICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIoZXJyb3JoYW5kbGVyKTsKLSAgICAgICAgCi0gICAgICAgIElucHV0U291cmNlIGlucHV0U291cmNlID0gbmV3IElucHV0U291cmNlKHVyaSk7Ci0gICAgICAgIGlucHV0U291cmNlLnNldENoYXJhY3RlclN0cmVhbShyZWFkZXIyKTsKLSAgICAgICAgcmVhZGVyLnBhcnNlKGlucHV0U291cmNlKTsgICAKLSAgICAgICAgaWYoY29uZmlndXJhdGlvbi5nZXRGZWF0dXJlKFhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uLldBUk5fTk9fR1JBTU1BUikgJiYgCi0gICAgICAgIAkJdmFsaW5mby5pc1ZhbGlkKCkgJiYgIWhlbHBlci5pc0dyYW1tYXJFbmNvdW50ZXJlZCkKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1dBUk5fTk9fR1JBTU1BUiwgMSwgMCwgdXJpLCBOT19HUkFNTUFSX0ZPVU5ELCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoU0FYUGFyc2VFeGNlcHRpb24gc2F4UGFyc2VFeGNlcHRpb24pCi0gICAgewotICAgICAgLy8gVGhlc2UgZXJyb3JzIGFyZSBjYXVnaHQgYnkgdGhlIGVycm9yIGhhbmRsZXIuCi0gICAgICAvL2FkZFZhbGlkYXRpb25NZXNzYWdlKHZhbGluZm8sIHNheFBhcnNlRXhjZXB0aW9uKTsKLSAgICB9ICAgICAgICAgICAgICAgICAKLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gaW9FeGNlcHRpb24pCi0gICAgewotICAgICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UodmFsaW5mbywgaW9FeGNlcHRpb24pOwotICAgIH0gICAgICAgICAgICAgICAgIAotICAgIGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKQotICAgIHsgIAotICAgIAlMb2dnZXJGYWN0b3J5LmdldExvZ2dlckluc3RhbmNlKCkubG9nRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLSAgICB9Ci0gICAgIAotICAgIAotICAgIHJldHVybiB2YWxpbmZvOwotICAgICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhIHZhbGlkYXRpb24gbWVzc2FnZSB0byB0aGUgc3BlY2lmaWVkIGxpc3QuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgdmFsaWRhdGlvbiBpbmZvIG9iamVjdCB0byBhZGQgdGhlIGVycm9yIHRvLgotICAgKiBAcGFyYW0gZXhjZXB0aW9uIFRoZSBleGNlcHRpb24gdGhhdCBjb250YWlucyB0aGUgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbi4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGFkZFZhbGlkYXRpb25NZXNzYWdlKFhNTFZhbGlkYXRpb25JbmZvIHZhbGluZm8sIElPRXhjZXB0aW9uIGV4Y2VwdGlvbikKLSAgeyAKLSAgICBTdHJpbmcgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBleGNlcHRpb24uZ2V0TWVzc2FnZSgpOwotCVRocm93YWJsZSBjYXVzZSA9IGV4Y2VwdGlvbi5nZXRDYXVzZSgpICE9IG51bGwgPyBleGNlcHRpb24uZ2V0Q2F1c2UoKSA6IGV4Y2VwdGlvbjsKLQl3aGlsZSh2YWxpZGF0aW9uTWVzc2FnZVN0ciA9PSBudWxsICYmIGNhdXNlICE9IG51bGwpewotCQlTdHJpbmcgbG9jYWxpemVkTWVzc2FnZSA9IGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQkgICAgY2F1c2UgPSBjYXVzZS5nZXRDYXVzZSgpOwotCSAgICBpZihjYXVzZSA9PSBudWxsICYmIGxvY2FsaXplZE1lc3NhZ2UgIT0gbnVsbCApCi0JICAgIHsKLQkgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IGxvY2FsaXplZE1lc3NhZ2U7Ci0JICAgIH0KLQl9Ci0JCi0JaWYgKHZhbGlkYXRpb25NZXNzYWdlU3RyICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRmlsZU5vdEZvdW5kRXhjZXB0aW9uKQotICAgICAgewotICAgICAgICB2YWxpZGF0aW9uTWVzc2FnZVN0ciA9IE5MUy5iaW5kKFhNTFZhbGlkYXRpb25NZXNzYWdlcy5fVUlfUFJPQkxFTVNfVkFMSURBVElOR19GSUxFX05PVF9GT1VORCwgbmV3IE9iamVjdCBbXSB7IHZhbGlkYXRpb25NZXNzYWdlU3RyIH0pOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBVbmtub3duSG9zdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBOTFMuYmluZChYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX1ZBTElEQVRJTkdfVU5LTk9XTl9IT1NULCBuZXcgT2JqZWN0IFtdIHsgdmFsaWRhdGlvbk1lc3NhZ2VTdHIgfSk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmKGNhdXNlIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbikKLSAgICAgIHsKLSAgICAJdmFsaWRhdGlvbk1lc3NhZ2VTdHIgPSBYTUxWYWxpZGF0aW9uTWVzc2FnZXMuX1VJX1BST0JMRU1TX0NPTk5FQ1RJT05fUkVGVVNFRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodmFsaWRhdGlvbk1lc3NhZ2VTdHIgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYTUxMb2NhdG9yIGxvY2F0b3IgPSB2YWxpbmZvLmdldFhNTExvY2F0b3IoKTsKLSAgICAgIHZhbGluZm8uYWRkV2FybmluZyh2YWxpZGF0aW9uTWVzc2FnZVN0ciwgbG9jYXRvciAhPSBudWxsID8gbG9jYXRvci5nZXRMaW5lTnVtYmVyKCkgOiAxLCBsb2NhdG9yICE9IG51bGwgPyBsb2NhdG9yLmdldENvbHVtbk51bWJlcigpIDogMCwgdmFsaW5mby5nZXRGaWxlVVJJKCksIEZJTEVfTk9UX0ZPVU5EX0tFWSwgbnVsbCk7Ci0gICAgfQotICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAvKioKLSAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgbGlzdC4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpbmZvIFRoZSB2YWxpZGF0aW9uIGluZm8gb2JqZWN0IHRvIGFkZCB0aGUgZXJyb3IgdG8uCi0gICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSB2YWxpZGF0aW9uIGluZm9ybWF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbywgU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKQotICB7IAotICAgIGlmIChleGNlcHRpb24uZ2V0TWVzc2FnZSgpICE9IG51bGwpCi0gICAgeyAKLSAgICAgIHZhbGluZm8uYWRkRXJyb3IoZXhjZXB0aW9uLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZXhjZXB0aW9uLmdldExpbmVOdW1iZXIoKSwgZXhjZXB0aW9uLmdldENvbHVtbk51bWJlcigpLCBleGNlcHRpb24uZ2V0U3lzdGVtSWQoKSk7Ci0gICAgfQotICB9Ci0KLSAgCi0gIC8qKgotICAgKiBBIGN1c3RvbSBlbnRpdHkgcmVzb2x2ZXIgdGhhdCB1c2VzIHRoZSBVUkkgcmVzb2x2ZXIgc3BlY2lmaWVkIHRvIHJlc29sdmUgZW50aXRpZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyIAotICB7Ci0gICAgcHJpdmF0ZSBVUklSZXNvbHZlciB1cmlSZXNvbHZlcjsKLSAgICAKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdXJpUmVzb2x2ZXIgVGhlIFVSSSByZXNvbHZlciB0byB1c2Ugd2l0aCB0aGlzIGVudGl0eSByZXNvbHZlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlFbnRpdHlSZXNvbHZlcihVUklSZXNvbHZlciB1cmlSZXNvbHZlcikKLSAgICB7Ci0gICAgICB0aGlzLnVyaVJlc29sdmVyID0gdXJpUmVzb2x2ZXI7Ci0gICAgfQotICAgIAotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRW50aXR5UmVzb2x2ZXIjcmVzb2x2ZUVudGl0eShvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyKQotICAgICAqLwotICAgIHB1YmxpYyBYTUxJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFhNTFJlc291cmNlSWRlbnRpZmllciByaWQpIHRocm93cyBYTklFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHJldHVybiBfaW50ZXJuYWxSZXNvbHZlRW50aXR5KHVyaVJlc29sdmVyLCByaWQpOwotICAgICAgfQotICAgICAgY2F0Y2goSU9FeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9lLnByaW50U3RhY2tUcmFjZSgpOyAgIAotICAgICAgfSAgICAgIAotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICB9Ci0gIAotICAvLyBjcyA6IEkndmUgcmVmYWN0b3JlZCB0aGUgY29tbW9uIFNBWCBiYXNlZCByZXNvbHV0aW9uIGNvZGUgaW50byB0aGlzIG1ldGhvZCBmb3IgdXNlIGJ5IG90aGVyIHZhbGlkYXRvcnMgCi0gIC8vIChpLmUuIFhNTCBTY2hlbWEsIFdTREwgZXRjKS4gICBUaGUgb3RoZXIgYXBwcm9hY2ggaXMgbWFpbnRhaW4gYSBjb3B5IGZvciBlYWNoIHZhbGlkYXRvciB0aGF0IGhhcwotICAvLyBpZGVudGljYWwgY29kZS4gIEluIGFueSBjYXNlIHdlIHNob3VsZCBzdHJpdmUgdG8gZW5zdXJlIHRoYXQgdGhlIHZhbGlkYXRvcnMgcGVyZm9ybSByZXNvbHV0aW9uIGNvbnNpc3RlbnRseS4gCi0gIHB1YmxpYyBzdGF0aWMgWE1MSW5wdXRTb3VyY2UgX2ludGVybmFsUmVzb2x2ZUVudGl0eShVUklSZXNvbHZlciB1cmlSZXNvbHZlciwgWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJpZCkgdGhyb3dzICBJT0V4Y2VwdGlvbgotICB7Ci0gICAgWE1MSW5wdXRTb3VyY2UgaXMgPSBudWxsOwotICAgIAotICAgIGlmICh1cmlSZXNvbHZlciAhPSBudWxsKQotICAgIHsgICAgICAgICAKLSAgICAgIFN0cmluZyBpZCA9IHJpZC5nZXRQdWJsaWNJZCgpOwotICAgICAgaWYoaWQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWQgPSByaWQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIFN0cmluZyBsb2NhdGlvbiA9IG51bGw7Ci0gICAgICBpZiAoaWQgIT0gbnVsbCB8fCByaWQuZ2V0TGl0ZXJhbFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgIAotICAgICAgICBsb2NhdGlvbiA9IHVyaVJlc29sdmVyLnJlc29sdmUocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgcmlkLmdldExpdGVyYWxTeXN0ZW1JZCgpKTsKLSAgICAgIH0gIAotICAgICAgCi0gICAgICBpZiAobG9jYXRpb24gIT0gbnVsbCkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgU3RyaW5nIHBoeXNpY2FsID0gdXJpUmVzb2x2ZXIucmVzb2x2ZVBoeXNpY2FsTG9jYXRpb24ocmlkLmdldEJhc2VTeXN0ZW1JZCgpLCBpZCwgbG9jYXRpb24pOwotICAgICAgICBpcyA9IG5ldyBYTUxJbnB1dFNvdXJjZShyaWQuZ2V0UHVibGljSWQoKSwgbG9jYXRpb24sIGxvY2F0aW9uKTsKLSAgICAgICAgCi0gICAgICAgIC8vIFRoaXMgYmxvY2sgY2hlY2tzIHRoYXQgdGhlIGZpbGUgZXhpc3RzLiBJZiBpdCBkb2Vzbid0IHdlIG5lZWQgdG8gdGhyb3cKLSAgICAgICAgLy8gYW4gZXhjZXB0aW9uIHNvIFhlcmNlcyB3aWxsIHJlcG9ydCBhbiBlcnJvci4gbm90ZTogVGhpcyBtYXkgbm90IGJlCi0gICAgICAgIC8vIG5lY2Vzc2FyeSB3aXRoIGFsbCB2ZXJzaW9ucyBvZiBYZXJjZXMgYnV0IGhhcyBzcGVjaWZpY2FsbHkgYmVlbiAKLSAgICAgICAgLy8gZXhwZXJpZW5jZWQgd2l0aCB0aGUgdmVyc2lvbiBpbmNsdWRlZCBpbiBJQk0ncyAxLjQuMiBKREsuCi0gICAgICAgIElucHV0U3RyZWFtIGlzVGVtcCA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgaXNUZW1wID0gbmV3IFVSTChwaHlzaWNhbCkub3BlblN0cmVhbSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgIGlmKGlzVGVtcCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlzVGVtcC5jbG9zZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpcy5zZXRCeXRlU3RyZWFtKG5ldyBMYXp5VVJMSW5wdXRTdHJlYW0ocGh5c2ljYWwpKTsgICAgICAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlzOyAgICAKLSAgfSAgICAgIAotICAKLSAgLyoqCi0gICAqIEFuIGVycm9yIGhhbmRsZXIgdG8gY2F0Y2ggZXJyb3JzIGVuY291bnRlcmVkIHdoaWxlIHBhcnNpbmcgdGhlIFhNTCBkb2N1bWVudC4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYTUxFcnJvckhhbmRsZXIgaW1wbGVtZW50cyBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIKLSAgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgRVJST1IgPSAwOwotICAgIHByaXZhdGUgZmluYWwgaW50IFdBUk5JTkcgPSAxOwotICAgIHByaXZhdGUgWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLSAgICAKLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gdmFsaW5mbyBUaGUgWE1MIHZhbGlkYXRpb24gaW5mbyBvYmplY3QgdGhhdCB3aWxsIGhvbGQgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHVibGljIFhNTEVycm9ySGFuZGxlcihYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvKQotICAgIHsKLSAgICAgIHRoaXMudmFsaW5mbyA9IHZhbGluZm87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIGEgdmFsaWRhdGlvbiBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5LgotICAgICAqIAotICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgICAqIEBwYXJhbSBzZXZlcml0eSBUaGUgc2V2ZXJpdHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uLCBpbnQgc2V2ZXJpdHkpCi0gICAgewotICAgICAgaWYoZXhjZXB0aW9uLmdldFN5c3RlbUlkKCkgIT0gbnVsbCkKLSAgICAgIHsgICAgICAgCQotICAgIAlpbnQgbGluZU51bWJlciA9IGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCWludCBjb2x1bW5OdW1iZXIgPSBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCk7Ci0gICAgCQotICAgIAkvLyBGb3IgdGhlIGZvbGxvd2luZyB0aHJlZSBlcnJvcnMgdGhlIGxpbmUgbnVtYmVyIHdpbGwgYmUgbW9kaWZpZWQgdG8gdXNlIHRoYXQgb2YgdGhlIHN0YXJ0Ci0gICAgCS8vIHRhZyBpbnN0ZWFkIG9mIHRoZSBlbmQgdGFnLgotICAgIAlTdHJpbmcgY3VycmVudEVycm9yS2V5ID0gdmFsaW5mby5jdXJyZW50RXJyb3JLZXk7Ci0gICAgCWlmIChjdXJyZW50RXJyb3JLZXkgIT0gbnVsbCAmJiBhZGp1c3RMb2NhdGlvbkVycm9yS2V5U2V0LmNvbnRhaW5zKGN1cnJlbnRFcnJvcktleSkpICAKLSAgICAJewotICAgIAkgIExvY2F0aW9uQ29vcmRpbmF0ZSBhZGp1c3RlZENvb3JkaW5hdGVzID0gKExvY2F0aW9uQ29vcmRpbmF0ZSl2YWxpbmZvLmdldFN0YXJ0RWxlbWVudExvY2F0aW9ucygpLnBlZWsoKTsKLSAgICAJICBsaW5lTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgCSAgY29sdW1uTnVtYmVyID0gYWRqdXN0ZWRDb29yZGluYXRlcy5nZXRDb2x1bW5OdW1uZXIoKTsKLSAgICAJfQotICAgIAkKLSAgICAgICAgaWYoc2V2ZXJpdHkgPT0gV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBsaW5lTnVtYmVyLCBjb2x1bW5OdW1iZXIsIGV4Y2VwdGlvbi5nZXRTeXN0ZW1JZCgpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGxpbmVOdW1iZXIsIGNvbHVtbk51bWJlciwgZXhjZXB0aW9uLmdldFN5c3RlbUlkKCksIHZhbGluZm8uZ2V0Q3VycmVudEVycm9yS2V5KCksIHZhbGluZm8uZ2V0TWVzc2FnZUFyZ3VtZW50cygpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciNlcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBhZGRWYWxpZGF0aW9uTWVzc2FnZShleGNlcHRpb24sIEVSUk9SKTsKLSAgICB9Ci0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5FcnJvckhhbmRsZXIjZmF0YWxFcnJvcihvcmcueG1sLnNheC5TQVhQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFNBWFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIGFkZFZhbGlkYXRpb25NZXNzYWdlKGV4Y2VwdGlvbiwgRVJST1IpOwotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy54bWwuc2F4LkVycm9ySGFuZGxlciN3YXJuaW5nKG9yZy54bWwuc2F4LlNBWFBhcnNlRXhjZXB0aW9uKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoZXhjZXB0aW9uLCBXQVJOSU5HKTsKLSAgICB9Ci0gIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gIC8qKiAKLSAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvdW50IHRoZSBlbGVtZW50RGVjbHMgdGhhdCBhcmUgZW5jb3VudGVyZWQgaW4gYSBEVEQuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgTXlEZWNsSGFuZGxlciBpbXBsZW1lbnRzIERlY2xIYW5kbGVyIAotICB7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0b3IuCi0gICAgICogCi0gICAgICogQHBhcmFtIHZhbGluZm8gVGhlIFhNTFZhbGlkYXRpb25JbmZvIG9iamVjdCB0aGF0IHdpbGwgY291bnQgdGhlIGRlY2xhcmF0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTXlEZWNsSGFuZGxlcigpCi0gICAgewotICAgIH0KLSAgICAKLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjYXR0cmlidXRlRGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGF0dHJpYnV0ZURlY2woU3RyaW5nIGVOYW1lLCBTdHJpbmcgYU5hbWUsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWVEZWZhdWx0LCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjZWxlbWVudERlY2woamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbGVtZW50RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIG1vZGVsKSAKLSAgICB7Ci0gICAgICAvL3ZhbGluZm8uaW5jcmVhc2VFbGVtZW50RGVjbGFyYXRpb25Db3VudCgpOwotICAgIH0KLSAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLnhtbC5zYXguZXh0LkRlY2xIYW5kbGVyI2V4dGVybmFsRW50aXR5RGVjbChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4dGVybmFsRW50aXR5RGVjbChTdHJpbmcgbmFtZSwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIAotICAgIHsKLSAgICB9ICAgICAgCi0KLSAgICAvKiAobm9uLUphdmFkb2MpCi0gICAgICogQHNlZSBvcmcueG1sLnNheC5leHQuRGVjbEhhbmRsZXIjaW50ZXJuYWxFbnRpdHlEZWNsKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxFbnRpdHlEZWNsKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIAotICAgIHsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24gdGhhdCBjcmVhdGVzIGFuIGVycm9yIHJlcG9ydGVyIHdoaWNoIGNhbiBpZ25vcmUKLSAgICogRFREIGVycm9yIG1lc3NhZ2VzIGZvciBEVEQncyB3aXRoIG5vIGVsZW1lbnRzIGRlZmluZWQuCi0gICAqLwotCi0gIHByb3RlY3RlZCBjbGFzcyBNeVN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbiBleHRlbmRzIFN0YW5kYXJkUGFyc2VyQ29uZmlndXJhdGlvbgotICB7Ci0gIAlYTUxWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbnVsbDsKLSAgICBMaXN0IHJlcG9ydGVkRXhjZXB0aW9ucyA9IG5ldyBBcnJheUxpc3QoKTsgCi0gIAkKLSAgCS8qKgotICAJICogQ29uc3RydWN0b3IuCi0gIAkgKiAKLSAgCSAqIEBwYXJhbSB2YWxpbmZvIFRoZSBYTUxWYWxpZGF0aW9uSW5mbyBvYmplY3QgdG8gdXNlLgotICAJICovCi0gIAlwdWJsaWMgTXlTdGFuZGFyZFBhcnNlckNvbmZpZ3VyYXRpb24oWE1MVmFsaWRhdGlvbkluZm8gdmFsaW5mbykKLSAgCXsKLSAgCSAgdGhpcy52YWxpbmZvID0gdmFsaW5mbzsKLSAgCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuRFREQ29uZmlndXJhdGlvbiNjcmVhdGVFcnJvclJlcG9ydGVyKCkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgWE1MRXJyb3JSZXBvcnRlciBjcmVhdGVFcnJvclJlcG9ydGVyKCkgCi0gICAgewotICAgIAlyZXR1cm4gbmV3IFhNTEVycm9yUmVwb3J0ZXIoKQotCQl7Ci0gICAgCQkvKiAobm9uLUphdmFkb2MpCi0gICAgCQkgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLmltcGwuWE1MRXJyb3JSZXBvcnRlciNyZXBvcnRFcnJvcihqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0W10sIHNob3J0KQotICAgIAkJICovCi0gICAgCQlwdWJsaWMgdm9pZCByZXBvcnRFcnJvcihTdHJpbmcgZG9tYWluLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMsIHNob3J0IHNldmVyaXR5KSB0aHJvd3MgWE5JRXhjZXB0aW9uIAotICAgIAkgICAgeyAgICAgICAgICAgICAgICAgICAgCi0JCSAgICAgIGJvb2xlYW4gcmVwb3J0RXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICB2YWxpbmZvLnNldEN1cnJlbnRFcnJvcktleShrZXkpOyAgCi0JCQkgIHZhbGluZm8uc2V0TWVzc2FnZUFyZ3VtZW50cyhhcmd1bWVudHMpOwotCQkgICAgICBTdHJpbmcgaWdub3JlQ29uZGl0aW9uID0gKFN0cmluZylpbmdvcmVkRXJyb3JLZXlUYWJsZS5nZXQoa2V5KTsKLQkJICAgICAgaWYgKGlnbm9yZUNvbmRpdGlvbiAhPSBudWxsKQotCQkgICAgICB7Ci0JCSAgICAgICAgaWYgKGlnbm9yZUNvbmRpdGlvbi5lcXVhbHMoWE1MVmFsaWRhdG9yLklHTk9SRV9JRl9EVERfV0lUSE9VVF9FTEVNRU5UX0RFQ0wpKQotCQkgICAgICAgIHsgICAgICAgICAgICAgICAgICAgIAotCQkgICAgICAgICAgYm9vbGVhbiBpc0RURFdpdGhvdXRFbGVtZW50RGVjbGFyYXRpb25FbmNvdW50ZXJlZCA9IHZhbGluZm8uaXNEVERXaXRob3V0RWxlbWVudERlY2xhcmF0aW9uRW5jb3VudGVyZWQoKTsgCi0JCSAgICAgICAgICByZXBvcnRFcnJvciA9ICFpc0RURFdpdGhvdXRFbGVtZW50RGVjbGFyYXRpb25FbmNvdW50ZXJlZDsgIAotCQkgICAgICAgIH0KLQkJICAgICAgICBlbHNlIAotCQkgICAgICAgIHsKLQkJICAgICAgICAgIHJlcG9ydEVycm9yID0gZmFsc2U7Ci0JCSAgICAgICAgfQotCQkgICAgICB9Ci0JCSAgICAgIGlmICgic2NoZW1hX3JlZmVyZW5jZS40Ii5lcXVhbHMoa2V5KSAmJiBhcmd1bWVudHMubGVuZ3RoID4gMCkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IGxvY2F0aW9uID0gYXJndW1lbnRzWzBdOyAgCi0gICAgICAgICAgICAgICAgaWYgKGxvY2F0aW9uICE9IG51bGwpCi0gICAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgICBpZihyZXBvcnRlZEV4Y2VwdGlvbnMuY29udGFpbnMobG9jYXRpb24pKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXBvcnRlZEV4Y2VwdGlvbnMuYWRkKGxvY2F0aW9uKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0gICAgICAgICAgCi0JCSAgICAgIGlmIChyZXBvcnRFcnJvcikKLQkJICAgICAgewotCQkgICAgICAgIHN1cGVyLnJlcG9ydEVycm9yKGRvbWFpbiwga2V5LCBhcmd1bWVudHMsIHNldmVyaXR5KTsKLQkJICAgICAgICB2YWxpbmZvLmdldEVycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIoKS5jb25zaWRlclJlcG9ydGVkRXJyb3IodmFsaW5mbywga2V5LCBhcmd1bWVudHMpOwotCQkgICAgICB9Ci0JCSAgICB9Ci0JCX07Ci0gICAgfQotICB9Ci0gIAotICAvKiogCi0gICAqIEEgbGluZSBhbmQgY29sdW1uIG51bWJlciBjb29yZGluYXRlLgotICAgKi8KLSAgcHJvdGVjdGVkIGNsYXNzIExvY2F0aW9uQ29vcmRpbmF0ZQotICB7CQotCXByaXZhdGUgaW50IGxpbmVObyA9IC0xOwotICAgIHByaXZhdGUgaW50IGNvbHVtbk5vID0gLTE7Ci0gICAgCi0gICAgcHVibGljIExvY2F0aW9uQ29vcmRpbmF0ZShpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgICB7Ci0gICAgICB0aGlzLmxpbmVObyA9IGxpbmVOdW1iZXI7Ci0gICAgICB0aGlzLmNvbHVtbk5vID0gY29sdW1uTnVtYmVyOwotICAgIH0KLSAgICAJCi0gICAgcHVibGljIGludCBnZXRMaW5lTnVtYmVyKCkKLSAgICB7IAotICAgICAgcmV0dXJuIHRoaXMubGluZU5vOwotICAgIH0KLSAgICAJCi0gICAgcHVibGljIGludCBnZXRDb2x1bW5OdW1uZXIoKQotICAgIHsgCi0gICAgICByZXR1cm4gdGhpcy5jb2x1bW5ObzsKLSAgICB9IAotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL0Fic3RyYWN0TmVzdGVkVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkZWExY2QuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9BYnN0cmFjdE5lc3RlZFZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLklTY2hlZHVsaW5nUnVsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYjsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCB2YWxpZGF0b3IgdGhhdCBhc3Npc3RzIHZhbGlkYXRvcnMgaW4gcnVubmluZyBhbmQgY29udHJpYnV0aW5nCi0gKiBuZXN0ZWQgbWVzc2FnZXMgaW4gdGhlIHZhbGlkYXRpb24gcmVzdWx0cy4gCi0gKiAqbm90ZTogU3ViY2xhc3NlcyBkbyBub3QgbmVlZCB0byBjb250cmlidXRlIG5lc3RlZCBtZXNzYWdlcyBpbiBvcmRlciB0bwotICogYmVuZWZpdCBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBjbGFzcy4gVGhpcyBjbGFzcyB0YWtlcyBjYXJlIG9mIGl0ZXJhdGluZwotICogdGhyb3VnaCByZXN1bHRzIGZvciB2YWxpZGF0b3JzIHRoYXQgdXNlIHRoZSBzdGFuZGFyZCBjb250ZXh0LgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9ySm9iIAotewotICAvLyBMb2NhbGx5IHVzZWQsIG5vbi1VSSBzdHJpbmdzLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVGRVJFTkNFRF9GSUxFX0VSUk9SX09QRU4gPSAicmVmZXJlbmNlZEZpbGVFcnJvcigiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfQ0xPU0UgPSAiKSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFRkVSRU5DRURfRklMRV9FUlJPUiA9ICJyZWZlcmVuY2VkRmlsZUVycm9yIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMRV9QUk9UT0NPTF9OT19TTEFTSCA9ICJmaWxlOiI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJTEVfUFJPVE9DT0wgPSAiZmlsZTovLy8iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBHUk9VUF9OQU1FID0gImdyb3VwTmFtZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUX0ZJTEUgPSAiZ2V0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgR0VUX1BST0pFQ1RfRklMRVMgPSAiZ2V0QWxsRmlsZXMiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nIEdFVF9JTlBVVFNUUkVBTSA9ICJpbnB1dFN0cmVhbSI7IC8vJE5PTi1OTFMtMSQKLSAgCi0gIC8vIEludGVybmFsIHN0cmluZ3MuIFRoZXNlIHN0cmluZ3MgYXJlIGNvbW1vbiBhZGRpdGlvbiBpbmZvcm1hdGlvbiB0eXBlcy4KLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUgPSAiY29sdW1uTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9TRUxFQ1RJT05fU1RSQVRFR1lfQVRUUklCVVRFID0gInNxdWlnZ2xlU2VsZWN0aW9uU3RyYXRlZ3kiOyAvLyROT04tTkxTLTEkCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFID0gInNxdWlnZ2xlTmFtZU9yVmFsdWUiOyAvLyROT04tTkxTLTEkCi0KLSAgCi0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvckpvYiN2YWxpZGF0ZUluSm9iKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyBJU3RhdHVzIHZhbGlkYXRlSW5Kb2IoSVZhbGlkYXRpb25Db250ZXh0IGNvbnRleHQsIElSZXBvcnRlciByZXBvcnRlcikgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gCi0gIHsKLQlOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IG5lc3RlZGNvbnRleHQgPSBuZXcgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCgpOwotCXNldHVwVmFsaWRhdGlvbihuZXN0ZWRjb250ZXh0KTsKLQlTdHJpbmdbXSBmaWxlVVJJcyA9IGNvbnRleHQuZ2V0VVJJcygpOwotCWlmIChmaWxlVVJJcyAhPSBudWxsICYmIGZpbGVVUklzLmxlbmd0aCA+IDApIAotCXsKLQkgIGludCBudW1GaWxlcyA9IGZpbGVVUklzLmxlbmd0aDsKLQkgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRmlsZXMgJiYgIXJlcG9ydGVyLmlzQ2FuY2VsbGVkKCk7IGkrKykgCi0JICB7Ci0JICAgIFN0cmluZyBmaWxlTmFtZSA9IGZpbGVVUklzW2ldOwotCSAgICBpZiAoZmlsZU5hbWUgIT0gbnVsbCkKLQkgICAgeyAgICAgICAgICAKLQkgICAgICBPYmplY3QgW11wYXJtcyA9IHtmaWxlTmFtZX07Ci0KLQkgICAgICBJRmlsZSBmaWxlID0gKElGaWxlKSBjb250ZXh0LmxvYWRNb2RlbChHRVRfRklMRSwgcGFybXMpOwotCSAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgc2hvdWxkVmFsaWRhdGUoZmlsZSkpIAotCSAgICAgIHsgCi0JICAgIAkvLyBUaGUgaGVscGVyIG1heSBub3QgaGF2ZSBhIGZpbGUgc3RvcmVkIGluIGl0IGJ1dCBtYXkgaGF2ZSBhbiBJbnB1dFN0cmVhbSBpZiBiZWluZwotCSAgICAJLy8gY2FsbGVkIGZyb20gYSBzb3VyY2Ugb3RoZXIgdGhhbiB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgc3VjaCBhcyBhbiBlZGl0b3IuCi0JICAgICAgICBpZiAoY29udGV4dC5sb2FkTW9kZWwoR0VUX0lOUFVUU1RSRUFNKSBpbnN0YW5jZW9mIElucHV0U3RyZWFtKSAvLyROT04tTkxTLTEkCi0JICAgICAgICB7Ci0JICAgICAgICAgIHZhbGlkYXRlKGZpbGUsIChJbnB1dFN0cmVhbSljb250ZXh0LmxvYWRNb2RlbChHRVRfSU5QVVRTVFJFQU0pLCByZXBvcnRlciwgbmVzdGVkY29udGV4dCk7IC8vZG8gd2UgbmVlZCB0aGUgZmlsZU5hbWU/ICB3aGF0IGlzIGludCBydWxlR3JvdXA/IC8vJE5PTi1OTFMtMSQKLQkgICAgICAgIH0KLQkgICAgICAgIGVsc2UKLQkgICAgICAgIHsKLQkgICAgCSAgdmFsaWRhdGUoZmlsZSwgbnVsbCwgcmVwb3J0ZXIsIG5lc3RlZGNvbnRleHQpOwotCSAgICAgICAgfQotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCX0KLQkvLyBUT0RPOiBJcyB0aGlzIG5lZWRlZD8gU2hvdWxkbid0IHRoZSBmcmFtZXdvcmsgcGFzcyB0aGUgY29tcGxldGUgbGlzdD8gCi0JLy8gU2hvdWxkIEkga25vdyB0aGF0IEknbSB2YWxpZGF0aW5nIGEgcHJvamVjdCBhcyBvcHBvc2VkIHRvIGZpbGVzPwotCWVsc2UgCi0gICAgewotICAgICAgT2JqZWN0IFtdcGFybXMgPSB7Z2V0VmFsaWRhdG9ySUQoKX07Ci0gICAgICBDb2xsZWN0aW9uIGZpbGVzID0gKENvbGxlY3Rpb24pIGNvbnRleHQubG9hZE1vZGVsKEdFVF9QUk9KRUNUX0ZJTEVTLCBwYXJtcyk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gZmlsZXMuaXRlcmF0b3IoKTsKLSAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSAmJiAhcmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkgCi0gICAgICB7Ci0gICAgICAgIElGaWxlIGZpbGUgPSAoSUZpbGUpIGl0ZXIubmV4dCgpOwotICAgICAgICBpZihzaG91bGRWYWxpZGF0ZShmaWxlKSkKLSAgICAgICAgewotCSAgICAgIHZhbGlkYXRlKGZpbGUsIG51bGwsIHJlcG9ydGVyLCBuZXN0ZWRjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQkKLQl0ZWFyZG93blZhbGlkYXRpb24obmVzdGVkY29udGV4dCk7Ci0JaWYocmVwb3J0ZXIuaXNDYW5jZWxsZWQoKSkKLQkgIHJldHVybiBTdGF0dXMuQ0FOQ0VMX1NUQVRVUzsKLSAgICByZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLSAgfQotICAKLSAgLyoqCi0gICAqIFByb3ZpZGVzIHRoZSBpZCBvZiB0aGlzIHZhbGlkYXRvci4gVGhlIElEIGlzIHVzZWQgYnkgdGhlIHZhbGlkYXRpb24KLSAgICogZnJhbWV3b3JrLiBJdCB1c3VhbGx5IGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgY2xhc3MKLSAgICogaW1wbGVtZW50aW5nIHRoZSBJVmFsaWRhdG9yIGludGVyZmFjZS4KLSAgICogCi0gICAqIEByZXR1cm4gYSBTdHJpbmcgd2l0aCB0aGUgSUQgb2YgdGhpcyB2YWxpZGF0b3IuCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRvcklEKCkKLSAgewotICAgIHJldHVybiB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICB9Ci0gIAotICAvKioKLSAgICogUGVyZm9ybSBzZXQgdXAgYmVmb3JlIHZhbGlkYXRpb24gcnVucy4gU3ViY2xhc3NlcyBtYXkgaW1wbGVtZW50IHRoaXMKLSAgICogbWV0aG9kIHRvIHBlcmZvcm0gdmFsaWRhdGlvbiBzcGVjaWZpYyBzZXQgdXAuCi0gICAqIAotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICB7Ci0JLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCi0gIH0KLSAgCi0gIC8qKgotICAgKiBQZXJmb3JtIHRlYXIgZG93biBhZnRlciB2YWxpZGF0aW9uIHJ1bnMuIFN1YmNsYXNzZXMgbWF5IGltcGxlbWVudCB0aGlzCi0gICAqIG1ldGhvZCB0byBwZXJmb3JtIHZhbGlkYXRpb24gc3BlY2lmaWMgdGVhciBkb3duLgotICAgKiAKLSAgICogQHBhcmFtIGNvbnRleHQKLSAgICogCQlUaGUgY29udGV4dCBvZiB0aGUgY3VycmVudCB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhcmRvd25WYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgewotCS8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9ySm9iI2dldFNjaGVkdWxpbmdSdWxlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0KQotICAgKi8KLSAgcHVibGljIElTY2hlZHVsaW5nUnVsZSBnZXRTY2hlZHVsaW5nUnVsZShJVmFsaWRhdGlvbkNvbnRleHQgYXJnMCkgCi0gIHsKLQkvLyBUT0RPIHJldmlldyB3aGV0aGVyIHJldHVybmluZyBhIG51bGwgcnVsZSBpcyBjb3JyZWN0LiBHYXJ5IGhhZCBhIHN1Z2dlc3Rpb24gaW4gdGhlIGJ1ZyByZXBvcnQuCi0JcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yI2NsZWFudXAob3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXIpCi0gICAqLwotICBwdWJsaWMgdm9pZCBjbGVhbnVwKElSZXBvcnRlciBhcmcwKSAKLSAgewotICAgIC8vIE5vIGNsZWFudXAgdG8gcGVyZm9ybS4gU3ViY2xhc3NlcyBhcmUgZnJlZSB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCi0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yI3ZhbGlkYXRlKG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0LCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklSZXBvcnRlcikKLSAgICovCi0gIHB1YmxpYyB2b2lkIHZhbGlkYXRlKElWYWxpZGF0aW9uQ29udGV4dCBhcmcwLCBJUmVwb3J0ZXIgYXJnMSkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb24gCi0gIHsgIAotCS8vIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW1wbGVtZW50ZWQgYnkgdmFsaWR0b3JzIGltcGxlbWVudGluZyB0aGUgdmFsaWRhdGVJbkpvYgotCS8vIG1ldGhvZC4KLSAgfQotCQotCQotICAvKioKLSAgICogRGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gZmlsZSBzaG91bGQgYmUgdmFsaWRhdGVkLiAKLSAgICogCi0gICAqIEBwYXJhbSBmaWxlIFRoZSBmaWxlIHRoYXQgbWF5IGJlIHZhbGlkYXRlZC4KLSAgICogQHJldHVybiBUcnVlIGlmIHRoZSBmaWxlIHNob3VsZCBiZSB2YWxpZGF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gc2hvdWxkVmFsaWRhdGUoSUZpbGUgZmlsZSkgCi0gIHsKLQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBmaWxlOwotCWRvIAotCXsKLQkgIGlmIChyZXNvdXJjZS5pc0Rlcml2ZWQoKSB8fCByZXNvdXJjZS5pc1RlYW1Qcml2YXRlTWVtYmVyKCkgfHwgCi0JCSAgIXJlc291cmNlLmlzQWNjZXNzaWJsZSgpIHx8IHJlc291cmNlLmdldE5hbWUoKS5jaGFyQXQoMCkgPT0gJy4nKSAKLQkgIHsKLQkJcmV0dXJuIGZhbHNlOwotCSAgfQotCSAgcmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnQoKTsKLQl9d2hpbGUgKChyZXNvdXJjZS5nZXRUeXBlKCkgJiBJUmVzb3VyY2UuUFJPSkVDVCkgPT0gMCk7Ci0JCi0JcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBWYWxpZGF0ZSB0aGUgZ2l2ZW4gZmlsZSBhbmQgdXNlIHRoZSByZXBvcnRlciBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gdGhlIHZhbGlkYXRpb24gbG9naWMgYnV0IHJhdGhlciBkZWxlZ2F0ZXMKLSAgICogdG8gdGhlIHZhbGlkYXRlIG1ldGhvZCBpbiBzdWJjbGFzc2VzIHRvIHZhbGlkYXRlLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZQotICAgKiBmb3IgcmVwb3J0aW5nIHRoZSBtZXNzYWdlcyB0aGF0IHJlc3VsdCBmcm9tIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSAKLSAgICogCQlBbiBJRmlsZSB0byB2YWxpZGF0ZS4KLSAgICogQHBhcmFtIGlucHV0c3RyZWFtIAotICAgKiAJCUFuIElucHV0U3RyZWFtIHRoYXQgcmVwcmVzZW50cyB0aGUgZmlsZS4gVGhlIElucHV0U3RyZWFtIG1heSBiZSBudWxsCi0gICAqIAkJaW4gd2hpY2ggY2FzZSB0aGUgZmlsZXMgc2hvdWxkIGJlIHZhbGlkYXRlZCBmcm9tIHRoZSBJRmlsZS4KLSAgICogQHBhcmFtIHJlcG9ydGVyIAotICAgKiAJCVRoZSByZXBvcnRlciB3aXRoIHdoaWNoIHRvIHJlcG9ydCB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoSUZpbGUgZmlsZSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIElSZXBvcnRlciByZXBvcnRlciwgTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KQotICB7ICAKLQlNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5MT1dfU0VWRVJJVFksIGZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpKTsKLSAgICByZXBvcnRlci5kaXNwbGF5U3VidGFzayh0aGlzLCBtZXNzYWdlKTsKLSAgICAKLQlJUGF0aCBwYXRoID0gZmlsZS5nZXRMb2NhdGlvbigpOwotCVN0cmluZyB1cmkgPSBjcmVhdGVVUklGb3JGaWxlUGF0aChwYXRoLnRvU3RyaW5nKCkpOwotCi0JY2xlYXJNYXJrZXJzKGZpbGUsIHRoaXMsIHJlcG9ydGVyKTsKLQlWYWxpZGF0aW9uUmVwb3J0IHZhbHJlcG9ydCA9IHZhbGlkYXRlKHVyaSwgaW5wdXRzdHJlYW0sIGNvbnRleHQpOwotCQotCWNyZWF0ZU1hcmtlcnMoZmlsZSwgdmFscmVwb3J0LmdldFZhbGlkYXRpb25NZXNzYWdlcygpLCByZXBvcnRlcik7Ci0JICAgICAgICAKLQl0cnkKLQl7Ci0JICBmaWxlLnNldFNlc3Npb25Qcm9wZXJ0eShWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSwgdmFscmVwb3J0LmdldE5lc3RlZE1lc3NhZ2VzKCkpOwotCX0KLQljYXRjaChDb3JlRXhjZXB0aW9uIGUpCi0JewotCSAgU3lzdGVtLm91dC5wcmludGxuKCJVbmFibGUgdG8gc2V0IG5lc3RlZCBtZXNzYWdlcyBwcm9wZXJ0eS4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLSAgfQotCQotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIGdpdmVuIGZpbGUgYW5kIHVzZSB0aGUgcmVwb3J0ZXIgZm9yIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiBDbGllbnRzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kIHdpdGggdGhlaXIgc3BlY2lmaWMgdmFsaWRhdGlvbiBsb2dpYy4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgVVJJIG9mIHRoZSBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRzdHJlYW0gCi0gICAqIAkJQW4gSW5wdXRTdHJlYW0gdGhhdCByZXByZXNlbnRzIHRoZSBmaWxlLiBUaGUgSW5wdXRTdHJlYW0gbWF5IGJlIG51bGwKLSAgICogCQlpbiB3aGljaCBjYXNlIHRoZSBmaWxlcyBzaG91bGQgYmUgdmFsaWRhdGVkIGZyb20gdGhlIElGaWxlLgotICAgKiBAcGFyYW0gY29udGV4dAotICAgKiAJCVRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHZhbGlkYXRpb24uCi0gICAqIEByZXR1cm4KLSAgICogCQlBIHZhbGlkYXRpb24gcmVwb3J0IHN1bW1hcml6aW5nIHRoZSB2YWxpZGF0aW9uLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCk7Ci0JICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGNsZWFycyBhbGwgdGhlIG1hcmtlcnMgb24gdGhlIGdpdmVuIElGaWxlIGZvciBhIHNwZWNpZmllZAotICAgKiB2YWxpZGF0b3IuCi0gICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgZm9yIHN1YmNsYXNzZXMuCi0gICAqIAotICAgKiBAcGFyYW0gaUZpbGUKLSAgICogCQlUaGUgSUZpbGUgZnJvbSB3aGljaCB0byBjbGVhciB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHZhbGlkYXRvcgotICAgKiAJCVRoZSB2YWxpZGF0b3IgZm9yIHdoaWNoIHRvIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICogQHBhcmFtIHJlcG9ydGVyCi0gICAqIAkJVGhlIHJlcG9ydGVyIHRoYXQgY2FuIHJlbW92ZSB0aGUgbWFya2Vycy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjbGVhck1hcmtlcnMoSUZpbGUgaUZpbGUsIElWYWxpZGF0b3IgdmFsaWRhdG9yLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpCi0gIHsKLQlpZiAoZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0JewotCSAgcmVwb3J0ZXIucmVtb3ZlQWxsTWVzc2FnZXModmFsaWRhdG9yLCBpRmlsZSk7Ci0JfQotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gZmlsZSBpcyBhY2Nlc3NpYmxlIGFuZCBtYXkgYmUgdXNlZCBmb3IgdmFsaWRhdGlvbi4gQSBmaWxlIGlzIAotICAgKiBhdmFpbGFibGUgaWYgCi0gICAqIDEuIEl0IGlzIG5vdCBudWxsLgotICAgKiAyLiBJdCBleGlzdHMuIAotICAgKiAzLiBUaGUgcHJvamVjdCBjb250YWluaW5nIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUuCi0gICAqIAotICAgKiBAcGFyYW0gZmlsZSAKLSAgICogCQlUaGUgZmlsZSB0byBjaGVjayB0byBlbnN1cmUgaXQgaXMgYWNjZXNzaWJsZS4KLSAgICogQHJldHVybiAKLSAgICogCQlUcnVlIGlmIHRoZSBmaWxlIGlzIGFjY2Vzc2libGUsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmaWxlSXNBY2Nlc3NpYmxlKElGaWxlIGZpbGUpCi0gIHsKLSAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkgJiYgZmlsZS5nZXRQcm9qZWN0KCkuaXNBY2Nlc3NpYmxlKCkpCi0JewotCSAgcmV0dXJuIHRydWU7Ci0JfQotCXJldHVybiBmYWxzZTsKLSAgfQotCSAgCi0gIC8qKgotICAgKiBGb3JtYXQgYSBmaWxlIG5hbWUgaW50byBhIGNvcnJlY3QgVVJJLiAKLSAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3Igc3ViY2xhc3Nlcy4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSAKLSAgICogCQlUaGUgZmlsZSBuYW1lIHRvIGZvcm1hdC4KLSAgICogQHJldHVybiAKLSAgICogCQkKLSAgICogVGhlIGZvcm1hdHRlZCBVUkkuCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjcmVhdGVVUklGb3JGaWxlUGF0aChTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLQlpZighZmlsZW5hbWUuc3RhcnRzV2l0aChGSUxFX1BST1RPQ09MX05PX1NMQVNIKSkKLQl7Ci0JICB3aGlsZShmaWxlbmFtZS5zdGFydHNXaXRoKCIvIikpIC8vJE5PTi1OTFMtMSQKLQkgIHsKLQkgICAgZmlsZW5hbWUgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMSk7Ci0JICB9Ci0JICBmaWxlbmFtZSA9IEZJTEVfUFJPVE9DT0wgKyBmaWxlbmFtZTsKLQl9Ci0JcmV0dXJuIGZpbGVuYW1lOwotICB9Ci0JICAKLSAgLyoqCi0gICAqIENyZWF0ZSBtYXJrZXJzIGZvciB0aGUgdmFsaWF0aW9uIG1lc3NhZ2VzIGdlbmVyYXRlZCBmcm9tIHRoZSB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGlGaWxlCi0gICAqICAgICAgICAgIFRoZSByZXNvdXJjZSB0byBjcmVhdGUgdGhlIG1hcmtlcnMgb24uCi0gICAqIEBwYXJhbSB2YWxtZXNzYWdlcwotICAgKiAgICAgICAgICBUaGUgYXJyYXkgb2YgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNyZWF0ZU1hcmtlcnMoSUZpbGUgaUZpbGUsIFZhbGlkYXRpb25NZXNzYWdlW10gdmFsbWVzc2FnZXMsIElSZXBvcnRlciByZXBvcnRlcikKLSAgewotICAgIGlmICghZmlsZUlzQWNjZXNzaWJsZShpRmlsZSkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpbnQgbnVtbWVzc2FnZXMgPSB2YWxtZXNzYWdlcy5sZW5ndGg7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1tZXNzYWdlczsgaSsrKQotICAgIHsKLSAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gdmFsbWVzc2FnZXNbaV07Ci0gICAgICBTdHJpbmcgdXJpID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0VXJpKCk7Ci0KLSAgICAgIExvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZTsKLSAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZS5nZXRTZXZlcml0eSgpID09IFZhbGlkYXRpb25NZXNzYWdlLlNFVl9MT1cpCi0gICAgICB7Ci0gICAgICAgIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIAotICAgICAgICAJCXZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgeyAKLSAgICAgICAgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSwgaUZpbGUpOwotICAgICAgfQotICAgICAgCi0gICAgICBtZXNzYWdlLnNldExpbmVObyh2YWxpZGF0aW9uTWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkpOwotICAgICAgYWRkSW5mb1RvTWVzc2FnZSh2YWxpZGF0aW9uTWVzc2FnZSwgbWVzc2FnZSk7Ci0gICAgICAKLSAgICAgIExpc3QgbmVzdGVkZXJyb3JzID0gdmFsaWRhdGlvbk1lc3NhZ2UuZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLSAgICAgIGlmIChuZXN0ZWRlcnJvcnMgIT0gbnVsbCAmJiAhbmVzdGVkZXJyb3JzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgbWVzc2FnZS5zZXRHcm91cE5hbWUoUkVGRVJFTkNFRF9GSUxFX0VSUk9SX09QRU4gKyB1cmkgKyBSRUZFUkVOQ0VEX0ZJTEVfRVJST1JfQ0xPU0UpOwotICAgICAgfQotCi0gICAgICByZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCSAgICAgIAotICAgIH0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBJTWFya2VyW10gbWFya2VycyA9IGlGaWxlLmZpbmRNYXJrZXJzKG51bGwsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIElNYXJrZXIgbWFya2VyID0gbWFya2Vyc1tpXTsKLSAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgZ3JvdXBOYW1lID0gKFN0cmluZykgbWFya2VyLmdldEF0dHJpYnV0ZShHUk9VUF9OQU1FKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICBpZiAoZ3JvdXBOYW1lICE9IG51bGwgJiYgZ3JvdXBOYW1lLnN0YXJ0c1dpdGgoUkVGRVJFTkNFRF9GSUxFX0VSUk9SKSkKLSAgICAgICAgewotICAgICAgICAgIG1hcmtlci5zZXRBdHRyaWJ1dGUoSU1hcmtlci5ET05FLCB0cnVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0JICAKLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgYWRkaXRpb24gb2YgaW5mb3JtYXRpb24gdG8gdGhlIHZhbGlkYXRpb24gbWVzc2FnZQotICAgKiBAcGFyYW0gdmFsaWRhdGlvbm1lc3NhZ2UKLSAgICogCQlUaGUgVmFsaWRhdGlvbk1lc3NhZ2UgdG8gcmV0cmlldmUgdGhlIGluZm9ybWF0aW9uIGZyb20uCi0gICAqIEBwYXJhbSBtZXNzYWdlCi0gICAqIAkJVGhlIElNZXNzYWdlIHRvIGFkZCB0aGUgaW5mb3JtYXRpb24gdG8uCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlIChWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9ubWVzc2FnZSwgSU1lc3NhZ2UgbWVzc2FnZSkKLSAgeyAKLQkvLyBUaGlzIG1ldGhvZCBtYXkgYmUgb3ZlcmlkZGVuIGJ5IHN1YmNsYXNzZXMKLSAgfQotCSAgCi0gIC8qKgotICAgKiBBIGxvY2FsaXplZCBtZXNzYWdlIGlzIGEgc3BlY2lhbGl6ZWQgdHlwZSBvZiBJTWVzc2FnZSB0aGF0IGFsbG93cyBzZXR0aW5nCi0gICAqIGFuZCB1c2luZyBhIGxvY2FsaXplZCBtZXNzYWdlIHN0cmluZyBmb3IgYSBtZXNzYWdlLgotICAgKi8KLSAgY2xhc3MgTG9jYWxpemVkTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2UgCi0gIHsKLSAgICBwcml2YXRlIFN0cmluZyBfbWVzc2FnZSA9IG51bGw7Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCkgCi0JewotCSAgdGhpcyhzZXZlcml0eSwgbWVzc2FnZVRleHQsIG51bGwpOwotCX0KLQotCXB1YmxpYyBMb2NhbGl6ZWRNZXNzYWdlKGludCBzZXZlcml0eSwgU3RyaW5nIG1lc3NhZ2VUZXh0LCBJUmVzb3VyY2UgdGFyZ2V0T2JqZWN0KSAKLQl7Ci0JICB0aGlzKHNldmVyaXR5LCBtZXNzYWdlVGV4dCwgKE9iamVjdCkgdGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgTG9jYWxpemVkTWVzc2FnZShpbnQgc2V2ZXJpdHksIFN0cmluZyBtZXNzYWdlVGV4dCwgT2JqZWN0IHRhcmdldE9iamVjdCkgCi0JewotCSAgc3VwZXIobnVsbCwgc2V2ZXJpdHksIG51bGwpOwotCSAgc2V0TG9jYWxpemVkTWVzc2FnZShtZXNzYWdlVGV4dCk7Ci0JICBzZXRUYXJnZXRPYmplY3QodGFyZ2V0T2JqZWN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMb2NhbGl6ZWRNZXNzYWdlKFN0cmluZyBtZXNzYWdlKSAKLQl7Ci0JICBfbWVzc2FnZSA9IG1lc3NhZ2U7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbGl6ZWRNZXNzYWdlKCkgCi0JewotCSAgcmV0dXJuIF9tZXNzYWdlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIAotCXsKLQkgIHJldHVybiBnZXRMb2NhbGl6ZWRNZXNzYWdlKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KENsYXNzTG9hZGVyIGNsKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChMb2NhbGUgbCkgCi0JewotCSAgcmV0dXJuIGdldExvY2FsaXplZE1lc3NhZ2UoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoTG9jYWxlIGwsIENsYXNzTG9hZGVyIGNsKSAKLQl7Ci0JICByZXR1cm4gZ2V0TG9jYWxpemVkTWVzc2FnZSgpOwotCX0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NDk3YWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSdW5uYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLkNvcmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5WYWxpZGF0b3JNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLm9wZXJhdGlvbnMuV29ya2JlbmNoQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklNZXNzYWdlOwotCi0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHZhbGlkYXRpb24gaW4gdGhlIHZhbGlkYXRpb24gZnJhbWV3b3JrLgotICogCi0gKiBAYXV0aG9yIEVybmVzdCBNYWggKGVybmVzdEBjYS5pYm0uY29tKQotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgSGVscGVyIGV4dGVuZHMgV29ya2JlbmNoQ29udGV4dAotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfUFJPSkVDVF9GSUxFUyA9ICJnZXRBbGxGaWxlcyI7IC8vJE5PTi1OTFMtMSQKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0VUX0ZJTEUgPSAiZ2V0RmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgLy9kdyBwcml2YXRlIHN0YXRpYyBmaW5hbCBJQ29udGFpbmVyW10gTk9fQ09OVEFJTkVSUyA9IG5ldyBJQ29udGFpbmVyWzBdOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUiA9ICJvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5wcm9ibGVtbWFya2VyIjsgLy8kTk9OLU5MUy0xJAotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxJREFUSU9OX01BUktFUl9PV05FUiA9ICJvd25lciI7ICAgLy8kTk9OLU5MUy0xJAotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBIZWxwZXIoKQotICB7Ci0gICAgc3VwZXIoKTsKLQotICAgIC8vIHRoZSBmb2xsb3dpbmcgd2lsbCByZWdpc3RlciB0aGUgaGVscGVyJ3Mgc3ltYm9saWMgbWV0aG9kcwotICAgIENsYXNzIFtdIGFyZ3MgPSBuZXcgQ2xhc3NbMV0gOwotICAgIGFyZ3NbMF0gPSBTdHJpbmcuY2xhc3MgOyAgLy8gYSBzdHJpbmcgYXJndW1lbnQgZGVub3RpbmcgYSBzcGVjaWZpYyBKU1AuCi0gICAgCi0gICAgcmVnaXN0ZXJNb2RlbChHRVRfRklMRSwgImdldEZpbGUiLCBhcmdzKTsvLyROT04tTkxTLTEkCi0gICAgcmVnaXN0ZXJNb2RlbChHRVRfUFJPSkVDVF9GSUxFUywgImdldEZpbGVzIiwgYXJncyk7Ly8kTk9OLU5MUy0xJAotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgSUZpbGUgZm9yIHRoZSBnaXZlbiBmaWxlbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0byByZXRyaWV2ZS4KLSAgICogQHJldHVybiBBbiBJRmlsZSByZXByZXNlbnRpbmcgdGhlIGZpbGUgc3BlY2lmaWVkIG9yIG51bGwgaWYgaXQgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0gICAqLwotICBwdWJsaWMgSUZpbGUgZ2V0RmlsZShTdHJpbmcgZmlsZW5hbWUpCi0gIHsKLSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUgbmFtZSA9ICIgKyBmaWxlbmFtZSk7Ci0gICAgSVJlc291cmNlIHJlcyA9IGdldFByb2plY3QoKS5maW5kTWVtYmVyKGZpbGVuYW1lLCB0cnVlKTsgLy8gdHJ1ZSBtZWFucyBpbmNsdWRlIHBoYW50b20gcmVzb3VyY2VzCi0gICAgaWYgKHJlcyBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICB7Ci0gICAgICByZXR1cm4gKElGaWxlKSByZXM7Ci0gICAgfQotICAgIHJldHVybiBudWxsOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBjb2xsZWN0aW9uIG9mIGZpbGVzIGZyb20gdGhlIHByb2plY3QgdGhhdCBhcmUgcmVsZXZhbnQgZm9yIHRoZQotICAgKiB2YWxpZGF0b3Igd2l0aCB0aGUgZ2l2ZW4gY2xhc3MgbmFtZS4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICogQHJldHVybiBUaGUgY29sbGVjdGlvbiBvZiBmaWxlcyByZWxldmFudCBmb3IgdGhlIHZhbGlkYXRvciBjbGFzcyBzcGVjaWZpZWQuCi0gICAqLwotICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRGaWxlcyhTdHJpbmcgdmFsaWRhdG9yQ2xhc3NOYW1lKQotICB7Ci0gICAgSVByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICBMaXN0IGZpbGVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGdldEZpbGVzKGZpbGVzLCBwcm9qZWN0LCB2YWxpZGF0b3JDbGFzc05hbWUpOwotICAgIHJldHVybiBmaWxlczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgZmlsZXMgZnJvbSB0aGUgcHJvamVjdCB0aGF0IGFyZSByZWxldmFudCBmb3IgdGhlCi0gICAqIHZhbGlkYXRvciB3aXRoIHRoZSBnaXZlbiBjbGFzcyBuYW1lLgotICAgKiAKLSAgICogQHBhcmFtIGZpbGVzIFRoZSBmaWxlcyByZWxldmFudCBmb3IgdGhlIGNsYXNzIG5hbWUuCi0gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gbG9vayBmb3IgZmlsZXMgaW4uCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzc05hbWUgVGhlIG5hbWUgb2YgdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGdldEZpbGVzKENvbGxlY3Rpb24gZmlsZXMsIElDb250YWluZXIgcmVzb3VyY2UsIFN0cmluZyB2YWxpZGF0b3JDbGFzc05hbWUpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBJUmVzb3VyY2UgW10gcmVzb3VyY2VBcnJheSA9IHJlc291cmNlLm1lbWJlcnMoZmFsc2UpOwotICAgICAgZm9yIChpbnQgaT0wOyBpPHJlc291cmNlQXJyYXkubGVuZ3RoOyBpKyspCi0gICAgICB7ICAgICAgIAotICAgICAgICBpZiAoVmFsaWRhdG9yTWFuYWdlci5nZXRNYW5hZ2VyKCkuaXNBcHBsaWNhYmxlVG8odmFsaWRhdG9yQ2xhc3NOYW1lLCByZXNvdXJjZUFycmF5W2ldKSkgCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAocmVzb3VyY2VBcnJheVtpXSBpbnN0YW5jZW9mIElGaWxlKSAKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlcy5hZGQocmVzb3VyY2VBcnJheVtpXSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXNvdXJjZUFycmF5W2ldLmdldFR5cGUoKSA9PSBJUmVzb3VyY2UuRk9MREVSKQotICAgICAgICAgZ2V0RmlsZXMoZmlsZXMsKElDb250YWluZXIpcmVzb3VyY2VBcnJheVtpXSwgdmFsaWRhdG9yQ2xhc3NOYW1lKSA7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkge30KLSAgfQotCi0gIAotLyoqCi0gKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJlc291cmNlLCB3aXRob3V0IHRoZSBwcm9qZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIAotICogaW4gZnJvbnQuCi0gKgotICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSBWYWxpZGF0aW9uT3BlcmF0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgbm9uLWVudmlyb25tZW50IAotICogc3BlY2lmaWMgbmFtZXMgb2YgdGhlIGZpbGVzLiBPbmx5IHRoZSBJV29ya2JlbmNoQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBrbm93cyBob3cgCi0gKiBtdWNoIGluZm9ybWF0aW9uIHRvIHN0cmlwIG9mZiBvZiB0aGUgSVJlc291cmNlIG5hbWUuIEZvciBleGFtcGxlLCBpZiB0aGVyZSBpcwotICogYW4gRUpCIFByb2plY3QgbmFtZWQgIk15RUpCUHJvamVjdCIsIGFuZCBpdCB1c2VzIHRoZSBkZWZhdWx0IG5hbWVzIGZvciB0aGUgCi0gKiBzb3VyY2UgYW5kIG91dHB1dCBmb2xkZXJzLCAic291cmNlIiBhbmQgImVqYk1vZHVsZSIsIHJlc3BlY3RpdmVseSwgdGhlbiB0aGUKLSAqIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgRUpCIEhlbHBlciBrbm93cyBob3cgbXVjaCBvZiB0aGF0IHN0cnVjdHVyZSBpcyAKLSAqIGVjbGlwc2Utc3BlY2lmaWMuIAotICoKLSAqIFNpbmNlIHRoZSAic291cmNlIiBmb2xkZXIgY29udGFpbnMgSmF2YSBzb3VyY2UgZmlsZXMsIGEgcG9ydGFibGUgbmFtZSB3b3VsZAotICogYmUgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBKYXZhIGNsYXNzLCB3aXRob3V0IHRoZSBlY2xpcHNlLXNwZWNpZmljCi0gKiBwcm9qZWN0IGFuZCBmb2xkZXIgbmFtZXMgaW4gZnJvbnQgb2YgdGhlIGZpbGUgbmFtZS4gVGhlIEVKQkhlbHBlciBrbm93cyB0aGF0IAotICogZXZlcnl0aGluZyB1cCB0byB0aGUgInNvdXJjZSIgZm9sZGVyLCBmb3IgZXhhbXBsZSwgY2FuIGJlIHJlbW92ZWQsIGJlY2F1c2UsIAotICogYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBFSkIgUHJvamVjdCwgZXZlcnl0aGluZyBjb250YWluZWQKLSAqIGluIHRoZSBzb3VyY2UgZm9sZGVyIGlzIGphdmEgc291cmNlIGNvZGUuIFNvIGlmIHRoZXJlIGlzIGFuIElSZXNvdXJjZSBpbiBhbgotICogRUpCIFByb2plY3QgbmFtZWQgIi9NeUVKQlByb2plY3Qvc291cmNlL2NvbS9pYm0vbXljbGFzc2VzL015SmF2YUZpbGUuamF2YSIsCi0gKiB0aGlzIG1ldGhvZCB3b3VsZCBtYWtlIHRoaXMgbmFtZSBwb3J0YWJsZSBieSBzdHJpcHBpbmcgb2ZmIHRoZQotICogIi9NeUVKQlByb2plY3Qvc291cmNlIiwgYW5kIHJldHVybmluZyAiY29tL2libS9teWNsYXNzZXMvTXlKYXZhRmlsZS5qYXZhIi4KLSAqCi0gKiBUaGUgb3V0cHV0IG9mIHRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIFZhbGlkYXRpb25PcGVyYXRpb24sIHdoZW4gaXQKLSAqIGlzIGNhbGN1bGF0aW5nIHRoZSBsaXN0IG9mIGFkZGVkL2NoYW5nZWQvZGVsZXRlZCBmaWxlIG5hbWVzIGZvciBpbmNyZW1lbnRhbAotICogdmFsaWRhdGlvbi4gSWYgZ2V0UG9ydGFibGVOYW1lKElSZXNvdXJjZSkgcmV0dXJucyBudWxsLCB0aGF0IG1lYW5zCi0gKiB0aGF0IHRoZSBJV29ya2JlbmNoQ29udGV4dCdzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgdGhhdCBwYXJ0aWN1bGFyCi0gKiB0eXBlIG9mIHJlc291cmNlLCBhbmQgdGhlIHJlc291cmNlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFycmF5IG9mCi0gKiBJRmlsZURlbHRhIG9iamVjdHMgaW4gdGhlIElWYWxpZGF0b3IncyAidmFsaWRhdGUiIG1ldGhvZC4gCi0gKiAKLSAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gZ2V0IHRoZSBuYW1lIGZyb20uCi0gKiBAcmV0dXJuIFRoZSBwb3J0YWJsZSBuYW1lIG9mIHRoZSByZXNvdXJjZS4KLSAqLwotcHVibGljIFN0cmluZyBnZXRQb3J0YWJsZU5hbWUoSVJlc291cmNlIHJlc291cmNlKQotICB7Ci0gICAgLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJnZXQgcG9ydGFibGVuYW1lIGZvciAiICsgcmVzb3VyY2UpOwotICAgIHJldHVybiByZXNvdXJjZS5nZXRQcm9qZWN0UmVsYXRpdmVQYXRoKCkudG9TdHJpbmcoKTsKLSAgfQotCi0vKioKLSAqIFdoZW4gYW4gSVZhbGlkYXRvciBhc3NvY2lhdGVzIGEgdGFyZ2V0IG9iamVjdCB3aXRoIGFuIElNZXNzYWdlLAotICogdGhlIFdvcmtiZW5jaFJlcG9ydGVyIGV2ZW50dWFsbHkgcmVzb2x2ZXMgdGhhdCB0YXJnZXQgb2JqZWN0Ci0gKiB3aXRoIGFuIElSZXNvdXJjZS4gU29tZXRpbWVzIG1vcmUgdGhhbiBvbmUgdGFyZ2V0IG9iamVjdCByZXNvbHZlcwotICogdG8gdGhlIHNhbWUgSVJlc291cmNlICh1c3VhbGx5IHRoZSBJUHJvamVjdCwgd2hpY2ggaXMgdGhlIGRlZmF1bHQKLSAqIElSZXNvdXJjZSB3aGVuIGFuIElGaWxlIGNhbm5vdCBiZSBmb3VuZCkuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCwKLSAqIGJ5IHRoZSBXb3JrYmVuY2hSZXBvcnRlciwgc28gdGhhdCB0aGUgV29ya2JlbmNoUmVwb3J0ZXIgY2FuIAotICogZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aGUgSU1lc3NhZ2VzIHdoaWNoIGFyZSBvbiB0aGUgc2FtZSBJUmVzb3VyY2UsIAotICogYnV0IHJlZmVyIHRvIGRpZmZlcmVudCB0YXJnZXQgb2JqZWN0cy4gVGhpcyBpcyBuZWVkZWQgZm9yIHRoZSAKLSAqIHJlbW92ZUFsbE1lc3NhZ2VzKElWYWxpZGF0b3IsIE9iamVjdCkgbWV0aG9kLCBzbyB0aGF0IHdoZW4gb25lCi0gKiB0YXJnZXQgb2JqZWN0IHJlbW92ZXMgYWxsIG9mIGl0cyBtZXNzYWdlcywgdGhhdCBpdCBkb2Vzbid0IHJlbW92ZQotICogYW5vdGhlciB0YXJnZXQgb2JqZWN0J3MgbWVzc2FnZXMuCi0gKgotICogVGhpcyBtZXRob2QgbWF5IHJldHVybiBudWxsIG9ubHkgaWYgb2JqZWN0IGlzIG51bGwuIE90aGVyd2lzZSwgYW4KLSAqIGlkIHdoaWNoIGNhbiB1bmlxdWVseSBpZGVudGlmeSBhIHBhcnRpY3VsYXIgb2JqZWN0IG11c3QgYmUgcmV0dXJuZWQuCi0gKiBUaGUgaWQgbmVlZHMgdG8gYmUgdW5pcXVlIG9ubHkgd2l0aGluIG9uZSBwYXJ0aWN1bGFyIElWYWxpZGF0b3IuCi0gKiAKLSAqIEBwYXJhbSBvYmplY3QgVGhlIG9iamVjdCBmcm9tIHdoaWNoIHRvIGdldCB0aGUgbmFtZS4KLSAqIEByZXR1cm4gVGhlIG5hbWUgb2YgdGhlIG9iamVjdCBvciBudWxsIGlmIHRoZSBvYmplY3QgaXMgbnVsbC4KLSAqLwotcHVibGljIFN0cmluZyBnZXRUYXJnZXRPYmplY3ROYW1lKE9iamVjdCBvYmplY3QpCi0gIHsKLSAgICBpZiAob2JqZWN0ID09IG51bGwpIAotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICAKLSAgICAvLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oImdldCB0YXJnZXRuYW1lIGZvciAiICsgb2JqZWN0KTsKLSAgICByZXR1cm4gb2JqZWN0LnRvU3RyaW5nKCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBEZWxldGUgdGhlIG1hcmtlcnMgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGZyb20gdGhlIHNwZWNpZmllZCByZXNvdXJjZS4KLSAgICogCi0gICAqIEBwYXJhbSByZXNvdXJjZSBUaGUgcmVzb3VyY2UgdG8gZGVsZXRlIHRoZSBtYXJrZXJzIGZyb20uCi0gICAqIEBwYXJhbSBtYXJrZXJUeXBlIFRoZSB0eXBlIG9mIG1hcmtlcnMgdG8gZGVsZXRlIGZyb20gdGhlIHJlc291cmNlLgotICAgKiBAcGFyYW0gYXR0cmlidXRlTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHdoaWNoIHRoZSBtYXJrZXJzIG11c3QgaGF2ZSB0byBiZSBkZWxldGVkLgotICAgKiBAcGFyYW0gYXR0cmlidXRlVmFsdWUgVGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgY29ycmVzcG9uZGluZyB0byBhdHRyaWJ1dGVOYW1lIHdoaWNoIHRoZSBtYXJrZXJzIG11c3QgaGF2ZSB0byBiZSBkZWxldGVkLgotICAgKiBAdGhyb3dzIENvcmVFeGNlcHRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWxldGVNYXJrZXJzKElSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIG1hcmtlclR5cGUsIGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVOYW1lLCBmaW5hbCBPYmplY3QgYXR0cmlidXRlVmFsdWUpIHRocm93cyBDb3JlRXhjZXB0aW9uCi0gIHsgICAgICAgICAgCi0gICAgZmluYWwgSU1hcmtlcltdIHY0MDBNYXJrZXJzID0gcmVzb3VyY2UuZmluZE1hcmtlcnMoSU1hcmtlci5QUk9CTEVNLCBmYWxzZSwgSVJlc291cmNlLkRFUFRIX0lORklOSVRFKTsKLSAgICBmaW5hbCBJTWFya2VyW10gbWFya2VycyA9IHJlc291cmNlLmZpbmRNYXJrZXJzKG1hcmtlclR5cGUsIHRydWUsIElSZXNvdXJjZS5ERVBUSF9JTkZJTklURSk7Ci0gICAgSVdvcmtzcGFjZVJ1bm5hYmxlIG9wID0gbmV3IElXb3Jrc3BhY2VSdW5uYWJsZSgpIAotICAgICB7Ci0gICAgICAgcHVibGljIHZvaWQgcnVuKElQcm9ncmVzc01vbml0b3IgcHJvZ3Jlc3NNb25pdG9yKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiAKLSAgICAgICB7ICAgIAotICAgICAgICAgLy8gdGhpcyBmaXhlcyBkZWZlY3QgMTkzNDA2Ci0gICAgICAgICAvLyBoZXJlIHdlIHJlbW92ZSBtYXJrZXJzIHRoYXQgbWF5IGhhdmUgYmVlbiBhZGRlZCBieSB0aGUgdjQwMCBjb2RlCi0gICAgICAgICAvLyBob3BlZnVsbHkgdGhlICcubWFya2VycycgbWV0YWRhdGEgZmlsZXMgd2lsbCBiZSByZW1vdmVkIGZvciB0aGUgVjUgaW5zdGFsbAotICAgICAgICAgLy8gYW5kIHRoaXMga2x1ZGdlIHdpbGwgbm90IGJlIG5lZWRlZCB0aGVyZQotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2NDAwTWFya2Vycy5sZW5ndGg7IGkrKykKLSAgICAgICAgIHsKLSAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOyAgICAgICAgICAgCi0gICAgICAgICAgIG1hcmtlci5kZWxldGUoKTsgICAgICAgICAgIAotICAgICAgICAgfQotICAgIAotICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSAKLSAgICAgICAgIHsKLSAgICAgICAgICAgSU1hcmtlciBtYXJrZXIgPSBtYXJrZXJzW2ldOwotICAgICAgICAgICAKLSAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFya2VyLmdldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lKTsKLSAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgIHZhbHVlLmVxdWFscyhhdHRyaWJ1dGVWYWx1ZSkpIAotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgbWFya2VyLmRlbGV0ZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgICB9Ci0gICAgICAgfQotICAgICB9OwotICAgIAotICAgIHRyeQotICAgIHsKLSAgICAgIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5ydW4ob3AsIG51bGwpOwotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzZXZlcml0eSBmb3IgdGhlIGdpdmVuIHNldmVyaXR5LgotICAgKiAKLSAgICogQHBhcmFtIHNldmVyaXR5IFRoZSBzZXZlcml0eSB0byBjb252ZXJ0IHRvIHZhbGlkYXRpb24gZnJhbWV3b3JrIHNldmVyaXR5LgotICAgKiBAcmV0dXJuIFRoZSB2YWxpZGF0aW9uIGZyYW1ld29yayBzZXZlcml0eSBmb3IgdGhlIGdpdmVuIHNldmVyaXR5LgotICAgKi8KLSAgc3RhdGljIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGlvbkZyYW1ld29ya1NldmVyaXR5KGludCBzZXZlcml0eSkKLSAgewotICAgIHN3aXRjaCAoc2V2ZXJpdHkpCi0gICAgewotICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0VSUk9SOgotICAgICAgICByZXR1cm4gSU1lc3NhZ2UuSElHSF9TRVZFUklUWTsKLSAgICAgIGNhc2UgSU1hcmtlci5TRVZFUklUWV9XQVJOSU5HOgotICAgICAgICByZXR1cm4gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICAgICAgY2FzZSBJTWFya2VyLlNFVkVSSVRZX0lORk86Ci0gICAgICAgIHJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7Ci0gICAgfQotICAgIHJldHVybiBJTWVzc2FnZS5MT1dfU0VWRVJJVFk7ICAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9MYXp5VVJMSW5wdXRTdHJlYW0uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTGF6eVVSTElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNGNiMGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9MYXp5VVJMSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyBhbGxvd3MgSW5wdXRTdHJlYW1zIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIHRvIHhlcmNlcyB3aXRob3V0Ci0gKiBhY3R1YWxseSBvcGVuaW5nIGZpbGUgaGFuZGxlcyBvciBuZXR3b3JrIGNvbm5lY3Rpb25zIHVudGlsIGl0IGlzIGFic29sdXRlbHkKLSAqIG5lY2Nlc3NhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5VVJMSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbQoteyAgCi0gIHByaXZhdGUgc3RhdGljIGludCBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50ID0gMDsgCi0gIHByb3RlY3RlZCBJbnB1dFN0cmVhbSBpbm5lcjsKLSAgcHJvdGVjdGVkIFN0cmluZyB1cmw7Ci0gIHByb3RlY3RlZCBib29sZWFuIGVycm9yOwotICBib29sZWFuIGhhc01hcmtzOwotICBib29sZWFuIHByZXRlbmRGaWxlSXNTdGlsbE9wZW47Ci0KLSAgcHVibGljIExhenlVUkxJbnB1dFN0cmVhbShTdHJpbmcgdXJsKQotICB7Ci0gICAgdGhpcy51cmwgPSB1cmw7Ci0JaW5uZXIgPSBudWxsOwotCXByZXRlbmRGaWxlSXNTdGlsbE9wZW4gPSBmYWxzZTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChpbm5lciA9PSBudWxsICYmICFlcnJvcikKLSAgICB7Ci0gICAgICBkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50Kys7Ci0gICAgCi0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgaW5uZXIgPSBuZXcgVVJMKHVybCkub3BlblN0cmVhbSgpOwotCQlwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuID0gZmFsc2U7Ci0JCWhhc01hcmtzID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5IAotICAgICAgewotICAgICAgICBpZiAoaW5uZXIgPT0gbnVsbCkKLSAgICAgICAgeyAgCi0gICAgICAgICAgZXJyb3IgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjbG9zZVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWlmIChpbm5lciAhPSBudWxsICYmICFwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSB7Ci0JCQlpbm5lci5jbG9zZSgpOwotCQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IHRydWU7Ci0JCX0KLSAgCX0KLQotICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAwOwotCWNyZWF0ZUlubmVyU3RyZWFtSWZSZXF1aXJlZCgpOwotCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gaW5uZXIuYXZhaWxhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHsKLQkJLy8gU3RvcCBiZWhhdmluZyBhcyBpZiB0aGUgc3RyZWFtIHdlcmUgc3RpbGwgb3Blbi4KLQkJcHJldGVuZEZpbGVJc1N0aWxsT3BlbiA9IGZhbHNlOwotCX0gZWxzZSB7Ci0JCWlmIChpbm5lciAhPSBudWxsKSB7Ci0JCQlkZWJ1Z1RvdGFsT3BlblN0cmVhbUNvdW50LS07Ci0JCQlpbm5lci5jbG9zZSgpOwotCQl9Ci0JfQotICB9Ci0KLSAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KQotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybjsKLQloYXNNYXJrcyA9IHRydWU7Ci0JdHJ5IHsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlubmVyLm1hcmsocmVhZGxpbWl0KTsKLQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgY2F0Y2ggYmxvY2sKLQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQl9Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkKLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gZmFsc2U7Ci0JdHJ5IHsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpbm5lci5tYXJrU3VwcG9ydGVkKCk7Ci0JfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIGNhdGNoIGJsb2NrCi0JCWUucHJpbnRTdGFja1RyYWNlKCk7Ci0JfQotCXJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0JaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAtMTsKLQljcmVhdGVJbm5lclN0cmVhbUlmUmVxdWlyZWQoKTsKLQlpZiAoaW5uZXIgPT0gbnVsbCkgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gbm90IGF2YWlsYWJsZSIpOyAvLyROT04tTkxTLTEkCi0JaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoKTsKLQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQlyZXR1cm4gYnl0ZXNSZWFkOwotICB9Ci0KLQotCXB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKHByZXRlbmRGaWxlSXNTdGlsbE9wZW4pIHJldHVybiAtMTsKLQkJY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JCWlmIChpbm5lciA9PSBudWxsKSB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlN0cmVhbSBub3QgYXZhaWxhYmxlIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGJ5dGVzUmVhZCA9IGlubmVyLnJlYWQoYik7Ci0JCWlmIChieXRlc1JlYWQgPT0gLTEgJiYgIWhhc01hcmtzKSBjbG9zZVN0cmVhbSgpOwotCQlyZXR1cm4gYnl0ZXNSZWFkOwotCX0KLQotICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7ICAgIAotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm4gLTE7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCWludCBieXRlc1JlYWQgPSBpbm5lci5yZWFkKGIsIG9mZiwgbGVuKTsKLQlpZiAoYnl0ZXNSZWFkID09IC0xICYmICFoYXNNYXJrcykgY2xvc2VTdHJlYW0oKTsKLQlyZXR1cm4gYnl0ZXNSZWFkOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCWlmIChwcmV0ZW5kRmlsZUlzU3RpbGxPcGVuKSByZXR1cm47Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCWlubmVyLnJlc2V0KCk7Ci0gIH0KLQotICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsgICAKLQlpZiAocHJldGVuZEZpbGVJc1N0aWxsT3BlbikgcmV0dXJuIDA7Ci0JY3JlYXRlSW5uZXJTdHJlYW1JZlJlcXVpcmVkKCk7Ci0JaWYgKGlubmVyID09IG51bGwpIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIG5vdCBhdmFpbGFibGUiKTsgLy8kTk9OLU5MUy0xJAotCXJldHVybiBpbm5lci5za2lwKG4pOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL05lc3RlZFZhbGlkYXRvckNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzI3MTBhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvTmVzdGVkVmFsaWRhdG9yQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmU7Ci0KLQotLyoqCi0gKiBBIGNvbnRleHQgY2xhc3MgZm9yIHZhbGlkYXRvcnMgdG8gYmUgYWJsZSB0byBkZXRlcm1pbmUgdGhlIGNvbnRleHQgb2YKLSAqIGdpdmVuIHZhbGlkYXRpb24gc2Vzc2lvbi4gQ3VycmVudGx5IHRoaXMgY2xhc3MgaXMgb25seSB1c2VkIHRvIGlkZW50aWZ5Ci0gKiB0aGUgdW5pcXVlIGNvbnRleHQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IAotewotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uSW5mby5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uSW5mby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTJlMWE1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbkluZm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdGlvbk1lc3NhZ2VzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaGFuZGxlcyBtZXNzYWdlcyBmcm9tIGEgdmFsaWRhdG9yLiBUaGlzIGNsYXNzIGNhbiBoYW5kbGUKLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgVmFsaWRhdGlvbkluZm8gaW1wbGVtZW50cyBWYWxpZGF0aW9uUmVwb3J0Ci17Ci0gIHByaXZhdGUgYm9vbGVhbiBXUkFQUEVSX0VSUk9SX1NVUFBPUlRfRU5BQkxFRCA9IHRydWU7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFNFVl9FUlJPUiA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgaW50IFNFVl9XQVJOSU5HID0gMTsKLSAgCi0gIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRpbmdfZmlsZV91cmkgPSBudWxsOwotICBwcml2YXRlIFVSTCB2YWxpZGF0aW5nX2ZpbGVfdXJsID0gbnVsbDsKLSAgcHJpdmF0ZSBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLSAgcHJpdmF0ZSBMaXN0IG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdCgpOwotICBwcml2YXRlIEhhc2hNYXAgbmVzdGVkTWVzc2FnZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogICAgICAgICAgICBUaGUgVVJJIG9mIHRoZSBmaWxlIGZvciB0aGUgdmFsaWRhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uSW5mbyhTdHJpbmcgdXJpKQotICB7Ci0gICAgaWYodXJpICE9IG51bGwpCi0gICAgewotICAgICAgdGhpcy52YWxpZGF0aW5nX2ZpbGVfdXJpID0gdXJpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIHRoaXMudmFsaWRhdGluZ19maWxlX3VybCA9IG5ldyBVUkwodXJpKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgICAgewotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZVVSSSgpCi0gIHsKLSAgICByZXR1cm4gdmFsaWRhdGluZ19maWxlX3VyaTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKQotICB7Ci0gICAgcmV0dXJuIHZhbGlkOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSkKLSAgewotICAgIGFkZEVycm9yKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBudWxsLCBudWxsKTsKLSAgfSAgCi0gIAotICAvKioKLSAgICogCi0gICAqIEFkZCBhbiBlcnJvciBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UgdG8gYWRkLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGtleSBUaGUga2V5IGZvciB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZSwgaW50IGNvbHVtbiwgU3RyaW5nIHVyaSwgU3RyaW5nIGtleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgeyAgICAKLSAgICBpZihhZGRNZXNzYWdlKG1lc3NhZ2UsIGxpbmUsIGNvbHVtbiwgdXJpLCBTRVZfRVJST1IsIGtleSwgbWVzc2FnZUFyZ3VtZW50cykpCi0gICAgewotICAgICAgdmFsaWQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgd2FybmluZyBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIHN0cmluZyBtZXNzYWdlIG9mIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gbGluZSBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgd2FybmluZy4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB3YXJuaW5nLgotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgd2FybmluZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFdhcm5pbmcoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgYWRkV2FybmluZyhtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgbnVsbCwgbnVsbCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiAKLSAgICogQWRkIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgZm9yIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3VtZW50cyBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvcgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkV2FybmluZyhTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIFN0cmluZyBrZXksIE9iamVjdFtdIG1lc3NhZ2VBcmd1bWVudHMpCi0gIHsgICAgCi0gICAgYWRkTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSwgU0VWX1dBUk5JTkcsIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGQgYSBtZXNzYWdlIHRvIHRoZSBsaXN0LiBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBhZGQgdG8gdGhlIGxpc3QuCi0gICAqIEBwYXJhbSBsaW5lIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gY29sdW1uIFRoZSBjb2x1bW4gbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0ga2V5IHRoZSBYZXJjZXMgZXJyb3Iga2V5IGZvciB0aGlzIGVycm9yCi0gICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGVycm9yCi0gICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgbWVzc2FnZSB3YXMgc3VjY2Vzc2Z1bGx5IGFkZGVkLCBmYWxzZSBvdGhlcndpc2UuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gYWRkTWVzc2FnZShTdHJpbmcgbWVzc2FnZSwgaW50IGxpbmUsIGludCBjb2x1bW4sIFN0cmluZyB1cmksIGludCBzZXZlcml0eSwgU3RyaW5nIGtleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgewotICAgIGJvb2xlYW4gc3VjY2Vzc2Z1bGx5QWRkZWQgPSBmYWxzZTsKLSAgICAvLyBJZiB0aGUgbWVzc2FnZSBpZiBudWxsIHRoZXJlIGlzIG5vdGhpbmcgdG8gYWRkLgotICAgIGlmKG1lc3NhZ2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5QWRkZWQ7Ci0gICAgfQotICAgIFN0cmluZyBlcnJvclVSSSA9IG5vcm1hbGl6ZSh1cmkpOwotICAgIFVSTCBlcnJvclVSTCA9IG51bGw7Ci0gICAgaWYgKGVycm9yVVJJICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGVycm9yVVJMID0gbmV3IFVSTChlcnJvclVSSSk7Ci0gICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgIH0KLSAgICAgIC8vZXJyb3JVUkkgPSBub3JtYWxpemVVUkkoZXJyb3JVUkkpOwotICAgIH0KLSAgICAvL2Jvb2xlYW4gZG9EaWFsb2cgPSB0cnVlOwotICAgIGlmIChlcnJvclVSTCAhPSBudWxsKQotICAgIHsKLSAgICAgIHN1Y2Nlc3NmdWxseUFkZGVkID0gdHJ1ZTsKLSAgICAgIC8vIEFkZCB0byB0aGUgYXBwcm9wcmlhdGUgbGlzdCBpZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBvZmYgb3IKLSAgICAgIC8vIHRoaXMgbWVzc2FnZSBpcyBmb3IgdGhlIGN1cnJlbnQgZmlsZS4KLSAgICAgIGlmICghV1JBUFBFUl9FUlJPUl9TVVBQT1JUX0VOQUJMRUQgfHwgdmFsaWRhdGluZ19maWxlX3VybC5zYW1lRmlsZShlcnJvclVSTCkpCi0gICAgICB7Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgdmFsbWVzID0gbmV3IFZhbGlkYXRpb25NZXNzYWdlKG1lc3NhZ2UsIGxpbmUsCi0gICAgICAgICAgICBjb2x1bW4sIHZhbGlkYXRpbmdfZmlsZV91cmksIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgICAgIGlmIChzZXZlcml0eSA9PSBTRVZfRVJST1IpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxtZXMuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX05PUk1BTCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2V2ZXJpdHkgPT0gU0VWX1dBUk5JTkcpCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxtZXMuc2V0U2V2ZXJpdHkoVmFsaWRhdGlvbk1lc3NhZ2UuU0VWX0xPVyk7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZXMuYWRkKHZhbG1lcyk7Ci0gICAgICB9Ci0gICAgICAvLyBJZiBuZXN0ZWQgZXJyb3Igc3VwcG9ydCBpcyBlbmFibGVkIGNyZWF0ZSBhIG5lc3RlZCBlcnJvci4KLSAgICAgIGVsc2UgaWYgKFdSQVBQRVJfRVJST1JfU1VQUE9SVF9FTkFCTEVEKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmVzdGVkdXJpID0gZXJyb3JVUkwudG9FeHRlcm5hbEZvcm0oKTsKLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgbmVzdGVkbWVzcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLAotICAgICAgICAgICAgY29sdW1uLCBuZXN0ZWR1cmksIGtleSwgbWVzc2FnZUFyZ3VtZW50cyk7Ci0gICAgICAgIGlmKHNldmVyaXR5ID09IFNFVl9XQVJOSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBuZXN0ZWRtZXNzLnNldFNldmVyaXR5KFZhbGlkYXRpb25NZXNzYWdlLlNFVl9OT1JNQUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgY29udGFpbmVyID0gKFZhbGlkYXRpb25NZXNzYWdlKSBuZXN0ZWRNZXNzYWdlcy5nZXQobmVzdGVkdXJpKTsKLSAgICAgICAgaWYoY29udGFpbmVyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBjb250YWluZXIgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoTkxTLmJpbmQoWE1MVmFsaWRhdGlvbk1lc3NhZ2VzLl9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFLCBuZXcgT2JqZWN0IFtdIHsgbmVzdGVkdXJpIH0pLCAxLCAwLCBuZXN0ZWR1cmkpOwotICAgICAgIAotICAgICAgICAgIC8vIEluaXRpYWxseSBzZXQgdGhlIG5lc3RlZCBlcnJvciB0byBhIHdhcm5pbmcuIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGNoYW5nZWQKLSAgICAgICAgICAvLyB0byBhbiBlcnJvciBpZiBhIG5lc3RlZCBtZXNzYWdlIGhhcyBhIHNldmVyaXR5IG9mIGVycm9yLgotICAgICAgICAgIGNvbnRhaW5lci5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLSAgICAgICAgICBuZXN0ZWRNZXNzYWdlcy5wdXQobmVzdGVkdXJpLCBjb250YWluZXIpOwotICAgICAgICAgIG1lc3NhZ2VzLmFkZChjb250YWluZXIpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRhaW5lci5hZGROZXN0ZWRNZXNzYWdlKG5lc3RlZG1lc3MpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gc3VjY2Vzc2Z1bGx5QWRkZWQ7Ci0gIH0KLSAgCi0gIAotICAvKioKLSAgICogQWRkIGEgbmVzdGVkIG1lc3NhZ2UgdG8gdGhlIHZhbGlkYXRpb24gaW5mb3JtYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgc3RyaW5nIG1lc3NhZ2Ugb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmUgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbiBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSB1cmkgVGhlIFVSSSBvZiB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lLCBpbnQgY29sdW1uLCBTdHJpbmcgdXJpLCBpbnQgc2V2ZXJpdHkpCi0vLyAgewotLy8gICAgVmFsaWRhdGlvbk1lc3NhZ2UgbmVzdGVkbWVzcyA9IG5ldyBWYWxpZGF0aW9uTWVzc2FnZShtZXNzYWdlLCBsaW5lLCBjb2x1bW4sIHVyaSk7Ci0vLyAgICBpZihzZXZlcml0eSA9PSBTRVZfV0FSTklORykKLS8vICAgIHsKLS8vICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLS8vICAgIH0KLS8vICAgIGVsc2UKLS8vICAgIHsKLS8vICAgICAgbmVzdGVkbWVzcy5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTk9STUFMKTsKLS8vICAgIH0KLS8vICAgIFZhbGlkYXRpb25NZXNzYWdlIGNvbnRhaW5lciA9IChWYWxpZGF0aW9uTWVzc2FnZSluZXN0ZWRNZXNzYWdlcy5nZXQodXJpKTsKLS8vICAgIGlmKGNvbnRhaW5lciA9PSBudWxsKQotLy8gICAgewotLy8gICAgICBjb250YWluZXIgPSBuZXcgVmFsaWRhdGlvbk1lc3NhZ2UoWE1MQ29yZVZhbGlkYXRpb25QbHVnaW4uZ2V0UmVzb3VyY2VTdHJpbmcoX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UsIHVyaSksIDEsIDAsIHZhbGlkYXRpbmdfZmlsZV91cmkpOwotLy8gICAgICAvLyBJbml0aWFsbHkgc2V0IHRoZSBuZXN0ZWQgZXJyb3IgdG8gYSB3YXJuaW5nLiBUaGlzIHdpbGwgYXV0b21hdGljYWxseSBiZSBjaGFuZ2VkCi0vLyAgICAgIC8vIHRvIGFuIGVycm9yIGlmIGEgbmVzdGVkIG1lc3NhZ2UgaGFzIGEgc2V2ZXJpdHkgb2YgZXJyb3IuCi0vLyAgICAgIGNvbnRhaW5lci5zZXRTZXZlcml0eShWYWxpZGF0aW9uTWVzc2FnZS5TRVZfTE9XKTsKLS8vICAgICAgbmVzdGVkTWVzc2FnZXMucHV0KHVyaSwgY29udGFpbmVyKTsKLS8vICAgICAgbWVzc2FnZXMuYWRkKGNvbnRhaW5lcik7Ci0vLyAgICB9Ci0vLyAgICBjb250YWluZXIuYWRkTmVzdGVkTWVzc2FnZShuZXN0ZWRtZXNzKTsKLS8vICB9Ci0KLSAgLyoqCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3NkbC52YWxpZGF0ZS5WYWxpZGF0aW9uUmVwb3J0I2dldFZhbGlkYXRpb25NZXNzYWdlcygpCi0gICAqLwotICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2VbXSBnZXRWYWxpZGF0aW9uTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIChWYWxpZGF0aW9uTWVzc2FnZVtdKW1lc3NhZ2VzLnRvQXJyYXkobmV3IFZhbGlkYXRpb25NZXNzYWdlW21lc3NhZ2VzLnNpemUoKV0pOwotICB9Ci0KLSAgcHVibGljIEhhc2hNYXAgZ2V0TmVzdGVkTWVzc2FnZXMoKQotICB7Ci0gICAgcmV0dXJuIG5lc3RlZE1lc3NhZ2VzOwotICB9Ci0gIAotICAvKioKLSAgICogUHV0IHRoZSBVUkkgaW4gYSBzdGFuZGFyZCBmb3JtYXQuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIFRoZSBVUkkgdG8gcHV0IGludG8gYSBzdGFuZGFyZCBmb3JtYXQuCi0gICAqIEByZXR1cm4gVGhlIHN0YW5kYXJkIGZvcm1hdCBvZiB0aGUgVVJJLgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbm9ybWFsaXplKFN0cmluZyB1cmkpCi0gIHsKLS8vICAgIGlmKHVyaS5zdGFydHNXaXRoKCJwbGF0Zm9ybToiKSkKLS8vICAgIHsKLS8vICAgICAgdHJ5Ci0vLyAgICAgIHsKLS8vICAgICAgICB1cmkgPSBQbGF0Zm9ybS5yZXNvbHZlKG5ldyBVUkwodXJpKSkudG9TdHJpbmcoKTsKLS8vICAgICAgfQotLy8gICAgICBjYXRjaChFeGNlcHRpb24gZSkKLS8vICAgICAgewotLy8gICAgICB9Ci0vLyAgICB9Ci0gICAgdXJpID0gdXJpLnJlcGxhY2VBbGwoIiUyMCIsIiAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgdXJpID0gdXJpLnJlcGxhY2VBbGwoIiU1RSIsICJeIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIHVyaSA9IHVyaS5yZXBsYWNlKCdcXCcsJy8nKTsKLSAgICAKLSAgICByZXR1cm4gdXJpOwotICB9Ci0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzY0ZDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvVmFsaWRhdGlvbk1lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlF1YWxpZmllZE5hbWU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLQotLyoqCi0gKiBBIGNsYXNzIGZvciBob2xkaW5nIHZhbGlkYXRpb24gbWVzc2FnZSBpbmZvcm1hdGlvbi4gSG9sZHMgdGhlIG1lc3NhZ2UgYW5kIHRoZQotICogbWVzc2FnZSBsb2NhdGlvbi4KLSAqLwotcHVibGljIGNsYXNzIFZhbGlkYXRpb25NZXNzYWdlCi17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGlmaWVkTmFtZSBFUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSA9IG5ldyBRdWFsaWZpZWROYW1lKCJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24iLCAiZXJyb3JNZXNzYWdlTWFwIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICBwcm90ZWN0ZWQgU3RyaW5nIG1lc3NhZ2U7Ci0gIHByb3RlY3RlZCBpbnQgbGluZU51bWJlcjsKLSAgcHJvdGVjdGVkIGludCBjb2x1bW5OdW1iZXI7Ci0gIHByb3RlY3RlZCBTdHJpbmcgdXJpOwotICBwcm90ZWN0ZWQgTGlzdCBuZXN0ZWRFcnJvcnM7Ci0gIHByb3RlY3RlZCBTdHJpbmcga2V5OwotICBwcm90ZWN0ZWQgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50czsKLSAgcHJvdGVjdGVkIGludCBzdGFydE9mZnNldDsKLSAgcHJvdGVjdGVkIGludCBzZXZlcml0eSA9IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWTsKLSAgcHVibGljIHN0YXRpYyBpbnQgU0VWX0hJR0ggPSBJTWVzc2FnZS5ISUdIX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfTk9STUFMID0gSU1lc3NhZ2UuTk9STUFMX1NFVkVSSVRZOwotICBwdWJsaWMgc3RhdGljIGludCBTRVZfTE9XID0gSU1lc3NhZ2UuTE9XX1NFVkVSSVRZOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4KLSAgICogCi0gICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIGZvciB0aGUgdmFsaWRhdGlvbiBtZXNzYWdlLgotICAgKiBAcGFyYW0gbGluZU51bWJlciBUaGUgbGluZSBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlKFN0cmluZyBtZXNzYWdlLCBpbnQgbGluZU51bWJlciwgaW50IGNvbHVtbk51bWJlcikKLSAgewotICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCBudWxsKTsKLSAgfQotCi0gIC8qKiAKLSAgICogQ29uc3RydWN0b3IuCi0gICAqIAotICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICogQHBhcmFtIGxpbmVOdW1iZXIgVGhlIGxpbmUgbG9jYXRpb24gb2YgdGhlIG1lc3NhZ2UuCi0gICAqIEBwYXJhbSBjb2x1bW5OdW1iZXIgVGhlIGNvbHVtbiBsb2NhdGlvbiBvZiB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICovCi0gICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpKQotICB7Ci0gICAgIHRoaXMobWVzc2FnZSwgbGluZU51bWJlciwgY29sdW1uTnVtYmVyLCB1cmksIG51bGwsIG51bGwpOwotICB9Ci0gICAKLSAgIC8qKiAKLSAgICAqIENvbnN0cnVjdG9yLgotICAgICogCi0gICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSBmb3IgdGhlIHZhbGlkYXRpb24gbWVzc2FnZS4KLSAgICAqIEBwYXJhbSBsaW5lTnVtYmVyIFRoZSBsaW5lIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIGNvbHVtbk51bWJlciBUaGUgY29sdW1uIGxvY2F0aW9uIG9mIHRoZSBtZXNzYWdlLgotICAgICogQHBhcmFtIHVyaSBUaGUgdXJpIG9mIHRoZSBmaWxlIHRoZSBtZXNzYWdlIGlzIGZvci4KLSAgICAqIEBwYXJhbSBrZXkgYSB1bmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZXJyb3IKLSAgICAqIEBwYXJhbSBtZXNzYWdlQXJndW1lbnRzIHRoZSBhcmd1bWVudHMgWGVyY2VzIHVzZXMgdG8gY3JlYXRlIHRoZSBtZXNzYWdlCi0gICAgKi8KLSAgICBwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UsIGludCBsaW5lTnVtYmVyLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgdXJpLCBTdHJpbmcga2V5LCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzKQotICAgewotICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgICB0aGlzLmxpbmVOdW1iZXIgPSBsaW5lTnVtYmVyOwotICAgICB0aGlzLmNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLSAgICAgdGhpcy51cmkgPSB1cmk7Ci0gICAgIHRoaXMua2V5ID0ga2V5OwotCSB0aGlzLm1lc3NhZ2VBcmd1bWVudHMgPSBtZXNzYWdlQXJndW1lbnRzOwotICAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gMDsgICAgCi0gICB9Ci0gICAKLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGZvciB0aGlzIHZhbGlhdGlvbiBtZXNzYWdlLgotICAgKiAKLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjb2x1bW4gbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBjb2x1bW4gbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb2x1bW5OdW1iZXIoKQotICB7Ci0gICAgcmV0dXJuIGNvbHVtbk51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpbmUgbG9jYXRpb24uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBsaW5lIG51bWJlci4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TGluZU51bWJlcigpCi0gIHsKLSAgICByZXR1cm4gbGluZU51bWJlcjsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIHVyaSBmb3IgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgbWVzc2FnZS4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIHVyaSBvZiB0aGUgZmlsZSB0aGF0IGNvbnRhaW5zIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRVcmkoKQotICB7Ci0gICAgcmV0dXJuIHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEFkZCBhIG5lc3RlZCB2YWxpZGF0aW9uIG1lc3NhZ2UgdG8gdGhpcyB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1lc3NhZ2UgVGhlIHZhbGlkYXRpb24gbWVzc2FnZSB0byBhZGQgYXMgYSBuZXN0ZWQgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZE5lc3RlZE1lc3NhZ2UoVmFsaWRhdGlvbk1lc3NhZ2UgdmFsaWRhdGlvbk1lc3NhZ2UpCi0gIHsKLSAgICBpZiAobmVzdGVkRXJyb3JzID09IG51bGwpCi0gICAgewotICAgICAgbmVzdGVkRXJyb3JzID0gbmV3IEFycmF5TGlzdCgpOwotICAgIH0KLSAgICBuZXN0ZWRFcnJvcnMuYWRkKHZhbGlkYXRpb25NZXNzYWdlKTsKLSAgICBpbnQgdmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgaWYodmFsaWRhaXRvbm1lc3NhZ2VTZXZlcml0eSA9PSBTRVZfTk9STUFMIHx8IHZhbGlkYWl0b25tZXNzYWdlU2V2ZXJpdHkgPT0gU0VWX0hJR0gpCi0gICAgewotICAgICAgc2V0U2V2ZXJpdHkoU0VWX05PUk1BTCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbGlzdCBvZiBuZXN0ZWQgdmFsaWRhdGlvbiBtZXNzYWdlcy4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXROZXN0ZWRNZXNzYWdlcygpCi0gIHsKLSAgICByZXR1cm4gbmVzdGVkRXJyb3JzICE9IG51bGwgPyBuZXN0ZWRFcnJvcnMgOiBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUOwotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBzZXZlcml0eSBvZiB0aGUgZGVmZWN0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgc2V2ZXJpdHkgb2YgdGhlIGRlZmVjdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2V2ZXJpdHkoKQotICB7Ci0gIAlyZXR1cm4gc2V2ZXJpdHk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBTZXQgdGhlIHNldmVyaXR5IG9mIHRoZSBtZXNzYWdlLgotICAgKiAKLSAgICogQHBhcmFtIHNldiBUaGUgc2V2ZXJpdHkgdG8gc2V0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0U2V2ZXJpdHkoaW50IHNldikKLSAgewotICAJc2V2ZXJpdHkgPSBzZXY7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHNldFN0YXJ0T2Zmc2V0KGludCBvZmZzZXQpCi0gIHsKLSAgICB0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotICB9Ci0gIAotICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBrZXkuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEtleSgpCi0gIHsKLSAgICByZXR1cm4ga2V5OwotICB9Ci0gIAotICBwdWJsaWMgT2JqZWN0W10gZ2V0TWVzc2FnZUFyZ3VtZW50cygpCi0gIHsKLQkgIHJldHVybiB0aGlzLm1lc3NhZ2VBcmd1bWVudHM7Ci0gIH0KLSAgCi0KLSAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkKLSAgewotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gIH0gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9WYWxpZGF0aW9uUmVwb3J0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwZTAyMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL1ZhbGlkYXRpb25SZXBvcnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBmb3IgYSB2YWxpZGF0aW9uIHJlcG9ydC4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXBvcnQKLXsKLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIFVSSSBmb3IgdGhlIGZpbGUgdGhlIHJlcG9ydCByZWZlcnMgdG8uCi0gICAqIAotICAgKiBAcmV0dXJuIFRoZSBVUkkgZm9yIHRoZSBmaWxlIHRoZSByZXBvcnQgcmVmZXJzIHRvLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRGaWxlVVJJKCk7Ci0gIAotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBmaWxlIGlzIHZhbGlkLiBUaGUgZmlsZSBtYXkgaGF2ZSB3YXJuaW5ncyBhc3NvY2lhdGVkIHdpdGggaXQuCi0gICAqIAotICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGZpbGUgaXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhbiBhcnJheSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKiAKLSAgICogQHJldHVybiBBbiBhcnJheSBvZiB2YWxpZGF0aW9uIG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25NZXNzYWdlW10gZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gIAotICBwdWJsaWMgSGFzaE1hcCBnZXROZXN0ZWRNZXNzYWdlcygpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvQ29tbWFuZExpbmVMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Db21tYW5kTGluZUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjQ5OTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Db21tYW5kTGluZUxvZ2dlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotLyoqCi0gKiBBIGxvZ2dlciB0aGF0IHdpbGwgcHJpbnQgbG9nIGluZm8gdG8gU3lzdGVtLm91dC4KLSAqIAotICogQGF1dGhvciBMYXdyZW5jZSBNYW5kZWwsIElCTQotICovCi1wdWJsaWMgY2xhc3MgQ29tbWFuZExpbmVMb2dnZXIgaW1wbGVtZW50cyBJTG9nZ2VyCi17Ci0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbihlcnJvcik7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIHdhcm5pbmcsIFRocm93YWJsZSBleGNlcHRpb24pCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4od2FybmluZyk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKGV4Y2VwdGlvbi50b1N0cmluZygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0VjbGlwc2VMb2dnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9FY2xpcHNlTG9nZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDY5NDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0VjbGlwc2VMb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotCi0KLS8qKgotICogQSBsb2dnZXIgdGhhdCB3aWxsIGxvZyB0byB0aGUgbG9nIGZpbGUgaW4gdGhlIGVjbGlwc2UgbWV0YWRhdGEgZGlyZWN0b3J5LgotICovCi1wdWJsaWMgY2xhc3MgRWNsaXBzZUxvZ2dlciBpbXBsZW1lbnRzIElMb2dnZXIKLXsKLSAgCi0gIHB1YmxpYyB2b2lkIGxvZ0Vycm9yKFN0cmluZyBlcnJvciwgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuRVJST1IsIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldEJ1bmRsZSgpLmdldFN5bWJvbGljTmFtZSgpLCBJU3RhdHVzLkVSUk9SLCBlcnJvciwgZXhjZXB0aW9uKSk7Ci0gIH0KLSAKLSAgcHVibGljIHZvaWQgbG9nV2FybmluZyhTdHJpbmcgd2FybmluZywgVGhyb3dhYmxlIGV4Y2VwdGlvbikKLSAgewotICAgIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldExvZygpLmxvZyhuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIElTdGF0dXMuV0FSTklORywgd2FybmluZywgZXhjZXB0aW9uKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2xvZ2dpbmcvSUxvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMmI4MzM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9JTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotLyoqCi0gKiBUaGUgaW50ZXJmYWNlIGZvciBhIHN0YW5kYXJkIGxvZ2dlci4gQWxsb3dzIGZvciBsb2dnaW5nIGVycm9ycyBhbmQgd2FybmluZ3MuCi0gKiAKLSAqIEBhdXRob3IgTGF3cmVuY2UgTWFuZGVsLCBJQk0KLSAqLwotcHVibGljIGludGVyZmFjZSBJTG9nZ2VyCi17Ci0gIC8qKgotICAgKiBMb2cgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICogCi0gICAqIEBwYXJhbSBlcnJvciBUaGUgZXJyb3IgbWVzc2FnZSB0byBsb2cuCi0gICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0byBsb2cuCi0gICAqLwotICBwdWJsaWMgdm9pZCBsb2dFcnJvcihTdHJpbmcgZXJyb3IsIFRocm93YWJsZSBleGNlcHRpb24pOwotCi0gIC8qKgotICAgKiBMb2cgYSB3YXJuaW5nIG1lc3NhZ2UuCi0gICAqIAotICAgKiBAcGFyYW0gd2FybmluZyBUaGUgd2FybmluZyBtZXNzYWdlIHRvIGxvZy4KLSAgICogQHBhcmFtIGV4Y2VwdGlvbiBUaGUgZXhjZXB0aW9uIHRvIGxvZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGxvZ1dhcm5pbmcoU3RyaW5nIHdhcm5pbmcsIFRocm93YWJsZSBleGNlcHRpb24pOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvbG9nZ2luZy9Mb2dnZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNDljNWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9sb2dnaW5nL0xvZ2dlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUubG9nZ2luZzsKLQotLyoqCi0gKiBUaGUgbG9nZ2VyIGZhY3RvcnkgYWxsb3dzIGZvciBzaW1wbGUgdXNlIG9mIHdoYXRldmVyIGxvZ2dpbmcgbWVjaGFuaXNtIGlzIGluCi0gKiBwbGFjZS4gVGhlIHRvb2wgY2FuIHNwZWNpZnkgYSBjdXN0b20gbG9nZ2luZyBjbGFzcyBhbmQgY2FuIHJlcXVlc3QgdGhlCi0gKiBsb2dnZXIgZnJvbSB0aGlzIGNsYXNzLgotICogCi0gKiBAYXV0aG9yIExhd3JlbmNlIE1hbmRlbCwgSUJNCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXJGYWN0b3J5Ci17Ci0gIHByaXZhdGUgc3RhdGljIElMb2dnZXIgICAgICBsb2dnZXIgICAgICAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyICBjbGFzc2xvYWRlciAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyAgICAgICBsb2dnZXJDbGFzcyAgICAgICA9IG51bGw7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBjb21tYW5kbGluZWxvZ2dlciA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5sb2dnaW5nLkNvbW1hbmRMaW5lTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZWNsaXBzZWxvZ2dlciAgICAgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUubG9nZ2luZy5FY2xpcHNlTG9nZ2VyIjsgLy8kTk9OLU5MUy0xJAotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgICAgICAgZGVmYXVsdGxvZ2dlciAgICAgPSBjb21tYW5kbGluZWxvZ2dlcjsKLQotICAvKioKLSAgICogR2V0IHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIGxvZ2dlci4KLSAgICogCi0gICAqIEByZXR1cm4gVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgbG9nZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBJTG9nZ2VyIGdldExvZ2dlckluc3RhbmNlKCkKLSAgewotICAgIGlmKGxvZ2dlciA9PSBudWxsKQotICAgIHsKLSAgICAgIGlmKGxvZ2dlckNsYXNzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmKGNsYXNzbG9hZGVyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IGNsYXNzbG9hZGVyLmxvYWRDbGFzcyhsb2dnZXJDbGFzcyk7Ci0gICAgICAgICAgICBsb2dnZXIgPSAoSUxvZ2dlcikgbGMubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYobG9nZ2VyID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobG9nZ2VyQ2xhc3MpOwotICAgICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZihsb2dnZXIgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICBDbGFzcyBsYyA9IExvZ2dlckZhY3RvcnkuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZGVmYXVsdGxvZ2dlcik7Ci0gICAgICAgICAgbG9nZ2VyID0gKElMb2dnZXIpIGxjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGxvZ2dlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTcGVjaWZ5IHRoZSBsb2dnZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZC4KLSAgICogCi0gICAqIEBwYXJhbSBjbGFzc25hbWUKLSAgICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgbG9nZ2VyIGNsYXNzLgotICAgKiBAcGFyYW0gbG9nZ2VyY2xhc3Nsb2FkZXIKLSAgICogICAgICAgICAgICBUaGUgY2xhc3Nsb2FkZXIgdG8gdXNlIHRvIGxvYWQgdGhlIGxvZ2dlci4gSWYgbnVsbCwgdGhlIGRlZmF1bHQKLSAgICogICAgICAgICAgICBjbGFzc2xvYWRlciB3aWxsIGJlIHVzZWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc3BlY2lmeUxvZ2dlcihTdHJpbmcgY2xhc3NuYW1lLCBDbGFzc0xvYWRlciBsb2dnZXJjbGFzc2xvYWRlcikKLSAgewotICAgIGxvZ2dlckNsYXNzID0gY2xhc3NuYW1lOwotICAgIGNsYXNzbG9hZGVyID0gbG9nZ2VyY2xhc3Nsb2FkZXI7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBkZWZhdWx0IGxvZ2dlciB0byB0aGUgZWNsaXBzZSBsb2dnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdXNlRWNsaXBzZUxvZ2dlcigpCi0gIHsKLSAgICBkZWZhdWx0bG9nZ2VyID0gZWNsaXBzZWxvZ2dlcjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9FcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGE2NDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklFeHRlbnNpb25Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb24uRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZTsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotLyoqCi0gKiBUaGlzIGNsYXNzIHJlYWRzIHRoZSBwbHVnLWluIG1hbmlmZXN0cyBhbmQgcmVnaXN0ZXJzIGVhY2ggZXh0ZW5zaW9uCi0gKiBlcnJvciBjdXN0b21pemVyIHdpdGggdGhlIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uUGx1Z2luUmVnaXN0cnlSZWFkZXIgewotCQotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZSI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9DTEFTUyA9ICJjbGFzcyI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9OQU1FU1BBQ0UgPSAibmFtZXNwYWNlIjsgLy8kTk9OLU5MUy0xJAotCSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImVycm9yQ3VzdG9taXplciI7IC8vJE5PTi1OTFMtMSQKLQkgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIHRhZ05hbWUgPSBFWFRFTlNJT05fUE9JTlRfSUQ7Ci0KLQkgIC8qKgotCSAgICogUmVhZCBmcm9tIHBsdWdpbiByZWdpc3RyeSBmb3IgdGhlIGVycm9yY3VzdG9taXplciBleHRlbnNpb24uCi0JICAgKi8KLQkgIHB1YmxpYyB2b2lkIHJlYWRSZWdpc3RyeSgpCi0JICB7Ci0JICAgIElFeHRlbnNpb25SZWdpc3RyeSBwbHVnaW5SZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JICAgIElFeHRlbnNpb25Qb2ludCBwb2ludCA9IHBsdWdpblJlZ2lzdHJ5LmdldEV4dGVuc2lvblBvaW50KFBMVUdJTl9JRCwgRVhURU5TSU9OX1BPSU5UX0lEKTsKLQkgICAgaWYgKHBvaW50ICE9IG51bGwpCi0JICAgIHsKLQkgICAgICBJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspCi0JICAgICAgewotCSAgICAgICAgcmVhZEVsZW1lbnQoZWxlbWVudHNbaV0pOwotCSAgICAgIH0KLQkgICAgfQotCSAgfQotCi0JICAvKioKLQkgICAqIHJlYWRFbGVtZW50KCkgLSBwYXJzZSBhbmQgZGVhbCB3aXRoIGFuIGV4dGVuc2lvbiBsaWtlOgotCSAgICoKLQkgICAqIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5lcnJvckN1c3RvbWl6ZXIiCi0JICAgKiAgICAgICAgICAgIGlkPSJzcGVjaWZpY0Vycm9yQ3VzdG9taXplciIKLQkgICAqICAgICAgICAgICAgbmFtZT0iU3BlY2lmaWMgRXJyb3IgQ3VzdG9taXplciI+Ci0JICAgKiAgIDxlcnJvckN1c3RvbWl6ZXIKLQkgICAqICAgCQkJbmFtZXNwYWNlPSJodHRwOi8vc3BlY2lmaWNuYW1lc3BhY2UiCi0JICAgKiAgIAkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuTXlTcGVjaWZpY0Vycm9yQ3VzdG9taXplci8+Ci0JICAgKiA8L2V4dGVuc2lvbj4KLQkgICAqLwotCSAgcHJvdGVjdGVkIHZvaWQgcmVhZEVsZW1lbnQoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpCi0JICB7Ci0JICAgIGlmIChlbGVtZW50LmdldE5hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0JICAgIHsKLQkgICAgICBTdHJpbmcgZXJyb3JDdXN0b21pemVyQ2xhc3MgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfQ0xBU1MpOwotCSAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfTkFNRVNQQUNFKTsKLQotCSAgICAgIGlmIChlcnJvckN1c3RvbWl6ZXJDbGFzcyAhPSBudWxsKQotCSAgICAgIHsKLQkgICAgICAgIHRyeQotCSAgICAgICAgewotCSAgICAgICAgICBCdW5kbGUgcGx1Z2luQnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKGVsZW1lbnQuZ2V0RGVjbGFyaW5nRXh0ZW5zaW9uKCkuZ2V0Q29udHJpYnV0b3IoKS5nZXROYW1lKCkpOwotCSAgICAgICAgICBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUgZGVsZWdhdGUgPSBuZXcgRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlKHBsdWdpbkJ1bmRsZSwgZXJyb3JDdXN0b21pemVyQ2xhc3MpOwotCSAgICAgICAgICBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmFkZEVycm9yTWVzc2FnZUN1c3RvbWl6ZXIobmFtZXNwYWNlLCBkZWxlZ2F0ZSk7Ci0JICAgICAgICB9Ci0JICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICAgICAgICB7Ci0JICAgICAgICB9Ci0JICAgICAgfQotCSAgICB9Ci0JICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1OTJjMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uUmVwb3J0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uUmVwb3J0OwotCi1wdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gd2Fybk5vR3JhbW1hciA9IGZhbHNlOwotICAKLSAgLyoqCi0gICAqIFNldCBhbnkgcHJlZmVyZW5jZXMgZm9yIFhNTCB2YWxpZGF0aW9uLgotICAgKiAKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3NldHVwVmFsaWRhdGlvbihvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBzZXR1cFZhbGlkYXRpb24oTmVzdGVkVmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSAKLSAgewotCXN1cGVyLnNldHVwVmFsaWRhdGlvbihjb250ZXh0KTsKLQl3YXJuTm9HcmFtbWFyID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0FSTl9OT19HUkFNTUFSKTsKLSAgfQotCi0gIC8qIChub24tSmF2YWRvYykKLSAgICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLkFic3RyYWN0TmVzdGVkVmFsaWRhdG9yI3ZhbGlkYXRlKGphdmEubGFuZy5TdHJpbmcsIGphdmEuaW8uSW5wdXRTdHJlYW0sIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuTmVzdGVkVmFsaWRhdG9yQ29udGV4dCkKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0aW9uUmVwb3J0IHZhbGlkYXRlKFN0cmluZyB1cmksIElucHV0U3RyZWFtIGlucHV0c3RyZWFtLCBOZXN0ZWRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpCi0gIHsgIAotCVhNTFZhbGlkYXRvciB2YWxpZGF0b3IgPSBYTUxWYWxpZGF0b3IuZ2V0SW5zdGFuY2UoKTsKLQotCVhNTFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24oKTsKLQl0cnkKLQl7Ci0JICBjb25maWd1cmF0aW9uLnNldEZlYXR1cmUoWE1MVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24uV0FSTl9OT19HUkFNTUFSLCB3YXJuTm9HcmFtbWFyKTsKLQl9Ci0JY2F0Y2goRXhjZXB0aW9uIGUpCi0JewotCSAgLy8gVE9ETzogVW5hYmxlIHRvIHNldCB0aGUgcHJlZmVyZW5jZS4gTG9nIHRoaXMgcHJvYmxlbS4KLQl9Ci0JCi0JWE1MVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCWlmIChpbnB1dHN0cmVhbSAhPSBudWxsKQotCXsKLQkgIHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmksIGlucHV0c3RyZWFtLCBjb25maWd1cmF0aW9uKTsKLQl9Ci0JZWxzZQotCXsKLQkgIHZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmksIG51bGwsIGNvbmZpZ3VyYXRpb24pOwotCX0KLQkJICAgICAgICAKLQlyZXR1cm4gdmFscmVwb3J0OwotICB9Ci0JICAKLSAgLyoqCi0gICAqIFN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIG1lc3NhZ2UgcGFyYW1ldGVycy4gRm9yIFhNTCB2YWxpZGF0aW9uIHRoZXJlCi0gICAqIGFyZSB0aHJlZSBhZGRpdGlvbmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB0byBzdG9yZToKLSAgICogcGFyYW1bMF0gPSB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXJyb3IKLSAgICogcGFyYW1bMV0gPSB0aGUgJ3NxdWlnZ2xlIHNlbGVjdGlvbiBzdHJhdGVneScgZm9yIHdoaWNoIERPTSBwYXJ0IHRvIHNxdWlnZ2xlCi0gICAqIHBhcmFtWzJdID0gdGhlIG5hbWUgb3IgdmFsdWUgb2Ygd2hhdCBpcyB0byBiZSBzcXVpZ2dsZWQKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNhZGRJbmZvVG9NZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlLCBJTWVzc2FnZSBtZXNzYWdlKQotICB7IAotCVN0cmluZyBrZXkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRLZXkoKTsKLQlpZihrZXkgIT0gbnVsbCkKLQl7Ci0gICAgICBYTUxNZXNzYWdlSW5mb0hlbHBlciBtZXNzYWdlSW5mb0hlbHBlciA9IG5ldyBYTUxNZXNzYWdlSW5mb0hlbHBlcigpOwotICAgICAgU3RyaW5nW10gbWVzc2FnZUluZm8gPSBtZXNzYWdlSW5mb0hlbHBlci5jcmVhdGVNZXNzYWdlSW5mbyhrZXksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2VBcmd1bWVudHMoKSk7Ci0gICAgICAKLSAgICAgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFLCBuZXcgSW50ZWdlcih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgbWVzc2FnZUluZm9bMF0pOwotICAgICAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzFdKTsKLQl9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MTWVzc2FnZUluZm9IZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyZmNmNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTE1lc3NhZ2VJbmZvSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2U7Ci0KLS8qKgotICogVGhlIG1lc3NhZ2UgaW5mbyBoZWxwZXIgZGV0ZXJtaW5lcyB0aGUgc2VsZWN0aW9uIHN0cmF0ZWd5IGZvciBlbGVtZW50cwotICogaW4gYSBTU0UgZWRpdG9yLgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTE1lc3NhZ2VJbmZvSGVscGVyCi17Ci0gIHB1YmxpYyBYTUxNZXNzYWdlSW5mb0hlbHBlcigpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqICBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBzaG91bGQgYmUgdW5kZXJsaW5lZCB3aXRoIHRoZSByZWQgInNxdWlnZ2xlcyIKLSAgICogIHVzaW5nIHRoZSBlcnJvcktleSwgYW5kIHRoZSBtZXNzYWdlQXJndW1lbnRzLgotICAgKiAgPGJyPlBvc2l0aW9uIDAgb2YgdGhlIGFycmF5IHJldHVybmVkIGNvbnRhaW5zIHRoZSBzZWxlY3Rpb24gU3RyYXRlZ3ksIG9yIHdoYXQgRE9NIEVsZW1lbnQgdG8gdW5kZXJsaW5lLiAgCi0gICAqICBGb3IgZXhhbXBsZSAiQVRUUklCVVRFX05BTUUiICAKLSAgICogIDxicj5Qb3NpdGlvbiAxIGNvbnRhaW5zIHRoZSBuYW1lIG9yIHZhbHVlIHRvIHNxdWlnZ2xlLgotICAgKiAgPHA+Rm9yIGV4YW1wbGUsIGlmIHdlIHdhbnRlZCB0byBzcXVpZ2dsZSB0aGUgYXR0cmlidXRlIG5hbWUgb2YgYW4gYXR0cmlidXRlIG5hbWUKLSAgICogIGZvbyB0aGlzIG1ldGhvZCB3b3VsZCByZXR1cm4geyJBVFRSSUJVVEVfTkFNRSIsICJmb28ifQotICAgKiAgPC9wPgotICAgKiAgQHBhcmFtIGVycm9yS2V5IAotICAgKiAgCQlUaGUgZXJyb3Iga2V5IGdpdmVuIGJ5IHRoZSBYZXJjZXMgcGFyc2VyLgotICAgKiAgQHBhcmFtIG1lc3NhZ2VBcmd1bWVudHMgCi0gICAqICAJCVRoZSBhcmd1bWVudHMgdXNlZCBieSBYZXJjZXMgdG8gImZpbGwgaW4gdGhlIGJsYW5rcyIgb2YgdGhlaXIgbWVzc2FnZXMuCi0gICAqICBAcmV0dXJuIAotICAgKiAgCQlBbiBhcnJheSBjb250YWluaW5nIHRoZSBzcXVpZ2dsZSBpbmZvcm1hdGlvbi4KLSAgICogIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLkRlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IKLSAgICogIAotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGNyZWF0ZU1lc3NhZ2VJbmZvKFN0cmluZyBlcnJvcktleSwgT2JqZWN0W10gbWVzc2FnZUFyZ3VtZW50cykKLSAgeyAKLSAgICBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3kgPSBudWxsOwotICAgIFN0cmluZyBuYW1lT3JWYWx1ZSA9IG51bGw7Ci0gICAgCi0gICAgaWYoZXJyb3JLZXkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5hIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5kIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjIuNC5iIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJNU0dfQ09OVEVOVF9JTlZBTElEIikgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotICAgICAgICB8IGVycm9yS2V5LmVxdWFscygiTVNHX0NPTlRFTlRfSU5DT01QTEVURSIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX1JFUVVJUkVEX0FUVFJJQlVURV9OT1RfU1BFQ0lGSUVEIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJjdmMtY29tcGxleC10eXBlLjQiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLSAgICAgIHsKLSAgICAgICAgc2VsZWN0aW9uU3RyYXRlZ3kgPSAiU1RBUlRfVEFHIjsgLy8kTk9OLU5MUy0xJAotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtdHlwZS4zLjEuMyIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIlRFWFQiOyAvLyROT04tTkxTLTEkCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMi4zIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVCI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLXR5cGUuMy4xLjEiKSkgLy8kTk9OLU5MUy0xJAotICAgICAgewotICAgICAgICBzZWxlY3Rpb25TdHJhdGVneSA9ICJBTExfQVRUUklCVVRFUyI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjIuMiIpIHx8IGVycm9yS2V5LmVxdWFscygiTVNHX0FUVFJJQlVURV9OT1RfREVDTEFSRUQiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB7Ci0gICAgICAgIHNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCSAgICAvL2luIHRoaXMgY2FzZSB3ZSBuZWVkIG5hbWVPclZhbHVlIHRvIGJlIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdW5kZXJsaW5lCi0JICAgIG5hbWVPclZhbHVlID0gKFN0cmluZyltZXNzYWdlQXJndW1lbnRzWzFdOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtYXR0cmlidXRlLjMiKSB8fCBlcnJvcktleS5lcXVhbHMoIk1TR19BVFRSSUJVVEVfVkFMVUVfTk9UX0lOX0xJU1QiKSB8fCBlcnJvcktleS5lcXVhbHMoImN2Yy1jb21wbGV4LXR5cGUuMy4xIikpIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0gICAgICB7CQotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJBVFRSSUJVVEVfVkFMVUUiOyAgIC8vJE5PTi1OTFMtMSQKLQkJLy9pbiB0aGlzIGNhc2Ugd2UgbmVlZCBuYW1lT3JWYWx1ZSB0byBiZSB0aGUgbmFtZSBvZiB0aGUgQXR0cmlidXRlCi0gICAgCWlmIChlcnJvcktleS5lcXVhbHMoImN2Yy1hdHRyaWJ1dGUuMyIpIHx8IGVycm9yS2V5LmVxdWFscygiY3ZjLWNvbXBsZXgtdHlwZS4zLjEiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgCXsgCi0gICAgCSAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMV07Ci0gICAgCX0KLSAgICAJZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJNU0dfQVRUUklCVVRFX1ZBTFVFX05PVF9JTl9MSVNUIikpIC8vJE5PTi1OTFMtMSQKLSAgICAJewkKLSAgICAJICBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1swXTsKLSAgICAJfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJjdmMtZWx0LjQuMiIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7CQotICAgIAlzZWxlY3Rpb25TdHJhdGVneT0iVkFMVUVfT0ZfQVRUUklCVVRFX1dJVEhfR0lWRU5fVkFMVUUiOyAvLyROT04tTkxTLTEkCi0JCS8vaW4gdGhpcyBjYXNlIHdlIG5lZWQgbmFtZU9yVmFsdWUgdG8gYmUgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgd2Ugd2FudCB0byB1bmVybGluZQotICAgIAluYW1lT3JWYWx1ZSA9IChTdHJpbmcpbWVzc2FnZUFyZ3VtZW50c1sxXTsJCi0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVudGl0eU5vdERlY2xhcmVkIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsgIAkKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3k9IlRFWFRfRU5USVRZX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgbmFtZU9yVmFsdWUgPSAoU3RyaW5nKW1lc3NhZ2VBcmd1bWVudHNbMF07Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoIkVsZW1lbnRVbnRlcm1pbmF0ZWQiKSkgLy8kTk9OLU5MUy0xJAotCSAgewotCQlzZWxlY3Rpb25TdHJhdGVneSA9ICJFTlRJUkVfRUxFTUVOVCI7IC8vJE5PTi1OTFMtMSQKLQkgIH0KLSAgICB9Ci0gICAgU3RyaW5nIG1lc3NhZ2VJbmZvW10gPSBuZXcgU3RyaW5nWzJdOwotICAgIG1lc3NhZ2VJbmZvWzBdID0gc2VsZWN0aW9uU3RyYXRlZ3kgIT0gbnVsbD8gc2VsZWN0aW9uU3RyYXRlZ3k6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgbWVzc2FnZUluZm9bMV0gPSBuYW1lT3JWYWx1ZTsKLSAgICByZXR1cm4gbWVzc2FnZUluZm87Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hNTFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzk3MTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWE1MVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLS8qKgotICogQW4gWE1MIHZhbGlkYXRvciBzcGVjaWZpYyB0byBFY2xpcHNlLiBUaGlzIHZhbGlkYXRvciB3aWxsIHdyYXAgdGhlIGludGVybmFsCi0gKiBYTUwgdmFsaWRhdG9yIGFuZCBwcm92aWRlIGF1dG9tYXRpYyBVUkkgcmVzb2x1dGlvbiBzdXBwb3J0LiBUaGlzIGNsYXNzIGFsc28KLSAqIHJlYWRzIGZyb20gdGhlIHBsdWctaW4gcmVnaXN0cnkgYW5kIHJlZ2lzdGVycyBhbGwgZXJyb3IgY3VzdG9taXplcnMgd2l0aCB0aGUKLSAqIHJlZ2lzdHJ5LgotICovCi1wdWJsaWMgY2xhc3MgWE1MVmFsaWRhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWE1MVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIFhNTFZhbGlkYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIFhNTCB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3IKLSAgICogY2FuIGJlIHJldXNlZCBhbmQgY2Fubm90IGJlIGN1c3RvbWl6ZWQgc28gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGluc3RhbmNlIG9mIGl0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYTUwgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYTUxWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYTUxWYWxpZGF0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlIHRoZSBYTUwgdmFsaWRhdG9yLCBzZXQgdGhlIFVSSSByZXNvbHZlciBhbmQKLSAgICogZ2V0IHRoZSBleHRlbnNpb24gZXJyb3IgY3VzdG9taXplcnMgZnJvbSB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwcm90ZWN0ZWQgWE1MVmFsaWRhdG9yKCkKLSAgewotICAgIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkpOwotICAgIG5ldyBFcnJvckN1c3RvbWl6YXRpb25QbHVnaW5SZWdpc3RyeVJlYWRlcigpLnJlYWRSZWdpc3RyeSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRWxlbWVudEluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRWxlbWVudEluZm9ybWF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OWM5OWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0VsZW1lbnRJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lcnJvcmN1c3RvbWl6YXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgc2ltcGxlIGNsYXNzIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGFuIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRWxlbWVudEluZm9ybWF0aW9uCi17Ci0gIHByb3RlY3RlZCBTdHJpbmcgbG9jYWxOYW1lOwotICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWVzcGFjZTsKLSAgcHJvdGVjdGVkIExpc3QgY2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdG9yLgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiAJCVRoZSBuYW1lc3BhY2UgVVJJIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgRWxlbWVudEluZm9ybWF0aW9uKFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsKLSAgICB0aGlzLmxvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgICB0aGlzLm5hbWVzcGFjZSA9IHVyaTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldCB0aGUgbmFtZXNwYWNlIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlKCkKLSAgewotCXJldHVybiBuYW1lc3BhY2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxvY2FsIG5hbWUgb2YgdGhpcyBlbGVtZW50LgotICAgKiAKLSAgICogQHJldHVybgotICAgKiAJCVRoZSBsb2NhbCBuYW1lIG9mIHRoaXMgZWxlbWVudC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxuYW1lKCkKLSAgewotCXJldHVybiBsb2NhbE5hbWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gb2YgdGhpcyBlbGVtZW50LiBUaGUgbGlzdCBjb250YWlucwotICAgKiBFbGVtZW50SW5mb3JtYXRpb24gb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZWxlbWVudC4KLSAgICogCi0gICAqIEByZXR1cm4KLSAgICogCQlUaGUgbGlzdCBvZiBjaGlsZHJlbiBvZiB0aGlzIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgTGlzdCBnZXRDaGlsZHJlbigpCi0gIHsKLQlyZXR1cm4gY2hpbGRyZW47Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ1YWNjMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgdHJhY2tzIHRoZSBjb250ZXh0IG9mIHRoZSBwYXJzZWQgZG9jdW1lbnQgdG8gaGVscCBpZGVudGlmeSBlcnJvcgotICogY29uZGl0aW9ucwotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uTWFuYWdlcgotewotICBwcm90ZWN0ZWQgU3RhY2sgZWxlbWVudEluZm9ybWF0aW9uU3RhY2sgPSBuZXcgU3RhY2soKTsKLSAgcHJvdGVjdGVkIEVycm9yTWVzc2FnZUluZm9ybWF0aW9uIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uOwotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIGluIHRoZSBzdGFydCBlbGVtZW50IG1ldGhvZCBvZiB0aGUgWE1MIHZhbGlkYXRvcidzCi0gICAqIGNvbnRlbnQgaGFuZGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgeyAKLSAgICBFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm9ybWF0aW9uID0gbmV3IEVsZW1lbnRJbmZvcm1hdGlvbih1cmksIGxvY2FsTmFtZSk7Ci0gICAgaWYgKGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnNpemUoKSA+IDApCi0gICAgewotICAgICAgRWxlbWVudEluZm9ybWF0aW9uIHBhcmVudCA9IChFbGVtZW50SW5mb3JtYXRpb24pIGVsZW1lbnRJbmZvcm1hdGlvblN0YWNrLnBlZWsoKTsKLSAgICAgIHBhcmVudC5jaGlsZHJlbi5hZGQoZWxlbWVudEluZm9ybWF0aW9uKTsKLSAgICB9Ci0gICAgZWxlbWVudEluZm9ybWF0aW9uU3RhY2sucHVzaChlbGVtZW50SW5mb3JtYXRpb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhlIGVuZCBlbGVtZW50IG1ldGhvZCBvZiB0aGUgWE1MIHZhbGlkYXRvcidzCi0gICAqIGNvbnRlbnQgaGFuZGxlci4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkKLSAgICogCQlUaGUgbmFtZXNwYWNlIG9mIHRoZSBlbGVtZW50LgotICAgKiBAcGFyYW0gbG9jYWxOYW1lCi0gICAqIAkJVGhlIGxvY2FsIG5hbWUgb2YgdGhlIGVsZW1lbnQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KFN0cmluZyB1cmksIFN0cmluZyBsb2NhbE5hbWUpCi0gIHsgICAKLSAgICBpZiAoZWxlbWVudEluZm9ybWF0aW9uU3RhY2suc2l6ZSgpID4gMCkKLSAgICB7Ci0gICAgICBFbGVtZW50SW5mb3JtYXRpb24gZWxlbWVudEluZm9ybWF0aW9uID0gKEVsZW1lbnRJbmZvcm1hdGlvbillbGVtZW50SW5mb3JtYXRpb25TdGFjay5wb3AoKTsKLSAgICAgIGlmIChtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiAhPSBudWxsKQotICAgICAgeyAgCi0gICAgICAgIElFcnJvck1lc3NhZ2VDdXN0b21pemVyW10gY3VzdG9taXplcnMgPSBFcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmdldEN1c3RvbWl6ZXJzKGVsZW1lbnRJbmZvcm1hdGlvbi5nZXROYW1lc3BhY2UoKSk7Ci0gICAgICAgIGludCBudW1DdXN0b21pemVycyA9IGN1c3RvbWl6ZXJzLmxlbmd0aDsKLSAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG51bUN1c3RvbWl6ZXJzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IGN1c3RvbWl6ZXJzW2ldLmN1c3RvbWl6ZU1lc3NhZ2UoZWxlbWVudEluZm9ybWF0aW9uLCBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbi5rZXksIG1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLmFyZ3VtZW50cyk7Ci0gICAgICAgICAgaWYobWVzc2FnZSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgCW1lc3NhZ2VGb3JDb25zaWRlcmF0aW9uLm1lc3NhZ2Uuc2V0TWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgCWJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbnNpZGVyIHRoZSByZXBvcnRlZCBlcnJvciBmb3IgY3VzdG9taXphdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSB2YWxJbmZvCi0gICAqIAkJVGhlIGN1cnJlbnQgVmFsaWRhdGlvbkluZm8gb2JqZWN0IGNvbnRhaW5pbmcgdmFsaWRhdGlvbiBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KLSAgICogQHBhcmFtIGtleQotICAgKiAJCVRoZSBrZXkgcmVsYXRlZCB0byB0aGUgbWVzc2FnZS4KLSAgICogQHBhcmFtIGFyZ3VtZW50cwotICAgKiAJCUFueSBtZXNzYWdlIGFyZ3VtZW50cy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvbnNpZGVyUmVwb3J0ZWRFcnJvcihWYWxpZGF0aW9uSW5mbyB2YWxJbmZvLCBTdHJpbmcga2V5LCBPYmplY3RbXSBhcmd1bWVudHMpCi0gIHsKLSAgICBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiA9IG51bGw7Ci0gICAgVmFsaWRhdGlvbk1lc3NhZ2VbXSBtZXNzYWdlcyA9IHZhbEluZm8uZ2V0VmFsaWRhdGlvbk1lc3NhZ2VzKCk7Ci0gICAgaWYgKG1lc3NhZ2VzLmxlbmd0aCA+IDApCi0gICAgeyAgCi0gICAgICBtZXNzYWdlRm9yQ29uc2lkZXJhdGlvbiA9IG5ldyBFcnJvck1lc3NhZ2VJbmZvcm1hdGlvbigpOwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ua2V5ID0ga2V5OwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24uYXJndW1lbnRzID0gYXJndW1lbnRzOwotICAgICAgbWVzc2FnZUZvckNvbnNpZGVyYXRpb24ubWVzc2FnZSA9IG1lc3NhZ2VzW21lc3NhZ2VzLmxlbmd0aCAtIDFdOyAKLSAgICB9Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBIHNpbXBsZSBjbGFzcyB0byBob2xkIGVycm9yIG1lc3NhZ2UgaW5mb3JtYXRpb24uCi0gICAqLwotICBwdWJsaWMgY2xhc3MgRXJyb3JNZXNzYWdlSW5mb3JtYXRpb24KLSAgewotCXB1YmxpYyBTdHJpbmcga2V5ID0gbnVsbDsKLQlwdWJsaWMgT2JqZWN0W10gYXJndW1lbnRzID0gbnVsbDsKLQlwdWJsaWMgVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IG51bGw7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvckN1c3RvbWl6YXRpb25SZWdpc3RyeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOTQ4NzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0Vycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBUaGUgZXJyb3IgY3VzdG9taXphdGlvbiByZWdzaXRyeSBtYW5hZ2VzIGFsbCByZWdpc3RlcmVkCi0gKiBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcnMgYnkgbmFtZXNwYWNlLgotICovCi1wdWJsaWMgY2xhc3MgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkgCi17Ci0gIHByb3RlY3RlZCBzdGF0aWMgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBudWxsOwotICBwcm90ZWN0ZWQgTWFwIGN1c3RvbWl6ZXJzID0gbmV3IEhhc2hNYXAoKTsKLSAgCi0gIC8qKgotICAgKiBSZXN0cmljdGVkIGNvbnN0cnVjdG9yIGluIGtlZXBpbmcgd2l0aCB0aGUgc2luZ2xldG9uIHBhdHRlcm4uCi0gICAqLwotICBwcm90ZWN0ZWQgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkoKQotICB7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqIAotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIG9uZSBhbmQgb25seSBpbnN0YW5jZSBvZiB0aGUgcmVnaXN0cnkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEVycm9yQ3VzdG9taXphdGlvblJlZ2lzdHJ5IGdldEluc3RhbmNlKCkKLSAgewotCWlmKHJlZ2lzdHJ5ID09IG51bGwpCi0JewotCSAgcmVnaXN0cnkgPSBuZXcgRXJyb3JDdXN0b21pemF0aW9uUmVnaXN0cnkoKTsKLQl9Ci0JcmV0dXJuIHJlZ2lzdHJ5OwotICB9Ci0gIAotICAvKioKLSAgICogQWRkIGEgY3VzdG9taXplciB0byB0aGUgcmVnaXN0cnkuIAotICAgKiAKLSAgICogQHBhcmFtIG5hbWVzcGFjZQotICAgKiAJCVRoZSBuYW1lc3BhY2UgdGhlIGN1c3RvbWl6ZXIgd2lsbCBhY3Qgb24uCi0gICAqIEBwYXJhbSBjdXN0b21pemVyCi0gICAqIAkJVGhlIGVycm9yIGN1c3RvbWl6ZXIgdG8gcmVnaXN0ZXIuCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRFcnJvck1lc3NhZ2VDdXN0b21pemVyKFN0cmluZyBuYW1lc3BhY2UsIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIGN1c3RvbWl6ZXIpCi0gIHsKLQkvLyBUbyByZWdpc3RlciBhIGN1c3RvbWl6ZXIgZm9yIHRoZSBubyBuYW1lc3BhY2UgdXNlIGFuIGVtcHR5IHN0cmluZy4KLQlpZihuYW1lc3BhY2UgPT0gbnVsbCkKLQl7Ci0JICBuYW1lc3BhY2UgPSAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQlMaXN0IGN1c3RvbWl6ZXJzRm9yTlMgPSAoTGlzdCljdXN0b21pemVycy5nZXQobmFtZXNwYWNlKTsKLQlpZihjdXN0b21pemVyc0Zvck5TID09IG51bGwpCi0JewotCSAgY3VzdG9taXplcnNGb3JOUyA9IG5ldyBBcnJheUxpc3QoKTsKLQkgIGN1c3RvbWl6ZXJzLnB1dChuYW1lc3BhY2UsIGN1c3RvbWl6ZXJzRm9yTlMpOwotCX0KLQlpZihjdXN0b21pemVyICE9IG51bGwpCi0JewotCSAgY3VzdG9taXplcnNGb3JOUy5hZGQoY3VzdG9taXplcik7Ci0JfQotICB9Ci0gIAotICAvKioKLSAgICogR2V0IHRoZSBlcnJvciBjdXN0b21pemVycyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UuCi0gICAqIAotICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAqIAkJVGhlIG5hbWVzcGFjZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIGN1c3RvbWl6ZXJzLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQW4gYXJyYXkgb2YgY3VzdG9taXplcnMgcmVnaXN0ZXJlZCBmb3IgdGhpcyBuYW1lc3BhY2UuCi0gICAqLwotICBwdWJsaWMgSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJbXSBnZXRDdXN0b21pemVycyhTdHJpbmcgbmFtZXNwYWNlKQotICB7Ci0JaWYobmFtZXNwYWNlID09IG51bGwpCi0JewotCSAgbmFtZXNwYWNlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0JTGlzdCBjdXN0b21pemVyc0Zvck5TID0gKExpc3QpY3VzdG9taXplcnMuZ2V0KG5hbWVzcGFjZSk7Ci0JaWYoY3VzdG9taXplcnNGb3JOUyA9PSBudWxsKQotCXsKLQkgIGN1c3RvbWl6ZXJzRm9yTlMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCXJldHVybiAoSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXJbXSljdXN0b21pemVyc0Zvck5TLnRvQXJyYXkobmV3IElFcnJvck1lc3NhZ2VDdXN0b21pemVyW2N1c3RvbWl6ZXJzRm9yTlMuc2l6ZSgpXSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2Vycm9yY3VzdG9taXphdGlvbi9FcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxNDdjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vRXJyb3JNZXNzYWdlQ3VzdG9taXplckRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVycm9yY3VzdG9taXphdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKLQotLyoqCi0gKiBBbiBlcnJvciBtZXNzYWdlIGN1c3RvbWl6ZXIgZGVsZWdhdGUgaXMgdXNlZCB0byBhbGxvdyBmb3IKLSAqIGxhenkgbG9hZGluZyBvZiBlcnJvciBjdXN0b21pemVycy4KLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBFcnJvck1lc3NhZ2VDdXN0b21pemVyRGVsZWdhdGUgaW1wbGVtZW50cyBJRXJyb3JNZXNzYWdlQ3VzdG9taXplcgotewotICBwcm90ZWN0ZWQgQnVuZGxlIGJ1bmRsZSA9IG51bGw7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY2xhc3NuYW1lID0gbnVsbDsKLSAgcHJvdGVjdGVkIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIGN1c3RvbWl6ZXIgPSBudWxsOwotICAKLSAgcHVibGljIEVycm9yTWVzc2FnZUN1c3RvbWl6ZXJEZWxlZ2F0ZShCdW5kbGUgYnVuZGxlLCBTdHJpbmcgY2xhc3NuYW1lKQotICB7Ci0JdGhpcy5idW5kbGUgPSBidW5kbGU7Ci0JdGhpcy5jbGFzc25hbWUgPSBjbGFzc25hbWU7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLklFcnJvck1lc3NhZ2VDdXN0b21pemVyI2N1c3RvbWl6ZU1lc3NhZ2Uob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uLkVsZW1lbnRJbmZvcm1hdGlvbiwgamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdFtdKQotICAgKi8KLSAgcHVibGljIFN0cmluZyBjdXN0b21pemVNZXNzYWdlKEVsZW1lbnRJbmZvcm1hdGlvbiBlbGVtZW50SW5mbywgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBhcmd1bWVudHMpIAotICB7Ci0JaWYoY3VzdG9taXplciA9PSBudWxsKQotCXsKLQkgIGxvYWRDdXN0b21pemVyKCk7Ci0JfQotCWlmKGN1c3RvbWl6ZXIgPT0gbnVsbCkKLQl7Ci0JICByZXR1cm4gbnVsbDsKLQl9Ci0JcmV0dXJuIGN1c3RvbWl6ZXIuY3VzdG9taXplTWVzc2FnZShlbGVtZW50SW5mbywgZXJyb3JLZXksIGFyZ3VtZW50cyk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBMb2FkIHRoZSBjdXN0b21pemVyIGNsYXNzLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgbG9hZEN1c3RvbWl6ZXIoKQotICB7Ci0JdHJ5Ci0JewotCSAgQ2xhc3MgY3VzdG9taXplckNsYXNzID0gYnVuZGxlLmxvYWRDbGFzcyhjbGFzc25hbWUpOwotCSAgY3VzdG9taXplciA9IChJRXJyb3JNZXNzYWdlQ3VzdG9taXplciljdXN0b21pemVyQ2xhc3MubmV3SW5zdGFuY2UoKTsKLQl9Ci0JY2F0Y2goRXhjZXB0aW9uIGUpCi0JewotCSAgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0TG9nKCkubG9nKAotCQkJICBuZXcgU3RhdHVzKElTdGF0dXMuV0FSTklORywgCi0JCQkJCSAgICAgWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0QnVuZGxlKCkuZ2V0U3ltYm9saWNOYW1lKCksIAotCQkJCQkgICAgIElTdGF0dXMuT0ssIAotCQkJCQkgICAgICJUaGUgWE1MIHZhbGlkYXRvciBlcnJvciBjdXN0b21pemVyIHdhcyB1bmFibGUgdG8gbG9hZCBjbGFzcyAiICsgY2xhc3NuYW1lLCBlKSk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gIH0KLSAgCi0gIAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZXJyb3JjdXN0b21pemF0aW9uL0lFcnJvck1lc3NhZ2VDdXN0b21pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2ZDFlMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lcnJvcmN1c3RvbWl6YXRpb24vSUVycm9yTWVzc2FnZUN1c3RvbWl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZXJyb3JjdXN0b21pemF0aW9uOwotCi0vKioKLSAqIEFuIGVycm9yIG1lc3NhZ2UgY3VzdG9taXplciB3aWxsIGJlIGNhbGxlZCBieSB0aGUgWE1MIHZhbGlkYXRvciB0byBjdXN0b21pemUKLSAqIFhNTCB2YWxpZGF0aW9uIGVycm9ycyBmb3IgYSBnaXZlbiBuYW1lc3BhY2UuIFRoZSBjdXN0b21pemVyIGNhbiBiZSB1c2VkIHRvIAotICogY3JlYXRlIGNsZWFyZXIgZXJyb3JzIGZvciBzcGVjaWZpYyBhcHBsaWNhdGlvbiBkb21haW5zLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIElFcnJvck1lc3NhZ2VDdXN0b21pemVyIAotewotICAvKioKLSAgICogUmV0dXJuIGEgY3VzdG9taXplZCBlcnJvciBtZXNzYWdlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudC4gTnVsbCBzaG91bGQgYmUgcmV0dXJuZWQKLSAgICogaWYgdGhlIG1lc3NhZ2Ugc2hvdWxkIG5vdCBiZSBjdXN0b21pemVkLgotICAgKiAKLSAgICogQHBhcmFtIGVsZW1lbnRJbmZvcm1hdGlvbgotICAgKiAJCVRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZWxlbWVudCBmb3Igd2hpY2ggdG8gY3VzdG9taXplIHRoZSBlcnJvci4KLSAgICogQHBhcmFtIGVycm9yS2V5Ci0gICAqIAkJVGhlIGtleSBmb3IgdGhlIGVycm9yIGZvciB3aGljaCB0byByZXBsYWNlIHRoZSBtZXNzYWdlLgotICAgKiBAcGFyYW0gYXJndW1lbnRzCi0gICAqIAkJQXJndW1lbnRzIHJlbGF0ZWQgdGhlIHRoZSBlcnJvciBtZXNzYWdlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJQSBjdXN0b21pemVkIGVycm9yIG1lc3NhZ2Ugb3IgbnVsbCBpZiB0aGlzIGN1c3RvbWl6ZXIgd2lsbCBub3QgY3VzdG9taXplIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBjdXN0b21pemVNZXNzYWdlKEVsZW1lbnRJbmZvcm1hdGlvbiBlbGVtZW50SW5mbywgU3RyaW5nIGVycm9yS2V5LCBPYmplY3RbXSBhcmd1bWVudHMpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24veG1sdmFsaWRhdGlvbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTg2YzE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEtLSBDb25zdGFudHMgZm9yIHN0cmluZ3MgIAotCi0hIFVzYWdlOgotISAgIHswfSByZXBsYWNlZCB3aXRoIHRoZSBob3N0IG5hbWUKLSEKLV9VSV9QUk9CTEVNU19WQUxJREFUSU5HX1VOS05PV05fSE9TVCAgICAgICAgICAgICA9IFRoZSBmaWxlIGNhbm5vdCBiZSB2YWxpZGF0ZWQgYXMgdGhlIGhvc3QgInswfSIgaXMgY3VycmVudGx5IHVucmVhY2hhYmxlLgotCi0hIFVzYWdlOgotISAgIHswfSByZXBsYWNlZCB3aXRoIHRoZSBmaWxlIG5hbWUKLSEKLV9VSV9QUk9CTEVNU19WQUxJREFUSU5HX0ZJTEVfTk9UX0ZPVU5EICAgICAgICAgICA9IFRoZSBmaWxlIGNhbm5vdCBiZSB2YWxpZGF0ZWQgYXMgdGhlIFhNTCBTY2hlbWEgInswfSIgdGhhdCBpcyBzcGVjaWZpZWQgYXMgZGVzY3JpYmluZyB0aGUgc3ludGF4IG9mIHRoZSBmaWxlIGNhbm5vdCBiZSBsb2NhdGVkLgotCi1fVUlfUFJPQkxFTVNfQ09OTkVDVElPTl9SRUZVU0VEICAgICAgICAgICAgICAgICAgPSBUaGUgZmlsZSBjYW5ub3QgYmUgdmFsaWRhdGVkIGFzIHRoZXJlIHdhcyBhIGNvbm5lY3Rpb24gcHJvYmxlbS4KLQotIQotISBSZWZlcmVuY2VkIEZpbGUgRGlhbG9nIFJlbGF0ZWQgTWVzc2FnZQotIQotX1VJX1JFRl9GSUxFX0VSUk9SX01FU1NBR0UgICAgICAgICAgICAgICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCByaWdodCBjbGljayBvbiB0aGUgbWVzc2FnZSBhbmQgc2VsZWN0ICJTaG93IERldGFpbHMuLi4iCi0KLSMgV2FybmluZyB3aGVuIG5vIGdyYW1tYXIgaXMgbG9jYXRlZC4KLV9XQVJOX05PX0dSQU1NQVIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IE5vIGdyYW1tYXIgY29uc3RyYWludHMgKERURCBvciBYTUwgc2NoZW1hKSBkZXRlY3RlZCBmb3IgdGhlIGRvY3VtZW50LgotIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMWMyOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1ub3RlYm9vay5qcGFnZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9EZWJ1Z0FkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA1NjYwNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0RlYnVnQWRhcHRlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotcHVibGljIGNsYXNzIERlYnVnQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSB7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVidWdBZGFwdGVyRmFjdG9yeS4KLQkgKi8KLQlwdWJsaWMgRGVidWdBZGFwdGVyRmFjdG9yeSgpIHsKLQkJdGhpcyhJRGVidWdBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgRGVidWdBZGFwdGVyRmFjdG9yeS4KLQkgKiAKLQkgKiBAcGFyYW0gZkFkYXB0ZXJLZXkKLQkgKiBAcGFyYW0gcmVnaXN0ZXJBZGFwdGVycwotCSAqLwotCXByaXZhdGUgRGVidWdBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCQotCXB1YmxpYyB2b2lkIGFkZENvbnRyaWJ1dGVkRmFjdG9yaWVzKElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQkvL25vbmUgZXhwZWN0ZWQKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlyZXR1cm4gbmV3IERlYnVnQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJRXZlcnlOb2RlRGVidWdBZGFwdGVyIHJlc3VsdCA9IG51bGw7Ci0JCXJlc3VsdCA9IEV2ZXJ5Tm9kZURlYnVnQWRhcHRlci5nZXRJbnN0YW5jZSgpOwotCQlyZXR1cm4gcmVzdWx0OwotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSUFkYXB0ZXJGYWN0b3J5I2lzRmFjdG9yeUZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0ZhY3RvcnlGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0KLQkJcmV0dXJuIElEZWJ1Z0FkYXB0ZXIuY2xhc3MgPT0gdHlwZTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5I3NldENvbnRyaWJ1dGVkRmFjdG9yaWVzKGphdmEudXRpbC5BcnJheUxpc3QpCi0JICovCi0JcHVibGljIHZvaWQgc2V0Q29udHJpYnV0ZWRGYWN0b3JpZXMoQXJyYXlMaXN0IGxpc3QpIHsKLQkJLy8gbm9uZSBleHBlY3RlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0V2ZXJ5Tm9kZURlYnVnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NDU0OTI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvRXZlcnlOb2RlRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsU3RhdGVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLkFib3V0VG9CZUNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklNb2RlbEFib3V0VG9CZUNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLk5ld0RvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5Ob0NoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi0vKioKLSAqIFB1cmVseSBmb3IgdXNlIGluIGRlYnVnZ2luZwotICovCi1wdWJsaWMgY2xhc3MgRXZlcnlOb2RlRGVidWdBZGFwdGVyIGltcGxlbWVudHMgSURlYnVnQWRhcHRlciB7Ci0KLQlzdGF0aWMgY2xhc3MgSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lciNkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCURlYnVnLnByaW50bG4oIklkb2N1bWVudEFib3V0VG9CZUNoYW5nZWQ6ICIgKyBldmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudExpc3RlbmVyI2RvY3VtZW50Q2hhbmdlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkb2N1bWVudENoYW5nZWQoRG9jdW1lbnRFdmVudCBldmVudCkgewotCQkJRGVidWcucHJpbnRsbigiSWRvY3VtZW50Q2hhbmdlZDogIiArIGV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lciBpbXBsZW1lbnRzIElNb2RlbFN0YXRlTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsQWJvdXRUb0JlQ2hhbmdlZDogIiArIG1vZGVsKTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbENoYW5nZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBib29sZWFuKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBib29sZWFuIGlzRGlydHkpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsRGlydHlTdGF0ZUNoYW5nZWQ6ICIgKyBtb2RlbCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVzb3VyY2VEZWxldGVkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsUmVzb3VyY2VEZWxldGVkOiAiICsgbW9kZWwpOyAvLyROT04tTkxTLTEkCi0KLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLklNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxSZXNvdXJjZU1vdmVkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCURlYnVnLnByaW50bG4oIm1vZGVsUmVzb3VyY2VNb3ZlZDogIiArICJvbGRNb2RlbDogIiArIG9sZE1vZGVsICsgIm5ld01vZGVsOiAiICsgbmV3TW9kZWwpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVSZWluaXRpYWxpemVkKElTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJtb2RlbEFib3V0VG9CZVJlaW5pdGlhbGl6ZWQ6ICIgKyAic3RydWN0dXJlZE1vZGVsOiAiICsgc3RydWN0dXJlZE1vZGVsKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJRGVidWcucHJpbnRsbigibW9kZWxSZWluaXRpYWxpemVkOiAiICsgInN0cnVjdHVyZWRNb2RlbDogIiArIHN0cnVjdHVyZWRNb2RlbCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgaW1wbGVtZW50cyBJTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIgewotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5JTW9kZWxBYm91dFRvQmVDaGFuZ2VkTGlzdGVuZXIjbW9kZWxBYm91dFRvQmVDaGFuZ2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuQWJvdXRUb0JlQ2hhbmdlZEV2ZW50KQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxBYm91dFRvQmVDaGFuZ2VkKEFib3V0VG9CZUNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0JlQ2hhbmdlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXN0YXRpYyBjbGFzcyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIHsKLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI25ld01vZGVsKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuTmV3RG9jdW1lbnRDb250ZW50RXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbmV3TW9kZWw6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub0NoYW5nZShvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLk5vQ2hhbmdlRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbm9DaGFuZ2U6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNub2Rlc1JlcGxhY2VkKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBub2Rlc1JlcGxhY2VkKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnNSZXBsYWNlZEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCQlEZWJ1Zy5wcmludGxuKCJzdHJ1Y3R1cmVkRG9jdW1lbnRDaGFuZ2VkIC0gbm9kZXNSZXBsYWNlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5ldmVudHMuSVN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyI3JlZ2lvbkNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZCAtIHJlZ2lvbkNoYW5nZWQ6ICIgKyBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCk7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZXZlbnRzLklTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lciNyZWdpb25zUmVwbGFjZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmV2ZW50cy5SZWdpb25zUmVwbGFjZWRFdmVudCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlZ2lvbnNSZXBsYWNlZChSZWdpb25zUmVwbGFjZWRFdmVudCBzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCkgewotCQkJRGVidWcucHJpbnRsbigic3RydWN0dXJlZERvY3VtZW50Q2hhbmdlZCAtIHJlZ2lvbnNSZXBsYWNlZDogIiArIHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KTsgLy8kTk9OLU5MUy0xJAotCi0JCX0KLQotCX0KLQotCXByaXZhdGUgc3RhdGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlciBzaW5nbGV0b25JbnN0YW5jZTsKLQotCXB1YmxpYyBzdGF0aWMgRXZlcnlOb2RlRGVidWdBZGFwdGVyIGdldEluc3RhbmNlKCkgewotCQlpZiAoc2luZ2xldG9uSW5zdGFuY2UgPT0gbnVsbCkgewotCQkJc2luZ2xldG9uSW5zdGFuY2UgPSBuZXcgRXZlcnlOb2RlRGVidWdBZGFwdGVyKCk7Ci0JCX0KLQkJcmV0dXJuIHNpbmdsZXRvbkluc3RhbmNlOwotCX0KLQotCUludGVybmFsRG9jdW1lbnRMaXN0ZW5lciBmSW50ZXJuYWxEb2N1bWVudExpc3RlbmVyOwotCUludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGZJbnRlcm5hbE1vZGVsU3RhdGVMaXN0ZW5lcjsKLQlJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UgZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZTsKLQlJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyIGZJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudExpc3RlbmVyOwotCUlTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsOwotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlcigpIHsKLQkJc3VwZXIoKTsKLQkJZkludGVybmFsRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIoKTsKLQkJZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50QWJvdXRUb0NoYW5nZSA9IG5ldyBJbnRlcm5hbFN0cnVjdHVyZWREb2N1bWVudEFib3V0VG9DaGFuZ2UoKTsKLQkJZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRMaXN0ZW5lcigpOwotCQlmSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICovCi0JcHVibGljIEV2ZXJ5Tm9kZURlYnVnQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQl0aGlzKCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVBZGFwdGVyI2lzQWRhcHRlckZvclR5cGUoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBJRGVidWdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5JTm9kZUFkYXB0ZXIjbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuSU5vZGVOb3RpZmllciwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJc2V0TW9kZWwoKChJRE9NTm9kZSkgbm90aWZpZXIpLmdldE1vZGVsKCkpOwotCQl9Ci0JCURlYnVnLnByaW50bG4oIm5vdGlmaWVyOiAiICsgbm90aWZpZXIgKyAiICIgKyBJTm9kZU5vdGlmaWVyLkVWRU5UX1RZUEVfU1RSSU5HU1tldmVudFR5cGVdICsgIiBjaGFuZ2VkRmVhdHVyZTogIiArIGNoYW5nZWRGZWF0dXJlICsgIiBvbGRWYWx1ZTogIiArIG9sZFZhbHVlICsgIiBuZXdWYWx1ZTogIiArIG5ld1ZhbHVlICsgIiBwb3M6ICIgKyBwb3MpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuSURlYnVnQWRhcHRlciNzZXREb2N1bWVudChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50KQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlpZiAoZk1vZGVsID09IHN0cnVjdHVyZWRNb2RlbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZk1vZGVsICE9IG51bGwpIHsKLQkJCWZNb2RlbC5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKTsKLQkJCS8vCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudExpc3RlbmVyKGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZW1vdmVEb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKTsKLQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVtb3ZlRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpOwotCQkJfQotCQl9Ci0JCWZNb2RlbCA9IHN0cnVjdHVyZWRNb2RlbDsKLQkJaWYgKGZNb2RlbCAhPSBudWxsKSB7Ci0KLQkJCWZNb2RlbC5hZGRNb2RlbFN0YXRlTGlzdGVuZXIoZkludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKTsKLQkJCS8vCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudExpc3RlbmVyKGZJbnRlcm5hbERvY3VtZW50TGlzdGVuZXIpOwotCQkJCXN0cnVjdHVyZWREb2N1bWVudC5hZGREb2N1bWVudEFib3V0VG9DaGFuZ2VMaXN0ZW5lcihmSW50ZXJuYWxTdHJ1Y3R1cmVkRG9jdW1lbnRBYm91dFRvQ2hhbmdlKTsKLQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQuYWRkRG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIoZkludGVybmFsU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIpOwotCQkJfQotCQl9Ci0KLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvSURlYnVnQWRhcHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MmY4NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9JRGVidWdBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci0KLQotcHVibGljIGludGVyZmFjZSBJRGVidWdBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWE2YWMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvTG9nZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLS8qKgotICogU21hbGwgY29udmVuaWVuY2UgY2xhc3MgdG8gbG9nIG1lc3NhZ2VzIHRvIHBsdWdpbidzIGxvZyBmaWxlIGFuZCBhbHNvLCBpZgotICogZGVzaXJlZCwgdGhlIGNvbnNvbGUuIFRoaXMgY2xhc3Mgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBjbGFzc2VzIGluIHRoaXMKLSAqIHBsdWdpbi4gT3RoZXIgcGx1Z2lucyBzaG91bGQgbWFrZSB0aGVpciBvd24gY29weSwgd2l0aCBhcHByb3ByaWF0ZSBJRC4KLSAqLwotcHVibGljIGNsYXNzIExvZ2dlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUiOyAvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1IgPSBJU3RhdHVzLkVSUk9SOyAvLyA0Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfREVCVUcgPSAyMDAgKyBFUlJPUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPID0gSVN0YXR1cy5JTkZPOyAvLyAxCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GT19ERUJVRyA9IDIwMCArIElORk87Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPSyA9IElTdGF0dXMuT0s7IC8vIDAKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LX0RFQlVHID0gMjAwICsgT0s7Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0VGSUxURVJfTE9DQVRJT04gPSAiL2RlYnVnL3RyYWNlZmlsdGVyIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkcgPSBJU3RhdHVzLldBUk5JTkc7IC8vIDIKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXQVJOSU5HX0RFQlVHID0gMjAwICsgV0FSTklORzsKLQotCS8qKgotCSAqIEFkZHMgbWVzc2FnZSB0byBsb2cuCi0JICogCi0JICogQHBhcmFtIGxldmVsCi0JICogICAgICAgICAgICBzZXZlcml0eSBsZXZlbCBvZiB0aGUgbWVzc2FnZSAoT0ssIElORk8sIFdBUk5JTkcsIEVSUk9SLAotCSAqICAgICAgICAgICAgT0tfREVCVUcsIElORk9fREVCVUcsIFdBUk5JTkdfREVCVUcsIEVSUk9SX0RFQlVHKQotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIGFkZCB0byB0aGUgbG9nCi0JICogQHBhcmFtIGV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgZXhjZXB0aW9uIHRocm93bgotCSAqLwotCXByb3RlY3RlZCBzdGF0aWMgdm9pZCBfbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGxldmVsID09IE9LX0RFQlVHIHx8IGxldmVsID09IElORk9fREVCVUcgfHwgbGV2ZWwgPT0gV0FSTklOR19ERUJVRyB8fCBsZXZlbCA9PSBFUlJPUl9ERUJVRykgewotCQkJaWYgKCFpc0RlYnVnZ2luZygpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzZXZlcml0eSA9IElTdGF0dXMuT0s7Ci0JCXN3aXRjaCAobGV2ZWwpIHsKLQkJCWNhc2UgSU5GT19ERUJVRyA6Ci0JCQljYXNlIElORk8gOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5JTkZPOwotCQkJCWJyZWFrOwotCQkJY2FzZSBXQVJOSU5HX0RFQlVHIDoKLQkJCWNhc2UgV0FSTklORyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLldBUk5JTkc7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIEVSUk9SX0RFQlVHIDoKLQkJCWNhc2UgRVJST1IgOgotCQkJCXNldmVyaXR5ID0gSVN0YXR1cy5FUlJPUjsKLQkJfQotCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKHNldmVyaXR5LCBQTFVHSU5fSUQsIHNldmVyaXR5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQlQbGF0Zm9ybS5nZXRMb2coYnVuZGxlKS5sb2coc3RhdHVzT2JqKTsKLQl9Ci0KLQkvKioKLQkgKiBQcmludHMgbWVzc2FnZSB0byBsb2cgaWYgY2F0ZWdvcnkgbWF0Y2hlcyAvZGVidWcvdHJhY2VmaWx0ZXIgb3B0aW9uLgotCSAqIAotCSAqIEBwYXJhbSBtZXNzYWdlCi0JICogICAgICAgICAgICB0ZXh0IHRvIHByaW50Ci0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogICAgICAgICAgICBjYXRlZ29yeSBvZiB0aGUgbWVzc2FnZSwgdG8gYmUgY29tcGFyZWQgd2l0aAotCSAqICAgICAgICAgICAgL2RlYnVnL3RyYWNlZmlsdGVyCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF90cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCWlmIChpc1RyYWNpbmcoY2F0ZWdvcnkpKSB7Ci0JCQltZXNzYWdlID0gKG1lc3NhZ2UgIT0gbnVsbCkgPyBtZXNzYWdlIDogIm51bGwiOyAvLyROT04tTkxTLTEkCi0JCQlTdGF0dXMgc3RhdHVzT2JqID0gbmV3IFN0YXR1cyhJU3RhdHVzLk9LLCBQTFVHSU5fSUQsIElTdGF0dXMuT0ssIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCQlCdW5kbGUgYnVuZGxlID0gUGxhdGZvcm0uZ2V0QnVuZGxlKFBMVUdJTl9JRCk7Ci0JCQlpZiAoYnVuZGxlICE9IG51bGwpIAotCQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiB0cnVlIGlmIHRoZSBwbGF0Zm9ybSBpcyBkZWJ1Z2dpbmcKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNEZWJ1Z2dpbmcoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5pbkRlYnVnTW9kZSgpOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgY3VycmVudGx5IHRyYWNpbmcgYSBjYXRlZ29yeQotCSAqIAotCSAqIEBwYXJhbSBjYXRlZ29yeQotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0cmFjaW5nIGNhdGVnb3J5LCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUcmFjaW5nKFN0cmluZyBjYXRlZ29yeSkgewotCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJU3RyaW5nIHRyYWNlRmlsdGVyID0gUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oUExVR0lOX0lEICsgVFJBQ0VGSUxURVJfTE9DQVRJT04pOwotCQlpZiAodHJhY2VGaWx0ZXIgIT0gbnVsbCkgewotCQkJU3RyaW5nVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodHJhY2VGaWx0ZXIsICIsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7Ci0JCQkJU3RyaW5nIGNhdCA9IHRva2VuaXplci5uZXh0VG9rZW4oKS50cmltKCk7Ci0JCQkJaWYgKGNhdGVnb3J5LmVxdWFscyhjYXQpKSB7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKGxldmVsLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nRXhjZXB0aW9uKFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX2xvZyhFUlJPUiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2UoU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZSkgewotCQlfdHJhY2UoY2F0ZWdvcnksIG1lc3NhZ2UsIG51bGwpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgdHJhY2VFeGNlcHRpb24oU3RyaW5nIGNhdGVnb3J5LCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSwgZXhjZXB0aW9uKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9YTUxDb3JlTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QwNWFkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVNZXNzYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIENvcmUKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb3JlTWVzc2FnZXMgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCVU5ETEVfTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpblJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEludmFsaWRfY2hhcmFjdGVyX2x0X2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW52YWxpZF9jaGFyYWN0ZXJfYW1wX2ZvX0VSUk9SXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnZhbGlkX2NoYXJhY3Rlcl9fZl9FWENfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvYWRpbmc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19lbnRyeV9rZXlfbm90X3NldDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDYXRhbG9nX2VudHJ5X3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfbmV4dF9jYXRhbG9nX2xvY2F0aW9uX3VyaV9ub3Rfc2V0OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENhdGFsb2dfcmVzb2x1dGlvbl9udWxsX2NhdGFsb2c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX21hbGZvcm1lZF91cmw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2F0YWxvZ19yZXNvbHV0aW9uX2lvX2V4Y2VwdGlvbjsKLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxDb3JlTWVzc2FnZXMuY2xhc3MpOwotCX0KLQkKLQlwcml2YXRlIFhNTENvcmVNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTRkYTcxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JV29ya3NwYWNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLQotCi0vKioKLSAqIFRoZSBtYWluIHBsdWdpbiBjbGFzcyB0byBiZSB1c2VkIGluIHRoZSBkZXNrdG9wLgotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29yZVBsdWdpbiBleHRlbmRzIFBsdWdpbiB7Ci0JLy8gVGhlIHNoYXJlZCBpbnN0YW5jZS4KLQlwcml2YXRlIHN0YXRpYyBYTUxDb3JlUGx1Z2luIHBsdWdpbjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX0NBVEFMT0dfSUQgPSAidXNlcl9jYXRhbG9nIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ0FUQUxPR19JRCA9ICJkZWZhdWx0X2NhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0NBVEFMT0dfSUQgPSAic3lzdGVtX2NhdGFsb2ciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBDYXRhbG9nU2V0IGNhdGFsb2dTZXQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIGRlZmF1bHRDYXRhbG9nRmlsZVN0YXRlTG9jYXRpb247Ci0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhNTENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCB1c2UgUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpIGRpcmVjdGx5Ci0JICovCi0JcHVibGljIHN0YXRpYyBJV29ya3NwYWNlIGdldFdvcmtzcGFjZSgpIHsKLQkJcmV0dXJuIFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgY29uc3RydWN0b3IuCi0JICovCi0JcHVibGljIFhNTENvcmVQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCXBsdWdpbiA9IHRoaXM7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihTdHJpbmcgZmlsZU5hbWUpIHsKLQkJU3RyaW5nIGxvY2F0aW9uID0gZ2V0U3RhdGVMb2NhdGlvbigpLmFwcGVuZChmaWxlTmFtZSkudG9TdHJpbmcoKTsKLQkJU3RyaW5nIGZpbGVfcHJvdG9jb2wgPSAiZmlsZToiOyAvLyROT04tTkxTLTEkCi0JCWlmIChsb2NhdGlvbiAhPSBudWxsICYmICFsb2NhdGlvbi5zdGFydHNXaXRoKGZpbGVfcHJvdG9jb2wpKSB7Ci0JCQlsb2NhdGlvbiA9IGZpbGVfcHJvdG9jb2wgKyBsb2NhdGlvbjsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0JcHVibGljIElDYXRhbG9nIGdldERlZmF1bHRYTUxDYXRhbG9nKCkgewotCQlpZiAoY2F0YWxvZ1NldCA9PSBudWxsKSB7Ci0JCQljYXRhbG9nU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsKLQotCQkJZGVmYXVsdENhdGFsb2dGaWxlU3RhdGVMb2NhdGlvbiA9IGdldFBsdWdpblN0YXRlTG9jYXRpb24oQ2F0YWxvZy5ERUZBVUxUX0NBVEFMT0dfRklMRSk7Ci0KLQkJCWNhdGFsb2dTZXQucHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oREVGQVVMVF9DQVRBTE9HX0lELCBkZWZhdWx0Q2F0YWxvZ0ZpbGVTdGF0ZUxvY2F0aW9uKTsKLQkJCWNhdGFsb2dTZXQucHV0Q2F0YWxvZ1BlcnNpc3RlbmNlTG9jYXRpb24oU1lTVEVNX0NBVEFMT0dfSUQsIGdldFBsdWdpblN0YXRlTG9jYXRpb24oQ2F0YWxvZy5TWVNURU1fQ0FUQUxPR19GSUxFKSk7Ci0JCQljYXRhbG9nU2V0LnB1dENhdGFsb2dQZXJzaXN0ZW5jZUxvY2F0aW9uKFVTRVJfQ0FUQUxPR19JRCwgZ2V0UGx1Z2luU3RhdGVMb2NhdGlvbihDYXRhbG9nLlVTRVJfQ0FUQUxPR19GSUxFKSk7Ci0JCX0KLQkJcmV0dXJuIGNhdGFsb2dTZXQubG9va3VwT3JDcmVhdGVDYXRhbG9nKERFRkFVTFRfQ0FUQUxPR19JRCwgZGVmYXVsdENhdGFsb2dGaWxlU3RhdGVMb2NhdGlvbik7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL1hNTENvcmVQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTlkYTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvWE1MQ29yZVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1JbnZhbGlkX2NoYXJhY3Rlcl9sdF9mb19FUlJPUl89SW52YWxpZCBjaGFyYWN0ZXIgKCc8JykgZm91bmQKLUludmFsaWRfY2hhcmFjdGVyX2d0X2ZvX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciAoJz4nKSBmb3VuZAotSW52YWxpZF9jaGFyYWN0ZXJfYW1wX2ZvX0VSUk9SXz1JbnZhbGlkIGNoYXJhY3RlciAoJyYnKSBmb3VuZAotSW52YWxpZF9jaGFyYWN0ZXJfX2ZfRVhDXz1JbnZhbGlkIGNoYXJhY3RlciAoJ1wiJykgZm91bmQKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgY29udGVudG1vZGVsIHN0cmluZ3MKLWxvYWRpbmc9bG9hZGluZyAKLSMgY2F0YWxvZyBzdHJpbmdzCi1DYXRhbG9nX2VudHJ5X2tleV9ub3Rfc2V0PUNhdGFsb2cgZW50cnkga2V5IGlzIG5vdCBzZXQKLUNhdGFsb2dfZW50cnlfdXJpX25vdF9zZXQ9Q2F0YWxvZyBlbnRyeSB1cmkgaXMgbm90IHNldAotQ2F0YWxvZ19uZXh0X2NhdGFsb2dfbG9jYXRpb25fdXJpX25vdF9zZXQ9TmV4dCBjYXRhbG9nIGxvY2F0aW9uIHVyaSBpcyBub3Qgc2V0Ci1DYXRhbG9nX3Jlc29sdXRpb25fbnVsbF9jYXRhbG9nPUNhdGFsb2cgcmVzb2x1dGlvbiBhdHRlbXB0ZWQgd2l0aCBudWxsIGNhdGFsb2c7IGlnbm9yZWQKLUNhdGFsb2dfcmVzb2x1dGlvbl9tYWxmb3JtZWRfdXJsPU1hbGZvcm1lZCBVUkwgZXhjZXB0aW9uIHRyeWluZyB0byByZXNvbHZlCi1DYXRhbG9nX3Jlc29sdXRpb25faW9fZXhjZXB0aW9uPUkvTyBleGNlcHRpb24gdHJ5aW5nIHRvIHJlc29sdmUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0NsZWFudXBQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiZjQxYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvQ2xlYW51cFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5BYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIENsZWFudXBQcm9jZXNzb3JYTUwgZXh0ZW5kcyBBYnN0cmFjdFN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciBnZXRDbGVhbnVwSGFuZGxlcihOb2RlIG5vZGUpIHsKLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgY2xlYW51cEhhbmRsZXIgPSBudWxsOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IEVsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJY2xlYW51cEhhbmRsZXIgPSBuZXcgTm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBDbGVhbnVwUHJlZmVyZW5jZXMKLQkJY2xlYW51cEhhbmRsZXIuc2V0Q2xlYW51cFByZWZlcmVuY2VzKGdldENsZWFudXBQcmVmZXJlbmNlcygpKTsKLQotCQlyZXR1cm4gY2xlYW51cEhhbmRsZXI7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUw7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yIGdldEZvcm1hdFByb2Nlc3NvcigpIHsKLQkJcmV0dXJuIG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9FbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMmI3NzIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL0VsZW1lbnROb2RlQ2xlYW51cEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jbGVhbnVwOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuSW5zZXJ0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5vZGVDbGVhbnVwSGFuZGxlciBleHRlbmRzIE5vZGVDbGVhbnVwSGFuZGxlciB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBET1VCTEVfUVVPVEVTID0gIlwiXCIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU1QVFlfVEFHX0NMT1NFID0gIi8+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVORF9UQUdfT1BFTiA9ICI8LyI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNJTkdMRV9RVU9URVMgPSAiJyciOyAvLyROT04tTkxTLTEkCi0KLQkvKiogTm9uLU5MUyBzdHJpbmdzICovCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RBUlRfVEFHX09QRU4gPSAiPCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0JCU5vZGUgbmV3Tm9kZSA9IGNsZWFudXBDaGlsZHJlbihub2RlKTsKLQkJSURPTU5vZGUgcmVuYW1lZE5vZGUgPSBuZXdOb2RlIGluc3RhbmNlb2YgSURPTU5vZGUgPyAoSURPTU5vZGUpIG5ld05vZGUgOiBudWxsOwotCi0JCS8vIGNhbGwgcXVvdGVBdHRyVmFsdWUoKSBmaXJzdCBzbyBpdCB3aWxsIGNsb3NlIGFueSB1bmNsb3NlZCBhdHRyCi0JCS8vIHF1b3RlQXR0clZhbHVlKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBzdGFydCB0YWcgaWYgdGhlcmUgaXMgYQotCQkvLyBzdHJ1Y3R1cmUgY2hhbmdlCi0JCXJlbmFtZWROb2RlID0gcXVvdGVBdHRyVmFsdWUocmVuYW1lZE5vZGUpOwotCi0JCS8vIGluc2VydCB0YWcgY2xvc2UgaWYgbWlzc2luZwotCQkvLyBpZiBub2RlIGlzIG5vdCBjb21tZW50IHRhZwotCQkvLyBhbmQgbm90IGltcGxpY2l0IHRhZwotCQlpZiAoIWlzQ29tbWVudFRhZyhyZW5hbWVkTm9kZSkgJiYgIWlzSW1wbGljaXRUYWcocmVuYW1lZE5vZGUpKSB7Ci0JCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gcmVuYW1lZE5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJLy8gc2F2ZSBzdGFydCBvZmZzZXQgYmVmb3JlIGluc2VydFRhZ0Nsb3NlKCkKLQkJCS8vIG9yIGVsc2UgcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSB3aWxsIGJlIHplcm8gaWYKLQkJCS8vIHJlbmFtZWROb2RlIHJlcGxhY2VkIGJ5IGluc2VydFRhZ0Nsb3NlKCkKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gcmVuYW1lZE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJLy8gZm9yIHN0YXJ0IHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbnNlcnRUYWdDbG9zZShzdHJ1Y3R1cmVkTW9kZWwsIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJLy8gdXBkYXRlIHJlbmFtZWROb2RlIGFuZCBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhZnRlcgotCQkJLy8gaW5zZXJ0VGFnQ2xvc2UoKQotCQkJcmVuYW1lZE5vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOwotCQkJc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQkvLyBmb3IgZW5kIHRhZwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSByZW5hbWVkTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJaW5zZXJ0VGFnQ2xvc2Uoc3RydWN0dXJlZE1vZGVsLCBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0KLQkJLy8gY2FsbCBpbnNlcnRNaXNzaW5nVGFncygpIG5leHQsIGl0IHdpbGwgZ2VuZXJhdGUgaW1wbGljaXQgdGFncyBpZgotCQkvLyB0aGVyZSBhcmUgYW55Ci0JCS8vIGluc2VydE1pc3NpbmdUYWdzKCkgd2lsbCByZXR1cm4gdGhlIG5ldyBtaXNzaW5nIHN0YXJ0IHRhZyBpZiBvbmUgaXMKLQkJLy8gbWlzc2luZwotCQlyZW5hbWVkTm9kZSA9IGluc2VydE1pc3NpbmdUYWdzKHJlbmFtZWROb2RlKTsKLQotCQlyZW5hbWVkTm9kZSA9IGNvbXByZXNzRW1wdHlFbGVtZW50VGFnKHJlbmFtZWROb2RlKTsKLQotCQlyZW5hbWVkTm9kZSA9IGluc2VydFJlcXVpcmVkQXR0cnMocmVuYW1lZE5vZGUpOwotCi0JCXJldHVybiByZW5hbWVkTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTm9kZSBjbGVhbnVwQ2hpbGRyZW4oTm9kZSBub2RlKSB7Ci0JCU5vZGUgcGFyZW50Tm9kZSA9IG5vZGU7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIGdldCBjbGVhbnVwIGhhbmRsZXIKLQkJCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gZ2V0Q2xlYW51cEhhbmRsZXIoY2hpbGROb2RlKTsKLQotCQkJCS8vIGNsZWFudXAgZWFjaCBjaGlsZAotCQkJCWNoaWxkTm9kZSA9IGNsZWFudXBIYW5kbGVyLmNsZWFudXAoY2hpbGROb2RlKTsKLQotCQkJCS8vIGdldCBuZXcgcGFyZW50IG5vZGUKLQkJCQlwYXJlbnROb2RlID0gY2hpbGROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCS8vIGdldCBuZXh0IGNoaWxkIG5vZGUKLQkJCQljaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBwYXJlbnROb2RlOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgY29tcHJlc3NFbXB0eUVsZW1lbnRUYWcoSURPTU5vZGUgbm9kZSkgewotCQlib29sZWFuIGNvbXByZXNzRW1wdHlFbGVtZW50VGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldENvbXByZXNzRW1wdHlFbGVtZW50VGFncygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCWlmIChjb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgJiYgc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICYmIHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkvLyBmb3JtYXQgY2hpbGRyZW4gYW5kIGVuZCB0YWcgaWYgbm90IGVtcHR5IGVsZW1lbnQgdGFnCi0JCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJTm9kZUxpc3QgY2hpbGROb2RlcyA9IG5ld05vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWlmIChjaGlsZE5vZGVzID09IG51bGwgfHwgY2hpbGROb2Rlcy5nZXRMZW5ndGgoKSA9PSAwIHx8IChjaGlsZE5vZGVzLmdldExlbmd0aCgpID09IDEgJiYgKGNoaWxkTm9kZXMuaXRlbSgwKSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAoKGNoaWxkTm9kZXMuaXRlbSgwKSkuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApKSkgewotCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbmV3Tm9kZS5nZXRNb2RlbCgpOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5ld05vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJaW50IG9mZnNldCA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpbnQgbGVuZ3RoID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpOwotCQkJCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0KLQkJCQkJb2Zmc2V0ID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSArIGxhc3RSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCAwLCAiLyIpOyAvLyROT04tTkxTLTEkCi0JCQkJCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkQ2xlYW51cEhhbmRsZXIgZ2V0Q2xlYW51cEhhbmRsZXIoTm9kZSBub2RlKSB7Ci0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlJU3RydWN0dXJlZENsZWFudXBIYW5kbGVyIGNsZWFudXBIYW5kbGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBvcmcudzNjLmRvbS5Ob2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBFbGVtZW50Tm9kZUNsZWFudXBIYW5kbGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIG9yZy53M2MuZG9tLk5vZGUuVEVYVF9OT0RFIDogewotCQkJCWNsZWFudXBIYW5kbGVyID0gbmV3IE5vZGVDbGVhbnVwSGFuZGxlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQljbGVhbnVwSGFuZGxlciA9IG5ldyBOb2RlQ2xlYW51cEhhbmRsZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgQ2xlYW51cFByZWZlcmVuY2VzCi0JCWNsZWFudXBIYW5kbGVyLnNldENsZWFudXBQcmVmZXJlbmNlcyhnZXRDbGVhbnVwUHJlZmVyZW5jZXMoKSk7Ci0KLQkJcmV0dXJuIGNsZWFudXBIYW5kbGVyOwotCX0KLQotCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgZ2V0TW9kZWxRdWVyeShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXJldHVybiBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KChEb2N1bWVudCkgbm9kZSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXF1aXJlZEF0dHJzKE5vZGUgbm9kZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBnZXRNb2RlbFF1ZXJ5KG5vZGUpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ID0gYXR0ck1hcC5pdGVyYXRvcigpOwotCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGF0dHIuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGF0dHIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGluc2VydEVuZFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkKLQkJCXJldHVybiBub2RlOyAvLyBkbyBub3RoaW5nCi0KLQkJaW50IHN0YXJ0VGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0KLQkJaWYgKGlzRW1wdHlFbGVtZW50KGVsZW1lbnQpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCksIEVNUFRZX1RBR19DTE9TRSk7Ci0KLQkJCWlmIChyZWdpb25zLnNpemUoKSA+IDEpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb25CZWZvcmVUYWdDbG9zZSA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSAtIDEpOwotCi0JCQkJLy8gaW5zZXJ0IGEgc3BhY2Ugc2VwYXJhdG9yIGJlZm9yZSB0YWcgY2xvc2UgaWYgdGhlIHByZXZpb3VzCi0JCQkJLy8gcmVnaW9uIGRvZXMgbm90IGhhdmUgZXh0cmEgc3BhY2VzCi0JCQkJaWYgKHJlZ2lvbkJlZm9yZVRhZ0Nsb3NlLmdldFRleHRMZW5ndGgoKSA9PSByZWdpb25CZWZvcmVUYWdDbG9zZS5nZXRMZW5ndGgoKSkKLQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJU3RyaW5nIGVuZFRhZyA9IEVORF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0KLQkJCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJCWludCBlbmRUYWdTdGFydE9mZnNldCA9IDA7Ci0JCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQkJLy8gaWYgdGhpcyBub2RlIGhhcyBjaGlsZHJlbiwgaW5zZXJ0IHRoZSBlbmQgdGFnIGFmdGVyIHRoZQotCQkJCS8vIGxhc3QgY2hpbGQKLQkJCQllbmRUYWdTdGFydE9mZnNldCA9IGxhc3RDaGlsZC5nZXRFbmRPZmZzZXQoKTsKLQkJCWVsc2UKLQkJCQkvLyBpZiB0aGlzIG5vZGUgZG9lcyBub3QgaGFzIGNoaWxkcmVuLCBpbnNlcnQgdGhlIGVuZCB0YWcKLQkJCQkvLyBhZnRlciB0aGUgc3RhcnQgdGFnCi0JCQkJZW5kVGFnU3RhcnRPZmZzZXQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVuZFRhZ1N0YXJ0T2Zmc2V0LCAwLCBlbmRUYWcpOwotCQl9Ci0KLQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJLy8gbmV3Ci0JCS8vIG5vZGUKLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIGluc2VydE1pc3NpbmdUYWdzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRNaXNzaW5nVGFncyA9IGdldENsZWFudXBQcmVmZXJlbmNlcygpLmdldEluc2VydE1pc3NpbmdUYWdzKCk7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpbnNlcnRNaXNzaW5nVGFncykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChzdGFydFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJLy8gaW1wbGljaXQgc3RhcnQgdGFnOyBnZW5lcmF0ZSB0YWcgZm9yIGl0Ci0JCQkJbmV3Tm9kZSA9IGluc2VydFN0YXJ0VGFnKG5vZGUpOwotCQkJCXN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3Tm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJVGV4dFJlZ2lvbkxpc3Qgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwgJiYgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zICE9IG51bGwgJiYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uUmVnaW9ucy5nZXQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25SZWdpb25zLnNpemUoKSAtIDEpKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0KLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJLy8gc3RhcnQgdGFnIG1pc3NpbmcKLQkJCQkJaWYgKGlzU3RhcnRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRTdGFydFRhZyhuZXdOb2RlKTsKLQkJCQl9IGVsc2UgaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCS8vIGVuZCB0YWcgbWlzc2luZwotCQkJCQlpZiAoaXNFbmRUYWdSZXF1aXJlZChuZXdOb2RlKSkKLQkJCQkJCW5ld05vZGUgPSBpbnNlcnRFbmRUYWcobmV3Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRSZXF1aXJlZEF0dHJzKElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiBpbnNlcnRSZXF1aXJlZEF0dHJzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0SW5zZXJ0UmVxdWlyZWRBdHRycygpOwotCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQotCQlpZiAoaW5zZXJ0UmVxdWlyZWRBdHRycykgewotCQkJTGlzdCByZXF1aXJlZEF0dHJzID0gZ2V0UmVxdWlyZWRBdHRycyhuZXdOb2RlKTsKLQkJCWlmIChyZXF1aXJlZEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQlOYW1lZE5vZGVNYXAgY3VycmVudEF0dHJzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJTGlzdCBpbnNlcnRBdHRycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlpZiAoY3VycmVudEF0dHJzLmdldExlbmd0aCgpID09IDApCi0JCQkJCWluc2VydEF0dHJzLmFkZEFsbChyZXF1aXJlZEF0dHJzKTsKLQkJCQllbHNlIHsKLQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyTmFtZSA9ICgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgcmVxdWlyZWRBdHRycy5nZXQoaSkpLmdldEF0dHJOYW1lKCk7Ci0JCQkJCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJU3RyaW5nIGN1cnJlbnRBdHRyTmFtZSA9IGN1cnJlbnRBdHRycy5pdGVtKGopLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJaWYgKHJlcXVpcmVkQXR0ck5hbWUuY29tcGFyZVRvSWdub3JlQ2FzZShjdXJyZW50QXR0ck5hbWUpID09IDApIHsKLQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCQlpZiAoIWZvdW5kKQotCQkJCQkJCWluc2VydEF0dHJzLmFkZChyZXF1aXJlZEF0dHJzLmdldChpKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKGluc2VydEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ld05vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaW50IGluZGV4ID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMYXN0UmVnaW9uKCk7Ci0JCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4LS07Ci0JCQkJCQlsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW5kZXggLSAxKTsKLQkJCQkJfSBlbHNlIGlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpIHsKLQkJCQkJCWluZGV4ID0gaW5kZXggLSAyOwotCQkJCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCQkJCX0KLQkJCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCQkJdHJ5IHsKLQkJCQkJCWZvciAoaW50IGkgPSBpbnNlcnRBdHRycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgaW5zZXJ0QXR0cnMuZ2V0KGkpOwotCQkJCQkJCVN0cmluZyByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyRGVjbC5nZXREZWZhdWx0VmFsdWUoKTsKLQkJCQkJCQlpZiAoZGVmYXVsdFZhbHVlID09IG51bGwpCi0JCQkJCQkJCWRlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJU3RyaW5nIG5hbWVBbmREZWZhdWx0VmFsdWUgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlpZiAoaSA9PSAwICYmIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCkgPiBsYXN0UmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJbmFtZUFuZERlZmF1bHRWYWx1ZSArPSByZXF1aXJlZEF0dHJpYnV0ZU5hbWUgKyAiPVwiIiArIGRlZmF1bHRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoaW5kZXgsIG5hbWVBbmREZWZhdWx0VmFsdWUpKTsKLQkJCQkJCQkvLyBCVUczMzgxOiBNdWx0aVRleHRFZGl0IGFwcGxpZXMgYWxsIGNoaWxkCi0JCQkJCQkJLy8gVGV4dEVkaXQncyBiYXNpbmcgb24gb2Zmc2V0cwotCQkJCQkJCS8vICAgICAgICAgIGluIHRoZSBkb2N1bWVudCBiZWZvcmUgdGhlIGZpcnN0IFRleHRFZGl0LCBub3QKLQkJCQkJCQkvLyBhZnRlciBlYWNoCi0JCQkJCQkJLy8gICAgICAgICAgY2hpbGQgVGV4dEVkaXQuIFRoZXJlZm9yZSwgZG8gbm90IG5lZWQgdG8KLQkJCQkJCQkvLyBhZHZhbmNlIHRoZSBpbmRleC4KLQkJCQkJCQkvL2luZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCQltdWx0aVRleHRFZGl0LmFwcGx5KG5ld05vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkpOwotCQkJCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIHdlIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSBJRE9NTm9kZSBpbnNlcnRTdGFydFRhZyhJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5ld05vZGUgPSBub2RlOwotCi0JCWlmIChpc0NvbW1lbnRUYWcobm9kZSkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCVN0cmluZyB0YWdOYW1lID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgc3RhcnRUYWcgPSBTVEFSVF9UQUdfT1BFTi5jb25jYXQodGFnTmFtZSkuY29uY2F0KFRBR19DTE9TRSk7Ci0JCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCi0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlzdHJ1Y3R1cmVkRG9jdW1lbnQucmVwbGFjZVRleHQoc3RydWN0dXJlZERvY3VtZW50LCBzdGFydFRhZ1N0YXJ0T2Zmc2V0LCAwLCBzdGFydFRhZyk7Ci0JCW5ld05vZGUgPSAoSURPTU5vZGUpIHN0cnVjdHVyZWRNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnU3RhcnRPZmZzZXQpOyAvLyBzYXZlCi0JCS8vIG5ldwotCQkvLyBub2RlCi0KLQkJcmV0dXJuIG5ld05vZGU7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGluc2VydFRhZ0Nsb3NlKElET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCBmbGF0bm9kZVJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQlpZiAoZmxhdG5vZGVSZWdpb25zICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gZmxhdG5vZGVSZWdpb25zLmdldChmbGF0bm9kZVJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJaWYgKGxhc3RSZWdpb24gIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IGxhc3RSZWdpb24uZ2V0VHlwZSgpOwotCQkJCQlpZiAoKHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSAmJiAocmVnaW9uVHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpKSB7Ci0JCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQkJCQkJLy8gaW5zZXJ0ICI+IiBhZnRlciBsYXN0UmVnaW9uIG9mIGZsYXROb2RlCi0JCQkJCQkvLyBhcyBpbiAiPGE8L2E+IiBpZiBmbGF0Tm9kZSBpcyBmb3Igc3RhcnQgdGFnLCBvciBpbgotCQkJCQkJLy8gIjxhPjwvYSIgaWYgZmxhdE5vZGUgaXMgZm9yIGVuZCB0YWcKLQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQobGFzdFJlZ2lvbiksIDAsICI+Iik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEBwYXJhbSByZW5hbWVkTm9kZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50VGFnKE5vZGUgcmVuYW1lZE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHJlbmFtZWROb2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIHJlbmFtZWROb2RlOwotCQkJcmVzdWx0ID0gZWxlbWVudC5pc0NvbW1lbnRUYWcoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0VtcHR5RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJLy8gdW5kZWZpbmVkIHRhZywgcmV0dXJuIGRlZmF1bHQKLQkJCXJldHVybiBmYWxzZTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGRvY3VtZW50KTsKLQkJaWYgKG1vZGVsUXVlcnkgPT0gbnVsbCkKLQkJCS8vIHVuZGVmaW5lZCB0YWcsIHJldHVybiBkZWZhdWx0Ci0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQkvLyB1bmRlZmluZWQgdGFnLCByZXR1cm4gZGVmYXVsdAotCQkJcmV0dXJuIGZhbHNlOwotCi0JCXJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWdSZXF1aXJlZChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBub2RlLmlzQ29udGFpbmVyKCk7Ci0JfQotCi0JLyoqCi0JICogQSB0YWcgaXMgaW1wbGljaXQgaWYgaXQgaGFzIG5vdCBjb3JyZXNwb25kaW5nIHJlZ2lvbiBpbiBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gcmVuYW1lZE5vZGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW1wbGljaXRUYWcoSURPTU5vZGUgcmVuYW1lZE5vZGUpIHsKLQkJcmV0dXJuIHJlbmFtZWROb2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZW5kIHRhZ3Mgb2YgSFRNTCBFTVBUWSBjb250ZW50IHR5cGUsIHN1Y2ggYXMgSU1HLCBhbmQgSFRNTAotCSAqIHVuZGVmaW5lZCB0YWdzIGFyZSBwYXJzZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBzdGFydCB0YWdzLiBTbyBpbnNlcnRpbmcKLQkgKiB0aGUgbWlzc2luZyBzdGFydCB0YWcgaXMgdXNlbGVzcyBhbmQgZXZlbiBoYXJtZnVsLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBpc1N0YXJ0VGFnUmVxdWlyZWQoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gbm9kZS5pc0NvbnRhaW5lcigpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1hNTFR5cGUoSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCi0JCWlmIChzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCAmJiBzdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKQotCQkJCXJlc3VsdCA9IGRvY3VtZW50LmlzWE1MVHlwZSgpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIElET01Ob2RlIHF1b3RlQXR0clZhbHVlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgbmV3Tm9kZSA9IG5vZGU7Ci0JCS8vWE1MRWxlbWVudCBlbGVtZW50ID0gKFhNTEVsZW1lbnQpIG5vZGU7Ci0JCWlmIChpc0NvbW1lbnRUYWcobm9kZSkpCi0JCQlyZXR1cm4gbm9kZTsgLy8gZG8gbm90aGluZwotCi0JCWJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzID0gZ2V0Q2xlYW51cFByZWZlcmVuY2VzKCkuZ2V0UXVvdGVBdHRyVmFsdWVzKCk7Ci0KLQkJaWYgKHF1b3RlQXR0clZhbHVlcykgewotCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBuZXdOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCQlpbnQgYXR0cmlidXRlc0xlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBub2RlLmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXNMZW5ndGg7IGkrKykgewotCQkJCQlhdHRyaWJ1dGVzID0gbmV3Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCWF0dHJpYnV0ZXNMZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQkJCQlJRE9NQXR0ciBlYWNoQXR0ciA9IChJRE9NQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCQkvL0lUZXh0UmVnaW9uIG9sZEF0dHJWYWx1ZVJlZ2lvbiA9Ci0JCQkJCS8vIGVhY2hBdHRyLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQkJCVN0cmluZyBvbGRBdHRyVmFsdWUgPSBlYWNoQXR0ci5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKG9sZEF0dHJWYWx1ZSA9PSBudWxsKSB7Ci0JCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJaWYgKGlzWE1MVHlwZShzdHJ1Y3R1cmVkTW9kZWwpKSB7Ci0JCQkJCQkJU3RyaW5nIG5ld0F0dHJWYWx1ZSA9ICJcIiIgKyBlYWNoQXR0ci5nZXROYW1lUmVnaW9uVGV4dCgpICsgIlwiIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQlpZiAoZWFjaEF0dHIuZ2V0RXF1YWxSZWdpb24oKSAhPSBudWxsKQotCQkJCQkJCQkvLyBlcXVhbCByZWdpb24gZXhpc3RzCi0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldEVuZE9mZnNldCgpLCAwLCBuZXdBdHRyVmFsdWUpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJLy8gbm8gZXF1YWwgcmVnaW9uCi0JCQkJCQkJCXN0cnVjdHVyZWREb2N1bWVudC5yZXBsYWNlVGV4dChzdHJ1Y3R1cmVkRG9jdW1lbnQsIGVhY2hBdHRyLmdldE5hbWVSZWdpb25UZXh0RW5kT2Zmc2V0KCksIDAsICI9Ii5jb25jYXQobmV3QXR0clZhbHVlKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOyAvLyBzYXZlCi0JCQkJCQkJLy8gbmV3Ci0JCQkJCQkJLy8gbm9kZQotCQkJCQkJfQotCQkJCQl9IGVsc2UgewotCQkJCQkJLy9TdHJpbmcgb2xkQXR0clZhbHVlID0gb2xkQXR0clZhbHVlUmVnaW9uLmdldFRleHQoKTsKLQkJCQkJCWNoYXIgcXVvdGUgPSBTdHJpbmdVdGlscy5pc1F1b3RlZChvbGRBdHRyVmFsdWUpID8gb2xkQXR0clZhbHVlLmNoYXJBdCgwKSA6IERPVUJMRV9RVU9URTsKLQkJCQkJCVN0cmluZyBuZXdBdHRyVmFsdWUgPSBnZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoZWFjaEF0dHIsIHF1b3RlKTsKLQotCQkJCQkJLy8gVGhlcmUgaXMgYSBwcm9ibGVtIGluCi0JCQkJCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEF0dHJWYWx1ZShJVGV4dFJlZ2lvbikKLQkJCQkJCS8vIHdoZW4gdGhlIHJlZ2lvbiBpcyBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24uCi0JCQkJCQkvLyBXb3JrYXJvdW5kIGZvciBub3cuLi4KLQkJCQkJCWlmIChvbGRBdHRyVmFsdWUubGVuZ3RoKCkgPT0gMSkgewotCQkJCQkJCWNoYXIgZmlyc3RDaGFyID0gb2xkQXR0clZhbHVlLmNoYXJBdCgwKTsKLQkJCQkJCQlpZiAoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkKLQkJCQkJCQkJbmV3QXR0clZhbHVlID0gU0lOR0xFX1FVT1RFUzsKLQkJCQkJCQllbHNlIGlmIChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKQotCQkJCQkJCQluZXdBdHRyVmFsdWUgPSBET1VCTEVfUVVPVEVTOwotCQkJCQkJfQotCi0JCQkJCQlpZiAobmV3QXR0clZhbHVlICE9IG51bGwpIHsKLQkJCQkJCQlpZiAobmV3QXR0clZhbHVlLmNvbXBhcmVUbyhvbGRBdHRyVmFsdWUpICE9IDApIHsKLQkJCQkJCQkJaW50IGF0dHJWYWx1ZVN0YXJ0T2Zmc2V0ID0gZWFjaEF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCQkJCQkJCQlpbnQgYXR0clZhbHVlTGVuZ3RoID0gb2xkQXR0clZhbHVlLmxlbmd0aCgpOwotCQkJCQkJCQlpbnQgc3RhcnRUYWdTdGFydE9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQkJCQkJCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCQkJCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgYXR0clZhbHVlU3RhcnRPZmZzZXQsIGF0dHJWYWx1ZUxlbmd0aCwgbmV3QXR0clZhbHVlKTsKLQkJCQkJCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7IC8vIHNhdmUKLQkJCQkJCQkJLy8gbmV3Ci0JCQkJCQkJCS8vIG5vZGUKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbmV3Tm9kZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvTm9kZUNsZWFudXBIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZTdmZWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jbGVhbnVwL05vZGVDbGVhbnVwSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5JU3RydWN0dXJlZENsZWFudXBIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLklTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5jbGVhbnVwLlN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgTm9kZUNsZWFudXBIYW5kbGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDbGVhbnVwSGFuZGxlciB7Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMgZkNsZWFudXBQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIElQcm9ncmVzc01vbml0b3IgZlByb2dyZXNzTW9uaXRvciA9IG51bGw7Ci0KLQotCXB1YmxpYyBOb2RlIGNsZWFudXAoTm9kZSBub2RlKSB7Ci0KLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzIGdldENsZWFudXBQcmVmZXJlbmNlcygpIHsKLQkJaWYgKGZDbGVhbnVwUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkNsZWFudXBQcmVmZXJlbmNlcyA9IG5ldyBTdHJ1Y3R1cmVkQ2xlYW51cFByZWZlcmVuY2VzKCk7Ci0KLQkJCVByZWZlcmVuY2VzIHByZWZlcmVuY2VzID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpOwotCQkJaWYgKHByZWZlcmVuY2VzICE9IG51bGwpIHsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbXByZXNzRW1wdHlFbGVtZW50VGFncyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRJbnNlcnRSZXF1aXJlZEF0dHJzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfUkVRVUlSRURfQVRUUlMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEluc2VydE1pc3NpbmdUYWdzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRRdW90ZUF0dHJWYWx1ZXMocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKSk7Ci0JCQkJZkNsZWFudXBQcmVmZXJlbmNlcy5zZXRGb3JtYXRTb3VyY2UocHJlZmVyZW5jZXMuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldENvbnZlcnRFT0xDb2RlcyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJCQlmQ2xlYW51cFByZWZlcmVuY2VzLnNldEVPTENvZGUocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSkpOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZDbGVhbnVwUHJlZmVyZW5jZXM7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENsZWFudXBQcmVmZXJlbmNlcyhJU3RydWN0dXJlZENsZWFudXBQcmVmZXJlbmNlcyBjbGVhbnVwUHJlZmVyZW5jZXMpIHsKLQotCQlmQ2xlYW51cFByZWZlcmVuY2VzID0gY2xlYW51cFByZWZlcmVuY2VzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NsZWFudXAvWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDk1YTVjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY2xlYW51cC9YTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuU1NFQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTFByZWZlcmVuY2VOYW1lczsKLQotLyoqCi0gKiBAZGVwcmVjYXRlZCByZW5hbWVkIHRvIFN0cnVjdHVyZWRDbGVhbnVwUHJlZmVyZW5jZXMKLSAqIAotICogVE9ETyB3aWxsIGRlbGV0ZSBpbiBDNQotICovCi1wdWJsaWMgY2xhc3MgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCB7Ci0KLQlwcml2YXRlIHN0YXRpYyBYTUxDbGVhbnVwUHJlZmVyZW5jZXNJbXBsIGZJbnN0YW5jZTsKLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhNTENsZWFudXBQcmVmZXJlbmNlc0ltcGwgZ2V0SW5zdGFuY2UoKSB7Ci0KLQkJLy8gYWRkZWQgZm9yIG9uZSBtZXRob2QgaW4gQ2xlYW51cERpYWxvZyAuLi4gbWF5IGJlIGJldHRlciB3YXkKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgWE1MQ2xlYW51cFByZWZlcmVuY2VzSW1wbCgpOwotCQl9Ci0JCXJldHVybiBmSW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZkF0dHJOYW1lQ2FzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkNvbnZlcnRFT0xDb2RlczsKLQlwcml2YXRlIFN0cmluZyBmRU9MQ29kZTsKLQlwcml2YXRlIGJvb2xlYW4gZkZvcm1hdFNvdXJjZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluc2VydE1pc3NpbmdUYWdzOwotCS8vIHByaXZhdGUgSVByZWZlcmVuY2VTdG9yZSBmUHJlZmVyZW5jZVN0b3JlID0gbnVsbDsKLQlwcml2YXRlIFByZWZlcmVuY2VzIGZQcmVmZXJlbmNlcyA9IG51bGw7Ci0JcHJpdmF0ZSBib29sZWFuIGZRdW90ZUF0dHJWYWx1ZXM7Ci0JcHJpdmF0ZSBpbnQgZlRhZ05hbWVDYXNlOwotCi0JcHVibGljIGludCBnZXRBdHRyTmFtZUNhc2UoKSB7Ci0KLQkJcmV0dXJuIGZBdHRyTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Q29udmVydEVPTENvZGVzKCkgewotCi0JCXJldHVybiBmQ29udmVydEVPTENvZGVzOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RU9MQ29kZSgpIHsKLQotCQlyZXR1cm4gZkVPTENvZGU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZ2V0Rm9ybWF0U291cmNlKCkgewotCi0JCXJldHVybiBmRm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEluc2VydE1pc3NpbmdUYWdzKCkgewotCi0JCXJldHVybiBmSW5zZXJ0TWlzc2luZ1RhZ3M7Ci0JfQotCi0JcHVibGljIFByZWZlcmVuY2VzIGdldFByZWZlcmVuY2VzKCkgewotCi0JCWlmIChmUHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZlByZWZlcmVuY2VzID0gU1NFQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJfQotCQlyZXR1cm4gZlByZWZlcmVuY2VzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldFF1b3RlQXR0clZhbHVlcygpIHsKLQotCQlyZXR1cm4gZlF1b3RlQXR0clZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRhZ05hbWVDYXNlKCkgewotCi0JCXJldHVybiBmVGFnTmFtZUNhc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QXR0ck5hbWVDYXNlKGludCBhdHRyTmFtZUNhc2UpIHsKLQotCQlmQXR0ck5hbWVDYXNlID0gYXR0ck5hbWVDYXNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnZlcnRFT0xDb2Rlcyhib29sZWFuIGNvbnZlcnRFT0xDb2RlcykgewotCi0JCWZDb252ZXJ0RU9MQ29kZXMgPSBjb252ZXJ0RU9MQ29kZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RU9MQ29kZShTdHJpbmcgRU9MQ29kZSkgewotCi0JCWZFT0xDb2RlID0gRU9MQ29kZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGb3JtYXRTb3VyY2UoYm9vbGVhbiBmb3JtYXRTb3VyY2UpIHsKLQotCQlmRm9ybWF0U291cmNlID0gZm9ybWF0U291cmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEluc2VydE1pc3NpbmdUYWdzKGJvb2xlYW4gaW5zZXJ0TWlzc2luZ1RhZ3MpIHsKLQotCQlmSW5zZXJ0TWlzc2luZ1RhZ3MgPSBpbnNlcnRNaXNzaW5nVGFnczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQcmVmZXJlbmNlcyhQcmVmZXJlbmNlcyBwcmVmcykgewotCi0JCWZQcmVmZXJlbmNlcyA9IHByZWZzOwotCQl1cGRhdGVPcHRpb25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UXVvdGVBdHRyVmFsdWVzKGJvb2xlYW4gcXVvdGVBdHRyVmFsdWVzKSB7Ci0KLQkJZlF1b3RlQXR0clZhbHVlcyA9IHF1b3RlQXR0clZhbHVlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUYWdOYW1lQ2FzZShpbnQgdGFnTmFtZUNhc2UpIHsKLQotCQlmVGFnTmFtZUNhc2UgPSB0YWdOYW1lQ2FzZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVPcHRpb25zKCkgewotCi0JCVByZWZlcmVuY2VzIHAgPSBnZXRQcmVmZXJlbmNlcygpOwotCQlmVGFnTmFtZUNhc2UgPSBwLmdldEludChJWE1MUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfVEFHX05BTUVfQ0FTRSk7Ci0JCWZBdHRyTmFtZUNhc2UgPSBwLmdldEludChJWE1MUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfQVRUUl9OQU1FX0NBU0UpOwotCQlmSW5zZXJ0TWlzc2luZ1RhZ3MgPSBwLmdldEJvb2xlYW4oSVhNTFByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKTsKLQkJZlF1b3RlQXR0clZhbHVlcyA9IHAuZ2V0Qm9vbGVhbihJWE1MUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTKTsKLQkJZkZvcm1hdFNvdXJjZSA9IHAuZ2V0Qm9vbGVhbihJWE1MUHJlZmVyZW5jZU5hbWVzLkZPUk1BVF9TT1VSQ0UpOwotCQlmQ29udmVydEVPTENvZGVzID0gcC5nZXRCb29sZWFuKElYTUxQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpOwotCQlmRU9MQ29kZSA9IHAuZ2V0U3RyaW5nKElYTUxQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxYzQzOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LlRhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRBZGFwdGVyIGltcGxlbWVudHMgVGFnQWRhcHRlciB7Ci0JcHJpdmF0ZSBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gZkNvbmZpZ3VyYXRpb247Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVuZFRhZzsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlcjsKLQotCXB1YmxpYyBDb21tZW50RWxlbWVudEFkYXB0ZXIoYm9vbGVhbiBpc0VuZFRhZywgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJZkVuZFRhZyA9IGlzRW5kVGFnOwotCQlmSGFuZGxlciA9IGhhbmRsZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVDb21tZW50Q2xvc2UoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQuaXNKU1BUYWcoKSkgPyAiLS0lPiIgOiAiLS0+IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2VuZXJhdGVDb21tZW50T3BlbihJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCXJldHVybiAoZWxlbWVudC5pc0pTUFRhZygpKSA/ICI8JS0tIiA6ICI8IS0tIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKLQkJcmV0dXJuIGZDb25maWd1cmF0aW9uOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJU3RyaW5nIGNvbnRlbnQgPSBmSGFuZGxlci5nZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChjb250ZW50ID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLQkJYnVmZmVyLmFwcGVuZChnZW5lcmF0ZUNvbW1lbnRPcGVuKGVsZW1lbnQpKTsKLQkJYnVmZmVyLmFwcGVuZChjb250ZW50KTsKLQkJYnVmZmVyLmFwcGVuZChnZW5lcmF0ZUNvbW1lbnRDbG9zZShlbGVtZW50KSk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SGFuZGxlcklEKCkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLmdldEhhbmRsZXJJRCgpOwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KG5hbWUpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3RhcnRUYWcoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgY29udGVudCA9IGZIYW5kbGVyLmdlbmVyYXRlU3RhcnRUYWdDb250ZW50KGVsZW1lbnQpOwotCQlpZiAoY29udGVudCA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50T3BlbihlbGVtZW50KSk7Ci0JCWJ1ZmZlci5hcHBlbmQoY29udGVudCk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2VuZXJhdGVDb21tZW50Q2xvc2UoZWxlbWVudCkpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiAodHlwZSA9PSBDb21tZW50RWxlbWVudEFkYXB0ZXIuY2xhc3MgfHwgdHlwZSA9PSBUYWdBZGFwdGVyLmNsYXNzKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuICghZkhhbmRsZXIuaXNFbXB0eSgpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VuZFRhZygpIHsKLQkJcmV0dXJuIGZFbmRUYWc7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29uZmlndXJhdGlvbihDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgewotCQlmQ29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEhhbmRsZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzZDdmM2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9Db21tZW50RWxlbWVudEhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSBwcmVmaXggb2YgdGhlIGNvbW1lbnQgY29udGVudCBtYXRjaGVzCi0JICogdGhlIHN0cmluZyBzcGVjaWZpZWQgaW4gJmx0O3N0YXJ0c3dpdGggcHJlZml4PSIiLyZndDsgaW4gcGx1Z2luCi0JICogZXh0ZW5zaW9uLiBDb21tZW50IGNvbnRlbnQgaXMgcGFyc2VkIGFuZCBuZXcgRE9NIGVsZW1lbnQgaXMgY3JlYXRlZCBpbgotCSAqIHRoaXMgbWV0aG9kLiBJbXBsZW1lbnRvciBoYXMgdG8gZG8gZm9sbG93aW5nOgotCSAqIDxsaT5Gb3Igc3RhcnQgdGFnIDoKLQkgKiA8dWw+Ci0JICogPGxpPnBhcnNlIGNvbW1lbnQgY29udGVudCBhbmQgY3JlYXRlIG5ldyBlbGVtZW50IGluc3RhbmNlLjwvbGk+Ci0JICogPC91bD4KLQkgKiA8L2xpPgotCSAqIDxsaT5Gb3IgZW5kIHRhZyA6Ci0JICogPHVsPgotCSAqIDxsaT5wYXJzZSBjb21tZW50IGNvbnRlbnQgYW5kIGNyZWF0ZSBuZXcgZWxlbWVudCBpbnN0YW5jZS48L2xpPgotCSAqIDxsaT5tYWtlIGlzRW5kVGFnIGZsYWcgdHJ1ZS48L2xpPgotCSAqIDxsaT5QYXJzZXIgZnJhbWV3b3JrIHNlYXJjaGVzIG1hY2hlZCBzdGFydCB0YWcgZWxlbWVudCBpbnN0YW5jZSBhZnRlcgotCSAqIHRoaXMgY3JlYXRlRWxlbWVudCBjYWxsLCBhbmQgbmV3IGluc3RhbmNlIGlzIGp1c3QgdGhyb3duIGF3YXkuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogPGxpPkZvciBlbXB0eSB0YWcgOgotCSAqIDx1bD4KLQkgKiA8bGk+cGFyc2UgY29tbWVudCBjb250ZW50IGFuZCBjcmVhdGUgbmV3IGVsZW1lbnQgaW5zdGFuY2UuPC9saT4KLQkgKiA8bGk+bWFrZSBpc0VuZFRhZyBmbGFnIHRydWUuPC9saT4KLQkgKiA8L3VsPgotCSAqIDwvbGk+Ci0JICogCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICBwYXJlbnQgRE9NIGRvY3VtZW50Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGNvbW1lbnQgY29udGVudC4gY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSksIHN1ZmZpeAotCSAqICAgICAgICAgICAgKC0tJmd0OyBvciAtLSUmZ3Q7KSwgYW5kIHN1cnJvdW5kaW5nIHNwYWNlcyBhcmUgdHJpbW1lZC4KLQkgKiBAcGFyYW0gaXNKU1BUYWcKLQkgKiAgICAgICAgICAgIHRydWUgaWYgdGhlIGNvbW1lbnQgaXMgSlNQIHN0eWxlIGNvbW1lbnQuIFRoaXMgaW5mb3JtYXRpb24KLQkgKiAgICAgICAgICAgIG1heSBiZSByZXF1aXJlZCBieSBoYW5kbGVyIHdoZW4gdGhlIGhhbmRsZXIgYWNjZXB0cyBib3RoIFhNTAotCSAqICAgICAgICAgICAgc3R5bGUgYW5kIEpTUCBzdHlsZSBjb21tZW50IChuYW1lbHksCi0JICogICAgICAgICAgICBjb21tZW50dHlwZT0mcXVvdDtib3RoJnF1b3Q7IGluIHBsdWdpbi54bWwpLgotCSAqIEByZXR1cm4gY29tbWVudCBlbGVtZW50IGluc3RhbmNlIGlmIHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcmlnaHRseQotCSAqICAgICAgICAgcGFyc2VkLiBpZiBwYXJzZSBmYWlsZWQsIHJldHVybnMgbnVsbC4KLQkgKi8KLQlFbGVtZW50IGNyZWF0ZUVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBkYXRhLCBib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGdlbmVyYXRlcyB0aGUgc291cmNlIHRleHQgb2YgdGhlIGVuZCB0YWcgZm9yIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBEbyBub3QgZ2VuZXJhdGUgY29tbWVudCBwcmVmaXggKCZsdDshLS0gb3IgJmx0OyUtLSkgYW5kIHN1ZmZpeAotCSAqICgtLSZndDsgb3IgLS0lJmd0OykuIFhNTEdlbmVyYXRvciB1c2VzIHRoaXMgbWV0aG9kIHRvIGdlbmVyYXRlIFhNTC9IVE1MCi0JICogc291cmNlIGZvciBhIGNvbW1lbnQgZWxlbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgdGhlIGNvbW1lbnQgZWxlbWVudAotCSAqIEByZXR1cm4gZ2VuZXJhdGVkIHRhZyBzdHJpbmcKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVFbmRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIHRoZSBzb3VyY2UgdGV4dCBvZiB0aGUgc3RhcnQgdGFnIGZvciB0aGUgcGFzc2VkCi0JICogZWxlbWVudC4gRG8gbm90IGdlbmVyYXRlIGNvbW1lbnQgcHJlZml4ICgmbHQ7IS0tIG9yICZsdDslLS0pIGFuZCBzdWZmaXgKLQkgKiAoLS0mZ3Q7IG9yIC0tJSZndDspLiBYTUxHZW5lcmF0b3IgdXNlcyB0aGlzIG1ldGhvZCB0byBnZW5lcmF0ZSBYTUwvSFRNTAotCSAqIHNvdXJjZSBmb3IgYSBjb21tZW50IGVsZW1lbnQuCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBjb21tZW50IGVsZW1lbnQKLQkgKiBAcmV0dXJuIGdlbmVyYXRlZCB0YWcgc3RyaW5nCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50Ci0JICogQHJldHVybiBib29sZWFuIHdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY29tbWVudCBlbGVtZW50IG9yIG5vdAotCSAqLwotCWJvb2xlYW4gaXNDb21tZW50RWxlbWVudChJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiB3aGV0aGVyIHRoaXMgZWxlbWVudCBjYW4gaGF2ZSBjaGlsZHJlbiBvciBub3QKLQkgKi8KLQlib29sZWFuIGlzRW1wdHkoKTsKLQotCS8qKgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JLy8JU3RyaW5nIGdldEVsZW1lbnRQcmVmaXgoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9CYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjgzOTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0Jhc2ljQ29tbWVudEVsZW1lbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsLkNvbW1lbnRFbGVtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQudXRpbC5UYWdTY2FubmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLQotCi0vKioKLSAqLwotY2xhc3MgQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIgaW1wbGVtZW50cyBDb21tZW50RWxlbWVudEhhbmRsZXIgewotCi0JcHJpdmF0ZSBTdHJpbmcgZWxlbWVudE5hbWU7Ci0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHk7Ci0KLQlwdWJsaWMgQmFzaWNDb21tZW50RWxlbWVudEhhbmRsZXIoU3RyaW5nIGVsZW1lbnROYW1lLCBib29sZWFuIGlzRW1wdHkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5lbGVtZW50TmFtZSA9IGVsZW1lbnROYW1lOwotCQl0aGlzLmlzRW1wdHkgPSBpc0VtcHR5OwotCX0KLQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJRWxlbWVudCBlbGVtZW50ID0gbnVsbDsKLQkJU3RyaW5nIHN0ciA9IGRhdGEudHJpbSgpOwotCQlDb21tZW50RWxlbWVudEZhY3RvcnkgZmFjdG9yeSA9IG5ldyBDb21tZW50RWxlbWVudEZhY3RvcnkoZG9jdW1lbnQsIGlzSlNQVGFnLCB0aGlzKTsKLQkJaWYgKHN0ci5jaGFyQXQoMCkgPT0gJy8nKSB7IC8vIGVuZCB0YWcKLQkJCVRhZ1NjYW5uZXIgc2Nhbm5lciA9IG5ldyBUYWdTY2FubmVyKHN0ciwgMSk7IC8vIHNraXAgJy8nCi0JCQlTdHJpbmcgbmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJCWlmIChuYW1lLmVxdWFscyhlbGVtZW50TmFtZSkpIHsKLQkJCQllbGVtZW50ID0gZmFjdG9yeS5jcmVhdGUobmFtZSwgQ29tbWVudEVsZW1lbnRGYWN0b3J5LklTX0VORCk7Ci0JCQl9Ci0JCX0gZWxzZSB7IC8vIHN0YXJ0IHRhZwotCQkJVGFnU2Nhbm5lciBzY2FubmVyID0gbmV3IFRhZ1NjYW5uZXIoc3RyLCAwKTsKLQkJCVN0cmluZyBuYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJaWYgKG5hbWUuZXF1YWxzKGVsZW1lbnROYW1lKSkgewotCQkJCWVsZW1lbnQgPSBmYWN0b3J5LmNyZWF0ZShuYW1lLCAoaXNFbXB0eSkgPyBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfRU1QVFkgOiBDb21tZW50RWxlbWVudEZhY3RvcnkuSVNfU1RBUlQpOwotCQkJCS8vIHNldCBhdHRyaWJ1dGVzCi0JCQkJU3RyaW5nIGF0dHJOYW1lID0gc2Nhbm5lci5uZXh0TmFtZSgpOwotCQkJCXdoaWxlIChhdHRyTmFtZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyBhdHRyVmFsdWUgPSBzY2FubmVyLm5leHRWYWx1ZSgpOwotCQkJCQlBdHRyIGF0dHIgPSBkb2N1bWVudC5jcmVhdGVBdHRyaWJ1dGUoYXR0ck5hbWUpOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoYXR0clZhbHVlICE9IG51bGwpCi0JCQkJCQkJKChJRE9NQXR0cikgYXR0cikuc2V0VmFsdWVTb3VyY2UoYXR0clZhbHVlKTsKLQkJCQkJCWVsZW1lbnQuc2V0QXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQkJfQotCQkJCQlhdHRyTmFtZSA9IHNjYW5uZXIubmV4dE5hbWUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlRW5kVGFnQ29udGVudChJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChpc0VtcHR5KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKCIgLyIpOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTdGFydFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlJU291cmNlR2VuZXJhdG9yIGdlbmVyYXRvciA9IGVsZW1lbnQuZ2V0TW9kZWwoKS5nZXRHZW5lcmF0b3IoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCi0JCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWludCBsZW5ndGggPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJU3RyaW5nIGF0dHJOYW1lID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0ck5hbWUoYXR0cik7Ci0JCQlpZiAoYXR0ck5hbWUgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoYXR0ck5hbWUpOwotCQkJfQotCQkJU3RyaW5nIGF0dHJWYWx1ZSA9IGdlbmVyYXRvci5nZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCS8vIGF0dHIgbmFtZSBvbmx5IGZvciBIVE1MIGJvb2xlYW4gYW5kIEpTUAotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmdldFRhZ05hbWUoKS5lcXVhbHMoZWxlbWVudE5hbWUpKSA/IHRydWUgOiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotCQlyZXR1cm4gaXNFbXB0eTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbW1lbnRlbGVtZW50L2ltcGwvQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNTZlZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgTWFwIGZBdHRyaWJ1dGVzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZkN1c3RvbTsKLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCBmRWxlbWVudCA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkVtcHR5OwotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGZIYW5kbGVyID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBmSUQgPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmSlNQQ29tbWVudDsKLQlwcml2YXRlIFN0cmluZ1tdIGZQcmVmaXggPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBmWE1MQ29tbWVudDsKLQotCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQpIHsKLQkJc3VwZXIoKTsKLQkJZkVsZW1lbnQgPSBlbGVtZW50OwotCQlmQ3VzdG9tID0gKGVsZW1lbnQuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImhhbmRsZXItY3VzdG9tIikpID8gdHJ1ZSA6IGZhbHNlOyAvLyROT04tTkxTLTEkCi0KLQkJZmlsbEF0dHJpYnV0ZXMoZWxlbWVudCk7Ci0KLQkJZlhNTENvbW1lbnQgPSBmSlNQQ29tbWVudCA9IGZhbHNlOwotCQlTdHJpbmcgY29tbWVudFR5cGUgPSBnZXRQcm9wZXJ0eSgiY29tbWVudHR5cGUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29tbWVudFR5cGUuZXF1YWxzSWdub3JlQ2FzZSgieG1sIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZlhNTENvbW1lbnQgPSB0cnVlOwotCQl9IGVsc2UgaWYgKGNvbW1lbnRUeXBlLmVxdWFsc0lnbm9yZUNhc2UoImpzcCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCWZKU1BDb21tZW50ID0gdHJ1ZTsKLQkJfSBlbHNlIGlmIChjb21tZW50VHlwZS5lcXVhbHNJZ25vcmVDYXNlKCJib3RoIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJZlhNTENvbW1lbnQgPSBmSlNQQ29tbWVudCA9IHRydWU7Ci0JCX0KLQkJU3RyaW5nIGVtcHR5ID0gZ2V0UHJvcGVydHkoImlzZW1wdHkiKTsgLy8kTk9OLU5MUy0xJAotCQlmRW1wdHkgPSAoZW1wdHkgIT0gbnVsbCAmJiAhZW1wdHkuZXF1YWxzKCJmYWxzZSIpKSA/IHRydWUgOiBmYWxzZTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGFjY2VwdEpTUENvbW1lbnQoKSB7Ci0JCXJldHVybiBmSlNQQ29tbWVudDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBhY2NlcHRYTUxDb21tZW50KCkgewotCQlyZXR1cm4gZlhNTENvbW1lbnQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgZ2V0SGFuZGxlcigpLmNyZWF0ZUVsZW1lbnQoZG9jdW1lbnQsIGRhdGEsIGlzSlNQVGFnKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ29tbWVudEVsZW1lbnRBZGFwdGVyIGFkYXB0ZXIgPSAoQ29tbWVudEVsZW1lbnRBZGFwdGVyKSBlbGVtZW50LmdldEFkYXB0ZXJGb3IoQ29tbWVudEVsZW1lbnRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnNldENvbmZpZ3VyYXRpb24odGhpcyk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGZpbGxBdHRyaWJ1dGVzKElDb25maWd1cmF0aW9uRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChmQXR0cmlidXRlcyA9PSBudWxsKSB7Ci0JCQlmQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCX0gZWxzZSB7Ci0JCQlmQXR0cmlidXRlcy5jbGVhcigpOwotCQl9Ci0JCVN0cmluZ1tdIG5hbWVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVOYW1lcygpOwotCQlpZiAobmFtZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWludCBsZW5ndGggPSBuYW1lcy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyBuYW1lID0gbmFtZXNbaV07Ci0JCQlmQXR0cmlidXRlcy5wdXQobmFtZS50b0xvd2VyQ2FzZSgpLCBlbGVtZW50LmdldEF0dHJpYnV0ZShuYW1lKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0JCWlmIChmSGFuZGxlciA9PSBudWxsKSB7Ci0JCQlpZiAoZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCWlmIChpc0N1c3RvbSgpKSB7Ci0JCQkJCQlmSGFuZGxlciA9IChDb21tZW50RWxlbWVudEhhbmRsZXIpIGZFbGVtZW50LmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfSBlbHNlIHsKLQkJCQkJCVN0cmluZyBlbGVtZW50TmFtZSA9IGdldFByb3BlcnR5KCJlbGVtZW50bmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlmSGFuZGxlciA9IG5ldyBCYXNpY0NvbW1lbnRFbGVtZW50SGFuZGxlcihlbGVtZW50TmFtZSwgZkVtcHR5KTsKLQkJCQkJfQotCQkJCQkvLwkJCQkJKChBYnN0cmFjdENvbW1lbnRFbGVtZW50SGFuZGxlcilmSGFuZGxlcikuc2V0RWxlbWVudFByZWZpeChmRWxlbWVudC5nZXRBdHRyaWJ1dGUoInByZWZpeCIpKTsKLQkJCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQkvLyBjYXRjaCBhbmQgbG9nIChhbmQgaWdub3JlKSBBTlkgZXhjZXB0aW9uIGNyZWF0ZWQKLQkJCQkJLy8gYnkgZXhlY3V0YWJsZSBleHRlbnNpb24uCi0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCWZIYW5kbGVyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoZkhhbmRsZXIgPT0gbnVsbCkgewotCQkJCWZIYW5kbGVyID0gbmV3IENvbW1lbnRFbGVtZW50SGFuZGxlcigpIHsKLQkJCQkJcHVibGljIEVsZW1lbnQgY3JlYXRlRWxlbWVudChEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLQkJCQkJcHVibGljIFN0cmluZyBnZW5lcmF0ZUVuZFRhZ0NvbnRlbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCX0KLQotCQkJCQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWdDb250ZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBudWxsOwotCQkJCQl9Ci0KLS8vIHJlbW92ZWQgaW4gUkMyLCBybyByZW1vdmVkICJ1bnVzZWQiIGVycm9yL3dhcm5pbmcKLS8vCQkJCQlwdWJsaWMgU3RyaW5nIGdldEVsZW1lbnRQcmVmaXgoKSB7Ci0vLwkJCQkJCXJldHVybiBudWxsOwotLy8JCQkJCX0KLQotCQkJCQlwdWJsaWMgYm9vbGVhbiBpc0NvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJfQotCi0JCQkJCXB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9OwotCQkJfQotCQl9Ci0JCXJldHVybiBmSGFuZGxlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEhhbmRsZXJJRCgpIHsKLQkJaWYgKGZJRCA9PSBudWxsKSB7Ci0JCQlmSUQgPSBnZXRQcm9wZXJ0eSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKGZJRCA9PSBudWxsKSB7Ci0JCQkJaWYgKGlzQ3VzdG9tKCkpIHsKLQkJCQkJZklEID0gZ2V0UHJvcGVydHkoImNsYXNzIik7IC8vJE5PTi1OTFMtMSQJCQkJCi0JCQkJfSBlbHNlIHsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJYnVmLmFwcGVuZChmRWxlbWVudC5nZXREZWNsYXJpbmdFeHRlbnNpb24oKS5nZXROYW1lc3BhY2UoKSk7Ci0JCQkJCWJ1Zi5hcHBlbmQoJy4nKTsKLQkJCQkJYnVmLmFwcGVuZChnZXRQcm9wZXJ0eSgiZWxlbWVudG5hbWUiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZklEID0gYnVmLnRvU3RyaW5nKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmSUQ7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0UHJlZml4KCkgewotCQlpZiAoZlByZWZpeCA9PSBudWxsKSB7Ci0JCQlpZiAoZkVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmIChpc0N1c3RvbSgpKSB7IC8vIGN1c3RvbQotCQkJCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBwcmVmaXhlcyA9IGZFbGVtZW50LmdldENoaWxkcmVuKCJzdGFydHdpdGgiKTsgLy8kTk9OLU5MUy0xJAkKLQkJCQkJaWYgKHByZWZpeGVzICE9IG51bGwpIHsKLQkJCQkJCWZQcmVmaXggPSBuZXcgU3RyaW5nW3ByZWZpeGVzLmxlbmd0aF07Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJZlByZWZpeFtpXSA9IHByZWZpeGVzW2ldLmdldEF0dHJpYnV0ZSgicHJlZml4Iik7IC8vJE5PTi1OTFMtMSQJCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9IGVsc2UgeyAvLyBiYXNpYwotCQkJCQlTdHJpbmcgbmFtZSA9IGdldFByb3BlcnR5KCJlbGVtZW50bmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJCWlmIChpc0VtcHR5KCkpIHsKLQkJCQkJCQlmUHJlZml4ID0gbmV3IFN0cmluZ1sxXTsKLQkJCQkJCQlmUHJlZml4WzBdID0gbmFtZTsKLQkJCQkJCX0gZWxzZSB7Ci0JCQkJCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQkJZlByZWZpeFswXSA9IG5hbWU7Ci0JCQkJCQkJZlByZWZpeFsxXSA9ICcvJyArIG5hbWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGZQcmVmaXggPT0gbnVsbCkgewotCQkJZlByZWZpeCA9IG5ldyBTdHJpbmdbMV07Ci0JCQlmUHJlZml4WzBdID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZlByZWZpeDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7Ci0JCXJldHVybiAoZkF0dHJpYnV0ZXMgIT0gbnVsbCkgPyAoU3RyaW5nKSBmQXR0cmlidXRlcy5nZXQobmFtZSkgOiBudWxsOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0N1c3RvbSgpIHsKLQkJcmV0dXJuIGZDdXN0b207Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzRW1wdHkoKSB7Ci0JCXJldHVybiBmRW1wdHk7Ci0JfQotCi0Jdm9pZCBzZXR1cENvbW1lbnRFbGVtZW50KElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJZWxlbWVudC5zZXRDb21tZW50VGFnKHRydWUpOwotCQlDb21tZW50RWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IG5ldyBDb21tZW50RWxlbWVudEFkYXB0ZXIoZmFsc2UsIGZIYW5kbGVyKTsKLQkJYWRhcHRlci5zZXRDb25maWd1cmF0aW9uKHRoaXMpOwotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50UmVnaXN0cnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvaW1wbC9Db21tZW50RWxlbWVudFJlZ2lzdHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzUwYjUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC9pbXBsL0NvbW1lbnRFbGVtZW50UmVnaXN0cnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRSZWdpc3RyeSB7Ci0KLQlwcml2YXRlIHN0YXRpYyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IGZJbnN0YW5jZSA9IG51bGw7Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5IGdldEluc3RhbmNlKCkgewotCQlpZiAoZkluc3RhbmNlID09IG51bGwpIHsKLQkJCWZJbnN0YW5jZSA9IG5ldyBDb21tZW50RWxlbWVudFJlZ2lzdHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBFWFRFTlNJT05fUE9JTlRfSUQgPSAiY29tbWVudEVsZW1lbnRIYW5kbGVyIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgQ29tbWVudEVsZW1lbnRDb25maWd1cmF0aW9uW10gZkNvbmZpZ3VyYXRpb25zID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIFBMVUdJTl9JRCA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgQ29tbWVudEVsZW1lbnRSZWdpc3RyeS4KLQkgKi8KLQlwcml2YXRlIENvbW1lbnRFbGVtZW50UmVnaXN0cnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGdldENvbmZpZ3VyYXRpb25zKCkgewotCQlpZiAoZkNvbmZpZ3VyYXRpb25zID09IG51bGwpIHsKLQkJCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChQTFVHSU5fSUQsIEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JCQlpZiAocG9pbnQgIT0gbnVsbCkgewotCQkJCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGVsZW1lbnRzID0gcG9pbnQuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltlbGVtZW50cy5sZW5ndGhdOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJZkNvbmZpZ3VyYXRpb25zW2ldID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbihlbGVtZW50c1tpXSk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZDb25maWd1cmF0aW9ucyA9PSBudWxsKSB7Ci0JCQkJZkNvbmZpZ3VyYXRpb25zID0gbmV3IENvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvblswXTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZkNvbmZpZ3VyYXRpb25zOwotCX0KLQotCXB1YmxpYyBib29sZWFuIHNldHVwQ29tbWVudEVsZW1lbnQoSURPTUVsZW1lbnQgZWxlbWVudCkgewotCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbnNbXSA9IGdldENvbmZpZ3VyYXRpb25zKCk7Ci0JCWludCBsZW5ndGggPSBjb25maWd1cmF0aW9ucy5sZW5ndGg7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbiBjb25mID0gY29uZmlndXJhdGlvbnNbaV07Ci0JCQlib29sZWFuIGlzSlNQID0gZWxlbWVudC5pc0pTUFRhZygpOwotCQkJaWYgKGlzSlNQICYmIGNvbmYuYWNjZXB0SlNQQ29tbWVudCgpIHx8ICFpc0pTUCAmJiBjb25mLmFjY2VwdFhNTENvbW1lbnQoKSkgewotCQkJCUNvbW1lbnRFbGVtZW50SGFuZGxlciBoYW5kbGVyID0gY29uZi5nZXRIYW5kbGVyKCk7Ci0JCQkJaWYgKGhhbmRsZXIuaXNDb21tZW50RWxlbWVudChlbGVtZW50KSkgewotCQkJCQljb25mLnNldHVwQ29tbWVudEVsZW1lbnQoZWxlbWVudCk7Ci0JCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL0NvbW1lbnRFbGVtZW50RmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzUxYzQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9Db21tZW50RWxlbWVudEZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LnV0aWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LkNvbW1lbnRFbGVtZW50QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuQ29tbWVudEVsZW1lbnRIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgQ29tbWVudEVsZW1lbnRGYWN0b3J5IHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJU19FTVBUWSA9IDQ4NjY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSVNfRU5EID0gMTgwODsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElTX1NUQVJUID0gMjgwMTE7Ci0KLQlwcml2YXRlIERvY3VtZW50IGZEb2N1bWVudDsKLQlwcml2YXRlIENvbW1lbnRFbGVtZW50SGFuZGxlciBmSGFuZGxlcjsKLQlwcml2YXRlIGJvb2xlYW4gZkpTUFRhZzsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBDb21tZW50RWxlbWVudEZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBDb21tZW50RWxlbWVudEZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIENvbW1lbnRFbGVtZW50RmFjdG9yeShEb2N1bWVudCBkb2N1bWVudCwgYm9vbGVhbiBpc0pTUFRhZywgQ29tbWVudEVsZW1lbnRIYW5kbGVyIGhhbmRsZXIpIHsKLQkJc3VwZXIoKTsKLQkJZkRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCWZKU1BUYWcgPSBpc0pTUFRhZzsKLQkJZkhhbmRsZXIgPSBoYW5kbGVyOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZShTdHJpbmcgbmFtZSwgaW50IG5vZGVUeXBlKSB7Ci0JCUlET01FbGVtZW50IGVsZW1lbnQgPSAoSURPTUVsZW1lbnQpIGZEb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWVsZW1lbnQuc2V0Q29tbWVudFRhZyh0cnVlKTsKLQkJaWYgKG5vZGVUeXBlID09IElTX0VNUFRZKSB7Ci0JCQllbGVtZW50LnNldEVtcHR5VGFnKHRydWUpOwotCQl9Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKGZKU1BUYWcpOwotCi0JCUNvbW1lbnRFbGVtZW50QWRhcHRlciBhZGFwdGVyID0gbmV3IENvbW1lbnRFbGVtZW50QWRhcHRlcigobm9kZVR5cGUgPT0gSVNfRU5EKSwgZkhhbmRsZXIpOwotCQllbGVtZW50LmFkZEFkYXB0ZXIoYWRhcHRlcik7Ci0KLQkJcmV0dXJuIGVsZW1lbnQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29tbWVudGVsZW1lbnQvdXRpbC9UYWdTY2FubmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDljYjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb21tZW50ZWxlbWVudC91dGlsL1RhZ1NjYW5uZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC51dGlsOwotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBUYWdTY2FubmVyIHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNFcXVhbChjaGFyIGMpIHsKLQkJcmV0dXJuIChjID09ICc9Jyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1F1b3RlKGNoYXIgYykgewotCQlyZXR1cm4gKGMgPT0gJyInIHx8IGMgPT0gJ1wnJyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1NwYWNlKGNoYXIgYykgewotCQlyZXR1cm4gQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjKTsKLQl9Ci0KLQlwcml2YXRlIGludCBsZW5ndGggPSAwOwotCXByaXZhdGUgaW50IG1lbU9mZnNldCA9IDA7Ci0JcHJpdmF0ZSBpbnQgb2Zmc2V0ID0gMDsKLQlwcml2YXRlIGJvb2xlYW4gb25lTGluZSA9IGZhbHNlOwotCi0JcHJpdmF0ZSBTdHJpbmcgdGFnID0gbnVsbDsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLnRhZyA9IHRhZzsKLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubWVtT2Zmc2V0ID0gLTE7Ci0JCWlmICh0YWcgIT0gbnVsbCkKLQkJCXRoaXMubGVuZ3RoID0gdGFnLmxlbmd0aCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBUYWdTY2FubmVyKFN0cmluZyB0YWcsIGludCBvZmZzZXQsIGJvb2xlYW4gb25lTGluZSkgewotCQl0aGlzKHRhZywgb2Zmc2V0KTsKLQotCQl0aGlzLm9uZUxpbmUgPSBvbmVMaW5lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKLQkJaW50IGk7Ci0JCWNoYXIgYzsKLQkJZm9yIChpID0gb2Zmc2V0OyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzUXVvdGUoYykpIHsKLQkJCQlpKys7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlpZiAoIWlzU3BhY2UoYykgJiYgIWlzRXF1YWwoYykpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIGk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRPZmZzZXQoKSB7Ci0JCXJldHVybiB0aGlzLm1lbU9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNFbmQoY2hhciBjKSB7Ci0JCXJldHVybiAodGhpcy5vbmVMaW5lICYmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNOZXdMaW5lKCkgewotCQlpZiAob25lTGluZSkKLQkJCXJldHVybiBmYWxzZTsKLQkJY2hhciBjOwotCQlmb3IgKGludCBpID0gbWVtT2Zmc2V0IC0gMTsgMCA8PSBpOyBpLS0pIHsKLQkJCWMgPSB0YWcuY2hhckF0KGkpOwotCQkJaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCQlpZiAoIWlzU3BhY2UoYykpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGNoYXIgbmV4dENoYXIoKSB7Ci0JCWZvciAoOyB0aGlzLm9mZnNldCA8IHRoaXMubGVuZ3RoOyB0aGlzLm9mZnNldCsrKSB7Ci0JCQljaGFyIGMgPSB0aGlzLnRhZy5jaGFyQXQodGhpcy5vZmZzZXQpOwotCQkJaWYgKGlzRW5kKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFpc1NwYWNlKGMpKQotCQkJCXJldHVybiBjOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgbmV4dE5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm9mZnNldCA+PSB0aGlzLmxlbmd0aCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuZXh0Q2hhcigpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgbmFtZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSB8fCBpc1NwYWNlKGMpKQotCQkJCWJyZWFrOwotCQkJaWYgKGlzRXF1YWwoYykgJiYgdGhpcy5vZmZzZXQgPiBuYW1lT2Zmc2V0KQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmICh0aGlzLm9mZnNldCA9PSBuYW1lT2Zmc2V0KQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJdGhpcy5tZW1PZmZzZXQgPSBuYW1lT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKG5hbWVPZmZzZXQsIHRoaXMub2Zmc2V0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIG5leHRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudGFnID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMub2Zmc2V0ID49IHRoaXMubGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJY2hhciBzZXBlcmF0b3IgPSBuZXh0Q2hhcigpOwotCQlpZiAoIWlzRXF1YWwoc2VwZXJhdG9yKSkKLQkJCXJldHVybiBudWxsOwotCQl0aGlzLm9mZnNldCsrOyAvLyBza2lwICc9JwotCQljaGFyIHF1b3RlID0gbmV4dENoYXIoKTsKLQkJaWYgKHF1b3RlID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKGlzUXVvdGUocXVvdGUpKQotCQkJdGhpcy5vZmZzZXQrKzsKLQkJZWxzZQotCQkJcXVvdGUgPSAwOwotCi0JCWludCB2YWx1ZU9mZnNldCA9IHRoaXMub2Zmc2V0OwotCQlmb3IgKDsgdGhpcy5vZmZzZXQgPCB0aGlzLmxlbmd0aDsgdGhpcy5vZmZzZXQrKykgewotCQkJY2hhciBjID0gdGhpcy50YWcuY2hhckF0KHRoaXMub2Zmc2V0KTsKLQkJCWlmIChpc0VuZChjKSkgewotCQkJCXF1b3RlID0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWlmIChxdW90ZSA9PSAwKSB7Ci0JCQkJaWYgKGlzU3BhY2UoYykpCi0JCQkJCWJyZWFrOwotCQkJfSBlbHNlIHsKLQkJCQlpZiAoYyA9PSBxdW90ZSkKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJaW50IHZhbHVlRW5kID0gdGhpcy5vZmZzZXQ7Ci0JCWlmIChxdW90ZSAhPSAwICYmIHRoaXMub2Zmc2V0IDwgdGhpcy5sZW5ndGgpCi0JCQl0aGlzLm9mZnNldCsrOwotCQlpZiAodmFsdWVFbmQgPT0gdmFsdWVPZmZzZXQpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQl0aGlzLm1lbU9mZnNldCA9IHZhbHVlT2Zmc2V0OwotCQlyZXR1cm4gdGhpcy50YWcuc3Vic3RyaW5nKHZhbHVlT2Zmc2V0LCB2YWx1ZUVuZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9BYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzAwNzYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5JbGxlZ2FsQ2hhcnNldE5hbWVFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5VbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JU3RvcmFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db2RlZElPOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklSZXNvdXJjZUNoYXJzZXREZXRlY3RvcjsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgaW1wbGVtZW50cyBJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgewotCi0JcHJvdGVjdGVkIEVuY29kaW5nTWVtZW50byBmRW5jb2RpbmdNZW1lbnRvOwotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQotCXByb3RlY3RlZCBSZWFkZXIgZlJlYWRlcjsKLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgQWJzdHJhY3RSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90ZTogb25jZSB0aGlzIGluc3RhbmNlIGlzIGNyZWF0ZWQsIHRyYWNlIGluZm8gc3RpbGwgbmVlZHMgdG8gYmUKLQkgKiBhcHBlbmRlZCBieSBjYWxsZXIsIGRlcGVuZGluZyBvbiB0aGUgY29udGV4dCBpdHMgY3JlYXRlZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCWZFbmNvZGluZ01lbWVudG8gPSBuZXcgRW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGdldEFwcHJvcHJpYXRlSmF2YUNoYXJzZXQoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpOwotCQlmRW5jb2RpbmdNZW1lbnRvLnNldERldGVjdGVkQ2hhcnNldE5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCS8vIFRPRE86IGlmIGRldGVjdGVkQ2hhcnNldCBhbmQgc3BlYyBkZWZhdWx0IGlzCi0JCS8vIG51bGwsIG5lZWQgdG8gdXNlICJ3b3JrCi0JCS8vIGJlbmNoIGJhc2VkIiBkZWZhdWx0cy4KLQkJZkVuY29kaW5nTWVtZW50by5zZXRBcHByb3ByaWF0ZURlZmF1bHQoZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICogCi0JICogQHBhcmFtIGRldGVjdGVkQ2hhcnNldE5hbWUKLQkgKiBAcGFyYW0gcmVhc29uCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgY3JlYXRlRW5jb2RpbmdNZW1lbnRvKFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lLCBTdHJpbmcgcmVhc29uKSB7Ci0JCWNyZWF0ZUVuY29kaW5nTWVtZW50byhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBjb252aWVuY2UgbWV0aG9kIGFsbCBzdWJjbGFzc2VzIGNhbiB1c2UgKGJ1dCBub3Qgb3ZlcnJpZGUpCi0JICovCi0JZmluYWwgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5wdXRTZXQoKSB7Ci0JCWlmIChmUmVhZGVyID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImlucHV0IG11c3QgYmUgc2V0IGJlZm9yZSB1c2UiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgY2FuIHJldHVybiBudWxsLCBpZiBpbnZhbGlkIGNoYXJzZXQgbmFtZSAoaW4gd2hpY2ggY2FzZQotCSAqICJhcHByb3ByaWF0ZURlZmF1bHQiIHNob3VsZCBiZSB1c2VkLCBpZiBhIG5hbWUgaXMgcmVhbGx5IG5lZWQgZm9yIHNvbWUKLQkgKiAic2F2ZSBhbnl3YXkiIGNhc2VzKS4KLQkgKiAKLQkgKiBAcGFyYW0gZGV0ZWN0ZWRDaGFyc2V0TmFtZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRBcHByb3ByaWF0ZUphdmFDaGFyc2V0KFN0cmluZyBkZXRlY3RlZENoYXJzZXROYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyAxLiBDaGVjayBleHBsaWNpdCBtYXBwaW5nIG92ZXJyaWRlcyBmcm9tCi0JCS8vIHByb3BlcnR5IGZpbGUgLS0gaXRzIGhlcmUgd2UgcGljayB1cCAicnVsZXMiIGZvciBjYXNlcwotCQkvLyB0aGF0IGFyZSBub3QgZXZlbiBpbiBKYXZhCi0JCXJlc3VsdCA9IENvZGVkSU8uY2hlY2tNYXBwaW5nT3ZlcnJpZGVzKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkvLyAyLiBVc2UgdGhlICJjYW5vbmljYWwiIG5hbWUgZnJvbSBKUkUgbWFwcGluZ3MKLQkJLy8gTm90ZTogc2VlIENoYXJzZXQgSmF2YURvYywgdGhlIG5hbWUgeW91IGdldCBvbmUKLQkJLy8gd2l0aCBjYW4gYmUgYWxpYXMsCi0JCS8vIHRoZSBuYW1lIHlvdSBnZXQgYmFjayBpcyAic3RhbmRhcmQiIG5hbWUuCi0JCUNoYXJzZXQgamF2YUNoYXJzZXQgPSBudWxsOwotCQl0cnkgewotCQkJamF2YUNoYXJzZXQgPSBDaGFyc2V0LmZvck5hbWUoZGV0ZWN0ZWRDaGFyc2V0TmFtZSk7Ci0JCX0gY2F0Y2ggKFVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBvbmx5IHNldCBpbnZhbGlkLCBpZiByZXN1bHQgaXMgc2FtZSBhcyBkZXRlY3RlZCAtLSB0aGV5IHdvbid0Ci0JCQkvLyBiZSBlcXVhbCBpZgotCQkJLy8gb3ZlcnJpZGRlbgotCQkJaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5lcXVhbHMoZGV0ZWN0ZWRDaGFyc2V0TmFtZSkpIHsKLQkJCQlmRW5jb2RpbmdNZW1lbnRvLnNldEludmFsaWRFbmNvZGluZyhkZXRlY3RlZENoYXJzZXROYW1lKTsKLQkJCX0KLQkJfSBjYXRjaCAoSWxsZWdhbENoYXJzZXROYW1lRXhjZXB0aW9uIGUpIHsKLQkJCS8vIG9ubHkgc2V0IGludmFsaWQsIGlmIHJlc3VsdCBpcyBzYW1lIGFzIGRldGVjdGVkIC0tIHRoZXkgd29uJ3QKLQkJCS8vIGJlIGVxdWFsIGlmCi0JCQkvLyBvdmVycmlkZGVuCi0JCQlpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LmVxdWFscyhkZXRlY3RlZENoYXJzZXROYW1lKSkgewotCQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SW52YWxpZEVuY29kaW5nKGRldGVjdGVkQ2hhcnNldE5hbWUpOwotCQkJfQotCQl9Ci0JCS8vIGdpdmUgcHJpb3JpdHkgdG8gamF2YSBjb25vbmljYWwgbmFtZSwgaWYgcHJlc2VudAotCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gamF2YUNoYXJzZXQubmFtZSgpOwotCQkJLy8gYnV0IHN0aWxsIGFsbG93IG92ZXJyaWRlcwotCQkJcmVzdWx0ID0gQ29kZWRJTy5jaGVja01hcHBpbmdPdmVycmlkZXMocmVzdWx0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0RW5jb2RpbmdNZW1lbnRvKCkuZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCX0KLQotCS8vIHRvIGVuc3VyZSBjb25zaXN0IG92ZXJhbGwgcnVsZXMgdXNlZCwgd2UnbGwgbWFyayBhcwotCS8vIGZpbmFsLAotCS8vIGFuZCByZXF1aXJlIHN1YmNsYXNzZXMgdG8gcHJvdmlkZSBjZXJ0YWluIHBpZWNlcyBvZgotCS8vIHRoZQotCS8vIGltcGxlbWVudGF0aW9uCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRFbmNvZGluZ01lbWVudG8oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQllbnN1cmVJbnB1dFNldCgpOwotCQlpZiAoIWZIZWFkZXJQYXJzZWQpIHsKLQkJCXBhcnNlSW5wdXQoKTsKLQkJCS8vIHdlIGtlZXAgdHJhY2sgb2YgaWYgaGVhZGVyJ3MgYWxyZWFkeSBiZWVuCi0JCQkvLyBwYXJzZSwgc28gY2FuIG1ha2UKLQkJCS8vIG11bHRpcGxlICdnZXQnIGNhbGxzLCB3aXRob3V0IGNhdXNpbmcKLQkJCS8vIHJlcGFyc2luZy4KLQkJCWZIZWFkZXJQYXJzZWQgPSB0cnVlOwotCQkJLy8gTm90ZTogdGhlcmUgaXMgYSAiaGlkZGVuIGFzc3VtcHRpb24iIGhlcmUKLQkJCS8vIHRoYXQgYW4gZW1wdHkKLQkJCS8vIHN0cmluZyBpbiBjb250ZW50IHNob3VsZCBiZSB0cmVhdGVkIHNhbWUgYXMKLQkJCS8vIG5vdCBwcmVzZW50LgotCQl9Ci0JCWlmIChmRW5jb2RpbmdNZW1lbnRvID09IG51bGwpIHsKLQkJCWhhbmRsZVNwZWNEZWZhdWx0KCk7Ci0JCX0KLQkJaWYgKGZFbmNvZGluZ01lbWVudG8gPT0gbnVsbCkgewotCQkJLy8gc2FmdHkgbmV0Ci0JCQlmRW5jb2RpbmdNZW1lbnRvID0gbmV3IE51bGxNZW1lbnRvKCk7Ci0JCX0KLQkJcmV0dXJuIGZFbmNvZGluZ01lbWVudG87Ci0JfQotCi0JLyoqCi0JICogVGhpcyBpcyB0byByZXR1cm4gYSBkZWZhdWx0IGVuY29kaW5nIC0tIGFzIHNwZWNpZmllZCBieSBhbiBpbmR1c3RyeQotCSAqIGNvbnRlbnQgdHlwZSBzcGVjIC0tIHdoZW4gbm90IHByZXNlbnQgaW4gdGhlIHN0cmVhbSwgZm9yIGV4YW1wbGUsIFhNTAotCSAqIHNwZWNpZmllcyBVVEYtOCwgSlNQIHNwZWNpZmllcyBJU08tODg1OS0xLiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuCi0JICogbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoICJzcGVjIGRlZmF1bHQiLgotCSAqLwotCWFic3RyYWN0IHB1YmxpYyBTdHJpbmcgZ2V0U3BlY0RlZmF1bHRFbmNvZGluZygpOwotCi0JcHVibGljIEVuY29kaW5nTWVtZW50byBnZXRTcGVjRGVmYXVsdEVuY29kaW5nTWVtZW50bygpIHsKLQkJcmVzZXRBbGwoKTsKLQkJRW5jb2RpbmdNZW1lbnRvIHJlc3VsdCA9IG51bGw7Ci0JCVN0cmluZyBlbmMgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmMgIT0gbnVsbCkgewotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFRkFVTFRTX0FTU1VNRURfRk9SX0VNUFRZX0lOUFVUKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGVuYyk7Ci0JCQlyZXN1bHQgPSBmRW5jb2RpbmdNZW1lbnRvOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZVNwZWNEZWZhdWx0KCkgewotCQlTdHJpbmcgZW5jb2RpbmdOYW1lOwotCQllbmNvZGluZ05hbWUgPSBnZXRTcGVjRGVmYXVsdEVuY29kaW5nKCk7Ci0JCWlmIChlbmNvZGluZ05hbWUgIT0gbnVsbCkgewotCQkJLy9jcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jb2RpbmdOYW1lLAotCQkJLy8gRW5jb2RpbmdNZW1lbnRvLlVTRURfQ09OVEVOVF9UWVBFX0RFRkFVTFQpOwotCQkJZkVuY29kaW5nTWVtZW50byA9IG5ldyBFbmNvZGluZ01lbWVudG8oKTsKLQkJCWZFbmNvZGluZ01lbWVudG8uc2V0SmF2YUNoYXJzZXROYW1lKGVuY29kaW5nTmFtZSk7Ci0JCQlmRW5jb2RpbmdNZW1lbnRvLnNldEFwcHJvcHJpYXRlRGVmYXVsdChlbmNvZGluZ05hbWUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRXZlcnkgc3ViY2xhc3MgbXVzdCBwcm92aWRlIGEgd2F5IHRvIHBhcnNlIHRoZSBpbnB1dC4gVGhpcyBtZXRob2QgaGFzCi0JICogc2V2ZXJhbCBjcml0aWNhbCByZXNwb25zaWJpbGl0aWVzOgotCSAqIDxsaT5zZXQgdGhlIGZFbmNvZGluZ01lbWVudG8gZmllbGQgYXBwcm9wcmlhdGVseSwgYWNjb3JkaW5nIHRvIHRoZQotCSAqIHJlc3VsdHMgb2YgdGhlIHBhcnNlIG9mIGZSZWFkZXIuPC9saT4KLQkgKiA8bGk+c2V0IGZIYXJkZXJQYXJzZWQgdG8gdHJ1ZSwgdG8gYXZvaWQgd2FzdGVkIHJlLXBhcnNpbmcuPC9saT4KLQkgKi8KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCBwYXJzZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHJlc2V0QWxsKCkgewotCQlmUmVhZGVyID0gbnVsbDsKLQkJZkhlYWRlclBhcnNlZCA9IGZhbHNlOwotCQlmRW5jb2RpbmdNZW1lbnRvID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzaWJsZSwgc2luY2Ugd2Uga25vdyBCeXRlUmVhZGVyCi0JCQkvLyBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0KElTdG9yYWdlIGlTdG9yYWdlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaVN0b3JhZ2UuZ2V0Q29udGVudHMoKTsKLQkJSW5wdXRTdHJlYW0gcmVzZXR0YWJsZVN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtLCBDb2RlZElPLk1BWF9CVUZfU0laRSk7Ci0JCXJlc2V0dGFibGVTdHJlYW0ubWFyayhDb2RlZElPLk1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JCS8vIFRPRE8gd2UnbGwgbmVlZCB0byAicmVtZW1iZXIiIElGaWxlLCBvcgotCQkvLyBnZXQgaXRzIChvciBpdHMgcHJvamVjdCdzKSBzZXR0aW5ncywgaW4gY2FzZQotCQkvLyB0aG9zZSBhcmUgbmVlZGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVuIHRoZQotCQkvLyBlbmNvZGluZyBpcyBub3QgaW4gdGhlIGZpbGUgc3RyZWFtLgotCX0KLQotCS8qKgotCSAqIE5vdGU6IHRoaXMgaXMgbm90IHBhcnQgb2YgaW50ZXJmYWNlIHRvIGhlbHAgYXZvaWQgY29uZnVzaW9uIC4uLiBpdAotCSAqIGV4cGVjdGVkIHRoaXMgUmVhZGVyIGlzIGEgd2VsbCBmb3JtZWQgY2hhcmFjdGVyIHJlYWRlciAuLi4gdGhhdCBpcywgaXRzCi0JICogYWxsIHJlYWR5IGJlZW4gZGV0ZXJtaW5lZCB0byBub3QgYmUgYSB1bmljb2RlIG1hcmtlZCBpbnB1dCBzdHJlYW0uIEFuZCwKLQkgKiBpdHMgYXNzdW1lZCB0byBiZSBpbiB0aGUgY29ycmVjdCBwb3NpdGlvbiwgYXQgcG9zaXRpb24gemVybywgcmVhZHkgdG8KLQkgKiByZWFkIGZpcnN0IGNoYXJhY3Rlci4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXQoUmVhZGVyIHJlYWRlcikgewotCQlyZXNldEFsbCgpOwotCQlmUmVhZGVyID0gcmVhZGVyOwotCQlpZiAoIWZSZWFkZXIubWFya1N1cHBvcnRlZCgpKSB7Ci0JCQlmUmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGZSZWFkZXIpOwotCQl9Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoQ29kZWRJTy5NQVhfTUFSS19TSVpFKTsKLQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJLy8gaW1wb3NzYmxlLCBzaW5jZSB3ZSBqdXN0IGNoZWNrZWQgaWYgbWFya2FibGUKLQkJCXRocm93IG5ldyBFcnJvcihlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvQnl0ZVJlYWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YWU0NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9CeXRlUmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29kZWRJTzsKLQotLyoqCi0gKiBUaGlzIGlzIGFuICJhZGFwdGVyIiBjbGFzcywgc2ltcGx5IHRvIGdldCBpbiBpbnB1dCBzdHJlYW0gdG8gYWN0IGxpa2UgYQotICogcmVhZGVyLiBXZSBjb3VsZCBub3QgdXNlIElucHV0U3RyZWFtUmVhZGVyIGRpcmVjdGx5IGJlY2F1c2UgaXRzIGludGVybmFsCi0gKiBidWZmZXJzIGFyZSBub3QgY29udHJvbGxhYmxlLCBhbmQgaXQgc29tZXRpbWVzIHB1bGxzIHRvbyBtdWNoIG91dCBvZiBpbnB1dAotICogc3RyZWFtIChldmVuIHdoZW4gaXQgd2Fzbid0IG5lZWRlZCBmb3Igb3VyIHB1cnBvc2VzKS4KLSAqIAotICogVGhlIHVzZSBvZiB0aGlzIGNsYXNzIGlzIGhpZ2hseSBzcGVjaWFsaXplZCBhbmQgYnkgbm90IG1lYW5zIG1lYW50IHRvIGJlCi0gKiBnZW5lcmFsIHB1cnBvc2UuIEl0cyB1c2UgaXMgcmVzdHJpY3RlZCB0byB0aG9zZSBjYXNlcyB3aGVyZSB0aGUgaW5wdXQKLSAqIHN0cmVhbSBjYW4gYmUgcmVnYXJkZWQgYXMgYXNjaWkganVzdCBsb25nIGVub3VnaCB0byBkZXRlcm1pbmUgd2hhdCB0aGUgcmVhbAotICogZW5jb2Rpbmcgc2hvdWxkIGJlLgotICovCi0KLXB1YmxpYyBjbGFzcyBCeXRlUmVhZGVyIGV4dGVuZHMgUmVhZGVyIHsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSBDb2RlZElPLk1BWF9CVUZfU0laRTsKLQotCXByb3RlY3RlZCBieXRlW10gZkJ1ZmZlcjsKLQotCXByb3RlY3RlZCBJbnB1dFN0cmVhbSBmSW5wdXRTdHJlYW07Ci0KLQlwcm90ZWN0ZWQgQnl0ZVJlYWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQnl0ZVJlYWRlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgewotCQl0aGlzKGlucHV0U3RyZWFtLCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyBCeXRlUmVhZGVyKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBpbnQgc2l6ZSkgewotCQlmSW5wdXRTdHJlYW0gPSBpbnB1dFN0cmVhbTsKLQkJaWYgKCFpbnB1dFN0cmVhbS5tYXJrU3VwcG9ydGVkKCkpIHsKLQkJCXRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVSZWFkZXIgaXMgcmVxdWlyZWQgdG8gaGF2ZSBhIHJlc2V0dGFibGUgc3RyZWFtIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlmQnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWZJbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRBaGVhZExpbWl0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0ubWFyayhyZWFkQWhlYWRMaW1pdCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IGIwID0gZklucHV0U3RyZWFtLnJlYWQoKTsKLQkJcmV0dXJuIChiMCAmIDB4MDBGRik7Ci0JfQotCi0JcHVibGljIGludCByZWFkKGNoYXIgY2hbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaWYgKGxlbmd0aCA+IGZCdWZmZXIubGVuZ3RoKSB7Ci0JCQlsZW5ndGggPSBmQnVmZmVyLmxlbmd0aDsKLQkJfQotCi0JCWludCBjb3VudCA9IGZJbnB1dFN0cmVhbS5yZWFkKGZCdWZmZXIsIDAsIGxlbmd0aCk7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQlpbnQgYjAgPSBmQnVmZmVyW2ldOwotCQkJLy8gdGhlIDB4MDBGRiBpcyB0byAibG9zZSIgdGhlIG5lZ2F0aXZlIGJpdHMgZmlsbGVkIGluIHRoZSBieXRlIHRvCi0JCQkvLyBpbnQgY29udmVyc2lvbgotCQkJLy8gKGFuZCB3aGljaCB3b3VsZCBiZSB0aGVyZSBpZiBjYXN0IGRpcmVjdGx5IGZyb20gYnl0ZSB0byBjaGFyKS4KLQkJCWNoYXIgYzAgPSAoY2hhcikgKGIwICYgMHgwMEZGKTsKLQkJCWNoW29mZnNldCArIGldID0gYzA7Ci0JCX0KLQkJcmV0dXJuIGNvdW50OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlYWR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlmSW5wdXRTdHJlYW0ucmVzZXQoKTsKLQl9Ci0KLQlwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGZJbnB1dFN0cmVhbS5za2lwKG4pOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9Db250ZW50RGVzY3JpYmVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5NjE3Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0NvbnRlbnREZXNjcmliZXJGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5RdWFsaWZpZWROYW1lOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5FbmNvZGluZ01lbWVudG87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLklDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBmaW5hbCBjbGFzcyBDb250ZW50RGVzY3JpYmVyRm9yWE1MIGltcGxlbWVudHMgSVRleHRDb250ZW50RGVzY3JpYmVyIHsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBRdWFsaWZpZWROYW1lW10gU1VQUE9SVEVEX09QVElPTlMgPSB7SUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VULCBJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuQVBQUk9QUklBVEVfREVGQVVMVH07Ci0JLyoqCi0JICogPGNvZGU+cmVzdHJpY3RlZE1vZGU8L2NvZGU+IGlzIHVzZWQganVzdCBmb3IgdGVzdGluZy9leHBlcmltZW50cy4KLQkgKiAKLQkgKiBJZiBpbiByZXN0cmljdGVkTW9kZSwgb3VyICJjdXN0b20iIGNvbnRlbnRUeXBlIGlzIHNlZW4gYXMgdmFsaWQgb25seSBpbgotCSAqIGNhc2VzIHRoYXQgdGhlIHBsYXRmb3JtJ3Mgc3RhbmRhcmQgb25lIGRvZXMgbm90IGNvdmVyLgotCSAqLwotCXByaXZhdGUgYm9vbGVhbiByZXN0cmljdGVkTW9kZSA9IHRydWU7Ci0JcHJpdmF0ZSBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgZlJlc291cmNlRW5jb2RpbmdEZXRlY3RvcjsKLQotCXByaXZhdGUgSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGdldERldGVjdG9yKCkgewotCQlpZiAoZlJlc291cmNlRW5jb2RpbmdEZXRlY3RvciA9PSBudWxsKSB7Ci0JCQlmUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yID0gbmV3IFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZGVzY3JpYmUoamF2YS5pby5JbnB1dFN0cmVhbSwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50RGVzY3JpcHRpb24pCi0JICovCi0JcHVibGljIGludCBkZXNjcmliZShJbnB1dFN0cmVhbSBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZm9yIHRoaXMgc3BlY2lhbCBjYXNlLCBhbHdheXMgYXNzdW1lIGludmFsaWQsIHVubGVzcwotCQkvLyBvdXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIGFyZSBtZXQuCi0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBwdXJlbHkgcmVxdWVzdCBmb3IgdmFsaWR0eQotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkocmVzdWx0LCBjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKHJlc3VsdCwgY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSVRleHRDb250ZW50RGVzY3JpYmVyI2Rlc2NyaWJlKGphdmEuaW8uUmVhZGVyLAotCSAqICAgICAgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmlwdGlvbikKLQkgKi8KLQlwdWJsaWMgaW50IGRlc2NyaWJlKFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJLy8gZm9yIHRoaXMgc3BlY2lhbCBjYXNlLCBhbHdheXMgYXNzdW1lIGludmFsaWQsIHVubGVzcwotCQkvLyBvdXIgc3BlY2lhbCBjaXJjdW1zdGFuY2VzIGFyZSBtZXQuCi0JCWludCByZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5JTlZBTElEOwotCi0JCWlmIChkZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkvLyBwdXJlbHkgcmVxdWVzdCBmb3IgdmFsaWR0eQotCQkJcmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkocmVzdWx0LCBjb250ZW50cyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyZXN1bHQgPSBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKHJlc3VsdCwgY29udGVudHMsIGRlc2NyaXB0aW9uKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmNvbnRlbnQuSUNvbnRlbnREZXNjcmliZXIjZ2V0U3VwcG9ydGVkT3B0aW9ucygpCi0JICovCi0JcHVibGljIFF1YWxpZmllZE5hbWVbXSBnZXRTdXBwb3J0ZWRPcHRpb25zKCkgewotCi0JCXJldHVybiBTVVBQT1JURURfT1BUSU9OUzsKLQl9Ci0KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGludCByZXN1bHQsIElucHV0U3RyZWFtIGNvbnRlbnRzLCBJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlpbnQgcmV0dXJuUmVzdWx0ID0gcmVzdWx0OwotCQlpZiAoaXNSZWxldmVudChkZXNjcmlwdGlvbikpIHsKLQkJCUlSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvciA9IGdldERldGVjdG9yKCk7Ci0JCQljb250ZW50cy5yZXNldCgpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCXJldHVyblJlc3VsdCA9IGhhbmRsZUNhbGN1bGF0aW9ucyhyZXN1bHQsIGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShpbnQgcmVzdWx0LCBJbnB1dFN0cmVhbSBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJY29udGVudHMucmVzZXQoKTsKLQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJcmV0dXJuUmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoZGV0ZWN0b3IsIHJldHVyblJlc3VsdCk7Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCXByaXZhdGUgaW50IGRldGVybWluZVZhbGlkaXR5KGludCByZXN1bHQsIFJlYWRlciBjb250ZW50cykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJSVJlc291cmNlQ2hhcnNldERldGVjdG9yIGRldGVjdG9yID0gZ2V0RGV0ZWN0b3IoKTsKLQkJY29udGVudHMucmVzZXQoKTsKLQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJcmV0dXJuUmVzdWx0ID0gZGV0ZXJtaW5lVmFsaWRpdHkoZGV0ZWN0b3IsIHJldHVyblJlc3VsdCk7Ci0JCXJldHVybiByZXR1cm5SZXN1bHQ7Ci0JfQotCS8qKgotCSAqIEBwYXJhbSBjb250ZW50cwotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbgotCSAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLQkgKi8KLQlwcml2YXRlIGludCBjYWxjdWxhdGVTdXBwb3J0ZWRPcHRpb25zKGludCByZXN1bHQsIFJlYWRlciBjb250ZW50cywgSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJaWYgKGlzUmVsZXZlbnQoZGVzY3JpcHRpb24pKSB7Ci0JCQlJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IgPSBnZXREZXRlY3RvcigpOwotCQkJZGV0ZWN0b3Iuc2V0KGNvbnRlbnRzKTsKLQkJCXJldHVyblJlc3VsdCA9IGhhbmRsZUNhbGN1bGF0aW9ucyhyZXN1bHQsIGRlc2NyaXB0aW9uLCBkZXRlY3Rvcik7Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaGFuZGxlRGV0ZWN0ZWRTcGVjaWFsQ2FzZShJQ29udGVudERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLCBPYmplY3QgZGV0ZWN0ZWRDaGFyc2V0LCBPYmplY3QgamF2YUNoYXJzZXQpIHsKLQkJLy8gc2luY2UgZXF1YWwsIHdlIGRvbid0IG5lZWQgdG8gYWRkLCBidXQgaWYgb3VyIGRldGVjdGVkIHZlcnNpb24gaXMKLQkJLy8gZGlmZmVyZW50IHRoYW4KLQkJLy8gamF2YUNoYXJzZXQsIHRoZW4gd2Ugc2hvdWxkIGFkZCBpdC4gVGhpcyB3aWxsIGhhcHBlbiwgZm9yIGV4YW1wbGUsCi0JCS8vIGlmIHRoZXJlJ3MKLQkJLy8gZGlmZmVyZW5jZXMgaW4gY2FzZSwgb3IgZGlmZmVyZW5jZXMgZHVlIHRvIG92ZXJyaWRlIHByb3BlcnRpZXMKLQkJaWYgKGRldGVjdGVkQ2hhcnNldCAhPSBudWxsKSB7Ci0JCQkvLyBpZiAoIWRldGVjdGVkQ2hhcnNldC5lcXVhbHMoamF2YUNoYXJzZXQpKSB7Ci0JCQkvLyBkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uRXh0ZW5kZWQuREVURUNURURfQ0hBUlNFVCwKLQkJCS8vIGRldGVjdGVkQ2hhcnNldCk7Ci0JCQkvLyB9Ci0KLQkJCS8vIE9uY2Ugd2UgZGV0ZWN0ZWQgYSBjaGFyc2V0LCB3ZSBzaG91bGQgc2V0IHRoZSBwcm9wZXJ0eSBldmVuCi0JCQkvLyB0aG91Z2ggaXQncyB0aGUgc2FtZSBhcyBqYXZhQ2hhcnNldAotCQkJLy8gYmVjYXVzZSB0aGVyZSBhcmUgY2xpZW50cyB0aGF0IHJlbHkgb24gdGhpcyBwcm9wZXJ0eSB0bwotCQkJLy8gZGV0ZXJtaW5lIGlmIHRoZSBjaGFyc2V0IGlzIGFjdHVhbGx5IGRldGVjdGVkIGluIGZpbGUgb3Igbm90LgotCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQsIGRldGVjdGVkQ2hhcnNldCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcmV0dXJuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzUmVsZXZlbnQoSUNvbnRlbnREZXNjcmlwdGlvbiBkZXNjcmlwdGlvbikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSykpCi0JCQlyZXN1bHQgPSB0cnVlOwotCQllbHNlIGlmIChkZXNjcmlwdGlvbi5pc1JlcXVlc3RlZChJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkRFVEVDVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJZWxzZSBpZiAoZGVzY3JpcHRpb24uaXNSZXF1ZXN0ZWQoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQpKQotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gZGV0ZWN0b3IKLQkgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0JICovCi0JcHJpdmF0ZSBpbnQgaGFuZGxlQ2FsY3VsYXRpb25zKGludCByZXN1bHQsIElDb250ZW50RGVzY3JpcHRpb24gZGVzY3JpcHRpb24sIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciBkZXRlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkJaW50IHJldHVyblJlc3VsdCA9IHJlc3VsdDsKLQkJRW5jb2RpbmdNZW1lbnRvIGVuY29kaW5nTWVtZW50byA9ICgoWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yKSBkZXRlY3RvcikuZ2V0RW5jb2RpbmdNZW1lbnRvKCk7Ci0JCWlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkvLyBUT0RPOiBJIG5lZWQgdG8gdmVyaWZ5IHRvIHNlZSBpZiB0aGlzIEJPTSB3b3JrIGlzIGFsd2F5cyBkb25lCi0JCQkvLyBieSB0ZXh0IHR5cGUuCi0JCQlPYmplY3QgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrID0gZW5jb2RpbmdNZW1lbnRvLmdldFVuaWNvZGVCT00oKTsKLQkJCWlmIChkZXRlY3RlZEJ5dGVPcmRlck1hcmsgIT0gbnVsbCkgewotCQkJCU9iamVjdCBleGlzdGluZ0J5dGVPcmRlck1hcmsgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSyk7Ci0JCQkJLy8gbm90IHN1cmUgd2h5IHdvdWxkIGV2ZXIgYmUgZGlmZmVyZW50LCBzbyBpZiBpcyBkaWZmZXJlbnQsCi0JCQkJLy8gbWF5Ci0JCQkJLy8gbmVlZCB0byAicHVzaCIgdXAgaW50byBiYXNlLgotCQkJCWlmICghZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrLmVxdWFscyhleGlzdGluZ0J5dGVPcmRlck1hcmspKQotCQkJCQlkZXNjcmlwdGlvbi5zZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkJZVEVfT1JERVJfTUFSSywgZGV0ZWN0ZWRCeXRlT3JkZXJNYXJrKTsKLQkJCX0KLQotCi0JCQlpZiAoIWVuY29kaW5nTWVtZW50by5pc1ZhbGlkKCkpIHsKLQkJCQkvLyBub3RlOiBhZnRlciBzZXR0aW5nIGhlcmUsIGl0cyB0aGUgbWVyZSBwcmVzZW5jZSBvZgotCQkJCS8vIElDb250ZW50RGVzY3JpcHRpb25FeHRlbmRlZC5VTlNVUFBPUlRFRF9DSEFSU0VUCi0JCQkJLy8gaW4gdGhlIHJlc291cmNlJ3MgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUKLQkJCQkvLyBpZiBpbnZhbGlkIGluIHRob3NlIGNhc2VzLCB0aGUgImRldGVjdGVkIiBwcm9wZXJ0eSBjb250YWlucwotCQkJCS8vIGFuICJhcHByb3ByaWF0ZSBkZWZhdWx0IiB0byB1c2UuCi0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLlVOU1VQUE9SVEVEX0NIQVJTRVQsIGVuY29kaW5nTWVtZW50by5nZXRJbnZhbGlkRW5jb2RpbmcoKSk7Ci0JCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbkV4dGVuZGVkLkFQUFJPUFJJQVRFX0RFRkFVTFQsIGVuY29kaW5nTWVtZW50by5nZXRBcHByb3ByaWF0ZURlZmF1bHQoKSk7Ci0JCQl9Ci0KLQkJCU9iamVjdCBkZXRlY3RlZENoYXJzZXQgPSBlbmNvZGluZ01lbWVudG8uZ2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZSgpOwotCQkJT2JqZWN0IGphdmFDaGFyc2V0ID0gZW5jb2RpbmdNZW1lbnRvLmdldEphdmFDaGFyc2V0TmFtZSgpOwotCi0JCQkvLyB3ZSBhbHdheXMgaW5jbHVkZSBkZXRlY3RlZCwgaWYgaXRzIGRpZmZlcmVudCB0aGFuIGphdmEKLQkJCWhhbmRsZURldGVjdGVkU3BlY2lhbENhc2UoZGVzY3JpcHRpb24sIGRldGVjdGVkQ2hhcnNldCwgamF2YUNoYXJzZXQpOwotCi0JCQlpZiAoamF2YUNoYXJzZXQgIT0gbnVsbCkgewotCQkJCU9iamVjdCBleGlzdGluZ0NoYXJzZXQgPSBkZXNjcmlwdGlvbi5nZXRQcm9wZXJ0eShJQ29udGVudERlc2NyaXB0aW9uLkNIQVJTRVQpOwotCQkJCWlmIChqYXZhQ2hhcnNldC5lcXVhbHMoZXhpc3RpbmdDaGFyc2V0KSkgewotCQkJCQloYW5kbGVEZXRlY3RlZFNwZWNpYWxDYXNlKGRlc2NyaXB0aW9uLCBkZXRlY3RlZENoYXJzZXQsIGphdmFDaGFyc2V0KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHdlIG1heSBuZWVkIHRvIGFkZCB3aGF0IHdlIGZvdW5kLCBidXQgb25seSBuZWVkIHRvIGFkZAotCQkJCQkvLyBpZiBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdAotCQkJCQlPYmplY3QgZGVmYXVsdENoYXJzZXQgPSBnZXREZXRlY3RvcigpLmdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKTsKLQkJCQkJaWYgKGRlZmF1bHRDaGFyc2V0ICE9IG51bGwpIHsKLQkJCQkJCWlmICghZGVmYXVsdENoYXJzZXQuZXF1YWxzKGphdmFDaGFyc2V0KSkgewotCQkJCQkJCWRlc2NyaXB0aW9uLnNldFByb3BlcnR5KElDb250ZW50RGVzY3JpcHRpb24uQ0hBUlNFVCwgamF2YUNoYXJzZXQpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYXNzdW1pbmcgaWYgdGhlcmUgaXMgbm8gc3BlYyBkZWZhdWx0LCB3ZSBhbHdheXMKLQkJCQkJCS8vIG5lZWQgdG8gYWRkLgotCQkJCQkJLy8gVE9ETzogdGhpcyBpcyBwcm9iYWJseSBhIGRlYWQgYnJhbmNoIGluIGN1cnJlbnQKLQkJCQkJCS8vIGNvZGUsIHNob3VsZCByZS1leGFtaW5lIGZvciByZW1vdmFsLgotCQkJCQkJZGVzY3JpcHRpb24uc2V0UHJvcGVydHkoSUNvbnRlbnREZXNjcmlwdGlvbi5DSEFSU0VULCBqYXZhQ2hhcnNldCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm5SZXN1bHQgPSBkZXRlcm1pbmVWYWxpZGl0eShkZXRlY3RvciwgcmV0dXJuUmVzdWx0KTsKLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGludCBkZXRlcm1pbmVWYWxpZGl0eShJUmVzb3VyY2VDaGFyc2V0RGV0ZWN0b3IgZGV0ZWN0b3IsIGludCByZXR1cm5SZXN1bHQpIHsKLQkJLy8gd2UgYWx3YXlzIGV4cGVjdCBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IsIGJ1dCBqdXN0IHRvIG1ha2Ugc2FmZQotCQkvLyBjYXN0LgotCQlpZiAoZGV0ZWN0b3IgaW5zdGFuY2VvZiBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IpIHsKLQkJCVhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciB4bWxSZXNvdXJjZURldGVjdG9yID0gKFhNTFJlc291cmNlRW5jb2RpbmdEZXRlY3RvcikgZGV0ZWN0b3I7Ci0JCQlpZiAoeG1sUmVzb3VyY2VEZXRlY3Rvci5pc0RlY2xEZXRlY3RlZCgpKSB7Ci0JCQkJaWYgKHJlc3RyaWN0ZWRNb2RlKSB7Ci0JCQkJCS8vIGlmIHRoZXJlIGlzIG5vIGluaXRpYWwgd2hpdGVzcGFjZSwgdGhlbiBwbGF0Zm9ybSdzCi0JCQkJCS8vIGRlZmF1bHQgb25lIHdpbGwgZG8uCi0JCQkJCWlmICh4bWxSZXNvdXJjZURldGVjdG9yLmhhc0luaXRpYWxXaGl0ZVNwYWNlKCkpIHsKLQkJCQkJCXJldHVyblJlc3VsdCA9IElDb250ZW50RGVzY3JpYmVyLlZBTElEOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlyZXR1cm5SZXN1bHQgPSBJQ29udGVudERlc2NyaWJlci5WQUxJRDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJldHVyblJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwMDJiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0VuY29kaW5nUGFyc2VyQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBFT0YgPSAiRU9GIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBJbnZhbGlkVGVybWluYXRlZFN0cmluZ1ZhbHVlID0gIkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWUiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIEludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUgPSAiSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgTUFYX0NIQVJTX1JFQUNIRUQgPSAiTUFYX0NIQVJTX1JFQUNIRUQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFN0cmluZ1ZhbHVlID0gInN0cnZhbCI7IC8vJE5PTi1OTFMtMSQKLQlmaW5hbCBTdHJpbmcgVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZSA9ICJVbkRlbGltaXRlZFN0cmluZ1ZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBTdHJpbmcgVVRGMTZCRSA9ICJVVEYxNkJFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBTdHJpbmcgVVRGMTZMRSA9ICJVVEYxNkxFIjsgLy8kTk9OLU5MUy0xJAotCi0KLQlwdWJsaWMgZmluYWwgU3RyaW5nIFVURjgzQnl0ZUJPTSA9ICJVVEY4M0J5dGVCT00iOyAvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0hlYWRQYXJzZXJUb2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjE0YjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvSGVhZFBhcnNlclRva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50dHlwZTsKLQotcHVibGljIGNsYXNzIEhlYWRQYXJzZXJUb2tlbiB7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCi0JcHJpdmF0ZSBTdHJpbmcgZlRleHQ7Ci0JcHJpdmF0ZSBTdHJpbmcgZlR5cGU7Ci0KLQlwcm90ZWN0ZWQgSGVhZFBhcnNlclRva2VuKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBIZWFkUGFyc2VyVG9rZW4oU3RyaW5nIHR5cGUsIGludCBzdGFydCwgU3RyaW5nIHRleHQpIHsKLQkJdGhpcygpOwotCQlmVHlwZSA9IHR5cGU7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dCA9IHRleHQ7Ci0KLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gKCJ0ZXh0OiAiICsgZlRleHQgKyAiIG9mZnNldDogIiArIGZTdGFydCArICIgdHlwZTogIiArIGZUeXBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL0ludFN0YWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMTA1MmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9JbnRTdGFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLS8qCi0gKiAKLSAqIEEgbm9uLXJlc2l6YWJsZSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIGJlaGF2aW9yIG9mIGphdmEudXRpbC5TdGFjaywgYnV0Ci0gKiBkaXJlY3RseSBmb3IgdGhlIDxjb2RlPiBpbnRlZ2VyIDwvY29kZT4gcHJpbWl0aXZlLgotICovCi1pbXBvcnQgamF2YS51dGlsLkVtcHR5U3RhY2tFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBJbnRTdGFjayB7Ci0JcHJpdmF0ZSBpbnRbXSBsaXN0ID0gbnVsbDsKLQotCXByaXZhdGUgaW50IHNpemUgPSAwOwotCi0JcHVibGljIEludFN0YWNrKCkgewotCQl0aGlzKDEwMCk7Ci0JfQotCi0JcHVibGljIEludFN0YWNrKGludCBtYXhkZXB0aCkgewotCQlzdXBlcigpOwotCQlsaXN0ID0gbmV3IGludFttYXhkZXB0aF07Ci0JCWluaXRpYWxpemUoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJaW5pdGlhbGl6ZSgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGVtcHR5KCkgewotCQlyZXR1cm4gc2l6ZSA9PSAwOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0KGludCBzbG90KSB7Ci0JCXJldHVybiBsaXN0W3Nsb3RdOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbGlzdC5sZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9OdWxsTWVtZW50by5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzQ3MDI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvTnVsbE1lbWVudG8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuTm9uQ29udGVudEJhc2VkRW5jb2RpbmdSdWxlczsKLQotCi0KLS8qKgotICogVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBpbiBwbGFjZSBvZiBhbiBFbmNvZGluZ01lbWVudG8gKGl0cyBzdXBlciBjbGFzcyksCi0gKiB3aGVuIHRoZXJlIGlzIG5vdCBpbiBmYWN0IEFOWSBlbmNvZGluZyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYQotICogc3RydWN0dXJlZERvY3VtZW50IGlzIGNyZWF0ZWQgZGlyZWN0bHkgZnJvbSBhIFN0cmluZwotICovCi1wdWJsaWMgY2xhc3MgTnVsbE1lbWVudG8gZXh0ZW5kcyBFbmNvZGluZ01lbWVudG8gewotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTnVsbE1lbWVudG8oKSB7Ci0JCXN1cGVyKCk7Ci0JCVN0cmluZyBkZWZhdWx0Q2hhcnNldCA9IE5vbkNvbnRlbnRCYXNlZEVuY29kaW5nUnVsZXMudXNlRGVmYXVsdE5hbWVSdWxlcyhudWxsKTsKLQkJc2V0SmF2YUNoYXJzZXROYW1lKGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0QXBwcm9wcmlhdGVEZWZhdWx0KGRlZmF1bHRDaGFyc2V0KTsKLQkJc2V0RGV0ZWN0ZWRDaGFyc2V0TmFtZShudWxsKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTERlY2xEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGFiMjg2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MRGVjbERldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFhNTERlY2xEZXRlY3RvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9CVUZfU0laRSA9IDEwMjQgKiA4OwotCXByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTUFSS19TSVpFID0gMTAyNCAqIDg7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZkhlYWRlclBhcnNlZDsKLQlwcml2YXRlIGJvb2xlYW4gZklzWE1MOwotCXByb3RlY3RlZCBSZWFkZXIgZlJlYWRlcjsKLQkvL3ByaXZhdGUgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBmVG9rZW5pemVyOwotCi0JcHJpdmF0ZSBib29sZWFuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbShTdHJpbmcgdG9rZW5UeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gZmFsc2U7Ci0JCWlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGODNCeXRlQk9NKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJLy9mVW5pY29kZSA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJfSBlbHNlIGlmICh0b2tlblR5cGUgPT0gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuVVRGMTZCRSkgewotCQkJY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtID0gdHJ1ZTsKLQkJCS8vZlVuaWNvZGUgPSAiVVRGLTE2QkUiOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2TEUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQkvL2ZVbmljb2RlID0gIlVURi0xNiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtOwotCX0KLQotCWZpbmFsIHByaXZhdGUgdm9pZCBlbnN1cmVJbnB1dFNldCgpIHsKLQkJaWYgKGZSZWFkZXIgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5wdXQgbXVzdCBiZSBzZXQgYmVmb3JlIHVzZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvL3ByaXZhdGUgU3RyaW5nIGZVbmljb2RlOwotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSB0b2tlbml6ZXIuCi0JICovCi0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBYTUxIZWFkVG9rZW5pemVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZUb2tlbml6ZXI7Ci0JfQotCi0JLyoqCi0JICogQHJldHVybiBSZXR1cm5zIHRoZSBpc1hNTC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1hNTCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCWVuc3VyZUlucHV0U2V0KCk7Ci0JCWlmICghZkhlYWRlclBhcnNlZCkgewotCQkJcGFyc2VJbnB1dCgpOwotCQl9Ci0JCXJldHVybiBmSXNYTUw7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQkJCWlmIChjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0odG9rZW5UeXBlKSkgewotCQkJCWZSZWFkZXIucmVzZXQoKTsKLQkJCQkvLyB0aGlzIGlzIChvYnZpb3VzbHkpIG5vdCBhbHdheXMgdHJ1ZS4KLQkJCQkvLyBUT0RPOiBuZWVkIHRvIGZpeCBzbyB3ZSAicmVtZW1iZXIiIG9yaWdpbmFsIGlGaWxlIG9yCi0JCQkJLy8gaW5wdXRzdHJlYW0sIGFuZAotCQkJCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBJbnB1dFN0cmVhbVJlYWRlci4KLQkJCQkvLyBJJ20gbm90IHN1cmUgd2hhdCB0byBkbyBmb3IgdGhlIHNldChyZWFkZXIpIGNhc2UgLi4uIGlmIGl0cwotCQkJCS8vIGV2ZW4gcmVsZXZlbnQuCi0JCQkJLy8gcGx1cywgZW5zdXJlIGFnYWluc3QgaW5maW5pdGUgbG9vcHMhCi0JCQkJZklzWE1MID0gdHJ1ZTsKLQkJCQkvL2ZSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZlJlYWRlciwgZlVuaWNvZGUpOwotCQkJCS8vIHBhcnNlSW5wdXQoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKHRva2VuVHlwZSA9PSBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nKSB7Ci0JCQkJCWZJc1hNTCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKTsKLQotCX0KLQotCXByaXZhdGUgdm9pZCByZXNldEFsbCgpIHsKLQkJZlJlYWRlciA9IG51bGw7Ci0JCWZIZWFkZXJQYXJzZWQgPSBmYWxzZTsKLQkJZklzWE1MID0gZmFsc2U7Ci0JCS8vZlVuaWNvZGUgPSBudWxsOwotCi0JfQotCi0JcHVibGljIHZvaWQgc2V0KElGaWxlIGlGaWxlKSB0aHJvd3MgQ29yZUV4Y2VwdGlvbiB7Ci0JCXJlc2V0QWxsKCk7Ci0JCUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gaUZpbGUuZ2V0Q29udGVudHModHJ1ZSk7Ci0JCUlucHV0U3RyZWFtIHJlc2V0dGFibGVTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSwgTUFYX0JVRl9TSVpFKTsKLQkJcmVzZXR0YWJsZVN0cmVhbS5tYXJrKE1BWF9NQVJLX1NJWkUpOwotCQlzZXQocmVzZXR0YWJsZVN0cmVhbSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0KElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7Ci0JCXJlc2V0QWxsKCk7Ci0JCWZSZWFkZXIgPSBuZXcgQnl0ZVJlYWRlcihpbnB1dFN0cmVhbSk7Ci0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2libGUsIHNpbmNlIHdlIGtub3cgQnl0ZVJlYWRlciBzdXBwb3J0cyBtYXJraW5nCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBOb3RlOiB0aGlzIGlzIG5vdCBwYXJ0IG9mIGludGVyZmFjZSB0byBoZWxwIGF2b2lkIGNvbmZ1c2lvbiAuLi4gaXQKLQkgKiBleHBlY3RlZCB0aGlzIFJlYWRlciBpcyBhIHdlbGwgZm9ybWVkIGNoYXJhY3RlciByZWFkZXIgLi4uIHRoYXQgaXMsIGl0cwotCSAqIGFsbCByZWFkeSBiZWVuIGRldGVybWluZWQgdG8gbm90IGJlIGEgdW5pY29kZSBtYXJrZWQgaW5wdXQgc3RyZWFtLiBBbmQsCi0JICogaXRzIGFzc3VtZWQgdG8gYmUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24sIGF0IHBvc2l0aW9uIHplcm8sIHJlYWR5IHRvCi0JICogcmVhZCBmaXJzdCBjaGFyYWN0ZXIuCi0JICovCi0JcHVibGljIHZvaWQgc2V0KFJlYWRlciByZWFkZXIpIHsKLQkJcmVzZXRBbGwoKTsKLQkJZlJlYWRlciA9IHJlYWRlcjsKLQkJaWYgKCFmUmVhZGVyLm1hcmtTdXBwb3J0ZWQoKSkgewotCQkJZlJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihmUmVhZGVyKTsKLQkJfQotCi0JCXRyeSB7Ci0JCQlmUmVhZGVyLm1hcmsoTUFYX01BUktfU0laRSk7Ci0JCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGltcG9zc2JsZSwgc2luY2Ugd2UganVzdCBjaGVja2VkIGlmIG1hcmthYmxlCi0JCQl0aHJvdyBuZXcgRXJyb3IoZSk7Ci0JCX0KLQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9jb250ZW50dHlwZS9YTUxIZWFkVG9rZW5pemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhYjY4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzMgKzAsMCBAQAotLyogVGhlIGZvbGxvd2luZyBjb2RlIHdhcyBnZW5lcmF0ZWQgYnkgSkZsZXggMS40IG9uIDcvNS8wNSAxOjE5IEFNICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qbmxzWFhYKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuRW5jb2RpbmdQYXJzZXJDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnR0eXBlLlhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHM7Ci0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40Ci0gKiBvbiA3LzUvMDUgMToxOSBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5EOi9idWlsZHMvV29ya3NwYWNlcy9QdXJlSGVhZFdUUF9NNy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MSGVhZFRva2VuaXplci5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxIZWFkVG9rZW5pemVyIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlFT0YgPSAtMTsKLQotICAvKiogaW5pdGlhbCBzaXplIG9mIHRoZSBsb29rYWhlYWQgYnVmZmVyICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9CVUZGRVJTSVpFID0gODE5MjsKLQotICAvKiogbGV4aWNhbCBzdGF0ZXMgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgWVlJTklUSUFMID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVW5EZWxpbWl0ZWRTdHJpbmcgPSAxMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRFFfU1RSSU5HID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1FfU1RSSU5HID0gODsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1RfWE1MRGVjbCA9IDI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFF1b3RlZEF0dHJpYnV0ZVZhbHVlID0gNDsKLQotICAvKioKLSAgICogWlpfTEVYU1RBVEVbbF0gaXMgdGhlIHN0YXRlIGluIHRoZSBERkEgZm9yIHRoZSBsZXhpY2FsIHN0YXRlIGwKLSAgICogWlpfTEVYU1RBVEVbbCsxXSBpcyB0aGUgc3RhdGUgaW4gdGhlIERGQSBmb3IgdGhlIGxleGljYWwgc3RhdGUgbAotICAgKiAgICAgICAgICAgICAgICAgIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi0gICAqIGwgaXMgb2YgdGhlIGZvcm0gbCA9IDIqaywgayBhIG5vbiBuZWdhdGl2ZSBpbnRlZ2VyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTEVYU1RBVEVbXSA9IHsgCi0gICAgIDAsICAxLCAgMiwgIDIsICAzLCAgMywgIDQsICA0LCAgNSwgIDUsICA2LCA2Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUcmFuc2xhdGVzIGNoYXJhY3RlcnMgdG8gY2hhcmFjdGVyIGNsYXNzZXMKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9DTUFQX1BBQ0tFRCA9IAotICAgICJcMTFcMFwxXDZcMVwxMVwyXDBcMVwxMFwyMlwwXDFcNlwxXDBcMVwzMlwyXDAiKwotICAgICJcMVwzNFwxXDBcMVwzM1wyNFwwXDFcMTJcMVw3XDFcMzFcMVwxM1wzXDBcMVwyNiIrCi0gICAgIlwxXDI3XDFcMjBcMVwwXDFcMzBcMVwwXDFcMjNcMlwwXDFcMTZcMVwxNVwxXDI1IisKLSAgICAiXDFcMjRcMlwwXDFcMjFcMVwyMlwyXDBcMVwxN1wxXDBcMVwxNFwxMlwwXDFcMjYiKwotICAgICJcMVwyN1wxXDIwXDFcMFwxXDMwXDFcMFwxXDIzXDJcMFwxXDE2XDFcMTVcMVwyNSIrCi0gICAgIlwxXDI0XDJcMFwxXDIxXDFcMjJcMlwwXDFcMTdcMVwwXDFcMTRcMTAyXDBcMVw0IisKLSAgICAiXDNcMFwxXDVcMTdcMFwxXDNcMTZcMFwxXDFcMjBcMFwxXDNcMTZcMFwxXDEiKwotICAgICJcMVwyXDE3MFwwXDFcMlx1ZmU4N1wwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBbXSBaWl9DTUFQID0genpVbnBhY2tDTWFwKFpaX0NNQVBfUEFDS0VEKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgREZBIHN0YXRlcyB0byBhY3Rpb24gc3dpdGNoIGxhYmVscy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BQ1RJT04gPSB6elVucGFja0FjdGlvbigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BQ1RJT05fUEFDS0VEXzAgPQotICAgICJcN1wwXDExXDFcMlwyXDFcMVwxXDNcMVw0XDFcNVwxXDYiKwotICAgICJcMVw1XDFcN1wxXDVcMVw3XDFcNVwxXDEwXDJcMTFcMVwxMiIrCi0gICAgIlwxXDEzXDRcMFwxXDE0XDNcMFwxXDE1XDFcMFwxXDE2XDFcMTciKwotICAgICJcMTFcMFwxXDIwXDRcMFwxXDIxXDFcMFwxXDIyIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBY3Rpb24oKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbNjJdOwotICAgIGludCBvZmZzZXQgPSAwOwotICAgIG9mZnNldCA9IHp6VW5wYWNrQWN0aW9uKFpaX0FDVElPTl9QQUNLRURfMCwgb2Zmc2V0LCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgenpVbnBhY2tBY3Rpb24oU3RyaW5nIHBhY2tlZCwgaW50IG9mZnNldCwgaW50IFtdIHJlc3VsdCkgewotICAgIGludCBpID0gMDsgICAgICAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBpbnQgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyByZXN1bHRbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gajsKLSAgfQotCi0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfUFVTSEJBQ0tfMkJJRyA9IDI7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwKLSAgICAiRXJyb3I6IGNvdWxkIG5vdCBtYXRjaCBpbnB1dCIsCi0gICAgIkVycm9yOiBwdXNoYmFjayB2YWx1ZSB3YXMgdG9vIGxhcmdlIgotICB9OwotCi0gIC8qKiB0aGUgaW5wdXQgZGV2aWNlICovCi0gIHByaXZhdGUgamF2YS5pby5SZWFkZXIgenpSZWFkZXI7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLQotICAvKiogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgdGhlIHNvdXJjZSBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nICovCi0gIHByaXZhdGUgY2hhciB6ekJ1ZmZlcltdID0gbmV3IGNoYXJbWlpfQlVGRkVSU0laRV07Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TWFya2VkUG9zOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICBwcml2YXRlIGludCB6elB1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpDdXJyZW50UG9zOwotCi0gIC8qKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgenpTdGFydFJlYWQ7Ci0KLSAgLyoqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgZnJvbSBpbnB1dCAqLwotICBwcml2YXRlIGludCB6ekVuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotLy8gIHByaXZhdGUgaW50IHl5bGluZTsKLQotICAvKiogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5Y2hhcjsKLQotICAvKioKLSAgICogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGZyb20gdGhlIGxhc3QgbmV3bGluZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIAotICAgKiBtYXRjaGVkIHRleHQKLSAgICovCi0vLyAgcHJpdmF0ZSBpbnQgeXljb2x1bW47Ci0KLSAgLyoqIAotICAgKiB6ekF0Qk9MID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGN1cnJlbnRseSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZQotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4genpFT0ZEb25lOwotCi0gIC8qIHVzZXIgY29kZTogKi8KLQotCi0JcHJpdmF0ZSBib29sZWFuIGhhc01vcmUgPSB0cnVlOwotCXByaXZhdGUgZmluYWwgc3RhdGljIGludCBNQVhfVE9fU0NBTiA9IDgwMDA7Ci0JU3RyaW5nQnVmZmVyIHN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkvLyBzdGF0ZSBzdGFjayBmb3IgZWFzaWVyIHN0YXRlIGhhbmRsaW5nCi0JcHJpdmF0ZSBJbnRTdGFjayBmU3RhdGVTdGFjayA9IG5ldyBJbnRTdGFjaygpOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlVGV4dCA9IG51bGw7Ci0KLQotCXB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCSAgcHVibGljIHZvaWQgcmVzZXQgKFJlYWRlciBpbikgewotICAgICAgICAgICAgICAgIC8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgICAgICAgICAgICAgICB6elJlYWRlciA9IGluOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICAgICAgICAgICAgICAgIHp6U3RhdGUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICAgICAgICAgICAgICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gICAgICAgICAgICAgICAgLyogdGhpcyBidWZmZXIgY29udGFpbnMgdGhlIGN1cnJlbnQgdGV4dCB0byBiZSBtYXRjaGVkIGFuZCBpcwotICAgICAgICAgICAgICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgICAgICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmZpbGwoenpCdWZmZXIsIChjaGFyKTApOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgICAgICAgICAgICAgICB6ek1hcmtlZFBvcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IHN0YXRlIHRvIGJlIGluY2x1ZGVkIGluIHl5dGV4dCAqLwotICAgICAgICAgICAgICAgIHp6UHVzaGJhY2tQb3MgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgenpDdXJyZW50UG9zID0gMDsKLQotICAgICAgICAgICAgICAgIC8qIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgIHp6U3RhcnRSZWFkID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotICAgICAgICAgICAgICAgICAqIGZyb20gaW5wdXQKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekVuZFJlYWQgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0vLyAgICAgICAgICAgICAgICB5eWxpbmUgPSAwOwotCi0gICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gICAgICAgICAgICAgICAgeXljaGFyID0gMDsKLQotICAgICAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICAgICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICogb2YgdGhlIG1hdGNoZWQgdGV4dAotICAgICAgICAgICAgICAgICAqLwotLy8gICAgICAgICAgICAgICAgeXljb2x1bW4gPSAwOwotCi0gICAgICAgICAgICAgICAgLyoqCi0gICAgICAgICAgICAgICAgICogeXlfYXRCT0wgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaXMgY3VycmVudGx5IGF0IHRoZSBiZWdpbm5pbmcKLSAgICAgICAgICAgICAgICAgKiBvZiBhIGxpbmUKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIC8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLSAgICAgICAgICAgICAgICB6ekF0RU9GID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvKiBkZW5vdGVzIGlmIHRoZSB1c2VyLUVPRi1jb2RlIGhhcyBhbHJlYWR5IGJlZW4gZXhlY3V0ZWQgKi8KLSAgICAgICAgICAgICAgICB6ekVPRkRvbmUgPSBmYWxzZTsKLQotCi0gICAgICAgICAgICAgICAgZlN0YXRlU3RhY2suY2xlYXIoKTsKLQotICAgICAgICAgICAgICAgIGhhc01vcmUgPSB0cnVlOwotICAJCQotICAJfQotCi0KLQlwdWJsaWMgZmluYWwgSGVhZFBhcnNlclRva2VuIGdldE5leHRUb2tlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJSGVhZFBhcnNlclRva2VuIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh2YWx1ZVRleHQgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gY3JlYXRlVG9rZW4oY29udGV4dCwgeXljaGFyLCB2YWx1ZVRleHQpOwotCQkJdmFsdWVUZXh0ID0gbnVsbDsKLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZVRva2VuKGNvbnRleHQsIHl5Y2hhciwgeXl0ZXh0KCkpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZVRva2VucygpIHsKLQkJcmV0dXJuIGhhc01vcmUgJiYgeXljaGFyIDwgTUFYX1RPX1NDQU47Ci0JfQotCXByaXZhdGUgdm9pZCBwdXNoQ3VycmVudFN0YXRlKCkgewotCQlmU3RhdGVTdGFjay5wdXNoKHl5c3RhdGUoKSk7Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgcG9wU3RhdGUoKSB7Ci0JCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCX0KLQkKLQlwcml2YXRlIEhlYWRQYXJzZXJUb2tlbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBTdHJpbmcgdGV4dCkgewotCQlyZXR1cm4gbmV3IEhlYWRQYXJzZXJUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dCk7Ci0JfQkKLQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTEhlYWRUb2tlbml6ZXIoamF2YS5pby5SZWFkZXIgaW4pIHsKLSAgICB0aGlzLnp6UmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxIZWFkVG9rZW5pemVyKGphdmEuaW8uSW5wdXRTdHJlYW0gaW4pIHsKLSAgICB0aGlzKG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gIH0KLQotICAvKiogCi0gICAqIFVucGFja3MgdGhlIGNvbXByZXNzZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gcGFja2VkICAgdGhlIHBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICogQHJldHVybiAgICAgICAgIHRoZSB1bnBhY2tlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNoYXIgW10genpVbnBhY2tDTWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDE0OCkgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIHp6QXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgenpFbmRSZWFkID0genpTdGFydFJlYWQ7ICAvKiBpbnZhbGlkYXRlIGJ1ZmZlciAgICAqLwotCi0gICAgaWYgKHp6UmVhZGVyICE9IG51bGwpCi0gICAgICB6elJlYWRlci5jbG9zZSgpOwotICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgeXlyZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIpIHsKLSAgICB6elJlYWRlciA9IHJlYWRlcjsKLSAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLSAgICB5eWNoYXIgPSAwOwotICAgIHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGludCB5eXN0YXRlKCkgewotICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEVudGVycyBhIG5ldyBsZXhpY2FsIHN0YXRlCi0gICAqCi0gICAqIEBwYXJhbSBuZXdTdGF0ZSB0aGUgbmV3IGxleGljYWwgc3RhdGUKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHl5YmVnaW4oaW50IG5ld1N0YXRlKSB7Ci0gICAgenpMZXhpY2FsU3RhdGUgPSBuZXdTdGF0ZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyggenpCdWZmZXIsIHp6U3RhcnRSZWFkLCB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZCApOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIDx0dD5wb3M8L3R0PiBmcm9tIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0LiAKLSAgICogCi0gICAqIEl0IGlzIGVxdWl2YWxlbnQgdG8geXl0ZXh0KCkuY2hhckF0KHBvcyksIGJ1dCBmYXN0ZXIKLSAgICoKLSAgICogQHBhcmFtIHBvcyB0aGUgcG9zaXRpb24gb2YgdGhlIGNoYXJhY3RlciB0byBmZXRjaC4gCi0gICAqICAgICAgICAgICAgQSB2YWx1ZSBmcm9tIDAgdG8geXlsZW5ndGgoKS0xLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgYXQgcG9zaXRpb24gcG9zCi0gICAqLwotICBwdWJsaWMgZmluYWwgY2hhciB5eWNoYXJhdChpbnQgcG9zKSB7Ci0gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoZWQgdGV4dCByZWdpb24uCi0gICAqLwotICBwdWJsaWMgZmluYWwgaW50IHl5bGVuZ3RoKCkgewotICAgIHJldHVybiB6ek1hcmtlZFBvcy16elN0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgcHVibGljIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotICAgIGlmICggbnVtYmVyID4geXlsZW5ndGgoKSApCi0gICAgICB6elNjYW5FcnJvcihaWl9QVVNIQkFDS18yQklHKTsKLQotICAgIHp6TWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIENvbnRhaW5zIHVzZXIgRU9GLWNvZGUsIHdoaWNoIHdpbGwgYmUgZXhlY3V0ZWQgZXhhY3RseSBvbmNlLAotICAgKiB3aGVuIHRoZSBlbmQgb2YgZmlsZSBpcyByZWFjaGVkCi0gICAqLwotICBwcml2YXRlIHZvaWQgenpEb0VPRigpIHsKLSAgICBpZiAoIXp6RU9GRG9uZSkgewotICAgICAgenpFT0ZEb25lID0gdHJ1ZTsKLSAgICAJaGFzTW9yZT1mYWxzZTsKLQotICAgIH0KLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlc3VtZXMgc2Nhbm5pbmcgdW50aWwgdGhlIG5leHQgcmVndWxhciBleHByZXNzaW9uIGlzIG1hdGNoZWQsCi0gICAqIHRoZSBlbmQgb2YgaW5wdXQgaXMgZW5jb3VudGVyZWQgb3IgYW4gSS9PLUVycm9yIG9jY3Vycy4KLSAgICoKLSAgICogQHJldHVybiAgICAgIHRoZSBuZXh0IHRva2VuCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIFN0cmluZyBwcmltR2V0TmV4dFRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLQotICAgICAgeXljaGFyKz0genpNYXJrZWRQb3NMLXp6U3RhcnRSZWFkOwotCi0gICAgICBpZiAoenpNYXJrZWRQb3NMID4genpTdGFydFJlYWQpIHsKLSAgICAgICAgc3dpdGNoICh6ekJ1ZmZlckxbenpNYXJrZWRQb3NMLTFdKSB7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgY2FzZSAnXHUwMDBCJzoKLSAgICAgICAgY2FzZSAnXHUwMDBDJzoKLSAgICAgICAgY2FzZSAnXHUwMDg1JzoKLSAgICAgICAgY2FzZSAnXHUyMDI4JzoKLSAgICAgICAgY2FzZSAnXHUyMDI5JzoKLSAgICAgICAgICB6ekF0Qk9MID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiAKLSAgICAgICAgICBpZiAoenpNYXJrZWRQb3NMIDwgenpFbmRSZWFkTCkKLSAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpCi0gICAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBib29sZWFuIGVvZiA9IHp6UmVmaWxsKCk7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvc0wgPSB6ek1hcmtlZFBvczsKLSAgICAgICAgICAgIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgICAgICAgICAgaWYgKGVvZikgCi0gICAgICAgICAgICAgIHp6QXRCT0wgPSBmYWxzZTsKLSAgICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgIHp6QXRCT0wgPSB6ekJ1ZmZlckxbenpNYXJrZWRQb3NMXSAhPSAnXG4nOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB6ekF0Qk9MID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHp6QWN0aW9uID0gLTE7Ci0KLSAgICAgIHp6Q3VycmVudFBvc0wgPSB6ekN1cnJlbnRQb3MgPSB6elN0YXJ0UmVhZCA9IHp6TWFya2VkUG9zTDsKLSAgCi0gICAgICBpZiAoenpBdEJPTCkKLSAgICAgICAgenpTdGF0ZSA9IFpaX0xFWFNUQVRFW3p6TGV4aWNhbFN0YXRlKzFdOwotICAgICAgZWxzZQotICAgICAgICB6elN0YXRlID0gWlpfTEVYU1RBVEVbenpMZXhpY2FsU3RhdGVdOwotCi0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICB6eklucHV0ID0genpDTWFwTFt6eklucHV0XTsKLQotICAgICAgICAgIGJvb2xlYW4genpJc0ZpbmFsID0gZmFsc2U7Ci0gICAgICAgICAgYm9vbGVhbiB6ek5vTG9va0FoZWFkID0gZmFsc2U7Ci0KLSAgICAgICAgICB6ekZvck5leHQ6IHsgc3dpdGNoICh6elN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxOiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDM6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAxMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDEzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTg7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI2OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyMDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDIzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNjogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyNDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjc6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSAyNTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIyOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAyODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyMTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDI3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgMjY6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMjk7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDI3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMzA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDIxOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDI6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMzE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNDogenpTdGF0ZSA9IDMzOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDM0OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMDogenpTdGF0ZSA9IDM1OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAxMTogenpTdGF0ZSA9IDM2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAzNzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTY6IHp6U3RhdGUgPSAzODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSAzOTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gMTc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA0MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gMTY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNTogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSA0MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTA6IHp6U3RhdGUgPSA0MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjU6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDM7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gNDI7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDU6IHp6SXNGaW5hbCA9IHRydWU7IHp6Tm9Mb29rQWhlYWQgPSB0cnVlOyB6elN0YXRlID0gNDQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gMzQ7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIDEwOiB6elN0YXRlID0gMzU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM1OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDExOiB6elN0YXRlID0gMzY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM2OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDEyOiB6elN0YXRlID0gNDU7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM4OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDE3OiB6elN0YXRlID0gNDY7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDIyOiB6elN0YXRlID0gNDc7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDE3OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA5OiB6elN0YXRlID0gNDA7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiB6eklzRmluYWwgPSB0cnVlOyB6ek5vTG9va0FoZWFkID0gdHJ1ZTsgenpTdGF0ZSA9IDE2OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA0MjoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpOb0xvb2tBaGVhZCA9IHRydWU7IHp6U3RhdGUgPSAyMjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTM6IHp6U3RhdGUgPSA0ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTg6IHp6U3RhdGUgPSA0OTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA1MDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDg6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTQ6IHp6U3RhdGUgPSA1MTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA1MjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjM6IHp6U3RhdGUgPSA1MzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTI6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjA6IHp6U3RhdGUgPSA1NTsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTM6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMTk6IHp6U3RhdGUgPSA1NjsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6SXNGaW5hbCA9IHRydWU7IHp6U3RhdGUgPSA1NDsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTU6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgMjE6IHp6U3RhdGUgPSA1ODsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6IGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgNTc6Ci0gICAgICAgICAgICAgIHN3aXRjaCAoenpJbnB1dCkgewotICAgICAgICAgICAgICAgIGNhc2UgNjogCi0gICAgICAgICAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICAgICAgICBjYXNlIDk6IHp6U3RhdGUgPSA1NzsgYnJlYWsgenpGb3JOZXh0OwotICAgICAgICAgICAgICAgIGNhc2UgNzogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAyNDogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA1OToKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpJc0ZpbmFsID0gdHJ1ZTsgenpTdGF0ZSA9IDU5OyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDogYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgc3dpdGNoICh6eklucHV0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSA2OiAKLSAgICAgICAgICAgICAgICBjYXNlIDg6IAotICAgICAgICAgICAgICAgIGNhc2UgOTogenpTdGF0ZSA9IDYwOyBicmVhayB6ekZvck5leHQ7Ci0gICAgICAgICAgICAgICAgY2FzZSA3OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICBzd2l0Y2ggKHp6SW5wdXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDY6IAotICAgICAgICAgICAgICAgIGNhc2UgODogCi0gICAgICAgICAgICAgICAgY2FzZSA5OiB6eklzRmluYWwgPSB0cnVlOyB6elN0YXRlID0gNjE7IGJyZWFrIHp6Rm9yTmV4dDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAvLyBpZiB0aGlzIGlzIGV2ZXIgcmVhY2hlZCwgdGhlcmUgaXMgYSBzZXJpb3VzIGJ1ZyBpbiBKRmxleAotICAgICAgICAgICAgICB6elNjYW5FcnJvcihaWl9VTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSB9Ci0KLSAgICAgICAgICBpZiAoIHp6SXNGaW5hbCApIHsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoIHp6Tm9Mb29rQWhlYWQgKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBzdG9yZSBiYWNrIGNhY2hlZCBwb3NpdGlvbgotICAgICAgenpNYXJrZWRQb3MgPSB6ek1hcmtlZFBvc0w7Ci0KLSAgICAgIHN3aXRjaCAoenpBY3Rpb24gPCAwID8genpBY3Rpb24gOiBaWl9BQ1RJT05benpBY3Rpb25dKSB7Ci0gICAgICAgIGNhc2UgMTA6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkU7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA9PSAwICkge2hhc01vcmUgPSBmYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjgzQnl0ZUJPTTt9Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDIwOiBicmVhazsKLSAgICAgICAgY2FzZSA0OiAKLSAgICAgICAgICB7IHl5YmVnaW4oU1FfU1RSSU5HKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjE6IGJyZWFrOwotICAgICAgICBjYXNlIDU6IAotICAgICAgICAgIHsgc3RyaW5nLmFwcGVuZCggeXl0ZXh0KCkgKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjI6IGJyZWFrOwotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgaWYgKHl5Y2hhciA+IE1BWF9UT19TQ0FOKSB7aGFzTW9yZT1mYWxzZTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLk1BWF9DSEFSU19SRUFDSEVEO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDExOiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHtoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFO30KLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjQ6IGJyZWFrOwotICAgICAgICBjYXNlIDY6IAotICAgICAgICAgIHsgeXlwdXNoYmFjaygxKTtwb3BTdGF0ZSgpOyB2YWx1ZVRleHQgPSBzdHJpbmcudG9TdHJpbmcoKTsgcmV0dXJuIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW5hdGVkU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDI1OiBicmVhazsKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMSk7cG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAyNjogYnJlYWs7Ci0gICAgICAgIGNhc2UgOTogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbnRhdGVkVW5EZWxpbWl0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjc6IGJyZWFrOwotICAgICAgICBjYXNlIDc6IAotICAgICAgICAgIHsgcG9wU3RhdGUoKTsgdmFsdWVUZXh0ID0gc3RyaW5nLnRvU3RyaW5nKCk7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5TdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgICB7IHl5cHVzaGJhY2soMik7IHBvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjk6IGJyZWFrOwotICAgICAgICBjYXNlIDE2OiAKLSAgICAgICAgICB7IGlmICh5eWNoYXIgPT0gMCApIHt5eWJlZ2luKFNUX1hNTERlY2wpOyByZXR1cm4gWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5YTUxEZWNsU3RhcnQ7fQotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDEpOyB5eWJlZ2luKFVuRGVsaW1pdGVkU3RyaW5nKTsgc3RyaW5nLnNldExlbmd0aCgwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzE6IGJyZWFrOwotICAgICAgICBjYXNlIDE4OiAKLSAgICAgICAgICB7IHB1c2hDdXJyZW50U3RhdGUoKTsgeXliZWdpbihRdW90ZWRBdHRyaWJ1dGVWYWx1ZSk7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlbEVuY29kaW5nOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzMjogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTc6IAotICAgICAgICAgIHsgcHVzaEN1cnJlbnRTdGF0ZSgpOyB5eWJlZ2luKFF1b3RlZEF0dHJpYnV0ZVZhbHVlKTsgcmV0dXJuIFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFZlcnNpb247Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDMzOiBicmVhazsKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgICAgeyB5eXB1c2hiYWNrKDIpO3BvcFN0YXRlKCk7IHZhbHVlVGV4dCA9IHN0cmluZy50b1N0cmluZygpOyByZXR1cm4gRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgMzQ6IGJyZWFrOwotICAgICAgICBjYXNlIDM6IAotICAgICAgICAgIHsgeXliZWdpbihEUV9TVFJJTkcpOyBzdHJpbmcuc2V0TGVuZ3RoKDApOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICAgIHsgeXliZWdpbihZWUlOSVRJQUwpOyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBYTUxIZWFkVG9rZW5pemVyQ29uc3RhbnRzLlhNTERlY2xFbmQ7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIDM2OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgIHp6RG9FT0YoKTsKLSAgICAgICAgICAgICAgeyBoYXNNb3JlID0gZmFsc2U7IHJldHVybiBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5FT0Y7IH0KLSAgICAgICAgICB9IAotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgenpTY2FuRXJyb3IoWlpfTk9fTUFUQ0gpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWJkMjhiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MSGVhZFRva2VuaXplckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MSGVhZFRva2VuaXplckNvbnN0YW50cyBleHRlbmRzIEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzIHsKLQotCWZpbmFsIFN0cmluZyBYTUxEZWNsRW5kID0gIlhNTERlY2xFbmQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlY2xTdGFydCA9ICJYTUxEZWNsU3RhcnQiOyAvLyROT04tTkxTLTEkCi0JZmluYWwgU3RyaW5nIFhNTERlbEVuY29kaW5nID0gIlhNTERlbEVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCWZpbmFsIFN0cmluZyBYTUxEZWNsVmVyc2lvbiA9ICJYTUxEZWNsVmVyc2lvbiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2NvbnRlbnR0eXBlL1hNTFJlc291cmNlRW5jb2RpbmdEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTQ5NTI0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvY29udGVudHR5cGUvWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkVuY29kaW5nTWVtZW50bzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuSVJlc291cmNlQ2hhcnNldERldGVjdG9yOwotCi0KLXB1YmxpYyBjbGFzcyBYTUxSZXNvdXJjZUVuY29kaW5nRGV0ZWN0b3IgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRW5jb2RpbmdEZXRlY3RvciBpbXBsZW1lbnRzIElSZXNvdXJjZUNoYXJzZXREZXRlY3RvciB7Ci0JcHJpdmF0ZSBYTUxIZWFkVG9rZW5pemVyIGZUb2tlbml6ZXI7Ci0JcHJpdmF0ZSBib29sZWFuIGZEZWNsRGV0ZWN0ZWQgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gZkluaXRpYWxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0KLQlwcml2YXRlIGJvb2xlYW4gY2FuSGFuZGxlQXNVbmljb2RlU3RyZWFtKFN0cmluZyB0b2tlblR5cGUpIHsKLQkJYm9vbGVhbiBjYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSBmYWxzZTsKLQkJaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEY4M0J5dGVCT00pIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQkJZkVuY29kaW5nTWVtZW50by5zZXRVVEY4M0J5dGVCT01Vc2VkKHRydWUpOwotCQl9Ci0KLQkJZWxzZSBpZiAodG9rZW5UeXBlID09IEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLlVURjE2QkUpIHsKLQkJCWNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSA9IHRydWU7Ci0JCQlTdHJpbmcgZW5jID0gIlVURi0xNkJFIjsgLy8kTk9OLU5MUy0xJAotCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkRFVEVDVEVEX1NUQU5EQVJEX1VOSUNPREVfQllURVMpOwotCQl9Ci0JCWVsc2UgaWYgKHRva2VuVHlwZSA9PSBFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VVEYxNkxFKSB7Ci0JCQljYW5IYW5kbGVBc1VuaWNvZGVTdHJlYW0gPSB0cnVlOwotCQkJU3RyaW5nIGVuYyA9ICJVVEYtMTYiOyAvLyROT04tTkxTLTEkCi0JCQljcmVhdGVFbmNvZGluZ01lbWVudG8oZW5jLCBFbmNvZGluZ01lbWVudG8uREVURUNURURfU1RBTkRBUkRfVU5JQ09ERV9CWVRFUyk7Ci0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gUmV0dXJucyB0aGUgdG9rZW5pemVyLgotCSAqLwotCXByaXZhdGUgWE1MSGVhZFRva2VuaXplciBnZXRUb2tlbml6ZXIoKSB7Ci0JCS8vIFRPRE86IG5lZWQgdG8gd29yayBvbiAncmVzZXQnIGluIHRva2VuaXplciwgc28gbmV3IGluc3RhbmNlIGlzbid0Ci0JCS8vIGFsd2F5cyBuZWVkZWQKLQkJLy8gaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQlmVG9rZW5pemVyID0gbmV3IFhNTEhlYWRUb2tlbml6ZXIoKTsKLQkJLy8gfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNMZWdhbFN0cmluZyhTdHJpbmcgdmFsdWVUb2tlblR5cGUpIHsKLQkJaWYgKHZhbHVlVG9rZW5UeXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWVsc2UKLQkJCXJldHVybiB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuU3RyaW5nVmFsdWUpIHx8IHZhbHVlVG9rZW5UeXBlLmVxdWFscyhFbmNvZGluZ1BhcnNlckNvbnN0YW50cy5VbkRlbGltaXRlZFN0cmluZ1ZhbHVlKSB8fCB2YWx1ZVRva2VuVHlwZS5lcXVhbHMoRW5jb2RpbmdQYXJzZXJDb25zdGFudHMuSW52YWxpZFRlcm1pbmF0ZWRTdHJpbmdWYWx1ZSkgfHwgdmFsdWVUb2tlblR5cGUuZXF1YWxzKEVuY29kaW5nUGFyc2VyQ29uc3RhbnRzLkludmFsaWRUZXJtaW50YXRlZFVuRGVsaW1pdGVkU3RyaW5nVmFsdWUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBhcnNlSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCQlYTUxIZWFkVG9rZW5pemVyIHRva2VuaXplciA9IGdldFRva2VuaXplcigpOwotCQl0b2tlbml6ZXIucmVzZXQoZlJlYWRlcik7Ci0JCUhlYWRQYXJzZXJUb2tlbiB0b2tlbiA9IG51bGw7Ci0JCVN0cmluZyB0b2tlblR5cGUgPSBudWxsOwotCQlkbyB7Ci0JCQl0b2tlbiA9IHRva2VuaXplci5nZXROZXh0VG9rZW4oKTsKLQkJCXRva2VuVHlwZSA9IHRva2VuLmdldFR5cGUoKTsKLQotCQkJLy8gaGFuZGxlIHhtbCBjb250ZW50IHR5cGUgZGV0ZWN0aW9uCi0JCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVjbFN0YXJ0KSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IHRydWU7Ci0JCQkJU3RyaW5nIGRlY2xUZXh0ID0gdG9rZW4uZ2V0VGV4dCgpOwotCQkJCWlmIChkZWNsVGV4dC5zdGFydHNXaXRoKCI8PyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZkluaXRpYWxXaGl0ZVNwYWNlID0gZmFsc2U7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gaGFuZGxlIGVuY29kaW5nIGRldGVjdGlvbgotCQkJaWYgKGNhbkhhbmRsZUFzVW5pY29kZVN0cmVhbSh0b2tlblR5cGUpKSB7Ci0JCQkJLy8gc2lkZSBlZmZlY3Qgb2YgY2FuSGFuZGxlIGlzIHRvIGNyZWF0ZSBhcHByb3ByaWF0ZSBtZW1lbnRvCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAodG9rZW5UeXBlID09IFhNTEhlYWRUb2tlbml6ZXJDb25zdGFudHMuWE1MRGVsRW5jb2RpbmcpIHsKLQkJCQkJaWYgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQkJCXRva2VuID0gdG9rZW5pemVyLmdldE5leHRUb2tlbigpOwotCQkJCQkJdG9rZW5UeXBlID0gdG9rZW4uZ2V0VHlwZSgpOwotCQkJCQkJaWYgKGlzTGVnYWxTdHJpbmcodG9rZW5UeXBlKSkgewotCQkJCQkJCVN0cmluZyBlbmMgPSB0b2tlbi5nZXRUZXh0KCk7Ci0JCQkJCQkJaWYgKGVuYyAhPSBudWxsICYmIGVuYy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQkJY3JlYXRlRW5jb2RpbmdNZW1lbnRvKGVuYywgRW5jb2RpbmdNZW1lbnRvLkZPVU5EX0VOQ09ESU5HX0lOX0NPTlRFTlQpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQl3aGlsZSAodG9rZW5pemVyLmhhc01vcmVUb2tlbnMoKSk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlY2xEZXRlY3RlZCgpIHsKLQkJaWYgKCFmSGVhZGVyUGFyc2VkKSB7Ci0JCQl0cnkgewotCQkJCXBhcnNlSW5wdXQoKTsKLQkJCX0KLQkJCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQkJfQotCQkJLy8gd2Uga2VlcCB0cmFjayBvZiBpZiBoZWFkZXIncyBhbHJlYWR5IGJlZW4KLQkJCS8vIHBhcnNlLCBzbyBjYW4gbWFrZQotCQkJLy8gbXVsdGlwbGUgJ2dldCcgY2FsbHMsIHdpdGhvdXQgY2F1c2luZwotCQkJLy8gcmVwYXJzaW5nLgotCQkJZkhlYWRlclBhcnNlZCA9IHRydWU7Ci0JCX0KLQkJLy8gZkRlY2xEZXRlY3RlZCBpcyBzZXQgYXMgcGFydCBvZiBwYXJzaW5nLgotCQlyZXR1cm4gZkRlY2xEZXRlY3RlZDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBoYXNJbml0aWFsV2hpdGVTcGFjZSgpIHsKLQkJcmV0dXJuIGZJbml0aWFsV2hpdGVTcGFjZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZXNldEFsbCgpIHsKLQkgICAgc3VwZXIucmVzZXRBbGwoKTsKLQkJZkRlY2xEZXRlY3RlZCA9IGZhbHNlOwotCQlmSW5pdGlhbFdoaXRlU3BhY2UgPSBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0F0dHJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmN2MwMjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9BdHRySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MQ2hhckVudGl0eTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTE5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUF0dHI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogQXR0ckltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEF0dHJJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBJRE9NQXR0ciB7Ci0JcHJpdmF0ZSBJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIElUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0JcHJpdmF0ZSBFbGVtZW50SW1wbCBvd25lckVsZW1lbnQgPSBudWxsOwotCXByaXZhdGUgSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHZhbHVlU291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIEF0dHJJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEF0dHJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEF0dHJJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEF0dHJJbXBsCi0JICovCi0JcHJvdGVjdGVkIEF0dHJJbXBsKEF0dHJJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy52YWx1ZVNvdXJjZSA9IHRoYXQuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUF0dHJJbXBsIGNsb25lZCA9IG5ldyBBdHRySW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0RGVjbGFyYXRpb24oKSB7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGdldE93bmVyRWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZWxlbWVudC5nZXREZWNsYXJhdGlvbigpOwotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJaW50IG9mZnNldCA9IHRoaXMub3duZXJFbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy52YWx1ZVJlZ2lvbi5nZXRFbmQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMuZXF1YWxSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLmVxdWFsUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlpZiAodGhpcy5uYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiAob2Zmc2V0ICsgdGhpcy5uYW1lUmVnaW9uLmdldEVuZCgpKTsKLQkJfQotCQlyZXR1cm4gMDsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRFcXVhbFJlZ2lvbigpIHsKLQkJcmV0dXJuIHRoaXMuZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSB0aGlzLm5hbWUuaW5kZXhPZignOicpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIHRoaXMubmFtZTsKLQkJcmV0dXJuIHRoaXMubmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMubmFtZTsKLQl9Ci0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5uYW1lUmVnaW9uOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0RW5kT2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIGludCBnZXROYW1lUmVnaW9uU3RhcnRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHRoaXMubmFtZVJlZ2lvbik7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gYXNzdW1pbmcgdGhlIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIHRoZSBvbmUgdGhhdCBjb250YWlucwotCQkvLyBhdHRyaWJ1dGVzCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSB0aGlzLm93bmVyRWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZmxhdE5vZGUuZ2V0VGV4dCh0aGlzLm5hbWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TmFtZVJlZ2lvblRleHRFbmRPZmZzZXQoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCS8vIGFzc3VtaW5nIHRoZSBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyB0aGUgb25lIHRoYXQgY29udGFpbnMKLQkJLy8gYXR0cmlidXRlcwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQodGhpcy5uYW1lUmVnaW9uKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQlpZiAocHJlZml4LmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCW5zQXR0ck5hbWUgPSBJWE1MTmFtZXNwYWNlLlhNTE5TX1BSRUZJWCArIHByZWZpeDsKLQkJfQotCQllbHNlIHsKLQkJCVN0cmluZyBuYW1lID0gZ2V0TmFtZSgpOwotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLmVxdWFscyhJWE1MTmFtZXNwYWNlLlhNTE5TKSkgewotCQkJCS8vIGZpeGVkIFVSSQotCQkJCXJldHVybiBJWE1MTmFtZXNwYWNlLlhNTE5TX1VSSTsKLQkJCX0KLQkJCS8vIGRvZXMgbm90IGluaGVyaXQgbmFtZXNwYWNlIGZyb20gb3duZXIgZWxlbWVudAotCQkJLy8gaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHJldHVybgotCQkJLy8gdGhpcy5vd25lckVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JCX0KLQotCQlmb3IgKE5vZGUgbm9kZSA9IHRoaXMub3duZXJFbGVtZW50OyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCUF0dHIgYXR0ciA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuc0F0dHJOYW1lKTsKLQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJcmV0dXJuIGF0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCi0JCXJldHVybiB0aGlzLm5hbWVzcGFjZVVSSTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBBVFRSSUJVVEVfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXRPd25lckVsZW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLm93bmVyRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBpbmRleCA9IHRoaXMubmFtZS5pbmRleE9mKCc6Jyk7Ci0JCWlmIChpbmRleCA8PSAwKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIGV4Y2x1ZGUgSlNQIHRhZyBpbiBuYW1lCi0JCWlmICh0aGlzLm5hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5uYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3BlY2lmaWVkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldFNwZWNpZmllZCgpIHsKLQkJLy8gaWYgdGhlcmUgaXMgbm8gdW5kZXJseWluZyBkb2N1bWVudCByZWdpb24sIAotCQkvLyB0aGVuIHRoaXMgYXR0cmlidXRlcyB2YWx1ZSBoYXMgbm90IHJlYWxseSBiZSBzcGVjaWZpZWQKLQkJLy8geWV0IGluIHRoZSBkb2N1bWVudCwgYW5kIGFueSByZXR1cm5lZCB2YWx1ZXMsIHN1Y2ggYXMgCi0JCS8vIGFuIGVtcHR5IHN0cmluZyBvciBhIGRlZmF1bHQgdmFsdWUgYXJlIGJlaW5nIHN1cHBsaWVkCi0JCS8vIGFzIHBlciBzcGVjLCBub3QgcGVyIHdoYXQncyBpbiB0aGUgdXNlcnMgZG9jdW1lbnQuCi0JCXJldHVybiB0aGlzLnZhbHVlUmVnaW9uICE9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlpbnQgb2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaWYgKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMubmFtZVJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCQlpZiAodGhpcy5lcXVhbFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKG9mZnNldCArIHRoaXMuZXF1YWxSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCX0KLQkJaWYgKHRoaXMudmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJcmV0dXJuIChvZmZzZXQgKyB0aGlzLnZhbHVlUmVnaW9uLmdldFN0YXJ0KCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldFZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7Ci0JCXJldHVybiBnZXRWYWx1ZShnZXRWYWx1ZVNvdXJjZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHZhbHVlIGZvciB0aGUgc291cmNlCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWUoU3RyaW5nIHNvdXJjZSkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAoc291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gc291cmNlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCByZWYgPSBzb3VyY2UuaW5kZXhPZignJicpOwotCQl3aGlsZSAocmVmID49IDApIHsKLQkJCWludCBlbmQgPSBzb3VyY2UuaW5kZXhPZignOycsIHJlZiArIDEpOwotCQkJaWYgKGVuZCA+IHJlZiArIDEpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcocmVmICsgMSwgZW5kKTsKLQkJCQlTdHJpbmcgdmFsdWUgPSBnZXRDaGFyVmFsdWUobmFtZSk7Ci0JCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGgpOwotCQkJCQlpZiAocmVmID4gb2Zmc2V0KQotCQkJCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgcmVmKSk7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQodmFsdWUpOwotCQkJCQlvZmZzZXQgPSBlbmQgKyAxOwotCQkJCQlyZWYgPSBlbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQlyZXR1cm4gc291cmNlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZChzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCkpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy52YWx1ZVJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBJU1NVRTogd2hhdCBzaG91bGQgYmVoYXZpb3IgYmUgaWYgdGhpcy52YWx1ZSA9PSBudWxsPyBJdCdzIGFuICJlcnJvciIKLQkgKiB0byBiZSBpbiB0aGF0IHN0YXRlLCBidXQgc2VlbXMgdG8gb2NjdXIgcmVsYXRpdmVseSBlYXNpbHkgLi4uIHByb2JhYmx5Ci0JICogZHVlIHRvIHRocmVhZGluZyBidWdzIC4uLiBidXQgdGhpcyBqdXN0IHNob3dzIGl0cyBuZWVkcyB0byBiZSBzcGVjJ2QuCi0JICogCi0JICovCi0JcHVibGljIGludCBnZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIHRoZSB2YWx1ZVJlZ2lvbiAtLSBzaG91bGQgbWFrZSBzbWFydGVyPwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQkvLyBlbnN1cmUgd2UgbmV2ZXIgcGFzcyBudWxsIHRvIGdldFN0YXJ0T2Zmc2V0LgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHRoaXMudmFsdWVSZWdpb24pOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVSZWdpb25UZXh0KCkgewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQkvLyBhc3N1bWluZyB0aGUgZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgdGhlIG9uZSB0aGF0IGNvbnRhaW5zCi0JCS8vIGF0dHJpYnV0ZXMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQodGhpcy52YWx1ZVJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLnZhbHVlU291cmNlOwotCQkvLyBEVzogNC8xNi8yMDAzIGR1ZSB0byBjaGFuZ2UgaW4gc3RydWN0dXJlZERvY3VtZW50IC4uLiB3ZSBuZWVkIGEKLQkJLy8gZmxhdG5vZGUgdG8KLQkJLy8gZ2V0IGF0IHJlZ2lvbiB2YWx1ZXMuIEZvciBub3cgSSdsbCBhc3N1bWUgdGhpcyBpcyBhbHdheXMgdGhlIGZpcnN0Ci0JCS8vIGZsYXRub2RlIC4uIG1heSBuZWVkIHRvIG1ha2Ugc21hcnRlciBsYXRlciAoZS5nLiB0byBzZWFyY2ggZm9yCi0JCS8vIHRoZSBmbGF0bm9kZSB0aGF0IHRoaXMudmFsdWVSZWdpb24gYmVsb25ncyB0by4KLQkJLy8gRFc6IDQvMzAvMjAwMyBGb3Igc29tZSByZWFzb24sIHRoaXMgbWV0aG9kIGlzIGdldHRpbmcgY2FsbGVkIGEgbG90Ci0JCS8vIE5vdCBzdXJlIGlmIGl0cyBhIHRocmVhZGluZyBwcm9ibGVtLCBvciBhIGZ1bmRhbWVudGFsIGVycm9yCi0JCS8vIGVsc2V3aGVyZS4KLQkJLy8gSXQgbmVlZHMgbW9yZSBpbnZlc3RpZ2F0aW9uLCBidXQgaW4gdGhlIHVzZSBjYXNlcyBJJ3ZlIHNlZW4sCi0JCS8vIGRvZXNuJ3QKLQkJLy8gc2VlbSB0byBodXJ0IHRvIHNpbXBseSByZXR1cm4gbnVsbCBpbiB0aG9zZSBjYXNlcy4gSSBzYXcgdGhpcyBudWxsCi0JCS8vIGNhc2UsCi0JCS8vIHdoZW4gdHJ5aW50IGdvIGZvcm1hdCBhbiBYTUwgZmlsZS4KLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvd25lclJlZ2lvbiA9IHRoaXMub3duZXJFbGVtZW50LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChvd25lclJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUob3duZXJSZWdpb24sIHRoaXMudmFsdWVSZWdpb24pOwotCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFZhbHVlU291cmNlKEVsZW1lbnRJbXBsIG93bmVyRWxlbWVudCkgewotCQlpZiAodGhpcy52YWx1ZVNvdXJjZSAhPSBudWxsKQotCQkJcmV0dXJuIHRoaXMudmFsdWVTb3VyY2U7Ci0JCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkvLyBmbGF0bm9kZSB0bwotCQkvLyBnZXQgYXQgcmVnaW9uIHZhbHVlcy4gRm9yIG5vdyBJJ2xsIGFzc3VtZSB0aGlzIGlzIGFsd2F5cyB0aGUgZmlyc3QKLQkJLy8gZmxhdG5vZGUgLi4gbWF5IG5lZWQgdG8gbWFrZSBzbWFydGVyIGxhdGVyIChlLmcuIHRvIHNlYXJjaCBmb3IKLQkJLy8gdGhlIGZsYXRub2RlIHRoYXQgdGhpcy52YWx1ZVJlZ2lvbiBiZWxvbmdzIHRvLgotCQlpZiAodGhpcy52YWx1ZVJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKG93bmVyRWxlbWVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSwgdGhpcy52YWx1ZVJlZ2lvbik7Ci0JCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoU3RyaW5nIHZhbHVlKSB7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh2YWx1ZS5sZW5ndGgoKSA9PSAwKQotCQkJcmV0dXJuIHZhbHVlOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaW50IGFtcCA9IHZhbHVlLmluZGV4T2YoJyYnKTsKLQkJd2hpbGUgKGFtcCA+PSAwKSB7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA0KTsKLQkJCWlmIChhbXAgPiBvZmZzZXQpCi0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0LCBhbXApKTsKLQkJCWJ1ZmZlci5hcHBlbmQoSVhNTENoYXJFbnRpdHkuQU1QX1JFRik7Ci0JCQlvZmZzZXQgPSBhbXAgKyAxOwotCQkJYW1wID0gdmFsdWUuaW5kZXhPZignJicsIG9mZnNldCk7Ci0JCX0KLQkJaWYgKGJ1ZmZlciA9PSBudWxsKQotCQkJcmV0dXJuIHZhbHVlOwotCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBKU1AgaW4gdmFsdWUKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNOZXN0ZWRWYWx1ZSgpIHsKLQkJaWYgKHRoaXMudmFsdWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKCEodGhpcy52YWx1ZVJlZ2lvbiBpbnN0YW5jZW9mIElUZXh0UmVnaW9uQ29udGFpbmVyKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSB0aGlzLnZhbHVlUmVnaW9uKS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IGlzTmVzdGVkTGFuZ3VhZ2VPcGVuaW5nKHJlZ2lvblR5cGUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBDaGVjayBpZiBBdHRyIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZQotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc05hbWVPbmx5KCkgewotCQlyZXR1cm4gKHRoaXMubmFtZVJlZ2lvbiAhPSBudWxsICYmIHRoaXMuZXF1YWxSZWdpb24gPT0gbnVsbCAmJiB0aGlzLnZhbHVlUmVnaW9uID09IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1ByZWZpeCgpIHsKLQkJaWYgKHRoaXMubmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy5uYW1lLmluZGV4T2YoJzonKSA8PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBleGNsdWRlIEpTUCB0YWcgaW4gbmFtZQotCQlpZiAodGhpcy5uYW1lLmNoYXJBdCgwKSA9PSAnPCcpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlnbm9yZUNhc2UoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAodGhpcy5vd25lckVsZW1lbnQuaWdub3JlQ2FzZSgpKSB7Ci0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50Lmlnbm9yZUNhc2UoKSkgewotCQkJCS8vIGV2ZW4gaW4gY2FzZSBpbnNlbnNpdGl2ZSBkb2N1bWVudCwgaWYgaGF2aW5nIHByZWZpeCwgaXQncwotCQkJCS8vIGNhc2Ugc2Vuc2l0aXZlCi0JCQkJcmV0dXJuICFoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxBdHRyKCkgewotCQlpZiAoaGFzUHJlZml4KCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGhpcy5vd25lckVsZW1lbnQuaXNHbG9iYWxUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc1hNTEF0dHIoKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsKSB7Ci0JCQlpZiAoIXRoaXMub3duZXJFbGVtZW50LmlzWE1MVGFnKCkpIHsKLQkJCQlyZXR1cm4gaGFzUHJlZml4KCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiAhZG9jdW1lbnQuaXNYTUxUeXBlKCkpIHsKLQkJCQkvLyBldmVuIGluIG5vbi1YTUwgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgWE1MIHRhZwotCQkJCXJldHVybiBoYXNQcmVmaXgoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBtYXRjaE5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBtYXRjaE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy5uYW1lID09IG51bGwpOwotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICh0aGlzLm5hbWUubGVuZ3RoKCkgIT0gbmFtZS5sZW5ndGgoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKHRoaXMubmFtZS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJcmV0dXJuIHRoaXMubmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpICYmIGlnbm9yZUNhc2UoKTsKLQl9Ci0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlOYW1lQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwubmFtZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5VmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeVZhbHVlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIHRoaXMub3duZXJFbGVtZW50LmdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwudmFsdWVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVJlZ2lvbnMgbWV0aG9kCi0JICovCi0Jdm9pZCByZW1vdmVSZWdpb25zKCkgewotCQl0aGlzLm5hbWVSZWdpb24gPSBudWxsOwotCQl0aGlzLnZhbHVlUmVnaW9uID0gbnVsbDsKLQkJdGhpcy5lcXVhbFJlZ2lvbiA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoKSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZSgpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFJlZ2lvbnMoRWxlbWVudEltcGwgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMudmFsdWVTb3VyY2UgPSBnZXRWYWx1ZVNvdXJjZShvd25lckVsZW1lbnQpOwotCQlyZW1vdmVSZWdpb25zKCk7Ci0JfQotCi0Jdm9pZCBzZXRFcXVhbFJlZ2lvbihJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbikgewotCQl0aGlzLmVxdWFsUmVnaW9uID0gZXF1YWxSZWdpb247Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJCXN0YXJ0T2Zmc2V0ID0gdGhpcy5vd25lckVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShDSEFOR0UsIHRoaXMsIHZhbHVlLCBudWxsLCBzdGFydE9mZnNldCk7Ci0JCX0KLQkJdGhpcy5uYW1lID0gbmFtZTsKLQkJaWYgKHRoaXMub3duZXJFbGVtZW50ICE9IG51bGwpIHsKLQkJCXRoaXMub3duZXJFbGVtZW50Lm5vdGlmeShDSEFOR0UsIHRoaXMsIG51bGwsIHZhbHVlLCBzdGFydE9mZnNldCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldE5hbWVSZWdpb24oSVRleHRSZWdpb24gbmFtZVJlZ2lvbikgewotCQl0aGlzLm5hbWVSZWdpb24gPSBuYW1lUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXRWYWx1ZShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqIHNldE93bmVyRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJFbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0T3duZXJFbGVtZW50KEVsZW1lbnQgb3duZXJFbGVtZW50KSB7Ci0JCXRoaXMub3duZXJFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lckVsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5vd25lckVsZW1lbnQgIT0gbnVsbCAmJiAhdGhpcy5vd25lckVsZW1lbnQuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBwcmVmaXhMZW5ndGggPSAocHJlZml4ICE9IG51bGwgPyBwcmVmaXgubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGdldExvY2FsTmFtZSgpOwotCQlpZiAocHJlZml4TGVuZ3RoID09IDApIHsKLQkJCXNldE5hbWUobG9jYWxOYW1lKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAobG9jYWxOYW1lID09IG51bGwpCi0JCQlsb2NhbE5hbWUgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBsb2NhbExlbmd0aCA9IGxvY2FsTmFtZS5sZW5ndGgoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocHJlZml4TGVuZ3RoICsgMSArIGxvY2FsTGVuZ3RoKTsKLQkJYnVmZmVyLmFwcGVuZChwcmVmaXgpOwotCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCWJ1ZmZlci5hcHBlbmQobG9jYWxOYW1lKTsKLQkJc2V0TmFtZShidWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJbm90aWZ5TmFtZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKLQkJLy8gUmVtZW1iZXI6IGFzIHdlIGFjY291bnQgZm9yICJmbG9hdGVycyIgaW4KLQkJLy8gZnV0dXJlLCByZW1lbWJlciB0aGF0IHNvbWUgYXJlIGNyZWF0ZWQKLQkJLy8gaW4gdGhlIG5hdHVyYWwgcHJvY2VzcyBvZiBpbXBsZW1lbnRpbmcKLQkJLy8gRE9NIGFwaXMuCi0JCS8vIHRoaXMgInNlbGYgbm90aWZpY2F0aW9uIiBvZiBhYm91dC9jaGFuZ2VkLAotCQkvLyBpcyBhZGRlZCBmb3IgdGhpcyBjYXNlLCBiZWNhdXNlIGl0IGtub3duIHRvCi0JCS8vIGJlIGNhbGxlZCBmcm9tIHByb3BlcnRpZXMgcGFnZXMuIFNob3VsZCBiZSBhCi0JCS8vIGFkZGVkIHRvIGFsbCBET00gTW9kaWZpeWluZyBBUElzIGV2ZW50dWFsbHkuCi0JCXRyeSB7Ci0JCQlnZXRNb2RlbCgpLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCQkJc2V0VmFsdWVTb3VyY2UoZ2V0VmFsdWVTb3VyY2UodmFsdWUpKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWdldE1vZGVsKCkuY2hhbmdlZE1vZGVsKCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIHNldFZhbHVlUmVnaW9uKElUZXh0UmVnaW9uIHZhbHVlUmVnaW9uKSB7Ci0JCXRoaXMudmFsdWVSZWdpb24gPSB2YWx1ZVJlZ2lvbjsKLQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwpCi0JCQl0aGlzLnZhbHVlU291cmNlID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmICh0aGlzLm93bmVyRWxlbWVudCAhPSBudWxsICYmICF0aGlzLm93bmVyRWxlbWVudC5pc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy52YWx1ZVNvdXJjZSA9IHNvdXJjZTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiAKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZExhbmd1YWdlT3BlbmluZyhTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ0RBVEFTZWN0aW9uSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NmJmN2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DREFUQVNlY3Rpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotCi0vKioKLSAqIENEQVRBU2VjdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIENEQVRBU2VjdGlvbkltcGwgZXh0ZW5kcyBUZXh0SW1wbCBpbXBsZW1lbnRzIENEQVRBU2VjdGlvbiB7Ci0KLQkvKioKLQkgKiBDREFUQVNlY3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIENEQVRBU2VjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ0RBVEFTZWN0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBDREFUQVNlY3Rpb25JbXBsCi0JICovCi0JcHJvdGVjdGVkIENEQVRBU2VjdGlvbkltcGwoQ0RBVEFTZWN0aW9uSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ0RBVEFTZWN0aW9uSW1wbCBjbG9uZWQgPSBuZXcgQ0RBVEFTZWN0aW9uSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gaW5zdGVhZCBvZiBzdXBlcihUZXh0SW1wbCkuZ2V0RGF0YSgpLCBjYWxsIGdldENoYXJhY3RlckRhdGEoKQotCQlTdHJpbmcgZGF0YSA9IGdldENoYXJhY3RlckRhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJZGF0YSA9IGdldERhdGEoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQlkYXRhID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIGNvbnRlbnRSZWdpb24gPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTiB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoY29udGVudFJlZ2lvbiA9PSBudWxsKSB7IC8vIGZpcnN0IGNvbnRlbnQKLQkJCQljb250ZW50UmVnaW9uID0gcmVnaW9uOwotCQkJfSBlbHNlIHsgLy8gbXVsdGlwbGUgY29udGVudHMKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmbGF0Tm9kZS5nZXRUZXh0KGNvbnRlbnRSZWdpb24pKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQlpZiAoY29udGVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NkYXRhLXNlY3Rpb24iOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ0RBVEFfU0VDVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9DTU5vZGVVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjEwZjZkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NNTm9kZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotCi0vKioKLSAqLwotcHVibGljIGNsYXNzIENNTm9kZVV0aWwgewotCi0JLyoqCi0JICovCi0JcHVibGljIHN0YXRpYyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKEF0dHIgYXR0cikgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKEF0dHJJbXBsKSBhdHRyKS5nZXREZWNsYXJhdGlvbigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBzdGF0aWMgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RWxlbWVudERlY2xhcmF0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoKEVsZW1lbnRJbXBsKSBlbGVtZW50KS5nZXREZWNsYXJhdGlvbigpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvQ2hhcmFjdGVyRGF0YUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI4ZTIzNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NoYXJhY3RlckRhdGFJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5DaGFyYWN0ZXJEYXRhOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLS8qKgotICogQ2hhcmFjdGVyRGF0YUltcGwgY2xhc3MKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENoYXJhY3RlckRhdGFJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBDaGFyYWN0ZXJEYXRhIHsKLQotCXByaXZhdGUgU3RyaW5nIGRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ2hhcmFjdGVyRGF0YUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQ2hhcmFjdGVyRGF0YUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ2hhcmFjdGVyRGF0YUltcGwoQ2hhcmFjdGVyRGF0YUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmRhdGEgPSB0aGF0LmdldERhdGEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCWRhdGEgPSBhcmc7Ci0JCWVsc2UKLQkJCWRhdGEgKz0gYXJnOwotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqIGRlbGV0ZURhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuOwotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmIChjb3VudCA8IDAgfHwgb2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPT0gMCkgewotCQkJaWYgKGNvdW50ID4gbGVuZ3RoKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlpZiAoY291bnQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBuZXcgU3RyaW5nKCk7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKGNvdW50KTsKLQkJfSBlbHNlIHsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBTdHJpbmcgZ2V0Q2hhcmFjdGVyRGF0YSgpIHsKLQkJcmV0dXJuIHRoaXMuZGF0YTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gZ2V0Q2hhcmFjdGVyRGF0YSgpOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlTdHJpbmcgZGF0YSA9IGdldERhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gZGF0YS5sZW5ndGgoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlVmFsdWUoKSB7Ci0JCXJldHVybiBnZXREYXRhKCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gYXJnCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgaW5zZXJ0RGF0YShpbnQgb2Zmc2V0LCBTdHJpbmcgYXJnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGFyZyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCWlmIChvZmZzZXQgPiAwKSB7Ci0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCQl9Ci0JCQlkYXRhID0gYXJnOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlkYXRhID0gYXJnICsgZGF0YTsKLQkJfSBlbHNlIHsKLQkJCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQkJaWYgKG9mZnNldCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKG9mZnNldCA9PSBsZW5ndGgpCi0JCQkJZGF0YSArPSBhcmc7Ci0JCQllbHNlCi0JCQkJZGF0YSA9IGRhdGEuc3Vic3RyaW5nKDAsIG9mZnNldCkgKyBhcmcgKyBkYXRhLnN1YnN0cmluZyhvZmZzZXQpOwotCQl9Ci0JCXNldERhdGEoZGF0YSk7Ci0JfQotCi0JLyoqCi0JICogaXNKU1BDb250ZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQQ29udGVudCgpIHsKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBmYWxzZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlyZXR1cm4gZWxlbWVudC5pc0pTUENvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKGFyZyA9PSBudWxsKSB7Ci0JCQlkZWxldGVEYXRhKG9mZnNldCwgY291bnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChjb3VudCA9PSAwKSB7Ci0JCQlpbnNlcnREYXRhKG9mZnNldCwgYXJnKTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9IGVsc2UgaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWlmIChjb3VudCA+IGxlbmd0aCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJaWYgKGNvdW50ID09IGxlbmd0aCkKLQkJCQlkYXRhID0gYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBhcmcgKyBkYXRhLnN1YnN0cmluZyhjb3VudCk7Ci0JCX0gZWxzZSB7Ci0JCQlpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGgoKTsKLQkJCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJCWlmIChlbmQgPiBsZW5ndGgpIHsKLQkJCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJCX0KLQkJCWlmIChlbmQgPT0gbGVuZ3RoKQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnOwotCQkJZWxzZQotCQkJCWRhdGEgPSBkYXRhLnN1YnN0cmluZygwLCBvZmZzZXQpICsgYXJnICsgZGF0YS5zdWJzdHJpbmcoZW5kKTsKLQkJfQotCQlzZXREYXRhKGRhdGEpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgcmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCkgewotCQl0aGlzLmRhdGEgPSBnZXREYXRhKCk7Ci0JCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5kYXRhID0gZGF0YTsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb2RlVmFsdWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGVWYWx1ZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVWYWx1ZShTdHJpbmcgbm9kZVZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJc2V0RGF0YShub2RlVmFsdWUpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQl0aGlzLmRhdGEgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHN1YnN0cmluZ0RhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGNvdW50Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHN1YnN0cmluZ0RhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBjb3VudCA8IDApIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID09IDAgJiYgY291bnQgPT0gbGVuZ3RoKQotCQkJcmV0dXJuIGRhdGE7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldE5vZGVOYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0RGF0YSgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKScpOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlidWZmZXIuYXBwZW5kKCdAJyk7Ci0JCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0NvbW1lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4MDA3NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Db21tZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkNvbW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogQ29tbWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIENvbW1lbnRJbXBsIGV4dGVuZHMgQ2hhcmFjdGVyRGF0YUltcGwgaW1wbGVtZW50cyBDb21tZW50IHsKLQotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCi0JLyoqCi0JICogQ29tbWVudEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWVudEltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQ29tbWVudEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgQ29tbWVudEltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgQ29tbWVudEltcGwoQ29tbWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLmlzSlNQVGFnID0gdGhhdC5pc0pTUFRhZzsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJQ29tbWVudEltcGwgY2xvbmVkID0gbmV3IENvbW1lbnRJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlTdHJpbmcgZGF0YSA9IGdldENoYXJhY3RlckRhdGEoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJZGF0YSA9IGdldERhdGEoZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQkJaWYgKGRhdGEgPT0gbnVsbCkKLQkJCQlkYXRhID0gbmV3IFN0cmluZygpOwotCQl9Ci0JCXJldHVybiBkYXRhOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldERhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlUZXh0UmVnaW9uIGNvbnRlbnRSZWdpb24gPSBudWxsOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSB8fCBpc05lc3RlZENvbW1lbnRPcGVuQ2xvc2UocmVnaW9uVHlwZSkpIHsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmIChjb250ZW50UmVnaW9uID09IG51bGwpIHsgLy8gZmlyc3QgY29udGVudAotCQkJCWNvbnRlbnRSZWdpb24gPSByZWdpb247Ci0JCQl9Ci0JCQllbHNlIHsgLy8gbXVsdGlwbGUgY29udGVudHMKLQkJCQlpZiAoYnVmZmVyID09IG51bGwpIHsKLQkJCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihmbGF0Tm9kZS5nZXRUZXh0KGNvbnRlbnRSZWdpb24pKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbikpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKQotCQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCQlpZiAoY29udGVudFJlZ2lvbiAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoY29udGVudFJlZ2lvbik7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiAiI2NvbW1lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gQ09NTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFIHx8IGlzTmVzdGVkQ29tbWVudENsb3NlKHJlZ2lvblR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKiBTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUKLQkgKiBAcGFyYW0gcmVnaW9uVHlwZQotCSAqIEByZXR1cm4KLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENvbW1lbnRDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OyAKLQl9Ci0JLyoqCi0JICogU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0JICogQHBhcmFtIHJlZ2lvblR5cGUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbkNsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7IAotCX0KLQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQotCXB1YmxpYyBib29sZWFuIGlzSlNQVGFnKCkgewotCQlyZXR1cm4gdGhpcy5pc0pTUFRhZzsKLQl9Ci0KLQkvKioKLQkgKiBzZXRKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGlzSlNQVGFnCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SlNQVGFnKGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJaWYgKGlzSlNQVGFnID09IHRoaXMuaXNKU1BUYWcpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChpc0pTUFRhZykgewotCQkJaWYgKGRvY3VtZW50ID09IG51bGwgfHwgIWRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCXJldHVybjsKLQkJfQotCi0JCXRoaXMuaXNKU1BUYWcgPSBpc0pTUFRhZzsKLQotCQlpZiAoZ2V0Q29udGFpbmVyRG9jdW1lbnQoKSAhPSBudWxsKSB7Ci0JCQkvLyBhbHJlYWR5IGluIHRoZSB0cmVlLCB1cGRhdGUgSVN0cnVjdHVyZWREb2N1bWVudAotCQkJc2V0RGF0YShnZXREYXRhKCkpOyAvLyBjYWxscyBub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTW9kZWxJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RPTU1vZGVsSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTAxZWQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRE9NTW9kZWxJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubW9kZWwuQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5JU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5OZXdEb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuTm9DaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbnNSZXBsYWNlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uc1JlcGxhY2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NSW1wbGVtZW50YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFhNTE1vZGVsSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRE9NTW9kZWxJbXBsIGV4dGVuZHMgQWJzdHJhY3RTdHJ1Y3R1cmVkTW9kZWwgaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50TGlzdGVuZXIsIElET01Nb2RlbCwgRE9NSW1wbGVtZW50YXRpb24gewotCXByaXZhdGUgc3RhdGljIFN0cmluZyBUUkFDRV9QQVJTRVJfTUFOQUdFTUVOVF9FWENFUFRJT04gPSAicGFyc2VyTWFuYWdlbWVudCI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIE9iamVjdCBhY3RpdmUgPSBudWxsOwotCXByaXZhdGUgRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIElTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbnVsbDsKLQlwcml2YXRlIFhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gcmVmcmVzaCA9IGZhbHNlOwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogWE1MTW9kZWxJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIERPTU1vZGVsSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5kb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgY2xpZW50cyB0byBkZWNsYXJlIHRoYXQgdGhleSBhcmUgYWJvdXQgdG8gbWFrZSBhCi0JICogImxhcmdlIiBjaGFuZ2UgdG8gdGhlIG1vZGVsLiBUaGlzIGNoYW5nZSBtaWdodCBiZSBpbiB0ZXJtcyBvZiBjb250ZW50Ci0JICogb3IgaXQgbWlnaHQgYmUgaW4gdGVybXMgb2YgdGhlIG1vZGVsIGlkIG9yIGJhc2UgbG9jYXRpb24uCi0JICogCi0JICogTm90ZSB0aGF0IGluIHRoZSBjYXNlIG9mIGVtYmVkZGVkIGNhbGxzLCBub3RpZmljYXRpb24gdG8gbGlzdG5lcnMgaXMKLQkgKiBzZW50IG9ubHkgb25jZS4KLQkgKiAKLQkgKiBOb3RlIHRoYXQgdGhlIGNsaWVudCB3aG8gaXMgbWFraW5nIHRoZXNlIGNoYW5nZXMgaGFzIHRoZSByZXNwb25zaWJpbGl0eQotCSAqIHRvIHJlc3RvcmUgdGhlIG1vZGVscyBzdGF0ZSBvbmNlIGZpbmlzaGVkIHdpdGggdGhlIGNoYW5nZXMuIFNlZQotCSAqIGdldE1lbWVudG8gYW5kIHJlc3RvcmVTdGF0ZS4KLQkgKiAKLQkgKiBUaGUgbWV0aG9kIGlzTW9kZWxTdGF0ZUNoYW5naW5nIGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRldGVybWluZSBpZgotCSAqIHRoZSBtb2RlbCBpcyBhbHJlYWR5IGluIGEgY2hhbmdlIHNlcXVlbmNlLgotCSAqLwotCXB1YmxpYyB2b2lkIGFib3V0VG9DaGFuZ2VNb2RlbCgpIHsKLQkJc3VwZXIuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0JCS8vIHRlY2huaWNhbGx5LCBubyBuZWVkIHRvIGNhbGwgYmVnaW5DaGFuZ2luZyBzbyBvZnRlbiwKLQkJLy8gc2luY2UgYWJvdXRUb0NoYW5nZU1vZGVsIGNhbiBiZSBuZXN0ZWQuCi0JCS8vIGJ1dCB3aWxsIGxlYXZlIGFzIGlzIGZvciB0aGlzIHJlbGVhc2UuCi0JCS8vIHNlZSBtb2RlbENoYW5nZWQsIGFuZCBiZSBzdXJlIHN0YXlzIGNvb3JkaW5hdGVkIHRoZXJlLgotCQlnZXRNb2RlbE5vdGlmaWVyKCkuYmVnaW5DaGFuZ2luZygpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFib3V0VG9SZWluaXRpYWxpemVNb2RlbCgpIHsKLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJbm90aWZpZXIuY2FuY2VsUGVuZGluZygpOwotCQlzdXBlci5hYm91dFRvUmVpbml0aWFsaXplTW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgYXR0clJlcGxhY2VkKEVsZW1lbnQgZWxlbWVudCwgQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIucmVwbGFjZUF0dHIoZWxlbWVudCwgbmV3QXR0ciwgb2xkQXR0cik7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmF0dHJSZXBsYWNlZChlbGVtZW50LCBuZXdBdHRyLCBvbGRBdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIEFQSSBhbGxvd3MgYSBjbGllbnQgY29udHJvbGxlZCB3YXkgb2Ygbm90aWZ5aW5nIGFsbCBNb2RlbEV2ZW50Ci0JICogbGlzdG5lcnMgdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gVGhpcyBtZXRob2QgaXMgYSBtYXRjaGVkIHBhaXIKLQkgKiB0byBhYm91dFRvQ2hhbmdlTW9kZWwsIGFuZCBtdXN0IGJlIGNhbGxlZCBhZnRlciBhYm91dFRvQ2hhbmdlTW9kZWwgLi4uCi0JICogb3Igc29tZSBsaXN0ZW5lcnMgY291bGQgYmUgbGVmdCB3YWl0aW5nIGluZGVmaW5pdGVseSBmb3IgdGhlIGNoYW5nZWQKLQkgKiBldmVudC4gU28sIGl0cyBzdWdnZXN0ZWQgdGhhdCBjaGFuZ2VkTW9kZWwgYWx3YXlzIGJlIGluIGEgZmluYWxseQotCSAqIGNsYXVzZS4gTGlrZXdpc2UsIGEgY2xpZW50IHNob3VsZCBuZXZlciBjYWxsIGNoYW5nZWRNb2RlbCB3aXRob3V0Ci0JICogY2FsbGluZyBhYm91dFRvQ2hhbmdlTW9kZWwgZmlyc3QuCi0JICogCi0JICogSW4gdGhlIGNhc2Ugb2YgZW1iZWRkZWQgY2FsbHMsIHRoZSBub3RpZmljYXRpb24gaXMganVzdCBzZW50IG9uY2UuCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgY2hhbmdlZE1vZGVsKCkgewotCQkvLyBOT1RFOiB0aGUgb3JkZXIgb2YgJ2NoYW5nZWRNb2RlbCcgYW5kICdlbmRDaGFuZ2luZycgaXMgc2lnbmlmaWNhbnQuCi0JCS8vIEJ5IGNhbGxpbmcgY2hhbmdlZE1vZGVsIGZpcnN0LCB0aGlzIGJhc2ljYWxseSBkZWNyZW1lbnRzIHRoZQotCQkvLyAiaXNDaGFuZ2luZyIgY291bnRlcgotCQkvLyBpbiBzdXBlciBjbGFzcyBhbmQgd2hlbiB6ZXJvIGFsbCBsaXN0ZW5lcnMgdG8gbW9kZWwgc3RhdGUgZXZlbnRzCi0JCS8vIHdpbGwgYmUgbm90aWZpZWQKLQkJLy8gdGhhdCB0aGUgbW9kZWwgaGFzIGJlZW4gY2hhbmdlZC4gJ2VuZENoYW5naW5nJyB3aWxsIG5vdGlmeSBhbGwKLQkJLy8gZGVmZXJyZWQgYWRhcHRlcnMuCi0JCS8vIFNvLCB0aGUgc2lnbmlmaWNhbmNlIG9mIG9yZGVyIGlzIHRoYXQgYWRhcHRlcnMgKGFuZCBtZXRob2RzIHRoZXkKLQkJLy8gY2FsbCkKLQkJLy8gY2FuIGNvdW50IG9uIHRoZSBzdGF0ZSBvZiBtb2RlbCAiaXNDaGFuZ2luZyIgdG8gYmUgYWNjdXJhdGUuCi0JCS8vIEJ1dCwgcmVtZW1iZXIsIHRoYXQgdGhpcyBtZWFucyB0aGUgIm1vZGVsQ2hhbmdlZCIgZXZlbnQgY2FuIGJlCi0JCS8vIHJlY2VpdmVkIGJlZm9yZSBhbGwKLQkJLy8gYWRhcHRlcnMgaGF2ZSBmaW5pc2hlZCB0aGVpciBwcm9jZXNzaW5nLgotCQkvLyBOT1RFIE5PVEU6IFRoZSBhYm92ZSBub3RlIGlzIG9ic29sZXRlIGluIGZhY3QgKHRob3VnaCBzdGlsbCBzdGF0ZXMKLQkJLy8gaXNzdWUgY29ycmVjdGx5KS4KLQkJLy8gRHVlIHRvIHBvcHVsYXIgZGVtYW5kLCB0aGUgb3JkZXIgb2YgdGhlc2UgY2FsbHMgd2VyZSByZXZlcnNlZCBhbmQKLQkJLy8gYmVoYXZpb3IKLQkJLy8gY2hhbmdlZCBvbiAwNy8yMi8yMDA0LgotCQkvLyAKLQkJLy8gc2VlIGFsc28KLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTQzMDIKLQkJLy8gZm9yIG1vdGl2YXRpb24gZm9yIHRoaXMgJ29uIHZlcmdlIG9mJyBjYWxsLgotCQkvLyB0aGlzIGNvdWxkIGJlIGltcHJvdmVkIGluIGZ1dHVyZSBpZiBub3RpZmllciBhbHNvIHVzZWQgY291bnRpbmcKLQkJLy8gZmxhZyB0byBhdm9pZCBuZXN0ZWQgY2FsbHMuIElmL3doZW4gY2hhbmdlZCBiZSBzdXJlIHRvIGNoZWNrIGlmCi0JCS8vIGFib3V0VG9DaGFuZ2VNb2RlbCBuZWVkcyBhbnkgY2hhbmdlcyB0b28uCi0JCWlmIChpc01vZGVsQ2hhbmdlU3RhdGVPblZlcmdlT2ZFbmRpbmcoKSkgewotCQkJLy8gZW5kIGxvY2sgYmVmb3JlIG5vdGljaWF0aW9uIGxvb3AsIHNpbmNlIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkKLQkJCS8vIHdlIG1heSBiZSAiY2FsbGVkIGZyb20gZm9yaWVnbiBjb2RlIiBkdXJpbmcgbm90aWZpY2F0aW9uLgotCQkJZW5kTG9jaygpOwotCQkJLy8gd2UgbnVsbCBvdXQgaGVyZSB0byBhdm9pZCBzcHVyaW91cyJ3YXJuaW5nIiBtZXNzYWdlIHdoaWxlIGRlYnVnCi0JCQkvLyB0cmFjaW5nIGlzIGVuYWJsZWQKLQkJCWZMb2NrT2JqZWN0ID0gbnVsbDsKLQkJCS8vIHRoZSBub3RpZmllciBpcyB3aGF0IGNvbnRyb2xzIGFkYXBlciBub3RpZmljYXRpb24sIHdoaWNoCi0JCQkvLyBzaG91bGQgYmUgc2VudCBvdXQgYmVmb3JlIHRoZSAnbW9kZWxDaGFuZ2VkJyBldmVudC4KLQkJCWdldE1vZGVsTm90aWZpZXIoKS5lbmRDaGFuZ2luZygpOwotCQl9Ci0JCS8vIGNoYW5nZWRNb2RlbCBoYW5kbGVzICduZXN0aW5nJywgc28gb25seSBvbmUgZXZlbnQgc2VudCBvdXQKLQkJLy8gd2hlbiBtdWxpdHBsZSBjYWxscyB0byAnYWJvdXRUb0NoYW5nZS9DaGFuZ2VkJy4KLQkJc3VwZXIuY2hhbmdlZE1vZGVsKCk7Ci0JCWhhbmRsZVJlZnJlc2goKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY2hpbGRSZXBsYWNlZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIucmVwbGFjZUNoaWxkKHBhcmVudE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmNoaWxkUmVwbGFjZWQocGFyZW50Tm9kZSwgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGFuIFhNTCA8Y29kZT5Eb2N1bWVudDwvY29kZT4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZQotCSAqIHdpdGggaXRzIGRvY3VtZW50IGVsZW1lbnQuIEhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvCi0JICogaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotCSAqIAotCSAqIEBwYXJhbSBuYW1lc3BhY2VVUklUaGUKLQkgKiAgICAgICAgICAgIG5hbWVzcGFjZSBVUkkgb2YgdGhlIGRvY3VtZW50IGVsZW1lbnQgdG8gY3JlYXRlLgotCSAqIEBwYXJhbSBxdWFsaWZpZWROYW1lVGhlCi0JICogICAgICAgICAgICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudCB0byBiZSBjcmVhdGVkLgotCSAqIEBwYXJhbSBkb2N0eXBlVGhlCi0JICogICAgICAgICAgICB0eXBlIG9mIGRvY3VtZW50IHRvIGJlIGNyZWF0ZWQgb3IgPGNvZGU+bnVsbDwvY29kZT4uIFdoZW4KLQkgKiAgICAgICAgICAgIDxjb2RlPmRvY3R5cGU8L2NvZGU+IGlzIG5vdCA8Y29kZT5udWxsPC9jb2RlPiwgaXRzCi0JICogICAgICAgICAgICA8Y29kZT5Ob2RlLm93bmVyRG9jdW1lbnQ8L2NvZGU+IGF0dHJpYnV0ZSBpcyBzZXQgdG8gdGhlCi0JICogICAgICAgICAgICBkb2N1bWVudCBiZWluZyBjcmVhdGVkLgotCSAqIEByZXR1cm4gQSBuZXcgPGNvZGU+RG9jdW1lbnQ8L2NvZGU+IG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkCi0JICogICAgICAgICAgICAgICAgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBtYWxmb3JtZWQsIGlmIHRoZSA8Y29kZT5xdWFsaWZpZWROYW1lPC9jb2RlPiBoYXMgYQotCSAqICAgICAgICAgICAgICAgIHByZWZpeCBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiwgb3IgaWYgdGhlCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4gaGFzIGEgcHJlZml4IHRoYXQgaXMgInhtbCIKLQkgKiAgICAgICAgICAgICAgICBhbmQgdGhlIDxjb2RlPm5hbWVzcGFjZVVSSTwvY29kZT4gaXMgZGlmZmVyZW50IGZyb20gIgotCSAqICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgLjxicj4KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kb2N0eXBlPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gdXNlZCB3aXRoIGEgZGlmZmVyZW50IGRvY3VtZW50IG9yIHdhcwotCSAqICAgICAgICAgICAgICAgIGNyZWF0ZWQgZnJvbSBhIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KLQkgKiBAc2VlIERPTSBMZXZlbCAyCi0JICovCi0JcHVibGljIERvY3VtZW50IGNyZWF0ZURvY3VtZW50KFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBxdWFsaWZpZWROYW1lLCBEb2N1bWVudFR5cGUgZG9jdHlwZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gZW1wdHkgPGNvZGU+RG9jdW1lbnRUeXBlPC9jb2RlPiBub2RlLiBFbnRpdHkgZGVjbGFyYXRpb25zCi0JICogYW5kIG5vdGF0aW9ucyBhcmUgbm90IG1hZGUgYXZhaWxhYmxlLiBFbnRpdHkgcmVmZXJlbmNlIGV4cGFuc2lvbnMgYW5kCi0JICogZGVmYXVsdCBhdHRyaWJ1dGUgYWRkaXRpb25zIGRvIG5vdCBvY2N1ci4gSXQgaXMgZXhwZWN0ZWQgdGhhdCBhIGZ1dHVyZQotCSAqIHZlcnNpb24gb2YgdGhlIERPTSB3aWxsIHByb3ZpZGUgYSB3YXkgZm9yIHBvcHVsYXRpbmcgYQotCSAqIDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4uPGJyPgotCSAqIEhUTUwtb25seSBET00gaW1wbGVtZW50YXRpb25zIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4KLQkgKiAKLQkgKiBAcGFyYW0gcXVhbGlmaWVkTmFtZVRoZQotCSAqICAgICAgICAgICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRvY3VtZW50IHR5cGUgdG8gYmUgY3JlYXRlZC4KLQkgKiBAcGFyYW0gcHVibGljSWRUaGUKLQkgKiAgICAgICAgICAgIGV4dGVybmFsIHN1YnNldCBwdWJsaWMgaWRlbnRpZmllci4KLQkgKiBAcGFyYW0gc3lzdGVtSWRUaGUKLQkgKiAgICAgICAgICAgIGV4dGVybmFsIHN1YnNldCBzeXN0ZW0gaWRlbnRpZmllci4KLQkgKiBAcmV0dXJuIEEgbmV3IDxjb2RlPkRvY3VtZW50VHlwZTwvY29kZT4gbm9kZSB3aXRoCi0JICogICAgICAgICA8Y29kZT5Ob2RlLm93bmVyRG9jdW1lbnQ8L2NvZGU+IHNldCB0byA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfQ0hBUkFDVEVSX0VSUjogUmFpc2VkIGlmIHRoZSBzcGVjaWZpZWQgcXVhbGlmaWVkCi0JICogICAgICAgICAgICAgICAgbmFtZSBjb250YWlucyBhbiBpbGxlZ2FsIGNoYXJhY3Rlci4gPGJyPgotCSAqICAgICAgICAgICAgICAgIE5BTUVTUEFDRV9FUlI6IFJhaXNlZCBpZiB0aGUgPGNvZGU+cXVhbGlmaWVkTmFtZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBtYWxmb3JtZWQuCi0JICogQHNlZSBET00gTGV2ZWwgMgotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgY3JlYXRlRG9jdW1lbnRUeXBlKFN0cmluZyBxdWFsaWZpZWROYW1lLCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCURvY3VtZW50VHlwZUltcGwgZG9jdW1lbnRUeXBlID0gbmV3IERvY3VtZW50VHlwZUltcGwoKTsKLQkJZG9jdW1lbnRUeXBlLnNldE5hbWUocXVhbGlmaWVkTmFtZSk7Ci0JCWRvY3VtZW50VHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCWRvY3VtZW50VHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCXJldHVybiBkb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgZG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMucmVmcmVzaCkKLQkJCXJldHVybjsKLQkJLy8gdW5saWtlICdyZXNmcmVzaCcsICdyZWluaXRpYWxpemUnIGZpbmlzaGVzIGxvb3AKLQkJLy8gYW5kIGZsdXNoZXMgcmVtYWluaW5nIG5vdGlmaWNhdGlvbiBxdWUgYmVmb3JlCi0JCS8vIGFjdHVhbGx5IHJlaW5pdGlhbGl6aW5nLgotCQkvLyBJU1NVRTogc2hvdWxkIHJlaW5pdCBiZSB1c2VkIGluc3RlYWQgb2YgaGFuZGxlcmVmcmVzaD8KLQkJLy8gdGhpcy5zZXRSZWluaXRpYWxpemVOZWVkZWQodHJ1ZSk7Ci0JCWlmICh0aGlzLmFjdGl2ZSAhPSBudWxsIHx8IGdldE1vZGVsTm90aWZpZXIoKS5pc0NoYW5naW5nKCkpCi0JCQlyZXR1cm47IC8vIGRlZmVyCi0JCWhhbmRsZVJlZnJlc2goKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCWdldE1vZGVsTm90aWZpZXIoKS5lZGl0YWJsZUNoYW5nZWQobm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VFbmRUYWcoZWxlbWVudCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLmVuZFRhZ0NoYW5nZWQoZWxlbWVudCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFBhcnNlciBnZXRBY3RpdmVQYXJzZXIoKSB7Ci0JCWlmICh0aGlzLnBhcnNlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnBhcnNlciAhPSB0aGlzLmFjdGl2ZSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy5wYXJzZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFVwZGF0ZXIgZ2V0QWN0aXZlVXBkYXRlcigpIHsKLQkJaWYgKHRoaXMudXBkYXRlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLnVwZGF0ZXIgIT0gdGhpcy5hY3RpdmUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHRoaXMudXBkYXRlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChEb2N1bWVudC5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gZ2V0RG9jdW1lbnQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEFkYXB0ZXIoYWRhcHRlcik7Ci0JfQotCi0JLyoqCi0JICogZ2V0RG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBYTUxEb2N1bWVudAotCSAqLwotCXB1YmxpYyBJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJU291cmNlR2VuZXJhdG9yIGdldEdlbmVyYXRvcigpIHsKLQkJaWYgKHRoaXMuZ2VuZXJhdG9yID09IG51bGwpIHsKLQkJCXRoaXMuZ2VuZXJhdG9yID0gWE1MR2VuZXJhdG9ySW1wbC5nZXRJbnN0YW5jZSgpOwotCQl9Ci0JCXJldHVybiB0aGlzLmdlbmVyYXRvcjsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBJbmRleGVkUmVnaW9uIGdldEluZGV4ZWRSZWdpb24oaW50IG9mZnNldCkgewotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vIHNlYXJjaCBpbiBkb2N1bWVudCBjaGlsZHJlbgotCQlJRE9NTm9kZSBwYXJlbnQgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gdGhpcy5kb2N1bWVudC5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKG9mZnNldCAqIDIgPCBsZW5ndGgpIHsKLQkJCS8vIHNlYXJjaCBmcm9tIHRoZSBmaXJzdAotCQkJSURPTU5vZGUgY2hpbGQgPSAoSURPTU5vZGUpIHRoaXMuZG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKGNoaWxkICE9IG51bGwpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0RW5kT2Zmc2V0KCkgPD0gb2Zmc2V0KSB7Ci0JCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBjaGlsZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpIDw9IG9mZnNldCkKLQkJCQkJCXJldHVybiBjaGlsZDsKLQkJCQl9Ci0JCQkJLy8gZGlnIG1vcmUKLQkJCQlwYXJlbnQgPSBjaGlsZDsKLQkJCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHNlYXJjaCBmcm9tIHRoZSBsYXN0Ci0JCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgdGhpcy5kb2N1bWVudC5nZXRMYXN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQkJY2hpbGQgPSAoSURPTU5vZGUpIGNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpID4gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCkgPD0gb2Zmc2V0KQotCQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJCX0KLQkJCQkvLyBkaWcgbW9yZQotCQkJCXBhcmVudCA9IGNoaWxkOwotCQkJCWNoaWxkID0gKElET01Ob2RlKSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgWE1MTW9kZWxOb3RpZmllciBnZXRNb2RlbE5vdGlmaWVyKCkgewotCQlpZiAodGhpcy5ub3RpZmllciA9PSBudWxsKSB7Ci0JCQl0aGlzLm5vdGlmaWVyID0gbmV3IFhNTE1vZGVsTm90aWZpZXJJbXBsKCk7Ci0JCX0KLQkJcmV0dXJuIHRoaXMubm90aWZpZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBYTUxNb2RlbFBhcnNlciBnZXRNb2RlbFBhcnNlcigpIHsKLQkJaWYgKHRoaXMucGFyc2VyID09IG51bGwpIHsKLQkJCXRoaXMucGFyc2VyID0gY3JlYXRlTW9kZWxQYXJzZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy5wYXJzZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyIGNyZWF0ZU1vZGVsUGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsUGFyc2VyKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgWE1MTW9kZWxVcGRhdGVyIGdldE1vZGVsVXBkYXRlcigpIHsKLQkJaWYgKHRoaXMudXBkYXRlciA9PSBudWxsKSB7Ci0JCQl0aGlzLnVwZGF0ZXIgPSBjcmVhdGVNb2RlbFVwZGF0ZXIoKTsKLQkJfQotCQlyZXR1cm4gdGhpcy51cGRhdGVyOwotCX0KLQotCXByb3RlY3RlZCBYTUxNb2RlbFVwZGF0ZXIgY3JlYXRlTW9kZWxVcGRhdGVyKCkgewotCQlyZXR1cm4gbmV3IFhNTE1vZGVsVXBkYXRlcih0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgaGFuZGxlUmVmcmVzaCgpIHsKLQkJaWYgKCF0aGlzLnJlZnJlc2gpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZyh0cnVlKTsKLQkJWE1MTW9kZWxQYXJzZXIgcGFyc2VyID0gZ2V0TW9kZWxQYXJzZXIoKTsKLQkJc2V0QWN0aXZlKHBhcnNlcik7Ci0JCXRoaXMuZG9jdW1lbnQucmVtb3ZlQ2hpbGROb2RlcygpOwotCQl0cnkgewotCQkJcGFyc2VyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKGdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkxpc3QoKSwgbnVsbCk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCXRoaXMucmVmcmVzaCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGVzdCBpZiB0aGUgRE9NIGltcGxlbWVudGF0aW9uIGltcGxlbWVudHMgYSBzcGVjaWZpYyBmZWF0dXJlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlVGhlCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBmZWF0dXJlIHRvIHRlc3QgKGNhc2UtaW5zZW5zaXRpdmUpLiBUaGUgdmFsdWVzCi0JICogICAgICAgICAgICB1c2VkIGJ5IERPTSBmZWF0dXJlcyBhcmUgZGVmaW5lZCB0aHJvdWdob3V0IHRoZSBET00gTGV2ZWwgMgotCSAqICAgICAgICAgICAgc3BlY2lmaWNhdGlvbnMgYW5kIGxpc3RlZCBpbiB0aGUgc2VjdGlvbi4gVGhlIG5hbWUgbXVzdCBiZQotCSAqICAgICAgICAgICAgYW4gWE1MIG5hbWUuIFRvIGF2b2lkIHBvc3NpYmxlIGNvbmZsaWN0cywgYXMgYSBjb252ZW50aW9uLAotCSAqICAgICAgICAgICAgbmFtZXMgcmVmZXJyaW5nIHRvIGZlYXR1cmVzIGRlZmluZWQgb3V0c2lkZSB0aGUgRE9NCi0JICogICAgICAgICAgICBzcGVjaWZpY2F0aW9uIHNob3VsZCBiZSBtYWRlIHVuaXF1ZSBieSByZXZlcnNpbmcgdGhlIG5hbWUgb2YKLQkgKiAgICAgICAgICAgIHRoZSBJbnRlcm5ldCBkb21haW4gbmFtZSBvZiB0aGUgcGVyc29uIChvciB0aGUgb3JnYW5pemF0aW9uCi0JICogICAgICAgICAgICB0aGF0IHRoZSBwZXJzb24gYmVsb25ncyB0bykgd2hvIGRlZmluZXMgdGhlIGZlYXR1cmUsCi0JICogICAgICAgICAgICBjb21wb25lbnQgYnkgY29tcG9uZW50LCBhbmQgdXNpbmcgdGhpcyBhcyBhIHByZWZpeC4gRm9yCi0JICogICAgICAgICAgICBpbnN0YW5jZSwgdGhlIFczQyBTVkcgV29ya2luZyBHcm91cCBkZWZpbmVzIHRoZSBmZWF0dXJlCi0JICogICAgICAgICAgICAib3JnLnczYy5kb20uc3ZnIi4KLQkgKiBAcGFyYW0gdmVyc2lvblRoaXMKLQkgKiAgICAgICAgICAgIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LiBJbiBMZXZlbCAyLAotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyBjYW4gYmUgZWl0aGVyICIyLjAiIG9yICIxLjAiLiBJZiB0aGUgdmVyc2lvbiBpcwotCSAqICAgICAgICAgICAgbm90IHNwZWNpZmllZCwgc3VwcG9ydGluZyBhbnkgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBjYXVzZXMKLQkgKiAgICAgICAgICAgIHRoZSBtZXRob2QgdG8gcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+LgotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIGZlYXR1cmUgaXMgaW1wbGVtZW50ZWQgaW4gdGhlCi0JICogICAgICAgICBzcGVjaWZpZWQgdmVyc2lvbiwgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQlpZiAoZmVhdHVyZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodmVyc2lvbiAhPSBudWxsKSB7Ci0JCQlpZiAoIXZlcnNpb24uZXF1YWxzKCIxLjAiKSAmJiAhdmVyc2lvbi5lcXVhbHMoIjIuMCIpKSB7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChmZWF0dXJlLmVxdWFsc0lnbm9yZUNhc2UoIkNvcmUiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGZlYXR1cmUuZXF1YWxzSWdub3JlQ2FzZSgiWE1MIikpIC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiB0cnVlOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50Ci0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50IGludGVybmFsQ3JlYXRlRG9jdW1lbnQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IG5ldyBEb2N1bWVudEltcGwoKTsKLQkJZG9jdW1lbnQuc2V0TW9kZWwodGhpcyk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlib29sZWFuIGlzUmVwYXJzaW5nKCkgewotCQlyZXR1cm4gKGFjdGl2ZSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBuYW1lQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5hbWVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0QWN0aXZlUGFyc2VyKCkgPT0gbnVsbCkgewotCQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRNb2RlbFVwZGF0ZXIoKTsKLQkJCXNldEFjdGl2ZSh1cGRhdGVyKTsKLQkJCXVwZGF0ZXIuaW5pdGlhbGl6ZSgpOwotCQkJdXBkYXRlci5jaGFuZ2VOYW1lKG5vZGUpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCS8vIG5vdGlmaWNhdGlvbiBpcyBhbHJlYWR5IHNlbnQKLQl9Ci0KLQkvKioKLQkgKiBuZXdNb2RlbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBuZXdNb2RlbChOZXdEb2N1bWVudEV2ZW50IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50KSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWREb2N1bWVudEV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCS8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4sIGJ1dCBmb3IgdGhlIGNhc2UKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50ICE9IHN0cnVjdHVyZWREb2N1bWVudCkKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCi0JCWludGVybmFsU2V0TmV3RG9jdW1lbnQoc3RydWN0dXJlZERvY3VtZW50KTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgaW50ZXJuYWxTZXROZXdEb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCkgewotCQlpZiAoc3RydWN0dXJlZERvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0IGZsYXROb2RlcyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25MaXN0KCk7Ci0JCWlmICgoZmxhdE5vZGVzID09IG51bGwpIHx8IChmbGF0Tm9kZXMuZ2V0TGVuZ3RoKCkgPT0gMCkpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAodGhpcy5kb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBiZWluZyBjb25zdHJ1Y3RlZAotCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldEFjdGl2ZVVwZGF0ZXIoKTsKLQkJaWYgKHVwZGF0ZXIgIT0gbnVsbCkgeyAvLyBiZWluZyB1cGRhdGVkCi0JCQl0cnkgewotCQkJCXVwZGF0ZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIC8vIGZvciBuZXcgbW9kZWwsIHdlIG1pZ2h0IG5lZWQgdG8KLQkJCS8vIC8vIHJlLWluaXQsIGUuZy4gaWYgc29tZW9uZSBjYWxscyBzZXRUZXh0Ci0JCQkvLyAvLyBvbiBhbiBleGlzdGluZyBtb2RlbAotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCQlYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyID0gZ2V0TW9kZWxOb3RpZmllcigpOwotCQlib29sZWFuIGlzQ2hhbmdpbmcgPSBub3RpZmllci5pc0NoYW5naW5nKCk7Ci0JCS8vIGNhbGwgZXZlbiBpZiBjaGFuZ2luZyB0byBub3RpZnkgZG9pbmcgbmV3IG1vZGVsCi0JCWdldE1vZGVsTm90aWZpZXIoKS5iZWdpbkNoYW5naW5nKHRydWUpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdGhpcy5kb2N1bWVudC5yZW1vdmVDaGlsZE5vZGVzKCk7Ci0JCXRyeSB7Ci0JCQlwYXJzZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoZmxhdE5vZGVzLCBudWxsKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCS8vIG1lYW5pbmdsZXNzIHRvIHJlZnJlc2gsIGJlY2F1c2UgdGhlIHJlc3VsdCBtaWdodCBiZSB0aGUgc2FtZQotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJZ2V0TW9kZWxOb3RpZmllcigpLmVuZENoYW5naW5nKCk7Ci0JCQl9Ci0JCQkvLyBpZ25vcmUgcmVmcmVzaAotCQkJdGhpcy5yZWZyZXNoID0gZmFsc2U7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub0NoYW5nZShOb0NoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCS8vIGNsZWFudXAgdXBkYXRlciBzdGFmZnMKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhudWxsLCBudWxsKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIEkgZ3Vlc3Mgbm8gY2hhbmFnZSBtZWFucyB0aGUgbW9kZWwgY291bGQgbm90IG5lZWQgcmUtaW5pdAotCQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQkJCXJldHVybjsKLQkJfQotCX0KLQotCS8qKgotCSAqIG5vZGVzUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIHZvaWQgbm9kZXNSZXBsYWNlZChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zUmVwbGFjZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyA9IGV2ZW50LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJCWlmIChleC5nZXRDbGFzcygpLmVxdWFscyhTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmNsYXNzKSkgewotCQkJCQlMb2dnZXIudHJhY2VFeGNlcHRpb24oVFJBQ0VfUEFSU0VSX01BTkFHRU1FTlRfRVhDRVBUSU9OLCBleCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl9Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQloYW5kbGVSZWZyZXNoKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpIHsKLQkJCQlub3RpZmllci5lbmRDaGFuZ2luZygpOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogcmVnaW9uQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50RXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25DaGFuZ2VkKFJlZ2lvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGV2ZW50LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gZXZlbnQuZ2V0UmVnaW9uKCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJWE1MTW9kZWxVcGRhdGVyIHVwZGF0ZXIgPSBnZXRBY3RpdmVVcGRhdGVyKCk7Ci0JCWlmICh1cGRhdGVyICE9IG51bGwpIHsgLy8gYmVpbmcgdXBkYXRlZAotCQkJdHJ5IHsKLQkJCQl1cGRhdGVyLmNoYW5nZVJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZXgpIHsKLQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCXNldEFjdGl2ZShudWxsKTsKLQkJCX0KLQkJCS8vIGNoZWNrRm9yUmVpbml0KCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJWE1MTW9kZWxOb3RpZmllciBub3RpZmllciA9IGdldE1vZGVsTm90aWZpZXIoKTsKLQkJYm9vbGVhbiBpc0NoYW5naW5nID0gbm90aWZpZXIuaXNDaGFuZ2luZygpOwotCQlpZiAoIWlzQ2hhbmdpbmcpCi0JCQlub3RpZmllci5iZWdpbkNoYW5naW5nKCk7Ci0JCVhNTE1vZGVsUGFyc2VyIHBhcnNlciA9IGdldE1vZGVsUGFyc2VyKCk7Ci0JCXNldEFjdGl2ZShwYXJzZXIpOwotCQl0cnkgewotCQkJcGFyc2VyLmNoYW5nZVJlZ2lvbihmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGV4KTsKLQkJCXRoaXMucmVmcmVzaCA9IHRydWU7Ci0JCQloYW5kbGVSZWZyZXNoKCk7Ci0JCX0KLQkJZmluYWxseSB7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQlpZiAoIWlzQ2hhbmdpbmcpIHsKLQkJCQlub3RpZmllci5lbmRDaGFuZ2luZygpOwotCQkJCWhhbmRsZVJlZnJlc2goKTsKLQkJCX0KLQkJfQotCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCX0KLQotCS8qKgotCSAqIHJlZ2lvbnNSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZXZlbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWdpb25zUmVwbGFjZWQoUmVnaW9uc1JlcGxhY2VkRXZlbnQgZXZlbnQpIHsKLQkJaWYgKGV2ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBldmVudC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zID0gZXZlbnQuZ2V0T2xkUmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucyA9IGV2ZW50LmdldE5ld1JlZ2lvbnMoKTsKLQkJaWYgKG9sZFJlZ2lvbnMgPT0gbnVsbCAmJiBuZXdSZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0QWN0aXZlVXBkYXRlcigpOwotCQlpZiAodXBkYXRlciAhPSBudWxsKSB7IC8vIGJlaW5nIHVwZGF0ZWQKLQkJCXRyeSB7Ci0JCQkJdXBkYXRlci5yZXBsYWNlUmVnaW9ucyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0JCQl9Ci0JCQljYXRjaCAoRXhjZXB0aW9uIGV4KSB7Ci0JCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQkJdGhpcy5yZWZyZXNoID0gdHJ1ZTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlzZXRBY3RpdmUobnVsbCk7Ci0JCQl9Ci0JCQkvLyBjaGVja0ZvclJlaW5pdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0JCVhNTE1vZGVsTm90aWZpZXIgbm90aWZpZXIgPSBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0JCWJvb2xlYW4gaXNDaGFuZ2luZyA9IG5vdGlmaWVyLmlzQ2hhbmdpbmcoKTsKLQkJaWYgKCFpc0NoYW5naW5nKQotCQkJbm90aWZpZXIuYmVnaW5DaGFuZ2luZygpOwotCQlYTUxNb2RlbFBhcnNlciBwYXJzZXIgPSBnZXRNb2RlbFBhcnNlcigpOwotCQlzZXRBY3RpdmUocGFyc2VyKTsKLQkJdHJ5IHsKLQkJCXBhcnNlci5yZXBsYWNlUmVnaW9ucyhmbGF0Tm9kZSwgbmV3UmVnaW9ucywgb2xkUmVnaW9ucyk7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBleCkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihleCk7Ci0JCQl0aGlzLnJlZnJlc2ggPSB0cnVlOwotCQkJaGFuZGxlUmVmcmVzaCgpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJc2V0QWN0aXZlKG51bGwpOwotCQkJaWYgKCFpc0NoYW5naW5nKSB7Ci0JCQkJbm90aWZpZXIuZW5kQ2hhbmdpbmcoKTsKLQkJCQloYW5kbGVSZWZyZXNoKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gY2hlY2tGb3JSZWluaXQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlRnJvbUVkaXQoKSB7Ci0JCWlmICghaXNTaGFyZWQoKSkgewotCQkJLy8gdGhpcy5kb2N1bWVudC5yZWxlYXNlU3R5bGVTaGVldHMoKTsKLQkJCS8vIHRoaXMuZG9jdW1lbnQucmVsZWFzZURvY3VtZW50VHlwZSgpOwotCQl9Ci0JCXN1cGVyLnJlbGVhc2VGcm9tRWRpdCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2VGcm9tUmVhZCgpIHsKLQkJaWYgKCFpc1NoYXJlZCgpKSB7Ci0JCQkvLyB0aGlzLmRvY3VtZW50LnJlbGVhc2VTdHlsZVNoZWV0cygpOwotCQkJLy8gdGhpcy5kb2N1bWVudC5yZWxlYXNlRG9jdW1lbnRUeXBlKCk7Ci0JCX0KLQkJc3VwZXIucmVsZWFzZUZyb21SZWFkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEFjdGl2ZShPYmplY3QgYWN0aXZlKSB7Ci0JCXRoaXMuYWN0aXZlID0gYWN0aXZlOwotCQkvLyBzaWRlIGVmZmVjdAotCQkvLyB3aGVuIGV2ZXIgYmVjb21lcyBhY3RpdmUsIGJlc3VyZSB0YWdOYW1lQ2FjaGUgaXMgY2xlYXJlZAotCQkvLyAoYW5kIG5vdCB1c2VkKQotCQlpZiAoYWN0aXZlID09IG51bGwpIHsKLQkJCWRvY3VtZW50LmFjdGl2YXRlVGFnTmFtZUNhY2hlKHRydWUpOwotCQl9Ci0JCWVsc2UgewotCQkJZG9jdW1lbnQuYWN0aXZhdGVUYWdOYW1lQ2FjaGUoZmFsc2UpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRHZW5lcmF0b3IoSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IpIHsKLQkJdGhpcy5nZW5lcmF0b3IgPSBnZW5lcmF0b3I7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxOb3RpZmllcihYTUxNb2RlbE5vdGlmaWVyIG5vdGlmaWVyKSB7Ci0JCXRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbFBhcnNlcihYTUxNb2RlbFBhcnNlciBwYXJzZXIpIHsKLQkJdGhpcy5wYXJzZXIgPSBwYXJzZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0TW9kZWxVcGRhdGVyKFhNTE1vZGVsVXBkYXRlciB1cGRhdGVyKSB7Ci0JCXRoaXMudXBkYXRlciA9IHVwZGF0ZXI7Ci0JfQotCi0JLyoqCi0JICogc2V0U3RydWN0dXJlZERvY3VtZW50IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQgPSBzdXBlci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnQpCi0JCQlyZXR1cm47IC8vIG5vdGhpbmcgdG8gZG8KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudCAhPSBudWxsKQotCQkJb2xkU3RydWN0dXJlZERvY3VtZW50LnJlbW92ZURvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuc2V0U3RydWN0dXJlZERvY3VtZW50KHN0cnVjdHVyZWREb2N1bWVudCk7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJaW50ZXJuYWxTZXROZXdEb2N1bWVudChzdHJ1Y3R1cmVkRG9jdW1lbnQpOwotCQkJc3RydWN0dXJlZERvY3VtZW50LmFkZERvY3VtZW50Q2hhbmdpbmdMaXN0ZW5lcih0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHN0YXJ0VGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldEFjdGl2ZVBhcnNlcigpID09IG51bGwpIHsKLQkJCVhNTE1vZGVsVXBkYXRlciB1cGRhdGVyID0gZ2V0TW9kZWxVcGRhdGVyKCk7Ci0JCQlzZXRBY3RpdmUodXBkYXRlcik7Ci0JCQl1cGRhdGVyLmluaXRpYWxpemUoKTsKLQkJCXVwZGF0ZXIuY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlzZXRBY3RpdmUobnVsbCk7Ci0JCX0KLQkJZ2V0TW9kZWxOb3RpZmllcigpLnN0YXJ0VGFnQ2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiB2YWx1ZUNoYW5nZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCB2YWx1ZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRBY3RpdmVQYXJzZXIoKSA9PSBudWxsKSB7Ci0JCQlYTUxNb2RlbFVwZGF0ZXIgdXBkYXRlciA9IGdldE1vZGVsVXBkYXRlcigpOwotCQkJc2V0QWN0aXZlKHVwZGF0ZXIpOwotCQkJdXBkYXRlci5pbml0aWFsaXplKCk7Ci0JCQl1cGRhdGVyLmNoYW5nZVZhbHVlKG5vZGUpOwotCQkJc2V0QWN0aXZlKG51bGwpOwotCQl9Ci0JCWdldE1vZGVsTm90aWZpZXIoKS52YWx1ZUNoYW5nZWQobm9kZSk7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIDMuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbikgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RnJhZ21lbnRJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50RnJhZ21lbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OGRkODYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEZyYWdtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRGcmFnbWVudEltcGwgZXh0ZW5kcyBOb2RlQ29udGFpbmVyIGltcGxlbWVudHMgRG9jdW1lbnRGcmFnbWVudCB7Ci0KLQkvKioKLQkgKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEZyYWdtZW50SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBEb2N1bWVudEZyYWdtZW50SW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50SW1wbAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudEZyYWdtZW50SW1wbChEb2N1bWVudEZyYWdtZW50SW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJRG9jdW1lbnRGcmFnbWVudEltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50RnJhZ21lbnRJbXBsKHRoaXMpOwotCQlpZiAoZGVlcCkKLQkJCWNsb25lQ2hpbGROb2RlcyhjbG9uZWQsIGRlZXApOwotCQkKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjZG9jdW1lbnQtZnJhZ21lbnQiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRE9DVU1FTlRfRlJBR01FTlRfTk9ERTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0MGU4My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vLyBmb3Igb3JnLmFwYWNoZS54ZXJjZXMgMy4yLjEKLS8vIGltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlscy5YTUxDaGFyYWN0ZXJQcm9wZXJ0aWVzOwotLy8gRE1XIG1vZGlmaWVkIGZvciBYTUw0SiA0LjAuMQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy5kb20uVHJlZVdhbGtlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSU1vZGVsSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTENoYXJFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLk5hbWVWYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuRG9jdW1lbnRSYW5nZTsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLkRvY3VtZW50VHJhdmVyc2FsOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlRmlsdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLnRyYXZlcnNhbC5Ob2RlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLlRyZWVXYWxrZXI7Ci0KLQotLyoqCi0gKiBEb2N1bWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIERvY3VtZW50SW1wbCBleHRlbmRzIE5vZGVDb250YWluZXIgaW1wbGVtZW50cyBJRE9NRG9jdW1lbnQsIERvY3VtZW50UmFuZ2UsIERvY3VtZW50VHJhdmVyc2FsIHsKLQotCXByaXZhdGUgc3RhdGljIGludCBtYXhEb2NUeXBlU2VhcmNoID0gNTAwOwotCXByaXZhdGUgc3RhdGljIGludCBub01heFNlYXJjaCA9IC0xOwotCS8qKgotCSAqIEludGVybmFsLXVzZSBvbmx5IGNsYXNzLiBUaGlzIGNsYXNzIHdhcyBhZGRlZCB0byBiZXR0ZXIgYWJsZSB0byBoYW5kbGUKLQkgKiByZXBldGV0aXZlIHJlcXVlc3QgZm9yIGdldEVsZW1lbnRzQnlUYWdOYW1lLiBUaGUgY2FjaGUgaXMgY2xlYXJlZCB3aGVuCi0JICogZXZlciB0aGUgZG9jdW1lbnQgY2hhbmdlcyBhdCBhbGwsIHNvIHN0aWxsIG5vdCByZWFsIGVmZmljaWVudCwKLQkgKi8KLQljbGFzcyBUYWdOYW1lQ2FjaGUgewotCi0JCXByaXZhdGUgYm9vbGVhbiBhY3RpdmUgPSB0cnVlOwotCi0JCXByaXZhdGUgTWFwIGNhY2hlOwotCi0JCXB1YmxpYyBUYWdOYW1lQ2FjaGUoKSB7Ci0JCQlzdXBlcigpOwotCQkJY2FjaGUgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIEBwYXJhbSBiCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZShib29sZWFuIGIpIHsKLQkJCWFjdGl2ZSA9IGI7Ci0JCQlpZiAoIWIpCi0JCQkJY2xlYXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZEl0ZW0oU3RyaW5nIHRhZ25hbWUsIE5vZGVMaXN0SW1wbCBub2RlbGlzdCkgewotCQkJaWYgKHRhZ25hbWUgPT0gbnVsbCB8fCBub2RlbGlzdCA9PSBudWxsKQotCQkJCXJldHVybjsKLQkJCWNhY2hlLnB1dCh0YWduYW1lLCBub2RlbGlzdCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjbGVhcigpIHsKLQkJCWNhY2hlLmNsZWFyKCk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZUxpc3RJbXBsIGdldEl0ZW0oU3RyaW5nIHRhZ05hbWUpIHsKLQkJCU5vZGVMaXN0SW1wbCByZXN1bHQgPSBudWxsOwotCQkJaWYgKGFjdGl2ZSkgewotCQkJCXJlc3VsdCA9IChOb2RlTGlzdEltcGwpIGNhY2hlLmdldCh0YWdOYW1lKTsKLQkJCQkvLyBpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImdldEVsZW1lbnRzQnlUYWduYW1lIGZyb20gY2FjaGU6ICIgKwotCQkJCS8vIHRhZ05hbWUpOwotCQkJCS8vIH0KLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQotCX0KLQotCS8vIHRoaXMgaXMgYSBjb25zdGFudCBqdXN0IHRvIGdpdmUgY29tcGlsZS10aW1lIGNvbnRyb2wgb3ZlcgotCS8vIHdoZXRoZXIgb3Igbm90IHRvIHVzZSB0aGUgY2FjaGUuIElmLCBpbiBmdXR1cmUsIGl0cyBmb3VuZCB0aGF0Ci0JLy8gdGhlcmUgYXJlIG5vIChvciBmZXcpICJkdXBsaWNhdGUgcmVxdWVzdHMiIC4uLiB0aGVuIHRoaXMgY2FjaGUKLQkvLyBpcyBub3QgbmVlZGVkLgotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gdXNldGFnbmFtZWNhY2hlID0gdHJ1ZTsKLQotCS8vIHByaXZhdGUgRG9jdW1lbnRUeXBlQWRhcHRlciBkb2N1bWVudFR5cGVBZGFwdGVyID0gbnVsbDsKLQotCXByaXZhdGUgRE9NTW9kZWxJbXBsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIFRhZ05hbWVDYWNoZSB0YWdOYW1lQ2FjaGU7Ci0KLQkvKioKLQkgKiBEb2N1bWVudEltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRG9jdW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCQlpZiAodXNldGFnbmFtZWNhY2hlKSB7Ci0JCQl0YWdOYW1lQ2FjaGUgPSBuZXcgVGFnTmFtZUNhY2hlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBEb2N1bWVudEltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRG9jdW1lbnRJbXBsCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50SW1wbChEb2N1bWVudEltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQkJaWYgKHVzZXRhZ25hbWVjYWNoZSkgewotCQkJdGFnTmFtZUNhY2hlID0gbmV3IFRhZ05hbWVDYWNoZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIGIKLQkgKi8KLQl2b2lkIGFjdGl2YXRlVGFnTmFtZUNhY2hlKGJvb2xlYW4gYikgewotCQl0YWdOYW1lQ2FjaGUuYWN0aXZhdGUoYik7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIENoYW5nZXMgdGhlIDxjb2RlPm93bmVyRG9jdW1lbnQ8L2NvZGU+IG9mIGEgbm9kZSwgaXRzIGNoaWxkcmVuLCBhcwotCSAqIHdlbGwgYXMgdGhlIGF0dGFjaGVkIGF0dHJpYnV0ZSBub2RlcyBpZiB0aGVyZSBhcmUgYW55LiBJZiB0aGUgbm9kZSBoYXMKLQkgKiBhIHBhcmVudCBpdCBpcyBmaXJzdCByZW1vdmVkIGZyb20gaXRzIHBhcmVudCBjaGlsZCBsaXN0LiBUaGlzCi0JICogZWZmZWN0aXZlbHkgYWxsb3dzIG1vdmluZyBhIHN1YnRyZWUgZnJvbSBvbmUgZG9jdW1lbnQgdG8gYW5vdGhlci4gVGhlCi0JICogZm9sbG93aW5nIGxpc3QgZGVzY3JpYmVzIHRoZSBzcGVjaWZpY3MgZm9yIGVhY2ggdHlwZSBvZiBub2RlLgotCSAqIDxkbD4KLQkgKiA8ZHQ+QVRUUklCVVRFX05PREU8L2R0PgotCSAqIDxkZD5UaGUgPGNvZGU+b3duZXJFbGVtZW50PC9jb2RlPiBhdHRyaWJ1dGUgaXMgc2V0IHRvCi0JICogPGNvZGU+bnVsbDwvY29kZT4gYW5kIHRoZSA8Y29kZT5zcGVjaWZpZWQ8L2NvZGU+IGZsYWcgaXMgc2V0IHRvCi0JICogPGNvZGU+dHJ1ZTwvY29kZT4gb24gdGhlIGFkb3B0ZWQgPGNvZGU+QXR0cjwvY29kZT4uIFRoZQotCSAqIGRlc2NlbmRhbnRzIG9mIHRoZSBzb3VyY2UgPGNvZGU+QXR0cjwvY29kZT4gYXJlIHJlY3Vyc2l2ZWx5IGFkb3B0ZWQuCi0JICogPC9kZD4KLQkgKiA8ZHQ+RE9DVU1FTlRfRlJBR01FTlRfTk9ERTwvZHQ+Ci0JICogPGRkPlRoZSBkZXNjZW5kYW50cyBvZiB0aGUgc291cmNlIG5vZGUgYXJlIHJlY3Vyc2l2ZWx5IGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RE9DVU1FTlRfTk9ERTwvZHQ+Ci0JICogPGRkPjxjb2RlPkRvY3VtZW50PC9jb2RlPiBub2RlcyBjYW5ub3QgYmUgYWRvcHRlZC48L2RkPgotCSAqIDxkdD5ET0NVTUVOVF9UWVBFX05PREU8L2R0PgotCSAqIDxkZD48Y29kZT5Eb2N1bWVudFR5cGU8L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkVMRU1FTlRfTk9ERTwvZHQ+Ci0JICogPGRkPlNwZWNpZmllZCBhdHRyaWJ1dGUgbm9kZXMgb2YgdGhlIHNvdXJjZSBlbGVtZW50IGFyZSBhZG9wdGVkLCBhbmQKLQkgKiB0aGUgZ2VuZXJhdGVkIDxjb2RlPkF0dHI8L2NvZGU+IG5vZGVzLiBEZWZhdWx0IGF0dHJpYnV0ZXMgYXJlCi0JICogZGlzY2FyZGVkLCB0aG91Z2ggaWYgdGhlIGRvY3VtZW50IGJlaW5nIGFkb3B0ZWQgaW50byBkZWZpbmVzIGRlZmF1bHQKLQkgKiBhdHRyaWJ1dGVzIGZvciB0aGlzIGVsZW1lbnQgbmFtZSwgdGhvc2UgYXJlIGFzc2lnbmVkLiBUaGUgZGVzY2VuZGFudHMKLQkgKiBvZiB0aGUgc291cmNlIGVsZW1lbnQgYXJlIHJlY3Vyc2l2ZWx5IGFkb3B0ZWQuPC9kZD4KLQkgKiA8ZHQ+RU5USVRZX05PREU8L2R0PgotCSAqIDxkZD48Y29kZT5FbnRpdHk8L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PkVOVElUWV9SRUZFUkVOQ0VfTk9ERTwvZHQ+Ci0JICogPGRkPk9ubHkgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gbm9kZSBpdHNlbGYgaXMgYWRvcHRlZCwKLQkgKiB0aGUgZGVzY2VuZGFudHMgYXJlIGRpc2NhcmRlZCwgc2luY2UgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLQkgKiBkb2N1bWVudHMgbWlnaHQgaGF2ZSBkZWZpbmVkIHRoZSBlbnRpdHkgZGlmZmVyZW50bHkuIElmIHRoZSBkb2N1bWVudAotCSAqIGJlaW5nIGltcG9ydGVkIGludG8gcHJvdmlkZXMgYSBkZWZpbml0aW9uIGZvciB0aGlzIGVudGl0eSBuYW1lLCBpdHMKLQkgKiB2YWx1ZSBpcyBhc3NpZ25lZC48L2RkPgotCSAqIDxkdD5OT1RBVElPTl9OT0RFPC9kdD4KLQkgKiA8ZGQ+PGNvZGU+Tm90YXRpb248L2NvZGU+IG5vZGVzIGNhbm5vdCBiZSBhZG9wdGVkLjwvZGQ+Ci0JICogPGR0PlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSwgVEVYVF9OT0RFLCBDREFUQV9TRUNUSU9OX05PREUsCi0JICogQ09NTUVOVF9OT0RFPC9kdD4KLQkgKiA8ZGQ+VGhlc2Ugbm9kZXMgY2FuIGFsbCBiZSBhZG9wdGVkLiBObyBzcGVjaWZpY3MuPC9kZD4KLQkgKiBTaG91bGQgdGhpcyBtZXRob2Qgc2ltcGx5IHJldHVybiBudWxsIHdoZW4gaXQgZmFpbHM/IEhvdyAiZXhjZXB0aW9uYWwiCi0JICogaXMgZmFpbHVyZSBmb3IgdGhpcyBtZXRob2Q/U3RpY2sgd2l0aCByYWlzaW5nIGV4Y2VwdGlvbnMgb25seSBpbgotCSAqIGV4Y2VwdGlvbmFsIGNpcmN1bXN0YW5jZXMsIHJldHVybiBudWxsIG9uIGZhaWx1cmUgKEYyRiAxOSBKdW4gMjAwMCkuQ2FuCi0JICogYW4gZW50aXR5IG5vZGUgcmVhbGx5IGJlIGFkb3B0ZWQ/Tm8sIG5laXRoZXIgY2FuIE5vdGF0aW9uIG5vZGVzIChUZWxjb24KLQkgKiAxMyBEZWMgMjAwMCkuRG9lcyB0aGlzIGFmZmVjdCBrZXlzIGFuZCBoYXNoQ29kZSdzIG9mIHRoZSBhZG9wdGVkCi0JICogc3VidHJlZSBub2Rlcz9JZiBzbywgd2hhdCBhYm91dCByZWFkb25seS1uZXNzIG9mIGtleSBhbmQgaGFzaENvZGU/aWYKLQkgKiBub3QsIHdvdWxkIGFwcGVuZENoaWxkIGFmZmVjdCBrZXlzL2hhc2hDb2RlcyBvciB3b3VsZCBpdCBnZW5lcmF0ZQotCSAqIGV4Y2VwdGlvbnMgaWYga2V5J3MgYXJlIGR1cGxpY2F0ZT8gVXBkYXRlOiBIYXNoY29kZXMgaGF2ZSBiZWVuIGRyb3BwZWQuCi0JICogR2l2ZW4gdGhhdCB0aGUga2V5IGlzIG9ubHkgdW5pcXVlIHdpdGhpbiBhIGRvY3VtZW50IGFuIGFkb3B0ZWQgbm9kZQotCSAqIG5lZWRzIHRvIGJlIGdpdmVuIGEgbmV3IGtleSwgYnV0IHdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgYXBwbGljYXRpb24/Ci0JICogCi0JICogVE9ETzogTmVlZHMgdG8gbm90aWZ5IFVzZXJEYXRhSGFuZGxlcnMgZm9yIHRoZSBub2RlIGlmIGFueQotCSAqIAotCSAqIEBwYXJhbSBzb3VyY2UKLQkgKiAgICAgICAgICAgIFRoZSBub2RlIHRvIG1vdmUgaW50byB0aGlzIGRvY3VtZW50LgotCSAqIEByZXR1cm4gVGhlIGFkb3B0ZWQgbm9kZSwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhpcyBvcGVyYXRpb24KLQkgKiAgICAgICAgIGZhaWxzLCBzdWNoIGFzIHdoZW4gdGhlIHNvdXJjZSBub2RlIGNvbWVzIGZyb20gYSBkaWZmZXJlbnQKLQkgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9UX1NVUFBPUlRFRF9FUlI6IFJhaXNlZCBpZiB0aGUgc291cmNlIG5vZGUgaXMgb2YgdHlwZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPkRPQ1VNRU5UPC9jb2RlPiw8Y29kZT5ET0NVTUVOVF9UWVBFPC9jb2RlPi4KLQkgKiAgICAgICAgICAgICAgICA8YnI+Ci0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgd2hlbiB0aGUgc291cmNlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICBpcyByZWFkb25seS4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGUgYWRvcHROb2RlKG9yZy53M2MuZG9tLk5vZGUgc291cmNlKSB0aHJvd3Mgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjaGVja1RhZ05hbWVWYWxpZGl0eShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAoIWlzVmFsaWROYW1lKHRhZ05hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0NIQVJBQ1RFUl9FUlIsIGNyZWF0ZURPTUV4Y2VwdGlvbk1lc3NhZ2UoRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgdGFnTmFtZSkpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlEb2N1bWVudEltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50SW1wbCh0aGlzKTsKLQkJaWYgKGRlZXApCi0JCQljbG9uZWQuaW1wb3J0Q2hpbGROb2Rlcyh0aGlzLCB0cnVlKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlBdHRySW1wbCBhdHRyID0gbmV3IEF0dHJJbXBsKCk7Ci0JCWF0dHIuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gYXR0cjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciBjcmVhdGVBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCUF0dHJJbXBsIGF0dHIgPSBuZXcgQXR0ckltcGwoKTsKLQkJYXR0ci5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlhdHRyLnNldE5hbWUobmFtZSk7Ci0JCWF0dHIuc2V0TmFtZXNwYWNlVVJJKHVyaSk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbgotCSAqIEBwYXJhbSBkYXRhCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIENEQVRBU2VjdGlvbiBjcmVhdGVDREFUQVNlY3Rpb24oU3RyaW5nIGRhdGEpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBhbGxvdyBDREFUQSBzZWN0aW9uCi0JCS8vIGlmICghaXNYTUxUeXBlKCkpIHsKLQkJLy8gdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsIG5ldwotCQkvLyBTdHJpbmcoKSk7Ci0JCS8vIH0KLQkJQ0RBVEFTZWN0aW9uSW1wbCBjZGF0YSA9IG5ldyBDREFUQVNlY3Rpb25JbXBsKCk7Ci0JCWNkYXRhLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQljZGF0YS5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY2RhdGE7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkNvbW1lbnQKLQkgKiBAcGFyYW0gZGF0YQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBDb21tZW50IGNyZWF0ZUNvbW1lbnQoU3RyaW5nIGRhdGEpIHsKLQkJQ29tbWVudEltcGwgY29tbWVudCA9IG5ldyBDb21tZW50SW1wbCgpOwotCQljb21tZW50LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWlmIChkYXRhICE9IG51bGwpCi0JCQljb21tZW50LnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBjb21tZW50OwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KFN0cmluZyB0YWdOYW1lLCBib29sZWFuIGlzSlNQVGFnKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJRWxlbWVudCByZXN1bHQgPSBudWxsOwotCQlpZiAoIWlzSlNQVHlwZSgpICYmIGlzSlNQVGFnKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKLQkJZWxlbWVudC5zZXRKU1BUYWcoaXNKU1BUYWcpOwotCQlDb21tZW50RWxlbWVudFJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gQ29tbWVudEVsZW1lbnRSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOwotCQlpZiAocmVnaXN0cnkuc2V0dXBDb21tZW50RWxlbWVudChlbGVtZW50KSkgewotCQkJcmVzdWx0ID0gZWxlbWVudDsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZURvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgY3JlYXRlRG9jdHlwZShTdHJpbmcgbmFtZSkgewotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSBuZXcgRG9jdW1lbnRUeXBlSW1wbCgpOwotCQlkb2NUeXBlLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWRvY1R5cGUuc2V0TmFtZShuYW1lKTsKLQkJcmV0dXJuIGRvY1R5cGU7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRG9jdW1lbnRGcmFnbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjcmVhdGVEb2N1bWVudEZyYWdtZW50KCkgewotCQlEb2N1bWVudEZyYWdtZW50SW1wbCBmcmFnbWVudCA9IG5ldyBEb2N1bWVudEZyYWdtZW50SW1wbCgpOwotCQlmcmFnbWVudC5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlyZXR1cm4gZnJhZ21lbnQ7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUVsZW1lbnQoU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQljaGVja1RhZ05hbWVWYWxpZGl0eSh0YWdOYW1lKTsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbmV3IEVsZW1lbnRJbXBsKCk7Ci0JCWVsZW1lbnQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJZWxlbWVudC5zZXRUYWdOYW1lKHRhZ05hbWUpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVFbGVtZW50TlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzVmFsaWROYW1lKHRhZ05hbWUpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlZBTElEX0NIQVJBQ1RFUl9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBjcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQllbGVtZW50LnNldE5hbWVzcGFjZVVSSSh1cmkpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVFbnRpdHkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5FbnRpdHkKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBFbnRpdHkgY3JlYXRlRW50aXR5KFN0cmluZyBuYW1lKSB7Ci0JCUVudGl0eUltcGwgZW50aXR5ID0gbmV3IEVudGl0eUltcGwoKTsKLQkJZW50aXR5LnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCWVudGl0eS5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gZW50aXR5OwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZUVudGl0eVJlZmVyZW5jZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZQotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIEVudGl0eVJlZmVyZW5jZSBjcmVhdGVFbnRpdHlSZWZlcmVuY2UoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzWE1MVHlwZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUVudGl0eVJlZmVyZW5jZUltcGwgcmVmID0gbmV3IEVudGl0eVJlZmVyZW5jZUltcGwoKTsKLQkJcmVmLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCXJlZi5zZXROYW1lKG5hbWUpOwotCQlyZXR1cm4gcmVmOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBOb2RlSXRlcmF0b3IgY3JlYXRlTm9kZUl0ZXJhdG9yKE5vZGUgcm9vdCwgaW50IHdoYXRUb1Nob3csIE5vZGVGaWx0ZXIgZmlsdGVyLCBib29sZWFuIGVudGl0eVJlZmVyZW5jZUV4cGFuc2lvbikgewotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcm9vdCA9IHRoaXM7Ci0JCXJldHVybiBuZXcgTm9kZUl0ZXJhdG9ySW1wbChyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIpOwotCX0KLQotCS8qKgotCSAqIGNyZWF0ZU5vdGF0aW9uIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm90YXRpb24KLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb3RhdGlvbiBjcmVhdGVOb3RhdGlvbihTdHJpbmcgbmFtZSkgewotCQlOb3RhdGlvbkltcGwgbm90YXRpb24gPSBuZXcgTm90YXRpb25JbXBsKCk7Ci0JCW5vdGF0aW9uLnNldE93bmVyRG9jdW1lbnQodGhpcyk7Ci0JCW5vdGF0aW9uLnNldE5hbWUobmFtZSk7Ci0JCXJldHVybiBub3RhdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLQkgKiBAcGFyYW0gdGFyZ2V0Ci0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIGNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgcGkgPSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCgpOwotCQlwaS5zZXRPd25lckRvY3VtZW50KHRoaXMpOwotCQlwaS5zZXRUYXJnZXQodGFyZ2V0KTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCXBpLnNldERhdGEoZGF0YSk7Ci0JCXJldHVybiBwaTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgUmFuZ2UgY3JlYXRlUmFuZ2UoKSB7Ci0JCXJldHVybiBuZXcgUmFuZ2VJbXBsKCk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlVGV4dE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5UZXh0Ci0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgVGV4dCBjcmVhdGVUZXh0Tm9kZShTdHJpbmcgZGF0YSkgewotCQlUZXh0SW1wbCB0ZXh0ID0gbmV3IFRleHRJbXBsKCk7Ci0JCXRleHQuc2V0T3duZXJEb2N1bWVudCh0aGlzKTsKLQkJdGV4dC5zZXREYXRhKGRhdGEpOwotCQlyZXR1cm4gdGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdHJlZSB3YWxrCi0JICovCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcudzNjLmRvbS50cmF2ZXJzYWwuRG9jdW1lbnRUcmF2ZXJzYWwjY3JlYXRlVHJlZVdhbGtlcihvcmcudzNjLmRvbS5Ob2RlLAotCSAqICAgICAgaW50LCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlciwgYm9vbGVhbikKLQkgKi8KLQlwdWJsaWMgVHJlZVdhbGtlciBjcmVhdGVUcmVlV2Fsa2VyKE5vZGUgcm9vdCwgaW50IHdoYXRUb1Nob3csIE5vZGVGaWx0ZXIgZmlsdGVyLCBib29sZWFuIGVudGl0eVJlZmVyZW5jZUV4cGFuc2lvbikgewotCQlpZiAocm9vdCA9PSBudWxsKSB7Ci0JCQlTdHJpbmcgbXNnID0gIlByb2dyYW0gRXJyb3I6IHJvb3Qgbm9kZSBjYW4gbm90IGJlIG51bGwgZm9yIFRyZWVXYWxrZXIiOwotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsIG1zZyk7Ci0JCX0KLQkJLy8gSVNTVUU6IHdlIGp1c3QgdXNlIFhlcmNlcyBpbXBsZW1lbnRhdGlvbiBmb3Igbm93LCBidXQgbG9uZ2VyIHRlcm0sCi0JCS8vIHdlIHNob3VsZCBtYWtlIGEKLQkJLy8gdGhyZWFkL2pvYiBzYWZlIHZlcnNpb24gKGFzIHdlbGwgYXMgbm90IHJlbHkgb24gWGVyY2VzICJpbXBsIgotCQkvLyBjbGFzcy4KLQkJcmV0dXJuIG5ldyBUcmVlV2Fsa2VySW1wbChyb290LCB3aGF0VG9TaG93LCBmaWx0ZXIsIGVudGl0eVJlZmVyZW5jZUV4cGFuc2lvbik7Ci0KLQl9Ci0KLQlwcml2YXRlIERvY3VtZW50VHlwZSBmaW5kRG9jdHlwZShOb2RlIG5vZGUpIHsKLQkJCi0JCWludCBjb3VudFNlYXJjaCA9IDA7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjb3VudFNlYXJjaCsrID4gbWF4RG9jVHlwZVNlYXJjaCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfVFlQRV9OT0RFICYmIGNoaWxkIGluc3RhbmNlb2YgRG9jdW1lbnRUeXBlKSB7Ci0JCQkJcmV0dXJuIChEb2N1bWVudFR5cGUpIGNoaWxkOwotCQkJfQotCQkJZWxzZSBpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBFTEVNRU5UX05PREUgJiYgKChJRE9NRWxlbWVudCkgY2hpbGQpLmlzQ29tbWVudFRhZygpKSB7Ci0JCQkJLy8gc2VhcmNoIERPQ1RZUEUgaW5zaWRlIG9mIGdlbmVyaWMgY29tbWVudCBlbGVtZW50Ci0JCQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBmaW5kRG9jdHlwZShjaGlsZCk7Ci0JCQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJCQlyZXR1cm4gZG9jVHlwZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcml2YXRlIEVsZW1lbnQgZmluZERvY3VtZW50RWxlbWVudChTdHJpbmcgZG9jTmFtZSwgTm9kZSBub2RlLCBOb2RlW10gZmlyc3RGb3VuZCwgaW50IG1heCkgewotCQlpbnQgY291bnRTZWFyY2ggPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkKLQkJCS8qIAotCQkJICogbWF4RG9jVHlwZVNlYXJjaCBsaW1pdHMgYWRkZWQgdmlhIGJ1ZyAxNTE5MjkKLQkJCSAqIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTE5MjkKLQkJCSAqIGJ1dCwgaW4gb3RoZXIgY29udGV4dHMsIAotCQkJICogaWYgbm9NYXhTZWFyY2ggaXMgc3BlY2lmaWVkLCB0aGVuIGRvIG5vdCAiYnJlYWsgb3V0IiBvZiBsb25nIHNlYXJjaGVzIAotCQkJICogKi8KLQkJCWlmIChtYXggIT0gbm9NYXhTZWFyY2ggJiYgY291bnRTZWFyY2grKyA+IG1heCkgewotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWNvbnRpbnVlOwotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgY2hpbGQ7Ci0JCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCUVsZW1lbnQgZG9jRWxlbWVudCA9IGZpbmREb2N1bWVudEVsZW1lbnQoZG9jTmFtZSwgZWxlbWVudCwgZmlyc3RGb3VuZCwgbWF4KTsKLQkJCQlpZiAoZG9jRWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJCXJldHVybiBkb2NFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gYWRkZWQgJ2Vsc2UgY29udGludWUnIHRvIGJldHRlciBoYW5kbGUgY2FzZXMgd2hlcmUKLQkJCQkJLy8gdGhlcmUgaXMgIm1vcmUgdGhhbiBvbmUgcm9vdCIgZWxlbWVudAotCQkJCQkvLyBlc3BlY2lhbGx5IGNvbXBsaWNhdGVkIGJ5IENvbW1lbnRFbGVtZW50cywgd2hpY2ggYXJlCi0JCQkJCS8vIHNvbWV0aW1lcyB0cmVhdGVkIGFzIGVsZW1lbnRzLCBidXQgc2hvdWxkCi0JCQkJCS8vIGJlIHRyZWF0ZWQgYXMgY29tbWVudHMgaW4gdGhpcyBjb250ZXh0LgotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBub3RlOiB0aGUgIm5hbWUiIHdvbid0IG1hdGNoIGluIHRoZSBldmVudCBvZiBhIGpzcCB0YWcgLi4uIGJ1dAotCQkJLy8gaW5jYXNlCi0JCQkvLyB0aGUgbmFtZSBpcyBudWxsLCB3ZSBkbyBub3Qgd2FudCB0aGUganNwIGVsZW1lbnQgcmV0dXJuZWQgYXMKLQkJCS8vIGRvY3VtZW50RWxlbWVudAotCQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQljb250aW51ZTsKLQkJCWlmIChkb2NOYW1lID09IG51bGwpCi0JCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkvLyB1c2UgbG9jYWwgbmFtZSBmb3IgbmFtZXNwYWNlCi0JCQlTdHJpbmcgbG9jYWxOYW1lID0gZWxlbWVudC5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChpc1hNTFR5cGUoKSkgewotCQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzKGRvY05hbWUpKQotCQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChsb2NhbE5hbWUuZXF1YWxzSWdub3JlQ2FzZShkb2NOYW1lKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQl9Ci0JCQlpZiAoZmlyc3RGb3VuZFswXSA9PSBudWxsKQotCQkJCWZpcnN0Rm91bmRbMF0gPSBlbGVtZW50OwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldENoYXJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Q2hhclZhbHVlKFN0cmluZyBuYW1lKSB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChuYW1lLmNoYXJBdCgwKSA9PSAnIycpIHsgLy8gY2hhcmFjdGVyIHJlZmVyZW5jZQotCQkJaWYgKGxlbmd0aCA9PSAxKQotCQkJCXJldHVybiBudWxsOwotCQkJaW50IHJhZGl4ID0gMTA7Ci0JCQlTdHJpbmcgcyA9IG51bGw7Ci0JCQkvLyBub3cgYWxsb3cgaGV4YWRlY2ltYWwgYWxzbyBmb3Igbm9uIFhNTCBkb2N1bWVudAotCQkJaWYgKG5hbWUuY2hhckF0KDEpID09ICd4JykgeyAvLyBoZXhhZGVjaW1hbAotCQkJCXJhZGl4ID0gMTY7Ci0JCQkJcyA9IG5hbWUuc3Vic3RyaW5nKDIpOwotCQkJfQotCQkJZWxzZSB7IC8vIGRlY2ltYWwKLQkJCQlzID0gbmFtZS5zdWJzdHJpbmcoMSk7Ci0JCQl9Ci0JCQlpZiAocyA9PSBudWxsIHx8IHMubGVuZ3RoKCkgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChzLmNoYXJBdCgwKSA9PSAnLScpCi0JCQkJcmV0dXJuIG51bGw7IC8vIG5vIG1pbnVzIGFjY2VwdGVkCi0JCQljaGFyIGMgPSAwOwotCQkJdHJ5IHsKLQkJCQljID0gKGNoYXIpIEludGVnZXIucGFyc2VJbnQocywgcmFkaXgpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgewotCQkJfQotCQkJaWYgKGMgPT0gMCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCXJldHVybiBTdHJpbmcudmFsdWVPZihjKTsKLQkJfQotCi0JCS8vIGltcGxpY2l0IGNoYXJhY3RlciBlbnRpdGllcyBmb3IgWE1MCi0JCWlmIChuYW1lLmVxdWFscyhJWE1MQ2hhckVudGl0eS5MVF9OQU1FKSkKLQkJCXJldHVybiBJWE1MQ2hhckVudGl0eS5MVF9WQUxVRTsKLQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LkdUX05BTUUpKQotCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkdUX1ZBTFVFOwotCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuQU1QX05BTUUpKQotCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LkFNUF9WQUxVRTsKLQkJaWYgKG5hbWUuZXF1YWxzKElYTUxDaGFyRW50aXR5LlFVT1RfTkFNRSkpCi0JCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuUVVPVF9WQUxVRTsKLQkJaWYgKGlzWE1MVHlwZSgpKSB7Ci0JCQlpZiAobmFtZS5lcXVhbHMoSVhNTENoYXJFbnRpdHkuQVBPU19OQU1FKSkKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuQVBPU19WQUxVRTsKLQkJfQotCi0JCUNNRG9jdW1lbnQgY20gPSBnZXRDTURvY3VtZW50KCk7Ci0JCWlmIChjbSAhPSBudWxsKSB7Ci0JCQlDTU5hbWVkTm9kZU1hcCBtYXAgPSBjbS5nZXRFbnRpdGllcygpOwotCQkJaWYgKG1hcCAhPSBudWxsKSB7Ci0JCQkJQ01FbnRpdHlEZWNsYXJhdGlvbiBkZWNsID0gKENNRW50aXR5RGVjbGFyYXRpb24pIG1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQkJaWYgKGRlY2wgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgdmFsdWUgPSBkZWNsLmdldFZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuIG51bGw7Ci0JCQkJCWludCB2YWx1ZUxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOwotCQkJCQlpZiAodmFsdWVMZW5ndGggPiAxICYmIHZhbHVlLmNoYXJBdCgwKSA9PSAnJicgJiYgdmFsdWUuY2hhckF0KDEpID09ICcjJyAmJiB2YWx1ZS5jaGFyQXQodmFsdWVMZW5ndGggLSAxKSA9PSAnOycpIHsKLQkJCQkJCS8vIGNoYXJhY3RlciByZWZlcmVuY2UKLQkJCQkJCXJldHVybiBnZXRDaGFyVmFsdWUodmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlTGVuZ3RoIC0gMSkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiB2YWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkgewotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHRoaXMpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5LmdldENvcnJlc3BvbmRpbmdDTURvY3VtZW50KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldERvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGUKLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRUeXBlIGdldERvY3R5cGUoKSB7Ci0JCXJldHVybiBmaW5kRG9jdHlwZSh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREb2N1bWVudEVsZW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQgRnJvbSBET00gMiBTcGVjOiBkb2N1bWVudEVsZW1lbnQgb2YgdHlwZQotCSAqICAgICAgICAgRWxlbWVudCBbcC42Ml0gLCByZWFkb25seSBUaGlzIGlzIGEgY29udmVuaWVuY2UgW3AuMTE5XQotCSAqICAgICAgICAgYXR0cmlidXRlIHRoYXQgYWxsb3dzIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIGNoaWxkIG5vZGUgdGhhdCBpcwotCSAqICAgICAgICAgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQuIEZvciBIVE1MIGRvY3VtZW50cywgdGhpcyBpcwotCSAqICAgICAgICAgdGhlIGVsZW1lbnQgd2l0aCB0aGUgdGFnTmFtZSAiSFRNTCIuIE5vdGU6IHdlIGRpZmZlciBmcm9tIHRoaXMKLQkgKiAgICAgICAgIGRlZmluaXRpb24gYSBsaXR0bGUgaW4gdGhhdCB3ZSBkb24ndCBuZWNlc3NhcmlseSB0YWtlIHRoZSBmaXJzdAotCSAqICAgICAgICAgY2hpbGQgYnV0IGFsc28gbG9vayB0byBtYXRjaCB0aGUgbmFtZS4gSW4gYSB3ZWxsIGZvcm1lZAotCSAqICAgICAgICAgZG9jdW1lbnQsIG9mIGNvdXJzZSwgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSwgYnV0IG5vdAotCSAqICAgICAgICAgbmVjZXNzYXJpbHkgdGhlIHNhbWUgaW4gYW4gaWxsLWZvcm1lZCBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBnZXREb2N1bWVudEVsZW1lbnQoKSB7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJRG9jdW1lbnRUeXBlIGRvY1R5cGUgPSBnZXREb2N1bWVudFR5cGUoKTsKLQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJbmFtZSA9IGRvY1R5cGUuZ2V0TmFtZSgpOwotCQl9Ci0KLQkJRWxlbWVudCBmaXJzdFtdID0gbmV3IEVsZW1lbnRbMV07Ci0JCUVsZW1lbnQgZG9jRWxlbWVudCA9IGZpbmREb2N1bWVudEVsZW1lbnQobmFtZSwgdGhpcywgZmlyc3QsIG5vTWF4U2VhcmNoKTsKLQkJaWYgKGRvY0VsZW1lbnQgPT0gbnVsbCkgewotCQkJZG9jRWxlbWVudCA9IGZpcnN0WzBdOwotCQl9Ci0KLQkJcmV0dXJuIGRvY0VsZW1lbnQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZSBnZXREb2N1bWVudFR5cGUoKSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIGdldERvY3R5cGUoKTsKLQkJcmV0dXJuIGFkYXB0ZXIuZ2V0RG9jdW1lbnRUeXBlKCk7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldERvY3VtZW50VHlwZUlkKCkgewotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGdldERvY3VtZW50VHlwZSgpOwotCQlpZiAoZG9jVHlwZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBpZCA9IGRvY1R5cGUuZ2V0UHVibGljSWQoKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlpZCA9IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKTsKLQkJcmV0dXJuIGlkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnRCeUlkKFN0cmluZyBpZCkgewotCQlpZiAoaWQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlSXRlcmF0b3IgaXQgPSBjcmVhdGVOb2RlSXRlcmF0b3IodGhpcywgTm9kZUZpbHRlci5TSE9XX0FMTCwgbnVsbCwgZmFsc2UpOwotCQlpZiAoaXQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJU3RyaW5nIHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7Ly8kTk9OLU5MUy0xJAotCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKGlkKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzQnlUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBudWxsOwotCi0JCWlmICh1c2V0YWduYW1lY2FjaGUpIHsKLQkJCWVsZW1lbnRzID0gdGFnTmFtZUNhY2hlLmdldEl0ZW0odGFnTmFtZSk7Ci0JCX0KLQotCQlpZiAoZWxlbWVudHMgPT0gbnVsbCkgewotCQkJZWxlbWVudHMgPSBpbnRlcm5hbEdldEVsZW1lbnRzQnlUYWdOYW1lKHRhZ05hbWUpOwotCi0JCX0KLQotCQlyZXR1cm4gZWxlbWVudHM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIE5vZGVMaXN0IGdldEVsZW1lbnRzQnlUYWdOYW1lTlMoU3RyaW5nIHVyaSwgU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJTm9kZUl0ZXJhdG9yIGl0ID0gY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA9PSAxICYmIHVyaS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl1cmkgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbnNVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmIChuc1VSSSA9PSBudWxsIHx8ICFuc1VSSS5lcXVhbHModXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdW5zcGVjaWZpZWQuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldEVuY29kaW5nKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRE9NSW1wbGVtZW50YXRpb24gZ2V0SW1wbGVtZW50YXRpb24oKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBvdGhlciBub2RlcyB3aWxsIGJlIHJlZmVycmluZyB0byB0aGlzIG9uZSB0byBnZXQgdGhlIG93bmluZyBtb2RlbAotCSAqLwotCXB1YmxpYyBJRE9NTW9kZWwgZ2V0TW9kZWwoKSB7Ci0JCXJldHVybiBtb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gIiNkb2N1bWVudCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBET0NVTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB3aGV0aGVyIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBzdGFuZGFsb25lLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRTdGFuZGFsb25lKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nIHdoZXRoZXIgZXJyb3JzIGNoZWNraW5nIGlzIGVuZm9yY2VkIG9yIG5vdC4KLQkgKiBXaGVuIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBmcmVlIHRvIG5vdAotCSAqIHRlc3QgZXZlcnkgcG9zc2libGUgZXJyb3IgY2FzZSBub3JtYWxseSBkZWZpbmVkIG9uIERPTSBvcGVyYXRpb25zLCBhbmQKLQkgKiBub3QgcmFpc2UgYW55IDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4uIEluIGNhc2Ugb2YgZXJyb3IsIHRoZQotCSAqIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4gVGhpcyBhdHRyaWJ1dGUgaXMgPGNvZGU+dHJ1ZTwvY29kZT4gYnkKLQkgKiBkZWZhdWx0cy4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0U3RyaWN0RXJyb3JDaGVja2luZygpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB0aGUgdmVyc2lvbgotCSAqIG51bWJlciBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdW5zcGVjaWZpZWQuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaWdub3JlQ2FzZSgpIHsKLQkJRG9jdW1lbnRUeXBlQWRhcHRlciBhZGFwdGVyID0gKERvY3VtZW50VHlwZUFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoRG9jdW1lbnRUeXBlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoYWRhcHRlci5nZXRUYWdOYW1lQ2FzZSgpICE9IERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0UpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGltcG9ydENoaWxkTm9kZXMoTm9kZSBwYXJlbnQsIGJvb2xlYW4gZGVlcCkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJcmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJTm9kZSBpbXBvcnRlZCA9IGltcG9ydE5vZGUoY2hpbGQsIGRlZXApOwotCQkJaWYgKGltcG9ydGVkID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlhcHBlbmRDaGlsZChpbXBvcnRlZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbXBvcnROb2RlKE5vZGUgbm9kZSwgYm9vbGVhbiBkZWVwKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlOb2RlSW1wbCBpbXBvcnRlZCA9IChOb2RlSW1wbCkgbm9kZS5jbG9uZU5vZGUoZGVlcCk7Ci0JCWlmIChpbXBvcnRlZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCS8vc3VjY2Vzc2Z1bCBpbXBvcnQsIG5vdGlmeSBVc2VyRGF0YUhhbmRsZXJzIGlmIGFueQotCQlOb2RlSW1wbCBub2RlVG9Ob3RpZnk9KE5vZGVJbXBsKSBub2RlOwotCQlub2RlVG9Ob3RpZnkubm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9JTVBPUlRFRCwgbnVsbCk7Ci0JCWltcG9ydGVkLnNldE93bmVyRG9jdW1lbnQodGhpcywgZGVlcCk7Ci0JCXJldHVybiBpbXBvcnRlZDsKLQl9Ci0KLQlwcml2YXRlIE5vZGVMaXN0SW1wbCBpbnRlcm5hbEdldEVsZW1lbnRzQnlUYWdOYW1lKFN0cmluZyB0YWdOYW1lKSB7Ci0JCS8vIFN5c3RlbS5vdXQucHJpbnRsbigiZ2V0RWxlbWVudHNCeVRhZ25hbWU6ICIgKyB0YWdOYW1lKTsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHRhZ05hbWUubGVuZ3RoKCkgPT0gMSAmJiB0YWdOYW1lLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXRhZ05hbWUgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCWlmICghZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShub2RlKTsKLQkJfQotCQlpZiAodXNldGFnbmFtZWNhY2hlKSB7Ci0JCQl0YWdOYW1lQ2FjaGUuYWRkSXRlbSh0YWdOYW1lLCBlbGVtZW50cyk7Ci0JCX0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSlNQRG9jdW1lbnQoKSB7Ci0JCUVsZW1lbnQgZWxlbWVudCA9IGdldERvY3VtZW50RWxlbWVudCgpOwotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9ST09UKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pTUFR5cGUoKSB7Ci0JCWlmICh0aGlzLm1vZGVsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUlNb2RlbEhhbmRsZXIgaGFuZGxlciA9IHRoaXMubW9kZWwuZ2V0TW9kZWxIYW5kbGVyKCk7Ci0JCWlmIChoYW5kbGVyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCVN0cmluZyBpZCA9IGhhbmRsZXIuZ2V0QXNzb2NpYXRlZENvbnRlbnRUeXBlSWQoKTsKLQkJaWYgKGlkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIElTU1VFOiAtLSBhdm9pZCB0aGlzIGhhcmRjb2RlZCBzdHJpbmcKLQkJcmV0dXJuIGlkLmVxdWFscygib3JnLmVjbGlwc2UuanN0LmpzcC5jb3JlLmpzcHNvdXJjZSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNWYWxpZE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIC8vIERNVzogbW9kaWZpZWQgZm9yIFhNTDRKIDQuMC4xCi0JCS8vIGlmIChYTUxDaGFyLmlzVmFsaWROYW1lKG5hbWUpKSByZXR1cm4gdHJ1ZTsKLQkJaWYgKE5hbWVWYWxpZGF0b3IuaXNWYWxpZChuYW1lKSkKLQkJCXJldHVybiB0cnVlOwotCQkvLyBzcGVjaWFsIGZvciBpbnZhbGlkIGRlY2xhcmF0aW9uCi0JCWlmIChuYW1lLmxlbmd0aCgpID09IDEgJiYgbmFtZS5jaGFyQXQoMCkgPT0gJyEnKQotCQkJcmV0dXJuIHRydWU7Ci0JCS8vIHNwZWNpYWwgZm9yIEpTUCB0YWcgaW4gdGFnIG5hbWUKLQkJaWYgKG5hbWUuc3RhcnRzV2l0aChKU1BUYWcuVEFHX09QRU4pKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1hNTFR5cGUoKSB7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBnZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBhZGFwdGVyLmlzWE1MVHlwZSgpOwotCX0KLQotCS8qKgotCSAqLwotCS8vIHByb3RlY3RlZCB2b2lkIHJlbGVhc2VEb2N1bWVudFR5cGUoKSB7Ci0JLy8gaWYgKHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlciA9PSBudWxsKQotCS8vIHJldHVybjsKLQkvLyB0aGlzLmRvY3VtZW50VHlwZUFkYXB0ZXIucmVsZWFzZSgpOwotCS8vIHRoaXMuZG9jdW1lbnRUeXBlQWRhcHRlciA9IG51bGw7Ci0JLy8gfQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGRvY3VtZW50LiBUaGlzIGlzIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gdW5zcGVjaWZpZWQuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKGphdmEubGFuZy5TdHJpbmcgZW5jb2RpbmcpIHsKLQl9Ci0KLQkvKioKLQkgKiBzZXRNb2RlbCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbW9kZWwKLQkgKiAgICAgICAgICAgIFhNTE1vZGVsCi0JICovCi0KLQlwcm90ZWN0ZWQgdm9pZCBzZXRNb2RlbChJRE9NTW9kZWwgbW9kZWwpIHsKLQkJdGhpcy5tb2RlbCA9IChET01Nb2RlbEltcGwpIG1vZGVsOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCB3aGV0aGVyIHRoaXMKLQkgKiBkb2N1bWVudCBpcyBzdGFuZGFsb25lLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFuZGFsb25lKGJvb2xlYW4gc3RhbmRhbG9uZSkgewotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZyB3aGV0aGVyIGVycm9ycyBjaGVja2luZyBpcyBlbmZvcmNlZCBvciBub3QuCi0JICogV2hlbiBzZXQgdG8gPGNvZGU+ZmFsc2U8L2NvZGU+LCB0aGUgaW1wbGVtZW50YXRpb24gaXMgZnJlZSB0byBub3QKLQkgKiB0ZXN0IGV2ZXJ5IHBvc3NpYmxlIGVycm9yIGNhc2Ugbm9ybWFsbHkgZGVmaW5lZCBvbiBET00gb3BlcmF0aW9ucywgYW5kCi0JICogbm90IHJhaXNlIGFueSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+LiBJbiBjYXNlIG9mIGVycm9yLCB0aGUKLQkgKiBiZWhhdmlvciBpcyB1bmRlZmluZWQuIFRoaXMgYXR0cmlidXRlIGlzIDxjb2RlPnRydWU8L2NvZGU+IGJ5Ci0JICogZGVmYXVsdHMuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cmljdEVycm9yQ2hlY2tpbmcoYm9vbGVhbiBzdHJpY3RFcnJvckNoZWNraW5nKSB7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSBYTUwgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZG9jdW1lbnQuIFRoaXMgaXMgPGNvZGU+bnVsbDwvY29kZT4gd2hlbiB1bnNwZWNpZmllZC4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VmVyc2lvbihqYXZhLmxhbmcuU3RyaW5nIHZlcnNpb24pIHsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIGJvb2xlYW4gZ2V0WG1sU3RhbmRhbG9uZSgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbG1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRYbWxTdGFuZGFsb25lKGJvb2xlYW4geG1sU3RhbmRhbG9uZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRYbWxWZXJzaW9uKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFhtbFZlcnNpb24oU3RyaW5nIHhtbFZlcnNpb24pIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RG9jdW1lbnRVUkkoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnRVUkkoU3RyaW5nIGRvY3VtZW50VVJJKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIERPTUNvbmZpZ3VyYXRpb24gZ2V0RG9tQ29uZmlnKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZURvY3VtZW50KCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gZm9yIERPTSAzLgotCSAqLwotCXB1YmxpYyBOb2RlIHJlbmFtZU5vZGUoTm9kZSBuLCBTdHJpbmcgbmFtZXNwYWNlVVJJLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0RvY3VtZW50VHlwZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTVmZjRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRUeXBlQWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0Jc3RhdGljIGZpbmFsIGludCBMT1dFUl9DQVNFID0gMjsKLQlzdGF0aWMgZmluYWwgaW50IFNUUklDVF9DQVNFID0gMDsKLQlzdGF0aWMgZmluYWwgaW50IFVQUEVSX0NBU0UgPSAxOwotCi0JLyoqCi0JICovCi0JaW50IGdldEF0dHJOYW1lQ2FzZSgpOwotCi0JLyoqCi0JICovCi0JRG9jdW1lbnRUeXBlIGdldERvY3VtZW50VHlwZSgpOwotCi0JLyoqCi0JICovCi0JaW50IGdldFRhZ05hbWVDYXNlKCk7Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpOwotCi0JLyoqCi0JICovCi0JYm9vbGVhbiBpc1hNTFR5cGUoKTsKLQotCS8qKgotCSAqLwotCXZvaWQgcmVsZWFzZSgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjZkOGIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlQWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnRUeXBlQWRhcHRlckltcGwgaW1wbGVtZW50cyBEb2N1bWVudFR5cGVBZGFwdGVyIHsKLQotCXByaXZhdGUgSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQlwcml2YXRlIERvY3VtZW50VHlwZSBkb2N1bWVudFR5cGUgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIERvY3VtZW50VHlwZUFkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVBZGFwdGVySW1wbChJRE9NRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwotCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJdGhpcy5kb2N1bWVudFR5cGUgPSBkb2N1bWVudC5nZXREb2N0eXBlKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEF0dHJOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiB0aGlzLmRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdW1lbnRUeXBlKCkgewotCQlyZXR1cm4gdGhpcy5kb2N1bWVudFR5cGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUYWdOYW1lQ2FzZSgpIHsKLQkJcmV0dXJuIFNUUklDVF9DQVNFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0ZlYXR1cmUoU3RyaW5nIGZlYXR1cmUpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuICh0eXBlID09IERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzWE1MVHlwZSgpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCWlmIChldmVudFR5cGUgIT0gSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCkKLQkJCXJldHVybjsKLQkJaWYgKG5vdGlmaWVyID09IG51bGwgfHwgIShub3RpZmllciBpbnN0YW5jZW9mIElET01Eb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0JCXRoaXMuZG9jdW1lbnRUeXBlID0gKChJRE9NRG9jdW1lbnQpIG5vdGlmaWVyKS5nZXREb2N0eXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbm90aWZ5RG9jdW1lbnRUeXBlQ2hhbmdlZCgpIHsKLQkJaWYgKHRoaXMuZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU1vZGVsIG1vZGVsID0gdGhpcy5kb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChET01Nb2RlbEltcGwpIG1vZGVsKS5kb2N1bWVudFR5cGVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gbm90aGluZyB0byBkbwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldERvY3VtZW50VHlwZShEb2N1bWVudFR5cGUgZG9jdW1lbnRUeXBlKSB7Ci0JCXRoaXMuZG9jdW1lbnRUeXBlID0gZG9jdW1lbnRUeXBlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRG9jdW1lbnRUeXBlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MjhlNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Eb2N1bWVudFR5cGVJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogRG9jdW1lbnRUeXBlIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBEb2N1bWVudFR5cGVJbXBsIGV4dGVuZHMgTm9kZUltcGwgaW1wbGVtZW50cyBJRE9NRG9jdW1lbnRUeXBlIHsKLQlwcml2YXRlIFN0cmluZyBpbnRlcm5hbFN1YnNldCA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQlwcml2YXRlIFN0cmluZyBwdWJsaWNJZCA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JLyoqCi0JICogRG9jdW1lbnRUeXBlSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIERvY3VtZW50VHlwZUltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgRG9jdW1lbnRUeXBlSW1wbAotCSAqLwotCXByb3RlY3RlZCBEb2N1bWVudFR5cGVJbXBsKERvY3VtZW50VHlwZUltcGwgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQotCQlpZiAodGhhdCAhPSBudWxsKSB7Ci0JCQl0aGlzLm5hbWUgPSB0aGF0Lm5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCURvY3VtZW50VHlwZUltcGwgY2xvbmVkID0gbmV3IERvY3VtZW50VHlwZUltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldEVudGl0aWVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnRlcm5hbFN1YnNldCgpIHsKLQkJcmV0dXJuIHRoaXMuaW50ZXJuYWxTdWJzZXQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlyZXR1cm4gZ2V0TmFtZSgpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBET0NVTUVOVF9UWVBFX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm90YXRpb25zIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTmFtZWROb2RlTWFwCi0JICovCi0JcHVibGljIE5hbWVkTm9kZU1hcCBnZXROb3RhdGlvbnMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIGdldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEludGVybmFsU3Vic2V0KFN0cmluZyBpbnRlcm5hbFN1YnNldCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuaW50ZXJuYWxTdWJzZXQgPSBpbnRlcm5hbFN1YnNldDsKLQl9Ci0KLQkvKioKLQkgKiBzZXROYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotCQl0aGlzLm5hbWUgPSBuYW1lOwotCX0KLQotCS8qKgotCSAqIHNldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwdWJsaWNJZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMucHVibGljSWQgPSBwdWJsaWNJZDsKLQotCQlub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRTeXN0ZW1JZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gc3lzdGVtSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0KLQkJbm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICogdG9TdHJpbmcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJYnVmZmVyLmFwcGVuZChnZXROYW1lKCkpOwotCQlidWZmZXIuYXBwZW5kKCcoJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0UHVibGljSWQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGdldFN5c3RlbUlkKCkpOwotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ0AnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZmxhdE5vZGUudG9TdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRWxlbWVudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjNGFlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VsZW1lbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAKLSAqICAgICBWYWxlbnRpbiBCYWNpdSAtIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMzk1NTIKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb21tZW50ZWxlbWVudC5Db21tZW50RWxlbWVudEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLlhNTFNvdXJjZVBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTE5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS50cmF2ZXJzYWwuTm9kZUl0ZXJhdG9yOwotCi0KLS8qKgotICogRWxlbWVudEltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnRJbXBsIGV4dGVuZHMgTm9kZUNvbnRhaW5lciBpbXBsZW1lbnRzIElET01FbGVtZW50IHsKLQotCXByaXZhdGUgY2xhc3MgQXR0cmlidXRlcyBpbXBsZW1lbnRzIE5hbWVkTm9kZU1hcCB7Ci0JCUF0dHJpYnV0ZXMoKSB7Ci0JCQlzdXBlcigpOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlpZiAoYXR0ck5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIDA7Ci0JCQlyZXR1cm4gYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQl9Ci0KLQkJcHVibGljIE5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZShuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIGdldE5hbWVkSXRlbU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbmFtZSk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIGF0dHJOb2Rlcy5pdGVtKGluZGV4KTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbShTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gcmVtb3ZlQXR0cmlidXRlTm9kZShuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHJlbW92ZU5hbWVkSXRlbU5TKFN0cmluZyB1cmksIFN0cmluZyBuYW1lKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJCXJldHVybiByZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQkJfQotCi0JCXB1YmxpYyBOb2RlIHNldE5hbWVkSXRlbShOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZSgoQXR0ckltcGwpIGFyZyk7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBzZXROYW1lZEl0ZW1OUyhOb2RlIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCQlyZXR1cm4gc2V0QXR0cmlidXRlTm9kZU5TKChBdHRySW1wbCkgYXJnKTsKLQkJfQotCX0KLQotCU5vZGVMaXN0SW1wbCBhdHRyTm9kZXMgPSBudWxsOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRUYWcgPSBmYWxzZTsKLQlwcml2YXRlIGJvb2xlYW4gaXNFbXB0eVRhZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBpc0pTUFRhZyA9IGZhbHNlOwotCXByaXZhdGUgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IG51bGw7Ci0KLQlwcml2YXRlIFN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIEVsZW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEVsZW1lbnRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEVsZW1lbnRJbXBsCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnRJbXBsKEVsZW1lbnRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy50YWdOYW1lID0gdGhhdC50YWdOYW1lOwotCQkJdGhpcy5pc0VtcHR5VGFnID0gdGhhdC5pc0VtcHR5VGFnOwotCQkJdGhpcy5pc0pTUFRhZyA9IHRoYXQuaXNKU1BUYWc7Ci0JCQl0aGlzLmlzQ29tbWVudFRhZyA9IHRoYXQuaXNDb21tZW50VGFnOwotCi0JCQkvLyBjbG9uZSBhdHRyaWJ1dGVzCi0JCQl0aGF0LmNsb25lQXR0cmlidXRlcyh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFkZEVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZW5kCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgYWRkRW5kVGFnKEVsZW1lbnQgZW5kVGFnKSB7Ci0JCWlmIChlbmRUYWcgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGhhc0VuZFRhZygpKQotCQkJcmV0dXJuOwotCQlFbGVtZW50SW1wbCBlbmQgPSAoRWxlbWVudEltcGwpIGVuZFRhZzsKLQotCQkvLyBtb3ZlIHRoZSBlbmQgZmxhdCBub2RlIGZyb20gdGhlIGVuZCB0YWcKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVuZC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWVuZC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCXNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQXR0aWJ1dGVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIEF0dHIgYXBwZW5kQXR0cmlidXRlTm9kZShBdHRyIG5ld0F0dHIpIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlpZiAoYXR0ci5nZXRPd25lckVsZW1lbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXRoaXMuYXR0ck5vZGVzID0gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQl0aGlzLmF0dHJOb2Rlcy5hcHBlbmROb2RlKGF0dHIpOwotCQlhdHRyLnNldE93bmVyRWxlbWVudCh0aGlzKTsKLQotCQlub3RpZnlBdHRyUmVwbGFjZWQoYXR0ciwgbnVsbCk7Ci0JCXJldHVybiBhdHRyOwotCX0KLQotCS8qKgotCSAqIGNsb25lQXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3T3duZXIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjbG9uZUF0dHJpYnV0ZXMoRWxlbWVudCBuZXdPd25lcikgewotCQlpZiAobmV3T3duZXIgPT0gbnVsbCB8fCBuZXdPd25lciA9PSB0aGlzKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld093bmVyOwotCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZXMoKTsKLQotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAobm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJQXR0ciBjbG9uZWQgPSAoQXR0cikgbm9kZS5jbG9uZU5vZGUoZmFsc2UpOwotCQkJaWYgKGNsb25lZCAhPSBudWxsKQotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZShjbG9uZWQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbGVtZW50SW1wbCBjbG9uZWQgPSBuZXcgRWxlbWVudEltcGwodGhpcyk7Ci0JCWlmIChkZWVwKQotCQkJY2xvbmVDaGlsZE5vZGVzKGNsb25lZCwgZGVlcCk7Ci0JCQotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlBdHRyIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIGdldEF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJaWYgKGF0dHIubWF0Y2hOYW1lKG5hbWUpKQotCQkJCXJldHVybiBhdHRyOyAvLyBmb3VuZAotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIG5vdCBmb3VuZAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBBdHRyIGdldEF0dHJpYnV0ZU5vZGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgewotCQlpZiAobmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGludmFsaWQgcGFyYW1ldGVyCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vIGF0dHJpYnV0ZQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbG9jYWxOYW1lID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBuc1VSSSA9IGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQlpZiAobnNVUkkgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobnNVUkkgPT0gbnVsbCB8fCAhbnNVUkkuZXF1YWxzKHVyaSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBmb3VuZAotCQkJcmV0dXJuIGF0dHI7Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgewotCQlBdHRyIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gYXR0ci5nZXRWYWx1ZSgpOwotCX0KLQotCS8qKgotCSAqIGdldEF0dHJpYnV0ZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXAKLQkgKi8KLQlwdWJsaWMgTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBuZXcgQXR0cmlidXRlcygpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIGdldEVsZW1lbnRzQnlUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZUxpc3QKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRFbGVtZW50c0J5VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHRhZ05hbWUubGVuZ3RoKCkgPT0gMSAmJiB0YWdOYW1lLmNoYXJBdCgwKSA9PSAnKicpIHsKLQkJCXRhZ05hbWUgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0KLQkJZm9yIChOb2RlIG5vZGUgPSBpdC5uZXh0Tm9kZSgpOyBub2RlICE9IG51bGw7IG5vZGUgPSBpdC5uZXh0Tm9kZSgpKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IEVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQkJCWlmICh0YWdOYW1lICE9IG51bGwpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCWlmICghZWxlbWVudC5tYXRjaFRhZ05hbWUodGFnTmFtZSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJZWxlbWVudHMuYXBwZW5kTm9kZShub2RlKTsKLQkJfQotCi0JCXJldHVybiBlbGVtZW50czsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgTm9kZUxpc3QgZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJTm9kZUl0ZXJhdG9yIGl0ID0gZG9jdW1lbnQuY3JlYXRlTm9kZUl0ZXJhdG9yKHRoaXMsIE5vZGVGaWx0ZXIuU0hPV19BTEwsIG51bGwsIGZhbHNlKTsKLQkJaWYgKGl0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IE5vZGVMaXN0SW1wbCgpOwotCQlOb2RlTGlzdEltcGwgZWxlbWVudHMgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQkJaWYgKHVyaSAhPSBudWxsICYmIHVyaS5sZW5ndGgoKSA9PSAxICYmIHVyaS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl1cmkgPSBudWxsOyAvLyBkbyBub3QgY2FyZQotCQl9Ci0JCWlmICh0YWdOYW1lLmxlbmd0aCgpID09IDEgJiYgdGFnTmFtZS5jaGFyQXQoMCkgPT0gJyonKSB7Ci0JCQl0YWdOYW1lID0gbnVsbDsgLy8gZG8gbm90IGNhcmUKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gaXQubmV4dE5vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gaXQubmV4dE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBFTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkgewotCQkJCVN0cmluZyBsb2NhbE5hbWUgPSBlbGVtZW50LmdldExvY2FsTmFtZSgpOwotCQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyh0YWdOYW1lKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgbnNVUkkgPSBlbGVtZW50LmdldE5hbWVzcGFjZVVSSSgpOwotCQkJCWlmIChuc1VSSSA9PSBudWxsIHx8ICFuc1VSSS5lcXVhbHModXJpKSkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbGVtZW50cy5hcHBlbmROb2RlKGVsZW1lbnQpOwotCQl9Ci0KLQkJcmV0dXJuIGVsZW1lbnRzOwotCX0KLQotCS8qKgotCSAqIGdldEVuZE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIGdldEVuZFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJcmV0dXJuIHN1cGVyLmdldEVuZE9mZnNldCgpOwotCX0KLQotCS8qKgotCSAqIGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEVuZFRhZ05hbWUoKSB7Ci0JCWlmICh0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSB0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRFbmRUYWcocmVnaW9uVHlwZSkpIHsKLQkJCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyZWdpb24pOwotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRFbmRUYWcoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlpZiAodGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKSB7Ci0JCWlmICh0aGlzLnRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgaW5kZXggPSB0aGlzLnRhZ05hbWUuaW5kZXhPZignOicpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuIHRoaXMudGFnTmFtZTsKLQkJcmV0dXJuIHRoaXMudGFnTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSSgpIHsKLQkJU3RyaW5nIG5zQXR0ck5hbWUgPSBudWxsOwotCQlTdHJpbmcgcHJlZml4ID0gZ2V0UHJlZml4KCk7Ci0JCWlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXgubGVuZ3RoKCkgPiAwKSB7Ci0JCQluc0F0dHJOYW1lID0gSVhNTE5hbWVzcGFjZS5YTUxOU19QUkVGSVggKyBwcmVmaXg7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluc0F0dHJOYW1lID0gSVhNTE5hbWVzcGFjZS5YTUxOUzsKLQkJfQotCi0JCWZvciAoTm9kZSBub2RlID0gdGhpczsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gRUxFTUVOVF9OT0RFKQotCQkJCWJyZWFrOwotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQlBdHRyIGF0dHIgPSBlbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUobnNBdHRyTmFtZSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCXJldHVybiBhdHRyLmdldFZhbHVlKCk7Ci0JCX0KLQotCQlyZXR1cm4gdGhpcy5uYW1lc3BhY2VVUkk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGdldFRhZ05hbWUoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gRUxFTUVOVF9OT0RFOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlpZiAodGhpcy50YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaW50IGluZGV4ID0gdGhpcy50YWdOYW1lLmluZGV4T2YoJzonKTsKLQkJaWYgKGluZGV4IDw9IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gZXhjbHVkZSBKU1AgdGFnIGluIHRhZyBuYW1lCi0JCWlmICh0aGlzLnRhZ05hbWUuY2hhckF0KDApID09ICc8JykKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gdGhpcy50YWdOYW1lLnN1YnN0cmluZygwLCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3RhcnRFbmRPZmZzZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0RW5kT2Zmc2V0KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKQotCQkJcmV0dXJuIGZsYXROb2RlLmdldEVuZCgpOwotCQlyZXR1cm4gc3VwZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCWlmIChnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwgJiYgdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiAhaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQlyZXR1cm4gdGhpcy5lbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCS8qKgotCSAqIGdldFRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYWdOYW1lKCkgewotCQlpZiAodGhpcy50YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlyZXR1cm4gdGhpcy50YWdOYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0F0dHJpYnV0ZShTdHJpbmcgbmFtZSkgewotCQlyZXR1cm4gKGdldEF0dHJpYnV0ZU5vZGUobmFtZSkgIT0gbnVsbCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJcmV0dXJuIChnZXRBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gKHRoaXMuYXR0ck5vZGVzICE9IG51bGwgJiYgdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCkgPiAwKTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzRW5kVGFnKCkgewotCQlyZXR1cm4gKHRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGhhc1ByZWZpeCgpIHsKLQkJaWYgKHRoaXMudGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAodGhpcy50YWdOYW1lLmluZGV4T2YoJzonKSA8PSAwKQotCQkJcmV0dXJuIGZhbHNlOwotCQkvLyBleGNsdWRlIEpTUCB0YWcgaW4gdGFnIG5hbWUKLQkJaWYgKHRoaXMudGFnTmFtZS5jaGFyQXQoMCkgPT0gJzwnKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNTdGFydFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNTdGFydFRhZygpIHsKLQkJcmV0dXJuIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpZ25vcmVDYXNlKCkgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50Lmlnbm9yZUNhc2UoKSkgewotCQkJLy8gZXZlbiBpbiBjYXNlIGluc2Vuc2l0aXZlIGRvY3VtZW50LCBpZiBoYXZpbmcgcHJlZml4LCBpdCdzIGNhc2UKLQkJCS8vIHNlbnNpdGl2ZSB0YWcKLQkJCXJldHVybiAhaGFzUHJlZml4KCk7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBBdHRyIGluc2VydEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyLCBpbnQgaW5kZXgpIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlpZiAoYXR0ci5nZXRPd25lckVsZW1lbnQoKSAhPSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQl0aGlzLmF0dHJOb2RlcyA9IG5ldyBOb2RlTGlzdEltcGwoKTsKLQkJdGhpcy5hdHRyTm9kZXMuaW5zZXJ0Tm9kZShhdHRyLCBpbmRleCk7Ci0JCWF0dHIuc2V0T3duZXJFbGVtZW50KHRoaXMpOwotCi0JCW5vdGlmeUF0dHJSZXBsYWNlZChhdHRyLCBudWxsKTsKLQkJcmV0dXJuIGF0dHI7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0QmVmb3JlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc2hvdWxkIHRocm93IERPTUV4Y2VwdGlvbiBpbnN0ZWFkIG9mIHJldHVybiBudWxsPwotCQlpZiAobmV3Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIWlzQ29udGFpbmVyKCkpIHsgLy8gbmV2ZXIgYmUgY29udGFpbmVyCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5ISUVSQVJDSFlfUkVRVUVTVF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKG5ld0NoaWxkLmdldE5vZGVUeXBlKCkgIT0gVEVYVF9OT0RFKSB7Ci0JCQlpZiAoaXNKU1BDb250YWluZXIoKSB8fCBpc0NEQVRBQ29udGFpbmVyKCkpIHsgLy8gYWNjZXB0cyBvbmx5Ci0JCQkJLy8gVGV4dAotCQkJCS8vIGNoaWxkCi0JCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBzdXBlci5pbnNlcnRCZWZvcmUobmV3Q2hpbGQsIHJlZkNoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NEQVRBQ29udGFpbmVyKCkgewotCQkvLyB1c2UgQmxvY2tNYWtlciBpbnN0ZWFkIG9mIENNRWxlbWVudERlY2xhcmF0aW9uCi0JCS8vIGJlY2F1c2UgPHN0eWxlPiBhbmQgPHNjcmlwdD4gaW4gWEhUTUwgaXMgbm90IENEQVRBIGNvbnRlbnQgdHlwZQotCQlJRE9NTW9kZWwgbW9kZWwgPSBnZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJyb3IKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOyAvLyBlcm9yCi0JCVJlZ2lvblBhcnNlciBwYXJzZXIgPSBzdHJ1Y3R1cmVkRG9jdW1lbnQuZ2V0UGFyc2VyKCk7Ci0JCWlmIChwYXJzZXIgPT0gbnVsbCB8fCAhKHBhcnNlciBpbnN0YW5jZW9mIFhNTFNvdXJjZVBhcnNlcikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoKChYTUxTb3VyY2VQYXJzZXIpIHBhcnNlcikuZ2V0QmxvY2tNYXJrZXIodGhpcy50YWdOYW1lKSAhPSBudWxsKTsKLQkJLyoKLQkJICogQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7IGlmIChkZWNsID09IG51bGwpCi0JCSAqIHJldHVybiBmYWxzZTsgaWYgKGRlY2wgaW5zdGFuY2VvZiBDTU5vZGVXcmFwcGVyKSB7IGRlY2wgPQotCQkgKiAoQ01FbGVtZW50RGVjbGFyYXRpb24pKChDTU5vZGVXcmFwcGVyKWRlY2wpLmdldE9yaWdpbk5vZGUoKTsgaWYKLQkJICogKGRlY2wgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOyB9IGlmIChkZWNsIGluc3RhbmNlb2YKLQkJICogVExERWxlbWVudERlY2xhcmF0aW9uKSB7IFN0cmluZyBjb250ZW50ID0KLQkJICogKChUTERFbGVtZW50RGVjbGFyYXRpb24pZGVjbCkuZ2V0Qm9keWNvbnRlbnQoKTsgaWYgKGNvbnRlbnQgPT0KLQkJICogbnVsbCkgcmV0dXJuIGZhbHNlOyByZXR1cm4KLQkJICogY29udGVudC5lcXVhbHMoSlNQMTFUTEROYW1lcy5DT05URU5UX1RBR0RFUEVOREVOVCk7IH0gaWYKLQkJICogKCFpc0dsb2JhbFRhZygpKSByZXR1cm4gZmFsc2U7IHJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09Ci0JCSAqIENNRWxlbWVudERlY2xhcmF0aW9uLkNEQVRBKTsKLQkJICovCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQlpZiAoaXNFbXB0eVRhZygpIHx8ICFpc0NvbnRhaW5lcigpKSB7Ci0JCQlmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCX0KLQkJZWxzZSB7Ci0JCQlmbGF0Tm9kZSA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyBtdXN0IGJlIGdlbmVyYXRlZAotCQl9Ci0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmIChpc0NvbW1lbnRUYWcoKSkgewotCQkJcmV0dXJuIChpc05lc3RlZENsb3NlZENvbW1lbnQocmVnaW9uVHlwZSkgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKTsKLQkJfQotCQlpZiAoaXNKU1BUYWcoKSkgewotCQkJcmV0dXJuIGlzTmVzdGVkQ2xvc2VkKHJlZ2lvblR5cGUpOwotCQl9Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9DTE9TRSk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDbG9zZWQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZENsb3NlZENvbW1lbnQoU3RyaW5nIHJlZ2lvblR5cGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0NvbW1lbnRUYWcoKSB7Ci0JCXJldHVybiB0aGlzLmlzQ29tbWVudFRhZzsKLQl9Ci0KLQkvKioKLQkgKiBpc0NvbnRhaW5lciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJaWYgKGlzQ29tbWVudFRhZygpKSB7Ci0JCQlDb21tZW50RWxlbWVudEFkYXB0ZXIgYWRhcHRlciA9IChDb21tZW50RWxlbWVudEFkYXB0ZXIpIGdldEFkYXB0ZXJGb3IoQ29tbWVudEVsZW1lbnRBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlyZXR1cm4gKGFkYXB0ZXIuaXNDb250YWluZXIoKSk7Ci0JCQl9Ci0JCQlyZXR1cm4gKGdldERlY2xhcmF0aW9uKCkgPT0gbnVsbCk7Ci0JCX0KLQkJaWYgKGlzSlNQVGFnKCkpIHsKLQkJCS8vIGV4Y2x1ZGUgSlNQIGRpcmVjdGl2ZQotCQkJcmV0dXJuIChtYXRjaFRhZ05hbWUoSlNQVGFnLkpTUF9TQ1JJUFRMRVQpIHx8IG1hdGNoVGFnTmFtZShKU1BUYWcuSlNQX0RFQ0xBUkFUSU9OKSB8fCBtYXRjaFRhZ05hbWUoSlNQVGFnLkpTUF9FWFBSRVNTSU9OKSk7Ci0JCX0KLQkJaWYgKCFpc1hNTFRhZygpKSB7IC8vIG5vbi1YTUwgdGFnCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBkZWNsID0gZ2V0RGVjbGFyYXRpb24oKTsKLQkJCWlmIChkZWNsID09IG51bGwpCi0JCQkJcmV0dXJuIGZhbHNlOyAvLyB1bmRlZmluZWQgdGFnCi0JCQlyZXR1cm4gKGRlY2wuZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSk7Ci0JCX0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXNFbXB0eVRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VtcHR5VGFnKCkgewotCQlpZiAoaXNKU1BUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJaWYgKGlzQ29tbWVudFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoIWlzWE1MVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiB0aGlzLmlzRW1wdHlUYWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFbmRUYWcoKSB7Ci0JCXJldHVybiAoaGFzRW5kVGFnKCkgJiYgIWhhc1N0YXJ0VGFnKCkgJiYgIWhhc0NoaWxkTm9kZXMoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNHbG9iYWxUYWcoKSB7Ci0JCXJldHVybiAhaGFzUHJlZml4KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJbXBsaWNpdFRhZygpIHsKLQkJaWYgKGhhc1N0YXJ0VGFnKCkgfHwgaGFzRW5kVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCS8vIG1ha2Ugc3VyZSB0aGlzIGlzIGluIHRoZSBkb2N1bWVudCB0cmVlCi0JCS8vIGJlY2F1c2UgaWYgbm90IGluIHRoZSBkb2N1bWVudCB0cmVlLCBubyB0YWdzIGFyZSBnZW5lcmF0ZWQgeWV0Ci0JCXJldHVybiAoZ2V0Q29udGFpbmVyRG9jdW1lbnQoKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0pTUENvbnRhaW5lcigpIHsKLQkJcmV0dXJuIChpc0pTUFRhZygpICYmICFpc0NvbW1lbnRUYWcoKSAmJiBpc0NvbnRhaW5lcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBpc0pTUFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0pTUFRhZygpIHsKLQkJcmV0dXJuIHRoaXMuaXNKU1BUYWc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdGFydFRhZ0Nsb3NlZCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOyAvLyB3aWxsIGJlIGdlbmVyYXRlZAotCQlTdHJpbmcgcmVnaW9uVHlwZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAoaXNDb21tZW50VGFnKCkpIHsKLQkJCXJldHVybiAoaXNOZXN0ZWRDbG9zZWRDb21tZW50KHJlZ2lvblR5cGUpIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSk7Ci0JCX0KLQkJaWYgKGlzSlNQVGFnKCkpIHsKLQkJCWlmIChpc0NvbnRhaW5lcigpKQotCQkJCXJldHVybiB0cnVlOyAvLyBzdGFydCB0YWcgYWx3YXlzIGhhcyBhIHNpbmdsZSByZWdpb24KLQkJCXJldHVybiBpc0Nsb3NlZE5lc3RlZERpcmVjdGl2ZShyZWdpb25UeXBlKTsKLQkJfQotCQlyZXR1cm4gKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzQ2xvc2VkTmVzdGVkRGlyZWN0aXZlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGZpbmFsIGJvb2xlYW4gaXNYTUxUYWcoKSB7Ci0JCWlmIChpc0pTUFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgIWRvY3VtZW50LmlzWE1MVHlwZSgpKSB7Ci0JCQkvLyBldmVuIGluIG5vbi1YTUwgZG9jdW1lbnQsIGlmIGhhdmluZyBwcmVmaXgsIGl0J3MgWE1MIHRhZwotCQkJcmV0dXJuIGhhc1ByZWZpeCgpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIG1hdGNoRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpZiAoaXNKU1BUYWcoKSAmJiAhaXNDb21tZW50VGFnKCkpIHsKLQkJCXJldHVybiAoaW1wbC5pc0pTUFRhZygpICYmICFpbXBsLmlzQ29tbWVudFRhZygpKTsKLQkJfQotCQlyZXR1cm4gbWF0Y2hUYWdOYW1lKGVsZW1lbnQuZ2V0VGFnTmFtZSgpKTsKLQl9Ci0KLQkvKioKLQkgKiBtYXRjaFRhZ05hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBtYXRjaFRhZ05hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiAodGhpcy50YWdOYW1lID09IG51bGwpOwotCQlpZiAodGhpcy50YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghaWdub3JlQ2FzZSgpKQotCQkJcmV0dXJuIHRoaXMudGFnTmFtZS5lcXVhbHModGFnTmFtZSk7Ci0JCXJldHVybiB0aGlzLnRhZ05hbWUuZXF1YWxzSWdub3JlQ2FzZSh0YWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBub3RpZnlBdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld0F0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gb2xkQXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXByb3RlY3RlZCB2b2lkIG5vdGlmeUF0dHJSZXBsYWNlZChBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cikgewotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBnZXRDb250YWluZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmF0dHJSZXBsYWNlZCh0aGlzLCBuZXdBdHRyLCBvbGRBdHRyKTsKLQl9Ci0KLQkvKioKLQkgKiBub3RpZnlWYWx1ZUNoYW5nZWQgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5RW5kVGFnQ2hhbmdlZCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5lbmRUYWdDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC5zdGFydFRhZ0NoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gcHJlZmVyRW1wdHlUYWcoKSB7Ci0JCWlmIChoYXNDaGlsZE5vZGVzKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmIChpc0pTUFRhZygpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoaXNDb21tZW50VGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCWlmICghaXNYTUxUYWcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZGVjbCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAoZGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZW1vdmVBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlKEF0dHIgb2xkQXR0cikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChvbGRBdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmICh0aGlzLmF0dHJOb2RlcyA9PSBudWxsKSB7IC8vIG5vIGF0dHJpYnV0ZQotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX0ZPVU5EX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyICE9IG9sZEF0dHIpCi0JCQkJY29udGludWU7Ci0KLQkJCS8vIGZvdW5kCi0JCQl0aGlzLmF0dHJOb2Rlcy5yZW1vdmVOb2RlKGkpOwotCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0KLQkJCW5vdGlmeUF0dHJSZXBsYWNlZChudWxsLCBhdHRyKTsKLQkJCXJldHVybiBhdHRyOwotCQl9Ci0KLQkJLy8gbm90IGZvdW5kCi0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQXR0cmlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBBdHRyIHJlbW92ZUF0dHJpYnV0ZU5vZGUoU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoIWF0dHIubWF0Y2hOYW1lKG5hbWUpKQotCQkJCWNvbnRpbnVlOwotCi0JCQkvLyBmb3VuZAotCQkJdGhpcy5hdHRyTm9kZXMucmVtb3ZlTm9kZShpKTsKLQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCi0JCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgQXR0ciByZW1vdmVBdHRyaWJ1dGVOb2RlTlMoU3RyaW5nIHVyaSwgU3RyaW5nIG5hbWUpIHsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBpbnZhbGlkIHBhcmFtZXRlcgotCQlpZiAodGhpcy5hdHRyTm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBhdHRyaWJ1dGUKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSB0aGlzLmF0dHJOb2Rlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCWlmIChhdHRyID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlTdHJpbmcgbG9jYWxOYW1lID0gYXR0ci5nZXRMb2NhbE5hbWUoKTsKLQkJCWlmIChsb2NhbE5hbWUgPT0gbnVsbCB8fCAhbG9jYWxOYW1lLmVxdWFscyhuYW1lKSkKLQkJCQljb250aW51ZTsKLQkJCVN0cmluZyBuc1VSSSA9IGF0dHIuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0JCQlpZiAodXJpID09IG51bGwpIHsKLQkJCQlpZiAobnNVUkkgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobnNVUkkgPT0gbnVsbCB8fCAhbnNVUkkuZXF1YWxzKHVyaSkpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQkvLyBmb3VuZAotCQkJdGhpcy5hdHRyTm9kZXMucmVtb3ZlTm9kZShpKTsKLQkJCWF0dHIuc2V0T3duZXJFbGVtZW50KG51bGwpOwotCi0JCQlub3RpZnlBdHRyUmVwbGFjZWQobnVsbCwgYXR0cik7Ci0JCQlyZXR1cm4gYXR0cjsKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBub3QgZm91bmQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgbmFtZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJlbW92ZUF0dHJpYnV0ZU5vZGVOUyh1cmksIG5hbWUpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUF0dHJpYnV0ZXMgbWV0aG9kCi0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlQXR0cmlidXRlcygpIHsKLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIHRoaXMuYXR0ck5vZGVzLml0ZW0oaSk7Ci0JCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJYXR0ci5zZXRPd25lckVsZW1lbnQobnVsbCk7Ci0JCQkJbm90aWZ5QXR0clJlcGxhY2VkKG51bGwsIGF0dHIpOwotCQkJfQotCQl9Ci0KLQkJdGhpcy5hdHRyTm9kZXMgPSBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgRWxlbWVudCByZW1vdmVFbmRUYWcoKSB7Ci0JCWlmICghaGFzRW5kVGFnKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZUxpc3RJbXBsIGF0dHJOb2RlcyA9IHRoaXMuYXR0ck5vZGVzOwotCQl0aGlzLmF0dHJOb2RlcyA9IG51bGw7IC8vIG5vdCB0byBjb3B5IGF0dHJpYnV0ZXMKLQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSBjbG9uZU5vZGUoZmFsc2UpOwotCQl0aGlzLmF0dHJOb2RlcyA9IGF0dHJOb2RlczsKLQkJaWYgKGVuZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gbW92ZSB0aGUgZW5kIGZsYXQgbm9kZSB0byB0aGUgZW5kIHRhZwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCXJldHVybiBlbmQ7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVtb3ZlU3RhcnRUYWcoKSB7Ci0JCXJlbW92ZUF0dHJpYnV0ZXMoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgYXR0cmlidXRlIHZhbHVlcyBmcm9tIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCWlmICh0aGlzLmF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlpbnQgbGVuZ3RoID0gdGhpcy5hdHRyTm9kZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgdGhpcy5hdHRyTm9kZXMuaXRlbShpKTsKLQkJCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlhdHRyLnJlc2V0UmVnaW9ucygpOwotCQkJfQotCQl9Ci0KLQkJc3VwZXIucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7IC8vIGZvciBjaGlsZHJlbgotCi0JCXRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBzZXRBdHRyaWJ1dGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gdmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuYW1lID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlBdHRyIGF0dHIgPSBnZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsgLy8gY2hhbmdlIHZhbHVlCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuZXcgYXR0cmlidXRlCi0JCURvY3VtZW50IGRvYyA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlhdHRyID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZShuYW1lKTsKLQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7Ci0JCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JfQotCi0JLyoqCi0JICogc2V0QXR0cmlidXRlTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLkF0dHIKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqLwotCXB1YmxpYyBBdHRyIHNldEF0dHJpYnV0ZU5vZGUoQXR0ciBuZXdBdHRyKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG5ld0F0dHIgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0KLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBuZXdBdHRyOwotCQlFbGVtZW50IG93bmVyID0gYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKG93bmVyICE9IG51bGwpIHsKLQkJCWlmIChvd25lciA9PSB0aGlzKQotCQkJCXJldHVybiBudWxsOyAvLyBub3RoaW5nIHRvIGRvCi0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTlVTRV9BVFRSSUJVVEVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJQXR0ciBvbGRBdHRyID0gcmVtb3ZlQXR0cmlidXRlTm9kZShuZXdBdHRyLmdldE5hbWUoKSk7Ci0JCWFwcGVuZEF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCXJldHVybiBvbGRBdHRyOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBBdHRyIHNldEF0dHJpYnV0ZU5vZGVOUyhBdHRyIG5ld0F0dHIpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAobmV3QXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgdG8gZG8KLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5ld0F0dHI7Ci0JCUVsZW1lbnQgb3duZXIgPSBhdHRyLmdldE93bmVyRWxlbWVudCgpOwotCQlpZiAob3duZXIgIT0gbnVsbCkgewotCQkJaWYgKG93bmVyID09IHRoaXMpCi0JCQkJcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgdG8gZG8KLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOVVNFX0FUVFJJQlVURV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgbmFtZSA9IG5ld0F0dHIuZ2V0TG9jYWxOYW1lKCk7Ci0JCVN0cmluZyB1cmkgPSBuZXdBdHRyLmdldE5hbWVzcGFjZVVSSSgpOwotCQlBdHRyIG9sZEF0dHIgPSByZW1vdmVBdHRyaWJ1dGVOb2RlTlModXJpLCBuYW1lKTsKLQkJYXBwZW5kQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJcmV0dXJuIG9sZEF0dHI7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHdlIHNob3VsZCBjaGVjayBmb3IgYW5kIHRocm93IE5BTUVTUEFDRV9FUlIsIGFjY29yZGluZyB0byBzcGVjLiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVOUyhTdHJpbmcgdXJpLCBTdHJpbmcgcXVhbGlmaWVkTmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHF1YWxpZmllZE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCS8vIHNlZSBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTM5NTUyCi0JCS8vIGZpeCBwcm92aWRlZCBieSBWYWxlbnRpbiBCYWNpdQotCQlpbnQgaW5kZXggPSBxdWFsaWZpZWROYW1lLmluZGV4T2YoJzonKTsKLQkJU3RyaW5nIGxvY2FsTmFtZSA9IGluZGV4ICE9IC0xID8gcXVhbGlmaWVkTmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxKSA6IHF1YWxpZmllZE5hbWU7Ci0KLQkJQXR0ciBhdHRyID0gZ2V0QXR0cmlidXRlTm9kZU5TKHVyaSwgbG9jYWxOYW1lKTsKLQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZSk7IC8vIGNoYW5nZSB2YWx1ZQotCQl9Ci0JCWVsc2UgewotCi0JCQkvLyBuZXcgYXR0cmlidXRlCi0JCQlEb2N1bWVudCBkb2MgPSBnZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jICE9IG51bGwpIHsKLQkJCQlhdHRyID0gZG9jLmNyZWF0ZUF0dHJpYnV0ZU5TKHVyaSwgcXVhbGlmaWVkTmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlKHZhbHVlKTsKLQkJCQkJYXBwZW5kQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRDb21tZW50VGFnKGJvb2xlYW4gaXNDb21tZW50VGFnKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pc0NvbW1lbnRUYWcgPSBpc0NvbW1lbnRUYWc7Ci0JfQotCi0JLyoqCi0JICogc2V0RW1wdHlUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGlzRW1wdHlUYWcKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbXB0eVRhZyhib29sZWFuIGlzRW1wdHlUYWcpIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmlzRW1wdHlUYWcgPSBpc0VtcHR5VGFnOwotCX0KLQotCS8qKgotCSAqIHNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKi8KLQl2b2lkIHNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCXRoaXMuZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZmxhdE5vZGU7Ci0KLQkJTm9kZUNvbnRhaW5lciBwYXJlbnQgPSAoTm9kZUNvbnRhaW5lcikgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCXBhcmVudC5zeW5jQ2hpbGRFZGl0YWJsZVN0YXRlKHRoaXMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogc2V0SlNQVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBpc0pTUFRhZwotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEpTUFRhZyhib29sZWFuIGlzSlNQVGFnKSB7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5pc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5pc0pTUFRhZyA9IGlzSlNQVGFnOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWVzcGFjZVVSSShTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRoaXMubmFtZXNwYWNlVVJJID0gbmFtZXNwYWNlVVJJOwotCX0KLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE93bmVyRG9jdW1lbnQoRG9jdW1lbnQgb3duZXJEb2N1bWVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCXN1cGVyLnNldE93bmVyRG9jdW1lbnQob3duZXJEb2N1bWVudCwgZGVlcCk7Ci0KLQkJaWYgKHRoaXMuYXR0ck5vZGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaW50IGxlbmd0aCA9IHRoaXMuYXR0ck5vZGVzLmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSB0aGlzLmF0dHJOb2Rlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWF0dHIuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50KTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJSURPTU5vZGUgcGFyZW50ID0gKElET01Ob2RlKSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlpbnQgcHJlZml4TGVuZ3RoID0gKHByZWZpeCAhPSBudWxsID8gcHJlZml4Lmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZyBsb2NhbE5hbWUgPSBnZXRMb2NhbE5hbWUoKTsKLQkJaWYgKHByZWZpeExlbmd0aCA9PSAwKSB7Ci0JCQlpZiAobG9jYWxOYW1lID09IG51bGwgfHwgbG9jYWxOYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQkvLyBpbnZhbGlkIGxvY2FsIG5hbWUKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQlzZXRUYWdOYW1lKGxvY2FsTmFtZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnQgbG9jYWxMZW5ndGggPSAobG9jYWxOYW1lICE9IG51bGwgPyBsb2NhbE5hbWUubGVuZ3RoKCkgOiAwKTsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHByZWZpeExlbmd0aCArIDEgKyBsb2NhbExlbmd0aCk7Ci0JCQlidWZmZXIuYXBwZW5kKHByZWZpeCk7Ci0JCQlidWZmZXIuYXBwZW5kKCc6Jyk7Ci0JCQlpZiAobG9jYWxOYW1lICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChsb2NhbE5hbWUpOwotCQkJc2V0VGFnTmFtZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQotCQlib29sZWFuIGNoYW5nZUVuZFRhZyA9IGhhc0VuZFRhZygpOwotCQlub3RpZnlTdGFydFRhZ0NoYW5nZWQoKTsKLQkJaWYgKGNoYW5nZUVuZFRhZykKLQkJCW5vdGlmeUVuZFRhZ0NoYW5nZWQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZmxhdE5vZGUKLQkgKi8KLQl2b2lkIHNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRUYWdOYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VGFnTmFtZShTdHJpbmcgdGFnTmFtZSkgewotCQl0aGlzLnRhZ05hbWUgPSB0YWdOYW1lOwotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCVN0cmluZyB0YWdOYW1lID0gZ2V0VGFnTmFtZSgpOwotCQlpZiAoaGFzU3RhcnRUYWcoKSkKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCWlmIChpc0VtcHR5VGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKCcvJyk7Ci0JCWlmIChoYXNFbmRUYWcoKSkgewotCQkJYnVmZmVyLmFwcGVuZCgnLycpOwotCQkJYnVmZmVyLmFwcGVuZCh0YWdOYW1lKTsKLQkJfQotCQlpZiAoYnVmZmVyLmxlbmd0aCgpID09IDApCi0JCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnQCcpOwotCQkJYnVmZmVyLmFwcGVuZChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi50b1N0cmluZygpKTsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoJ0AnKTsKLQkJCWJ1ZmZlci5hcHBlbmQoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnRvU3RyaW5nKCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5vZGUoQXR0ciBpZEF0dHIsIGJvb2xlYW4gaXNJZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IHN1cHBvcnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDRjZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9FbnRpdHlJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHk7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLS8qKgotICogRW50aXR5SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgRW50aXR5SW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgRW50aXR5IHsKLQotCXByaXZhdGUgU3RyaW5nIG5hbWUgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIG5vdGF0aW9uTmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8qKgotCSAqIEVudGl0eUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdHlJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEVudGl0eUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5SW1wbChFbnRpdHlJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy5wdWJsaWNJZCA9IHRoYXQucHVibGljSWQ7Ci0JCQl0aGlzLnN5c3RlbUlkID0gdGhhdC5zeXN0ZW1JZDsKLQkJCXRoaXMubm90YXRpb25OYW1lID0gdGhhdC5ub3RhdGlvbk5hbWU7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCUVudGl0eUltcGwgY2xvbmVkID0gbmV3IEVudGl0eUltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIGVuY29kaW5nCi0JICogb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0RW5jb2RpbmcoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIEVOVElUWV9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vdGF0aW9uTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vdGF0aW9uTmFtZSgpIHsKLQkJcmV0dXJuIHRoaXMubm90YXRpb25OYW1lOwotCX0KLQotCS8qKgotCSAqIGdldFB1YmxpY0lkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0UHVibGljSWQoKSB7Ci0JCXJldHVybiB0aGlzLnB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIGdldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiB0aGlzLnN5c3RlbUlkOwotCX0KLQotCS8qKgotCSAqIDxwPgotCSAqIEVYUEVSSU1FTlRBTCEgQmFzZWQgb24gdGhlIDxhCi0JICogaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9XRC1ET00tTGV2ZWwtMy1Db3JlLTIwMDEwNjA1Jz5Eb2N1bWVudAotCSAqIE9iamVjdCBNb2RlbCAoRE9NKSBMZXZlbCAzIENvcmUgV29ya2luZyBEcmFmdCBvZiA1IEp1bmUgMjAwMS4gPC9hPi4KLQkgKiA8cD4KLQkgKiBBbiBhdHRyaWJ1dGUgc3BlY2lmeWluZywgYXMgcGFydCBvZiB0aGUgdGV4dCBkZWNsYXJhdGlvbiwgdGhlIHZlcnNpb24KLQkgKiBudW1iZXIgb2YgdGhpcyBlbnRpdHksIHdoZW4gaXQgaXMgYW4gZXh0ZXJuYWwgcGFyc2VkIGVudGl0eS4gVGhpcyBpcwotCSAqIDxjb2RlPm51bGw8L2NvZGU+IG90aGVyd2lzZS4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0VmVyc2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogPHA+Ci0JICogRVhQRVJJTUVOVEFMISBCYXNlZCBvbiB0aGUgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1dELURPTS1MZXZlbC0zLUNvcmUtMjAwMTA2MDUnPkRvY3VtZW50Ci0JICogT2JqZWN0IE1vZGVsIChET00pIExldmVsIDMgQ29yZSBXb3JraW5nIERyYWZ0IG9mIDUgSnVuZSAyMDAxLiA8L2E+LgotCSAqIDxwPgotCSAqIEFuIGF0dHJpYnV0ZSBzcGVjaWZ5aW5nLCBhcyBwYXJ0IG9mIHRoZSB0ZXh0IGRlY2xhcmF0aW9uLCB0aGUgZW5jb2RpbmcKLQkgKiBvZiB0aGlzIGVudGl0eSwgd2hlbiBpdCBpcyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGlzIGlzCi0JICogPGNvZGU+bnVsbDwvY29kZT4gb3RoZXJ3aXNlLgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmNvZGluZyhqYXZhLmxhbmcuU3RyaW5nIGVuY29kaW5nKSB7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXROb3RhdGlvbk5hbWUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5vdGF0aW9uTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vdGF0aW9uTmFtZShTdHJpbmcgbm90YXRpb25OYW1lKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5ub3RhdGlvbk5hbWUgPSBub3RhdGlvbk5hbWU7Ci0JfQotCi0JLyoqCi0JICogc2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHVibGljSWQoU3RyaW5nIHB1YmxpY0lkKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXRoaXMuc3lzdGVtSWQgPSBzeXN0ZW1JZDsKLQl9Ci0KLQkvKioKLQkgKiA8cD4KLQkgKiBFWFBFUklNRU5UQUwhIEJhc2VkIG9uIHRoZSA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvV0QtRE9NLUxldmVsLTMtQ29yZS0yMDAxMDYwNSc+RG9jdW1lbnQKLQkgKiBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMyBDb3JlIFdvcmtpbmcgRHJhZnQgb2YgNSBKdW5lIDIwMDEuIDwvYT4uCi0JICogPHA+Ci0JICogQW4gYXR0cmlidXRlIHNwZWNpZnlpbmcsIGFzIHBhcnQgb2YgdGhlIHRleHQgZGVjbGFyYXRpb24sIHRoZSB2ZXJzaW9uCi0JICogbnVtYmVyIG9mIHRoaXMgZW50aXR5LCB3aGVuIGl0IGlzIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkuIFRoaXMgaXMKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBvdGhlcndpc2UuCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZlcnNpb24oamF2YS5sYW5nLlN0cmluZyB2ZXJzaW9uKSB7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WG1sRW5jb2RpbmcoKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0VudGl0eVJlZmVyZW5jZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MmQ0MDc1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvRW50aXR5UmVmZXJlbmNlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBFbnRpdHlSZWZlcmVuY2UgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIEVudGl0eVJlZmVyZW5jZUltcGwgZXh0ZW5kcyBOb2RlSW1wbCBpbXBsZW1lbnRzIEVudGl0eVJlZmVyZW5jZSB7Ci0KLQlwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKLQotCS8qKgotCSAqIEVudGl0eVJlZmVyZW5jZUltcGwgY29uc3RydWN0b3IKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5UmVmZXJlbmNlSW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBFbnRpdHlSZWZlcmVuY2VJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIEVudGl0eVJlZmVyZW5jZUltcGwKLQkgKi8KLQlwcm90ZWN0ZWQgRW50aXR5UmVmZXJlbmNlSW1wbChFbnRpdHlSZWZlcmVuY2VJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQl9Ci0JfQotCi0JLyoqCi0JICogY2xvbmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBkZWVwCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHVibGljIE5vZGUgY2xvbmVOb2RlKGJvb2xlYW4gZGVlcCkgewotCQlFbnRpdHlSZWZlcmVuY2VJbXBsIGNsb25lZCA9IG5ldyBFbnRpdHlSZWZlcmVuY2VJbXBsKHRoaXMpOwotCQlub3RpZnlVc2VyRGF0YUhhbmRsZXJzKFVzZXJEYXRhSGFuZGxlci5OT0RFX0NMT05FRCwgY2xvbmVkKTsKLQkJcmV0dXJuIGNsb25lZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlTmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkgewotCQlpZiAodGhpcy5uYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlyZXR1cm4gdGhpcy5uYW1lOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBFTlRJVFlfUkVGRVJFTkNFX05PREU7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0ludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODE2NmVkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi0vKioKLSAqIFRocm93biBhbiBpbnZhbGlkIGNoYXJhY3RlciBpcyBzcGVjaWZpZWQgaW4gOiBYTUxOb2RlI3NldFNvdXJjZShTdHJpbmcpCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLQotCS8qKgotCSAqIERlZmF1bHQgPGNvZGU+c2VyaWFsVmVyc2lvblVJRDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQlwcml2YXRlIGNoYXIgaW52YWxpZENoYXIgPSAwOwotCXByaXZhdGUgaW50IG9mZnNldCA9IC0xOwotCi0JLyoqCi0JICovCi0JcHVibGljIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24oU3RyaW5nIHMpIHsKLQkJc3VwZXIocyk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24oU3RyaW5nIHMsIGNoYXIgYykgewotCQlzdXBlcihzKTsKLQkJdGhpcy5pbnZhbGlkQ2hhciA9IGM7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24oU3RyaW5nIHMsIGNoYXIgYywgaW50IG9mZnNldCkgewotCQlzdXBlcihzKTsKLQkJdGhpcy5pbnZhbGlkQ2hhciA9IGM7Ci0JCXRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBjaGFyIGdldEludmFsaWRDaGFyKCkgewotCQlyZXR1cm4gdGhpcy5pbnZhbGlkQ2hhcjsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldE9mZnNldCgpIHsKLQkJcmV0dXJuIHRoaXMub2Zmc2V0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQVGFnLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L0pTUFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWM3YmJiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvSlNQVGFnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLS8qKgotICogSlNQVGFnIGludGVyZmFjZQotICovCi1wdWJsaWMgaW50ZXJmYWNlIEpTUFRhZyB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX0NMT1NFID0gIi0tJT4iOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfT1BFTiA9ICI8JS0tIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBERUNMQVJBVElPTl9UT0tFTiA9ICIhIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBESVJFQ1RJVkVfVE9LRU4gPSAiQCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhQUkVTU0lPTl9UT0tFTiA9ICI9IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfREVDTEFSQVRJT04gPSAianNwOmRlY2xhcmF0aW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFID0gImpzcDpkaXJlY3RpdmUiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OID0gImpzcDpleHByZXNzaW9uIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVCA9ICJqc3A6cm9vdCI7Ly8kTk9OLU5MUy0xJAotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUID0gImpzcDpzY3JpcHRsZXQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19DTE9TRSA9ICIlPiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX09QRU4gPSAiPCUiOy8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L01vZGVsUGFyc2VyQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzZkNGExLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTW9kZWxQYXJzZXJBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kZWxQYXJzZXJBZGFwdGVyIGV4dGVuZHMgSU5vZGVBZGFwdGVyIHsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkJlSW1wbGljaXRUYWcoRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGNhbkNvbnRhaW4oRWxlbWVudCBlbGVtZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBFbGVtZW50IGNyZWF0ZUNvbW1lbnRFbGVtZW50KERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgZGF0YSwgYm9vbGVhbiBpc0pTUFRhZyk7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRWxlbWVudCBjcmVhdGVJbXBsaWNpdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmluZFJvb3ROYW1lKFN0cmluZyB0YWdOYW1lKTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRW5kVGFnKElET01FbGVtZW50IGVsZW1lbnQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlQ29udGFpbmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVDb250YWluZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyOTZiNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVDb250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0KLS8qKgotICogTm9kZUNvbnRhaW5lciBjbGFzcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUNvbnRhaW5lciBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTm9kZSwgTm9kZUxpc3QgewotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBDaGlsZE5vZGVzQ2FjaGUgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0JCXByaXZhdGUgTm9kZSBjdXJDaGlsZCA9IG51bGw7Ci0JCXByaXZhdGUgaW50IGN1ckluZGV4ID0gLTE7Ci0JCXByaXZhdGUgaW50IGxlbmd0aCA9IDA7Ci0KLQkJQ2hpbGROb2Rlc0NhY2hlKCkgewotCQkJaW5pdGlhbGl6ZUNhY2hlKCk7Ci0JCX0KLQotCQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJCS8vIGF0b21pYwotCQkJcmV0dXJuIHRoaXMubGVuZ3RoOwotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVDYWNoZSgpIHsKLQkJCS8vIG5vdGUgd2UgdXNlIHRoZSBvdXR0ZXIgb2JqZWN0cyBsb2Nrb2JqZWN0Ci0JCQkvLyAoc2luY2Ugd2UgYXJlIHVzaW5nIHRoZWlyICJjaGlsZHJlbiIuCi0JCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCQlmb3IgKE5vZGUgY2hpbGQgPSBmaXJzdENoaWxkOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQkJdGhpcy5sZW5ndGgrKzsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQkJaWYgKHRoaXMubGVuZ3RoID09IDApCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybiBudWxsOwotCQkJCWlmIChpbmRleCA+PSB0aGlzLmxlbmd0aCkKLQkJCQkJcmV0dXJuIG51bGw7Ci0KLQkJCQlpZiAodGhpcy5jdXJJbmRleCA8IDApIHsgLy8gZmlyc3QgdGltZQotCQkJCQlpZiAoaW5kZXggKiAyID49IHRoaXMubGVuZ3RoKSB7IC8vIHNlYXJjaCBmcm9tIHRoZSBsYXN0Ci0JCQkJCQl0aGlzLmN1ckluZGV4ID0gdGhpcy5sZW5ndGggLSAxOwotCQkJCQkJdGhpcy5jdXJDaGlsZCA9IGxhc3RDaGlsZDsKLQkJCQkJfSBlbHNlIHsgLy8gc2VhcmNoIGZyb20gdGhlIGZpcnN0Ci0JCQkJCQl0aGlzLmN1ckluZGV4ID0gMDsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSBmaXJzdENoaWxkOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGluZGV4ID09IHRoaXMuY3VySW5kZXgpCi0JCQkJCXJldHVybiB0aGlzLmN1ckNoaWxkOwotCi0JCQkJaWYgKGluZGV4ID4gdGhpcy5jdXJJbmRleCkgewotCQkJCQl3aGlsZSAoaW5kZXggPiB0aGlzLmN1ckluZGV4KSB7Ci0JCQkJCQl0aGlzLmN1ckluZGV4Kys7Ci0JCQkJCQl0aGlzLmN1ckNoaWxkID0gdGhpcy5jdXJDaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsgLy8gaW5kZXggPCB0aGlzLmN1ckluZGV4Ci0JCQkJCXdoaWxlIChpbmRleCA8IHRoaXMuY3VySW5kZXgpIHsKLQkJCQkJCXRoaXMuY3VySW5kZXgtLTsKLQkJCQkJCXRoaXMuY3VyQ2hpbGQgPSB0aGlzLmN1ckNoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmV0dXJuIHRoaXMuY3VyQ2hpbGQ7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE5vZGVMaXN0IGNoaWxkTm9kZXNDYWNoZSA9IG51bGw7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkNoaWxkRWRpdGFibGUgPSB0cnVlOwotCU5vZGVJbXBsIGZpcnN0Q2hpbGQgPSBudWxsOwotCU5vZGVJbXBsIGxhc3RDaGlsZCA9IG51bGw7Ci0KLQlPYmplY3QgbG9ja09iamVjdCA9IG5ldyBieXRlWzBdOwotCi0JLyoqCi0JICogTm9kZUNvbnRhaW5lciBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vZGVDb250YWluZXIgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gdGhhdAotCSAqICAgICAgICAgICAgTm9kZUNvbnRhaW5lcgotCSAqLwotCXByb3RlY3RlZCBOb2RlQ29udGFpbmVyKE5vZGVDb250YWluZXIgdGhhdCkgewotCQlzdXBlcih0aGF0KTsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmRDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5ld0NoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIGluc2VydEJlZm9yZShuZXdDaGlsZCwgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogY2xvbmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBjb250YWluZXIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNsb25lQ2hpbGROb2RlcyhOb2RlIG5ld1BhcmVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQgPT0gdGhpcykKLQkJCXJldHVybjsKLQkJaWYgKCEobmV3UGFyZW50IGluc3RhbmNlb2YgTm9kZUNvbnRhaW5lcikpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZUNvbnRhaW5lciBjb250YWluZXIgPSAoTm9kZUNvbnRhaW5lcikgbmV3UGFyZW50OwotCQljb250YWluZXIucmVtb3ZlQ2hpbGROb2RlcygpOwotCi0JCWZvciAoTm9kZSBjaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlOb2RlIGNsb25lZCA9IGNoaWxkLmNsb25lTm9kZShkZWVwKTsKLQkJCWlmIChjbG9uZWQgIT0gbnVsbCkKLQkJCQljb250YWluZXIuYXBwZW5kQ2hpbGQoY2xvbmVkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gdGhpczsKLQl9Ci0KLQkvKioKLQkgKiBnZXRGaXJzdENoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldEZpcnN0Q2hpbGQoKSB7Ci0JCXJldHVybiB0aGlzLmZpcnN0Q2hpbGQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0TGFzdENoaWxkIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldExhc3RDaGlsZCgpIHsKLQkJcmV0dXJuIHRoaXMubGFzdENoaWxkOwotCX0KLQotCS8qKgotCSAqIGdldExlbmd0aCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpZiAodGhpcy5maXJzdENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5jaGlsZE5vZGVzQ2FjaGUgPT0gbnVsbCkKLQkJCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG5ldyBDaGlsZE5vZGVzQ2FjaGUoKTsKLQkJCXJldHVybiB0aGlzLmNoaWxkTm9kZXNDYWNoZS5nZXRMZW5ndGgoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBnZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJU3RyaW5nIHNvdXJjZSA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQotCQlmb3IgKE5vZGVJbXBsIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSAoTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBjaGlsZC5nZXRTb3VyY2UoKTsKLQkJCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyBzb3VyY2UgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJfQotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBoYXNDaGlsZE5vZGVzIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbgotCSAqLwotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkTm9kZXMoKSB7Ci0JCXJldHVybiAodGhpcy5maXJzdENoaWxkICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEJlZm9yZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gcmVmQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBuZXdDaGlsZCwgTm9kZSByZWZDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIG5vdGhpbmcgdG8gZG8KLQkJaWYgKHJlZkNoaWxkICE9IG51bGwgJiYgcmVmQ2hpbGQuZ2V0UGFyZW50Tm9kZSgpICE9IHRoaXMpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaWYgKCFpc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChuZXdDaGlsZCA9PSByZWZDaGlsZCkKLQkJCXJldHVybiBuZXdDaGlsZDsgLy8gbm90aGluZyB0byBkbwotCi0JCWlmIChuZXdDaGlsZC5nZXROb2RlVHlwZSgpID09IERPQ1VNRU5UX0ZSQUdNRU5UX05PREUpIHsKLQkJCS8vIGluc2VydCBjaGlsZCBub2RlcyBpbnN0ZWFkCi0JCQlmb3IgKE5vZGUgY2hpbGQgPSBuZXdDaGlsZC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gbmV3Q2hpbGQuZ2V0Rmlyc3RDaGlsZCgpKSB7Ci0JCQkJbmV3Q2hpbGQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCWluc2VydEJlZm9yZShjaGlsZCwgcmVmQ2hpbGQpOwotCQkJfQotCQkJcmV0dXJuIG5ld0NoaWxkOwotCQl9Ci0JCS8vIHN5bmNocm9uaXplZCBpbiBjYXNlIGFub3RoZXIgdGhyZWFkIGlzIGdldHRpbmcgaXRlbSwgb3IgbGVuZ3RoCi0JCXN5bmNocm9uaXplZCAobG9ja09iamVjdCkgewotCQkJdGhpcy5jaGlsZE5vZGVzQ2FjaGUgPSBudWxsOyAvLyBpbnZhbGlkYXRlIGNoaWxkIG5vZGVzIGNhY2hlCi0JCX0KLQotCQlOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgbmV3Q2hpbGQ7Ci0JCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIHJlZkNoaWxkOwotCQlOb2RlSW1wbCBwcmV2ID0gbnVsbDsKLQkJTm9kZSBvbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChvbGRQYXJlbnQgIT0gbnVsbCkKLQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCWlmIChuZXh0ID09IG51bGwpIHsKLQkJCXByZXYgPSB0aGlzLmxhc3RDaGlsZDsKLQkJCXRoaXMubGFzdENoaWxkID0gY2hpbGQ7Ci0JCX0gZWxzZSB7Ci0JCQlwcmV2ID0gKE5vZGVJbXBsKSBuZXh0LmdldFByZXZpb3VzU2libGluZygpOwotCQkJbmV4dC5zZXRQcmV2aW91c1NpYmxpbmcoY2hpbGQpOwotCQl9Ci0JCWlmIChwcmV2ID09IG51bGwpCi0JCQl0aGlzLmZpcnN0Q2hpbGQgPSBjaGlsZDsKLQkJZWxzZQotCQkJcHJldi5zZXROZXh0U2libGluZyhjaGlsZCk7Ci0JCWNoaWxkLnNldFByZXZpb3VzU2libGluZyhwcmV2KTsKLQkJY2hpbGQuc2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0JCWNoaWxkLnNldFBhcmVudE5vZGUodGhpcyk7Ci0JCS8vIG1ha2Ugc3VyZSBoYXZpbmcgdGhlIHNhbWUgb3duZXIgZG9jdW1lbnQKLQkJaWYgKGNoaWxkLmdldE93bmVyRG9jdW1lbnQoKSA9PSBudWxsKSB7Ci0JCQlpZiAoZ2V0Tm9kZVR5cGUoKSA9PSBET0NVTUVOVF9OT0RFKSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudCgoRG9jdW1lbnQpIHRoaXMpOwotCQkJfSBlbHNlIHsKLQkJCQljaGlsZC5zZXRPd25lckRvY3VtZW50KGdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQl9Ci0JCX0KLQotCQlub3RpZnlDaGlsZFJlcGxhY2VkKGNoaWxkLCBudWxsKTsKLQotCQlyZXR1cm4gY2hpbGQ7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNDaGlsZEVkaXRhYmxlKCkgewotCQlpZiAoIWZDaGlsZEVkaXRhYmxlKSB7Ci0JCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBnZXRNb2RlbCgpOwotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwuaXNSZXBhcnNpbmcoKSkgewotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQ2hpbGRFZGl0YWJsZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NvbnRhaW5lciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyBOb2RlIGl0ZW0oaW50IGluZGV4KSB7Ci0JCWlmICh0aGlzLmZpcnN0Q2hpbGQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCWlmICh0aGlzLmNoaWxkTm9kZXNDYWNoZSA9PSBudWxsKQotCQkJCXRoaXMuY2hpbGROb2Rlc0NhY2hlID0gbmV3IENoaWxkTm9kZXNDYWNoZSgpOwotCQkJcmV0dXJuIHRoaXMuY2hpbGROb2Rlc0NhY2hlLml0ZW0oaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbm90aWZ5Q2hpbGRSZXBsYWNlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlDaGlsZFJlcGxhY2VkKE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0Q29udGFpbmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc3luY0NoaWxkRWRpdGFibGVTdGF0ZShuZXdDaGlsZCk7Ci0KLQkJRE9NTW9kZWxJbXBsIG1vZGVsID0gKERPTU1vZGVsSW1wbCkgZG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCW1vZGVsLmNoaWxkUmVwbGFjZWQodGhpcywgbmV3Q2hpbGQsIG9sZENoaWxkKTsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZW1vdmVDaGlsZChOb2RlIG9sZENoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG9sZENoaWxkLmdldFBhcmVudE5vZGUoKSAhPSB0aGlzKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfRk9VTkRfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJaWYgKCFpc0NoaWxkRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJLy8gc3luY2hyb25pemVkIGluIGNhc2UgYW5vdGhlciB0aHJlYWQgaXMgZ2V0dGluZyBpdGVtLCBvciBsZW5ndGgKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQl0aGlzLmNoaWxkTm9kZXNDYWNoZSA9IG51bGw7IC8vIGludmFsaWRhdGUgY2hpbGQgbm9kZXMgY2FjaGUKLQkJfQotCi0JCU5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBvbGRDaGlsZDsKLQkJTm9kZUltcGwgcHJldiA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJY2hpbGQuc2V0RWRpdGFibGUodHJ1ZSwgdHJ1ZSk7IC8vIGNsZWFyIFJlYWRPbmx5IGZsYWdzCi0KLQkJaWYgKHByZXYgPT0gbnVsbCkKLQkJCXRoaXMuZmlyc3RDaGlsZCA9IG5leHQ7Ci0JCWVsc2UKLQkJCXByZXYuc2V0TmV4dFNpYmxpbmcobmV4dCk7Ci0JCWlmIChuZXh0ID09IG51bGwpCi0JCQl0aGlzLmxhc3RDaGlsZCA9IHByZXY7Ci0JCWVsc2UKLQkJCW5leHQuc2V0UHJldmlvdXNTaWJsaW5nKHByZXYpOwotCQljaGlsZC5zZXRQcmV2aW91c1NpYmxpbmcobnVsbCk7Ci0JCWNoaWxkLnNldE5leHRTaWJsaW5nKG51bGwpOwotCQljaGlsZC5zZXRQYXJlbnROb2RlKG51bGwpOwotCi0JCW5vdGlmeUNoaWxkUmVwbGFjZWQobnVsbCwgY2hpbGQpOwotCi0JCXJldHVybiBjaGlsZDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVDaGlsZE5vZGVzIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIHJlbW92ZUNoaWxkTm9kZXMoKSB7Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCU5vZGUgbmV4dENoaWxkID0gbnVsbDsKLQkJZm9yIChOb2RlIGNoaWxkID0gZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IG5leHRDaGlsZCkgewotCQkJbmV4dENoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50Ci0JICogQHBhcmFtIGZpcnN0Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbGFzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgcmVtb3ZlQ2hpbGROb2RlcyhOb2RlIGZpcnN0Q2hpbGQsIE5vZGUgbGFzdENoaWxkKSB7Ci0JCWlmICghaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJaWYgKGdldE5vZGVUeXBlKCkgPT0gRE9DVU1FTlRfTk9ERSkKLQkJCWRvY3VtZW50ID0gKERvY3VtZW50KSB0aGlzOwotCQllbHNlCi0JCQlkb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRG9jdW1lbnRGcmFnbWVudCBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKLQkJaWYgKGZyYWdtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAoZmlyc3RDaGlsZCA9PSBudWxsKQotCQkJZmlyc3RDaGlsZCA9IGdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGxhc3RDaGlsZCA9PSBudWxsKQotCQkJbGFzdENoaWxkID0gZ2V0TGFzdENoaWxkKCk7Ci0JCU5vZGUgbmV4dENoaWxkID0gbnVsbDsKLQkJZm9yIChOb2RlIGNoaWxkID0gZmlyc3RDaGlsZDsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBuZXh0Q2hpbGQpIHsKLQkJCW5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlyZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQlmcmFnbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7Ci0JCQlpZiAoY2hpbGQgPT0gbGFzdENoaWxkKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIGZyYWdtZW50OwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNDaGlsZEVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJcmV0dXJuIG5ld0NoaWxkOwotCQlpZiAobmV3Q2hpbGQgIT0gbnVsbCkKLQkJCWluc2VydEJlZm9yZShuZXdDaGlsZCwgb2xkQ2hpbGQpOwotCQlyZXR1cm4gcmVtb3ZlQ2hpbGQob2xkQ2hpbGQpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENoaWxkRWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSkgewotCQlpZiAoZkNoaWxkRWRpdGFibGUgPT0gZWRpdGFibGUpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCVJlYWRPbmx5Q29udHJvbGxlciByb2MgPSBSZWFkT25seUNvbnRyb2xsZXIuZ2V0SW5zdGFuY2UoKTsKLQkJTm9kZSBub2RlOwotCQlpZiAoZWRpdGFibGUpIHsKLQkJCWZvciAobm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJcm9jLnVubG9ja05vZGUoKElET01Ob2RlKSBub2RlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWZvciAobm9kZSA9IGdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJcm9jLmxvY2tOb2RlKChJRE9NTm9kZSkgbm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlmQ2hpbGRFZGl0YWJsZSA9IGVkaXRhYmxlOwotCQlub3RpZnlFZGl0YWJsZUNoYW5nZWQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzeW5jQ2hpbGRFZGl0YWJsZVN0YXRlKE5vZGUgY2hpbGQpIHsKLQkJUmVhZE9ubHlDb250cm9sbGVyIHJvYyA9IFJlYWRPbmx5Q29udHJvbGxlci5nZXRJbnN0YW5jZSgpOwotCQlpZiAoZkNoaWxkRWRpdGFibGUpIHsKLQkJCXJvYy51bmxvY2tOb2RlKChOb2RlSW1wbCkgY2hpbGQpOwotCQl9IGVsc2UgewotCQkJcm9jLmxvY2tOb2RlKChOb2RlSW1wbCkgY2hpbGQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjVlZmI1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNjMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuQWJzdHJhY3ROb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUltcGxlbWVudGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50RnJhZ21lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLlR5cGVJbmZvOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBOb2RlSW1wbCBjbGFzcwotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTm9kZUltcGwgZXh0ZW5kcyBBYnN0cmFjdE5vdGlmaWVyIGltcGxlbWVudHMgTm9kZSwgSURPTU5vZGUgewotCS8vIGRlZmluZSBvbmUgZW1wdHkgbm9kZWxpc3QsIGZvciByZXBlYXRlZCB1c2UKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBOb2RlTGlzdCBFTVBUWV9OT0RFX0xJU1QgPSBuZXcgTm9kZUxpc3RJbXBsKCk7Ci0KLQlwcml2YXRlIGJvb2xlYW4gZkRhdGFFZGl0YWJsZSA9IHRydWU7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIG5leHRTaWJsaW5nID0gbnVsbDsKLQotCXByaXZhdGUgRG9jdW1lbnRJbXBsIG93bmVyRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgTm9kZUltcGwgcGFyZW50Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlSW1wbCBwcmV2aW91c1NpYmxpbmcgPSBudWxsOwotCQotCXByaXZhdGUgSGFzaHRhYmxlIHVzZXJEYXRhVGFibGU9bnVsbDsKLQotCS8qKgotCSAqIE5vZGVJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIE5vZGVJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vZGVJbXBsCi0JICovCi0JcHJvdGVjdGVkIE5vZGVJbXBsKE5vZGVJbXBsIHRoYXQpIHsKLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5vd25lckRvY3VtZW50ID0gdGhhdC5vd25lckRvY3VtZW50OwotCQl9Ci0JfQotCi0JLyoqCi0JICogYXBwZW5kQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBuZXdDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBjb250YWlucyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjb250YWlucyhpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiAob2Zmc2V0ID49IGdldFN0YXJ0T2Zmc2V0KCkgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KCkpOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHBhcmFtIHRhZ05hbWUKLQkgKiBAcmV0dXJuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVET01FeGNlcHRpb25NZXNzYWdlKHNob3J0IHMsIFN0cmluZyB0YWdOYW1lKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkvLyBUT0RPOiBTaG91bGQgbG9jYWxpemUgdGhlc2UgbWVzc2FnZXMsIGFuZCBwcm92aWRlIC91IGVzY2FwZWQKLQkJLy8gdmVyc2lvbiBvZiB0YWdOYW1lCi0JCXJlc3VsdCA9IGxvb2t1cE1lc3NhZ2UocykgKyAiICIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcAotCSAqLwotCXB1YmxpYyBOYW1lZE5vZGVNYXAgZ2V0QXR0cmlidXRlcygpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDaGFyVmFsdWUoU3RyaW5nIG5hbWUpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZG9jdW1lbnQuZ2V0Q2hhclZhbHVlKG5hbWUpOwotCX0KLQotCS8qKgotCSAqIGdldENoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlTGlzdAotCSAqLwotCXB1YmxpYyBOb2RlTGlzdCBnZXRDaGlsZE5vZGVzKCkgewotCQkvLyBBcyBwZXIgRE9NIHNwZWMsIGNvcnJlY3QgYmVoYXZpb3IgZm9yIGdldENoaWxkTm9kZXMgaXMgdG8gcmV0dXJuIGEKLQkJLy8gemVybyBsZW5ndGggTm9kZUxpc3QsIG5vdCBudWxsLCB3aGVuIHRoZXJlIGFyZSBubyBjaGlsZHJlbi4KLQkJLy8gV2UnbGwgdXNlIGEgY29tbW9uIGluc3RhbmNlIG9mIGFuIGVtcHR5IG5vZGUgbGlzdCwganVzdCB0byBwcmV2ZW50Ci0JCS8vIGNyZWF0aW5nIGEgdHJpdmFsIG9iamVjdCBtYW55IG1hbnkgdGltZXMuCi0KLQkJcmV0dXJuIEVNUFRZX05PREVfTElTVDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb21tb25BbmNlc3RvciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbW1vbkFuY2VzdG9yKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIG5hID0gbm9kZTsgbmEgIT0gbnVsbDsgbmEgPSBuYS5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWZvciAoTm9kZSB0YSA9IHRoaXM7IHRhICE9IG51bGw7IHRhID0gdGEuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQkJaWYgKHRhID09IG5hKQotCQkJCQlyZXR1cm4gdGE7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICogZ2V0Q29udGFpbmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRDb250YWluZXJEb2N1bWVudCgpIHsKLQkJZm9yIChOb2RlIG5vZGUgPSB0aGlzOyBub2RlICE9IG51bGw7IG5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlyZXR1cm4gKERvY3VtZW50KSBub2RlOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEVuZE9mZnNldCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlOb2RlIG5vZGUgPSB0aGlzOwotCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCQlyZXR1cm4gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJfQotCi0JCQlOb2RlIGxhc3QgPSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaWYgKGxhc3QgIT0gbnVsbCkgeyAvLyBkaWcgaW50byB0aGUgbGFzdAotCQkJCW5vZGUgPSBsYXN0OwotCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSAoKE5vZGVJbXBsKSBub2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQkJcmV0dXJuIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0KLQkJCU5vZGUgcHJldiA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiAhPSBudWxsKSB7IC8vIG1vdmUgdG8gdGhlIHByZXZpb3VzCi0JCQkJbm9kZSA9IHByZXY7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQlub2RlID0gbnVsbDsKLQkJCXdoaWxlIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQkJCX0KLQkJCQlOb2RlIHBhcmVudFByZXYgPSBwYXJlbnQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJaWYgKHBhcmVudFByZXYgIT0gbnVsbCkgeyAvLyBtb3ZlIHRvIHRoZSBwcmV2aW91cwotCQkJCQlub2RlID0gcGFyZW50UHJldjsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCXBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgRmFjdG9yeVJlZ2lzdHJ5IGdldEZhY3RvcnlSZWdpc3RyeSgpIHsKLQkJSURPTU1vZGVsIG1vZGVsID0gZ2V0TW9kZWwoKTsKLQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCUZhY3RvcnlSZWdpc3RyeSByZWcgPSBtb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQkJCWlmIChyZWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gcmVnOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldEZpcnN0Q2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0Rmlyc3RDaGlsZCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmZsYXROb2RlKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEluZGV4KCkgewotCQlOb2RlIHBhcmVudCA9IGdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCQlpbnQgaW5kZXggPSAwOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCA9PSB0aGlzKQotCQkJCXJldHVybiBpbmRleDsKLQkJCWluZGV4Kys7Ci0JCX0KLQkJcmV0dXJuIC0xOyAvLyBlcnJvcgotCX0KLQotCS8qKgotCSAqIGdldExhc3RDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBnZXRMYXN0Q2hpbGQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZmxhdE5vZGUpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TG9jYWxOYW1lKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYW4ganVzdCByZWZlciB0byB0aGUgb3duaW5nIGRvY3VtZW50Ci0JICovCi0JcHVibGljIElET01Nb2RlbCBnZXRNb2RlbCgpIHsKLQkJaWYgKHRoaXMub3duZXJEb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuZ2V0TW9kZWwoKTsKLQl9Ci0KLQkvKioKLQkgKiBhbGwgYnV0IGF0dHIgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0TmFtZVJlZ2lvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5leHRTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldE5leHRTaWJsaW5nKCkgewotCQlyZXR1cm4gdGhpcy5uZXh0U2libGluZzsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlQXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JTm9kZSBnZXROb2RlQXQoaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBwYXJlbnQgPSB0aGlzOwotCQlJRE9NTm9kZSBjaGlsZCA9IChJRE9NTm9kZSkgZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJaWYgKGNoaWxkLmdldEVuZE9mZnNldCgpIDw9IG9mZnNldCkgewotCQkJCWNoaWxkID0gKElET01Ob2RlKSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKGNoaWxkLmdldFN0YXJ0T2Zmc2V0KCkgPiBvZmZzZXQpIHsKLQkJCQlicmVhazsKLQkJCX0KLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGNoaWxkLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKSA+IG9mZnNldCkKLQkJCQkJcmV0dXJuIGNoaWxkOwotCQkJfQotCi0JCQkvLyBkaWcgbW9yZQotCQkJcGFyZW50ID0gY2hpbGQ7Ci0JCQljaGlsZCA9IChJRE9NTm9kZSkgcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCi0JCXJldHVybiBwYXJlbnQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE93bmVyRG9jdW1lbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudAotCSAqLwotCXB1YmxpYyBEb2N1bWVudCBnZXRPd25lckRvY3VtZW50KCkgewotCQlyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50OwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgZ2V0UGFyZW50Tm9kZSgpIHsKLQkJcmV0dXJuIHRoaXMucGFyZW50Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJldmlvdXNTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGdldFByZXZpb3VzU2libGluZygpIHsKLQkJcmV0dXJuIHRoaXMucHJldmlvdXNTaWJsaW5nOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMuZmxhdE5vZGUuZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIGdldFN0YXJ0T2Zmc2V0IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRTdGFydE9mZnNldCgpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIGdldFByZXZpb3VzU2libGluZygpOwotCQlpZiAocHJldiAhPSBudWxsKQotCQkJcmV0dXJuIHByZXYuZ2V0RW5kT2Zmc2V0KCk7Ci0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpCi0JCQkJcmV0dXJuIGVsZW1lbnQuZ2V0U3RhcnRFbmRPZmZzZXQoKTsKLQkJCXJldHVybiBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJLy8gZmluYWwgZmFsbGJhY2sgdG8gbG9vayBpbnRvIGZpcnN0IGNoaWxkCi0JCU5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7Ci0JCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNoaWxkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gY2hpbGQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkKLQkJCQlyZXR1cm4gY2hpbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXRGaXJzdENoaWxkKCk7Ci0JCX0KLQkJcmV0dXJuIDA7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCX0KLQotCS8qKgotCSAqIEV2ZXJ5IG5vZGUgKGluZGlyZWN0bHkpIGtub3dzIGl0cyBzdHJ1Y3R1cmVkRG9jdW1lbnQKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCXJldHVybiBnZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlyZXR1cm4gdGhpcy5mbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBhbGwgYnV0IGF0dHIgcmV0dXJuIG51bGwKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0VmFsdWVSZWdpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoKSB7Ci0JCXJldHVybiBnZXROb2RlVmFsdWUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaGFzQ2hpbGROb2RlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaGFzUHJvcGVydGllcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNQcm9wZXJ0aWVzKCkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0QmVmb3JlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBuZXdDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSByZWZDaGlsZAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5ld0NoaWxkLCBOb2RlIHJlZkNoaWxkKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLCBuZXcgU3RyaW5nKCkpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzQ2hpbGRFZGl0YWJsZSgpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBpc0NvbnRhaW5lciBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRhaW5lcigpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzRGF0YUVkaXRhYmxlKCkgewotCQlpZiAoIWZEYXRhRWRpdGFibGUpIHsKLQkJCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGdldE1vZGVsKCk7Ci0JCQlpZiAobW9kZWwgIT0gbnVsbCAmJiBtb2RlbC5pc1JlcGFyc2luZygpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZEYXRhRWRpdGFibGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0ZWQoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKSB7Ci0JCWlmICh0aGlzLm93bmVyRG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJRE9NSW1wbGVtZW50YXRpb24gaW1wbCA9IHRoaXMub3duZXJEb2N1bWVudC5nZXRJbXBsZW1lbnRhdGlvbigpOwotCQlpZiAoaW1wbCA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gaW1wbC5oYXNGZWF0dXJlKGZlYXR1cmUsIHZlcnNpb24pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGxvb2t1cE1lc3NhZ2Uoc2hvcnQgcykgewotCQkvLyBUT0RPOiBtYWtlIGxvY2FsaXplZCB2ZXJzaW9uCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlzd2l0Y2ggKHMpIHsKLQkJCWNhc2UgRE9NRXhjZXB0aW9uLklOVkFMSURfQ0hBUkFDVEVSX0VSUiA6Ci0JCQkJcmVzdWx0ID0gIklOVkFMSURfQ0hBUkFDVEVSX0VSUiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQotCQkJZGVmYXVsdCA6Ci0JCQkJcmVzdWx0ID0gbmV3IFN0cmluZygpOwotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogbm9ybWFsaXplIG1ldGhvZAotCSAqLwotCXB1YmxpYyB2b2lkIG5vcm1hbGl6ZSgpIHsKLQkJVGV4dEltcGwgcHJldlRleHQgPSBudWxsOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJc3dpdGNoIChjaGlsZC5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBURVhUX05PREUgOiB7Ci0JCQkJCWlmIChwcmV2VGV4dCA9PSBudWxsKSB7Ci0JCQkJCQlwcmV2VGV4dCA9IChUZXh0SW1wbCkgY2hpbGQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlUZXh0IHRleHQgPSAoVGV4dCkgY2hpbGQ7Ci0JCQkJCXJlbW92ZUNoaWxkKHRleHQpOwotCQkJCQlwcmV2VGV4dC5hcHBlbmRUZXh0KHRleHQpOwotCQkJCQljaGlsZCA9IHByZXZUZXh0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBFTEVNRU5UX05PREUgOiB7Ci0JCQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBjaGlsZDsKLQkJCQkJZWxlbWVudC5ub3JtYWxpemUoKTsKLQkJCQkJcHJldlRleHQgPSBudWxsOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXByZXZUZXh0ID0gbnVsbDsKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlFZGl0YWJsZUNoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlET01Nb2RlbEltcGwgbW9kZWwgPSAoRE9NTW9kZWxJbXBsKSBkb2N1bWVudC5nZXRNb2RlbCgpOwotCQlpZiAobW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJbW9kZWwuZWRpdGFibGVDaGFuZ2VkKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIG5vdGlmeVZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlWYWx1ZUNoYW5nZWQoKSB7Ci0JCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpIGdldENvbnRhaW5lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCXN5bmNEYXRhRWRpdGFibGVTdGF0ZSgpOwotCi0JCURPTU1vZGVsSW1wbCBtb2RlbCA9IChET01Nb2RlbEltcGwpIGRvY3VtZW50LmdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQltb2RlbC52YWx1ZUNoYW5nZWQodGhpcyk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIE5vZGUgcmVtb3ZlQ2hpbGQoTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9GT1VORF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogcmVtb3ZlQ2hpbGROb2RlcyBtZXRob2QKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVDaGlsZE5vZGVzKCkgewotCX0KLQotCS8qKgotCSAqIHJlbW92ZUNoaWxkTm9kZXMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50Ci0JICogQHBhcmFtIGZpcnN0Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbGFzdENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIERvY3VtZW50RnJhZ21lbnQgcmVtb3ZlQ2hpbGROb2RlcyhOb2RlIGZpcnN0Q2hpbGQsIE5vZGUgbGFzdENoaWxkKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gbmV3Q2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gb2xkQ2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUiwgbmV3IFN0cmluZygpKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgY2hpbGRyZW4gdmFsdWVzIGZyb20gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi4KLQkgKi8KLQl2b2lkIHJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpIHsKLQkJZm9yIChOb2RlSW1wbCBjaGlsZCA9IChOb2RlSW1wbCkgZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IChOb2RlSW1wbCkgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJY2hpbGQucmVzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKCk7Ci0JCX0KLQkJdGhpcy5mbGF0Tm9kZSA9IG51bGw7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2hpbGRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCS8vIG5vcAotCX0KLQotCXB1YmxpYyB2b2lkIHNldERhdGFFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlKSB7Ci0JCWlmIChmRGF0YUVkaXRhYmxlID09IGVkaXRhYmxlKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChlZGl0YWJsZSkgewotCQkJcm9jLnVubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlyb2MubG9ja0RhdGEodGhpcyk7Ci0JCX0KLQotCQlmRGF0YUVkaXRhYmxlID0gZWRpdGFibGU7Ci0KLQkJbm90aWZ5RWRpdGFibGVDaGFuZ2VkKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RWRpdGFibGUoYm9vbGVhbiBlZGl0YWJsZSwgYm9vbGVhbiBkZWVwKSB7Ci0JCWlmIChkZWVwKSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBnZXRGaXJzdENoaWxkKCk7Ci0JCQl3aGlsZSAobm9kZSAhPSBudWxsKSB7Ci0JCQkJbm9kZS5zZXRFZGl0YWJsZShlZGl0YWJsZSwgZGVlcCk7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJfQotCQl9Ci0JCXNldENoaWxkRWRpdGFibGUoZWRpdGFibGUpOwotCQlzZXREYXRhRWRpdGFibGUoZWRpdGFibGUpOwotCX0KLQotCS8qKgotCSAqIHNldE5leHRTaWJsaW5nIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXh0U2libGluZwotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5leHRTaWJsaW5nKE5vZGUgbmV4dFNpYmxpbmcpIHsKLQkJdGhpcy5uZXh0U2libGluZyA9IChOb2RlSW1wbCkgbmV4dFNpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICogc2V0Tm9kZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlVmFsdWUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXROb2RlVmFsdWUoU3RyaW5nIG5vZGVWYWx1ZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JfQotCi0JLyoqCi0JICogc2V0T3duZXJEb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb3duZXJEb2N1bWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQpIHsKLQkJdGhpcy5vd25lckRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgb3duZXJEb2N1bWVudDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRPd25lckRvY3VtZW50KERvY3VtZW50IG93bmVyRG9jdW1lbnQsIGJvb2xlYW4gZGVlcCkgewotCQl0aGlzLm93bmVyRG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSBvd25lckRvY3VtZW50OwotCi0JCWlmIChkZWVwKSB7Ci0JCQlmb3IgKE5vZGVJbXBsIGNoaWxkID0gKE5vZGVJbXBsKSBnZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gKE5vZGVJbXBsKSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJY2hpbGQuc2V0T3duZXJEb2N1bWVudChvd25lckRvY3VtZW50LCBkZWVwKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHNldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHBhcmVudE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRQYXJlbnROb2RlKE5vZGUgcGFyZW50Tm9kZSkgewotCQl0aGlzLnBhcmVudE5vZGUgPSAoTm9kZUltcGwpIHBhcmVudE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UHJlZml4KFN0cmluZyBwcmVmaXgpIHRocm93cyBET01FeGNlcHRpb24gewotCX0KLQotCS8qKgotCSAqIHNldFByZXZpb3VzU2libGluZyBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHJldmlvdXNTaWJsaW5nCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0UHJldmlvdXNTaWJsaW5nKE5vZGUgcHJldmlvdXNTaWJsaW5nKSB7Ci0JCXRoaXMucHJldmlvdXNTaWJsaW5nID0gKE5vZGVJbXBsKSBwcmV2aW91c1NpYmxpbmc7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0U291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJc2V0Tm9kZVZhbHVlKHNvdXJjZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3luY0RhdGFFZGl0YWJsZVN0YXRlKCkgewotCQlSZWFkT25seUNvbnRyb2xsZXIgcm9jID0gUmVhZE9ubHlDb250cm9sbGVyLmdldEluc3RhbmNlKCk7Ci0JCWlmIChmRGF0YUVkaXRhYmxlKSB7Ci0JCQlyb2MudW5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCQllbHNlIHsKLQkJCXJvYy5sb2NrRGF0YSh0aGlzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHRvU3RyaW5nIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBnZXROb2RlTmFtZSgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCWludCBzdGFydCA9IGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWlmIChzdGFydCA+PSAwKSB7Ci0JCQlpbnQgZW5kID0gZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlpZiAoZW5kID49IDApIHsKLQkJCQlyZXN1bHQgPSBlbmQgLSBzdGFydDsKLQkJCQlpZiAocmVzdWx0IDwgLTEpIHsKLQkJCQkJcmVzdWx0ID0gLTE7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgc2hvcnQgY29tcGFyZURvY3VtZW50UG9zaXRpb24oTm9kZSBvdGhlcikgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRCYXNlVVJJKCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgU3RyaW5nIHZlcnNpb24pIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHRDb250ZW50KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0TmFtZXNwYWNlKFN0cmluZyBuYW1lc3BhY2VVUkkpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VxdWFsTm9kZShOb2RlIGFyZykgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzU2FtZU5vZGUoTm9kZSBvdGhlcikgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9va3VwTmFtZXNwYWNlVVJJKFN0cmluZyBwcmVmaXgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGxvb2t1cFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgVHlwZUluZm8gZ2V0U2NoZW1hVHlwZUluZm8oKSB7Ci0JCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLCAiTm90IGltcGxlbWVudGVkIGluIHRoaXMgdmVyc2lvbi4iKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZCgpIHsKLQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsICJOb3QgaW1wbGVtZW50ZWQgaW4gdGhpcyB2ZXJzaW9uLiIpOyAvLyROT04tTkxTLTEkCi0JfQotCQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgb2JqZWN0IGZvciBhIG5vZGUgYXNzb2NpYXRlZCB0byBhIGtleS4KLQkgKiAKLQkgKiBAcGFyYW0ga2V5IFRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3QuCi0JICogQHJldHVybiBvYmplY3QgVGhlIG9iamVjdCBmb3IgdGhpcyBub2RlLCBhc3NvY2lhdGVkIHdpdGggdGhlIGtleSBwYXNzZWQKLQkgKiBvciBudWxsIGlmIHRoZXJlIHdhcyBub25lIHNldC4KLQkgKgotCSAqIEBzaW5jZSBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSkgewotCQkKLQkJaWYgKGtleT09bnVsbCkgcmV0dXJuIG51bGw7Ci0JCQotCQlpZiAodXNlckRhdGFUYWJsZSE9bnVsbCkgewotCQkJVXNlckRhdGFBbmRIYW5kbGVyIHVzZXJEYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUuZ2V0KGtleSk7Ci0JCQlpZiAodXNlckRhdGFBbmRIYW5kbGVyIT1udWxsKSB7Ci0JCQkJcmV0dXJuIHVzZXJEYXRhQW5kSGFuZGxlci5nZXREYXRhKCk7Ci0JCQl9IAotCQl9Ci0JCXJldHVybiBudWxsOwkKLQl9Ci0JCi0JLyoqCi0JICogU2V0cyB0aGUgdXNlciBkYXRhIGFuZCBoYW5kbGVyIGZvciBhIGtleQotCSAqIAotCSAqIEBwYXJhbSBrZXkgVGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIG9iamVjdC4KLQkgKiBAcGFyYW0gb2JqZWN0IFRoZSBvYmplY3QgZm9yIHRoaXMgbm9kZSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkgcGFzc2VkLgotCSAqIE51bGwgcGFzc2VkIHJlbW92ZXMgdGhlIGV4aXN0aW5nIGFzc29jaWF0aW9uIHRvIHRoZSBrZXkuCi0JICogQHBhcmFtIGhhbmRsZXIgVXNlckRhdGFIYW5kbGVyIGZvciB0aGUgdXNlcmRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5Ci0JICogQHJldHVybiBPYmplY3QgVGhlIHByZXZpb3VzIHVzZXJkYXRhIG9iamVjdCBpZiBzZXQsIG51bGwgaWYgaXQgd2FzIG5vbmUuICAKLQkgKiAKLQkgKiBAc2luY2UgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IHNldFVzZXJEYXRhKFN0cmluZyBrZXksIE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCi0JCVVzZXJEYXRhQW5kSGFuZGxlciBwcmV2aW91c0RhdGFBbmRIYW5kbGVyPW51bGw7Ci0JCQotCQkvL3JldHVybiBpbW1lZGlhdGVseSBmb3IgbnVsbCBrZXlzCi0JCWlmIChrZXkgPT1udWxsKSByZXR1cm4gbnVsbDsKLQkJCi0JCS8vcmVtb3ZlIGFzc29jaWF0aW9uIGZvciB0aGUga2V5IGlmIGRhdGEgaXMgbnVsbAotCQlpZiAoZGF0YT09bnVsbCkgewotCQkJaWYgKHVzZXJEYXRhVGFibGU9PW51bGwpIHJldHVybiBudWxsOwotCQkJCi0JCQkvL3NlZSBpZiB0aGVyZSBpcyBhIHByZXZpb3VzIHZhbHVlIHNldAotCQkJcHJldmlvdXNEYXRhQW5kSGFuZGxlciA9IChVc2VyRGF0YUFuZEhhbmRsZXIpIHVzZXJEYXRhVGFibGUuZ2V0KGtleSk7Ci0JCQlpZiAocHJldmlvdXNEYXRhQW5kSGFuZGxlciE9bnVsbCkgewotCQkJCXVzZXJEYXRhVGFibGUucmVtb3ZlKGtleSk7Ci0JCQkJcmV0dXJuIHByZXZpb3VzRGF0YUFuZEhhbmRsZXIuZ2V0RGF0YSgpOwotCQkJfQotCQkJLy90aGVyZSBpcyBubyBwcmV2aW91cyB2YWx1ZSBmb3VuZAotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQkJCi0JCS8vaWYgZGF0YSBwYXNzZWQgaXMgbm90IG51bGwKLQkJLy90aGUgZmlyc3QgZGF0YSBpbiB0aGUgaGFzaHRhYmxlCi0JCWlmICh1c2VyRGF0YVRhYmxlPT1udWxsKSB7Ci0JCQl1c2VyRGF0YVRhYmxlPW5ldyBIYXNodGFibGUoKTsKLQkJCVVzZXJEYXRhQW5kSGFuZGxlciB1c2VyRGF0YUFuZEhhbmRsZXI9bmV3IFVzZXJEYXRhQW5kSGFuZGxlcihkYXRhLGhhbmRsZXIpOwotCQkJdXNlckRhdGFUYWJsZS5wdXQoa2V5LHVzZXJEYXRhQW5kSGFuZGxlcik7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJCS8vdGhlcmUgaXMgYWxyZWFkeSBkYXRhIGluIHRoZSBoYXNodGFibGUKLQkJfSBlbHNlIHsKLQkJCVVzZXJEYXRhQW5kSGFuZGxlciB1c2VyRGF0YUFuZEhhbmRsZXI9bmV3IFVzZXJEYXRhQW5kSGFuZGxlcihkYXRhLGhhbmRsZXIpOwotCQkJcHJldmlvdXNEYXRhQW5kSGFuZGxlcj0oVXNlckRhdGFBbmRIYW5kbGVyKSB1c2VyRGF0YVRhYmxlLnB1dChrZXksdXNlckRhdGFBbmRIYW5kbGVyKTsKLQkJCQotCQkJLy9pZiB3ZSByZXBsYWNlIGEgdmFsdWUKLQkJCWlmIChwcmV2aW91c0RhdGFBbmRIYW5kbGVyIT1udWxsKQotCQkJCXJldHVybiBwcmV2aW91c0RhdGFBbmRIYW5kbGVyLmdldERhdGEoKTsKLQkJCWVsc2UgewotCQkJCXJldHVybiBudWxsOwotCQkJfQotCQl9Ci0JfQotCQotCS8qKgotCSAqIE5vdGlmaWVzIHRoZSBVc2VyRGF0YUhhbmRsZXJzIG9mIHRoZSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBvcGVyYXRpb24KLQkgKiBAcGFyYW0gZGVzdGluYXRpb24KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBub3RpZnlVc2VyRGF0YUhhbmRsZXJzKHNob3J0IG9wZXJhdGlvbiwgTm9kZSBkZXN0aW5hdGlvbikgewotCQkKLQkJaWYgKG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfQURPUFRFRCAKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVECi0JCQkJJiBvcGVyYXRpb24hPVVzZXJEYXRhSGFuZGxlci5OT0RFX0RFTEVURUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfSU1QT1JURUQKLQkJCQkmIG9wZXJhdGlvbiE9VXNlckRhdGFIYW5kbGVyLk5PREVfUkVOQU1FRCkKLQkJCXJldHVybjsgCi0JCQkKLQkJaWYgKHVzZXJEYXRhVGFibGUhPW51bGwpIHsKLQkJCUVudW1lcmF0aW9uIGtleXM9dXNlckRhdGFUYWJsZS5rZXlzKCk7Ci0JCQl3aGlsZSAoa2V5cy5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCVN0cmluZyBrZXk9KFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOyAvL3Nob3VsZCBhbHdheXMgYmUgYSBzdHJpbmcKLQkJCQlVc2VyRGF0YUFuZEhhbmRsZXIgZGF0YUFuZEhhbmRsZXIgPSAoVXNlckRhdGFBbmRIYW5kbGVyKSB1c2VyRGF0YVRhYmxlLmdldChrZXkpOwotCQkJCWlmIChkYXRhQW5kSGFuZGxlciE9bnVsbCkgewotCQkJCQlVc2VyRGF0YUhhbmRsZXIgZGF0YUhhbmRsZXI9ZGF0YUFuZEhhbmRsZXIuZ2V0SGFuZGxlcigpOwotCQkJCQlpZiAoZGF0YUhhbmRsZXIhPW51bGwpIHsKLQkJCQkJCWRhdGFIYW5kbGVyLmhhbmRsZShvcGVyYXRpb24sIGtleSwgZGF0YUFuZEhhbmRsZXIuZ2V0RGF0YSgpLCB0aGlzLCBkZXN0aW5hdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0JCi0JLyoqCi0JICogCi0JICogQ2xhc3MgZm9yIHVzZXIgZGF0YSBhbmQgVXNlckRhdGFIYW5kbGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFVzZXJEYXRhQW5kSGFuZGxlciBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0KLQkJLyoqCi0JCSAqIEdlbmVyYXRlZCBTZXJpYWwgSUQKLQkJICovCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ4NjA1MjEyMzczMTU0NDQ4NDBMOwotCQkvKioKLQkJICogR2VuZXJhdGVkIHNlcmlhbGl6YXRpb24gdmVyc2lvbgotCQkgKi8KLQkJCi0JCXByaXZhdGUgT2JqZWN0IGRhdGE7Ci0JCXByaXZhdGUgVXNlckRhdGFIYW5kbGVyIGhhbmRsZXI7Ci0JCQotCQlwdWJsaWMgVXNlckRhdGFBbmRIYW5kbGVyKE9iamVjdCBkYXRhLCBVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikKLQkJewotCQkJdGhpcy5kYXRhPWRhdGE7Ci0JCQl0aGlzLmhhbmRsZXI9aGFuZGxlcjsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpIHsKLQkJCXJldHVybiBkYXRhOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0RGF0YShPYmplY3QgZGF0YSkgewotCQkJdGhpcy5kYXRhID0gZGF0YTsKLQkJfQotCi0JCXB1YmxpYyBVc2VyRGF0YUhhbmRsZXIgZ2V0SGFuZGxlcigpIHsKLQkJCXJldHVybiBoYW5kbGVyOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0SGFuZGxlcihVc2VyRGF0YUhhbmRsZXIgaGFuZGxlcikgewotCQkJdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUl0ZXJhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTI3OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Ob2RlSXRlcmF0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20udHJhdmVyc2FsLk5vZGVJdGVyYXRvcjsKLQotLyoqCi0gKiBOb2RlSXRlcmF0b3JJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlSXRlcmF0b3JJbXBsIGltcGxlbWVudHMgTm9kZUl0ZXJhdG9yIHsKLQlwcml2YXRlIE5vZGVGaWx0ZXIgZmlsdGVyID0gbnVsbDsKLQlwcml2YXRlIE5vZGUgbmV4dE5vZGUgPSBudWxsOwotCi0JcHJpdmF0ZSBOb2RlIHJvb3ROb2RlID0gbnVsbDsKLQlwcml2YXRlIGludCB3aGF0VG9TaG93ID0gTm9kZUZpbHRlci5TSE9XX0FMTDsKLQotCS8qKgotCSAqIE5vZGVJdGVyYXRvckltcGwgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlOb2RlSXRlcmF0b3JJbXBsKE5vZGUgcm9vdE5vZGUsIGludCB3aGF0VG9TaG93LCBOb2RlRmlsdGVyIGZpbHRlcikgewotCQl0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7Ci0JCXRoaXMubmV4dE5vZGUgPSByb290Tm9kZTsKLQkJdGhpcy53aGF0VG9TaG93ID0gd2hhdFRvU2hvdzsKLQkJdGhpcy5maWx0ZXIgPSBmaWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFjY2VwdE5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmICh0aGlzLndoYXRUb1Nob3cgIT0gTm9kZUZpbHRlci5TSE9XX0FMTCkgewotCQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJCXN3aXRjaCAodGhpcy53aGF0VG9TaG93KSB7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfRUxFTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfQVRUUklCVVRFIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQVRUUklCVVRFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX1RFWFQgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0NEQVRBX1NFQ1RJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWV9SRUZFUkVOQ0UgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0VOVElUWSA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVOVElUWV9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19QUk9DRVNTSU5HX0lOU1RSVUNUSU9OIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19DT01NRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuQ09NTUVOVF9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE5vZGVGaWx0ZXIuU0hPV19ET0NVTUVOVCA6Ci0JCQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX1RZUEUgOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpCi0JCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgTm9kZUZpbHRlci5TSE9XX0RPQ1VNRU5UX0ZSQUdNRU5UIDoKLQkJCQkJaWYgKG5vZGVUeXBlICE9IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSkKLQkJCQkJCXJldHVybiBmYWxzZTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBOb2RlRmlsdGVyLlNIT1dfTk9UQVRJT04gOgotCQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5OT1RBVElPTl9OT0RFKQotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmICh0aGlzLmZpbHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gKHRoaXMuZmlsdGVyLmFjY2VwdE5vZGUobm9kZSkgPT0gTm9kZUZpbHRlci5GSUxURVJfQUNDRVBUKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRhY2hlcyB0aGUgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBmcm9tIHRoZSBzZXQgd2hpY2ggaXQgaXRlcmF0ZWQKLQkgKiBvdmVyLCByZWxlYXNpbmcgYW55IGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIGFuZCBwbGFjaW5nIHRoZSBpdGVyYXRvciBpbgotCSAqIHRoZSBJTlZBTElEIHN0YXRlLiBBZnRlciA8Y29kZT5kZXRhY2g8L2NvZGU+IGhhcyBiZWVuIGludm9rZWQsIGNhbGxzCi0JICogdG8gPGNvZGU+bmV4dE5vZGU8L2NvZGU+IG9yIDxjb2RlPnByZXZpb3VzTm9kZTwvY29kZT4gd2lsbCByYWlzZQotCSAqIHRoZSBleGNlcHRpb24gSU5WQUxJRF9TVEFURV9FUlIuCi0JICovCi0JcHVibGljIHZvaWQgZGV0YWNoKCkgewotCQl0aGlzLnJvb3ROb2RlID0gbnVsbDsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXRoaXMuZmlsdGVyID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdmFsdWUgb2YgdGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgY2hpbGRyZW4gb2YgZW50aXR5Ci0JICogcmVmZXJlbmNlIG5vZGVzIGFyZSB2aXNpYmxlIHRvIHRoZSBpdGVyYXRvci4gSWYgZmFsc2UsIHRoZXkgYW5kIHRoZWlyCi0JICogZGVzY2VuZGFudHMgd2lsbCBiZSByZWplY3RlZC4gTm90ZSB0aGF0IHRoaXMgcmVqZWN0aW9uIHRha2VzIHByZWNlZGVuY2UKLQkgKiBvdmVyIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGFuZCB0aGUgZmlsdGVyLiBBbHNvIG5vdGUgdGhhdCB0aGlzIGlzCi0JICogY3VycmVudGx5IHRoZSBvbmx5IHNpdHVhdGlvbiB3aGVyZSA8Y29kZT5Ob2RlSXRlcmF0b3JzPC9jb2RlPiBtYXkKLQkgKiByZWplY3QgYSBjb21wbGV0ZSBzdWJ0cmVlIHJhdGhlciB0aGFuIHNraXBwaW5nIGluZGl2aWR1YWwgbm9kZXMuIDxicj4KLQkgKiA8YnI+Ci0JICogVG8gcHJvZHVjZSBhIHZpZXcgb2YgdGhlIGRvY3VtZW50IHRoYXQgaGFzIGVudGl0eSByZWZlcmVuY2VzIGV4cGFuZGVkCi0JICogYW5kIGRvZXMgbm90IGV4cG9zZSB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGl0c2VsZiwgdXNlIHRoZQotCSAqIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzIHRvIGhpZGUgdGhlIGVudGl0eSByZWZlcmVuY2Ugbm9kZSBhbmQKLQkgKiBzZXQgPGNvZGU+ZXhwYW5kRW50aXR5UmVmZXJlbmNlczwvY29kZT4gdG8gdHJ1ZSB3aGVuIGNyZWF0aW5nIHRoZQotCSAqIGl0ZXJhdG9yLiBUbyBwcm9kdWNlIGEgdmlldyBvZiB0aGUgZG9jdW1lbnQgdGhhdCBoYXMgZW50aXR5IHJlZmVyZW5jZQotCSAqIG5vZGVzIGJ1dCBubyBlbnRpdHkgZXhwYW5zaW9uLCB1c2UgdGhlIDxjb2RlPndoYXRUb1Nob3c8L2NvZGU+IGZsYWdzCi0JICogdG8gc2hvdyB0aGUgZW50aXR5IHJlZmVyZW5jZSBub2RlIGFuZCBzZXQKLQkgKiA8Y29kZT5leHBhbmRFbnRpdHlSZWZlcmVuY2VzPC9jb2RlPiB0byBmYWxzZS4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBnZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKCkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gdXNlZCB0byBzY3JlZW4gbm9kZXMuCi0JICovCi0JcHVibGljIE5vZGVGaWx0ZXIgZ2V0RmlsdGVyKCkgewotCQlyZXR1cm4gdGhpcy5maWx0ZXI7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBOb2RlIGdldE5leHROb2RlKCkgewotCQlpZiAodGhpcy5uZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgb2xkTmV4dCA9IHRoaXMubmV4dE5vZGU7Ci0JCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJaWYgKGNoaWxkICE9IG51bGwpIHsKLQkJCXRoaXMubmV4dE5vZGUgPSBjaGlsZDsKLQkJCXJldHVybiBvbGROZXh0OwotCQl9Ci0JCWZvciAoTm9kZSBub2RlID0gdGhpcy5uZXh0Tm9kZTsgbm9kZSAhPSBudWxsICYmIG5vZGUgIT0gdGhpcy5yb290Tm9kZTsgbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlOb2RlIG5leHQgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5uZXh0Tm9kZSA9IG5leHQ7Ci0JCQkJcmV0dXJuIG9sZE5leHQ7Ci0JCQl9Ci0JCX0KLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JCXJldHVybiBvbGROZXh0OwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgTm9kZSBnZXRQcmV2aW91c05vZGUoKSB7Ci0JCWlmICh0aGlzLm5leHROb2RlID09IHRoaXMucm9vdE5vZGUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBwcmV2ID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgPT0gbnVsbCkgewotCQkJcHJldiA9IHRoaXMucm9vdE5vZGU7IC8vIG5ldmVyIG51bGwKLQkJfSBlbHNlIHsKLQkJCXByZXYgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgPT0gbnVsbCkgewotCQkJCXRoaXMubmV4dE5vZGUgPSB0aGlzLm5leHROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQkJCX0KLQkJfQotCQlOb2RlIGxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl3aGlsZSAobGFzdCAhPSBudWxsKSB7Ci0JCQlwcmV2ID0gbGFzdDsKLQkJCWxhc3QgPSBwcmV2LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCXRoaXMubmV4dE5vZGUgPSBwcmV2OwotCQlyZXR1cm4gdGhpcy5uZXh0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcm9vdCBub2RlIG9mIHRoZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+LCBhcyBzcGVjaWZpZWQgd2hlbiBpdAotCSAqIHdhcyBjcmVhdGVkLgotCSAqLwotCXB1YmxpYyBOb2RlIGdldFJvb3QoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgYXR0cmlidXRlIGRldGVybWluZXMgd2hpY2ggbm9kZSB0eXBlcyBhcmUgcHJlc2VudGVkIHZpYSB0aGUKLQkgKiBpdGVyYXRvci4gVGhlIGF2YWlsYWJsZSBzZXQgb2YgY29uc3RhbnRzIGlzIGRlZmluZWQgaW4gdGhlCi0JICogPGNvZGU+Tm9kZUZpbHRlcjwvY29kZT4gaW50ZXJmYWNlLiBOb2RlcyBub3QgYWNjZXB0ZWQgYnkKLQkgKiA8Y29kZT53aGF0VG9TaG93PC9jb2RlPiB3aWxsIGJlIHNraXBwZWQsIGJ1dCB0aGVpciBjaGlsZHJlbiBtYXkgc3RpbGwKLQkgKiBiZSBjb25zaWRlcmVkLiBOb3RlIHRoYXQgdGhpcyBza2lwIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUgZmlsdGVyLCBpZgotCSAqIGFueS4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFdoYXRUb1Nob3coKSB7Ci0JCXJldHVybiB0aGlzLndoYXRUb1Nob3c7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgbmV4dCBub2RlIGluIHRoZSBzZXQgYW5kIGFkdmFuY2VzIHRoZSBwb3NpdGlvbiBvZiB0aGUKLQkgKiBpdGVyYXRvciBpbiB0aGUgc2V0LiBBZnRlciBhIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gaXMgY3JlYXRlZCwKLQkgKiB0aGUgZmlyc3QgY2FsbCB0byA8Y29kZT5uZXh0Tm9kZSgpPC9jb2RlPiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIGluCi0JICogdGhlIHNldC4KLQkgKiAKLQkgKiBAcmV0dXJuIFRoZSBuZXh0IDxjb2RlPk5vZGU8L2NvZGU+IGluIHRoZSBzZXQgYmVpbmcgaXRlcmF0ZWQgb3Zlciwgb3IKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGFyZSBubyBtb3JlIG1lbWJlcnMgaW4gdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBuZXh0Tm9kZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlmb3IgKE5vZGUgbm9kZSA9IGdldE5leHROb2RlKCk7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IGdldE5leHROb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHByZXZpb3VzIG5vZGUgaW4gdGhlIHNldCBhbmQgbW92ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZQotCSAqIDxjb2RlPk5vZGVJdGVyYXRvcjwvY29kZT4gYmFja3dhcmRzIGluIHRoZSBzZXQuCi0JICogCi0JICogQHJldHVybiBUaGUgcHJldmlvdXMgPGNvZGU+Tm9kZTwvY29kZT4gaW4gdGhlIHNldCBiZWluZyBpdGVyYXRlZAotCSAqICAgICAgICAgb3Zlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgYXJlIG5vIG1vcmUgbWVtYmVycyBpbgotCSAqICAgICAgICAgdGhhdCBzZXQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlcgotCSAqICAgICAgICAgICAgICAgIHRoZSA8Y29kZT5kZXRhY2g8L2NvZGU+IG1ldGhvZCB3YXMgaW52b2tlZC4KLQkgKi8KLQlwdWJsaWMgTm9kZSBwcmV2aW91c05vZGUoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJZm9yIChOb2RlIG5vZGUgPSBnZXRQcmV2aW91c05vZGUoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gZ2V0UHJldmlvdXNOb2RlKCkpIHsKLQkJCWlmIChhY2NlcHROb2RlKG5vZGUpKQotCQkJCXJldHVybiBub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vZGVMaXN0SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmZlZDUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm9kZUxpc3RJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogTm9kZUxpc3RJbXBsIGNsYXNzCi0gKi8KLXB1YmxpYyBjbGFzcyBOb2RlTGlzdEltcGwgaW1wbGVtZW50cyBOb2RlTGlzdCB7Ci0KLQlPYmplY3QgbG9ja09iamVjdCA9IG5ldyBieXRlWzBdOwotCi0JcHJpdmF0ZSBWZWN0b3Igbm9kZXMgPSBudWxsOwotCi0JLyoqCi0JICogTm9kZUxpc3RJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIE5vZGVMaXN0SW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhcHBlbmROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgYXBwZW5kTm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJdGhpcy5ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJdGhpcy5ub2Rlcy5hZGRFbGVtZW50KG5vZGUpOwotCQlyZXR1cm4gbm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRMZW5ndGggbWV0aG9kCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJc3luY2hyb25pemVkIChsb2NrT2JqZWN0KSB7Ci0JCQlpZiAodGhpcy5ub2RlcyA9PSBudWxsKQotCQkJCXJldHVybiAwOwotCQkJcmV0dXJuIHRoaXMubm9kZXMuc2l6ZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIE5vZGUgaW5zZXJ0Tm9kZShOb2RlIG5vZGUsIGludCBpbmRleCkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0aGlzLm5vZGVzID09IG51bGwgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpIHsKLQkJCXJldHVybiBhcHBlbmROb2RlKG5vZGUpOwotCQl9Ci0JCXRoaXMubm9kZXMuaW5zZXJ0RWxlbWVudEF0KG5vZGUsIGluZGV4KTsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogaXRlbSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgTm9kZSBpdGVtKGludCBpbmRleCkgewotCQlzeW5jaHJvbml6ZWQgKGxvY2tPYmplY3QpIHsKLQkJCWlmICh0aGlzLm5vZGVzID09IG51bGwpCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMubm9kZXMuc2l6ZSgpKQotCQkJCXJldHVybiBudWxsOwotCQkJcmV0dXJuIChOb2RlKSB0aGlzLm5vZGVzLmVsZW1lbnRBdChpbmRleCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqIEBwYXJhbSBpbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIE5vZGUgcmVtb3ZlTm9kZShpbnQgaW5kZXgpIHsKLQkJaWYgKHRoaXMubm9kZXMgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBubyBub2RlCi0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5ub2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsgLy8gaW52YWxpZCBwYXJhbWV0ZXIKLQotCQlOb2RlIHJlbW92ZWQgPSAoTm9kZSkgdGhpcy5ub2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLm5vZGVzLnJlbW92ZUVsZW1lbnRBdChpbmRleCk7Ci0JCXJldHVybiByZW1vdmVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm90YXRpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L05vdGF0aW9uSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MmY2OTFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvTm90YXRpb25JbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqICAgICBCYWxhenMgQmFuZmFpOiBCdWcgMTU0NzM3IGdldFVzZXJEYXRhL3NldFVzZXJEYXRhIHN1cHBvcnQgZm9yIE5vZGUKLSAqICAgICBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9MTU0NzM3Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vdGF0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlVzZXJEYXRhSGFuZGxlcjsKLQotLyoqCi0gKiBOb3RhdGlvbkltcGwgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIE5vdGF0aW9uSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgTm90YXRpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCXByaXZhdGUgU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQotCS8qKgotCSAqIE5vdGF0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqLwotCXByb3RlY3RlZCBOb3RhdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm90YXRpb25JbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIE5vdGF0aW9uSW1wbAotCSAqLwotCXByb3RlY3RlZCBOb3RhdGlvbkltcGwoTm90YXRpb25JbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5uYW1lID0gdGhhdC5uYW1lOwotCQkJdGhpcy5wdWJsaWNJZCA9IHRoYXQucHVibGljSWQ7Ci0JCQl0aGlzLnN5c3RlbUlkID0gdGhhdC5zeXN0ZW1JZDsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJTm90YXRpb25JbXBsIGNsb25lZCA9IG5ldyBOb3RhdGlvbkltcGwodGhpcyk7Ci0JCW5vdGlmeVVzZXJEYXRhSGFuZGxlcnMoVXNlckRhdGFIYW5kbGVyLk5PREVfQ0xPTkVELCBjbG9uZWQpOwotCQlyZXR1cm4gY2xvbmVkOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCWlmICh0aGlzLm5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCXJldHVybiB0aGlzLm5hbWU7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBzaG9ydAotCSAqLwotCXB1YmxpYyBzaG9ydCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIE5PVEFUSU9OX05PREU7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHVibGljSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIHRoaXMucHVibGljSWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0U3lzdGVtSWQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTeXN0ZW1JZCgpIHsKLQkJcmV0dXJuIHRoaXMuc3lzdGVtSWQ7Ci0JfQotCi0JLyoqCi0JICogc2V0TmFtZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLQkJdGhpcy5uYW1lID0gbmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBzZXRQdWJsaWNJZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcHVibGljSWQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHVibGljSWQpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJdGhpcy5wdWJsaWNJZCA9IHB1YmxpY0lkOwotCX0KLQotCS8qKgotCSAqIHNldFN5c3RlbUlkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBzeXN0ZW1JZAotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXN0ZW1JZCkgewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQl0aGlzLnN5c3RlbUlkID0gc3lzdGVtSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBjMjEwNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1Byb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICogICAgIEJhbGF6cyBCYW5mYWk6IEJ1ZyAxNTQ3MzcgZ2V0VXNlckRhdGEvc2V0VXNlckRhdGEgc3VwcG9ydCBmb3IgTm9kZQotICogICAgIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNTQ3MzcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVXNlckRhdGFIYW5kbGVyOwotCi0KLS8qKgotICogUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBleHRlbmRzIE5vZGVJbXBsIGltcGxlbWVudHMgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHsKLQlwcml2YXRlIFN0cmluZyBkYXRhID0gbnVsbDsKLQotCXByaXZhdGUgU3RyaW5nIHRhcmdldCA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBjb25zdHJ1Y3RvcgotCSAqIAotCSAqIEBwYXJhbSB0aGF0Ci0JICogICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsCi0JICovCi0JcHJvdGVjdGVkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwoUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCB0aGF0KSB7Ci0JCXN1cGVyKHRoYXQpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMudGFyZ2V0ID0gdGhhdC50YXJnZXQ7Ci0JCQl0aGlzLmRhdGEgPSB0aGF0LmdldERhdGEoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNsb25lTm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIG9yZy53M2MuZG9tLk5vZGUKLQkgKiBAcGFyYW0gZGVlcAotCSAqICAgICAgICAgICAgYm9vbGVhbgotCSAqLwotCXB1YmxpYyBOb2RlIGNsb25lTm9kZShib29sZWFuIGRlZXApIHsKLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBjbG9uZWQgPSBuZXcgUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERhdGEoKSB7Ci0JCWlmICh0aGlzLmRhdGEgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmRhdGE7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCi0JCUlUZXh0UmVnaW9uIHRhcmdldFJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIGRhdGFSZWdpb24gPSBudWxsOwotCQlJVGV4dFJlZ2lvbiBjbG9zZVJlZ2lvbiA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pCi0JCQkJY29udGludWU7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSkgewotCQkJCWNsb3NlUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKHRhcmdldFJlZ2lvbiA9PSBudWxsKQotCQkJCQl0YXJnZXRSZWdpb24gPSByZWdpb247Ci0JCQkJZWxzZSBpZiAoZGF0YVJlZ2lvbiA9PSBudWxsKQotCQkJCQlkYXRhUmVnaW9uID0gcmVnaW9uOwotCQkJfQotCQl9Ci0JCWlmIChkYXRhUmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpbnQgb2Zmc2V0ID0gZGF0YVJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgZW5kID0gZmxhdE5vZGUuZ2V0TGVuZ3RoKCk7Ci0JCWlmIChjbG9zZVJlZ2lvbiAhPSBudWxsKQotCQkJZW5kID0gY2xvc2VSZWdpb24uZ2V0U3RhcnQoKTsKLQkJU3RyaW5nIHNvdXJjZSA9IGZsYXROb2RlLmdldFRleHQoKTsKLQkJcmV0dXJuIHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVOYW1lIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBnZXRUYXJnZXQoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIHNob3J0Ci0JICovCi0JcHVibGljIHNob3J0IGdldE5vZGVUeXBlKCkgewotCQlyZXR1cm4gUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFOwotCX0KLQotCS8qKgotCSAqIGdldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldE5vZGVWYWx1ZSgpIHsKLQkJcmV0dXJuIGdldERhdGEoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRUYXJnZXQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCWlmICh0aGlzLnRhcmdldCA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJcmV0dXJuIHRoaXMudGFyZ2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIHdpbGwgYmUgZ2VuZXJhdGVkCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRMYXN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCXJldHVybiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DTE9TRSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCXRoaXMuZGF0YSA9IGdldERhdGEoKTsKLQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCX0KLQotCS8qKgotCSAqIHNldERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGRhdGEKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXREYXRhKFN0cmluZyBkYXRhKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQl0aGlzLmRhdGEgPSBkYXRhOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqIHNldE5vZGVWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZVZhbHVlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKFN0cmluZyBub2RlVmFsdWUpIHRocm93cyBET01FeGNlcHRpb24gewotCQlzZXREYXRhKG5vZGVWYWx1ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMuZGF0YSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICogc2V0VGFyZ2V0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0YXJnZXQKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUYXJnZXQoU3RyaW5nIHRhcmdldCkgewotCQl0aGlzLnRhcmdldCA9IHRhcmdldDsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKGdldFRhcmdldCgpKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlidWZmZXIuYXBwZW5kKGdldERhdGEoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyknKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JhbmdlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGFiZTllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmFuZ2VJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudEZyYWdtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5yYW5nZXMuUmFuZ2U7Ci1pbXBvcnQgb3JnLnczYy5kb20ucmFuZ2VzLlJhbmdlRXhjZXB0aW9uOwotCi0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgUmFuZ2VJbXBsIGltcGxlbWVudHMgUmFuZ2UgewotCXByaXZhdGUgTm9kZSBlbmRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgaW50IGVuZE9mZnNldCA9IDA7Ci0KLQlwcml2YXRlIE5vZGUgc3RhcnRDb250YWluZXIgPSBudWxsOwotCXByaXZhdGUgaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQotCS8qKgotCSAqLwotCXByb3RlY3RlZCBSYW5nZUltcGwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFJhbmdlSW1wbChSYW5nZUltcGwgdGhhdCkgewotCQlzdXBlcigpOwotCi0JCWlmICh0aGF0ICE9IG51bGwpIHsKLQkJCXRoaXMuc3RhcnRDb250YWluZXIgPSB0aGF0LnN0YXJ0Q29udGFpbmVyOwotCQkJdGhpcy5zdGFydE9mZnNldCA9IHRoYXQuc3RhcnRPZmZzZXQ7Ci0JCQl0aGlzLmVuZENvbnRhaW5lciA9IHRoYXQuZW5kQ29udGFpbmVyOwotCQkJdGhpcy5lbmRPZmZzZXQgPSB0aGF0LmVuZE9mZnNldDsKLQkJfQotCX0KLQotCS8qKgotCSAqIER1cGxpY2F0ZXMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UKLQkgKiAKLQkgKiBAcmV0dXJuIEEgRG9jdW1lbnRGcmFnbWVudCB0aGF0IGNvbnRhaW5zIGNvbnRlbnQgZXF1aXZhbGVudCB0byB0aGlzCi0JICogICAgICAgICBSYW5nZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIGEgRG9jdW1lbnRUeXBlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICB3b3VsZCBiZSBleHRyYWN0ZWQgaW50byB0aGUgbmV3IERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjbG9uZUNvbnRlbnRzKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUHJvZHVjZXMgYSBuZXcgUmFuZ2Ugd2hvc2UgYm91bmRhcnktcG9pbnRzIGFyZSBlcXVhbCB0byB0aGUKLQkgKiBib3VuZGFyeS1wb2ludHMgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEByZXR1cm4gVGhlIGR1cGxpY2F0ZWQgUmFuZ2UuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgUmFuZ2UgY2xvbmVSYW5nZSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gbmV3IFJhbmdlSW1wbCh0aGlzKTsKLQl9Ci0KLQkvKioKLQkgKiBDb2xsYXBzZSBhIFJhbmdlIG9udG8gb25lIG9mIGl0cyBib3VuZGFyeS1wb2ludHMKLQkgKiAKLQkgKiBAcGFyYW0gdG9TdGFydElmCi0JICogICAgICAgICAgICBUUlVFLCBjb2xsYXBzZXMgdGhlIFJhbmdlIG9udG8gaXRzIHN0YXJ0OyBpZiBGQUxTRSwKLQkgKiAgICAgICAgICAgIGNvbGxhcHNlcyBpdCBvbnRvIGl0cyBlbmQuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBjb2xsYXBzZShib29sZWFuIHRvU3RhcnQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodG9TdGFydCkgewotCQkJdGhpcy5lbmRDb250YWluZXIgPSB0aGlzLnN0YXJ0Q29udGFpbmVyOwotCQkJdGhpcy5lbmRPZmZzZXQgPSB0aGlzLnN0YXJ0T2Zmc2V0OwotCQl9IGVsc2UgewotCQkJdGhpcy5zdGFydENvbnRhaW5lciA9IHRoaXMuZW5kQ29udGFpbmVyOwotCQkJdGhpcy5zdGFydE9mZnNldCA9IHRoaXMuZW5kT2Zmc2V0OwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ29tcGFyZSB0aGUgYm91bmRhcnktcG9pbnRzIG9mIHR3byBSYW5nZXMgaW4gYSBkb2N1bWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gaG93QQotCSAqICAgICAgICAgICAgY29kZSByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgY29tcGFyaXNvbiwgYXMgZGVmaW5lZCBhYm92ZS4KLQkgKiBAcGFyYW0gc291cmNlUmFuZ2VUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPlJhbmdlPC9jb2RlPiBvbiB3aGljaCB0aGlzIGN1cnJlbnQKLQkgKiAgICAgICAgICAgIDxjb2RlPlJhbmdlPC9jb2RlPiBpcyBjb21wYXJlZCB0by4KLQkgKiBAcmV0dXJuIC0xLCAwIG9yIDEgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIGNvcnJlc3BvbmRpbmcKLQkgKiAgICAgICAgIGJvdW5kYXJ5LXBvaW50IG9mIHRoZSBSYW5nZSBpcyByZXNwZWN0aXZlbHkgYmVmb3JlLCBlcXVhbCB0bywKLQkgKiAgICAgICAgIG9yIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGJvdW5kYXJ5LXBvaW50IG9mCi0JICogICAgICAgICA8Y29kZT5zb3VyY2VSYW5nZTwvY29kZT4uCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBXUk9OR19ET0NVTUVOVF9FUlI6IFJhaXNlZCBpZiB0aGUgdHdvIFJhbmdlcyBhcmUgbm90IGluCi0JICogICAgICAgICAgICAgICAgdGhlIHNhbWUgRG9jdW1lbnQgb3IgRG9jdW1lbnRGcmFnbWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBzaG9ydCBjb21wYXJlQm91bmRhcnlQb2ludHMoc2hvcnQgaG93LCBSYW5nZSBzb3VyY2VSYW5nZSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChzb3VyY2VSYW5nZSA9PSBudWxsKQotCQkJcmV0dXJuIChzaG9ydCkgMDsgLy8gZXJyb3IKLQotCQlOb2RlIGNvbnRhaW5lcjEgPSBudWxsOwotCQlpbnQgb2Zmc2V0MSA9IDA7Ci0JCU5vZGUgY29udGFpbmVyMiA9IG51bGw7Ci0JCWludCBvZmZzZXQyID0gMDsKLQotCQlzd2l0Y2ggKGhvdykgewotCQkJY2FzZSBTVEFSVF9UT19TVEFSVCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuc3RhcnRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0Q29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFNUQVJUX1RPX0VORCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuc3RhcnRDb250YWluZXI7Ci0JCQkJb2Zmc2V0MSA9IHRoaXMuc3RhcnRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldEVuZENvbnRhaW5lcigpOwotCQkJCW9mZnNldDIgPSBzb3VyY2VSYW5nZS5nZXRFbmRPZmZzZXQoKTsKLQkJCQlicmVhazsKLQkJCWNhc2UgRU5EX1RPX0VORCA6Ci0JCQkJY29udGFpbmVyMSA9IHRoaXMuZW5kQ29udGFpbmVyOwotCQkJCW9mZnNldDEgPSB0aGlzLmVuZE9mZnNldDsKLQkJCQljb250YWluZXIyID0gc291cmNlUmFuZ2UuZ2V0RW5kQ29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldEVuZE9mZnNldCgpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBFTkRfVE9fU1RBUlQgOgotCQkJCWNvbnRhaW5lcjEgPSB0aGlzLmVuZENvbnRhaW5lcjsKLQkJCQlvZmZzZXQxID0gdGhpcy5lbmRPZmZzZXQ7Ci0JCQkJY29udGFpbmVyMiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0Q29udGFpbmVyKCk7Ci0JCQkJb2Zmc2V0MiA9IHNvdXJjZVJhbmdlLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gKHNob3J0KSAwOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIGNvbXBhcmVQb2ludHMoY29udGFpbmVyMSwgb2Zmc2V0MSwgY29udGFpbmVyMiwgb2Zmc2V0Mik7Ci0JfQotCi0JLyoKLQkgKi8KLQlwcm90ZWN0ZWQgc2hvcnQgY29tcGFyZVBvaW50cyhOb2RlIGNvbnRhaW5lcjEsIGludCBvZmZzZXQxLCBOb2RlIGNvbnRhaW5lcjIsIGludCBvZmZzZXQyKSB7Ci0JCWlmIChjb250YWluZXIxID09IG51bGwgfHwgY29udGFpbmVyMiA9PSBudWxsKQotCQkJcmV0dXJuIChzaG9ydCkgMDsgLy8gZXJyb3IKLQotCQlpZiAoY29udGFpbmVyMSA9PSBjb250YWluZXIyKSB7Ci0JCQlpZiAob2Zmc2V0MSA+IG9mZnNldDIpCi0JCQkJcmV0dXJuIChzaG9ydCkgMTsKLQkJCWlmIChvZmZzZXQxIDwgb2Zmc2V0MikKLQkJCQlyZXR1cm4gKHNob3J0KSAtMTsKLQkJCXJldHVybiAwOwotCQl9Ci0KLQkJLy8gZ2V0IG5vZGUgb2Zmc2V0cwotCQlJRE9NTm9kZSBub2RlMSA9IG51bGw7Ci0JCWlmIChjb250YWluZXIxLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJTm9kZSBjaGlsZCA9IGNvbnRhaW5lcjEuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBvZmZzZXQxOyBpKyspIHsKLQkJCQlOb2RlIG5leHQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJCWJyZWFrOwotCQkJCWNoaWxkID0gbmV4dDsKLQkJCX0KLQkJCW5vZGUxID0gKElET01Ob2RlKSBjaGlsZDsKLQkJCW9mZnNldDEgPSAwOwotCQl9IGVsc2UgewotCQkJbm9kZTEgPSAoSURPTU5vZGUpIGNvbnRhaW5lcjE7Ci0JCX0KLQkJaW50IG5vZGVPZmZzZXQxID0gbm9kZTEuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJSURPTU5vZGUgbm9kZTIgPSBudWxsOwotCQlpZiAoY29udGFpbmVyMi5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCU5vZGUgY2hpbGQgPSBjb250YWluZXIyLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0MjsgaSsrKSB7Ci0JCQkJTm9kZSBuZXh0ID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCA9PSBudWxsKQotCQkJCQlicmVhazsKLQkJCQljaGlsZCA9IG5leHQ7Ci0JCQl9Ci0JCQlub2RlMiA9IChJRE9NTm9kZSkgY2hpbGQ7Ci0JCQlvZmZzZXQyID0gMDsKLQkJfSBlbHNlIHsKLQkJCW5vZGUyID0gKElET01Ob2RlKSBjb250YWluZXIxOwotCQl9Ci0JCWludCBub2RlT2Zmc2V0MiA9IG5vZGUyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0KLQkJaWYgKG5vZGVPZmZzZXQxID4gbm9kZU9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAxOwotCQlpZiAobm9kZU9mZnNldDEgPCBub2RlT2Zmc2V0MikKLQkJCXJldHVybiAoc2hvcnQpIC0xOwotCQlpZiAob2Zmc2V0MSA+IG9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAxOwotCQlpZiAob2Zmc2V0MSA8IG9mZnNldDIpCi0JCQlyZXR1cm4gKHNob3J0KSAtMTsKLQkJcmV0dXJuIChzaG9ydCkgMDsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IKLQkgKiBkb2N1bWVudCBmcmFnbWVudCB3aXRob3V0IHJldHVybmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVtb3ZlZCBjb250ZW50LgotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW55IHBvcnRpb24gb2YKLQkgKiAgICAgICAgICAgICAgICB0aGUgY29udGVudCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5IG9yIGFueSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBub2RlcyB0aGF0IGNvbnRhaW4gYW55IG9mIHRoZSBjb250ZW50IG9mIHRoZSBSYW5nZSBhcmUKLQkgKiAgICAgICAgICAgICAgICByZWFkLW9ubHkuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50cygpIHRocm93cyBET01FeGNlcHRpb24gewotCQkvLyBub3Qgc3VwcG9ydGVkCi0JfQotCi0JLyoqCi0JICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIFJhbmdlIGlzIG5vIGxvbmdlciBpbiB1c2UgYW5kIHRoYXQgdGhlCi0JICogaW1wbGVtZW50YXRpb24gbWF5IHJlbGlucXVpc2ggYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBSYW5nZS4KLQkgKiBTdWJzZXF1ZW50IGNhbGxzIHRvIGFueSBtZXRob2RzIG9yIGF0dHJpYnV0ZSBnZXR0ZXJzIG9uIHRoaXMgUmFuZ2Ugd2lsbAotCSAqIHJlc3VsdCBpbiBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gYmVpbmcgdGhyb3duIHdpdGggYW4gZXJyb3IgY29kZQotCSAqIG9mIDxjb2RlPklOVkFMSURfU1RBVEVfRVJSPC9jb2RlPi4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIGRldGFjaCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aGlzLnN0YXJ0Q29udGFpbmVyID0gbnVsbDsKLQkJdGhpcy5zdGFydE9mZnNldCA9IDA7Ci0JCXRoaXMuZW5kQ29udGFpbmVyID0gbnVsbDsKLQkJdGhpcy5lbmRPZmZzZXQgPSAwOwotCX0KLQotCS8qKgotCSAqIE1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IgZG9jdW1lbnQKLQkgKiBmcmFnbWVudCB0byBhIG5ldyBEb2N1bWVudEZyYWdtZW50LgotCSAqIAotCSAqIEByZXR1cm4gQSBEb2N1bWVudEZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCBjb250ZW50cy4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFueSBwb3J0aW9uIG9mCi0JICogICAgICAgICAgICAgICAgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seSBvciBhbnkgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgbm9kZXMgd2hpY2ggY29udGFpbiBhbnkgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIFJhbmdlIGFyZQotCSAqICAgICAgICAgICAgICAgIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIGEgRG9jdW1lbnRUeXBlIG5vZGUKLQkgKiAgICAgICAgICAgICAgICB3b3VsZCBiZSBleHRyYWN0ZWQgaW50byB0aGUgbmV3IERvY3VtZW50RnJhZ21lbnQuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBleHRyYWN0Q29udGVudHMoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBUUlVFIGlmIHRoZSBSYW5nZSBpcyBjb2xsYXBzZWQKLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBib29sZWFuIGdldENvbGxhcHNlZCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5zdGFydENvbnRhaW5lciA9PSB0aGlzLmVuZENvbnRhaW5lciAmJiB0aGlzLnN0YXJ0T2Zmc2V0ID09IHRoaXMuZW5kT2Zmc2V0KQotCQkJcmV0dXJuIHRydWU7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgZGVlcGVzdCBjb21tb24gYW5jZXN0b3IgY29udGFpbmVyIG9mIHRoZSBSYW5nZSdzIHR3bwotCSAqIGJvdW5kYXJ5LXBvaW50cy4KLQkgKiAKLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyBOb2RlIGdldENvbW1vbkFuY2VzdG9yQ29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICh0aGlzLnN0YXJ0Q29udGFpbmVyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuICgoTm9kZUltcGwpIHRoaXMuc3RhcnRDb250YWluZXIpLmdldENvbW1vbkFuY2VzdG9yKHRoaXMuZW5kQ29udGFpbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIHdpdGhpbiB3aGljaCB0aGUgUmFuZ2UgZW5kcwotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0RW5kQ29udGFpbmVyKCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLmVuZENvbnRhaW5lcjsKLQl9Ci0KLQkvKioKLQkgKiBPZmZzZXQgd2l0aGluIHRoZSBlbmRpbmcgbm9kZSBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlyZXR1cm4gdGhpcy5lbmRPZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogTm9kZSB3aXRoaW4gd2hpY2ggdGhlIFJhbmdlIGJlZ2lucwotCSAqIAotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIE5vZGUgZ2V0U3RhcnRDb250YWluZXIoKSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJcmV0dXJuIHRoaXMuc3RhcnRDb250YWluZXI7Ci0JfQotCi0JLyoqCi0JICogT2Zmc2V0IHdpdGhpbiB0aGUgc3RhcnRpbmcgbm9kZSBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCXJldHVybiB0aGlzLnN0YXJ0T2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIEluc2VydHMgYSBub2RlIGludG8gdGhlIERvY3VtZW50IG9yIERvY3VtZW50RnJhZ21lbnQgYXQgdGhlIHN0YXJ0IG9mCi0JICogdGhlIFJhbmdlLiBJZiB0aGUgY29udGFpbmVyIGlzIGEgVGV4dCBub2RlLCB0aGlzIHdpbGwgYmUgc3BsaXQgYXQgdGhlCi0JICogc3RhcnQgb2YgdGhlIFJhbmdlIChhcyBpZiB0aGUgVGV4dCBub2RlJ3Mgc3BsaXRUZXh0IG1ldGhvZCB3YXMKLQkgKiBwZXJmb3JtZWQgYXQgdGhlIGluc2VydGlvbiBwb2ludCkgYW5kIHRoZSBpbnNlcnRpb24gd2lsbCBvY2N1ciBiZXR3ZWVuCi0JICogdGhlIHR3byByZXN1bHRpbmcgVGV4dCBub2Rlcy4gQWRqYWNlbnQgVGV4dCBub2RlcyB3aWxsIG5vdCBiZQotCSAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkLiBJZiB0aGUgbm9kZSB0byBiZSBpbnNlcnRlZCBpcyBhIERvY3VtZW50RnJhZ21lbnQKLQkgKiBub2RlLCB0aGUgY2hpbGRyZW4gd2lsbCBiZSBpbnNlcnRlZCByYXRoZXIgdGhhbiB0aGUgRG9jdW1lbnRGcmFnbWVudAotCSAqIG5vZGUgaXRzZWxmLgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlVGhlCi0JICogICAgICAgICAgICBub2RlIHRvIGluc2VydCBhdCB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbiBhbmNlc3RvcgotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIHJlYWQtb25seS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld05vZGU8L2NvZGU+IGFuZAotCSAqICAgICAgICAgICAgICAgIHRoZSBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSB3ZXJlIG5vdCBjcmVhdGVkCi0JICogICAgICAgICAgICAgICAgZnJvbSB0aGUgc2FtZSBkb2N1bWVudC4gPGJyPgotCSAqICAgICAgICAgICAgICAgIEhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBjb250YWluZXIgb2YgdGhlCi0JICogICAgICAgICAgICAgICAgc3RhcnQgb2YgdGhlIFJhbmdlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFsbG93Ci0JICogICAgICAgICAgICAgICAgY2hpbGRyZW4gb2YgdGhlIHR5cGUgb2YgPGNvZGU+bmV3Tm9kZTwvY29kZT4gb3IgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5uZXdOb2RlPC9jb2RlPiBpcyBhbiBhbmNlc3RvciBvZiB0aGUgY29udGFpbmVyLgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+bmV3Tm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBpcyBhbiBBdHRyLCBFbnRpdHksIE5vdGF0aW9uLCBvciBEb2N1bWVudCBub2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIGluc2VydE5vZGUoTm9kZSBuZXdOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgYSBub2RlIGFuZCBpdHMgY29udGVudHMKLQkgKiAKLQkgKiBAcGFyYW0gcmVmTm9kZVRoZQotCSAqICAgICAgICAgICAgbm9kZSB0byBzZWxlY3QuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LCBOb3RhdGlvbiBvcgotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50VHlwZSBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3ROb2RlKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldFN0YXJ0KHBhcmVudCwgaW5kZXgpOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIFNlbGVjdCB0aGUgY29udGVudHMgd2l0aGluIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlTm9kZQotCSAqICAgICAgICAgICAgdG8gc2VsZWN0IGZyb20KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24gb3IgRG9jdW1lbnRUeXBlIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZWxlY3ROb2RlQ29udGVudHMoTm9kZSByZWZOb2RlKSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChyZWZOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChyZWZOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHQgdGV4dCA9IChUZXh0KSByZWZOb2RlOwotCQkJc2V0U3RhcnQocmVmTm9kZSwgMCk7Ci0JCQlzZXRFbmQocmVmTm9kZSwgdGV4dC5nZXRMZW5ndGgoKSk7Ci0JCX0gZWxzZSB7Ci0JCQlOb2RlTGlzdCBjaGlsZE5vZGVzID0gcmVmTm9kZS5nZXRDaGlsZE5vZGVzKCk7Ci0JCQlpbnQgbGVuZ3RoID0gKGNoaWxkTm9kZXMgIT0gbnVsbCA/IGNoaWxkTm9kZXMuZ2V0TGVuZ3RoKCkgOiAwKTsKLQkJCXNldFN0YXJ0KHJlZk5vZGUsIDApOwotCQkJc2V0RW5kKHJlZk5vZGUsIGxlbmd0aCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBhdHRyaWJ1dGVzIGRlc2NyaWJpbmcgdGhlIGVuZCBvZiBhIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlVGhlCi0JICogICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZQotCSAqICAgICAgICAgICAgZGlmZmVyZW50IGZyb20gPGNvZGU+bnVsbDwvY29kZT4uCi0JICogQHBhcmFtIG9mZnNldFRoZQotCSAqICAgICAgICAgICAgPGNvZGU+ZW5kT2Zmc2V0PC9jb2RlPiB2YWx1ZS4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBvciBhbiBhbmNlc3RvciBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksCi0JICogICAgICAgICAgICAgICAgTm90YXRpb24sIG9yIERvY3VtZW50VHlwZSBub2RlLgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5ERVhfU0laRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5vZmZzZXQ8L2NvZGU+IGlzCi0JICogICAgICAgICAgICAgICAgbmVnYXRpdmUgb3IgZ3JlYXRlciB0aGFuIHRoZSBudW1iZXIgb2YgY2hpbGQgdW5pdHMgaW4KLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPi4gQ2hpbGQgdW5pdHMgYXJlIDE2LWJpdCB1bml0cyBpZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgdHlwZSBvZiBDaGFyYWN0ZXJEYXRhIG5vZGUKLQkgKiAgICAgICAgICAgICAgICAoZS5nLiwgYSBUZXh0IG9yIENvbW1lbnQgbm9kZSkgb3IgYQotCSAqICAgICAgICAgICAgICAgIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBub2RlLiBDaGlsZCB1bml0cyBhcmUgTm9kZXMgaW4gYWxsCi0JICogICAgICAgICAgICAgICAgb3RoZXIgY2FzZXMuIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmQoTm9kZSByZWZOb2RlLCBpbnQgb2Zmc2V0KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCXRoaXMuZW5kQ29udGFpbmVyID0gcmVmTm9kZTsKLQkJdGhpcy5lbmRPZmZzZXQgPSBvZmZzZXQ7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgZW5kIG9mIGEgUmFuZ2UgdG8gYmUgYWZ0ZXIgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgZW5kcyBhZnRlciA8Y29kZT5yZWZOb2RlPC9jb2RlPi4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50IG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmRBZnRlcihOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCArIDEpOwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIGVuZCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlLgotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIGVuZHMgYmVmb3JlIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZgotCSAqICAgICAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudEZyYWdtZW50IG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYQotCSAqICAgICAgICAgICAgICAgIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uCi0JICogICAgICAgICAgICAgICAgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcwotCSAqICAgICAgICAgICAgICAgIGFscmVhZHkgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuZEJlZm9yZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRFbmQocGFyZW50LCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogU2V0cyB0aGUgYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UuCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVUaGUKLQkgKiAgICAgICAgICAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IHZhbHVlLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCi0JICogICAgICAgICAgICBkaWZmZXJlbnQgZnJvbSA8Y29kZT5udWxsPC9jb2RlPi4KLQkgKiBAcGFyYW0gb2Zmc2V0VGhlCi0JICogICAgICAgICAgICA8Y29kZT5zdGFydE9mZnNldDwvY29kZT4gdmFsdWUuCi0JICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+Ci0JICogICAgICAgICAgICAgICAgb3IgYW4gYW5jZXN0b3Igb2YgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYW4gRW50aXR5LAotCSAqICAgICAgICAgICAgICAgIE5vdGF0aW9uLCBvciBEb2N1bWVudFR5cGUgbm9kZS4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIG5lZ2F0aXZlIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNoaWxkIHVuaXRzIGluCi0JICogICAgICAgICAgICAgICAgPGNvZGU+cmVmTm9kZTwvY29kZT4uIENoaWxkIHVuaXRzIGFyZSAxNi1iaXQgdW5pdHMgaWYKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhIHR5cGUgb2YgQ2hhcmFjdGVyRGF0YSBub2RlCi0JICogICAgICAgICAgICAgICAgKGUuZy4sIGEgVGV4dCBvciBDb21tZW50IG5vZGUpIG9yIGEKLQkgKiAgICAgICAgICAgICAgICBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gbm9kZS4gQ2hpbGQgdW5pdHMgYXJlIE5vZGVzIGluIGFsbAotCSAqICAgICAgICAgICAgICAgIG90aGVyIGNhc2VzLiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzCi0JICogICAgICAgICAgICAgICAgYWxyZWFkeSBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0JICovCi0JcHVibGljIHZvaWQgc2V0U3RhcnQoTm9kZSByZWZOb2RlLCBpbnQgb2Zmc2V0KSB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbiB7Ci0JCXRoaXMuc3RhcnRDb250YWluZXIgPSByZWZOb2RlOwotCQl0aGlzLnN0YXJ0T2Zmc2V0ID0gb2Zmc2V0OwotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGJlIGFmdGVyIGEgbm9kZQotCSAqIAotCSAqIEBwYXJhbSByZWZOb2RlUmFuZ2UKLQkgKiAgICAgICAgICAgIHN0YXJ0cyBhZnRlciA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEFmdGVyKE5vZGUgcmVmTm9kZSkgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb24gewotCQlpZiAocmVmTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIHBhcmVudCA9IHJlZk5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWludCBpbmRleCA9ICgoTm9kZUltcGwpIHJlZk5vZGUpLmdldEluZGV4KCk7Ci0JCWlmIChpbmRleCA8IDApCi0JCQlyZXR1cm47Ci0JCXNldFN0YXJ0KHBhcmVudCwgaW5kZXggKyAxKTsKLQl9Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzdGFydCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlCi0JICogCi0JICogQHBhcmFtIHJlZk5vZGVSYW5nZQotCSAqICAgICAgICAgICAgc3RhcnRzIGJlZm9yZSA8Y29kZT5yZWZOb2RlPC9jb2RlPgotCSAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiB0aGUgcm9vdCBjb250YWluZXIgb2YKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBub3QgYW4gQXR0ciwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEKLQkgKiAgICAgICAgICAgICAgICBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbgotCSAqICAgICAgICAgICAgICAgIG5vZGUuCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTdGFydEJlZm9yZShOb2RlIHJlZk5vZGUpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKHJlZk5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBwYXJlbnQgPSByZWZOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAoKE5vZGVJbXBsKSByZWZOb2RlKS5nZXRJbmRleCgpOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlzZXRTdGFydChwYXJlbnQsIGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBhcmVudHMgdGhlIGNvbnRlbnRzIG9mIHRoZSBSYW5nZSB0byB0aGUgZ2l2ZW4gbm9kZSBhbmQgaW5zZXJ0cyB0aGUKLQkgKiBub2RlIGF0IHRoZSBwb3NpdGlvbiBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlLgotCSAqIAotCSAqIEBwYXJhbSBuZXdQYXJlbnRUaGUKLQkgKiAgICAgICAgICAgIG5vZGUgdG8gc3Vycm91bmQgdGhlIGNvbnRlbnRzIHdpdGguCi0JICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICAgICBOT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI6IFJhaXNlZCBpZiBhbiBhbmNlc3RvcgotCSAqICAgICAgICAgICAgICAgIGNvbnRhaW5lciBvZiBlaXRoZXIgYm91bmRhcnktcG9pbnQgb2YgdGhlIFJhbmdlIGlzCi0JICogICAgICAgICAgICAgICAgcmVhZC1vbmx5LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgV1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+IG5ld1BhcmVudDwvY29kZT4KLQkgKiAgICAgICAgICAgICAgICBhbmQgdGhlIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIHdlcmUgbm90Ci0JICogICAgICAgICAgICAgICAgY3JlYXRlZCBmcm9tIHRoZSBzYW1lIGRvY3VtZW50LiA8YnI+Ci0JICogICAgICAgICAgICAgICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgdGhlIGNvbnRhaW5lciBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICBzdGFydCBvZiB0aGUgUmFuZ2UgaXMgb2YgYSB0eXBlIHRoYXQgZG9lcyBub3QgYWxsb3cKLQkgKiAgICAgICAgICAgICAgICBjaGlsZHJlbiBvZiB0aGUgdHlwZSBvZiA8Y29kZT5uZXdQYXJlbnQ8L2NvZGU+IG9yIGlmCi0JICogICAgICAgICAgICAgICAgPGNvZGU+bmV3UGFyZW50PC9jb2RlPiBpcyBhbiBhbmNlc3RvciBvZiB0aGUgY29udGFpbmVyCi0JICogICAgICAgICAgICAgICAgb3IgaWYgPGNvZGU+bm9kZTwvY29kZT4gd291bGQgZW5kIHVwIHdpdGggYSBjaGlsZCBub2RlCi0JICogICAgICAgICAgICAgICAgb2YgYSB0eXBlIG5vdCBhbGxvd2VkIGJ5IHRoZSB0eXBlIG9mIDxjb2RlPm5vZGU8L2NvZGU+LgotCSAqICAgICAgICAgICAgICAgIDxicj4KLQkgKiAgICAgICAgICAgICAgICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMKLQkgKiAgICAgICAgICAgICAgICBhbHJlYWR5IGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLQkgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgQkFEX0JPVU5EQVJZUE9JTlRTX0VSUjogUmFpc2VkIGlmIHRoZSBSYW5nZSBwYXJ0aWFsbHkKLQkgKiAgICAgICAgICAgICAgICBzZWxlY3RzIGEgbm9uLXRleHQgbm9kZS4gPGJyPgotCSAqICAgICAgICAgICAgICAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPiBub2RlPC9jb2RlPiBpcwotCSAqICAgICAgICAgICAgICAgIGFuIEF0dHIsIEVudGl0eSwgRG9jdW1lbnRUeXBlLCBOb3RhdGlvbiwgRG9jdW1lbnQsIG9yCi0JICogICAgICAgICAgICAgICAgRG9jdW1lbnRGcmFnbWVudCBub2RlLgotCSAqLwotCXB1YmxpYyB2b2lkIHN1cnJvdW5kQ29udGVudHMoTm9kZSBuZXdQYXJlbnQpIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVhZE9ubHlDb250cm9sbGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1JlYWRPbmx5Q29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODBlNzE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvUmVhZE9ubHlDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5CYXNpY1N0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotY2xhc3MgUmVhZE9ubHlDb250cm9sbGVyIHsKLQotCWNsYXNzIFNwYW4gewotCQlpbnQgbGVuZ3RoOwotCQlpbnQgb2Zmc2V0OwotCi0JCVNwYW4oaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCQl0aGlzLmxlbmd0aCA9IGxlbmd0aDsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFJlYWRPbmx5Q29udHJvbGxlciBmSW5zdGFuY2U7Ci0KLQlzdGF0aWMgc3luY2hyb25pemVkIFJlYWRPbmx5Q29udHJvbGxlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGZJbnN0YW5jZSA9PSBudWxsKSB7Ci0JCQlmSW5zdGFuY2UgPSBuZXcgUmVhZE9ubHlDb250cm9sbGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbnN0YW5jZTsKLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIGxvY2soSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIGludCBvZmZzZXQsIGludCBsZW5ndGgsIGJvb2xlYW4gY2FuSW5zZXJ0QmVmb3JlLCBib29sZWFuIGNhbkluc2VydEFmdGVyKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChkb2MgaW5zdGFuY2VvZiBCYXNpY1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJKChCYXNpY1N0cnVjdHVyZWREb2N1bWVudClkb2MpLm1ha2VSZWFkT25seShvZmZzZXQsIGxlbmd0aCwgY2FuSW5zZXJ0QmVmb3JlLCBjYW5JbnNlcnRBZnRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlkb2MubWFrZVJlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKTsKLQkJfQotCX0KLQotCXN0YXRpYyBwcml2YXRlIHZvaWQgbG9jayhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUsIGJvb2xlYW4gY2FuSW5zZXJ0QmVmb3JlLCBib29sZWFuIGNhbkluc2VydEFmdGVyKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQkJaWYgKGRvYyA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGRvYyBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KWRvYykubWFrZVJlYWRPbmx5KG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRMZW5ndGgoKSwgY2FuSW5zZXJ0QmVmb3JlLCBjYW5JbnNlcnRBZnRlcik7Ci0JCX0gZWxzZSB7Ci0JCQlkb2MubWFrZVJlYWRPbmx5KG5vZGUuZ2V0U3RhcnQoKSwgbm9kZS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQl9Ci0KLQlzdGF0aWMgcHJpdmF0ZSB2b2lkIHVubG9jayhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQlpZiAoZG9jID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlkb2MuY2xlYXJSZWFkT25seShub2RlLmdldFN0YXJ0KCksIG5vZGUuZ2V0TGVuZ3RoKCkpOwotCX0KLQotCXByaXZhdGUgUmVhZE9ubHlDb250cm9sbGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgU3BhbiBnZXREYXRhU3BhbihJRE9NTm9kZSBub2RlKSB7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2V0RGF0YVNwYW5Gb3JFbGVtZW50KChJRE9NRWxlbWVudCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2V0RGF0YVNwYW5Gb3JUZXh0KChJRE9NVGV4dCkgbm9kZSk7Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm4gbmV3IFNwYW4oMCwgLTEpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBTcGFuIGdldERhdGFTcGFuRm9yRWxlbWVudChJRE9NRWxlbWVudCBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jUmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZG9jUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGRvY1JlZ2lvbi5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQotCQlTdHJpbmcgc3RhcnRUeXBlOwotCQlTdHJpbmcgZW5kVHlwZTsKLQkJaWYgKG5vZGUuaXNDb21tZW50VGFnKCkpIHsKLQkJCXN0YXJ0VHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTjsKLQkJCWVuZFR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFOwotCQl9IGVsc2UgewotCQkJc3RhcnRUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUU7Ci0JCQllbmRUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFOwotCQl9Ci0KLQkJaW50IHN0YXJ0T2Zmc2V0ID0gLTE7Ci0JCWludCBlbmRPZmZzZXQgPSAtMTsKLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbjsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlyZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICh0eXBlID09IHN0YXJ0VHlwZSkgewotCQkJCXN0YXJ0T2Zmc2V0ID0gcmVnaW9uLmdldEVuZCgpOwotCQkJfSBlbHNlIGlmICh0eXBlID09IGVuZFR5cGUgJiYgcHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJZW5kT2Zmc2V0ID0gcHJldlJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQl9Ci0JCQlwcmV2UmVnaW9uID0gcmVnaW9uOwotCQl9Ci0KLQkJaWYgKDAgPD0gc3RhcnRPZmZzZXQgJiYgMCA8PSBlbmRPZmZzZXQpIHsKLQkJCXJldHVybiBuZXcgU3BhbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIG5ldyBTcGFuKDAsIC0xKTsKLQkJfQotCX0KLQotCXByaXZhdGUgU3BhbiBnZXREYXRhU3BhbkZvclRleHQoSURPTVRleHQgbm9kZSkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY1JlZ2lvbiA9ICgoTm9kZUltcGwpIG5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZG9jUmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiBuZXcgU3BhbigwLCAtMSk7Ci0JCX0KLQkJcmV0dXJuIG5ldyBTcGFuKDAsIGRvY1JlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBmcm9tIHBhcmVudCdzIHNldENoaWxkRWRpdGFibGUoKQotCSAqIAotCSAqIGNhc2UgMTo8cGFyZW50Pjxub2RlIGF0dHI9InZhbHVlIi8+IDxub2RlMj48L3BhcmVudD4KLQkgKiB4IyMjIyMjIyMjIyMjIyMjIyMjIyN4IGNhc2UgMjo8cGFyZW50Pjxub2RlIGF0dHI9InZhbHVlIj4gPGNoaWxkPgotCSAqIDwvY2hpbGQ+IDwvbm9kZT4gPC9wYXJlbnQ+IHgjIyMjIyMjIyMjIyMjIyMjIyMjPyA/IyMjIyMjI3ggKD8gOgotCSAqIGVkaXRhYmxlIGlmIG5vZGUuaXNFZGl0YWJsZSgpID09IHRydWUpCi0JICovCi0Jdm9pZCBsb2NrQm90aChJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGU7Ci0JCWJvb2xlYW4gY2FuSW5zZXJ0ID0gZmFsc2U7Ci0KLQkJLy8gZW5kIG5vZGUgKGVsZW1lbnQpCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJY2FuSW5zZXJ0ID0gbm9kZS5pc0NoaWxkRWRpdGFibGUoKTsKLQkJCQlsb2NrKGZsYXROb2RlLCBjYW5JbnNlcnQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJbG9jayhmbGF0Tm9kZSwgZmFsc2UsIGNhbkluc2VydCk7Ci0JCX0KLQl9Ci0KLQl2b2lkIGxvY2tEYXRhKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3BhbiBzcGFuID0gZ2V0RGF0YVNwYW4obm9kZSk7Ci0JCWlmICgwIDw9IHNwYW4ubGVuZ3RoKSB7Ci0JCQlsb2NrKG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSwgbm9kZS5nZXRTdGFydE9mZnNldCgpICsgc3Bhbi5vZmZzZXQsIHNwYW4ubGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogbG9jayBpdHNlbGYgYW5kIGFsbCBkZXNjZW5kYW50cwotCSAqLwotCXZvaWQgbG9ja0RlZXAoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG9mZnNldDsKLQotCQlib29sZWFuIGNhbkluc2VydCA9IHRydWU7Ci0JCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCAmJiAhcGFyZW50LmlzQ2hpbGRFZGl0YWJsZSgpKSB7Ci0JCQljYW5JbnNlcnQgPSBmYWxzZTsKLQkJfQotCQlsb2NrKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG9mZnNldCwgbGVuZ3RoLCBjYW5JbnNlcnQsIGNhbkluc2VydCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgdXNlZCBmcm9tIHBhcmVudCdzIHNldENoaWxkRWRpdGFibGUoKQotCSAqIAotCSAqIGNhc2UgMTo8cGFyZW50Pjxub2RlIGF0dHI9InZhbHVlIi8+IDxub2RlMj48L3BhcmVudD4geCMjIyMjI3ggeCMjeAotCSAqIGNhc2UgMjo8cGFyZW50Pjxub2RlIGF0dHI9InZhbHVlIj4gPGNoaWxkPjwvY2hpbGQ+IDwvbm9kZT4gPC9wYXJlbnQ+Ci0JICogeCMjIyMjI3ggeCM/ID8jIyMjIyMjeCAoPyA6IGVkaXRhYmxlIGlmIG5vZGUuaXNFZGl0YWJsZSgpID09IHRydWUpCi0JICovCi0Jdm9pZCBsb2NrTm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoIW5vZGUuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJbG9ja0JvdGgobm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQlib29sZWFuIGNhbkluc2VydCA9IGZhbHNlOwotCi0JCS8vIGVuZCBub2RlIChlbGVtZW50KQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCWNhbkluc2VydCA9IG5vZGUuaXNDaGlsZEVkaXRhYmxlKCk7Ci0JCQkJbG9jayhmbGF0Tm9kZSwgY2FuSW5zZXJ0LCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJLy8gc3RhcnQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQkJaWYgKDAgPD0gc3Bhbi5sZW5ndGgpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IGZsYXROb2RlLmdldFBhcmVudERvY3VtZW50KCk7Ci0JCQkJaW50IG9mZnNldCwgbGVuZ3RoOwotCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJbGVuZ3RoID0gc3Bhbi5vZmZzZXQ7Ci0JCQkJbG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotCQkJCW9mZnNldCA9IG9mZnNldCArIHNwYW4ub2Zmc2V0ICsgc3Bhbi5sZW5ndGg7Ci0JCQkJbGVuZ3RoID0gZmxhdE5vZGUuZ2V0RW5kKCkgLSBvZmZzZXQ7Ci0JCQkJbG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBjYW5JbnNlcnQsIGZhbHNlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJbG9jayhmbGF0Tm9kZSwgZmFsc2UsIGNhbkluc2VydCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgdW5sb2NrKElTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCWlmIChkb2MgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0JCWRvYy5jbGVhclJlYWRPbmx5KG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQl2b2lkIHVubG9ja0JvdGgoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJdW5sb2NrKGZsYXROb2RlKTsKLQkJfQotCQkvLyBlbmQgbm9kZQotCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQl1bmxvY2soZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0Jdm9pZCB1bmxvY2tEYXRhKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3BhbiBzcGFuID0gZ2V0RGF0YVNwYW4obm9kZSk7Ci0JCWlmICgwIDw9IHNwYW4ubGVuZ3RoKSB7Ci0JCQl1bmxvY2sobm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLCBzcGFuLm9mZnNldCwgc3Bhbi5sZW5ndGgpOwotCQl9Ci0JfQotCi0Jdm9pZCB1bmxvY2tEZWVwKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IGxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0KLQkJdW5sb2NrKG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCksIG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQl2b2lkIHVubG9ja05vZGUoSURPTU5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlOwotCQkvLyBlbmQgbm9kZQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlmbGF0Tm9kZSA9IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQkvLyBzdGFydCBub2RlCi0JCWZsYXROb2RlID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKG5vZGUuaXNEYXRhRWRpdGFibGUoKSkgewotCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCVNwYW4gc3BhbiA9IGdldERhdGFTcGFuKG5vZGUpOwotCQkJCWlmIChzcGFuLmxlbmd0aCA8PSAwKSB7Ci0JCQkJCXVubG9jayhmbGF0Tm9kZSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBmbGF0Tm9kZS5nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJCQlpbnQgb2Zmc2V0LCBsZW5ndGg7Ci0JCQkJCW9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCQkJCWxlbmd0aCA9IHNwYW4ub2Zmc2V0IC0gb2Zmc2V0OwotCQkJCQl1bmxvY2soc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCW9mZnNldCA9IHNwYW4ub2Zmc2V0ICsgc3Bhbi5sZW5ndGg7Ci0JCQkJCWxlbmd0aCA9IGZsYXROb2RlLmdldEVuZCgpIC0gc3Bhbi5vZmZzZXQ7Ci0JCQkJCXVubG9jayhzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NvdXJjZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9Tb3VyY2VWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczOWEzNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1NvdXJjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVhNTENoYXJFbnRpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICovCi1wdWJsaWMgY2xhc3MgU291cmNlVmFsaWRhdG9yIHsKLQotCXByaXZhdGUgTm9kZUltcGwgbm9kZSA9IG51bGw7Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU291cmNlVmFsaWRhdG9yKE5vZGUgbm9kZSkgewotCQlzdXBlcigpOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXRoaXMubm9kZSA9IChOb2RlSW1wbCkgbm9kZTsKLQkJfQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgY29udmVydFNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAodGhpcy5ub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQkvLyBzZXR1cCBjb252ZXJzaW9uIGNvbmRpdGlvbnMKLQkJYm9vbGVhbiBhY2NlcHRUYWcgPSBmYWxzZTsKLQkJYm9vbGVhbiBhY2NlcHRDbG9zZSA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdFF1b3RlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0QW1wZXJzYW5kID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0RW50aXR5UmVmID0gdHJ1ZTsKLQkJYm9vbGVhbiBhY2NlcHRKU1BFbmQgPSB0cnVlOwotCQlTdHJpbmcgZW5kVGFnTmFtZSA9IG51bGw7Ci0JCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJCWlmIChhY2NlcHRUYWcpIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgdGhpcy5ub2RlOwotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCAmJiBlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCWFjY2VwdFRhZyA9IGZhbHNlOwotCQkJfQotCQkJLy8gaWYgdGhlIHNvdXJjZSBkb2VzIG5vdCBpbmNsdWRlIHNpbmdsZSBxdW90ZSwKLQkJCS8vIGRvdWJsZSBxdW90ZSBpcyB2YWxpZAotCQkJYWNjZXB0UXVvdGUgPSAoc291cmNlLmluZGV4T2YoJ1wnJykgPCAwKTsKLQkJfSBlbHNlIGlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5ub2RlOwotCQkJaWYgKHRleHQuaXNKU1BDb250ZW50KCkpIHsKLQkJCQlpbnQgaW5kZXggPSBzb3VyY2UuaW5kZXhPZihKU1BUYWcuVEFHX0NMT1NFKTsKLQkJCQlpZiAoaW5kZXggPCAwKQotCQkJCQlyZXR1cm4gc291cmNlOwotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJCWFjY2VwdFF1b3RlID0gdHJ1ZTsKLQkJCQlhY2NlcHRBbXBlcnNhbmQgPSB0cnVlOwotCQkJCWFjY2VwdEpTUEVuZCA9IGZhbHNlOwotCQkJfSBlbHNlIGlmICh0ZXh0LmlzQ0RBVEFDb250ZW50KCkpIHsKLQkJCQllbmRUYWdOYW1lID0gdGV4dC5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlpZiAoZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJCWFjY2VwdENsb3NlID0gdHJ1ZTsKLQkJCQlhY2NlcHRRdW90ZSA9IHRydWU7Ci0JCQkJYWNjZXB0QW1wZXJzYW5kID0gdHJ1ZTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCQlpZiAodGhpcy5ub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGU7Ci0JCQl9IGVsc2UgewotCQkJCWRvY3VtZW50ID0gKElET01Eb2N1bWVudCkgdGhpcy5ub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCX0KLQkJCWlmIChkb2N1bWVudCAhPSBudWxsICYmIGRvY3VtZW50LmlzSlNQVHlwZSgpKQotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IGNvcGllZExlbmd0aCA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCVN0cmluZyByZWYgPSBudWxsOwotCQkJY2hhciBjID0gc291cmNlLmNoYXJBdChpKTsKLQkJCXN3aXRjaCAoYykgewotCQkJCWNhc2UgJzwnIDoKLQkJCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCQkJaWYgKGVuZFRhZ05hbWUgIT0gbnVsbCkgewotCQkJCQkJCWlmICghbWF0Y2hFbmRUYWcoc291cmNlLCBpICsgMSwgZW5kVGFnTmFtZSkpCi0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfSBlbHNlIHsKLQkJCQkJCQlpbnQgc2tpcCA9IHNraXBUYWcoc291cmNlLCBpICsgMSk7Ci0JCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCQlpICs9IHNraXA7Ci0JCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCS8vIGludmFsaWQgSlNQIHRhZwotCQkJCQl9Ci0JCQkJCXJlZiA9IElYTUxDaGFyRW50aXR5LkxUX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPicgOgotCQkJCQlpZiAoYWNjZXB0Q2xvc2UpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJcmVmID0gSVhNTENoYXJFbnRpdHkuR1RfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICcmJyA6Ci0JCQkJCWlmIChhY2NlcHRBbXBlcnNhbmQpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaWYgKGFjY2VwdEVudGl0eVJlZikgewotCQkJCQkJaW50IHNraXAgPSBza2lwRW50aXR5UmVmKHNvdXJjZSwgaSArIDEpOwotCQkJCQkJaWYgKHNraXAgPj0gMCkgewotCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5BTVBfUkVGOwotCQkJCQlicmVhazsKLQkJCQljYXNlICciJyA6Ci0JCQkJCWlmIChhY2NlcHRRdW90ZSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5RVU9UX1JFRjsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnJScgOgotCQkJCQlpZiAoYWNjZXB0SlNQRW5kKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWlmIChzb3VyY2UuY2hhckF0KGkgKyAxKSAhPSAnPicpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJaSsrOwotCQkJCQlyZWYgPSBJWE1MQ2hhckVudGl0eS5HVF9SRUY7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQljb250aW51ZTsKLQkJCX0KLQotCQkJaWYgKHJlZiAhPSBudWxsKSB7Ci0JCQkJaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0JCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCQkJfQotCQkJCWlmIChpID4gY29waWVkTGVuZ3RoKSB7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlLnN1YnN0cmluZyhjb3BpZWRMZW5ndGgsIGkpKTsKLQkJCQl9Ci0JCQkJYnVmZmVyLmFwcGVuZChyZWYpOwotCQkJCWNvcGllZExlbmd0aCA9IGkgKyAxOyAvLyBza2lwIHRoaXMgY2hhcmFjdGVyCi0JCQl9Ci0JCX0KLQotCQlpZiAoYnVmZmVyICE9IG51bGwpIHsKLQkJCWlmIChjb3BpZWRMZW5ndGggPCBsZW5ndGgpIHsKLQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcoY29waWVkTGVuZ3RoLCBsZW5ndGgpKTsKLQkJCX0KLQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBtYXRjaEVuZFRhZyhTdHJpbmcgc291cmNlLCBpbnQgb2Zmc2V0LCBTdHJpbmcgZW5kVGFnTmFtZSkgewotCQlpZiAoc291cmNlID09IG51bGwgfHwgZW5kVGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gbGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoc291cmNlLmNoYXJBdChvZmZzZXQpICE9ICcvJykKLQkJCXJldHVybiBmYWxzZTsKLQkJb2Zmc2V0Kys7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBlbmRUYWdOYW1lLmxlbmd0aCgpOwotCQlpZiAoZW5kID4gbGVuZ3RoKQotCQkJcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gZW5kVGFnTmFtZS5lcXVhbHNJZ25vcmVDYXNlKHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGZpbmFsIGludCBza2lwRW50aXR5UmVmKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgPj0gc291cmNlLmxlbmd0aCgpKQotCQkJcmV0dXJuIC0xOwotCQlEb2N1bWVudEltcGwgZG9jdW1lbnQgPSAoRG9jdW1lbnRJbXBsKSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpZiAoZG9jdW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiAtMTsgLy8gZXJyb3IKLQotCQlpbnQgZW5kID0gc291cmNlLmluZGV4T2YoJzsnLCBvZmZzZXQpOwotCQlpZiAoZW5kIDwgMCB8fCBlbmQgPT0gb2Zmc2V0KQotCQkJcmV0dXJuIC0xOwotCQlTdHJpbmcgbmFtZSA9IHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCBlbmQpOwotCQlpZiAobmFtZSA9PSBudWxsIHx8IGRvY3VtZW50LmdldENoYXJWYWx1ZShuYW1lKSA9PSBudWxsKQotCQkJcmV0dXJuIC0xOwotCQlyZXR1cm4gKGVuZCArIDEgLSBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgZmluYWwgaW50IHNraXBUYWcoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCkgewotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlyZXR1cm4gLTE7Ci0JCWlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+PSBzb3VyY2UubGVuZ3RoKCkpCi0JCQlyZXR1cm4gLTE7Ci0KLQkJaW50IGVuZCA9IG9mZnNldDsKLQkJaWYgKHNvdXJjZS5jaGFyQXQob2Zmc2V0KSA9PSAnJScpIHsKLQkJCS8vIEpTUCB0YWcKLQkJCWludCBmb3VuZCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UsIG9mZnNldCArIDEpOwotCQkJaWYgKGZvdW5kIDwgMCkKLQkJCQlyZXR1cm4gLTE7IC8vIGludmFsaWQgSlNQIHRhZwotCQkJZW5kID0gZm91bmQgKyAyOwotCQl9IGVsc2UgewotCQkJLy8gbm9ybWFsIHRhZwotCQkJaW50IGZvdW5kID0gc291cmNlLmluZGV4T2YoJz4nLCBvZmZzZXQpOwotCQkJaWYgKGZvdW5kIDwgMCkKLQkJCQlyZXR1cm4gLTE7IC8vIGludmFsaWQgdGFnCi0JCQllbmQgPSBmb3VuZCArIDE7Ci0JCX0KLQkJcmV0dXJuIChlbmQgLSBvZmZzZXQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHZhbGlkYXRlU291cmNlKFN0cmluZyBzb3VyY2UpIHRocm93cyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7Ci0JCWlmICh0aGlzLm5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsgLy8gZXJyb3IKLQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCi0JCS8vIHNldHVwIHZhbGlkYXRpb24gY29uZGl0aW9ucwotCQlib29sZWFuIGFjY2VwdFRhZyA9IGZhbHNlOwotCQlib29sZWFuIGFjY2VwdENsb3NlID0gZmFsc2U7Ci0JCWJvb2xlYW4gYWNjZXB0UXVvdGUgPSB0cnVlOwotCQlib29sZWFuIGFjY2VwdEVudGl0eVJlZiA9IHRydWU7Ci0JCVN0cmluZyBlbmRUYWdOYW1lID0gbnVsbDsKLQkJaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCAmJiBkb2N1bWVudC5pc0pTUFR5cGUoKSkKLQkJCQlhY2NlcHRUYWcgPSB0cnVlOwotCQkJaWYgKGFjY2VwdFRhZykgewotCQkJCUF0dHIgYXR0ciA9IChBdHRyKSB0aGlzLm5vZGU7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJCQlpZiAoZWxlbWVudCAhPSBudWxsICYmIGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJYWNjZXB0VGFnID0gZmFsc2U7Ci0JCQl9Ci0JCQkvLyBpZiB0aGUgc291cmNlIGRvZXMgbm90IGluY2x1ZGUgc2luZ2xlIHF1b3RlLAotCQkJLy8gZG91YmxlIHF1b3RlIGlzIHZhbGlkCi0JCQlhY2NlcHRRdW90ZSA9IChzb3VyY2UuaW5kZXhPZignXCcnKSA8IDApOwotCQl9IGVsc2UgaWYgKHRoaXMubm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm5vZGU7Ci0JCQlpZiAodGV4dC5pc0pTUENvbnRlbnQoKSkgewotCQkJCWludCBpbmRleCA9IHNvdXJjZS5pbmRleE9mKEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJCWlmIChpbmRleCA8IDApCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfZ3RfZm9fRVJST1JfOwotCQkJCXRocm93IG5ldyBJbnZhbGlkQ2hhcmFjdGVyRXhjZXB0aW9uKG1lc3NhZ2UsICc+JywgaW5kZXggKyAxKTsKLQkJCX0gZWxzZSBpZiAodGV4dC5pc0NEQVRBQ29udGVudCgpKSB7Ci0JCQkJZW5kVGFnTmFtZSA9IHRleHQuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVOYW1lKCk7Ci0JCQkJaWYgKGVuZFRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJcmV0dXJuIGZhbHNlOyAvLyBlcnJvcgotCQkJCWFjY2VwdFRhZyA9IHRydWU7Ci0JCQkJYWNjZXB0Q2xvc2UgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLQkJCWlmICh0aGlzLm5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQlkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIHRoaXMubm9kZTsKLQkJCX0gZWxzZSB7Ci0JCQkJZG9jdW1lbnQgPSAoSURPTURvY3VtZW50KSB0aGlzLm5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJfQotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpCi0JCQkJYWNjZXB0VGFnID0gdHJ1ZTsKLQkJfQotCi0JCWNoYXIgYyA9IDA7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWMgPSBzb3VyY2UuY2hhckF0KGkpOwotCQkJc3dpdGNoIChjKSB7Ci0JCQkJY2FzZSAnPCcgOgotCQkJCQlpZiAoYWNjZXB0VGFnKSB7Ci0JCQkJCQlpZiAoZW5kVGFnTmFtZSAhPSBudWxsKSB7Ci0JCQkJCQkJaWYgKCFtYXRjaEVuZFRhZyhzb3VyY2UsIGkgKyAxLCBlbmRUYWdOYW1lKSkKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWludCBza2lwID0gc2tpcFRhZyhzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCQlpZiAoc2tpcCA+PSAwKSB7Ci0JCQkJCQkJCWkgKz0gc2tpcDsKLQkJCQkJCQkJY29udGludWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJLy8gaW52YWxpZCB0YWcKLQkJCQkJfQotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2x0X2ZvX0VSUk9SXzsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSAnPicgOgotCQkJCQlpZiAoYWNjZXB0Q2xvc2UpCi0JCQkJCQljb250aW51ZTsKLQkJCQkJbWVzc2FnZSA9IFhNTENvcmVNZXNzYWdlcy5JbnZhbGlkX2NoYXJhY3Rlcl9ndF9mb19FUlJPUl87Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyYnIDoKLQkJCQkJaWYgKGFjY2VwdEVudGl0eVJlZikgewotCQkJCQkJaWYgKGVuZFRhZ05hbWUgIT0gbnVsbCkKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCWludCBza2lwID0gc2tpcEVudGl0eVJlZihzb3VyY2UsIGkgKyAxKTsKLQkJCQkJCWlmIChza2lwID49IDApIHsKLQkJCQkJCQlpICs9IHNraXA7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBpbnZhbGlkIGVudGl0eSByZWZlcmVuY2UKLQkJCQkJfQotCQkJCQltZXNzYWdlID0gWE1MQ29yZU1lc3NhZ2VzLkludmFsaWRfY2hhcmFjdGVyX2FtcF9mb19FUlJPUl87Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgJyInIDoKLQkJCQkJaWYgKGFjY2VwdFF1b3RlKQotCQkJCQkJY29udGludWU7Ci0JCQkJCW1lc3NhZ2UgPSBYTUxDb3JlTWVzc2FnZXMuSW52YWxpZF9jaGFyYWN0ZXJfX2ZfRVhDXzsKLQkJCQkJYnJlYWs7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAobWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJdGhyb3cgbmV3IEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24obWVzc2FnZSwgYywgaSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjUyMzE4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgb25seSBmb3IgZGVidWcgcHVycG9zZS4KLSAqLwotcHVibGljIGNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIgewotCVN0cmluZyBFT0wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0JV3JpdGVyIHRlc3RXcml0ZXIgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIoV3JpdGVyIHdyaXRlcikgewotCQlzdXBlcigpOwotCQl0ZXN0V3JpdGVyID0gd3JpdGVyOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGVja0NoaWxkTm9kZXMoTm9kZSBub2RlKSB7Ci0JCWZvciAoTm9kZSBjaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWNoZWNrTm9kZShjaGlsZCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBjaGVja01vZGVsKElET01Nb2RlbCBtb2RlbCkgewotCQljaGVja0NoaWxkTm9kZXMobW9kZWwuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoZWNrTm9kZShOb2RlIG5vZGUpIHsKLQkJY2hlY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKChOb2RlSW1wbCkgbm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGVja0NoaWxkTm9kZXMobm9kZSk7Ci0JCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigoKEVsZW1lbnRJbXBsKSBub2RlKS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hlY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBuID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYyA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGMgPT0gbnVsbCkgewotCQkJCQlyZXBvcnRFcnJvcigibnVsbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQljaGVja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBzdGFydCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChzdGFydCA8IHRoaXMub2Zmc2V0KQotCQkJcmVwb3J0RXJyb3IoIm92ZXJ3cmFwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN0YXJ0ID4gdGhpcy5vZmZzZXQpCi0JCQlyZXBvcnRFcnJvcigiZ2FwIik7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGVuZCA9IGZsYXROb2RlLmdldEVuZCgpOwotCQl0aGlzLm9mZnNldCA9IGVuZDsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAocCA9PSBudWxsKSB7Ci0JCQkJcmVwb3J0RXJyb3IoIm51bGwiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQkJCWludCBzID0gcC5nZXRTdGFydCgpOwotCQkJaW50IGUgPSBwLmdldEVuZCgpOwotCQkJaWYgKHMgPiBzdGFydCB8fCBlIDwgZW5kKQotCQkJCXJlcG9ydEVycm9yKCJvdXQiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHMgPT0gc3RhcnQgJiYgZSA9PSBlbmQpCi0JCQkJcmVwb3J0V2FybmluZygidmFpbiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwb3J0RXJyb3IoU3RyaW5nIG1lc3NhZ2UpIHsKLQkJU3RyaW5nIG1zZyA9ICJTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25DaGVja2VyIDogZXJyb3IgOiAiICsgbWVzc2FnZTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGVzdFdyaXRlciAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCXRlc3RXcml0ZXIud3JpdGUobXNnICsgRU9MKTsKLQkJCX0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLQkJCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQkJfQotCQl9IGVsc2UgewotCQkJU3lzdGVtLm91dC5wcmludGxuKG1zZyk7Ci0JCX0KLQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVwb3J0V2FybmluZyhTdHJpbmcgbWVzc2FnZSkgewotCQlTdHJpbmcgbXNnID0gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNoZWNrZXIgOiB3YXJuaW5nIDogIiArIG1lc3NhZ2U7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHRlc3RXcml0ZXIgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0ZXN0V3JpdGVyLndyaXRlKG1zZyArIEVPTCk7Ci0JCQl9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQkJZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbihtc2cpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMDIyMmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotCi0KLWNsYXNzIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHJpdmF0ZSBWZWN0b3IgZmxhdE5vZGVzID0gbmV3IFZlY3RvcigyKTsKLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZFJlZ2lvbihJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpID4gMCkgewotCQkJCXRoaXMuZmxhdE5vZGVzLmFkZEFsbChjb250YWluZXIuZmxhdE5vZGVzKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRoaXMuZmxhdE5vZGVzLmFkZEVsZW1lbnQoZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnNPZmZzZXQoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldERlZXBlc3RSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbnQgb2Zmc2V0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbGFzdCA9IGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGxhc3QgPT0gbnVsbCkKLQkJCXJldHVybiAwOwotCQlyZXR1cm4gbGFzdC5nZXRFbmQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRGaXJzdFJlZ2lvbigpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlpZiAodGhpcy5mbGF0Tm9kZXMuaXNFbXB0eSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KDApOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCXJldHVybiBnZXRUZXh0KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJaW50IHNpemUgPSB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JCWlmIChzaXplID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoc2l6ZSAtIDEpOwotCX0KLQotCS8qKiAKLQkgKi8KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIChnZXRFbmQoKSAtIGdldFN0YXJ0KCkpOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldE5leHQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXROdW1iZXJPZlJlZ2lvbnMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uQ29udGFpbmVyIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0UGFyZW50RG9jdW1lbnQoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldmlvdXMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdCA9IGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmaXJzdCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCXJldHVybiBmaXJzdC5nZXRTdGFydCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpcnN0ID0gZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZpcnN0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIGZpcnN0LmdldFBhcmVudERvY3VtZW50KCk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgdGhpcy5mbGF0Tm9kZXMuZWxlbWVudEF0KGluZGV4KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlpbnQgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSB7Ci0JCXJldHVybiB0aGlzLmZsYXROb2Rlcy5zaXplKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KCkgewotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKHNpemUgPT0gMCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHRoaXMuZmxhdE5vZGVzLmVsZW1lbnRBdChpKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCWNvbnRpbnVlOwotCQkJYnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KCkpOwotCQl9Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGdldEVuZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldCgpIHsKLQkJcmV0dXJuIGdldFRleHRFbmQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogVGhlIHRleHQgbGVuZ3RoIGlzIGVxdWFsIHRvIGxlbmd0aCBpZiB0aGVyZSBpcyBubyB3aGl0ZSBzcGFjZSBhdCB0aGUKLQkgKiBlbmQgb2YgYSByZWdpb24uIE90aGVyd2lzZSBpdCBpcyBzbWFsbGVyIHRoYW4gbGVuZ3RoLgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIChnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiAiU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgaW50IGluZGV4KSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaW5kZXggPCAwKQotCQkJcmV0dXJuOwotCQlpbnQgc2l6ZSA9IHRoaXMuZmxhdE5vZGVzLnNpemUoKTsKLQkJaWYgKGluZGV4ID4gc2l6ZSkKLQkJCXJldHVybjsKLQkJaWYgKGluZGV4ID09IHNpemUpIHsKLQkJCWFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJdGhpcy5mbGF0Tm9kZXMuaW5zZXJ0RWxlbWVudEF0KGZsYXROb2RlLCBpbmRleCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbnQgaW5kZXgpIHsKLQkJaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLmZsYXROb2Rlcy5zaXplKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLmZsYXROb2Rlcy5yZW1vdmVFbGVtZW50QXQoaW5kZXgpOwotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBzaXplID0gdGhpcy5mbGF0Tm9kZXMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJdGhpcy5mbGF0Tm9kZXMucmVtb3ZlRWxlbWVudEF0KGkpOwotCQkJCXJldHVybiBmbGF0Tm9kZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsgLy8gbm90IGZvdW5kCi0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIGludCBpbmRleCkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiByZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaW5kZXgpOwotCQlpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuZmxhdE5vZGVzLnNpemUoKSkKLQkJCXJldHVybiBudWxsOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB0aGlzLmZsYXROb2Rlcy5lbGVtZW50QXQoaW5kZXgpOwotCQl0aGlzLmZsYXROb2Rlcy5zZXRFbGVtZW50QXQoZmxhdE5vZGUsIGluZGV4KTsKLQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RW5kZWQoYm9vbGVhbiBoYXNFbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IG5ld0xlbmd0aCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5leHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UGFyZW50RG9jdW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudCBkb2N1bWVudCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFByZXZpb3VzKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3UHJldmlvdXMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb25zKElUZXh0UmVnaW9uTGlzdCBlbWJlZGRlZFJlZ2lvbnMpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgbmV3U3RhcnQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCd7Jyk7Ci0JCWludCBjb3VudCA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJaWYgKGkgIT0gMCkKLQkJCQlidWZmZXIuYXBwZW5kKCcsJyk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZCgibnVsbCIpOy8vJE5PTi1OTFMtMSQKLQkJCWVsc2UKLQkJCQlidWZmZXIuYXBwZW5kKGZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJ30nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0bm9kZSwgU3RyaW5nIGNoYW5nZXMsIGludCBzdGFydCwgaW50IGVuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgewotCQkvLyBpZiBzb21lb25lICJnZXRzIiB0aGVzZSB0ZW1wIHJlZ2lvbnMgYnkKLQkJLy8gYWNjaWRlbnQsIHdlJ2xsIGFsd2F5cyByZXR1cm4gImRlbGV0ZWQiLgotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldERlbGV0ZWQoYm9vbGVhbiBkZWxldGVkKSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0NDY5YjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLQotLyoqCi0gKi8KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0KLQkvKioKLQkgKiBEZWZhdWx0IDxjb2RlPnNlcmlhbFZlcnNpb25VSUQ8L2NvZGU+Ci0JICovCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLQkvKioKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uIGNvbnN0cnVjdG9yCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKSB7Ci0JCXN1cGVyKCJJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG1hbmFnZW1lbnQgZmFpbGVkLiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZTM5ZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uQ29udGFpbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLQotCi1jbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCXByaXZhdGUgaW50IG9mZnNldCA9IDA7Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCXN1cGVyKCk7Ci0KLQkJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCS8qKgotCSAqLwotCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KGludCBvZmZzZXQsIGludCBsZW5ndGgsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJc3VwZXIoKTsKLQotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJdGhpcy5sZW5ndGggPSBsZW5ndGg7Ci0JCXRoaXMuZmxhdE5vZGUgPSBmbGF0Tm9kZTsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMub2Zmc2V0IC09IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRSZWdpb24oSVRleHRSZWdpb24gYVJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IGkpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0RGVlcGVzdFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJaW50IGZsYXROb2RlT2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCWZsYXROb2RlT2Zmc2V0ID0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlyZXR1cm4gZmxhdE5vZGVPZmZzZXQgKyB0aGlzLm9mZnNldCArIHRoaXMubGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmRPZmZzZXQoSVRleHRSZWdpb24gY29udGFpbmVkUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCXJldHVybiBnZXRUZXh0KCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRGdWxsVGV4dChTdHJpbmcgY29udGV4dCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRMYXN0UmVnaW9uKCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gdGhpcy5sZW5ndGg7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TmV4dCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE51bWJlck9mUmVnaW9ucygpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlpbnQgZ2V0T2Zmc2V0KCkgewotCQlpbnQgZmxhdE5vZGVPZmZzZXQgPSAwOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJZmxhdE5vZGVPZmZzZXQgPSB0aGlzLmZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCXJldHVybiBmbGF0Tm9kZU9mZnNldCArIHRoaXMub2Zmc2V0OwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJVGV4dFJlZ2lvbkNvbnRhaW5lciBnZXRQYXJlbnQoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFBhcmVudERvY3VtZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQkJLy8gdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIKLQkJLy8gYmUgY2FsbGVkIik7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0UHJldmlvdXMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIElUZXh0UmVnaW9uIGdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGludCBvZmZzZXQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb25MaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJaW50IGZsYXROb2RlT2Zmc2V0ID0gMDsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCWZsYXROb2RlT2Zmc2V0ID0gdGhpcy5mbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlyZXR1cm4gZmxhdE5vZGVPZmZzZXQgKyB0aGlzLm9mZnNldDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldFN0cnVjdHVyZWREb2N1bWVudCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKiogCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXJldHVybiB0aGlzLmZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCVN0cmluZyB0ZXh0ID0gdGhpcy5mbGF0Tm9kZS5nZXRUZXh0KCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZygpOwotCQlpbnQgZW5kID0gdGhpcy5vZmZzZXQgKyB0aGlzLmxlbmd0aDsKLQkJcmV0dXJuIHRleHQuc3Vic3RyaW5nKHRoaXMub2Zmc2V0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChJVGV4dFJlZ2lvbiBhUmVnaW9uKSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KFN0cmluZyBjb250ZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZ2V0RW5kKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlyZXR1cm4gZ2V0VGV4dEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUgdGV4dCBsZW5ndGggaXMgZXF1YWwgdG8gbGVuZ3RoIGlmIHRoZXJlIGlzIG5vIHdoaXRlIHNwYWNlIGF0IHRoZQotCSAqIGVuZCBvZiBhIHJlZ2lvbi4gT3RoZXJ3aXNlIGl0IGlzIHNtYWxsZXIgdGhhbiBsZW5ndGguCi0JICovCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gIlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IjsvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKCkgewotCQkvLyBJJ2xsIGFzc3VtZSBuZXZlciByZWFsbHkgbmVlZGVkIGhlcmUKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaXNFbmRlZCgpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzYW1lQXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiByZWdpb24sIGludCBzaGlmdCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIHNhbWVBcyhJVGV4dFJlZ2lvbiBvbGRSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5ld1JlZ2lvbiwgaW50IHNoaWZ0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0RGVsZXRlZChib29sZWFuIGRlbGV0ZWQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRFbmRlZChib29sZWFuIGhhc0VuZCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGhhZCB0byBtYWtlIHB1YmxpYywgZHVlIHRvIEFQSSB0cmFuc2l0aW9uLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldExlbmd0aChpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMubGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5leHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOZXh0KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRPZmZzZXQoaW50IG9mZnNldCkgewotCQl0aGlzLm9mZnNldCA9IG9mZnNldDsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMub2Zmc2V0IC09IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnREb2N1bWVudChJU3RydWN0dXJlZERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXRocm93IG5ldyBFcnJvcigiaW50ZW50aW9uYWxseSBub3QgaW1wbGVtZW50ZWQgc2luY2Ugc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgc2V0UHJldmlvdXMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdQcmV2aW91cykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlZ2lvbnMoSVRleHRSZWdpb25MaXN0IGVtYmVkZGVkUmVnaW9ucykgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBuZXdTdGFydCkgewotCQl0aHJvdyBuZXcgRXJyb3IoImludGVudGlvbmFsbHkgbm90IGltcGxlbWVudGVkIHNpbmNlIHNob3VsZCBuZXZlciBiZSBjYWxsZWQiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKHRoaXMuZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMub2Zmc2V0ICs9IHRoaXMuZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJdGhpcy5mbGF0Tm9kZSA9IGZsYXROb2RlOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJdGhpcy5vZmZzZXQgLT0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiB0b1N0cmluZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlidWZmZXIuYXBwZW5kKCdbJyk7Ci0JCWJ1ZmZlci5hcHBlbmQoZ2V0U3RhcnQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJywnKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRFbmQoKSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJ10nKTsKLQkJYnVmZmVyLmFwcGVuZCgnKCcpOwotCQlpZiAodGhpcy5mbGF0Tm9kZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZCh0aGlzLmZsYXROb2RlLnRvU3RyaW5nKCkpOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKCJudWxsIik7Ly8kTk9OLU5MUy0xJAotCQlidWZmZXIuYXBwZW5kKCcpJyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdG5vZGUsIFN0cmluZyBjaGFuZ2VzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLQkJdGhyb3cgbmV3IEVycm9yKCJpbnRlbnRpb25hbGx5IG5vdCBpbXBsZW1lbnRlZCBzaW5jZSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzY4MDBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBQcm92aWRlcyBjb252ZW5pZW50IGZ1bmN0aW9ucyB0byBoYW5kbGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBhbmQKLSAqIElUZXh0UmVnaW9uLgotICovCi1jbGFzcyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsIHsKLQotCS8qKgotCSAqIEV4dHJhY3RzIGNvbnRlbnRzIGVuY2xvc2VkIHdpdGggcXVvdGVzLiBRdW90ZXMgbWF5IGJlIGRvdWJsZSBvciBzaW5nbGUuCi0JICovCi0Jc3RhdGljIFN0cmluZyBnZXRBdHRyVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgdmFsdWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCWlmICh2YWx1ZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuIHZhbHVlOwotCQljaGFyIGZpcnN0Q2hhciA9IHZhbHVlLmNoYXJBdCgwKTsKLQkJaWYgKGZpcnN0Q2hhciA9PSAnIicgfHwgZmlyc3RDaGFyID09ICdcJycpIHsKLQkJCWlmIChsZW5ndGggPT0gMSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmICh2YWx1ZS5jaGFyQXQobGVuZ3RoIC0gMSkgPT0gZmlyc3RDaGFyKQotCQkJCWxlbmd0aC0tOwotCQkJcmV0dXJuIHZhbHVlLnN1YnN0cmluZygxLCBsZW5ndGgpOwotCQl9Ci0JCXJldHVybiB2YWx1ZTsKLQl9Ci0KLQkvKioKLQkgKiBFeHRyYWN0cyB0aGUgbmFtZSB3aXRob3V0IGhlYWRpbmcgJyYnIGFuZCB0YWlsaW5nICc7Jy4KLQkgKi8KLQlzdGF0aWMgU3RyaW5nIGdldEVudGl0eVJlZk5hbWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgcmVmID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlpbnQgbGVuZ3RoID0gcmVmLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm4gcmVmOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaWYgKHJlZi5jaGFyQXQoMCkgPT0gJyYnKQotCQkJb2Zmc2V0ID0gMTsKLQkJaWYgKHJlZi5jaGFyQXQobGVuZ3RoIC0gMSkgPT0gJzsnKQotCQkJbGVuZ3RoLS07Ci0JCWlmIChvZmZzZXQgPj0gbGVuZ3RoKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiByZWYuc3Vic3RyaW5nKG9mZnNldCwgbGVuZ3RoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBmaXJzdCByZWdpb24uCi0JICovCi0Jc3RhdGljIElUZXh0UmVnaW9uIGdldEZpcnN0UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gcmVnaW9ucy5nZXQoMCk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0Rmlyc3RSZWdpb25UeXBlKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQ7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQlyZXR1cm4gcmVnaW9uLmdldFR5cGUoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGUpLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCWZsYXROb2RlID0gKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGUpLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQl9Ci0JCXJldHVybiBmbGF0Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsYXN0IHJlZ2lvbi4KLQkgKi8KLQlzdGF0aWMgSVRleHRSZWdpb24gZ2V0TGFzdFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsIHx8IHJlZ2lvbnMuc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZmlyc3QgcmVnaW9uLgotCSAqLwotCXN0YXRpYyBTdHJpbmcgZ2V0TGFzdFJlZ2lvblR5cGUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwgfHwgcmVnaW9ucy5zaXplKCkgPT0gMCkKLQkJCXJldHVybiBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJcmV0dXJuIHJlZ2lvbi5nZXRUeXBlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0Jc3RhdGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGUpLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJZmxhdE5vZGUgPSAoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZSkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCX0KLQkJcmV0dXJuIGZsYXROb2RlOwotCX0KLQotCS8qKgotCSAqLwotCXN0YXRpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlmbGF0Tm9kZSA9ICgoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlyZXR1cm4gZmxhdE5vZGU7Ci0JfQotCi0JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RhZ0FkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnQWRhcHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWQ4Zjk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGFnQWRhcHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci0KLS8qKgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRhZ0FkYXB0ZXIgZXh0ZW5kcyBJTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldEVuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCVN0cmluZyBnZXRTdGFydFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaXNFbmRUYWcoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvVGV4dEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA1NTczMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1RleHRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKiAgICAgQmFsYXpzIEJhbmZhaTogQnVnIDE1NDczNyBnZXRVc2VyRGF0YS9zZXRVc2VyRGF0YSBzdXBwb3J0IGZvciBOb2RlCi0gKiAgICAgaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NDczNwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5Vc2VyRGF0YUhhbmRsZXI7Ci0KLQotLyoqCi0gKiBUZXh0SW1wbCBjbGFzcwotICovCi1wdWJsaWMgY2xhc3MgVGV4dEltcGwgZXh0ZW5kcyBDaGFyYWN0ZXJEYXRhSW1wbCBpbXBsZW1lbnRzIElET01UZXh0IHsKLQotCS8qKgotCSAqLwotCXByaXZhdGUgY2xhc3MgU3RyaW5nUGFpciB7Ci0JCXByaXZhdGUgU3RyaW5nIGZGaXJzdCA9IG51bGw7Ci0JCXByaXZhdGUgU3RyaW5nIGZTZWNvbmQgPSBudWxsOwotCi0JCVN0cmluZ1BhaXIoU3RyaW5nIGZpcnN0LCBTdHJpbmcgc2Vjb25kKSB7Ci0JCQl0aGlzLmZGaXJzdCA9IGZpcnN0OwotCQkJdGhpcy5mU2Vjb25kID0gc2Vjb25kOwotCQl9Ci0KLQkJU3RyaW5nIGdldEZpcnN0KCkgewotCQkJcmV0dXJuIHRoaXMuZkZpcnN0OwotCQl9Ci0KLQkJU3RyaW5nIGdldFNlY29uZCgpIHsKLQkJCXJldHVybiB0aGlzLmZTZWNvbmQ7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBmU291cmNlID0gbnVsbDsKLQotCS8qKgotCSAqIFRleHRJbXBsIGNvbnN0cnVjdG9yCi0JICovCi0JcHJvdGVjdGVkIFRleHRJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRleHRJbXBsIGNvbnN0cnVjdG9yCi0JICogCi0JICogQHBhcmFtIHRoYXQKLQkgKiAgICAgICAgICAgIFRleHRJbXBsCi0JICovCi0JcHJvdGVjdGVkIFRleHRJbXBsKFRleHRJbXBsIHRoYXQpIHsKLQkJc3VwZXIodGhhdCk7Ci0KLQkJaWYgKHRoYXQgIT0gbnVsbCkgewotCQkJdGhpcy5mU291cmNlID0gdGhhdC5nZXRTb3VyY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGFwcGVuZERhdGEgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGVuZERhdGEoU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBuZXdTb3VyY2UgPSBnZXRTb3VyY2UoYXJnKTsKLQkJaWYgKG5ld1NvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXNldFRleHRTb3VyY2Uoc291cmNlICsgbmV3U291cmNlKTsKLQkJZWxzZQotCQkJc2V0VGV4dFNvdXJjZShuZXdTb3VyY2UpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJfQotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JCWVsc2UgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIoKTsKLQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCX0KLQotCQlyZXR1cm4gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIGFwcGVuZFRleHQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQKLQkgKi8KLQlwdWJsaWMgdm9pZCBhcHBlbmRUZXh0KFRleHQgbmV3VGV4dCkgewotCQlpZiAobmV3VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbmV3VGV4dDsKLQkJU3RyaW5nIG5ld1NvdXJjZSA9IHRleHQuZ2V0U291cmNlKCk7Ci0JCWlmIChuZXdTb3VyY2UgPT0gbnVsbCAmJiBuZXdTb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIHNvdXJjZSA9IGdldFNvdXJjZSgpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlzZXRUZXh0U291cmNlKHNvdXJjZSArIG5ld1NvdXJjZSk7Ci0JCWVsc2UKLQkJCXNldFRleHRTb3VyY2UobmV3U291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBjbG9uZU5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIGRlZXAKLQkgKiAgICAgICAgICAgIGJvb2xlYW4KLQkgKi8KLQlwdWJsaWMgTm9kZSBjbG9uZU5vZGUoYm9vbGVhbiBkZWVwKSB7Ci0JCVRleHRJbXBsIGNsb25lZCA9IG5ldyBUZXh0SW1wbCh0aGlzKTsKLQkJbm90aWZ5VXNlckRhdGFIYW5kbGVycyhVc2VyRGF0YUhhbmRsZXIuTk9ERV9DTE9ORUQsIGNsb25lZCk7Ci0JCXJldHVybiBjbG9uZWQ7Ci0JfQotCi0JLyoqCi0JICogZGVsZXRlRGF0YSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKiBAcGFyYW0gY291bnQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXB1YmxpYyB2b2lkIGRlbGV0ZURhdGEoaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJaWYgKGNvdW50ID09IDApCi0JCQlyZXR1cm47Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChjb3VudCA8IDAgfHwgb2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIGNvdW50KTsKLQkJaWYgKHBhaXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJc291cmNlID0gbnVsbDsKLQkJU3RyaW5nIGZpcnN0ID0gcGFpci5nZXRGaXJzdCgpOwotCQlpZiAoZmlyc3QgIT0gbnVsbCkKLQkJCXNvdXJjZSA9IGZpcnN0OwotCQlTdHJpbmcgc2Vjb25kID0gcGFpci5nZXRTZWNvbmQoKTsKLQkJaWYgKHNlY29uZCAhPSBudWxsKSB7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJc291cmNlICs9IHNlY29uZDsKLQkJCWVsc2UKLQkJCQlzb3VyY2UgPSBzZWNvbmQ7Ci0JCX0KLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJc291cmNlID0gbmV3IFN0cmluZygpOyAvLyBkZWxldGUgYWxsCi0JCXNldFRleHRTb3VyY2Uoc291cmNlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXREYXRhIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAodGhpcy5mU291cmNlICE9IG51bGwpCi0JCQlyZXR1cm4gZ2V0RGF0YSh0aGlzLmZTb3VyY2UpOwotCQlTdHJpbmcgZGF0YSA9IHN1cGVyLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCXJldHVybiBkYXRhOwotCQlyZXR1cm4gZ2V0RGF0YShnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0RGF0YShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBsZW5ndGggPSBjb250YWluZXIuZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAobGVuZ3RoIDwgMTYpCi0JCQkJbGVuZ3RoID0gMTY7IC8vIGRlZmF1bHQKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKGNvbnRlbnQpOwotCQkJCWlmIChkYXRhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCQl9Ci0JCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoKTsKLQkJfQotCi0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgewotCQkJCVN0cmluZyBuYW1lID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRFbnRpdHlSZWZOYW1lKGZsYXROb2RlLCByZWdpb24pOwotCQkJCWlmIChuYW1lICE9IG51bGwpIHsKLQkJCQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJCQlpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkJU3RyaW5nIHZhbHVlID0gZG9jdW1lbnQuZ2V0Q2hhclZhbHVlKG5hbWUpOwotCQkJCQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQkJCQkJcmV0dXJuIHZhbHVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIGZsYXROb2RlLmdldFRleHQoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGRhdGEgZm9yIHRoZSBzb3VyY2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXREYXRhKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gMDsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaW50IHJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJyk7Ci0JCXdoaWxlIChyZWYgPj0gMCkgewotCQkJaW50IGVuZCA9IHNvdXJjZS5pbmRleE9mKCc7JywgcmVmICsgMSk7Ci0JCQlpZiAoZW5kID4gcmVmICsgMSkgewotCQkJCVN0cmluZyBuYW1lID0gc291cmNlLnN1YnN0cmluZyhyZWYgKyAxLCBlbmQpOwotCQkJCVN0cmluZyB2YWx1ZSA9IGdldENoYXJWYWx1ZShuYW1lKTsKLQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgewotCQkJCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJCQlidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCk7Ci0JCQkJCWlmIChyZWYgPiBvZmZzZXQpCi0JCQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0LCByZWYpKTsKLQkJCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0JCQkJCW9mZnNldCA9IGVuZCArIDE7Ci0JCQkJCXJlZiA9IGVuZDsKLQkJCQl9Ci0JCQl9Ci0JCQlyZWYgPSBzb3VyY2UuaW5kZXhPZignJicsIHJlZiArIDEpOwotCQl9Ci0JCWlmIChidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybiBzb3VyY2U7Ci0JCWlmIChsZW5ndGggPiBvZmZzZXQpCi0JCQlidWZmZXIuYXBwZW5kKHNvdXJjZS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCX0KLQotCS8qKgotCSAqIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0Tm9kZU5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuICIjdGV4dCI7Ly8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIGdldE5vZGVUeXBlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gc2hvcnQKLQkgKi8KLQlwdWJsaWMgc2hvcnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiBURVhUX05PREU7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTb3VyY2UoKSB7Ci0JCWlmICh0aGlzLmZTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiB0aGlzLmZTb3VyY2U7Ci0JCVN0cmluZyBkYXRhID0gc3VwZXIuZ2V0RGF0YSgpOwotCQlpZiAoZGF0YSAhPSBudWxsICYmIGRhdGEubGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKGRhdGEpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiBzb3VyY2U7Ci0JCX0KLQkJcmV0dXJuIHN1cGVyLmdldFNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgc291cmNlIGZvciB0aGUgZGF0YQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFNvdXJjZShTdHJpbmcgZGF0YSkgewotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlET01Nb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JCUlTb3VyY2VHZW5lcmF0b3IgZ2VuZXJhdG9yID0gbW9kZWwuZ2V0R2VuZXJhdG9yKCk7Ci0JCWlmIChnZW5lcmF0b3IgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlyZXR1cm4gZ2VuZXJhdG9yLmdlbmVyYXRlVGV4dERhdGEodGhpcywgZGF0YSk7Ci0JfQotCi0JLyoqCi0JICovCi0JU3RyaW5nIGdldFRleHRTb3VyY2UoKSB7Ci0JCXJldHVybiB0aGlzLmZTb3VyY2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRWYWx1ZVNvdXJjZSgpIHsKLQkJcmV0dXJuIGdldFNvdXJjZSgpOwotCX0KLQotCS8qKgotCSAqLwotCWJvb2xlYW4gaGFzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZmxhdE5vZGUgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IGFza2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gYXNrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pCi0JCQkJCXJldHVybiB0cnVlOwotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBhc2tlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnREYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBhcmcKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnREYXRhKGludCBvZmZzZXQsIFN0cmluZyBhcmcpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoYXJnID09IG51bGwgfHwgYXJnLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAob2Zmc2V0ID4gMCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJc291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQkJc2V0VGV4dFNvdXJjZShzb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIDApOwotCQlpZiAocGFpciA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2UubGVuZ3RoKCkgKyBhcmcubGVuZ3RoKCkpOwotCQlTdHJpbmcgZmlyc3QgPSBwYWlyLmdldEZpcnN0KCk7Ci0JCWlmIChmaXJzdCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChmaXJzdCk7Ci0JCXNvdXJjZSA9IGdldFNvdXJjZShhcmcpOwotCQlpZiAoc291cmNlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCVN0cmluZyBzZWNvbmQgPSBwYWlyLmdldFNlY29uZCgpOwotCQlpZiAoc2Vjb25kICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHNlY29uZCk7Ci0JCXNldFRleHRTb3VyY2UoYnVmZmVyLnRvU3RyaW5nKCkpOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCi0JCWlmIChmbGF0Tm9kZSA9PSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcigpOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJCXJldHVybiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSBmbGF0Tm9kZTsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCWNvbnRhaW5lci5pbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJcmV0dXJuIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBlcnJvcgotCX0KLQotCS8qKgotCSAqIGluc2VydFRleHQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbnNlcnRUZXh0KFRleHQgbmV3VGV4dCwgaW50IG9mZnNldCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmIChuZXdUZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5ld1RleHQ7Ci0JCVN0cmluZyBuZXdTb3VyY2UgPSB0ZXh0LmdldFNvdXJjZSgpOwotCQlpZiAobmV3U291cmNlID09IG51bGwgJiYgbmV3U291cmNlLmxlbmd0aCgpID09IDApCi0JCQlyZXR1cm47Ci0JCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlpZiAob2Zmc2V0ID4gMCkgewotCQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQkJfQotCQkJc2V0VGV4dFNvdXJjZShuZXdTb3VyY2UpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nUGFpciBwYWlyID0gc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoc291cmNlLCBvZmZzZXQsIDApOwotCQlpZiAocGFpciA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihzb3VyY2UubGVuZ3RoKCkgKyBuZXdTb3VyY2UubGVuZ3RoKCkpOwotCQlTdHJpbmcgZmlyc3QgPSBwYWlyLmdldEZpcnN0KCk7Ci0JCWlmIChmaXJzdCAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChmaXJzdCk7Ci0JCWJ1ZmZlci5hcHBlbmQobmV3U291cmNlKTsKLQkJU3RyaW5nIHNlY29uZCA9IHBhaXIuZ2V0U2Vjb25kKCk7Ci0JCWlmIChzZWNvbmQgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc2Vjb25kKTsKLQkJc2V0VGV4dFNvdXJjZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICogaXNDREFUQUNvbnRlbnQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNDREFUQUNvbnRlbnQoKSB7Ci0JCU5vZGUgcGFyZW50ID0gZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwgfHwgcGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJcmV0dXJuIGVsZW1lbnQuaXNDREFUQUNvbnRhaW5lcigpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzSW52YWxpZCgpIHsKLQkJcmV0dXJuIGlzSW52YWxpZChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzSW52YWxpZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCWlmIChpc0ludmFsaWQoY29udGVudCkpCi0JCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCXJldHVybiBpc0ludmFsaWQocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpOwotCQl9Ci0KLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEZpcnN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQgJiYgaXNOb3ROZXN0ZWRDb250ZW50KHJlZ2lvblR5cGUpICYmIHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSAmJiByZWdpb25UeXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFICYmIHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUICYmIHJlZ2lvblR5cGUgIT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOb3ROZXN0ZWRDb250ZW50KFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlib29sZWFuIGlzU2hhcmluZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAoc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpZiAoZmxhdE5vZGUgPT0gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJcmV0dXJuIGZhbHNlOwotCi0JCWlmIChmbGF0Tm9kZSBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCXJldHVybiB0cnVlOwotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gc2hhcmVkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNoYXJlZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQkJCXJldHVybiB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyB0ZXh0IG5vZGUgY29udGFpbnMgPGEKLQkgKiBocmVmPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDA0L1JFQy14bWwtaW5mb3NldC0yMDA0MDIwNCNpbmZvaXRlbS5jaGFyYWN0ZXInPgotCSAqIGVsZW1lbnQgY29udGVudCB3aGl0ZXNwYWNlPC9hPiwgb2Z0ZW4gYWJ1c2l2ZWx5IGNhbGxlZCAiaWdub3JhYmxlCi0JICogd2hpdGVzcGFjZSIuIFRoZSB0ZXh0IG5vZGUgaXMgZGV0ZXJtaW5lZCB0byBjb250YWluIHdoaXRlc3BhY2UgaW4KLQkgKiBlbGVtZW50IGNvbnRlbnQgZHVyaW5nIHRoZSBsb2FkIG9mIHRoZSBkb2N1bWVudCBvciBpZiB2YWxpZGF0aW9uIG9jY3VycwotCSAqIHdoaWxlIHVzaW5nIDxjb2RlPkRvY3VtZW50Lm5vcm1hbGl6ZURvY3VtZW50KCk8L2NvZGU+LgotCSAqIAotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VsZW1lbnRDb250ZW50V2hpdGVzcGFjZSgpIHsKLQkJcmV0dXJuIGlzV2hpdGVzcGFjZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzV2hpdGVzcGFjZSgpIHsKLQkJU3RyaW5nIGRhdGEgPSBnZXREYXRhKCk7Ci0JCWlmIChkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsKLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShkYXRhLmNoYXJBdChpKSkpCi0JCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQlyZXR1cm4gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCWlmIChwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkvLyByZW1vdmVkIHdpdGggcHJveHkKLQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obnVsbCk7Ci0JCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKSA9PSAxKSB7Ci0JCQkJCQkvLyBnZXQgYmFjayB0byBzaW5nbGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oMCkpOwotCQkJCQl9Ci0JCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJLy8gcmVtb3ZlZCB3aXRoIHByb3h5Ci0JCQkJCQljb250YWluZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQkJaWYgKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpID09IDEpIHsKLQkJCQkJCQkvLyBnZXQgYmFjayB0byBzaW5nbGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCQkJCXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKDApKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJfQotCi0JCXJldHVybiBudWxsOyAvLyBlcnJvcgotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VEYXRhIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIGludAotCSAqIEBwYXJhbSBjb3VudAotCSAqICAgICAgICAgICAgaW50Ci0JICogQHBhcmFtIGFyZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHJlcGxhY2VEYXRhKGludCBvZmZzZXQsIGludCBjb3VudCwgU3RyaW5nIGFyZykgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWlmIChhcmcgPT0gbnVsbCB8fCBhcmcubGVuZ3RoKCkgPT0gMCkgewotCQkJZGVsZXRlRGF0YShvZmZzZXQsIGNvdW50KTsKLQkJCXJldHVybjsKLQkJfQotCQlpZiAoY291bnQgPT0gMCkgewotCQkJaW5zZXJ0RGF0YShvZmZzZXQsIGFyZyk7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKG9mZnNldCA8IDAgfHwgY291bnQgPCAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsIHx8IHNvdXJjZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZ1BhaXIgcGFpciA9IHN1YnN0cmluZ1NvdXJjZUV4Y2x1ZGVkKHNvdXJjZSwgb2Zmc2V0LCBjb3VudCk7Ci0JCWlmIChwYWlyID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZS5sZW5ndGgoKSArIGFyZy5sZW5ndGgoKSk7Ci0JCVN0cmluZyBmaXJzdCA9IHBhaXIuZ2V0Rmlyc3QoKTsKLQkJaWYgKGZpcnN0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGZpcnN0KTsKLQkJc291cmNlID0gZ2V0U291cmNlKGFyZyk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc291cmNlKTsKLQkJU3RyaW5nIHNlY29uZCA9IHBhaXIuZ2V0U2Vjb25kKCk7Ci0JCWlmIChzZWNvbmQgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoc2Vjb25kKTsKLQkJc2V0VGV4dFNvdXJjZShidWZmZXIudG9TdHJpbmcoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiByZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQotCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCX0KLQotCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGZsYXROb2RlOwotCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkvLyBwcm94eSBtdXN0IG5vdCBiZSBuZXN0ZWQKLQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCWNvbnRhaW5lci5yZXBsYWNlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgaSk7Ci0JCQkJCXJldHVybiBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQkJfQotCi0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCQkJLy8gcHJveHkgbXVzdCBub3QgYmUgbmVzdGVkCi0JCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJfQotCQkJCQkJcmV0dXJuIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0KLQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCByZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKSB7Ci0JCVN0cmluZyBzb3VyY2UgPSBnZXRTb3VyY2UoKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsICYmIHNvdXJjZS5sZW5ndGgoKSA+IDApCi0JCQl0aGlzLmZTb3VyY2UgPSBzb3VyY2U7Ci0JCXN1cGVyLnJlc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucygpOwotCX0KLQotCS8qKgotCSAqIGdldERhdGEgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIHZvaWQgc2V0RGF0YShTdHJpbmcgZGF0YSkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5mU291cmNlID0gbnVsbDsKLQkJc3VwZXIuc2V0RGF0YShkYXRhKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKHRoaXMpOwotCQlpZiAodmFsaWRhdG9yLnZhbGlkYXRlU291cmNlKHNvdXJjZSkpCi0JCQlzZXRUZXh0U291cmNlKHNvdXJjZSk7Ci0JfQotCi0JLyoqCi0JICovCi0Jdm9pZCBzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlzdXBlci5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCXRoaXMuZlNvdXJjZSA9IG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dFNvdXJjZShTdHJpbmcgc291cmNlKSB7Ci0JCWlmICghaXNEYXRhRWRpdGFibGUoKSkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0KLQkJdGhpcy5mU291cmNlID0gc291cmNlOwotCi0JCW5vdGlmeVZhbHVlQ2hhbmdlZCgpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZhbHVlU291cmNlKFN0cmluZyBzb3VyY2UpIHsKLQkJaWYgKCFpc0RhdGFFZGl0YWJsZSgpKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQotCQlTb3VyY2VWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFNvdXJjZVZhbGlkYXRvcih0aGlzKTsKLQkJc2V0VGV4dFNvdXJjZSh2YWxpZGF0b3IuY29udmVydFNvdXJjZShzb3VyY2UpKTsKLQl9Ci0KLQkvKioKLQkgKiBzcGxpdFRleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5UZXh0Ci0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHVibGljIFRleHQgc3BsaXRUZXh0KGludCBvZmZzZXQpIHRocm93cyBET01FeGNlcHRpb24gewotCQlpZiAoIWlzRGF0YUVkaXRhYmxlKCkpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlpZiAob2Zmc2V0IDwgMCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGdldExlbmd0aCgpOwotCQlpZiAob2Zmc2V0ID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCQlEb2N1bWVudCBkb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgc291cmNlID0gbnVsbDsKLQkJaWYgKG9mZnNldCA8IGxlbmd0aCkgewotCQkJaW50IGNvdW50ID0gbGVuZ3RoIC0gb2Zmc2V0OwotCQkJc291cmNlID0gc3Vic3RyaW5nU291cmNlKG9mZnNldCwgY291bnQpOwotCQkJZGVsZXRlRGF0YShvZmZzZXQsIGNvdW50KTsKLQkJfQotCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShudWxsKTsKLQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJdGV4dC5zZXRUZXh0U291cmNlKHNvdXJjZSk7Ci0KLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkKLQkJCXBhcmVudC5pbnNlcnRCZWZvcmUodGV4dCwgZ2V0TmV4dFNpYmxpbmcoKSk7Ci0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JLyoqCi0JICovCi0JVGV4dCBzcGxpdFRleHQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8ICEoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJaW50IGluZGV4ID0gMDsKLQkJZm9yICg7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKLQkJCWlmIChjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KSA9PSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKQotCQkJCWJyZWFrOwotCQl9Ci0JCWlmIChpbmRleCA+PSBjb3VudCkgewotCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGEgbmV3Ci0JCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkvLyBzZWFyY2ggZ2FwIGJ5IG9mZnNldAotCQkJaW50IG9mZnNldCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCWZvciAoaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpbmRleCk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJaWYgKGNvbnRlbnQuZ2V0U3RhcnQoKSA+PSBvZmZzZXQpCi0JCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGluZGV4ID49IGNvdW50KQotCQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQl9Ci0JCWlmIChpbmRleCA9PSAwKQotCQkJcmV0dXJuIHRoaXM7IC8vIG5vdGhpbmcgdG8gZG8KLQotCQlEb2N1bWVudCBkb2N1bWVudCA9IGdldE93bmVyRG9jdW1lbnQoKTsKLQkJaWYgKGRvY3VtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJTm9kZSBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOyAvLyBlcnJvcgotCQlUZXh0SW1wbCBuZXh0VGV4dCA9IChUZXh0SW1wbCkgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCWlmIChuZXh0VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7IC8vIGVycm9yCi0KLQkJZm9yICg7IGluZGV4IDwgY291bnQ7IGNvdW50LS0pIHsKLQkJCW5leHRUZXh0LmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihjb250YWluZXIucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGluZGV4KSk7Ci0JCX0KLQotCQkvLyBub3JtYWxpemUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQlpZiAoaW5kZXggPT0gMSkgewotCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oMCkpOwotCQl9Ci0KLQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXh0VGV4dCwgZ2V0TmV4dFNpYmxpbmcoKSk7Ci0JCXJldHVybiBuZXh0VGV4dDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRydW5zIGRhdGEgZm9yIHRoZSByYW5nZQotCSAqLwotCXByaXZhdGUgU3RyaW5nIHN1YnN0cmluZ0RhdGEoU3RyaW5nIGRhdGEsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHN1cmUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgbm9uLW5lZ2F0aXZlCi0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoKCk7Ci0JCWlmIChvZmZzZXQgPiBsZW5ndGgpIHsKLQkJCXRocm93IG5ldyBET01FeGNlcHRpb24oRE9NRXhjZXB0aW9uLklOREVYX1NJWkVfRVJSLCBuZXcgU3RyaW5nKCkpOwotCQl9Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQkJaWYgKGVuZCA+IGxlbmd0aCkgewotCQkJdGhyb3cgbmV3IERPTUV4Y2VwdGlvbihET01FeGNlcHRpb24uSU5ERVhfU0laRV9FUlIsIG5ldyBTdHJpbmcoKSk7Ci0JCX0KLQkJcmV0dXJuIGRhdGEuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNvdXJjZSBmb3IgdGhlIHJhbmdlIHNwZWNpZmllZCBieTogb2Zmc2V0OiBkYXRhIG9mZnNldCBjb3VudDoKLQkgKiBkYXRhIGNvdW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RyaW5nU291cmNlKGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHN1cmUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgbm9uLW5lZ2F0aXZlCi0JCWlmICh0aGlzLmZTb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBzdWJzdHJpbmdTb3VyY2UodGhpcy5mU291cmNlLCBvZmZzZXQsIGNvdW50KTsKLQotCQlTdHJpbmcgZGF0YSA9IHN1cGVyLmdldERhdGEoKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCAmJiBkYXRhLmxlbmd0aCgpID4gMCkgewotCQkJZGF0YSA9IHN1YnN0cmluZ0RhdGEoZGF0YSwgb2Zmc2V0LCBjb3VudCk7Ci0JCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJCXJldHVybiBuZXcgU3RyaW5nKCk7Ci0JCQlTdHJpbmcgc291cmNlID0gZ2V0U291cmNlKGRhdGEpOwotCQkJaWYgKHNvdXJjZSAhPSBudWxsKQotCQkJCXJldHVybiBzb3VyY2U7Ci0JCX0KLQotCQlyZXR1cm4gc3Vic3RyaW5nU291cmNlKGdldFNvdXJjZSgpLCBvZmZzZXQsIGNvdW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNvdXJjZSBmb3IgdGhlIHJhbmdlIHNwZWNpZmllZCBieTogb2Zmc2V0OiBkYXRhIG9mZnNldCBjb3VudDoKLQkgKiBkYXRhIGNvdW50Ci0JICovCi0JcHJpdmF0ZSBTdHJpbmcgc3Vic3RyaW5nU291cmNlKFN0cmluZyBzb3VyY2UsIGludCBvZmZzZXQsIGludCBjb3VudCkgdGhyb3dzIERPTUV4Y2VwdGlvbiB7Ci0JCS8vIHN1cmUgb2Zmc2V0IGFuZCBjb3VudCBhcmUgbm9uLW5lZ2F0aXZlCi0JCWlmIChjb3VudCA9PSAwKQotCQkJcmV0dXJuIG5ldyBTdHJpbmcoKTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQotCQkvLyBmaW5kIGNoYXJhY3RlciByZWZlcmVuY2UKLQkJaW50IHJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJyk7Ci0JCXdoaWxlIChyZWYgPj0gMCkgewotCQkJaWYgKHJlZiA+PSBlbmQpCi0JCQkJYnJlYWs7Ci0JCQlpbnQgcmVmRW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChyZWZFbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIHJlZkVuZCk7Ci0JCQkJaWYgKGdldENoYXJWYWx1ZShuYW1lKSAhPSBudWxsKSB7Ci0JCQkJCS8vIGZvdW5kLCBzaGlmdCBmb3Igc291cmNlIG9mZnNldHMKLQkJCQkJaW50IHJlZkNvdW50ID0gcmVmRW5kIC0gcmVmOwotCQkJCQlpZiAocmVmIDwgb2Zmc2V0KQotCQkJCQkJb2Zmc2V0ICs9IHJlZkNvdW50OwotCQkJCQlpZiAocmVmIDwgZW5kKQotCQkJCQkJZW5kICs9IHJlZkNvdW50OwotCQkJCQlyZWYgPSByZWZFbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCi0JCWlmIChvZmZzZXQgPiBsZW5ndGggfHwgZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCXJldHVybiBzb3VyY2Uuc3Vic3RyaW5nKG9mZnNldCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNvdXJjZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5OiBvZmZzZXQ6IGRhdGEKLQkgKiBvZmZzZXQgY291bnQ6IGRhdGEgY291bnQKLQkgKi8KLQlwcml2YXRlIFN0cmluZ1BhaXIgc3Vic3RyaW5nU291cmNlRXhjbHVkZWQoU3RyaW5nIHNvdXJjZSwgaW50IG9mZnNldCwgaW50IGNvdW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uIHsKLQkJLy8gc3VyZSBvZmZzZXQgYW5kIGNvdW50IGFyZSBub24tbmVnYXRpdmUKLQkJaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0JCQlpZiAob2Zmc2V0ID09IDAgJiYgY291bnQgPT0gMCkKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1BhaXIobnVsbCwgbnVsbCk7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCWludCBlbmQgPSBvZmZzZXQgKyBjb3VudDsKLQotCQkvLyBmaW5kIGNoYXJhY3RlciByZWZlcmVuY2UKLQkJaW50IHJlZiA9IHNvdXJjZS5pbmRleE9mKCcmJyk7Ci0JCXdoaWxlIChyZWYgPj0gMCkgewotCQkJaWYgKHJlZiA+PSBlbmQpCi0JCQkJYnJlYWs7Ci0JCQlpbnQgcmVmRW5kID0gc291cmNlLmluZGV4T2YoJzsnLCByZWYgKyAxKTsKLQkJCWlmIChyZWZFbmQgPiByZWYgKyAxKSB7Ci0JCQkJU3RyaW5nIG5hbWUgPSBzb3VyY2Uuc3Vic3RyaW5nKHJlZiArIDEsIHJlZkVuZCk7Ci0JCQkJaWYgKGdldENoYXJWYWx1ZShuYW1lKSAhPSBudWxsKSB7Ci0JCQkJCS8vIGZvdW5kLCBzaGlmdCBmb3Igc291cmNlIG9mZnNldHMKLQkJCQkJaW50IHJlZkNvdW50ID0gcmVmRW5kIC0gcmVmOwotCQkJCQlpZiAocmVmIDwgb2Zmc2V0KQotCQkJCQkJb2Zmc2V0ICs9IHJlZkNvdW50OwotCQkJCQlpZiAocmVmIDwgZW5kKQotCQkJCQkJZW5kICs9IHJlZkNvdW50OwotCQkJCQlyZWYgPSByZWZFbmQ7Ci0JCQkJfQotCQkJfQotCQkJcmVmID0gc291cmNlLmluZGV4T2YoJyYnLCByZWYgKyAxKTsKLQkJfQotCi0JCWlmIChvZmZzZXQgPiBsZW5ndGggfHwgZW5kID4gbGVuZ3RoKSB7Ci0JCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5JTkRFWF9TSVpFX0VSUiwgbmV3IFN0cmluZygpKTsKLQkJfQotCi0JCVN0cmluZyBmaXJzdCA9IChvZmZzZXQgPiAwID8gc291cmNlLnN1YnN0cmluZygwLCBvZmZzZXQpIDogbnVsbCk7Ci0JCVN0cmluZyBzZWNvbmQgPSAoZW5kIDwgbGVuZ3RoID8gc291cmNlLnN1YnN0cmluZyhlbmQsIGxlbmd0aCkgOiBudWxsKTsKLQkJcmV0dXJuIG5ldyBTdHJpbmdQYWlyKGZpcnN0LCBzZWNvbmQpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0V2hvbGVUZXh0KCkgewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBJbXBsZW1lbnRlZCBpbiB0aGlzIHZlcnNpb24uIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0gICAgLyoqCi0JICogUmVwbGFjZXMgdGhlIHRleHQgb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgYWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0Ci0JICogbm9kZXMgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQuIEFsbCBsb2dpY2FsbHktYWRqYWNlbnQgdGV4dCBub2RlcyBhcmUKLQkgKiByZW1vdmVkIGluY2x1ZGluZyB0aGUgY3VycmVudCBub2RlIHVubGVzcyBpdCB3YXMgdGhlIHJlY2lwaWVudCBvZiB0aGUKLQkgKiByZXBsYWNlbWVudCB0ZXh0LiA8YnI+Ci0JICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbm9kZSB3aGljaCByZWNlaXZlZCB0aGUgcmVwbGFjZW1lbnQgdGV4dC4gVGhlCi0JICogcmV0dXJuZWQgbm9kZSBpczoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPm51bGw8L2NvZGU+LCB3aGVuIHRoZSByZXBsYWNlbWVudCB0ZXh0IGlzIHRoZSBlbXB0eQotCSAqIHN0cmluZzsgPC9saT4KLQkgKiA8bGk+dGhlIGN1cnJlbnQgbm9kZSwgZXhjZXB0IHdoZW4gdGhlIGN1cnJlbnQgbm9kZSBpcyByZWFkLW9ubHk7IDwvbGk+Ci0JICogPGxpPiBhIG5ldyA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIG9mIHRoZSBzYW1lIHR5cGUgKAotCSAqIDxjb2RlPlRleHQ8L2NvZGU+IG9yIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4pIGFzIHRoZSBjdXJyZW50Ci0JICogbm9kZSBpbnNlcnRlZCBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlcGxhY2VtZW50LiA8L2xpPgotCSAqIDwvdWw+Ci0JICogPGJyPgotCSAqIEZvciBpbnN0YW5jZSwgaW4gdGhlIGFib3ZlIGV4YW1wbGUgY2FsbGluZwotCSAqIDxjb2RlPnJlcGxhY2VXaG9sZVRleHQ8L2NvZGU+IG9uIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQKLQkgKiBjb250YWlucyAiYmFyIiB3aXRoICJ5byIgaW4gYXJndW1lbnQgcmVzdWx0cyBpbiB0aGUgZm9sbG93aW5nOiA8YnI+Ci0JICogV2hlcmUgdGhlIG5vZGVzIHRvIGJlIHJlbW92ZWQgYXJlIHJlYWQtb25seSBkZXNjZW5kYW50cyBvZiBhbgotCSAqIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+Ci0JICogbXVzdCBiZSByZW1vdmVkIGluc3RlYWQgb2YgdGhlIHJlYWQtb25seSBub2Rlcy4gSWYgYW55Ci0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiB0byBiZSByZW1vdmVkIGhhcyBkZXNjZW5kYW50cyB0aGF0IGFyZQotCSAqIG5vdCA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+LCA8Y29kZT5UZXh0PC9jb2RlPiwgb3IKLQkgKiA8Y29kZT5DREFUQVNlY3Rpb248L2NvZGU+IG5vZGVzLCB0aGUgPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4KLQkgKiBtZXRob2QgbXVzdCBmYWlsIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBtb2RpZmljYXRpb24gb2YgdGhlIGRvY3VtZW50LAotCSAqIHJhaXNpbmcgYSA8Y29kZT5ET01FeGNlcHRpb248L2NvZGU+IHdpdGggdGhlIGNvZGUKLQkgKiA8Y29kZT5OT19NT0RJRklDQVRJT05fQUxMT1dFRF9FUlI8L2NvZGU+LiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgZXhhbXBsZSBiZWxvdyBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIGZhaWxzLCBiZWNhdXNlIHRoZSA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IG5vZGUKLQkgKiAiZW50IiBjb250YWlucyBhbiA8Y29kZT5FbGVtZW50PC9jb2RlPiBub2RlIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50Ci0JICogICAgICAgICAgICBUaGUgY29udGVudCBvZiB0aGUgcmVwbGFjaW5nIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUuCi0JICogQHJldHVybiBUaGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSBjcmVhdGVkIHdpdGggdGhlIHNwZWNpZmllZAotCSAqICAgICAgICAgY29udGVudC4KLQkgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIG9uZSBvZiB0aGUKLQkgKiAgICAgICAgICAgICAgICA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcyBiZWluZyByZXBsYWNlZCBpcyByZWFkb25seS4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0gICAgcHVibGljIFRleHQgcmVwbGFjZVdob2xlVGV4dChTdHJpbmcgY29udGVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24gewotCQl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKERPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUiwgIk5vdCBpbXBsZW1lbnRlZCIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxHZW5lcmF0b3JJbXBsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTEdlbmVyYXRvckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU3MDhhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTEdlbmVyYXRvckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudFJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklYTUxDaGFyRW50aXR5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NQXR0cjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqIAotICovCi1wdWJsaWMgY2xhc3MgWE1MR2VuZXJhdG9ySW1wbCBpbXBsZW1lbnRzIElTb3VyY2VHZW5lcmF0b3IgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9DTE9TRSA9ICJdXT4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RBVEFfT1BFTiA9ICI8IVtDREFUQVsiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9DTE9TRSA9ICItLT4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUVOVF9PUEVOID0gIjwhLS0iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9PUEVOID0gIjwhRE9DVFlQRSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9DTE9TRSA9ICIgLz4iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5EX09QRU4gPSAiPC8iOy8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIFhNTEdlbmVyYXRvckltcGwgaW5zdGFuY2UgPSBudWxsOwotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9DTE9TRSA9ICI/PiI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQSV9PUEVOID0gIjw/IjsvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBVQkxJQ19JRCA9ICJQVUJMSUMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1BSRUZJWCA9ICJzc2kiOy8vJE5PTi1OTFMtMSQKLQkvL3ByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0lfRkVBVFVSRSA9ICJTU0kiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1NJX1RPS0VOID0gIiMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX0lEID0gIlNZU1RFTSI7Ly8kTk9OLU5MUy0xJAotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQ0xPU0UgPSAiPiI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICovCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgSVNvdXJjZUdlbmVyYXRvciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYTUxHZW5lcmF0b3JJbXBsKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQkvL3ByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRUYWcoWE1MRWxlbWVudCBlbGVtZW50KSB7Ci0JLy8JaWYgKGVsZW1lbnQgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vCURvY3VtZW50SW1wbCBkb2N1bWVudCA9IChEb2N1bWVudEltcGwpZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JLy8JaWYgKGRvY3VtZW50ID09IG51bGwpIHJldHVybiBmYWxzZTsKLQkvLwlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSBkb2N1bWVudC5nZXREb2N1bWVudFR5cGVBZGFwdGVyKCk7Ci0JLy8JaWYgKGFkYXB0ZXIgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwotCS8vCWlmICghYWRhcHRlci5oYXNGZWF0dXJlKFNTSV9GRUFUVVJFKSkgcmV0dXJuIGZhbHNlOwotCS8vCVN0cmluZyBwcmVmaXggPSBlbGVtZW50LmdldFByZWZpeCgpOwotCS8vCXJldHVybiAocHJlZml4ICE9IG51bGwgJiYgcHJlZml4LmVxdWFscyhTU0lfUFJFRklYKSk7Ci0JLy99Ci0JLyoqCi0JICogSGVscGVyIHRvIG1vZGlmeSB0aGUgdGFnIG5hbWUgaW4gc3ViLWNsYXNzZXMKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyB2b2lkIHNldFRhZ05hbWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdGFnTmFtZSkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJKChFbGVtZW50SW1wbCkgZWxlbWVudCkuc2V0VGFnTmFtZSh0YWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBYTUxNb2RlbEdlbmVyYXRvciBjb25zdHJ1Y3RvcgotCSAqLwotCXByaXZhdGUgWE1MR2VuZXJhdG9ySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0ck5hbWUoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCWlmIChhdHRyTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChhdHRyTmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpIHsKLQkJCWlmICghYXR0ck5hbWUuZW5kc1dpdGgoSlNQVGFnLlRBR19DTE9TRSkpIHsKLQkJCQkvLyBjbG9zZSBKU1AKLQkJCQlyZXR1cm4gKGF0dHJOYW1lICsgSlNQVGFnLlRBR19DTE9TRSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKCgoSURPTUF0dHIpIGF0dHIpLmlzR2xvYmFsQXR0cigpICYmIENNTm9kZVV0aWwuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cikgIT0gbnVsbCkgewotCQkJc3dpdGNoIChnZXRBdHRyTmFtZUNhc2UoYXR0cikpIHsKLQkJCQljYXNlIERvY3VtZW50VHlwZUFkYXB0ZXIuVVBQRVJfQ0FTRSA6Ci0JCQkJCWF0dHJOYW1lID0gYXR0ck5hbWUudG9VcHBlckNhc2UoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0UgOgotCQkJCQlhdHRyTmFtZSA9IGF0dHJOYW1lLnRvTG93ZXJDYXNlKCk7Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQkvLyBBU0lTX0NBU0UKLQkJCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGF0dHJOYW1lOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyKSB7Ci0JCXJldHVybiBnZW5lcmF0ZUF0dHJWYWx1ZShhdHRyLCAoY2hhcikgMCk7IC8vIG5vIHF1b3RlIHByZWZlcmVuY2UKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKEF0dHIgYXR0ciwgY2hhciBxdW90ZSkgewotCQlpZiAoYXR0ciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyBuYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0JCVNvdXJjZVZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgU291cmNlVmFsaWRhdG9yKGF0dHIpOwotCQlTdHJpbmcgdmFsdWUgPSB2YWxpZGF0b3IuY29udmVydFNvdXJjZSgoKElET01Ob2RlKSBhdHRyKS5nZXRWYWx1ZVNvdXJjZSgpKTsKLQkJaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoKCkgPT0gMCkgewotCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiBuYW1lLnN0YXJ0c1dpdGgoSlNQVGFnLlRBR19PUEVOKSkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCWlmIChpc0Jvb2xlYW5BdHRyKGF0dHIpKSB7Ci0JCQkJaWYgKCgoQXR0ckltcGwpIGF0dHIpLmlzWE1MQXR0cigpKSB7Ci0JCQkJCS8vIGdlbmVyYXRlIHRoZSBuYW1lIGFzIHZhbHVlCi0JCQkJCXZhbHVlID0gYXR0ci5nZXROYW1lKCk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gbm90IHRvIGdlbmVyYXRlICc9JyBhbmQgdmFsdWUgZm9yIEhUTUwgYm9vbGVhbgotCQkJCQlyZXR1cm4gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGdlbmVyYXRlQXR0clZhbHVlKHZhbHVlLCBxdW90ZSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUF0dHJWYWx1ZShTdHJpbmcgdmFsdWUsIGNoYXIgcXVvdGUpIHsKLQkJLy8gYXNzdW1lIHRoZSB2YWxpZCBpcyBhbHJlYWR5IHZhbGlkYXRlZCBub3QgdG8gaW5jbHVkZSBib3RoIHF1b3RlcwotCQlpZiAocXVvdGUgPT0gJyInKSB7Ci0JCQlpZiAoKHZhbHVlICE9IG51bGwpICYmICh2YWx1ZS5pbmRleE9mKCciJykgPj0gMCkpCi0JCQkJcXVvdGUgPSAnXCcnOyAvLyBmb3JjZQotCQl9IGVsc2UgaWYgKHF1b3RlID09ICdcJycpIHsKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJ1wnJykgPj0gMCkpCi0JCQkJcXVvdGUgPSAnIic7IC8vIGZvcmNlCi0JCX0gZWxzZSB7IC8vIG5vIHByZWZlcmVuY2UKLQkJCWlmICgodmFsdWUgIT0gbnVsbCkgJiYgKHZhbHVlLmluZGV4T2YoJyInKSA8IDApKQotCQkJCXF1b3RlID0gJyInOwotCQkJZWxzZQotCQkJCXF1b3RlID0gJ1wnJzsKLQkJfQotCi0JCWludCBsZW5ndGggPSAodmFsdWUgPT0gbnVsbCA/IDAgOiB2YWx1ZS5sZW5ndGgoKSk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDIpOwotCQlidWZmZXIuYXBwZW5kKHF1b3RlKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHZhbHVlKTsKLQkJYnVmZmVyLmFwcGVuZChxdW90ZSk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ0RBVEFTZWN0aW9uCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpIHsKLQkJaWYgKGNkYXRhID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IGNkYXRhLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9IChkYXRhICE9IG51bGwgPyBkYXRhLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDE2KTsKLQkJYnVmZmVyLmFwcGVuZChDREFUQV9PUEVOKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWJ1ZmZlci5hcHBlbmQoQ0RBVEFfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDaGlsZChOb2RlIHBhcmVudE5vZGUpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoIXBhcmVudE5vZGUuaGFzQ2hpbGROb2RlcygpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50Tm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJU3RyaW5nIGNoaWxkU291cmNlID0gZ2VuZXJhdGVTb3VyY2UoY2hpbGQpOwotCQkJaWYgKGNoaWxkU291cmNlICE9IG51bGwpCi0JCQkJYnVmZmVyLmFwcGVuZChjaGlsZFNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVDbG9zZVRhZyhOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkJaWYgKGVsZW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJCXJldHVybiBKU1BUYWcuQ09NTUVOVF9DTE9TRTsKLQkJCQkJcmV0dXJuIENPTU1FTlRfQ0xPU0U7Ci0JCQkJfQotCQkJCWlmIChlbGVtZW50LmlzSlNQVGFnKCkpCi0JCQkJCXJldHVybiBKU1BUYWcuVEFHX0NMT1NFOwotCQkJCWlmIChlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJcmV0dXJuIEVNUFRZX0NMT1NFOwotCQkJCXJldHVybiBUQUdfQ0xPU0U7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCUNvbW1lbnRJbXBsIGNvbW1lbnQgPSAoQ29tbWVudEltcGwpIG5vZGU7Ci0JCQkJaWYgKGNvbW1lbnQuaXNKU1BUYWcoKSkKLQkJCQkJcmV0dXJuIEpTUFRhZy5DT01NRU5UX0NMT1NFOwotCQkJCXJldHVybiBDT01NRU5UX0NMT1NFOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJcmV0dXJuIFRBR19DTE9TRTsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXJldHVybiBQSV9DTE9TRTsKLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJCXJldHVybiBDREFUQV9DTE9TRTsKLQkJCWRlZmF1bHQgOgotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVDb21tZW50IG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBjb21tZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Db21tZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZUNvbW1lbnQoQ29tbWVudCBjb21tZW50KSB7Ci0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgZGF0YSA9IGNvbW1lbnQuZ2V0RGF0YSgpOwotCQlpbnQgbGVuZ3RoID0gKGRhdGEgIT0gbnVsbCA/IGRhdGEubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgOCk7Ci0JCUNvbW1lbnRJbXBsIGltcGwgPSAoQ29tbWVudEltcGwpIGNvbW1lbnQ7Ci0JCWlmICghaW1wbC5pc0pTUFRhZygpKQotCQkJYnVmZmVyLmFwcGVuZChDT01NRU5UX09QRU4pOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX09QRU4pOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChkYXRhKTsKLQkJaWYgKCFpbXBsLmlzSlNQVGFnKCkpCi0JCQlidWZmZXIuYXBwZW5kKENPTU1FTlRfQ0xPU0UpOwotCQllbHNlCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX0NMT1NFKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRG9jdHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZG9jVHlwZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlCi0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZURvY3R5cGUoRG9jdW1lbnRUeXBlIGRvY1R5cGUpIHsKLQkJaWYgKGRvY1R5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBuYW1lID0gZG9jVHlwZS5nZXROYW1lKCk7Ci0JCWludCBsZW5ndGggPSAobmFtZSAhPSBudWxsID8gbmFtZS5sZW5ndGgoKSA6IDApOwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyAxNik7Ci0JCWJ1ZmZlci5hcHBlbmQoRE9DVFlQRV9PUEVOKTsKLQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQlpZiAobmFtZSAhPSBudWxsKQotCQkJYnVmZmVyLmFwcGVuZChuYW1lKTsKLQkJRG9jdW1lbnRUeXBlSW1wbCBkdCA9IChEb2N1bWVudFR5cGVJbXBsKSBkb2NUeXBlOwotCQlTdHJpbmcgcHVibGljSUQgPSBkdC5nZXRQdWJsaWNJZCgpOwotCQlTdHJpbmcgc3lzdGVtSUQgPSBkdC5nZXRTeXN0ZW1JZCgpOwotCQlpZiAocHVibGljSUQgIT0gbnVsbCkgewotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZChQVUJMSUNfSUQpOwotCQkJYnVmZmVyLmFwcGVuZCgnICcpOwotCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJYnVmZmVyLmFwcGVuZChwdWJsaWNJRCk7Ci0JCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQlpZiAoc3lzdGVtSUQgIT0gbnVsbCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKHN5c3RlbUlEICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChTWVNURU1fSUQpOwotCQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCQlidWZmZXIuYXBwZW5kKCciJyk7Ci0JCQkJYnVmZmVyLmFwcGVuZChzeXN0ZW1JRCk7Ci0JCQkJYnVmZmVyLmFwcGVuZCgnIicpOwotCQkJfQotCQl9Ci0JCWJ1ZmZlci5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gaWYgZW1wdHkgdGFnIGlzIHByZWZlcnJhYmxlLCBnZW5lcmF0ZSBhcyBlbXB0eSB0YWcKLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQkJaWYgKGltcGwucHJlZmVyRW1wdHlUYWcoKSkKLQkJCWltcGwuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJU3RyaW5nIHN0YXJ0VGFnID0gZ2VuZXJhdGVTdGFydFRhZyhlbGVtZW50KTsKLQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHN0YXJ0VGFnKTsKLQkJU3RyaW5nIGNoaWxkID0gZ2VuZXJhdGVDaGlsZChlbGVtZW50KTsKLQkJaWYgKGNoaWxkICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNoaWxkKTsKLQkJU3RyaW5nIGVuZFRhZyA9IGdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQlpZiAoZW5kVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGVuZFRhZyk7Ci0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVuZFRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbmRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlFbGVtZW50SW1wbCBpbXBsID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCi0JCS8vIGZpcnN0IGNoZWNrIGlmIHRhZyBhZGFwdGVyIGV4aXN0cwotCQlUYWdBZGFwdGVyIGFkYXB0ZXIgPSAoVGFnQWRhcHRlcikgaW1wbC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCVN0cmluZyBlbmRUYWcgPSBhZGFwdGVyLmdldEVuZFRhZyhpbXBsKTsKLQkJCWlmIChlbmRUYWcgIT0gbnVsbCkKLQkJCQlyZXR1cm4gZW5kVGFnOwotCQl9Ci0KLQkJaWYgKGltcGwuaXNFbXB0eVRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICghaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChpbXBsLmlzSlNQVGFnKCkpCi0JCQlyZXR1cm4gSlNQVGFnLlRBR19DTE9TRTsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IGdlbmVyYXRlVGFnTmFtZShlbGVtZW50KTsKLQkJaW50IGxlbmd0aCA9ICh0YWdOYW1lICE9IG51bGwgPyB0YWdOYW1lLmxlbmd0aCgpIDogMCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDQpOwotCQlidWZmZXIuYXBwZW5kKEVORF9PUEVOKTsKLQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJz4nKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlRW50aXR5UmVmIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbnRpdHlSZWYKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVFbnRpdHlSZWYoRW50aXR5UmVmZXJlbmNlIGVudGl0eVJlZikgewotCQlpZiAoZW50aXR5UmVmID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmcgbmFtZSA9IGVudGl0eVJlZi5nZXROb2RlTmFtZSgpOwotCQlpbnQgbGVuZ3RoID0gKG5hbWUgIT0gbnVsbCA/IG5hbWUubGVuZ3RoKCkgOiAwKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIobGVuZ3RoICsgNCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyYnKTsKLQkJaWYgKG5hbWUgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0JCWJ1ZmZlci5hcHBlbmQoJzsnKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIGdlbmVyYXRlUEkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHBpCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlUEkoUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0JCWlmIChwaSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJU3RyaW5nIHRhcmdldCA9IHBpLmdldFRhcmdldCgpOwotCQlTdHJpbmcgZGF0YSA9IHBpLmdldERhdGEoKTsKLQkJaW50IGxlbmd0aCA9ICh0YXJnZXQgIT0gbnVsbCA/IHRhcmdldC5sZW5ndGgoKSA6IDApOwotCQlpZiAoZGF0YSAhPSBudWxsKQotCQkJbGVuZ3RoICs9IGRhdGEubGVuZ3RoKCk7Ci0JCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKGxlbmd0aCArIDgpOwotCQlidWZmZXIuYXBwZW5kKFBJX09QRU4pOwotCQlpZiAodGFyZ2V0ICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKHRhcmdldCk7Ci0JCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJaWYgKGRhdGEgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoZGF0YSk7Ci0JCWJ1ZmZlci5hcHBlbmQoUElfQ0xPU0UpOwotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogZ2VuZXJhdGVTb3VyY2UgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlU291cmNlKE5vZGUgbm9kZSkgewotCQlzd2l0Y2ggKG5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRWxlbWVudCgoRWxlbWVudCkgbm9kZSk7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCQlyZXR1cm4gZ2VuZXJhdGVUZXh0KChUZXh0KSBub2RlKTsKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZUNvbW1lbnQoKENvbW1lbnQpIG5vZGUpOwotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRG9jdHlwZSgoRG9jdW1lbnRUeXBlKSBub2RlKTsKLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOgotCQkJCXJldHVybiBnZW5lcmF0ZVBJKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpOwotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlQ0RBVEFTZWN0aW9uKChDREFUQVNlY3Rpb24pIG5vZGUpOwotCQkJY2FzZSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSA6Ci0JCQkJcmV0dXJuIGdlbmVyYXRlRW50aXR5UmVmKChFbnRpdHlSZWZlcmVuY2UpIG5vZGUpOwotCQkJZGVmYXVsdCA6Ci0JCQkJLy8gRE9DVU1FTlQKLQkJCQlicmVhazsKLQkJfQotCQlyZXR1cm4gZ2VuZXJhdGVDaGlsZChub2RlKTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBFbGVtZW50Ci0JICovCi0JcHVibGljIFN0cmluZyBnZW5lcmF0ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJRWxlbWVudEltcGwgaW1wbCA9IChFbGVtZW50SW1wbCkgZWxlbWVudDsKLQotCQlpZiAoaW1wbC5pc0pTUFRhZygpKSB7Ci0JCQkvLyBjaGVjayBpZiBKU1AgY29udGVudCB0eXBlIGFuZCBKU1AgRG9jdW1lbnQKLQkJCUlET01Eb2N1bWVudCBkb2N1bWVudCA9IChJRE9NRG9jdW1lbnQpIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50ICE9IG51bGwgJiYgZG9jdW1lbnQuaXNKU1BUeXBlKCkpIHsKLQkJCQlpZiAoZG9jdW1lbnQuaXNKU1BEb2N1bWVudCgpICYmICFpbXBsLmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQlpbXBsLnNldEpTUFRhZyhmYWxzZSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQlpbXBsLnNldEpTUFRhZyhmYWxzZSk7Ci0JCQl9Ci0JCX0KLQkJaWYgKGltcGwuaXNDb21tZW50VGFnKCkgJiYgaW1wbC5nZXRFeGlzdGluZ0FkYXB0ZXIoVGFnQWRhcHRlci5jbGFzcykgPT0gbnVsbCkgewotCQkJQ29tbWVudEVsZW1lbnRSZWdpc3RyeSByZWdpc3RyeSA9IENvbW1lbnRFbGVtZW50UmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTsKLQkJCXJlZ2lzdHJ5LnNldHVwQ29tbWVudEVsZW1lbnQoaW1wbCk7Ci0JCX0KLQotCQkvLyBmaXJzdCBjaGVjayBpZiB0YWcgYWRhcHRlciBleGlzdHMKLQkJVGFnQWRhcHRlciBhZGFwdGVyID0gKFRhZ0FkYXB0ZXIpIGltcGwuZ2V0RXhpc3RpbmdBZGFwdGVyKFRhZ0FkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RhcnRUYWcgPSBhZGFwdGVyLmdldFN0YXJ0VGFnKGltcGwpOwotCQkJaWYgKHN0YXJ0VGFnICE9IG51bGwpCi0JCQkJcmV0dXJuIHN0YXJ0VGFnOwotCQl9Ci0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlpZiAoaW1wbC5pc0NvbW1lbnRUYWcoKSkgewotCQkJaWYgKGltcGwuaXNKU1BUYWcoKSkKLQkJCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5DT01NRU5UX09QRU4pOwotCQkJZWxzZQotCQkJCWJ1ZmZlci5hcHBlbmQoQ09NTUVOVF9PUEVOKTsKLQkJCVN0cmluZyB0YWdOYW1lID0gZ2VuZXJhdGVUYWdOYW1lKGVsZW1lbnQpOwotCQkJaWYgKHRhZ05hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKHRhZ05hbWUpOwotCQl9IGVsc2UgaWYgKGltcGwuaXNKU1BUYWcoKSkgewotCQkJYnVmZmVyLmFwcGVuZChKU1BUYWcuVEFHX09QRU4pOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCQlpZiAoaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsgLy8gSlNQIGNvbnRhaW5lcgotCQl9IGVsc2UgewotCQkJYnVmZmVyLmFwcGVuZCgnPCcpOwotCQkJU3RyaW5nIHRhZ05hbWUgPSBnZW5lcmF0ZVRhZ05hbWUoZWxlbWVudCk7Ci0JCQlpZiAodGFnTmFtZSAhPSBudWxsKQotCQkJCWJ1ZmZlci5hcHBlbmQodGFnTmFtZSk7Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWJ1ZmZlci5hcHBlbmQoJyAnKTsKLQkJCVN0cmluZyBhdHRyTmFtZSA9IGdlbmVyYXRlQXR0ck5hbWUoYXR0cik7Ci0JCQlpZiAoYXR0ck5hbWUgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJOYW1lKTsKLQkJCVN0cmluZyBhdHRyVmFsdWUgPSBnZW5lcmF0ZUF0dHJWYWx1ZShhdHRyKTsKLQkJCWlmIChhdHRyVmFsdWUgIT0gbnVsbCkgewotCQkJCS8vIGF0dHIgbmFtZSBvbmx5IGZvciBIVE1MIGJvb2xlYW4gYW5kIEpTUAotCQkJCWJ1ZmZlci5hcHBlbmQoJz0nKTsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgY2xvc2VUYWcgPSBnZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkKLQkJCWJ1ZmZlci5hcHBlbmQoY2xvc2VUYWcpOwotCi0JCXJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGFnTmFtZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJRE9NRWxlbWVudCB4ZSA9IChJRE9NRWxlbWVudCkgZWxlbWVudDsKLQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAoeGUuaXNKU1BUYWcoKSkgewotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfRVhQUkVTU0lPTikpCi0JCQkJcmV0dXJuIEpTUFRhZy5FWFBSRVNTSU9OX1RPS0VOOwotCQkJaWYgKHRhZ05hbWUuZXF1YWxzKEpTUFRhZy5KU1BfREVDTEFSQVRJT04pKQotCQkJCXJldHVybiBKU1BUYWcuREVDTEFSQVRJT05fVE9LRU47Ci0JCQlpZiAodGFnTmFtZS5lcXVhbHMoSlNQVGFnLkpTUF9ESVJFQ1RJVkUpKQotCQkJCXJldHVybiBKU1BUYWcuRElSRUNUSVZFX1RPS0VOOwotCQkJaWYgKHRhZ05hbWUuc3RhcnRzV2l0aChKU1BUYWcuSlNQX0RJUkVDVElWRSkpIHsKLQkJCQlpbnQgb2Zmc2V0ID0gSlNQVGFnLkpTUF9ESVJFQ1RJVkUubGVuZ3RoKCkgKyAxOyAvLyBhZnRlciAnLicKLQkJCQlyZXR1cm4gKEpTUFRhZy5ESVJFQ1RJVkVfVE9LRU4gKyB0YWdOYW1lLnN1YnN0cmluZyhvZmZzZXQpKTsKLQkJCX0KLQkJCXJldHVybiAoeGUuaXNDb21tZW50VGFnKCkpID8gdGFnTmFtZSA6IG51bGw7Ci0JCX0gZWxzZSBpZiAodGFnTmFtZS5zdGFydHNXaXRoKEpTUFRhZy5UQUdfT1BFTikpIHsKLQkJCWlmICghdGFnTmFtZS5lbmRzV2l0aChKU1BUYWcuVEFHX0NMT1NFKSkgewotCQkJCS8vIGNsb3NlIEpTUAotCQkJCXJldHVybiAodGFnTmFtZSArIEpTUFRhZy5UQUdfQ0xPU0UpOwotCQkJfQotCQl9IGVsc2UgaWYgKHhlLmlzQ29tbWVudFRhZygpKSB7Ci0JCQlTdHJpbmcgcHJlZml4ID0gZWxlbWVudC5nZXRQcmVmaXgoKTsKLQkJCWlmIChwcmVmaXguZXF1YWxzKFNTSV9QUkVGSVgpKSB7Ci0JCQkJcmV0dXJuIChTU0lfVE9LRU4gKyBlbGVtZW50LmdldExvY2FsTmFtZSgpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCWlmICgheGUuaXNKU1BUYWcoKSAmJiB4ZS5pc0dsb2JhbFRhZygpICYmIC8vIGdsb2JhbCB0YWcKLQkJCQkJCUNNTm9kZVV0aWwuZ2V0RWxlbWVudERlY2xhcmF0aW9uKHhlKSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIG5ld05hbWUgPSB0YWdOYW1lOwotCQkJCXN3aXRjaCAoZ2V0VGFnTmFtZUNhc2UoeGUpKSB7Ci0JCQkJCWNhc2UgRG9jdW1lbnRUeXBlQWRhcHRlci5VUFBFUl9DQVNFIDoKLQkJCQkJCW5ld05hbWUgPSB0YWdOYW1lLnRvVXBwZXJDYXNlKCk7Ci0JCQkJCQlicmVhazsKLQkJCQkJY2FzZSBEb2N1bWVudFR5cGVBZGFwdGVyLkxPV0VSX0NBU0UgOgotCQkJCQkJbmV3TmFtZSA9IHRhZ05hbWUudG9Mb3dlckNhc2UoKTsKLQkJCQkJCWJyZWFrOwotCQkJCX0KLQkJCQlpZiAobmV3TmFtZSAhPSB0YWdOYW1lKSB7Ci0JCQkJCXRhZ05hbWUgPSBuZXdOYW1lOwotCQkJCQlzZXRUYWdOYW1lKGVsZW1lbnQsIHRhZ05hbWUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gdGFnTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVRleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICogQHBhcmFtIHRleHQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLlRleHQKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGV4dChUZXh0IHRleHQpIHsKLQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlUZXh0SW1wbCBpbXBsID0gKFRleHRJbXBsKSB0ZXh0OwotCQlTdHJpbmcgc291cmNlID0gaW1wbC5nZXRUZXh0U291cmNlKCk7Ci0JCWlmIChzb3VyY2UgIT0gbnVsbCkKLQkJCXJldHVybiBzb3VyY2U7Ci0JCXJldHVybiBnZW5lcmF0ZVRleHREYXRhKHRleHQsIGltcGwuZ2V0RGF0YSgpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdlbmVyYXRlVGV4dERhdGEoVGV4dCB0ZXh0LCBTdHJpbmcgZGF0YSkgewotCQlpZiAoZGF0YSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJVGV4dEltcGwgaW1wbCA9IChUZXh0SW1wbCkgdGV4dDsKLQkJaWYgKGltcGwuaXNKU1BDb250ZW50KCkgfHwgaW1wbC5pc0NEQVRBQ29udGVudCgpKSB7Ci0JCQlyZXR1cm4gbmV3IFNvdXJjZVZhbGlkYXRvcihpbXBsKS5jb252ZXJ0U291cmNlKGRhdGEpOwotCQl9Ci0JCVN0cmluZyBzb3VyY2UgPSBkYXRhOwotCi0JCS8vIGNvbnZlcnQgc3BlY2lhbCBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBlbnRpdGllcwotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbnVsbDsKLQkJaW50IG9mZnNldCA9IDA7Ci0JCWludCBsZW5ndGggPSBkYXRhLmxlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQlTdHJpbmcgbmFtZSA9IGdldENoYXJOYW1lKGRhdGEuY2hhckF0KGkpKTsKLQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoYnVmZmVyID09IG51bGwpCi0JCQkJYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihsZW5ndGggKyA4KTsKLQkJCWlmIChpID4gb2Zmc2V0KQotCQkJCWJ1ZmZlci5hcHBlbmQoZGF0YS5zdWJzdHJpbmcob2Zmc2V0LCBpKSk7Ci0JCQlidWZmZXIuYXBwZW5kKCcmJyk7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQkJYnVmZmVyLmFwcGVuZCgnOycpOwotCQkJb2Zmc2V0ID0gaSArIDE7Ci0JCX0KLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAobGVuZ3RoID4gb2Zmc2V0KQotCQkJCWJ1ZmZlci5hcHBlbmQoZGF0YS5zdWJzdHJpbmcob2Zmc2V0KSk7Ci0JCQlzb3VyY2UgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCWlmIChzb3VyY2UgPT0gbnVsbCB8fCBzb3VyY2UubGVuZ3RoKCkgPT0gMCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gc291cmNlOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgaW50IGdldEF0dHJOYW1lQ2FzZShBdHRyIGF0dHIpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgYXR0ci5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCXJldHVybiBhZGFwdGVyLmdldEF0dHJOYW1lQ2FzZSgpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENoYXJOYW1lKGNoYXIgYykgewotCQlzd2l0Y2ggKGMpIHsKLQkJCWNhc2UgJzwnIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuTFRfTkFNRTsKLQkJCWNhc2UgJz4nIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuR1RfTkFNRTsKLQkJCWNhc2UgJyYnIDoKLQkJCQlyZXR1cm4gSVhNTENoYXJFbnRpdHkuQU1QX05BTUU7Ci0JCQljYXNlICciJyA6Ci0JCQkJcmV0dXJuIElYTUxDaGFyRW50aXR5LlFVT1RfTkFNRTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIGludCBnZXRUYWdOYW1lQ2FzZShFbGVtZW50IGVsZW1lbnQpIHsKLQkJRG9jdW1lbnRJbXBsIGRvY3VtZW50ID0gKERvY3VtZW50SW1wbCkgZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChkb2N1bWVudCA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCURvY3VtZW50VHlwZUFkYXB0ZXIgYWRhcHRlciA9IChEb2N1bWVudFR5cGVBZGFwdGVyKSBkb2N1bWVudC5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAoYWRhcHRlciA9PSBudWxsKQotCQkJcmV0dXJuIERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0U7Ci0JCXJldHVybiBhZGFwdGVyLmdldFRhZ05hbWVDYXNlKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzQm9vbGVhbkF0dHIoQXR0ciBhdHRyKSB7Ci0JCWlmIChhdHRyID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gZGVjbCA9IENNTm9kZVV0aWwuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oYXR0cik7Ci0JCWlmIChkZWNsID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUNNRGF0YVR5cGUgdHlwZSA9IGRlY2wuZ2V0QXR0clR5cGUoKTsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJU3RyaW5nIHZhbHVlc1tdID0gdHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmICh2YWx1ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuICh2YWx1ZXMubGVuZ3RoID09IDEgJiYgdmFsdWVzWzBdLmVxdWFscyhkZWNsLmdldEF0dHJOYW1lKCkpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbENvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3OTlmNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsQ29udGV4dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0vKioKLSAqIFhNTE1vZGVsQ29udGV4dCBjbGFzcwotICovCi1jbGFzcyBYTUxNb2RlbENvbnRleHQgewotCXByaXZhdGUgTm9kZSBuZXh0Tm9kZSA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlIHBhcmVudE5vZGUgPSBudWxsOwotCi0JLy8JcHJpdmF0ZSBYTUxNb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCXByaXZhdGUgTm9kZSByb290Tm9kZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxNb2RlbENvbnRleHQgY29uc3RydWN0b3IKLQkgKiAKLQkgKiBAcGFyYW0gcm9vdE5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlYTUxNb2RlbENvbnRleHQoTm9kZSByb290Tm9kZSkgewotCQlzdXBlcigpOwotCi0JCXRoaXMucm9vdE5vZGUgPSByb290Tm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBmaW5kRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JRWxlbWVudCBmaW5kRW5kVGFnKFN0cmluZyB0YWdOYW1lKSB7Ci0JCWlmICh0YWdOYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJZm9yIChOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7IHBhcmVudCAhPSBudWxsOyBwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpKSB7Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCWlmIChlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQkJcmV0dXJuIGVsZW1lbnQ7Ci0JCQkJLy8gaWYgYW5jZXN0b3IgZWxlbWVudCBoYXMgZW5kIHRhZyBzdG9wIHNlYXJjaAotCQkJCWJyZWFrOwotCQkJfQotCQkJaWYgKGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKQotCQkJCWJyZWFrOwotCQl9Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JVGV4dCBmaW5kTmV4dFRleHQoKSB7Ci0JCU5vZGUgbm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCXdoaWxlIChub2RlICE9IG51bGwpIHsKLQkJCWlmIChub2RlICE9IHRoaXMubmV4dE5vZGUgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgbm9kZTsKLQkJCQkvLyBza2lwIGVtcHR5IHRleHQKLQkJCQlpZiAodGV4dC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJCQlyZXR1cm4gdGV4dDsKLQkJCX0KLQkJCU5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJbm9kZSA9IGNoaWxkOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBuZXh0OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGZpbmRQcmV2aW91c1RleHQgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5UZXh0Ci0JICovCi0JVGV4dCBmaW5kUHJldmlvdXNUZXh0KCkgewotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCW5vZGUgPSB0aGlzLm5leHROb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQllbHNlCi0JCQlub2RlID0gdGhpcy5wYXJlbnROb2RlLmdldExhc3RDaGlsZCgpOwotCQlpZiAobm9kZSA9PSBudWxsIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gKFRleHQpIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogZmluZFN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSB0YWdOYW1lCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JRWxlbWVudCBmaW5kU3RhcnRUYWcoU3RyaW5nIHRhZ05hbWUsIFN0cmluZyByb290TmFtZSkgewotCQlpZiAodGFnTmFtZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJLy8gY2hlY2sgcHJldmlvdXMgZm9yIGVtcHR5IGNvbnRlbnQgZWxlbWVudAotCQlOb2RlIHByZXYgPSBudWxsOwotCQlpZiAodGhpcy5uZXh0Tm9kZSAhPSBudWxsKQotCQkJcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWVsc2UgaWYgKHRoaXMucGFyZW50Tm9kZSAhPSBudWxsKQotCQkJcHJldiA9IHRoaXMucGFyZW50Tm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgIWVsZW1lbnQuaXNFbXB0eVRhZygpICYmIGVsZW1lbnQubWF0Y2hUYWdOYW1lKHRhZ05hbWUpKQotCQkJCXJldHVybiBlbGVtZW50OwotCQl9Ci0KLQkJZm9yIChOb2RlIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlicmVhazsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCWlmIChlbGVtZW50Lm1hdGNoVGFnTmFtZSh0YWdOYW1lKSkKLQkJCQlyZXR1cm4gZWxlbWVudDsKLQkJCWlmIChyb290TmFtZSAhPSBudWxsICYmIGVsZW1lbnQubWF0Y2hUYWdOYW1lKHJvb3ROYW1lKSkKLQkJCQlicmVhazsKLQkJfQotCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE5leHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0TmV4dE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLm5leHROb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFBhcmVudE5vZGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JTm9kZSBnZXRQYXJlbnROb2RlKCkgewotCQlyZXR1cm4gdGhpcy5wYXJlbnROb2RlOwotCX0KLQotCS8qKgotCSAqIGdldFJvb3ROb2RlIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gb3JnLnczYy5kb20uTm9kZQotCSAqLwotCU5vZGUgZ2V0Um9vdE5vZGUoKSB7Ci0JCXJldHVybiB0aGlzLnJvb3ROb2RlOwotCX0KLQotCS8qKgotCSAqIHNldExhc3QgbWV0aG9kCi0JICovCi0Jdm9pZCBzZXRMYXN0KCkgewotCQlpZiAodGhpcy5wYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCU5vZGUgcHJldiA9IHRoaXMubmV4dE5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlpZiAocHJldiA9PSBudWxsIHx8IHByZXYuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwcmV2OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgIWVsZW1lbnQuaXNDb250YWluZXIoKSB8fCBlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQlyZXR1cm47Ci0JCQlzZXRQYXJlbnROb2RlKHByZXYpOwotCQl9Ci0KLQkJLy8gZmluZCBsYXN0IG9wZW4gcGFyZW50Ci0JCU5vZGUgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwotCQlOb2RlIGxhc3QgPSBwYXJlbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCXdoaWxlIChsYXN0ICE9IG51bGwpIHsKLQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJaWYgKGVsZW1lbnQuaGFzRW5kVGFnKCkgfHwgIWVsZW1lbnQuaXNDb250YWluZXIoKSB8fCBlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IGVsZW1lbnQ7Ci0JCQlsYXN0ID0gcGFyZW50LmdldExhc3RDaGlsZCgpOwotCQl9Ci0JCWlmIChwYXJlbnQgIT0gdGhpcy5wYXJlbnROb2RlKQotCQkJc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHNldE5leHROb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBuZXh0Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgc2V0TmV4dE5vZGUoTm9kZSBuZXh0Tm9kZSkgewotCQl0aGlzLm5leHROb2RlID0gbmV4dE5vZGU7Ci0JCWlmIChuZXh0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQl0aGlzLnBhcmVudE5vZGUgPSBuZXh0Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogc2V0UGFyZW50Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXZvaWQgc2V0UGFyZW50Tm9kZShOb2RlIHBhcmVudE5vZGUpIHsKLQkJdGhpcy5wYXJlbnROb2RlID0gcGFyZW50Tm9kZTsKLQkJdGhpcy5uZXh0Tm9kZSA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM2Nzc5Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsTm90aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiAKLSAqIFhNTE1vZGVsTm90aWZpZXIgbWFuYWdlcyB0aGUgbm90aWZpY2F0aW9uIHByb2Nlc3MuIENsaWVudHMgc2hvdWxkIG5vdCB1c2UKLSAqIGV4dGVuZCBvciByZWZlcmVuY2UuCi0gKiAKLSAqIElTU1VFOiBzaG91bGQgYmUgaW50ZXJuYWxpemVkLgotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgWE1MTW9kZWxOb3RpZmllciB7Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0Jdm9pZCBhdHRyUmVwbGFjZWQoRWxlbWVudCBlbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cik7Ci0KLQkvKioKLQkgKiBTaWduYWwgdGhhdCBjaGFuZ2luZyBpcyBzdGFydGluZy4KLQkgKiAKLQkgKi8KLQl2b2lkIGJlZ2luQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIFNpZ25hbCB0aGF0IGNoYW5naW5nIGlzIHN0YXJ0aW5nIHdpdGggYSBicmFuZCBuZXcgbW9kZWwuCi0JICogCi0JICovCi0Jdm9pZCBiZWdpbkNoYW5naW5nKGJvb2xlYW4gbmV3TW9kZWwpOwotCi0JLyoqCi0JICogQ2FuY2VsIHBlbmRpbmcgbm90aWZpY2F0aW9ucy4gVGhpcyBpcyBjYWxsZWQgaW4gdGhlIGNvbnRleHQgb2YKLQkgKiAicmVpbml0aWFsaXphdGlvbiIgc28gaXMgYXNzdW1lZCBBTEwgbm90aWZpY2F0aW9ucyBjYW4gYmUgc2FmZWx5Ci0JICogY2FuY2VsZWQsIGFzc3VtaW5nIHRoYXQgb25jZSBmYWN0b3JpZXMgYW5kIGFkYXB0ZXJzIGFyZSByZS1pbml0aWFsaXplZAotCSAqIHRoZXkgd2lsbCBiZSByZS1ub3RpZmllZCBhcyB0ZXh0IGlzIHNldCBpbiBtb2RlbCwgaWYgc3RpbGwgYXBwcm9wcmlhdGUuCi0JICovCi0Jdm9pZCBjYW5jZWxQZW5kaW5nKCk7Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGlsZFJlcGxhY2VkKE5vZGUgcGFyZW50Tm9kZSwgTm9kZSBuZXdDaGlsZCwgTm9kZSBvbGRDaGlsZCk7Ci0KLQkvKioKLQkgKiBFZGl0YWJsZSBzdGF0ZSBjaGFuZ2VkIGZvciBub2RlLgotCSAqIAotCSAqLwotCXZvaWQgZWRpdGFibGVDaGFuZ2VkKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBTaWduYWwgY2hhbmdpbmcgaXMgZmluaXNoZWQuCi0JICogCi0JICovCi0Jdm9pZCBlbmRDaGFuZ2luZygpOwotCi0JLyoqCi0JICogU2lnbmFsIGVuZCB0YWcgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudAotCSAqIAotCSAqLwotCXZvaWQgZW5kVGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogVXNlZCB0byByZWZsZWN0IHN0YXRlIG9mIG1vZGVsLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBtb2RlbCBoYWQgY2hhbmdlZC4KLQkgKiAKLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZWQoKTsKLQotCS8qKgotCSAqIFVzZWQgdG8gcmVmbGVjdCBzdGF0ZSBvZiBwYXJzaW5nIHByb2Nlc3MuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIG1vZGVsIGlzIGN1cnJlbnRseSBjaGFuZ2luZy4KLQkgKi8KLQlib29sZWFuIGlzQ2hhbmdpbmcoKTsKLQotCS8qKgotCSAqIHNpZ25hbCBwcm9wZXJ0eSBjaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQl2b2lkIHByb3BlcnR5Q2hhbmdlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogc2lnbmFsIHN0YXJ0IHRhZyBjaGFuZ2VkCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKi8KLQl2b2lkIHN0YXJ0VGFnQ2hhbmdlZChFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogc2lnbmFsIHN0cnVjdHVyZWQgY2hhbmdlZC4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXZvaWQgc3RydWN0dXJlQ2hhbmdlZChOb2RlIG5vZGUpOwotCi0JLyoqCi0JICogdmFsdWVDaGFuZ2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCB2YWx1ZUNoYW5nZWQoTm9kZSBub2RlKTsKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbE5vdGlmaWVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTkxNDlhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvZG9jdW1lbnQvWE1MTW9kZWxOb3RpZmllckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxOb3RpZmllckltcGwgaW1wbGVtZW50cyBYTUxNb2RlbE5vdGlmaWVyIHsKLQotCS8qIGVuZDogZm9yIGRlYnVnZ2luZyBvbmx5ICovCi0JcHJpdmF0ZSBjbGFzcyBOb3RpZnlFdmVudCB7Ci0JCU9iamVjdCBjaGFuZ2VkRmVhdHVyZTsKLQkJYm9vbGVhbiBkaXNjYXJkZWQ7Ci0JCU9iamVjdCBuZXdWYWx1ZTsKLQkJLy8gbm90ZTogZG9uJ3QgaW5pdGlhbGl6ZSBpbnN0YW5jZSB2YXJpYWJsZXMsIHNpbmNlCi0JCS8vIHRoYXQgY2F1c2VzIGRvdWJsZSBhc3NpZ25tZW50cywgYW5kIGxvdHMgb2YgdGhlc2UgYXJlIGNyZWF0ZWQuCi0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXI7Ci0JCU9iamVjdCBvbGRWYWx1ZTsKLQkJaW50IHBvczsKLQkJU3RyaW5nIHJlYXNvbjsKLQkJaW50IHR5cGU7Ci0JCWludCBpbmRleDsKLQotCQlOb3RpZnlFdmVudChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgdHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQkJdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwotCQkJdGhpcy50eXBlID0gdHlwZTsKLQkJCXRoaXMuY2hhbmdlZEZlYXR1cmUgPSBjaGFuZ2VkRmVhdHVyZTsKLQkJCXRoaXMub2xkVmFsdWUgPSBvbGRWYWx1ZTsKLQkJCXRoaXMubmV3VmFsdWUgPSBuZXdWYWx1ZTsKLQkJCXRoaXMucG9zID0gcG9zOwotCQkJdGhpcy5yZWFzb24gPSAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEFEREVEX1RIRU5fUkVNT1ZFRCA9ICJEaXNjYXJkOiBBZGRlZCB0aGVuIHJlbW92ZWQgcnVsZSI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZPcHRpbWl6ZURlZmVycmVkID0gdHJ1ZTsKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRBZGRlZCA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBmT3B0aW1pemVEZWZlcnJlZEFjY29yZGluZ1RvUGFyZW50UmVtb3ZlZCA9IHRydWU7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFBBUkVOVF9JU19BRERFRCA9ICJEaXNhcmRlZDogUGFyZW50IGhhcyBqdXN0IGJlZW4gYWRkZWQiOyAvLyROT04tTkxTLTEkCi0JLyogc3RhcnQ6IGZvciBkZWJ1Z2dpbmcgb25seSAqLwotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBQQVJFTlRfSVNfUkVNT1ZFRF9UT08gPSAiRGlzY2FyZDogUGFyZW50IHdhcyByZW1vdmVkIHRvbyI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSRU5UX0lTX1JFUEFSRU5URUQgPSAiTm90IERpc2NhcmQ6IFBhcmVudCB3YXMgcmVtb3ZlZCBzbyB0aGlzIGltcGxpZXMgcmVwYXJlbnRpbmciOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBOb2RlIGNoYW5nZWRSb290ID0gbnVsbDsKLQotCXByaXZhdGUgYm9vbGVhbiBjaGFuZ2luZyA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBkb2luZ05ld01vZGVsID0gZmFsc2U7Ci0JcHJpdmF0ZSBWZWN0b3IgZXZlbnRzID0gbnVsbDsKLQlwcml2YXRlIGJvb2xlYW4gZmx1c2hpbmcgPSBmYWxzZTsKLQotCS8qKgotCSAqLwotCXB1YmxpYyBYTUxNb2RlbE5vdGlmaWVySW1wbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBhdHRyUmVwbGFjZWQgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKiBAcGFyYW0gbmV3QXR0cgotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQXR0cgotCSAqIEBwYXJhbSBvbGRBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICovCi0JcHVibGljIHZvaWQgYXR0clJlcGxhY2VkKEVsZW1lbnQgZWxlbWVudCwgQXR0ciBuZXdBdHRyLCBBdHRyIG9sZEF0dHIpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJQXR0ciBhdHRyID0gbnVsbDsKLQkJU3RyaW5nIG9sZFZhbHVlID0gbnVsbDsKLQkJU3RyaW5nIG5ld1ZhbHVlID0gbnVsbDsKLQkJaWYgKG9sZEF0dHIgIT0gbnVsbCkgewotCQkJYXR0ciA9IG9sZEF0dHI7Ci0JCQlvbGRWYWx1ZSA9IG9sZEF0dHIuZ2V0VmFsdWUoKTsKLQkJfQotCQlpZiAobmV3QXR0ciAhPSBudWxsKSB7Ci0JCQlhdHRyID0gbmV3QXR0cjsKLQkJCW5ld1ZhbHVlID0gbmV3QXR0ci5nZXRWYWx1ZSgpOwotCQl9Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBlbGVtZW50OwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgYXR0ciwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBvZmZzZXQpOwotCQlwcm9wZXJ0eUNoYW5nZWQobm90aWZpZXIpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ2hhbmdpbmcoKSB7Ci0JCXRoaXMuY2hhbmdpbmcgPSB0cnVlOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIGJlZ2luQ2hhbmdpbmcoYm9vbGVhbiBuZXdNb2RlbCkgewotCQliZWdpbkNoYW5naW5nKCk7Ci0JCXRoaXMuZG9pbmdOZXdNb2RlbCA9IG5ld01vZGVsOwotCX0KLQotCXB1YmxpYyB2b2lkIGNhbmNlbFBlbmRpbmcoKSB7Ci0JCS8vIHdlIGRvbid0IHdhbnQgdG8gY2hhbmdlIHRoZSBzaXplIG9mIHRoaXMgYXJyYXksIHNpbmNlCi0JCS8vIHRoZSBhcnJheSBtYXkgYmUgYmVpbmcgcHJvY2Vzc2VkLCBpbiB0aGUgZGVmZmVycmVkIG5vdGlmaWNhdGlvbgotCQkvLyBsb29wLCBidXQgd2UgY2FuIHNpZ25hbCB0aGF0IGFsbAotCQkvLyBzaG91bGQgYmUgZGlzY2FyZGVkLCBzbyBhbnkgcmVtYWluaW5nIG9uZXMgd2lsbCBiZSBpZ25vcmVkLgotCQlpZiAodGhpcy5ldmVudHMgIT0gbnVsbCkgewotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGlzLmV2ZW50cy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyB0aGlzIGNhbmNlbCBpcyBwcmVzdW1hYmx5IGJlaW5nIGNhbGxlZCBhcyBhIGZ1bmN0aW9uIG9mCi0JCS8vICJyZWluaXRpYWlsaXphdGlvbiIgc28gd2UgY2FuIGlnbm9yZSBjaGFuZ2VzIHRvIHRoZQotCQkvLyBvbGQgcm9vdCwgYW5kIGNoYW5nZXMgdG8gdGhlIG5ldyBvbmUgd2lsbCBiZSB0cmlnZ2VyZWQgZHVyaW5nCi0JCS8vIHJlaW5pdGlhbGl6YXRpb24uCi0JCWNoYW5nZWRSb290ID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBjaGlsZFJlcGxhY2VkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIHZvaWQgY2hpbGRSZXBsYWNlZChOb2RlIHBhcmVudE5vZGUsIE5vZGUgbmV3Q2hpbGQsIE5vZGUgb2xkQ2hpbGQpIHsKLQkJaWYgKHBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSAoSURPTU5vZGUpIHBhcmVudE5vZGU7Ci0JCWludCB0eXBlID0gSU5vZGVOb3RpZmllci5DSEFOR0U7Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IElOb2RlTm90aWZpZXIuUkVNT1ZFOwotCQllbHNlIGlmIChvbGRDaGlsZCA9PSBudWxsKQotCQkJdHlwZSA9IElOb2RlTm90aWZpZXIuQUREOwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCB0eXBlLCBvbGRDaGlsZCwgb2xkQ2hpbGQsIG5ld0NoaWxkLCBvZmZzZXQpOwotCQlzdHJ1Y3R1cmVDaGFuZ2VkKG5vdGlmaWVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBlZGl0YWJsZUNoYW5nZWQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlET01Ob2RlIG5vdGlmaWVyID0gKElET01Ob2RlKSBub2RlOwotCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJbm90aWZ5KG5vdGlmaWVyLCBJTm9kZU5vdGlmaWVyLkNIQU5HRSwgbnVsbCwgbnVsbCwgbnVsbCwgb2Zmc2V0KTsKLQkJcHJvcGVydHlDaGFuZ2VkKG5vdGlmaWVyKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRDaGFuZ2luZygpIHsKLQkJdGhpcy5kb2luZ05ld01vZGVsID0gZmFsc2U7Ci0JCWlmICghdGhpcy5jaGFuZ2luZykKLQkJCXJldHVybjsgLy8gYXZvaWQgbmVzdGluZyBjYWxscwotCQlub3RpZnlEZWZlcnJlZCgpOwotCQlpZiAodGhpcy5jaGFuZ2VkUm9vdCAhPSBudWxsKSB7Ci0JCQlub3RpZnlTdHJ1Y3R1cmVDaGFuZ2VkKHRoaXMuY2hhbmdlZFJvb3QpOwotCQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCQlTdHJpbmcgcCA9IHRoaXMuY2hhbmdlZFJvb3QuZ2V0Tm9kZU5hbWUoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIkRlZmVycmVkIFNUUlVDVVRSRV9DSEFOR0VEOiAiICsgcCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBudWxsOwotCQl9Ci0JCXRoaXMuY2hhbmdpbmcgPSBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBlbmRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IChJRE9NTm9kZSkgZWxlbWVudDsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIG51bGwsIG51bGwsIG51bGwsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBoYXNDaGFuZ2VkKCkgewotCQlyZXR1cm4gKHRoaXMuZXZlbnRzICE9IG51bGwpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQ2hhbmdpbmcoKSB7Ci0JCXJldHVybiB0aGlzLmNoYW5naW5nOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBub3RpZnkoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY2hhbmdpbmcgJiYgIXRoaXMuZmx1c2hpbmcpIHsKLQkJCS8vIGRlZmVyIG5vdGlmaWNhdGlvbgotCQkJaWYgKHRoaXMuZXZlbnRzID09IG51bGwpCi0JCQkJdGhpcy5ldmVudHMgPSBuZXcgVmVjdG9yKCk7Ci0JCQkvLyB3ZSBkbyBub3QgZGVmZXIgYW55dGhpbmcgaWYgd2UgYXJlIGRvaW5nIGEgbmV3IE1vZGVsLAotCQkJLy8gZXhjZXB0IGZvciB0aGUgZG9jdW1lbnQgZXZlbnQsIHNpbmNlIGFsbCBvdGhlcnMgYXJlCi0JCQkvLyB0cml2aWFsIGFuZCBub3QgbmVlZGVkIGF0IHRoYXQgaW5pdGlhbCBwb2ludC4KLQkJCS8vIEJ1dCBldmVuIGZvciB0aGF0IG9uZSBkb2N1bWVudCBldmVudCwgaW4gdGhlIG5ldyBtb2RlbCBjYXNlLAotCQkJLy8gaXQgaXMgc3RpbGwgaW1wb3J0YW50IHRvIGRlZmVyIGl0LgotCQkJaWYgKCghZG9pbmdOZXdNb2RlbCkgfHwgKCgoTm9kZSkgbm90aWZpZXIpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJCXRoaXMuZXZlbnRzLmFkZEVsZW1lbnQobmV3IE5vdGlmeUV2ZW50KG5vdGlmaWVyLCBldmVudFR5cGUsIGNoYW5nZWRGZWF0dXJlLCBvbGRWYWx1ZSwgbmV3VmFsdWUsIHBvcykpOwotCQkJfQotCQkJcmV0dXJuOwotCQl9Ci0JCXRyeSB7Ci0JCQkvLyBJdHMgaW1wb3J0YW50IHRvICJrZWVwIGdvaW5nIiBpZiBleGNlcHRpb24gb2NjdXJzLCBzaW5jZSB0aGlzCi0JCQkvLyBub3RpZmljYXRpb24KLQkJCS8vIGNvbWVzIGluIGJldHdlZW4gImFib3V0IHRvIGNoYW5nZSIgYW5kICJjaGFuZ2VkIiBldmVudHMuIFdlIGRvCi0JCQkvLyBsb2csIGhvd2V2ZXIsCi0JCQkvLyBzaW5jZSB3b3VsZCBpbmRpY2F0ZSBhIHByb2dyYW0gZXJyb3IuCi0JCQlub3RpZmllci5ub3RpZnkoZXZlbnRUeXBlLCBjaGFuZ2VkRmVhdHVyZSwgb2xkVmFsdWUsIG5ld1ZhbHVlLCBwb3MpOwotCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiQSBzdHJ1Y3R1cmVkIG1vZGVsIGNsaWVudCB0aHJldyBmb2xsb3dpbmcgZXhjZXB0aW9uIGR1cmluZyBhZGFwdGVyIG5vdGlmaWNhdGlvbiAoIiArIElOb2RlTm90aWZpZXIuRVZFTlRfVFlQRV9TVFJJTkdTW2V2ZW50VHlwZV0gKyAiICkiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgbm90aWZ5RGVmZXJyZWQoKSB7Ci0JCWlmICh0aGlzLmV2ZW50cyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5mbHVzaGluZykKLQkJCXJldHVybjsKLQkJdGhpcy5mbHVzaGluZyA9IHRydWU7IC8vIGZvcmNlIG5vdGlmaWNhdGlvbgotCQlpbnQgY291bnQgPSB0aGlzLmV2ZW50cy5zaXplKCk7Ci0JCWlmICghZG9pbmdOZXdNb2RlbCAmJiBmT3B0aW1pemVEZWZlcnJlZCkgewotCQkJTWFwIHZhbHVlcyA9IG5ldyBIYXNoTWFwKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCQlOb3RpZnlFdmVudCBldmVudCA9IChOb3RpZnlFdmVudCkgdGhpcy5ldmVudHMuZWxlbWVudEF0KGkpOwotCQkJCWlmIChldmVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQlldmVudC5pbmRleCA9IGk7Ci0JCQkJaWYoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQlhZGRUb01hcChldmVudC5vbGRWYWx1ZSwgZXZlbnQsIHZhbHVlcyk7Ci0JCQkJfQotCQkJCWlmKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpIHsKLQkJCQkJYWRkVG9NYXAoZXZlbnQubmV3VmFsdWUsIGV2ZW50LCB2YWx1ZXMpOwotCQkJCX0KLQkJCX0KLQkJCUl0ZXJhdG9yIGl0ID0gdmFsdWVzLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZShpdC5oYXNOZXh0KCkpIHsKLQkJCQlPYmplY3QgdmFsdWUgPSBpdC5uZXh0KCk7Ci0JCQkJTm90aWZ5RXZlbnRbXSBlcyA9IChOb3RpZnlFdmVudFtdKXZhbHVlcy5nZXQodmFsdWUpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXMubGVuZ3RoIC0gMTsgaSsrKSB7Ci0JCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gZXNbaV07Ci0JCQkJCWlmKGVzW2ldLmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQkJCU5vdGlmeUV2ZW50IG5leHQgPSBlc1tpICsgMV07Ci0JCQkJCWlmKGVzW2ldLnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQgJiYgbmV4dC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCQkvLyBBZGRlZCB0aGVuIHJlbW92ZWQgbGF0ZXIsIGRpc2NhcmQgYm90aAotCQkJCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCW5leHQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgQURERURfVEhFTl9SRU1PVkVEICsgIihzZWUgIiArIG5leHQuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCW5leHQucmVhc29uID0gbmV4dC5yZWFzb24gKyBBRERFRF9USEVOX1JFTU9WRUQgKyAiKHNlZSAiICsgZXZlbnQuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJTm90aWZ5RXZlbnQgZXZlbnQgPSAoTm90aWZ5RXZlbnQpIHRoaXMuZXZlbnRzLmVsZW1lbnRBdChpKTsKLQkJCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJaWYoZXZlbnQuZGlzY2FyZGVkKSBjb250aW51ZTsKLQkJCQlpZiAoZXZlbnQubm90aWZpZXIgIT0gbnVsbCAmJiBmT3B0aW1pemVEZWZlcnJlZEFjY29yZGluZ1RvUGFyZW50QWRkZWQpIHsKLQkJCQkJaWYgKGV2ZW50LnR5cGUgPT0gSU5vZGVOb3RpZmllci5BREQpIHsKLQkJCQkJCU5vdGlmeUV2ZW50W10gZXMgPSAoTm90aWZ5RXZlbnRbXSl2YWx1ZXMuZ2V0KGV2ZW50Lm5vdGlmaWVyKTsKLQkJCQkJCWlmKGVzICE9IG51bGwpIGZvciAoaW50IHAgPSAwOyBwIDwgZXMubGVuZ3RoICYmIGVzW3BdLmluZGV4IDwgZXZlbnQuaW5kZXg7IHArKykgewotCQkJCQkJCU5vdGlmeUV2ZW50IHByZXYgPSBlc1twXTsKLQkJCQkJCQlpZiAocHJldi50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFICYmIHByZXYub2xkVmFsdWUgPT0gZXZlbnQubm90aWZpZXIpIHsKLQkJCQkJCQkJLy8gcGFyZW50IGlzIHJlcGFyZW50ZWQsIGRvIG5vdCBkaXNjYXJkCi0JCQkJCQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJCQkJCQlldmVudC5yZWFzb24gPSBldmVudC5yZWFzb24gKyBQQVJFTlRfSVNfUkVQQVJFTlRFRCArICIoc2VlICIgKyBwcmV2LmluZGV4ICsgIikiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCQkJfQotCQkJCQkJCQlicmVhazsKLQkJCQkJCQl9IGVsc2UgaWYgKHByZXYudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCAmJiBwcmV2Lm5ld1ZhbHVlID09IGV2ZW50Lm5vdGlmaWVyKSB7Ci0JCQkJCQkJCS8vIHBhcmVudCBoYXMgYmVlbiBhZGRlZCwgZGlzY2FyZCB0aGlzCi0JCQkJCQkJCWV2ZW50LmRpc2NhcmRlZCA9IHRydWU7Ci0JCQkJCQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJCQkJCQlldmVudC5yZWFzb24gPSBldmVudC5yZWFzb24gKyBQQVJFTlRfSVNfQURERUQgKyAiKHNlZSAiICsgcHJldi5pbmRleCArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJCX0KLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJfQkJCQkJCQkKLQkJCQkJfQkJCQkJCQotCQkJCX0KLQkJCQlpZihldmVudC5kaXNjYXJkZWQpIGNvbnRpbnVlOwotCQkJCWlmIChldmVudC5ub3RpZmllciAhPSBudWxsICYmIGZPcHRpbWl6ZURlZmVycmVkQWNjb3JkaW5nVG9QYXJlbnRSZW1vdmVkKSB7Ci0JCQkJCWlmIChldmVudC50eXBlID09IElOb2RlTm90aWZpZXIuUkVNT1ZFKSB7Ci0JCQkJCQlOb3RpZnlFdmVudFtdIGVzID0gKE5vdGlmeUV2ZW50W10pdmFsdWVzLmdldChldmVudC5ub3RpZmllcik7Ci0JCQkJCQlpZihlcyAhPSBudWxsKSBmb3IgKGludCBuID0gMDsgbiA8IGVzLmxlbmd0aDsgbisrKSB7Ci0JCQkJCQkJTm90aWZ5RXZlbnQgbmV4dCA9IGVzW25dOwotCQkJCQkJCWlmKG5leHQuaW5kZXggPiBldmVudC5pbmRleCAmJiBuZXh0LnR5cGUgPT0gSU5vZGVOb3RpZmllci5SRU1PVkUpIHsKLQkJCQkJCQkJaWYgKG5leHQub2xkVmFsdWUgPT0gZXZlbnQubm90aWZpZXIpIHsKLQkJCQkJCQkJCS8vIHBhcmVudCB3aWxsIGJlIHJlbW92ZWQsIGRpc2NhcmQgdGhpcwotCQkJCQkJCQkJZXZlbnQuZGlzY2FyZGVkID0gdHJ1ZTsKLQkJCQkJCQkJCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmeURlZmVycmVkKSB7Ci0JCQkJCQkJCQkJZXZlbnQucmVhc29uID0gZXZlbnQucmVhc29uICsgUEFSRU5UX0lTX1JFTU9WRURfVE9PICsgIihzZWUgIiArIG5leHQuaW5kZXggKyAiKSI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJfQotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0JCQkJCQkKLQkJCQl9Ci0JCQkJaWYoZXZlbnQuZGlzY2FyZGVkKSBjb250aW51ZTsKLQkJCX0KLQkJfQotCQlmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmV2ZW50cy5lbGVtZW50QXQoaSk7Ci0JCQlpZiAoZXZlbnQgPT0gbnVsbCkKLQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCWlmKGV2ZW50LmRpc2NhcmRlZCkgY29udGludWU7Ci0JCQlub3RpZnkoZXZlbnQubm90aWZpZXIsIGV2ZW50LnR5cGUsIGV2ZW50LmNoYW5nZWRGZWF0dXJlLCBldmVudC5vbGRWYWx1ZSwgZXZlbnQubmV3VmFsdWUsIGV2ZW50LnBvcyk7Ci0JCX0KLQkJaWYgKERlYnVnLmRlYnVnTm90aWZ5RGVmZXJyZWQpIHsKLQkJCWZvciAoaW50IGwgPSAwOyBsIDwgY291bnQ7IGwrKykgewotCQkJCU5vdGlmeUV2ZW50IGV2ZW50ID0gKE5vdGlmeUV2ZW50KSB0aGlzLmV2ZW50cy5lbGVtZW50QXQobCk7Ci0JCQkJT2JqZWN0IG8gPSBudWxsOwotCQkJCVN0cmluZyB0ID0gbnVsbDsKLQkJCQlpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLkFERCkgewotCQkJCQlvID0gZXZlbnQubmV3VmFsdWU7Ci0JCQkJCXQgPSAiICsgIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PSBJTm9kZU5vdGlmaWVyLlJFTU9WRSkgewotCQkJCQlvID0gZXZlbnQub2xkVmFsdWU7Ci0JCQkJCXQgPSAiIC0gIjsgLy8kTk9OLU5MUy0xJAotCQkJCX0KLQkJCQlpZiAobyBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJU3RyaW5nIHAgPSAoKE5vZGUpIGV2ZW50Lm5vdGlmaWVyKS5nZXROb2RlTmFtZSgpOwotCQkJCQlTdHJpbmcgYyA9ICgoTm9kZSkgbykuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJU3RyaW5nIGQgPSAoZXZlbnQuZGlzY2FyZGVkID8gIiEgIiA6ICIgICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKGQgKyBwICsgdCArIGMpOwotCQkJCX0KLQkJCX0KLQkJfQotCQl0aGlzLmZsdXNoaW5nID0gZmFsc2U7Ci0JCXRoaXMuZXZlbnRzID0gbnVsbDsKLQl9Ci0KLQl2b2lkIGFkZFRvTWFwKE9iamVjdCBvLCBOb3RpZnlFdmVudCBldmVudCwgTWFwIG1hcCkgewotCQlpZihvID09IG51bGwpIHJldHVybjsKLQkJT2JqZWN0IHggPSBtYXAuZ2V0KG8pOwotCQlpZih4ID09IG51bGwpIHsKLQkJCW1hcC5wdXQobywgbmV3IE5vdGlmeUV2ZW50W117ZXZlbnR9KTsKLQkJfSBlbHNlIHsKLQkJCU5vdGlmeUV2ZW50W10gZXMgPSAoTm90aWZ5RXZlbnRbXSl4OwotCQkJTm90aWZ5RXZlbnRbXSBlczIgPSBuZXcgTm90aWZ5RXZlbnRbZXMubGVuZ3RoICsgMV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KGVzLCAwLCBlczIsIDAsIGVzLmxlbmd0aCk7Ci0JCQllczJbZXMubGVuZ3RoXSA9IGV2ZW50OwotCQkJbWFwLnB1dChvLCBlczIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIG5vdGlmeVN0cnVjdHVyZUNoYW5nZWQoTm9kZSByb290KSB7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUlOb2RlTm90aWZpZXIgbm90aWZpZXIgPSAoSU5vZGVOb3RpZmllcikgcm9vdDsKLQkJdHJ5IHsKLQkJCS8vIEl0cyBpbXBvcnRhbnQgdG8gImtlZXAgZ29pbmciIGlmIGV4Y2VwdGlvbiBvY2N1cnMsIHNpbmNlIHRoaXMKLQkJCS8vIG5vdGlmaWNhdGlvbgotCQkJLy8gY29tZXMgaW4gYmV0d2VlbiAiYWJvdXQgdG8gY2hhbmdlIiBhbmQgImNoYW5nZWQiIGV2ZW50cy4gV2UgZG8KLQkJCS8vIGxvZywgaG93ZXZlciwKLQkJCS8vIHNpbmNlIHdvdWxkIGluZGljYXRlIGEgcHJvZ3JhbSBlcnJvci4KLQkJCW5vdGlmaWVyLm5vdGlmeShJTm9kZU5vdGlmaWVyLlNUUlVDVFVSRV9DSEFOR0VELCBudWxsLCBudWxsLCBudWxsLCAtMSk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJBIHN0cnVjdHVyZWQgbW9kZWwgY2xpZW50IHRocmV3IGZvbGxvd2luZyBleGNlcHRpb24gZHVyaW5nIGFkYXB0ZXIgbm90aWZpY2F0aW9uICgiICsgSU5vZGVOb3RpZmllci5FVkVOVF9UWVBFX1NUUklOR1NbSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRF0gKyAiICkiLCBlKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIHByb3BlcnR5Q2hhbmdlZChOb2RlIG5vZGUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gbm9kZQotCSAqLwotCXByaXZhdGUgdm9pZCBzZXRDb21tb25Sb290SWZOZWVkZWQoTm9kZSBub2RlKSB7Ci0JCS8vIGRlZmVyIG5vdGlmaWNhdGlvbgotCQlpZiAodGhpcy5jaGFuZ2VkUm9vdCA9PSBudWxsKSB7Ci0JCQl0aGlzLmNoYW5nZWRSb290ID0gbm9kZTsKLQkJfSBlbHNlIHsKLQkJCS8vIHRpbnkgb3B0aW1pemF0aW9uOiBpZiBwcmV2aW91cyBjb21tb25BbmNlc3RvciAoY2hhbmdlZFJvb3QpIGlzCi0JCQkvLyBhbHJlYWR5ICdkb2N1bWVudCcsCi0JCQkvLyBvciBpZiBhbHJlYWR5IGVxdWFsIHRvIHRoaXMgJ25vZGUnLAotCQkJLy8gdGhlbiBubyBuZWVkIHRvIHJlLWNhbGN1bGF0ZQotCQkJaWYgKGNoYW5nZWRSb290LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFICYmIGNoYW5nZWRSb290ICE9IG5vZGUpIHsKLQkJCQlOb2RlIGNvbW1vbiA9ICgoTm9kZUltcGwpIHRoaXMuY2hhbmdlZFJvb3QpLmdldENvbW1vbkFuY2VzdG9yKG5vZGUpOwotCQkJCWlmIChjb21tb24gIT0gbnVsbCkKLQkJCQkJdGhpcy5jaGFuZ2VkUm9vdCA9IGNvbW1vbjsKLQkJCQllbHNlCi0JCQkJCXRoaXMuY2hhbmdlZFJvb3QgPSBub2RlOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc3RhcnRUYWdDaGFuZ2VkKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlJRE9NTm9kZSBub3RpZmllciA9IChJRE9NTm9kZSkgZWxlbWVudDsKLQkJaW50IG9mZnNldCA9IG5vdGlmaWVyLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIG51bGwsIG51bGwsIG51bGwsIG9mZnNldCk7Ci0JCXByb3BlcnR5Q2hhbmdlZChlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBzdHJ1Y3R1cmVDaGFuZ2VkKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoaXNDaGFuZ2luZygpKSB7Ci0JCQlzZXRDb21tb25Sb290SWZOZWVkZWQobm9kZSk7Ci0JCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJCVN0cmluZyBwID0gdGhpcy5jaGFuZ2VkUm9vdC5nZXROb2RlTmFtZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVxdWVzdGVkIFNUUlVDVVRSRV9DSEFOR0VEOiAiICsgcCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQlpZiAoRGVidWcuZGVidWdOb3RpZnlEZWZlcnJlZCkgewotCQkJU3RyaW5nIHAgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlNUUlVDVVRSRV9DSEFOR0VEOiAiICsgcCk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlub3RpZnlTdHJ1Y3R1cmVDaGFuZ2VkKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIHZhbHVlQ2hhbmdlZCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHZhbHVlQ2hhbmdlZChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSURPTU5vZGUgbm90aWZpZXIgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCUF0dHIgYXR0ciA9IChBdHRyKSBub2RlOwotCQkJbm90aWZpZXIgPSAoSURPTU5vZGUpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCQkvLyBUT0RPX2RtdzogZXhwZXJpbWVudGFsOiBjaGFuZ2VkIDA2LzI5LzIwMDQgdG8gc2VuZCAic3RydWN1dHVyZQotCQkJLy8gY2hhbmdlZCIgZXZlbiBmb3IgYXR0cmlidXRlIHZhbHVlIGNoYW5nZXMKLQkJCS8vIHRoZXJlIGFyZSBwcm9zIGFuZCBjb25zIHRvIGNvbnNpZGVyaW5nIGF0dHJpYnV0ZSB2YWx1ZQotCQkJLy8gInN0cnVjdHVyZSBjaGFuZ2VkIi4gV2lsbCAocmUpY29uc2lkZXIKLQkJCS8vIHNldENvbW1vblJvb3RJZk5lZWRlZChub3RpZmllcik7Ci0JCQlpZiAobm90aWZpZXIgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQlTdHJpbmcgdmFsdWUgPSBhdHRyLmdldFZhbHVlKCk7Ci0JCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIGF0dHIsIG51bGwsIHZhbHVlLCBvZmZzZXQpOwotCQl9IGVsc2UgewotCQkJLy8gbm90ZTogd2UgZG8gbm90IHNlbmQgc3RydWN0dXJlZCBjaGFuZ2VkIGV2ZW50IGZvciBjb250ZW50Ci0JCQkvLyBjaGFuZ2VkCi0JCQlub3RpZmllciA9IChJRE9NTm9kZSkgbm9kZTsKLQkJCVN0cmluZyB2YWx1ZSA9IG5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlpbnQgb2Zmc2V0ID0gbm90aWZpZXIuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCW5vdGlmeShub3RpZmllciwgSU5vZGVOb3RpZmllci5DSEFOR0UsIG51bGwsIG51bGwsIHZhbHVlLCBvZmZzZXQpOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUlET01Ob2RlIHBhcmVudCA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCW5vdGlmeShwYXJlbnQsIElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VELCBub2RlLCBudWxsLCB2YWx1ZSwgb2Zmc2V0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcHJvcGVydHlDaGFuZ2VkKG5vdGlmaWVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsUGFyc2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMDMyZTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFBhcnNlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29tbWVudGVsZW1lbnQuaW1wbC5Db21tZW50RWxlbWVudENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbW1lbnRlbGVtZW50LmltcGwuQ29tbWVudEVsZW1lbnRSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotCi0vKioKLSAqIFhNTE1vZGVsUGFyc2VyCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbFBhcnNlciB7Ci0JcHJpdmF0ZSBYTUxNb2RlbENvbnRleHQgY29udGV4dCA9IG51bGw7Ci0JcHJpdmF0ZSBET01Nb2RlbEltcGwgbW9kZWwgPSBudWxsOwotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFhNTE1vZGVsUGFyc2VyKERPTU1vZGVsSW1wbCBtb2RlbCkgewotCQlzdXBlcigpOwotCi0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0aGlzLm1vZGVsID0gbW9kZWw7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5CZUltcGxpY2l0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY2FuQmVJbXBsaWNpdFRhZyhlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gY2FuQmVJbXBsaWNpdFRhZyhFbGVtZW50IGVsZW1lbnQsIE5vZGUgY2hpbGQpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmNhbkJlSW1wbGljaXRUYWcoZWxlbWVudCwgY2hpbGQpOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBjYW5Db250YWluKEVsZW1lbnQgZWxlbWVudCwgTm9kZSBjaGlsZCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsIHx8IGNoaWxkID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChpbXBsLmlzRW5kVGFnKCkpCi0JCQlyZXR1cm4gZmFsc2U7IC8vIGludmFsaWQgKGZsb2F0aW5nKSBlbmQgdGFnCi0JCWlmICghaW1wbC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuIGZhbHNlOwotCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLlRFWFRfTk9ERSkgewotCQkJaWYgKGltcGwuaXNKU1BDb250YWluZXIoKSB8fCBpbXBsLmlzQ0RBVEFDb250YWluZXIoKSkgewotCQkJCS8vIGFjY2VwdHMgb25seSBUZXh0IGNoaWxkCi0JCQkJcmV0dXJuIGZhbHNlOwotCQkJfQotCQl9Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5jYW5Db250YWluKGVsZW1lbnQsIGNoaWxkKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0ckVxdWFsKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47Ci0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgZGF0YQotCQkJCVByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwgcGkgPSAoUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCkgbm9kZTsKLQkJCQlwaS5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCQkvLyBhY3R1YWxseSwgZG8gbm90aGluZwotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJOYW1lIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VBdHRyTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldE5hbWVSZWdpb24oKSAhPSByZWdpb24pCi0JCQkJY29udGludWU7Ci0KLQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJYXR0ci5zZXROYW1lKG5hbWUpOwotCQkJYnJlYWs7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VBdHRyVmFsdWUgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUF0dHJWYWx1ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOwotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCS8vIGp1c3Qgbm90aWZ5IHRoZSBjaGFuZ2UgaW5zdGVhZCBvZiBzZXR0aW5nIGRhdGEKLQkJCQlQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbkltcGwpIG5vZGU7Ci0JCQkJcGkubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJaWYgKGF0dHIgPT0gbnVsbCkKLQkJCQljb250aW51ZTsKLQkJCWlmIChhdHRyLmdldFZhbHVlUmVnaW9uKCkgIT0gcmVnaW9uKQotCQkJCWNvbnRpbnVlOwotCQkJLy8ganVzdCBub3RpZnkgdGhlIGNoYW5nZSBpbnN0ZWFkIG9mIHNldHRpbmcgdmFsdWUKLQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZURhdGEgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZURhdGEoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbm9kZSA9IHJvb3QuZ2V0Tm9kZUF0KG9mZnNldCk7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQkJaWYgKHRleHQuaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKSkgewotCQkJCQkvLyBoYXMgY29uc2VjdXRpdmUgdGV4dCBzaGFyaW5nIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobm9kZSk7Ci0JCQkJY2xlYW51cFRleHQoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOgotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDoKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOgotCQkJCS8vIGNvbW1lbnQgdGFnCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQlkZWZhdWx0IDoKLQkJCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBqdXN0IG5vdGlmeSB0aGUgY2hhbmdlIGluc3RlYWQgb2Ygc2V0dGluZyBkYXRhCi0JCU5vZGVJbXBsIGltcGwgPSAoTm9kZUltcGwpIG5vZGU7Ci0JCWltcGwubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNoYW5nZUVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlIGlzIG9ubHkgZm9yIGNsb3NlIHRhZwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKQotCQkJCQljb250aW51ZTsKLQotCQkJCS8vIG90aGVyIHJlZ2lvbiBoYXMgY2hhbmdlZAotCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0JCWlmIChvbGRSZWdpb25zICE9IG51bGwpIHsKLQkJCUl0ZXJhdG9yIGUgPSBvbGRSZWdpb25zLml0ZXJhdG9yKCk7Ci0JCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpCi0JCQkJCWNvbnRpbnVlOwotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGFuZ2UgZm9yIGNsb3NlIHRhZyBoYXMgbm8gaW1wYWN0Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0Jdm9pZCBjaGFuZ2VSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsIHx8IHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQkvLyBvcHRpbWl6ZSB0eXBpY2FsIGNhc2VzCi0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQgfHwgaXNOZXN0ZWRDb250ZW50KHJlZ2lvblR5cGUpKSB7Ci0JCQljaGFuZ2VEYXRhKGZsYXROb2RlLCByZWdpb24pOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQljaGFuZ2VBdHRyTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCWNoYW5nZUF0dHJWYWx1ZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQljaGFuZ2VBdHRyRXF1YWwoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCBpc05lc3RlZFRhZ05hbWUocmVnaW9uVHlwZSkpIHsKLQkJCWNoYW5nZVRhZ05hbWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JfQotCi0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJaW50IG9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0KCk7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLmNvbnRleHQuZ2V0Um9vdE5vZGUoKTsKLQkJaWYgKHJvb3QgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBub2RlID0gcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0KLQkJLy8gY2hlY2sgaWYgY2hhbmdlcyBhcmUgb25seSBmb3IgYXR0cmlidXRlcyBhbmQgY2xvc2UgdGFnCi0JCWJvb2xlYW4gdGFnTmFtZVVuY2hhbmdlZCA9IGZhbHNlOwotCQlpZiAobmV3UmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gbmV3UmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCQlTdHJpbmcgb2xkVGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQkJaWYgKG9sZFRhZ05hbWUgIT0gbnVsbCAmJiBuZXdUYWdOYW1lICE9IG51bGwgJiYgb2xkVGFnTmFtZS5lcXVhbHMobmV3VGFnTmFtZSkpIHsKLQkJCQkJCS8vIHRoZSB0YWcgbmFtZSBpcyB1bmNoYW5nZWQKLQkJCQkJCXRhZ05hbWVVbmNoYW5nZWQgPSB0cnVlOwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQkvLyBvdGhlciByZWdpb24gaGFzIGNoYW5nZWQKLQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQlpZiAob2xkUmVnaW9ucyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBlID0gb2xkUmVnaW9ucy5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCQkJLy8gY2hhbmdlIGZyb20gZW1wdHkgdGFnIG1heSBoYXZlIGltcGFjdCBvbiBzdHJ1Y3R1cmUKLQkJCQkJaWYgKCFlbGVtZW50LmlzRW1wdHlUYWcoKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCX0KLQkJCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCQkvLyBpZiBuZXcgdGFnIG5hbWUgaXMgdW5jaGFuZ2VkLCBpdCdzIE9LCi0JCQkJCWlmICh0YWdOYW1lVW5jaGFuZ2VkKQotCQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJLy8gb3RoZXIgcmVnaW9uIGhhcyBjaGFuZ2VkCi0JCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQotCQkvLyB1cGRhdGUgYXR0cmlidXRlcwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50LmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQkvLyBmaXJzdCByZW1vdmUgYXR0cmlidXRlcwotCQlpbnQgcmVnaW9uSW5kZXggPSAwOwotCQlpbnQgYXR0ckluZGV4ID0gMDsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCXdoaWxlIChhdHRySW5kZXggPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpKSB7Ci0JCQlhdHRyID0gKEF0dHJJbXBsKSBhdHRyaWJ1dGVzLml0ZW0oYXR0ckluZGV4KTsKLQkJCWlmIChhdHRyID09IG51bGwpIHsgLy8gZXJyb3IKLQkJCQlhdHRySW5kZXgrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJCWlmIChuYW1lUmVnaW9uID09IG51bGwpIHsgLy8gZXJyb3IKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlib29sZWFuIGZvdW5kID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gcmVnaW9uSW5kZXg7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBuYW1lUmVnaW9uKSB7Ci0JCQkJCXJlZ2lvbkluZGV4ID0gaSArIDE7IC8vIG5leHQgcmVnaW9uCi0JCQkJCWZvdW5kID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGZvdW5kKSB7Ci0JCQkJYXR0ckluZGV4Kys7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQllbGVtZW50LnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbnNlcnQgb3IgdXBkYXRlIGF0dHJpYnV0ZXMKLQkJYXR0ckluZGV4ID0gMDsgLy8gcmVzZXQgdG8gZmlyc3QKLQkJQXR0ckltcGwgbmV3QXR0ciA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIG9sZFZhbHVlUmVnaW9uID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJCQkvLyBpbnNlcnQgZGVmZXJyZWQgbmV3IGF0dHJpYnV0ZQotCQkJCQllbGVtZW50Lmluc2VydEF0dHJpYnV0ZU5vZGUobmV3QXR0ciwgYXR0ckluZGV4KyspOwotCQkJCQluZXdBdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoYXR0ciAhPSBudWxsICYmIG9sZFZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCQkJLy8gbm90aWZ5IGV4aXN0aW5nIGF0dHJpYnV0ZSB2YWx1ZSByZW1vdmFsCi0JCQkJCWF0dHIubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJfQotCi0JCQkJb2xkVmFsdWVSZWdpb24gPSBudWxsOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbShhdHRySW5kZXgpOwotCQkJCWlmIChhdHRyICE9IG51bGwgJiYgYXR0ci5nZXROYW1lUmVnaW9uKCkgPT0gcmVnaW9uKSB7Ci0JCQkJCS8vIGV4aXN0aW5nIGF0dHJpYnV0ZQotCQkJCQlhdHRySW5kZXgrKzsKLQkJCQkJLy8gY2xlYXIgb3RoZXIgcmVnaW9ucwotCQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihudWxsKTsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCQlhdHRyID0gKEF0dHJJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCQlpZiAoYXR0ciAhPSBudWxsKQotCQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIGRlZmVyIGluc2VydGlvbiBvZiBuZXcgYXR0cmlidXRlCi0JCQkJCW5ld0F0dHIgPSBhdHRyOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpIHsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHIgIT0gbmV3QXR0ciAmJiBvbGRWYWx1ZVJlZ2lvbiAhPSByZWdpb24pIHsKLQkJCQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgY2hhbmdlZAotCQkJCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQkJfQotCQkJCQlvbGRWYWx1ZVJlZ2lvbiA9IG51bGw7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChuZXdBdHRyICE9IG51bGwpIHsKLQkJCS8vIGluc2VydCBkZWZlcnJlZCBuZXcgYXR0cmlidXRlCi0JCQllbGVtZW50LmFwcGVuZEF0dHJpYnV0ZU5vZGUobmV3QXR0cik7Ci0JCX0KLQkJZWxzZSBpZiAoYXR0ciAhPSBudWxsICYmIG9sZFZhbHVlUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIG5vdGlmeSBleGlzdGluZyBhdHRyaWJ1dGUgdmFsdWUgcmVtb3ZhbAotCQkJYXR0ci5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLm1vZGVsLmdldERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlzZXR1cENvbnRleHQoZmxhdE5vZGUpOwotCi0JCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCS8vIG1ha2Ugc3VyZSB0aGUgcGFyZW50IGlzIHNldCB0byBkZWVwZXN0IGxldmVsCi0JCS8vIHdoZW4gZW5kIHRhZyBoYXMgYmVlbiByZW1vdmVkCi0JCXRoaXMuY29udGV4dC5zZXRMYXN0KCk7Ci0JCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJY2xlYW51cFRleHQoKTsKLQkJY2xlYW51cEVuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBjaGFuZ2VUYWdOYW1lKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlpbnQgb2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnQoKTsKLQkJaWYgKG9mZnNldCA8IDApCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGVJbXBsIHJvb3QgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXRSb290Tm9kZSgpOwotCQlpZiAocm9vdCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCQlOb2RlIG5vZGUgPSByb290LmdldE5vZGVBdChvZmZzZXQpOwotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQlTdHJpbmcgbmV3VGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJaWYgKG5ld1RhZ05hbWUgPT0gbnVsbCB8fCAhZWxlbWVudC5tYXRjaFRhZ05hbWUobmV3VGFnTmFtZSkpIHsKLQkJCS8vIHRoZSB0YWcgbmFtZSBpcyBjaGFuZ2VkCi0JCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gdGhlIHRhZyBuYW1lIGlzIHVuY2hhbmdlZAotCQkvLyB0aGlzIGhhcHBlbnMgd2hlbiB0eXBpbmcgc3BhY2VzIGFmdGVyIHRoZSB0YWcgbmFtZQotCQkvLyBkbyBub3RoaW5nLCBidXQuLi4KLQkJLy8gaWYgaXQncyBub3QgYSBjaGFuZ2UgaW4gdGhlIGVuZCB0YWcgb2YgYW4gZWxlbWVudCB3aXRoIHRoZSBzdGFydAotCQkvLyB0YWcsCi0JCS8vIGFuZCBjYXNlIGhhcyBiZWVuIGNoYW5nZWQsIHNldCB0byBlbGVtZW50IGFuZCBub3RpZnkKLQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgfHwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTikgewotCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCWlmICh0YWdOYW1lID09IG51bGwgfHwgIXRhZ05hbWUuZXF1YWxzKG5ld1RhZ05hbWUpKSB7Ci0JCQkJZWxlbWVudC5zZXRUYWdOYW1lKG5ld1RhZ05hbWUpOwotCQkJCWVsZW1lbnQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBjbGVhbnVwQ29udGV4dCBtZXRob2QKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2xlYW51cEVuZFRhZygpIHsKLQkJTm9kZSBwYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaWYgKG5leHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQlpZiAoZWxlbWVudC5pc0VuZFRhZygpKSB7Ci0JCQkJCQkvLyBmbG9hdGluZyBlbmQgdGFnCi0JCQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQkJCQkJRWxlbWVudEltcGwgc3RhcnQgPSAoRWxlbWVudEltcGwpIHRoaXMuY29udGV4dC5maW5kU3RhcnRUYWcodGFnTmFtZSwgcm9vdE5hbWUpOwotCQkJCQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsKLQkJCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJCS8vIG1vdmUgdGhlIGVuZCB0YWcgZnJvbSAnZWxlbWVudCcgdG8gJ3N0YXJ0JwotCQkJCQkJCXN0YXJ0LmFkZEVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQkJCQkJCXBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJbmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBmaXJzdCA9IG5leHQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkJCXBhcmVudCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBmaXJzdDsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSAmJiBlbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgZWxlbWVudC5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBlbGVtZW50LmdldFRhZ05hbWUoKTsKLQkJCQkJRWxlbWVudEltcGwgZW5kID0gKEVsZW1lbnRJbXBsKSB0aGlzLmNvbnRleHQuZmluZEVuZFRhZyh0YWdOYW1lKTsKLQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBtb3ZlIHRoZSBlbmQgdGFnIGZyb20gJ2VuZCcgdG8gJ2VsZW1lbnQnCi0JCQkJCQllbGVtZW50LmFkZEVuZFRhZyhlbmQpOwotCQkJCQkJcmVtb3ZlRW5kVGFnKGVuZCk7Ci0JCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOyAvLyByZXNldCBjb250ZXh0Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJbmV4dCA9IHBhcmVudC5nZXROZXh0U2libGluZygpOwotCQkJcGFyZW50ID0gcGFyZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNsZWFudXBUZXh0KCkgewotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCU5vZGUgcHJldiA9IChuZXh0ID09IG51bGwgPyBwYXJlbnQuZ2V0TGFzdENoaWxkKCkgOiBuZXh0LmdldFByZXZpb3VzU2libGluZygpKTsKLQotCQlUZXh0SW1wbCBuZXh0VGV4dCA9IG51bGw7Ci0JCVRleHRJbXBsIHByZXZUZXh0ID0gbnVsbDsKLQkJaWYgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCW5leHRUZXh0ID0gKFRleHRJbXBsKSBuZXh0OwotCQl9Ci0JCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlwcmV2VGV4dCA9IChUZXh0SW1wbCkgcHJldjsKLQkJfQotCQlpZiAobmV4dFRleHQgPT0gbnVsbCAmJiBwcmV2VGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAobmV4dFRleHQgIT0gbnVsbCAmJiBwcmV2VGV4dCAhPSBudWxsKSB7Ci0JCQkvLyBjb25zZWN1dGl2ZSBUZXh0IG5vZGVzIGNyZWF0ZWQgYnkgc2V0dXBDb250ZXh0KCksCi0JCQkvLyBjb25jYXQgdGhlbQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5leHRUZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQkJcHJldlRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCU5vZGUgbmV3TmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXh0KTsKLQkJCW5leHQgPSBudWxsOwotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQl9Ci0KLQkJVGV4dEltcGwgY2hpbGRUZXh0ID0gKHByZXZUZXh0ICE9IG51bGwgPyBwcmV2VGV4dCA6IG5leHRUZXh0KTsKLQkJaWYgKGNoaWxkVGV4dC5nZXROZXh0U2libGluZygpID09IG51bGwgJiYgY2hpbGRUZXh0LmdldFByZXZpb3VzU2libGluZygpID09IG51bGwpIHsKLQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHBhcmVudDsKLQkJCQlpZiAoIXBhcmVudEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiAhcGFyZW50RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlpZiAoY2hpbGRUZXh0LmlzV2hpdGVzcGFjZSgpIHx8IGNoaWxkVGV4dC5pc0ludmFsaWQoKSkgewotCQkJCQkJLy8gaW1wbGljaXQgcGFyZW50IGlzIG5vdCByZXF1aXJlZAotCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBuZXdOZXh0ID0gcGFyZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJbmV3UGFyZW50LnJlbW92ZUNoaWxkKHBhcmVudCk7Ci0JCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkVGV4dCk7Ci0JCQkJCQkJbmV3UGFyZW50Lmluc2VydEJlZm9yZShjaGlsZFRleHQsIG5ld05leHQpOwotCQkJCQkJCWlmIChjaGlsZFRleHQgPT0gbmV4dCkgewotCQkJCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGRUZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAobmV3TmV4dCAhPSBudWxsKSB7Ci0JCQkJCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld1BhcmVudCk7Ci0JCQkJCQkJfQotCQkJCQkJCS8vIHRyeSBhZ2FpbgotCQkJCQkJCWNsZWFudXBUZXh0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIHJvdXRpbmUgY3JlYXRlIGFuIEVsZW1lbnQgZnJvbSBjb21tZW50IGRhdGEgZm9yIGNvbW1lbnQgc3R5bGUKLQkgKiBlbGVtZW50cywgc3VjaCBhcyBTU0kgYW5kIE1FVEFEQVRBCi0JICovCi0JcHJvdGVjdGVkIEVsZW1lbnQgY3JlYXRlQ29tbWVudEVsZW1lbnQoU3RyaW5nIGRhdGEsIGJvb2xlYW4gaXNKU1BUYWcpIHsKLQkJU3RyaW5nIHRyaW1tZWREYXRhID0gZGF0YS50cmltKCk7Ci0JCUNvbW1lbnRFbGVtZW50Q29uZmlndXJhdGlvbltdIGNvbmZpZ3MgPSBDb21tZW50RWxlbWVudFJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuZ2V0Q29uZmlndXJhdGlvbnMoKTsKLQkJZm9yIChpbnQgaUNvbmZpZyA9IDA7IGlDb25maWcgPCBjb25maWdzLmxlbmd0aDsgaUNvbmZpZysrKSB7Ci0JCQlDb21tZW50RWxlbWVudENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29uZmlnc1tpQ29uZmlnXTsKLQkJCWlmICgoaXNKU1BUYWcgJiYgIWNvbmZpZy5hY2NlcHRKU1BDb21tZW50KCkpIHx8ICghaXNKU1BUYWcgJiYgIWNvbmZpZy5hY2NlcHRYTUxDb21tZW50KCkpKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlTdHJpbmdbXSBwcmVmaXhlcyA9IGNvbmZpZy5nZXRQcmVmaXgoKTsKLQkJCWZvciAoaW50IGlQcmVmaXggPSAwOyBpUHJlZml4IDwgcHJlZml4ZXMubGVuZ3RoOyBpUHJlZml4KyspIHsKLQkJCQlpZiAodHJpbW1lZERhdGEuc3RhcnRzV2l0aChwcmVmaXhlc1tpUHJlZml4XSkpIHsKLQkJCQkJcmV0dXJuIGNvbmZpZy5jcmVhdGVFbGVtZW50KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSwgZGF0YSwgaXNKU1BUYWcpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlQ29tbWVudEVsZW1lbnQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLCBkYXRhLCBpc0pTUFRhZyk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGhpcyByb3V0aW5lIGNyZWF0ZSBhbiBpbXBsaWNpdCBFbGVtZW50IGZvciBnaXZlbiBwYXJlbnQgYW5kIGNoaWxkLAotCSAqIHN1Y2ggYXMgSFRNTCwgQk9EWSwgSEVBRCwgYW5kIFRCT0RZIGZvciBIVE1MIGRvY3VtZW50LgotCSAqLwotCXByb3RlY3RlZCBFbGVtZW50IGNyZWF0ZUltcGxpY2l0RWxlbWVudChOb2RlIHBhcmVudCwgTm9kZSBjaGlsZCkgewotCQlNb2RlbFBhcnNlckFkYXB0ZXIgYWRhcHRlciA9IGdldFBhcnNlckFkYXB0ZXIoKTsKLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkgewotCQkJcmV0dXJuIGFkYXB0ZXIuY3JlYXRlSW1wbGljaXRFbGVtZW50KHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKSwgcGFyZW50LCBjaGlsZCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGRlbW90ZU5vZGVzKE5vZGUgcm9vdCwgTm9kZSBuZXdQYXJlbnQsIE5vZGUgb2xkUGFyZW50LCBOb2RlIG5leHQpIHsKLQkJaWYgKG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJcmV0dXJuOwotCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0KLQkJLy8gZmluZCBuZXh0Ci0JCXdoaWxlIChuZXh0ID09IG51bGwpIHsKLQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvbGRQYXJlbnQ7Ci0JCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkKLQkJCQlyZXR1cm47Ci0JCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQluZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQl9Ci0KLQkJd2hpbGUgKG5leHQgIT0gbnVsbCkgewotCQkJYm9vbGVhbiBkb25lID0gZmFsc2U7Ci0JCQlpZiAobmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCU5vZGUgbmV4dENoaWxkID0gbmV4dEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCQlpZiAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQkJCS8vIGRlbW90ZSBjaGlsZHJlbgotCQkJCQkJbmV4dCA9IG5leHRDaGlsZDsKLQkJCQkJCW9sZFBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQotCQkJCQlpZiAobmV4dEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJCWlmIChuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCS8vIHN0b3AgYXQgdGhlIG1hdGNoZWQgaW52YWxpZCBlbmQgdGFnCi0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG5leHRFbGVtZW50KTsKLQkJCQkJCQluZXdFbGVtZW50LmFkZEVuZFRhZyhuZXh0RWxlbWVudCk7Ci0KLQkJCQkJCQlpZiAobmV3RWxlbWVudCA9PSByb290KQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQkJTm9kZSBwID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJLy8gY2hlY2sgaWYgcmVhY2hlZCB0byB0b3AKLQkJCQkJCQlpZiAocCA9PSBudWxsIHx8IHAgPT0gb2xkUGFyZW50IHx8IHAuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHA7Ci0JCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyByZW1vdmUgaW1wbGljaXQgZWxlbWVudAotCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJZG9uZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmICghZG9uZSkgewotCQkJCWlmICghY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQlpZiAobmV3RWxlbWVudCA9PSByb290KQotCQkJCQkJcmV0dXJuOwotCQkJCQlOb2RlIHAgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJLy8gY2hlY2sgaWYgcmVhY2hlZCB0byB0b3AKLQkJCQkJaWYgKHAgPT0gbnVsbCB8fCBwID09IG9sZFBhcmVudCB8fCBwLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQlyZXR1cm47Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIHA7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQlpbnNlcnROb2RlKG5ld0VsZW1lbnQsIGNoaWxkLCBudWxsKTsKLQkJCQlOb2RlIGNoaWxkUGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChjaGlsZFBhcmVudCAhPSBuZXdFbGVtZW50KSB7Ci0JCQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNoaWxkUGFyZW50OwotCQkJCX0KLQkJCX0KLQotCQkJLy8gZmluZCBuZXh0IHBhcmVudCBhbmQgc2libGluZwotCQkJd2hpbGUgKG5leHQgPT0gbnVsbCkgewotCQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJcmV0dXJuOwotCQkJCUVsZW1lbnRJbXBsIG9sZEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG9sZFBhcmVudDsKLQotCQkJCS8vIGR1ZyBwYXJlbnQgbXVzdCBub3QgaGF2ZSBjaGlsZHJlbiBhdCB0aGlzIHBvaW50Ci0JCQkJaWYgKCFvbGRFbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSAmJiAhb2xkRWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQkJCW5leHQgPSBvbGRFbGVtZW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0KLQkJCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkKLQkJCQkJcmV0dXJuOwotCQkJCW9sZFBhcmVudCA9IG9sZEVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJCW5leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIE1vZGVsUGFyc2VyQWRhcHRlciBnZXRQYXJzZXJBZGFwdGVyKCkgewotCQlyZXR1cm4gKE1vZGVsUGFyc2VyQWRhcHRlcikgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmdldEFkYXB0ZXJGb3IoTW9kZWxQYXJzZXJBZGFwdGVyLmNsYXNzKTsKLQl9Ci0JCi0JLyoqCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRGaW5kUm9vdE5hbWUoU3RyaW5nIHRhZ05hbWUpIHsKLQkJTW9kZWxQYXJzZXJBZGFwdGVyIGFkYXB0ZXIgPSBnZXRQYXJzZXJBZGFwdGVyKCk7Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCXJldHVybiBhZGFwdGVyLmdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgSURPTU1vZGVsIGdldE1vZGVsKCkgewotCQlyZXR1cm4gdGhpcy5tb2RlbDsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRDREFUQVNlY3Rpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydENEQVRBU2VjdGlvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUNEQVRBU2VjdGlvbkltcGwgY2RhdGEgPSBudWxsOwotCQl0cnkgewotCQkJY2RhdGEgPSAoQ0RBVEFTZWN0aW9uSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUNEQVRBU2VjdGlvbihudWxsKTsKLQkJfQotCQljYXRjaCAoRE9NRXhjZXB0aW9uIGV4KSB7Ci0JCX0KLQkJaWYgKGNkYXRhID09IG51bGwpIHsgLy8gQ0RBVEEgc2VjdGlvbiBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi0JCQlpbnNlcnRJbnZhbGlkRGVjbChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIGRlY2wKLQkJCXJldHVybjsKLQkJfQotCi0JCWNkYXRhLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoY2RhdGEpOwotCX0KLQotCS8qKgotCSAqIGluc2VydENvbW1lbnQgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydENvbW1lbnQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgZGF0YSA9IG51bGw7Ci0JCWJvb2xlYW4gaXNKU1BUYWcgPSBmYWxzZTsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKGlzTmVzdGVkQ29tbWVudE9wZW4ocmVnaW9uVHlwZSkpIHsKLQkJCQlpc0pTUFRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCB8fCBpc05lc3RlZENvbW1lbnRUZXh0KHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKGRhdGEgPT0gbnVsbCkgewotCQkJCQlkYXRhID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmIChkYXRhICE9IG51bGwpIHsKLQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGNyZWF0ZUNvbW1lbnRFbGVtZW50KGRhdGEsIGlzSlNQVGFnKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQlpZiAoIWlzRW5kVGFnKGVsZW1lbnQpKSB7Ci0JCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQlpbnNlcnRTdGFydFRhZyhlbGVtZW50KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIGVuZCB0YWcKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJCQlTdHJpbmcgdGFnTmFtZSA9IGVsZW1lbnQuZ2V0VGFnTmFtZSgpOwotCQkJCVN0cmluZyByb290TmFtZSA9IGdldEZpbmRSb290TmFtZSh0YWdOYW1lKTsKLQkJCQlFbGVtZW50SW1wbCBzdGFydCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRTdGFydFRhZyh0YWdOYW1lLCByb290TmFtZSk7Ci0JCQkJaWYgKHN0YXJ0ICE9IG51bGwpIHsgLy8gc3RhcnQgdGFnIGZvdW5kCi0JCQkJCWluc2VydEVuZFRhZyhzdGFydCk7Ci0JCQkJCXN0YXJ0LmFkZEVuZFRhZyhlbGVtZW50KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQotCQkJCS8vIGludmFsaWQgZW5kIHRhZwotCQkJCWluc2VydE5vZGUoZWxlbWVudCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCQl9Ci0KLQkJQ29tbWVudEltcGwgY29tbWVudCA9IChDb21tZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUNvbW1lbnQobnVsbCk7Ci0JCWlmIChjb21tZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChpc0pTUFRhZykKLQkJCWNvbW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQljb21tZW50LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoY29tbWVudCk7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0RGVjbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0RGVjbChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWJvb2xlYW4gaXNEb2NUeXBlID0gZmFsc2U7Ci0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJU3RyaW5nIHB1YmxpY0lkID0gbnVsbDsKLQkJU3RyaW5nIHN5c3RlbUlkID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTikgewotCQkJCWlzRG9jVHlwZSA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSkgewotCQkJCWlmIChuYW1lID09IG51bGwpCi0JCQkJCW5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKSB7Ci0JCQkJaWYgKHB1YmxpY0lkID09IG51bGwpCi0JCQkJCXB1YmxpY0lkID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKSB7Ci0JCQkJaWYgKHN5c3RlbUlkID09IG51bGwpCi0JCQkJCXN5c3RlbUlkID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRBdHRyVmFsdWUoZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQotCQkvLyBpbnZhbGlkIGRlY2xhcmF0aW9uCi0JCWlmICghaXNEb2NUeXBlKSB7Ci0JCQlpbnNlcnRJbnZhbGlkRGVjbChmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlEb2N1bWVudFR5cGVJbXBsIGRvY1R5cGUgPSAoRG9jdW1lbnRUeXBlSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZURvY3R5cGUobmFtZSk7Ci0JCWlmIChkb2NUeXBlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChwdWJsaWNJZCAhPSBudWxsKQotCQkJZG9jVHlwZS5zZXRQdWJsaWNJZChwdWJsaWNJZCk7Ci0JCWlmIChzeXN0ZW1JZCAhPSBudWxsKQotCQkJZG9jVHlwZS5zZXRTeXN0ZW1JZChzeXN0ZW1JZCk7Ci0JCWRvY1R5cGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZShkb2NUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbmRUYWcgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMsIGJ1dCBub3Qgb3ZlcnJpZGVkLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0RW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgbmV3UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChuZXdQYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpZiAoISgoRWxlbWVudEltcGwpIGVsZW1lbnQpLmlzQ29udGFpbmVyKCkpIHsKLQkJCS8vIGp1c3QgdXBkYXRlIGNvbnRleHQKLQkJCU5vZGUgZWxlbWVudE5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAoZWxlbWVudE5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZWxlbWVudE5leHQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5ld1BhcmVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCU5vZGUgbmV3TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJTm9kZSBvbGRQYXJlbnQgPSB0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAob2xkUGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlwcm9tb3RlTm9kZXMoZWxlbWVudCwgbmV3UGFyZW50LCBuZXdOZXh0LCBvbGRQYXJlbnQsIG9sZE5leHQpOwotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCS8vIHJlLWNoZWNrIHRoZSBuZXh0IHNpYmxpbmcKLQkJbmV3TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJaWYgKG5ld05leHQgIT0gbnVsbCkKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXdOZXh0KTsKLQkJZWxzZQotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUobmV3UGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbmRUYWcgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEVuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJdGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmICh0YWdOYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBlbmQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHJvb3ROYW1lID0gZ2V0RmluZFJvb3ROYW1lKHRhZ05hbWUpOwotCQlFbGVtZW50SW1wbCBzdGFydCA9IChFbGVtZW50SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRTdGFydFRhZyh0YWdOYW1lLCByb290TmFtZSk7Ci0JCWlmIChzdGFydCAhPSBudWxsKSB7IC8vIHN0YXJ0IHRhZyBmb3VuZAotCQkJaW5zZXJ0RW5kVGFnKHN0YXJ0KTsKLQkJCXN0YXJ0LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBpbnZhbGlkIGVuZCB0YWcKLQkJRWxlbWVudEltcGwgZW5kID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVuZCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbmQgPT0gbnVsbCkgeyAvLyBpbnZhbGlkIGVuZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUoZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRFbnRpdHlSZWYgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydEVudGl0eVJlZihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyBuYW1lID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB7Ci0JCQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCQkJbmFtZSA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0RW50aXR5UmVmTmFtZShmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCWlmIChuYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBlbnRpdHkKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gSVNTVUU6IGF2b2lkIHRoaXMgY2FzdAotCQlTdHJpbmcgdmFsdWUgPSAoKERvY3VtZW50SW1wbCl0aGlzLm1vZGVsLmdldERvY3VtZW50KCkpLmdldENoYXJWYWx1ZShuYW1lKTsKLQkJaWYgKHZhbHVlICE9IG51bGwpIHsgLy8gY2hhcmFjdGVyIGVudGl0eQotCQkJVGV4dEltcGwgdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5jb250ZXh0LmZpbmRQcmV2aW91c1RleHQoKTsKLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsgLy8gZXhpc3RpbmcgdGV4dCBmb3VuZAotCQkJCS8vIGRvIG5vdCBhcHBlbmQgZGF0YQotCQkJCXRleHQuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkvLyBub3RpZnkgdGhlIGNoYW5nZQotCQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQkvLyBuZXcgdGV4dAotCQkJdGV4dCA9IChUZXh0SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZVRleHROb2RlKG51bGwpOwotCQkJaWYgKHRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0JCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQlpbnNlcnROb2RlKHRleHQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJLy8gZ2VuZXJhbCBlbnRpdHkgcmVmZXJlbmNlCi0JCUVudGl0eVJlZmVyZW5jZUltcGwgcmVmID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZiA9IChFbnRpdHlSZWZlcmVuY2VJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlRW50aXR5UmVmZXJlbmNlKG5hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAocmVmID09IG51bGwpIHsgLy8gZW50aXR5IHJlZmVyZW5jZSBtaWdodCBub3QgYmUgc3VwcG9ydGVkCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0KLQkJcmVmLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydE5vZGUocmVmKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRJbnZhbGlkRGVjbCBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0SW52YWxpZERlY2woSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCIhIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydEpTUFRhZyBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0TmVzdGVkVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCWlmIChyZWdpb25zID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlBdHRySW1wbCBhdHRyID0gbnVsbDsKLQkJVmVjdG9yIGF0dHJOb2RlcyA9IG51bGw7Ci0JCWJvb2xlYW4gaXNDbG9zZVRhZyA9IGZhbHNlOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAoaXNOZXN0ZWRUYWdPcGVuKHJlZ2lvblR5cGUpIHx8IGlzTmVzdGVkVGFnTmFtZShyZWdpb25UeXBlKSkgewotCQkJCXRhZ05hbWUgPSBjb21wdXRlTmVzdGVkVGFnKHJlZ2lvblR5cGUsIHRhZ05hbWUsIGZsYXROb2RlLCByZWdpb24pOwotCQkJfQotCQkJZWxzZSBpZiAoaXNOZXN0ZWRUYWdDbG9zZShyZWdpb25UeXBlKSkgewotCQkJCWlzQ2xvc2VUYWcgPSB0cnVlOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlTdHJpbmcgbmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCQlhdHRyID0gKEF0dHJJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXROYW1lUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWlmIChhdHRyTm9kZXMgPT0gbnVsbCkKLQkJCQkJCWF0dHJOb2RlcyA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJYXR0ck5vZGVzLmFkZEVsZW1lbnQoYXR0cik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRFcXVhbFJlZ2lvbihyZWdpb24pOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAodGFnTmFtZSA9PSBudWxsKSB7Ci0JCQlpZiAoaXNDbG9zZVRhZykgewotCQkJCS8vIGNsb3NlIEpTUCB0YWcKLQkJCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCUVsZW1lbnRJbXBsIHN0YXJ0ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJCWlmIChzdGFydC5pc0pTUENvbnRhaW5lcigpKSB7Ci0JCQkJCQlpbnNlcnRFbmRUYWcoc3RhcnQpOwotCQkJCQkJc3RhcnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCS8vIGludmFsaWQgSlNQIHRhZwotCQkJaW5zZXJ0VGV4dChmbGF0Tm9kZSk7IC8vIHJlZ2FyZCBhcyBpbnZhbGlkIHRleHQKLQkJCXJldHVybjsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSBudWxsOwotCQl0cnkgewotCQkJZWxlbWVudCA9IChFbGVtZW50SW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQodGFnTmFtZSk7Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBleCkgewotCQl9Ci0JCWlmIChlbGVtZW50ID09IG51bGwpIHsgLy8gaW52YWxpZCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQkJaWYgKGF0dHJOb2RlcyAhPSBudWxsKSB7Ci0JCQlFbnVtZXJhdGlvbiBhZSA9IGF0dHJOb2Rlcy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGFlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJQXR0ciBhID0gKEF0dHIpIGFlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGEgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJZWxlbWVudC5hcHBlbmRBdHRyaWJ1dGVOb2RlKGEpOwotCQkJfQotCQl9Ci0JCWVsZW1lbnQuc2V0SlNQVGFnKHRydWUpOwotCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0U3RhcnRUYWcoZWxlbWVudCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRUYWdDbG9zZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnT3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5lc3RlZFRhZyhTdHJpbmcgcmVnaW9uVHlwZSwgU3RyaW5nIHRhZ05hbWUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJcmV0dXJuIHRhZ05hbWU7Ci0JfQotCi0JLyoqCi0JICogaW5zZXJ0Tm9kZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY2hpbGQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0Tm9kZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKHRoaXMuY29udGV4dCA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCU5vZGUgcGFyZW50ID0gdGhpcy5jb250ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOb2RlIG5leHQgPSB0aGlzLmNvbnRleHQuZ2V0TmV4dE5vZGUoKTsKLQkJd2hpbGUgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQlpZiAoY2FuQ29udGFpbihlbGVtZW50LCBub2RlKSkgewotCQkJCWlmICghZWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHQgPT0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCkpIHsKLQkJCQkJLy8gZmlyc3QgY2hpbGQgb2YgaW1wbGljaXQgdGFnCi0JCQkJCS8vIGRlbGV0ZWdlIHRvIHRoZSBwYXJlbnQKLQkJCQkJcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJCXJldHVybjsKLQkJCQkJbmV4dCA9IGVsZW1lbnQ7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQkJcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQkvLyBwcm9tb3RlIHNpYmxpbmdzCi0JCQlOb2RlIG5ld05leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCXdoaWxlIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBuZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5ld05leHQpOwotCQkJCWNoaWxkID0gbmV4dENoaWxkOwotCQkJfQotCi0JCQkvLyBsZWF2ZSB0aGUgb2xkIGVuZCB0YWcgd2hlcmUgaXQgaXMKLQkJCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJRWxlbWVudCBlbmQgPSBlbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGVuZCwgbmV3TmV4dCk7Ci0JCQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJCQluZXh0ID0gZW5kOwotCQkJCX0KLQkJCX0KLQkJCWlmICghZWxlbWVudC5oYXNTdGFydFRhZygpKSB7Ci0JCQkJLy8gaW1wbGljaXQgZWxlbWVudAotCQkJCWlmICghZWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGVsZW1lbnQpOwotCQkJCX0KLQkJCX0KLQotCQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJCWlmIChuZXh0ID09IG51bGwpCi0JCQkJbmV4dCA9IG5ld05leHQ7Ci0JCQlpZiAobmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCWVsc2UKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQl9Ci0KLQkJaW5zZXJ0Tm9kZShwYXJlbnQsIG5vZGUsIG5leHQpOwotCQluZXh0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQlpZiAobmV4dCAhPSBudWxsKQotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5leHQpOwotCQllbHNlCi0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIGluc2VydE5vZGUoTm9kZSBwYXJlbnQsIE5vZGUgbm9kZSwgTm9kZSBuZXh0KSB7Ci0JCXdoaWxlIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCWlmIChuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpKQotCQkJCWJyZWFrOwotCQkJaWYgKCFjYW5CZUltcGxpY2l0VGFnKG5leHRFbGVtZW50LCBub2RlKSkKLQkJCQlicmVhazsKLQkJCXBhcmVudCA9IG5leHRFbGVtZW50OwotCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJfQotCQlFbGVtZW50IGltcGxpY2l0RWxlbWVudCA9IGNyZWF0ZUltcGxpY2l0RWxlbWVudChwYXJlbnQsIG5vZGUpOwotCQlpZiAoaW1wbGljaXRFbGVtZW50ICE9IG51bGwpCi0JCQlub2RlID0gaW1wbGljaXRFbGVtZW50OwotCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFBJIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRQSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YXJnZXQgPSBudWxsOwotCQlJdGVyYXRvciBlID0gcmVnaW9ucy5pdGVyYXRvcigpOwotCQl3aGlsZSAoZS5oYXNOZXh0KCkpIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IChJVGV4dFJlZ2lvbikgZS5uZXh0KCk7Ci0JCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpCi0JCQkJY29udGludWU7Ci0JCQlpZiAodGFyZ2V0ID09IG51bGwpCi0JCQkJdGFyZ2V0ID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQl9Ci0KLQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uSW1wbCBwaSA9IChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25JbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uKHRhcmdldCwgbnVsbCk7Ci0JCWlmIChwaSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlwaS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnROb2RlKHBpKTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRTdGFydFRhZyBtZXRob2QgY2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcywgYnV0IG5vdCBvdmVycmlkZGVuLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0U3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpbnNlcnROb2RlKGVsZW1lbnQpOwotCi0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWlmIChuZXdFbGVtZW50LmlzRW1wdHlUYWcoKSB8fCAhbmV3RWxlbWVudC5pc0NvbnRhaW5lcigpKQotCQkJcmV0dXJuOwotCi0JCS8vIGRlbW90ZSBzaWJsaW5ncwotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJTm9kZSBuZXh0ID0gdGhpcy5jb250ZXh0LmdldE5leHROb2RlKCk7Ci0JCWRlbW90ZU5vZGVzKGVsZW1lbnQsIGVsZW1lbnQsIHBhcmVudCwgbmV4dCk7Ci0KLQkJLy8gdXBkYXRlIGNvbnRleHQKLQkJTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCWlmIChmaXJzdENoaWxkICE9IG51bGwpCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZmlyc3RDaGlsZCk7Ci0JCWVsc2UKLQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKGVsZW1lbnQpOwotCX0KLQotCS8qKgotCSAqIGluc2VydFN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqLwotCXByaXZhdGUgdm9pZCBpbnNlcnRTdGFydFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCVN0cmluZyB0YWdOYW1lID0gbnVsbDsKLQkJYm9vbGVhbiBpc0VtcHR5VGFnID0gZmFsc2U7Ci0JCUF0dHJJbXBsIGF0dHIgPSBudWxsOwotCQlWZWN0b3IgYXR0ck5vZGVzID0gbnVsbDsKLQkJSXRlcmF0b3IgZSA9IHJlZ2lvbnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGUuaGFzTmV4dCgpKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSAoSVRleHRSZWdpb24pIGUubmV4dCgpOwotCQkJU3RyaW5nIHJlZ2lvblR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgfHwgaXNOZXN0ZWRUYWdOYW1lKHJlZ2lvblR5cGUpKSB7Ci0JCQkJaWYgKHRhZ05hbWUgPT0gbnVsbCkKLQkJCQkJdGFnTmFtZSA9IGZsYXROb2RlLmdldFRleHQocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQkJaXNFbXB0eVRhZyA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCVN0cmluZyBuYW1lID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQkJCWF0dHIgPSAoQXR0ckltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVBdHRyaWJ1dGUobmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldE5hbWVSZWdpb24ocmVnaW9uKTsKLQkJCQkJaWYgKGF0dHJOb2RlcyA9PSBudWxsKQotCQkJCQkJYXR0ck5vZGVzID0gbmV3IFZlY3RvcigpOwotCQkJCQlhdHRyTm9kZXMuYWRkRWxlbWVudChhdHRyKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldEVxdWFsUmVnaW9uKHJlZ2lvbik7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQlhdHRyLnNldFZhbHVlUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWF0dHIgPSBudWxsOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCWlmICh0YWdOYW1lID09IG51bGwpIHsgLy8gaW52YWxpZCBzdGFydCB0YWcKLQkJCWluc2VydFRleHQoZmxhdE5vZGUpOyAvLyByZWdhcmQgYXMgaW52YWxpZCB0ZXh0Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gbnVsbDsKLQkJdHJ5IHsKLQkJCWVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMubW9kZWwuZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwotCQl9Ci0JCWNhdGNoIChET01FeGNlcHRpb24gZXgpIHsKLQkJCS8vIHR5cGljYWxseSBpbnZhbGlkIG5hbWUKLQkJfQotCQlpZiAoZWxlbWVudCA9PSBudWxsKSB7IC8vIGludmFsaWQgdGFnCi0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsgLy8gcmVnYXJkIGFzIGludmFsaWQgdGV4dAotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChhdHRyTm9kZXMgIT0gbnVsbCkgewotCQkJRW51bWVyYXRpb24gYWUgPSBhdHRyTm9kZXMuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChhZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUF0dHIgYSA9IChBdHRyKSBhZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChhID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWVsZW1lbnQuYXBwZW5kQXR0cmlidXRlTm9kZShhKTsKLQkJCX0KLQkJfQotCQlpZiAoaXNFbXB0eVRhZykKLQkJCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRTdGFydFRhZyhlbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbWV0aG9kCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25VdGlsLmdldEZpcnN0UmVnaW9uVHlwZShmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB7Ci0JCQlpbnNlcnRTdGFydFRhZyhmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCWluc2VydEVuZFRhZyhmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4gfHwgaXNOZXN0ZWRDb21tZW50T3BlbihyZWdpb25UeXBlKSkgewotCQkJaW5zZXJ0Q29tbWVudChmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0hBUl9SRUZFUkVOQ0UpIHsKLQkJCWluc2VydEVudGl0eVJlZihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOKSB7Ci0JCQlpbnNlcnREZWNsKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU4pIHsKLQkJCWluc2VydFBJKGZsYXROb2RlKTsKLQkJfQotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHsKLQkJCWluc2VydENEQVRBU2VjdGlvbihmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSBpZiAoaXNOZXN0ZWRUYWcocmVnaW9uVHlwZSkpIHsKLQkJCWluc2VydE5lc3RlZFRhZyhmbGF0Tm9kZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpbnNlcnRUZXh0KGZsYXROb2RlKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50VGV4dChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOZXN0ZWRDb21tZW50T3BlbihTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkVGFnTmFtZShTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzTmVzdGVkQ29udGVudChTdHJpbmcgcmVnaW9uVHlwZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIGluc2VydFRleHQgbWV0aG9kIENhbiBiZSBjYWxsZWQgZnJvbSBzdWJjbGFzc2VzLCBub3QgdG8gYmUgb3ZlcnJpZGVkIG9yCi0JICogcmUtaW1wbGVtZW50ZWQuCi0JICogCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0VGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMuY29udGV4dC5maW5kUHJldmlvdXNUZXh0KCk7Ci0JCWlmICh0ZXh0ICE9IG51bGwpIHsgLy8gZXhpc3RpbmcgdGV4dCBmb3VuZAotCQkJdGV4dC5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBuZXcgdGV4dAotCQl0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUobnVsbCk7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0Tm9kZSh0ZXh0KTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VuZFRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCU1vZGVsUGFyc2VyQWRhcHRlciBhZGFwdGVyID0gZ2V0UGFyc2VyQWRhcHRlcigpOwotCQlpZiAoYWRhcHRlciAhPSBudWxsKSB7Ci0JCQlyZXR1cm4gYWRhcHRlci5pc0VuZFRhZyhlbGVtZW50KTsKLQkJfQotCQlyZXR1cm4gZWxlbWVudC5pc0VuZFRhZygpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgdm9pZCBwcm9tb3RlTm9kZXMoTm9kZSByb290LCBOb2RlIG5ld1BhcmVudCwgTm9kZSBuZXdOZXh0LCBOb2RlIG9sZFBhcmVudCwgTm9kZSBuZXh0KSB7Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSBudWxsOwotCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCW5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5ld1BhcmVudDsKLQkJfQotCi0JCU5vZGUgcm9vdFBhcmVudCA9IHJvb3QuZ2V0UGFyZW50Tm9kZSgpOwotCQl3aGlsZSAob2xkUGFyZW50ICE9IHJvb3RQYXJlbnQpIHsKLQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQlib29sZWFuIGRvbmUgPSBmYWxzZTsKLQkJCQlib29sZWFuIGVuZFRhZyA9IGZhbHNlOwotCQkJCWlmIChuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgbmV4dEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5leHQ7Ci0JCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQlpZiAobmV4dENoaWxkICE9IG51bGwpIHsKLQkJCQkJCQkvLyBwcm9tb3RlIGNoaWxkcmVuCi0JCQkJCQkJbmV4dCA9IG5leHRDaGlsZDsKLQkJCQkJCQlvbGRQYXJlbnQgPSBuZXh0RWxlbWVudDsKLQkJCQkJCQljb250aW51ZTsKLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5leHRFbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCQkJaWYgKG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJCWVuZFRhZyA9IHRydWU7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gcmVtb3ZlIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJCQluZXh0ID0gbmV4dEVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQlvbGRQYXJlbnQucmVtb3ZlQ2hpbGQobmV4dEVsZW1lbnQpOwotCQkJCQkJCWRvbmUgPSB0cnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKCFkb25lKSB7Ci0JCQkJCWlmICghZW5kVGFnICYmIG5ld0VsZW1lbnQgIT0gbnVsbCAmJiAhY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQkJbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwpCi0JCQkJCQkJcmV0dXJuOyAvLyBlcnJvcgotCQkJCQkJTm9kZSBlbGVtZW50TmV4dCA9IG5ld0VsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCS8vIHByb21vdGUgc2libGluZ3MKLQkJCQkJCXByb21vdGVOb2RlcyhuZXdFbGVtZW50LCBuZXdQYXJlbnQsIGVsZW1lbnROZXh0LCBuZXdFbGVtZW50LCBuZXdOZXh0KTsKLQkJCQkJCW5ld05leHQgPSBuZXdFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlpZiAobmV3UGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCQkJCX0KLQkJCQkJCWNvbnRpbnVlOwotCQkJCQl9Ci0KLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCW9sZFBhcmVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQkJCWluc2VydE5vZGUobmV3UGFyZW50LCBjaGlsZCwgbmV3TmV4dCk7Ci0JCQkJCU5vZGUgY2hpbGRQYXJlbnQgPSBjaGlsZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChjaGlsZFBhcmVudCAhPSBuZXdQYXJlbnQpIHsKLQkJCQkJCW5ld1BhcmVudCA9IGNoaWxkUGFyZW50OwotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJbmV3TmV4dCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChvbGRQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQlyZXR1cm47Ci0JCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvbGRQYXJlbnQ7Ci0JCQlvbGRQYXJlbnQgPSBvbGRFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChvbGRQYXJlbnQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQluZXh0ID0gb2xkRWxlbWVudC5nZXROZXh0U2libGluZygpOwotCi0JCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCUVsZW1lbnQgZW5kID0gbnVsbDsKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaGFzQ2hpbGROb2RlcygpICYmICFvbGRFbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCQkJb2xkUGFyZW50LnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpOwotCQkJCQllbmQgPSBvbGRFbGVtZW50OwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZW5kID0gb2xkRWxlbWVudC5yZW1vdmVFbmRUYWcoKTsKLQkJCQl9Ci0JCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCWluc2VydE5vZGUobmV3UGFyZW50LCBlbmQsIG5ld05leHQpOwotCQkJCQlOb2RlIGVuZFBhcmVudCA9IGVuZC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChlbmRQYXJlbnQgIT0gbmV3UGFyZW50KSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBlbmRQYXJlbnQ7Ci0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQluZXdOZXh0ID0gZW5kLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVFbmRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkVsZW1lbnQKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWlmICghKChFbGVtZW50SW1wbCkgZWxlbWVudCkuaXNDb250YWluZXIoKSkgewotCQkJLy8ganVzdCB1cGRhdGUgY29udGV4dAotCQkJTm9kZSBlbGVtZW50TmV4dCA9IGVsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKQotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIGRlbW90ZSBzaWJsaW5ncwotCQlOb2RlIG5leHQgPSBlbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCUVsZW1lbnRJbXBsIG5ld0VsZW1lbnQgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCS8vIGZpbmQgbmV3IHBhcmVudAotCQlmb3IgKE5vZGUgbGFzdCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7IGxhc3QgIT0gbnVsbDsgbGFzdCA9IGxhc3QuZ2V0TGFzdENoaWxkKCkpIHsKLQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJYnJlYWs7Ci0JCQlFbGVtZW50SW1wbCBsYXN0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbGFzdDsKLQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJYnJlYWs7Ci0JCQluZXdFbGVtZW50ID0gbGFzdEVsZW1lbnQ7Ci0JCX0KLQkJTm9kZSBsYXN0Q2hpbGQgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOwotCQlkZW1vdGVOb2RlcyhlbGVtZW50LCBuZXdFbGVtZW50LCBwYXJlbnQsIG5leHQpOwotCi0JCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCU5vZGUgbmV3TmV4dCA9IG51bGw7Ci0JCWlmIChsYXN0Q2hpbGQgIT0gbnVsbCkKLQkJCW5ld05leHQgPSBsYXN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJZWxzZQotCQkJbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQllbHNlCi0JCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdFbGVtZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGlmIGl0IGlzIG5vIGxvbmdlciByZXF1aXJlZCBpbXBsaWNpdCB0YWcgd2l0aAotCSAqIHJlbWFpbmluZyBjaGlsZCBub2RlcyBwcm9tb3RlZC4KLQkgKi8KLQlwcml2YXRlIEVsZW1lbnQgcmVtb3ZlSW1wbGljaXRFbGVtZW50KE5vZGUgcGFyZW50KSB7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlpZiAoIWVsZW1lbnQuaXNJbXBsaWNpdFRhZygpKQotCQkJcmV0dXJuIG51bGw7Ci0JCWlmIChjYW5CZUltcGxpY2l0VGFnKGVsZW1lbnQpKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJTm9kZSBlbGVtZW50UGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChlbGVtZW50UGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsgLy8gZXJyb3IKLQkJTm9kZSBmaXJzdENoaWxkID0gZWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCU5vZGUgY2hpbGQgPSBmaXJzdENoaWxkOwotCQlOb2RlIGVsZW1lbnROZXh0ID0gZWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJTm9kZSBuZXh0Q2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpOwotCQkJZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZCk7Ci0JCQllbGVtZW50UGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgZWxlbWVudE5leHQpOwotCQkJY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCX0KLQotCQkvLyByZXNldCBjb250ZXh0Ci0JCWlmICh0aGlzLmNvbnRleHQuZ2V0UGFyZW50Tm9kZSgpID09IGVsZW1lbnQpIHsKLQkJCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG9sZE5leHQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShvbGROZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShlbGVtZW50UGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5jb250ZXh0LmdldE5leHROb2RlKCkgPT0gZWxlbWVudCkgewotCQkJaWYgKGZpcnN0Q2hpbGQgIT0gbnVsbCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShmaXJzdENoaWxkKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlbGVtZW50TmV4dCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShlbGVtZW50TmV4dCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShlbGVtZW50UGFyZW50KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZW1vdmVOb2RlKGVsZW1lbnQpOwotCQlyZXR1cm4gZWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiByZW1vdmVOb2RlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZU5vZGUoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmICh0aGlzLmNvbnRleHQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgbmV4dCA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJTm9kZSBwcmV2ID0gbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChub2RlID09IG9sZFBhcmVudCkgewotCQkJaWYgKG5leHQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQllbHNlCi0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJfQotCQllbHNlIHsKLQkJCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQkJaWYgKG5vZGUgPT0gb2xkTmV4dCkgewotCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShuZXh0KTsKLQkJCX0KLQkJfQotCi0JCXBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKLQotCQlpZiAocmVtb3ZlSW1wbGljaXRFbGVtZW50KHBhcmVudCkgIT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBkZW1vdGUgc2libGluZwotCQlpZiAocHJldiAhPSBudWxsICYmIHByZXYuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgcHJldjsKLQkJCWlmICghbmV3RWxlbWVudC5oYXNFbmRUYWcoKSAmJiAhbmV3RWxlbWVudC5pc0VtcHR5VGFnKCkgJiYgbmV3RWxlbWVudC5pc0NvbnRhaW5lcigpKSB7Ci0JCQkJLy8gZmluZCBuZXcgcGFyZW50Ci0JCQkJZm9yIChOb2RlIGxhc3QgPSBuZXdFbGVtZW50LmdldExhc3RDaGlsZCgpOyBsYXN0ICE9IG51bGw7IGxhc3QgPSBsYXN0LmdldExhc3RDaGlsZCgpKSB7Ci0JCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQlicmVhazsKLQkJCQkJRWxlbWVudEltcGwgbGFzdEVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGxhc3Q7Ci0JCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCQlicmVhazsKLQkJCQkJbmV3RWxlbWVudCA9IGxhc3RFbGVtZW50OwotCQkJCX0KLQkJCQlOb2RlIGxhc3RDaGlsZCA9IG5ld0VsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCQkJZGVtb3RlTm9kZXMocHJldiwgbmV3RWxlbWVudCwgcGFyZW50LCBuZXh0KTsKLQotCQkJCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCQkJTm9kZSBuZXdOZXh0ID0gbnVsbDsKLQkJCQlpZiAobGFzdENoaWxkICE9IG51bGwpCi0JCQkJCW5ld05leHQgPSBsYXN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQllbHNlCi0JCQkJCW5ld05leHQgPSBuZXdFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAobmV3TmV4dCAhPSBudWxsKQotCQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQkJZWxzZQotCQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShuZXdFbGVtZW50KTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIHJlbW92ZVN0YXJ0VGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50Ci0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5FbGVtZW50Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0YXJ0VGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5jb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJLy8gZm9yIGltcGxpY2l0IHRhZwotCQlFbGVtZW50SW1wbCBvbGRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBlbGVtZW50OwotCQlpZiAoY2FuQmVJbXBsaWNpdFRhZyhvbGRFbGVtZW50KSkgewotCQkJTm9kZSBuZXdQYXJlbnQgPSBudWxsOwotCQkJTm9kZSBwcmV2ID0gb2xkRWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmIChwcmV2ICE9IG51bGwgJiYgcHJldi5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudEltcGwgcHJldkVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHByZXY7Ci0JCQkJaWYgKCFwcmV2RWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQlpZiAocHJldkVsZW1lbnQuaGFzU3RhcnRUYWcoKSB8fCBwcmV2RWxlbWVudC5tYXRjaFRhZ05hbWUob2xkRWxlbWVudC5nZXRUYWdOYW1lKCkpKSB7Ci0JCQkJCQluZXdQYXJlbnQgPSBwcmV2RWxlbWVudDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCkgewotCQkJCS8vIHRoaXMgZWxlbWVudCBzaG91bGQgc3RheSBhcyBpbXBsaWNpdCB0YWcKLQkJCQkvLyBqdXN0IHJlbW92ZSBhbGwgYXR0cmlidXRlcwotCQkJCW9sZEVsZW1lbnQucmVtb3ZlU3RhcnRUYWcoKTsKLQotCQkJCS8vIHVwZGF0ZSBjb250ZXh0Ci0JCQkJTm9kZSBjaGlsZCA9IG9sZEVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQkJfQotCQkJCWVsc2UgaWYgKG9sZEVsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUob2xkRWxlbWVudCk7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQkJfQotCQkvLyBmb3IgY29tbWVudCB0YWcKLQkJaWYgKG9sZEVsZW1lbnQuaXNDb21tZW50VGFnKCkpCi0JCQlvbGRFbGVtZW50LnJlbW92ZVN0YXJ0VGFnKCk7Ci0KLQkJLy8gcHJvbW90ZSBjaGlsZHJlbgotCQlOb2RlIGVsZW1lbnRQYXJlbnQgPSBlbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJTm9kZSBwYXJlbnQgPSBlbGVtZW50UGFyZW50OwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCU5vZGUgZmlyc3QgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJTm9kZSBmaXJzdEVsZW1lbnQgPSBudWxsOyAvLyBmb3IgdGhlIGNhc2UgZmlyc3QgaXMgcmVtb3ZlZCBhcyBlbmQKLQkJLy8gdGFnCi0JCWlmIChmaXJzdCAhPSBudWxsKSB7Ci0JCQkvLyBmaW5kIG5ldyBwYXJlbnQgZm9yIGNoaWxkcmVuCi0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gbnVsbDsKLQkJCWZvciAoTm9kZSBsYXN0ID0gZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCWJyZWFrOwotCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCX0KLQkJCU5vZGUgbmV4dCA9IGZpcnN0OwotCQkJaWYgKG5ld0VsZW1lbnQgIT0gbnVsbCkgewotCQkJCXdoaWxlIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJaWYgKCFuZXdFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5ld0VsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJCUVsZW1lbnRJbXBsIG5leHRFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJCQkJaWYgKCFuZXh0RWxlbWVudC5oYXNTdGFydFRhZygpICYmIG5leHRFbGVtZW50Lmhhc0VuZFRhZygpICYmIG5leHRFbGVtZW50Lm1hdGNoRW5kVGFnKG5ld0VsZW1lbnQpKSB7Ci0JCQkJCQkJLy8gc3RvcCBhdCB0aGUgbWF0Y2hlZCBpbnZhbGlkIGVuZCB0YWcKLQkJCQkJCQlOb2RlIGVsZW1lbnRDaGlsZCA9IG5leHRFbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCQl3aGlsZSAoZWxlbWVudENoaWxkICE9IG51bGwpIHsKLQkJCQkJCQkJTm9kZSBuZXh0Q2hpbGQgPSBlbGVtZW50Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJbmV4dEVsZW1lbnQucmVtb3ZlQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJbmV3RWxlbWVudC5hcHBlbmRDaGlsZChlbGVtZW50Q2hpbGQpOwotCQkJCQkJCQllbGVtZW50Q2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQkJCQkJfQotCi0JCQkJCQkJbmV4dCA9IG5leHRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJZWxlbWVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJbmV3RWxlbWVudC5hZGRFbmRUYWcobmV4dEVsZW1lbnQpOwotCQkJCQkJCWlmIChuZXh0RWxlbWVudCA9PSBmaXJzdCkKLQkJCQkJCQkJZmlyc3RFbGVtZW50ID0gbmV3RWxlbWVudDsKLQotCQkJCQkJCU5vZGUgbmV3UGFyZW50ID0gbmV3RWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gbnVsbCB8fCBuZXdQYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJCWNvbnRpbnVlOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWlmICghY2FuQ29udGFpbihuZXdFbGVtZW50LCBuZXh0KSkgewotCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCWlmIChuZXdQYXJlbnQgPT0gcGFyZW50KQotCQkJCQkJCWJyZWFrOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCWJyZWFrOyAvLyBlcnJvcgotCQkJCQkJbmV3RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV3UGFyZW50OwotCQkJCQkJY29udGludWU7Ci0JCQkJCX0KLQkJCQkJTm9kZSBjaGlsZCA9IG5leHQ7Ci0JCQkJCW5leHQgPSBuZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWVsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQkJbmV3RWxlbWVudCA9IG51bGw7Ci0JCQl9Ci0JCQlpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQl9Ci0JCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJaWYgKG5ld0VsZW1lbnQgPT0gbnVsbCB8fCBjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCU5vZGUgY2hpbGQgPSBuZXh0OwotCQkJCQluZXh0ID0gbmV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQllbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgZWxlbWVudCk7Ci0JCQkJCWNvbnRpbnVlOwotCQkJCX0KLQotCQkJCXBhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCWlmIChwYXJlbnQgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJLy8gcHJvbW90ZSBzaWJsaW5ncwotCQkJCU5vZGUgbmV3TmV4dCA9IG5ld0VsZW1lbnQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlOb2RlIGNoaWxkID0gZWxlbWVudDsKLQkJCQl3aGlsZSAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQlOb2RlIG5leHRDaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCW5ld0VsZW1lbnQucmVtb3ZlQ2hpbGQoY2hpbGQpOwotCQkJCQlwYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXdOZXh0KTsKLQkJCQkJY2hpbGQgPSBuZXh0Q2hpbGQ7Ci0JCQkJfQotCi0JCQkJLy8gbGVhdmUgdGhlIG9sZCBlbmQgdGFnIHdoZXJlIGl0IGlzCi0JCQkJaWYgKG5ld0VsZW1lbnQuaGFzRW5kVGFnKCkpIHsKLQkJCQkJRWxlbWVudCBlbmQgPSBuZXdFbGVtZW50LnJlbW92ZUVuZFRhZygpOwotCQkJCQlpZiAoZW5kICE9IG51bGwpIHsKLQkJCQkJCXBhcmVudC5pbnNlcnRCZWZvcmUoZW5kLCBuZXdOZXh0KTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoIW5ld0VsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQkvLyBpbXBsaWNpdCBlbGVtZW50Ci0JCQkJCWlmICghbmV3RWxlbWVudC5oYXNDaGlsZE5vZGVzKCkpIHsKLQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXdFbGVtZW50KTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQluZXdFbGVtZW50ID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlOb2RlIG5ld05leHQgPSBlbGVtZW50OwotCQlOb2RlIHN0YXJ0RWxlbWVudCA9IG51bGw7IC8vIGZvciB0aGUgY2FzZSBlbGVtZW50IGlzIHJlbW92ZWQgYXMgZW5kCi0JCS8vIHRhZwotCQlpZiAob2xkRWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJLy8gZmluZCBuZXcgcGFyZW50IGZvciBpbnZhbGlkIGVuZCB0YWcgYW5kIHNpYmxpbmdzCi0JCQlFbGVtZW50SW1wbCBuZXdFbGVtZW50ID0gbnVsbDsKLQkJCWZvciAoTm9kZSBsYXN0ID0gZWxlbWVudC5nZXRQcmV2aW91c1NpYmxpbmcoKTsgbGFzdCAhPSBudWxsOyBsYXN0ID0gbGFzdC5nZXRMYXN0Q2hpbGQoKSkgewotCQkJCWlmIChsYXN0LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCWJyZWFrOwotCQkJCUVsZW1lbnRJbXBsIGxhc3RFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBsYXN0OwotCQkJCWlmIChsYXN0RWxlbWVudC5oYXNFbmRUYWcoKSB8fCBsYXN0RWxlbWVudC5pc0VtcHR5VGFnKCkgfHwgIWxhc3RFbGVtZW50LmlzQ29udGFpbmVyKCkpCi0JCQkJCWJyZWFrOwotCQkJCW5ld0VsZW1lbnQgPSBsYXN0RWxlbWVudDsKLQkJCX0KLQkJCWlmIChuZXdFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkvLyBkZW1vdGUgaW52YWxpZCBlbmQgdGFnIGFuZCBzaWJsaW5nCi0JCQkJTm9kZSBuZXh0ID0gZWxlbWVudDsKLQkJCQl3aGlsZSAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCWlmICghbmV3RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXdFbGVtZW50Lmhhc1N0YXJ0VGFnKCkgJiYgbmV4dC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50SW1wbCBuZXh0RWxlbWVudCA9IChFbGVtZW50SW1wbCkgbmV4dDsKLQkJCQkJCWlmICghbmV4dEVsZW1lbnQuaGFzU3RhcnRUYWcoKSAmJiBuZXh0RWxlbWVudC5oYXNFbmRUYWcoKSAmJiBuZXh0RWxlbWVudC5tYXRjaEVuZFRhZyhuZXdFbGVtZW50KSkgewotCQkJCQkJCS8vIHN0b3AgYXQgdGhlIG1hdGNoZWQgaW52YWxpZCBlbmQgdGFnCi0JCQkJCQkJTm9kZSBlbGVtZW50Q2hpbGQgPSBuZXh0RWxlbWVudC5nZXRGaXJzdENoaWxkKCk7Ci0JCQkJCQkJd2hpbGUgKGVsZW1lbnRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQkJCU5vZGUgbmV4dENoaWxkID0gZWxlbWVudENoaWxkLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJCW5leHRFbGVtZW50LnJlbW92ZUNoaWxkKGVsZW1lbnRDaGlsZCk7Ci0JCQkJCQkJCW5ld0VsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudENoaWxkKTsKLQkJCQkJCQkJZWxlbWVudENoaWxkID0gbmV4dENoaWxkOwotCQkJCQkJCX0KLQotCQkJCQkJCW5leHQgPSBuZXh0RWxlbWVudC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChuZXh0RWxlbWVudCk7Ci0JCQkJCQkJbmV3RWxlbWVudC5hZGRFbmRUYWcobmV4dEVsZW1lbnQpOwotCQkJCQkJCWlmIChuZXh0RWxlbWVudCA9PSBuZXdOZXh0KQotCQkJCQkJCQlzdGFydEVsZW1lbnQgPSBuZXdFbGVtZW50OwotCi0JCQkJCQkJTm9kZSBuZXdQYXJlbnQgPSBuZXdFbGVtZW50LmdldFBhcmVudE5vZGUoKTsKLQkJCQkJCQlpZiAobmV3UGFyZW50ID09IHBhcmVudCkKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBudWxsIHx8IG5ld1BhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQkJCQlicmVhazsgLy8gZXJyb3IKLQkJCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQkJY29udGludWU7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJaWYgKCFjYW5Db250YWluKG5ld0VsZW1lbnQsIG5leHQpKSB7Ci0JCQkJCQlOb2RlIG5ld1BhcmVudCA9IG5ld0VsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJCQkJaWYgKG5ld1BhcmVudCA9PSBwYXJlbnQpCi0JCQkJCQkJYnJlYWs7Ci0JCQkJCQlpZiAobmV3UGFyZW50ID09IG51bGwgfHwgbmV3UGFyZW50LmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJCQkJYnJlYWs7IC8vIGVycm9yCi0JCQkJCQluZXdFbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXdQYXJlbnQ7Ci0JCQkJCQljb250aW51ZTsKLQkJCQkJfQotCQkJCQlOb2RlIGNoaWxkID0gbmV4dDsKLQkJCQkJbmV4dCA9IG5leHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKLQkJCQkJaWYgKGNoaWxkID09IG9sZEVsZW1lbnQpIHsKLQkJCQkJCWlmICghb2xkRWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJCQkJCS8vIGNsb25lIChyZS1jcmVhdGUpIGVuZCB0YWcKLQkJCQkJCQlFbGVtZW50IGVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCQkJaWYgKGVuZCAhPSBudWxsKSB7Ci0JCQkJCQkJCWNoaWxkID0gZW5kOwotCQkJCQkJCQluZXdOZXh0ID0gZW5kOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQluZXdFbGVtZW50LmFwcGVuZENoaWxkKGNoaWxkKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoIW9sZEVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCQkJLy8gY2xvbmUgKHJlLWNyZWF0ZSkgZW5kIHRhZwotCQkJCQlFbGVtZW50IGVuZCA9IG9sZEVsZW1lbnQucmVtb3ZlRW5kVGFnKCk7Ci0JCQkJCWlmIChlbmQgIT0gbnVsbCkgewotCQkJCQkJcGFyZW50Lmluc2VydEJlZm9yZShlbmQsIG9sZEVsZW1lbnQpOwotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG9sZEVsZW1lbnQpOwotCQkJCQkJbmV3TmV4dCA9IGVuZDsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCW5ld05leHQgPSBvbGRFbGVtZW50LmdldE5leHRTaWJsaW5nKCk7Ci0JCQlwYXJlbnQucmVtb3ZlQ2hpbGQob2xkRWxlbWVudCk7Ci0JCX0KLQotCQkvLyB1cGRhdGUgY29udGV4dAotCQlOb2RlIG9sZFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCU5vZGUgb2xkTmV4dCA9IHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlpZiAoZWxlbWVudCA9PSBvbGRQYXJlbnQpIHsKLQkJCWlmIChvbGROZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUob2xkTmV4dCk7IC8vIHJlc2V0IGZvciBuZXcgcGFyZW50Ci0JCQl9Ci0JCQllbHNlIGlmIChuZXdOZXh0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV3TmV4dCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShwYXJlbnQpOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKGVsZW1lbnQgPT0gb2xkTmV4dCkgewotCQkJaWYgKGZpcnN0RWxlbWVudCAhPSBudWxsKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUoZmlyc3RFbGVtZW50KTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZpcnN0ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoZmlyc3QpOwotCQkJfQotCQkJZWxzZSBpZiAoc3RhcnRFbGVtZW50ICE9IG51bGwpIHsKLQkJCQl0aGlzLmNvbnRleHQuc2V0UGFyZW50Tm9kZShzdGFydEVsZW1lbnQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKG5ld05leHQpOwotCQkJfQotCQl9Ci0KLQkJcmVtb3ZlSW1wbGljaXRFbGVtZW50KGVsZW1lbnRQYXJlbnQpOwotCX0KLQotCS8qKgotCSAqIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBtZXRob2QKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCU5vZGVJbXBsIG5leHQgPSAoTm9kZUltcGwpIHRoaXMuY29udGV4dC5nZXROZXh0Tm9kZSgpOwotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQlzaG9ydCBub2RlVHlwZSA9IG5leHQuZ2V0Tm9kZVR5cGUoKTsKLQkJCWlmIChub2RlVHlwZSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJcmVtb3ZlTm9kZShuZXh0KTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAobm9kZVR5cGUgIT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJCQl9Ci0JCQkJaWYgKGZsYXROb2RlID09IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBmb3IgZW1wdHkgVGV4dAotCQkJCQkvLyByZW1vdmUgYW5kIGNvbnRpbnVlCi0JCQkJCXJlbW92ZU5vZGUobmV4dCk7Ci0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5leHQ7Ci0JCQkJYm9vbGVhbiBpc1NoYXJlZCA9IHRleHQuaXNTaGFyaW5nU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJaWYgKGlzU2hhcmVkKSB7Ci0JCQkJCS8vIG1ha2Ugc3VyZSB0aGVyZSBpcyBuZXh0IFRleHQgbm9kZSBzaGFyaW5nIHRoaXMKLQkJCQkJVGV4dEltcGwgbmV4dFRleHQgPSAoVGV4dEltcGwpIHRoaXMuY29udGV4dC5maW5kTmV4dFRleHQoKTsKLQkJCQkJaWYgKG5leHRUZXh0ID09IG51bGwgfHwgIW5leHRUZXh0Lmhhc1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkJCQlpc1NoYXJlZCA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJCW9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRleHQucmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWlmICh0ZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBwYXJ0aWFsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMKLQkJCQkJLy8gcmVtb3ZlZAotCQkJCQlyZW1vdmVOb2RlKHRleHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCQkJdGV4dC5ub3RpZnlWYWx1ZUNoYW5nZWQoKTsKLQkJCQl9Ci0JCQkJLy8gaWYgc2hhcmVkLCBjb250aW51ZSB0byByZW1vdmUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCQkJCS8vIGZyb20gdGhlbQotCQkJCWlmIChpc1NoYXJlZCkKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBuZXh0OwotCQkJaWYgKGVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJCX0KLQkJCQlpZiAoZWxlbWVudC5oYXNFbmRUYWcoKSB8fCBlbGVtZW50Lmhhc0NoaWxkTm9kZXMoKSkgewotCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCQlyZW1vdmVTdGFydFRhZyhlbGVtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJTm9kZSBjaGlsZCA9IGVsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShjaGlsZCk7Ci0JCQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCi0JCQkJaWYgKCFlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkJCS8vIGltcGxpY2l0IGVsZW1lbnQKLQkJCQkJcmVtb3ZlTm9kZShlbGVtZW50KTsKLQkJCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZWxlbWVudC5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQlpZiAoZmxhdE5vZGUgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCXJlbW92ZU5vZGUoZWxlbWVudCk7Ci0JCQl9Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlOb2RlIHBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgPT0gbnVsbCB8fCBwYXJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJdGhyb3cgbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbk1hbmFnZW1lbnRFeGNlcHRpb24oKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVuZCA9IChFbGVtZW50SW1wbCkgcGFyZW50OwotCQlpZiAoZW5kLmhhc0VuZFRhZygpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gZW5kLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlICE9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCQlpZiAoIWVuZC5oYXNTdGFydFRhZygpICYmICFlbmQuaGFzQ2hpbGROb2RlcygpKSB7Ci0JCQkJdGhpcy5jb250ZXh0LnNldE5leHROb2RlKGVuZCk7Ci0JCQkJcmVtb3ZlTm9kZShlbmQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZW5kLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihudWxsKTsKLQkJCQlyZW1vdmVFbmRUYWcoZW5kKTsKLQkJCX0KLQkJCXJldHVybjsKLQkJfQotCi0JCW5leHQgPSAoTm9kZUltcGwpIGVuZC5nZXROZXh0U2libGluZygpOwotCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dCk7Ci0JCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCXBhcmVudCA9IGVuZC5nZXRQYXJlbnROb2RlKCk7Ci0JCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocGFyZW50KTsKLQkJCXJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJcmV0dXJuOwotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZVJlZ2lvbnMgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG5ld1JlZ2lvbnMKLQkgKiAgICAgICAgICAgIGphdmEudXRpbC5WZWN0b3IKLQkgKiBAcGFyYW0gb2xkUmVnaW9ucwotCSAqICAgICAgICAgICAgamF2YS51dGlsLlZlY3RvcgotCSAqLwotCXZvaWQgcmVwbGFjZVJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb25MaXN0IG5ld1JlZ2lvbnMsIElUZXh0UmVnaW9uTGlzdCBvbGRSZWdpb25zKSB7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQkvLyBvcHRpbWl6ZSB0eXBpY2FsIGNhc2VzCi0JCVN0cmluZyByZWdpb25UeXBlID0gU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVXRpbC5nZXRGaXJzdFJlZ2lvblR5cGUoZmxhdE5vZGUpOwotCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJY2hhbmdlU3RhcnRUYWcoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQljaGFuZ2VFbmRUYWcoZmxhdE5vZGUsIG5ld1JlZ2lvbnMsIG9sZFJlZ2lvbnMpOwotCQl9Ci0JCWVsc2UgewotCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIHJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIG1ldGhvZAotCSAqIAotCSAqLwotCXZvaWQgcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlpZiAodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCXRoaXMuY29udGV4dCA9IG5ldyBYTUxNb2RlbENvbnRleHQodGhpcy5tb2RlbC5nZXREb2N1bWVudCgpKTsKLQotCQlpbnQgbmV3Q291bnQgPSAobmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsID8gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSA6IDApOwotCQlpbnQgb2xkQ291bnQgPSAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyAhPSBudWxsID8gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5nZXRMZW5ndGgoKSA6IDApOwotCi0JCWlmIChvbGRDb3VudCA+IDApIHsKLQkJCXNldHVwQ29udGV4dChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLml0ZW0oMCkpOwotCQkJLy8gTm9kZSBzdGFydFBhcmVudCA9IHRoaXMuY29udGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCUVudW1lcmF0aW9uIGUgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zLmVsZW1lbnRzKCk7Ci0JCQl3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgZS5uZXh0RWxlbWVudCgpOwotCQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKG5ld0NvdW50ID09IDApCi0JCQkJcmV0dXJuOwotCQkJc2V0dXBDb250ZXh0KG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuaXRlbSgwKSk7Ci0JCX0KLQkJLy8gbWFrZSBzdXJlIHRoZSBwYXJlbnQgaXMgc2V0IHRvIGRlZXBlc3QgbGV2ZWwKLQkJLy8gd2hlbiBlbmQgdGFnIGhhcyBiZWVuIHJlbW92ZWQKLQkJdGhpcy5jb250ZXh0LnNldExhc3QoKTsKLQotCQlpZiAobmV3Q291bnQgPiAwKSB7Ci0JCQlFbnVtZXJhdGlvbiBlID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCX0KLQkJfQotCi0JCWNsZWFudXBUZXh0KCk7Ci0JCWNsZWFudXBFbmRUYWcoKTsKLQl9Ci0KLQkvKioKLQkgKiBzZXR1cENvbnRleHQgbWV0aG9kCi0JICogCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldHVwQ29udGV4dChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWludCBvZmZzZXQgPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCXJldHVybjsKLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5jb250ZXh0LmdldFJvb3ROb2RlKCk7Ci0JCWlmIChyb290ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKG9mZnNldCA9PSAwKSB7Ci0JCQkvLyBhdCB0aGUgYmVnZ2luaW5nIG9mIGRvY3VtZW50Ci0JCQlOb2RlIGNoaWxkID0gcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0JCQlpZiAoY2hpbGQgIT0gbnVsbCkKLQkJCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJZWxzZQotCQkJCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKHJvb3QpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJTm9kZUltcGwgbm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXROb2RlQXQob2Zmc2V0KTsKLQkJaWYgKG5vZGUgPT0gbnVsbCkgewotCQkJLy8gbWlnaHQgYmUgYXQgdGhlIGVuZCBvZiBkb2N1bWVudAotCQkJdGhpcy5jb250ZXh0LnNldFBhcmVudE5vZGUocm9vdCk7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKG9mZnNldCA9PSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkpIHsKLQkJCXRoaXMuY29udGV4dC5zZXROZXh0Tm9kZShub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG5vZGU7Ci0JCQlUZXh0IG5leHRUZXh0ID0gdGV4dC5zcGxpdFRleHQoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJLy8gbm90aWZ5IHRoZSBjaGFuZ2UKLQkJCXRleHQubm90aWZ5VmFsdWVDaGFuZ2VkKCk7Ci0JCQlpZiAobmV4dFRleHQgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIGVycm9yCi0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUobmV4dFRleHQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKG9mZnNldCA+PSAoKE5vZGVJbXBsKSBjaGlsZCkuZ2V0RW5kT2Zmc2V0KCkpCi0JCQkJY29udGludWU7Ci0JCQl0aGlzLmNvbnRleHQuc2V0TmV4dE5vZGUoY2hpbGQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCXRoaXMuY29udGV4dC5zZXRQYXJlbnROb2RlKG5vZGUpOwotCQl0aGlzLmNvbnRleHQuc2V0TGFzdCgpOwotCX0KLQotCXByb3RlY3RlZCBYTUxNb2RlbENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLQkJcmV0dXJuIGNvbnRleHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9kb2N1bWVudC9YTUxNb2RlbFVwZGF0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNiYmMyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2RvY3VtZW50L1hNTE1vZGVsVXBkYXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JU291cmNlR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBYTUxNb2RlbFVwZGF0ZXIgY2xhc3MKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsVXBkYXRlciB7Ci0JcHJpdmF0ZSBpbnQgZGlmZiA9IDA7Ci0JcHJpdmF0ZSBpbnQgZ2FwTGVuZ3RoID0gMDsKLQlwcml2YXRlIGludCBnYXBPZmZzZXQgPSAwOwotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByaXZhdGUgSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBudWxsOwotCXByaXZhdGUgRE9NTW9kZWxJbXBsIG1vZGVsID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIG5leHROb2RlID0gbnVsbDsKLQlwcml2YXRlIE5vZGVJbXBsIHBhcmVudE5vZGUgPSBudWxsOwotCi0JcHJvdGVjdGVkIFhNTE1vZGVsVXBkYXRlcihET01Nb2RlbEltcGwgbW9kZWwpIHsKLQkJc3VwZXIoKTsKLQotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQkJdGhpcy5nZW5lcmF0b3IgPSBtb2RlbC5nZXRHZW5lcmF0b3IoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0ck5hbWUoQXR0ciBhdHRyTm9kZSkgewotCQlpZiAoYXR0ck5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlBdHRySW1wbCBhdHRyID0gKEF0dHJJbXBsKSBhdHRyTm9kZTsKLQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgYXR0ci5nZXRPd25lckVsZW1lbnQoKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAoZWxlbWVudC5pc0NvbW1lbnRUYWcoKSkgewotCQkJY2hhbmdlU3RhcnRUYWcoZWxlbWVudCk7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgc3RhcnQgPSBvZmZzZXQ7Ci0JCWludCBlbmQgPSBvZmZzZXQ7Ci0KLQkJU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJaWYgKG5hbWUgPT0gbnVsbCkKLQkJCW5hbWUgPSBuZXcgU3RyaW5nKCk7Ci0JCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJaWYgKG5hbWVSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJc3RhcnQgKz0gbmFtZVJlZ2lvbi5nZXRTdGFydCgpOwotCQkvLyB1c2UgZ2V0VGV4dEVuZCgpIGJlY2F1c2UgZ2V0RW5kKCkgbWF5IGluY2x1ZGUgdGhlIHRhaWxpbmcgc3BhY2VzCi0JCWVuZCArPSBuYW1lUmVnaW9uLmdldFRleHRFbmQoKTsKLQotCQlyZXBsYWNlU291cmNlKG5hbWUsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5nZUF0dHJWYWx1ZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ck5vZGUKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlQXR0clZhbHVlKEF0dHIgYXR0ck5vZGUpIHsKLQkJaWYgKGF0dHJOb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0ck5vZGU7Ci0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIGF0dHIuZ2V0T3duZXJFbGVtZW50KCk7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJaWYgKGVsZW1lbnQuaXNDb21tZW50VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IG9mZnNldCA9IGVsZW1lbnQuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCi0JCVN0cmluZyB2YWx1ZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHZhbHVlUmVnaW9uID0gYXR0ci5nZXRWYWx1ZVJlZ2lvbigpOwotCQlpZiAodmFsdWVSZWdpb24gIT0gbnVsbCkgewotCQkJY2hhciBxdW90ZSA9IDA7IC8vIG5vIHF1b3RlIHByZWZlcmVuY2UKLQkJCS8vIERXOiA0LzE2LzIwMDMgZHVlIHRvIGNoYW5nZSBpbiBzdHJ1Y3R1cmVkRG9jdW1lbnQgLi4uIHdlIG5lZWQgYQotCQkJLy8gZmxhdG5vZGUgdG8KLQkJCS8vIGdldCBhdCByZWdpb24gdmFsdWVzLiBGb3Igbm93IEknbGwgYXNzdW1lIHRoaXMgaXMgYWx3YXlzIHRoZQotCQkJLy8gZmlyc3QKLQkJCS8vIGZsYXRub2RlIC4uIG1heSBuZWVkIHRvIG1ha2Ugc21hcnRlciBsYXRlciAoZS5nLiB0byBzZWFyY2ggZm9yCi0JCQkvLyB0aGUgZmxhdG5vZGUgdGhhdCB0aGlzLnZhbHVlUmVnaW9uIGJlbG9uZ3MgdG8uCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGRvY3VtZW50UmVnaW9uID0gZWxlbWVudC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJU3RyaW5nIG9sZFZhbHVlID0gZG9jdW1lbnRSZWdpb24uZ2V0VGV4dCh2YWx1ZVJlZ2lvbik7Ci0JCQlpZiAob2xkVmFsdWUgIT0gbnVsbCAmJiBvbGRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQljaGFyIGZpcnN0Q2hhciA9IG9sZFZhbHVlLmNoYXJBdCgwKTsKLQkJCQlpZiAoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgewotCQkJCQlxdW90ZSA9IGZpcnN0Q2hhcjsKLQkJCQl9Ci0JCQl9Ci0KLQkJCUlUZXh0UmVnaW9uIHN0YXJ0UmVnaW9uID0gdmFsdWVSZWdpb247Ci0KLQkJCXZhbHVlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0ciwgcXVvdGUpOwotCQkJaWYgKHZhbHVlID09IG51bGwpIHsKLQkJCQl2YWx1ZSA9IG5ldyBTdHJpbmcoKTsKLQkJCQkvLyByZW1vdmUgZXF1YWwgdG9vCi0JCQkJSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBhdHRyLmdldEVxdWFsUmVnaW9uKCk7Ci0JCQkJaWYgKGVxdWFsUmVnaW9uICE9IG51bGwpCi0JCQkJCXN0YXJ0UmVnaW9uID0gZXF1YWxSZWdpb247Ci0JCQl9Ci0JCQlhdHRyLnNldFZhbHVlUmVnaW9uKHZhbHVlUmVnaW9uKTsgLy8gcmVzZXQgdmFsdWUKLQotCQkJc3RhcnQgKz0gc3RhcnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUgdGFpbGluZwotCQkJLy8gc3BhY2VzCi0JCQllbmQgKz0gdmFsdWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQl9Ci0JCWVsc2UgewotCQkJSVRleHRSZWdpb24gZXF1YWxSZWdpb24gPSBhdHRyLmdldEVxdWFsUmVnaW9uKCk7Ci0KLQkJCXZhbHVlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUoYXR0cik7Ci0JCQlpZiAodmFsdWUgPT0gbnVsbCkgewotCQkJCWlmIChlcXVhbFJlZ2lvbiA9PSBudWxsKQotCQkJCQlyZXR1cm47IC8vIG5vdGhuZyB0byBkbwotCQkJCXZhbHVlID0gbmV3IFN0cmluZygpOwotCQkJCS8vIHJlbW92ZSBlcXVhbAotCQkJCXN0YXJ0ICs9IGVxdWFsUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJZW5kICs9IGVxdWFsUmVnaW9uLmdldFRleHRFbmQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChlcXVhbFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCS8vIHVzZSBnZXRUZXh0RW5kKCkgYmVjYXVzZSBnZXRFbmQoKSBtYXkgaW5jbHVkZSB0aGUKLQkJCQkJLy8gdGFpbGluZyBzcGFjZXMKLQkJCQkJc3RhcnQgKz0gZXF1YWxSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCQkJCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKQotCQkJCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCQkvLyB1c2UgZ2V0VGV4dEVuZCgpIGJlY2F1c2UgZ2V0RW5kKCkgbWF5IGluY2x1ZGUgdGhlCi0JCQkJCS8vIHRhaWxpbmcgc3BhY2VzCi0JCQkJCXN0YXJ0ICs9IG5hbWVSZWdpb24uZ2V0VGV4dEVuZCgpOwotCQkJCQl2YWx1ZSA9ICc9JyArIHZhbHVlOwotCQkJCX0KLQkJCQllbmQgPSBzdGFydDsKLQkJCX0KLQkJfQotCi0JCXJlcGxhY2VTb3VyY2UodmFsdWUsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqLwotCXZvaWQgY2hhbmdlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCWlmIChzb3VyY2UgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IGxlbmd0aCA9IHNvdXJjZS5sZW5ndGgoKTsKLQkJaWYgKGxlbmd0aCA9PSAwKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0JCWludCBvZmZzZXQgPSBpbXBsLmdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQkJaWYgKGltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCWVuZCA9IGltcGwuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGltcGwuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpbXBsLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpKTsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQkvKioKLQkgKiBjaGFuZ2VOYW1lIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGFuZ2VOYW1lKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZ2V0U3RydWN0dXJlZERvY3VtZW50KCkgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBzdXBwb3J0IGNoYW5naW5nIG5hbWUgb2YgYXR0cmlidXRlIGZvciBzZXRQcmVmaXgoKQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuQVRUUklCVVRFX05PREUpIHsKLQkJCWNoYW5nZUF0dHJOYW1lKChBdHRyKSBub2RlKTsKLQkJCXJldHVybjsKLQkJfQotCi0JCS8vIG5vdCBzdXBwb3J0ZWQKLQkJcmV0dXJuOwotCX0KLQotCXZvaWQgY2hhbmdlUmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvLyBmdXR1cmVfVE9ETzogb3B0aW1pemUKLQotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IHJvb3Q7Ci0JCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCXJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIoZmxhdE5vZGUuZ2V0RW5kKCkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBmYWxsYmFjayBtZXRob2QgdG8gcmVnZW5lcmF0ZSB0aGUgc3RhcnQgdGFnLgotCSAqLwotCXZvaWQgY2hhbmdlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUVsZW1lbnRJbXBsIGltcGwgPSAoRWxlbWVudEltcGwpIGVsZW1lbnQ7Ci0KLQkJaWYgKCFpbXBsLmhhc1N0YXJ0VGFnKCkgJiYgIWltcGwuaGFzRW5kVGFnKCkpIHsKLQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MKLQkJCU5vZGUgcGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwpIHsKLQkJCQlyZXBsYWNlQ2hpbGQocGFyZW50LCBlbGVtZW50LCBlbGVtZW50KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQkvLyBlbHNlIGVycm9yCi0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTdGFydFRhZyhlbGVtZW50KTsKLQkJaWYgKHNvdXJjZSA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgbGVuZ3RoID0gc291cmNlLmxlbmd0aCgpOwotCQlpZiAobGVuZ3RoID09IDApCi0JCQlyZXR1cm47Ci0KLQkJaW50IG9mZnNldCA9IGltcGwuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJaW50IHN0YXJ0ID0gb2Zmc2V0OwotCQlpbnQgZW5kID0gb2Zmc2V0OwotCQlpZiAoaW1wbC5oYXNTdGFydFRhZygpKSB7Ci0JCQllbmQgPSBpbXBsLmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGltcGwuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJfQotCQlpbXBsLnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCkpOwotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBvbGRPZmZzZXQgPSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJaW50IG9sZEVuZCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJYm9vbGVhbiBpc0VuZFRhZyA9IGZhbHNlOwotCi0JCS8vIGZpbmQgb3duZXIgbm9kZQotCQlOb2RlSW1wbCBvd25lck5vZGUgPSBudWxsOwotCQl3aGlsZSAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLm5leHROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaWYgKG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW50IG5leHRPZmZzZXQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChuZXh0T2Zmc2V0ID09IG9sZE9mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIHRoaXMubmV4dE5vZGU7Ci0JCQkJCQlpZiAodGV4dC5oYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJCQkJCW93bmVyTm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCQkJYnJlYWs7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgbmV4dEVuZCA9IG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJCQlpZiAobmV4dE9mZnNldCA8IG9sZEVuZCAmJiBuZXh0RW5kID4gb2xkT2Zmc2V0KSB7Ci0JCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSBjaGlsZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5uZXh0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAodGhpcy5wYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBlbGVtZW50LmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJCQlpZiAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJaW50IGVuZE9mZnNldCA9IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJCQlpZiAoZW5kT2Zmc2V0ID09IG9sZE9mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5wYXJlbnROb2RlOwotCQkJCQkJaXNFbmRUYWcgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBvd25lck5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBvd25lck5vZGU7Ci0JCQlpZiAoaXNFbmRUYWcpIHsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJZWxlbWVudC5zZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXVwZGF0ZUF0dHJSZWdpb25zKGVsZW1lbnQsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCVRleHRJbXBsIHRleHQgPSAoVGV4dEltcGwpIG93bmVyTm9kZTsKLQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJaW50IG5ld09mZnNldCA9IG9sZE9mZnNldDsKLQkJCQlpbnQgbmV3RW5kID0gb2xkRW5kOwotCQkJCWlmIChvbGRPZmZzZXQgPT0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJbmV3T2Zmc2V0ICs9IHRoaXMuZGlmZjsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCW5ld0VuZCA9IHRoaXMuZ2FwT2Zmc2V0OwotCQkJCX0KLQkJCQlpbnQgbmV3TGVuZ3RoID0gbmV3RW5kIC0gbmV3T2Zmc2V0OwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG5ld09mZnNldCwgbmV3TGVuZ3RoLCBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJCQlpZiAob2xkRW5kID4gbmV3RW5kKSB7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJfQotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgZmxhdE5vZGU7Ci0JCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCWludCBlbmQgPSBvZmZzZXQgKyBwcm94eS5nZXRMZW5ndGgoKTsKLQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQlpZiAob2Zmc2V0ID09IG9sZE9mZnNldCAmJiBlbmQgPT0gb2xkRW5kKSB7Ci0JCQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYgKGVuZCA+IG9sZEVuZCkgewotCQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCXByb3h5LnNldE9mZnNldChvbGRFbmQpOwotCQkJCQkJCXByb3h5LnNldExlbmd0aChlbmQgLSBvbGRFbmQpOwotCQkJCQkJCWNvbnRhaW5lci5hcHBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ocHJveHkpOwotCQkJCQkJCXRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRhaW5lcik7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJldHVybjsKLQkJCQl9Ci0KLQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCXByb3h5LnNldE9mZnNldChvZmZzZXQgKyB0aGlzLmRpZmYpOwotCQkJCQllbmQgKz0gdGhpcy5kaWZmOwotCQkJCX0KLQkJCQlpZiAoZW5kIDwgb2xkRW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQlyZXR1cm47Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgZmxhdE5vZGU7Ci0JCQkJaW50IGNvdW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvdW50KCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250aW51ZTsgLy8gZXJyb3IKLQkJCQkJaWYgKGNvbnRlbnQgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlpbnQgbmV3T2Zmc2V0ID0gb2xkT2Zmc2V0OwotCQkJCQkJaW50IG5ld0VuZCA9IG9sZEVuZDsKLQkJCQkJCWlmIChvbGRPZmZzZXQgPT0gdGhpcy5nYXBPZmZzZXQpIHsKLQkJCQkJCQluZXdPZmZzZXQgKz0gdGhpcy5kaWZmOwotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJbmV3RW5kID0gdGhpcy5nYXBPZmZzZXQ7Ci0JCQkJCQl9Ci0JCQkJCQlpbnQgbmV3TGVuZ3RoID0gbmV3RW5kIC0gbmV3T2Zmc2V0OwotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkobmV3T2Zmc2V0LCBuZXdMZW5ndGgsIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCi0JCQkJCQlpZiAob2xkRW5kID4gbmV3RW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRleHQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQkJCQljaGFuZ2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQkJaW50IG9mZnNldCA9IHByb3h5LmdldE9mZnNldCgpOwotCQkJCQkJaW50IGVuZCA9IG9mZnNldCArIHByb3h5LmdldExlbmd0aCgpOwotCQkJCQkJaWYgKGVuZCA8PSBvbGRPZmZzZXQpCi0JCQkJCQkJY29udGludWU7Ci0JCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQkJCWlmIChvZmZzZXQgPT0gb2xkT2Zmc2V0ICYmIGVuZCA9PSBvbGRFbmQpIHsKLQkJCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWlmIChlbmQgPiBvbGRFbmQpIHsKLQkJCQkJCQkJCWNvbnRhaW5lci5pbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCQkJCXByb3h5LnNldE9mZnNldChvbGRFbmQpOwotCQkJCQkJCQkJcHJveHkuc2V0TGVuZ3RoKGVuZCAtIG9sZEVuZCk7Ci0JCQkJCQkJCX0KLQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQlwcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQotCQkJCQkJCQkJaWYgKGVuZCA8IG9sZEVuZCkgeyAvLyB0byBiZSBzaGFyZWQKLQkJCQkJCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQkJCQkJY2hhbmdlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuOwotCQkJCQkJfQotCi0JCQkJCQlpZiAob2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0KSB7Ci0JCQkJCQkJcHJveHkuc2V0T2Zmc2V0KG9mZnNldCArIHRoaXMuZGlmZik7Ci0JCQkJCQkJZW5kICs9IHRoaXMuZGlmZjsKLQkJCQkJCX0KLQkJCQkJCWlmIChlbmQgPCBvbGRFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGV4dC5nZXROZXh0U2libGluZygpOwotCQkJCQkJCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlvd25lck5vZGUuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgY2hhbmdlVGV4dERhdGEoVGV4dCB0ZXh0KSB7Ci0JCWlmICh0ZXh0ID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU291cmNlKHRleHQpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0KLQkJVGV4dEltcGwgaW1wbCA9IChUZXh0SW1wbCkgdGV4dDsKLQkJaW50IHN0YXJ0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gaW1wbC5nZXRFbmRPZmZzZXQoKTsKLQkJaW50IG9mZnNldCA9IHN0YXJ0OwotCi0JCS8vIG1ha2Ugc3VyZSBwcmV2aW91cyB0YWcgaXMgY2xvc2VkCi0JCU5vZGUgcHJldiA9IHRleHQuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCWlmIChwcmV2ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVUYWcgPSBnZXRDbG9zZVRhZygoSURPTU5vZGUpIHByZXYpOwotCQkJaWYgKHByZVRhZyAhPSBudWxsICYmIHByZVRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQlvZmZzZXQgKz0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCXNvdXJjZSA9IHByZVRhZyArIHNvdXJjZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCU5vZGUgcGFyZW50ID0gdGV4dC5nZXRQYXJlbnROb2RlKCk7Ci0JCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnQ7Ci0JCQkJU3RyaW5nIHByZVRhZyA9IGdldFN0YXJ0Q2xvc2VUYWcoZWxlbWVudCk7Ci0JCQkJaWYgKHByZVRhZyAhPSBudWxsICYmIHByZVRhZy5sZW5ndGgoKSA+IDApIHsKLQkJCQkJb2Zmc2V0ICs9IHByZVRhZy5sZW5ndGgoKTsKLQkJCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJYnVmZmVyLmFwcGVuZChwcmVUYWcpOwotCQkJCQlidWZmZXIuYXBwZW5kKHNvdXJjZSk7Ci0JCQkJCWlmICh0ZXh0LmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCAmJiAhZWxlbWVudC5oYXNFbmRUYWcoKSAmJiAoZWxlbWVudC5pc0pTUENvbnRhaW5lcigpIHx8IGVsZW1lbnQuaXNDREFUQUNvbnRhaW5lcigpKSkgewotCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZW5kIHRhZwotCQkJCQkJU3RyaW5nIHBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCWlmIChwb3N0VGFnICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgcG9zdExlbmd0aCA9IHBvc3RUYWcubGVuZ3RoKCk7Ci0JCQkJCQkJaWYgKHBvc3RMZW5ndGggPiAwKSB7Ci0JCQkJCQkJCWJ1ZmZlci5hcHBlbmQocG9zdFRhZyk7Ci0JCQkJCQkJCWludCBwb3N0T2Zmc2V0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotCQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KHBvc3RPZmZzZXQsIHBvc3RMZW5ndGgpOwotCQkJCQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCi0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gaW1wbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQlpZiAobGVuZ3RoID4gMCkKLQkJCW5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCWltcGwuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqIGNoYW5nZVZhbHVlIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCBjaGFuZ2VWYWx1ZShOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGdldFN0cnVjdHVyZWREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSBub2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJY2hhbmdlVGV4dERhdGEoKFRleHQpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQljaGFuZ2VBdHRyVmFsdWUoKEF0dHIpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJY2hhbmdlU3RhcnRUYWcoKEVsZW1lbnQpIG5vZGUpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJU3RyaW5nIHNvdXJjZSA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlU291cmNlKG5vZGUpOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWludCBsZW5ndGggPSBzb3VyY2UubGVuZ3RoKCk7Ci0KLQkJTm9kZUltcGwgaW1wbCA9IChOb2RlSW1wbCkgbm9kZTsKLQkJaW50IHN0YXJ0ID0gaW1wbC5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgZW5kID0gaW1wbC5nZXRFbmRPZmZzZXQoKTsKLQotCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGltcGwuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQlpZiAobGVuZ3RoID4gMCkKLQkJCWZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KHN0YXJ0LCBsZW5ndGgpOwotCQlpbXBsLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0KLQkJcmVwbGFjZVNvdXJjZShzb3VyY2UsIHN0YXJ0LCBlbmQpOwotCX0KLQotCS8qKgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEF0dHJWYWx1ZUNsb3NlKElET01FbGVtZW50IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0TGFzdFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCB8fCByZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQlyZXR1cm4gbnVsbDsKLQkJU3RyaW5nIHZhbHVlID0gZmxhdE5vZGUuZ2V0VGV4dChyZWdpb24pOwotCQlpZiAodmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlpbnQgbGVuZ3RoID0gdmFsdWUubGVuZ3RoKCk7Ci0JCWlmIChsZW5ndGggPT0gMCkKLQkJCXJldHVybiBudWxsOwotCi0JCS8vIGNoZWNrIG9wZW4gSlNQIHRhZwotCQlib29sZWFuIGNsb3NlSlNQVGFnID0gZmFsc2U7Ci0JCWludCBvZmZzZXQgPSB2YWx1ZS5pbmRleE9mKEpTUFRhZy5UQUdfT1BFTik7Ci0JCXdoaWxlIChvZmZzZXQgPj0gMCkgewotCQkJb2Zmc2V0ID0gdmFsdWUuaW5kZXhPZihKU1BUYWcuVEFHX0NMT1NFLCBvZmZzZXQgKyAyKTsKLQkJCWlmIChvZmZzZXQgPCAwKSB7Ci0JCQkJY2xvc2VKU1BUYWcgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJb2Zmc2V0ID0gdmFsdWUuaW5kZXhPZihKU1BUYWcuVEFHX09QRU4sIG9mZnNldCArIDIpOwotCQl9Ci0KLQkJLy8gY2hlY2sgcXVvdGUKLQkJYm9vbGVhbiBjbG9zZVF1b3RlID0gZmFsc2U7Ci0JCWNoYXIgZmlyc3RDaGFyID0gdmFsdWUuY2hhckF0KDApOwotCQlpZiAoZmlyc3RDaGFyID09ICciJyB8fCBmaXJzdENoYXIgPT0gJ1wnJykgewotCQkJaWYgKGNsb3NlSlNQVGFnIHx8IGxlbmd0aCA9PSAxIHx8IHZhbHVlLmNoYXJBdChsZW5ndGggLSAxKSAhPSBmaXJzdENoYXIpIHsKLQkJCQljbG9zZVF1b3RlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCi0JCWlmICghY2xvc2VKU1BUYWcgJiYgIWNsb3NlUXVvdGUpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlpZiAoY2xvc2VKU1BUYWcpCi0JCQlidWZmZXIuYXBwZW5kKEpTUFRhZy5UQUdfQ0xPU0UpOwotCQlpZiAoY2xvc2VRdW90ZSkKLQkJCWJ1ZmZlci5hcHBlbmQoZmlyc3RDaGFyKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEdhdGhlciBjbG9zZSB0YWdzIHJlY3Vyc2l2ZWx5LgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldENsb3NlVGFnKElET01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCB8fCBub2RlLmlzQ2xvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVDbG9zZVRhZyhub2RlKTsKLQkJfQotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG5vZGU7Ci0JCWlmIChlbGVtZW50Lmhhc0VuZFRhZygpKSB7Ci0JCQkvLyBlbmQgdGFnIGlzIG5vdCBjbG9zZWQKLQkJCXJldHVybiB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUNsb3NlVGFnKGVsZW1lbnQpOwotCQl9Ci0KLQkJLy8gbm8gZW5kIHRhZwotCQlpbnQgb2Zmc2V0ID0gZWxlbWVudC5nZXRFbmRPZmZzZXQoKTsKLQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSAoSURPTU5vZGUpIGVsZW1lbnQuZ2V0TGFzdENoaWxkKCk7Ci0JCWlmIChsYXN0Q2hpbGQgPT0gbnVsbCkgewotCQkJaWYgKCFlbGVtZW50LmlzU3RhcnRUYWdDbG9zZWQoKSkgewotCQkJCWlmIChlbGVtZW50LnByZWZlckVtcHR5VGFnKCkpCi0JCQkJCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCQkJU3RyaW5nIGNsb3NlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQlpZiAoY2xvc2VUYWcgIT0gbnVsbCkgewotCQkJCQlpbnQgbGVuZ3RoID0gY2xvc2VUYWcubGVuZ3RoKCk7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlTdHJpbmcgY2xvc2VUYWcgPSBnZXRDbG9zZVRhZyhsYXN0Q2hpbGQpOwotCQkJaWYgKGNsb3NlVGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gY2xvc2VUYWcubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChjbG9zZVRhZyk7Ci0JCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJU3RyaW5nIGVuZFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBlbmRUYWcubGVuZ3RoKCk7Ci0JCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCWJ1ZmZlci5hcHBlbmQoZW5kVGFnKTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9mZnNldCwgbGVuZ3RoKTsKLQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0U3RhcnRDbG9zZVRhZyhJRE9NRWxlbWVudCBlbGVtZW50KSB7Ci0JCWlmIChlbGVtZW50ID09IG51bGwgfHwgZWxlbWVudC5pc1N0YXJ0VGFnQ2xvc2VkKCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlTdHJpbmcgYXR0clZhbHVlQ2xvc2UgPSBnZXRBdHRyVmFsdWVDbG9zZShlbGVtZW50KTsKLQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZUNsb3NlKTsKLQkJU3RyaW5nIGNsb3NlVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVDbG9zZVRhZyhlbGVtZW50KTsKLQkJaWYgKGNsb3NlVGFnICE9IG51bGwpCi0JCQlidWZmZXIuYXBwZW5kKGNsb3NlVGFnKTsKLQkJcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotCX0KLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSB7Ci0JCWlmIChtb2RlbCA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBtb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQl2b2lkIGluaXRpYWxpemUoKSB7Ci0JCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJdGhpcy5nYXBPZmZzZXQgPSAwOwotCQl0aGlzLmdhcExlbmd0aCA9IDA7Ci0JCXRoaXMuZGlmZiA9IDA7Ci0JCXRoaXMucGFyZW50Tm9kZSA9IG51bGw7Ci0JCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihpbnQgZW5kT2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQuZ2V0U3RhcnQoKSA8IGVuZE9mZnNldCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgY29udGVudDsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25CZWZvcmUoaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWlmICh0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBwcm94eSA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gcHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQl9Ci0JCWVsc2UgaWYgKHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci0JCQlpbnQgY291bnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ291bnQoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY29udGVudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJaWYgKGNvbnRlbnQgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNvbnRlbnQuZ2V0U3RhcnQoKSA+PSBzdGFydE9mZnNldCkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBwcm94eS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJaWYgKGZsYXROb2RlICE9IG51bGwpCi0JCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGNvbnRlbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbih0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKi8KLQlwcml2YXRlIHZvaWQgaW5zZXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQkJaWYgKHRoaXMucGFyZW50Tm9kZSA9PSBudWxsKQotCQkJcmV0dXJuOyAvLyBlcnJvcgotCi0JCWludCBuZXdPZmZzZXQgPSBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJaW50IG5ld0VuZCA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJYm9vbGVhbiBpc0VuZFRhZyA9IGZhbHNlOwotCi0JCS8vIGZpbmQgb3duZXIgbm9kZQotCQlOb2RlSW1wbCBvd25lck5vZGUgPSBudWxsOwotCQl3aGlsZSAodGhpcy5wYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5leHRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSB0aGlzLm5leHROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWlmIChuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJaW50IG5leHRPZmZzZXQgPSBuZXh0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQkJCWlmIChuZXh0T2Zmc2V0ID09IG5ld09mZnNldCkgeyAvLyBmb3VuZAotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWlmICh0aGlzLm5leHROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCWludCBuZXh0RW5kID0gbmV4dFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJCWlmIChuZXh0T2Zmc2V0IDwgbmV3RW5kICYmIG5leHRFbmQgPiBuZXdPZmZzZXQpIHsKLQkJCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJTm9kZSBjaGlsZCA9IHRoaXMubmV4dE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIGNoaWxkOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQlpZiAodGhpcy5uZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCXRoaXMucGFyZW50Tm9kZSA9IHRoaXMubmV4dE5vZGU7Ci0JCQkJCXRoaXMubmV4dE5vZGUgPSBudWxsOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0KLQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLm5leHROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQl9Ci0KLQkJCWlmICh0aGlzLnBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIHRoaXMucGFyZW50Tm9kZTsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJaWYgKGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCBlbmRPZmZzZXQgPSBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKTsKLQkJCQkJaWYgKGVuZE9mZnNldCA9PSBuZXdPZmZzZXQpIHsgLy8gZm91bmQKLQkJCQkJCW93bmVyTm9kZSA9IHRoaXMucGFyZW50Tm9kZTsKLQkJCQkJCWlzRW5kVGFnID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCXRoaXMucGFyZW50Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5wYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJfQotCQlpZiAob3duZXJOb2RlID09IG51bGwpCi0JCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCi0JCXNob3J0IG5vZGVUeXBlID0gb3duZXJOb2RlLmdldE5vZGVUeXBlKCk7Ci0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgb3duZXJOb2RlOwotCQkJaWYgKGlzRW5kVGFnKSB7Ci0JCQkJZWxlbWVudC5zZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQl1cGRhdGVBdHRyUmVnaW9ucyhlbGVtZW50LCBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKG5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSBvd25lck5vZGU7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IHRleHQuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQkJaW50IG9sZE9mZnNldCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQkJaW50IG9sZEVuZCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmQoKTsKLQkJCWlmIChvbGRPZmZzZXQgPT0gbmV3T2Zmc2V0ICYmIG9sZEVuZCA9PSBuZXdFbmQpIHsKLQkJCQl0ZXh0LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCQlpZiAob2xkRW5kID4gbmV3RW5kKSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKCk7Ci0JCQkJCWlmIChvbGRPZmZzZXQgPT0gbmV3T2Zmc2V0KSB7Ci0JCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSBuZXdQcm94eSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSgpOwotCQkJCQkJbmV3UHJveHkuc2V0T2Zmc2V0KG9sZE9mZnNldCk7Ci0JCQkJCQluZXdQcm94eS5zZXRMZW5ndGgobmV3RW5kIC0gb2xkT2Zmc2V0KTsKLQkJCQkJCW5ld1Byb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJY29udGFpbmVyLmFwcGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdQcm94eSk7Ci0JCQkJCX0KLQkJCQkJcHJveHkuc2V0T2Zmc2V0KG5ld0VuZCk7Ci0JCQkJCXByb3h5LnNldExlbmd0aChvbGRFbmQgLSBuZXdFbmQpOwotCQkJCQljb250YWluZXIuYXBwZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHByb3h5KTsKLQkJCQkJdGV4dC5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oY29udGFpbmVyKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCi0JCQkJCWlmIChvbGRFbmQgPCBuZXdFbmQpIHsgLy8gdG8gYmUgc2hhcmVkCi0JCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0KLQkJCWlmIChvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCQlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIgY29udGFpbmVyID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lcikgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJCWludCBvZmZzZXQgPSBjb250ZW50LmdldFN0YXJ0KCk7Ci0JCQkJCWludCBlbmQgPSBjb250ZW50LmdldEVuZCgpOwotCQkJCQlpZiAoZW5kIDw9IG5ld09mZnNldCkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlpZiAob2Zmc2V0ID09IG5ld09mZnNldCAmJiBlbmQgPT0gbmV3RW5kKSB7Ci0JCQkJCQljb250YWluZXIucmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIGNvbnRlbnQ7Ci0JCQkJCQlpZiAoZW5kID4gbmV3RW5kKSB7Ci0JCQkJCQkJaWYgKG9mZnNldCA9PSBuZXdPZmZzZXQpIHsKLQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGkpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgbmV3UHJveHkgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkoKTsKLQkJCQkJCQkJbmV3UHJveHkuc2V0T2Zmc2V0KG9mZnNldCk7Ci0JCQkJCQkJCW5ld1Byb3h5LnNldExlbmd0aChuZXdFbmQgLSBvZmZzZXQpOwotCQkJCQkJCQluZXdQcm94eS5zZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJY29udGFpbmVyLmluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdQcm94eSwgaSk7Ci0JCQkJCQkJfQotCQkJCQkJCXByb3h5LnNldE9mZnNldChuZXdFbmQpOwotCQkJCQkJCXByb3h5LnNldExlbmd0aChlbmQgLSBuZXdFbmQpOwotCQkJCQkJCXJldHVybjsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXByb3h5LnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCQkJCWlmIChlbmQgPT0gbmV3RW5kKQotCQkJCQkJCQlyZXR1cm47Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAob2xkRW5kIDwgbmV3RW5kKSB7IC8vIHRvIGJlIHNoYXJlZAotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSB0ZXh0LmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWluc2VydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJCX0KLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aHJvdyBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uTWFuYWdlbWVudEV4Y2VwdGlvbigpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJb3duZXJOb2RlLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCQlyZXR1cm47Ci0JCX0KLQotCQlpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkgcHJveHkgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikKLQkJCQl0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAodGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIHsKLQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB0aGlzLmdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjb250ZW50ID0gY29udGFpbmVyLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihpKTsKLQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY29udGVudCA9PSBvbGRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJCQkJaWYgKGNvdW50ID4gMSkKLQkJCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCWVsc2UKLQkJCQkJCXRoaXMuZ2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbnVsbDsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSB7Ci0JCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCQlpZiAoY291bnQgPiAxKQotCQkJCQkJCWNvbnRhaW5lci5yZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oaSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJCQkJcmV0dXJuOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQlpZiAob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQlyZXR1cm47IC8vIGVycm9yCi0JCWlmICh0aGlzLnBhcmVudE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsgLy8gZXJyb3IKLQotCQlpbnQgZ2FwRW5kID0gdGhpcy5nYXBPZmZzZXQgKyB0aGlzLmdhcExlbmd0aDsKLQkJaW50IG9sZE9mZnNldCA9IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpOwotCQlpbnQgb2xkRW5kID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpOwotCQlpZiAob2xkT2Zmc2V0ID49IHRoaXMuZ2FwT2Zmc2V0ICYmIG9sZEVuZCA8PSBnYXBFbmQpCi0JCQlyZXR1cm47IC8vIGRvIG5vdGhpbmcKLQkJaW50IG9sZExlbmd0aCA9IG9sZEVuZCAtIG9sZE9mZnNldDsKLQkJaWYgKG9sZE9mZnNldCA+PSBnYXBFbmQpCi0JCQlvbGRPZmZzZXQgKz0gdGhpcy5kaWZmOwotCi0JCS8vIGZpbmQgb3duZXIgbm9kZQotCQlOb2RlSW1wbCBvd25lck5vZGUgPSBudWxsOwotCQlFbGVtZW50SW1wbCBvd25lckVuZFRhZyA9IG51bGw7Ci0JCVRleHRJbXBsIG93bmVyVGV4dCA9IG51bGw7Ci0JCXdoaWxlICh0aGlzLnBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaWYgKHRoaXMubmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCWlmICh0aGlzLm5leHROb2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQlvd25lck5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCQlUZXh0SW1wbCB0ZXh0ID0gKFRleHRJbXBsKSB0aGlzLm5leHROb2RlOwotCQkJCQlpZiAodGV4dC5oYXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJCQkJb3duZXJOb2RlID0gdGhpcy5uZXh0Tm9kZTsKLQkJCQkJCW93bmVyVGV4dCA9IHRleHQ7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0KLQotCQkJCU5vZGUgY2hpbGQgPSB0aGlzLm5leHROb2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCQlpZiAoY2hpbGQgIT0gbnVsbCkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSBjaGlsZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKHRoaXMubmV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQl0aGlzLnBhcmVudE5vZGUgPSB0aGlzLm5leHROb2RlOwotCQkJCQl0aGlzLm5leHROb2RlID0gbnVsbDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgdGhpcy5uZXh0Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJCWlmICh0aGlzLm5leHROb2RlICE9IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJfQotCi0JCQlpZiAodGhpcy5wYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSB0aGlzLnBhcmVudE5vZGU7Ci0JCQkJaWYgKGVsZW1lbnQuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCW93bmVyTm9kZSA9IHRoaXMucGFyZW50Tm9kZTsKLQkJCQkJb3duZXJFbmRUYWcgPSBlbGVtZW50OwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHRoaXMucGFyZW50Tm9kZS5nZXROZXh0U2libGluZygpOwotCQkJdGhpcy5wYXJlbnROb2RlID0gKE5vZGVJbXBsKSB0aGlzLnBhcmVudE5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCWlmIChvd25lck5vZGUgPT0gbnVsbCkKLQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0KLQkJaWYgKG93bmVyVGV4dCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gb3duZXJUZXh0LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGZsYXROb2RlID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbmV3IFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KG9sZE9mZnNldCwgb2xkTGVuZ3RoKTsKLQkJCQlvd25lclRleHQuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbik7Ci0JCQkJcmV0dXJuOwotCQkJfQotCi0JCQlpZiAoZmxhdE5vZGUgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eSkgewotCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBmbGF0Tm9kZTsKLQkJCQlpZiAocHJveHkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQkJfQotCQkJCWludCBvZmZzZXQgPSBwcm94eS5nZXRPZmZzZXQoKTsKLQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJaWYgKG9mZnNldCA+PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQl9Ci0JCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCWlmIChlbmQgPCBvbGRFbmQgJiYgKGVuZCA8IHRoaXMuZ2FwT2Zmc2V0IHx8IG9sZEVuZCA+IGdhcEVuZCkpIHsgLy8gaGFzCi0JCQkJCS8vIHNoYXJlZAotCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJcmV0dXJuOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGZsYXROb2RlIGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyKSB7Ci0JCQkJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbmVyIGNvbnRhaW5lciA9IChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db250YWluZXIpIGZsYXROb2RlOwotCQkJCWludCBjb3VudCA9IGNvbnRhaW5lci5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Db3VudCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvbnRlbnQgPSBjb250YWluZXIuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGkpOwotCQkJCQlpZiAoY29udGVudCA9PSBudWxsKQotCQkJCQkJY29udGludWU7IC8vIGVycm9yCi0JCQkJCWlmIChjb250ZW50ID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2xkT2Zmc2V0LCBvbGRMZW5ndGgpOwotCQkJCQkJY29udGFpbmVyLnJlcGxhY2VTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24obmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBpKTsKLQkJCQkJCXJldHVybjsKLQkJCQkJfQotCi0JCQkJCWlmIChjb250ZW50IGluc3RhbmNlb2YgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkpIHsKLQkJCQkJCVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5IHByb3h5ID0gKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblByb3h5KSBjb250ZW50OwotCQkJCQkJaWYgKHByb3h5LmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotCQkJCQkJCWludCBvZmZzZXQgPSBwcm94eS5nZXRPZmZzZXQoKTsKLQkJCQkJCQlpbnQgZW5kID0gb2Zmc2V0ICsgcHJveHkuZ2V0TGVuZ3RoKCk7Ci0JCQkJCQkJaWYgKG9mZnNldCA+PSB0aGlzLmdhcE9mZnNldCkgewotCQkJCQkJCQlwcm94eS5zZXRPZmZzZXQob2Zmc2V0ICsgdGhpcy5kaWZmKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcHJveHkuc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKG51bGwpOwotCQkJCQkJCWlmIChlbmQgPCBvbGRFbmQgJiYgKGVuZCA8IHRoaXMuZ2FwT2Zmc2V0IHx8IG9sZEVuZCA+IGdhcEVuZCkpIHsgLy8gaGFzCi0JCQkJCQkJCS8vIHNoYXJlZAotCQkJCQkJCQlyZW1vdmVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24ob2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKTsKLQkJCQkJCQkJcmV0dXJuOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCXRocm93IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25NYW5hZ2VtZW50RXhjZXB0aW9uKCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvbGRPZmZzZXQsIG9sZExlbmd0aCk7Ci0JCQlpZiAob3duZXJFbmRUYWcgIT0gbnVsbCkgewotCQkJCW93bmVyRW5kVGFnLnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJb3duZXJOb2RlLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihuZXdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZUF0dHIgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIG93bmVyRWxlbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uRWxlbWVudAotCSAqIEBwYXJhbSBuZXdBdHRyCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5BdHRyCi0JICogQHBhcmFtIG9sZEF0dHIKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLkF0dHIKLQkgKi8KLQl2b2lkIHJlcGxhY2VBdHRyKEVsZW1lbnQgb3duZXJFbGVtZW50LCBBdHRyIG5ld0F0dHIsIEF0dHIgb2xkQXR0cikgewotCQlpZiAob3duZXJFbGVtZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCUVsZW1lbnRJbXBsIGVsZW1lbnQgPSAoRWxlbWVudEltcGwpIG93bmVyRWxlbWVudDsKLQkJaWYgKCFlbGVtZW50Lmhhc1N0YXJ0VGFnKCkpIHsKLQkJCWNoYW5nZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJcmV0dXJuOwotCQl9Ci0JCWlmIChlbGVtZW50LmlzQ29tbWVudFRhZygpKSB7Ci0JCQljaGFuZ2VTdGFydFRhZyhlbGVtZW50KTsKLQkJCXJldHVybjsKLQkJfQotCi0JCWludCBvZmZzZXQgPSBlbGVtZW50LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCWludCBzdGFydCA9IG9mZnNldDsKLQkJaW50IGVuZCA9IG9mZnNldDsKLQotCQlib29sZWFuIGluc2VydFNwYWNlID0gZmFsc2U7Ci0JCVN0cmluZyBhdHRyVmFsdWVDbG9zZSA9IG51bGw7Ci0JCWlmIChvbGRBdHRyICE9IG51bGwpIHsKLQkJCUF0dHJJbXBsIGltcGwgPSAoQXR0ckltcGwpIG9sZEF0dHI7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lUmVnaW9uID0gaW1wbC5nZXROYW1lUmVnaW9uKCk7Ci0JCQlpZiAobmFtZVJlZ2lvbiA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSBpbXBsLmdldFZhbHVlUmVnaW9uKCk7Ci0JCQlpZiAobGFzdFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJZW5kICs9IGxhc3RSZWdpb24uZ2V0RW5kKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlsYXN0UmVnaW9uID0gaW1wbC5nZXRFcXVhbFJlZ2lvbigpOwotCQkJCWlmIChsYXN0UmVnaW9uICE9IG51bGwpIHsKLQkJCQkJZW5kICs9IGxhc3RSZWdpb24uZ2V0RW5kKCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQllbmQgKz0gbmFtZVJlZ2lvbi5nZXRFbmQoKTsKLQkJCQkJbGFzdFJlZ2lvbiA9IG5hbWVSZWdpb247Ci0JCQkJfQotCQkJfQotCQkJLy8gY2hlY2sgdGhlcmUgYXJlIGV4dHJhIHNwYWNlIGJlZm9yZSB0aGUgbGFzdCBhdHRyaWJ1dGUKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBlbGVtZW50LmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQlyZXR1cm47IC8vIG11c3QgbmV2ZXIgaGFwcGVuCi0JCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCWlmIChyZWdpb25zID09IG51bGwpCi0JCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IG51bGw7Ci0JCQlJVGV4dFJlZ2lvbiBuZXh0UmVnaW9uID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCWlmIChyZWdpb24gPT0gbmFtZVJlZ2lvbikgewotCQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJCXByZXZSZWdpb24gPSByZWdpb25zLmdldChpIC0gMSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYgKHJlZ2lvbiA9PSBsYXN0UmVnaW9uKSB7Ci0JCQkJCWlmIChpICsgMSA8IHJlZ2lvbnMuc2l6ZSgpKSB7Ci0JCQkJCQluZXh0UmVnaW9uID0gcmVnaW9ucy5nZXQoaSArIDEpOwotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCWJvb2xlYW4gaXNMYXN0QXR0ciA9IGZhbHNlOwotCQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJCVN0cmluZyByZWdpb25UeXBlID0gbmV4dFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFIHx8IGlzTmVzdGVkVGFnQ2xvc2UocmVnaW9uVHlwZSkpIHsKLQkJCQkJaXNMYXN0QXR0ciA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGlzTGFzdEF0dHIgJiYgcHJldlJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJc3RhcnQgKz0gcHJldlJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlzdGFydCArPSBuYW1lUmVnaW9uLmdldFN0YXJ0KCk7Ci0JCQl9Ci0KLQkJCS8vIGltcGwucmVzZXRSZWdpb25zKG93bmVyRWxlbWVudCk7Ci0JCQlpbXBsLnJlc2V0UmVnaW9ucyhlbGVtZW50KTsKLQkJfQotCQllbHNlIHsgLy8gYXBwZW5kIGF0dHJpYnV0ZQotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IGVsZW1lbnQuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmbGF0Tm9kZSA9PSBudWxsKQotCQkJCXJldHVybjsgLy8gbXVzdCBuZXZlciBoYXBwZW4KLQotCQkJYXR0clZhbHVlQ2xvc2UgPSBnZXRBdHRyVmFsdWVDbG9zZShlbGVtZW50KTsKLQkJCWlmIChhdHRyVmFsdWVDbG9zZSAhPSBudWxsICYmIGF0dHJWYWx1ZUNsb3NlLmxlbmd0aCgpID4gMCkgewotCQkJCWluc2VydFNwYWNlID0gdHJ1ZTsKLQkJCQlzdGFydCA9IGZsYXROb2RlLmdldEVuZE9mZnNldCgpOwotCQkJCWVuZCA9IHN0YXJ0OwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBmbGF0Tm9kZS5nZXRSZWdpb25zKCk7Ci0JCQkJaWYgKHJlZ2lvbnMgPT0gbnVsbCkKLQkJCQkJcmV0dXJuOyAvLyBtdXN0IG5ldmVyIGhhcHBlbgotCQkJCWludCBhdHRyU3RhcnQgPSAwOwotCQkJCWZvciAoaW50IGkgPSByZWdpb25zLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KGkpOwotCQkJCQlTdHJpbmcgcmVnaW9uVHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSB8fCBpc05lc3RlZFRhZ0Nsb3NlKHJlZ2lvblR5cGUpKQotCQkJCQkJY29udGludWU7Ci0JCQkJCWludCByZWdpb25FbmQgPSByZWdpb24uZ2V0RW5kKCk7Ci0JCQkJCWlmIChyZWdpb25FbmQgPT0gcmVnaW9uLmdldFRleHRFbmQoKSkKLQkJCQkJCWluc2VydFNwYWNlID0gdHJ1ZTsKLQkJCQkJYXR0clN0YXJ0ID0gcmVnaW9uRW5kOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJaWYgKGF0dHJTdGFydCA9PSAwKQotCQkJCQlyZXR1cm47IC8vIG5vdCBmb3VuZCwgbXVzdCBuZXZlciBoYXBwZW4KLQkJCQlzdGFydCArPSBhdHRyU3RhcnQ7Ci0JCQkJZW5kID0gc3RhcnQ7Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gbnVsbDsKLQkJaWYgKG5ld0F0dHIgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSAyOwotCQkJaWYgKGF0dHJWYWx1ZUNsb3NlICE9IG51bGwpCi0JCQkJc2l6ZSArPSBhdHRyVmFsdWVDbG9zZS5sZW5ndGgoKTsKLQkJCVN0cmluZyBuYW1lID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyTmFtZShuZXdBdHRyKTsKLQkJCWlmIChuYW1lICE9IG51bGwpCi0JCQkJc2l6ZSArPSBuYW1lLmxlbmd0aCgpOwotCQkJU3RyaW5nIHZhbHVlID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVBdHRyVmFsdWUobmV3QXR0cik7Ci0JCQlpZiAodmFsdWUgIT0gbnVsbCkKLQkJCQlzaXplICs9IHZhbHVlLmxlbmd0aCgpOwotCQkJU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoc2l6ZSk7Ci0JCQlpZiAoYXR0clZhbHVlQ2xvc2UgIT0gbnVsbCkKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJWYWx1ZUNsb3NlKTsKLQkJCWlmIChpbnNlcnRTcGFjZSkKLQkJCQlidWZmZXIuYXBwZW5kKCcgJyk7Ci0JCQlidWZmZXIuYXBwZW5kKG5hbWUpOwotCQkJaWYgKHZhbHVlICE9IG51bGwpIHsKLQkJCQlidWZmZXIuYXBwZW5kKCc9Jyk7Ci0JCQkJYnVmZmVyLmFwcGVuZCh2YWx1ZSk7Ci0JCQl9Ci0JCQlzb3VyY2UgPSBidWZmZXIudG9TdHJpbmcoKTsKLQkJfQotCi0JCXJlcGxhY2VTb3VyY2Uoc291cmNlLCBzdGFydCwgZW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc05lc3RlZFRhZ0Nsb3NlKFN0cmluZyByZWdpb25UeXBlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogcmVwbGFjZUNoaWxkIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnROb2RlCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG5ld0NoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICogQHBhcmFtIG9sZENoaWxkCi0JICogICAgICAgICAgICBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0Jdm9pZCByZXBsYWNlQ2hpbGQoTm9kZSBwYXJlbnROb2RlLCBOb2RlIG5ld0NoaWxkLCBOb2RlIG9sZENoaWxkKSB7Ci0JCWlmIChwYXJlbnROb2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChuZXdDaGlsZCA9PSBudWxsICYmIG9sZENoaWxkID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKSA9PSBudWxsKQotCQkJcmV0dXJuOwotCi0JCWludCBzdGFydCA9IDA7Ci0JCWludCBlbmQgPSAwOwotCQlTdHJpbmcgcHJlVGFnID0gbnVsbDsKLQkJU3RyaW5nIHBvc3RUYWcgPSBudWxsOwotCQlFbGVtZW50SW1wbCBwb3N0RWxlbWVudCA9IG51bGw7Ci0JCWlmIChvbGRDaGlsZCAhPSBudWxsKSB7Ci0JCQlOb2RlSW1wbCBub2RlID0gKE5vZGVJbXBsKSBvbGRDaGlsZDsKLQkJCXN0YXJ0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJZW5kID0gbm9kZS5nZXRFbmRPZmZzZXQoKTsKLQkJCWlmIChvbGRDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJdGhpcy5nYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJfQotCQkJbm9kZS5yZXNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoKTsgLy8gcmVzZXQgdmFsdWVzIGZyb20KLQkJCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJfQotCQllbHNlIHsKLQkJCU5vZGVJbXBsIHByZXYgPSAoTm9kZUltcGwpIG5ld0NoaWxkLmdldFByZXZpb3VzU2libGluZygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJCXN0YXJ0ID0gcHJldi5nZXRFbmRPZmZzZXQoKTsKLQkJCQllbmQgPSBzdGFydDsKLQkJCQlwcmVUYWcgPSBnZXRDbG9zZVRhZyhwcmV2KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGZpcnN0IGNoaWxkCi0JCQkJTm9kZUltcGwgbmV4dCA9IChOb2RlSW1wbCkgbmV3Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCQlpZiAobmV4dCAhPSBudWxsKSB7Ci0JCQkJCXN0YXJ0ID0gbmV4dC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQllbmQgPSBzdGFydDsKLQkJCQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZygoSURPTUVsZW1lbnQpIHBhcmVudE5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBuZXdseSBoYXZpbmcgYSBjaGlsZAotCQkJCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBwYXJlbnROb2RlOwotCQkJCQkJaWYgKGVsZW1lbnQuaXNFbXB0eVRhZygpKSB7IC8vIGVtcHR5IHRhZyBmb3JtYXQKLQkJCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzdGFydCBhbmQgdGhlIGVuZCB0YWdzCi0JCQkJCQkJZW5kID0gZWxlbWVudC5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQlzdGFydCA9IGVuZCAtIDI7IC8vIGZvciAiLz4iCi0JCQkJCQkJZWxlbWVudC5zZXRFbXB0eVRhZyhmYWxzZSk7Ci0JCQkJCQkJcHJlVGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQkJCQlwb3N0VGFnID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVFbmRUYWcoZWxlbWVudCk7Ci0JCQkJCQkJcG9zdEVsZW1lbnQgPSBlbGVtZW50OwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoIWVsZW1lbnQuaGFzU3RhcnRUYWcoKSkgewotCQkJCQkJCXN0YXJ0ID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCWVuZCA9IHN0YXJ0OwotCQkJCQkJCS8vIGludmFsaWQgZW5kIHRhZyBvciBpbXBsaWNpdCB0YWcKLQkJCQkJCQkvLyBuZWVkIHRvIGdlbmVyYXRlIHRoZSBzdGFydCB0YWcKLQkJCQkJCQlwcmVUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCQkJCWlmIChwcmVUYWcgIT0gbnVsbCkgewotCQkJCQkJCQlpbnQgbGVuZ3RoID0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShzdGFydCwgbGVuZ3RoKTsKLQkJCQkJCQkJCWVsZW1lbnQuc2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCQkJCQkJCWlmICghZWxlbWVudC5oYXNFbmRUYWcoKSkgewotCQkJCQkJCQkvLyBpbXBsaWNpdCB0YWcKLQkJCQkJCQkJLy8gbmVlZCB0byBnZW5lcmF0ZSB0aGUgZW5kIHRhZ3MKLQkJCQkJCQkJcG9zdFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQkJCQlwb3N0RWxlbWVudCA9IGVsZW1lbnQ7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJc3RhcnQgPSBlbGVtZW50LmdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJZW5kID0gc3RhcnQ7Ci0JCQkJCQkJcHJlVGFnID0gZ2V0U3RhcnRDbG9zZVRhZyhlbGVtZW50KTsKLQkJCQkJCQlpZiAocHJlVGFnICE9IG51bGwgJiYgcHJlVGFnLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQlpZiAoIWVsZW1lbnQuaGFzRW5kVGFnKCkgJiYgKGVsZW1lbnQuaXNKU1BDb250YWluZXIoKSB8fCBlbGVtZW50LmlzQ0RBVEFDb250YWluZXIoKSkpIHsKLQkJCQkJCQkJCS8vIG5lZWQgdG8gZ2VuZXJhdGUgdGhlIGVuZCB0YWcKLQkJCQkJCQkJCXBvc3RUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZUVuZFRhZyhlbGVtZW50KTsKLQkJCQkJCQkJCXBvc3RFbGVtZW50ID0gZWxlbWVudDsKLQkJCQkJCQkJfQotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQkvLyBlbHNlIG1pZ2h0IERPQ1VNRU5UX05PREUsIHN0YXJ0IGFuZCBlbmQgYXJlIDAKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlTdHJpbmcgc291cmNlID0gbnVsbDsKLQkJaWYgKG5ld0NoaWxkICE9IG51bGwpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpbnQgb2Zmc2V0ID0gc3RhcnQ7Ci0JCQlpZiAocHJlVGFnICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gcHJlVGFnLmxlbmd0aCgpOwotCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCW9mZnNldCArPSBsZW5ndGg7Ci0JCQkJCWJ1ZmZlci5hcHBlbmQocHJlVGFnKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCU5vZGVJbXBsIG5vZGUgPSAoTm9kZUltcGwpIG5ld0NoaWxkOwotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJRWxlbWVudEltcGwgZWxlbWVudCA9IChFbGVtZW50SW1wbCkgbm9kZTsKLQkJCQkJaWYgKGVsZW1lbnQucHJlZmVyRW1wdHlUYWcoKSkKLQkJCQkJCWVsZW1lbnQuc2V0RW1wdHlUYWcodHJ1ZSk7Ci0JCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBudWxsOwotCQkJCQlTdHJpbmcgc3RhcnRUYWcgPSB0aGlzLmdlbmVyYXRvci5nZW5lcmF0ZVN0YXJ0VGFnKGVsZW1lbnQpOwotCQkJCQlpZiAoc3RhcnRUYWcgIT0gbnVsbCkgewotCQkJCQkJaW50IGxlbmd0aCA9IHN0YXJ0VGFnLmxlbmd0aCgpOwotCQkJCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJCQlidWZmZXIuYXBwZW5kKHN0YXJ0VGFnKTsKLQkJCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbGVtZW50LnNldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCVN0cmluZyBjb250ZW50ID0gdGhpcy5nZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2Uobm9kZSk7Ci0JCQkJCWlmIChjb250ZW50ID09IG51bGwpCi0JCQkJCQljb250ZW50ID0gbmV3IFN0cmluZygpOwotCQkJCQlpbnQgbGVuZ3RoID0gY29udGVudC5sZW5ndGgoKTsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCQkJCWlmIChsZW5ndGggPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKGNvbnRlbnQpOwotCQkJCQkJZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJfQotCQkJCQlub2RlLnNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCi0JCQkJTm9kZUltcGwgY2hpbGQgPSAoTm9kZUltcGwpIG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJCWlmIChjaGlsZCAhPSBudWxsKSB7Ci0JCQkJCW5vZGUgPSBjaGlsZDsKLQkJCQkJY29udGludWU7Ci0JCQkJfQotCi0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQkJU3RyaW5nIGVuZFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCQkJCWludCBsZW5ndGggPSBlbmRUYWcubGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoZW5kVGFnKTsKLQkJCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCi0JCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCkgewotCQkJCQlpZiAobm9kZSA9PSBuZXdDaGlsZCkgewotCQkJCQkJbm9kZSA9IG51bGw7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQlOb2RlSW1wbCBuZXh0ID0gKE5vZGVJbXBsKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJCWlmIChuZXh0ICE9IG51bGwpIHsKLQkJCQkJCW5vZGUgPSBuZXh0OwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQotCQkJCQlub2RlID0gKE5vZGVJbXBsKSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQlFbGVtZW50SW1wbCBlbGVtZW50ID0gKEVsZW1lbnRJbXBsKSBub2RlOwotCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbnVsbDsKLQkJCQkJU3RyaW5nIGVuZFRhZyA9IHRoaXMuZ2VuZXJhdG9yLmdlbmVyYXRlRW5kVGFnKGVsZW1lbnQpOwotCQkJCQlpZiAoZW5kVGFnICE9IG51bGwpIHsKLQkJCQkJCWludCBsZW5ndGggPSBlbmRUYWcubGVuZ3RoKCk7Ci0JCQkJCQlpZiAobGVuZ3RoID4gMCkgewotCQkJCQkJCWJ1ZmZlci5hcHBlbmQoZW5kVGFnKTsKLQkJCQkJCQlmbGF0Tm9kZSA9IG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25Qcm94eShvZmZzZXQsIGxlbmd0aCk7Ci0JCQkJCQkJb2Zmc2V0ICs9IGxlbmd0aDsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbGVtZW50LnNldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCQkJfQotCQkJfQotCi0JCQlpZiAocG9zdFRhZyAhPSBudWxsKSB7Ci0JCQkJaW50IGxlbmd0aCA9IHBvc3RUYWcubGVuZ3RoKCk7Ci0JCQkJaWYgKGxlbmd0aCA+IDApIHsKLQkJCQkJYnVmZmVyLmFwcGVuZChwb3N0VGFnKTsKLQkJCQkJaWYgKHBvc3RFbGVtZW50ICE9IG51bGwpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXcgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUHJveHkob2Zmc2V0LCBsZW5ndGgpOwotCQkJCQkJcG9zdEVsZW1lbnQuc2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXNvdXJjZSA9IGJ1ZmZlci50b1N0cmluZygpOwotCQl9Ci0KLQkJaWYgKHN0YXJ0ID09IGVuZCAmJiAoc291cmNlID09IG51bGwgfHwgc291cmNlLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBubyB0aGluZyBjaGFuZ2VkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQlyZXBsYWNlU291cmNlKHNvdXJjZSwgc3RhcnQsIGVuZCk7Ci0JfQotCi0Jdm9pZCByZXBsYWNlUmVnaW9ucyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbkxpc3QgbmV3UmVnaW9ucywgSVRleHRSZWdpb25MaXN0IG9sZFJlZ2lvbnMpIHsKLQkJLy8gZnV0dXJlX1RPRE86IG9wdGltaXplCi0KLQkJTm9kZUltcGwgcm9vdCA9IChOb2RlSW1wbCkgdGhpcy5tb2RlbC5nZXREb2N1bWVudCgpOwotCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQl0aGlzLm5leHROb2RlID0gKE5vZGVJbXBsKSByb290LmdldEZpcnN0Q2hpbGQoKTsKLQotCQlyZW1vdmVHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25CZWZvcmUoZmxhdE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCWNoYW5nZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihmbGF0Tm9kZSk7Ci0JCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkFmdGVyKGZsYXROb2RlLmdldEVuZCgpKTsKLQl9Ci0KLQkvKioKLQkgKiBXcmFwcyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLnJlcGxhY2VUZXh0KCkgYW5kIHNldHMgY29udGV4dHVhbAotCSAqIGluZm9ybWF0aW9uLgotCSAqLwotCXByaXZhdGUgdm9pZCByZXBsYWNlU291cmNlKFN0cmluZyBzb3VyY2UsIGludCBzdGFydCwgaW50IGVuZCkgewotCQlpbnQgaW5zZXJ0ZWQgPSAwOwotCQlpZiAoc291cmNlID09IG51bGwpCi0JCQlzb3VyY2UgPSBuZXcgU3RyaW5nKCk7Ci0JCWVsc2UKLQkJCWluc2VydGVkID0gc291cmNlLmxlbmd0aCgpOwotCQlpbnQgcmVtb3ZlZCA9IGVuZCAtIHN0YXJ0OwotCQlpZiAoaW5zZXJ0ZWQgPT0gMCAmJiByZW1vdmVkID09IDApCi0JCQlyZXR1cm47Ci0KLQkJdGhpcy5nYXBPZmZzZXQgPSBzdGFydDsKLQkJdGhpcy5nYXBMZW5ndGggPSByZW1vdmVkOwotCQl0aGlzLmRpZmYgPSBpbnNlcnRlZCAtIHJlbW92ZWQ7Ci0JCS8vIE5vdGU6IGR1ZSB0byBidWcKLQkJLy8gaHR0cHM6Ly93My5vcGVuc291cmNlLmlibS5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM2MTkKLQkJLy8gZm9yIG5vdyBhc3N1bWUgImlnbm9yZSByZWFkb25seSIgcmVnaW9uIGlzIG9rIC0tIGFzc3VtZSBET00gaXRzZWxmCi0JCS8vIGNoZWNrcyBpZgotCQkvLyBvayB0byBpbnNlcnQgb3Igbm90LiBJbiByZWFsaXR5LCB3ZSBtYXkgaGF2ZSB0byBtYWtlIG9yICJjb250YWlucyIKLQkJLy8gbWV0aG9kIG1vcmUKLQkJLy8gYmV0dGVyLiBPciwgd2UgbWF5IGhhdmUgdG8gInBlcmN1bGF0ZSB1cCIgdGhlIHBhcmFtZXRlciBmb3IgY2xpZW50cwotCQkvLyB0byB0ZWxsIHVzIHByb2dyYW1hdGljYWxseQotCQkvLyB0aGF0IGl0cyBvayB0byBpbnNlcnQvZm9ybWF0IGluIGEgcmVhZC1vbmx5IHJlZ2lvbi4KLQkJZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcy5tb2RlbCwgdGhpcy5nYXBPZmZzZXQsIHRoaXMuZ2FwTGVuZ3RoLCBzb3VyY2UsIHRydWUpOwotCX0KLQotCXZvaWQgcmVwbGFjZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkxpc3Qgb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucykgewotCQlOb2RlSW1wbCByb290ID0gKE5vZGVJbXBsKSB0aGlzLm1vZGVsLmdldERvY3VtZW50KCk7Ci0KLQkJaWYgKG9sZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCQlFbnVtZXJhdGlvbiBlID0gb2xkU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucy5lbGVtZW50cygpOwotCQkJd2hpbGUgKGUuaGFzTW9yZUVsZW1lbnRzKCkpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIGUubmV4dEVsZW1lbnQoKTsKLQkJCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCQkJY29udGludWU7Ci0JCQkJcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGZsYXROb2RlKTsKLQkJCQlyZW1vdmVHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMgIT0gbnVsbCkgewotCQkJdGhpcy5wYXJlbnROb2RlID0gcm9vdDsKLQkJCXRoaXMubmV4dE5vZGUgPSAoTm9kZUltcGwpIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpOwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBudWxsOwotCQkJRW51bWVyYXRpb24gZSA9IG5ld1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMuZWxlbWVudHMoKTsKLQkJCXdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSBlLm5leHRFbGVtZW50KCk7Ci0JCQkJaWYgKGZsYXROb2RlID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCWlmIChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpCi0JCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZShmbGF0Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlpbnNlcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZmxhdE5vZGUpOwotCQkJCWxhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBmbGF0Tm9kZTsKLQkJCX0KLQkJCWlmIChsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpIHsKLQkJCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcihsYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZCgpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZSh0aGlzLmdhcE9mZnNldCk7Ci0JCQkJLy8gbWFrZSBzdXJlIHRvIHJlc3RvcmUgYWxsIGJhY2t1cGVkIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCQlpbnNlcnRHYXBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25BZnRlcih0aGlzLmdhcE9mZnNldCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQl0aGlzLnBhcmVudE5vZGUgPSByb290OwotCQkJdGhpcy5uZXh0Tm9kZSA9IChOb2RlSW1wbCkgcm9vdC5nZXRGaXJzdENoaWxkKCk7Ci0KLQkJCWluc2VydEdhcFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkJlZm9yZSh0aGlzLmdhcE9mZnNldCk7Ci0JCQkvLyBtYWtlIHN1cmUgdG8gcmVzdG9yZSBhbGwgYmFja3VwZWQgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucwotCQkJaW5zZXJ0R2FwU3RydWN0dXJlZERvY3VtZW50UmVnaW9uQWZ0ZXIodGhpcy5nYXBPZmZzZXQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICovCi0JcHJpdmF0ZSB2b2lkIHVwZGF0ZUF0dHJSZWdpb25zKEVsZW1lbnQgZWxlbWVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCi0JCS8vIHVwZGF0ZSBhdHRyaWJ1dGVzCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0cmlidXRlcyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpbnQgaW5kZXggPSAtMTsKLQkJQXR0ckltcGwgYXR0ciA9IG51bGw7Ci0JCUl0ZXJhdG9yIGUgPSByZWdpb25zLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChlLmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSBlLm5leHQoKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWF0dHIgPSAoQXR0ckltcGwpIGF0dHJpYnV0ZXMuaXRlbSgrK2luZGV4KTsKLQkJCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQkJCWF0dHIuc2V0TmFtZVJlZ2lvbihyZWdpb24pOwotCQkJCQkvLyByZXNldCBvdGhlciByZWdpb25zCi0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24obnVsbCk7Ci0JCQkJCWF0dHIuc2V0VmFsdWVSZWdpb24obnVsbCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWlmIChhdHRyICE9IG51bGwpCi0JCQkJCWF0dHIuc2V0RXF1YWxSZWdpb24ocmVnaW9uKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQkJYXR0ci5zZXRWYWx1ZVJlZ2lvbihyZWdpb24pOwotCQkJCQlhdHRyID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50Q2hhcnNldERldGVjdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMzI4ZGUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudENoYXJzZXREZXRlY3Rvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRSZWFkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudHR5cGUuWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhbmQgcGFyc2VzIGZpcnN0IG9mIFhNTCBmaWxlIHRvIGdldCBlbmNvZGluZy4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yIGV4dGVuZHMgWE1MUmVzb3VyY2VFbmNvZGluZ0RldGVjdG9yIGltcGxlbWVudHMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIHsKLQotCS8qKgotCSAqIFhNTExvYWRlciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldChuZXcgRG9jdW1lbnRSZWFkZXIoZG9jdW1lbnQsIDApKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50TG9hZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL2VuY29kaW5nL1hNTERvY3VtZW50TG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiOGRlYTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9lbmNvZGluZy9YTUxEb2N1bWVudExvYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2Rpbmc7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5BYnN0cmFjdERvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuU3RydWN0dXJlZERvY3VtZW50RmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLlJlZ2lvblBhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSUVuY29kZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU291cmNlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIuWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgcmVhZHMgYW4gWE1MIGZpbGUgYW5kIGNyZWF0ZXMgYW4gWE1MIFN0cnVjdHVyZWQgTW9kZWwuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTERvY3VtZW50TG9hZGVyIGV4dGVuZHMgQWJzdHJhY3REb2N1bWVudExvYWRlciB7Ci0KLQlwdWJsaWMgWE1MRG9jdW1lbnRMb2FkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudFBhcnRpdGlvbmVyIGdldERlZmF1bHREb2N1bWVudFBhcnRpdGlvbmVyKCkgewotCQlyZXR1cm4gbmV3IFN0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwoKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50Q2hhcnNldERldGVjdG9yIGdldERvY3VtZW50RW5jb2RpbmdEZXRlY3RvcigpIHsKLQkJaWYgKGZEb2N1bWVudEVuY29kaW5nRGV0ZWN0b3IgPT0gbnVsbCkgewotCQkJZkRvY3VtZW50RW5jb2RpbmdEZXRlY3RvciA9IG5ldyBYTUxEb2N1bWVudENoYXJzZXREZXRlY3RvcigpOwotCQl9Ci0JCXJldHVybiBmRG9jdW1lbnRFbmNvZGluZ0RldGVjdG9yOwotCX0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgZ2V0UGFyc2VyKCkgewotCQlyZXR1cm4gbmV3IFhNTFNvdXJjZVBhcnNlcigpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihJRmlsZSBmaWxlKSB7Ci0JCVN0cmluZyBkZWxpbWl0ZXIgPSBDb250ZW50VHlwZUVuY29kaW5nUHJlZmVyZW5jZXMuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQkJaWYgKGRlbGltaXRlciA9PSBudWxsKQotCQkJZGVsaW1pdGVyID0gc3VwZXIuZ2V0UHJlZmVycmVkTmV3TGluZURlbGltaXRlcihmaWxlKTsKLQkJcmV0dXJuIGRlbGltaXRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNwZWNEZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCS8vIGJ5IGRlZmF1bHQsIFVURi04IGFzIHBlciBYTUwgc3BlYwotCQlmaW5hbCBTdHJpbmcgZW5jID0gIlVURi04IjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gZW5jOwotCX0KLQotCXByb3RlY3RlZCBJRW5jb2RlZERvY3VtZW50IG5ld0VuY29kZWREb2N1bWVudCgpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudCBzdHJ1Y3R1cmVkRG9jdW1lbnQgPSBTdHJ1Y3R1cmVkRG9jdW1lbnRGYWN0b3J5LmdldE5ld1N0cnVjdHVyZWREb2N1bWVudEluc3RhbmNlKGdldFBhcnNlcigpKTsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudCBpbnN0YW5jZW9mIEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQkoKEJhc2ljU3RydWN0dXJlZERvY3VtZW50KSBzdHJ1Y3R1cmVkRG9jdW1lbnQpLnNldFJlUGFyc2VyKG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpKTsKLQkJfQotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50OwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MRG9jdW1lbnRMb2FkZXIoKTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9FbWJlZGRlZFhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MzAwNGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL0VtYmVkZGVkWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuRW1iZWRkZWRUeXBlSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5KU1BDYXBhYmxlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUw7Ci0KLQotcHVibGljIGNsYXNzIEVtYmVkZGVkWE1MIGltcGxlbWVudHMgRW1iZWRkZWRUeXBlSGFuZGxlciB7Ci0KLQlwcml2YXRlIHN0YXRpYyBMaXN0IHN1cHBvcnRlZE1pbWVUeXBlczsKLQlwdWJsaWMgU3RyaW5nIENvbnRlbnRUeXBlSURfRW1iZWRkZWRYTUwgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmNvbnRlbnR0eXBlLkVtYmVkZGVkWE1MIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ29uc3RydWN0b3IgZm9yIEVtYmVkZGVkWE1MLgotCSAqLwotCXB1YmxpYyBFbWJlZGRlZFhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNnZXRBZGFwdGVyRmFjdG9yaWVzKCkKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRBZGFwdGVyRmFjdG9yaWVzKCkgewotCQlMaXN0IGZhY3RvcmllcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZmFjdG9yaWVzLmFkZChuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwoKSk7Ci0JCS8vIGZhY3Rvcmllcy5hZGRBbGwoUGx1Z2luQ29udHJpYnV0ZWRGYWN0b3J5UmVhZGVyLmdldEluc3RhbmNlKCkuZ2V0RmFjdG9yaWVzKHRoaXMpKTsKLQkJcmV0dXJuIGZhY3RvcmllczsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIEVtYmVkZGVkQ29udGVudFR5cGUjZ2V0RmFtaWx5SWQoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RmFtaWx5SWQoKSB7Ci0JCXJldHVybiBNb2RlbEhhbmRsZXJGb3JYTUwuQXNzb2NpYXRlZENvbnRlbnRUeXBlSUQ7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0U3VwcG9ydGVkTWltZVR5cGVzKCkgewotCQlpZiAoc3VwcG9ydGVkTWltZVR5cGVzID09IG51bGwpIHsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCXN1cHBvcnRlZE1pbWVUeXBlcy5hZGQoImFwcGxpY2F0aW9uL3htbCIpOyAvLyROT04tTkxTLTEkCi0JCQlzdXBwb3J0ZWRNaW1lVHlwZXMuYWRkKCJ0ZXh0L3htbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIHN1cHBvcnRlZE1pbWVUeXBlczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRmFjdG9yeVJlZ2lzdHJ5KEZhY3RvcnlSZWdpc3RyeSByZWdpc3RyeSkgewotCQkvL1RPRE86IGluaXRpYWxpemUKLQl9Ci0KLQkvKgotCSAqIEBzZWUgRW1iZWRkZWRDb250ZW50VHlwZSNpbml0aWFsaXplUGFyc2VyKFJlZ2lvblBhcnNlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplUGFyc2VyKEpTUENhcGFibGVQYXJzZXIgcGFyc2VyKSB7Ci0JCS8vIG5vdGhpbmcgdG8gaW5pdGlhbGl6ZSBmb3IgInB1cmUiIFhNTAotCQkvLyBjb21wYXJlIHdpdGggWEhUTUwKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgRW1iZWRkZWRUeXBlSGFuZGxlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBFbWJlZGRlZFhNTCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHVuaW5pdGlhbGl6ZUZhY3RvcnlSZWdpc3RyeShGYWN0b3J5UmVnaXN0cnkgcmVnaXN0cnkpIHsKLQkJLy8gVE9ETzogbmVlZCB0byB1bmRvIGFueXRoaW5nIHdlIGRpZCBpbiBpbml0aWFsaXplCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB1bmluaXRpYWxpemVQYXJzZXIoSlNQQ2FwYWJsZVBhcnNlciBwYXJzZXIpIHsKLQkJLy8gbmVlZCB0byB1bmRvIGFueXRoaW5nIHdlIGRpZCBpbiBpbml0aWFsaXplCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlTWltZVR5cGUoU3RyaW5nIG1pbWVUeXBlKSB7Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZ2V0U3VwcG9ydGVkTWltZVR5cGVzKCkuY29udGFpbnMobWltZVR5cGUpOwotCQlpZighY2FuSGFuZGxlKSB7Ci0JCQljYW5IYW5kbGUgPSBtaW1lVHlwZS5lbmRzV2l0aCgiK3htbCIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIGNhbkhhbmRsZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVsaGFuZGxlci9Nb2RlbEhhbmRsZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzc3YTJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL01vZGVsSGFuZGxlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxoYW5kbGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmRvY3VtZW50LklEb2N1bWVudENoYXJzZXREZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLkFic3RyYWN0TW9kZWxIYW5kbGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklNb2RlbEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuWE1MRG9jdW1lbnRDaGFyc2V0RGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmVuY29kaW5nLlhNTERvY3VtZW50TG9hZGVyOwotCi0KLS8qKgotICogUHJvdmlkZXMgZ2VuZXJpYyBYTUwgbW9kZWwgaGFuZGxpbmcuIEl0IGlzIGFsc28gbWFya2VkIGFzIHRoZSBkZWZhdWx0Ci0gKiBjb250ZW50IHR5cGUgaGFuZGxlci4gVGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogZGVmYXVsdC4KLSAqLwotcHVibGljIGNsYXNzIE1vZGVsSGFuZGxlckZvclhNTCBleHRlbmRzIEFic3RyYWN0TW9kZWxIYW5kbGVyIGltcGxlbWVudHMgSU1vZGVsSGFuZGxlciB7Ci0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlzdGF0aWMgU3RyaW5nIEFzc29jaWF0ZWRDb250ZW50VHlwZUlEID0gIm9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiOyAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogTmVlZHMgdG8gbWF0Y2ggd2hhdCdzIGluIHBsdWdpbiByZWdpc3RyeS4gSW4gZmFjdCwgY2FuIGJlIG92ZXJ3cml0dGVuCi0JICogYXQgcnVuIHRpbWUgd2l0aCB3aGF0J3MgaW4gcmVnaXN0cnkhIChzbyBzaG91bGQgbmV2ZXIgYmUgJ2ZpbmFsJykKLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgTW9kZWxIYW5kbGVySUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLm1vZGVsaGFuZGxlciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBNb2RlbEhhbmRsZXJGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7CQotCQlzZXRJZChNb2RlbEhhbmRsZXJJRCk7Ci0JCXNldEFzc29jaWF0ZWRDb250ZW50VHlwZUlkKEFzc29jaWF0ZWRDb250ZW50VHlwZUlEKTsKLQl9Ci0KLQlwdWJsaWMgSURvY3VtZW50TG9hZGVyIGdldERvY3VtZW50TG9hZGVyKCkgewotCQlyZXR1cm4gbmV3IFhNTERvY3VtZW50TG9hZGVyKCk7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudENoYXJzZXREZXRlY3RvciBnZXRFbmNvZGluZ0RldGVjdG9yKCkgewotCQlyZXR1cm4gbmV3IFhNTERvY3VtZW50Q2hhcnNldERldGVjdG9yKCk7Ci0JfQotCi0JcHVibGljIElNb2RlbExvYWRlciBnZXRNb2RlbExvYWRlcigpIHsKLQkJcmV0dXJuIG5ldyBYTUxNb2RlbExvYWRlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvWE1MTW9kZWxMb2FkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxoYW5kbGVyL1hNTE1vZGVsTG9hZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MjliYjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbGhhbmRsZXIvWE1MTW9kZWxMb2FkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVsaGFuZGxlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5JRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkFic3RyYWN0TW9kZWxMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklNb2RlbExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuRGVidWdBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRE9NTW9kZWxJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5YTUxEb2N1bWVudExvYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZS5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotCi0KLS8qKgotICogVGhpcyBjbGFzcyByZWFkcyBhbiBYTUwgZmlsZSBhbmQgY3JlYXRlcyBhbiBYTUwgU3RydWN0dXJlZCBNb2RlbC4KLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhNTE1vZGVsTG9hZGVyIGV4dGVuZHMgQWJzdHJhY3RNb2RlbExvYWRlciB7Ci0KLQkvLwlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSX0VOQ09ESU5HID0gImVuY29kaW5nIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogWE1MTG9hZGVyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTE1vZGVsTG9hZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEFkYXB0ZXJGYWN0b3JpZXMoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCQlmYWN0b3J5ID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCgpOwotCQlyZXN1bHQuYWRkKGZhY3RvcnkpOwotCQkvLyBEb2VzIFhNTCBuZWVkIHByb3BhZ2F0aW5nIGFkYXB0ZXI/IE9yIGp1c3QgSlNQPwotCQlmYWN0b3J5ID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCk7Ci0JCXJlc3VsdC5hZGQoZmFjdG9yeSk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElEb2N1bWVudExvYWRlciBnZXREb2N1bWVudExvYWRlcigpIHsKLQkJaWYgKGRvY3VtZW50TG9hZGVySW5zdGFuY2UgPT0gbnVsbCkgewotCQkJZG9jdW1lbnRMb2FkZXJJbnN0YW5jZSA9IG5ldyBYTUxEb2N1bWVudExvYWRlcigpOwotCQl9Ci0JCXJldHVybiBkb2N1bWVudExvYWRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBJTW9kZWxMb2FkZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBuZXcgWE1MTW9kZWxMb2FkZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCgpIHsKLQkJcmV0dXJuIG5ldyBET01Nb2RlbEltcGwoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmVMb2FkQWRhcHQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJc3VwZXIucHJlTG9hZEFkYXB0KHN0cnVjdHVyZWRNb2RlbCk7Ci0JCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHN0cnVjdHVyZWRNb2RlbDsKLQkJLy8gaWYgdGhlcmUgaXMgYSBtb2RlbCBpbiB0aGUgYWRhcHRlciwgdGhpcyB3aWxsIGFkYXB0IGl0IHRvCi0JCS8vIGZpcnN0IG5vZGUuIEFmdGVyIHRoYXQgdGhlIFByb3BhZ2F0aW5nQWRhdGVyIHNwcmVhZHMgb3ZlciB0aGUKLQkJLy8gY2hpbGRyZW4gYmVpbmcKLQkJLy8gY3JlYXRlZC4gRWFjaCB0aW1lIHRoYXQgaGFwcGVuZHMsIGEgc2lkZSBlZmZlY3QgaXMgdG8KLQkJLy8gYWxzbyAic3ByZWFkIiBzcHJlY2lmaWMgcmVnaXN0ZXJlZCBhZGFwdGVycywKLQkJLy8gdGhleSB0d28gY2FuIHByb3BpZ2F0ZSBpcyBuZWVkZWQuCi0JCSgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCi0JCWlmIChEZWJ1Zy5kZWJ1Z05vdGlmaWNhdGlvbkFuZEV2ZW50cykgewotCQkJUHJvcGFnYXRpbmdBZGFwdGVyIHByb3BhZ2F0aW5nQWRhcHRlciA9IChQcm9wYWdhdGluZ0FkYXB0ZXIpICgoSU5vZGVOb3RpZmllcikgZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKSkuZ2V0QWRhcHRlckZvcihQcm9wYWdhdGluZ0FkYXB0ZXIuY2xhc3MpOwotCQkJcHJvcGFnYXRpbmdBZGFwdGVyLmFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KG5ldyBEZWJ1Z0FkYXB0ZXJGYWN0b3J5KCkpOwotCQl9Ci0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZTM2MDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvckVtYmVkZGVkWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTCBleHRlbmRzIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTCB7Ci0KLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JFbWJlZGRlZFhNTC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yRW1iZWRkZWRYTUwoKSB7Ci0JCXN1cGVyKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlRG9jdW1lbnRNYW5hZ2VyKENNRG9jdW1lbnRNYW5hZ2VyIG1ncikgewotCQlzdXBlci5jb25maWd1cmVEb2N1bWVudE1hbmFnZXIobWdyKTsKLQkJbWdyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BU1lOQ19MT0FELCB0cnVlKTsKLQl9Ci0JCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgImZvcmNlcyIgYSBuZXcgb25lIHRvIGFsd2F5cyBiZSBjcmVhdGVkL3JldHVybmVkLCAKLQkgKiBub3QgImNhY2hlZCIgb24gdGhlIG5vZGUuIFRoYXQgc2VlbXMgaW5jb3JyZWN0LiAKLQkgKiBTaW1wbHkgdXNpbmcgc2hvdWxkUmVnaXN0ZXJGYWxzZSBzaG91bGQgd29yaywgZXhjZXB0LCAKLQkgKiB0aGVyZSBtaWdodCBoYXZlIGJlZW4gb25lIHRoZXJlIHRoYXQgc29tZW9uZSBlbHNlIGFscmVhZHkgCi0JICogZXhwbGljaXRseSBwdXQgdGhlcmUsIHNvIHRoaXMgaXMgb25seSB3YXkgSSBrbm93IHRvIAotCSAqIG92ZXJyaWRlIHRoYXQuIEVzcGVjaWFsbHkgY29tcGxpY2F0ZWQgaGVyZSBzaW5jZSBhIG51bWJlcgotCSAqIG9mIGFkYXB0ZXJzIGFyZSBmb3IgTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MuCi0JICovCi0JcHVibGljIElOb2RlQWRhcHRlciBhZGFwdChJTm9kZU5vdGlmaWVyIG9iamVjdCkgewotCQlyZXR1cm4gYWRhcHROZXcob2JqZWN0KTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1YjVjMDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxTdGF0ZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5zc2Vtb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQotCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MIGV4dGVuZHMgQWJzdHJhY3RBZGFwdGVyRmFjdG9yeSB7Ci0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeUFkYXB0ZXJJbXBsIG1vZGVsUXVlcnlBZGFwdGVySW1wbDsKLQlJU3RydWN0dXJlZE1vZGVsIHN0YXRlTm90aWZpZXIgPSBudWxsOwotCXByaXZhdGUgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MKCkgewotCQl0aGlzKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQkvKioKLQkgKiBNb2RlbFF1ZXJ5QWRhcHRlckZhY3RvcnlGb3JYTUwgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRlcktleQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLk9iamVjdAotCSAqIEBwYXJhbSByZWdpc3RlckFkYXB0ZXJzCi0JICogICAgICAgICAgICBib29sZWFuCi0JICovCi0JcHJvdGVjdGVkIE1vZGVsUXVlcnlBZGFwdGVyRmFjdG9yeUZvclhNTChPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCWNsYXNzIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSU1vZGVsU3RhdGVMaXN0ZW5lciB7Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbEFib3V0VG9CZUNoYW5nZWQoSVN0cnVjdHVyZWRNb2RlbCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCX0KLQotCQkvKioKLQkJICogQHNlZSBJTW9kZWxTdGF0ZUxpc3RlbmVyI21vZGVsQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJfQotCi0JCS8qKgotCQkgKiBAc2VlIElNb2RlbFN0YXRlTGlzdGVuZXIjbW9kZWxEaXJ0eVN0YXRlQ2hhbmdlZChJU3RydWN0dXJlZE1vZGVsLAotCQkgKiAgICAgIGJvb2xlYW4pCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtb2RlbERpcnR5U3RhdGVDaGFuZ2VkKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIGJvb2xlYW4gaXNEaXJ0eSkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlRGVsZXRlZChJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZURlbGV0ZWQoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl9Ci0KLQkJLyoqCi0JCSAqIEBzZWUgSU1vZGVsU3RhdGVMaXN0ZW5lciNtb2RlbFJlc291cmNlTW92ZWQoSVN0cnVjdHVyZWRNb2RlbCwKLQkJICogICAgICBJU3RydWN0dXJlZE1vZGVsKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbW9kZWxSZXNvdXJjZU1vdmVkKElTdHJ1Y3R1cmVkTW9kZWwgb2xkTW9kZWwsIElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJCXN0YXRlTm90aWZpZXIucmVtb3ZlTW9kZWxTdGF0ZUxpc3RlbmVyKHRoaXMpOwotCQkJc3RhdGVOb3RpZmllciA9IG5ld01vZGVsOwotCQkJdXBkYXRlUmVzb2x2ZXIoc3RhdGVOb3RpZmllcik7Ci0JCQlzdGF0ZU5vdGlmaWVyLmFkZE1vZGVsU3RhdGVMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIG1vZGVsQWJvdXRUb0JlUmVpbml0aWFsaXplZChJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RlbFJlaW5pdGlhbGl6ZWQoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCXVwZGF0ZVJlc29sdmVyKHN0cnVjdHVyZWRNb2RlbCk7Ci0KLQkJfQotCi0KLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBhdXRvTG9hZENNKCkgewotCQkvLyB1bnRpbCB0aGUgZXhpc3RlbmNlIG9mIGEgQ01Eb2N1bWVudFJlcXVlc3RlckZhY3RvcnkgdG8gY3JlYXRlIHRoZQotCQkvLyBsb2FkIHJlcXVlc3RzLAotCQkvLyByZXR1cm4gdHJ1ZQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVEb2N1bWVudE1hbmFnZXIoQ01Eb2N1bWVudE1hbmFnZXIgbWdyKSB7Ci0JCS8vIHRoaXMgZGVwZW5kcyBvbiB0aGVyZSBiZWluZyBhIENNRG9jdW1lbnRSZXF1ZXN0ZXJGYWN0b3J5IGluc3RhbGxlZAotCQltZ3Iuc2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCwgYXV0b0xvYWRDTSgpKTsKLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCi0JCXJldHVybiBuZXcgTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogY3JlYXRlQWRhcHRlciBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQotCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheUluZm8pCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLmNyZWF0ZUFkYXB0ZXIiICsgdGFyZ2V0KTsgLy8kTk9OLU5MUy0xJAotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsID09IG51bGwpIHsKLQkJCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIHRhcmdldDsKLQkJCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0geG1sTm9kZS5nZXRNb2RlbCgpOwotCQkJCXN0YXRlTm90aWZpZXIgPSB4bWxOb2RlLmdldE1vZGVsKCk7Ci0JCQkJc3RhdGVOb3RpZmllci5hZGRNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0JCQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG51bGw7Ci0JCQkJU3RyaW5nIG1vZGVsQmFzZUxvY2F0aW9uID0gbW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCk7Ci0JCQkJaWYgKG1vZGVsQmFzZUxvY2F0aW9uICE9IG51bGwpIHsKLQkJCQkJRmlsZSBmaWxlID0gbmV3IFBhdGgobW9kZWxCYXNlTG9jYXRpb24pLnRvRmlsZSgpOwotCQkJCQlpZiAoZmlsZS5leGlzdHMoKSkgewotCQkJCQkJYmFzZUxvY2F0aW9uID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCUlQYXRoIGJhc2VQYXRoID0gbmV3IFBhdGgobW9kZWxCYXNlTG9jYXRpb24pOwotCQkJCQkJSVBhdGggZGVyaXZlZFBhdGggPSBudWxsOwotCQkJCQkJaWYgKGJhc2VQYXRoLnNlZ21lbnRDb3VudCgpID4gMSkKLQkJCQkJCQlkZXJpdmVkUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShiYXNlUGF0aCkuZ2V0TG9jYXRpb24oKTsKLQkJCQkJCWVsc2UKLQkJCQkJCQlkZXJpdmVkUGF0aCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0TG9jYXRpb24oKS5hcHBlbmQoYmFzZVBhdGgpOwotCQkJCQkJaWYgKGRlcml2ZWRQYXRoICE9IG51bGwpIHsKLQkJCQkJCQliYXNlTG9jYXRpb24gPSBkZXJpdmVkUGF0aC50b1N0cmluZygpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1Zy5kaXNwbGF5SW5mbykKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCItLS0tLS0tLS0tLS0tLS0tTW9kZWxRdWVyeUFkYXB0ZXJGYWN0b3J5Rm9yWE1MLi4uIGJhc2VMb2NhdGlvbiA6ICIgKyBiYXNlTG9jYXRpb24pOyAvLyROT04tTkxTLTEkCi0KLQkJCQlDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlID0gbmV3IENNRG9jdW1lbnRDYWNoZSgpOwotCQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IG51bGw7Ci0JCQkJVVJJUmVzb2x2ZXIgaWRSZXNvbHZlciA9IG51bGw7Ci0KLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGlzcGxheUluZm8pCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiKioqKioqKipYTUxNb2RlbFF1ZXJ5SW1wbCIpOyAvLyROT04tTkxTLTEkCi0JCQkJb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSBtb2RlbC5nZXRSZXNvbHZlcigpOwotCQkJCWlmIChiYXNlTG9jYXRpb24gIT0gbnVsbCB8fCByZXNvbHZlciAhPSBudWxsKSB7Ci0JCQkJCWlkUmVzb2x2ZXIgPSBuZXcgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIoYmFzZUxvY2F0aW9uLCByZXNvbHZlcik7Ci0JCQkJfQotCQkJCW1vZGVsUXVlcnkgPSBuZXcgWE1MTW9kZWxRdWVyeUltcGwoY21Eb2N1bWVudENhY2hlLCBpZFJlc29sdmVyKTsKLQotCQkJCS8vIGNzIHRvZG8uLi4KLQkJCQkvLyBmb3Igbm93IHdlIGNyZWF0ZSBhIENNRG9jdW1lbnRDYWNoZSBvbiBhICdwZXIgZWRpdG9yJyBiYXNpcwotCQkJCS8vIGluIHRoZSBmdXR1cmUgd2UgbmVlZCB0byBzdXBwb3J0IGEgQ01Eb2N1bWVudENhY2hlIHRoYXQgaXMKLQkJCQkvLyBzaGFyZWQgYmV0d2VlbiBlZGl0b3JzCi0JCQkJLy8gbnNkIGNvbW1lbnQ6IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgZGVwZW5kaW5nIG9uCi0JCQkJQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyID0gbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQljb25maWd1cmVEb2N1bWVudE1hbmFnZXIoZG9jdW1lbnRNYW5hZ2VyKTsKLQkJCQl9Ci0JCQkJbW9kZWxRdWVyeUFkYXB0ZXJJbXBsID0gbmV3IE1vZGVsUXVlcnlBZGFwdGVySW1wbChjbURvY3VtZW50Q2FjaGUsIG1vZGVsUXVlcnksIGlkUmVzb2x2ZXIpOwotCQkJfQotCQl9Ci0JCXJldHVybiBtb2RlbFF1ZXJ5QWRhcHRlckltcGw7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlpZiAoc3RhdGVOb3RpZmllciAhPSBudWxsKQotCQkJc3RhdGVOb3RpZmllci5yZW1vdmVNb2RlbFN0YXRlTGlzdGVuZXIoZ2V0SW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKSk7Ci0JCXN0YXRlTm90aWZpZXIgPSBudWxsOwotCQlpZiAobW9kZWxRdWVyeUFkYXB0ZXJJbXBsICE9IG51bGwpCi0JCQltb2RlbFF1ZXJ5QWRhcHRlckltcGwucmVsZWFzZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZVJlc29sdmVyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJU3RyaW5nIGJhc2VMb2NhdGlvbiA9IG1vZGVsLmdldEJhc2VMb2NhdGlvbigpOwotCQlJRmlsZSBiYXNlRmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShuZXcgUGF0aChtb2RlbC5nZXRCYXNlTG9jYXRpb24oKSkpOwotCQlpZiAoYmFzZUZpbGUgIT0gbnVsbCkgewotCQkJYmFzZUxvY2F0aW9uID0gYmFzZUZpbGUuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpOwotCQl9Ci0JCW1vZGVsUXVlcnlBZGFwdGVySW1wbC5zZXRJZFJlc29sdmVyKG5ldyBYTUxDYXRhbG9nSWRSZXNvbHZlcihiYXNlTG9jYXRpb24sIG1vZGVsLmdldFJlc29sdmVyKCkpKTsKLQl9Ci0KLQlwcml2YXRlIGZpbmFsIEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyIGdldEludGVybmFsTW9kZWxTdGF0ZUxpc3RlbmVyKCkgewotCQlpZiAoaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPT0gbnVsbCkgewotCQkJaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIgPSBuZXcgSW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXIoKTsKLQkJfQotCQlyZXR1cm4gaW50ZXJuYWxNb2RlbFN0YXRlTGlzdGVuZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L01vZGVsUXVlcnlVdGlsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3NTcyZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvTW9kZWxRdWVyeVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnkuTW9kZWxRdWVyeUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYXNzb2NpYXRlIE1vZGVsUXVlcnkgKGFuZCByZWxhdGVkIGRhdGEpIHdpdGggYQotICogRG9jdW1lbnQgKG9yIElTdHJ1Y3R1cmVkTW9kZWwpLgotICovCi1wdWJsaWMgY2xhc3MgTW9kZWxRdWVyeVV0aWwgewotCi0JcHVibGljIHN0YXRpYyBDTURvY3VtZW50Q2FjaGUgZ2V0Q01Eb2N1bWVudENhY2hlKERvY3VtZW50IG5vZGUpIHsKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihub2RlKTsKLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVyICE9IG51bGwgPyBtb2RlbFF1ZXJ5QWRhcHRlci5nZXRDTURvY3VtZW50Q2FjaGUoKSA6IG51bGw7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBVUklSZXNvbHZlciBnZXRJZFJlc29sdmVyKERvY3VtZW50IG5vZGUpIHsKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihub2RlKTsKLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVyICE9IG51bGwgPyBtb2RlbFF1ZXJ5QWRhcHRlci5nZXRJZFJlc29sdmVyKCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KERvY3VtZW50IG5vZGUpIHsKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgbW9kZWxRdWVyeUFkYXB0ZXIgPSBnZXRNb2RlbFF1ZXJ5QWRhcHRlcihub2RlKTsKLQkJcmV0dXJuIG1vZGVsUXVlcnlBZGFwdGVyICE9IG51bGwgPyBtb2RlbFF1ZXJ5QWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTW9kZWxRdWVyeSBnZXRNb2RlbFF1ZXJ5KElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJaWYgKCghKG1vZGVsIGluc3RhbmNlb2YgSURPTU1vZGVsKSkgfHwgbW9kZWwgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlyZXR1cm4gZ2V0TW9kZWxRdWVyeSgoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCkpOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgTW9kZWxRdWVyeUFkYXB0ZXIgZ2V0TW9kZWxRdWVyeUFkYXB0ZXIoRG9jdW1lbnQgbm9kZSkgewotCQlNb2RlbFF1ZXJ5QWRhcHRlciByZXN1bHQgPSBudWxsOwotCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBub2RlOwotCQkJcmVzdWx0ID0gKE1vZGVsUXVlcnlBZGFwdGVyKSBub3RpZmllci5nZXRBZGFwdGVyRm9yKE1vZGVsUXVlcnlBZGFwdGVyLmNsYXNzKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTENhdGFsb2dJZFJlc29sdmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk4YWE0My4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnk7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLQotCi0vLyBUT0RPIGNzIDogcmVtb3ZlIHRoaXMgY2xhc3MgYW5kIHV0aWxpemUgdGhlIGNvbW1vbiBVUklSZXNvbHZlciBkaXJlY3RseQotLy8gV2UgbmVlZCB0byB1cGRhdGUgc29tZSBvZiB0aGUgTW9kZWxRdWVyeSByZWxhdGVkIGNvZGUgdG8gcGFzcyB0aGUKLS8vICdiYXNlTG9jYXRpb24nIHRocnUKLS8vIGFuZCB0aGVuIHRoZXJlJ2xsIGJlIG5vZGUgbmVlZCBmb3IgdGhpcyBjbGFzcy4KLS8vIAotcHVibGljIGNsYXNzIFhNTENhdGFsb2dJZFJlc29sdmVyIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlciB7Ci0JcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZUxvY2F0aW9uOwotCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyOwotCi0JcHJpdmF0ZSBYTUxDYXRhbG9nSWRSZXNvbHZlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcml2YXRlIFhNTENhdGFsb2dJZFJlc29sdmVyKFN0cmluZyByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIFhNTENhdGFsb2dJZFJlc29sdmVyKFN0cmluZyByZXNvdXJjZUxvY2F0aW9uLCBVUklSZXNvbHZlciB1cmlyZXNvbHZlcikgewotCQl0aGlzKHJlc291cmNlTG9jYXRpb24pOwotLy8gdGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIHR3byBudWxsIGFyZ3VtZW50cy4KLS8vIElmIHNvLCBhbiBhc3NlcnQgd2lsbCBvY2N1ciBsYXRlciB3aGVuIHJlc29sdmUgaXMgY2FsbGVkLiAKLS8vIFNlZSAxMTgzNzEgWE1MQ2F0YWxvZ0lkUmVzb2x2ZXIjcmVzb2x2ZSB0aHJvd3MgQXNzZXJ0aW9uRmFpbGVkRXhjZXB0aW9uCi0vLwotLy8gYnV0LCBJJ20gbm90IGVuYWJsaW5nIHRoaXMgY2hlY2sgbm93IGR1ZSB0byBsYXRlbmVzcyBpbiBjeWNsZS4gCQkKLS8vCQlpZiAocmVzb3VyY2VMb2NhdGlvbiA9PSBudWxsICYmIHVyaXJlc29sdmVyID09IG51bGwpIHsKLS8vCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYm90aCBsb2NhdGlvbiBhbmQgcmVzb2x2ZXIgY2FuIG5vdCBiZSBudWxsIik7Ci0vLwkJfQotCQl0aGlzLnVyaXJlc29sdmVyID0gdXJpcmVzb2x2ZXI7Ci0JfQotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSByZXNvdXJjZUxvY2F0aW9uLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIFN0cmluZwotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFJlc291cmNlTG9jYXRpb24oKSB7Ci0JCVN0cmluZyBsb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCWlmIChsb2NhdGlvbiA9PSBudWxsKSB7Ci0JCQlpZiAodXJpcmVzb2x2ZXIgIT0gbnVsbCkKLQkJCQlsb2NhdGlvbiA9IHVyaXJlc29sdmVyLmdldEZpbGVCYXNlTG9jYXRpb24oKTsKLQkJfQotCQlyZXR1cm4gbG9jYXRpb247Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIGJhc2UsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0KLQkJU3RyaW5nIHJlc3VsdCA9IHN5c3RlbUlkOwotCQlpZiAoYmFzZSA9PSBudWxsKSB7Ci0JCQliYXNlID0gZ2V0UmVzb3VyY2VMb2NhdGlvbigpOwotCQkJLy8gYnVnIDExNzMyMCwgZW5zdXJlIGJhc2UgVVJJIGlzICdwcm90b2NhbCcgcXVhbGlmaWVkIGJlZm9yZQotCQkJLy8gcGFzc2luZyBpdCB0aHJ1IHRvIFVSSVJlc29sdmVyCi0JCQkvLyBidWcgMTE3NDI0LCB3ZSBzaG91bGQgYmUgYWJsZSB0byBhc3N1bWUgdGhhdCB0aGUgYmFzZSBsb2NhdGlvbgotCQkJLy8gaXMgbm9uLW51bGwKLQkJCUFzc2VydC5pc05vdE51bGwoYmFzZSwgIkJhc2UgbG9jYXRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgbm9uIG51bGwuIik7IC8vJE5PTi1OTFMtMSQKLQkJCWJhc2UgPSBVUklIZWxwZXIuYWRkSW1wbGllZEZpbGVQcm90b2NvbChiYXNlKTsKLQkJfQotCQlyZXN1bHQgPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmUoYmFzZSwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHJlc29sdmVQaHlzaWNhbExvY2F0aW9uKFN0cmluZyBiYXNlTG9jYXRpb24sIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIGxvZ2ljYWxMb2NhdGlvbikgewotCQkvLyBUaGlzIGNsYXNzIHNob3VsZCBuZXZlciBiZSBjYWxsZWQgdG8gcGVyZm9ybSBwaHlzaWNhbCByZXNvbHV0aW9uIQotCQkvLyBJZiBpdCBkb2VzIHdlIHNob3VsZCBsb2cgaXQgYXMgYW4gZXJyb3IKLQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1JfREVCVUcsICJYTUxDYXRhbG9nSURSZXNvbHZlci5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbigpIGNhbGxlZCB1bmV4cGVjdGVkbHkiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gbG9naWNhbExvY2F0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNDcwYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9tb2RlbHF1ZXJ5L1hNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5YTUxBc3NvY2lhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci0KLS8qKgotICogWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIKLSAqIAotICogVGhpcyBhZGRlZCBhbmQvb3IgbWFkZSBwdWJsaWMgc3BlY2lmaWNhbGx5IGZvciBleHBlcmltZW50YXRpb24uIEl0IHdpbGwKLSAqIGNoYW5nZSBhcyB0aGlzIGZ1bmN0aW9uYWxpdHkgYmVjb21lcyBBUEkuIFNlZQotICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExOTA4NAotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxNb2RlbFF1ZXJ5QXNzb2NpYXRpb25Qcm92aWRlciBleHRlbmRzIFhNTEFzc29jaWF0aW9uUHJvdmlkZXIgewotCi0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXI7Ci0KLQlwdWJsaWMgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCXN1cGVyKGNhY2hlKTsKLQkJdGhpcy5pZFJlc29sdmVyID0gaWRSZXNvbHZlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmVHcmFtbWFyVVJJKERvY3VtZW50IGRvY3VtZW50LCBTdHJpbmcgcHVibGljSWQsIFN0cmluZyBzeXN0ZW1JZCkgewotCi0JCS8vIENTIDogc3Bvb2t5IGNvZGUgYWxlcnQhCi0JCS8vIHRoaXMgbG9vayByZWFsbHkgc3RyYW5nZSBiZWNhdXNlIHdlJ3JlIHBhc3NpbmcgbnVsbCBpbiBhcyB0aGUgZmlyc3QKLQkJLy8gYXJndW1lbnQKLQkJLy8gaG93ZXZlciB3ZSdyZSBhc3N1bWluZyB0aGUgdXNlIG9mIGEgJ2Z1ZGdlZCcgVVJJUmVzb2x2ZXIgdGhhdCBrbm93cwotCQkvLyB0aGUKLQkJLy8gY29ycmVjdCBiYXNlTG9jYXRpb24gYW5kIHdpbGwgY2FsbCB0byB0aGUgVVJJUmVzb2x2ZXIgZnJhbWV3b3JrCi0JCS8vIHByb3Blcmx5Ci0KLQkJLy8gQ1MgOiBub3RlIHRoYXQgd2Ugc2hvdWxkIG5ldmVyIGNhbGwgcmVzb2x2ZVBoeXNpY2FsIGF0IHRoaXMgcG9pbnQuCi0JCS8vIFBoeXNpY2FsIHJlc29sdXRpb24gc2hvdWxkIG9ubHkgb2NjdXIgd2hlbiB3ZSdyZSBpbnRlcmVzdGluZyB0bwotCQkvLyBvcGVuaW5nIHRoZSBhY3R1YWwgc3RyZWFtLgotCQkvLyBUaGUgQ01Eb2N1bWVudEZhY3RvcnkgaW1wbGVtZW50YXRpb24gd291bGQgYmUgcmVzcG9uc2libGUgZm9yCi0JCS8vIGNhbGxpbmcgcmVzb2x2ZVBoeXNpY2FsLgotCQkvLyBBbGwgd2UgbmVlZCB0byBkbyBoZXJlIGlzIHJldHVybiBhICdsb2dpY2FsJyBVUkkKLQotCQlpZiAoaWRSZXNvbHZlciA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCXJldHVybiBpZFJlc29sdmVyLnJlc29sdmUobnVsbCwgcHVibGljSWQsIHN5c3RlbUlkKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL21vZGVscXVlcnkvWE1MTW9kZWxRdWVyeUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTkyYTc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvbW9kZWxxdWVyeS9YTUxNb2RlbFF1ZXJ5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeTsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuTW9kZWxRdWVyeUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb3ZhYmxlTW9kZWxRdWVyeTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MTW9kZWxRdWVyeUltcGwgZXh0ZW5kcyBNb2RlbFF1ZXJ5SW1wbCBpbXBsZW1lbnRzIE1vdmFibGVNb2RlbFF1ZXJ5IHsKLQotCXByb3RlY3RlZCBDTURvY3VtZW50Q2FjaGUgZkNhY2hlID0gbnVsbDsKLQotCXB1YmxpYyBYTUxNb2RlbFF1ZXJ5SW1wbChDTURvY3VtZW50Q2FjaGUgY2FjaGUsIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJc3VwZXIobmV3IFhNTE1vZGVsUXVlcnlBc3NvY2lhdGlvblByb3ZpZGVyKGNhY2hlLCBpZFJlc29sdmVyKSk7Ci0JCWZDYWNoZSA9IGNhY2hlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgTW92YWJsZU1vZGVsUXVlcnkjc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpIHsKLQkJbW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIgPSBuZXcgWE1MTW9kZWxRdWVyeUFzc29jaWF0aW9uUHJvdmlkZXIoZkNhY2hlLCBuZXdJZFJlc29sdmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9CbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgwMjA2Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9CbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLklCbG9ja2VkU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLXB1YmxpYyBjbGFzcyBCbG9ja1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBleHRlbmRzIEJhc2ljU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGltcGxlbWVudHMgSUJsb2NrZWRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gewotCi0JcHJpdmF0ZSBTdHJpbmcgcGFydGl0aW9uVHlwZTsKLQotCS8qKgotCSAqIEEgQmxvY2tTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgbGlrZSBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JICogYnV0IGlzIHRoZSByZXN1bHQgb2YgYSAiYmxvY2sgc2NhbiIuCi0JICovCi0JcHVibGljIEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFydGl0aW9uVHlwZSgpIHsKLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gbnVsbCkgewotCQkJLy8gZXZlbnR1YWxseSBjYW4gbG9vayB1cCBzdXJyb3VuZGluZ1RhZyBuYW1lCi0JCQkvLyBidXQgdGhpcyBmaWVsZCBpcyBwcmltYXJpbHkgZW50ZW5kZWQgZm9yIGZ1dHVyZQotCQkJLy8gZXh0ZW5zaWJpbGl0eS4gVGhpcyBtYXkgY2hhbmdlLgotCQkJLy9wYXJ0aXRpb25UeXBlID0gIm9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS4iICsgdGFnbmFtZTsKLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uVHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJ0aXRpb25UeXBlKFN0cmluZyBwYXJ0aXRpb25UeXBlKSB7Ci0JCXRoaXMucGFydGl0aW9uVHlwZSA9IHBhcnRpdGlvblR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvQ29udGV4dFJlZ2lvbkNvbnRhaW5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2RjN2U3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0NvbnRleHRSZWdpb25Db250YWluZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbGxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlRleHRSZWdpb25MaXN0SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBDb250ZXh0UmVnaW9uQ29udGFpbmVyIGltcGxlbWVudHMgSVRleHRSZWdpb25Db250YWluZXIgewotCXByb3RlY3RlZCBpbnQgbGVuZ3RoOwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbkNvbGxlY3Rpb24gcGFyZW50OwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbkxpc3QgcmVnaW9uczsKLQlwcm90ZWN0ZWQgaW50IHN0YXJ0OwotCXByb3RlY3RlZCBpbnQgdGV4dExlbmd0aDsKLQlwcm90ZWN0ZWQgU3RyaW5nIHR5cGU7Ci0KLQlwdWJsaWMgQ29udGV4dFJlZ2lvbkNvbnRhaW5lcigpIHsKLQkJc3VwZXIoKTsKLQkJcmVnaW9ucyA9IG5ldyBUZXh0UmVnaW9uTGlzdEltcGwoKTsKLQotCX0KLQotCS8qKgotCSAqIHRoZXNlICJkZWVwIiBwYXJlbnRpbmcgaXMgbm90IG5vcm1hbCwgYnV0IGp1c3QgaW4gY2FzZS4KLQkgKi8KLQlwcml2YXRlIElTdHJ1Y3R1cmVkRG9jdW1lbnQgX2dldFBhcmVudERvY3VtZW50KCkgewotCQkvLyBnbyB1cCBlbm91Z2ggcGFyZW50cyB0byBnZXQgdG8gZG9jdW1lbnQKLQkJSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudCA9IGdldFBhcmVudCgpOwotCQl3aGlsZSAoIShwYXJlbnQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJLy8gd291bGQgYmUgYW4gZXJyb3Igbm90IHRvIGJlIGNvbnRhaW5lciwgYnV0Ci0JCQkvLyB3b24ndCBjaGVjayBmb3IgaXQgbm93Ci0JCQlwYXJlbnQgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBwYXJlbnQpLmdldFBhcmVudCgpOwotCQl9Ci0JCXJldHVybiAoKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHBhcmVudCkuZ2V0UGFyZW50RG9jdW1lbnQoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdChpbnQgaSkgewotCi0JCXN0YXJ0ICs9IGk7Ci0JCS8vIEkgZXJyb25lb3VzbHkgYWRkZWQgbGVuZ3RoIGFuZCB0ZXh0TGVuZ3RoCi0JCS8vIFRPRE86IG1heSB3YW50IHRvIHJlbmFtZSB0aGlzIG1ldGhvZCB0byBhZGp1c3RTdGFydAotCQkvL2xlbmd0aCArPSBpOwotCQkvL3RleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlsZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlzdGFydCArPSBpOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQl0ZXh0TGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjb250YWluc09mZnNldChpbnQgaSkgewotCi0JCXJldHVybiBnZXRTdGFydE9mZnNldCgpIDw9IGkgJiYgaSA8IGdldEVuZE9mZnNldCgpOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGNvbnRhaW5zT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSA8PSBvZmZzZXQgJiYgb2Zmc2V0IDwgZ2V0RW5kT2Zmc2V0KGNvbnRhaW5lZFJlZ2lvbik7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMganVzdCB0byBlcXVhdGUgcG9zaXRpb25zLiBjbGllbnRzIG1heSAod2lsbCBwcm9iYWJseSkKLQkgKiBzdGlsbCBuZWVkIHRvIG1ha2UgY2FsbHMgdG8gZXF1YXRlIHJlZ2lvbnMsIHBhcmVudCwgZXRjLgotCSAqLwotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJc3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJbGVuZ3RoID0gcmVnaW9uLmdldExlbmd0aCgpOwotCQl0ZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIHN0YXJ0ICsgbGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KCkgewotCQkvLyBvdXIgc3RhcnRPZmZzZXQgdGFrZSBpbnRvIGFjY291bnQgb3VyIHBhcmVudCwgYW5kIG91ciBzdGFydAotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoKSArIGdldExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kT2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQlyZXR1cm4gZ2V0U3RhcnRPZmZzZXQoY29udGFpbmVkUmVnaW9uKSArIGNvbnRhaW5lZFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0Rmlyc3RSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRSZWdpb25zKCkuZ2V0KDApOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RnVsbFRleHQoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKS5nZXRGdWxsVGV4dCh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEZ1bGxUZXh0KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJLy8gTXVzdCBiZSBwcm94aWVkIGhlcmUgc2luY2UgYVJlZ2lvbiBzaG91bGQgYWx3YXlzIGJlIGEgY2hpbGQgb2YKLQkJLy8gKnRoaXMqIGNvbnRhaW5lciBhbmQgaW5kZXhlZCBmcm9tCi0JCS8vIHRoaXMgY29udGFpbmVyJ3Mgb2Zmc2V0Ci0JCXJldHVybiBwYXJlbnQuZ2V0RnVsbFRleHQoKS5zdWJzdHJpbmcoc3RhcnQgKyBhUmVnaW9uLmdldFN0YXJ0KCksIHN0YXJ0ICsgYVJlZ2lvbi5nZXRFbmQoKSk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGdldExhc3RSZWdpb24oKSB7Ci0JCXJldHVybiBnZXRSZWdpb25zKCkuZ2V0KGdldFJlZ2lvbnMoKS5zaXplKCkgLSAxKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGxlbmd0aDsKLQl9Ci0KLQotCXB1YmxpYyBpbnQgZ2V0TnVtYmVyT2ZSZWdpb25zKCkgewotCQlyZXR1cm4gZ2V0UmVnaW9ucygpLnNpemUoKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb25Db2xsZWN0aW9uIGdldFBhcmVudCgpIHsKLQkJcmV0dXJuIHBhcmVudDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcGFyYW1ldGVyIG9mZnNldCByZWZlcnMgdG8gdGhlIG92ZXJhbGwgb2Zmc2V0IGluIHRoZSBkb2N1bWVudC4KLQkgKi8KLQlwdWJsaWMgSVRleHRSZWdpb24gZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoaW50IG9mZnNldCkgewotCQlJVGV4dFJlZ2lvbiByZXN1bHQgPSBudWxsOwotCQlpZiAocmVnaW9ucyAhPSBudWxsKSB7Ci0JCQkvLyB0cmFuc2Zvcm0gdGhlIHJlcXVlc3RlZCBvZmZzZXQgdG8gdGhlICJzY2FsZSIgdGhhdAotCQkJLy8gcmVnaW9ucyBhcmUgc3RvcmVkIGluLCB3aGljaCBhcmUgYWxsIHJlbGF0aXZlIHRvIHRoZQotCQkJLy8gc3RhcnQgcG9pbnQuCi0JCQkvL2ludCB0cmFuc2Zvcm1lZE9mZnNldCA9IG9mZnNldCAtIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkvLwotCQkJaW50IGxlbmd0aCA9IGdldFJlZ2lvbnMoKS5zaXplKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gZ2V0UmVnaW9ucygpLmdldChpKTsKLQkJCQlpZiAob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJyZWdpb24ocykgaW4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjo6Z2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQ6ICIgKyByZWdpb24pOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlcXVlc3RlZCBvZmZzZXQ6ICIgKyBvZmZzZXQpOyAvLyROT04tTkxTLTEkCi0JCQkJCS8vU3lzdGVtLm91dC5wcmludGxuKCIgdHJhbnNmb3JtZWRPZmZzZXQ6ICIgKwotCQkJCQkvLyB0cmFuc2Zvcm1lZE9mZnNldCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIHN0YXJ0OiAiICsgcmVnaW9uLmdldFN0YXJ0KCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiBlbmQ6ICIgKyByZWdpb24uZ2V0RW5kKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgICAgIHJlZ2lvbiB0eXBlOiAiICsgcmVnaW9uLmdldFR5cGUoKSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAgICAgcmVnaW9uIGNsYXNzOiAiICsgcmVnaW9uLmdldENsYXNzKCkpOyAvLyROT04tTkxTLTEkCi0KLQkJCQl9Ci0JCQkJaWYgKChnZXRTdGFydE9mZnNldChyZWdpb24pIDw9IG9mZnNldCkgJiYgKG9mZnNldCA8IGdldEVuZE9mZnNldChyZWdpb24pKSkgewotCQkJCQlyZXN1bHQgPSByZWdpb247Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbkxpc3QgZ2V0UmVnaW9ucygpIHsKLQkJcmV0dXJuIHJlZ2lvbnM7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIHN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKSB7Ci0JCXJldHVybiBnZXRQYXJlbnQoKS5nZXRTdGFydE9mZnNldCgpICsgZ2V0U3RhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KElUZXh0UmVnaW9uIGNvbnRhaW5lZFJlZ2lvbikgewotCQkvLyBpdCBpcyBhbiBlcnJvciB0byBwYXNzIG51bGwgdG8gdGhpcyBtZXRob2QKLQkJLy8gSVNTVUU6IG5lZWQgYmV0dGVyICJzcGVjIiBvbiBlcnJvciBiZWhhdmlvcjogCi0JCS8vIGZvciBub3cgd2lsbCByZXR1cm4gemVybyBhcyB0aGlzIHdpbGwgcm91Z2hseSAKLQkJLy8gd29yayBmb3Igc29tZSBjYXNlcyAoYW5kIGF2b2lkIE5QRSkuCi0JCWlmIChjb250YWluZWRSZWdpb24gPT0gbnVsbCkgewotCQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCk7Ci0JCX0KLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgKyBjb250YWluZWRSZWdpb24uZ2V0U3RhcnQoKTsKLQl9Ci0KLQkvKioKLQkgKiBzYW1lIGFzIGdldEZ1bGxUZXh0IGZvciB0aGlzIHJlZ2lvbiB0eXBlIC4uLiBkbyB3ZSBuZWVkIHRvIHRha2Ugd2hpdGUKLQkgKiBzcGFjZSBvZmY/Ci0JICovCi0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQl0cnkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudCBwYXJlbnREb2N1bWVudCA9IF9nZXRQYXJlbnREb2N1bWVudCgpOwotCQkJcmVzdWx0ID0gcGFyZW50RG9jdW1lbnQuZ2V0KHN0YXJ0LCBsZW5ndGgpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKCJwcm9ncmFtIGVycm9yOiB1bnJlYWNoYWJsZSBleGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uIGFSZWdpb24pIHsKLQkJLy8gTXVzdCBiZSBwcm94aWVkIGhlcmUgc2luY2UgYVJlZ2lvbiBzaG91bGQgYWx3YXlzIGJlIGEgY2hpbGQgb2YKLQkJLy8gKnRoaXMqIGNvbnRhaW5lciBhbmQgaW5kZXhlZCBmcm9tCi0JCS8vIHRoaXMgY29udGFpbmVyJ3Mgb2Zmc2V0Ci0JCXJldHVybiBwYXJlbnQuZ2V0VGV4dCgpLnN1YnN0cmluZyhzdGFydCArIGFSZWdpb24uZ2V0U3RhcnQoKSwgc3RhcnQgKyBhUmVnaW9uLmdldFRleHRFbmQoKSk7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gc3RhcnQgKyB0ZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldCgpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKTsKLQkJLy8gb3VyIHN0YXJ0T2Zmc2V0IHRha2UgaW50byBhY2NvdW50IG91ciBwYXJlbnQsIGFuZCBvdXIgc3RhcnQKLQkJLy8gKHBhKSAxMC80IGNoYW5nZWQgdG8gYmUgYmFzZWQgb24gdGV4dCBlbmQKLQkJLy8gICAgICAgICAgIGl0IHVzZWQgdG8gcmV0dXJuIGluY29ycmVjdCB2YWx1ZSBmb3IgZW1iZWRkZWQgcmVnaW9uIGNvbnRhaW5lcnMKLQkJLy8KLQotCQkvLyBUT0RPIENSSVRJQ0FMIC0tIG5lZWQgdG8gcmUtd29yayB0aGlzIHdvcmsgYXJvdW5kLCBzbyBkb2Vzbid0Ci0JCS8vIGRlcGVuZCBvbiBYTUxSZWdpb25Db250ZXh0Ci0JCS8vCQkvLyB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgMjI2ODIzLy8vLy8vLy8vLy8KLQkJLy8JCWZvciAoaW50IGkgPSByZWdpb25zLnNpemUoKSAtIDE7IGkgPj0gMCAmJiByZWdpb24uZ2V0VHlwZSgpID09Ci0JCS8vIFhNTFJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0U7IGktLSkKLQkJLy8JCQlyZWdpb24gPSAoSVRleHRSZWdpb24pIHJlZ2lvbnMuZ2V0KGkpOwotCQkvLwkJLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLQkJcmV0dXJuIGdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0VGV4dEVuZCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZE9mZnNldChJVGV4dFJlZ2lvbiBjb250YWluZWRSZWdpb24pIHsKLQkJaW50IHJlc3VsdCA9IDA7Ci0JCWlmIChyZWdpb25zICE9IG51bGwpIHsKLQkJCWludCBsZW5ndGggPSBnZXRSZWdpb25zKCkuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgewotCQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IGdldFJlZ2lvbnMoKS5nZXQoaSk7Ci0JCQkJaWYgKHJlZ2lvbiA9PSBjb250YWluZWRSZWdpb24pIHsKLQkJCQkJcmVzdWx0ID0gZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSArIHJlZ2lvbi5nZXRUZXh0RW5kKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIHRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMZW5ndGgoaW50IGkpIHsKLQkJbGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQoSVRleHRSZWdpb25Db2xsZWN0aW9uIHBhcmVudFJlZ2lvbikgewotCQlwYXJlbnQgPSBwYXJlbnRSZWdpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVnaW9ucyhJVGV4dFJlZ2lvbkxpc3QgY29udGFpbmVkUmVnaW9ucykgewotCQlyZWdpb25zID0gY29udGFpbmVkUmVnaW9uczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRTdGFydChpbnQgaSkgewotCQlzdGFydCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dExlbmd0aChpbnQgaSkgewotCQl0ZXh0TGVuZ3RoID0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRUeXBlKFN0cmluZyBzdHJpbmcpIHsKLQkJdHlwZSA9IHN0cmluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlTdHJpbmcgY2xhc3NOYW1lID0gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gIkNvbnRhaW5lciEhISAiICsgc2hvcnRDbGFzc05hbWUgKyAiLS0+ICIgKyBnZXRUeXBlKCkgKyAiOiAiICsgZ2V0U3RhcnQoKSArICItIiArIGdldFRleHRFbmQoKSArIChnZXRUZXh0RW5kKCkgIT0gZ2V0RW5kKCkgPyAoIi8iICsgZ2V0RW5kKCkpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQgLy8kTk9OLU5MUy02JAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCW9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50IHJlc3VsdCA9IG51bGw7Ci0JCS8vIEZVVFVSRV9UT19ETzogbmVlZCB0byBpbXBsZW1lbnQgcmVnaW9uIGxldmVsIHBhcnNpbmcgaW4KLQkJLy8gSVRleHRSZWdpb25Db250YWluZXI6OnVwZGF0ZU1vZGVsCi0JCS8vIG5ldmVyIGJlaW5nIGNhbGxlZD8KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ludFN0YWNrLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9JbnRTdGFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODcxNTQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL0ludFN0YWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLQotCi0vKgotICogCi0gKiBBIG5vbi1yZXNpemFibGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciBvZiBqYXZhLnV0aWwuU3RhY2ssIGJ1dAotICogZGlyZWN0bHkgZm9yIHRoZSA8Y29kZT4gaW50ZWdlciA8L2NvZGU+IHByaW1pdGl2ZS4KLSAqLwotaW1wb3J0IGphdmEudXRpbC5FbXB0eVN0YWNrRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSW50U3RhY2sgewotCXByaXZhdGUgaW50W10gbGlzdCA9IG51bGw7Ci0KLQlwcml2YXRlIGludCBzaXplID0gMDsKLQotCXB1YmxpYyBJbnRTdGFjaygpIHsKLQkJdGhpcygxMDApOwotCX0KLQotCXB1YmxpYyBJbnRTdGFjayhpbnQgbWF4ZGVwdGgpIHsKLQkJc3VwZXIoKTsKLQkJbGlzdCA9IG5ldyBpbnRbbWF4ZGVwdGhdOwotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gZW1wdHkoKSB7Ci0JCXJldHVybiBzaXplID09IDA7Ci0JfQotCi0JcHVibGljIGludCBnZXQoaW50IHNsb3QpIHsKLQkJcmV0dXJuIGxpc3Rbc2xvdF07Ci0JfQotCi0Jdm9pZCBpbml0aWFsaXplKCkgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspCi0JCQlsaXN0W2ldID0gLTE7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdpdGhvdXQgcmVtb3ZpbmcgaXQKLQkgKiAKLQkgKiBAcmV0dXJuIGludCBhdCB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogQGV4Y2VwdGlvbiBFbXB0eVN0YWNrRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgd2hlbiBlbXB0eS4KLQkgKi8KLQlwdWJsaWMgaW50IHBlZWsoKSB7Ci0JCWlmIChzaXplID09IDApCi0JCQl0aHJvdyBuZXcgRW1wdHlTdGFja0V4Y2VwdGlvbigpOwotCQlyZXR1cm4gbGlzdFtzaXplIC0gMV07Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgaW50IGF0IHRoZSB0b3Agb2YgdGhlIHN0YWNrCi0JICogCi0JICogQHJldHVybiBpbnQgYXQgdGhlIHRvcCBvZiB0aGlzIHN0YWNrLgotCSAqIEBleGNlcHRpb24gRW1wdHlTdGFja0V4Y2VwdGlvbgotCSAqICAgICAgICAgICAgICAgIHdoZW4gZW1wdHkuCi0JICovCi0JcHVibGljIGludCBwb3AoKSB7Ci0JCWludCB2YWx1ZSA9IHBlZWsoKTsKLQkJbGlzdFtzaXplIC0gMV0gPSAtMTsKLQkJc2l6ZS0tOwotCQlyZXR1cm4gdmFsdWU7Ci0JfQotCi0JLyoqCi0JICogUHVzaGVzIGFuIGl0ZW0gb250byB0aGUgdG9wIG9mIHRoaXMgc3RhY2suCi0JICogCi0JICogQHBhcmFtIG5ld1ZhbHVlIC0KLQkgKiAgICAgICAgICAgIHRoZSBpbnQgdG8gYmUgcHVzaGVkIG9udG8gdGhpcyBzdGFjay4KLQkgKiBAcmV0dXJuIHRoZSA8Y29kZT5uZXdWYWx1ZTwvY29kZT4gYXJndW1lbnQuCi0JICovCi0JcHVibGljIGludCBwdXNoKGludCBuZXdWYWx1ZSkgewotCQlpZiAoc2l6ZSA9PSBsaXN0Lmxlbmd0aCkgewotCQkJdGhyb3cgbmV3IFN0YWNrT3ZlcmZsb3dFcnJvcigpOwotCQl9Ci0JCWxpc3Rbc2l6ZSsrXSA9IG5ld1ZhbHVlOwotCQlyZXR1cm4gbmV3VmFsdWU7Ci0JfQotCi0JcHVibGljIGludCBzaXplKCkgewotCQlyZXR1cm4gbGlzdC5sZW5ndGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvUmVnaW9uRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvUmVnaW9uRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjA4OTM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1JlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci0KLQotcHVibGljIGNsYXNzIFJlZ2lvbkZhY3RvcnkgewotCi0JcHVibGljIFJlZ2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4ocGFyZW50LCBjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oSVRleHRSZWdpb25Db250YWluZXIgcGFyZW50LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBjcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJLy9uZXdSZWdpb24uc2V0UGFyZW50KHBhcmVudCk7Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXJldHVybiB0aGlzLmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIG51bGwpOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBuZXcgQ29udGV4dFJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQotCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MMTBOYW1lcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MMTBOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTVkZjMwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTDEwTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU5MiArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjQgb24gNy81LzA1IDE6NDAgQU0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgYSBzY2FubmVyIGdlbmVyYXRlZCBieSAKLSAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuamZsZXguZGUvIj5KRmxleDwvYT4gMS40Ci0gKiBvbiA3LzUvMDUgMTo0MCBBTSBmcm9tIHRoZSBzcGVjaWZpY2F0aW9uIGZpbGUKLSAqIDx0dD5EOi9idWlsZHMvV29ya3NwYWNlcy9QdXJlSGVhZFdUUF9NNy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvRGV2VGltZVN1cHBvcnQvSGVhZFBhcnNlcnMvWE1MMTBOYW1lcy5qRmxleDwvdHQ+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBYTUwxME5hbWVzIHsKLQotICAvKiogVGhpcyBjaGFyYWN0ZXIgZGVub3RlcyB0aGUgZW5kIG9mIGZpbGUgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFlZRU9GID0gLTE7Ci0KLSAgLyoqIGluaXRpYWwgc2l6ZSBvZiB0aGUgbG9va2FoZWFkIGJ1ZmZlciAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfQlVGRkVSU0laRSA9IDIwNDg7Ci0KLSAgLyoqIGxleGljYWwgc3RhdGVzICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBZWUlOSVRJQUwgPSAwOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfQ01BUF9QQUNLRUQgPSAKLSAgICAiXDExXDBcMVwxXDFcMlwyXDBcMVwxXDIyXDBcMVwxXDE0XDBcMVwwXDJcMCIrCi0gICAgIlwxMlwwXDFcM1w2XDBcMzJcM1w0XDBcMVwzXDFcMFwzMlwzXDc0XDBcMVwwIisKLSAgICAiXDEwXDBcMjdcM1wxXDBcMzdcM1wxXDBcNzJcM1wyXDBcMTNcM1wyXDBcMTBcMyIrCi0gICAgIlwxXDBcNjVcM1wxXDBcMTA0XDNcMTFcMFw0NFwzXDNcMFwyXDNcNFwwXDM2XDMiKwotICAgICJcNzBcMFwxMzFcM1wyMlwwXDdcM1wxNlwwXDJcMFw1NlwwXDEwNlwwXDMyXDBcMlwwIisKLSAgICAiXDQ0XDBcMVwzXDFcMFwzXDNcMVwwXDFcM1wxXDBcMjRcM1wxXDBcNTRcMyIrCi0gICAgIlwxXDBcN1wzXDNcMFwxXDNcMVwwXDFcM1wxXDBcMVwzXDFcMFwxXDMiKwotICAgICJcMVwwXDIyXDNcMTVcMFwxNFwzXDFcMFwxMDJcM1wxXDBcMTRcM1wxXDBcNDRcMyIrCi0gICAgIlwxXDBcNFwwXDExXDBcNjVcM1wyXDBcMlwzXDJcMFwyXDNcM1wwXDM0XDMiKwotICAgICJcMlwwXDEwXDNcMlwwXDJcM1w2N1wwXDQ2XDNcMlwwXDFcM1w3XDBcNDZcMyIrCi0gICAgIlwxMlwwXDIxXDBcMVwwXDI3XDBcMVwwXDNcMFwxXDBcMVwwXDFcMFwyXDAiKwotICAgICJcMVwwXDFcMFwxM1wwXDMzXDNcNVwwXDNcM1w1NlwwXDMyXDNcNVwwXDFcMCIrCi0gICAgIlwxMlwzXDEwXDBcMTVcMFwxMlwwXDZcMFwxXDBcMTA3XDNcMlwwXDVcM1wxXDAiKwotICAgICJcMTdcM1wxXDBcNFwzXDFcMFwxXDNcMTdcMFwyXDNcMlwwXDFcMFw0XDAiKwotICAgICJcMlwwXDEyXDBcdTAyMDdcMFwzXDBcMVwwXDY1XDNcMlwwXDFcMFwxXDNcMjBcMCIrCi0gICAgIlwzXDBcNFwwXDNcMFwxMlwzXDJcMFwyXDBcMTJcMFwyMVwwXDNcMFwxXDAiKwotICAgICJcMTBcM1wyXDBcMlwzXDJcMFwyNlwzXDFcMFw3XDNcMVwwXDFcM1wzXDAiKwotICAgICJcNFwzXDJcMFwxXDBcMVwwXDdcMFwyXDBcMlwwXDJcMFwzXDBcMTFcMCIrCi0gICAgIlwxXDBcNFwwXDJcM1wxXDBcM1wzXDJcMFwyXDBcMTJcMFwyXDNcMjBcMCIrCi0gICAgIlwxXDBcMlwwXDZcM1w0XDBcMlwzXDJcMFwyNlwzXDFcMFw3XDNcMVwwIisKLSAgICAiXDJcM1wxXDBcMlwzXDFcMFwyXDNcMlwwXDFcMFwxXDBcNVwwXDRcMCIrCi0gICAgIlwyXDBcMlwwXDNcMFwxM1wwXDRcM1wxXDBcMVwzXDdcMFwxMlwwXDJcMCIrCi0gICAgIlwzXDNcMTRcMFwzXDBcMVwwXDdcM1wxXDBcMVwzXDFcMFwzXDNcMVwwIisKLSAgICAiXDI2XDNcMVwwXDdcM1wxXDBcMlwzXDFcMFw1XDNcMlwwXDFcMFwxXDMiKwotICAgICJcMTBcMFwxXDBcM1wwXDFcMFwzXDBcMjJcMFwxXDNcNVwwXDEyXDBcMjFcMCIrCi0gICAgIlwzXDBcMVwwXDEwXDNcMlwwXDJcM1wyXDBcMjZcM1wxXDBcN1wzXDFcMCIrCi0gICAgIlwyXDNcMlwwXDRcM1wyXDBcMVwwXDFcM1w2XDBcM1wwXDJcMFwyXDAiKwotICAgICJcM1wwXDEwXDBcMlwwXDRcMFwyXDNcMVwwXDNcM1w0XDBcMTJcMFwyMlwwIisKLSAgICAiXDJcMFwxXDBcNlwzXDNcMFwzXDNcMVwwXDRcM1wzXDBcMlwzXDFcMCIrCi0gICAgIlwxXDNcMVwwXDJcM1wzXDBcMlwzXDNcMFwzXDNcM1wwXDEwXDNcMVwwIisKLSAgICAiXDNcM1w0XDBcNVwwXDNcMFwzXDBcMVwwXDRcMFwxMVwwXDFcMFwxN1wwIisKLSAgICAiXDExXDBcMjFcMFwzXDBcMVwwXDEwXDNcMVwwXDNcM1wxXDBcMjdcM1wxXDAiKwotICAgICJcMTJcM1wxXDBcNVwzXDRcMFw3XDBcMVwwXDNcMFwxXDBcNFwwXDdcMCIrCi0gICAgIlwyXDBcMTFcMFwyXDNcNFwwXDEyXDBcMjJcMFwyXDBcMVwwXDEwXDNcMVwwIisKLSAgICAiXDNcM1wxXDBcMjdcM1wxXDBcMTJcM1wxXDBcNVwzXDRcMFw3XDBcMVwwIisKLSAgICAiXDNcMFwxXDBcNFwwXDdcMFwyXDBcN1wwXDFcM1wxXDBcMlwzXDRcMCIrCi0gICAgIlwxMlwwXDIyXDBcMlwwXDFcMFwxMFwzXDFcMFwzXDNcMVwwXDI3XDNcMVwwIisKLSAgICAiXDIwXDNcNFwwXDZcMFwyXDBcM1wwXDFcMFw0XDBcMTFcMFwxXDBcMTBcMCIrCi0gICAgIlwyXDNcNFwwXDEyXDBcMjIxXDBcNTZcM1wxXDBcMVwzXDFcMFwyXDNcN1wwIisKLSAgICAiXDVcMFw2XDNcMVwwXDEwXDBcMVwwXDEyXDBcNDdcMFwyXDNcMVwwXDFcMyIrCi0gICAgIlwyXDBcMlwzXDFcMFwxXDNcMlwwXDFcM1w2XDBcNFwzXDFcMFw3XDMiKwotICAgICJcMVwwXDNcM1wxXDBcMVwzXDFcMFwxXDNcMlwwXDJcM1wxXDBcMlwzIisKLSAgICAiXDFcMFwxXDNcMVwwXDJcM1w2XDBcMVwwXDJcMFwxXDNcMlwwXDVcMyIrCi0gICAgIlwxXDBcMVwwXDFcMFw2XDBcMlwwXDEyXDBcNzZcMFwyXDBcNlwwXDEyXDAiKwotICAgICJcMTNcMFwxXDBcMVwwXDFcMFwxXDBcMVwwXDRcMFwyXDBcMTBcM1wxXDAiKwotICAgICJcNDFcM1w3XDBcMjRcMFwxXDBcNlwwXDRcMFw2XDBcMVwwXDFcMFwxXDAiKwotICAgICJcMjVcMFwzXDBcN1wwXDFcMFwxXDBcMzQ2XDBcNDZcM1wxMlwwXDQ3XDNcMTFcMCIrCi0gICAgIlwxXDNcMVwwXDJcM1wxXDBcM1wzXDFcMFwxXDNcMVwwXDJcM1wxXDAiKwotICAgICJcNVwzXDUxXDBcMVwzXDFcMFwxXDNcMVwwXDFcM1wxM1wwXDFcM1wxXDAiKwotICAgICJcMVwzXDFcMFwxXDNcM1wwXDJcM1wzXDBcMVwzXDVcMFwzXDNcMVwwIisKLSAgICAiXDFcM1wxXDBcMVwzXDFcMFwxXDNcMVwwXDFcM1wzXDBcMlwzXDNcMCIrCi0gICAgIlwyXDNcMVwwXDFcM1w1MFwwXDFcM1wxMVwwXDFcM1wyXDBcMVwzXDJcMCIrCi0gICAgIlwyXDNcN1wwXDJcM1wxXDBcMVwzXDFcMFw3XDNcNTBcMFwxXDNcNFwwIisKLSAgICAiXDFcM1wxMFwwXDFcM1x1MGMwNlwwXDIzNFwzXDRcMFwxMzJcM1w2XDBcMjZcM1wyXDAiKwotICAgICJcNlwzXDJcMFw0NlwzXDJcMFw2XDNcMlwwXDEwXDNcMVwwXDFcM1wxXDAiKwotICAgICJcMVwzXDFcMFwxXDNcMVwwXDM3XDNcMlwwXDY1XDNcMVwwXDdcM1wxXDAiKwotICAgICJcMVwzXDNcMFwzXDNcMVwwXDdcM1wzXDBcNFwzXDJcMFw2XDNcNFwwIisKLSAgICAiXDE1XDNcNVwwXDNcM1wxXDBcN1wzXDMyM1wwXDE1XDBcNFwwXDFcMFwxMDRcMCIrCi0gICAgIlwxXDNcM1wwXDJcM1wyXDBcMVwzXDEyMVwwXDNcM1x1MGU4MlwwXDFcMFwxXDAiKwotICAgICJcMVwzXDMxXDBcMTFcM1w2XDBcMVwwXDVcMFwxM1wwXDEyNFwzXDRcMFwyXDAiKwotICAgICJcMlwwXDJcMFwyXDBcMTMyXDNcMVwwXDNcMFw2XDBcNTBcM1x1MWNkM1wwXHU1MWE2XDMiKwotICAgICJcdTBjNWFcMFx1MmJhNFwzXHUyODVjXDAiOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFtdIFpaX0NNQVAgPSB6elVucGFja0NNYXAoWlpfQ01BUF9QQUNLRUQpOwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBERkEgc3RhdGVzIHRvIGFjdGlvbiBzd2l0Y2ggbGFiZWxzLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFtdIFpaX0FDVElPTiA9IHp6VW5wYWNrQWN0aW9uKCk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFpaX0FDVElPTl9QQUNLRURfMCA9Ci0gICAgIlwxXDBcMVwxXDFcMlw0XDEiOwotCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB6elVucGFja0FjdGlvbigpIHsKLSAgICBpbnQgW10gcmVzdWx0ID0gbmV3IGludFs3XTsKLSAgICBpbnQgb2Zmc2V0ID0gMDsKLSAgICBvZmZzZXQgPSB6elVucGFja0FjdGlvbihaWl9BQ1RJT05fUEFDS0VEXzAsIG9mZnNldCwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IHp6VW5wYWNrQWN0aW9uKFN0cmluZyBwYWNrZWQsIGludCBvZmZzZXQsIGludCBbXSByZXN1bHQpIHsKLSAgICBpbnQgaSA9IDA7ICAgICAgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSBvZmZzZXQ7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIGludCBsID0gcGFja2VkLmxlbmd0aCgpOwotICAgIHdoaWxlIChpIDwgbCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gcmVzdWx0W2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBhIHN0YXRlIHRvIGEgcm93IGluZGV4IGluIHRoZSB0cmFuc2l0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgW10gWlpfUk9XTUFQID0genpVbnBhY2tSb3dNYXAoKTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgWlpfUk9XTUFQX1BBQ0tFRF8wID0KLSAgICAiXDBcMFwwXDRcMFwxMFwwXDE0XDBcMjBcMFwyNFwwXDMwIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tSb3dNYXAoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbN107Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tSb3dNYXAoWlpfUk9XTUFQX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja1Jvd01hcChTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IG9mZnNldDsgIC8qIGluZGV4IGluIHVucGFja2VkIGFycmF5ICovCi0gICAgaW50IGwgPSBwYWNrZWQubGVuZ3RoKCk7Ci0gICAgd2hpbGUgKGkgPCBsKSB7Ci0gICAgICBpbnQgaGlnaCA9IHBhY2tlZC5jaGFyQXQoaSsrKSA8PCAxNjsKLSAgICAgIHJlc3VsdFtqKytdID0gaGlnaCB8IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICB9Ci0gICAgcmV0dXJuIGo7Ci0gIH0KLQotICAvKiogCi0gICAqIFRoZSB0cmFuc2l0aW9uIHRhYmxlIG9mIHRoZSBERkEKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9UUkFOUyBbXSA9IHsKLSAgICAxLCAxLCAtMSwgMiwgLTEsIC0xLCAtMSwgLTEsIDIsIDMsIAotICAgIDQsIDIsIDIsIDMsIDQsIDUsIC0xLCA0LCA0LCA2LCAKLSAgICA1LCA1LCA0LCA1LCA2LCA2LCAtMSwgNiwgCi0gIH07Ci0KLSAgLyogZXJyb3IgY29kZXMgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFpaX1VOS05PV05fRVJST1IgPSAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgWlpfTk9fTUFUQ0ggPSAxOwotICAvL3ByaXZhdGUgc3RhdGljIGZpbmFsIGludCBaWl9QVVNIQkFDS18yQklHID0gMjsKLQotICAvKiBlcnJvciBtZXNzYWdlcyBmb3IgdGhlIGNvZGVzIGFib3ZlICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9FUlJPUl9NU0dbXSA9IHsKLSAgICAiVW5rb3duIGludGVybmFsIHNjYW5uZXIgZXJyb3IiLAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCi0gIH07Ci0KLSAgLyoqCi0gICAqIFpaX0FUVFJJQlVURVthU3RhdGVdIGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGVzIG9mIHN0YXRlIDxjb2RlPmFTdGF0ZTwvY29kZT4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBbXSBaWl9BVFRSSUJVVEUgPSB6elVucGFja0F0dHJpYnV0ZSgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBaWl9BVFRSSUJVVEVfUEFDS0VEXzAgPQotICAgICJcMVwwXDFcMTFcNVwxIjsKLQotICBwcml2YXRlIHN0YXRpYyBpbnQgW10genpVbnBhY2tBdHRyaWJ1dGUoKSB7Ci0gICAgaW50IFtdIHJlc3VsdCA9IG5ldyBpbnRbN107Ci0gICAgaW50IG9mZnNldCA9IDA7Ci0gICAgb2Zmc2V0ID0genpVbnBhY2tBdHRyaWJ1dGUoWlpfQVRUUklCVVRFX1BBQ0tFRF8wLCBvZmZzZXQsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCB6elVucGFja0F0dHJpYnV0ZShTdHJpbmcgcGFja2VkLCBpbnQgb2Zmc2V0LCBpbnQgW10gcmVzdWx0KSB7Ci0gICAgaW50IGkgPSAwOyAgICAgICAvKiBpbmRleCBpbiBwYWNrZWQgc3RyaW5nICAqLwotICAgIGludCBqID0gb2Zmc2V0OyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICBpbnQgbCA9IHBhY2tlZC5sZW5ndGgoKTsKLSAgICB3aGlsZSAoaSA8IGwpIHsKLSAgICAgIGludCBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGludCB2YWx1ZSA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGRvIHJlc3VsdFtqKytdID0gdmFsdWU7IHdoaWxlICgtLWNvdW50ID4gMCk7Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLyoqIHRoZSBpbnB1dCBkZXZpY2UgKi8KLSAgcHJpdmF0ZSBqYXZhLmlvLlJlYWRlciB6elJlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB6elN0YXRlOwotCi0gIC8qKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0gIHByaXZhdGUgaW50IHp6TGV4aWNhbFN0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHp6QnVmZmVyW10gPSBuZXcgY2hhcltaWl9CVUZGRVJTSVpFXTsKLQotICAvKiogdGhlIHRleHRwb3NpdGlvbiBhdCB0aGUgbGFzdCBhY2NlcHRpbmcgc3RhdGUgKi8KLSAgcHJpdmF0ZSBpbnQgenpNYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHp6UHVzaGJhY2tQb3M7Ci0KLSAgLyoqIHRoZSBjdXJyZW50IHRleHQgcG9zaXRpb24gaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6ekN1cnJlbnRQb3M7Ci0KLSAgLyoqIHN0YXJ0UmVhZCBtYXJrcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgaW4gdGhlIGJ1ZmZlciAqLwotICBwcml2YXRlIGludCB6elN0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHp6RW5kUmVhZDsKLQotICAvKiogbnVtYmVyIG9mIG5ld2xpbmVzIGVuY291bnRlcmVkIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0gIC8vcHJpdmF0ZSBpbnQgeXlsaW5lOwotCi0gIC8qKiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLSAgLy9wcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvL3ByaXZhdGUgaW50IHl5Y29sdW1uOwotCi0gIC8qKiAKLSAgICogenpBdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vcHJpdmF0ZSBib29sZWFuIHp6QXRCT0wgPSB0cnVlOwotCi0gIC8qKiB6ekF0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGlzIGF0IHRoZSBFT0YgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6QXRFT0Y7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0JICovCi0JcHVibGljIFhNTDEwTmFtZXMoKSB7Ci0JCXRoaXMuenpSZWFkZXIgPSBudWxsOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWRYTUwxME5hbWUoU3RyaW5nIHN0cmluZ1RvQ2hlY2spIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJeXlyZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoc3RyaW5nVG9DaGVjaykpOwotCQl0cnkgewotCQkJcmVzdWx0ID0gaXNWYWxpZFhNTDEwTmFtZSgpOwotCQl9Ci0JCWNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLQkJCS8vIHNob3VsZCBiZSBpbXBvc3NpYmxlIHdpdGggc3RyaW5ncywgYnV0IGlmIG9jY3VycywganVzdCBtZWFucwotCQkJLy8gIm5vdCIKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyCi0gICAqIFRoZXJlIGlzIGFsc28gYSBqYXZhLmlvLklucHV0U3RyZWFtIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLlJlYWRlciB0byByZWFkIGlucHV0IGZyb20uCi0gICAqLwotICBwdWJsaWMgWE1MMTBOYW1lcyhqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMuenpSZWFkZXIgPSBpbjsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHNjYW5uZXIuCi0gICAqIFRoZXJlIGlzIGFsc28gamF2YS5pby5SZWFkZXIgdmVyc2lvbiBvZiB0aGlzIGNvbnN0cnVjdG9yLgotICAgKgotICAgKiBAcGFyYW0gICBpbiAgdGhlIGphdmEuaW8uSW5wdXRzdHJlYW0gdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTDEwTmFtZXMoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBjaGFyYWN0ZXIgdHJhbnNsYXRpb24gdGFibGUuCi0gICAqCi0gICAqIEBwYXJhbSBwYWNrZWQgICB0aGUgcGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB6elVucGFja0NNYXAoU3RyaW5nIHBhY2tlZCkgewotICAgIGNoYXIgW10gbWFwID0gbmV3IGNoYXJbMHgxMDAwMF07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMTIyNikgewotICAgICAgaW50ICBjb3VudCA9IHBhY2tlZC5jaGFyQXQoaSsrKTsKLSAgICAgIGNoYXIgdmFsdWUgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBkbyBtYXBbaisrXSA9IHZhbHVlOyB3aGlsZSAoLS1jb3VudCA+IDApOwotICAgIH0KLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLQotICAvKioKLSAgICogUmVmaWxscyB0aGUgaW5wdXQgYnVmZmVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+LCBpZmYgdGhlcmUgd2FzIG5ldyBpbnB1dC4KLSAgICogCi0gICAqIEBleGNlcHRpb24gICBqYXZhLmlvLklPRXhjZXB0aW9uICBpZiBhbnkgSS9PLUVycm9yIG9jY3VycwotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHp6UmVmaWxsKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotCi0gICAgLyogZmlyc3Q6IG1ha2Ugcm9vbSAoaWYgeW91IGNhbikgKi8KLSAgICBpZiAoenpTdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHp6QnVmZmVyLCB6elN0YXJ0UmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgenpCdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIHp6RW5kUmVhZC16elN0YXJ0UmVhZCk7Ci0KLSAgICAgIC8qIHRyYW5zbGF0ZSBzdG9yZWQgcG9zaXRpb25zICovCi0gICAgICB6ekVuZFJlYWQtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6Q3VycmVudFBvcy09IHp6U3RhcnRSZWFkOwotICAgICAgenpNYXJrZWRQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6UHVzaGJhY2tQb3MtPSB6elN0YXJ0UmVhZDsKLSAgICAgIHp6U3RhcnRSZWFkID0gMDsKLSAgICB9Ci0KLSAgICAvKiBpcyB0aGUgYnVmZmVyIGJpZyBlbm91Z2g/ICovCi0gICAgaWYgKHp6Q3VycmVudFBvcyA+PSB6ekJ1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3p6Q3VycmVudFBvcyoyXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoenpCdWZmZXIsIDAsIG5ld0J1ZmZlciwgMCwgenpCdWZmZXIubGVuZ3RoKTsKLSAgICAgIHp6QnVmZmVyID0gbmV3QnVmZmVyOwotICAgIH0KLQotICAgIC8qIGZpbmFsbHk6IGZpbGwgdGhlIGJ1ZmZlciB3aXRoIG5ldyBpbnB1dCAqLwotICAgIGludCBudW1SZWFkID0genpSZWFkZXIucmVhZCh6ekJ1ZmZlciwgenpFbmRSZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6ekJ1ZmZlci5sZW5ndGgtenpFbmRSZWFkKTsKLQotICAgIGlmIChudW1SZWFkIDwgMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGVsc2UgewotICAgICAgenpFbmRSZWFkKz0gbnVtUmVhZDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAgIAotICAvKioKLSAgICogQ2xvc2VzIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgdm9pZCB5eWNsb3NlKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotLy8gICAgenpBdEVPRiA9IHRydWU7ICAgICAgICAgICAgLyogaW5kaWNhdGUgZW5kIG9mIGZpbGUgKi8KLS8vICAgIHp6RW5kUmVhZCA9IHp6U3RhcnRSZWFkOyAgLyogaW52YWxpZGF0ZSBidWZmZXIgICAgKi8KLS8vCi0vLyAgICBpZiAoenpSZWFkZXIgIT0gbnVsbCkKLS8vICAgICAgenpSZWFkZXIuY2xvc2UoKTsKLS8vICB9Ci0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBzY2FubmVyIHRvIHJlYWQgZnJvbSBhIG5ldyBpbnB1dCBzdHJlYW0uCi0gICAqIERvZXMgbm90IGNsb3NlIHRoZSBvbGQgcmVhZGVyLgotICAgKgotICAgKiBBbGwgaW50ZXJuYWwgdmFyaWFibGVzIGFyZSByZXNldCwgdGhlIG9sZCBpbnB1dCBzdHJlYW0gCi0gICAqIDxiPmNhbm5vdDwvYj4gYmUgcmV1c2VkIChpbnRlcm5hbCBidWZmZXIgaXMgZGlzY2FyZGVkIGFuZCBsb3N0KS4KLSAgICogTGV4aWNhbCBzdGF0ZSBpcyBzZXQgdG8gPHR0PlpaX0lOSVRJQUw8L3R0Pi4KLSAgICoKLSAgICogQHBhcmFtIHJlYWRlciAgIHRoZSBuZXcgaW5wdXQgc3RyZWFtIAotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCB2b2lkIHl5cmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0gICAgenpSZWFkZXIgPSByZWFkZXI7Ci0vLyAgICB6ekF0Qk9MICA9IHRydWU7Ci0gICAgenpBdEVPRiAgPSBmYWxzZTsKLSAgICB6ekVuZFJlYWQgPSB6elN0YXJ0UmVhZCA9IDA7Ci0gICAgenpDdXJyZW50UG9zID0genpNYXJrZWRQb3MgPSB6elB1c2hiYWNrUG9zID0gMDsKLS8vICAgIHl5bGluZSA9IHl5Y2hhciA9IHl5Y29sdW1uID0gMDsKLSAgICB6ekxleGljYWxTdGF0ZSA9IFlZSU5JVElBTDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZS4KLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCBpbnQgeXlzdGF0ZSgpIHsKLS8vICAgIHJldHVybiB6ekxleGljYWxTdGF0ZTsKLS8vICB9Ci0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLS8vICAgIHp6TGV4aWNhbFN0YXRlID0gbmV3U3RhdGU7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRleHQgbWF0Y2hlZCBieSB0aGUgY3VycmVudCByZWd1bGFyIGV4cHJlc3Npb24uCi0gICAqLwotLy8gIHByaXZhdGUgZmluYWwgU3RyaW5nIHl5dGV4dCgpIHsKLS8vICAgIHJldHVybiBuZXcgU3RyaW5nKCB6ekJ1ZmZlciwgenpTdGFydFJlYWQsIHp6TWFya2VkUG9zLXp6U3RhcnRSZWFkICk7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNoYXJhY3RlciBhdCBwb3NpdGlvbiA8dHQ+cG9zPC90dD4gZnJvbSB0aGUgCi0gICAqIG1hdGNoZWQgdGV4dC4gCi0gICAqIAotICAgKiBJdCBpcyBlcXVpdmFsZW50IHRvIHl5dGV4dCgpLmNoYXJBdChwb3MpLCBidXQgZmFzdGVyCi0gICAqCi0gICAqIEBwYXJhbSBwb3MgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyYWN0ZXIgdG8gZmV0Y2guIAotICAgKiAgICAgICAgICAgIEEgdmFsdWUgZnJvbSAwIHRvIHl5bGVuZ3RoKCktMS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIGF0IHBvc2l0aW9uIHBvcwotICAgKi8KLS8vICBwcml2YXRlIGZpbmFsIGNoYXIgeXljaGFyYXQoaW50IHBvcykgewotLy8gICAgcmV0dXJuIHp6QnVmZmVyW3p6U3RhcnRSZWFkK3Bvc107Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbWF0Y2hlZCB0ZXh0IHJlZ2lvbi4KLSAgICovCi0vLyAgcHJpdmF0ZSBmaW5hbCBpbnQgeXlsZW5ndGgoKSB7Ci0vLyAgICByZXR1cm4genpNYXJrZWRQb3MtenpTdGFydFJlYWQ7Ci0vLyAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nLgotICAgKgotICAgKiBJbiBhIHdlbGxmb3JtZWQgc2Nhbm5lciAobm8gb3Igb25seSBjb3JyZWN0IHVzYWdlIG9mIAotICAgKiB5eXB1c2hiYWNrKGludCkgYW5kIGEgbWF0Y2gtYWxsIGZhbGxiYWNrIHJ1bGUpIHRoaXMgbWV0aG9kIAotICAgKiB3aWxsIG9ubHkgYmUgY2FsbGVkIHdpdGggdGhpbmdzIHRoYXQgIkNhbid0IFBvc3NpYmx5IEhhcHBlbiIuCi0gICAqIElmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCwgc29tZXRoaW5nIGlzIHNlcmlvdXNseSB3cm9uZwotICAgKiAoZS5nLiBhIEpGbGV4IGJ1ZyBwcm9kdWNpbmcgYSBmYXVsdHkgc2Nhbm5lciBldGMuKS4KLSAgICoKLSAgICogVXN1YWwgc3ludGF4L3NjYW5uZXIgbGV2ZWwgZXJyb3IgaGFuZGxpbmcgc2hvdWxkIGJlIGRvbmUKLSAgICogaW4gZXJyb3IgZmFsbGJhY2sgcnVsZXMuCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgenpTY2FuRXJyb3IoaW50IGVycm9yQ29kZSkgewotICAgIFN0cmluZyBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlID0gWlpfRVJST1JfTVNHW2Vycm9yQ29kZV07Ci0gICAgfQotICAgIGNhdGNoIChBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgbWVzc2FnZSA9IFpaX0VSUk9SX01TR1taWl9VTktOT1dOX0VSUk9SXTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLS8vICBwcml2YXRlIHZvaWQgeXlwdXNoYmFjayhpbnQgbnVtYmVyKSAgewotLy8gICAgaWYgKCBudW1iZXIgPiB5eWxlbmd0aCgpICkKLS8vICAgICAgenpTY2FuRXJyb3IoWlpfUFVTSEJBQ0tfMkJJRyk7Ci0vLwotLy8gICAgenpNYXJrZWRQb3MgLT0gbnVtYmVyOwotLy8gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgamF2YS5pby5JT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkWE1MMTBOYW1lKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgIGludCB6eklucHV0OwotICAgIGludCB6ekFjdGlvbjsKLQotICAgIC8vIGNhY2hlZCBmaWVsZHM6Ci0gICAgaW50IHp6Q3VycmVudFBvc0w7Ci0gICAgaW50IHp6TWFya2VkUG9zTDsKLSAgICBpbnQgenpFbmRSZWFkTCA9IHp6RW5kUmVhZDsKLSAgICBjaGFyIFtdIHp6QnVmZmVyTCA9IHp6QnVmZmVyOwotICAgIGNoYXIgW10genpDTWFwTCA9IFpaX0NNQVA7Ci0KLSAgICBpbnQgW10genpUcmFuc0wgPSBaWl9UUkFOUzsKLSAgICBpbnQgW10genpSb3dNYXBMID0gWlpfUk9XTUFQOwotICAgIGludCBbXSB6ekF0dHJMID0gWlpfQVRUUklCVVRFOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHp6TWFya2VkUG9zTCA9IHp6TWFya2VkUG9zOwotCi0gICAgICB6ekFjdGlvbiA9IC0xOwotCi0gICAgICB6ekN1cnJlbnRQb3NMID0genpDdXJyZW50UG9zID0genpTdGFydFJlYWQgPSB6ek1hcmtlZFBvc0w7Ci0gIAotICAgICAgenpTdGF0ZSA9IHp6TGV4aWNhbFN0YXRlOwotCi0KLSAgICAgIHp6Rm9yQWN0aW9uOiB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgCi0gICAgICAgICAgaWYgKHp6Q3VycmVudFBvc0wgPCB6ekVuZFJlYWRMKQotICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgIGVsc2UgaWYgKHp6QXRFT0YpIHsKLSAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgIGJyZWFrIHp6Rm9yQWN0aW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIC8vIHN0b3JlIGJhY2sgY2FjaGVkIHBvc2l0aW9ucwotICAgICAgICAgICAgenpDdXJyZW50UG9zICA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICB6ek1hcmtlZFBvcyAgID0genpNYXJrZWRQb3NMOwotICAgICAgICAgICAgYm9vbGVhbiBlb2YgPSB6elJlZmlsbCgpOwotICAgICAgICAgICAgLy8gZ2V0IHRyYW5zbGF0ZWQgcG9zaXRpb25zIGFuZCBwb3NzaWJseSBuZXcgYnVmZmVyCi0gICAgICAgICAgICB6ekN1cnJlbnRQb3NMICA9IHp6Q3VycmVudFBvczsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCAgID0genpNYXJrZWRQb3M7Ci0gICAgICAgICAgICB6ekJ1ZmZlckwgICAgICA9IHp6QnVmZmVyOwotICAgICAgICAgICAgenpFbmRSZWFkTCAgICAgPSB6ekVuZFJlYWQ7Ci0gICAgICAgICAgICBpZiAoZW9mKSB7Ci0gICAgICAgICAgICAgIHp6SW5wdXQgPSBZWUVPRjsKLSAgICAgICAgICAgICAgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgenpJbnB1dCA9IHp6QnVmZmVyTFt6ekN1cnJlbnRQb3NMKytdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgenpOZXh0ID0genpUcmFuc0xbIHp6Um93TWFwTFt6elN0YXRlXSArIHp6Q01hcExbenpJbnB1dF0gXTsKLSAgICAgICAgICBpZiAoenpOZXh0ID09IC0xKSBicmVhayB6ekZvckFjdGlvbjsKLSAgICAgICAgICB6elN0YXRlID0genpOZXh0OwotCi0gICAgICAgICAgaW50IHp6QXR0cmlidXRlcyA9IHp6QXR0ckxbenpTdGF0ZV07Ci0gICAgICAgICAgaWYgKCAoenpBdHRyaWJ1dGVzICYgMSkgPT0gMSApIHsKLSAgICAgICAgICAgIHp6QWN0aW9uID0genpTdGF0ZTsKLSAgICAgICAgICAgIHp6TWFya2VkUG9zTCA9IHp6Q3VycmVudFBvc0w7Ci0gICAgICAgICAgICBpZiAoICh6ekF0dHJpYnV0ZXMgJiA4KSA9PSA4ICkgYnJlYWsgenpGb3JBY3Rpb247Ci0gICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gc3RvcmUgYmFjayBjYWNoZWQgcG9zaXRpb24KLSAgICAgIHp6TWFya2VkUG9zID0genpNYXJrZWRQb3NMOwotCi0gICAgICBzd2l0Y2ggKHp6QWN0aW9uIDwgMCA/IHp6QWN0aW9uIDogWlpfQUNUSU9OW3p6QWN0aW9uXSkgewotICAgICAgICBjYXNlIDE6IAotICAgICAgICAgIHsgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSAzOiBicmVhazsKLSAgICAgICAgY2FzZSAyOiAKLSAgICAgICAgICB7IHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSA0OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHp6SW5wdXQgPT0gWVlFT0YgJiYgenpTdGFydFJlYWQgPT0genpDdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB6ekF0RU9GID0gdHJ1ZTsKLSAgICAgICAgICAgICAgeyB7cmV0dXJuIGZhbHNlO30gfQotICAgICAgICAgIH0gCi0gICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB6elNjYW5FcnJvcihaWl9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFNvdXJjZVBhcnNlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ZmM2ZDUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU291cmNlUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi0KLQotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudFJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1RhZ1BhcnNlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5CbG9ja1Rva2VuaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5SZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwubHRrLnBhcnNlci5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25QYXJzZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5wYXJzZXIuU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LkNoYXJTZXF1ZW5jZVJlYWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JUmVnaW9uQ29tcGFyaWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUYWtlcyBpbnB1dCBmcm9tIHRoZSBIVE1MVG9rZW5pemVyIGFuZCBjcmVhdGVzIGEgdGFnIGxpc3QKLSAqLwotCi1wdWJsaWMgY2xhc3MgWE1MU291cmNlUGFyc2VyIGltcGxlbWVudHMgUmVnaW9uUGFyc2VyLCBCbG9ja1RhZ1BhcnNlciwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyLCBJUmVnaW9uQ29tcGFyaWJsZSwgU3RydWN0dXJlZERvY3VtZW50UmVnaW9uUGFyc2VyRXh0ZW5zaW9uIHsKLQkvLyBtYWRlIHB1YmxpYyB0byBhaWQgYWNjZXNzIGZyb20gaW5uZXIgY2xhc3NlcyBpbiBoaWVyYXJjaHkuCi0JLy8gVE9ETzogaW4gZnV0dXJlLCBmaWd1cmUgb3V0IGhvdyB0byBzb2x2ZSB3aXRob3V0IGV4cG9zaW5nIGRhdGEuCi0JcHVibGljIENoYXJTZXF1ZW5jZSBmQ2hhclNlcXVlbmNlU291cmNlID0gbnVsbDsKLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnRJbnB1dDsKLQlwcm90ZWN0ZWQgaW50IGZPZmZzZXQgPSAwOwotCS8vIERNVzogMi8xMi8wMy4gUmVtb3ZlZCBzb21lIHN0YXRlIGRhdGEsIHNpbmNlIG5vdCByZWFsbHkgbmVlZGVkLAotCS8vIGFuZCBzaW5jZSBpdCBhZGRlZCBhIGxvdCB0byBvdmVyaGVhZCAoc2luY2Ugc28gbWFueSByZWdpb25zIGFyZQotCS8vIGNyZWF0ZWQuCi0JLy8gcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkN1cnJlbnROb2RlID0gbnVsbDsKLQkvLyBwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmTm9kZXMgPSBudWxsOwotCS8vIHByb3RlY3RlZCBMaXN0IGZSZWdpb25zID0gbnVsbDsKLQkvLyBwcm90ZWN0ZWQgT2JqZWN0IGZJbnB1dCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU3RyaW5nSW5wdXQgPSBudWxsOwotCXByb3RlY3RlZCBMaXN0IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyczsKLQotCXByb3RlY3RlZCBCbG9ja1Rva2VuaXplciBmVG9rZW5pemVyID0gbnVsbDsKLQlwcm90ZWN0ZWQgbG9uZyBzdGFydFRpbWU7Ci0JcHJvdGVjdGVkIGxvbmcgc3RvcFRpbWU7Ci0KLQkvKioKLQkgKiBIVE1MU291cmNlUGFyc2VyIGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTFNvdXJjZVBhcnNlcigpIHsKLQkJc3VwZXIoKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID0gbmV3IEFycmF5TGlzdCgpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgaXMgYSBzaW1wbGUgdXRpbGl0eSB0byBjb3VudCBub2Rlcy4gVXNlZCBvbmx5IGZvciBkZWJ1ZwotCSAqIHN0YXRlbWVudHMuCi0JICovCi0JcHJvdGVjdGVkIGludCBfY291bnROb2RlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIG5vZGVzKSB7Ci0JCWludCByZXN1bHQgPSAwOwotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGNvdW50Tm9kZSA9IG5vZGVzOwotCQl3aGlsZSAoY291bnROb2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCsrOwotCQkJY291bnROb2RlID0gY291bnROb2RlLmdldE5leHQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCQlnZXRUb2tlbml6ZXIoKS5hZGRCbG9ja01hcmtlcihtYXJrZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIoU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlciBoYW5kbGVyKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgPT0gbnVsbCkKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLmFkZChoYW5kbGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBiZWdpbkJsb2NrU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCQlnZXRUb2tlbml6ZXIoKS5iZWdpbkJsb2NrVGFnU2NhbihuZXdUYWdOYW1lKTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKi8KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oU3RyaW5nIHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXdOb2RlID0gbnVsbDsKLQkJaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKQotCQkJbmV3Tm9kZSA9IFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmNyZWF0ZVJlZ2lvbihYTUxTdHJ1Y3R1cmVkUmVnaW9uRmFjdG9yeS5YTUxfQkxPQ0spOwotCQllbHNlCi0JCQluZXdOb2RlID0gWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuY3JlYXRlUmVnaW9uKFhNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LlhNTCk7Ci0JCXJldHVybiBuZXdOb2RlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZpcmVOb2RlUGFyc2VkKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZkN1cnJlbnROb2RlKSB7Ci0JCS8vIG5ldmVyIGxldCBhbiBFeGNlcHRpb25zIGZyb20gZm9yZWlnbiBjb2RlIGludGVyZmVyZSB3aXRoIGNvbXBsZXRpb24KLQkJLy8gb2YgcGFyc2luZy4gVG8gZ2V0IGFuIGV4Y2VwdGlvbiBoZXJlIGlzIGRlZmluaXRlbHkgYSBwcm9ncmFtIGVycm9yCi0JCS8vIHNvbWV3aGVyZSwKLQkJLy8gd2UgY2FuJ3QgYWZmb3JkIHRvIGludGVycnVwdCB0aGUgZmxvdyBvZiBjb250cm9sLiBvciBiYWNrd2FyZHMKLQkJLy8gdHlwaW5nIGNhbiByZXN1bHQhCi0JCS8vIAotCQkvLyAKLQkJdHJ5IHsKLQkJCWlmIChmQ3VycmVudE5vZGUgIT0gbnVsbCAmJiBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLnNpemUoKTsgaSsrKQotCQkJCQkoKFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXIpIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycy5nZXQoaSkpLm5vZGVQYXJzZWQoZkN1cnJlbnROb2RlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgQmxvY2tNYXJrZXIgZ2V0QmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJTGlzdCBtYXJrZXJzID0gZ2V0VG9rZW5pemVyKCkuZ2V0QmxvY2tNYXJrZXJzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWFya2Vycy5zaXplKCk7IGkrKykgewotCQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKSBtYXJrZXJzLmdldChpKTsKLQkJCWlmIChtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCQlpZiAobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHModGFnTmFtZSkpCi0JCQkJCXJldHVybiBtYXJrZXI7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKHRhZ05hbWUpKQotCQkJCQlyZXR1cm4gbWFya2VyOwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEJsb2NrTWFya2VycygpIHsKLQkJcmV0dXJuIGdldFRva2VuaXplcigpLmdldEJsb2NrTWFya2VycygpOwotCX0KLQotCS8qKgotCSAqIEByZXR1cm4gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbgotCSAqLwotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldERvY3VtZW50UmVnaW9ucygpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkbm9kZSA9IG51bGw7Ci0JCWlmIChoZWFkbm9kZSA9PSBudWxsKSB7Ci0JCQlpZiAoRGVidWcucGVyZlRlc3QpIHsKLQkJCQlzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCX0KLQkJCWhlYWRub2RlID0gcGFyc2VOb2RlcygpOwotCQkJaWYgKERlYnVnLnBlcmZUZXN0KSB7Ci0JCQkJc3RvcFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAtLSBjcmVhdGluZyBub2RlcyBvZiBJU3RydWN0dXJlZERvY3VtZW50IC0tICIpOyAvLyROT04tTkxTLTEkCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKCIgVGltZSBwYXJzZSBhbmQgaW5pdCBhbGwgcmVnaW9uczogIiArIChzdG9wVGltZSAtIHN0YXJ0VGltZSkgKyAiIChtc2VjcykiKTsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oIiBmb3IgIiArIGZSZWdpb25zLnNpemUoKSArICIKLQkJCQkvLyBSZWdpb25zIik7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oIiAgICAgIGFuZCAiICsgX2NvdW50Tm9kZXMoaGVhZG5vZGUpICsgIiBOb2RlcyIpOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JCXJldHVybiBoZWFkbm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0TmV4dFJlZ2lvbigpIHsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXJlZ2lvbiA9IGdldFRva2VuaXplcigpLmdldE5leHRUb2tlbigpOwotCQkJLy8gRE1XOiAyLzEyLzAzIFJlbW92ZWQgc3RhdGUKLQkJCS8vIGlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gZlJlZ2lvbnMuYWRkKHJlZ2lvbik7Ci0JCQkvLyB9Ci0JCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSArICI6IGlucHV0IGNvdWxkIG5vdCBiZSBwYXJzZWQgY29ycmVjdGx5IGF0IHBvc2l0aW9uICIgKyBnZXRUb2tlbml6ZXIoKS5nZXRPZmZzZXQoKSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGdldENsYXNzKCkuZ2V0TmFtZSgpICsgIjogaW5wdXQgY291bGQgbm90IGJlIHBhcnNlZCBjb3JyZWN0bHkgYXQgcG9zaXRpb24gIiArIGdldFRva2VuaXplcigpLmdldE9mZnNldCgpICsgIiAoIiArIGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpICsgIikiLCBlKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBmdWxsIGxpc3Qgb2Yga25vd24gcmVnaW9ucy4gVHlwaWNhbGx5IGdldE5vZGVzIHNob3VsZCBiZQotCSAqIHVzZWQgaW5zdGVhZCBvZiB0aGlzIG1ldGhvZC4KLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRSZWdpb25zKCkgewotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJaWYgKCFnZXRUb2tlbml6ZXIoKS5pc0VPRigpKSB7Ci0JCQloZWFkTm9kZSA9IGdldERvY3VtZW50UmVnaW9ucygpOwotCQkJLy8gdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicGFyc2luZyBoYXMgbm90IGZpbmlzaGVkIik7Ci0JCX0KLQkJLy8gZm9yIG1lbW9yeSByZWNvdmVyeSwgd2UgYXNzdW1lIGlmIHNvbWVvbmUKLQkJLy8gcmVxdWVzdHMgYWxsIHJlZ2lvbnMsIHdlIGNhbiByZXNldCBvdXIgYmlnCi0JCS8vIG1lbW9yeSBjb25zdW1pbmcgb2JqZWN0cwotCQkvLyBidXQgdGhlIG5ldyAiZ2V0UmVnaW9ucyIgbWV0aG9kIGlzIHRoZW4gbW9yZSBleHBlbnNpdmUuCi0JCS8vIEkgZG9uJ3QgdGhpbmsgaXRzIHVzZWQgbXVjaCwgdGhvdWdoLgotCQlMaXN0IGxvY2FsUmVnaW9uc0xpc3QgPSBnZXRSZWdpb25zKGhlYWROb2RlKTsKLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBsb2NhbFJlZ2lvbnNMaXN0OwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRSZWdpb25zLgotCSAqIAotCSAqIEBwYXJhbSBoZWFkTm9kZQotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFJlZ2lvbnMoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBoZWFkTm9kZSkgewotCQlMaXN0IGFsbFJlZ2lvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBoZWFkTm9kZTsKLQkJd2hpbGUgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCUlUZXh0UmVnaW9uTGlzdCBub2RlUmVnaW9ucyA9IGN1cnJlbnROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZVJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCQlhbGxSZWdpb25zLmFkZChub2RlUmVnaW9ucy5nZXQoaSkpOwotCQkJfQotCQkJY3VycmVudE5vZGUgPSBjdXJyZW50Tm9kZS5nZXROZXh0KCk7Ci0JCX0KLQkJcmV0dXJuIGFsbFJlZ2lvbnM7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBqYXZhLnV0aWwuTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKCkgewotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID09IG51bGwpIHsKLQkJCWZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCX0KLQkJcmV0dXJuIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRleHQgZnJvbSB0aGUgY3VycmVudCBpbnB1dC4gVGV4dCBpcyBvbmx5IHZhbGlkIGJlZm9yZQotCSAqIGdldE5vZGVzKCkgaGFzIGJlZW4gY2FsbGVkIGFuZCBvbmx5IHdoZW4gYSByYXcgU3RyaW5nIG9yIERvY3VtZW50UmVhZGVyCi0JICogaXMgZ2l2ZW4gYXMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0JCVN0cmluZyB0ZXh0ID0gbnVsbDsKLQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCkgewotCQkJaW50IHN0YXJ0ID0gZk9mZnNldCArIG9mZnNldDsKLQkJCWludCBlbmQgPSBzdGFydCArIGxlbmd0aDsKLQkJCXRleHQgPSBmQ2hhclNlcXVlbmNlU291cmNlLnN1YlNlcXVlbmNlKHN0YXJ0LCBlbmQpLnRvU3RyaW5nKCk7Ci0JCX0KLQkJZWxzZSBpZiAoZkRvY3VtZW50SW5wdXQgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQl0ZXh0ID0gZkRvY3VtZW50SW5wdXQuZ2V0KG9mZnNldCwgbGVuZ3RoKTsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJdGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZlN0cmluZ0lucHV0ID09IG51bGwgfHwgZlN0cmluZ0lucHV0Lmxlbmd0aCgpID09IDAgfHwgb2Zmc2V0ICsgbGVuZ3RoID4gZlN0cmluZ0lucHV0Lmxlbmd0aCgpIHx8IG9mZnNldCA8IDApIHsKLQkJCQl0ZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG9mZnNldCBpcyBlbnRpcmVseSB2YWxpZCBkdXJpbmcgcGFyc2luZyBhcyB0aGUgcGFyc2UKLQkJCQkvLyBudW1iZXJzIGhhdmVuJ3QgYmVlbiBhZGp1c3RlZC4KLQkJCQl0ZXh0ID0gZlN0cmluZ0lucHV0LnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHRleHQ7Ci0JfQotCi0JcHJvdGVjdGVkIEJsb2NrVG9rZW5pemVyIGdldFRva2VuaXplcigpIHsKLQkJaWYgKGZUb2tlbml6ZXIgPT0gbnVsbCkgewotCQkJZlRva2VuaXplciA9IG5ldyBYTUxUb2tlbml6ZXIoKTsKLQkJfQotCQlyZXR1cm4gZlRva2VuaXplcjsKLQl9Ci0KLQotCXB1YmxpYyBSZWdpb25QYXJzZXIgbmV3SW5zdGFuY2UoKSB7Ci0JCVhNTFNvdXJjZVBhcnNlciBuZXdJbnN0YW5jZSA9IG5ldyBYTUxTb3VyY2VQYXJzZXIoKTsKLQkJbmV3SW5zdGFuY2Uuc2V0VG9rZW5pemVyKGdldFRva2VuaXplcigpLm5ld0luc3RhbmNlKCkpOwotCQlyZXR1cm4gbmV3SW5zdGFuY2U7Ci0JfQotCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyc2VOb2RlcygpIHsKLQkJLy8gcmVnaW9ucyBhcmUgaW5pdGlhbGx5IHJlcG9ydGVkIGFzIGNvbXBsZXRlIG9mZnNldHMgd2l0aGluIHRoZQotCQkvLyBzY2FubmVkIGlucHV0Ci0JCS8vIHRoZXkgYXJlIGFkanVzdGVkIGhlcmUgdG8gYmUgaW5kZXhlcyBmcm9tIHRoZSBjdXJyZW50Tm9kZSdzIHN0YXJ0Ci0JCS8vIG9mZnNldAotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGhlYWROb2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBsYXN0Tm9kZSA9IG51bGw7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IG51bGw7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gY3VycmVudE5vZGUgPSBudWxsOwotCQlTdHJpbmcgdHlwZSA9IG51bGw7Ci0KLQkJd2hpbGUgKChyZWdpb24gPSBnZXROZXh0UmVnaW9uKCkpICE9IG51bGwpIHsKLQkJCXR5cGUgPSByZWdpb24uZ2V0VHlwZSgpOwotCQkJLy8gdGhlc2UgdHlwZXMgKG1pZ2h0KSBkZW1hbmQgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZvciBlYWNoCi0JCQkvLyBvZiB0aGVtCi0JCQlpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCQlpZiAoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuQkxPQ0tfVEVYVCkgewotCQkJCQkvLyBtdWx0aXBsZSBibG9jayB0ZXh0cyBpbmRpY2F0ZWQgZW1iZWRkZWQgY29udGFpbmVyczsgbm8KLQkJCQkJLy8gbmV3IElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gbm90IGNvbnRpbnVpbmcgYSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JCQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCQkvLyBlbnN1cmUgdGhhdCBhbnkgZXhpc3Rpbmcgbm9kZSBpcyBhdCBsZWFzdAotCQkJCQkJLy8gdGVybWluYXRlZAotCQkJCQkJaWYgKCFjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHsKLQkJCQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkJLy8gZkN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQkJfQotCQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQkJfQotCQkJCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCQlpZiAobGFzdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJbGFzdE5vZGUuc2V0TmV4dChjdXJyZW50Tm9kZSk7Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUuc2V0UHJldmlvdXMobGFzdE5vZGUpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRTdGFydChyZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJfQotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBPUEVOIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zCi0JCQllbHNlIGlmICgoY3VycmVudE5vZGUgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5pc0VuZGVkKCkpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pKSB7Ci0JCQkJaWYgKGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJLy8gZW5zdXJlIHRoYXQgYW55IGV4aXN0aW5nIG5vZGUgaXMgYXQgbGVhc3QgdGVybWluYXRlZAotCQkJCQlpZiAoIWN1cnJlbnROb2RlLmlzRW5kZWQoKSkgewotCQkJCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCQkvLyBmQ3VycmVudE5vZGUuc2V0VGV4dExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSAtCi0JCQkJCQkvLyBmQ3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJCX0KLQkJCQkJbGFzdE5vZGUgPSBjdXJyZW50Tm9kZTsKLQkJCQl9Ci0JCQkJZmlyZU5vZGVQYXJzZWQoY3VycmVudE5vZGUpOwotCQkJCWN1cnJlbnROb2RlID0gY3JlYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKHR5cGUpOwotCQkJCWlmIChsYXN0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJCWxhc3ROb2RlLnNldE5leHQoY3VycmVudE5vZGUpOwotCQkJCX0KLQkJCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCQkJY3VycmVudE5vZGUuc2V0U3RhcnQocmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhlIGZvbGxvd2luZyBjb250ZXh0cyBuZWl0aGVyIG9wZW4gbm9yIGNsb3NlCi0JCQkvLyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zOyBqdXN0IGFkZCB0byB0aGVtCi0JCQllbHNlIGlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCkpIHsKLQkJCQljdXJyZW50Tm9kZS5hZGRSZWdpb24ocmVnaW9uKTsKLQkJCQljdXJyZW50Tm9kZS5zZXRMZW5ndGgocmVnaW9uLmdldFN0YXJ0KCkgKyByZWdpb24uZ2V0TGVuZ3RoKCkgLSBjdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCS8vIERXIDQvMTYvMjAwMyByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCX0KLQkJCS8vIHRoZSBmb2xsb3dpbmcgY29udGV4dHMgY2xvc2Ugb2ZmIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbnMKLQkJCS8vIGNsZWFubHkKLQkJCWVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX0NMT1NFKSkgewotCQkJCWN1cnJlbnROb2RlLnNldEVuZGVkKHRydWUpOwotCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCWN1cnJlbnROb2RlLmFkZFJlZ2lvbihyZWdpb24pOwotCQkJCXJlZ2lvbi5hZGp1c3RTdGFydCgtY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCS8vIHJlZ2lvbi5zZXRQYXJlbnQoY3VycmVudE5vZGUpOwotCQkJfQotCQkJLy8gdGhpcyBpcyBleHRyZW1lbHkgcmFyZSwgYnV0IHZhbGlkCi0JCQllbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gY3VycmVudE5vZGUuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCS8vIHBhY2sgdGhlIGVtYmVkZGVkIGNvbnRhaW5lciB3aXRoIHRoaXMgcmVnaW9uCi0JCQkJaWYgKGxhc3RSZWdpb24gaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbkNvbnRhaW5lcikgewotCQkJCQlJVGV4dFJlZ2lvbkNvbnRhaW5lciBjb250YWluZXIgPSAoSVRleHRSZWdpb25Db250YWluZXIpIGxhc3RSZWdpb247Ci0JCQkJCWNvbnRhaW5lci5nZXRSZWdpb25zKCkuYWRkKHJlZ2lvbik7Ci0JCQkJCS8vIGNvbnRhaW5lcnMgbXVzdCBoYXZlIHBhcmVudCBzZXQgLi4uCi0JCQkJCS8vIHNldHRpbmcgZm9yIEVBQ0ggc3VicmVnaW9uIGlzIHJlZHVuZGVudCwgYnV0IG5vdCBzdXJlCi0JCQkJCS8vIHdoZXJlIGVsc2UgdG8gZG8sIHNvIHdpbGwgZG8gaGVyZSBmb3Igbm93LgotCQkJCQljb250YWluZXIuc2V0UGFyZW50KGN1cnJlbnROb2RlKTsKLQkJCQkJLy8gRFcgNC8xNi8yMDAzIHJlZ2lvbnMgbm8gbG9uZ2VyIGhhdmUgcGFyZW50cwotCQkJCQkvLyByZWdpb24uc2V0UGFyZW50KGNvbnRhaW5lcik7Ci0JCQkJCXJlZ2lvbi5hZGp1c3RTdGFydChjb250YWluZXIuZ2V0TGVuZ3RoKCkgLSByZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQkJfQotCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQljdXJyZW50Tm9kZS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQgJiYgY3VycmVudE5vZGUgIT0gbnVsbCkgewotCQkJCS8vIHNraXAgb24gYSB2ZXJ5LWZpcnN0IHJlZ2lvbiBzaXR1YXRpb24gYXMgdGhlIGRlZmF1bHQKLQkJCQkvLyBiZWhhdmlvciBpcyBnb29kIGVub3VnaAotCQkJCS8vIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBpZiBhbHNvIHVuZGVmaW5lZAotCQkJCWlmIChjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQkJCWN1cnJlbnROb2RlLmdldExhc3RSZWdpb24oKS5hZGp1c3RMZW5ndGgocmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJY3VycmVudE5vZGUuYWRqdXN0TGVuZ3RoKHJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJfQotCQkJCS8vIHByZXZpb3VzIHdhc24ndCB1bmRlZmluZWQKLQkJCQllbHNlIHsKLQkJCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJCWN1cnJlbnROb2RlLnNldExlbmd0aChyZWdpb24uZ2V0U3RhcnQoKSArIHJlZ2lvbi5nZXRMZW5ndGgoKSAtIGN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCQlyZWdpb24uYWRqdXN0U3RhcnQoLWN1cnJlbnROb2RlLmdldFN0YXJ0KCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIGlmIGFuIHVua25vd24gdHlwZSBpcyB0aGUgZmlyc3QgcmVnaW9uIGluIHRoZSBkb2N1bWVudCwKLQkJCQkvLyBlbnN1cmUgdGhhdCBhIG5vZGUgZXhpc3RzCi0JCQkJaWYgKGN1cnJlbnROb2RlID09IG51bGwpIHsKLQkJCQkJY3VycmVudE5vZGUgPSBjcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odHlwZSk7Ci0JCQkJCWN1cnJlbnROb2RlLnNldFN0YXJ0KHJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCQl9Ci0JCQkJY3VycmVudE5vZGUuYWRkUmVnaW9uKHJlZ2lvbik7Ci0JCQkJY3VycmVudE5vZGUuc2V0TGVuZ3RoKHJlZ2lvbi5nZXRTdGFydCgpICsgcmVnaW9uLmdldExlbmd0aCgpIC0gY3VycmVudE5vZGUuZ2V0U3RhcnQoKSk7Ci0JCQkJcmVnaW9uLmFkanVzdFN0YXJ0KC1jdXJyZW50Tm9kZS5nZXRTdGFydCgpKTsKLQkJCQkvLyBEVyA0LzE2LzIwMDMgcmVnaW9ucyBubyBsb25nZXIgaGF2ZSBwYXJlbnRzCi0JCQkJLy8gcmVnaW9uLnNldFBhcmVudChjdXJyZW50Tm9kZSk7Ci0JCQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGZvdW5kIHJlZ2lvbiBvZiBub3Qgc3BlY2lmaWNhbGx5IGhhbmRsZWQgdHlwZSAiICsgcmVnaW9uLmdldFR5cGUoKSArICIgQCAiICsgcmVnaW9uLmdldFN0YXJ0KCkgKyAiWyIgKyByZWdpb24uZ2V0TGVuZ3RoKCkgKyAiXSIpOyAvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCS8vIHRoZXNlIHJlZ2lvbnMgYWxzbyBnZXQgdGhlaXIgb3duIG5vZGUsIHNvIGNsb3NlIHRoZW0gY2xlYW5seQotCQkJLy8gTk9URTogdGhlc2UgcmVnaW9ucyBoYXZlIG5ldyBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zIGNyZWF0ZWQKLQkJCS8vIGZvciB0aGVtIGFib3ZlOyBpdCBtYXkKLQkJCS8vIGJlIG1vcmUgcmVhZGFibGUgaWYgdGhhdCBpcyBoYW5kbGVkIGhlcmUgYXMgd2VsbCwgYnV0IHRoZQotCQkJLy8gY3VycmVudCBsYXlvdXQKLQkJCS8vIGVuc3VyZXMgdGhhdCB0aGV5IG9wZW4gU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyB0aGUgc2FtZSB3YXkKLQkJCWlmICgodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5USVRZX1JFRkVSRU5DRSkpIHsKLQkJCQljdXJyZW50Tm9kZS5zZXRFbmRlZCh0cnVlKTsKLQkJCX0KLQkJCWlmIChoZWFkTm9kZSA9PSBudWxsICYmIGN1cnJlbnROb2RlICE9IG51bGwpIHsKLQkJCQloZWFkTm9kZSA9IGN1cnJlbnROb2RlOwotCQkJfQotCQl9Ci0JCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQlmaXJlTm9kZVBhcnNlZChjdXJyZW50Tm9kZSk7Ci0JCQljdXJyZW50Tm9kZS5zZXRQcmV2aW91cyhsYXN0Tm9kZSk7Ci0JCX0KLQkJLy8gZlN0cmluZ0lucHV0ID0gbnVsbDsKLQkJcHJpbVJlc2V0KCk7Ci0JCXJldHVybiBoZWFkTm9kZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwcmltUmVzZXQoKSB7Ci0JCS8vIGZOb2RlcyA9IG51bGw7Ci0JCS8vIGZSZWdpb25zID0gbnVsbDsKLQkJLy8gZklucHV0ID0gbnVsbDsKLQkJZlN0cmluZ0lucHV0ID0gbnVsbDsKLQkJZkNoYXJTZXF1ZW5jZVNvdXJjZSA9IG51bGw7Ci0JCWZEb2N1bWVudElucHV0ID0gbnVsbDsKLQkJZk9mZnNldCA9IDA7Ci0JCS8vIGZDdXJyZW50Tm9kZSA9IG51bGw7Ci0JCS8vIERNVzogYWxzbyByZXNldCB0b2tlbml6ZXIgc28gaXQgZG9lc24ndCBob2xkIG9uCi0JCS8vIHRvIGxhcmdlIGFycmF5cwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChuZXcgY2hhclswXSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5JUmVnaW9uQ29tcGFyaWJsZSNyZWdpb25NYXRjaGVzKGludCwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiByZWdpb25NYXRjaGVzKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJLy8gYnkgZGVmaW5pdGlvbgotCQlpZiAoc3RyaW5nVG9Db21wYXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCAmJiBmQ2hhclNlcXVlbmNlU291cmNlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXMob2Zmc2V0LCBsZW5ndGgsIHN0cmluZ1RvQ29tcGFyZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBvbGQgZmFzaGlvbmVkIHdheXMKLQkJCVN0cmluZyB0ZXN0ID0gbnVsbDsKLQkJCWlmIChmQ2hhclNlcXVlbmNlU291cmNlICE9IG51bGwpIHsKLQkJCQl0ZXN0ID0gZkNoYXJTZXF1ZW5jZVNvdXJjZS5zdWJTZXF1ZW5jZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkudG9TdHJpbmcoKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGZTdHJpbmdJbnB1dCAhPSBudWxsKSB7Ci0JCQkJdGVzdCA9IGZTdHJpbmdJbnB1dC5zdWJzdHJpbmcob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpOwotCQkJfQotCQkJcmVzdWx0ID0gc3RyaW5nVG9Db21wYXJlLmVxdWFscyh0ZXN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBib29sZWFuIHJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyBzdHJpbmdUb0NvbXBhcmUpIHsKLQkJLy8gYnkgZGVmaW5pdGlvbgotCQlpZiAoc3RyaW5nVG9Db21wYXJlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZDaGFyU2VxdWVuY2VTb3VyY2UgIT0gbnVsbCAmJiBmQ2hhclNlcXVlbmNlU291cmNlIGluc3RhbmNlb2YgSVJlZ2lvbkNvbXBhcmlibGUpIHsKLQkJCXJlc3VsdCA9ICgoSVJlZ2lvbkNvbXBhcmlibGUpIGZDaGFyU2VxdWVuY2VTb3VyY2UpLnJlZ2lvbk1hdGNoZXNJZ25vcmVDYXNlKG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdUb0NvbXBhcmUpOwotCQl9Ci0JCWVsc2UgewotCQkJLy8gb2xkIGZhc2hpb25lZCB3YXlzCi0JCQlTdHJpbmcgdGVzdCA9IG51bGw7Ci0JCQlpZiAoZkNoYXJTZXF1ZW5jZVNvdXJjZSAhPSBudWxsKSB7Ci0JCQkJdGVzdCA9IGZDaGFyU2VxdWVuY2VTb3VyY2Uuc3ViU2VxdWVuY2Uob2Zmc2V0LCBvZmZzZXQgKyBsZW5ndGgpLnRvU3RyaW5nKCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmU3RyaW5nSW5wdXQgIT0gbnVsbCkgewotCQkJCXRlc3QgPSBmU3RyaW5nSW5wdXQuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLQkJCX0KLQkJCXJlc3VsdCA9IHN0cmluZ1RvQ29tcGFyZS5lcXVhbHNJZ25vcmVDYXNlKHRlc3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoQmxvY2tNYXJrZXIgbWFya2VyKSB7Ci0JCWdldFRva2VuaXplcigpLnJlbW92ZUJsb2NrTWFya2VyKG1hcmtlcik7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ05hbWUpIHsKLQkJZ2V0VG9rZW5pemVyKCkucmVtb3ZlQmxvY2tNYXJrZXIodGFnTmFtZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcihTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyIGhhbmRsZXIpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVycyA9PSBudWxsKQotCQkJcmV0dXJuOwotCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLmNvbnRhaW5zKGhhbmRsZXIpKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzLnJlbW92ZShoYW5kbGVyKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIGlucHV0LgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uRmlsZUlucHV0U3RyZWFtIGluc3RyZWFtKSB7Ci0JCXByaW1SZXNldCgpOwotCQkvLyBmSW5wdXQgPSBpbnN0cmVhbTsKLQkJZ2V0VG9rZW5pemVyKCkucmVzZXQoaW5zdHJlYW0pOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuCi0JICovCi0JcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5SZWFkZXIgcmVhZGVyKSB7Ci0JCXJlc2V0KHJlYWRlciwgMCk7Ci0JfQotCi0JLyoqCi0JICogUmVzZXRzIHRoZSBpbnB1dC4KLQkgKi8KLQlwdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciByZWFkZXIsIGludCBwb3NpdGlvbikgewotCQlwcmltUmVzZXQoKTsKLQkJZk9mZnNldCA9IHBvc2l0aW9uOwotCQlnZXRUb2tlbml6ZXIoKS5yZXNldChyZWFkZXIsIHBvc2l0aW9uKTsKLQkJaWYgKHJlYWRlciBpbnN0YW5jZW9mIERvY3VtZW50UmVhZGVyKSB7Ci0JCQlJRG9jdW1lbnQgZG9jID0gKChEb2N1bWVudFJlYWRlcikgcmVhZGVyKS5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvYyBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgewotCQkJCWZDaGFyU2VxdWVuY2VTb3VyY2UgPSAoQ2hhclNlcXVlbmNlKSBkb2M7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBvbGQgZmFzaGlvbmVkIElEb2N1bWVudAotCQkJCWZEb2N1bWVudElucHV0ID0gKChEb2N1bWVudFJlYWRlcikgcmVhZGVyKS5nZXREb2N1bWVudCgpOwotCQkJfQotCi0JCX0KLQkJZWxzZSBpZiAocmVhZGVyIGluc3RhbmNlb2YgQ2hhclNlcXVlbmNlUmVhZGVyKSB7Ci0JCQlmQ2hhclNlcXVlbmNlU291cmNlID0gKChDaGFyU2VxdWVuY2VSZWFkZXIpIHJlYWRlcikuZ2V0T3JpZ2luYWxTb3VyY2UoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuIFVzZSB0aGlzIHZlcnNpb24gdG8gYWxsb3cgdGV4dCB0byBiZSByZXRyaWV2ZWQKLQkgKiA8ZW0+ZHVyaW5nPC9lbT4gcGFyc2luZywgc3VjaCBhcyBieSB0aGUKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBzb3VyY2VTdHJpbmcpIHsKLQkJcmVzZXQobmV3IFN0cmluZ1JlYWRlcihzb3VyY2VTdHJpbmcpKTsKLQkJZlN0cmluZ0lucHV0ID0gc291cmNlU3RyaW5nOwotCX0KLQotCS8qKgotCSAqIFJlc2V0cyB0aGUgaW5wdXQuIFVzZSB0aGlzIHZlcnNpb24gdG8gYWxsb3cgdGV4dCB0byBiZSByZXRyaWV2ZWQKLQkgKiA8ZW0+ZHVyaW5nPC9lbT4gcGFyc2luZywgc3VjaCBhcyBieSB0aGUKLQkgKiBTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0KFN0cmluZyBzb3VyY2VTdHJpbmcsIGludCBwb3NpdGlvbikgewotCQlTdHJpbmdSZWFkZXIgcmVhZGVyID0gbmV3IFN0cmluZ1JlYWRlcihzb3VyY2VTdHJpbmcpOwotCQlyZXNldChyZWFkZXIsIHBvc2l0aW9uKTsKLQkJZlN0cmluZ0lucHV0ID0gc291cmNlU3RyaW5nOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlc2V0SGFuZGxlcnMoKSB7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMgIT0gbnVsbCkgewotCQkJaW50IHNpemUgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMuc2l6ZSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspCi0JCQkJKChTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25IYW5kbGVyKSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMuZ2V0KGkpKS5yZXNldE5vZGVzKCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gTGlzdAotCSAqLwotCXB1YmxpYyB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzKExpc3QgbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnMpIHsKLQkJZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkhhbmRsZXJzID0gbmV3U3RydWN0dXJlZERvY3VtZW50UmVnaW9uSGFuZGxlcnM7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0VG9rZW5pemVyKEJsb2NrVG9rZW5pemVyIG5ld1Rva2VuaXplcikgewotCQkvLyBETVc6IGNoYW5nZWQgZnJvbSBwcml2YXRlIHRvIHByb3RlY3RlZCwgc28gc3ViY2xhc3MgY291bGQgdXNlIGluCi0JCS8vIGNyZWF0aW9uIG9mICduZXdJbnN0YW5jZScuCi0JCWZUb2tlbml6ZXIgPSBuZXdUb2tlbml6ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxODZlZjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkVGV4dFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC50ZXh0LlN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyIGV4dGVuZHMgU3RydWN0dXJlZERvY3VtZW50UmVQYXJzZXIgewotCi0JcHVibGljIFhNTFN0cnVjdHVyZWREb2N1bWVudFJlUGFyc2VyKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZpbmREaXJ0eUVuZChpbnQgZW5kKSB7Ci0JCS8vIENhdXRpb246IGhlcmUncyBvbmUgcGxhY2Ugd2UgaGF2ZSB0byBjYXN0Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChlbmQpOwotCQkvLyBpZiBub3Qgd2VsbCBmb3JtZWQsIGdldCBvbmUgcGFzdCwgaWYgdGhlcmUgaXMgc29tZXRoaW5nIHRoZXJlCi0JCWlmICgocmVzdWx0ICE9IG51bGwpICYmICghcmVzdWx0LmlzRW5kZWQoKSkpIHsKLQkJCWlmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQkJfQotCQl9Ci0JCS8vIGFsc28sIGdldCBvbmUgcGFzdCBpZiBleGFjdGx5IGVxdWFsIHRvIHRoZSBlbmQgKHRoaXMgd2FzIG5lZWRlZAotCQkvLyBhcyBhIHNpbXBsZSBmaXggdG8gd2hlbiBhIHdob2xlIGV4YWN0IHJlZ2lvbiBpcyBkZWxldGVkLgotCQkvLyB0aGVyZSdzIHByb2JhYmx5IGEgYmV0dGVyIHdheS4KLQkJaWYgKChyZXN1bHQgIT0gbnVsbCkgJiYgKGVuZCA9PSByZXN1bHQuZ2V0RW5kKCkpKSB7Ci0JCQlpZiAocmVzdWx0LmdldE5leHQoKSAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gcmVzdWx0LmdldE5leHQoKTsKLQkJCX0KLQkJfQotCi0JCS8vIDEyLzYvMjAwMSAtIFNpbmNlIHdlJ3ZlIGNoYW5nZWQgdGhlIHBhcnNlci9zY2FubmVyIHRvIGFsbG93IGEgbG9uZQotCQkvLyAnPCcgd2l0aG91dAotCQkvLyBhbHdheXMgaW50ZXJwcmV0dGluZyBpdCBhcyBzdGFydCBvZiBhIHRhZyBuYW1lLCB3ZSBuZWVkIHRvIGJlIGEKLQkJLy8gbGl0dGxlIGZhbmNpZXIsIGluIG9yZGVyCi0JCS8vIHRvICJza2lwIiBvdmVyIGFueSBwbGFpbiAnb2wgY29udGVudCBiZXR3ZWVuIHRoZSBsb25lICc8JyBhbmQgYW55Ci0JCS8vIHBvdGVudGlhbCBtZWF0aW5nCi0JCS8vIHJlZ2lvbnMgcGFzdCBwbGFpbiAnb2wgY29udGVudC4KLQkJaWYgKGlzTG9uZU9wZW5Gb2xsb3dlZEJ5Q29udGVudChyZXN1bHQpICYmIChyZXN1bHQuZ2V0TmV4dCgpICE9IG51bGwpKSB7Ci0JCQlyZXN1bHQgPSByZXN1bHQuZ2V0TmV4dCgpOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCAhPSBudWxsKQotCQkJZlN0cnVjdHVyZWREb2N1bWVudC5zZXRDYWNoZWREb2N1bWVudFJlZ2lvbihyZXN1bHQpOwotCQlkaXJ0eUVuZCA9IHJlc3VsdDsKLQotCQlyZXR1cm4gZGlydHlFbmQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZmluZERpcnR5U3RhcnQoaW50IHN0YXJ0KSB7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVzdWx0ID0gZlN0cnVjdHVyZWREb2N1bWVudC5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzdGFydCk7Ci0JCS8vIGhldXJpc3RpYzogaWYgdGhlIHBvc3Rpb24gaXMgZXhhY3RseSBlcXVhbCB0byB0aGUgc3RhcnQsIHRoZW4KLQkJLy8gZ28gYmFjayBvbmUgbW9yZSwgaWYgaXQgZXhpc3RzLiBUaGlzIHByZXZlbnRzIHByb2JsZW1zIHdpdGgKLQkJLy8gaW5zZXJ0aW9ucwotCQkvLyBvZiB0ZXh0IHRoYXQgc2hvdWxkIGJlIG1lcmdlZCB3aXRoIHRoZSBwcmV2aW91cyBub2RlIGluc3RlYWQgb2YKLQkJLy8gc2ltcGx5IGh1bmcKLQkJLy8gb2ZmIG9mIGl0IGFzIGEgc2VwYXJhdGUgbm9kZSAoZXguOiBYTUwgY29udGVudCBpbnNlcnRlZCByaWdodAotCQkvLyBiZWZvcmUgYW4gb3BlbgotCQkvLyBicmFja2V0IHNob3VsZCBiZWNvbWUgcGFydCBvZiB0aGUgcHJldmlvdXMgY29udGVudCBub2RlKQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSByZXN1bHQuZ2V0UHJldmlvdXMoKTsKLQkJCWlmICgocHJldmlvdXMgIT0gbnVsbCkgJiYgKCghKHByZXZpb3VzLmlzRW5kZWQoKSkpIHx8IChzdGFydCA9PSByZXN1bHQuZ2V0U3RhcnQoKSkpKSB7Ci0JCQkJcmVzdWx0ID0gcHJldmlvdXM7Ci0JCQl9Ci0JCQkvLyBJZiB3ZSBhcmUgbm93IGF0IHRoZSBlbmQgb2YgYSAidGFnIGRlcGVuZGVudCIgY29udGVudCBhcmVhIChvcgotCQkJLy8gSlNQIGFyZWEpCi0JCQkvLyB0aGVuIHdlIG5lZWQgdG8gYmFjayB1cCBhbGwgdGhlIHdheSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoYXQuCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBvdGVudGlhbCA9IHJlc3VsdDsKLQkJCXdoaWxlIChpc1BhcnRPZkJsb2NrUmVnaW9uKHBvdGVudGlhbCkpIHsKLQkJCQlwb3RlbnRpYWwgPSBwb3RlbnRpYWwuZ2V0UHJldmlvdXMoKTsKLQkJCX0KLQkJCWlmIChwb3RlbnRpYWwgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHBvdGVudGlhbDsKLQkJCQlmU3RydWN0dXJlZERvY3VtZW50LnNldENhY2hlZERvY3VtZW50UmVnaW9uKHJlc3VsdCk7Ci0JCQl9Ci0JCX0KLQkJZGlydHlTdGFydCA9IHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGUgcnVsZSBpcywgdGhhdCBpcyB3ZSBhcmUgY29udGVudCwgcHJlY2VkZWQgYnkgbG9uZSA8LCB0aGVuIHdlIG5lZWQKLQkgKiB0byBhZHZhbmNlIG9uZSBtb3JlIGZvciBkaXJ0eSBlbmQuCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNMb25lT3BlbkZvbGxvd2VkQnlDb250ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbGF0Tm9kZS5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXMgPSBmbGF0Tm9kZS5nZXRQcmV2aW91cygpOwotCQkJU3RyaW5nIHByZXZpb3VzVHlwZSA9IG51bGw7Ci0JCQlpZiAocHJldmlvdXMgIT0gbnVsbCkgewotCQkJCXByZXZpb3VzVHlwZSA9IHByZXZpb3VzLmdldFR5cGUoKTsKLQkJCX0KLQkJCWlmIChwcmV2aW91c1R5cGUgIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IChwcmV2aW91c1R5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNQYXJ0T2ZCbG9ja1JlZ2lvbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCVN0cmluZyB0eXBlID0gZmxhdE5vZGUuZ2V0VHlwZSgpOwotCQlyZXN1bHQgPSAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZFRleHRSZVBhcnNlciBuZXdJbnN0YW5jZSgpIHsKLQkJcmV0dXJuIG5ldyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZVBhcnNlcigpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFN0cnVjdHVyZWRSZWdpb25GYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNGM4MWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQuWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotCi0KLS8qKgotICogQSBzaW1wbGUgY2xhc3MgdG8gZ2VuZXJhdGUgaW5zdGFuY2VzIG9mIFN0cnVjdHVyZWRSZWdpb25zLgotICovCi1wdWJsaWMgY2xhc3MgWE1MU3RydWN0dXJlZFJlZ2lvbkZhY3RvcnkgewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEpTUF9ESVJFQ1RJVkUgPSAxMDAzOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFhNTCA9IDEwMDE7Ci0JcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgWE1MX0JMT0NLID0gMTAwMjsKLQotCXB1YmxpYyBzdGF0aWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBjcmVhdGVSZWdpb24oaW50IHR5cGUpIHsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpbnN0YW5jZSA9IG51bGw7Ci0JCXN3aXRjaCAodHlwZSkgewotCQkJY2FzZSBYTUwgOgotCQkJCWluc3RhbmNlID0gbmV3IFhNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCWJyZWFrOwotCQkJY2FzZSBYTUxfQkxPQ0sgOgotCQkJCWluc3RhbmNlID0gbmV3IEJsb2NrU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0IDoKLQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBYnN0cmFjdFJlZ2lvbjo6Y3JlYXRlUmVnaW9uLiBJbnZhbGlkIHR5cGUuIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9YTUxUb2tlbml6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFRva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWYxNmQ4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL1hNTFRva2VuaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg4MSArMCwwIEBACi0vKiBUaGUgZm9sbG93aW5nIGNvZGUgd2FzIGdlbmVyYXRlZCBieSBKRmxleCAxLjIuMiBvbiAxLzI3LzA1IDQ6NDggUE0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLypubHNYWFgqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5DaGFyQXJyYXlSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsucGFyc2VyLkJsb2NrVG9rZW5pemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5YTUxQYXJzZXJSZWdpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIGEgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgCi0gKiA8YSBocmVmPSJodHRwOi8vd3d3LmluZm9ybWF0aWsudHUtbXVlbmNoZW4uZGUvfmtsZWluZy9qZmxleC8iPkpGbGV4PC9hPiAxLjIuMgotICogb24gMS8yNy8wNSA0OjQ4IFBNIGZyb20gdGhlIHNwZWNpZmljYXRpb24gZmlsZQotICogPHR0PmZpbGU6L0Q6L2VjbGlwc2Uud3RwL3dvcmtzcGFjZS9vcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUvRGV2VGltZVN1cHBvcnQvU2VkTW9kZWwvSFRNTFRva2VuaXplci9kZXZlbC9YTUxUb2tlbml6ZXIuamZsZXg8L3R0PgotICovCi1wdWJsaWMgY2xhc3MgWE1MVG9rZW5pemVyIGltcGxlbWVudHMgQmxvY2tUb2tlbml6ZXIsIERPTVJlZ2lvbkNvbnRleHQgewotCi0gIC8qKiB0aGlzIGNoYXJhY3RlciBkZW5vdGVzIHRoZSBlbmQgb2YgZmlsZSAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBZWUVPRiA9IC0xOwotCi0gIC8qKiBsZXhpY2FsIHN0YXRlcyAqLwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRCA9IDIzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTl9DT05URU5UID0gMjc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9OQU1FID0gMTI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9UQUdfQ0xPU0UgPSAxMTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFID0gMjE7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUgPSAxMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfREhUTUxfRVFVQUxTID0gMTM7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9UQUdfTkFNRSA9IDE2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUUklCVVRFX1ZBTFVFID0gMTk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0RIVE1MX0FUVFJJQlVURV9WQUxVRSA9IDE0OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfRE9DVFlQRV9JRF9TWVNURU0gPSAyNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0FUVFJJQlVURV9OQU1FID0gMTc7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OID0gMjY7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OID0gMjI7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gMjg7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9DT01NRU5UX0VORCA9IDQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0NEQVRBX1RFWFQgPSAxOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9ESFRNTF9UQUdfQ0xPU0UgPSAxNTsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0NPTU1FTlQgPSAzOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9QSV9DT05URU5UID0gNzsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUElfV1MgPSA2OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9DREFUQV9FTkQgPSAyOwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfQVRUTElTVF9ERUNMQVJBVElPTl9DT05URU5UID0gMjk7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX0JMT0NLX1RBR19TQ0FOID0gMzA7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9QSV9FUVVBTFMgPSA5OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfREVDTEFSQVRJT04gPSAyMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgWVlJTklUSUFMID0gMDsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfWE1MX0RPQ1RZUEVfSURfUFVCTElDID0gMjQ7Ci0gIGZpbmFsIHB1YmxpYyBzdGF0aWMgaW50IFNUX1hNTF9FUVVBTFMgPSAxODsKLSAgZmluYWwgcHVibGljIHN0YXRpYyBpbnQgU1RfUEkgPSA1OwotICBmaW5hbCBwdWJsaWMgc3RhdGljIGludCBTVF9YTUxfUElfQVRUUklCVVRFX05BTUUgPSA4OwotCi0gIC8qKiAKLSAgICogVHJhbnNsYXRlcyBjaGFyYWN0ZXJzIHRvIGNoYXJhY3RlciBjbGFzc2VzCi0gICAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgeXljbWFwX3BhY2tlZCA9IAotICAgICJcMTFcMFwxXDVcMVwyMlwyXDBcMVwxNFwyMlwwXDFcMTRcMVwyMVwxXDExXDFcNTEiKwotICAgICJcMVwxNlwxXDE3XDFcMTJcMVwxM1wxXDE2XDFcMTZcMVwxNlwxXDE2XDFcMTZcMVw3IisKLSAgICAiXDFcNlwxXDNcMTJcMTVcMVwxMFwxXDU0XDFcMVwxXDQzXDFcMlwxXDRcMVwxNiIrCi0gICAgIlwxXDMyXDFcNTVcMVwzMFwxXDMxXDFcMzVcMVw1MlwxXDM0XDFcMzRcMVw0MFwxXDM0IisKLSAgICAiXDFcMzRcMVwyNlwxXDI1XDFcNDJcMVw0MVwxXDQ1XDFcMzRcMVwzNlwxXDM3XDFcMzMiKwotICAgICJcMVw1M1wyXDM0XDFcMjNcMVw0NFwxXDM0XDFcMjdcMVwwXDFcMjBcMVwwXDFcMTAiKwotICAgICJcMVwwXDFcNDdcMVw1NVwxXDU2XDFcNTBcMVwzNVwxXDUyXDFcMzRcMVwzNFwxXDQwIisKLSAgICAiXDJcMzRcMVwyNlwxXDI1XDFcNDJcMVw0MVwxXDQ1XDFcMzRcMVwzNlwxXDM3XDFcNDYiKwotICAgICJcMVw1M1wxXDM0XDFcMzRcMVwyNFwxXDQ0XDFcMzRcMVwwXDFcMFw3MlwwXDFcNjAiKwotICAgICJcMTBcMFwyN1w1N1wxXDBcMzdcNTdcMVwwXDcyXDU3XDJcMFwxM1w1N1wyXDBcMTBcNTciKwotICAgICJcMVwwXDY1XDU3XDFcMFwxMDRcNTdcMTFcMFw0NFw1N1wzXDBcMlw1N1w0XDBcMzZcNTciKwotICAgICJcNzBcMFwxMzFcNTdcMjJcMFw3XDU3XDE2XDBcMlw2MFw1NlwwXDEwNlw2MFwzMlwwXDJcNjAiKwotICAgICJcNDRcMFwxXDU3XDFcNjBcM1w1N1wxXDBcMVw1N1wxXDBcMjRcNTdcMVwwXDU0XDU3IisKLSAgICAiXDFcMFw3XDU3XDNcMFwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3IisKLSAgICAiXDFcMFwyMlw1N1wxNVwwXDE0XDU3XDFcMFwxMDJcNTdcMVwwXDE0XDU3XDFcMFw0NFw1NyIrCi0gICAgIlwxXDBcNFw2MFwxMVwwXDY1XDU3XDJcMFwyXDU3XDJcMFwyXDU3XDNcMFwzNFw1NyIrCi0gICAgIlwyXDBcMTBcNTdcMlwwXDJcNTdcNjdcMFw0Nlw1N1wyXDBcMVw1N1w3XDBcNDZcNTciKwotICAgICJcMTJcMFwyMVw2MFwxXDBcMjdcNjBcMVwwXDNcNjBcMVwwXDFcNjBcMVwwXDJcNjAiKwotICAgICJcMVwwXDFcNjBcMTNcMFwzM1w1N1w1XDBcM1w1N1w1NlwwXDMyXDU3XDVcMFwxXDYwIisKLSAgICAiXDEyXDU3XDEwXDYwXDE1XDBcMTJcNjBcNlwwXDFcNjBcMTA3XDU3XDJcMFw1XDU3XDFcMCIrCi0gICAgIlwxN1w1N1wxXDBcNFw1N1wxXDBcMVw1N1wxN1w2MFwyXDU3XDJcNjBcMVwwXDRcNjAiKwotICAgICJcMlwwXDEyXDYwXHUwMjA3XDBcM1w2MFwxXDBcNjVcNTdcMlwwXDFcNjBcMVw1N1wyMFw2MCIrCi0gICAgIlwzXDBcNFw2MFwzXDBcMTJcNTdcMlw2MFwyXDBcMTJcNjBcMjFcMFwzXDYwXDFcMCIrCi0gICAgIlwxMFw1N1wyXDBcMlw1N1wyXDBcMjZcNTdcMVwwXDdcNTdcMVwwXDFcNTdcM1wwIisKLSAgICAiXDRcNTdcMlwwXDFcNjBcMVwwXDdcNjBcMlwwXDJcNjBcMlwwXDNcNjBcMTFcMCIrCi0gICAgIlwxXDYwXDRcMFwyXDU3XDFcMFwzXDU3XDJcNjBcMlwwXDEyXDYwXDJcNTdcMjBcMCIrCi0gICAgIlwxXDYwXDJcMFw2XDU3XDRcMFwyXDU3XDJcMFwyNlw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcMlw1N1wxXDBcMlw1N1wxXDBcMlw1N1wyXDBcMVw2MFwxXDBcNVw2MFw0XDAiKwotICAgICJcMlw2MFwyXDBcM1w2MFwxM1wwXDRcNTdcMVwwXDFcNTdcN1wwXDEyXDYwXDJcNjAiKwotICAgICJcM1w1N1wxNFwwXDNcNjBcMVwwXDdcNTdcMVwwXDFcNTdcMVwwXDNcNTdcMVwwIisKLSAgICAiXDI2XDU3XDFcMFw3XDU3XDFcMFwyXDU3XDFcMFw1XDU3XDJcMFwxXDYwXDFcNTciKwotICAgICJcMTBcNjBcMVwwXDNcNjBcMVwwXDNcNjBcMjJcMFwxXDU3XDVcMFwxMlw2MFwyMVwwIisKLSAgICAiXDNcNjBcMVwwXDEwXDU3XDJcMFwyXDU3XDJcMFwyNlw1N1wxXDBcN1w1N1wxXDAiKwotICAgICJcMlw1N1wyXDBcNFw1N1wyXDBcMVw2MFwxXDU3XDZcNjBcM1wwXDJcNjBcMlwwIisKLSAgICAiXDNcNjBcMTBcMFwyXDYwXDRcMFwyXDU3XDFcMFwzXDU3XDRcMFwxMlw2MFwyMlwwIisKLSAgICAiXDJcNjBcMVwwXDZcNTdcM1wwXDNcNTdcMVwwXDRcNTdcM1wwXDJcNTdcMVwwIisKLSAgICAiXDFcNTdcMVwwXDJcNTdcM1wwXDJcNTdcM1wwXDNcNTdcM1wwXDEwXDU3XDFcMCIrCi0gICAgIlwzXDU3XDRcMFw1XDYwXDNcMFwzXDYwXDFcMFw0XDYwXDExXDBcMVw2MFwxN1wwIisKLSAgICAiXDExXDYwXDIxXDBcM1w2MFwxXDBcMTBcNTdcMVwwXDNcNTdcMVwwXDI3XDU3XDFcMCIrCi0gICAgIlwxMlw1N1wxXDBcNVw1N1w0XDBcN1w2MFwxXDBcM1w2MFwxXDBcNFw2MFw3XDAiKwotICAgICJcMlw2MFwxMVwwXDJcNTdcNFwwXDEyXDYwXDIyXDBcMlw2MFwxXDBcMTBcNTdcMVwwIisKLSAgICAiXDNcNTdcMVwwXDI3XDU3XDFcMFwxMlw1N1wxXDBcNVw1N1w0XDBcN1w2MFwxXDAiKwotICAgICJcM1w2MFwxXDBcNFw2MFw3XDBcMlw2MFw3XDBcMVw1N1wxXDBcMlw1N1w0XDAiKwotICAgICJcMTJcNjBcMjJcMFwyXDYwXDFcMFwxMFw1N1wxXDBcM1w1N1wxXDBcMjdcNTdcMVwwIisKLSAgICAiXDIwXDU3XDRcMFw2XDYwXDJcMFwzXDYwXDFcMFw0XDYwXDExXDBcMVw2MFwxMFwwIisKLSAgICAiXDJcNTdcNFwwXDEyXDYwXDIyMVwwXDU2XDU3XDFcMFwxXDU3XDFcNjBcMlw1N1w3XDYwIisKLSAgICAiXDVcMFw2XDU3XDFcNjBcMTBcNjBcMVwwXDEyXDYwXDQ3XDBcMlw1N1wxXDBcMVw1NyIrCi0gICAgIlwyXDBcMlw1N1wxXDBcMVw1N1wyXDBcMVw1N1w2XDBcNFw1N1wxXDBcN1w1NyIrCi0gICAgIlwxXDBcM1w1N1wxXDBcMVw1N1wxXDBcMVw1N1wyXDBcMlw1N1wxXDBcMlw1NyIrCi0gICAgIlwxXDBcMVw1N1wxXDYwXDJcNTdcNlw2MFwxXDBcMlw2MFwxXDU3XDJcMFw1XDU3IisKLSAgICAiXDFcMFwxXDYwXDFcMFw2XDYwXDJcMFwxMlw2MFw3NlwwXDJcNjBcNlwwXDEyXDYwIisKLSAgICAiXDEzXDBcMVw2MFwxXDBcMVw2MFwxXDBcMVw2MFw0XDBcMlw2MFwxMFw1N1wxXDAiKwotICAgICJcNDFcNTdcN1wwXDI0XDYwXDFcMFw2XDYwXDRcMFw2XDYwXDFcMFwxXDYwXDFcMCIrCi0gICAgIlwyNVw2MFwzXDBcN1w2MFwxXDBcMVw2MFwzNDZcMFw0Nlw1N1wxMlwwXDQ3XDU3XDExXDAiKwotICAgICJcMVw1N1wxXDBcMlw1N1wxXDBcM1w1N1wxXDBcMVw1N1wxXDBcMlw1N1wxXDAiKwotICAgICJcNVw1N1w1MVwwXDFcNTdcMVwwXDFcNTdcMVwwXDFcNTdcMTNcMFwxXDU3XDFcMCIrCi0gICAgIlwxXDU3XDFcMFwxXDU3XDNcMFwyXDU3XDNcMFwxXDU3XDVcMFwzXDU3XDFcMCIrCi0gICAgIlwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3XDFcMFwxXDU3XDNcMFwyXDU3XDNcMCIrCi0gICAgIlwyXDU3XDFcMFwxXDU3XDUwXDBcMVw1N1wxMVwwXDFcNTdcMlwwXDFcNTdcMlwwIisKLSAgICAiXDJcNTdcN1wwXDJcNTdcMVwwXDFcNTdcMVwwXDdcNTdcNTBcMFwxXDU3XDRcMCIrCi0gICAgIlwxXDU3XDEwXDBcMVw1N1x1MGMwNlwwXDIzNFw1N1w0XDBcMTMyXDU3XDZcMFwyNlw1N1wyXDAiKwotICAgICJcNlw1N1wyXDBcNDZcNTdcMlwwXDZcNTdcMlwwXDEwXDU3XDFcMFwxXDU3XDFcMCIrCi0gICAgIlwxXDU3XDFcMFwxXDU3XDFcMFwzN1w1N1wyXDBcNjVcNTdcMVwwXDdcNTdcMVwwIisKLSAgICAiXDFcNTdcM1wwXDNcNTdcMVwwXDdcNTdcM1wwXDRcNTdcMlwwXDZcNTdcNFwwIisKLSAgICAiXDE1XDU3XDVcMFwzXDU3XDFcMFw3XDU3XDMyM1wwXDE1XDYwXDRcMFwxXDYwXDEwNFwwIisKLSAgICAiXDFcNTdcM1wwXDJcNTdcMlwwXDFcNTdcMTIxXDBcM1w1N1x1MGU4MlwwXDFcNjBcMVwwIisKLSAgICAiXDFcNTdcMzFcMFwxMVw1N1w2XDYwXDFcMFw1XDYwXDEzXDBcMTI0XDU3XDRcMFwyXDYwIisKLSAgICAiXDJcMFwyXDYwXDJcMFwxMzJcNTdcMVwwXDNcNjBcNlwwXDUwXDU3XHUxY2QzXDBcdTUxYTZcNTciKwotICAgICJcdTBjNWFcMFx1MmJhNFw1N1wxMzRcMFx1MDgwMFwwXHUxZmZlXDBcMlwwIjsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgY2hhcmFjdGVycyB0byBjaGFyYWN0ZXIgY2xhc3NlcwotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgY2hhciBbXSB5eWNtYXAgPSB5eV91bnBhY2tfY21hcCh5eWNtYXBfcGFja2VkKTsKLQotICAvKiogCi0gICAqIFRyYW5zbGF0ZXMgYSBzdGF0ZSB0byBhIHJvdyBpbmRleCBpbiB0aGUgdHJhbnNpdGlvbiB0YWJsZQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5X3Jvd01hcCBbXSA9IHsgCi0gICAgICAgIDAsICAgIDQ5LCAgICA5OCwgICAxNDcsICAgMTk2LCAgIDI0NSwgICAyOTQsICAgMzQzLCAgIDM5MiwgICA0NDEsIAotICAgICAgNDkwLCAgIDUzOSwgICA1ODgsICAgNjM3LCAgIDY4NiwgICA3MzUsICAgNzg0LCAgIDgzMywgICA4ODIsICAgOTMxLCAKLSAgICAgIDk4MCwgIDEwMjksICAxMDc4LCAgMTEyNywgIDExNzYsICAxMjI1LCAgMTI3NCwgIDEzMjMsICAxMzcyLCAgMTQyMSwgCi0gICAgIDE0NzAsICAxNTE5LCAgMTU2OCwgIDE2MTcsICAxNjY2LCAgMTcxNSwgIDE3NjQsICAxNzE1LCAgMTc2NCwgIDE4MTMsIAotICAgICAxNzE1LCAgMTcxNSwgIDE3NjQsICAxODYyLCAgMTkxMSwgIDE5NjAsICAyMDA5LCAgMjA1OCwgIDIxMDcsICAyMTU2LCAKLSAgICAgMTcxNSwgIDE3NjQsICAyMjA1LCAgMjI1NCwgIDIzMDMsICAxNzE1LCAgMjM1MiwgIDIzNTIsICAyNDAxLCAgMjQ1MCwgCi0gICAgIDI0OTksICAyMjA1LCAgMTcxNSwgIDI1NDgsICAyNTk3LCAgMTcxNSwgIDI2NDYsICAyNjk1LCAgMjc0NCwgIDI3OTMsIAotICAgICAyODQyLCAgMjg5MSwgIDE3MTUsICAyOTQwLCAgMjk4OSwgIDMwMzgsICAzMDg3LCAgMTcxNSwgIDMxMzYsICAzMTg1LCAKLSAgICAgMzIzNCwgIDMyODMsICAzMzMyLCAgMTcxNSwgIDMzODEsICAzNDMwLCAgMzQ3OSwgIDM1MjgsICAzNTc3LCAgMzYyNiwgCi0gICAgIDM2NzUsICAzNzI0LCAgMzcyNCwgIDM3NzMsICAzODIyLCAgMzg3MSwgIDM5MjAsICAzOTIwLCAgMzk2OSwgIDQwMTgsIAotICAgICA0MDY3LCAgNDExNiwgIDQxMTYsICA0MTY1LCAgNDIxNCwgIDQyNjMsICA0MzEyLCAgMTcxNSwgIDQzNjEsICA0MzYxLCAKLSAgICAgNDQxMCwgIDQ0NTksICA0NTA4LCAgNDU1NywgIDE3MTUsICAxNzE1LCAgMTc2NCwgIDE3MTUsICAxNzE1LCAgNDYwNiwgCi0gICAgIDQ2NTUsICA0NzA0LCAgNDc1MywgIDQ4MDIsICA0ODUxLCAgNDkwMCwgIDQ5NDksICAxNzE1LCAgNDk5OCwgIDUwNDcsIAotICAgICAxNzE1LCAgMTcxNSwgIDIzNTIsICA1MDk2LCAgMjQ1MCwgIDE3MTUsICA1MTQ1LCAgMjQ5OSwgIDI1NDgsICAyNjQ2LCAKLSAgICAgMjY5NSwgIDUxOTQsICAyNzQ0LCAgMTcxNSwgIDUyNDMsICAyNzkzLCAgMTcxNSwgIDMxMzYsICA1MjkyLCAgMzIzNCwgCi0gICAgIDE3MTUsICA1MzQxLCAgMzI4MywgIDQ2MDYsICA1MzkwLCAgNTQzOSwgIDU0ODgsICAzNTI4LCAgMTcxNSwgIDU1MzcsIAotICAgICA1NTg2LCAgMzcyNCwgIDU2MzUsICAzNzczLCAgMTcxNSwgIDU2ODQsICA1NzMzLCAgNTc4MiwgIDU3ODIsICA1ODMxLCAKLSAgICAgNTg4MCwgIDM4NzEsICAzNzI0LCAgMzkyMCwgIDU5MjksICAzOTY5LCAgMTcxNSwgIDU5NzgsICA0MDE4LCAgNDA2NywgCi0gICAgIDM5MjAsICA0MTE2LCAgNjAyNywgIDQxNjUsICAxNzE1LCAgNjA3NiwgIDYxMjUsICA2MTc0LCAgNjE3NCwgIDYyMjMsIAotICAgICA2MjcyLCAgNjMyMSwgIDQzNjEsICA2MzcwLCAgNDQxMCwgIDE3MTUsICA2NDE5LCAgNjQ2OCwgIDY1MTcsICA2NTE3LCAKLSAgICAgNjU2NiwgIDY2MTUsICA2NjY0LCAgNjcxMywgIDY3NjIsICA2ODExLCAgNjg2MCwgIDE3MTUsICA2OTA5LCAgNjk1OCwgCi0gICAgIDE3MTUsICAxNzE1LCAgMTcxNSwgIDIwMDksICA3MDA3LCAgNzA1NiwgIDcxMDUsICA3MTU0LCAgNzIwMywgIDcyNTIsIAotICAgICA1Njg0LCAgNzMwMSwgIDczMDEsICA2MDc2LCAgNzM1MCwgIDczNTAsICA3Mzk5LCAgNjQxOSwgIDc0NDgsICA3NDQ4LCAKLSAgICAgNzQ5NywgIDE3MTUsICA3NTQ2LCAgNzU5NSwgIDE3MTUsICA3NjQ0LCAgNzY5MywgIDc3NDIsICA3NzkxLCAgNzg0MCwgCi0gICAgIDc4ODksICA3OTM4LCAgNTgzMSwgIDYyMjMsICA3OTg3LCAgNjU2NiwgIDgwMzYsICA4MDg1LCAgODEzNCwgIDgxODMsIAotICAgICA4MjMyLCAgODI4MSwgIDgzMzAsICA4Mzc5LCAgODQyOCwgIDg0NzcsICA4NTI2LCAgODU3NSwgIDg2MjQsICA4NjczLCAKLSAgICAgODcyMiwgIDE3MTUsICAxNzE1LCAgODc3MSwgIDg4MjAsICA4ODY5LCAgODkxOCwgIDE3MTUsICAxNzE1LCAgMTcxNSwgCi0gICAgIDg5NjcsICA5MDE2LCAgOTA2NSwgIDkxMTQsICA5MTYzLCAgMTcxNSwgIDQyNjMsICA0NTA4Ci0gIH07Ci0KLSAgLyoqIAotICAgKiBUaGUgcGFja2VkIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHl5X3BhY2tlZCA9IAotICAgICJcMVw0MFwxXDQxXDEwXDQwXDFcNDJcNFw0MFwxXDQzXDQxXDQwXDFcNDQiKwotICAgICJcMVw0NVw1N1w0NFwxXDQ2XDFcNDdcMTZcNDZcMVw1MFwxXDQ2XDFcNTEiKwotICAgICJcMzZcNDZcMVw1MlwxXDUzXDU3XDUyXDFcNDZcMVw0N1w1XDQ2XDFcNTQiKwotICAgICJcMTJcNDZcMVw1MVwzN1w0NlwxXDQ3XDJcNDZcMVw1NVwxXDU2XDJcNDYiKwotICAgICJcMVw1N1wzXDQ2XDFcNTZcNVw0NlwxXDU2XDJcNjBcMlw1N1wxXDQ2IisKLSAgICAiXDEwXDU3XDFcNjFcMlw1N1wxXDQ2XDVcNTdcMVw0NlwyXDU3XDFcNDYiKwotICAgICJcM1w1N1wyXDQ2XDFcNDdcMlw0NlwxXDU1XDFcNjJcNlw0NlwxXDYyIisKLSAgICAiXDVcNDZcMVw2MlwzNlw0NlwxXDYzXDFcNjRcMlw2M1wxXDY1XDE1XDYzIisKLSAgICAiXDFcNTFcMzZcNjNcMVw0NlwxXDQ3XDJcNDZcMVw2NlwxXDU2XDJcNDYiKwotICAgICJcMVw2N1wzXDQ2XDFcNTZcNVw0NlwxXDU2XDRcNjdcMVw0NlwxM1w2NyIrCi0gICAgIlwxXDQ2XDVcNjdcMVw0NlwyXDY3XDFcNDZcM1w2N1wyXDQ2XDFcNDciKwotICAgICJcMlw0NlwxXDY2XDFcNTZcMlw0NlwxXDY3XDNcNDZcMVw1Nlw1XDQ2IisKLSAgICAiXDFcNTZcNFw2N1wxXDQ2XDEzXDY3XDFcNzBcNVw2N1wxXDQ2XDJcNjciKwotICAgICJcMVw0NlwzXDY3XDFcNDZcMVw3MVwxXDQ3XDFcNDZcMVw3MlwxXDczIisKLSAgICAiXDFcNTZcM1w3MVwxXDc0XDFcNzFcMVw3NVwxXDU2XDVcNzFcMVw1NiIrCi0gICAgIlwzNlw3MVwxXDQ2XDFcNDdcMlw0NlwxXDc2XDE1XDQ2XDFcNTFcMzdcNDYiKwotICAgICJcMVw0N1wxXDc3XDFcMTAwXDFcNDZcMVw1NlwyXDQ2XDFcMTAxXDNcNDYiKwotICAgICJcMVw1Nlw1XDQ2XDFcNTZcNFwxMDFcMVw0NlwxM1wxMDFcMVw0Nlw1XDEwMSIrCi0gICAgIlwxXDQ2XDJcMTAxXDFcNDZcM1wxMDFcMlw0NlwxXDQ3XDFcNzdcMVwxMDAiKwotICAgICJcMVw0NlwxXDU2XDJcNDZcMVwxMDFcM1w0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlw0XDEwMVwxXDQ2XDEzXDEwMVwxXDEwMlw1XDEwMVwxXDQ2XDJcMTAxXDFcNDYiKwotICAgICJcM1wxMDFcMVw0NlwxXDEwM1wxXDQ3XDFcNzdcMVwxMDRcMVwxMDNcMVw1NiIrCi0gICAgIlwzXDEwM1wxXDEwNVwxXDEwM1wxXDEwNlwxXDU2XDVcMTAzXDFcNTZcMzZcMTAzIisKLSAgICAiXDFcNDZcMVw0N1wzXDQ2XDFcNTZcNlw0NlwxXDU2XDVcNDZcMVw1NiIrCi0gICAgIlwzNlw0NlwxXDEwN1wxXDExMFwxXDExMVwxXDExMlw0XDEwN1wxXDExM1wxMlwxMDciKwotICAgICJcNFwxMTRcMVwxMDdcMTNcMTE0XDFcMTA3XDVcMTE0XDFcMTA3XDJcMTE0XDFcMTA3IisKLSAgICAiXDNcMTE0XDFcMTA3XDFcNDZcMVwxMTBcMVwxMTFcMVwxMTJcMVw0NlwxXDU2IisKLSAgICAiXDJcNDZcMVwxMTVcM1w0NlwxXDU2XDVcNDZcMVw1Nlw0XDExNVwxXDQ2IisKLSAgICAiXDEzXDExNVwxXDQ2XDVcMTE1XDFcNDZcMlwxMTVcMVw0NlwzXDExNVwyXDQ2IisKLSAgICAiXDFcMTEwXDFcMTExXDFcMTEyXDFcNDZcMVw1NlwyXDQ2XDFcMTE1XDNcNDYiKwotICAgICJcMVw1Nlw1XDQ2XDFcNTZcNFwxMTVcMVw0NlwxM1wxMTVcMVwxMTZcNVwxMTUiKwotICAgICJcMVw0NlwyXDExNVwxXDQ2XDNcMTE1XDFcNDZcMVwxMTdcMVwxMTBcMVwxMTEiKwotICAgICJcMVwxMjBcMVwxMTdcMVw1NlwzXDExN1wxXDEyMVwxXDExN1wxXDEyMlwxXDU2IisKLSAgICAiXDVcMTE3XDFcNTZcMzZcMTE3XDFcNDZcMVwxMjNcMVwxMjRcMlw0NlwxXDU2IisKLSAgICAiXDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNlw0NlwxXDEyNVwxXDEyNlwyXDQ2IisKLSAgICAiXDFcMTI3XDExXDQ2XDFcMTI2XDFcMTI1XDExXDQ2XDFcNDdcMVwxMjRcMlw0NiIrCi0gICAgIlwxXDU2XDZcNDZcMVw1Nlw1XDQ2XDFcNTZcNFw0NlwxXDEzMFwzMlw0NiIrCi0gICAgIlwxXDQ3XDFcMTI0XDJcNDZcMVw1NlwyXDQ2XDFcMTMxXDNcNDZcMVw1NiIrCi0gICAgIlw1XDQ2XDFcNTZcNFwxMzFcMVwxMzBcMTNcMTMxXDFcNDZcNVwxMzFcMVw0NiIrCi0gICAgIlwyXDEzMVwxXDQ2XDNcMTMxXDJcNDZcMVw0N1wxXDEyNFwyXDQ2XDFcNTYiKwotICAgICJcNlw0NlwxXDU2XDVcNDZcMVw1Nlw0XDQ2XDFcMTMwXDdcNDZcMVwxMzIiKwotICAgICJcNVw0NlwxXDEzM1wxM1w0NlwxXDEzNFwxXDQ3XDFcMTI0XDFcMTM1XDFcMTM0IisKLSAgICAiXDFcNTZcM1wxMzRcMVwxMzZcMVwxMzRcMVwxMzdcMVw1Nlw1XDEzNFwxXDU2IisKLSAgICAiXDRcMTM0XDFcMTQwXDMxXDEzNFwxXDE0MVwxXDQ3XDFcMTI0XDFcMTQyXDFcMTQxIisKLSAgICAiXDFcNTZcM1wxNDFcMVwxNDNcMVwxNDFcMVwxNDRcMVw1Nlw1XDE0MVwxXDU2IisKLSAgICAiXDRcMTQxXDFcMTQ1XDMxXDE0MVwxXDE0NlwxXDQ3XDFcMTI0XDFcMTQ3XDFcMTQ2IisKLSAgICAiXDFcNTZcM1wxNDZcMVwxNTBcMVwxNDZcMVwxNTFcMVw1Nlw1XDE0NlwxXDU2IisKLSAgICAiXDM2XDE0NlwxXDE1MlwxXDE1M1wxXDE1NFw1NlwxNTJcMVwxNTVcMVw0N1wxXDEyNCIrCi0gICAgIlwxXDE1NlwxXDE1NVwxXDU2XDNcMTU1XDFcMTU3XDFcMTU1XDFcMTYwXDFcNTYiKwotICAgICJcNVwxNTVcMVw1NlwzNlwxNTVcMVwxNjFcMVwxNjJcMVwxNjNcNTZcMTYxXDFcMTY0IisKLSAgICAiXDFcMTY1XDU3XDE2NFwxXDQwXDFcMFwxMFw0MFwxXDBcNFw0MFwxXDAiKwotICAgICJcNDFcNDBcM1wwXDFcMTY2XDFcMTY3XDE0XDBcMVwxNzBcNDRcMFwxXDE3MSIrCi0gICAgIlwyXDBcMVwxNzJcM1wwXDFcMTcxXDVcMFwxXDE3MVw0XDE3MlwxXDAiKwotICAgICJcMTNcMTcyXDFcMFw1XDE3MlwxXDE3M1wyXDE3MlwxXDBcM1wxNzJcNlwwIisKLSAgICAiXDFcMTcxXDJcMFwxXDE3NFwzXDBcMVwxNzFcNVwwXDFcMTcxXDRcMTc0IisKLSAgICAiXDFcMFwxM1wxNzRcMVwwXDVcMTc0XDFcMFwyXDE3NFwxXDBcM1wxNzQiKwotICAgICJcMTAzXDBcMVwxNzVcNTdcMFwxXDE3Nlw0N1wwXDFcMTc3XDUzXDBcMVwyMDAiKwotICAgICJcNjNcMFwxXDU2XDZcMFwxXDU2XDVcMFwxXDU2XDQ0XDBcM1w1NyIrCi0gICAgIlw0XDBcMVw1N1w1XDBcNFw1N1wxXDBcMTNcNTdcMVwwXDVcNTciKwotICAgICJcMVwwXDJcNTdcMVwwXDRcNTdcNlwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDJcNTdcMVwyMDFcMVw1N1wxXDBcMTNcNTdcMVwwXDVcNTciKwotICAgICJcMVwwXDJcNTdcMVwwXDRcNTdcNlwwXDNcNTdcNFwwXDFcNTciKwotICAgICJcNVwwXDJcNTdcMVwyMDJcMVw1N1wxXDBcMTNcNTdcMVwwXDVcNTciKwotICAgICJcMVwwXDJcNTdcMVwwXDRcNTdcNVwwXDFcNjJcNlwwXDFcNjIiKwotICAgICJcNVwwXDFcNjJcNDBcMFwxXDIwM1w2MFwwXDFcMjA0XDY0XDBcM1w2NyIrCi0gICAgIlw0XDBcMVw2N1w1XDBcNFw2N1wxXDBcMTNcNjdcMVwwXDVcNjciKwotICAgICJcMVwwXDJcNjdcMVwwXDRcNjdcMVw3MVwyXDBcMVwyMDVcMVw3MSIrCi0gICAgIlwxXDBcM1w3MVwxXDBcMVw3MVwyXDBcNVw3MVwxXDBcMzdcNzEiKwotICAgICJcMVwwXDFcMjA0XDFcMjA1XDFcNzFcMVwwXDNcNzFcMVwwXDFcNzEiKwotICAgICJcMlwwXDVcNzFcMVwwXDM2XDcxXDFcNzRcMVwwXDFcMjA2XDFcMjA3IisKLSAgICAiXDFcNzRcMVwyMDZcM1w3NFwxXDIxMFwxXDc0XDJcMjA2XDVcNzRcMVwyMDYiKwotICAgICJcMzZcNzRcMVw3NVwxXDBcMVwyMTFcMVwyMTJcMVw3NVwxXDIxMVwzXDc1IisKLSAgICAiXDFcMjExXDFcNzVcMVwyMTBcMVwyMTFcNVw3NVwxXDIxMVwzNlw3NVwyXDAiKwotICAgICJcMVw3N1wxXDIxM1w2M1wwXDNcMTAxXDRcMFwxXDEwMVw1XDBcNFwxMDEiKwotICAgICJcMVwwXDEzXDEwMVwxXDBcNVwxMDFcMVwwXDJcMTAxXDFcMFw0XDEwMSIrCi0gICAgIlwxXDEwM1wyXDBcMVwyMTRcMVwxMDNcMVwwXDNcMTAzXDFcMFwxXDEwMyIrCi0gICAgIlwyXDBcNVwxMDNcMVwwXDM3XDEwM1wxXDBcMVw3N1wxXDIxNVwxXDEwMyIrCi0gICAgIlwxXDBcM1wxMDNcMVwwXDFcMTAzXDJcMFw1XDEwM1wxXDBcMzZcMTAzIisKLSAgICAiXDFcMTA1XDFcMFwxXDIxNlwxXDIxN1wxXDEwNVwxXDIxNlwzXDEwNVwxXDIyMCIrCi0gICAgIlwxXDEwNVwyXDIxNlw1XDEwNVwxXDIxNlwzNlwxMDVcMVwxMDZcMVwwXDFcMjIxIisKLSAgICAiXDFcMjIyXDFcMTA2XDFcMjIxXDNcMTA2XDFcMjIxXDFcMTA2XDFcMjIwXDFcMjIxIisKLSAgICAiXDVcMTA2XDFcMjIxXDM2XDEwNlwxXDEwN1wzXDBcMTdcMTA3XDRcMFwxXDEwNyIrCi0gICAgIlwxM1wwXDFcMTA3XDVcMFwxXDEwN1wyXDBcMVwxMDdcM1wwXDFcMTA3IisKLSAgICAiXDNcMFwxXDE2NlwxNVwwXDFcMTcwXDQxXDBcMVwyMjNcNTZcMFwxXDEwNyIrCi0gICAgIlwzXDBcMlwxMDdcM1wxMTNcNFwxMDdcMVwxMTNcNVwxMDdcNFwxMTRcMVwxMDciKwotICAgICJcMTNcMTE0XDFcMTA3XDVcMTE0XDFcMTA3XDJcMTE0XDFcMTA3XDNcMTE0XDFcMTEzIisKLSAgICAiXDZcMFwzXDExNFw0XDBcMVwxMTRcNVwwXDRcMTE0XDFcMFwxM1wxMTQiKwotICAgICJcMVwwXDVcMTE0XDFcMFwyXDExNFwxXDBcNFwxMTRcNlwwXDNcMTE1IisKLSAgICAiXDRcMFwxXDExNVw1XDBcNFwxMTVcMVwwXDEzXDExNVwxXDBcNVwxMTUiKwotICAgICJcMVwwXDJcMTE1XDFcMFw0XDExNVwxXDExN1wyXDBcMVwyMjRcMVwxMTciKwotICAgICJcMVwwXDNcMTE3XDFcMFwxXDExN1wyXDBcNVwxMTdcMVwwXDM3XDExNyIrCi0gICAgIlwxXDBcMVwyMjNcMVwyMjRcMVwxMTdcMVwwXDNcMTE3XDFcMFwxXDExNyIrCi0gICAgIlwyXDBcNVwxMTdcMVwwXDM2XDExN1wxXDEyMVwxXDBcMVwyMjVcMVwyMjYiKwotICAgICJcMVwxMjFcMVwyMjVcM1wxMjFcMVwyMjdcMVwxMjFcMlwyMjVcNVwxMjFcMVwyMjUiKwotICAgICJcMzZcMTIxXDFcMTIyXDFcMFwxXDIzMFwxXDIzMVwxXDEyMlwxXDIzMFwzXDEyMiIrCi0gICAgIlwxXDIzMFwxXDEyMlwxXDIyN1wxXDIzMFw1XDEyMlwxXDIzMFwzNlwxMjJcM1wwIisKLSAgICAiXDFcMTY2XDE1XDBcMVwyMzJcMTAwXDBcMVwyMzNcNTJcMFwxXDIzNFwxMlwwIisKLSAgICAiXDFcMjM0XDQwXDBcMVwyMzVcMzJcMFwyMFwyMzZcMVwyMzdcNDBcMjM2XDZcMCIrCi0gICAgIlwzXDEzMVw0XDBcMVwxMzFcNVwwXDRcMTMxXDFcMFwxM1wxMzFcMVwwIisKLSAgICAiXDVcMTMxXDFcMFwyXDEzMVwxXDBcNFwxMzFcNDRcMFwxXDI0MFw2N1wwIisKLSAgICAiXDFcMjQxXDVcMFwxXDEzNFwyXDBcMVwyNDJcMVwxMzRcMVwwXDNcMTM0IisKLSAgICAiXDFcMFwxXDEzNFwyXDBcNVwxMzRcMVwwXDM2XDEzNFwxXDEzNlwxXDAiKwotICAgICJcMVwyNDNcMVwyNDRcMVwxMzZcMVwyNDNcM1wxMzZcMVwyNDVcMVwxMzZcMlwyNDMiKwotICAgICJcNVwxMzZcMVwyNDNcMzZcMTM2XDFcMjQ2XDFcMFwxXDI0N1wxXDI1MFwxXDI1MSIrCi0gICAgIlwxXDI0N1wzXDI1MVwxXDI0N1wxXDI0NlwxXDI1MlwxXDI1M1wzXDI1MVwxXDI0NiIrCi0gICAgIlwxXDI1MVwxXDI1M1w0XDI1MVwxXDI0NlwyN1wyNTFcMlwyNDZcMVwxNDBcMlwyMzYiKwotICAgICJcMVwyNTRcMVwxNDBcMVwyMzZcM1wxNDBcMVwyMzZcMVwxNDBcMlwyMzZcM1wxNDAiKwotICAgICJcMVwyNTVcMVwxNDBcMVwyMzZcMzZcMTQwXDFcMTQxXDJcMFwxXDI1NlwxXDE0MSIrCi0gICAgIlwxXDBcM1wxNDFcMVwwXDFcMTQxXDJcMFw1XDE0MVwxXDBcMzZcMTQxIisKLSAgICAiXDFcMTQzXDJcMjU3XDFcMjYwXDFcMTQzXDFcMjU3XDNcMTQzXDFcMjYxXDFcMTQzIisKLSAgICAiXDJcMjU3XDVcMTQzXDFcMjU3XDM2XDE0M1wxXDE0NFwyXDI2MlwxXDI2M1wxXDE0NCIrCi0gICAgIlwxXDI2MlwzXDE0NFwxXDI2MlwxXDE0NFwxXDI2MVwxXDI2Mlw1XDE0NFwxXDI2MiIrCi0gICAgIlwzNlwxNDRcMVwxNDVcMlwyMzZcMVwyNjRcMVwxNDVcMVwyMzZcM1wxNDVcMVwyMzYiKwotICAgICJcMVwxNDVcMlwyMzZcM1wxNDVcMVwyNjVcMVwxNDVcMVwyMzZcMzZcMTQ1XDFcMTQ2IisKLSAgICAiXDJcMFwxXDI2NlwxXDE0NlwxXDBcM1wxNDZcMVwwXDFcMTQ2XDJcMCIrCi0gICAgIlw1XDE0NlwxXDBcMzZcMTQ2XDFcMTUwXDFcMFwxXDI2N1wxXDI3MFwxXDE1MCIrCi0gICAgIlwxXDI2N1wzXDE1MFwxXDI3MVwxXDE1MFwyXDI2N1w1XDE1MFwxXDI2N1wzNlwxNTAiKwotICAgICJcMVwyNzJcMVwwXDFcMjczXDFcMjc0XDFcMjc1XDFcMjczXDNcMjc1XDFcMjczIisKLSAgICAiXDFcMjcyXDFcMjc2XDFcMjc3XDNcMjc1XDFcMjcyXDFcMjc1XDFcMjc3XDRcMjc1IisKLSAgICAiXDFcMjcyXDI3XDI3NVwyXDI3MlwyXDE1MlwxXDBcNjBcMTUyXDFcMFwxNlwxNTIiKwotICAgICJcMVwzMDBcMzdcMTUyXDFcMTU1XDJcMFwxXDMwMVwxXDE1NVwxXDBcM1wxNTUiKwotICAgICJcMVwwXDFcMTU1XDJcMFw1XDE1NVwxXDBcMzZcMTU1XDFcMTU3XDFcMCIrCi0gICAgIlwxXDMwMlwxXDMwM1wxXDE1N1wxXDMwMlwzXDE1N1wxXDMwNFwxXDE1N1wyXDMwMiIrCi0gICAgIlw1XDE1N1wxXDMwMlwzNlwxNTdcMVwzMDVcMVwwXDFcMzA2XDFcMzA3XDFcMzEwIisKLSAgICAiXDFcMzA2XDNcMzEwXDFcMzA2XDFcMzA1XDFcMzExXDFcMzEyXDNcMzEwXDFcMzA1IisKLSAgICAiXDFcMzEwXDFcMzEyXDRcMzEwXDFcMzA1XDI3XDMxMFwyXDMwNVwyXDE2MVwxXDAiKwotICAgICJcNjBcMTYxXDFcMFwxNlwxNjFcMVwzMTNcMzdcMTYxXDdcMFwxXDMxNFwxN1wwIisKLSAgICAiXDFcMzE1XDM2XDBcMVwxNzFcMlwwXDFcNDBcM1wwXDFcMTcxXDVcMCIrCi0gICAgIlwxXDE3MVw0XDQwXDFcMFwxM1w0MFwxXDBcNVw0MFwxXDBcMlw0MCIrCi0gICAgIlwxXDBcM1w0MFwxXDBcMVwzMTZcMVwwXDNcMzE2XDFcMzE3XDNcMTcyIisKLSAgICAiXDFcMzE2XDFcMFwxXDMxNlwxXDMxN1wxXDE3MlwxXDMxNlwxXDBcMlwzMTYiKwotICAgICJcMVwzMTdcNFwxNzJcMVwzMTZcMTNcMTcyXDFcMzE2XDVcMTcyXDFcMzE2XDJcMTcyIisKLSAgICAiXDFcMzIwXDRcMTcyXDE1XDBcMVwzMjFcNlwwXDFcMzIyXDM0XDBcMVwzMTYiKwotICAgICJcMVwwXDNcMzE2XDFcMzE3XDNcMTc0XDFcMzE2XDFcMFwxXDMxNlwxXDMxNyIrCi0gICAgIlwxXDE3NFwxXDMxNlwxXDBcMlwzMTZcMVwzMTdcNFwxNzRcMVwzMTZcMTNcMTc0IisKLSAgICAiXDFcMzE2XDVcMTc0XDFcMzE2XDJcMTc0XDFcMzIzXDRcMTc0XDI3XDBcMVwzMTUiKwotICAgICJcMzNcMFwxXDMyNFw2MFwwXDFcMzI1XDY0XDBcM1w1N1w0XDBcMVw1NyIrCi0gICAgIlw1XDBcM1w1N1wxXDMyNlwxXDBcMTNcNTdcMVwwXDVcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDRcNTdcNlwwXDNcNTdcNFwwXDFcNTdcNVwwIisKLSAgICAiXDRcNTdcMVwwXDEzXDU3XDFcMFwxXDU3XDFcMzI3XDNcNTdcMVwwIisKLSAgICAiXDJcNTdcMVwwXDRcNTdcMVwyMDZcMVwwXDdcMjA2XDFcMjEwXDQ3XDIwNiIrCi0gICAgIlwxXDIxMVwxXDBcMTFcMjExXDFcMjEwXDQ1XDIxMVwxXDIxNlwxXDBcN1wyMTYiKwotICAgICJcMVwyMjBcNDdcMjE2XDFcMjIxXDFcMFwxMVwyMjFcMVwyMjBcNDVcMjIxXDFcMjI1IisKLSAgICAiXDFcMFw3XDIyNVwxXDIyN1w0N1wyMjVcMVwyMzBcMVwwXDExXDIzMFwxXDIyNyIrCi0gICAgIlw0NVwyMzBcMzBcMFwxXDMzMFwyNVwwXDFcMzMwXDM1XDBcMVwzMzFcMTJcMCIrCi0gICAgIlwxXDMzMVw0N1wwXDFcMzMyXDYyXDBcMVwzMzNcNzZcMFwxXDMzNFwzXDAiKwotICAgICJcMVwyNDNcMVwwXDdcMjQzXDFcMjQ1XDQ3XDI0M1wxXDI0NlwxXDBcMVwyNDciKwotICAgICJcMVwzMzVcMVwyNDZcMVwyNDdcM1wyNDZcMVwyNDdcMVwyNDZcMVwyNDVcMVwyNDciKwotICAgICJcNVwyNDZcMVwyNDdcMzZcMjQ2XDFcMjQ3XDFcMFwxMVwyNDdcMVwyNDVcNDVcMjQ3IisKLSAgICAiXDFcMjQ2XDFcMFwxXDI0N1wxXDMzNVwxXDI0NlwxXDI0N1wzXDI0NlwxXDI0NyIrCi0gICAgIlwxXDI0NlwxXDMzNlwxXDI0N1w1XDI0NlwxXDI0N1wzNlwyNDZcMTNcMFwxXDMzNyIrCi0gICAgIlw0NVwwXDFcMjQ3XDFcMFwxMVwyNDdcMVwzMzZcNDVcMjQ3XDExXDI1N1wxXDI2MSIrCi0gICAgIlw0N1wyNTdcMTNcMjYyXDFcMjYxXDQ1XDI2MlwxXDI2N1wxXDBcN1wyNjdcMVwyNzEiKwotICAgICJcNDdcMjY3XDFcMjcyXDFcMFwxXDI3M1wxXDM0MFwxXDI3MlwxXDI3M1wzXDI3MiIrCi0gICAgIlwxXDI3M1wxXDI3MlwxXDI3MVwxXDI3M1w1XDI3MlwxXDI3M1wzNlwyNzJcMVwyNzMiKwotICAgICJcMVwwXDExXDI3M1wxXDI3MVw0NVwyNzNcMVwyNzJcMVwwXDFcMjczXDFcMzQwIisKLSAgICAiXDFcMjcyXDFcMjczXDNcMjcyXDFcMjczXDFcMjcyXDFcMzQxXDFcMjczXDVcMjcyIisKLSAgICAiXDFcMjczXDM2XDI3MlwxM1wwXDFcMzQyXDQ1XDBcMVwyNzNcMVwwXDExXDI3MyIrCi0gICAgIlwxXDM0MVw0NVwyNzNcMlwxNTJcMVwwXDI0XDE1MlwxXDM0M1wzMVwxNTJcMVwzMDIiKwotICAgICJcMVwwXDdcMzAyXDFcMzA0XDQ3XDMwMlwxXDMwNVwxXDBcMVwzMDZcMVwzNDQiKwotICAgICJcMVwzMDVcMVwzMDZcM1wzMDVcMVwzMDZcMVwzMDVcMVwzMDRcMVwzMDZcNVwzMDUiKwotICAgICJcMVwzMDZcMzZcMzA1XDFcMzA2XDFcMFwxMVwzMDZcMVwzMDRcNDVcMzA2XDFcMzA1IisKLSAgICAiXDFcMFwxXDMwNlwxXDM0NFwxXDMwNVwxXDMwNlwzXDMwNVwxXDMwNlwxXDMwNSIrCi0gICAgIlwxXDM0NVwxXDMwNlw1XDMwNVwxXDMwNlwzNlwzMDVcMTNcMFwxXDM0Nlw0NVwwIisKLSAgICAiXDFcMzA2XDFcMFwxMVwzMDZcMVwzNDVcNDVcMzA2XDJcMTYxXDFcMFwyNFwxNjEiKwotICAgICJcMVwzNDdcMzFcMTYxXDdcMFwxXDM1MFwxMDFcMFwxXDM1MVwzMFwwXDFcMzE2IisKLSAgICAiXDFcMFwxMFwzMTZcMVwwXDRcMzE2XDFcMFwzNFwzMTZcMVwwXDVcMzE2IisKLSAgICAiXDFcMFwzXDMxNlwxXDMxN1w0XDMxNlwxXDBcMVwzMTZcMVwzMTdcMlwzMTYiKwotICAgICJcMVwwXDJcMzE2XDFcMzE3XDMxXDMxNlwxXDM1Mlw0XDMxNlwxNVwwXDFcMzIxIisKLSAgICAiXDM2XDBcMVwzNTNcMjFcMFwxXDM1NFwxMlwwXDNcMzU0XDJcMFwxXDM1NCIrCi0gICAgIlwxMVwwXDJcMzU0XDFcMFwxXDM1NFwyXDBcMlwzNTRcMTBcMFwzXDU3IisKLSAgICAiXDRcMFwxXDU3XDVcMFw0XDU3XDFcMFwxMVw1N1wxXDM1NVwxXDU3IisKLSAgICAiXDFcMFw1XDU3XDFcMFwyXDU3XDFcMFw0XDU3XDMzXDBcMVwzNTYiKwotICAgICJcMTJcMFwxXDM1Nlw0MFwwXDFcMzU3XDU3XDBcMVwzNjBcNjZcMFwxXDM2MSIrCi0gICAgIlwxMlwwXDFcMzYxXDQwXDBcMVwzNjJcMzVcMFwyXDM2M1wxXDBcM1wzNjMiKwotICAgICJcMlwwXDFcMjUyXDRcMzYzXDFcMFw2XDM2M1wxXDBcMjdcMzYzXDVcMCIrCi0gICAgIlwyXDM2NFwxXDBcM1wzNjRcMlwwXDFcMjc2XDRcMzY0XDFcMFw2XDM2NCIrCi0gICAgIlwxXDBcMjdcMzY0XDJcMFwyXDE1MlwxXDBcMjVcMTUyXDFcMzY1XDMwXDE1MiIrCi0gICAgIlwzXDBcMlwzNjZcMVwwXDNcMzY2XDJcMFwxXDMxMVw0XDM2NlwxXDAiKwotICAgICJcNlwzNjZcMVwwXDI3XDM2NlwyXDBcMlwxNjFcMVwwXDI1XDE2MVwxXDM2NyIrCi0gICAgIlwzMFwxNjFcMzFcMFwxXDM3MFwxMDNcMFwxXDM1MlwyMVwwXDFcMzU0XDEyXDAiKwotICAgICJcM1wzNTRcMlwwXDFcMzU0XDExXDBcMlwzNTRcMVwwXDFcMzU0XDFcMCIrCi0gICAgIlwxXDM1M1wyXDM1NFwxMFwwXDNcNTdcNFwwXDFcNTdcNVwwXDRcNTciKwotICAgICJcMVwwXDZcNTdcMVwzNzFcNFw1N1wxXDBcNVw1N1wxXDBcMlw1NyIrCi0gICAgIlwxXDBcNFw1N1w0NFwwXDFcMzcyXDU0XDBcMVwzNzNcNTVcMFwxXDM3NCIrCi0gICAgIlw2MFwwXDFcMzc1XDYzXDBcMVwzNzZcMjBcMFwyXDE1MlwxXDBcMjZcMTUyIisKLSAgICAiXDFcMzc3XDI3XDE1MlwyXDE2MVwxXDBcMjZcMTYxXDFcdTAxMDBcMjdcMTYxXDMyXDAiKwotICAgICJcMVx1MDEwMVwzNFwwXDNcNTdcNFwwXDFcNTdcNVwwXDRcNTdcMVwwIisKLSAgICAiXDNcNTdcMVx1MDEwMlw3XDU3XDFcMFwyXDU3XDFcdTAxMDJcMlw1N1wxXDAiKwotICAgICJcMlw1N1wxXDBcNFw1N1w0NVwwXDFcdTAxMDNcNTJcMFwxXHUwMTA0XDYzXDAiKwotICAgICJcMVx1MDEwNVw0M1wwXDFcdTAxMDZcNjNcMFwxXHUwMTA3XDI1XDBcMVx1MDEwN1wyXDAiKwotICAgICJcMlwxNTJcMVwwXDI3XDE1MlwxXHUwMTA4XDI2XDE1MlwyXDE2MVwxXDBcMjdcMTYxIisKLSAgICAiXDFcdTAxMDlcMjZcMTYxXDMzXDBcMVx1MDEwYVwzMlwwXDFcdTAxMGJcM1w1N1wzXDAiKwotICAgICJcMVx1MDEwYlwxXDU3XDRcMFwxXHUwMTBiXDRcNTdcMVwwXDEzXDU3XDFcMCIrCi0gICAgIlw1XDU3XDFcMFwyXDU3XDFcMFw0XDU3XDM1XDBcMVx1MDEwY1w1NlwwIisKLSAgICAiXDFcdTAxMGRcMTJcMFwxXHUwMTBkXDQ1XDBcMVx1MDEwZVwxMlwwXDFcdTAxMGVcMTJcMCIrCi0gICAgIlwyXDE1MlwxXDBcMzBcMTUyXDFcdTAxMGZcMjVcMTUyXDJcMTYxXDFcMFwzMFwxNjEiKwotICAgICJcMVx1MDExMFwyNVwxNjFcMzJcMFwxXHUwMTExXDMzXDBcMVx1MDEwYlw2XDBcMVx1MDEwYiIrCi0gICAgIlw1XDBcMVx1MDEwYlwzNlwwXDJcMTUyXDFcMFwyN1wxNTJcMVx1MDExMlwyNlwxNTIiKwotICAgICJcMlwxNjFcMVwwXDI3XDE2MVwxXHUwMTEzXDI2XDE2MVwyN1wwXDFcdTAxMTRcMzFcMCIrCi0gICAgIlwyXDE1MlwxXDBcMjRcMTUyXDFcdTAxMTVcMzFcMTUyXDJcMTYxXDFcMFwyNFwxNjEiKwotICAgICJcMVx1MDExNlwzMVwxNjEiOwotCi0gIC8qKiAKLSAgICogVGhlIHRyYW5zaXRpb24gdGFibGUgb2YgdGhlIERGQQotICAgKi8KLSAgZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IHl5dHJhbnMgW10gPSB5eV91bnBhY2soeXlfcGFja2VkKTsKLQotCi0gIC8qIGVycm9yIGNvZGVzICovCi0gIGZpbmFsIHByaXZhdGUgc3RhdGljIGludCBZWV9VTktOT1dOX0VSUk9SID0gMDsKLSAgLy8gZmluYWwgcHJpdmF0ZSBzdGF0aWMgaW50IFlZX0lMTEVHQUxfU1RBVEUgPSAxOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfTk9fTUFUQ0ggPSAyOwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBpbnQgWVlfUFVTSEJBQ0tfMkJJRyA9IDM7Ci0KLSAgLyogZXJyb3IgbWVzc2FnZXMgZm9yIHRoZSBjb2RlcyBhYm92ZSAqLwotICBmaW5hbCBwcml2YXRlIHN0YXRpYyBTdHJpbmcgWVlfRVJST1JfTVNHW10gPSB7Ci0gICAgIlVua293biBpbnRlcm5hbCBzY2FubmVyIGVycm9yIiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiSW50ZXJuYWwgZXJyb3I6IHVua25vd24gc3RhdGUiLAkJLy8kTk9OLU5MUy0xJAotICAgICJFcnJvcjogY291bGQgbm90IG1hdGNoIGlucHV0IiwJCS8vJE5PTi1OTFMtMSQKLSAgICAiRXJyb3I6IHB1c2hiYWNrIHZhbHVlIHdhcyB0b28gbGFyZ2UiCS8vJE5PTi1OTFMtMSQKLSAgfTsKLQotICAvKioKLSAgICogWVlfQVRUUklCVVRFW2FTdGF0ZV0gY29udGFpbnMgdGhlIGF0dHJpYnV0ZXMgb2Ygc3RhdGUgPGNvZGU+YVN0YXRlPC9jb2RlPgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYnl0ZSBZWV9BVFRSSUJVVEVbXSA9IHsKLSAgICAgMSwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsICAxLCAgMSwgIDEsICAwLCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMCwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDksICAxLCAgMSwgIDksICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDksICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgCi0gICAgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgOSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsIAotICAgICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAKLSAgICAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICAxLCAgMSwgIDEsICA5LCAgMSwgIDEsICAxLCAgMSwgCi0gICAgIDEsICAxLCAgOSwgIDksICAxLCAgOSwgIDksICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAwLCAgMCwgIDksIAotICAgICAxLCAgMSwgIDksICA5LCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAKLSAgICAgMCwgIDAsICA5LCAgMCwgIDAsICAwLCAgOSwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICA5LCAgMCwgCi0gICAgIDAsICAwLCAgMCwgIDAsICA5LCAgMSwgIDAsICAwLCAgMSwgIDEsICAwLCAgMCwgIDEsICAwLCAgMCwgIDAsIAotICAgICA5LCAgMCwgIDAsICAwLCAgMSwgIDAsICAwLCAgMCwgIDksICAxLCAgMCwgIDAsICAxLCAgMSwgIDAsICAxLCAKLSAgICAgMCwgIDAsICAwLCAgOSwgIDEsICAwLCAgMCwgIDEsICAxLCAgMCwgIDEsICAwLCAgMCwgIDEsICAxLCAgOSwgCi0gICAgIDAsICAwLCAgOSwgIDksICA5LCAgMSwgIDEsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMCwgIDAsIAotICAgICAxLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgOSwgIDAsICAxLCAgOSwgIDAsICAxLCAgMCwgIDAsICAwLCAKLSAgICAgMCwgIDAsICAwLCAgMCwgIDEsICAwLCAgMSwgIDAsICAxLCAgMCwgIDAsICAwLCAgMCwgIDAsICAxLCAgMSwgCi0gICAgIDAsICAxLCAgMCwgIDAsICAwLCAgOSwgIDksICAxLCAgMSwgIDAsICAxLCAgOSwgIDksICA5LCAgMSwgIDEsIAotICAgICAwLCAgMSwgIDEsICA5LCAgMSwgIDEKLSAgfTsKLQotICAvKiogdGhlIGlucHV0IGRldmljZSAqLwotICBwcml2YXRlIGphdmEuaW8uUmVhZGVyIHl5X3JlYWRlcjsKLQotICAvKiogdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIERGQSAqLwotICBwcml2YXRlIGludCB5eV9zdGF0ZTsKLQotICAvKiogdGhlIGN1cnJlbnQgbGV4aWNhbCBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9sZXhpY2FsX3N0YXRlID0gWVlJTklUSUFMOwotCi0gIC8qKiB0aGlzIGJ1ZmZlciBjb250YWlucyB0aGUgY3VycmVudCB0ZXh0IHRvIGJlIG1hdGNoZWQgYW5kIGlzCi0gICAgICB0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLSAgcHJpdmF0ZSBjaGFyIHl5X2J1ZmZlcltdID0gbmV3IGNoYXJbMTYzODRdOwotCi0gIC8qKiB0aGUgdGV4dHBvc2l0aW9uIGF0IHRoZSBsYXN0IGFjY2VwdGluZyBzdGF0ZSAqLwotICBwcml2YXRlIGludCB5eV9tYXJrZWRQb3M7Ci0KLSAgLyoqIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0gIHByaXZhdGUgaW50IHl5X3B1c2hiYWNrUG9zOwotCi0gIC8qKiB0aGUgY3VycmVudCB0ZXh0IHBvc2l0aW9uIGluIHRoZSBidWZmZXIgKi8KLSAgcHJpdmF0ZSBpbnQgeXlfY3VycmVudFBvczsKLQotICAvKiogc3RhcnRSZWFkIG1hcmtzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHl5dGV4dCgpIHN0cmluZyBpbiB0aGUgYnVmZmVyICovCi0gIHByaXZhdGUgaW50IHl5X3N0YXJ0UmVhZDsKLQotICAvKiogZW5kUmVhZCBtYXJrcyB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciwgdGhhdCBoYXMgYmVlbiByZWFkCi0gICAgICBmcm9tIGlucHV0ICovCi0gIHByaXZhdGUgaW50IHl5X2VuZFJlYWQ7Ci0KLSAgLyoqIG51bWJlciBvZiBuZXdsaW5lcyBlbmNvdW50ZXJlZCB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWxpbmU7Ci0KLSAgLyoqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIG1hdGNoZWQgdGV4dCAqLwotICBwcml2YXRlIGludCB5eWNoYXI7Ci0KLSAgLyoqCi0gICAqIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBmcm9tIHRoZSBsYXN0IG5ld2xpbmUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSAKLSAgICogbWF0Y2hlZCB0ZXh0Ci0gICAqLwotICAvLyBwcml2YXRlIGludCB5eWNvbHVtbjsgCi0KLSAgLyoqIAotICAgKiB5eV9hdEJPTCA9PSB0cnVlIDw9PiB0aGUgc2Nhbm5lciBpcyBjdXJyZW50bHkgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKLSAgICovCi0gIC8vIHByaXZhdGUgYm9vbGVhbiB5eV9hdEJPTDsKLQotICAvKiogeXlfYXRFT0YgPT0gdHJ1ZSA8PT4gdGhlIHNjYW5uZXIgaGFzIHJldHVybmVkIGEgdmFsdWUgZm9yIEVPRiAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfYXRFT0Y7Ci0KLSAgLyoqIGRlbm90ZXMgaWYgdGhlIHVzZXItRU9GLWNvZGUgaGFzIGFscmVhZHkgYmVlbiBleGVjdXRlZCAqLwotICBwcml2YXRlIGJvb2xlYW4geXlfZW9mX2RvbmU7Ci0KLSAgLyogdXNlciBjb2RlOiAqLwotCXByaXZhdGUgaW50IGZUb2tlbkNvdW50ID0gMDsKLSAKLQkvLyByZXF1aXJlZCBob2xkZXJzIGZvciB3aGl0ZS1zcGFjZSBjb21wYWN0aW5nCi0JcHJpdmF0ZSBib29sZWFuIGZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQlwcml2YXRlIFN0cmluZyBmQnVmZmVyZWRDb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBmQnVmZmVyZWRTdGFydCA9IDE7Ci0JcHJpdmF0ZSBpbnQgZkJ1ZmZlcmVkTGVuZ3RoID0gMDsKLQlwcml2YXRlIFN0cmluZyBmX2NvbnRleHQgPSBudWxsOwotCi0JLy8gc3RhdGUgc3RhY2sgZm9yIGhhbmRsaW5nIGVtYmVkZGVkIHJlZ2lvbnMKLQlwcml2YXRlIEludFN0YWNrIGZTdGF0ZVN0YWNrID0gbmV3IEludFN0YWNrKCk7Ci0KLQlwcml2YXRlIFN0cmluZyBjb250ZXh0ID0gbnVsbDsKLQlwcml2YXRlIGludCBzdGFydCA9IDA7Ci0JcHJpdmF0ZSBpbnQgdGV4dExlbmd0aCA9IDA7Ci0JcHJpdmF0ZSBpbnQgbGVuZ3RoID0gMDsKLQotCS8vIG9mZnNldCBmb3IgdHJhY2tpbmcgcG9zaXRpb24gc3BlY2lmaWMgYmxvY2sgdGFncwotCXByaXZhdGUgaW50IGZPZmZzZXQgPSAwOwotCQotCS8vIHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRhZyBiZWluZyBvcGVuZWQKLQlwcml2YXRlIFN0cmluZyBmQ3VycmVudFRhZ05hbWUgPSBudWxsOwotCi0JLy8gdGhlIGxpc3Qgb2YgdGFnIG5hbWUgQmxvY2tNYXJrZXJzCi0JcHJpdmF0ZSBMaXN0IGZCbG9ja01hcmtlcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkvLyByZXF1aXJlZCB0byBub3Qgc2VlayB0ZXh0IGJsb2NrcyBvbiBhbiBlbmQgdGFnCi0JcHJpdmF0ZSBib29sZWFuIGZJc0Jsb2NraW5nRW5hYmxlZCA9IGZhbHNlOwotCXByaXZhdGUgYm9vbGVhbiBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSB0cnVlOwotCi0JcHJpdmF0ZSBYTUxQYXJzZXJSZWdpb25GYWN0b3J5IGZSZWdpb25GYWN0b3J5ID0gbmV3IFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkoKTsKLS8qKgotICogdXNlciBtZXRob2QgCi0gKi8KLXB1YmxpYyBmaW5hbCB2b2lkIGFkZEJsb2NrTWFya2VyKEJsb2NrTWFya2VyIG1hcmtlcikgewotCWlmKGNvbnRhaW5zVGFnTmFtZShtYXJrZXIuZ2V0VGFnTmFtZSgpKSkKLQkJcmV0dXJuOwotCWZCbG9ja01hcmtlcnMuYWRkKG1hcmtlcik7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICovCi1wdWJsaWMgZmluYWwgdm9pZCByZW1vdmVCbG9ja01hcmtlcihCbG9ja01hcmtlciBtYXJrZXIpIHsKLQlmQmxvY2tNYXJrZXJzLnJlbW92ZShtYXJrZXIpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZCAKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlQmxvY2tNYXJrZXIoU3RyaW5nIHRhZ25hbWUpIHsKLQlpZiAoZkJsb2NrTWFya2VycyAhPSBudWxsKSB7Ci0JCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGJsb2Nrcy5oYXNOZXh0KCkpIHsKLQkJCWlmICgoKEJsb2NrTWFya2VyKSBibG9ja3MubmV4dCgpKS5nZXRUYWdOYW1lKCkuZXF1YWxzKHRhZ25hbWUpKQotCQkJCWJsb2Nrcy5yZW1vdmUoKTsKLQkJfQotCX0KLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgZmluYWwgYm9vbGVhbiBpc0Nhc2VTZW5zaXRpdmVCbG9ja2luZygpIHsKLQlyZXR1cm4gZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBmaW5hbCB2b2lkIHNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhib29sZWFuIG5ld1ZhbHVlKSB7Ci0JZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nID0gbmV3VmFsdWU7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIGJvb2xlYW4gZ2V0QmxvY2tNYXJrZXJDYXNlU2Vuc2l0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eShmQ3VycmVudFRhZ05hbWUpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBib29sZWFuIGdldEJsb2NrTWFya2VyQ2FzZVNlbnNpdGl2aXR5KFN0cmluZyBuYW1lKSB7Ci0JSXRlcmF0b3IgaXRlcmF0b3IgPSBmQmxvY2tNYXJrZXJzLml0ZXJhdG9yKCk7Ci0Jd2hpbGUoaXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilpdGVyYXRvci5uZXh0KCk7Ci0JCWJvb2xlYW4gY2FzZXNlbnNpdGl2ZSA9IG1hcmtlci5pc0Nhc2VTZW5zaXRpdmUoKTsKLQkJaWYoY2FzZXNlbnNpdGl2ZSAmJiBtYXJrZXIuZ2V0VGFnTmFtZSgpLmVxdWFscyhuYW1lKSkKLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCQllbHNlIGlmKCFjYXNlc2Vuc2l0aXZlICYmIG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShuYW1lKSkKLQkJCXJldHVybiBjYXNlc2Vuc2l0aXZlOwotCX0KLQlyZXR1cm4gdHJ1ZTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgU3RyaW5nIGdldEJsb2NrTWFya2VyQ29udGV4dCgpIHsKLQlyZXR1cm4gZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFN0cmluZyBnZXRCbG9ja01hcmtlckNvbnRleHQoU3RyaW5nIG5hbWUpIHsKLQlJdGVyYXRvciBpdGVyYXRvciA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJQmxvY2tNYXJrZXIgbWFya2VyID0gKEJsb2NrTWFya2VyKWl0ZXJhdG9yLm5leHQoKTsKLQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHMobmFtZSkpCi0JCQlyZXR1cm4gbWFya2VyLmdldENvbnRleHQoKTsKLQl9Ci0JcmV0dXJuIEJMT0NLX1RFWFQ7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIExpc3QgZ2V0QmxvY2tNYXJrZXJzKCkgewotCXJldHVybiBmQmxvY2tNYXJrZXJzOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyBmaW5hbCBpbnQgZ2V0T2Zmc2V0KCkgewotCXJldHVybiBmT2Zmc2V0ICsgeXljaGFyOwotfQotcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzQmxvY2tNYXJrZXIoKSB7Ci0JcmV0dXJuIGlzQmxvY2tNYXJrZXIoZkN1cnJlbnRUYWdOYW1lKTsKLX0KLXByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Jsb2NrTWFya2VyKFN0cmluZyB0YWdOYW1lKSB7Ci0JaWYgKCFmSXNCbG9ja2luZ0VuYWJsZWQpCi0JCXJldHVybiBmYWxzZTsKLQlyZXR1cm4gY29udGFpbnNUYWdOYW1lKHRhZ05hbWUpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICovCi1wdWJsaWMgZmluYWwgdm9pZCBiZWdpbkJsb2NrVGFnU2NhbihTdHJpbmcgbmV3VGFnTmFtZSkgewotCWJlZ2luQmxvY2tNYXJrZXJTY2FuKG5ld1RhZ05hbWUsIEJMT0NLX1RFWFQpOwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICoKLSAqIFNwZWNpYWwgdG9rZW5pemVyIHNldHVwLiAgQWxsb3dzIHRva2VuaXphdGlvbiB0byBiZSBpbml0aWF0ZWQgYXQgdGhlCi0gKiBzdGFydCBvZiBhIHRleHQgYmxvY2sgd2l0aGluIGEgIm5ld1RhZ05hbWUiIHRhZy4KLSAqCi0gKiBFeGFtcGxlOiAKLSAqCVRva2VuaXplciB0b2tlciA9IG5ldyBUb2tlbml6ZXIoKTsKLSAqCXRva2VyLnNldENhc2VTZW5zaXRpdmVCbG9ja2luZyhmYWxzZSk7Ci0gKgl0b2tlci5yZXNldChuZXcgamF2YS5pby5TdHJpbmdSZWFkZXIoImFmaXVocXdrZWpodGFzaWhnYWxrd2h0cTwvc2NyaXB0ZXI+PC9zY3I+PC9zY3JpcHQ+YXNnZGFzZ2EiKSk7Ci0gKgl0b2tlci5iZWdpbkJsb2NrTWFya2VyU2Nhbigic2NyaXB0IiwgQkxPQ0tfVEVYVCk7Ci0gKgl0b2tlci5nZXRSZWdpb25zKCk7IAotICoKLSAqIFJldHVybnM6Ci0gKglCTE9DS19URVhUOiAwLTQwCi0gKglYTUxfRU5EX1RBR19PUEVOOiA0MS00MgotICoJWE1MX1RBR19OQU1FOiA0My00OAotICoJWE1MX1RBR19DTE9TRTogNDktNDkKLSAqCVhNTF9DT05URU5UOiA1MC01NwotICoKLSAqLwotcHVibGljIGZpbmFsIHZvaWQgYmVnaW5CbG9ja01hcmtlclNjYW4oU3RyaW5nIG5ld1RhZ05hbWUsIFN0cmluZyBibG9ja2NvbnRleHQpIHsKLQl5eWJlZ2luKFNUX0JMT0NLX1RBR19TQ0FOKTsKLQlmQ3VycmVudFRhZ05hbWUgPSBuZXdUYWdOYW1lOwotfQotLyoqCi0gKiBNZXRob2QgZG9TY2FuLgotICogCi0gKiBSZXR1cm5zIGEgY29udGV4dCByZWdpb24gZm9yIGFsbCBvZiB0aGUgdGV4dCBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uIHVwdG8gdGhlIGVuZCBvZiBpbnB1dCBvcgotICogdG8gcmlnaHQgKmJlZm9yZSogdGhlIGZpcnN0IG9jY3VyZW5jZSBvZiBzZWFyY2hTdHJpbmcKLSAqIAotICogQHBhcmFtIHNlYXJjaFN0cmluZyAtIHRhcmdldCBzdHJpbmcgdG8gc2VhcmNoIGZvciBleC46ICItLT4iLCAiPC90YWduYW1lIgotICogQHBhcmFtIHJlcXVpcmVUYWlsU2VwYXJhdG9yIC0gd2hldGhlciB0aGUgdGFyZ2V0IG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSBvciAnPicKLSAqIEBwYXJhbSBjb250ZXh0IC0gdGhlIGNvbnRleHQgb2YgdGhlIHNjYW5uZWQgcmVnaW9uIGlmIG5vbi16ZXJvIGxlbmd0aAotICogQHBhcmFtIGV4aXRTdGF0ZSAtIHRoZSBzdGF0ZSB0byBnbyB0byBpZiB0aGUgcmVnaW9uIHdhcyBvZiBub24temVybyBsZW5ndGgKLSAqIEBwYXJhbSBhYm9ydFN0YXRlIC0gdGhlIHN0YXRlIHRvIGdvIHRvIGlmIHRoZSBzZWFyY2hTdHJpbmcgd2FzIGZvdW5kIGltbWVkaWF0ZWx5Ci0gKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBjb250ZXh0IGZvdW5kOiB0aGUgZGVzaXJlZCBjb250ZXh0IG9uIGEgbm9uLXplcm8gbGVuZ3RoIG1hdGNoLCB0aGUgYWJvcnRDb250ZXh0IG9uIGltbWVkaWF0ZSBzdWNjZXNzCi0gKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gKi8KLXByaXZhdGUgZmluYWwgU3RyaW5nIGRvU2NhbihTdHJpbmcgc2VhcmNoU3RyaW5nLCBib29sZWFuIHJlcXVpcmVUYWlsU2VwYXJhdG9yLCBTdHJpbmcgc2VhcmNoQ29udGV4dCwgaW50IGV4aXRTdGF0ZSwgaW50IGltbWVkaWF0ZUZhbGxiYWNrU3RhdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JYm9vbGVhbiBzdGlsbFNlYXJjaGluZyA9IHRydWU7Ci0JLy8gRGlzYWJsZSBmdXJ0aGVyIGJsb2NrIChwcm9iYWJseSkKLQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQlpbnQgc2VhcmNoU3RyaW5nTGVuZ3RoID0gc2VhcmNoU3RyaW5nLmxlbmd0aCgpOwotCWludCBuID0gMDsKLQljaGFyIGxhc3RDaGVja0NoYXI7Ci0JaW50IGk7Ci0JYm9vbGVhbiBzYW1lID0gZmFsc2U7Ci0Jd2hpbGUgKHN0aWxsU2VhcmNoaW5nKSB7Ci0JCW4gPSAwOwotCQkvLyBFbnN1cmUgdGhhdCBlbm91Z2ggZGF0YSBmcm9tIHRoZSBpbnB1dCBleGlzdHMgdG8gY29tcGFyZSBhZ2FpbnN0IHRoZSBzZWFyY2ggU3RyaW5nLgotCQluID0geXlfYWR2YW5jZSgpOwotCQl3aGlsZShuICE9IFlZRU9GICYmIHl5X2N1cnJlbnRQb3MgPCBzZWFyY2hTdHJpbmdMZW5ndGgpCi0JCQluID0geXlfYWR2YW5jZSgpOwotCQkvLyBJZiB0aGUgaW5wdXQgd2FzIHRvbyBzaG9ydCBvciB3ZSd2ZSBleGhhdXN0ZWQgdGhlIGlucHV0LCBzdG9wIGltbWVkaWF0ZWx5LgotCQlpZiAobiA9PSBZWUVPRikgewotCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJfQotCQllbHNlIHsKLQkJCXNhbWUgPSB0cnVlOwotCQkJLy8gRW5zdXJlIHRoYXQgd2UndmUgbm90IGVuY291bnRlcmVkIGEgY29tcGxldGUgYmxvY2sgKDwlJT4pIHRoYXQgd2FzICpzaG9ydGVyKiB0aGFuIHRoZSBjbG9zZVRhZ1N0cmluZyBhbmQKLQkJCS8vIHRodXMgZm91bmQgdHdpY2UgYXQgY3VycmVudC10YXJnZXRMZW5ndGggW3NpbmNlIHRoZSBmaXJzdCBzY2FuIHdvdWxkIGhhdmUgY29tZSBvdXQgdGhpcyBmYXIgYW55d2F5XS4KLQkJCS8vIENoZWNrIHRoZSBjaGFyYWN0ZXJzIGluIHRoZSB0YXJnZXQgdmVyc3VzIHRoZSBsYXN0IHRhcmdldExlbmd0aCBjaGFyYWN0ZXJzIHJlYWQgZnJvbSB0aGUgYnVmZmVyCi0JCQkvLyBhbmQgc2VlIGlmIGl0IG1hdGNoZXMKLQkJCQotCQkJLy8gc2FmZXR5IGNoZWNrIGZvciBhcnJheSBhY2Nlc3NlcyAoeXlfY3VycmVudFBvcyBpcyB0aGUgKmxhc3QqIGNoYXJhY3RlciB3ZSBjYW4gY2hlY2sgYWdhaW5zdCkKLQkJCWlmKHl5X2N1cnJlbnRQb3MgPj0gc2VhcmNoU3RyaW5nTGVuZ3RoICYmIHl5X2N1cnJlbnRQb3MgPD0geXlfYnVmZmVyLmxlbmd0aCkgewotCQkJCWZvcihpID0gMDsgaSA8IHNlYXJjaFN0cmluZ0xlbmd0aDsgaSsrKSB7Ci0JCQkJCWlmKHNhbWUgJiYgZklzQ2FzZVNlbnNpdGl2ZUJsb2NraW5nKQotCQkJCQkJc2FtZSA9IHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0gPT0gc2VhcmNoU3RyaW5nLmNoYXJBdChpKTsKLQkJCQkJZWxzZSBpZihzYW1lICYmICFmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcpCi0JCQkJCQlzYW1lID0gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKHl5X2J1ZmZlcltpICsgeXlfY3VycmVudFBvcyAtIHNlYXJjaFN0cmluZ0xlbmd0aF0pID09IENoYXJhY3Rlci50b0xvd2VyQ2FzZShzZWFyY2hTdHJpbmcuY2hhckF0KGkpKTsKLQkJCQl9Ci0JCQl9Ci0JCQkvLyBzYWZldHkgY2hlY2sgZmFpbGVkOyBubyBtYXRjaCBpcyBwb3NzaWJsZSByaWdodCBub3cKLQkJCWVsc2UgewotCQkJCXNhbWUgPSBmYWxzZTsKLQkJCX0KLQkJCWlmIChzYW1lICYmIHJlcXVpcmVUYWlsU2VwYXJhdG9yICYmIHl5X2N1cnJlbnRQb3MgPCB5eV9idWZmZXIubGVuZ3RoKSB7Ci0JCQkJLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgY2xvc2UgdGFncyB0byBlbnN1cmUgdGhhdCB0YXJnZXRTdHJpbmc9Ijwvc2NyaXB0IiBkb2Vzbid0IG1hdGNoCi0JCQkJLy8gIjwvc2NyaXB0UyIKLQkJCQlsYXN0Q2hlY2tDaGFyID0geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdOwotCQkJCS8vIFN1Y2NlZWQgb24gIjwvc2NyaXB0PiIgYW5kICI8L3NjcmlwdCAiCi0JCQkJaWYobGFzdENoZWNrQ2hhciA9PSAnPicgfHwgQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShsYXN0Q2hlY2tDaGFyKSkKLQkJCQkJc3RpbGxTZWFyY2hpbmcgPSBmYWxzZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXN0aWxsU2VhcmNoaW5nID0gIXNhbWUgfHwgKHl5X2N1cnJlbnRQb3MgPCB5eV9zdGFydFJlYWQgKyBzZWFyY2hTdHJpbmdMZW5ndGgpOwotCQkJfQotCQl9Ci0JfQotCWlmIChuICE9IFlZRU9GIHx8IHNhbWUpIHsKLQkJLy8gV2UndmUgc3RvcHBlZCBzaG9ydCBvZiB0aGUgZW5kIG9yIGRlZmluaXRlbHkgZm91bmQgYSBtYXRjaAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zIC0gc2VhcmNoU3RyaW5nTGVuZ3RoOwotCQl5eV9jdXJyZW50UG9zID0geXlfbWFya2VkUG9zICsgMTsKLQkJLy8gSWYgdGhlIHNlYXJjaFN0cmluZyBvY2N1cnMgYXQgdGhlIHZlcnkgYmVnaW5uaW5nIG9mIHdoYXQgd291bGQgaGF2ZQotCQkvLyBiZWVuIGEgQmxvY2ssIHJlc3VtZSBzY2FubmluZyBub3JtYWxseSBpbW1lZGlhdGVseQotCQlpZiAoeXlfbWFya2VkUG9zID09IHl5X3N0YXJ0UmVhZCkgewotCQkJeXliZWdpbihpbW1lZGlhdGVGYWxsYmFja1N0YXRlKTsKLQkJCXJldHVybiBwcmltR2V0TmV4dFRva2VuKCk7Ci0JCX0KLQl9Ci0JZWxzZSB7Ci0JCS8vIFdlIHJhbiB0aHJvdWdoIHRoZSByZXN0IG9mIHRoZSBpbnB1dAotCQl5eV9tYXJrZWRQb3MgPSB5eV9jdXJyZW50UG9zOwotCQl5eV9jdXJyZW50UG9zKys7Ci0JfQotCXl5YmVnaW4oZXhpdFN0YXRlKTsKLQkvLyBJZiB0aGUgZW5kaW5nIG9jY3VycyBhdCB0aGUgdmVyeSBiZWdpbm5pbmcgb2Ygd2hhdCB3b3VsZCBoYXZlCi0JLy8gYmVlbiBhIEJsb2NrLCByZXN1bWUgc2Nhbm5pbmcgbm9ybWFsbHkgaW1tZWRpYXRlbHkKLQlpZih5eV9tYXJrZWRQb3MgPT0geXlfc3RhcnRSZWFkKQotCQlyZXR1cm4gcHJpbUdldE5leHRUb2tlbigpOwotCXJldHVybiBzZWFyY2hDb250ZXh0OwotfQotLyoqCi0gKiB1c2VyIG1ldGhvZAotICoKLSAqIEEgZ2VuZXJpYyBsb29rYWhlYWQtbGlrZSBvcGVyYXRpb24KLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1NjYW4oU3RyaW5nIHRhcmdldCwgU3RyaW5nIHRhcmdldENvbnRleHQsIGludCBpbW1lZGlhdGVGYWxsYmFja1N0YXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCXJldHVybiBkb1NjYW4odGFyZ2V0LCBmYWxzZSwgdGFyZ2V0Q29udGV4dCwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSwgaW1tZWRpYXRlRmFsbGJhY2tTdGF0ZSk7Ci19Ci0vKioKLSAqIHVzZXIgbWV0aG9kIAotICogZG9lcyBhIGxvb2thaGVhZCBmb3IgdGhlIGN1cnJlbnQgdGFnIG5hbWUKLSAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZG9CbG9ja1RhZ1NjYW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmSXNDYXNlU2Vuc2l0aXZlQmxvY2tpbmcgPSBnZXRCbG9ja01hcmtlckNhc2VTZW5zaXRpdml0eSgpOwotCXJldHVybiBkb1NjYW4oIjwvIiArIGZDdXJyZW50VGFnTmFtZSwgdHJ1ZSwgZ2V0QmxvY2tNYXJrZXJDb250ZXh0KGZDdXJyZW50VGFnTmFtZSksIFlZSU5JVElBTCwgWVlJTklUSUFMKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QKLSAqCi0gKiBDb252ZXJ0cyB0aGUgcmF3IGNvbnRleHQgU3RyaW5nIHJldHVybmVkIGJ5IHRoZSBwcmltR2V0TmV4dFRva2VuKCkKLSAqIG1ldGhvZCBpbnRvIGEgZnVsbCBJVGV4dFJlZ2lvbiBieSBwdWxsaW5nIGluIHZhbHVlcyBmb3IgdGhlCi0gKiBjdXJyZW50IG9mZnNldCB3aXRoaW4gdGhlIHNjYW5uaW5nIHRleHQuCi0gKgotICogUmV0dXJucyBudWxsIHdoZW4gRU9GIGlzIGVuY291bnRlcmVkIGFuZCBhdHRhY2hlcyBpbnRlcm1pdHRlbnRseQotICogZGlzY292ZXJlZCB3aGl0ZXNwYWNlIG9udG8gdGhlIGVuZCBvZiB1c2VmdWwgcmVnaW9ucy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhpcyBhbGdvcml0aG0gY2FjaGVzIHRoZSB0b2tlbiBmb2xsb3dpbmcgdGhlIG9uZSBiZWluZyByZXR1cm5lZAotICogc28gdGhhdCB3aGl0ZXNwYWNlIGNhbiBiZSBjb2xsYXBzZWQuCi0gKi8KLXB1YmxpYyBmaW5hbCBJVGV4dFJlZ2lvbiBnZXROZXh0VG9rZW4oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotCS8vIGxvYWQgdGhlIHN0YXJ0aW5nIG5vbi13aGl0ZXNwYWNlIHRva2VuIChhc3N1bWUgdGhhdCBpdCBpcyBzbykKLQlpZiAoZlNob3VsZExvYWRCdWZmZXJlZCkgewotCQljb250ZXh0ID0gZkJ1ZmZlcmVkQ29udGV4dDsKLQkJc3RhcnQgPSBmQnVmZmVyZWRTdGFydDsKLQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IGZCdWZmZXJlZExlbmd0aDsKLQkJZlNob3VsZExvYWRCdWZmZXJlZCA9IGZhbHNlOwotCX0KLQllbHNlIHsKLQkJY29udGV4dCA9IHByaW1HZXROZXh0VG9rZW4oKTsKLQkJaWYgKGNvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCQlpZihjb250YWluc1RhZ05hbWUoeXlfYnVmZmVyLCB5eV9zdGFydFJlYWQsIHl5X21hcmtlZFBvcy15eV9zdGFydFJlYWQpKQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IHl5dGV4dCgpOwotCQkJZWxzZQotCQkJCWZDdXJyZW50VGFnTmFtZSA9IG51bGw7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfVEFHX09QRU4pIHsKLQkJCWZJc0Jsb2NraW5nRW5hYmxlZCA9IHRydWU7Ci0JCX0KLQkJZWxzZSBpZiAoY29udGV4dCA9PSBYTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQkJfQotCQlzdGFydCA9IHl5Y2hhcjsKLQkJdGV4dExlbmd0aCA9IGxlbmd0aCA9IHl5bGVuZ3RoKCk7Ci0JCWlmICh5eV9hdEVPRikgewotCQkJZlRva2VuQ291bnQrKzsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCS8vIHN0b3JlIHRoZSBuZXh0IHRva2VuCi0JZl9jb250ZXh0ID0gcHJpbUdldE5leHRUb2tlbigpOwotCWlmIChmX2NvbnRleHQgPT0gWE1MX1RBR19OQU1FKSB7Ci0JCWlmKGNvbnRhaW5zVGFnTmFtZSh5eV9idWZmZXIsIHl5X3N0YXJ0UmVhZCwgeXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZCkpCi0JCQlmQ3VycmVudFRhZ05hbWUgPSB5eXRleHQoKTsKLQkJZWxzZQotCQkJZkN1cnJlbnRUYWdOYW1lID0gbnVsbDsKLQl9Ci0JZWxzZSBpZiAoZl9jb250ZXh0ID09IFhNTF9UQUdfT1BFTikgewotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSB0cnVlOwotCX0KLQllbHNlIGlmIChmX2NvbnRleHQgPT0gWE1MX0VORF9UQUdfT1BFTikgewotCQlmSXNCbG9ja2luZ0VuYWJsZWQgPSBmYWxzZTsKLQl9Ci0JZkJ1ZmZlcmVkQ29udGV4dCA9IGZfY29udGV4dDsKLQlmQnVmZmVyZWRTdGFydCA9IHl5Y2hhcjsKLQlmQnVmZmVyZWRMZW5ndGggPSB5eWxlbmd0aCgpOwotCWZTaG91bGRMb2FkQnVmZmVyZWQgPSB0cnVlOwotCWlmIChmQnVmZmVyZWRDb250ZXh0ID09IFdISVRFX1NQQUNFKSB7Ci0JCWZTaG91bGRMb2FkQnVmZmVyZWQgPSBmYWxzZTsKLQkJbGVuZ3RoICs9IGZCdWZmZXJlZExlbmd0aDsKLQl9Ci0JaWYgKGNvbnRleHQgPT0gbnVsbCkgewotCQkvLyBFT0YKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiIGRpc2NvdmVyZWQgIiArIGZUb2tlbkNvdW50ICsgIiB0b2tlbnMuIik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCWZUb2tlbkNvdW50Kys7Ci0JcmV0dXJuIGZSZWdpb25GYWN0b3J5LmNyZWF0ZVRva2VuKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgsIG51bGwsIGZDdXJyZW50VGFnTmFtZSk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFhNTFRva2VuaXplcigpewotCXN1cGVyKCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIFhNTFRva2VuaXplcihjaGFyW10gY2hhckFycmF5KXsKLQkJdGhpcyhuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSkpOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXkpIHsKLQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIDApOwotfQotLyogdXNlciBtZXRob2QgKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGNoYXJbXSBjaGFyQXJyYXksIGludCBuZXdPZmZzZXQpIHsKLQlyZXNldChuZXcgQ2hhckFycmF5UmVhZGVyKGNoYXJBcnJheSksIG5ld09mZnNldCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgMCk7Ci19Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHVibGljIHZvaWQgcmVzZXQoamF2YS5pby5JbnB1dFN0cmVhbSBpbiwgaW50IG5ld09mZnNldCkgewotCXJlc2V0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGluKSwgbmV3T2Zmc2V0KTsKLX0KLS8qIHVzZXIgbWV0aG9kICovCi1wdWJsaWMgdm9pZCByZXNldChqYXZhLmlvLlJlYWRlciBpbikgewotCXJlc2V0KGluLCAwKTsKLX0KLS8qKgotICogdXNlciBtZXRob2QgKgotICoKLSAqIFJlc2V0IGludGVybmFsIGNvdW50ZXJzIGFuZCB2YXJzIHRvICJuZXdseSBjcmVhdGVkIiB2YWx1ZXMsIGluIHRoZSBob3BlcwotICogdGhhdCByZXNldHRpbmcgYSBwcmUtZXhpc3RpbmcgdG9rZW5pemVyIGlzIGZhc3RlciB0aGFuIGNyZWF0aW5nIGEgbmV3IG9uZS4KLSAqCi0gKiBUaGlzIG1ldGhvZCBjb250YWlucyBjb2RlIGJsb2NrcyB0aGF0IHdlcmUgZXNzZW50aWFsbHkgZHVwbGljYXRlZCBmcm9tIHRoZQotICogPGVtPmdlbmVyYXRlZDwvZW0+IG91dHB1dCBvZiB0aGlzIHNwZWNpZmljYXRpb24gYmVmb3JlIHRoaXMgbWV0aG9kIHdhcwotICogYWRkZWQuICBUaG9zZSBjb2RlIGJsb2NrcyB3ZXJlIHVuZGVyIHRoZSBhYm92ZSBjb3B5cmlnaHQuCi0gKi8KLXB1YmxpYyB2b2lkIHJlc2V0KGphdmEuaW8uUmVhZGVyIGluLCBpbnQgbmV3T2Zmc2V0KSB7Ci0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCVN5c3RlbS5vdXQucHJpbnRsbigicmVzZXR0aW5nIHRva2VuaXplciIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JZk9mZnNldCA9IG5ld09mZnNldDsKLQotCS8qIHRoZSBpbnB1dCBkZXZpY2UgKi8KLQl5eV9yZWFkZXIgPSBpbjsKLQotCS8qIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBERkEgKi8KLQl5eV9zdGF0ZSA9IDA7Ci0KLQkvKiB0aGUgY3VycmVudCBsZXhpY2FsIHN0YXRlICovCi0JeXlfbGV4aWNhbF9zdGF0ZSA9IFlZSU5JVElBTDsKLQotCS8qIHRoaXMgYnVmZmVyIGNvbnRhaW5zIHRoZSBjdXJyZW50IHRleHQgdG8gYmUgbWF0Y2hlZCBhbmQgaXMKLQl0aGUgc291cmNlIG9mIHRoZSB5eXRleHQoKSBzdHJpbmcgKi8KLQlqYXZhLnV0aWwuQXJyYXlzLmZpbGwoeXlfYnVmZmVyLCAoY2hhcikwKTsKLQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3QgYWNjZXB0aW5nIHN0YXRlICovCi0JeXlfbWFya2VkUG9zID0gMDsKLQotCS8qIHRoZSB0ZXh0cG9zaXRpb24gYXQgdGhlIGxhc3Qgc3RhdGUgdG8gYmUgaW5jbHVkZWQgaW4geXl0ZXh0ICovCi0JeXlfcHVzaGJhY2tQb3MgPSAwOwotCi0JLyogdGhlIGN1cnJlbnQgdGV4dCBwb3NpdGlvbiBpbiB0aGUgYnVmZmVyICovCi0JeXlfY3VycmVudFBvcyA9IDA7Ci0KLQkvKiBzdGFydFJlYWQgbWFya3MgdGhlIGJlZ2lubmluZyBvZiB0aGUgeXl0ZXh0KCkgc3RyaW5nIGluIHRoZSBidWZmZXIgKi8KLQl5eV9zdGFydFJlYWQgPSAwOwotCi0JLyoqIAotCSAqIGVuZFJlYWQgbWFya3MgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBidWZmZXIsIHRoYXQgaGFzIGJlZW4gcmVhZAotCSAqIGZyb20gaW5wdXQgCi0JICovCi0JeXlfZW5kUmVhZCA9IDA7Ci0KLQkvKiBudW1iZXIgb2YgbmV3bGluZXMgZW5jb3VudGVyZWQgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBtYXRjaGVkIHRleHQgKi8KLQl5eWxpbmUgPSAwOwotCi0JLyogdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHVwIHRvIHRoZSBzdGFydCBvZiB0aGUgbWF0Y2hlZCB0ZXh0ICovCi0JeXljaGFyID0gMDsKLQotCS8qIHl5X2F0RU9GID09IHRydWUgPD0+IHRoZSBzY2FubmVyIGhhcyByZXR1cm5lZCBhIHZhbHVlIGZvciBFT0YgKi8KLQl5eV9hdEVPRiA9IGZhbHNlOwotCi0JLyogZGVub3RlcyBpZiB0aGUgdXNlci1FT0YtY29kZSBoYXMgYWxyZWFkeSBiZWVuIGV4ZWN1dGVkICovCi0JeXlfZW9mX2RvbmUgPSBmYWxzZTsKLQotCi0JLyogdXNlciB2YXJzOiAqLwotCWZUb2tlbkNvdW50ID0gMDsKLSAKLQlmU2hvdWxkTG9hZEJ1ZmZlcmVkID0gZmFsc2U7Ci0JZkJ1ZmZlcmVkQ29udGV4dCA9IG51bGw7Ci0JZkJ1ZmZlcmVkU3RhcnQgPSAxOwotCWZCdWZmZXJlZExlbmd0aCA9IDA7Ci0JZlN0YXRlU3RhY2sgPSBuZXcgSW50U3RhY2soKTsKLQotCWNvbnRleHQgPSBudWxsOwotCXN0YXJ0ID0gMDsKLQl0ZXh0TGVuZ3RoID0gMDsKLQlsZW5ndGggPSAwOwotfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QKLQkgKgotCSAqLwotCXB1YmxpYyBCbG9ja1Rva2VuaXplciBuZXdJbnN0YW5jZSgpIHsKLQkJWE1MVG9rZW5pemVyIG5ld0luc3RhbmNlID0gbmV3IFhNTFRva2VuaXplcigpOwotCQkvLyBnbG9iYWwgdGFnbWFya2VycyBjYW4gYmUgc2hhcmVkOyB0aGV5IGhhdmUgbm8gc3RhdGUgYW5kIAotCQkvLyBhcmUgbmV2ZXIgZGVzdHJveWVkIChlLmcuICdyZWxlYXNlJykKLQkJZm9yKGludCBpID0gMDsgaSA8IGZCbG9ja01hcmtlcnMuc2l6ZSgpOyBpKyspIHsKLQkJCUJsb2NrTWFya2VyIGJsb2NrTWFya2VyID0gKEJsb2NrTWFya2VyKSBmQmxvY2tNYXJrZXJzLmdldChpKTsKLQkJCWlmKGJsb2NrTWFya2VyLmlzR2xvYmFsKCkpCi0JCQkJbmV3SW5zdGFuY2UuYWRkQmxvY2tNYXJrZXIoYmxvY2tNYXJrZXIpOwotCQl9Ci0JCXJldHVybiBuZXdJbnN0YW5jZTsKLQl9Ci0vKiB1c2VyIG1ldGhvZCAqLwotcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2NhblhNTENvbW1lbnRUZXh0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQkvLyBTY2FuIGZvciAnLS0+JyBhbmQgcmV0dXJuIHRoZSB0ZXh0IHVwIHRvIHRoYXQgcG9pbnQgYXMKLQkvLyAgIFhNTF9DT01NRU5UX1RFWFQgdW5sZXNzIHRoZSBzdHJpbmcgb2NjdXJzIElNTUVESUFURUxZLCBpbiB3aGljaAotCS8vICBjYXNlIGNoYW5nZSB0byB0aGUgU1RfWE1MX0NPTU1FTlRfRU5EIHN0YXRlIGFuZCByZXR1cm4gdGhlIG5leHQKLQkvLyAgY29udGV4dCBhcyB1c3VhbC4KLQlyZXR1cm4gZG9TY2FuKCItLT4iLCBmYWxzZSwgWE1MX0NPTU1FTlRfVEVYVCwgU1RfWE1MX0NPTU1FTlRfRU5ELCBTVF9YTUxfQ09NTUVOVF9FTkQpOwotfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgc2Nhbm5lcgotICAgKiBUaGVyZSBpcyBhbHNvIGEgamF2YS5pby5JbnB1dFN0cmVhbSB2ZXJzaW9uIG9mIHRoaXMgY29uc3RydWN0b3IuCi0gICAqCi0gICAqIEBwYXJhbSAgIGluICB0aGUgamF2YS5pby5SZWFkZXIgdG8gcmVhZCBpbnB1dCBmcm9tLgotICAgKi8KLSAgcHVibGljIFhNTFRva2VuaXplcihqYXZhLmlvLlJlYWRlciBpbikgewotICAgIHRoaXMueXlfcmVhZGVyID0gaW47Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBzY2FubmVyLgotICAgKiBUaGVyZSBpcyBhbHNvIGphdmEuaW8uUmVhZGVyIHZlcnNpb24gb2YgdGhpcyBjb25zdHJ1Y3Rvci4KLSAgICoKLSAgICogQHBhcmFtICAgaW4gIHRoZSBqYXZhLmlvLklucHV0c3RyZWFtIHRvIHJlYWQgaW5wdXQgZnJvbS4KLSAgICovCi0gIHB1YmxpYyBYTUxUb2tlbml6ZXIoamF2YS5pby5JbnB1dFN0cmVhbSBpbikgewotICAgIHRoaXMobmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoaW4pKTsKLSAgfQotCi0gIC8qKiAKLSAgICogVW5wYWNrcyB0aGUgY29tcHJlc3NlZCBERkEgdHJhbnNpdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgdHJhbnNpdGlvbiB0YWJsZQotICAgKiBAcmV0dXJuICAgICAgICAgdGhlIHVucGFja2VkIHRyYW5zaXRpb24gdGFibGUKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBbXSB5eV91bnBhY2soU3RyaW5nIHBhY2tlZCkgewotICAgIGludCBbXSB0cmFucyA9IG5ldyBpbnRbOTIxMl07Ci0gICAgaW50IGkgPSAwOyAgLyogaW5kZXggaW4gcGFja2VkIHN0cmluZyAgKi8KLSAgICBpbnQgaiA9IDA7ICAvKiBpbmRleCBpbiB1bnBhY2tlZCBhcnJheSAqLwotICAgIHdoaWxlIChpIDwgMzIyMCkgewotICAgICAgaW50IGNvdW50ID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgaW50IHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgdmFsdWUtLTsKLSAgICAgIGRvIHRyYW5zW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zOwotICB9Ci0KLSAgLyoqIAotICAgKiBVbnBhY2tzIHRoZSBjb21wcmVzc2VkIGNoYXJhY3RlciB0cmFuc2xhdGlvbiB0YWJsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhY2tlZCAgIHRoZSBwYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqIEByZXR1cm4gICAgICAgICB0aGUgdW5wYWNrZWQgY2hhcmFjdGVyIHRyYW5zbGF0aW9uIHRhYmxlCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjaGFyIFtdIHl5X3VucGFja19jbWFwKFN0cmluZyBwYWNrZWQpIHsKLSAgICBjaGFyIFtdIG1hcCA9IG5ldyBjaGFyWzB4MTAwMDBdOwotICAgIGludCBpID0gMDsgIC8qIGluZGV4IGluIHBhY2tlZCBzdHJpbmcgICovCi0gICAgaW50IGogPSAwOyAgLyogaW5kZXggaW4gdW5wYWNrZWQgYXJyYXkgKi8KLSAgICB3aGlsZSAoaSA8IDEzNzIpIHsKLSAgICAgIGludCAgY291bnQgPSBwYWNrZWQuY2hhckF0KGkrKyk7Ci0gICAgICBjaGFyIHZhbHVlID0gcGFja2VkLmNoYXJBdChpKyspOwotICAgICAgZG8gbWFwW2orK10gPSB2YWx1ZTsgd2hpbGUgKC0tY291bnQgPiAwKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLgotICAgKgotICAgKiBAcmV0dXJuICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIG9mIHRoZSBpbnB1dCBzdHJlYW0sIEVPRiBpZiB0aGUKLSAgICogICAgICAgICAgICAgIGVuZCBvZiB0aGUgc3RyZWFtIGlzIHJlYWNoZWQuCi0gICAqIEBleGNlcHRpb24gICBJT0V4Y2VwdGlvbiAgaWYgYW55IEkvTy1FcnJvciBvY2N1cnMKLSAgICovCi0gIHByaXZhdGUgaW50IHl5X2FkdmFuY2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0KLSAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgaWYgKHl5X2N1cnJlbnRQb3MgPCB5eV9lbmRSZWFkKSByZXR1cm4geXlfYnVmZmVyW3l5X2N1cnJlbnRQb3MrK107Ci0KLSAgICAvKiBpZiB0aGUgZW9mIGlzIHJlYWNoZWQsIHdlIGRvbid0IG5lZWQgdG8gd29yayBoYXJkICovIAotICAgIGlmICh5eV9hdEVPRikgcmV0dXJuIFlZRU9GOwotCi0gICAgLyogb3RoZXJ3aXNlOiBuZWVkIHRvIHJlZmlsbCB0aGUgYnVmZmVyICovCi0KLSAgICAvKiBmaXJzdDogbWFrZSByb29tIChpZiB5b3UgY2FuKSAqLwotICAgIGlmICh5eV9zdGFydFJlYWQgPiAwKSB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfYnVmZmVyLCAwLCAKLSAgICAgICAgICAgICAgICAgICAgICAgeXlfZW5kUmVhZC15eV9zdGFydFJlYWQpOwotCi0gICAgICAvKiB0cmFuc2xhdGUgc3RvcmVkIHBvc2l0aW9ucyAqLwotICAgICAgeXlfZW5kUmVhZC09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X2N1cnJlbnRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9tYXJrZWRQb3MtPSB5eV9zdGFydFJlYWQ7Ci0gICAgICB5eV9wdXNoYmFja1Bvcy09IHl5X3N0YXJ0UmVhZDsKLSAgICAgIHl5X3N0YXJ0UmVhZCA9IDA7Ci0gICAgfQotCi0gICAgLyogaXMgdGhlIGJ1ZmZlciBiaWcgZW5vdWdoPyAqLwotICAgIGlmICh5eV9jdXJyZW50UG9zID49IHl5X2J1ZmZlci5sZW5ndGgpIHsKLSAgICAgIC8qIGlmIG5vdDogYmxvdyBpdCB1cCAqLwotICAgICAgY2hhciBuZXdCdWZmZXJbXSA9IG5ldyBjaGFyW3l5X2N1cnJlbnRQb3MqMl07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHl5X2J1ZmZlciwgMCwgbmV3QnVmZmVyLCAwLCB5eV9idWZmZXIubGVuZ3RoKTsKLSAgICAgIHl5X2J1ZmZlciA9IG5ld0J1ZmZlcjsKLSAgICB9Ci0KLSAgICAvKiBmaW5hbGx5OiBmaWxsIHRoZSBidWZmZXIgd2l0aCBuZXcgaW5wdXQgKi8KLSAgICBpbnQgbnVtUmVhZCA9IHl5X3JlYWRlci5yZWFkKHl5X2J1ZmZlciwgeXlfZW5kUmVhZCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHl5X2J1ZmZlci5sZW5ndGgteXlfZW5kUmVhZCk7Ci0KLSAgICBpZiAoIG51bVJlYWQgPT0gLTEgKSByZXR1cm4gWVlFT0Y7Ci0KLSAgICB5eV9lbmRSZWFkKz0gbnVtUmVhZDsKLQotICAgIHJldHVybiB5eV9idWZmZXJbeXlfY3VycmVudFBvcysrXTsKLSAgfQotCi0gICAgCi0gIC8qKgotICAgKiBDbG9zZXMgdGhlIGlucHV0IHN0cmVhbS4KLSAgICovCi0gIGZpbmFsIHB1YmxpYyB2b2lkIHl5Y2xvc2UoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgeXlfYXRFT0YgPSB0cnVlOyAgICAgICAgICAgIC8qIGluZGljYXRlIGVuZCBvZiBmaWxlICovCi0gICAgeXlfZW5kUmVhZCA9IHl5X3N0YXJ0UmVhZDsgIC8qIGludmFsaWRhdGUgYnVmZmVyICAgICovCi0gICAgeXlfcmVhZGVyLmNsb3NlKCk7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGxleGljYWwgc3RhdGUuCi0gICAqLwotICBmaW5hbCBwdWJsaWMgaW50IHl5c3RhdGUoKSB7Ci0gICAgcmV0dXJuIHl5X2xleGljYWxfc3RhdGU7Ci0gIH0KLQotICAvKioKLSAgICogRW50ZXJzIGEgbmV3IGxleGljYWwgc3RhdGUKLSAgICoKLSAgICogQHBhcmFtIG5ld1N0YXRlIHRoZSBuZXcgbGV4aWNhbCBzdGF0ZQotICAgKi8KLSAgZmluYWwgcHVibGljIHZvaWQgeXliZWdpbihpbnQgbmV3U3RhdGUpIHsKLSAgICB5eV9sZXhpY2FsX3N0YXRlID0gbmV3U3RhdGU7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB0ZXh0IG1hdGNoZWQgYnkgdGhlIGN1cnJlbnQgcmVndWxhciBleHByZXNzaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIFN0cmluZyB5eXRleHQoKSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoIHl5X2J1ZmZlciwgeXlfc3RhcnRSZWFkLCB5eV9tYXJrZWRQb3MteXlfc3RhcnRSZWFkICk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXRjaGVkIHRleHQgcmVnaW9uLgotICAgKi8KLSAgZmluYWwgcHVibGljIGludCB5eWxlbmd0aCgpIHsKLSAgICByZXR1cm4geXlfbWFya2VkUG9zLXl5X3N0YXJ0UmVhZDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJlcG9ydHMgYW4gZXJyb3IgdGhhdCBvY2N1cmVkIHdoaWxlIHNjYW5uaW5nIC0gZnJvbSB0aGUgU0VEIEpGbGV4IHNrZWxldG9uCi0gICAqCi0gICAqIEBwYXJhbSAgIGVycm9yQ29kZSAgdGhlIGNvZGUgb2YgdGhlIGVycm9ybWVzc2FnZSB0byBkaXNwbGF5Ci0gICAqLwotICBwcml2YXRlIHZvaWQgeXlfU2NhbkVycm9yKGludCBlcnJvckNvZGUpIHsKLSAgICB0cnkgewotICAgICAgTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsIFlZX0VSUk9SX01TR1tlcnJvckNvZGVdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgWVlfRVJST1JfTVNHW1lZX1VOS05PV05fRVJST1JdKTsKLSAgICB9Ci0gICAgLy8gRE8gTk9UIEVYSVQgdGhlIFZNIG9uIGFuIGVycm9yCi0gICAgLy8gU3lzdGVtLmV4aXQoMSk7Ci0gIH0gCi0KLQotICAvKioKLSAgICogUHVzaGVzIHRoZSBzcGVjaWZpZWQgYW1vdW50IG9mIGNoYXJhY3RlcnMgYmFjayBpbnRvIHRoZSBpbnB1dCBzdHJlYW0uCi0gICAqCi0gICAqIFRoZXkgd2lsbCBiZSByZWFkIGFnYWluIGJ5IHRoZW4gbmV4dCBjYWxsIG9mIHRoZSBzY2FubmluZyBtZXRob2QKLSAgICoKLSAgICogQHBhcmFtIG51bWJlciAgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGJlIHJlYWQgYWdhaW4uCi0gICAqICAgICAgICAgICAgICAgIFRoaXMgbnVtYmVyIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB5eWxlbmd0aCgpIQotICAgKi8KLSAgdm9pZCB5eXB1c2hiYWNrKGludCBudW1iZXIpIHsKLSAgICBpZiAoIG51bWJlciA+IHl5bGVuZ3RoKCkgKQotICAgICAgeXlfU2NhbkVycm9yKFlZX1BVU0hCQUNLXzJCSUcpOwotCi0gICAgeXlfbWFya2VkUG9zIC09IG51bWJlcjsKLSAgfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKi8KLQlwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBjb250YWluc1RhZ05hbWUoY2hhcltdIG1hcmtlclRhZ05hbWUsIGludCBvZmZzZXQsIGludCB0YWduYW1lTGVuZ3RoKSB7Ci0JCWZvcihpbnQgaiA9IDA7IGogPCBmQmxvY2tNYXJrZXJzLnNpemUoKTsgaisrKSB7Ci0JCQlCbG9ja01hcmtlciBtYXJrZXIgPSAoQmxvY2tNYXJrZXIpZkJsb2NrTWFya2Vycy5nZXQoaik7Ci0JCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmxlbmd0aCgpID09IHRhZ25hbWVMZW5ndGgpIHsKLQkJCQlib29sZWFuIG1hdGNoZXNTb0ZhciA9IHRydWU7Ci0JCQkJZm9yKGludCBpID0gMDsgaSA8IHRhZ25hbWVMZW5ndGggJiYgbWF0Y2hlc1NvRmFyOyBpKyspIHsKLQkJCQkJaWYobWFya2VyLmlzQ2FzZVNlbnNpdGl2ZSgpKSB7Ci0JCQkJCQlpZihtYXJrZXIuZ2V0VGFnTmFtZSgpLmNoYXJBdChpKSAhPSBtYXJrZXJUYWdOYW1lW2kgKyBvZmZzZXRdKQotCQkJCQkJCW1hdGNoZXNTb0ZhciA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJaWYoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKG1hcmtlci5nZXRUYWdOYW1lKCkuY2hhckF0KGkpKSAhPSBDaGFyYWN0ZXIudG9Mb3dlckNhc2UobWFya2VyVGFnTmFtZVtpICsgb2Zmc2V0XSkpCi0JCQkJCQkJbWF0Y2hlc1NvRmFyID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJaWYobWF0Y2hlc1NvRmFyKQotCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQKLQkgKgotCSAqIFJldHVybiBBTEwgb2YgdGhlIHJlZ2lvbnMgc2Nhbm5hYmxlIHdpdGhpbiB0aGUgcmVtYWluaW5nIHRleHQKLQkgKiBOb3RlOiBmb3IgdmVyaWZpY2F0aW9uIHVzZQotCSAqLwotCXB1YmxpYyBmaW5hbCBMaXN0IGdldFJlZ2lvbnMoKSB7Ci0JCUxpc3QgdG9rZW5zID0gbmV3IEFycmF5TGlzdCgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQl0cnkgewotCQkJcmVnaW9uID0gZ2V0TmV4dFRva2VuKCk7Ci0JCQl3aGlsZShyZWdpb24gIT0gbnVsbCkgewotCQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCQl0b2tlbnMuYWRkKHJlZ2lvbik7Ci0JCQkJfQotCQkJCXJlZ2lvbiA9IGdldE5leHRUb2tlbigpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTdGFja092ZXJmbG93RXJyb3IgZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihnZXRDbGFzcygpLmdldE5hbWUoKSsiOiBpbnB1dCBjb3VsZCBub3QgYmUgdG9rZW5pemVkIGNvcnJlY3RseSBhdCBwb3NpdGlvbiAiICsgZ2V0T2Zmc2V0KCksIGUpOy8vJE5PTi1OTFMtMSQKLQkJCXRocm93IGU7Ci0JCX0KLQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBTaW5jZSB0aGlzIGlzIGNvbnZlbmllbmNlIG1ldGhvZCBhbmQgTk9UIHRoZSByZWNvbW1lbmRlZCAKLQkJCS8vIHdheSBvZiBnZXR0aW5nIHRva2VucywgbWFueSBlcnJvcnMgYXJlIHNpbXBseSBoaWRkZW4KLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBub3QgaGFuZGxlZCByZXRyaWV2aW5nIHJlZ2lvbnM6ICIgKyBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiB0b2tlbnM7Ci0JfQotCS8qKgotCSAqIHVzZXIgbWV0aG9kIC0gc2tlbGV0b24uc2VkCi0JICovCi0JcHJpdmF0ZSBmaW5hbCB2b2lkIGR1bXAoU3RyaW5nIHMpIHsKLQkJaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4ocyArICIgKCIgKyB5eWNoYXIgKyAiLSIgKyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCSh5eWxlbmd0aCgpICsgeXljaGFyKSArICIpOlwnIiArLy8kTk9OLU5MUy0xJAotCQkJCQlTdHJpbmdVdGlscy5lc2NhcGUoeXl0ZXh0KCkpICsgIlwnIik7Ly8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCS8qIHVzZXIgbWV0aG9kICAtIHNrZWxldG9uLnNlZCAqLwotCXB1YmxpYyBmaW5hbCBib29sZWFuIGlzRU9GKCkgewotCQlyZXR1cm4geXlfYXRFT0Y7Ci0JfQotLyogdXNlciBtZXRob2QgLSBza2VsZXRvbi5zZWQgKi8KLXByb3RlY3RlZCBmaW5hbCBib29sZWFuIGNvbnRhaW5zVGFnTmFtZShTdHJpbmcgbWFya2VyVGFnTmFtZSkgewotCUl0ZXJhdG9yIGJsb2NrcyA9IGZCbG9ja01hcmtlcnMuaXRlcmF0b3IoKTsKLQl3aGlsZShibG9ja3MuaGFzTmV4dCgpKSB7Ci0JCUJsb2NrTWFya2VyIG1hcmtlciA9IChCbG9ja01hcmtlcilibG9ja3MubmV4dCgpOwotCQlpZihtYXJrZXIuaXNDYXNlU2Vuc2l0aXZlKCkpIHsKLQkJCWlmKG1hcmtlci5nZXRUYWdOYW1lKCkuZXF1YWxzKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCWVsc2UgewotCQkJaWYobWFya2VyLmdldFRhZ05hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKG1hcmtlclRhZ05hbWUpKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JfQotCXJldHVybiBmYWxzZTsKLX0KLQotICAvKioKLSAgICogQ29udGFpbnMgdXNlciBFT0YtY29kZSwgd2hpY2ggd2lsbCBiZSBleGVjdXRlZCBleGFjdGx5IG9uY2UsCi0gICAqIHdoZW4gdGhlIGVuZCBvZiBmaWxlIGlzIHJlYWNoZWQKLSAgICovCi0gIHByaXZhdGUgdm9pZCB5eV9kb19lb2YoKSB7Ci0gICAgaWYgKCF5eV9lb2ZfZG9uZSkgewotICAgICAgeXlfZW9mX2RvbmUgPSB0cnVlOwotICAgIC8vIGRvIG5vdGhpbmcsIHRoaXMgaXMgdGhlIGRvd25zdHJlYW0gcGFyc2VyJ3Mgam9iCi0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBSZXN1bWVzIHNjYW5uaW5nIHVudGlsIHRoZSBuZXh0IHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBtYXRjaGVkLAotICAgKiB0aGUgZW5kIG9mIGlucHV0IGlzIGVuY291bnRlcmVkIG9yIGFuIEkvTy1FcnJvciBvY2N1cnMuCi0gICAqCi0gICAqIEByZXR1cm4gICAgICB0aGUgbmV4dCB0b2tlbgotICAgKiBAZXhjZXB0aW9uICAgSU9FeGNlcHRpb24gIGlmIGFueSBJL08tRXJyb3Igb2NjdXJzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHByaW1HZXROZXh0VG9rZW4oKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHl5X2lucHV0OwotICAgIGludCB5eV9hY3Rpb247Ci0KLQotICAgIHdoaWxlICh0cnVlKSB7Ci0KLSAgICAgIHl5Y2hhcis9IHl5bGVuZ3RoKCk7Ci0KLSAgICAgIGJvb2xlYW4geXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgZm9yICh5eV9jdXJyZW50UG9zID0geXlfc3RhcnRSZWFkOyB5eV9jdXJyZW50UG9zIDwgeXlfbWFya2VkUG9zOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXlfY3VycmVudFBvcysrKSB7Ci0gICAgICAgIHN3aXRjaCAoeXlfYnVmZmVyW3l5X2N1cnJlbnRQb3NdKSB7Ci0gICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICB5eWxpbmUrKzsKLSAgICAgICAgICB5eV9jb3VudGVkID0gdHJ1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXG4nOgotICAgICAgICAgIGlmICh5eV9jb3VudGVkKQotICAgICAgICAgICAgeXlfY291bnRlZCA9IGZhbHNlOwotICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgeXlsaW5lKys7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHl5X2NvdW50ZWQgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoeXlfY291bnRlZCkgewotICAgICAgICBpZiAoIHl5X2FkdmFuY2UoKSA9PSAnXG4nICkgeXlsaW5lLS07Ci0gICAgICAgIGlmICggIXl5X2F0RU9GICkgeXlfY3VycmVudFBvcy0tOwotICAgICAgfQotCi0gICAgICB5eV9hY3Rpb24gPSAtMTsKLQotICAgICAgeXlfY3VycmVudFBvcyA9IHl5X3N0YXJ0UmVhZCA9IHl5X21hcmtlZFBvczsKLQotICAgICAgeXlfc3RhdGUgPSB5eV9sZXhpY2FsX3N0YXRlOwotCi0KLSAgICAgIHl5X2ZvckFjdGlvbjogewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgIAotICAgICAgICAgIHl5X2lucHV0ID0geXlfYWR2YW5jZSgpOwotCi0gICAgICAgICAgaWYgKCB5eV9pbnB1dCA9PSBZWUVPRiApIGJyZWFrIHl5X2ZvckFjdGlvbjsKLQotICAgICAgICAgIGludCB5eV9uZXh0ID0geXl0cmFuc1sgeXlfcm93TWFwW3l5X3N0YXRlXSArIHl5Y21hcFt5eV9pbnB1dF0gXTsKLSAgICAgICAgICBpZiAoeXlfbmV4dCA9PSAtMSkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIHl5X3N0YXRlID0geXlfbmV4dDsKLQotICAgICAgICAgIGludCB5eV9hdHRyaWJ1dGVzID0gWVlfQVRUUklCVVRFW3l5X3N0YXRlXTsKLSAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgMSkgPiAwICkgewotICAgICAgICAgICAgeXlfYWN0aW9uID0geXlfc3RhdGU7IAotICAgICAgICAgICAgeXlfbWFya2VkUG9zID0geXlfY3VycmVudFBvczsgCi0gICAgICAgICAgICBpZiAoICh5eV9hdHRyaWJ1dGVzICYgOCkgPiAwICkgYnJlYWsgeXlfZm9yQWN0aW9uOwotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICB9Ci0KLQotICAgICAgc3dpdGNoICh5eV9hY3Rpb24pIHsgICAgCi0KLSAgICAgICAgY2FzZSAyNzU6IAotICAgICAgICBjYXNlIDI3NjogCi0gICAgICAgIGNhc2UgMjc3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNEQVRBIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCWZTdGF0ZVN0YWNrLnB1c2goeXlzdGF0ZSgpKTsKLQl5eWJlZ2luKFNUX0NEQVRBX1RFWFQpOwotCXJldHVybiBYTUxfQ0RBVEFfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjc5OiBicmVhazsKLSAgICAgICAgY2FzZSAyNjk6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRUxFTUVOVF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xBUkFUSU9OOwotIH0KLSAgICAgICAgY2FzZSAyODA6IGJyZWFrOwotICAgICAgICBjYXNlIDI2ODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OKTsKLQlyZXR1cm4gWE1MX0FUVExJU1RfREVDTEFSQVRJT047Ci0gfQotICAgICAgICBjYXNlIDI4MTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjY3OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04pOwotCXJldHVybiBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTjsKLSB9Ci0gICAgICAgIGNhc2UgMjgyOiBicmVhazsKLSAgICAgICAgY2FzZSAyNjI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgZXh0ZXJuYWwgaWQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihTVF9YTUxfRE9DVFlQRV9JRF9QVUJMSUMpOwotCXJldHVybiBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUM7Ci0gfQotICAgICAgICBjYXNlIDI4MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjYxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJkb2N0eXBlIGV4dGVybmFsIGlkIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RPQ1RZUEVfSURfU1lTVEVNKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNOwotIH0KLSAgICAgICAgY2FzZSAyODQ6IGJyZWFrOwotICAgICAgICBjYXNlIDI1NzogCi0gICAgICAgIGNhc2UgMjY2OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDI4NTogYnJlYWs7Ci0gICAgICAgIGNhc2UgMjM0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbkNoYXJSZWYiKTsvLyROT04tTkxTLTEkCi0JcmV0dXJuIFhNTF9DSEFSX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMjg2OiBicmVhazsKLSAgICAgICAgY2FzZSAyMzE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuY29tbWVudCBzdGFydCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9DT01NRU5UKTsKLQlyZXR1cm4gWE1MX0NPTU1FTlRfT1BFTjsKLSB9Ci0gICAgICAgIGNhc2UgMjg3OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRhcmdldCIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19OQU1FOwotIH0KLSAgICAgICAgY2FzZSAyODg6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiY29tbWVudCBlbmQiKTsvLyROT04tTkxTLTEkCi0JeXliZWdpbihZWUlOSVRJQUwpOwotCXJldHVybiBYTUxfQ09NTUVOVF9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjg5OiBicmVhazsKLSAgICAgICAgY2FzZSAyMTE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkNEQVRBIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0NEQVRBX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTA6IGJyZWFrOwotICAgICAgICBjYXNlIDIxMDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5QRVJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX1BFX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMjkxOiBicmVhazsKLSAgICAgICAgY2FzZSAyMDc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIlxuRW50aXR5UmVmIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfRU5USVRZX1JFRkVSRU5DRTsKLSB9Ci0gICAgICAgIGNhc2UgMjkyOiBicmVhazsKLSAgICAgICAgY2FzZSAxNTg6IAotICAgICAgICBjYXNlIDE3MjogCi0gICAgICAgIGNhc2UgMTgwOiAKLSAgICAgICAgICB7IAotCXJldHVybiBYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQ7Ci0gfQotICAgICAgICBjYXNlIDI5MzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTQ2OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVtcHR5IHRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgcmV0dXJuIFhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDI5NDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTMxOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjk1OiBicmVhazsKLSAgICAgICAgY2FzZSAxMzA6IAotICAgICAgICAgIHsgCi0JCS8vIGVuZGVkIHdpdGggbm90aGluZyBpbnNpZGUKLSAgICAgICAgeXliZWdpbihZWUlOSVRJQUwpOwotICAgICAgICByZXR1cm4gWE1MX1BJX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAyOTY6IGJyZWFrOwotICAgICAgICBjYXNlIDEyNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgicHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBlbmQiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9QSV9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMjk3OiBicmVhazsKLSAgICAgICAgY2FzZSAxMTk6IAotICAgICAgICAgIHsgCi0JZlN0YXRlU3RhY2sucHVzaCh5eXN0YXRlKCkpOwotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcbmRlY2xhcmF0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9ERUNMQVJBVElPTik7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9PUEVOOwotIH0KLSAgICAgICAgY2FzZSAyOTg6IGJyZWFrOwotICAgICAgICBjYXNlIDExODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5wcm9jZXNzaW5nIGluc3RydWN0aW9uIHN0YXJ0Iik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfUEkpOwotICAgICAgICByZXR1cm4gWE1MX1BJX09QRU47Ci0gfQotICAgICAgICBjYXNlIDI5OTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNjI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkRIVE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZW5kIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfUElfQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMwMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTY6IAotICAgICAgICBjYXNlIDU4OiAKLSAgICAgICAgY2FzZSA1OTogCi0gICAgICAgIGNhc2UgNjA6IAotICAgICAgICBjYXNlIDEzNTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYXR0cmlidXRlIHZhbHVlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfTkFNRSk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLSB9Ci0gICAgICAgIGNhc2UgMzAxOiBicmVhazsKLSAgICAgICAgY2FzZSA1NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gJz0nIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9QSV9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMDI6IGJyZWFrOwotICAgICAgICBjYXNlIDU0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgbmFtZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfUElfRVFVQUxTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfQVRUUklCVVRFX05BTUU7Ci0gfQotICAgICAgICBjYXNlIDMwMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNTA6IAotICAgICAgICBjYXNlIDUxOiAKLSAgICAgICAgY2FzZSA1MjogCi0gICAgICAgICAgeyAKLQkvLyBibG9jayBzY2FuIHVudGlsIGNsb3NlIGlzIGZvdW5kCi0JcmV0dXJuIGRvU2NhbigiPz4iLCBmYWxzZSwgWE1MX1BJX0NPTlRFTlQsIFNUX1hNTF9QSV9UQUdfQ0xPU0UsIFNUX1hNTF9QSV9UQUdfQ0xPU0UpOwotIH0KLSAgICAgICAgY2FzZSAzMDQ6IGJyZWFrOwotICAgICAgICBjYXNlIDQ5OiAKLSAgICAgICAgICB7IAotICAgICAgICB5eWJlZ2luKFNUX1BJX0NPTlRFTlQpOwotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMwNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDY6IAotICAgICAgICBjYXNlIDQ3OiAKLSAgICAgICAgY2FzZSA0ODogCi0gICAgICAgIGNhc2UgMTI4OiAKLSAgICAgICAgY2FzZSAxMjk6IAotICAgICAgICBjYXNlIDIxNDogCi0gICAgICAgIGNhc2UgMjM2OiAKLSAgICAgICAgY2FzZSAyNDg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGFyZ2V0Iik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1BJX1dTKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzA2OiBicmVhazsKLSAgICAgICAgY2FzZSA0MTogCi0gICAgICAgIGNhc2UgNDI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImNvbW1lbnQgY29udGVudCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gc2NhblhNTENvbW1lbnRUZXh0KCk7Ci0gfQotICAgICAgICBjYXNlIDMwNzogYnJlYWs7Ci0gICAgICAgIGNhc2UgNDA6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIkxJTkUgRkVFRCIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMwODogYnJlYWs7Ci0gICAgICAgIGNhc2UgMDogCi0gICAgICAgIGNhc2UgMzE6IAotICAgICAgICBjYXNlIDEyMTogCi0gICAgICAgIGNhc2UgMTIzOiAKLSAgICAgICAgY2FzZSAyMDU6IAotICAgICAgICBjYXNlIDIwNjogCi0gICAgICAgIGNhc2UgMjMzOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJcblhNTCBjb250ZW50Iik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQ09OVEVOVDsKLSB9Ci0gICAgICAgIGNhc2UgMzA5OiBicmVhazsKLSAgICAgICAgY2FzZSA1OiAKLSAgICAgICAgY2FzZSA4OiAKLSAgICAgICAgY2FzZSA5OiAKLSAgICAgICAgY2FzZSAxMDogCi0gICAgICAgIGNhc2UgMTI6IAotICAgICAgICBjYXNlIDEzOiAKLSAgICAgICAgY2FzZSAxNDogCi0gICAgICAgIGNhc2UgMTU6IAotICAgICAgICBjYXNlIDE3OiAKLSAgICAgICAgY2FzZSAxODogCi0gICAgICAgIGNhc2UgMTk6IAotICAgICAgICBjYXNlIDIwOiAKLSAgICAgICAgY2FzZSAyMTogCi0gICAgICAgIGNhc2UgMjI6IAotICAgICAgICBjYXNlIDIzOiAKLSAgICAgICAgY2FzZSAyNDogCi0gICAgICAgIGNhc2UgMjU6IAotICAgICAgICBjYXNlIDI2OiAKLSAgICAgICAgY2FzZSAyODogCi0gICAgICAgIGNhc2UgNDU6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoIndoaXRlIHNwYWNlIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICByZXR1cm4gV0hJVEVfU1BBQ0U7Ci0gfQotICAgICAgICBjYXNlIDMxMDogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTY6IAotICAgICAgICBjYXNlIDcwOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJpbmFwcHJvcHJpYXRlIHRhZyBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oWVlJTklUSUFMKTsKLSAgICAgICAgcmV0dXJuIFhNTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMTE6IGJyZWFrOwotICAgICAgICBjYXNlIDI3OiAKLSAgICAgICAgY2FzZSAxMDU6IAotICAgICAgICBjYXNlIDEwNjogCi0gICAgICAgIGNhc2UgMTkxOiAKLSAgICAgICAgY2FzZSAyMjY6IAotICAgICAgICBjYXNlIDI0NDogCi0gICAgICAgIGNhc2UgMjU0OiAKLSAgICAgICAgY2FzZSAyNjM6IAotICAgICAgICBjYXNlIDI3MDogCi0gICAgICAgIGNhc2UgMjczOiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBjb250ZW50c3BlYyIpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gWE1MX0VMRU1FTlRfREVDTF9DT05URU5UOwotIH0KLSAgICAgICAgY2FzZSAzMTI6IGJyZWFrOwotICAgICAgICBjYXNlIDI5OiAKLSAgICAgICAgY2FzZSAxMTI6IAotICAgICAgICBjYXNlIDExMzogCi0gICAgICAgIGNhc2UgMjAyOiAKLSAgICAgICAgY2FzZSAyMzA6IAotICAgICAgICBjYXNlIDI0NjogCi0gICAgICAgIGNhc2UgMjU1OiAKLSAgICAgICAgY2FzZSAyNjQ6IAotICAgICAgICBjYXNlIDI3MTogCi0gICAgICAgIGNhc2UgMjc0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJhdHRsaXN0IGNvbnRlbnRzcGVjIik7Ly8kTk9OLU5MUy0xJAotCXJldHVybiBYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQ7Ci0gfQotICAgICAgICBjYXNlIDMxMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMzI6IAotICAgICAgICBjYXNlIDcxOiAKLSAgICAgICAgY2FzZSA4MjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5zdGFydCB0YWcgb3BlbiIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfVEFHX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19PUEVOOwotIH0KLSAgICAgICAgY2FzZSAzMTQ6IGJyZWFrOwotICAgICAgICBjYXNlIDMzOiAKLSAgICAgICAgY2FzZSAzNDogCi0gICAgICAgIGNhc2UgMzc6IAotICAgICAgICBjYXNlIDM4OiAKLSAgICAgICAgY2FzZSAzOTogCi0gICAgICAgIGNhc2UgNDM6IAotICAgICAgICBjYXNlIDQ0OiAKLSAgICAgICAgY2FzZSA1MzogCi0gICAgICAgIGNhc2UgNTc6IAotICAgICAgICBjYXNlIDYxOiAKLSAgICAgICAgY2FzZSA2MzogCi0gICAgICAgIGNhc2UgNjc6IAotICAgICAgICBjYXNlIDczOiAKLSAgICAgICAgY2FzZSA3OTogCi0gICAgICAgIGNhc2UgODQ6IAotICAgICAgICBjYXNlIDg1OiAKLSAgICAgICAgY2FzZSA4NjogCi0gICAgICAgIGNhc2UgODc6IAotICAgICAgICBjYXNlIDg5OiAKLSAgICAgICAgY2FzZSA5MDogCi0gICAgICAgIGNhc2UgOTI6IAotICAgICAgICBjYXNlIDk3OiAKLSAgICAgICAgY2FzZSAxMDI6IAotICAgICAgICBjYXNlIDEwOTogCi0gICAgICAgICAgeyAKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCVN5c3RlbS5vdXQucHJpbnRsbigiISEhdW5leHBlY3RlZCEhITogXCIiICsgeXl0ZXh0KCkgKyAiXCI6IiArIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQl5eWNoYXIgKyAiLSIgKyAoeXljaGFyICsgeXlsZW5ndGgoKSkpOy8vJE5PTi1OTFMtMSQKLQlyZXR1cm4gVU5ERUZJTkVEOwotIH0KLSAgICAgICAgY2FzZSAzMTU6IGJyZWFrOwotICAgICAgICBjYXNlIDM1OiAKLSAgICAgICAgY2FzZSAzNjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiQ0RBVEEgdGV4dCIpOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgYmxvY2tDb250ZXh0ID0gZG9CbG9ja1NjYW4oIl1dPiIsIFhNTF9DREFUQV9URVhULCBTVF9DREFUQV9FTkQpOy8vJE5PTi1OTFMtMSQKLQlpZihibG9ja0NvbnRleHQgPT0gWE1MX0NEQVRBX1RFWFQpCi0JCXl5YmVnaW4oU1RfQ0RBVEFfRU5EKTsKLQlyZXR1cm4gYmxvY2tDb250ZXh0OwotIH0KLSAgICAgICAgY2FzZSAzMTY6IGJyZWFrOwotICAgICAgICBjYXNlIDY0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF0dHJpYnV0ZSBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX0RIVE1MX0VRVUFMUyk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0FUVFJJQlVURV9OQU1FOwotIH0KLSAgICAgICAgY2FzZSAzMTc6IGJyZWFrOwotICAgICAgICBjYXNlIDY1OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJESFRNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uICc9JyIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9ESFRNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMTg6IGJyZWFrOwotICAgICAgICBjYXNlIDY2OiAKLSAgICAgICAgY2FzZSA2ODogCi0gICAgICAgIGNhc2UgNjk6IAotICAgICAgICBjYXNlIDE0MzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiREhUTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhdHRyaWJ1dGUgdmFsdWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfREhUTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMxOTogYnJlYWs7Ci0gICAgICAgIGNhc2UgNzI6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoInRhZyBjbG9zZSIpOy8vJE5PTi1OTFMtMSQKLQlpZihpc0Jsb2NrTWFya2VyKCkpIHsKLSAgICAgICAgCXl5YmVnaW4oU1RfQkxPQ0tfVEFHX1NDQU4pOwotCX0KLQllbHNlCi0gICAgICAgIAl5eWJlZ2luKFlZSU5JVElBTCk7Ci0gICAgICAgIHJldHVybiBYTUxfVEFHX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMjA6IGJyZWFrOwotICAgICAgICBjYXNlIDc0OiAKLSAgICAgICAgY2FzZSA3NTogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgidGFnIG5hbWUiKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX0FUVFJJQlVURV9OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9UQUdfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIxOiBicmVhazsKLSAgICAgICAgY2FzZSA3NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciBuYW1lIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9FUVVBTFMpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzIyOiBicmVhazsKLSAgICAgICAgY2FzZSA3NzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZXF1YWxzIik7Ly8kTk9OLU5MUy0xJAotICAgICAgICB5eWJlZ2luKFNUX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTOwotIH0KLSAgICAgICAgY2FzZSAzMjM6IGJyZWFrOwotICAgICAgICBjYXNlIDc4OiAKLSAgICAgICAgY2FzZSA4MDogCi0gICAgICAgIGNhc2UgODE6IAotICAgICAgICBjYXNlIDE1MDogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0ciB2YWx1ZSIpOy8vJE5PTi1OTFMtMSQKLSAgICAgICAgeXliZWdpbihTVF9YTUxfQVRUUklCVVRFX05BTUUpOwotICAgICAgICByZXR1cm4gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUU7Ci0gfQotICAgICAgICBjYXNlIDMyNDogYnJlYWs7Ci0gICAgICAgIGNhc2UgODM6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRlY2xhcmF0aW9uIGVuZCIpOy8vJE5PTi1OTFMtMSQKLQlpZiAoRGVidWcuZGVidWdUb2tlbml6ZXIpIHsKLQkJaWYoZlN0YXRlU3RhY2sucGVlaygpIT1ZWUlOSVRJQUwpCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oImVuZCBlbWJlZGRlZCByZWdpb24iKTsvLyROT04tTkxTLTEkCi0JfQotCXl5YmVnaW4oZlN0YXRlU3RhY2sucG9wKCkpOwotCXJldHVybiBYTUxfREVDTEFSQVRJT05fQ0xPU0U7Ci0gfQotICAgICAgICBjYXNlIDMyNTogYnJlYWs7Ci0gICAgICAgIGNhc2UgODg6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgdHlwZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzI2OiBicmVhazsKLSAgICAgICAgY2FzZSA5MTogCi0gICAgICAgIGNhc2UgOTM6IAotICAgICAgICBjYXNlIDk0OiAKLSAgICAgICAgY2FzZSA5NTogCi0gICAgICAgIGNhc2UgMTY0OiAKLSAgICAgICAgY2FzZSAxNjU6IAotICAgICAgICBjYXNlIDE2ODogCi0gICAgICAgIGNhc2UgMTY5OiAKLSAgICAgICAgY2FzZSAyMjE6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImRvY3R5cGUgcHVibGljIHJlZmVyZW5jZSIpOy8vJE5PTi1OTFMtMSQKLQl5eWJlZ2luKFNUX1hNTF9ET0NUWVBFX0lEX1NZU1RFTSk7Ci0JcmV0dXJuIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLSB9Ci0gICAgICAgIGNhc2UgMzI3OiBicmVhazsKLSAgICAgICAgY2FzZSA5NjogCi0gICAgICAgIGNhc2UgOTg6IAotICAgICAgICBjYXNlIDk5OiAKLSAgICAgICAgY2FzZSAxMDA6IAotICAgICAgICBjYXNlIDE3NjogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiZG9jdHlwZSBzeXN0ZW0gcmVmZXJlbmNlIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKTsKLQlyZXR1cm4gWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotIH0KLSAgICAgICAgY2FzZSAzMjg6IGJyZWFrOwotICAgICAgICBjYXNlIDEwMTogCi0gICAgICAgIGNhc2UgMTAzOiAKLSAgICAgICAgY2FzZSAxMDQ6IAotICAgICAgICBjYXNlIDE4NDogCi0gICAgICAgIGNhc2UgMTg1OiAKLSAgICAgICAgY2FzZSAxODg6IAotICAgICAgICBjYXNlIDE4OTogCi0gICAgICAgIGNhc2UgMjI0OiAKLSAgICAgICAgICB7IAotCWlmKERlYnVnLmRlYnVnVG9rZW5pemVyKQotCQlkdW1wKCJlbGVtZW50ZGVjbCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0VMRU1FTlRfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzI5OiBicmVhazsKLSAgICAgICAgY2FzZSAxMDc6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImVsZW1lbnRkZWNsIGNsb3NlIik7Ly8kTk9OLU5MUy0xJAotCWlmIChEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikgewotCQlpZihmU3RhdGVTdGFjay5wZWVrKCkhPVlZSU5JVElBTCkKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiZW5kIGVtYmVkZGVkIHJlZ2lvbiIpOy8vJE5PTi1OTFMtMSQKLQl9Ci0JeXliZWdpbihmU3RhdGVTdGFjay5wb3AoKSk7Ci0JcmV0dXJuIFhNTF9ERUNMQVJBVElPTl9DTE9TRTsKLSB9Ci0gICAgICAgIGNhc2UgMzMwOiBicmVhazsKLSAgICAgICAgY2FzZSAxMDg6IAotICAgICAgICBjYXNlIDExMDogCi0gICAgICAgIGNhc2UgMTExOiAKLSAgICAgICAgY2FzZSAxOTU6IAotICAgICAgICBjYXNlIDE5NjogCi0gICAgICAgIGNhc2UgMTk5OiAKLSAgICAgICAgY2FzZSAyMDA6IAotICAgICAgICBjYXNlIDIyODogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiYXR0bGlzdCBuYW1lIik7Ly8kTk9OLU5MUy0xJAotCXl5YmVnaW4oU1RfWE1MX0FUVExJU1RfREVDTEFSQVRJT05fQ09OVEVOVCk7Ci0JcmV0dXJuIFhNTF9BVFRMSVNUX0RFQ0xfTkFNRTsKLSB9Ci0gICAgICAgIGNhc2UgMzMxOiBicmVhazsKLSAgICAgICAgY2FzZSAxMTQ6IAotICAgICAgICAgIHsgCi0JaWYoRGVidWcuZGVidWdUb2tlbml6ZXIpCi0JCWR1bXAoImF0dGxpc3QgY2xvc2UiKTsvLyROT04tTkxTLTEkCi0JaWYgKERlYnVnLmRlYnVnVG9rZW5pemVyKSB7Ci0JCWlmKGZTdGF0ZVN0YWNrLnBlZWsoKSE9WVlJTklUSUFMKQotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbmQgZW1iZWRkZWQgcmVnaW9uIik7Ly8kTk9OLU5MUy0xJAotCX0KLQl5eWJlZ2luKGZTdGF0ZVN0YWNrLnBvcCgpKTsKLQlyZXR1cm4gWE1MX0RFQ0xBUkFUSU9OX0NMT1NFOwotIH0KLSAgICAgICAgY2FzZSAzMzI6IGJyZWFrOwotICAgICAgICBjYXNlIDExNzogCi0gICAgICAgICAgeyAKLQlpZihEZWJ1Zy5kZWJ1Z1Rva2VuaXplcikKLQkJZHVtcCgiXG5lbmQgdGFnIG9wZW4iKTsvLyROT04tTkxTLTEkCi0gICAgICAgIHl5YmVnaW4oU1RfWE1MX1RBR19OQU1FKTsKLSAgICAgICAgcmV0dXJuIFhNTF9FTkRfVEFHX09QRU47Ci0gfQotICAgICAgICBjYXNlIDMzMzogYnJlYWs7Ci0gICAgICAgIGNhc2UgMTE1OiAKLSAgICAgICAgY2FzZSAxMTY6IAotICAgICAgICAgIHsgCi0JCXJldHVybiBkb0Jsb2NrVGFnU2NhbigpOwotCSB9Ci0gICAgICAgIGNhc2UgMzM0OiBicmVhazsKLSAgICAgICAgZGVmYXVsdDogCi0gICAgICAgICAgaWYgKHl5X2lucHV0ID09IFlZRU9GICYmIHl5X3N0YXJ0UmVhZCA9PSB5eV9jdXJyZW50UG9zKSB7Ci0gICAgICAgICAgICB5eV9hdEVPRiA9IHRydWU7Ci0gICAgICAgICAgICB5eV9kb19lb2YoKTsKLSAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfSAKLSAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIHl5X1NjYW5FcnJvcihZWV9OT19NQVRDSCk7Ci0gICAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAKLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZUVxdWFsc1JlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVFcXVhbHNSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwZjNjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZUVxdWFsc1JlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVFcXVhbHNSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgYnl0ZSBmVGV4dExlbmd0aCA9IDE7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0JcHJpdmF0ZSBzaG9ydCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQotCi0JcHVibGljIEF0dHJpYnV0ZUVxdWFsc1JlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlRXF1YWxzUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IChzaG9ydCkgbGVuZ3RoOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCQlmTGVuZ3RoID0gKHNob3J0KSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gY2FuIG5ldmVyIGJlIHVwZGF0ZWQKLQkJcmV0dXJuIG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9BdHRyaWJ1dGVOYW1lUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZU5hbWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFlN2RlYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZU5hbWVSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlTmFtZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQkvLyBzcGVjaWZ5IGNvcnJlY3QgdHlwZQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRTsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBBdHRyaWJ1dGVOYW1lUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvQXR0cmlidXRlVmFsdWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE3YjNhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL0F0dHJpYnV0ZVZhbHVlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIEF0dHJpYnV0ZVZhbHVlUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCS8vIHNwZWNpZnkgY29ycmVjdCB0eXBlCi0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRTsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCXB1YmxpYyBBdHRyaWJ1dGVWYWx1ZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQXR0cmlidXRlVmFsdWVSZWdpb24oaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmVGV4dExlbmd0aCA9IHRleHRMZW5ndGg7Ci0JCWZMZW5ndGggPSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IDE7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdCh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQkvLyB1cGRhdGUgbGVuZ3RoIChhbmQgZW5kKSBhZnRlciBhYm92ZSBjaGVjayBmb3Igd2hpdGUgc3BhY2UsCi0JCQkvLyBzaW5jZQotCQkJLy8gaXQgbG9va3MgdG8gZGV0ZXJtaW5lIGlmIGF0IGVuZCBvZiByZWdpb24uCi0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9HZW5lcmljVGVtcGxhdGVSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvR2VuZXJpY1RlbXBsYXRlUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNGY5OGIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9HZW5lcmljVGVtcGxhdGVSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLS8qKgotICogCi0gKiBUaGlzIGNsYXNzIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkLCBpdHMganVzdCBwcmVzZW50IHRvIHNlcnZlciBhcyBhCi0gKiBnZW5lcmljIHN0YXJ0aW5nIHBvaW50IGZvciBhZGRpbmcgbmV3IHNwZWNpZmljIHJlZ2lvbiB0eXBlcy4KLSAqIAotICovCi0KLXB1YmxpYyBjbGFzcyBHZW5lcmljVGVtcGxhdGVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0JLy8gc3BlY2lmeSBjb3JyZWN0IHR5cGUKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQlwcml2YXRlIGludCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIGludCBmVGV4dExlbmd0aDsKLQotCi0JcHVibGljIEdlbmVyaWNUZW1wbGF0ZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgR2VuZXJpY1RlbXBsYXRlUmVnaW9uKGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJdGhpcygpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZlRleHRMZW5ndGggPSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVG9TdHJpbmdVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Nzc4YmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9SZWdpb25Ub1N0cmluZ1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLQotcHVibGljIGNsYXNzIFJlZ2lvblRvU3RyaW5nVXRpbCB7Ci0Jc3RhdGljIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCVN0cmluZyBjbGFzc05hbWUgPSByZWdpb24uZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0JCVN0cmluZyBzaG9ydENsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoY2xhc3NOYW1lLmxhc3RJbmRleE9mKCIuIikgKyAxKTsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgcmVzdWx0ID0gc2hvcnRDbGFzc05hbWUgKyAiLS0+ICIgKyByZWdpb24uZ2V0VHlwZSgpICsgIjogIiArIHJlZ2lvbi5nZXRTdGFydCgpICsgIi0iICsgcmVnaW9uLmdldFRleHRFbmQoKSArIChyZWdpb24uZ2V0VGV4dEVuZCgpICE9IHJlZ2lvbi5nZXRFbmQoKSA/ICgiLyIgKyByZWdpb24uZ2V0RW5kKCkpIDogIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJLy8gTk9URTogaWYgdGhlIGRvY3VtZW50IGhlbGQgYnkgYW55IHJlZ2lvbiBoYXMgYmVlbiB1cGRhdGVkIGFuZCB0aGUKLQkJLy8gcmVnaW9uIG9mZnNldHMgaGF2ZSBub3QKLQkJLy8geWV0IGJlZW4gdXBkYXRlZCwgdGhlIG91dHB1dCBmcm9tIHRoaXMgbWV0aG9kIGludmFsaWQuCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1JlZ2lvblVwZGF0ZVJ1bGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjU4MzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvUmVnaW9uVXBkYXRlUnVsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLQotCi0vKioKLSAqIAotICogVGhpcyBpcyBhIHV0aWxpdHkgY2xhc3MgdG8gY2VudHJhbGl6ZSAncmVnaW9uJyB1cGRhdGUuIE5vdGU6IGNhcmUgbXVzdCBiZQotICogdGFrZW4gdGhhdCBpcyBpcyBub3QgdXNlZCBmb3IgU3RydWN0dXJlZERvY3VtZW50UmVnaW9ucywgb3IgY29udGFpbmVyCi0gKiByZWdpb25zLCBpdHMgb25seSBmb3IgInRva2VuIHJlZ2lvbnMiCi0gKiAgCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWdpb25VcGRhdGVSdWxlIHsKLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBhbGxMZXR0ZXJPckRpZ2l0KFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aCgpOyBpKyspIHsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2hlY2sgdGhhdCBhIEphdmEgTGV0dGVyIG9yIERpZ2l0IGlzCi0JCQkvLyB0aGUgc2FtZSB0aGluZyBhcyBhbiBYTUwgbGV0dGVyIG9yIGRpZ2l0Ci0JCQlpZiAoIShDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGNoYW5nZXMuY2hhckF0KGkpKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBhbGxXaGl0ZVNwYWNlKFN0cmluZyBjaGFuZ2VzKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aCgpOyBpKyspIHsKLQkJCWlmICghQ2hhcmFjdGVyLmlzV2hpdGVzcGFjZShjaGFuZ2VzLmNoYXJBdChpKSkpIHsKLQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc0xldHRlck9yRGlnaXQoSVRleHRSZWdpb24gcmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChyZWdpb24sIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gTWFrZSBzdXJlIHdlIGFyZSBpbiBhIG5vbi13aGl0ZSBzcGFjZSBhcmVhCi0JCWlmICgocmVxdWVzdFN0YXJ0IDw9IChwYXJlbnQuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSkgJiYgKGFsbExldHRlck9yRGlnaXQoY2hhbmdlcykpKSB7Ci0JCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0Jc3RhdGljIHB1YmxpYyBib29sZWFuIGNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChJVGV4dFJlZ2lvbiByZWdpb24sIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCS8vIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gYSBub24td2hpdGUgc3BhY2UgYXJlYQotCQlpZiAoKHJlcXVlc3RTdGFydCA8PSAocmVnaW9uLmdldFRleHRFbmQoKSkpICYmIChhbGxMZXR0ZXJPckRpZ2l0KGNoYW5nZXMpKSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXN0YXRpYyBwdWJsaWMgYm9vbGVhbiBjYW5IYW5kbGVBc1doaXRlU3BhY2UoSVRleHRSZWdpb24gcmVnaW9uLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gd2UgZG9uJ3QgZXhwbGVjdCBhIG51bGwgcGFyZW50LCBidXQganVzdCBpbiBjYXNlIQotCQkvLyAoaW4gd2hpY2ggY2FzZSwgd2UgbXVzdCBiZSBkZWFsaW5nIHdpdGggcmVnaW9ucyB0aGF0IGFyZQotCQkvLyBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25zKS4KLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIGNhbkhhbmRsZUFzV2hpdGVTcGFjZShyZWdpb24sIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgd2UgYXJlIGluIHRoZSAid2hpdGUgc3BhY2UiIGFyZWEgb2YgYSByZWdpb24sIHRoZW4KLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBoYW5kbGUsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCS8vIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24gaXMgY29uc2lkZXIgYW55d2hlcmUgdGhhdCB3b3VsZAotCQkvLyBsZWF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhpcyBjaGFyYWN0ZXIgYW5kIHRoZSB0ZXh0IHBhcnQuCi0JCS8vIGFuZCBvZiBjb3Vyc2UsIHdlIGNhbiBpbnNlcnQgd2hpdGVzcGFjZSBpbiB3aGl0ZXNwYWNlIHJlZ2lvbgotCQkvLwotCQkvLyBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlIGluIHRoaXMgcmVnaW9uLCBubyBuZWVkIHRvIGxvb2sgZnVydGhlcgotCQlpZiAocmVnaW9uLmdldEVuZCgpID4gcmVnaW9uLmdldFRleHRFbmQoKSkgewotCQkJLy8gbm8gbmVlZCB0byBhZGQgb25lIHRvIGVuZCBvZiB0ZXh0LCBhcyB3ZSB1c2VkIHRvLCBzaW5jZSB3ZQotCQkJLy8gY2hhbmdlIGRlZmluaXRpb24gb2YgbGVuZ3RoIHRvIGVxdWF0ZSB0byBvZmZzZXQgcGx1cyBvbmUuCi0JCQlpZiAocmVxdWVzdFN0YXJ0ID4gcGFyZW50LmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSkgewotCQkJCS8vIG9rLCB3ZSBhcmUgaW4gdGhlIHdoaXRlc3BhY2UgcmVnaW9uLCBzbyB3ZSBjYW4ndCBoYW5kbGUsCi0JCQkJLy8gdW5sZXNzCi0JCQkJLy8gd2UgYXJlIGp1c3QgaW5zZXJ0aW5nIHdoaXRlc3BhY2UuCi0JCQkJaWYgKGFsbFdoaXRlU3BhY2UoY2hhbmdlcykpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlzdGF0aWMgcHVibGljIGJvb2xlYW4gY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKElUZXh0UmVnaW9uIHJlZ2lvbiwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJLy8gaWYgd2UgYXJlIGluIHRoZSAid2hpdGUgc3BhY2UiIGFyZWEgb2YgYSByZWdpb24sIHRoZW4KLQkJLy8gd2UgZG9uJ3Qgd2FudCB0byBoYW5kbGUsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCS8vIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24gaXMgY29uc2lkZXIgYW55d2hlcmUgdGhhdCB3b3VsZAotCQkvLyBsZWF2ZSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhpcyBjaGFyYWN0ZXIgYW5kIHRoZSB0ZXh0IHBhcnQuCi0JCS8vIGFuZCBvZiBjb3Vyc2UsIHdlIGNhbiBpbnNlcnQgd2hpdGVzcGFjZSBpbiB3aGl0ZXNwYWNlIHJlZ2lvbgotCQkvLwotCQkvLyBpZiB0aGVyZSBpcyBubyB3aGl0ZXNwYWNlIGluIHRoaXMgcmVnaW9uLCBubyBuZWVkIHRvIGxvb2sgZnVydGhlcgotCQlpZiAocmVnaW9uLmdldEVuZCgpID4gcmVnaW9uLmdldFRleHRFbmQoKSkgewotCQkJLy8gbm8gbmVlZCB0byBhZGQgb25lIHRvIGVuZCBvZiB0ZXh0LCBhcyB3ZSB1c2VkIHRvLCBzaW5jZSB3ZQotCQkJLy8gY2hhbmdlIGRlZmluaXRpb24gb2YgbGVuZ3RoIHRvIGVxdWF0ZSB0byBvZmZzZXQgcGx1cyBvbmUuCi0JCQlpZiAocmVxdWVzdFN0YXJ0ID4gcmVnaW9uLmdldFRleHRFbmQoKSkgewotCQkJCS8vIG9rLCB3ZSBhcmUgaW4gdGhlIHdoaXRlc3BhY2UgcmVnaW9uLCBzbyB3ZSBjYW4ndCBoYW5kbGUsCi0JCQkJLy8gdW5sZXNzCi0JCQkJLy8gd2UgYXJlIGp1c3QgaW5zZXJ0aW5nIHdoaXRlc3BhY2UuCi0JCQkJaWYgKGFsbFdoaXRlU3BhY2UoY2hhbmdlcykpIHsKLQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvLyBuZWVkIGFuIGFkanVzdCB0ZXh0IGxlbmd0aCBBUEkgYmVmb3JlIHRoaXMgY2FuIGJlIHVzZWQKLQlzdGF0aWMgcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZU1vZGVsKElUZXh0UmVnaW9uIHJlZ2lvbiwgT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyByZWdpb24uZ2V0VHlwZSgpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCWJvb2xlYW4gY2FuSGFuZGxlID0gZmFsc2U7Ci0JCS8vIG5vdGU6IHdlJ2xsIGFsd2F5cyBoYW5kbGUgZGVsZXRlcyBmcm9tIHRoZXNlCi0JCS8vIHJlZ2lvbnMgLi4uIGlmIGl0cyBhbHJlYWR5IHRoYXQgcmVnaW9uLAotCQkvLyBkZWxldGluZyBzb21ldGhpbmcgZnJvbSBpdCB3b24ndCBjaGFuZ2UgaXRzCi0JCS8vIHR5cGUuIChyZW1lbWJlciwgdGhlIGNhbGxpbmcgcHJvZ3JhbSBuZWVkcwotCQkvLyB0byBpbnN1cmUgd2UgYXJlIG5vdCBjYWxsZWQsIGlmIG5vdCBhbGwgY29udGFpbmVkCi0JCS8vIG9uIG9uZSByZWdpb24uCi0JCWlmICgoY2hhbmdlcyA9PSBudWxsKSB8fCAoY2hhbmdlcy5sZW5ndGgoKSA9PSAwKSkgewotCQkJLy8gZGVsZXRlIGNhc2UKLQkJCS8vIFdlIGNhbiBub3QgZG8gdGhlIHF1aWNrIGRlbGV0ZSwgaWYKLQkJCS8vIGlmIGFsbCB0aGUgdGV4dCBpbiBhIHJlZ2lvbiBpcyB0byBiZSBkZWxldGVkLgotCQkJLy8gT3IsIGlmIHRoZSBkZWxldGUgc3RhcnRzIGluIHRoZSB3aGl0ZSBzcGFjZSByZWdpb24uCi0JCQkvLyBJbiB0aGVzZSBjYXNlcywgYSByZXBhcnNlIGlzIG5lZWRlZC4KLQkJCS8vIE1pbm9yIG5vdGUsIHdlIHVzZSB0ZXh0RW5kLXN0YXJ0IHNpbmNlIGl0IGFsd2F5cwotCQkJLy8gbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVuZC1zdGFydC4gVGhpcyBtaWdodAotCQkJLy8gY2F1c2UgdXMgdG8gbWlzcyBhIGZldyBjYXNlcyB3ZSBjb3VsZCBoYXZlIGhhbmRsZWQsCi0JCQkvLyBidXQgd2lsbCBwcmV2ZW50IHVzIGZyb20gdHJ5aW5nIHRvIGhhbmRsZSBmdW5uaW5nIGNhc2VzCi0JCQkvLyBpbnZvbHZpbmcgd2hpdGVzcGFjZS4KLQkJCWlmICgocmVnaW9uLmdldFN0YXJ0KCkgPj0gcmVnaW9uLmdldFRleHRFbmQoKSkgfHwgKE1hdGguYWJzKGxlbmd0aFRvUmVwbGFjZSkgPj0gcmVnaW9uLmdldFRleHRFbmQoKSAtIHJlZ2lvbi5nZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZShyZWdpb24sIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdChyZWdpb24sIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0gZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9Ci0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCXJlZ2lvbi5hZGp1c3RMZW5ndGgobGVuZ3RoRGlmZmVyZW5jZSk7Ci0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZShyZWdpb24sIHBhcmVudCwgY2hhbmdlcywgcmVnaW9uLmdldFN0YXJ0KCksIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQkvLwkJCQlyZWdpb24uYWRqdXN0VGV4dExlbmd0aChsZW5ndGhEaWZmZXJlbmNlKTsKLQkJCX0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCByZWdpb24sIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnQ2xvc2VSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnQ2xvc2VSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyZjE2NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ0Nsb3NlUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBUYWdDbG9zZVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIGJ5dGUgZlRleHRMZW5ndGggPSAxOwotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRTsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBUYWdDbG9zZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnQ2xvc2VSZWdpb24oaW50IHN0YXJ0KSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGZvciB0aGlzIHJlZ2lvbiB0eXBlIik7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQkvLyBub3Qgc3VwcG9ydGVkCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBlcXVhdGVQb3NpdGlvbnMoSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCWZTdGFydCA9IHJlZ2lvbi5nZXRTdGFydCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdOYW1lUmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ05hbWVSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGZkNjE4Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1RhZ05hbWVSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFRhZ05hbWVSZWdpb24gaW1wbGVtZW50cyBJVGV4dFJlZ2lvbiB7Ci0Jc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIGZUeXBlID0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUU7Ci0JcHJpdmF0ZSBzaG9ydCBmTGVuZ3RoOwotCXByaXZhdGUgaW50IGZTdGFydDsKLQlwcml2YXRlIHNob3J0IGZUZXh0TGVuZ3RoOwotCi0KLQlwdWJsaWMgVGFnTmFtZVJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnTmFtZVJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gKHNob3J0KSB0ZXh0TGVuZ3RoOwotCQlmTGVuZ3RoID0gKHNob3J0KSBsZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCWZUZXh0TGVuZ3RoICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IChzaG9ydCkgcmVnaW9uLmdldExlbmd0aCgpOwotCQlmVGV4dExlbmd0aCA9IChzaG9ydCkgcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvVGFnT3BlblJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5OTA0ZTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9UYWdPcGVuUmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBUYWdPcGVuUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOOwotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCi0KLQlwdWJsaWMgVGFnT3BlblJlZ2lvbigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgVGFnT3BlblJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gMTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLQkJcmV0dXJuIFJlZ2lvblRvU3RyaW5nVXRpbC50b1N0cmluZyh0aGlzKTsKLQl9Ci0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBjYW4gbmV2ZXIgYmUgdXBkYXRlZAotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvV2hpdGVTcGFjZU9ubHlSZWdpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MGM4YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1doaXRlU3BhY2VPbmx5UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5SZWdpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLlV0aWxpdGllczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBXaGl0ZVNwYWNlT25seVJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBieXRlIGZUZXh0TGVuZ3RoID0gMDsKLQotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0U7Ci0JcHJvdGVjdGVkIGludCBmTGVuZ3RoOwotCXByb3RlY3RlZCBpbnQgZlN0YXJ0OwotCi0JcHVibGljIFdoaXRlU3BhY2VPbmx5UmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQlzdXBlcigpOwotCQlmU3RhcnQgPSBzdGFydDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3QoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJLy8gbm90IHN1cHBvcnRlZAotCi0JfQotCi0JcHVibGljIGJvb2xlYW4gY29udGFpbnMoaW50IHBvc2l0aW9uKSB7Ci0KLQkJcmV0dXJuIGZTdGFydCA8PSBwb3NpdGlvbiAmJiBwb3NpdGlvbiA8IGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCXJldHVybiBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0U3RhcnQoKSB7Ci0JCXJldHVybiBmU3RhcnQ7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZlRleHRMZW5ndGg7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlyZXR1cm4gZlR5cGU7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggPSBpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCA9IGk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGV4dExlbmd0aChzaG9ydCBpKSB7Ci0JCXRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJpbnZhbGlkIGNhbGwiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nIHN0cmluZykgewotCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiaW52YWxpZCBjYWxsIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCS8qKgotCSAqIEZvciB0aGlzIElUZXh0UmVnaW9uIHR5cGUsIHRoZSBzdGFydCBtdXN0IGluIHRlcm1zIG9mIHdoYXQgdGhlIHJlZ2lvbgotCSAqIGV4cGVjdHMgLi4uIHRoYXQgaXMsIGl0cyBub3QgZG9jdW1lbnQgb2Zmc2V0LCBidXQgc3RhcnQgcmVsYXRpdmUgdG8KLQkgKiB3aGF0IGV2ZXIgY29udGFpbnMgaXQuCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY2FuSGFuZGxlID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCi0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ0RhdGFUZXh0UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZmFlYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDRGF0YVRleHRSZWdpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuUmVnaW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5ldmVudHMuU3RydWN0dXJlZERvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5EZWJ1ZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5VdGlsaXRpZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgWE1MQ0RhdGFUZXh0UmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBmVHlwZSA9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX1RFWFQ7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0JcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0KLQotCXB1YmxpYyBYTUxDRGF0YVRleHRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFhNTENEYXRhVGV4dFJlZ2lvbihpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoKSB7Ci0JCXRoaXMoKTsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RMZW5ndGgoaW50IGkpIHsKLQkJZkxlbmd0aCArPSBpOwotCi0JfQotCi0JcHVibGljIHZvaWQgYWRqdXN0U3RhcnQoaW50IGkpIHsKLQkJZlN0YXJ0ICs9IGk7Ci0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFRleHRMZW5ndGgoaW50IGkpIHsKLQkJZlRleHRMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCWZUZXh0TGVuZ3RoID0gcmVnaW9uLmdldFRleHRMZW5ndGgoKTsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCS8vIFRPRE86IHNob3VsZG4ndCBjZGF0YSBiZSBsaWtlIFhNTCBDb250ZW50IC4uLiBsZW5ndGggYW5kIHRleHQKLQkJLy8gbGVuZ3RoCi0JCS8vIGFsd2F5cyBiZSB0aGUgc2FtZSwgcmVnYXJkbGVzcyBvZiB3aGl0ZXNwYWNlPwotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dExlbmd0aCgpIHsKLQkJcmV0dXJuIGZUZXh0TGVuZ3RoOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLQkJcmV0dXJuIGZUeXBlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCXJldHVybiBSZWdpb25Ub1N0cmluZ1V0aWwudG9TdHJpbmcodGhpcyk7Ci0JfQotCi0KLQlwdWJsaWMgU3RydWN0dXJlZERvY3VtZW50RXZlbnQgdXBkYXRlUmVnaW9uKE9iamVjdCByZXF1ZXN0ZXIsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcGFyZW50LCBTdHJpbmcgY2hhbmdlcywgaW50IHJlcXVlc3RTdGFydCwgaW50IGxlbmd0aFRvUmVwbGFjZSkgewotCQkvLyBUT0RPOiB0aGlzIGlzIGEgcHJldHR5IGxhbWUgbWV0aG9kLCBzaW5jZSBYTUwgQ0RhdGEgcmVnaW9uIGNhbiBoYXZlCi0JCS8vIGEgbXVjaAotCQkvLyBiZXR0ZXIgcnVsZSBmb3IgcmVnaW9uIHVwZGF0ZSwgYnV0IHRoaXMgaXMgd2hhdCBwcmV2aW91cwotCQkvLyAodW5mYWN0b3JlZCkKLQkJLy8gdmVyc2lvbiBoYWQsIHNvIEknbGwgY2FycnkgaXQgb3Zlciwgb2Ygbm93LgotCQlSZWdpb25DaGFuZ2VkRXZlbnQgcmVzdWx0ID0gbnVsbDsKLQkJLy8gaWYgdGhlIHJlZ2lvbiBpcyBhbiBlYXN5IHR5cGUgKGUuZy4gYXR0cmlidXRlIHZhbHVlKSwKLQkJLy8gYW5kIHRoZSByZXF1ZXN0ZWQgY2hhbmdlcyBhcmUgYWxsCi0JCS8vIGFscGhhbnVtZXJpYywgdGhlbiBtYWtlIHRoZSBjaGFuZ2UgaGVyZSBsb2NhbGx5LgotCQkvLyAoVGhpcyBjYW4gb2J2aW91c2x5IGJlIG1hZGUgbW9yZSBzb3BoaXN0aWNhdGVkIGFzIHRoZSBuZWVkIGFyaXNlcywKLQkJLy8gYnV0IHNob3VsZAotCQkvLyBhbHdheXMgZm9sbG93IHRoaXMgcGF0dGVybi4pCi0JCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0Q29udGV4dFJlZ2lvbjo6dXBkYXRlTW9kZWwiKTsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJcdFx0XHRyZWdpb24gdHlwZSBpcyAiICsgZlR5cGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJYm9vbGVhbiBjYW5IYW5kbGUgPSBmYWxzZTsKLQkJLy8gbm90ZTogd2UnbGwgYWx3YXlzIGhhbmRsZSBkZWxldGVzIGZyb20gdGhlc2UKLQkJLy8gcmVnaW9ucyAuLi4gaWYgaXRzIGFscmVhZHkgdGhhdCByZWdpb24sCi0JCS8vIGRlbGV0aW5nIHNvbWV0aGluZyBmcm9tIGl0IHdvbid0IGNoYW5nZSBpdHMKLQkJLy8gdHlwZS4gKHJlbWVtYmVyLCB0aGUgY2FsbGluZyBwcm9ncmFtIG5lZWRzCi0JCS8vIHRvIGluc3VyZSB3ZSBhcmUgbm90IGNhbGxlZCwgaWYgbm90IGFsbCBjb250YWluZWQKLQkJLy8gb24gb25lIHJlZ2lvbi4KLQkJaWYgKChjaGFuZ2VzID09IG51bGwpIHx8IChjaGFuZ2VzLmxlbmd0aCgpID09IDApKSB7Ci0JCQkvLyBkZWxldGUgY2FzZQotCQkJLy8gV2UgY2FuIG5vdCBkbyB0aGUgcXVpY2sgZGVsZXRlLCBpZgotCQkJLy8gaWYgYWxsIHRoZSB0ZXh0IGluIGEgcmVnaW9uIGlzIHRvIGJlIGRlbGV0ZWQuCi0JCQkvLyBPciwgaWYgdGhlIGRlbGV0ZSBzdGFydHMgaW4gdGhlIHdoaXRlIHNwYWNlIHJlZ2lvbi4KLQkJCS8vIEluIHRoZXNlIGNhc2VzLCBhIHJlcGFyc2UgaXMgbmVlZGVkLgotCQkJLy8gTWlub3Igbm90ZSwgd2UgdXNlIHRleHRFbmQtc3RhcnQgc2luY2UgaXQgYWx3YXlzCi0JCQkvLyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gZW5kLXN0YXJ0LiBUaGlzIG1pZ2h0Ci0JCQkvLyBjYXVzZSB1cyB0byBtaXNzIGEgZmV3IGNhc2VzIHdlIGNvdWxkIGhhdmUgaGFuZGxlZCwKLQkJCS8vIGJ1dCB3aWxsIHByZXZlbnQgdXMgZnJvbSB0cnlpbmcgdG8gaGFuZGxlIGZ1bm5pbmcgY2FzZXMKLQkJCS8vIGludm9sdmluZyB3aGl0ZXNwYWNlLgotCQkJaWYgKChmU3RhcnQgPj0gZ2V0VGV4dEVuZCgpKSB8fCAoTWF0aC5hYnMobGVuZ3RoVG9SZXBsYWNlKSA+PSBnZXRUZXh0RW5kKCkgLSBnZXRTdGFydCgpKSkgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgfHwgUmVnaW9uVXBkYXRlUnVsZS5jYW5IYW5kbGVBc0xldHRlck9yRGlnaXQodGhpcywgcGFyZW50LCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCQljYW5IYW5kbGUgPSB0cnVlOwotCQkJfSBlbHNlIHsKLQkJCQljYW5IYW5kbGUgPSBmYWxzZTsKLQkJCX0KLQotCQl9Ci0JCWlmIChjYW5IYW5kbGUpIHsKLQkJCS8vIGF0IHRoaXMgcG9pbnQsIHdlIHN0aWxsIGhhdmUgdGhlIG9sZCByZWdpb24uIFdlIHdvbid0IGNyZWF0ZSBhCi0JCQkvLyBuZXcgaW5zdGFuY2UsIHdlJ2xsIGp1c3QgdXBkYXRlIHRoZSBvbmUgd2UgaGF2ZSwgYnkgY2hhbmdpbmcKLQkJCS8vIGl0cyBlbmQgcG9zdGlvbiwKLQkJCS8vIFRoZSBwYXJlbnQgZmxhdG5vZGUsIHVwb24gcmV0dXJuLCBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvciB1cGRhdGluZyBzaWJsaW5nIHJlZ2lvbnMuCi0JCQkvLyBhbmQgaW4gdHVybiwgdGhlIHN0cnVjdHVyZWREb2N1bWVudCBpdHNlbGYgaGFzIHJlc3BvbnNpYmlsaXR5Ci0JCQkvLyBmb3IKLQkJCS8vIHVwZGF0aW5nIHRoZSB0ZXh0IHN0b3JlIGFuZCBkb3duIHN0cmVhbSBmbGF0bm9kZXMuCi0JCQlpZiAoRGVidWcuZGVidWdTdHJ1Y3R1cmVkRG9jdW1lbnQpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oImNoYW5nZSBoYW5kbGVkIGJ5IHJlZ2lvbiIpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlpbnQgbGVuZ3RoRGlmZmVyZW5jZSA9IFV0aWxpdGllcy5jYWxjdWxhdGVMZW5ndGhEaWZmZXJlbmNlKGNoYW5nZXMsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCQkvLyBOb3RlOiB3ZSBhZGp1c3QgYm90aCBlbmQgYW5kIHRleHQgZW5kLCBiZWNhdXNlIGZvciBhbnkgY2hhbmdlCi0JCQkvLyB0aGF0IGlzIGluIG9ubHkgdGhlIHRyYWlsaW5nIHdoaXRlc3BhY2UgcmVnaW9uLCB3ZSBzaG91bGQgbm90Ci0JCQkvLyBkbyBhIHF1aWNrIGNoYW5nZSwKLQkJCS8vIHNvICdjYW5IYW5kbGUnIHNob3VsZCBoYXZlIGJlZW4gZmFsc2UgZm9yIHRob3NlIGNhc2UuCi0JCQkvLyBUT19ET19GVVRVUkU6IGNhY2hlIHZhbHVlIG9mIGNhbkhhbmRsZUFzV2hpdGVTcGFjZSBmcm9tIGFib3ZlCi0JCQkvLyBJZiB3ZSBhcmUgaGFuZGxpbmcgYXMgd2hpdGVzcGFjZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBpbmNyZWFzZQotCQkJLy8gdGhlIHRleHQgbGVuZ3RoLCBvbmx5Ci0JCQkvLyB0aGUgdG90YWwgbGVuZ3RoIGlzIGNoYW5naW5nLgotCQkJaWYgKCFSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzV2hpdGVTcGFjZSh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQl9Ci0JCQlmTGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQlyZXN1bHQgPSBuZXcgUmVnaW9uQ2hhbmdlZEV2ZW50KHBhcmVudC5nZXRQYXJlbnREb2N1bWVudCgpLCByZXF1ZXN0ZXIsIHBhcmVudCwgdGhpcywgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MQ29udGVudFJlZ2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDb250ZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjY2I1NzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxDb250ZW50UmVnaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucGFyc2VyLnJlZ2lvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlJlZ2lvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZXZlbnRzLlN0cnVjdHVyZWREb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuVXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudFJlZ2lvbiBpbXBsZW1lbnRzIElUZXh0UmVnaW9uIHsKLQlzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UOwotCS8vIGxlbmd0aCBhbmQgdGV4dExlbmd0aCBhcmUgYWx3YXlzIHRoZSBzYW1lIGZvciBjb250ZW50IHJlZ2lvbgotCS8vcHJpdmF0ZSBpbnQgZlRleHRMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZkxlbmd0aDsKLQlwcml2YXRlIGludCBmU3RhcnQ7Ci0KLQotCXB1YmxpYyBYTUxDb250ZW50UmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxDb250ZW50UmVnaW9uKGludCBzdGFydCwgaW50IGxlbmd0aCkgewotCQl0aGlzKCk7Ci0JCWZTdGFydCA9IHN0YXJ0OwotCQlmTGVuZ3RoID0gbGVuZ3RoOwotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0TGVuZ3RoKGludCBpKSB7Ci0JCWZMZW5ndGggKz0gaTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdFN0YXJ0KGludCBpKSB7Ci0JCWZTdGFydCArPSBpOwotCi0JfQotCi0KLQlwdWJsaWMgdm9pZCBhZGp1c3RUZXh0TGVuZ3RoKGludCBpKSB7Ci0JCS8vIG5vdCBzdXBwb3J0ZWQKLQotCX0KLQotCXB1YmxpYyB2b2lkIGVxdWF0ZVBvc2l0aW9ucyhJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJZlN0YXJ0ID0gcmVnaW9uLmdldFN0YXJ0KCk7Ci0JCWZMZW5ndGggPSByZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JfQotCi0JcHVibGljIGludCBnZXRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmTGVuZ3RoOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0KCkgewotCQlyZXR1cm4gZlN0YXJ0OwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0VGV4dEVuZCgpIHsKLQkJcmV0dXJuIGZTdGFydCArIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRUZXh0TGVuZ3RoKCkgewotCQlyZXR1cm4gZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCi0JcHVibGljIFN0cnVjdHVyZWREb2N1bWVudEV2ZW50IHVwZGF0ZVJlZ2lvbihPYmplY3QgcmVxdWVzdGVyLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgU3RyaW5nIGNoYW5nZXMsIGludCByZXF1ZXN0U3RhcnQsIGludCBsZW5ndGhUb1JlcGxhY2UpIHsKLQkJLy8gVE9ETzogdGhpcyBpcyBhIHByZXR0eSBsYW1lIG1ldGhvZCwgc2luY2UgWE1MIENvbnRlbnQgY2FuIGhhdmUgYQotCQkvLyBtdWNoCi0JCS8vIGJldHRlciBydWxlIGZvciByZWdpb24gdXBkYXRlLCBidXQgdGhpcyBpcyB3aGF0IHByZXZpb3VzCi0JCS8vICh1bmZhY3RvcmVkKQotCQkvLyB2ZXJzaW9uIGhhZCwgc28gSSdsbCBjYXJyeSBpdCBvdmVyLCBvZiBub3cuCi0JCVJlZ2lvbkNoYW5nZWRFdmVudCByZXN1bHQgPSBudWxsOwotCQkvLyBpZiB0aGUgcmVnaW9uIGlzIGFuIGVhc3kgdHlwZSAoZS5nLiBhdHRyaWJ1dGUgdmFsdWUpLAotCQkvLyBhbmQgdGhlIHJlcXVlc3RlZCBjaGFuZ2VzIGFyZSBhbGwKLQkJLy8gYWxwaGFudW1lcmljLCB0aGVuIG1ha2UgdGhlIGNoYW5nZSBoZXJlIGxvY2FsbHkuCi0JCS8vIChUaGlzIGNhbiBvYnZpb3VzbHkgYmUgbWFkZSBtb3JlIHNvcGhpc3RpY2F0ZWQgYXMgdGhlIG5lZWQgYXJpc2VzLAotCQkvLyBidXQgc2hvdWxkCi0JCS8vIGFsd2F5cyBmb2xsb3cgdGhpcyBwYXR0ZXJuLikKLQkJaWYgKERlYnVnLmRlYnVnU3RydWN0dXJlZERvY3VtZW50KSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRDb250ZXh0UmVnaW9uOjp1cGRhdGVNb2RlbCIpOyAvLyROT04tTkxTLTEkCi0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlx0XHRcdHJlZ2lvbiB0eXBlIGlzICIgKyBmVHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlib29sZWFuIGNhbkhhbmRsZSA9IGZhbHNlOwotCQkvLyBub3RlOiB3ZSdsbCBhbHdheXMgaGFuZGxlIGRlbGV0ZXMgZnJvbSB0aGVzZQotCQkvLyByZWdpb25zIC4uLiBpZiBpdHMgYWxyZWFkeSB0aGF0IHJlZ2lvbiwKLQkJLy8gZGVsZXRpbmcgc29tZXRoaW5nIGZyb20gaXQgd29uJ3QgY2hhbmdlIGl0cwotCQkvLyB0eXBlLiAocmVtZW1iZXIsIHRoZSBjYWxsaW5nIHByb2dyYW0gbmVlZHMKLQkJLy8gdG8gaW5zdXJlIHdlIGFyZSBub3QgY2FsbGVkLCBpZiBub3QgYWxsIGNvbnRhaW5lZAotCQkvLyBvbiBvbmUgcmVnaW9uLgotCQlpZiAoKGNoYW5nZXMgPT0gbnVsbCkgfHwgKGNoYW5nZXMubGVuZ3RoKCkgPT0gMCkpIHsKLQkJCS8vIGRlbGV0ZSBjYXNlCi0JCQkvLyBXZSBjYW4gbm90IGRvIHRoZSBxdWljayBkZWxldGUsIGlmCi0JCQkvLyBpZiBhbGwgdGhlIHRleHQgaW4gYSByZWdpb24gaXMgdG8gYmUgZGVsZXRlZC4KLQkJCS8vIE9yLCBpZiB0aGUgZGVsZXRlIHN0YXJ0cyBpbiB0aGUgd2hpdGUgc3BhY2UgcmVnaW9uLgotCQkJLy8gSW4gdGhlc2UgY2FzZXMsIGEgcmVwYXJzZSBpcyBuZWVkZWQuCi0JCQkvLyBNaW5vciBub3RlLCB3ZSB1c2UgdGV4dEVuZC1zdGFydCBzaW5jZSBpdCBhbHdheXMKLQkJCS8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byBlbmQtc3RhcnQuIFRoaXMgbWlnaHQKLQkJCS8vIGNhdXNlIHVzIHRvIG1pc3MgYSBmZXcgY2FzZXMgd2UgY291bGQgaGF2ZSBoYW5kbGVkLAotCQkJLy8gYnV0IHdpbGwgcHJldmVudCB1cyBmcm9tIHRyeWluZyB0byBoYW5kbGUgZnVubmluZyBjYXNlcwotCQkJLy8gaW52b2x2aW5nIHdoaXRlc3BhY2UuCi0JCQlpZiAoKGZTdGFydCA+PSBnZXRUZXh0RW5kKCkpIHx8IChNYXRoLmFicyhsZW5ndGhUb1JlcGxhY2UpID49IGdldFRleHRFbmQoKSAtIGdldFN0YXJ0KCkpKSB7Ci0JCQkJY2FuSGFuZGxlID0gZmFsc2U7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQlpZiAoKFJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIHBhcmVudCwgY2hhbmdlcywgcmVxdWVzdFN0YXJ0LCBsZW5ndGhUb1JlcGxhY2UpKSB8fCBSZWdpb25VcGRhdGVSdWxlLmNhbkhhbmRsZUFzTGV0dGVyT3JEaWdpdCh0aGlzLCBwYXJlbnQsIGNoYW5nZXMsIHJlcXVlc3RTdGFydCwgbGVuZ3RoVG9SZXBsYWNlKSkgewotCQkJCWNhbkhhbmRsZSA9IHRydWU7Ci0JCQl9IGVsc2UgewotCQkJCWNhbkhhbmRsZSA9IGZhbHNlOwotCQkJfQotCi0JCX0KLQkJaWYgKGNhbkhhbmRsZSkgewotCQkJLy8gYXQgdGhpcyBwb2ludCwgd2Ugc3RpbGwgaGF2ZSB0aGUgb2xkIHJlZ2lvbi4gV2Ugd29uJ3QgY3JlYXRlIGEKLQkJCS8vIG5ldyBpbnN0YW5jZSwgd2UnbGwganVzdCB1cGRhdGUgdGhlIG9uZSB3ZSBoYXZlLCBieSBjaGFuZ2luZwotCQkJLy8gaXRzIGVuZCBwb3N0aW9uLAotCQkJLy8gVGhlIHBhcmVudCBmbGF0bm9kZSwgdXBvbiByZXR1cm4sIGhhcyByZXNwb25zaWJpbGl0eQotCQkJLy8gZm9yIHVwZGF0aW5nIHNpYmxpbmcgcmVnaW9ucy4KLQkJCS8vIGFuZCBpbiB0dXJuLCB0aGUgc3RydWN0dXJlZERvY3VtZW50IGl0c2VsZiBoYXMgcmVzcG9uc2liaWxpdHkKLQkJCS8vIGZvcgotCQkJLy8gdXBkYXRpbmcgdGhlIHRleHQgc3RvcmUgYW5kIGRvd24gc3RyZWFtIGZsYXRub2Rlcy4KLQkJCWlmIChEZWJ1Zy5kZWJ1Z1N0cnVjdHVyZWREb2N1bWVudCkgewotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiY2hhbmdlIGhhbmRsZWQgYnkgcmVnaW9uIik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWludCBsZW5ndGhEaWZmZXJlbmNlID0gVXRpbGl0aWVzLmNhbGN1bGF0ZUxlbmd0aERpZmZlcmVuY2UoY2hhbmdlcywgbGVuZ3RoVG9SZXBsYWNlKTsKLQkJCS8vIE5vdGU6IHdlIGFkanVzdCBib3RoIGVuZCBhbmQgdGV4dCBlbmQsIGJlY2F1c2UgZm9yIGFueSBjaGFuZ2UKLQkJCS8vIHRoYXQgaXMgaW4gb25seSB0aGUgdHJhaWxpbmcgd2hpdGVzcGFjZSByZWdpb24sIHdlIHNob3VsZCBub3QKLQkJCS8vIGRvIGEgcXVpY2sgY2hhbmdlLAotCQkJLy8gc28gJ2NhbkhhbmRsZScgc2hvdWxkIGhhdmUgYmVlbiBmYWxzZSBmb3IgdGhvc2UgY2FzZS4KLQkJCWZMZW5ndGggKz0gbGVuZ3RoRGlmZmVyZW5jZTsKLQkJCS8vIFRPX0RPX0ZVVFVSRTogY2FjaGUgdmFsdWUgb2YgY2FuSGFuZGxlQXNXaGl0ZVNwYWNlIGZyb20gYWJvdmUKLQkJCS8vIElmIHdlIGFyZSBoYW5kbGluZyBhcyB3aGl0ZXNwYWNlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGluY3JlYXNlCi0JCQkvLyB0aGUgdGV4dCBsZW5ndGgsIG9ubHkKLQkJCS8vIHRoZSB0b3RhbCBsZW5ndGggaXMgY2hhbmdpbmcuCi0JCQkvLyBkb24ndCBuZWVkIGZvciBjb250ZW50IHJlZ2lvbgotCQkJLy8JCQlpZiAoIVJlZ2lvblVwZGF0ZVJ1bGUuY2FuSGFuZGxlQXNXaGl0ZVNwYWNlKHRoaXMsIGNoYW5nZXMsCi0JCQkvLyBmU3RhcnQsIGxlbmd0aFRvUmVwbGFjZSkpIHsKLQkJCS8vCQkJCWZUZXh0TGVuZ3RoICs9IGxlbmd0aERpZmZlcmVuY2U7Ci0JCQkvLwkJCX0KLQkJCXJlc3VsdCA9IG5ldyBSZWdpb25DaGFuZ2VkRXZlbnQocGFyZW50LmdldFBhcmVudERvY3VtZW50KCksIHJlcXVlc3RlciwgcGFyZW50LCB0aGlzLCBjaGFuZ2VzLCByZXF1ZXN0U3RhcnQsIGxlbmd0aFRvUmVwbGFjZSk7Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxIZWFkUGFyc2VyRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2E5OTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlckZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci0KLXB1YmxpYyBjbGFzcyBYTUxIZWFkUGFyc2VyRmFjdG9yeSB7Ci0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBudWxsOwotCQkvLwkJaWYgKGNvbnRleHQgPT0gWE1MUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQluZXdSZWdpb24gPSBuZXcgWE1MSGVhZFBhcnNlclJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCB0ZXh0KTsKLQkJLy8JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTEhlYWRQYXJzZXJSZWdpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmNlZWFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcGFyc2VyL3JlZ2lvbnMvWE1MSGVhZFBhcnNlclJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmV2ZW50cy5TdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci0KLQotLyoqCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgbm90IGludGVuZGVkIHRvIGJlIHVzZWQsIGl0cyBqdXN0IHByZXNlbnQgdG8gc2VydmVyIGFzIGEKLSAqIGdlbmVyaWMgc3RhcnRpbmcgcG9pbnQgZm9yIGFkZGluZyBuZXcgc3BlY2lmaWMgcmVnaW9uIHR5cGVzLgotICovCi0KLXB1YmxpYyBjbGFzcyBYTUxIZWFkUGFyc2VyUmVnaW9uIGltcGxlbWVudHMgSVRleHRSZWdpb24gewotCXByaXZhdGUgaW50IGZMZW5ndGg7Ci0JcHJpdmF0ZSBpbnQgZlN0YXJ0OwotCXByaXZhdGUgU3RyaW5nIGZUZXh0OwotCXByaXZhdGUgaW50IGZUZXh0TGVuZ3RoOwotCS8vIHNwZWNpZnkgY29ycmVjdCB0eXBlCi0JcHJpdmF0ZSBTdHJpbmcgZlR5cGUgPSBET01SZWdpb25Db250ZXh0LlVOREVGSU5FRDsKLQotCXB1YmxpYyBYTUxIZWFkUGFyc2VyUmVnaW9uKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBYTUxIZWFkUGFyc2VyUmVnaW9uKFN0cmluZyBjb250ZXh0LCBpbnQgc3RhcnQsIGludCB0ZXh0TGVuZ3RoLCBpbnQgbGVuZ3RoLCBTdHJpbmcgdGV4dCkgewotCQl0aGlzKCk7Ci0JCWZUeXBlID0gY29udGV4dDsKLQkJZlN0YXJ0ID0gc3RhcnQ7Ci0JCWZUZXh0TGVuZ3RoID0gdGV4dExlbmd0aDsKLQkJZkxlbmd0aCA9IGxlbmd0aDsKLQkJZlRleHQgPSB0ZXh0OwotCX0KLQotCXB1YmxpYyB2b2lkIGFkanVzdExlbmd0aChpbnQgaSkgewotCQlmTGVuZ3RoICs9IGk7Ci0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGp1c3RTdGFydChpbnQgaSkgewotCQlmU3RhcnQgKz0gaTsKLQotCX0KLQotCi0JcHVibGljIHZvaWQgYWRqdXN0VGV4dExlbmd0aChpbnQgaSkgewotCQlmVGV4dExlbmd0aCArPSAxOwotCi0JfQotCi0JcHVibGljIHZvaWQgZXF1YXRlUG9zaXRpb25zKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlmU3RhcnQgPSByZWdpb24uZ2V0U3RhcnQoKTsKLQkJZkxlbmd0aCA9IHJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJZlRleHRMZW5ndGggPSByZWdpb24uZ2V0VGV4dExlbmd0aCgpOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0RW5kKCkgewotCQlyZXR1cm4gZlN0YXJ0ICsgZkxlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKLQkJcmV0dXJuIGZMZW5ndGg7Ci0JfQotCi0JcHVibGljIGludCBnZXRTdGFydCgpIHsKLQkJcmV0dXJuIGZTdGFydDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7Ci0JCXJldHVybiBmVGV4dDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRFbmQoKSB7Ci0JCXJldHVybiBmU3RhcnQgKyBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFRleHRMZW5ndGgoKSB7Ci0JCXJldHVybiBmVGV4dExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGUoKSB7Ci0JCXJldHVybiBmVHlwZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gUmVnaW9uVG9TdHJpbmdVdGlsLnRvU3RyaW5nKHRoaXMpOwotCX0KLQotCXB1YmxpYyBTdHJ1Y3R1cmVkRG9jdW1lbnRFdmVudCB1cGRhdGVSZWdpb24oT2JqZWN0IHJlcXVlc3RlciwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBwYXJlbnQsIFN0cmluZyBjaGFuZ2VzLCBpbnQgcmVxdWVzdFN0YXJ0LCBpbnQgbGVuZ3RoVG9SZXBsYWNlKSB7Ci0JCS8vIGNhbiBuZXZlciBiZSB1cGRhdGVkCi0JCXJldHVybiBudWxsOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wYXJzZXIvcmVnaW9ucy9YTUxQYXJzZXJSZWdpb25GYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTgzZDY0Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3BhcnNlci9yZWdpb25zL1hNTFBhcnNlclJlZ2lvbkZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5yZWdpb25zOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wYXJzZXIuQ29udGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIAotICogVGhpcyByZWdpb24gZmFjdG9yeSBpcyB2ZXJ5IHNwZWNpZmljIHRvIHRoZSBwYXJzZXIgb3V0cHV0LCBhbmQgdGhlIHNwZWNpZmljCi0gKiBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGZvciB2YXJpb3VzIHJlZ2lvbnMuCi0gKi8KLQotcHVibGljIGNsYXNzIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkgewotCi0JcHVibGljIFhNTFBhcnNlclJlZ2lvbkZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElUZXh0UmVnaW9uIGNyZWF0ZVRva2VuKElUZXh0UmVnaW9uQ29udGFpbmVyIHBhcmVudCwgU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgpIHsKLQkJcmV0dXJuIHRoaXMuY3JlYXRlVG9rZW4ocGFyZW50LCBjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oSVRleHRSZWdpb25Db250YWluZXIgcGFyZW50LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCwgU3RyaW5nIGxhbmcsIFN0cmluZyBzdXJyb3VuZGluZ1RhZykgewotCQlJVGV4dFJlZ2lvbiBuZXdSZWdpb24gPSBjcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJLy8gRFcsIDQvMTYvMjAwMyB0b2tlbiByZWdpb25zIG5vIGxvbmdlciBoYXZlIHBhcmVudHMKLQkJLy8gbmV3UmVnaW9uLnNldFBhcmVudChwYXJlbnQpOwotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBjcmVhdGVUb2tlbihTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0LCBpbnQgdGV4dExlbmd0aCwgaW50IGxlbmd0aCkgewotCQlyZXR1cm4gdGhpcy5jcmVhdGVUb2tlbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoLCBudWxsLCBudWxsKTsKLQl9Ci0KLQlwdWJsaWMgSVRleHRSZWdpb24gY3JlYXRlVG9rZW4oU3RyaW5nIGNvbnRleHQsIGludCBzdGFydCwgaW50IHRleHRMZW5ndGgsIGludCBsZW5ndGgsIFN0cmluZyBsYW5nLCBTdHJpbmcgc3Vycm91bmRpbmdUYWcpIHsKLQkJSVRleHRSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQkJbmV3UmVnaW9uID0gbmV3IFhNTENEYXRhVGV4dFJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBYTUxDb250ZW50UmVnaW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBUYWdOYW1lUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQXR0cmlidXRlTmFtZVJlZ2lvbihzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQllbHNlIGlmIChjb250ZXh0ID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQXR0cmlidXRlRXF1YWxzUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IEF0dHJpYnV0ZVZhbHVlUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCW5ld1JlZ2lvbiA9IG5ldyBUYWdPcGVuUmVnaW9uKHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgVGFnQ2xvc2VSZWdpb24oc3RhcnQpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5XSElURV9TUEFDRSkgewotCQkJbmV3UmVnaW9uID0gbmV3IFdoaXRlU3BhY2VPbmx5UmVnaW9uKHN0YXJ0LCBsZW5ndGgpOwotCQl9Ci0JCWVsc2UKLQkJLy8gcmVtb3ZlZCB0aGlzIGNvbmRpdGlvbiBkdXJpbmcgdHJhbnNpdGlvbiwgYW5kIGltcGxlbWVudGVkIGluCi0JCS8vIHN1YmNsYXNzCi0JCS8vIGlmIChjb250ZXh0ID09IFhNTEpTUFJlZ2lvbkNvbnRleHRzLkpTUF9DT05URU5UKSB7Ci0JCS8vIG5ld1JlZ2lvbiA9IG5ldyBKU1BDb2RlUmVnaW9uKGNvbnRleHQsIHN0YXJ0LCB0ZXh0TGVuZ3RoLCBsZW5ndGgpOwotCQkvLyB9IGVsc2UKLQkJaWYgKGNvbnRleHQgPT0gRE9NUmVnaW9uQ29udGV4dC5CTE9DS19URVhUKSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgRm9yZWlnblJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJCSgoRm9yZWlnblJlZ2lvbikgbmV3UmVnaW9uKS5zZXRTdXJyb3VuZGluZ1RhZyhzdXJyb3VuZGluZ1RhZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQluZXdSZWdpb24gPSBuZXcgQ29udGV4dFJlZ2lvbihjb250ZXh0LCBzdGFydCwgdGV4dExlbmd0aCwgbGVuZ3RoKTsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmU4ODFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuQWJzdHJhY3RQcmVmZXJlbmNlSW5pdGlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkRlZmF1bHRTY29wZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZmVyZW5jZXMuSUVjbGlwc2VQcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgWE1MIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFhNTENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0KLQkJLy8gZm9ybWF0dGluZyBwcmVmZXJlbmNlcwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIDcyKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmYWxzZSk7Ci0JCW5vZGUucHV0KFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQlub2RlLnB1dEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUsIDEpOwotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUywgZmFsc2UpOwotCi0JCS8vIGNsZWFudXAgcHJlZmVyZW5jZXMKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09NUFJFU1NfRU1QVFlfRUxFTUVOVF9UQUdTLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX1JFUVVJUkVEX0FUVFJTLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlFVT1RFX0FUVFJfVkFMVUVTLCB0cnVlKTsKLQkJbm9kZS5wdXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSwgdHJ1ZSk7Ci0JCW5vZGUucHV0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTlZFUlRfRU9MX0NPREVTLCBmYWxzZSk7Ci0KLQkJbm9kZS5wdXQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuSU5QVVRfQ09ERVNFVCwgIiIpOyAvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VULCAiVVRGLTgiKTsvLyROT04tTkxTLTEkCi0JCW5vZGUucHV0KENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUsICIiKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIHRoaXMgY291bGQgYmUgbWFkZSBzbWFydGVyIGJ5IGFjdHVhbGx5IGxvb2tpbmcgdXAgdGhlIGNvbnRlbnQKLQkJLy8gdHlwZSdzIHZhbGlkIGV4dGVuc2lvbnMKLQkJbm9kZS5wdXQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTiwgInhtbCIpOyAvLyROT04tTkxTLTEkCi0JCQotCQlub2RlLnB1dEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5XQVJOX05PX0dSQU1NQVIsIGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWMzNzllLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLS8qKgotICogQ29tbW9uIHByZWZlcmVuY2Uga2V5cyB1c2VkIGJ5IFhNTCBjb3JlCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29yZVByZWZlcmVuY2VOYW1lcyB7Ci0JcHJpdmF0ZSBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzKCkgewotCQkvLyBlbXB0eSBwcml2YXRlIGNvbnN0cnVjdG9yIHNvIHVzZXJzIGNhbm5vdCBpbnN0YW50aWF0ZSBjbGFzcwotCX0KLQotCS8qKgotCSAqIFRoZSBkZWZhdWx0IGV4dGVuc2lvbiB0byB1c2Ugd2hlbiBub25lIGlzIHNwZWNpZmllZCBpbiB0aGUgTmV3IEZpbGUKLQkgKiBXaXphcmQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0VYVEVOU0lPTiA9ICJkZWZhdWx0RXh0ZW5zaW9uIjsgLy8kTk9OLU5MUy0xJAotCi0KLQkvKioKLQkgKiBUaGUgbWF4aW11bSB3aWR0aCBvZiBhIGxpbmUgYmVmb3JlIGEgbGluZSBzcGxpdCBpcyBuZWVkZWQuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTElORV9XSURUSCA9ICJsaW5lV2lkdGgiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyBpZiBhbGwgYmxhbmtzIGxpbmVzIHNob3VsZCBiZSBjbGVhcmVkIGR1cmluZyBmb3JtYXR0aW5nLgotCSAqIEJsYW5rIGxpbmVzIHdpbGwgYmUga2VwdCB3aGVuIGZhbHNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMRUFSX0FMTF9CTEFOS19MSU5FUyA9ICJjbGVhckFsbEJsYW5rTGluZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBudW1iZXIgb2YgI0lOREVOVEFUSU9OX0NIQVIgZm9yIDEgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5JbnRlZ2VyPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UQVRJT05fU0laRSA9ICJpbmRlbnRhdGlvblNpemUiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIFRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgaW5kZW50YXRpb24uCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RBQiwgU1BBQ0V9Ci0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOREVOVEFUSU9OX0NIQVIgPSAiaW5kZW50YXRpb25DaGFyIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBQb3NzaWJsZSB2YWx1ZSBmb3IgdGhlIHByZWZlcmVuY2UgI0lOREVOVEFUSU9OX0NIQVIuIEluZGljYXRlcyB0byB1c2UKLQkgKiB0YWIgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNTUEFDRQotCSAqIEBzZWUgI0lOREVOVEFUSU9OX0NIQVIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUIgPSAidGFiIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUG9zc2libGUgdmFsdWUgZm9yIHRoZSBwcmVmZXJlbmNlICNJTkRFTlRBVElPTl9DSEFSLiBJbmRpY2F0ZXMgdG8gdXNlCi0JICogc3BhY2UgY2hhcmFjdGVyIHdoZW4gZm9ybWF0dGluZy4KLQkgKiAKLQkgKiBAc2VlICNUQUIKLQkgKiBAc2VlICNJTkRFTlRBVElPTl9DSEFSCi0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAic3BhY2UiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgaWYgdGFncyB3aXRoIG11bHRpcGxlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGZvcm1hdHRlZAotCSAqIChzcGxpdHRpbmcgZWFjaCBhdHRyIG9uIGEgbmV3IGxpbmUpLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQTElUX01VTFRJX0FUVFJTID0gInNwbGl0TXVsdGlBdHRycyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGNsZWFudXAgcHJvY2Vzc29yIHNob3VsZCBmb3JtYXQgc291cmNlLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgZW1wdHkgZWxlbWVudHMgc2hvdWxkIGJlIGNvbXByZXNzZWQgZHVyaW5nCi0JICogY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QUkVTU19FTVBUWV9FTEVNRU5UX1RBR1MgPSAiY29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdG8gaW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZXMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5TRVJUX1JFUVVJUkVEX0FUVFJTID0gImluc2VydFJlcXVpcmVkQXR0cnMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBpbnNlcnQgbWlzc2luZyB0YWdzIGR1cmluZyBjbGVhbnVwLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Qm9vbGVhbjwvY29kZT4uCi0JICogPC9wPgotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBxdW90ZSBhbGwgYXR0cmlidXRlIHZhbHVlcyBkdXJpbmcgY2xlYW51cC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVU9URV9BVFRSX1ZBTFVFUyA9ICJxdW90ZUF0dHJWYWx1ZXMiOy8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCB0byBjb252ZXJ0IGFsbCBsaW5lIGRlbGltaXRlcnMgZHVyaW5nIGNsZWFudXAuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5Cb29sZWFuPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBJbmRpY2F0ZXMgdGhlIGxpbmUgZGVsaW1pdGVyIHRvIHVzZSBkdXJpbmcgY2xlYW51cCBpZiBjb252ZXJ0aW5nIGxpbmUKLQkgKiBkZWxpbWl0ZXJzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi48YnIgLz4KLQkgKiBQb3NzaWJsZSB2YWx1ZXM6IHtDUiwgQ1JMRiwgTEYsIE5PX1RSQU5TTEFUSU9OfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0JCi0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGEgd2FybmluZyBzaG91bGQgYmUgcHJvZHVjZWQgd2hlbiB2YWxpZGF0aW5nIGEKLQkgKiBmaWxlIHRoYXQgc3BlY2lmaWVzIG5vdCBncmFtbWFyLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+Ym9vbGVhbjwvY29kZT4uPGJyIC8+Ci0JICogUG9zc2libGUgdmFsdWVzOiB7VFJVRSwgRkFMU0V9Ci0JICogPC9wPgotCSAqIAotCSAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdBUk5fTk9fR1JBTU1BUiA9ICJ3YXJuTm9HcmFtbWFyIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm9wYWdhdGUvUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeUltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyZDYwZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3BhZ2F0ZTsKLQotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5Qcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci0KLQotLyoqCi0gKiBUaGUgUHJvcGFnYXRpbmdBZGFwdGVyRmFjdG9yeSBpcyBwYXJ0IG9mIHRoZSAiYWRhcHQgb24gY3JlYXRlIiBtZWNoYW5pc20uIEEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciwgb25jZSBhZGRlZCB0byBhIG5vZGUsIHdpbGwgY2F1c2UgcHJvYWdhdGluZyBhZGFwdGVycyB0bwotICogYmUgY3JlYXRlZCBmb3IgYWxsIGNoaWxkIG5vZGVzLiBBIHNpZGUgZWZmZWN0IG9mIGNyZWF0aW5nIGEKLSAqIFByb3BhZ2F0aW5nQWRhcHRlciBmb3IgYSBub2RlIGlzIHRoYXQgaXMgaXMgYWxzbyBjcmVhdGVzIGFkYXB0ZXJzIGZvciBhbmQKLSAqIGFkYXB0cyB0aGUgTm9kZSBmb3IgYWxsIG90aGVyIHJlZ2lzdGVyZWQgJ2NyZWF0ZSBvbiBhZGFwdCcgQWRhcHRlcnMuIFRoaXMKLSAqIG90aGVyIGFkYXB0ZXJzIGFyZSByZWdpc3RlcmVkIGJ5IHJlZ2lzdGVyaW5nIHRoZWlyIGZhY3RvcmllcyB2aWEgcGx1Z2luCi0gKiBleHRlbnNpb24gcG9pbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgaW1wbGVtZW50cyBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IHsKLQotCXByaXZhdGUgUHJvcGFnYXRpbmdBZGFwdGVyIGZBZGFwdGVySW5zdGFuY2U7Ci0JcHJpdmF0ZSBMaXN0IGZDb250cmlidXRlZEZhY3RvcmllcyA9IG51bGw7Ci0KLQkvKioKLQkgKiBQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKCkgewotCQl0aGlzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcywgdHJ1ZSk7Ci0JfQotCi0JcHJvdGVjdGVkIFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKE9iamVjdCBhZGFwdGVyS2V5LCBib29sZWFuIHJlZ2lzdGVyQWRhcHRlcnMpIHsgLy8gLAotCQlzdXBlcihhZGFwdGVyS2V5LCByZWdpc3RlckFkYXB0ZXJzKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRDb250cmlidXRlZEZhY3RvcmllcyhJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkpIHsKLQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQlmQ29udHJpYnV0ZWRGYWN0b3JpZXMuYWRkKGZhY3RvcnkpOwotCQl9Ci0KLQl9Ci0KLQkvKioKLQkgKiBjcmVhdGVBZGFwdGVyIG1ldGhvZCBjb21tZW50LgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIHRhcmdldCkgewotCQkvLyBldmVyeSBub3RpZmllciBnZXQncyBvbmUgb2YgdGhlc2UKLQkJLy8gKGFuZCB0aGUgc2FtZSBpbnN0YW5jZSBvZiBpdCkKLQkJcmV0dXJuIGdldEFkYXB0ZXJJbnN0YW5jZSgpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0ZXJJbnN0YW5jZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFJldHVybnMgYSBQcm9wYWdhdGluZ0FkYXB0ZXIKLQkgKi8KLQlwcml2YXRlIFByb3BhZ2F0aW5nQWRhcHRlciBnZXRBZGFwdGVySW5zdGFuY2UoKSB7Ci0JCWlmIChmQWRhcHRlckluc3RhbmNlID09IG51bGwpIHsKLQkJCWZBZGFwdGVySW5zdGFuY2UgPSBuZXcgUHJvcGFnYXRpbmdBZGFwdGVySW1wbCgpOwotCQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmQ29udHJpYnV0ZWRGYWN0b3JpZXMuc2l6ZSgpOyBpKyspCi0JCQkJCWZBZGFwdGVySW5zdGFuY2UuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkoKFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnkpIGZDb250cmlidXRlZEZhY3Rvcmllcy5nZXQoaSkpOwotCQkJfQotCQl9Ci0JCXJldHVybiBmQWRhcHRlckluc3RhbmNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGdpdmUgdGhlIGFkYXB0ZXIgaW5zdGFuY2UgYSBjaGFuY2UgdG8gcmVsZWFzZSBpdHMgZmFjdG9yaWVzCi0JCWdldEFkYXB0ZXJJbnN0YW5jZSgpLnJlbGVhc2UoKTsKLQotCX0KLQotCXB1YmxpYyB2b2lkIHNldENvbnRyaWJ1dGVkRmFjdG9yaWVzKEFycmF5TGlzdCBsaXN0KSB7Ci0JCWZDb250cmlidXRlZEZhY3RvcmllcyA9IGxpc3Q7Ci0KLQl9Ci0KLQlwdWJsaWMgSU5vZGVBZGFwdGVyRmFjdG9yeSBjb3B5KCkgewotCQlQcm9wYWdhdGluZ0FkYXB0ZXJGYWN0b3J5IGNsb25lZEluc3RhbmNlID0gbmV3IFByb3BhZ2F0aW5nQWRhcHRlckZhY3RvcnlJbXBsKGdldEFkYXB0ZXJLZXkoKSwgaXNTaG91bGRSZWdpc3RlckFkYXB0ZXIoKSk7Ci0JCS8vIGNsb25lIHRoaXMgYWRhcHRlcnMgc3BlY2lmaWMgbGlzdCBvZiBhZGFwdGVyIGZhY3RvcmllcyB0b28KLQkJaWYgKGZDb250cmlidXRlZEZhY3RvcmllcyAhPSBudWxsKSB7Ci0JCQkKLQkJCUl0ZXJhdG9yIGl0ZXJhdG9yID0gZkNvbnRyaWJ1dGVkRmFjdG9yaWVzLml0ZXJhdG9yKCk7Ci0JCQljbG9uZWRJbnN0YW5jZS5zZXRDb250cmlidXRlZEZhY3RvcmllcyhuZXcgQXJyYXlMaXN0KCkpOwotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZXhpc3RpbmdGYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGl0ZXJhdG9yLm5leHQoKTsKLQkJCQljbG9uZWRJbnN0YW5jZS5hZGRDb250cmlidXRlZEZhY3RvcmllcyhleGlzdGluZ0ZhY3RvcnkuY29weSgpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY2xvbmVkSW5zdGFuY2U7Ci0JfQotCi0JCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvcGFnYXRlL1Byb3BhZ2F0aW5nQWRhcHRlckltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjU4MTU5MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3BhZ2F0ZS9Qcm9wYWdhdGluZ0FkYXB0ZXJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvcGFnYXRlOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsIGltcGxlbWVudHMgUHJvcGFnYXRpbmdBZGFwdGVyIHsKLQotCXByaXZhdGUgTGlzdCBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID0gbnVsbDsKLQotCS8qKgotCSAqIEFic3RyYWN0UHJvcGFnYXRpbmdBZGFwdGVySW1wbCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBQcm9wYWdhdGluZ0FkYXB0ZXJJbXBsKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBhZGFwdE9uQ3JlYXRlKElET01Ob2RlIG5vZGUpIHsKLQkJLy8gZ2l2ZSBlYWNoIG9mIHRoZSBmYWN0b3JpZXMgYSBjaGFuY2UgdG8gYWRhcHQgdGhlIG5vZGUsIGlmIGl0Ci0JCS8vIGNob29zZXMgdG8KLQkJaWYgKGFkYXB0T25DcmVhdGVGYWN0b3JpZXMgIT0gbnVsbCkgewotCi0KLQkJCXN5bmNocm9uaXplZCAoYWRhcHRPbkNyZWF0ZUZhY3RvcmllcykgewotCQkJCWludCBsZW5ndGggPSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLnNpemUoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7Ci0JCQkJCUlOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJTm9kZUFkYXB0ZXJGYWN0b3J5KSBhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzLmdldChpKTsKLQkJCQkJZmFjdG9yeS5hZGFwdChub2RlKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCi0JfQotCi0JLyoqCi0JICogVGhpcyBtZWNoYW5pc20gY2FuIGJlIG1hZGUgImVhc2llciB0byB1c2UiIGxhdGVyLgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFkYXB0T25DcmVhdGVGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSkgewotCQlnZXRBZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKCkuYWRkKGZhY3RvcnkpOwotCX0KLQotCS8qKgotCSAqIEdldHMgdGhlIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgTGlzdAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEFkYXB0T25DcmVhdGVGYWN0b3JpZXMoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID09IG51bGwpCi0JCQlhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOwotCQlyZXR1cm4gYWRhcHRPbkNyZWF0ZUZhY3RvcmllczsKLQl9Ci0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI2luaXRpYWxpemVGb3JGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnksCi0JICogICAgICBJTm9kZU5vdGlmaWVyKQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXRpYWxpemVGb3JGYWN0b3J5KElOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSwgSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCS8vIElTU1VFOiB3ZSBhcmUgYSBET00gc3BlY2lmaWMgaW1wbGltZW50YXRpb24sIAotCQkvLyB3ZSBzaG91bGQgbm90IGJlLgotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJRE9NTm9kZSB4bWxOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJcHJvcGFnYXRlVG8oeG1sTm9kZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBbGxvd2luZyB0aGUgSU5vZGVBZGFwdGVyIHRvIGNvbXBhcmUgaXRzZWxmIGFnYWluc3QgdGhlIHR5cGUgYWxsb3dzIGl0Ci0JICogdG8gcmV0dXJuIHRydWUgaW4gbW9yZSB0aGFuIG9uZSBjYXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzQWRhcHRlckZvclR5cGUoT2JqZWN0IHR5cGUpIHsKLQkJcmV0dXJuIHR5cGUuZXF1YWxzKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzSW50ZXJlc3RpbmcoT2JqZWN0IG5ld1ZhbHVlKSB7Ci0JCXJldHVybiAobmV3VmFsdWUgIT0gbnVsbCAmJiAobmV3VmFsdWUgaW5zdGFuY2VvZiBFbGVtZW50IHx8IG5ld1ZhbHVlIGluc3RhbmNlb2YgRG9jdW1lbnQgfHwgbmV3VmFsdWUgaW5zdGFuY2VvZiBEb2N1bWVudFR5cGUpKTsKLQl9Ci0KLQkvKioKLQkgKi8KLQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gSXNzdWU6IFdlIG9ubHkgcHJvcGFnYXRlIHRvIEVsZW1lbnRzIC4uLgotCQkvLyBub3QgYXR0cmlidXRlcyB0b28hIFdlIHNob3VsZCBjYXJlZnVsIGNvbnNpZGVyIGRvbmluZyBhbGwgd2hlbgotCQkvLyB3aGVuIHdlIGltcHJvdmUgImFkYXB0IG9uIGNyZWF0ZSIgZGVzaWduLgotCQlpZiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQUREICYmIGlzSW50ZXJlc3RpbmcobmV3VmFsdWUpKSB7Ci0JCQlwcm9wYWdhdGVUbygoSURPTU5vZGUpIG5ld1ZhbHVlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9wYWdhdGVUbyhJRE9NTm9kZSBub2RlKSB7Ci0JCS8vIGdldCBhZGFwdGVyIHRvIGVuc3VyZSBpdHMgY3JlYXRlZAotCQlub2RlLmdldEFkYXB0ZXJGb3IoUHJvcGFnYXRpbmdBZGFwdGVyLmNsYXNzKTsKLQkJYWRhcHRPbkNyZWF0ZShub2RlKTsKLQkJcHJvcGFnYXRlVG9DaGlsZHJlbihub2RlKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgcHJvcGFnYXRlVG9DaGlsZHJlbihJRE9NTm9kZSBwYXJlbnQpIHsKLQkJZm9yIChOb2RlIGNoaWxkID0gcGFyZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlwcm9wYWdhdGVUbygoSURPTU5vZGUpIGNoaWxkKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgUHJvcGFnYXRpbmdBZGFwdGVyI3JlbGVhc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCWlmIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzICE9IG51bGwpIHsKLQotCQkJc3luY2hyb25pemVkIChhZGFwdE9uQ3JlYXRlRmFjdG9yaWVzKSB7Ci0JCQkJaW50IGxlbmd0aCA9IGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJSU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElOb2RlQWRhcHRlckZhY3RvcnkpIGFkYXB0T25DcmVhdGVGYWN0b3JpZXMuZ2V0KGkpOwotCQkJCQlmYWN0b3J5LnJlbGVhc2UoKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9JWE1MQ2hhckVudGl0eS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTE3MTZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTENoYXJFbnRpdHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi0KLQotLyoqCi0gKiBYTUwgTmFtZXNwYWNlIGNvbnN0YW50cwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGludGVyZmFjZSBJWE1MQ2hhckVudGl0eSB7Ci0Jc3RhdGljIGZpbmFsIFN0cmluZyBBTVBfTkFNRSA9ICJhbXAiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFNUF9SRUYgPSAiJmFtcDsiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFNUF9WQUxVRSA9ICImIjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBUE9TX05BTUUgPSAiYXBvcyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQVBPU19SRUYgPSAiJmFwb3M7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBUE9TX1ZBTFVFID0gIiciOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdUX05BTUUgPSAiZ3QiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIEdUX1JFRiA9ICImZ3Q7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBHVF9WQUxVRSA9ICI+IjsvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIExUX05BTUUgPSAibHQiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgZmluYWwgU3RyaW5nIExUX1JFRiA9ICImbHQ7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBMVF9WQUxVRSA9ICI8IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UX05BTUUgPSAicXVvdCI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgUVVPVF9SRUYgPSAiJnF1b3Q7IjsvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBRVU9UX1ZBTFVFID0gIlwiIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxOYW1lc3BhY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTE5hbWVzcGFjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzc3MzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTE5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLQotCi0vKioKLSAqIFhNTCBOYW1lc3BhY2UgY29uc3RhbnRzCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxOYW1lc3BhY2UgewotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBYTUxOUyA9ICJ4bWxucyI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfUFJFRklYID0gInhtbG5zOiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MTlNfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL0lYTUxQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTFByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQwZTBmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSVhNTFByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLS8qKgotICogS2V5cyB0byB1c2UgZm9yIHByZWZlcmVuY2Ugc2V0dGluZ3MuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFByZWZlcmVuY2VOYW1lcyB7Ci0JU3RyaW5nIENMRUFOVVBfQVRUUl9OQU1FX0NBU0UgPSAiY2xlYW51cEF0dHJOYW1lQ2FzZSI7Ly8kTk9OLU5MUy0xJAotCVN0cmluZyBDTEVBTlVQX0VPTF9DT0RFID0gImNsZWFudXBFT0xDb2RlIjsvLyROT04tTkxTLTEkCi0JLy8gY2xlYW51cCBwcmVmZXJlbmNlIG5hbWVzCi0JU3RyaW5nIENMRUFOVVBfVEFHX05BTUVfQ0FTRSA9ICJjbGVhbnVwVGFnTmFtZUNhc2UiOy8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgQ09OVkVSVF9FT0xfQ09ERVMgPSAiY29udmVydEVPTENvZGVzIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIEZPUk1BVF9TT1VSQ0UgPSAiZm9ybWF0U291cmNlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIElOU0VSVF9NSVNTSU5HX1RBR1MgPSAiaW5zZXJ0TWlzc2luZ1RhZ3MiOy8vJE5PTi1OTFMtMSQKLQotCS8vIG90aGVycwotCVN0cmluZyBMQVNUX0FDVElWRV9QQUdFID0gImxhc3RBY3RpdmVQYWdlIjsvLyROT04tTkxTLTEkCi0JU3RyaW5nIFFVT1RFX0FUVFJfVkFMVUVTID0gInF1b3RlQXR0clZhbHVlcyI7Ly8kTk9OLU5MUy0xJAotCi0JLyoKLQkgKiBub3QgdXNlZCBmb3Igbm93IC8vIGhpZ2hsaWdodGluZyB0eXBlcyBTdHJpbmcgQ09NTUVOVF9CT1JERVIgPQotCSAqICJjb21tZW50Qm9yZGVyIjsvLyROT04tTkxTLTEkIFN0cmluZyBDT01NRU5UX1RFWFQgPQotCSAqICJjb21tZW50VGV4dCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQ0RBVEFfQk9SREVSID0KLQkgKiAiY2RhdGFCb3JkZXIiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENEQVRBX1RFWFQgPQotCSAqICJjZGF0YVRleHQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIFBJX0JPUkRFUiA9ICJwaUJvcmRlciI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBQSV9DT05URU5UID0gInBpQ29udGVudCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgVEFHX0JPUkRFUiA9Ci0JICogInRhZ0JvcmRlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgVEFHX05BTUUgPSAidGFnTmFtZSI7Ly8kTk9OLU5MUy0xJAotCSAqIFN0cmluZyBUQUdfQVRUUklCVVRFX05BTUUgPSAidGFnQXR0cmlidXRlTmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcKLQkgKiBUQUdfQVRUUklCVVRFX1ZBTFVFID0gInRhZ0F0dHJpYnV0ZVZhbHVlIjsvLyROT04tTkxTLTEkIFN0cmluZwotCSAqIERFQ0xfQk9SREVSID0gImRlY2xCb2RlciI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9OQU1FID0KLQkgKiAiZG9jdHlwZU5hbWUiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSUQgPQotCSAqICJkb2N0eXBlRXh0ZXJuYWxJZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPQotCSAqICJkb2N0eXBlRXh0ZXJuYWxQdWJyZWYiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIERPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGID0KLQkgKiAiZG9jdHlwZUV4dHJlbmFsU3lzcmVmIjsvLyROT04tTkxTLTEkIFN0cmluZyBYTUxfQ09OVEVOVCA9Ci0JICogInhtbENvbnRlbnQiOy8vJE5PTi1OTFMtMSQgLy8gaGlnaGxpZ2h0aW5nIHByZWZlcmVuY2VzIFN0cmluZyBDT01NQSA9Ci0JICogIiwiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIENPTE9SID0gImNvbG9yIjsvLyROT04tTkxTLTEkIFN0cmluZyBOQU1FID0KLQkgKiAibmFtZSI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgRk9SRUdST1VORCA9ICJmb3JlZ3JvdW5kIjsvLyROT04tTkxTLTEkCi0JICogU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7Ly8kTk9OLU5MUy0xJCBTdHJpbmcgQk9MRCA9Ci0JICogImJvbGQiOy8vJE5PTi1OTFMtMSQgU3RyaW5nIElUQUxJQyA9ICJpdGFsaWMiOy8vJE5PTi1OTFMtMSQKLQkgKi8KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvTmFtZVZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MmQwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9OYW1lVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbDsKLQotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnBhcnNlci5YTUwxME5hbWVzOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgY29uc2lzdGVudCB3YXkgdG8gcHJlLWNoZWNrIGlmIGEgc3RyaW5nIGlzIGEgdmFsaWQgWE1MCi0gKiBuYW1lLCBiZWZvcmUsIGZvciBleGFtcGxlLCB0cnlpbmcgdG8gYWN0dWFsbHkgY3JlYXRlIGFuIEVsZW1lbnQgd2l0aCBpdC4KLSAqIEF0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIEVsZW1lbnQgd2l0aCBhbiBpbnZhbGlkIG5hbWUgd2lsbCB0aHJvdyB0aGUgYXBwcm9wcmlhdGUKLSAqIERPTSBFeGNlcHRpb24sIGJ1dCBvZnRlbiBjbGllbnRzIHdhbnQgdG8gY2hlY2sgdGhlIHZhbGlkaXRpbmcgb2YgYSBuYW1lCi0gKiBzdWNoIGFzIGJhc2VkIG9uIHNvbWUgdXNlciBpbnB1dCwgbG9uZyBpbiBhZHZhbmNlIG9mIGFjdHVhbGx5IG1ha2luZyAKLSAqIHRoZSBET00gY2FsbC4gQW5kLCBuYXR1YWxseSwgd2FudCB0byBnaXZlIHRoZSB1c2VyIGZlZWRiYWNrIGluIGEgbW9yZSAKLSAqIHRpbWVseSBmYXNoaW9uLgotICogCi0gKiBJU1NVRTogaXMgImVuZG5zOiIgcmVhbGx5IHZhbGlkIHhtbCBuYW1lPyBJIHRoaW5rIG5vdCwgYnV0IHRoaXMgbWV0aG9kCi0gKiAoY3VycmVudGx5KSBzYXlzIGl0IGlzLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE5hbWVWYWxpZGF0b3IgewotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MMTBOYW1lcyB4bWwxMGNoYXJDaGVja2VyID0gbnVsbDsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiA8Y29kZT5uYW1lPC9jb2RlPiBpcyB2YWxpZCBYTUwgbmFtZSBhY2NvcmRpbmcgdG8gWE1MCi0JICogMS4wIHJ1bGVzLCBmYWxzZSBvdGhlcndpc2UuCi0JICogCi0JICogQHBhcmFtIG5hbWUKLQkgKiAgICAgICAgICAgIG5hbWUgaXMgdGhlIHN0cmluZyB0byB0ZXN0Ci0JICogQHJldHVybiB0cnVlIGlmIHZhbGlkIG5hbWUgYWNjb3JkaW5nIHRvIFhNTCAxLjAgcnVsZXMsIGZhbHNlIG90aGVyd2lzZS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBmaW5hbCBib29sZWFuIGlzVmFsaWQoU3RyaW5nIG5hbWUpIHsKLQotCQlpZiAoeG1sMTBjaGFyQ2hlY2tlciA9PSBudWxsKSB7Ci0JCQl4bWwxMGNoYXJDaGVja2VyID0gaW5pdGl0YWlsaXplWE1MMTBOYW1lcygpOwotCQl9Ci0JCXJldHVybiB4bWwxMGNoYXJDaGVja2VyLmlzVmFsaWRYTUwxME5hbWUobmFtZSk7Ci0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgWE1MMTBOYW1lcyBpbml0aXRhaWxpemVYTUwxME5hbWVzKCkgewotCQlyZXR1cm4gbmV3IFhNTDEwTmFtZXMoKFJlYWRlcikgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogTm90IGludGVudGVkZWQgdG8gYmUgaW5zdGFudGlhdGVkLgotCSAqLwotCXByaXZhdGUgTmFtZVZhbGlkYXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY1R5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jVHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDdmOTQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudG1vZGVsOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Eb2NUeXBlIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDSFRNTF9ET0NfVFlQRSA9ICJDSFRNTCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEhUTUxfRE9DX1RZUEUgPSAiSFRNTCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEpTUDExX0RPQ19UWVBFID0gIkpTUDExIjsvLyROT04tTkxTLTEkCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTURvY3VtZW50VHJhY2tlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2U5YjFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNRG9jdW1lbnRUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci0KLQotLyoqCi0gKiBQb3NpdGlvbiBkZXBlbmRlbnQgQ01Eb2N1bWVudCB0cmFja2VyLiBBIHRyYWNrZXIgbWF0Y2hlcyBhCi0gKiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHdpdGggYSBDTURvY3VtZW50IHRoYXQgaXQgZW5hYmxlcyBhbGxvd2luZyBmb3IKLSAqIHBvc2l0aW9uLWRlcGVuZGVudCBjb250ZW50IG1vZGVscwotICovCi1wdWJsaWMgaW50ZXJmYWNlIENNRG9jdW1lbnRUcmFja2VyIHsKLQotCUNNRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NNTm9kZVdyYXBwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM5MDVjMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9DTU5vZGVXcmFwcGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQ01Ob2RlV3JhcHBlciBleHRlbmRzIENNTm9kZSB7Ci0JQ01Ob2RlIGdldE9yaWdpbk5vZGUoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudG1vZGVsL0NvbnRlbnRNb2RlbEFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NDc1OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9Db250ZW50TW9kZWxBZGFwdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50bW9kZWw7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotCi0vKioKLSAqIENvbnRlbnRNb2RlbEFkYXB0ZXIgaW50ZXJmYWNlCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29udGVudE1vZGVsQWRhcHRlciBleHRlbmRzIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXIgewotCi0JLyoqCi0JICogZ2V0Q01Eb2N1bWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNRG9jdW1lbnQKLQkgKiBAcGFyYW0gbm90aWZlcgotCSAqIAotCSAqIFJldHVybnMgQ01Eb2N1bWVudCBhc3NvY2lhdGVkIHRvIHRoZSBhZGFwdGluZyBub2RlLiBGb3IgZXhhbXBsIDogSFRNTAotCSAqIENNRG9jdW1lbnQgaXMgYXNzb2NpYXRlZCB0byBIVE1MIERvY3VtZW50IG5vZGUsIERURCBDTURvY3VtZW50IGlzCi0JICogYXNzb2NpYXRlZCB0byBEb2N1bWVudFR5cGUgbm9kZSwgRFREL1NjaGVtYSBDTURvY3VtZW50IGlzIGFzc29jaWF0ZWQgdG8KLQkgKiBFbGVtZW50IG5vZGUgKHNvbWV0aW1lIHdpdGggbmFtZXNwYWNlKSwgYW5kIHRhZ2xpYiBDTURvY3VtZW50IGlzCi0JICogYXNzb2NpYXRlZCB0byB0YWdsaWIgZGlyZWN0aXZlIEVsZW1lbnQgbm9kZS4KLQkgKiAKLQkgKiBJTm9kZU5vdGlmaWVyIGlzIHBhc3NlZCBmb3Igc3RhdGVsZXNzIChzaW5nbGV0b24pIElOb2RlQWRhcHRlcgotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCUNNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllcik7Ci0KLQkvKioKLQkgKiBnZXREZWNsYXJhdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNTm9kZQotCSAqIEBwYXJhbSBub3RpZmVyCi0JICogCi0JICogUmV0dXJucyBFbGVtZW50RGVmaW5pdGlvbiBvciBBdHRyaWJ1dGVEZWZpbml0aW9uIGZvciB0aGUgYWRhcHRpbmcgbm9kZS4KLQkgKiAKLQkgKiBJTm9kZU5vdGlmaWVyIGlzIHBhc3NlZCBmb3Igc3RhdGVsZXNzIChzaW5nbGV0b24pIElOb2RlQWRhcHRlcgotCSAqIGltcGxlbWVudGF0aW9uLgotCSAqLwotCUNNTm9kZSBnZXREZWNsYXJhdGlvbihvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9OdWxsQ29udGVudE1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2NvbnRlbnRtb2RlbC9OdWxsQ29udGVudE1vZGVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTc3ZmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50bW9kZWwvTnVsbENvbnRlbnRNb2RlbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnRtb2RlbDsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lc3BhY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLQotLyoqCi0gKiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGludGlhbGl6ZSBzcGVjaWZpYyB2YXJpYWJsZXMgdGhhdCBuZWVkIGEgY29udGVudAotICogbW9kZWwsIHVudGlsIHRoZSB0cnVlIGNvbnRlbnQgbW9kZWwgaXMgYXZhaWxhYmxlLiBUaGlzIHByZXZlbnRzIGhhdmluZyB0bwotICogZG8gbG90cyBvZiBudWxsIGNoZWNrcy4KLSAqLwotcHVibGljIGNsYXNzIE51bGxDb250ZW50TW9kZWwgaW1wbGVtZW50cyBDTURvY3VtZW50IHsKLQotCXByaXZhdGUgc3RhdGljIGNsYXNzIE51bGxDTU5hbWVkTm9kZU1hcCBpbXBsZW1lbnRzIENNTmFtZWROb2RlTWFwIHsKLQkJcHVibGljIGludCBnZXRMZW5ndGgoKSB7Ci0JCQlyZXR1cm4gMDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgZ2V0TmFtZWRJdGVtKFN0cmluZyBuYW1lKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBDTU5vZGUgaXRlbShpbnQgaW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJcHVibGljIEl0ZXJhdG9yIGl0ZXJhdG9yKCkgewotCQkJcmV0dXJuIG5ldyBOdWxsSXRlcmF0b3IoKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTnVsbEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IgewotCQlwdWJsaWMgTnVsbEl0ZXJhdG9yKCkgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbmV4dCgpIHsKLQkJCXRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0JCQl0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNhbiBub3QgcmVtb3ZlIHJlZ2lvbnMgdmlhIGl0ZXJhdG9yIik7IC8vJE5PTi1OTFMtMSQKLQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgTnVsbENvbnRlbnRNb2RlbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0RWxlbWVudHMoKSB7Ci0JCXJldHVybiBuZXcgTnVsbENNTmFtZWROb2RlTWFwKCk7Ci0JfQotCi0JcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVudGl0aWVzKCkgewotCQlyZXR1cm4gbmV3IE51bGxDTU5hbWVkTm9kZU1hcCgpOwotCX0KLQotCXB1YmxpYyBDTU5hbWVzcGFjZSBnZXROYW1lc3BhY2UoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvY29udGVudHR5cGUvQ29udGVudFR5cGVJZEZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YzNhOTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9jb250ZW50dHlwZS9Db250ZW50VHlwZUlkRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlOwotCi0vKioKLSAqIFRoaXMgY2xhc3MsIHdpdGggaXRzIGZldyBmaWVsZCwgaXMgYSBjb252aWVuY2UgdG8gcHJvdmlkZSBjb21waWxlLXRpbWUKLSAqIHNhZmV0eSB3aGVuIHJlZmVyaW5nIHRvIGEgY29udGVudFR5cGUgSUQuIFRoZSB2YWx1ZSBvZiB0aGUgY29udGVudHR5cGUgaWQKLSAqIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4gcGx1Z2luLnhtbCBmaWxlLgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotZmluYWwgcHVibGljIGNsYXNzIENvbnRlbnRUeXBlSWRGb3JYTUwgewotCS8qKgotCSAqIFRoaXMgY29udGVudCB0eXBlIGlzIGFjdHVhbGx5IHN1cHBsaWVkIGJ5IGJhc2UgRWNsaXBzZS4gSXRzIGdpdmVuIGhlcmUKLQkgKiBqdXN0IGFzIGRvY3VtZW50YXRpb24gZm9yIFdUUCBiYXNlZCBjbGllbnRzLiBUeXBpY2FsbHksIGNsaWVudHMgc2hvdWxkCi0JICogdXNlIHRoZSB2YWx1ZXMvY29uc3RhbnRzIHN1cHBsaWVkIGJ5IGJhc2UgRWNsaXBzZS4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX1hNTCA9IGdldENvbnN0YW50U3RyaW5nMigpOwotCS8qKgotCSAqIFRoaXMgdmFsdWUgaXMgcHVibGljIG9ubHkgZm9yIHRlc3RpbmcgYW5kIHNwZWNpYWwgaW5mcmFzdHJ1Y3R1cmUuIFRoZQotCSAqIGNvbnN0YW50IG5vciBpcyB2YWx1ZSBzaG91bGQgbm90IGJlIHJlZmVyZW5jZWQgYnkgY2xpZW50cy4KLQkgKiAKLQkgKiBUaGUgdmFsdWUgb2YgdGhlIGNvbnRlbnR0eXBlIGlkIGZpZWxkIG11c3QgbWF0Y2ggd2hhdCBpcyBzcGVjaWZpZWQgaW4KLQkgKiBwbHVnaW4ueG1sIGZpbGUuIE5vdGU6IHRoaXMgdmFsdWUgaXMgaW50ZW50aWFsbHkgc2V0IHdpdGggZGVmYXVsdAotCSAqIHByb3RlY3RlZCBtZXRob2Qgc28gaXQgd2lsbCBub3QgYmUgaW5saW5lZC4KLQkgKi8KLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDb250ZW50VHlwZUlEX1NTRVhNTCA9IGdldENvbnN0YW50U3RyaW5nKCk7Ci0KLQkvKioKLQkgKiBEb24ndCBhbGxvdyBpbnN0YW50aWF0aW9uLgotCSAqLwotCXByaXZhdGUgQ29udGVudFR5cGVJZEZvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlzdGF0aWMgU3RyaW5nIGdldENvbnN0YW50U3RyaW5nKCkgewotCQlyZXR1cm4gIm9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiOyAvLyROT04tTkxTLTEkCi0JfQotCi0Jc3RhdGljIFN0cmluZyBnZXRDb25zdGFudFN0cmluZzIoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUF0dHIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUF0dHIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE3OThmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01BdHRyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLQotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NQXR0ciBleHRlbmRzIElET01Ob2RlLCBBdHRyIHsKLQotCS8qKgotCSAqIEdldCdzIHRoZSByZWdpb24gaW4gYXR0cmlidXRlIHJlcHJlc2VudGluZyB0aGUgJz0nIHNpZ24uIE1heSBvciBtYXkgbm90Ci0JICogaGF2ZSB3aGl0ZXNwYWNlIHN1cnJvdW5kaW5nIGl0LgotCSAqIAotCSAqIEBkZXByZWNhdGVkIC0gCi0JICogSVNTVUU6IG5lZWQgdG8gY2hhbmdlL3JlbW92ZSB0byBhdm9pZCBleHBvc2luZyAnSVRleHRSZWdpb24nCi0JICogY2hhbmdlIHRvIG9mZnNldCBwYXR0ZXJuLCBhcyBvdGhlcnMuCi0JICogCi0JICogQHJldHVybiBJVGV4dFJlZ2lvbiAtIHRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBlcXVhbHMgc2lnbiwgb3IgbnVsbAotCSAqICAgICAgICAgaWYgdGhlaXIgaXMgbm8gZXF1YWxzIHNpZ24uCi0JICovCi0JSVRleHRSZWdpb24gZ2V0RXF1YWxSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZSwgaW5jbHVkaW5nCi0JICogd2hpdGVzcGFjZS4KLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgYXR0cmlidXRlIG5hbWUsCi0JICogICAgICAgICBpbmNsdWRpbmcgd2hpdGVzcGFjZS4KLQkgKi8KLQlpbnQgZ2V0TmFtZVJlZ2lvbkVuZE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBpbnQgLSB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25TdGFydE9mZnNldCgpOwotCi0KLQkvKioKLQkgKiBHZXRzIHRoZSB0ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIG5hbWUuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSBuYW1lLgotCSAqLwotCVN0cmluZyBnZXROYW1lUmVnaW9uVGV4dCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lLCBleGNsdWRpbmcKLQkgKiB3aGl0ZXNwYWNlLgotCSAqIAotCSAqIEByZXR1cm4gaW50IC0gcmV0dXJucyB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGF0dHJpYnV0ZQotCSAqICAgICAgICAgbmFtZSwgZXhjbHVkaW5nIHdoaXRlc3BhY2UuCi0JICovCi0JaW50IGdldE5hbWVSZWdpb25UZXh0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICogCi0JICogQHJldHVybiBpbnQgLSByZXR1cm5zIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdHRyaWJ1dGUKLQkgKiAgICAgICAgIHZhbHVlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGJldHRlciBzcGVjIGludGVyYWN0aW9uIHdpdGggcXVvdGUgbWFya3MKLQkgKi8KLQlpbnQgZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgdGV4dCBhc3NvY2lhdGVkIHdpdGggdGhlIGF0dHJpYnV0ZSB2YWx1ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHJldHVybnMgdGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCi0JICovCi0JU3RyaW5nIGdldFZhbHVlUmVnaW9uVGV4dCgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgYSBuZXN0ZWQgdmFsdWUgKHN1Y2ggYXMgYSBKU1AgZXhwcmVzc2lvbikuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGNvbnRhaW5zIGEgbmVzdGVkIHZhbHVlLCBmYWxzZSBvdGhlcndpc2UuCi0JICovCi0JYm9vbGVhbiBoYXNOZXN0ZWRWYWx1ZSgpOwotCi0JLyoqCi0JICogQ2hlY2sgaWYgQXR0ciBoYXMgb25seSBuYW1lIGJ1dCBub3QgZXF1YWwgc2lnbiBub3IgdmFsdWUuCi0JICogCi0JICogQHJldHVybiB0cnVlIGlmIGhhcyBvbmx5IG5hbWUgYnV0IG5vdCBlcXVhbCBzaWduIG5vciB2YWx1ZS4KLQkgKi8KLQlib29sZWFuIGhhc05hbWVPbmx5KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgYXR0cmlidXRlIGlzIGRlZmluZWQgZ2xvYmFsbHkgZm9yIGRvY3VtZW50LiBSZXR1cm5zCi0JICogZmFsc2UgaWYgYXR0cmlidXRlIGlzIHByZWNlZWRlZCBieSBhIHByZWZpeCAod2hldGhlciB2YWxpZCBuYW1lIHNwYWNlCi0JICogb3Igbm90KS4gUmV0dXJucyB0cnVlIGlmIGl0cyBvd25pbmcgZWxlbWVudCBpcyBhIGdsb2JhbCBlbGVtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBhdHRyaWJ1dGUgaXMgZGVmaW5lZCBnbG9iYWxseSBmb3IgZG9jdW1lbnQuIFJldHVybnMKLQkgKiAgICAgICAgIGZhbHNlIGlmIGF0dHJpYnV0ZSBpcyBwcmVjZWVkZWQgYnkgYSBwcmVmaXggKHdoZXRoZXIgdmFsaWQgbmFtZQotCSAqICAgICAgICAgc3BhY2Ugb3Igbm90KS4gUmV0dXJucyB0cnVlIGlmIGl0cyBvd25pbmcgZWxlbWVudCBpcyBhIGdsb2JhbAotCSAqICAgICAgICAgZWxlbWVudC4KLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsQXR0cigpOwotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIGlzIHhtbCBhdHRyCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gc3BlY2lmeSB0aGlzIG9uZSBpbiBhIG1lYW5pbmdmdWwgd2F5LgotCSAqIAotCSAqIEByZXR1cm4gYm9vbGVhbiAtIHJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgYXR0cgotCSAqLwotCWJvb2xlYW4gaXNYTUxBdHRyKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTk5MWZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgZW5hYmxlcyBjcmVhdGlvbiBvZiBET0NUWVBFIGRlY2xhcmF0aW9uIGFuZCBzb21lIERPTSBMZXZlbCAyCi0gKiBpbnRlcmZhY2VzLiBNYXkgYmUgcmVmZXJlbmNlZCBidXQgbm90IGltcGxlbWVudGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Eb2N1bWVudCBleHRlbmRzIE5vZGUsIERvY3VtZW50LCBJRE9NTm9kZSB7Ci0KLQkvKioKLQkgKiBjcmVhdGUgY29tbWVudCBlbGVtZW50LiB0YWdOYW1lIG11c3QgYmUgcmVnaXN0ZXJlZCBhcyBjb21tZW50IGVsZW1lbnQKLQkgKiBuYW1lIGluIHBsdWdpbi54bWwKLQkgKiAKLQkgKiBAcGFyYW0gdGFnTmFtZQotCSAqICAgICAgICAgICAgdGhlIGVsZW1lbnQgbmFtZQotCSAqIEBwYXJhbSBpc0pTUFRhZwotCSAqICAgICAgICAgICAgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBKU1Agc3R5bGUgY29tbWVudCAoJmx0OyUtLSAuLi4KLQkgKiAgICAgICAgICAgIC0tJSZndDspCi0JICogQHJldHVybiBFbGVtZW50IGVsZW1lbnQgaW5zdGFuY2UKLQkgKiBAdGhyb3dzIERPTUV4Y2VwdGlvbgotCSAqICAgICAgICAgICAgIHRocm93biBpZiB0aGUgZWxlbWVudCBuYW1lIGlzIHJlZ2lzdGVyZWQgYXMgY29tbWVudCBlbGVtZW50Ci0JICovCi0JRWxlbWVudCBjcmVhdGVDb21tZW50RWxlbWVudChTdHJpbmcgdGFnTmFtZSwgYm9vbGVhbiBpc0pTUFRhZykgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBEb2N1bWVudFR5cGUgbm9kZQotCSAqIAotCSAqIElTU1VFOiBJIGJlbGlldmUgdGhpcyAnbmFtZScgaXMgdGhlIG9uZSBzcGVjaWZpYyBpbiBkb2N0eXBlIGV4dGVuc2lvbiwKLQkgKiBuZWVkIHRvIHZlcmlmeS4KLQkgKiAKLQkgKiBAcGFyYW0gbmFtZSAtCi0JICogICAgICAgICAgICBuYW1lIG9mIHRoZSBkb2N0eXBlCi0JICogQHJldHVybiBEb2N1bWVudFR5cGUgLSByZXR1cm5zIGEgZG9jdW1lbnQgdHlwZSBub2RlLgotCSAqLwotCURvY3VtZW50VHlwZSBjcmVhdGVEb2N0eXBlKFN0cmluZyBuYW1lKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIERvY3VtZW50VHlwZSBJRC4gVW5saWtlIHRoZSBzdGFuZGFyZCBET00gYXBwcm9hY2ggb2YKLQkgKiAiZ2V0RG9jdW1lbnRUeXBlKCkuZ2V0UHVibGljSWQoKSIsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGlkIGV2ZW4gaWYKLQkgKiBpbXBsaWNpdC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBEb2N1bWVudFR5cGUgSUQKLQkgKi8KLQlTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlSWQoKTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLi4uIG5lZWRzIHRvIGJlIHJlbW92ZWQvY2hhbmdlZAotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNwZWNpZnkKLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBpcyBKU1BEb2N1bWVudAotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNKU1BEb2N1bWVudCgpOwotCi0JLyoqCi0JICogTk9UIEFQSSAuLi4gbmVlZHMgdG8gYmUgcmVtb3ZlZC9jaGFuZ2VkCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlY2lmeQotCSAqIAotCSAqIEBkZXByZWNhdGVkCi0JICogCi0JICovCi0JYm9vbGVhbiBpc0pTUFR5cGUoKTsKLQotCS8qKgotCSAqIE5PVCBBUEkgLi4uIG1heSByZW1vdmVkL2NoYW5nZWQKLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBzcGVjaWZ5IC0tIGN1cnJlbnRseSB1c2VkIHRvIGRlbm90ZSBhbiBIVE1MIERPTSBkb2N1bWVudAotCSAqIGlzIFhIVE1MCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKiAKLQkgKi8KLQlib29sZWFuIGlzWE1MVHlwZSgpOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Eb2N1bWVudFR5cGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50VHlwZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZlZTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTURvY3VtZW50VHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQ7Ci0KLQotCi1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIGVuYWJsZXMgc2V0dGluZyBvZiBQdWJsaWMgYW5kIFN5c3RlbSBJRCBmb3IgRE9DVFlQRQotICogZGVjbGFyYXRpb24uCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Eb2N1bWVudFR5cGUgZXh0ZW5kcyBJRE9NTm9kZSwgRG9jdW1lbnRUeXBlIHsKLQotCi0JLyoqCi0JICogU2V0cyBkb2N1bWVudCB0eXBlJ3MgcHVibGljIGlkLCBhcyBzb3VyY2UuCi0JICogCi0JICogQHBhcmFtIFN0cmluZyAtCi0JICogICAgICAgICAgICB0aGUgcHVibGljSWQKLQkgKi8KLQl2b2lkIHNldFB1YmxpY0lkKFN0cmluZyBwdWJsaWNJZCk7Ci0KLQkvKioKLQkgKiBTZXRzIGRvY21lbnQgdHlwZSdzIHN5c3RlbSBpZCwgYXMgc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSBTdHJpbmcgLQotCSAqICAgICAgICAgICAgdGhlIHN5c3RlbUlkCi0JICovCi0Jdm9pZCBzZXRTeXN0ZW1JZChTdHJpbmcgc3lzdGVtSWQpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRWxlbWVudC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE2ZmViLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRPTUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi0vKioKLSAqIFRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGV4dGVuc2lvbnMgdG8gY29ycmVzcG9uZGluZyBET00gaW50ZXJmYWNlIHRvIGVuYWJsZQotICogZnVuY3Rpb25zIGZvciBzb3VyY2UgZWRpdGluZyBhbmQgaW5jcmVtZW50YWwgcGFyc2luZy4KLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NRWxlbWVudCBleHRlbmRzIElET01Ob2RlLCBFbGVtZW50IHsKLQotCS8qKgotCSAqIFJldHVucyB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBlbmQgdGFnLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNvcnQgb3V0IG5lZWQgZm9yIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIGVuZCB0YWcuCi0JICovCi0JaW50IGdldEVuZFN0YXJ0T2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZQotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHNvcnQgb3V0IG5lZWQgZm9yIHRoaXMKLQkgKiAKLQkgKiBAcmV0dXJuIGludCAtIHRoZSBlbmQgb2Zmc2V0IG9mIHRoZSBzdGFydCB0YWcuCi0JICovCi0JaW50IGdldFN0YXJ0RW5kT2Zmc2V0KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgaGFzIGFuIGVuZCB0YWcuCi0JICogCi0JICogSW4gb3VyIHNvdXJjZS1vcmllbnRlZCBET00sIHNvbWV0aW1lcyBFbGVtZW50cyBhcmUgImVuZGVkIiwgZXZlbgotCSAqIHdpdGhvdXQgYW4gZXhwbGljaXQgZW5kIHRhZyBpbiB0aGUgc291cmNlLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgYW4gZW5kIHRhZy4KLQkgKi8KLQlib29sZWFuIGhhc0VuZFRhZygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIGhhcyBhIHN0YXJ0IHRhZy4KLQkgKiAKLQkgKiBJbiBvdXIgc291cmNlLW9yaWVudGVkIERPTSwgYSBsb25lIGVuZCB0YWcgd2lsbCBjYXVzZSBhIG5vZGUgdG8gYmUKLQkgKiBjcmVhdGVkIGluIHRoZSB0cmVlLCB1bmxpa2Ugd2VsbC1mb3JtZWQtb25seSBET01zLgotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBoYXMgYSBzdGFydCB0YWcuCi0JICovCi0JYm9vbGVhbiBoYXNTdGFydFRhZygpOwotCi0JLyoqCi0JICogcmV0dXJucyB0cnVlIGlmIHRoaXMgZWxlbWVudCBpcyBhIGNvbW1lbnQgZWxlbWVudAotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgYSBjb21tZW50IGVsZW1lbnQKLQkgKi8KLQlib29sZWFuIGlzQ29tbWVudFRhZygpOwotCi0JLyoqCi0JICogaXNFbXB0eVRhZyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4gLSB0cnVlIGlmIGlzIGVtcHR5IHRhZywgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JYm9vbGVhbiBpc0VtcHR5VGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgZmxvYXRpbmcgZW5kIHRhZy4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgZmxvYXRpbmcgZW5kIHRhZy4KLQkgKi8KLQlib29sZWFuIGlzRW5kVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgZm9yICJnbG9iYWwgdGFnIiAoYmFzaWNhbGx5LCB3aXRob3V0IHByZWZpeCkKLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgZm9yICJnbG9iYWwgdGFnIiAoYmFzaWNhbGx5LCB3aXRob3V0IHByZWZpeCkKLQkgKi8KLQlib29sZWFuIGlzR2xvYmFsVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgZm9yIG5vIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MgaW4gc291cmNlLgotCSAqIAotCSAqIFByb3ZpZGVkIGZvciBzb21lIHZlcnkgc3BlY2lhbCBjYXNlcyB3aGVuLCBmb3IgZXhhbXBsZSwgYW5kIEhUTUwgdGFnIGlzCi0JICogYXNzdW1lZCBpbiBhbiBIVE1MIGRvY3VtZW50IHRoYXQgZG9lcyBub3QgaGF2ZSBhIGxpdGVyYWwgSFRNTCB0YWcuCi0JICogCi0JICogSVNTVUU6IGNoZWNrIHdpdGggY2xpZW50cyB0byBzZWUgaWYgc3RpbGwgbmVlZGVkCi0JICogCi0JICogQHJldHVybiB0cnVlIG9yIG5vIHN0YXJ0IGFuZCB0aGUgZW5kIHRhZ3MgaW4gc291cmNlLgotCSAqLwotCWJvb2xlYW4gaXNJbXBsaWNpdFRhZygpOwotCi0JLyoqCi0JICogaXNKU1BUYWcgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogSVNTVUU6IGNoYW5nZSB0byBpc0NvbnRhaW5lckxhbmd1YWdlVGFnKFN0cmluZyB0eXBlKTsKLQkgKi8KLQlib29sZWFuIGlzSlNQVGFnKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgc3RhcnQgdGFnIGlzIGNsb3NlZC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgc3RhcnQgdGFnIGlzIGNsb3NlZC4KLQkgKi8KLQlib29sZWFuIGlzU3RhcnRUYWdDbG9zZWQoKTsKLQotCS8qKgotCSAqIHJldHVybnMgdHJ1ZSBpZiBpcyB4bWwgdGFnCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gc3BlYyB0aGlzIGJldHRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIHRydWUgaWYgaXMgeG1sIHRhZwotCSAqLwotCWJvb2xlYW4gaXNYTUxUYWcoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogbm90aWZ5RW5kVGFnQ2hhbmdlZAotCSAqIAotCSAqLwotCXZvaWQgbm90aWZ5RW5kVGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBub3RpZnlTdGFydFRhZ0NoYW5nZWQKLQkgKiAKLQkgKi8KLQl2b2lkIG5vdGlmeVN0YXJ0VGFnQ2hhbmdlZCgpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBTaWduaWZ5IHRoYXQgdGhpcyB0YWcgaXMgYSBjb21tZW50Ci0JICogCi0JICogRm9yIHVzZSBvbmx5IGJ5IHBhcnNlcnMuCi0JICogCi0JICovCi0Jdm9pZCBzZXRDb21tZW50VGFnKGJvb2xlYW4gaXNDb21tZW50VGFnKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogU2lnbmlmeSB0aGF0IHRoaXMgdGFnIGlzIGFuIGVtcHR5IHRhZwotCSAqIAotCSAqIEZvciB1c2Ugb25seSBieSBwYXJzZXJzCi0JICovCi0Jdm9pZCBzZXRFbXB0eVRhZyhib29sZWFuIGlzRW1wdHlUYWcpOwotCi0JLyoqCi0JICogTk9UIENMSUVOVCBBUEkKLQkgKiAKLQkgKiBTaWduaWZ5IHRoYXQgdGhpcyB0YWcgaXMgYSBKU1AgdGFnCi0JICogCi0JICogRm9yIHVzZSBvbmx5IGJ5IHBhcnNlcnMKLQkgKiAKLQkgKiBJU1NVRTogSSBoYXZlIGhhZCBvbmUgbm9uLXBhcnNpbmcgY2xpZW50IHdobyBoYXMgaGFkIHRvIHVzZSB0aGlzIC4uLgotCSAqIG5lZWQgdG8gY2hlY2sKLQkgKiAKLQkgKi8KLQl2b2lkIHNldEpTUFRhZyhib29sZWFuIGlzSlNQVGFnKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc0lkKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRC4gSXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIGZvciBET00gMy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRJZEF0dHJpYnV0ZU5TKFN0cmluZyBuYW1lc3BhY2VVUkksIFN0cmluZyBsb2NhbE5hbWUsIGJvb2xlYW4gaXNJZCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBmb3IgRE9NIDMuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SWRBdHRyaWJ1dGVOb2RlKEF0dHIgaWRBdHRyLCBib29sZWFuIGlzSWQpIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUVudGl0eS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRW50aXR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4ZmZiNDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NRW50aXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczYy5kb20uRW50aXR5OwotCi1wdWJsaWMgaW50ZXJmYWNlIElET01FbnRpdHkgZXh0ZW5kcyBFbnRpdHkgewotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELiBJcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIDMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJbnB1dEVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhtbEVuY29kaW5nKCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIElzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gMy4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFhtbFZlcnNpb24oKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01JbXBsZW1lbnRhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzE2ZDQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTUltcGxlbWVudGF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1wdWJsaWMgaW50ZXJmYWNlIElET01JbXBsZW1lbnRhdGlvbiB7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQuIFRoaXMgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSAzLgotCSAqIAotCSAqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBzcGVjaWFsaXplZCBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUKLQkgKiBzcGVjaWFsaXplZCBBUElzIG9mIHRoZSBzcGVjaWZpZWQgZmVhdHVyZSBhbmQgdmVyc2lvbiwgYXMgc3BlY2lmaWVkIGluIC4KLQkgKiBUaGUgc3BlY2lhbGl6ZWQgb2JqZWN0IG1heSBhbHNvIGJlIG9idGFpbmVkIGJ5IHVzaW5nIGJpbmRpbmctc3BlY2lmaWMKLQkgKiBjYXN0aW5nIG1ldGhvZHMgYnV0IGlzIG5vdCBuZWNlc3NhcmlseSBleHBlY3RlZCB0bywgYXMgZGlzY3Vzc2VkIGluIC4KLQkgKiBUaGlzIG1ldGhvZCBhbHNvIGFsbG93IHRoZSBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIHNwZWNpYWxpemVkCi0JICogb2JqZWN0cyB3aGljaCBkbyBub3Qgc3VwcG9ydCB0aGUgPGNvZGU+RE9NSW1wbGVtZW50YXRpb248L2NvZGU+Ci0JICogaW50ZXJmYWNlLgotCSAqIAotCSAqIEBwYXJhbSBmZWF0dXJlCi0JICogICAgICAgICAgICBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZSByZXF1ZXN0ZWQuIE5vdGUgdGhhdCBhbnkgcGx1cyBzaWduCi0JICogICAgICAgICAgICAiKyIgcHJlcGVuZGVkIHRvIHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIHdpbGwgYmUgaWdub3JlZAotCSAqICAgICAgICAgICAgc2luY2UgaXQgaXMgbm90IHNpZ25pZmljYW50IGluIHRoZSBjb250ZXh0IG9mIHRoaXMgbWV0aG9kLgotCSAqIEBwYXJhbSB2ZXJzaW9uCi0JICogICAgICAgICAgICBUaGlzIGlzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZmVhdHVyZSB0byB0ZXN0LgotCSAqIEByZXR1cm4gUmV0dXJucyBhbiBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyB0aGUgc3BlY2lhbGl6ZWQgQVBJcyBvZiB0aGUKLQkgKiAgICAgICAgIHNwZWNpZmllZCBmZWF0dXJlIGFuZCB2ZXJzaW9uLCBpZiBhbnksIG9yIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogICAgICAgICBpZiB0aGVyZSBpcyBubyBvYmplY3Qgd2hpY2ggaW1wbGVtZW50cyBpbnRlcmZhY2VzIGFzc29jaWF0ZWQKLQkgKiAgICAgICAgIHdpdGggdGhhdCBmZWF0dXJlLiBJZiB0aGUgPGNvZGU+RE9NT2JqZWN0PC9jb2RlPiByZXR1cm5lZCBieQotCSAqICAgICAgICAgdGhpcyBtZXRob2QgaW1wbGVtZW50cyB0aGUgPGNvZGU+RE9NSW1wbGVtZW50YXRpb248L2NvZGU+Ci0JICogICAgICAgICBpbnRlcmZhY2UsIGl0IG11c3QgZGVsZWdhdGUgdG8gdGhlIHByaW1hcnkgY29yZQotCSAqICAgICAgICAgPGNvZGU+RE9NSW1wbGVtZW50YXRpb248L2NvZGU+IGFuZCBub3QgcmV0dXJuIHJlc3VsdHMKLQkgKiAgICAgICAgIGluY29uc2lzdGVudCB3aXRoIHRoZSBwcmltYXJ5IGNvcmUKLQkgKiAgICAgICAgIDxjb2RlPkRPTUltcGxlbWVudGF0aW9uPC9jb2RlPiBzdWNoIGFzCi0JICogICAgICAgICA8Y29kZT5oYXNGZWF0dXJlPC9jb2RlPiwgPGNvZGU+Z2V0RmVhdHVyZTwvY29kZT4sIGV0Yy4KLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRGZWF0dXJlKFN0cmluZyBmZWF0dXJlLCBTdHJpbmcgdmVyc2lvbik7Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTU1vZGVsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Nb2RlbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMGFmOWRhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTU1vZGVsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5YTUxNb2RlbE5vdGlmaWVyOwotCi0vKioKLSAqIFByb3ZpZGVzIG1lYW5zIHRvIGdldCB0aGUgWE1MTW9kZWwgZm9ybSBvZiBJU3RydWN1dHJlZE1vZGVsLiBOb3QgdG8gYmUKLSAqIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IGNsaWVudHMuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElET01Nb2RlbCBleHRlbmRzIElTdHJ1Y3R1cmVkTW9kZWwgewotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgRE9NIERvY3VtZW50LgotCSAqIAotCSAqIEByZXR1cm4gdGhlIERPTSBEb2N1bWVudC4KLQkgKi8KLQlJRE9NRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIAotCSAqIFJldHVybnMgYW4gc291cmNlIGdlbmVyYXRvciBhcHByb3ByaWF0ZSBmb3IgdGhpcyBtb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIHRoZSBzb3VyY2UgZ2VuZXJhdG9yCi0JICovCi0JSVNvdXJjZUdlbmVyYXRvciBnZXRHZW5lcmF0b3IoKTsKLQotCS8qKgotCSAqIE5PVCBDTElFTlQgQVBJCi0JICogCi0JICogUmV0dXJucyBhbiBYTUxNb2RlbE5vdGlmaWVyLiBDbGllbnRzIHNob3VsZCBub3QgdXNlLgotCSAqIAotCSAqIElTU1VFOiBzaG91bGQgYmUgImludGVybmFsaXplZCIuCi0JICogCi0JICovCi0JWE1MTW9kZWxOb3RpZmllciBnZXRNb2RlbE5vdGlmaWVyKCk7Ci0KLQkvKioKLQkgKiBOT1QgQ0xJRU5UIEFQSQotCSAqCi0JICogU2V0cyB0aGUgbW9kZWwgbm90aWZpZXIgQ2xpZW50cyBzaG91bGQgbm90IHVzZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXZpZXcgd2l0aCBsZWdhY3kgY2xpZW50cy4KLQkgKi8KLQl2b2lkIHNldE1vZGVsTm90aWZpZXIoWE1MTW9kZWxOb3RpZmllciBub3RpZmllcik7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Ob2RlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lET01Ob2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzODljMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBkZXNjcmliZXMgdGhlIGV4dGVuZGVkIGZ1bmN0aW9uYWxpdHkgb2Ygb3VyIHNvdXJjZS1vcmllbnRlZAotICogRE9NLiBGaXJzdCwgb3VyIG5vZGVzIGV4dGVuZCB0aGUgdzNjIE5vZGUgaW50ZXJmYWNlLCBJbmRleGVkUmVnaW9uLCBhbmQKLSAqIElOb2RlTm90aWZpZXIuIFBsdXMsIGhhcyB0aGUgZXh0cmEgbWV0aG9kcyBjYWxsZWQgb3V0IGhlcmUuCi0gKiAKLSAqIElTU1VFOiB0aGUgJ3JlYWQtb25seScgQVBJIHNob3VsZCBiZSBicm9rZW4gb3V0IGluIHRoZWlyIG93biBpbnRlcmZhY2UKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKiAKLSAqLwotcHVibGljIGludGVyZmFjZSBJRE9NTm9kZSBleHRlbmRzIEluZGV4ZWRSZWdpb24sIElOb2RlTm90aWZpZXIsIE5vZGUgewotCi0JLyoqCi0JICogR2V0cyB0aGUgbGFzdCBzdHJ1Y3R1cmVkIGRvY3VtZW50IHJlZ2lvbiBvZiB0aGlzIG5vZGUuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gcmVzb2x2ZSBnZXRFbmQvZ2V0TGFzdCBjb25mdXNpb24uCi0JICogCi0JICogQHJldHVybiBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIC0gcmV0dXJucyB0aGUgbGFzdCBzdHJ1Y3R1cmVkCi0JICogICAgICAgICBkb2N1bWVudCByZWdpb24gYXNzb2NpYXRlZCB3aXRoCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIEdldHMgdGhlIGZpcnN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXNvbHZlIGdldEZpcnN0L2dldFN0YXJ0IGNvbmZ1c2lvbgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGZpcnN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBsYXN0IHN0cnVjdHVyZWQgZG9jdW1lbnQgcmVnaW9uIG9mIHRoaXMgbm9kZS4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byByZXNvbHZlIGdldEVuZC9nZXRMYXN0IGNvbmZ1c2lvbi4KLQkgKiAKLQkgKiBAcmV0dXJuIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gLSByZXR1cm5zIHRoZSBsYXN0IHN0cnVjdHVyZWQKLQkgKiAgICAgICAgIGRvY3VtZW50IHJlZ2lvbiBhc3NvY2lhdGVkIHdpdGgKLQkgKi8KLQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG1vZGVsIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuIFJldHVybnMgbnVsbCBpZiBub3QgcGFydAotCSAqIG9mIGFuIGFjdGl2ZSBtb2RlbC4KLQkgKiAKLQkgKiBAcmV0dXJuIElET01Nb2RlbCAtIHJldHVybnMgdGhlIElET01Nb2RlbCB0aGlzIG5vZGUgaXMgcGFydCBvZi4KLQkgKi8KLQlJRE9NTW9kZWwgZ2V0TW9kZWwoKTsKLQotCS8qKgotCSAqIEdldCdzIHRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgbm9kZQotCSAqIAotCSAqIElTU1VFOiBvbmx5IGltcGxlbWVudGVkL3VzZWQgYXQgYXR0cmlidXRlIGFuZCBEVEROb2RlcyAtLSBzaG91bGQgbW92ZS4KLQkgKiAKLQkgKiBAcmV0dXJuIElUZXh0UmVnaW9uIC0gcmV0dXJucyB0aGUgSVRleHRSZWdpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMKLQkgKiAgICAgICAgIE5vZGUuCi0JICogCi0JICogQGRlcHJlY2F0ZWQKLQkgKi8KLQlJVGV4dFJlZ2lvbiBnZXROYW1lUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBsaXRlcmFsIHNvdXJjZSByZXByZXNlbnRpbmcgdGhpcyBub2RlIGluIHNvdXJjZSBkb2N1bWVudC4KLQkgKiAKLQkgKiBJU1NVRTogbmVlZCB0byBmaXggaW1wbGVtZW50YXRpb24gdG8gbWF0Y2guCi0JICogCi0JICogQHJldHVybiB0aGUgbGl0ZXJhbCBzb3VyY2UgcmVwcmVzZW50aW5nIHRoaXMgbm9kZSBpbiBzb3VyY2UgZG9jdW1lbnQuCi0JICovCi0JU3RyaW5nIGdldFNvdXJjZSgpOwotCi0JLyoqCi0JICogR2V0cyB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIHJlc29sdmUgZ2V0Rmlyc3QvZ2V0U3RhcnQgY29uZnVzaW9uCi0JICogCi0JICogQHJldHVybiB0aGUgZmlyc3Qgc3RydWN0dXJlZCBkb2N1bWVudCByZWdpb24gb2YgdGhpcyBub2RlLgotCSAqLwotCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQgdGhhdCB1bmRlcmxpZXMgdGhpcyBub2RlJ3MgbW9kZWwuCi0JICogCi0JICogUmV0dXJucyBudWxsIGlmIHRoaXMgbm9kZSBpcyBub3QgYWN0aXZlbHkgcGFydCBvZiBhIHNvdXJjZSBkb2N1bWVudC4gSW4KLQkgKiBjb250cmFzdCwgaW4gdGhlIHB1cmUgRE9NIHdvcmxkLCAib3duaW5nIGRvY3VtZW50IiBpcyBub3QgbnVsbCBldmVuCi0JICogYWZ0ZXIgYSBub2RlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgRE9NLgotCSAqIAotCSAqIElTU1VFOiB3ZSBuZWVkIHRvIGZpeCBvdXIgaW1wbGVtZW50YXRpb24gdG8gbWF0Y2ggdGhpcyBzcGVjLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIHN0cnVjdHVyZWQgZG9jdW1lbnQuCi0JICovCi0JSVN0cnVjdHVyZWREb2N1bWVudCBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCS8qKgotCSAqIEdldCdzIHRoZSByZWdpb24gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIG5vZGUgaWYgb25seSBvbmUKLQkgKiBJVGV4dFJlZ2lvbiwgbnVsbCBvdGhlcndpc2UuCi0JICogCi0JICogSVNTVUU6IG9ubHkgaW1wbGVtZW50ZWQvdXNlZCBhdCBhdHRyaWJ1dGUgbGV2ZWwsIG1vdmUgImRvd24iLgotCSAqIAotCSAqIEByZXR1cm4gSVRleHRSZWdpb24gLSByZXR1cm5zIHRoZSBJVGV4dFJlZ2lvbiBhc3NvY2lhdGVkIHdpdGggdGhpcwotCSAqICAgICAgICAgTm9kZS4KLQkgKiAKLQkgKiBAZGVwcmVjYXRlZAotCSAqLwotCUlUZXh0UmVnaW9uIGdldFZhbHVlUmVnaW9uKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgc291cmNlIG9mIHRoaXMgbm9kZSwgYnV0IHdpdGgKLQkgKiBjaGFyYWN0ZXIgZW50aWVzIGNvbnZlcnRlZCAoZS5nLiAmbHQ7IGlzIGNvbnZlcnRlZCB0byAnPCcpLgotCSAqIAotCSAqIElTU1VFOiBuZWVkIHRvIGJldHRlciBzcGVjIGV4dGVudCBvZiB0aGlzIGNvbnZlcnNpb24sIHdlIG1heSBub3Qga25vdwotCSAqIGFsbCBjaGFyYWN0ZXIgZW50aXRpZXMuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gZml4IGltcGxlbWVudGF0aW9uIHRvIG1hdGNoIHNwZWMuCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgLSBnZXQncyB0aGUgc291cmNlIG9mIHRoaXMgTm9kZS4KLQkgKi8KLQlTdHJpbmcgZ2V0VmFsdWVTb3VyY2UoKTsKLQotCS8qKgotCSAqIFVzZWQgdG8ga25vdyByZWFkLW9ubHkgc3RhdGUgb2YgY2hpbGRyZW4uCi0JICogCi0JICogQHJldHVybiBib29sZWFuIFdoZXRoZXIgY2hpbGRyZW4gb2YgdGhlIGVsZW1lbnQgY2FuIGJlIGFwcGVuZGVkIG9yCi0JICogICAgICAgICByZW1vdmVkLgotCSAqLwotCWJvb2xlYW4gaXNDaGlsZEVkaXRhYmxlKCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgdGFnIGlzIGNsb3NlZCBpbiBzb3VyY2UuCi0JICogCi0JICogSW4gb3VyIHNvdXJjZSBvcmllbnQgRE9NIHdlIHNvbWV0aW1lcyBlbmQgYSBOb2RlIHdpdGhvdXQgaXQgYmVpbmcKLQkgKiBleHBsaWNpdGx5IGNsb3NlZCBpbiBzb3VyY2UuCi0JICogCi0JICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiBub2RlIGlzIGNsb3NlZAotCSAqLwotCWJvb2xlYW4gaXNDbG9zZWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG5vZGUgY2FuIGNvbnRhaW4gY2hpbGRyZW4uCi0JICogCi0JICogQHJldHVybiBib29sZWFuIC0gdHJ1ZSBpZiB0aGlzIG5vZGUgY2FuIGNvbnRhaW4gY2hpbGRyZW4uCi0JICovCi0JYm9vbGVhbiBpc0NvbnRhaW5lcigpOwotCi0JLyoqCi0JICogVXNlZCB0byBrbm93IHJlYWQtb25seSBzdGF0ZSBvZiBkYXRhLgotCSAqIAotCSAqLwotCWJvb2xlYW4gaXNEYXRhRWRpdGFibGUoKTsKLQotCS8qKgotCSAqIFNldCdzIHJlYWRvbmx5IHN0YXRlIG9mIGNoaWxkcmVuCi0JICogCi0JICovCi0Jdm9pZCBzZXRDaGlsZEVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpOwotCi0JLyoqCi0JICogU2V0J3MgcmVhZG9ubHkgc3RhdGUgb2YgZGF0YQotCSAqIAotCSAqLwotCXZvaWQgc2V0RGF0YUVkaXRhYmxlKGJvb2xlYW4gZWRpdGFibGUpOwotCi0JLyoqCi0JICogU2V0cyByZWFkb25seSBzdGF0ZSBvZiBkYXRhCi0JICogCi0JICogZmFzdGVyIGFwcHJvYWNoIHRvIHNldCByZWFkLW9ubHkgc3RhdGUuCi0JICovCi0Jdm9pZCBzZXRFZGl0YWJsZShib29sZWFuIGVkaXRhYmxlLCBib29sZWFuIGRlZXApOwotCi0JLyoqCi0JICogU2V0cyB0aGUgc3BlY2lmaWVkIHJhdyBzb3VyY2UgdG8gdGhlIFRleHQgbm9kZS4gVGhyb3dzCi0JICogSW52YWxpZENoYXJhY3RlckV4Y2VwdGlvbiB3aGVuIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSBpbmNsdWRlcwotCSAqIGludmFsaWQgY2hhcmFjdGVycywgc3VjaCBhcywgJyA8JywgJz4nIGFuZCAnJicuIFZhbGlkIGNoYXJhY3RlcgotCSAqIGVudGl0aWVzLCBzdWNoIGFzLCAiJmFtcDtsdDsiLCBhcmUgYWNjZXB0ZWQuCi0JICovCi0Jdm9pZCBzZXRTb3VyY2UoU3RyaW5nIHNvdXJjZSkgdGhyb3dzIEludmFsaWRDaGFyYWN0ZXJFeGNlcHRpb247Ci0KLQkvKioKLQkgKiBTZXRzIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSB0byB0aGUgVGV4dCBvciBBdHRyIG5vZGUncyB2YWx1ZS4gV2hlbgotCSAqIHRoZSBzcGVjaWZpZWQgcmF3IHNvdXJjZSBpbmNsdWRlcyBpbnZhbGlkIGNoYXJhY3RlcnMsIHN1Y2ggYXMsICcgPCcsCi0JICogJz4nIGFuZCAnJicsIGNvbnZlcnRzIHRoZW0uIFZhbGlkIGNoYXJhY3RlciBlbnRpdGllcywgc3VjaCBhcywKLQkgKiAiJmFtcDtsdDsiLCBhcmUgYWNjZXB0ZWQuCi0JICovCi0Jdm9pZCBzZXRWYWx1ZVNvdXJjZShTdHJpbmcgc291cmNlKTsKLQkKLQkKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHNob3J0IGNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKE5vZGUgb3RoZXIpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QmFzZVVSSSgpOwotCi0JLyoqCi0JICogTk9UIElNUExFTUVOVEVELCBpcyBkZWZpbmVkIGhlcmUgaW4gcHJlcGFyYXRpb24gb2YgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEZlYXR1cmUoU3RyaW5nIGZlYXR1cmUsIFN0cmluZyB2ZXJzaW9uKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0Q29udGVudCgpIHRocm93cyBET01FeGNlcHRpb247Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0VXNlckRhdGEoU3RyaW5nIGtleSk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE5hbWVzcGFjZShTdHJpbmcgbmFtZXNwYWNlVVJJKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFcXVhbE5vZGUoTm9kZSBhcmcpOwotCQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNTYW1lTm9kZShOb2RlIG90aGVyKTsKLQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2VVUkkoU3RyaW5nIHByZWZpeCk7Ci0KLQkvKioKLQkgKiBOT1QgSU1QTEVNRU5URUQsIGlzIGRlZmluZWQgaGVyZSBpbiBwcmVwYXJhdGlvbiBvZiBET00gTGV2ZWwgMwotCSAqLwotCXB1YmxpYyBTdHJpbmcgbG9va3VwUHJlZml4KFN0cmluZyBuYW1lc3BhY2VVUkkpOwotCQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIHZvaWQgc2V0VGV4dENvbnRlbnQoU3RyaW5nIHRleHRDb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCQotCQotCS8qKgotCSAqIE5PVCBJTVBMRU1FTlRFRCwgaXMgZGVmaW5lZCBoZXJlIGluIHByZXBhcmF0aW9uIG9mIERPTSBMZXZlbCAzCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZCgpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NVGV4dC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9kb2N1bWVudC9JRE9NVGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzg4Yzc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSURPTVRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudDsKLQotCi0KLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBleHRlbnNpb25zIHRvIGNvcnJlc3BvbmRpbmcgRE9NIGludGVyZmFjZSB0byBlbmFibGUKLSAqIGZ1bmN0aW9ucyBmb3Igc291cmNlIGVkaXRpbmcgYW5kIGluY3JlbWVudGFsIHBhcnNpbmcuCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSURPTVRleHQgZXh0ZW5kcyBJRE9NTm9kZSwgVGV4dCB7Ci0KLQkvKioKLQkgKiBOT1QgQVBJIC0gY2FuIGJlIGVsaW1pbmF0ZWQgb3IgbW92ZWQgdG8gbHRrIGxldmVsCi0JICogCi0JICogQXBwZW5kcyB0aGUgY29udGVudCBvZiB0aGUgdGV4dCBub2RlCi0JICogCi0JICogQHBhcmFtIHRleHQgLQotCSAqICAgICAgICAgICAgdGhlIFRleHQgdG8gYXBwZW5kLgotCSAqLwotCXZvaWQgYXBwZW5kVGV4dChUZXh0IHRleHQpOwotCi0JLyoqCi0JICogTk9UIEFQSSAtIGNhbiBiZSBlbGltaW5hdGVkIG9yIG1vdmVkIHRvIGx0ayBsZXZlbAotCSAqIAotCSAqIFJldHVybnMgdHJ1ZSBpZiBpcyBub3QgdmFsaWQuCi0JICovCi0JYm9vbGVhbiBpc0ludmFsaWQoKTsKLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBpcyBlbnRpcmVseSB3aGl0ZSBzcGFjZS4KLQkgKiAKLQkgKiBUaGlzIGlzIGludGVuZWQgdG8gYmUgYmV0dGVyIHBlcmZvcm1pbmcgdGhhdCBhbGwgY2xpZW50cyBnZXR0aW5nIHRoZQotCSAqIHNvdXJjZSwgYW5kIGNoZWNraW5nIHRoZW1zZWx2ZXMuCi0JICogCi0JICogSVNTVUU6IG5lZWQgdG8gY2xhcmlmeSBpZiBpbXBsZW1lbnRhdGlvbiBpcyBwdXJlIHRvICJ3aGl0ZSBzcGFjZSIgYXMKLQkgKiBwZXIgRE9NIHNwZWM/IEhlcmUgaXMgdGhlIERPTSBzcGVjOgotCSAqIAotCSAqIFJldHVybnMgd2hldGhlciB0aGlzIHRleHQgbm9kZSBjb250YWlucyA8YQotCSAqIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDQvUkVDLXhtbC1pbmZvc2V0LTIwMDQwMjA0I2luZm9pdGVtLmNoYXJhY3Rlcic+Ci0JICogZWxlbWVudCBjb250ZW50IHdoaXRlc3BhY2U8L2E+LCBvZnRlbiBhYnVzaXZlbHkgY2FsbGVkICJpZ25vcmFibGUKLQkgKiB3aGl0ZXNwYWNlIi4gVGhlIHRleHQgbm9kZSBpcyBkZXRlcm1pbmVkIHRvIGNvbnRhaW4gd2hpdGVzcGFjZSBpbgotCSAqIGVsZW1lbnQgY29udGVudCBkdXJpbmcgdGhlIGxvYWQgb2YgdGhlIGRvY3VtZW50IG9yIGlmIHZhbGlkYXRpb24gb2NjdXJzCi0JICogd2hpbGUgdXNpbmcgPGNvZGU+RG9jdW1lbnQubm9ybWFsaXplRG9jdW1lbnQoKTwvY29kZT4uCi0JICogCi0JICogQHNlZSBET00gTGV2ZWwgMwotCSAqIAotCSAqIEByZXR1cm4gdHJ1ZSBpZiBpcyBlbnRpcmVseSB3aGl0ZSBzcGFjZS4KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGlzRWxlbWVudENvbnRlbnRXaGl0ZXNwYWNlKCk7Ci0KLQkvKioKLQkgKiBOT1QgWUVUIElNUExFTVRFTlRFRCBidXQgZXhpc3RzIGhlcmUgaW50ZXJmYWNlIGluIHByZXBhcmF0aW9uIGZvciBET00zCi0JICogCi0JICogUmV0dXJucyBhbGwgdGV4dCBvZiA8Y29kZT5UZXh0PC9jb2RlPiBub2RlcyBsb2dpY2FsbHktYWRqYWNlbnQgdGV4dAotCSAqIG5vZGVzIHRvIHRoaXMgbm9kZSwgY29uY2F0ZW5hdGVkIGluIGRvY3VtZW50IG9yZGVyLiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgZXhhbXBsZSBiZWxvdyA8Y29kZT53aG9sZVRleHQ8L2NvZGU+IG9uIHRoZQotCSAqIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdCBjb250YWlucyAiYmFyIiByZXR1cm5zICJiYXJmb28iLCB3aGlsZSBvbgotCSAqIHRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIHRoYXQgY29udGFpbnMgImZvbyIgaXQgcmV0dXJucyAiYmFyZm9vIi4KLQkgKiAKLQkgKiBAc2VlIERPTSBMZXZlbCAzCi0JICogCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRXaG9sZVRleHQoKTsKLQotCS8qKgotCSAqIE5PVCBZRVQgSU1QTEVNVEVOVEVEIGJ1dCBleGlzdHMgaGVyZSBpbnRlcmZhY2UgaW4gcHJlcGFyYXRpb24gZm9yIERPTTMKLQkgKiAKLQkgKiBSZXBsYWNlcyB0aGUgdGV4dCBvZiB0aGUgY3VycmVudCBub2RlIGFuZCBhbGwgbG9naWNhbGx5LWFkamFjZW50IHRleHQKLQkgKiBub2RlcyB3aXRoIHRoZSBzcGVjaWZpZWQgdGV4dC4gQWxsIGxvZ2ljYWxseS1hZGphY2VudCB0ZXh0IG5vZGVzIGFyZQotCSAqIHJlbW92ZWQgaW5jbHVkaW5nIHRoZSBjdXJyZW50IG5vZGUgdW5sZXNzIGl0IHdhcyB0aGUgcmVjaXBpZW50IG9mIHRoZQotCSAqIHJlcGxhY2VtZW50IHRleHQuIDxicj4KLQkgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBub2RlIHdoaWNoIHJlY2VpdmVkIHRoZSByZXBsYWNlbWVudCB0ZXh0LiBUaGUKLQkgKiByZXR1cm5lZCBub2RlIGlzOgotCSAqIDx1bD4KLQkgKiA8bGk+PGNvZGU+bnVsbDwvY29kZT4sIHdoZW4gdGhlIHJlcGxhY2VtZW50IHRleHQgaXMgdGhlIGVtcHR5Ci0JICogc3RyaW5nOyA8L2xpPgotCSAqIDxsaT50aGUgY3VycmVudCBub2RlLCBleGNlcHQgd2hlbiB0aGUgY3VycmVudCBub2RlIGlzIHJlYWQtb25seTsgPC9saT4KLQkgKiA8bGk+IGEgbmV3IDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgb2YgdGhlIHNhbWUgdHlwZSAoCi0JICogPGNvZGU+VGV4dDwvY29kZT4gb3IgPGNvZGU+Q0RBVEFTZWN0aW9uPC9jb2RlPikgYXMgdGhlIGN1cnJlbnQKLQkgKiBub2RlIGluc2VydGVkIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVwbGFjZW1lbnQuIDwvbGk+Ci0JICogPC91bD4KLQkgKiA8YnI+Ci0JICogRm9yIGluc3RhbmNlLCBpbiB0aGUgYWJvdmUgZXhhbXBsZSBjYWxsaW5nCi0JICogPGNvZGU+cmVwbGFjZVdob2xlVGV4dDwvY29kZT4gb24gdGhlIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGUgdGhhdAotCSAqIGNvbnRhaW5zICJiYXIiIHdpdGggInlvIiBpbiBhcmd1bWVudCByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmc6IDxicj4KLQkgKiBXaGVyZSB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZCBhcmUgcmVhZC1vbmx5IGRlc2NlbmRhbnRzIG9mIGFuCi0JICogPGNvZGU+RW50aXR5UmVmZXJlbmNlPC9jb2RlPiwgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4KLQkgKiBtdXN0IGJlIHJlbW92ZWQgaW5zdGVhZCBvZiB0aGUgcmVhZC1vbmx5IG5vZGVzLiBJZiBhbnkKLQkgKiA8Y29kZT5FbnRpdHlSZWZlcmVuY2U8L2NvZGU+IHRvIGJlIHJlbW92ZWQgaGFzIGRlc2NlbmRhbnRzIHRoYXQgYXJlCi0JICogbm90IDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4sIDxjb2RlPlRleHQ8L2NvZGU+LCBvcgotCSAqIDxjb2RlPkNEQVRBU2VjdGlvbjwvY29kZT4gbm9kZXMsIHRoZSA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPgotCSAqIG1ldGhvZCBtdXN0IGZhaWwgYmVmb3JlIHBlcmZvcm1pbmcgYW55IG1vZGlmaWNhdGlvbiBvZiB0aGUgZG9jdW1lbnQsCi0JICogcmFpc2luZyBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gd2l0aCB0aGUgY29kZQotCSAqIDxjb2RlPk5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjwvY29kZT4uIDxicj4KLQkgKiBGb3IgaW5zdGFuY2UsIGluIHRoZSBleGFtcGxlIGJlbG93IGNhbGxpbmcKLQkgKiA8Y29kZT5yZXBsYWNlV2hvbGVUZXh0PC9jb2RlPiBvbiB0aGUgPGNvZGU+VGV4dDwvY29kZT4gbm9kZSB0aGF0Ci0JICogY29udGFpbnMgImJhciIgZmFpbHMsIGJlY2F1c2UgdGhlIDxjb2RlPkVudGl0eVJlZmVyZW5jZTwvY29kZT4gbm9kZQotCSAqICJlbnQiIGNvbnRhaW5zIGFuIDxjb2RlPkVsZW1lbnQ8L2NvZGU+IG5vZGUgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnQKLQkgKiAgICAgICAgICAgIFRoZSBjb250ZW50IG9mIHRoZSByZXBsYWNpbmcgPGNvZGU+VGV4dDwvY29kZT4gbm9kZS4KLQkgKiBAcmV0dXJuIFRoZSA8Y29kZT5UZXh0PC9jb2RlPiBub2RlIGNyZWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkCi0JICogICAgICAgICBjb250ZW50LgotCSAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0JICogICAgICAgICAgICAgICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgb25lIG9mIHRoZQotCSAqICAgICAgICAgICAgICAgIDxjb2RlPlRleHQ8L2NvZGU+IG5vZGVzIGJlaW5nIHJlcGxhY2VkIGlzIHJlYWRvbmx5LgotCSAqIEBzZWUgRE9NIExldmVsIDMKLQkgKi8KLQlwdWJsaWMgVGV4dCByZXBsYWNlV2hvbGVUZXh0KFN0cmluZyBjb250ZW50KSB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2RvY3VtZW50L0lTb3VyY2VHZW5lcmF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSVNvdXJjZUdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjU3NmNmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZG9jdW1lbnQvSVNvdXJjZUdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5DREFUQVNlY3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uQ29tbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbnRpdHlSZWZlcmVuY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiAKLSAqIElTb3VyY2VHZW5lcmF0b3IgYWxsb3dzIERPTSBtb2RlbHMgdG8gZ2VuZXJhdGUgc291cmNlIGFwcHJvcHJpYXRlIGZvciB0aGVpcgotICogcGFyYW1ldGVyLCByZWxhdGl2ZSB0byB0aGUgbW9kZWwgdGhhdCBwcm92aWRlcyB0aGUgc291cmNlIGdlbmVyYXRvci4KLSAqIAotICovCi0KLXB1YmxpYyBpbnRlcmZhY2UgSVNvdXJjZUdlbmVyYXRvciB7Ci0KLQkvKioKLQkgKiBHZW5lcmF0ZSBhdHRyaWJ1dGUgbmFtZS4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0ciAtCi0JICogICAgICAgICAgICB0aGUgQXR0cgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyTmFtZShBdHRyIGF0dHIpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVBdHRyVmFsdWUKLQkgKiAKLQkgKiBAcGFyYW0gYXR0ciAtCi0JICogICAgICAgICAgICB0aGUgQXR0cgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIGF0dHIgLQotCSAqICAgICAgICAgICAgdGhlIEF0dHIKLQkgKiBAcGFyYW0gY2hhciAtCi0JICogICAgICAgICAgICB0aGUgdHlwZSBvZiBxdW90ZSBkZXNpcmVkICgnIG9yICIpLgotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVBdHRyVmFsdWUoQXR0ciBhdHRyLCBjaGFyIHF1b3RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQXR0clZhbHVlCi0JICogCi0JICogQHBhcmFtIHZhbHVlCi0JICogICAgICAgICAgICB0aGUgU3RyaW5nIHZhbHVlCi0JICogQHBhcmFtIGNoYXIgLQotCSAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgcXVvdGUgZGVzaXJlZCAoJyBvciAiKS4KLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQXR0clZhbHVlKFN0cmluZyB2YWx1ZSwgY2hhciBxdW90ZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNEQVRBU2VjdGlvbiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgQ0RBVEFTZWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNEQVRBU2VjdGlvbihDREFUQVNlY3Rpb24gY2RhdGEpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVDaGlsZCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZwotCSAqIEBwYXJhbSBOb2RlCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUNoaWxkKE5vZGUgcGFyZW50Tm9kZSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUNsb3NlVGFnCi0JICogCi0JICogQHBhcmFtIG5vZGUgLQotCSAqICAgICAgICAgICAgdGhlIE5vZGUKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlQ2xvc2VUYWcoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlQ29tbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWVudAotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uQ29tbWVudAotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVDb21tZW50KENvbW1lbnQgY29tbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZURvY3R5cGUgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGRvY1R5cGUKLQkgKiAgICAgICAgICAgIERvY3VtZW50VHlwZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVEb2N0eXBlKERvY3VtZW50VHlwZSBkb2NUeXBlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRWxlbWVudCBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZWxlbWVudCAtCi0JICogICAgICAgICAgICBFbGVtZW50Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZUVsZW1lbnQoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlRW5kVGFnIG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW5kVGFnKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZUVudGl0eVJlZiBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gZW50aXR5UmVmCi0JICogICAgICAgICAgICBFbnRpdHlSZWZlcmVuY2UKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlRW50aXR5UmVmKEVudGl0eVJlZmVyZW5jZSBlbnRpdHlSZWYpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVQSSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gcGkgLQotCSAqICAgICAgICAgICAgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVBJKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSk7Ci0KLQkvKioKLQkgKiBnZW5lcmF0ZVNvdXJjZSBtZXRob2QKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZSAtCi0JICogICAgICAgICAgICB0aGUgTm9kZQotCSAqIEByZXR1cm4gU3RyaW5nIC0gdGhlIHN0cmluZyBnZW5lcmF0ZWQKLQkgKi8KLQlTdHJpbmcgZ2VuZXJhdGVTb3VyY2UoTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIGdlbmVyYXRlU3RhcnRUYWcgbWV0aG9kCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiAgICAgICAgICAgIEVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlU3RhcnRUYWcoRWxlbWVudCBlbGVtZW50KTsKLQotCS8qKgotCSAqIEdlbmVyYXRlIHRhZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIGVsZW1lbnQKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVGFnTmFtZShFbGVtZW50IGVsZW1lbnQpOwotCi0JLyoqCi0JICogZ2VuZXJhdGVUZXh0IG1ldGhvZAotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0Ci0JICogQHJldHVybiBTdHJpbmcgLSB0aGUgc3RyaW5nIGdlbmVyYXRlZAotCSAqLwotCVN0cmluZyBnZW5lcmF0ZVRleHQoVGV4dCB0ZXh0KTsKLQotCS8qKgotCSAqIGdlbmVyYXRlIHRleHQgZGF0YQotCSAqIAotCSAqIEBwYXJhbSB0ZXh0IC0KLQkgKiAgICAgICAgICAgIHRoZSBUZXh0Ci0JICogQHBhcmFtIGRhdGEgLQotCSAqICAgICAgICAgICAgdGhlIGRhdGEKLQkgKiBAcmV0dXJuIFN0cmluZyAtIHRoZSBzdHJpbmcgZ2VuZXJhdGVkCi0JICovCi0JU3RyaW5nIGdlbmVyYXRlVGV4dERhdGEoVGV4dCB0ZXh0LCBTdHJpbmcgZGF0YSk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Db21tZW50Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvQ29tbWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZmNTJmZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Db21tZW50Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDb21tZW50Tm9kZUZvcm1hdHRlciBleHRlbmRzIE5vZGVGb3JtYXR0ZXIgewotCi0JcHJvdGVjdGVkIFN0cmluZyBhZGp1c3RJbmRlbnRhdGlvbnMoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBsaW5lSW5kZW50LCBTdHJpbmcgc2luZ2xlSW5kZW50KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJaW50IGluZGV4T2ZMaW5lRGVsaW1pdGVyID0gU3RyaW5nVXRpbHMuaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZyk7Ci0JCXJlc3VsdCA9IGFTdHJpbmcuc3Vic3RyaW5nKDAsIGluZGV4T2ZMaW5lRGVsaW1pdGVyKTsKLQkJd2hpbGUgKGluZGV4T2ZMaW5lRGVsaW1pdGVyICE9IC0xKSB7Ci0JCQkvLyBCZWZvcmUgZmluZCB0aGUgbmV4dCBMaW5lRGVsaW1pdGVyLCB3ZSBoYXZlIHRvIGZpZ3VyZSBvdXQgdGhlCi0JCQkvLyBzaXplIG9mIHRoZSBjdXJyZW50IExpbmVEZWxpbWl0ZXIKLQkJCS8vIHNvIHdlIGNhbiBmaWd1cmUgb3V0IGhvdyBtYW55IGJ5dGVzIHRvIHNraXAgYmVmb3JlIGZpbmRpbmcgdGhlCi0JCQkvLyBuZXh0IExpbmVEZWxpbWl0ZXIuCi0JCQkvLyBPdGhlcndpc2UsIHdlIG1heSB0cmVhdCB0aGUgTEYgaW4gQ1JMRiBhcyB0aGUgbmV4dAotCQkJLy8gTGluZURlbGltaXRlci4KLQkJCWludCBsaW5lRGVsaW1pdGVyU2l6ZSA9IDE7Ci0JCQlpZiAoYVN0cmluZy5sZW5ndGgoKSA+PSBpbmRleE9mTGluZURlbGltaXRlciArIDIgJiYgYVN0cmluZy5zdWJzdHJpbmcoaW5kZXhPZkxpbmVEZWxpbWl0ZXIsIGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMSkuY29tcGFyZVRvKENSKSA9PSAwICYmIGFTdHJpbmcuc3Vic3RyaW5nKGluZGV4T2ZMaW5lRGVsaW1pdGVyICsgMSwgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyAyKS5jb21wYXJlVG8oTEYpID09IDApCi0JCQkJbGluZURlbGltaXRlclNpemUgPSAyOwotCi0JCQlpbnQgaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyID0gU3RyaW5nVXRpbHMuaW5kZXhPZkxpbmVEZWxpbWl0ZXIoYVN0cmluZywgaW5kZXhPZkxpbmVEZWxpbWl0ZXIgKyBsaW5lRGVsaW1pdGVyU2l6ZSk7Ci0JCQlpbnQgaW5kZXhPZk5vbmJsYW5rID0gU3RyaW5nVXRpbHMuaW5kZXhPZk5vbmJsYW5rKGFTdHJpbmcsIGluZGV4T2ZMaW5lRGVsaW1pdGVyKTsKLQotCQkJaWYgKGluZGV4T2ZOb25ibGFuayAhPSAtMSkgewotCQkJCWlmIChpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgPT0gLTEpIHsKLQkJCQkJLy8gbGFzdCBsaW5lOyBjb3B5IHRpbGwgdGhlIGVuZAotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudCArIHNpbmdsZUluZGVudCArIGFTdHJpbmcuc3Vic3RyaW5nKGluZGV4T2ZOb25ibGFuayk7Ci0JCQkJfSBlbHNlIGlmIChpbmRleE9mTmV4dExpbmVEZWxpbWl0ZXIgIT0gLTEgJiYgaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyIDwgaW5kZXhPZk5vbmJsYW5rKSB7Ci0JCQkJCS8vIGJsYW5rIGxpbmU7IGp1c3QgYWRkIGEgaW5kZW50Ci0JCQkJCXJlc3VsdCArPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0gZWxzZSB7Ci0JCQkJCS8vIGNvcHkgYWxsIHRleHQgYmV0d2VlbiBpbmRleE9mTm9uYmxhbmsgYW5kCi0JCQkJCS8vIGluZGV4T2ZOZXh0TGluZURlbGltaXRlcgotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudCArIHNpbmdsZUluZGVudCArIGFTdHJpbmcuc3Vic3RyaW5nKGluZGV4T2ZOb25ibGFuaywgaW5kZXhPZk5leHRMaW5lRGVsaW1pdGVyKTsKLQkJCQl9Ci0KLQkJCQlpbmRleE9mTGluZURlbGltaXRlciA9IGluZGV4T2ZOZXh0TGluZURlbGltaXRlcjsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGluZGV4T2ZOZXh0TGluZURlbGltaXRlciA9PSAtMSkgewotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudDsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBibGFuayBsaW5lOyBqdXN0IGFkZCBhIGluZGVudAotCQkJCQlyZXN1bHQgKz0gbGluZUluZGVudCArIHNpbmdsZUluZGVudDsKLQkJCQl9Ci0KLQkJCQlpbmRleE9mTGluZURlbGltaXRlciA9IGluZGV4T2ZOZXh0TGluZURlbGltaXRlcjsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQkvLyBsaW5lRGVsaW1pdGVyRm91bmQgbWVhbnMgbXVsdGkgbGluZSBjb21tZW50Ci0JCQlTdHJpbmcgbm9kZVZhbHVlID0gbm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCWJvb2xlYW4gbGluZURlbGltaXRlckZvdW5kSW5Db21tZW50ID0gU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKG5vZGVWYWx1ZSk7Ci0KLQkJCWlmIChsaW5lRGVsaW1pdGVyRm91bmRJbkNvbW1lbnQpIHsKLQkJCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYmVmb3JlIG5vZGUKLQkJCQlmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCQkvLyBhZGp1c3QgaW5kZW50YXRpb25zIGluIG11bHRpIGxpbmUgY29tbWVudAotCQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCQkJCVN0cmluZyBzaW5nbGVJbmRlbnQgPSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldEluZGVudCgpOwotCQkJCVN0cmluZyBuZXdOb2RldmFsdWUgPSBhZGp1c3RJbmRlbnRhdGlvbnMobm9kZVZhbHVlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCwgc2luZ2xlSW5kZW50KTsKLQkJCQlpZiAobm9kZVZhbHVlLmNvbXBhcmVUbyhuZXdOb2RldmFsdWUpICE9IDApCi0JCQkJCW5vZGUuc2V0Tm9kZVZhbHVlKG5ld05vZGV2YWx1ZSk7Ci0JCQl9Ci0KLQkJCWlmICghbm9kZUhhc1NpYmxpbmdzKG5vZGUpIHx8IChub2RlLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwgJiYgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmICFTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVmFsdWUoKSkgJiYgbm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpKSB7Ci0JCQkJLy8gc2luZ2xlIGNoaWxkCi0JCQkJLy8gb3IgaW5saW5lIGNvbW1lbnQgYWZ0ZXIgdGV4dAotCQkJCS8vIGRvIG5vdGhpbmcKLQkJCX0gZWxzZQotCQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBhZnRlciBub2RlCi0JCQkJZm9ybWF0SW5kZW50YXRpb25BZnRlck5vZGUobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Eb2N1bWVudE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0RvY3VtZW50Tm9kZUZvcm1hdHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjZiZTIyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0RvY3VtZW50Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICBKZXNwZXIgU3RlZW4gTfhsbGVyIC0geG1sOnNwYWNlPSdwcmVzZXJ2ZScgc3VwcG9ydAotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRG9jdW1lbnROb2RlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Q2hpbGRyZW4oSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJU3RyaW5nIHNpbmdsZUluZGVudCA9IGdldEZvcm1hdFByZWZlcmVuY2VzKCkuZ2V0SW5kZW50KCk7Ci0JCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCAmJiAoZlByb2dyZXNzTW9uaXRvciA9PSBudWxsIHx8ICFmUHJvZ3Jlc3NNb25pdG9yLmlzQ2FuY2VsZWQoKSkpIHsKLQkJCS8vIG5vcm1hbGl6ZSBub2RlIGZpcnN0IHRvIGNvbWJpbmUgYWRqYWNlbnQgdGV4dCBub2RlcwotCQkJbm9kZS5ub3JtYWxpemUoKTsKLQotCQkJSURPTU5vZGUgbmV4dENoaWxkID0gKElET01Ob2RlKSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChuZXh0Q2hpbGQgIT0gbnVsbCkgewotCQkJCUlET01Ob2RlIGVhY2hDaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gKElET01Ob2RlKSBlYWNoQ2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gZ2V0Rm9ybWF0dGVyKGVhY2hDaGlsZE5vZGUpOwotCQkJCUlTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBjaGlsZEZvcm1hdENvbnRyYWludHMgPSBmb3JtYXR0ZXIuZ2V0Rm9ybWF0Q29udHJhaW50cygpOwotCQkJCVN0cmluZyBjaGlsZEluZGVudCA9IGxpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQkJY2hpbGRGb3JtYXRDb250cmFpbnRzLnNldEN1cnJlbnRJbmRlbnQoY2hpbGRJbmRlbnQpOwotCQkJCWNoaWxkRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCQkJY2hpbGRGb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpOwotCi0JCQkJLy8gZm9ybWF0IGVhY2ggY2hpbGQKLQkJCQlmb3JtYXR0ZXIuZm9ybWF0KGVhY2hDaGlsZE5vZGUsIGNoaWxkRm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCQlpZiAobmV4dENoaWxkICE9IG51bGwgJiYgbmV4dENoaWxkLmdldFBhcmVudE5vZGUoKSA9PSBudWxsKQotCQkJCQkvLyBuZXh0Tm9kZSBpcyBkZWxldGVkIGR1cmluZyBmb3JtYXQKLQkJCQkJbmV4dENoaWxkID0gKElET01Ob2RlKSBlYWNoQ2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlmb3JtYXRDaGlsZHJlbihub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9FbGVtZW50Tm9kZUZvcm1hdHRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRWxlbWVudE5vZGVGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE0MDliMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9FbGVtZW50Tm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIHhtbDpzcGFjZT0ncHJlc2VydmUnIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklTb3VyY2VHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgRWxlbWVudE5vZGVGb3JtYXR0ZXIgZXh0ZW5kcyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIgewotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgY2hhciBET1VCTEVfUVVPVEUgPSAnIic7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERPVUJMRV9RVU9URVMgPSAiXCJcIiI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgY2hhciBFUVVBTF9DSEFSID0gJz0nOyAvLyBlcXVhbCBzaWduJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBQUkVTRVJWRSA9ICJwcmVzZXJ2ZSI7Ly8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFBSRVNFUlZFX1FVT1RFRCA9ICJcInByZXNlcnZlXCIiOy8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgU0lOR0xFX1FVT1RFID0gJ1wnJzsvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgWE1MX1NQQUNFID0gInhtbDpzcGFjZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0RW5kVGFnKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmICghaXNFbmRUYWdNaXNzaW5nKG5vZGUpKSB7Ci0JCQkvLyBlbmQgdGFnIGV4aXN0cwotCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCVN0cmluZyBsaW5lRGVsaW1pdGVyID0gc3RydWN0dXJlZERvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCVN0cmluZyBub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KG5vZGUpOwotCQkJSURPTU5vZGUgbGFzdENoaWxkID0gKElET01Ob2RlKSBub2RlLmdldExhc3RDaGlsZCgpOwotCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsICYmIGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJaWYgKGlzRW5kVGFnTWlzc2luZyhsYXN0Q2hpbGQpKSB7Ci0JCQkJCS8vIGZpbmQgZGVlcGVzdCBjaGlsZAotCQkJCQlJRE9NTm9kZSBkZWVwZXN0Q2hpbGQgPSAoSURPTU5vZGUpIGxhc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJd2hpbGUgKGRlZXBlc3RDaGlsZCAhPSBudWxsICYmIGRlZXBlc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKSAhPSBudWxsICYmIGlzRW5kVGFnTWlzc2luZyhkZWVwZXN0Q2hpbGQpKSB7Ci0JCQkJCQlsYXN0Q2hpbGQgPSBkZWVwZXN0Q2hpbGQ7Ci0JCQkJCQlkZWVwZXN0Q2hpbGQgPSAoSURPTU5vZGUpIGRlZXBlc3RDaGlsZC5nZXRMYXN0Q2hpbGQoKTsKLQkJCQkJfQotCi0JCQkJCWlmIChkZWVwZXN0Q2hpbGQgIT0gbnVsbCkgewotCQkJCQkJaWYgKGRlZXBlc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkJLy8gU3BlY2lhbCBpbmRlbnRhdGlvbiBoYW5kbGluZyBpZiBsYXN0Q2hpbGQncyBlbmQKLQkJCQkJCQkvLyB0YWcgaXMgbWlzc2luZyBhbmQgZGVlcGVzdENoaWxkIGlzIGEgdGV4dCBub2RlLgotCQkJCQkJCVN0cmluZyBub2RlVGV4dCA9IGRlZXBlc3RDaGlsZC5nZXROb2RlVmFsdWUoKTsKLQotCQkJCQkJCWlmICghbm9kZVRleHQuZW5kc1dpdGgobGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbikpIHsKLQkJCQkJCQkJbm9kZVRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgobm9kZVRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCQlub2RlVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChub2RlVGV4dCwgbm9kZUluZGVudGF0aW9uKTsKLQkJCQkJCQl9Ci0KLQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKGRlZXBlc3RDaGlsZCwgbm9kZVRleHQpOwotCQkJCQkJfQotCQkJCQkJZWxzZQotCQkJCQkJCWluc2VydEFmdGVyTm9kZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UKLQkJCQkJLy8gaW5kZW50IGVuZCB0YWcKLQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZURlbGltaXRlciArIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQl9Ci0JCQllbHNlIGlmIChsYXN0Q2hpbGQgPT0gbnVsbCAmJiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMobm9kZSkpIHsKLQkJCQkvLyBpbmRlbnQgZW5kIHRhZwotCQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCksIDAsIGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pOwotCQkJfQotCi0JCQkvLyBmb3JtYXQgZW5kIHRhZyBuYW1lCi0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJaWYgKGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuc2l6ZSgpID49IDMpIHsKLQkJCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJcmVtb3ZlUmVnaW9uU3BhY2VzKG5vZGUsIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgZW5kVGFnTmFtZVJlZ2lvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCS8vIGZvcm1hdCBpbmRlbnRhdGlvbiBiZWZvcmUgbm9kZQotCQkJZm9ybWF0SW5kZW50YXRpb25CZWZvcmVOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCi0JCQkvLyBmb3JtYXQgc3RhcnQgdGFnCi0JCQlJRE9NTm9kZSBuZXdOb2RlID0gbm9kZTsKLQkJCWludCBzdGFydFRhZ1N0YXJ0T2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQotCQkJYm9vbGVhbiBjdXJyZW50bHlJblhtbFNwYWNlUHJlc2VydmUgPSBmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKTsKLQkJCWZvcm1hdFN0YXJ0VGFnKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQkJLy8gc2F2ZSBuZXcgbm9kZQotCQkJbmV3Tm9kZSA9IChJRE9NTm9kZSkgc3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oc3RhcnRUYWdTdGFydE9mZnNldCk7Ci0KLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSBuZXdOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpOwotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCQkJCS8vIGZvcm1hdCBjaGlsZHJlbiBhbmQgZW5kIHRhZyBpZiBub3QgZW1wdHkgc3RhcnQgdGFnCi0JCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkgewotCQkJCQkvLyBmb3JtYXQgY2hpbGRyZW4KLQkJCQkJZm9ybWF0Q2hpbGRyZW4obmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0KLQkJCQkJLy8gc2F2ZSBuZXcgbm9kZQotCQkJCQluZXdOb2RlID0gKElET01Ob2RlKSBzdHJ1Y3R1cmVkTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydFRhZ1N0YXJ0T2Zmc2V0KTsKLQotCQkJCQkvLyBmb3JtYXQgZW5kIHRhZwotCQkJCQlmb3JtYXRFbmRUYWcobmV3Tm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JCQkJfQotCQkJfQotCi0JCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoY3VycmVudGx5SW5YbWxTcGFjZVByZXNlcnZlKTsKLQkJCS8vIG9ubHkgaW5kZW50IGlmIG5vdCBhdCBsYXN0IG5vZGUKLQkJCWlmIChuZXdOb2RlICE9IG51bGwgJiYgbmV3Tm9kZS5nZXROZXh0U2libGluZygpICE9IG51bGwpCi0JCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGFmdGVyIG5vZGUKLQkJCQlmb3JtYXRJbmRlbnRhdGlvbkFmdGVyTm9kZShuZXdOb2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGZvcm1hdHMgdGhlIHN0YXJ0IHRhZyBuYW1lLCBhbmQgZm9ybWF0cyB0aGUgYXR0cmlidXRlcyBpZgotCSAqIGF2YWlsYWJsZS4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRTdGFydFRhZyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBmb3JtYXRDb250cmFpbnRzLmdldEN1cnJlbnRJbmRlbnQoKTsKLQkJU3RyaW5nIGF0dHJJbmRlbnQgPSBsaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQlib29sZWFuIHNwbGl0TXVsdGlBdHRycyA9ICgoSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCkgZkZvcm1hdFByZWZlcmVuY2VzKS5nZXRTcGxpdE11bHRpQXR0cnMoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvLyBOb3RlOiBhdHRyaWJ1dGVzIHNob3VsZCBub3QgYmUgbnVsbCBldmVuIGlmIHRoZSBub2RlIGhhcyBubwotCQkvLyBhdHRyaWJ1dGVzLiBIb3dldmVyLCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpIHdpbGwgYmUgMC4gQnV0LCBjaGVjawotCQkvLyBmb3IgbnVsbCBqdXN0IGluIGNhc2UuCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCS8vIGNvbXB1dGUgY3VycmVudCBhdmFpbGFibGUgbGluZSB3aWR0aAotCQkJaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSAwOwotCQkJdHJ5IHsKLQkJCQkvLyAxIGlzIGZvciAiPCIKLQkJCQlpbnQgbm9kZU5hbWVPZmZzZXQgPSBub2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxICsgbm9kZS5nZXROb2RlTmFtZSgpLmxlbmd0aCgpOwotCQkJCWludCBsaW5lT2Zmc2V0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChub2RlTmFtZU9mZnNldCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldChsaW5lT2Zmc2V0LCBub2RlTmFtZU9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQkJCWludCB1c2VkV2lkdGggPSBnZXRJbmRlbnRhdGlvbkxlbmd0aCh0ZXh0KTsKLQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKSAtIHVzZWRXaWR0aDsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0KLQkJCVN0cmluZ0J1ZmZlciBzdHJpbmdCdWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQlpbnQgYXR0ckxlbmd0aCA9IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7Ci0JCQlpbnQgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IDA7Ci0JCQlib29sZWFuIHNhd1htbFNwYWNlID0gZmFsc2U7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ckxlbmd0aDsgaSsrKSB7Ci0JCQkJQXR0ckltcGwgYXR0ciA9IChBdHRySW1wbCkgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCUlUZXh0UmVnaW9uIG5hbWVSZWdpb24gPSBhdHRyLmdldE5hbWVSZWdpb24oKTsKLQkJCQlJVGV4dFJlZ2lvbiBlcXVhbFJlZ2lvbiA9IGF0dHIuZ2V0RXF1YWxSZWdpb24oKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dHIuZ2V0VmFsdWVSZWdpb24oKTsKLQotCQkJCS8vIGFwcGVuZCB1bmRlZmluZWQgcmVnaW9ucwotCQkJCVN0cmluZyB1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGF0dHIuZ2V0U3RhcnRPZmZzZXQoKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQodW5kZWZpbmVkUmVnaW9uKTsKLQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gYXR0ci5nZXRTdGFydE9mZnNldCgpOwotCi0JCQkJLy8gY2hlY2sgZm9yIHhtbDpzcGFjZSBhdHRyaWJ1dGUKLQkJCQlpZiAoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5jb21wYXJlVG8oWE1MX1NQQUNFKSA9PSAwKSB7Ci0JCQkJCWlmICh2YWx1ZVJlZ2lvbiA9PSBudWxsKSB7Ci0JCQkJCQkvLyBbMTExNjc0XSBJZiBub3RoaW5nIGhhcyBiZWVuIHdyaXR0ZW4geWV0LCB0cmVhdCBhcwotCQkJCQkJLy8gcHJlc2VydmUsIGJ1dCBvbmx5IGFzIGhpbnQKLQkJCQkJCWZvcm1hdENvbnRyYWludHMuc2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCh0cnVlKTsKLQkJCQkJCS8vIE5vdGUgd2UgZG9uJ3Qgc2V0ICdzYXdYbWxTcGFjZScsIHNvIHRoYXQgZGVmYXVsdCBvcgotCQkJCQkJLy8gZml4ZWQgRFREL1hTRCB2YWx1ZXMgbWF5IG92ZXJyaWRlLgotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJSVNvdXJjZUdlbmVyYXRvciBnZW5lcmF0b3IgPSBub2RlLmdldE1vZGVsKCkuZ2V0R2VuZXJhdG9yKCk7Ci0JCQkJCQlTdHJpbmcgbmV3QXR0clZhbHVlID0gZ2VuZXJhdG9yLmdlbmVyYXRlQXR0clZhbHVlKGF0dHIpOwotCi0JCQkJCQkvLyBUaGVyZSBpcyBhIHByb2JsZW0gaW4KLQkJCQkJCS8vIFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvblV0aWwuZ2V0QXR0clZhbHVlKElUZXh0UmVnaW9uKQotCQkJCQkJLy8gd2hlbiB0aGUgcmVnaW9uIGlzIGluc3RhbmNlb2YgQ29udGV4dFJlZ2lvbi4KLQkJCQkJCS8vIFdvcmthcm91bmQgZm9yIG5vdy4KLQkJCQkJCWlmIChmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5sZW5ndGgoKSA9PSAxKSB7Ci0JCQkJCQkJY2hhciBmaXJzdENoYXIgPSBmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS5jaGFyQXQoMCk7Ci0JCQkJCQkJaWYgKChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSB8fCAoZmlyc3RDaGFyID09IFNJTkdMRV9RVU9URSkpCi0JCQkJCQkJCW5ld0F0dHJWYWx1ZSA9IERPVUJMRV9RVU9URVM7Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChuZXdBdHRyVmFsdWUuY29tcGFyZVRvKFBSRVNFUlZFX1FVT1RFRCkgPT0gMCkKLQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGZhbHNlKTsKLQkJCQkJCXNhd1htbFNwYWNlID0gdHJ1ZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChzcGxpdE11bHRpQXR0cnMgJiYgYXR0ckxlbmd0aCA+IDEpIHsKLQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChsaW5lRGVsaW1pdGVyICsgYXR0ckluZGVudCk7Ci0JCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKSk7Ci0JCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoZXF1YWxSZWdpb24pOwotCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKEVRVUFMX0NIQVIpOwotCi0JCQkJCQkvLyBhcHBlbmQgdW5kZWZpbmVkIHJlZ2lvbnMKLQkJCQkJCXVuZGVmaW5lZFJlZ2lvbiA9IGdldFVuZGVmaW5lZFJlZ2lvbnMobm9kZSwgbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCwgZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0JCQkJCQlsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0ID0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pOwotCi0JCQkJCQkvLyBOb3RlOiB0cmltKCkgc2hvdWxkIG5vdCBiZSBuZWVkZWQgZm9yCi0JCQkJCQkvLyB2YWx1ZVJlZ2lvbi5nZXRUZXh0KCkuIEp1c3QgYSB3b3JrYXJvdW5kIGZvciBhCi0JCQkJCQkvLyBwcm9ibGVtIGZvdW5kIGluIHZhbHVlUmVnaW9uIGZvciBub3cuCi0JCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLnRyaW0oKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQlpbnQgdGV4dExlbmd0aCA9IDEgKyBmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmxlbmd0aCgpICsgMSArIGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLmxlbmd0aCgpOwotCQkJCQkJaWYgKGkgPT0gYXR0ckxlbmd0aCAtIDEpIHsKLQkJCQkJCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJCQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQkJCQkJSVRleHRSZWdpb24gbGFzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KHJlZ2lvbnMuc2l6ZSgpIC0gMSk7Ci0JCQkJCQkJCWlmIChsYXN0UmVnaW9uLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UpCi0JCQkJCQkJCQkvLyAzIGlzIGZvciAiIC8+IgotCQkJCQkJCQkJdGV4dExlbmd0aCArPSAzOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQkvLyAxIGlzIGZvciAiPiIKLQkJCQkJCQkJCXRleHRMZW5ndGgrKzsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCWlmIChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID49IHRleHRMZW5ndGgpIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKFNQQUNFX0NIQVIpOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgtLTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQobGluZURlbGltaXRlciArIGF0dHJJbmRlbnQpOwotCQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSBnZXRGb3JtYXRQcmVmZXJlbmNlcygpLmdldExpbmVXaWR0aCgpIC0gYXR0ckluZGVudC5sZW5ndGgoKTsKLQkJCQkJCX0KLQotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pKTsKLQotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KGVxdWFsUmVnaW9uKTsKLQotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChFUVVBTF9DSEFSKTsKLQotCQkJCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQkJCQl1bmRlZmluZWRSZWdpb24gPSBnZXRVbmRlZmluZWRSZWdpb25zKG5vZGUsIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQsIGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKSAtIGxhc3RVbmRlZmluZWRSZWdpb25PZmZzZXQpOwotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZCh1bmRlZmluZWRSZWdpb24pOwotCQkJCQkJbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHZhbHVlUmVnaW9uKTsKLQotCQkJCQkJLy8gTm90ZTogdHJpbSgpIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvcgotCQkJCQkJLy8gdmFsdWVSZWdpb24uZ2V0VGV4dCgpLiBKdXN0IGEgd29ya2Fyb3VuZCBmb3IgYQotCQkJCQkJLy8gcHJvYmxlbSBmb3VuZCBpbiB2YWx1ZVJlZ2lvbiBmb3Igbm93LgotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChmbGF0Tm9kZS5nZXRUZXh0KHZhbHVlUmVnaW9uKS50cmltKCkpOwotCi0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC09IGZsYXROb2RlLmdldFRleHQobmFtZVJlZ2lvbikubGVuZ3RoKCk7Ci0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLS07Ci0JCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoIC09IGZsYXROb2RlLmdldFRleHQodmFsdWVSZWdpb24pLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWlmIChjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID49IDEgKyBmbGF0Tm9kZS5nZXRUZXh0KG5hbWVSZWdpb24pLmxlbmd0aCgpKSB7Ci0JCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChTUEFDRV9DSEFSKTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoLS07Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQlzdHJpbmdCdWZmZXIuYXBwZW5kKGxpbmVEZWxpbWl0ZXIgKyBhdHRySW5kZW50KTsKLQkJCQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKSAtIGF0dHJJbmRlbnQubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0KLQkJCQkJCXN0cmluZ0J1ZmZlci5hcHBlbmQoZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKSk7Ci0KLQkJCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLT0gZmxhdE5vZGUuZ2V0VGV4dChuYW1lUmVnaW9uKS5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQotCQkJLy8gYXBwZW5kIHVuZGVmaW5lZCByZWdpb25zCi0JCQlTdHJpbmcgdW5kZWZpbmVkUmVnaW9uID0gZ2V0VW5kZWZpbmVkUmVnaW9ucyhub2RlLCBsYXN0VW5kZWZpbmVkUmVnaW9uT2Zmc2V0LCBub2RlLmdldEVuZE9mZnNldCgpIC0gbGFzdFVuZGVmaW5lZFJlZ2lvbk9mZnNldCk7Ci0JCQlzdHJpbmdCdWZmZXIuYXBwZW5kKHVuZGVmaW5lZFJlZ2lvbik7Ci0KLQkJCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCS8vIDEgaXMgZm9yICI8IgotCQkJaW50IG9mZnNldCA9IG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSArIDEgKyBub2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCk7Ci0JCQkvLyAxIGlzIGZvciAiPCIKLQkJCWludCBsZW5ndGggPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpIC0gMSAtIG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKTsKLQotCQkJaWYgKGZsYXROb2RlICE9IG51bGwpIHsKLQkJCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJCQlJVGV4dFJlZ2lvbiBmaXJzdFJlZ2lvbiA9IHJlZ2lvbnMuZ2V0KDApOwotCQkJCUlUZXh0UmVnaW9uIGxhc3RSZWdpb24gPSByZWdpb25zLmdldChyZWdpb25zLnNpemUoKSAtIDEpOwotCi0JCQkJaWYgKGZpcnN0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJCS8vIHNraXAgZm9ybWF0dGluZyBmb3IgZW5kIHRhZ3MgaW4gdGhpcyBmb3JtYXQ6IDwvdGFnTmFtZT4KLQkJCQkJcmV0dXJuOwotCQkJCWVsc2UgewotCQkJCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkJCWxlbmd0aCA9IGxlbmd0aCAtIGxhc3RSZWdpb24uZ2V0TGVuZ3RoKCk7Ci0KLQkJCQkJaWYgKGxhc3RSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkJCS8vIGxlYXZlIHNwYWNlIGJlZm9yZSBYTUxfRU1QVFlfVEFHX0NMT1NFOiA8dGFnTmFtZSAvPgotCQkJCQkJc3RyaW5nQnVmZmVyLmFwcGVuZChTUEFDRV9DSEFSKTsKLQkJCQl9Ci0JCQl9Ci0KLQotCQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmdCdWZmZXIudG9TdHJpbmcoKSk7Ci0KLQkJCS8vIElmIHdlIGRpZG4ndCBzZWUgYSB4bWw6c3BhY2UgYXR0cmlidXRlIGFib3ZlLCB3ZSdsbCBsb29rIGZvcgotCQkJLy8gb25lIGluIHRoZSBEVEQuCi0JCQkvLyBXZSBkbyBub3QgY2hlY2sgZm9yIGEgY29uZmxpY3QgYmV0d2VlbiBhIERURCdzICdmaXhlZCcgdmFsdWUKLQkJCS8vIGFuZCB0aGUgYXR0cmlidXRlIHZhbHVlIGZvdW5kIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCwgd2UKLQkJCS8vIGxlYXZlIHRoYXQgdG8gdGhlIHZhbGlkYXRvci4KLQkJCWlmICghc2F3WG1sU3BhY2UpIHsKLQkJCQlNb2RlbFF1ZXJ5QWRhcHRlciBhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSAoKElET01Eb2N1bWVudCkgbm9kZS5nZXRPd25lckRvY3VtZW50KCkpLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgYWRhcHRlci5nZXRNb2RlbFF1ZXJ5KCkuZ2V0Q01Ob2RlKG5vZGUpOwotCQkJCWlmIChlbGVtZW50RGVjbGFyYXRpb24gIT0gbnVsbCkgewotCQkJCQlDTU5hbWVkTm9kZU1hcCBjbUF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbGFyYXRpb24uZ2V0QXR0cmlidXRlcygpOwotCQkJCQkvLyBDaGVjayBpbXBsaWVkIHZhbHVlcyBmcm9tIHRoZSBEVEQgd2F5LgotCQkJCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJpYnV0ZURlY2xhcmF0aW9uID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGNtQXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oWE1MX1NQQUNFKTsKLQkJCQkJaWYgKGF0dHJpYnV0ZURlY2xhcmF0aW9uICE9IG51bGwpIHsKLQkJCQkJCS8vIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZm91bmQsIGNoZWNrIGl0IG91dC4KLQkJCQkJCVN0cmluZyBkZWZhdWx0VmFsdWUgPSBhdHRyaWJ1dGVEZWNsYXJhdGlvbi5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpOwotCi0JCQkJCQkvLyB4bWw6c3BhY2U9InByZXNlcnZlIiBtZWFucyBwcmVzZXJ2ZSBzcGFjZSwKLQkJCQkJCS8vIGV2ZXJ5dGhpbmcgZWxzZSBtZWFucyBiYWNrIHRvIGRlZmF1bHQuCi0JCQkJCQlpZiAoZGVmYXVsdFZhbHVlLmNvbXBhcmVUbyhQUkVTRVJWRSkgPT0gMCkKLQkJCQkJCQlmb3JtYXRDb250cmFpbnRzLnNldEluUHJlc2VydmVTcGFjZUVsZW1lbnQodHJ1ZSk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJZm9ybWF0Q29udHJhaW50cy5zZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KGZhbHNlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VW5kZWZpbmVkUmVnaW9ucyhJRE9NTm9kZSBub2RlLCBpbnQgc3RhcnRPZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoKTsKLQotCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IGZsYXROb2RlLmdldFJlZ2lvbnMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKTsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSByZWdpb25zLmdldChpKTsKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWludCByZWdpb25TdGFydE9mZnNldCA9IGZsYXROb2RlLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbik7Ci0KLQkJCWlmIChyZWdpb25UeXBlLmNvbXBhcmVUbyhET01SZWdpb25Db250ZXh0LlVOREVGSU5FRCkgPT0gMCAmJiByZWdpb25TdGFydE9mZnNldCA+PSBzdGFydE9mZnNldCAmJiByZWdpb25TdGFydE9mZnNldCA8IHN0YXJ0T2Zmc2V0ICsgbGVuZ3RoKQotCQkJCXJlc3VsdCA9IHJlc3VsdCArIGZsYXROb2RlLmdldEZ1bGxUZXh0KHJlZ2lvbik7Ci0JCX0KLQotCQlpZiAocmVzdWx0Lmxlbmd0aCgpID4gMCkKLQkJCXJldHVybiBTUEFDRSArIHJlc3VsdC50cmltKCk7Ci0JCWVsc2UKLQkJCXJldHVybiByZXN1bHQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvRm9ybWF0UHJvY2Vzc29yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiZTk0OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Gb3JtYXRQcm9jZXNzb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5BYnN0cmFjdFN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNEQVRBU2VjdGlvbkltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIEZvcm1hdFByb2Nlc3NvclhNTCBleHRlbmRzIEFic3RyYWN0U3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RmlsZUV4dGVuc2lvbigpIHsKLQkJcmV0dXJuICJ4bWwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCQlpZiAoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCQl9Ci0JCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCQl9Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoTm9kZSBub2RlKSB7Ci0JCS8vIDI2MjEzNSAtIE5QRSBkdXJpbmcgZm9ybWF0IG9mIGVtcHR5IGRvY3VtZW50Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlzaG9ydCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJSVN0cnVjdHVyZWRGb3JtYXR0ZXIgZm9ybWF0dGVyID0gbnVsbDsKLQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgRWxlbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb25JbXBsKQotCQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJCWVsc2UKLQkJCQkJZm9ybWF0dGVyID0gbmV3IFRleHROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBDb21tZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IERvY3VtZW50Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJZGVmYXVsdCA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgTm9kZUZvcm1hdHRlcigpOwotCQkJfQotCQl9Ci0KLQkJLy8gaW5pdCBmb21hdHRlcgotCQlmb3JtYXR0ZXIuc2V0Rm9ybWF0UHJlZmVyZW5jZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSk7Ci0JCWZvcm1hdHRlci5zZXRQcm9ncmVzc01vbml0b3IoZlByb2dyZXNzTW9uaXRvcik7Ci0KLQkJcmV0dXJuIGZvcm1hdHRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVmcmVzaEZvcm1hdFByZWZlcmVuY2VzKCkgewotCQlmRm9ybWF0UHJlZmVyZW5jZXMgPSBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L0lTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFmMjMzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSVN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCBleHRlbmRzIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgewotCWJvb2xlYW4gZ2V0U3BsaXRNdWx0aUF0dHJzKCk7Ci0KLQl2b2lkIHNldFNwbGl0TXVsdGlBdHRycyhib29sZWFuIHNwbGl0TXVsdGlBdHRycyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Ob2RlRm9ybWF0dGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9Ob2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1OGM1MzEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvTm9kZUZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgSmVzcGVyIFN0ZWVuIE34bGxlciAtIHhtbDpzcGFjZT0ncHJlc2VydmUnIHN1cHBvcnQKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkNvbnRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ0RBVEFTZWN0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuQ2hhcmFjdGVyRGF0YUltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wYXJzZXIucmVnaW9ucy5UYWdOYW1lUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIE5vZGVGb3JtYXR0ZXIgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdHRlciB7Ci0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ1IgPSAiXHIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIERFTElNSVRFUlMgPSAiIFx0XG5cclxmIjsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIEVNUFRZX1NUUklORyA9ICIiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgRkYgPSAiXGYiOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgTEYgPSAiXG4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIHByb3RlY3RlZCBmaW5hbCBTdHJpbmcgU1BBQ0UgPSAiICI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgU1BBQ0VfQ0hBUiA9ICcgJzsgLy8kTk9OLU5MUy0xJAotCXN0YXRpYyBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIFRBQiA9ICJcdCI7IC8vJE5PTi1OTFMtMSQKLQlzdGF0aWMgcHJvdGVjdGVkIGZpbmFsIGNoYXIgVEFCX0NIQVIgPSAnXHQnOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmRm9ybWF0Q29udHJhaW50cyA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZkZvcm1hdFByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgSVByb2dyZXNzTW9uaXRvciBmUHJvZ3Jlc3NNb25pdG9yID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHJlc3NTcGFjZXMoU3RyaW5nIHN0cmluZywgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJLyoKLQkJICogTm90ZSB0aGF0IHRoZSBTdHJ1Y3R1cmVkVGV4dEVkaXRvciBzdXBwb3J0cyBtaXhlZCBuZXcgbGluZQotCQkgKiBjaGFyYWN0ZXJzIChDUiwgTEYsIENSTEYpIGluIG9uZSBmaWxlLiBXZSBoYXZlIHRvIGhhbmRsZSB0aGF0IHdoZW4KLQkJICogd2UgdHJ5IHRvIHByZXNlcnZlIGJsYW5rIGxpbmVzLgotCQkgKi8KLQkJU3RyaW5nW10gc3RyaW5nQXJyYXkgPSBudWxsOwotCQlib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCXN0cmluZ0FycmF5ID0gU3RyaW5nVXRpbHMuYXNBcnJheShzdHJpbmcpOwotCQllbHNlCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkoc3RyaW5nLCBERUxJTUlURVJTLCB0cnVlKTsKLQotCQlTdHJpbmdCdWZmZXIgY29tcHJlc3NlZFN0cmluZyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJaWYgKHN0cmluZ0FycmF5Lmxlbmd0aCA+IDApIHsKLQkJCWJvb2xlYW4gY3IgPSBmYWxzZSwgbGYgPSBmYWxzZSwgY3IyID0gZmFsc2UsIG5vblNwYWNlID0gdHJ1ZTsKLQotCQkJaWYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhDUikgPT0gMCkKLQkJCQljciA9IHRydWU7Ci0JCQllbHNlIGlmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oTEYpID09IDApCi0JCQkJbGYgPSB0cnVlOwotCQkJZWxzZSBpZiAoKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhTUEFDRSkgIT0gMCkgJiYgKHN0cmluZ0FycmF5WzBdLmNvbXBhcmVUbyhUQUIpICE9IDApICYmIChzdHJpbmdBcnJheVswXS5jb21wYXJlVG8oRkYpICE9IDApKSB7Ci0JCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbMF0pOwotCQkJCW5vblNwYWNlID0gdHJ1ZTsKLQkJCX0KLQotCQkJZm9yIChpbnQgaSA9IDE7IGkgPCBzdHJpbmdBcnJheS5sZW5ndGg7IGkrKykgewotCQkJCWlmIChzdHJpbmdBcnJheVtpXS5jb21wYXJlVG8oQ1IpID09IDApIHsKLQkJCQkJaWYgKGNyICYmIGxmKSB7Ci0JCQkJCQlpZiAobm9uU3BhY2UpIHsKLQkJCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChDUiArIExGKTsKLQkJCQkJCQlub25TcGFjZSA9IGZhbHNlOwotCQkJCQkJfQotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoc3RyaW5nQXJyYXlbaV0pOwotCQkJCQkJY3IyID0gdHJ1ZTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChjcikgewotCQkJCQkJaWYgKG5vblNwYWNlKSB7Ci0JCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoQ1IpOwotCQkJCQkJCW5vblNwYWNlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCQljcjIgPSB0cnVlOwotCQkJCQl9Ci0JCQkJCWVsc2UKLQkJCQkJCWNyID0gdHJ1ZTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKExGKSA9PSAwKSB7Ci0JCQkJCWlmIChjciAmJiBsZiAmJiBjcjIpIHsKLQkJCQkJCWNvbXByZXNzZWRTdHJpbmcuYXBwZW5kKHN0cmluZ0FycmF5W2ldKTsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChsZikgewotCQkJCQkJaWYgKG5vblNwYWNlKSB7Ci0JCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoTEYpOwotCQkJCQkJCW5vblNwYWNlID0gZmFsc2U7Ci0JCQkJCQl9Ci0JCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0JCQkJCX0KLQkJCQkJZWxzZQotCQkJCQkJbGYgPSB0cnVlOwotCQkJCX0KLQkJCQllbHNlIGlmICgoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKFNQQUNFKSAhPSAwKSAmJiAoc3RyaW5nQXJyYXlbaV0uY29tcGFyZVRvKFRBQikgIT0gMCkgJiYgKHN0cmluZ0FycmF5W2ldLmNvbXBhcmVUbyhGRikgIT0gMCkpIHsKLQkJCQkJaWYgKGNvbXByZXNzZWRTdHJpbmcubGVuZ3RoKCkgPiAwKQotCQkJCQkJY29tcHJlc3NlZFN0cmluZy5hcHBlbmQoU1BBQ0UpOwotCQkJCQljb21wcmVzc2VkU3RyaW5nLmFwcGVuZChzdHJpbmdBcnJheVtpXSk7Ci0KLQkJCQkJY3IgPSBmYWxzZTsKLQkJCQkJbGYgPSBmYWxzZTsKLQkJCQkJY3IyID0gZmFsc2U7Ci0JCQkJCW5vblNwYWNlID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gY29tcHJlc3NlZFN0cmluZy50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChmaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCA9IGZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoKTsKLQkJCQlyZXN1bHQgPSBTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIoZmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0KTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSkgewotCQlJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cyA9IGdldEZvcm1hdENvbnRyYWludHMoKTsKLQotCQlmb3JtYXQobm9kZSwgZm9ybWF0Q29udHJhaW50cyk7Ci0JfQotCi0JcHVibGljIHZvaWQgZm9ybWF0KE5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0Rm9ybWF0V2l0aFNpYmxpbmdJbmRlbnQoKSkKLQkJCWZvcm1hdENvbnRyYWludHMuc2V0Q3VycmVudEluZGVudChnZXRTaWJsaW5nSW5kZW50KG5vZGUpKTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotCQkJZm9ybWF0Tm9kZSgoSURPTU5vZGUpIG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGZvcm1hdEluZGVudGF0aW9uQWZ0ZXJOb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8vIFsxMTE2NzRdIElmIGluc2lkZSB4bWw6c3BhY2U9InByZXNlcnZlIiBlbGVtZW50LCB3ZSBiYWlsCi0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSkKLQkJCXJldHVybjsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJSURPTU5vZGUgbmV4dFNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaW50IGxpbmUgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG5vZGUuZ2V0RW5kT2Zmc2V0KCkpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQkJdHJ5IHsKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIobGluZSk7Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJLy8gQlVHMTE1NzE2OiBpZiBjYW5ub3QgZ2V0IGxpbmUgZGVsaW1pdGVyIGZyb20gY3VycmVudCBsaW5lLCBqdXN0Ci0JCQkvLyB1c2UgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQotCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpIHsKLQkJCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCWlmIChuZXh0U2libGluZyAhPSBudWxsKQotCQkJCQkJaWYgKG5leHRTaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJZ2V0Rm9ybWF0dGVyKG5leHRTaWJsaW5nKS5mb3JtYXQobmV4dFNpYmxpbmcsIGZvcm1hdENvbnRyYWludHMpOwotCQkJCQkJZWxzZSBpZiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgewotCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCX0KLQotCQkJCWVsc2UgaWYgKG5leHRTaWJsaW5nICE9IG51bGwpCi0JCQkJCWlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJZ2V0Rm9ybWF0dGVyKG5leHRTaWJsaW5nKS5mb3JtYXQobmV4dFNpYmxpbmcsIGZvcm1hdENvbnRyYWludHMpOwotCQkJCQllbHNlIGlmIChuZXh0U2libGluZy5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFKSB7Ci0JCQkJCQkvLyBkbyBub3RoaW5nCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlTdHJpbmcgbGluZUluZGVudCA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJfQotCQkJCWVsc2UgewotCQkJCQlJRE9NTm9kZSBpbmRlbnROb2RlID0gZ2V0UGFyZW50SW5kZW50Tm9kZShub2RlKTsKLQkJCQkJU3RyaW5nIGxpbmVJbmRlbnQgPSBnZXROb2RlSW5kZW50KGluZGVudE5vZGUpOwotCQkJCQlJRE9NTm9kZSBsYXN0Q2hpbGQgPSBnZXREZWVwZXN0Q2hpbGROb2RlKG5vZGUpOwotCQkJCQlib29sZWFuIGNsZWFyQWxsQmxhbmtMaW5lcyA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q2xlYXJBbGxCbGFua0xpbmVzKCk7Ci0KLQkJCQkJaWYgKGxhc3RDaGlsZCAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoKGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkpIHsKLQkJCQkJCQkvLyB0aGlzIHRleHQgbm9kZSBhbHJlYWR5IGVuZHMgd2l0aCB0aGUgcmVxdWVzdGVkCi0JCQkJCQkJLy8gaW5kZW50YXRpb24KLQkJCQkJCX0KLQotCQkJCQkJZWxzZSBpZiAoKGxhc3RDaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpICE9IG51bGwgJiYgbGFzdENoaWxkLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSkKLQkJCQkJCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKSB7Ci0JCQkJCQkJCXJlcGxhY2VOb2RlVmFsdWUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKGxhc3RDaGlsZCwgbGluZUluZGVudCk7Ci0JCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAobGFzdENoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQkJaWYgKGxhc3RDaGlsZC5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJCQkJCS8vIHJlcGxhY2UKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShsYXN0Q2hpbGQsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJfQotCQkJCQkJZWxzZSB7Ci0JCQkJCQkJLy8gYXMgbG9uZyBhcyBub3QgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQKLQkJCQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQkJCWlmIChlbmRSZWdpb24gIT0gbnVsbCAmJiBlbmRSZWdpb24uZ2V0TmV4dCgpICE9IG51bGwpCi0JCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobGFzdENoaWxkLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXRJbmRlbnRhdGlvbkJlZm9yZU5vZGUoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJLy8gWzExMTY3NF0gSWYgaW5zaWRlIHhtbDpzcGFjZT0icHJlc2VydmUiIGVsZW1lbnQsIHdlIGJhaWwKLQkJaWYgKGZvcm1hdENvbnRyYWludHMuZ2V0SW5QcmVzZXJ2ZVNwYWNlRWxlbWVudCgpKQotCQkJcmV0dXJuOwotCQlpZiAobm9kZSAhPSBudWxsKSB7Ci0JCQlJRE9NTm9kZSBwcmV2aW91c1NpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50IGRvYyA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQkJCWludCBsaW5lID0gZG9jLmdldExpbmVPZk9mZnNldChub2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJU3RyaW5nIGxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcigpOwotCQkJdHJ5IHsKLQkJCQlpZiAobGluZSA+IDApIHsKLQkJCQkJbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKGxpbmUgLSAxKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQkJfQotCQkJLy8gQlVHMTE1NzE2OiBpZiBjYW5ub3QgZ2V0IGxpbmUgZGVsaW1pdGVyIGZyb20gY3VycmVudCBsaW5lLCBqdXN0Ci0JCQkvLyB1c2UgZGVmYXVsdCBsaW5lIGRlbGltaXRlcgotCQkJaWYgKGxpbmVEZWxpbWl0ZXIgPT0gbnVsbCkKLQkJCQlsaW5lRGVsaW1pdGVyID0gZG9jLmdldExpbmVEZWxpbWl0ZXIoKTsKLQkJCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0KLQkJCWlmIChub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCWlmIChwcmV2aW91c1NpYmxpbmcgIT0gbnVsbCkKLQkJCQkJCWlmIChwcmV2aW91c1NpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkKLQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCWVsc2UgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKHByZXZpb3VzU2libGluZyA9PSBudWxsIHx8IHByZXZpb3VzU2libGluZy5nZXROb2RlVHlwZSgpICE9IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQkJCQkvLyAyNjE5NjggLSBmb3JtYXR0aW5nIHRhZyB3aXRob3V0IGNsb3NpbmcgYnJhY2tldDoKLQkJCQkJCS8vIDx0MT48dDEKLQkJCQkJCS8vIDI2NTY3MyAtIE51bGwgcHRyIGluIGZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZQotCQkJCQkJaW50IHByZXZFbmROb2RlT2Zmc2V0ID0gLTE7Ci0JCQkJCQlpbnQgcHJldkVuZFJlZ2lvbk9mZnNldCA9IC0xOwotCQkJCQkJaWYgKHByZXZpb3VzU2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJcHJldkVuZE5vZGVPZmZzZXQgPSBwcmV2aW91c1NpYmxpbmcuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRSZWdpb24gPSBwcmV2aW91c1NpYmxpbmcuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJCQkJaWYgKGVuZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCXByZXZFbmRSZWdpb25PZmZzZXQgPSBlbmRSZWdpb24uZ2V0VGV4dEVuZE9mZnNldCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmICgocHJldmlvdXNTaWJsaW5nID09IG51bGwpIHx8IChwcmV2RW5kTm9kZU9mZnNldCAhPSAtMSAmJiBwcmV2RW5kTm9kZU9mZnNldCA9PSBwcmV2RW5kUmVnaW9uT2Zmc2V0KSkgewotCQkJCQkJCWluc2VydEJlZm9yZU5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJfQotCi0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkJCQkvLyByZXBsYWNlCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShwcmV2aW91c1NpYmxpbmcsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWlmICghcHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KSkgewotCQkJCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSB7Ci0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUocHJldmlvdXNTaWJsaW5nLCBsaW5lSW5kZW50KTsKLQkJCQkJCQkJfQotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlnZXRGb3JtYXR0ZXIocHJldmlvdXNTaWJsaW5nKS5mb3JtYXQocHJldmlvdXNTaWJsaW5nLCBmb3JtYXRDb250cmFpbnRzKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBmb3JtYXROb2RlKElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgKGZQcm9ncmVzc01vbml0b3IgPT0gbnVsbCB8fCAhZlByb2dyZXNzTW9uaXRvci5pc0NhbmNlbGVkKCkpKSB7Ci0JCQkvLyBmb3JtYXQgaW5kZW50YXRpb24gYmVmb3JlIG5vZGUKLQkJCWZvcm1hdEluZGVudGF0aW9uQmVmb3JlTm9kZShub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQotCQkJLy8gZm9ybWF0IGluZGVudGF0aW9uIGFmdGVyIG5vZGUKLQkJCWZvcm1hdEluZGVudGF0aW9uQWZ0ZXJOb2RlKG5vZGUsIGZvcm1hdENvbnRyYWludHMpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogVGhpcyBtZXRob2Qgd2lsbCBjb21wdXRlIHRoZSBjb3JyZWN0IGluZGVudGF0aW9uIGFmdGVyIHRoaXMgbm9kZQotCSAqIGRlcGVuZGluZyBvbiB0aGUgaW5kZW50YXRpb25zIG9mIGl0cyBzaWJsaW5nIG5vZGVzIGFuZCBwYXJlbnQgbm9kZS4gTm90Ci0JICogbmVlZGVkIGFueW1vcmU/Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0VHJhaWxpbmdUZXh0KElET01Ob2RlIG5vZGUsIElTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cyBmb3JtYXRDb250cmFpbnRzKSB7Ci0JCS8vIFsxMTE2NzRdIElmIGluc2lkZSB4bWw6c3BhY2U9InByZXNlcnZlIiBlbGVtZW50LCB3ZSBiYWlsCi0JCWlmIChmb3JtYXRDb250cmFpbnRzLmdldEluUHJlc2VydmVTcGFjZUVsZW1lbnQoKSkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgbGluZURlbGltaXRlciA9IG5vZGUuZ2V0TW9kZWwoKS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCVN0cmluZyBsaW5lSW5kZW50ID0gZm9ybWF0Q29udHJhaW50cy5nZXRDdXJyZW50SW5kZW50KCk7Ci0JCVN0cmluZyBwYXJlbnRMaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZm9ybWF0Q29udHJhaW50cy5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpKSB7Ci0JCQlJRE9NTm9kZSBuZXh0U2libGluZyA9IChJRE9NTm9kZSkgbm9kZS5nZXROZXh0U2libGluZygpOwotCQkJaWYgKChuZXh0U2libGluZyAhPSBudWxsKSAmJiAobmV4dFNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCQlTdHJpbmcgbmV4dFNpYmxpbmdUZXh0ID0gbmV4dFNpYmxpbmcuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJaWYgKG5leHRTaWJsaW5nLmdldE5leHRTaWJsaW5nKCkgPT0gbnVsbCkKLQkJCQkJaWYgKChuZXh0U2libGluZy5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpICYmIChuZXh0U2libGluZ1RleHQudHJpbSgpLmxlbmd0aCgpID09IDApKQotCQkJCQkJLy8gZGVsZXRlIHNwYWNlcyBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudAotCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShuZXh0U2libGluZywgRU1QVFlfU1RSSU5HKTsKLQkJCQkJZWxzZQotCQkJCQkJLy8gcmVwbGFjZSB0aGUgdGV4dCBub2RlIHdpdGggcGFyZW50IGluZGVudGF0aW9uCi0JCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5leHRTaWJsaW5nLCBsaW5lRGVsaW1pdGVyICsgcGFyZW50TGluZUluZGVudCk7Ci0JCQkJZWxzZQotCQkJCQkvLyByZXBsYWNlIHRoZSB0ZXh0IG5vZGUgd2l0aCBpbmRlbnRhdGlvbgotCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5leHRTaWJsaW5nLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV4dFNpYmxpbmcgPT0gbnVsbCkgewotCQkJCQlsaW5lSW5kZW50ID0gcGFyZW50TGluZUluZGVudDsKLQotCQkJCQlpZiAobm9kZS5nZXRQYXJlbnROb2RlKCkuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQkJCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKSkgewotCQkJCQkJCS8vIHRoaXMgdGV4dCBub2RlIGFscmVhZHkgZW5kcyB3aXRoIHRoZSByZXF1ZXN0ZWQKLQkJCQkJCQkvLyBpbmRlbnRhdGlvbgotCQkJCQkJfQotCi0JCQkJCQllbHNlIGlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSAmJiAobm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyKSkpCi0JCQkJCQkJaWYgKGNsZWFyQWxsQmxhbmtMaW5lcykKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVJbmRlbnQpOwotCQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID09IDApCi0JCQkJCQkJCS8vIHJlcGxhY2UKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCS8vIGFwcGVuZCBpbmRlbnRhdGlvbgotCQkJCQkJCWlmICghbm9kZS5nZXROb2RlVmFsdWUoKS5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCkpCi0JCQkJCQkJCWlmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKQotCQkJCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVJbmRlbnQpOwotCQkJCQkJCQllbHNlCi0JCQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQkJCWVsc2UKLQkJCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkuZW5kc1dpdGgobGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpKSkgewotCQkJCQkJLy8gdGhpcyB0ZXh0IG5vZGUgYWxyZWFkeSBlbmRzIHdpdGggdGhlIHJlcXVlc3RlZAotCQkJCQkJLy8gaW5kZW50YXRpb24KLQkJCQkJfQotCi0JCQkJCWVsc2UgaWYgKChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIpKSkKLQkJCQkJCWlmIChjbGVhckFsbEJsYW5rTGluZXMpCi0JCQkJCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJLy8gYXBwZW5kIGluZGVudGF0aW9uCi0JCQkJCQkJaW5zZXJ0QWZ0ZXJOb2RlKG5vZGUsIGxpbmVJbmRlbnQpOwotCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlpZiAobm9kZS5nZXROb2RlVmFsdWUoKS5sZW5ndGgoKSA9PSAwKQotCQkJCQkJCS8vIHJlcGxhY2UKLQkJCQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGxpbmVEZWxpbWl0ZXIgKyBsaW5lSW5kZW50KTsKLQkJCQkJCWVsc2UKLQkJCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCQlpbnNlcnRBZnRlck5vZGUobm9kZSwgbGluZURlbGltaXRlciArIGxpbmVJbmRlbnQpOwotCQkJCQllbHNlCi0JCQkJCQkvLyBhcHBlbmQgaW5kZW50YXRpb24KLQkJCQkJCWluc2VydEFmdGVyTm9kZShub2RlLCBsaW5lRGVsaW1pdGVyICsgbGluZUluZGVudCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRDb21wcmVzc2VkTm9kZVRleHQoSURPTU5vZGUgbm9kZSwgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGZvcm1hdENvbnRyYWludHMpIHsKLQkJcmV0dXJuIGNvbXByZXNzU3BhY2VzKGdldE5vZGVUZXh0KG5vZGUpLCBmb3JtYXRDb250cmFpbnRzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURPTU5vZGUgZ2V0RGVlcGVzdENoaWxkTm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIHJlc3VsdCA9IG51bGw7Ci0JCUlET01Ob2RlIGxhc3RDaGlsZCA9IChJRE9NTm9kZSkgbm9kZS5nZXRMYXN0Q2hpbGQoKTsKLQotCQlpZiAobGFzdENoaWxkID09IG51bGwpCi0JCQlyZXN1bHQgPSBub2RlOwotCQllbHNlIHsKLQkJCXJlc3VsdCA9IGdldERlZXBlc3RDaGlsZE5vZGUobGFzdENoaWxkKTsKLQotCQkJaWYgKChyZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCByZXN1bHQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSkgJiYgIWlzRW5kVGFnTWlzc2luZyhub2RlKSkKLQkJCQlyZXN1bHQgPSBub2RlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzIGdldEZvcm1hdENvbnRyYWludHMoKSB7Ci0JCWlmIChmRm9ybWF0Q29udHJhaW50cyA9PSBudWxsKSB7Ci0JCQlmRm9ybWF0Q29udHJhaW50cyA9IG5ldyBTdHJ1Y3R1cmVkRm9ybWF0Q29udHJhaW50cygpOwotCi0JCQlmRm9ybWF0Q29udHJhaW50cy5zZXRDbGVhckFsbEJsYW5rTGluZXMoZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKSk7Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdENvbnRyYWludHM7Ci0JfQotCi0JcHVibGljIElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKSB7Ci0JCWlmIChmRm9ybWF0UHJlZmVyZW5jZXMgPT0gbnVsbCkgewotCQkJZkZvcm1hdFByZWZlcmVuY2VzID0gbmV3IFN0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTCgpOwotCi0JCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlcyA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKTsKLQkJCWlmIChwcmVmZXJlbmNlcyAhPSBudWxsKSB7Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldExpbmVXaWR0aChwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5MSU5FX1dJRFRIKSk7Ci0JCQkJKChJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MKSBmRm9ybWF0UHJlZmVyZW5jZXMpLnNldFNwbGl0TXVsdGlBdHRycyhwcmVmZXJlbmNlcy5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuU1BMSVRfTVVMVElfQVRUUlMpKTsKLQkJCQlmRm9ybWF0UHJlZmVyZW5jZXMuc2V0Q2xlYXJBbGxCbGFua0xpbmVzKHByZWZlcmVuY2VzLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQkJCWNoYXIgaW5kZW50Q2hhciA9ICcgJzsKLQkJCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJCQlpZiAoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGluZGVudENoYXJQcmVmKSkgewotCQkJCQlpbmRlbnRDaGFyID0gJ1x0JzsKLQkJCQl9Ci0JCQkJaW50IGluZGVudGF0aW9uV2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQkJCVN0cmluZ0J1ZmZlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRlbnRhdGlvbldpZHRoOyBpKyspIHsKLQkJCQkJaW5kZW50LmFwcGVuZChpbmRlbnRDaGFyKTsKLQkJCQl9Ci0JCQkJZkZvcm1hdFByZWZlcmVuY2VzLnNldEluZGVudChpbmRlbnQudG9TdHJpbmcoKSk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gZkZvcm1hdFByZWZlcmVuY2VzOwotCX0KLQotCXByb3RlY3RlZCBJU3RydWN0dXJlZEZvcm1hdHRlciBnZXRGb3JtYXR0ZXIoSURPTU5vZGUgbm9kZSkgewotCQkvLyAyNjIxMzUgLSBOUEUgZHVyaW5nIGZvcm1hdCBvZiBlbXB0eSBkb2N1bWVudAotCQlpZiAobm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0KLQkJc2hvcnQgbm9kZVR5cGUgPSAoKE5vZGUpIG5vZGUpLmdldE5vZGVUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkRm9ybWF0dGVyIGZvcm1hdHRlciA9IG51bGw7Ci0JCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IEVsZW1lbnROb2RlRm9ybWF0dGVyKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCWlmIChub2RlIGluc3RhbmNlb2YgQ0RBVEFTZWN0aW9uSW1wbCkKLQkJCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQllbHNlCi0JCQkJCWZvcm1hdHRlciA9IG5ldyBUZXh0Tm9kZUZvcm1hdHRlcigpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlmb3JtYXR0ZXIgPSBuZXcgQ29tbWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9OT0RFIDogewotCQkJCWZvcm1hdHRlciA9IG5ldyBEb2N1bWVudE5vZGVGb3JtYXR0ZXIoKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWRlZmF1bHQgOiB7Ci0JCQkJZm9ybWF0dGVyID0gbmV3IE5vZGVGb3JtYXR0ZXIoKTsKLQkJCX0KLQkJfQotCi0JCS8vIGluaXQgZm9tYXR0ZXIKLQkJZm9ybWF0dGVyLnNldEZvcm1hdFByZWZlcmVuY2VzKGdldEZvcm1hdFByZWZlcmVuY2VzKCkpOwotCQlmb3JtYXR0ZXIuc2V0UHJvZ3Jlc3NNb25pdG9yKGZQcm9ncmVzc01vbml0b3IpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHJvdGVjdGVkIGludCBnZXRJbmRlbnRhdGlvbkxlbmd0aChTdHJpbmcgaW5kZW50KSB7Ci0JCS8vIFRPRE8gS2l0IDogVGhlIGNhbGN1bGF0aW9uIG9mIEluZGVudGF0aW9uTGVuZ3RoIGlzIG5vdCBjb3JyZWN0Ci0JCS8vIGhlcmUuCi0JCS8vIG5vZGVJbmRlbnRhdGlvbiBtYXkgY29udGFpbiB0YWJzLiBNdWx0aXBseSBieSA0IHRlbXBvcmFyaWx5IHRvIGdldAotCQkvLyBhcHByb3guIHdpZHRoLgotCQkvLyBOZWVkIHRvIHJlLXdvcmsuCi0KLQkJaW50IGluZGVudGF0aW9uTGVuZ3RoID0gMDsKLQotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudC5sZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoaW5kZW50LnN1YnN0cmluZyhpLCBpICsgMSkuY29tcGFyZVRvKFRBQikgPT0gMCkKLQkJCQlpbmRlbnRhdGlvbkxlbmd0aCArPSA0OwotCQkJZWxzZQotCQkJCWluZGVudGF0aW9uTGVuZ3RoKys7Ci0JCX0KLQotCQlyZXR1cm4gaW5kZW50YXRpb25MZW5ndGg7Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgZmluZCB0aGUgaW5kZW50YXRpb24gZm9yIHRoaXMgbm9kZS4gSXQgd2lsbCBzZWFyY2gKLQkgKiBiYWNrd2FyZHMgc3RhcnRpbmcgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBub2RlIHVudGlsIGEgY2hhcmFjdGVyCi0JICogb3RoZXIgdGhhbiBhIHNwYWNlIG9yIGEgdGFiIGlzIGZvdW5kLiBJZiB0aGlzIG5vZGUgaXMgbnVsbCBvciBpdCdzIGEKLQkgKiBkb2N1bWVudCBub2RlIG9yIGl0J3MgYSBmaXJzdCBsZXZlbCBub2RlIChub2RlJ3MgcGFyZW50IGlzIGEgZG9jdW1lbnQKLQkgKiBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eSBzdHJpbmcgd2lsbCBiZSByZXR1cm5lZCBhcyB0aGUgaW5kZW50YXRpb24uCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXROb2RlSW5kZW50KE5vZGUgbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gRU1QVFlfU1RSSU5HOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpICYmIChub2RlLmdldFBhcmVudE5vZGUoKS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkpIHsKLQkJCUlET01Ob2RlIHNpYmxpbmdUZXh0Tm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCWlmICgoc2libGluZ1RleHROb2RlICE9IG51bGwpICYmIChzaWJsaW5nVGV4dE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCQkvLyBmaW5kIHRoZSBpbmRlbnRhdGlvbgotCQkJCVN0cmluZyBzaWJsaW5nVGV4dCA9IHNpYmxpbmdUZXh0Tm9kZS5nZXROb2RlVmFsdWUoKTsKLQkJCQlpbnQgc2libGluZ1RleHRMZW5ndGggPSBzaWJsaW5nVGV4dC5sZW5ndGgoKTsKLQkJCQlpZiAoKHNpYmxpbmdUZXh0ICE9IG51bGwpICYmIChzaWJsaW5nVGV4dExlbmd0aCA+IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNpYmxpbmdUZXh0TGVuZ3RoIC0gMSkgPT0gU1BBQ0VfQ0hBUikgfHwgKHNpYmxpbmdUZXh0LmNoYXJBdChzaWJsaW5nVGV4dExlbmd0aCAtIDEpID09IFRBQl9DSEFSKSkpIHsKLQkJCQkJaW50IHNlYXJjaEluZGV4ID0gc2libGluZ1RleHRMZW5ndGggLSAxOwotCQkJCQl3aGlsZSAoKHNlYXJjaEluZGV4ID49IDApICYmICgoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBTUEFDRV9DSEFSKSB8fCAoc2libGluZ1RleHQuY2hhckF0KHNlYXJjaEluZGV4KSA9PSBUQUJfQ0hBUikpKQotCQkJCQkJc2VhcmNoSW5kZXgtLTsKLQotCQkJCQlpZiAoc2VhcmNoSW5kZXggPCBzaWJsaW5nVGV4dExlbmd0aCkKLQkJCQkJCXJlc3VsdCA9IHNpYmxpbmdUZXh0LnN1YnN0cmluZyhzZWFyY2hJbmRleCArIDEsIHNpYmxpbmdUZXh0TGVuZ3RoKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZU5hbWUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZS5nZXROb2RlTmFtZSgpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0Tm9kZVRleHQoSURPTU5vZGUgbm9kZSkgewotCQlTdHJpbmcgdGV4dCA9IG51bGw7Ci0KLQkJaWYgKChub2RlIGluc3RhbmNlb2YgQ2hhcmFjdGVyRGF0YUltcGwpICYmICEobm9kZSBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSAmJiAhKG5vZGUgaW5zdGFuY2VvZiBDREFUQVNlY3Rpb25JbXBsKSAmJiAhaXNKU1BUYWcobm9kZSkpCi0JCQl0ZXh0ID0gKChDaGFyYWN0ZXJEYXRhSW1wbCkgbm9kZSkuZ2V0U291cmNlKCk7Ci0JCWVsc2UKLQkJCXRleHQgPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0VGV4dCgpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCXByb3RlY3RlZCBJRE9NTm9kZSBnZXRQYXJlbnRJbmRlbnROb2RlKElET01Ob2RlIG5vZGUpIHsKLQkJSURPTU5vZGUgcmVzdWx0ID0gbnVsbDsKLQkJSURPTU5vZGUgcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJaWYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpCi0JCQlyZXN1bHQgPSBwYXJlbnROb2RlOwotCQllbHNlIHsKLQkJCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHBhcmVudE5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEZpcnN0UmVnaW9uKCk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pCi0JCQkJcmVzdWx0ID0gcGFyZW50Tm9kZTsKLQkJCWVsc2UKLQkJCQlyZXN1bHQgPSBnZXRQYXJlbnRJbmRlbnROb2RlKHBhcmVudE5vZGUpOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIGZpbmQgdGhlIGluZGVudGF0aW9uIGZvciBhIG5vZGUgc2libGluZyB0byB0aGlzIG5vZGUuCi0JICogSXQgd2lsbCB0cnkgdG8gZmluZCBhIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlIGZpcnN0LiBJZiB0aGVyZSBpcwotCSAqIG5vIHNpYmxpbmcgbm9kZSBiZWZvcmUgdGhpcyBub2RlLCBpdCB3aWxsIHRyeSB0byBmaW5kIGEgc2libGluZyBub2RlCi0JICogYWZ0ZXIgdGhpcyBub2RlLiBJZiBzdGlsbCBub3QgZm91bmQsIHdlIHdpbGwgY2hlY2sgaWYgdGhpcyBub2RlIGlzCi0JICogYWxyZWFkeSBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQuIElmIHllcywgdGhpcyBub2RlJ3MgaW5kZW50YXRpb24gd2lsbAotCSAqIGJlIHVzZWQuIE90aGVyd2lzZSwgdGhlIHBhcmVudCBub2RlJ3MgaW5kZW50YXRpb24gcGx1cyBvbmUgaW5kZW50YXRpb24KLQkgKiB3aWxsIGJlIHVzZWQuIElmIHRoaXMgbm9kZSBpcyBudWxsIG9yIGl0J3MgYSBkb2N1bWVudCBub2RlIG9yIGl0J3MgYQotCSAqIGZpcnN0IGxldmVsIG5vZGUgKG5vZGUncyBwYXJlbnQgaXMgYSBkb2N1bWVudCBub2RlKSB0aGUgZGVmYXVsdCBlbXB0eQotCSAqIHN0cmluZyB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBpbmRlbnRhdGlvbi4KLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFNpYmxpbmdJbmRlbnQoTm9kZSBub2RlKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAobm9kZS5nZXRQYXJlbnROb2RlKCkgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0UGFyZW50Tm9kZSgpLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSkgewotCQkJLy8gZmluZCB0aGUgdGV4dCBub2RlIGJlZm9yZSB0aGUgcHJldmlvdXMgbm9uLXRleHQgc2libGluZwotCQkJLy8gaWYgdGhhdCdzIG5vdCBmb3VuZCwgd2Ugd2lsbCB0cnkgdGhlIHRleHQgbm9kZSBiZWZvcmUgdGhlIG5leHQKLQkJCS8vIG5vbi10ZXh0IHNpYmxpbmcKLQkJCUlET01Ob2RlIHNpYmxpbmcgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQl3aGlsZSAoKHNpYmxpbmcgIT0gbnVsbCkgJiYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCBzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpKSB7Ci0JCQkJaWYgKHNpYmxpbmcuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkNPTU1FTlRfTk9ERSAmJiBzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpICE9IG51bGwgJiYgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIFN0cmluZ1V0aWxzLmNvbnRhaW5zTGluZURlbGltaXRlcihzaWJsaW5nLmdldFByZXZpb3VzU2libGluZygpLmdldE5vZGVWYWx1ZSgpKSkKLQkJCQkJYnJlYWs7Ci0JCQkJc2libGluZyA9IChJRE9NTm9kZSkgc2libGluZy5nZXRQcmV2aW91c1NpYmxpbmcoKTsKLQkJCX0KLQkJCWlmIChzaWJsaW5nID09IG51bGwpIHsKLQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQkJd2hpbGUgKChzaWJsaW5nICE9IG51bGwpICYmIChzaWJsaW5nLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpKQotCQkJCQlzaWJsaW5nID0gKElET01Ob2RlKSBzaWJsaW5nLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0JCQlTdHJpbmcgc2luZ2xlSW5kZW50ID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRJbmRlbnQoKTsKLQkJCVN0cmluZyBwYXJlbnRMaW5lSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlLmdldFBhcmVudE5vZGUoKSk7Ci0KLQkJCWlmIChzaWJsaW5nICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgc2libGluZ0luZGVudCA9IGdldE5vZGVJbmRlbnQoc2libGluZyk7Ci0JCQkJaWYgKHNpYmxpbmdJbmRlbnQubGVuZ3RoKCkgPiAwKQotCQkJCQlyZXN1bHQgPSBzaWJsaW5nSW5kZW50OwotCQkJCWVsc2UgewotCQkJCQlTdHJpbmcgbm9kZUluZGVudCA9IGdldE5vZGVJbmRlbnQobm9kZSk7Ci0JCQkJCWlmIChub2RlSW5kZW50Lmxlbmd0aCgpID4gcGFyZW50TGluZUluZGVudC5sZW5ndGgoKSkKLQkJCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cwotCQkJCQkJLy8gaW5kZW50YXRpb24gd2lsbCBiZSB1c2VkCi0JCQkJCQlyZXN1bHQgPSBub2RlSW5kZW50OwotCQkJCQllbHNlCi0JCQkJCQlyZXN1bHQgPSBwYXJlbnRMaW5lSW5kZW50ICsgc2luZ2xlSW5kZW50OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCVN0cmluZyBub2RlSW5kZW50ID0gZ2V0Tm9kZUluZGVudChub2RlKTsKLQkJCQlpZiAobm9kZUluZGVudC5sZW5ndGgoKSA+IHBhcmVudExpbmVJbmRlbnQubGVuZ3RoKCkpCi0JCQkJCS8vIHRoaXMgbm9kZSBpcyBpbmRlbnRlZCBmcm9tIGl0cyBwYXJlbnQsIGl0cyBpbmRlbnRhdGlvbgotCQkJCQkvLyB3aWxsIGJlIHVzZWQKLQkJCQkJcmVzdWx0ID0gbm9kZUluZGVudDsKLQkJCQllbHNlCi0JCQkJCXJlc3VsdCA9IHBhcmVudExpbmVJbmRlbnQgKyBzaW5nbGVJbmRlbnQ7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEFmdGVyTm9kZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCWludCBvZmZzZXQgPSBub2RlLmdldEVuZE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQkvLyAyNjE5NjggLSBmb3JtYXR0aW5nIHRhZyB3aXRob3V0IGNsb3NpbmcgYnJhY2tldDogPHQxPjx0MQotCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQlvZmZzZXQgPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCWxlbmd0aCA9IG5vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBvZmZzZXQ7Ci0JCX0KLQkJcmVwbGFjZShzdHJ1Y3R1cmVkRG9jdW1lbnQsIG9mZnNldCwgbGVuZ3RoLCBzdHJpbmcpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluc2VydEJlZm9yZU5vZGUoSURPTU5vZGUgbm9kZSwgU3RyaW5nIHN0cmluZykgewotCQlJRE9NTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gbm9kZS5nZXRNb2RlbCgpOwotCQlJU3RydWN0dXJlZERvY3VtZW50IHN0cnVjdHVyZWREb2N1bWVudCA9IHN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKTsKLQotCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgbm9kZS5nZXRTdGFydE9mZnNldCgpLCAwLCBzdHJpbmcpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoSVN0cnVjdHVyZWRGb3JtYXR0ZXIuY2xhc3MpOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzRW5kVGFnTWlzc2luZyhJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKChub2RlICE9IG51bGwpICYmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiAhaXNKU1BUYWcobm9kZSkpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCi0JCQlJVGV4dFJlZ2lvbiBzdGFydFRhZ05hbWVSZWdpb24gPSBudWxsOwotCQkJaWYgKHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAxKQotCQkJCXN0YXJ0VGFnTmFtZVJlZ2lvbiA9IHN0YXJ0VGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQlJVGV4dFJlZ2lvbiBlbmRUYWdOYW1lUmVnaW9uID0gbnVsbDsKLQkJCWlmIChlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpLnNpemUoKSA+IDEpCi0JCQkJZW5kVGFnTmFtZVJlZ2lvbiA9IGVuZFRhZ1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25zKCkuZ2V0KDEpOwotCi0JCQlJVGV4dFJlZ2lvbkxpc3Qgc3RhcnRUYWdSZWdpb25zID0gc3RhcnRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkJaWYgKHN0YXJ0VGFnTmFtZVJlZ2lvbiA9PSBlbmRUYWdOYW1lUmVnaW9uICYmIHN0YXJ0VGFnTmFtZVJlZ2lvbiAhPSBudWxsICYmIChzdGFydFRhZ1JlZ2lvbnMuZ2V0KDApKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOICYmIChzdGFydFRhZ1JlZ2lvbnMuZ2V0KHN0YXJ0VGFnUmVnaW9ucy5zaXplKCkgLSAxKS5nZXRUeXBlKCkpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQkvLyBlbmQgdGFnIG1pc3NpbmcKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBub2RlSGFzU2libGluZ3MoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCkgIT0gbnVsbCkgfHwgKG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSAhPSBudWxsKTsKLQl9Ci0KLQkvKioKLQkgKiBOb2RlIGNoYW5nZWQuIE5vIGZvcm1hdCBzaG91bGQgYmUgcGVyZm9ybWVkIGF1dG9tYXRpY2FsbHkuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZVJlZ2lvblNwYWNlcyhJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJaWYgKChyZWdpb24gIT0gbnVsbCkgJiYgKHJlZ2lvbiBpbnN0YW5jZW9mIENvbnRleHRSZWdpb24gfHwgcmVnaW9uIGluc3RhbmNlb2YgVGFnTmFtZVJlZ2lvbikgJiYgKGZsYXROb2RlLmdldEVuZE9mZnNldChyZWdpb24pID4gZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pKSkgewotCQkJSURPTU1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IG5vZGUuZ2V0TW9kZWwoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCi0JCQlyZXBsYWNlKHN0cnVjdHVyZWREb2N1bWVudCwgZmxhdE5vZGUuZ2V0VGV4dEVuZE9mZnNldChyZWdpb24pLCBmbGF0Tm9kZS5nZXRFbmRPZmZzZXQocmVnaW9uKSAtIGZsYXROb2RlLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKSwgRU1QVFlfU1RSSU5HKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSB0aGUgc3RyaW5nIGF0IG9mZnNldCBhbmQgbGVuZ3RoIHdpdGggYSBuZXcKLQkgKiBzdHJpbmcuIElmIHRoZSBzdHJpbmcgdG8gYmUgcmVwbGFjZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG5ldyBzdHJpbmcsIHRoZQotCSAqIHN0cmluZyB3aWxsIG5vdCBiZSByZXBsYWNlZC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCByZXBsYWNlKElTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCXRyeSB7Ci0JCQlTdHJpbmcgc3RydWN0dXJlZERvY3VtZW50U3RyaW5nID0gc3RydWN0dXJlZERvY3VtZW50LmdldChvZmZzZXQsIGxlbmd0aCk7Ci0JCQlpZiAoc3RydWN0dXJlZERvY3VtZW50U3RyaW5nLmNvbXBhcmVUbyhzdHJpbmcpICE9IDApCi0JCQkJc3RydWN0dXJlZERvY3VtZW50LnJlcGxhY2VUZXh0KHN0cnVjdHVyZWREb2N1bWVudCwgb2Zmc2V0LCBsZW5ndGgsIHN0cmluZyk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgdGhlIG5vZGUgdmFsdWUgd2l0aCBhIG5ldyBzdHJpbmcuIElmIHRoZSBub2RlCi0JICogdmFsdWUgdG8gYmUgcmVwbGFjZWQgaXMgdGhlIHNhbWUgYXMgdGhlIG5ldyBzdHJpbmcsIHRoZSBub2RlIHZhbHVlIHdpbGwKLQkgKiBub3QgYmUgcmVwbGFjZWQuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcmVwbGFjZU5vZGVWYWx1ZShJRE9NTm9kZSBub2RlLCBTdHJpbmcgc3RyaW5nKSB7Ci0JCUlET01Nb2RlbCBzdHJ1Y3R1cmVkTW9kZWwgPSBub2RlLmdldE1vZGVsKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgc3RydWN0dXJlZERvY3VtZW50ID0gc3RydWN0dXJlZE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQlpbnQgb2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQlpbnQgbGVuZ3RoID0gbm9kZS5nZXRFbmRPZmZzZXQoKSAtIG5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQotCQl0cnkgewotCQkJU3RyaW5nIHN0cnVjdHVyZWREb2N1bWVudFN0cmluZyA9IHN0cnVjdHVyZWREb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFN0cmluZy5jb21wYXJlVG8oc3RyaW5nKSAhPSAwKQotCQkJCXJlcGxhY2Uoc3RydWN0dXJlZERvY3VtZW50LCBvZmZzZXQsIGxlbmd0aCwgc3RyaW5nKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZvcm1hdFByZWZlcmVuY2VzKElTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgZm9ybWF0UHJlZmVyZW5jZXMpIHsKLQkJZkZvcm1hdFByZWZlcmVuY2VzID0gZm9ybWF0UHJlZmVyZW5jZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0dGVyI3NldFByb2dyZXNzTW9uaXRvcihvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcikKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9ncmVzc01vbml0b3IoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCWZQcm9ncmVzc01vbml0b3IgPSBtb25pdG9yOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNKU1BUYWcoTm9kZSBub2RlKSB7Ci0KLQkJZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCS8vIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfVEVYVCA9ICJKU1BfQ09NTUVOVF9URVhUIjsgLy8kTk9OLU5MUy0xJAotCi0JCWZpbmFsIFN0cmluZyBKU1BfQ09OVEVOVCA9ICJKU1BfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9ERUNMQVJBVElPTl9PUEVOID0gIkpTUF9ERUNMQVJBVElPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9DTE9TRSA9ICJKU1BfRElSRUNUSVZFX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9OQU1FID0gIkpTUF9ESVJFQ1RJVkVfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlmaW5hbCBTdHJpbmcgSlNQX0RJUkVDVElWRV9PUEVOID0gIkpTUF9ESVJFQ1RJVkVfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQkJZmluYWwgU3RyaW5nIEpTUF9FWFBSRVNTSU9OX09QRU4gPSAiSlNQX0VYUFJFU1NJT05fT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBmaW5hbCBTdHJpbmcgSlNQX1JPT1RfVEFHX05BTUUgPSAiSlNQX1JPT1RfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQkJZmluYWwgU3RyaW5nIEpTUF9TQ1JJUFRMRVRfT1BFTiA9ICJKU1BfU0NSSVBUTEVUX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCS8vIGluIHNvbWUgY2FzZXMsIHRoZSBub2RlcyBleGlzdHMsIGJ1dCBoYXNuJ3QgYmVlbiBhc3NvY2lhdGVkCi0JCQkvLyB3aXRoCi0JCQkvLyBhIGZsYXRub2RlIHlldCAodGhlIHNjcmVlbiB1cGRhdGVzIGNhbiBiZSBpbml0aWF0ZWQgb24gYQotCQkJLy8gZGlmZmVyZW50IHRocmVhZCwKLQkJCS8vIHNvIHRoZSByZXF1ZXN0IGZvciBhIGZsYXRub2RlIGNhbiBjb21lIGluIGJlZm9yZSB0aGUgbm9kZSBpcwotCQkJLy8gZnVsbHkgZm9ybWVkLgotCQkJLy8gaWYgdGhlIGZsYXRub2RlIGlzIG51bGwsIHdlJ2xsIGp1c3QgYWxsb3cgdGhlIGRlZmF1bHRzIHRvCi0JCQkvLyBhcHBseS4KLQkJCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIGZsYXROb2RlVHlwZSA9IGZsYXROb2RlLmdldFR5cGUoKTsKLQkJCQkvLyBzaG91bGQgbm90IGJlIG51bGwsIGJ1dCBqdXN0IHRvIGJlIHN1cmUKLQkJCQlpZiAoZmxhdE5vZGVUeXBlICE9IG51bGwpIHsKLQkJCQkJaWYgKChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DT05URU5UKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0VYUFJFU1NJT05fT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9TQ1JJUFRMRVRfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ERUNMQVJBVElPTl9PUEVOKSkgfHwgKGZsYXROb2RlVHlwZS5lcXVhbHMoSlNQX0RJUkVDVElWRV9DTE9TRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfTkFNRSkpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9ESVJFQ1RJVkVfT1BFTikpIHx8IChmbGF0Tm9kZVR5cGUuZXF1YWxzKEpTUF9DTE9TRSkpKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Byb3Zpc2lvbmFsL2Zvcm1hdC9TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODRjNjg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1N0cnVjdHVyZWRGb3JtYXRQcmVmZXJlbmNlc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXNYTUwgZXh0ZW5kcyBTdHJ1Y3R1cmVkRm9ybWF0UHJlZmVyZW5jZXMgaW1wbGVtZW50cyBJU3RydWN0dXJlZEZvcm1hdFByZWZlcmVuY2VzWE1MIHsKLQlwcml2YXRlIGJvb2xlYW4gZlNwbGl0TXVsdGlBdHRyczsKLQotCXB1YmxpYyBib29sZWFuIGdldFNwbGl0TXVsdGlBdHRycygpIHsKLQkJcmV0dXJuIGZTcGxpdE11bHRpQXR0cnM7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0U3BsaXRNdWx0aUF0dHJzKGJvb2xlYW4gc3BsaXRNdWx0aUF0dHJzKSB7Ci0JCWZTcGxpdE11bHRpQXR0cnMgPSBzcGxpdE11bHRpQXR0cnM7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvZm9ybWF0L1RleHROb2RlRm9ybWF0dGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmNmZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC9mb3JtYXQvVGV4dE5vZGVGb3JtYXR0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIEplc3BlciBTdGVlbiBN+GxsZXIgLSB4bWw6c3BhY2U9J3ByZXNlcnZlJyBzdXBwb3J0Ci0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5mb3JtYXQuSVN0cnVjdHVyZWRGb3JtYXRDb250cmFpbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnV0aWxzLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFRleHROb2RlRm9ybWF0dGVyIGV4dGVuZHMgTm9kZUZvcm1hdHRlciB7Ci0JcHJvdGVjdGVkIHZvaWQgZm9ybWF0Tm9kZShJRE9NTm9kZSBub2RlLCBJU3RydWN0dXJlZEZvcm1hdENvbnRyYWludHMgZm9ybWF0Q29udHJhaW50cykgewotCQkvLyBbMTExNjc0XSBJZiBpbnNpZGUgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIgZWxlbWVudCwgd2UgYmFpbAotCQlpZiAoZm9ybWF0Q29udHJhaW50cy5nZXRJblByZXNlcnZlU3BhY2VFbGVtZW50KCkpCi0JCQlyZXR1cm47Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnQgZG9jID0gbm9kZS5nZXRNb2RlbCgpLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQkJaW50IGxpbmUgPSBkb2MuZ2V0TGluZU9mT2Zmc2V0KG5vZGUuZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQlTdHJpbmcgbGluZURlbGltaXRlciA9IGRvYy5nZXRMaW5lRGVsaW1pdGVyKCk7Ci0JCQl0cnkgewotCQkJCWxpbmVEZWxpbWl0ZXIgPSBkb2MuZ2V0TGluZURlbGltaXRlcihsaW5lKTsKLQkJCQlpZiAobGluZURlbGltaXRlciA9PSBudWxsKQotCQkJCQlsaW5lRGVsaW1pdGVyID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0JCQlpbnQgbGluZVdpZHRoID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKTsKLQkJCUlET01Ob2RlIHBhcmVudE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJU3RyaW5nIG5vZGVJbmRlbnRhdGlvbiA9IGZvcm1hdENvbnRyYWludHMuZ2V0Q3VycmVudEluZGVudCgpOwotCi0JCQkvLyBjb21wdXRlIGN1cnJlbnQgYXZhaWxhYmxlIGxpbmUgd2lkdGgKLQkJCWludCBjdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gMDsKLQkJCXRyeSB7Ci0JCQkJaW50IG5vZGVOYW1lT2Zmc2V0ID0gbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBsaW5lT2Zmc2V0ID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChub2RlTmFtZU9mZnNldCkuZ2V0T2Zmc2V0KCk7Ci0JCQkJU3RyaW5nIHRleHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldChsaW5lT2Zmc2V0LCBub2RlTmFtZU9mZnNldCAtIGxpbmVPZmZzZXQpOwotCQkJCWludCB1c2VkV2lkdGggPSBnZXRJbmRlbnRhdGlvbkxlbmd0aCh0ZXh0KTsKLQkJCQljdXJyZW50QXZhaWxhYmxlTGluZVdpZHRoID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRMaW5lV2lkdGgoKSAtIHVzZWRXaWR0aDsKLQkJCX0KLQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyB3ZSBmaW5kIHJlYXNvbiBub3QgdG8KLQkJCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCQl9Ci0KLQkJCVN0cmluZyBjb21wcmVzc2VkVGV4dCA9IGdldENvbXByZXNzZWROb2RlVGV4dChub2RlLCBmb3JtYXRDb250cmFpbnRzKTsKLQotCQkJaWYgKCgoZW5vdWdoU3BhY2UocGFyZW50Tm9kZSwgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCwgY29tcHJlc3NlZFRleHQpKSAmJiAobm9TaWJsaW5nc0FuZE5vRm9sbG93aW5nQ29tbWVudChub2RlKSkgJiYgIWZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uQ29udGFpbnNMaW5lRGVsaW1pdGVycyhwYXJlbnROb2RlKSkgfHwgbm9kZS5nZXRTdGFydE9mZnNldCgpID09IDApIHsKLQkJCQkvLyBlbm91Z2ggc3BhY2UKLQkJCQkvLyBhbmQgdGV4dCBoYXMgbm8gbGluZSBkZWxpbWl0ZXJzCi0JCQkJLy8gYW5kIChub2RlIGhhcyBubyBzaWJsaW5ncyBvciBmb2xsb3dlZCBieSBpbmxpbmUgY29tbWVudCkKLQkJCQkvLyBhbmQKLQkJCQkvLyBwYXJlbnRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkNvbnRhaW5zTGluZURlbGltaXRlcnMKLQotCQkJCWlmIChpc0VuZFRhZ01pc3NpbmcocGFyZW50Tm9kZSkpIHsKLQkJCQkJcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgcGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCXdoaWxlIChpc0VuZFRhZ01pc3NpbmcocGFyZW50Tm9kZSkpCi0JCQkJCQlwYXJlbnROb2RlID0gKElET01Ob2RlKSBwYXJlbnROb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCQkvLyBhZGQgcGFyZW50J3MgaW5kZW50YXRpb24gdG8gZW5kCi0JCQkJCW5vZGVJbmRlbnRhdGlvbiA9IGdldE5vZGVJbmRlbnQocGFyZW50Tm9kZSk7Ci0KLQkJCQkJaWYgKCFjb21wcmVzc2VkVGV4dC5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKSkgewotCQkJCQkJY29tcHJlc3NlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgoY29tcHJlc3NlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJY29tcHJlc3NlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgoY29tcHJlc3NlZFRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoKHBhcmVudE5vZGUgIT0gbnVsbCkgJiYgKHBhcmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpICYmIChub2RlLmdldE5vZGVWYWx1ZSgpLmxlbmd0aCgpID4gMCkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApICYmICgobm9kZS5nZXRQcmV2aW91c1NpYmxpbmcoKSA9PSBudWxsKSB8fCAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpKSkKLQkJCQkJLy8gZGVsZXRlIHNwYWNlcyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiB0aGUgZG9jdW1lbnQKLQkJCQkJY29tcHJlc3NlZFRleHQgPSBFTVBUWV9TVFJJTkc7Ci0KLQkJCQlyZXBsYWNlTm9kZVZhbHVlKG5vZGUsIGNvbXByZXNzZWRUZXh0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vdCBlbm91Z2ggc3BhY2UsIG5lZWQgdG8gcmVmbG93IHRleHQKLQotCQkJCWN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggPSBsaW5lV2lkdGggLSBnZXRJbmRlbnRhdGlvbkxlbmd0aChub2RlSW5kZW50YXRpb24pOwotCQkJCUxpc3QgdmVjdG9yID0gcmVmbG93VGV4dChjb21wcmVzc2VkVGV4dCwgY3VycmVudEF2YWlsYWJsZUxpbmVXaWR0aCk7Ci0JCQkJaW50IHZlY3RvclNpemUgPSB2ZWN0b3Iuc2l6ZSgpOwotCQkJCVN0cmluZyByZWZsb3dlZFRleHQgPSBuZXcgU3RyaW5nKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IHZlY3RvclNpemU7IGkrKykgewotCQkJCQlpZiAoKChTdHJpbmcpIHZlY3Rvci5nZXQoaSkpLnRyaW0oKS5sZW5ndGgoKSA+IDApCi0JCQkJCQlyZWZsb3dlZFRleHQgPSByZWZsb3dlZFRleHQgKyBsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uICsgKFN0cmluZykgdmVjdG9yLmdldChpKTsKLQkJCQkJZWxzZQotCQkJCQkJcmVmbG93ZWRUZXh0ID0gcmVmbG93ZWRUZXh0ICsgbGluZURlbGltaXRlcjsKLQkJCQl9Ci0KLQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpID09IG51bGwpIHsKLQkJCQkJaWYgKGlzRW5kVGFnTWlzc2luZyhwYXJlbnROb2RlKSkgewotCQkJCQkJLy8gZG9uJ3QgYWRkIGluZGVudGF0aW9uIHRvIGVuZCBpZiBwYXJlbnQgZW5kIHRhZyBpcwotCQkJCQkJLy8gbWlzc2luZwotCQkJCQl9Ci0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBhZGQgcGFyZW50J3MgaW5kZW50YXRpb24gdG8gZW5kCi0JCQkJCQlub2RlSW5kZW50YXRpb24gPSBnZXROb2RlSW5kZW50KHBhcmVudE5vZGUpOwotCi0JCQkJCQlpZiAoIXJlZmxvd2VkVGV4dC5lbmRzV2l0aChsaW5lRGVsaW1pdGVyICsgbm9kZUluZGVudGF0aW9uKSkgewotCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIG5vZGVJbmRlbnRhdGlvbik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmICghcmVmbG93ZWRUZXh0LmVuZHNXaXRoKGxpbmVEZWxpbWl0ZXIgKyBub2RlSW5kZW50YXRpb24pKSB7Ci0JCQkJCQkvLyBub3QgYWxyZWFkeSBlbmRlZCB3aXRoIHRoZSBleHBlY3RlZCBpbmRlbnRhdGlvbgotCi0JCQkJCQlpZiAobm9kZS5nZXROZXh0U2libGluZygpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkJCQkvLyBhZGQgaW5kZW50YXRpb24gdG8gZW5kIGlmCi0JCQkJCQkJLy8gY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIKLQkJCQkJCQkvLyBvciBmb2xsb3dlZCBieSBtdWx0aUxpbmVDb21tZW50Ci0KLQkJCQkJCQlTdHJpbmcgbm9kZVRleHQgPSBnZXROb2RlVGV4dChub2RlKTsKLQkJCQkJCQlpbnQgaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyID0gU3RyaW5nVXRpbHMuaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyKG5vZGVUZXh0KTsKLQkJCQkJCQlib29sZWFuIGN1cnJlbnRUZXh0RW5kc1dpdGhMaW5lRGVsaW1pdGVyID0gaW5kZXhPZkxhc3RMaW5lRGVsaW1pdGVyICE9IC0xOwotCQkJCQkJCWlmIChjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlcikgewotCQkJCQkJCQkvLyBubyBtb3JlIG5vbiBibGFuayBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGxhc3QKLQkJCQkJCQkJLy8gbGluZSBkZWxpbWl0ZXIKLQkJCQkJCQkJY3VycmVudFRleHRFbmRzV2l0aExpbmVEZWxpbWl0ZXIgPSBTdHJpbmdVdGlscy5pbmRleE9mTm9uYmxhbmsobm9kZVRleHQsIGluZGV4T2ZMYXN0TGluZURlbGltaXRlcikgPT0gLTE7Ci0JCQkJCQkJfQotCi0JCQkJCQkJU3RyaW5nIG5vZGVWYWx1ZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKS5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQlib29sZWFuIG11bHRpTGluZUNvbW1lbnQgPSBTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZVZhbHVlKTsKLQotCQkJCQkJCWlmIChjdXJyZW50VGV4dEVuZHNXaXRoTGluZURlbGltaXRlciB8fCBtdWx0aUxpbmVDb21tZW50KSB7Ci0JCQkJCQkJCXJlZmxvd2VkVGV4dCA9IFN0cmluZ1V0aWxzLmFwcGVuZElmTm90RW5kV2l0aChyZWZsb3dlZFRleHQsIGxpbmVEZWxpbWl0ZXIpOwotCQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCS8vIG5vdCBhIGNvbW1lbnQsIGp1c3QgYWRkIGFkZCBpbmRlbnRhdGlvbiB0byBlbmQKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBsaW5lRGVsaW1pdGVyKTsKLQkJCQkJCQlyZWZsb3dlZFRleHQgPSBTdHJpbmdVdGlscy5hcHBlbmRJZk5vdEVuZFdpdGgocmVmbG93ZWRUZXh0LCBub2RlSW5kZW50YXRpb24pOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCi0JCQkJcmVwbGFjZU5vZGVWYWx1ZShub2RlLCByZWZsb3dlZFRleHQpOwotCQkJfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gbm9TaWJsaW5nc0FuZE5vRm9sbG93aW5nQ29tbWVudChJRE9NTm9kZSBub2RlKSB7Ci0JCUlET01Ob2RlIG5leHRTaWJsaW5nID0gKElET01Ob2RlKSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCXJldHVybiAhbm9kZUhhc1NpYmxpbmdzKG5vZGUpIHx8IChub0xpbmVEZWxpbWl0ZXIobm9kZSkgJiYgaXNDb21tZW50KG5leHRTaWJsaW5nKSAmJiBub0xpbmVEZWxpbWl0ZXIobmV4dFNpYmxpbmcpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50KElET01Ob2RlIG5vZGUpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQ09NTUVOVF9OT0RFOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIG5vTGluZURlbGltaXRlcihJRE9NTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9ICFTdHJpbmdVdGlscy5jb250YWluc0xpbmVEZWxpbWl0ZXIobm9kZS5nZXROb2RlVmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gZW5vdWdoU3BhY2UoSURPTU5vZGUgcGFyZW50Tm9kZSwgaW50IGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGgsIFN0cmluZyBjb21wcmVzc2VkVGV4dCkgewotCQlyZXR1cm4gY29tcHJlc3NlZFRleHQubGVuZ3RoKCkgPD0gKGN1cnJlbnRBdmFpbGFibGVMaW5lV2lkdGggLSBwYXJlbnROb2RlLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgLSAzKSAmJiAhU3RyaW5nVXRpbHMuY29udGFpbnNMaW5lRGVsaW1pdGVyKGNvbXByZXNzZWRUZXh0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVmVjdG9yIHJlZmxvd1RleHQoU3RyaW5nIHRleHQsIGludCBhdmFpbGFibGVXaWR0aCkgewotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG51bGw7Ci0JCWJvb2xlYW4gY2xlYXJBbGxCbGFua0xpbmVzID0gZ2V0Rm9ybWF0UHJlZmVyZW5jZXMoKS5nZXRDbGVhckFsbEJsYW5rTGluZXMoKTsKLQotCQlpZiAoY2xlYXJBbGxCbGFua0xpbmVzKQotCQkJc3RyaW5nQXJyYXkgPSBTdHJpbmdVdGlscy5hc0FycmF5KHRleHQpOwotCQllbHNlCi0JCQlzdHJpbmdBcnJheSA9IFN0cmluZ1V0aWxzLmFzQXJyYXkodGV4dCwgREVMSU1JVEVSUywgdHJ1ZSk7Ci0KLQkJVmVjdG9yIG91dHB1dCA9IG5ldyBWZWN0b3IoKTsKLQkJaWYgKChzdHJpbmdBcnJheSAhPSBudWxsKSAmJiAoc3RyaW5nQXJyYXkubGVuZ3RoID4gMCkpIHsKLQkJCVN0cmluZ0J1ZmZlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCQlpZiAoc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSAhPSAwKQotCQkJCWJ1ZmZlci5hcHBlbmQoc3RyaW5nQXJyYXlbMF0pOwotCQkJaW50IGJ1ZmZlckxlbmd0aCA9IHN0cmluZ0FycmF5WzBdLnRvU3RyaW5nKCkubGVuZ3RoKCk7Ci0JCQlib29sZWFuIGNyID0gc3RyaW5nQXJyYXlbMF0uY29tcGFyZVRvKENSKSA9PSAwOwotCi0JCQlmb3IgKGludCBpID0gMTsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJU3RyaW5nIGVhY2hTdHJpbmcgPSBzdHJpbmdBcnJheVtpXTsKLQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKFNQQUNFKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oVEFCKSAhPSAwKSAmJiAoZWFjaFN0cmluZy5jb21wYXJlVG8oRkYpICE9IDApKSB7Ci0JCQkJCWlmICgoYnVmZmVyTGVuZ3RoICsgMSArIGVhY2hTdHJpbmcubGVuZ3RoKCkgPiBhdmFpbGFibGVXaWR0aCkgfHwgKGVhY2hTdHJpbmcuY29tcGFyZVRvKENSKSA9PSAwKSB8fCAoZWFjaFN0cmluZy5jb21wYXJlVG8oTEYpID09IDApKSB7Ci0JCQkJCQlpZiAoKGVhY2hTdHJpbmcuY29tcGFyZVRvKExGKSA9PSAwKSAmJiBjcikgewotCQkJCQkJCS8vIGRvIG5vdGhpbmcKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCW91dHB1dC5hZGQoYnVmZmVyLnRvU3RyaW5nKCkpOwotCQkJCQkJCWJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQlidWZmZXJMZW5ndGggPSAwOwotCQkJCQkJfQotCQkJCQkJY3IgPSBlYWNoU3RyaW5nLmNvbXBhcmVUbyhDUikgPT0gMDsKLQkJCQkJfQotCQkJCQllbHNlIGlmIChidWZmZXIudG9TdHJpbmcoKS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCQlidWZmZXIuYXBwZW5kKFNQQUNFKTsKLQkJCQkJCWJ1ZmZlckxlbmd0aCsrOwotCQkJCQl9Ci0JCQkJCWlmICgoZWFjaFN0cmluZy5jb21wYXJlVG8oQ1IpICE9IDApICYmIChlYWNoU3RyaW5nLmNvbXBhcmVUbyhMRikgIT0gMCkpIHsKLQkJCQkJCWJ1ZmZlci5hcHBlbmQoZWFjaFN0cmluZyk7Ci0JCQkJCQlidWZmZXJMZW5ndGggPSBidWZmZXJMZW5ndGggKyBlYWNoU3RyaW5nLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJb3V0cHV0LmFkZChidWZmZXIudG9TdHJpbmcoKSk7Ci0JCX0KLQkJZWxzZQotCQkJb3V0cHV0LmFkZCh0ZXh0KTsKLQotCQlyZXR1cm4gb3V0cHV0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcHJvdmlzaW9uYWwvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYzgxYmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9wcm92aXNpb25hbC90ZXh0L0lYTUxQYXJ0aXRpb25zLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0OwotCi0KLQotLyoqCi0gKiBUaGlzIGludGVyZmFjZSBpcyBub3QgaW50ZW5kZWQgdG8gYmUgaW1wbGVtZW50ZWQuCi0gKiBJdCBkZWZpbmVzIHRoZSBwYXJ0aXRpb24gdHlwZXMgZm9yIFhNTC4KLSAqIENsaWVudHMgc2hvdWxkIHJlZmVyZW5jZSB0aGUgcGFydGl0aW9uIHR5cGUgU3RyaW5ncyBkZWZpbmVkIGhlcmUgZGlyZWN0bHkuCi0gKiAKLSAqIEBkZXByZWNhdGVkIHVzZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElYTUxQYXJ0aXRpb25zIHsKLQkKLQlTdHJpbmcgWE1MX0RFRkFVTFQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0NEQVRBID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NEQVRBIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfUEkgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfUEkiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9ERUNMQVJBVElPTiA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUNMIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ09NTUVOVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9DT01NRU5UIjsgLy8kTk9OLU5MUy0xJAotCQotCS8qCi0JICogVGhpcyB2YWx1ZSBpcyB1c2VkIGFzIGEgcHJlZml4IHRvIGFueSB1bmtub3duIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zCi0JICogd2UgZmluZC4gVGhlIHByb2Nlc3NvciB0YXJnZXQgbmFtZSBpcyBjb252ZXJ0ZWQgdG8gdXBwZXJjYXNlIGFuZAotCSAqIGFwcGVuZGVkIHRvIHRoZSBwcmVmaXggdG8gY3JlYXRlIGEgdW5pcXVlIHBhcnRpdGlvbiB0eXBlLgotCSAqLwotCVN0cmluZyBQUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1BSRUZJWCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlBST0NFU1NJTkdfSU5TVFJVQ1RJT046IjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogU2hvdWxkIG1hdGNoCi0JICogb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmR0ZC5wYXJ0aXRpb25pbmcuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvckRURC5TVF9EVERfU1VCU0VUCi0JICovCi0JU3RyaW5nIERURF9TVUJTRVQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5kdGQuaW50ZXJuYWxfc3Vic2V0IjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTVJlZ2lvbkNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvcmVnaW9ucy9ET01SZWdpb25Db250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzk4OTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9yZWdpb25zL0RPTVJlZ2lvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnM7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgRE9NUmVnaW9uQ29udGV4dCB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCTE9DS19URVhUID0gIkJMT0NLX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVTkRFRklORUQgPSAiVU5ERUZJTkVEIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0hJVEVfU1BBQ0UgPSAiV0hJVEVfU1BBQ0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVExJU1RfREVDTF9DTE9TRSA9ICJYTUxfQVRUTElTVF9ERUNMX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xfQ09OVEVOVCA9ICJYTUxfQVRUTElTVF9ERUNMX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0FUVExJU1RfREVDTF9OQU1FID0gIlhNTF9BVFRMSVNUX0RFQ0xfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OID0gIlhNTF9BVFRMSVNUX0RFQ0xBUkFUSU9OIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DREFUQV9DTE9TRSA9ICJYTUxfQ0RBVEFfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NEQVRBX09QRU4gPSAiWE1MX0NEQVRBX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NEQVRBX1RFWFQgPSAiWE1MX0NEQVRBX1RFWFQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0NIQVJfUkVGRVJFTkNFID0gIlhNTF9DSEFSX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9DTE9TRSA9ICJYTUxfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9DT01NRU5UX09QRU4gPSAiWE1MX0NPTU1FTlRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09NTUVOVF9URVhUID0gIlhNTF9DT01NRU5UX1RFWFQiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09OVEVOVCA9ICJYTUxfQ09OVEVOVCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVDTEFSQVRJT05fQ0xPU0UgPSAiWE1MX0RFQ0xBUkFUSU9OX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OX09QRU4gPSAiWE1MX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTiA9ICJYTUxfRE9DVFlQRV9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSA9ICJYTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMgPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCTElDIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiA9ICJYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGID0gIlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNURU0gPSAiWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ET0NUWVBFX0lOVEVSTkFMX1NVQlNFVCA9ICJYTUxfRE9DVFlQRV9JTlRFUk5BTF9TVUJTRVQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0RPQ1RZUEVfTkFNRSA9ICJYTUxfRE9DVFlQRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UgPSAiWE1MX0VMRU1FTlRfREVDTF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMX0NPTlRFTlQgPSAiWE1MX0VMRU1FTlRfREVDTF9DT05URU5UIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTEVNRU5UX0RFQ0xfTkFNRSA9ICJYTUxfRUxFTUVOVF9ERUNMX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRUxFTUVOVF9ERUNMQVJBVElPTiA9ICJYTUxfRUxFTUVOVF9ERUNMQVJBVElPTiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRU1QVFlfVEFHX0NMT1NFID0gIlhNTF9FTVBUWV9UQUdfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0VORF9UQUdfT1BFTiA9ICJYTUxfRU5EX1RBR19PUEVOIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9FTlRJVFlfUkVGRVJFTkNFID0gIlhNTF9FTlRJVFlfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BFX1JFRkVSRU5DRSA9ICJYTUxfUEVfUkVGRVJFTkNFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QSV9DTE9TRSA9ICJYTUxfUElfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BJX0NPTlRFTlQgPSAiWE1MX1BJX0NPTlRFTlQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BJX09QRU4gPSAiWE1MX1BJX09QRU4iOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTID0gIlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX0FUVFJJQlVURV9OQU1FID0gIlhNTF9UQUdfQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgPSAiWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1RBR19DTE9TRSA9ICJYTUxfVEFHX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9UQUdfTkFNRSA9ICJYTUxfVEFHX05BTUUiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfVEFHX09QRU4gPSAiWE1MX1RBR19PUEVOIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1NDY1Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW9kZWxRdWVyeUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLQotcHVibGljIGludGVyZmFjZSBNb2RlbFF1ZXJ5QWRhcHRlciBleHRlbmRzIElOb2RlQWRhcHRlciB7Ci0KLQlwdWJsaWMgQ01Eb2N1bWVudENhY2hlIGdldENNRG9jdW1lbnRDYWNoZSgpOwotCi0JcHVibGljIFVSSVJlc29sdmVyIGdldElkUmVzb2x2ZXIoKTsKLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKTsKLQotCXZvaWQgcmVsZWFzZSgpOwotCi0Jdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld0lkUmVzb2x2ZXIpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vZGVsUXVlcnlBZGFwdGVySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmIwMGU2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvc3NlbW9kZWxxdWVyeS9Nb2RlbFF1ZXJ5QWRhcHRlckltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotCi0KLXB1YmxpYyBjbGFzcyBNb2RlbFF1ZXJ5QWRhcHRlckltcGwgaW1wbGVtZW50cyBNb2RlbFF1ZXJ5QWRhcHRlciB7Ci0JcHJvdGVjdGVkIENNRG9jdW1lbnRDYWNoZSBjbURvY3VtZW50Q2FjaGU7Ci0JcHJvdGVjdGVkIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXI7Ci0KLQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotCi0JcHVibGljIE1vZGVsUXVlcnlBZGFwdGVySW1wbChDTURvY3VtZW50Q2FjaGUgY21Eb2N1bWVudENhY2hlLCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnksIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXIpIHsKLQkJdGhpcy5jbURvY3VtZW50Q2FjaGUgPSBjbURvY3VtZW50Q2FjaGU7Ci0JCXRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7Ci0JCXRoaXMuaWRSZXNvbHZlciA9IGlkUmVzb2x2ZXI7Ci0JfQotCi0JcHVibGljIENNRG9jdW1lbnRDYWNoZSBnZXRDTURvY3VtZW50Q2FjaGUoKSB7Ci0JCXJldHVybiBjbURvY3VtZW50Q2FjaGU7Ci0JfQotCi0JcHVibGljIFVSSVJlc29sdmVyIGdldElkUmVzb2x2ZXIoKSB7Ci0JCXJldHVybiBpZFJlc29sdmVyOwotCX0KLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKSB7Ci0JCXJldHVybiBtb2RlbFF1ZXJ5OwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gdHlwZS5lcXVhbHMoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBNb2RlbFF1ZXJ5QWRhcHRlciNyZWxlYXNlKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCX0KLQotCS8qKgotCSAqIEBzZWUgTW9kZWxRdWVyeUFkYXB0ZXIjc2V0SWRSZXNvbHZlcihVUklSZXNvbHZlcikKLQkgKi8KLQotCXB1YmxpYyB2b2lkIHNldElkUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgbmV3SWRSZXNvbHZlcikgewotCQlpZFJlc29sdmVyID0gbmV3SWRSZXNvbHZlcjsKLQkJaWYgKG1vZGVsUXVlcnkgaW5zdGFuY2VvZiBNb3ZhYmxlTW9kZWxRdWVyeSkKLQkJCSgoTW92YWJsZU1vZGVsUXVlcnkpIG1vZGVsUXVlcnkpLnNldElkUmVzb2x2ZXIobmV3SWRSZXNvbHZlcik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC9zc2Vtb2RlbHF1ZXJ5L01vdmFibGVNb2RlbFF1ZXJ5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW92YWJsZU1vZGVsUXVlcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1N2VmYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3NzZW1vZGVscXVlcnkvTW92YWJsZU1vZGVsUXVlcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnNzZW1vZGVscXVlcnk7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLQotcHVibGljIGludGVyZmFjZSBNb3ZhYmxlTW9kZWxRdWVyeSBleHRlbmRzIE1vZGVsUXVlcnkgewotCi0Jdm9pZCBzZXRJZFJlc29sdmVyKFVSSVJlc29sdmVyIG5ld1VSSVJlc29sdmVyKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGFza3MvWE1MRmlsZVRhc2tTY2FubmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3Rhc2tzL1hNTEZpbGVUYXNrU2Nhbm5lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTEwZDYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdGFza3MvWE1MRmlsZVRhc2tTY2FubmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC50YXNrczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRhc2tzLlN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotcHVibGljIGNsYXNzIFhNTEZpbGVUYXNrU2Nhbm5lciBleHRlbmRzIFN0cnVjdHVyZWRGaWxlVGFza1NjYW5uZXIgewotCXB1YmxpYyBYTUxGaWxlVGFza1NjYW5uZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNDb21tZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uLCBJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uKSB7Ci0JCXJldHVybiB0ZXh0UmVnaW9uLmdldFR5cGUoKS5lcXVhbHMoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1Y2M0MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L1hNTFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudGV4dDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnRleHQuQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgWE1MU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGV4dGVuZHMgQmFzaWNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaW1wbGVtZW50cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHsKLQotCXB1YmxpYyBYTUxTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUeXBlKCkgewotCQlTdHJpbmcgcmVzdWx0ID0gc3VwZXIuZ2V0VHlwZSgpOwotCQkvLyBub3JtYWxseSwgd2Ugd2FudCB0aGUgc2Vjb25kIHJlZ2lvbiBhcyB0aGUgZmxhdG5vZGUgdHlwZSAuLi4gc2luY2UKLQkJLy8gdGhlCi0JCS8vIGZpcnN0IG9uZSBpcyB1c3VhbGx5IGp1c3QgIm9wZW4gdGFnIi4KLQkJaWYgKChyZXN1bHQgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgJiYgKGdldFJlZ2lvbnMoKS5zaXplKCkgPiAxKSkgewotCQkJcmVzdWx0ID0gZ2V0UmVnaW9ucygpLmdldCgxKS5nZXRUeXBlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC90ZXh0L3J1bGVzL1N0cnVjdHVyZWRUZXh0UGFydGl0aW9uZXJGb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2MTA5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3RleHQvcnVsZXMvU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucGFyc2VyLkZvcmVpZ25SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudGV4dC5ydWxlcy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRleHQuSVhNTFBhcnRpdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyIHsKLQotCXByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZ1tdIGNvbmZpZ3VyZWRDb250ZW50VHlwZXMgPSBuZXcgU3RyaW5nW117SVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQsIElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQSwgSVhNTFBhcnRpdGlvbnMuWE1MX1BJLCBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04sIElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5ULCBJWE1MUGFydGl0aW9ucy5EVERfU1VCU0VUfTsKLQotCXB1YmxpYyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldEludGVybmFsUGFydGl0aW9uKGludCBvZmZzZXQsIGludCBsZW5ndGgsIFN0cmluZyB0eXBlKSB7Ci0JCXN1cGVyLnNldEludGVybmFsUGFydGl0aW9uKG9mZnNldCwgbGVuZ3RoLCB0eXBlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0TGVnYWxDb250ZW50VHlwZXMoKSB7Ci0JCWZTdXBwb3J0ZWRUeXBlcyA9IGNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKElUZXh0UmVnaW9uIHJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKQotCQkJcmVzdWx0ID0gSVhNTFBhcnRpdGlvbnMuWE1MX0NPTU1FTlQ7Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9DREFUQTsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9DT05URU5UKSB7Ci0JCQkvKioKLQkJCSAqIEdyYW1tYXRpY2FsbHksIGl0J3MgaW1wb3NzaWJsZSB0byBnZXQgYSBQSV9DT05URU5UIHJlZ2lvbgotCQkJICogd2l0aG91dCBhIHByZWNlZGluZyBYTUxfVEFHX05BTUUgcmVnaW9uLiBSZWx5aW5nIG9uIHRoaXMsCi0JCQkgKiBleHRyYWN0IHRoZSB0YXJnZXQgcHJvY2Vzc29yIG5hbWUgYW5kIGNyZWF0ZSBhIHBhcnRpdGlvbiB0eXBlCi0JCQkgKiBkeW5hbWljYWxseS4KLQkJCSAqLwotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2NSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlJVGV4dFJlZ2lvbiBuYW1lID0gZG9jUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY1JlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCkgLSAxKTsKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYICsgZG9jUmVnaW9uLmdldFRleHQobmFtZSkudG9VcHBlckNhc2UoTG9jYWxlLkVOR0xJU0gpOwotCQl9Ci0JCWVsc2UgaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikKLQkJCXJlc3VsdCA9IElYTUxQYXJ0aXRpb25zLlhNTF9QSTsKLQkJZWxzZSBpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKQotCQkJcmVzdWx0ID0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFQ0xBUkFUSU9OOwotCQllbHNlIGlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUKQotCQkJcmVzdWx0ID0gSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVDsKLQkJZWxzZQotCQkJcmVzdWx0ID0gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKEZvcmVpZ25SZWdpb24gcmVnaW9uLCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIHRlbXAgYWRkZWQganVzdCB0byBkaXMtYW1iaWd1YXRlIGNhbGwgZnJvbSBzdWJjbGFzcwotCQlyZXR1cm4gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZShyZWdpb24sIG9mZnNldCk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlQmV0d2VlbihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXZpb3VzTm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBuZXh0Tm9kZSkgewotCQlyZXR1cm4gc3VwZXIuZ2V0UGFydGl0aW9uVHlwZUJldHdlZW4ocHJldmlvdXNOb2RlLCBuZXh0Tm9kZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXREZWZhdWx0UGFydGl0aW9uVHlwZSgpIHsKLQkJcmV0dXJuIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnRQYXJ0aXRpb25lciBuZXdJbnN0YW5jZSgpIHsKLQkJU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTCBpbnN0YW5jZSA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yWE1MKCk7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCkgewotCQlyZXR1cm4gY29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFBhcnRpdGlvbkZyb21CbG9ja2VkVGV4dChJVGV4dFJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQsIFN0cmluZyByZXN1bHQpIHsKLQkJLy8gd2FzIG1vdmVkIHRvIHN1YmNsYXNzIGZvciBxdWljayB0cmFuc2l0aW9uCi0JCVN0cmluZyBuZXdSZXN1bHQgPSByZXN1bHQ7Ci0JCS8vIG5zZF9UT0RPOiBEYXZpZCBhbmQgSSBuZWVkIHRvIGRpc2N1c3MsIGRlc2lnbiwgYW5kIGltcGxlbWVudCB0aGlzCi0JCS8vIGZvciBhbGwgYmxvY2sgdGFncyBhbmQgY29tbWVudHMKLQkJLy8gYW5kIG1ha2Ugc3VyZSBpcyBwYXJ0IG9mICJleHRlbnNpYmxlIiBkZXNpZ24gb2YgYmxvY2sgdGFncwotCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LkJMT0NLX1RFWFQpIHsKLQkJCS8vIGZvciBjb2RlIHNhZmV0eSwgd2UnbGwgYWx3YXlzIGNoZWNrIGluc3RhbmNlb2YsIGJ1dCBJIHRoaW5rCi0JCQkvLyBhbHdheXMgdHJ1ZS4KLQkJCWlmIChyZWdpb24gaW5zdGFuY2VvZiBGb3JlaWduUmVnaW9uKSB7Ci0JCQkJLy8gc3VwZXIgaXMgdXNlZCBiZWxvdyBzbyB3b24ndCBiZSBhbWJpZ3VvdXMKLQkJCQluZXdSZXN1bHQgPSBnZXRQYXJ0aXRpb25UeXBlKChGb3JlaWduUmVnaW9uKSByZWdpb24sIG9mZnNldCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb24gaW5zdGFuY2VvZiBGb3JlaWduUmVnaW9uKSB7Ci0JCQkJbmV3UmVzdWx0ID0gZ2V0UGFydGl0aW9uVHlwZSgoRm9yZWlnblJlZ2lvbikgcmVnaW9uLCBvZmZzZXQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJbmV3UmVzdWx0ID0gZ2V0VW5rbm93bigpOwotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gZG9QYXJzZXJTcGVjaWZpY0NoZWNrKGludCBvZmZzZXQsIGJvb2xlYW4gcGFydGl0aW9uRm91bmQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldmlvdXNTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIG5leHQsIElUZXh0UmVnaW9uIHByZXZpb3VzU3RhcnQpIHsKLQkJLy8gdGhpcyB3YXMgbW92ZWQgZG93biB0byBzdWJjbGFzcyBvZiBTdHJ1Y3R1cmVkVGV4dFBhcnRpb25lcgotCQkvLyBmb3IgcXVpY2sgZml4IHRvIHRyYW5zaXRpb24gcHJvYmxlbXMuIEhlaXJhcmNoeSBuZWVkcyBsb3RzIG9mCi0JCS8vIGNsZWFudXAuCi0JCWlmIChwcmV2aW91c1N0YXJ0ICE9IG51bGwgJiYgcHJldmlvdXNTdGFydC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4gJiYgbmV4dC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQlJVGV4dFJlZ2lvbiBwcmV2aW91c05hbWUgPSBwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2aW91c1N0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQocHJldmlvdXNTdGFydCkpOwotCQkJSVRleHRSZWdpb24gbmV4dE5hbWUgPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRFbmRPZmZzZXQobmV4dCkpOwotCQkJaWYgKHByZXZpb3VzTmFtZSAhPSBudWxsICYmIG5leHROYW1lICE9IG51bGwgJiYgcHJldmlvdXNOYW1lLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSAmJiBuZXh0TmFtZS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQlzZXRJbnRlcm5hbFBhcnRpdGlvbihvZmZzZXQsIDAsIGdldFBhcnRpdGlvblR5cGVCZXR3ZWVuKHByZXZpb3VzU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBzZFJlZ2lvbikpOwotCQkJCXBhcnRpdGlvbkZvdW5kID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcGFydGl0aW9uRm91bmQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9BYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWRlZjQ1YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL0Fic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnZhbGlkYXRlLlZhbGlkYXRpb25BZGFwdGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UHJvcGFnYXRpbmdWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0aW9uQ29tcG9uZW50IHsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yLgotCSAqLwotCXB1YmxpYyBBYnN0cmFjdFByb3BhZ2F0aW5nVmFsaWRhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBhYnN0cmFjdCBWYWxpZGF0aW9uQ29tcG9uZW50IGdldFByb3BhZ2F0ZWUoKTsKLQotCXByb3RlY3RlZCBhYnN0cmFjdCBWYWxpZGF0aW9uQWRhcHRlciBnZXRWYWxpZGF0b3IoKTsKLQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSW5kZXhlZFJlZ2lvbiBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWdldFZhbGlkYXRvcigpLnZhbGlkYXRlKG5vZGUpOwotCi0KLQkJUHJvcGFnYXRvci5wcm9wYWdhdGVUb0NoaWxkRWxlbWVudHMoZ2V0UHJvcGFnYXRlZSgpLCAoTm9kZSkgbm9kZSk7Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1Byb3BhZ2F0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNThkMWE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGUvUHJvcGFnYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotCi1wdWJsaWMgY2xhc3MgUHJvcGFnYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgcHJvcGFnYXRlVG9DaGlsZEVsZW1lbnRzKFZhbGlkYXRpb25Db21wb25lbnQgdmFsaWRhdG9yLCBOb2RlIHBhcmVudCkgewotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCUNsYXNzIGNsYXp6ID0gdmFsaWRhdG9yLmdldENsYXNzKCk7Ci0KLQkJTm9kZUxpc3QgY2hpbGRyZW4gPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCU5vZGUgY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkJaWYgKGNoaWxkID09IG51bGwgfHwgY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQljb250aW51ZTsKLQotCQkJSU5vZGVOb3RpZmllciBub3RpZmllciA9IChJTm9kZU5vdGlmaWVyKSBjaGlsZDsKLQkJCVZhbGlkYXRpb25BZGFwdGVyIHZhID0gKFZhbGlkYXRpb25BZGFwdGVyKSBub3RpZmllci5nZXRFeGlzdGluZ0FkYXB0ZXIoY2xhenopOwotCQkJaWYgKHZhID09IG51bGwpIHsKLQkJCQlub3RpZmllci5hZGRBZGFwdGVyKHZhbGlkYXRvcik7Ci0JCQkJdmEgPSB2YWxpZGF0b3I7Ci0JCQl9Ci0JCQl2YS52YWxpZGF0ZSgoSW5kZXhlZFJlZ2lvbikgY2hpbGQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUHJvcGFnYXRvciBpcyBqdXN0IGEgcGxhY2Vob2xkZXIgb2YgdXRpbGl0aWVzLiBEb24ndCBpbnN0YW50aWF0ZS4KLQkgKi8KLQlwcml2YXRlIFByb3BhZ2F0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvY29yZS9pbnRlcm5hbC92YWxpZGF0ZS9WYWxpZGF0aW9uQ29tcG9uZW50LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25Db21wb25lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIxMGZlNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL2ludGVybmFsL3ZhbGlkYXRlL1ZhbGlkYXRpb25Db21wb25lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC52YWxpZGF0ZS5WYWxpZGF0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudmFsaWRhdGUuVmFsaWRhdGlvblJlcG9ydGVyOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIFZhbGlkYXRpb25BZGFwdGVyIHsKLQotCXByb3RlY3RlZCBWYWxpZGF0aW9uUmVwb3J0ZXIgcmVwb3J0ZXIgPSBudWxsOwotCi0JLyoqCi0JICogVmFsaWRhdGlvbkNvbXBvbmVudCBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBWYWxpZGF0aW9uQ29tcG9uZW50KCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gKHR5cGUgPT0gVmFsaWRhdGlvbkFkYXB0ZXIuY2xhc3MpOwotCX0KLQotCS8qKgotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJLy8gVGhpcyBtZXRob2Qgd2lsbCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgVjIuCi0JfQotCi0JLyoqCi0JICovCi0JcHVibGljIHZvaWQgc2V0UmVwb3J0ZXIoVmFsaWRhdGlvblJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCXRoaXMucmVwb3J0ZXIgPSByZXBvcnRlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC9jb3JlL3RleHQvSVhNTFBhcnRpdGlvbnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTZjNTc0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL2NvcmUvdGV4dC9JWE1MUGFydGl0aW9ucy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dDsKLQotCi0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgbm90IGludGVuZGVkIHRvIGJlIGltcGxlbWVudGVkLgotICogSXQgZGVmaW5lcyB0aGUgcGFydGl0aW9uIHR5cGVzIGZvciBYTUwuCi0gKiBDbGllbnRzIHNob3VsZCByZWZlcmVuY2UgdGhlIHBhcnRpdGlvbiB0eXBlIFN0cmluZ3MgZGVmaW5lZCBoZXJlIGRpcmVjdGx5LgotICogCi0gKiBAc2luY2UgMS4xCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgSVhNTFBhcnRpdGlvbnMgewotCQotCVN0cmluZyBYTUxfREVGQVVMVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIjsgLy8kTk9OLU5MUy0xJAotCVN0cmluZyBYTUxfQ0RBVEEgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfQ0RBVEEiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9QSSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9QSSI7IC8vJE5PTi1OTFMtMSQKLQlTdHJpbmcgWE1MX0RFQ0xBUkFUSU9OID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0RFQ0wiOyAvLyROT04tTkxTLTEkCi0JU3RyaW5nIFhNTF9DT01NRU5UID0gIm9yZy5lY2xpcHNlLndzdC54bWwuWE1MX0NPTU1FTlQiOyAvLyROT04tTkxTLTEkCi0JCi0JLyoKLQkgKiBUaGlzIHZhbHVlIGlzIHVzZWQgYXMgYSBwcmVmaXggdG8gYW55IHVua25vd24gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLQkgKiB3ZSBmaW5kLiBUaGUgcHJvY2Vzc29yIHRhcmdldCBuYW1lIGlzIGNvbnZlcnRlZCB0byB1cHBlcmNhc2UgYW5kCi0JICogYXBwZW5kZWQgdG8gdGhlIHByZWZpeCB0byBjcmVhdGUgYSB1bmlxdWUgcGFydGl0aW9uIHR5cGUuCi0JICovCi0JU3RyaW5nIFBST0NFU1NJTkdfSU5TVFJVQ1RJT05fUFJFRklYID0gIm9yZy5lY2xpcHNlLndzdC54bWwuUFJPQ0VTU0lOR19JTlNUUlVDVElPTjoiOyAvLyROT04tTkxTLTEkCi0KLQkvKioKLQkgKiBTaG91bGQgbWF0Y2gKLQkgKiBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuZHRkLnBhcnRpdGlvbmluZy5TdHJ1Y3R1cmVkVGV4dFBhcnRpdGlvbmVyRm9yRFRELlNUX0RURF9TVUJTRVQKLQkgKi8KLQlTdHJpbmcgRFREX1NVQlNFVCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmR0ZC5pbnRlcm5hbF9zdWJzZXQiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLmNsYXNzcGF0aCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI2NTJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjbGFzc3BhdGg+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9InNyYyIKLSAgICAgICAgcGF0aD0ic3JjIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYy12YWxpZGF0aW9uIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBraW5kPSJzcmMiCi0gICAgICAgIHBhdGg9InNyYy1tdWx0aXBhZ2UiIC8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9InNyYyIKLSAgICAgICAgcGF0aD0ic3JjLXdpemFyZHMiIC8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9InNyYyIKLSAgICAgICAgcGF0aD0ic3JjLWNhdGFsb2ciIC8+Ci0gICAgPGNsYXNzcGF0aGVudHJ5Ci0gICAgICAgIGtpbmQ9ImNvbiIKLSAgICAgICAgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIiAvPgotICAgIDxjbGFzc3BhdGhlbnRyeQotICAgICAgICBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiCi0gICAgICAgIGtpbmQ9ImNvbiI+Ci0gICAgICAgIDxhY2Nlc3NydWxlcz4KLSAgICAgICAgICAgIDxhY2Nlc3NydWxlCi0gICAgICAgICAgICAgICAga2luZD0iYWNjZXNzaWJsZSIKLSAgICAgICAgICAgICAgICBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiIC8+Ci0gICAgICAgIDwvYWNjZXNzcnVsZXM+Ci0gICAgPC9jbGFzc3BhdGhlbnRyeT4KLSAgICA8Y2xhc3NwYXRoZW50cnkKLSAgICAgICAga2luZD0ib3V0cHV0IgotICAgICAgICBwYXRoPSJiaW4iIC8+Ci08L2NsYXNzcGF0aD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMWMyODUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLXhtbGVkaXRvci5qYXIKLW9yZy5lY2xpcHNlLndzdC54bWwudWlfMS4wLjAuamFyCi1vcmcuZWNsaXBzZS53c3QueG1sLnVpXzEuMC4wLnppcAoteG1sZWRpdG9yc3JjLnppcAotQGRvdAotc3JjLnppcAotamF2YUNvbXBpbGVyLi4uYXJncwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5vcHRpb25zIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5vcHRpb25zCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWNhZThmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ub3B0aW9ucworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLW9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmY9ZmFsc2UKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ucHJvamVjdCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBkYzRhOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueG1sLnVpPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+PC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YWJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFuYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNNb24gQXByIDE3IDAxOjQ4OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotbGluZS5zZXBhcmF0b3I9XHJcbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYzQzMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTYXQgQXVnIDE5IDE2OjMxOjQzIEVEVCAyMDA2DQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTENCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZA0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUNCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3INCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcg0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nDQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMw0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQ0KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3INCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDFjN2FkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM1MjJiYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGVjZmQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sLnVpOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAwLnF1YWxpZmllcgotQnVuZGxlLUFjdGl2YXRvcjogb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FeHBvcnQtUGFja2FnZTogb3JnLmVjbGlwc2Uud3N0LnhtbC51aSwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5pY29ucy5ldG9vbDUwO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLmljb25zLm9iajE2O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nLmljb25zLm92cjE2O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0O3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZG5kO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kb3VibGVjbGljazt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbms7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXM7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5yZWdpc3RyeTt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VhcmNoO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb247eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWksb3JnLmVjbGlwc2Uud3N0LmR0ZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm87eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSxvcmcuZWNsaXBzZS53c3QuZHRkLnVpIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGV4dDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbDt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbjt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mbzt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5pY29uczt4LWZyaWVuZHM6PSJvcmcuZWNsaXBzZS53c3QueHNkLnVpLG9yZy5lY2xpcHNlLndzdC5kdGQudWkiLAotIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmUsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5wcm9wZXJ0aWVzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmVjbGlwc2UudWkuaWRlO2J1bmRsZS12ZXJzaW9uPSJbMy4yLjAsNC4wLjApIiwKLSBvcmcuZWNsaXBzZS51aS52aWV3cztidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuamZhY2UudGV4dDtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UudWkud29ya2JlbmNoLnRleHRlZGl0b3I7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLnVpLmVkaXRvcnM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWk7YnVuZGxlLXZlcnNpb249IlsxLjAuMTAxLDEuMS4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS51aTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCw0LjAuMCkiLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZTtidW5kbGUtdmVyc2lvbj0iWzMuMi4wLDQuMC4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gY29tLmlibS5pY3U7YnVuZGxlLXZlcnNpb249IlszLjQuNCw0LjAuMCkiCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2YWEyZmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0jICAgICAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgaWNvbnMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIHRlbXBsYXRlcy8sXAotICAgICAgICAgICAgICAgZXhhbXBsZXMvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICAuLFwKLSAgICAgICAgICAgICAgIC5vcHRpb25zLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwKLWJpbi5leGNsdWRlcyA9IGJpbi8qKixcCi0gICAgICAgICAgICAgICBAZG90LyoqLFwKLSAgICAgICAgICAgICAgIHRlbXAuZm9sZGVyLyoqCi1zb3VyY2UuLiA9IHNyYy8sXAotICAgICAgICAgICBzcmMtbXVsdGlwYWdlLyxcCi0gICAgICAgICAgIHNyYy13aXphcmRzLyxcCi0gICAgICAgICAgIHNyYy1jYXRhbG9nLyxcCi0gICAgICAgICAgIHNyYy12YWxpZGF0aW9uCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvZXhhbXBsZXMvRWRpdGluZ0FuZFZhbGlkYXRpbmdYTUwuemlwIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2V4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1Nzc2Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvZXhhbXBsZXMvRWRpdGluZ0FuZFZhbGlkYXRpbmdYTUwuemlwCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL1hNTEZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL1hNTEZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGViMWJlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9YTUxGaWxlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29sbGFwc2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNzQ3MjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYzBkZTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmRjZWI4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub2ZmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjNkNTcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjMzdiN2EuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MmMxNGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L25ld194bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWNmZGY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3JsZGdybXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi9ybGRncm1yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkzMjVkZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3JsZGdybXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZHRvb2wxNi92YWxpZGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYxZDE0Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29sbGFwc2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3NWJjMTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZDgwYTkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWFiMDRjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub2ZmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4MmY5YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L2V4cGFuZC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjQ1MzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kX2FsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMDViMjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X3htbC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L25ld194bWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZGZiNjJkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL2V0b29sMTYvbmV3X3htbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5Y2FjNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3JsZGdybXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvZXRvb2wxNi92YWxpZGF0ZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIzNDdhYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L1hTREZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMGVlYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvWFNERmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hZGRfY29ycmVjdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9hZGRfY29ycmVjdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmQ3ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYWRkX2NvcnJlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0X3JlcV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0X3JlcV9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGM2NmQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2F0dF9yZXFfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvYXR0cmlidXRlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jZGF0YXNlY3Rpb24uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2RhdGFzZWN0aW9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIwODcyYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jZGF0YXNlY3Rpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hvaWNlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2Nob2ljZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxM2JhMmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnRfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2NvbW1lbnRfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhjMmNjYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb3JyZWN0aW9uX2NoYW5nZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9jb3JyZWN0aW9uX2NoYW5nZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODNjNTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvY29ycmVjdGlvbl9jaGFuZ2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZG9jdHlwZS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMwMGY4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2R0ZGZpbGUuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMGFjYWQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZHRkZmlsZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbGVtZW50X29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1Njc4MTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZmQzZDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudGl0eV9yZWZlcmVuY2UuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZjkxNDkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZW50aXR5X3JlZmVyZW5jZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lbnVtLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudW0uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzBhNDgxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2VudW0uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvZXJyb3Itb3ZlcmxheS5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvci1vdmVybGF5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZGNjYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9lcnJvci1vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L2xvY2FsdmFyaWFibGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI0NGIyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9sb2NhbHZhcmlhYmxlX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YWQwODkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvbm90YXRpb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvb2NjdXJvbmVfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L29jY3Vyb25lX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjY1YzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvb2NjdXJvbmVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3Byb2luc3Rfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3Byb2luc3Rfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQ0MzZkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy1kZWVtcGhhc2l6ZWQuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMtZGVlbXBoYXNpemVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNmNDdlOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy1kZWVtcGhhc2l6ZWQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLWdlbmVyaWMtZW1waGFzaXplZC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy1lbXBoYXNpemVkLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQxYmE1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy1lbXBoYXNpemVkLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVmNTE2ZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctZ2VuZXJpYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctbWFjcm8uZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGFnLW1hY3JvLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQxZjgxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90YWctbWFjcm8uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhN2EzOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90ZXh0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi90eHRleHQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjI2ZTQxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL29iajE2L3R4dGV4dC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vYmoxNi93YXJuaW5nX29iai5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNWY1ZWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb2JqMTYvd2FybmluZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L2Vycm9yX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvZXJyb3Jfb3ZyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3N0YWxlX2Vycm9yX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi9zdGFsZV9lcnJvcl9vdnIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjA0NzFiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL292cjE2L3N0YWxlX2Vycm9yX292ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvZnVsbC9vdnIxNi93YXJuX292ci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzNTA3MDQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvb3ZyMTYvd2Fybl9vdnIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L2F0dGlidXRlLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9mdWxsL3ZpZXcxNi9hdHRpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL2Z1bGwvdmlldzE2L2F0dGlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9uZXdTYW1wbGVQcm9qZWN0X3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzk2YjEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy9uZXdTYW1wbGVQcm9qZWN0X3dpei5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL25ld1NhbXBsZVByb2plY3Rfd2l6YmFubmVyLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZmYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3NvdXJjZUVkaXRvci5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvc291cmNlRWRpdG9yLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVlYmRiOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvaWNvbnMvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9pY29ucy94bWxkb2MuZ2lmIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3htbGRvYy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ZWIxYmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL2ljb25zL3htbGRvYy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1OTc4ZjMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLXBsdWdpbk5hbWU9WE1MIFVJIFBsdWdpbgotWE1MX0ZpbGVzLm5hbWU9WE1MIEZpbGVzCi1YTUxfU291cmNlLm5hbWU9WE1MIFNvdXJjZQotWE1MX1RlbXBsYXRlcy5uYW1lPVhNTCBUZW1wbGF0ZXMKLVhNTF9TdHlsZXMubmFtZT1YTUwgU3R5bGVzCi1YTUxfRWRpdG9yLm5hbWU9WE1MIEVkaXRvcgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotX1VJX1dJWkFSRF9ORVdfWE1MPVhNTAotZ2VuTWVudUxhYmVsPSZHZW5lcmF0ZQotX1VJX0FDVElPTl9DUkVBVEVfWE1MPSZYTUwgRmlsZS4uLgotX1VJX0NSRUFURV9ORVdfWE1MX0ZJTEU9Q3JlYXRlIGEgbmV3IFhNTCBmaWxlLgotWE1MRXhhbXBsZS5uYW1lPUVkaXRpbmcgYW5kIHZhbGlkYXRpbmcgWE1MIGZpbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmRlc2NyaXB0aW9uPUNyZWF0ZSBhIHByb2plY3QgY29udGFpbmluZyBYTUwgc2FtcGxlIGZpbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnByb2plY3RuYW1lPVhNTEV4YW1wbGVzCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2V0aXRsZT1YTUwgc2FtcGxlIGZpbGVzIGZvciBlZGl0aW5nIGFuZCB2YWxpZGF0aW5nCi1YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2VkZXNjcmlwdGlvbj1DcmVhdGUgYSBwcm9qZWN0IGNvbnRhaW5pbmcgWE1MIHNhbXBsZSBmaWxlcy4KLVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubGFiZWw9JlByb2plY3QgTmFtZToKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLUFsbF9YTUxfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9QWxsIFhNTAotWE1MX05ld19jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1OZXcgWE1MCi1YTUxfVGFnX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lPVhNTCBUYWcKLVhNTF9BdHRyaWJ1dGVfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWU9WE1MIEF0dHJpYnV0ZQotWE1MX0F0dHJpYnV0ZV92YWx1ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZT1YTUwgQXR0cmlidXRlIHZhbHVlCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1BZGRUYXNrLmxhYmVsPUFkZCAmVGFzay4uLgotQWRkVGFzay50b29sdGlwPUFkZCBUYXNrLi4uCi1BZGRCb29rbWFyay5sYWJlbD1BZGQgQm9vJmttYXJrLi4uCi1BZGRCb29rbWFyay50b29sdGlwPUFkZCBCb29rbWFyay4uLgotU2VsZWN0UnVsZXIubGFiZWw9U2VsZWN0IFJ1bGVyCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxfQ2F0YWxvZ19GaWxlX1R5cGVfRXh0ZW5zaW9uX1BvaW50Lm5hbWU9WE1MIENhdGFsb2cgZmlsZSB0eXBlIGV4dGVuc2lvbiBwb2ludAotX1VJX1BSRUZfWE1MX0NBVEFMT0c9WE1MIENhdGFsb2cKLV9VSV9QUkVGX0RURF9GSUxFUz1EVEQgRmlsZXMKLV9VSV9QUkVGX1hTRF9GSUxFUz1YU0QgRmlsZXMKLV9VSV9QUkVGX1RBR0xJQl9ERUZfRklMRVM9VGFnbGliIERlZmluaXRpb24gRmlsZXMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLV9VSV9YTUxfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgID0gWE1MIFZhbGlkYXRvcgotX1VJX1JFRl9GSUxFX1NIT1dfREVUQUlMUyAgICAgICAgICAgPSBTaG93IERldGFpbHMuLi4KLV9VSV9NRU5VX1ZBTElEQVRFX1hNTCAgICAgICAgICAgICAgID0gVmFsaWRhdGUgWE1MIEZpbGUKLSMjCi1DbGVhbnVwRG9jdW1lbnRfbGFiZWw9Q2xlYW51cCBEb2N1bWVudC4uLgotQ2xlYW51cERvY3VtZW50X3Rvb2x0aXA9Q2xlYW51cCBEb2N1bWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1SZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWw9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF90b29sdGlwPVJlbW92ZSBCbG9jayBDb21tZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfbGFiZWw9UHJldmlvdXMgRWxlbWVudAotU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotU3RydWN0dXJlU2VsZWN0SGlzdG9yeV9sYWJlbD1SZXN0b3JlIExhc3QgU2VsZWN0aW9uCi1TdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X3Rvb2x0aXA9UmVzdG9yZSBsYXN0IHNlbGVjdGlvbgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3BsdWdpbi54bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJjZjM4Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ4NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQotCTxleHRlbnNpb24tcG9pbnQgaWQ9ImNhdGFsb2dGaWxlVHlwZSIgbmFtZT0iJVhNTF9DYXRhbG9nX0ZpbGVfVHlwZV9FeHRlbnNpb25fUG9pbnQubmFtZSIgc2NoZW1hPSJzY2hlbWEvY2F0YWxvZ0ZpbGVUeXBlLmV4c2QiLz4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLnByZWZlcmVuY2VQYWdlcyI+Ci0JCTxwYWdlCi0JCQluYW1lPSIlX1VJX1BSRUZfWE1MX0NBVEFMT0ciCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5wcmVmZXJlbmNlcyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2cuWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS51aS5YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UiPgotCQk8L3BhZ2U+Ci0JPC9leHRlbnNpb24+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5jYXRhbG9nRmlsZVR5cGUiPgotCQk8ZmlsZVR5cGUKLQkJCWV4dGVuc2lvbnM9ImR0ZCwgZW50LCBtb2QiCi0JCQlkZXNjcmlwdGlvbj0iJV9VSV9QUkVGX0RURF9GSUxFUyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudWkuY2F0YWxvZ0ZpbGVUeXBlLmR0ZCI+Ci0JCTwvZmlsZVR5cGU+Ci0JCTxmaWxlVHlwZQotCQkJZXh0ZW5zaW9ucz0ieHNkIgotCQkJZGVzY3JpcHRpb249IiVfVUlfUFJFRl9YU0RfRklMRVMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnVpLmNhdGFsb2dGaWxlVHlwZS54c2QiPgotCQk8L2ZpbGVUeXBlPgotCQk8ZmlsZVR5cGUKLQkJCWV4dGVuc2lvbnM9InRsZCIKLQkJCWRlc2NyaXB0aW9uPSIlX1VJX1BSRUZfVEFHTElCX0RFRl9GSUxFUyIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudWkuY2F0YWxvZ0ZpbGVUeXBlLnRsZCI+Ci0JCTwvZmlsZVR5cGU+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLVRoZSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIGNvbnRlbnQgdHlwZSBpcyBvbmx5IGZvcgotCQloYW5kbGluZyBzb21lIHNwZWNpYWwgY2FzZXMgb2YgaWxsLWZvcm1lZCB4bWwgaW4gYSByZWFzb25hYmxlCi0JCW1hbm5lciwgYW5kIHNob3VsZCBub3QgYmUgZW11bGF0ZWQgYnkgY2xpZW50cy4gVGhlIHR3byBjb250ZW50Ci0JCXR5cGVzIGFyZSBvZnRlbiB1c2VkIGludGVyY2hhbmdlYWJseSBieSB0aGUgWE1MIGNvbXBvbmVudCwgYnV0Ci0JCXBsZWFzZSB1c2Ugb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCBpbnN0ZWFkLiAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXRvckNvbmZpZ3VyYXRpb24iPgotCQk8c291cmNlVmlld2VyQ29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8Y29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS52aWV3cy5jb250ZW50b3V0bGluZS5YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24iCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MucHJvcGVydGllcy5YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbiIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsQ29uZmlndXJhdGlvbgotCQkJdHlwZT0ic291cmNlZWRpdGluZ3RleHR0b29scyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLlhNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNoYXJhY3RlcnBhaXJtYXRjaGVyIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGV4dC5YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCQk8cHJvdmlzaW9uYWxDb25maWd1cmF0aW9uCi0JCQl0eXBlPSJzdHJ1Y3R1cmVkdGV4dGZvbGRpbmdwcm92aWRlciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24uU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwiCi0JCQl0YXJnZXQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwsIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS54bWxzb3VyY2UiIC8+Ci0JCTxwcm92aXNpb25hbENvbmZpZ3VyYXRpb24KLQkJCXR5cGU9ImNvcnJlY3Rpb25hc3Npc3RhbnQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLkNvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlclhNTCIKLQkJCXRhcmdldD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQkJPHByb3Zpc2lvbmFsRGVmaW5pdGlvbgotCQkJdHlwZT0icHJlZmVyZW5jZXBhZ2VzIgotCQkJdmFsdWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbC5zb3VyY2UsIG9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnRlbXBsYXRlcywgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuY29sb3JzIgotCQkJdGFyZ2V0PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbgotCQlwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5maWxlYnVmZmVycy5hbm5vdGF0aW9uTW9kZWxDcmVhdGlvbiI+Ci0JCTxmYWN0b3J5Ci0JCQljb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFJlc291cmNlTWFya2VyQW5ub3RhdGlvbk1vZGVsRmFjdG9yeSIgLz4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmFkYXB0ZXJGYWN0b3J5RGVzY3JpcHRpb24iPgotCQk8YWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlQcm92aWRlckZvclhNTCI+Ci0JCQk8Y29udGVudFR5cGUgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiIC8+Ci0JCTwvYWRhcHRlckZhY3RvcnlEZXNjcmlwdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wcmVmZXJlbmNlUGFnZXMiPgotCQk8IS0tIFhNTCBQUkVGRVJFTkNFIFBBR0VTIC0tPgotCQk8cGFnZQotCQkJbmFtZT0iJVhNTF9GaWxlcy5uYW1lIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucHJlZmVyZW5jZXMiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxGaWxlc1ByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sIj4KLQkJPC9wYWdlPgotCQk8cGFnZQotCQkJbmFtZT0iJVhNTF9Tb3VyY2UubmFtZSIKLQkJCWNhdGVnb3J5PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnByZWZlcmVuY2VzLnhtbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFNvdXJjZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnNvdXJjZSI+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfVGVtcGxhdGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkucHJlZmVyZW5jZXMueG1sLnRlbXBsYXRlcyI+Ci0JCTwvcGFnZT4KLQkJPHBhZ2UKLQkJCW5hbWU9IiVYTUxfU3R5bGVzLm5hbWUiCi0JCQljYXRlZ29yeT0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb2xvclBhZ2UiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwuY29sb3JzIj4KLQkJPC9wYWdlPgotCTwvZXh0ZW5zaW9uPgotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSI+PC9wYXJ0PgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlMiI+PC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0IGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSI+PC9wYXJ0PgotCQkJPHBhcnQgaWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlMiI+PC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gVGVtcGxhdGVzIC0tPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGVtcGxhdGVzIj4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlQWxsX1hNTF9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF9hbGwiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVYTUxfTmV3X2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYTUwiCi0JCQlpZD0ieG1sX25ldyI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxjb250ZXh0VHlwZQotCQkJbmFtZT0iJVhNTF9UYWdfY29udGV4dF90eXBlX0V4dGVuc2lvbl9FbGVtZW50Lm5hbWUiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZVhNTCIKLQkJCWlkPSJ4bWxfdGFnIj4KLQkJPC9jb250ZXh0VHlwZT4KLQkJPGNvbnRleHRUeXBlCi0JCQluYW1lPSIlWE1MX0F0dHJpYnV0ZV9jb250ZXh0X3R5cGVfRXh0ZW5zaW9uX0VsZW1lbnQubmFtZSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlWE1MIgotCQkJaWQ9InhtbF9hdHRyaWJ1dGUiPgotCQk8L2NvbnRleHRUeXBlPgotCQk8Y29udGV4dFR5cGUKLQkJCW5hbWU9IiVYTUxfQXR0cmlidXRlX3ZhbHVlX2NvbnRleHRfdHlwZV9FeHRlbnNpb25fRWxlbWVudC5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVYTUwiCi0JCQlpZD0ieG1sX2F0dHJpYnV0ZV92YWx1ZSI+Ci0JCTwvY29udGV4dFR5cGU+Ci0JCTxpbmNsdWRlCi0JCQlmaWxlPSJ0ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sIgotCQkJdHJhbnNsYXRpb25zPSIkbmwkL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzIj4KLQkJPC9pbmNsdWRlPgotCTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0JCTxlZGl0b3IKLQkJCW5hbWU9IiVYTUxfRWRpdG9yLm5hbWUiCi0JCQlpY29uPSIkbmwkL2ljb25zL3htbGRvYy5naWYiCi0JCQljb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZS5YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiIC8+Ci0JCQk8Y29udGVudFR5cGVCaW5kaW5nCi0JCQkJY29udGVudFR5cGVJZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnhtbHNvdXJjZSIgLz4KLQotCQk8L2VkaXRvcj4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gRWRpdG9yIGFjdGlvbnNldHMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuYWN0aW9uU2V0UGFydEFzc29jaWF0aW9ucyI+Ci0JCTxhY3Rpb25TZXRQYXJ0QXNzb2NpYXRpb24KLQkJCXRhcmdldElEPSJvcmcuZWNsaXBzZS51aS5lZGl0LnRleHQuYWN0aW9uU2V0LmFubm90YXRpb25OYXZpZ2F0aW9uIj4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQkJPGFjdGlvblNldFBhcnRBc3NvY2lhdGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLnVpLk5hdmlnYXRlQWN0aW9uU2V0Ij4KLQkJCTxwYXJ0Ci0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiPgotCQkJPC9wYXJ0PgotCQk8L2FjdGlvblNldFBhcnRBc3NvY2lhdGlvbj4KLQk8L2V4dGVuc2lvbj4KLQotCi0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQ29udHJpYnV0ZSBhICdOZXcgV2l6YXJkJyBmb3IgWE1MIGZpbGVzICAgICAgICAgICAgLS0+Ci0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPGNhdGVnb3J5Ci0JCQluYW1lPSIlX1VJX1dJWkFSRF9ORVdfWE1MIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSI+Ci0JCTwvY2F0ZWdvcnk+Ci0JCTx3aXphcmQKLQkJCW5hbWU9IiVfVUlfV0laQVJEX05FV19YTUwiCi0JCQlpY29uPSIkbmwkL2ljb25zL1hNTEZpbGUuZ2lmIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLndzdC5YTUxDYXRlZ29yeSIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuTmV3WE1MV2l6YXJkIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5OZXdYTUxXaXphcmQiPgotCQkJPGRlc2NyaXB0aW9uPiVfVUlfQ1JFQVRFX05FV19YTUxfRklMRTwvZGVzY3JpcHRpb24+Ci0JCQk8c2VsZWN0aW9uIGNsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUmVzb3VyY2UiPgotCQkJPC9zZWxlY3Rpb24+Ci0JCTwvd2l6YXJkPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQWxsb3cgdGhlICdOZXcgWE1MJyB3aXphcmQgdG8gYmUgYWNjZXNzZWQgdmlhIHRoZSAnR2VuZXJhdGUnIG1lbnUgb24gYSBYU0QgZmlsZSAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCW5hbWVGaWx0ZXI9IioueHNkIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWx3aXphcmQuY3JlYXRlWE1MRnJvbVhTRCI+Ci0JCQk8bWVudQotCQkJCWxhYmVsPSIlZ2VuTWVudUxhYmVsIgotCQkJCXBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0iZ2VuZXJhdGVYTUxBcnRpZmFjdHMiPgotCQkJCTxzZXBhcmF0b3IgbmFtZT0ieG1sIiAvPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlX1VJX0FDVElPTl9DUkVBVEVfWE1MIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9ImdlbmVyYXRlWE1MQXJ0aWZhY3RzL3htbCIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sd2l6YXJkLmNyZWF0ZVhNTEZyb21YU0RBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQWxsb3cgdGhlICdOZXcgWE1MJyB3aXphcmQgdG8gYmUgYWNjZXNzZWQgdmlhIHRoZSAnR2VuZXJhdGUnIG1lbnUgb24gYSBEVEQgZmlsZSAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkucG9wdXBNZW51cyI+Ci0JCTxvYmplY3RDb250cmlidXRpb24KLQkJCW9iamVjdENsYXNzPSJvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZSIKLQkJCW5hbWVGaWx0ZXI9IiouZHRkIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWx3aXphcmQuY3JlYXRlWE1MRnJvbURURCI+Ci0JCQk8bWVudQotCQkJCWxhYmVsPSIlZ2VuTWVudUxhYmVsIgotCQkJCXBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0iZ2VuZXJhdGVYTUxBcnRpZmFjdHMiPgotCQkJCTxzZXBhcmF0b3IgbmFtZT0ieG1sIiAvPgotCQkJPC9tZW51PgotCQkJPGFjdGlvbgotCQkJCWxhYmVsPSIlX1VJX0FDVElPTl9DUkVBVEVfWE1MIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHMuWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUiCi0JCQkJbWVudWJhclBhdGg9ImdlbmVyYXRlWE1MQXJ0aWZhY3RzL3htbCIKLQkJCQllbmFibGVzRm9yPSIxIgotCQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sd2l6YXJkLmNyZWF0ZVhNTEZyb21EVERBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gQ29udHJpYnV0ZSBhIE5ldy0+RXhhbXBsZS4uLiBlbnRyeSBmb3IgRWRpdGluZyBhbmQgVmFsaWRhdGluZyBYTUwgZmlsZXMgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLQk8IS0tIGRlZmluZSB0aGUgWE1MU2FtcGxlcyBwcm9qZWN0IHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5uZXdXaXphcmRzIj4KLQkJPGNhdGVnb3J5Ci0JCQluYW1lPSIlX1VJX1dJWkFSRF9ORVdfWE1MIgotCQkJcGFyZW50Q2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwuZXhhbXBsZXMiPgotCQk8L2NhdGVnb3J5PgotCQk8d2l6YXJkCi0JCQluYW1lPSIlWE1MRXhhbXBsZS5uYW1lIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotCQkJY2F0ZWdvcnk9Im9yZy5lY2xpcHNlLnVpLkV4YW1wbGVzL29yZy5lY2xpcHNlLndzdC54bWwuZXhhbXBsZXMiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5YTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIgotCQkJcHJvamVjdD0idHJ1ZSIKLQkJCWljb249IiRubCQvaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXouZ2lmIj4KLQkJCTxkZXNjcmlwdGlvbj4KLQkJCQklWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5kZXNjcmlwdGlvbgotCQkJPC9kZXNjcmlwdGlvbj4KLQkJPC93aXphcmQ+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tIGNvbmZpZ3VyZSB0aGUgWE1MU2FtcGxlcyBwcm9qZWN0IHdpemFyZCAtLT4KLQk8ZXh0ZW5zaW9uCi0JCXBvaW50PSJvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQiCi0JCWlkPSJYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkRXh0ZW5zaW9uIj4KLQkJPHdpemFyZAotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCIKLQkJCWJhbm5lcj0iaWNvbnMvbmV3U2FtcGxlUHJvamVjdF93aXpiYW5uZXIuZ2lmIj4KLQkJCTxwcm9qZWN0c2V0dXAKLQkJCQlwYWdldGl0bGU9IiVYTUxFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLnBhZ2V0aXRsZSIKLQkJCQluYW1lPSIlWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wcm9qZWN0bmFtZSIKLQkJCQlsYWJlbD0iJVhNTEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQubGFiZWwiCi0JCQkJcGFnZWRlc2NyaXB0aW9uPSIlWE1MRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5wYWdlZGVzY3JpcHRpb24iCi0JCQkJb3Blbj0icmVhZG1lLmh0bWwiPgotCQkJCTxpbXBvcnQKLQkJCQkJZGVzdD0iIgotCQkJCQlzcmM9ImV4YW1wbGVzL0VkaXRpbmdBbmRWYWxpZGF0aW5nWE1MLnppcCIgLz4KLQkJCTwvcHJvamVjdHNldHVwPgotCQk8L3dpemFyZD4KLQk8L2V4dGVuc2lvbj4KLQotCTwhLS0gaW5pdGlhbGl6ZSB4bWwgdWkgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplciIgLz4KLQk8L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc291cmNldmFsaWRhdGlvbiI+Ci0JCTx2YWxpZGF0b3IKLQkJCXNjb3BlPSJ0b3RhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTCI+Ci0JCQk8Y29udGVudFR5cGVJZGVudGlmaWVyIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIj4KLQkJCQk8cGFydGl0aW9uVHlwZSBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5YTUxfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLlNUX0RFRkFVTFQiLz4KLQkJCTwvY29udGVudFR5cGVJZGVudGlmaWVyPgotCQk8L3ZhbGlkYXRvcj4KLQk8L2V4dGVuc2lvbj4KLQkKLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnNvdXJjZXZhbGlkYXRpb24iPgotCQk8dmFsaWRhdG9yCi0JCQlzY29wZT0icGFydGlhbCIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uTWFya3VwVmFsaWRhdG9yIgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5tYXJrdXB2YWxpZGF0b3IiPgotCQkJPGNvbnRlbnRUeXBlSWRlbnRpZmllciBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbCI+Ci0JCQkJPHBhcnRpdGlvblR5cGUgaWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UuU1RfREVGQVVMVCIvPgotCQkJCTxwYXJ0aXRpb25UeXBlIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLlhNTF9ERUZBVUxUIi8+Ci0JCQk8L2NvbnRlbnRUeXBlSWRlbnRpZmllcj4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0JCi0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPCEtLSBEb2N1bWVudCBwcm92aWRlciBmb3IgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0JPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy5kb2N1bWVudFByb3ZpZGVycyI+Ci0JCTxwcm92aWRlcgotCQkJaW5wdXRUeXBlcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQiCi0JCQljbGFzcz0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRGaWxlRG9jdW1lbnRQcm92aWRlciIKLQkJCWlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkV4dGVybmFsRmlsZURvY3VtZW50UHJvdmlkZXIiPgotCQk8L3Byb3ZpZGVyPgotCTwvZXh0ZW5zaW9uPgotCi0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPHZpZXdlckNvbnRyaWJ1dGlvbgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlLlJ1bGVyQ29udGV4dCIKLQkJCWlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLnJ1bGVyLmNvbnRleHQuYWN0aW9ucyI+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRUYXNrLmxhYmVsIgotCQkJCWhlbHBDb250ZXh0SWQ9Im9yZy5lY2xpcHNlLnVpLkFkZFRhc2tfYWN0aW9uX2NvbnRleHQiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuVGFza1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRUYXNrLnRvb2x0aXAiCi0JCQkJbWVudWJhclBhdGg9ImFkZGl0aW9ucyIKLQkJCQlpZD0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5UYXNrUnVsZXJBY3Rpb24iPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJbGFiZWw9IiVBZGRCb29rbWFyay5sYWJlbCIKLQkJCQloZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5Cb29rbWFya1J1bGVyQWN0aW9uIgotCQkJCXRvb2x0aXA9IiVBZGRCb29rbWFyay50b29sdGlwIgotCQkJCW1lbnViYXJQYXRoPSJhZGRpdGlvbnMiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQm9va21hcmtSdWxlckFjdGlvbiI+Ci0JCQk8L2FjdGlvbj4KLQkJPC92aWV3ZXJDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci0KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8IS0tIEFuIGV4dGVuc2lvbiBmb3IgY3JlYXRpbmcgbmVzdGVkIHZhbGlkYXRpb24gbWVzc2FnZXMuICAtLT4KLQk8IS0tIFRoaXMgZXh0ZW5zaW9uIHNob3VsZCBiZSBtb3ZlZCB3aGVuIHRoZSByZWZlcmVuY2VkICAgICAtLT4KLQk8IS0tIGZpbGVzIGRpYWxvZyBpcyBtb3ZlZCB0byBhbm90aGVyIHBsdWdpbi4gICAgICAgICAgICAgICAtLT4KLQk8IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS51aS5wb3B1cE1lbnVzIj4KLQkJPG9iamVjdENvbnRyaWJ1dGlvbgotCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklNYXJrZXIiCi0JCQlpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLm5lc3RlZGVycm9ybGlzdCIKLQkJCW5hbWVGaWx0ZXI9IioiPgotCQkJPGZpbHRlcgotCQkJCW5hbWU9ImRvbmUiCi0JCQkJdmFsdWU9InRydWUiPgotCQkJPC9maWx0ZXI+Ci0JCQk8ZmlsdGVyCi0JCQkJbmFtZT0idHlwZSIKLQkJCQl2YWx1ZT0ib3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24ucHJvYmxlbW1hcmtlciI+Ci0JCQk8L2ZpbHRlcj4KLQkJCTxhY3Rpb24KLQkJCQlsYWJlbD0iJV9VSV9SRUZfRklMRV9TSE9XX0RFVEFJTFMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mby5SZWZlcmVuY2VkRmlsZUVycm9yQWN0aW9uRGVsZWdhdGUiCi0JCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmVycm9yaW5mby5SZWZlcmVuY2VkRmlsZUVycm9yQWN0aW9uRGVsZWdhdGUiPgotCQkJPC9hY3Rpb24+Ci0JCTwvb2JqZWN0Q29udHJpYnV0aW9uPgotCTwvZXh0ZW5zaW9uPgotCi0JCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9yQWN0aW9ucyI+Ci0JCTxlZGl0b3JDb250cmlidXRpb24KLQkJCWlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZS5lZGl0b3JBY3Rpb25zIgotCQkJdGFyZ2V0SUQ9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwuc291cmNlIj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQ2xlYW51cERvY3VtZW50IgotCQkJCWxhYmVsPSIlQ2xlYW51cERvY3VtZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jbGVhbnVwLmRvY3VtZW50IgotCQkJCXRvb2x0aXA9IiVDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLkNsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQ2xlYW51cERvY3VtZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJUb2dnbGVDb21tZW50IgotCQkJCWxhYmVsPSIlVG9nZ2xlQ29tbWVudF9sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudG9nZ2xlLmNvbW1lbnQiCi0JCQkJdG9vbHRpcD0iJVRvZ2dsZUNvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlRvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iVG9nZ2xlQ29tbWVudCI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iQWRkQmxvY2tDb21tZW50IgotCQkJCWxhYmVsPSIlQWRkQmxvY2tDb21tZW50X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5hZGQuYmxvY2suY29tbWVudCIKLQkJCQl0b29sdGlwPSIlQWRkQmxvY2tDb21tZW50X3Rvb2x0aXAiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iQWRkQmxvY2tDb21tZW50Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJSZW1vdmVCbG9ja0NvbW1lbnQiCi0JCQkJbGFiZWw9IiVSZW1vdmVCbG9ja0NvbW1lbnRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnJlbW92ZS5ibG9jay5jb21tZW50IgotCQkJCXRvb2x0aXA9IiVSZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zLlJlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJSZW1vdmVCbG9ja0NvbW1lbnQiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IkZpbmRPY2N1cnJlbmNlcyIKLQkJCQlsYWJlbD0iJUZpbmRPY2N1cnJlbmNlc19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc2VhcmNoLmZpbmQub2NjdXJyZW5jZXMiCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VhcmNoLlhNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJGaW5kT2NjdXJyZW5jZXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCIKLQkJCQlkZWZpbml0aW9uSWQ9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkuc3RydWN0dXJlLnNlbGVjdC5lbmNsb3NpbmciCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUiCi0JCQkJYWN0aW9uSUQ9IlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZyI+Ci0JCQk8L2FjdGlvbj4KLQkJCTxhY3Rpb24KLQkJCQlpZD0iU3RydWN0dXJlU2VsZWN0TmV4dCIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWwiCi0JCQkJZGVmaW5pdGlvbklkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnN0cnVjdHVyZS5zZWxlY3QubmV4dCIKLQkJCQl0b29sdGlwPSIlU3RydWN0dXJlU2VsZWN0TmV4dF90b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIgotCQkJCWFjdGlvbklEPSJTdHJ1Y3R1cmVTZWxlY3ROZXh0Ij4KLQkJCTwvYWN0aW9uPgotCQkJPGFjdGlvbgotCQkJCWlkPSJTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91cyIKLQkJCQlsYWJlbD0iJVN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0LnByZXZpb3VzIgotCQkJCXRvb2x0aXA9IiVTdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwIgotCQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0UHJldmlvdXMiPgotCQkJPC9hY3Rpb24+Ci0JCQk8YWN0aW9uCi0JCQkJaWQ9IlN0cnVjdHVyZVNlbGVjdEhpc3RvcnkiCi0JCQkJbGFiZWw9IiVTdHJ1Y3R1cmVTZWxlY3RIaXN0b3J5X2xhYmVsIgotCQkJCWRlZmluaXRpb25JZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5zdHJ1Y3R1cmUuc2VsZWN0Lmxhc3QiCi0JCQkJdG9vbHRpcD0iJVN0cnVjdHVyZVNlbGVjdEhpc3RvcnlfdG9vbHRpcCIKLQkJCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWxlY3Rpb24uU3RydWN0dXJlZFNlbGVjdEhpc3RvcnlBY3Rpb25EZWxlZ2F0ZSIKLQkJCQlhY3Rpb25JRD0iU3RydWN0dXJlU2VsZWN0SGlzdG9yeSI+Ci0JCQk8L2FjdGlvbj4KLQkJPC9lZGl0b3JDb250cmlidXRpb24+Ci0gICAgICAgIDxlZGl0b3JDb250cmlidXRpb24KLSAgICAgICAgICAgIHRhcmdldElEPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSIKLSAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZS5ydWxlci5hY3Rpb25zIj4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlQWRkQm9va21hcmsubGFiZWwiCi0gICAgICAgICAgICAgICBoZWxwQ29udGV4dElkPSJvcmcuZWNsaXBzZS51aS5ib29rbWFya19hY3Rpb25fY29udGV4dCIKLSAgICAgICAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iCi0gICAgICAgICAgICAgICBhY3Rpb25JRD0iUnVsZXJEb3VibGVDbGljayIKLSAgICAgICAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLkJvb2ttYXJrUnVsZXJBY3Rpb24iLz4KLSAgICAgICAgIDxhY3Rpb24KLSAgICAgICAgICAgICAgIGxhYmVsPSIlU2VsZWN0UnVsZXIubGFiZWwiCi0gICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5TZWxlY3RSdWxlckFjdGlvbiIKLSAgICAgICAgICAgICAgIGFjdGlvbklEPSJSdWxlckNsaWNrIgotICAgICAgICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuU2VsZWN0UnVsZXJBY3Rpb24iLz4KLSAgICAgICAgPC9lZGl0b3JDb250cmlidXRpb24+Ci0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc2NoZW1hL2NhdGFsb2dGaWxlVHlwZS5leHNkIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NjaGVtYS9jYXRhbG9nRmlsZVR5cGUuZXhzZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyOTY1OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc2NoZW1hL2NhdGFsb2dGaWxlVHlwZS5leHNkCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci08IS0tIFNjaGVtYSBmaWxlIHdyaXR0ZW4gYnkgUERFIC0tPgotPHNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiPgotPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNjaGVtYSBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC54bWwudWkiIGlkPSJjYXRhbG9nRmlsZVR5cGUiIG5hbWU9IlhNTCBDYXRhbG9nIGZpbGUgdHlwZSBleHRlbnNpb24gcG9pbnQiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImV4dGVuc2lvbiI+Ci0gICAgICA8Y29tcGxleFR5cGU+Ci0gICAgICAgICA8c2VxdWVuY2U+Ci0gICAgICAgICAgICA8ZWxlbWVudCByZWY9ImZpbGVUeXBlIiBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICA8L3NlcXVlbmNlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJwb2ludCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciPgotICAgICAgICAgICAgPGFubm90YXRpb24+Ci0gICAgICAgICAgICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgICAgICAgICAgICAgPGFwcEluZm8+Ci0gICAgICAgICAgICAgICAgICA8bWV0YS5hdHRyaWJ1dGUgdHJhbnNsYXRhYmxlPSJ0cnVlIi8+Ci0gICAgICAgICAgICAgICA8L2FwcEluZm8+Ci0gICAgICAgICAgICA8L2Fubm90YXRpb24+Ci0gICAgICAgICA8L2F0dHJpYnV0ZT4KLSAgICAgIDwvY29tcGxleFR5cGU+Ci0gICA8L2VsZW1lbnQ+Ci0KLSAgIDxlbGVtZW50IG5hbWU9ImZpbGVUeXBlIj4KLSAgICAgIDxjb21wbGV4VHlwZT4KLSAgICAgICAgIDxhdHRyaWJ1dGUgbmFtZT0iZXh0ZW5zaW9ucyIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJkZXNjcmlwdGlvbiIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ic3RyaW5nIiB1c2U9InJlcXVpcmVkIj4KLSAgICAgICAgICAgIDxhbm5vdGF0aW9uPgotICAgICAgICAgICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvYW5ub3RhdGlvbj4KLSAgICAgICAgIDwvYXR0cmlidXRlPgotICAgICAgPC9jb21wbGV4VHlwZT4KLSAgIDwvZWxlbWVudD4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0ic2luY2UiLz4KLSAgICAgIDwvYXBwSW5mbz4KLSAgICAgIDxkb2N1bWVudGF0aW9uPgotICAgICAgICAgJmx0O2ImZ3Q7VGhpcyBleHRlbnNpb24gcG9pbnQgaXMgaW50ZXJuYWwgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBhbnkgb3RoZXIgcGx1Z2lucy4mbHQ7L2ImZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLSAgIDxhbm5vdGF0aW9uPgotICAgICAgPGFwcEluZm8+Ci0gICAgICAgICA8bWV0YS5zZWN0aW9uIHR5cGU9ImV4YW1wbGVzIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJhcGlJbmZvIi8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIAotICAgICAgPC9kb2N1bWVudGF0aW9uPgotICAgPC9hbm5vdGF0aW9uPgotCi0gICA8YW5ub3RhdGlvbj4KLSAgICAgIDxhcHBJbmZvPgotICAgICAgICAgPG1ldGEuc2VjdGlvbiB0eXBlPSJpbXBsZW1lbnRhdGlvbiIvPgotICAgICAgPC9hcHBJbmZvPgotICAgICAgPGRvY3VtZW50YXRpb24+Ci0gICAgICAgICAKLSAgICAgIDwvZG9jdW1lbnRhdGlvbj4KLSAgIDwvYW5ub3RhdGlvbj4KLQotICAgPGFubm90YXRpb24+Ci0gICAgICA8YXBwSW5mbz4KLSAgICAgICAgIDxtZXRhLnNlY3Rpb24gdHlwZT0iY29weXJpZ2h0Ii8+Ci0gICAgICA8L2FwcEluZm8+Ci0gICAgICA8ZG9jdW1lbnRhdGlvbj4KLSAgICAgICAgIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4mbHQ7YnImZ3Q7Ci1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIAotYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIAotdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgJmx0O2EKLWhyZWY9JnF1b3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmcXVvdDsmZ3Q7aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwmbHQ7L2EmZ3Q7Ci0gICAgICA8L2RvY3VtZW50YXRpb24+Ci0gICA8L2Fubm90YXRpb24+Ci0KLTwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9BZHZhbmNlZE9wdGlvbnNEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQWR2YW5jZWRPcHRpb25zRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZGM1ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9BZHZhbmNlZE9wdGlvbnNEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyIElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5NdWx0aVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5TYXZlQXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kaWFsb2dzLlNlbGVjdFNpbmdsZUZpbGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgQWR2YW5jZWRPcHRpb25zRGlhbG9nIGV4dGVuZHMgRGlhbG9nIAotewotICBwcm90ZWN0ZWQgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nOwotCi0gIHB1YmxpYyBBZHZhbmNlZE9wdGlvbnNEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZykgCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0gICAgc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsgICAKLSAgICB0aGlzLndvcmtpbmdVc2VyQ2F0YWxvZyA9IHdvcmtpbmdVc2VyQ2F0YWxvZzsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSAKLSAgewotICAgIGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIAotICB7Ci0gICAgQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKXN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLS8vICAgIFdvcmtiZW5jaEhlbHAuc2V0SGVscChkaWFsb2dBcmVhLCBuZXcgQ29udHJvbENvbnRleHRDb21wdXRlcihkaWFsb2dBcmVhLCBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX1BST0pFQ1RfRElBTE9HKSk7Ci0gICAgICAgICAgCi0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOyAgCi0KLSAgICBMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBsYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ESUFMT0dfREVTQ1JJUFRJT04pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0gICAgYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChncmlkTGF5b3V0KTsgICAgIAotICAgIGJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgIAotICAgIENvbXBvc2l0ZSBwbGFjZUhvbGRlciA9IG5ldyBDb21wb3NpdGUoYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgCi0gICAgQ29tcG9zaXRlIGJ1dHRvbkdyb3VwID0gbmV3IENvbXBvc2l0ZShidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBncmlkTGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLSAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotICAgIGdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLSAgICBidXR0b25Hcm91cC5zZXRMYXlvdXQoZ3JpZExheW91dCk7IAotICAgIGJ1dHRvbkdyb3VwLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEoKSk7Ci0KLSAgICBCdXR0b24gaW1wb3J0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0ggfCBTV1QuQ0VOVEVSKTsKLSAgICBpbXBvcnRCdXR0b24uc2V0VGV4dCgiICAiICsgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9JTVBPUlQgKyAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICBCdXR0b24gZXhwb3J0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Hcm91cCwgU1dULlBVU0ggfCBTV1QuQ0VOVEVSKTsKLSAgICBleHBvcnRCdXR0b24uc2V0VGV4dCgiICAiICsgWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9FWFBPUlQgKyAiICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0KLSAgICBwbGFjZUhvbGRlciA9IG5ldyBDb21wb3NpdGUoYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgcGxhY2VIb2xkZXIuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLSAgICAvLyBhZGQgaW1wb3J0QnV0dG9uIGxpc3RlbmVyCi0gICAgU2VsZWN0aW9uTGlzdGVuZXIgaW1wb3J0QnV0dG9uU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICBpbnZva2VJbXBvcnREaWFsb2coKTsgICAgICAgICAgICAgIAotICAgICAgfSAgICAgCi0gICAgfTsgCi0gICAgaW1wb3J0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGltcG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyKTsKLSAgICAgICAgCi0gICAgLy8gYWRkIGV4cG9ydEJ1dHRvbiBsaXN0ZW5lcgotICAgIFNlbGVjdGlvbkxpc3RlbmVyIGV4cG9ydEJ1dHRvblNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpCi0gICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgaW52b2tlRXhwb3J0RGlhbG9nKCk7ICAgICAgICAgICAgICAKLSAgICAgIH0gICAgIAotICAgIH07IAotICAgIGV4cG9ydEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihleHBvcnRCdXR0b25TZWxlY3Rpb25MaXN0ZW5lcik7Ci0KLSAgICByZXR1cm4gZGlhbG9nQXJlYTsKLSAgfQotICAgICAgIAotICBwcm90ZWN0ZWQgR3JpZERhdGEgY3JlYXRlR3JpZERhdGEoKQotICB7Ci0gICAgR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuQ0VOVEVSKTsKLSAgICBnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9DRU5URVI7Ci0gICAgZ2QudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5WRVJUSUNBTF9BTElHTl9DRU5URVI7Ci0gICAgcmV0dXJuIGdkOwotICB9Ci0gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VJbXBvcnREaWFsb2coKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKGdldFNoZWxsKCksIG51bGwsIHRydWUpOyAKLSAgICBTdHJpbmdbXSBleHRlbnNpb25zID0geyIueG1sY2F0YWxvZyIsICIueG1sIn07IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIGRpYWxvZy5hZGRGaWx0ZXJFeHRlbnNpb25zKGV4dGVuc2lvbnMpOyAgIAotICAgIGRpYWxvZy5jcmVhdGUoKTsgICAKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9JTVBPUlRfRElBTE9HX1RJVExFKTsKLSAgICBkaWFsb2cuc2V0VGl0bGUoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORyk7Ci0gICAgZGlhbG9nLnNldE1lc3NhZ2UoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfTUVTU0FHRSk7Ci0gICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIGludCByYyA9IGRpYWxvZy5vcGVuKCk7ICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgaWYgKHJjID09IFdpbmRvdy5PSykKLSAgICB7ICAgICAgICAgICAgIAotICAgICAgSUZpbGUgZmlsZSA9IGRpYWxvZy5nZXRGaWxlKCk7Ci0gICAgICBpZiAoZmlsZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldExvY2F0aW9uKCkudG9GaWxlKCkudG9VUkkoKS50b1N0cmluZygpOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgQ2F0YWxvZ1NldCB0ZW1wUmVzb3VyY2VTZXQgPSBuZXcgQ2F0YWxvZ1NldCgpOyAKLSAgICAgICAgICAgIElDYXRhbG9nIG5ld0NhdGFsb2cgPSB0ZW1wUmVzb3VyY2VTZXQubG9va3VwT3JDcmVhdGVDYXRhbG9nKCJ0ZW1wIiwgZmlsZU5hbWUpOyAgICAgICAvLyROT04tTkxTLTEkCi0gIAkJICAgICAgd29ya2luZ1VzZXJDYXRhbG9nLmFkZEVudHJpZXNGcm9tQ2F0YWxvZyhuZXdDYXRhbG9nKTsgCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICB7Ci0gICAgICAgICAgLy9UT0RPLi4uIGdpdmUgZXJyb3IgbWVzc2FnZQotICAgICAgICB9ICAgCi0gICAgICB9Ci0gICAgICBjbG9zZSgpOwotICAgIH0KLSAgfQotICAKLQotICBwcm90ZWN0ZWQgdm9pZCBpbnZva2VFeHBvcnREaWFsb2coKQotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIElQYXRoIG9yaWdpbmFsRmlsZVBhdGggPSBudWxsOwotICAgIElQcm9qZWN0W10gcHJvamVjdHMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3RzKCk7Ci0gICAgaWYgKHByb2plY3RzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgb3JpZ2luYWxGaWxlUGF0aCA9IHByb2plY3RzWzBdLmdldEZ1bGxQYXRoKCkuYXBwZW5kKCIueG1sY2F0YWxvZyIpOyAvLyROT04tTkxTLTEkCi0gICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTYXZlQXNEaWFsb2cgZGlhbG9nID0gbmV3IFNhdmVBc0RpYWxvZyhnZXRTaGVsbCgpKTsKLSAgICBpZiAob3JpZ2luYWxGaWxlUGF0aCAhPSBudWxsKQotICAgIHsKLQkgICAgSUZpbGUgb3JpZ2luYWxGaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG9yaWdpbmFsRmlsZVBhdGgpOyAgIAotICAgICAgZGlhbG9nLnNldE9yaWdpbmFsRmlsZShvcmlnaW5hbEZpbGUpOyAKLSAgICB9Ci0gICAgZGlhbG9nLmNyZWF0ZSgpOyAgICAKLQotICAgIGRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfVElUTEUpOwotICAgIGRpYWxvZy5zZXRUaXRsZShYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19IRUFESU5HKTsKLSAgICBkaWFsb2cuc2V0TWVzc2FnZShYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19NRVNTQUdFKTsKLQotICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICBpbnQgcmMgPSBkaWFsb2cub3BlbigpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgIGlmIChyYyA9PSBXaW5kb3cuT0spCi0gICAgeyAKLSAgICAgIElQYXRoIHBhdGggPSBkaWFsb2cuZ2V0UmVzdWx0KCk7Ci0gICAgICBpZiAocGF0aCAhPSBudWxsKQotICAgICAgeyAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgSUZpbGUgZmlsZSA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLQkJU3RyaW5nIGZpbGVOYW1lID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvRmlsZSgpLnRvVVJJKCkudG9TdHJpbmcoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIGhlcmUgd2Ugc2F2ZSB0aGUgY2F0YWxvZyBlbnRyaWVzIHRvIHRoZSBzZWxlY3RlZCBmaWxlICAgICAgCi0gICAgICAgIHRyeQotICAgICAgICB7ICAgICAgICAgCi0gICAgICAgICAgY3JlYXRlRmlsZUlmUmVxdWlyZWQoZmlsZSk7IAotICAgICAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZy5zZXRMb2NhdGlvbihmaWxlTmFtZSk7Ci0gICAgICAgICAgd29ya2luZ1VzZXJDYXRhbG9nLnNhdmUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGV4KQotICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7ICAKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9DQVRBTE9HX1NBVkVfRVJST1I7ICAgIAotICAgICAgICAgICAgU3RyaW5nIGJyaWVmTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9DQVRBTE9HX0NPVUxEX05PVF9CRV9TQVZFRDsgICAgIAotICAgICAgICAgICAgU3RyaW5nIHJlYXNvbiA9IGZpbGUuaXNSZWFkT25seSgpID8KLSAgICAgICAgICAgIAkJTkxTLmJpbmQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0ZJTEVfSVNfUkVBRF9PTkxZLCBmaWxlTmFtZSkgOiAKLSAgICAgICAgICAgIAkJCU5MUy5iaW5kKFhNTENhdGFsb2dNZXNzYWdlcy5FUlJPUl9TQVZJTkdfRklMRSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgU3RyaW5nIGRldGFpbHMgPSBOTFMuYmluZChYTUxDYXRhbG9nTWVzc2FnZXMuRVJST1JfU0FWSU5HX0ZJTEUsIGZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgRXJyb3JEaWFsb2cub3BlbkVycm9yKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIHRpdGxlLCBicmllZk1lc3NhZ2UsIGNyZWF0ZVN0YXR1cyhyZWFzb24sIGRldGFpbHMpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBleDIpCi0gICAgICAgICAgewotICAgICAgICAgIH0KLSAgICAgICAgfSAKLSAgICAgICAgY2xvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIC8vIFRPRE8uLi4gVGhpcyB3YXMgY29waWVkIGZyb20gV2luZG93VXRpbGl0eS4gIElzIHRoZXJlIGFuIGVhc2llciB3YXkgdG8gY3JlYXRlIGEgc3RhdHVzIG9iamVjdD8KLSAgLy8gSWYgbm90LCB3ZSBzaG91bGQgb3BlbiBhbiBlY2xpcHNlIGJ1ZyBvciBhZGQgYSBzaW1pbGFyIHV0aWxpdHkgdG8gYmFzZUV4dGVuc2lvbnNVSS4KLSAgLy8KLSAgcHJpdmF0ZSBzdGF0aWMgSVN0YXR1cyBjcmVhdGVTdGF0dXMoU3RyaW5nIHJlYXNvbiwgU3RyaW5nIG1zZykKLSAgewotCVN0cmluZyBwbHVnaW5JZCA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKTsgICAgCi0JTXVsdGlTdGF0dXMgbXVsdGlTdGF0dXMgPSBuZXcgTXVsdGlTdGF0dXMocGx1Z2luSWQsIDAsIHJlYXNvbiwgbnVsbCk7Ci0JU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgcGx1Z2luSWQsIDAsIG1zZywgbnVsbCk7Ci0JbXVsdGlTdGF0dXMuYWRkKHN0YXR1cyk7Ci0JcmV0dXJuIG11bHRpU3RhdHVzOwotICB9ICAgCi0gIAotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUZpbGVJZlJlcXVpcmVkKElGaWxlIGZpbGUpCi0gIHsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIGlmIChmaWxlICE9IG51bGwgJiYgIWZpbGUuZXhpc3RzKCkpCi0gICAgICB7Ci0gICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKTsgICAgICAKLQkgICAgICBmaWxlLmNyZWF0ZShpbnB1dFN0cmVhbSwgdHJ1ZSwgbnVsbCk7Ci0gICAgICAgIC8vY3JlYXRlRW1wdHlYTUxDYXRhbG9nKGZpbGUpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIH0KLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0YThkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0NhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIgX2luc3RhbmNlOwotCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBBVFRfREVTQ1JJUFRJT04gPSAiZGVzY3JpcHRpb24iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9FWFRFTlNJT05TID0gImV4dGVuc2lvbnMiOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JQ09OID0gImljb24iOyAvLyROT04tTkxTLTEkCi0KLQlzdGF0aWMgZmluYWwgU3RyaW5nIEFUVF9JRCA9ICJpZCI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgRVhURU5TSU9OX1BPSU5UX0lEID0gImNhdGFsb2dGaWxlVHlwZSI7IC8vJE5PTi1OTFMtMSQKLQotCXN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHX05BTUUgPSAiZmlsZVR5cGUiOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotCQkJX2luc3RhbmNlID0gbmV3IENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyKCk7Ci0JCXJldHVybiBfaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dGaWxlVHlwZXMoKSB7Ci0JCXJldHVybiBnZXRJbnN0YW5jZSgpLmhhc2hNYXAudmFsdWVzKCk7Ci0JfQotCi0JcHJpdmF0ZSBIYXNoTWFwIGhhc2hNYXA7Ci0KLQlwdWJsaWMgQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIoKSB7Ci0JCXRoaXMuaGFzaE1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJlYWRSZWdpc3RyeSgpOwotCX0KLQotCXByaXZhdGUgdm9pZCByZWFkRWxlbWVudChJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudC5nZXROYW1lKCkuZXF1YWxzKFRBR19OQU1FKSkgewotCQkJU3RyaW5nIGlkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoQVRUX0lEKTsKLQkJCWlmIChpZCAhPSBudWxsKSB7Ci0JCQkJWE1MQ2F0YWxvZ0ZpbGVUeXBlIGZpbGVUeXBlID0gKFhNTENhdGFsb2dGaWxlVHlwZSkgaGFzaE1hcC5nZXQoaWQpOwotCQkJCWlmIChmaWxlVHlwZSA9PSBudWxsKSB7Ci0JCQkJCWZpbGVUeXBlID0gbmV3IFhNTENhdGFsb2dGaWxlVHlwZSgpOwotCQkJCQloYXNoTWFwLnB1dChpZCwgZmlsZVR5cGUpOwotCQkJCX0KLQotCQkJCWlmIChmaWxlVHlwZS5kZXNjcmlwdGlvbiA9PSBudWxsKSB7Ci0JCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKEFUVF9ERVNDUklQVElPTik7Ci0JCQkJCWZpbGVUeXBlLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0JCQkJfQotCi0JCQkJZmlsZVR5cGUuYWRkRXh0ZW5zaW9ucyhlbGVtZW50LmdldEF0dHJpYnV0ZShBVFRfRVhURU5TSU9OUykpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeSgpIHsKLQkJcmVhZFJlZ2lzdHJ5KEVYVEVOU0lPTl9QT0lOVF9JRCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIHJlYWRSZWdpc3RyeShTdHJpbmcgZXh0ZW5zaW9uUG9pbnRJZCkgewotCQlJRXh0ZW5zaW9uUmVnaXN0cnkgcGx1Z2luUmVnaXN0cnkgPSBQbGF0Zm9ybS5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCQlJRXh0ZW5zaW9uUG9pbnQgcG9pbnQgPSBwbHVnaW5SZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChYTUxVSVBsdWdpbi5JRCwgZXh0ZW5zaW9uUG9pbnRJZCk7Ci0JCWlmIChwb2ludCAhPSBudWxsKSB7Ci0JCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IHBvaW50LmdldENvbmZpZ3VyYXRpb25FbGVtZW50cygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykgewotCQkJCXJlYWRFbGVtZW50KGVsZW1lbnRzW2ldKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvRWRpdENhdGFsb2dFbnRyeURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OGY2NDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5Gb3JtQXR0YWNobWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkZvcm1EYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuRm9ybUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5NZW51OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVG9vbEJhcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Ub29sSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5XaWRnZXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0U2luZ2xlRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLlVSSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotcHVibGljIGNsYXNzIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgYm9yd3NlSW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBjYXRhbG9nRW50cnlUb29sQmFySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZiIpOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSBuZXh0Q2F0YWxvZ1Rvb2xCYXJJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvZXRvb2w1MC9uZXh0Q2F0YWxvZy5naWYiKTsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIGNsYXNzIENhdGFsb2dFbnRyeVBhZ2UgZXh0ZW5kcyBDYXRhbG9nRWxlbWVudFBhZ2UgewotCi0JCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCi0JCXByb3RlY3RlZCBJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeTsKLQotCQlwcm90ZWN0ZWQgQnV0dG9uIGNoZWNrYm94QnV0dG9uOwotCi0JCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQotCQlwcm90ZWN0ZWQgVGV4dCBrZXlGaWVsZDsKLQotCQlwcm90ZWN0ZWQgQ29tYm8ga2V5VHlwZUNvbWJvOwotCi0JCXByb3RlY3RlZCBUZXh0IHJlc291cmNlTG9jYXRpb25GaWVsZDsKLQotCQlwcm90ZWN0ZWQgQ29tYm8gcmVzb3VyY2VUeXBlQ29tYm87Ci0KLQkJcHJvdGVjdGVkIFRleHQgd2ViQWRkcmVzc0ZpZWxkOwotCi0JCXByb3RlY3RlZCB2b2lkIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCi0JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCQlTdHJpbmcgZmlsZU5hbWUgPSByZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpOwotCQkJCWlmIChmaWxlTmFtZS50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJCWlmIChmaWxlTmFtZS5pbmRleE9mKCIuLiIpICE9IC0xIHx8IGZpbGVOYW1lLmluZGV4T2YoIi4vIikgIT0gLTEgfHwgZmlsZU5hbWUuaW5kZXhPZigiLy4iKSAhPSAtMSB8fCBmaWxlTmFtZS5pbmRleE9mKCIuXFwiKSAhPSAtMSB8fCBmaWxlTmFtZS5pbmRleE9mKCJcXC4iKSAhPSAtMSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkIC8vJE5PTi1OTFMtNSQKLQkJCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX1VSSV9NVVNUX05PVF9IQVZFX0RPVFM7Ci0JCQkJCX0KLQotCQkJCQlTdHJpbmcgdXJpID0gZmlsZU5hbWU7Ci0JCQkJCWlmICghVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsKLQkJCQkJCXVyaSA9IFVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSkgPyBVUklIZWxwZXIucHJlcGVuZEZpbGVQcm90b2NvbCh1cmkpIDogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKTsKLQkJCQkJfQotCi0JCQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCAmJiAhVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQkJCWVycm9yTWVzc2FnZSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gKyBmaWxlTmFtZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGhpcyBhbiBlcnJvciB0aGF0IGlzIG5vdCBhY3RhdWxseQotCQkJCQkvLyByZXBvcnRlZCAuLi4gT0sgaXMganVzdCBkaXNhYmxlZAotCQkJCQllcnJvck1lc3NhZ2UgPSAiIjsgIC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCAmJiBjaGVja2JveEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSAmJiB3ZWJBZGRyZXNzRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJLy8gdGhpcyBhbiBlcnJvciB0aGF0IGlzIG5vdCBhY3RhdWxseQotCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJZXJyb3JNZXNzYWdlID0gIiI7ICAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCAmJiBrZXlGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQkvLyB0aGlzIGFuIGVycm9yIHRoYXQgaXMgbm90IGFjdGF1bGx5Ci0JCQkJLy8gcmVwb3J0ZWQgLi4uIE9LIGlzIGp1c3QgZGlzYWJsZWQKLQkJCQllcnJvck1lc3NhZ2UgPSAiIjsgIC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNhdGFsb2dFbnRyeVBhbmVsKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQotCQkJTW9kaWZ5TGlzdGVuZXIgbW9kaWZ5TGlzdGVuZXIgPSBuZXcgTW9kaWZ5TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQkJCWlmIChlLndpZGdldCA9PSByZXNvdXJjZUxvY2F0aW9uRmllbGQpIHsKLQkJCQkJCWlmIChrZXlGaWVsZC5nZXRUZXh0KCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJCVN0cmluZyB1cmkgPSByZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpOwotCQkJCQkJCWlmICh1cmkuZW5kc1dpdGgoInhzZCIpICYmICFVUklIZWxwZXIuaGFzUHJvdG9jb2wodXJpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCQkJCXVyaSA9IFVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSkgPyBVUklIZWxwZXIucHJlcGVuZEZpbGVQcm90b2NvbCh1cmkpIDogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKTsKLQkJCQkJCQkJU3RyaW5nIG5hbWVzcGFjZVVSSSA9IFhNTFF1aWNrU2Nhbi5nZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEodXJpKTsKLQkJCQkJCQkJaWYgKG5hbWVzcGFjZVVSSSAhPSBudWxsKSB7Ci0JCQkJCQkJCQlrZXlGaWVsZC5zZXRUZXh0KG5hbWVzcGFjZVVSSSk7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJdXBkYXRlV2lkZ2V0cyhlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQotCi0JCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJQ29tcG9zaXRlIGdyb3VwID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoMywgZmFsc2UpOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUxhYmVsIHJlc291cmNlTG9jYXRpb25MYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcmVzb3VyY2VMb2NhdGlvbkxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VSSV9DT0xPTik7Ci0KLQkJCXJlc291cmNlTG9jYXRpb25GaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkJZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IFNXVC5GSUxMOwotCQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCQlyZXNvdXJjZUxvY2F0aW9uRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZ2V0RW50cnkoKS5nZXRVUkkoKSkpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKHJlc291cmNlTG9jYXRpb25GaWVsZCwKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfVVJJKTsKLQkJCXJlc291cmNlTG9jYXRpb25GaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQotCQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnJvd3NlQnV0dG9uKGdyb3VwKTsKLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChicm93c2VCdXR0b24sCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX0JST1dTRSk7Ci0JCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIocmVzb3VyY2VMb2NhdGlvbkZpZWxkKSk7Ci0KLQkJCS8vIEtleSBUeXBlCi0JCQkvLwotCQkJTGFiZWwga2V5VHlwZUxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlrZXlUeXBlTGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfQ09MT04pOwotCi0JCQlrZXlUeXBlQ29tYm8gPSBuZXcgQ29tYm8oZ3JvdXAsIFNXVC5OT05FKTsKLQkJCWdkID0gbmV3IEdyaWREYXRhKCk7Ci0JCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gU1dULkZJTEw7Ci0JCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJCWtleVR5cGVDb21iby5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCXVwZGF0ZUtleVR5cGVDb21ibyhnZXRFbnRyeSgpLmdldEVudHJ5VHlwZSgpKTsKLQkJCWtleVR5cGVDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoa2V5VHlwZUNvbWJvLAotCQkJLy8gWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MUF9FTlRSWV9LRVlfVFlQRSk7Ci0KLQkJCS8vIGEgcGxhY2Vob2xkZXIgdG8gZmlsbCB0aGUgM3JkIGNvbHVtbgotCQkJQnV0dG9uIHBsYWNlSG9sZGVyID0gbmV3IEJ1dHRvbihncm91cCwgU1dULk5PTkUpOwotCQkJcGxhY2VIb2xkZXIuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJCS8vIEtleQotCQkJLy8gCi0JCQlMYWJlbCBrZXlWYWx1ZUxhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlrZXlWYWx1ZUxhYmVsLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX0tFWV9DT0xPTik7Ci0JCQlrZXlGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQkvLyBXb3JrYmVuY2hIZWxwLnNldEhlbHAoa2V5RmllbGQsCi0JCQkvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0VOVFJZX0tFWSk7Ci0JCQlrZXlGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJCWtleUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGdldEVudHJ5KCkuZ2V0S2V5KCkpKTsKLQkJCWtleUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQkJQ29tcG9zaXRlIGdyb3VwMiA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JvdXAyLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJZ3JvdXAyLnNldExheW91dChsYXlvdXQpOwotCi0JCQkvLyBjaGVja2JveCAtLSBub3RlIHBhcmVudCBpcyBkaWFsb2dBcmVhCi0JCQkvLwotCQkJY2hlY2tib3hCdXR0b24gPSBuZXcgQnV0dG9uKGdyb3VwMiwgU1dULkNIRUNLKTsKLQkJCS8vIFdvcmtiZW5jaEhlbHAuc2V0SGVscChjaGVja2JveEJ1dHRvbiwKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfU1BFQ0lGWV9BTFRFUk5BVElWRSk7Ci0JCQljaGVja2JveEJ1dHRvbi5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9TUEVDSUZZX0FMVEVSTkFUSVZFX1dFQl9VUkwpOwotCQkJY2hlY2tib3hCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoKSk7Ci0JCQljaGVja2JveEJ1dHRvbi5zZXRTZWxlY3Rpb24oZ2V0RW50cnkoKS5nZXRBdHRyaWJ1dGVWYWx1ZShJQ2F0YWxvZ0VudHJ5LkFUVFJfV0VCX1VSTCkgIT0gbnVsbCk7Ci0JCQlTZWxlY3Rpb25MaXN0ZW5lciBidXR0b25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCQkJLy8gbm8gaW1wbAotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGV2ZW50KSB7Ci0JCQkJCWlmIChldmVudC53aWRnZXQgPT0gY2hlY2tib3hCdXR0b24pIHsKLQkJCQkJCXVwZGF0ZVdpZGdldHMoY2hlY2tib3hCdXR0b24pOwotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQkJCWNoZWNrYm94QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKGJ1dHRvbkxpc3RlbmVyKTsKLQotCQkJLy8gV2ViIEFkZHJlc3MgZmllbGQKLQkJCS8vCi0KLQkJCU1vZGlmeUxpc3RlbmVyIHdlYkFkZHJlc3NGaWVsZExpc3RlbmVyID0gbmV3IE1vZGlmeUxpc3RlbmVyKCkgewotCQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQkJCXVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKGVycm9yTWVzc2FnZUxhYmVsKTsKLQkJCQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCQkJCX0KLQkJCX07Ci0KLQkJCXdlYkFkZHJlc3NGaWVsZCA9IG5ldyBUZXh0KGdyb3VwMiwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKHdlYkFkZHJlc3NGaWVsZCwKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfV0VCX0FERFJFU1MpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQkJd2ViQWRkcmVzc0ZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGdldEVudHJ5KCkuZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpKSk7Ci0JCQl3ZWJBZGRyZXNzRmllbGQuc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQl3ZWJBZGRyZXNzRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIod2ViQWRkcmVzc0ZpZWxkTGlzdGVuZXIpOwotCi0KLQkJCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGdyb3VwMiwgU1dULk5PTkUpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJdXBkYXRlV2lkZ2V0cyhudWxsKTsKLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCi0JCQlmQ29udHJvbCA9IGNyZWF0ZUNhdGFsb2dFbnRyeVBhbmVsKHBhcmVudCk7Ci0KLQkJCXJldHVybiBmQ29udHJvbDsKLQkJfQotCi0KLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldEVudHJ5KCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSBnZXRFbnRyeSgpIHsKLQkJCWlmIChjYXRhbG9nRW50cnkgPT0gbnVsbCkgewotCQkJCWlmIChmQ2F0YWxvZ0VsZW1lbnQgIT0gbnVsbCAmJiBmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX0VOVFJZKSB7Ci0JCQkJCWNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBmQ2F0YWxvZ0VsZW1lbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJCQljYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgY2F0YWxvZy5jcmVhdGVDYXRhbG9nRWxlbWVudChJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gY2F0YWxvZ0VudHJ5OwotCQl9Ci0KLQkJcHJvdGVjdGVkIGludCBnZXRLZXlUeXBlKCkgewotCQkJc3dpdGNoIChrZXlUeXBlQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCWlmICgic2NoZW1hIi5lcXVhbHMoa2V5VHlwZUNvbWJvLmdldERhdGEoImtleVR5cGUiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlyZXR1cm4gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSTsgLy8geHNkIG5hbWVzcGFjZSBpcyBVUkkgdHlwZSBrZXkKLQkJCQkJfQotCQkJCQlyZXR1cm4gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzsKLQkJCQljYXNlIDEgOgotCQkJCQlyZXR1cm4gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTTsKLQkJCQljYXNlIDIgOgotCQkJCQlyZXR1cm4gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSTsKLQkJCQlkZWZhdWx0IDoKLQkJCQkJcmV0dXJuIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUM7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzYXZlRGF0YSgpIHsKLQkJCVN0cmluZyB1cmkgPSByZXNvdXJjZUxvY2F0aW9uRmllbGQuZ2V0VGV4dCgpOwotCQkJaWYgKCFVUklIZWxwZXIuaGFzUHJvdG9jb2wodXJpKSkgewotCQkJCXVyaSA9IFVSSUhlbHBlci5pc0Fic29sdXRlKHVyaSkgPyBVUklIZWxwZXIucHJlcGVuZEZpbGVQcm90b2NvbCh1cmkpIDogVVJJSGVscGVyLnByZXBlbmRQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wodXJpKTsKLQkJCX0KLQkJCWdldEVudHJ5KCkuc2V0VVJJKHVyaSk7Ci0JCQlnZXRFbnRyeSgpLnNldEtleShrZXlGaWVsZC5nZXRUZXh0KCkpOwotCQkJZ2V0RW50cnkoKS5zZXRFbnRyeVR5cGUoZ2V0S2V5VHlwZSgpKTsKLQkJCWdldEVudHJ5KCkuc2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwsIGNoZWNrYm94QnV0dG9uLmdldFNlbGVjdGlvbigpID8gd2ViQWRkcmVzc0ZpZWxkLmdldFRleHQoKSA6IG51bGwpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlS2V5VHlwZUNvbWJvKGludCB0eXBlKSB7Ci0JCQlrZXlUeXBlQ29tYm8ucmVtb3ZlQWxsKCk7Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJWE1MQ2F0YWxvZ0ZpbGVUeXBlIHRoZUZpbGVUeXBlID0gKFhNTENhdGFsb2dGaWxlVHlwZSkgaS5uZXh0KCk7Ci0JCQkJaWYgKHRoZUZpbGVUeXBlLmV4dGVuc2lvbnMgIT0gbnVsbCkgewotCQkJCQlmb3IgKEl0ZXJhdG9yIGogPSB0aGVGaWxlVHlwZS5leHRlbnNpb25zLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykgewotCQkJCQkJU3RyaW5nIGV4dGVuc2lvbiA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJCQkJaWYgKHJlc291cmNlTG9jYXRpb25GaWVsZC5nZXRUZXh0KCkuZW5kc1dpdGgoZXh0ZW5zaW9uKSkgewotCQkJCQkJCWlmICh0aGVGaWxlVHlwZS5kZXNjcmlwdGlvbi5lcXVhbHMoIlhTRCBGaWxlcyIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1BVQkxJQyk7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9TWVNURU0pOwotCQkJCQkJCQlrZXlUeXBlQ29tYm8uc2V0RGF0YSgia2V5VHlwZSIsICJzY2hlbWEiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQkJfQotCQkJCQkJCWVsc2UgaWYgKHRoZUZpbGVUeXBlLmRlc2NyaXB0aW9uLmVxdWFscygiRFREIEZpbGVzIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfUFVCTElDKTsKLQkJCQkJCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTSk7Ci0JCQkJCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSSk7Ci0JCQkJCQkJfQotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQl9Ci0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoa2V5VHlwZUNvbWJvLmdldEl0ZW1Db3VudCgpID09IDApIHsKLQkJCQlrZXlUeXBlQ29tYm8uYWRkKFhNTENhdGFsb2dNZXNzYWdlcy4KLQkJCQkJCVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUMpOwotCQkJCWtleVR5cGVDb21iby5hZGQoWE1MQ2F0YWxvZ01lc3NhZ2VzLgotCQkJCQkJVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTSk7Ci0JCQkJa2V5VHlwZUNvbWJvLmFkZChYTUxDYXRhbG9nTWVzc2FnZXMuCi0JCQkJCQlVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkkpOwotCQkJfQotCQkKLQkJCXN3aXRjaCAodHlwZSkgewotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyA6Ci0JCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMCk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTSA6Ci0JCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1VSSTogLy8gaGFuZGxlIFhNTCBTY2hlbWEsIHdoZXJlIG5hbWVzcGFjZSBuYW1lIGlzIG1hcHBlZCB0byBVUkkgc2l0dWF0aW9uCi0JCQkJCWlmICgic2NoZW1hIi5lcXVhbHMoa2V5VHlwZUNvbWJvLmdldERhdGEoImtleVR5cGUiKSkpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQlrZXlUeXBlQ29tYm8uc2VsZWN0KDApOyAvLyBuYW1lc3BhY2UgbmFtZSBhcyBVUkkga2V5IHR5cGUKLQkJCQkJfQotCQkJCQllbHNlIHsKLQkJCQkJCWtleVR5cGVDb21iby5zZWxlY3QoMik7IC8vIFVSSSBrZXkgdHlwZQotCQkJCQl9Ci0JCQkJCWJyZWFrOwotCQkJCWRlZmF1bHQgOgotCQkJCQlpZiAoa2V5VHlwZUNvbWJvLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJCQkJa2V5VHlwZUNvbWJvLnNlbGVjdCgwKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCX0KLQotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2ViQWRkcmVzc1dpZGdldHMoaW50IGtleVR5cGUpIHsKLQkJCWJvb2xlYW4gaXNQdWJsaWNLZXlUeXBlID0gKGtleVR5cGUgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyk7Ci0JCQljaGVja2JveEJ1dHRvbi5zZXRFbmFibGVkKGlzUHVibGljS2V5VHlwZSk7Ci0JCQl3ZWJBZGRyZXNzRmllbGQuc2V0RW5hYmxlZChpc1B1YmxpY0tleVR5cGUgJiYgY2hlY2tib3hCdXR0b24uZ2V0U2VsZWN0aW9uKCkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0cyhXaWRnZXQgd2lkZ2V0KSB7Ci0JCQlpZiAod2lkZ2V0ICE9IGtleVR5cGVDb21ibykgewotCQkJCXVwZGF0ZUtleVR5cGVDb21ibyhnZXRLZXlUeXBlKCkpOwotCQkJfQotCQkJdXBkYXRlV2ViQWRkcmVzc1dpZGdldHMoZ2V0S2V5VHlwZSgpKTsKLQkJCWNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKGVycm9yTWVzc2FnZUxhYmVsKTsKLQkJCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQkJfQotCi0JfQotCi0JcHJvdGVjdGVkIGFic3RyYWN0IGNsYXNzIENhdGFsb2dFbGVtZW50UGFnZSB7Ci0KLQkJQ29udHJvbCBmQ29udHJvbDsKLQotCQlwdWJsaWMgQ2F0YWxvZ0VsZW1lbnRQYWdlKCkgewotCQkJc3VwZXIoKTsKLQotCQl9Ci0KLQkJcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQotCQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCkgewotCQkJcmV0dXJuIGZDb250cm9sOwotCQl9Ci0KLQkJcHVibGljIGFic3RyYWN0IElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCk7Ci0KLQkJcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZURhdGEoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZXh0ZW5kcyBTZWxlY3RTaW5nbGVGaWxlRGlhbG9nIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29tYm8gZmlsdGVyQ29udHJvbDsKLQotCQlwdWJsaWMgRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2coU2hlbGwgcGFyZW50U2hlbGwpIHsKLQkJCXN1cGVyKHBhcmVudFNoZWxsLCBudWxsLCB0cnVlKTsKLQkJCXNldEZpbHRlcnMobnVsbCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVBbmRPcGVuKCkgewotCQkJdGhpcy5jcmVhdGUoKTsKLQkJCWdldFNoZWxsKCkuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU0VMRUNUX0ZJTEUpOwotCQkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlvcGVuKCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVGaWx0ZXJDb250cm9sKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJbGFiZWwuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfU0VMRUNUX0ZJTEVfRklMVEVSX0NPTlRST0wpOwotCi0JCQlmaWx0ZXJDb250cm9sID0gbmV3IENvbWJvKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJCWZpbHRlckNvbnRyb2wuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWZpbHRlckNvbnRyb2wuc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfVEVYVF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTCk7Ci0KLQkJCWZpbHRlckNvbnRyb2wuYWRkKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gQ2F0YWxvZ0ZpbGVUeXBlUmVnaXN0cnlSZWFkZXIuZ2V0WE1MQ2F0YWxvZ0ZpbGVUeXBlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCVhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJCWlmIChmaWxlVHlwZS5kZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0JCQkJCWZpbHRlckNvbnRyb2wuYWRkKGZpbGVUeXBlLmRlc2NyaXB0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWZpbHRlckNvbnRyb2wuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBzZXRGaWx0ZXJzKFhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSkgewotCQkJaWYgKGZpbGVUeXBlID09IG51bGwpIHsKLQkJCQkvLyBjb21wdXRlIGFsbCB0aGUgc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9ucwotCQkJCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBDYXRhbG9nRmlsZVR5cGVSZWdpc3RyeVJlYWRlci5nZXRYTUxDYXRhbG9nRmlsZVR5cGVzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCVhNTENhdGFsb2dGaWxlVHlwZSB0aGVGaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJCQlpZiAodGhlRmlsZVR5cGUuZXh0ZW5zaW9ucyAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0LmFkZEFsbCh0aGVGaWxlVHlwZS5leHRlbnNpb25zKTsKLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBBbnkgZmlsZXMgYXJlIG5vdyBzdXBwb3J0ZWQgd2l0aCBSZXNvdXJjZSBVUkkKLQkJCQkvLyBzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRGaWx0ZXJFeHRlbnNpb25zKGNyZWF0ZVN0cmluZ0FycmF5KGxpc3QpKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmaWxlVHlwZS5leHRlbnNpb25zICE9IG51bGwpIHsKLQkJCQkJc2VsZWN0U2luZ2xlRmlsZVZpZXcuc2V0RmlsdGVyRXh0ZW5zaW9ucyhjcmVhdGVTdHJpbmdBcnJheShmaWxlVHlwZS5leHRlbnNpb25zKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCVN0cmluZyB0ZXh0ID0gZmlsdGVyQ29udHJvbC5nZXRUZXh0KCk7Ci0JCQlYTUxDYXRhbG9nRmlsZVR5cGUgZmlsZVR5cGUgPSBnZXRNYXRjaGluZ0ZpbGVUeXBlKHRleHQpOwotCQkJc2V0RmlsdGVycyhmaWxlVHlwZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgTmV4dENhdGFsb2dQYWdlIGV4dGVuZHMgQ2F0YWxvZ0VsZW1lbnRQYWdlIHsKLQkJcHJvdGVjdGVkIEJ1dHRvbiBicm93c2VCdXR0b247Ci0KLQkJcHJvdGVjdGVkIFRleHQgY2F0YWxvZ0xvY2F0aW9uRmllbGQ7Ci0KLQkJcHJvdGVjdGVkIElOZXh0Q2F0YWxvZyBuZXh0Q2F0YWxvZzsKLQotCQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0KLQkJcHJvdGVjdGVkIHZvaWQgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCWVycm9yTWVzc2FnZSA9IG51bGw7Ci0KLQkJCWlmIChlcnJvck1lc3NhZ2UgPT0gbnVsbCkgewotCQkJCVN0cmluZyBmaWxlTmFtZSA9IGNhdGFsb2dMb2NhdGlvbkZpZWxkLmdldFRleHQoKTsKLQkJCQlpZiAoZmlsZU5hbWUudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQlpZiAoZmlsZU5hbWUuaW5kZXhPZigiLi4iKSAhPSAtMSB8fCBmaWxlTmFtZS5pbmRleE9mKCIuLyIpICE9IC0xIHx8IGZpbGVOYW1lLmluZGV4T2YoIi8uIikgIT0gLTEgfHwgZmlsZU5hbWUuaW5kZXhPZigiLlxcIikgIT0gLTEgfHwgZmlsZU5hbWUuaW5kZXhPZigiXFwuIikgIT0gLTEpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JCAvLyROT04tTkxTLTUkCi0JCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTVVTVF9OT1RfSEFWRV9ET1RTOwotCQkJCQl9Ci0KLQkJCQkJU3RyaW5nIHVyaSA9IGZpbGVOYW1lOwotCQkJCQlpZiAoIVVSSUhlbHBlci5oYXNQcm90b2NvbCh1cmkpKSB7Ci0JCQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZSh1cmkpID8gVVJJSGVscGVyLnByZXBlbmRGaWxlUHJvdG9jb2wodXJpKSA6IFVSSUhlbHBlci5wcmVwZW5kUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSk7Ci0JCQkJCX0KLQotCQkJCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwgJiYgIVVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgZmFsc2UpKSB7Ci0JCQkJCQllcnJvck1lc3NhZ2UgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0NPTE9OICsgZmlsZU5hbWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgYW4gZXJyb3IgdGhhdCBpcyBub3QgYWN0dWFsbHkgCi0JCQkJCS8vIHJlcG9ydGVkIC4uLiBPSyBpcyBqdXN0IGRpc2FibGVkCi0JCQkJCWVycm9yTWVzc2FnZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJfQotCQkJfQotCi0JCX0KLQotCQlwdWJsaWMgQ29udHJvbCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCWZDb250cm9sID0gY3JlYXRlTmV4dENhdGFsb2dQYW5lbChwYXJlbnQpOwotCQkJcmV0dXJuIGZDb250cm9sOwotCQl9Ci0KLQkJcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlTmV4dENhdGFsb2dQYW5lbChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCQkJdXBkYXRlV2lkZ2V0cyhlLndpZGdldCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0KLQkJCUNvbXBvc2l0ZSBncm91cCA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShnZCk7Ci0KLQkJCWxheW91dCA9IG5ldyBHcmlkTGF5b3V0KDIsIGZhbHNlKTsKLQkJCWdyb3VwLnNldExheW91dChsYXlvdXQpOwotCi0JCQlMYWJlbCByZXNvdXJjZUxvY2F0aW9uTGFiZWwgPSBuZXcgTGFiZWwoZ3JvdXAsIFNXVC5OT05FKTsKLQkJCXJlc291cmNlTG9jYXRpb25MYWJlbC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9DQVRBTE9HX1VSSV9DT0xPTik7Ci0KLQkJCS8vIGZpbGxlcgotCQkJbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0KLQkJCWNhdGFsb2dMb2NhdGlvbkZpZWxkID0gbmV3IFRleHQoZ3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJCWNhdGFsb2dMb2NhdGlvbkZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJY2F0YWxvZ0xvY2F0aW9uRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZ2V0TmV4dENhdGFsb2coKS5nZXRDYXRhbG9nTG9jYXRpb24oKSkpOwotCQkJLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKHJlc291cmNlTG9jYXRpb25GaWVsZCwKLQkJCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfRU5UUllfVVJJKTsKLQkJCWNhdGFsb2dMb2NhdGlvbkZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCQkJYnJvd3NlQnV0dG9uID0gY3JlYXRlQnJvd3NlQnV0dG9uKGdyb3VwKTsKLQkJCWJyb3dzZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgRHJvcERvd25TZWxlY3Rpb25MaXN0ZW5lcihjYXRhbG9nTG9jYXRpb25GaWVsZCkpOwotCi0JCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0JCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXVwZGF0ZVdpZGdldHMobnVsbCk7Ci0JCQlyZXR1cm4gY29tcG9zaXRlOwotCQl9Ci0KLQkJcHVibGljIElDYXRhbG9nRWxlbWVudCBnZXREYXRhKCkgewotCQkJcmV0dXJuIGdldE5leHRDYXRhbG9nKCk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgSU5leHRDYXRhbG9nIGdldE5leHRDYXRhbG9nKCkgewotCQkJaWYgKG5leHRDYXRhbG9nID09IG51bGwpIHsKLQkJCQlpZiAoZkNhdGFsb2dFbGVtZW50ICE9IG51bGwgJiYgZkNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9ORVhUX0NBVEFMT0cpIHsKLQkJCQkJbmV4dENhdGFsb2cgPSAoSU5leHRDYXRhbG9nKSBmQ2F0YWxvZ0VsZW1lbnQ7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlpZiAoY2F0YWxvZyAhPSBudWxsKSB7Ci0JCQkJCQluZXh0Q2F0YWxvZyA9IChJTmV4dENhdGFsb2cpIGNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50LlRZUEVfTkVYVF9DQVRBTE9HKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBuZXh0Q2F0YWxvZzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNhdmVEYXRhKCkgewotCQkJU3RyaW5nIHVyaSA9IGNhdGFsb2dMb2NhdGlvbkZpZWxkLmdldFRleHQoKTsKLQkJCWlmICghVVJJSGVscGVyLmhhc1Byb3RvY29sKHVyaSkpIHsKLQkJCQl1cmkgPSBVUklIZWxwZXIuaXNBYnNvbHV0ZSh1cmkpID8gVVJJSGVscGVyLnByZXBlbmRGaWxlUHJvdG9jb2wodXJpKSA6IFVSSUhlbHBlci5wcmVwZW5kUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHVyaSk7Ci0JCQl9Ci0JCQlnZXROZXh0Q2F0YWxvZygpLnNldENhdGFsb2dMb2NhdGlvbihVUklIZWxwZXIuZW5zdXJlRmlsZVVSSVByb3RvY29sRm9ybWF0KHVyaSkpOwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0cyhXaWRnZXQgd2lkZ2V0KSB7Ci0JCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbChlcnJvck1lc3NhZ2VMYWJlbCk7Ci0JCQl1cGRhdGVPS0J1dHRvblN0YXRlKCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgY2xhc3MgVG9vbEJhckl0ZW1TZWxlY3Rpb25DaGFuZ2VMaXN0ZW5lciBpbXBsZW1lbnRzIFNlbGVjdGlvbkxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJT2JqZWN0IHNlbGVjdGlvbiA9IGUuZ2V0U291cmNlKCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgVG9vbEl0ZW0pIHsKLQkJCQlpZiAoIXNob3dQYWdlKChDYXRhbG9nRWxlbWVudFBhZ2UpICgoVG9vbEl0ZW0pIHNlbGVjdGlvbikuZ2V0RGF0YSgpKSkgewotCQkJCQkvLyBQYWdlIGZsaXBwaW5nIHdhc24ndCBzdWNjZXNzZnVsCi0JCQkJCS8vIGhhbmRsZUVycm9yKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZ1tdIGNyZWF0ZVN0cmluZ0FycmF5KExpc3QgbGlzdCkgewotCQlTdHJpbmdbXSBzdHJpbmdBcnJheSA9IG5ldyBTdHJpbmdbbGlzdC5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN0cmluZ0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlzdHJpbmdBcnJheVtpXSA9IChTdHJpbmcpIGxpc3QuZ2V0KGkpOwotCQl9Ci0JCXJldHVybiBzdHJpbmdBcnJheTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZW1vdmVMZWFkaW5nU2xhc2goU3RyaW5nIHVyaSkgewotCQkvLyByZW1vdmUgbGVhZGluZyBzbGFzaCBmcm9tIHRoZSB2YWx1ZSB0byBhdm9pZCB0aGUgd2hvbGUgbGVhZGluZwotCQkvLyBzbGFzaAotCQkvLyBhbWJpZ3VpdHkgcHJvYmxlbQotCQkvLyAgICAgICAKLQkJaWYgKHVyaSAhPSBudWxsKSB7Ci0JCQl3aGlsZSAodXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDEpOwotCQkJfQotCQl9Ci0JCXJldHVybiB1cmk7Ci0JfQotCi0JcHJvdGVjdGVkIElDYXRhbG9nIGNhdGFsb2c7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbGVtZW50IGZDYXRhbG9nRWxlbWVudDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQotCXByb3RlY3RlZCBQYWdlQm9vayBwYWdlQ29udGFpbmVyOwotCi0JcHJvdGVjdGVkIENhdGFsb2dFbGVtZW50UGFnZSBzZWxlY3RlZFBhZ2U7Ci0KLQkvLyBwcm90ZWN0ZWQgVHJlZVZpZXdlciB0cmVlVmlld2VyOwotCi0JcHJvdGVjdGVkIFRvb2xCYXIgdG9vbEJhcjsKLQkKLQlwcm90ZWN0ZWQgQ29sb3IgY29sb3I7Ci0KLQlwdWJsaWMgRWRpdENhdGFsb2dFbnRyeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUNhdGFsb2cgYUNhdGFsb2cpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmNhdGFsb2cgPSBhQ2F0YWxvZzsKLQl9Ci0KLQlwdWJsaWMgRWRpdENhdGFsb2dFbnRyeURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSUNhdGFsb2dFbGVtZW50IGNhdGFsb2dFbGVtZW50KSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5mQ2F0YWxvZ0VsZW1lbnQgPSBjYXRhbG9nRWxlbWVudDsKLQkJLy8gVE9ETyBFQjogZml4IGhpcwotCQkvLyBlbnRyeS5zZXRVUkkoVVJJSGVscGVyLnJlbW92ZVBsYXRmb3JtUmVzb3VyY2VQcm90b2NvbChlbnRyeS5nZXRVUkkoKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlzZWxlY3RlZFBhZ2Uuc2F2ZURhdGEoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQkJdXBkYXRlT0tCdXR0b25TdGF0ZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNhdGFsb2dFbnRyeUJ1dHRvbigpIHsKLQkJQ2F0YWxvZ0VsZW1lbnRQYWdlIHBhZ2UgPSBuZXcgQ2F0YWxvZ0VudHJ5UGFnZSgpOwotCQlwYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0JCVRvb2xJdGVtIHRvb2xJdGVtID0gbmV3IFRvb2xJdGVtKHRvb2xCYXIsIFNXVC5QVVNIKTsKLQkJdG9vbEl0ZW0uc2V0SW1hZ2UoY2F0YWxvZ0VudHJ5VG9vbEJhckltYWdlKTsKLQkJdG9vbEl0ZW0uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuRWRpdENhdGFsb2dFbnRyeURpYWxvZ19jYXRhbG9nRW50cnlMYWJlbCk7Ci0JCXRvb2xJdGVtLnNldERhdGEocGFnZSk7Ci0JCXRvb2xJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBUb29sQmFySXRlbVNlbGVjdGlvbkNoYW5nZUxpc3RlbmVyKCkpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYUNvbXBvc2l0ZSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJY29sb3IgPSBuZXcgQ29sb3IoZGlhbG9nQXJlYUNvbXBvc2l0ZS5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWRpYWxvZ0FyZWFDb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWdkLndpZHRoSGludCA9IDUwMDsKLQkJZ2QuaGVpZ2h0SGludCA9IDI1MDsKLQkJZGlhbG9nQXJlYUNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJY3JlYXRlTWFpbkNvbXBvbmVudChkaWFsb2dBcmVhQ29tcG9zaXRlKTsKLQkJcmV0dXJuIHRoaXMuZGlhbG9nQXJlYTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBjbG9zZSgpIHsKLQkJaWYgKGNvbG9yICE9IG51bGwpIHsKLQkJCWNvbG9yLmRpc3Bvc2UoKTsKLQkJfQotCQlyZXR1cm4gc3VwZXIuY2xvc2UoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZU1haW5Db21wb25lbnQoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlpZiAoZkNhdGFsb2dFbGVtZW50ICE9IG51bGwpIC8vICJlZGl0IiBhY3Rpb24KLQkJewotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZTEgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQkJY29tcG9zaXRlMS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJY29tcG9zaXRlMS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkJcGFnZUNvbnRhaW5lciA9IG5ldyBQYWdlQm9vayhjb21wb3NpdGUxLCBTV1QuTk9ORSk7Ci0JCQlwYWdlQ29udGFpbmVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlpZiAoZkNhdGFsb2dFbGVtZW50LmdldFR5cGUoKSA9PSBJQ2F0YWxvZ0VsZW1lbnQuVFlQRV9FTlRSWSkgewotCQkJCUNhdGFsb2dFbGVtZW50UGFnZSBlbnRyeVBhZ2UgPSBuZXcgQ2F0YWxvZ0VudHJ5UGFnZSgpOwotCQkJCWVudHJ5UGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQkJCXNob3dQYWdlKGVudHJ5UGFnZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChmQ2F0YWxvZ0VsZW1lbnQuZ2V0VHlwZSgpID09IElDYXRhbG9nRWxlbWVudC5UWVBFX05FWFRfQ0FUQUxPRykgewotCQkJCUNhdGFsb2dFbGVtZW50UGFnZSBuZXh0Q2F0YWxvZ1BhZ2UgPSBuZXcgTmV4dENhdGFsb2dQYWdlKCk7Ci0JCQkJbmV4dENhdGFsb2dQYWdlLmNyZWF0ZUNvbnRyb2wocGFnZUNvbnRhaW5lcik7Ci0JCQkJc2hvd1BhZ2UobmV4dENhdGFsb2dQYWdlKTsKLQkJCX0KLQotCQkJcmV0dXJuIGNvbXBvc2l0ZTE7Ci0JCX0KLQkJcmV0dXJuIGNyZWF0ZU1haW5Db21wb25lbnRXaXRoVG9vbGJhcihjb21wb3NpdGUpOwotCQkKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIGNyZWF0ZU1haW5Db21wb25lbnRXaXRoVG9vbGJhcihDb21wb3NpdGUgY29tcG9zaXRlKSB7Ci0KLQkJRm9ybUxheW91dCBmb3JtTGF5b3V0ID0gbmV3IEZvcm1MYXlvdXQoKTsKLQkJZm9ybUxheW91dC5tYXJnaW5IZWlnaHQgPSA1OwotCQlmb3JtTGF5b3V0Lm1hcmdpbldpZHRoID0gNTsKLQkJY29tcG9zaXRlLnNldExheW91dChmb3JtTGF5b3V0KTsKLQotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJRm9ybURhdGEgZGF0YSA9IG5ldyBGb3JtRGF0YSgpOwotCQlkYXRhLnRvcCA9IG5ldyBGb3JtQXR0YWNobWVudCgwLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJdG9vbEJhciA9IG5ldyBUb29sQmFyKGNvbXBvc2l0ZSwgU1dULkJPUkRFUiB8IFNXVC5GTEFUIHwgU1dULlZFUlRJQ0FMKTsKLQotCQlkYXRhID0gbmV3IEZvcm1EYXRhKCk7Ci0JCWRhdGEudG9wID0gbmV3IEZvcm1BdHRhY2htZW50KGxhYmVsLCAwKTsKLQkJZGF0YS5sZWZ0ID0gbmV3IEZvcm1BdHRhY2htZW50KDAsIDApOwotCQlkYXRhLmJvdHRvbSA9IG5ldyBGb3JtQXR0YWNobWVudCgxMDAsIDApOwotCQkvLyBkYXRhLmhlaWdodCA9IDI1MDsKLQkJLy8gZGF0YS53aWR0aCA9IDUwOwotCQl0b29sQmFyLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZTEgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULkJPUkRFUik7Ci0JCWRhdGEgPSBuZXcgRm9ybURhdGEoKTsKLQkJZGF0YS50b3AgPSBuZXcgRm9ybUF0dGFjaG1lbnQobGFiZWwsIDApOwotCQlkYXRhLmxlZnQgPSBuZXcgRm9ybUF0dGFjaG1lbnQodG9vbEJhciwgMCwgU1dULkRFRkFVTFQpOwotCQlkYXRhLnJpZ2h0ID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWRhdGEuYm90dG9tID0gbmV3IEZvcm1BdHRhY2htZW50KDEwMCwgMCk7Ci0JCWNvbXBvc2l0ZTEuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlMS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQkvLyBjcmVhdGVQYWdlQm9va1BhbmVsKGNvbXBvc2l0ZTEpOwotCQlwYWdlQ29udGFpbmVyID0gbmV3IFBhZ2VCb29rKGNvbXBvc2l0ZTEsIFNXVC5OT05FKTsKLQkJcGFnZUNvbnRhaW5lci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQkvLyBhZGQgcGFnZXMgZm9yIGVhY2ggdHlwZSBvZiBjYXRhbG9nIGVsZW1lbnQKLQkJY3JlYXRlQ2F0YWxvZ0VudHJ5QnV0dG9uKCk7Ci0JCWNyZWF0ZU5leHRDYXRhbG9nQnV0dG9uKCk7Ci0JCWlmICh0b29sQmFyLmdldEl0ZW1Db3VudCgpID4gMCkgewotCQkJVG9vbEl0ZW0gaXRlbSA9IHRvb2xCYXIuZ2V0SXRlbSgwKTsKLQkJCXNob3dQYWdlKChDYXRhbG9nRWxlbWVudFBhZ2UpIChpdGVtLmdldERhdGEoKSkpOwotCQl9Ci0JCXJldHVybiBjb21wb3NpdGUxOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZU5leHRDYXRhbG9nQnV0dG9uKCkgewotCQlDYXRhbG9nRWxlbWVudFBhZ2UgcGFnZSA9IG5ldyBOZXh0Q2F0YWxvZ1BhZ2UoKTsKLQkJcGFnZS5jcmVhdGVDb250cm9sKHBhZ2VDb250YWluZXIpOwotCQlUb29sSXRlbSB0b29sSXRlbSA9IG5ldyBUb29sSXRlbSh0b29sQmFyLCBTV1QuUFVTSCk7Ci0JCXRvb2xJdGVtLnNldEltYWdlKG5leHRDYXRhbG9nVG9vbEJhckltYWdlKTsKLQkJdG9vbEl0ZW0uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuRWRpdENhdGFsb2dFbnRyeURpYWxvZ19uZXh0Q2F0YWxvZ0xhYmVsKTsKLQkJdG9vbEl0ZW0uc2V0RGF0YShwYWdlKTsKLQkJdG9vbEl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFRvb2xCYXJJdGVtU2VsZWN0aW9uQ2hhbmdlTGlzdGVuZXIoKSk7Ci0KLQl9Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbGVtZW50IGdldENhdGFsb2dFbGVtZW50KCkgewotCQlyZXR1cm4gZkNhdGFsb2dFbGVtZW50OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ0ZpbGVUeXBlIGdldE1hdGNoaW5nRmlsZVR5cGUoU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0JCVhNTENhdGFsb2dGaWxlVHlwZSBmaWxlVHlwZSA9IG51bGw7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IENhdGFsb2dGaWxlVHlwZVJlZ2lzdHJ5UmVhZGVyLmdldFhNTENhdGFsb2dGaWxlVHlwZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVhNTENhdGFsb2dGaWxlVHlwZSB0aGVGaWxlVHlwZSA9IChYTUxDYXRhbG9nRmlsZVR5cGUpIGkubmV4dCgpOwotCQkJaWYgKHRoZUZpbGVUeXBlLmRlc2NyaXB0aW9uICE9IG51bGwgJiYgdGhlRmlsZVR5cGUuZGVzY3JpcHRpb24uZXF1YWxzKGRlc2NyaXB0aW9uKSkgewotCQkJCWZpbGVUeXBlID0gdGhlRmlsZVR5cGU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZpbGVUeXBlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIHNob3dQYWdlKENhdGFsb2dFbGVtZW50UGFnZSBwYWdlKSB7Ci0JCWlmIChwYWdlQ29udGFpbmVyLmlzRGlzcG9zZWQoKSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JCXNlbGVjdGVkUGFnZSA9IHBhZ2U7Ci0JCXBhZ2VDb250YWluZXIuc2V0VmlzaWJsZSh0cnVlKTsKLQkJcGFnZUNvbnRhaW5lci5zaG93UGFnZShzZWxlY3RlZFBhZ2UuZ2V0Q29udHJvbCgpKTsKLQkJZkNhdGFsb2dFbGVtZW50ID0gc2VsZWN0ZWRQYWdlLmdldERhdGEoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlTGFiZWwoTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWwpIHsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9LQnV0dG9uU3RhdGUoKSB7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQlva0J1dHRvbi5zZXRFbmFibGVkKGVycm9yTWVzc2FnZSA9PSBudWxsKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gY3JlYXRlQnJvd3NlQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJQnV0dG9uIGJyb3dzZUJ1dHRvbiA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuRkxBVCk7Ci0JCS8vIGJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy4KLQkJLy8gVUlfQlVUVE9OX0JST1dTRSIpKTsKLQkJYnJvd3NlQnV0dG9uLnNldEltYWdlKGJvcndzZUltYWdlKTsKLQkJUmVjdGFuZ2xlIHIgPSBib3J3c2VJbWFnZS5nZXRCb3VuZHMoKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoKTsKLQkJaW50IElNQUdFX1dJRFRIX01BUkdJTiA9IDY7Ci0JCWludCBJTUFHRV9IRUlHSFRfTUFSR0lOID0gNjsKLQkJZ2QuaGVpZ2h0SGludCA9IHIuaGVpZ2h0ICsgSU1BR0VfSEVJR0hUX01BUkdJTjsKLQkJZ2Qud2lkdGhIaW50ID0gci53aWR0aCArIElNQUdFX1dJRFRIX01BUkdJTjsKLQkJYnJvd3NlQnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotCi0JCXJldHVybiBicm93c2VCdXR0b247Ci0KLQl9Ci0KLQljbGFzcyBEcm9wRG93blNlbGVjdGlvbkxpc3RlbmVyIGV4dGVuZHMgU2VsZWN0aW9uQWRhcHRlciB7Ci0JCXByaXZhdGUgTWVudSBtZW51ID0gbnVsbDsKLQkJcHJpdmF0ZSBDb250cm9sIGNvbnRyb2w7Ci0KLQkJcHVibGljIERyb3BEb3duU2VsZWN0aW9uTGlzdGVuZXIoQ29udHJvbCBhQ29udHJvbCkgewotCQkJc3VwZXIoKTsKLQkJCXRoaXMuY29udHJvbCA9IGFDb250cm9sOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCS8vIENyZWF0ZSB0aGUgbWVudSBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBjcmVhdGVkCi0JCQlpZiAobWVudSA9PSBudWxsKSB7Ci0JCQkJLy8gTGF6eSBjcmVhdGUgdGhlIG1lbnUuCi0JCQkJbWVudSA9IG5ldyBNZW51KGdldFNoZWxsKCkpOwotCQkJCU1lbnVJdGVtIG1lbnVJdGVtID0gbmV3IE1lbnVJdGVtKG1lbnUsIFNXVC5OT05FKTsKLQkJCQltZW51SXRlbS5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9CVVRUT05fTUVOVV9CUk9XU0VfV09SS1NQQUNFKTsKLQkJCQkvKgotCQkJCSAqIEFkZCBhIG1lbnUgc2VsZWN0aW9uIGxpc3RlbmVyIHNvIHRoYXQgdGhlIG1lbnUgaXMgaGlkZGVuCi0JCQkJICogd2hlbiB0aGUgdXNlciBzZWxlY3RzIGFuIGl0ZW0gZnJvbSB0aGUgZHJvcCBkb3duIG1lbnUuCi0JCQkJICovCi0JCQkJbWVudUl0ZW0uYWRkU2VsZWN0aW9uTGlzdGVuZXIobmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJCXNldE1lbnVWaXNpYmxlKGZhbHNlKTsKLQkJCQkJCWludm9rZVdvcmtzcGFjZUZpbGVTZWxlY3Rpb25EaWFsb2coKTsKLQkJCQkJfQotCQkJCX0pOwotCi0JCQkJbWVudUl0ZW0gPSBuZXcgTWVudUl0ZW0obWVudSwgU1dULk5PTkUpOwotCQkJCW1lbnVJdGVtLnNldFRleHQoWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0JVVFRPTl9NRU5VX0JST1dTRV9GSUxFX1NZU1RFTSk7Ci0JCQkJLyoKLQkJCQkgKiBBZGQgYSBtZW51IHNlbGVjdGlvbiBsaXN0ZW5lciBzbyB0aGF0IHRoZSBtZW51IGlzIGhpZGRlbgotCQkJCSAqIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBhbiBpdGVtIGZyb20gdGhlIGRyb3AgZG93biBtZW51LgotCQkJCSAqLwotCQkJCW1lbnVJdGVtLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCQlzZXRNZW51VmlzaWJsZShmYWxzZSk7Ci0JCQkJCQlpbnZva2VGaWxlU2VsZWN0aW9uRGlhbG9nKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQotCQkJfQotCi0JCQkvLyBQb3NpdGlvbiB0aGUgbWVudSBiZWxvdyBhbmQgdmVydGljYWxseSBhbGlnbmVkIHdpdGggdGhlIHRoZQotCQkJLy8gZHJvcCBkb3duIHRvb2wgYnV0dG9uLgotCQkJQnV0dG9uIGJ1dHRvbiA9IChCdXR0b24pIGV2ZW50LndpZGdldDsKLQotCQkJLy8gc2V0IGxvY2F0aW9uCi0JCQlQb2ludCBwdEJyb3dzZSA9IGJ1dHRvbi5nZXRMb2NhdGlvbigpOwotCQkJUmVjdGFuZ2xlIHJjQnJvd3NlID0gYnV0dG9uLmdldEJvdW5kcygpOwotCQkJcHRCcm93c2UueSArPSByY0Jyb3dzZS5oZWlnaHQ7Ci0JCQlwdEJyb3dzZSA9IGJ1dHRvbi5nZXRQYXJlbnQoKS50b0Rpc3BsYXkocHRCcm93c2UpOwotCQkJbWVudS5zZXRMb2NhdGlvbihwdEJyb3dzZS54LCBwdEJyb3dzZS55KTsKLQotCQkJc2V0TWVudVZpc2libGUodHJ1ZSk7Ci0KLQkJfQotCi0JCXZvaWQgc2V0TWVudVZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCQltZW51LnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQkvLyB0aGlzLnZpc2libGUgPSB2aXNpYmxlOwotCQl9Ci0KLQkJdm9pZCBpbnZva2VXb3Jrc3BhY2VGaWxlU2VsZWN0aW9uRGlhbG9nKCkgewotCQkJRmlsdGVyYWJsZVNlbGVjdFNpbmdsZUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbHRlcmFibGVTZWxlY3RTaW5nbGVGaWxlRGlhbG9nKGdldFNoZWxsKCkpOwotCQkJZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLQotCQkJSUZpbGUgZmlsZSA9IGRpYWxvZy5nZXRGaWxlKCk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJLy8gcmVtb3ZlIGxlYWRpbmcgc2xhc2ggZnJvbSB0aGUgdmFsdWUgdG8gYXZvaWQgdGhlCi0JCQkJLy8gd2hvbGUgbGVhZGluZyBzbGFzaCBhbWJpZ3VpdHkgcHJvYmxlbQotCQkJCS8vICAgICAgICAgICAgICAgICAgICAKLQkJCQlTdHJpbmcgdXJpID0gZmlsZS5nZXRGdWxsUGF0aCgpLnRvU3RyaW5nKCk7Ci0JCQkJd2hpbGUgKHVyaS5zdGFydHNXaXRoKCIvIikgfHwgdXJpLnN0YXJ0c1dpdGgoIlxcIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCXVyaSA9IHVyaS5zdWJzdHJpbmcoMSk7Ci0JCQkJfQotCQkJCWlmIChjb250cm9sIGluc3RhbmNlb2YgVGV4dCkgewotCQkJCQkoKFRleHQpIGNvbnRyb2wpLnNldFRleHQodXJpKTsKLQkJCQl9Ci0KLQkJCX0KLQkJfQotCi0JCXZvaWQgaW52b2tlRmlsZVNlbGVjdGlvbkRpYWxvZygpIHsKLQkJCUZpbGVEaWFsb2cgZGlhbG9nID0gbmV3IEZpbGVEaWFsb2coZ2V0U2hlbGwoKSwgU1dULlNJTkdMRSk7Ci0JCQlTdHJpbmcgZmlsZSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQlpZiAoY29udHJvbCBpbnN0YW5jZW9mIFRleHQgJiYgZmlsZSAhPSBudWxsKSB7Ci0JCQkJKChUZXh0KSBjb250cm9sKS5zZXRUZXh0KFVSSUhlbHBlci5lbnN1cmVGaWxlVVJJUHJvdG9jb2xGb3JtYXQoVVJJLmNyZWF0ZUZpbGVVUkkoZmlsZSkudG9TdHJpbmcoKSkpOwotCQkJfQotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VsZW1lbnROb2RlUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9FbGVtZW50Tm9kZVBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFlODkxYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0VsZW1lbnROb2RlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VsZW1lbnQ7Ci0KLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEVsZW1lbnROb2RlUGFnZSB7Ci0JCi0JQ29udHJvbCBmQ29udHJvbDsKLQkKLQlwdWJsaWMgRWxlbWVudE5vZGVQYWdlKCkgewotCQlzdXBlcigpOwotCQkKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IENvbnRyb2wgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KTsKLQkKLQlwdWJsaWMgQ29udHJvbCBnZXRDb250cm9sKCl7Ci0JCXJldHVybiBmQ29udHJvbDsKLQl9Ci0JCi0JcHVibGljIGFic3RyYWN0IHZvaWQgc2F2ZURhdGEoKTsKLQkKLQlwdWJsaWMgYWJzdHJhY3QgSUNhdGFsb2dFbGVtZW50IGdldERhdGEoKTsKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvSW1hZ2VGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL0ltYWdlRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzQ4NjU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvSW1hZ2VGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2VEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgSW1hZ2VGYWN0b3J5Ci17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9QX0xFRlQgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUT1BfUklHSFQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT1RUT01fTEVGVCA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJPVFRPTV9SSUdIVCA9IDQ7ICAgICAKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludFtdW10gT1ZFUkxBWV9DT09SRElOQVRFID0ge3swLDB9LHswLDJ9LHsyLDB9LHsyLDJ9fTsKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgSW1hZ2VGYWN0b3J5IElOU1RBTkNFID0gbmV3IEltYWdlRmFjdG9yeSgpOwotCi0gIHByb3RlY3RlZCBIYXNodGFibGUgY29tcG9zaXRlSW1hZ2VUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQotICBwdWJsaWMgSW1hZ2VGYWN0b3J5KCkKLSAgewotCSAgc3VwZXIoKTsKLSAgfQotICAKLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIGljb25OYW1lKQotCXsKLQkgIEltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRJbWFnZVJlZ2lzdHJ5KCk7Ci0gICAgCi0JICBpZiAoaW1hZ2VSZWdpc3RyeS5nZXQoaWNvbk5hbWUpICE9IG51bGwpCi0JICB7Ci0JCXJldHVybiBpbWFnZVJlZ2lzdHJ5LmdldChpY29uTmFtZSk7Ci0JICB9Ci0JICBlbHNlCi0JICB7Ci0JCWltYWdlUmVnaXN0cnkucHV0KGljb25OYW1lLCBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbUZpbGUoZ2V0Q2xhc3MoKSwgaWNvbk5hbWUpKTsKLQkJcmV0dXJuIGltYWdlUmVnaXN0cnkuZ2V0KGljb25OYW1lKTsKLQkgIH0KLQl9Ci0KLSAgcHVibGljIEltYWdlIGNyZWF0ZUNvbXBvc2l0ZUltYWdlKEltYWdlIGJhc2UsIEltYWdlIG92ZXJsYXksIGludCBvdmVybGF5UG9zaXRpb24pCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICBTdHJpbmcga2V5ID0gYmFzZSArICIqIiArIG92ZXJsYXkgKyAiKiIgKyBvdmVybGF5UG9zaXRpb247IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgIEltYWdlIHJlc3VsdCA9IChJbWFnZSljb21wb3NpdGVJbWFnZVRhYmxlLmdldChrZXkpOwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBJbWFnZURlc2NyaXB0b3Igb3ZlcmxheXNbXVtdID0gbmV3IEltYWdlRGVzY3JpcHRvclszXVszXTsgCi0gICAgICBpbnRbXSBjb29yZCA9IE9WRVJMQVlfQ09PUkRJTkFURVtvdmVybGF5UG9zaXRpb25dOwotICAgICAgb3ZlcmxheXNbY29vcmRbMV1dW2Nvb3JkWzBdXSA9IG5ldyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKG92ZXJsYXkpOwotICAgICAgT3ZlcmxheUljb24gaWNvbiA9IG5ldyBPdmVybGF5SWNvbihuZXcgSW1hZ2VCYXNlZEltYWdlRGVzY3JpcHRvcihiYXNlKSwgb3ZlcmxheXMsIG5ldyBQb2ludCgxNiwgMTYpKTsKLSAgICAgIHJlc3VsdCA9IGljb24uY3JlYXRlSW1hZ2UoKTsKLSAgICAgIGNvbXBvc2l0ZUltYWdlVGFibGUucHV0KGtleSwgcmVzdWx0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi0KLQotICBwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3JXcmFwcGVyKEltYWdlIGltYWdlKQotICB7Ci0gICAgcmV0dXJuIG5ldyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKGltYWdlKTsKLSAgfQotCi0gIC8qKgotICAgKiBBbiBPdmVybGF5SWNvbiBjb25zaXN0cyBvZiBhIG1haW4gaWNvbiBhbmQgc2V2ZXJhbCBhZG9ybm1lbnRzLgotICAgKi8KLSAgIGNsYXNzIE92ZXJsYXlJY29uIGV4dGVuZHMgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yIHsKLQotICAgICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dJRFRIID0gMjI7Ci0KLSAgICAgIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IRUlHSFQgPSAxNjsKLQotICAgICAgcHJpdmF0ZSBQb2ludCBmU2l6ZSA9IG51bGw7Ci0KLSAgICAgIHByaXZhdGUgSW1hZ2VEZXNjcmlwdG9yIGZCYXNlOwotCi0gICAgICBwcml2YXRlIEltYWdlRGVzY3JpcHRvciBmT3ZlcmxheXNbXVtdOwotCi0gICAgICBwdWJsaWMgT3ZlcmxheUljb24oSW1hZ2VEZXNjcmlwdG9yIGJhc2UsIEltYWdlRGVzY3JpcHRvcltdW10gb3ZlcmxheXMsCi0gICAgICAgICAgICAgIFBvaW50IHNpemUpIHsKLSAgICAgICAgICBmQmFzZSA9IGJhc2U7Ci0gICAgICAgICAgZk92ZXJsYXlzID0gb3ZlcmxheXM7Ci0gICAgICAgICAgZlNpemUgPSBzaXplOwotICAgICAgfQotCi0gICAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3Qm90dG9tTGVmdChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotICAgICAgICAgIGlmIChvdmVybGF5cyA9PSBudWxsKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLSAgICAgICAgICBpbnQgeCA9IDA7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgICAgICAgICAgaWYgKGkgPCBsZW5ndGggJiYgb3ZlcmxheXNbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgSW1hZ2VEYXRhIGlkID0gb3ZlcmxheXNbaV0uZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgICAgICAgICAgICAgICBkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgIHggKz0gaWQud2lkdGg7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCB2b2lkIGRyYXdCb3R0b21SaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotICAgICAgICAgIGlmIChvdmVybGF5cyA9PSBudWxsKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLSAgICAgICAgICBpbnQgeCA9IGdldFNpemUoKS54OwotICAgICAgICAgIGZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgICAgICAgICAgIHggLT0gaWQud2lkdGg7Ci0gICAgICAgICAgICAgICAgICBkcmF3SW1hZ2UoaWQsIHgsIGdldFNpemUoKS55IC0gaWQuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBAc2VlIENvbXBvc2l0ZUltYWdlRGVzY3JpcHRvciNkcmF3Q29tcG9zaXRlSW1hZ2UoaW50LCBpbnQpCi0gICAgICAgKi8KLSAgICAgIHByb3RlY3RlZCB2b2lkIGRyYXdDb21wb3NpdGVJbWFnZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICBJbWFnZURhdGEgYmc7Ci0gICAgICAgICAgaWYgKGZCYXNlID09IG51bGwgfHwgKGJnID0gZkJhc2UuZ2V0SW1hZ2VEYXRhKCkpID09IG51bGwpCi0gICAgICAgICAgICAgIGJnID0gREVGQVVMVF9JTUFHRV9EQVRBOwotICAgICAgICAgIGRyYXdJbWFnZShiZywgMCwgMCk7Ci0KLSAgICAgICAgICBpZiAoZk92ZXJsYXlzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgaWYgKGZPdmVybGF5cy5sZW5ndGggPiAwKQotICAgICAgICAgICAgICAgICAgZHJhd1RvcFJpZ2h0KGZPdmVybGF5c1swXSk7Ci0KLSAgICAgICAgICAgICAgaWYgKGZPdmVybGF5cy5sZW5ndGggPiAxKQotICAgICAgICAgICAgICAgICAgZHJhd0JvdHRvbVJpZ2h0KGZPdmVybGF5c1sxXSk7Ci0KLSAgICAgICAgICAgICAgaWYgKGZPdmVybGF5cy5sZW5ndGggPiAyKQotICAgICAgICAgICAgICAgICAgZHJhd0JvdHRvbUxlZnQoZk92ZXJsYXlzWzJdKTsKLQotICAgICAgICAgICAgICBpZiAoZk92ZXJsYXlzLmxlbmd0aCA+IDMpCi0gICAgICAgICAgICAgICAgICBkcmF3VG9wTGVmdChmT3ZlcmxheXNbM10pOwotICAgICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIHZvaWQgZHJhd1RvcExlZnQoSW1hZ2VEZXNjcmlwdG9yW10gb3ZlcmxheXMpIHsKLSAgICAgICAgICBpZiAob3ZlcmxheXMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIGludCBsZW5ndGggPSBvdmVybGF5cy5sZW5ndGg7Ci0gICAgICAgICAgaW50IHggPSAwOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICAgICAgICAgIGlmIChpIDwgbGVuZ3RoICYmIG92ZXJsYXlzW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIEltYWdlRGF0YSBpZCA9IG92ZXJsYXlzW2ldLmdldEltYWdlRGF0YSgpOwotICAgICAgICAgICAgICAgICAgZHJhd0ltYWdlKGlkLCB4LCAwKTsKLSAgICAgICAgICAgICAgICAgIHggKz0gaWQud2lkdGg7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByb3RlY3RlZCB2b2lkIGRyYXdUb3BSaWdodChJbWFnZURlc2NyaXB0b3JbXSBvdmVybGF5cykgewotICAgICAgICAgIGlmIChvdmVybGF5cyA9PSBudWxsKQotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IG92ZXJsYXlzLmxlbmd0aDsKLSAgICAgICAgICBpbnQgeCA9IGdldFNpemUoKS54OwotICAgICAgICAgIGZvciAoaW50IGkgPSAyOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICBpZiAoaSA8IGxlbmd0aCAmJiBvdmVybGF5c1tpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICBJbWFnZURhdGEgaWQgPSBvdmVybGF5c1tpXS5nZXRJbWFnZURhdGEoKTsKLSAgICAgICAgICAgICAgICAgIHggLT0gaWQud2lkdGg7Ci0gICAgICAgICAgICAgICAgICBkcmF3SW1hZ2UoaWQsIHgsIDApOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIEBzZWUgQ29tcG9zaXRlSW1hZ2VEZXNjcmlwdG9yI2dldFNpemUoKQotICAgICAgICovCi0gICAgICBwcm90ZWN0ZWQgUG9pbnQgZ2V0U2l6ZSgpIHsKLSAgICAgICAgICByZXR1cm4gZlNpemU7Ci0gICAgICB9Ci0gIH0KLQotICAgc3RhdGljIGNsYXNzIEltYWdlQmFzZWRJbWFnZURlc2NyaXB0b3IgZXh0ZW5kcyBJbWFnZURlc2NyaXB0b3IKLSAgewotICAgIHByb3RlY3RlZCBJbWFnZSBpbWFnZTsKLQotICAgIHB1YmxpYyBJbWFnZUJhc2VkSW1hZ2VEZXNjcmlwdG9yKEltYWdlIGltYWdlKQotICAgIHsKLSAgICAgIHRoaXMuaW1hZ2UgPSBpbWFnZTsKLSAgICB9ICAgICAgICAgICAgICAgICAgICAKLQotICAgIHB1YmxpYyBJbWFnZURhdGEgZ2V0SW1hZ2VEYXRhKCkKLSAgICB7Ci0gICAgICByZXR1cm4gaW1hZ2UuZ2V0SW1hZ2VEYXRhKCk7Ci0gICAgfQotICB9ICAKLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRW50cmllc1ZpZXcuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJpZXNWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzA2YTIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRW50cmllc1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlNlbGVjdGlvbkNoYW5nZWRFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5DYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLkNhdGFsb2dFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0KLQotcHVibGljIGNsYXNzIFhNTENhdGFsb2dFbnRyaWVzVmlldyBleHRlbmRzIENvbXBvc2l0ZQotewotICBwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLSAgcHJvdGVjdGVkIEJ1dHRvbiBlZGl0QnV0dG9uOwotICBwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLSAgcHJvdGVjdGVkIFhNTENhdGFsb2dUcmVlVmlld2VyIHRhYmxlVmlld2VyOwotICBwcm90ZWN0ZWQgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nOwotICBwcm90ZWN0ZWQgSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZzsKLSAgLy9wcm90ZWN0ZWQgYm9vbGVhbiBpc1BhZ2VFbmFibGVkID0gdHJ1ZTsKLQotICBwdWJsaWMgWE1MQ2F0YWxvZ0VudHJpZXNWaWV3KENvbXBvc2l0ZSBwYXJlbnQsIElDYXRhbG9nIHdvcmtpbmdVc2VyQ2F0YWxvZywgSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZykKLSAgewotICAgIHN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotICAgIHRoaXMud29ya2luZ1VzZXJDYXRhbG9nID0gd29ya2luZ1VzZXJDYXRhbG9nOwotICAgIHRoaXMuc3lzdGVtQ2F0YWxvZyA9IHN5c3RlbUNhdGFsb2c7Ci0KLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIHRoaXMuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0gICAgdGFibGVWaWV3ZXIgPSBjcmVhdGVUYWJsZVZpZXdlcih0aGlzKTsKLSAgICB0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgdGFibGVWaWV3ZXIuc2V0SW5wdXQoImR1bW15Iik7IC8vJE5PTi1OTFMtMSQKLSAgICB0YWJsZVZpZXdlci5leHBhbmRUb0xldmVsKDIpOwotICAgIHRhYmxlVmlld2VyLnJldmVhbChYTUxDYXRhbG9nVHJlZVZpZXdlci5VU0VSX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCk7Ci0KLSAgICBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyID0gbmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKQotICAgIHsKLSAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KQotICAgICAgewotICAgICAgICB1cGRhdGVXaWRnZXRFbmFibGVkU3RhdGUoKTsKLSAgICAgIH0KLSAgICB9OwotICAgIHRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICBjcmVhdGVCdXR0b25zKHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVtb3ZlTGVhZGluZ1NsYXNoKFN0cmluZyB1cmkpCi0gIHsKLSAgICAvLyByZW1vdmUgbGVhZGluZyBzbGFzaCBmcm9tIHRoZSB2YWx1ZSB0byBhdm9pZCB0aGUgd2hvbGUgbGVhZGluZyBzbGFzaCBhbWJpZ3VpdHkgcHJvYmxlbQotICAgIC8vICAgICAgIAotICAgIGlmICh1cmkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB3aGlsZSAodXJpLnN0YXJ0c1dpdGgoIi8iKSB8fCB1cmkuc3RhcnRzV2l0aCgiXFwiKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICB7Ci0gICAgICAgIHVyaSA9IHVyaS5zdWJzdHJpbmcoMSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB1cmk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIgY3JlYXRlVGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIFN0cmluZyBoZWFkaW5nc1tdID0gbmV3IFN0cmluZ1syXTsKLSAgICBoZWFkaW5nc1swXSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9LRVk7Ci0gICAgaGVhZGluZ3NbMV0gPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVJJOwotCi0gICAgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIgdGhlVGFibGVWaWV3ZXIgPSBuZXcgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIocGFyZW50LCB3b3JraW5nVXNlckNhdGFsb2csIHN5c3RlbUNhdGFsb2cpOwotICAgIHJldHVybiB0aGVUYWJsZVZpZXdlcjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnMoQ29tcG9zaXRlIHBhcmVudCkKLSAgewotICAgIENvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLSAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgIGdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDc7Ci0gICAgZ3JpZExheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0KLSAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGdkLmhvcml6b250YWxTcGFuID0gNDsKLQotICAgIEJ1dHRvbiBoaWRkZW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGhpZGRlbkJ1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBoaWRkZW5CdXR0b24uc2V0VmlzaWJsZShmYWxzZSk7Ci0gICAgaGlkZGVuQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpCi0gICAgewotICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGUud2lkZ2V0ID09IG5ld0J1dHRvbikKLSAgICAgICAgewotICAgICAgICAgIHBlcmZvcm1OZXcoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKQotICAgICAgICB7Ci0gICAgICAgICAgcGVyZm9ybUVkaXQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pCi0gICAgICAgIHsKLSAgICAgICAgICBwZXJmb3JtRGVsZXRlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9OwotCi0gICAgLy8gYWRkIHRoZSAiTmV3Li4uIiBidXR0b24KLSAgICAvLwotICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLSAgICBuZXdCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIG5ld0J1dHRvbi5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9CVVRUT05fTkVXKTsKLSAgICAvL1dvcmtiZW5jaEhlbHAuc2V0SGVscChuZXdCdXR0b24sIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfTUFQUElOR19ORVcpOwotICAgIG5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKGdkKTsKLSAgICBuZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0gICAgLy8gYWRkIHRoZSAiRWRpdC4uLiIgYnV0dG9uCi0gICAgLy8KLSAgICBnZCA9IG5ldyBHcmlkRGF0YSgpOwotICAgIGdkLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotICAgIGdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotICAgIGVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgIGVkaXRCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX0VESVQpOwotICAgIC8vV29ya2JlbmNoSGVscC5zZXRIZWxwKGVkaXRCdXR0b24sIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfTUFQUElOR19FRElUKTsKLSAgICBlZGl0QnV0dG9uLnNldExheW91dERhdGEoZ2QpOwotICAgIGVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0gICAgLy8gYWRkIHRoZSAiRGVsZXRlIiBidXR0b24KLSAgICAvLwotICAgIGdkID0gbmV3IEdyaWREYXRhKCk7Ci0gICAgZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0gICAgZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0gICAgZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLSAgICBkZWxldGVCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfQlVUVE9OX0RFTEVURSk7Ci0gICAgLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAoZGVsZXRlQnV0dG9uLCBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX01BUFBJTkdfREVMRVRFKTsKLSAgICBkZWxldGVCdXR0b24uc2V0TGF5b3V0RGF0YShnZCk7Ci0gICAgZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotICAgIC8vIGEgY3J1ZGR5IGhhY2sgc28gdGhhdCB0aGUgUHJlZmVyZW5jZURpYWxvZyBkb2Vzbid0IGNsb3NlIGV2ZXJ5IHRpbWUgd2UgcHJlc3MgJ2VudGVyJwotICAgIC8vCi0gICAgZ2V0U2hlbGwoKS5zZXREZWZhdWx0QnV0dG9uKGhpZGRlbkJ1dHRvbik7Ci0gICAgdXBkYXRlV2lkZ2V0RW5hYmxlZFN0YXRlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWZyZXNoKCkKLSAgewotICAgIHRhYmxlVmlld2VyLnJlZnJlc2goKTsvL1hNTENhdGFsb2dUcmVlVmlld2VyLlVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUKTsKLSAgfQotCi0gIHByb3RlY3RlZCBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIElDYXRhbG9nRWxlbWVudCBlbnRyeSkKLSAgewotICAgIFNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCUVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRDYXRhbG9nRW50cnlEaWFsb2coc2hlbGwsIGVudHJ5KTsKLSAgICBkaWFsb2cuY3JlYXRlKCk7Ci0gICAgZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0gICAgZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotICAgIGRpYWxvZy5vcGVuKCk7Ci0gICAgcmV0dXJuIGRpYWxvZzsKLSAgfQotICAKLSAgcHJvdGVjdGVkIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgaW52b2tlRGlhbG9nKFN0cmluZyB0aXRsZSwgSUNhdGFsb2cgY2F0YWxvZykKLSAgewotICAgIFNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCUVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRDYXRhbG9nRW50cnlEaWFsb2coc2hlbGwsIGNhdGFsb2cpOwotICAgIGRpYWxvZy5jcmVhdGUoKTsKLSAgICBkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLSAgICBkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0gICAgZGlhbG9nLm9wZW4oKTsKLSAgICByZXR1cm4gZGlhbG9nOwotICB9Ci0gIAotCi0gIHByb3RlY3RlZCB2b2lkIHBlcmZvcm1OZXcoKQotICB7Ci0KLQkvL0lDYXRhbG9nRW50cnkgbmV3RW50cnkgPSAoSUNhdGFsb2dFbnRyeSl3b3JraW5nVXNlckNhdGFsb2cuY3JlYXRlQ2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbGVtZW50LlRZUEVfRU5UUlkpOwotICAgIEVkaXRDYXRhbG9nRW50cnlEaWFsb2cgZGlhbG9nID0gaW52b2tlRGlhbG9nKFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ORVdfRElBTE9HX1RJVExFLCB3b3JraW5nVXNlckNhdGFsb2cpOwotICAgIElDYXRhbG9nRWxlbWVudCBlbGVtZW50ID0gZGlhbG9nLmdldENhdGFsb2dFbGVtZW50KCk7Ci0JaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKQotICAgIHsKLSAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZy5hZGRDYXRhbG9nRWxlbWVudChlbGVtZW50KTsKLSAgICAgIHRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihlbGVtZW50KSwgdHJ1ZSk7Ci0JICB0YWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybUVkaXQoKQotICB7Ci0gICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLSAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS5nZXRGaXJzdEVsZW1lbnQoKSA6IG51bGw7Ci0KLSAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VsZW1lbnQpCi0gICAgewotCQlJQ2F0YWxvZ0VsZW1lbnQgb2xkRW50cnkgPSAoSUNhdGFsb2dFbGVtZW50KSBzZWxlY3RlZE9iamVjdDsKLQkJSUNhdGFsb2dFbGVtZW50IG5ld0VudHJ5ID0gKElDYXRhbG9nRWxlbWVudCkoKENhdGFsb2dFbGVtZW50KW9sZEVudHJ5KS5jbG9uZSgpOwotCi0gICAgICBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nIGRpYWxvZyA9IGludm9rZURpYWxvZyhYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfRURJVF9ESUFMT0dfVElUTEUsIG5ld0VudHJ5KTsKLSAgICAgIGlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykKLSAgICAgIHsKLSAgICAgICAgLy8gZGVsZXRlIHRoZSBvbGQgdmFsdWUgaWYgdGhlICdtYXBGcm9tJyBoYXMgY2hhbmdlZAotICAgICAgICAvLwotICAgICAgICB3b3JraW5nVXNlckNhdGFsb2cucmVtb3ZlQ2F0YWxvZ0VsZW1lbnQob2xkRW50cnkpOwotCi0gICAgICAgIC8vIHVwZGF0ZSB0aGUgbmV3IG1hcHBpbmcKLSAgICAgICAgLy8KLSAgICAgICAgd29ya2luZ1VzZXJDYXRhbG9nLmFkZENhdGFsb2dFbGVtZW50KG5ld0VudHJ5KTsKLSAgICAgICAgdGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5ld0VudHJ5KSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGV0ZSgpCi0gIHsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotICAgIE9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQotICAgIGlmIChzZWxlY3RlZE9iamVjdCBpbnN0YW5jZW9mIElDYXRhbG9nRWxlbWVudCkKLSAgICB7Ci0JICBJQ2F0YWxvZ0VsZW1lbnQgY2F0YWxvZ0VsZW1lbnQgPSAoSUNhdGFsb2dFbGVtZW50KSBzZWxlY3RlZE9iamVjdDsKLSAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZy5yZW1vdmVDYXRhbG9nRWxlbWVudChjYXRhbG9nRWxlbWVudCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlV2lkZ2V0RW5hYmxlZFN0YXRlKCkKLSAgewotCSAgYm9vbGVhbiBpc0VkaXRhYmxlID0gZmFsc2U7Ci0JICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCSAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCSAgCi0JICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VsZW1lbnQpCi0JICB7Ci0JCSAgSUNhdGFsb2dFbGVtZW50W10gZWxlbWVudHMgPSAoKENhdGFsb2cpd29ya2luZ1VzZXJDYXRhbG9nKS5nZXRDYXRhbG9nRWxlbWVudHMoKTsKLQkJICAvL2R3IExpc3QgZW50cmllc0xpc3QgPSBuZXcgQXJyYXlMaXN0KGVsZW1lbnRzLmxlbmd0aCk7Ci0JCSAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbGVtZW50cy5sZW5ndGg7IGkrKykKLQkJICB7Ci0JCQkgIElDYXRhbG9nRWxlbWVudCBlbGVtZW50ID0gZWxlbWVudHNbaV07Ci0JCQkgIGlzRWRpdGFibGUgPSBzZWxlY3RlZE9iamVjdC5lcXVhbHMoZWxlbWVudCk7Ci0JCQkgIGlmKGlzRWRpdGFibGUpIGJyZWFrOyAgCi0JCSAgfQotCSAgfQotCSAgCi0JICAvL2lmIChpc1BhZ2VFbmFibGVkKQotCSAgewotCQkgIGVkaXRCdXR0b24uc2V0RW5hYmxlZChpc0VkaXRhYmxlKTsKLQkJICBkZWxldGVCdXR0b24uc2V0RW5hYmxlZChpc0VkaXRhYmxlKTsKLQkgIH0KLSAgfQotCi0vKgotICBwdWJsaWMgdm9pZCBzZXRQYWdlRW5hYmxlZChib29sZWFuIGVuYWJsZWQpCi0gIHsKLSAgICBpc1BhZ2VFbmFibGVkID0gZW5hYmxlZDsKLQotICAgIHRhYmxlVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGlzUGFnZUVuYWJsZWQpOwotCi0gICAgbmV3QnV0dG9uLnNldEVuYWJsZWQoaXNQYWdlRW5hYmxlZCk7Ci0gICAgZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGlzUGFnZUVuYWJsZWQpOwotICAgIGRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGlzUGFnZUVuYWJsZWQpOwotICB9Ci0qLwotICBwdWJsaWMgdm9pZCB1cGRhdGVQYWdlKCkKLSAgewotICAgIHJlZnJlc2goKTsKLSAgICB1cGRhdGVXaWRnZXRFbmFibGVkU3RhdGUoKTsKLSAgfQotCi0gIHB1YmxpYyBWaWV3ZXIgZ2V0Vmlld2VyKCkKLSAgewotICAgIHJldHVybiB0YWJsZVZpZXdlcjsKLSAgfQotICAKLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRW50cnlEZXRhaWxzVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDY3YjFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotCi1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dFbnRyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLQotCi0gICAgICAgICAgICAgICAgICAgICAgIAotcHVibGljIGNsYXNzIFhNTENhdGFsb2dFbnRyeURldGFpbHNWaWV3Ci17ICAgICAgICAgICAgICAgICAgICAgIAotICBwcm90ZWN0ZWQgVGV4dCBkZXRhaWxzVGV4dDsKLSAgcHJvdGVjdGVkIFNjcm9sbEJhciB2ZXJ0aWNhbFNjcm9sbCwgaG9yaXpvbnRhbFNjcm9sbDsKLQotICBwdWJsaWMgWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCkgCi0gIHsKLSAgICBDb2xvciBjb2xvciA9IHBhcmVudC5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7IAotICAgICAgICAgICAgICAgIAotCWRldGFpbHNUZXh0ID0gbmV3IFRleHQocGFyZW50LCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgU1dULkhfU0NST0xMIHwgU1dULlZfU0NST0xMKTsKLQotCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsJCi0JZGF0YS5oZWlnaHRIaW50ID0gNjU7Ci0JZGV0YWlsc1RleHQuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotICAgIHZlcnRpY2FsU2Nyb2xsID0gZGV0YWlsc1RleHQuZ2V0VmVydGljYWxCYXIoKTsKLSAgICAvL3ZlcnRpY2FsU2Nyb2xsLnNldFZpc2libGUoZmFsc2UpOwotICAgIGhvcml6b250YWxTY3JvbGwgPSBkZXRhaWxzVGV4dC5nZXRIb3Jpem9udGFsQmFyKCk7Ci0gICAgZGV0YWlsc1RleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIGRldGFpbHNUZXh0LnNldEJhY2tncm91bmQoY29sb3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q2F0YWxvZ0VsZW1lbnQoSUNhdGFsb2dFbnRyeSBlbnRyeSkKLSAgeyAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgU3RyaW5nIHZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRVUkkoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBsaW5lMSA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX1VSSV9DT0xPTiArICJcdFx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0gICAgCi0gICAgdmFsdWUgPSBlbnRyeSAhPSBudWxsID8gZ2V0S2V5VHlwZVZhbHVlKGVudHJ5KSA6ICIiOyAvLyROT04tTkxTLTEkCi0gICAgU3RyaW5nIGxpbmUyID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT04gKyAiXHQiICsgdmFsdWU7IC8vJE5PTi1OTFMtMSQKLQotICAgIHZhbHVlID0gZ2V0RGlzcGxheVZhbHVlKGVudHJ5ICE9IG51bGwgPyBlbnRyeS5nZXRLZXkoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotICAgIFN0cmluZyBsaW5lMyA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTX0tFWV9DT0xPTiArICJcdFx0IiArIHZhbHVlOyAvLyROT04tTkxTLTEkCi0KLSAgICBTdHJpbmcgZW50aXJlU3RyaW5nID0gIlxuIiArIGxpbmUxICsgIlxuIiArIGxpbmUyICsgIlxuIiArIGxpbmUzOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotICAgIGRldGFpbHNUZXh0LnNldFRleHQoZW50aXJlU3RyaW5nKTsKLSAgfSAgCi0gIAotICBwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRWxlbWVudChJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cpCi0gIHsgICAgICAgICAgICAgICAgICAgICAgIAotICAgIFN0cmluZyB2YWx1ZSA9IGdldERpc3BsYXlWYWx1ZShuZXh0Q2F0YWxvZyAhPSBudWxsID8gbmV4dENhdGFsb2cuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLSAgICBTdHJpbmcgbGluZTEgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfREVUQUlMU19VUklfQ09MT04gKyAiXHRcdCIgKyB2YWx1ZTsgLy8kTk9OLU5MUy0xJAotICAgIAotICAgIFN0cmluZyBlbnRpcmVTdHJpbmcgPSAiXG4iICsgbGluZTE7IC8vJE5PTi1OTFMtMSQKLSAgICBkZXRhaWxzVGV4dC5zZXRUZXh0KGVudGlyZVN0cmluZyk7Ci0gIH0gIAotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpCi0gIHsKLSAgICByZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotICB9ICAgICAgCi0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRLZXlUeXBlVmFsdWUoSUNhdGFsb2dFbnRyeSBlbnRyeSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOyAKLSAgICBpZiAoZW50cnkuZ2V0VVJJKCkgIT0gbnVsbCAmJiBlbnRyeS5nZXRVUkkoKS5lbmRzV2l0aCgieHNkIikpICAgICAvLyROT04tTkxTLTEkCi0gICAgeyAgICAgICAgICAgICAKLSAgICAgIHJlc3VsdCA9IChlbnRyeS5nZXRFbnRyeVR5cGUoKSA9PSBJQ2F0YWxvZ0VudHJ5LkVOVFJZX1RZUEVfVVJJKSA/ICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfUFVCTElDIDoKLSAgICAgICAgICAgICAgIFhNTENhdGFsb2dNZXNzYWdlcy5VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNOwotICAgIH0gCi0gICAgZWxzZQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIHN3aXRjaCAoZW50cnkuZ2V0RW50cnlUeXBlKCkpIHsKLQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQzoKLQkJCQlyZXN1bHQgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1BVQkxJQzsKLQkJCQlicmVhazsKLQkJCWNhc2UgSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1NZU1RFTToKLQkJCQlyZXN1bHQgPSBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTTsKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQ6Ci0JCQkJcmVzdWx0ID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSTsKLQkJCQlicmVhazsKLQkJCX0KLQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dGaWxlVHlwZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nRmlsZVR5cGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJjYWRmOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dGaWxlVHlwZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNhdGFsb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBjb20uaWJtLmljdS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ0ZpbGVUeXBlIAotewotICBwdWJsaWMgU3RyaW5nIGRlc2NyaXB0aW9uOwotICBwdWJsaWMgTGlzdCBleHRlbnNpb25zID0gbmV3IEFycmF5TGlzdCgpOwotICBwdWJsaWMgU3RyaW5nIGljb25GaWxlTmFtZTsKLSAgcHVibGljIEltYWdlIGljb247IAotICAgIAotICBwdWJsaWMgdm9pZCBhZGRFeHRlbnNpb25zKFN0cmluZyBjb250cmlidXRlZEV4dGVuc2lvbnMpCi0gIHsKLQlMaXN0IGxpc3QgPSBwYXJzZUV4dGVuc2lvbnMoY29udHJpYnV0ZWRFeHRlbnNpb25zKTsKLQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0JewotCSAgU3RyaW5nIGV4dGVuc2lvbiA9IChTdHJpbmcpaS5uZXh0KCk7Ci0JICBpZiAoIWV4dGVuc2lvbnMuY29udGFpbnMoZXh0ZW5zaW9uKSkKLQkgIHsKLQkJZXh0ZW5zaW9ucy5hZGQoZXh0ZW5zaW9uKTsKLQkgIH0KLQl9Ci0gIH0gIAotICAKLSAgcHJvdGVjdGVkIExpc3QgcGFyc2VFeHRlbnNpb25zKFN0cmluZyBzdHJpbmcpCi0gIHsKLQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JZm9yIChTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHN0cmluZywgIiwgIik7IHN0Lmhhc01vcmVUb2tlbnMoKTsgKSAvLyROT04tTkxTLTEkCi0JewotCSAgU3RyaW5nIHRva2VuID0gc3QubmV4dFRva2VuKCk7Ci0JICBpZiAodG9rZW4gIT0gbnVsbCkKLQkgIHsgICAgICAgICAgCQotCQlsaXN0LmFkZCh0b2tlbik7IAotCSAgfSAgICAgICAgCSAgCSAKLQl9ICAKLQlyZXR1cm4gbGlzdDsKLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWZmMTk5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIEVkaXRvcgotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTENhdGFsb2dNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZy5YTUxDYXRhbG9nUmVzb3VyY2VzIjsvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0laQVJEX1NDSEVNQV9BTkRfTkFNRV9TUEFDRV9JTkZPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX05BTUVfU1BBQ0VfUFJFRklYOwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX05BTUVfU1BBQ0VfVVJJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1hTRF9MT0NBVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ET0NUWVBFX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NZU1RFTV9JRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU0VMRUNUX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfS0VZOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0tFWV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ERVRBSUxTX0tFWV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVJJX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0NBVEFMT0dfVVJJX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0RFVEFJTFNfVVJJX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1BVQkxJQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9YU0RfU1lTVEVNOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX0RURF9QVUJMSUM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1NZU1RFTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9LRVlfVFlQRV9ERVNDUklQVElPTl9VUkk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfTE9ORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX0lOVkFMSURfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX0lOVkFMSURfRklMRV9MT05HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfTk9fRUxFTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX05PX0VMRU1FTlRfRFREX0xPTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19OT19FTEVNRU5UX1hTRF9MT05HOwotCi0KLQkvL05ld01vZGVsV2l6YXJkCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9CUk9XU0U7Ci0KLQkvL1hNTENhdGFsb2dJZE1hcHBpbmdQYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTUFQX1RPOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX01BUF9GUk9NIDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fTkVXOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9FRElUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9ERUxFVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfTkVXX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9FRElUX0RJQUxPR19USVRMRTsKLQotCi0JLy8gWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfVVNFUl9FTlRSSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1VTRVJfRU5UUklFU19UT09MX1RJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TWVNURU1fRU5UUklFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TWVNURU1fRU5UUklFU19UT09MX1RJUDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fQ0hBTkdFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NFTEVDVF9QUk9KRUNUOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1NQRUNJRllfUFJPSkVDVF9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9XQVJOSU5HX05PX1BST0pFQ1RTX0NSRUFURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfV0FSTklOR19QUk9KRUNUX05PVF9TUEVDSUZJRUQgOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX1dBUk5JTkdfUFJPSkVDVF9ET0VTX05PVF9FWElTVCA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfUFJPSkVDVF9UT19VU0UgOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0NBVEFMT0dfU0FWRV9FUlJPUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9DQVRBTE9HX0NPVUxEX05PVF9CRV9TQVZFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9BRFZBTkNFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9BRFZBTkNFRF9YTUxfQ0FUQUxPR19QUkVGUzsgICAKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TUEVDSUZZX1BFUlNJU1RFTkNFX0ZJTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfU0FWRV9DQVRBTE9HX0RJQUxPR19USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TQVZFX0NBVEFMT0dfRElBTE9HX0RFU0M7ICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9CUk9XU0VfQ0FUQUxPR19GSUxFX0RFU0M7ICAgCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfREVUQUlMUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9VU0VSX1NQRUNJRklFRF9FTlRSSUVTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX1BMVUdJTl9TUEVDSUZJRURfRU5UUklFUzsKLQotCS8vIEFkdmFuY2VkT3B0aW9uc0RpYWxvZwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9JTVBPUlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfQlVUVE9OX0VYUE9SVDsKLQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfTUVTU0FHRTsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19IRUFESU5HOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFUlJPUl9TQVZJTkdfRklMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9GSUxFX0lTX1JFQURfT05MWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9ESUFMT0dfREVTQ1JJUFRJT047Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0Q2F0YWxvZ0VudHJ5RGlhbG9nX2NhdGFsb2dFbnRyeUxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVkaXRDYXRhbG9nRW50cnlEaWFsb2dfbmV4dENhdGFsb2dMYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9CVVRUT05fTUVOVV9CUk9XU0VfV09SS1NQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVJX0JVVFRPTl9NRU5VX0JST1dTRV9GSUxFX1NZU1RFTTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9MQUJFTF9TRUxFQ1RfRklMRV9GSUxURVJfQ09OVFJPTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVSV9URVhUX1NFTEVDVF9GSUxFX0ZJTFRFUl9DT05UUk9MOwotCQotCQotCi0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MQ2F0YWxvZ01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBYTUxDYXRhbG9nTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2OTQ3YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cuQ2F0YWxvZ1NldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSUNhdGFsb2dMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JTmV4dENhdGFsb2c7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDYXRhbG9nUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBQcmVmZXJlbmNlUGFnZSBpbXBsZW1lbnRzCi0gICAgICAgIElXb3JrYmVuY2hQcmVmZXJlbmNlUGFnZSwgSUNhdGFsb2dMaXN0ZW5lcgotewotCi0gICAgcHJvdGVjdGVkIFhNTENhdGFsb2dFbnRyaWVzVmlldyBjYXRhbG9nRW50cmllc1ZpZXc7Ci0KLSAgICBwcm90ZWN0ZWQgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nOwotCi0gICAgcHJvdGVjdGVkIElDYXRhbG9nIHN5c3RlbUNhdGFsb2c7Ci0KLSAgICBwcm90ZWN0ZWQgSUNhdGFsb2cgdXNlckNhdGFsb2c7Ci0KLSAgICBwcm90ZWN0ZWQgSUNhdGFsb2cgZGVmYXVsdENhdGFsb2c7Ci0KLSAgICBwcm90ZWN0ZWQgQnV0dG9uIGFkdmFuY2VkQnV0dG9uOwotCi0gICAgcHVibGljIFhNTENhdGFsb2dQcmVmZXJlbmNlUGFnZSgpCi0gICAgewotICAgICAgICBkZWZhdWx0Q2F0YWxvZyA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERlZmF1bHRYTUxDYXRhbG9nKCk7Ci0gICAgICAgIElOZXh0Q2F0YWxvZ1tdIG5leHRDYXRhbG9ncyA9IGRlZmF1bHRDYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgSU5leHRDYXRhbG9nIGNhdGFsb2cgPSBuZXh0Q2F0YWxvZ3NbaV07Ci0gICAgICAgICAgICBJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLSAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkQ2F0YWxvZyAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lECi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKQotICAgIHsKLSAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwotICAgICAgICB3b3JraW5nVXNlckNhdGFsb2cucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVmcmVzaCB0aGUgdmlldyBpbiByZXNwb25jZSB0byBhbiBldmVudCBzZW50IGJ5IHRoZSBDYXRhbG9nCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY2F0YWxvZ0NoYW5nZWQoSUNhdGFsb2dFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICAgIGNhdGFsb2dFbnRyaWVzVmlldy51cGRhdGVQYWdlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBwcmVmZXJlbmNlIHBhZ2UgY29udHJvbHMgb24gZGVtYW5kLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwYXJlbnQKLSAgICAgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgZm9yIHRoZSBwcmVmZXJlbmNlIHBhZ2UKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgICAgLy8gd2UgY3JlYXRlIGEgd29ya2luZyBjb3B5IG9mIHRoZSAnVXNlciBTZXR0aW5ncycgZm9yIHRoZSBDYXRhbG9nCi0gICAgICAgIC8vIHRoYXQgd2UgY2FuIG1vZGlmeQotICAgICAgICBDYXRhbG9nU2V0IHRlbXBDYXRhbG9nU2V0ID0gbmV3IENhdGFsb2dTZXQoKTsgCi0gICAgICAgIHdvcmtpbmdVc2VyQ2F0YWxvZyA9IHRlbXBDYXRhbG9nU2V0Lmxvb2t1cE9yQ3JlYXRlQ2F0YWxvZygid29ya2luZyIsICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0gICAgICAgIAotICAgICAgICAvLyBUT0RPOiBhZGQgZW50cmllcyBmcm9tIHRoZSBuZXN0ZWQgY2F0YWxvZ3MgYXMgd2VsbAotICAgICAgICB3b3JraW5nVXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHVzZXJDYXRhbG9nKTsKLSAgICAgICAgd29ya2luZ1VzZXJDYXRhbG9nLmFkZExpc3RlbmVyKHRoaXMpOwotICAgICAgICBub0RlZmF1bHRBbmRBcHBseUJ1dHRvbigpOwotICAgICAgICBDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLSAgICAgICAgLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKGNvbXBvc2l0ZSwgbmV3Ci0gICAgICAgIC8vIENvbnRyb2xDb250ZXh0Q29tcHV0ZXIoY29tcG9zaXRlLAotICAgICAgICAvLyBYTUxCdWlsZGVyQ29udGV4dElkcy5YTUxQX0NBVEFMT0dfUEFHRSkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotICAgICAgICBjb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0gICAgICAgIGNyZWF0ZUNhdGFsb2dFbnRyaWVzVmlldyhjb21wb3NpdGUpOwotICAgICAgICBjcmVhdGVDYXRhbG9nRGV0YWlsc1ZpZXcoY29tcG9zaXRlKTsKLSAgICAgICAgY3JlYXRlQWR2YW5jZWRCdXR0b24oY29tcG9zaXRlKTsKLSAgICAgICAgLy8gY2F0YWxvZ0VudHJpZXNWaWV3LnVwZGF0ZVBhZ2UoKTsKLSAgICAgICAgYXBwbHlEaWFsb2dGb250KGNvbXBvc2l0ZSk7Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gY29tcG9zaXRlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUFkdmFuY2VkQnV0dG9uKENvbXBvc2l0ZSBjb21wb3NpdGUpCi0gICAgewotICAgICAgICBDb21wb3NpdGUgcGFuZWwgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotICAgICAgICBHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgICBncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotICAgICAgICBwYW5lbC5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0gICAgICAgIHBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICAvLyBUT0RPLi4uIGlzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBleHBhbmQgdGhlIHBhZ2Ugd2lkdGg/Ci0gICAgICAgIC8vIFRoaXMgaW52aXNpYmxlIGxhYmVsIGlzIGNyZWF0ZWQgdG8gZm9yY2UgdGhlIHdpZHRoIG9mIHRoZSBwYWdlIHRvIGJlCi0gICAgICAgIC8vIHdpZGUgZW5vdWdoIHRvIHNob3cKLSAgICAgICAgLy8gdGhlIHJhdGhlciBsb25nIHVyaSBhbmQga2V5IGZpZWxkcyBvZiBhIGNhdGFsb2cgZW50cnkuCi0gICAgICAgIExhYmVsIHdpZHRoRnVkZ2VyID0gbmV3IExhYmVsKHBhbmVsLCBTV1QuTk9ORSk7Ci0gICAgICAgIFN0cmluZyB3aWR0aEZ1ZGdlclN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgd2lkdGhGdWRnZXJTdHJpbmcgKz0gIngiOyAvLyROT04tTkxTLTEkCi0gICAgICAgIH0KLSAgICAgICAgd2lkdGhGdWRnZXIuc2V0VGV4dCh3aWR0aEZ1ZGdlclN0cmluZyk7Ci0gICAgICAgIHdpZHRoRnVkZ2VyLnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICBDb21wb3NpdGUgcGxhY2VIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHBhbmVsLCBTV1QuTk9ORSk7Ci0gICAgICAgIHBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotICAgICAgICBhZHZhbmNlZEJ1dHRvbiA9IG5ldyBCdXR0b24ocGFuZWwsIFNXVC5OT05FKTsKLSAgICAgICAgYWR2YW5jZWRCdXR0b24uc2V0VGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQURWQU5DRUQpOwotICAgICAgICBTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZHZhbmNlZE9wdGlvbnNEaWFsb2cgZGlhbG9nID0gbmV3IEFkdmFuY2VkT3B0aW9uc0RpYWxvZygKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldFNoZWxsKCksIHdvcmtpbmdVc2VyQ2F0YWxvZyk7Ci0gICAgICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZSgpOwotICAgICAgICAgICAgICAgIGRpYWxvZwotICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNoZWxsKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfQURWQU5DRURfWE1MX0NBVEFMT0dfUFJFRlMpOwotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLSAgICAgICAgICAgICAgICBkaWFsb2cub3BlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBhZHZhbmNlZEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihzZWxlY3Rpb25MaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTYW1lRmlsZU5hbWUoU3RyaW5nIGEsIFN0cmluZyBiKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICAgICAgaWYgKGEgPT0gbnVsbCAmJiBiID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gYS5lcXVhbHMoYik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDYXRhbG9nRW50cmllc1ZpZXcoQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICAgIEdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBncm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgICAgICBncm91cC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9VU0VSX0VOVFJJRVMpOwotICAgICAgICBncm91cC5zZXRUb29sVGlwVGV4dChYTUxDYXRhbG9nTWVzc2FnZXMuVUlfTEFCRUxfVVNFUl9FTlRSSUVTX1RPT0xfVElQKTsKLSAgICAgICAgLy8gV29ya2JlbmNoSGVscC5zZXRIZWxwKHVzZXJFbnRyaWVzR3JvdXAsIG5ldwotICAgICAgICAvLyBDb250cm9sQ29udGV4dENvbXB1dGVyKHVzZXJFbnRyaWVzR3JvdXAsCi0gICAgICAgIC8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTFBfQ0FUQUxPR19VU0VSX0dST1VQKSk7Ci0gICAgICAgIGNhdGFsb2dFbnRyaWVzVmlldyA9IG5ldyBYTUxDYXRhbG9nRW50cmllc1ZpZXcoZ3JvdXAsCi0gICAgICAgICAgICAgICAgd29ya2luZ1VzZXJDYXRhbG9nLCBzeXN0ZW1DYXRhbG9nKTsKLSAgICAgICAgY2F0YWxvZ0VudHJpZXNWaWV3LnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGNyZWF0ZUNhdGFsb2dEZXRhaWxzVmlldyhDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgICAgR3JvdXAgZGV0YWlsc0dyb3VwID0gbmV3IEdyb3VwKHBhcmVudCwgU1dULk5PTkUpOwotICAgICAgICBkZXRhaWxzR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIGRldGFpbHNHcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgICAgIGRldGFpbHNHcm91cC5zZXRUZXh0KFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9ERVRBSUxTKTsKLSAgICAgICAgZmluYWwgWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcgZGV0YWlsc1ZpZXcgPSBuZXcgWE1MQ2F0YWxvZ0VudHJ5RGV0YWlsc1ZpZXcoCi0gICAgICAgICAgICAgICAgZGV0YWlsc0dyb3VwKTsKLSAgICAgICAgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBldmVudC5nZXRTZWxlY3Rpb24oKTsKLSAgICAgICAgICAgICAgICBPYmplY3Qgc2VsZWN0ZWRPYmplY3QgPSAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pID8gKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKQotICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpcnN0RWxlbWVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIElDYXRhbG9nRW50cnkgZW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgIGRldGFpbHNWaWV3LnNldENhdGFsb2dFbGVtZW50KGVudHJ5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIAlJTmV4dENhdGFsb2cgZW50cnkgPSAoSU5leHRDYXRhbG9nKSBzZWxlY3RlZE9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgZGV0YWlsc1ZpZXcuc2V0Q2F0YWxvZ0VsZW1lbnQoZW50cnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAJZGV0YWlsc1ZpZXcuc2V0Q2F0YWxvZ0VsZW1lbnQoKElDYXRhbG9nRW50cnkpIG51bGwpOyAKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGNhdGFsb2dFbnRyaWVzVmlldy5nZXRWaWV3ZXIoKS5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERvIGFueXRoaW5nIG5lY2Vzc2FyeSBiZWNhdXNlIHRoZSBPSyBidXR0b24gaGFzIGJlZW4gcHJlc3NlZC4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgaXQgaXMgb2theSB0byBjbG9zZSB0aGUgcHJlZmVyZW5jZSBwYWdlCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzdG9yZVZhbHVlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBzZWUgSVdvcmtiZW5jaFByZWZlcmVuY2VQYWdlCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCkKLSAgICB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmVzIHRoZSB2YWx1ZXMgb2YgdGhlIGNvbnRyb2xzIGJhY2sgdG8gdGhlIHByZWZlcmVuY2Ugc3RvcmUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHN0b3JlVmFsdWVzKCkKLSAgICB7Ci0gICAgICAgLy9kdyAgT2JqZWN0IGZpbGVPYmplY3QgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSB1c2VyQ2F0YWxvZyBzbyB0aGF0IGl0cyB0aGUgc2FtZSBhcyB0aGUgd29ya2luZwotICAgICAgICAgICAgLy8gY2F0YWxvZwotICAgICAgICAgICAgdXNlckNhdGFsb2cuY2xlYXIoKTsKLSAgICAgICAgICAgIC8vIFRPRE8gYWRkIGVudHJpZXMgZnJvbSB0aGUgbmVzdGVkIGNhdGFsb2dzPwotICAgICAgICAgICAgdXNlckNhdGFsb2cuYWRkRW50cmllc0Zyb21DYXRhbG9nKHdvcmtpbmdVc2VyQ2F0YWxvZyk7Ci0gICAgICAgICAgICAvLyBub3cgc2F2ZSB0aGUgdXNlckNhdGFsb2cKLSAgICAgICAgICAgIHVzZXJDYXRhbG9nLnNhdmUoKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0JCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL1hNTENhdGFsb2dSZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1Jlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGU3YWM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1Jlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLVVJX1dJWkFSRF9TQ0hFTUFfQU5EX05BTUVfU1BBQ0VfSU5GTyA9IFNjaGVtYSBhbmQgTmFtZXNwYWNlIEluZm9ybWF0aW9uCi1VSV9MQUJFTF9OQU1FX1NQQUNFX1BSRUZJWCAgICAgICAgICAgPSBOYW1lc3BhY2UgcHJlZml4OgotVUlfTEFCRUxfTkFNRV9TUEFDRV9VUkkgICAgICAgICAgICAgID0gTmFtZXNwYWNlIFVSSToKLVVJX0xBQkVMX1hTRF9MT0NBVElPTiAgICAgICAgICAgICAgICA9IFNjaGVtYSBsb2NhdGlvbjoKLVVJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04gICAgICAgICA9IERvY3VtZW50IHR5cGUgaW5mb3JtYXRpb24KLVVJX0xBQkVMX1NZU1RFTV9JRCAgICAgICAgICAgICAgICAgICA9ICZTeXN0ZW0gSUQ6Ci1VSV9MQUJFTF9QVUJMSUNfSUQgICAgICAgICAgICAgICAgICAgPSAmUHVibGljIElEOgotVUlfTEFCRUxfU0VMRUNUX0ZJTEUgICAgICAgICAgICAgICAgID0gU2VsZWN0IEZpbGUKLVVJX0xBQkVMX0tFWSAgICAgICAgICAgICAgICAgICAgICAgICA9IEtleQotVUlfTEFCRUxfS0VZX0NPTE9OICAgICAgICAgICAgICAgICAgID0gJktleToKLVVJX0xBQkVMX0RFVEFJTFNfS0VZX0NPTE9OICAgICAgICAgICA9IEtleToKLVVJX0xBQkVMX1VSSSAgICAgICAgICAgICAgICAgICAgICAgICA9IFVSSQotVUlfTEFCRUxfVVJJX0NPTE9OICAgICAgICAgICAgICAgICAgID0gJlVSSTogIAotVUlfTEFCRUxfQ0FUQUxPR19VUklfQ09MT04JCSAgICAgID0gVVJJIG9mIGFub3RoZXIgWE1MIENhdGFsb2cgZmlsZToKLVVJX0xBQkVMX0RFVEFJTFNfVVJJX0NPTE9OICAgICAgICAgICA9IFVSSTogICAKLVVJX0tFWV9UWVBFX0NPTE9OICAgICAgICAgICAgICAgICAgICA9IEtleSAmVHlwZToKLVVJX0tFWV9UWVBFX0RFVEFJTFNfQ09MT04gICAgICAgICAgICA9IEtleSBUeXBlOgotVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fWFNEX1BVQkxJQyAgID0gTmFtZXNwYWNlIE5hbWUKLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1hTRF9TWVNURU0gICA9IFNjaGVtYSBMb2NhdGlvbgotVUlfS0VZX1RZUEVfREVTQ1JJUFRJT05fRFREX1BVQkxJQyAgID0gUHVibGljIElECi1VSV9LRVlfVFlQRV9ERVNDUklQVElPTl9EVERfU1lTVEVNICAgPSBTeXN0ZW0gSUQKLVVJX0tFWV9UWVBFX0RFU0NSSVBUSU9OX1VSSSAgIAkJICA9IFVSSQotVUlfTEFCRUxfU1BFQ0lGWV9BTFRFUk5BVElWRV9XRUJfVVJMID0gU3BlY2lmeSAmYWx0ZXJuYXRpdmUgd2ViIGFkZHJlc3MKLVVJX1dBUk5JTkdfVVJJX01VU1RfTk9UX0hBVkVfRE9UUyAgICA9IFVSSSBtdXN0IG5vdCBpbmNsdWRlZCAnLicgb3IgJy4uJwotCi1VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gICAgICAgPSBUaGUgc3BlY2lmaWVkIHJlc291cmNlIGNhbid0IGJlIGxvY2F0ZWQgOgotVUlfV0FSTklOR19VUklfTk9UX0ZPVU5EX0xPTkcgICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIGNhbm5vdCBiZSBmb3VuZC4gSXQgbWF5IGhhdmUgYmVlbiBtb3ZlZCB0byBhIGRpZmZlcmVudCBsb2NhdGlvbi4gSWYgdGhlIGZpbGUgaXMgbG9jYXRlZCByZW1vdGVseSwgYSBuZXR3b3JrIGNvbm5lY3Rpb24gY2Fubm90IGJlIGVzdGFibGlzaGVkIHRvIHRoZSByZW1vdGUgbG9jYXRpb24uIAotVUlfV0FSTklOR19JTlZBTElEX0ZJTEUgICAgICAgICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIGlzIGludmFsaWQuCi1VSV9XQVJOSU5HX0lOVkFMSURfRklMRV9MT05HICAgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgaXMgaW52YWxpZC4gQSBwcm9wZXIgWE1MIGZpbGUgY2Fubm90IGJlIGdlbmVyYXRlZCBmcm9tIGl0LiBPcGVuIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBlZGl0IGl0IGFzIG5lY2Vzc2FyeSwgdmFsaWRhdGUgaXQgYW5kIHRyeSBhZ2Fpbi4KLVVJX1dBUk5JTkdfTk9fRUxFTUVOVCAgICAgICAgICAgICAgICA9IFRoZSBzcGVjaWZpZWQgZmlsZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGVsZW1lbnQgZGVjbGFyYXRpb24uCi1VSV9XQVJOSU5HX05PX0VMRU1FTlRfRFREX0xPTkcgICAgICAgPSBUaGUgc3BlY2lmaWVkIGZpbGUgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIHJvb3QgZWxlbWVudCBpbiB0aGUgZ2VuZXJhdGVkIFhNTCBmaWxlLgotVUlfV0FSTklOR19OT19FTEVNRU5UX1hTRF9MT05HICAgICAgID0gVGhlIHNwZWNpZmllZCBmaWxlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgZ2xvYmFsIGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgcm9vdCBlbGVtZW50IGluIHRoZSBnZW5lcmF0ZWQgWE1MIGZpbGUuCi0KLQotIU5ld01vZGVsV2l6YXJkCi1VSV9JTlZBTElEX0dSQU1NQVJfRVJST1IgICAgICAgICAgICAgPSBJbnZhbGlkIEdyYW1tYXIKLVVJX0JVVFRPTl9CUk9XU0UgICAgICAgICAgICAgICAgICAgICA9ICZCcm93c2UuLi4KLQotIVhNTENhdGFsb2dJZE1hcHBpbmdQYWdlCi1VSV9MQUJFTF9NQVBfVE8gICAgICAgICAgICAgICAgICAgICAgPSBNYXAgdG86Ci1VSV9MQUJFTF9NQVBfRlJPTSAgICAgICAgICAgICAgICAgICAgPSBNYXAgZnJvbToKLVVJX0JVVFRPTl9ORVcgICAgICAgICAgICAgICAgICAgICAgICA9ICZBZGQuLi4KLVVJX0JVVFRPTl9FRElUICAgICAgICAgICAgICAgICAgICAgICA9ICZFZGl0Li4uCi1VSV9CVVRUT05fREVMRVRFICAgICAgICAgICAgICAgICAgICAgPSAmRGVsZXRlCi1VSV9MQUJFTF9ORVdfRElBTE9HX1RJVExFICAgICAgICAgICAgPSBBZGQgWE1MIENhdGFsb2cgRW50cnkKLVVJX0xBQkVMX0VESVRfRElBTE9HX1RJVExFICAgICAgICAgICA9IEVkaXQgWE1MIENhdGFsb2cgRW50cnkKLQotCi0hWE1MQ2F0YWxvZ1ByZWZlcmVuY2VQYWdlCi1VSV9MQUJFTF9VU0VSX0VOVFJJRVMgICAgICAgICAgICAgICAgPSBYTUwgQ2F0YWxvZyBFbnRyaWVzCi1VSV9MQUJFTF9VU0VSX0VOVFJJRVNfVE9PTF9USVAgICAgICAgPSBYTUwgQ2F0YWxvZyBlbnRyaWVzIHRoYXQgaGF2ZSBiZWVuIHNwZWNpZmllZCBieSB0aGUgdXNlcgotVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVMgICAgICAgICAgICAgID0gUGx1Zy1pbiBzcGVjaWZpZWQgZW50cmllcwotVUlfTEFCRUxfU1lTVEVNX0VOVFJJRVNfVE9PTF9USVAgICAgID0gWE1MIENhdGFsb2cgZW50cmllcyB0aGF0IGhhdmUgYmVlbiBzcGVjaWZpZWQgYnkgYSBwbHVnLWluCi1VSV9CVVRUT05fQ0hBTkdFICAgICAgICAgICAgICAgICAgICAgPSBDaGFuZ2UuLi4KLVVJX0xBQkVMX1NFTEVDVF9QUk9KRUNUICAgICAgICAgICAgICA9IFNlbGVjdCBQcm9qZWN0Ci1VSV9MQUJFTF9TUEVDSUZZX1BST0pFQ1RfREVTQ1JJUFRJT04gPSBTcGVjaWZ5IHRoZSBwcm9qZWN0IHRvIHBlcnNpc3QgdGhlIFhNTCBDYXRhbG9nIGluZm9ybWF0aW9uCi1VSV9XQVJOSU5HX05PX1BST0pFQ1RTX0NSRUFURUQgICAgICAgPSBObyBwcm9qZWN0cyBoYXZlIGJlZW4gY3JlYXRlZCB5ZXQuCi1VSV9XQVJOSU5HX1BST0pFQ1RfTk9UX1NQRUNJRklFRCAgICAgPSBBIHByb2plY3QgbmFtZSBoYXMgbm90IGJlZW4gc3BlY2lmaWVkLgotVUlfV0FSTklOR19QUk9KRUNUX0RPRVNfTk9UX0VYSVNUICAgID0gVGhlIHNwZWNpZmllZCBwcm9qZWN0IGRvZXMgbm90IGV4aXN0LgotVUlfTEFCRUxfUFJPSkVDVF9UT19VU0UgICAgICAgICAgICAgID0gUHJvamVjdCB0byB1c2UgdG8gcGVyc2lzdCBYTUwgQ2F0YWxvZyBVc2VyIEVudHJpZXM6IAotVUlfTEFCRUxfQ0FUQUxPR19TQVZFX0VSUk9SICAgICAgICAgID0gWE1MIENhdGFsb2cgU2F2ZSBFcnJvcgotVUlfTEFCRUxfQ0FUQUxPR19DT1VMRF9OT1RfQkVfU0FWRUQgID0gVGhlIFhNTCBDYXRhbG9nIGVudHJ5IGNvdWxkIG5vdCBiZSBzYXZlZC4KLVVJX0xBQkVMX0FEVkFOQ0VEICAgICAgICAgICAgICAgICAgICA9ICZBZHZhbmNlZC4uLgotVUlfTEFCRUxfQURWQU5DRURfWE1MX0NBVEFMT0dfUFJFRlMgID0gQWR2YW5jZWQgWE1MIENhdGFsb2cgUHJlZmVyZW5jZXMgICAKLVVJX0xBQkVMX1NQRUNJRllfUEVSU0lTVEVOQ0VfRklMRSAgICA9ICZTcGVjaWZ5IGEgZmlsZSB0byB1c2UgdG8gcGVyc2lzdCB0aGUgWE1MIENhdGFsb2cgaW5mb3JtYXRpb24uCi1VSV9MQUJFTF9TQVZFX0NBVEFMT0dfRElBTE9HX1RJVExFICAgPSBTYXZlIENoYW5nZXMKLVVJX0xBQkVMX1NBVkVfQ0FUQUxPR19ESUFMT0dfREVTQyAgICA9IFlvdSBoYXZlIG1hZGUgdW5zYXZlZCBjaGFuZ2VzIHRvIHRoZSBjdXJyZW50IFhNTCBDYXRhbG9nIHNldHRpbmdzLiBEbyB5b3Ugd2lzaCB0byBzYXZlIHlvdXIgY2hhbmdlcyBiZWZvcmUgbG9hZGluZyB0aGUgbmV3IFhNTCBDYXRhbG9nIHNldHRpbmdzPyAgIAotVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9USVRMRSAgID0gU2VsZWN0IEZvbGRlcgotVUlfTEFCRUxfQlJPV1NFX0NBVEFMT0dfRklMRV9ERVNDICAgID0gU2VsZWN0IHRoZSBmb2xkZXIgdGhhdCBjb250YWlucyB0aGUgJy54bWxjYXRhbG9nJyBmaWxlLiAgIAotVUlfTEFCRUxfREVUQUlMUyAgICAgICAgICAgICAgICAgICAgID0gRGV0YWlscwotVUlfTEFCRUxfVVNFUl9TUEVDSUZJRURfRU5UUklFUyAgICAgID0gVXNlciBTcGVjaWZpZWQgRW50cmllcwotVUlfTEFCRUxfUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTICAgID0gUGx1Z2luIFNwZWNpZmllZCBFbnRyaWVzCi0KLSFBZHZhbmNlZE9wdGlvbnNEaWFsb2cKLVVJX0xBQkVMX0RJQUxPR19ERVNDUklQVElPTiAgICAgICAgICA9IFVzZSB0aGUgYnV0dG9ucyBiZWxvdyB0byBpbXBvcnQgb3IgZXhwb3J0IFhNTCBDYXRhbG9nIHNldHRpbmdzLgotVUlfQlVUVE9OX0lNUE9SVCAgICAgICAgICAgICAgICAgICAgID0gSW1wb3J0Li4uCi1VSV9CVVRUT05fRVhQT1JUICAgICAgICAgICAgICAgICAgICAgPSBFeHBvcnQuLi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi1VSV9MQUJFTF9JTVBPUlRfRElBTE9HX1RJVExFICAgICAgICAgPSBJbXBvcnQgWE1MIENhdGFsb2cgU2V0dGluZ3MKLVVJX0xBQkVMX0lNUE9SVF9ESUFMT0dfSEVBRElORyAgICAgICA9IFNwZWNpZnkgWE1MIENhdGFsb2cgRmlsZQotVUlfTEFCRUxfSU1QT1JUX0RJQUxPR19NRVNTQUdFICAgICAgID0gU3BlY2lmeSB0aGUgZmlsZSB0aGF0IHdpbGwgdXNlZCB0byBsb2FkIHRoZSBYTUwgQ2F0YWxvZyBTZXR0aW5ncwotCi1VSV9MQUJFTF9FWFBPUlRfRElBTE9HX1RJVExFICAgICAgICAgPSBFeHBvcnQgWE1MIENhdGFsb2cgU2V0dGluZ3MKLVVJX0xBQkVMX0VYUE9SVF9ESUFMT0dfSEVBRElORyAgICAgICA9IFNwZWNpZnkgWE1MIENhdGFsb2cgRmlsZQotVUlfTEFCRUxfRVhQT1JUX0RJQUxPR19NRVNTQUdFICAgICAgID0gU3BlY2lmeSB0aGUgZmlsZSB0aGF0IHdpbGwgdXNlZCB0byBzYXZlIHRoZSBYTUwgQ2F0YWxvZyBTZXR0aW5nCi1FUlJPUl9TQVZJTkdfRklMRQkJCQkJID0gRXJyb3Igc2F2aW5nIGZpbGUgJTEKLVVJX0xBQkVMX0ZJTEVfSVNfUkVBRF9PTkxZICAgICAgICAgICA9IEZpbGUgJTEgaXMgcmVhZCBvbmx5Ci0KLUVkaXRDYXRhbG9nRW50cnlEaWFsb2dfY2F0YWxvZ0VudHJ5TGFiZWw9Q2F0YWxvZyBFbnRyeQotRWRpdENhdGFsb2dFbnRyeURpYWxvZ19uZXh0Q2F0YWxvZ0xhYmVsPU5leHQgQ2F0YWxvZwotVUlfQlVUVE9OX01FTlVfQlJPV1NFX1dPUktTUEFDRT1Xb3Jrc3BhY2UuLi4KLVVJX0JVVFRPTl9NRU5VX0JST1dTRV9GSUxFX1NZU1RFTT1GaWxlIFN5c3RlbS4uLgotVUlfTEFCRUxfU0VMRUNUX0ZJTEVfRklMVEVSX0NPTlRST0w9RmlsZXMgb2YgdHlwZToKLVVJX1RFWFRfU0VMRUNUX0ZJTEVfRklMVEVSX0NPTlRST0w9QWxsIFN1cHBvcnRlZCBGaWxlcwpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVHJlZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxDYXRhbG9nVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjIwYzAxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAyLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY2F0YWxvZzsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyRmlsdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIgZXh0ZW5kcyBUcmVlVmlld2VyIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIHhtbENhdGFsb2dJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVycm9ySW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL292cjE2L2Vycm9yLW92ZXJsYXkuZ2lmIik7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlIGVudHJ5SW1hZ2UgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuZ2V0SW1hZ2UoImljb25zL29iajE2L2VudHJ5X29iai5naWYiKTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgbmV4dENhdGFsb2dJbWFnZSA9IEltYWdlRmFjdG9yeS5JTlNUQU5DRS5nZXRJbWFnZSgiaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZiIpOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBFUlJPUl9TVEFURV9LRVkgPSAiZXJyb3JzdGF0ZWtleSI7IC8vJE5PTi1OTFMtMSQKLQotCXByb3RlY3RlZCBJQ2F0YWxvZyBmV29ya2luZ1VzZXJDYXRhbG9nOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmU3lzdGVtQ2F0YWxvZzsKLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUID0gWE1MQ2F0YWxvZ01lc3NhZ2VzLlVJX0xBQkVMX1VTRVJfU1BFQ0lGSUVEX0VOVFJJRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCA9IFhNTENhdGFsb2dNZXNzYWdlcy5VSV9MQUJFTF9QTFVHSU5fU1BFQ0lGSUVEX0VOVFJJRVM7Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgSUNhdGFsb2cgd29ya2luZ1VzZXJDYXRhbG9nLCBJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmZXb3JraW5nVXNlckNhdGFsb2cgPSB3b3JraW5nVXNlckNhdGFsb2c7Ci0JCXRoaXMuZlN5c3RlbUNhdGFsb2cgPSBzeXN0ZW1DYXRhbG9nOwotCi0JCXNldENvbnRlbnRQcm92aWRlcihuZXcgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyKCkpOwotCQlzZXRMYWJlbFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEZpbHRlckV4dGVuc2lvbnMoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQlyZXNldEZpbHRlcnMoKTsKLQkJYWRkRmlsdGVyKG5ldyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoZXh0ZW5zaW9ucykpOwotCX0KLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciB7Ci0JCXByb3RlY3RlZCBIYXNoTWFwIGltYWdlVGFibGUgPSBuZXcgSGFzaE1hcCgpOwotCi0JCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgb2JqZWN0OwotCQkJCXJlc3VsdCA9IGNhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQkvLyByZXN1bHQgPSBVUklIZWxwZXIucmVtb3ZlUGxhdGZvcm1SZXNvdXJjZVByb3RvY29sKHJlc3VsdCk7Ci0JCQl9Ci0JCQllbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2cpIHsKLQkJCQlJTmV4dENhdGFsb2cgbmV4dENhdGFsb2cgPSAoSU5leHRDYXRhbG9nKSBvYmplY3Q7Ci0JCQkJcmVzdWx0ID0gbmV4dENhdGFsb2cuZ2V0Q2F0YWxvZ0xvY2F0aW9uKCk7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiBvYmplY3QudG9TdHJpbmcoKTsKLQkJfQotCi0JCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3Qgb2JqZWN0KSB7Ci0JCQlJbWFnZSByZXN1bHQgPSBudWxsOwotCQkJSW1hZ2UgYmFzZSA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0JCQkJcmVzdWx0ID0geG1sQ2F0YWxvZ0ltYWdlOwotCQkJfQotCQkJZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQlTdHJpbmcgdXJpID0gY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCUlFZGl0b3JSZWdpc3RyeSBlciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKTsKLQkJCQlJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yID0gZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKHVyaSk7Ci0JCQkJSW1hZ2UgaW1hZ2UgPSAoSW1hZ2UpIGltYWdlVGFibGUuZ2V0KGltYWdlRGVzY3JpcHRvcik7Ci0JCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQkJaW1hZ2UgPSBpbWFnZURlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoKTsKLQkJCQkJaW1hZ2VUYWJsZS5wdXQoaW1hZ2VEZXNjcmlwdG9yLCBpbWFnZSk7Ci0JCQkJfQotCQkJCWJhc2UgPSBpbWFnZTsKLQotCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJaWYgKFVSSUhlbHBlci5pc1JlYWRhYmxlVVJJKHVyaSwgdHJ1ZSkpIHsKLQkJCQkJCXJlc3VsdCA9IGJhc2U7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlyZXN1bHQgPSBJbWFnZUZhY3RvcnkuSU5TVEFOQ0UuY3JlYXRlQ29tcG9zaXRlSW1hZ2UoYmFzZSwgZXJyb3JJbWFnZSwgSW1hZ2VGYWN0b3J5LkJPVFRPTV9MRUZUKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIElOZXh0Q2F0YWxvZykgewotCQkJCS8vIFRPRE86IGFkZCBpbWFnZSB0byB0aGUgaW1hZ2VUYWJsZSBhbmQgYWRkIGVycm9yIG92ZXJsYXkgaWYKLQkJCQkvLyBuZXh0IGNhdGFsb2cgVVJJIGlzIG5vdCByZWFkYWJsZQotCQkJCXJlc3VsdCA9IG5leHRDYXRhbG9nSW1hZ2U7Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JCQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJc3VwZXIuZGlzcG9zZSgpOwotCQkJZm9yIChJdGVyYXRvciBpdCA9IGltYWdlVGFibGUudmFsdWVzKCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOykKLQkJCXsKLQkJCQkoKEltYWdlKWl0Lm5leHQoKSkuZGlzcG9zZSgpOwotCQkJfQotCQl9Ci0JfQotCi0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVRyZWVDb250ZW50UHJvdmlkZXIgewotCQlwcm90ZWN0ZWQgT2JqZWN0W10gcm9vdHM7Ci0KLQkJcHVibGljIENhdGFsb2dFbnRyeUNvbnRlbnRQcm92aWRlcigpIHsKLQkJCXJvb3RzID0gbmV3IE9iamVjdFsyXTsKLQkJCXJvb3RzWzBdID0gVVNFUl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1Q7Ci0JCQlyb290c1sxXSA9IFBMVUdJTl9TUEVDSUZJRURfRU5UUklFU19PQkpFQ1Q7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc1Jvb3QoT2JqZWN0IG9iamVjdCkgewotCQkJcmV0dXJuIG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZyB8fCBvYmplY3QgaW5zdGFuY2VvZiBJTmV4dENhdGFsb2c7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiByb290czsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRDaGlsZHJlbihPYmplY3QgcGFyZW50RWxlbWVudCkgewotCQkJT2JqZWN0W10gcmVzdWx0ID0gbmV3IE9iamVjdFswXTsKLQkJCWlmIChwYXJlbnRFbGVtZW50ID09IHJvb3RzWzBdKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0Q2hpbGRyZW5IZWxwZXIoZldvcmtpbmdVc2VyQ2F0YWxvZyk7Ci0JCQl9Ci0JCQllbHNlIGlmIChwYXJlbnRFbGVtZW50ID09IHJvb3RzWzFdKSB7Ci0JCQkJcmVzdWx0ID0gZ2V0Q2hpbGRyZW5IZWxwZXIoZlN5c3RlbUNhdGFsb2cpOwotCQkJfQotCQkJZWxzZSBpZiAocGFyZW50RWxlbWVudCBpbnN0YW5jZW9mIElOZXh0Q2F0YWxvZykgewotCQkJCUlDYXRhbG9nIG5leHRDYXRhbG9nID0gKChJTmV4dENhdGFsb2cpIHBhcmVudEVsZW1lbnQpLmdldFJlZmVyZW5jZWRDYXRhbG9nKCk7Ci0JCQkJcmVzdWx0ID0gZ2V0Q2hpbGRyZW5IZWxwZXIobmV4dENhdGFsb2cpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXByb3RlY3RlZCBPYmplY3RbXSBnZXRDaGlsZHJlbkhlbHBlcihJQ2F0YWxvZyBjYXRhbG9nKSB7Ci0JCQkvLyBUT0RPIGFkZCBlbnRyaWVzIGZyb20gdGhlIG5lc3RlZCBjYXRhbG9ncwotCi0JCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJCWlmIChlbnRyaWVzLmxlbmd0aCA+IDApIHsKLQkJCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQkJcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0JCQkJCQlpbnQgcmVzdWx0ID0gMDsKLQkJCQkJCWlmIChvMSBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkgJiYgbzIgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeTEgPSAoSUNhdGFsb2dFbnRyeSkgbzE7Ci0JCQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeTIgPSAoSUNhdGFsb2dFbnRyeSkgbzI7Ci0JCQkJCQkJcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKGVudHJ5MS5nZXRLZXkoKSwgZW50cnkyLmdldEtleSgpKTsKLQkJCQkJCX0KLQkJCQkJCXJldHVybiByZXN1bHQ7Ci0JCQkJCX0KLQkJCQl9OwotCQkJCUFycmF5cy5zb3J0KGVudHJpZXMsIGNvbXBhcmF0b3IpOwotCQkJfQotCQkJVmVjdG9yIHJlc3VsdCA9IG5ldyBWZWN0b3IoKTsKLQkJCXJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChlbnRyaWVzKSk7Ci0JCQlJTmV4dENhdGFsb2dbXSBuZXh0Q2F0YWxvZ3MgPSBjYXRhbG9nLmdldE5leHRDYXRhbG9ncygpOwotCQkJTGlzdCBuZXh0Q2F0YWxvZ3NMaXN0ID0gQXJyYXlzLmFzTGlzdChuZXh0Q2F0YWxvZ3MpOwotCQkJcmVzdWx0LmFkZEFsbChuZXh0Q2F0YWxvZ3NMaXN0KTsKLQotCQkJcmV0dXJuICByZXN1bHQudG9BcnJheShuZXcgSUNhdGFsb2dFbGVtZW50W3Jlc3VsdC5zaXplKCldKTsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBlbGVtZW50KSB7Ci0JCQlyZXR1cm4gKGVsZW1lbnQgaW5zdGFuY2VvZiBTdHJpbmcpID8gbnVsbCA6IFVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJCXJldHVybiBpc1Jvb3QoZWxlbWVudCkgPyBnZXRDaGlsZHJlbihlbGVtZW50KS5sZW5ndGggPiAwIDogZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJLy8gbm90aGluZyB0byBkaXNwb3NlCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotCQkJLy8gSVNTVUU6IHNlZW1zIHdlIHNob3VsZCBkbyBzb21ldGhpbmcgaGVyZQotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiaGVsbG8iKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJ1biEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCQltZW51TWFuYWdlci5hZGQoYWN0aW9uKTsKLQl9Ci0KLQotCWNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCi0JCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9uczEpIHsKLQkJCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMxOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNGaWx0ZXJQcm9wZXJ0eShPYmplY3QgZWxlbWVudCwgT2JqZWN0IHByb3BlcnR5KSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBzZWxlY3QoVmlld2VyIHZpZXdlciwgT2JqZWN0IHBhcmVudCwgT2JqZWN0IGVsZW1lbnQpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkpIHsKLQkJCQlJQ2F0YWxvZ0VudHJ5IGNhdGFsb2dFbnRyeSA9IChJQ2F0YWxvZ0VudHJ5KSBlbGVtZW50OwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoY2F0YWxvZ0VudHJ5LmdldFVSSSgpLmVuZHNXaXRoKGV4dGVuc2lvbnNbaV0pKSB7Ci0JCQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmICggZWxlbWVudC5lcXVhbHMoWE1MQ2F0YWxvZ1RyZWVWaWV3ZXIuUExVR0lOX1NQRUNJRklFRF9FTlRSSUVTX09CSkVDVCApIHx8Ci0JCQkJCWVsZW1lbnQuZXF1YWxzKFhNTENhdGFsb2dUcmVlVmlld2VyLlVTRVJfU1BFQ0lGSUVEX0VOVFJJRVNfT0JKRUNUKSApIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQ7Ci0JCX0KLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxRdWlja1NjYW4uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvWE1MUXVpY2tTY2FuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMDk3NTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9YTUxRdWlja1NjYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jYXRhbG9nOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFhNTFF1aWNrU2NhbgotewotICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRUYXJnZXROYW1lc3BhY2VVUklGb3JTY2hlbWEoU3RyaW5nIHVyaSkKLSAgewotICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTCB1cmwgPSBuZXcgVVJMKHVyaSk7Ci0gICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHVybC5vcGVuU3RyZWFtKCk7Ci0gICAgICByZXN1bHQgPSBYTUxRdWlja1NjYW4uZ2V0VGFyZ2V0TmFtZXNwYWNlVVJJRm9yU2NoZW1hKGlucHV0U3RyZWFtKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZVVSSUZvclNjaGVtYShJbnB1dFN0cmVhbSBpbnB1dCkKLSAgewotICAgIFRhcmdldE5hbWVzcGFjZVVSSUNvbnRlbnRIYW5kbGVyIGhhbmRsZXIgPSBuZXcgVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIoKTsKLSAgICBDbGFzc0xvYWRlciBwcmV2Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotICAgIHRyeQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKFhNTFF1aWNrU2Nhbi5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKLSAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0JICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQkgIHBhcnNlci5wYXJzZShuZXcgSW5wdXRTb3VyY2UoaW5wdXQpLCBoYW5kbGVyKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKHByZXZDbGFzc0xvYWRlcik7Ci0gICAgfQotICAgIHJldHVybiBoYW5kbGVyLnRhcmdldE5hbWVzcGFjZVVSSTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgVGFyZ2V0TmFtZXNwYWNlVVJJQ29udGVudEhhbmRsZXIgZXh0ZW5kcyBEZWZhdWx0SGFuZGxlcgotICB7Ci0gICAgcHVibGljIFN0cmluZyB0YXJnZXROYW1lc3BhY2VVUkk7Ci0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIHVyaSwgU3RyaW5nIGxvY2FsTmFtZSwgU3RyaW5nIHFOYW1lLCBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgICB7Ci0gICAgICBpZiAobG9jYWxOYW1lLmVxdWFscygic2NoZW1hIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgaW50IG5BdHRyaWJ1dGVzID0gYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuQXR0cmlidXRlczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGF0dHJpYnV0ZXMuZ2V0TG9jYWxOYW1lKGkpLmVxdWFscygidGFyZ2V0TmFtZXNwYWNlIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2VVUkkgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKGkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyB0b2RvIHRoZXJlJ3MgYSBuaWNlIHdheSB0byBkbyB0aGlzIEknbSBzdXJlICAgIAotICAgICAgLy8gaGVyZSBJIGludGVudGlhbGx5IGNhdXNlIGFuIGV4Y2VwdGlvbi4uLiAKLSAgICAgIFN0cmluZyB4ID0gbnVsbDsKLSAgICAgIHgubGVuZ3RoKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL2V0b29sNTAvY2F0YWxvZ0VudHJ5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9jYXRhbG9nRW50cnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjViMjgwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9jYXRhbG9nRW50cnkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL25leHRDYXRhbG9nLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvZXRvb2w1MC9uZXh0Q2F0YWxvZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhOTM0YjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9ldG9vbDUwL25leHRDYXRhbG9nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZW50cnlfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZW50cnlfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWEwZmYzMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2VudHJ5X29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfZXhwYW5kLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZmlsZV9leHBhbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY5YmFhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvZmlsZV9leHBhbmQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vYmoxNi9maWxlX29iai5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDYxMTYxYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L2ZpbGVfb2JqLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYvbmV4dENhdGFsb2dfb2JqLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRiZmU3OS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L25leHRDYXRhbG9nX29iai5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLWNhdGFsb2cvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jYXRhbG9nL2ljb25zL29iajE2L3htbGNhdGFsb2dfb2JqLmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjE0NDFmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb2JqMTYveG1sY2F0YWxvZ19vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vdnIxNi9lcnJvci1vdmVybGF5LmdpZiBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtY2F0YWxvZy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NhdGFsb2cvaWNvbnMvb3ZyMTYvZXJyb3Itb3ZlcmxheS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWRjY2MuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1jYXRhbG9nL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY2F0YWxvZy9pY29ucy9vdnIxNi9lcnJvci1vdmVybGF5LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0RPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0RPTVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0ZDliYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9ET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXMuRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkNEQVRBU2VjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5Db21tZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVudGl0eVJlZmVyZW5jZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLWltcG9ydCBvcmcudzNjLmRvbS5UZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEhBQ0sgPSAiaGFjayI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5KCkgewotCX0KLQotCXB1YmxpYyBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUF0dHJpYnV0ZVByb3BlcnR5RGVzY3JpcHRvcihBdHRyIGF0dHIpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCi0JCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gYXR0ci5nZXROYW1lKCk7Ci0KLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoYXR0ci5nZXRPd25lckRvY3VtZW50KCkpOwotCi0JCWlmIChtcSAhPSBudWxsKSB7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkID0gbXEuZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihhdHRyKTsKLQkJCWlmIChhZCAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nW10gdmFsdWVzQXJyYXkgPSBtcS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKGF0dHIuZ2V0T3duZXJFbGVtZW50KCksIGFkKTsKLQkJCQlpZiAodmFsdWVzQXJyYXkgIT0gbnVsbCAmJiB2YWx1ZXNBcnJheS5sZW5ndGggPiAwKSB7Ci0JCQkJCXJlc3VsdCA9IG5ldyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUsIHZhbHVlc0FycmF5KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCXJlc3VsdCA9IGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0cmlidXRlTmFtZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVDREFUQVNlY3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoQ0RBVEFTZWN0aW9uIGNkYXRhU2VjdGlvbikgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVDb21tZW50UHJvcGVydHlEZXNjcmlwdG9yKENvbW1lbnQgY29tbWVudCkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKFN0cmluZyBhdHRyaWJ1dGVOYW1lKSB7Ci0JCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUpOwotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVEb2N1bWVudFR5cGVQcm9wZXJ0eURlc2NyaXB0b3IoRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSkgewotCQlyZXR1cm4gbnVsbDsgLy8gbmV3IFRleHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSywgSEFDSyk7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRW50aXR5UmVmZXJlbmNlUHJvcGVydHlEZXNjcmlwdG9yKEVudGl0eVJlZmVyZW5jZSBlbnRpdHlSZWZlcmVuY2UpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvY2Vzc2luZ0luc3RydWN0aW9uUHJvcGVydHlEZXNjcmlwdG9yKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihIQUNLKTsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IG9iamVjdCkgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlQXR0cmlidXRlUHJvcGVydHlEZXNjcmlwdG9yKChBdHRyKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUNEQVRBU2VjdGlvblByb3BlcnR5RGVzY3JpcHRvcigoQ0RBVEFTZWN0aW9uKSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IGNyZWF0ZUNvbW1lbnRQcm9wZXJ0eURlc2NyaXB0b3IoKENvbW1lbnQpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlRG9jdW1lbnRUeXBlUHJvcGVydHlEZXNjcmlwdG9yKChEb2N1bWVudFR5cGUpIG5vZGUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJcmVzdWx0ID0gY3JlYXRlRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcigoRWxlbWVudCkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVFbnRpdHlSZWZlcmVuY2VQcm9wZXJ0eURlc2NyaXB0b3IoKEVudGl0eVJlZmVyZW5jZSkgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25Qcm9wZXJ0eURlc2NyaXB0b3IoKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKChUZXh0KSBub2RlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihUZXh0IHRleHQpIHsKLQkJcmV0dXJuIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoSEFDSyk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0lEZXNpZ25WaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL0lEZXNpZ25WaWV3ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU2OTQwNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURlc2lnblZpZXdlciB7Ci0JcHVibGljIENvbnRyb2wgZ2V0Q29udHJvbCgpOwotCi0JU3RyaW5nIGdldFRpdGxlKCk7Ci0KLQl2b2lkIHNldERvY3VtZW50KElEb2N1bWVudCBkb2N1bWVudCk7Ci0JCi0JSVNlbGVjdGlvblByb3ZpZGVyIGdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNDVmNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9JRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotCi0KLXB1YmxpYyBpbnRlcmZhY2UgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQlwdWJsaWMgdm9pZCBpbml0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zKElBY3Rpb25CYXJzIGJhcnMpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9Tb3VyY2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzBlMWVlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFyczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuRXh0ZW5kZWRFZGl0b3JBY3Rpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuSUV4dGVuZGVkQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQotcHVibGljIGNsYXNzIFNvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgaW1wbGVtZW50cyBJRXh0ZW5kZWRDb250cmlidXRvciB7Ci0KLQlwcm90ZWN0ZWQgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yID0gbnVsbDsKLQlwcm90ZWN0ZWQgSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yID0gbnVsbDsKLQlwcm90ZWN0ZWQgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCBtdWx0aVBhZ2VFZGl0b3IgPSBudWxsOwotCi0JLy8gRWRpdG9yRXh0ZW5zaW9uCi0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVESVRPUl9JRCA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpLlhNTE11bHRpUGFnZUVkaXRvclBhcnQiOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBJRXh0ZW5kZWRDb250cmlidXRvciBleHRlbmRlZENvbnRyaWJ1dG9yOwotCi0JcHVibGljIFNvdXJjZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCQlzdXBlcigpOwotCi0JCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yID0gbmV3IFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcigpOwotCi0JCS8vIFJlYWQgYWN0aW9uIGV4dGVuc2lvbnMuCi0JCUV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IEV4dGVuZGVkRWRpdG9yQWN0aW9uQnVpbGRlcigpOwotCQlleHRlbmRlZENvbnRyaWJ1dG9yID0gYnVpbGRlci5yZWFkQWN0aW9uRXh0ZW5zaW9ucyhFRElUT1JfSUQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0KGFjdGlvbkJhcnMpOwotCi0JCWlmIChhY3Rpb25CYXJzICE9IG51bGwpIHsKLQkJCWluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihhY3Rpb25CYXJzKTsKLQkJCWluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihhY3Rpb25CYXJzKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsKQotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcihJQWN0aW9uQmFycyBhY3Rpb25CYXJzKSB7Ci0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsKQotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IuaW5pdChhY3Rpb25CYXJzLCBnZXRQYWdlKCkpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLmRpc3Bvc2UoKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKQotCQkJZXh0ZW5kZWRDb250cmlidXRvci5kaXNwb3NlKCk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJc3VwZXIuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQotCQlhZGRUb01lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvTWVudShtZW51KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIElFeHRlbmRlZENvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1BvcHVwTWVudShJTWVudU1hbmFnZXIpCi0JICovCi0JcHVibGljIGZpbmFsIHZvaWQgY29udHJpYnV0ZVRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0KLQkJYWRkVG9Qb3B1cE1lbnUobWVudSk7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvUG9wdXBNZW51KG1lbnUpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFRvUG9wdXBNZW51KElNZW51TWFuYWdlciBtZW51KSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI2NvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyKQotCSAqLwotCXB1YmxpYyBmaW5hbCB2b2lkIGNvbnRyaWJ1dGVUb1Rvb2xCYXIoSVRvb2xCYXJNYW5hZ2VyIHRvb2xCYXJNYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1Rvb2xCYXIodG9vbEJhck1hbmFnZXIpOwotCi0JCWFkZFRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0KLQkJaWYgKGV4dGVuZGVkQ29udHJpYnV0b3IgIT0gbnVsbCkKLQkJCWV4dGVuZGVkQ29udHJpYnV0b3IuY29udHJpYnV0ZVRvVG9vbEJhcih0b29sQmFyTWFuYWdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9Ub29sQmFyKElUb29sQmFyTWFuYWdlciB0b29sQmFyTWFuYWdlcikgewotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5FZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlcikKLQkgKi8KLQlwdWJsaWMgZmluYWwgdm9pZCBjb250cmlidXRlVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JCXN1cGVyLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0KLQkJYWRkVG9TdGF0dXNMaW5lKG1hbmFnZXIpOwotCi0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLmNvbnRyaWJ1dGVUb1N0YXR1c0xpbmUobWFuYWdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYWRkVG9TdGF0dXNMaW5lKElTdGF0dXNMaW5lTWFuYWdlciBtYW5hZ2VyKSB7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBJRXh0ZW5kZWRDb250cmlidXRvciN1cGRhdGVUb29sYmFyQWN0aW9ucygpCi0JICovCi0JcHVibGljIHZvaWQgdXBkYXRlVG9vbGJhckFjdGlvbnMoKSB7Ci0JCWlmIChleHRlbmRlZENvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlleHRlbmRlZENvbnRyaWJ1dG9yLnVwZGF0ZVRvb2xiYXJBY3Rpb25zKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQkvLyBzYXZlIG11bHRpUGFnZUVkaXRvciBiZWZvcmUgY2FsbGluZwotCQkvLyBzdXBlci5zZXRBY3RpdmVFZGl0b3IodGFyZ2V0RWRpdG9yKQotCQkvLyBzdXBlci5zZXRBY3RpdmVFZGl0b3Igd2lsbCBjYWxsIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQKLQkJLy8gYWN0aXZlRWRpdG9yKQotCQkvLyBtdWx0aVBhZ2VFZGl0b3IgaXMgbmVlZGVkIGluIHNldEFjdGl2ZVBhZ2UoSUVkaXRvclBhcnQKLQkJLy8gYWN0aXZlRWRpdG9yKQotCQlpZiAodGFyZ2V0RWRpdG9yIGluc3RhbmNlb2YgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkKLQkJCW11bHRpUGFnZUVkaXRvciA9IChYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB0YXJnZXRFZGl0b3I7Ci0KLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKHRhcmdldEVkaXRvcik7Ci0KLQkJdXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQotCQlpZiAoZXh0ZW5kZWRDb250cmlidXRvciAhPSBudWxsKQotCQkJZXh0ZW5kZWRDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IodGFyZ2V0RWRpdG9yKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVQYWdlKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQkvLyBUaGlzIGNvbnRyaWJ1dG9yIGlzIGRlc2lnbmVkIGZvciBTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQuCi0JCS8vIFRvIHNhZmUtZ3VhcmQgdGhpcyBmcm9tIHByb2JsZW1zIGNhdXNlZCBieSB1bmV4cGVjdGVkIHVzYWdlIGJ5Ci0JCS8vIG90aGVyIGVkaXRvcnMsIHRoZSBmb2xsb3dpbmcKLQkJLy8gY2hlY2sgaXMgYWRkZWQuCi0JCWlmIChtdWx0aVBhZ2VFZGl0b3IgIT0gbnVsbCkgewotCQkJaWYgKGFjdGl2ZUVkaXRvciAhPSBudWxsICYmIGFjdGl2ZUVkaXRvciBpbnN0YW5jZW9mIFN0cnVjdHVyZWRUZXh0RWRpdG9yKQotCQkJCWFjdGl2YXRlU291cmNlUGFnZShhY3RpdmVFZGl0b3IpOwotCQkJZWxzZQotCQkJCWFjdGl2YXRlRGVzaWduUGFnZShhY3RpdmVFZGl0b3IpOwotCQl9Ci0KLQkJdXBkYXRlVG9vbGJhckFjdGlvbnMoKTsKLQotCQlJQWN0aW9uQmFycyBhY3Rpb25CYXJzID0gZ2V0QWN0aW9uQmFycygpOwotCQlpZiAoYWN0aW9uQmFycyAhPSBudWxsKSB7Ci0JCQkvLyB1cGRhdGUgbWVudSBiYXIgYW5kIHRvb2wgYmFyCi0JCQlhY3Rpb25CYXJzLnVwZGF0ZUFjdGlvbkJhcnMoKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRGVzaWduUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwgJiYgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCWRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQl9Ci0KLQkJaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwgJiYgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCS8vIGlmIGRlc2lnbiBwYWdlIGlzIG5vdCByZWFsbHkgYW4gSUVkaXRvclBhcnQsIGFjdGl2ZUVkaXRvciA9PQotCQkJLy8gbnVsbCwgc28gcGFzcyBpbiBtdWx0aVBhZ2VFZGl0b3IgaW5zdGVhZCAoZDI4MjQxNCkKLQkJCWlmIChhY3RpdmVFZGl0b3IgPT0gbnVsbCkgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJCX0KLQkJCSgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChmYWxzZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsICYmIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJfQotCi0JCWlmIChzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciAhPSBudWxsICYmIHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJCSgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZCh0cnVlKTsKLQkJfQotCX0KLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1NvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODNjMjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BY3Rpb25Db250cmlidXRvclhNTDsKLQotCi0vKioKLSAqIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIGlzIGZvciBtdWx0aSBwYWdlIGVkaXRvcidzIHNvdXJjZSBwYWdlIGNvbnRyaWJ1dG9yLgotICogCi0gKiBVc2UgWE1MRWRpdG9yQWN0aW9uQ29udHJpYnV0b3IgZm9yIHNpbmdsZSBwYWdlIGVkaXRvci4KLSAqLwotcHVibGljIGNsYXNzIFNvdXJjZVBhZ2VBY3Rpb25Db250cmlidXRvciBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yWE1MIHsKLQotCXByaXZhdGUgSUFjdGlvbkJhcnMgZkJhcnM7Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBjYWxsczoKLQkgKiA8dWw+Ci0JICogPGxpPjxjb2RlPmNvbnRyaWJ1dGVUb01lbnU8L2NvZGU+IHdpdGggPGNvZGU+YmFyczwvY29kZT4nIG1lbnUKLQkgKiBtYW5hZ2VyPC9saT4KLQkgKiA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvVG9vbEJhcjwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicgdG9vbAotCSAqIGJhciBtYW5hZ2VyPC9saT4KLQkgKiA8bGk+PGNvZGU+Y29udHJpYnV0ZVRvU3RhdHVzTGluZTwvY29kZT4gd2l0aCA8Y29kZT5iYXJzPC9jb2RlPicKLQkgKiBzdGF0dXMgbGluZSBtYW5hZ2VyPC9saT4KLQkgKiA8L3VsPgotCSAqIFRoZSBnaXZlbiBhY3Rpb24gYmFycyBhcmUgYWxzbyByZW1lbWJlcmVkIGFuZCBtYWRlIGFjY2Vzc2libGUgdmlhCi0JICogPGNvZGU+Z2V0QWN0aW9uQmFyczwvY29kZT4uCi0JICogCi0JICogQHBhcmFtIGJhcnMKLQkgKiAgICAgICAgICAgIHRoZSBhY3Rpb24gYmFycwotCSAqICAKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGJhcnMpIHsKLQkJZkJhcnMgPSBiYXJzOwotCQljb250cmlidXRlVG9NZW51KGJhcnMuZ2V0TWVudU1hbmFnZXIoKSk7Ci0JCWNvbnRyaWJ1dGVUb1Rvb2xCYXIoYmFycy5nZXRUb29sQmFyTWFuYWdlcigpKTsKLQkJY29udHJpYnV0ZVRvU3RhdHVzTGluZShiYXJzLmdldFN0YXR1c0xpbmVNYW5hZ2VyKCkpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhpcyBjb250cmlidXRvcidzIGFjdGlvbiBiYXJzLgotCSAqIAotCSAqIEByZXR1cm4gdGhlIGFjdGlvbiBiYXJzCi0JICovCi0JcHVibGljIElBY3Rpb25CYXJzIGdldEFjdGlvbkJhcnMoKSB7Ci0JCXJldHVybiBmQmFyczsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUNvbnRlbnRIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1RyZWVDb250ZW50SGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NjU3ZmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUNvbnRlbnRIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NV3JpdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQ2hhcmFjdGVyRGF0YTsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotLyoqCi0gKiBUaGlzIHBlcmZvcm1zIHRoZSB3b3JrIG9mIHRha2luZyBhIERPTSB0cmVlIGFuZCBjb252ZXJ0aW5nIGl0IHRvIGEKLSAqIGRpc3BsYXlhYmxlICdVSScgdHJlZS4KLSAqIAotICogRm9yIGV4YW1wbGUgOiAtIHdoaXRlIHNwYWNlIHRleHQgbm9kZXMgYXJlIG9tbWl0ZWQgZnJvbSB0aGUgJ1VJJyB0cmVlIC0KLSAqIGFkamFjZW50IFRleHQgYW5kIEVudGl0eVJlZmVyZW5jZSBub2RlcyBhcmUgY29tYmluZWQgaW50byBhIHNpbmdsZSAnVUknCi0gKiBub2RlIC0gRWxlbWVudHMgd2l0aCAndGV4dCBvbmx5JyBjaGlsZHJlbiBhcmUgZGlwbGF5ZWQgd2l0aG91dCBjaGlsZHJlbgotICogIAotICovCi1wdWJsaWMgY2xhc3MgVHJlZUNvbnRlbnRIZWxwZXIgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElERV9XSElURV9TUEFDRV9URVhUX05PREVTID0gODsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT01CSU5FX0FESkFDRU5UX1RFWFRfQU5EX0VOVElUWV9SRUZFUkVOQ0VTID0gMTY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVMgPSAzMjsKLQotCXByb3RlY3RlZCBpbnQgc3R5bGUgPSBISURFX1dISVRFX1NQQUNFX1RFWFRfTk9ERVMgfCBDT01CSU5FX0FESkFDRU5UX1RFWFRfQU5EX0VOVElUWV9SRUZFUkVOQ0VTIHwgSElERV9FTEVNRU5UX0NISUxEX1RFWFRfTk9ERVM7Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaGFzU3R5bGVGbGFnKGludCBmbGFnKSB7Ci0JCXJldHVybiAoc3R5bGUgJiBmbGFnKSAhPSAwOwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJT2JqZWN0W10gcmVzdWx0ID0gbnVsbDsKLQotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBlbGVtZW50OwotCQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJYm9vbGVhbiB0ZXh0Q29udGVudE9ubHkgPSB0cnVlOwotCi0JCQlOYW1lZE5vZGVNYXAgbWFwID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlpZiAobWFwICE9IG51bGwpIHsKLQkJCQlpbnQgbGVuZ3RoID0gbWFwLmdldExlbmd0aCgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLQkJCQkJbGlzdC5hZGQobWFwLml0ZW0oaSkpOwotCQkJCQl0ZXh0Q29udGVudE9ubHkgPSBmYWxzZTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCU5vZGUgcHJldkluY2x1ZGVkTm9kZSA9IG51bGw7Ci0JCQlmb3IgKE5vZGUgY2hpbGROb2RlID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkTm9kZSAhPSBudWxsOyBjaGlsZE5vZGUgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWludCBjaGlsZE5vZGVUeXBlID0gY2hpbGROb2RlLmdldE5vZGVUeXBlKCk7Ci0JCQkJYm9vbGVhbiBpbmNsdWRlTm9kZSA9IHRydWU7Ci0KLQkJCQlpZiAoaW5jbHVkZU5vZGUgJiYgaGFzU3R5bGVGbGFnKEhJREVfV0hJVEVfU1BBQ0VfVEVYVF9OT0RFUykpIHsKLQkJCQkJaWYgKGlzSWdub3JhYmxlVGV4dChjaGlsZE5vZGUpKSB7Ci0JCQkJCQkvLyBmaWx0ZXIgb3V0IHRoZSBpZ25vcmFibGUgdGV4dCBub2RlCi0JCQkJCQlpbmNsdWRlTm9kZSA9IGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJaWYgKGluY2x1ZGVOb2RlICYmIGhhc1N0eWxlRmxhZyhDT01CSU5FX0FESkFDRU5UX1RFWFRfQU5EX0VOVElUWV9SRUZFUkVOQ0VTKSkgewotCQkJCQlpZiAoaXNUZXh0T3JFbnRpdHlSZWZlcmVuY2VOb2RlKGNoaWxkTm9kZSkgJiYgcHJldkluY2x1ZGVkTm9kZSAhPSBudWxsICYmIGlzVGV4dE9yRW50aXR5UmVmZXJlbmNlTm9kZShwcmV2SW5jbHVkZWROb2RlKSkgewotCQkJCQkJLy8gd2Ugb25seSBzaG93IHRoZSBmaXJzdCBvZiBhIGxpc3Qgb2YgYWRqYWNlbnQgdGV4dAotCQkJCQkJLy8gb3IgZW50aXR5IHJlZmVyZW5jZSBub2RlIGluIHRoZSB0cmVlCi0JCQkJCQkvLyBzbyB3ZSBmaWx0ZXIgb3V0IHRoaXMgc3Vic2VxdWVudCBvbmUKLQkJCQkJCWluY2x1ZGVOb2RlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoaGFzU3R5bGVGbGFnKEhJREVfRUxFTUVOVF9DSElMRF9URVhUX05PREVTKSkgewotCQkJCQlpZiAoY2hpbGROb2RlVHlwZSAhPSBOb2RlLlRFWFRfTk9ERSAmJiBjaGlsZE5vZGVUeXBlICE9IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJCQl0ZXh0Q29udGVudE9ubHkgPSBmYWxzZTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmIChpbmNsdWRlTm9kZSkgewotCQkJCQlsaXN0LmFkZChjaGlsZE5vZGUpOwotCQkJCQlwcmV2SW5jbHVkZWROb2RlID0gY2hpbGROb2RlOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGhhc1N0eWxlRmxhZyhISURFX0VMRU1FTlRfQ0hJTERfVEVYVF9OT0RFUykgJiYgdGV4dENvbnRlbnRPbmx5KSB7Ci0JCQkJcmVzdWx0ID0gbmV3IE9iamVjdFswXTsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gbGlzdC50b0FycmF5KCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNUZXh0T3JFbnRpdHlSZWZlcmVuY2VOb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFIHx8IG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGVUZXh0KE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7Ci0JCQlTdHJpbmcgZGF0YSA9ICgoVGV4dCkgbm9kZSkuZ2V0RGF0YSgpOwotCQkJcmVzdWx0ID0gKGRhdGEgPT0gbnVsbCB8fCBkYXRhLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbWJpbmVkVGV4dE5vZGUoTm9kZSBub2RlKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCU5vZGUgbmV4dE5vZGUgPSBub2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQlpZiAobmV4dE5vZGUgIT0gbnVsbCkgewotCQkJCWlmIChuZXh0Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgewotCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgTGlzdCBnZXRDb21iaW5lZFRleHROb2RlTGlzdChOb2RlIHRoZU5vZGUpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotCQlib29sZWFuIHByZXZJc0VudGl0eSA9IGZhbHNlOwotCQlmb3IgKE5vZGUgbm9kZSA9IHRoZU5vZGU7IG5vZGUgIT0gbnVsbDsgbm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJcHJldklzRW50aXR5ID0gdHJ1ZTsKLQkJCQlsaXN0LmFkZChub2RlKTsKLQkJCX0gZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUgJiYgKHByZXZJc0VudGl0eSB8fCBub2RlID09IHRoZU5vZGUpKSB7Ci0JCQkJcHJldklzRW50aXR5ID0gZmFsc2U7Ci0JCQkJbGlzdC5hZGQobm9kZSk7Ci0JCQl9IGVsc2UgewotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFRleHRWYWx1ZShFbGVtZW50IGVsZW1lbnQpIAotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IF9nZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0gICAgICByZXR1cm4gbGlzdCAhPSBudWxsID8gZ2V0VmFsdWVGb3JUZXh0Q29udGVudChsaXN0KSA6IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHNldEVsZW1lbnRUZXh0VmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdmFsdWUpCi0gICAgewotICAgICAgc2V0RWxlbWVudE5vZGVWYWx1ZShlbGVtZW50LCB2YWx1ZSk7ICAgICAgCi0gICAgfQotICAgIAotICAgIHByaXZhdGUgTGlzdCBfZ2V0RWxlbWVudFRleHRDb250ZW50KEVsZW1lbnQgZWxlbWVudCkgewotICAgICAgICBMaXN0IHJlc3VsdCA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChOb2RlIG5vZGUgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgbm9kZSAhPSBudWxsOyBub2RlID0gbm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0gICAgICAgICAgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSB8fCBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpIHsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXN1bHQuYWRkKG5vZGUpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBudWxsOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9ICAgICAgIAotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotCS8qKgotCSAqIElmIHRoZSBlbGVtZW50IGlzIGhhcyAndGV4dCBvbmx5JyBjb250ZW50IHRoaXMgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZQotCSAqIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBjb21wb3NlIHRoZSB0ZXh0IG9ubHkgY29udGVudAotCSAqLwotCXB1YmxpYyBMaXN0IGdldEVsZW1lbnRUZXh0Q29udGVudChFbGVtZW50IGVsZW1lbnQpIHsKLQkJTGlzdCByZXN1bHQgPSBudWxsOwotCQlpZiAoIWVsZW1lbnQuaGFzQXR0cmlidXRlcygpKSB7Ci0JCQlyZXN1bHQgPSBfZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0gICAgCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Tm9kZVZhbHVlKE5vZGUgbm9kZSkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gKChBdHRyKSBub2RlKS5nZXRWYWx1ZSgpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJcmVzdWx0ID0gKChDaGFyYWN0ZXJEYXRhKSBub2RlKS5nZXREYXRhKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDogewotCQkJCXJlc3VsdCA9IGdldERvY3VtZW50VHlwZVZhbHVlKChEb2N1bWVudFR5cGUpIG5vZGUpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSBnZXRFbGVtZW50Tm9kZVZhbHVlKChFbGVtZW50KSBub2RlKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCXJlc3VsdCA9IGdldFRleHROb2RlVmFsdWUobm9kZSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCXJlc3VsdCA9ICgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKS5nZXREYXRhKCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIHZvaWQgc2V0Tm9kZVZhbHVlKE5vZGUgbm9kZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCWludCBub2RlVHlwZSA9IG5vZGUuZ2V0Tm9kZVR5cGUoKTsKLQkJdHJ5IHsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOiB7Ci0JCQkJCSgoQXR0cikgbm9kZSkuc2V0VmFsdWUodmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6Ci0JCQkJLy8gZHJvcCB0aHJ1Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJKChDaGFyYWN0ZXJEYXRhKSBub2RlKS5zZXREYXRhKHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJCXNldEVsZW1lbnROb2RlVmFsdWUoKEVsZW1lbnQpIG5vZGUsIHZhbHVlKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJCS8vIGRyb3AgdGhydQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCXNldFRleHROb2RlVmFsdWUobm9kZSwgdmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJKChQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24pIG5vZGUpLnNldERhdGEodmFsdWUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0gY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQlEaXNwbGF5IGQgPSBnZXREaXNwbGF5KCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWQuYmVlcCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RG9jdW1lbnRUeXBlVmFsdWUoRG9jdW1lbnRUeXBlIGRvY3VtZW50VHlwZSkgewotCQlyZXR1cm4gRE9NV3JpdGVyLmdldERvY3VtZW50VHlwZURhdGEoZG9jdW1lbnRUeXBlKTsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRFbGVtZW50Tm9kZVZhbHVlKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBnZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVsZW1lbnROb2RlVmFsdWUoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgdmFsdWUpIHsKLQkJTGlzdCBsaXN0ID0gZ2V0RWxlbWVudFRleHRDb250ZW50KGVsZW1lbnQpOwotCQlpZiAobGlzdCAhPSBudWxsKSB7Ci0JCQlzZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QsIHZhbHVlKTsKLQkJfSBlbHNlIHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gZWxlbWVudC5nZXRPd25lckRvY3VtZW50KCk7Ci0JCQlUZXh0IHRleHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7Ci0JCQllbGVtZW50LmFwcGVuZENoaWxkKHRleHQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0VGV4dE5vZGVWYWx1ZShOb2RlIG5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0JCWlmIChpc0NvbWJpbmVkVGV4dE5vZGUobm9kZSkpIHsKLQkJCWxpc3QgPSBnZXRDb21iaW5lZFRleHROb2RlTGlzdChub2RlKTsKLQkJfSBlbHNlIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQlsaXN0LmFkZChub2RlKTsKLQkJfQotCQlyZXN1bHQgPSBnZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRUZXh0Tm9kZVZhbHVlKE5vZGUgbm9kZSwgU3RyaW5nIHZhbHVlKSB7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0JCWlmIChpc0NvbWJpbmVkVGV4dE5vZGUobm9kZSkpIHsKLQkJCWxpc3QgPSBnZXRDb21iaW5lZFRleHROb2RlTGlzdChub2RlKTsKLQkJfSBlbHNlIHsKLQkJCWxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCQlsaXN0LmFkZChub2RlKTsKLQkJfQotCQlzZXRWYWx1ZUZvclRleHRDb250ZW50KGxpc3QsIHZhbHVlKTsKLQl9Ci0KLQlwdWJsaWMgVGV4dCBnZXRFZmZlY3RpdmVUZXh0Tm9kZUZvckNvbWJpbmVkTm9kZUxpc3QoTGlzdCBsaXN0KSB7Ci0JCVRleHQgcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQlyZXN1bHQgPSAoVGV4dCkgbm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbHVlRm9yVGV4dENvbnRlbnQoTGlzdCBsaXN0KSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAobGlzdC5zaXplKCkgPiAwKSB7Ci0JCQlJRE9NTm9kZSBmaXJzdCA9IChJRE9NTm9kZSkgbGlzdC5nZXQoMCk7Ci0JCQlJRE9NTm9kZSBsYXN0ID0gKElET01Ob2RlKSBsaXN0LmdldChsaXN0LnNpemUoKSAtIDEpOwotCQkJSURPTU1vZGVsIG1vZGVsID0gZmlyc3QuZ2V0TW9kZWwoKTsKLQkJCWludCBzdGFydCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLQkJCXRyeSB7Ci0JCQkJcmVzdWx0ID0gbW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQl9IGNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJfQotCQl9Ci0KLQkJLy8gd2UgdHJpbSB0aGUgY29udGVudCBzbyB0aGF0IGl0IGxvb2tzIG5pY2Ugd2hlbiB2aWV3ZWQKLQkJLy8gd2UgbmVlZCB0byBiZSBjYXJmdWxsIHRvIHByZXNlcnZlIHRoZSAndHJpbW1lZCcgdGV4dCB3aGVuIHRoZSB2YWx1ZQotCQkvLyBpcyBzZXQgKHNlZSBzZXRWYWx1ZUZvclRleHRDb250ZW50KQotCQlpZiAocmVzdWx0ICE9IG51bGwpIHsKLQkJCXJlc3VsdCA9IHJlc3VsdC50cmltKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0VmFsdWVGb3JUZXh0Q29udGVudChMaXN0IGxpc3QsIFN0cmluZyB2YWx1ZSkgewotCQkvL1N0cmluZyBvbGRWYWx1ZSA9IGdldFZhbHVlRm9yVGV4dENvbnRlbnQoKTsKLQkJLy8gd2Ugd29ycnkgYWJvdXQgcHJlc2VydmluZyB0cmltbWVkIHRleHQKLQkJaWYgKGxpc3Quc2l6ZSgpID4gMCkgewotCQkJSURPTU5vZGUgZmlyc3QgPSAoSURPTU5vZGUpIGxpc3QuZ2V0KDApOwotCQkJSURPTU5vZGUgbGFzdCA9IChJRE9NTm9kZSkgbGlzdC5nZXQobGlzdC5zaXplKCkgLSAxKTsKLQkJCWludCBzdGFydCA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLQkJCWZpcnN0LmdldE1vZGVsKCkuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkucmVwbGFjZVRleHQodGhpcywgc3RhcnQsIGVuZCAtIHN0YXJ0LCB2YWx1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNFZGl0YWJsZShOb2RlIG5vZGUpIHsKLQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlzd2l0Y2ggKG5vZGVUeXBlKSB7Ci0JCQljYXNlIE5vZGUuQVRUUklCVVRFX05PREUgOgotCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDoKLQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6Ci0JCQkvLyBkcm9wIHRocnUKLQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOgotCQkJLy8gZHJvcCB0aHJ1Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCS8vIGRyb3AgdGhydQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQlyZXN1bHQgPSBnZXRFbGVtZW50VGV4dENvbnRlbnQoKEVsZW1lbnQpIG5vZGUpICE9IG51bGwgfHwgbm9kZS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkgPT0gMDsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9UcmVlRXh0ZW5zaW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9UcmVlRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMDNkOTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvVHJlZUV4dGVuc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5DZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNlbGxFZGl0b3JMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLkZvY3VzRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Gb2N1c0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLktleUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuS2V5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VNb3ZlTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5QYWludEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuUGFpbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5DdXJzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2Nyb2xsQmFyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0KLXB1YmxpYyBjbGFzcyBUcmVlRXh0ZW5zaW9uIGltcGxlbWVudHMgUGFpbnRMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgVHJlZSBmVHJlZTsKLQlwcm90ZWN0ZWQgRWRpdE1hbmFnZXIgZWRpdE1hbmFnZXI7Ci0JcHJvdGVjdGVkIFN0cmluZ1tdIGZDb2x1bW5Qcm9wZXJ0aWVzOwotCXByb3RlY3RlZCBJQ2VsbE1vZGlmaWVyIGNlbGxNb2RpZmllcjsKLQlwcm90ZWN0ZWQgaW50IGNvbHVtblBvc2l0aW9uID0gMzAwOwotCXByb3RlY3RlZCBpbnQgY29sdW1uSGl0V2lkdGggPSA1OwotCXByb3RlY3RlZCBDb2xvciB0YWJsZUxpbmVDb2xvcjsKLQlwcm90ZWN0ZWQgaW50IGNvbnRyb2xXaWR0aDsKLQlwcm90ZWN0ZWQgRGVsYXllZERyYXdUaW1lciBkZWxheWVkRHJhd1RpbWVyOwotCXByaXZhdGUgYm9vbGVhbiBmaXNVbnN1cHBvcnRlZElucHV0ID0gZmFsc2U7Ci0KLQlwdWJsaWMgVHJlZUV4dGVuc2lvbihUcmVlIHRyZWUpIHsKLQkJdGhpcy5mVHJlZSA9IHRyZWU7Ci0JCUludGVybmFsTW91c2VMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJbnRlcm5hbE1vdXNlTGlzdGVuZXIoKTsKLQkJdHJlZS5hZGRNb3VzZU1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRyZWUuYWRkTW91c2VMaXN0ZW5lcihsaXN0ZW5lcik7Ci0JCXRyZWUuYWRkUGFpbnRMaXN0ZW5lcih0aGlzKTsKLQkJZWRpdE1hbmFnZXIgPSBuZXcgRWRpdE1hbmFnZXIodHJlZSk7Ci0JCWRlbGF5ZWREcmF3VGltZXIgPSBuZXcgRGVsYXllZERyYXdUaW1lcih0cmVlKTsKLQotCQl0YWJsZUxpbmVDb2xvciA9IHRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9XSURHRVRfTElHSFRfU0hBRE9XKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl0YWJsZUxpbmVDb2xvci5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q2VsbE1vZGlmaWVyKElDZWxsTW9kaWZpZXIgbW9kaWZpZXIpIHsKLQkJY2VsbE1vZGlmaWVyID0gbW9kaWZpZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRDYWNoZWREYXRhKCkgewotCQkvLyB0b2RvOiBzdXJlIHNlZW1zIHdlIHNob3VsZCByZXNldCBzb21ldGhpbmc/Ci0JfQotCi0JcHVibGljIElDZWxsTW9kaWZpZXIgZ2V0Q2VsbE1vZGlmaWVyKCkgewotCQlyZXR1cm4gY2VsbE1vZGlmaWVyOwotCX0KLQotCXB1YmxpYyBMaXN0IGdldEl0ZW1MaXN0KCkgewotCQlMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JCWdldEl0ZW1MaXN0SGVscGVyKGZUcmVlLmdldEl0ZW1zKCksIGxpc3QpOwotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZXRJdGVtTGlzdEhlbHBlcihUcmVlSXRlbVtdIGl0ZW1zLCBMaXN0IGxpc3QpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewotCQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJbGlzdC5hZGQoaXRlbSk7Ci0JCQlnZXRJdGVtTGlzdEhlbHBlcihpdGVtLmdldEl0ZW1zKCksIGxpc3QpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFRyZWVJdGVtIGdldFRyZWVJdGVtT25Sb3coaW50IHB4LCBpbnQgcHkpIHsKLQkJVHJlZUl0ZW0gcmVzdWx0ID0gbnVsbDsKLQkJTGlzdCBsaXN0ID0gZ2V0SXRlbUxpc3QoKTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCVRyZWVJdGVtIGl0ZW0gPSAoVHJlZUl0ZW0pIGkubmV4dCgpOwotCQkJUmVjdGFuZ2xlIHIgPSBpdGVtLmdldEJvdW5kcygpOwotCQkJaWYgKHIgIT0gbnVsbCAmJiBweCA+PSByLnggJiYgcHkgPj0gci55ICYmIHB5IDw9IHIueSArIHIuaGVpZ2h0KSB7Ci0JCQkJcmVzdWx0ID0gaXRlbTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBJbnRlcm5hbE1vdXNlTGlzdGVuZXIgZXh0ZW5kcyBNb3VzZUFkYXB0ZXIgaW1wbGVtZW50cyBNb3VzZU1vdmVMaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBpbnQgY29sdW1uRHJhZ2dlZCA9IC0xOwotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Rvd24gPSBmYWxzZTsKLQkJcHJvdGVjdGVkIGludCBwcmV2WCA9IC0xOwotCQlwcm90ZWN0ZWQgQ3Vyc29yIGN1cnNvciA9IG51bGw7Ci0KLQkJcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZSkgewotCQkJaWYgKGUueCA+IGNvbHVtblBvc2l0aW9uIC0gY29sdW1uSGl0V2lkdGggJiYgZS54IDwgY29sdW1uUG9zaXRpb24gKyBjb2x1bW5IaXRXaWR0aCkgewotCQkJCWlmIChjdXJzb3IgPT0gbnVsbCkgewotCQkJCQljdXJzb3IgPSBuZXcgQ3Vyc29yKGZUcmVlLmdldERpc3BsYXkoKSwgU1dULkNVUlNPUl9TSVpFV0UpOwotCQkJCQlmVHJlZS5zZXRDdXJzb3IoY3Vyc29yKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoY3Vyc29yICE9IG51bGwpIHsKLQkJCQkJZlRyZWUuc2V0Q3Vyc29yKG51bGwpOwotCQkJCQljdXJzb3IuZGlzcG9zZSgpOwotCQkJCQljdXJzb3IgPSBudWxsOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGNvbHVtbkRyYWdnZWQgIT0gLTEpIHsKLQkJCQkvLyB1c2luZyB0aGUgZGVsYXkgdGltZXIgd2lsbCBtYWtlIHJlZHJhd3MgbGVzcyBmbGlja2VyeQotCQkJCWlmIChlLnggPiAyMCkgewotCQkJCQljb2x1bW5Qb3NpdGlvbiA9IGUueDsKLQkJCQkJZGVsYXllZERyYXdUaW1lci5yZXNldCgyMCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJLy8gaGVyZSB3ZSBoYW5kbGUgdGhlIGNvbHVtbiByZXNpemluZyBieSBkZXRlY3QgaWYgdGhlIHVzZXIgaGFzCi0JCQkvLyBjbGljayBvbiBhIGNvbHVtbiBzZXBhcmF0b3IKLQkJCS8vCi0JCQljb2x1bW5EcmFnZ2VkID0gLTE7Ci0JCQllZGl0TWFuYWdlci5kZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCi0JCQlpZiAoZS54ID4gY29sdW1uUG9zaXRpb24gLSBjb2x1bW5IaXRXaWR0aCAmJiBlLnggPCBjb2x1bW5Qb3NpdGlvbiArIGNvbHVtbkhpdFdpZHRoKSB7Ci0JCQkJY29sdW1uRHJhZ2dlZCA9IDA7Ci0JCQl9Ci0KLQkJCS8vIGhlcmUgd2UgaGFuZGxlIHNlbGVjdGluZyB0cmVlIGl0ZW1zIHdoZW4gYW55IHRoaW5nIG9uIHRoZSAncm93JwotCQkJLy8gaXMgY2xpY2tlZAotCQkJLy8KLQkJCVRyZWVJdGVtIGl0ZW0gPSBmVHJlZS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpOwotCQkJaWYgKGl0ZW0gPT0gbnVsbCkgewotCQkJCWl0ZW0gPSBnZXRUcmVlSXRlbU9uUm93KGUueCwgZS55KTsKLQkJCQlpZiAoaXRlbSAhPSBudWxsKSB7Ci0JCQkJCVRyZWVJdGVtW10gaXRlbXMgPSBuZXcgVHJlZUl0ZW1bMV07Ci0JCQkJCWl0ZW1zWzBdID0gaXRlbTsKLQkJCQkJZlRyZWUuc2V0U2VsZWN0aW9uKGl0ZW1zKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb3VzZVVwKE1vdXNlRXZlbnQgZSkgewotCQkJY29sdW1uRHJhZ2dlZCA9IC0xOwotCQl9Ci0JfQotCi0JcHVibGljIFN0cmluZ1tdIGdldENvbHVtblByb3BlcnRpZXMoKSB7Ci0JCXJldHVybiBmQ29sdW1uUHJvcGVydGllczsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb2x1bW5Qcm9wZXJ0aWVzKFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLQkJdGhpcy5mQ29sdW1uUHJvcGVydGllcyA9IGNvbHVtblByb3BlcnRpZXM7Ci0JfQotCi0JcHVibGljIHZvaWQgcGFpbnRDb250cm9sKFBhaW50RXZlbnQgZXZlbnQpIHsKLQkJR0MgZ2MgPSBldmVudC5nYzsKLQkJUmVjdGFuZ2xlIHRyZWVCb3VuZHMgPSBmVHJlZS5nZXRCb3VuZHMoKTsKLQotCQljb250cm9sV2lkdGggPSB0cmVlQm91bmRzLndpZHRoOwotCQlDb2xvciBiZyA9IGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9CQUNLR1JPVU5EKTsKLQkJQ29sb3IgYmcyID0gZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX1NFTEVDVElPTik7Ci0KLQkJZ2Muc2V0QmFja2dyb3VuZChiZzIpOwotCi0JCS8vIC8vIFRoaXMgbmV4dCBwYXJ0IGNhdXNlcyBwcm9ibGVtcyBvbiBMSU5VWCwgc28gbGV0J3Mgbm90IGRvIGl0Ci0JCS8vIHRoZXJlCi0JCS8vIGlmIChCMkJIYWNrcy5JU19VTklYID09IGZhbHNlKSB7Ci0JCS8vIFRyZWVJdGVtW10gc2VsZWN0ZWRJdGVtcyA9IHRyZWUuZ2V0U2VsZWN0aW9uKCk7Ci0JCS8vIGlmIChzZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHsKLQkJLy8gZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCS8vIFRyZWVJdGVtIGl0ZW0gPSBzZWxlY3RlZEl0ZW1zW2ldOwotCQkvLyBSZWN0YW5nbGUgYm91bmRzID0gaXRlbS5nZXRCb3VuZHMoKTsKLQkJLy8gaWYgKGJvdW5kcyAhPSBudWxsKSB7Ci0JCS8vIGdjLmZpbGxSZWN0YW5nbGUoYm91bmRzLnggKyBib3VuZHMud2lkdGgsIGJvdW5kcy55LCBjb250cm9sV2lkdGgsCi0JCS8vIGJvdW5kcy5oZWlnaHQpOwotCQkvLyB9Ci0JCS8vIH0KLQkJLy8gfQotCQkvLyB9Ci0JCS8vCi0JCWlmICghZmlzVW5zdXBwb3J0ZWRJbnB1dCkgewotCQkJVHJlZUl0ZW1bXSBpdGVtcyA9IGZUcmVlLmdldEl0ZW1zKCk7Ci0JCQlpZiAoaXRlbXMubGVuZ3RoID4gMCkgewotCQkJCWdjLnNldEZvcmVncm91bmQodGFibGVMaW5lQ29sb3IpOwotCQkJCWdjLnNldEJhY2tncm91bmQoYmcpOwotCi0JCQkJZ2MuZmlsbFJlY3RhbmdsZShjb2x1bW5Qb3NpdGlvbiwgdHJlZUJvdW5kcy54LCB0cmVlQm91bmRzLndpZHRoLCB0cmVlQm91bmRzLmhlaWdodCk7Ci0KLQkJCQlSZWN0YW5nbGUgaXRlbUJvdW5kcyA9IGl0ZW1zWzBdLmdldEJvdW5kcygpOwotCQkJCWludCBoZWlnaHQgPSBjb21wdXRlVHJlZUl0ZW1IZWlnaHQoKTsKLQotCQkJCWlmIChpdGVtQm91bmRzICE9IG51bGwpIHsKLQkJCQkJLyoKLQkJCQkJICogQm91bmRzIHdpbGwgYmUgZm9yIHRoZSBmaXJzdCBpdGVtLCB3aGljaCB3aWxsIGVpdGhlciBiZQotCQkJCQkgKiB2aXNpYmxlIGF0IHRoZSB0b3Agb2YgdGhlIFRyZWUsIG9yIHNjcm9sbGVkIG9mZiB3aXRoCi0JCQkJCSAqIG5lZ2F0aXZlIHZhbHVlcwotCQkJCQkgKi8KLQkJCQkJaW50IHN0YXJ0WSA9IGl0ZW1Cb3VuZHMueTsKLQotCQkJCQkvKiBPbmx5IGRyYXcgbGluZXMgd2l0aGluIHRoZSBUcmVlIGJvdW5kYXJpZXMgKi8KLQkJCQkJZm9yIChpbnQgaSA9IHN0YXJ0WTsgaSA8IHRyZWVCb3VuZHMuaGVpZ2h0OyBpICs9IGhlaWdodCkgewotCQkJCQkJaWYgKGkgPj0gdHJlZUJvdW5kcy55KSB7Ci0JCQkJCQkJZ2MuZHJhd0xpbmUoMCwgaSwgdHJlZUJvdW5kcy53aWR0aCwgaSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZ2MuZHJhd0xpbmUoY29sdW1uUG9zaXRpb24sIDAsIGNvbHVtblBvc2l0aW9uLCB0cmVlQm91bmRzLmhlaWdodCk7Ci0JCQkJcGFpbnRJdGVtcyhnYywgaXRlbXMsIHRyZWVCb3VuZHMpOwotCi0JCQl9Ci0JCQllbHNlIHsKLQkJCQlhZGRFbXB0eVRyZWVNZXNzYWdlKGdjKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWFkZFVuYWJsZVRvUG9wdWxhdGVUcmVlTWVzc2FnZShnYyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGNvbXB1dGVUcmVlSXRlbUhlaWdodCgpIHsKLQkJaW50IHJlc3VsdCA9IC0xOwotCi0JCS8qCi0JCSAqIE9uIEdUSyB0cmVlLmdldEl0ZW1IZWlnaHQoKSBzZWVtcyB0byBsaWUgdG8gdXMuIEl0IHJlcG9ydHMgdGhhdCB0aGUKLQkJICogdHJlZSBpdGVtIG9jY3VwaWVzIGEgZmV3IHBpeGxlcyBsZXNzIHZlcnRpY2FsIHNwYWNlIHRoYW4gaXQgc2hvdWxkCi0JCSAqIChwb3NzaWJseSBiZWNhdXNlIG9mIHRoZSBpbWFnZSBoZWlnaHQgdnMuIHRoZSB0ZXh0IGhlaWdodD8pLiBUaGlzCi0JCSAqIGZvaWxzIG91ciBjb2RlIHRoYXQgZHJhd3MgdGhlICdyb3cnIGxpbmVzIHNpbmNlIHdlIGFzc3VtZSB0aGF0Ci0JCSAqIGxpbmVzIHNob3VsZCBiZSBkcmF3biBhdCAnaXRlbUhlaWdodCcgaW5jcmVtZW50cy4gRG9uJ3QgdHJ1c3QKLQkJICogZ2V0SXRlbUhlaWdodCgpIHRvIGNvbXB1dGUgdGhlIGluY3JlbWVudC4uLiBpbnN0ZWFkIGNvbXB1dGUgdGhlCi0JCSAqIHZhbHVlIGJhc2VkIG9uIGRpc3RhbmNlIGJldHdlZW4gdHdvIFRyZWVJdGVtcywgYW5kIHRoZW4gdXNlIHRoZQotCQkgKiBsYXJnZXIgdmFsdWUuCi0JCSAqIAotCQkgKiBUaGlzIHN0cmF0ZWd5IG9ubHkgd29ya3Mgb24gdHJlZXMgd2hlcmUgdGhlIGl0ZW1zIGFyZSBvZiBldmVuCi0JCSAqIGhlaWdodCwgaG93ZXZlciBidWcKLQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTExNzIwMSBpbmRpY2F0ZXMgdGhhdAotCQkgKiB0aGlzIGlzIG5vIGxvbmdlciBwcm9taXNlZCwgYXQgbGVhc3Qgb24gd2luMzIgYW5kIGxpa2VseSBvbiBvdGhlcgotCQkgKiBwbGF0Zm9ybXMgc29vbi4KLQkJICovCi0JCWlmIChmVHJlZS5nZXRJdGVtQ291bnQoKSA+IDApIHsKLQkJCVRyZWVJdGVtW10gaXRlbXMgPSBmVHJlZS5nZXRJdGVtcygpOwotCQkJUmVjdGFuZ2xlIGl0ZW1Cb3VuZHMgPSBpdGVtc1swXS5nZXRCb3VuZHMoKTsKLQotCQkJaWYgKGl0ZW1zWzBdLmdldEV4cGFuZGVkKCkpIHsKLQkJCQlUcmVlSXRlbVtdIGNoaWxkcmVuID0gaXRlbXNbMF0uZ2V0SXRlbXMoKTsKLQkJCQlpZiAoY2hpbGRyZW4ubGVuZ3RoID4gMCkgewotCQkJCQlyZXN1bHQgPSBjaGlsZHJlblswXS5nZXRCb3VuZHMoKS55IC0gaXRlbUJvdW5kcy55OwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGl0ZW1zLmxlbmd0aCA+IDEpIHsKLQkJCQlyZXN1bHQgPSBpdGVtc1sxXS5nZXRCb3VuZHMoKS55IC0gaXRlbUJvdW5kcy55OwotCQkJfQotCQl9Ci0KLQkJcmVzdWx0ID0gTWF0aC5tYXgoZlRyZWUuZ2V0SXRlbUhlaWdodCgpLCByZXN1bHQpOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEVtcHR5VHJlZU1lc3NhZ2UoR0MgZ2MpIHsKLQkJLy8gbm90aGluZyB0byBhZGQgaGVyZQotCX0KLQotCXByaXZhdGUgdm9pZCBhZGRVbmFibGVUb1BvcHVsYXRlVHJlZU1lc3NhZ2UoR0MgZ2MpIHsKLQkJLy8gaGVyZSB3ZSBwcmludCBhIG1lc3NhZ2Ugd2hlbiB0aGUgZG9jdW1lbnQgY2Fubm90IGJlIGRpc3BsYXllZCBqdXN0Ci0JCS8vIHRvIGdpdmUgdGhlCi0JCS8vIHVzZXIgYSB2aXN1YWwgY3VlCi0JCS8vIHNvIHRoYXQgdGhleSBrbm93IGhvdyB0byBwcm9jZWVkIHRvIGVkaXQgdGhlIGJsYW5rIHZpZXcKLQkJZ2Muc2V0Rm9yZWdyb3VuZChmVHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0JMQUNLKSk7Ci0JCWdjLnNldEJhY2tncm91bmQoZlRyZWUuZ2V0RGlzcGxheSgpLmdldFN5c3RlbUNvbG9yKFNXVC5DT0xPUl9MSVNUX0JBQ0tHUk9VTkQpKTsKLQkJZ2MuZHJhd1N0cmluZyhYTUxFZGl0b3JNZXNzYWdlcy5UcmVlRXh0ZW5zaW9uXzAsIDEwLCAxMCk7Ci0JfQotCi0Jdm9pZCBzZXRJc1Vuc3VwcG9ydGVkSW5wdXQoYm9vbGVhbiBpc1Vuc3VwcG9ydGVkKSB7Ci0JCWZpc1Vuc3VwcG9ydGVkSW5wdXQgPSBpc1Vuc3VwcG9ydGVkOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50SXRlbXMoR0MgZ2MsIFRyZWVJdGVtW10gaXRlbXMsIFJlY3RhbmdsZSB0cmVlQm91bmRzKSB7Ci0JCWlmIChpdGVtcyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJVHJlZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQkJUmVjdGFuZ2xlIGJvdW5kcyA9IGl0ZW0uZ2V0Qm91bmRzKCk7Ci0JCQkJCWlmIChib3VuZHMgIT0gbnVsbCkgewotCQkJCQkJaWYgKHRyZWVCb3VuZHMuaW50ZXJzZWN0cyhib3VuZHMpKSB7Ci0JCQkJCQkJcGFpbnRJdGVtKGdjLCBpdGVtLCBib3VuZHMpOwotCQkJCQkJfQotCQkJCQl9Ci0KLQkJCQkJLy8gZGVmZWN0IDI0MTAzOQotCQkJCQkvLwotCQkJCQlpZiAoaXRlbS5nZXRFeHBhbmRlZCgpKSB7Ci0JCQkJCQlwYWludEl0ZW1zKGdjLCBpdGVtLmdldEl0ZW1zKCksIHRyZWVCb3VuZHMpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRJdGVtKEdDIGdjLCBUcmVlSXRlbSBpdGVtLCBSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCS8vIG5vdGhpbmcgdG8gcGFpbnQKLQl9Ci0KLQlwdWJsaWMgaW50ZXJmYWNlIElDZWxsRWRpdG9yUHJvdmlkZXIgewotCQlDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IG8sIGludCBjb2wpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBpbXByb3ZlIGRyYXdpbmcgZHVyaW5nIGEgY29sdW1uIHJlc2l6ZS4KLQkgKi8KLQlwdWJsaWMgY2xhc3MgRGVsYXllZERyYXdUaW1lciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQkJcHJvdGVjdGVkIENvbnRyb2wgY29udHJvbDsKLQotCQlwdWJsaWMgRGVsYXllZERyYXdUaW1lcihDb250cm9sIGNvbnRyb2wxKSB7Ci0JCQl0aGlzLmNvbnRyb2wgPSBjb250cm9sMTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlc2V0KGludCBtaWxsaXNlY29uZHMpIHsKLQkJCWdldERpc3BsYXkoKS50aW1lckV4ZWMobWlsbGlzZWNvbmRzLCB0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWNvbnRyb2wucmVkcmF3KCk7Ci0JCX0KLQl9Ci0KLQlEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIEVkaXRNYW5hZ2VyCi0JICovCi0JcHVibGljIGNsYXNzIEVkaXRNYW5hZ2VyIHsKLQkJcHJvdGVjdGVkIFRyZWUgZlRyZWUxOwotCQlwcm90ZWN0ZWQgQ29udHJvbCBjZWxsRWRpdG9ySG9sZGVyOwotCQlwcm90ZWN0ZWQgQ2VsbEVkaXRvclN0YXRlIGNlbGxFZGl0b3JTdGF0ZTsKLQotCQlwdWJsaWMgRWRpdE1hbmFnZXIoVHJlZSB0cmVlKSB7Ci0JCQl0aGlzLmZUcmVlMSA9IHRyZWU7Ci0JCQl0aGlzLmNlbGxFZGl0b3JIb2xkZXIgPSBuZXcgQ29tcG9zaXRlKHRyZWUsIFNXVC5OT05FKTsKLQotCQkJZmluYWwgVHJlZSB0aGVUcmVlID0gdHJlZTsKLQotCQkJTW91c2VBZGFwdGVyIHRoZU1vdXNlQWRhcHRlciA9IG5ldyBNb3VzZUFkYXB0ZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgbW91c2VEb3duKE1vdXNlRXZlbnQgZSkgewotCQkJCQlkZWFjdGl2YXRlQ2VsbEVkaXRvcigpOwotCi0JCQkJCWlmIChlLnggPiBjb2x1bW5Qb3NpdGlvbiArIGNvbHVtbkhpdFdpZHRoKSB7Ci0JCQkJCQlUcmVlSXRlbVtdIGl0ZW1zID0gdGhlVHJlZS5nZXRTZWxlY3Rpb24oKTsKLQkJCQkJCS8vIE5vIGVkaXQgaWYgbW9yZSB0aGFuIG9uZSByb3cgaXMgc2VsZWN0ZWQuCi0JCQkJCQlpZiAoaXRlbXMubGVuZ3RoID09IDEpIHsKLQkJCQkJCQlSZWN0YW5nbGUgYm91bmRzID0gaXRlbXNbMF0uZ2V0Qm91bmRzKCk7Ci0JCQkJCQkJaWYgKGJvdW5kcyAhPSBudWxsICYmIGUueSA+PSBib3VuZHMueSAmJiBlLnkgPD0gYm91bmRzLnkgKyBib3VuZHMuaGVpZ2h0KSB7Ci0JCQkJCQkJCWludCBjb2x1bW5Ub0VkaXQgPSAxOwotCQkJCQkJCQlhY3RpdmF0ZUNlbGxFZGl0b3IoaXRlbXNbMF0sIGNvbHVtblRvRWRpdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfTsKLQotCQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQkJYXBwbHlDZWxsRWRpdG9yVmFsdWUoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCWFwcGx5Q2VsbEVkaXRvclZhbHVlKCk7Ci0JCQkJfQotCQkJfTsKLQotCQkJS2V5TGlzdGVuZXIga2V5TGlzdGVuZXIgPSBuZXcgS2V5QWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBrZXlQcmVzc2VkKEtleUV2ZW50IGUpIHsKLQkJCQkJaWYgKGUuY2hhcmFjdGVyID09IFNXVC5DUikgewotCQkJCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQkJCQkJCVRyZWVJdGVtW10gaXRlbXMgPSB0aGVUcmVlLmdldFNlbGVjdGlvbigpOwotCQkJCQkJaWYgKGl0ZW1zLmxlbmd0aCA9PSAxKSB7Ci0JCQkJCQkJYWN0aXZhdGVDZWxsRWRpdG9yKGl0ZW1zWzBdLCAxKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX07Ci0KLQkJCXRyZWUuYWRkTW91c2VMaXN0ZW5lcih0aGVNb3VzZUFkYXB0ZXIpOwotCQkJdHJlZS5hZGRLZXlMaXN0ZW5lcihrZXlMaXN0ZW5lcik7Ci0JCQlTY3JvbGxCYXIgaEJhciA9IHRyZWUuZ2V0SG9yaXpvbnRhbEJhcigpOwotCQkJaWYgKGhCYXIgIT0gbnVsbCkKLQkJCQloQmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCVNjcm9sbEJhciB2QmFyID0gdHJlZS5nZXRWZXJ0aWNhbEJhcigpOwotCQkJaWYgKHZCYXIgIT0gbnVsbCkKLQkJCQl2QmFyLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQ2VsbEVkaXRvckFjdGl2ZSgpIHsKLQkJCXJldHVybiBjZWxsRWRpdG9yU3RhdGUgIT0gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFwcGx5Q2VsbEVkaXRvclZhbHVlKCkgewotCQkJaWYgKGNlbGxFZGl0b3JTdGF0ZSAhPSBudWxsICYmIGNlbGxNb2RpZmllciAhPSBudWxsKSB7Ci0JCQkJVHJlZUl0ZW0gdHJlZUl0ZW0gPSBjZWxsRWRpdG9yU3RhdGUuZlRyZWVJdGVtOwotCi0JCQkJLy8gVGhlIGFyZWEgYmVsb3cgdGhlIGNlbGwgZWRpdG9yIG5lZWRzIHRvIGJlIGV4cGxpY2l0eQotCQkJCS8vIHJlcGFpbnRlZCBvbiBMaW51eAotCQkJCS8vCi0JCQkJLy8gUmVjdGFuZ2xlIHIgPSBCMkJIYWNrcy5JU19VTklYID8gdHJlZUl0ZW0uZ2V0Qm91bmRzKCkgOgotCQkJCS8vIG51bGw7Ci0KLQkJCQlPYmplY3QgdmFsdWUgPSBjZWxsRWRpdG9yU3RhdGUuZkNlbGxFZGl0b3IuZ2V0VmFsdWUoKTsKLQkJCQlTdHJpbmcgcHJvcGVydHkgPSBjZWxsRWRpdG9yU3RhdGUuZlByb3BlcnR5OwotCi0JCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQotCQkJCWNlbGxNb2RpZmllci5tb2RpZnkodHJlZUl0ZW0sIHByb3BlcnR5LCB2YWx1ZSk7Ci0KLQkJCQkvLyBpZiAociAhPSBudWxsKSB7Ci0JCQkJLy8gdHJlZS5yZWRyYXcoci54LCByLnksIHRyZWUuZ2V0Qm91bmRzKCkud2lkdGgsIHIuaGVpZ2h0LAotCQkJCS8vIGZhbHNlKTsKLQkJCQkvLyB9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkZWFjdGl2YXRlQ2VsbEVkaXRvcigpIHsKLQkJCS8vIENsZWFuIHVwIGFueSBwcmV2aW91cyBlZGl0b3IgY29udHJvbAotCQkJaWYgKGNlbGxFZGl0b3JTdGF0ZSAhPSBudWxsKSB7Ci0JCQkJY2VsbEVkaXRvclN0YXRlLmRlYWN0aXZhdGUoKTsKLQkJCQljZWxsRWRpdG9yU3RhdGUgPSBudWxsOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgYWN0aXZhdGVDZWxsRWRpdG9yKFRyZWVJdGVtIHRyZWVJdGVtLCBpbnQgY29sdW1uKSB7Ci0JCQlpZiAoY2VsbE1vZGlmaWVyIGluc3RhbmNlb2YgSUNlbGxFZGl0b3JQcm92aWRlcikgewotCQkJCUlDZWxsRWRpdG9yUHJvdmlkZXIgY2VsbEVkaXRvclByb3ZpZGVyID0gKElDZWxsRWRpdG9yUHJvdmlkZXIpIGNlbGxNb2RpZmllcjsKLQkJCQlPYmplY3QgZGF0YSA9IHRyZWVJdGVtLmdldERhdGEoKTsKLQkJCQlpZiAoZkNvbHVtblByb3BlcnRpZXMubGVuZ3RoID4gY29sdW1uKSB7Ci0JCQkJCVN0cmluZyBwcm9wZXJ0eSA9IGZDb2x1bW5Qcm9wZXJ0aWVzW2NvbHVtbl07Ci0JCQkJCWlmIChjZWxsTW9kaWZpZXIuY2FuTW9kaWZ5KGRhdGEsIHByb3BlcnR5KSkgewotCQkJCQkJQ2VsbEVkaXRvciBuZXdDZWxsRWRpdG9yID0gY2VsbEVkaXRvclByb3ZpZGVyLmdldENlbGxFZGl0b3IoZGF0YSwgY29sdW1uKTsKLQkJCQkJCWlmIChuZXdDZWxsRWRpdG9yICE9IG51bGwpIHsKLQkJCQkJCQkvLyBUaGUgY29udHJvbCB0aGF0IHdpbGwgYmUgdGhlIGVkaXRvciBtdXN0IGJlIGEKLQkJCQkJCQkvLyBjaGlsZCBvZiB0aGUgY29sdW1uUG9zaXRpb24KLQkJCQkJCQlDb250cm9sIGNvbnRyb2wgPSBuZXdDZWxsRWRpdG9yLmdldENvbnRyb2woKTsKLQkJCQkJCQlpZiAoY29udHJvbCAhPSBudWxsKSB7Ci0JCQkJCQkJCWNlbGxFZGl0b3JTdGF0ZSA9IG5ldyBDZWxsRWRpdG9yU3RhdGUobmV3Q2VsbEVkaXRvciwgY29udHJvbCwgdHJlZUl0ZW0sIGNvbHVtbiwgcHJvcGVydHkpOwotCQkJCQkJCQljZWxsRWRpdG9yU3RhdGUuYWN0aXZhdGUoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvKioKLQkJICogdGhpcyBjbGFzcyBob2xkcyB0aGUgc3RhdGUgdGhhdCBpcyBuZWVkIG9uIGEgcGVyIGNlbGwgZWRpdG9yCi0JCSAqIGludm9jYXRpb24gYmFzaXMKLQkJICovCi0JCXB1YmxpYyBjbGFzcyBDZWxsRWRpdG9yU3RhdGUgaW1wbGVtZW50cyBJQ2VsbEVkaXRvckxpc3RlbmVyLCBGb2N1c0xpc3RlbmVyIHsKLQkJCXB1YmxpYyBDZWxsRWRpdG9yIGZDZWxsRWRpdG9yOwotCQkJcHVibGljIENvbnRyb2wgZkNvbnRyb2w7Ci0JCQlwdWJsaWMgVHJlZUl0ZW0gZlRyZWVJdGVtOwotCQkJcHVibGljIGludCBmQ29sdW1uTnVtYmVyOwotCQkJcHVibGljIFN0cmluZyBmUHJvcGVydHk7Ci0KLQkJCXB1YmxpYyBDZWxsRWRpdG9yU3RhdGUoQ2VsbEVkaXRvciBjZWxsRWRpdG9yLCBDb250cm9sIGNvbnRyb2wsIFRyZWVJdGVtIHRyZWVJdGVtLCBpbnQgY29sdW1uTnVtYmVyLCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQl0aGlzLmZDZWxsRWRpdG9yID0gY2VsbEVkaXRvcjsKLQkJCQl0aGlzLmZDb250cm9sID0gY29udHJvbDsKLQkJCQl0aGlzLmZUcmVlSXRlbSA9IHRyZWVJdGVtOwotCQkJCXRoaXMuZkNvbHVtbk51bWJlciA9IGNvbHVtbk51bWJlcjsKLQkJCQl0aGlzLmZQcm9wZXJ0eSA9IHByb3BlcnR5OwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBhY3RpdmF0ZSgpIHsKLQkJCQlPYmplY3QgZWxlbWVudCA9IGZUcmVlSXRlbS5nZXREYXRhKCk7Ci0JCQkJU3RyaW5nIHZhbHVlID0gY2VsbE1vZGlmaWVyLmdldFZhbHVlKGVsZW1lbnQsIGZQcm9wZXJ0eSkudG9TdHJpbmcoKTsKLQkJCQlpZiAoZkNvbnRyb2wgaW5zdGFuY2VvZiBUZXh0KSB7Ci0JCQkJCVRleHQgdGV4dCA9IChUZXh0KSBmQ29udHJvbDsKLQkJCQkJaW50IHJlcXVpcmVkU2l6ZSA9IHZhbHVlLmxlbmd0aCgpICsgMTAwOwotCQkJCQlpZiAodGV4dC5nZXRUZXh0TGltaXQoKSA8IHJlcXVpcmVkU2l6ZSkgewotCQkJCQkJdGV4dC5zZXRUZXh0TGltaXQocmVxdWlyZWRTaXplKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlSZWN0YW5nbGUgciA9IGZUcmVlSXRlbS5nZXRCb3VuZHMoKTsKLQkJCQlpZiAociAhPSBudWxsKSB7Ci0JCQkJCWZDb250cm9sLnNldEJvdW5kcyhjb2x1bW5Qb3NpdGlvbiArIDUsIHIueSArIDEsIGZUcmVlMS5nZXRDbGllbnRBcmVhKCkud2lkdGggLSAoY29sdW1uUG9zaXRpb24gKyA1KSwgci5oZWlnaHQgLSAxKTsKLQkJCQkJZkNvbnRyb2wuc2V0VmlzaWJsZSh0cnVlKTsKLQkJCQkJZkNlbGxFZGl0b3Iuc2V0VmFsdWUodmFsdWUpOwotCQkJCQlmQ2VsbEVkaXRvci5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQkJZkNlbGxFZGl0b3Iuc2V0Rm9jdXMoKTsKLQkJCQkJZkNvbnRyb2wuYWRkRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGRlYWN0aXZhdGUoKSB7Ci0JCQkJZkNlbGxFZGl0b3IucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJZkNvbnRyb2wucmVtb3ZlRm9jdXNMaXN0ZW5lcih0aGlzKTsKLQkJCQlmQ2VsbEVkaXRvci5kZWFjdGl2YXRlKCk7Ci0JCQkJZlRyZWUxLmZvcmNlRm9jdXMoKTsKLQkJCX0KLQotCQkJLy8gSUNlbGxFZGl0b3JMaXN0ZW5lciBtZXRob2RzCi0JCQkvLwotCQkJcHVibGljIHZvaWQgYXBwbHlFZGl0b3JWYWx1ZSgpIHsKLQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJfQotCi0JCQlwdWJsaWMgdm9pZCBjYW5jZWxFZGl0b3IoKSB7Ci0JCQkJZGVhY3RpdmF0ZUNlbGxFZGl0b3IoKTsKLQkJCX0KLQotCQkJcHVibGljIHZvaWQgZWRpdG9yVmFsdWVDaGFuZ2VkKGJvb2xlYW4gb2xkVmFsaWRTdGF0ZSwgYm9vbGVhbiBuZXdWYWxpZFN0YXRlKSB7Ci0JCQkJLy8gbm90aGluZywgZm9yIG5vdwotCQkJfQotCi0JCQkvLyBGb2N1c0xpc3RlbmVyIG1ldGhvZHMKLQkJCS8vCi0JCQlwdWJsaWMgdm9pZCBmb2N1c0dhaW5lZChGb2N1c0V2ZW50IGUpIHsKLQkJCQkvLyBkbyBub3RoaW5nCi0JCQl9Ci0KLQkJCXB1YmxpYyB2b2lkIGZvY3VzTG9zdChGb2N1c0V2ZW50IGUpIHsKLQkJCQlhcHBseUNlbGxFZGl0b3JWYWx1ZSgpOwotCQkJfQotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1ZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9WaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODVkZGZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1ZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQWJzdHJhY3RUcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQotCXByb3RlY3RlZCBib29sZWFuIGlzRXhwYW5kQWN0aW9uOwotCXByb3RlY3RlZCBBYnN0cmFjdFRyZWVWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQotCXB1YmxpYyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbihib29sZWFuIGlzRXhwYW5kQWN0aW9uKSB7Ci0JCXRoaXMuaXNFeHBhbmRBY3Rpb24gPSBpc0V4cGFuZEFjdGlvbjsKLQkJaWYgKGlzRXhwYW5kQWN0aW9uKSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZV9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0VYUEFOREFMTCk7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZF9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX0VYUEFOREFMTCk7Ci0KLQkJCXNldEltYWdlRGVzY3JpcHRvcihlX2ltYWdlRGVzY3JpcHRvcik7Ci0JCQlzZXREaXNhYmxlZEltYWdlRGVzY3JpcHRvcihkX2ltYWdlRGVzY3JpcHRvcik7Ci0JCQlzZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9JTkZPX0VYUEFORF9BTEwpOyAvLyROT04tTkxTLTEkCi0JCX0gZWxzZSB7Ci0JCQlJbWFnZURlc2NyaXB0b3IgZV9pbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX0NPTExBUFNFQUxMKTsKLQkJCUltYWdlRGVzY3JpcHRvciBkX2ltYWdlRGVzY3JpcHRvciA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQ09MTEFQU0VBTEwpOwotCi0JCQlzZXRJbWFnZURlc2NyaXB0b3IoZV9pbWFnZURlc2NyaXB0b3IpOwotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoZF9pbWFnZURlc2NyaXB0b3IpOwotCQkJc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfSU5GT19DT0xMQVBTRV9BTEwpOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXIoQWJzdHJhY3RUcmVlVmlld2VyIHZpZXdlcikgewotCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJLy8gdGVtcG9yYXJpbHkgc2V0IHRoZSB2aXNpYmlsaXR5IHRvIGZhbHNlCi0JCQkvLyB0aGlzIGhhcyBhIEhVR0UgcGVyZm9ybWFuY2UgYmVuZWZpdAotCQkJYm9vbGVhbiBpc1Zpc2libGUgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpLmdldFZpc2libGUoKTsKLQkJCXZpZXdlci5nZXRDb250cm9sKCkuc2V0VmlzaWJsZShmYWxzZSk7Ci0KLQkJCWlmIChpc0V4cGFuZEFjdGlvbikgewotCQkJCXZpZXdlci5leHBhbmRBbGwoKTsKLQkJCX0gZWxzZSB7Ci0JCQkJdmlld2VyLmNvbGxhcHNlQWxsKCk7Ci0JCQl9Ci0KLQkJCS8vIHJlc3RvcmUgdGhlIHByZXZpb3VzIHZpc2liaWxpdHkgc3RhdGUKLQkJCS8vIAotCQkJdmlld2VyLmdldENvbnRyb2woKS5zZXRWaXNpYmxlKGlzVmlzaWJsZSk7Ci0JCX0KLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc1NjhjYS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi0KLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBkZWZpbml0aW9ucyBpZHMgZm9yIHRoZSBYTUwgZWRpdG9yIGFjdGlvbnMuCi0gKiAKLSAqIEBkZXByZWNhdGVkIFVzZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudXRpbC5BY3Rpb25EZWZpbml0aW9uSWRzIGluc3RlYWQKLSAqLwotcHVibGljIGludGVyZmFjZSBYTUxFZGl0b3JBY3Rpb25EZWZpbml0aW9uSWRzIHsKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBDTEVBTlVQX0RPQ1VNRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5jbGVhbnVwLmRvY3VtZW50IjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRk9STUFUX0RPQ1VNRU5UID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5mb3JtYXQuZG9jdW1lbnQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBGT1JNQVRfQUNUSVZFX0VMRU1FTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5mb3JtYXQuYWN0aXZlLmVsZW1lbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgT1BFTl9GSUxFID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5vcGVuLmZpbGUuZnJvbS5zb3VyY2UiOy8vJE5PTi1OTFMtMSQKLQkvLwlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkZPUk1BVElPTiA9Ci0JLy8gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5zaG93LnRvb2x0aXAuaW5mb3JtYXRpb24iOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBJTkZPUk1BVElPTiA9ICJvcmcuZWNsaXBzZS5qZHQudWkuZWRpdC50ZXh0LmphdmEuc2hvdy5qYXZhZG9jIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgQUREX0JSRUFLUE9JTlRTID0gIm9yZy5lY2xpcHNlLndzdC5zc2UudWkuZWRpdC51aS5hZGQuYnJlYWtwb2ludHMiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBNQU5BR0VfQlJFQUtQT0lOVFMgPSAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnVpLm1hbmFnZS5icmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIEVOQUJMRV9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZW5hYmxlLmJyZWFrcG9pbnRzIjsvLyROT04tTkxTLTEkCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgRElTQUJMRV9CUkVBS1BPSU5UUyA9ICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmVkaXQudWkuZGlzYWJsZS5icmVha3BvaW50cyI7Ly8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvck1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmQwYmU4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvck1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBFZGl0b3IKLSAqIAotICogQHBsYW5uZWRmb3IgMS4wCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlLlhNTEVkaXRvclJlc291cmNlcyI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlVmlld2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MTXVsdGlQYWdlRWRpdG9yUGFydF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRyZWVFeHRlbnNpb25fMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUcmVlRXh0ZW5zaW9uXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVHJlZUV4dGVuc2lvbl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRyZWVFeHRlbnNpb25fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8zOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl82OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfODsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBbl9lcnJvcl9oYXNfb2NjdXJyZWRfd2hlbjFfRVJST1JfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlc291cmNlX19kb2VzX25vdF9leGlzdDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFZGl0b3JfY291bGRfbm90X2JlX29wZW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVHJlZUV4dGVuc2lvbl8wOwotCi0Jc3RhdGljIHsKLQkJLy8gbG9hZCBtZXNzYWdlIHZhbHVlcyBmcm9tIGJ1bmRsZSBmaWxlCi0JCU5MUy5pbml0aWFsaXplTWVzc2FnZXMoQlVORExFX05BTUUsIFhNTEVkaXRvck1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0JCi0JcHJpdmF0ZSBYTUxFZGl0b3JNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5IT0xEX09MRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZhMTlkYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5IT0xEX09MRC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGx1Z2luLkFic3RyYWN0VUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwucmVnaXN0cnkuQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGw7Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgVGhpcyBwbHVnaW4gaGFzIGNvbWJpbmVkIHdpdGggdGhlIG9yZy5lY2xpcHNlLndzdC54bWwudWkgcGx1Z2luLgotICogICAgICAgICAgICAgVXNlIFhNTFVJUGx1Z2luIGluc3RlYWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgUExVR0lOX0lEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBpbnN0YW5jZSA9IG51bGw7Ci0KLQkvKioKLQkgKiBYTUxVSVBsdWdpbiBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCgpIHsKLQkJc3VwZXIoKTsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCi0JCS8vIHJlZmVyZW5jZSB0aGUgcHJlZmVyZW5jZSBzdG9yZSBzbwotCQkvLyBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKElQcmVmZXJlbmNlU3RvcmUgcHJlZmVyZW5jZVN0b3JlKSBpcwotCQkvLyBjYWxsZWQKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5IT0xEX09MRCBnZXREZWZhdWx0KCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSE9MRF9PTEQgZ2V0SW5zdGFuY2UoKSB7Ci0JCXJldHVybiBpbnN0YW5jZTsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI1ZjhkMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgaW1hZ2VzIHByb3ZpZGVkIGJ5IHRoaXMgcGx1Zy1pbi4KLSAqIAotICogTk9URTogRm9yIGludGVybmFsIHVzZSBvbmx5LiBGb3IgaW1hZ2VzIHVzZWQgZXh0ZXJuYWxseSwgcGxlYXNlIHVzZSB0aGUKLSAqIFNoYXJlZCoqKkltYWdlSGVscGVyIGNsYXNzIGluc3RlYWQuCi0gKiAKLSAqIEBhdXRob3IgYW15d3UKLSAqLwotcHVibGljIGNsYXNzIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIHsKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBQTFVHSU5JRCA9IFhNTFVJUGx1Z2luLklEOwotCXByaXZhdGUgc3RhdGljIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIGluc3RhbmNlID0gbnVsbDsKLQotCS8vCSBzYXZlIGEgZGVzY3JpcHRvciBmb3IgZWFjaCBpbWFnZQotCXByaXZhdGUgSGFzaE1hcCBmSW1hZ2VEZXNjUmVnaXN0cnkgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2UgZnJvbSB0aGUgaW1hZ2UgcmVnaXN0cnkuCi0JICogSWYgdGhlIGltYWdlIGNhbm5vdCBiZSByZXRyaWV2ZWQsIGF0dGVtcHQgdG8gZmluZCBhbmQgbG9hZCB0aGUgaW1hZ2UgYXQKLQkgKiB0aGUgbG9jYXRpb24gc3BlY2lmaWVkIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZSB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIG9yIG51bGwgaWYgb25lIGNvdWxkCi0JICogICAgICAgICBub3QgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlIGltYWdlID0gZ2V0SW1hZ2VSZWdpc3RyeSgpLmdldChyZXNvdXJjZSk7Ci0JCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkvLyBjcmVhdGUgYW4gaW1hZ2UKLQkJCWltYWdlID0gY3JlYXRlSW1hZ2UocmVzb3VyY2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyaWV2ZXMgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlCi0JICogZGVzY3JpcHRvciByZWdpc3RyeS4gSWYgdGhlIGltYWdlIGRlc2NyaXB0b3IgY2Fubm90IGJlIHJldHJpZXZlZCwKLQkgKiBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZAotCSAqIGluIHJlc291cmNlLgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIGRlc2NyaXB0b3IgdG8gcmV0cmlldmUKLQkgKiBAcmV0dXJuIEltYWdlRGVzY3JpcHRvciB0aGUgaW1hZ2UgZGVzY3JpcHRvciBhc3NvY2F0ZWQgd2l0aCByZXNvdXJjZSBvcgotCSAqICAgICAgICAgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IgaWYgb25lIGNvdWxkIG5vdCBiZQotCSAqICAgICAgICAgZm91bmQKLQkgKi8KLQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgcmVzb3VyY2UpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IG51bGw7Ci0JCU9iamVjdCBvID0gZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAobyA9PSBudWxsKSB7Ci0JCQkvL2NyZWF0ZSBhIGRlc2NyaXB0b3IKLQkJCWltYWdlRGVzY3JpcHRvciA9IGNyZWF0ZUltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCX0gZWxzZSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSAoSW1hZ2VEZXNjcmlwdG9yKSBvOwotCQl9Ci0JCXJldHVybiBpbWFnZURlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiBIYXNoTWFwIC0gaW1hZ2UgZGVzY3JpcHRvciByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEhhc2hNYXAgZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKSB7Ci0JCWlmIChmSW1hZ2VEZXNjUmVnaXN0cnkgPT0gbnVsbCkKLQkJCWZJbWFnZURlc2NSZWdpc3RyeSA9IG5ldyBIYXNoTWFwKCk7Ci0JCXJldHVybiBmSW1hZ2VEZXNjUmVnaXN0cnk7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgaW1hZ2UgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSW1hZ2VSZWdpc3RyeSAtIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbgotCSAqLwotCXByaXZhdGUgSW1hZ2VSZWdpc3RyeSBnZXRJbWFnZVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjhmODRiLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgWE1MIEVkaXRvciBwbHVnLWluLgotICovCi1wdWJsaWMgY2xhc3MgWE1MRWRpdG9yUGx1Z2luSW1hZ2VzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09MTEFQU0UgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQ09MTEFQU0UgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L2NvbGxhcHNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09MTEFQU0VBTEwgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2NvbGxhcHNlX2FsbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTExBUFNFQUxMID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb2xsYXBzZV9hbGwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9FWFBBTkQgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L2V4cGFuZC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0VYUEFORCA9ICJpY29ucy9mdWxsL2V0b29sMTYvZXhwYW5kLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfRVhQQU5EQUxMID0gImljb25zL2Z1bGwvZHRvb2wxNi9leHBhbmRfYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfRVhQQU5EQUxMID0gImljb25zL2Z1bGwvZXRvb2wxNi9leHBhbmRfYWxsLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfTkVXX1hNTCA9ICJpY29ucy9mdWxsL2R0b29sMTYvbmV3X3htbC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX05FV19YTUwgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L25ld194bWwuZ2lmIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTEVkaXRvclJlc291cmNlcy5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUmVzb3VyY2VzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMmQwMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MRWRpdG9yUmVzb3VyY2VzLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxUYWJsZVRyZWVWaWV3ZXJfMD1EZXNpZ24KLVhNTE11bHRpUGFnZUVkaXRvclBhcnRfMD1Tb3VyY2UKLVhNTFRyZWVFeHRlbnNpb25fMD1TdHJ1Y3R1cmUKLVhNTFRyZWVFeHRlbnNpb25fMT1WYWx1ZQotWE1MVHJlZUV4dGVuc2lvbl8zPVRoZSBkb2N1bWVudCBpcyBlbXB0eS4KLVhNTFRyZWVFeHRlbnNpb25fND1SaWdodCBtb3VzZSBjbGljayBoZXJlIHRvIGluc2VydCBjb250ZW50LgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMD0mWE1MCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8xPSZFeHBhbmQgQWxsCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl8yPSZDb2xsYXBzZSBBbGwKLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzM9VHVybiBHcmFtbWFyIENvbnN0cmFpbnRzIE9mZgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfND0mVHVybiBHcmFtbWFyIENvbnN0cmFpbnRzIE9mZgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNT1UdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT24KLVhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzY9JlR1cm4gR3JhbW1hciBDb25zdHJhaW50cyBPbgotWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNz1SZWxvYWQgRGVwZW5kZW5jaWVzCi1YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl84PSZSZWxvYWQgRGVwZW5kZW5jaWVzCi0jIwotQW5fZXJyb3JfaGFzX29jY3VycmVkX3doZW4xX0VSUk9SXz1BbiBlcnJvciBoYXMgb2NjdXJyZWQgd2hlbiBpbml0aWFsaXppbmcgdGhlIGlucHV0IGZvciB0aGUgdGhlIGVkaXRvcidzIHNvdXJjZSBwYWdlLgotUmVzb3VyY2VfX2RvZXNfbm90X2V4aXN0PVJlc291cmNlIHswfSBkb2VzIG5vdCBleGlzdC4KLUVkaXRvcl9jb3VsZF9ub3RfYmVfb3Blbj1FZGl0b3IgY291bGQgbm90IGJlIG9wZW4gb24gezB9Ci1UcmVlRXh0ZW5zaW9uXzA9Q2Fubm90IGRpc3BsYXkgZG9jdW1lbnQgY29udGVudHMuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4M2M1NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLQotCi1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3I7Ci0KLQotcHVibGljIGNsYXNzIFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGV4dGVuZHMgU291cmNlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgewotCi0JcHJpdmF0ZSBib29sZWFuIG5lZWRzTXVsdGlJbml0ID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoSUFjdGlvbkJhcnMgYWN0aW9uQmFycykgewotCQlzdXBlci5pbml0RGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IoYWN0aW9uQmFycyk7Ci0KLQkJaWYgKGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yICE9IG51bGwpCi0JCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpCi0JCQkJKChJRGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKS5pbml0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zKGFjdGlvbkJhcnMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFjdGl2YXRlRGVzaWduUGFnZShJRWRpdG9yUGFydCBhY3RpdmVFZGl0b3IpIHsKLQkJaWYgKHNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yICE9IG51bGwgJiYgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgaW5zdGFuY2VvZiBJU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpIHsKLQkJCS8vIGlmIGRlc2lnbiBwYWdlIGlzIG5vdCByZWFsbHkgYW4gSUVkaXRvclBhcnQsIGFjdGl2ZUVkaXRvciA9PQotCQkJLy8gbnVsbCwgc28gcGFzcyBpbiBtdWx0aVBhZ2VFZGl0b3IgaW5zdGVhZCAoZDI4MjQxNCkKLQkJCWlmIChhY3RpdmVFZGl0b3IgPT0gbnVsbCkgewotCQkJCXNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yLnNldEFjdGl2ZUVkaXRvcihtdWx0aVBhZ2VFZGl0b3IpOwotCQkJfSBlbHNlIHsKLQkJCQlzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IoYWN0aXZlRWRpdG9yKTsKLQkJCX0KLQkJCSgoSVNvdXJjZVZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlpZiAoZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciBpbnN0YW5jZW9mIElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKG11bHRpUGFnZUVkaXRvcik7Ci0JCQkoKElEZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhY3RpdmF0ZVNvdXJjZVBhZ2UoSUVkaXRvclBhcnQgYWN0aXZlRWRpdG9yKSB7Ci0JCWlmIChkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvciAhPSBudWxsICYmIGRlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIGluc3RhbmNlb2YgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQlkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvci5zZXRBY3RpdmVFZGl0b3IobXVsdGlQYWdlRWRpdG9yKTsKLQkJCSgoSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yKSBkZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikuc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChmYWxzZSk7Ci0JCX0KLQotCQlpZiAoc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IgIT0gbnVsbCAmJiBzb3VyY2VWaWV3ZXJBY3Rpb25Db250cmlidXRvciBpbnN0YW5jZW9mIElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3Iuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0JCQkoKElTb3VyY2VWaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcikgc291cmNlVmlld2VyQWN0aW9uQ29udHJpYnV0b3IpLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQodHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnBhcnQuRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjaW5pdChvcmcuZWNsaXBzZS51aS5JQWN0aW9uQmFycykKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb25CYXJzIGFjdGlvbkJhcnMpIHsKLQkJc3VwZXIuaW5pdChhY3Rpb25CYXJzKTsKLQkJbmVlZHNNdWx0aUluaXQgPSB0cnVlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yI3NldEFjdGl2ZUVkaXRvcihvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCWlmIChuZWVkc011bHRpSW5pdCkgewotCQkJZGVzaWduVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3IgPSBuZXcgWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3IoKTsKLQkJCWluaXREZXNpZ25WaWV3ZXJBY3Rpb25CYXJDb250cmlidXRvcihnZXRBY3Rpb25CYXJzKCkpOwotCQkJbmVlZHNNdWx0aUluaXQgPSBmYWxzZTsKLQkJfQotCQlzdXBlci5zZXRBY3RpdmVFZGl0b3IodGFyZ2V0RWRpdG9yKTsKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3NGMwZTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MTXVsdGlQYWdlRWRpdG9yUGFydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSU1hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SW5wdXRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVBvc3RTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVBhcnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGFydFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVByb3BlcnR5TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JR290b01hcmtlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuTXVsdGlQYWdlRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wcm9ncmVzcy5VSUpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JWE1MUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLXB1YmxpYyBjbGFzcyBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0IGV4dGVuZHMgTXVsdGlQYWdlRWRpdG9yUGFydCB7Ci0KLQkvKioKLQkgKiBJbnRlcm5hbCBwYXJ0IGFjdGl2YXRpb24gbGlzdGVuZXIsIGNvcGllZCBmcm9tIEFic3RyYWN0VGV4dEVkaXRvcgotCSAqLwotCWNsYXNzIEFjdGl2YXRpb25MaXN0ZW5lciBpbXBsZW1lbnRzIElQYXJ0TGlzdGVuZXIsIElXaW5kb3dMaXN0ZW5lciB7Ci0KLQkJLyoqIENhY2hlIG9mIHRoZSBhY3RpdmUgd29ya2JlbmNoIHBhcnQuICovCi0JCXByaXZhdGUgSVdvcmtiZW5jaFBhcnQgZkFjdGl2ZVBhcnQ7Ci0JCS8qKiBJbmRpY2F0ZXMgd2hldGhlciBhY3RpdmF0aW9uIGhhbmRsaW5nIGlzIGN1cnJlbnRseSBiZSBkb25lLiAqLwotCQlwcml2YXRlIGJvb2xlYW4gZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCS8qKgotCQkgKiBUaGUgcGFydCBzZXJ2aWNlLgotCQkgKiAKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHJpdmF0ZSBJUGFydFNlcnZpY2UgZlBhcnRTZXJ2aWNlOwotCi0JCS8qKgotCQkgKiBDcmVhdGVzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLQkJICogCi0JCSAqIEBwYXJhbSBwYXJ0U2VydmljZQotCQkgKiAgICAgICAgICAgIHRoZSBwYXJ0IHNlcnZpY2Ugb24gd2hpY2ggdG8gYWRkIHRoZSBwYXJ0IGxpc3RlbmVyCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyBBY3RpdmF0aW9uTGlzdGVuZXIoSVBhcnRTZXJ2aWNlIHBhcnRTZXJ2aWNlKSB7Ci0JCQlmUGFydFNlcnZpY2UgPSBwYXJ0U2VydmljZTsKLQkJCWZQYXJ0U2VydmljZS5hZGRQYXJ0TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmFkZFdpbmRvd0xpc3RlbmVyKHRoaXMpOwotCQl9Ci0KLQkJLyoqCi0JCSAqIERpc3Bvc2VzIHRoaXMgYWN0aXZhdGlvbiBsaXN0ZW5lci4KLQkJICogCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCQlmUGFydFNlcnZpY2UucmVtb3ZlUGFydExpc3RlbmVyKHRoaXMpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5yZW1vdmVXaW5kb3dMaXN0ZW5lcih0aGlzKTsKLQkJCWZQYXJ0U2VydmljZSA9IG51bGw7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydEFjdGl2YXRlZChvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHBhcnRBY3RpdmF0ZWQoSVdvcmtiZW5jaFBhcnQgcGFydCkgewotCQkJZkFjdGl2ZVBhcnQgPSBwYXJ0OwotCQkJaGFuZGxlQWN0aXZhdGlvbigpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJUGFydExpc3RlbmVyI3BhcnRCcm91Z2h0VG9Ub3Aob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhcnQpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBwYXJ0QnJvdWdodFRvVG9wKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCS8vIGRvIG5vdGhpbmcKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0Q2xvc2VkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydENsb3NlZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIElQYXJ0TGlzdGVuZXIjcGFydERlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydERlYWN0aXZhdGVkKElXb3JrYmVuY2hQYXJ0IHBhcnQpIHsKLQkJCWZBY3RpdmVQYXJ0ID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVBhcnRMaXN0ZW5lciNwYXJ0T3BlbmVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFydE9wZW5lZChJV29ya2JlbmNoUGFydCBwYXJ0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKioKLQkJICogSGFuZGxlcyB0aGUgYWN0aXZhdGlvbiB0cmlnZ2VyaW5nIGEgZWxlbWVudCBzdGF0ZSBjaGVjayBpbiB0aGUKLQkJICogZWRpdG9yLgotCQkgKi8KLQkJdm9pZCBoYW5kbGVBY3RpdmF0aW9uKCkgewotCQkJaWYgKGZJc0hhbmRsaW5nQWN0aXZhdGlvbiB8fCBnZXRUZXh0RWRpdG9yKCkgPT0gbnVsbCkKLQkJCQlyZXR1cm47Ci0KLQkJCWlmIChmQWN0aXZlUGFydCA9PSBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMpIHsKLQkJCQlmSXNIYW5kbGluZ0FjdGl2YXRpb24gPSB0cnVlOwotCQkJCXRyeSB7Ci0JCQkJCWdldFRleHRFZGl0b3IoKS5zYWZlbHlTYW5pdHlDaGVja1N0YXRlKGdldEVkaXRvcklucHV0KCkpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJZklzSGFuZGxpbmdBY3RpdmF0aW9uID0gZmFsc2U7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5JV2luZG93TGlzdGVuZXIjd2luZG93QWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0FjdGl2YXRlZChJV29ya2JlbmNoV2luZG93IHdpbmRvdykgewotCQkJaWYgKHdpbmRvdyA9PSBnZXRFZGl0b3JTaXRlKCkuZ2V0V29ya2JlbmNoV2luZG93KCkpIHsKLQkJCQkvKgotCQkJCSAqIFdvcmthcm91bmQgZm9yIHByb2JsZW0gZGVzY3JpYmVkIGluCi0JCQkJICogaHR0cDovL2Rldi5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xMTczMSBXaWxsIGJlCi0JCQkJICogcmVtb3ZlZCB3aGVuIFNXVCBoYXMgc29sdmVkIHRoZSBwcm9ibGVtLgotCQkJCSAqLwotCQkJCXdpbmRvdy5nZXRTaGVsbCgpLmdldERpc3BsYXkoKS5hc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCQloYW5kbGVBY3RpdmF0aW9uKCk7Ci0JCQkJCX0KLQkJCQl9KTsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVdpbmRvd0xpc3RlbmVyI3dpbmRvd0RlYWN0aXZhdGVkKG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3cpCi0JCSAqIEBzaW5jZSAzLjEKLQkJICovCi0JCXB1YmxpYyB2b2lkIHdpbmRvd0RlYWN0aXZhdGVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dDbG9zZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93Q2xvc2VkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXaW5kb3dMaXN0ZW5lciN3aW5kb3dPcGVuZWQob3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdykKLQkJICogQHNpbmNlIDMuMQotCQkgKi8KLQkJcHVibGljIHZvaWQgd2luZG93T3BlbmVkKElXb3JrYmVuY2hXaW5kb3cgd2luZG93KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMaXN0ZW5zIGZvciBzZWxlY3Rpb24gZnJvbSB0aGUgc291cmNlIHBhZ2UsIGFwcGx5aW5nIGl0IHRvIHRoZSBkZXNpZ24KLQkgKiB2aWV3ZXIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZXh0RWRpdG9yUG9zdFNlbGVjdGlvbkFkYXB0ZXIgZXh0ZW5kcyBVSUpvYiBpbXBsZW1lbnRzIElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgewotCQlib29sZWFuIGZvcmNlUG9zdFNlbGVjdGlvbiA9IGZhbHNlOwotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IG51bGw7Ci0KLQkJcHVibGljIFRleHRFZGl0b3JQb3N0U2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXN1cGVyKGdldFRpdGxlKCkpOwotCQkJc2V0VXNlcih0cnVlKTsKLQkJfQotCi0JCXB1YmxpYyBJU3RhdHVzIHJ1bkluVUlUaHJlYWQoSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQlpZiAoc2VsZWN0aW9uICE9IG51bGwpIHsKLQkJCQlmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0JCQl9Ci0JCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsICYmICgoZ2V0QWN0aXZlUGFnZSgpICE9IGZEZXNpZ25QYWdlSW5kZXgpIHx8ICFYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZXF1YWxzKGdldFNpdGUoKS5nZXRQYWdlKCkuZ2V0QWN0aXZlUGFydCgpKSkpIHsKLQkJCQlpZiAoZm9yY2VQb3N0U2VsZWN0aW9uKSB7Ci0JCQkJCXNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotCQkJCQlzY2hlZHVsZSgyMDApOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLnNldFNlbGVjdGlvbihldmVudC5nZXRTZWxlY3Rpb24oKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogSW50ZXJuYWwgSVByb3BlcnR5TGlzdGVuZXIKLQkgKi8KLQljbGFzcyBQcm9wZXJ0eUxpc3RlbmVyIGltcGxlbWVudHMgSVByb3BlcnR5TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoT2JqZWN0IHNvdXJjZSwgaW50IHByb3BJZCkgewotCQkJc3dpdGNoIChwcm9wSWQpIHsKLQkJCQkvLyBoYWQgdG8gaW1wbGVtZW50IGlucHV0IGNoYW5nZWQgImxpc3RlbmVyIiBzbyB0aGF0Ci0JCQkJLy8gU3RydWN0dXJlZFRleHRFZGl0b3IgY291bGQgdGVsbCBpdCBjb250YWluaW5nIGVkaXRvciB0aGF0Ci0JCQkJLy8gdGhlIGlucHV0IGhhcyBjaGFuZ2UsIHdoZW4gYSAncmVzb3VyY2UgbW92ZWQnIGV2ZW50IGlzCi0JCQkJLy8gZm91bmQuCi0JCQkJY2FzZSBJRWRpdG9yUGFydC5QUk9QX0lOUFVUIDoKLQkJCQljYXNlIElFZGl0b3JQYXJ0LlBST1BfRElSVFkgOiB7Ci0JCQkJCWlmIChzb3VyY2UgPT0gZ2V0VGV4dEVkaXRvcigpKSB7Ci0JCQkJCQlpZiAoZ2V0VGV4dEVkaXRvcigpLmdldEVkaXRvcklucHV0KCkgIT0gZ2V0RWRpdG9ySW5wdXQoKSkgewotCQkJCQkJCXNldElucHV0KGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCQkJCQkvKgotCQkJCQkJCSAqIHRpdGxlIHNob3VsZCBhbHdheXMgY2hhbmdlIHdoZW4gaW5wdXQgY2hhbmdlcy4KLQkJCQkJCQkgKiBjcmVhdGUgcnVubmFibGUgZm9yIGZvbGxvd2luZyBwb3N0IGNhbGwKLQkJCQkJCQkgKi8KLQkJCQkJCQlSdW5uYWJsZSBydW5uYWJsZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCQkJCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQkJCQkJX2ZpcmVQcm9wZXJ0eUNoYW5nZShJV29ya2JlbmNoUGFydC5QUk9QX1RJVExFKTsKLQkJCQkJCQkJfQotCQkJCQkJCX07Ci0JCQkJCQkJLyoKLQkJCQkJCQkgKiBVcGRhdGUgaXMganVzdCB0byBwb3N0IHRoaW5ncyBvbiB0aGUgZGlzcGxheQotCQkJCQkJCSAqIHF1ZXVlICh0aHJlYWQpLiBXZSBoYXZlIHRvIGRvIHRoaXMgdG8gZ2V0IHRoZQotCQkJCQkJCSAqIGRpcnR5IHByb3BlcnR5IHRvIGdldCB1cGRhdGVkIGFmdGVyIG90aGVyCi0JCQkJCQkJICogdGhpbmdzIG9uIHRoZSBxdWV1ZSBhcmUgZXhlY3V0ZWQuCi0JCQkJCQkJICovCi0JCQkJCQkJKChDb250cm9sKSBnZXRUZXh0RWRpdG9yKCkuZ2V0QWRhcHRlcihDb250cm9sLmNsYXNzKSkuZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhydW5uYWJsZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgSVdvcmtiZW5jaFBhcnQuUFJPUF9USVRMRSA6IHsKLQkJCQkJLy8gdXBkYXRlIHRoZSBpbnB1dCBpZiB0aGUgdGl0bGUgaXMgY2hhbmdlZAotCQkJCQlpZiAoc291cmNlID09IGdldFRleHRFZGl0b3IoKSkgewotCQkJCQkJaWYgKGdldFRleHRFZGl0b3IoKS5nZXRFZGl0b3JJbnB1dCgpICE9IGdldEVkaXRvcklucHV0KCkpIHsKLQkJCQkJCQlzZXRJbnB1dChnZXRUZXh0RWRpdG9yKCkuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWRlZmF1bHQgOiB7Ci0JCQkJCS8vIHByb3BhZ2F0ZSBjaGFuZ2VzLiBJcyB0aGlzIG5lZWRlZD8gQW5zd2VyOiBZZXMuCi0JCQkJCWlmIChzb3VyY2UgPT0gZ2V0VGV4dEVkaXRvcigpKSB7Ci0JCQkJCQlfZmlyZVByb3BlcnR5Q2hhbmdlKHByb3BJZCk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCX0KLQl9Ci0KLQljbGFzcyBUZXh0SW5wdXRMaXN0ZW5lciBpbXBsZW1lbnRzIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCQkvLyBkbyBub3RoaW5nCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dERvY3VtZW50Q2hhbmdlZChJRG9jdW1lbnQgb2xkSW5wdXQsIElEb2N1bWVudCBuZXdJbnB1dCkgewotCQkJaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCAmJiBuZXdJbnB1dCAhPSBudWxsKQotCQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQobmV3SW5wdXQpOwotCQl9Ci0JfQotCi0JLyoqIFRoZSBkZXNpZ24gcGFnZSBpbmRleC4gKi8KLQlwcml2YXRlIGludCBmRGVzaWduUGFnZUluZGV4OwotCi0JLyoqIFRoZSBkZXNpZ24gdmlld2VyICovCi0JSURlc2lnblZpZXdlciBmRGVzaWduVmlld2VyOwotCi0JcHJpdmF0ZSBBY3RpdmF0aW9uTGlzdGVuZXIgZkFjdGl2YXRpb25MaXN0ZW5lcjsKLQotCUlQcm9wZXJ0eUxpc3RlbmVyIGZQcm9wZXJ0eUxpc3RlbmVyID0gbnVsbDsKLQotCS8qKiBUaGUgc291cmNlIHBhZ2UgaW5kZXguICovCi0JaW50IGZTb3VyY2VQYWdlSW5kZXg7Ci0KLQkvKiogVGhlIHRleHQgZWRpdG9yLiAqLwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRFZGl0b3IgZlRleHRFZGl0b3I7Ci0KLQlwcml2YXRlIFRleHRFZGl0b3JQb3N0U2VsZWN0aW9uQWRhcHRlciBmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyOwotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRNdWx0aVBhZ2VFZGl0b3JQYXJ0IGNvbnN0cnVjdG9yIGNvbW1lbnQuCi0JICovCi0JcHVibGljIFhNTE11bHRpUGFnZUVkaXRvclBhcnQoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoKLQkgKiBUaGlzIG1ldGhvZCBpcyBqdXN0IHRvIG1ha2UgZmlyZVByb3BlcnR5Q2hhbmdlZCBhY2Nlc3NpYmxlIGZyb20gc29tZQotCSAqIChhbm9ub21vdXMpIGlubmVyIGNsYXNzZXMuCi0JICovCi0Jdm9pZCBfZmlyZVByb3BlcnR5Q2hhbmdlKGludCBwcm9wZXJ0eSkgewotCQlzdXBlci5maXJlUHJvcGVydHlDaGFuZ2UocHJvcGVydHkpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgdGhlIHNvdXJjZSBwYWdlIG9mIHRoZSBtdWx0aS1wYWdlIGVkaXRvci4KLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkU291cmNlUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWZTb3VyY2VQYWdlSW5kZXggPSBhZGRQYWdlKGZUZXh0RWRpdG9yLCBnZXRFZGl0b3JJbnB1dCgpKTsKLQkJc2V0UGFnZVRleHQoZlNvdXJjZVBhZ2VJbmRleCwgWE1MRWRpdG9yTWVzc2FnZXMuWE1MTXVsdGlQYWdlRWRpdG9yUGFydF8wKTsKLQkJLy8gdGhlIHVwZGF0ZSdzIGNyaXRpY2FsLCB0byBnZXQgdmlld2VyIHNlbGVjdGlvbiBtYW5hZ2VyIGFuZAotCQkvLyBoaWdobGlnaHRpbmcgdG8gd29yawotCQlmVGV4dEVkaXRvci51cGRhdGUoKTsKLQotCQlmaXJlUHJvcGVydHlDaGFuZ2UoUFJPUF9USVRMRSk7Ci0KLQkJLy8gQ2hhbmdlcyB0byB0aGUgVGV4dCBWaWV3ZXIncyBkb2N1bWVudCBpbnN0YW5jZSBzaG91bGQgYWxzbwotCQkvLyBmb3JjZSBhbgotCQkvLyBpbnB1dCByZWZyZXNoCi0JCWZUZXh0RWRpdG9yLmdldFRleHRWaWV3ZXIoKS5hZGRUZXh0SW5wdXRMaXN0ZW5lcihuZXcgVGV4dElucHV0TGlzdGVuZXIoKSk7Ci0JfQotCi0JLyoqCi0JICogQ29ubmVjdHMgdGhlIGRlc2lnbiB2aWV3ZXIgd2l0aCB0aGUgdmlld2VyIHNlbGVjdGlvbiBtYW5hZ2VyLiBTaG91bGQgYmUKLQkgKiBkb25lIGFmdGVyIGNyZWF0ZVNvdXJjZVBhZ2UoKSBpcyBkb25lIGJlY2F1c2Ugd2UgbmVlZCB0byBnZXQgdGhlCi0JICogVmlld2VyU2VsZWN0aW9uTWFuYWdlciBmcm9tIHRoZSBUZXh0RWRpdG9yLiBzZXRNb2RlbCBpcyBhbHNvIGRvbmUgaGVyZQotCSAqIGJlY2F1c2UgZ2V0TW9kZWwoKSBuZWVkcyB0byByZWZlcmVuY2UgdGhlIFRleHRFZGl0b3IuCi0JICovCi0JcHJpdmF0ZSB2b2lkIGNvbm5lY3REZXNpZ25QYWdlKCkgewotCQlpZiAoZkRlc2lnblZpZXdlciAhPSBudWxsKSB7Ci0JCQlmRGVzaWduVmlld2VyLnNldERvY3VtZW50KGdldERvY3VtZW50KCkpOwotCQl9Ci0KLQkJLyoKLQkJICogQ29ubmVjdCBzZWxlY3Rpb24gZnJvbSB0aGUgRGVzaWduIHBhZ2UgdG8gdGhlIHNlbGVjdGlvbiBwcm92aWRlcgotCQkgKiBmb3IgdGhlIFhNTE11bHRpUGFnZUVkaXRvclBhcnQgc28gdGhhdCBzZWxlY3Rpb24gY2hhbmdlcyBpbiB0aGUKLQkJICogRGVzaWduIHBhZ2Ugd2lsbCBwcm9wb2dhdGUgYWNyb3NzIHRoZSB3b3JrYmVuY2gKLQkJICovCi0JCWlmIChmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkgaW5zdGFuY2VvZiBJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSB7Ci0JCQkoKElQb3N0U2VsZWN0aW9uUHJvdmlkZXIpIGZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuYWRkUG9zdFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkoKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVBvc3RTZWxlY3Rpb25DaGFuZ2VkKGV2ZW50KTsKLQkJCQl9Ci0JCQl9KTsKLQkJfQotCQlmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkoKE11bHRpUGFnZVNlbGVjdGlvblByb3ZpZGVyKSBnZXRTaXRlKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKSkuZmlyZVNlbGVjdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJfQotCQl9KTsKLQotCQkvKgotCQkgKiBDb25uZWN0IHNlbGVjdGlvbiBmcm9tIHRoZSBEZXNpZ24gcGFnZSB0byB0aGUgc2VsZWN0aW9uIHByb3ZpZGVyIG9mCi0JCSAqIHRoZSBTb3VyY2UgcGFnZSBzbyB0aGF0IHNlbGVjdGlvbiBpbiB0aGUgRGVzaWduIHBhZ2Ugd2lsbCBkcml2ZQotCQkgKiBzZWxlY3Rpb24gaW4gdGhlIFNvdXJjZSBwYWdlLiBQcmVmZXIgcG9zdCBzZWxlY3Rpb24uCi0JCSAqLwotCQlpZiAoZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJKChJUG9zdFNlbGVjdGlvblByb3ZpZGVyKSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IElTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQkJLyoKLQkJCQkJICogT25seSBmb3JjZSBzZWxlY3Rpb24gdXBkYXRlIGlmIHNvdXJjZSBwYWdlIGlzIG5vdAotCQkJCQkgKiBhY3RpdmUKLQkJCQkJICovCi0JCQkJCWlmIChnZXRBY3RpdmVQYWdlKCkgIT0gZlNvdXJjZVBhZ2VJbmRleCkgewotCQkJCQkJZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuc2V0U2VsZWN0aW9uKGV2ZW50LmdldFNlbGVjdGlvbigpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0pOwotCQl9Ci0JCWVsc2UgewotCQkJZkRlc2lnblZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkgewotCQkJCQkvKgotCQkJCQkgKiBPbmx5IGZvcmNlIHNlbGVjdGlvbiB1cGRhdGUgaWYgc291cmNlIHBhZ2UgaXMgbm90Ci0JCQkJCSAqIGFjdGl2ZQotCQkJCQkgKi8KLQkJCQkJaWYgKGdldEFjdGl2ZVBhZ2UoKSAhPSBmU291cmNlUGFnZUluZGV4KSB7Ci0JCQkJCQlnZXRUZXh0RWRpdG9yKCkuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKS5zZXRTZWxlY3Rpb24oZXZlbnQuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQotCQkvKgotCQkgKiBIYW5kbGUgZG91YmxlLWNsaWNrIGluIHRoZSBEZXNpZ24gcGFnZSBieSBzZWxlY3RpbmcgdGhlCi0JCSAqIGNvcnJlc3BvbmRpbmcgYW1vdW50IG9mIHRleHQgaW4gdGhlIFNvdXJjZSBwYWdlLgotCQkgKi8KLQkJZkRlc2lnblZpZXdlci5nZXRDb250cm9sKCkuYWRkTGlzdGVuZXIoU1dULk1vdXNlRG91YmxlQ2xpY2ssIG5ldyBMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KSB7Ci0JCQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSBmRGVzaWduVmlld2VyLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJaW50IHN0YXJ0ID0gLTE7Ci0JCQkJaW50IGxlbmd0aCA9IC0xOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJCQkvKgotCQkJCQkgKiBzZWxlY3Rpb24gZ29lcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgZmlyc3Qgb2JqZWN0IHRvCi0JCQkJCSAqIHRoZSBlbmQgb2YgdGhlIGxhc3QKLQkJCQkJICovCi0JCQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIHN0cnVjdHVyZWRTZWxlY3Rpb24gPSAoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbjsKLQkJCQkJT2JqZWN0IG8gPSBzdHJ1Y3R1cmVkU2VsZWN0aW9uLmdldEZpcnN0RWxlbWVudCgpOwotCQkJCQlPYmplY3QgbzIgPSBudWxsOwotCQkJCQlpZiAoc3RydWN0dXJlZFNlbGVjdGlvbi5zaXplKCkgPiAxKSB7Ci0JCQkJCQlvMiA9IHN0cnVjdHVyZWRTZWxlY3Rpb24udG9BcnJheSgpW3N0cnVjdHVyZWRTZWxlY3Rpb24uc2l6ZSgpIC0gMV07Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlvMiA9IG87Ci0JCQkJCX0KLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBJbmRleGVkUmVnaW9uKSB7Ci0JCQkJCQlzdGFydCA9ICgoSW5kZXhlZFJlZ2lvbikgbykuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCWxlbmd0aCA9ICgoSW5kZXhlZFJlZ2lvbikgbzIpLmdldEVuZE9mZnNldCgpIC0gc3RhcnQ7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobzIgaW5zdGFuY2VvZiBJVGV4dFJlZ2lvbikgewotCQkJCQkJc3RhcnQgPSAoKElUZXh0UmVnaW9uKSBvKS5nZXRTdGFydCgpOwotCQkJCQkJbGVuZ3RoID0gKChJVGV4dFJlZ2lvbikgbzIpLmdldEVuZCgpIC0gc3RhcnQ7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVRleHRTZWxlY3Rpb24pIHsKLQkJCQkJc3RhcnQgPSAoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldE9mZnNldCgpOwotCQkJCQlsZW5ndGggPSAoKElUZXh0U2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldExlbmd0aCgpOwotCQkJCX0KLQkJCQlpZiAoc3RhcnQgPiAtMSAmJiBsZW5ndGggPiAtMSkgewotCQkJCQlnZXRUZXh0RWRpdG9yKCkuc2VsZWN0QW5kUmV2ZWFsKHN0YXJ0LCBsZW5ndGgpOwotCQkJCX0KLQkJCX0KLQkJfSk7Ci0KLQkJLyoKLQkJICogQ29ubmVjdCBzZWxlY3Rpb24gZnJvbSB0aGUgU291cmNlIHBhZ2UgdG8gdGhlIHNlbGVjdGlvbiBwcm92aWRlciBvZgotCQkgKiB0aGUgRGVzaWduIHBhZ2Ugc28gdGhhdCBzZWxlY3Rpb24gaW4gdGhlIFNvdXJjZSBwYWdlIHdpbGwgZHJpdmUKLQkJICogc2VsZWN0aW9uIGluIHRoZSBEZXNpZ24gcGFnZS4gUHJlZmVyIHBvc3Qgc2VsZWN0aW9uLgotCQkgKi8KLQkJSVNlbGVjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gZ2V0VGV4dEVkaXRvcigpLmdldFNlbGVjdGlvblByb3ZpZGVyKCk7Ci0JCWlmIChmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyID09IG51bGwpIHsKLQkJCWZUZXh0RWRpdG9yU2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgVGV4dEVkaXRvclBvc3RTZWxlY3Rpb25BZGFwdGVyKCk7Ci0JCX0KLQkJaWYgKHByb3ZpZGVyIGluc3RhbmNlb2YgSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgewotCQkJZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lci5mb3JjZVBvc3RTZWxlY3Rpb24gPSBmYWxzZTsKLQkJCSgoSVBvc3RTZWxlY3Rpb25Qcm92aWRlcikgcHJvdmlkZXIpLmFkZFBvc3RTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVGV4dEVkaXRvclNlbGVjdGlvbkxpc3RlbmVyLmZvcmNlUG9zdFNlbGVjdGlvbiA9IHRydWU7Ci0JCQlwcm92aWRlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIoZlRleHRFZGl0b3JTZWxlY3Rpb25MaXN0ZW5lcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYW5kIEFkZCB0aGUgRGVzaWduIFBhZ2UgdXNpbmcgYSByZWdpc3RlcmVkIGZhY3RvcnkKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgY3JlYXRlQW5kQWRkRGVzaWduUGFnZSgpIHsKLQkJSURlc2lnblZpZXdlciBkZXNpZ25WaWV3ZXIgPSBjcmVhdGVEZXNpZ25QYWdlKCk7Ci0KLQkJZkRlc2lnblZpZXdlciA9IGRlc2lnblZpZXdlcjsKLQkJLy8gbm90ZTogQnkgYWRkaW5nIHRoZSBkZXNpZ24gcGFnZSBhcyBhIENvbnRyb2wgaW5zdGVhZCBvZiBhbgotCQkvLyBJRWRpdG9yUGFydCwgcGFnZSBzd2l0Y2hlcyB3aWxsIGluZGljYXRlCi0JCS8vIGEgIm51bGwiIGFjdGl2ZSBlZGl0b3Igd2hlbiB0aGUgZGVzaWduIHBhZ2UgaXMgbWFkZSBhY3RpdmUKLQkJZkRlc2lnblBhZ2VJbmRleCA9IGFkZFBhZ2UoZGVzaWduVmlld2VyLmdldENvbnRyb2woKSk7Ci0JCXNldFBhZ2VUZXh0KGZEZXNpZ25QYWdlSW5kZXgsIGRlc2lnblZpZXdlci5nZXRUaXRsZSgpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSURlc2lnblZpZXdlciBjcmVhdGVEZXNpZ25QYWdlKCkgewotCQlYTUxUYWJsZVRyZWVWaWV3ZXIgdGFibGVUcmVlVmlld2VyID0gbmV3IFhNTFRhYmxlVHJlZVZpZXdlcihnZXRDb250YWluZXIoKSk7Ci0JCS8vIFNldCB0aGUgZGVmYXVsdCBpbmZvcG9wIGZvciBYTUwgZGVzaWduIHZpZXdlci4KLQkJWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscCh0YWJsZVRyZWVWaWV3ZXIuZ2V0Q29udHJvbCgpLCBYTUxUYWJsZVRyZWVIZWxwQ29udGV4dElkcy5YTUxfREVTSUdOX1ZJRVdfSEVMUElEKTsKLQkJcmV0dXJuIHRhYmxlVHJlZVZpZXdlcjsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBwYWdlcyBvZiB0aGlzIG11bHRpLXBhZ2UgZWRpdG9yLgotCSAqIDxwPgotCSAqIFN1YmNsYXNzZXMgb2YgPGNvZGU+TXVsdGlQYWdlRWRpdG9yPC9jb2RlPiBtdXN0IGltcGxlbWVudCB0aGlzCi0JICogbWV0aG9kLgotCSAqIDwvcD4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVQYWdlcygpIHsKLQkJdHJ5IHsKLQkJCS8vIHNvdXJjZSBwYWdlIE1VU1QgYmUgY3JlYXRlZCBiZWZvcmUgZGVzaWduIHBhZ2UsIG5vdwotCQkJY3JlYXRlU291cmNlUGFnZSgpOwotCi0JCQljcmVhdGVBbmRBZGREZXNpZ25QYWdlKCk7Ci0JCQlhZGRTb3VyY2VQYWdlKCk7Ci0JCQljb25uZWN0RGVzaWduUGFnZSgpOwotCi0JCQkvLyBzZXQgdGhlIGFjdGl2ZSBlZGl0b3IgaW4gdGhlIGFjdGlvbiBiYXIgY29udHJpYnV0b3IgZmlyc3QKLQkJCS8vIGJlZm9yZSBzZXRhY3RpdmVwYWdlIGNhbGxzIGFjdGlvbiBiYXIgY29udHJpYnV0b3IncwotCQkJLy8gc2V0YWN0aXZlcGFnZSAoYnVnMTQxMDEzIC0gcmVtb3ZlIHdoZW4gYnVnMTUxNDg4IGlzIGZpeGVkKQotCQkJSUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yIGNvbnRyaWJ1dG9yID0gZ2V0RWRpdG9yU2l0ZSgpLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQlpZiAoY29udHJpYnV0b3IgaW5zdGFuY2VvZiBNdWx0aVBhZ2VFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvcikgewotCQkJCSgoTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIGNvbnRyaWJ1dG9yKS5zZXRBY3RpdmVFZGl0b3IodGhpcyk7Ci0JCQl9Ci0KLQkJCWludCBhY3RpdmVQYWdlSW5kZXggPSBnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRJbnQoSVhNTFByZWZlcmVuY2VOYW1lcy5MQVNUX0FDVElWRV9QQUdFKTsKLQkJCWlmIChhY3RpdmVQYWdlSW5kZXggPj0gMCAmJiBhY3RpdmVQYWdlSW5kZXggPCBnZXRQYWdlQ291bnQoKSkgewotCQkJCXNldEFjdGl2ZVBhZ2UoYWN0aXZlUGFnZUluZGV4KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXNldEFjdGl2ZVBhZ2UoZlNvdXJjZVBhZ2VJbmRleCk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkucGFydC5NdWx0aVBhZ2VFZGl0b3JQYXJ0I2NyZWF0ZVNpdGUob3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQpCi0JICovCi0JcHJvdGVjdGVkIElFZGl0b3JTaXRlIGNyZWF0ZVNpdGUoSUVkaXRvclBhcnQgZWRpdG9yKSB7Ci0JCUlFZGl0b3JTaXRlIHNpdGUgPSBudWxsOwotCQlpZiAoZWRpdG9yID09IGZUZXh0RWRpdG9yKSB7Ci0JCQlzaXRlID0gbmV3IE11bHRpUGFnZUVkaXRvclNpdGUodGhpcywgZWRpdG9yKSB7Ci0JCQkJLyoqCi0JCQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclNpdGUjZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKQotCQkJCSAqLwotCQkJCXB1YmxpYyBJRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IgZ2V0QWN0aW9uQmFyQ29udHJpYnV0b3IoKSB7Ci0JCQkJCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBjb250cmlidXRvciA9IHN1cGVyLmdldEFjdGlvbkJhckNvbnRyaWJ1dG9yKCk7Ci0JCQkJCUlFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciBtdWx0aUNvbnRyaWJ1dG9yID0gWE1MTXVsdGlQYWdlRWRpdG9yUGFydC50aGlzLmdldEVkaXRvclNpdGUoKS5nZXRBY3Rpb25CYXJDb250cmlidXRvcigpOwotCQkJCQlpZiAobXVsdGlDb250cmlidXRvciBpbnN0YW5jZW9mIFhNTE11bHRpUGFnZUVkaXRvckFjdGlvbkJhckNvbnRyaWJ1dG9yKSB7Ci0JCQkJCQljb250cmlidXRvciA9ICgoWE1MTXVsdGlQYWdlRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IpIG11bHRpQ29udHJpYnV0b3IpLnNvdXJjZVZpZXdlckFjdGlvbkNvbnRyaWJ1dG9yOwotCQkJCQl9Ci0JCQkJCXJldHVybiBjb250cmlidXRvcjsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQkJCQkvLyBzZXRzIHRoaXMgaWQgc28gbmVzdGVkIGVkaXRvciBpcyBjb25zaWRlcmVkIHhtbCBzb3VyY2UKLQkJCQkJLy8gcGFnZQotCQkJCQlyZXR1cm4gQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCArICIuc291cmNlIjsgLy8kTk9OLU5MUy0xJDsKLQkJCQl9Ci0JCQl9OwotCQl9Ci0JCWVsc2UgewotCQkJc2l0ZSA9IHN1cGVyLmNyZWF0ZVNpdGUoZWRpdG9yKTsKLQkJfQotCQlyZXR1cm4gc2l0ZTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIHRoZSBzb3VyY2UgcGFnZSBvZiB0aGUgbXVsdGktcGFnZSBlZGl0b3IuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlU291cmNlUGFnZSgpIHRocm93cyBQYXJ0SW5pdEV4Y2VwdGlvbiB7Ci0JCWZUZXh0RWRpdG9yID0gY3JlYXRlVGV4dEVkaXRvcigpOwotCQlmVGV4dEVkaXRvci5zZXRFZGl0b3JQYXJ0KHRoaXMpOwotCi0JCWlmIChmUHJvcGVydHlMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmUHJvcGVydHlMaXN0ZW5lciA9IG5ldyBQcm9wZXJ0eUxpc3RlbmVyKCk7Ci0JCX0KLQkJZlRleHRFZGl0b3IuYWRkUHJvcGVydHlMaXN0ZW5lcihmUHJvcGVydHlMaXN0ZW5lcik7Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIGNyZWF0ZVRleHRFZGl0b3IuCi0JICogCi0JICogQHJldHVybiBTdHJ1Y3R1cmVkVGV4dEVkaXRvcgotCSAqLwotCXByaXZhdGUgU3RydWN0dXJlZFRleHRFZGl0b3IgY3JlYXRlVGV4dEVkaXRvcigpIHsKLQkJcmV0dXJuIG5ldyBTdHJ1Y3R1cmVkVGV4dEVkaXRvcigpOwotCX0KLQotCXByaXZhdGUgdm9pZCBkaXNjb25uZWN0RGVzaWduUGFnZSgpIHsKLQkJaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkgewotCQkJZkRlc2lnblZpZXdlci5zZXREb2N1bWVudChudWxsKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0OjpkaXNwb3NlIGVudHJ5Iik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCWRpc2Nvbm5lY3REZXNpZ25QYWdlKCk7Ci0KLQkJaWYgKGZBY3RpdmF0aW9uTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJZkFjdGl2YXRpb25MaXN0ZW5lci5kaXNwb3NlKCk7Ci0JCQlmQWN0aXZhdGlvbkxpc3RlbmVyID0gbnVsbDsKLQkJfQotCi0JCWlmIChmVGV4dEVkaXRvciAhPSBudWxsICYmIGZQcm9wZXJ0eUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCWZUZXh0RWRpdG9yLnJlbW92ZVByb3BlcnR5TGlzdGVuZXIoZlByb3BlcnR5TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gbW92ZWQgdG8gbGFzdCB3aGVuIGFkZGVkIHdpbmRvdyAuLi4gc2VlbXMgbGlrZQotCQkvLyB3ZSdkIGJlIGluIGRhbmdlciBvZiBsb3Npbmcgc29tZSBkYXRhLCBsaWtlIHNpdGUsCi0JCS8vIG9yIHNvbWV0aGluZy4KLQkJc3VwZXIuZGlzcG9zZSgpOwotCi0JCUxvZ2dlci50cmFjZSgiU291cmNlIEVkaXRvciIsICJTdHJ1Y3R1cmVkVGV4dE11bHRpUGFnZUVkaXRvclBhcnQ6OmRpc3Bvc2UgZXhpdCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNkb1NhdmUob3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3IpCi0JICovCi0JcHVibGljIHZvaWQgZG9TYXZlKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlmVGV4dEVkaXRvci5kb1NhdmUobW9uaXRvcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JU2F2ZWFibGVQYXJ0I2RvU2F2ZUFzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBkb1NhdmVBcygpIHsKLQkJZlRleHRFZGl0b3IuZG9TYXZlQXMoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBrZXkpIHsKLQkJT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChrZXkgPT0gSURlc2lnblZpZXdlci5jbGFzcykgewotCQkJcmVzdWx0ID0gZkRlc2lnblZpZXdlcjsKLQotCQl9Ci0JCWVsc2UgaWYgKGtleS5lcXVhbHMoSUdvdG9NYXJrZXIuY2xhc3MpKSB7Ci0JCQlyZXN1bHQgPSBuZXcgSUdvdG9NYXJrZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZ290b01hcmtlcihJTWFya2VyIG1hcmtlcikgewotCQkJCQlYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0LnRoaXMuZ290b01hcmtlcihtYXJrZXIpOwotCQkJCX0KLQkJCX07Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBETVc6IEknbSBidWxsZXQtcHJvb2ZpbmcgdGhpcyBiZWNhdXNlCi0JCQkvLyBpdHMgYmVlbiByZXBvcnRlZCAob24gSUJNIFdTQUQgNC4wMyB2ZXJzaW9uKSBhIG51bGwgcG9pbnRlcgotCQkJLy8gc29tZXRpbWVzCi0JCQkvLyBoYXBwZW5zIGhlcmUgb24gc3RhcnR1cCwgd2hlbiBhbiBlZGl0b3IgaGFzIGJlZW4gbGVmdAotCQkJLy8gb3BlbiB3aGVuIHdvcmtiZW5jaCBzaHV0ZG93bi4KLQkJCWlmIChmVGV4dEVkaXRvciAhPSBudWxsKSB7Ci0JCQkJcmVzdWx0ID0gZlRleHRFZGl0b3IuZ2V0QWRhcHRlcihrZXkpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0JCWlmIChmVGV4dEVkaXRvciAhPSBudWxsKQotCQkJZG9jdW1lbnQgPSBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JCXJldHVybiBkb2N1bWVudDsKLQl9Ci0KLQlwcml2YXRlIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCVN0cnVjdHVyZWRUZXh0RWRpdG9yIGdldFRleHRFZGl0b3IoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0I2dldFRpdGxlKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgewotCQlTdHJpbmcgdGl0bGUgPSBudWxsOwotCQlpZiAoZ2V0VGV4dEVkaXRvcigpID09IG51bGwpIHsKLQkJCWlmIChnZXRFZGl0b3JJbnB1dCgpICE9IG51bGwpIHsKLQkJCQl0aXRsZSA9IGdldEVkaXRvcklucHV0KCkuZ2V0TmFtZSgpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJdGl0bGUgPSBnZXRUZXh0RWRpdG9yKCkuZ2V0VGl0bGUoKTsKLQkJfQotCQlpZiAodGl0bGUgPT0gbnVsbCkgewotCQkJdGl0bGUgPSBnZXRQYXJ0TmFtZSgpOwotCQl9Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQl2b2lkIGdvdG9NYXJrZXIoSU1hcmtlciBtYXJrZXIpIHsKLQkJc2V0QWN0aXZlUGFnZShmU291cmNlUGFnZUluZGV4KTsKLQkJSURFLmdvdG9NYXJrZXIoZlRleHRFZGl0b3IsIG1hcmtlcik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydCNpbml0KG9yZy5lY2xpcHNlLnVpLklFZGl0b3JTaXRlLAotCSAqICAgICAgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXB1YmxpYyB2b2lkIGluaXQoSUVkaXRvclNpdGUgc2l0ZSwgSUVkaXRvcklucHV0IGlucHV0KSB0aHJvd3MgUGFydEluaXRFeGNlcHRpb24gewotCQl0cnkgewotCQkJc3VwZXIuaW5pdChzaXRlLCBpbnB1dCk7Ci0JCQkvLyB3ZSB3YW50IHRvIGxpc3RlbiBmb3Igb3VyIG93biBhY3RpdmF0aW9uCi0JCQlmQWN0aXZhdGlvbkxpc3RlbmVyID0gbmV3IEFjdGl2YXRpb25MaXN0ZW5lcihzaXRlLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFBhcnRTZXJ2aWNlKCkpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbigiZXhjZXB0aW9uIGluaXRpYWxpemluZyAiICsgZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGUpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJc2V0UGFydE5hbWUoaW5wdXQuZ2V0TmFtZSgpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklTYXZlYWJsZVBhcnQjaXNTYXZlQXNBbGxvd2VkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVBc0FsbG93ZWQoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvciAhPSBudWxsICYmIGZUZXh0RWRpdG9yLmlzU2F2ZUFzQWxsb3dlZCgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSVNhdmVhYmxlUGFydCNpc1NhdmVPbkNsb3NlTmVlZGVkKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc1NhdmVPbkNsb3NlTmVlZGVkKCkgewotCQkvLyBvdmVycmlkaW5nIHN1cGVyIGNsYXNzIHNpbmNlIGl0IGRvZXMgYSBsb3dseSBpc0RpcnR5IQotCQlpZiAoZlRleHRFZGl0b3IgIT0gbnVsbCkKLQkJCXJldHVybiBmVGV4dEVkaXRvci5pc1NhdmVPbkNsb3NlTmVlZGVkKCk7Ci0JCXJldHVybiBpc0RpcnR5KCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0Lk11bHRpUGFnZUVkaXRvclBhcnQjcGFnZUNoYW5nZShpbnQpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgcGFnZUNoYW5nZShpbnQgbmV3UGFnZUluZGV4KSB7Ci0JCXN1cGVyLnBhZ2VDaGFuZ2UobmV3UGFnZUluZGV4KTsKLQkJc2F2ZUxhc3RBY3RpdmVQYWdlSW5kZXgobmV3UGFnZUluZGV4KTsKLQotCQlpZiAobmV3UGFnZUluZGV4ID09IGZEZXNpZ25QYWdlSW5kZXgpIHsKLQkJCS8vIGRlc2lnbiBwYWdlIGlzbid0IGFuIElFZGl0b3JQYXJ0LCB0aGVyZWZvcmUgd2UgaGF2ZSB0byBzZW5kCi0JCQkvLyBzZWxlY3Rpb24gY2hhbmdlcyBvdXJzZWx2ZXMKLQkJCUlTZWxlY3Rpb25Qcm92aWRlciBzZWxlY3Rpb25Qcm92aWRlciA9IGZEZXNpZ25WaWV3ZXIuZ2V0U2VsZWN0aW9uUHJvdmlkZXIoKTsKLQkJCWlmIChzZWxlY3Rpb25Qcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50ID0gbmV3IFNlbGVjdGlvbkNoYW5nZWRFdmVudChzZWxlY3Rpb25Qcm92aWRlciwgc2VsZWN0aW9uUHJvdmlkZXIuZ2V0U2VsZWN0aW9uKCkpOwotCQkJCSgoTXVsdGlQYWdlU2VsZWN0aW9uUHJvdmlkZXIpIGdldFNpdGUoKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpKS5maXJlU2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQkJKChNdWx0aVBhZ2VTZWxlY3Rpb25Qcm92aWRlcikgZ2V0U2l0ZSgpLmdldFNlbGVjdGlvblByb3ZpZGVyKCkpLmZpcmVQb3N0U2VsZWN0aW9uQ2hhbmdlZChldmVudCk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgc2F2ZUxhc3RBY3RpdmVQYWdlSW5kZXgoaW50IG5ld1BhZ2VJbmRleCkgewotCQkvLyBzYXZlIHRoZSBsYXN0IGFjdGl2ZSBwYWdlIGluZGV4IHRvIHByZWZlcmVuY2UgbWFuYWdlcgotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShJWE1MUHJlZmVyZW5jZU5hbWVzLkxBU1RfQUNUSVZFX1BBR0UsIG5ld1BhZ2VJbmRleCk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5wYXJ0LkVkaXRvclBhcnQjc2V0SW5wdXQob3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldElucHV0KElFZGl0b3JJbnB1dCBpbnB1dCkgewotCQkvLyBJZiBkcml2ZW4gZnJvbSB0aGUgU291cmNlIHBhZ2UsIGl0J3MgIm1vZGVsIiBtYXkgbm90IGJlIHVwIHRvIGRhdGUKLQkJLy8gd2l0aCB0aGUgaW5wdXQganVzdCB5ZXQuIFdlJ2xsIHJlbHkgb24gbGF0ZXIgbm90aWZpY2F0aW9uIGZyb20gdGhlCi0JCS8vIFRleHRWaWV3ZXIgdG8gc2V0IHVzIHN0cmFpZ2h0Ci0JCXN1cGVyLnNldElucHV0KGlucHV0KTsKLQkJaWYgKGZEZXNpZ25WaWV3ZXIgIT0gbnVsbCkKLQkJCWZEZXNpZ25WaWV3ZXIuc2V0RG9jdW1lbnQoZ2V0RG9jdW1lbnQoKSk7Ci0JCXNldFBhcnROYW1lKGlucHV0LmdldE5hbWUoKSk7Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTVjN2EyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklDb250cmlidXRpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklUb29sQmFyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUFjdGlvbkJhcnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydFNpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5DTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeWltcGwuSW5mZXJyZWRHcmFtbWFyQnVpbGRpbmdDTURvY3VtZW50TG9hZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi0vKioKLSAqICAKLSAqLwotcHVibGljIGNsYXNzIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yIGltcGxlbWVudHMgSURlc2lnblZpZXdlckFjdGlvbkJhckNvbnRyaWJ1dG9yIHsKLQotCXByb3RlY3RlZCBJRWRpdG9yUGFydCBlZGl0b3JQYXJ0OwotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIERFU0lHTl9WSUVXRVJfU0VQQVJBVE9SXzFfSUQgPSAic2VkLnRhYmxldHJlZS5zZXBhcmF0b3IuMSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBERVNJR05fVklFV0VSX1NFUEFSQVRPUl8yX0lEID0gInNlZC50YWJsZXRyZWUuc2VwYXJhdG9yLjIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgVkFMSURBVEVfWE1MX0lEID0gInNlZC50YWJsZXRyZWUudmFsaWRhdGVYTUwiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUkVMT0FEX0dSQU1NQVJfSUQgPSAic2VkLnRhYmxldHJlZS5yZWxvYWRHcmFtbWFyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIFRPR0dMRV9FRElUX01PREVfSUQgPSAic2VkLnRhYmxldHJlZS50b2dnbGVFZGl0TW9kZSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBFWFBBTkRfQUxMX0lEID0gInNlZC50YWJsZXRyZWUuZXhwYW5kQWxsIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIENPTExBUFNFX0FMTF9JRCA9ICJzZWQudGFibGV0cmVlLmNvbGxhcHNlQWxsIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJvdGVjdGVkIFRvZ2dsZUVkaXRNb2RlQWN0aW9uIHRvZ2dsZUFjdGlvbjsKLQlwcm90ZWN0ZWQgUmVsb2FkR3JhbW1hckFjdGlvbiByZWxvYWRHcmFtbWFyQWN0aW9uOwotCS8vCXByb3RlY3RlZCBWYWxpZGF0ZVhNTEFjdGlvbiB2YWxpZGF0ZVhNTEFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24gZXhwYW5kQWN0aW9uOwotCXByb3RlY3RlZCBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbiBjb2xsYXBzZUFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24geG1sTWVudUV4cGFuZEFjdGlvbjsKLQlwcm90ZWN0ZWQgVmlld2VyRXhwYW5kQ29sbGFwc2VBY3Rpb24geG1sTWVudUNvbGxhcHNlQWN0aW9uOwotCi0JcHVibGljIFhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yKCkgewotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbW92ZUNvbnRyaWJ1dGlvbnMoSUNvbnRyaWJ1dGlvbk1hbmFnZXIgbWFuYWdlcikgewotCQl0cnkgewotCQkJZG9SZW1vdmUobWFuYWdlciwgREVTSUdOX1ZJRVdFUl9TRVBBUkFUT1JfMV9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBERVNJR05fVklFV0VSX1NFUEFSQVRPUl8yX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIFZBTElEQVRFX1hNTF9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBSRUxPQURfR1JBTU1BUl9JRCk7Ci0JCQlkb1JlbW92ZShtYW5hZ2VyLCBUT0dHTEVfRURJVF9NT0RFX0lEKTsKLQkJCWRvUmVtb3ZlKG1hbmFnZXIsIEVYUEFORF9BTExfSUQpOwotCQkJZG9SZW1vdmUobWFuYWdlciwgQ09MTEFQU0VfQUxMX0lEKTsKLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvUmVtb3ZlKElDb250cmlidXRpb25NYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBpZCkgewotCQl0cnkgewotCQkJaWYgKG1hbmFnZXIuZmluZChpZCkgIT0gbnVsbCkgewotCQkJCW1hbmFnZXIucmVtb3ZlKGlkKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycywgSVdvcmtiZW5jaFBhZ2UgcGFnZSkgewotCQlpbml0KGJhcnMpOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbkJhcnMgYmFycykgewotCQlJVG9vbEJhck1hbmFnZXIgdGJtID0gYmFycy5nZXRUb29sQmFyTWFuYWdlcigpOwotCi0JCUlNZW51TWFuYWdlciB4bWxNZW51ID0gYmFycy5nZXRNZW51TWFuYWdlcigpLmZpbmRNZW51VXNpbmdQYXRoKCJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLmRlc2lnbi54bWxtZW51Iik7IC8vJE5PTi1OTFMtMSQKLQotCQlpZiAoeG1sTWVudSA9PSBudWxsKSB7Ci0JCQl4bWxNZW51ID0gbmV3IE1lbnVNYW5hZ2VyKFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzAsICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLmRlc2lnbi54bWxtZW51Iik7IC8vJE5PTi1OTFMtMSQKLQkJCWJhcnMuZ2V0TWVudU1hbmFnZXIoKS5pbnNlcnRCZWZvcmUoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX1dJTkRPVywgeG1sTWVudSk7Ci0JCX0gZWxzZSB7Ci0JCQlyZW1vdmVDb250cmlidXRpb25zKHhtbE1lbnUpOwotCQl9Ci0KLQkJdGJtLmFkZChuZXcgU2VwYXJhdG9yKCJERVNJR05fVklFV0VSX1NFUEFSQVRPUl8xX0lEIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gVmFsaWRhdGVYTUxBY3Rpb24KLQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAKLQkJLy8gdWdseSBoYWNrIC4uLiB3ZSBkb24ndCBjb250cmlidXRlIHRoZSBnZW5lcmljIFhNTCB2YWxpZGF0b3IgaWYgd2UKLQkJLy8gYWxyZWFkeQotCQkvLyBoYXZlIGEgREFEIHZhbGlkYXRvciBjb250cmlidXRpb24gKGluIHRoZSBjYXNlIG9mIHRoZSBEQUQgZWRpdG9yKS4KLQkJLy8gVGhpcyBoYWNrIHdpbGwgYmUgcmVtb3ZlZCB3aGVuIGRlZmVjdCAyMTI0NDggaXMgZml4ZWQuCi0JCS8vCi0JCS8vCQlpZiAodGJtLmZpbmQoInZhbGlkYXRlLmRhZC52YWxpZGF0ZURBRCIpID09IG51bGwpIHsKLQkJLy8JCQl2YWxpZGF0ZVhNTEFjdGlvbiA9IG5ldyBWYWxpZGF0ZVhNTEFjdGlvbigpOwotCQkvLwkJCXRibS5hZGQodmFsaWRhdGVYTUxBY3Rpb24pOwotCQkvLwkJCXhtbE1lbnUuYWRkKHZhbGlkYXRlWE1MQWN0aW9uKTsKLQkJLy8JCX0KLQotCQkvLyBUb2dnbGVFZGl0TW9kZUFjdGlvbgotCQkvLyAgICAgICAgICAgCi0JCXRvZ2dsZUFjdGlvbiA9IG5ldyBUb2dnbGVFZGl0TW9kZUFjdGlvbigpOwotCQl0b2dnbGVBY3Rpb24uc2V0SWQoVE9HR0xFX0VESVRfTU9ERV9JRCk7Ci0JCXhtbE1lbnUuYWRkKHRvZ2dsZUFjdGlvbik7Ci0JCXRibS5hZGQodG9nZ2xlQWN0aW9uKTsKLQotCQkvLyBSZWxvYWRHcmFtbWFyQWN0aW9uCi0JCS8vCi0JCXJlbG9hZEdyYW1tYXJBY3Rpb24gPSBuZXcgUmVsb2FkR3JhbW1hckFjdGlvbigpOwotCQlyZWxvYWRHcmFtbWFyQWN0aW9uLnNldElkKFJFTE9BRF9HUkFNTUFSX0lEKTsKLQkJdGJtLmFkZChyZWxvYWRHcmFtbWFyQWN0aW9uKTsKLQkJeG1sTWVudS5hZGQocmVsb2FkR3JhbW1hckFjdGlvbik7Ci0KLQkJeG1sTWVudS5hZGQobmV3IFNlcGFyYXRvcigpKTsKLQotCQkvLyBFeHBhbmRDb2xsYXBzZUFjdGlvbgotCQkvLwotCQl4bWxNZW51RXhwYW5kQWN0aW9uID0gbmV3IFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uKHRydWUpOwotCQl4bWxNZW51RXhwYW5kQWN0aW9uLnNldElkKEVYUEFORF9BTExfSUQpOwotCQl4bWxNZW51RXhwYW5kQWN0aW9uLnNldFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMSk7IC8vJE5PTi1OTFMtMSQKLQkJeG1sTWVudS5hZGQoeG1sTWVudUV4cGFuZEFjdGlvbik7Ci0KLQkJeG1sTWVudUNvbGxhcHNlQWN0aW9uID0gbmV3IFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uKGZhbHNlKTsKLQkJeG1sTWVudUNvbGxhcHNlQWN0aW9uLnNldElkKENPTExBUFNFX0FMTF9JRCk7Ci0JCXhtbE1lbnVDb2xsYXBzZUFjdGlvbi5zZXRJZChFWFBBTkRfQUxMX0lEKTsKLQkJeG1sTWVudUNvbGxhcHNlQWN0aW9uLnNldFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMik7IC8vJE5PTi1OTFMtMSQKLQkJeG1sTWVudS5hZGQoeG1sTWVudUNvbGxhcHNlQWN0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25XaXRoSWQoSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBBY3Rpb24gYWN0aW9uLCBTdHJpbmcgaWQpIHsKLQkJYWN0aW9uLnNldElkKGlkKTsKLQkJbWVudU1hbmFnZXIuYWRkKGFjdGlvbik7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9ucyhJQWN0aW9uQmFycyBiYXJzKSB7Ci0JCUlUb29sQmFyTWFuYWdlciB0Ym0gPSBiYXJzLmdldFRvb2xCYXJNYW5hZ2VyKCk7Ci0JCXRibS5hZGQobmV3IFNlcGFyYXRvcihERVNJR05fVklFV0VSX1NFUEFSQVRPUl8yX0lEKSk7Ci0KLQkJZXhwYW5kQWN0aW9uID0gbmV3IFZpZXdlckV4cGFuZENvbGxhcHNlQWN0aW9uKHRydWUpOwotCQlleHBhbmRBY3Rpb24uc2V0SWQoRVhQQU5EX0FMTF9JRCk7Ci0JCXRibS5hZGQoZXhwYW5kQWN0aW9uKTsKLQotCQljb2xsYXBzZUFjdGlvbiA9IG5ldyBWaWV3ZXJFeHBhbmRDb2xsYXBzZUFjdGlvbihmYWxzZSk7Ci0JCWNvbGxhcHNlQWN0aW9uLnNldElkKENPTExBUFNFX0FMTF9JRCk7Ci0JCXRibS5hZGQoY29sbGFwc2VBY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCWlmIChleHBhbmRBY3Rpb24gIT0gbnVsbCkgewotCQkJZXhwYW5kQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCQl4bWxNZW51RXhwYW5kQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCX0KLQotCQlpZiAoY29sbGFwc2VBY3Rpb24gIT0gbnVsbCkgewotCQkJY29sbGFwc2VBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJCXhtbE1lbnVDb2xsYXBzZUFjdGlvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQllZGl0b3JQYXJ0ID0gdGFyZ2V0RWRpdG9yOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBnZXRNb2RlbEZvckVkaXRvclBhcnQodGFyZ2V0RWRpdG9yKTsKLQkJcmVsb2FkR3JhbW1hckFjdGlvbi5zZXRNb2RlbChtb2RlbCk7Ci0JCXRvZ2dsZUFjdGlvbi5zZXRNb2RlbFF1ZXJ5KE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobW9kZWwpKTsKLQotCQlYTUxUYWJsZVRyZWVWaWV3ZXIgdGFibGVUcmVlVmlld2VyID0gZ2V0VGFibGVUcmVlVmlld2VyRm9yRWRpdG9yUGFydChlZGl0b3JQYXJ0KTsKLQkJaWYgKHRhYmxlVHJlZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlleHBhbmRBY3Rpb24uc2V0Vmlld2VyKHRhYmxlVHJlZVZpZXdlcik7Ci0JCQljb2xsYXBzZUFjdGlvbi5zZXRWaWV3ZXIodGFibGVUcmVlVmlld2VyKTsKLQotCQkJeG1sTWVudUV4cGFuZEFjdGlvbi5zZXRWaWV3ZXIodGFibGVUcmVlVmlld2VyKTsKLQkJCXhtbE1lbnVDb2xsYXBzZUFjdGlvbi5zZXRWaWV3ZXIodGFibGVUcmVlVmlld2VyKTsKLQkJfQotCi0JCWlmIChlZGl0b3JQYXJ0IGluc3RhbmNlb2YgWE1MTXVsdGlQYWdlRWRpdG9yUGFydCkgewotCQkJSVdvcmtiZW5jaFBhcnRTaXRlIHNpdGUgPSBlZGl0b3JQYXJ0LmdldFNpdGUoKTsKLQkJCWlmIChzaXRlIGluc3RhbmNlb2YgSUVkaXRvclNpdGUpIHsKLQkJCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKChYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0KSBlZGl0b3JQYXJ0KS5nZXRUZXh0RWRpdG9yKCk7Ci0JCQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9ICgoSUVkaXRvclNpdGUpIHNpdGUpLmdldEFjdGlvbkJhcnMoKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuVU5ETywgZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlVORE8pKTsKLQkJCQlhY3Rpb25CYXJzLnNldEdsb2JhbEFjdGlvbkhhbmRsZXIoSVRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuUkVETywgZ2V0QWN0aW9uKHRleHRFZGl0b3IsIElUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzLlJFRE8pKTsKLQkJCX0KLQkJfQotCi0JCS8vIFRPRE8uLi4gdW5jb21tZW50IHRoaXMgYW5kIGludmVzdGlnYXRlIE5QRQotCQkvLwotCQkvLyBhZGQgdGhlIGN1dC9jb3B5L3Bhc3RlIGZvciB0ZXh0IGZpZWxkcwotCQkvLyBBY3Rpb25IYW5kbGVyUGx1Z2luLmNvbm5lY3RQYXJ0KGVkaXRvclBhcnQpOwotCX0KLQotCXByb3RlY3RlZCBmaW5hbCBJQWN0aW9uIGdldEFjdGlvbihJVGV4dEVkaXRvciBlZGl0b3IsIFN0cmluZyBhY3Rpb25JZCkgewotCQlyZXR1cm4gKGVkaXRvciA9PSBudWxsID8gbnVsbCA6IGVkaXRvci5nZXRBY3Rpb24oYWN0aW9uSWQpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbEZvckVkaXRvclBhcnQoSUVkaXRvclBhcnQgdGFyZ2V0RWRpdG9yKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGVkaXRvclBhcnQgaW5zdGFuY2VvZiBYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKChYTUxNdWx0aVBhZ2VFZGl0b3JQYXJ0KSB0YXJnZXRFZGl0b3IpLmdldFRleHRFZGl0b3IoKTsKLQkJCXJlc3VsdCA9ICh0ZXh0RWRpdG9yICE9IG51bGwpID8gdGV4dEVkaXRvci5nZXRNb2RlbCgpIDogbnVsbDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBYTUxUYWJsZVRyZWVWaWV3ZXIgZ2V0VGFibGVUcmVlVmlld2VyRm9yRWRpdG9yUGFydChJRWRpdG9yUGFydCB0YXJnZXRFZGl0b3IpIHsKLQkJWE1MVGFibGVUcmVlVmlld2VyIHJlc3VsdCA9IG51bGw7Ci0JCU9iamVjdCBvYmplY3QgPSB0YXJnZXRFZGl0b3IuZ2V0QWRhcHRlcihJRGVzaWduVmlld2VyLmNsYXNzKTsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIFhNTFRhYmxlVHJlZVZpZXdlcikgewotCQkJcmVzdWx0ID0gKFhNTFRhYmxlVHJlZVZpZXdlcikgb2JqZWN0OwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBjbGFzcyBUb2dnbGVFZGl0TW9kZUFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3Igb25JbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlRGVzY3JpcHRvcihTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfRVRPT0xfQ09OU1RSQUlOT04pOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIG9mZkltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19FVE9PTF9DT05TVFJBSU5PRkYpOwotCQlwcm90ZWN0ZWQgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5OwotCi0JCXB1YmxpYyBUb2dnbGVFZGl0TW9kZUFjdGlvbigpIHsKLQkJCXNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShNb2RlbFF1ZXJ5LkVESVRfTU9ERV9DT05TVFJBSU5FRF9TVFJJQ1QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCkgewotCQkJCWludCBuZXdTdGF0ZSA9IGdldE5leHRTdGF0ZShtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkpOwotCQkJCW1vZGVsUXVlcnkuc2V0RWRpdE1vZGUobmV3U3RhdGUpOwotCQkJCXNldEFwcGVhcmFuY2VGb3JFZGl0TW9kZShuZXdTdGF0ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRNb2RlbFF1ZXJ5KE1vZGVsUXVlcnkgbmV3TW9kZWxRdWVyeSkgewotCQkJbW9kZWxRdWVyeSA9IG5ld01vZGVsUXVlcnk7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJc2V0QXBwZWFyYW5jZUZvckVkaXRNb2RlKG1vZGVsUXVlcnkuZ2V0RWRpdE1vZGUoKSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXRBcHBlYXJhbmNlRm9yRWRpdE1vZGUoaW50IGVkaXRNb2RlKSB7Ci0JCQlpZiAoZWRpdE1vZGUgPT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKSB7Ci0JCQkJc2V0VG9vbFRpcFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfMyk7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXRUZXh0KFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZUFjdGlvbkJhckNvbnRyaWJ1dG9yXzQpOyAvLyROT04tTkxTLTEkCi0JCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKG9uSW1hZ2UpOwotCQkJfSBlbHNlIHsKLQkJCQlzZXRUb29sVGlwVGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl81KTsgLy8kTk9OLU5MUy0xJAotCQkJCXNldFRleHQoWE1MRWRpdG9yTWVzc2FnZXMuWE1MVGFibGVUcmVlQWN0aW9uQmFyQ29udHJpYnV0b3JfNik7IC8vJE5PTi1OTFMtMSQKLQkJCQlzZXRJbWFnZURlc2NyaXB0b3Iob2ZmSW1hZ2UpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIGludCBnZXROZXh0U3RhdGUoaW50IGVkaXRNb2RlKSB7Ci0JCQlpbnQgcmVzdWx0ID0gLTE7Ci0JCQlpZiAoZWRpdE1vZGUgPT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKSB7Ci0JCQkJcmVzdWx0ID0gTW9kZWxRdWVyeS5FRElUX01PREVfVU5DT05TVFJBSU5FRDsKLQkJCX0gZWxzZSB7Ci0JCQkJcmVzdWx0ID0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCS8qKgotCSAqICAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgUmVsb2FkR3JhbW1hckFjdGlvbiBleHRlbmRzIEFjdGlvbiB7Ci0JCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsOwotCi0JCXB1YmxpYyBSZWxvYWRHcmFtbWFyQWN0aW9uKCkgewotCQkJc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19EVE9PTF9STERHUk1SKSk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2VEZXNjcmlwdG9yKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19FVE9PTF9STERHUk1SKSk7Ci0JCQlzZXRUb29sVGlwVGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl83KTsgLy8kTk9OLU5MUy0xJAotCQkJc2V0VGV4dChYTUxFZGl0b3JNZXNzYWdlcy5YTUxUYWJsZVRyZWVBY3Rpb25CYXJDb250cmlidXRvcl84KTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBuZXdNb2RlbCkgewotCQkJdGhpcy5tb2RlbCA9IG5ld01vZGVsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG1vZGVsKTsKLQkJCQlEb2N1bWVudCBkb2N1bWVudCA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsICYmIG1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJCW1vZGVsUXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKS5nZXRDTURvY3VtZW50Q2FjaGUoKS5jbGVhcigpOwotCQkJCQkvLyBUT0RPLi4uIG5lZWQgdG8gZmlndXJlIG91dCBob3cgdG8gYWNjZXNzIHRoZQotCQkJCQkvLyBET01PYnNlcnZlciB2aWEgTW9kZWxRdWVyeQotCQkJCQkvLyAgLi4ud2h5PwotCQkJCQlDTURvY3VtZW50TG9hZGVyIGxvYWRlciA9IG5ldyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoZG9jdW1lbnQsIG1vZGVsUXVlcnkpOwotCQkJCQlsb2FkZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9yQWN0aW9uQmFyQ29udHJpYnV0b3IjZGlzcG9zZSgpCi0JICovCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3MmY5OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVHJlZUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01Eb2N1bWVudENhY2hlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElUcmVlQ29udGVudFByb3ZpZGVyLCBJVGFibGVMYWJlbFByb3ZpZGVyLCBJTGFiZWxQcm92aWRlciwgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciB7Ci0KLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudE1hbmFnZXIgZG9jdW1lbnRNYW5hZ2VyOwotCi0JU3RydWN0dXJlZFZpZXdlciBmVmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgVHJlZUNvbnRlbnRIZWxwZXIgdHJlZUNvbnRlbnRIZWxwZXIgPSBuZXcgVHJlZUNvbnRlbnRIZWxwZXIoKTsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLy8KLQkvLyBJTGFiZWxQcm92aWRlciBzdHVmZgotCS8vCi0JcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBzaW5jZSB3ZSBhbHdheXMgcmV0dXJuICdmYWxzZScgZm9yICJpc0xhYmVsUHJvcGVydHkiLAotCQkvLyBub3QgbmVlZCB0byBsaXN0ZW4uIE1heWJlIHRoYXQgc2hvdWxkIGNoYW5nZSBzb21lIGRheT8KLQl9Ci0KLQkvLyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyCi0JLy8KLQlwdWJsaWMgdm9pZCBjYWNoZUNsZWFyZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlKSB7Ci0JCWRvRGVsYXllZFJlZnJlc2hGb3JWaWV3ZXJzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCWlmIChuZXdTdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FERUQgfHwgbmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpIHsKLQkJCWRvRGVsYXllZFJlZnJlc2hGb3JWaWV3ZXJzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCXByaXZhdGUgdm9pZCBkb0RlbGF5ZWRSZWZyZXNoRm9yVmlld2VycygpIHsKLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCAmJiAhZlZpZXdlci5nZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlmVmlld2VyLmdldENvbnRyb2woKS5nZXREaXNwbGF5KCkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQkJCWlmIChmVmlld2VyICE9IG51bGwgJiYgIWZWaWV3ZXIuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJZlZpZXdlci5yZWZyZXNoKHRydWUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0Q2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKQotCQkJKChJTm9kZU5vdGlmaWVyKSBlbGVtZW50KS5nZXRBZGFwdGVyRm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJcmV0dXJuIHRyZWVDb250ZW50SGVscGVyLmdldENoaWxkcmVuKGVsZW1lbnQpOwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJcmV0dXJuIChjb2x1bW5JbmRleCA9PSAwKSA/IGdldEltYWdlKG9iamVjdCkgOiBudWxsOwotCX0KLQotCS8vCi0JLy8gSVRhYmxlTGFiZWxQcm92aWRlciBzdHVmZgotCS8vCi0JcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW4pIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChjb2x1bW4gPT0gMCkgewotCQkJcmVzdWx0ID0gZ2V0VGV4dChvYmplY3QpOwotCQl9Ci0JCWVsc2UgaWYgKGNvbHVtbiA9PSAxICYmIG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCXJlc3VsdCA9IHRyZWVDb250ZW50SGVscGVyLmdldE5vZGVWYWx1ZSgoTm9kZSkgb2JqZWN0KTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0Q2hpbGRyZW4oZWxlbWVudCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpCi0JCQkoKElOb2RlTm90aWZpZXIpIG9iamVjdCkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0KLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfQVRUUklCVVRFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9DREFUQVNFQ1RJT04pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0NPTU1FTlQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0RPQ1RZUEUpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkVMRU1FTlRfTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX0VMRU1FTlQpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJaW1hZ2UgPSBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbWFnZShTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5JTUdfT0JKX1BST0NFU1NJTkdJTlNUUlVDVElPTik7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlpbWFnZSA9IFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEltYWdlKFNoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLklNR19PQkpfVFhURVhUKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUgOiB7Ci0JCQkJCWltYWdlID0gU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW1hZ2UoU2hhcmVkWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBpZiAoaW1hZ2UgIT0gbnVsbCkgewotCQkJLy8gSW1hZ2UgbWFya2VyT3ZlcmxheUltYWdlID0KLQkJCS8vIG92ZXJsYXlJY29uTWFuYWdlci5nZXRPdmVybGF5SW1hZ2VGb3JPYmplY3Qobm9kZSk7Ci0JCQkvLyBpZiAobWFya2VyT3ZlcmxheUltYWdlICE9IG51bGwpIHsKLQkJCS8vIGltYWdlID0gaW1hZ2VGYWN0b3J5LmNyZWF0ZUNvbXBvc2l0ZUltYWdlKGltYWdlLAotCQkJLy8gbWFya2VyT3ZlcmxheUltYWdlLCBJbWFnZUZhY3RvcnkuQk9UVE9NX0xFRlQpOwotCQkJLy8gfQotCQkJLy8gfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0IGdldFBhcmVudChPYmplY3QgbykgewotCQlpZiAobyBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpCi0JCQkoKElOb2RlTm90aWZpZXIpIG8pLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAobyBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvOwotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXJlc3VsdCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0KLQkJZm9yIChOb2RlIGNoaWxkTm9kZSA9IGRvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGROb2RlICE9IG51bGw7IGNoaWxkTm9kZSA9IGNoaWxkTm9kZS5nZXROZXh0U2libGluZygpKSB7Ci0JCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyb290RWxlbWVudCA9IChFbGVtZW50KSBjaGlsZE5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RFbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dChPYmplY3Qgb2JqZWN0KSB7Ci0JCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKQotCQkJKChJTm9kZU5vdGlmaWVyKSBvYmplY3QpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCi0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSBub2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFIDogewotCQkJCQlyZXN1bHQgPSAiRE9DVFlQRSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCXJlc3VsdCA9ICgoUHJvY2Vzc2luZ0luc3RydWN0aW9uKSBub2RlKS5nZXRUYXJnZXQoKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKGVsZW1lbnQpLmxlbmd0aCA+IDA7Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCS8vIHJlbW92ZSBvdXIgbGlzdGVuZXJzIHRvIHRoZSBvbGQgc3RhdGUKLQkJaWYgKG9sZElucHV0ICE9IG51bGwpIHsKLQkJCURvY3VtZW50IGRvbURvYyA9IChEb2N1bWVudCkgb2xkSW5wdXQ7Ci0JCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb21Eb2MpOwotCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQlkb2N1bWVudE1hbmFnZXIgPSBtcS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWlmIChkb2N1bWVudE1hbmFnZXIgIT0gbnVsbCkgewotCQkJCQlkb2N1bWVudE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIodGhpcyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKG9sZElucHV0ICE9IG51bGwgJiYgb2xkSW5wdXQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSAoSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5KSAoKElET01Ob2RlKSBvbGRJbnB1dCkuZ2V0TW9kZWwoKS5nZXRGYWN0b3J5UmVnaXN0cnkoKS5nZXRGYWN0b3J5Rm9yKElKRmFjZU5vZGVBZGFwdGVyLmNsYXNzKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LnJlbW92ZUxpc3RlbmVyKHZpZXdlcik7Ci0JCQl9Ci0JCX0KLQotCQlpZiAodmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJZlZpZXdlciA9IG51bGw7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmVmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIHZpZXdlcjsKLQkJfQotCi0JCWlmIChuZXdJbnB1dCAhPSBudWxsICYmIG5ld0lucHV0IGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJRE9NTm9kZSkgbmV3SW5wdXQpLmdldE1vZGVsKCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0KLQkJaWYgKG5ld0lucHV0ICE9IG51bGwpIHsKLQkJCURvY3VtZW50IGRvbURvYyA9IChEb2N1bWVudCkgbmV3SW5wdXQ7Ci0JCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShkb21Eb2MpOwotCi0JCQlpZiAobXEgIT0gbnVsbCkgewotCQkJCWRvY3VtZW50TWFuYWdlciA9IG1xLmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVNZTkNfTE9BRCwgdHJ1ZSk7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5hZGRMaXN0ZW5lcih0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0RlbGV0ZWQoT2JqZWN0IGVsZW1lbnQpIHsKLQkJcmV0dXJuIGVsZW1lbnQgIT0gbnVsbDsKLQl9Ci0KLQkvLyB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaGFuZGxlIGZpbHRlcmluZyBhc3BlY3RzIG9mIHRoZSB2aWV3ZXIKLQkvLwotCS8vCi0JcHVibGljIGJvb2xlYW4gaXNJZ25vcmFibGVUZXh0KE5vZGUgbm9kZSkgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQl0cnkgewotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJCVN0cmluZyBkYXRhID0gKChUZXh0KSBub2RlKS5nZXREYXRhKCk7Ci0JCQkJcmVzdWx0ID0gKGRhdGEgPT0gbnVsbCB8fCBkYXRhLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJaWYgKGNtRG9jdW1lbnRNYW5hZ2VyLmdldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQpKSB7Ci0JCQlkb0RlbGF5ZWRSZWZyZXNoRm9yVmlld2VycygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVtb3ZlTGlzdGVuZXIoSUxhYmVsUHJvdmlkZXJMaXN0ZW5lciBsaXN0ZW5lcikgewotCQkvLyBzaW5jZSB3ZSBhbHdheXMgcmV0dXJuICdmYWxzZScgZm9yICJpc0xhYmVsUHJvcGVydHkiLAotCQkvLyBub3QgbmVlZCB0byBsaXN0ZW4uIE1heWJlIHRoYXQgc2hvdWxkIGNoYW5nZSBzb21lIGRheT8KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOWEzODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVGFibGVUcmVlSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWJsZXRyZWU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0KLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgVGFibGVUcmVlIHZpZXcuCi0gKiA8cD4KLSAqIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIGNvbnN0YW50cyBvbmx5OyBpdCBpcyBub3QgaW50ZW5kZWQgdG8gYmUKLSAqIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkLgotICogPC9wPgotICogIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFRhYmxlVHJlZUhlbHBDb250ZXh0SWRzIHsKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUZJWCA9IFhNTFVJUGx1Z2luLklEICsgIi4iOyAvLyROT04tTkxTLTEkCi0KLQkvLyBYTUwgRGVzaWduIFZpZXcKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfREVTSUdOX1ZJRVdfSEVMUElEID0gUFJFRklYICsgInhtbG0zMDAwIjsgLy8kTk9OLU5MUy0xJAotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZmYzJiZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMKLSAqIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZAotICogaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5UZXh0UHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllcy5FbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlRleHQ7Ci0KLQotcHVibGljIGNsYXNzIFhNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkgZXh0ZW5kcyBET01Qcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5IHsKLQotCXByb3RlY3RlZCBUcmVlQ29udGVudEhlbHBlciB0cmVlQ29udGVudEhlbHBlciA9IG5ldyBUcmVlQ29udGVudEhlbHBlcigpOwotCi0JcHVibGljIFhNTFRhYmxlVHJlZVByb3BlcnR5RGVzY3JpcHRvckZhY3RvcnkoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9ySGVscGVyKFN0cmluZyBuYW1lLCBFbGVtZW50IGVsZW1lbnQsIENNTm9kZSBjbU5vZGUpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJU3RyaW5nW10gdmFsdWVzQXJyYXkgPSBudWxsOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJdmFsdWVzQXJyYXkgPSBtcS5nZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKGVsZW1lbnQsIGNtTm9kZSk7Ci0JCX0KLQkJaWYgKHZhbHVlc0FycmF5ICE9IG51bGwgJiYgdmFsdWVzQXJyYXkubGVuZ3RoID4gMCkgewotCQkJcmVzdWx0ID0gbmV3IEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IobmFtZSwgbmFtZSwgdmFsdWVzQXJyYXkpOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihuYW1lKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihUZXh0IHRleHQpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCQlOb2RlIHBhcmVudE5vZGUgPSB0ZXh0LmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnROb2RlOwotCQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkodGV4dC5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQllZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotCQkJfQotCQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JIZWxwZXIoSEFDSywgcGFyZW50RWxlbWVudCwgZWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJcmVzdWx0ID0gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihwYXJlbnRFbGVtZW50LmdldE5vZGVOYW1lKCkpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihIQUNLLCBIQUNLKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlQXR0cmlidXRlUHJvcGVydHlEZXNjcmlwdG9yKEF0dHIgYXR0cikgewotCQlJUHJvcGVydHlEZXNjcmlwdG9yIHJlc3VsdCA9IG51bGw7Ci0KLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJTW9kZWxRdWVyeSBtcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoYXR0ci5nZXRPd25lckRvY3VtZW50KCkpOwotCi0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQgPSBudWxsOwotCQlpZiAobXEgIT0gbnVsbCkgewotCQkJYWQgPSBtcS5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotCQl9Ci0JCWlmIChhZCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3JIZWxwZXIoYXR0cmlidXRlTmFtZSwgYXR0ci5nZXRPd25lckVsZW1lbnQoKSwgYWQpOwotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBhdHRyaWJ1dGVOYW1lKTsKLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRWxlbWVudFByb3BlcnR5RGVzY3JpcHRvcihFbGVtZW50IGVsZW1lbnQpIHsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCQlMaXN0IGxpc3QgPSB0cmVlQ29udGVudEhlbHBlci5nZXRFbGVtZW50VGV4dENvbnRlbnQoZWxlbWVudCk7Ci0JCWlmIChsaXN0ICE9IG51bGwpIHsKLQkJCVRleHQgdGV4dCA9IHRyZWVDb250ZW50SGVscGVyLmdldEVmZmVjdGl2ZVRleHROb2RlRm9yQ29tYmluZWROb2RlTGlzdChsaXN0KTsKLQkJCWlmICh0ZXh0ICE9IG51bGwpIHsKLQkJCQlyZXN1bHQgPSBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKHRleHQpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0JCQlyZXN1bHQgPSBuZXcgVGV4dFByb3BlcnR5RGVzY3JpcHRvcihIQUNLLCBIQUNLKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLW11bHRpcGFnZS9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhYmxldHJlZS9YTUxUYWJsZVRyZWVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTJhOGRmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRhYmxlVHJlZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFibGV0cmVlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLlNlcGFyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5EaXNwb3NlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLk1lbnU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5Ob2RlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kbmQuWE1MRHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1wdWJsaWMgY2xhc3MgWE1MVGFibGVUcmVlVmlld2VyIGV4dGVuZHMgVHJlZVZpZXdlciBpbXBsZW1lbnRzIElEZXNpZ25WaWV3ZXIgewotCi0JY2xhc3MgTm9kZUFjdGlvbk1lbnVMaXN0ZW5lciBpbXBsZW1lbnRzIElNZW51TGlzdGVuZXIgewotCQlwdWJsaWMgdm9pZCBtZW51QWJvdXRUb1Nob3coSU1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyKSB7Ci0JCQkvLyB1c2VkIHRvIGRpc2FibGUgTm9kZVNlbGVjdGlvbiBsaXN0ZW5pbmcgd2hpbGUgcnVubmluZwotCQkJLy8gTm9kZUFjdGlvbgotCQkJWE1MTm9kZUFjdGlvbk1hbmFnZXIgbm9kZUFjdGlvbk1hbmFnZXIgPSBuZXcgWE1MTm9kZUFjdGlvbk1hbmFnZXIoKChJRE9NRG9jdW1lbnQpIGdldElucHV0KCkpLmdldE1vZGVsKCksIFhNTFRhYmxlVHJlZVZpZXdlci50aGlzKSB7Ci0JCQkJcHVibGljIHZvaWQgYmVnaW5Ob2RlQWN0aW9uKE5vZGVBY3Rpb24gYWN0aW9uKSB7Ci0JCQkJCXN1cGVyLmJlZ2luTm9kZUFjdGlvbihhY3Rpb24pOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGVuZE5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJCQkJc3VwZXIuZW5kTm9kZUFjdGlvbihhY3Rpb24pOwotCQkJCX0KLQkJCX07Ci0JCQlub2RlQWN0aW9uTWFuYWdlci5maWxsQ29udGV4dE1lbnUobWVudU1hbmFnZXIsIGdldFNlbGVjdGlvbigpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDZWxsRWRpdG9yIGNlbGxFZGl0b3I7Ci0KLQlpbnQgY291bnQgPSAwOwotCi0JcHJvdGVjdGVkIFhNTFRyZWVFeHRlbnNpb24gdHJlZUV4dGVuc2lvbjsKLQotCXB1YmxpYyBYTUxUYWJsZVRyZWVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTCk7Ci0KLQkJLy8gc2V0IHVwIHByb3ZpZGVycwotCQl0aGlzLnRyZWVFeHRlbnNpb24gPSBuZXcgWE1MVHJlZUV4dGVuc2lvbihnZXRUcmVlKCkpOwotCi0JCVhNTFRhYmxlVHJlZUNvbnRlbnRQcm92aWRlciBwcm92aWRlciA9IG5ldyBYTUxUYWJsZVRyZWVDb250ZW50UHJvdmlkZXIoKTsKLQkJc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0KLQkJY3JlYXRlQ29udGV4dE1lbnUoKTsKLQotCQlYTUxEcmFnQW5kRHJvcE1hbmFnZXIuYWRkRHJhZ0FuZERyb3BTdXBwb3J0KHRoaXMpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY3JlYXRlcyBhIGNvbnRleHQgbWVudSBmb3IgdGhlIHZpZXdlciBhbmQgYWRkcyBhIGxpc3RlbmVyIGFzIHdlbGwKLQkgKiByZWdpc3RlcmluZyB0aGUgbWVudSBmb3IgZXh0ZW5zaW9uLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRleHRNZW51KCkgewotCQlNZW51TWFuYWdlciBjb250ZXh0TWVudSA9IG5ldyBNZW51TWFuYWdlcigiI1BvcFVwIik7IC8vJE5PTi1OTFMtMSQKLQkJY29udGV4dE1lbnUuYWRkKG5ldyBTZXBhcmF0b3IoImFkZGl0aW9ucyIpKTsgLy8kTk9OLU5MUy0xJAotCQljb250ZXh0TWVudS5zZXRSZW1vdmVBbGxXaGVuU2hvd24odHJ1ZSk7Ci0JCWNvbnRleHRNZW51LmFkZE1lbnVMaXN0ZW5lcihuZXcgTm9kZUFjdGlvbk1lbnVMaXN0ZW5lcigpKTsKLQkJTWVudSBtZW51ID0gY29udGV4dE1lbnUuY3JlYXRlQ29udGV4dE1lbnUoZ2V0Q29udHJvbCgpKTsKLQkJZ2V0Q29udHJvbCgpLnNldE1lbnUobWVudSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZG9SZWZyZXNoKE9iamVjdCBvLCBib29sZWFuIGZyb21EZWxheWVkKSB7Ci0JCXRyZWVFeHRlbnNpb24ucmVzZXRDYWNoZWREYXRhKCk7Ci0JCXN1cGVyLnJlZnJlc2gobyk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb25Qcm92aWRlciBnZXRTZWxlY3Rpb25Qcm92aWRlcigpIHsKLQkJcmV0dXJuIHRoaXM7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKLQkJcmV0dXJuIFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRhYmxlVHJlZVZpZXdlcl8wOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGhhbmRsZURpc3Bvc2UoRGlzcG9zZUV2ZW50IGV2ZW50KSB7Ci0JCXN1cGVyLmhhbmRsZURpc3Bvc2UoZXZlbnQpOwotCQl0cmVlRXh0ZW5zaW9uLmRpc3Bvc2UoKTsKLQkJc2V0RG9jdW1lbnQobnVsbCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVmcmVzaCgpIHsKLQkJdHJlZUV4dGVuc2lvbi5yZXNldENhY2hlZERhdGEoKTsKLQkJc3VwZXIucmVmcmVzaCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZnJlc2goT2JqZWN0IG8pIHsKLQkJdHJlZUV4dGVuc2lvbi5yZXNldENhY2hlZERhdGEoKTsKLQkJc3VwZXIucmVmcmVzaChvKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaChib29sZWFuIHVwZGF0ZUxhYmVscykgewotCQl0cmVlRXh0ZW5zaW9uLnJlc2V0Q2FjaGVkRGF0YSgpOwotCQlzdXBlci5yZWZyZXNoKHVwZGF0ZUxhYmVscyk7Ci0JCWdldENvbnRyb2woKS5yZWRyYXcoKTsKLQl9Ci0JCi0JcHVibGljIHZvaWQgcmVmcmVzaChPYmplY3QgZWxlbWVudCwgYm9vbGVhbiB1cGRhdGVMYWJlbHMpIHsKLQkJdHJlZUV4dGVuc2lvbi5yZXNldENhY2hlZERhdGEoKTsKLQkJc3VwZXIucmVmcmVzaChlbGVtZW50LCB1cGRhdGVMYWJlbHMpOwotCQlnZXRDb250cm9sKCkucmVkcmF3KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RG9jdW1lbnQoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8qCi0JCSAqIGxldCB0aGUgdGV4dCBlZGl0b3IgdG8gYmUgdGhlIG9uZSB0aGF0IG1hbmFnZXMgdGhlIG1vZGVsJ3MgbGlmZXRpbWUKLQkJICovCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQotCQkJaWYgKG1vZGVsICE9IG51bGwgJiYgbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwpIHsKLQkJCQlEb2N1bWVudCBkb21Eb2MgPSBudWxsOwotCQkJCWRvbURvYyA9ICgoSURPTU1vZGVsKSBtb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCQlzZXRJbnB1dChkb21Eb2MpOwotCQkJCXRyZWVFeHRlbnNpb24uc2V0SXNVbnN1cHBvcnRlZElucHV0KGZhbHNlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXRyZWVFeHRlbnNpb24uc2V0SXNVbnN1cHBvcnRlZElucHV0KHRydWUpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKG1vZGVsICE9IG51bGwpIHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCi0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVHJlZUV4dGVuc2lvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy1tdWx0aXBhZ2Uvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWJsZXRyZWUvWE1MVHJlZUV4dGVuc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzc1ZmFlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtbXVsdGlwYWdlL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFibGV0cmVlL1hNTFRyZWVFeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcwotICogcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcwotICogb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kCi0gKiBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhYmxldHJlZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklDZWxsTW9kaWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVHJlZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UcmVlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ01EZXNjcmlwdGlvbkJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1wdWJsaWMgY2xhc3MgWE1MVHJlZUV4dGVuc2lvbiBleHRlbmRzIFRyZWVFeHRlbnNpb24gewotCi0JcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1RSVUNUVVJFX1BST1BFUlRZID0gWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl8wOwotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTFVFX1BST1BFUlRZID0gWE1MRWRpdG9yTWVzc2FnZXMuWE1MVHJlZUV4dGVuc2lvbl8xOwotCi0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb250cm9sOwotCXByb3RlY3RlZCBNeUNlbGxNb2RpZmllciBtb2RpZmllcjsKLQlwcm90ZWN0ZWQgWE1MVGFibGVUcmVlUHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSBwcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5OwotCXByb3RlY3RlZCBDTURlc2NyaXB0aW9uQnVpbGRlciBkZWNyaXB0aW9uQnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotCXByb3RlY3RlZCBUcmVlQ29udGVudEhlbHBlciB0cmVlQ29udGVudEhlbHBlciA9IG5ldyBUcmVlQ29udGVudEhlbHBlcigpOwotCi0JcHJvdGVjdGVkIENvbG9yIGYxLCBmMiwgYjEsIGIyOwotCXByb3RlY3RlZCBib29sZWFuIGNhY2hlZERhdGFJc1ZhbGlkID0gdHJ1ZTsKLQotCXB1YmxpYyBYTUxUcmVlRXh0ZW5zaW9uKFRyZWUgdHJlZSkgewotCQlzdXBlcih0cmVlKTsKLQkJY29udHJvbCA9IHRyZWU7Ci0JCW1vZGlmaWVyID0gbmV3IE15Q2VsbE1vZGlmaWVyKCk7Ci0JCXNldENlbGxNb2RpZmllcihtb2RpZmllcik7Ci0JCVN0cmluZ1tdIHByb3BlcnRpZXMgPSB7U1RSVUNUVVJFX1BST1BFUlRZLCBWQUxVRV9QUk9QRVJUWX07Ci0JCXNldENvbHVtblByb3BlcnRpZXMocHJvcGVydGllcyk7Ci0KLQkJZjEgPSB0cmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spOwotCQlDb2xvciBiYWNrZ3JvdW5kID0gdHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCk7Ci0KLQkJaW50IHIgPSBNYXRoLmFicyhiYWNrZ3JvdW5kLmdldFJlZCgpIC0gMTI1KTsKLQkJaW50IGcgPSBNYXRoLmFicyhiYWNrZ3JvdW5kLmdldEdyZWVuKCkgLSA4NSk7Ci0JCWludCBiID0gTWF0aC5hYnMoYmFja2dyb3VuZC5nZXRCbHVlKCkgLSAxMDUpOwotCi0JCWYyID0gbmV3IENvbG9yKHRyZWUuZ2V0RGlzcGxheSgpLCByLCBnLCBiKTsKLQkJYjEgPSB0cmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfTElTVF9TRUxFQ1RJT04pOwotCQliMiA9IGJhY2tncm91bmQ7Ci0KLQkJcHJvcGVydHlEZXNjcmlwdG9yRmFjdG9yeSA9IG5ldyBYTUxUYWJsZVRyZWVQcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCQlmMi5kaXNwb3NlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcmVzZXRDYWNoZWREYXRhKCkgewotCQljYWNoZWREYXRhSXNWYWxpZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHBhaW50SXRlbXMoR0MgZ2MsIFRyZWVJdGVtW10gaXRlbXMsIFJlY3RhbmdsZSB0cmVlQm91bmRzKSB7Ci0JCXN1cGVyLnBhaW50SXRlbXMoZ2MsIGl0ZW1zLCB0cmVlQm91bmRzKTsKLQkJY2FjaGVkRGF0YUlzVmFsaWQgPSB0cnVlOwotCX0KLQotCXByb3RlY3RlZCBPYmplY3RbXSBjb21wdXRlVHJlZUV4dGVuc2lvbkRhdGEoT2JqZWN0IG9iamVjdCkgewotCQlDb2xvciBjb2xvciA9IGYxOwotCQlTdHJpbmcgc3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlzdHJpbmcgPSAoU3RyaW5nKSBtb2RpZmllci5nZXRWYWx1ZShvYmplY3QsIFZBTFVFX1BST1BFUlRZKTsKLQkJCWNvbG9yID0gZjE7Ci0JCX0KLQkJaWYgKHN0cmluZy5sZW5ndGgoKSA9PSAwICYmIG9iamVjdCBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXN0cmluZyA9IGdldEVsZW1lbnRWYWx1ZUhlbHBlcigoRWxlbWVudCkgb2JqZWN0KTsKLQkJCWNvbG9yID0gZjI7Ci0JCX0KLQkJT2JqZWN0W10gZGF0YSA9IG5ldyBPYmplY3RbMl07Ci0JCWRhdGFbMF0gPSBzdHJpbmc7Ci0JCWRhdGFbMV0gPSBjb2xvcjsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGFpbnRJdGVtKEdDIGdjLCBUcmVlSXRlbSBpdGVtLCBSZWN0YW5nbGUgYm91bmRzKSB7Ci0JCXN1cGVyLnBhaW50SXRlbShnYywgaXRlbSwgYm91bmRzKTsKLQkJT2JqZWN0W10gZGF0YSA9IGNvbXB1dGVUcmVlRXh0ZW5zaW9uRGF0YShpdGVtLmdldERhdGEoKSk7Ci0JCWlmIChkYXRhICE9IG51bGwgJiYgZGF0YS5sZW5ndGggPT0gMikgewotCQkJZ2Muc2V0Q2xpcHBpbmcoY29sdW1uUG9zaXRpb24sIGJvdW5kcy55ICsgMSwgY29udHJvbFdpZHRoLCBib3VuZHMuaGVpZ2h0KTsKLQkJCWdjLnNldEZvcmVncm91bmQoKENvbG9yKSBkYXRhWzFdKTsKLQkJCWdjLmRyYXdTdHJpbmcoKFN0cmluZykgZGF0YVswXSwgY29sdW1uUG9zaXRpb24gKyA1LCBib3VuZHMueSArIDEpOwotCQkJZ2Muc2V0Q2xpcHBpbmcoKFJlY3RhbmdsZSkgbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eVRyZWVNZXNzYWdlKEdDIGdjKSB7Ci0JCS8vIGhlcmUgd2UgcHJpbnQgYSBtZXNzYWdlIHdoZW4gdGhlIGRvY3VtZW50IGlzIGVtcHR5IGp1c3QgdG8gZ2l2ZSB0aGUKLQkJLy8gdXNlciBhIHZpc3VhbCBjdWUKLQkJLy8gc28gdGhhdCB0aGV5IGtub3cgaG93IHRvIHByb2NlZWQgdG8gZWRpdCB0aGUgYmxhbmsgdmlldwotCQlnYy5zZXRGb3JlZ3JvdW5kKGZUcmVlLmdldERpc3BsYXkoKS5nZXRTeXN0ZW1Db2xvcihTV1QuQ09MT1JfQkxBQ0spKTsKLQkJZ2Muc2V0QmFja2dyb3VuZChmVHJlZS5nZXREaXNwbGF5KCkuZ2V0U3lzdGVtQ29sb3IoU1dULkNPTE9SX0xJU1RfQkFDS0dST1VORCkpOwotCQlnYy5kcmF3U3RyaW5nKFhNTEVkaXRvck1lc3NhZ2VzLlhNTFRyZWVFeHRlbnNpb25fMywgMTAsIDEwKTsKLQkJZ2MuZHJhd1N0cmluZyhYTUxFZGl0b3JNZXNzYWdlcy5YTUxUcmVlRXh0ZW5zaW9uXzQsIDEwLCAxMCArIGdjLmdldEZvbnRNZXRyaWNzKCkuZ2V0SGVpZ2h0KCkpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudFZhbHVlSGVscGVyKEVsZW1lbnQgZWxlbWVudCkgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQotCQlNb2RlbFF1ZXJ5IG1xID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiBtcSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1xLmdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkJaWYgKGVkICE9IG51bGwgJiYgIUJvb2xlYW4uVFJVRS5lcXVhbHMoZWQuZ2V0UHJvcGVydHkoImlzSW5mZXJyZWQiKSkpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJlc3VsdCA9IGRlY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24oZWQpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHVibGljIGNsYXNzIE15Q2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciwgVHJlZUV4dGVuc2lvbi5JQ2VsbEVkaXRvclByb3ZpZGVyIHsKLQkJcHVibGljIGJvb2xlYW4gY2FuTW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgZWxlbWVudDsKLQkJCQlyZXN1bHQgPSBwcm9wZXJ0eSA9PSBWQUxVRV9QUk9QRVJUWSAmJiB0cmVlQ29udGVudEhlbHBlci5pc0VkaXRhYmxlKG5vZGUpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoT2JqZWN0IG9iamVjdCwgU3RyaW5nIHByb3BlcnR5KSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJcmVzdWx0ID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0Tm9kZVZhbHVlKChOb2RlKSBvYmplY3QpOwotCQkJfQotCQkJcmV0dXJuIChyZXN1bHQgIT0gbnVsbCkgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgewotCQkJLy8gZW5hYmxlTm9kZVNlbGVjdGlvbkxpc3RlbmVyKGZhbHNlKTsKLQkJCUl0ZW0gaXRlbSA9IChJdGVtKSBlbGVtZW50OwotCQkJU3RyaW5nIG9sZFZhbHVlID0gdHJlZUNvbnRlbnRIZWxwZXIuZ2V0Tm9kZVZhbHVlKChOb2RlKSBpdGVtLmdldERhdGEoKSk7Ci0JCQlTdHJpbmcgbmV3VmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOwotCQkJaWYgKG5ld1ZhbHVlICE9IG51bGwgJiYgIW5ld1ZhbHVlLmVxdWFscyhvbGRWYWx1ZSkpIHsKLQkJCQl0cmVlQ29udGVudEhlbHBlci5zZXROb2RlVmFsdWUoKE5vZGUpIGl0ZW0uZ2V0RGF0YSgpLCB2YWx1ZS50b1N0cmluZygpKTsKLQkJCX0KLQkJCS8vIGVuYWJsZU5vZGVTZWxlY3Rpb25MaXN0ZW5lcih0cnVlKTsKLQkJfQotCi0JCXB1YmxpYyBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoT2JqZWN0IG8sIGludCBjb2wpIHsKLQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgcGQgPSBwcm9wZXJ0eURlc2NyaXB0b3JGYWN0b3J5LmNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihvKTsKLQkJCXJldHVybiBwZCAhPSBudWxsID8gcGQuY3JlYXRlUHJvcGVydHlFZGl0b3IoY29udHJvbCkgOiBudWxsOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMwMmNkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL1hNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLm9zZ2kudXRpbC5OTFM7Ci0KLS8qKgotICogU3RyaW5ncyB1c2VkIGJ5IFhNTCBWYWxpZGF0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi54bWx2YWxpZGF0aW9uIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci0KLQlzdGF0aWMgewotCQkvLyBpbml0aWFsaXplIHJlc291cmNlIGJ1bmRsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5jbGFzcyk7Ci0JfQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SRUZfRklMRV9FUlJPUl9ERVNDUklQVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfTUVTU0FHRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkVGX0ZJTEVfRVJST1JfREVUQUlMUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVUQUlMU19JTkZPUk1BVElPTl9VTkFWQUlMQUJMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfREVUQUlMU19JTkZPX1JFVkFMSURBVEVfVE9fUkVHRU5FUkFURTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0FWRV9ESVJUWV9GSUxFX01FU1NBR0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NBVkVfRElSVFlfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdFRhYmxlVmlld2VyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFza0xpc3RUYWJsZVZpZXdlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhc2tMaXN0VGFibGVWaWV3ZXJfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUYXNrTGlzdFRhYmxlVmlld2VyXzM7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9SZWZlcmVuY2VkRmlsZUVycm9yQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY0NTdjZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JTWFya2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5hY3Rpb25zLkFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZEZpbGVFcnJvckFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgQWN0aW9uRGVsZWdhdGUgaW1wbGVtZW50cyBJT2JqZWN0QWN0aW9uRGVsZWdhdGUKLXsKLSAgcHJvdGVjdGVkIElNYXJrZXIgc2VsZWN0ZWRNYXJrZXI7Ci0KLSAgLyoqCi0gICAqIAotICAgKi8KLSAgcHVibGljIFJlZmVyZW5jZWRGaWxlRXJyb3JBY3Rpb25EZWxlZ2F0ZSgpCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKElBY3Rpb24gYWN0aW9uKQotICB7Ci0gICAgaWYgKHNlbGVjdGVkTWFya2VyICE9IG51bGwpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAJCi0gICAgICAgIE1hcCBtYXAgPSAoTWFwKSBzZWxlY3RlZE1hcmtlci5nZXRSZXNvdXJjZSgpLmdldFNlc3Npb25Qcm9wZXJ0eShWYWxpZGF0aW9uTWVzc2FnZS5FUlJPUl9NRVNTQUdFX01BUF9RVUFMSUZJRURfTkFNRSk7Ci0gICAgICAgIGlmIChtYXAgPT0gbnVsbCkKLSAgICAgICAgewotCQkJU3RyaW5nIGluZm9VbmF2YWlsYWJsZSA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLl9VSV9ERVRBSUxTX0lORk9STUFUSU9OX1VOQVZBSUxBQkxFOwotCQkJU3RyaW5nIHJldmFsaWRhdGVUb1JlZ2VuZXJhdGVFcnJvcnMgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfREVUQUlMU19JTkZPX1JFVkFMSURBVEVfVE9fUkVHRU5FUkFURTsKLSAgICAgICAgCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKERpc3BsYXkuZ2V0Q3VycmVudCgpLmdldEFjdGl2ZVNoZWxsKCksIGluZm9VbmF2YWlsYWJsZSwgcmV2YWxpZGF0ZVRvUmVnZW5lcmF0ZUVycm9ycyk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHVyaSA9IG51bGw7Ci0KLSAgICAgICAgICBTdHJpbmcgZ3JvdXBOYW1lID0gKFN0cmluZykgc2VsZWN0ZWRNYXJrZXIuZ2V0QXR0cmlidXRlKCJncm91cE5hbWUiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIGlmIChncm91cE5hbWUuc3RhcnRzV2l0aCgicmVmZXJlbmNlZEZpbGVFcnJvciIpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IGluZGV4MSA9IGdyb3VwTmFtZS5pbmRleE9mKCIoIik7IC8vJE5PTi1OTFMtMSQKLSAgICAgICAgICAgIGludCBpbmRleDIgPSBncm91cE5hbWUubGFzdEluZGV4T2YoIikiKTsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgaWYgKGluZGV4MSAhPSAtMSAmJiBpbmRleDIgPiBpbmRleDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHVyaSA9IGdyb3VwTmFtZS5zdWJzdHJpbmcoaW5kZXgxICsgMSwgaW5kZXgyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAodXJpICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgTGlzdCBsaXN0ID0gQ29sbGVjdGlvbnMuRU1QVFlfTElTVDsKLQotICAgICAgICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSkgbWFwLmdldCh1cmkpOwotICAgICAgICAgICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbGlzdCA9IG1lc3NhZ2UuZ2V0TmVzdGVkTWVzc2FnZXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIHZhbGlkYXRlZEZpbGVVUkkgPSBzZWxlY3RlZE1hcmtlci5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOy8vVVJJSGVscGVyLm5vcm1hbGl6ZShzZWxlY3RlZE1hcmtlci5nZXRSZXNvdXJjZSgpLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpKTsKLSAgICAgICAgICAgIHZhbGlkYXRlZEZpbGVVUkkgPSAiZmlsZTovIiArIHZhbGlkYXRlZEZpbGVVUkk7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgICAgICAgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZyBkaWFsb2cgPSBuZXcgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZyhEaXNwbGF5LmdldEN1cnJlbnQoKS5nZXRBY3RpdmVTaGVsbCgpLCBsaXN0LCB2YWxpZGF0ZWRGaWxlVVJJLCB1cmkpOwotICAgICAgICAgICAgZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChDb3JlRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgCS8vIERvIG5vdGhpbmcuCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICBzdXBlci5zZWxlY3Rpb25DaGFuZ2VkKGFjdGlvbiwgc2VsZWN0aW9uKTsKLSAgICBzZWxlY3RlZE1hcmtlciA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBPYmplY3QgZmlyc3QgPSAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpOwotICAgICAgICAKLSAgICAgICAgSU1hcmtlciBtYXJrZXIgPSAoSU1hcmtlcilmaXJzdDsKLSAgICAgICAgc2VsZWN0ZWRNYXJrZXIgPSBtYXJrZXI7Ci0vLyAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IChTdHJpbmcpIG1hcmtlci5nZXRBdHRyaWJ1dGUoImdyb3VwTmFtZSIpOwotLy8gICAgICAgIGlmIChncm91cE5hbWUuc3RhcnRzV2l0aCgicmVmZXJlbmNlZEZpbGVFcnJvciIpKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgIHNlbGVjdGVkTWFya2VyID0gbWFya2VyOwotLy8gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAJLy8gRG8gbm90aGluZy4KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklPYmplY3RBY3Rpb25EZWxlZ2F0ZSNzZXRBY3RpdmVQYXJ0KG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uLCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFydCkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEFjdGl2ZVBhcnQoSUFjdGlvbiBhY3Rpb24sIElXb3JrYmVuY2hQYXJ0IHRhcmdldFBhcnQpCi0gIHsKLSAgIC8vZHcgaW50IGkgPSAwOwotICB9Ci19Ci0KLS8qCi0JcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludE1hcChNYXAgbWFwKQotCXsKLQkJZm9yIChJdGVyYXRvciBpID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLQkJewotCQkJU3RyaW5nIGtleSA9IChTdHJpbmcpIGkubmV4dCgpOwotCQkJU3lzdGVtLm91dC5wcmludGxuKCJlbnRyeSA6ICIgKyBrZXkgKyAiID0gIiArIG1hcC5nZXQoa2V5KSk7Ci0JCX0KLQl9Ci0gIAotCXByaXZhdGUgdm9pZCBwcmludEVycm9yTWFwKE1hcCBtYXApCi0JewotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtYXAua2V5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlTdHJpbmcga2V5ID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlFcnJvck1lc3NhZ2UgbWVzc2FnZSA9IChFcnJvck1lc3NhZ2UpIG1hcC5nZXQoa2V5KTsKLQkJCWlmIChtZXNzYWdlICE9IG51bGwpCi0JCQl7Ci0JCQkJcHJpbnRFcnJvck1lc3NhZ2UobWVzc2FnZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0gIAotCXByaXZhdGUgdm9pZCBwcmludEVycm9yTWVzc2FnZShFcnJvck1lc3NhZ2UgZXJyb3JNZXNzYWdlKQotCXsKLQkJU3lzdGVtLm91dC5wcmludGxuKGVycm9yTWVzc2FnZS5nZXRUZXh0KCkpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBlcnJvck1lc3NhZ2UuZ2V0TmVzdGVkRXJyb3JzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotCQl7Ci0JCQlwcmludEVycm9yTWVzc2FnZSgoRXJyb3JNZXNzYWdlKSBpLm5leHQoKSk7Ci0JCX0KLQl9Ci0gKi8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JEaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzQ2NWM2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuZXJyb3JpbmZvOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5kaWFsb2dzLkRpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5TdHlsZVJhbmdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5jdXN0b20uU3R5bGVkVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb3VzZU1vdmVMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudmFsaWRhdGlvbi5YTUxWYWxpZGF0aW9uVUlNZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgUmVmZXJlbmNlZEZpbGVFcnJvckRpYWxvZyBleHRlbmRzIERpYWxvZwotewotICBwcm90ZWN0ZWQgVGFza0xpc3RUYWJsZVZpZXdlciB0YWJsZVZpZXdlcjsKLSAgcHJvdGVjdGVkIExpc3QgZXJyb3JMaXN0OwotICBwcm90ZWN0ZWQgU3RyaW5nIG1hcmtlZFVwRGV0YWlsc01lc3NhZ2U7Ci0gIHByb3RlY3RlZCBTdHJpbmcgY29udGV4dEZpbGU7Ci0gIHByb3RlY3RlZCBTdHJpbmcgcmVmZXJlbmNlZEZpbGU7Ci0gIHByb3RlY3RlZCBTdHlsZWRUZXh0IHN0eWxlZFRleHQ7Ci0gIHByb3RlY3RlZCBUZXh0IGZ1bGxGaWxlTmFtZUZpZWxkOwotCi0gIHB1YmxpYyBSZWZlcmVuY2VkRmlsZUVycm9yRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBMaXN0IGVycm9yTGlzdCwgU3RyaW5nIGNvbnRleHRGaWxlLCBTdHJpbmcgcmVmZXJlbmNlZEZpbGUpCi0gIHsKLSAgICBzdXBlcihwYXJlbnRTaGVsbCk7Ci0KLSAgICBpbnQgc3R5bGVCaXRzID0gZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRTsKLSAgICBzdHlsZUJpdHMgJj0gflNXVC5BUFBMSUNBVElPTl9NT0RBTDsKLQotICAgIHNldFNoZWxsU3R5bGUoc3R5bGVCaXRzKTsKLSAgICB0aGlzLmVycm9yTGlzdCA9IGVycm9yTGlzdDsKLQotICAgIHRoaXMucmVmZXJlbmNlZEZpbGUgPSByZWZlcmVuY2VkRmlsZTsKLSAgICB0aGlzLmNvbnRleHRGaWxlID0gY29udGV4dEZpbGU7Ci0gICAgdGhpcy5tYXJrZWRVcERldGFpbHNNZXNzYWdlID0gZ2V0TWFya2VkVXBEZXRhaWxzTWVzc2FnZSgpOwotICB9Ci0KLSAgcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkKLSAgewotICAgIGNyZWF0ZSgpOwotICAgIGdldFNoZWxsKCkuc2V0VGV4dChYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5fVUlfUkVGX0ZJTEVfRVJST1JfREVUQUlMUyk7Ci0JCi0gICAgc2V0QmxvY2tPbk9wZW4oZmFsc2UpOwotICAgIHJldHVybiBvcGVuKCk7Ci0gIH0KLQotCi0gIHByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KQotICB7Ci0gICAgQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0gICAgY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgyLCBmYWxzZSkpOwotICAgIGNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotICAgIGZ1bGxGaWxlTmFtZUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgZnVsbEZpbGVOYW1lRmllbGQuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgZnVsbEZpbGVOYW1lRmllbGQuc2V0QmFja2dyb3VuZChwYXJlbnQuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBmdWxsRmlsZU5hbWVGaWVsZC5zZXRFZGl0YWJsZShmYWxzZSk7Ci0KLSAgICBzdXBlci5jcmVhdGVCdXR0b25CYXIoY29tcG9zaXRlKTsKLQotICAgIHJldHVybiBjb21wb3NpdGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpCi0gIHsKLSAgICBDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLSAgICBkaWFsb2dBcmVhLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotICAgIENvbXBvc2l0ZSBjID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0gICAgYy5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoKSk7Ci0gICAgYy5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKHRydWUsIC0xLCAyMDApKTsKLQotICAgIHN0eWxlZFRleHQgPSBuZXcgU3R5bGVkVGV4dChjLCBTV1QuTVVMVEkgfCBTV1QuV1JBUCk7Ci0gICAgc3R5bGVkVGV4dC5zZXRCYWNrZ3JvdW5kKGMuZ2V0QmFja2dyb3VuZCgpKTsKLSAgICBzZXRTdHlsZWRUZXh0KHN0eWxlZFRleHQsIG1hcmtlZFVwRGV0YWlsc01lc3NhZ2UpOwotICAgIHN0eWxlZFRleHQuc2V0RWRpdGFibGUoZmFsc2UpOwotICAgIHN0eWxlZFRleHQuc2V0TGF5b3V0RGF0YShjcmVhdGVHcmlkRGF0YShmYWxzZSwgNjUwLCAtMSkpOwotCi0gICAgTW91c2VMaXN0ZW5lciBtb3VzZUxpc3RlbmVyID0gbmV3IE1vdXNlTGlzdGVuZXIoKTsKLSAgICBzdHlsZWRUZXh0LmFkZE1vdXNlTW92ZUxpc3RlbmVyKG1vdXNlTGlzdGVuZXIpOwotCi0gICAgdGFibGVWaWV3ZXIgPSBuZXcgVGFza0xpc3RUYWJsZVZpZXdlcihjLCAxMCk7Ci0gICAgdGFibGVWaWV3ZXIuc2V0SW5wdXQoZXJyb3JMaXN0KTsKLSAgICB0YWJsZVZpZXdlci5hZGRTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIobmV3IEludGVybmFsU2VsZWN0aW9uTGlzdGVuZXIoKSk7Ci0gICAgdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEodHJ1ZSwgNzAwLCAtMSkpOwotICAgIHJldHVybiBkaWFsb2dBcmVhOwotICB9Ci0KLSAgU3RyaW5nIGdldEZ1bGxVUkkoaW50IG9mZnNldCkKLSAgewotICAgIFN0cmluZyB1cmkgPSAiIjsgLy8kTk9OLU5MUy0xJAotICAgIGludCBpbmRleCA9IGdldEluZGV4KG9mZnNldCk7Ci0gICAgaWYgKGluZGV4ICE9IC0xKQotICAgIHsKLSAgICAgIGlmIChpbmRleCA9PSAwIHx8IGluZGV4ID09IDIgfHwgaW5kZXggPT0gMykKLSAgICAgIHsKLSAgICAgICAgdXJpID0gcmVmZXJlbmNlZEZpbGU7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHVyaSA9IGNvbnRleHRGaWxlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdXJpOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgZ2V0SW5kZXgoaW50IG9mZnNldCkKLSAgewotICAgIGludCByZXN1bHQgPSAtMTsKLSAgICBTdHlsZVJhbmdlW10gcmFuZ2UgPSBzdHlsZWRUZXh0LmdldFN0eWxlUmFuZ2VzKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5nZS5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpbnQgbCA9IHJhbmdlW2ldLnN0YXJ0OwotICAgICAgaW50IHIgPSBsICsgcmFuZ2VbaV0ubGVuZ3RoOwotICAgICAgaWYgKGwgPD0gb2Zmc2V0ICYmIHIgPj0gb2Zmc2V0KQotICAgICAgewotICAgICAgICByZXN1bHQgPSBpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIGNsYXNzIE1vdXNlTGlzdGVuZXIgaW1wbGVtZW50cyBNb3VzZU1vdmVMaXN0ZW5lcgotICB7Ci0gICAgcHVibGljIHZvaWQgbW91c2VNb3ZlKE1vdXNlRXZlbnQgZXZlbnQpCi0gICAgewotICAgICAgU3RyaW5nIHRvb2xUaXBUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHRyeQotICAgICAgewotCi0gICAgICAgIGludCBvZmZzZXQgPSBzdHlsZWRUZXh0LmdldE9mZnNldEF0TG9jYXRpb24obmV3IFBvaW50KGV2ZW50LngsIGV2ZW50LnkpKTsKLSAgICAgICAgdG9vbFRpcFRleHQgPSBnZXRGdWxsVVJJKG9mZnNldCk7Ci0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAJLy8gRG8gbm90aGluZy4KLSAgICAgIH0KLSAgICAgIHN0eWxlZFRleHQuc2V0VG9vbFRpcFRleHQodG9vbFRpcFRleHQpOwotICAgICAgaWYgKHRvb2xUaXBUZXh0ICE9IG51bGwgJiYgdG9vbFRpcFRleHQubGVuZ3RoKCkgPiAwKQotICAgICAgewotICAgICAgICBmdWxsRmlsZU5hbWVGaWVsZC5zZXRUZXh0KHRvb2xUaXBUZXh0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRNYXJrZWRVcERldGFpbHNNZXNzYWdlKCkKLSAgewotCVN0cmluZyBkZXRhaWxzTWVzc2FnZSA9ICIiOyAgCSAvLyROT04tTkxTLTEkCi0gICAgLy8gVE9ETy4uLiBuZWVkIHRvIG1vdmUgJ19VSV9SRUZfRklMRV9FUlJPUl9ERVNDUklQVElPTicgdG8gdGhpcyBwbHVnaW4ncyBwcm9wZXJ0aWVzIGZpbGUKLSAgICAvLwkJCQotICAgICAgU3RyaW5nIHN0cmluZyA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLl9VSV9SRUZfRklMRV9FUlJPUl9ERVNDUklQVElPTjsKLSAgICAgIC8vIFRPRE8uLi4gbmVlZCB0byBlZGl0IHRoZSBwcm9wZXJ0aWVzIGZpbGUgdG8gcmVtb3ZlICInIiBjaGFyYWN0ZXJzIGZyb20gdGhlIHN0cmluZwotICAgICAgLy8gSSdtIHVzaW5nIHRoZXNlIGNoYXJhY3RlcnMgdG8gbWFya3VwIHRoZSBib2xkIGZvbnQuIEl0J3Mgc2FmZXIgaWYgSSBhZGQgdGhlc2UgcHJvZ3JhbXRpY2FsbHkuCi0gICAgICAvLwotCSAgc3RyaW5nID0gcmVtb3ZlUGF0dGVybihzdHJpbmcsICInIik7IC8vJE5PTi1OTFMtMSQKLQotICAgICAgU3RyaW5nIGMgPSAiJyIgKyBnZXRMYXN0U2VnbWVudChjb250ZXh0RmlsZSkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgU3RyaW5nIHIgPSAiJyIgKyBnZXRMYXN0U2VnbWVudChyZWZlcmVuY2VkRmlsZSkgKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0gICAgICBkZXRhaWxzTWVzc2FnZSA9IE5MUy5iaW5kKHN0cmluZywgbmV3IE9iamVjdFtdIHsgciwgYywgciwgYyB9KTsgICAgCi0gICAgcmV0dXJuIGRldGFpbHNNZXNzYWdlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgcmVtb3ZlUGF0dGVybihTdHJpbmcgc3RyaW5nLCBTdHJpbmcgcGF0dGVybikKLSAgewotICAJd2hpbGUgKHRydWUpCi0gIAl7Ci0gIAkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2YocGF0dGVybik7Ci0gIAkJaWYgKGluZGV4ICE9IC0xKQotICAJCXsKLSAgCQkJc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpbmRleCkgKyBzdHJpbmcuc3Vic3RyaW5nKGluZGV4ICsgcGF0dGVybi5sZW5ndGgoKSk7Ci0gIAkJfQotICAJCWVsc2UKLSAgCQl7Ci0gIAkJCWJyZWFrOwotICAJCX0KLSAgCX0KLSAgCXJldHVybiBzdHJpbmc7ICAJCi0gIH0KLQotICBwcml2YXRlIHZvaWQgc2V0U3R5bGVkVGV4dChTdHlsZWRUZXh0IHN0eWxlZFRleHQsIFN0cmluZyB0ZXh0KQotICB7Ci0gICAgU3RyaW5nIHZpc2libGVNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICBmb3IgKFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWFya2VkVXBEZXRhaWxzTWVzc2FnZSwgIiciLCBmYWxzZSk7IHN0Lmhhc01vcmVUb2tlbnMoKTspIC8vJE5PTi1OTFMtMSQKLSAgICB7Ci0gICAgICBTdHJpbmcgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKTsKLSAgICAgIHZpc2libGVNZXNzYWdlICs9IHRva2VuOwotICAgIH0KLQotICAgIHN0eWxlZFRleHQuc2V0VGV4dCh2aXNpYmxlTWVzc2FnZSk7Ci0gICAvL2R3IEZvbnQgZm9udCA9IHN0eWxlZFRleHQuZ2V0Rm9udCgpOwotCi0gICAgYm9vbGVhbiBpblF1b3RlID0gZmFsc2U7Ci0gICAgaW50IHBvc2l0aW9uID0gMDsKLSAgICBmb3IgKFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobWFya2VkVXBEZXRhaWxzTWVzc2FnZSwgIiciLCB0cnVlKTsgc3QuaGFzTW9yZVRva2VucygpOykgLy8kTk9OLU5MUy0xJAotICAgIHsKLSAgICAgIFN0cmluZyB0b2tlbiA9IHN0Lm5leHRUb2tlbigpOwotCi0gICAgICBpZiAodG9rZW4uZXF1YWxzKCInIikpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgaW5RdW90ZSA9ICFpblF1b3RlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoaW5RdW90ZSkKLSAgICAgICAgewotICAgICAgICAgIHRyeQotICAgICAgICAgIHsKLQotICAgICAgICAgICAgU3R5bGVSYW5nZSBzdHlsZSA9IG5ldyBTdHlsZVJhbmdlKHBvc2l0aW9uLCB0b2tlbi5sZW5ndGgoKSwgc3R5bGVkVGV4dC5nZXRGb3JlZ3JvdW5kKCksIHN0eWxlZFRleHQuZ2V0QmFja2dyb3VuZCgpLCBTV1QuQk9MRCk7Ci0gICAgICAgICAgICBzdHlsZWRUZXh0LnNldFN0eWxlUmFuZ2Uoc3R5bGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiArIHRva2VuLmxlbmd0aCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEdyaWREYXRhIGNyZWF0ZUdyaWREYXRhKGJvb2xlYW4gZmlsbEJvdGgsIGludCB3LCBpbnQgaCkKLSAgewotICAgIEdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGZpbGxCb3RoID8gR3JpZERhdGEuRklMTF9CT1RIIDogR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLSAgICBnZC53aWR0aEhpbnQgPSB3OwotICAgIGdkLmhlaWdodEhpbnQgPSBoOwotICAgIHJldHVybiBnZDsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldExhc3RTZWdtZW50KFN0cmluZyB1cmkpCi0gIHsKLSAgICBTdHJpbmcgcmVzdWx0ID0gdXJpOwotICAgIGludCBpbmRleCA9IE1hdGgubWF4KHVyaS5sYXN0SW5kZXhPZigiLyIpLCB1cmkubGFzdEluZGV4T2YoIlxcIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgewotICAgICAgcmVzdWx0ID0gdXJpLnN1YnN0cmluZyhpbmRleCArIDEpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJvdGVjdGVkIGNsYXNzIEludGVybmFsU2VsZWN0aW9uTGlzdGVuZXIgaW1wbGVtZW50cyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyCi0gIHsKLSAgICBwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKFNlbGVjdGlvbkNoYW5nZWRFdmVudCBldmVudCkKLSAgICB7Ci0gICAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IGV2ZW50LmdldFNlbGVjdGlvbigpOwotICAgICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIFN0cnVjdHVyZWRTZWxlY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlID0gKFZhbGlkYXRpb25NZXNzYWdlKSAoKFN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCk7Ci0gICAgICAgIGlmICh2YWxpZGF0aW9uTWVzc2FnZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHVyaXN0cmluZyA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFVyaSgpOwotICAgICAgICAgIFJlZmVyZW5jZWRGaWxlRXJyb3JVdGlsaXR5Lm9wZW5FZGl0b3JBbmRHb3RvRXJyb3IodXJpc3RyaW5nLCB2YWxpZGF0aW9uTWVzc2FnZS5nZXRMaW5lTnVtYmVyKCksIHZhbGlkYXRpb25NZXNzYWdlLmdldENvbHVtbk51bWJlcigpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vUmVmZXJlbmNlZEZpbGVFcnJvclV0aWxpdHkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwZGY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL2NvcmUvZXJyb3JpbmZvL1JlZmVyZW5jZWRGaWxlRXJyb3JVdGlsaXR5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm87Ci0KLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LlRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JRG9jdW1lbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLmxvZ2dpbmcuTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0KLXB1YmxpYyBjbGFzcyBSZWZlcmVuY2VkRmlsZUVycm9yVXRpbGl0eQotewotICBwdWJsaWMgc3RhdGljIHZvaWQgb3BlbkVkaXRvckFuZEdvdG9FcnJvcihTdHJpbmcgdXJpc3RyaW5nLCBmaW5hbCBpbnQgbGluZSwgZmluYWwgaW50IGNvbHVtbikKLSAgewotICAgIGlmICh1cmlzdHJpbmcgIT0gbnVsbCkKLSAgICB7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgVVJMIHVyaSA9IG5ldyBVUkwodXJpc3RyaW5nKTsKLSAgICAgICAgaWYgKHVyaSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKCJmaWxlIi5lcXVhbHModXJpLmdldFByb3RvY29sKCkpKSAvLyROT04tTkxTLTEkCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHBhdGhTdHJpbmcgPSB1cmkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgSVBhdGggcGF0aCA9IG5ldyBQYXRoKHBhdGhTdHJpbmcpOwotICAgICAgICAgICAgU3RyaW5nIGRldmljZSA9IHBhdGguZ2V0RGV2aWNlKCk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IG51bGwgJiYgZGV2aWNlLnN0YXJ0c1dpdGgoIi8iKSkgLy8kTk9OLU5MUy0xJAotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwYXRoID0gcGF0aC5zZXREZXZpY2UoZGV2aWNlLnN1YnN0cmluZygxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBJRmlsZSBmaWxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlRm9yTG9jYXRpb24ocGF0aCk7Ci0gICAgICAgICAgICBpZiAoZmlsZSAhPSBudWxsICYmIGZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vV29ya2JlbmNoVXRpbGl0eS5vcGVuRWRpdG9yKGZpbGUpOwotICAgICAgICAgICAgICAvLyBPcGVuIHRoZSBlZGl0b3IgZm9yIHRoaXMgZmlsZS4KLSAgICAgICAgICAgICAgZmluYWwgSUZpbGUgaUZpbGUgPSBmaWxlOwotICAgICAgICAgICAgICBJV29ya2JlbmNoIHdvcmtiZW5jaCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCk7Ci0gICAgICAgICAgICAgIGZpbmFsIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gd29ya2JlbmNoLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCi0gICAgICAgICAgICAgIERpc3BsYXkuZ2V0RGVmYXVsdCgpLmFzeW5jRXhlYwotICAgICAgICAgICAgICAobmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAJSUVkaXRvckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKGlGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAJU3RyaW5nIGVkaXRvcklkOwotICAgICAgICAgICAgICAgICAgCWlmKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgIAl7Ci0gICAgICAgICAgICAgICAgICAJICBlZGl0b3JJZCA9IGRlc2NyaXB0b3IuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgIAl9Ci0gICAgICAgICAgICAgICAgICAJZWxzZQotICAgICAgICAgICAgICAgICAgCXsKLSAgICAgICAgICAgICAgICAgIAkgIGVkaXRvcklkID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRFZGl0b3JSZWdpc3RyeSgpLmdldERlZmF1bHRFZGl0b3IoaUZpbGUuZ2V0TmFtZSgpICsgIi50eHQiKS5nZXRJZCgpOyAvLyROT04tTkxTLTEkCi0gICAgICAgICAgICAgICAgICAJfQotICAgICAgICAgICAgICAgICAgICB3b3JrYmVuY2hXaW5kb3cuZ2V0QWN0aXZlUGFnZSgpLm9wZW5FZGl0b3IobmV3IEZpbGVFZGl0b3JJbnB1dChpRmlsZSksIGVkaXRvcklkKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBleCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXJJbnN0YW5jZSgpLmxvZ0Vycm9yKCJFeGNlcHRpb24gZW5jb3VudGVyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIG9wZW4gZmlsZTogIiArIGlGaWxlICsgIlxuXG4iLCBleCk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotICAgICAgICAgICAgICAgICAgCS8vQjJCR1VJUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJFeGNlcHRpb24gZW5jb3VudGVyZWQgd2hlbiBhdHRlbXB0aW5nIHRvIG9wZW4gZmlsZTogIiArIGlGaWxlICsgIlxuXG4iICsgZXgpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIFJ1bm5hYmxlIHJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgLy9JRWRpdG9yUGFydCBlZGl0b3JQYXJ0ID0gV29ya2JlbmNoVXRpbGl0eS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgICAgICAgIElFZGl0b3JQYXJ0IGVkaXRvclBhcnQgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKS5nZXRBY3RpdmVFZGl0b3IoKTsKLSAgICAgICAgICAgICAgICAgIGdvdG9FcnJvcihlZGl0b3JQYXJ0LCBsaW5lLCBjb2x1bW4pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKHJ1bm5hYmxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAJLy8gRG8gbm90aGluZy4KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgdm9pZCBnb3RvRXJyb3IoSUVkaXRvclBhcnQgZWRpdG9yUGFydCwgaW50IGxpbmUsIGludCBjb2x1bW4pCi0gIHsKLSAgICBpZiAoZWRpdG9yUGFydCAhPSBudWxsKQotICAgIHsKLSAgICAgIFRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChUZXh0RWRpdG9yKSBlZGl0b3JQYXJ0LmdldEFkYXB0ZXIoVGV4dEVkaXRvci5jbGFzcyk7Ci0gICAgICBpZiAodGV4dEVkaXRvciAhPSBudWxsKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIElEb2N1bWVudFByb3ZpZGVyIGRwID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCk7Ci0gICAgICAgICAgSURvY3VtZW50IGRvY3VtZW50ID0gKGRwICE9IG51bGwpID8gZHAuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSA6IG51bGw7Ci0gICAgICAgICAgdGV4dEVkaXRvci5zZWxlY3RBbmRSZXZlYWwoZG9jdW1lbnQuZ2V0TGluZU9mZnNldChsaW5lIC0gMSkgKyBjb2x1bW4gLSAxLCAwKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24geCkKLSAgICAgICAgewotICAgICAgICAgIC8vIG1hcmtlciByZWZlcnMgdG8gaW52YWxpZCB0ZXh0IHBvc2l0aW9uIC0+IGRvIG5vdGhpbmcKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vY29yZS9lcnJvcmluZm8vVGFza0xpc3RUYWJsZVZpZXdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9UYXNrTGlzdFRhYmxlVmlld2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YTU2MTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9jb3JlL2Vycm9yaW5mby9UYXNrTGlzdFRhYmxlVmlld2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5lcnJvcmluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuQ29sdW1uV2VpZ2h0RGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZUxheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRhYmxlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklTaGFyZWRJbWFnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25NZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzOwotCi0KLQotcHVibGljIGNsYXNzIFRhc2tMaXN0VGFibGVWaWV3ZXIgZXh0ZW5kcyBUYWJsZVZpZXdlcgotewkKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX0lDT04gPSAwOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fREVTQ1JJUFRJT04gPSAxOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fUkVTT1VSQ0UgPSAzOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTE9DQVRJT04gPSAyOwotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0lDT04gPSAiIjsgLy8kTk9OLU5MUy0xJAotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9ERVNDUklQVElPTiA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMDsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfUkVTT1VSQ0UgPSBYTUxWYWxpZGF0aW9uVUlNZXNzYWdlcy5UYXNrTGlzdFRhYmxlVmlld2VyXzE7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExBQkVMX0xPQ0FUSU9OID0gWE1MVmFsaWRhdGlvblVJTWVzc2FnZXMuVGFza0xpc3RUYWJsZVZpZXdlcl8yOwotCi0gIHByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotICBwcm90ZWN0ZWQgaW50IGdldENvbHVtbldpZHRoKGludCBjb2x1bW4pCi0gIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBzd2l0Y2ggKGNvbHVtbikKLSAgICB7Ci0gICAgICBjYXNlIENPTFVNTl9JQ09OIDoKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IDE7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIGNhc2UgQ09MVU1OX0RFU0NSSVBUSU9OIDoKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IDIwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIENPTFVNTl9SRVNPVVJDRSA6Ci0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAzOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICBjYXNlIENPTFVNTl9MT0NBVElPTiA6Ci0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAzOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgVGFza0xpc3RUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MpCi0gIHsKLSAgICB0aGlzKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiwgdmlzaWJsZVJvd3MpOwotICB9Ci0KLSAgcHVibGljIFRhc2tMaXN0VGFibGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCwgaW50IHN0eWxlLCBpbnQgdmlzaWJsZVJvd3MpCi0gIHsKLSAgICBzdXBlcihuZXcgVGFibGUocGFyZW50LCBzdHlsZSkpOwotICAgIGdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCi0gICAgUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIoKTsKLSAgICBzZXRDb250ZW50UHJvdmlkZXIocHJvdmlkZXIpOwotICAgIHNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCi0gICAgU3RyaW5nW10gY29sdW1uUHJvcGVydGllc0FycmF5ID0geyBMQUJFTF9JQ09OLCBMQUJFTF9ERVNDUklQVElPTiwgTEFCRUxfTE9DQVRJT04gfTsKLSAgICBzZXRDb2x1bW5Qcm9wZXJ0aWVzKGNvbHVtblByb3BlcnRpZXNBcnJheSk7Ci0KLSAgICBUYWJsZSB0YWJsZSA9IGdldFRhYmxlKCk7Ci0gICAgdGFibGUuc2V0SGVhZGVyVmlzaWJsZSh0cnVlKTsKLSAgICB0YWJsZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotICAgIFRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb2x1bW5Qcm9wZXJ0aWVzQXJyYXkubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLSAgICAgIGNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSk7Ci0gICAgICBjb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLSAgICAgIGxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKGdldENvbHVtbldpZHRoKGkpLCB0cnVlKSk7Ci0gICAgfQotCi0gICAgdGFibGUuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAKLSAgICB0aGlzLnZpc2libGVSb3dzID0gdmlzaWJsZVJvd3M7Ci0gIH0KLQotICAvKioKLSAgCSogTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlcgotICAJKi8KLSAgcHJvdGVjdGVkIGNsYXNzIFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyCi0gIHsKLSAgICBWaWV3ZXIgdmlld2VyOwotICAgIEltYWdlIGVycm9ySW1hZ2U7IAotICAgIEltYWdlIHdhcm5JbWFnZTsKLSAgICAKLSAgICBwdWJsaWMgUHJvdmlkZXIoKQotICAgIHsKLSAgICAgIGVycm9ySW1hZ2UgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldEltYWdlKElTaGFyZWRJbWFnZXMuSU1HX09CSlNfRVJST1JfVFNLKTsKLSAgICAgICAKLSAgICAgIHdhcm5JbWFnZSA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoSVNoYXJlZEltYWdlcy5JTUdfT0JKU19XQVJOX1RTSyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KQotICAgIHsKLSAgICAgIHRoaXMudmlld2VyID0gdmlld2VyOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KQotICAgIHsKLSAgICAgIExpc3QgbGlzdCA9IChMaXN0KSB2aWV3ZXIuZ2V0SW5wdXQoKTsKLSAgICAgIHJldHVybiBsaXN0ICE9IG51bGwgPyBsaXN0LnRvQXJyYXkoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkKLSAgICB7Ci0JICBWYWxpZGF0aW9uTWVzc2FnZSB2YWxpZGF0aW9uTWVzc2FnZSA9IChWYWxpZGF0aW9uTWVzc2FnZSkgb2JqZWN0OyAgICAJCi0gICAgICBJbWFnZSByZXN1bHQgPSBudWxsOyAKLSAgICAgIGlmIChjb2x1bW5JbmRleCA9PSAwKQotICAgICAgewotICAgICAgCWludCBzZXZlcml0eSA9IHZhbGlkYXRpb25NZXNzYWdlLmdldFNldmVyaXR5KCk7Ci0gICAgICAJaWYgKHNldmVyaXR5ID09IElNZXNzYWdlLkhJR0hfU0VWRVJJVFkgfHwgCi0gICAgICAJICAgIHNldmVyaXR5ID09IElNZXNzYWdlLk5PUk1BTF9TRVZFUklUWSkgICAgICAJICAgIAotICAgICAgCXsKLQkJCXJlc3VsdCA9IGVycm9ySW1hZ2U7Ci0gICAgICAJfSAKLSAgICAgIAllbHNlCi0gICAgICAJewotICAgICAgCSAgcmVzdWx0ID0gd2FybkltYWdlOwotICAgICAgCX0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW4pCi0gICAgewotICAgICAgVmFsaWRhdGlvbk1lc3NhZ2UgZXJyb3JNZXNzYWdlID0gKFZhbGlkYXRpb25NZXNzYWdlKSBvYmplY3Q7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLSAgICAgIHN3aXRjaCAoY29sdW1uKQotICAgICAgewotICAgICAgICBjYXNlIENPTFVNTl9ERVNDUklQVElPTiA6Ci0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZXJyb3JNZXNzYWdlLmdldE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBDT0xVTU5fTE9DQVRJT04gOgotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IFhNTFZhbGlkYXRpb25VSU1lc3NhZ2VzLlRhc2tMaXN0VGFibGVWaWV3ZXJfMyArIGVycm9yTWVzc2FnZS5nZXRMaW5lTnVtYmVyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi94bWx2YWxpZGF0aW9uLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhYTU5YS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL3htbHZhbGlkYXRpb24ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMgQ29uc3RhbnRzIGZvciBzdHJpbmdzICAKLQotIwotIyBSZWZlcmVuY2VkIEZpbGUgRGlhbG9nIFJlbGF0ZWQgTWVzc2FnZQotIwotX1VJX1JFRl9GSUxFX0VSUk9SX0RFU0NSSVBUSU9OICAgICAgPSBUaGUgZXJyb3JzIGJlbG93IHdlcmUgZGV0ZWN0ZWQgd2hlbiB2YWxpZGF0aW5nIHRoZSBmaWxlICJ7MH0iIHZpYSB0aGUgZmlsZSAiezF9Ii4gIEluIG1vc3QgY2FzZXMgdGhlc2UgZXJyb3JzIGNhbiBiZSBkZXRlY3RlZCBieSB2YWxpZGF0aW5nICJ7Mn0iIGRpcmVjdGx5LiAgSG93ZXZlciBpdCBpcyBwb3NzaWJsZSB0aGF0IGVycm9ycyB3aWxsIG9ubHkgb2NjdXIgd2hlbiB7Mn0gaXMgdmFsaWRhdGVkIGluIHRoZSBjb250ZXh0IG9mIHszfS4KLV9VSV9SRUZfRklMRV9FUlJPUl9NRVNTQUdFICAgICAgICAgID0gUmVmZXJlbmNlZCBmaWxlIGNvbnRhaW5zIGVycm9ycyAoezB9KS4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCByaWdodCBjbGljayBvbiB0aGUgbWVzc2FnZSBhbmQgc2VsZWN0ICJTaG93IERldGFpbHMuLi4iCi1fVUlfUkVGX0ZJTEVfRVJST1JfREVUQUlMUyAgICAgICAgICA9IFJlZmVyZW5jZWQgRmlsZSBFcnJvciBEZXRhaWxzCi0KLV9VSV9ERVRBSUxTX0lORk9STUFUSU9OX1VOQVZBSUxBQkxFICAgICAgID0gRGV0YWlscyBJbmZvcm1hdGlvbiBVbmF2YWlsYWJsZQotX1VJX0RFVEFJTFNfSU5GT19SRVZBTElEQVRFX1RPX1JFR0VORVJBVEUgPSBEZXRhaWxzIGluZm9ybWF0aW9uIGN1cnJlbnRseSB1bmF2YWlsYWJsZS4gIFBsZWFzZSByZXZhbGlkYXRlIHRoZSBmaWxlIHRvIHJlZ2VuZXJhdGUgdGhlIGVycm9yIGRldGFpbHMuCi0KLSMKLSMgRGlydHkgRmlsZSBEaWFsb2cgUmVsYXRlZCBNZXNzYWdlcwotIwotVGFza0xpc3RUYWJsZVZpZXdlcl8wPURlc2NyaXB0aW9uCi1UYXNrTGlzdFRhYmxlVmlld2VyXzE9UmVzb3VyY2UKLVRhc2tMaXN0VGFibGVWaWV3ZXJfMj1Mb2NhdGlvbgotVGFza0xpc3RUYWJsZVZpZXdlcl8zPWxpbmUgCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjEyY2MyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRm9sZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklQcm9qZWN0RGVzY3JpcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklXb3Jrc3BhY2VSb290OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuTnVsbFByb2dyZXNzTW9uaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3ViUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLm9wZXJhdGlvbi5JUnVubmFibGVXaXRoUHJvZ3Jlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5JT3ZlcndyaXRlUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5kYXRhdHJhbnNmZXIuSW1wb3J0T3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLndpemFyZHMuZGF0YXRyYW5zZmVyLlppcEZpbGVTdHJ1Y3R1cmVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7Ci0KLXB1YmxpYyBjbGFzcyBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uIGltcGxlbWVudHMgSVJ1bm5hYmxlV2l0aFByb2dyZXNzIHsKLQotCXByaXZhdGUgSVJlc291cmNlIGVsZW1lbnRUb09wZW47Ci0KLQlwcml2YXRlIElPdmVyd3JpdGVRdWVyeSBvdmVyd3JpdGVRdWVyeTsKLQotCXByaXZhdGUgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VbXSBwYWdlczsKLQotCS8qKgotCSAqIENvbnN0cnVjdG9yIGZvciBFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uCi0JICovCi0JcHVibGljIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24oRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VbXSBteVBhZ2VzLCBJT3ZlcndyaXRlUXVlcnkgbXlPdmVyd3JpdGVRdWVyeSkgewotCQllbGVtZW50VG9PcGVuID0gbnVsbDsKLQkJcGFnZXMgPSBteVBhZ2VzOwotCQlvdmVyd3JpdGVRdWVyeSA9IG15T3ZlcndyaXRlUXVlcnk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvamVjdCBjb25maWdOZXdQcm9qZWN0KElXb3Jrc3BhY2VSb290IHJvb3QsIFN0cmluZyBuYW1lLCBTdHJpbmdbXSBuYXR1cmVJZHMsIElQcm9qZWN0W10gcmVmZXJlbmNlZFByb2plY3RzLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLQkJdHJ5IHsKLQkJCUlQcm9qZWN0IHByb2plY3QgPSByb290LmdldFByb2plY3QobmFtZSk7Ci0JCQlpZiAoIXByb2plY3QuZXhpc3RzKCkpIHsKLQkJCQlwcm9qZWN0LmNyZWF0ZShudWxsKTsKLQkJCX0KLQkJCWlmICghcHJvamVjdC5pc09wZW4oKSkgewotCQkJCXByb2plY3Qub3BlbihudWxsKTsKLQkJCX0KLQkJCUlQcm9qZWN0RGVzY3JpcHRpb24gZGVzYyA9IHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKTsKLQkJCWRlc2Muc2V0TG9jYXRpb24obnVsbCk7Ci0JCQlkZXNjLnNldE5hdHVyZUlkcyhuYXR1cmVJZHMpOwotCQkJZGVzYy5zZXRSZWZlcmVuY2VkUHJvamVjdHMocmVmZXJlbmNlZFByb2plY3RzKTsKLQotCQkJcHJvamVjdC5zZXREZXNjcmlwdGlvbihkZXNjLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQotCQkJcmV0dXJuIHByb2plY3Q7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgY3JlYXRlUHJvamVjdChJV29ya3NwYWNlUm9vdCByb290LCBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZSBwYWdlLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCUlDb25maWd1cmF0aW9uRWxlbWVudCBkZXNjID0gcGFnZS5nZXRDb25maWd1cmF0aW9uRWxlbWVudCgpOwotCi0JCUlDb25maWd1cmF0aW9uRWxlbWVudFtdIGltcG9ydHMgPSBkZXNjLmdldENoaWxkcmVuKCJpbXBvcnQiKTsgLy8kTk9OLU5MUy0xJAotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBuYXR1cmVzID0gZGVzYy5nZXRDaGlsZHJlbigibmF0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gcmVmZXJlbmNlcyA9IGRlc2MuZ2V0Q2hpbGRyZW4oInJlZmVyZW5jZXMiKTsgLy8kTk9OLU5MUy0xJAotCQlpbnQgbkltcG9ydHMgPSAoaW1wb3J0cyA9PSBudWxsKSA/IDAgOiBpbXBvcnRzLmxlbmd0aDsKLQkJaW50IG5OYXR1cmVzID0gKG5hdHVyZXMgPT0gbnVsbCkgPyAwIDogbmF0dXJlcy5sZW5ndGg7Ci0JCWludCBuUmVmZXJlbmNlcyA9IChyZWZlcmVuY2VzID09IG51bGwpID8gMCA6IHJlZmVyZW5jZXMubGVuZ3RoOwotCi0JCW1vbml0b3IuYmVnaW5UYXNrKFhNTFdpemFyZHNNZXNzYWdlcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uX29wX2Rlc2NfcHJvaiwgbkltcG9ydHMgKyAxKTsKLQotCQlTdHJpbmcgbmFtZSA9IHBhZ2UuZ2V0UHJvamVjdE5hbWUoKTsKLQotCQlTdHJpbmdbXSBuYXR1cmVJZHMgPSBuZXcgU3RyaW5nW25OYXR1cmVzXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuTmF0dXJlczsgaSsrKSB7Ci0JCQluYXR1cmVJZHNbaV0gPSBuYXR1cmVzW2ldLmdldEF0dHJpYnV0ZSgiaWQiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCUlQcm9qZWN0W10gcmVmZXJlbmNlZFByb2plY3RzID0gbmV3IElQcm9qZWN0W25SZWZlcmVuY2VzXTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuUmVmZXJlbmNlczsgaSsrKSB7Ci0JCQlyZWZlcmVuY2VkUHJvamVjdHNbaV0gPSByb290LmdldFByb2plY3QocmVmZXJlbmNlc1tpXS5nZXRBdHRyaWJ1dGUoImlkIikpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlJUHJvamVjdCBwcm9qID0gY29uZmlnTmV3UHJvamVjdChyb290LCBuYW1lLCBuYXR1cmVJZHMsIHJlZmVyZW5jZWRQcm9qZWN0cywgbW9uaXRvcik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuSW1wb3J0czsgaSsrKSB7Ci0JCQlkb0ltcG9ydHMocHJvaiwgaW1wb3J0c1tpXSwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCX0KLQotCQlTdHJpbmcgb3BlbiA9IGRlc2MuZ2V0QXR0cmlidXRlKCJvcGVuIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKG9wZW4gIT0gbnVsbCAmJiBvcGVuLmxlbmd0aCgpID4gMCkgewotCQkJSVJlc291cmNlIGZpbGVUb09wZW4gPSBwcm9qLmZpbmRNZW1iZXIobmV3IFBhdGgob3BlbikpOwotCQkJaWYgKGZpbGVUb09wZW4gIT0gbnVsbCkgewotCQkJCWVsZW1lbnRUb09wZW4gPSBmaWxlVG9PcGVuOwotCQkJfQotCQl9Ci0KLQl9Ci0KLQlwcml2YXRlIHZvaWQgZG9JbXBvcnRzKElQcm9qZWN0IHByb2plY3QsIElDb25maWd1cmF0aW9uRWxlbWVudCBjdXJyLCBJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCXRyeSB7Ci0JCQlJUGF0aCBkZXN0UGF0aDsKLQkJCVN0cmluZyBuYW1lID0gY3Vyci5nZXRBdHRyaWJ1dGUoImRlc3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKG5hbWUgPT0gbnVsbCB8fCBuYW1lLmxlbmd0aCgpID09IDApIHsKLQkJCQlkZXN0UGF0aCA9IHByb2plY3QuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCUlGb2xkZXIgZm9sZGVyID0gcHJvamVjdC5nZXRGb2xkZXIobmFtZSk7Ci0JCQkJaWYgKCFmb2xkZXIuZXhpc3RzKCkpIHsKLQkJCQkJZm9sZGVyLmNyZWF0ZSh0cnVlLCB0cnVlLCBudWxsKTsKLQkJCQl9Ci0JCQkJZGVzdFBhdGggPSBmb2xkZXIuZ2V0RnVsbFBhdGgoKTsKLQkJCX0KLQkJCVN0cmluZyBpbXBvcnRQYXRoID0gY3Vyci5nZXRBdHRyaWJ1dGUoInNyYyIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAoaW1wb3J0UGF0aCA9PSBudWxsKSB7Ci0JCQkJaW1wb3J0UGF0aCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJwcm9qZWN0c2V0dXAgZGVzY3JpcHRvcjogaW1wb3J0IG1pc3NpbmciKTsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybjsKLQkJCX0KLQotCQkJWmlwRmlsZSB6aXBGaWxlID0gZ2V0WmlwRmlsZUZyb21QbHVnaW5EaXIoaW1wb3J0UGF0aCwgZ2V0Q29udHJpYnV0aW5nUGx1Z2luKGN1cnIpKTsKLQkJCWltcG9ydEZpbGVzRnJvbVppcCh6aXBGaWxlLCBkZXN0UGF0aCwgbmV3IFN1YlByb2dyZXNzTW9uaXRvcihtb25pdG9yLCAxKSk7Ci0JCX0KLQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZSk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDb250cmlidXRpbmdQbHVnaW4oSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50KSB7Ci0JCU9iamVjdCBwYXJlbnQgPSBjb25maWd1cmF0aW9uRWxlbWVudDsKLQkJd2hpbGUgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQlpZiAocGFyZW50IGluc3RhbmNlb2YgSUV4dGVuc2lvbikKLQkJCQlyZXR1cm4gKChJRXh0ZW5zaW9uKSBwYXJlbnQpLmdldE5hbWVzcGFjZSgpOwotCQkJcGFyZW50ID0gKChJQ29uZmlndXJhdGlvbkVsZW1lbnQpIHBhcmVudCkuZ2V0UGFyZW50KCk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIElSZXNvdXJjZSBnZXRFbGVtZW50VG9PcGVuKCkgewotCQlyZXR1cm4gZWxlbWVudFRvT3BlbjsKLQl9Ci0KLQlwcml2YXRlIFppcEZpbGUgZ2V0WmlwRmlsZUZyb21QbHVnaW5EaXIoU3RyaW5nIHBsdWdpblJlbGF0aXZlUGF0aCwgU3RyaW5nIHN5bWJvbGljTmFtZSkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQl0cnkgewotCQkJQnVuZGxlIGJ1bmRsZSA9IFBsYXRmb3JtLmdldEJ1bmRsZShzeW1ib2xpY05hbWUpOwotCQkJVVJMIHN0YXJ0ZXJVUkwgPSBuZXcgVVJMKGJ1bmRsZS5nZXRFbnRyeSgiLyIpLCBwbHVnaW5SZWxhdGl2ZVBhdGgpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gbmV3IFppcEZpbGUoUGxhdGZvcm0uYXNMb2NhbFVSTChzdGFydGVyVVJMKS5nZXRGaWxlKCkpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTdHJpbmcgbWVzc2FnZSA9IHBsdWdpblJlbGF0aXZlUGF0aCArICI6ICIgKyBlLmdldE1lc3NhZ2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJU3RhdHVzIHN0YXR1cyA9IG5ldyBTdGF0dXMoSVN0YXR1cy5FUlJPUiwgWE1MVUlQbHVnaW4uSUQsIElTdGF0dXMuRVJST1IsIG1lc3NhZ2UsIGUpOwotCQkJdGhyb3cgbmV3IENvcmVFeGNlcHRpb24oc3RhdHVzKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBpbXBvcnRGaWxlc0Zyb21aaXAoWmlwRmlsZSBzcmNaaXBGaWxlLCBJUGF0aCBkZXN0UGF0aCwgSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24gewotCQlaaXBGaWxlU3RydWN0dXJlUHJvdmlkZXIgc3RydWN0dXJlUHJvdmlkZXIgPSBuZXcgWmlwRmlsZVN0cnVjdHVyZVByb3ZpZGVyKHNyY1ppcEZpbGUpOwotCQlJbXBvcnRPcGVyYXRpb24gb3AgPSBuZXcgSW1wb3J0T3BlcmF0aW9uKGRlc3RQYXRoLCBzdHJ1Y3R1cmVQcm92aWRlci5nZXRSb290KCksIHN0cnVjdHVyZVByb3ZpZGVyLCBvdmVyd3JpdGVRdWVyeSk7Ci0JCW9wLnJ1bihtb25pdG9yKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgSVJ1bm5hYmxlV2l0aFByb2dyZXNzI3J1bihJUHJvZ3Jlc3NNb25pdG9yKQotCSAqLwotCXB1YmxpYyB2b2lkIHJ1bihJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7Ci0JCWlmIChtb25pdG9yID09IG51bGwpIHsKLQkJCW1vbml0b3IgPSBuZXcgTnVsbFByb2dyZXNzTW9uaXRvcigpOwotCQl9Ci0JCXRyeSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzayhYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjLCBwYWdlcy5sZW5ndGgpOwotCQkJSVdvcmtzcGFjZVJvb3Qgcm9vdCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCk7Ci0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgcGFnZXMubGVuZ3RoOyBpKyspIHsKLQkJCQljcmVhdGVQcm9qZWN0KHJvb3QsIHBhZ2VzW2ldLCBuZXcgU3ViUHJvZ3Jlc3NNb25pdG9yKG1vbml0b3IsIDEpKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQl9Ci0JfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMzkyODQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUNvbmZpZ3VyYXRpb25FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXhlY3V0YWJsZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSUV4dGVuc2lvblBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JRXh0ZW5zaW9uUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRXJyb3JEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuTWVzc2FnZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5vcGVyYXRpb24uSVJ1bm5hYmxlV2l0aFByb2dyZXNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5EaXNwbGF5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklOZXdXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuYWN0aW9ucy5Xb3Jrc3BhY2VNb2RpZnlEZWxlZ2F0aW5nT3BlcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuSU92ZXJ3cml0ZVF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmlkZS5JREU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkud2l6YXJkcy5uZXdyZXNvdXJjZS5CYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkLCBJRXhlY3V0YWJsZUV4dGVuc2lvbiB7Ci0KLQlwcml2YXRlIGNsYXNzIEltcG9ydE92ZXJ3cml0ZVF1ZXJ5IGltcGxlbWVudHMgSU92ZXJ3cml0ZVF1ZXJ5IHsKLQotCQlwcml2YXRlIGludCBvcGVuRGlhbG9nKGZpbmFsIFN0cmluZyBmaWxlKSB7Ci0JCQlmaW5hbCBpbnRbXSByZXN1bHQgPSB7SURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUR9OwotCQkJZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCkuc3luY0V4ZWMobmV3IFJ1bm5hYmxlKCkgewotCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJU3RyaW5nIHRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfdGl0bGU7Ci0JCQkJCVN0cmluZyBtc2cgPSBOTFMuYmluZChYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV9tZXNzYWdlLCBmaWxlKTsKLQkJCQkJU3RyaW5nW10gb3B0aW9ucyA9IHtJRGlhbG9nQ29uc3RhbnRzLllFU19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5OT19MQUJFTCwgSURpYWxvZ0NvbnN0YW50cy5ZRVNfVE9fQUxMX0xBQkVMLCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTH07Ci0JCQkJCU1lc3NhZ2VEaWFsb2cgZGlhbG9nID0gbmV3IE1lc3NhZ2VEaWFsb2coZ2V0U2hlbGwoKSwgdGl0bGUsIG51bGwsIG1zZywgTWVzc2FnZURpYWxvZy5RVUVTVElPTiwgb3B0aW9ucywgMCk7Ci0JCQkJCXJlc3VsdFswXSA9IGRpYWxvZy5vcGVuKCk7Ci0JCQkJfQotCQkJfSk7Ci0JCQlyZXR1cm4gcmVzdWx0WzBdOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBxdWVyeU92ZXJ3cml0ZShTdHJpbmcgZmlsZSkgewotCQkJU3RyaW5nW10gcmV0dXJuQ29kZXMgPSB7WUVTLCBOTywgQUxMLCBDQU5DRUx9OwotCQkJaW50IHJldHVyblZhbCA9IG9wZW5EaWFsb2coZmlsZSk7Ci0JCQlyZXR1cm4gcmV0dXJuVmFsIDwgMCA/IENBTkNFTCA6IHJldHVybkNvZGVzW3JldHVyblZhbF07Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIElDb25maWd1cmF0aW9uRWxlbWVudCB3aXphcmRDb25maWdFbGVtZW50OwotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGV4YW1wbGVDb25maWdFbGVtZW50OwotCi0JcHJpdmF0ZSBTdHJpbmcgRVhBTVBMRV9XSVpBUkRfWFBfSUQgPSAib3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5leGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkIjsgLy8kTk9OLU5MUy0xJAotCi0JcHJpdmF0ZSBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZVtdIHBhZ2VzOwotCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgV0VCX0JST1dTRVJfSUQgPSAib3JnLmVjbGlwc2UudWkuYnJvd3Nlci5lZGl0b3IiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCgpIHsKLQkJc3VwZXIoKTsKLQkJc2V0RGlhbG9nU2V0dGluZ3MoWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldERpYWxvZ1NldHRpbmdzKCkpOwotCQlzZXRXaW5kb3dUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF90aXRsZSk7Ci0JCXNldE5lZWRzUHJvZ3Jlc3NNb25pdG9yKHRydWUpOwotCX0KLQotCS8qCi0JICogQHNlZSBXaXphcmQjYWRkUGFnZXMKLQkgKi8KLQlwdWJsaWMgdm9pZCBhZGRQYWdlcygpIHsKLQkJc3VwZXIuYWRkUGFnZXMoKTsKLQotCQlpZiAoZXhhbXBsZUNvbmZpZ0VsZW1lbnQgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gY2hpbGRyZW4gPSBleGFtcGxlQ29uZmlnRWxlbWVudC5nZXRDaGlsZHJlbigicHJvamVjdHNldHVwIik7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGNoaWxkcmVuID09IG51bGwgfHwgY2hpbGRyZW4ubGVuZ3RoID09IDApIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLkVSUk9SLCAiZGVzY3JpcHRvciBtdXN0IGNvbnRhaW4gb25lIG9yZSBtb3JlIHByb2plY3RzZXR1cCB0YWdzIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybjsKLQkJfQotCi0JCXBhZ2VzID0gbmV3IEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlW2NoaWxkcmVuLmxlbmd0aF07Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykgewotCQkJcGFnZXNbaV0gPSBuZXcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UoaSwgY2hpbGRyZW5baV0pOwotCQkJYWRkUGFnZShwYWdlc1tpXSk7Ci0JCX0KLQl9Ci0JCi0gICAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gY3VycmVudFNlbGVjdGlvbikgewotCQlpZiAoZXhhbXBsZUNvbmZpZ0VsZW1lbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIGJhbm5lciA9IGV4YW1wbGVDb25maWdFbGVtZW50LmdldEF0dHJpYnV0ZSgiYmFubmVyIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChiYW5uZXIgIT0gbnVsbCkgewotCQkJCVVSTCBpbWFnZVVSTCA9IFBsYXRmb3JtLmZpbmQoUGxhdGZvcm0uZ2V0QnVuZGxlKGV4YW1wbGVDb25maWdFbGVtZW50LmdldERlY2xhcmluZ0V4dGVuc2lvbigpLmdldE5hbWVzcGFjZSgpKSwgbmV3IFBhdGgoYmFubmVyKSk7Ci0JCQkJSW1hZ2VEZXNjcmlwdG9yIGRlc2MgPSBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTChpbWFnZVVSTCk7Ci0JCQkJc2V0RGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoZGVzYyk7Ci0JCQl9Ci0JCX0KLSAgICB9Ci0KLQlwcm90ZWN0ZWQgSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZ2V0RXh0ZW5kZWRDb25maWd1cmF0aW9uRWxlbWVudHMoKSB7Ci0JCUlFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0JCUlFeHRlbnNpb25Qb2ludCBleGFtcGxlV2l6YXJkWFAgPSByZWdpc3RyeS5nZXRFeHRlbnNpb25Qb2ludChFWEFNUExFX1dJWkFSRF9YUF9JRCk7Ci0JCWlmIChleGFtcGxlV2l6YXJkWFAgPT0gbnVsbCkgewotCQkJcmV0dXJuIG5ldyBJQ29uZmlndXJhdGlvbkVsZW1lbnRbMF07Ci0JCX0KLQkJSUV4dGVuc2lvbiBleHRlbnNpb24gPSBleGFtcGxlV2l6YXJkWFAuZ2V0RXh0ZW5zaW9uKGdldFdpemFyZEV4dGVuc2lvbklkKCkpOwotCQlpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKLQkJCXJldHVybiBleHRlbnNpb24uZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCX0KLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXhhbXBsZVdpemFyZENFcyA9IGV4YW1wbGVXaXphcmRYUC5nZXRDb25maWd1cmF0aW9uRWxlbWVudHMoKTsKLQkJcmV0dXJuIGV4YW1wbGVXaXphcmRDRXM7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGhhbmRsZUV4Y2VwdGlvbihUaHJvd2FibGUgdGFyZ2V0KSB7Ci0JCVN0cmluZyB0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX29wX2Vycm9yX3RpdGxlOwotCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX29wX2Vycm9yX21lc3NhZ2U7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBDb3JlRXhjZXB0aW9uKSB7Ci0JCQlJU3RhdHVzIHN0YXR1cyA9ICgoQ29yZUV4Y2VwdGlvbikgdGFyZ2V0KS5nZXRTdGF0dXMoKTsKLQkJCUVycm9yRGlhbG9nLm9wZW5FcnJvcihnZXRTaGVsbCgpLCB0aXRsZSwgbWVzc2FnZSwgc3RhdHVzKTsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oc3RhdHVzLmdldE1lc3NhZ2UoKSwgc3RhdHVzLmdldEV4Y2VwdGlvbigpKTsKLQkJfQotCQllbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkVycm9yKGdldFNoZWxsKCksIHRpdGxlLCB0YXJnZXQuZ2V0TWVzc2FnZSgpKTsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24odGFyZ2V0KTsKLQkJfQotCX0KLQkKLQlwcml2YXRlIHZvaWQgb3BlblJlc291cmNlKGZpbmFsIElSZXNvdXJjZSByZXNvdXJjZSkgewotCQlpZiAocmVzb3VyY2UuZ2V0VHlwZSgpICE9IElSZXNvdXJjZS5GSUxFKSB7Ci0JCQlyZXR1cm47Ci0JCX0KLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ID09IG51bGwpIHsKLQkJCXJldHVybjsKLQkJfQotCQlmaW5hbCBJV29ya2JlbmNoUGFnZSBhY3RpdmVQYWdlID0gd2luZG93LmdldEFjdGl2ZVBhZ2UoKTsKLQkJaWYgKGFjdGl2ZVBhZ2UgIT0gbnVsbCkgewotCQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gZ2V0U2hlbGwoKS5nZXREaXNwbGF5KCk7Ci0JCQlkaXNwbGF5LmFzeW5jRXhlYyhuZXcgUnVubmFibGUoKSB7Ci0JCQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJCQl0cnkgewotCQkJCQkJSURFLm9wZW5FZGl0b3IoYWN0aXZlUGFnZSwgKElGaWxlKSByZXNvdXJjZSwgV0VCX0JST1dTRVJfSUQsIHRydWUpOwotCQkJCQl9Ci0JCQkJCWNhdGNoIChQYXJ0SW5pdEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfSk7Ci0JCQlCYXNpY05ld1Jlc291cmNlV2l6YXJkLnNlbGVjdEFuZFJldmVhbChyZXNvdXJjZSwgYWN0aXZlUGFnZS5nZXRXb3JrYmVuY2hXaW5kb3coKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIEBzZWUgV2l6YXJkI3BlcmZvcm1GaW5pc2gKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtRmluaXNoKCkgewotCQlFeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uIHJ1bm5hYmxlID0gbmV3IEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb24ocGFnZXMsIG5ldyBJbXBvcnRPdmVyd3JpdGVRdWVyeSgpKTsKLQotCQlJUnVubmFibGVXaXRoUHJvZ3Jlc3Mgb3AgPSBuZXcgV29ya3NwYWNlTW9kaWZ5RGVsZWdhdGluZ09wZXJhdGlvbihydW5uYWJsZSk7Ci0JCXRyeSB7Ci0JCQlnZXRDb250YWluZXIoKS5ydW4oZmFsc2UsIHRydWUsIG9wKTsKLQkJfQotCQljYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0JCQloYW5kbGVFeGNlcHRpb24oZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQlCYXNpY05ld1Byb2plY3RSZXNvdXJjZVdpemFyZC51cGRhdGVQZXJzcGVjdGl2ZSh3aXphcmRDb25maWdFbGVtZW50KTsKLQkJSVJlc291cmNlIHJlcyA9IHJ1bm5hYmxlLmdldEVsZW1lbnRUb09wZW4oKTsKLQkJaWYgKHJlcyAhPSBudWxsKSB7Ci0JCQlvcGVuUmVzb3VyY2UocmVzKTsKLQkJfQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvKioKLQkgKiBTdG9yZXMgdGhlIGNvbmZpZ3VyYXRpb24gZWxlbWVudCBmb3IgdGhlIHdpemFyZC4gVGhlIGNvbmZpZyBlbGVtZW50Ci0JICogd2lsbCBiZSB1c2VkIGluIDxjb2RlPnBlcmZvcm1GaW5pc2g8L2NvZGU+IHRvIHNldCB0aGUgcmVzdWx0Ci0JICogcGVyc3BlY3RpdmUuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SW5pdGlhbGl6YXRpb25EYXRhKElDb25maWd1cmF0aW9uRWxlbWVudCBjZmlnLCBTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3QgZGF0YSkgewotCQl3aXphcmRDb25maWdFbGVtZW50ID0gY2ZpZzsKLQkJU3RyaW5nIHRpdGxlID0gd2l6YXJkQ29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAodGl0bGUgIT0gbnVsbCkgewotCQkJc2V0V2luZG93VGl0bGUodGl0bGUpOwotCQl9Ci0JCVN0cmluZyB3aXphcmRJZCA9IGdldFdpemFyZEV4dGVuc2lvbklkKCk7IC8vJE5PTi1OTFMtMSQKLQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50W10gZXhhbXBsZVdpemFyZENFcyA9IGdldEV4dGVuZGVkQ29uZmlndXJhdGlvbkVsZW1lbnRzKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZXhhbXBsZVdpemFyZENFcy5sZW5ndGg7IGkrKykgewotCQkJSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW1lbnQgPSBleGFtcGxlV2l6YXJkQ0VzW2ldOwotCQkJU3RyaW5nIGV4dFdpemFyZElkID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmICh3aXphcmRJZCAhPSBudWxsICYmIGV4dFdpemFyZElkICE9IG51bGwgJiYgd2l6YXJkSWQuZXF1YWxzKGV4dFdpemFyZElkKSkgewotCQkJCWV4YW1wbGVDb25maWdFbGVtZW50ID0gZWxlbWVudDsKLQkJCX0KLQkJfQotCQkvLyBpbml0aWFsaXplRGVmYXVsdFBhZ2VJbWFnZURlc2NyaXB0b3IoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFdpemFyZEV4dGVuc2lvbklkKCkgewotCQlyZXR1cm4gd2l6YXJkQ29uZmlnRWxlbWVudC5nZXRBdHRyaWJ1dGUoImlkIik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL0V4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0MTEzNjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDIgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JUHJvamVjdDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5SZXNvdXJjZXNQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklDb25maWd1cmF0aW9uRWxlbWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuSVdpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlOwotCi1wdWJsaWMgY2xhc3MgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UgZXh0ZW5kcyBXaXphcmROZXdQcm9qZWN0Q3JlYXRpb25QYWdlIHsKLQotCXByaXZhdGUgSUNvbmZpZ3VyYXRpb25FbGVtZW50IGNvbmZpZ3VyYXRpb25FbGVtZW50OwotCi0JcHVibGljIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlKGludCBwYWdlTnVtYmVyLCBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZWxlbSkgewotCi0JCXN1cGVyKCJwYWdlIiArIHBhZ2VOdW1iZXIpOyAvLyROT04tTkxTLTEkCi0JCWNvbmZpZ3VyYXRpb25FbGVtZW50ID0gZWxlbTsKLQotCQlTdHJpbmcgbmFtZSA9IGdldEF0dHJpYnV0ZShlbGVtLCAibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCXNldEluaXRpYWxQcm9qZWN0TmFtZShjYWxjdWxhdGVJbml0aWFsUHJvamVjdE5hbWUobmFtZSkpOwotCi0JCXNldERlc2NyaXB0aW9uKGdldEF0dHJpYnV0ZShjb25maWd1cmF0aW9uRWxlbWVudCwgInBhZ2VkZXNjcmlwdGlvbiIpKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRUaXRsZShnZXRBdHRyaWJ1dGUoY29uZmlndXJhdGlvbkVsZW1lbnQsICJwYWdldGl0bGUiKSk7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCS8qCi0JICogU2V0IHRoZSBkZWZhdWx0IHByb2plY3QgbmFtZSB0aGF0IGlzIHRvIGFwcGVhciBvbiB0aGUgaW5pdGlhbFBhZ2UgcGFnZQotCSAqIG9mIHRoaXMgd2l6YXJkLgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgY2FsY3VsYXRlSW5pdGlhbFByb2plY3ROYW1lKFN0cmluZyBwcm9qZWN0TmFtZSkgewotCQlJUHJvamVjdCBwcm9qZWN0SGFuZGxlID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRQcm9qZWN0KHByb2plY3ROYW1lKTsKLQkJaWYgKCFwcm9qZWN0SGFuZGxlLmV4aXN0cygpKSB7Ci0JCQlyZXR1cm4gcHJvamVjdE5hbWU7Ci0JCX0KLQkJLy8gQ2hhbmdlIHRoZSBuYW1lIHVudGlsIGl0IGRvZXNuJ3QgZXhpc3RzLiBUcnkgOSB0aW1lcyBhbmQgdGhlbgotCQkvLyBnaXZlIHVwLgotCQlmb3IgKGludCBpID0gMTsgaSA8IDEwOyBpKyspIHsKLQkJCXByb2plY3RIYW5kbGUgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldFByb2plY3QocHJvamVjdE5hbWUgKyBpKTsKLQkJCWlmICghcHJvamVjdEhhbmRsZS5leGlzdHMoKSkgewotCQkJCXJldHVybiBwcm9qZWN0TmFtZSArIGk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByb2plY3ROYW1lICsgIjkiOyAvLyROT04tTkxTLTEkCi0KLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRBdHRyaWJ1dGUoSUNvbmZpZ3VyYXRpb25FbGVtZW50IGVsZW0sIFN0cmluZyB0YWcpIHsKLQkJU3RyaW5nIHJlcyA9IGVsZW0uZ2V0QXR0cmlidXRlKHRhZyk7Ci0JCWlmIChyZXMgPT0gbnVsbCkgewotCQkJcmV0dXJuICchJyArIHRhZyArICchJzsKLQkJfQotCQlyZXR1cm4gcmVzOwotCX0KLQotCi0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBjb25maWd1cmF0aW9uIGVsZW1lbnQgb2YgdGhpcyBwYWdlLgotCSAqIAotCSAqIEByZXR1cm4gUmV0dXJucyBhIElDb25maWd1cmF0aW9uRWxlbWVudAotCSAqLwotCXB1YmxpYyBJQ29uZmlndXJhdGlvbkVsZW1lbnQgZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnQoKSB7Ci0JCXJldHVybiBjb25maWd1cmF0aW9uRWxlbWVudDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLmRpYWxvZ3MuV2l6YXJkTmV3UHJvamVjdENyZWF0aW9uUGFnZSN2YWxpZGF0ZVBhZ2UoKQotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIHZhbGlkYXRlUGFnZSgpIHsKLQkJaWYgKCFzdXBlci52YWxpZGF0ZVBhZ2UoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgcHJvamVjdE5hbWUgPSBnZXRQcm9qZWN0TmFtZSgpOwotCQlpZiAocHJvamVjdE5hbWUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlJV2l6YXJkIHdpemFyZCA9IGdldFdpemFyZCgpOwotCQlpZiAod2l6YXJkIGluc3RhbmNlb2YgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZCkgewotCQkJSVdpemFyZFBhZ2VbXSBwYWdlcyA9IHdpemFyZC5nZXRQYWdlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwYWdlcy5sZW5ndGg7IGkrKykgewotCQkJCWlmICgocGFnZXNbaV0gIT0gdGhpcykgJiYgKHBhZ2VzW2ldIGluc3RhbmNlb2YgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2UpKSB7Ci0JCQkJCWlmIChwcm9qZWN0TmFtZS5lcXVhbHMoKChFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkUGFnZSkgcGFnZXNbaV0pLmdldFByb2plY3ROYW1lKCkpKSB7Ci0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MV2l6YXJkc01lc3NhZ2VzLkV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRQYWdlX2Vycm9yX2FscmVhZHlleGlzdHMpOwotCQkJCQkJcmV0dXJuIGZhbHNlOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9JWE1MV2l6YXJkSGVscENvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDJlZmEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9JWE1MV2l6YXJkSGVscENvbnRleHRJZHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotLyoqCi0gKiBIZWxwIGNvbnRleHQgaWRzIGZvciB0aGUgeG1sIHdpemFyZC4KLSAqIDxwPgotICogVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgY29uc3RhbnRzIG9ubHk7IGl0IGlzIG5vdCBpbnRlbmRlZCB0byBiZQotICogaW1wbGVtZW50ZWQuCi0gKiA8L3A+Ci0gKi8KLWludGVyZmFjZSBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMgewotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gWE1MVUlQbHVnaW4uSUQgKyAiLiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhIERURCBmaWxlIHJhZGlvCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9DUkVBVEVYTUwxX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDEwMSI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hIGZpbGUgcmFkaW8gYnV0dG9uCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9DUkVBVEVYTUwyX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDEwMiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgWE1MIGZpbGUgZnJvbSBzY3JhdGNoIHJhZGlvIGJ1dHRvbgotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MM19IRUxQSUQgPSBQUkVGSVggKyAieG1sYzAxMDMiOyAvLyROT04tTkxTLTEkCi0JLy8gU2VsZWN0IFNvdXJjZSBmaWxlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1NFTEVDVFNPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAieG1sYzA1MDAiOyAvLyROT04tTkxTLTEkCi0JLy8gUm9vdCBlbGVtZW50IGZvciBib3RoIERURCBhbmQgWE1MIHNjaGVtYQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlRfSEVMUElEID0gUFJFRklYICsgInhtbGMwNDEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIENyZWF0ZSBPcHRpb25hbCBBdHRyaWJ1dGVzCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDFfSEVMUElEID0gUFJFRklYICsgInhtbGMwNDQxIjsgLy8kTk9OLU5MUy0xJAotCS8vIENyZWF0ZSBPcHRpb25hbCBFbGVtZW50cwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQyX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0MiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBDcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkIGNob2ljZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQzX0hFTFBJRCA9IFBSRUZJWCArICJ4bWxjMDQ0MyI7IC8vJE5PTi1OTFMtMSQKLQkvLyBGaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGUgd2l0aCBkYXRhCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDRfSEVMUElEID0gUFJFRklYICsgInhtbGMwNDQ0IjsgLy8kTk9OLU5MUy0xJAotCS8vIFN5c3RlbSBJRCBmb3IgRFRECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDVfSEVMUElEID0gUFJFRklYICsgInhtbGMwMjEwIjsgLy8kTk9OLU5MUy0xJAotCS8vIFB1YmxpYyBJRCBmb3IgRFRECi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDZfSEVMUElEID0gUFJFRklYICsgInhtbGMwMjIwIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmFtZXNwYWNlSW5mb0NvbnRlbnRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MTdjMDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUFueUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci0KLXB1YmxpYyBjbGFzcyBOYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIgZXh0ZW5kcyBDb250ZW50QnVpbGRlcgotICB7ICAgICAgCi0gICAgcHJvdGVjdGVkIGludCBjb3VudCA9IDE7ICAgCi0gICAgcHVibGljIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBwcm90ZWN0ZWQgSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOyAgIAotCi0gICAgcHVibGljIE5hbWVzcGFjZUluZm9Db250ZW50QnVpbGRlcigpCi0gICAgewotICAgICAgc3VwZXIoKTsKLSAgICB9Ci0gICAKLSAgICBwdWJsaWMgdm9pZCB2aXNpdENNRWxlbWVudERlY2xhcmF0aW9uKENNRWxlbWVudERlY2xhcmF0aW9uIGVkKQotICAgIHsgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICBpZiAoZWQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uSW5mbyIpICE9IG51bGwpIC8vJE5PTi1OTFMtMSQKLSAgICAgIHsKLSAgICAgICAgc3VwZXIudmlzaXRDTUVsZW1lbnREZWNsYXJhdGlvbihlZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY3JlYXRlQW55RWxlbWVudE5vZGUoQ01BbnlFbGVtZW50IGFueUVsZW1lbnQpCi0gICAgewotICAgICAgU3RyaW5nIHVyaSA9IGFueUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICBpZiAodXJpICE9IG51bGwgJiYgIXVyaS5zdGFydHNXaXRoKCIjIyIpKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIGlmICh0YWJsZS5nZXQodXJpKSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICAgICAgICBpbmZvLnVyaSA9IHVyaTsgICAgIAotICAgICAgICAgIGluZm8ucHJlZml4ID0gInAiICsgY291bnQrKzsgLy8kTk9OLU5MUy0xJAotICAgICAgICAgIHRhYmxlLnB1dCh1cmksIGluZm8pOyAKLSAgICAgICAgICBsaXN0LmFkZChpbmZvKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAKLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdNb2RlbFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdNb2RlbFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGRlMDU0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3TW9kZWxXaXphcmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklDb250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5jb250ZW50LklDb250ZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2l6YXJkLldpemFyZFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRmlsZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JTmV3V2l6YXJkOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2g7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5XaXphcmROZXdGaWxlQ3JlYXRpb25QYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotCi1wdWJsaWMgY2xhc3MgTmV3TW9kZWxXaXphcmQgZXh0ZW5kcyBXaXphcmQgaW1wbGVtZW50cyBJTmV3V2l6YXJkCi17Ci0gIAotICBwcm90ZWN0ZWQgSVN0cnVjdHVyZWRTZWxlY3Rpb24gZlNlbGVjdGlvbjsKLSAgcHJvdGVjdGVkIElXb3JrYmVuY2ggZldvcmtiZW5jaDsKLSAgcHJvdGVjdGVkIFN0cmluZyBmQ3VycmVudERpcmVjdG9yeTsKLQotICBwdWJsaWMgTmV3TW9kZWxXaXphcmQoKQotICB7Ci0JICBzdXBlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgaW5pdChJV29ya2JlbmNoIHdvcmtiZW5jaCwgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uKQotICB7Ci0gICAgdGhpcy5mV29ya2JlbmNoID0gd29ya2JlbmNoOwotICAgIHRoaXMuZlNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgIFdpemFyZFBhZ2UgY3VycmVudFBhZ2UgPSAoV2l6YXJkUGFnZSlnZXRDb250YWluZXIoKS5nZXRDdXJyZW50UGFnZSgpOwotICAgIGlmIChjdXJyZW50UGFnZSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJlc3VsdCA9IGN1cnJlbnRQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogc2hvd0ZpbGVEaWFsb2cKLSAgICovCi0gIHB1YmxpYyBGaWxlRGlhbG9nIHNob3dGaWxlRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgZGVmYXVsdERpcmVjdG9yeSwgU3RyaW5nIGRlZmF1bHRGaWxlLCBTdHJpbmcgW10gZmlsdGVyRXh0ZW5zaW9ucykKLSAgewotICAgIEZpbGVEaWFsb2cgZmlsZURpYWxvZyA9IG5ldyBGaWxlRGlhbG9nKHNoZWxsLCBTV1QuT1BFTik7Ci0KLSAgICAvLyBHZXQgdGhlIGxhc3QgdmlzaXQgZGlyZWN0b3J5IGlmIHdlIGhhdmVuJ3QgZGVmaW5lZCBhIHBhcnRpY3VsYXIgb25lIGhlcmUuCi0gICAgaWYgKGRlZmF1bHREaXJlY3RvcnkgPT0gbnVsbCB8fCBkZWZhdWx0RGlyZWN0b3J5Lmxlbmd0aCgpID09IDApCi0gICAgewotICAgICAgLy9kZWZhdWx0RGlyZWN0b3J5ID0gTG9jYXRlLmluc3RhbmNlKHRoaXMpLmdldExhc3RTZWxlY3RlZERpcmVjdG9yeShnZXRSZXNvdXJjZVBhdGgoKSk7Ci0gICAgfQotCi0gICAgaWYgKGRlZmF1bHREaXJlY3RvcnkgIT0gbnVsbCAmJiBkZWZhdWx0RGlyZWN0b3J5Lmxlbmd0aCgpICE9IDApCi0gICAgewotICAgICAgZmlsZURpYWxvZy5zZXRGaWx0ZXJQYXRoKGRlZmF1bHREaXJlY3RvcnkpOwotICAgIH0KLQotICAgIGZpbGVEaWFsb2cuc2V0RmlsZU5hbWUoZGVmYXVsdEZpbGUpOwotICAgIGZpbGVEaWFsb2cuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQotICAgIGZpbGVEaWFsb2cub3BlbigpOwotCi0gICAgcmV0dXJuIGZpbGVEaWFsb2c7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHNldEN1cnJlbnREaXJlY3RvcnkoU3RyaW5nIGN1cnJlbnREaXJlY3RvcnkxKQotICB7Ci0gICAgdGhpcy5mQ3VycmVudERpcmVjdG9yeSA9IGN1cnJlbnREaXJlY3RvcnkxOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBjcmVhdGVXb3JrYmVuY2hSZXNvdXJjZShJQ29udGFpbmVyIGNvbnRhaW5lciwgU3RyaW5nIGZpbGVOYW1lKQotICB7Ci0gICAgSVBhdGggcGF0aCA9IGNvbnRhaW5lci5nZXRGdWxsUGF0aCgpOwotICAgIHBhdGggPSBwYXRoLmFwcGVuZChmaWxlTmFtZSk7Ci0gICAgSUZpbGUgZmlsZSA9IGNvbnRhaW5lci5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZ2V0RmlsZShwYXRoKTsKLSAgICBpZiAoIWZpbGUuZXhpc3RzKCkpCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGZpbGUuY3JlYXRlKG51bGwsIHRydWUsIG51bGwpOwotICAgICAgfQotICAgICAgY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9YTUxCdWlsZGVyUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKCJFbmNvdW50ZXJlZCBleGNlcHRpb24gY3JlYXRpbmcgZmlsZTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU3RhcnRQYWdlCi0gICAqLwotICBwdWJsaWMgY2xhc3MgU3RhcnRQYWdlIGV4dGVuZHMgV2l6YXJkUGFnZSBpbXBsZW1lbnRzIExpc3RlbmVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgaW50IHNlbGVjdGVkQnV0dG9uOwotICAgIHByb3RlY3RlZCBTdHJpbmdbXSByYWRpb0J1dHRvbkxhYmVsOwotICAgIHByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbjsKLQotICAgIHB1YmxpYyBTdGFydFBhZ2UoU3RyaW5nIHBhZ2VOYW1lLCBTdHJpbmdbXSByYWRpb0J1dHRvbkxhYmVsKQotICAgIHsKLSAgICAgIHN1cGVyKHBhZ2VOYW1lKTsKLSAgICAgIHRoaXMucmFkaW9CdXR0b25MYWJlbCA9IHJhZGlvQnV0dG9uTGFiZWw7Ci0gICAgICByYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bcmFkaW9CdXR0b25MYWJlbC5sZW5ndGhdOwotICAgIH0KLQotICAgIHB1YmxpYyBCdXR0b24gZ2V0UmFkaW9CdXR0b25BdEluZGV4KGludCBpKQotICAgIHsKLSAgICAgIEJ1dHRvbiByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKGkgPj0gMCAmJiBpIDwgcmFkaW9CdXR0b24ubGVuZ3RoKQotICAgICAgewotICAgICAgICByZXN1bHQgPSByYWRpb0J1dHRvbltpXTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRTZWxlY3RlZFJhZGlvQnV0dG9uSW5kZXgoKQotICAgIHsKLSAgICAgIGludCByZXN1bHQgPSAtMTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmFkaW9CdXR0b24ubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChyYWRpb0J1dHRvbltpXS5nZXRTZWxlY3Rpb24oKSkKLSAgICAgICAgewotICAgICAgICAgIHJlc3VsdCA9IGk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQ29udHJvbChDb21wb3NpdGUgcGFyZW50KQotICAgIHsKLSAgICAgIENvbXBvc2l0ZSBiYXNlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLSAgICAgIGJhc2Uuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0gICAgICAvL3JhZGlvIGJ1dHRvbnMnIGNvbnRhaW5lcgkKLSAgICAgIENvbXBvc2l0ZSByYWRpb0J1dHRvbnNHcm91cCA9IG5ldyBDb21wb3NpdGUoYmFzZSwgU1dULk5PTkUpOwotICAgICAgR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotICAgICAgbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotICAgICAgbGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0gICAgICBsYXlvdXQubWFyZ2luV2lkdGggPSAwOyAgICAgICAgICAgICAgICAKLQotICAgICAgcmFkaW9CdXR0b25zR3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0gICAgICBHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotICAgICAgZ2QuaGVpZ2h0SGludCA9IDMwMDsKLSAgICAgIGdkLndpZHRoSGludCA9IDQwMDsKLSAgICAgIHJhZGlvQnV0dG9uc0dyb3VwLnNldExheW91dERhdGEoZ2QpOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJhZGlvQnV0dG9uTGFiZWwubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHJhZGlvQnV0dG9uW2ldID0gbmV3IEJ1dHRvbihyYWRpb0J1dHRvbnNHcm91cCwgU1dULlJBRElPKTsKLSAgICAgICAgcmFkaW9CdXR0b25baV0uc2V0VGV4dChyYWRpb0J1dHRvbkxhYmVsW2ldKTsKLSAgICAgICAgcmFkaW9CdXR0b25baV0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0gICAgICAgIC8vcmFkaW9CdXR0b25baV0uYWRkTGlzdGVuZXIoU1dULk1vZGlmeSwgdGhpcyk7Ci0gICAgICB9Ci0gICAgICBzZXRDb250cm9sKGJhc2UpOwotICAgICAgc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KQotICAgIHsKLSAgICAgIGlmIChldmVudC50eXBlID09IFNXVC5Nb2RpZnkpCi0gICAgICB7Ci0gICAgICAgIHNldFBhZ2VDb21wbGV0ZShpc1BhZ2VDb21wbGV0ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiAgTmV3RmlsZVBhZ2UKLSAgICovCi0gIHB1YmxpYyBjbGFzcyBOZXdGaWxlUGFnZSBleHRlbmRzIFdpemFyZE5ld0ZpbGVDcmVhdGlvblBhZ2UKLSAgewotICAgIHB1YmxpYyBTdHJpbmcgZGVmYXVsdE5hbWUgPSAiTmV3RmlsZSI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgU3RyaW5nIGRlZmF1bHRGaWxlRXh0ZW5zaW9uID0gIi50eHQiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIFN0cmluZ1tdIGZpbHRlckV4dGVuc2lvbnMgPSB7ICIqLnR4dCJ9OyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBMaXN0IGZWYWxpZEV4dGVuc2lvbnMgPSBudWxsOwotCi0gICAgcHVibGljIE5ld0ZpbGVQYWdlKElTdHJ1Y3R1cmVkU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBzdXBlcigiIiwgc2VsZWN0aW9uKTsgLy8kTk9OLU5MUy0xJAotICAgIH0KLQotICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZURlZmF1bHRGaWxlTmFtZSgpCi0gICAgewotICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGRlZmF1bHROYW1lICsgZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0gICAgICBJUGF0aCBjb250YWluZXJGdWxsUGF0aCA9IGdldENvbnRhaW5lckZ1bGxQYXRoKCk7Ci0gICAgICBpZiAoY29udGFpbmVyRnVsbFBhdGggIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICBJUGF0aCBwYXRoID0gY29udGFpbmVyRnVsbFBhdGguYXBwZW5kKGZpbGVOYW1lKTsKLSAgICAgICAgICBpZiAoUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5leGlzdHMocGF0aCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIGZpbGVOYW1lID0gZGVmYXVsdE5hbWUgKyBjb3VudCArIGRlZmF1bHRGaWxlRXh0ZW5zaW9uOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmlsZU5hbWU7Ci0gICAgfQotCi0gICAgLy8gcmV0dXJucyB0cnVlIGlmIGZpbGUgb2Ygc3BlY2lmaWVkIG5hbWUgZXhpc3RzIGluIGFueSBjYXNlIGZvciBzZWxlY3RlZCBjb250YWluZXIKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGV4aXN0c0ZpbGVBbnlDYXNlKFN0cmluZyBmaWxlTmFtZSkKLSAgICB7Ci0gICAgICBpZiAoIChnZXRDb250YWluZXJGdWxsUGF0aCgpICE9IG51bGwpICYmIChnZXRDb250YWluZXJGdWxsUGF0aCgpLmlzRW1wdHkoKSA9PSBmYWxzZSkKLSAgICAgICAgICAgICYmIChmaWxlTmFtZS5jb21wYXJlVG8oIiIpICE9IDApKSAvLyROT04tTkxTLTEkCi0gICAgICB7Ci0gICAgICAgIC8vbG9vayB0aHJvdWdoIGFsbCByZXNvdXJjZXMgYXQgdGhlIHNwZWNpZmllZCBjb250YWluZXIgLSBjb21wYXJlIGluIHVwcGVyIGNhc2UKLSAgICAgICAgSVJlc291cmNlIHBhcmVudCA9IFJlc291cmNlc1BsdWdpbi5nZXRXb3Jrc3BhY2UoKS5nZXRSb290KCkuZmluZE1lbWJlcihnZXRDb250YWluZXJGdWxsUGF0aCgpKTsKLSAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIElDb250YWluZXIpCi0gICAgICAgIHsKLSAgICAgICAgICBJQ29udGFpbmVyIGNvbnRhaW5lciA9IChJQ29udGFpbmVyKSBwYXJlbnQ7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgSVJlc291cmNlW10gbWVtYmVycyA9IGNvbnRhaW5lci5tZW1iZXJzKCk7Ci0gICAgICAgICAgICBTdHJpbmcgZW50ZXJlZEZpbGVVcHBlciA9IGZpbGVOYW1lLnRvVXBwZXJDYXNlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpPTA7IGk8bWVtYmVycy5sZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHJlc291cmNlVXBwZXJOYW1lID0gbWVtYmVyc1tpXS5nZXROYW1lKCkudG9VcHBlckNhc2UoKTsKLSAgICAgICAgICAgICAgaWYgKHJlc291cmNlVXBwZXJOYW1lLmVxdWFscyhlbnRlcmVkRmlsZVVwcGVyKSkKLSAgICAgICAgICAgICAgeyAgCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1lbWJlcnNbaV0uZ2V0TmFtZSgpOyAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoQ29yZUV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmFsaWRhdGVQYWdlKCkgewotCQlTdHJpbmcgZnVsbEZpbGVOYW1lID0gZ2V0RmlsZU5hbWUoKTsKLQkJaWYgKCFleHRlbnNpb25WYWxpZEZvckNvbnRlbnRUeXBlKGZ1bGxGaWxlTmFtZSkpIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxXaXphcmRzTWVzc2FnZXMuX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04sIGdldFZhbGlkRXh0ZW5zaW9ucygpLnRvU3RyaW5nKCkpKTsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBubyBmaWxlRXh0ZW5zaW9uLCBsZXQncyBjaGVjayBmb3IgdGhpcyBmaWxlIHdpdGggZGVmYXVsdCBmaWxlIGV4dGVuc2lvbgotCQlmdWxsRmlsZU5hbWUgKz0gZGVmYXVsdEZpbGVFeHRlbnNpb247Ci0JCWlmICgoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSAmJiAoZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS5pc0VtcHR5KCkgPT0gZmFsc2UpICYmIChnZXRGaWxlTmFtZSgpLmNvbXBhcmVUbygiIikgIT0gMCkpIC8vJE5PTi1OTFMtMSQKLQkJewotCQkJUGF0aCBmdWxsUGF0aCA9IG5ldyBQYXRoKGdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICcvJyArIGZ1bGxGaWxlTmFtZSk7Ci0JCQlJUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRNZW1iZXIoZnVsbFBhdGgpOwotCQkJaWYgKHJlc291cmNlICE9IG51bGwpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UoWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTKTsKLQkJCQlyZXR1cm4gZmFsc2U7Ci0JCQl9Ci0JCX0KLQotCQkvLyBjaGVjayBmb3IgZmlsZSBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZQotCQlTdHJpbmcgc2FtZU5hbWUgPSBleGlzdHNGaWxlQW55Q2FzZShmdWxsRmlsZU5hbWUpOwotCQlpZiAoc2FtZU5hbWUgIT0gbnVsbCkgewotCQkJLy9JU1NVRTogaXMgcXVhbGl0aWZlZEZpbGVOYW1lIG5vdCBuZWVkZWQsIG9yIGlzIGl0IHN1cHBvc2VkIHRvIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZT8KLQkJCS8vU3RyaW5nIHF1YWxpZmllZEZpbGVOYW1lID0gZ2V0Q29udGFpbmVyRnVsbFBhdGgoKS50b1N0cmluZygpICsgJy8nICsgZnVsbEZpbGVOYW1lOwotCQkJc2V0RXJyb3JNZXNzYWdlKFhNTFdpemFyZHNNZXNzYWdlcy5fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyArICIgIiArIHNhbWVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcmV0dXJuIHN1cGVyLnZhbGlkYXRlUGFnZSgpOwotCX0KLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkKLSAgICB7Ci0gICAgICAvLyBpbmhlcml0IGRlZmF1bHQgY29udGFpbmVyIGFuZCBuYW1lIHNwZWNpZmljYXRpb24gd2lkZ2V0cwotICAgICAgc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotICAgICAgdGhpcy5zZXRGaWxlTmFtZShjb21wdXRlRGVmYXVsdEZpbGVOYW1lKCkpOwotICAgICAgc2V0UGFnZUNvbXBsZXRlKHZhbGlkYXRlUGFnZSgpKTsKLSAgICB9Ci0JCi0JLyoqCi0JICogR2V0IGxpc3Qgb2YgdmFsaWQgZXh0ZW5zaW9ucyBmb3IgWE1MIENvbnRlbnQgdHlwZQotCSAqIAotCSAqIEByZXR1cm4gTGlzdAotCSAqLwotCUxpc3QgZ2V0VmFsaWRFeHRlbnNpb25zKCkgewotCQlpZiAoZlZhbGlkRXh0ZW5zaW9ucyA9PSBudWxsKSB7Ci0JCQlJQ29udGVudFR5cGUgdHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmdldENvbnRlbnRUeXBlKENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0JCi0JLyoqCi0JICogVmVyaWZpZXMgaWYgZmlsZU5hbWUgaXMgdmFsaWQgbmFtZSBmb3IgY29udGVudCB0eXBlLiBUYWtlcyBiYXNlIGNvbnRlbnQKLQkgKiB0eXBlIGludG8gY29uc2lkZXJhdGlvbi4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZU5hbWUKLQkgKiBAcmV0dXJuIHRydWUgaWYgZXh0ZW5zaW9uIGlzIHZhbGlkIGZvciB0aGlzIGNvbnRlbnQgdHlwZQotCSAqLwotCWJvb2xlYW4gZXh0ZW5zaW9uVmFsaWRGb3JDb250ZW50VHlwZShTdHJpbmcgZmlsZU5hbWUpIHsKLQkJYm9vbGVhbiB2YWxpZCA9IGZhbHNlOwotCi0JCUlDb250ZW50VHlwZSB0eXBlID0gUGxhdGZvcm0uZ2V0Q29udGVudFR5cGVNYW5hZ2VyKCkuZ2V0Q29udGVudFR5cGUoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCk7Ci0JCS8vIHRoZXJlIGlzIGN1cnJlbnRseSBhbiBleHRlbnNpb24KLQkJaWYgKGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJykgIT0gLTEpIHsKLQkJCS8vIGNoZWNrIHdoYXQgY29udGVudCB0eXBlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgZXh0ZW5zaW9uCi0JCQlJQ29udGVudFR5cGVbXSB0eXBlcyA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZXNGb3IoZmlsZU5hbWUpOwotCQkJaW50IGkgPSAwOwotCQkJd2hpbGUgKGkgPCB0eXBlcy5sZW5ndGggJiYgIXZhbGlkKSB7Ci0JCQkJdmFsaWQgPSB0eXBlc1tpXS5pc0tpbmRPZih0eXBlKTsKLQkJCQkrK2k7Ci0JCQl9Ci0JCX0KLQkJZWxzZQotCQkJdmFsaWQgPSB0cnVlOyAvLyBubyBleHRlbnNpb24gc28gdmFsaWQKLQkJcmV0dXJuIHZhbGlkOwotCX0KLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTEdlbmVyYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVmMjlmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTEdlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC53aXphcmRzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNvbnRlbnRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01Db250ZW50QnVpbGRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTVdyaXRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgTmV3WE1MR2VuZXJhdG9yIHsKLQotCXByb3RlY3RlZCBTdHJpbmcgZ3JhbW1hclVSSTsKLQlwcm90ZWN0ZWQgQ01Eb2N1bWVudCBjbURvY3VtZW50OwotCXByb3RlY3RlZCBpbnQgYnVpbGRQb2xpY3k7Ci0JcHJvdGVjdGVkIFN0cmluZyByb290RWxlbWVudE5hbWU7Ci0KLQlwcm90ZWN0ZWQgSUNhdGFsb2dFbnRyeSB4bWxDYXRhbG9nRW50cnk7Ci0KLQkvLyBpbmZvIGZvciBkdGQKLQlwcm90ZWN0ZWQgU3RyaW5nIHB1YmxpY0lkOwotCXByb3RlY3RlZCBTdHJpbmcgc3lzdGVtSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBkZWZhdWx0U3lzdGVtSWQ7Ci0KLQkvLyBpbmZvIGZvciB4c2QKLQlwdWJsaWMgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQotCXB1YmxpYyBOZXdYTUxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIE5ld1hNTEdlbmVyYXRvcihTdHJpbmcgZ3JhbW1hclVSSSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCXRoaXMuZ3JhbW1hclVSSSA9IGdyYW1tYXJVUkk7Ci0JCXRoaXMuY21Eb2N1bWVudCA9IGNtRG9jdW1lbnQ7Ci0JfQotCi0KLQlwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpLCBTdHJpbmdbXSBlcnJvckluZm8pIHsKLQkJU3RyaW5nIHRpdGxlID0gbnVsbDsKLQkJU3RyaW5nIG1lc3NhZ2UgPSBudWxsOwotCQlMaXN0IGVycm9yTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gbnVsbDsKLQotCQlpZiAoVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCB0cnVlKSkgewotCQkgICAgLy8gKGNzKSBhc3N1bWUgdGhlIHVyaSBoYXMgYmVlbiBwcm92aWRlZCBpbiBhIG5vcm1hbGl6ZWQgZm9ybQotCQkJY21Eb2N1bWVudCA9IENvbnRlbnRNb2RlbE1hbmFnZXIuZ2V0SW5zdGFuY2UoKS5jcmVhdGVDTURvY3VtZW50KHVyaSwgbnVsbCk7Ci0KLQkJCWlmICh1cmkuZW5kc1dpdGgoIi5kdGQiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGVycm9yTGlzdC5zaXplKCkgPiAwKSB7Ci0JCQkJCXRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9JTlZBTElEX0dSQU1NQVJfRVJST1I7Ci0JCQkJCW1lc3NhZ2UgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX0VSUk9SX0RURF9JTlZBTElEX0lORk87Ci0JCQkJfQotCQkJfQotCQkJZWxzZSAvLyAiLnhzZCIKLQkJCXsKLQkJCQkvLyBUbyBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHNjaGVtYSBlZGl0b3IgdmFsaWRhdGlvbgotCQkJCVhNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyIHZhbGlkYXRvciA9IG5ldyBYTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlcigpOwotCQkJCWlmICghdmFsaWRhdG9yLmlzVmFsaWQodXJpKSkgewotCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCQkJCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPOwotCQkJCX0KLQkJCQllbHNlIGlmIChjbURvY3VtZW50ICE9IG51bGwpIHsKLQkJCQkJaW50IGdsb2JhbEVsZW1lbnRDb3VudCA9IGNtRG9jdW1lbnQuZ2V0RWxlbWVudHMoKS5nZXRMZW5ndGgoKTsKLQkJCQkJaWYgKGdsb2JhbEVsZW1lbnRDb3VudCA9PSAwKSB7Ci0JCQkJCQl0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19USVRMRV9OT19ST09UX0VMRU1FTlRTOwotCQkJCQkJbWVzc2FnZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fUk9PVF9FTEVNRU5UUzsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXRpdGxlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX1RJVExFX05PX1JPT1RfRUxFTUVOVFM7Ci0JCQltZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gKyAiICIgKyB1cmk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQllcnJvckluZm9bMF0gPSB0aXRsZTsKLQkJZXJyb3JJbmZvWzFdID0gbWVzc2FnZTsKLQotCQlyZXR1cm4gY21Eb2N1bWVudDsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZUVtcHR5WE1MRG9jdW1lbnQoSUZpbGUgbmV3RmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0JCVN0cmluZyBjaGFyU2V0ID0gZ2V0VXNlclByZWZlcnJlZENoYXJzZXQoKTsKLQotCQlQcmludFdyaXRlciB3cml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJTZXQpKTsKLQkJd3JpdGVyLnByaW50bG4oIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIiIgKyBjaGFyU2V0ICsgIlwiPz4iKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXdyaXRlci5mbHVzaCgpOwotCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQotCQlCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7Ci0JCW5ld0ZpbGUuc2V0Q29udGVudHMoaW5wdXRTdHJlYW0sIHRydWUsIHRydWUsIG51bGwpOwotCQlpbnB1dFN0cmVhbS5jbG9zZSgpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFVzZXJQcmVmZXJyZWRDaGFyc2V0KCkgewotCQlQcmVmZXJlbmNlcyBwcmVmZXJlbmNlID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJU3RyaW5nIGNoYXJTZXQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCk7Ci0JCXJldHVybiBjaGFyU2V0OwotCX0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVhNTERvY3VtZW50KFN0cmluZyB4bWxGaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCUlDb250ZW50VHlwZSBjb250ZW50VHlwZSA9IFBsYXRmb3JtLmdldENvbnRlbnRUeXBlTWFuYWdlcigpLmZpbmRDb250ZW50VHlwZUZvcih4bWxGaWxlTmFtZSk7Ci0JCVN0cmluZyBjaGFyc2V0ID0gbnVsbDsKLQkJaWYgKGNvbnRlbnRUeXBlICE9IG51bGwpIHsKLQkJCWNoYXJzZXQgPSBjb250ZW50VHlwZS5nZXREZWZhdWx0Q2hhcnNldCgpOwotCQl9Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjcmVhdGVYTUxEb2N1bWVudCh4bWxGaWxlTmFtZSwgY2hhcnNldCk7Ci0KLQkJRmlsZSBmaWxlID0gbmV3IEZpbGUoeG1sRmlsZU5hbWUpOwotCQlGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOwotCQlvdXRwdXRTdHJlYW0ud3JpdGVUbyhmb3MpOwotCQlmb3MuY2xvc2UoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNyZWF0ZVhNTERvY3VtZW50KElGaWxlIG5ld0ZpbGUsIFN0cmluZyB4bWxGaWxlTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCVN0cmluZyBjaGFyc2V0ID0gbmV3RmlsZS5nZXRDaGFyc2V0KCk7Ci0JCUJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjcmVhdGVYTUxEb2N1bWVudCh4bWxGaWxlTmFtZSwgY2hhcnNldCk7Ci0KLQkJQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotCQluZXdGaWxlLnNldENvbnRlbnRzKGlucHV0U3RyZWFtLCB0cnVlLCB0cnVlLCBudWxsKTsKLQkJaW5wdXRTdHJlYW0uY2xvc2UoKTsKLQl9Ci0KLQotCXB1YmxpYyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY3JlYXRlWE1MRG9jdW1lbnQoU3RyaW5nIHhtbEZpbGVOYW1lLCBTdHJpbmcgY2hhcnNldCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCWlmIChjaGFyc2V0ID09IG51bGwpIHsKLQkJCWNoYXJzZXQgPSBnZXRVc2VyUHJlZmVycmVkQ2hhcnNldCgpOwotCQkJaWYgKGNoYXJzZXQgPT0gbnVsbCkgewotCQkJCWNoYXJzZXQgPSAiVVRGLTgiOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudCgpOwotCi0JCUFzc2VydC5pc05vdE51bGwoY21Eb2N1bWVudCk7Ci0JCUFzc2VydC5pc05vdE51bGwoZ2V0Um9vdEVsZW1lbnROYW1lKCkpOwotCi0JCS8vIGNyZWF0ZSB0aGUgeG1sIG1vZGVsCi0JCUNNTmFtZWROb2RlTWFwIG5hbWVOb2RlTWFwID0gY21Eb2N1bWVudC5nZXRFbGVtZW50cygpOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbmFtZU5vZGVNYXAuZ2V0TmFtZWRJdGVtKGdldFJvb3RFbGVtZW50TmFtZSgpKTsKLQotCQlEb2N1bWVudCB4bWxEb2N1bWVudCA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOwotCQlET01Db250ZW50QnVpbGRlckltcGwgY29udGVudEJ1aWxkZXIgPSBuZXcgRE9NQ29udGVudEJ1aWxkZXJJbXBsKHhtbERvY3VtZW50KTsKLSAgICAgICAgCi0gICAgICAgIC8vIHRoaXMgJ3VnbHlUZW1wSGFjaycgZmxhZyBpcyByZXF1aXJlZCBpbiBvcmRlciB0byBzdXByZXNzIHRoZSBjcmVhdGlvbiBhIGRlZmF1bHQgZW5jb2RpbmcgCi0gICAgICAgIC8vIHdlJ2xsIGhhbmRsZSB0aGlzIGxhdGVyIGluIHRoZSBkb21Xcml0ZXIucHJpbnQoKSBtZXRob2QgdXNlZCBiZWxvdwotICAgICAgICAvLwotICAgICAgICBjb250ZW50QnVpbGRlci5zdXByZXNzQ3JlYXRpb25PZkRvY3R5cGVBbmRYTUxEZWNsYXJhdGlvbiA9IHRydWU7Ci0JCWNvbnRlbnRCdWlsZGVyLnNldEJ1aWxkUG9saWN5KGJ1aWxkUG9saWN5KTsKLQkJY29udGVudEJ1aWxkZXIuc2V0RXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydChuZXcgTXlFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KG5hbWVzcGFjZUluZm9MaXN0LCB4bWxGaWxlTmFtZSkpOwotCQljb250ZW50QnVpbGRlci5jcmVhdGVEZWZhdWx0Um9vdENvbnRlbnQoY21Eb2N1bWVudCwgY21FbGVtZW50RGVjbGFyYXRpb24sIG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQlCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCQlPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXRwdXRTdHJlYW0sIGNoYXJzZXQpOwotICAgICAgICAgICAgCi0JCURPTVdyaXRlciBkb21Xcml0ZXIgPSBuZXcgRE9NV3JpdGVyKG91dHB1dFN0cmVhbVdyaXRlcik7Ci0gICAgICAgIAotICAgICAgICAvLyBUT0RPLi4uIGluc3RlYWQgb2YgcmVseWluZyBvbiBmaWxlIGV4dGVuc2lvbnMsIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiB0aGUgZ3JhbW1hciB0eXBlCi0gICAgICAgIC8vIGJldHRlciB5ZXQgd2Ugc2hvdWxkIHJlYXRlIGFuIFNTRSBkb2N1bWVudCBzbyB0aGF0IHdlIGNhbiBmb3JtYXQgaXQgbmljZWx5IGJlZm9yZSBzYXZpbmcKLSAgICAgICAgLy8gdGhlbiB3ZSB3b24ndCBuZWVkIHRoZSBET01Xcml0ZXIgYXQgYWxsCi0gICAgICAgIC8vCi0JCWRvbVdyaXRlci5wcmludCh4bWxEb2N1bWVudCwgY2hhcnNldCwgY21Eb2N1bWVudC5nZXROb2RlTmFtZSgpLCBnZXROb25XaGl0ZXNwYWNlU3RyaW5nKGdldFB1YmxpY0lkKCkpLCBnZXROb25XaGl0ZXNwYWNlU3RyaW5nKGdldFN5c3RlbUlkKCkpKTsgCi0JCW91dHB1dFN0cmVhbS5mbHVzaCgpOwotCQlvdXRwdXRTdHJlYW0uY2xvc2UoKTsKLQotCQlyZXR1cm4gb3V0cHV0U3RyZWFtOwotCX0KLQotCi0JcHVibGljIHZvaWQgY3JlYXRlTmFtZXNwYWNlSW5mb0xpc3QoKSB7Ci0JCUxpc3QgcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCSAgICBpZiAoY21Eb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlyZXN1bHQgPSAoTGlzdCkgY21Eb2N1bWVudC5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25hbWVzcGFjZUluZm8iKTsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0JCQkJaW50IHNpemUgPSByZXN1bHQuc2l6ZSgpOwotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSByZXN1bHQuZ2V0KGkpOwotCQkJCQlpZiAoaSA9PSAwKSB7Ci0JCQkJCQlTdHJpbmcgbG9jYXRpb25JbmZvID0gbnVsbDsKLQkJCQkJCWlmICh4bWxDYXRhbG9nRW50cnkgIT0gbnVsbCkgewotCQkJCQkJCWlmICh4bWxDYXRhbG9nRW50cnkuZ2V0RW50cnlUeXBlKCkgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQykgewotCQkJCQkJCQlsb2NhdGlvbkluZm8gPSB4bWxDYXRhbG9nRW50cnkuZ2V0QXR0cmlidXRlVmFsdWUoSUNhdGFsb2dFbnRyeS5BVFRSX1dFQl9VUkwpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJbG9jYXRpb25JbmZvID0geG1sQ2F0YWxvZ0VudHJ5LmdldEtleSgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCWlmIChsb2NhdGlvbkluZm8gPT0gbnVsbCkgewotCQkJCQkJCWxvY2F0aW9uSW5mbyA9IGRlZmF1bHRTeXN0ZW1JZDsKLQkJCQkJCX0KLQkJCQkJCWluZm8ubG9jYXRpb25IaW50ID0gbG9jYXRpb25JbmZvOwotCQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgibG9jYXRpb25IaW50LXJlYWRPbmx5IiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCX0KLQkJCQkJaW5mby5zZXRQcm9wZXJ0eSgidXJpLXJlYWRPbmx5IiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWluZm8uc2V0UHJvcGVydHkoInVucmVtb3ZhYmxlIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJfQotCQkJfQotCi0JCQlOYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBOYW1lc3BhY2VJbmZvQ29udGVudEJ1aWxkZXIoKTsKLQkJCWJ1aWxkZXIuc2V0QnVpbGRQb2xpY3koQ29udGVudEJ1aWxkZXIuQlVJTERfT05MWV9SRVFVSVJFRF9DT05URU5UKTsKLQkJCWJ1aWxkZXIudmlzaXRDTU5vZGUoY21Eb2N1bWVudCk7Ci0JCQlyZXN1bHQuYWRkQWxsKGJ1aWxkZXIubGlzdCk7Ci0JCX0KLQkJbmFtZXNwYWNlSW5mb0xpc3QgPSByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgYm9vbGVhbiBpc01pc3NpbmdOYW1lc3BhY2VMb2NhdGlvbigpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5sb2NhdGlvbkhpbnQgPT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXROYW1lc3BhY2VJbmZvRXJyb3JzKCkgewotCQlTdHJpbmdbXSBlcnJvckxpc3QgPSBudWxsOwotCi0JCWlmIChuYW1lc3BhY2VJbmZvTGlzdCAhPSBudWxsICYmIGlzTWlzc2luZ05hbWVzcGFjZUxvY2F0aW9uKCkpIHsKLQkJCVN0cmluZyB0aXRsZSA9IFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfTk9fTE9DQVRJT05fSElOVDsKLQkJCVN0cmluZyBtZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzEgKyAiICIgKyBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMiArICJcblxuIiArIFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8zOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJZXJyb3JMaXN0ID0gbmV3IFN0cmluZ1syXTsKLQkJCWVycm9yTGlzdFswXSA9IHRpdGxlOwotCQkJZXJyb3JMaXN0WzFdID0gbWVzc2FnZTsKLQkJfQotCi0JCXJldHVybiBlcnJvckxpc3Q7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRYTUxDYXRhbG9nRW50cnkoSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkpIHsKLQkJeG1sQ2F0YWxvZ0VudHJ5ID0gY2F0YWxvZ0VudHJ5OwotCX0KLQotCXB1YmxpYyBJQ2F0YWxvZ0VudHJ5IGdldFhNTENhdGFsb2dFbnRyeSgpIHsKLQkJcmV0dXJuIHhtbENhdGFsb2dFbnRyeTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldEJ1aWxkUG9saWN5KGludCBwb2xpY3kpIHsKLQkJYnVpbGRQb2xpY3kgPSBwb2xpY3k7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXREZWZhdWx0U3lzdGVtSWQoU3RyaW5nIHN5c0lkKSB7Ci0JCWRlZmF1bHRTeXN0ZW1JZCA9IHN5c0lkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN5c3RlbUlkKCkgewotCQlyZXR1cm4gZGVmYXVsdFN5c3RlbUlkOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldFN5c3RlbUlkKFN0cmluZyBzeXNJZCkgewotCQlzeXN0ZW1JZCA9IHN5c0lkOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBzeXN0ZW1JZDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRQdWJsaWNJZChTdHJpbmcgcHViSWQpIHsKLQkJcHVibGljSWQgPSBwdWJJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFB1YmxpY0lkKCkgewotCQlyZXR1cm4gcHVibGljSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0R3JhbW1hclVSSShTdHJpbmcgZ3JhbVVSSSkgewotCQlncmFtbWFyVVJJID0gZ3JhbVVSSTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEdyYW1tYXJVUkkoKSB7Ci0JCXJldHVybiBncmFtbWFyVVJJOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldENNRG9jdW1lbnQoQ01Eb2N1bWVudCBjbURvYykgewotCQljbURvY3VtZW50ID0gY21Eb2M7Ci0JfQotCi0JcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpIHsKLQkJcmV0dXJuIGNtRG9jdW1lbnQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Um9vdEVsZW1lbnROYW1lKFN0cmluZyByb290TmFtZSkgewotCQlyb290RWxlbWVudE5hbWUgPSByb290TmFtZTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJvb3RFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIHJvb3RFbGVtZW50TmFtZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBjbGFzcyBNeUV4dGVybmFsQ01Eb2N1bWVudFN1cHBvcnQgaW1wbGVtZW50cyBET01Db250ZW50QnVpbGRlckltcGwuRXh0ZXJuYWxDTURvY3VtZW50U3VwcG9ydCB7Ci0JCXByb3RlY3RlZCBMaXN0IG5hbWVzcGFjZUluZm9MaXN0MTsKLQkJcHJvdGVjdGVkIFVSSVJlc29sdmVyIGlkUmVzb2x2ZXI7Ci0JCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLQotCQlwcm90ZWN0ZWQgTXlFeHRlcm5hbENNRG9jdW1lbnRTdXBwb3J0KExpc3QgbmFtZXNwYWNlSW5mb0xpc3RQYXJhbSwgU3RyaW5nIHJlc291cmNlTG9jYXRpb24pIHsKLQkJCXRoaXMubmFtZXNwYWNlSW5mb0xpc3QxID0gbmFtZXNwYWNlSW5mb0xpc3RQYXJhbTsKLQkJCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCQlpZFJlc29sdmVyID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKTsKLQkJfQotCi0JCXB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoRWxlbWVudCBlbGVtZW50LCBTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCQlDTURvY3VtZW50IHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAobmFtZXNwYWNlVVJJICE9IG51bGwgJiYgbmFtZXNwYWNlVVJJLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlTdHJpbmcgbG9jYXRpb25IaW50ID0gbnVsbDsKLQkJCQlmb3IgKEl0ZXJhdG9yIGkgPSBuYW1lc3BhY2VJbmZvTGlzdDEuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCQkJaWYgKG5hbWVzcGFjZVVSSS5lcXVhbHMoaW5mby51cmkpKSB7Ci0JCQkJCQlsb2NhdGlvbkhpbnQgPSBpbmZvLmxvY2F0aW9uSGludDsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChsb2NhdGlvbkhpbnQgIT0gbnVsbCkgewotCQkJCQlncmFtbWFyVVJJID0gaWRSZXNvbHZlci5yZXNvbHZlKHJlc291cmNlTG9jYXRpb24sIGxvY2F0aW9uSGludCwgbG9jYXRpb25IaW50KTsKLQkJCQkJcmVzdWx0ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQoZ2V0R3JhbW1hclVSSSgpLCBudWxsKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlyZXN1bHQgPSBjbURvY3VtZW50OwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE5vbldoaXRlc3BhY2VTdHJpbmcoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0cmluZyAhPSBudWxsKSB7Ci0JCQlpZiAoc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCQlyZXN1bHQgPSBzdHJpbmc7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ1N2EzMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuUHJlZmVyZW5jZURpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5KRmFjZVJlc291cmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLlNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVCdWZmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRhYmxlTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlclNvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuQ29udHJvbEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Db250cm9sRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZGlhbG9ncy5QcmVmZXJlbmNlc1V0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTDsKLQotLyoqCi0gKiBUZW1wbGF0ZXMgcGFnZSBpbiBuZXcgZmlsZSB3aXphcmQuIEFsbG93cyB1c2VycyB0byBzZWxlY3QgYSBuZXcgZmlsZQotICogdGVtcGxhdGUgdG8gYmUgYXBwbGllZCBpbiBuZXcgZmlsZS4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCi0JLyoqCi0JICogQ29udGVudCBwcm92aWRlciBmb3IgdGVtcGxhdGVzCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBUZW1wbGF0ZUNvbnRlbnRQcm92aWRlciBpbXBsZW1lbnRzIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJLyoqIFRoZSB0ZW1wbGF0ZSBzdG9yZS4gKi8KLQkJcHJpdmF0ZSBUZW1wbGF0ZVN0b3JlIGZTdG9yZTsKLQotCQkvKgotCQkgKiBAc2VlIElDb250ZW50UHJvdmlkZXIjZGlzcG9zZSgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQkJZlN0b3JlID0gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIjZ2V0RWxlbWVudHMoT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dCkgewotCQkJcmV0dXJuIGZTdG9yZS5nZXRUZW1wbGF0ZXMoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBJQ29udGVudFByb3ZpZGVyI2lucHV0Q2hhbmdlZChWaWV3ZXIsIE9iamVjdCwgT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQlmU3RvcmUgPSAoVGVtcGxhdGVTdG9yZSkgbmV3SW5wdXQ7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMYWJlbCBwcm92aWRlciBmb3IgdGVtcGxhdGVzLgotCSAqLwotCXByaXZhdGUgY2xhc3MgVGVtcGxhdGVMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JVGFibGVMYWJlbFByb3ZpZGVyI2dldENvbHVtbkltYWdlKGphdmEubGFuZy5PYmplY3QsCi0JCSAqICAgICAgaW50KQotCQkgKi8KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBlbGVtZW50LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXIjZ2V0Q29sdW1uVGV4dChqYXZhLmxhbmcuT2JqZWN0LAotCQkgKiAgICAgIGludCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0Q29sdW1uVGV4dChPYmplY3QgZWxlbWVudCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IChUZW1wbGF0ZSkgZWxlbWVudDsKLQotCQkJc3dpdGNoIChjb2x1bW5JbmRleCkgewotCQkJCWNhc2UgMCA6Ci0JCQkJCXJldHVybiB0ZW1wbGF0ZS5nZXROYW1lKCk7Ci0JCQkJY2FzZSAxIDoKLQkJCQkJcmV0dXJuIHRlbXBsYXRlLmdldERlc2NyaXB0aW9uKCk7Ci0JCQkJZGVmYXVsdCA6Ci0JCQkJCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0JfQotCi0JLyoqIExhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUgbmFtZSAqLwotCXByaXZhdGUgU3RyaW5nIGZMYXN0U2VsZWN0ZWRUZW1wbGF0ZU5hbWU7Ci0JLyoqIFRoZSB2aWV3ZXIgZGlzcGxheXMgdGhlIHBhdHRlcm4gb2Ygc2VsZWN0ZWQgdGVtcGxhdGUuICovCi0JcHJpdmF0ZSBTb3VyY2VWaWV3ZXIgZlBhdHRlcm5WaWV3ZXI7Ci0JLyoqIFRoZSB0YWJsZSBwcmVzZW50aW5nIHRoZSB0ZW1wbGF0ZXMuICovCi0JcHJpdmF0ZSBUYWJsZVZpZXdlciBmVGFibGVWaWV3ZXI7Ci0JLyoqIFRlbXBsYXRlIHN0b3JlIHVzZWQgYnkgdGhpcyB3aXphcmQgcGFnZSAqLwotCXByaXZhdGUgVGVtcGxhdGVTdG9yZSBmVGVtcGxhdGVTdG9yZTsKLQkvKiogQ2hlY2tib3ggZm9yIHVzaW5nIHRlbXBsYXRlcy4gKi8KLQlwcml2YXRlIEJ1dHRvbiBmVXNlVGVtcGxhdGVCdXR0b247Ci0KLQlwdWJsaWMgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSgpIHsKLQkJc3VwZXIoIk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UiLCBYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8wLCBudWxsKTsgLy8kTk9OLU5MUy0xJAotCQlzZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xKTsKLQl9Ci0KLQkvKioKLQkgKiBDb3JyZWN0bHkgcmVzaXplcyB0aGUgdGFibGUgc28gbm8gcGhhbnRvbSBjb2x1bW5zIGFwcGVhcgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEBwYXJhbSBidXR0b25zCi0JICogICAgICAgICAgICB0aGUgYnV0dG9ucwotCSAqIEBwYXJhbSB0YWJsZQotCSAqICAgICAgICAgICAgdGhlIHRhYmxlCi0JICogQHBhcmFtIGNvbHVtbjEKLQkgKiAgICAgICAgICAgIHRoZSBmaXJzdCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMgotCSAqICAgICAgICAgICAgdGhlIHNlY29uZCBjb2x1bW4KLQkgKiBAcGFyYW0gY29sdW1uMwotCSAqICAgICAgICAgICAgdGhlIHRoaXJkIGNvbHVtbgotCSAqLwotCXByaXZhdGUgdm9pZCBjb25maWd1cmVUYWJsZVJlc2l6aW5nKGZpbmFsIENvbXBvc2l0ZSBwYXJlbnQsIGZpbmFsIFRhYmxlIHRhYmxlLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4xLCBmaW5hbCBUYWJsZUNvbHVtbiBjb2x1bW4yKSB7Ci0JCXBhcmVudC5hZGRDb250cm9sTGlzdGVuZXIobmV3IENvbnRyb2xBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgY29udHJvbFJlc2l6ZWQoQ29udHJvbEV2ZW50IGUpIHsKLQkJCQlSZWN0YW5nbGUgYXJlYSA9IHBhcmVudC5nZXRDbGllbnRBcmVhKCk7Ci0JCQkJUG9pbnQgcHJlZmVycmVkU2l6ZSA9IHRhYmxlLmNvbXB1dGVTaXplKFNXVC5ERUZBVUxULCBTV1QuREVGQVVMVCk7Ci0JCQkJaW50IHdpZHRoID0gYXJlYS53aWR0aCAtIDIgKiB0YWJsZS5nZXRCb3JkZXJXaWR0aCgpOwotCQkJCWlmIChwcmVmZXJyZWRTaXplLnkgPiBhcmVhLmhlaWdodCkgewotCQkJCQkvLyBTdWJ0cmFjdCB0aGUgc2Nyb2xsYmFyIHdpZHRoIGZyb20gdGhlIHRvdGFsIGNvbHVtbgotCQkJCQkvLyB3aWR0aAotCQkJCQkvLyBpZiBhIHZlcnRpY2FsIHNjcm9sbGJhciB3aWxsIGJlIHJlcXVpcmVkCi0JCQkJCVBvaW50IHZCYXJTaXplID0gdGFibGUuZ2V0VmVydGljYWxCYXIoKS5nZXRTaXplKCk7Ci0JCQkJCXdpZHRoIC09IHZCYXJTaXplLng7Ci0JCQkJfQotCi0JCQkJUG9pbnQgb2xkU2l6ZSA9IHRhYmxlLmdldFNpemUoKTsKLQkJCQlpZiAob2xkU2l6ZS54ID4gd2lkdGgpIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBzbWFsbGVyIHNvIG1ha2UgdGhlIGNvbHVtbnMKLQkJCQkJLy8gc21hbGxlciBmaXJzdCBhbmQgdGhlbiByZXNpemUgdGhlIHRhYmxlIHRvCi0JCQkJCS8vIG1hdGNoIHRoZSBjbGllbnQgYXJlYSB3aWR0aAotCQkJCQljb2x1bW4xLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJCWNvbHVtbjIuc2V0V2lkdGgod2lkdGggLyAyKTsKLQkJCQkJdGFibGUuc2V0U2l6ZSh3aWR0aCwgYXJlYS5oZWlnaHQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gdGFibGUgaXMgZ2V0dGluZyBiaWdnZXIgc28gbWFrZSB0aGUgdGFibGUKLQkJCQkJLy8gYmlnZ2VyIGZpcnN0IGFuZCB0aGVuIG1ha2UgdGhlIGNvbHVtbnMgd2lkZXIKLQkJCQkJLy8gdG8gbWF0Y2ggdGhlIGNsaWVudCBhcmVhIHdpZHRoCi0JCQkJCXRhYmxlLnNldFNpemUod2lkdGgsIGFyZWEuaGVpZ2h0KTsKLQkJCQkJY29sdW1uMS5zZXRXaWR0aCh3aWR0aCAvIDIpOwotCQkJCQljb2x1bW4yLnNldFdpZHRoKHdpZHRoIC8gMik7Ci0JCQkJfQotCQkJfQotCQl9KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBhbmNlc3RvcikgewotCQlDb21wb3NpdGUgcGFyZW50ID0gbmV3IENvbXBvc2l0ZShhbmNlc3RvciwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJcGFyZW50LnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIGNyZWF0ZSBjaGVja2JveCBmb3IgdXNlciB0byB1c2UgRFREIFRlbXBsYXRlCi0JCWZVc2VUZW1wbGF0ZUJ1dHRvbiA9IG5ldyBCdXR0b24ocGFyZW50LCBTV1QuQ0hFQ0spOwotCQlmVXNlVGVtcGxhdGVCdXR0b24uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80KTsKLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJZlVzZVRlbXBsYXRlQnV0dG9uLnNldExheW91dERhdGEoZGF0YSk7Ci0JCWZVc2VUZW1wbGF0ZUJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQllbmFibGVUZW1wbGF0ZXMoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJLy8gY3JlYXRlIGNvbXBvc2l0ZSBmb3IgVGVtcGxhdGVzIHRhYmxlCi0JCUNvbXBvc2l0ZSBpbm5lclBhcmVudCA9IG5ldyBDb21wb3NpdGUocGFyZW50LCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgaW5uZXJMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlpbm5lckxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJaW5uZXJMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJaW5uZXJMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXQoaW5uZXJMYXlvdXQpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIHRydWUsIDIsIDEpOwotCQlpbm5lclBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQkvLyBDcmVhdGUgbGlua2VkIHRleHQgdG8ganVzdCB0byB0ZW1wbGF0ZXMgcHJlZmVyZW5jZSBwYWdlCi0JCUxpbmsgbGluayA9IG5ldyBMaW5rKGlubmVyUGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxpbmsuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV82KTsKLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShTV1QuRklMTCwgU1dULkZJTEwsIHRydWUsIGZhbHNlLCAyLCAxKTsKLQkJbGluay5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlsaW5rLmFkZFNlbGVjdGlvbkxpc3RlbmVyKG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWxpbmtDbGlja2VkKCk7Ci0JCQl9Ci0JCX0pOwotCi0JCS8vIGNyZWF0ZSB0YWJsZSB0aGF0IGRpc3BsYXlzIHRlbXBsYXRlcwotCQlUYWJsZSB0YWJsZSA9IG5ldyBUYWJsZShpbm5lclBhcmVudCwgU1dULkJPUkRFUiB8IFNXVC5GVUxMX1NFTEVDVElPTik7Ci0KLQkJZGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlkYXRhLndpZHRoSGludCA9IGNvbnZlcnRXaWR0aEluQ2hhcnNUb1BpeGVscygyKTsKLQkJZGF0YS5oZWlnaHRIaW50ID0gY29udmVydEhlaWdodEluQ2hhcnNUb1BpeGVscygxMCk7Ci0JCWRhdGEuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQl0YWJsZS5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0JCVRhYmxlTGF5b3V0IHRhYmxlTGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCXRhYmxlLnNldExheW91dCh0YWJsZUxheW91dCk7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMSA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4xLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMik7Ci0KLQkJVGFibGVDb2x1bW4gY29sdW1uMiA9IG5ldyBUYWJsZUNvbHVtbih0YWJsZSwgU1dULk5PTkUpOwotCQljb2x1bW4yLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMyk7Ci0KLQkJZlRhYmxlVmlld2VyID0gbmV3IFRhYmxlVmlld2VyKHRhYmxlKTsKLQkJZlRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIobmV3IFRlbXBsYXRlTGFiZWxQcm92aWRlcigpKTsKLQkJZlRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihuZXcgVGVtcGxhdGVDb250ZW50UHJvdmlkZXIoKSk7Ci0KLQkJZlRhYmxlVmlld2VyLnNldFNvcnRlcihuZXcgVmlld2VyU29ydGVyKCkgewotCQkJcHVibGljIGludCBjb21wYXJlKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvYmplY3QxLCBPYmplY3Qgb2JqZWN0MikgewotCQkJCWlmICgob2JqZWN0MSBpbnN0YW5jZW9mIFRlbXBsYXRlKSAmJiAob2JqZWN0MiBpbnN0YW5jZW9mIFRlbXBsYXRlKSkgewotCQkJCQlUZW1wbGF0ZSBsZWZ0ID0gKFRlbXBsYXRlKSBvYmplY3QxOwotCQkJCQlUZW1wbGF0ZSByaWdodCA9IChUZW1wbGF0ZSkgb2JqZWN0MjsKLQkJCQkJaW50IHJlc3VsdCA9IGxlZnQuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmlnaHQuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKHJlc3VsdCAhPSAwKQotCQkJCQkJcmV0dXJuIHJlc3VsdDsKLQkJCQkJcmV0dXJuIGxlZnQuZ2V0RGVzY3JpcHRpb24oKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJpZ2h0LmdldERlc2NyaXB0aW9uKCkpOwotCQkJCX0KLQkJCQlyZXR1cm4gc3VwZXIuY29tcGFyZSh2aWV3ZXIsIG9iamVjdDEsIG9iamVjdDIpOwotCQkJfQotCi0JCQlwdWJsaWMgYm9vbGVhbiBpc1NvcnRlclByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCX0KLQkJfSk7Ci0KLQkJZlRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGUpIHsKLQkJCQl1cGRhdGVWaWV3ZXJJbnB1dCgpOwotCQkJfQotCQl9KTsKLQotCQkvLyBjcmVhdGUgdmlld2VyIHRoYXQgZGlzcGxheXMgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlJ3MgY29udGVudHMKLQkJZlBhdHRlcm5WaWV3ZXIgPSBkb0NyZWF0ZVZpZXdlcihwYXJlbnQpOwotCi0JCWZUZW1wbGF0ZVN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlU3RvcmUoKTsKLQkJZlRhYmxlVmlld2VyLnNldElucHV0KGZUZW1wbGF0ZVN0b3JlKTsKLQotCQljb25maWd1cmVUYWJsZVJlc2l6aW5nKGlubmVyUGFyZW50LCB0YWJsZSwgY29sdW1uMSwgY29sdW1uMik7Ci0JCWxvYWRMYXN0U2F2ZWRQcmVmZXJlbmNlcygpOwotCi0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAocGFyZW50LCBJSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9URU1QTEFURV9IRUxQSUQpOwotCQlEaWFsb2cuYXBwbHlEaWFsb2dGb250KHBhcmVudCk7Ci0JCXNldENvbnRyb2wocGFyZW50KTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzLCBjb25maWd1cmVzIGFuZCByZXR1cm5zIGEgc291cmNlIHZpZXdlciB0byBwcmVzZW50IHRoZSB0ZW1wbGF0ZQotCSAqIHBhdHRlcm4gb24gdGhlIHByZWZlcmVuY2UgcGFnZS4gQ2xpZW50cyBtYXkgb3ZlcnJpZGUgdG8gcHJvdmlkZSBhCi0JICogY3VzdG9tIHNvdXJjZSB2aWV3ZXIgZmVhdHVyaW5nIGUuZy4gc3ludGF4IGNvbG9yaW5nLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiAgICAgICAgICAgIHRoZSBwYXJlbnQgY29udHJvbAotCSAqIEByZXR1cm4gYSBjb25maWd1cmVkIHNvdXJjZSB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFNvdXJjZVZpZXdlciBjcmVhdGVWaWV3ZXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlTb3VyY2VWaWV3ZXIgdmlld2VyID0gbnVsbDsKLQkJU3RyaW5nIGNvbnRlbnRUeXBlSUQgPSBDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MOwotCQlTb3VyY2VWaWV3ZXJDb25maWd1cmF0aW9uIHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uKCkgewotCQkJU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIGJhc2VDb25maWd1cmF0aW9uID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCgpOwotCi0JCQlwdWJsaWMgU3RyaW5nW10gZ2V0Q29uZmlndXJlZENvbnRlbnRUeXBlcyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKHNvdXJjZVZpZXdlcik7Ci0JCQl9Ci0KLQkJCXB1YmxpYyBMaW5lU3R5bGVQcm92aWRlcltdIGdldExpbmVTdHlsZVByb3ZpZGVycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJCQlyZXR1cm4gYmFzZUNvbmZpZ3VyYXRpb24uZ2V0TGluZVN0eWxlUHJvdmlkZXJzKHNvdXJjZVZpZXdlciwgcGFydGl0aW9uVHlwZSk7Ci0JCQl9Ci0JCX07Ci0JCXZpZXdlciA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlcihwYXJlbnQsIG51bGwsIG51bGwsIGZhbHNlLCBTV1QuQk9SREVSIHwgU1dULlZfU0NST0xMIHwgU1dULkhfU0NST0xMKTsKLQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5nZXRUZXh0V2lkZ2V0KCkuc2V0Rm9udChKRmFjZVJlc291cmNlcy5nZXRUZXh0Rm9udCgpKTsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzY3JhdGNoTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmNyZWF0ZVVuTWFuYWdlZFN0cnVjdHVyZWRNb2RlbEZvcihjb250ZW50VHlwZUlEKTsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gc2NyYXRjaE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpOwotCQl2aWV3ZXIuY29uZmlndXJlKHNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24pOwotCQl2aWV3ZXIuc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCXByaXZhdGUgU291cmNlVmlld2VyIGRvQ3JlYXRlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWxhYmVsLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNSk7Ci0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0KLQkJU291cmNlVmlld2VyIHZpZXdlciA9IGNyZWF0ZVZpZXdlcihwYXJlbnQpOwotCQl2aWV3ZXIuc2V0RWRpdGFibGUoZmFsc2UpOwotCi0JCUNvbnRyb2wgY29udHJvbCA9IHZpZXdlci5nZXRDb250cm9sKCk7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGF0YS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWRhdGEuaGVpZ2h0SGludCA9IGNvbnZlcnRIZWlnaHRJbkNoYXJzVG9QaXhlbHMoNSk7Ci0JCWNvbnRyb2wuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlyZXR1cm4gdmlld2VyOwotCX0KLQotCS8qKgotCSAqIEVuYWJsZS9kaXNhYmxlIGNvbnRyb2xzIGluIHBhZ2UgYmFzZWQgb24gZlVzZVRlbXBsYXRlQnV0dG9uJ3MgY3VycmVudAotCSAqIHN0YXRlLgotCSAqLwotCXZvaWQgZW5hYmxlVGVtcGxhdGVzKCkgewotCQlib29sZWFuIGVuYWJsZWQgPSBmVXNlVGVtcGxhdGVCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKCFlbmFibGVkKSB7Ci0JCQkvLyBzYXZlIGxhc3Qgc2VsZWN0ZWQgdGVtcGxhdGUKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gZ2V0U2VsZWN0ZWRUZW1wbGF0ZSgpOwotCQkJaWYgKHRlbXBsYXRlICE9IG51bGwpCi0JCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJCWVsc2UKLQkJCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJZlRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihudWxsKTsKLQkJfQotCQllbHNlIHsKLQkJCXNldFNlbGVjdGVkVGVtcGxhdGUoZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSk7Ci0JCX0KLQotCQlmVGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZQYXR0ZXJuVmlld2VyLmdldENvbnRyb2woKS5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgdGVtcGxhdGUgcHJlZmVyZW5jZSBwYWdlIGlkCi0JICogCi0JICogQHJldHVybgotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldFByZWZlcmVuY2VQYWdlSWQoKSB7Ci0JCXJldHVybiAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy54bWwudGVtcGxhdGVzIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIEdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHRlbXBsYXRlLgotCSAqIAotCSAqIEByZXR1cm4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlIGdldFNlbGVjdGVkVGVtcGxhdGUoKSB7Ci0JCVRlbXBsYXRlIHRlbXBsYXRlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBmVGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0KLQkJaWYgKHNlbGVjdGlvbi5zaXplKCkgPT0gMSkgewotCQkJdGVtcGxhdGUgPSAoVGVtcGxhdGUpIHNlbGVjdGlvbi5nZXRGaXJzdEVsZW1lbnQoKTsKLQkJfQotCQlyZXR1cm4gdGVtcGxhdGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0ZW1wbGF0ZSBzdHJpbmcgdG8gaW5zZXJ0LgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIHRvIGluc2VydCBvciBudWxsIGlmIG5vbmUgaXMgdG8gYmUgaW5zZXJ0ZWQKLQkgKi8KLQlTdHJpbmcgZ2V0VGVtcGxhdGVTdHJpbmcoKSB7Ci0JCVN0cmluZyB0ZW1wbGF0ZVN0cmluZyA9IG51bGw7Ci0KLQkJVGVtcGxhdGUgdGVtcGxhdGUgPSBnZXRTZWxlY3RlZFRlbXBsYXRlKCk7Ci0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlUZW1wbGF0ZUNvbnRleHRUeXBlIGNvbnRleHRUeXBlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkuZ2V0Q29udGV4dFR5cGUoVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gbmV3IERvY3VtZW50KCk7Ci0JCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IG5ldyBEb2N1bWVudFRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIDAsIDApOwotCQkJdHJ5IHsKLQkJCQlUZW1wbGF0ZUJ1ZmZlciBidWZmZXIgPSBjb250ZXh0LmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJCQl0ZW1wbGF0ZVN0cmluZyA9IGJ1ZmZlci5nZXRTdHJpbmcoKTsKLQkJCX0KLQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsICJDb3VsZCBub3QgY3JlYXRlIHRlbXBsYXRlIGZvciBuZXcgZHRkIiwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJfQotCi0JCXJldHVybiB0ZW1wbGF0ZVN0cmluZzsKLQl9Ci0KLQl2b2lkIGxpbmtDbGlja2VkKCkgewotCQlTdHJpbmcgcGFnZUlkID0gZ2V0UHJlZmVyZW5jZVBhZ2VJZCgpOwotCQlQcmVmZXJlbmNlRGlhbG9nIGRpYWxvZyA9IFByZWZlcmVuY2VzVXRpbC5jcmVhdGVQcmVmZXJlbmNlRGlhbG9nT24oZ2V0U2hlbGwoKSwgcGFnZUlkLCBuZXcgU3RyaW5nW117cGFnZUlkfSwgbnVsbCk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWZUYWJsZVZpZXdlci5yZWZyZXNoKCk7Ci0JfQotCi0JLyoqCi0JICogTG9hZCB0aGUgbGFzdCB0ZW1wbGF0ZSBuYW1lIHVzZWQgaW4gTmV3IERURCBGaWxlIHdpemFyZC4KLQkgKi8KLQlwcml2YXRlIHZvaWQgbG9hZExhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FKTsKLQkJaWYgKHRlbXBsYXRlTmFtZSA9PSBudWxsIHx8IHRlbXBsYXRlTmFtZS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlmTGFzdFNlbGVjdGVkVGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZkxhc3RTZWxlY3RlZFRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKLQkJCWZVc2VUZW1wbGF0ZUJ1dHRvbi5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQkJZW5hYmxlVGVtcGxhdGVzKCk7Ci0JfQotCi0JLyoqCi0JICogU2F2ZSB0ZW1wbGF0ZSBuYW1lIHVzZWQgZm9yIG5leHQgY2FsbCB0byBOZXcgRFREIEZpbGUgd2l6YXJkLgotCSAqLwotCXZvaWQgc2F2ZUxhc3RTYXZlZFByZWZlcmVuY2VzKCkgewotCQlTdHJpbmcgdGVtcGxhdGVOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCXRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlLmdldE5hbWUoKTsKLQkJfQotCi0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5ORVdfRklMRV9URU1QTEFURV9OQU1FLCB0ZW1wbGF0ZU5hbWUpOwotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JLyoqCi0JICogU2VsZWN0IGEgdGVtcGxhdGUgaW4gdGhlIHRhYmxlIHZpZXdlciBnaXZlbiB0aGUgdGVtcGxhdGUgbmFtZS4gSWYKLQkgKiB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSBmb3VuZCBvciB0ZW1wbGF0ZU5hbWUgaXMgbnVsbCwganVzdCBzZWxlY3QKLQkgKiBmaXJzdCBpdGVtIGluIHRhYmxlLiBJZiBubyBpdGVtcyBpbiB0YWJsZSBzZWxlY3Qgbm90aGluZy4KLQkgKiAKLQkgKiBAcGFyYW0gdGVtcGxhdGVOYW1lCi0JICovCi0JcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkVGVtcGxhdGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgewotCQlPYmplY3QgdGVtcGxhdGUgPSBudWxsOwotCi0JCWlmICh0ZW1wbGF0ZU5hbWUgIT0gbnVsbCAmJiB0ZW1wbGF0ZU5hbWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkvLyBwaWNrIHRoZSBsYXN0IHVzZWQgdGVtcGxhdGUKLQkJCXRlbXBsYXRlID0gZlRlbXBsYXRlU3RvcmUuZmluZFRlbXBsYXRlKHRlbXBsYXRlTmFtZSwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQl9Ci0KLQkJLy8gbm8gcmVjb3JkIG9mIGxhc3QgdXNlZCB0ZW1wbGF0ZSBzbyBqdXN0IHBpY2sgZmlyc3QgZWxlbWVudAotCQlpZiAodGVtcGxhdGUgPT0gbnVsbCkgewotCQkJLy8ganVzdCBwaWNrIGZpcnN0IGVsZW1lbnQKLQkJCXRlbXBsYXRlID0gZlRhYmxlVmlld2VyLmdldEVsZW1lbnRBdCgwKTsKLQkJfQotCi0JCWlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbih0ZW1wbGF0ZSk7Ci0JCQlmVGFibGVWaWV3ZXIuc2V0U2VsZWN0aW9uKHNlbGVjdGlvbiwgdHJ1ZSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGVzIHRoZSBwYXR0ZXJuIHZpZXdlci4KLQkgKi8KLQl2b2lkIHVwZGF0ZVZpZXdlcklucHV0KCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IGdldFNlbGVjdGVkVGVtcGxhdGUoKTsKLQkJaWYgKHRlbXBsYXRlICE9IG51bGwpIHsKLQkJCWZQYXR0ZXJuVmlld2VyLmdldERvY3VtZW50KCkuc2V0KHRlbXBsYXRlLmdldFBhdHRlcm4oKSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlmUGF0dGVyblZpZXdlci5nZXREb2N1bWVudCgpLnNldCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MV2l6YXJkLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL05ld1hNTFdpemFyZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNThjNTliLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvTmV3WE1MV2l6YXJkLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NDIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5NZXNzYWdlRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLkFzc2VydDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5JV2l6YXJkUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aXphcmQuV2l6YXJkRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpemFyZC5XaXphcmRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tYm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5GaWxlRWRpdG9ySW5wdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucGFydC5QYWdlQm9vazsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS53aXphcmRzLm5ld3Jlc291cmNlLkJhc2ljTmV3UmVzb3VyY2VXaXphcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLlNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0LkNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nOwotCi1pbXBvcnQgY29tLmlibS5pY3UudGV4dC5Db2xsYXRvcjsKLQotcHVibGljIGNsYXNzIE5ld1hNTFdpemFyZCBleHRlbmRzIE5ld01vZGVsV2l6YXJkIHsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDUkVBVEVfRlJPTV9EVEQgPSAwOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENSRUFURV9GUk9NX1hTRCA9IDE7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ1JFQVRFX0ZST01fU0NSQVRDSCA9IDI7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGNyZWF0ZUZyb21SYWRpb0J1dHRvbkxhYmVsID0ge1hNTFdpemFyZHNNZXNzYWdlcy5fVUlfUkFESU9fWE1MX0ZST01fRFRELCBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1JBRElPX1hNTF9GUk9NX1NDSEVNQSwgWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9SQURJT19YTUxfRlJPTV9TQ1JBVENIfTsKLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gZmlsZVBhZ2VGaWx0ZXJFeHRlbnNpb25zID0geyIueG1sIn07IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGJyb3dzZVhTREZpbHRlckV4dGVuc2lvbnMgPSB7Ii54c2QifTsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nW10gYnJvd3NlRFRERmlsdGVyRXh0ZW5zaW9ucyA9IHsiLmR0ZCJ9OyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgTmV3RmlsZVBhZ2UgbmV3RmlsZVBhZ2U7Ci0JcHJvdGVjdGVkIFN0YXJ0UGFnZSBzdGFydFBhZ2U7Ci0JcHJvdGVjdGVkIFNlbGVjdEdyYW1tYXJGaWxlUGFnZSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2U7Ci0JcHJvdGVjdGVkIFNlbGVjdFJvb3RFbGVtZW50UGFnZSBzZWxlY3RSb290RWxlbWVudFBhZ2U7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGNtRG9jdW1lbnRFcnJvck1lc3NhZ2U7Ci0KLQlwcm90ZWN0ZWQgTmV3WE1MR2VuZXJhdG9yIGdlbmVyYXRvcjsKLQlwcml2YXRlIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UgZk5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2U7Ci0KLQotCXB1YmxpYyBOZXdYTUxXaXphcmQoKSB7Ci0JCXNldFdpbmRvd1RpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfSEVBRElORyk7Ci0JCXNldERlZmF1bHRQYWdlSW1hZ2VEZXNjcmlwdG9yKEltYWdlRGVzY3JpcHRvci5jcmVhdGVGcm9tRmlsZShYTUxXaXphcmQuY2xhc3MsICJpY29ucy9nZW5lcmF0ZXhtbF93aXouZ2lmIikpOyAvLyROT04tTkxTLTEkCi0JCWdlbmVyYXRvciA9IG5ldyBOZXdYTUxHZW5lcmF0b3IoKTsKLQl9Ci0KLQotCXB1YmxpYyBOZXdYTUxXaXphcmQoSUZpbGUgZmlsZSwgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCXRoaXMoKTsKLQotCQlnZW5lcmF0b3Iuc2V0R3JhbW1hclVSSShVUklIZWxwZXIuZ2V0UGxhdGZvcm1VUkkoZmlsZSkpOwotCQlnZW5lcmF0b3Iuc2V0Q01Eb2N1bWVudChjbURvY3VtZW50KTsKLQl9Ci0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBzaG93RGlhbG9nKFNoZWxsIHNoZWxsLCBJRmlsZSBmaWxlLCBJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCVN0cmluZ1tdIGVycm9ySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0JCS8vIChjcykgdGhlIFVSSSBhcmd1bWVudCB0byBjcmVhdGVDTURvY3VtZW50IG5lZWRzIHRvIGJlIGEgZnVsbHkgcXVhbGlmaWVkIFVSSQotCQkvLwotCQlDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBOZXdYTUxHZW5lcmF0b3IuY3JlYXRlQ01Eb2N1bWVudChVUklIZWxwZXIuZ2V0UGxhdGZvcm1VUkkoZmlsZSksIGVycm9ySW5mbyk7Ci0JCWlmIChlcnJvckluZm9bMF0gPT0gbnVsbCkgewotCQkJTmV3WE1MV2l6YXJkIHdpemFyZCA9IG5ldyBOZXdYTUxXaXphcmQoZmlsZSwgY21Eb2N1bWVudCk7Ci0JCQl3aXphcmQuaW5pdChQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLCBzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJCXdpemFyZC5zZXROZWVkc1Byb2dyZXNzTW9uaXRvcih0cnVlKTsKLQkJCVdpemFyZERpYWxvZyBkaWFsb2cgPSBuZXcgV2l6YXJkRGlhbG9nKHNoZWxsLCB3aXphcmQpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0RJQUxPR19ORVdfVElUTEUpOwotCQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQkJZGlhbG9nLm9wZW4oKTsKLQkJfQotCQllbHNlIHsKLQkJCU1lc3NhZ2VEaWFsb2cub3BlbkluZm9ybWF0aW9uKHNoZWxsLCBlcnJvckluZm9bMF0sIGVycm9ySW5mb1sxXSk7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGFkZFBhZ2VzKCkgewotCQlTdHJpbmcgZ3JhbW1hclVSSSA9IGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCk7Ci0KLQkJaWYgKGdyYW1tYXJVUkkgPT0gbnVsbCkgewotCQkJLy8gc3RhcnQgcGFnZQotCQkJc3RhcnRQYWdlID0gbmV3IFN0YXJ0UGFnZSgiU3RhcnRQYWdlIiwgY3JlYXRlRnJvbVJhZGlvQnV0dG9uTGFiZWwpIC8vJE5PTi1OTFMtMSQKLQkJCXsKLQkJCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCQkJc3VwZXIuY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0JCQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQkJCWdldFJhZGlvQnV0dG9uQXRJbmRleChnZXRDcmVhdGVNb2RlKCkpLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkJZ2V0UmFkaW9CdXR0b25BdEluZGV4KGdldENyZWF0ZU1vZGUoKSkuc2V0Rm9jdXMoKTsKLQotCQkJCQkvLyBTZXQgdGhlIGhlbHAgY29udGV4dCBmb3IgZWFjaCBidXR0b24KLQkJCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChzdGFydFBhZ2UuZ2V0UmFkaW9CdXR0b25BdEluZGV4KDApLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9DUkVBVEVYTUwxX0hFTFBJRCk7Ci0JCQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3RhcnRQYWdlLmdldFJhZGlvQnV0dG9uQXRJbmRleCgxKSwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfQ1JFQVRFWE1MMl9IRUxQSUQpOwotCQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHN0YXJ0UGFnZS5nZXRSYWRpb0J1dHRvbkF0SW5kZXgoMiksIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX0NSRUFURVhNTDNfSEVMUElEKTsKLQkJCQl9Ci0JCQl9OwotCi0KLQkJCXN0YXJ0UGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0hFQURJTkcpOwotCQkJc3RhcnRQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfRVhQTCk7Ci0JCQlhZGRQYWdlKHN0YXJ0UGFnZSk7Ci0JCX0KLQotCQkvLyBuZXcgZmlsZSBwYWdlCi0JCW5ld0ZpbGVQYWdlID0gbmV3IE5ld0ZpbGVQYWdlKGZTZWxlY3Rpb24pOwotCQluZXdGaWxlUGFnZS5zZXRUaXRsZShYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORyk7Ci0JCW5ld0ZpbGVQYWdlLnNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdE5hbWUgPSAoZ3JhbW1hclVSSSAhPSBudWxsKSA/IFVSSUhlbHBlci5yZW1vdmVGaWxlRXh0ZW5zaW9uKFVSSUhlbHBlci5nZXRMYXN0U2VnbWVudChncmFtbWFyVVJJKSkgOiAiTmV3RmlsZSI7IC8vJE5PTi1OTFMtMSQKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZSA9IFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCVN0cmluZyBleHQgPSBwcmVmZXJlbmNlLmdldFN0cmluZyhYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OKTsKLQkJbmV3RmlsZVBhZ2UuZGVmYXVsdEZpbGVFeHRlbnNpb24gPSAiLiIrZXh0OyAvLyROT04tTkxTLTEkCi0JCW5ld0ZpbGVQYWdlLmZpbHRlckV4dGVuc2lvbnMgPSBmaWxlUGFnZUZpbHRlckV4dGVuc2lvbnM7Ci0JCWFkZFBhZ2UobmV3RmlsZVBhZ2UpOwotCi0JCS8vIHNlbGVjdEdyYW1tYXJGaWxlUGFnZQotCQlzZWxlY3RHcmFtbWFyRmlsZVBhZ2UgPSBuZXcgU2VsZWN0R3JhbW1hckZpbGVQYWdlKCk7Ci0JCWFkZFBhZ2Uoc2VsZWN0R3JhbW1hckZpbGVQYWdlKTsKLQotCQkvLyBzZWxlY3Qgcm9vdCBlbGVtZW50IHBhZ2UKLQkJc2VsZWN0Um9vdEVsZW1lbnRQYWdlID0gbmV3IFNlbGVjdFJvb3RFbGVtZW50UGFnZSgpOwotCQlzZWxlY3RSb290RWxlbWVudFBhZ2Uuc2V0VGl0bGUoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9XSVpBUkRfU0VMRUNUX1JPT1RfSEVBRElORyk7Ci0JCXNlbGVjdFJvb3RFbGVtZW50UGFnZS5zZXREZXNjcmlwdGlvbihYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9FWFBMKTsKLQkJYWRkUGFnZShzZWxlY3RSb290RWxlbWVudFBhZ2UpOwotCi0JCS8vIGZyb20gInNjcmF0Y2giCi0JCWZOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlID0gbmV3IE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2UoKTsKLQkJYWRkUGFnZShmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSk7Ci0JfQotCi0KLQlwdWJsaWMgSVdpemFyZFBhZ2UgZ2V0U3RhcnRpbmdQYWdlKCkgewotCQlXaXphcmRQYWdlIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdGFydFBhZ2UgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gc3RhcnRQYWdlOwotCQl9Ci0JCWVsc2UgewotCQkJcmVzdWx0ID0gbmV3RmlsZVBhZ2U7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBpbnQgZ2V0Q3JlYXRlTW9kZSgpIHsKLQkJU3RyaW5nIGdyYW1tYXJVUkkgPSBnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpOwotCi0JCWludCByZXN1bHQgPSBDUkVBVEVfRlJPTV9TQ1JBVENIOwotCQlpZiAoZ3JhbW1hclVSSSAhPSBudWxsKSB7Ci0JCQlpZiAoZ3JhbW1hclVSSS5lbmRzV2l0aCgiLmR0ZCIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcmVzdWx0ID0gQ1JFQVRFX0ZST01fRFREOwotCQkJfQotCQkJZWxzZSBpZiAoZ3JhbW1hclVSSS5lbmRzV2l0aCgiLnhzZCIpKSAvLyROT04tTkxTLTEkCi0JCQl7Ci0JCQkJcmVzdWx0ID0gQ1JFQVRFX0ZST01fWFNEOwotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHN0YXJ0UGFnZSAhPSBudWxsKSB7Ci0JCQlpbnQgc2VsZWN0ZWRJbmRleCA9IHN0YXJ0UGFnZS5nZXRTZWxlY3RlZFJhZGlvQnV0dG9uSW5kZXgoKTsKLQkJCWlmIChzZWxlY3RlZEluZGV4ICE9IC0xKSB7Ci0JCQkJcmVzdWx0ID0gc2VsZWN0ZWRJbmRleDsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIElXaXphcmRQYWdlIGdldE5leHRQYWdlKElXaXphcmRQYWdlIGN1cnJlbnRQYWdlKSB7Ci0JCVdpemFyZFBhZ2UgbmV4dFBhZ2UgPSBudWxsOwotCQlpZiAoY3VycmVudFBhZ2UgPT0gc3RhcnRQYWdlKSB7Ci0JCQluZXh0UGFnZSA9IG5ld0ZpbGVQYWdlOwotCQl9Ci0JCWVsc2UgaWYgKGN1cnJlbnRQYWdlID09IG5ld0ZpbGVQYWdlKSB7Ci0JCQlpZiAoZ2V0Q3JlYXRlTW9kZSgpID09IENSRUFURV9GUk9NX1NDUkFUQ0gpIHsKLQkJCQluZXh0UGFnZSA9IGZOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlOwotCQkJfQotCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSA9PSBudWxsKSB7Ci0JCQkJbmV4dFBhZ2UgPSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2U7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQluZXh0UGFnZSA9IHNlbGVjdFJvb3RFbGVtZW50UGFnZTsKLQkJCX0KLQkJfQotCQllbHNlIGlmIChjdXJyZW50UGFnZSA9PSBzZWxlY3RHcmFtbWFyRmlsZVBhZ2UpIHsKLQkJCW5leHRQYWdlID0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlOwotCQl9Ci0JCXJldHVybiBuZXh0UGFnZTsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGNhbkZpbmlzaCgpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQotCQlJV2l6YXJkUGFnZSBjdXJyZW50UGFnZSA9IGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCk7Ci0KLQkJaWYgKChzdGFydFBhZ2UgIT0gbnVsbCAmJiBzdGFydFBhZ2UuZ2V0U2VsZWN0ZWRSYWRpb0J1dHRvbkluZGV4KCkgPT0gQ1JFQVRFX0ZST01fU0NSQVRDSCAmJiBjdXJyZW50UGFnZSA9PSBmTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZSkgfHwgKGN1cnJlbnRQYWdlID09IHNlbGVjdFJvb3RFbGVtZW50UGFnZSkpIHsKLQkJCXJlc3VsdCA9IGN1cnJlbnRQYWdlLmlzUGFnZUNvbXBsZXRlKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1GaW5pc2goKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQkJc3VwZXIucGVyZm9ybUZpbmlzaCgpOwotCQlTdHJpbmcgZmlsZU5hbWUgPSBudWxsOwotCQl0cnkgewotCi0JCQlTdHJpbmdbXSBuYW1lc3BhY2VFcnJvcnMgPSBnZW5lcmF0b3IuZ2V0TmFtZXNwYWNlSW5mb0Vycm9ycygpOwotCQkJaWYgKG5hbWVzcGFjZUVycm9ycyAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHRpdGxlID0gbmFtZXNwYWNlRXJyb3JzWzBdOwotCQkJCVN0cmluZyBtZXNzYWdlID0gbmFtZXNwYWNlRXJyb3JzWzFdOwotCQkJCXJlc3VsdCA9IE1lc3NhZ2VEaWFsb2cub3BlblF1ZXN0aW9uKGdldFNoZWxsKCksIHRpdGxlLCBtZXNzYWdlKTsKLQkJCX0KLQotCQkJaWYgKHJlc3VsdCkgewotCQkJCWZpbGVOYW1lID0gbmV3RmlsZVBhZ2UuZ2V0RmlsZU5hbWUoKTsKLQkJCQlpZiAoKG5ldyBQYXRoKGZpbGVOYW1lKSkuZ2V0RmlsZUV4dGVuc2lvbigpID09IG51bGwpIHsKLQkJCQkJbmV3RmlsZVBhZ2Uuc2V0RmlsZU5hbWUoZmlsZU5hbWUuY29uY2F0KG5ld0ZpbGVQYWdlLmRlZmF1bHRGaWxlRXh0ZW5zaW9uKSk7Ci0JCQkJfQotCi0JCQkJSUZpbGUgbmV3RmlsZSA9IG5ld0ZpbGVQYWdlLmNyZWF0ZU5ld0ZpbGUoKTsKLQkJCQlTdHJpbmcgeG1sRmlsZU5hbWUgPSBuZXdGaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCi0JCQkJaWYgKGdldENvbnRhaW5lcigpLmdldEN1cnJlbnRQYWdlKCkgPT0gc2VsZWN0Um9vdEVsZW1lbnRQYWdlKSB7Ci0KLQkJCQkJZ2VuZXJhdG9yLmNyZWF0ZVhNTERvY3VtZW50KG5ld0ZpbGUsIHhtbEZpbGVOYW1lKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWdlbmVyYXRvci5jcmVhdGVFbXB0eVhNTERvY3VtZW50KG5ld0ZpbGUpOwotCQkJCX0KLQotCQkJCW5ld0ZpbGUucmVmcmVzaExvY2FsKDEsIG51bGwpOwotCi0JCQkJSVdvcmtiZW5jaFdpbmRvdyB3b3JrYmVuY2hXaW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQkJCUJhc2ljTmV3UmVzb3VyY2VXaXphcmQuc2VsZWN0QW5kUmV2ZWFsKG5ld0ZpbGUsIHdvcmtiZW5jaFdpbmRvdyk7Ci0JCQkJb3BlbkVkaXRvcihuZXdGaWxlKTsKLQkJCX0KLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oIkV4Y2VwdGlvbiBjb21wbGV0aW5nIE5ldyBYTUwgd2l6YXJkICIgKyBmaWxlTmFtZSwgZSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW5FZGl0b3IoSUZpbGUgZmlsZSkgewotCQkvLyBPcGVuIGVkaXRvciBvbiBuZXcgZmlsZS4KLQkJU3RyaW5nIGVkaXRvcklkID0gbnVsbDsKLQkJdHJ5IHsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGVkaXRvciA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RWRpdG9yUmVnaXN0cnkoKS5nZXREZWZhdWx0RWRpdG9yKGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCksIGZpbGUuZ2V0Q29udGVudERlc2NyaXB0aW9uKCkuZ2V0Q29udGVudFR5cGUoKSk7Ci0JCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQllZGl0b3JJZCA9IGVkaXRvci5nZXRJZCgpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUxKSB7Ci0JCQkvLyBlZGl0b3IgaWQgY291bGQgbm90IGJlIHJldHJpZXZlZCwgc28gd2UgY2FuIG5vdCBvcGVuIGVkaXRvcgotCQkJcmV0dXJuOwotCQl9Ci0JCUlXb3JrYmVuY2hXaW5kb3cgZHcgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQl0cnkgewotCQkJaWYgKGR3ICE9IG51bGwpIHsKLQkJCQlJV29ya2JlbmNoUGFnZSBwYWdlID0gZHcuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCWlmIChwYWdlICE9IG51bGwpCi0JCQkJCXBhZ2Uub3BlbkVkaXRvcihuZXcgRmlsZUVkaXRvcklucHV0KGZpbGUpLCBlZGl0b3JJZCwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKFBhcnRJbml0RXhjZXB0aW9uIGUpIHsKLQkJCS8vIGVkaXRvciBjYW4gbm90IG9wZW4gZm9yIHNvbWUgcmVhc29uCi0JCQlyZXR1cm47Ci0JCX0KLQotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREZWZhdWx0U3lzdGVtSWQoKSB7Ci0JCVN0cmluZyByZWxhdGl2ZVBhdGggPSAicGxhdGZvcm06L3Jlc291cmNlLyIgKyBuZXdGaWxlUGFnZS5nZXRDb250YWluZXJGdWxsUGF0aCgpLnRvU3RyaW5nKCkgKyAiL2R1bW15IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXJldHVybiBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSwgcmVsYXRpdmVQYXRoKTsKLQl9Ci0KLQotCS8qKgotCSAqIFNlbGVjdEdyYW1tYXJGaWxlUGFnZQotCSAqLwotCWNsYXNzIFNlbGVjdEdyYW1tYXJGaWxlUGFnZSBleHRlbmRzIFdpemFyZFBhZ2UgewotCQlwcm90ZWN0ZWQgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwgcGFuZWw7Ci0KLQkJU2VsZWN0R3JhbW1hckZpbGVQYWdlKCkgewotCQkJc3VwZXIoIlNlbGVjdEdyYW1tYXJGaWxlUGFnZSIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjcmVhdGVDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb21wb3NpdGUsIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX1NFTEVDVFNPVVJDRV9IRUxQSUQpOwotCQkJY29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCXNldENvbnRyb2woY29tcG9zaXRlKTsKLQotCQkJcGFuZWwgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoY29tcG9zaXRlKTsKLQkJCXBhbmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5MaXN0ZW5lcigpIHsKLQkJCQlwdWJsaWMgdm9pZCBjb21wbGV0aW9uU3RhdGVDaGFuZ2VkKCkgewotCQkJCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQl9OwotCQkJcGFuZWwuc2V0TGlzdGVuZXIobGlzdGVuZXIpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0JCQlpZiAodmlzaWJsZSkgewotCQkJCWlmIChnZXRDcmVhdGVNb2RlKCkgPT0gQ1JFQVRFX0ZST01fRFREKSB7Ci0JCQkJCXNldFRpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9USVRMRSk7Ci0JCQkJCXNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9EVERfRklMRV9ERVNDKTsKLQkJCQkJcGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhicm93c2VEVERGaWx0ZXJFeHRlbnNpb25zKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXNldFRpdGxlKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRSk7Ci0JCQkJCXNldERlc2NyaXB0aW9uKFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9ERVNDKTsKLQkJCQkJcGFuZWwuc2V0RmlsdGVyRXh0ZW5zaW9ucyhicm93c2VYU0RGaWx0ZXJFeHRlbnNpb25zKTsKLQkJCQl9Ci0JCQkJZ2VuZXJhdG9yLnNldEdyYW1tYXJVUkkobnVsbCk7Ci0JCQkJZ2VuZXJhdG9yLnNldENNRG9jdW1lbnQobnVsbCk7Ci0JCQkJY21Eb2N1bWVudEVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQl9Ci0JCQlwYW5lbC5zZXRWaXNpYmxlSGVscGVyKHZpc2libGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVUkkoKSB7Ci0JCQlTdHJpbmcgdXJpID0gcGFuZWwuZ2V0WE1MQ2F0YWxvZ1VSSSgpOwotCQkJaWYgKHVyaSA9PSBudWxsKSB7Ci0JCQkJSUZpbGUgZmlsZSA9IHBhbmVsLmdldEZpbGUoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRQbGF0Zm9ybVVSSShmaWxlKTsKLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gdXJpOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNQYWdlQ29tcGxldGUoKSB7Ci0JCQlyZXR1cm4gZ2V0VVJJKCkgIT0gbnVsbCAmJiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRYTUxDYXRhbG9nSWQoKSB7Ci0JCQlyZXR1cm4gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0lkKCk7Ci0JCX0KLQotCQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCQlyZXR1cm4gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJCVN0cmluZyB1cmkgPSBnZXRVUkkoKTsKLQkJCWlmICh1cmkgIT0gbnVsbCkgewotCQkJCWlmICghVVJJSGVscGVyLmlzUmVhZGFibGVVUkkodXJpLCBmYWxzZSkpIHsKLQkJCQkJZXJyb3JNZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9FUlJPUl9DQVRBTE9HX0VOVFJZX0lOVkFMSUQ7Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIGVycm9yTWVzc2FnZTsKLQkJfQotCi0KLQkJcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IGNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UpOwotCQkJc2V0UGFnZUNvbXBsZXRlKGlzUGFnZUNvbXBsZXRlKCkpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBTZWxlY3RSb290RWxlbWVudFBhZ2UKLQkgKi8KLQljbGFzcyBTZWxlY3RSb290RWxlbWVudFBhZ2UgZXh0ZW5kcyBXaXphcmRQYWdlIGltcGxlbWVudHMgU2VsZWN0aW9uTGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgQ29tYm8gY29tYm87Ci0JCXByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbjsKLQkJcHJvdGVjdGVkIFBhZ2VCb29rIHBhZ2VCb29rOwotCQlwcm90ZWN0ZWQgWFNET3B0aW9uc1BhbmVsIHhzZE9wdGlvbnNQYW5lbDsKLQkJcHJvdGVjdGVkIERURE9wdGlvbnNQYW5lbCBkdGRPcHRpb25zUGFuZWw7Ci0KLQotCQlTZWxlY3RSb290RWxlbWVudFBhZ2UoKSB7Ci0JCQlzdXBlcigiU2VsZWN0Um9vdEVsZW1lbnRQYWdlIik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGNyZWF0ZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJLy8gY29udGFpbmVyIGdyb3VwCi0JCQlDb21wb3NpdGUgY29udGFpbmVyR3JvdXAgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjb250YWluZXJHcm91cCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlRfSEVMUElEKTsKLQkJCWNvbnRhaW5lckdyb3VwLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCWNvbnRhaW5lckdyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJc2V0Q29udHJvbChjb250YWluZXJHcm91cCk7Ci0KLQkJCS8vIHNlbGVjdCByb290IGVsZW1lbnQKLQkJCUxhYmVsIGNvbnRhaW5lckxhYmVsID0gbmV3IExhYmVsKGNvbnRhaW5lckdyb3VwLCBTV1QuTk9ORSk7Ci0JCQljb250YWluZXJMYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfUk9PVF9FTEVNRU5UKTsKLQkJCWNvbWJvID0gbmV3IENvbWJvKGNvbnRhaW5lckdyb3VwLCBTV1QuRFJPUF9ET1dOIHwgU1dULlJFQURfT05MWSk7Ci0JCQljb21iby5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCWNvbWJvLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCQkvLyBPcHRpb25zCi0JCQl7Ci0JCQkJR3JvdXAgZ3JvdXAgPSBuZXcgR3JvdXAoY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlncm91cC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NPTlRFTlRfT1BUSU9OUyk7Ci0KLQkJCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQkJCWxheW91dC5tYWtlQ29sdW1uc0VxdWFsV2lkdGggPSB0cnVlOwotCQkJCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQkJZ3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJCQlyYWRpb0J1dHRvbiA9IG5ldyBCdXR0b25bNF07Ci0KLQkJCQlyYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5DSEVDSyk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfQVRUUklCVVRFUyk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJcmFkaW9CdXR0b25bMF0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzBdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDFfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzFdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsxXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9PUFRJT05BTF9FTEVNRU5UUyk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCQkJcmFkaW9CdXR0b25bMV0uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzFdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDJfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzJdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblsyXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzJdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzJdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDNfSEVMUElEKTsKLQotCQkJCXJhZGlvQnV0dG9uWzNdID0gbmV3IEJ1dHRvbihncm91cCwgU1dULkNIRUNLKTsKLQkJCQlyYWRpb0J1dHRvblszXS5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCXJhZGlvQnV0dG9uWzNdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJhZGlvQnV0dG9uWzNdLCBJWE1MV2l6YXJkSGVscENvbnRleHRJZHMuWE1MX05FV1dJWkFSRF9TRUxFQ1RST09URUxFTUVOVDRfSEVMUElEKTsKLQkJCQkvKgotCQkJCSAqIHJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJCQkgKiAKLQkJCQkgKiByYWRpb0J1dHRvblswXSA9IG5ldyBCdXR0b24oZ3JvdXAsIFNXVC5SQURJTyk7Ci0JCQkJICogcmFkaW9CdXR0b25bMF0uc2V0VGV4dChYTUxXaXphcmRzTWVzc2FnZXMuZ2V0U3RyaW5nKCJfVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCIpKTsKLQkJCQkgKiByYWRpb0J1dHRvblswXS5zZXRMYXlvdXREYXRhKG5ldwotCQkJCSAqIEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJCSAqIHJhZGlvQnV0dG9uWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMF0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfT05MWSk7Ci0JCQkJICogCi0JCQkJICogcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKGdyb3VwLCBTV1QuUkFESU8pOwotCQkJCSAqIHJhZGlvQnV0dG9uWzFdLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLmdldFN0cmluZygiX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUwiKSk7Ci0JCQkJICogcmFkaW9CdXR0b25bMV0uc2V0TGF5b3V0RGF0YShuZXcKLQkJCQkgKiBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCQkgKiBXb3JrYmVuY2hIZWxwLnNldEhlbHAocmFkaW9CdXR0b25bMV0sCi0JCQkJICogWE1MQnVpbGRlckNvbnRleHRJZHMuWE1MQ19DUkVBVEVfUkVRVUlSRURfQU5EX09QVElPTik7Ci0JCQkJICovCi0JCQl9Ci0KLQkJCS8vIGFkZCB0aGUgZ3JhbW1hciBzcGVjaWZpYyBnZW5lcmF0aW9uIG9wdGlvbnMKLQkJCS8vCi0JCQl7Ci0JCQkJcGFnZUJvb2sgPSBuZXcgUGFnZUJvb2soY29udGFpbmVyR3JvdXAsIFNXVC5OT05FKTsKLQkJCQlwYWdlQm9vay5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCQl4c2RPcHRpb25zUGFuZWwgPSBuZXcgWFNET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlkdGRPcHRpb25zUGFuZWwgPSBuZXcgRFRET3B0aW9uc1BhbmVsKHRoaXMsIHBhZ2VCb29rKTsKLQkJCQlwYWdlQm9vay5zaG93UGFnZSh4c2RPcHRpb25zUGFuZWwpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZXZlbnQpIHsKLQkJCWludCBpbmRleCA9IGNvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCQlTdHJpbmcgcm9vdEVsZW1lbnROYW1lID0gKGluZGV4ICE9IC0xKSA/IGNvbWJvLmdldEl0ZW0oaW5kZXgpIDogbnVsbDsKLQkJCWdlbmVyYXRvci5zZXRSb290RWxlbWVudE5hbWUocm9vdEVsZW1lbnROYW1lKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHdpZGdldERlZmF1bHRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBldmVudCkgewotCQkJLy8gZG8gbm90aGluZwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLQkJCXN1cGVyLnNldFZpc2libGUodmlzaWJsZSk7Ci0KLQkJCWlmICh2aXNpYmxlKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkgPT0gbnVsbCkgewotCQkJCQkJZ2VuZXJhdG9yLnNldEdyYW1tYXJVUkkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFVSSSgpKTsKLQkJCQkJCWdlbmVyYXRvci5zZXRYTUxDYXRhbG9nRW50cnkoc2VsZWN0R3JhbW1hckZpbGVQYWdlLmdldFhNTENhdGFsb2dFbnRyeSgpKTsKLQkJCQkJfQotCQkJCQlBc3NlcnQuaXNOb3ROdWxsKGdlbmVyYXRvci5nZXRHcmFtbWFyVVJJKCkpOwotCi0JCQkJCWlmIChnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpID09IG51bGwpIHsKLQkJCQkJCWZpbmFsIFN0cmluZ1tdIGVycm9ySW5mbyA9IG5ldyBTdHJpbmdbMl07Ci0JCQkJCQlmaW5hbCBDTURvY3VtZW50W10gY21kb2NzID0gbmV3IENNRG9jdW1lbnRbMV07Ci0JCQkJCQlSdW5uYWJsZSByID0gbmV3IFJ1bm5hYmxlKCkgewotCQkJCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCQkJY21kb2NzWzBdID0gTmV3WE1MR2VuZXJhdG9yLmNyZWF0ZUNNRG9jdW1lbnQoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSwgZXJyb3JJbmZvKTsKLQkJCQkJCQl9Ci0JCQkJCQl9OwotCQkJCQkJb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yLnNob3dXaGlsZShEaXNwbGF5LmdldEN1cnJlbnQoKSwgcik7Ci0KLQkJCQkJCWdlbmVyYXRvci5zZXRDTURvY3VtZW50KGNtZG9jc1swXSk7Ci0JCQkJCQljbURvY3VtZW50RXJyb3JNZXNzYWdlID0gZXJyb3JJbmZvWzFdOwotCQkJCQl9Ci0KLQkJCQkJaWYgKGdlbmVyYXRvci5nZXRDTURvY3VtZW50KCkgIT0gbnVsbCAmJiBjbURvY3VtZW50RXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCQkJCUNNTmFtZWROb2RlTWFwIG5hbWVOb2RlTWFwID0gZ2VuZXJhdG9yLmdldENNRG9jdW1lbnQoKS5nZXRFbGVtZW50cygpOwotCQkJCQkJVmVjdG9yIG5hbWVOb2RlVmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVOb2RlTWFwLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBjbUVsZW1lbnREZWNsYXJhdGlvbiA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgbmFtZU5vZGVNYXAuaXRlbShpKTsKLQkJCQkJCQlPYmplY3QgdmFsdWUgPSBjbUVsZW1lbnREZWNsYXJhdGlvbi5nZXRQcm9wZXJ0eSgiQWJzdHJhY3QiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCWlmICh2YWx1ZSAhPSBCb29sZWFuLlRSVUUpIHsKLQkJCQkJCQkJbmFtZU5vZGVWZWN0b3IuYWRkKGNtRWxlbWVudERlY2xhcmF0aW9uLmdldEVsZW1lbnROYW1lKCkpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJT2JqZWN0W10gbmFtZU5vZGVBcnJheSA9IG5hbWVOb2RlVmVjdG9yLnRvQXJyYXkoKTsKLQkJCQkJCWlmIChuYW1lTm9kZUFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCQkJCQlBcnJheXMuc29ydChuYW1lTm9kZUFycmF5LCBDb2xsYXRvci5nZXRJbnN0YW5jZSgpKTsKLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIGRlZmF1bHRSb290TmFtZSA9IChTdHJpbmcpIChnZW5lcmF0b3IuZ2V0Q01Eb2N1bWVudCgpKS5nZXRQcm9wZXJ0eSgiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL2RlZmF1bHRSb290TmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpbnQgZGVmYXVsdFJvb3RJbmRleCA9IC0xOwotCQkJCQkJY29tYm8ucmVtb3ZlQWxsKCk7Ci0KLQotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lTm9kZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQkJCQkJU3RyaW5nIGVsZW1lbnROYW1lID0gKFN0cmluZykgbmFtZU5vZGVBcnJheVtpXTsKLQotCQkJCQkJCWNvbWJvLmFkZChlbGVtZW50TmFtZSk7Ci0JCQkJCQkJaWYgKGRlZmF1bHRSb290TmFtZSAhPSBudWxsICYmIGRlZmF1bHRSb290TmFtZS5lcXVhbHMoZWxlbWVudE5hbWUpKSB7Ci0JCQkJCQkJCWRlZmF1bHRSb290SW5kZXggPSBpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJaWYgKG5hbWVOb2RlQXJyYXkubGVuZ3RoID4gMCkgewotCQkJCQkJCWRlZmF1bHRSb290SW5kZXggPSBkZWZhdWx0Um9vdEluZGV4ICE9IC0xID8gZGVmYXVsdFJvb3RJbmRleCA6IDA7Ci0JCQkJCQkJY29tYm8uc2VsZWN0KGRlZmF1bHRSb290SW5kZXgpOwotCQkJCQkJCWdlbmVyYXRvci5zZXRSb290RWxlbWVudE5hbWUoY29tYm8uZ2V0SXRlbShkZWZhdWx0Um9vdEluZGV4KSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQlpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5lbmRzV2l0aCgieHNkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoeHNkT3B0aW9uc1BhbmVsKTsKLQkJCQkJCWdlbmVyYXRvci5zZXREZWZhdWx0U3lzdGVtSWQoZ2V0RGVmYXVsdFN5c3RlbUlkKCkpOwotCQkJCQkJZ2VuZXJhdG9yLmNyZWF0ZU5hbWVzcGFjZUluZm9MaXN0KCk7Ci0KLQkJCQkJCS8vIFByb3ZpZGUgZGVmYXVsdCBuYW1lc3BhY2UgcHJlZml4IGlmIG5vbmUKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2VuZXJhdG9yLm5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbykgZ2VuZXJhdG9yLm5hbWVzcGFjZUluZm9MaXN0LmdldChpKTsKLQkJCQkJCQlpZiAoKG5zaW5mby5wcmVmaXggPT0gbnVsbCB8fCBuc2luZm8ucHJlZml4LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSAmJiAobnNpbmZvLnVyaSAhPSBudWxsICYmIG5zaW5mby51cmkudHJpbSgpLmxlbmd0aCgpICE9IDApKSB7Ci0JCQkJCQkJCW5zaW5mby5wcmVmaXggPSBnZXREZWZhdWx0UHJlZml4KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQkJeHNkT3B0aW9uc1BhbmVsLnNldE5hbWVzcGFjZUluZm9MaXN0KGdlbmVyYXRvci5uYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAoZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5lbmRzV2l0aCgiZHRkIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJewotCQkJCQkJcGFnZUJvb2suc2hvd1BhZ2UoZHRkT3B0aW9uc1BhbmVsKTsKLQkJCQkJCWR0ZE9wdGlvbnNQYW5lbC51cGRhdGUoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQkJLy8gWE1MQnVpbGRlclBsdWdpbi5nZXRQbHVnaW4oKS5nZXRNc2dMb2dnZXIoKS53cml0ZUN1cnJlbnRUaHJlYWQoKTsKLQkJCQl9Ci0KLQkJCQkvKgotCQkJCSAqIFN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7IGlmCi0JCQkJICogKGVycm9yTWVzc2FnZSA9PSBudWxsKSBzdXBlci5zZXRWaXNpYmxlKHZpc2libGUpOwotCQkJCSAqLwotCi0JCQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQl9Ci0JCX0KLQotCQlwcml2YXRlIFN0cmluZyBnZXREZWZhdWx0UHJlZml4KExpc3QgbnNJbmZvTGlzdCkgewotCQkJU3RyaW5nIGRlZmF1bHRQcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuc0luZm9MaXN0ID09IG51bGwpCi0JCQkJcmV0dXJuIGRlZmF1bHRQcmVmaXg7Ci0KLQkJCVZlY3RvciB2ID0gbmV3IFZlY3RvcigpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBuc0luZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbykgbnNJbmZvTGlzdC5nZXQoaSk7Ci0JCQkJaWYgKG5zaW5mby5wcmVmaXggIT0gbnVsbCkKLQkJCQkJdi5hZGRFbGVtZW50KG5zaW5mby5wcmVmaXgpOwotCQkJfQotCi0JCQlpZiAodi5jb250YWlucyhkZWZhdWx0UHJlZml4KSkgewotCQkJCVN0cmluZyBzID0gZGVmYXVsdFByZWZpeDsKLQkJCQlmb3IgKGludCBqID0gMDsgdi5jb250YWlucyhzKTsgaisrKSB7Ci0JCQkJCXMgPSBkZWZhdWx0UHJlZml4ICsgSW50ZWdlci50b1N0cmluZyhqKTsKLQkJCQl9Ci0JCQkJcmV0dXJuIHM7Ci0JCQl9Ci0JCQlyZXR1cm4gZGVmYXVsdFByZWZpeDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzUGFnZUNvbXBsZXRlKCkgewotCQkJYm9vbGVhbiBjb21wbGV0ZSA9IChnZW5lcmF0b3IuZ2V0Um9vdEVsZW1lbnROYW1lKCkgIT0gbnVsbCAmJiBnZW5lcmF0b3IuZ2V0Um9vdEVsZW1lbnROYW1lKCkubGVuZ3RoKCkgPiAwKSAmJiBnZXRFcnJvck1lc3NhZ2UoKSA9PSBudWxsOwotCi0JCQlpZiAoY29tcGxldGUpIHsKLQkJCQkvKgotCQkJCSAqIGludCBidWlsZFBvbGljeSA9IHJhZGlvQnV0dG9uWzBdLmdldFNlbGVjdGlvbigpID8KLQkJCQkgKiBET01Db250ZW50QnVpbGRlci5CVUlMRF9PTkxZX1JFUVVJUkVEX0NPTlRFTlQgOgotCQkJCSAqIERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX0FMTF9DT05URU5UOwotCQkJCSAqLwotCQkJCWludCBidWlsZFBvbGljeSA9IDA7Ci0JCQkJaWYgKHJhZGlvQnV0dG9uWzBdLmdldFNlbGVjdGlvbigpKQotCQkJCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfT1BUSU9OQUxfQVRUUklCVVRFUzsKLQkJCQlpZiAocmFkaW9CdXR0b25bMV0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgfCBET01Db250ZW50QnVpbGRlci5CVUlMRF9PUFRJT05BTF9FTEVNRU5UUzsKLQkJCQlpZiAocmFkaW9CdXR0b25bMl0uZ2V0U2VsZWN0aW9uKCkpCi0JCQkJCWJ1aWxkUG9saWN5ID0gYnVpbGRQb2xpY3kgfCBET01Db250ZW50QnVpbGRlci5CVUlMRF9GSVJTVF9DSE9JQ0UgfCBET01Db250ZW50QnVpbGRlci5CVUlMRF9GSVJTVF9TVUJTVElUVVRJT047Ci0JCQkJaWYgKHJhZGlvQnV0dG9uWzNdLmdldFNlbGVjdGlvbigpKQotCQkJCQlidWlsZFBvbGljeSA9IGJ1aWxkUG9saWN5IHwgRE9NQ29udGVudEJ1aWxkZXIuQlVJTERfVEVYVF9OT0RFUzsKLQotCQkJCWdlbmVyYXRvci5zZXRCdWlsZFBvbGljeShidWlsZFBvbGljeSk7Ci0JCQl9Ci0KLQkJCXJldHVybiBjb21wbGV0ZTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBudWxsOwotCi0JCQlpZiAoY21Eb2N1bWVudEVycm9yTWVzc2FnZSAhPSBudWxsKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gY21Eb2N1bWVudEVycm9yTWVzc2FnZTsKLQkJCX0KLQkJCWVsc2UgaWYgKGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKSA9PSBudWxsIHx8IGdlbmVyYXRvci5nZXRSb290RWxlbWVudE5hbWUoKS5sZW5ndGgoKSA9PSAwKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MV2l6YXJkc01lc3NhZ2VzLl9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JCQl9Ci0KLQkJCXJldHVybiBlcnJvck1lc3NhZ2U7Ci0JCX0KLQotCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCVN0cmluZyBlcnJvck1lc3NhZ2UgPSBjb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQlpZiAoZXJyb3JNZXNzYWdlID09IG51bGwpIHsKLQkJCQlpZiAoeHNkT3B0aW9uc1BhbmVsLmlzVmlzaWJsZSgpKSB7Ci0KLQkJCQkJZXJyb3JNZXNzYWdlID0geHNkT3B0aW9uc1BhbmVsLmNvbXB1dGVFcnJvck1lc3NhZ2UoKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZHRkT3B0aW9uc1BhbmVsLmlzVmlzaWJsZSgpKSB7Ci0JCQkJCWVycm9yTWVzc2FnZSA9IGR0ZE9wdGlvbnNQYW5lbC5jb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCQkJfQotCQkJfQotCQkJc2V0RXJyb3JNZXNzYWdlKGVycm9yTWVzc2FnZSk7Ci0JCQlzZXRQYWdlQ29tcGxldGUoaXNQYWdlQ29tcGxldGUoKSk7Ci0JCX0KLQl9Ci0KLQkvLyAvLy8vLy8vLy8vLy8vL0VuZCBTZWxlY3RSb290RWxlbWVudFBhZ2UKLQotCi0KLQlwdWJsaWMgc3RhdGljIEdyaWRMYXlvdXQgY3JlYXRlT3B0aW9uc1BhbmVsTGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQljbGFzcyBYU0RPcHRpb25zUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgewotCQlwcm90ZWN0ZWQgU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCXByb3RlY3RlZCBTZWxlY3RSb290RWxlbWVudFBhZ2UgcGFyZW50UGFnZTsKLQkJcHJvdGVjdGVkIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIGVkaXROYW1lc3BhY2VzOwotCi0JCXB1YmxpYyBYU0RPcHRpb25zUGFuZWwoU2VsZWN0Um9vdEVsZW1lbnRQYWdlIHBhcmVudFBhZ2UsIENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQkJdGhpcy5wYXJlbnRQYWdlID0gcGFyZW50UGFnZTsKLQotCQkJc2V0TGF5b3V0KGNyZWF0ZU9wdGlvbnNQYW5lbExheW91dCgpKTsKLQkJCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlDb21wb3NpdGUgY28gPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJCWNvLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkJaWYgKG5ld0ZpbGVQYWdlICE9IG51bGwgJiYgbmV3RmlsZVBhZ2UuZ2V0Q29udGFpbmVyRnVsbFBhdGgoKSAhPSBudWxsKSB7Ci0JCQkJLy8gdG9kby4uLiB0aGlzIGlzIGEgbmFzdHkgbWVzcy4gSSBuZWVkIHRvIHJldmlzdCB0aGlzIGNvZGUuCi0JCQkJLy8KLQkJCQlTdHJpbmcgcmVzb3VyY2VVUkkgPSAicGxhdGZvcm06L3Jlc291cmNlIiArIG5ld0ZpbGVQYWdlLmdldENvbnRhaW5lckZ1bGxQYXRoKCkudG9TdHJpbmcoKSArICIvZHVtbXkiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlTdHJpbmcgcmVzb2x2ZWRQYXRoID0gVVJJSGVscGVyLm5vcm1hbGl6ZShyZXNvdXJjZVVSSSwgbnVsbCwgbnVsbCk7Ci0JCQkJaWYgKHJlc29sdmVkUGF0aC5zdGFydHNXaXRoKCJmaWxlOi8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCXsKLQkJCQkJcmVzb2x2ZWRQYXRoID0gcmVzb2x2ZWRQYXRoLnN1YnN0cmluZyg2KTsKLQkJCQl9Ci0JCQkJLy8gZW5kIG5hc3R5IG1lc3NzCi0JCQkJU3RyaW5nIHRhYmxlVGl0bGUgPSBYTUxXaXphcmRzTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVTUEFDRV9JTkZPUk1BVElPTjsKLQkJCQllZGl0TmFtZXNwYWNlcyA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhjbywgbmV3IFBhdGgocmVzb2x2ZWRQYXRoKSwgdGFibGVUaXRsZSwgdHJ1ZSwgdHJ1ZSk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJCWVkaXROYW1lc3BhY2VzLnNldE5hbWVzcGFjZUluZm9MaXN0KGxpc3QpOwotCQkJZWRpdE5hbWVzcGFjZXMudXBkYXRlRXJyb3JNZXNzYWdlKGxpc3QpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJCU5hbWVzcGFjZUluZm9FcnJvckhlbHBlciBoZWxwZXIgPSBuZXcgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCk7Ci0JCQllcnJvck1lc3NhZ2UgPSBoZWxwZXIuY29tcHV0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCwgbnVsbCk7Ci0JCQlwYXJlbnRQYWdlLnVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCQl9Ci0KLQotCQlwdWJsaWMgU3RyaW5nIGNvbXB1dGVFcnJvck1lc3NhZ2UoKSB7Ci0JCQlyZXR1cm4gZXJyb3JNZXNzYWdlOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiAKLQkgKi8KLQlwdWJsaWMgY2xhc3MgRFRET3B0aW9uc1BhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCQlwcm90ZWN0ZWQgR3JvdXAgZ3JvdXA7Ci0JCXByb3RlY3RlZCBUZXh0IHN5c3RlbUlkRmllbGQ7Ci0JCXByb3RlY3RlZCBUZXh0IHB1YmxpY0lkRmllbGQ7Ci0JCXByb3RlY3RlZCBTZWxlY3RSb290RWxlbWVudFBhZ2UgcGFyZW50UGFnZTsKLQotCQlwdWJsaWMgRFRET3B0aW9uc1BhbmVsKFNlbGVjdFJvb3RFbGVtZW50UGFnZSBwYXJlbnRQYWdlLCBDb21wb3NpdGUgcGFyZW50KSB7Ci0JCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJCXRoaXMucGFyZW50UGFnZSA9IHBhcmVudFBhZ2U7Ci0JCQlzZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJc2V0TGF5b3V0KGNyZWF0ZU9wdGlvbnNQYW5lbExheW91dCgpKTsKLQkJCUdyb3VwIGdyb3VwID0gbmV3IEdyb3VwKHRoaXMsIFNXVC5OT05FKTsKLQkJCWdyb3VwLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9ET0NUWVBFX0lORk9STUFUSU9OKTsKLQotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQkJZ3JvdXAuc2V0TGF5b3V0KGxheW91dCk7Ci0JCQlncm91cC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQotCQkJTGFiZWwgcHVibGljSWRMYWJlbCA9IG5ldyBMYWJlbChncm91cCwgU1dULk5PTkUpOwotCQkJcHVibGljSWRMYWJlbC5zZXRUZXh0KFhNTFdpemFyZHNNZXNzYWdlcy5fVUlfTEFCRUxfUFVCTElDX0lEKTsKLQkJCXB1YmxpY0lkRmllbGQgPSBuZXcgVGV4dChncm91cCwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQkJcHVibGljSWRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCXB1YmxpY0lkRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIodGhpcyk7Ci0JCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHB1YmxpY0lkRmllbGQsIElYTUxXaXphcmRIZWxwQ29udGV4dElkcy5YTUxfTkVXV0laQVJEX1NFTEVDVFJPT1RFTEVNRU5UNV9IRUxQSUQpOwotCi0JCQlMYWJlbCBzeXN0ZW1JZExhYmVsID0gbmV3IExhYmVsKGdyb3VwLCBTV1QuTk9ORSk7Ci0JCQlzeXN0ZW1JZExhYmVsLnNldFRleHQoWE1MV2l6YXJkc01lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSUQpOwotCQkJc3lzdGVtSWRGaWVsZCA9IG5ldyBUZXh0KGdyb3VwLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlzeXN0ZW1JZEZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQkJc3lzdGVtSWRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoc3lzdGVtSWRGaWVsZCwgSVhNTFdpemFyZEhlbHBDb250ZXh0SWRzLlhNTF9ORVdXSVpBUkRfU0VMRUNUUk9PVEVMRU1FTlQ2X0hFTFBJRCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCB1cGRhdGUoKSB7Ci0JCQlTdHJpbmcgdGhlUHVibGljSWQgPSBudWxsOwotCQkJU3RyaW5nIHRoZVN5c3RlbUlkID0gbnVsbDsKLQkJCUlDYXRhbG9nRW50cnkgeG1sQ2F0YWxvZ0VudHJ5ID0gZ2VuZXJhdG9yLmdldFhNTENhdGFsb2dFbnRyeSgpOwotCi0JCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5ICE9IG51bGwpIHsKLQkJCQlpZiAoeG1sQ2F0YWxvZ0VudHJ5LmdldEVudHJ5VHlwZSgpID09IElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9QVUJMSUMpIHsKLQkJCQkJdGhlUHVibGljSWQgPSB4bWxDYXRhbG9nRW50cnkuZ2V0S2V5KCk7Ci0JCQkJCXRoZVN5c3RlbUlkID0geG1sQ2F0YWxvZ0VudHJ5LmdldEF0dHJpYnV0ZVZhbHVlKElDYXRhbG9nRW50cnkuQVRUUl9XRUJfVVJMKTsKLQkJCQkJaWYgKHRoZVN5c3RlbUlkID09IG51bGwpIHsKLQkJCQkJCXRoZVN5c3RlbUlkID0gZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKS5zdGFydHNXaXRoKCJodHRwOiIpID8gZ2VuZXJhdG9yLmdldEdyYW1tYXJVUkkoKSA6IFVSSUhlbHBlci5nZXRMYXN0U2VnbWVudChnZW5lcmF0b3IuZ2V0R3JhbW1hclVSSSgpKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQl0aGVTeXN0ZW1JZCA9IHhtbENhdGFsb2dFbnRyeS5nZXRLZXkoKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQl0aGVTeXN0ZW1JZCA9IGdldERlZmF1bHRTeXN0ZW1JZCgpOwotCQkJfQotCi0JCQlwdWJsaWNJZEZpZWxkLnNldFRleHQodGhlUHVibGljSWQgIT0gbnVsbCA/IHRoZVB1YmxpY0lkIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQodGhlU3lzdGVtSWQgIT0gbnVsbCA/IHRoZVN5c3RlbUlkIDogIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJCWdlbmVyYXRvci5zZXRTeXN0ZW1JZChzeXN0ZW1JZEZpZWxkLmdldFRleHQoKSk7Ci0JCQlnZW5lcmF0b3Iuc2V0UHVibGljSWQocHVibGljSWRGaWVsZC5nZXRUZXh0KCkpOwotCQkJcGFyZW50UGFnZS51cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZSgpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MSW1wb3J0QWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyZGQyNC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTEltcG9ydEFjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkczsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotCi0vLyBUT0RPIGNzLi4uIHJlbmFtZSB0aGlzIGNsYXNzIE5ld1hNTEFjdGlvbkRlbGVnYXRlCi0vLyB3ZSBuZWVkIHRvIHJlLWFkZCBwcmUtdmFsaWRhdGlvbiB1c2luZyB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsgQVBJJ3MKLS8vIHNpbmNlIHdlIGFsc28gbmVlZCB0byBhZGQgdmFsaWRhdGlvbiB0byB0aGUgJ05ldyBYTUwnIGNhc2UsIHRoaXMgcHJldmFsaWRhdGlvbgotLy8gZnVuY3Rpb24gc2hvdWxkIHJlYWxseSBnbyBpbnRvIHRoZSBOZXdXaXphcmQgc29tZXdoZXJlCi0vLwotcHVibGljIGNsYXNzIFhNTEltcG9ydEFjdGlvbkRlbGVnYXRlIGltcGxlbWVudHMgSUFjdGlvbkRlbGVnYXRlCi17IAotICAvKioKLSAgICogQ2hlY2tzIHRoZSBjdXJyZW50IHNlbGVjdGlvbiBhbmQgcnVucyB0aGUgc2VwYXJhdGUgYnJvd3NlcgotICAgKiB0byBzaG93IHRoZSBjb250ZW50IG9mIHRoZSBSZWFkbWUgZmlsZS4gVGhpcyBjb2RlIHNob3dzIGhvdwotICAgKiB0byBsYXVuY2ggc2VwYXJhdGUgYnJvd3NlcnMgdGhhdCBhcmUgbm90IFZBL0Jhc2UgZGVza3RvcCBwYXJ0cy4KLSAgICoKLSAgICogQHBhcmFtIGFjdGlvbiAgdGhlIGFjdGlvbiB0aGF0IHdhcyBwZXJmb3JtZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikKLSAgewotICAgIElXb3JrYmVuY2hXaW5kb3cgd29ya2JlbmNoV2luZG93ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKTsKLSAgICBJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHdvcmtiZW5jaFdpbmRvdy5nZXRTZWxlY3Rpb25TZXJ2aWNlKCkuZ2V0U2VsZWN0aW9uKCk7Ci0gICAgT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gZ2V0U2VsZWN0aW9uKHNlbGVjdGlvbik7Ci0KLSAgICBpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJRmlsZSAmJiBzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikKLSAgICB7Ci0gICAgICBJRmlsZSBmaWxlID0gKElGaWxlKXNlbGVjdGVkT2JqZWN0OwotICAgICAgSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IChJU3RydWN0dXJlZFNlbGVjdGlvbilzZWxlY3Rpb247ICAgIAotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIE5ld1hNTFdpemFyZC5zaG93RGlhbG9nKHdvcmtiZW5jaFdpbmRvdy5nZXRTaGVsbCgpLCBmaWxlLCBzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgLy9YTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRMb2coKS5sb2coKTsKLSAgICAgIH0gICAgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIHVudXNlZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChJQWN0aW9uIGFjdGlvbiwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pCi0gIHsKLSAgICAvLyB1bnVzZWQKLSAgfQotCi0gIC8vIHNjYW1tZWQgZnJvbSBXaW5kb3dVdGlsaXR5Ci0gIC8vCi0gIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikKLSAgewotICAgIGlmIChzZWxlY3Rpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9IC8vIGVuZCBvZiBpZiAoKQotCi0gICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKQotICAgIHsKLSAgICAgICBJU3RydWN0dXJlZFNlbGVjdGlvbiBlcz0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKXNlbGVjdGlvbjsKLSAgICAgICBJdGVyYXRvciBpPSBlcy5pdGVyYXRvcigpOwotICAgICAgIGlmIChpLmhhc05leHQoKSkKLSAgICAgICB7Ci0gICAgICAgICByZXN1bHQ9IGkubmV4dCgpOwotICAgICAgIH0KLSAgICB9CQkJCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfSAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFNjaGVtYVZhbGlkYXRpb25DaGVja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYzRhMzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5JRmlsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkVycm9ySGFuZGxlcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247Ci0KLXB1YmxpYyBjbGFzcyBYTUxTY2hlbWFWYWxpZGF0aW9uQ2hlY2tlciB7Ci0JcHVibGljIGJvb2xlYW4gaXNWYWxpZChJRmlsZSBpZmlsZSkgewotCQlTdHJpbmcgeHNkRmlsZU5hbWUgPSBpZmlsZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCXJldHVybiBpc1ZhbGlkKHhzZEZpbGVOYW1lKTsKLQl9Ci0JLyoqCi0JICogU2hvdWxkIHRoaXMgYmUgaW1wbGVtZW50ZWQgYXMgYSBWYWxpZGF0b3IgYW5kIHNpbXBseSBjYWxsZWQgYXMgc3VjaCB3aXRoCi0JICogYSByZXBvcnRlciB0aGF0IG9ubHkgY2hlY2tzIHRoZSByZXN1bHRzIGZvciBzZXZlcml0eSA9IGVycm9yPyAgT3Igc2hvdWxkCi0JICogdGhlIFhlcmNlcyByZXF1aXJlbWVudCBiZSBicm9rZW4gdXNpbmcgYSBwbHVnLWluIGV4dGVuc2lvbj8KLQkgKi8KLQotCXB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHhzZEZpbGVOYW1lKSB7Ci0vLwkJRE9NQVNCdWlsZGVySW1wbCBidWlsZGVyID0gbmV3IERPTUFTQnVpbGRlckltcGwoKTsKLS8vCQlET01FcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyID0gbmV3IERPTUVycm9ySGFuZGxlcigpOwotLy8JCWJ1aWxkZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7Ci0JCXRyeSB7Ci0JCQkvL1N0cmluZyB1cmkgPSAKLQkJCQlVUklIZWxwZXIuZ2V0VVJJRm9yRmlsZVBhdGgoeHNkRmlsZU5hbWUpOwotLy8JCQlBU01vZGVsIG1vZGVsID0gYnVpbGRlci5wYXJzZUFTVVJJKHVyaSk7Ci0vLwkJCWlmIChlcnJvckhhbmRsZXIuaGFzRXJyb3IoKSkKLS8vCQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIC8vIGludmFsaWQgc2NoZW1hCi0JCQl7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQkvLyBpbm5lciBjbGFzcwotCWNsYXNzIERPTUVycm9ySGFuZGxlciBpbXBsZW1lbnRzIEVycm9ySGFuZGxlciB7Ci0JCXByaXZhdGUgYm9vbGVhbiBoYXNFcnJvciA9IGZhbHNlOwotCi0JCXB1YmxpYyBib29sZWFuIGhhc0Vycm9yKCkgewotCQkJcmV0dXJuIGhhc0Vycm9yOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZXJyb3IoU0FYUGFyc2VFeGNlcHRpb24gZXJyKSB7Ci0JCQloYXNFcnJvciA9IHRydWU7Ci0JCX0KLQkJcHVibGljIHZvaWQgZmF0YWxFcnJvcihTQVhQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHRocm93cyBTQVhFeGNlcHRpb24gewotCQkJaGFzRXJyb3IgPSB0cnVlOwotCQl9Ci0JCXB1YmxpYyB2b2lkIHdhcm5pbmcoU0FYUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHsKLQkJCS8vIG5vdCBhbiBlcnJvcgotCQl9Ci0JfSAvLyBlbmQgRE9NRXJyb3JIYW5kbGVySW1wbAotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9YTUxXaXphcmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjYWZlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLQotcHVibGljIGNsYXNzIFhNTFdpemFyZAotewotICBwcm90ZWN0ZWQgc3RhdGljIFhNTFdpemFyZCBpbnN0YW5jZSA9IG5ldyBYTUxXaXphcmQoKTsKLQotICBwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxXaXphcmQgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIAotICBwdWJsaWMgWE1MV2l6YXJkKCkKLSAgewotICAgIGluc3RhbmNlID0gdGhpczsKLQotICB9Ci0gIAotICBwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihTdHJpbmcgbmFtZSkKLSAgewotICAgIHRyeSB7Ci0gICAgICBVUkwgdXJsPSBuZXcgVVJMKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIpLmdldEVudHJ5KCIvIiksIG5hbWUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuY3JlYXRlRnJvbVVSTCh1cmwpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpOwotICAgIH0KLSAgfSAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkc01lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL1hNTFdpemFyZHNNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzU4NGYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvWE1MV2l6YXJkc01lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAgIFRoaXMKLSAqIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YKLSAqIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcwotICogYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogCi0gKiBJQk0gLSBJbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLndpemFyZHM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotCi0vKioKLSAqIFN0cmluZ3MgdXNlZCBieSBYTUwgV2l6YXJkcwotICogCi0gKiBAcGxhbm5lZGZvciAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFdpemFyZHNNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwud2l6YXJkcy53aXphcmRSZXNvdXJjZSI7Ly8kTk9OLU5MUy0xJAotCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19ORVdfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19USVRMRV9JTlZBTElEX0dSQU1NQVI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0RJQUxPR19NRVNTQUdFX0lOVkFMSURfR1JBTU1BUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fWE1MX0ZST01fRFREOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9SQURJT19YTUxfRlJPTV9TQ0hFTUE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1JBRElPX1hNTF9GUk9NX1NDUkFUQ0g7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0VYUEw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfSEVBRElORzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX0RFU0M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfRFREX0ZJTEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfWFNEX0ZJTEVfREVTQzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX1NFTEVDVF9ST09UX0hFQURJTkc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9FWFBMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ST09UX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfVElUTEVfTk9fUk9PVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NU0dfTk9fUk9PVF9FTEVNRU5UUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTk9fTE9DQVRJT05fSElOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTVNHX05PX0xPQ0FUSU9OX0hJTlRfMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NPTlRFTlRfT1BUSU9OUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRDsvLyBjb21tZW50ZWQgb3V0Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUw7Ly8gY29tbWVudGVkIG91dAotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0FUVFJJQlVURVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfT1BUSU9OQUxfRUxFTUVOVFM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dJWkFSRF9DUkVBVEVfRklSU1RfQ0hPSUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XSVpBUkRfRklMTF9FTEVNRU5UU19BTkRfQVRUUklCVVRFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRE9DVFlQRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1lTVEVNX0lEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QVUJMSUNfSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfVVJJX05PVF9GT1VORF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9CQURfRklMRU5BTUVfRVhURU5TSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9GSUxFX0FMUkVBRFlfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX1NDSEVNQV9JTlZBTElEX0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX0RURF9JTlZBTElEX0lORk87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VSUk9SX0NBVEFMT0dfRU5UUllfSU5WQUxJRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkFNRVNQQUNFX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpb25fUGx1Z2luc19VbmF2YWlsYWJsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBWYWxpZGF0aW9uX2Nhbm5vdF9iZV9wZXJmb3JtZWQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbk9wZXJhdGlvbl9vcF9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzY19wcm9qOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfdGl0bGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vcF9lcnJvcl90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX29wX2Vycm9yX21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV90aXRsZTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX292ZXJ3cml0ZXF1ZXJ5X21lc3NhZ2U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VfZXJyb3JfYWxyZWFkeWV4aXN0czsKLQkKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE5ld1hNTFRlbXBsYXRlc1dpemFyZFBhZ2VfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzY7Ci0KLQlzdGF0aWMgewotCQkvLyBsb2FkIG1lc3NhZ2UgdmFsdWVzIGZyb20gYnVuZGxlIGZpbGUKLQkJTkxTLmluaXRpYWxpemVNZXNzYWdlcyhCVU5ETEVfTkFNRSwgWE1MV2l6YXJkc01lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTFdpemFyZHNNZXNzYWdlcygpIHsKLQkJLy8gY2Fubm90IGNyZWF0ZSBuZXcgaW5zdGFuY2UKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL2ljb25zL2dlbmVyYXRleG1sX3dpei5naWYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjLXdpemFyZHMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC93aXphcmRzL2ljb25zL2dlbmVyYXRleG1sX3dpei5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNGY2NjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy9pY29ucy9nZW5lcmF0ZXhtbF93aXouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy93aXphcmRSZXNvdXJjZS5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy13aXphcmRzL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvd2l6YXJkcy93aXphcmRSZXNvdXJjZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGNmNjYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMtd2l6YXJkcy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3dpemFyZHMvd2l6YXJkUmVzb3VyY2UucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNTCBUb29scyAtICBOZXcgWE1MIFdpemFyZAotISBQYWNrYWdlZCBmb3IgdHJhbnNsYXRpb24gaW46ICB4bWwuemlwCi0KLSFYTUxJbXBvcnRBY3Rpb25EZWxlZ2F0ZQotX1VJX0RJQUxPR19ORVdfVElUTEUgICAgICAgID0gTmV3Ci1fVUlfRElBTE9HX1RJVExFX0lOVkFMSURfR1JBTU1BUiA9IEludmFsaWQgR3JhbW1hcgotX1VJX0RJQUxPR19NRVNTQUdFX0lOVkFMSURfR1JBTU1BUiA9IFRoZSBncmFtbWFyIGZpbGUgY29udGFpbnMgZXJyb3JzLiBJZiB5b3UgcHJvY2VlZCwgYW4gaW5jb3JyZWN0IHJlc3VsdCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkLiBEbyB5b3Ugd2FudCB0byBjb250aW51ZT8KLQotIU5ld1hNTEJXaXphcmQKLV9VSV9SQURJT19YTUxfRlJPTV9EVEQgICAgICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSBhICZEVEQgZmlsZQotX1VJX1JBRElPX1hNTF9GUk9NX1NDSEVNQSAgICAgICAgICAgICA9IENyZWF0ZSBYTUwgZmlsZSBmcm9tIGFuICZYTUwgc2NoZW1hIGZpbGUKLV9VSV9SQURJT19YTUxfRlJPTV9TQ1JBVENIICAgICAgICAgICAgPSBDcmVhdGUgWE1MIGZpbGUgZnJvbSAmc2NyYXRjaAotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0hFQURJTkcgICAgICAgICA9IENyZWF0ZSBYTUwgRmlsZQotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0VYUEwgICAgICAgICAgICA9IFNlbGVjdCBob3cgeW91IHdvdWxkIGxpa2UgdG8gY3JlYXRlIHlvdXIgWE1MIGZpbGUuCi1fVUlfV0laQVJEX0NSRUFURV9YTUxfRklMRV9IRUFESU5HICAgID0gWE1MIEZpbGUgTmFtZQotX1VJX1dJWkFSRF9DUkVBVEVfWE1MX0ZJTEVfRVhQTCAgICAgICA9IFNwZWNpZnkgYSBuYW1lIGZvciB0aGUgbmV3IFhNTCBmaWxlLgotX1VJX1dJWkFSRF9TRUxFQ1RfRFREX0ZJTEVfREVTQyAgICAgICA9IFNlbGVjdCB0aGUgRFREIGZpbGUgdG8gY3JlYXRlIHRoZSBYTUwgZmlsZS4KLV9VSV9XSVpBUkRfU0VMRUNUX0RURF9GSUxFX1RJVExFICAgICAgPSBTZWxlY3QgRFREIEZpbGUKLV9VSV9XSVpBUkRfU0VMRUNUX1hTRF9GSUxFX0RFU0MgICAgICAgPSBTZWxlY3QgdGhlIHNjaGVtYSBmaWxlIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuCi1fVUlfV0laQVJEX1NFTEVDVF9YU0RfRklMRV9USVRMRSAgICAgID0gU2VsZWN0IFhNTCBTY2hlbWEgRmlsZQotX1VJX1dJWkFSRF9TRUxFQ1RfUk9PVF9IRUFESU5HICAgICAgICA9IFNlbGVjdCBSb290IEVsZW1lbnQKLV9VSV9XSVpBUkRfU0VMRUNUX1JPT1RfRVhQTCAgICAgICAgICAgPSBTZWxlY3QgdGhlIHJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIGZpbGUuCi1fVUlfTEFCRUxfUk9PVF9FTEVNRU5UICAgICAgICAgICAgICAgID0gUm9vdCBlbGVtZW50OgotX1VJX1dBUk5JTkdfVElUTEVfTk9fUk9PVF9FTEVNRU5UUyAgICA9IE5vIFJvb3QgRWxlbWVudHMKLV9VSV9XQVJOSU5HX01TR19OT19ST09UX0VMRU1FTlRTICAgICAgPSBObyByb290IGVsZW1lbnQgZXhpc3RzIHNpbmNlIHRoZSBzY2hlbWEgcHJvdmlkZWQgaGFzIG5vIGdsb2JhbCBlbGVtZW50cy4KLV9VSV9MQUJFTF9OT19MT0NBVElPTl9ISU5UICAgICAgICAgICAgPSBVbnNwZWNpZmllZCBOYW1lc3BhY2UgTG9jYXRpb24KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzEgICAgPSBZb3UgaGF2ZSBub3Qgc3BlY2lmaWVkIGEgbG9jYXRpb24gaGludCBmb3Igb25lIG9yIG1vcmUgbmFtZXNwYWNlIGVudHJpZXMuCi1fVUlfV0FSTklOR19NU0dfTk9fTE9DQVRJT05fSElOVF8yICAgID0gRWxlbWVudHMgZnJvbSB0aGVzZSBuYW1lc3BhY2VzIHdpbGwgbm90IGJlIGdlbmVyYXRlZC4gVGhpcyBtYXkgbGVhZCB0byBhbiBpbnZhbGlkIGdlbmVyYXRlZCBkb2N1bWVudC4KLV9VSV9XQVJOSU5HX01TR19OT19MT0NBVElPTl9ISU5UXzMgICAgPSBDbGljayBZZXMgdG8gY29udGludWUsIENsaWNrIE5vIHRvIGdvIGJhY2sgYW5kIHNwZWNpZnkgdGhlIGxvY2F0aW9uIGhpbnRzLgotX1VJX1dJWkFSRF9DT05URU5UX09QVElPTlMgICAgICAgICAgICA9IENvbnRlbnQgb3B0aW9ucwotCi1fVUlfV0laQVJEX0NSRUFURV9SRVFVSVJFRCAgICAgICAgICAgID0gJkNyZWF0ZSByZXF1aXJlZCBjb250ZW50IG9ubHkKLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMICAgICAgICAgICAgPSBDcmVhdGUgcmVxdWlyZWQgYW5kICZvcHRpb25hbCBjb250ZW50Ci0KLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0FUVFJJQlVURVMgPSBDcmVhdGUgb3B0aW9uYWwgJmF0dHJpYnV0ZXMKLV9VSV9XSVpBUkRfQ1JFQVRFX09QVElPTkFMX0VMRU1FTlRTICAgPSBDcmVhdGUgb3B0aW9uYWwgZSZsZW1lbnRzCi1fVUlfV0laQVJEX0NSRUFURV9GSVJTVF9DSE9JQ0UgICAgICAgID0gQ3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCAmY2hvaWNlCi1fVUlfV0laQVJEX0ZJTExfRUxFTUVOVFNfQU5EX0FUVFJJQlVURVMgPSBGaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggJmRhdGEKLQotX1VJX0xBQkVMX0RPQ1RZUEVfSU5GT1JNQVRJT04gICAgICAgICA9IERvY3VtZW50IHR5cGUgaW5mb3JtYXRpb24KLV9VSV9MQUJFTF9TWVNURU1fSUQgICAgICAgICAgICAgICAgICAgPSAmU3lzdGVtIElEOgotX1VJX0xBQkVMX1BVQkxJQ19JRCAgICAgICAgICAgICAgICAgICA9ICZQdWJsaWMgSUQ6Ci0KLV9VSV9XQVJOSU5HX1VSSV9OT1RfRk9VTkRfQ09MT04gICAgICAgPSBUaGUgc3BlY2lmaWVkIHJlc291cmNlIGNhbm5vdCBiZSBsb2NhdGVkIDoKLQotIU5ld01vZGVsV2l6YXJkCi1fVUlfSU5WQUxJRF9HUkFNTUFSX0VSUk9SICAgICAgICAgICAgID0gSW52YWxpZCBHcmFtbWFyCi0KLSFOZXdNb2RlbFdpemFyZAotX0VSUk9SX0JBRF9GSUxFTkFNRV9FWFRFTlNJT04gICAgICAgICA9IFRoZSBmaWxlIG5hbWUgbXVzdCBlbmQgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB7MH0uCi1fRVJST1JfRklMRV9BTFJFQURZX0VYSVNUUyAgICAgICAgICAgID0gVGhlIHNhbWUgZmlsZSBhbHJlYWR5IGV4aXN0cy4KLV9FUlJPUl9ST09UX0VMRU1FTlRfTVVTVF9CRV9TUEVDSUZJRUQgPSBBIHJvb3QgZWxlbWVudCBtdXN0IGJlIHNwZWNpZmllZC4KLV9VSV9MQUJFTF9FUlJPUl9TQ0hFTUFfSU5WQUxJRF9JTkZPICAgPSBUaGUgc2NoZW1hIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciBmb3IgZGV0YWlscy4KLV9VSV9MQUJFTF9FUlJPUl9EVERfSU5WQUxJRF9JTkZPICAgICAgPSBUaGUgRFREIGZpbGUgY29udGFpbnMgZXJyb3JzLiBPcGVuIGl0IGluIHRoZSBEVEQgZWRpdG9yIGZvciBkZXRhaWxzLgotCi1fVUlfTEFCRUxfRVJST1JfQ0FUQUxPR19FTlRSWV9JTlZBTElEID0gVGhlIHNlbGVjdGVkIGNhdGFsb2cgZW50cnkgc3BlY2lmaWVzIGEgVVJJIHRoYXQgY2FuIG5vdCBiZSBsb2NhdGVkLgotCi1fVUlfTEFCRUxfTkFNRVNQQUNFX0lORk9STUFUSU9OPU5hbWVzcGFjZSBJbmZvcm1hdGlvbgotVmFsaWRhdGlvbl9QbHVnaW5zX1VuYXZhaWxhYmxlPVZhbGlkYXRpb24gUGx1Z2lucyBVbmF2YWlsYWJsZQotVmFsaWRhdGlvbl9jYW5ub3RfYmVfcGVyZm9ybWVkPVZhbGlkYXRpb24gY2Fubm90IGJlIHBlcmZvcm1lZCBiZWNhdXNlIHRoZSB2YWxpZGF0aW9uIHBsdWdpbnMgd2VyZSBkaXNhYmxlZCBvciBub3QgZm91bmQuICBUaGUgZ2VuZXJhdGVkIGZpbGUgbWF5IGJlIGludmFsaWQuICBEbyB5b3Ugd2lzaCB0byBjb250aW51ZT8KLSMKLSMgRXhhbXBsZVByb2plY3QKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25PcGVyYXRpb25fb3BfZGVzYz1DcmVhdGluZyBleGFtcGxlIHByb2plY3RzLi4uCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uT3BlcmF0aW9uX29wX2Rlc2NfcHJvaj1Db25maWd1cmluZyBwcm9qZWN0Li4uCi1FeGFtcGxlUHJvamVjdENyZWF0aW9uV2l6YXJkX3RpdGxlPU5ldyBFeGFtcGxlIFByb2plY3QKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfdGl0bGU9UHJvamVjdCBDcmVhdGlvbiBGYWlsZWQKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3BfZXJyb3JfbWVzc2FnZT1Qcm9qZWN0IGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZF9vdmVyd3JpdGVxdWVyeV90aXRsZT1PdmVyd3JpdGUKLUV4YW1wbGVQcm9qZWN0Q3JlYXRpb25XaXphcmRfb3ZlcndyaXRlcXVlcnlfbWVzc2FnZT1EbyB5b3Ugd2FudCB0byBvdmVyd3JpdGUgezB9PwotRXhhbXBsZVByb2plY3RDcmVhdGlvbldpemFyZFBhZ2VfZXJyb3JfYWxyZWFkeWV4aXN0cz1Qcm9qZWN0IGFscmVhZHkgZXhpc3RzLgotCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzA9U2VsZWN0IFhNTCBUZW1wbGF0ZQotTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8xPVNlbGVjdCBhIHRlbXBsYXRlIGFzIGluaXRpYWwgY29udGVudCBpbiB0aGUgWE1MIHBhZ2UuCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzI9TmFtZQotTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV8zPURlc2NyaXB0aW9uCi1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzQ9VXNlIFhNTCBUZW1wbGF0ZQotTmV3WE1MVGVtcGxhdGVzV2l6YXJkUGFnZV81PVByZXZpZXc6Ci1OZXdYTUxUZW1wbGF0ZXNXaXphcmRQYWdlXzY9VGVtcGxhdGVzIGFyZSAnTmV3IFhNTCcgdGVtcGxhdGVzIGZvdW5kIGluIHRoZSA8YT5YTUwgVGVtcGxhdGVzPC9hPiBwcmVmZXJlbmNlIHBhZ2UuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiZjFmNTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL1N0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklBdXRvRWRpdFN0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHREb3VibGVDbGlja1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuSUNvbnRlbnRGb3JtYXR0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5mb3JtYXR0ZXIuTXVsdGlQYXNzQ29udGVudEZvcm1hdHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5JU291cmNlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZFBhcnRpdGlvbnM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmZvcm1hdC5TdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLlRleHRIb3Zlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkVkaXRvclV0aWxpdHk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmZvcm1hdC5Gb3JtYXRQcm9jZXNzb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnRleHQucnVsZXMuU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0LkF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQuU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Lk5vUmVnaW9uQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRvdWJsZWNsaWNrLlhNTERvdWJsZUNsaWNrU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsuWE1MSHlwZXJsaW5rRGV0ZWN0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZS5MaW5lU3R5bGVQcm92aWRlckZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm8uWE1MSW5mb3JtYXRpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRhZ2luZm8uWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yOwotCi0vKioKLSAqIENvbmZpZ3VyYXRpb24gZm9yIGEgc291cmNlIHZpZXdlciB3aGljaCBzaG93cyBYTUwgY29udGVudC4KLSAqIDxwPgotICogQ2xpZW50cyBjYW4gc3ViY2xhc3MgYW5kIG92ZXJyaWRlIGp1c3QgdGhvc2UgbWV0aG9kcyB3aGljaCBtdXN0IGJlIHNwZWNpZmljCi0gKiB0byB0aGVpciBuZWVkcy4KLSAqIDwvcD4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MIGV4dGVuZHMgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uIHsKLQkvKgotCSAqIE9uZSBpbnN0YW5jZSBwZXIgY29uZmlndXJhdGlvbiBiZWNhdXNlIG5vdCBzb3VyY2V2aWV3ZXItc3BlY2lmaWMgYW5kCi0JICogaXQncyBhIFN0cmluZyBhcnJheQotCSAqLwotCXByaXZhdGUgU3RyaW5nW10gZkNvbmZpZ3VyZWRDb250ZW50VHlwZXM7Ci0JLyoKLQkgKiBPbmUgaW5zdGFuY2UgcGVyIGNvbmZpZ3VyYXRpb24KLQkgKi8KLQlwcml2YXRlIExpbmVTdHlsZVByb3ZpZGVyIGZMaW5lU3R5bGVQcm92aWRlckZvclhNTDsKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MCi0JICovCi0JcHVibGljIFN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvblhNTCgpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQlwdWJsaWMgSUF1dG9FZGl0U3RyYXRlZ3lbXSBnZXRBdXRvRWRpdFN0cmF0ZWdpZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlMaXN0IGFsbFN0cmF0ZWdpZXMgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCUlBdXRvRWRpdFN0cmF0ZWd5W10gc3VwZXJTdHJhdGVnaWVzID0gc3VwZXIuZ2V0QXV0b0VkaXRTdHJhdGVnaWVzKHNvdXJjZVZpZXdlciwgY29udGVudFR5cGUpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHN1cGVyU3RyYXRlZ2llcy5sZW5ndGg7IGkrKykgewotCQkJYWxsU3RyYXRlZ2llcy5hZGQoc3VwZXJTdHJhdGVnaWVzW2ldKTsKLQkJfQotCi0JCWlmIChjb250ZW50VHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkgewotCQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IFN0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MKCkpOwotCQl9Ci0KLQkJLy8gYmUgc3VyZSB0aGlzIGlzIGxhc3QsIHNvIGl0IGNhbiBtb2RpZnkgYW55IHJlc3VsdHMgZm9ybSBwcmV2aW91cwotCQkvLyBjb21tYW5kcyB0aGF0IG1pZ2h0IG9uIG9uIHNhbWUgcGFydGlpb24gdHlwZS4KLQkJLy8gYWRkIGF1dG8gZWRpdCBzdHJhdGVneSB0aGF0IGhhbmRsZXMgd2hlbiB0YWIga2V5IGlzIHByZXNzZWQKLQkJYWxsU3RyYXRlZ2llcy5hZGQobmV3IEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzKCkpOwotCi0JCXJldHVybiAoSUF1dG9FZGl0U3RyYXRlZ3lbXSkgYWxsU3RyYXRlZ2llcy50b0FycmF5KG5ldyBJQXV0b0VkaXRTdHJhdGVneVthbGxTdHJhdGVnaWVzLnNpemUoKV0pOwotCX0KLQotCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0KLQkJaWYgKGZDb25maWd1cmVkQ29udGVudFR5cGVzID09IG51bGwpIHsKLQkJCVN0cmluZ1tdIHhtbFR5cGVzID0gU3RydWN0dXJlZFRleHRQYXJ0aXRpb25lckZvclhNTC5nZXRDb25maWd1cmVkQ29udGVudFR5cGVzKCk7Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlcyA9IG5ldyBTdHJpbmdbeG1sVHlwZXMubGVuZ3RoICsgMl07Ci0JCQlmQ29uZmlndXJlZENvbnRlbnRUeXBlc1swXSA9IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5ERUZBVUxUX1BBUlRJVElPTjsKLQkJCWZDb25maWd1cmVkQ29udGVudFR5cGVzWzFdID0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLlVOS05PV05fUEFSVElUSU9OOwotCQkJaW50IGluZGV4ID0gMDsKLQkJCVN5c3RlbS5hcnJheWNvcHkoeG1sVHlwZXMsIDAsIGZDb25maWd1cmVkQ29udGVudFR5cGVzLCBpbmRleCArPSAyLCB4bWxUeXBlcy5sZW5ndGgpOwotCQl9Ci0JCXJldHVybiBmQ29uZmlndXJlZENvbnRlbnRUeXBlczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBnZXRDb250ZW50QXNzaXN0UHJvY2Vzc29ycyhJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXSBwcm9jZXNzb3JzID0gbnVsbDsKLQotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkpIHsKLQkJCXByb2Nlc3NvcnMgPSBuZXcgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3JbXXtuZXcgWE1MQ29udGVudEFzc2lzdFByb2Nlc3NvcigpfTsKLQkJfQotCQllbHNlIGlmIChwYXJ0aXRpb25UeXBlID09IElTdHJ1Y3R1cmVkUGFydGl0aW9ucy5VTktOT1dOX1BBUlRJVElPTikgewotCQkJcHJvY2Vzc29ycyA9IG5ldyBJQ29udGVudEFzc2lzdFByb2Nlc3Nvcltde25ldyBOb1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvY2Vzc29yczsKLQl9Ci0KLQlwdWJsaWMgSUNvbnRlbnRGb3JtYXR0ZXIgZ2V0Q29udGVudEZvcm1hdHRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlmaW5hbCBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyIGZvcm1hdHRlciA9IG5ldyBNdWx0aVBhc3NDb250ZW50Rm9ybWF0dGVyKGdldENvbmZpZ3VyZWREb2N1bWVudFBhcnRpdGlvbmluZyhzb3VyY2VWaWV3ZXIpLCBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCk7Ci0KLQkJZm9ybWF0dGVyLnNldE1hc3RlclN0cmF0ZWd5KG5ldyBTdHJ1Y3R1cmVkRm9ybWF0dGluZ1N0cmF0ZWd5KG5ldyBGb3JtYXRQcm9jZXNzb3JYTUwoKSkpOwotCi0JCXJldHVybiBmb3JtYXR0ZXI7Ci0JfQotCi0JcHVibGljIElUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSBnZXREb3VibGVDbGlja1N0cmF0ZWd5KElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgY29udGVudFR5cGUpIHsKLQotCQlJVGV4dERvdWJsZUNsaWNrU3RyYXRlZ3kgZG91YmxlQ2xpY2tTdHJhdGVneSA9IG51bGw7Ci0JCWlmIChjb250ZW50VHlwZS5jb21wYXJlVG8oSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpID09IDApCi0JCQlkb3VibGVDbGlja1N0cmF0ZWd5ID0gbmV3IFhNTERvdWJsZUNsaWNrU3RyYXRlZ3koKTsKLQkJZWxzZQotCQkJZG91YmxlQ2xpY2tTdHJhdGVneSA9IHN1cGVyLmdldERvdWJsZUNsaWNrU3RyYXRlZ3koc291cmNlVmlld2VyLCBjb250ZW50VHlwZSk7Ci0JCXJldHVybiBkb3VibGVDbGlja1N0cmF0ZWd5OwotCX0KLQotCXB1YmxpYyBJSHlwZXJsaW5rRGV0ZWN0b3JbXSBnZXRIeXBlcmxpbmtEZXRlY3RvcnMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIpIHsKLQkJaWYgKHNvdXJjZVZpZXdlciA9PSBudWxsIHx8ICFmUHJlZmVyZW5jZVN0b3JlLmdldEJvb2xlYW4oQWJzdHJhY3REZWNvcmF0ZWRUZXh0RWRpdG9yUHJlZmVyZW5jZUNvbnN0YW50cy5FRElUT1JfSFlQRVJMSU5LU19FTkFCTEVEKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUxpc3QgYWxsRGV0ZWN0b3JzID0gbmV3IEFycmF5TGlzdCgwKTsKLQkJYWxsRGV0ZWN0b3JzLmFkZChuZXcgWE1MSHlwZXJsaW5rRGV0ZWN0b3IoKSk7Ci0KLQkJSUh5cGVybGlua0RldGVjdG9yW10gc3VwZXJEZXRlY3RvcnMgPSBzdXBlci5nZXRIeXBlcmxpbmtEZXRlY3RvcnMoc291cmNlVmlld2VyKTsKLQkJZm9yIChpbnQgbSA9IDA7IG0gPCBzdXBlckRldGVjdG9ycy5sZW5ndGg7IG0rKykgewotCQkJSUh5cGVybGlua0RldGVjdG9yIGRldGVjdG9yID0gc3VwZXJEZXRlY3RvcnNbbV07Ci0JCQlpZiAoIWFsbERldGVjdG9ycy5jb250YWlucyhkZXRlY3RvcikpIHsKLQkJCQlhbGxEZXRlY3RvcnMuYWRkKGRldGVjdG9yKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gKElIeXBlcmxpbmtEZXRlY3RvcltdKSBhbGxEZXRlY3RvcnMudG9BcnJheShuZXcgSUh5cGVybGlua0RldGVjdG9yWzBdKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nW10gZ2V0SW5kZW50UHJlZml4ZXMoSVNvdXJjZVZpZXdlciBzb3VyY2VWaWV3ZXIsIFN0cmluZyBjb250ZW50VHlwZSkgewotCQlWZWN0b3IgdmVjdG9yID0gbmV3IFZlY3RvcigpOwotCi0JCS8vIHByZWZpeFswXSBpcyBlaXRoZXIgJ1x0JyBvciAnICcgeCB0YWJXaWR0aCwgZGVwZW5kaW5nIG9uIHByZWZlcmVuY2UKLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpbnQgaW5kZW50YXRpb25XaWR0aCA9IHByZWZlcmVuY2VzLmdldEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpOwotCQlTdHJpbmcgaW5kZW50Q2hhclByZWYgPSBwcmVmZXJlbmNlcy5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9DSEFSKTsKLQkJYm9vbGVhbiB1c2VTcGFjZXMgPSBYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQQUNFLmVxdWFscyhpbmRlbnRDaGFyUHJlZik7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPD0gaW5kZW50YXRpb25XaWR0aDsgaSsrKSB7Ci0JCQlTdHJpbmdCdWZmZXIgcHJlZml4ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJYm9vbGVhbiBhcHBlbmRUYWIgPSBmYWxzZTsKLQotCQkJaWYgKHVzZVNwYWNlcykgewotCQkJCWZvciAoaW50IGogPSAwOyBqICsgaSA8IGluZGVudGF0aW9uV2lkdGg7IGorKykKLQkJCQkJcHJlZml4LmFwcGVuZCgnICcpOwotCi0JCQkJaWYgKGkgIT0gMCkKLQkJCQkJYXBwZW5kVGFiID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgaTsgaisrKQotCQkJCQlwcmVmaXguYXBwZW5kKCcgJyk7Ci0KLQkJCQlpZiAoaSAhPSBpbmRlbnRhdGlvbldpZHRoKQotCQkJCQlhcHBlbmRUYWIgPSB0cnVlOwotCQkJfQotCi0JCQlpZiAoYXBwZW5kVGFiKSB7Ci0JCQkJcHJlZml4LmFwcGVuZCgnXHQnKTsKLQkJCQl2ZWN0b3IuYWRkKHByZWZpeC50b1N0cmluZygpKTsKLQkJCQkvLyByZW1vdmUgdGhlIHRhYiBzbyB0aGF0IGluZGVudGF0aW9uIC0gdGFiIGlzIGFsc28gYW4gaW5kZW50Ci0JCQkJLy8gcHJlZml4Ci0JCQkJcHJlZml4LmRlbGV0ZUNoYXJBdChwcmVmaXgubGVuZ3RoKCkgLSAxKTsKLQkJCX0KLQkJCXZlY3Rvci5hZGQocHJlZml4LnRvU3RyaW5nKCkpOwotCQl9Ci0KLQkJdmVjdG9yLmFkZCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQlyZXR1cm4gKFN0cmluZ1tdKSB2ZWN0b3IudG9BcnJheShuZXcgU3RyaW5nW3ZlY3Rvci5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSUluZm9ybWF0aW9uUHJvdmlkZXIgZ2V0SW5mb3JtYXRpb25Qcm92aWRlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIHBhcnRpdGlvblR5cGUpIHsKLQkJSUluZm9ybWF0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBudWxsOwotCQlpZiAoKHBhcnRpdGlvblR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OKSB8fCAocGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfREVGQVVMVCkpIHsKLQkJCXByb3ZpZGVyID0gbmV3IFhNTEluZm9ybWF0aW9uUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gcHJvdmlkZXI7Ci0JfQotCi0JcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQlMaW5lU3R5bGVQcm92aWRlcltdIHByb3ZpZGVycyA9IG51bGw7Ci0KLQkJaWYgKHBhcnRpdGlvblR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQgfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEgfHwgcGFydGl0aW9uVHlwZSA9PSBJWE1MUGFydGl0aW9ucy5YTUxfQ09NTUVOVCB8fCBwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9ERUNMQVJBVElPTiB8fCBwYXJ0aXRpb25UeXBlID09IElYTUxQYXJ0aXRpb25zLlhNTF9QSSkgewotCQkJcHJvdmlkZXJzID0gbmV3IExpbmVTdHlsZVByb3ZpZGVyW117Z2V0TGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKX07Ci0JCX0KLQotCQlyZXR1cm4gcHJvdmlkZXJzOwotCX0KLQotCXByaXZhdGUgTGluZVN0eWxlUHJvdmlkZXIgZ2V0TGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKSB7Ci0JCWlmIChmTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwgPT0gbnVsbCkKLQkJCWZMaW5lU3R5bGVQcm92aWRlckZvclhNTCA9IG5ldyBMaW5lU3R5bGVQcm92aWRlckZvclhNTCgpOwotCQlyZXR1cm4gZkxpbmVTdHlsZVByb3ZpZGVyRm9yWE1MOwotCX0KLQotCXB1YmxpYyBJVGV4dEhvdmVyIGdldFRleHRIb3ZlcihJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlciwgU3RyaW5nIGNvbnRlbnRUeXBlLCBpbnQgc3RhdGVNYXNrKSB7Ci0JCUlUZXh0SG92ZXIgdGV4dEhvdmVyID0gbnVsbDsKLQotCQkvLyBsb29rIGZvciBhcHByb3ByaWF0ZSB0ZXh0IGhvdmVyIHByb2Nlc3NvciB0byByZXR1cm4gYmFzZWQgb24KLQkJLy8gY29udGVudCB0eXBlIGFuZCBzdGF0ZSBtYXNrCi0JCWlmICgoY29udGVudFR5cGUgPT0gSVN0cnVjdHVyZWRQYXJ0aXRpb25zLkRFRkFVTFRfUEFSVElUSU9OKSB8fCAoY29udGVudFR5cGUgPT0gSVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFQpKSB7Ci0JCQkvLyBjaGVjayB3aGljaCBvZiB4bWwncyB0ZXh0IGhvdmVyIGlzIGhhbmRsaW5nIHN0YXRlTWFzawotCQkJVGV4dEhvdmVyTWFuYWdlciBtYW5hZ2VyID0gU1NFVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFRleHRIb3Zlck1hbmFnZXIoKTsKLQkJCVRleHRIb3Zlck1hbmFnZXIuVGV4dEhvdmVyRGVzY3JpcHRvcltdIGhvdmVyRGVzY3MgPSBtYW5hZ2VyLmdldFRleHRIb3ZlcnMoKTsKLQkJCWludCBpID0gMDsKLQkJCXdoaWxlIChpIDwgaG92ZXJEZXNjcy5sZW5ndGggJiYgdGV4dEhvdmVyID09IG51bGwpIHsKLQkJCQlpZiAoaG92ZXJEZXNjc1tpXS5pc0VuYWJsZWQoKSAmJiBFZGl0b3JVdGlsaXR5LmNvbXB1dGVTdGF0ZU1hc2soaG92ZXJEZXNjc1tpXS5nZXRNb2RpZmllclN0cmluZygpKSA9PSBzdGF0ZU1hc2spIHsKLQkJCQkJU3RyaW5nIGhvdmVyVHlwZSA9IGhvdmVyRGVzY3NbaV0uZ2V0SWQoKTsKLQkJCQkJaWYgKFRleHRIb3Zlck1hbmFnZXIuQ09NQklOQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKQotCQkJCQkJdGV4dEhvdmVyID0gbWFuYWdlci5jcmVhdGVCZXN0TWF0Y2hIb3ZlcihuZXcgWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yKCkpOwotCQkJCQllbHNlIGlmIChUZXh0SG92ZXJNYW5hZ2VyLkRPQ1VNRU5UQVRJT05fSE9WRVIuZXF1YWxzSWdub3JlQ2FzZShob3ZlclR5cGUpKQotCQkJCQkJdGV4dEhvdmVyID0gbmV3IFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpOwotCQkJCX0KLQkJCQlpKys7Ci0JCQl9Ci0JCX0KLQotCQkvLyBubyBhcHByb3ByaWF0ZSB0ZXh0IGhvdmVycyBmb3VuZCwgdHJ5IHN1cGVyCi0JCWlmICh0ZXh0SG92ZXIgPT0gbnVsbCkKLQkJCXRleHRIb3ZlciA9IHN1cGVyLmdldFRleHRIb3Zlcihzb3VyY2VWaWV3ZXIsIGNvbnRlbnRUeXBlLCBzdGF0ZU1hc2spOwotCi0JCXJldHVybiB0ZXh0SG92ZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0RPTU9ic2VydmVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvRE9NT2JzZXJ2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY2NTk3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvRE9NT2JzZXJ2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWw7Ci0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUHJvZ3Jlc3NNb25pdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5TdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLmpvYnMuSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnlpbXBsLkNNRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5aW1wbC5JbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG9ic2VydmUgY2hhbmdlcyBpbiB0aGUgRE9NIGFuZCBwZXJmb3JtCi0gKiBvY2Nhc2lvbmFsJ3NjYW5zJyB0byBkZWR1Y2UgaW5mb3JtYXRpb24uIFdlIHVzZSBhIGRlbGF5IHRpbWVyIG1lY2hhbmlzbSB0bwotICogZW5zdXJlIHNjYW5zIGFyZSBtYWRlIGV2ZXJ5IGNvdXBsZSBvZiBzZWNvbmRzIHRvIGF2b2lkIHBlcmZvcm1hbmNlCi0gKiBwcm9ibGVtcy4gQ3VycmVudGx5IHRoaXMgY2xhc3MgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHJlZmVyZW5jZWQgZ3JhbW1hcgotICogdXJpJ3Mgd2l0aGluIHRoZSBkb2N1bWVudCBlbnN1cmUgdGhhdCB0aGV5IGFyZSBsb2FkZWQgYnkgdGhlCi0gKiBDTURvY3VtZW50TWFuYWdlci4gV2UgbWlnaHQgd2FudCB0byBnZW5lcmFsaXplIHRoaXMgY2xhc3MgdG8gcGVyZm9ybSBvdGhlcgotICogc3VwbGltZW50YWwgaW5mb3JtYXRpb24gZ2F0aGVyaW5nIHRoYXQgaXMgc3VpdGFibGUgZm9yICd0aW1lIGRlbGF5ZWQnCi0gKiBjb21wdXRhdGlvbiAoZXJyb3IgaGludHMgZXRjLikuCi0gKi8KLS8vIFRPRE86IFdoZXJlIHNob3VsZCB0aGlzIGNsYXNzIGdvPwotcHVibGljIGNsYXNzIERPTU9ic2VydmVyIHsKLQotCi0JLy8gQW4gYWJzdHJhY3QgYWRhcHRlciB0aGF0IGVuc3VyZXMgdGhhdCB0aGUgY2hpbGRyZW4gb2YgYSBuZXcgTm9kZSBhcmUKLQkvLyBhbHNvIGFkYXB0ZWQKLQkvLwotCWFic3RyYWN0IGNsYXNzIERvY3VtZW50QWRhcHRlciBpbXBsZW1lbnRzIElOb2RlQWRhcHRlciB7Ci0JCXB1YmxpYyBEb2N1bWVudEFkYXB0ZXIoKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBjb25uZWN0KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCQkoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5hZGRBZGFwdGVyKHRoaXMpOwotCQkJYWRhcHQoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGljY29ubmVjdChEb2N1bWVudCBkb2N1bWVudCkgewotCQkJKChJTm9kZU5vdGlmaWVyKSBkb2N1bWVudCkucmVtb3ZlQWRhcHRlcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkYXB0KEVsZW1lbnQgZWxlbWVudCkgewotCQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJCWlmICgoKElOb2RlTm90aWZpZXIpIGVsZW1lbnQpLmdldEV4aXN0aW5nQWRhcHRlcih0aGlzKSA9PSBudWxsKSB7Ci0JCQkJCSgoSU5vZGVOb3RpZmllcikgZWxlbWVudCkuYWRkQWRhcHRlcih0aGlzKTsKLQotCQkJCQlmb3IgKE5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJCWFkYXB0KChFbGVtZW50KSBjaGlsZCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gdHlwZSA9PSB0aGlzOwotCQl9Ci0KLQkJYWJzdHJhY3QgcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgZmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBpbmRleCk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBjbGFzcyBsaXN0ZW5zIHRvIHRoZSBjaGFuZ2VzIGluIHRoZSBDTURvY3VtZW50IGFuZCB0cmlnZ2VycyBhCi0JICogQ01Eb2N1bWVudCBsb2FkCi0JICovCi0JY2xhc3MgTXlEb2N1bWVudEFkYXB0ZXIgZXh0ZW5kcyBEb2N1bWVudEFkYXB0ZXIgewotCi0JCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgaW5kZXgpIHsKLQkJCXN3aXRjaCAoZXZlbnRUeXBlKSB7Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkFERCA6IHsKLQkJCQkJaWYgKG5ld1ZhbHVlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJBREQgKHRvICIgKwotCQkJCQkJLy8gKChOb2RlKW5vdGlmaWVyKS5nZXROb2RlTmFtZSgpICsgIikgIiArCi0JCQkJCQkvLyAoKEVsZW1lbnQpbmV3VmFsdWUpLmdldE5vZGVOYW1lKCkgKyAiIG9sZCAiICsKLQkJCQkJCS8vIG9sZFZhbHVlKTsKLQkJCQkJCWFkYXB0KChFbGVtZW50KSBuZXdWYWx1ZSk7Ci0JCQkJCX0KLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCQkvLyBjYXNlIElOb2RlTm90aWZpZXIuUkVNT1ZFOgotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCWNhc2UgSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCA6Ci0JCQkJY2FzZSBJTm9kZU5vdGlmaWVyLkNPTlRFTlRfQ0hBTkdFRCA6IHsKLQkJCQkJTm9kZSBub2RlID0gKE5vZGUpIG5vdGlmaWVyOwotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlzd2l0Y2ggKGV2ZW50VHlwZSkgewotCQkJCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DSEFOR0UgOgotCQkJCQkJCWNhc2UgSU5vZGVOb3RpZmllci5TVFJVQ1RVUkVfQ0hBTkdFRCA6IHsKLQkJCQkJCQkJLy8gc3RydWN0dXJlIGNoYW5nZQotCQkJCQkJCQlpbnZva2VEZWxheWVkQ01Eb2N1bWVudExvYWQoKTsKLQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJfQotCQkJCQkJCWNhc2UgSU5vZGVOb3RpZmllci5DT05URU5UX0NIQU5HRUQgOiB7Ci0JCQkJCQkJCS8vIHNvbWUgY29udGVudCBjaGFuZ2VkCi0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQkJCQlpbnZva2VEZWxheWVkQ01Eb2N1bWVudExvYWQoKTsKLQkJCQkJfQotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBJbnRlbnRpb25hbGx5IGxlZnQgdmlzaWJsZSB0byB0aGUgdXNlcgotCSAqLwotCWNsYXNzIFRpbWVySm9iIGV4dGVuZHMgSm9iIHsKLQkJcHVibGljIFRpbWVySm9iKCkgewotCQkJc3VwZXIoU1NFVUlNZXNzYWdlcy5Mb2FkaW5nUmVmZXJlbmNlZEdyYW1tYXJzKTsKLQkJCXNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCX0KLQotCQlwdWJsaWMgSVN0YXR1cyBydW4oSVByb2dyZXNzTW9uaXRvciBtb25pdG9yKSB7Ci0JCQltb25pdG9yLmJlZ2luVGFzaygiIiwgSVByb2dyZXNzTW9uaXRvci5VTktOT1dOKTsgLy8kTk9OLU5MUy0xJAotCQkJaW52b2tlQ01Eb2N1bWVudExvYWQoKTsKLQkJCW1vbml0b3IuZG9uZSgpOwotCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIEpvYiB0aW1lciA9IG5ldyBUaW1lckpvYigpOwotCXByb3RlY3RlZCBEb2N1bWVudCBmRG9jdW1lbnQ7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gaXNHcmFtbWFySW5mZXJlbmNlRW5hYmxlZDsKLQotCXB1YmxpYyBET01PYnNlcnZlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0JCWZEb2N1bWVudCA9IChtb2RlbCBpbnN0YW5jZW9mIElET01Nb2RlbCkgPyAoKElET01Nb2RlbCkgbW9kZWwpLmdldERvY3VtZW50KCkgOiBudWxsOwotCi0JCWlmIChmRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJLy8gaGVyZSB3ZSBjcmVhdGUgYW5kIGluaXQgYW4gYWRhcHRlciB0aGF0IHdpbGwgbGlzdGVuIHRvCi0JCQkvLyBjaGFuZ2VzIHRvIHRoZSBkb2N1bWVudCBhbmQgY29udGFpbmVkIGVsZW1lbnRzCi0JCQlNeURvY3VtZW50QWRhcHRlciBhZGFwdGVyID0gbmV3IE15RG9jdW1lbnRBZGFwdGVyKCk7Ci0JCQlhZGFwdGVyLmNvbm5lY3QoZkRvY3VtZW50KTsKLQotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShmRG9jdW1lbnQpOwotCQkJaWYgKG1vZGVsUXVlcnkgIT0gbnVsbCAmJiBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCkgIT0gbnVsbCkgewotCQkJCUNNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyID0gbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCWNtRG9jdW1lbnRNYW5hZ2VyLnNldFByb3BlcnR5RW5hYmxlZChDTURvY3VtZW50TWFuYWdlci5QUk9QRVJUWV9BVVRPX0xPQUQsIGZhbHNlKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoKSB7Ci0JCS8vIENTOiB3ZSBzZWVtIHRvIGV4cG9zZSBhbiBYU0QgaW5pdGlhbGl6YXRpb24gcHJvYmxlbSB3aGVuIHdlIGRvIHRoaXMKLQkJLy8gaW1tZWRpYXRlbHkKLQkJLy8gdmVyeSBuYXN0eS4uLiBJIG5lZWQgdG8gcmV2aXN0IHRoaXMgcHJvYmxlbSB3aXRoIEVkIE1lcmtzCi0JCS8vCi0JCS8vIGludm9rZUNNRG9jdW1lbnRMb2FkKCk7Ci0JCWludm9rZURlbGF5ZWRDTURvY3VtZW50TG9hZCgpOwotCX0KLQotCXB1YmxpYyB2b2lkIGludm9rZUNNRG9jdW1lbnRMb2FkKCkgewotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZEb2N1bWVudCk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwgJiYgbW9kZWxRdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpICE9IG51bGwpIHsKLQkJCUNNRG9jdW1lbnRMb2FkZXIgbG9hZGVyID0gaXNHcmFtbWFySW5mZXJlbmNlRW5hYmxlZCA/IG5ldyBJbmZlcnJlZEdyYW1tYXJCdWlsZGluZ0NNRG9jdW1lbnRMb2FkZXIoZkRvY3VtZW50LCBtb2RlbFF1ZXJ5KSA6IG5ldyBDTURvY3VtZW50TG9hZGVyKGZEb2N1bWVudCwgbW9kZWxRdWVyeSk7Ci0JCQlsb2FkZXIubG9hZENNRG9jdW1lbnRzKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnZva2VEZWxheWVkQ01Eb2N1bWVudExvYWQoKSB7Ci0JCXRpbWVyLnNjaGVkdWxlKDIwMDApOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEdyYW1tYXJJbmZlcmVuY2VFbmFibGVkKGJvb2xlYW4gaXNFbmFibGVkKSB7Ci0JCWlzR3JhbW1hckluZmVyZW5jZUVuYWJsZWQgPSBpc0VuYWJsZWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL0xvZ2dlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWE2NjdmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9Mb2dnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWw7Ci0KLQotCi1pbXBvcnQgY29tLmlibS5pY3UudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOwotCi0vKioKLSAqIFNtYWxsIGNvbnZlbmllbmNlIGNsYXNzIHRvIGxvZyBtZXNzYWdlcyB0byBwbHVnaW4ncyBsb2cgZmlsZSBhbmQgYWxzbywgaWYKLSAqIGRlc2lyZWQsIHRoZSBjb25zb2xlLiBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgY2xhc3NlcyBpbiB0aGlzCi0gKiBwbHVnaW4uIE90aGVyIHBsdWdpbnMgc2hvdWxkIG1ha2UgdGhlaXIgb3duIGNvcHksIHdpdGggYXBwcm9wcmlhdGUgSUQuCi0gKi8KLXB1YmxpYyBjbGFzcyBMb2dnZXIgewotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fSUQgPSAib3JnLmVjbGlwc2Uud3N0LnhtbC51aSI7IC8vJE5PTi1OTFMtMSQKLQkKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IElTdGF0dXMuRVJST1I7IC8vIDQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9ERUJVRyA9IDIwMCArIEVSUk9SOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElORk8gPSBJU3RhdHVzLklORk87IC8vIDEKLQlwdWJsaWMgc3RhdGljIGZpbmFsIGludCBJTkZPX0RFQlVHID0gMjAwICsgSU5GTzsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE9LID0gSVN0YXR1cy5PSzsgLy8gMAotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgT0tfREVCVUcgPSAyMDAgKyBPSzsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDRUZJTFRFUl9MT0NBVElPTiA9ICIvZGVidWcvdHJhY2VmaWx0ZXIiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0FSTklORyA9IElTdGF0dXMuV0FSTklORzsgLy8gMgotCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdBUk5JTkdfREVCVUcgPSAyMDAgKyBXQVJOSU5HOwotCi0JLyoqCi0JICogQWRkcyBtZXNzYWdlIHRvIGxvZy4KLQkgKiAKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKiAgICAgICAgICAgIHNldmVyaXR5IGxldmVsIG9mIHRoZSBtZXNzYWdlIChPSywgSU5GTywgV0FSTklORywgRVJST1IsCi0JICogICAgICAgICAgICBPS19ERUJVRywgSU5GT19ERUJVRywgV0FSTklOR19ERUJVRywgRVJST1JfREVCVUcpCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gYWRkIHRvIHRoZSBsb2cKLQkgKiBAcGFyYW0gZXhjZXB0aW9uCi0JICogICAgICAgICAgICBleGNlcHRpb24gdGhyb3duCi0JICovCi0JcHJvdGVjdGVkIHN0YXRpYyB2b2lkIF9sb2coaW50IGxldmVsLCBTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlpZiAobGV2ZWwgPT0gT0tfREVCVUcgfHwgbGV2ZWwgPT0gSU5GT19ERUJVRyB8fCBsZXZlbCA9PSBXQVJOSU5HX0RFQlVHIHx8IGxldmVsID09IEVSUk9SX0RFQlVHKSB7Ci0JCQlpZiAoIWlzRGVidWdnaW5nKCkpCi0JCQkJcmV0dXJuOwotCQl9Ci0KLQkJaW50IHNldmVyaXR5ID0gSVN0YXR1cy5PSzsKLQkJc3dpdGNoIChsZXZlbCkgewotCQkJY2FzZSBJTkZPX0RFQlVHIDoKLQkJCWNhc2UgSU5GTyA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLklORk87Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIFdBUk5JTkdfREVCVUcgOgotCQkJY2FzZSBXQVJOSU5HIDoKLQkJCQlzZXZlcml0eSA9IElTdGF0dXMuV0FSTklORzsKLQkJCQlicmVhazsKLQkJCWNhc2UgRVJST1JfREVCVUcgOgotCQkJY2FzZSBFUlJPUiA6Ci0JCQkJc2V2ZXJpdHkgPSBJU3RhdHVzLkVSUk9SOwotCQl9Ci0JCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJU3RhdHVzIHN0YXR1c09iaiA9IG5ldyBTdGF0dXMoc2V2ZXJpdHksIFBMVUdJTl9JRCwgc2V2ZXJpdHksIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJaWYgKGJ1bmRsZSAhPSBudWxsKSAKLQkJCVBsYXRmb3JtLmdldExvZyhidW5kbGUpLmxvZyhzdGF0dXNPYmopOwotCX0KLQotCS8qKgotCSAqIFByaW50cyBtZXNzYWdlIHRvIGxvZyBpZiBjYXRlZ29yeSBtYXRjaGVzIC9kZWJ1Zy90cmFjZWZpbHRlciBvcHRpb24uCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2UKLQkgKiAgICAgICAgICAgIHRleHQgdG8gcHJpbnQKLQkgKiBAcGFyYW0gY2F0ZWdvcnkKLQkgKiAgICAgICAgICAgIGNhdGVnb3J5IG9mIHRoZSBtZXNzYWdlLCB0byBiZSBjb21wYXJlZCB3aXRoCi0JICogICAgICAgICAgICAvZGVidWcvdHJhY2VmaWx0ZXIKLQkgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3RyYWNlKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJaWYgKGlzVHJhY2luZyhjYXRlZ29yeSkpIHsKLQkJCW1lc3NhZ2UgPSAobWVzc2FnZSAhPSBudWxsKSA/IG1lc3NhZ2UgOiAibnVsbCI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0YXR1cyBzdGF0dXNPYmogPSBuZXcgU3RhdHVzKElTdGF0dXMuT0ssIFBMVUdJTl9JRCwgSVN0YXR1cy5PSywgbWVzc2FnZSwgZXhjZXB0aW9uKTsKLQkJCUJ1bmRsZSBidW5kbGUgPSBQbGF0Zm9ybS5nZXRCdW5kbGUoUExVR0lOX0lEKTsKLQkJCWlmIChidW5kbGUgIT0gbnVsbCkgCi0JCQkJUGxhdGZvcm0uZ2V0TG9nKGJ1bmRsZSkubG9nKHN0YXR1c09iaik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHBsYXRmb3JtIGlzIGRlYnVnZ2luZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RlYnVnZ2luZygpIHsKLQkJcmV0dXJuIFBsYXRmb3JtLmluRGVidWdNb2RlKCk7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiBjdXJyZW50bHkgdHJhY2luZyBhIGNhdGVnb3J5Ci0JICogCi0JICogQHBhcmFtIGNhdGVnb3J5Ci0JICogQHJldHVybiB0cnVlIGlmIHRyYWNpbmcgY2F0ZWdvcnksIGZhbHNlIG90aGVyd2lzZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1RyYWNpbmcoU3RyaW5nIGNhdGVnb3J5KSB7Ci0JCWlmICghaXNEZWJ1Z2dpbmcoKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlTdHJpbmcgdHJhY2VGaWx0ZXIgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbihQTFVHSU5fSUQgKyBUUkFDRUZJTFRFUl9MT0NBVElPTik7Ci0JCWlmICh0cmFjZUZpbHRlciAhPSBudWxsKSB7Ci0JCQlTdHJpbmdUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFN0cmluZ1Rva2VuaXplcih0cmFjZUZpbHRlciwgIiwiKTsgLy8kTk9OLU5MUy0xJAotCQkJd2hpbGUgKHRva2VuaXplci5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgY2F0ID0gdG9rZW5pemVyLm5leHRUb2tlbigpLnRyaW0oKTsKLQkJCQlpZiAoY2F0ZWdvcnkuZXF1YWxzKGNhdCkpIHsKLQkJCQkJcmV0dXJuIHRydWU7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbG9nKGludCBsZXZlbCwgU3RyaW5nIG1lc3NhZ2UpIHsKLQkJX2xvZyhsZXZlbCwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZyhpbnQgbGV2ZWwsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgZXhjZXB0aW9uKSB7Ci0JCV9sb2cobGV2ZWwsIG1lc3NhZ2UsIGV4Y2VwdGlvbik7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIGxvZ0V4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCBsb2dFeGNlcHRpb24oVGhyb3dhYmxlIGV4Y2VwdGlvbikgewotCQlfbG9nKEVSUk9SLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZShTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlKSB7Ci0JCV90cmFjZShjYXRlZ29yeSwgbWVzc2FnZSwgbnVsbCk7Ci0JfQotCi0JcHVibGljIHN0YXRpYyB2b2lkIHRyYWNlRXhjZXB0aW9uKFN0cmluZyBjYXRlZ29yeSwgU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBtZXNzYWdlLCBleGNlcHRpb24pOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgdm9pZCB0cmFjZUV4Y2VwdGlvbihTdHJpbmcgY2F0ZWdvcnksIFRocm93YWJsZSBleGNlcHRpb24pIHsKLQkJX3RyYWNlKGNhdGVnb3J5LCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLCBleGNlcHRpb24pOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSU1lc3NhZ2VzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlNZXNzYWdlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDI2Mjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSU1lc3NhZ2VzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMTIgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gICBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mCi0gKiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMKLSAqIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IAotICogSUJNIC0gSW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbDsKLQotaW1wb3J0IGphdmEudXRpbC5NaXNzaW5nUmVzb3VyY2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLQotLyoqCi0gKiBTdHJpbmdzIHVzZWQgYnkgWE1MIFVJCi0gKiAKLSAqIEBwbGFubmVkZm9yIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlNZXNzYWdlcyBleHRlbmRzIE5MUyB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVTkRMRV9OQU1FID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW5SZXNvdXJjZXMiOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBmUmVzb3VyY2VCdW5kbGU7Ci0KLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTYW1wbGVfWE1MX2RvYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfQ29udGVudF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgVGFnX0RlbGltaXRlcnNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRhZ19OYW1lc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX05hbWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfVmFsdWVzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEZWNsYXJhdGlvbl9EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDREFUQV9EZWxpbWl0ZXJzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDREFUQV9Db250ZW50X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9jZXNzaW5nX0luc3RydWN0aW9uX0RlbF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUHJvY2Vzc2luZ19JbnN0cnVjdGlvbl9Db25fVUlfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NUWVBFX05hbWVfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ1RZUEVfU1lTVEVNX1BVQkxJQ19LZXl3X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERPQ1RZUEVfU3lzdGVtX1JlZmVyZW5jZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9BRlRFUjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9CRUZPUkU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQUREX0NISUxEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFTU9WRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9SRVBMQUNFX1dJVEg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9ET0NUWVBFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9VTkRPX1JFUExBQ0VfREVTQ1JJUFRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX0VESVRfRE9DVFlQRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5GT19FWFBBTkRfQUxMOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9JTkZPX0NPTExBUFNFX0FMTDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9TQ0hFTUFfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfTkFNRVNQQUNFUzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9BRERfRFREX0lORk9STUFUSU9OX1RJVExFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0VESVRfUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9ORVdfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX05FV19BVFRSSUJVVEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9BVFRSSUJVVEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfRURJVF9BVFRSSUJVVEVfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfTkVXX0VMRU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfTkVXX0VMRU1FTlRfVElUTEU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUkVOQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX1JFTkFNRV9USVRMRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfRUxFTUVOVF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9DT01NRU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9DREFUQV9TRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERF9QQ0RBVEE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfQ09NTUVOVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0NEQVRBX1NFQ1RJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX01FTlVfUENEQVRBOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9NRU5VX0FERDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfQ09NTUVOVF9WQUxVRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUElfVEFSR0VUX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9QSV9EQVRBX1ZBTFVFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9ST09UX0VMRU1FTlRfVkFMVUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1RBUkdFVF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfREFUQV9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfUk9PVF9FTEVNRU5UX05BTUVfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1BVQkxJQ19JRF9DT0xPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1lTVEVNX0lEX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9CUk9XU0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9YTUxfQ0FUQUxPR19FTlRSWTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfU1BFQ0lGWV9TWVNURU1fSUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1NFTEVDVF9GSUxFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9LRVk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1VSSTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfWE1MX0NBVEFMT0dfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9MT0NBVElPTl9ISU5UOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9MQUJFTF9QUkVGSVhfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX05PX05BTUVTUEFDRV9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OT19QUkVGSVg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1hNTF9TQ0hFTUFfSU5GT1JNQVRJT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX05BTUVfQ09MT047Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0xBQkVMX1ZBTFVFX0NPTE9OOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fREVMRVRFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fTkVXOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9CVVRUT05fRURJVDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX1dPUktTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX0NBVEFMT0c7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX05BTUU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX1BSRUZJWDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfUFJFRklYOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1NDSEVNQV9DQU5fTk9UX0JFX0xPQ0FURUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfTE9DQVRJT05fSElOVF9OT1RfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX05BTUVTUEFDRV9OQU1FX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfUFJFRklYX05PVF9TUEVDSUZJRUQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1dBUk5JTkdfUk9PVF9FTEVNRU5UX01VU1RfQkVfU1BFQ0lGSUVEOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9XQVJOSU5HX1NZU1RFTV9JRF9NVVNUX0JFX1NQRUNJRklFRDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfSU5WQUxJRF9OQU1FOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9FTlRFUl9SRVFfUFJFRklYX0FORF9OQU1FU1BBQ0U7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NFTEVDVF9SRUdJU1RFUkVEX05BTUVTUEFDRVM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX1NQRUNJRllfTkVXX05BTUVTUEFDRTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfVUlfU0VMRUNUX05BTUVTUEFDRV9UT19BREQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX1VJX0FERF9OQU1FU1BBQ0VfREVDTEFSQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9VSV9UQVJHRVRfTkFNRVNQQUNFOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIF9FUlJPUl9YTUxfQVRUUklCVVRFX0FMUkVBRFlfRVhJU1RTOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGVycm9yX21lc3NhZ2VfZ29lc19oZXJlOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZ1NldHRpbmdzXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdTZXR0aW5nc18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyYWdOb2RlQ29tbWFuZF8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIERyYWdOb2RlQ29tbWFuZF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSkZhY2VOb2RlQWRhcHRlcl8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF8yOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF81OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfNzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeFByb2Nlc3NvclhNTF84OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4UHJvY2Vzc29yWE1MXzk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTE7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTI7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3NfMDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyByZWZyZXNob3V0bGluZV8wOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENyZWF0aW5nX2ZpbGVzX2VuY29kaW5nOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF90YWdfaGFzX2F0dHJpYnV0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX19pc19taXNzaW5nX2FfdmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQXR0cmlidXRlX19oYXNfbm9fdmFsdWU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTWlzc2luZ19lbmRfdGFnXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF8xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVjb25jaWxlU3RlcEZvck1hcmt1cF80OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNTsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBSZWNvbmNpbGVTdGVwRm9yTWFya3VwXzY7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX3dpdGhfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19rbm93bl9hdHRyaWJ1dGVfX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudF9faXNfdW5rbm93bjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF93aXRoX187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xvc2Vfd2l0aF9fXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbG9zZV93aXRoX19fXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBfSGFzX25vX2F2YWlsYWJsZV9jaGlsZDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBOb19rbm93bl9jaGlsZF90YWc7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgX19IYXNfbm9fa25vd25fY2hpbGQ7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fa25vd25fY2hpbGRfdGFnX25hbWVzOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFRoZV9kb2N1bWVudF9lbGVtZW50X187Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZGVmaW5pdGlvbl9mb3JfaW47Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fZGVmaW5pdGlvbl9mb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fY29udGVudF9tb2RlbF9mb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTm9fY29udGVudF9tb2RlbF9mb3VuZF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cF9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29tcHJlc3NfZW1wdHlfZWxlbWVudF90YWdzX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbnNlcnRfcmVxdWlyZWRfYXR0cmlidXRlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5zZXJ0X21pc3NpbmdfdGFnc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgUXVvdGVfYXR0cmlidXRlX3ZhbHVlc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0X3NvdXJjZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udmVydF9FT0xfY29kZXNfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9XaW5kb3dzX1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9Vbml4X1VJOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVPTF9NYWNfVUk7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ3JlYXRpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5jb2RpbmdfZGVzYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbmNvZGluZzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDcmVhdGluZ19vcl9zYXZpbmdfZmlsZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRW5kX29mX2xpbmVfY29kZV9kZXNjOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEVuZF9vZl9saW5lX2NvZGU7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX1dpbmRvd3M7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX1VuaXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRU9MX01hYzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFT0xfTm9UcmFuc2xhdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBYTUxGaWxlc1ByZWZlcmVuY2VQYWdlX0V4dGVuc2lvbkxhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudF9hc3Npc3RfVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEF1dG9tYXRpY2FsbHlfbWFrZV9zdWdnZXN0X1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBQcm9tcHRfd2hlbl90aGVzZV9jaGFyYWN0ZV9VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0dGluZ19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTGluZV93aWR0aF9fVUlfOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNwbGl0X211bHRpcGxlX2F0dHJpYnV0ZXM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3RhYnM7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgSW5kZW50X3VzaW5nX3NwYWNlczsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBJbmRlbnRhdGlvbl9zaXplOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEluZGVudGF0aW9uX3NpemVfdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENsZWFyX2FsbF9ibGFua19saW5lc19VSV87Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgR3JhbW1hcl9Db25zdHJhaW50czsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBVc2VfaW5mZXJyZWRfZ3JhbW1hcl9pbl9hYnNlbmNlX29mOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN1Z2dlc3Rpb25fU3RyYXRlZ3k7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3VnZ2VzdGlvbl9TdHJhdGVneV9MYXg7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3VnZ2VzdGlvbl9TdHJhdGVneV9TdHJpY3Q7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgRWxlbWVudF9fX18xOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbnRlbnRfTW9kZWxfX19fMjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBdHRyaWJ1dGVfX19fMzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBEYXRhX1R5cGVfX19fNDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBFbnVtZXJhdGVkX1ZhbHVlc19fX181OwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdE1lbnVfbGFiZWw7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU291cmNlTWVudV9sYWJlbDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIENvbW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuY29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVW5jb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFVuY29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgVG9nZ2xlQ29tbWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBUb2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEFkZEJsb2NrQ29tbWVudF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBBZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDbGVhbnVwRG9jdW1lbnRfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ2xlYW51cERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGaW5kT2NjdXJyZW5jZXNfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dUb29sdGlwRGVzY19sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgU2hvd1Rvb2x0aXBEZXNjX3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFNob3dUb29sdGlwRGVzY19kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdFByb3Bvc2Fsc19sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgQ29udGVudEFzc2lzdFByb3Bvc2Fsc190b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBDb250ZW50QXNzaXN0UHJvcG9zYWxzX2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZWJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFF1aWNrRml4X2xhYmVsOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeF90b29sdGlwOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBRdWlja0ZpeF9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0RG9jdW1lbnRfbGFiZWw7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIEZvcm1hdERvY3VtZW50X2Rlc2NyaXB0aW9uOyAvLyBSZXNvdXJjZSBidW5kbGUKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBGb3JtYXRBY3RpdmVFbGVtZW50c19sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfdG9vbHRpcDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgRm9ybWF0QWN0aXZlRWxlbWVudHNfZGVzY3JpcHRpb247IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV9sYWJlbDsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgT3BlbkZpbGVGcm9tU291cmNlX3Rvb2x0aXA7IC8vIFJlc291cmNlIGJ1bmRsZQotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIE9wZW5GaWxlRnJvbVNvdXJjZV9kZXNjcmlwdGlvbjsgLy8gUmVzb3VyY2UgYnVuZGxlCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uXzA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ190b29sdGlwOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbjsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcDsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBTdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXA7Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb247Ci0JcHVibGljIHN0YXRpYyBTdHJpbmcgTUVTU0FHRV9YTUxfVkFMSURBVElPTl9NRVNTQUdFX1VJXzsKLQlwdWJsaWMgc3RhdGljIFN0cmluZyBXYXJuX25vX2dyYW1tYXJfc3BlY2lmaWVkOwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIFZhbGlkYXRpbmdfZmlsZXM7Ci0KLQotCXN0YXRpYyB7Ci0JCS8vIGxvYWQgbWVzc2FnZSB2YWx1ZXMgZnJvbSBidW5kbGUgZmlsZQotCQlOTFMuaW5pdGlhbGl6ZU1lc3NhZ2VzKEJVTkRMRV9OQU1FLCBYTUxVSU1lc3NhZ2VzLmNsYXNzKTsKLQl9Ci0KLQlwcml2YXRlIFhNTFVJTWVzc2FnZXMoKSB7Ci0JCS8vIGNhbm5vdCBjcmVhdGUgbmV3IGluc3RhbmNlCi0JfQotCi0JcHVibGljIHN0YXRpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKLQkJdHJ5IHsKLQkJCWlmIChmUmVzb3VyY2VCdW5kbGUgPT0gbnVsbCkKLQkJCQlmUmVzb3VyY2VCdW5kbGUgPSBSZXNvdXJjZUJ1bmRsZS5nZXRCdW5kbGUoQlVORExFX05BTUUpOwotCQl9Ci0JCWNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24geCkgewotCQkJZlJlc291cmNlQnVuZGxlID0gbnVsbDsKLQkJfQotCQlyZXR1cm4gZlJlc291cmNlQnVuZGxlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MWQ4ODEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL1hNTFVJUGx1Z2luLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LnRlbXBsYXRlcy5Db250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLmVkaXRvcnMudGV4dC50ZW1wbGF0ZXMuQ29udHJpYnV0aW9uVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUw7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxVSVBsdWdpbiBleHRlbmRzIEFic3RyYWN0VUlQbHVnaW4gewotCXB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIElEID0gIm9yZy5lY2xpcHNlLndzdC54bWwudWkiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgc3RhdGljIFhNTFVJUGx1Z2luIGluc3RhbmNlID0gbnVsbDsKLQotCXB1YmxpYyBzdGF0aWMgWE1MVUlQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIGluc3RhbmNlOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgc3RhdGljIFhNTFVJUGx1Z2luIGdldEluc3RhbmNlKCkgewotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIHhtbCBlZGl0b3IuCi0JICovCi0JcHJpdmF0ZSBDb250ZXh0VHlwZVJlZ2lzdHJ5IGZDb250ZXh0VHlwZVJlZ2lzdHJ5OwotCi0JLyoqCi0JICogVGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgeG1sIGVkaXRvci4KLQkgKiAKLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZlRlbXBsYXRlU3RvcmU7Ci0KLQlwdWJsaWMgWE1MVUlQbHVnaW4oKSB7Ci0JCXN1cGVyKCk7Ci0JCWluc3RhbmNlID0gdGhpczsKLQl9Ci0KLQlwdWJsaWMgQWRhcHRlckZhY3RvcnlSZWdpc3RyeSBnZXRBZGFwdGVyRmFjdG9yeVJlZ2lzdHJ5KCkgewotCQlyZXR1cm4gQWRhcHRlckZhY3RvcnlSZWdpc3RyeUltcGwuZ2V0SW5zdGFuY2UoKTsKLQotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIHN0b3JlIGZvciB0aGUgeG1sIGVkaXRvciB0ZW1wbGF0ZXMuCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgc3RvcmUgZm9yIHRoZSB4bWwgZWRpdG9yIHRlbXBsYXRlcwotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZVN0b3JlIGdldFRlbXBsYXRlU3RvcmUoKSB7Ci0JCWlmIChmVGVtcGxhdGVTdG9yZSA9PSBudWxsKSB7Ci0JCQlmVGVtcGxhdGVTdG9yZSA9IG5ldyBDb250cmlidXRpb25UZW1wbGF0ZVN0b3JlKAotCQkJCQlnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpLCBnZXRQcmVmZXJlbmNlU3RvcmUoKSwKLQkJCQkJWE1MVUlQcmVmZXJlbmNlTmFtZXMuVEVNUExBVEVTX0tFWSk7Ci0KLQkJCXRyeSB7Ci0JCQkJZlRlbXBsYXRlU3RvcmUubG9hZCgpOwotCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZUZW1wbGF0ZVN0b3JlOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHRlbXBsYXRlIGNvbnRleHQgdHlwZSByZWdpc3RyeSBmb3IgdGhlIHhtbCBwbHVnaW4uCi0JICogCi0JICogQHJldHVybiB0aGUgdGVtcGxhdGUgY29udGV4dCB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgeG1sIHBsdWdpbgotCSAqLwotCXB1YmxpYyBDb250ZXh0VHlwZVJlZ2lzdHJ5IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkgewotCQlpZiAoZkNvbnRleHRUeXBlUmVnaXN0cnkgPT0gbnVsbCkgewotCQkJQ29udHJpYnV0aW9uQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IG5ldyBDb250cmlidXRpb25Db250ZXh0VHlwZVJlZ2lzdHJ5KCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFMTCk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLk5FVyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLlRBRyk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURSk7Ci0JCQlyZWdpc3RyeS5hZGRDb250ZXh0VHlwZShUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURV9WQUxVRSk7Ci0KLQkJCWZDb250ZXh0VHlwZVJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0JCX0KLQotCQlyZXR1cm4gZkNvbnRleHRUeXBlUmVnaXN0cnk7Ci0JfQotCS8qKgotCSAgICogR2V0IGFuIGltYWdlIGZyb20gdGhlIHJlZ2lzdHJ5LiAKLQkgICAqIAotCSAgICogKlRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHJlZmVyZW5jaW5nZmlsZSBkaWFsb2cgYW5kIHNob3VsZCBiZSAKLQkgICAqICByZW1vdmVkIHdoZW4gdGhlIGRpYWxvZyBpcyBtb3ZlZCB0byBhbm90aGVyY29tcG9uZW50LgotCSAgICogCi0JICAgKiBAcGFyYW0gaW1hZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBpbWFnZS4KLQkgICAqIEByZXR1cm4gVGhlIGltYWdlIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBuYW1lLgotCSAgICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyBpbWFnZU5hbWUpewotCSAgICByZXR1cm4gZ2V0V29ya2JlbmNoKCkuZ2V0U2hhcmVkSW1hZ2VzKCkuZ2V0SW1hZ2UoaW1hZ2VOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvWE1MVUlQbHVnaW5SZXNvdXJjZXMucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTdjYmZhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9YTUxVSVBsdWdpblJlc291cmNlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIwotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyMgVGhlIGZvbGxvd2luZyBsaW5lIGlzIGEgc2FtcGxlIFhNTCBkb2N1bWVudC4gIFBsZWFzZSB0cmFuc2xhdGUgb25seSB0aGUgZm9sbG93aW5nIHBhcnRzOgotIyMgYmVnaW4gY29sb3IgZGVmaW5pdGlvbnMKLSMjIE5vcm1hbCB0ZXh0IGNvbnRlbnQuCi1TYW1wbGVfWE1MX2RvYz08P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuPD9jdXN0b21Qcm9jZXNzaW5nSW5zdHJ1Y3Rpb25cblx0WE1MIHByb2Nlc3NvciBzcGVjaWZpY1xuXHRjb250ZW50ID8+XG48IURPQ1RZUEUgY29sb3JzXG5cdFBVQkxJQyBcIi8vSUJNL1hNTC9DT0xPUlMvXCIgXCJjb2xvcnMuZHRkXCI+XG48Y29sb3JzPlxuXHQ8IS0tIGJlZ2luIGNvbG9yIGRlZmluaXRpb25zIC0tPlxuXHQ8Y29sb3IgbmFtZT1cInBsYWludGV4dFwiIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiIC8+XG5cdDxjb2xvciBuYW1lPVwiYm9sZFwiIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0IzQUNBMFwiIC8+XG5cdDwhW0NEQVRBWzwxMjM0NTY3ODk+XV0+XG5cdE5vcm1hbCB0ZXh0IGNvbnRlbnQuXG5cdDxjb2xvciBuYW1lPVwiaW52ZXJzZVwiIGZvcmVncm91bmQ9XCIjRjBGMEYwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0Q0RDBDOFwiIC8+XG5cbjwvY29sb3JzPlxuCi1Db21tZW50X0RlbGltaXRlcnNfVUlfPUNvbW1lbnQgRGVsaW1pdGVycwotQ29tbWVudF9Db250ZW50X1VJXz1Db21tZW50IENvbnRlbnQKLVRhZ19EZWxpbWl0ZXJzX1VJXz1UYWcgRGVsaW1pdGVycwotVGFnX05hbWVzX1VJXz1UYWcgTmFtZXMKLUF0dHJpYnV0ZV9OYW1lc19VSV89QXR0cmlidXRlIE5hbWVzCi1BdHRyaWJ1dGVfVmFsdWVzX1VJXz1BdHRyaWJ1dGUgVmFsdWVzCi1EZWNsYXJhdGlvbl9EZWxpbWl0ZXJzX1VJXz1EZWNsYXJhdGlvbiBEZWxpbWl0ZXJzCi1Db250ZW50X1VJXz1Db250ZW50Ci0jIyBvbiB0aGUgZm9sbG93aW5nIDIgbGluZXMsIGRvIG5vdCB0cmFuc2xhdGUgQ0RBVEEKLUNEQVRBX0RlbGltaXRlcnNfVUlfPUNEQVRBIERlbGltaXRlcnMKLUNEQVRBX0NvbnRlbnRfVUlfPUNEQVRBIENvbnRlbnQKLVByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fRGVsX1VJXz1Qcm9jZXNzaW5nIEluc3RydWN0aW9uIERlbGltaXRlcnMKLVByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fQ29uX1VJX19VSV89UHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBDb250ZW50Ci0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgc29sZWx5IHRyYW5zbGF0ZTogIE5hbWUKLURPQ1RZUEVfTmFtZV9VSV89RE9DVFlQRSBOYW1lCi0jIyBvbiB0aGUgZm9sbG93aW5nIGxpbmUgc29sZWx5IHRyYW5zbGF0ZTogIEtleXdvcmQKLURPQ1RZUEVfU1lTVEVNX1BVQkxJQ19LZXl3X1VJXz1ET0NUWVBFIFNZU1RFTS9QVUJMSUMgS2V5d29yZAotIyMgb24gdGhlIGZvbGxvd2luZyBsaW5lIHNvbGVseSB0cmFuc2xhdGU6ICBQdWJsaWMgUmVmZXJlbmNlCi1ET0NUWVBFX1B1YmxpY19SZWZlcmVuY2VfVUlfPURPQ1RZUEUgUHVibGljIFJlZmVyZW5jZQotIyMgb24gdGhlIGZvbGxvd2luZyBsaW5lIHNvbGVseSB0cmFuc2xhdGU6ICBTeXN0ZW0gUmVmZXJlbmNlCi1ET0NUWVBFX1N5c3RlbV9SZWZlcmVuY2VfVUlfPURPQ1RZUEUgU3lzdGVtIFJlZmVyZW5jZQotIyBYTUwgQ29tbW9uIFVJCi0jIENvbnN0YW50cyBmb3Igc3RyaW5ncwotCi1ERUxFVEU9UmVtb3ZlCi1BRERfUFJPQ0VTU0lOR19JTlNUUlVDVElPTj1BZGQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbgotCi1fVUlfTUVOVV9BRERfQUZURVI9QWRkICZBZnRlcgotX1VJX01FTlVfQUREX0FUVFJJQlVURT1BZGQgQSZ0dHJpYnV0ZQotX1VJX01FTlVfQUREX0JFRk9SRT1BZGQgJkJlZm9yZQotX1VJX01FTlVfQUREX0NISUxEPUFkZCAmQ2hpbGQKLV9VSV9NRU5VX1JFTU9WRT1SZSZtb3ZlCi1fVUlfTUVOVV9SRVBMQUNFX1dJVEg9UmUmcGxhY2UgV2l0aAotX1VJX01FTlVfRURJVF9ET0NUWVBFPUVkaXQgRE9DVFlQRS4uLgotX1VJX0xBQkVMX1VORE9fUkVQTEFDRV9ERVNDUklQVElPTj1SZXBsYWNlCi1fVUlfTEFCRUxfRURJVF9ET0NUWVBFPUVkaXQgRE9DVFlQRQotX1VJX0lORk9fRVhQQU5EX0FMTD1FeHBhbmQgQWxsCi1fVUlfSU5GT19DT0xMQVBTRV9BTEw9Q29sbGFwc2UgQWxsCi0KLV9VSV9NRU5VX0FERF9EVERfSU5GT1JNQVRJT049QWRkIERURCBJbmZvcm1hdGlvbi4uLgotX1VJX01FTlVfQUREX1NDSEVNQV9JTkZPUk1BVElPTj1BZGQgU2NoZW1hIEluZm9ybWF0aW9uLi4uCi1fVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT049RWRpdCBQcm9jZXNzJmluZyBJbnN0cnVjdGlvbi4uLgotX1VJX01FTlVfRURJVF9OQU1FU1BBQ0VTPUVkaXQgJk5hbWVzcGFjZXMuLi4KLQotX1VJX01FTlVfQUREX0RURF9JTkZPUk1BVElPTl9USVRMRT1BZGQgRFREIEluZm9ybWF0aW9uCi1fVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT05fVElUTEU9RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uCi1fVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRT1FZGl0IFNjaGVtYSBJbmZvcm1hdGlvbgotCi1fVUlfTUVOVV9ORVdfQVRUUklCVVRFPSZOZXcgQXR0cmlidXRlLi4uCi1fVUlfTUVOVV9ORVdfQVRUUklCVVRFX1RJVExFPU5ldyBBdHRyaWJ1dGUKLV9VSV9NRU5VX0VESVRfQVRUUklCVVRFPUVkaXQgQXR0cmlidXRlLi4uCi1fVUlfTUVOVV9FRElUX0FUVFJJQlVURV9USVRMRT1FZGl0IEF0dHJpYnV0ZQotX1VJX01FTlVfTkVXX0VMRU1FTlQ9TmV3ICZFbGVtZW50Li4uCi1fVUlfTUVOVV9ORVdfRUxFTUVOVF9USVRMRT1OZXcgRWxlbWVudAotX1VJX01FTlVfUkVOQU1FPVImZW5hbWUKLV9VSV9NRU5VX1JFTkFNRV9USVRMRT1SZW5hbWUKLV9VSV9MQUJFTF9FTEVNRU5UX05BTUU9RWxlbWVudCBuYW1lOgotCi1fVUlfTUVOVV9BRERfQ09NTUVOVD1BZGQgQ29tbWVudAotX1VJX01FTlVfQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT049QWRkIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLV9VSV9NRU5VX0FERF9DREFUQV9TRUNUSU9OPUFkZCBDREFUQSBTZWN0aW9uCi1fVUlfTUVOVV9BRERfUENEQVRBPUFkZCAjUENEQVRBOwotCi1fVUlfTUVOVV9DT01NRU5UPUMmb21tZW50Ci1fVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OPVAmcm9jZXNzaW5nIEluc3RydWN0aW9uCi1fVUlfTUVOVV9DREFUQV9TRUNUSU9OPUNEQVRBIFNlY3Rpb24KLV9VSV9NRU5VX1BDREFUQT0jUEMmREFUQTsKLQotX1VJX01FTlVfQUREPUFkZAotCi1fVUlfQ09NTUVOVF9WQUxVRT1jb21tZW50Ci1fVUlfUElfVEFSR0VUX1ZBTFVFPXRhcmdldAotX1VJX1BJX0RBVEFfVkFMVUU9ZGF0YQotX1VJX0xBQkVMX1JPT1RfRUxFTUVOVF9WQUxVRT1Sb290RWxlbWVudAotCi1fVUlfTEFCRUxfVEFSR0VUX0NPTE9OPVRhcmdldDoKLV9VSV9MQUJFTF9EQVRBX0NPTE9OPURhdGE6Ci1fVUlfTEFCRUxfUk9PVF9FTEVNRU5UX05BTUVfQ09MT049Um9vdCBlbGVtZW50IG5hbWU6Ci1fVUlfTEFCRUxfUFVCTElDX0lEX0NPTE9OPVB1YmxpYyBJRDoKLV9VSV9MQUJFTF9TWVNURU1fSURfQ09MT049U3lzdGVtIElEOgotX1VJX0xBQkVMX0JST1dTRT1Ccm93c2UuLi4KLV9VSV9MQUJFTF9TRUxFQ1RfWE1MX0NBVEFMT0dfRU5UUlk9U2VsZWN0IFhNTCBDYXRhbG9nIEVudHJ5Ci1fVUlfTEFCRUxfU1BFQ0lGWV9TWVNURU1fSUQ9U3BlY2lmeSBTeXN0ZW0gSUQKLV9VSV9MQUJFTF9TRUxFQ1RfRklMRT1TZWxlY3QgRmlsZQotCi1fVUlfTEFCRUxfS0VZPUtleQotX1VJX0xBQkVMX1VSST1VUkk6Ci1fVUlfTEFCRUxfWE1MX0NBVEFMT0dfQ09MT049WE1MIENhdGFsb2cKLV9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRT1OYW1lc3BhY2UgTmFtZQotX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlQ9TG9jYXRpb24gSGludAotX1VJX0xBQkVMX1BSRUZJWD1QcmVmaXgKLV9VSV9MQUJFTF9OQU1FU1BBQ0VfTkFNRV9DT0xPTj1OYW1lc3BhY2UgTmFtZToKLV9VSV9MQUJFTF9MT0NBVElPTl9ISU5UX0NPTE9OPUxvY2F0aW9uIEhpbnQ6Ci1fVUlfTEFCRUxfUFJFRklYX0NPTE9OPVByZWZpeDoKLV9VSV9OT19OQU1FU1BBQ0VfTkFNRT08bm8gbmFtZXNwYWNlIG5hbWU+Ci1fVUlfTk9fUFJFRklYPTxubyBwcmVmaXg+Ci0KLV9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OPVhNTCBTY2hlbWEgSW5mb3JtYXRpb24KLQotX1VJX0xBQkVMX05BTUVfQ09MT049TmFtZToKLV9VSV9MQUJFTF9WQUxVRV9DT0xPTj1WYWx1ZToKLQotX1VJX0JVVFRPTl9ERUxFVEU9RGVsZXRlCi1fVUlfQlVUVE9OX05FVz1OZXcuLi4KLV9VSV9CVVRUT05fRURJVD1FZGl0Li4uCi0KLV9VSV9MQUJFTF9ORVdfTkFNRVNQQUNFX0lORk9STUFUSU9OPU5ldyBOYW1lc3BhY2UgSW5mb3JtYXRpb24KLQotIyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCi0KLV9VSV9SQURJT19CVVRUT05fU0VMRUNUX0ZST01fV09SS1NQQUNFPVNlbGVjdCBmaWxlIGZyb20gd29ya2JlbmNoCi1fVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX0NBVEFMT0c9U2VsZWN0IFhNTCBDYXRhbG9nIGVudHJ5Ci0KLV9VSV9XQVJOSU5HX01PUkVfVEhBTl9PTkVfTlNfV0lUSF9OQU1FPU1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlIGhhcyBiZWVuIHNwZWNpZmllZCB3aXRoIHRoZSBuYW1lc3BhY2UgbmFtZSA6Ci1fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfTkFNRT1Nb3JlIHRoYW4gb25lIHNjaGVtYSBoYXMgYmVlbiBzcGVjaWZpZWQgd2l0aG91dCBhIG5hbWVzcGFjZSBuYW1lCi1fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfUFJFRklYPU1vcmUgdGhhbiBvbmUgbmFtZXNwYWNlIGhhcyBiZWVuIHNwZWNpZmljZWQgd2l0aG91dCBhIHByZWZpeAotX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX1BSRUZJWD1Nb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBoYXMgYmVlbiBzcGVjaWZpZWQgd2l0aCB0aGUgcHJlZml4IDoKLV9VSV9XQVJOSU5HX1NDSEVNQV9DQU5fTk9UX0JFX0xPQ0FURUQ9VGhlIHNwZWNpZmllZCBzY2hlbWEgY2FuIG5vdCBiZSBsb2NhdGVkIDoKLV9VSV9XQVJOSU5HX0xPQ0FUSU9OX0hJTlRfTk9UX1NQRUNJRklFRD1BIGxvY2F0aW9uIGhpbnQgaGFzIG5vdCBiZWVuIHNwZWNpZmllZCBmb3IgdGhlIG5hbWVzcGFjZSB3aXRoIG5hbWUKLV9VSV9XQVJOSU5HX05BTUVTUEFDRV9OQU1FX05PVF9TUEVDSUZJRUQ9QSBuYW1lIG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUgbmFtZXNwYWNlIHdpdGggcHJlZml4IDoKLV9VSV9XQVJOSU5HX1BSRUZJWF9OT1RfU1BFQ0lGSUVEPUEgcHJlZml4IG11c3QgYmUgc3BlY2lmaWVkIGZvciB0aGUgbmFtZXNwYWNlIG5hbWVkIDoKLV9VSV9XQVJOSU5HX1JPT1RfRUxFTUVOVF9NVVNUX0JFX1NQRUNJRklFRD1BIHJvb3QgZWxlbWVudCBuYW1lIG11c3QgYmUgc3BlY2lmaWVkLgotX1VJX1dBUk5JTkdfU1lTVEVNX0lEX01VU1RfQkVfU1BFQ0lGSUVEPUEgc3lzdGVtIElEIG11c3QgYmUgc3BlY2lmaWVkLgotCi1fVUlfSU5WQUxJRF9OQU1FPUludmFsaWQgbmFtZQotCi0jIFN0cmluZyB1c2VkIGZvciBlZGl0aW5nIG5hbWVzcGFjZXMgKG9yZy5lY2xpcHNlLndzdC54bWwudWkubnNlZGl0KQotX1VJX0VOVEVSX1JFUV9QUkVGSVhfQU5EX05BTUVTUEFDRT1FbnRlciB0aGUgcmVxdWlyZWQgcHJlZml4IGFuZCBuYW1lc3BhY2UgVVJJIGZvciB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uLgotX1VJX1NFTEVDVF9SRUdJU1RFUkVEX05BTUVTUEFDRVM9U2VsZWN0IEZyb20gUmVnaXN0ZXJlZCBOYW1lc3BhY2VzCi1fVUlfU1BFQ0lGWV9ORVdfTkFNRVNQQUNFPVNwZWNpZnkgTmV3IE5hbWVzcGFjZQotX1VJX1NFTEVDVF9OQU1FU1BBQ0VfVE9fQUREPVNlbGVjdCB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0byBhZGQuCi1fVUlfQUREX05BTUVTUEFDRV9ERUNMQVJBVElPTlM9QWRkIE5hbWVzcGFjZSBEZWNsYXJhdGlvbnMKLV9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TPU5hbWVzcGFjZSBEZWNsYXJhdGlvbnMKLV9VSV9UQVJHRVRfTkFNRVNQQUNFPVRhcmdldCBOYW1lc3BhY2UKLQotX0VSUk9SX1hNTF9BVFRSSUJVVEVfQUxSRUFEWV9FWElTVFM9VGhlIGVsZW1lbnQgYWxyZWFkeSBoYXMgYW4gYXR0cmlidXRlIHdpdGggdGhpcyBuYW1lLgotCi0jCi1lcnJvcl9tZXNzYWdlX2dvZXNfaGVyZT1lcnJvciBtZXNzYWdlIGdvZXMgaGVyZQotU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMD1TdXJyb3VuZCB3aXRoIG5ldyBlbGVtZW50Ci1TdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbF8xPVN1cnJvdW5kIHdpdGggbmV3IGVsZW1lbnQKLVJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMD1MaW5rIGFsbCByZWZlcmVuY2VzIGZvciBhIHJlbmFtZSBpbiBmaWxlIChkb2VzIG5vdCBjaGFuZ2UgcmVmZXJlbmNlcyBpbiBvdGhlciBmaWxlcykKLVJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMT1SZW5hbWUgaW4gZmlsZQotSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMD1JbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlcwotSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMT1JbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlcwotRW5jb2RpbmdTZXR0aW5nc18wPUlBTkE6Ci1FbmNvZGluZ1NldHRpbmdzXzE9RW5jb2Rpbmc6Ci1EcmFnTm9kZUNvbW1hbmRfMD1Nb3ZlCi1EcmFnTm9kZUNvbW1hbmRfMT1Db3B5Ci1Db21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZ18wPUFkZC4uLgotSkZhY2VOb2RlQWRhcHRlcl8xPVJlZnJlc2ggUHJvcGVydHkgU2hlZXQKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzA9UmVtb3ZlIGVtcHR5IHRhZwotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMT1DaGFuZ2UgdG8gZW1wdHktZWxlbWVudCB0YWcKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzI9UmVtb3ZlIHRoaXMgdGFnCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8zPUluc2VydCBlbmQgdGFnIGJlZm9yZSBmaXJzdCBjaGlsZCBlbGVtZW50Ci1RdWlja0ZpeFByb2Nlc3NvclhNTF80PUluc2VydCBlbmQgdGFnIGF0IGVuZCBvZiBlbGVtZW50Ci1RdWlja0ZpeFByb2Nlc3NvclhNTF81PVJlbW92ZSBhdHRyaWJ1dGVzIGluIGVuZCB0YWcKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzY9SW5zZXJ0IGRlZmF1bHQgYXR0cmlidXRlIHZhbHVlCi1RdWlja0ZpeFByb2Nlc3NvclhNTF83PVJlbW92ZSB0aGlzIGF0dHJpYnV0ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfOD1SZW1vdmUgc3BhY2VzIGJlZm9yZSB0YWcgbmFtZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfOT1SZW1vdmUgc3BhY2VzIGJlZm9yZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xMD1SZW1vdmUgbmFtZXNwYWNlIGluIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KLVF1aWNrRml4UHJvY2Vzc29yWE1MXzExPVJlbW92ZSB0aGlzIGVsZW1lbnQKLVF1aWNrRml4UHJvY2Vzc29yWE1MXzEyPVJlbW92ZSB0aGlzIGF0dHJpYnV0ZSB2YWx1ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTM9SW5zZXJ0IHJlcXVpcmVkIGF0dHJpYnV0ZQotUXVpY2tGaXhQcm9jZXNzb3JYTUxfMTQ9UXVvdGUgYXR0cmlidXRlIHZhbHVlCi1RdWlja0ZpeFByb2Nlc3NvclhNTF8xNT1JbnNlcnQgY2xvc2luZyBicmFja2V0Ci1YTUxQcm9wZXJ0eVNvdXJjZUFkYXB0ZXJfMD1BdHRyaWJ1dGVzCi0KLVdvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzXzA9VXNlIHdvcmtiZW5jaCBlbmNvZGluZwotcmVmcmVzaG91dGxpbmVfMD1SZWZyZXNoaW5nIE91dGxpbmUKLUNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nPUNyZWF0aW5nIGZpbGVzIGVuY29kaW5nIHByZWZlcmVuY2UKLSMgUmVjb25jaWxlU3RlcEZvck1hcmt1cAotRW5kX3RhZ19oYXNfYXR0cmlidXRlcz1FbmQgdGFnIGhhcyBhdHRyaWJ1dGVzCi1BdHRyaWJ1dGVfX2lzX21pc3NpbmdfYV92YWx1ZT1BdHRyaWJ1dGUgXCJ7MH1cIiBpcyBtaXNzaW5nIGEgdmFsdWUKLUF0dHJpYnV0ZV9faGFzX25vX3ZhbHVlPUF0dHJpYnV0ZSBcInswfVwiICBoYXMgbm8gdmFsdWUKLU1pc3NpbmdfZW5kX3RhZ189TWlzc2luZyBlbmQgdGFnIFwiezB9XCIKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMD1NaXNzaW5nIGNsb3NpbmcgcXVvdGUKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMT1NaXNzaW5nIHF1b3RlcyBmb3IgYXR0cmlidXRlIHZhbHVlCi1SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzI9QSB0YWduYW1lIGNhbm5vdCBzdGFydCB3aXRoIGEgc3BhY2UKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMz1FbXB0eSB0YWdzIGFyZSBub3QgYWxsb3dlZAotUmVjb25jaWxlU3RlcEZvck1hcmt1cF80PU5hbWVzcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGluIGEgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiB0YXJnZXQKLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNT1TcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGJlZm9yZSBhIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24KLVJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNj1UYWcgbWlzc2luZyBjbG9zaW5nIGJyYWNrZXQgJz4nCi0jIENvbnRlbnQgQXNzaXN0Ci1FbmRfd2l0aF89RW5kIHdpdGggezB9PgotU0VWRVJFX2ludGVybmFsX2Vycm9yX29jY3VfVUlfPVNFVkVSRSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZAotTm9fa25vd25fYXR0cmlidXRlX19VSV89Tm8ga25vd24gYXR0cmlidXRlCi1Db250ZW50X0Fzc2lzdF9ub3RfYXZhaWxhYl9VSV89Q29udGVudCBBc3Npc3Qgbm90IGF2YWlsYWJsZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbgotRWxlbWVudF9faXNfdW5rbm93bj1FbGVtZW50IDx7MH0+IGlzIHVua25vd24uCi1Db21tZW50X189Y29tbWVudCB7MH0KLUNsb3NlX3dpdGhfXz1DbG9zZSB3aXRoIHswfQotRW5kX3dpdGhfXz1FbmQgd2l0aCBcIjwvezB9PlwiCi1DbG9zZV93aXRoX19fPUNsb3NlIHdpdGggXCJ7MH1cIgotQ2xvc2Vfd2l0aF9fX189Q2xvc2Ugd2l0aCBcIj48L3swfT5cIgotX0hhc19ub19hdmFpbGFibGVfY2hpbGQ9ezB9IGhhcyBubyBhdmFpbGFibGUgY2hpbGQgdGFncy4KLU5vX2tub3duX2NoaWxkX3RhZz1ObyBrbm93biBjaGlsZCB0YWcgbmFtZXMgb2YgPHswfT4gYmVnaW4gd2l0aCBcInsxfVwiLgotX19IYXNfbm9fa25vd25fY2hpbGQ9PHswfT4gaGFzIG5vIGtub3duIGNoaWxkIHRhZ3MuCi1Ob19rbm93bl9jaGlsZF90YWdfbmFtZXM9Tm8ga25vd24gY2hpbGQgdGFnIG5hbWVzIG9mIDx7MH0+IGJlZ2luIHdpdGggXCJ7MX1cIgotVGhlX2RvY3VtZW50X2VsZW1lbnRfXz1UaGUgZG9jdW1lbnQgZWxlbWVudCA8ezB9PiBpcyBhbHJlYWR5IHByZXNlbnQuCi1Ob19kZWZpbml0aW9uX2Zvcl9pbj1ObyBkZWZpbml0aW9uIHdhcyBmb3VuZCBmb3IgZWxlbWVudCA8ezB9PiBpbiB7MX0KLU5vX2RlZmluaXRpb25fZm9yPU5vIGRlZmluaXRpb24gd2FzIGZvdW5kIGZvciBlbGVtZW50IDx7MH0+Ci1Ob19jb250ZW50X21vZGVsX2Zvcj1ObyBjb250ZW50IG1vZGVsIGZvdW5kIGZvciB7MH0uCi1Ob19jb250ZW50X21vZGVsX2ZvdW5kX1VJXz1ObyBjb250ZW50IG1vZGVsIGZvdW5kCi0jIyBUaGUgZm9sbG93aW5nIHN0cmluZ3MgYXJlIGZvciB0aGUgWE1MIENsZWFudXAgZGlhbG9nCi1DbGVhbnVwX1VJXz1DbGVhbnVwCi1Db21wcmVzc19lbXB0eV9lbGVtZW50X3RhZ3NfVUlfPSZDb21wcmVzcyBlbXB0eSBlbGVtZW50IHRhZ3MKLUluc2VydF9yZXF1aXJlZF9hdHRyaWJ1dGVzX1VJXz1JbnNlcnQgJnJlcXVpcmVkIGF0dHJpYnV0ZXMKLUluc2VydF9taXNzaW5nX3RhZ3NfVUlfPSZJbnNlcnQgbWlzc2luZyB0YWdzCi1RdW90ZV9hdHRyaWJ1dGVfdmFsdWVzX1VJXz0mUXVvdGUgYXR0cmlidXRlIHZhbHVlcwotRm9ybWF0X3NvdXJjZV9VSV89JkZvcm1hdCBzb3VyY2UKLUNvbnZlcnRfRU9MX2NvZGVzX1VJXz1Db252ZXJ0IGxpbmUgJmRlbGltaXRlcnMgdG8KLUVPTF9XaW5kb3dzX1VJPSZXaW5kb3dzCi1FT0xfVW5peF9VST1VJk5JWAotRU9MX01hY19VST0mTWFjCi0jIyBYTUwgRmlsZXMgcHJlZmVyZW5jZSBwYWdlCi1DcmVhdGluZ19maWxlcz1DcmVhdGluZyBmaWxlcwotRW5jb2RpbmdfZGVzYz1UaGUgZm9sbG93aW5nIGVuY29kaW5nIHdpbGwgYXBwbHk6Ci1FbmNvZGluZz1FbiZjb2Rpbmc6Ci1DcmVhdGluZ19vcl9zYXZpbmdfZmlsZXM9Q3JlYXRpbmcgb3Igc2F2aW5nIGZpbGVzCi1FbmRfb2ZfbGluZV9jb2RlX2Rlc2M9VGhlIGZvbGxvd2luZyBsaW5lIGRlbGltaXRlciB3aWxsIGFwcGx5OgotRW5kX29mX2xpbmVfY29kZT0mTGluZSBkZWxpbWl0ZXI6Ci1FT0xfV2luZG93cz1XaW5kb3dzCi1FT0xfVW5peD1VTklYCi1FT0xfTWFjPU1hYwotRU9MX05vVHJhbnNsYXRpb249Tm8gdHJhbnNsYXRpb24KLVZhbGlkYXRpbmdfZmlsZXM9VmFsaWRhdGluZyBmaWxlcwotV2Fybl9ub19ncmFtbWFyX3NwZWNpZmllZD1XYXJuIHdoZW4gbm8gZ3JhbW1hciBpcyBzcGVjaWZpZWQKLVhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uTGFiZWw9QWRkIHRoaXMgc3VmZml4IChpZiBub3Qgc3BlY2lmaWVkKToKLVhNTEZpbGVzUHJlZmVyZW5jZVBhZ2VfRXh0ZW5zaW9uRXJyb3I9U3VmZml4IG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgezB9LgotIyMgWE1MIFNvdXJjZSBwcmVmZXJlbmNlIHBhZ2UKLUNvbnRlbnRfYXNzaXN0X1VJXz1Db250ZW50IGFzc2lzdAotQXV0b21hdGljYWxseV9tYWtlX3N1Z2dlc3RfVUlfPUF1dG9tYXRpY2FsbHkgbWEma2Ugc3VnZ2VzdGlvbnMKLVByb21wdF93aGVuX3RoZXNlX2NoYXJhY3RlX1VJXz1QJnJvbXB0IHdoZW4gdGhlc2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ6Ci1Gb3JtYXR0aW5nX1VJXz1Gb3JtYXR0aW5nCi1MaW5lX3dpZHRoX19VSV89TGluZSAmd2lkdGg6Ci1TcGxpdF9tdWx0aXBsZV9hdHRyaWJ1dGVzPVNwbGl0ICZtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZQotSW5kZW50X3VzaW5nX3RhYnM9JkluZGVudCB1c2luZyB0YWJzCi1JbmRlbnRfdXNpbmdfc3BhY2VzPUkmbmRlbnQgdXNpbmcgc3BhY2VzCi1JbmRlbnRhdGlvbl9zaXplPUluJmRlbnRhdGlvbiBzaXplOgotSW5kZW50YXRpb25fc2l6ZV90aXA9SW5kZW50YXRpb24gc2l6ZQotQ2xlYXJfYWxsX2JsYW5rX2xpbmVzX1VJXz1DbGVhciBhbGwgJmJsYW5rIGxpbmVzCi1HcmFtbWFyX0NvbnN0cmFpbnRzPUdyYW1tYXIgQ29uc3RyYWludHMKLVVzZV9pbmZlcnJlZF9ncmFtbWFyX2luX2Fic2VuY2Vfb2Y9VXNlIGluZmVycmVkIGdyYW1tYXIgaW4gYWJzZW5jZSBvZiBEVEQvU2NoZW1hCi1TdWdnZXN0aW9uX1N0cmF0ZWd5PSZTdWdnZXN0aW9uIHN0cmF0ZWd5OgotU3VnZ2VzdGlvbl9TdHJhdGVneV9MYXg9TGF4Ci1TdWdnZXN0aW9uX1N0cmF0ZWd5X1N0cmljdD1TdHJpY3QKLSMjIHRhZyBpbmZvCi1FbGVtZW50X19fXzE9RWxlbWVudCA6Ci1Db250ZW50X01vZGVsX19fXzI9Q29udGVudCBNb2RlbCA6Ci1BdHRyaWJ1dGVfX19fMz1BdHRyaWJ1dGUgOgotRGF0YV9UeXBlX19fXzQ9RGF0YSBUeXBlIDoKLUVudW1lcmF0ZWRfVmFsdWVzX19fXzU9RW51bWVyYXRlZCBWYWx1ZXMgOgotIyMgY29waWVkIGZyb20gc3NlLnVpCi1Gb3JtYXRNZW51X2xhYmVsPUYmb3JtYXQKLVNvdXJjZU1lbnVfbGFiZWw9JlNvdXJjZQotQ29tbWVudF9sYWJlbD1DbyZtbWVudAotQ29tbWVudF90b29sdGlwPUNvbW1lbnQKLUNvbW1lbnRfZGVzY3JpcHRpb249Q29tbWVudAotVW5jb21tZW50X2xhYmVsPSZVbmNvbW1lbnQKLVVuY29tbWVudF90b29sdGlwPVVuY29tbWVudAotVW5jb21tZW50X2Rlc2NyaXB0aW9uPVVuY29tbWVudAotVG9nZ2xlQ29tbWVudF9sYWJlbD1Ub2dnbGUgQ29tbWVudAotVG9nZ2xlQ29tbWVudF90b29sdGlwPVRvZ2dsZSBDb21tZW50Ci1Ub2dnbGVDb21tZW50X2Rlc2NyaXB0aW9uPVRvZ2dsZSBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfbGFiZWw9QWRkIEJsb2NrIENvbW1lbnQKLUFkZEJsb2NrQ29tbWVudF90b29sdGlwPUFkZCBCbG9jayBDb21tZW50Ci1BZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb249QWRkIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbD1SZW1vdmUgQmxvY2sgQ29tbWVudAotUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXA9UmVtb3ZlIEJsb2NrIENvbW1lbnQKLVJlbW92ZUJsb2NrQ29tbWVudF9kZXNjcmlwdGlvbj1SZW1vdmUgQmxvY2sgQ29tbWVudAotQ2xlYW51cERvY3VtZW50X2xhYmVsPUNsZWFudXAgRG9jdW1lbnQuLi4KLUNsZWFudXBEb2N1bWVudF90b29sdGlwPUNsZWFudXAgRG9jdW1lbnQKLUNsZWFudXBEb2N1bWVudF9kZXNjcmlwdGlvbj1DbGVhbnVwIERvY3VtZW50Ci1GaW5kT2NjdXJyZW5jZXNfbGFiZWw9T2NjdXJyZW5jZXMgaW4gRmlsZQotU2hvd1Rvb2x0aXBEZXNjX2xhYmVsPVNob3cgJlRvb2x0aXAgRGVzY3JpcHRpb24KLVNob3dUb29sdGlwRGVzY190b29sdGlwPURpc3BsYXlzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudAotU2hvd1Rvb2x0aXBEZXNjX2Rlc2NyaXB0aW9uPURpc3BsYXlzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgc2VsZWN0ZWQgZWxlbWVudAotQ29udGVudEFzc2lzdFByb3Bvc2Fsc19sYWJlbD1Db24mdGVudCBBc3Npc3QKLUNvbnRlbnRBc3Npc3RQcm9wb3NhbHNfdG9vbHRpcD1Db250ZW50IEFzc2lzdAotQ29udGVudEFzc2lzdFByb3Bvc2Fsc19kZXNjcmlwdGlvbj1Db250ZW50IEFzc2lzdAotUXVpY2tGaXhfbGFiZWw9JlF1aWNrIEZpeAotUXVpY2tGaXhfdG9vbHRpcD1RdWljayBGaXgKLVF1aWNrRml4X2Rlc2NyaXB0aW9uPVF1aWNrIEZpeAotRm9ybWF0RG9jdW1lbnRfbGFiZWw9JkRvY3VtZW50Ci1Gb3JtYXREb2N1bWVudF90b29sdGlwPUZvcm1hdCBEb2N1bWVudAotRm9ybWF0RG9jdW1lbnRfZGVzY3JpcHRpb249Rm9ybWF0IERvY3VtZW50Ci1Gb3JtYXRBY3RpdmVFbGVtZW50c19sYWJlbD1BY3QmaXZlIEVsZW1lbnRzCi1Gb3JtYXRBY3RpdmVFbGVtZW50c190b29sdGlwPUZvcm1hdCBBY3RpdmUgRWxlbWVudHMKLUZvcm1hdEFjdGl2ZUVsZW1lbnRzX2Rlc2NyaXB0aW9uPUZvcm1hdCBBY3RpdmUgRWxlbWVudHMKLU9wZW5GaWxlRnJvbVNvdXJjZV9sYWJlbD1PcCZlbiBTZWxlY3Rpb24KLU9wZW5GaWxlRnJvbVNvdXJjZV90b29sdGlwPU9wZW4gYW4gZWRpdG9yIG9uIHRoZSBzZWxlY3RlZCBsaW5rCi1PcGVuRmlsZUZyb21Tb3VyY2VfZGVzY3JpcHRpb249T3BlbiBhbiBlZGl0b3Igb24gdGhlIHNlbGVjdGVkIGxpbmsKLVhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wPVNob3cgQXR0cmlidXRlcwotU3RydWN0dXJlU2VsZWN0RW5jbG9zaW5nX2xhYmVsPUVuY2xvc2luZyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcD1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgZW5jbG9zaW5nIGVsZW1lbnQKLVN0cnVjdHVyZVNlbGVjdE5leHRfbGFiZWw9TmV4dCBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3ROZXh0X3Rvb2x0aXA9RXhwYW5kIHNlbGVjdGlvbiB0byBpbmNsdWRlIG5leHQgc2libGluZwotU3RydWN0dXJlU2VsZWN0TmV4dF9kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgbmV4dCBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19sYWJlbD1QcmV2aW91cyBFbGVtZW50Ci1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c190b29sdGlwPUV4cGFuZCBzZWxlY3Rpb24gdG8gaW5jbHVkZSBwcmV2aW91cyBzaWJsaW5nCi1TdHJ1Y3R1cmVTZWxlY3RQcmV2aW91c19kZXNjcmlwdGlvbj1FeHBhbmQgc2VsZWN0aW9uIHRvIGluY2x1ZGUgcHJldmlvdXMgc2libGluZwotTUVTU0FHRV9YTUxfVkFMSURBVElPTl9NRVNTQUdFX1VJXz1YTUwgVmFsaWRhdG9yIHZhbGlkYXRpbmcgezB9CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdENvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlZWUxNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdENvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb25Qcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JQWN0aW9uRGVsZWdhdGUyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JRWRpdG9yUGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JVmlld0FjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3UGFydDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEFic3RyYWN0IGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9ycwotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgaW1wbGVtZW50cyBJRWRpdG9yQWN0aW9uRGVsZWdhdGUsIElBY3Rpb25EZWxlZ2F0ZTIsIElWaWV3QWN0aW9uRGVsZWdhdGUgewotCXN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xPU0VfQ09NTUVOVCA9ICItLT4iOyAvLyROT04tTkxTLTEkCi0Jc3RhdGljIGZpbmFsIFN0cmluZyBPUEVOX0NPTU1FTlQgPSAiPCEtLSI7IC8vJE5PTi1OTFMtMSQKLQotCUlFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW5XaXRoRXZlbnQoSUFjdGlvbiBhY3Rpb24sIEV2ZW50IGV2ZW50KSB7Ci0JCXJ1bihhY3Rpb24pOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bihJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJSURvY3VtZW50IGRvY3VtZW50ID0gdGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQodGV4dEVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKTsKLQkJCWlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQkJLy8gZ2V0IGN1cnJlbnQgdGV4dCBzZWxlY3Rpb24KLQkJCQlJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uID0gZ2V0Q3VycmVudFNlbGVjdGlvbigpOwotCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmlzRW1wdHkoKSkKLQkJCQkJcmV0dXJuOwotCi0JCQkJcHJvY2Vzc0FjdGlvbihkb2N1bWVudCwgdGV4dFNlbGVjdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JcHJpdmF0ZSBJVGV4dFNlbGVjdGlvbiBnZXRDdXJyZW50U2VsZWN0aW9uKCkgewotCQlpZiAoZkVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKSB7Ci0JCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoKElUZXh0RWRpdG9yKSBmRWRpdG9yKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLQkJCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHByb3ZpZGVyLmdldFNlbGVjdGlvbigpOwotCQkJCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJVGV4dFNlbGVjdGlvbikKLQkJCQkJcmV0dXJuIChJVGV4dFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJfQotCQl9Ci0JCXJldHVybiBUZXh0U2VsZWN0aW9uLmVtcHR5U2VsZWN0aW9uKCk7Ci0JfQotCi0JYWJzdHJhY3Qgdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbik7Ci0KLQl2b2lkIHJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotCQl0cnkgewotCQkJaW50IGFkanVzdGVkX2xlbmd0aCA9IGxlbmd0aDsKLQotCQkJLy8gcmVtb3ZlIG9wZW4gY29tbWVudHMKLQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQob2Zmc2V0LCBsZW5ndGgpOwotCQkJaW50IGluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKE9QRU5fQ09NTUVOVCk7Ci0JCQl3aGlsZSAoaW5kZXggIT0gLTEpIHsKLQkJCQlkb2N1bWVudC5yZXBsYWNlKG9mZnNldCArIGluZGV4LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKE9QRU5fQ09NTUVOVCwgaW5kZXggLSAxKTsKLQkJCQlhZGp1c3RlZF9sZW5ndGggLT0gT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJfQotCi0JCQkvLyByZW1vdmUgY2xvc2UgY29tbWVudHMKLQkJCXN0cmluZyA9IGRvY3VtZW50LmdldChvZmZzZXQsIGFkanVzdGVkX2xlbmd0aCk7Ci0JCQlpbmRleCA9IHN0cmluZy5sYXN0SW5kZXhPZihDTE9TRV9DT01NRU5UKTsKLQkJCXdoaWxlIChpbmRleCAhPSAtMSkgewotCQkJCWRvY3VtZW50LnJlcGxhY2Uob2Zmc2V0ICsgaW5kZXgsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCWluZGV4ID0gc3RyaW5nLmxhc3RJbmRleE9mKENMT1NFX0NPTU1FTlQsIGluZGV4IC0gMSk7Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Fic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBiYjM3MS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NjcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURlc2NyaXB0aW9uQnVpbGRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NQ29udGVudEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTUNvbnRlbnRCdWlsZGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLkNNSW1hZ2VVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uUHJvY2Vzc2luZ0luc3RydWN0aW9uOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBleHRlbmRzIEJhc2VOb2RlQWN0aW9uTWFuYWdlciB7Ci0KLQotCS8qKgotCSAqIEFkZE5vZGVBY3Rpb24KLQkgKi8KLQlwdWJsaWMgY2xhc3MgQWRkTm9kZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNtbm9kZTsKLQkJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJcHJvdGVjdGVkIGludCBpbmRleDsKLQkJcHJvdGVjdGVkIGludCBub2RlVHlwZTsKLQkJcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCQlwcm90ZWN0ZWQgU3RyaW5nIHVuZG9EZXNjcmlwdGlvbjsKLQotCi0JCXB1YmxpYyBBZGROb2RlQWN0aW9uKENNTm9kZSBjbW5vZGUsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMuY21ub2RlID0gY21ub2RlOwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0KLQkJCVN0cmluZyB0ZXh0ID0gZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpOwotCQkJc2V0VGV4dCh0ZXh0KTsKLQkJCWRlc2NyaXB0aW9uID0gdGV4dDsKLQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREICsgIiAiICsgdGV4dDsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IENNSW1hZ2VVdGlsLmdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpOwotCQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCWRlc2NyaXB0b3IgPSBpbWFnZURlc2NyaXB0b3JDYWNoZS5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKTsKLQkJCX0KLQkJCXNldEltYWdlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQkJfQotCi0KLQkJcHVibGljIEFkZE5vZGVBY3Rpb24oaW50IG5vZGVUeXBlLCBOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCQl0aGlzLm5vZGVUeXBlID0gbm9kZVR5cGU7Ci0JCQl0aGlzLmluZGV4ID0gaW5kZXg7Ci0JCQl0aGlzLnBhcmVudCA9IHBhcmVudDsKLQotCQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9DT01NRU5UOyAvLyROT04tTkxTLTEkCi0JCQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NPTU1FTlQ7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OOyAvLyROT04tTkxTLTEkCi0JCQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX1BST0NFU1NJTkdfSU5TVFJVQ1RJT047IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9DREFUQV9TRUNUSU9OOyAvLyROT04tTkxTLTEkCi0JCQkJCXVuZG9EZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NEQVRBX1NFQ1RJT047IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9QQ0RBVEE7IC8vJE5PTi1OTFMtMSQKLQkJCQkJdW5kb0Rlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfUENEQVRBOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXNldFRleHQoZGVzY3JpcHRpb24pOwotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGltYWdlRGVzY3JpcHRvckNhY2hlLmdldEltYWdlRGVzY3JpcHRvcihuZXcgSW50ZWdlcihub2RlVHlwZSkpKTsKLQkJfQotCi0KLQkJcHJvdGVjdGVkIHZvaWQgYWRkTm9kZUZvckNNTm9kZSgpIHsKLQkJCWlmIChwYXJlbnQgIT0gbnVsbCkgewotCQkJCWluc2VydChwYXJlbnQsIGNtbm9kZSwgaW5kZXgpOwotCQkJfQotCQl9Ci0KLQotCQlwcm90ZWN0ZWQgdm9pZCBhZGROb2RlRm9yTm9kZVR5cGUoKSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Q2hpbGROb2RlID0gbnVsbDsKLQkJCWJvb2xlYW4gZm9ybWF0ID0gdHJ1ZTsKLQkJCXN3aXRjaCAobm9kZVR5cGUpIHsKLQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDb21tZW50KFhNTFVJTWVzc2FnZXMuX1VJX0NPTU1FTlRfVkFMVUUpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oWE1MVUlNZXNzYWdlcy5fVUlfUElfVEFSR0VUX1ZBTFVFLCBYTUxVSU1lc3NhZ2VzLl9VSV9QSV9EQVRBX1ZBTFVFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVDREFUQVNlY3Rpb24oIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQlmb3JtYXQgPSBmYWxzZTsKLQkJCQkJbmV3Q2hpbGROb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUocGFyZW50LmdldE5vZGVOYW1lKCkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChuZXdDaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCUxpc3QgbGlzdCA9IG5ldyBWZWN0b3IoMSk7Ci0JCQkJbGlzdC5hZGQobmV3Q2hpbGROb2RlKTsKLQkJCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBsaXN0LCBpbmRleCwgZm9ybWF0KTsKLQkJCX0KLQkJfQotCi0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gdW5kb0Rlc2NyaXB0aW9uOwotCQl9Ci0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCQlpZiAoY21ub2RlICE9IG51bGwpIHsKLQkJCQlhZGROb2RlRm9yQ01Ob2RlKCk7Ci0JCQl9IGVsc2UgewotCQkJCWFkZE5vZGVGb3JOb2RlVHlwZSgpOwotCQkJfQotCQkJZW5kTm9kZUFjdGlvbih0aGlzKTsKLQkJfQotCX0KLQotCi0JLyoqCi0JICogRGVsZXRlQWN0aW9uCi0JICovCi0JcHVibGljIGNsYXNzIERlbGV0ZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCQlwcm90ZWN0ZWQgTGlzdCBsaXN0OwotCi0JCXB1YmxpYyBEZWxldGVBY3Rpb24oTGlzdCBsaXN0KSB7Ci0JCQlzZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUkVNT1ZFKTsgLy8kTk9OLU5MUy0xJAotCQkJdGhpcy5saXN0ID0gbGlzdDsKLQkJfQotCi0JCXB1YmxpYyBEZWxldGVBY3Rpb24oTm9kZSBub2RlKSB7Ci0JCQlzZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUkVNT1ZFKTsgLy8kTk9OLU5MUy0xJAotCQkJbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCWxpc3QuYWRkKG5vZGUpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5ERUxFVEU7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCWJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQotCQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQkJCUF0dHIgYXR0ciA9IChBdHRyKSBub2RlOwotCQkJCQlhdHRyLmdldE93bmVyRWxlbWVudCgpLnJlbW92ZUF0dHJpYnV0ZU5vZGUoYXR0cik7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJTm9kZSBwYXJlbnQgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCQkJaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0JCQkJCQlOb2RlIHByZXZpb3VzU2libGluZyA9IG5vZGUuZ2V0UHJldmlvdXNTaWJsaW5nKCk7Ci0JCQkJCQlpZiAocHJldmlvdXNTaWJsaW5nICE9IG51bGwgJiYgaXNXaGl0ZXNwYWNlVGV4dE5vZGUocHJldmlvdXNTaWJsaW5nKSkgewotCQkJCQkJCXBhcmVudC5yZW1vdmVDaGlsZChwcmV2aW91c1NpYmxpbmcpOwotCQkJCQkJfQotCQkJCQkJcGFyZW50LnJlbW92ZUNoaWxkKG5vZGUpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCi0JCQllbmROb2RlQWN0aW9uKHRoaXMpOwotCQl9Ci0JfQotCi0KLQljbGFzcyBJbWFnZURlc2NyaXB0b3JDYWNoZSB7Ci0JCXByb3RlY3RlZCBJbWFnZURlc2NyaXB0b3IgYXR0cmlidXRlSW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGF0dHJpYnV0ZVJlcUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUX1JFUV9PQkopOwotCQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yIGNkYXRhU2VjdGlvbkltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0RBVEFTRUNUSU9OKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBjb21tZW50SW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBlbGVtZW50SW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciBwaUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPQ0VTU0lOR0lOU1RSVUNUSU9OKTsKLQkJcHJvdGVjdGVkIEltYWdlRGVzY3JpcHRvciB0ZXh0SW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQpOwotCi0JCXB1YmxpYyBJbWFnZURlc2NyaXB0b3IgZ2V0SW1hZ2VEZXNjcmlwdG9yKE9iamVjdCBvYmplY3QpIHsKLQkJCUltYWdlRGVzY3JpcHRvciByZXN1bHQgPSBudWxsOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIENNTm9kZSkgewotCQkJCUNNTm9kZSBjbW5vZGUgPSAoQ01Ob2RlKSBvYmplY3Q7Ci0JCQkJc3dpdGNoIChjbW5vZGUuZ2V0Tm9kZVR5cGUoKSkgewotCQkJCQljYXNlIENNTm9kZS5BVFRSSUJVVEVfREVDTEFSQVRJT04gOiB7Ci0JCQkJCQlyZXN1bHQgPSBDTUltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKTsKLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCQlpZiAoKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbW5vZGUpLmdldFVzYWdlKCkgPT0gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCkKLQkJCQkJCQkJcmVzdWx0ID0gYXR0cmlidXRlUmVxSW1hZ2U7Ci0JCQkJCQkJZWxzZQotCQkJCQkJCQlyZXN1bHQgPSBhdHRyaWJ1dGVJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ01Ob2RlLkRBVEFfVFlQRSA6IHsKLQkJCQkJCXJlc3VsdCA9IHRleHRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04gOiB7Ci0JCQkJCQlyZXN1bHQgPSBDTUltYWdlVXRpbC5nZXRJbWFnZURlc2NyaXB0b3IoY21ub2RlKTsKLQkJCQkJCWlmIChyZXN1bHQgPT0gbnVsbCkKLQkJCQkJCQlyZXN1bHQgPSBlbGVtZW50SW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENNTm9kZS5HUk9VUCA6IHsKLQkJCQkJCXJlc3VsdCA9IGVsZW1lbnRJbWFnZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0JCQkJSW50ZWdlciBpbnRlZ2VyID0gKEludGVnZXIpIG9iamVjdDsKLQkJCQlzd2l0Y2ggKGludGVnZXIuaW50VmFsdWUoKSkgewotCQkJCQljYXNlIE5vZGUuQ09NTUVOVF9OT0RFIDogewotCQkJCQkJcmVzdWx0ID0gY29tbWVudEltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQkJCXJlc3VsdCA9IHBpSW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCQkJcmVzdWx0ID0gY2RhdGFTZWN0aW9uSW1hZ2U7Ci0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogewotCQkJCQkJcmVzdWx0ID0gdGV4dEltYWdlOwotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0JfQotCi0JLy8gVE9ETy4uLiByZW1vdmUgdGhpcyBjbGFzcy4gSSdtIHByZXR0eSBzdXJlIGl0IGlzIG5vIGxvbmdlciB1c2VkIGJ5Ci0JLy8gYW55b25lLgotCS8qKgotCSAqIEBkZXByYWNhdGVkCi0JICovCi0JcHVibGljIGNsYXNzIEluc2VydEFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCQlwcm90ZWN0ZWQgU3RyaW5nIGRlc2NyaXB0aW9uOwotCQlwcm90ZWN0ZWQgaW50IGluZGV4OwotCQlwcm90ZWN0ZWQgaW50IG5vZGVUeXBlOwotCQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0KLQkJcHVibGljIEluc2VydEFjdGlvbihpbnQgbm9kZVR5cGUsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJCXRoaXMubm9kZVR5cGUgPSBub2RlVHlwZTsKLQkJCXRoaXMuaW5kZXggPSBpbmRleDsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9DT01NRU5UOyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFIDogewotCQkJCQlkZXNjcmlwdGlvbiA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUFJPQ0VTU0lOR19JTlNUUlVDVElPTjsgLy8kTk9OLU5MUy0xJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSA6IHsKLQkJCQkJZGVzY3JpcHRpb24gPSBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0NEQVRBX1NFQ1RJT047IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCWRlc2NyaXB0aW9uID0gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9QQ0RBVEE7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yQ2FjaGUuZ2V0SW1hZ2VEZXNjcmlwdG9yKG5ldyBJbnRlZ2VyKG5vZGVUeXBlKSkpOwotCQl9Ci0KLQkJcHVibGljIEluc2VydEFjdGlvbihpbnQgbm9kZVR5cGUsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgsIFN0cmluZyB0aXRsZSkgewotCQkJdGhpcy5ub2RlVHlwZSA9IG5vZGVUeXBlOwotCQkJdGhpcy5pbmRleCA9IGluZGV4OwotCQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCQlkZXNjcmlwdGlvbiA9IHRpdGxlOwotCQkJc2V0VGV4dChkZXNjcmlwdGlvbik7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yQ2FjaGUuZ2V0SW1hZ2VEZXNjcmlwdG9yKG5ldyBJbnRlZ2VyKG5vZGVUeXBlKSkpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlyZXR1cm4gWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BREQgKyAiICIgKyBkZXNjcmlwdGlvbjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCQliZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0KLQkJCURvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQkJTm9kZSBuZXdDaGlsZE5vZGUgPSBudWxsOwotCQkJYm9vbGVhbiBmb3JtYXQgPSB0cnVlOwotCQkJc3dpdGNoIChub2RlVHlwZSkgewotCQkJCWNhc2UgTm9kZS5DT01NRU5UX05PREUgOiB7Ci0JCQkJCW5ld0NoaWxkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoWE1MVUlNZXNzYWdlcy5fVUlfQ09NTUVOVF9WQUxVRSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgOiB7Ci0JCQkJCW5ld0NoaWxkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihYTUxVSU1lc3NhZ2VzLl9VSV9QSV9UQVJHRVRfVkFMVUUsIFhNTFVJTWVzc2FnZXMuX1VJX1BJX0RBVEFfVkFMVUUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5DREFUQV9TRUNUSU9OX05PREUgOiB7Ci0JCQkJCW5ld0NoaWxkTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUNEQVRBU2VjdGlvbigiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgTm9kZS5URVhUX05PREUgOiB7Ci0JCQkJCWZvcm1hdCA9IGZhbHNlOwotCQkJCQluZXdDaGlsZE5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwYXJlbnQuZ2V0Tm9kZU5hbWUoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKG5ld0NoaWxkTm9kZSAhPSBudWxsKSB7Ci0JCQkJTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigxKTsKLQkJCQlsaXN0LmFkZChuZXdDaGlsZE5vZGUpOwotCQkJCWluc2VydE5vZGVzQXRJbmRleChwYXJlbnQsIGxpc3QsIGluZGV4LCBmb3JtYXQpOwotCQkJfQotCi0JCQllbmROb2RlQWN0aW9uKHRoaXMpOwotCQl9Ci0JfQotCi0KLQkvKioKLQkgKiBSZXBsYWNlTm9kZUFjdGlvbgotCSAqLwotCXB1YmxpYyBjbGFzcyBSZXBsYWNlTm9kZUFjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCQlwcm90ZWN0ZWQgQ01Ob2RlIGNtbm9kZTsKLQkJcHJvdGVjdGVkIFN0cmluZyBkZXNjcmlwdGlvbjsKLQkJcHJvdGVjdGVkIGludCBlbmRJbmRleDsKLQkJcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCQlwcm90ZWN0ZWQgaW50IHN0YXJ0SW5kZXg7Ci0KLQotCQlwdWJsaWMgUmVwbGFjZU5vZGVBY3Rpb24oTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUsIGludCBzdGFydEluZGV4LCBpbnQgZW5kSW5kZXgpIHsKLQkJCXRoaXMucGFyZW50ID0gcGFyZW50OwotCQkJdGhpcy5jbW5vZGUgPSBjbW5vZGU7Ci0JCQl0aGlzLnN0YXJ0SW5kZXggPSBzdGFydEluZGV4OwotCQkJdGhpcy5lbmRJbmRleCA9IGVuZEluZGV4OwotCi0JCQlzZXRUZXh0KGdldExhYmVsKHBhcmVudCwgY21ub2RlKSk7Ci0JCQlzZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yQ2FjaGUuZ2V0SW1hZ2VEZXNjcmlwdG9yKGNtbm9kZSkpOwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfVU5ET19SRVBMQUNFX0RFU0NSSVBUSU9OOyAvLyROT04tTkxTLTEkCi0JCQlyZXN1bHQgKz0gIiAiICsgZ2V0TGFiZWwocGFyZW50LCBjbW5vZGUpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcnVuKCkgewotCQkJYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCi0JCQlpZiAocGFyZW50ICE9IG51bGwgJiYgY21ub2RlICE9IG51bGwpIHsKLQkJCQlyZW1vdmUocGFyZW50LCBzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0JCQkJaW5zZXJ0KHBhcmVudCwgY21ub2RlLCBzdGFydEluZGV4KTsKLQkJCX0KLQkJCWVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2VEZXNjcmlwdG9yQ2FjaGUgaW1hZ2VEZXNjcmlwdG9yQ2FjaGUgPSBuZXcgSW1hZ2VEZXNjcmlwdG9yQ2FjaGUoKTsKLQlwcm90ZWN0ZWQgVmlld2VyIGZWaWV3ZXI7Ci0KLQlwdWJsaWMgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlcihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBNb2RlbFF1ZXJ5IG1vZGVsUXVlcnksIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIG1vZGVsUXVlcnkpOwotCQl0aGlzLmZWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBiZWdpbk5vZGVBY3Rpb24oTm9kZUFjdGlvbiBhY3Rpb24pIHsKLQkJZk1vZGVsLmJlZ2luUmVjb3JkaW5nKGFjdGlvbiwgYWN0aW9uLmdldFVuZG9EZXNjcmlwdGlvbigpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQXR0cmlidXRlQWN0aW9uKEVsZW1lbnQgcGFyZW50LCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCUFjdGlvbiBhY3Rpb24gPSBudWxsOwotCQlpZiAoYWQgPT0gbnVsbCkgewotCQkJYWN0aW9uID0gbmV3IEVkaXRBdHRyaWJ1dGVBY3Rpb24odGhpcywgcGFyZW50LCBudWxsLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19BVFRSSUJVVEUsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfTkVXX0FUVFJJQlVURV9USVRMRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9IGVsc2UgewotCQkJYWN0aW9uID0gbmV3IEFkZE5vZGVBY3Rpb24oYWQsIHBhcmVudCwgLTEpOwotCQl9Ci0JCXJldHVybiBhY3Rpb247Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZENEYXRhU2VjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KSB7Ci0JCXJldHVybiBuZXcgQWRkTm9kZUFjdGlvbihOb2RlLkNEQVRBX1NFQ1RJT05fTk9ERSwgcGFyZW50LCBpbmRleCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZENvbW1lbnRBY3Rpb24oTm9kZSBwYXJlbnQsIGludCBpbmRleCkgewotCQlyZXR1cm4gbmV3IEFkZE5vZGVBY3Rpb24oTm9kZS5DT01NRU5UX05PREUsIHBhcmVudCwgaW5kZXgpOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGREb2N0eXBlQWN0aW9uKERvY3VtZW50IGRvY3VtZW50LCBpbnQgaW5kZXgpIHsKLQkJcmV0dXJuIG5ldyBFZGl0RG9jdHlwZUFjdGlvbihmTW9kZWwsIGRvY3VtZW50LCBmTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0RURF9JTkZPUk1BVElPTik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRWxlbWVudEFjdGlvbihOb2RlIHBhcmVudCwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQsIGludCBpbmRleCkgewotCQlBY3Rpb24gYWN0aW9uID0gbnVsbDsKLQkJaWYgKGVkID09IG51bGwpIHsKLQkJCWFjdGlvbiA9IG5ldyBFZGl0RWxlbWVudEFjdGlvbih0aGlzLCBwYXJlbnQsIGluZGV4LCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19FTEVNRU5ULCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX05FV19FTEVNRU5UX1RJVExFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0gZWxzZSB7Ci0JCQlhY3Rpb24gPSBuZXcgQWRkTm9kZUFjdGlvbihlZCwgcGFyZW50LCBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkUENEYXRhQWN0aW9uKE5vZGUgcGFyZW50LCBDTURhdGFUeXBlIGRhdGFUeXBlLCBpbnQgaW5kZXgpIHsKLQkJQWN0aW9uIGFjdGlvbiA9IG51bGw7Ci0JCWlmIChkYXRhVHlwZSA9PSBudWxsKSB7Ci0JCQlhY3Rpb24gPSBuZXcgQWRkTm9kZUFjdGlvbihOb2RlLlRFWFRfTk9ERSwgcGFyZW50LCBpbmRleCk7Ci0JCX0gZWxzZSB7Ci0JCQlhY3Rpb24gPSBuZXcgQWRkTm9kZUFjdGlvbihkYXRhVHlwZSwgcGFyZW50LCBpbmRleCk7Ci0JCX0KLQkJcmV0dXJuIGFjdGlvbjsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkUHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJTm9kZSByZWZDaGlsZCA9IGdldFJlZkNoaWxkTm9kZUF0SW5kZXgocGFyZW50LCBpbmRleCk7Ci0JCUFjdGlvbiBhY3Rpb24gPSBuZXcgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbih0aGlzLCBwYXJlbnQsIHJlZkNoaWxkLCBYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX0FERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OLCBYTUxVSU1lc3NhZ2VzLkFERF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWFjdGlvbi5zZXRJbWFnZURlc2NyaXB0b3IoaW1hZ2VEZXNjcmlwdG9yQ2FjaGUuZ2V0SW1hZ2VEZXNjcmlwdG9yKG5ldyBJbnRlZ2VyKE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSkpOwotCQlyZXR1cm4gYWN0aW9uOwotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRTY2hlbWFJbmZvQWN0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gbmV3IEVkaXRTY2hlbWFJbmZvQWN0aW9uKHRoaXMsIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBmTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX1NDSEVNQV9JTkZPUk1BVElPTik7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRGVsZXRlQWN0aW9uKExpc3Qgc2VsZWN0aW9uKSB7Ci0JCURlbGV0ZUFjdGlvbiBkZWxldGVBY3Rpb24gPSBuZXcgRGVsZXRlQWN0aW9uKHNlbGVjdGlvbik7Ci0JCWRlbGV0ZUFjdGlvbi5zZXRFbmFibGVkKHNlbGVjdGlvbi5zaXplKCkgPiAwKTsKLQkJcmV0dXJuIGRlbGV0ZUFjdGlvbjsKLQl9Ci0KLQotCXB1YmxpYyBET01Db250ZW50QnVpbGRlciBjcmVhdGVET01Db250ZW50QnVpbGRlcihEb2N1bWVudCBkb2N1bWVudCkgewotCQlET01Db250ZW50QnVpbGRlckltcGwgYnVpbGRlciA9IG5ldyBET01Db250ZW50QnVpbGRlckltcGwoZG9jdW1lbnQpOwotCQlyZXR1cm4gYnVpbGRlcjsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdEF0dHJpYnV0ZUFjdGlvbihBdHRyIGF0dHIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24gYWQpIHsKLQkJcmV0dXJuIG5ldyBFZGl0QXR0cmlidXRlQWN0aW9uKHRoaXMsIGF0dHIuZ2V0T3duZXJFbGVtZW50KCksIGF0dHIsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9BVFRSSUJVVEUsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9BVFRSSUJVVEVfVElUTEUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdERvY3R5cGVBY3Rpb24oRG9jdW1lbnRUeXBlIGRvY3R5cGUpIHsKLQkJcmV0dXJuIG5ldyBFZGl0RG9jdHlwZUFjdGlvbihmTW9kZWwsIGRvY3R5cGUsIGZNb2RlbC5nZXRCYXNlTG9jYXRpb24oKSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX0RPQ1RZUEUpOyAvLyROT04tTkxTLTEkCi0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0JCXJldHVybiBuZXcgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbih0aGlzLCBwaSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX1BST0NFU1NJTkdfSU5TVFJVQ1RJT04sIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX1RJVExFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JfQotCi0KLQlwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRTY2hlbWFJbmZvQWN0aW9uKEVsZW1lbnQgZWxlbWVudCkgewotCQlyZXR1cm4gbmV3IEVkaXRTY2hlbWFJbmZvQWN0aW9uKHRoaXMsIGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpLCBmTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCksIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfRURJVF9OQU1FU1BBQ0VTKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCi0JcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVSZW5hbWVBY3Rpb24oTm9kZSBub2RlKSB7Ci0JCUFjdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCXJlc3VsdCA9IG5ldyBFZGl0RWxlbWVudEFjdGlvbih0aGlzLCAoRWxlbWVudCkgbm9kZSwgWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9SRU5BTUUsIFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfUkVOQU1FX1RJVExFKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBBY3Rpb24gY3JlYXRlUmVwbGFjZUFjdGlvbihOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSwgaW50IHN0YXJ0SW5kZXgsIGludCBlbmRJbmRleCkgewotCQlyZXR1cm4gbmV3IFJlcGxhY2VOb2RlQWN0aW9uKHBhcmVudCwgY21ub2RlLCBzdGFydEluZGV4LCBlbmRJbmRleCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZW5kTm9kZUFjdGlvbihOb2RlQWN0aW9uIGFjdGlvbikgewotCQlmTW9kZWwuZW5kUmVjb3JkaW5nKGFjdGlvbik7Ci0JfQotCi0KLQotCXB1YmxpYyB2b2lkIGZpbGxDb250ZXh0TWVudShJTWVudU1hbmFnZXIgbWVudU1hbmFnZXIsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCXRyeSB7Ci0JCQlMaXN0IHNlbGVjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBlcyA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCQkJCWZvciAoSXRlcmF0b3IgaSA9IGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJCQlzZWxlY3Rpb25MaXN0LmFkZChpLm5leHQoKSk7Ci0JCQkJfQotCQkJfQotCi0JCQljb250cmlidXRlQWN0aW9ucyhtZW51TWFuYWdlciwgc2VsZWN0aW9uTGlzdCk7Ci0JCX0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQllLnByaW50U3RhY2tUcmFjZSgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoTm9kZSBwYXJlbnQsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIHJlc3VsdCA9ICI/IiArIGNtbm9kZSArICI/IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCWlmIChjbW5vZGUgIT0gbnVsbCkgewotCQkJcmVzdWx0ID0gKFN0cmluZykgY21ub2RlLmdldFByb3BlcnR5KCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCQlpZiAocmVzdWx0ID09IG51bGwpIHsKLQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQKSB7Ci0JCQkJCUNNRGVzY3JpcHRpb25CdWlsZGVyIGRlc2NyaXB0aW9uQnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotCQkJCQlyZXN1bHQgPSBkZXNjcmlwdGlvbkJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbihjbW5vZGUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IERPTU5hbWVzcGFjZUhlbHBlci5jb21wdXRlTmFtZShjbW5vZGUsIHBhcmVudCwgbnVsbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWRNb2RlbCBnZXRNb2RlbCgpIHsKLQkJcmV0dXJuIGZNb2RlbDsKLQl9Ci0KLQotCXB1YmxpYyBTaGVsbCBnZXRXb3JrYmVuY2hXaW5kb3dTaGVsbCgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydChOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSwgaW50IGluZGV4KSB7Ci0JCURvY3VtZW50IGRvY3VtZW50ID0gcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBwYXJlbnQgOiBwYXJlbnQuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlET01Db250ZW50QnVpbGRlciBidWlsZGVyID0gY3JlYXRlRE9NQ29udGVudEJ1aWxkZXIoZG9jdW1lbnQpOwotCQlidWlsZGVyLnNldEJ1aWxkUG9saWN5KERPTUNvbnRlbnRCdWlsZGVyLkJVSUxEX09OTFlfUkVRVUlSRURfQ09OVEVOVCk7Ci0JCWJ1aWxkZXIuYnVpbGQocGFyZW50LCBjbW5vZGUpOwotCQlpbnNlcnROb2Rlc0F0SW5kZXgocGFyZW50LCBidWlsZGVyLmdldFJlc3VsdCgpLCBpbmRleCk7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBpbnNlcnROb2Rlc0F0SW5kZXgoTm9kZSBwYXJlbnQsIExpc3QgbGlzdCwgaW50IGluZGV4KSB7Ci0JCWluc2VydE5vZGVzQXRJbmRleChwYXJlbnQsIGxpc3QsIGluZGV4LCB0cnVlKTsKLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGluc2VydE5vZGVzQXRJbmRleChOb2RlIHBhcmVudCwgTGlzdCBsaXN0LCBpbnQgaW5kZXgsIGJvb2xlYW4gZm9ybWF0KSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJaWYgKGluZGV4ID09IC0xKSB7Ci0JCQlpbmRleCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQl9Ci0JCU5vZGUgcmVmQ2hpbGQgPSAoaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKGluZGV4KSA6IG51bGw7Ci0KLQkJLy8gaGVyZSB3ZSBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB0aGUgcHJldmlvdXMgbm9kZSBpcyBhICd3aGl0ZQotCQkvLyBzcGFjZScgVGV4dCBub2RlCi0JCS8vIHdlIHNob3VsZCByZWFsbHkgZG8gdGhlIGluc2VydCBiZWZvcmUgdGhpcyBub2RlCi0JCS8vCi0JCWludCBwcmV2SW5kZXggPSBpbmRleCAtIDE7Ci0JCU5vZGUgcHJldkNoaWxkID0gKHByZXZJbmRleCA8IG5vZGVMaXN0LmdldExlbmd0aCgpKSA/IG5vZGVMaXN0Lml0ZW0ocHJldkluZGV4KSA6IG51bGw7Ci0JCWlmIChpc1doaXRlc3BhY2VUZXh0Tm9kZShwcmV2Q2hpbGQpKSB7Ci0JCQlyZWZDaGlsZCA9IHByZXZDaGlsZDsKLQkJfQotCi0JCWZvciAoSXRlcmF0b3IgaSA9IGxpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOb2RlIG5ld05vZGUgPSAoTm9kZSkgaS5uZXh0KCk7Ci0KLQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCUVsZW1lbnQgcGFyZW50RWxlbWVudCA9IChFbGVtZW50KSBwYXJlbnQ7Ci0JCQkJcGFyZW50RWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKChBdHRyKSBuZXdOb2RlKTsKLQkJCX0gZWxzZSB7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCByZWZDaGlsZCk7Ci0JCQl9Ci0JCX0KLQotCQlib29sZWFuIGZvcm1hdERlZXAgPSBmYWxzZTsKLQkJZm9yIChJdGVyYXRvciBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbmV3Tm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlmb3JtYXREZWVwID0gdHJ1ZTsKLQkJCX0KLQotCQkJaWYgKGZvcm1hdCkgewotCQkJCXJlZm9ybWF0KG5ld05vZGUsIGZvcm1hdERlZXApOwotCQkJfQotCQl9Ci0KLQkJc2V0Vmlld2VyU2VsZWN0aW9uKGxpc3QpOwotCX0KLQotCi0JLyoqCi0JICogVGhpcyBtZXRob2QgaXMgYWJzdHJhY3Qgc2luY2UgY3VycmVudGx5LCB0aGUgc2VkIGVkaXRvciBpcyByZXF1aXJlZCB0bwotCSAqIHBlcmZvcm0gZm9ybWF0aW5nIGFuZCB3ZSBkb24ndCB3YW50IHRvIGNyZWF0ZSBhIGRlcGVuZGVuY3kgb24gdGhlIHNlZAotCSAqIGVkaXRvci4KLQkgKi8KLQlwdWJsaWMgYWJzdHJhY3Qgdm9pZCByZWZvcm1hdChOb2RlIHBhcmVudCwgYm9vbGVhbiBkZWVwKTsKLQotCi0JcHVibGljIHZvaWQgcmVtb3ZlKE5vZGUgcGFyZW50LCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KSB7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gcGFyZW50LmdldENoaWxkTm9kZXMoKTsKLQkJZm9yIChpbnQgaSA9IGVuZEluZGV4OyBpID49IHN0YXJ0SW5kZXg7IGktLSkgewotCQkJTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCWlmIChub2RlICE9IG51bGwpIHsKLQkJCQlwYXJlbnQucmVtb3ZlQ2hpbGQobm9kZSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNlbGVjdGlvbihMaXN0IGxpc3QpIHsKLQkJaWYgKGZWaWV3ZXIgIT0gbnVsbCkgewotCQkJZlZpZXdlci5zZXRTZWxlY3Rpb24obmV3IFN0cnVjdHVyZWRTZWxlY3Rpb24obGlzdCksIHRydWUpOwotCQl9Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRWaWV3ZXJTZWxlY3Rpb24oTm9kZSBub2RlKSB7Ci0JCWlmIChmVmlld2VyICE9IG51bGwpIHsKLQkJCWZWaWV3ZXIuc2V0U2VsZWN0aW9uKG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKG5vZGUpLCB0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkNvbnRyaWJ1dG9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BY3Rpb25Db250cmlidXRvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFhOGIxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FjdGlvbkNvbnRyaWJ1dG9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JU3RhdHVzTGluZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25CYXJzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hBY3Rpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yQWN0aW9uRGVmaW5pdGlvbklkczsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLlJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLkFjdGlvbkRlZmluaXRpb25JZHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5hY3Rpb25zLlN0cnVjdHVyZWRUZXh0RWRpdG9yQWN0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBYTUxFZGl0b3JBY3Rpb25Db250cmlidXRvcgotICogCi0gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBpbnNpZGUgbXVsdGkgcGFnZSBlZGl0b3IncwotICogQWN0aW9uQmFyQ29udHJpYnV0b3IsIHNpbmNlIGNhc2NhZGVkIGluaXQoKSBjYWxsIGZyb20gdGhlCi0gKiBBY3Rpb25CYXJDb250cmlidXRvciB3aWxsIGNhdXNlcyBleGNlcHRpb24gYW5kIGl0IGxlYWRzIHRvIGxvc2Ugd2hvbGUKLSAqIHRvb2xiYXJzLgotICogCi0gKiBJbnN0ZWFkLCB1c2UgU291cmNlUGFnZUFjdGlvbkNvbnRyaWJ1dG9yIGZvciBzb3VyY2UgcGFnZSBjb250cmlidXRvciBvZgotICogbXVsdGkgcGFnZSBlZGl0b3IuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIHN0aWxsIHZhbGlkIGZvciBzaW5nbGUgcGFnZSBlZGl0b3IuCi0gKi8KLXB1YmxpYyBjbGFzcyBBY3Rpb25Db250cmlidXRvclhNTCBleHRlbmRzIEFjdGlvbkNvbnRyaWJ1dG9yIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFRElUT1JfSURTID0geyJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZSIsICJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sLnNvdXJjZTIiLCAib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNsZWFudXBEb2N1bWVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmQ29tbWVudCA9IG51bGw7Ci0JLy8gdG9vbHRpcAotCS8vIGFjdGlvbgotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkNvbnRlbnRBc3Npc3QgPSBudWxsOwotCS8vIGFjdGlvbgotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZpbmRPY2N1cnJlbmNlcyA9IG51bGw7Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmRm9ybWF0QWN0aXZlRWxlbWVudHMgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZkZvcm1hdERvY3VtZW50ID0gbnVsbDsKLQlwcm90ZWN0ZWQgTWVudU1hbmFnZXIgZkZvcm1hdE1lbnUgPSBudWxsOwotCXByb3RlY3RlZCBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24gZk9wZW5GaWxlQWN0aW9uID0gbnVsbDsgLy8gb3BlbiBmaWxlCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmUXVpY2tGaXggPSBudWxsOwotCi0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmU2hvd1Rvb2x0aXBBY3Rpb24gPSBudWxsOyAvLyBzaG93Ci0JcHJvdGVjdGVkIFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbiBmVW5jb21tZW50ID0gbnVsbDsKLQotCXB1YmxpYyBBY3Rpb25Db250cmlidXRvclhNTCgpIHsKLQkJc3VwZXIoKTsKLQotCQlSZXNvdXJjZUJ1bmRsZSByZXNvdXJjZUJ1bmRsZSA9IFhNTFVJTWVzc2FnZXMuZ2V0UmVzb3VyY2VCdW5kbGUoKTsKLQotCQkvLyBlZGl0IGNvbW1hbmRzCi0JCWZTaG93VG9vbHRpcEFjdGlvbiA9IG5ldyBSZXRhcmdldFRleHRFZGl0b3JBY3Rpb24ocmVzb3VyY2VCdW5kbGUsICIiKTsJLy8kTk9OLU5MUy0xJAotCQlmU2hvd1Rvb2x0aXBBY3Rpb24uc2V0QWN0aW9uRGVmaW5pdGlvbklkKEFjdGlvbkRlZmluaXRpb25JZHMuSU5GT1JNQVRJT04pOwotCi0JCWZDb250ZW50QXNzaXN0ID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOwkvLyROT04tTkxTLTEkCi0JCWZDb250ZW50QXNzaXN0LnNldEFjdGlvbkRlZmluaXRpb25JZChJVGV4dEVkaXRvckFjdGlvbkRlZmluaXRpb25JZHMuQ09OVEVOVF9BU1NJU1RfUFJPUE9TQUxTKTsKLQotCQlmUXVpY2tGaXggPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7CS8vJE5PTi1OTFMtMSQKLQkJZlF1aWNrRml4LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLlFVSUNLX0ZJWCk7Ci0KLQkJLy8gc291cmNlIGNvbW1hbmRzCi0JCWZDbGVhbnVwRG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7CS8vJE5PTi1OTFMtMSQKLQkJZkNsZWFudXBEb2N1bWVudC5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5DTEVBTlVQX0RPQ1VNRU5UKTsKLQotCQlmRm9ybWF0RG9jdW1lbnQgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7CS8vJE5PTi1OTFMtMSQKLQkJZkZvcm1hdERvY3VtZW50LnNldEFjdGlvbkRlZmluaXRpb25JZChBY3Rpb25EZWZpbml0aW9uSWRzLkZPUk1BVF9ET0NVTUVOVCk7Ci0KLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOwkvLyROT04tTkxTLTEkCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GT1JNQVRfQUNUSVZFX0VMRU1FTlRTKTsKLQotCQlmRm9ybWF0TWVudSA9IG5ldyBNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLkZvcm1hdE1lbnVfbGFiZWwpOwotCQlmRm9ybWF0TWVudS5hZGQoZkZvcm1hdERvY3VtZW50KTsKLQkJZkZvcm1hdE1lbnUuYWRkKGZGb3JtYXRBY3RpdmVFbGVtZW50cyk7Ci0KLQkJLy8gbmF2aWdhdGUgY29tbWFuZHMKLQkJZk9wZW5GaWxlQWN0aW9uID0gbmV3IFJldGFyZ2V0VGV4dEVkaXRvckFjdGlvbihyZXNvdXJjZUJ1bmRsZSwgIiIpOwkvLyROT04tTkxTLTEkCi0JCWZPcGVuRmlsZUFjdGlvbi5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5PUEVOX0ZJTEUpOwotCi0JCWZGaW5kT2NjdXJyZW5jZXMgPSBuZXcgUmV0YXJnZXRUZXh0RWRpdG9yQWN0aW9uKHJlc291cmNlQnVuZGxlLCAiIik7CS8vJE5PTi1OTFMtMSQKLQkJZkZpbmRPY2N1cnJlbmNlcy5zZXRBY3Rpb25EZWZpbml0aW9uSWQoQWN0aW9uRGVmaW5pdGlvbklkcy5GSU5EX09DQ1VSUkVOQ0VTKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUb01lbnUoSU1lbnVNYW5hZ2VyIG1lbnUpIHsKLQkJLy8gZWRpdCBjb21tYW5kcwotCQlJTWVudU1hbmFnZXIgZWRpdE1lbnUgPSBtZW51LmZpbmRNZW51VXNpbmdQYXRoKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElUKTsKLQkJaWYgKGVkaXRNZW51ICE9IG51bGwpIHsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZUb2dnbGVJbnNlcnRNb2RlQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJZWRpdE1lbnUuYWRkKGZFeHBhbmRTZWxlY3Rpb25Ub01lbnUpOwotCQkJZWRpdE1lbnUuYWRkKGZDb21tYW5kc1NlcGFyYXRvcik7Ci0JCQllZGl0TWVudS5hZGQoZlNob3dUb29sdGlwQWN0aW9uKTsKLQkJCWVkaXRNZW51LmFkZChmQ29udGVudEFzc2lzdCk7Ci0JCQllZGl0TWVudS5hZGQoZlF1aWNrRml4KTsKLQkJCWVkaXRNZW51LmFkZChmTWVudUFkZGl0aW9uc0dyb3VwTWFya2VyKTsKLQkJfQotCi0JCS8vIHNvdXJjZSBjb21tYW5kcwotCQlTdHJpbmcgc291cmNlTWVudUxhYmVsID0gWE1MVUlNZXNzYWdlcy5Tb3VyY2VNZW51X2xhYmVsOwotCQlTdHJpbmcgc291cmNlTWVudUlkID0gInNvdXJjZU1lbnVJZCI7IC8vJE5PTi1OTFMtMSQKLQkJSU1lbnVNYW5hZ2VyIHNvdXJjZU1lbnUgPSBuZXcgTWVudU1hbmFnZXIoc291cmNlTWVudUxhYmVsLCBzb3VyY2VNZW51SWQpOwotCQltZW51Lmluc2VydEFmdGVyKElXb3JrYmVuY2hBY3Rpb25Db25zdGFudHMuTV9FRElULCBzb3VyY2VNZW51KTsKLQkJaWYgKHNvdXJjZU1lbnUgIT0gbnVsbCkgewotCQkJc291cmNlTWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZUb2dnbGVDb21tZW50KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZBZGRCbG9ja0NvbW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZlJlbW92ZUJsb2NrQ29tbWVudCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRSaWdodCk7Ci0JCQlzb3VyY2VNZW51LmFkZChmU2hpZnRMZWZ0KTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZDbGVhbnVwRG9jdW1lbnQpOwotCQkJc291cmNlTWVudS5hZGQoZkZvcm1hdE1lbnUpOwotCQkJc291cmNlTWVudS5hZGQoZkNvbW1hbmRzU2VwYXJhdG9yKTsKLQkJCXNvdXJjZU1lbnUuYWRkKGZGaW5kT2NjdXJyZW5jZXMpOwotCQl9Ci0KLQkJLy8gbmF2aWdhdGUgY29tbWFuZHMKLQkJSU1lbnVNYW5hZ2VyIG5hdmlnYXRlTWVudSA9IG1lbnUuZmluZE1lbnVVc2luZ1BhdGgoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5NX05BVklHQVRFKTsKLQkJaWYgKG5hdmlnYXRlTWVudSAhPSBudWxsKSB7Ci0JCQluYXZpZ2F0ZU1lbnUuYXBwZW5kVG9Hcm91cChJV29ya2JlbmNoQWN0aW9uQ29uc3RhbnRzLk9QRU5fRVhULCBmQ29tbWFuZHNTZXBhcmF0b3IpOwotCQkJbmF2aWdhdGVNZW51LmFwcGVuZFRvR3JvdXAoSVdvcmtiZW5jaEFjdGlvbkNvbnN0YW50cy5PUEVOX0VYVCwgZk9wZW5GaWxlQWN0aW9uKTsKLQkJfQotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5lZGl0LnV0aWwuQWN0aW9uQ29udHJpYnV0b3IjZ2V0RXh0ZW5zaW9uSURzKCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RXh0ZW5zaW9uSURzKCkgewotCQlyZXR1cm4gRURJVE9SX0lEUzsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLklFZGl0b3JBY3Rpb25CYXJDb250cmlidXRvciNzZXRBY3RpdmVFZGl0b3IoSUVkaXRvclBhcnQpCi0JICovCi0JcHVibGljIHZvaWQgc2V0QWN0aXZlRWRpdG9yKElFZGl0b3JQYXJ0IGFjdGl2ZUVkaXRvcikgewotCQlpZiAoZ2V0QWN0aXZlRWRpdG9yUGFydCgpID09IGFjdGl2ZUVkaXRvcikKLQkJCXJldHVybjsKLQkJc3VwZXIuc2V0QWN0aXZlRWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJSUFjdGlvbkJhcnMgYWN0aW9uQmFycyA9IGdldEFjdGlvbkJhcnMoKTsKLQkJaWYgKGFjdGlvbkJhcnMgIT0gbnVsbCkgewotCQkJSVN0YXR1c0xpbmVNYW5hZ2VyIHN0YXR1c0xpbmVNYW5hZ2VyID0gYWN0aW9uQmFycy5nZXRTdGF0dXNMaW5lTWFuYWdlcigpOwotCQkJaWYgKHN0YXR1c0xpbmVNYW5hZ2VyICE9IG51bGwpIHsKLQkJCQlzdGF0dXNMaW5lTWFuYWdlci5zZXRNZXNzYWdlKG51bGwpOwotCQkJCXN0YXR1c0xpbmVNYW5hZ2VyLnNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCX0KLQkJfQotCi0JCUlUZXh0RWRpdG9yIHRleHRFZGl0b3IgPSBnZXRUZXh0RWRpdG9yKGFjdGl2ZUVkaXRvcik7Ci0KLQkJZlNob3dUb29sdGlwQWN0aW9uLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfSU5GT1JNQVRJT04pKTsKLQkJZkNvbnRlbnRBc3Npc3Quc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9DT05URU5UQVNTSVNUX1BST1BPU0FMUykpOwotCQlmUXVpY2tGaXguc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9RVUlDS19GSVgpKTsKLQotCQlmQ2xlYW51cERvY3VtZW50LnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfQ0xFQU5VUF9ET0NVTUVOVCkpOwotCQlmRm9ybWF0RG9jdW1lbnQuc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9GT1JNQVRfRE9DVU1FTlQpKTsKLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRk9STUFUX0FDVElWRV9FTEVNRU5UUykpOwotCQlmQ2xlYW51cERvY3VtZW50LnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdERvY3VtZW50LnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQkJZkZvcm1hdEFjdGl2ZUVsZW1lbnRzLnNldEVuYWJsZWQodGV4dEVkaXRvciAhPSBudWxsICYmIHRleHRFZGl0b3IuaXNFZGl0YWJsZSgpKTsKLQotCQlmT3BlbkZpbGVBY3Rpb24uc2V0QWN0aW9uKGdldEFjdGlvbih0ZXh0RWRpdG9yLCBTdHJ1Y3R1cmVkVGV4dEVkaXRvckFjdGlvbkNvbnN0YW50cy5BQ1RJT05fTkFNRV9PUEVOX0ZJTEUpKTsKLQotCQlmRmluZE9jY3VycmVuY2VzLnNldEFjdGlvbihnZXRBY3Rpb24odGV4dEVkaXRvciwgU3RydWN0dXJlZFRleHRFZGl0b3JBY3Rpb25Db25zdGFudHMuQUNUSU9OX05BTUVfRklORF9PQ0NVUlJFTkNFUykpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5JU291cmNlVmlld2VyQWN0aW9uQmFyQ29udHJpYnV0b3Ijc2V0Vmlld2VyU3BlY2lmaWNDb250cmlidXRpb25zRW5hYmxlZChib29sZWFuKQotCSAqLwotCXB1YmxpYyB2b2lkIHNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoYm9vbGVhbiBlbmFibGVkKSB7Ci0JCXN1cGVyLnNldFZpZXdlclNwZWNpZmljQ29udHJpYnV0aW9uc0VuYWJsZWQoZW5hYmxlZCk7Ci0KLQkJZlNob3dUb29sdGlwQWN0aW9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZDb250ZW50QXNzaXN0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWZRdWlja0ZpeC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQkvLyBjbGVhbnVwIGFuZCBmb3JtYXQgZG9jdW1lbnQgYWN0aW9ucyBkbyBub3QgcmVseSBvbiBzb3VyY2Ugdmlld2VyCi0JCS8vIGJlaW5nIGVuYWJsZWQKLQkJLy8JCWZDbGVhbnVwRG9jdW1lbnQuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJLy8JCWZGb3JtYXREb2N1bWVudC5zZXRFbmFibGVkKGVuYWJsZWQpOwotCi0JCWZGb3JtYXRBY3RpdmVFbGVtZW50cy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCQlmT3BlbkZpbGVBY3Rpb24uc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJZkZpbmRPY2N1cnJlbmNlcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9BZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTIxNDkzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0FkZEJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Db21tZW50SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogQWRkIGJsb2NrIGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRCbG9ja0NvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0Q29tbWVudEFjdGlvblhNTERlbGVnYXRlIHsKLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkFkZEJsb2NrQ29tbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5BZGRCbG9ja0NvbW1lbnRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5BZGRCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0Jdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQotCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCQkJCWlmIChzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwgJiYgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSA+IDApIHsKLQkJCQkJc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiA9IG1vZGVsLmdldEluZGV4ZWRSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSAxKTsKLQkJCQl9Ci0JCQkJaWYgKHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPT0gbnVsbCkKLQkJCQkJcmV0dXJuOwotCi0JCQkJaW50IG9wZW5Db21tZW50T2Zmc2V0ID0gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24uZ2V0RW5kT2Zmc2V0KCkgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCk7Ci0KLQotCQkJCWlmICh0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpID09IDAgJiYgc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpCi0JCQkJCXJldHVybjsKLQotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhNTFVJTWVzc2FnZXMuQWRkQmxvY2tDb21tZW50X3Rvb2x0aXApOwotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJdHJ5IHsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgMCwgT1BFTl9DT01NRU5UKTsKLQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIDAsIENMT1NFX0NPTU1FTlQpOwotCQkJCQlyZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIGNsb3NlQ29tbWVudE9mZnNldCAtIG9wZW5Db21tZW50T2Zmc2V0IC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JCQkJfQotCQkJfQotCQkJZmluYWxseSB7Ci0JCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9CYXNlTm9kZUFjdGlvbk1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uTWFuYWdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWVmOWEwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0Jhc2VOb2RlQWN0aW9uTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudFR5cGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VOb2RlQWN0aW9uTWFuYWdlciB7Ci0KLQotCS8qKgotCSAqIE15TWVudU1hbmFnZXIKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIE15TWVudU1hbmFnZXIgZXh0ZW5kcyBNZW51TWFuYWdlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQkJcHVibGljIE15TWVudU1hbmFnZXIoU3RyaW5nIHMpIHsKLQkJCXN1cGVyKHMpOwotCQkJdGl0bGUgPSBzOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotCQkJcmV0dXJuICFpc0VtcHR5KCk7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotCQkJcmV0dXJuIHRpdGxlOwotCQl9Ci0JfQotCi0JcHVibGljIHN0YXRpYyBEb2N1bWVudFR5cGUgZ2V0RG9jdHlwZShOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyAoRG9jdW1lbnQpIG5vZGUgOiBub2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJcmV0dXJuIGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTWVudUJ1aWxkZXIgbWVudUJ1aWxkZXIgPSBuZXcgTWVudUJ1aWxkZXIoKTsKLQlwcm90ZWN0ZWQgSVN0cnVjdHVyZWRNb2RlbCBmTW9kZWw7Ci0JcHJvdGVjdGVkIE1vZGVsUXVlcnkgbW9kZWxRdWVyeTsKLQotCXByb3RlY3RlZCBCYXNlTm9kZUFjdGlvbk1hbmFnZXIoSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCwgTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5KSB7Ci0JCXRoaXMuZk1vZGVsID0gbW9kZWw7Ci0JCXRoaXMubW9kZWxRdWVyeSA9IG1vZGVsUXVlcnk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBY3Rpb25IZWxwZXIoSU1lbnVNYW5hZ2VyIG1lbnUsIExpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QpIHsKLQkJTGlzdCBhY3Rpb25MaXN0ID0gbmV3IFZlY3RvcigpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBtb2RlbFF1ZXJ5QWN0aW9uTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGkubmV4dCgpOwotCQkJaWYgKGFjdGlvbi5nZXRDTU5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJaW50IGNtTm9kZVR5cGUgPSBhY3Rpb24uZ2V0Q01Ob2RlKCkuZ2V0Tm9kZVR5cGUoKTsKLQkJCQlpZiAoYWN0aW9uLmdldEtpbmQoKSA9PSBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCkgewotCQkJCQlzd2l0Y2ggKGNtTm9kZVR5cGUpIHsKLQkJCQkJCWNhc2UgQ01Ob2RlLkFUVFJJQlVURV9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVBZGRBdHRyaWJ1dGVBY3Rpb24oKEVsZW1lbnQpIGFjdGlvbi5nZXRQYXJlbnQoKSwgKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGFjdGlvbi5nZXRDTU5vZGUoKSkpOwotCQkJCQkJCWJyZWFrOwotCQkJCQkJfQotCQkJCQkJY2FzZSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTiA6IHsKLQkJCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVBZGRFbGVtZW50QWN0aW9uKGFjdGlvbi5nZXRQYXJlbnQoKSwgKENNRWxlbWVudERlY2xhcmF0aW9uKSBhY3Rpb24uZ2V0Q01Ob2RlKCksIGFjdGlvbi5nZXRTdGFydEluZGV4KCkpKTsKLQkJCQkJCQlicmVhazsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0gZWxzZSBpZiAoYWN0aW9uLmdldEtpbmQoKSA9PSBNb2RlbFF1ZXJ5QWN0aW9uLlJFUExBQ0UpIHsKLQkJCQkJaWYgKGFjdGlvbi5nZXRQYXJlbnQoKSAhPSBudWxsICYmIGFjdGlvbi5nZXRDTU5vZGUoKSAhPSBudWxsKSB7Ci0JCQkJCQlhY3Rpb25MaXN0LmFkZChjcmVhdGVSZXBsYWNlQWN0aW9uKGFjdGlvbi5nZXRQYXJlbnQoKSwgYWN0aW9uLmdldENNTm9kZSgpLCBhY3Rpb24uZ2V0U3RhcnRJbmRleCgpLCBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCW1lbnVCdWlsZGVyLnBvcHVsYXRlTWVudShtZW51LCBhY3Rpb25MaXN0LCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUFjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCW1lbnUuYWRkKGFjdGlvbik7Ci0JCX0KLQl9Ci0KLQotCXB1YmxpYyB2b2lkIGNvbnRyaWJ1dGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IHNlbGVjdGlvbikgewotCQlpbnQgZWRpdE1vZGUgPSBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCk7Ci0JCWludCBpYyA9IE1vZGVsUXVlcnkuSU5DTFVERV9DSElMRF9OT0RFUzsKLQkJaW50IHZjID0gKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgPyBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCA6IE1vZGVsUXVlcnkuVkFMSURJVFlfTk9ORTsKLQotCQlMaXN0IGltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gbnVsbDsKLQotCQlpZiAoc2VsZWN0aW9uLnNpemUoKSA+IDApIHsKLQkJCWltcGxpY2l0bHlTZWxlY3RlZE5vZGVMaXN0ID0gZ2V0U2VsZWN0ZWROb2RlcyhzZWxlY3Rpb24sIHRydWUpOwotCi0JCQkvLyBjb250cmlidXRlIGRlbGV0ZSBhY3Rpb25zCi0JCQljb250cmlidXRlRGVsZXRlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDEpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3Rpb24uZ2V0KDApOwotCi0JCQkvLyBjb250cmlidXRlIGVkaXQgYWN0aW9ucwotCQkJY29udHJpYnV0ZUVkaXRBY3Rpb25zKG1lbnUsIG5vZGUpOwotCi0JCQkvLyBjb250cmlidXRlIGFkZCBjaGlsZCBhY3Rpb25zCi0JCQljb250cmlidXRlQWRkQ2hpbGRBY3Rpb25zKG1lbnUsIG5vZGUsIGljLCB2Yyk7Ci0KLQkJCS8vIGNvbnRyaWJ1dGUgYWRkIGJlZm9yZSBhY3Rpb25zCi0JCQljb250cmlidXRlQWRkU2libGluZ0FjdGlvbnMobWVudSwgbm9kZSwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID4gMCkgewotCQkJLy8gY29udHJpYnV0ZSByZXBsYWNlIGFjdGlvbnMKLQkJCWNvbnRyaWJ1dGVSZXBsYWNlQWN0aW9ucyhtZW51LCBpbXBsaWNpdGx5U2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjKTsKLQkJfQotCi0JCWlmIChzZWxlY3Rpb24uc2l6ZSgpID09IDApIHsKLQkJCURvY3VtZW50IGRvY3VtZW50ID0gKChJRE9NTW9kZWwpIGZNb2RlbCkuZ2V0RG9jdW1lbnQoKTsKLQkJCWNvbnRyaWJ1dGVBZGREb2N1bWVudENoaWxkQWN0aW9ucyhtZW51LCBkb2N1bWVudCwgaWMsIHZjKTsKLQkJCWNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhtZW51LCBkb2N1bWVudCk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIE5vZGUgbm9kZSwgaW50IGljLCBpbnQgdmMpIHsKLQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCi0JCWlmIChub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gJ0FkZCBDaGlsZC4uLicgYW5kICdBZGQgQXR0cmlidXRlLi4uJyBhY3Rpb25zCi0JCQkvLwotCQkJRWxlbWVudCBlbGVtZW50ID0gKEVsZW1lbnQpIG5vZGU7Ci0KLQkJCUlNZW51TWFuYWdlciBhZGRBdHRyaWJ1dGVNZW51ID0gbmV3IE15TWVudU1hbmFnZXIoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfQVRUUklCVVRFKTsgLy8kTk9OLU5MUy0xJAotCQkJSU1lbnVNYW5hZ2VyIGFkZENoaWxkTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0NISUxEKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudS5hZGQoYWRkQXR0cmlidXRlTWVudSk7Ci0JCQltZW51LmFkZChhZGRDaGlsZE1lbnUpOwotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCS8vIGFkZCBpbnNlcnQgYXR0cmlidXRlIGFjdGlvbnMKLQkJCQkvLwotCQkJCUxpc3QgbW9kZWxRdWVyeUFjdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKGVsZW1lbnQsIGVkLCAtMSwgTW9kZWxRdWVyeS5JTkNMVURFX0FUVFJJQlVURVMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJYWRkQWN0aW9uSGVscGVyKGFkZEF0dHJpYnV0ZU1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQotCQkJCS8vIGFkZCBpbnNlcnQgY2hpbGQgbm9kZSBhY3Rpb25zCi0JCQkJLy8KLQkJCQltb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZWxlbWVudCwgZWQsIC0xLCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQlhZGRBY3Rpb25IZWxwZXIoYWRkQ2hpbGRNZW51LCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQl9Ci0KLQkJCS8vIGFkZCBQSSBhbmQgQ09NTUVOVAotCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQ2hpbGRNZW51LCBlbGVtZW50LCBlZCwgLTEpOwotCi0JCQkvLyBhZGQgUENEQVRBLCBDREFUQV9TRUNUSU9OCi0JCQljb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKGFkZENoaWxkTWVudSwgZWxlbWVudCwgZWQsIC0xKTsKLQotCQkJLy8gYWRkIE5FVyBFTEVNRU5UCi0JCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQ2hpbGRNZW51LCBlbGVtZW50LCBlZCwgLTEpOwotCi0JCQkvLyBhZGQgQVRUUklCVVRFCi0JCQljb250cmlidXRlVW5jb25zdHJhaW5lZEF0dHJpYnV0ZUFjdGlvbnMoYWRkQXR0cmlidXRlTWVudSwgZWxlbWVudCwgZWQpOwotCQl9Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlQWRkRG9jdW1lbnRDaGlsZEFjdGlvbnMoSU1lbnVNYW5hZ2VyIG1lbnUsIERvY3VtZW50IGRvY3VtZW50LCBpbnQgaWMsIGludCB2YykgewotCQlJTWVudU1hbmFnZXIgYWRkQ2hpbGRNZW51ID0gbmV3IE15TWVudU1hbmFnZXIoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9BRERfQ0hJTEQpOyAvLyROT04tTkxTLTEkCi0JCW1lbnUuYWRkKGFkZENoaWxkTWVudSk7Ci0KLQkJLy8gYWRkIFBJIGFuZCBDT01NRU5UCi0JCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZENoaWxkTWVudSwgZG9jdW1lbnQsIC0xKTsKLQotCQkvLyBhZGQgTkVXIEVMRU1FTlQKLQkJY29udHJpYnV0ZVVuY29uc3RyYWluZWRBZGRFbGVtZW50QWN0aW9uKGFkZENoaWxkTWVudSwgZG9jdW1lbnQsIC0xKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVBZGRTaWJsaW5nQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlLCBpbnQgaWMsIGludCB2YykgewotCQlJTWVudU1hbmFnZXIgYWRkQmVmb3JlTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0JFRk9SRSk7IC8vJE5PTi1OTFMtMSQKLQkJSU1lbnVNYW5hZ2VyIGFkZEFmdGVyTWVudSA9IG5ldyBNeU1lbnVNYW5hZ2VyKFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0FGVEVSKTsgLy8kTk9OLU5MUy0xJAotCQltZW51LmFkZChhZGRCZWZvcmVNZW51KTsKLQkJbWVudS5hZGQoYWRkQWZ0ZXJNZW51KTsKLQotCQlOb2RlIHBhcmVudE5vZGUgPSBub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJaWYgKHBhcmVudE5vZGUgIT0gbnVsbCkgewotCQkJaW50IGluZGV4ID0gZ2V0SW5kZXgocGFyZW50Tm9kZSwgbm9kZSk7Ci0JCQlpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJRWxlbWVudCBwYXJlbnRFbGVtZW50ID0gKEVsZW1lbnQpIHBhcmVudE5vZGU7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RUQgPSBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudEVsZW1lbnQpOwotCQkJCWlmIChwYXJlbnRFRCAhPSBudWxsKSB7Ci0JCQkJCS8vICdBZGQgQmVmb3JlLi4uJyBhbmQgJ0FkZCBBZnRlci4uLicgYWN0aW9ucwotCQkJCQkvLwotCQkJCQlMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMocGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4LCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQkJYWRkQWN0aW9uSGVscGVyKGFkZEJlZm9yZU1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQotCQkJCQltb2RlbFF1ZXJ5QWN0aW9uTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCArIDEsIGljLCB2YywgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCQkJCQlhZGRBY3Rpb25IZWxwZXIoYWRkQWZ0ZXJNZW51LCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJfQotCi0JCQkJLy8gYWRkIENPTU1FTlQgYW5kIFBJIGJlZm9yZSBhbmQgYWZ0ZXIKLQkJCQljb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhhZGRCZWZvcmVNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXgpOwotCQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZEFmdGVyTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4ICsgMSk7Ci0KLQkJCQkvLyBhZGQgUENEQVRBLCBDREFUQV9TRUNUSU9OIGJlZm9yZSBhbmQgYWZ0ZXIKLQkJCQljb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKGFkZEJlZm9yZU1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVRleHROb2RlQWN0aW9ucyhhZGRBZnRlck1lbnUsIHBhcmVudEVsZW1lbnQsIHBhcmVudEVELCBpbmRleCArIDEpOwotCi0JCQkJLy8gYWRkIE5FVyBFTEVNRU5UIGJlZm9yZSBhbmQgYWZ0ZXIKLQkJCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQmVmb3JlTWVudSwgcGFyZW50RWxlbWVudCwgcGFyZW50RUQsIGluZGV4KTsKLQkJCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQWZ0ZXJNZW51LCBwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgaW5kZXggKyAxKTsKLQkJCX0gZWxzZSBpZiAocGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCURvY3VtZW50IGRvY3VtZW50ID0gKERvY3VtZW50KSBwYXJlbnROb2RlOwotCQkJCUNNRG9jdW1lbnQgY21Eb2N1bWVudCA9IG1vZGVsUXVlcnkuZ2V0Q29ycmVzcG9uZGluZ0NNRG9jdW1lbnQocGFyZW50Tm9kZSk7Ci0JCQkJaWYgKGNtRG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCQkvLyBhZGQgcG9zc2libGUgcm9vdCBlbGVtZW50IGluc2VydGlvbnMKLQkJCQkJLy8gICAgICAgIAotCQkJCQlMaXN0IG1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZG9jdW1lbnQsIGNtRG9jdW1lbnQsIGluZGV4LCBpYywgdmMsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQkJYWRkQWN0aW9uSGVscGVyKGFkZEFmdGVyTWVudSwgbW9kZWxRdWVyeUFjdGlvbkxpc3QpOwotCi0JCQkJCW1vZGVsUXVlcnlBY3Rpb25MaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQltb2RlbFF1ZXJ5LmdldEluc2VydEFjdGlvbnMoZG9jdW1lbnQsIGNtRG9jdW1lbnQsIGluZGV4ICsgMSwgaWMsIHZjLCBtb2RlbFF1ZXJ5QWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihhZGRBZnRlck1lbnUsIG1vZGVsUXVlcnlBY3Rpb25MaXN0KTsKLQkJCQl9Ci0KLQkJCQkvLyBhZGQgQ09NTUVOVCBhbmQgUEkgYmVmb3JlIGFuZCBhZnRlcgotCQkJCWNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKGFkZEJlZm9yZU1lbnUsIGRvY3VtZW50LCBpbmRleCk7Ci0JCQkJY29udHJpYnV0ZVBJQW5kQ29tbWVudEFjdGlvbnMoYWRkQWZ0ZXJNZW51LCBkb2N1bWVudCwgaW5kZXggKyAxKTsKLQotCQkJCS8vIGFkZCBFTEVNRU5UIGJlZm9yZSBhbmQgYWZ0ZXIKLQkJCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQmVmb3JlTWVudSwgZG9jdW1lbnQsIGluZGV4KTsKLQkJCQljb250cmlidXRlVW5jb25zdHJhaW5lZEFkZEVsZW1lbnRBY3Rpb24oYWRkQWZ0ZXJNZW51LCBkb2N1bWVudCwgaW5kZXggKyAxKTsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVEZWxldGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IGxpc3QsIGludCBpYywgaW50IHZjKSB7Ci0JCWJvb2xlYW4gY2FuUmVtb3ZlID0gbW9kZWxRdWVyeS5jYW5SZW1vdmUobGlzdCwgdmMpOwotCi0KLQkJLy8gYSBkZWxldGUgYWN0aW9uIHdpdGggYW4gZW1wdHkgbGlzdCB3aWxsIHByb2R1Y2UgYSBkaXNhYmxlZCBtZW51Ci0JCS8vIGl0ZW0KLQkJLy8KLQkJTGlzdCByZXN1bHRMaXN0ID0gY2FuUmVtb3ZlID8gbGlzdCA6IENvbGxlY3Rpb25zLkVNUFRZX0xJU1Q7Ci0JCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlRGVsZXRlQWN0aW9uKHJlc3VsdExpc3QpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVFZGl0QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgTm9kZSBub2RlKSB7Ci0JCWNvbnRyaWJ1dGVFZGl0R3JhbW1hckluZm9ybWF0aW9uQWN0aW9ucyhtZW51LCBub2RlKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZSkpOwotCQl9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXRBdHRyaWJ1dGVBY3Rpb24oKEF0dHIpIG5vZGUsIG51bGwpKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZUVkaXRHcmFtbWFySW5mb3JtYXRpb25BY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBOb2RlIG5vZGUpIHsKLQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFID8gKERvY3VtZW50KSBub2RlIDogbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0KLQkJRG9jdW1lbnRUeXBlIGRvY3R5cGUgPSBnZXREb2N0eXBlKG5vZGUpOwotCQlpZiAoZG9jdHlwZSA9PSBudWxsKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZERvY3R5cGVBY3Rpb24oZG9jdW1lbnQsIC0xKSk7Ci0JCX0KLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUVkaXREb2N0eXBlQWN0aW9uKChEb2N1bWVudFR5cGUpIG5vZGUpKTsKLQkJfQotCi0JCWlmIChkb2N0eXBlID09IG51bGwgJiYgZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpICE9IG51bGwpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlRWRpdFNjaGVtYUluZm9BY3Rpb24oZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpKSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlUElBbmRDb21tZW50QWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpbmRleCkgewotCQkvLyB0ZXN0IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBpbmRleCBpc24ndCBiZWZvcmUgdGhlIFhNTCBkZWNsYXJhdGlvbgotCQkvLyAKLQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRDb21tZW50QWN0aW9uKGRvY3VtZW50LCBpbmRleCkpOwotCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihkb2N1bWVudCwgaW5kZXgpKTsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVQSUFuZENvbW1lbnRBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQkJaWYgKHBhcmVudEVkID09IG51bGwgfHwgaXNDb21tZW50QWxsb3dlZChwYXJlbnRFZCkpIHsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkQ29tbWVudEFjdGlvbihwYXJlbnRFbGVtZW50LCBpbmRleCkpOwotCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24ocGFyZW50RWxlbWVudCwgaW5kZXgpKTsKLQkJfQotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY29udHJpYnV0ZVJlcGxhY2VBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBMaXN0IHNlbGVjdGVkTm9kZUxpc3QsIGludCBpYywgaW50IHZjKSB7Ci0JCS8vICdSZXBsYWNlIFdpdGguLi4nIGFjdGlvbnMKLQkJLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0JCUlNZW51TWFuYWdlciByZXBsYWNlV2l0aE1lbnUgPSBuZXcgTXlNZW51TWFuYWdlcihYTUxVSU1lc3NhZ2VzLl9VSV9NRU5VX1JFUExBQ0VfV0lUSCk7IC8vJE5PTi1OTFMtMSQKLQkJbWVudS5hZGQocmVwbGFjZVdpdGhNZW51KTsKLQotCQlpZiAobW9kZWxRdWVyeS5nZXRFZGl0TW9kZSgpID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCAmJiBzZWxlY3RlZE5vZGVMaXN0LnNpemUoKSA+IDApIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBzZWxlY3RlZE5vZGVMaXN0LmdldCgwKTsKLQkJCU5vZGUgcGFyZW50Tm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudE5vZGUgIT0gbnVsbCAmJiBwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlFbGVtZW50IHBhcmVudEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFRCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50RWxlbWVudCk7Ci0JCQkJaWYgKHBhcmVudEVEICE9IG51bGwpIHsKLQkJCQkJTGlzdCByZXBsYWNlQWN0aW9uTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQkJCQkJbW9kZWxRdWVyeS5nZXRSZXBsYWNlQWN0aW9ucyhwYXJlbnRFbGVtZW50LCBwYXJlbnRFRCwgc2VsZWN0ZWROb2RlTGlzdCwgaWMsIHZjLCByZXBsYWNlQWN0aW9uTGlzdCk7Ci0JCQkJCWFkZEFjdGlvbkhlbHBlcihyZXBsYWNlV2l0aE1lbnUsIHJlcGxhY2VBY3Rpb25MaXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb250cmlidXRlVGV4dE5vZGVBY3Rpb25zKElNZW51TWFuYWdlciBtZW51LCBFbGVtZW50IHBhcmVudEVsZW1lbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkLCBpbnQgaW5kZXgpIHsKLQkJaWYgKHBhcmVudEVkID09IG51bGwgfHwgaXNUZXh0QWxsb3dlZChwYXJlbnRFZCkpIHsKLQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSBwYXJlbnRFZCAhPSBudWxsID8gcGFyZW50RWQuZ2V0RGF0YVR5cGUoKSA6IG51bGw7Ci0JCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZFBDRGF0YUFjdGlvbihwYXJlbnRFbGVtZW50LCBkYXRhVHlwZSwgaW5kZXgpKTsKLQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkQ0RhdGFTZWN0aW9uQWN0aW9uKHBhcmVudEVsZW1lbnQsIGluZGV4KSk7Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgRG9jdW1lbnQgZG9jdW1lbnQsIGludCBpbmRleCkgewotCQlpZiAoaXNVbmNvbnN0cmFpbmVkQWN0aW9uQWxsb3dlZCgpKSB7Ci0JCQlpZiAoZ2V0Um9vdEVsZW1lbnQoZG9jdW1lbnQpID09IG51bGwpIHsKLQkJCQlpbnQgeG1sRGVjbGFyYXRpb25JbmRleCA9IC0xOwotCQkJCWludCBkb2N0eXBlSW5kZXggPSAtMTsKLQkJCQlOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldENoaWxkTm9kZXMoKTsKLQkJCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIHsKLQkJCQkJTm9kZSBub2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCQkJaW50IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJCWRvY3R5cGVJbmRleCA9IGk7Ci0JCQkJCQlicmVhazsKLQkJCQkJfSBlbHNlIGlmIChub2RlVHlwZSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSkgewotCQkJCQkJUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpID0gKFByb2Nlc3NpbmdJbnN0cnVjdGlvbikgbm9kZTsKLQkJCQkJCWlmIChwaS5nZXRUYXJnZXQoKS5lcXVhbHNJZ25vcmVDYXNlKCJ4bWwiKSAmJiB4bWxEZWNsYXJhdGlvbkluZGV4ID09IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQl4bWxEZWNsYXJhdGlvbkluZGV4ID0gaTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQotCQkJCWlmICgoeG1sRGVjbGFyYXRpb25JbmRleCA9PSAtMSB8fCBpbmRleCA+IHhtbERlY2xhcmF0aW9uSW5kZXgpICYmIChkb2N0eXBlSW5kZXggPT0gLTEgfHwgaW5kZXggPiBkb2N0eXBlSW5kZXgpKSB7Ci0JCQkJCWNvbnRyaWJ1dGVBY3Rpb24obWVudSwgY3JlYXRlQWRkRWxlbWVudEFjdGlvbihkb2N1bWVudCwgbnVsbCwgaW5kZXgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQWRkRWxlbWVudEFjdGlvbihJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCwgaW50IGluZGV4KSB7Ci0JCWlmIChpc1VuY29uc3RyYWluZWRBY3Rpb25BbGxvd2VkKCkpIHsKLQkJCWlmIChwYXJlbnRFZCA9PSBudWxsIHx8IHBhcmVudEVkLmdldFByb3BlcnR5KCJpc0luZmVycmVkIikgPT0gQm9vbGVhbi5UUlVFIHx8IChtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkgIT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUICYmIGlzRWxlbWVudEFsbG93ZWQocGFyZW50RWQpKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJY29udHJpYnV0ZUFjdGlvbihtZW51LCBjcmVhdGVBZGRFbGVtZW50QWN0aW9uKHBhcmVudEVsZW1lbnQsIG51bGwsIGluZGV4KSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNvbnRyaWJ1dGVVbmNvbnN0cmFpbmVkQXR0cmlidXRlQWN0aW9ucyhJTWVudU1hbmFnZXIgbWVudSwgRWxlbWVudCBwYXJlbnRFbGVtZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnRFZCkgewotCQlpZiAoaXNVbmNvbnN0cmFpbmVkQWN0aW9uQWxsb3dlZCgpKSB7Ci0JCQlpZiAocGFyZW50RWQgPT0gbnVsbCB8fCBwYXJlbnRFZC5nZXRQcm9wZXJ0eSgiaXNJbmZlcnJlZCIpID09IEJvb2xlYW4uVFJVRSB8fCBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCkgIT0gTW9kZWxRdWVyeS5FRElUX01PREVfQ09OU1RSQUlORURfU1RSSUNUKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQljb250cmlidXRlQWN0aW9uKG1lbnUsIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihwYXJlbnRFbGVtZW50LCBudWxsKSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEF0dHJpYnV0ZUFjdGlvbihFbGVtZW50IHBhcmVudCwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZENEYXRhU2VjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkQ29tbWVudEFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkRG9jdHlwZUFjdGlvbihEb2N1bWVudCBwYXJlbnQsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZEVsZW1lbnRBY3Rpb24oTm9kZSBwYXJlbnQsIENNRWxlbWVudERlY2xhcmF0aW9uIGVkLCBpbnQgaW5kZXgpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVBZGRQQ0RhdGFBY3Rpb24oTm9kZSBwYXJlbnQsIENNRGF0YVR5cGUgZGF0YVR5cGUsIGludCBpbmRleCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUFkZFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihOb2RlIHBhcmVudCwgaW50IGluZGV4KTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlQWRkU2NoZW1hSW5mb0FjdGlvbihFbGVtZW50IGVsZW1lbnQpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVEZWxldGVBY3Rpb24oTGlzdCBzZWxlY3Rpb24pOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0QXR0cmlidXRlQWN0aW9uKEF0dHIgYXR0cmlidXRlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKTsKLQotCWFic3RyYWN0IHByb3RlY3RlZCBBY3Rpb24gY3JlYXRlRWRpdERvY3R5cGVBY3Rpb24oRG9jdW1lbnRUeXBlIGRvY3R5cGUpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uKFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaSk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZUVkaXRTY2hlbWFJbmZvQWN0aW9uKEVsZW1lbnQgZWxlbWVudCk7Ci0KLQlhYnN0cmFjdCBwcm90ZWN0ZWQgQWN0aW9uIGNyZWF0ZVJlbmFtZUFjdGlvbihOb2RlIG5vZGUpOwotCi0JYWJzdHJhY3QgcHJvdGVjdGVkIEFjdGlvbiBjcmVhdGVSZXBsYWNlQWN0aW9uKE5vZGUgcGFyZW50LCBDTU5vZGUgY21ub2RlLCBpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4KTsKLQotCi0JcHVibGljIGludCBnZXRJbmRleChOb2RlIHBhcmVudE5vZGUsIE5vZGUgY2hpbGQpIHsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnROb2RlLmdldENoaWxkTm9kZXMoKTsKLQkJaW50IGluZGV4ID0gLTE7Ci0JCWludCBzaXplID0gbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0JCQlpZiAobm9kZUxpc3QuaXRlbShpKSA9PSBjaGlsZCkgewotCQkJCWluZGV4ID0gaTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gaW5kZXg7Ci0JfQotCi0KLQlwdWJsaWMgTm9kZSBnZXRSZWZDaGlsZE5vZGVBdEluZGV4KE5vZGUgcGFyZW50LCBpbnQgaW5kZXgpIHsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlOb2RlIHJlZkNoaWxkID0gKGluZGV4ID49IDAgJiYgaW5kZXggPCBub2RlTGlzdC5nZXRMZW5ndGgoKSkgPyBub2RlTGlzdC5pdGVtKGluZGV4KSA6IG51bGw7Ci0JCXJldHVybiByZWZDaGlsZDsKLQl9Ci0KLQotCXByb3RlY3RlZCBFbGVtZW50IGdldFJvb3RFbGVtZW50KERvY3VtZW50IGRvY3VtZW50KSB7Ci0JCUVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJcmVzdWx0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCXByb3RlY3RlZCBMaXN0IGdldFNlbGVjdGVkTm9kZXMoTGlzdCBsaXN0LCBib29sZWFuIGluY2x1ZGVUZXh0Tm9kZXMpIHsKLQkJTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KDApOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG9iamVjdCA9IGkubmV4dCgpOwotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJaWYgKGluY2x1ZGVUZXh0Tm9kZXMpIHsKLQkJCQkJCXJlc3VsdC5hZGQob2JqZWN0KTsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdC5hZGQobm9kZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0NvbW1lbnRBbGxvd2VkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkKSB7Ci0JCWludCBjb250ZW50VHlwZSA9IHBhcmVudEVkLmdldENvbnRlbnRUeXBlKCk7Ci0JCXJldHVybiBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0VsZW1lbnRBbGxvd2VkKENNRWxlbWVudERlY2xhcmF0aW9uIHBhcmVudEVkKSB7Ci0JCWludCBjb250ZW50VHlwZSA9IHBhcmVudEVkLmdldENvbnRlbnRUeXBlKCk7Ci0JCXJldHVybiBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTEVNRU5UIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLkFOWTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzVGV4dEFsbG93ZWQoQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWQpIHsKLQkJaW50IGNvbnRlbnRUeXBlID0gcGFyZW50RWQuZ2V0Q29udGVudFR5cGUoKTsKLQkJcmV0dXJuIGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLk1JWEVEIHx8IGNvbnRlbnRUeXBlID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSB8fCBjb250ZW50VHlwZSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5BTlk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1VuY29uc3RyYWluZWRBY3Rpb25BbGxvd2VkKCkgewotCQlyZXR1cm4gdHJ1ZTsKLQl9Ci0KLQotCXByb3RlY3RlZCBib29sZWFuIGlzV2hpdGVzcGFjZVRleHROb2RlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCkgJiYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgJiYgKG5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0NsZWFudXBBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGRiZDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmN1c3RvbS5CdXN5SW5kaWNhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklBY3Rpb25EZWxlZ2F0ZTI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckFjdGlvbkRlbGVnYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklWaWV3QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVZpZXdQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmNsZWFudXAuSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU1NFVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2xlYW51cC5DbGVhbnVwUHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBDbGVhbnVwIGFjdGlvbiBkZWxlZ2F0ZSBmb3IgQ1NTIGVkaXRvcgotICovCi1wdWJsaWMgY2xhc3MgQ2xlYW51cEFjdGlvblhNTERlbGVnYXRlIGltcGxlbWVudHMgSUVkaXRvckFjdGlvbkRlbGVnYXRlLCBJQWN0aW9uRGVsZWdhdGUyLCBJVmlld0FjdGlvbkRlbGVnYXRlIHsKLQlwcml2YXRlIElFZGl0b3JQYXJ0IGZFZGl0b3I7Ci0JcHJpdmF0ZSBJU3RydWN0dXJlZENsZWFudXBQcm9jZXNzb3IgZkNsZWFudXBQcm9jZXNzb3I7Ci0KLQlwdWJsaWMgdm9pZCBzZXRBY3RpdmVFZGl0b3IoSUFjdGlvbiBhY3Rpb24sIElFZGl0b3JQYXJ0IHRhcmdldEVkaXRvcikgewotCQlmRWRpdG9yID0gdGFyZ2V0RWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCS8vIG51bGxpbmcgb3V0IGp1c3QgaW4gY2FzZQotCQlmRWRpdG9yID0gbnVsbDsKLQkJZkNsZWFudXBQcm9jZXNzb3IgPSBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNsZWFudXBEb2N1bWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5DbGVhbnVwRG9jdW1lbnRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuV2l0aEV2ZW50KElBY3Rpb24gYWN0aW9uLCBFdmVudCBldmVudCkgewotCQlydW4oYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElWaWV3UGFydCB2aWV3KSB7Ci0JCS8vIGRvIG5vdGhpbmcKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJZmluYWwgSVRleHRFZGl0b3IgZWRpdG9yID0gKElUZXh0RWRpdG9yKSBmRWRpdG9yOwotCQkJRGlhbG9nIGNsZWFudXBEaWFsb2cgPSBuZXcgQ2xlYW51cERpYWxvZ1hNTChlZGl0b3IuZ2V0U2l0ZSgpLmdldFNoZWxsKCkpOwotCQkJaWYgKGNsZWFudXBEaWFsb2cub3BlbigpID09IFdpbmRvdy5PSykgewotCQkJCS8vIHNldHVwIHJ1bm5hYmxlCi0JCQkJUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0JCQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQkJCUlTdHJ1Y3R1cmVkQ2xlYW51cFByb2Nlc3NvciBjbGVhbnVwUHJvY2Vzc29yID0gZ2V0Q2xlYW51cFByb2Nlc3NvcigpOwotCQkJCQkJaWYgKGNsZWFudXBQcm9jZXNzb3IgIT0gbnVsbCkgewotCQkJCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCQkJCXRyeSB7Ci0JCQkJCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCQkJCQkJY2xlYW51cFByb2Nlc3Nvci5jbGVhbnVwTW9kZWwobW9kZWwpOwotCQkJCQkJCX0KLQkJCQkJCQlmaW5hbGx5IHsKLQkJCQkJCQkJaWYgKG1vZGVsICE9IG51bGwpCi0JCQkJCQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9OwotCi0JCQkJLy8gVE9ETzogbWFrZSBpbmRlcGVuZGVudCBvZiAnbW9kZWwnLgotCQkJCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQkJCXRyeSB7Ci0JCQkJCW1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChlZGl0b3IuZ2V0RG9jdW1lbnRQcm92aWRlcigpLmdldERvY3VtZW50KGVkaXRvci5nZXRFZGl0b3JJbnB1dCgpKSk7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyBiZWdpbiByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBTU0VVSU1lc3NhZ2VzLkNsZWFudXBfRG9jdW1lbnRfVUlfLCBzZWxlY3Rpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvbi5nZXRMZW5ndGgoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnCi0JCQkJCQkvLyBtb2RlbCBjaGFuZ2UKLQkJCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJCQkvLyBydW4KLQkJCQkJCUJ1c3lJbmRpY2F0b3Iuc2hvd1doaWxlKGZFZGl0b3IuZ2V0RWRpdG9yU2l0ZSgpLmdldFdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCkuZ2V0RGlzcGxheSgpLCBydW5uYWJsZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZmluYWxseSB7Ci0JCQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZwotCQkJCQkJLy8gbW9kZWwKLQkJCQkJCS8vIGNoYW5nZQotCQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0KLQkJCQkJCS8vIGVuZCByZWNvcmRpbmcKLQkJCQkJCUlUZXh0U2VsZWN0aW9uIHNlbGVjdGlvbiA9IChJVGV4dFNlbGVjdGlvbikgZWRpdG9yLmdldFNlbGVjdGlvblByb3ZpZGVyKCkuZ2V0U2VsZWN0aW9uKCk7Ci0JCQkJCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcywgc2VsZWN0aW9uLmdldE9mZnNldCgpLCBzZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJbW9kZWwucmVsZWFzZUZyb21FZGl0KCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZWxlY3Rpb25DaGFuZ2VkKElBY3Rpb24gYWN0aW9uLCBJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQkvLyBkbyBub3RoaW5nCi0JfQotCi0JSVN0cnVjdHVyZWRDbGVhbnVwUHJvY2Vzc29yIGdldENsZWFudXBQcm9jZXNzb3IoKSB7Ci0JCWlmIChmQ2xlYW51cFByb2Nlc3NvciA9PSBudWxsKQotCQkJZkNsZWFudXBQcm9jZXNzb3IgPSBuZXcgQ2xlYW51cFByb2Nlc3NvclhNTCgpOwotCi0JCXJldHVybiBmQ2xlYW51cFByb2Nlc3NvcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwRGlhbG9nWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9DbGVhbnVwRGlhbG9nWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMTcwYTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvQ2xlYW51cERpYWxvZ1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLklIZWxwQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIENsZWFudXBEaWFsb2dYTUwgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3M7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hGb3JtYXRTb3VyY2U7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFnczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXM7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZk1vZGVsID0gbnVsbDsKLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZlByZWZlcmVuY2VzID0gbnVsbDsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZUFzaXM7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlcjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkF0dHJOYW1lQ2FzZVVwcGVyOwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYzsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4OwotCXByb3RlY3RlZCBCdXR0b24gZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3M7Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlQXNpczsKLQlwcm90ZWN0ZWQgQnV0dG9uIGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXI7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZVVwcGVyOwotCi0JcHVibGljIENsZWFudXBEaWFsb2dYTUwoU2hlbGwgc2hlbGwpIHsKLQotCQlzdXBlcihzaGVsbCk7Ci0JfQotCi0JcHVibGljIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0KLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ2xlYW51cF9VSV8pOwotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OVUxMKTsKLQkJY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlKGNvbXBvc2l0ZSk7Ci0JCWluaXRpYWxpemVPcHRpb25zKCk7Ci0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlRGlhbG9nQXJlYUluQ29tcG9zaXRlKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLkNMRUFOVVBfWE1MX0hFTFBJRCk7IC8vIHVzZQotCQkvLyBYTUwKLQkJLy8gc3BlY2lmaWMKLQkJLy8gaGVscAotCi0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlsYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vIENvbXByZXNzIGVtcHR5IGVsZW1lbnQgdGFncwotCQlmQ2hlY2tCb3hDb21wcmVzc0VtcHR5RWxlbWVudFRhZ3MgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Db21wcmVzc19lbXB0eV9lbGVtZW50X3RhZ3NfVUlfKTsKLQkJZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIEluc2VydCBtaXNzaW5nIHJlcXVpcmVkIGF0dHJzCi0JCWZDaGVja0JveEluc2VydFJlcXVpcmVkQXR0cnMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuSW5zZXJ0X3JlcXVpcmVkX2F0dHJpYnV0ZXNfVUlfKTsKLQkJZkNoZWNrQm94SW5zZXJ0UmVxdWlyZWRBdHRycy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBJbnNlcnQgbWlzc2luZyBiZWdpbi9lbmQgdGFncwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuSW5zZXJ0X21pc3NpbmdfdGFnc19VSV8pOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBRdW90ZSBhdHRyaWJ1dGUgdmFsdWVzCi0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcyA9IG5ldyBCdXR0b24oY29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmQ2hlY2tCb3hRdW90ZUF0dHJWYWx1ZXMuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlF1b3RlX2F0dHJpYnV0ZV92YWx1ZXNfVUlfKTsKLQkJZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCS8vIEZvcm1hdCBzb3VyY2UKLQkJZkNoZWNrQm94Rm9ybWF0U291cmNlID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5DSEVDSyk7Ci0JCWZDaGVja0JveEZvcm1hdFNvdXJjZS5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuRm9ybWF0X3NvdXJjZV9VSV8pOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJLy8gQ29udmVydCBFT0wgY29kZQotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMgPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULkNIRUNLKTsKLQkJZkNoZWNrQm94Q29udmVydEVPTENvZGVzLnNldFRleHQoWE1MVUlNZXNzYWdlcy5Db252ZXJ0X0VPTF9jb2Rlc19VSV8pOwotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0JCUNvbXBvc2l0ZSBFT0xDb2RlcyA9IG5ldyBDb21wb3NpdGUoY29tcG9zaXRlLCBTV1QuTlVMTCk7Ci0JCUdyaWRMYXlvdXQgaExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWhMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCUVPTENvZGVzLnNldExheW91dChoTGF5b3V0KTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3MgPSBuZXcgQnV0dG9uKEVPTENvZGVzLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuRU9MX1dpbmRvd3NfVUkpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXggPSBuZXcgQnV0dG9uKEVPTENvZGVzLCBTV1QuUkFESU8pOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuRU9MX1VuaXhfVUkpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYyA9IG5ldyBCdXR0b24oRU9MQ29kZXMsIFNXVC5SQURJTyk7Ci0JCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkVPTF9NYWNfVUkpOwotCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZUVPTENvZGVSYWRpb3MoYm9vbGVhbiBlbmFibGUpIHsKLQotCQlpZiAoKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzICE9IG51bGwpICYmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCAhPSBudWxsKSAmJiAoZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYyAhPSBudWxsKSkgewotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0RW5hYmxlZChlbmFibGUpOwotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFVuaXguc2V0RW5hYmxlZChlbmFibGUpOwotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5zZXRFbmFibGVkKGVuYWJsZSk7Ci0JCQlpZiAoIWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmdldFNlbGVjdGlvbigpICYmICFmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5nZXRTZWxlY3Rpb24oKSAmJiAhZlJhZGlvQnV0dG9uQ29udmVydEVPTE1hYy5nZXRTZWxlY3Rpb24oKSkKLQkJCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MV2luZG93cy5zZXRTZWxlY3Rpb24odHJ1ZSk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgUHJlZmVyZW5jZXMgZ2V0TW9kZWxQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZU9wdGlvbnMoKSB7Ci0KLQkJZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUykpOwotCQlmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOU0VSVF9SRVFVSVJFRF9BVFRSUykpOwotCQlmQ2hlY2tCb3hJbnNlcnRNaXNzaW5nVGFncy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTlNFUlRfTUlTU0lOR19UQUdTKSk7Ci0JCWZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5zZXRTZWxlY3Rpb24oZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUykpOwotCQlmQ2hlY2tCb3hGb3JtYXRTb3VyY2Uuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSkpOwotCQlmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMpKTsKLQkJU3RyaW5nIEVPTENvZGUgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSk7Ci0JCWlmIChFT0xDb2RlLmNvbXBhcmVUbyhDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5MRikgPT0gMCkKLQkJCWZSYWRpb0J1dHRvbkNvbnZlcnRFT0xVbml4LnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZWxzZSBpZiAoRU9MQ29kZS5jb21wYXJlVG8oQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1IpID09IDApCi0JCQlmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJZWxzZQotCQkJZlJhZGlvQnV0dG9uQ29udmVydEVPTFdpbmRvd3Muc2V0U2VsZWN0aW9uKHRydWUpOwotCQllbmFibGVFT0xDb2RlUmFkaW9zKGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgb2tQcmVzc2VkKCkgewotCi0JCXN0b3JlT3B0aW9ucygpOwotCQlzdXBlci5va1ByZXNzZWQoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRNb2RlbChJU3RydWN0dXJlZE1vZGVsIG1vZGVsKSB7Ci0KLQkJZk1vZGVsID0gbW9kZWw7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVPcHRpb25zKCkgewotCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNPTVBSRVNTX0VNUFRZX0VMRU1FTlRfVEFHUywgZkNoZWNrQm94Q29tcHJlc3NFbXB0eUVsZW1lbnRUYWdzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX1JFUVVJUkVEX0FUVFJTLCBmQ2hlY2tCb3hJbnNlcnRSZXF1aXJlZEF0dHJzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5TRVJUX01JU1NJTkdfVEFHUywgZkNoZWNrQm94SW5zZXJ0TWlzc2luZ1RhZ3MuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5RVU9URV9BVFRSX1ZBTFVFUywgZkNoZWNrQm94UXVvdGVBdHRyVmFsdWVzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuRk9STUFUX1NPVVJDRSwgZkNoZWNrQm94Rm9ybWF0U291cmNlLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ09OVkVSVF9FT0xfQ09ERVMsIGZDaGVja0JveENvbnZlcnRFT0xDb2Rlcy5nZXRTZWxlY3Rpb24oKSk7Ci0JCWlmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5nZXRTZWxlY3Rpb24oKSkgewotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQU5VUF9FT0xfQ09ERSwgQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpOwotCQl9IGVsc2UgaWYgKGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xNYWMuZ2V0U2VsZWN0aW9uKCkpIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKTsKLQkJfSBlbHNlIHsKLQkJCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkNMRUFOVVBfRU9MX0NPREUsIENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSTEYpOwotCQl9Ci0JCS8vIGV4cGxpY2l0bHkgc2F2ZSBwbHVnaW4gcHJlZmVyZW5jZXMgc28gdmFsdWVzIGFyZSBzdG9yZWQKLQkJWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQotCQl3aWRnZXRTZWxlY3RlZChlKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0KLQkJZ2V0QnV0dG9uKE9LKS5zZXRFbmFibGVkKChmUmFkaW9CdXR0b25UYWdOYW1lQ2FzZUxvd2VyICE9IG51bGwgJiYgKGZSYWRpb0J1dHRvblRhZ05hbWVDYXNlTG93ZXIuZ2V0U2VsZWN0aW9uKCkgfHwgZlJhZGlvQnV0dG9uVGFnTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpIHx8IChmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlciAhPSBudWxsICYmIChmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VMb3dlci5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25BdHRyTmFtZUNhc2VVcHBlci5nZXRTZWxlY3Rpb24oKSkpIHx8IGZDaGVja0JveEluc2VydE1pc3NpbmdUYWdzLmdldFNlbGVjdGlvbigpIHx8IGZDaGVja0JveFF1b3RlQXR0clZhbHVlcy5nZXRTZWxlY3Rpb24oKSB8fCBmQ2hlY2tCb3hGb3JtYXRTb3VyY2UuZ2V0U2VsZWN0aW9uKCkgfHwgZkNoZWNrQm94Q29udmVydEVPTENvZGVzLmdldFNlbGVjdGlvbigpIHx8IChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peCAhPSBudWxsICYmIChmUmFkaW9CdXR0b25Db252ZXJ0RU9MVW5peC5nZXRTZWxlY3Rpb24oKSB8fCBmUmFkaW9CdXR0b25Db252ZXJ0RU9MTWFjLmdldFNlbGVjdGlvbigpIHx8IGZSYWRpb0J1dHRvbkNvbnZlcnRFT0xXaW5kb3dzLmdldFNlbGVjdGlvbigpKSkpOwotCQlpZiAoZS53aWRnZXQgPT0gZkNoZWNrQm94Q29udmVydEVPTENvZGVzKQotCQkJZW5hYmxlRU9MQ29kZVJhZGlvcyhmQ2hlY2tCb3hDb252ZXJ0RU9MQ29kZXMuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRBdHRyaWJ1dGVBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRBdHRyaWJ1dGVBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWUzYTk4NC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0QXR0cmlidXRlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXRBdHRyaWJ1dGVEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLQotcHVibGljIGNsYXNzIEVkaXRBdHRyaWJ1dGVBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQlwcm90ZWN0ZWQgc3RhdGljIEltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3I7Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBBdHRyIGF0dHI7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgRWxlbWVudCBvd25lckVsZW1lbnQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCXB1YmxpYyBFZGl0QXR0cmlidXRlQWN0aW9uKEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlciwgRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgYXR0ciwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7Ci0JCXRoaXMuYXR0ciA9IGF0dHI7Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQkJc2V0VGV4dChhY3Rpb25MYWJlbCk7Ci0JCS8vIGFzc3VtZSBpZiBhdHRyIGlzIG51bGwgdGhlbiB0aGlzIGlzIGFuICdBZGQnIHRoYXQgcmVxdWlyZXMgYWN0aW9uCi0JCS8vIGFuIGljb25zLi4uIG90aGVyd2lzZSB0aGlzIGlzIGFuIGVkaXQKLQkJaWYgKGF0dHIgPT0gbnVsbCkgewotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGNyZWF0ZUltYWdlRGVzY3JpcHRvcigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltYW5hZ2VyLmJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUVkaXRBdHRyaWJ1dGVEaWFsb2cgZGlhbG9nID0gbmV3IEVkaXRBdHRyaWJ1dGVEaWFsb2coc2hlbGwsIG93bmVyRWxlbWVudCwgYXR0cik7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCQlvd25lckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShhdHRyKTsKLQkJCX0KLQkJCURvY3VtZW50IGRvY3VtZW50ID0gb3duZXJFbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCUF0dHIgbmV3QXR0cmlidXRlID0gZG9jdW1lbnQuY3JlYXRlQXR0cmlidXRlKGRpYWxvZy5nZXRBdHRyaWJ1dGVOYW1lKCkpOwotCQkJbmV3QXR0cmlidXRlLnNldFZhbHVlKGRpYWxvZy5nZXRBdHRyaWJ1dGVWYWx1ZSgpKTsKLQkJCW93bmVyRWxlbWVudC5zZXRBdHRyaWJ1dGVOb2RlKG5ld0F0dHJpYnV0ZSk7Ci0JCQltYW5hZ2VyLnNldFZpZXdlclNlbGVjdGlvbihuZXdBdHRyaWJ1dGUpOwotCQl9Ci0JCW1hbmFnZXIuZW5kTm9kZUFjdGlvbih0aGlzKTsKLQl9Ci19Ci0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXREb2N0eXBlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RG9jdHlwZUFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTdjMmJmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXREb2N0eXBlQWN0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5kb2N1bWVudC5Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTURvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXREb2N0eXBlRGlhbG9nOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci0KLS8qKgotICogRWRpdERvY3R5cGVBY3Rpb24KLSAqLwotcHVibGljIGNsYXNzIEVkaXREb2N0eXBlQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlIGRvY3R5cGU7Ci0JcHJvdGVjdGVkIERvY3VtZW50IGRvY3VtZW50OwotCXByb3RlY3RlZCBJU3RydWN0dXJlZE1vZGVsIG1vZGVsOwotCXByb3RlY3RlZCBTdHJpbmcgcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBkb2N0eXBlLgotCSAqLwotCXB1YmxpYyBFZGl0RG9jdHlwZUFjdGlvbihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBEb2N1bWVudCBkb2N1bWVudCwgU3RyaW5nIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyB0aXRsZSkgewotCQlzZXRUZXh0KHRpdGxlKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLmRvY3VtZW50ID0gZG9jdW1lbnQ7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JCXRoaXMudGl0bGUgPSB0aXRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgdG8gZWRpdCBhbiBleGlzaXRuZyBkb2N0eXBlLgotCSAqLwotCXB1YmxpYyBFZGl0RG9jdHlwZUFjdGlvbihJU3RydWN0dXJlZE1vZGVsIG1vZGVsLCBEb2N1bWVudFR5cGUgZG9jdHlwZSwgU3RyaW5nIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyB0aXRsZSkgewotCQlzZXRUZXh0KHRpdGxlKTsKLQkJdGhpcy5tb2RlbCA9IG1vZGVsOwotCQl0aGlzLmRvY3R5cGUgPSBkb2N0eXBlOwotCQl0aGlzLnJlc291cmNlTG9jYXRpb24gPSByZXNvdXJjZUxvY2F0aW9uOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgRG9jdW1lbnRUeXBlIGNyZWF0ZURvY3R5cGUoRWRpdERvY3R5cGVEaWFsb2cgZGlhbG9nLCBEb2N1bWVudCBkb2N1bWVudCkgewotCQlEb2N1bWVudFR5cGUgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgRG9jdW1lbnRJbXBsKSB7Ci0JCQlJRE9NRG9jdW1lbnQgZG9jdW1lbnRJbXBsID0gKElET01Eb2N1bWVudCkgZG9jdW1lbnQ7Ci0JCQlJRE9NRG9jdW1lbnRUeXBlIGRvY3R5cGVJbXBsID0gKElET01Eb2N1bWVudFR5cGUpIGRvY3VtZW50SW1wbC5jcmVhdGVEb2N0eXBlKGRpYWxvZy5nZXROYW1lKCkpOwotCQkJZG9jdHlwZUltcGwuc2V0UHVibGljSWQoZGlhbG9nLmdldFB1YmxpY0lkKCkpOwotCQkJZG9jdHlwZUltcGwuc2V0U3lzdGVtSWQoZGlhbG9nLmdldFN5c3RlbUlkKCkpOwotCQkJcmVzdWx0ID0gZG9jdHlwZUltcGw7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcml2YXRlIERpc3BsYXkgZ2V0RGlzcGxheSgpIHsKLQotCQlyZXR1cm4gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFJvb3RFbGVtZW50TmFtZShEb2N1bWVudCBkb2N1bWVudCkgewotCQlFbGVtZW50IHJvb3RFbGVtZW50ID0gbnVsbDsKLQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVMaXN0TGVuZ3RoOyBpKyspIHsKLQkJCU5vZGUgY2hpbGROb2RlID0gbm9kZUxpc3QuaXRlbShpKTsKLQkJCWlmIChjaGlsZE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXJvb3RFbGVtZW50ID0gKEVsZW1lbnQpIGNoaWxkTm9kZTsKLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcm9vdEVsZW1lbnQgIT0gbnVsbCA/IHJvb3RFbGVtZW50LmdldE5vZGVOYW1lKCkgOiBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9ST09UX0VMRU1FTlRfVkFMVUU7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgaW5zZXJ0RG9jdHlwZShEb2N1bWVudFR5cGUgZG9jdHlwZSwgRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJTm9kZSByZWZDaGlsZCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5QUk9DRVNTSU5HX0lOU1RSVUNUSU9OX05PREUgfHwgY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DT01NRU5UX05PREUpIHsKLQkJCQkvLyBjb250aW51ZSBvbiB0byB0aGUgbmV4dE5vZGUKLQkJCX0gZWxzZSB7Ci0JCQkJcmVmQ2hpbGQgPSBjaGlsZE5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlkb2N1bWVudC5pbnNlcnRCZWZvcmUoZG9jdHlwZSwgcmVmQ2hpbGQpOwotCQkvL21hbmFnZXIucmVmb3JtYXQoZG9jdHlwZSwgZmFsc2UpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkpOwotCQkvL1NoZWxsIHNoZWxsID0KLQkJLy8gWE1MQ29tbW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlTaGVsbCBzaGVsbCA9IGdldERpc3BsYXkoKS5nZXRBY3RpdmVTaGVsbCgpOwotCQlFZGl0RG9jdHlwZURpYWxvZyBkaWFsb2cgPSBzaG93RWRpdERvY3R5cGVEaWFsb2coc2hlbGwpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJaWYgKGRvY3R5cGUgIT0gbnVsbCkgewotCQkJCXVwZGF0ZURvY3R5cGUoZGlhbG9nLCBkb2N0eXBlKTsKLQkJCX0gZWxzZSBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJCURvY3VtZW50VHlwZSBkb2N0eXBlID0gY3JlYXRlRG9jdHlwZShkaWFsb2csIGRvY3VtZW50KTsKLQkJCQlpZiAoZG9jdHlwZSAhPSBudWxsKSB7Ci0JCQkJCWluc2VydERvY3R5cGUoZG9jdHlwZSwgZG9jdW1lbnQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQltb2RlbC5lbmRSZWNvcmRpbmcodGhpcyk7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXREb2N0eXBlRGlhbG9nIHNob3dFZGl0RG9jdHlwZURpYWxvZyhTaGVsbCBzaGVsbCkgewotCQlFZGl0RG9jdHlwZURpYWxvZyBkaWFsb2cgPSBudWxsOwotCi0JCWlmIChkb2N0eXBlICE9IG51bGwpIHsKLQkJCWRpYWxvZyA9IG5ldyBFZGl0RG9jdHlwZURpYWxvZyhzaGVsbCwgZG9jdHlwZSk7Ci0JCQlpZiAodGl0bGUgPT0gbnVsbCkgewotCQkJCXRpdGxlID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfRURJVF9ET0NUWVBFOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0gZWxzZSBpZiAoZG9jdW1lbnQgIT0gbnVsbCkgewotCQkJU3RyaW5nIHJvb3RFbGVtZW50TmFtZSA9IGdldFJvb3RFbGVtZW50TmFtZShkb2N1bWVudCk7Ci0JCQlkaWFsb2cgPSBuZXcgRWRpdERvY3R5cGVEaWFsb2coc2hlbGwsIHJvb3RFbGVtZW50TmFtZSwgIiIsIHJvb3RFbGVtZW50TmFtZSArICIuZHRkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKHRpdGxlID09IG51bGwpIHsKLQkJCQl0aXRsZSA9IFhNTFVJTWVzc2FnZXMuX1VJX01FTlVfQUREX0RURF9JTkZPUk1BVElPTl9USVRMRTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9Ci0KLQkJZGlhbG9nLnNldENvbXB1dGVTeXN0ZW1JZChkb2N0eXBlID09IG51bGwgfHwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpID09IG51bGwgfHwgZG9jdHlwZS5nZXRTeXN0ZW1JZCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKTsKLQotCQlkaWFsb2cuc2V0RXJyb3JDaGVja2luZyhmYWxzZSk7Ly8hbW9kZWwuZ2V0VHlwZSgpLmVxdWFscyhJU3RydWN0dXJlZE1vZGVsLkhUTUwpKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihuZXcgUGF0aChyZXNvdXJjZUxvY2F0aW9uKSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZURvY3R5cGUoRWRpdERvY3R5cGVEaWFsb2cgZGlhbG9nLCBEb2N1bWVudFR5cGUgZG9jdHlwZSkgewotCQlpZiAoZG9jdHlwZSBpbnN0YW5jZW9mIElET01Eb2N1bWVudFR5cGUpIHsKLQkJCUlET01Eb2N1bWVudFR5cGUgZG9jdHlwZUltcGwgPSAoSURPTURvY3VtZW50VHlwZSkgZG9jdHlwZTsKLQkJCWlmIChkb2N0eXBlSW1wbC5nZXROYW1lKCkuZXF1YWxzKGRpYWxvZy5nZXROYW1lKCkpKSB7Ci0JCQkJZG9jdHlwZUltcGwuc2V0UHVibGljSWQoZGlhbG9nLmdldFB1YmxpY0lkKCkpOwotCQkJCWRvY3R5cGVJbXBsLnNldFN5c3RlbUlkKGRpYWxvZy5nZXRTeXN0ZW1JZCgpKTsKLQkJCX0gZWxzZSB7Ci0JCQkJLy8gd2UgbmVlZCB0byBjcmVhdGUgYSBuZXcgb25lIGFuZCByZW1vdmUgdGhlIG9sZAotCQkJCS8vICAgICAgICAgICAgICAgICAgCi0JCQkJRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N0eXBlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCQlEb2N1bWVudFR5cGUgbmV3RG9jdHlwZSA9IGNyZWF0ZURvY3R5cGUoZGlhbG9nLCBkb2N1bWVudCk7Ci0JCQkJZG9jdW1lbnQuaW5zZXJ0QmVmb3JlKG5ld0RvY3R5cGUsIGRvY3R5cGUpOwotCQkJCWRvY3VtZW50LnJlbW92ZUNoaWxkKGRvY3R5cGUpOwotCQkJCS8vbWFuYWdlci5yZWZvcm1hdChuZXdEb2N0eXBlLCBmYWxzZSk7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RWxlbWVudEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdEVsZW1lbnRBY3Rpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4NGZhOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9FZGl0RWxlbWVudEFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Nb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5FZGl0RWxlbWVudERpYWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1wdWJsaWMgY2xhc3MgRWRpdEVsZW1lbnRBY3Rpb24gZXh0ZW5kcyBOb2RlQWN0aW9uIHsKLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvcjsKLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2VEZXNjcmlwdG9yIGNyZWF0ZUltYWdlRGVzY3JpcHRvcigpIHsKLQkJaWYgKGltYWdlRGVzY3JpcHRvciA9PSBudWxsKSB7Ci0JCQlpbWFnZURlc2NyaXB0b3IgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTEVNRU5UKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIGludCBpbnNlcnRpb25JbmRleCA9IC0xOwotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIE5vZGUgcGFyZW50OwotCXByb3RlY3RlZCBTdHJpbmcgdGl0bGU7Ci0KLQlwdWJsaWMgRWRpdEVsZW1lbnRBY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBFbGVtZW50IGVsZW1lbnQsIFN0cmluZyBhY3Rpb25MYWJlbCwgU3RyaW5nIGRpYWxvZ1RpdGxlKSB7Ci0JCXRoaXMobWFuYWdlciwgZWxlbWVudC5nZXRQYXJlbnROb2RlKCksIC0xLCBlbGVtZW50LCBhY3Rpb25MYWJlbCwgZGlhbG9nVGl0bGUpOwotCX0KLQotCXByb3RlY3RlZCBFZGl0RWxlbWVudEFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgsIEVsZW1lbnQgZWxlbWVudCwgU3RyaW5nIGFjdGlvbkxhYmVsLCBTdHJpbmcgdGl0bGUpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMuaW5zZXJ0aW9uSW5kZXggPSBpbmRleDsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQlzZXRUZXh0KGFjdGlvbkxhYmVsKTsKLQkJaWYgKGVsZW1lbnQgPT0gbnVsbCkgewotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKGNyZWF0ZUltYWdlRGVzY3JpcHRvcigpKTsKLQkJfQotCX0KLQotCXB1YmxpYyBFZGl0RWxlbWVudEFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIE5vZGUgcGFyZW50LCBpbnQgaW5kZXgsIFN0cmluZyBhY3Rpb25MYWJlbCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXRoaXMobWFuYWdlciwgcGFyZW50LCBpbmRleCwgbnVsbCwgYWN0aW9uTGFiZWwsIHRpdGxlKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuIHRpdGxlOwotCX0KLQotCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJbWFuYWdlci5iZWdpbk5vZGVBY3Rpb24odGhpcyk7Ci0JCVNoZWxsIHNoZWxsID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRXb3JrYmVuY2goKS5nZXRBY3RpdmVXb3JrYmVuY2hXaW5kb3coKS5nZXRTaGVsbCgpOwotCQlFZGl0RWxlbWVudERpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdEVsZW1lbnREaWFsb2coc2hlbGwsIGVsZW1lbnQpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0KLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCWlmIChlbGVtZW50ICE9IG51bGwpIHsKLQkJCQkvLyBoZXJlIHdlIG5lZWQgdG8gZG8gYSByZW5hbWUuLi4gd2hpY2ggc2VlbXMgdG8gYmUgcXVpdGUgaGFyZAotCQkJCS8vIHRvIGRvIDotKAotCQkJCWlmIChlbGVtZW50IGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudEltcGwgPSAoSURPTUVsZW1lbnQpIGVsZW1lbnQ7Ci0JCQkJCUlET01Nb2RlbCBtb2RlbCA9IGVsZW1lbnRJbXBsLmdldE1vZGVsKCk7Ci0JCQkJCVN0cmluZyBvbGROYW1lID0gZWxlbWVudEltcGwuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJU3RyaW5nIG5ld05hbWUgPSBkaWFsb2cuZ2V0RWxlbWVudE5hbWUoKTsKLQkJCQkJc2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uRWxlbWVudE5hbWUobW9kZWwsIGVsZW1lbnRJbXBsLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIG9sZE5hbWUsIG5ld05hbWUpOwotCQkJCQlzZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25FbGVtZW50TmFtZShtb2RlbCwgZWxlbWVudEltcGwuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCksIG9sZE5hbWUsIG5ld05hbWUpOwotCQkJCX0KLQkJCX0gZWxzZSB7Ci0JCQkJRWxlbWVudCBuZXdFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChkaWFsb2cuZ2V0RWxlbWVudE5hbWUoKSk7Ci0JCQkJTm9kZUxpc3Qgbm9kZUxpc3QgPSBwYXJlbnQuZ2V0Q2hpbGROb2RlcygpOwotCQkJCWludCBub2RlTGlzdExlbmd0aCA9IG5vZGVMaXN0LmdldExlbmd0aCgpOwotCQkJCU5vZGUgcmVmQ2hpbGQgPSBpbnNlcnRpb25JbmRleCA8IG5vZGVMaXN0TGVuZ3RoICYmIGluc2VydGlvbkluZGV4ID49IDAgPyBub2RlTGlzdC5pdGVtKGluc2VydGlvbkluZGV4KSA6IG51bGw7Ci0JCQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdFbGVtZW50LCByZWZDaGlsZCk7Ci0JCQkJbWFuYWdlci5yZWZvcm1hdChuZXdFbGVtZW50LCBmYWxzZSk7Ci0JCQkJbWFuYWdlci5zZXRWaWV3ZXJTZWxlY3Rpb24obmV3RWxlbWVudCk7Ci0JCQl9Ci0JCX0KLQkJbWFuYWdlci5lbmROb2RlQWN0aW9uKHRoaXMpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbkVsZW1lbnROYW1lKElET01Nb2RlbCBtb2RlbCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgU3RyaW5nIG9sZE5hbWUsIFN0cmluZyBuZXdOYW1lKSB7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZmxhdE5vZGUuZ2V0VGV4dCgpOwotCQkJaW50IGluZGV4ID0gc3RyaW5nLmluZGV4T2Yob2xkTmFtZSk7Ci0JCQlpZiAoaW5kZXggIT0gLTEpIHsKLQkJCQlpbmRleCArPSBmbGF0Tm9kZS5nZXRTdGFydCgpOwotCQkJCW1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLnJlcGxhY2VUZXh0KHRoaXMsIGluZGV4LCBvbGROYW1lLmxlbmd0aCgpLCBuZXdOYW1lKTsKLQkJCX0KLQkJfQotCX0KLX0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFjYzFkLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZzsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotLyoqCi0gKiBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uQWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0JcHJvdGVjdGVkIE5vZGUgY2hpbGRSZWY7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgTm9kZSBwYXJlbnQ7Ci0JcHJvdGVjdGVkIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiBwaTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOwotCi0JLyoqCi0JICogVGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkIHRvIGFkZCBhIG5ldyBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24KLQkgKi8KLQlwdWJsaWMgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIE5vZGUgcGFyZW50LCBOb2RlIGNoaWxkUmVmLCBTdHJpbmcgYWN0aW9uTGFiZWwsIFN0cmluZyB0aXRsZSkgewotCQlzZXRUZXh0KGFjdGlvbkxhYmVsKTsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0JCXRoaXMuY2hpbGRSZWYgPSBjaGlsZFJlZjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBlZGl0IGEgUHJvY2Vzc2luZ0luc3RydWN0aW9uCi0JICovCi0JcHVibGljIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25BY3Rpb24oQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciBtYW5hZ2VyLCBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gcGksIFN0cmluZyBhY3Rpb25MYWJlbCwgU3RyaW5nIHRpdGxlKSB7Ci0JCXNldFRleHQoYWN0aW9uTGFiZWwpOwotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl0aGlzLnBpID0gcGk7Ci0JCXRoaXMucGFyZW50ID0gcGkuZ2V0UGFyZW50Tm9kZSgpOwotCQl0aGlzLnRpdGxlID0gdGl0bGU7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRVbmRvRGVzY3JpcHRpb24oKSB7Ci0JCXJldHVybiB0aXRsZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBydW4oKSB7Ci0JCW1hbmFnZXIuYmVnaW5Ob2RlQWN0aW9uKHRoaXMpOwotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQotCQlFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nIGRpYWxvZyA9IG51bGw7Ci0JCWlmIChwaSAhPSBudWxsKSB7Ci0JCQlkaWFsb2cgPSBuZXcgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyhzaGVsbCwgcGkpOwotCQl9IGVsc2UgewotCQkJZGlhbG9nID0gbmV3IEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2coc2hlbGwsIFhNTFVJTWVzc2FnZXMuX1VJX1BJX1RBUkdFVF9WQUxVRSwgWE1MVUlNZXNzYWdlcy5fVUlfUElfREFUQV9WQUxVRSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0KLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJaWYgKHBpICE9IG51bGwpIHsKLQkJCQljaGlsZFJlZiA9IHBpOwotCQkJfQotCi0JCQlEb2N1bWVudCBkb2N1bWVudCA9IHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSA/IChEb2N1bWVudCkgcGFyZW50IDogcGFyZW50LmdldE93bmVyRG9jdW1lbnQoKTsKLQkJCU5vZGUgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZVByb2Nlc3NpbmdJbnN0cnVjdGlvbihkaWFsb2cuZ2V0VGFyZ2V0KCksIGRpYWxvZy5nZXREYXRhKCkpOwotCQkJcGFyZW50Lmluc2VydEJlZm9yZShuZXdOb2RlLCBjaGlsZFJlZik7Ci0KLQkJCWlmIChwaSAhPSBudWxsKSB7Ci0JCQkJcGFyZW50LnJlbW92ZUNoaWxkKHBpKTsKLQkJCX0KLQotCQkJbWFuYWdlci5yZWZvcm1hdChuZXdOb2RlLCBmYWxzZSk7Ci0JCQltYW5hZ2VyLnNldFZpZXdlclNlbGVjdGlvbihuZXdOb2RlKTsKLQkJfQotCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFNjaGVtYUluZm9BY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL0VkaXRTY2hlbWFJbmZvQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MTkzMWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvRWRpdFNjaGVtYUluZm9BY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VJbmZvTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuRWRpdFNjaGVtYUluZm9EaWFsb2c7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi0vKioKLSAqIEVkaXREb2N0eXBlQWN0aW9uCi0gKi8KLXB1YmxpYyBjbGFzcyBFZGl0U2NoZW1hSW5mb0FjdGlvbiBleHRlbmRzIE5vZGVBY3Rpb24gewotCXByb3RlY3RlZCBBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXI7Ci0JcHJvdGVjdGVkIERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyIG5hbWVzcGFjZUluZm9NYW5hZ2VyID0gbmV3IERPTU5hbWVzcGFjZUluZm9NYW5hZ2VyKCk7Ci0JcHJvdGVjdGVkIE5vZGUgbm9kZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCXB1YmxpYyBFZGl0U2NoZW1hSW5mb0FjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIE5vZGUgbm9kZSwgU3RyaW5nIHJlc291cmNlTG9jYXRpb24sIFN0cmluZyB0aXRsZSkgewotCQl0aGlzLm1hbmFnZXIgPSBtYW5hZ2VyOwotCQl0aGlzLm5vZGUgPSBub2RlOwotCQlzZXRUZXh0KHRpdGxlKTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCX0KLQotCXByb3RlY3RlZCBNYXAgY3JlYXRlUHJlZml4TWFwcGluZyhMaXN0IG9sZExpc3QsIExpc3QgbmV3TGlzdCkgewotCQlNYXAgbWFwID0gbmV3IEhhc2h0YWJsZSgpOwotCi0JCUhhc2h0YWJsZSBvbGRVUklUb1ByZWZpeFRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBvbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBvbGRJbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJb2xkVVJJVG9QcmVmaXhUYWJsZS5wdXQob2xkSW5mby51cmksIG9sZEluZm8pOwotCQl9Ci0KLQkJZm9yIChJdGVyYXRvciBpID0gbmV3TGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gbmV3SW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCU5hbWVzcGFjZUluZm8gb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvbGRVUklUb1ByZWZpeFRhYmxlLmdldChuZXdJbmZvLnVyaSAhPSBudWxsID8gbmV3SW5mby51cmkgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQotCi0JCQkvLyBpZiBvbGRJbmZvIGlzIG5vbiBudWxsIC4uLiB0aGVyZSdzIGEgbWF0Y2hpbmcgVVJJIGluIHRoZSBvbGQKLQkJCS8vIHNldAotCQkJLy8gd2UgY2FuIHVzZSBpdHMgcHJlZml4IHRvIGRldGVtaW5lIG91dCBtYXBwaW5nCi0JCQkvLwotCQkJLy8gaWYgb2xkSW5mbyBpcyBudWxsIC4uLiB3ZSB1c2UgdGhlICdvbGRDb3B5JyB3ZSBzdGFzaGVkIGF3YXkKLQkJCS8vIGFzc3VtaW5nIHRoYXQgdGhlIHVzZXIgY2hhbmdlZCB0aGUgVVJJIGFuZCB0aGUgcHJlZml4Ci0JCQlpZiAob2xkSW5mbyA9PSBudWxsKSB7Ci0JCQkJb2xkSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBuZXdJbmZvLmdldFByb3BlcnR5KCJvbGRDb3B5Iik7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQotCQkJaWYgKG9sZEluZm8gIT0gbnVsbCkgewotCQkJCVN0cmluZyBuZXdQcmVmaXggPSBuZXdJbmZvLnByZWZpeCAhPSBudWxsID8gbmV3SW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCVN0cmluZyBvbGRQcmVmaXggPSBvbGRJbmZvLnByZWZpeCAhPSBudWxsID8gb2xkSW5mby5wcmVmaXggOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmICghb2xkUHJlZml4LmVxdWFscyhuZXdQcmVmaXgpKSB7Ci0JCQkJCW1hcC5wdXQob2xkUHJlZml4LCBuZXdQcmVmaXgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbWFwOwotCX0KLQotCXB1YmxpYyBFbGVtZW50IGdldEVsZW1lbnQoTm9kZSBub2RlKSB7Ci0JCUVsZW1lbnQgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJcmVzdWx0ID0gKEVsZW1lbnQpIG5vZGU7Ci0JCX0gZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJcmVzdWx0ID0gZ2V0Um9vdEVsZW1lbnQoKERvY3VtZW50KSBub2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIEVsZW1lbnQgZ2V0Um9vdEVsZW1lbnQoRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJRWxlbWVudCByb290RWxlbWVudCA9IG51bGw7Ci0JCU5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0Q2hpbGROb2RlcygpOwotCQlpbnQgbm9kZUxpc3RMZW5ndGggPSBub2RlTGlzdC5nZXRMZW5ndGgoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2RlTGlzdExlbmd0aDsgaSsrKSB7Ci0JCQlOb2RlIGNoaWxkTm9kZSA9IG5vZGVMaXN0Lml0ZW0oaSk7Ci0JCQlpZiAoY2hpbGROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQlyb290RWxlbWVudCA9IChFbGVtZW50KSBjaGlsZE5vZGU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJvb3RFbGVtZW50OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VW5kb0Rlc2NyaXB0aW9uKCkgewotCQlyZXR1cm4gdGl0bGU7Ci0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQltYW5hZ2VyLmJlZ2luTm9kZUFjdGlvbih0aGlzKTsKLQotCQkvLyB0b2RvLi4uIGNoYW5nZSBjb25zdHJ1Y3RvciB0byB0YWtlIGFuIGVsZW1lbnQKLQkJRWxlbWVudCBlbGVtZW50ID0gZ2V0RWxlbWVudChub2RlKTsKLQkJaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotCQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCQlFZGl0U2NoZW1hSW5mb0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdFNjaGVtYUluZm9EaWFsb2coc2hlbGwsIG5ldyBQYXRoKHJlc291cmNlTG9jYXRpb24pKTsKLQotCQkJTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5hbWVzcGFjZUluZm9NYW5hZ2VyLmdldE5hbWVzcGFjZUluZm9MaXN0KGVsZW1lbnQpOwotCQkJTGlzdCBvbGROYW1lc3BhY2VJbmZvTGlzdCA9IE5hbWVzcGFjZUluZm8uY2xvbmVOYW1lc3BhY2VJbmZvTGlzdChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0KLQkJCS8vIGhlcmUgd2Ugc3RvcmUgYSBjb3B5IG9mIHRoZSBvbGQgaW5mbyBmb3IgZWFjaCBOYW1lc3BhY2VJbmZvCi0JCQkvLyB0aGlzIGluZm8gd2lsbCBiZSB1c2VkIGluIGNyZWF0ZVByZWZpeE1hcHBpbmcoKSB0byBmaWd1cmUgb3V0Ci0JCQkvLyBob3cgdG8gdXBkYXRlIHRoZSBkb2N1bWVudAotCQkJLy8gaW4gcmVzcG9uc2UgdG8gdGhlc2UgY2hhbmdlcwotCQkJZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJCU5hbWVzcGFjZUluZm8gb2xkQ29weSA9IG5ldyBOYW1lc3BhY2VJbmZvKGluZm8pOwotCQkJCWluZm8uc2V0UHJvcGVydHkoIm9sZENvcHkiLCBvbGRDb3B5KTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQlkaWFsb2cuc2V0TmFtZXNwYWNlSW5mb0xpc3QobmFtZXNwYWNlSW5mb0xpc3QpOwotCQkJZGlhbG9nLmNyZWF0ZSgpOwotCQkJLy9kaWFsb2cuZ2V0U2hlbGwoKS5zZXRTaXplKDUwMCwgMzAwKTsKLQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTUVOVV9FRElUX1NDSEVNQV9JTkZPUk1BVElPTl9USVRMRSk7IC8vJE5PTi1OTFMtMSQKLQkJCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJCWRpYWxvZy5vcGVuKCk7Ci0KLQkJCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJCUxpc3QgbmV3SW5mb0xpc3QgPSBkaWFsb2cuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLQkJCQluYW1lc3BhY2VJbmZvTWFuYWdlci5yZW1vdmVOYW1lc3BhY2VJbmZvKGVsZW1lbnQpOwotCQkJCW5hbWVzcGFjZUluZm9NYW5hZ2VyLmFkZE5hbWVzcGFjZUluZm8oZWxlbWVudCwgbmV3SW5mb0xpc3QsIHRydWUpOwotCi0JCQkJLy8gc2VlIGlmIHdlIG5lZWQgdG8gcmVuYW1lIGFueSBwcmVmaXhlcwotCQkJCU1hcCBwcmVmaXhNYXBwaW5nID0gY3JlYXRlUHJlZml4TWFwcGluZyhvbGROYW1lc3BhY2VJbmZvTGlzdCwgbmFtZXNwYWNlSW5mb0xpc3QpOwotCQkJCWlmIChwcmVmaXhNYXBwaW5nLnNpemUoKSA+IDApIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCW1hbmFnZXIuZ2V0TW9kZWwoKS5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCQkJCVJlcGxhY2VQcmVmaXhBY3Rpb24gcmVwbGFjZVByZWZpeEFjdGlvbiA9IG5ldyBSZXBsYWNlUHJlZml4QWN0aW9uKG1hbmFnZXIsIGVsZW1lbnQsIHByZWZpeE1hcHBpbmcpOwotCQkJCQkJcmVwbGFjZVByZWZpeEFjdGlvbi5ydW4oKTsKLQkJCQkJfSBmaW5hbGx5IHsKLQkJCQkJCW1hbmFnZXIuZ2V0TW9kZWwoKS5jaGFuZ2VkTW9kZWwoKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQltYW5hZ2VyLmVuZE5vZGVBY3Rpb24odGhpcyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTWVudUJ1aWxkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL01lbnVCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNzE2ZDcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTWVudUJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLk1lbnVNYW5hZ2VyOwotCi0KLXB1YmxpYyBjbGFzcyBNZW51QnVpbGRlciB7Ci0KLQotCXByb3RlY3RlZCBDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQotCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCXJldHVybiBDb2xsYXRvci5nZXRJbnN0YW5jZSgpLmNvbXBhcmUoZ2V0U29ydEtleShvMSksIGdldFNvcnRLZXkobzIpKTsKLQkJfQotCi0JCXByb3RlY3RlZCBTdHJpbmcgZ2V0U29ydEtleShPYmplY3QgbykgewotCQkJU3RyaW5nIHJlc3VsdCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlpZiAobyBpbnN0YW5jZW9mIElBY3Rpb24pIHsKLQkJCQlJQWN0aW9uIGFjdGlvbiA9IChJQWN0aW9uKSBvOwotCQkJCXJlc3VsdCA9IGFjdGlvbi5nZXRUZXh0KCk7Ci0JCQl9Ci0JCQkvL2Vsc2UgaWYgKG8gaW5zdGFuY2VvZiBNZW51RGF0YSkKLQkJCS8vewotCQkJLy8gIHJlc3VsdCA9ICJ6IiArICgoTWVudURhdGEpbykubmFtZTsKLQkJCS8vfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX07Ci0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUFscGhlYmV0aWNhbEdyb3VwaW5nKElNZW51TWFuYWdlciBtZW51LCBMaXN0IGFjdGlvbkxpc3QpIHsKLQkJT2JqZWN0W10gYXJyYXkgPSBhY3Rpb25MaXN0LnRvQXJyYXkoKTsKLQkJaWYgKGFycmF5Lmxlbmd0aCA+IDApIHsKLQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJfQotCi0JCWludCBncm91cFNpemUgPSAxNTsKLQkJaW50IG1pbkdyb3VwU2l6ZSA9IDU7Ci0JCWludCBudW1iZXJPZkdyb3VwcyA9IChhcnJheS5sZW5ndGggLyBncm91cFNpemUpICsgKChhcnJheS5sZW5ndGggJSBncm91cFNpemUgPiBtaW5Hcm91cFNpemUpID8gMSA6IDApOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZHcm91cHM7IGkrKykgewotCQkJYm9vbGVhbiBpc0xhc3RHcm91cCA9IChpID09IChudW1iZXJPZkdyb3VwcyAtIDEpKTsKLQkJCWludCBmaXJzdEluZGV4ID0gaSAqIGdyb3VwU2l6ZTsKLQkJCWludCBsYXN0SW5kZXggPSBpc0xhc3RHcm91cCA/IGFycmF5Lmxlbmd0aCAtIDEgOiBpICogZ3JvdXBTaXplICsgZ3JvdXBTaXplIC0gMTsKLQkJCUFjdGlvbiBmaXJzdEFjdGlvbiA9IChBY3Rpb24pIGFycmF5W2ZpcnN0SW5kZXhdOwotCQkJQWN0aW9uIGxhc3RBY3Rpb24gPSAoQWN0aW9uKSBhcnJheVtsYXN0SW5kZXhdOwotCQkJTWVudU1hbmFnZXIgc3VibWVudSA9IG5ldyBNZW51TWFuYWdlcihmaXJzdEFjdGlvbi5nZXRUZXh0KCkgKyAiIC0gIiArIGxhc3RBY3Rpb24uZ2V0VGV4dCgpKTsgLy8kTk9OLU5MUy0xJAotCQkJbWVudS5hZGQoc3VibWVudSk7Ci0JCQlmb3IgKGludCBqID0gZmlyc3RJbmRleDsgaiA8PSBsYXN0SW5kZXg7IGorKykgewotCQkJCXN1Ym1lbnUuYWRkKChBY3Rpb24pIGFycmF5W2pdKTsKLQkJCX0KLQkJfQotCX0KLQotCi0JcHVibGljIHZvaWQgcG9wdWxhdGVNZW51KElNZW51TWFuYWdlciBtZW51LCBMaXN0IGFjdGlvbkxpc3QsIGJvb2xlYW4gY3JlYXRlVGllcmVkKSB7Ci0JCS8vIHNvcnQgdGhlIGFjdGlvbnMKLQkJaWYgKGFjdGlvbkxpc3Quc2l6ZSgpIDwgMjUpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gYWN0aW9uTGlzdC50b0FycmF5KCk7Ci0JCQlpZiAoYXJyYXkubGVuZ3RoID4gMCkgewotCQkJCUFycmF5cy5zb3J0KGFycmF5LCBjb21wYXJhdG9yKTsKLQkJCX0KLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHsKLQkJCQltZW51LmFkZCgoQWN0aW9uKSBhcnJheVtpXSk7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQljcmVhdGVBbHBoZWJldGljYWxHcm91cGluZyhtZW51LCBhY3Rpb25MaXN0KTsKLQkJfQotCX0KLQotCS8qCi0JICogcHJvdGVjdGVkIHZvaWQgY3JlYXRlUHJvcGVydHlHcm91cGluZyhJTWVudU1hbmFnZXIgbWVudSwgTGlzdAotCSAqIGFjdGlvbkxpc3QpIHsgTWVudURhdGFUYWJsZSBtZW51RGF0YVRhYmxlID0gbmV3IE1lbnVEYXRhVGFibGUoKTsKLQkgKiAKLQkgKiBmb3IgKEl0ZXJhdG9yIGkgPSBhY3Rpb25MaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsgU3RyaW5nCi0JICogZ3JvdXBOYW1lID0gbnVsbDsgQWN0aW9uIGFjdGlvbiA9IChBY3Rpb24paS5uZXh0KCk7IGlmIChhY3Rpb24KLQkgKiBpbnN0YW5jZW9mIE5vZGVBY3Rpb24pIHsgZ3JvdXBOYW1lID0KLQkgKiAoKE5vZGVBY3Rpb24pYWN0aW9uKS5nZXRHcm91cE5hbWUoKTsgfSBpZiAoZ3JvdXBOYW1lID09IG51bGwpIHsKLQkgKiBncm91cE5hbWUgPSAiIjsgfSBNZW51RGF0YSBtZW51RGF0YSA9Ci0JICogbWVudURhdGFUYWJsZS5sb29rdXBPckNyZWF0ZShncm91cE5hbWUsICIiKTsKLQkgKiBtZW51RGF0YS5jaGlsZExpc3QuYWRkKGFjdGlvbik7IH0gcG9wdWxhdGVNZW51KG1lbnUsCi0JICogbWVudURhdGFUYWJsZS5nZXRSb290KCkpOyB9Ci0JICogCi0JICogCi0JICogcHJvdGVjdGVkIHZvaWQgcG9wdWxhdGVNZW51KE1lbnVNYW5hZ2VyIG1lbnVNYW5hZ2VyLCBNZW51RGF0YSBtZW51RGF0YSkgewotCSAqIGZvciAoSXRlcmF0b3IgaSA9IG1lbnVEYXRhLmNoaWxkTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7Ci0JICogT2JqZWN0IG8gPSBpLm5leHQoKTsgaWYgKG8gaW5zdGFuY2VvZiBBY3Rpb24pIHsKLQkgKiBtZW51TWFuYWdlci5hZGQoKEFjdGlvbilvKTsgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgTWVudURhdGEpIHsKLQkgKiBNZW51RGF0YSBjaGlsZE1lbnVEYXRhID0gKE1lbnVEYXRhKW87IE1lbnVNYW5hZ2VyIGNoaWxkTWVudU1hbmFnZXIgPQotCSAqIG5ldyBNZW51TWFuYWdlcihjaGlsZE1lbnVEYXRhLm5hbWUpOyBtZW51TWFuYWdlci5hZGQoY2hpbGRNZW51TWFuYWdlcik7Ci0JICogcG9wdWxhdGVNZW51KGNoaWxkTWVudU1hbmFnZXIsIGNoaWxkTWVudURhdGEpOyB9IH0gfQotCSAqIAotCSAqIAotCSAqIHB1YmxpYyBNZW51RGF0YVRhYmxlIHsgcHJvdGVjdGVkIEhhc2h0YWJsZSB0YWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgcm9vdDsKLQkgKiAKLQkgKiBwdWJsaWMgTWVudURhdGFUYWJsZSgpIHsgcm9vdCA9IGxvb2t1cE9yQ3JlYXRlTWVudURhdGEobnVsbCwgbnVsbCk7IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgbG9va3VwTWVudURhdGEoU3RyaW5nIG5hbWUpIHsgU3RyaW5nIGtleSA9IG5hbWUgIT0KLQkgKiBudWxsID8gbmFtZSA6ICIiOyByZXR1cm4gKE1lbnVEYXRhKW1lbnVEYXRhVGFibGUuZ2V0KGtleSk7IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgTWVudURhdGEgbG9va3VwT3JDcmVhdGVNZW51RGF0YShTdHJpbmcgbmFtZSwgU3RyaW5nCi0JICogcGFyZW50TmFtZSkgeyBTdHJpbmcga2V5ID0gbmFtZSAhPSBudWxsID8gbmFtZSA6ICIiOyBNZW51RGF0YSBtZW51RGF0YSA9Ci0JICogKE1lbnVEYXRhKW1lbnVEYXRhVGFibGUuZ2V0KGtleSk7IGlmIChtZW51RGF0YSA9PSBudWxsKSB7IG1lbnVEYXRhID0KLQkgKiBuZXcgTWVudURhdGEobmFtZSwgcGFyZW50TmFtZSk7IG1lbnVEYXRhVGFibGUucHV0KGtleSwgbWVudURhdGEpOyB9Ci0JICogcmV0dXJuIG1lbnVEYXRhOyB9Ci0JICogCi0JICogcHVibGljIE1lbnVEYXRhIGdldFJvb3QoKSB7IHJldHVybiByb290OyB9IH0KLQkgKiAKLQkgKiAKLQkgKiBwcm90ZWN0ZWQgY2xhc3MgTWVudURhdGEgeyBwdWJsaWMgU3RyaW5nIG5hbWU7IHB1YmxpYyBTdHJpbmcKLQkgKiBwYXJlbnROYW1lOyBwdWJsaWMgTGlzdCBjaGlsZExpc3QgPSBuZXcgVmVjdG9yKCk7Ci0JICogCi0JICogTWVudURhdGEoU3RyaW5nIG5hbWUsIFN0cmluZyBwYXJlbnROYW1lKSB7IHRoaXMubmFtZSA9IG5hbWU7Ci0JICogdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsgfQotCSAqIAotCSAqIHByb3RlY3RlZCB2b2lkIHNvcnQoKSB7IE9iamVjdFtdIGFycmF5ID0gY2hpbGRMaXN0LnRvQXJyYXkoKTsgaWYKLQkgKiAoYXJyYXkubGVuZ3RoID4gMCApIHsgQXJyYXlzLnNvcnQoYXJyYXksIGNvbXBhcmF0b3IpOyB9IGNoaWxkTGlzdCA9Ci0JICogQXJyYXlzLmFzTGlzdChhcnJheSk7Ci0JICogCi0JICogZm9yIChJdGVyYXRvciBpID0gY2hpbGRMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApIHsgT2JqZWN0IG8gPQotCSAqIGkubmV4dCgpOyBpZiAobyBpbnN0YW5jZW9mIE1lbnVEYXRhKSB7ICgoTWVudURhdGEpbykuc29ydCgpOyB9IH0gfSB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYWN0aW9ucy9Ob2RlQWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0YzQ3MjguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvTm9kZUFjdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLkFjdGlvbjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIE5vZGVBY3Rpb24gZXh0ZW5kcyBBY3Rpb24gewotCi0JcHVibGljIFN0cmluZyBnZXRTb3J0S2V5KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3NjJjZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVtb3ZlQmxvY2tDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkluZGV4ZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkNvbW1lbnRJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBSZW1vdmUgYmxvY2sgY29tbWVudCBhY3Rpb24gZGVsZWdhdGUgZm9yIFhNTCBlZGl0b3IKLSAqLwotcHVibGljIGNsYXNzIFJlbW92ZUJsb2NrQ29tbWVudEFjdGlvblhNTERlbGVnYXRlIGV4dGVuZHMgQWJzdHJhY3RDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgewotCi0Jdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yRWRpdChkb2N1bWVudCk7Ci0JCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCUluZGV4ZWRSZWdpb24gc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uID0gbW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQkJCQlJbmRleGVkUmVnaW9uIHNlbGVjdGlvbkVuZEluZGV4ZWRSZWdpb24gPSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQotCQkJCWlmIChzZWxlY3Rpb25TdGFydEluZGV4ZWRSZWdpb24gPT0gbnVsbCB8fCBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uID09IG51bGwpCi0JCQkJCXJldHVybjsKLQotCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBzZWxlY3Rpb25FbmRJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpIC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKTsKLQotCQkJCW1vZGVsLmJlZ2luUmVjb3JkaW5nKHRoaXMsIFhNTFVJTWVzc2FnZXMuUmVtb3ZlQmxvY2tDb21tZW50X3Rvb2x0aXApOwotCQkJCW1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkJdHJ5IHsKLQkJCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPT0gMCkgewotCQkJCQkJaWYgKHNlbGVjdGlvblN0YXJ0SW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShvcGVuQ29tbWVudE9mZnNldCwgT1BFTl9DT01NRU5ULmxlbmd0aCgpLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoc2VsZWN0aW9uU3RhcnRJbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgQ29tbWVudEltcGwpIHsKLQkJCQkJCQlkb2N1bWVudC5yZXBsYWNlKG9wZW5Db21tZW50T2Zmc2V0LCBPUEVOX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCi0JCQkJCQlpZiAoc2VsZWN0aW9uRW5kSW5kZXhlZFJlZ2lvbiBpbnN0YW5jZW9mIENvbW1lbnRJbXBsKSB7Ci0JCQkJCQkJZG9jdW1lbnQucmVwbGFjZShjbG9zZUNvbW1lbnRPZmZzZXQsIENMT1NFX0NPTU1FTlQubGVuZ3RoKCksICIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCXJlbW92ZU9wZW5DbG9zZUNvbW1lbnRzKGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgY2xvc2VDb21tZW50T2Zmc2V0IC0gb3BlbkNvbW1lbnRPZmZzZXQgLSBDTE9TRV9DT01NRU5ULmxlbmd0aCgpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCX0KLQkJCQlmaW5hbGx5IHsKLQkJCQkJbW9kZWwuY2hhbmdlZE1vZGVsKCk7Ci0JCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlJlbW92ZUJsb2NrQ29tbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5SZW1vdmVCbG9ja0NvbW1lbnRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5SZW1vdmVCbG9ja0NvbW1lbnRfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVwbGFjZVByZWZpeEFjdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvUmVwbGFjZVByZWZpeEFjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjQzMGU5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1JlcGxhY2VQcmVmaXhBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hY3Rpb25zOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NVmlzaXRvcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0KLXB1YmxpYyBjbGFzcyBSZXBsYWNlUHJlZml4QWN0aW9uIGV4dGVuZHMgTm9kZUFjdGlvbiB7Ci0KLQljbGFzcyBOb2RlQ29sbGVjdGluZ0RPTVZpc2l0b3IgZXh0ZW5kcyBET01WaXNpdG9yIHsKLQkJcHVibGljIExpc3QgbGlzdCA9IG5ldyBWZWN0b3IoKTsKLQotCQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZWZpeENoYW5nZWROZWVkZWQoTm9kZSBub2RlKSB7Ci0JCQlTdHJpbmcga2V5ID0gbm9kZS5nZXRQcmVmaXgoKSAhPSBudWxsID8gbm9kZS5nZXRQcmVmaXgoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm4gcHJlZml4TWFwcGluZy5nZXQoa2V5KSAhPSBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgdmlzaXRBdHRyKEF0dHIgYXR0cikgewotCQkJLyoKLQkJCSAqIGlmIChpc1ByZWZpeENoYW5nZWROZWVkZWQoZWxlbWVudCkpIHsgbGlzdC5hZGQoYXR0cik7IH0KLQkJCSAqLwotCQl9Ci0KLQkJcHJvdGVjdGVkIHZvaWQgdmlzaXRFbGVtZW50KEVsZW1lbnQgZWxlbWVudCkgewotCQkJc3VwZXIudmlzaXRFbGVtZW50KGVsZW1lbnQpOwotCQkJaWYgKGlzUHJlZml4Q2hhbmdlZE5lZWRlZChlbGVtZW50KSkgewotCQkJCWxpc3QuYWRkKGVsZW1lbnQpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZURlc2NyaXB0b3IgaW1hZ2VEZXNjcmlwdG9yOwotCXByb3RlY3RlZCBFbGVtZW50IGVsZW1lbnQ7Ci0JcHJvdGVjdGVkIEFic3RyYWN0Tm9kZUFjdGlvbk1hbmFnZXIgbWFuYWdlcjsKLQlwcm90ZWN0ZWQgTWFwIHByZWZpeE1hcHBpbmc7Ci0KLQlwdWJsaWMgUmVwbGFjZVByZWZpeEFjdGlvbihBYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyIG1hbmFnZXIsIEVsZW1lbnQgZWxlbWVudCwgTWFwIHByZWZpeE1hcHBpbmcpIHsKLQkJdGhpcy5tYW5hZ2VyID0gbWFuYWdlcjsKLQkJdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKLQkJdGhpcy5wcmVmaXhNYXBwaW5nID0gcHJlZml4TWFwcGluZzsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVuZG9EZXNjcmlwdGlvbigpIHsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgcnVuKCkgewotCQlOb2RlQ29sbGVjdGluZ0RPTVZpc2l0b3IgdmlzaXRvciA9IG5ldyBOb2RlQ29sbGVjdGluZ0RPTVZpc2l0b3IoKTsKLQkJdmlzaXRvci52aXNpdE5vZGUoZWxlbWVudCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IHZpc2l0b3IubGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBpLm5leHQoKTsKLQkJCVN0cmluZyBrZXkgPSBub2RlLmdldFByZWZpeCgpICE9IG51bGwgPyBub2RlLmdldFByZWZpeCgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyBuZXdQcmVmaXggPSAoU3RyaW5nKSBwcmVmaXhNYXBwaW5nLmdldChrZXkpOwotCQkJaWYgKG5ld1ByZWZpeCAhPSBudWxsKSB7Ci0JCQkJbm9kZS5zZXRQcmVmaXgobmV3UHJlZml4KTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hY3Rpb25zL1RvZ2dsZUNvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvVG9nZ2xlQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjcxMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2FjdGlvbnMvVG9nZ2xlQ29tbWVudEFjdGlvblhNTERlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9uczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLS8qKgotICogVG9nZ2xlIGNvbW1lbnQgYWN0aW9uIGRlbGVnYXRlIGZvciBYTUwgZWRpdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2dnbGVDb21tZW50QWN0aW9uWE1MRGVsZWdhdGUgZXh0ZW5kcyBBYnN0cmFjdENvbW1lbnRBY3Rpb25YTUxEZWxlZ2F0ZSB7Ci0JcHVibGljIHZvaWQgaW5pdChJQWN0aW9uIGFjdGlvbikgewotCQlpZiAoYWN0aW9uICE9IG51bGwpIHsKLQkJCWFjdGlvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF9sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5Ub2dnbGVDb21tZW50X3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuVG9nZ2xlQ29tbWVudF9kZXNjcmlwdGlvbik7Ci0JCX0KLQl9Ci0KLQl2b2lkIHByb2Nlc3NBY3Rpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCS8vIGdldCB0ZXh0IHNlbGVjdGlvbiBsaW5lcyBpbmZvCi0JCWludCBzZWxlY3Rpb25TdGFydExpbmUgPSB0ZXh0U2VsZWN0aW9uLmdldFN0YXJ0TGluZSgpOwotCQlpbnQgc2VsZWN0aW9uRW5kTGluZSA9IHRleHRTZWxlY3Rpb24uZ2V0RW5kTGluZSgpOwotCQl0cnkgewotCQkJaW50IHNlbGVjdGlvbkVuZExpbmVPZmZzZXQgPSBkb2N1bWVudC5nZXRMaW5lT2Zmc2V0KHNlbGVjdGlvbkVuZExpbmUpOwotCQkJaW50IHNlbGVjdGlvbkVuZE9mZnNldCA9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCQkvLyBhZGp1c3Qgc2VsZWN0aW9uIGVuZCBsaW5lCi0JCQlpZiAoc2VsZWN0aW9uRW5kTGluZSA+IHNlbGVjdGlvblN0YXJ0TGluZSAmJiBzZWxlY3Rpb25FbmRMaW5lT2Zmc2V0ID09IHNlbGVjdGlvbkVuZE9mZnNldCkKLQkJCQlzZWxlY3Rpb25FbmRMaW5lLS07Ci0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJLy8gc2F2ZSB0aGUgc2VsZWN0aW9uIHBvc2l0aW9uIHNpbmNlIGl0IHdpbGwgYmUgY2hhbmdpbmcKLQkJUG9zaXRpb24gc2VsZWN0aW9uUG9zaXRpb24gPSBudWxsOwotCQlib29sZWFuIHVwZGF0ZVN0YXJ0T2Zmc2V0ID0gZmFsc2U7Ci0JCXRyeSB7Ci0JCQlzZWxlY3Rpb25Qb3NpdGlvbiA9IG5ldyBQb3NpdGlvbih0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpLCB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKTsKLQkJCWRvY3VtZW50LmFkZFBvc2l0aW9uKHNlbGVjdGlvblBvc2l0aW9uKTsKLQotCQkJLy8gZXh0cmEgY2hlY2sgaWYgY29tbWVudGluZyBmcm9tIGJlZ2lubmluZyBvZiBsaW5lCi0JCQlpbnQgc2VsZWN0aW9uU3RhcnRMaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChzZWxlY3Rpb25TdGFydExpbmUpOwotCQkJaWYgKHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgPiAwICYmIHNlbGVjdGlvblN0YXJ0TGluZU9mZnNldCA9PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICYmICFpc0NvbW1lbnRMaW5lKGRvY3VtZW50LCBzZWxlY3Rpb25TdGFydExpbmUpKQotCQkJCXVwZGF0ZVN0YXJ0T2Zmc2V0ID0gdHJ1ZTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0KLQkJcHJvY2Vzc0FjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uU3RhcnRMaW5lLCBzZWxlY3Rpb25FbmRMaW5lKTsKLQotCQl1cGRhdGVDdXJyZW50U2VsZWN0aW9uKHNlbGVjdGlvblBvc2l0aW9uLCBkb2N1bWVudCwgdXBkYXRlU3RhcnRPZmZzZXQpOwotCX0KLQotCXByaXZhdGUgdm9pZCBwcm9jZXNzQWN0aW9uKElEb2N1bWVudCBkb2N1bWVudCwgaW50IHNlbGVjdGlvblN0YXJ0TGluZSwgaW50IHNlbGVjdGlvbkVuZExpbmUpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvckVkaXQoZG9jdW1lbnQpOwotCQlpZiAobW9kZWwgIT0gbnVsbCkgewotCQkJdHJ5IHsKLQkJCQltb2RlbC5iZWdpblJlY29yZGluZyh0aGlzLCBYTUxVSU1lc3NhZ2VzLlRvZ2dsZUNvbW1lbnRfdG9vbHRpcCk7Ci0JCQkJbW9kZWwuYWJvdXRUb0NoYW5nZU1vZGVsKCk7Ci0KLQkJCQlmb3IgKGludCBpID0gc2VsZWN0aW9uU3RhcnRMaW5lOyBpIDw9IHNlbGVjdGlvbkVuZExpbmU7IGkrKykgewotCQkJCQl0cnkgewotCQkJCQkJaWYgKGRvY3VtZW50LmdldExpbmVMZW5ndGgoaSkgPiAwKSB7Ci0JCQkJCQkJaWYgKGlzQ29tbWVudExpbmUoZG9jdW1lbnQsIGkpKSB7Ci0JCQkJCQkJCWludCBsaW5lT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChpKTsKLQkJCQkJCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24oaSk7Ci0JCQkJCQkJCVN0cmluZyBzdHJpbmcgPSBkb2N1bWVudC5nZXQocmVnaW9uLmdldE9mZnNldCgpLCByZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQkJCQlpbnQgb3BlbkNvbW1lbnRPZmZzZXQgPSBsaW5lT2Zmc2V0ICsgc3RyaW5nLmluZGV4T2YoT1BFTl9DT01NRU5UKTsKLQkJCQkJCQkJaW50IGNsb3NlQ29tbWVudE9mZnNldCA9IGxpbmVPZmZzZXQgKyBzdHJpbmcuaW5kZXhPZihDTE9TRV9DT01NRU5UKSAtIE9QRU5fQ09NTUVOVC5sZW5ndGgoKTsKLQkJCQkJCQkJdW5jb21tZW50KGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCwgY2xvc2VDb21tZW50T2Zmc2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCWludCBvcGVuQ29tbWVudE9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoaSk7Ci0JCQkJCQkJCWludCBsaW5lRGVsaW1pdGVyTGVuZ3RoID0gZG9jdW1lbnQuZ2V0TGluZURlbGltaXRlcihpKSA9PSBudWxsID8gMCA6IGRvY3VtZW50LmdldExpbmVEZWxpbWl0ZXIoaSkubGVuZ3RoKCk7Ci0JCQkJCQkJCWludCBjbG9zZUNvbW1lbnRPZmZzZXQgPSBvcGVuQ29tbWVudE9mZnNldCArIGRvY3VtZW50LmdldExpbmVMZW5ndGgoaSkgLSBsaW5lRGVsaW1pdGVyTGVuZ3RoICsgT1BFTl9DT01NRU5ULmxlbmd0aCgpOwotCQkJCQkJCQljb21tZW50KGRvY3VtZW50LCBvcGVuQ29tbWVudE9mZnNldCwgY2xvc2VDb21tZW50T2Zmc2V0KTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCW1vZGVsLmNoYW5nZWRNb2RlbCgpOwotCQkJCW1vZGVsLmVuZFJlY29yZGluZyh0aGlzKTsKLQkJCQltb2RlbC5yZWxlYXNlRnJvbUVkaXQoKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0NvbW1lbnRMaW5lKElEb2N1bWVudCBkb2N1bWVudCwgaW50IGxpbmUpIHsKLQkJYm9vbGVhbiBpc0NvbW1lbnQgPSBmYWxzZTsKLQotCQl0cnkgewotCQkJSVJlZ2lvbiByZWdpb24gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb24obGluZSk7Ci0JCQlTdHJpbmcgc3RyaW5nID0gZG9jdW1lbnQuZ2V0KHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpKS50cmltKCk7Ci0JCQlpc0NvbW1lbnQgPSBzdHJpbmcubGVuZ3RoKCkgPj0gT1BFTl9DT01NRU5ULmxlbmd0aCgpICsgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSAmJiBzdHJpbmcuc3RhcnRzV2l0aChPUEVOX0NPTU1FTlQpICYmIHN0cmluZy5lbmRzV2l0aChDTE9TRV9DT01NRU5UKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBpc0NvbW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNvbW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb3BlbkNvbW1lbnRPZmZzZXQsIGludCBjbG9zZUNvbW1lbnRPZmZzZXQpIHsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIDAsIE9QRU5fQ09NTUVOVCk7Ci0JCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgMCwgQ0xPU0VfQ09NTUVOVCk7Ci0JCQlyZW1vdmVPcGVuQ2xvc2VDb21tZW50cyhkb2N1bWVudCwgb3BlbkNvbW1lbnRPZmZzZXQgKyBPUEVOX0NPTU1FTlQubGVuZ3RoKCksIGNsb3NlQ29tbWVudE9mZnNldCAtIG9wZW5Db21tZW50T2Zmc2V0IC0gQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1bmNvbW1lbnQoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb3BlbkNvbW1lbnRPZmZzZXQsIGludCBjbG9zZUNvbW1lbnRPZmZzZXQpIHsKLQkJdHJ5IHsKLQkJCWRvY3VtZW50LnJlcGxhY2Uob3BlbkNvbW1lbnRPZmZzZXQsIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCQlkb2N1bWVudC5yZXBsYWNlKGNsb3NlQ29tbWVudE9mZnNldCwgQ0xPU0VfQ09NTUVOVC5sZW5ndGgoKSwgIiIpOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50U2VsZWN0aW9uKFBvc2l0aW9uIHNlbGVjdGlvblBvc2l0aW9uLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGJvb2xlYW4gdXBkYXRlU3RhcnRPZmZzZXQpIHsKLQkJaWYgKGZFZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJLy8gdXBkYXRlIHRoZSBzZWxlY3Rpb24gaWYgdGV4dCBzZWxlY3Rpb24gY2hhbmdlZAotCQkJaWYgKHNlbGVjdGlvblBvc2l0aW9uICE9IG51bGwpIHsKLQkJCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSBudWxsOwotCQkJCWlmICh1cGRhdGVTdGFydE9mZnNldCkKLQkJCQkJc2VsZWN0aW9uID0gbmV3IFRleHRTZWxlY3Rpb24oZG9jdW1lbnQsIHNlbGVjdGlvblBvc2l0aW9uLmdldE9mZnNldCgpIC0gT1BFTl9DT01NRU5ULmxlbmd0aCgpLCBzZWxlY3Rpb25Qb3NpdGlvbi5nZXRMZW5ndGgoKSArIE9QRU5fQ09NTUVOVC5sZW5ndGgoKSk7Ci0JCQkJZWxzZQotCQkJCQlzZWxlY3Rpb24gPSBuZXcgVGV4dFNlbGVjdGlvbihkb2N1bWVudCwgc2VsZWN0aW9uUG9zaXRpb24uZ2V0T2Zmc2V0KCksIHNlbGVjdGlvblBvc2l0aW9uLmdldExlbmd0aCgpKTsKLQkJCQlJU2VsZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSAoKElUZXh0RWRpdG9yKSBmRWRpdG9yKS5nZXRTZWxlY3Rpb25Qcm92aWRlcigpOwotCQkJCWlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0JCQkJCXByb3ZpZGVyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQkJCX0KLQkJCQlkb2N1bWVudC5yZW1vdmVQb3NpdGlvbihzZWxlY3Rpb25Qb3NpdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvQXV0b0VkaXRTdHJhdGVneUZvclRhYnMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzdmZWNlLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9hdXRvZWRpdC9BdXRvRWRpdFN0cmF0ZWd5Rm9yVGFicy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5hdXRvZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQ29uZmlndXJhYmxlTGluZVRyYWNrZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JQXV0b0VkaXRTdHJhdGVneTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklMaW5lVHJhY2tlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0VXRpbGl0aWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hXaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklUZXh0RWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3JFeHRlbnNpb24zOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5YTUxDb3JlUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIEF1dG9FZGl0U3RyYXRlZ3kgdG8gaGFuZGxlIGNoYXJhY3RlcnMgaW5zZXJ0ZWQgd2hlbiBUYWIga2V5IGlzIHByZXNzZWQKLSAqLwotcHVibGljIGNsYXNzIEF1dG9FZGl0U3RyYXRlZ3lGb3JUYWJzIGltcGxlbWVudHMgSUF1dG9FZGl0U3RyYXRlZ3kgewotCXByaXZhdGUgZmluYWwgU3RyaW5nIFRBQl9DSEFSQUNURVIgPSAiXHQiOwkvLyROT04tTkxTLTEkCi0JCi0JcHVibGljIHZvaWQgY3VzdG9taXplRG9jdW1lbnRDb21tYW5kKElEb2N1bWVudCBkb2N1bWVudCwgRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQpIHsKLQkJLy8gaWYgbm90IGluIHNtYXJ0IGluc2VydCBtb2RlIGp1c3QgaWdub3JlCi0JCWlmICghaXNTbWFydEluc2VydE1vZGUoKSkKLQkJCXJldHVybjsKLQkJCi0JCS8vIHNwYWNlcyBmb3IgdGFiIGNoYXJhY3RlcgotCQlpZiAoY29tbWFuZC5sZW5ndGggPT0gMCAmJiBjb21tYW5kLnRleHQgIT0gbnVsbCAmJiBjb21tYW5kLnRleHQubGVuZ3RoKCkgPiAwICYmIGNvbW1hbmQudGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpICE9IC0xKQotCQkJc21hcnRJbnNlcnRGb3JUYWIoY29tbWFuZCwgZG9jdW1lbnQpOwotCX0KLQotCS8qKgotCSAqIEluc2VydCBzcGFjZXMgZm9yIHRhYnMKLQkgKiAKLQkgKiBAcGFyYW0gY29tbWFuZAotCSAqLwotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvclRhYihEb2N1bWVudENvbW1hbmQgY29tbWFuZCwgSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIHRhYiBrZXkgd2FzIHByZXNzZWQuIG5vdyBjaGVjayBwcmVmZXJlbmNlcyB0byBzZWUgaWYgbmVlZCB0byBpbnNlcnQKLQkJLy8gc3BhY2VzIGluc3RlYWQgb2YgdGFiCi0JCWludCBpbmRlbnRhdGlvbldpZHRoID0gZ2V0SW5kZW50YXRpb25XaWR0aCgpOwotCQlpZiAoaW5kZW50YXRpb25XaWR0aCA+IC0xKSB7Ci0JCQlTdHJpbmcgb3JpZ2luYWxUZXh0ID0gY29tbWFuZC50ZXh0OwotCQkJU3RyaW5nQnVmZmVyIG5ld1RleHQgPSBuZXcgU3RyaW5nQnVmZmVyKG9yaWdpbmFsVGV4dCk7Ci0KLQkJCS8vIGRldGVybWluZSB3aGVyZSBpbiBsaW5lIHRoaXMgY29tbWFuZCBiZWdpbnMKLQkJCWludCBsaW5lT2Zmc2V0ID0gLTE7Ci0JCQl0cnkgewotCQkJCUlSZWdpb24gbGluZUluZm8gPSBkb2N1bWVudC5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChjb21tYW5kLm9mZnNldCk7Ci0JCQkJbGluZU9mZnNldCA9IGNvbW1hbmQub2Zmc2V0IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCi0JCQlJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBnZXRMaW5lVHJhY2tlcihkb2N1bWVudCwgb3JpZ2luYWxUZXh0KTsKLQotCQkJaW50IHN0YXJ0SW5kZXggPSAwOwotCQkJaW50IGluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIpOwotCQkJd2hpbGUgKGluZGV4ICE9IC0xKSB7Ci0JCQkJU3RyaW5nIGluZGVudCA9IGdldEluZGVudFN0cmluZyhpbmRlbnRhdGlvbldpZHRoLCBsaW5lT2Zmc2V0LCBsaW5lVHJhY2tlciwgaW5kZXgpOwotCi0JCQkJLy8gcmVwbGFjZSBcdCBjaGFyYWN0ZXIgd2l0aCBzcGFjZXMKLQkJCQluZXdUZXh0LnJlcGxhY2UoaW5kZXgsIGluZGV4ICsgMSwgaW5kZW50KTsKLQkJCQlpZiAobGluZVRyYWNrZXIgIT0gbnVsbCkgewotCQkJCQl0cnkgewotCQkJCQkJbGluZVRyYWNrZXIucmVwbGFjZShpbmRleCwgMSwgaW5kZW50KTsKLQkJCQkJfSBjYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQkJLy8gaWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2l0aCByZXBsYWNpbmcgdGV4dCwganVzdAotCQkJCQkJLy8gcmVzZXQgdG8gY3VycmVudCBzdHJpbmcKLQkJCQkJCWxpbmVUcmFja2VyLnNldChuZXdUZXh0LnRvU3RyaW5nKCkpOwotCQkJCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQkJc3RhcnRJbmRleCA9IGluZGV4ICsgaW5kZW50Lmxlbmd0aCgpOwotCQkJCWluZGV4ID0gbmV3VGV4dC5pbmRleE9mKFRBQl9DSEFSQUNURVIsIHN0YXJ0SW5kZXgpOwotCQkJfQotCQkJY29tbWFuZC50ZXh0ID0gbmV3VGV4dC50b1N0cmluZygpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQ2FsY3VsYXRlIG51bWJlciBvZiBzcGFjZXMgZm9yIG5leHQgdGFiIHN0b3AKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRJbmRlbnRTdHJpbmcoaW50IGluZGVudGF0aW9uV2lkdGgsIGludCBsaW5lT2Zmc2V0LCBJTGluZVRyYWNrZXIgbGluZVRyYWNrZXIsIGludCBpbmRleCkgewotCQlpbnQgaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGg7Ci0JCWludCBvZmZzZXRJbkxpbmUgPSAtMTsKLQkJaWYgKGxpbmVUcmFja2VyICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJSVJlZ2lvbiBsaW5lSW5mbyA9IGxpbmVUcmFja2VyLmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGluZGV4KTsKLQkJCQlpZiAobGluZUluZm8uZ2V0T2Zmc2V0KCkgPT0gMCAmJiBsaW5lT2Zmc2V0ID4gLTEpCi0JCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCQllbHNlCi0JCQkJCW9mZnNldEluTGluZSA9IGluZGV4IC0gbGluZUluZm8uZ2V0T2Zmc2V0KCk7Ci0JCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKGxpbmVPZmZzZXQgPiAtMSkgewotCQkJCW9mZnNldEluTGluZSA9IGxpbmVPZmZzZXQgKyBpbmRleDsKLQkJCX0KLQkJfQotCQlpZiAob2Zmc2V0SW5MaW5lID4gLTEgJiYgaW5kZW50YXRpb25XaWR0aCA+IDApIHsKLQkJCWludCByZW1haW5kZXIgPSBvZmZzZXRJbkxpbmUgJSBpbmRlbnRhdGlvbldpZHRoOwotCQkJaW5kZW50U2l6ZSA9IGluZGVudGF0aW9uV2lkdGggLSByZW1haW5kZXI7Ci0JCX0KLQotCQlTdHJpbmdCdWZmZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGluZGVudFNpemU7IGkrKykKLQkJCWluZGVudC5hcHBlbmQoJyAnKTsKLQkJcmV0dXJuIGluZGVudC50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIFNldCB1cCBhIGxpbmUgdHJhY2tlciBmb3IgdGV4dCB3aXRoaW4gY29tbWFuZCBpZiB0ZXh0IGlzIG11bHRpLWxpbmUKLQkgKi8KLQlwcml2YXRlIElMaW5lVHJhY2tlciBnZXRMaW5lVHJhY2tlcihJRG9jdW1lbnQgZG9jdW1lbnQsIFN0cmluZyBvcmlnaW5hbFRleHQpIHsKLQkJQ29uZmlndXJhYmxlTGluZVRyYWNrZXIgbGluZVRyYWNrZXIgPSBudWxsOwotCQlpbnRbXSBkZWxpbXMgPSBUZXh0VXRpbGl0aWVzLmluZGV4T2YoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpLCBvcmlnaW5hbFRleHQsIDApOwotCQlpZiAoZGVsaW1zWzBdICE9IC0xIHx8IGRlbGltc1sxXSAhPSAtMSkgewotCQkJbGluZVRyYWNrZXIgPSBuZXcgQ29uZmlndXJhYmxlTGluZVRyYWNrZXIoZG9jdW1lbnQuZ2V0TGVnYWxMaW5lRGVsaW1pdGVycygpKTsKLQkJCWxpbmVUcmFja2VyLnNldChvcmlnaW5hbFRleHQpOwotCQl9Ci0JCXJldHVybiBsaW5lVHJhY2tlcjsKLQl9Ci0JCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgYWN0aXZlIGVkaXRvciBpcyBpbiBzbWFydCBpbnNlcnQgbW9kZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU21hcnRJbnNlcnRNb2RlKCkgewotCQlib29sZWFuIGlzU21hcnRJbnNlcnRNb2RlID0gZmFsc2U7Ci0JCQotCQlJVGV4dEVkaXRvciB0ZXh0RWRpdG9yID0gbnVsbDsKLQkJSVdvcmtiZW5jaFdpbmRvdyB3aW5kb3cgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpOwotCQlpZiAod2luZG93ICE9IG51bGwpIHsKLQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSB3aW5kb3cuZ2V0QWN0aXZlUGFnZSgpOwotCQkJaWYgKHBhZ2UgIT0gbnVsbCkgewotCQkJCUlFZGl0b3JQYXJ0IGVkaXRvciA9IHBhZ2UuZ2V0QWN0aXZlRWRpdG9yKCk7Ci0JCQkJaWYgKGVkaXRvciAhPSBudWxsKSB7Ci0JCQkJCWlmIChlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikKLQkJCQkJCXRleHRFZGl0b3IgPSAoSVRleHRFZGl0b3IpZWRpdG9yOwotCQkJCQllbHNlCi0JCQkJCQl0ZXh0RWRpdG9yID0gKElUZXh0RWRpdG9yKWVkaXRvci5nZXRBZGFwdGVyKElUZXh0RWRpdG9yLmNsYXNzKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIGNoZWNrIGlmIHNtYXJ0IGluc2VydCBtb2RlCi0JCWlmICh0ZXh0RWRpdG9yIGluc3RhbmNlb2YgSVRleHRFZGl0b3JFeHRlbnNpb24zICYmICgoSVRleHRFZGl0b3JFeHRlbnNpb24zKSB0ZXh0RWRpdG9yKS5nZXRJbnNlcnRNb2RlKCkgPT0gSVRleHRFZGl0b3JFeHRlbnNpb24zLlNNQVJUX0lOU0VSVCkKLQkJCWlzU21hcnRJbnNlcnRNb2RlID0gdHJ1ZTsKLQkJcmV0dXJuIGlzU21hcnRJbnNlcnRNb2RlOwotCX0KLQkKLQkvKioKLQkgKiBSZXR1cm5zIGluZGVudGF0aW9uIHdpZHRoIGlmIHVzaW5nIHNwYWNlcyBmb3IgaW5kZW50YXRpb24sIC0xIG90aGVyd2lzZQotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHJpdmF0ZSBpbnQgZ2V0SW5kZW50YXRpb25XaWR0aCgpIHsKLQkJaW50IHdpZHRoID0gLTE7Ci0KLQkJUHJlZmVyZW5jZXMgcHJlZmVyZW5jZXMgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCQlpZiAoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRS5lcXVhbHMocHJlZmVyZW5jZXMuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKQotCQkJd2lkdGggPSBwcmVmZXJlbmNlcy5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKTsKLQotCQlyZXR1cm4gd2lkdGg7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2F1dG9lZGl0L1N0cnVjdHVyZWRBdXRvRWRpdFN0cmF0ZWd5WE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkxYzBjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvYXV0b2VkaXQvU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRDb21tYW5kOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSUF1dG9FZGl0U3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFdpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5JVGV4dEVkaXRvckV4dGVuc2lvbjM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQXV0b21hdGljYWxseSBpbnNlcnRzIGNsb3NpbmcgY29tbWVudCB0YWcgb3IgZW5kIHRhZyB3aGVuIGFwcHJvcHJpYXRlLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZEF1dG9FZGl0U3RyYXRlZ3lYTUwgaW1wbGVtZW50cyBJQXV0b0VkaXRTdHJhdGVneSB7Ci0JLyoKLQkgKiBOT1RFOiBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdHMgaW4KLQkgKiBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmF1dG9lZGl0Ci0JICogb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuYXV0b2VkaXQKLQkgKi8KLQlwdWJsaWMgdm9pZCBjdXN0b21pemVEb2N1bWVudENvbW1hbmQoSURvY3VtZW50IGRvY3VtZW50LCBEb2N1bWVudENvbW1hbmQgY29tbWFuZCkgewotCQlPYmplY3QgdGV4dEVkaXRvciA9IGdldEFjdGl2ZVRleHRFZGl0b3IoKTsKLQkJaWYgKCEodGV4dEVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yRXh0ZW5zaW9uMyAmJiAoKElUZXh0RWRpdG9yRXh0ZW5zaW9uMykgdGV4dEVkaXRvcikuZ2V0SW5zZXJ0TW9kZSgpID09IElUZXh0RWRpdG9yRXh0ZW5zaW9uMy5TTUFSVF9JTlNFUlQpKQotCQkJcmV0dXJuOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJbW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGRvY3VtZW50KTsKLQkJCWlmIChtb2RlbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGNvbW1hbmQudGV4dCAhPSBudWxsKSB7Ci0JCQkJCXNtYXJ0SW5zZXJ0Rm9yQ29tbWVudChjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCQlzbWFydEluc2VydEZvckVuZFRhZyhjb21tYW5kLCBkb2N1bWVudCwgbW9kZWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChtb2RlbCAhPSBudWxsKQotCQkJCW1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzQ29tbWVudE5vZGUoSURPTU5vZGUgbm9kZSkgewotCQlyZXR1cm4gKG5vZGUgIT0gbnVsbCAmJiBub2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQgJiYgKChJRE9NRWxlbWVudCkgbm9kZSkuaXNDb21tZW50VGFnKCkpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpOwotCX0KLQotCXByaXZhdGUgdm9pZCBzbWFydEluc2VydEZvckNvbW1lbnQoRG9jdW1lbnRDb21tYW5kIGNvbW1hbmQsIElEb2N1bWVudCBkb2N1bWVudCwgSVN0cnVjdHVyZWRNb2RlbCBtb2RlbCkgewotCQl0cnkgewotCQkJaWYgKGNvbW1hbmQudGV4dC5lcXVhbHMoIi0iKSAmJiBkb2N1bWVudC5nZXRMZW5ndGgoKSA+PSAzICYmIGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCAtIDMsIDMpLmVxdWFscygiPCEtIikpIHsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJY29tbWFuZC50ZXh0ICs9ICIgIC0tPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljb21tYW5kLnNoaWZ0c0NhcmV0ID0gZmFsc2U7Ci0JCQkJY29tbWFuZC5jYXJldE9mZnNldCA9IGNvbW1hbmQub2Zmc2V0ICsgMjsKLQkJCQljb21tYW5kLmRvaXQgPSBmYWxzZTsKLQkJCX0KLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZ0V4Y2VwdGlvbihlKTsKLQkJfQotCi0JfQotCi0JcHJpdmF0ZSB2b2lkIHNtYXJ0SW5zZXJ0Rm9yRW5kVGFnKERvY3VtZW50Q29tbWFuZCBjb21tYW5kLCBJRG9jdW1lbnQgZG9jdW1lbnQsIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwpIHsKLQkJdHJ5IHsKLQkJCWlmIChjb21tYW5kLnRleHQuZXF1YWxzKCIvIikgJiYgZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPj0gMSAmJiBkb2N1bWVudC5nZXQoY29tbWFuZC5vZmZzZXQgLSAxLCAxKS5lcXVhbHMoIjwiKSkgeyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSAoKElET01Ob2RlKSBtb2RlbC5nZXRJbmRleGVkUmVnaW9uKGNvbW1hbmQub2Zmc2V0IC0gMSkpLmdldFBhcmVudE5vZGUoKTsKLQkJCQlpZiAoaXNDb21tZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IG5vZGUgcGFyZW50Ci0JCQkJCXdoaWxlIChwYXJlbnROb2RlICE9IG51bGwgJiYgaXNDb21tZW50Tm9kZShwYXJlbnROb2RlKSkgewotCQkJCQkJcGFyZW50Tm9kZSA9IChJRE9NTm9kZSkgcGFyZW50Tm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQlpZiAoIWlzRG9jdW1lbnROb2RlKHBhcmVudE5vZGUpKSB7Ci0JCQkJCS8vIG9ubHkgYWRkIGVuZCB0YWcgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3Qgb3IgaWYKLQkJCQkJLy8gYWRkICcvJyBkb2VzIG5vdCBjcmVhdGUgb25lIGFscmVhZHkKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRUYWdTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBwYXJlbnROb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlpZiAoZW5kVGFnU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpIHsKLQkJCQkJCVN0cmluZ0J1ZmZlciB0b0FkZCA9IG5ldyBTdHJpbmdCdWZmZXIocGFyZW50Tm9kZS5nZXROb2RlTmFtZSgpKTsKLQkJCQkJCWlmICh0b0FkZC5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQl0b0FkZC5hcHBlbmQoIj4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBzdWZmaXggPSB0b0FkZC50b1N0cmluZygpOwotCQkJCQkJCWlmICgoZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgPCBjb21tYW5kLm9mZnNldCArIHN1ZmZpeC5sZW5ndGgoKSkgfHwgKCFzdWZmaXguZXF1YWxzKGRvY3VtZW50LmdldChjb21tYW5kLm9mZnNldCwgc3VmZml4Lmxlbmd0aCgpKSkpKSB7Ci0JCQkJCQkJCWNvbW1hbmQudGV4dCArPSBzdWZmaXg7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRoZSBhY3RpdmUgdGV4dCBlZGl0b3IgaWYgcG9zc2libGUsIG90aGVyd2lzZSB0aGUgYWN0aXZlIGVkaXRvcgotCSAqIHBhcnQuCi0JICogCi0JICogQHJldHVybiBPYmplY3QKLQkgKi8KLQlwcml2YXRlIE9iamVjdCBnZXRBY3RpdmVUZXh0RWRpdG9yKCkgewotCQlJV29ya2JlbmNoV2luZG93IHdpbmRvdyA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCk7Ci0JCWlmICh3aW5kb3cgIT0gbnVsbCkgewotCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IHdpbmRvdy5nZXRBY3RpdmVQYWdlKCk7Ci0JCQlpZiAocGFnZSAhPSBudWxsKSB7Ci0JCQkJSUVkaXRvclBhcnQgZWRpdG9yID0gcGFnZS5nZXRBY3RpdmVFZGl0b3IoKTsKLQkJCQlpZiAoZWRpdG9yICE9IG51bGwpIHsKLQkJCQkJaWYgKGVkaXRvciBpbnN0YW5jZW9mIElUZXh0RWRpdG9yKQotCQkJCQkJcmV0dXJuIGVkaXRvcjsKLQkJCQkJSVRleHRFZGl0b3IgdGV4dEVkaXRvciA9IChJVGV4dEVkaXRvcikgZWRpdG9yLmdldEFkYXB0ZXIoSVRleHRFZGl0b3IuY2xhc3MpOwotCQkJCQlpZiAodGV4dEVkaXRvciAhPSBudWxsKQotCQkJCQkJcmV0dXJuIHRleHRFZGl0b3I7Ci0JCQkJCXJldHVybiBlZGl0b3I7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZWUzZTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29udGVudFR5cGVFbmNvZGluZ1ByZWZlcmVuY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkNvbnRhaW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuRGVidWc7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5DdXN0b21Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Db250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRW50aXR5RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGVMaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmRvY3VtZW50LkF0dHJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuQ01JbWFnZVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvLk1hcmt1cFRhZ0luZm9Qcm92aWRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElSZWxlYXNhYmxlIHsKLQkvKioKLQkgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0JICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24KLQkgKiAibmVzdGVkQ29udGV4dCIuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5IHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTUF9DTE9TRSA9ICJKU1BfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ09NTUVOVF9DTE9TRSA9ICJKU1BfQ09NTUVOVF9DTE9TRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0NPTU1FTlRfT1BFTiA9ICJKU1BfQ09NTUVOVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX0NMT1NFID0gIkpTUF9ESVJFQ1RJVkVfQ0xPU0UiOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX05BTUUgPSAiSlNQX0RJUkVDVElWRV9OQU1FIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfUk9PVF9UQUdfTkFNRSA9ICJKU1BfUk9PVF9UQUdfTkFNRSI7IC8vJE5PTi1OTFMtMSQKLQotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX1NDUklQVExFVF9PUEVOID0gIkpTUF9TQ1JJUFRMRVRfT1BFTiI7IC8vJE5PTi1OTFMtMSQKLQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIElOVEVSTkFMRVJST1IgPSBYTUxVSU1lc3NhZ2VzLlNFVkVSRV9pbnRlcm5hbF9lcnJvcl9vY2N1X1VJXzsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBVTktOT1dOX0FUVFIgPSBYTUxVSU1lc3NhZ2VzLk5vX2tub3duX2F0dHJpYnV0ZV9fVUlfOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVOS05PV05fQ09OVEVYVCA9IFhNTFVJTWVzc2FnZXMuQ29udGVudF9Bc3Npc3Rfbm90X2F2YWlsYWJfVUlfOwotCXByb3RlY3RlZCBjaGFyIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyc1tdID0gbnVsbDsKLQlwcm90ZWN0ZWQgY2hhciBjb250ZXh0SW5mb3JtYXRpb25BdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnNbXSA9IG51bGw7Ci0JcHJpdmF0ZSBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlciBmQXR0cmlidXRlSW5mb1Byb3ZpZGVyID0gbnVsbDsKLQlwcml2YXRlIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciBmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID0gbnVsbDsKLQotCXByb3RlY3RlZCBTdHJpbmcgZkVycm9yTWVzc2FnZSA9IG51bGw7Ci0JcHJvdGVjdGVkIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBmR2VuZXJhdG9yOwotCS8vIHByb3RlY3RlZCBJUmVzb3VyY2UgcmVzb3VyY2UgPSBudWxsOwotCXByb3RlY3RlZCBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZkluZm9Qcm92aWRlciA9IG51bGw7Ci0JcHJvdGVjdGVkIElUZXh0Vmlld2VyIGZUZXh0Vmlld2VyID0gbnVsbDsKLQotCXByaXZhdGUgZmluYWwgYm9vbGVhbiBzaG93VmFsdWVzID0gdHJ1ZTsKLQotCXB1YmxpYyBBYnN0cmFjdENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCWluaXQoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE5vZGUoKTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCk7Ci0JCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCi0JCQkvLyBjaGVjayB3aGV0aGVyIGFuIGF0dHJpYnV0ZSByZWFsbHkgZXhpc3RzIGZvciB0aGUgcmVwbGFjZW1lbnQKLQkJCS8vIG9mZnNldHMgQU5EIGlmIGl0IHBvc3Nlc3NlcyBhIHZhbHVlCi0JCQlib29sZWFuIGF0dHJBdExvY2F0aW9uSGFzVmFsdWUgPSBmYWxzZTsKLQkJCU5hbWVkTm9kZU1hcCBhdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ckltcGwgZXhpc3RpbmdBdHRyID0gKEF0dHJJbXBsKSBhdHRycy5pdGVtKGkpOwotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSBleGlzdGluZ0F0dHIuZ2V0TmFtZVJlZ2lvbigpOwotCi0JCQkJaWYgKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpIDw9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICYmIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KG5hbWUpICsgbmFtZS5nZXRMZW5ndGgoKSA+PSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSArIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCkgJiYgZXhpc3RpbmdBdHRyLmdldFZhbHVlUmVnaW9uKCkgIT0gbnVsbCkgewotCQkJCQlhdHRyQXRMb2NhdGlvbkhhc1ZhbHVlID0gdHJ1ZTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBvbmx5IGFkZCBwcm9wb3NhbHMgZm9yIHRoZSBhdHRyaWJ1dGVzIHdob3NlIG5hbWVzIGJlZ2luIHdpdGgKLQkJCS8vIHRoZSBtYXRjaHN0cmluZwotCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCQkKLQkJCQkJaW50IGlzUmVxdWlyZWQgPSAwOwotCQkJCQlpZiAoYXR0ckRlY2wuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlpc1JlcXVpcmVkID0gWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfUkVRVUlSRUQ7Ci0JCQkJCX0KLQotCQkJCQlib29sZWFuIHNob3dBdHRyaWJ1dGUgPSB0cnVlOwotCQkJCQlzaG93QXR0cmlidXRlID0gc2hvd0F0dHJpYnV0ZSAmJiBiZWdpbnNXaXRoKGdldFJlcXVpcmVkTmFtZShub2RlLCBhdHRyRGVjbCksIG1hdGNoU3RyaW5nLnRyaW0oKSk7Ci0JCQkJCUF0dHJJbXBsIGF0dHIgPSAoQXR0ckltcGwpIG5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpKTsKLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IGF0dHIgIT0gbnVsbCA/IGF0dHIuZ2V0TmFtZVJlZ2lvbigpIDogbnVsbDsKLQkJCQkJLy8gbmFtZVJlZ2lvbi5nZXRFbmRPZmZzZXQoKSArIDEgaXMgcmVxdWlyZWQgdG8gYWxsb3cgZm9yCi0JCQkJCS8vIG1hdGNoZXMgYWdhaW5zdCB0aGUgZnVsbCBuYW1lIG9mIGFuIGV4aXN0aW5nIEF0dHIKLQkJCQkJc2hvd0F0dHJpYnV0ZSA9IHNob3dBdHRyaWJ1dGUgJiYgKChhdHRyID09IG51bGwpIHx8IChuYW1lUmVnaW9uICE9IG51bGwgJiYgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbikgPD0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgJiYgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZVJlZ2lvbikgKyBuYW1lUmVnaW9uLmdldExlbmd0aCgpID49IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSkpOwotCQkJCQlpZiAoc2hvd0F0dHJpYnV0ZSkgewotCQkJCQkJSW1hZ2UgYXR0ckltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoYXR0ckRlY2wpOwotCQkJCQkJaWYgKGF0dHJJbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJaWYgKGlzUmVxdWlyZWQgPiAwKSB7Ci0JCQkJCQkJCWF0dHJJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUX1JFUV9PQkopOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJYXR0ckltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQotCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IG51bGw7Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dHJEZWNsKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJCQkvLyBhdHRyaWJ1dGUgaXMgYXQgdGhpcyBsb2NhdGlvbiBhbmQgYWxyZWFkeSBleGlzdHMKLQkJCQkJCWlmIChhdHRyQXRMb2NhdGlvbkhhc1ZhbHVlKSB7Ci0JCQkJCQkJLy8gb25seSBwcm9wb3NlIHRoZSBuYW1lCi0JCQkJCQkJcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpLCBhdHRySW1hZ2UsIHByb3Bvc2VkVGV4dCwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX05BTUUgKyBpc1JlcXVpcmVkLCB0cnVlKTsJCQotCQkJCQkJfQotCQkJCQkJLy8gbm8gYXR0cmlidXRlIGV4aXN0cyBvciBpcyBlbHNld2hlcmUsIGdlbmVyYXRlCi0JCQkJCQkvLyBtaW5pbWFsbHkKLQkJCQkJCWVsc2UgewotCQkJCQkJCUF0dHIgZXhpc3RpbmdBdHRyTm9kZSA9IChBdHRyKSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGF0dHJEZWNsKSk7Ci0JCQkJCQkJU3RyaW5nIHZhbHVlID0gbnVsbDsKLQkJCQkJCQlpZiAoZXhpc3RpbmdBdHRyTm9kZSAhPSBudWxsKQotCQkJCQkJCQl2YWx1ZSA9IGV4aXN0aW5nQXR0ck5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUubGVuZ3RoKCkgPiAwKQotCQkJCQkJCQlwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpOwotCQkJCQkJCWVsc2UgewotCQkJCQkJCQlwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZFRleHQobm9kZSwgYXR0ckRlY2wpOwotCQkJCQkJCX0KLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgYXR0ckRlY2wuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKSArIDIsIGF0dHJJbWFnZSwKLQkJCQkJCQkvLyBpZiB0aGUgdmFsdWUgaXNuJ3QgZW1wdHkgKG5vIGVtcHR5IHNldCBvZgotCQkJCQkJCQkJCS8vIHF1b3RlcyksIHNob3cgaXQKLQkJCQkJCQkJCQkoc2hvd1ZhbHVlcyAmJiBwcm9wb3NlZFRleHQuaW5kZXhPZigiXCJcIiIpIDwgMCkgPyBwcm9wb3NlZFRleHQgOiBnZXRSZXF1aXJlZE5hbWUobm9kZSwgYXR0ckRlY2wpLCAvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX05BTUUgKyBpc1JlcXVpcmVkKTsKLQkJCQkJCX0KLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVsZW1lbnRfX2lzX3Vua25vd24sIChuZXcgT2JqZWN0W117bm9kZS5nZXROb2RlTmFtZSgpfSkpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZVZhbHVlUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCQotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0KLQkJLy8gRmluZCB0aGUgYXR0cmlidXRlIHJlZ2lvbiBhbmQgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQKLQkJLy8gaGF2ZSBhIHZhbHVlIHByb3Bvc2VkCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3BlbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IG9wZW5SZWdpb25zID0gb3Blbi5nZXRSZWdpb25zKCk7Ci0JCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSk7Ci0JCWlmIChpIDwgMCkKLQkJCXJldHVybjsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvLyB0aGUgbmFtZSByZWdpb24gaXMgUkVRVUlSRUQgdG8gZG8gYW55dGhpbmcgdXNlZnVsCi0JCWlmIChuYW1lUmVnaW9uICE9IG51bGwpIHsKLQkJCS8vIFJldHJpZXZlIHRoZSBkZWNsYXJhdGlvbgotCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihub2RlKTsKLQotCQkJLy8gU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBuYW1lUmVnaW9uLmdldFRleHQoKTsKLQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gb3Blbi5nZXRUZXh0KG5hbWVSZWdpb24pOwotCi0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQotCQkJLy8gTm8gQ01FbGVtZW50RGVjbGFyYXRpb24gbWVhbnMgbm8gYXR0cmlidXRlIG1ldGFkYXRhLCBidXQKLQkJCS8vIHJldHJpZXZlIHRoZQotCQkJLy8gZGVjbGFyYXRpb24gZm9yIHRoZSBhdHRyaWJ1dGUgb3RoZXJ3aXNlCi0JCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCkgewotCQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJU3RyaW5nIG5vcHJlZml4TmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyaWJ1dGVOYW1lKTsKLQkJCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKG5vcHJlZml4TmFtZSk7Ci0JCQkJCWlmIChhdHRyRGVjbCA9PSBudWxsKSB7Ci0JCQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkgewotCQkJCQlzZXRFcnJvck1lc3NhZ2UoVU5LTk9XTl9BVFRSLCBhdHRyaWJ1dGVOYW1lKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCVN0cmluZyBjdXJyZW50VmFsdWUgPSBub2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gbnVsbDsKLQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoYXR0ckRlY2wpOwotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCAmJiBhdHRyRGVjbC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVF9SRVFfT0JKKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BVFRSSUJVVEUpOwotCQkJCX0KLQkJCX0KLQotCQkJaWYgKGF0dHJEZWNsICE9IG51bGwgJiYgYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSB7Ci0JCQkJLy8gYXR0cmlidXRlIGlzIGtub3duLCBwcm9tcHQgd2l0aCB2YWx1ZXMgZnJvbSB0aGUgZGVjbGFyYXRpb24KLQkJCQlwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhlbGVtZW50RGVjbCwgYXR0ckRlY2wpOwotCQkJCUxpc3QgcG9zc2libGVWYWx1ZXMgPSBnZXRQb3NzaWJsZURhdGFUeXBlVmFsdWVzKG5vZGUsIGF0dHJEZWNsKTsKLQkJCQlpZiAocG9zc2libGVWYWx1ZXMuc2l6ZSgpID4gMCkgewotCQkJCQkvLyBFTlVNRVJBVEVEIFZBTFVFUwotCQkJCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJCQlpZiAobWF0Y2hTdHJpbmcgPT0gbnVsbCkKLQkJCQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJaWYgKG1hdGNoU3RyaW5nLmxlbmd0aCgpID4gMCAmJiAobWF0Y2hTdHJpbmcuc3RhcnRzV2l0aCgiXCIiKSB8fCBtYXRjaFN0cmluZy5zdGFydHNXaXRoKCInIikpKSAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQkJCWJvb2xlYW4gY3VycmVudFZhbGlkID0gZmFsc2U7Ci0KLQkJCQkJLy8gZDIxMDg1OCwgaWYgdGhlIHJlZ2lvbidzIGEgY29udGFpbmVyLCBkb24ndCBzdWdnZXN0IHRoZQotCQkJCQkvLyBlbnVtZXJhdGVkIHZhbHVlcyBhcyB0aGV5IHByb2JhYmx5IHdvbid0IGhlbHAKLQkJCQkJYm9vbGVhbiBleGlzdGluZ0NvbXBsaWNhdGVkVmFsdWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKSAhPSBudWxsICYmIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXI7Ci0JCQkJCWlmICghZXhpc3RpbmdDb21wbGljYXRlZFZhbHVlKSB7Ci0JCQkJCQlmb3IgKEl0ZXJhdG9yIGogPSBwb3NzaWJsZVZhbHVlcy5pdGVyYXRvcigpOyBqLmhhc05leHQoKTspIHsKLQkJCQkJCQlTdHJpbmcgcG9zc2libGVWYWx1ZSA9IChTdHJpbmcpIGoubmV4dCgpOwotCQkJCQkJCWN1cnJlbnRWYWxpZCA9IGN1cnJlbnRWYWxpZCB8fCBwb3NzaWJsZVZhbHVlLmVxdWFscyhjdXJyZW50VmFsdWUpOwotCQkJCQkJCWlmIChtYXRjaFN0cmluZy5sZW5ndGgoKSA9PSAwIHx8IHBvc3NpYmxlVmFsdWUuc3RhcnRzV2l0aChtYXRjaFN0cmluZykpIHsKLQkJCQkJCQkJCi0JCQkJCQkJCVN0cmluZyByU3RyaW5nID0gIlwiIiArIHBvc3NpYmxlVmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJCQlpbnQgck9mZnNldCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpOwotCQkJCQkJCQlpbnQgckxlbmd0aCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCk7Ci0JCQkJCQkJCWludCBjdXJzb3JBZnRlciA9IHBvc3NpYmxlVmFsdWUubGVuZ3RoKCkgKyAxOwotCQkJCQkJCQlTdHJpbmcgZGlzcGxheVN0cmluZyA9ICJcIiIgKyBwb3NzaWJsZVZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCi0JCQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoclN0cmluZywgck9mZnNldCwgckxlbmd0aCwgY3Vyc29yQWZ0ZXIsIGltYWdlLCBkaXNwbGF5U3RyaW5nLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgaWYgKChhdHRyRGVjbC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uRklYRUQgfHwgYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXRJbXBsaWVkVmFsdWVLaW5kKCkgPT0gQ01EYXRhVHlwZS5JTVBMSUVEX1ZBTFVFX0ZJWEVEKSAmJiBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCQkJLy8gRklYRUQgdmFsdWVzCi0JCQkJCVN0cmluZyB2YWx1ZSA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQkJCWlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJU3RyaW5nIHJWYWx1ZSA9ICJcIiIgKyB2YWx1ZSArICJcIiI7Ly8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoclZhbHVlLCAKLQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCByVmFsdWUubGVuZ3RoKCkgKyAxLCBpbWFnZSwgclZhbHVlLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9BVFRSSUJVVEVfVkFMVUUpOwotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJaWYgKGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IDAgJiYgIXZhbHVlLmVxdWFscyhjdXJyZW50VmFsdWUpKSB7Ci0JCQkJCQkJclZhbHVlID0gIlwiIiArIGN1cnJlbnRWYWx1ZSArICJcIiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJWYWx1ZSwKLQkJCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgclZhbHVlLmxlbmd0aCgpICsgMSwgaW1hZ2UsIHJWYWx1ZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyB1bmtub3duIGF0dHJpYnV0ZSwgc28gc3VwcGx5IG5pY2UgZW1wdHkgdmFsdWVzCi0JCQkJcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8obnVsbCwgZWxlbWVudERlY2wpOwotCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG51bGw7Ci0JCQkJaWYgKGN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJU3RyaW5nIHJWYWx1ZSA9ICJcIiIgKyBjdXJyZW50VmFsdWUgKyAiXCIiOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoclZhbHVlLAotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgMSwgaW1hZ2UsIHJWYWx1ZSwgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9YTUxfQVRUUklCVVRFX1ZBTFVFKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlCi0JCQlzZXRFcnJvck1lc3NhZ2UoVU5LTk9XTl9DT05URVhUKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb21tZW50UHJvcG9zYWwoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwobmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPCEtLSAgLS0+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgNSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UKSwgTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Db21tZW50X18sIChuZXcgT2JqZWN0W117IiA8IS0tICAtLT4ifSkpLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NPTU1FTlQpKTsKLQl9Ci0KLQkvKioKLQkgKiBBZGQgYWxsIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBpbnQgdGhlIENNQ29udGVudCBvYmplY3QgaW50byBvbmUKLQkgKiBiaWcgbGlzdC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDb250ZW50KExpc3QgY29udGVudExpc3QsIENNQ29udGVudCBjb250ZW50KSB7Ci0JCWlmIChjb250ZW50ID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmIChjb250ZW50IGluc3RhbmNlb2YgQ01Hcm91cCkgewotCQkJQ01Ob2RlTGlzdCBjaGlsZHJlbiA9ICgoQ01Hcm91cCkgY29udGVudCkuZ2V0Q2hpbGROb2RlcygpOwotCQkJaWYgKGNoaWxkcmVuID09IG51bGwpCi0JCQkJcmV0dXJuOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuRUxFTUVOVF9ERUNMQVJBVElPTikgewotCQkJCQljb250ZW50TGlzdC5hZGQoY2hpbGQpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkdST1VQKSB7Ci0JCQkJCQlhZGRDb250ZW50KGNvbnRlbnRMaXN0LCAoQ01Db250ZW50KSBjaGlsZCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQl0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGNvbnRlbnQgY2hpbGQ6ICIgKyBjaGlsZCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWNvbnRlbnRMaXN0LmFkZChjb250ZW50KTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZERvY1R5cGVQcm9wb3NhbChDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQkvLyBpZiBhIERvY3VtZW50RWxlbWVudCBleGlzdHMsIHVzZSB0aGF0IGZvciB0aGUgcm9vdCBFbGVtZW50IG5hbWUKLQkJU3RyaW5nIHJvb3RuYW1lID0gInVuc3BlY2lmaWVkIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0Tm9kZSgpLmdldE93bmVyRG9jdW1lbnQoKS5nZXREb2N1bWVudEVsZW1lbnQoKSAhPSBudWxsKQotCQkJcm9vdG5hbWUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCkuZ2V0T3duZXJEb2N1bWVudCgpLmdldERvY3VtZW50RWxlbWVudCgpLmdldE5vZGVOYW1lKCk7Ci0KLQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICI8IURPQ1RZUEUgIiArIHJvb3RuYW1lICsgIiBQVUJMSUMgXCIvL1VOS05PV04vXCIgXCJ1bmtub3duLmR0ZFwiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlJQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCAxMCwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9ET0NUWVBFKSwgIjwhRE9DVFlQRSAuLi4gPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRE9DVFlQRSk7Ci0JCS8vIFRPRE8gcHJvdmlkZSBzcGVjaWFsIGRvY3VtZW50YXRpb24gb24gZG9jIHR5cGUKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCX0KLQotCS8qKgotCSAqIEFkZCB0aGUgcHJvcG9zYWxzIGZvciBhIGNvbXBsZXRlbHkgZW1wdHkgZG9jdW1lbnQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBBZGQgdGhlIHByb3Bvc2FscyBmb3IgdGhlIG5hbWUgaW4gYW4gZW5kIHRhZwotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQotCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0U3RhcnRPZmZzZXQoKSArIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlZ2lvbigpLmdldFRleHRMZW5ndGgoKSA8IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKSB7Ci0JCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDEsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfXywgKG5ldyBPYmplY3RbXXsiICc+JyJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCU5vZGUgYU5vZGUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCQlTdHJpbmcgbWF0Y2hTdHJpbmcgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpOwotCQkJaWYgKG1hdGNoU3RyaW5nLnN0YXJ0c1dpdGgoIjwvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQltYXRjaFN0cmluZyA9IG1hdGNoU3RyaW5nLnN1YnN0cmluZygyKTsKLQkJCXdoaWxlIChhTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKGFOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCQkJaWYgKGFOb2RlLmdldE5vZGVOYW1lKCkuc3RhcnRzV2l0aChtYXRjaFN0cmluZykpIHsKLQkJCQkJCUlET01Ob2RlIGFYTUxOb2RlID0gKElET01Ob2RlKSBhTm9kZTsKLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVkID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgYU5vZGUpOwotCQkJCQkJaWYgKChhWE1MTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSAmJiAoZWQgPT0gbnVsbCB8fCAoZWQuZ2V0Q29udGVudFR5cGUoKSAhPSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkpKSB7Ci0JCQkJCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9IGFOb2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IChlZCAhPSBudWxsKSA/IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVkKSA6IG51bGw7Ci0JCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiAhY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpCi0JCQkJCQkJCXByb3Bvc2VkVGV4dCArPSAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBudWxsOwotCQkJCQkJCS8vIGRvdWJsZSBjaGVjayB0byBzZWUgaWYgdGhlIHJlZ2lvbiBhY3RlZCB1cG9uIGlzCi0JCQkJCQkJLy8gYSB0YWcgbmFtZTsgcmVwbGFjZSBpdCBpZiBzbwotCQkJCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWQpOwotCQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0JCQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCQkJfQotCQkJCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0U3RhcnRPZmZzZXQoKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVnaW9uKCkuZ2V0VGV4dExlbmd0aCgpLCBwcm9wb3NlZFRleHQubGVuZ3RoKCksIGltYWdlLCBwcm9wb3NlZFRleHQsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBR19OQU1FKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBwcm9wb3NlZFRleHQubGVuZ3RoKCksIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfXywgKG5ldyBPYmplY3RbXXsiJyIgKyBwcm9wb3NlZFRleHQgKyAiJyJ9KSksIC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUdfTkFNRSk7Ci0JCQkJCQkJfQotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlhTm9kZSA9IGFOb2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIFByb21wdCBmb3IgZW5kIHRhZ3MgdG8gYSBub24tZW1wdHkgTm9kZSB0aGF0IGhhc24ndCBlbmRlZCBIYW5kbGVzIHRoZXNlCi0JICogY2FzZXM6IDxicj4KLQkgKiA8dGFnT3Blbj58IDxicj4KLQkgKiA8dGFnT3Blbj48IHw8YnI+Ci0JICogPHRhZ09wZW4+PC8gfAotCSAqIAotCSAqIEBwYXJhbSBjb250ZW50QXNzaXN0UmVxdWVzdAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZEVuZFRhZ1Byb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQotCQlpZiAoaXNDb21tZW50Tm9kZShub2RlKSkgewotCQkJLy8gbG9vcCBhbmQgZmluZCBub24gY29tbWVudCBub2RlIHBhcmVudAotCQkJd2hpbGUgKG5vZGUgIT0gbnVsbCAmJiBpc0NvbW1lbnROb2RlKG5vZGUpKSB7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJCi0JCS8vIG5vZGUgaXMgYWxyZWFkeSBjbG9zZWQKLQkJaWYobm9kZS5pc0Nsb3NlZCgpKSB7Ci0JCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IHVuY2xvc2Ugbm9kZSBwYXJlbnQKLQkJCXdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZS5pc0Nsb3NlZCgpKSB7Ci0JCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQl9Ci0JCX0KLQkJLy8gdGhlcmUgd2VyZSBubyB1bmNsb3NlZCB0YWdzCi0JCWlmKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJCi0JCS8vIGRhdGEgdG8gY3JlYXRlIGEgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsCi0JCVN0cmluZyByZXBsYWNlVGV4dCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKSArICI+IjsgLy8kTk9OLU5MUy0xJAotCQlpbnQgcmVwbGFjZUJlZ2luID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCk7Ci0JCWludCByZXBsYWNlTGVuZ3RoID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKTsKLQkJaW50IGN1cnNvck9mZnNldCA9IG5vZGUuZ2V0Tm9kZU5hbWUoKS5sZW5ndGgoKSArIDE7Ci0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCUltYWdlIGltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQlib29sZWFuIGFkZFByb3Bvc2FsID0gZmFsc2U7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCQlJU3RydWN0dXJlZERvY3VtZW50IHNEb2MgPSAoSVN0cnVjdHVyZWREb2N1bWVudCkgZlRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24geG1sRW5kVGFnT3BlbiA9IHNEb2MuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkpOwotCQkJLy8gc2tpcCBiYWNrd2FyZCB0byAiPCIsICI8LyIsIG9yIHRoZSAodW5jbG9zZWQpIHN0YXJ0IHRhZywgbnVsbAotCQkJLy8gaWYgbm90IGZvdW5kCi0JCQlTdHJpbmcgdHlwZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQl3aGlsZSAoeG1sRW5kVGFnT3BlbiAhPSBudWxsICYmICh0eXBlID0geG1sRW5kVGFnT3Blbi5nZXRUeXBlKCkpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VORF9UQUdfT1BFTiAmJiB0eXBlICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSAmJiAhbmVlZHNFbmRUYWcoeG1sRW5kVGFnT3BlbikgJiYgdHlwZSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCXhtbEVuZFRhZ09wZW4gPSB4bWxFbmRUYWdPcGVuLmdldFByZXZpb3VzKCk7Ci0JCQl9Ci0KLQkJCWlmICh4bWxFbmRUYWdPcGVuID09IG51bGwpCi0JCQkJcmV0dXJuOwotCi0JCQlub2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbih4bWxFbmRUYWdPcGVuLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJbm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkKLQkJCWlmIChpc1N0YXJ0VGFnKHhtbEVuZFRhZ09wZW4pKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBmb3IgYSBzdGFydCB0YWcgdy9vdXQgZW5kIHRhZwotCQkJCS8vIGVnOgotCQkJCS8vIDxwPgotCQkJCS8vIDwlIFN0cmluZyB0ZXN0ID0gInRlc3QiOyAlPgotCQkJCS8vIHwKLQkJCQlpZiAobmVlZHNFbmRUYWcoeG1sRW5kVGFnT3BlbikpIHsKLQkJCQkJU3RyaW5nIHRhZ05hbWUgPSBnZXRUYWdOYW1lKHhtbEVuZFRhZ09wZW4pOwotCQkJCQl4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCQkJcmVwbGFjZUxlbmd0aCA9IDA7Ci0JCQkJCXJlcGxhY2VUZXh0ID0gIjwvIiArIHRhZ05hbWUgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAkTk9OLU5MUy0yJAotCQkJCQkvLyByZXBsYWNlVGV4dCA9ICI8LyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiI7Ci0JCQkJCS8vIC8vJE5PTi1OTFMtMSQgJE5PTi1OTFMtMiQKLQkJCQkJY3Vyc29yT2Zmc2V0ID0gdGFnTmFtZS5sZW5ndGgoKSArIDM7Ci0JCQkJCWRpc3BsYXlTdHJpbmcgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoX18sIChuZXcgT2JqZWN0W117dGFnTmFtZX0pKTsKLQkJCQkJYWRkUHJvcG9zYWwgPSB0cnVlOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJLy8gdGhpcyBpcyB0aGUgY2FzZSBmb3I6IDx0YWc+IDwvIHwKLQkJCQkvLyBwb3NzaWJseSA8dGFnPiA8LyB8PGFub3RoZXJUYWc+Ci0JCQkJLy8gc2hvdWxkIG9ubHkgYmUgcmVwbGFjaW5nIHdoaXRlIHNwYWNlLi4uCi0JCQkJcmVwbGFjZUxlbmd0aCA9IChyZXBsYWNlQmVnaW4gPiB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKSkgPyByZXBsYWNlQmVnaW4gLSB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKSA6IDA7Ci0JCQkJcmVwbGFjZVRleHQgPSBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljdXJzb3JPZmZzZXQgPSByZXBsYWNlVGV4dC5sZW5ndGgoKTsKLQkJCQlyZXBsYWNlQmVnaW4gPSB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF8sIChuZXcgT2JqZWN0W117bm9kZS5nZXROb2RlTmFtZSgpfSkpOwotCQkJCWFkZFByb3Bvc2FsID0gdHJ1ZTsKLQkJCX0KLQkJCWVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4pIHsKLQkJCQkvLyB0aGlzIGlzIHRoZSBjYXNlIGZvcjogPHRhZz4gPCB8Ci0JCQkJcmVwbGFjZVRleHQgPSAiLyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAkTk9OLU5MUy0yJAotCQkJCWN1cnNvck9mZnNldCA9IHJlcGxhY2VUZXh0Lmxlbmd0aCgpOwotCQkJCS8vIHJlcGxhY2VUZXh0ID0gIi8iICsgbm9kZS5nZXROb2RlTmFtZSgpICsgIj4iOyAvLyROT04tTkxTLTEkCi0JCQkJLy8gJE5PTi1OTFMtMiQKLQkJCQkvLyBzaG91bGQgb25seSBiZSByZXBsYWNpbmcgd2hpdGUgc3BhY2UuLi4KLQkJCQlyZXBsYWNlTGVuZ3RoID0gKHJlcGxhY2VCZWdpbiA+IHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpKSA/IHJlcGxhY2VCZWdpbiAtIHhtbEVuZFRhZ09wZW4uZ2V0VGV4dEVuZE9mZnNldCgpIDogMDsKLQkJCQlyZXBsYWNlQmVnaW4gPSB4bWxFbmRUYWdPcGVuLmdldFRleHRFbmRPZmZzZXQoKTsKLQkJCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF8sICAobmV3IE9iamVjdFtdeyIvIiArIG5vZGUuZ2V0Tm9kZU5hbWUoKX0pKTsgLy8kTk9OLU5MUy0xJAotCQkJCWFkZFByb3Bvc2FsID0gdHJ1ZTsKLQkJCX0KLQkJfQotCQkvLyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQkJLy8gc29tZXRpbWVzIHRoZSBub2RlIGlzIG5vdCBudWxsLCBidXQKLQkJLy8gZ2V0Tm9kZVZhbHVlKCkgaXMgbnVsbCwgcHV0IGluIGEgbnVsbCBjaGVjawotCQllbHNlIGlmIChub2RlLmdldE5vZGVWYWx1ZSgpICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVmFsdWUoKS5pbmRleE9mKCI8LyIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCS8vIHRoZSBjYXNlIHdoZXJlICI8LyIgaXMgc3RhcnRlZCwgYnV0IHRoZSBub2RlcyBjb21lcyBpbiBhcyBhCi0JCQkvLyB0ZXh0IG5vZGUgKGluc3RlYWQgb2YgZWxlbWVudCkKLQkJCS8vIGxpa2UgdGhpczogPHRhZz4gPC98Ci0JCQlOb2RlIHBhcmVudCA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCXJlcGxhY2VUZXh0ID0gcGFyZW50LmdldE5vZGVOYW1lKCkgKyAiPiI7IC8vJE5PTi1OTFMtMSQKLQkJCQljdXJzb3JPZmZzZXQgPSByZXBsYWNlVGV4dC5sZW5ndGgoKTsKLQkJCQlkaXNwbGF5U3RyaW5nID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5FbmRfd2l0aF9fLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpOwotCQkJCXNldEVycm9yTWVzc2FnZShudWxsKTsKLQkJCQlhZGRQcm9wb3NhbCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQkJLy8gLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0JCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0NPTlRFWFQpOwotCQl9Ci0JCWlmIChhZGRQcm9wb3NhbCA9PSB0cnVlKSB7Ci0JCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHJlcGxhY2VUZXh0LCByZXBsYWNlQmVnaW4sIHJlcGxhY2VMZW5ndGgsIGN1cnNvck9mZnNldCwgaW1hZ2UsIGRpc3BsYXlTdHJpbmcsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5EX1RBRyk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsW10gZXBzID0gY29tcHV0ZUVudGl0eVJlZmVyZW5jZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSk7Ci0JCWZvciAoaW50IGkgPSAwOyBlcHMgIT0gbnVsbCAmJiBpIDwgZXBzLmxlbmd0aDsgaSsrKQotCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwoZXBzW2ldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbnRpdHlQcm9wb3NhbHMoVmVjdG9yIHByb3Bvc2FscywgUHJvcGVydGllcyBtYXAsIFN0cmluZyBrZXksIGludCBub2RlT2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uKSB7Ci0JCWlmIChtYXAgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJU3RyaW5nIGVudGl0eU5hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgZW50aXR5VmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlJbWFnZSBlbnRpdHlJY29uID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFlfUkVGRVJFTkNFKTsKLQkJU3RyaW5nIHJlcGxhY2VtZW50VGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JCVN0cmluZyBkaXNwbGF5U3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJRW51bWVyYXRpb24ga2V5cyA9IG1hcC5rZXlzKCk7Ci0KLQkJd2hpbGUgKGtleXMgIT0gbnVsbCAmJiBrZXlzLmhhc01vcmVFbGVtZW50cygpKSB7Ci0JCQllbnRpdHlOYW1lID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotCQkJZW50aXR5VmFsdWUgPSBtYXAuZ2V0UHJvcGVydHkoZW50aXR5TmFtZSk7Ci0JCQkvLyBmaWx0ZXIgYmFzZWQgb24gcGFydGlhbCBlbnRpdHkgc3RyaW5nLi4uCi0JCQlpZiAoZW50aXR5TmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoa2V5LnRvTG93ZXJDYXNlKCkpIHx8IGtleS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJewotCQkJCS8vIGZpZ3VyZSBvdXQgc2VsZWN0aW9uLi4uaWYgdGV4dCBpcyBzZWxlY3RlZCwgYWRkIGl0IHRvCi0JCQkJLy8gc2VsZWN0aW9uIGxlbmd0aAotCQkJCWludCBzZWxlY3Rpb25MZW5ndGggPSBub2RlT2Zmc2V0OwotCQkJCWlmIChmVGV4dFZpZXdlciAhPSBudWxsKSB7Ci0JCQkJCXNlbGVjdGlvbkxlbmd0aCArPSBmVGV4dFZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCkueTsKLQkJCQl9Ci0JCQkJLy8gY3JlYXRlIGEgbmV3IHByb3Bvc2FsIGZvciBlbnRpdHkgc3RyaW5nLi4uCi0JCQkJcmVwbGFjZW1lbnRUZXh0ID0gIiYiICsgZW50aXR5TmFtZSArICI7IjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIAotCQkJCWRpc3BsYXlTdHJpbmcgPSAiJiIgKyBlbnRpdHlOYW1lICsgIjsgKCIgKyBlbnRpdHlWYWx1ZSArICIpIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQlJQ29tcGxldGlvblByb3Bvc2FsIGNwID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChyZXBsYWNlbWVudFRleHQsIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pLCBzZWxlY3Rpb25MZW5ndGgsIHJlcGxhY2VtZW50VGV4dC5sZW5ndGgoKSwgZW50aXR5SWNvbiwgZGlzcGxheVN0cmluZywgbnVsbCwgbnVsbCwgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfRU5USVRZKTsKLQkJCQlpZiAoY3AgIT0gbnVsbCkgewotCQkJCQlwcm9wb3NhbHMuYWRkKGNwKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRQQ0RBVEFQcm9wb3NhbChTdHJpbmcgbm9kZU5hbWUsIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIjwhW0NEQVRBW11dPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIDksIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0RBVEFTRUNUSU9OKSwgIkNEQVRBIFNlY3Rpb24iLCAvLyROT04tTkxTLTEkCi0JCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NEQVRBKTsKLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCi0JCXByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChub2RlTmFtZSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIG5vZGVOYW1lLmxlbmd0aCgpLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVCksICIjUENEQVRBIiwgLy8kTk9OLU5MUy0xJAotCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DREFUQSk7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCU5vZGUgYU5vZGUgPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCWJvb2xlYW4geG1scGlGb3VuZCA9IGZhbHNlOwotCQlEb2N1bWVudCBvd25pbmdEb2N1bWVudCA9IGFOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJLy8gPT0+IC8vIGludCB4bWxwaU5vZGVQb3NpdGlvbiA9IC0xOwotCi0JCS8vIG1ha2Ugc3VyZSB4bWxwaSBpcyByb290IGVsZW1lbnQKLQkJLy8gZG9uJ3Qgd2FudCBkb2N0eXBlIHByb3Bvc2FsIGlmIFhNTFBJIGlzbid0IGZpcnN0IGVsZW1lbnQuLi4KLQkJTm9kZSBmaXJzdCA9IG93bmluZ0RvY3VtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJYm9vbGVhbiB4bWxwaUlzRmlyc3RFbGVtZW50ID0gKGZpcnN0ICE9IG51bGwgJiYgZmlyc3QuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSk7Ci0JCWJvb2xlYW4gaW5zZXJ0RG9jdHlwZSA9IHhtbHBpSXNGaXJzdEVsZW1lbnQ7Ci0KLQkJZm9yIChOb2RlIGNoaWxkID0gb3duaW5nRG9jdW1lbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWJvb2xlYW4geG1scGkgPSAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygieG1sIikpOyAvLyROT04tTkxTLTEkCi0JCQl4bWxwaUZvdW5kID0geG1scGlGb3VuZCB8fCB4bWxwaTsKLQkJCWlmICh4bWxwaUZvdW5kKSB7Ci0JCQkJaWYgKGNoaWxkIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCQkJLy8gPT0+IC8vIGludCB4bWxwaU5vZGVQb3NpdGlvbiA9Ci0JCQkJCS8vICgoWE1MTm9kZSljaGlsZCkuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJfQotCQkJCS8vIHNraXAgd2hpdGUgc3BhY2UgYW5kIHRleHQKLQkJCQl3aGlsZSAoKGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgIT0gbnVsbCAmJiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkpIHsKLQkJCQkJLy8ganVzdCBza2lwcGluZwotCQkJCX0KLQkJCQkvLyBjaGVjayBpZiB0aGVyZXMgYSBub2RlIGluYmV0d2VlbiBYTUxQSSBhbmQgY3Vyc29yIHBvc2l0aW9uCi0JCQkJaWYgKGNoaWxkICE9IG51bGwgJiYgY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCkgPj0gKChJRE9NTm9kZSkgY2hpbGQpLmdldEVuZE9mZnNldCgpIHx8ICF4bWxwaUlzRmlyc3RFbGVtZW50KSB7Ci0JCQkJCQlpbnNlcnREb2N0eXBlID0gZmFsc2U7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQotCQlpZiAoeG1scGlGb3VuZCAmJiBvd25pbmdEb2N1bWVudC5nZXREb2N0eXBlKCkgPT0gbnVsbCAmJiBpc0N1cnNvckFmdGVyWE1MUEkoY29udGVudEFzc2lzdFJlcXVlc3QpICYmIGluc2VydERvY3R5cGUpIHsKLQkJCWFkZERvY1R5cGVQcm9wb3NhbChjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBDbG9zZSBhbiB1bmNsb3NlZCBzdGFydCB0YWcKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdDbG9zZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQYXJlbnQoKTsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCi0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKG5vZGUpOwotCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IChlbGVtZW50RGVjbCAhPSBudWxsKSA/IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVsZW1lbnREZWNsKSA6IG51bGw7Ci0JCQlpbnQgY29udGVudFR5cGUgPSAoZWxlbWVudERlY2wgIT0gbnVsbCkgPyBlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpIDogQ01FbGVtZW50RGVjbGFyYXRpb24uQU5ZOwotCQkJLy8gaWYgaXQncyBYTUwgYW5kIGNvbnRlbnQgZG9lc24ndCBIQVZFIHRvIGJlIGVsZW1lbnQsIGFkZCAiLz4iCi0JCQkvLyBwcm9wb3NhbC4KLQkJCWJvb2xlYW4gZW5kV2l0aFNsYXNoQnJhY2tldCA9IChnZXRYTUwobm9kZSkgJiYgY29udGVudFR5cGUgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRUxFTUVOVCk7Ci0KLQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWxlbWVudERlY2wpOwotCQkJaWYgKGltYWdlID09IG51bGwpIHsKLQkJCQlpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotCQkJfQotCi0JCQkvLyBpcyB0aGUgc3RhcnQgdGFnIGVuZGVkIHByb3Blcmx5PwotCQkJaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldERvY3VtZW50UmVnaW9uKCkgPT0gbm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICYmICEobm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKS5pc0VuZGVkKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJLy8gSXMgdGhpcyBzdXBwb3NlZCB0byBiZSBhbiBlbXB0eSB0YWc/IE5vdGUgdGhhdCBpZiB3ZSBjYW4ndAotCQkJCS8vIHRlbGwsIHdlIGFzc3VtZSBpdCdzIG5vdC4KLQkJCQlpZiAoZWxlbWVudERlY2wgIT0gbnVsbCAmJiBlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKSB7Ci0JCQkJCS8vIHByb21wdCB3aXRoIGEgc2VsZi1jbG9zaW5nIGVuZCBjaGFyYWN0ZXIgaWYgbmVlZGVkCi0JCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFN0YXJ0VGFnQ2xvc2Uobm9kZSwgZWxlbWVudERlY2wpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0byBpZ25vcmUgdGhlIGxlbmd0aCAtLQotCQkJCQkJCQkvLyBhbHdheXMgaW5zZXJ0Ci0JCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJCTAsIGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRTdGFydFRhZ0Nsb3NlKG5vZGUsIGVsZW1lbnREZWNsKS5sZW5ndGgoKSwgaW1hZ2UsIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fXywgKG5ldyBPYmplY3RbXXtnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCl9KSksCi0JCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0xPU0VfVEFHKTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCX0KLQkJCQllbHNlIHsKLQkJCQkJLy8gcHJvbXB0IHdpdGggYSBjbG9zZSBmb3IgdGhlIHN0YXJ0IHRhZwotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0byBpZ25vcmUgdGhlCi0JCQkJCQkJCS8vIGxlbmd0aCAtLSBhbHdheXMgaW5zZXJ0Ci0JCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJCTAsIDEsIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfXywgKG5ldyBPYmplY3RbXXsiICc+JyJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJbnVsbCwgcHJvcG9zZWRJbmZvLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9DTE9TRV9UQUcpOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0KLQkJCQkJLy8gcHJvbXB0IHdpdGggdGhlIGNsb3NlciBmb3IgdGhlIHN0YXJ0IHRhZyBhbmQgYW4gZW5kIHRhZwotCQkJCQkvLyBpZiBvbmUgaXMgbm90IHByZXNlbnQKLQkJCQkJaWYgKG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgPT0gbnVsbCkgewotCQkJCQkJLy8gbWFrZSBzdXJlIHRhZyBuYW1lIGlzIGFjdHVhbGx5IHdoYXQgaXQgdGhpbmtzIGl0Ci0JCQkJCQkvLyBpcy4uLihlZy4gPCVAIHZzLiA8anNwOmRpcmVjdGl2ZSkKLQkJCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RyID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0RG9jdW1lbnRSZWdpb24oKTsKLQkJCQkJCVN0cmluZyBvcGVuaW5nVGFnVGV4dCA9IChzZHIgIT0gbnVsbCkgPyBzZHIuZ2V0RnVsbFRleHQoKSA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJCQlpZiAob3BlbmluZ1RhZ1RleHQgIT0gbnVsbCAmJiBvcGVuaW5nVGFnVGV4dC5pbmRleE9mKG5vZGUuZ2V0Tm9kZU5hbWUoKSkgIT0gLTEpIHsKLQkJCQkJCQlwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwoIj48LyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiPiIsIC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksCi0JCQkJCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0bwotCQkJCQkJCQkJCS8vIGlnbm9yZSB0aGUgbGVuZ3RoIC0tIGFsd2F5cyBpbnNlcnQKLQkJCQkJCQkJCQkvLyBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLAotCQkJCQkJCQkJCTAsIDEsIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfX19fLCAobmV3IE9iamVjdFtde25vZGUuZ2V0Tm9kZU5hbWUoKX0pKSwKLQkJCQkJCQkJCQludWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0NMT1NFX1RBRyk7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCS8vIHByb21wdCB3aXRoIHNsYXNoIGJyYWNrZXQgIi8+IiBpbmNhc2UgaWYgaXQncyBhIHNlbGYKLQkJCQkJLy8gZW5kaW5nIHRhZwotCQkJCQlpZiAoZW5kV2l0aFNsYXNoQnJhY2tldCkgewotCQkJCQkJcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKCIvPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLAotCQkJCQkJCQkJLy8gdGhpcyBpcyBvbmUgb2YgdGhlIGZldyB0aW1lcyB0byBpZ25vcmUKLQkJCQkJCQkJCS8vIHRoZSBsZW5ndGggLS0gYWx3YXlzIGluc2VydAotCQkJCQkJCQkJLy8gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwKLQkJCQkJCQkJCTAsIDIsIGltYWdlLCBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkNsb3NlX3dpdGhfXywgKG5ldyBPYmplY3RbXXsiIFwiLz5cIiJ9KSksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0xPU0VfVEFHICsgMSk7IC8vICsxCi0JCQkJCQkvLyB0bwotCQkJCQkJLy8gYnJpbmcKLQkJCQkJCS8vIHRvCi0JCQkJCQkvLyB0b3AKLQkJCQkJCS8vIG9mCi0JCQkJCQkvLyBsaXN0Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIGlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXREb2N1bWVudFJlZ2lvbigpID09IG5vZGUuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICYmICFub2RlLmdldExhc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpIHsKLQkJCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQkJLy8gcHJvbXB0IHdpdGggYSBjbG9zaW5nIGVuZCBjaGFyYWN0ZXIgZm9yIHRoZSBlbmQgdGFnCi0JCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCgiPiIsIC8vJE5PTi1OTFMtMSQKLQkJCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwKLQkJCQkJCQkvLyB0aGlzIGlzIG9uZSBvZiB0aGUgZmV3IHRpbWVzIHRvIGlnbm9yZSB0aGUKLQkJCQkJCQkvLyBsZW5ndGggLS0gYWx3YXlzIGluc2VydAotCQkJCQkJCS8vIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksCi0JCQkJCQkJMCwgMSwgaW1hZ2UsIE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuQ2xvc2Vfd2l0aF9fLCAobmV3IE9iamVjdFtdeyIgJz4nIn0pKSwgLy8kTk9OLU5MUy0xJAotCQkJCQkJCW51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfQ0xPU0VfVEFHKTsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJc2V0RXJyb3JNZXNzYWdlKFVOS05PV05fQ09OVEVYVCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QsIGludCBjaGlsZFBvc2l0aW9uKSB7Ci0JCUxpc3QgY21ub2RlcyA9IG51bGw7Ci0JCU5vZGUgcGFyZW50ID0gY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UGFyZW50KCk7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0KLQkJLy8gKG5zZCkgVGhpcyBpcyBvbmx5IHZhbGlkIGF0IHRoZSBkb2N1bWVudCBlbGVtZW50IGxldmVsCi0JCS8vIG9ubHkgdmFsaWQgaWYgaXQncyBYTUwgKGNoZWNrIGFkZGVkIDIvMTcvMjAwNCkKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSAmJiAoKElET01Eb2N1bWVudCkgcGFyZW50KS5pc1hNTFR5cGUoKSAmJiAhaXNDdXJzb3JBZnRlclhNTFBJKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSkgewotCQkJcmV0dXJuOwotCQl9Ci0JCS8vIG9ubHkgd2FudCBwcm9wb3NhbHMgaWYgY3Vyc29yIGlzIGFmdGVyIGRvY3R5cGUuLi4KLQkJaWYgKCFpc0N1cnNvckFmdGVyRG9jdHlwZShjb250ZW50QXNzaXN0UmVxdWVzdCkpCi0JCQlyZXR1cm47Ci0JCQotCQkvLyBmaXggZm9yIG1ldGEtaW5mbyBjb21tZW50IG5vZGVzLi4gdGhleSBjdXJyZW50bHkgImhpZGUiIG90aGVyCi0JCS8vIHByb3Bvc2FscyBiZWNhdXNlIHRoZSBkb24ndAotCQkvLyBoYXZlIGEgY29udGVudCBtb2RlbCAoc28gY2FuJ3QgcHJvcG9zZSBhbnkgY2hpbGRyZW4uLikKLQkJaWYgKHBhcmVudCAhPSBudWxsICYmIHBhcmVudCBpbnN0YW5jZW9mIElET01Ob2RlICYmIGlzQ29tbWVudE5vZGUoKElET01Ob2RlKSBwYXJlbnQpKSB7Ci0JCQkvLyBsb29wIGFuZCBmaW5kIG5vbiBjb21tZW50IG5vZGU/Ci0JCQl3aGlsZSAocGFyZW50ICE9IG51bGwgJiYgaXNDb21tZW50Tm9kZSgoSURPTU5vZGUpIHBhcmVudCkpIHsKLQkJCQlwYXJlbnQgPSBwYXJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBwYXJlbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KTsKLQkJCWlmIChwYXJlbnREZWNsICE9IG51bGwpIHsKLQkJCQkvLyBYU0Qtc3BlY2lmaWMgYWJpbGl0eSAtIG5vIGZpbHRlcmluZwotCQkJCUNNRGF0YVR5cGUgY2hpbGRUeXBlID0gcGFyZW50RGVjbC5nZXREYXRhVHlwZSgpOwotCQkJCWlmIChjaGlsZFR5cGUgIT0gbnVsbCkgewotCQkJCQlTdHJpbmdbXSBjaGlsZFN0cmluZ3MgPSBjaGlsZFR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJCQlpZiAoY2hpbGRTdHJpbmdzICE9IG51bGwpIHsKLQkJCQkJCS8vIHRoZSBjb250ZW50IHN0cmluZyBpcyB0aGUgc29sZSB2YWxpZCBjaGlsZC4uLnNvCi0JCQkJCQkvLyByZXBsYWNlIHRoZSByZXN0Ci0JCQkJCQlpbnQgYmVnaW4gPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKTsKLQkJCQkJCWludCBsZW5ndGggPSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpOwotCQkJCQkJaWYgKHBhcmVudCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCQkJaWYgKCgoSURPTU5vZGUpIHBhcmVudCkuZ2V0TGFzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9ICgoSURPTU5vZGUpIHBhcmVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSkgewotCQkJCQkJCQliZWdpbiA9ICgoSURPTU5vZGUpIHBhcmVudCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQkJbGVuZ3RoID0gKChJRE9NTm9kZSkgcGFyZW50KS5nZXRMYXN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKSAtIGJlZ2luOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhwYXJlbnREZWNsLCBjaGlsZFR5cGUpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgdGV4dFByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChjaGlsZFN0cmluZ3NbaV0sIGJlZ2luLCBsZW5ndGgsIGNoaWxkU3RyaW5nc1tpXS5sZW5ndGgoKSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlVNKSwgY2hpbGRTdHJpbmdzW2ldLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19JTlNFUlRJT04pOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHRleHRQcm9wb3NhbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAocGFyZW50RGVjbCAhPSBudWxsICYmIHBhcmVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5QQ0RBVEEpIHsKLQkJCQlhZGRQQ0RBVEFQcm9wb3NhbChwYXJlbnREZWNsLmdldE5vZGVOYW1lKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIHJldHJpZXZlIHRoZSBsaXN0IG9mIGFsbCBwb3NzaWJsZSBjaGlsZHJlbiB3aXRoaW4gdGhpcyBwYXJlbnQgY29udGV4dAotCQkJCWNtbm9kZXMgPSBnZXRBdmFpbGFibGVDaGlsZEVsZW1lbnREZWNsYXJhdGlvbnMoKEVsZW1lbnQpcGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5QWN0aW9uLklOU0VSVCk7Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgdGhlIHBvc3NpYmxlIGNoaWxkcmVuIHdpdGhpbiB0aGlzIHBhcmVudCBjb250ZXh0IGFuZCBhdCB0aGlzIGluZGV4Ci0gICAgICAgICAgICAgICAgTGlzdCBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfU1RSSUNULmVxdWFscyhYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZKSkpIAotICAgICAgICAgICAgICAgIHsgCi0gICAgICAgICAgICAgICAgICBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyA9IGdldFZhbGlkQ2hpbGRFbGVtZW50RGVjbGFyYXRpb25zKChFbGVtZW50KXBhcmVudCwgY2hpbGRQb3NpdGlvbiwgTW9kZWxRdWVyeUFjdGlvbi5JTlNFUlQpOyAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICB9Ci0gCQkJCUl0ZXJhdG9yIG5vZGVJdGVyYXRvciA9IGNtbm9kZXMuaXRlcmF0b3IoKTsKLQkJCQlpZiAoIW5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQkJaWYgKGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCkgIT0gbnVsbCkKLQkJCQkJCWVycm9yID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5fSGFzX25vX2F2YWlsYWJsZV9jaGlsZCwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKTsKLQkJCQkJZWxzZQotCQkJCQkJZXJyb3IgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVsZW1lbnRfX2lzX3Vua25vd24sIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCl9KSk7Ci0JCQkJfQotCQkJCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0JCQkJLy8gY2hvcCBvZmYgYW55IGxlYWRpbmcgPCdzIGFuZCB3aGl0ZXNwYWNlIGZyb20gdGhlCi0JCQkJLy8gbWF0Y2hzdHJpbmcKLQkJCQl3aGlsZSAoKG1hdGNoU3RyaW5nLmxlbmd0aCgpID4gMCkgJiYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UobWF0Y2hTdHJpbmcuY2hhckF0KDApKSB8fCBiZWdpbnNXaXRoKG1hdGNoU3RyaW5nLCAiPCIpKSkgLy8kTk9OLU5MUy0xJAotCQkJCQkvLyROT04tTkxTLTEkCi0JCQkJCW1hdGNoU3RyaW5nID0gbWF0Y2hTdHJpbmcuc3Vic3RyaW5nKDEpOwotCQkJCXdoaWxlIChub2RlSXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0JCQkJCU9iamVjdCBvID0gbm9kZUl0ZXJhdG9yLm5leHQoKTsKLQkJCQkJaWYgKG8gaW5zdGFuY2VvZiBDTUVsZW1lbnREZWNsYXJhdGlvbikgewotCQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIG87Ci0JCQkJCQkvLyBvbmx5IGFkZCBwcm9wb3NhbHMgZm9yIHRoZSBjaGlsZCBlbGVtZW50J3MgdGhhdAotCQkJCQkJLy8gYmVnaW4gd2l0aCB0aGUgbWF0Y2hzdHJpbmcKLQkJCQkJCVN0cmluZyB0YWduYW1lID0gZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPSBzdHJpY3RDTU5vZGVTdWdnZXN0aW9ucyAhPSBudWxsID8gc3RyaWN0Q01Ob2RlU3VnZ2VzdGlvbnMuY29udGFpbnMoZWxlbWVudERlY2wpIDogZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIEltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWxlbWVudERlY2wpOwotICAKLQkJCQkJCWlmIChpbWFnZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmljdENNTm9kZVN1Z2dlc3Rpb25zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2UgPSBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJCSAgICAgICAgICAgIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUNfRU1QSEFTSVpFRCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUNfREVFTVBIQVNJWkVEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVEFHX0dFTkVSSUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotCQkJCQkJfQotCi0JCQkJCQkvL2ludCBtYXJrdXBBZGp1c3RtZW50ID0gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQkJCQkJCWlmIChiZWdpbnNXaXRoKHRhZ25hbWUsIG1hdGNoU3RyaW5nKSkgewotCQkJCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZFRleHQocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQkJCi0JCQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5ODExCi0JCQkJCQkJLy8gcGxhY2UgY3Vyc29yIGluIGZpcnN0IGVtcHR5IHF1b3RlcwotCQkJCQkJCWludCBtYXJrdXBBZGp1c3RtZW50ID0gZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQocHJvcG9zZWRUZXh0KTsKLQkJCQkJCQkKLQkJCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8ocGFyZW50RGVjbCwgZWxlbWVudERlY2wpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWxldmFuY2UgPSBpc1N0cmljdENNTm9kZVN1Z2dlc3Rpb24gPyBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9TVFJJQ1RMWV9WQUxJRF9UQUdfSU5TRVJUSU9OIDogWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX0lOU0VSVElPTjsgCi0JCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBtYXJrdXBBZGp1c3RtZW50LCBpbWFnZSwgdGFnbmFtZSwgbnVsbCwgcHJvcG9zZWRJbmZvLCByZWxldmFuY2UpOwotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQlpZiAoY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UHJvcG9zYWxzKCkuc2l6ZSgpID09IDApIHsKLQkJCQkJaWYgKGVycm9yICE9IG51bGwpCi0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCQllbHNlIGlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpICE9IG51bGwgJiYgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0TWF0Y2hTdHJpbmcoKS5sZW5ndGgoKSA+IDApCi0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19rbm93bl9jaGlsZF90YWcsIChuZXcgT2JqZWN0W117cGFyZW50LmdldE5vZGVOYW1lKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCl9KSkpOwotCQkJCQkvLyROT04tTkxTLTEkID0gIk5vIGtub3duIGNoaWxkIHRhZyBuYW1lcyBvZiA8ezB9PiBiZWdpbiB3aXRoIFwiezF9XCIuIgotCQkJCQllbHNlCi0JCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5fX0hhc19ub19rbm93bl9jaGlsZCwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgaWYgKHBhcmVudC5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJLy8gQ2FuIG9ubHkgcHJvbXB0IHdpdGggZWxlbWVudHMgaWYgdGhlIGN1cnNvciBwb3NpdGlvbiBpcyBwYXN0Ci0JCQkvLyB0aGUgWE1MIHByb2Nlc3NpbmcKLQkJCS8vIGluc3RydWN0aW9uIGFuZCBET0NUWVBFIGRlY2xhcmF0aW9uCi0JCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJCWJvb2xlYW4gZG9jdHlwZUZvdW5kID0gZmFsc2U7Ci0JCQlpbnQgbWluaW11bU9mZnNldCA9IC0xOwotCi0JCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQotCQkJCWJvb2xlYW4geG1scGkgPSAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSAmJiBjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFscygieG1sIikpOyAvLyROT04tTkxTLTEkCi0JCQkJYm9vbGVhbiBkb2N0eXBlID0gY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX1RZUEVfTk9ERTsKLQkJCQlpZiAoeG1scGkgfHwgZG9jdHlwZSAmJiBtaW5pbXVtT2Zmc2V0IDwgMCkKLQkJCQkJbWluaW11bU9mZnNldCA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgKyAoKElET01Ob2RlKSBjaGlsZCkuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJeG1scGlGb3VuZCA9IHhtbHBpRm91bmQgfHwgeG1scGk7Ci0JCQkJZG9jdHlwZUZvdW5kID0gZG9jdHlwZUZvdW5kIHx8IGRvY3R5cGU7Ci0JCQl9Ci0KLQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSBtaW5pbXVtT2Zmc2V0KSB7Ci0JCQkJTGlzdCBjaGlsZERlY2xzID0gZ2V0QXZhaWxhYmxlUm9vdENoaWxkcmVuKChEb2N1bWVudCkgcGFyZW50LCBjaGlsZFBvc2l0aW9uKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkRGVjbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNoaWxkRGVjbHMuZ2V0KGkpOwotCQkJCQlpZiAoZWQgIT0gbnVsbCkgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlZCk7Ci0JCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gZ2V0UmVxdWlyZWRUZXh0KHBhcmVudCwgZWQpOwotCQkJCQkJU3RyaW5nIHRhZ25hbWUgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlZCk7Ci0JCQkJCQkvLyBhY2NvdW50IGZvciB0aGUgJmx0OyBhbmQgJmd0OwotCQkJCQkJaW50IG1hcmt1cEFkanVzdG1lbnQgPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0TWluaW1hbFN0YXJ0VGFnTGVuZ3RoKHBhcmVudCwgZWQpOwotCQkJCQkJU3RyaW5nIHByb3Bvc2VkSW5mbyA9IGdldEFkZGl0aW9uYWxJbmZvKG51bGwsIGVkKTsKLQkJCQkJCUN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbCBwcm9wb3NhbCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0LCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSwgbWFya3VwQWRqdXN0bWVudCwgaW1hZ2UsIHRhZ25hbWUsIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX0lOU0VSVElPTik7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRUYWdOYW1lUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlMaXN0IGNtbm9kZXMgPSBudWxsOwotCQlOb2RlIHBhcmVudCA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFBhcmVudCgpOwotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXROb2RlKCk7Ci0JCVN0cmluZyBlcnJvciA9IG51bGw7Ci0JCVN0cmluZyBtYXRjaFN0cmluZyA9IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCk7Ci0JCWlmIChwYXJlbnQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgY2hpbGRyZW4KLQkJCS8vdmFsaWRBY3Rpb25zID0gZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KChFbGVtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24pOwotCQkJY21ub2RlcyA9IGdldEF2YWlsYWJsZUNoaWxkRWxlbWVudERlY2xhcmF0aW9ucygoRWxlbWVudClwYXJlbnQsIGNoaWxkUG9zaXRpb24sIE1vZGVsUXVlcnlBY3Rpb24uSU5TRVJUKTsKLQkJCUl0ZXJhdG9yIG5vZGVJdGVyYXRvciA9IGNtbm9kZXMuaXRlcmF0b3IoKTsKLQkJCS8vIGNob3Agb2ZmIGFueSBsZWFkaW5nIDwncyBhbmQgd2hpdGVzcGFjZSBmcm9tIHRoZSBtYXRjaHN0cmluZwotCQkJd2hpbGUgKChtYXRjaFN0cmluZy5sZW5ndGgoKSA+IDApICYmIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKG1hdGNoU3RyaW5nLmNoYXJBdCgwKSkgfHwgYmVnaW5zV2l0aChtYXRjaFN0cmluZywgIjwiKSkpIC8vJE5PTi1OTFMtMSQKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJbWF0Y2hTdHJpbmcgPSBtYXRjaFN0cmluZy5zdWJzdHJpbmcoMSk7Ci0JCQlpZiAoIW5vZGVJdGVyYXRvci5oYXNOZXh0KCkpCi0JCQkJZXJyb3IgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLl9fSGFzX25vX2tub3duX2NoaWxkLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpfSkpOwotCQkJd2hpbGUgKG5vZGVJdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCQlDTU5vZGUgZWxlbWVudERlY2wgPSAoQ01Ob2RlKSBub2RlSXRlcmF0b3IubmV4dCgpOwotCQkJCWlmIChlbGVtZW50RGVjbCAhPSBudWxsKSB7Ci0JCQkJCS8vIG9ubHkgYWRkIHByb3Bvc2FscyBmb3IgdGhlIGNoaWxkIGVsZW1lbnQncyB0aGF0IGJlZ2luCi0JCQkJCS8vIHdpdGggdGhlIG1hdGNoc3RyaW5nCi0JCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBudWxsOwotCQkJCQlpbnQgY3Vyc29yQWRqdXN0bWVudCA9IDA7Ci0KLQkJCQkJLy8gZG8gYSBjaGVjayB0byBzZWUgaWYgcGFydGlhbCBhdHRyaWJ1dGVzIG9mIHBhcnRpYWwgdGFnCi0JCQkJCS8vIG5hbWVzIGFyZSBpbiBsaXN0Ci0JCQkJCWlmICgobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0QXR0cmlidXRlcygpICE9IG51bGwgJiYgbm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TGVuZ3RoKCkgPiAwICYmIGF0dHJpYnV0ZUluTGlzdChub2RlLCBwYXJlbnQsIGVsZW1lbnREZWNsKSkgfHwgKChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpICYmIG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpKSB7Ci0KLQkJCQkJCXByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQkJCQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlwcm9wb3NlZFRleHQgPSBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlbGVtZW50RGVjbCk7Ci0JCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpOwotCQkJCQkJaWYgKGVsZW1lbnREZWNsIGluc3RhbmNlb2YgQ01FbGVtZW50RGVjbGFyYXRpb24pIHsKLQkJCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWxlbWVudERlY2w7Ci0JCQkJCQkJaWYgKGVkLmdldENvbnRlbnRUeXBlKCkgPT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpIHsKLQkJCQkJCQkJcHJvcG9zZWRUZXh0ICs9IGdldENvbnRlbnRHZW5lcmF0b3IoKS5nZXRTdGFydFRhZ0Nsb3NlKHBhcmVudCwgZWQpOwotCQkJCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpOwotCQkJCQkJCX0KLQkJCQkJCQllbHNlIHsKLQkJCQkJCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg5ODExCi0JCQkJCQkJCVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJCQkJCQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlVGFnKHBhcmVudCwgZWQsIHNiKTsKLQkJCQkJCQkJLy8gc2luY2UgaXQncyBhIG5hbWUgcHJvcG9zYWwsIGFzc3VtZSAnPCcgaXMgYWxyZWFkeSB0aGVyZQotCQkJCQkJCQkvLyBvbmx5IHJldHVybiB0aGUgcmVzdCBvZiB0aGUgdGFnCi0JCQkJCQkJCXByb3Bvc2VkVGV4dCA9IHNiLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDEpOwotCQkJCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gZ2V0Q3Vyc29yUG9zaXRpb25Gb3JQcm9wb3NlZFRleHQocHJvcG9zZWRUZXh0KTsKLQkJCQkJCQkJCi0JCQkJCQkJCS8vY3Vyc29yQWRqdXN0bWVudCA9IHByb3Bvc2VkVGV4dC5sZW5ndGgoKSArIDE7Ci0JCQkJCQkJCS8vcHJvcG9zZWRUZXh0ICs9ICI+PC8iICsgZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpICsgIj4iOyAvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoYmVnaW5zV2l0aChwcm9wb3NlZFRleHQsIG1hdGNoU3RyaW5nKSkgewotCQkJCQkJSW1hZ2UgaW1hZ2UgPSBDTUltYWdlVXRpbC5nZXRJbWFnZShlbGVtZW50RGVjbCk7Ci0JCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJCWltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQyk7Ci0JCQkJCQl9Ci0JCQkJCQlTdHJpbmcgcHJvcG9zZWRJbmZvID0gZ2V0QWRkaXRpb25hbEluZm8oZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24ocGFyZW50KSwgZWxlbWVudERlY2wpOwotCQkJCQkJQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsIHByb3Bvc2FsID0gbmV3IEN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbChwcm9wb3NlZFRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRSZXBsYWNlbWVudExlbmd0aCgpLCBjdXJzb3JBZGp1c3RtZW50LCBpbWFnZSwgZ2V0UmVxdWlyZWROYW1lKHBhcmVudCwgZWxlbWVudERlY2wpLCBudWxsLCBwcm9wb3NlZEluZm8sIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1RBR19OQU1FKTsKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2FsKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQcm9wb3NhbHMoKS5zaXplKCkgPT0gMCkgewotCQkJCWlmIChlcnJvciAhPSBudWxsKQotCQkJCQlzZXRFcnJvck1lc3NhZ2UoZXJyb3IpOwotCQkJCWVsc2UgaWYgKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldE1hdGNoU3RyaW5nKCkgIT0gbnVsbCAmJiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpLmxlbmd0aCgpID4gMCkKLQkJCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuTm9fa25vd25fY2hpbGRfdGFnX25hbWVzLCAobmV3IE9iamVjdFtde3BhcmVudC5nZXROb2RlTmFtZSgpLCBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRNYXRjaFN0cmluZygpfSkpKTsKLQkJCQkvLyROT04tTkxTLTEkID0gIk5vIGtub3duIGNoaWxkIHRhZyBuYW1lcyBvZiA8ezB9PiBiZWdpbiB3aXRoIFwiezF9XCIiCi0JCQkJZWxzZQotCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5fX0hhc19ub19rbm93bl9jaGlsZCwgKG5ldyBPYmplY3RbXXtwYXJlbnQuZ2V0Tm9kZU5hbWUoKX0pKSk7Ci0JCQl9Ci0JCX0KLQkJZWxzZSBpZiAocGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlMaXN0IGNoaWxkRWxlbWVudHMgPSBnZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oKERvY3VtZW50KSBwYXJlbnQsIGNoaWxkUG9zaXRpb24pOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZEVsZW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01Ob2RlIGVkID0gKENNTm9kZSkgY2hpbGRFbGVtZW50cy5nZXQoaSk7Ci0JCQkJaWYgKGVkID09IG51bGwpCi0JCQkJCWNvbnRpbnVlOwotCQkJCVN0cmluZyBwcm9wb3NlZFRleHQgPSBudWxsOwotCQkJCWludCBjdXJzb3JBZGp1c3RtZW50ID0gMDsKLQkJCQlpZihlZCBpbnN0YW5jZW9mIENNRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCS8vIHByb3Bvc2VkVGV4dCA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVkKTsKLQkJCQkJU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQkJCQlnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2VuZXJhdGVUYWcocGFyZW50LCAoQ01FbGVtZW50RGVjbGFyYXRpb24pZWQsIHNiKTsKLQkJCQkJLy8gdGFnIHN0YXJ0cyB3LyAnPCcsIGJ1dCB3ZSB3YW50IHRvIGNvbXBhcmUgdG8gbmFtZQotCQkJCQlwcm9wb3NlZFRleHQgPSBzYi50b1N0cmluZygpLnN1YnN0cmluZygxKTsKLQkJCQkJCi0JCQkJCWlmICghYmVnaW5zV2l0aChwcm9wb3NlZFRleHQsIG1hdGNoU3RyaW5nKSkKLQkJCQkJCWNvbnRpbnVlOwotCQkJCQkKLQkJCQkJY3Vyc29yQWRqdXN0bWVudCA9IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KHByb3Bvc2VkVGV4dCk7Ci0JCQkJCi0JCQkJCWlmIChlZCBpbnN0YW5jZW9mIENNRWxlbWVudERlY2xhcmF0aW9uKSB7Ci0JCQkJCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbikgZWQ7Ci0JCQkJCQlpZiAoZWxlbWVudERlY2wuZ2V0Q29udGVudFR5cGUoKSA9PSBDTUVsZW1lbnREZWNsYXJhdGlvbi5FTVBUWSkgewotCQkJCQkJCXByb3Bvc2VkVGV4dCArPSBnZXRDb250ZW50R2VuZXJhdG9yKCkuZ2V0U3RhcnRUYWdDbG9zZShwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQkJCQkJCQljdXJzb3JBZGp1c3RtZW50ID0gcHJvcG9zZWRUZXh0Lmxlbmd0aCgpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCi0JCQkJCVN0cmluZyBwcm9wb3NlZEluZm8gPSBnZXRBZGRpdGlvbmFsSW5mbyhudWxsLCBlZCk7Ci0JCQkJCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoZWQpOwotCQkJCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCQkJaW1hZ2UgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19HRU5FUklDKTsKLQkJCQkJfQotCQkJCQlDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIGN1cnNvckFkanVzdG1lbnQsIGltYWdlLCBnZXRSZXF1aXJlZE5hbWUocGFyZW50LCBlZCksIG51bGwsIHByb3Bvc2VkSW5mbywgWE1MUmVsZXZhbmNlQ29uc3RhbnRzLlJfVEFHX05BTUUpOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5hZGRQcm9wb3NhbChwcm9wb3NhbCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCS8qKgotCSAqIHRoaXMgaXMgdGhlIHBvc2l0aW9uIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGluIGFmdGVyIHRoZSBwcm9wb3NhbCBpcyBhcHBsaWVkCi0JICogQHBhcmFtIHByb3Bvc2VkVGV4dAotCSAqIEByZXR1cm4gIHRoZSBwb3NpdGlvbiB0aGUgY3Vyc29yIHNob3VsZCBiZSBpbiBhZnRlciB0aGUgcHJvcG9zYWwgaXMgYXBwbGllZAotCSAqLwotCXByaXZhdGUgaW50IGdldEN1cnNvclBvc2l0aW9uRm9yUHJvcG9zZWRUZXh0KFN0cmluZyBwcm9wb3NlZFRleHQpIHsKLQkJaW50IGN1cnNvckFkanVzdG1lbnQ7Ci0JCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQuaW5kZXhPZigiXCJcIiIpICsgMTsgLy8kTk9OLU5MUy0xJAotCQkvLyBvdGhlcndpc2UsIGFmdGVyIHRoZSBmaXJzdCB0YWcKLQkJaWYoY3Vyc29yQWRqdXN0bWVudD09MCkKLQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQuaW5kZXhPZignPicpICsgMTsKLQkJaWYoY3Vyc29yQWRqdXN0bWVudD09MCkKLQkJCWN1cnNvckFkanVzdG1lbnQgPSBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKyAxOwotCQkKLQkJcmV0dXJuIGN1cnNvckFkanVzdG1lbnQ7Ci0JfQotCi0JLyoqCi0JICogQGRlcHJlY2F0ZWQgWE1MIHByb3Bvc2FsIGlzIGFkZGVkIHZpYSB4bWwgZGVjbGFyYXRpb24gdGVtcGxhdGUgaW5zdGVhZAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGFkZFhNTFByb3Bvc2FsKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCVN0cmluZyBwcm9wb3NlZFRleHQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiIiArIENvbnRlbnRUeXBlRW5jb2RpbmdQcmVmZXJlbmNlcy5nZXRVc2VyUHJlZmVycmVkQ2hhcnNldE5hbWUoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCkgKyAiXCI/PiI7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCUlDb21wbGV0aW9uUHJvcG9zYWwgcHJvcG9zYWwgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCwgY29udGVudEFzc2lzdFJlcXVlc3QuZ2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKCksIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50TGVuZ3RoKCksIHByb3Bvc2VkVGV4dC5sZW5ndGgoKSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pLCBwcm9wb3NlZFRleHQsIG51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX1hNTF9ERUNMQVJBVElPTik7Ci0JCS8vIFRPRE8gYWRkIHNwZWNpYWwgWE1MIHByb3Bvc2FsIGluZm8KLQkJY29udGVudEFzc2lzdFJlcXVlc3QuYWRkUHJvcG9zYWwocHJvcG9zYWwpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGRldGVybWluZXMgaWYgYW55IG9mIHRoZSBhdHRyaWJ1dGVzIGluIHRoZSBwcm9wb3NlZCBYTUxOb2RlCi0JICogbm9kZSwgYXJlIHBvc3NpYmxlIHZhbHVlcyBvZiBhdHRyaWJ1dGVzIGZyb20gcG9zc2libGUgRWxlbWVudHMgYXQgdGhpcwotCSAqIHBvaW50IGluIHRoZSBkb2N1bWVudCBhY2NvcmRpbmcgdG8gdGhlIENvbnRlbnQgTW9kZWwuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBlbGVtZW50IHdpdGggYXR0cmlidXRlcyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHRlc3QgaWYKLQkgKiAgICAgICAgICAgIGFyZSBwb3NzaWJsZSBmb3IgcG9zc2libGUgRWxlbWVudHMgYXQgdGhpcyBwb2ludAotCSAqIEBwYXJhbSBjbW5vZGUKLQkgKiAgICAgICAgICAgIHBvc3NpYmxlIGVsZW1lbnQgYXQgdGhpcyBwb2ludCBpbiB0aGUgZG9jdW1lbnQgKGRlcGVuZGluZyBvbgotCSAqICAgICAgICAgICAgd2hhdCAnbm9kZScgaXMpIHRydWUgaWYgYW55IGF0dHJpYnV0ZXMgb2YgJ25vZGUnIG1hdGNoIGFueQotCSAqICAgICAgICAgICAgcG9zc2libGUgYXR0cmlidXRlcyBmcm9tICdjbW5vZGVzJyBsaXN0LgotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGF0dHJpYnV0ZUluTGlzdChJRE9NTm9kZSBub2RlLCBOb2RlIHBhcmVudCwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAobm9kZSA9PSBudWxsIHx8IHBhcmVudCA9PSBudWxsIHx8IGNtbm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIGZhbHNlOwotCQlTdHJpbmcgZWxlbWVudE1hdGNoU3RyaW5nID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmcgY21ub2RlTmFtZSA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGNtbm9kZSk7Ly8gY21ub2RlLmdldE5vZGVOYW1lKCk7Ci0JCWlmIChub2RlIGluc3RhbmNlb2YgRWxlbWVudCkgewotCQkJTmFtZWROb2RlTWFwIG1hcCA9ICgoRWxlbWVudCkgbm9kZSkuZ2V0QXR0cmlidXRlcygpOwotCQkJU3RyaW5nIGF0dHJNYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlDTU5hbWVkTm9kZU1hcCBjbWF0dHJNYXAgPSBudWxsOwotCQkJLy8gaXRlcmF0ZSBhdHRyaWJ1dGUgcG9zc2liaWxpdGllcyBmb3IgcGFydGlhbGx5IHN0YXJ0ZWQgbm9kZQotCQkJZm9yIChpbnQgaSA9IDA7IG1hcCAhPSBudWxsICYmIGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJNYXRjaFN0cmluZyA9IG1hcC5pdGVtKGkpLmdldE5vZGVOYW1lKCk7Ci0JCQkJLy8gZmlsdGVyIG9uIHdoYXRldmVyIHVzZXIgdHlwZWQgZm9yIGVsZW1lbnQgbmFtZSBhbHJlYWR5Ci0JCQkJaWYgKGJlZ2luc1dpdGgoY21ub2RlTmFtZSwgZWxlbWVudE1hdGNoU3RyaW5nKSkgewotCQkJCQlpZiAoY21ub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkVMRU1FTlRfREVDTEFSQVRJT04pIHsKLQkJCQkJCWNtYXR0ck1hcCA9ICgoQ01FbGVtZW50RGVjbGFyYXRpb24pIGNtbm9kZSkuZ2V0QXR0cmlidXRlcygpOwotCQkJCQkJLy8gaXRlcmF0ZSBwb3NzaWJsZSBhdHRyaWJ1dGVzIGZyb20gYSBjbW5vZGUgaW4KLQkJCQkJCS8vIHByb3Bvc2FsIGxpc3QKLQkJCQkJCWZvciAoaW50IGsgPSAwOyBjbWF0dHJNYXAgIT0gbnVsbCAmJiBrIDwgY21hdHRyTWFwLmdldExlbmd0aCgpOyBrKyspIHsKLQkJCQkJCQkvLyBjaGVjayBpZiBuYW1lIG1hdGNoZXMKLQkJCQkJCQlpZiAoY21hdHRyTWFwLml0ZW0oaykuZ2V0Tm9kZU5hbWUoKS5lcXVhbHMoYXR0ck1hdGNoU3RyaW5nKSkgewotCQkJCQkJCQlyZXR1cm4gdHJ1ZTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXByb3RlY3RlZCBib29sZWFuIGJlZ2luc1dpdGgoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBwcmVmaXgpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCB8fCBwcmVmaXggPT0gbnVsbCkKLQkJCXJldHVybiB0cnVlOwotCQkvLyAocGEpIG1hdGNoaW5nIGluZGVwZW5kZW50IG9mIGNhc2UgdG8gYmUgY29uc2lzdGFudCB3aXRoIEphdmEKLQkJLy8gZWRpdG9yIENBCi0JCXJldHVybiBhU3RyaW5nLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChwcmVmaXgudG9Mb3dlckNhc2UoKSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVBdHRyaWJ1dGVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJLy8gc2V0dXAgdG8gaW5zZXJ0IG5ldyBhdHRyaWJ1dGVzCi0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIFNldHVwIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgYXR0cmlidXRlIG5hbWUKLQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRMZW5ndGgoMCk7Ci0JCWlmIChub2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCAmJiAoIW5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5pc0VuZGVkKCkpKSB7Ci0JCQlhZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPiBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpICYmIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgIT0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpKSB7Ci0JCQkvLyBzZXR1cCB0byBhZGQgYSBuZXcgYXR0cmlidXRlIGF0IHRoZSBkb2N1bWVudFBvc2l0aW9uCi0JCQlJRE9NTm9kZSBhY3R1YWxOb2RlID0gKElET01Ob2RlKSBub2RlLmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSk7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCWlmIChhY3R1YWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCAmJiAhYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSkgewotCQkJCWFkZFRhZ0Nsb3NlUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIHNldHVwIHRvIHJlcGxhY2UgdGhlIGV4aXN0aW5nIHZhbHVlCi0JCQlpZiAoIW5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmlzRW5kZWQoKSAmJiBkb2N1bWVudFBvc2l0aW9uIDwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpIHsKLQkJCQkvLyBpZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpc24ndCBjbG9zZWQgYW5kIHRoZQotCQkJCS8vIGN1cnNvciBpcyBpbiBmcm9udCBvZiB0aGUgdmFsdWUsIGFkZAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQkJCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gY29tcGxldGlvblJlZ2lvbi5nZXRUeXBlKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0KLQkJLy8gSGFuZGxlIHRoZSBtb3N0IGNvbW1vbiBhbmQgYmVzdCBzdXBwb3J0ZWQgY2FzZXMKLQkJaWYgKHhtbG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSB8fCB4bWxub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTikgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVUYWdOYW1lUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUF0dHJpYnV0ZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX0VRVUFMUykgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gY29tcHV0ZUVxdWFsc1Byb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFICYmIGRvY3VtZW50UG9zaXRpb24gPT0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldCgpICYmIChzZFJlZ2lvbi5nZXRUZXh0KGNvbXBsZXRpb25SZWdpb24pLmVuZHNXaXRoKCJcIiIpIHx8IHNkUmVnaW9uLmdldFRleHQoY29tcGxldGlvblJlZ2lvbikuZW5kc1dpdGgoIlwnIikpKSAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCXsKLQkJCQkvLyB0aGlzIGlzIGZvciB3aGVuIHRoZSBjdXJzb3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgY2xvc2luZwotCQkJCS8vIHF1b3RlIGZvciBhbiBhdHRyaWJ1dGUuLgotCQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIHhtbG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKTsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSB7Ci0JCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fCAocmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX0NMT1NFKSkpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVUYWdDbG9zZVByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgdHJlZU5vZGUsIHhtbG5vZGUpOwotCQkJfQotCQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVFbmRUYWdPcGVuUHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0JCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DSEFSX1JFRkVSRU5DRSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VOVElUWV9SRUZFUkVOQ0UgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVDb250ZW50UHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCQl9Ci0KLQkJCS8vIFRoZXNlIElUZXh0UmVnaW9uIHR5cGVzIGJlZ2luIERPTSBFbGVtZW50cyBhcyB3ZWxsIGFuZCBhbHRob3VnaAotCQkJLy8gaW50ZXJuYWxseSBoYXJkZXIgdG8gYXNzaXN0LAotCQkJLy8gdGV4dCBpbnNlcnRpb25zIGRpcmVjdGx5IGJlZm9yZSB0aGVtIGNhbiBiZSBtYWRlCi0JCQllbHNlIGlmIChkb2N1bWVudFBvc2l0aW9uID09IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICYmIChyZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DT01NRU5UX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9FWFBSRVNTSU9OX09QRU4pIHx8IHJlZ2lvblR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX1NDUklQVExFVF9PUEVOKSB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4gfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QSV9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikpIHsKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkodHJlZU5vZGUpKTsKLQkJCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCX0KLQkJfQotCQkvLyBOb3QgYSBEb2N1bWVudCBvciBFbGVtZW50PyAob2RkIGNhc2VzIGdvIGhlcmUgZm9yIG5vdykKLQkJZWxzZSBpZiAoaXNDbG9zZVJlZ2lvbihjb21wbGV0aW9uUmVnaW9uKSkgewotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdCh0cmVlTm9kZSwgeG1sbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCksIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0VGV4dEVuZE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSkKLQkJCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkodHJlZU5vZGUpICsgMSk7Ci0JCX0KLQkJZWxzZSBpZiAoZG9jdW1lbnRQb3NpdGlvbiA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSAmJiAocmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ09NTUVOVF9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ERUNMQVJBVElPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9ESVJFQ1RJVkVfT1BFTikgfHwgcmVnaW9uVHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRVhQUkVTU0lPTl9PUEVOKSB8fCByZWdpb25UeXBlLmVxdWFscyhET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9TQ1JJUFRMRVRfT1BFTikgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ERUNMQVJBVElPTl9PUEVOIHx8IHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfT1BFTiB8fCByZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NEQVRBX09QRU4pKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KHRyZWVOb2RlLCB4bWxub2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeSh0cmVlTm9kZSkpOwotCQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIENPTlRFTlQgQVNTSVNUIFNUQVJUUyBIRVJFCi0JICogCi0JICogUmV0dXJuIGEgbGlzdCBvZiBwcm9wb3NlZCBjb2RlIGNvbXBsZXRpb25zIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQKLQkgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGN1cnJlbnQgY3Vyc29yCi0JICogcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0LWVkaXRvciBjb250cm9sLgotCSAqIAotCSAqIEBwYXJhbSB0ZXh0Vmlld2VyCi0JICogQHBhcmFtIGRvY3VtZW50UG9zaXRpb24gLQotCSAqICAgICAgICAgICAgdGhlIGN1cnNvciBsb2NhdGlvbiB3aXRoaW4gdGhlIGRvY3VtZW50Ci0JICogCi0JICogYW4gYXJyYXkgb2YgSUNvbXBsZXRpb25Qcm9wb3NhbHMKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0KLQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCi0JCWZUZXh0Vmlld2VyID0gdGV4dFZpZXdlcjsKLQotCQlJbmRleGVkUmVnaW9uIHRyZWVOb2RlID0gQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlOb2RlIG5vZGUgPSAoTm9kZSkgdHJlZU5vZGU7Ci0JCXdoaWxlIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIG5vZGUuZ2V0UGFyZW50Tm9kZSgpICE9IG51bGwpCi0JCQlub2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCUlET01Ob2RlIHhtbG5vZGUgPSAoSURPTU5vZGUpIG5vZGU7Ci0KLQkJQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QgPSBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBnZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24gPSBnZXRDb21wbGV0aW9uUmVnaW9uKGRvY3VtZW50UG9zaXRpb24sIG5vZGUpOwotCi0JCVN0cmluZyBtYXRjaFN0cmluZyA9IGdldE1hdGNoU3RyaW5nKHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uKTsKLQotCQkvLyBIYW5kbGUgZW1wdHkgRG9jdW1lbnRzCi0JCWlmIChjb21wbGV0aW9uUmVnaW9uID09IG51bGwpIHsKLQkJCWlmICgoKHRyZWVOb2RlID09IG51bGwpIHx8ICgoTm9kZSkgdHJlZU5vZGUpLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSAmJiBjb21wbGV0aW9uUmVnaW9uID09IG51bGwgJiYgKHhtbG5vZGUgPT0gbnVsbCB8fCB4bWxub2RlLmdldENoaWxkTm9kZXMoKSA9PSBudWxsIHx8IHhtbG5vZGUuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID09IDApKSB7Ci0JCQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JCQkJdHJ5IHsKLQkJCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJCQlJRE9NRG9jdW1lbnQgZG9jTm9kZSA9ICgoSURPTU1vZGVsKSBzTW9kZWwpLmdldERvY3VtZW50KCk7Ci0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGRvY05vZGUsIGRvY05vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBudWxsKTsKLQkJCQkJCWFkZEVtcHR5RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJCWZpbmFsbHkgewotCQkJCQlpZiAoc01vZGVsICE9IG51bGwpCi0JCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKSB7Ci0JCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24obmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicHJvYmxlbSBnZXR0aW5nIG1vZGVsIikpOyAvLyROT04tTkxTLTEkCi0JCQkJCXJldHVybiBuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFswXTsKLQkJCQl9Ci0JCQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldENvbXBsZXRpb25Qcm9wb3NhbHMoKTsKLQkJCX0KLQkJCS8vIE1BU1NJVkUgRVJST1IgQ09ORElUSU9OCi0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNvbXBsZXRpb24gcmVnaW9uIHdhcyBudWxsIikpOyAvLyROT04tTkxTLTEkCi0JCQlzZXRFcnJvck1lc3NhZ2UoSU5URVJOQUxFUlJPUik7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KChOb2RlKSB0cmVlTm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCX0KLQotCi0JCS8vIGNhdGNoIGRvY3VtZW50cyB3aGVyZSBubyByZWdpb24gY2FuIGJlIGRldGVybWluZWQKLQkJaWYgKHhtbG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUgJiYgKGNvbXBsZXRpb25SZWdpb24gPT0gbnVsbCB8fCB4bWxub2RlLmdldENoaWxkTm9kZXMoKSA9PSBudWxsIHx8IHhtbG5vZGUuZ2V0Q2hpbGROb2RlcygpLmdldExlbmd0aCgpID09IDApKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IGNvbXB1dGVTdGFydERvY3VtZW50UHJvcG9zYWxzKGRvY3VtZW50UG9zaXRpb24sIG1hdGNoU3RyaW5nLCBjb21wbGV0aW9uUmVnaW9uLCAoSURPTU5vZGUpIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JCX0KLQotCQkvLyBjb21wdXRlIG5vcm1hbCBwcm9wb3NhbHMKLQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyhkb2N1bWVudFBvc2l0aW9uLCBtYXRjaFN0cmluZywgY29tcGxldGlvblJlZ2lvbiwgKElET01Ob2RlKSB0cmVlTm9kZSwgeG1sbm9kZSk7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKSB7Ci0JCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KChOb2RlKSB0cmVlTm9kZSwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpCi0JCQkJU3lzdGVtLm91dC5wcmludGxuKFVOS05PV05fQ09OVEVYVCArICIgIiArIGNvbXBsZXRpb25SZWdpb24uZ2V0VHlwZSgpICsgIkAiICsgZG9jdW1lbnRQb3NpdGlvbik7IC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQlzZXRFcnJvck1lc3NhZ2UoVU5LTk9XTl9DT05URVhUKTsKLQkJfQotCi0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRQcm9wb3NhbHMoKS5zaXplKCkgPT0gMCkKLQkJCXNldEVycm9yTWVzc2FnZShVTktOT1dOX0NPTlRFWFQpOwotCi0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdC5nZXRDb21wbGV0aW9uUHJvcG9zYWxzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVDb250ZW50UHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCA9IG51bGw7Ci0KLQkJLy8gc2V0dXAgdG8gYWRkIGNoaWxkcmVuIGF0IHRoZSBjb250ZW50IG5vZGUncyBwb3NpdGlvbgotCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGRvY3VtZW50UG9zaXRpb24pLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCWlmIChub2RlICE9IG51bGwgJiYgbm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSAmJiAoKERvY3VtZW50KSBub2RlKS5nZXREb2N0eXBlKCkgPT0gbnVsbCkKLQkJCWFkZFN0YXJ0RG9jdW1lbnRQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkobm9kZUF0T2Zmc2V0KSk7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQl9Ci0JCS8vIGVudGl0aWVzPwotCQlhZGRFbnRpdHlQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGRvY3VtZW50UG9zaXRpb24sIGNvbXBsZXRpb25SZWdpb24sIG5vZGUpOwotCQkvLyBhZGRFbnRpdHlQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCBwb3NzaWJsZSBjb250ZXh0cyBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkCi0JICogbG9jYXRpb24gd2l0aGluIHRoZSBkb2N1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjdXJyZW50IGN1cnNvcgotCSAqIHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCB2aWV3ZXIuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciB3aG9zZSBkb2N1bWVudCBpcyB1c2VkIHRvIGNvbXB1dGUgdGhlIHBvc3NpYmxlCi0JICogICAgICAgICAgICBjb250ZXh0cyBhbiBhcnJheSBvZiBjb250ZXh0IGluZm9ybWF0aW9uIG9iamVjdHMgb3IKLQkgKiAgICAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vIGNvbnRleHQgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbltdIGNvbXB1dGVDb250ZXh0SW5mb3JtYXRpb24oSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJaWYgKGZBdHRyaWJ1dGVJbmZvUHJvdmlkZXIgPT0gbnVsbCkKLQkJCWZBdHRyaWJ1dGVJbmZvUHJvdmlkZXIgPSBuZXcgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHZpZXdlci5nZXREb2N1bWVudCgpLCAoQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyKSBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSk7Ci0JCXJldHVybiBmQXR0cmlidXRlSW5mb1Byb3ZpZGVyLmdldEF0dHJpYnV0ZUluZm9ybWF0aW9uKGRvY3VtZW50T2Zmc2V0KTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZUVuZFRhZ09wZW5Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaW50IGNvbXBsZXRpb25SZWdpb25TdGFydCA9IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pOwotCQlpbnQgY29tcGxldGlvblJlZ2lvbkxlbmd0aCA9IGNvbXBsZXRpb25SZWdpb24uZ2V0TGVuZ3RoKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb25BdENvbXBsZXRpb25PZmZzZXQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbXBsZXRpb25SZWdpb25TdGFydCArIGNvbXBsZXRpb25SZWdpb25MZW5ndGgpOwotCQlJVGV4dFJlZ2lvbiByZWdpb25BdEVuZE9mQ29tcGxldGlvbiA9IHNkUmVnaW9uQXRDb21wbGV0aW9uT2Zmc2V0LmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGNvbXBsZXRpb25SZWdpb25TdGFydCArIGNvbXBsZXRpb25SZWdpb25MZW5ndGgpOwotCi0JCWlmIChkb2N1bWVudFBvc2l0aW9uICE9IGNvbXBsZXRpb25SZWdpb25TdGFydCAmJiByZWdpb25BdEVuZE9mQ29tcGxldGlvbiAhPSBudWxsICYmIHJlZ2lvbkF0RW5kT2ZDb21wbGV0aW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHJlZ2lvbkF0RW5kT2ZDb21wbGV0aW9uOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGVBdE9mZnNldC5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKSwgbmFtZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCWlmIChub2RlQXRPZmZzZXQuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBzZFJlZ2lvbikgewotCQkJCS8vIGFibm9ybWFsIGNhc2UsIHRoaXMgdW5tYXRjaGVkIGVuZCB0YWcgd2lsbCBiZSBhIHNpYmxpbmcKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZUF0T2Zmc2V0LmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCS8vIG5vcm1hbCBjYXNlLCB0aGlzIGVuZCB0YWcgaXMgdGhlIHBhcmVudAotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3Qobm9kZUF0T2Zmc2V0LCBub2RlQXRPZmZzZXQsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQl9Ci0JCX0KLQkJLy8gaWYgKGRvY3VtZW50UG9zaXRpb24gPj0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKwotCQkvLyBjb21wbGV0aW9uUmVnaW9uLmdldFRleHRMZW5ndGgoKSkKLQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJLy8gZWxzZQotCQlpZiAoY29tcGxldGlvblJlZ2lvblN0YXJ0ID09IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIHBvc2l0aW9uZWQgYXQgc3RhcnQgb2YgZW5kIHRhZwotCQkJYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBub2RlLmdldENoaWxkTm9kZXMoKS5nZXRMZW5ndGgoKSk7Ci0JCX0KLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCS8qKgotCSAqIHJldHVybiBhbGwgcG9zc2libGUgRW50aXR5UmVmZXJlbmNlUHJvcG9zYWxzIChhY2NvcmRpbmcgdG8gY3VycmVudAotCSAqIHBvc2l0aW9uIGluIGRvYykKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVFbnRpdHlSZWZlcmVuY2VQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIHRyZWVOb2RlKSB7Ci0JCS8vIG9ubHkgaGFuZGxlIFhNTCBjb250ZW50IGZvciBub3cKLQkJVmVjdG9yIHByb3Bvc2FscyA9IG5ldyBWZWN0b3IoKTsgLy8gSUNvbXBsZXRpb25Qcm9wb3NhbHMKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKGNvbXBsZXRpb25SZWdpb24gIT0gbnVsbCAmJiBjb21wbGV0aW9uUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQlpbnQgbm9kZU9mZnNldCA9IGRvY3VtZW50UG9zaXRpb24gLSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKTsKLQkJCVN0cmluZyByZWdpb25UZXh0ID0gc2RSZWdpb24uZ2V0RnVsbFRleHQoY29tcGxldGlvblJlZ2lvbik7Ci0KLQkJCS8vIGlmIGRpcmVjdGx5IHRvIHRoZSByaWdodCBvZiBhICYsIHJlZ2lvbiB3aWxsIGJlIG51bGwsIG5lZWQgdG8KLQkJCS8vIG1vdmUgdG8KLQkJCS8vIHRoZSBwcmV2aW91cyByZWdpb24uLi50aGVyZSBtaWdodCBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcwotCQkJaWYgKHJlZ2lvblRleHQgIT0gbnVsbCAmJiByZWdpb25UZXh0LnRyaW0oKS5lcXVhbHMoIiIpICYmIGRvY3VtZW50UG9zaXRpb24gPiAwKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHByZXYgPSB0cmVlTm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uIC0gMSk7Ci0JCQkJaWYgKHByZXYgIT0gbnVsbCAmJiBwcmV2LmdldEZ1bGxUZXh0KCkudHJpbSgpLmVxdWFscygiJiIpKSB7IC8vJE5PTi1OTFMtMSQJCQotCQkJCQljb21wbGV0aW9uUmVnaW9uID0gcHJldjsKLQkJCQkJcmVnaW9uVGV4dCA9IHByZXYuZ2V0RnVsbFRleHQoKTsKLQkJCQkJbm9kZU9mZnNldCA9IDE7Ci0JCQkJfQotCQkJfQotCi0JCQkvLyBzdHJpbmcgbXVzdCBzdGFydCB3LyAmCi0JCQlpZiAocmVnaW9uVGV4dCAhPSBudWxsICYmIHJlZ2lvblRleHQuc3RhcnRzV2l0aCgiJiIpKSB7IC8vJE5PTi1OTFMtMSQJCQkJCQkgCQkKLQkJCQlTdHJpbmcga2V5ID0gKG5vZGVPZmZzZXQgPiAwKSA/IHJlZ2lvblRleHQuc3Vic3RyaW5nKDEsIG5vZGVPZmZzZXQpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQotCQkJCS8vIGdldCBlbnRpdHkgcHJvcG9zYWxzLCBwYXNzaW5nIGluIHRoZSBhcHByb3ByaWF0ZSBzdGFydAotCQkJCS8vIHN0cmluZwotCQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KCgoTm9kZSkgdHJlZU5vZGUpLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCQkJQ01Eb2N1bWVudCB4bWxEb2MgPSBtcS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudCh0cmVlTm9kZSk7Ci0JCQkJCUNNTmFtZWROb2RlTWFwIGNtbWFwID0gbnVsbDsKLQkJCQkJUHJvcGVydGllcyBlbnRpdGllcyA9IG51bGw7Ci0JCQkJCWlmICh4bWxEb2MgIT0gbnVsbCkgewotCQkJCQkJY21tYXAgPSB4bWxEb2MuZ2V0RW50aXRpZXMoKTsKLQkJCQkJfQotCQkJCQlpZiAoY21tYXAgIT0gbnVsbCkgewotCQkJCQkJZW50aXRpZXMgPSBtYXBUb1Byb3BlcnRpZXMoY21tYXApOwotCQkJCQl9Ci0JCQkJCWVsc2UgLy8gMjI0Nzg3IGluIGFic2VuY2Ugb2YgY29udGVudCBtb2RlbCwganVzdCB1c2UKLQkJCQkJLy8gbWluaW1hbCA1IGVudGl0aWVzCi0JCQkJCXsKLQkJCQkJCWVudGl0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJCQkJCWVudGl0aWVzLnB1dCgicXVvdCIsICJcIiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiYXBvcyIsICInIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCQkJZW50aXRpZXMucHV0KCJhbXAiLCAiJiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgibHQiLCAiPCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWVudGl0aWVzLnB1dCgiZ3QiLCAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCi0JCQkJCQllbnRpdGllcy5wdXQoIm5ic3AiLCAiICIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQJCQkJCQkJCQkKLQkJCQkJfQotCQkJCQlhZGRFbnRpdHlQcm9wb3NhbHMocHJvcG9zYWxzLCBlbnRpdGllcywga2V5LCBub2RlT2Zmc2V0LCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pICgocHJvcG9zYWxzLnNpemUoKSA+IDApID8gcHJvcG9zYWxzLnRvQXJyYXkobmV3IElDb21wbGV0aW9uUHJvcG9zYWxbcHJvcG9zYWxzLnNpemUoKV0pIDogbnVsbCk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVFcXVhbHNQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJSVRleHRSZWdpb24gdmFsdWVSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikgKyBjb21wbGV0aW9uUmVnaW9uLmdldExlbmd0aCgpKTsKLQkJaWYgKHZhbHVlUmVnaW9uICE9IG51bGwgJiYgdmFsdWVSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUgJiYgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pIDw9IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCS8vIHJlcGxhY2UgdGhlIGFkamFjZW50IGF0dHJpYnV0ZSB2YWx1ZQotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCB2YWx1ZVJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQodmFsdWVSZWdpb24pLCB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIGFwcGVuZCBhbiBhdHRyaWJ1dGUgdmFsdWUgYWZ0ZXIgdGhlICc9JwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCX0KLQkJYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbXB1dGVTdGFydERvY3VtZW50UHJvcG9zYWxzKGludCBkb2N1bWVudFBvc2l0aW9uLCBTdHJpbmcgbWF0Y2hTdHJpbmcsIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIElET01Ob2RlIG5vZGVBdE9mZnNldCwgSURPTU5vZGUgbm9kZSkgewotCQkvLyBzZXR1cCBmb3IgYSBub24tZW1wdHkgZG9jdW1lbnQsIGJ1dCBvbmUgdGhhdCBoYXNuJ3QgYmVlbiBmb3JtYWxseQotCQkvLyBzdGFydGVkCi0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKSwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiwgMCwgbWF0Y2hTdHJpbmcpOwotCQlhZGRTdGFydERvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJcmV0dXJuIGNvbnRlbnRBc3Npc3RSZXF1ZXN0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlVGFnQ2xvc2VQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlpZiAoKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHx8IChkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldEVuZE9mZnNldCgpKSkgewotCQkJLy8gdGhpcyBpcyBhIGNvbnRlbnQgcmVxdWVzdCBhcyB0aGUgZG9jdW1lbnRQb3NpdGlvbiBpcyBBRlRFUiB0aGUKLQkJCS8vIGVuZCBvZiB0aGUgY2xvc2luZyByZWdpb24KLQkJCWlmIChub2RlID09IG5vZGVBdE9mZnNldCAmJiBub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKQotCQkJCW5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChub2RlQXRPZmZzZXQsIG5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQlhZGRUYWdJbnNlcnRpb25Qcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QsIGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkobm9kZUF0T2Zmc2V0KSk7Ci0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSAmJiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IG51bGwpIHsKLQkJCQlhZGRFbmRUYWdQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJLy8gYXQgdGhlIHN0YXJ0IG9mIHRoZSB0YWcncyBjbG9zZSBvciB3aXRoaW4gaXQKLQkJCUlUZXh0UmVnaW9uIGNsb3NlUmVnaW9uID0gc2RSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQkJYm9vbGVhbiBpbnNpZGVUYWcgPSAhc2RSZWdpb24uaXNFbmRlZCgpIHx8IGRvY3VtZW50UG9zaXRpb24gPD0gc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY2xvc2VSZWdpb24pOwotCQkJaWYgKGluc2lkZVRhZykgewotCQkJCS8vIHRoaXMgaXMgYSByZXF1ZXN0IGZvciBjb21wbGV0aW9ucyB3aXRoaW4gYSB0YWcKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSAmJiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpIHsKLQkJCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCX0KLQkJCQlpZiAoc2RSZWdpb24gPT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudExlbmd0aCgwKTsKLQkJCQkJYWRkQXR0cmlidXRlTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ05hbWVQcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQotCQlpZiAoc2RSZWdpb24gIT0gbm9kZUF0T2Zmc2V0LmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkpIHsKLQkJCS8vIGNvbXBsZXRpbmcgdGhlICpmaXJzdCogdGFnIGluICI8dGFnbmFtZTEgfDx0YWduYW1lMiIKLQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKTsKLQkJCWlmIChhY3R1YWxOb2RlICE9IG51bGwpIHsKLQkJCQlpZiAoYWN0dWFsTm9kZS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpID09IHNkUmVnaW9uKSB7Ci0JCQkJCS8vIHN0YXJ0IHRhZwotCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJLy8gaXQncyBhdHRyaWJ1dGVzCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUsIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uIC0gbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJCQlpZiAobm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSAtIDEpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pIC0gMSkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKQotCQkJCQkJCWFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQkJYWRkVGFnQ2xvc2VQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gaXQncyBuYW1lCi0JCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KGFjdHVhbE5vZGUsIGFjdHVhbE5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgZG9jdW1lbnRQb3NpdGlvbiAtIG1hdGNoU3RyaW5nLmxlbmd0aCgpLCBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcpOwotCQkJCQkJYWRkVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShhY3R1YWxOb2RlKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID49IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRMZW5ndGgoKSkgewotCQkJCQkJLy8gaW5zZXJ0IG5hbWUKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyByZXBsYWNlIG5hbWUKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQkJfQotCQkJCQlhZGRFbmRUYWdOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pICsgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpIHsKLQkJCQkvLyB1bmNsb3NlZCB0YWcgd2l0aCBvbmx5IGEgbmFtZTsgc2hvdWxkIHByb21wdCBmb3IgYXR0cmlidXRlcwotCQkJCS8vIGFuZCBhIGNsb3NlIGluc3RlYWQKLQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24gLSBtYXRjaFN0cmluZy5sZW5ndGgoKSwgbWF0Y2hTdHJpbmcubGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQlhZGRBdHRyaWJ1dGVOYW1lUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQlhZGRUYWdDbG9zZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAoc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgwKS5nZXRUeXBlKCkgIT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOKSB7Ci0JCQkJCWludCByZXBsYWNlTGVuZ3RoID0gZG9jdW1lbnRQb3NpdGlvbiAtIHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbiksIHJlcGxhY2VMZW5ndGgsIG1hdGNoU3RyaW5nKTsKLQkJCQkJYWRkVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShub2RlQXRPZmZzZXQpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCUlET01Ob2RlIGFjdHVhbE5vZGUgPSAoSURPTU5vZGUpIG5vZGUuZ2V0TW9kZWwoKS5nZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQlpZiAoYWN0dWFsTm9kZSAhPSBudWxsKSB7Ci0JCQkJCQlpZiAoZG9jdW1lbnRQb3NpdGlvbiA+PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSArIGNvbXBsZXRpb25SZWdpb24uZ2V0VGV4dExlbmd0aCgpKSB7Ci0JCQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3QgPSBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChhY3R1YWxOb2RlLCBhY3R1YWxOb2RlLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQkJCX0KLQkJCQkJCWFkZEVuZFRhZ05hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBjb250ZW50QXNzaXN0UmVxdWVzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udGVudEFzc2lzdFJlcXVlc3QgY29tcHV0ZVRhZ09wZW5Qcm9wb3NhbHMoaW50IGRvY3VtZW50UG9zaXRpb24sIFN0cmluZyBtYXRjaFN0cmluZywgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgSURPTU5vZGUgbm9kZUF0T2Zmc2V0LCBJRE9NTm9kZSBub2RlKSB7Ci0JCUNvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IGdldFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbihkb2N1bWVudFBvc2l0aW9uKTsKLQkJaWYgKHNkUmVnaW9uICE9IG5vZGVBdE9mZnNldC5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpKSB7Ci0JCQkvLyBjb21wbGV0aW5nIHRoZSAqZmlyc3QqIFhNTF9UQUdfT1BFTiBpbiAiPDx0YWduYW1lIgotCQkJSURPTU5vZGUgYWN0dWFsTm9kZSA9IChJRE9NTm9kZSkgbm9kZS5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQoY29tcGxldGlvblJlZ2lvbikpOwotCQkJaWYgKGFjdHVhbE5vZGUgIT0gbnVsbCkgewotCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0ID0gbmV3Q29udGVudEFzc2lzdFJlcXVlc3QoYWN0dWFsTm9kZSwgYWN0dWFsTm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJYWRkVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShhY3R1YWxOb2RlKSk7Ci0JCQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsgLy8gKHBhKSAyMjA4NTAKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWlmIChkb2N1bWVudFBvc2l0aW9uID09IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGNvbXBsZXRpb25SZWdpb24pKSB7Ci0JCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkvLyBhdCB0aGUgc3RhcnQgb2YgYW4gZXhpc3RpbmcgdGFnLCByaWdodCBiZWZvcmUgdGhlICc8JwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBkb2N1bWVudFBvc2l0aW9uLCAwLCBtYXRjaFN0cmluZyk7Ci0JCQkJCWFkZFRhZ0luc2VydGlvblByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShub2RlQXRPZmZzZXQpKTsKLQkJCQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgewotCQkJCQkvLyBhdCB0aGUgb3BlbmluZyBvZiB0aGUgVkVSWSBmaXJzdCB0YWcgd2l0aCBhICc8JwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgbm9kZS5nZXRQYXJlbnROb2RlKCksIHNkUmVnaW9uLCBjb21wbGV0aW9uUmVnaW9uLCBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChjb21wbGV0aW9uUmVnaW9uKSwgY29tcGxldGlvblJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIG1hdGNoU3RyaW5nKTsKLQkJCQkJYWRkU3RhcnREb2N1bWVudFByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCk7Ci0JCQkJfQotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gd2l0aGluIHRoZSB3aGl0ZSBzcGFjZQotCQkJCUlUZXh0UmVnaW9uIG5hbWUgPSBnZXROYW1lUmVnaW9uKG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSk7Ci0JCQkJLy8gKHBhKSBJVGV4dFJlZ2lvbiByZWZhY3RvcgotCQkJCS8vIGlmIChuYW1lICE9IG51bGwgJiYgbmFtZS5jb250YWluc09mZnNldChkb2N1bWVudFBvc2l0aW9uKSkKLQkJCQkvLyB7Ci0JCQkJaWYgKG5hbWUgIT0gbnVsbCAmJiAoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSkgPD0gZG9jdW1lbnRQb3NpdGlvbiAmJiBzZFJlZ2lvbi5nZXRFbmRPZmZzZXQobmFtZSkgPj0gZG9jdW1lbnRQb3NpdGlvbikpIHsKLQkJCQkJLy8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgbmFtZQotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGUsIG5vZGUuZ2V0UGFyZW50Tm9kZSgpLCBzZFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQobmFtZSksIG5hbWUuZ2V0VGV4dExlbmd0aCgpLCBtYXRjaFN0cmluZyk7Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQkvLyBpbnNlcnQgYSB2YWxpZCBuZXcgbmFtZSwgb3IgcG9zc2libHkgYW4gZW5kIHRhZwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdCA9IG5ld0NvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGVBdE9mZnNldCwgKChOb2RlKSBub2RlQXRPZmZzZXQpLmdldFBhcmVudE5vZGUoKSwgc2RSZWdpb24sIGNvbXBsZXRpb25SZWdpb24sIGRvY3VtZW50UG9zaXRpb24sIDAsIG1hdGNoU3RyaW5nKTsKLQkJCQkJYWRkRW5kVGFnUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQkJCQkJY29udGVudEFzc2lzdFJlcXVlc3Quc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGRvY3VtZW50UG9zaXRpb24pOwotCQkJCQljb250ZW50QXNzaXN0UmVxdWVzdC5zZXRSZXBsYWNlbWVudExlbmd0aCgwKTsKLQkJCQl9Ci0JCQkJYWRkVGFnTmFtZVByb3Bvc2Fscyhjb250ZW50QXNzaXN0UmVxdWVzdCwgZ2V0RWxlbWVudFBvc2l0aW9uRm9yTW9kZWxRdWVyeShub2RlQXRPZmZzZXQpKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY29udGVudEFzc2lzdFJlcXVlc3Q7Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIGNtbm9kZSdzIGRvY3VtZW50YXRpb24gdG8gZGlzcGxheSBpbiB0aGUgY29tcGxldGlvbgotCSAqIHByb3Bvc2FsJ3MgYWRkaXRpb25hbCBpbmZvLiBJZiBubyBkb2N1bWVudGF0aW9uIGV4aXN0cyBmb3IgY21ub2RlLCB0cnkKLQkgKiBkaXNwbGF5aW5nIHBhcmVudE9yT3duZXIncyBkb2N1bWVudGF0aW9uCi0JICogCi0JICogU3RyaW5nIGFueSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkgZm9yIGNtbm9kZS4KLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiB0aGVyZSBpcyBub3RoaW5nIHRvIGRpc3BsYXkuCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRBZGRpdGlvbmFsSW5mbyhDTU5vZGUgcGFyZW50T3JPd25lciwgQ01Ob2RlIGNtbm9kZSkgewotCQlTdHJpbmcgYWRkbEluZm8gPSBudWxsOwotCi0JCWlmIChjbW5vZGUgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgZGVjbGFyYXRpb24hIikucHJpbnRTdGFja1RyYWNlKCk7IC8vJE5PTi1OTFMtMSQKLQkJCX0KLQkJCXJldHVybiBudWxsOwotCQl9Ci0KLQkJYWRkbEluZm8gPSBnZXRJbmZvUHJvdmlkZXIoKS5nZXRJbmZvKGNtbm9kZSk7Ci0JCWlmIChhZGRsSW5mbyA9PSBudWxsICYmIHBhcmVudE9yT3duZXIgIT0gbnVsbCkKLQkJCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhwYXJlbnRPck93bmVyKTsKLQkJcmV0dXJuIGFkZGxJbmZvOwotCX0KLQotCS8vIHJldHVybnMgYSBsaXN0IG9mIE1vZGVsUXVlcnlBY3Rpb25zCi0JcHJvdGVjdGVkIExpc3QgZ2V0QXZhaWxhYmxlQ2hpbGRyZW5BdEluZGV4KEVsZW1lbnQgcGFyZW50LCBpbnQgaW5kZXgsIGludCB2YWxpZGl0eUNoZWNraW5nKSB7Ci0JCUxpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudCk7Ci0JCWlmIChwYXJlbnREZWNsICE9IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkocGFyZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQkvLyB0YWtlbiBmcm9tIEFjdGlvbk1hbmFnZXJzCi0JCQkvLyBpbnQgZWRpdE1vZGUgPSBtb2RlbFF1ZXJ5LmdldEVkaXRNb2RlKCk7Ci0JCQlpbnQgZWRpdE1vZGUgPSBNb2RlbFF1ZXJ5LkVESVRfTU9ERV9VTkNPTlNUUkFJTkVEOwotCQkJaW50IGljID0gKGVkaXRNb2RlID09IE1vZGVsUXVlcnkuRURJVF9NT0RFX0NPTlNUUkFJTkVEX1NUUklDVCkgPyBNb2RlbFF1ZXJ5LklOQ0xVREVfQ0hJTERfTk9ERVMgfCBNb2RlbFF1ZXJ5LklOQ0xVREVfU0VRVUVOQ0VfR1JPVVBTIDogTW9kZWxRdWVyeS5JTkNMVURFX0NISUxEX05PREVTOwotCQkJbW9kZWxRdWVyeS5nZXRJbnNlcnRBY3Rpb25zKHBhcmVudCwgcGFyZW50RGVjbCwgaW5kZXgsIGljLCB2YWxpZGl0eUNoZWNraW5nLCBsaXN0KTsKLQkJfQotCQlyZXR1cm4gbGlzdDsKLQl9Ci0KLQkvLyByZXR1cm5zIGEgbGlzdCBvZiBDTUVsZW1lbnREZWNsYXJhdGlvbnMKLQlwcm90ZWN0ZWQgTGlzdCBnZXRBdmFpbGFibGVSb290Q2hpbGRyZW4oRG9jdW1lbnQgZG9jdW1lbnQsIGludCBjaGlsZEluZGV4KSB7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0KLQkJLy8gZXh0cmFjdCB0aGUgdmFsaWQgJ3Jvb3QnIG5vZGUgbmFtZSBmcm9tIHRoZSBEb2N1bWVudFR5cGUgTm9kZQotCQlEb2N1bWVudFR5cGUgZG9jVHlwZSA9IGRvY3VtZW50LmdldERvY3R5cGUoKTsKLQkJU3RyaW5nIHJvb3ROYW1lID0gbnVsbDsKLQkJaWYgKGRvY1R5cGUgIT0gbnVsbCkgewotCQkJcm9vdE5hbWUgPSBkb2NUeXBlLmdldE5vZGVOYW1lKCk7Ci0JCX0KLQkJaWYgKHJvb3ROYW1lID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IEFycmF5TGlzdCgwKTsKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBkb2N1bWVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJLy8gbWFrZSBzdXJlIHRoZSAicm9vdCIgRWxlbWVudCBpc24ndCBhbHJlYWR5IHByZXNlbnQKLQkJCS8vIGlzIGl0IHJlcXVpcmVkIHRvIGJlIGFuIEVsZW1lbnQ/Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSAmJiBzdHJpbmdzRXF1YWwoY2hpbGQuZ2V0Tm9kZU5hbWUoKSwgcm9vdE5hbWUpKSB7Ci0JCQkJLy8gaWYgdGhlIG5vZGUgaXMgbWlzc2luZyBlaXRoZXIgdGhlIHN0YXJ0IG9yIGVuZCB0YWcsIGRvbid0Ci0JCQkJLy8gY291bnQgaXQgYXMgcHJlc2VudAotCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlICYmICgoKElET01Ob2RlKSBjaGlsZCkuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsIHx8ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsKSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKERlYnVnLmRpc3BsYXlJbmZvKQotCQkJCQlTeXN0ZW0ub3V0LnByaW50bG4ocm9vdE5hbWUgKyAiIGFscmVhZHkgcHJlc2VudCEiKTsgLy8kTk9OLU5MUy0xJAotCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLlRoZV9kb2N1bWVudF9lbGVtZW50X18sIChuZXcgT2JqZWN0W117cm9vdE5hbWV9KSkpOwotCQkJCXJldHVybiBuZXcgQXJyYXlMaXN0KDApOwotCQkJfQotCQl9Ci0KLQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZG9jdW1lbnQpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTURvY3VtZW50IGNtZG9jID0gbW9kZWxRdWVyeS5nZXRDb3JyZXNwb25kaW5nQ01Eb2N1bWVudChkb2N1bWVudCk7Ci0JCQlpZiAoY21kb2MgIT0gbnVsbCkgewotCQkJCWlmIChyb290TmFtZSAhPSBudWxsKSB7Ci0JCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIHJvb3REZWNsID0gKENNRWxlbWVudERlY2xhcmF0aW9uKSBjbWRvYy5nZXRFbGVtZW50cygpLmdldE5hbWVkSXRlbShyb290TmFtZSk7Ci0JCQkJCWlmIChyb290RGVjbCAhPSBudWxsKSB7Ci0JCQkJCQlsaXN0LmFkZChyb290RGVjbCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQkvLyBzdXBwbHkgdGhlIGdpdmVuIGRvY3VtZW50IG5hbWUgYW55d2F5LCBldmVuIGlmIGl0Ci0JCQkJCQkvLyBpcyBhbiBlcnJvcgotCQkJCQkJbGlzdC5hZGQobmV3IFNpbXBsZUNNRWxlbWVudERlY2xhcmF0aW9uKHJvb3ROYW1lKSk7Ci0JCQkJCQlpZiAoRGVidWcuZGlzcGxheUluZm8gfHwgRGVidWcuZGlzcGxheVdhcm5pbmdzKQotCQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gZGVmaW5pdGlvbiBmb3VuZCBmb3IgIiArIHJvb3ROYW1lICsgIiBpbiAiICsgZG9jVHlwZS5nZXRQdWJsaWNJZCgpICsgIi8iICsgZG9jVHlwZS5nZXRTeXN0ZW1JZCgpKTsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJCQlTdHJpbmcgbG9jYXRpb24gPSAiIiArIChkb2NUeXBlLmdldFB1YmxpY0lkKCkgIT0gbnVsbCA/IGRvY1R5cGUuZ2V0UHVibGljSWQoKSArICIvIiA6ICIiKSArIChkb2NUeXBlLmdldFN5c3RlbUlkKCkgIT0gbnVsbCA/IGRvY1R5cGUuZ2V0U3lzdGVtSWQoKSA6ICIiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGxvY2F0aW9uLmxlbmd0aCgpID4gMCkKLQkJCQkJCQlzZXRFcnJvck1lc3NhZ2UoTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5Ob19kZWZpbml0aW9uX2Zvcl9pbiwgKG5ldyBPYmplY3RbXXtyb290TmFtZSwgbG9jYXRpb259KSkpOwotCQkJCQkJZWxzZQotCQkJCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2RlZmluaXRpb25fZm9yLCAobmV3IE9iamVjdFtde3Jvb3ROYW1lfSkpKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChEZWJ1Zy5kaXNwbGF5SW5mbyB8fCBEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTm8gY29udGVudCBtb2RlbCBmb3VuZC4iKTsgLy8kTk9OLU5MUy0xJAotCQkJCS8vJE5PTi1OTFMtMSQKLQkJCQkvLyROT04tTkxTLTEkCi0JCQkJU3RyaW5nIGxvY2F0aW9uID0gIiIgKyAoZG9jVHlwZS5nZXRQdWJsaWNJZCgpICE9IG51bGwgPyBkb2NUeXBlLmdldFB1YmxpY0lkKCkgKyAiLyIgOiAiIikgKyAoZG9jVHlwZS5nZXRTeXN0ZW1JZCgpICE9IG51bGwgPyBkb2NUeXBlLmdldFN5c3RlbUlkKCkgOiAiIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JCQkJLy8kTk9OLU5MUy00JC8vJE5PTi1OTFMtMyQvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQkJCWlmIChsb2NhdGlvbi5sZW5ndGgoKSA+IDApCi0JCQkJCXNldEVycm9yTWVzc2FnZShOTFMuYmluZChYTUxVSU1lc3NhZ2VzLk5vX2NvbnRlbnRfbW9kZWxfZm9yLCAobmV3IE9iamVjdFtde2xvY2F0aW9ufSkpKTsKLQkJCQllbHNlCi0JCQkJCXNldEVycm9yTWVzc2FnZShYTUxVSU1lc3NhZ2VzLk5vX2NvbnRlbnRfbW9kZWxfZm91bmRfVUlfKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiBsaXN0OwotCX0KLQotCXByb3RlY3RlZCBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihOb2RlIG5vZGUpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShub2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKQotCQkJCXJlc3VsdCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY2hhcmFjdGVycyB3aGljaCB3aGVuIGVudGVyZWQgYnkgdGhlIHVzZXIgc2hvdWxkCi0JICogYXV0b21hdGljYWxseSB0cmlnZ2VyIHRoZSBwcmVzZW50YXRpb24gb2YgcG9zc2libGUgY29tcGxldGlvbnMuCi0JICogCi0JICogdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBjb21wbGV0aW9uIHByb3Bvc2FsIG9yCi0JICogPGNvZGU+bnVsbDwvY29kZT4gaWYgbm8gYXV0byBhY3RpdmF0aW9uIGlzIGRlc2lyZWQKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgb2Zmc2V0LCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uIHJlZ2lvbiA9IHNkUmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCWlmIChyZWdpb24gPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCi0JCWlmIChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pID09IG9mZnNldCkgewotCQkJLy8gVGhlIG9mZnNldCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWdpb24KLQkJCWlmICgoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSA9PSBzZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKSAmJiAoc2RSZWdpb24uZ2V0UHJldmlvdXMoKSAhPSBudWxsKSAmJiAoIXNkUmVnaW9uLmdldFByZXZpb3VzKCkuaXNFbmRlZCgpKSkgewotCQkJCS8vIElzIHRoZSByZWdpb24gYWxzbyB0aGUgc3RhcnQgb2YgdGhlIG5vZGU/IElmIHNvLCB0aGUKLQkJCQkvLyBwcmV2aW91cyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzCi0JCQkJLy8gd2hlcmUgdG8gbG9vayBmb3IgYSB1c2VmdWwgcmVnaW9uLgotCQkJCXJlZ2lvbiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0IC0gMSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBJcyB0aGVyZSBubyBzZXBhcmF0aW5nIHdoaXRlc3BhY2UgZnJvbSB0aGUgcHJldmlvdXMgcmVnaW9uPwotCQkJCS8vIElmIG5vdCwKLQkJCQkvLyB0aGVuIHRoYXQgcmVnaW9uIGlzIHRoZSBpbXBvcnRhbnQgb25lCi0JCQkJSVRleHRSZWdpb24gcHJldmlvdXNSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQgLSAxKTsKLQkJCQlpZiAoKHByZXZpb3VzUmVnaW9uICE9IG51bGwpICYmIChwcmV2aW91c1JlZ2lvbiAhPSByZWdpb24pICYmIChwcmV2aW91c1JlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgPT0gcHJldmlvdXNSZWdpb24uZ2V0TGVuZ3RoKCkpKSB7Ci0JCQkJCXJlZ2lvbiA9IHByZXZpb3VzUmVnaW9uOwotCQkJCX0KLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIFRoZSBvZmZzZXQgaXMgTk9UIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHJlZ2lvbgotCQkJaWYgKG9mZnNldCA+IHNkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHJlZ2lvbikgKyByZWdpb24uZ2V0VGV4dExlbmd0aCgpKSB7Ci0JCQkJLy8gSXMgdGhlIG9mZnNldCB3aXRoaW4gdGhlIHdoaXRlc3BhY2UgYWZ0ZXIgdGhlIHRleHQgaW4gdGhpcwotCQkJCS8vIHJlZ2lvbj8KLQkJCQkvLyBJZiBzbywgdXNlIHRoZSBuZXh0IHJlZ2lvbgotCQkJCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBzZFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChzZFJlZ2lvbi5nZXRTdGFydE9mZnNldChyZWdpb24pICsgcmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQlpZiAobmV4dFJlZ2lvbiAhPSBudWxsKQotCQkJCQlyZWdpb24gPSBuZXh0UmVnaW9uOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gSXMgdGhlIG9mZnNldCB3aXRoaW4gdGhlIGltcG9ydGFudCB0ZXh0IGZvciB0aGlzIHJlZ2lvbj8KLQkJCQkvLyBJZiBzbywgdGhlbiB3ZSd2ZSBhbHJlYWR5IGdvdCB0aGUgcmlnaHQgb25lLgotCQkJfQotCQl9Ci0KLQkJLy8gdmFsaWQgV0hJVEVfU1BBQ0UgcmVnaW9uIGhhbmRsZXIgKCMxNzk5MjQpCi0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCUlUZXh0UmVnaW9uIHByZXZpb3VzUmVnaW9uID0gc2RSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoc2RSZWdpb24uZ2V0U3RhcnRPZmZzZXQocmVnaW9uKSAtIDEpOwotCQkJaWYgKHByZXZpb3VzUmVnaW9uICE9IG51bGwpCi0JCQkJcmVnaW9uID0gcHJldmlvdXNSZWdpb247Ci0JCX0KLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVnaW9uIHdob3NlIGNvbnRlbnQncyByZXF1aXJlIGNvbXBsZXRpb24uIFRoaXMgaXMgc29tZXRoaW5nCi0JICogb2YgYSBtaXNub21lciBhcyBzb21ldGltZXMgdGhlIHVzZXIgd2FudHMgdG8gYmUgcHJvbXB0ZWQgZm9yIGNvbnRlbnRzCi0JICogb2YgYSBub24tZXhpc3RhbnQgSVRleHRSZWdpb24sIHN1Y2ggYXMgZm9yIGVudW1lcmF0ZWQgYXR0cmlidXRlIHZhbHVlcwotCSAqIGZvbGxvd2luZyBhbiAnPScgc2lnbi4KLQkgKi8KLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZ2V0Q29tcGxldGlvblJlZ2lvbihpbnQgZG9jdW1lbnRQb3NpdGlvbiwgTm9kZSBkb21ub2RlKSB7Ci0JCWlmIChkb21ub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlpbnQgb2Zmc2V0ID0gZG9jdW1lbnRQb3NpdGlvbjsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSA9IG51bGw7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIGRvbW5vZGU7Ci0KLQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCWlmIChub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExlbmd0aCgpID09IDApCi0JCQkJcmV0dXJuIG51bGw7Ci0JCQlJVGV4dFJlZ2lvbiByZXN1bHQgPSBub2RlLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJCXdoaWxlIChyZXN1bHQgPT0gbnVsbCkgewotCQkJCW9mZnNldC0tOwotCQkJCXJlc3VsdCA9IG5vZGUuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRUYWcgPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kVGFnID0gbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQotCQkvLyBEZXRlcm1pbmUgaWYgdGhlIG9mZnNldCBpcyB3aXRoaW4gdGhlIHN0YXJ0Ci0JCS8vIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGVuZCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBvcgotCQkvLyBzb21ld2hlcmUgd2l0aGluIHRoZSBOb2RlJ3MgWE1MIGNvbnRlbnQuCi0JCWlmICgoc3RhcnRUYWcgIT0gbnVsbCkgJiYgKHN0YXJ0VGFnLmdldFN0YXJ0T2Zmc2V0KCkgPD0gb2Zmc2V0KSAmJiAob2Zmc2V0IDwgc3RhcnRUYWcuZ2V0U3RhcnRPZmZzZXQoKSArIHN0YXJ0VGFnLmdldExlbmd0aCgpKSkKLQkJCWZsYXROb2RlID0gc3RhcnRUYWc7Ci0JCWVsc2UgaWYgKChlbmRUYWcgIT0gbnVsbCkgJiYgKGVuZFRhZy5nZXRTdGFydE9mZnNldCgpIDw9IG9mZnNldCkgJiYgKG9mZnNldCA8IGVuZFRhZy5nZXRTdGFydE9mZnNldCgpICsgZW5kVGFnLmdldExlbmd0aCgpKSkKLQkJCWZsYXROb2RlID0gZW5kVGFnOwotCi0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQkvLyB0aGUgb2Zmc2V0IGlzIGRlZmluaXRlbHkgd2l0aGluIHRoZSBzdGFydCBvciBlbmQgdGFnLCBjb250aW51ZQotCQkJLy8gb24gYW5kIGZpbmQgdGhlIHJlZ2lvbgotCQkJcmVnaW9uID0gZ2V0Q29tcGxldGlvblJlZ2lvbihvZmZzZXQsIGZsYXROb2RlKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIHRoZSBkb2NQb3NpdGlvbiBpcyBuZWl0aGVyIHdpdGhpbiB0aGUgc3RhcnQgbm9yIHRoZSBlbmQsIHNvIGl0Ci0JCQkvLyBtdXN0IGJlIGNvbnRlbnQKLQkJCWZsYXROb2RlID0gbm9kZS5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJLy8gKHBhKSBJVGV4dFJlZ2lvbiByZWZhY3RvcgotCQkJLy8gaWYgKGZsYXROb2RlLmNvbnRhaW5zKGRvY3VtZW50UG9zaXRpb24pKSB7Ci0JCQlpZiAoZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSA8PSBkb2N1bWVudFBvc2l0aW9uICYmIGZsYXROb2RlLmdldEVuZE9mZnNldCgpID49IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJCQkvLyB3ZSdyZSBpbnRlcmVzdGluZyBpbiBjb21wbGV0aW5nL2V4dGVuZGluZyB0aGUgcHJldmlvdXMKLQkJCQkvLyBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlmIHRoZSBjdXJyZW50Ci0JCQkJLy8gSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpc24ndCBwbGFpbiBjb250ZW50IG9yIGlmIGl0J3MKLQkJCQkvLyBwcmVjZWRlZCBieSBhbiBvcnBoYW4gJzwnCi0JCQkJaWYgKChvZmZzZXQgPT0gZmxhdE5vZGUuZ2V0U3RhcnRPZmZzZXQoKSkgJiYgKGZsYXROb2RlLmdldFByZXZpb3VzKCkgIT0gbnVsbCkgJiYgKGZsYXROb2RlLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGRvY3VtZW50UG9zaXRpb24pICE9IG51bGwgJiYgZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbikuZ2V0VHlwZSgpICE9IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQgfHwgZmxhdE5vZGUuZ2V0UHJldmlvdXMoKS5nZXRMYXN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOIHx8IGZsYXROb2RlLmdldFByZXZpb3VzKCkuZ2V0TGFzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pKSB7Ci0JCQkJCS8vIElzIHRoZSByZWdpb24gYWxzbyB0aGUgc3RhcnQgb2YgdGhlIG5vZGU/IElmIHNvLCB0aGUKLQkJCQkJLy8gcHJldmlvdXMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcwotCQkJCQkvLyB3aGVyZSB0byBsb29rIGZvciBhIHVzZWZ1bCByZWdpb24uCi0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldFByZXZpb3VzKCkuZ2V0TGFzdFJlZ2lvbigpOwotCQkJCX0KLQkJCQllbHNlIGlmIChmbGF0Tm9kZS5nZXRFbmRPZmZzZXQoKSA9PSBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCQkJCXJlZ2lvbiA9IGZsYXROb2RlLmdldExhc3RSZWdpb24oKTsKLQkJCQl9Ci0JCQkJZWxzZQotCQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRGaXJzdFJlZ2lvbigpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gY2F0Y2ggZW5kIG9mIGRvY3VtZW50IHBvc2l0aW9ucyB3aGVyZSB0aGUgZG9jUG9zaXRpb24gaXNuJ3QKLQkJCQkvLyBpbiBhIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkJCQlyZWdpb24gPSBmbGF0Tm9kZS5nZXRMYXN0UmVnaW9uKCk7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIFByb3ZpZGVkIGJ5IGRlZmF1bHQuIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHdpdGggdGhlaXIgb3duCi0JICogaW1wbGVtZW50YXRpb25zLgotCSAqIAotCSAqIEBzZWUgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbnRlbnRHZW5lcmF0b3IoKQotCSAqLwotCXB1YmxpYyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IgZ2V0Q29udGVudEdlbmVyYXRvcigpIHsKLQkJaWYgKGZHZW5lcmF0b3IgPT0gbnVsbCkKLQkJCWZHZW5lcmF0b3IgPSBuZXcgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yKCk7Ci0JCXJldHVybiBmR2VuZXJhdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGNoYXJhY3RlcnMgd2hpY2ggd2hlbiBlbnRlcmVkIGJ5IHRoZSB1c2VyIHNob3VsZAotCSAqIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciB0aGUgcHJlc2VudGF0aW9uIG9mIGNvbnRleHQgaW5mb3JtYXRpb24uCi0JICogCi0JICogdGhlIGF1dG8gYWN0aXZhdGlvbiBjaGFyYWN0ZXJzIGZvciBwcmVzZW50aW5nIGNvbnRleHQgaW5mb3JtYXRpb24gb3IKLQkgKiA8Y29kZT5udWxsPC9jb2RlPiBpZiBubyBhdXRvIGFjdGl2YXRpb24gaXMgZGVzaXJlZAotCSAqLwotCXB1YmxpYyBjaGFyW10gZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkgewotCQlyZXR1cm4gY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWxpZGF0b3IgdXNlZCB0byBkZXRlcm1pbmUgd2hlbiBkaXNwbGF5ZWQgY29udGV4dAotCSAqIGluZm9ybWF0aW9uIHNob3VsZCBiZSBkaXNtaXNzZWQuIE1heSBvbmx5IHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqIHRoZSBwcm9jZXNzb3IgaXMgaW5jYXBhYmxlIG9mIGNvbXB1dGluZyBjb250ZXh0IGluZm9ybWF0aW9uLgotCSAqIAotCSAqIGEgY29udGV4dCBpbmZvcm1hdGlvbiB2YWxpZGF0b3IsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZQotCSAqIHByb2Nlc3NvciBpcyBpbmNhcGFibGUgb2YgY29tcHV0aW5nIGNvbnRleHQgaW5mb3JtYXRpb24KLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciBnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKSB7Ci0JCWlmIChmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID09IG51bGwpCi0JCQlmQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyID0gbmV3IEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcigpOwotCQlyZXR1cm4gZkNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldEVsZW1lbnRQb3NpdGlvbihOb2RlIGNoaWxkKSB7Ci0JCU5vZGUgcGFyZW50ID0gY2hpbGQuZ2V0UGFyZW50Tm9kZSgpOwotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gMDsKLQotCQlOb2RlTGlzdCBjaGlsZHJlbiA9IHBhcmVudC5nZXRDaGlsZE5vZGVzKCk7Ci0JCWlmIChjaGlsZHJlbiA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWludCBjb3VudCA9IDA7Ci0KLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlpZiAoY2hpbGRyZW4uaXRlbShpKSA9PSBjaGlsZCkKLQkJCQlyZXR1cm4gY291bnQ7Ci0JCQllbHNlCi0JCQkJLy8gaWYgKGNoaWxkcmVuLml0ZW0oaSkuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQljb3VudCsrOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXByaXZhdGUgaW50IGdldEVsZW1lbnRQb3NpdGlvbkZvck1vZGVsUXVlcnkoTm9kZSBjaGlsZCkgewotCQlyZXR1cm4gZ2V0RWxlbWVudFBvc2l0aW9uKGNoaWxkKTsKLQkJLy8gcmV0dXJuIC0xOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqIAotCSAqIGFuIGVycm9yIG1lc3NhZ2Ugb3IgbnVsbCBpZiBubyBlcnJvciBvY2N1cnJlZAotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RXJyb3JNZXNzYWdlKCkgewotCQlyZXR1cm4gZkVycm9yTWVzc2FnZTsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gaVJlc291cmNlCi0JICovCi0JLy8gcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJUmVzb3VyY2UgaVJlc291cmNlKSB7Ci0JLy8gdGhpcy5yZXNvdXJjZSA9IGlSZXNvdXJjZTsKLQkvLyB9Ci0JLyoqCi0JICogR2V0cyB0aGUgaW5mb1Byb3ZpZGVyLgotCSAqIAotCSAqIGZJbmZvUHJvdmlkZXIgYW5kIGlmIGZJbmZvUHJvdmlkZXIgd2FzIDxjb2RlPm51bGw8L2NvZGU+IGNyZWF0ZSBhIG5ldwotCSAqIGluc3RhbmNlCi0JICovCi0JcHVibGljIE1hcmt1cFRhZ0luZm9Qcm92aWRlciBnZXRJbmZvUHJvdmlkZXIoKSB7Ci0JCWlmIChmSW5mb1Byb3ZpZGVyID09IG51bGwpIHsKLQkJCWZJbmZvUHJvdmlkZXIgPSBuZXcgTWFya3VwVGFnSW5mb1Byb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbmZvUHJvdmlkZXI7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNYXRjaFN0cmluZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHBhcmVudCwgSVRleHRSZWdpb24gYVJlZ2lvbiwgaW50IG9mZnNldCkgewotCQlpZiAoYVJlZ2lvbiA9PSBudWxsIHx8IGlzQ2xvc2VSZWdpb24oYVJlZ2lvbikpCi0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJU3RyaW5nIG1hdGNoU3RyaW5nID0gbnVsbDsKLQkJU3RyaW5nIHJlZ2lvblR5cGUgPSBhUmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgcmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCAob2Zmc2V0ID4gcGFyZW50LmdldFN0YXJ0T2Zmc2V0KGFSZWdpb24pICsgYVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpKSB7Ci0JCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSBpZiAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UKSB7Ci0JCQltYXRjaFN0cmluZyA9ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJZWxzZSB7Ci0JCQlpZiAocGFyZW50LmdldFRleHQoYVJlZ2lvbikubGVuZ3RoKCkgPiAwICYmIHBhcmVudC5nZXRTdGFydE9mZnNldChhUmVnaW9uKSA8IG9mZnNldCkKLQkJCQltYXRjaFN0cmluZyA9IHBhcmVudC5nZXRUZXh0KGFSZWdpb24pLnN1YnN0cmluZygwLCBvZmZzZXQgLSBwYXJlbnQuZ2V0U3RhcnRPZmZzZXQoYVJlZ2lvbikpOwotCQkJZWxzZQotCQkJCW1hdGNoU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbWF0Y2hTdHJpbmc7Ci0JfQotCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldE5hbWVSZWdpb24oSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSkgewotCQlpZiAoZmxhdE5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlJdGVyYXRvciByZWdpb25MaXN0ID0gZmxhdE5vZGUuZ2V0UmVnaW9ucygpLml0ZXJhdG9yKCk7Ci0JCXdoaWxlIChyZWdpb25MaXN0Lmhhc05leHQoKSkgewotCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKElUZXh0UmVnaW9uKSByZWdpb25MaXN0Lm5leHQoKTsKLQkJCWlmIChpc05hbWVSZWdpb24ocmVnaW9uKSkKLQkJCQlyZXR1cm4gcmVnaW9uOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyBhbGwgb2YgdGhlIHBvc3NpYmxlIHZhbGlkIHZhbHVlcyBmb3IgdGhpcyBhdHRyaWJ1dGUKLQkgKiBkZWNsYXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCBMaXN0IGdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoTm9kZSBub2RlLCBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGFkKSB7Ci0JCUxpc3QgbGlzdCA9IG51bGw7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUVsZW1lbnQgZWxlbWVudCA9IChFbGVtZW50KSBub2RlOwotCQkJU3RyaW5nW10gZGF0YVR5cGVWYWx1ZXMgPSBudWxsOwotCQkJLy8gVGhlIE1vZGVsUXVlcnkgbWF5IG5vdCBiZSBhdmFpbGFibGUgaWYgdGhlIGNvcnJlc3BvbmRpbmcKLQkJCS8vIGFkYXB0ZXIKLQkJCS8vIGlzIGFic2VudAotCQkJTW9kZWxRdWVyeSBtb2RlbFF1ZXJ5ID0gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQkJZGF0YVR5cGVWYWx1ZXMgPSBtb2RlbFF1ZXJ5LmdldFBvc3NpYmxlRGF0YVR5cGVWYWx1ZXMoZWxlbWVudCwgYWQpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaWYgKGFkLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkKLQkJCQkJZGF0YVR5cGVWYWx1ZXMgPSBhZC5nZXRBdHRyVHlwZSgpLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJCX0KLQkJCWlmIChkYXRhVHlwZVZhbHVlcyAhPSBudWxsKSB7Ci0JCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoZGF0YVR5cGVWYWx1ZXMubGVuZ3RoKTsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdGFUeXBlVmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJCWxpc3QuYWRkKGRhdGFUeXBlVmFsdWVzW2ldKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGxpc3QgPT0gbnVsbCkgewotCQkJbGlzdCA9IG5ldyBBcnJheUxpc3QoMCk7Ci0JCX0KLQkJcmV0dXJuIGxpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRSZXF1aXJlZE5hbWUoTm9kZSBwYXJlbnRPck93bmVyLCBDTU5vZGUgY21ub2RlKSB7Ci0JCWlmIChjbW5vZGUgPT0gbnVsbCB8fCBwYXJlbnRPck93bmVyID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZ2V0Q29udGVudEdlbmVyYXRvcigpLmdldFJlcXVpcmVkTmFtZShwYXJlbnRPck93bmVyLCBjbW5vZGUpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRUZXh0KE5vZGUgcGFyZW50T3JPd25lciwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCkgewotCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCkgewotCQkJaWYgKERlYnVnLmRpc3BsYXlXYXJuaW5ncykgewotCQkJCW5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk51bGwgYXR0cmlidXRlIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlTdHJpbmdCdWZmZXIgYnVmZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQkJZ2V0Q29udGVudEdlbmVyYXRvcigpLmdlbmVyYXRlUmVxdWlyZWRBdHRyaWJ1dGUocGFyZW50T3JPd25lciwgYXR0ckRlY2wsIGJ1ZmYpOwotCQlyZXR1cm4gYnVmZi50b1N0cmluZygpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0UmVxdWlyZWRUZXh0KE5vZGUgcGFyZW50T3JPd25lciwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJaWYgKGVsZW1lbnREZWNsID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbiEiKS5wcmludFN0YWNrVHJhY2UoKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCWdldENvbnRlbnRHZW5lcmF0b3IoKS5nZW5lcmF0ZVRhZyhwYXJlbnRPck93bmVyLCBlbGVtZW50RGVjbCwgYnVmZik7Ci0JCXJldHVybiBidWZmLnRvU3RyaW5nKCk7Ci0JfQotCi0JLyoqCi0JICogU3RydWN0dXJlZFRleHRWaWV3ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHVzaW5nIHRoaXMuCi0JICovCi0JcHVibGljIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKGludCBwb3MpIHsKLQkJLy8gKHBhKSBJVGV4dFJlZ2lvbiByZWZhY3RvciBkZWZlY3QgMjQ1MTkwCi0JCS8vIHJldHVybgotCQkvLyAoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbilDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KChTdHJ1Y3R1cmVkVGV4dFZpZXdlcilmVGV4dFZpZXdlciwKLQkJLy8gcG9zKTsKLQkJcmV0dXJuIENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oZlRleHRWaWV3ZXIsIHBvcyk7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmcgZ2V0VGFnTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgcmVnaW9ucy5zaXplKCk7IGkrKykgewotCQkJcmVnaW9uID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCW5hbWUgPSBzZFJlZ2lvbi5nZXRUZXh0KHJlZ2lvbik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG5hbWU7Ci0JfQotCi0gICAgLy8gcmV0dXJucyBhIGxpc3Qgb2YgQ01Ob2RlcyB0aGF0IGFyZSBhdmFpbGFibGUgd2l0aGluIHRoaXMgcGFyZW50IGNvbnRleHQKLSAgICAvLyBHaXZlbiB0aGUgZ3JhbW1hciBzaG93biBiZWxvdyBhbmQgYSBzbmlwcGV0IG9mIFhNTCBjb2RlICh3aGVyZSB0aGUgJ3wnIGluZGljYXRlZCB0aGUgY3Vyc29yIHBvc2l0aW9uKSAKLSAgICAvLyB0aGUgbGlzdCB3b3VsZCByZXR1cm4gYWxsIG9mIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9ucyB0aGF0IGFyZSBwb3RlbnRpYWwgY2hpbGQgZWxlbWVudHMgb2YgRm9vLiAKLSAgICAvLwotICAgIC8vIGdyYW1tYXIgOiBGb28gLT4gKEEsIEIsIEMpICAgCi0gICAgLy8gc25pcHBldCA6IDxGb28+PEE+fAotICAgIC8vIHJlc3VsdCAgOiB7QSwgQiwgQ30KLSAgICAvLyAKLSAgICAvLyBUT0RPIGNzLi4uIGRvIHdlIG5lZWQgdG8gcGFzcyBpbiB0aGUgJ2tpbmRPZkFjdGlvbic/ICBTZWVtcyB0byBtZSB3ZSBjb3VsZCBhc3N1bWUgaXQncyBhbHdheXMgYW4gaW5zZXJ0LgotCXByb3RlY3RlZCBMaXN0IGdldEF2YWlsYWJsZUNoaWxkRWxlbWVudERlY2xhcmF0aW9ucyhFbGVtZW50IHBhcmVudCwgaW50IGNoaWxkUG9zaXRpb24sIGludCBraW5kT2ZBY3Rpb24pIAotICAgIHsKLSAgICAgICAgTGlzdCBtb2RlbFF1ZXJ5QWN0aW9ucyA9ICBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgocGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5LlZBTElESVRZX05PTkUpOyAKLQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBtb2RlbFF1ZXJ5QWN0aW9ucy5pdGVyYXRvcigpOwotCQlMaXN0IGNtbm9kZXMgPSBuZXcgVmVjdG9yKCk7Ci0JCXdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLQkJCU1vZGVsUXVlcnlBY3Rpb24gYWN0aW9uID0gKE1vZGVsUXVlcnlBY3Rpb24pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCWlmIChjaGlsZFBvc2l0aW9uIDwgMCB8fCAoYWN0aW9uLmdldFN0YXJ0SW5kZXgoKSA8PSBjaGlsZFBvc2l0aW9uICYmIGNoaWxkUG9zaXRpb24gPD0gYWN0aW9uLmdldEVuZEluZGV4KCkpICYmIGFjdGlvbi5nZXRLaW5kKCkgPT0ga2luZE9mQWN0aW9uKSB7Ci0JCQkJQ01Ob2RlIGFjdGlvbkNNTm9kZSA9IGFjdGlvbi5nZXRDTU5vZGUoKTsKLQkJCQlpZiAoYWN0aW9uQ01Ob2RlICE9IG51bGwgJiYgIWNtbm9kZXMuY29udGFpbnMoYWN0aW9uQ01Ob2RlKSkKLQkJCQkJY21ub2Rlcy5hZGQoYWN0aW9uQ01Ob2RlKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gY21ub2RlczsKLQl9Ci0KLSAgICAvLyByZXR1cm5zIGEgbGlzdCBvZiBDTU5vZGVzIHRoYXQgY2FuIGJlIHZhbGlkbHkgaW5zZXJ0ZWQgYXQgdGhpcyBjaGlsZFBvc2l0aW9uIAotICAgIC8vIEdpdmVuIHRoZSBncmFtbWFyIHNob3duIGJlbG93IGFuZCBhIHNuaXBwZXQgb2YgWE1MIGNvZGUgKHdoZXJlIHRoZSAnfCcgaW5kaWNhdGVkIHRoZSBjdXJzb3IgcG9zaXRpb24pIAotICAgIC8vIHRoZSBsaXN0IHdvdWxkIHJldHVybiBvbmx5IHRoZSBlbGVtZW50IGRlY2xhcmF0aW9ucyBjYW4gYmUgaW5zZXJ0ZWQgd2hpbGUgbWFpbnRhaW5nIHZhbGlkaXR5IG9mIHRoZSBjb250ZW50LiAKLSAgICAvLwotICAgIC8vIGdyYW1tYXIgOiBGb28gLT4gKEEsIEIsIEMpICAgCi0gICAgLy8gc25pcHBldCA6IDxGb28+PEE+fAotICAgIC8vIHJlc3VsdCAgOiB7Qn0KLSAgICAvLyAgICAKLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRWYWxpZENoaWxkRWxlbWVudERlY2xhcmF0aW9ucyhFbGVtZW50IHBhcmVudCwgaW50IGNoaWxkUG9zaXRpb24sIGludCBraW5kT2ZBY3Rpb24pIAotICAgIHsKLSAgICAgICAgTGlzdCBtb2RlbFF1ZXJ5QWN0aW9ucyA9ICBnZXRBdmFpbGFibGVDaGlsZHJlbkF0SW5kZXgocGFyZW50LCBjaGlsZFBvc2l0aW9uLCBNb2RlbFF1ZXJ5LlZBTElESVRZX1NUUklDVCk7IAotICAgICAgICBJdGVyYXRvciBpdGVyYXRvciA9IG1vZGVsUXVlcnlBY3Rpb25zLml0ZXJhdG9yKCk7Ci0gICAgICAgIExpc3QgY21ub2RlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgTW9kZWxRdWVyeUFjdGlvbiBhY3Rpb24gPSAoTW9kZWxRdWVyeUFjdGlvbikgaXRlcmF0b3IubmV4dCgpOyAgICAgIAotICAgICAgICAgICAgaWYgKGNoaWxkUG9zaXRpb24gPCAwIHx8IChhY3Rpb24uZ2V0U3RhcnRJbmRleCgpIDw9IGNoaWxkUG9zaXRpb24gJiYgY2hpbGRQb3NpdGlvbiA8PSBhY3Rpb24uZ2V0RW5kSW5kZXgoKSkgJiYgYWN0aW9uLmdldEtpbmQoKSA9PSBraW5kT2ZBY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBDTU5vZGUgYWN0aW9uQ01Ob2RlID0gYWN0aW9uLmdldENNTm9kZSgpOwotICAgICAgICAgICAgICAgIGlmIChhY3Rpb25DTU5vZGUgIT0gbnVsbCAmJiAhY21ub2Rlcy5jb250YWlucyhhY3Rpb25DTU5vZGUpKQotICAgICAgICAgICAgICAgICAgICBjbW5vZGVzLmFkZChhY3Rpb25DTU5vZGUpOwotICAgICAgICAgICAgfSAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNtbm9kZXM7Ci0gICAgfQotCi0JLyoqCi0JICogU2ltaWxhciB0byB0aGUgY2FsbCBpbiBIVE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci4gUGFzcyBpbiBhIG5vZGUsIGl0Ci0JICogdGVsbHMgeW91IGlmIHRoZSBkb2N1bWVudCBpcyBYTUwgdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIAotCSAqLwotCXByb3RlY3RlZCBib29sZWFuIGdldFhNTChOb2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlEb2N1bWVudCBkb2MgPSBudWxsOwotCQlkb2MgPSAobm9kZS5nZXROb2RlVHlwZSgpICE9IE5vZGUuRE9DVU1FTlRfTk9ERSkgPyBub2RlLmdldE93bmVyRG9jdW1lbnQoKSA6ICgoRG9jdW1lbnQpIG5vZGUpOwotCi0JCXJldHVybiAoZG9jIGluc3RhbmNlb2YgSURPTURvY3VtZW50KSAmJiAoKElET01Eb2N1bWVudCkgZG9jKS5pc1hNTFR5cGUoKTsKLQl9Ci0KLQkvLyBJbml0aWFsaXplIGxvY2FsIHNldHRpbmdzCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJLy8gaW1wbGVtZW50IGluIHN1YmNsYXNzZXMKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nsb3NlUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQVRUTElTVF9ERUNMX0NMT1NFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT05fQ0xPU0UpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0NMT1NFKSB8fCAodHlwZSA9PSBET01KU1BSZWdpb25Db250ZXh0c1ByaXZhdGVDb3B5LkpTUF9DT01NRU5UX0NMT1NFKSB8fCAodHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX0NMT1NFKSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UpKTsKLQl9Ci0KLQkvKgotCSAqIFRoaXMgaXMgdG8gZGV0ZXJtaW5lIGlmIGEgdGFnIGlzIGEgc3BlY2lhbCBtZXRhLWluZm8gY29tbWVudCB0YWcgdGhhdAotCSAqIHNob3dzIHVwIGFzIGFuIEVMRU1FTlQKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNDb21tZW50Tm9kZShJRE9NTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZSAhPSBudWxsICYmIG5vZGUgaW5zdGFuY2VvZiBJRE9NRWxlbWVudCAmJiAoKElET01FbGVtZW50KSBub2RlKS5pc0NvbW1lbnRUYWcoKSk7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIGlmIGN1cnNvciBwb3NpdGlvbiBpcyBhZnRlciBkb2N0eXBlIHRhZy4uLgotCSAqIAotCSAqIEBwYXJhbSBjYXIKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckFmdGVyRG9jdHlwZShDb250ZW50QXNzaXN0UmVxdWVzdCBjYXIpIHsKLQkJTm9kZSBhTm9kZSA9IGNhci5nZXROb2RlKCk7Ci0JCURvY3VtZW50IHBhcmVudCA9IGFOb2RlLmdldE93bmVyRG9jdW1lbnQoKTsKLQkJaW50IHhtbGRvY3R5cGVOb2RlUG9zaXRpb24gPSAtMTsKLQkJYm9vbGVhbiBpc0FmdGVyRG9jdHlwZSA9IHRydWU7Ci0KLQkJaWYgKHBhcmVudCA9PSBudWxsKQotCQkJcmV0dXJuIHRydWU7IC8vIGJsYW5rIGRvY3VtZW50IGNhc2UKLQotCQlmb3IgKE5vZGUgY2hpbGQgPSBwYXJlbnQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJeG1sZG9jdHlwZU5vZGVQb3NpdGlvbiA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaXNBZnRlckRvY3R5cGUgPSAoY2FyLmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpID49IHhtbGRvY3R5cGVOb2RlUG9zaXRpb24pOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzQWZ0ZXJEb2N0eXBlOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGNhbiBjaGVjayBpZiB0aGUgY3Vyc29yIGlzIGFmdGVyIHRoZSBYTUxQSQotCSAqIAotCSAqIEBwYXJhbSBjYXIKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0N1cnNvckFmdGVyWE1MUEkoQ29udGVudEFzc2lzdFJlcXVlc3QgY2FyKSB7Ci0JCU5vZGUgYU5vZGUgPSBjYXIuZ2V0Tm9kZSgpOwotCQlib29sZWFuIHhtbHBpRm91bmQgPSBmYWxzZTsKLQkJRG9jdW1lbnQgcGFyZW50ID0gYU5vZGUuZ2V0T3duZXJEb2N1bWVudCgpOwotCQlpbnQgeG1scGlOb2RlUG9zaXRpb24gPSAtMTsKLQkJYm9vbGVhbiBpc0FmdGVyWE1MUEkgPSBmYWxzZTsKLQotCQlpZiAocGFyZW50ID09IG51bGwpCi0JCQlyZXR1cm4gdHJ1ZTsgLy8gYmxhbmsgZG9jdW1lbnQgY2FzZQotCi0JCWZvciAoTm9kZSBjaGlsZCA9IHBhcmVudC5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJYm9vbGVhbiB4bWxwaSA9IChjaGlsZC5nZXROb2RlVHlwZSgpID09IE5vZGUuUFJPQ0VTU0lOR19JTlNUUlVDVElPTl9OT0RFICYmIGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzKCJ4bWwiKSk7IC8vJE5PTi1OTFMtMSQKLQkJCXhtbHBpRm91bmQgPSB4bWxwaUZvdW5kIHx8IHhtbHBpOwotCQkJaWYgKHhtbHBpRm91bmQpIHsKLQkJCQlpZiAoY2hpbGQgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJCQl4bWxwaU5vZGVQb3NpdGlvbiA9ICgoSURPTU5vZGUpIGNoaWxkKS5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaXNBZnRlclhNTFBJID0gKGNhci5nZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oKSA+PSB4bWxwaU5vZGVQb3NpdGlvbik7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpc0FmdGVyWE1MUEk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNOYW1lUmVnaW9uKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgdHlwZSA9IHJlZ2lvbi5nZXRUeXBlKCk7Ci0JCXJldHVybiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHx8ICh0eXBlID09IERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfTkFNRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9BVFRMSVNUX0RFQ0xfTkFNRSkgfHwgKHR5cGUgPT0gRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfUk9PVF9UQUdfTkFNRSkgfHwgdHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfRElSRUNUSVZFX05BTUUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1b3RlKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHRyaW1tZWQgPSBzdHJpbmcudHJpbSgpOwotCQlpZiAodHJpbW1lZC5sZW5ndGgoKSA+IDApIHsKLQkJCXJldHVybiB0cmltbWVkLmNoYXJBdCgwKSA9PSAnXCcnIHx8IHRyaW1tZWQuY2hhckF0KDApID09ICciJzsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJpdmF0ZSBib29sZWFuIGlzU2VsZkNsb3NlZChJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RhcnRUYWcuZ2V0UmVnaW9ucygpOwotCQlyZXR1cm4gcmVnaW9ucy5nZXQocmVnaW9ucy5zaXplKCkgLSAxKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc1N0YXJ0VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24pIHsKLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKHNkUmVnaW9uLmdldFJlZ2lvbnMoKS5zaXplKCkgPiAwKSB7Ci0JCQlJVGV4dFJlZ2lvbiByID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpLmdldCgwKTsKLQkJCXJlc3VsdCA9IHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOICYmIHNkUmVnaW9uLmlzRW5kZWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBQcm9wZXJ0aWVzIG1hcFRvUHJvcGVydGllcyhDTU5hbWVkTm9kZU1hcCBtYXApIHsKLQkJUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBtYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJQ01FbnRpdHlEZWNsYXJhdGlvbiBkZWNsID0gKENNRW50aXR5RGVjbGFyYXRpb24pIG1hcC5pdGVtKGkpOwotCQkJcC5wdXQoZGVjbC5nZXROYW1lKCksIGRlY2wuZ2V0VmFsdWUoKSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogR2V0cyB0aGUgY29ycmVzcG9uZGluZyBYTUxOb2RlLCBhbmQgY2hlY2tzIGlmIGl0J3MgY2xvc2VkLgotCSAqIAotCSAqIEBwYXJhbSBzdGFydFRhZwotCSAqIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBuZWVkc0VuZFRhZyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0VGFnKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChmVGV4dFZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJdHJ5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCUlET01Ob2RlIHhtbE5vZGUgPSAoSURPTU5vZGUpIHNNb2RlbC5nZXRJbmRleGVkUmVnaW9uKHN0YXJ0VGFnLmdldFN0YXJ0KCkpOwotCQkJCWlmICghaXNTdGFydFRhZyhzdGFydFRhZykpCi0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWVsc2UgaWYgKGlzU2VsZkNsb3NlZChzdGFydFRhZykpCi0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWVsc2UgaWYgKCF4bWxOb2RlLmlzQ29udGFpbmVyKCkpCi0JCQkJCXJlc3VsdCA9IGZhbHNlOwotCQkJCWVsc2UKLQkJCQkJcmVzdWx0ID0geG1sTm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSA9PSBudWxsOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJaWYgKHNNb2RlbCAhPSBudWxsKQotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBuZXdDb250ZW50QXNzaXN0UmVxdWVzdChOb2RlIG5vZGUsIE5vZGUgcG9zc2libGVQYXJlbnQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24sIElUZXh0UmVnaW9uIGNvbXBsZXRpb25SZWdpb24sIGludCBiZWdpbiwgaW50IGxlbmd0aCwgU3RyaW5nIGZpbHRlcikgewotCQlyZXR1cm4gbmV3IENvbnRlbnRBc3Npc3RSZXF1ZXN0KG5vZGUsIHBvc3NpYmxlUGFyZW50LCBkb2N1bWVudFJlZ2lvbiwgY29tcGxldGlvblJlZ2lvbiwgYmVnaW4sIGxlbmd0aCwgZmlsdGVyKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotCQlmR2VuZXJhdG9yID0gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdGhlIHJlYXNvbiB3aHkgY29tcHV0ZVByb3Bvc2FscyB3YXMgbm90IGFibGUgdG8gZmluZCBhbnkKLQkgKiBjb21wbGV0aW9ucy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFcnJvck1lc3NhZ2UoU3RyaW5nIGVycm9yTWVzc2FnZSkgewotCQlmRXJyb3JNZXNzYWdlID0gZXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgYXBwZW5kKSB7Ci0JCXNldEVycm9yTWVzc2FnZShlcnJvck1lc3NhZ2UgKyBhcHBlbmQpOwotCX0KLQotCS8qKgotCSAqIFNldCB0aGUgcmVhc29uIHdoeSBjb21wdXRlUHJvcG9zYWxzIHdhcyBub3QgYWJsZSB0byBmaW5kIGFueQotCSAqIGNvbXBsZXRpb25zLgotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEVycm9yTWVzc2FnZShTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgcHJlcGVuZCwgU3RyaW5nIGFwcGVuZCkgewotCQlzZXRFcnJvck1lc3NhZ2UocHJlcGVuZCArIGVycm9yTWVzc2FnZSArIGFwcGVuZCk7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gc3RyaW5nc0VxdWFsKFN0cmluZyBhLCBTdHJpbmcgYikgewotCQkvLyAocGEpIDIyMTE5MCBtYXRjaGluZyBpbmRlcGVuZGVudCBvZiBjYXNlIHRvIGJlIGNvbnNpc3RhbnQgd2l0aCBKYXZhCi0JCS8vIGVkaXRvciBDQQotCQlyZXR1cm4gYS5lcXVhbHNJZ25vcmVDYXNlKGIpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTdhYzZjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0Fic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUhlbHBlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbnRlbnRNb2RlbEdlbmVyYXRvciB7Ci0KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gZ2VuZXJhdGVDaGlsZHJlbiA9IGZhbHNlOwotCi0JcHVibGljIEFic3RyYWN0Q29udGVudE1vZGVsR2VuZXJhdG9yKCkgewotCQlzdXBlcigpOwotCX0KLQotCXB1YmxpYyBhYnN0cmFjdCB2b2lkIGdlbmVyYXRlQXR0cmlidXRlKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIFN0cmluZ0J1ZmZlciBidWZmZXIpOwotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVBdHRyaWJ1dGVzKENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKSB7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyaWJ1dGVzID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQlnZW5lcmF0ZUF0dHJpYnV0ZSgoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5pdGVtKGkpLCBidWZmZXIpOwotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZUVuZFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcik7Ci0KLQlwdWJsaWMgdm9pZCBnZW5lcmF0ZVJlcXVpcmVkQ2hpbGRyZW4oTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZ2VuZXJhdGVDaGlsZHJlbikgewotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBnZW5lcmF0ZVN0YXJ0VGFnKFN0cmluZyB0YWdOYW1lLCBOb2RlIHBhcmVudE5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsLCBTdHJpbmdCdWZmZXIgYnVmZmVyKTsKLQotCXB1YmxpYyB2b2lkIGdlbmVyYXRlVGFnKE5vZGUgcGFyZW50LCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCB8fCBidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQlTdHJpbmcgdGFnTmFtZSA9IGdldFJlcXVpcmVkTmFtZShwYXJlbnQsIGVsZW1lbnREZWNsKTsKLQotCQlnZW5lcmF0ZVN0YXJ0VGFnKHRhZ05hbWUsIHBhcmVudCwgZWxlbWVudERlY2wsIGJ1ZmZlcik7Ci0JCWdlbmVyYXRlUmVxdWlyZWRDaGlsZHJlbihwYXJlbnQsIGVsZW1lbnREZWNsLCBidWZmZXIpOwotCQlnZW5lcmF0ZUVuZFRhZyh0YWdOYW1lLCBwYXJlbnQsIGVsZW1lbnREZWNsLCBidWZmZXIpOwotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIGFic3RyYWN0IGludCBnZXRNaW5pbWFsU3RhcnRUYWdMZW5ndGgoTm9kZSBub2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCk7Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkTmFtZShOb2RlIG93bmVyTm9kZSwgQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAob3duZXJOb2RlICE9IG51bGwpIHsKLQkJCXJldHVybiBET01OYW1lc3BhY2VIZWxwZXIuY29tcHV0ZU5hbWUoY21ub2RlLCBvd25lck5vZGUsIG51bGwpOwotCQl9Ci0JCXJldHVybiBjbW5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQl9Ci0KLQlwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0YXJ0VGFnQ2xvc2UoTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCk7Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiByZXF1aXJlc0F0dHJpYnV0ZXMoQ01FbGVtZW50RGVjbGFyYXRpb24gZWQpIHsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGVkLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCWlmICgoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuaXRlbShpKSkuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKQotCQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTg3YjY1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC51dGlsLkFzc2VydDsKLQotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIElDb250ZXh0SW5mb3JtYXRpb24uIEFkZHMga25vd2xlZGdlIGFib3V0IHRoZSBpbmZvcm1hdGlvbgotICogZGlzcGxheSBzdHJpbmcgc3VjaCBhcyByZXF1aXJlZCBhdHRyaWJ1dGVzIGZvciB0aGlzIGNvbnRleHQuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24gaW1wbGVtZW50cyBJQ29udGV4dEluZm9ybWF0aW9uIHsKLQlwcml2YXRlIEhhc2hNYXAgZkF0dHIyUmFuZ2VNYXA7Ci0JLyoqIFRoZSBuYW1lIG9mIHRoZSBjb250ZXh0ICovCi0JcHJpdmF0ZSBTdHJpbmcgZkNvbnRleHREaXNwbGF5U3RyaW5nOwotCS8qKiBUaGUgaW1hZ2UgdG8gYmUgZGlzcGxheWVkICovCi0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0JLyoqIFRoZSBpbmZvcm1hdGlvbiB0byBiZSBkaXNwbGF5ZWQgKi8KLQlwcml2YXRlIFN0cmluZyBmSW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nOwotCXByaXZhdGUgaW50IGZQb3NpdGlvbjsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBpbmZvcm1hdGlvbiB3aXRoIGFuIGltYWdlLgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZQotCSAqICAgICAgICAgICAgdGhlIGltYWdlIHRvIGRpc3BsYXkgd2hlbiBwcmVzZW50aW5nIHRoZSBjb250ZXh0IGluZm9ybWF0aW9uCi0JICogQHBhcmFtIGNvbnRleHREaXNwbGF5U3RyaW5nCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgd2hlbiBwcmVzZW50aW5nIHRoZSBjb250ZXh0Ci0JICogQHBhcmFtIGluZm9ybWF0aW9uRGlzcGxheVN0cmluZwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQgd2hlbiBwcmVzZW50aW5nIHRoZSBjb250ZXh0Ci0JICogICAgICAgICAgICBpbmZvcm1hdGlvbiwgbWF5IG5vdCBiZSA8Y29kZT5udWxsPC9jb2RlPgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24oSW1hZ2UgaW1hZ2UsIFN0cmluZyBjb250ZXh0RGlzcGxheVN0cmluZywgU3RyaW5nIGluZm9ybWF0aW9uRGlzcGxheVN0cmluZywgSGFzaE1hcCBhdHRyMlJhbmdlTWFwKSB7Ci0JCUFzc2VydC5pc05vdE51bGwoaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nLCAiaWxsZWdhbCBhcmd1bWVudDogaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nIGNhbiBub3QgYmUgbnVsbCIpOyAvLyROT04tTkxTLTEkCi0KLQkJZkltYWdlID0gaW1hZ2U7Ci0JCWZDb250ZXh0RGlzcGxheVN0cmluZyA9IGNvbnRleHREaXNwbGF5U3RyaW5nOwotCQlmSW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nID0gaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nOwotCQlmQXR0cjJSYW5nZU1hcCA9IGF0dHIyUmFuZ2VNYXA7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIG5ldyBjb250ZXh0IGluZm9ybWF0aW9uIHdpdGhvdXQgYW4gaW1hZ2UuCi0JICogCi0JICogQHBhcmFtIGNvbnRleHREaXNwbGF5U3RyaW5nCi0JICogICAgICAgICAgICB0aGUgc3RyaW5nIHRvIGJlIHVzZWQgd2hlbiBwcmVzZW50aW5nIHRoZSBjb250ZXh0Ci0JICogQHBhcmFtIGluZm9ybWF0aW9uRGlzcGxheVN0cmluZwotCSAqICAgICAgICAgICAgdGhlIHN0cmluZyB0byBiZSBkaXNwbGF5ZWQgd2hlbiBwcmVzZW50aW5nIHRoZSBjb250ZXh0Ci0JICogICAgICAgICAgICBpbmZvcm1hdGlvbgotCSAqLwotCXB1YmxpYyBBdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb24oU3RyaW5nIGNvbnRleHREaXNwbGF5U3RyaW5nLCBTdHJpbmcgaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nLCBIYXNoTWFwIGF0dHIyUmFuZ2VNYXApIHsKLQkJdGhpcyhudWxsLCBjb250ZXh0RGlzcGxheVN0cmluZywgaW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nLCBhdHRyMlJhbmdlTWFwKTsKLQl9Ci0KLQkvKioKLQkgKiBNYXBzIChTdHJpbmcgLT4gUG9zaXRpb24pLiBUaGUgYXR0cmlidXRlIG5hbWUgdG8gdGhlIFRleHQgcG9zaXRpb24uCi0JICogCi0JICogCi0JICovCi0JcHVibGljIEhhc2hNYXAgZ2V0QXR0cjJSYW5nZU1hcCgpIHsKLQkJcmV0dXJuIGZBdHRyMlJhbmdlTWFwOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24jZ2V0Q29udGV4dERpc3BsYXlTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dERpc3BsYXlTdHJpbmcoKSB7Ci0JCWlmIChmQ29udGV4dERpc3BsYXlTdHJpbmcgIT0gbnVsbCkKLQkJCXJldHVybiBmQ29udGV4dERpc3BsYXlTdHJpbmc7Ci0JCXJldHVybiBmSW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25FeHRlbnNpb24jZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKQotCSAqLwotCXB1YmxpYyBpbnQgZ2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oKSB7Ci0JCXJldHVybiBmUG9zaXRpb247Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbiNnZXRJbWFnZSgpCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKCkgewotCQlyZXR1cm4gZkltYWdlOwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24jZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uRGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIGZJbmZvcm1hdGlvbkRpc3BsYXlTdHJpbmc7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0Q29udGV4dEluZm9ybWF0aW9uUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0JCWZQb3NpdGlvbiA9IHBvc2l0aW9uOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5Y2ZkZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25QcmVzZW50ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLlN0eWxlUmFuZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLQotCi0vKioKLSAqIFJlc3BvbnNpYmxlIGZvciB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBjb250ZXh0IGluZm8gcG9wdXAuIFRoaXMgaW5jbHVkZXMKLSAqIHRleHQgc3R5bGUsIGFuZCB3aGVuIHRoZSB3aW5kb3cgc2hvdWxkIGNsb3NlLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyIGltcGxlbWVudHMgSUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciwgSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBpbnQgZkRvY3VtZW50UG9zaXRpb24gPSAtMTsKLQotCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvbiBmSW5mbyA9IG51bGw7Ci0JcHJpdmF0ZSBDb250ZXh0SW5mb01vZGVsVXRpbCBmTW9kZWxVdGlsID0gbnVsbDsKLQlwcml2YXRlIElUZXh0Vmlld2VyIGZWaWV3ZXIgPSBudWxsOwotCi0JcHVibGljIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yI2luc3RhbGwob3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZXh0SW5mb3JtYXRpb24sCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChJQ29udGV4dEluZm9ybWF0aW9uIGluZm8sIElUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJZkluZm8gPSBpbmZvOwotCQlmVmlld2VyID0gdmlld2VyOwotCQlmRG9jdW1lbnRQb3NpdGlvbiA9IGRvY3VtZW50UG9zaXRpb247Ci0JCWZNb2RlbFV0aWwgPSBuZXcgQ29udGV4dEluZm9Nb2RlbFV0aWwoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIGZWaWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0JfQotCi0JLyoqCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvciNpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0NvbnRleHRJbmZvcm1hdGlvblZhbGlkKGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCS8vIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGNvbnRleHQgaW5mbyBzaG91bGQgc3RpbGwgYmUKLQkJLy8gc2hvd2luZy4uLgotCQkvLyBpZiBjdXJzb3Igc3RpbGwgd2l0aGluIHRoZSBlbGVtZW50IGl0J3MgdmFsaWQuLi4KLQkJYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLQkJaWYgKGZNb2RlbFV0aWwgIT0gbnVsbCkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFJlZ2lvbiA9IGZNb2RlbFV0aWwuZ2V0WE1MTm9kZShmRG9jdW1lbnRQb3NpdGlvbikuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWludCBzdGFydCA9IHN0YXJ0UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlpbnQgZW5kID0gc3RhcnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQlyZXN1bHQgPSBkb2N1bWVudFBvc2l0aW9uIDwgZW5kICYmIGRvY3VtZW50UG9zaXRpb24gPiBzdGFydCArIDE7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uUHJlc2VudGVyI3VwZGF0ZVByZXNlbnRhdGlvbihpbnQsCi0JICogICAgICBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRQcmVzZW50YXRpb24pCi0JICovCi0JcHVibGljIGJvb2xlYW4gdXBkYXRlUHJlc2VudGF0aW9uKGludCBkb2N1bWVudFBvc2l0aW9uLCBUZXh0UHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbikgewotCQlwcmVzZW50YXRpb24uY2xlYXIoKTsKLQotCQlpZiAoIShmSW5mbyBpbnN0YW5jZW9mIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbikpCi0JCQlyZXR1cm4gZmFsc2U7Ci0KLQkJLy8gaXRlcmF0ZSBleGlzdGluZyBhdHRyaWJ1dGVzIGZyb20gY3VycmVudCBub2RlCi0JCUlET01Ob2RlIHhtbE5vZGUgPSBmTW9kZWxVdGlsLmdldFhNTE5vZGUoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSB4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc2RSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJU3RyaW5nIGF0dHJOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJT2JqZWN0IHRlbXAgPSBudWxsOwotCQlQb3NpdGlvbiBwID0gbnVsbDsKLQkJSGFzaE1hcCBtYXAgPSAoKEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvbikgZkluZm8pLmdldEF0dHIyUmFuZ2VNYXAoKTsKLQotCQkvLyBzbyB3ZSBjYW4gYWRkIHJhbmdlcyBpbiBvcmRlcgotCQlTdHlsZVJhbmdlW10gc29ydGVkID0gbmV3IFN0eWxlUmFuZ2VbZkluZm8uZ2V0SW5mb3JtYXRpb25EaXNwbGF5U3RyaW5nKCkubGVuZ3RoKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCQlhdHRyTmFtZSA9IHNkUmVnaW9uLmdldFRleHQocik7Ci0JCQkJdGVtcCA9IG1hcC5nZXQoYXR0ck5hbWUpOwotCQkJCWlmICh0ZW1wICE9IG51bGwpIHsKLQkJCQkJcCA9IChQb3NpdGlvbikgdGVtcDsKLQkJCQkJc29ydGVkW3Aub2Zmc2V0XSA9IG5ldyBTdHlsZVJhbmdlKHAub2Zmc2V0LCBwLmxlbmd0aCwgbnVsbCwgbnVsbCwgU1dULkJPTEQpOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBzdHlsZSByYW5nZXMgbmVlZCB0byBiZSBhZGRlZCBpbiBvcmRlcgotCQlTdHlsZVJhbmdlIHNyID0gbnVsbDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyBpKyspIHsKLQkJCXNyID0gc29ydGVkW2ldOwotCQkJaWYgKHNyICE9IG51bGwpCi0JCQkJcHJlc2VudGF0aW9uLmFkZFN0eWxlUmFuZ2Uoc3IpOwotCQl9Ci0JCXJldHVybiB0cnVlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9BdHRyaWJ1dGVDb250ZXh0SW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjM0ZWM0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0F0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LkNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Ob2RlTGlzdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotLyoqCi0gKiBDYWxjdWxhdGVzIGF0dHJpYnV0ZSBjb250ZXh0IGluZm9ybWF0aW9uIGJhc2VkIG9uIGEgU3RydWN0dWVkRG9jdW1lbnQgYW5kCi0gKiBkb2N1bWVudCBwb3NpdGlvbi4KLSAqIAotICogQGF1dGhvciBwYXZlcnkKLSAqLwotY2xhc3MgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIgewotCXByaXZhdGUgZmluYWwgSUNvbnRleHRJbmZvcm1hdGlvbltdIEVNUFRZX0NPTlRFWFRfSU5GTyA9IG5ldyBJQ29udGV4dEluZm9ybWF0aW9uWzBdOwotCXByaXZhdGUgQ29tcGFyYXRvciBmQ29tcGFyYXRvcjsKLQotCXByaXZhdGUgSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCXByaXZhdGUgQ29udGV4dEluZm9Nb2RlbFV0aWwgZk1vZGVsVXRpbCA9IG51bGw7Ci0KLQlwdWJsaWMgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uUHJvdmlkZXIoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MsIEF0dHJpYnV0ZUNvbnRleHRJbmZvcm1hdGlvblByZXNlbnRlciBwcmVzZW50ZXIpIHsKLQkJZkRvY3VtZW50ID0gZG9jOwotCQlmTW9kZWxVdGlsID0gbmV3IENvbnRleHRJbmZvTW9kZWxVdGlsKGZEb2N1bWVudCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHNkUmVnaW9uCi0JIAotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjYW5Qcm9wb3NlSW5mbyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0JCWlmIChzZFJlZ2lvbiAhPSBudWxsICYmIGlzRW5kVGFnKHNkUmVnaW9uKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJZWxzZQotCQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb25bXSBnZXRBdHRyaWJ1dGVJbmZvcm1hdGlvbihpbnQgb2Zmc2V0KSB7Ci0JCS8qCi0JCSAqIG5lZWQgdG8gdGFrZSBjYXJlIG9mIHNwZWNpYWwgY2FzZXMgdy8gYW1iaWd1b3VzIHJlZ2lvbnMgPHRhZz58Ci0JCSAqIDwvdGFnPiBhbHNvIGVuZCB0YWdzLi4KLQkJICovCi0JCUlDb250ZXh0SW5mb3JtYXRpb25bXSByZXN1bHRzID0gRU1QVFlfQ09OVEVYVF9JTkZPOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24gPSBmTW9kZWxVdGlsLmdldERvY3VtZW50KCkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJaWYgKCFjYW5Qcm9wb3NlSW5mbyhzZFJlZ2lvbikpCi0JCQlyZXR1cm4gRU1QVFlfQ09OVEVYVF9JTkZPOwotCi0JCUlET01Ob2RlIG5vZGUgPSBmTW9kZWxVdGlsLmdldFhNTE5vZGUob2Zmc2V0KTsKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDoKLQkJCQkJcmVzdWx0cyA9IGdldEluZm9Gb3JFbGVtZW50KG5vZGUpOwotCQkJCQlicmVhazsKLQkJCS8vIGZ1dHVyZS4uLgotCQkJLy8JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDoKLQkJCS8vCQkJCXJlc3VsdHMgPSBnZXRJbmZvRm9yVGV4dChub2RlKTsKLQkJCS8vCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHRzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSBjb21wYXJhdG9yIHRoYXQgY29tcGFyZXMgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBuYW1lcy4KLQkgKiAKLQkgIHRoZSBjb21wYXJhdG9yCi0JICovCi0JcHJpdmF0ZSBDb21wYXJhdG9yIGdldENNQXR0cmlidXRlQ29tcGFyYXRvcigpIHsKLQkJaWYgKGZDb21wYXJhdG9yID09IG51bGwpCi0JCQlmQ29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCkgewotCQkJCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJCQlyZXR1cm4gKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBvMSkuZ2V0QXR0ck5hbWUoKS5jb21wYXJlVG8oKChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBvMikuZ2V0QXR0ck5hbWUoKSk7Ci0JCQkJfQotCQkJfTsKLQkJcmV0dXJuIGZDb21wYXJhdG9yOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBub2RlCi0JIAotCSAqLwotCXByaXZhdGUgSUNvbnRleHRJbmZvcm1hdGlvbltdIGdldEluZm9Gb3JFbGVtZW50KElET01Ob2RlIG5vZGUpIHsKLQkJSUNvbnRleHRJbmZvcm1hdGlvbltdIHJlc3VsdHMgPSBFTVBUWV9DT05URVhUX0lORk87Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBmTW9kZWxVdGlsLmdldE1vZGVsUXVlcnkoKS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCWlmIChkZWNsICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBkZWNsLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkJU3RyaW5nIGF0dHJDb250ZXh0U3RyaW5nID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQkJU3RyaW5nQnVmZmVyIGF0dHJJbmZvID0gbmV3IFN0cmluZ0J1ZmZlcigiICIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbmFtZSA9ICIiOyAvLyROT04tTkxTLTEkCi0JCQlIYXNoTWFwIGF0dHJQb3NNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQkJaW50IHBvcyA9IDA7Ci0JCQlpbnQgbGVuZ3RoID0gMDsKLQkJCWludCBudW1QZXJMaW5lID0gODsKLQotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbltdIHNvcnRlZEF0dHJzID0gZ2V0U29ydGVkQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKLQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzb3J0ZWRBdHRycy5sZW5ndGg7IGkrKykgewotCQkJCW5hbWUgPSBzb3J0ZWRBdHRyc1tpXS5nZXRBdHRyTmFtZSgpOwotCQkJCWxlbmd0aCA9IG5hbWUubGVuZ3RoKCk7Ci0JCQkJcG9zID0gYXR0ckluZm8ubGVuZ3RoKCk7Ci0KLQkJCQlhdHRySW5mby5hcHBlbmQobmFtZSk7Ci0KLQkJCQlpZiAoc29ydGVkQXR0cnNbaV0uZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCWF0dHJJbmZvLmFwcGVuZCgiKiIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWxlbmd0aCsrOwotCQkJCX0KLQkJCQlpZiAoaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCkgLSAxKSB7Ci0JCQkJCWF0dHJJbmZvLmFwcGVuZCgiICIpOyAvLyROT04tTkxTLTEkCi0JCQkJCWlmIChpICE9IDAgJiYgaSAlIG51bVBlckxpbmUgPT0gMCkKLQkJCQkJCWF0dHJJbmZvLmFwcGVuZCgiXG4gIik7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYXR0clBvc01hcC5wdXQobmFtZSwgbmV3IFBvc2l0aW9uKHBvcywgbGVuZ3RoKSk7Ci0JCQl9Ci0JCQlpZiAoIWF0dHJJbmZvLnRvU3RyaW5nKCkudHJpbSgpLmVxdWFscygiIikpIC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gbmV3IElDb250ZXh0SW5mb3JtYXRpb25bXXtuZXcgQXR0cmlidXRlQ29udGV4dEluZm9ybWF0aW9uKGF0dHJDb250ZXh0U3RyaW5nLCBhdHRySW5mby50b1N0cmluZygpLCBhdHRyUG9zTWFwKX07Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIG5vZGUKLQkgCi0JICovCi0JIElDb250ZXh0SW5mb3JtYXRpb25bXSBnZXRJbmZvRm9yVGV4dChJRE9NTm9kZSBub2RlKSB7Ci0JCU5vZGUgcGFyZW50ID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCVN0cmluZyBjb250ZXh0U3RyaW5nID0gbm9kZS5nZXROb2RlTmFtZSgpOwotCQlTdHJpbmdCdWZmZXIgaW5mbyA9IG5ldyBTdHJpbmdCdWZmZXIoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAocGFyZW50ICE9IG51bGwgJiYgcGFyZW50LmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKLQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGRlY2wgPSBmTW9kZWxVdGlsLmdldE1vZGVsUXVlcnkoKS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgcGFyZW50KTsKLQkJCUNNQ29udGVudCBjb250ZW50ID0gZGVjbC5nZXRDb250ZW50KCk7Ci0JCQlpZiAoY29udGVudCBpbnN0YW5jZW9mIENNR3JvdXApIHsKLQkJCQlDTUdyb3VwIGNtR3JvdXAgPSAoQ01Hcm91cCkgY29udGVudDsKLQkJCQlDTU5vZGVMaXN0IGNoaWxkcmVuID0gY21Hcm91cC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkJQ01Ob2RlIGNtTm9kZSA9IG51bGw7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCWNtTm9kZSA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkJCWNvbnRleHRTdHJpbmcgPSBjbU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJaWYgKGNvbnRleHRTdHJpbmcgIT0gbnVsbCkgewotCQkJCQkJaW5mby5hcHBlbmQoIjwiICsgY21Ob2RlLmdldE5vZGVOYW1lKCkgKyAiPiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCWlmIChpIDwgY2hpbGRyZW4uZ2V0TGVuZ3RoKCkgLSAxKQotCQkJCQkJCWluZm8uYXBwZW5kKCIgIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoIWluZm8udG9TdHJpbmcoKS50cmltKCkuZXF1YWxzKCIiKSkgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIG5ldyBJQ29udGV4dEluZm9ybWF0aW9uW117bmV3IENvbnRleHRJbmZvcm1hdGlvbihjb250ZXh0U3RyaW5nLCBpbmZvLnRvU3RyaW5nKCkpfTsKLQkJZWxzZQotCQkJcmV0dXJuIEVNUFRZX0NPTlRFWFRfSU5GTzsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHNvcnRlZCBhcnJheSBvZiBDTUF0dHJpYnV0ZURlY2xhcmF0aW9ucy4KLQkgKiAKLQkgKiBAcGFyYW0gYXR0cmlidXRlcwotCSAKLQkgKi8KLQlwcml2YXRlIENNQXR0cmlidXRlRGVjbGFyYXRpb25bXSBnZXRTb3J0ZWRBdHRyaWJ1dGVzKENNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMpIHsKLQkJTGlzdCBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKQotCQkJc29ydGVkLmFkZChhdHRyaWJ1dGVzLml0ZW0oaSkpOwotCQlDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZCwgZ2V0Q01BdHRyaWJ1dGVDb21wYXJhdG9yKCkpOwotCQlyZXR1cm4gKENNQXR0cmlidXRlRGVjbGFyYXRpb25bXSkgc29ydGVkLnRvQXJyYXkobmV3IENNQXR0cmlidXRlRGVjbGFyYXRpb25bc29ydGVkLnNpemUoKV0pOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBzZFJlZ2lvbgotCSAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNFbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbikgewotCQlJVGV4dFJlZ2lvbkxpc3QgcmVnaW9ucyA9IHNkUmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJcmV0dXJuIHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU47Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0NvbnRlbnRBc3Npc3RSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZTFiZDEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGVudEFzc2lzdFJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db2xsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS51dGlscy5TdHJpbmdVdGlsczsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0KLXB1YmxpYyBjbGFzcyBDb250ZW50QXNzaXN0UmVxdWVzdCB7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZG9jdW1lbnRSZWdpb24gPSBudWxsOwotCXByb3RlY3RlZCBMaXN0IG1hY3JvcyA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgU3RyaW5nIG1hdGNoU3RyaW5nOwotCXByb3RlY3RlZCBOb2RlIG5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBOb2RlIHBhcmVudCA9IG51bGw7Ci0JcHJvdGVjdGVkIExpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCXByb3RlY3RlZCBJVGV4dFJlZ2lvbiByZWdpb24gPSBudWxsOwotCXByb3RlY3RlZCBpbnQgcmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uOwotCXByb3RlY3RlZCBpbnQgcmVwbGFjZW1lbnRMZW5ndGg7Ci0KLQkvLwlwcml2YXRlIEJvb2xlYW4gc2VwYXJhdGUgPSBudWxsOyAvLyAocGEpIG5vdCB1c2VkCi0JLy8JcHJpdmF0ZSBCb29sZWFuIHNvcnQgPSBudWxsOyAvLyAocGEpIG5vdCB1c2VkCi0JLyoqCi0JICogWE1MQ29udGVudEFzc2lzdFJlcXVlc3QgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgQ29udGVudEFzc2lzdFJlcXVlc3QoTm9kZSBub2RlLCBOb2RlIHBhcmVudCwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBkb2N1bWVudFJlZ2lvbiwgSVRleHRSZWdpb24gY29tcGxldGlvblJlZ2lvbiwgaW50IGJlZ2luLCBpbnQgbGVuZ3RoLCBTdHJpbmcgZmlsdGVyKSB7Ci0JCXN1cGVyKCk7Ci0JCXNldE5vZGUobm9kZSk7Ci0JCXNldFBhcmVudChwYXJlbnQpOwotCQlzZXREb2N1bWVudFJlZ2lvbihkb2N1bWVudFJlZ2lvbik7Ci0JCXNldFJlZ2lvbihjb21wbGV0aW9uUmVnaW9uKTsKLQkJc2V0TWF0Y2hTdHJpbmcoZmlsdGVyKTsKLQkJc2V0UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uKGJlZ2luKTsKLQkJc2V0UmVwbGFjZW1lbnRMZW5ndGgobGVuZ3RoKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBhZGRNYWNybyhJQ29tcGxldGlvblByb3Bvc2FsIG5ld1Byb3Bvc2FsKSB7Ci0JCW1hY3Jvcy5hZGQobmV3UHJvcG9zYWwpOwotCX0KLQotCXB1YmxpYyB2b2lkIGFkZFByb3Bvc2FsKElDb21wbGV0aW9uUHJvcG9zYWwgbmV3UHJvcG9zYWwpIHsKLQkJcHJvcG9zYWxzLmFkZChuZXdQcm9wb3NhbCk7Ci0JfQotCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxzKCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsIHJlc3VsdHNbXSA9IG51bGw7Ci0JCWlmIChnZXRQcm9wb3NhbHMoKS5zaXplKCkgPiAwIHx8IGdldE1hY3JvcygpLnNpemUoKSA+IDApIHsKLQkJCUxpc3QgYWxsUHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJaWYgKCFzaG91bGRTZXBhcmF0ZSgpKSB7Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChnZXRQcm9wb3NhbHMoKSk7Ci0JCQkJLy8gc2hvdWxkIGJlIGVtcHR5LCBhcyBhbGwgbWFjcm9zIHNob3VsZCBoYXZlIGdvbmUgaW50byB0aGUKLQkJCQkvLyBwcm9wb3NhbCBsaXN0Ci0JCQkJYWxsUHJvcG9zYWxzLmFkZEFsbChnZXRNYWNyb3MoKSk7Ci0JCQkJYWxsUHJvcG9zYWxzID0gc29ydFByb3Bvc2FscyhhbGxQcm9wb3NhbHMpOwotCQkJfSBlbHNlIHsKLQkJCQlhbGxQcm9wb3NhbHMuYWRkQWxsKHNvcnRQcm9wb3NhbHMoZ2V0UHJvcG9zYWxzKCkpKTsKLQkJCQlhbGxQcm9wb3NhbHMuYWRkQWxsKHNvcnRQcm9wb3NhbHMoZ2V0TWFjcm9zKCkpKTsKLQkJCX0KLQotCQkJcmVzdWx0cyA9IG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW2FsbFByb3Bvc2Fscy5zaXplKCldOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxQcm9wb3NhbHMuc2l6ZSgpOyBpKyspIHsKLQkJCQlyZXN1bHRzW2ldID0gKElDb21wbGV0aW9uUHJvcG9zYWwpIGFsbFByb3Bvc2Fscy5nZXQoaSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdHM7Ci0JfQotCi0KLQlwdWJsaWMgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBnZXREb2N1bWVudFJlZ2lvbigpIHsKLQkJcmV0dXJuIGRvY3VtZW50UmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0TWFjcm9zKCkgewotCQlyZXR1cm4gbWFjcm9zOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldE1hdGNoU3RyaW5nKCkgewotCQlyZXR1cm4gbWF0Y2hTdHJpbmc7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIG5vZGU7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBvcmcudzNjLmRvbS5Ob2RlCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gcGFyZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS51dGlsLkxpc3QKLQkgKi8KLQlwdWJsaWMgamF2YS51dGlsLkxpc3QgZ2V0UHJvcG9zYWxzKCkgewotCQlyZXR1cm4gcHJvcG9zYWxzOwotCX0KLQotCXB1YmxpYyBJVGV4dFJlZ2lvbiBnZXRSZWdpb24oKSB7Ci0JCXJldHVybiByZWdpb247Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHJldHVybiBpbnQKLQkgKi8KLQlwdWJsaWMgaW50IGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpIHsKLQkJcmV0dXJuIHJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbjsKLQl9Ci0KLQkvKioKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSB7Ci0JCXJldHVybiByZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldFN0YXJ0T2Zmc2V0KCkgewotCQlpZiAoZ2V0RG9jdW1lbnRSZWdpb24oKSAhPSBudWxsICYmIGdldFJlZ2lvbigpICE9IG51bGwpCi0JCQlyZXR1cm4gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIGdldERvY3VtZW50UmVnaW9uKCkpLmdldFN0YXJ0T2Zmc2V0KGdldFJlZ2lvbigpKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKLQkJaWYgKGdldERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCAmJiBnZXRSZWdpb24oKSAhPSBudWxsKQotCQkJcmV0dXJuICgoSVRleHRSZWdpb25Db2xsZWN0aW9uKSBnZXREb2N1bWVudFJlZ2lvbigpKS5nZXRUZXh0KGdldFJlZ2lvbigpKTsKLQkJcmV0dXJuICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIGludCBnZXRUZXh0RW5kT2Zmc2V0KCkgewotCQlpZiAoZ2V0RG9jdW1lbnRSZWdpb24oKSAhPSBudWxsICYmIGdldFJlZ2lvbigpICE9IG51bGwpCi0JCQlyZXR1cm4gKChJVGV4dFJlZ2lvbkNvbGxlY3Rpb24pIGdldERvY3VtZW50UmVnaW9uKCkpLmdldFRleHRFbmRPZmZzZXQoZ2V0UmVnaW9uKCkpOwotCQlyZXR1cm4gLTE7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHJlZ2lvbgotCSAqLwotCXB1YmxpYyB2b2lkIHNldERvY3VtZW50UmVnaW9uKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcmVnaW9uKSB7Ci0JCWRvY3VtZW50UmVnaW9uID0gcmVnaW9uOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdNYXRjaFN0cmluZwotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE1hdGNoU3RyaW5nKGphdmEubGFuZy5TdHJpbmcgbmV3TWF0Y2hTdHJpbmcpIHsKLQkJbWF0Y2hTdHJpbmcgPSBuZXdNYXRjaFN0cmluZzsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3Tm9kZQotCSAqICAgICAgICAgICAgb3JnLnczYy5kb20uTm9kZQotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGUob3JnLnczYy5kb20uTm9kZSBuZXdOb2RlKSB7Ci0JCW5vZGUgPSBuZXdOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdQYXJlbnQKLQkgKiAgICAgICAgICAgIG9yZy53M2MuZG9tLk5vZGUKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQYXJlbnQob3JnLnczYy5kb20uTm9kZSBuZXdQYXJlbnQpIHsKLQkJcGFyZW50ID0gbmV3UGFyZW50OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdSZWdpb24KLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZWdpb24oSVRleHRSZWdpb24gbmV3UmVnaW9uKSB7Ci0JCXJlZ2lvbiA9IG5ld1JlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gbmV3UmVwbGFjZW1lbnRCZWdpblBvc2l0aW9uCi0JICogICAgICAgICAgICBpbnQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudEJlZ2luUG9zaXRpb24oaW50IG5ld1JlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbikgewotCQlyZXBsYWNlbWVudEJlZ2luUG9zaXRpb24gPSBuZXdSZXBsYWNlbWVudEJlZ2luUG9zaXRpb247Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCBzZXRSZXBsYWNlbWVudExlbmd0aChpbnQgbmV3UmVwbGFjZW1lbnRMZW5ndGgpIHsKLQkJcmVwbGFjZW1lbnRMZW5ndGggPSBuZXdSZXBsYWNlbWVudExlbmd0aDsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBzaG91bGRTZXBhcmF0ZSgpIHsKLQkJLyoKLQkJICogaWYgKHNlcGFyYXRlID09IG51bGwpIHsgUHJlZmVyZW5jZU1hbmFnZXIgbWFuYWdlciA9Ci0JCSAqIGdldFByZWZlcmVuY2VNYW5hZ2VyKCk7IGlmKG1hbmFnZXIgPT0gbnVsbCkgeyBzZXBhcmF0ZSA9Ci0JCSAqIEJvb2xlYW4uRkFMU0U7IH0gZWxzZSB7IEVsZW1lbnQgY2FTZXR0aW5ncyA9Ci0JCSAqIG1hbmFnZXIuZ2V0RWxlbWVudChQcmVmZXJlbmNlTmFtZXMuQ09OVEVOVF9BU1NJU1QpOyBzZXBhcmF0ZSA9IG5ldwotCQkgKiBCb29sZWFuKGNhU2V0dGluZ3MuZ2V0QXR0cmlidXRlKFByZWZlcmVuY2VOYW1lcy5TRVBBUkFURSkuZXF1YWxzKFByZWZlcmVuY2VOYW1lcy5UUlVFKSk7IH0gfQotCQkgKiByZXR1cm4gc2VwYXJhdGUuYm9vbGVhblZhbHVlKCk7Ci0JCSAqLwotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHJvdGVjdGVkIExpc3Qgc29ydFByb3Bvc2FscyhMaXN0IHByb3Bvc2Fsc0luKSB7Ci0JCUNvbGxlY3Rpb25zLnNvcnQocHJvcG9zYWxzSW4sIG5ldyBQcm9wb3NhbENvbXBhcmF0b3IoKSk7Ci0JCXJldHVybiBwcm9wb3NhbHNJbjsKLQotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIHRvU3RyaW5nKCkgewotCQlyZXR1cm4gIk5vZGU6ICIgKyBnZXROb2RlKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcblBhcmVudDogIiArIGdldFBhcmVudCgpIC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5TdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb246ICIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0RG9jdW1lbnRSZWdpb24oKS50b1N0cmluZygpKSAvLyROT04tTkxTLTEkCi0JCQkJCSsgIlxuUmVnaW9uOiAiICsgZ2V0UmVnaW9uKCkgLy8kTk9OLU5MUy0xJAotCQkJCQkrICJcbk1hdGNoIHN0cmluZzogJyIgKyBTdHJpbmdVdGlscy5lc2NhcGUoZ2V0TWF0Y2hTdHJpbmcoKSkgKyAiJyIgLy8kTk9OLU5MUy0yJC8vJE5PTi1OTFMtMSQKLQkJCQkJKyAiXG5PZmZzZXRzOiBbIiArIGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgIi0iICsgKGdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpICsgZ2V0UmVwbGFjZW1lbnRMZW5ndGgoKSkgKyAiXVxuIjsgLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZXh0SW5mb01vZGVsVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ29udGV4dEluZm9Nb2RlbFV0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmUzOGU0Zi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Db250ZXh0SW5mb01vZGVsVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLQotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBDb250ZXh0SW5mb01vZGVsVXRpbCB7Ci0JSVN0cnVjdHVyZWREb2N1bWVudCBmRG9jdW1lbnQgPSBudWxsOwotCi0JQ29udGV4dEluZm9Nb2RlbFV0aWwoSVN0cnVjdHVyZWREb2N1bWVudCBkb2MpIHsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQotCXB1YmxpYyBJU3RydWN0dXJlZERvY3VtZW50IGdldERvY3VtZW50KCkgewotCQlyZXR1cm4gZkRvY3VtZW50OwotCX0KLQotCXB1YmxpYyBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoKSB7Ci0JCU1vZGVsUXVlcnkgbXEgPSBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgeG1sTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KHhtbE1vZGVsKTsKLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmICh4bWxNb2RlbCAhPSBudWxsKSB7Ci0JCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG1xOwotCX0KLQotCXB1YmxpYyBJRE9NTm9kZSBnZXRYTUxOb2RlKGludCBvZmZzZXQpIHsKLQkJSVN0cnVjdHVyZWRNb2RlbCB4bWxNb2RlbCA9IG51bGw7Ci0JCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQl0cnkgewotCQkJeG1sTW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJeG1sTm9kZSA9IChJRE9NTm9kZSkgeG1sTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQpOwotCQl9Ci0JCWZpbmFsbHkgewotCQkJeG1sTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQkJcmV0dXJuIHhtbE5vZGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvQ3VzdG9tVGVtcGxhdGVQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjhiNzQ5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L0N1c3RvbVRlbXBsYXRlUHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZVByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLS8qKgotICogUHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIG1ha2UgdGhlIGFkZGl0aW9uYWwgcHJvcG9zYWwgaW5mbyBpbnRvIGNvbnRlbnQKLSAqIGZpdCBmb3IgYW4gSFRNTCB2aWV3ZXIgKGJ5IGVzY2FwaW5nIGNoYXJhY3RlcnMpCi0gKi8KLWNsYXNzIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwgZXh0ZW5kcyBUZW1wbGF0ZVByb3Bvc2FsIGltcGxlbWVudHMgSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0Ci0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCS8vIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdAotCi0JcHVibGljIEN1c3RvbVRlbXBsYXRlUHJvcG9zYWwoVGVtcGxhdGUgdGVtcGxhdGUsIFRlbXBsYXRlQ29udGV4dCBjb250ZXh0LCBJUmVnaW9uIHJlZ2lvbiwgSW1hZ2UgaW1hZ2UsIGludCByZWxldmFuY2UpIHsKLQkJc3VwZXIodGVtcGxhdGUsIGNvbnRleHQsIHJlZ2lvbiwgaW1hZ2UsIHJlbGV2YW5jZSk7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkgewotCQlTdHJpbmcgYWRkaXRpb25hbEluZm8gPSBzdXBlci5nZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCk7Ci0JCXJldHVybiBTdHJpbmdVdGlscy5jb252ZXJ0VG9IVE1MQ29udGVudChhZGRpdGlvbmFsSW5mbyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhMDEyYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Ob1JlZ2lvbkNvbnRlbnRBc3Npc3RQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVHlwZWRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotCi0vKioKLSAqIENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgdG8gaGFuZGxlIHNwZWNpYWwgY2FzZXMgaW4gY29udGVudCBhc3Npc3Qgd2hlcmUgdGhlCi0gKiBwYXJ0aXRpb25lciBjYW5ub3QgZGV0ZXJtaW5lIGEgcGFydGl0aW9uIHR5cGUgYXQgdGhlIGN1cnJlbnQgY3Vyc29yCi0gKiBwb3NpdGlvbiAodXN1YWxseSBhdCBFT0YpLgotICogCi0gKiBAYXV0aG9yIHBhdmVyeQotICovCi1wdWJsaWMgY2xhc3MgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IsIElSZWxlYXNhYmxlIHsKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgY2hhciBjb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnNbXSA9IG51bGw7Ci0JcHJvdGVjdGVkIGNoYXIgY29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzW10gPSBudWxsOwotCi0JcHJpdmF0ZSBmaW5hbCBJQ29tcGxldGlvblByb3Bvc2FsW10gRU1QVFlfUFJPUE9TQUxfU0VUID0gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0JcHJvdGVjdGVkIFN0cmluZyBmRXJyb3JNZXNzYWdlID0gbnVsbDsKLQlwcml2YXRlIEhhc2hNYXAgZk5hbWVUb1Byb2Nlc3Nvck1hcCA9IG51bGw7Ci0JcHJpdmF0ZSBIYXNoTWFwIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCA9IG51bGw7Ci0KLQlwdWJsaWMgTm9SZWdpb25Db250ZW50QXNzaXN0UHJvY2Vzc29yKCkgewotCQlzdXBlcigpOwotCQlmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAgPSBuZXcgSGFzaE1hcCgpOwotCQlmTmFtZVRvUHJvY2Vzc29yTWFwID0gbmV3IEhhc2hNYXAoKTsKLQkJaW5pdE5hbWVUb1Byb2Nlc3Nvck1hcCgpOwotCQlpbml0UGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAoKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZFBhcnRpdGlvblByb2Nlc3NvcihTdHJpbmcga2V5LCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJYWRkUHJvY2Vzc29yKGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCwga2V5LCBwcm9jZXNzb3IpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZE5hbWVQcm9jZXNzb3IoU3RyaW5nIGtleSwgSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IgcHJvY2Vzc29yKSB7Ci0JCWFkZFByb2Nlc3NvcihmTmFtZVRvUHJvY2Vzc29yTWFwLCBrZXksIHByb2Nlc3Nvcik7Ci0JfQotCi0JcHJvdGVjdGVkIElDb250ZW50QXNzaXN0UHJvY2Vzc29yIGdldFBhcnRpdGlvblByb2Nlc3NvcihTdHJpbmcga2V5KSB7Ci0JCXJldHVybiAoSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IpIGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcC5nZXQoa2V5KTsKLQl9Ci0KLQkvKioKLQkgKiBFbnN1cmVzIHJlbGVhc2UgaWYgaXQncyBhIGR1cGxpY2F0ZSBwYXJ0aXRpb24gdHlwZS4KLQkgKiAKLQkgKiBAcGFyYW0gbWFwCi0JICogQHBhcmFtIGtleQotCSAqIEBwYXJhbSBwcm9jZXNzb3IKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkUHJvY2Vzc29yKEhhc2hNYXAgbWFwLCBTdHJpbmcga2V5LCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwcm9jZXNzb3IpIHsKLQkJT2JqZWN0IG8gPSBtYXAucmVtb3ZlKGtleSk7Ci0JCWlmIChvICE9IG51bGwpIHsKLQkJCWlmIChvIGluc3RhbmNlb2YgSVJlbGVhc2FibGUpIHsKLQkJCQkoKElSZWxlYXNhYmxlKSBvKS5yZWxlYXNlKCk7Ci0JCQl9Ci0JCX0KLQkJbWFwLnB1dChrZXksIHByb2Nlc3Nvcik7Ci0JfQotCi0JLyoqCi0JICogRmlndXJlcyBvdXQgd2hhdCB0aGUgY29ycmVjdCBJQ29tcGxldGlvblByb3Bvc2FsUHJvY2Vzc29yIGlzIGFuZAotCSAqIGNvbXB1dGVzQ29tcGxldGlvblByb3Bvc2FscyBvbiB0aGF0LgotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gbnVsbDsKLQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHJlc3VsdHMgPSBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0KLQkJcCA9IGd1ZXNzQ29udGVudEFzc2lzdFByb2Nlc3Nvcih2aWV3ZXIsIGRvY3VtZW50T2Zmc2V0KTsKLQkJaWYgKHAgIT0gbnVsbCkKLQkJCXJlc3VsdHMgPSBwLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKHZpZXdlciwgZG9jdW1lbnRPZmZzZXQpOwotCi0JCXJldHVybiAocmVzdWx0cyAhPSBudWxsKSA/IHJlc3VsdHMgOiBFTVBUWV9QUk9QT1NBTF9TRVQ7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uW10gY29tcHV0ZUNvbnRleHRJbmZvcm1hdGlvbihJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudE9mZnNldCkgewotCQkvLyBnZXQgY29udGV4dCBpbmZvIGZyb20gcHJvY2Vzc29yIHRoYXQgd2UgZW5kIHVwIHVzaW5nLi4uCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldENvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpCi0JICovCi0JcHVibGljIGNoYXJbXSBnZXRDb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMoKSB7Ci0JCXJldHVybiBjb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RQcm9jZXNzb3IjZ2V0Q29udGV4dEluZm9ybWF0aW9uQXV0b0FjdGl2YXRpb25DaGFyYWN0ZXJzKCkKLQkgKi8KLQlwdWJsaWMgY2hhcltdIGdldENvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycygpIHsKLQkJcmV0dXJuIGNvbnRleHRJbmZvcm1hdGlvbkF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvciNnZXRDb250ZXh0SW5mb3JtYXRpb25WYWxpZGF0b3IoKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uVmFsaWRhdG9yIGdldENvbnRleHRJbmZvcm1hdGlvblZhbGlkYXRvcigpIHsKLQkJLy8gcmV0dXJuIHRoZSB2YWxpZGF0b3IgZm9yIHRoZSBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgdGhhdCB3ZQotCQkvLyB1c2VkLi4uCi0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb250ZW50QXNzaXN0UHJvY2Vzc29yI2dldEVycm9yTWVzc2FnZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFcnJvck1lc3NhZ2UoKSB7Ci0JCXJldHVybiBmRXJyb3JNZXNzYWdlOwotCX0KLQotCS8qKgotCSAqIEdpdmVzIHlvdSB0aGUgZG9jdW1lbnQgcGFydGl0aW9uIHR5cGUgKFN0cmluZykgZm9yIHRoZSBnaXZlbgotCSAqIFN0cnVjdHVyZWRUZXh0Vmlld2VyIGFuZCBkb2N1bWVudFBvc2l0aW9uLgotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqIEByZXR1cm4gU3RyaW5nCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRQYXJ0aXRpb25UeXBlKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJSURvY3VtZW50IGRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCVN0cmluZyBwYXJ0aXRpb25UeXBlID0gbnVsbDsKLQkJSVR5cGVkUmVnaW9uIHBhcnRpdGlvbiA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlwYXJ0aXRpb24gPSBkb2N1bWVudC5nZXRQYXJ0aXRpb24oZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQlwYXJ0aXRpb25UeXBlID0gcGFydGl0aW9uLmdldFR5cGUoKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJcGFydGl0aW9uVHlwZSA9IG51bGw7Ci0JCX0KLQkJcmV0dXJuIHBhcnRpdGlvblR5cGU7Ci0JfQotCi0JLyoqCi0JICogR3Vlc3NlcyBhIENvbnRlbnRBc3Npc3RQcm9jZXNzb3IgYmFzZWQgb24gdGhlIFRleHRWaWV3ZXIgYW5kCi0JICogZG9jdW1lbnRPZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudE9mZnNldAotCSAqLwotCXByb3RlY3RlZCBJQ29udGVudEFzc2lzdFByb2Nlc3NvciBndWVzc0NvbnRlbnRBc3Npc3RQcm9jZXNzb3IoSVRleHRWaWV3ZXIgdmlld2VyLCBpbnQgZG9jdW1lbnRPZmZzZXQpIHsKLQkJLy8gbWFwcGluZyBsb2dpYyBoZXJlLi4uCi0JCS8vIGxvb2sgQCBwcmV2aW91cyByZWdpb24KLQkJLy8gbG9vayBAIHByZXZpb3VzIGRvYyBwYXJ0aXRpb24gdHlwZQotCQkvLyBsb29rIEAgcGFnZSBsYW5ndWFnZQotCQlJQ29udGVudEFzc2lzdFByb2Nlc3NvciBwID0gbnVsbDsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzZFJlZ2lvbiA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24odmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0JCWlmIChzZFJlZ2lvbiAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgY3VycmVudFJlZ2lvblR5cGUgPSBzZFJlZ2lvbi5nZXRUeXBlKCk7Ci0JCQkvLyBTeXN0ZW0ub3V0LnByaW50bG4oImN1cnJlbnQgcmVnaW9uIHR5cGUgaXMgPj4gIiArCi0JCQkvLyBjdXJyZW50UmVnaW9uVHlwZSk7Ci0JCQlpZiAoY3VycmVudFJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUHJldiA9IHNkUmVnaW9uLmdldFByZXZpb3VzKCk7Ci0JCQkJaWYgKHNkUHJldiAhPSBudWxsKSB7Ci0JCQkJCWlmIChERUJVRykgewotCQkJCQkJU3RyaW5nIHByZXZSZWdpb25UeXBlID0gc2RQcmV2LmdldFR5cGUoKTsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicHJldmlvdXMgcmVnaW9uIHR5cGUgaXMgPj4gIiArIHByZXZSZWdpb25UeXBlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCS8vIHdvcmtpbmcgdy8gdmlld2VyICYgZG9jdW1lbnQgcGFydGl0aW9uCi0JCWlmIChwID09IG51bGwgJiYgdmlld2VyLmdldERvY3VtZW50KCkuZ2V0TGVuZ3RoKCkgPiAwKSB7Ci0JCQlTdHJpbmcgcHJldlBhcnRpdGlvblR5cGUgPSBnZXRQYXJ0aXRpb25UeXBlKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyLCBkb2N1bWVudE9mZnNldCAtIDEpOwotCQkJLy8gU3lzdGVtLm91dC5wcmludGxuKCJwcmV2aW91cyBwYXJ0aXRpb24gdHlwZSBpcyA+ICIgKwotCQkJLy8gcHJldlBhcnRpdGlvblR5cGUpOwotCQkJcCA9IChJQ29udGVudEFzc2lzdFByb2Nlc3NvcikgZlBhcnRpdGlvblRvUHJvY2Vzc29yTWFwLmdldChwcmV2UGFydGl0aW9uVHlwZSk7Ci0JCX0KLQkJcmV0dXJuIHA7Ci0JfQotCi0JLyoqCi0JICogSW5pdHMgbWFwIGZvciBleHRyYSBDb250ZW50QXNzaXN0UHJvY2Vzc29ycyAodXNlQmVhbiwgZ2V0L3NldFByb3BlcnR5KQotCSAqLwotCXByb3RlY3RlZCB2b2lkIGluaXROYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCS8vIG5vdGhpbmcgdG8gZG8gaW4gdGhpcyBjYXNlCi0JfQotCi0JLyoqCi0JICogQWRkcyBhbGwgcmVsZXZlbnQgQ29udGVudEFzc2lzdFByb2Nlc3NvcnMgdG8gdGhlIHBhcnRpdGlvbiB0byBwcm9jZXNzb3IKLQkgKiBtYXAgKGp1c3QgWE1MIGhlcmUpCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgaW5pdFBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQlYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIHhtbFByb2Nlc3NvciA9IG5ldyBYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yKCk7Ci0JCWFkZFByb2Nlc3NvcihmUGFydGl0aW9uVG9Qcm9jZXNzb3JNYXAsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxULCB4bWxQcm9jZXNzb3IpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCXJlbGVhc2VQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCgpOwotCQlyZWxlYXNlTmFtZVRvUHJvY2Vzc29yTWFwKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZU1hcChIYXNoTWFwIG1hcCkgewotCQlpZiAobWFwICE9IG51bGwgJiYgIW1hcC5pc0VtcHR5KCkpIHsKLQkJCUl0ZXJhdG9yIGl0ID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0JCQlPYmplY3Qga2V5ID0gbnVsbDsKLQkJCXdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLQkJCQlrZXkgPSBpdC5uZXh0KCk7Ci0JCQkJaWYgKG1hcC5nZXQoa2V5KSBpbnN0YW5jZW9mIElSZWxlYXNhYmxlKSB7Ci0JCQkJCSgoSVJlbGVhc2FibGUpIG1hcC5nZXQoa2V5KSkucmVsZWFzZSgpOwotCQkJCX0KLQkJCX0KLQkJCW1hcC5jbGVhcigpOwotCQkJbWFwID0gbnVsbDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHJlbGVhc2VOYW1lVG9Qcm9jZXNzb3JNYXAoKSB7Ci0JCXJlbGVhc2VNYXAoZk5hbWVUb1Byb2Nlc3Nvck1hcCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcmVsZWFzZVBhcnRpdGlvblRvUHJvY2Vzc29yTWFwKCkgewotCQlyZWxlYXNlTWFwKGZQYXJ0aXRpb25Ub1Byb2Nlc3Nvck1hcCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24uamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L05vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMjQwMTYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLQotcHVibGljIGNsYXNzIE5vblZhbGlkYXRpbmdNb2RlbFF1ZXJ5QWN0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlBY3Rpb24gewotCi0JcHJvdGVjdGVkIENNTm9kZSBjbW5vZGUgPSBudWxsOwotCXByb3RlY3RlZCBpbnQgZW5kSW5kZXggPSAwOwotCXByb3RlY3RlZCBpbnQga2luZCA9IElOU0VSVDsKLQlwcm90ZWN0ZWQgaW50IHN0YXJ0SW5kZXggPSAwOwotCXByb3RlY3RlZCBPYmplY3QgdXNlckRhdGEgPSBudWxsOwotCi0JLyoqCi0JICogTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgTm9uVmFsaWRhdGluZ01vZGVsUXVlcnlBY3Rpb24oQ01Ob2RlIG5ld0NoaWxkLCBpbnQgbmV3S2luZCwgaW50IG5ld1N0YXJ0LCBpbnQgbmV3RW5kLCBPYmplY3QgbmV3VXNlckRhdGEpIHsKLQkJc3VwZXIoKTsKLQkJY21ub2RlID0gbmV3Q2hpbGQ7Ci0JCWtpbmQgPSBuZXdLaW5kOwotCQlzdGFydEluZGV4ID0gbmV3U3RhcnQ7Ci0JCWVuZEluZGV4ID0gbmV3RW5kOwotCQl1c2VyRGF0YSA9IG5ld1VzZXJEYXRhOwotCX0KLQotCS8qKgotCSAqIGdldENNTm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgZ2V0Q01Ob2RlKCkgewotCQlyZXR1cm4gY21ub2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRFbmRJbmRleCgpIHsKLQkJcmV0dXJuIGVuZEluZGV4OwotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICovCi0JcHVibGljIGludCBnZXRLaW5kKCkgewotCQlyZXR1cm4ga2luZDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRQYXJlbnQgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIG9yZy53M2MuZG9tLk5vZGUgZ2V0UGFyZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqLwotCXB1YmxpYyBpbnQgZ2V0U3RhcnRJbmRleCgpIHsKLQkJcmV0dXJuIHN0YXJ0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogZ2V0VXNlckRhdGEgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRVc2VyRGF0YSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogcGVyZm9ybUFjdGlvbiBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQWN0aW9uKCkgewotCX0KLQotCS8qKgotCSAqIHNldENNTm9kZSBtZXRob2QgY29tbWVudC4KLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBzZXRDTU5vZGUob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGUgbmV3Tm9kZSkgewotCQljbW5vZGUgPSBuZXdOb2RlOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdFbmRJbmRleAotCSAqICAgICAgICAgICAgaW50Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgc2V0RW5kSW5kZXgoaW50IG5ld0VuZEluZGV4KSB7Ci0JCWVuZEluZGV4ID0gbmV3RW5kSW5kZXg7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld0tpbmQKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldEtpbmQoaW50IG5ld0tpbmQpIHsKLQkJa2luZCA9IG5ld0tpbmQ7Ci0JfQotCi0JLyoqCi0JICogCi0JICogQHBhcmFtIG5ld1N0YXJ0SW5kZXgKLQkgKiAgICAgICAgICAgIGludAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNldFN0YXJ0SW5kZXgoaW50IG5ld1N0YXJ0SW5kZXgpIHsKLQkJc3RhcnRJbmRleCA9IG5ld1N0YXJ0SW5kZXg7Ci0JfQotCi0JLyoqCi0JICogc2V0VXNlckRhdGEgbWV0aG9kIGNvbW1lbnQuCi0JICovCi0JcHVibGljIHZvaWQgc2V0VXNlckRhdGEoT2JqZWN0IG9iamVjdCkgewotCX0KLQotCS8qKgotCSAqIAotCSAqIEByZXR1cm4gamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0JCVN0cmluZyBhY3Rpb25OYW1lID0gbnVsbDsKLQkJc3dpdGNoIChraW5kKSB7Ci0JCQljYXNlIElOU0VSVCA6Ci0JCQkJYWN0aW9uTmFtZSA9ICJJTlNFUlQiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWNhc2UgUkVNT1ZFIDoKLQkJCQlhY3Rpb25OYW1lID0gIlJFTU9WRSI7Ly8kTk9OLU5MUy0xJAotCQkJCWJyZWFrOwotCQkJY2FzZSBSRVBMQUNFIDoKLQkJCQlhY3Rpb25OYW1lID0gIlJFUExBQ0UiOy8vJE5PTi1OTFMtMSQKLQkJCQlicmVhazsKLQkJCWRlZmF1bHQgOgotCQkJCWFjdGlvbk5hbWUgPSAiVU5LTk9XTiBBQ1RJT04gIjsvLyROT04tTkxTLTEkCi0JCX0KLQkJU3RyaW5nIG5vZGVOYW1lID0gKGNtbm9kZSAhPSBudWxsKSA/IGdldENNTm9kZSgpLmdldE5vZGVOYW1lKCkgOiAiKHVua25vd24pIjsvLyROT04tTkxTLTEkCi0JCXJldHVybiBhY3Rpb25OYW1lICsgIj0iICsgbm9kZU5hbWUgKyAiKCIgKyBzdGFydEluZGV4ICsgIi4uLiIgKyBlbmRJbmRleCArICIpIjsvLyROT04tTkxTLTQkLy8kTk9OLU5MUy0zJC8vJE5PTi1OTFMtMiQvLyROT04tTkxTLTEkCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUHJvcG9zYWxDb21wYXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Qcm9wb3NhbENvbXBhcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RkYTE2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9Qcm9wb3NhbENvbXBhcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LklSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWw7Ci0KLQotcHVibGljIGNsYXNzIFByb3Bvc2FsQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3IgewotCi0KLQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJaW50IHJlbGV2YW5jZSA9IDA7Ci0JCWlmIChvMSBpbnN0YW5jZW9mIElSZWxldmFuY2VDb21wbGV0aW9uUHJvcG9zYWwgJiYgbzIgaW5zdGFuY2VvZiBJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkvLyBzb3J0IGJhc2VkIG9uIHJlbGV2YW5jZQotCQkJSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCBjcDEgPSAoSVJlbGV2YW5jZUNvbXBsZXRpb25Qcm9wb3NhbCkgbzE7Ci0JCQlJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsIGNwMiA9IChJUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsKSBvMjsKLQotCQkJcmVsZXZhbmNlID0gY3AyLmdldFJlbGV2YW5jZSgpIC0gY3AxLmdldFJlbGV2YW5jZSgpOwotCi0JCQkvLyBpZiBzYW1lIHJlbGV2YW5jZSwgc2Vjb25kYXJ5IHNvcnQgKGxleGlncmFwaGljYWxseSkKLQkJCWlmIChyZWxldmFuY2UgPT0gMCAmJiBvMSBpbnN0YW5jZW9mIElDb21wbGV0aW9uUHJvcG9zYWwgJiYgbzIgaW5zdGFuY2VvZiBJQ29tcGxldGlvblByb3Bvc2FsKSB7Ci0JCQkJU3RyaW5nIGRpc3BsYXlTdHJpbmcxID0gKChJQ29tcGxldGlvblByb3Bvc2FsKSBvMSkuZ2V0RGlzcGxheVN0cmluZygpOwotCQkJCVN0cmluZyBkaXNwbGF5U3RyaW5nMiA9ICgoSUNvbXBsZXRpb25Qcm9wb3NhbCkgbzIpLmdldERpc3BsYXlTdHJpbmcoKTsKLQkJCQlpZiAoZGlzcGxheVN0cmluZzEgIT0gbnVsbCAmJiBkaXNwbGF5U3RyaW5nMiAhPSBudWxsKQotCQkJCQkvL3JlbGV2YW5jZSA9IGRpc3BsYXlTdHJpbmcxLmNvbXBhcmVUbyhkaXNwbGF5U3RyaW5nMik7Ci0JCQkJCS8vIC8vIHRoaXMgZGlkbid0IG1peCBjYXBzIHcvIGxvd2VyY2FzZQotCQkJCQlyZWxldmFuY2UgPSBjb20uaWJtLmljdS50ZXh0LkNvbGxhdG9yLmdldEluc3RhbmNlKCkuY29tcGFyZShkaXNwbGF5U3RyaW5nMSwgZGlzcGxheVN0cmluZzIpOwotCQkJfQotCQl9Ci0JCS8vIG90aGVyd2lzZSBpZiBpdCdzIG5vdCBJU0VEUmVsZXZhbmNlQ29tcGxldGlvblByb3Bvc2FsLCBkb24ndCBzb3J0Ci0JCXJldHVybiByZWxldmFuY2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1JlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllYjk4YzQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Qb3NpdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5Eb2N1bWVudFRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUJ1ZmZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotCi0vKioKLSAqIEp1c3QgbGlrZSBEb2N1bWVudFRlbXBsYXRlQ29udGV4dCBleGNlcHQgaWYgYW4gaW5zZXJ0IG9mZnNldCBpcyBwYXNzZWQgaW4sCi0gKiBkdXJpbmcgZXZhbHVhdGlvbiwgdGhlICJwcmVmaXgiIGJlZm9yZSB0aGUgdGVtcGxhdGUgd2lsbCBiZSBjaGVja2VkIHRvIHNlZQotICogaWYgaXQgbWF0Y2hlcyB0aGUgdGVtcGxhdGUgbmFtZS4gSWYgc28sIG92ZXJ3cml0ZSB0aGUgdGVtcGxhdGUgbmFtZS4KLSAqIE90aGVyd2lzZSwganVzdCBpbnNlcnQgdGhlIHRlbXBsYXRlIGF0IHRoZSBpbnNlcnQgb2Zmc2V0IGxvY2F0aW9uIChieSBub3QKLSAqIG92ZXJ3cml0aW5nIHRoZSBwcmVmaXggdGV4dCkKLSAqLwotcHVibGljIGNsYXNzIFJlcGxhY2VOYW1lVGVtcGxhdGVDb250ZXh0IGV4dGVuZHMgRG9jdW1lbnRUZW1wbGF0ZUNvbnRleHQgewotCXByaXZhdGUgaW50IGZJbnNlcnRPZmZzZXQgPSAtMTsKLQotCS8qKgotCSAqIENyZWF0ZXMgYSBkb2N1bWVudCB0ZW1wbGF0ZSBjb250ZXh0LgotCSAqIAotCSAqIEBwYXJhbSB0eXBlCi0JICogICAgICAgICAgICB0aGUgY29udGV4dCB0eXBlCi0JICogQHBhcmFtIGRvY3VtZW50Ci0JICogICAgICAgICAgICB0aGUgZG9jdW1lbnQgdGhpcyBjb250ZXh0IGFwcGxpZXMgdG8KLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKiBAcGFyYW0gbGVuZ3RoCi0JICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBkb2N1bWVudCByZWdpb24KLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLQkJdGhpcyh0eXBlLCBkb2N1bWVudCwgbmV3IFBvc2l0aW9uKG9mZnNldCwgbGVuZ3RoKSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuIFRoZSBzdXBwbGllZCA8Y29kZT5Qb3NpdGlvbjwvY29kZT4KLQkgKiB3aWxsIGJlIHF1ZXJpZWQgdG8gY29tcHV0ZSB0aGUgPGNvZGU+Z2V0U3RhcnQ8L2NvZGU+IGFuZAotCSAqIDxjb2RlPmdldEVuZDwvY29kZT4gbWV0aG9kcywgd2hpY2ggd2lsbCB0aGVyZWZvcmUgYW5zd2VyIHVwZGF0ZWQKLQkgKiBwb3NpdGlvbiBkYXRhIGlmIGl0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgZG9jdW1lbnQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBwb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIHBvc2l0aW9uIGRlc2NyaWJpbmcgdGhlIGFyZWEgb2YgdGhlIGRvY3VtZW50IHdoaWNoIGZvcm1zCi0JICogICAgICAgICAgICB0aGUgdGVtcGxhdGUgY29udGV4dAotCSAqIEBzaW5jZSAzLjEKLQkgKi8KLQlwdWJsaWMgUmVwbGFjZU5hbWVUZW1wbGF0ZUNvbnRleHQoVGVtcGxhdGVDb250ZXh0VHlwZSB0eXBlLCBJRG9jdW1lbnQgZG9jdW1lbnQsIFBvc2l0aW9uIHBvc2l0aW9uKSB7Ci0JCXN1cGVyKHR5cGUsIGRvY3VtZW50LCBwb3NpdGlvbik7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGRvY3VtZW50IHRlbXBsYXRlIGNvbnRleHQuCi0JICogCi0JICogQHBhcmFtIHR5cGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZXh0IHR5cGUKLQkgKiBAcGFyYW0gZG9jdW1lbnQKLQkgKiAgICAgICAgICAgIHRoZSBkb2N1bWVudCB0aGlzIGNvbnRleHQgYXBwbGllcyB0bwotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBsZW5ndGgKLQkgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGRvY3VtZW50IHJlZ2lvbgotCSAqIEBwYXJhbSBpbnNlcnRPZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGRvY3VtZW50IHJlZ2lvbiB3aGVyZSBpbnNlcnQgd2FzCi0JICogICAgICAgICAgICBvcmlnaW5hbGx5IHJlcXVlc3RlZAotCSAqLwotCXB1YmxpYyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChUZW1wbGF0ZUNvbnRleHRUeXBlIHR5cGUsIElEb2N1bWVudCBkb2N1bWVudCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGluc2VydE9mZnNldCkgewotCQl0aGlzKHR5cGUsIGRvY3VtZW50LCBuZXcgUG9zaXRpb24ob2Zmc2V0LCBsZW5ndGgpKTsKLQkJZkluc2VydE9mZnNldCA9IGluc2VydE9mZnNldDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0I2V2YWx1YXRlKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlKQotCSAqLwotCXB1YmxpYyBUZW1wbGF0ZUJ1ZmZlciBldmFsdWF0ZShUZW1wbGF0ZSB0ZW1wbGF0ZSkgdGhyb3dzIEJhZExvY2F0aW9uRXhjZXB0aW9uLCBUZW1wbGF0ZUV4Y2VwdGlvbiB7Ci0JCVRlbXBsYXRlQnVmZmVyIGJ1ZmZlciA9IHN1cGVyLmV2YWx1YXRlKHRlbXBsYXRlKTsKLQkJaWYgKGJ1ZmZlciAhPSBudWxsKSB7Ci0JCQlpZiAoZkluc2VydE9mZnNldCA+IC0xICYmIGZJbnNlcnRPZmZzZXQgPiBnZXRTdGFydCgpKSB7Ci0JCQkJU3RyaW5nIHByZWZpeCA9IGdldERvY3VtZW50KCkuZ2V0KGdldFN0YXJ0KCksIGZJbnNlcnRPZmZzZXQgLSBnZXRTdGFydCgpKTsKLQkJCQlpZiAoIXRlbXBsYXRlLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCkpIHsKLQkJCQkJLy8gZ2VuZXJhdGUgYSBuZXcgYnVmZmVyIHRoYXQgYWN0dWFsbHkgY29udGFpbnMgdGhlCi0JCQkJCS8vIHRleHQgdGhhdCB3YXMgZ29pbmcgdG8gYmUgb3ZlcndyaXR0ZW4KLQkJCQkJYnVmZmVyID0gbmV3IFRlbXBsYXRlQnVmZmVyKHByZWZpeCArIGJ1ZmZlci5nZXRTdHJpbmcoKSwgYnVmZmVyLmdldFZhcmlhYmxlcygpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGJ1ZmZlcjsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM3ZDZhNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9TaW1wbGVDTUVsZW1lbnREZWNsYXJhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi0KLQotcHVibGljIGNsYXNzIFNpbXBsZUNNRWxlbWVudERlY2xhcmF0aW9uIGltcGxlbWVudHMgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbiB7Ci0KLQlTdHJpbmcgZk5vZGVOYW1lOwotCi0JLyoqCi0JICogU2ltcGxlQ01FTGVtZW50RGVjbGFyYXRpb24gY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgU2ltcGxlQ01FbGVtZW50RGVjbGFyYXRpb24oKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIFNpbXBsZUNNRWxlbWVudERlY2xhcmF0aW9uKFN0cmluZyBub2RlTmFtZSkgewotCQlzdXBlcigpOwotCQlzZXROb2RlTmFtZShub2RlTmFtZSk7Ci0JfQotCi0JLyoqCi0JICogZ2V0QXR0cmlidXRlcyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICogCi0JICogUmV0dXJucyBDTU5hbWVkTm9kZU1hcCBvZiBBdHRyaWJ1dGVEZWNsYXJhdGlvbgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwIGdldEF0dHJpYnV0ZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldENNQ29udGVudCBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNQ29udGVudAotCSAqIAotCSAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIGVsZW1lbnQncyBjb250ZW50IG1vZGVsLiBUaGlzIGNhbiBiZSBhbgotCSAqIENNRWxlbWVudERlY2xhcmF0aW9uIG9yIGEgQ01Hcm91cAotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudCBnZXRDb250ZW50KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBnZXRDb250ZW50VHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIFJldHVybnMgb25lIG9mIDogQU5ZLCBFTVBUWSwgRUxFTUVOVCwgTUlYRUQsIFBDREFUQSwgQ0RBVEEuCi0JICovCi0JcHVibGljIGludCBnZXRDb250ZW50VHlwZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogZ2V0RGF0YVR5cGUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZSBnZXREYXRhVHlwZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0RWxlbWVudE5hbWUgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuU3RyaW5nCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogZ2V0TG9jYWxFbGVtZW50cyBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIENNTmFtZWROb2RlTWFwCi0JICogCi0JICogUmV0dXJucyBhIGxpc3Qgb2YgbG9jYWxseSBkZWZpbmVkIGVsZW1lbnRzLgotCSAqLwotCXB1YmxpYyBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTmFtZWROb2RlTWFwIGdldExvY2FsRWxlbWVudHMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIGdldE1heE9jY3VyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogSWYgLTEsIGl0J3MgVU5CT1VOREVELgotCSAqLwotCXB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKSB7Ci0JCXJldHVybiAwOwotCX0KLQotCS8qKgotCSAqIGdldE1pbk9jY3VyIG1ldGhvZAotCSAqIAotCSAqIEByZXR1cm4gaW50Ci0JICogCi0JICogSWYgMCwgaXQncyBPUFRJT05BTC4gSWYgMSwgaXQncyBSRVFVSVJFRC4KLQkgKi8KLQlwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkgewotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcmV0dXJuIGphdmEubGFuZy5TdHJpbmcKLQkgKi8KLQlwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXROb2RlTmFtZSgpIHsKLQkJcmV0dXJuIGZOb2RlTmFtZTsKLQl9Ci0KLQkvKioKLQkgKiBnZXROb2RlVHlwZSBtZXRob2QKLQkgKiAKLQkgKiBAcmV0dXJuIGludAotCSAqIAotCSAqIFJldHVybnMgb25lIG9mIDoKLQkgKiAgCi0JICovCi0JcHVibGljIGludCBnZXROb2RlVHlwZSgpIHsKLQkJcmV0dXJuIDA7Ci0JfQotCi0JLyoqCi0JICogZ2V0UHJvcGVydHkgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBqYXZhLmxhbmcuT2JqZWN0Ci0JICogCi0JICogUmV0dXJucyB0aGUgb2JqZWN0IHByb3BlcnR5IGRlc2NpcGVkIGJ5IHRoZSBwcm9wZXJ0eU5hbWUKLQkgKiAgCi0JICovCi0JcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIAotCSAqIEBwYXJhbSBuZXdOb2RlTmFtZQotCSAqICAgICAgICAgICAgamF2YS5sYW5nLlN0cmluZwotCSAqLwotCXB1YmxpYyB2b2lkIHNldE5vZGVOYW1lKGphdmEubGFuZy5TdHJpbmcgbmV3Tm9kZU5hbWUpIHsKLQkJZk5vZGVOYW1lID0gbmV3Tm9kZU5hbWU7Ci0JfQotCi0JLyoqCi0JICogc3VwcG9ydHMgbWV0aG9kCi0JICogCi0JICogQHJldHVybiBib29sZWFuCi0JICogCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZSBDTU5vZGUgc3VwcG9ydHMgYSBzcGVjaWZpZWQgcHJvcGVydHkKLQkgKiAgCi0JICovCi0JcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1NvdXJjZUVkaXRvckltYWdlSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjYmQ2OTguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wbHVnaW4uQWJzdHJhY3RVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIGludGVybmFsIFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyIG9yIGV4dGVybmFsCi0gKiAgICAgICAgICAgICBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBpbnN0ZWFkCi0gKi8KLXB1YmxpYyBjbGFzcyBTb3VyY2VFZGl0b3JJbWFnZUhlbHBlciB7Ci0KLQlwdWJsaWMgU291cmNlRWRpdG9ySW1hZ2VIZWxwZXIoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihYTUxVSVBsdWdpbi5JRCwgcmVzb3VyY2UpOwotCQlJbWFnZSBpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dChyZXNvdXJjZSwgaW1hZ2UpOwotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJaW1hZ2UgPSBjcmVhdGVJbWFnZShyZXNvdXJjZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjQwZGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudEFzc2lzdFByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklSZXNvdXJjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLklQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnV0aWwuUHJvcGVydHlDaGFuZ2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzLlhNTFVJUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUw7Ci0KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50QXNzaXN0UHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yIGltcGxlbWVudHMgSVByb3BlcnR5Q2hhbmdlTGlzdGVuZXIgewotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZlByZWZlcmVuY2VTdG9yZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElSZXNvdXJjZSBmUmVzb3VyY2UgPSBudWxsOwotCXByaXZhdGUgWE1MVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yIGZUZW1wbGF0ZVByb2Nlc3NvciA9IG51bGw7Ci0JcHJpdmF0ZSBMaXN0IGZUZW1wbGF0ZUNvbnRleHRzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JcHVibGljIFhNTENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCQotCXByb3RlY3RlZCB2b2lkIGFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoQ29udGVudEFzc2lzdFJlcXVlc3QgY29udGVudEFzc2lzdFJlcXVlc3QpIHsKLQkJYWRkVGVtcGxhdGVzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFUVFJJQlVURSk7Ci0JCXN1cGVyLmFkZEF0dHJpYnV0ZU5hbWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRBdHRyaWJ1dGVWYWx1ZVByb3Bvc2FscyhDb250ZW50QXNzaXN0UmVxdWVzdCBjb250ZW50QXNzaXN0UmVxdWVzdCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuQVRUUklCVVRFX1ZBTFVFKTsKLQkJc3VwZXIuYWRkQXR0cmlidXRlVmFsdWVQcm9wb3NhbHMoY29udGVudEFzc2lzdFJlcXVlc3QpOwotCX0KLQkKLQlwcm90ZWN0ZWQgdm9pZCBhZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0KSB7Ci0JCWFkZFRlbXBsYXRlcyhjb250ZW50QXNzaXN0UmVxdWVzdCwgVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5ORVcpOwotCQlzdXBlci5hZGRFbXB0eURvY3VtZW50UHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0KTsKLQl9Ci0JCi0JcHJvdGVjdGVkIHZvaWQgYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBpbnQgY2hpbGRQb3NpdGlvbikgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuVEFHKTsKLQkJc3VwZXIuYWRkVGFnSW5zZXJ0aW9uUHJvcG9zYWxzKGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBjaGlsZFBvc2l0aW9uKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0ZW1wbGF0ZXMgdG8gdGhlIGxpc3Qgb2YgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgY29udGV4dCkgewotCQlhZGRUZW1wbGF0ZXMoY29udGVudEFzc2lzdFJlcXVlc3QsIGNvbnRleHQsIGNvbnRlbnRBc3Npc3RSZXF1ZXN0LmdldFJlcGxhY2VtZW50QmVnaW5Qb3NpdGlvbigpKTsKLQl9Ci0JCi0JLyoqCi0JICogQWRkcyB0ZW1wbGF0ZXMgdG8gdGhlIGxpc3Qgb2YgcHJvcG9zYWxzCi0JICogCi0JICogQHBhcmFtIGNvbnRlbnRBc3Npc3RSZXF1ZXN0Ci0JICogQHBhcmFtIGNvbnRleHQKLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQKLQkgKi8KLQlwcml2YXRlIHZvaWQgYWRkVGVtcGxhdGVzKENvbnRlbnRBc3Npc3RSZXF1ZXN0IGNvbnRlbnRBc3Npc3RSZXF1ZXN0LCBTdHJpbmcgY29udGV4dCwgaW50IHN0YXJ0T2Zmc2V0KSB7Ci0JCWlmIChjb250ZW50QXNzaXN0UmVxdWVzdCA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJLy8gaWYgYWxyZWFkeSBhZGRpbmcgdGVtcGxhdGUgcHJvcG9zYWxzIGZvciBhIGNlcnRhaW4gY29udGV4dCB0eXBlLCBkbwotCQkvLyBub3QgYWRkIGFnYWluCi0JCWlmICghZlRlbXBsYXRlQ29udGV4dHMuY29udGFpbnMoY29udGV4dCkpIHsKLQkJCWZUZW1wbGF0ZUNvbnRleHRzLmFkZChjb250ZXh0KTsKLQkJCWJvb2xlYW4gdXNlUHJvcG9zYWxMaXN0ID0gIWNvbnRlbnRBc3Npc3RSZXF1ZXN0LnNob3VsZFNlcGFyYXRlKCk7Ci0KLQkJCWlmIChnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSAhPSBudWxsKSB7Ci0JCQkJZ2V0VGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yKCkuc2V0Q29udGV4dFR5cGUoY29udGV4dCk7Ci0JCQkJSUNvbXBsZXRpb25Qcm9wb3NhbFtdIHByb3Bvc2FscyA9IGdldFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpLmNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKGZUZXh0Vmlld2VyLCBzdGFydE9mZnNldCk7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9wb3NhbHMubGVuZ3RoOyArK2kpIHsKLQkJCQkJaWYgKHVzZVByb3Bvc2FsTGlzdCkKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZFByb3Bvc2FsKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJCWVsc2UKLQkJCQkJCWNvbnRlbnRBc3Npc3RSZXF1ZXN0LmFkZE1hY3JvKHByb3Bvc2Fsc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCQotCXByb3RlY3RlZCBDb250ZW50QXNzaXN0UmVxdWVzdCBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhpbnQgZG9jdW1lbnRQb3NpdGlvbiwgU3RyaW5nIG1hdGNoU3RyaW5nLCBJVGV4dFJlZ2lvbiBjb21wbGV0aW9uUmVnaW9uLCBJRE9NTm9kZSB0cmVlTm9kZSwgSURPTU5vZGUgeG1sbm9kZSkgewotCQlDb250ZW50QXNzaXN0UmVxdWVzdCByZXF1ZXN0ID0gc3VwZXIuY29tcHV0ZUNvbXBsZXRpb25Qcm9wb3NhbHMoZG9jdW1lbnRQb3NpdGlvbiwgbWF0Y2hTdHJpbmcsIGNvbXBsZXRpb25SZWdpb24sIHRyZWVOb2RlLCB4bWxub2RlKTsKLQkJLy8gYnVnMTE1OTI3IHVzZSBvcmlnaW5hbCBkb2N1bWVudCBwb3NpdGlvbiBmb3IgYWxsL2FueSByZWdpb24gdGVtcGxhdGVzCi0JCWFkZFRlbXBsYXRlcyhyZXF1ZXN0LCBUZW1wbGF0ZUNvbnRleHRUeXBlSWRzWE1MLkFMTCwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCXJldHVybiByZXF1ZXN0OwotCX0KLQkKLQkvKiAobm9uLUphdmFkb2MpCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmNvbnRlbnRhc3Npc3QuQWJzdHJhY3RDb250ZW50QXNzaXN0UHJvY2Vzc29yI2NvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSUNvbXBsZXRpb25Qcm9wb3NhbFtdIGNvbXB1dGVDb21wbGV0aW9uUHJvcG9zYWxzKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uKSB7Ci0JCWZUZW1wbGF0ZUNvbnRleHRzLmNsZWFyKCk7Ci0JCXJldHVybiBzdXBlci5jb21wdXRlQ29tcGxldGlvblByb3Bvc2Fscyh0ZXh0Vmlld2VyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBnZXRQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCWlmIChmUHJlZmVyZW5jZVN0b3JlID09IG51bGwpCi0JCQlmUHJlZmVyZW5jZVN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQlyZXR1cm4gZlByZWZlcmVuY2VTdG9yZTsKLQl9Ci0KLQlwcml2YXRlIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBnZXRUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IoKSB7Ci0JCWlmIChmVGVtcGxhdGVQcm9jZXNzb3IgPT0gbnVsbCkgewotCQkJZlRlbXBsYXRlUHJvY2Vzc29yID0gbmV3IFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvcigpOwotCQl9Ci0JCXJldHVybiBmVGVtcGxhdGVQcm9jZXNzb3I7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdCgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuYWRkUHJvcGVydHlDaGFuZ2VMaXN0ZW5lcih0aGlzKTsKLQkJcmVpbml0KCk7Ci0JfQotCi0JcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2UoUHJvcGVydHlDaGFuZ2VFdmVudCBldmVudCkgewotCQlTdHJpbmcgcHJvcGVydHkgPSBldmVudC5nZXRQcm9wZXJ0eSgpOwotCi0JCWlmIChwcm9wZXJ0eS5jb21wYXJlVG8oWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSA9PSAwIHx8IHByb3BlcnR5LmNvbXBhcmVUbyhYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkgPT0gMCkgewotCQkJcmVpbml0KCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCByZWluaXQoKSB7Ci0JCVN0cmluZyBrZXkgPSBYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0U7Ci0JCWJvb2xlYW4gZG9BdXRvID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0Qm9vbGVhbihrZXkpOwotCQlpZiAoZG9BdXRvKSB7Ci0JCQlrZXkgPSBYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERTsKLQkJCWNvbXBsZXRpb25Qcm9wb3NhbEF1dG9BY3RpdmF0aW9uQ2hhcmFjdGVycyA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhrZXkpLnRvQ2hhckFycmF5KCk7Ci0JCX0gZWxzZSB7Ci0JCQljb21wbGV0aW9uUHJvcG9zYWxBdXRvQWN0aXZhdGlvbkNoYXJhY3RlcnMgPSBudWxsOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJc3VwZXIucmVsZWFzZSgpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5yZW1vdmVQcm9wZXJ0eUNoYW5nZUxpc3RlbmVyKHRoaXMpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTENvbnRlbnRBc3Npc3RVdGlsaXRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTYxMThlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25Db250YWluZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnV0aWwuU2NyaXB0TGFuZ3VhZ2VLZXlzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkN1c3RvbUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb250ZW50QXNzaXN0VXRpbGl0aWVzIGV4dGVuZHMgQ29udGVudEFzc2lzdFV0aWxzIHsKLQkKLSAgICAvKioKLSAgICAgKiBJU1NVRTogdGhpcyBpcyBhIGJpdCBvZiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzCi0gICAgICogd2F5IGZvciBleHBlZGVuY3kuIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24gIm5lc3RlZENvbnRleHQiLgotICAgICAqLwotCXByaXZhdGUgY2xhc3MgRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfQ0xPU0UgPSAiSlNQX0NMT1NFIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0RFQ0xBUkFUSU9OX09QRU4gPSAiSlNQX0RFQ0xBUkFUSU9OX09QRU4iOyAvLyROT04tTkxTLTEkCi0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfU0NSSVBUTEVUX09QRU4gPSAiSlNQX1NDUklQVExFVF9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNQX0VYUFJFU1NJT05fT1BFTiA9ICJKU1BfRVhQUkVTU0lPTl9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCi0JfQotCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gIkNvbnRlbnQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVOVF9TQ1JJUFRfVFlQRSA9ICJDb250ZW50LVNjcmlwdC1UeXBlIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQUQgPSAiSEVBRCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIVE1MID0gIkhUTUwiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9FUVVJViA9ICJIVFRQLUVRVUlWIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEEgPSAiTUVUQSI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIEEgY29udmVuaWVuY2UgbWV0aG9kIGZvciBnZXR0aW5nIHRoZSBjbG9zaW5nIHByb3Bvc2FsIGdpdmVuIHRoZQotCSAqIGNvbnRlbnRzIChJbmRleGVkUmVnaW9uKSBvZiBhIHRhZyB0aGF0IGlzIHN0YXJ0ZWQsIGJ1dCBwb3NzaWJseSBub3QKLQkgKiBlbmRlZAotCSAqIAotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiAgICAgICAgICAgIHRoZSB0ZXh0IHZpZXdlcgotCSAqIEBwYXJhbSBkb2N1bWVudFBvc2l0aW9uCi0JICogICAgICAgICAgICB0aGUgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSB2aWV3ZXIKLQkgKiBAcGFyYW0gaW5kZXhlZE5vZGUKLQkgKiAgICAgICAgICAgIHRoZSBjb250ZW50cyBvZiB0aGUgdGFnIHRoYXQgaXMgc3RhcnRlZCBidXQgcG9zc2libHkgbm90Ci0JICogICAgICAgICAgICBlbmRlZAotCSAqIEBwYXJhbSBwYXJlbnRUYWdOYW1lCi0JICogICAgICAgICAgICB0aGUgdGFnIG9uIHdoaWNoIHlvdSBhcmUgY2hlY2tpbiBmb3IgYW4gZW5kaW5nIHRhZwotCSAqIEBwYXJhbSBpbWFnZVBhdGgKLQkgKiAgICAgICAgICAgIGNvbnRlbnQgYXNzaXN0IGltYWdlIHJlbGF0aXZlIHBhdGggCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsIGNvbXB1dGVKU1BFbmRUYWdQcm9wb3NhbChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlLCBTdHJpbmcgcGFyZW50VGFnTmFtZSwgU3RyaW5nIGltYWdlUGF0aCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsIHAgPSBudWxsOwotCi0JCS8vIGNoZWNrIGlmIHRhZyBpcyBjbG9zZWQKLQkJYm9vbGVhbiBoYXNFbmRUYWcgPSB0cnVlOwotCQlib29sZWFuIGlzSlNQVGFnID0gZmFsc2U7Ci0JCUlET01Ob2RlIHhub2RlID0gbnVsbDsKLQkJU3RyaW5nIHRhZ05hbWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoaW5kZXhlZE5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJeG5vZGUgPSAoKElET01Ob2RlKSBpbmRleGVkTm9kZSk7Ci0JCQkvLyBpdCdzIGVuZGVkIGFscmVhZHkuLi4KLQkJCWlmICh4bm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJCXJldHVybiBudWxsOwotCQkJSURPTU5vZGUgb3Blbk5vZGUgPSBudWxsOwotCQkJaWYgKCF4bm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UocGFyZW50VGFnTmFtZSkpCi0JCQkJb3Blbk5vZGUgPSAoSURPTU5vZGUpIHhub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChvcGVuTm9kZSAhPSBudWxsKSB7Ci0JCQkJaWYgKG9wZW5Ob2RlIGluc3RhbmNlb2YgSURPTUVsZW1lbnQpIHsKLQkJCQkJaXNKU1BUYWcgPSAoKElET01FbGVtZW50KSBvcGVuTm9kZSkuaXNKU1BUYWcoKTsKLQkJCQl9Ci0JCQkJdGFnTmFtZSA9IG9wZW5Ob2RlLmdldE5vZGVOYW1lKCk7Ci0JCQkJaGFzRW5kVGFnID0gKG9wZW5Ob2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpOwotCQkJfQotCQl9Ci0KLQkJLy8gaXQncyBjbG9zZWQsIGRvbid0IGFkZCBjbG9zZSB0YWcgcHJvcG9zYWwKLQkJaWYgKCFoYXNFbmRUYWcgJiYgIWlzSlNQVGFnKSB7Ci0KLQkJCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBjbG9zZSB0YWcgdGV4dAotCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICI8LyIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgdmlld2VyVGV4dCA9IHZpZXdlci5nZXRUZXh0V2lkZ2V0KCkuZ2V0VGV4dCgpOwotCQkJaWYgKHZpZXdlclRleHQubGVuZ3RoKCkgPj0gZG9jdW1lbnRQb3NpdGlvbiAmJiB2aWV3ZXJUZXh0Lmxlbmd0aCgpID49IDIgJiYgZG9jdW1lbnRQb3NpdGlvbiA+PSAyKSB7Ci0JCQkJU3RyaW5nIGxhc3QyY2hhcnMgPSB2aWV3ZXJUZXh0LnN1YnN0cmluZyhkb2N1bWVudFBvc2l0aW9uIC0gMiwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCQkJaWYgKGxhc3QyY2hhcnMuZW5kc1dpdGgoIjwvIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvcG9zZWRUZXh0ID0gdGFnTmFtZTsKLQkJCQllbHNlIGlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8IikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJcHJvcG9zZWRUZXh0ID0gIi8iICsgdGFnTmFtZTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCi0JCQkvLyBjcmVhdGUgcHJvcG9zYWwKLQkJCXAgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblByb3Bvc2FsKHByb3Bvc2VkVGV4dCArICI+IiwgLy8kTk9OLU5MUy0xJAotCQkJCQkJZG9jdW1lbnRQb3NpdGlvbiwgMCwgcHJvcG9zZWRUZXh0Lmxlbmd0aCgpICsgMSwgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVBhdGgpLCAvLyROT04tTkxTLTEkCi0JCQkJCQlOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkVuZF93aXRoXywgKG5ldyBPYmplY3RbXXtwcm9wb3NlZFRleHR9KSksCi0JCQkJCQludWxsLCBudWxsLCBYTUxSZWxldmFuY2VDb25zdGFudHMuUl9FTkRfVEFHKTsKLQkJfQotCQllbHNlIGlmICghaGFzRW5kVGFnICYmIGlzSlNQVGFnKSB7Ci0KLQkJCS8vIGNyZWF0ZSBhcHByb3ByaWF0ZSBjbG9zZSB0YWcgdGV4dAotCQkJU3RyaW5nIHByb3Bvc2VkVGV4dCA9ICIlIjsgLy8kTk9OLU5MUy0xJAotCQkJU3RyaW5nIHZpZXdlclRleHQgPSB2aWV3ZXIuZ2V0VGV4dFdpZGdldCgpLmdldFRleHQoKTsKLQotCQkJLy8gVE9ETyAocGEpIG1ha2UgaXQgc21hcnRlciB0byBhZGQgIiU+IiBvciBqdXN0ICI+IiBpZiAlIGlzCi0JCQkvLyBhbHJlYWR5IHRoZXJlLi4uCi0JCQlpZiAodmlld2VyVGV4dC5sZW5ndGgoKSA+PSBkb2N1bWVudFBvc2l0aW9uICYmIHZpZXdlclRleHQubGVuZ3RoKCkgPj0gMikgewotCQkJCVN0cmluZyBsYXN0MmNoYXJzID0gdmlld2VyVGV4dC5zdWJzdHJpbmcoZG9jdW1lbnRQb3NpdGlvbiAtIDIsIGRvY3VtZW50UG9zaXRpb24pOwotCQkJCVN0cmluZyBsYXN0Y2hhciA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAxLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAobGFzdGNoYXIuZXF1YWxzKCIlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQl7Ci0JCQkJCWlmIChsYXN0MmNoYXJzLmVuZHNXaXRoKCI8JSIpKSAvLyROT04tTkxTLTEkCi0JCQkJCQlwcm9wb3NlZFRleHQgPSAiJSI7IC8vJE5PTi1OTFMtMSQKLQkJCQkJZWxzZQotCQkJCQkJcHJvcG9zZWRUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBwcm9wb3NhbAotCQkJcCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0ICsgIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uLCAwLCBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKyAxLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlUGF0aCksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCU5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAobmV3IE9iamVjdFtde3Byb3Bvc2VkVGV4dH0pKSwKLQkJCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUcpOwotCQl9Ci0KLQkJcmV0dXJuIHA7Ci0JfQotCi0KLQkvKioKLQkgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY2xvc2luZyBwcm9wb3NhbCBnaXZlbiB0aGUKLQkgKiBjb250ZW50cyAoSW5kZXhlZFJlZ2lvbikgb2YgYSB0YWcgdGhhdCBpcyBzdGFydGVkLCBidXQgcG9zc2libHkgbm90Ci0JICogZW5kZWQKLQkgKiAKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogICAgICAgICAgICB0aGUgdGV4dCB2aWV3ZXIKLQkgKiBAcGFyYW0gZG9jdW1lbnRQb3NpdGlvbgotCSAqICAgICAgICAgICAgdGhlIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgdmlld2VyCi0JICogQHBhcmFtIGluZGV4ZWROb2RlCi0JICogICAgICAgICAgICB0aGUgY29udGVudHMgb2YgdGhlIHRhZyB0aGF0IGlzIHN0YXJ0ZWQgYnV0IHBvc3NpYmx5IG5vdAotCSAqICAgICAgICAgICAgZW5kZWQKLQkgKiBAcGFyYW0gcGFyZW50VGFnTmFtZQotCSAqICAgICAgICAgICAgdGhlIHRhZyBvbiB3aGljaCB5b3UgYXJlIGNoZWNraW4gZm9yIGFuIGVuZGluZyB0YWcKLQkgKiBAcGFyYW0gaW1hZ2VQYXRoCi0JICogICAgICAgICAgICBjb250ZW50IGFzc2lzdCByZWxhdGl2ZSBpbWFnZSBwYXRoCi0JICogQHJldHVybiBJQ29tcGxldGlvblByb3Bvc2FsCi0JICovCi0JcHVibGljIHN0YXRpYyBJQ29tcGxldGlvblByb3Bvc2FsIGNvbXB1dGVYTUxFbmRUYWdQcm9wb3NhbChJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBkb2N1bWVudFBvc2l0aW9uLCBJbmRleGVkUmVnaW9uIGluZGV4ZWROb2RlLCBTdHJpbmcgcGFyZW50VGFnTmFtZSwgU3RyaW5nIGltYWdlUGF0aCkgewotCQlJQ29tcGxldGlvblByb3Bvc2FsIHAgPSBudWxsOwotCi0JCS8vIGNoZWNrIGlmIHRhZyBpcyBjbG9zZWQKLQkJYm9vbGVhbiBoYXNFbmRUYWcgPSB0cnVlOwotCQlJRE9NTm9kZSB4bm9kZSA9IG51bGw7Ci0JCVN0cmluZyB0YWdOYW1lID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaWYgKGluZGV4ZWROb2RlIGluc3RhbmNlb2YgSURPTU5vZGUpIHsKLQkJCXhub2RlID0gKChJRE9NTm9kZSkgaW5kZXhlZE5vZGUpOwotCQkJLy8gaXQncyBlbmRlZCBhbHJlYWR5Li4uCi0JCQlpZiAoeG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbnVsbDsKLQkJCUlET01Ob2RlIHN0eWxlTm9kZSA9IG51bGw7Ci0JCQlpZiAoIXhub2RlLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShwYXJlbnRUYWdOYW1lKSkKLQkJCQlzdHlsZU5vZGUgPSAoSURPTU5vZGUpIHhub2RlLmdldFBhcmVudE5vZGUoKTsKLQkJCWlmIChzdHlsZU5vZGUgIT0gbnVsbCkgewotCQkJCXRhZ05hbWUgPSBzdHlsZU5vZGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQloYXNFbmRUYWcgPSAoc3R5bGVOb2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpOwotCQkJfQotCQl9Ci0KLQkJLy8gaXQncyBjbG9zZWQsIGRvbid0IGFkZCBjbG9zZSB0YWcgcHJvcG9zYWwKLQkJaWYgKCFoYXNFbmRUYWcpIHsKLQotCQkJLy8gY3JlYXRlIGFwcHJvcHJpYXRlIGNsb3NlIHRhZyB0ZXh0Ci0JCQlTdHJpbmcgcHJvcG9zZWRUZXh0ID0gIjwvIiArIHRhZ05hbWU7IC8vJE5PTi1OTFMtMSQKLQkJCVN0cmluZyB2aWV3ZXJUZXh0ID0gdmlld2VyLmdldFRleHRXaWRnZXQoKS5nZXRUZXh0KCk7Ci0JCQlpZiAodmlld2VyVGV4dC5sZW5ndGgoKSA+PSBkb2N1bWVudFBvc2l0aW9uICYmIHZpZXdlclRleHQubGVuZ3RoKCkgPj0gMiAmJiBkb2N1bWVudFBvc2l0aW9uID49IDIpIHsKLQkJCQlTdHJpbmcgbGFzdDJjaGFycyA9IHZpZXdlclRleHQuc3Vic3RyaW5nKGRvY3VtZW50UG9zaXRpb24gLSAyLCBkb2N1bWVudFBvc2l0aW9uKTsKLQkJCQlpZiAobGFzdDJjaGFycy5lbmRzV2l0aCgiPC8iKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9wb3NlZFRleHQgPSB0YWdOYW1lOwotCQkJCWVsc2UgaWYgKGxhc3QyY2hhcnMuZW5kc1dpdGgoIjwiKSkgLy8kTk9OLU5MUy0xJAotCQkJCQlwcm9wb3NlZFRleHQgPSAiLyIgKyB0YWdOYW1lOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCS8vIGNyZWF0ZSBwcm9wb3NhbAotCQkJcCA9IG5ldyBDdXN0b21Db21wbGV0aW9uUHJvcG9zYWwocHJvcG9zZWRUZXh0ICsgIj4iLCAvLyROT04tTkxTLTEkCi0JCQkJCQlkb2N1bWVudFBvc2l0aW9uLCAwLCBwcm9wb3NlZFRleHQubGVuZ3RoKCkgKyAxLCBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5nZXRJbnN0YW5jZSgpLmdldEltYWdlKGltYWdlUGF0aCksIC8vJE5PTi1OTFMtMSQKLQkJCQkJCU5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuRW5kX3dpdGhfLCAobmV3IE9iamVjdFtde3Byb3Bvc2VkVGV4dH0pKSwKLQkJCQkJCW51bGwsIG51bGwsIFhNTFJlbGV2YW5jZUNvbnN0YW50cy5SX0VORF9UQUcpOwotCQl9Ci0JCXJldHVybiBwOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRNZXRhU2NyaXB0VHlwZShEb2N1bWVudCBkb2MpIHsKLQkJLy8gQ2FuIG5vdCBqdXN0IGRvIGEgRG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoU3RyaW5nKSBhcyB0aGlzCi0JCS8vIG5lZWRzCi0JCS8vIHRvIGJlIHJlbGF0aXZlbHkgZmFzdC4KLQkJTGlzdCBtZXRhcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gY2hlY2sgZm9yIE1FVEEgdGFncyB1bmRlciB0aGUgRG9jdW1lbnQKLQkJTm9kZSBodG1sID0gbnVsbDsKLQkJTm9kZSBoZWFkID0gbnVsbDsKLQkJTm9kZSBjaGlsZCA9IG51bGw7Ci0JCS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQkJLy8gKHBhKSAyMDAyMTIxNwotCQkvLyBjbXZjIGRlZmVjdCAyMzU1NTQKLQkJLy8gcGVyZm9ybWFuY2UgZW5oYW5jZW1lbnQ6IHVzaW5nIGNoaWxkLmdldE5leHRTaWJsaW5nKCkgcmF0aGVyIHRoYW4KLQkJLy8gbm9kZUxpc3QoaXRlbSkgZm9yIE8obikgdnMuIE8obipuKQotCQkvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQkJZm9yIChjaGlsZCA9IGRvYy5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkJY29udGludWU7Ci0JCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKQotCQkJCW1ldGFzLmFkZChjaGlsZCk7Ci0JCQllbHNlIGlmIChjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSFRNTCkpCi0JCQkJaHRtbCA9IGNoaWxkOwotCQl9Ci0JCS8vIE5vZGVMaXN0IGNoaWxkcmVuID0gZG9jLmdldENoaWxkTm9kZXMoKTsKLQkJLy8gZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJLy8gY2hpbGQgPSBjaGlsZHJlbi5pdGVtKGkpOwotCQkvLyBpZihjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkvLyBjb250aW51ZTsKLQkJLy8gaWYoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKE1FVEEpKQotCQkvLyBtZXRhcy5hZGQoY2hpbGQpOwotCQkvLyBlbHNlIGlmKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShIVE1MKSkKLQkJLy8gaHRtbCA9IGNoaWxkOwotCQkvLyB9Ci0KLQkJLy8gY2hlY2sgZm9yIE1FVEEgdGFncyB1bmRlciBIRUFECi0JCWlmIChodG1sICE9IG51bGwpIHsKLQkJCWZvciAoY2hpbGQgPSBodG1sLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbCAmJiBoZWFkID09IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJCWlmIChjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJCQljb250aW51ZTsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhFQUQpKQotCQkJCQloZWFkID0gY2hpbGQ7Ci0JCQl9Ci0JCQkvLyBjaGlsZHJlbiA9IGh0bWwuZ2V0Q2hpbGROb2RlcygpOwotCQkJLy8gZm9yKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpICYmIGhlYWQgPT0gbnVsbDsgaSsrKSB7Ci0JCQkvLyBjaGlsZCA9IGNoaWxkcmVuLml0ZW0oaSk7Ci0JCQkvLyBpZihjaGlsZC5nZXROb2RlVHlwZSgpICE9IE5vZGUuRUxFTUVOVF9OT0RFKQotCQkJLy8gY29udGludWU7Ci0JCQkvLyBpZihjaGlsZC5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoSEVBRCkpCi0JCQkvLyBoZWFkID0gY2hpbGQ7Ci0JCQkvLyB9Ci0JCX0KLQotCQlpZiAoaGVhZCAhPSBudWxsKSB7Ci0JCQlmb3IgKGhlYWQuZ2V0Rmlyc3RDaGlsZCgpOyBjaGlsZCAhPSBudWxsOyBjaGlsZCA9IGNoaWxkLmdldE5leHRTaWJsaW5nKCkpIHsKLQkJCQlpZiAoY2hpbGQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCQkJY29udGludWU7Ci0JCQkJaWYgKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkKLQkJCQkJbWV0YXMuYWRkKGNoaWxkKTsKLQkJCX0KLQkJCS8vIGNoaWxkcmVuID0gaGVhZC5nZXRDaGlsZE5vZGVzKCk7Ci0JCQkvLyBmb3IoaW50IGkgPSAwIDsgaSA8IGNoaWxkcmVuLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCS8vIGNoaWxkID0gY2hpbGRyZW4uaXRlbShpKTsKLQkJCS8vIGlmKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5FTEVNRU5UX05PREUpCi0JCQkvLyBjb250aW51ZTsKLQkJCS8vIGlmKGNoaWxkLmdldE5vZGVOYW1lKCkuZXF1YWxzSWdub3JlQ2FzZShNRVRBKSkKLQkJCS8vIG1ldGFzLmFkZChjaGlsZCk7Ci0JCQkvLyB9Ci0JCX0KLQotCQlyZXR1cm4gZ2V0TWV0YVNjcmlwdFR5cGUobWV0YXMpOwotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRNZXRhU2NyaXB0VHlwZShMaXN0IG1ldGFOb2RlTGlzdCkgewotCQlOb2RlIG1ldGEgPSBudWxsOwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IG51bGw7Ci0JCWJvb2xlYW4gaHR0cEVxdWl2ID0gZmFsc2U7Ci0JCVN0cmluZyBjb250ZW50U2NyaXB0VHlwZSA9IG51bGw7Ci0KLQkJZm9yIChpbnQgaSA9IG1ldGFOb2RlTGlzdC5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotCQkJbWV0YSA9IChOb2RlKSBtZXRhTm9kZUxpc3QuZ2V0KGkpOwotCQkJYXR0cmlidXRlcyA9IG1ldGEuZ2V0QXR0cmlidXRlcygpOwotCQkJaHR0cEVxdWl2ID0gZmFsc2U7Ci0JCQljb250ZW50U2NyaXB0VHlwZSA9IG51bGw7Ci0JCQlmb3IgKGludCBqID0gMDsgaiA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGorKykgewotCQkJCWlmIChhdHRyaWJ1dGVzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKEhUVFBfRVFVSVYpKSB7Ci0JCQkJCWh0dHBFcXVpdiA9IGF0dHJpYnV0ZXMuaXRlbShqKS5nZXROb2RlVmFsdWUoKS5lcXVhbHNJZ25vcmVDYXNlKENPTlRFTlRfU0NSSVBUX1RZUEUpOwotCQkJCX0KLQkJCQllbHNlIGlmIChhdHRyaWJ1dGVzLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKENPTlRFTlQpKSB7Ci0JCQkJCWNvbnRlbnRTY3JpcHRUeXBlID0gYXR0cmlidXRlcy5pdGVtKGopLmdldE5vZGVWYWx1ZSgpOwotCQkJCX0KLQkJCX0KLQkJCWlmIChodHRwRXF1aXYgJiYgY29udGVudFNjcmlwdFR5cGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gY29udGVudFNjcmlwdFR5cGU7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIHRoZSBzY3JpcHROb2RlIGlzIGluIEN1cnJlbnRseSByZXR1cm5zCi0JICogamF2YXNjcmlwdCB1bmxlc3Mgc29tZSB1bmtub3duIHR5cGUgb3IgbGFuZ3VhZ2UgaXMgc3BlY2lmaWVkLiBUaGVuIHRoZQotCSAqIHVua25vd24gdHlwZS9sYW5ndWFnZSBpcyByZXR1cm5lZAotCSAqIAotCSAqIEBwYXJhbSBzY3JpcHROb2RlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2NyaXB0TGFuZ3VhZ2UoTm9kZSBzY3JpcHROb2RlKSB7Ci0JCU5vZGUgYXR0ciA9IG51bGw7Ci0KLQkJYm9vbGVhbiBzcGVjaWZpZWQgPSBmYWxzZTsKLQkJLy8gdHJ5IHRvIGZpbmQgYSBzY3JpcHRpbmcgYWRhcHRlciBmb3IgJ3R5cGUnCi0JCWlmICgoc2NyaXB0Tm9kZSA9PSBudWxsKSB8fCAoc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkgPT0gbnVsbCkpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlhdHRyID0gc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJ0eXBlIik7Ly8kTk9OLU5MUy0xJAotCQlpZiAoYXR0ciAhPSBudWxsKSB7Ci0JCQlzcGVjaWZpZWQgPSB0cnVlOwotCQkJU3RyaW5nIHR5cGUgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJcmV0dXJuIGxvb2t1cFNjcmlwdFR5cGUodHlwZSk7Ci0JCX0KLQkJLy8gbm93IHRyeSB0byBmaW5kIGEgc2NyaXB0aW5nIGFkYXB0ZXIgZm9yICdsYW5ndWFnZScgKGRlcHJlY2F0ZWQgYnkKLQkJLy8gSFRNTCBzcGVjaWZpY2F0aW9ucykKLQkJYXR0ciA9IHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgibGFuZ3VhZ2UiKTsvLyROT04tTkxTLTEkCi0JCWlmIChhdHRyICE9IG51bGwpIHsKLQkJCXNwZWNpZmllZCA9IHRydWU7Ci0JCQlTdHJpbmcgbGFuZ3VhZ2UgPSBhdHRyLmdldE5vZGVWYWx1ZSgpOwotCQkJcmV0dXJuIGxvb2t1cFNjcmlwdExhbmd1YWdlKGxhbmd1YWdlKTsKLQkJfQotCQkvLyBjaGVjayBpZiBvbmUgaXMgc3BlY2lmaWVkIGJ5IGEgTUVUQSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb3IgaW5zaWRlCi0JCS8vIG9mIEhFQUQKLQkJU3RyaW5nIHR5cGUgPSBudWxsOwotCQlpZiAoIXNwZWNpZmllZCkKLQkJCXR5cGUgPSBnZXRNZXRhU2NyaXB0VHlwZShzY3JpcHROb2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCXNwZWNpZmllZCA9IHRydWU7Ci0JCQlyZXR1cm4gbG9va3VwU2NyaXB0VHlwZSh0eXBlKTsKLQkJfQotCQkvLyByZXR1cm4gZGVmYXVsdAotCQlpZiAoIXNwZWNpZmllZCkKLQkJCXJldHVybiBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVDsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyB0aGUgJT4gZGVsaW1pdGVyCi0JICogCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUENsb3NlRGVsaW1pdGVyKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm4pIHsKLQkJaWYgKGZuID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBpc0pTUENsb3NlRGVsaW1pdGVyKGZuLmdldFR5cGUoKSk7Ci0JfQotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUENsb3NlRGVsaW1pdGVyKFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAodHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfQ0xPU0UpIHx8IHR5cGUuZXF1YWxzKERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkpOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZmxhdG5vZGUgaXMgdGhlIEpTUCByZWdpb24gPCUlPiwgPCU9JT4sIDwlISU+Ci0JICogCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUERlbGltaXRlcihJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZuKSB7Ci0JCWJvb2xlYW4gaXNEZWxpbWl0ZXIgPSBmYWxzZTsKLQkJU3RyaW5nIHR5cGUgPSBmbi5nZXRUeXBlKCk7Ci0JCWlmICh0eXBlICE9IG51bGwpIHsKLQkJCWlzRGVsaW1pdGVyID0gaXNKU1BEZWxpbWl0ZXIodHlwZSk7Ci0JCX0KLQkJcmV0dXJuIGlzRGVsaW1pdGVyOwotCX0KLQotCS8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BEZWxpbWl0ZXIoU3RyaW5nIHR5cGUpIHsKLQkJaWYgKHR5cGUgPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIChpc0pTUE9wZW5EZWxpbWl0ZXIodHlwZSkgfHwgaXNKU1BDbG9zZURlbGltaXRlcih0eXBlKSk7Ci0JfQotCi0JLyoqCi0JICogVGVsbHMgeW91IGlmIHRoZSBmbGF0bm9kZSBpcyA8JSwgPCU9LCBvciA8JSEgSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YKLQkgKiBoaWRkZW4gSlNQIGtub3dsZWRnZSB0aGF0IHdhcyBpbXBsZW1lbnRlZCB0aGlzIHdheSBmb3IgZXhwZWRlbmN5LgotCSAqIFNob3VsZCBiZSBldm9sdmVkIGluIGZ1dHVyZSB0byBkZXBlbmQgb24gIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0pTUE9wZW5EZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbikgewotCQlpZiAoZm4gPT0gbnVsbCkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIGlzSlNQT3BlbkRlbGltaXRlcihmbi5nZXRUeXBlKCkpOwotCX0KLQotICAgIC8qKgotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNKU1BPcGVuRGVsaW1pdGVyKFN0cmluZyB0eXBlKSB7Ci0JCWlmICh0eXBlID09IG51bGwpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiAodHlwZS5lcXVhbHMoRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weS5KU1BfU0NSSVBUTEVUX09QRU4pIHx8IHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RFQ0xBUkFUSU9OX09QRU4pIHx8IHR5cGUuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0VYUFJFU1NJT05fT1BFTikpOwotCX0KLQotCS8qKgotCSAqIFRlbGxzIHlvdSBpZiB0aGUgZmxhdG5vZGUgaXMgdGhlIDxqc3A6c2NyaXB0bGV0PiwgPGpzcDpleHByZXNzaW9uPiwgb3IKLQkgKiA8anNwOmRlY2xhcmF0aW9uPnRhZwotCSAqIAotCSAqIElTU1VFOiB0aGlzIGlzIGEgYml0IG9mIGhpZGRlbiBKU1Aga25vd2xlZGdlIHRoYXQgd2FzIGltcGxlbWVudGVkIHRoaXMKLQkgKiB3YXkgZm9yIGV4cGVkZW5jeS4gU2hvdWxkIGJlIGV2b2x2ZWQgaW4gZnV0dXJlIHRvIGRlcGVuZCBvbgotCSAqICJuZXN0ZWRDb250ZXh0Ii4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYTUxKU1BEZWxpbWl0ZXIoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbikgewotCQlib29sZWFuIGlzRGVsaW1pdGVyID0gZmFsc2U7Ci0JCWlmIChmbiAhPSBudWxsICYmIGZuIGluc3RhbmNlb2YgSVRleHRSZWdpb25Db250YWluZXIpIHsKLQkJCU9iamVjdFtdIHJlZ2lvbnMgPSAoKElUZXh0UmVnaW9uQ29udGFpbmVyKSBmbikuZ2V0UmVnaW9ucygpLnRvQXJyYXkoKTsKLQkJCUlUZXh0UmVnaW9uIHRlbXAgPSBudWxsOwotCQkJU3RyaW5nIHJlZ2lvblRleHQgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJdGVtcCA9IChJVGV4dFJlZ2lvbikgcmVnaW9uc1tpXTsKLQkJCQlpZiAodGVtcC5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLQkJCQkJcmVnaW9uVGV4dCA9IGZuLmdldFRleHQodGVtcCk7Ci0JCQkJCWlmIChyZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoImpzcDpzY3JpcHRsZXQiKSB8fCByZWdpb25UZXh0LmVxdWFsc0lnbm9yZUNhc2UoImpzcDpleHByZXNzaW9uIikgfHwgcmVnaW9uVGV4dC5lcXVhbHNJZ25vcmVDYXNlKCJqc3A6ZGVjbGFyYXRpb24iKSkgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCWlzRGVsaW1pdGVyID0gdHJ1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGlzRGVsaW1pdGVyOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgImphdmFzY3JpcHQiIGlmIGxhbmd1YWdlIGF0dHJpYnV0ZSBpcyBzb21lIGZvcm0gb2YgamF2YXNjcmlwdCwKLQkgKiAiamF2YSIgaWYgbGFuZ3VhZ2UgYXR0cmlidXRlIGlzIHNvbWUgZm9ybSBvZiBqYXZhLiBPdGhlcndpc2UsIGp1c3QKLQkgKiByZXR1cm5zIHR5cGUuCi0JICogCi0JICogQHBhcmFtIGxhbmd1YWdlCi0JICovCi0JcHVibGljIHN0YXRpYyBTdHJpbmcgbG9va3VwU2NyaXB0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFTQ1JJUFRfTEFOR1VBR0VfS0VZUy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUX0xBTkdVQUdFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZShsYW5ndWFnZSkpCi0JCQkJcmV0dXJuIFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBU0NSSVBUOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgU2NyaXB0TGFuZ3VhZ2VLZXlzLkpBVkFfTEFOR1VBR0VfS0VZUy5sZW5ndGg7IGkrKykgewotCQkJaWYgKFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBX0xBTkdVQUdFX0tFWVNbaV0uZXF1YWxzSWdub3JlQ2FzZShsYW5ndWFnZSkpCi0JCQkJcmV0dXJuIFNjcmlwdExhbmd1YWdlS2V5cy5KQVZBOwotCQl9Ci0JCXJldHVybiBsYW5ndWFnZTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zICJqYXZhc2NyaXB0IiBpZiB0eXBlICh1c2VkIGluIDxzY3JpcHQgdHlwZT0ieHh4Ij4gaXMgYWN0dWFsbHkKLQkgKiBqYXZhc2NyaXB0IHR5cGUuIE90aGVyd2lzZSwganVzdCByZXR1cm5zIHR5cGUKLQkgKiAKLQkgKiBAcGFyYW0gdHlwZQotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIGxvb2t1cFNjcmlwdFR5cGUoU3RyaW5nIHR5cGUpIHsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZUy5sZW5ndGg7IGkrKykKLQkJCWlmIChTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVF9NSU1FX1RZUEVfS0VZU1tpXS5lcXVhbHNJZ25vcmVDYXNlKHR5cGUpKQotCQkJCXJldHVybiBTY3JpcHRMYW5ndWFnZUtleXMuSkFWQVNDUklQVDsKLQkJcmV0dXJuIHR5cGU7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjODdmMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxDb250ZW50TW9kZWxHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudE1vZGVsR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb250ZW50TW9kZWxHZW5lcmF0b3IgewotCi0JLyoqCi0JICogSVNTVUU6IHRoaXMgaXMgYSBiaXQgb2YgaGlkZGVuIEpTUCBrbm93bGVkZ2UgdGhhdCB3YXMgaW1wbGVtZW50ZWQgdGhpcwotCSAqIHdheSBmb3IgZXhwZWRlbmN5LiBTaG91bGQgYmUgZXZvbHZlZCBpbiBmdXR1cmUgdG8gZGVwZW5kIG9uCi0JICogIm5lc3RlZENvbnRleHQiLgotCSAqLwotCXByaXZhdGUgY2xhc3MgRE9NSlNQUmVnaW9uQ29udGV4dHNQcml2YXRlQ29weSB7Ci0JCXByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU1BfRElSRUNUSVZFX09QRU4gPSAiSlNQX0RJUkVDVElWRV9PUEVOIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qKgotCSAqIFhNTENvbnRlbnRNb2RlbEdlbmVyYXRvciBjb25zdHJ1Y3RvciBjb21tZW50LgotCSAqLwotCXB1YmxpYyBYTUxDb250ZW50TW9kZWxHZW5lcmF0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVBdHRyaWJ1dGUoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCB8fCBidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaW50IHVzYWdlID0gYXR0ckRlY2wuZ2V0VXNhZ2UoKTsKLQkJaWYgKHVzYWdlID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQpIHsKLQkJCWJ1ZmZlci5hcHBlbmQoIiAiKTsgLy8kTk9OLU5MUy0xJAotCQkJZ2VuZXJhdGVSZXF1aXJlZEF0dHJpYnV0ZShudWxsLCBhdHRyRGVjbCwgYnVmZmVyKTsgLy8gdG9kbyBwYXNzCi0JCQkvLyBvd25lck5vZGUgYXMKLQkJCS8vIDFzdCBwYXJhbQotCQl9Ci0JCXJldHVybjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBnZW5lcmF0ZUVuZFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJaWYgKGVsZW1lbnREZWNsLmdldENvbnRlbnRUeXBlKCkgIT0gQ01FbGVtZW50RGVjbGFyYXRpb24uRU1QVFkpCi0JCQlidWZmZXIuYXBwZW5kKCI8LyIgKyB0YWdOYW1lICsgIj4iKTsvLyROT04tTkxTLTIkLy8kTk9OLU5MUy0xJAotCQlyZXR1cm47Ci0JfQotCi0JcHVibGljIHZvaWQgZ2VuZXJhdGVSZXF1aXJlZEF0dHJpYnV0ZShOb2RlIG93bmVyTm9kZSwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoYXR0ckRlY2wgPT0gbnVsbCB8fCBidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQotCQkvLyBhdHRyaWJ1dGUgbmFtZQotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGdldFJlcXVpcmVkTmFtZShvd25lck5vZGUsIGF0dHJEZWNsKTsKLQkJQ01EYXRhVHlwZSBhdHRyVHlwZSA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCk7Ci0JCS8vID0gc2lnbgotCQlidWZmZXIuYXBwZW5kKGF0dHJpYnV0ZU5hbWUgKyAiPVwiIik7IC8vJE5PTi1OTFMtMSQKLQkJLy8gYXR0cmlidXRlIHZhbHVlCi0JCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBpbnNlcnQgYW55IHZhbHVlIHRoYXQgaXMgaW1wbGllZAotCQkJaWYgKGF0dHJUeXBlLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfTk9ORSAmJiBhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKSB7Ci0JCQkJYnVmZmVyLmFwcGVuZChhdHRyVHlwZS5nZXRJbXBsaWVkVmFsdWUoKSk7Ci0JCQl9Ci0JCQkvLyBvdGhlcndpc2UsIGlmIGFuIGVudW1lcmF0ZWQgbGlzdCBvZiB2YWx1ZXMgZXhpc3RzLCB1c2UgdGhlCi0JCQkvLyBmaXJzdCB2YWx1ZQotCQkJZWxzZSBpZiAoYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpICE9IG51bGwgJiYgYXR0clR5cGUuZ2V0RW51bWVyYXRlZFZhbHVlcygpLmxlbmd0aCA+IDApIHsKLQkJCQlidWZmZXIuYXBwZW5kKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKVswXSk7Ci0JCQl9Ci0JCX0KLQkJYnVmZmVyLmFwcGVuZCgiXCIiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm47Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZ2VuZXJhdGVTdGFydFRhZyhTdHJpbmcgdGFnTmFtZSwgTm9kZSBwYXJlbnROb2RlLCBDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotCQlpZiAoZWxlbWVudERlY2wgPT0gbnVsbCB8fCBidWZmZXIgPT0gbnVsbCkKLQkJCXJldHVybjsKLQkJYnVmZmVyLmFwcGVuZCgiPCIgKyB0YWdOYW1lKTsvLyROT04tTkxTLTEkCi0JCWdlbmVyYXRlQXR0cmlidXRlcyhlbGVtZW50RGVjbCwgYnVmZmVyKTsKLQkJYnVmZmVyLmFwcGVuZChnZXRTdGFydFRhZ0Nsb3NlKHBhcmVudE5vZGUsIGVsZW1lbnREZWNsKSk7Ci0JCXJldHVybjsKLQl9Ci0KLQlwdWJsaWMgaW50IGdldE1pbmltYWxTdGFydFRhZ0xlbmd0aChOb2RlIG5vZGUsIENNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsKSB7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuIDA7Ci0JCWlmIChyZXF1aXJlc0F0dHJpYnV0ZXMoZWxlbWVudERlY2wpKSB7Ci0JCQlyZXR1cm4gZ2V0UmVxdWlyZWROYW1lKG5vZGUsIGVsZW1lbnREZWNsKS5sZW5ndGgoKSArIDI7IC8vIDwgKwotCQkJLy8gbmFtZSArCi0JCQkvLyBzcGFjZQotCQl9Ci0JCWVsc2UgewotCQkJcmV0dXJuIDEgKyBnZXRSZXF1aXJlZE5hbWUobm9kZSwgZWxlbWVudERlY2wpLmxlbmd0aCgpICsgZ2V0U3RhcnRUYWdDbG9zZShub2RlLCBlbGVtZW50RGVjbCkubGVuZ3RoKCk7IC8vIDwgKwotCQkJLy8gbmFtZQotCQkJLy8gKwotCQkJLy8gYXBwcm9wcmlhdGUKLQkJCS8vIGNsb3NlCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE90aGVyQ2xvc2UoTm9kZSBub3RBVGFnTm9kZSkgewotCQlpZiAobm90QVRhZ05vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBub2RlID0gKChJRE9NTm9kZSkgbm90QVRhZ05vZGUpLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0TnVtYmVyT2ZSZWdpb25zKCkgPiAxICYmIG5vZGUuZ2V0UmVnaW9ucygpLmdldCgwKS5nZXRUeXBlKCkuZXF1YWxzKERPTUpTUFJlZ2lvbkNvbnRleHRzUHJpdmF0ZUNvcHkuSlNQX0RJUkVDVElWRV9PUEVOKSkgewotCQkJCXJldHVybiAiJT4iOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRTdGFydFRhZ0Nsb3NlKE5vZGUgcGFyZW50Tm9kZSwgQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wpIHsKLQkJU3RyaW5nIG90aGVyID0gZ2V0T3RoZXJDbG9zZShwYXJlbnROb2RlKTsKLQkJaWYgKG90aGVyICE9IG51bGwpCi0JCQlyZXR1cm4gb3RoZXI7Ci0JCWlmIChlbGVtZW50RGVjbCA9PSBudWxsKQotCQkJcmV0dXJuICI+IjsvLyROT04tTkxTLTEkCi0JCWlmIChlbGVtZW50RGVjbC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLkVNUFRZKQotCQkJcmV0dXJuICIvPiI7IC8vJE5PTi1OTFMtMSQKLQkJcmV0dXJuICI+IjsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFJlbGV2YW5jZUNvbnN0YW50cy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzM1NTQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRhc3Npc3QvWE1MUmVsZXZhbmNlQ29uc3RhbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5JUmVsZXZhbmNlQ29uc3RhbnRzOwotCi0KLQotLyoqCi0gKiBzb21lIHJlbGV2YW5jZSBjb25zdGFudHMgZm9yIGNvbnRlbnQgYXNzaXN0IGhpZ2hlciByZWxldmFuY2UgbWVhbnMgaXQgc2hvd3MKLSAqIHVwIGhpZ2hlciBvbiB0aGUgbGlzdAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFhNTFJlbGV2YW5jZUNvbnN0YW50cyBleHRlbmRzIElSZWxldmFuY2VDb25zdGFudHMgewotCi0JaW50IFJfQ0RBVEEgPSA0MDA7Ci0JaW50IFJfQ0xPU0VfVEFHID0gMTUwMDsKLQotCWludCBSX0NPTU1FTlQgPSAxMDA7Ci0KLQkvLyBtb3ZlZCB0aGlzIGFib3ZlIG1hY3JvcwotCWludCBSX0RPQ1RZUEUgPSA2MDA7Ci0JaW50IFJfRU5EX1RBRyA9IDE0MDA7Ci0JaW50IFJfRU5EX1RBR19OQU1FID0gMTEwMDsKLQlpbnQgUl9FTlRJVFkgPSAxMDAwOwotCWludCBSX0pTUCA9IDUwMDsKLQotCWludCBSX0pTUF9BVFRSSUJVVEVfVkFMVUUgPSA3MDA7Ci0KLQkvLyAocGEpIG1ha2UgdGhlc2UgdGhlIHNhbWUgcmVsZXZhbmNlIHNvIHByb3Bvc2FscyBhcmUgc2FtZSBvcmRlciBmb3IgVjUwMQotCWludCBSX01BQ1JPID0gNTAwOwotCi0JLy8gYWRkIHRoaXMgb250byAicmVxdWlyZWQiIGF0dHJzLCBlbGVtZW50cywgZXRjIHRvIGJ1YmJsZSB0aGVtIHVwIG9uCi0JLy8gc29ydGluZy4uLgotCS8vIENNVkMgMjQ2NjE4Ci0JaW50IFJfUkVRVUlSRUQgPSAxMDsKLQlpbnQgUl9UQUdfSU5TRVJUSU9OID0gNTAwOwotICAgIGludCBSX1NUUklDVExZX1ZBTElEX1RBR19JTlNFUlRJT04gPSA2MDA7Ci0JaW50IFJfVEFHX05BTUUgPSAxMjAwOwotCWludCBSX1hNTF9BVFRSSUJVVEVfTkFNRSA9IDkwMDsKLQlpbnQgUl9YTUxfQVRUUklCVVRFX1ZBTFVFID0gODAwOwotCWludCBSX1hNTF9ERUNMQVJBVElPTiA9IDEzMDA7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudGFzc2lzdC9YTUxUZW1wbGF0ZUNvbXBsZXRpb25Qcm9jZXNzb3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTAyZDgyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50YXNzaXN0L1hNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3Nvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkNvbnRleHRUeXBlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb21wbGV0aW9uUHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5UZW1wbGF0ZUNvbnRleHRUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMucGVyc2lzdGVuY2UuVGVtcGxhdGVTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLQotLyoqCi0gKiBDb21wbGV0aW9uIHByb2Nlc3NvciBmb3IgWE1MIFRlbXBsYXRlcy4gTW9zdCBvZiB0aGUgd29yayBpcyBhbHJlYWR5IGRvbmUgYnkKLSAqIHRoZSBYTUwgQ29udGVudCBBc3Npc3QgcHJvY2Vzc29yLCBzbyBieSB0aGUgdGltZSB0aGUKLSAqIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBpcyBhc2tlZCBmb3IgY29udGVudCBhc3Npc3QgcHJvcG9zYWxzLCB0aGUKLSAqIFhNTCBjb250ZW50IGFzc2lzdCBwcm9jZXNzb3IgaGFzIGFscmVhZHkgc2V0IHRoZSBjb250ZXh0IHR5cGUgZm9yCi0gKiB0ZW1wbGF0ZXMuCi0gKi8KLWNsYXNzIFhNTFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciBleHRlbmRzIFRlbXBsYXRlQ29tcGxldGlvblByb2Nlc3NvciB7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJvcG9zYWxDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvciB7Ci0JCXB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotCQkJcmV0dXJuICgoVGVtcGxhdGVQcm9wb3NhbCkgbzIpLmdldFJlbGV2YW5jZSgpIC0gKChUZW1wbGF0ZVByb3Bvc2FsKSBvMSkuZ2V0UmVsZXZhbmNlKCk7Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yIGZnUHJvcG9zYWxDb21wYXJhdG9yID0gbmV3IFByb3Bvc2FsQ29tcGFyYXRvcigpOwotCXByaXZhdGUgU3RyaW5nIGZDb250ZXh0VHlwZUlkID0gbnVsbDsKLQotCS8qCi0JICogQ29waWVkIGZyb20gc3VwZXIgY2xhc3MgZXhjZXB0IGluc3RlYWQgb2YgY2FsbGluZyBjcmVhdGVDb250ZXh0KHZpZXdlciwKLQkgKiByZWdpb24pIGNhbGwgY3JlYXRlQ29udGV4dCh2aWV3ZXIsIHJlZ2lvbiwgb2Zmc2V0KSBpbnN0ZWFkCi0JICovCi0JcHVibGljIElDb21wbGV0aW9uUHJvcG9zYWxbXSBjb21wdXRlQ29tcGxldGlvblByb3Bvc2FscyhJVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQotCQlJVGV4dFNlbGVjdGlvbiBzZWxlY3Rpb24gPSAoSVRleHRTZWxlY3Rpb24pIHZpZXdlci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCi0JCS8vIGFkanVzdCBvZmZzZXQgdG8gZW5kIG9mIG5vcm1hbGl6ZWQgc2VsZWN0aW9uCi0JCWlmIChzZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgPT0gb2Zmc2V0KQotCQkJb2Zmc2V0ID0gc2VsZWN0aW9uLmdldE9mZnNldCgpICsgc2VsZWN0aW9uLmdldExlbmd0aCgpOwotCi0JCVN0cmluZyBwcmVmaXggPSBleHRyYWN0UHJlZml4KHZpZXdlciwgb2Zmc2V0KTsKLQkJUmVnaW9uIHJlZ2lvbiA9IG5ldyBSZWdpb24ob2Zmc2V0IC0gcHJlZml4Lmxlbmd0aCgpLCBwcmVmaXgubGVuZ3RoKCkpOwotCQlUZW1wbGF0ZUNvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQodmlld2VyLCByZWdpb24sIG9mZnNldCk7Ci0JCWlmIChjb250ZXh0ID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IElDb21wbGV0aW9uUHJvcG9zYWxbMF07Ci0KLQkJLy8gbmFtZSBvZiB0aGUgc2VsZWN0aW9uIHZhcmlhYmxlcyB7bGluZSwgd29yZH1fc2VsZWN0aW9uCi0JCWNvbnRleHQuc2V0VmFyaWFibGUoInNlbGVjdGlvbiIsIHNlbGVjdGlvbi5nZXRUZXh0KCkpOyAvLyROT04tTkxTLTEkCi0KLQkJVGVtcGxhdGVbXSB0ZW1wbGF0ZXMgPSBnZXRUZW1wbGF0ZXMoY29udGV4dC5nZXRDb250ZXh0VHlwZSgpLmdldElkKCkpOwotCi0JCUxpc3QgbWF0Y2hlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0ZW1wbGF0ZXMubGVuZ3RoOyBpKyspIHsKLQkJCVRlbXBsYXRlIHRlbXBsYXRlID0gdGVtcGxhdGVzW2ldOwotCQkJdHJ5IHsKLQkJCQljb250ZXh0LmdldENvbnRleHRUeXBlKCkudmFsaWRhdGUodGVtcGxhdGUuZ2V0UGF0dGVybigpKTsKLQkJCX0KLQkJCWNhdGNoIChUZW1wbGF0ZUV4Y2VwdGlvbiBlKSB7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAodGVtcGxhdGUubWF0Y2hlcyhwcmVmaXgsIGNvbnRleHQuZ2V0Q29udGV4dFR5cGUoKS5nZXRJZCgpKSkKLQkJCQltYXRjaGVzLmFkZChjcmVhdGVQcm9wb3NhbCh0ZW1wbGF0ZSwgY29udGV4dCwgKElSZWdpb24pIHJlZ2lvbiwgZ2V0UmVsZXZhbmNlKHRlbXBsYXRlLCBwcmVmaXgpKSk7Ci0JCX0KLQotCQlDb2xsZWN0aW9ucy5zb3J0KG1hdGNoZXMsIGZnUHJvcG9zYWxDb21wYXJhdG9yKTsKLQotCQlyZXR1cm4gKElDb21wbGV0aW9uUHJvcG9zYWxbXSkgbWF0Y2hlcy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW21hdGNoZXMuc2l6ZSgpXSk7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIGNvbmNyZXRlIHRlbXBsYXRlIGNvbnRleHQgZm9yIHRoZSBnaXZlbiByZWdpb24gaW4gdGhlCi0JICogZG9jdW1lbnQuIFRoaXMgaW52b2x2ZXMgZmluZGluZyBvdXQgd2hpY2ggY29udGV4dCB0eXBlIGlzIHZhbGlkIGF0IHRoZQotCSAqIGdpdmVuIGxvY2F0aW9uLCBhbmQgdGhlbiBjcmVhdGluZyBhIGNvbnRleHQgb2YgdGhpcyB0eXBlLiBUaGUgZGVmYXVsdAotCSAqIGltcGxlbWVudGF0aW9uIHJldHVybnMgYSA8Y29kZT5TbWFydFJlcGxhY2VUZW1wbGF0ZUNvbnRleHQ8L2NvZGU+IGZvcgotCSAqIHRoZSBjb250ZXh0IHR5cGUgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLiBUaGlzIHRha2VzIHRoZSBvZmZzZXQgYXQgd2hpY2gKLQkgKiBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZCBpbnRvIGNvbnNpZGVyYXRpb24uCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIHZpZXdlciBmb3Igd2hpY2ggdGhlIGNvbnRleHQgaXMgY3JlYXRlZAotCSAqIEBwYXJhbSByZWdpb24KLQkgKiAgICAgICAgICAgIHRoZSByZWdpb24gaW50byA8Y29kZT5kb2N1bWVudDwvY29kZT4gZm9yIHdoaWNoIHRoZQotCSAqICAgICAgICAgICAgY29udGV4dCBpcyBjcmVhdGVkCi0JICogQHBhcmFtIG9mZnNldAotCSAqICAgICAgICAgICAgdGhlIG9yaWdpbmFsIG9mZnNldCB3aGVyZSBjb250ZW50IGFzc2lzdCB3YXMgaW52b2tlZAotCSAqIEByZXR1cm4gYSB0ZW1wbGF0ZSBjb250ZXh0IHRoYXQgY2FuIGhhbmRsZSB0ZW1wbGF0ZSBpbnNlcnRpb24gYXQgdGhlCi0JICogICAgICAgICBnaXZlbiBsb2NhdGlvbiwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLQkgKi8KLQlwcml2YXRlIFRlbXBsYXRlQ29udGV4dCBjcmVhdGVDb250ZXh0KElUZXh0Vmlld2VyIHZpZXdlciwgSVJlZ2lvbiByZWdpb24sIGludCBvZmZzZXQpIHsKLQkJLy8gcHJldHR5IG11Y2ggc2FtZSBjb2RlIGFzIHN1cGVyLmNyZWF0ZUNvbnRleHQgZXhjZXB0IGNyZWF0ZQotCQkvLyBTbWFydFJlcGxhY2VUZW1wbGF0ZUNvbnRleHQKLQkJVGVtcGxhdGVDb250ZXh0VHlwZSBjb250ZXh0VHlwZSA9IGdldENvbnRleHRUeXBlKHZpZXdlciwgcmVnaW9uKTsKLQkJaWYgKGNvbnRleHRUeXBlICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQkJcmV0dXJuIG5ldyBSZXBsYWNlTmFtZVRlbXBsYXRlQ29udGV4dChjb250ZXh0VHlwZSwgZG9jdW1lbnQsIHJlZ2lvbi5nZXRPZmZzZXQoKSwgcmVnaW9uLmdldExlbmd0aCgpLCBvZmZzZXQpOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXByb3RlY3RlZCBJQ29tcGxldGlvblByb3Bvc2FsIGNyZWF0ZVByb3Bvc2FsKFRlbXBsYXRlIHRlbXBsYXRlLCBUZW1wbGF0ZUNvbnRleHQgY29udGV4dCwgSVJlZ2lvbiByZWdpb24sIGludCByZWxldmFuY2UpIHsKLQkJcmV0dXJuIG5ldyBDdXN0b21UZW1wbGF0ZVByb3Bvc2FsKHRlbXBsYXRlLCBjb250ZXh0LCByZWdpb24sIGdldEltYWdlKHRlbXBsYXRlKSwgcmVsZXZhbmNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGVtcGxhdGVDb250ZXh0VHlwZSBnZXRDb250ZXh0VHlwZShJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gcmVnaW9uKSB7Ci0JCVRlbXBsYXRlQ29udGV4dFR5cGUgdHlwZSA9IG51bGw7Ci0KLQkJQ29udGV4dFR5cGVSZWdpc3RyeSByZWdpc3RyeSA9IGdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCk7Ci0JCWlmIChyZWdpc3RyeSAhPSBudWxsKQotCQkJdHlwZSA9IHJlZ2lzdHJ5LmdldENvbnRleHRUeXBlKGZDb250ZXh0VHlwZUlkKTsKLQotCQlyZXR1cm4gdHlwZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgZ2V0SW1hZ2UoVGVtcGxhdGUgdGVtcGxhdGUpIHsKLQkJLy8ganVzdCByZXR1cm4gdGhlIHNhbWUgaW1hZ2UgZm9yIG5vdwotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfTUFDUk8pOwotCX0KLQotCXByaXZhdGUgQ29udGV4dFR5cGVSZWdpc3RyeSBnZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZUNvbnRleHRSZWdpc3RyeSgpOwotCX0KLQotCXByb3RlY3RlZCBUZW1wbGF0ZVtdIGdldFRlbXBsYXRlcyhTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlUZW1wbGF0ZSB0ZW1wbGF0ZXNbXSA9IG51bGw7Ci0KLQkJVGVtcGxhdGVTdG9yZSBzdG9yZSA9IGdldFRlbXBsYXRlU3RvcmUoKTsKLQkJaWYgKHN0b3JlICE9IG51bGwpCi0JCQl0ZW1wbGF0ZXMgPSBzdG9yZS5nZXRUZW1wbGF0ZXMoY29udGV4dFR5cGVJZCk7Ci0KLQkJcmV0dXJuIHRlbXBsYXRlczsKLQl9Ci0KLQlwcml2YXRlIFRlbXBsYXRlU3RvcmUgZ2V0VGVtcGxhdGVTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZW1wbGF0ZVN0b3JlKCk7Ci0JfQotCi0Jdm9pZCBzZXRDb250ZXh0VHlwZShTdHJpbmcgY29udGV4dFR5cGVJZCkgewotCQlmQ29udGV4dFR5cGVJZCA9IGNvbnRleHRUeXBlSWQ7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZTRjNDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5yZXNvdXJjZS5JbWFnZVJlZ2lzdHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkpGYWNlUmVzb3VyY2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5DTUltYWdlVXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBBZGFwdHMgYSBET00gbm9kZSB0byBhIEpGYWNlIHZpZXdlci4KLSAqLwotcHVibGljIGNsYXNzIEpGYWNlTm9kZUFkYXB0ZXIgaW1wbGVtZW50cyBJSkZhY2VOb2RlQWRhcHRlciB7Ci0KLQlmaW5hbCBzdGF0aWMgQ2xhc3MgQURBUFRFUl9LRVkgPSBJSkZhY2VOb2RlQWRhcHRlci5jbGFzczsKLQotCS8qKgotCSAqIGRlYnVnIC5vcHRpb24KLQkgKi8KLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZ2V0RGVidWdWYWx1ZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBnZXREZWJ1Z1ZhbHVlKCkgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9vdXRsaW5lIik7IC8vJE5PTi1OTFMtMSQKLQkJYm9vbGVhbiByZXN1bHQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IGZBZGFwdGVyRmFjdG9yeTsKLQlwcml2YXRlIFJlZnJlc2hTdHJ1Y3R1cmVKb2IgZlJlZnJlc2hKb2IgPSBudWxsOwotCi0JcHVibGljIEpGYWNlTm9kZUFkYXB0ZXIoSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgYWRhcHRlckZhY3RvcnkpIHsKLQkJc3VwZXIoKTsKLQkJdGhpcy5mQWRhcHRlckZhY3RvcnkgPSBhZGFwdGVyRmFjdG9yeTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgY3JlYXRlSW1hZ2UoT2JqZWN0IG9iamVjdCkgewotCQlJbWFnZSBpbWFnZSA9IG51bGw7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCXN3aXRjaCAobm9kZS5nZXROb2RlVHlwZSgpKSB7Ci0JCQljYXNlIE5vZGUuRUxFTUVOVF9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkFUVFJJQlVURV9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0FUVFJJQlVURSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuVEVYVF9OT0RFIDogeyAvLyBhY3R1YWxseSwgVEVYVCBzaG91bGQgbmV2ZXIgYmUgc2VlbiBpbgotCQkJCS8vIHRoZSB0cmVlCi0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRUxFTUVOVCk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuQ0RBVEFfU0VDVElPTl9OT0RFIDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NEQVRBU0VDVElPTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFIDoKLQkJCWNhc2UgTm9kZS5FTlRJVFlfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTlRJVFkpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLlBST0NFU1NJTkdfSU5TVFJVQ1RJT05fTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04pOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBOb2RlLkNPTU1FTlRfTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT01NRU5UKTsKLQkJCQlicmVhazsKLQkJCX0KLQkJCWNhc2UgTm9kZS5ET0NVTUVOVF9UWVBFX05PREUgOiB7Ci0JCQkJaW1hZ2UgPSBjcmVhdGVYTUxJbWFnZURlc2NyaXB0b3IoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRE9DVFlQRSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE5vZGUuTk9UQVRJT05fTk9ERSA6IHsKLQkJCQlpbWFnZSA9IGNyZWF0ZVhNTEltYWdlRGVzY3JpcHRvcihYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9OT1RBVElPTik7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQlkZWZhdWx0IDogewotCQkJCWltYWdlID0gY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VMRU1FTlQpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSW1hZ2UgY3JlYXRlWE1MSW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpbWFnZVJlc291cmNlTmFtZSkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShpbWFnZVJlc291cmNlTmFtZSk7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQotCQkvLyAocGEpIDIwMDIxMjE3Ci0JCS8vIGNtdmMgZGVmZWN0IDIzNTU1NAotCQkvLyBwZXJmb3JtYW5jZSBlbmhhbmNlbWVudDogdXNpbmcgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSByYXRoZXIgdGhhbgotCQkvLyBub2RlTGlzdChpdGVtKSBmb3IgTyhuKSB2cy4gTyhuKm4pCi0JCS8vCi0JCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0JCUFycmF5TGlzdCB2ID0gbmV3IEFycmF5TGlzdCgpOwotCQlmb3IgKE5vZGUgY2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsgY2hpbGQgIT0gbnVsbDsgY2hpbGQgPSBjaGlsZC5nZXROZXh0U2libGluZygpKSB7Ci0JCQlOb2RlIG4gPSBjaGlsZDsKLQkJCWlmIChuLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQkJdi5hZGQobik7Ci0JCX0KLQkJcmV0dXJuIHYudG9BcnJheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gZW51bWVyYXRpb24gd2l0aCB0aGUgZWxlbWVudHMgYmVsb25naW5nIHRvIHRoZSBwYXNzZWQKLQkgKiBlbGVtZW50LiBUaGVzZSBhcmUgdGhlIHRvcCBsZXZlbCBpdGVtcyBpbiBhIGxpc3QsIHRyZWUsIHRhYmxlLCBldGMuLi4KLQkgKi8KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG5vZGUpIHsKLQkJcmV0dXJuIGdldENoaWxkcmVuKG5vZGUpOwotCX0KLQotCS8qKgotCSAqIEZldGNoZXMgdGhlIGxhYmVsIGltYWdlIHNwZWNpZmljIHRvIHRoaXMgb2JqZWN0IGluc3RhbmNlLgotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRMYWJlbEltYWdlKE9iamVjdCBub2RlKSB7Ci0JCUltYWdlIGltYWdlID0gQ01JbWFnZVV0aWwuZ2V0SW1hZ2UoQ01JbWFnZVV0aWwuZ2V0RGVjbGFyYXRpb24oKE5vZGUpIG5vZGUpKTsKLQkJaWYgKGltYWdlID09IG51bGwgJiYgSkZhY2VSZXNvdXJjZXMuZ2V0SW1hZ2VSZWdpc3RyeSgpICE9IG51bGwpIHsKLQkJCUltYWdlUmVnaXN0cnkgaW1hZ2VSZWdpc3RyeSA9IEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IGdldE5vZGVOYW1lKG5vZGUpOwotCQkJaW1hZ2UgPSBpbWFnZVJlZ2lzdHJ5LmdldChub2RlTmFtZSk7Ci0JCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJCWltYWdlID0gY3JlYXRlSW1hZ2Uobm9kZSk7Ci0JCQkJaWYgKGltYWdlICE9IG51bGwpCi0JCQkJCWltYWdlUmVnaXN0cnkucHV0KG5vZGVOYW1lLCBpbWFnZSk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIEZldGNoZXMgdGhlIGxhYmVsIHRleHQgc3BlY2lmaWMgdG8gdGhpcyBvYmplY3QgaW5zdGFuY2UuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRMYWJlbFRleHQoT2JqZWN0IG5vZGUpIHsKLQkJcmV0dXJuIGdldE5vZGVOYW1lKG5vZGUpOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldE5vZGVOYW1lKE9iamVjdCBvYmplY3QpIHsKLQkJU3RyaW5nQnVmZmVyIG5vZGVOYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCQlOb2RlIG5vZGUgPSAoTm9kZSkgb2JqZWN0OwotCQlub2RlTmFtZS5hcHBlbmQobm9kZS5nZXROb2RlTmFtZSgpKTsKLQotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQlub2RlTmFtZS5pbnNlcnQoMCwgIkRPQ1RZUEU6Iik7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gbm9kZU5hbWUudG9TdHJpbmcoKTsKLQl9Ci0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJcmV0dXJuIG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCX0KLQotCXByaXZhdGUgc3luY2hyb25pemVkIFJlZnJlc2hTdHJ1Y3R1cmVKb2IgZ2V0UmVmcmVzaEpvYigpIHsKLQkJaWYgKGZSZWZyZXNoSm9iID09IG51bGwpCi0JCQlmUmVmcmVzaEpvYiA9IG5ldyBSZWZyZXNoU3RydWN0dXJlSm9iKCk7Ci0JCXJldHVybiBmUmVmcmVzaEpvYjsKLQl9Ci0KLQotCXB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJLy8gKHBhKSAyMDAyMTIxNwotCQkvLyBjbXZjIGRlZmVjdCAyMzU1NTQgPiB1c2UgY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSBpbnN0ZWFkIG9mCi0JCS8vIG5vZGVMaXN0KGl0ZW0pIGZvciBPKG4pIHZzLiBPKG4qbikKLQkJTm9kZSBub2RlID0gKE5vZGUpIG9iamVjdDsKLQkJZm9yIChOb2RlIGNoaWxkID0gbm9kZS5nZXRGaXJzdENoaWxkKCk7IGNoaWxkICE9IG51bGw7IGNoaWxkID0gY2hpbGQuZ2V0TmV4dFNpYmxpbmcoKSkgewotCQkJaWYgKGNoaWxkLmdldE5vZGVUeXBlKCkgIT0gTm9kZS5URVhUX05PREUpCi0JCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIEFsbG93aW5nIHRoZSBJTm9kZUFkYXB0ZXIgdG8gY29tcGFyZSBpdHNlbGYgYWdhaW5zdCB0aGUgdHlwZSBhbGxvd3MgaXQKLQkgKiB0byByZXR1cm4gdHJ1ZSBpbiBtb3JlIHRoYW4gb25lIGNhc2UuCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlpZiAodHlwZSA9PSBudWxsKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQkJcmV0dXJuIHR5cGUuZXF1YWxzKEFEQVBURVJfS0VZKTsKLQl9Ci0KLQkvKioKLQkgKiBDYWxsZWQgYnkgdGhlIG9iamVjdCBiZWluZyBhZGFwdGVyICh0aGUgbm90aWZpZXIpIHdoZW4gc29tZXRoaW5nIGhhcwotCSAqIGNoYW5nZWQuCi0JICovCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGZ1dHVyZV9UT0RPOiB0aGUgJ3Vpam9icycgdXNlZCBpbiB0aGlzIG1ldGhvZCB3ZXJlIGFkZGVkIHRvIHNvbHZlCi0JCS8vIHRocmVhZGluZyBwcm9ibGVtcyB3aGVuIHRoZSBkb20KLQkJLy8gaXMgdXBkYXRlZCBpbiB0aGUgYmFja2dyb3VuZCB3aGlsZSB0aGUgZWRpdG9yIGlzIG9wZW4uIFRoZXkgbWF5IGJlCi0JCS8vIGEgYml0IG92ZXJraWxsIGFuZCBub3QgdGhhdCB1c2VmdWwuCi0JCS8vIChUaGF0IGlzLCBtYXkgYmUgYmUgd29ydGh5IG9mIGpvYiBtYW5hZ2VyIG1hbmFnZW1lbnQpLiBJZiB0aGV5IGFyZQotCQkvLyBmb3VuZCB0byBiZSBpbXBvcnRhbnQgZW5vdWdoIHRvIGxlYXZlIGluLAotCQkvLyB0aGVyZSdzIHByb2JhYmx5IHNvbWUgb3B0aW1pemF0aW9uIHRoYXQgY2FuIGJlIGRvbmUuCi0JCWlmIChub3RpZmllciBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCUNvbGxlY3Rpb24gbGlzdGVuZXJzID0gZkFkYXB0ZXJGYWN0b3J5LmdldExpc3RlbmVycygpOwotCQkJSXRlcmF0b3IgaXRlcmF0b3IgPSBsaXN0ZW5lcnMuaXRlcmF0b3IoKTsKLQotCQkJd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgewotCQkJCU9iamVjdCBsaXN0ZW5lciA9IGl0ZXJhdG9yLm5leHQoKTsKLQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9OTA2MzcKLQkJCQkvLyBpZiAobm90aWZpZXIgaW5zdGFuY2VvZiBOb2RlICYmIChsaXN0ZW5lciBpbnN0YW5jZW9mCi0JCQkJLy8gU3RydWN0dXJlZFZpZXdlcikgJiYgKGV2ZW50VHlwZSA9PQotCQkJCS8vIElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgfHwgKGV2ZW50VHlwZSA9PQotCQkJCS8vIElOb2RlTm90aWZpZXIuQ0hBTkdFICYmIGNoYW5nZWRGZWF0dXJlID09IG51bGwpKSkgewotCQkJCWlmICgobGlzdGVuZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVmlld2VyKSAmJiAoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQgfHwgZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuQ09OVEVOVF9DSEFOR0VEIHx8IChldmVudFR5cGUgPT0gSU5vZGVOb3RpZmllci5DSEFOR0UpKSkgewotCQkJCQlpZiAoREVCVUcpIHsKLQkJCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiSkZhY2VOb2RlQWRhcHRlciBub3RpZmllZCBvbiBldmVudCB0eXBlID4gIiArIGV2ZW50VHlwZSk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJfQotCi0JCQkJCS8vIHJlZnJlc2ggb24gc3RydWN0dXJhbCBhbmQgInVua25vd24iIGNoYW5nZXMKLQkJCQkJU3RydWN0dXJlZFZpZXdlciBzdHJ1Y3R1cmVkVmlld2VyID0gKFN0cnVjdHVyZWRWaWV3ZXIpIGxpc3RlbmVyOwotCQkJCQkvLyBodHRwczovL3czLm9wZW5zb3VyY2UuaWJtLmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NTIzMAotCQkJCQlpZiAoc3RydWN0dXJlZFZpZXdlci5nZXRDb250cm9sKCkgIT0gbnVsbCkgewotCQkJCQkJZ2V0UmVmcmVzaEpvYigpLnJlZnJlc2goc3RydWN0dXJlZFZpZXdlciwgKE5vZGUpIG5vdGlmaWVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVBZGFwdGVyRmFjdG9yeS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZThiNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkucHJvZ3Jlc3MuVUlKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLkFic3RyYWN0QWRhcHRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuQ01Eb2N1bWVudE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRG9jdW1lbnRDYWNoZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuc3NlbW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5QWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLQotLyoqCi0gKiBBbiBhZGFwdGVyIGZhY3RvcnkgdG8gY3JlYXRlIEpGYWNlTm9kZUFkYXB0ZXJzLiBVc2UgdGhpcyBhZGFwdGVyIGZhY3RvcnkKLSAqIHdpdGggYSBKRmFjZUFkYXB0ZXJDb250ZW50UHJvdmlkZXIgdG8gZGlzcGxheSBET00gbm9kZXMgaW4gYSB0cmVlLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZXh0ZW5kcyBBYnN0cmFjdEFkYXB0ZXJGYWN0b3J5IGltcGxlbWVudHMgSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5IHsKLQlwdWJsaWMgY2xhc3MgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIHsKLQkJcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ERUxBWSA9IDIwMDsKLQotCQlwdWJsaWMgdm9pZCBjYWNoZUNsZWFyZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlKSB7Ci0JCQkvLyBub3RoaW5nIHRvIGRvCi0JCX0KLQotCQlwdWJsaWMgdm9pZCBjYWNoZVVwZGF0ZWQoQ01Eb2N1bWVudENhY2hlIGNhY2hlLCBmaW5hbCBTdHJpbmcgdXJpLCBpbnQgb2xkU3RhdHVzLCBpbnQgbmV3U3RhdHVzLCBDTURvY3VtZW50IGNtRG9jdW1lbnQpIHsKLQkJCWlmIChuZXdTdGF0dXMgPT0gQ01Eb2N1bWVudENhY2hlLlNUQVRVU19MT0FERUQgfHwgbmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfRVJST1IpIHsKLQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJfQotCQl9Ci0KLQkJcHVibGljIHZvaWQgcHJvcGVydHlDaGFuZ2VkKENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyLCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7Ci0JCQlpZiAoY21Eb2N1bWVudE1hbmFnZXIuZ2V0UHJvcGVydHlFbmFibGVkKENNRG9jdW1lbnRNYW5hZ2VyLlBST1BFUlRZX0FVVE9fTE9BRCkpIHsKLQkJCQlyZWZyZXNoVmlld2VycygpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlZnJlc2hWaWV3ZXJzKCkgewotCQkJT2JqZWN0W10gbGlzdGVuZXJzID0gZ2V0TGlzdGVuZXJzKCkudG9BcnJheSgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0ZW5lcnMubGVuZ3RoOyBpKyspIHsKLQkJCQlpZiAobGlzdGVuZXJzW2ldIGluc3RhbmNlb2YgU3RydWN0dXJlZFZpZXdlcikgewotCQkJCQlmaW5hbCBTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciA9IChTdHJ1Y3R1cmVkVmlld2VyKSBsaXN0ZW5lcnNbaV07Ci0JCQkJCUpvYiByZWZyZXNoID0gbmV3IFVJSm9iKFhNTFVJTWVzc2FnZXMucmVmcmVzaG91dGxpbmVfMCkgewotCQkJCQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCQkJCQlDb250cm9sIHJlZnJlc2hDb250cm9sID0gdmlld2VyLmdldENvbnRyb2woKTsKLQkJCQkJCQlpZiAocmVmcmVzaENvbnRyb2wgIT0gbnVsbCAmJiAhcmVmcmVzaENvbnRyb2wuaXNEaXNwb3NlZCgpKSB7Ci0JCQkJCQkJCXZpZXdlci5yZWZyZXNoKHRydWUpOwotCQkJCQkJCX0KLQkJCQkJCQlyZXR1cm4gU3RhdHVzLk9LX1NUQVRVUzsKLQkJCQkJCX0KLQkJCQkJfTsKLQkJCQkJcmVmcmVzaC5zZXRTeXN0ZW0odHJ1ZSk7Ci0JCQkJCXJlZnJlc2guc2V0UHJpb3JpdHkoSm9iLlNIT1JUKTsKLQkJCQkJcmVmcmVzaC5zY2hlZHVsZShVUERBVEVfREVMQVkpOwotCQkJCX0KLQkJCQllbHNlIGlmIChsaXN0ZW5lcnNbaV0gaW5zdGFuY2VvZiBWaWV3ZXIpIHsKLQkJCQkJZmluYWwgVmlld2VyIHZpZXdlciA9IChWaWV3ZXIpIGxpc3RlbmVyc1tpXTsKLQkJCQkJSm9iIHJlZnJlc2ggPSBuZXcgVUlKb2IoWE1MVUlNZXNzYWdlcy5yZWZyZXNob3V0bGluZV8wKSB7Ci0JCQkJCQlwdWJsaWMgSVN0YXR1cyBydW5JblVJVGhyZWFkKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQkJCQkJCUNvbnRyb2wgcmVmcmVzaENvbnRyb2wgPSB2aWV3ZXIuZ2V0Q29udHJvbCgpOwotCQkJCQkJCWlmIChyZWZyZXNoQ29udHJvbCAhPSBudWxsICYmICFyZWZyZXNoQ29udHJvbC5pc0Rpc3Bvc2VkKCkpIHsKLQkJCQkJCQkJdmlld2VyLnJlZnJlc2goKTsKLQkJCQkJCQl9Ci0JCQkJCQkJcmV0dXJuIFN0YXR1cy5PS19TVEFUVVM7Ci0JCQkJCQl9Ci0JCQkJCX07Ci0JCQkJCXJlZnJlc2guc2V0U3lzdGVtKHRydWUpOwotCQkJCQlyZWZyZXNoLnNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQkJCXJlZnJlc2guc2NoZWR1bGUoVVBEQVRFX0RFTEFZKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcml2YXRlIENNRG9jdW1lbnRNYW5hZ2VyIGNtRG9jdW1lbnRNYW5hZ2VyOwotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBudWxsOwotCS8qKgotCSAqIFRoaXMga2VlcHMgdHJhY2sgb2YgYWxsIHRoZSBsaXN0ZW5lcnMuCi0JICovCi0JcHJpdmF0ZSBTZXQgZkxpc3RlbmVycyA9IG5ldyBIYXNoU2V0KCk7Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIHNpbmdsZXRvbkFkYXB0ZXI7Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoKSB7Ci0JCXRoaXMoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MsIHRydWUpOwotCX0KLQotCXB1YmxpYyBKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeShPYmplY3QgYWRhcHRlcktleSwgYm9vbGVhbiByZWdpc3RlckFkYXB0ZXJzKSB7Ci0JCXN1cGVyKGFkYXB0ZXJLZXksIHJlZ2lzdGVyQWRhcHRlcnMpOwotCX0KLQotCXB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBhZGRMaXN0ZW5lcihPYmplY3QgbGlzdGVuZXIpIHsKLQkJZkxpc3RlbmVycy5hZGQobGlzdGVuZXIpOwotCX0KLQotCXB1YmxpYyBJTm9kZUFkYXB0ZXJGYWN0b3J5IGNvcHkoKSB7Ci0JCXJldHVybiBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoZ2V0QWRhcHRlcktleSgpLCBpc1Nob3VsZFJlZ2lzdGVyQWRhcHRlcigpKTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBuZXcgSkZhY2UgYWRhcHRlciBmb3IgdGhlIERPTSBub2RlIHBhc3NlZCBpbgotCSAqLwotCXByb3RlY3RlZCBJTm9kZUFkYXB0ZXIgY3JlYXRlQWRhcHRlcihJTm9kZU5vdGlmaWVyIG5vZGUpIHsKLQkJaWYgKHNpbmdsZXRvbkFkYXB0ZXIgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIHRoZSBKRmFjZU5vZGVBZGFwdGVyCi0JCQlzaW5nbGV0b25BZGFwdGVyID0gbmV3IEpGYWNlTm9kZUFkYXB0ZXIodGhpcyk7Ci0JCQlpbml0QWRhcHRlcihzaW5nbGV0b25BZGFwdGVyLCBub2RlKTsKLQkJfQotCQlyZXR1cm4gc2luZ2xldG9uQWRhcHRlcjsKLQl9Ci0KLQotCS8qKgotCSAqIHJldHVybnMgImNvcHkiIHNvIG5vIG9uZSBjYW4gbW9kaWZ5IG91ciBsaXN0LiBJdCBpcyBhIHNoYWxsb3cgY29weS4KLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIENvbGxlY3Rpb24gZ2V0TGlzdGVuZXJzKCkgewotCQlyZXR1cm4gbmV3IEFycmF5TGlzdChmTGlzdGVuZXJzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0QWRhcHRlcihJTm9kZUFkYXB0ZXIgYWRhcHRlciwgSU5vZGVOb3RpZmllciBub2RlKSB7Ci0JCS8vIHJlZ2lzdGVyIGZvciBDTURvY3VtZW50TWFuYWdlciBldmVudHMKLQkJTW9kZWxRdWVyeUFkYXB0ZXIgbXFhZGFwdGVyID0gKE1vZGVsUXVlcnlBZGFwdGVyKSBub2RlLmdldEFkYXB0ZXJGb3IoTW9kZWxRdWVyeUFkYXB0ZXIuY2xhc3MpOwotCQlpZiAobXFhZGFwdGVyICE9IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgbXF1ZXJ5ID0gbXFhZGFwdGVyLmdldE1vZGVsUXVlcnkoKTsKLQkJCWlmIChtcXVlcnkgIT0gbnVsbCAmJiBtcXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKSAhPSBudWxsKSB7Ci0JCQkJY21Eb2N1bWVudE1hbmFnZXIgPSBtcXVlcnkuZ2V0Q01Eb2N1bWVudE1hbmFnZXIoKTsKLQkJCQlmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lciA9IG5ldyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVySW1wbCgpOwotCQkJCWNtRG9jdW1lbnRNYW5hZ2VyLmFkZExpc3RlbmVyKGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCS8vIGRlcmVnaXN0ZXIgZnJvbSBDTURvY3VtZW50TWFuYWdlciBldmVudHMKLQkJaWYgKGNtRG9jdW1lbnRNYW5hZ2VyICE9IG51bGwgJiYgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgIT0gbnVsbCkgewotCQkJY21Eb2N1bWVudE1hbmFnZXIucmVtb3ZlTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0JCWZMaXN0ZW5lcnMuY2xlYXIoKTsKLQl9Ci0KLQlwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVtb3ZlTGlzdGVuZXIoT2JqZWN0IGxpc3RlbmVyKSB7Ci0JCWZMaXN0ZW5lcnMucmVtb3ZlKGxpc3RlbmVyKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29udGVudG91dGxpbmUvSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMjdiMTUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUNvbnRlbnRQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVRyZWVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuSUpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci0KLQotLyoqCi0gKiBBbiBJVHJlZUNvbnRlbnRQcm92aWRlciBmb3IgYSBUcmVlVmlld2VycyB1c2VkIHRvIGRpc3BsYXkgRE9NIG5vZGVzLiBUaGlzCi0gKiBjb250ZW50IHByb3ZpZGVyIHRha2VzIGFuIGFkYXB0ZXIgZmFjdG9yeSB0byBjcmVhdGUgSkZhY2UgYWRhcHRlcnMgZm9yIHRoZQotICogbm9kZXMgaW4gdGhlIHRyZWUuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRmFjZU5vZGVDb250ZW50UHJvdmlkZXIgaW1wbGVtZW50cyBJVHJlZUNvbnRlbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCS8qKgotCSAqIFRoZSB2aXN1YWwgcGFydCB0aGF0IGlzIHVzaW5nIHRoaXMgY29udGVudCBwcm92aWRlciBpcyBhYm91dCB0byBiZQotCSAqIGRpc3Bvc2VkLiBEZWFsbG9jYXRlIGFsbCBhbGxvY2F0ZWQgU1dUIHJlc291cmNlcy4KLQkgKi8KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIEpGYWNlIGFkYXB0ZXIgZm9yIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgotCSAqIAotCSAqIEBwYXJhbSBhZGFwdGFibGUKLQkgKiAgICAgICAgICAgIGphdmEubGFuZy5PYmplY3QgVGhlIG9iamVjdCB0byBnZXQgdGhlIGFkYXB0ZXIgZm9yCi0JICovCi0JcHJvdGVjdGVkIElKRmFjZU5vZGVBZGFwdGVyIGdldEFkYXB0ZXIoT2JqZWN0IGFkYXB0YWJsZSkgewotCQlpZiAoYWRhcHRhYmxlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllcikgewotCQkJSU5vZGVBZGFwdGVyIGFkYXB0ZXIgPSAoKElOb2RlTm90aWZpZXIpIGFkYXB0YWJsZSkuZ2V0QWRhcHRlckZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoYWRhcHRlciBpbnN0YW5jZW9mIElKRmFjZU5vZGVBZGFwdGVyKQotCQkJCXJldHVybiAoSUpGYWNlTm9kZUFkYXB0ZXIpIGFkYXB0ZXI7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0Q2hpbGRyZW4ob2JqZWN0KTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFswXTsKLQl9Ci0KLQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IG9iamVjdCkgewotCQkvLyBUaGUgcm9vdCBpcyB1c3VhbGx5IGFuIGluc3RhbmNlIG9mIGFuIFhNTFN0cnVjdHVyZWRNb2RlbCBpbgotCQkvLyB3aGljaCBjYXNlIHdlIHdhbnQgdG8gZXh0cmFjdCB0aGUgZG9jdW1lbnQuCi0JCU9iamVjdCB0b3BOb2RlID0gb2JqZWN0OwotCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSURPTU1vZGVsKQotCQkJdG9wTm9kZSA9ICgoSURPTU1vZGVsKSBvYmplY3QpLmdldERvY3VtZW50KCk7Ci0KLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIodG9wTm9kZSk7Ci0KLQkJaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLQkJCXJldHVybiBhZGFwdGVyLmdldEVsZW1lbnRzKHRvcE5vZGUpOwotCi0JCXJldHVybiBuZXcgT2JqZWN0WzBdOwotCX0KLQotCXB1YmxpYyBPYmplY3QgZ2V0UGFyZW50KE9iamVjdCBvYmplY3QpIHsKLQkJSUpGYWNlTm9kZUFkYXB0ZXIgYWRhcHRlciA9IGdldEFkYXB0ZXIob2JqZWN0KTsKLQotCQlpZiAoYWRhcHRlciAhPSBudWxsKQotCQkJcmV0dXJuIGFkYXB0ZXIuZ2V0UGFyZW50KG9iamVjdCk7Ci0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gaGFzQ2hpbGRyZW4oT2JqZWN0IG9iamVjdCkgewotCQlJSkZhY2VOb2RlQWRhcHRlciBhZGFwdGVyID0gZ2V0QWRhcHRlcihvYmplY3QpOwotCi0JCWlmIChhZGFwdGVyICE9IG51bGwpCi0JCQlyZXR1cm4gYWRhcHRlci5oYXNDaGlsZHJlbihvYmplY3QpOwotCi0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJaWYgKG9sZElucHV0ICE9IG51bGwgJiYgb2xkSW5wdXQgaW5zdGFuY2VvZiBJU3RydWN0dXJlZE1vZGVsKSB7Ci0JCQlJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkgZmFjdG9yeSA9IChJSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkpICgoSVN0cnVjdHVyZWRNb2RlbCkgb2xkSW5wdXQpLmdldEZhY3RvcnlSZWdpc3RyeSgpLmdldEZhY3RvcnlGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGZhY3RvcnkgIT0gbnVsbCkgewotCQkJCWZhY3RvcnkucmVtb3ZlTGlzdGVuZXIodmlld2VyKTsKLQkJCX0KLQkJfQotCQlpZiAobmV3SW5wdXQgIT0gbnVsbCAmJiBuZXdJbnB1dCBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJCUlKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSBmYWN0b3J5ID0gKElKRmFjZU5vZGVBZGFwdGVyRmFjdG9yeSkgKChJU3RydWN0dXJlZE1vZGVsKSBuZXdJbnB1dCkuZ2V0RmFjdG9yeVJlZ2lzdHJ5KCkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQkJZmFjdG9yeS5hZGRMaXN0ZW5lcih2aWV3ZXIpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUxhYmVsUHJvdmlkZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9KRmFjZU5vZGVMYWJlbFByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NzJkZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL0pGYWNlTm9kZUxhYmVsUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuTGFiZWxQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLklKRmFjZU5vZGVBZGFwdGVyOwotCi0vKioKLSAqIEEgbGFiZWwgcHJvdmlkZXIgYmFja2VkIGJ5IEpGYWNlTm9kZUFkYXB0ZXJzLgotICovCi1wdWJsaWMgY2xhc3MgSkZhY2VOb2RlTGFiZWxQcm92aWRlciBleHRlbmRzIExhYmVsUHJvdmlkZXIgewotCS8qKgotCSAqIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwdWJsaWMgSkZhY2VOb2RlTGFiZWxQcm92aWRlcigpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBKRmFjZSBhZGFwdGVyIGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdC4KLQkgKiAKLQkgKiBAcGFyYW0gYWRhcHRhYmxlCi0JICogICAgICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IFRoZSBvYmplY3QgdG8gZ2V0IHRoZSBhZGFwdGVyIGZvcgotCSAqLwotCXByb3RlY3RlZCBJSkZhY2VOb2RlQWRhcHRlciBnZXRBZGFwdGVyKE9iamVjdCBhZGFwdGFibGUpIHsKLQkJaWYgKGFkYXB0YWJsZSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gKChJTm9kZU5vdGlmaWVyKSBhZGFwdGFibGUpLmdldEFkYXB0ZXJGb3IoSUpGYWNlTm9kZUFkYXB0ZXIuY2xhc3MpOwotCQkJaWYgKGFkYXB0ZXIgaW5zdGFuY2VvZiBJSkZhY2VOb2RlQWRhcHRlcikKLQkJCQlyZXR1cm4gKElKRmFjZU5vZGVBZGFwdGVyKSBhZGFwdGVyOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRJbWFnZShqYXZhLmxhbmcuT2JqZWN0KQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZShPYmplY3QgZWxlbWVudCkgewotCQlyZXR1cm4gZ2V0QWRhcHRlcihlbGVtZW50KS5nZXRMYWJlbEltYWdlKGVsZW1lbnQpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JTGFiZWxQcm92aWRlciNnZXRUZXh0KGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBlbGVtZW50KSB7Ci0JCXJldHVybiBnZXRBZGFwdGVyKGVsZW1lbnQpLmdldExhYmVsVGV4dChlbGVtZW50KTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUJhc2VMYWJlbFByb3ZpZGVyI2lzTGFiZWxQcm9wZXJ0eShqYXZhLmxhbmcuT2JqZWN0LAotCSAqICAgICAgamF2YS5sYW5nLlN0cmluZykKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0xhYmVsUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgewotCQlyZXR1cm4gZmFsc2U7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9SZWZyZXNoU3RydWN0dXJlSm9iLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmNjMwOWUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1JlZnJlc2hTdHJ1Y3R1cmVKb2IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLk9wZXJhdGlvbkNhbmNlbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QbGF0Zm9ybTsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuU3RhdHVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5qb2JzLkpvYjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuRGlzcGxheTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIFRoaXMgam9iIGhvbGRzIGEgcXVldWUgb2YgdXBkYXRlcyAoYWZmZWN0ZWQgbm9kZXMpIGZvciBtdWx0aXBsZSBzdHJ1Y3R1cmVkCi0gKiB2aWV3ZXJzLiBXaGVuIGEgbmV3IHJlcXVlc3QgY29tZXMgaW4sIHRoZSBjdXJyZW50IHJ1biBpcyBjYW5jZWxsZWQsIHRoZSBuZXcKLSAqIHJlcXVlc3QgaXMgYWRkZWQgdG8gdGhlIHF1ZXVlLCB0aGVuIHRoZSBqb2IgaXMgcmUtc2NoZWR1bGVkLiBTdXBwb3J0IGZvcgotICogbXVsdGlwbGUgc3RydWN0dXJlZCB2aWV3ZXJzIGlzIHJlcXVpcmVkIGJlY2F1c2UgcmVmcmVzaCB1cGRhdGVzIGFyZSB1c3VhbGx5Ci0gKiB0cmlnZ2VyZWQgYnkgbW9kZWwgY2hhbmdlcywgYW5kIHRoZSBtb2RlbCBtYXkgYmUgdmlzaWJsZSBpbiBtb3JlIHRoYW4gb25lCi0gKiB2aWV3ZXIuCi0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLWNsYXNzIFJlZnJlc2hTdHJ1Y3R1cmVKb2IgZXh0ZW5kcyBKb2IgewotCi0JLyoqIGRlYnVnIGZsYWcgKi8KLQlzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRzsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ERUxBWSA9IDI1MDsKLQlzdGF0aWMgewotCQlTdHJpbmcgdmFsdWUgPSBQbGF0Zm9ybS5nZXREZWJ1Z09wdGlvbigib3JnLmVjbGlwc2Uud3N0LnNzZS51aS9kZWJ1Zy9yZWZyZXNoU3RydWN0dXJlIik7IC8vJE5PTi1OTFMtMSQKLQkJREVCVUcgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFsc0lnbm9yZUNhc2UoInRydWUiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQkvKiogTGlzdCBvZiByZWZyZXNoIHJlcXVlc3RzIChOb2RlcykgKi8KLQlwcml2YXRlIGZpbmFsIExpc3QgZlJlcXVlc3RzOwotCS8qKiB0aGUgc3RydWN0dXJlZCB2aWV3ZXJzICovCi0JTGlzdCBmVmlld2VycyA9IG5ldyBBcnJheUxpc3QoMyk7Ci0KLQlwdWJsaWMgUmVmcmVzaFN0cnVjdHVyZUpvYigpIHsKLQkJc3VwZXIoWE1MVUlNZXNzYWdlcy5yZWZyZXNob3V0bGluZV8wKTsgLy8kTk9OLU5MUy0xJAotCQlzZXRQcmlvcml0eShKb2IuTE9ORyk7Ci0JCXNldFN5c3RlbSh0cnVlKTsKLQkJZlJlcXVlc3RzID0gbmV3IEFycmF5TGlzdCgyKTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFJlcXVlc3QoTm9kZSBuZXdOb2RlUmVxdWVzdCkgewotCQkvKgotCQkgKiBub3RlOiB0aGUgY2FsbGVyIG11c3QgTk9UIHBhc3MgaW4gbnVsbCBub2RlIHJlcXVlc3QgKHdoaWNoLCBzaW5jZQotCQkgKiBwcml2YXRlIG1ldGhvZCwgd2UgZG8gbm90IG5lZWQgdG8gZ2F1cmQgYWdhaW5zdCBoZXJlLCBhcyBsb25nIAotCQkgKiBhcyB3ZSBnYXVyZCBhZ2FpbnN0IGl0IGluIGNhbGxpbmcgbWV0aG9kLgotCQkgKi8KLQkJaW50IHNpemUgPSBmUmVxdWVzdHMuc2l6ZSgpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotCQkJTm9kZSBleGlzdGluZ05vZGVSZXF1ZXN0ID0gKE5vZGUpIGZSZXF1ZXN0cy5nZXQoaSk7Ci0JCQkvKgotCQkJICogaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTE1NzQyNyBJZiB3ZQotCQkJICogYWxyZWFkeSBoYXZlIGEgcmVxdWVzdCB3aGljaCBlcXVhbHMgdGhlIG5ldyByZXF1ZXN0LCBkaXNjYXJkCi0JCQkgKiB0aGUgbmV3IHJlcXVlc3QKLQkJCSAqLwotCQkJaWYgKGV4aXN0aW5nTm9kZVJlcXVlc3QuZXF1YWxzKG5ld05vZGVSZXF1ZXN0KSkKLQkJCQlyZXR1cm47Ci0JCQkvKgotCQkJICogSWYgd2UgYWxyZWFkeSBoYXZlIGEgcmVxdWVzdCB3aGljaCBjb250YWlucyB0aGUgbmV3IHJlcXVlc3QsCi0JCQkgKiBkaXNjYXJkIHRoZSBuZXcgcmVxdWVzdAotCQkJICovCi0JCQlpZiAoY29udGFpbnMoZXhpc3RpbmdOb2RlUmVxdWVzdCwgbmV3Tm9kZVJlcXVlc3QpKQotCQkJCXJldHVybjsKLQkJCS8qCi0JCQkgKiBJZiBuZXcgcmVxdWVzdCBjb250YWlucyBhbnkgZXhpc3RpbmcgcmVxdWVzdHMsIHJlcGxhY2UgaXQgd2l0aAotCQkJICogbmV3IHJlcXVlc3QuIElTU1VFOiB0ZWNobmljYWxseSwgd2Ugc2hvdWxkIHJlcGxhY2UgQUxMCi0JCQkgKiBjb250YWluZWQsIGV4aXN0aW5nIHJlcXVlc3RzIChzdWNoIGFzIGlmIG1hbnkgc2libGluZ3MgYWxyZWFkeQotCQkJICogcXVlJ2QgdXAgd2hlbiB0aGVpciBjb21tb24gcGFyZW50IGlzIHRoZW4gcmVxdWVzdGVkLCBidXQsIEknbQotCQkJICogbm90IHN1cmUgaWYgdGhhdCBvY2N1cnMgbXVjaCwgaW4gcHJhY3RpY2UsIG9yIGlmIHRoZXJlJ3MgYW4KLQkJCSAqIGFsZ29yaXRobSB0byBxdWlja2x5IGZpbmQgdGhlbSBhbGwuIEFjdHVhbGx5LCBJIGd1ZXNzIHdlIGNvdWxkCi0JCQkgKiBqdXN0IGdvIHRocm91Z2ggdGhlIF9yZXN0XyBvZiB0aGUgbGlzdCAoaSsxIHRvIHNpemUpIGFuZCByZW1vdmUKLQkJCSAqIGFueSB0aGF0IGFyZSBjb250YWluZWQgYnkgbmV3IHJlcXVlc3QgLi4uIGluIGZ1dHVyZSA6KSAuCi0JCQkgKi8KLQkJCWlmIChjb250YWlucyhuZXdOb2RlUmVxdWVzdCwgZXhpc3RpbmdOb2RlUmVxdWVzdCkpIHsKLQkJCQlmUmVxdWVzdHMuc2V0KGksIG5ld05vZGVSZXF1ZXN0KTsKLQkJCQlyZXR1cm47Ci0JCQl9Ci0JCX0KLQkJLyoKLQkJICogSWYgd2UgZ2V0IHRvIGhlcmUsIGVpdGhlciBmcm9tIGV4aXN0aW5nIHJlcXVlc3QgbGlzdCBiZWluZyB6ZXJvCi0JCSAqIGxlbmd0aCwgb3Igbm8gZXhpc2l0bmcgcmVxdWVzdHMgIm1hdGNoZWQiIG5ldyByZXF1ZXN0LCB0aGVuIGFkZCB0aGUKLQkJICogbmV3IHJlcXVlc3QuCi0JCSAqLwotCQlmUmVxdWVzdHMuYWRkKG5ld05vZGVSZXF1ZXN0KTsKLQl9Ci0KLQlwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGFkZFZpZXdlcihTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlcikgewotCQlpZiAoIWZWaWV3ZXJzLmNvbnRhaW5zKHZpZXdlcikpIHsKLQkJCWZWaWV3ZXJzLmFkZCh2aWV3ZXIpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogU2ltcGxlIGhpZXJhcmNoaWNhbCBjb250YWlubWVudCByZWxhdGlvbnNoaXAuIE5vdGUsIHRoaXMgbWV0aG9kIHJldHVybnMKLQkgKiAiZmFsc2UiIGlmIHRoZSB0d28gbm9kZXMgYXJlIGVxdWFsIQotCSAqIAotCSAqIEBwYXJhbSByb290Ci0JICogQHBhcmFtIHBvc3NpYmxlCi0JICogQHJldHVybiBpZiB0aGUgcm9vdCBpcyBwYXJlbnQgb2YgcG9zc2libGUsIHJldHVybiB0cnVlLCBvdGhlcndpc2UKLQkgKiAgICAgICAgIHJldHVybiBmYWxzZQotCSAqLwotCXByaXZhdGUgYm9vbGVhbiBjb250YWlucyhOb2RlIHJvb3QsIE5vZGUgcG9zc2libGUpIHsKLQkJaWYgKERFQlVHKSB7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Iik7IC8vJE5PTi1OTFMtMSQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVjdXJzaXZlIGNhbGwgdy8gcm9vdDogIiArIHJvb3QuZ2V0Tm9kZU5hbWUoKSArICIgYW5kIHBvc3NpYmxlOiAiICsgcG9zc2libGUpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0KLQkJLy8gdGhlIGZvbGxvd2luZyBjaGVja3MgYXJlIGltcG9ydGFudAotCQkvLyAjZG9jdW1lbnQgbm9kZSB3aWxsIGJyZWFrIHRoZSBhbGdvcml0aG0gb3RoZXJ3aXNlCi0KLQkJLy8gY2FuJ3QgY29udGFpbiB0aGUgY2hpbGQgaWYgaXQncyBudWxsCi0JCWlmIChyb290ID09IG51bGwpIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyBmYWxzZTogcm9vdCBpcyBudWxsIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBub3RoaW5nIGNhbiBiZSBwYXJlbnQgb2YgRG9jdW1lbnQgbm9kZQotCQlpZiAocG9zc2libGUgaW5zdGFuY2VvZiBEb2N1bWVudCkgewotCQkJaWYgKERFQlVHKQotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmV0dXJuaW5nIGZhbHNlOiBwb3NzaWJsZSBpcyBEb2N1bWVudCBub2RlIik7IC8vJE5PTi1OTFMtMSQKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCQkvLyBkb2N1bWVudCBjb250YWlucyBldmVyeXRoaW5nCi0JCWlmIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnQpIHsKLQkJCWlmIChERUJVRykKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJldHVybmluZyB0cnVlOiByb290IGlzIERvY3VtZW50IG5vZGUiKTsgLy8kTk9OLU5MUy0xJAotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQotCQkvLyBjaGVjayBwYXJlbnRhZ2UKLQkJTm9kZSBjdXJyZW50ID0gcG9zc2libGU7Ci0JCS8vIGxvb3AgcGFyZW50cwotCQl3aGlsZSAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCS8vIGZvdW5kIGl0Ci0JCQlpZiAocm9vdC5lcXVhbHMoY3VycmVudCkpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiICAgISEhIGZvdW5kOiAiICsgcG9zc2libGUuZ2V0Tm9kZU5hbWUoKSArICIgaW4gc3ViZWxlbWVudCBvZjogIiArIHJvb3QuZ2V0Tm9kZU5hbWUoKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJCXJldHVybiB0cnVlOwotCQkJfQotCQkJY3VycmVudCA9IGN1cnJlbnQuZ2V0UGFyZW50Tm9kZSgpOwotCQl9Ci0JCS8vIG5ldmVyIGZvdW5kIGl0Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZWZyZXNoIG11c3QgYmUgb24gVUkgdGhyZWFkIGJlY2F1c2UgaXQncyBvbiBhIFNXVCB3aWRnZXQuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKi8KLQlwcml2YXRlIHZvaWQgZG9SZWZyZXNoKGZpbmFsIE5vZGUgbm9kZSwgZmluYWwgU3RydWN0dXJlZFZpZXdlcltdIHZpZXdlcnMpIHsKLQkJZmluYWwgRGlzcGxheSBkaXNwbGF5ID0gUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXREaXNwbGF5KCk7Ci0JCWRpc3BsYXkuYXN5bmNFeGVjKG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlpZiAoREVCVUcpCi0JCQkJCVN5c3RlbS5vdXQucHJpbnRsbigicmVmcmVzaCBvbjogWyIgKyBub2RlLmdldE5vZGVOYW1lKCkgKyAiXSIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgdmlld2Vycy5sZW5ndGg7IGkrKykgewotCQkJCQlpZiAoIXZpZXdlcnNbaV0uZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkRPQ1VNRU5UX05PREUpIHsKLQkJCQkJCQl2aWV3ZXJzW2ldLnJlZnJlc2godHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCQllbHNlIHsKLQkJCQkJCQl2aWV3ZXJzW2ldLnJlZnJlc2gobm9kZSwgdHJ1ZSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJZWxzZSB7Ci0JCQkJCQlpZiAoREVCVUcpCi0JCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCIgICAhISEgc2tpcHBlZCByZWZyZXNoaW5nIGRpc3Bvc2VkIHZpZXdlcjogIiArIHZpZXdlcnNbaV0pOyAvLyROT04tTkxTLTEkCi0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0pOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGFsc28gc3luY2hyb25pemVkIGJlY2F1c2UgaXQgYWNjZXNzZXMgdGhlIGZSZXF1ZXN0cyBxdWV1ZQotCSAqIGFuZCBmVmlld2VycyBsaXN0Ci0JICogCi0JICogQHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIGFuZCBhcnJheSBvZiB0aGUgY3VycmVudGx5IHJlcXVlc3RlZCBOb2RlcwotCSAqICAgICAgICAgdG8gcmVmcmVzaCBhbmQgdGhlIHZpZXdlcnMgaW4gd2hpY2ggdG8gcmVmcmVzaCB0aGVtCi0JICovCi0JcHJpdmF0ZSBzeW5jaHJvbml6ZWQgT2JqZWN0W10gZ2V0UmVxdWVzdHMoKSB7Ci0JCU5vZGVbXSB0b1JlZnJlc2ggPSAoTm9kZVtdKSBmUmVxdWVzdHMudG9BcnJheShuZXcgTm9kZVtmUmVxdWVzdHMuc2l6ZSgpXSk7Ci0JCWZSZXF1ZXN0cy5jbGVhcigpOwotCi0JCVN0cnVjdHVyZWRWaWV3ZXJbXSB2aWV3ZXJzID0gKFN0cnVjdHVyZWRWaWV3ZXJbXSkgZlZpZXdlcnMudG9BcnJheShuZXcgU3RydWN0dXJlZFZpZXdlcltmVmlld2Vycy5zaXplKCldKTsKLQkJZlZpZXdlcnMuY2xlYXIoKTsKLQotCQlyZXR1cm4gbmV3IE9iamVjdFtde3RvUmVmcmVzaCwgdmlld2Vyc307Ci0JfQotCi0JLyoqCi0JICogSW52b2tlIGEgcmVmcmVzaCBvbiB0aGUgdmlld2VyIG9uIHRoZSBnaXZlbiBub2RlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0JcHVibGljIHZvaWQgcmVmcmVzaChTdHJ1Y3R1cmVkVmlld2VyIHZpZXdlciwgTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwpCi0JCQlyZXR1cm47Ci0KLQkJYWRkVmlld2VyKHZpZXdlcik7Ci0JCWFkZFJlcXVlc3Qobm9kZSk7Ci0JCXNjaGVkdWxlKFVQREFURV9ERUxBWSk7Ci0JfQotCi0JcHJvdGVjdGVkIElTdGF0dXMgcnVuKElQcm9ncmVzc01vbml0b3IgbW9uaXRvcikgewotCQlJU3RhdHVzIHN0YXR1cyA9IFN0YXR1cy5PS19TVEFUVVM7Ci0JCXRyeSB7Ci0JCQkvLyBSZXRyaWV2ZSBCT1RIIHZpZXdlcnMgYW5kIE5vZGVzIG9uIG9uZSBibG9jawotCQkJT2JqZWN0W10gcmVxdWVzdHMgPSBnZXRSZXF1ZXN0cygpOwotCQkJTm9kZVtdIG5vZGVzID0gKE5vZGVbXSkgcmVxdWVzdHNbMF07Ci0JCQlTdHJ1Y3R1cmVkVmlld2VyW10gdmlld2VycyA9IChTdHJ1Y3R1cmVkVmlld2VyW10pIHJlcXVlc3RzWzFdOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG1vbml0b3IuaXNDYW5jZWxlZCgpKQotCQkJCQl0aHJvdyBuZXcgT3BlcmF0aW9uQ2FuY2VsZWRFeGNlcHRpb24oKTsKLQkJCQlkb1JlZnJlc2gobm9kZXNbaV0sIHZpZXdlcnMpOwotCQkJfQotCQl9Ci0JCWZpbmFsbHkgewotCQkJbW9uaXRvci5kb25lKCk7Ci0JCX0KLQkJcmV0dXJuIHN0YXR1czsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb250ZW50b3V0bGluZS9YTUxOb2RlQWN0aW9uTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1hNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2IwMGYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvbnRlbnRvdXRsaW5lL1hNTE5vZGVBY3Rpb25NYW5hZ2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZm9ybWF0LklTdHJ1Y3R1cmVkRm9ybWF0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5mb3JtYXQuRm9ybWF0UHJvY2Vzc29yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuYWN0aW9ucy5BYnN0cmFjdE5vZGVBY3Rpb25NYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLQotcHVibGljIGNsYXNzIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3ROb2RlQWN0aW9uTWFuYWdlciB7Ci0JcHVibGljIFhNTE5vZGVBY3Rpb25NYW5hZ2VyKElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwsIFZpZXdlciB2aWV3ZXIpIHsKLQkJc3VwZXIobW9kZWwsIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobW9kZWwpLCB2aWV3ZXIpOwotCX0KLQotCXB1YmxpYyB2b2lkIHJlZm9ybWF0KE5vZGUgbmV3RWxlbWVudCwgYm9vbGVhbiBkZWVwKSB7Ci0JCXRyeSB7Ci0JCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBhYm91dCB0byBtYWtlIGEgYmlnIG1vZGVsIGNoYW5nZQotCQkJZk1vZGVsLmFib3V0VG9DaGFuZ2VNb2RlbCgpOwotCi0JCQkvLyBmb3JtYXQgc2VsZWN0ZWQgbm9kZQotCQkJSVN0cnVjdHVyZWRGb3JtYXRQcm9jZXNzb3IgZm9ybWF0UHJvY2Vzc29yID0gbmV3IEZvcm1hdFByb2Nlc3NvclhNTCgpOwotCQkJZm9ybWF0UHJvY2Vzc29yLmZvcm1hdE5vZGUobmV3RWxlbWVudCk7Ci0JCX0gZmluYWxseSB7Ci0JCQkvLyB0ZWxsIHRoZSBtb2RlbCB0aGF0IHdlIGFyZSBkb25lIHdpdGggdGhlIGJpZyBtb2RlbCBjaGFuZ2UKLQkJCWZNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldE1vZGVsKElTdHJ1Y3R1cmVkTW9kZWwgbmV3TW9kZWwpIHsKLQkJZk1vZGVsID0gbmV3TW9kZWw7Ci0JCXNldE1vZGVsUXVlcnkoTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeShuZXdNb2RlbCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHNldE1vZGVsUXVlcnkoTW9kZWxRdWVyeSBuZXdNb2RlbFF1ZXJ5KSB7Ci0JCW1vZGVsUXVlcnkgPSBuZXdNb2RlbFF1ZXJ5OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyODdhYWIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0YW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGVudEFzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRlbnRBc3Npc3RhbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uQ29ycmVjdGlvbkFzc2lzdGFudFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS50ZXh0LklYTUxQYXJ0aXRpb25zOwotCi0vKioKLSAqIENvcnJlY3Rpb24gYXNzaXN0YW50IGZvciBYTUwKLSAqLwotcHVibGljIGNsYXNzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlclhNTCBleHRlbmRzIENvcnJlY3Rpb25Bc3Npc3RhbnRQcm92aWRlciB7Ci0KLQlwdWJsaWMgSUNvbnRlbnRBc3Npc3RhbnQgZ2V0Q29ycmVjdGlvbkFzc2lzdGFudChJU291cmNlVmlld2VyIHNvdXJjZVZpZXdlcikgewotCQlJQ29udGVudEFzc2lzdGFudCBjYSA9IG51bGw7Ci0KLQkJaWYgKHNvdXJjZVZpZXdlciAhPSBudWxsKSB7Ci0JCQlDb250ZW50QXNzaXN0YW50IGFzc2lzdGFudCA9IG5ldyBDb250ZW50QXNzaXN0YW50KCk7Ci0KLQkJCWlmIChzb3VyY2VWaWV3ZXIgIT0gbnVsbCkgewotCQkJCUlDb250ZW50QXNzaXN0UHJvY2Vzc29yIGNvcnJlY3Rpb25Qcm9jZXNzb3IgPSBuZXcgQ29ycmVjdGlvblByb2Nlc3NvclhNTChzb3VyY2VWaWV3ZXIpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9ERUZBVUxUKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfQ0RBVEEpOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9DT01NRU5UKTsKLQkJCQlhc3Npc3RhbnQuc2V0Q29udGVudEFzc2lzdFByb2Nlc3Nvcihjb3JyZWN0aW9uUHJvY2Vzc29yLCBJWE1MUGFydGl0aW9ucy5YTUxfREVDTEFSQVRJT04pOwotCQkJCWFzc2lzdGFudC5zZXRDb250ZW50QXNzaXN0UHJvY2Vzc29yKGNvcnJlY3Rpb25Qcm9jZXNzb3IsIElYTUxQYXJ0aXRpb25zLlhNTF9QSSk7Ci0JCQkJYXNzaXN0YW50LnNldENvbnRlbnRBc3Npc3RQcm9jZXNzb3IoY29ycmVjdGlvblByb2Nlc3NvciwgSVhNTFBhcnRpdGlvbnMuRFREX1NVQlNFVCk7Ci0JCQl9Ci0JCQljYSA9IGFzc2lzdGFudDsKLQkJfQotCi0JCXJldHVybiBjYTsKLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Qcm9jZXNzb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0NvcnJlY3Rpb25Qcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzNDgyNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Db3JyZWN0aW9uUHJvY2Vzc29yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLklTb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uSVF1aWNrRml4UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29ycmVjdGlvbi5TdHJ1Y3R1cmVkQ29ycmVjdGlvblByb2Nlc3NvcjsKLQotCi1wdWJsaWMgY2xhc3MgQ29ycmVjdGlvblByb2Nlc3NvclhNTCBleHRlbmRzIFN0cnVjdHVyZWRDb3JyZWN0aW9uUHJvY2Vzc29yIHsKLQlwcm90ZWN0ZWQgSVF1aWNrQXNzaXN0UHJvY2Vzc29yIGZRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLQlwcm90ZWN0ZWQgSVF1aWNrRml4UHJvY2Vzc29yIGZRdWlja0ZpeFByb2Nlc3NvcjsKLQotCXB1YmxpYyBDb3JyZWN0aW9uUHJvY2Vzc29yWE1MKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCXN1cGVyKHNvdXJjZVZpZXdlcik7Ci0JfQotCi0JcHJvdGVjdGVkIElRdWlja0Fzc2lzdFByb2Nlc3NvciBnZXRRdWlja0Fzc2lzdFByb2Nlc3NvcigpIHsKLQkJaWYgKGZRdWlja0Fzc2lzdFByb2Nlc3NvciA9PSBudWxsKQotCQkJZlF1aWNrQXNzaXN0UHJvY2Vzc29yID0gbmV3IFF1aWNrQXNzaXN0UHJvY2Vzc29yWE1MKCk7Ci0KLQkJcmV0dXJuIGZRdWlja0Fzc2lzdFByb2Nlc3NvcjsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVF1aWNrRml4UHJvY2Vzc29yIGdldFF1aWNrRml4UHJvY2Vzc29yKCkgewotCQlpZiAoZlF1aWNrRml4UHJvY2Vzc29yID09IG51bGwpCi0JCQlmUXVpY2tGaXhQcm9jZXNzb3IgPSBuZXcgUXVpY2tGaXhQcm9jZXNzb3JYTUwoKTsKLQotCQlyZXR1cm4gZlF1aWNrRml4UHJvY2Vzc29yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0luc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9JbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjkwMzg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL0luc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTXVsdGlUZXh0RWRpdDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbCBpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWwsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yIHsKLQlwcml2YXRlIGZpbmFsIExpc3QgZlJlcXVpcmVkQXR0cnM7Ci0KLQkvKioKLQkgKiBAcGFyYW0gcmVxdWlyZWRBdHRycwotCSAqLwotCXB1YmxpYyBJbnNlcnRSZXF1aXJlZEF0dHJzUXVpY2tBc3Npc3RQcm9wb3NhbChMaXN0IHJlcXVpcmVkQXR0cnMpIHsKLQkJZlJlcXVpcmVkQXR0cnMgPSByZXF1aXJlZEF0dHJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIG5vdCBpbXBsZW1lbnRlZD8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCWludCBpbmRleCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCgpOwotCQlJVGV4dFJlZ2lvbiBsYXN0UmVnaW9uID0gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGFzdFJlZ2lvbigpOwotCQlpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQlpbmRleC0tOwotCQkJbGFzdFJlZ2lvbiA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGluZGV4IC0gMSk7Ci0JCX0KLQkJZWxzZSBpZiAobGFzdFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0JCQlpbmRleCA9IGluZGV4IC0gMjsKLQkJCWxhc3RSZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChpbmRleCAtIDEpOwotCQl9Ci0JCU11bHRpVGV4dEVkaXQgbXVsdGlUZXh0RWRpdCA9IG5ldyBNdWx0aVRleHRFZGl0KCk7Ci0JCXRyeSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZSZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBmUmVxdWlyZWRBdHRycy5nZXQoaSk7Ci0JCQkJU3RyaW5nIHJlcXVpcmVkQXR0cmlidXRlTmFtZSA9IGF0dHJEZWNsLmdldEF0dHJOYW1lKCk7Ci0JCQkJU3RyaW5nIGRlZmF1bHRWYWx1ZSA9IGF0dHJEZWNsLmdldERlZmF1bHRWYWx1ZSgpOwotCQkJCWlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkKLQkJCQkJZGVmYXVsdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbmFtZUFuZERlZmF1bHRWYWx1ZSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCQkJCWlmIChpID09IDAgJiYgbGFzdFJlZ2lvbi5nZXRMZW5ndGgoKSA+IGxhc3RSZWdpb24uZ2V0VGV4dExlbmd0aCgpKQotCQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJCQluYW1lQW5kRGVmYXVsdFZhbHVlICs9IHJlcXVpcmVkQXR0cmlidXRlTmFtZSArICI9XCIiICsgZGVmYXVsdFZhbHVlICsgIlwiIjsgLy8kTk9OLU5MUy0xJC8vJE5PTi1OTFMtMiQKLQkJCQltdWx0aVRleHRFZGl0LmFkZENoaWxkKG5ldyBJbnNlcnRFZGl0KGluZGV4LCBuYW1lQW5kRGVmYXVsdFZhbHVlKSk7Ci0JCQkJLy8gQlVHMzM4MTogTXVsdGlUZXh0RWRpdCBhcHBsaWVzIGFsbCBjaGlsZCBUZXh0RWRpdCdzIGJhc2luZwotCQkJCS8vIG9uIG9mZnNldHMKLQkJCQkvLyBpbiB0aGUgZG9jdW1lbnQgYmVmb3JlIHRoZSBmaXJzdCBUZXh0RWRpdCwgbm90IGFmdGVyIGVhY2gKLQkJCQkvLyBjaGlsZCBUZXh0RWRpdC4gVGhlcmVmb3JlLCBkbyBub3QgbmVlZCB0byBhZHZhbmNlIHRoZQotCQkJCS8vIGluZGV4LgotCQkJCS8vIGluZGV4ICs9IG5hbWVBbmREZWZhdWx0VmFsdWUubGVuZ3RoKCk7Ci0JCQl9Ci0JCQltdWx0aVRleHRFZGl0LmFwcGx5KHZpZXdlci5nZXREb2N1bWVudCgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nLCBmb3Igbm93LCB1bmxlc3Mgd2UgZmluZCB0aGVyZSdzIHJlYXNvbnMgd2h5IHdlIGdldCBzb21lCi0JCQkvLyBoZXJlLgotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLkluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsXzA7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldENvbnRleHRJbmZvcm1hdGlvbigpCi0JICovCi0JcHVibGljIElDb250ZXh0SW5mb3JtYXRpb24gZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldERpc3BsYXlTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuSW5zZXJ0UmVxdWlyZWRBdHRyc1F1aWNrQXNzaXN0UHJvcG9zYWxfMTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fTE9DQUwpOwotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfQ09SUkVDVElPTik7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdW5zZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1Byb2JsZW1JRHNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1Byb2JsZW1JRHNYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwMDA4Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9Qcm9ibGVtSURzWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotcHVibGljIGludGVyZmFjZSBQcm9ibGVtSURzWE1MIHsKLQlpbnQgQXR0cnNJbkVuZFRhZyA9IDM7Ci0JaW50IEF0dHJWYWx1ZU5vdFF1b3RlZCA9IDEzOwotCWludCBFbXB0eVRhZyA9IDE7Ci0JaW50IEludmFsaWRBdHRyVmFsdWUgPSAxMTsKLQlpbnQgTWlzc2luZ0F0dHJWYWx1ZSA9IDQ7Ci0JaW50IE1pc3NpbmdDbG9zaW5nQnJhY2tldCA9IDE0OwotCWludCBNaXNzaW5nRW5kVGFnID0gMjsKLQlpbnQgTWlzc2luZ1JlcXVpcmVkQXR0ciA9IDEyOwotCWludCBOYW1lc3BhY2VJblBJID0gODsKLQlpbnQgTm9BdHRyVmFsdWUgPSA1OwotCWludCBTcGFjZXNCZWZvcmVQSSA9IDc7Ci0JaW50IFNwYWNlc0JlZm9yZVRhZ05hbWUgPSA2OwotCWludCBVbmNsYXNzaWZpZWQgPSAwOwotCWludCBVbmtub3duQXR0ciA9IDEwOwotCWludCBVbmtub3duRWxlbWVudCA9IDk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0Fzc2lzdFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tBc3Npc3RQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFmZDk2MC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0Fzc2lzdFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvcnJlY3Rpb24uSVF1aWNrQXNzaXN0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgUXVpY2tBc3Npc3RQcm9jZXNzb3JYTUwgaW1wbGVtZW50cyBJUXVpY2tBc3Npc3RQcm9jZXNzb3IgewotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5jb3JyZWN0aW9uLklRdWlja0Fzc2lzdFByb2Nlc3NvciNjYW5Bc3Npc3Qob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudCwKLQkgKiAgICAgIGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5Bc3Npc3QoU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCS8qKgotCSAqIEBwYXJhbSBwcm9wb3NhbHMKLQkgKiBAcGFyYW0gdmlld2VyCi0JICogQHBhcmFtIG9mZnNldAotCSAqLwotCXByb3RlY3RlZCB2b2lkIGdldEluc2VydFJlcXVpcmVkQXR0cnMoQXJyYXlMaXN0IHByb3Bvc2FscywgU3RydWN0dXJlZFRleHRWaWV3ZXIgdmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQlpZiAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJCWlmIChzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsICYmIHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmNvbnRhaW5zT2Zmc2V0KG9mZnNldCkpIHsKLQkJCQlJRE9NTm9kZSBjdXJzb3JOb2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQlMaXN0IHJlcXVpcmVkQXR0cnMgPSBnZXRSZXF1aXJlZEF0dHJzKGN1cnNvck5vZGUpOwotCQkJCWlmIChyZXF1aXJlZEF0dHJzLnNpemUoKSA+IDApIHsKLQkJCQkJTmFtZWROb2RlTWFwIGN1cnJlbnRBdHRycyA9IG5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQkJCQlMaXN0IGluc2VydEF0dHJzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJCQlpZiAoY3VycmVudEF0dHJzLmdldExlbmd0aCgpID09IDApCi0JCQkJCQlpbnNlcnRBdHRycy5hZGRBbGwocmVxdWlyZWRBdHRycyk7Ci0JCQkJCWVsc2UgewotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEF0dHJzLnNpemUoKTsgaSsrKSB7Ci0JCQkJCQkJU3RyaW5nIHJlcXVpcmVkQXR0ck5hbWUgPSAoKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIHJlcXVpcmVkQXR0cnMuZ2V0KGkpKS5nZXRBdHRyTmFtZSgpOwotCQkJCQkJCWJvb2xlYW4gZm91bmQgPSBmYWxzZTsKLQkJCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGN1cnJlbnRBdHRycy5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJCVN0cmluZyBjdXJyZW50QXR0ck5hbWUgPSBjdXJyZW50QXR0cnMuaXRlbShqKS5nZXROb2RlTmFtZSgpOwotCQkJCQkJCQlpZiAocmVxdWlyZWRBdHRyTmFtZS5jb21wYXJlVG9JZ25vcmVDYXNlKGN1cnJlbnRBdHRyTmFtZSkgPT0gMCkgewotCQkJCQkJCQkJZm91bmQgPSB0cnVlOwotCQkJCQkJCQkJYnJlYWs7Ci0JCQkJCQkJCX0KLQkJCQkJCQl9Ci0JCQkJCQkJaWYgKCFmb3VuZCkKLQkJCQkJCQkJaW5zZXJ0QXR0cnMuYWRkKHJlcXVpcmVkQXR0cnMuZ2V0KGkpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCQlpZiAoaW5zZXJ0QXR0cnMuc2l6ZSgpID4gMCkKLQkJCQkJCXByb3Bvc2Fscy5hZGQobmV3IEluc2VydFJlcXVpcmVkQXR0cnNRdWlja0Fzc2lzdFByb3Bvc2FsKGluc2VydEF0dHJzKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHByb3Bvc2FscwotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICovCi0JcHJvdGVjdGVkIHZvaWQgZ2V0TG9jYWxSZW5hbWVRdWlja0Fzc2lzdFByb3Bvc2FsKEFycmF5TGlzdCBwcm9wb3NhbHMsIFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgewotCQlJRE9NTm9kZSBub2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG5vZGUgPT0gbnVsbCA/IG51bGwgOiBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gbm9kZSA9PSBudWxsID8gbnVsbCA6IG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0KLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQkJaW50IHJlZ2lvblRleHRFbmRPZmZzZXQgPSAwOwotCQlpZiAoc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5jb250YWluc09mZnNldChvZmZzZXQpKSB7Ci0JCQlyZWdpb24gPSBzdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJcmVnaW9uVGV4dEVuZE9mZnNldCA9IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfSBlbHNlIGlmIChlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCAmJiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uY29udGFpbnNPZmZzZXQob2Zmc2V0KSkgewotCQkJcmVnaW9uID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQlyZWdpb25UZXh0RW5kT2Zmc2V0ID0gZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQocmVnaW9uKTsKLQkJfQotCi0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiAocmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSB8fCByZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkgJiYgb2Zmc2V0IDw9IHJlZ2lvblRleHRFbmRPZmZzZXQpCi0JCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsKCkpOwotCX0KLQotCXByb3RlY3RlZCBNb2RlbFF1ZXJ5IGdldE1vZGVsUXVlcnkoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gTW9kZWxRdWVyeVV0aWwuZ2V0TW9kZWxRdWVyeSgoRG9jdW1lbnQpIG5vZGUpOwotCQl9IGVsc2UgewotCQkJcmV0dXJuIE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkobm9kZS5nZXRPd25lckRvY3VtZW50KCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvcnJlY3Rpb24uSVF1aWNrQXNzaXN0UHJvY2Vzc29yI2dldFByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudGV4dC5JU3RydWN0dXJlZERvY3VtZW50LAotCSAqICAgICAgaW50KQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKFN0cnVjdHVyZWRUZXh0Vmlld2VyIHZpZXdlciwgaW50IG9mZnNldCkgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWdldExvY2FsUmVuYW1lUXVpY2tBc3Npc3RQcm9wb3NhbChwcm9wb3NhbHMsIHZpZXdlciwgb2Zmc2V0KTsKLQkJZ2V0U3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwocHJvcG9zYWxzLCB2aWV3ZXIsIG9mZnNldCk7Ci0JCWdldEluc2VydFJlcXVpcmVkQXR0cnMocHJvcG9zYWxzLCB2aWV3ZXIsIG9mZnNldCk7Ci0KLQkJcmV0dXJuIChJQ29tcGxldGlvblByb3Bvc2FsW10pIHByb3Bvc2Fscy50b0FycmF5KG5ldyBJQ29tcGxldGlvblByb3Bvc2FsW3Byb3Bvc2Fscy5zaXplKCldKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgTGlzdCBnZXRSZXF1aXJlZEF0dHJzKE5vZGUgbm9kZSkgewotCQlMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBnZXRNb2RlbFF1ZXJ5KG5vZGUpOwotCQlpZiAobW9kZWxRdWVyeSAhPSBudWxsKSB7Ci0JCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCA9IG1vZGVsUXVlcnkuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZWxlbWVudERlY2wuZ2V0QXR0cmlidXRlcygpOwotCQkJCUl0ZXJhdG9yIGl0ID0gYXR0ck1hcC5pdGVyYXRvcigpOwotCQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IG51bGw7Ci0JCQkJd2hpbGUgKGl0Lmhhc05leHQoKSkgewotCQkJCQlhdHRyID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGl0Lm5leHQoKTsKLQkJCQkJaWYgKGF0dHIuZ2V0VXNhZ2UoKSA9PSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKGF0dHIpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gcHJvcG9zYWxzCi0JICogQHBhcmFtIHZpZXdlcgotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBnZXRTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbChBcnJheUxpc3QgcHJvcG9zYWxzLCBTdHJ1Y3R1cmVkVGV4dFZpZXdlciB2aWV3ZXIsIGludCBvZmZzZXQpIHsKLQkJSURPTU5vZGUgbm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIG9mZnNldCk7Ci0JCWlmIChub2RlICE9IG51bGwpCi0JCQlwcm9wb3NhbHMuYWRkKG5ldyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFByb2Nlc3NvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUXVpY2tGaXhQcm9jZXNzb3JYTUwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NWE5Ny4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9RdWlja0ZpeFByb2Nlc3NvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb3JyZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5Db21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb3JyZWN0aW9uLklRdWlja0ZpeFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5YTUxFZGl0b3JQbHVnaW5JbWFnZXM7Ci0KLXB1YmxpYyBjbGFzcyBRdWlja0ZpeFByb2Nlc3NvclhNTCBpbXBsZW1lbnRzIElRdWlja0ZpeFByb2Nlc3NvciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkuY29ycmVjdGlvbi5JUXVpY2tGaXhQcm9jZXNzb3IjY2FuRml4KGludCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBjYW5GaXgoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLQkJaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBUZW1wb3JhcnlBbm5vdGF0aW9uKSB7Ci0JCQlUZW1wb3JhcnlBbm5vdGF0aW9uIHRlbXBBbm5vdGF0aW9uID0gKFRlbXBvcmFyeUFubm90YXRpb24pIGFubm90YXRpb247Ci0JCQlpbnQgcHJvYmxlbUlEID0gdGVtcEFubm90YXRpb24uZ2V0UHJvYmxlbUlEKCk7Ci0JCQlzd2l0Y2ggKHByb2JsZW1JRCkgewotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5FbXB0eVRhZyA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyc0luRW5kVGFnIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlVGFnTmFtZSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlVua25vd25FbGVtZW50IDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkF0dHIgOgotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5JbnZhbGlkQXR0clZhbHVlIDoKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ1JlcXVpcmVkQXR0ciA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLkF0dHJWYWx1ZU5vdFF1b3RlZCA6Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdDbG9zaW5nQnJhY2tldCA6Ci0JCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQl9Ci0JCX0KLQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy9yZXR1cm4KLQkJLy8gSmF2YVBsdWdpbkltYWdlcy5nZXQoSmF2YVBsdWdpbkltYWdlcy5JTUdfQ09SUkVDVElPTl9DSEFOR0UpOwotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9DT1JSRUNUSU9OX0NIQU5HRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmNvcnJlY3Rpb24uSVF1aWNrRml4UHJvY2Vzc29yI2dldFByb3Bvc2FscyhvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uKQotCSAqLwotCXB1YmxpYyBJQ29tcGxldGlvblByb3Bvc2FsW10gZ2V0UHJvcG9zYWxzKEFubm90YXRpb24gYW5ub3RhdGlvbikgdGhyb3dzIENvcmVFeGNlcHRpb24gewotCQlBcnJheUxpc3QgcHJvcG9zYWxzID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCWlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgVGVtcG9yYXJ5QW5ub3RhdGlvbikgewotCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiB0ZW1wQW5ub3RhdGlvbiA9IChUZW1wb3JhcnlBbm5vdGF0aW9uKSBhbm5vdGF0aW9uOwotCQkJaW50IHByb2JsZW1JRCA9IHRlbXBBbm5vdGF0aW9uLmdldFByb2JsZW1JRCgpOwotCQkJc3dpdGNoIChwcm9ibGVtSUQpIHsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuRW1wdHlUYWcgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfMCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcgOgotCQkJCQlTdHJpbmcgdGFnTmFtZSA9IChTdHJpbmcpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzBdOwotCQkJCQlTdHJpbmcgdGFnQ2xvc2UgPSAoU3RyaW5nKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVsxXTsKLQkJCQkJaW50IHRhZ0Nsb3NlT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVsyXSkuaW50VmFsdWUoKTsKLQkJCQkJaW50IHN0YXJ0VGFnRW5kT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSB0ZW1wQW5ub3RhdGlvbi5nZXRBZGRpdGlvbmFsRml4SW5mbygpKVszXSkuaW50VmFsdWUoKTsKLQkJCQkJaW50IGZpcnN0Q2hpbGRTdGFydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbNF0pLmludFZhbHVlKCk7Ci0JCQkJCWludCBlbmRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzVdKS5pbnRWYWx1ZSgpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwodGFnQ2xvc2UsIHRhZ0Nsb3NlT2Zmc2V0LCAwLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgc3RhcnRUYWdFbmRPZmZzZXQgLSB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzIsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPC8iICsgdGFnTmFtZSArICI+IiwgZmlyc3RDaGlsZFN0YXJ0T2Zmc2V0LCAwLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzMsIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkIC8vJE5PTi1OTFMtNCQKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCI8LyIgKyB0YWdOYW1lICsgIj4iLCBlbmRPZmZzZXQsIDAsIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuQXR0cnNJbkVuZFRhZyA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF81LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuTWlzc2luZ0F0dHJWYWx1ZSA6Ci0JCQkJCVN0cmluZyBkZWZhdWx0QXR0clZhbHVlID0gKFN0cmluZykgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMF07Ci0JCQkJCWludCBpbnNlcnRPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCkpWzFdKS5pbnRWYWx1ZSgpOwotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIlwiIiArIGRlZmF1bHRBdHRyVmFsdWUgKyAiXCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpICsgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSArIGluc2VydE9mZnNldCwgMCwgZGVmYXVsdEF0dHJWYWx1ZS5sZW5ndGgoKSArIDIsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlIDoKLQkJCQkJZGVmYXVsdEF0dHJWYWx1ZSA9IChTdHJpbmcpIHRlbXBBbm5vdGF0aW9uLmdldEFkZGl0aW9uYWxGaXhJbmZvKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiPVwiIiArIGRlZmF1bHRBdHRyVmFsdWUgKyAiXCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpICsgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZGVmYXVsdEF0dHJWYWx1ZS5sZW5ndGgoKSArIDMsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfNywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVRhZ05hbWUgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIiIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCksIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0TGVuZ3RoKCksIDAsIGdldEltYWdlKCksIFhNTFVJTWVzc2FnZXMuUXVpY2tGaXhQcm9jZXNzb3JYTUxfOCwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVBJIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzksIG51bGwsICIiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5OYW1lc3BhY2VJblBJIDoKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCAwLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzEwLCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuVW5rbm93bkVsZW1lbnQgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW1vdmVVbmtub3duRWxlbWVudFF1aWNrRml4UHJvcG9zYWwodGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwoKSk7Ci0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5Vbmtub3duQXR0ciA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF83LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBSZW5hbWVJbkZpbGVRdWlja0Fzc2lzdFByb3Bvc2FsKCkpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIFByb2JsZW1JRHNYTUwuSW52YWxpZEF0dHJWYWx1ZSA6Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbCgiIiwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRPZmZzZXQoKSwgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMiwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBQcm9ibGVtSURzWE1MLk1pc3NpbmdSZXF1aXJlZEF0dHIgOgotCQkJCQlTdHJpbmcgcmVxdWlyZWRBdHRyID0gKFN0cmluZykgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMF07Ci0JCQkJCWluc2VydE9mZnNldCA9ICgoSW50ZWdlcikgKChPYmplY3RbXSkgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKSlbMV0pLmludFZhbHVlKCk7Ci0JCQkJCXByb3Bvc2Fscy5hZGQobmV3IENvbXBsZXRpb25Qcm9wb3NhbChyZXF1aXJlZEF0dHIsIHRlbXBBbm5vdGF0aW9uLmdldFBvc2l0aW9uKCkuZ2V0T2Zmc2V0KCkgKyBpbnNlcnRPZmZzZXQsIDAsIHJlcXVpcmVkQXR0ci5sZW5ndGgoKSwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMywgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQgOgotCQkJCQlTdHJpbmcgYXR0clZhbHVlID0gKFN0cmluZykgdGVtcEFubm90YXRpb24uZ2V0QWRkaXRpb25hbEZpeEluZm8oKTsKLQkJCQkJcHJvcG9zYWxzLmFkZChuZXcgQ29tcGxldGlvblByb3Bvc2FsKCJcIiIgKyBhdHRyVmFsdWUgKyAiXCIiLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldExlbmd0aCgpLCBhdHRyVmFsdWUubGVuZ3RoKCkgKyAyLCBnZXRJbWFnZSgpLCBYTUxVSU1lc3NhZ2VzLlF1aWNrRml4UHJvY2Vzc29yWE1MXzE0LCBudWxsLCAiIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJCAvLyROT04tTkxTLTQkCi0JCQkJCWJyZWFrOwotCQkJCWNhc2UgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQ2xvc2luZ0JyYWNrZXQgOgotCQkJCQlwcm9wb3NhbHMuYWRkKG5ldyBDb21wbGV0aW9uUHJvcG9zYWwoIj4iLCB0ZW1wQW5ub3RhdGlvbi5nZXRQb3NpdGlvbigpLmdldE9mZnNldCgpICsgdGVtcEFubm90YXRpb24uZ2V0UG9zaXRpb24oKS5nZXRMZW5ndGgoKSwgMCwgMSwgZ2V0SW1hZ2UoKSwgWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xNSwgbnVsbCwgIiIpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQgLy8kTk9OLU5MUy00JAotCQkJCQlicmVhazsKLQkJCX0KLQkJfQotCi0JCXJldHVybiAoSUNvbXBsZXRpb25Qcm9wb3NhbFtdKSBwcm9wb3NhbHMudG9BcnJheShuZXcgSUNvbXBsZXRpb25Qcm9wb3NhbFtwcm9wb3NhbHMuc2l6ZSgpXSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9SZW1vdmVVbmtub3duRWxlbWVudFF1aWNrRml4UHJvcG9zYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RhYzU3Ni4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvY29ycmVjdGlvbi9SZW1vdmVVbmtub3duRWxlbWVudFF1aWNrRml4UHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29udGV4dEluZm9ybWF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5EZWxldGVFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsIGltcGxlbWVudHMgSUNvbXBsZXRpb25Qcm9wb3NhbCwgSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIgewotCXByaXZhdGUgT2JqZWN0IGZBZGRpdGlvbmFsRml4SW5mbyA9IG51bGw7Ci0JcHJpdmF0ZSBTdHJpbmcgZkRpc3BsYXlTdHJpbmc7Ci0JcHJpdmF0ZSBJbWFnZSBmSW1hZ2U7Ci0JcHJpdmF0ZSBQb2ludCBmU2VsZWN0aW9uOyAvLyBpbml0aWFsaXplZCBieSBhcHBseSgpCi0KLQlwdWJsaWMgUmVtb3ZlVW5rbm93bkVsZW1lbnRRdWlja0ZpeFByb3Bvc2FsKE9iamVjdCBhZGRpdGlvbmFsRml4SW5mbywgSW1hZ2UgaW1hZ2UsIFN0cmluZyBkaXNwbGF5U3RyaW5nKSB7Ci0JCWZBZGRpdGlvbmFsRml4SW5mbyA9IGFkZGl0aW9uYWxGaXhJbmZvOwotCQlmSW1hZ2UgPSBpbWFnZTsKLQkJZkRpc3BsYXlTdHJpbmcgPSBkaXNwbGF5U3RyaW5nOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCS8vIG5vdCBpbXBsZW1lbnRlZD8KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMiNhcHBseShvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyLAotCSAqICAgICAgY2hhciwgaW50LCBpbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSVRleHRWaWV3ZXIgdmlld2VyLCBjaGFyIHRyaWdnZXIsIGludCBzdGF0ZU1hc2ssIGludCBvZmZzZXQpIHsKLQkJaW50IHN0YXJ0VGFnT2Zmc2V0ID0gKChJbnRlZ2VyKSAoKE9iamVjdFtdKSBmQWRkaXRpb25hbEZpeEluZm8pWzBdKS5pbnRWYWx1ZSgpOwotCQlpbnQgc3RhcnRUYWdMZW5ndGggPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMV0pLmludFZhbHVlKCk7Ci0JCWludCBlbmRUYWdPZmZzZXQgPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbMl0pLmludFZhbHVlKCk7Ci0JCWludCBlbmRUYWdMZW5ndGggPSAoKEludGVnZXIpICgoT2JqZWN0W10pIGZBZGRpdGlvbmFsRml4SW5mbylbM10pLmludFZhbHVlKCk7Ci0KLQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJaWYgKGVuZFRhZ09mZnNldCAhPSAtMSkgewotCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgRGVsZXRlRWRpdChlbmRUYWdPZmZzZXQsIGVuZFRhZ0xlbmd0aCkpOwotCQkJZlNlbGVjdGlvbiA9IG5ldyBQb2ludChlbmRUYWdPZmZzZXQsIDApOwotCQl9Ci0JCWlmIChzdGFydFRhZ09mZnNldCAhPSAtMSkgewotCQkJbXVsdGlUZXh0RWRpdC5hZGRDaGlsZChuZXcgRGVsZXRlRWRpdChzdGFydFRhZ09mZnNldCwgc3RhcnRUYWdMZW5ndGgpKTsKLQkJCWZTZWxlY3Rpb24gPSBuZXcgUG9pbnQoc3RhcnRUYWdPZmZzZXQsIDApOwotCQl9Ci0KLQkJdHJ5IHsKLQkJCW11bHRpVGV4dEVkaXQuYXBwbHkodmlld2VyLmdldERvY3VtZW50KCkpOwotCQl9Ci0JCWNhdGNoIChNYWxmb3JtZWRUcmVlRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3MgZmluZCByZWFzb25zIG5vdCB0by4KLQkJCUxvZ2dlci5sb2coTG9nZ2VyLklORk8sIGUuZ2V0TWVzc2FnZSgpKTsKLQkJfQotCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJLy8gbG9nIGZvciBub3csIHVubGVzcyBmaW5kIHJlYXNvbnMgbm90IHRvLgotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0Q29udGV4dEluZm9ybWF0aW9uKCkKLQkgKi8KLQlwdWJsaWMgSUNvbnRleHRJbmZvcm1hdGlvbiBnZXRDb250ZXh0SW5mb3JtYXRpb24oKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0RGlzcGxheVN0cmluZygpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXREaXNwbGF5U3RyaW5nKCkgewotCQlpZiAoZkRpc3BsYXlTdHJpbmcgPT0gbnVsbCkKLQkJCWZEaXNwbGF5U3RyaW5nID0gWE1MVUlNZXNzYWdlcy5RdWlja0ZpeFByb2Nlc3NvclhNTF8xMTsgLy8kTk9OLU5MUy0xJAotCi0JCXJldHVybiBmRGlzcGxheVN0cmluZzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEltYWdlKCkKLQkgKi8KLQlwdWJsaWMgSW1hZ2UgZ2V0SW1hZ2UoKSB7Ci0JCXJldHVybiBmSW1hZ2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIGZTZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdW5zZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjMzMGE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1JlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5Eb2N1bWVudEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsRXh0ZW5zaW9uMjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbnRleHRJbmZvcm1hdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmxpbmsuTGlua2VkTW9kZU1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRNb2RlVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5saW5rLkxpbmtlZFBvc2l0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQubGluay5MaW5rZWRQb3NpdGlvbkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci5saW5rLkVkaXRvckxpbmtlZE1vZGVVSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuU3RydWN0dXJlZFRleHRWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50YXNzaXN0LkNvbnRlbnRBc3Npc3RVdGlsczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi1wdWJsaWMgY2xhc3MgUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbCBpbXBsZW1lbnRzIElDb21wbGV0aW9uUHJvcG9zYWwsIElDb21wbGV0aW9uUHJvcG9zYWxFeHRlbnNpb24yIHsKLQlwcm90ZWN0ZWQgSVJlZ2lvbiBmU2VsZWN0ZWRSZWdpb247IC8vIGluaXRpYWxpemVkIGJ5IGFwcGx5KCkKLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIHZvaWQgYXBwbHkoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCUlEb2N1bWVudCBkb2N1bWVudCA9IHZpZXdlci5nZXREb2N1bWVudCgpOwotCQlMaW5rZWRQb3NpdGlvbkdyb3VwIGdyb3VwID0gbmV3IExpbmtlZFBvc2l0aW9uR3JvdXAoKTsKLQkJdHJ5IHsKLQkJCWlmICh2aWV3ZXIgaW5zdGFuY2VvZiBTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgewotCQkJCUlET01Ob2RlIG5vZGUgPSAoSURPTU5vZGUpIENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodmlld2VyLCBvZmZzZXQpOwotCQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQkJSVRleHRSZWdpb24gcmVnaW9uID0gKHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpID8gbnVsbCA6IHN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG9mZnNldCk7Ci0JCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgc3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSArIHJlZ2lvbi5nZXRTdGFydCgpLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpLCAwKSk7Ci0KLQkJCQkJaWYgKHJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUgJiYgbm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQlyZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJCQlpZiAocmVnaW9uICE9IG51bGwpCi0JCQkJCQkJZ3JvdXAuYWRkUG9zaXRpb24obmV3IExpbmtlZFBvc2l0aW9uKGRvY3VtZW50LCBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgKyByZWdpb24uZ2V0U3RhcnQoKSwgcmVnaW9uLmdldFRleHRMZW5ndGgoKSwgMSkpOwotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBlbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPSBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQlyZWdpb24gPSAoZW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwpID8gbnVsbCA6IGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChvZmZzZXQpOwotCQkJCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQkJCWlmIChyZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19OQU1FICYmIG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKSB7Ci0JCQkJCQkJSVRleHRSZWdpb24gc3RhcnRUYWdOYW1lUmVnaW9uID0gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFJlZ2lvbnMoKS5nZXQoMSk7Ci0JCQkJCQkJaWYgKHJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCQkJCWdyb3VwLmFkZFBvc2l0aW9uKG5ldyBMaW5rZWRQb3NpdGlvbihkb2N1bWVudCwgbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCkgKyBzdGFydFRhZ05hbWVSZWdpb24uZ2V0U3RhcnQoKSwgc3RhcnRUYWdOYW1lUmVnaW9uLmdldFRleHRMZW5ndGgoKSwgMCkpOwotCQkJCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDEpKTsKLQkJCQkJCQl9Ci0JCQkJCQl9IGVsc2UKLQkJCQkJCQlncm91cC5hZGRQb3NpdGlvbihuZXcgTGlua2VkUG9zaXRpb24oZG9jdW1lbnQsIGVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpICsgcmVnaW9uLmdldFN0YXJ0KCksIHJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCksIDApKTsKLQkJCQkJfQotCQkJCX0KLQotCQkJCS8vIFRPRE8gQ29tcGxldGlvblByb3Bvc2FsUG9wdXAjaW5zZXJ0UHJvcG9zYWwoKSBjYWxscwotCQkJCS8vIElSZXdyaXRlVGFyZ2V0LmJlZ2luQ29tcG91bmRDaGFuZ2UoKQotCQkJCS8vICAgICAgd2hpY2ggZGlzYWJsZXMgcmVkcmF3IGluIElUZXh0Vmlld2VyLiBXb3JrYXJvdW5kIGZvciBub3cuCi0JCQkJKChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdmlld2VyKS5zZXRSZWRyYXcodHJ1ZSk7Ci0JCQl9Ci0KLQkJCUxpbmtlZE1vZGVNb2RlbCBsaW5rZWRNb2RlTW9kZWwgPSBuZXcgTGlua2VkTW9kZU1vZGVsKCk7Ci0JCQlsaW5rZWRNb2RlTW9kZWwuYWRkR3JvdXAoZ3JvdXApOwotCQkJbGlua2VkTW9kZU1vZGVsLmZvcmNlSW5zdGFsbCgpOwotCi0JCQlMaW5rZWRNb2RlVUkgdWkgPSBuZXcgRWRpdG9yTGlua2VkTW9kZVVJKGxpbmtlZE1vZGVNb2RlbCwgdmlld2VyKTsKLQkJCXVpLnNldEV4aXRQb3NpdGlvbih2aWV3ZXIsIG9mZnNldCwgMCwgTGlua2VkUG9zaXRpb25Hcm91cC5OT19TVE9QKTsKLQkJCXVpLmVudGVyKCk7Ci0KLQkJCWZTZWxlY3RlZFJlZ2lvbiA9IHVpLmdldFNlbGVjdGVkUmVnaW9uKCk7Ci0JCX0gY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGxvZyBmb3Igbm93LCB1bmxlc3MgZmluZCByZWFzb24gbm90IHRvCi0JCQlMb2dnZXIubG9nKExvZ2dlci5JTkZPLCBlLmdldE1lc3NhZ2UoKSk7Ci0JCX0KLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0QWRkaXRpb25hbFByb3Bvc2FsSW5mbygpIHsKLQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuUmVuYW1lSW5GaWxlUXVpY2tBc3Npc3RQcm9wb3NhbF8wOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRDb250ZXh0SW5mb3JtYXRpb24oKQotCSAqLwotCXB1YmxpYyBJQ29udGV4dEluZm9ybWF0aW9uIGdldENvbnRleHRJbmZvcm1hdGlvbigpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXREaXNwbGF5U3RyaW5nKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldERpc3BsYXlTdHJpbmcoKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWxfMTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fTE9DQUwpOwotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9MT0NBTF9WQVJJQUJMRSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRTZWxlY3Rpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQpCi0JICovCi0JcHVibGljIFBvaW50IGdldFNlbGVjdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJcmV0dXJuIG5ldyBQb2ludChmU2VsZWN0ZWRSZWdpb24uZ2V0T2Zmc2V0KCksIGZTZWxlY3RlZFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjc2VsZWN0ZWQob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGJvb2xlYW4pCi0JICovCi0JcHVibGljIHZvaWQgc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyLCBib29sZWFuIHNtYXJ0VG9nZ2xlKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdW5zZWxlY3RlZChvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0Vmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuc2VsZWN0ZWQoSVRleHRWaWV3ZXIgdmlld2VyKSB7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjdmFsaWRhdGUob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQsCi0JICogICAgICBpbnQsIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuRG9jdW1lbnRFdmVudCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiB2YWxpZGF0ZShJRG9jdW1lbnQgZG9jdW1lbnQsIGludCBvZmZzZXQsIERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9jb3JyZWN0aW9uL1N1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDAwYTEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2NvcnJlY3Rpb24vU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29ycmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuQmFkTG9jYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudGV4dC5lZGl0cy5JbnNlcnRFZGl0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnRleHQuZWRpdHMuTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS50ZXh0LmVkaXRzLk11bHRpVGV4dEVkaXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmZvcm1hdC5JU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRhc3Npc3QuQ29udGVudEFzc2lzdFV0aWxzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZm9ybWF0LkZvcm1hdFByb2Nlc3NvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdXJyb3VuZFdpdGhOZXdFbGVtZW50UXVpY2tBc3Npc3RQcm9wb3NhbCBleHRlbmRzIFJlbmFtZUluRmlsZVF1aWNrQXNzaXN0UHJvcG9zYWwgewotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbEV4dGVuc2lvbjIjYXBwbHkob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIGNoYXIsIGludCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIGFwcGx5KElUZXh0Vmlld2VyIHZpZXdlciwgY2hhciB0cmlnZ2VyLCBpbnQgc3RhdGVNYXNrLCBpbnQgb2Zmc2V0KSB7Ci0JCXRyeSB7Ci0JCQlpbnQgc3RhcnRUYWdPZmZzZXQgPSBvZmZzZXQ7Ci0JCQlpbnQgZW5kVGFnT2Zmc2V0ID0gb2Zmc2V0ICsgdmlld2VyLmdldFNlbGVjdGVkUmFuZ2UoKS55OwotCi0JCQkvLyBzdXJyb3VuZCB0aGUgbm9kZSBpZiBubyBzZWxlY3Rpb24KLQkJCWlmIChzdGFydFRhZ09mZnNldCA9PSBlbmRUYWdPZmZzZXQpIHsKLQkJCQlJRE9NTm9kZSBjdXJzb3JOb2RlID0gKElET01Ob2RlKSBDb250ZW50QXNzaXN0VXRpbHMuZ2V0Tm9kZUF0KHZpZXdlciwgb2Zmc2V0KTsKLQkJCQkvLyB1c2UgcGFyZW50IG5vZGUgaWYgdGV4dCBub2RlIGlzIGVtcHR5Ci0JCQkJaWYgKGN1cnNvck5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBjdXJzb3JOb2RlLmdldE5vZGVWYWx1ZSgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwKQotCQkJCQljdXJzb3JOb2RlID0gKElET01Ob2RlKSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCXN0YXJ0VGFnT2Zmc2V0ID0gY3Vyc29yTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCWVuZFRhZ09mZnNldCA9IGN1cnNvck5vZGUuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQl9Ci0KLQkJCS8vIGluc2VydCBuZXcgZWxlbWVudAotCQkJTXVsdGlUZXh0RWRpdCBtdWx0aVRleHRFZGl0ID0gbmV3IE11bHRpVGV4dEVkaXQoKTsKLQkJCS8vIGVsZW1lbnQgdGFnIG5hbWUgY2Fubm90IGJlIERCQ1MsIGRvIG5vdCB0cmFuc2xhdGUgIjxlbGVtZW50PiIKLQkJCS8vIGFuZCAiPC9lbGVtZW50PiIKLQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoc3RhcnRUYWdPZmZzZXQsICI8ZWxlbWVudD4iKSk7IC8vJE5PTi1OTFMtMSQKLQkJCW11bHRpVGV4dEVkaXQuYWRkQ2hpbGQobmV3IEluc2VydEVkaXQoZW5kVGFnT2Zmc2V0LCAiPC9lbGVtZW50PiIpKTsgLy8kTk9OLU5MUy0xJAotCQkJbXVsdGlUZXh0RWRpdC5hcHBseSh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSk7Ci0KLQkJCS8vIGdldCBuZXcgZWxlbWVudCBub2RlCi0JCQlJRE9NTm9kZSBuZXdFbGVtZW50Tm9kZSA9IChJRE9NTm9kZSkgQ29udGVudEFzc2lzdFV0aWxzLmdldE5vZGVBdCh2aWV3ZXIsIHN0YXJ0VGFnT2Zmc2V0KTsKLQotCQkJLy8gZm9ybWF0IG5ldyBlbGVtZW50Ci0JCQlJU3RydWN0dXJlZEZvcm1hdFByb2Nlc3NvciBmb3JtYXRQcm9jZXNzb3IgPSBuZXcgRm9ybWF0UHJvY2Vzc29yWE1MKCk7Ci0JCQlmb3JtYXRQcm9jZXNzb3IuZm9ybWF0Tm9kZShuZXdFbGVtZW50Tm9kZSk7Ci0KLQkJCS8vIHJlbmFtZSBuZXcgZWxlbWVudAotCQkJc3VwZXIuYXBwbHkodmlld2VyLCB0cmlnZ2VyLCBzdGF0ZU1hc2ssIG5ld0VsZW1lbnROb2RlLmdldFN0YXJ0T2Zmc2V0KCkgKyAxKTsKLQkJfSBjYXRjaCAoTWFsZm9ybWVkVHJlZUV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9IGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQkvLyBsb2cgZm9yIG5vdywgdW5sZXNzIGZpbmQgcmVhc29uIG5vdCB0bwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuSU5GTywgZS5nZXRNZXNzYWdlKCkpOwotCQl9Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmNvbnRlbnRhc3Npc3QuSUNvbXBsZXRpb25Qcm9wb3NhbCNnZXRBZGRpdGlvbmFsUHJvcG9zYWxJbmZvKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEFkZGl0aW9uYWxQcm9wb3NhbEluZm8oKSB7Ci0JCXJldHVybiBYTUxVSU1lc3NhZ2VzLlN1cnJvdW5kV2l0aE5ld0VsZW1lbnRRdWlja0Fzc2lzdFByb3Bvc2FsXzA7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuY29udGVudGFzc2lzdC5JQ29tcGxldGlvblByb3Bvc2FsI2dldERpc3BsYXlTdHJpbmcoKQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0RGlzcGxheVN0cmluZygpIHsKLQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuU3Vycm91bmRXaXRoTmV3RWxlbWVudFF1aWNrQXNzaXN0UHJvcG9zYWxfMTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5jb250ZW50YXNzaXN0LklDb21wbGV0aW9uUHJvcG9zYWwjZ2V0SW1hZ2UoKQotCSAqLwotCXB1YmxpYyBJbWFnZSBnZXRJbWFnZSgpIHsKLQkJLy8gcmV0dXJuIEphdmFQbHVnaW5JbWFnZXMuZ2V0KEphdmFQbHVnaW5JbWFnZXMuSU1HX0NPUlJFQ1RJT05fTE9DQUwpOwotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9BRERfQ09SUkVDVElPTik7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEF0dHJpYnV0ZURpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEF0dHJpYnV0ZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjQ0YTUyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRBdHRyaWJ1dGVEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci0KLXB1YmxpYyBjbGFzcyBFZGl0QXR0cmlidXRlRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIgewotCXByb3RlY3RlZCBBdHRyIGF0dHJpYnV0ZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGF0dHJpYnV0ZU5hbWU7Ci0JcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlTmFtZUZpZWxkOwotCXByb3RlY3RlZCBTdHJpbmcgYXR0cmlidXRlVmFsdWU7Ci0JcHJvdGVjdGVkIFRleHQgYXR0cmlidXRlVmFsdWVGaWVsZDsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgRWxlbWVudCBvd25lckVsZW1lbnQ7Ci0KLQlwdWJsaWMgRWRpdEF0dHJpYnV0ZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgRWxlbWVudCBvd25lckVsZW1lbnQsIEF0dHIgYXR0cmlidXRlKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5vd25lckVsZW1lbnQgPSBvd25lckVsZW1lbnQ7Ci0JCXRoaXMuYXR0cmlidXRlID0gYXR0cmlidXRlOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCWlmIChidXR0b25JZCA9PSBJRGlhbG9nQ29uc3RhbnRzLk9LX0lEKSB7Ci0JCQlhdHRyaWJ1dGVOYW1lID0gZ2V0TW9kZWxWYWx1ZShhdHRyaWJ1dGVOYW1lRmllbGQuZ2V0VGV4dCgpKTsKLQkJCWF0dHJpYnV0ZVZhbHVlID0gYXR0cmlidXRlVmFsdWVGaWVsZC5nZXRUZXh0KCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLnNlbGVjdEFsbCgpOwotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfQVRUUklCVVRFX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQXJlYSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCS8vCi0JCS8vIFN0eWxlIGNvbnZlbmllbmNlIGNvbnN0YW50cwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJTGFiZWwgYXR0cmlidXRlTmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlhdHRyaWJ1dGVOYW1lTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9OQU1FX0NPTE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCWF0dHJpYnV0ZU5hbWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAzMDA7Ci0JCWF0dHJpYnV0ZU5hbWVGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJYXR0cmlidXRlTmFtZUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGF0dHJpYnV0ZSAhPSBudWxsID8gYXR0cmlidXRlLmdldE5hbWUoKSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJYXR0cmlidXRlTmFtZUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCUxhYmVsIGF0dHJpYnV0ZVZhbHVlTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWF0dHJpYnV0ZVZhbHVlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9WQUxVRV9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQlTdHJpbmcgdmFsdWUgPSBhdHRyaWJ1dGUgIT0gbnVsbCA/IGF0dHJpYnV0ZS5nZXRWYWx1ZSgpIDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IHN0eWxlID0gU1dULlNJTkdMRSB8IFNXVC5CT1JERVI7Ci0JCWlmICh2YWx1ZS5pbmRleE9mKCJcbiIpICE9IC0xKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXN0eWxlID0gU1dULk1VTFRJIHwgU1dULkJPUkRFUiB8IFNXVC5IX1NDUk9MTCB8IFNXVC5WX1NDUk9MTDsKLQkJfQotCi0JCWF0dHJpYnV0ZVZhbHVlRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIHN0eWxlKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMzAwOwotCQlhdHRyaWJ1dGVWYWx1ZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQlhdHRyaWJ1dGVWYWx1ZUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGF0dHJpYnV0ZSAhPSBudWxsID8gYXR0cmlidXRlLmdldFZhbHVlKCkgOiAiIikpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gZXJyb3IgbWVzc2FnZQotCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5XUkFQKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLmVycm9yX21lc3NhZ2VfZ29lc19oZXJlKTsgLy8kTk9OLU5MUy0xJAotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCWdkLmhlaWdodEhpbnQgPSBNYXRoLm1heCgzMCwgZXJyb3JNZXNzYWdlTGFiZWwuY29tcHV0ZVNpemUoMCwgMCwgZmFsc2UpLnkgKiAyKTsKLQkJZ2QuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZU5hbWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVOYW1lOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlVmFsdWUoKSB7Ci0JCXJldHVybiBhdHRyaWJ1dGVWYWx1ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldERpc3BsYXlWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCXJldHVybiBzdHJpbmcgIT0gbnVsbCA/IHN0cmluZyA6ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2RlbFZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdHJpbmcgIT0gbnVsbCAmJiBzdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZUVycm9yTWVzc2FnZSgpIHsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCVN0cmluZyBuYW1lID0gYXR0cmlidXRlTmFtZUZpZWxkLmdldFRleHQoKS50cmltKCk7Ci0JCWlmIChuYW1lLmxlbmd0aCgpID4gMCkgewotCQkJQXR0ciBtYXRjaGluZ0F0dHJpYnV0ZSA9IG93bmVyRWxlbWVudC5nZXRBdHRyaWJ1dGVOb2RlKG5hbWUpOwotCQkJaWYgKG1hdGNoaW5nQXR0cmlidXRlICE9IG51bGwgJiYgbWF0Y2hpbmdBdHRyaWJ1dGUgIT0gYXR0cmlidXRlKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5fRVJST1JfWE1MX0FUVFJJQlVURV9BTFJFQURZX0VYSVNUUzsgLy8kTk9OLU5MUy0xJAotCQkJfSBlbHNlIHsKLQkJCQkvLyBUT0RPIGdldCBjaGVja05hbWUgZnJvbSBNb2RlbAotCQkJCS8vZXJyb3JNZXNzYWdlID0gVmFsaWRhdGVIZWxwZXIuY2hlY2tYTUxOYW1lKG5hbWUpOwotCQkJfQotCQl9IGVsc2UgewotCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JNZXNzYWdlTGFiZWwuZ2V0UGFyZW50KCkubGF5b3V0KCk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXREb2N0eXBlRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0RG9jdHlwZURpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjY3ZWQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXREb2N0eXBlRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3M7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRUeXBlOwotCi1wdWJsaWMgY2xhc3MgRWRpdERvY3R5cGVEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBib29sZWFuIGNvbXB1dGVTeXN0ZW1JZDsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZG9jdHlwZURhdGE7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZXJyb3JDaGVja2luZzsKLQlwcm90ZWN0ZWQgTGFiZWwgZXJyb3JNZXNzYWdlTGFiZWw7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIHB1YmxpY0lkQnJvd3NlQnV0dG9uOwotCXByb3RlY3RlZCBUZXh0IHB1YmxpY0lkRmllbGQ7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFRleHQgcm9vdEVsZW1lbnROYW1lRmllbGQ7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBzeXN0ZW1JZEJyb3dzZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCBzeXN0ZW1JZEZpZWxkOwotCi0JcHVibGljIEVkaXREb2N0eXBlRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBEb2N1bWVudFR5cGUgZG9jdHlwZSkgewotCQl0aGlzKHBhcmVudFNoZWxsLCBkb2N0eXBlLmdldE5hbWUoKSwgZG9jdHlwZS5nZXRQdWJsaWNJZCgpLCBkb2N0eXBlLmdldFN5c3RlbUlkKCkpOwotCX0KLQotCXB1YmxpYyBFZGl0RG9jdHlwZURpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nIG5hbWUsIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJZG9jdHlwZURhdGEgPSBuZXcgU3RyaW5nWzNdOwotCQlkb2N0eXBlRGF0YVswXSA9IG5hbWU7Ci0JCWRvY3R5cGVEYXRhWzFdID0gcHVibGljSWQ7Ci0JCWRvY3R5cGVEYXRhWzJdID0gc3lzdGVtSWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJZG9jdHlwZURhdGFbMF0gPSBnZXRNb2RlbFZhbHVlKHJvb3RFbGVtZW50TmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCWRvY3R5cGVEYXRhWzFdID0gZ2V0TW9kZWxWYWx1ZShwdWJsaWNJZEZpZWxkLmdldFRleHQoKSk7Ci0JCWRvY3R5cGVEYXRhWzJdID0gZ2V0TW9kZWxWYWx1ZShzeXN0ZW1JZEZpZWxkLmdldFRleHQoKSk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQ29udHJvbCA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChkaWFsb2dDb250cm9sLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9ET0NUWVBFX0RJQUxPRyk7Ci0KLQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUoZGlhbG9nQ29udHJvbCwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMzsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQotCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCA9PSBzeXN0ZW1JZEZpZWxkKSB7Ci0JCQkJCWNvbXB1dGVTeXN0ZW1JZCA9IGZhbHNlOwotCQkJCX0KLQkJCQl1cGRhdGVFcnJvck1lc3NhZ2UoKTsKLQkJCX0KLQkJfTsKLQotCQkvLyByb3cgMQotCQkvLwotCQlMYWJlbCByb290RWxlbWVudE5hbWVMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcm9vdEVsZW1lbnROYW1lTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9ST09UX0VMRU1FTlRfTkFNRV9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQlyb290RWxlbWVudE5hbWVGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHJvb3RFbGVtZW50TmFtZUZpZWxkLCBYTUxDb21tb25VSUNvbnRleHRJZHMuWENVSV9ET0NUWVBFX1JPT1QpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyMDA7Ci0JCXJvb3RFbGVtZW50TmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQlyb290RWxlbWVudE5hbWVGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShkb2N0eXBlRGF0YVswXSkpOwotCQlyb290RWxlbWVudE5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0KLQkJTGFiZWwgcGxhY2VIb2xkZXIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXBsYWNlSG9sZGVyLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKCkpOwotCi0JCS8vIHJvdyAyCi0JCS8vCi0JCUxhYmVsIHB1YmxpY0lkTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXB1YmxpY0lkTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QVUJMSUNfSURfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJcHVibGljSWRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHB1YmxpY0lkRmllbGQsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0RPQ1RZUEVfUFVCTElDKTsKLQkJcHVibGljSWRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJcHVibGljSWRGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShkb2N0eXBlRGF0YVsxXSkpOwotCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJRWRpdEVudGl0eUhlbHBlciBoZWxwZXIgPSBuZXcgRWRpdEVudGl0eUhlbHBlcigpOwotCQkJCWlmIChlLndpZGdldCA9PSBwdWJsaWNJZEJyb3dzZUJ1dHRvbikgewotCQkJCQloZWxwZXIucGVyZm9ybUJyb3dzZUZvclB1YmxpY0lkKGdldFNoZWxsKCksIHB1YmxpY0lkRmllbGQsIGNvbXB1dGVTeXN0ZW1JZCA/IHN5c3RlbUlkRmllbGQgOiBudWxsKTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoZS53aWRnZXQgPT0gc3lzdGVtSWRCcm93c2VCdXR0b24pIHsKLQkJCQkJaGVscGVyLnBlcmZvcm1Ccm93c2VGb3JTeXN0ZW1JZChnZXRTaGVsbCgpLCBzeXN0ZW1JZEZpZWxkLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0KLQkJcHVibGljSWRCcm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlwdWJsaWNJZEJyb3dzZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0JST1dTRSk7IC8vJE5PTi1OTFMtMSQKLQkJcHVibGljSWRCcm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCS8vIHJvdyAzCi0JCUxhYmVsIHN5c3RlbUlkTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXN5c3RlbUlkTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9TWVNURU1fSURfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJc3lzdGVtSWRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKHN5c3RlbUlkRmllbGQsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0RPQ1RZUEVfU1lTVEVNKTsKLQkJc3lzdGVtSWRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJc3lzdGVtSWRGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShkb2N0eXBlRGF0YVsyXSkpOwotCQlzeXN0ZW1JZEZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQotCi0JCXN5c3RlbUlkQnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJc3lzdGVtSWRCcm93c2VCdXR0b24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9CUk9XU0UpOyAvLyROT04tTkxTLTEkCi0JCXN5c3RlbUlkQnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGRpYWxvZ0NvbnRyb2wsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0NvbnRyb2w7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgTGFiZWwgY3JlYXRlTWVzc2FnZUFyZWEoQ29tcG9zaXRlIGNvbXBvc2l0ZSkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJLy8gbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBib29sZWFuIGdldEVycm9yQ2hlY2tpbmcoKSB7Ci0JCXJldHVybiBlcnJvckNoZWNraW5nOwotCX0KLQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXRNb2RlbFZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChzdHJpbmcgIT0gbnVsbCAmJiBzdHJpbmcudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJcmVzdWx0ID0gc3RyaW5nOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZG9jdHlwZURhdGFbMF07Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRQdWJsaWNJZCgpIHsKLQkJcmV0dXJuIGRvY3R5cGVEYXRhWzFdOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U3lzdGVtSWQoKSB7Ci0JCXJldHVybiBkb2N0eXBlRGF0YVsyXTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDb21wdXRlU3lzdGVtSWQoYm9vbGVhbiBjb21wdXRlU3lzdGVtSWQpIHsKLQkJdGhpcy5jb21wdXRlU3lzdGVtSWQgPSBjb21wdXRlU3lzdGVtSWQ7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RXJyb3JDaGVja2luZyhib29sZWFuIGVycm9yQ2hlY2tpbmcpIHsKLQkJdGhpcy5lcnJvckNoZWNraW5nID0gZXJyb3JDaGVja2luZzsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUxvY2F0aW9uKElQYXRoIHBhdGgpIHsKLQkJcmVzb3VyY2VMb2NhdGlvbiA9IHBhdGg7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQlpZiAoZXJyb3JDaGVja2luZykgewotCQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IG51bGw7Ci0JCQlpZiAoZ2V0TW9kZWxWYWx1ZShzeXN0ZW1JZEZpZWxkLmdldFRleHQoKSkgPT0gbnVsbCkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfU1lTVEVNX0lEX01VU1RfQkVfU1BFQ0lGSUVEOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQllbHNlIGlmIChnZXRNb2RlbFZhbHVlKHJvb3RFbGVtZW50TmFtZUZpZWxkLmdldFRleHQoKSkgPT0gbnVsbCkgewotCQkJCWVycm9yTWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfUk9PVF9FTEVNRU5UX01VU1RfQkVfU1BFQ0lGSUVEOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0KLQkJCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJCW9rQnV0dG9uLnNldEVuYWJsZWQoZXJyb3JNZXNzYWdlID09IG51bGwpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEVsZW1lbnREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbGVtZW50RGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNjA5OGEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEVsZW1lbnREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuTmFtZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotCi1wdWJsaWMgY2xhc3MgRWRpdEVsZW1lbnREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JcHJvdGVjdGVkIEVsZW1lbnQgZWxlbWVudDsKLQlwcm90ZWN0ZWQgU3RyaW5nIGVsZW1lbnROYW1lOwotCXByb3RlY3RlZCBUZXh0IGVsZW1lbnROYW1lRmllbGQ7Ci0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0KLQlwdWJsaWMgRWRpdEVsZW1lbnREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIEVsZW1lbnQgZWxlbWVudCkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWVsZW1lbnROYW1lID0gZ2V0TW9kZWxWYWx1ZShlbGVtZW50TmFtZUZpZWxkLmdldFRleHQoKSk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJb2tCdXR0b24gPSBjcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLk9LX0lELCBJRGlhbG9nQ29uc3RhbnRzLk9LX0xBQkVMLCB0cnVlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb250cm9sIGNvbnRyb2wgPSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQllbGVtZW50TmFtZUZpZWxkLmZvcmNlRm9jdXMoKTsKLQkJZWxlbWVudE5hbWVGaWVsZC5zZWxlY3RBbGwoKTsKLQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JCXJldHVybiBjb250cm9sOwotCX0KLQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0VMRU1FTlRfRElBTE9HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhLCBTV1QuTk9ORSk7Ci0JCUdyaWRMYXlvdXQgbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAyOwotCQlsYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGxheW91dCk7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQotCQlMYWJlbCBlbGVtZW50TmFtZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllbGVtZW50TmFtZUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfRUxFTUVOVF9OQU1FKTsgLy8kTk9OLU5MUy0xJAotCi0JCWVsZW1lbnROYW1lRmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2Qud2lkdGhIaW50ID0gMjAwOwotCQllbGVtZW50TmFtZUZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQllbGVtZW50TmFtZUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGVsZW1lbnQgIT0gbnVsbCA/IGVsZW1lbnQuZ2V0Tm9kZU5hbWUoKSA6ICIiKSk7IC8vJE5PTi1OTFMtMSQKLQkJZWxlbWVudE5hbWVGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQkvLyBlcnJvciBtZXNzYWdlCi0JCWVycm9yTWVzc2FnZUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmUpOyAvLyROT04tTkxTLTEkCi0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmhvcml6b250YWxTcGFuID0gMjsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCUNvbG9yIGNvbG9yID0gbmV3IENvbG9yKGVycm9yTWVzc2FnZUxhYmVsLmdldERpc3BsYXkoKSwgMjAwLCAwLCAwKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0Rm9yZWdyb3VuZChjb2xvcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoKSB7Ci0JCXJldHVybiBlbGVtZW50TmFtZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldE1vZGVsVmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHN0cmluZyAhPSBudWxsICYmIHN0cmluZy50cmltKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQlyZXN1bHQgPSBzdHJpbmc7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBtb2RpZnlUZXh0KE1vZGlmeUV2ZW50IGUpIHsKLQkJdXBkYXRlRXJyb3JNZXNzYWdlKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKCkgewotCQlTdHJpbmcgZXJyb3JNZXNzYWdlID0gbnVsbDsKLQkJU3RyaW5nIG5hbWUgPSBlbGVtZW50TmFtZUZpZWxkLmdldFRleHQoKTsKLQkJLy8JCVN0cmluZyBuYW1lID0gZWxlbWVudE5hbWVGaWVsZC5nZXRUZXh0KCkudHJpbSgpOwotCQlpZiAobmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCS8vIFRPRE8gdXNlIGNoZWNrTmFtZSBmcm9tIG1vZGVsIGxldmVsCi0JCQkvL2Vycm9yTWVzc2FnZSA9IFZhbGlkYXRlSGVscGVyLmNoZWNrWE1MTmFtZShuYW1lKTsKLQkJCWlmICghTmFtZVZhbGlkYXRvci5pc1ZhbGlkKG5hbWUpKSB7Ci0JCQkJZXJyb3JNZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5fVUlfSU5WQUxJRF9OQU1FOwotCQkJfQotCQl9IGVsc2UgewotCQkJZXJyb3JNZXNzYWdlID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJfQotCi0JCWVycm9yTWVzc2FnZUxhYmVsLnNldFRleHQoZXJyb3JNZXNzYWdlICE9IG51bGwgPyBlcnJvck1lc3NhZ2UgOiAiIik7IC8vJE5PTi1OTFMtMSQKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEVudGl0eUhlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdEVudGl0eUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmJlYzQ1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRFbnRpdHlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotCi1wdWJsaWMgY2xhc3MgRWRpdEVudGl0eUhlbHBlciB7Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtQnJvd3NlRm9yUHVibGljSWQoU2hlbGwgcGFyZW50U2hlbGwsIFRleHQgcHVibGljSWRGaWVsZCkgewotCQlwZXJmb3JtQnJvd3NlRm9yUHVibGljSWQocGFyZW50U2hlbGwsIHB1YmxpY0lkRmllbGQsIG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1Ccm93c2VGb3JQdWJsaWNJZChTaGVsbCBwYXJlbnRTaGVsbCwgVGV4dCBwdWJsaWNJZEZpZWxkLCBUZXh0IHN5c3RlbUlkRmllbGQpIHsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiZHRkIiwgInR4dCJ9OyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJU2VsZWN0WE1MQ2F0YWxvZ0lkRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cocGFyZW50U2hlbGwsIGV4dGVuc2lvbnMpOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX1hNTF9DQVRBTE9HX0VOVFJZKTsgLy8kTk9OLU5MUy0xJAotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIGlkID0gZGlhbG9nLmdldElkKCk7Ci0JCQlpZiAoaWQgIT0gbnVsbCkgewotCQkJCXB1YmxpY0lkRmllbGQuc2V0VGV4dChpZCk7Ci0JCQkJaWYgKHN5c3RlbUlkRmllbGQgIT0gbnVsbCAmJiBkaWFsb2cuZ2V0U3lzdGVtSWQoKSAhPSBudWxsKSB7Ci0JCQkJCXN5c3RlbUlkRmllbGQuc2V0VGV4dChkaWFsb2cuZ2V0U3lzdGVtSWQoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybUJyb3dzZUZvclN5c3RlbUlkKFNoZWxsIHBhcmVudFNoZWxsLCBUZXh0IHN5c3RlbUlkRmllbGQsIElQYXRoIHJlc291cmNlTG9jYXRpb24pIHsKLQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiZHRkIn07IC8vJE5PTi1OTFMtMSQKLQkJU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cocGFyZW50U2hlbGwsIGV4dGVuc2lvbnMsIElDYXRhbG9nRW50cnkuRU5UUllfVFlQRV9TWVNURU0pOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU1BFQ0lGWV9TWVNURU1fSUQpOyAvLyROT04tTkxTLTEkCi0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQlTdHJpbmcgaWQgPSBkaWFsb2cuZ2V0SWQoKTsKLQkJCUlGaWxlIGZpbGUgPSBkaWFsb2cuZ2V0RmlsZSgpOwotCQkJaWYgKGlkICE9IG51bGwpIHsKLQkJCQlzeXN0ZW1JZEZpZWxkLnNldFRleHQoaWQpOwotCQkJfSBlbHNlIGlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShmaWxlLmdldExvY2F0aW9uKCksIHJlc291cmNlTG9jYXRpb24pOwotCQkJCX0gZWxzZSB7Ci0JCQkJCXVyaSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJfQotCQkJCXN5c3RlbUlkRmllbGQuc2V0VGV4dCh1cmkpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXROYW1lc3BhY2VJbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ZjE2YzUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vZGlmeUxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5TaGVsbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ29udGVudE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLQotCXB1YmxpYyBzdGF0aWMgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgaW52b2tlRGlhbG9nKFNoZWxsIHNoZWxsLCBTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbywgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQlFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBkaWFsb2cgPSBuZXcgRWRpdE5hbWVzcGFjZUluZm9EaWFsb2coc2hlbGwsIGluZm8pOwotCQlkaWFsb2cuY3JlYXRlKCk7Ci0JCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQodGl0bGUpOwotCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCWRpYWxvZy5zZXRSZXNvdXJjZUxvY2F0aW9uKHJlc291cmNlTG9jYXRpb24pOwotCQlkaWFsb2cub3BlbigpOwotCQlyZXR1cm4gZGlhbG9nOwotCX0KLQotCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCXByb3RlY3RlZCBTdHJpbmcgZXJyb3JNZXNzYWdlOwotCi0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBOYW1lc3BhY2VJbmZvIGZJbmZvOwotCXByb3RlY3RlZCBUZXh0IGxvY2F0aW9uSGludEZpZWxkOwotCi0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgVGV4dCBwcmVmaXhGaWVsZDsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgVGV4dCB1cmlGaWVsZDsKLQotCXB1YmxpYyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgTmFtZXNwYWNlSW5mbyBpbmZvKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy5mSW5mbyA9IGluZm87Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCWZJbmZvLnVyaSA9IHVyaUZpZWxkLmdldFRleHQoKTsKLQkJCWZJbmZvLnByZWZpeCA9IHByZWZpeEZpZWxkLmdldFRleHQoKTsKLQkJCWZJbmZvLmxvY2F0aW9uSGludCA9IGxvY2F0aW9uSGludEZpZWxkLmdldFRleHQoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRXJyb3JNZXNzYWdlKCkgewotCQllcnJvck1lc3NhZ2UgPSBudWxsOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JCXVwZGF0ZVdpZGdldHMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ3N1YkFyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0gICAgICAgICAgICAgICBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ3N1YkFyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX05BTUVTUEFDRV9ESUFMT0cpOwotCi0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGRpYWxvZ3N1YkFyZWEsIFNXVC5OT05FKTsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQobGF5b3V0KTsKLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAzNTA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQotCQlNb2RpZnlMaXN0ZW5lciBtb2RpZnlMaXN0ZW5lciA9IG5ldyBNb2RpZnlMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJCXVwZGF0ZVdpZGdldHMoKTsKLQkJCX0KLQkJfTsKLQotCi0JCS8vIHJvdyAxCi0JCS8vCi0JCUxhYmVsIHVyaUxhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQl1cmlMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FX0NPTE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCXVyaUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCk7Ci0JCWdkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQl1cmlGaWVsZC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdXJpRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoZkluZm8udXJpKSk7Ci0JCXVyaUZpZWxkLmFkZE1vZGlmeUxpc3RlbmVyKG1vZGlmeUxpc3RlbmVyKTsKLQkJdXJpRmllbGQuc2V0RW5hYmxlZChmSW5mby5nZXRQcm9wZXJ0eSgidXJpLXJlYWRPbmx5IikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyBuZXZlciByZWFkCi0gICAgICAgICAgICAgICBMYWJlbCBwbGFjZUhvbGRlcjEgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICBwbGFjZUhvbGRlcjEuc2V0VGV4dCgiIik7IC8vJE5PTi1OTFMtMSQKLQotCQkvLyByb3cgMgotCQkvLwotCQlMYWJlbCBwcmVmaXhMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJcHJlZml4TGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QUkVGSVhfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJcHJlZml4RmllbGQgPSBuZXcgVGV4dChjb21wb3NpdGUsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXByZWZpeEZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQlwcmVmaXhGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZShmSW5mby5wcmVmaXgpKTsKLQkJcHJlZml4RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQlwcmVmaXhGaWVsZC5zZXRFbmFibGVkKGZJbmZvLmdldFByb3BlcnR5KCJwcmVmaXgtcmVhZE9ubHkiKSA9PSBudWxsKTsgLy8kTk9OLU5MUy0xJAotCi0JCS8vIG5ldmVyIHJlYWQKLSAgICAgICAgICAgICAgICBMYWJlbCBwbGFjZUhvbGRlcjIgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0gICAgICAgICAgICAgICAgcGxhY2VIb2xkZXIyLnNldFRleHQoIiIpOyAvLyROT04tTkxTLTEkCi0KLQkJLy8gcm93IDMKLQkJLy8KLQkJTGFiZWwgbG9jYXRpb25IaW50TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWxvY2F0aW9uSGludExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTE9DQVRJT05fSElOVF9DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQlsb2NhdGlvbkhpbnRGaWVsZCA9IG5ldyBUZXh0KGNvbXBvc2l0ZSwgU1dULlNJTkdMRSB8IFNXVC5CT1JERVIpOwotCQlnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJbG9jYXRpb25IaW50RmllbGQuc2V0TGF5b3V0RGF0YShnZCk7Ci0JCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGZJbmZvLmxvY2F0aW9uSGludCkpOwotCQlsb2NhdGlvbkhpbnRGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihtb2RpZnlMaXN0ZW5lcik7Ci0JCWxvY2F0aW9uSGludEZpZWxkLnNldEVuYWJsZWQoZkluZm8uZ2V0UHJvcGVydHkoImxvY2F0aW9uSGludC1yZWFkT25seSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0KLQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQlwZXJmb3JtQnJvd3NlKCk7Ci0JCQl9Ci0JCX07Ci0KLQkJYnJvd3NlQnV0dG9uID0gbmV3IEJ1dHRvbihjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnJvd3NlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfQlJPV1NFKTsgLy8kTk9OLU5MUy0xJAotCQlicm93c2VCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCQlicm93c2VCdXR0b24uc2V0RW5hYmxlZChsb2NhdGlvbkhpbnRGaWVsZC5nZXRFbmFibGVkKCkpOwotCi0JCS8vIGVycm9yIG1lc3NhZ2UKLQkJZXJyb3JNZXNzYWdlTGFiZWwgPSBuZXcgTGFiZWwoZGlhbG9nc3ViQXJlYSwgU1dULk5PTkUpOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuZXJyb3JfbWVzc2FnZV9nb2VzX2hlcmUpOyAvLyROT04tTkxTLTEkCi0JCWVycm9yTWVzc2FnZUxhYmVsLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlDb2xvciBjb2xvciA9IG5ldyBDb2xvcihlcnJvck1lc3NhZ2VMYWJlbC5nZXREaXNwbGF5KCksIDIwMCwgMCwgMCk7Ci0JCWVycm9yTWVzc2FnZUxhYmVsLnNldEZvcmVncm91bmQoY29sb3IpOwotCi0JCXJldHVybiBkaWFsb2dzdWJBcmVhOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0RGlzcGxheVZhbHVlKFN0cmluZyBzdHJpbmcpIHsKLQkJcmV0dXJuIHN0cmluZyAhPSBudWxsID8gc3RyaW5nIDogIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQnJvd3NlKCkgewotCQlTdHJpbmdbXSBleHRlbnNpb25zID0geyIueHNkIn07IC8vJE5PTi1OTFMtMSQKLQkJU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nIGRpYWxvZyA9IG5ldyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2coZ2V0U2hlbGwoKSwgZXh0ZW5zaW9ucyk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9TRUxFQ1RfRklMRSk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cub3BlbigpOwotCi0JCWlmIChkaWFsb2cuZ2V0UmV0dXJuQ29kZSgpID09IFdpbmRvdy5PSykgewotCQkJU3RyaW5nIGdyYW1tYXJVUkkgPSBudWxsOwotCQkJSUZpbGUgZmlsZSA9IGRpYWxvZy5nZXRGaWxlKCk7Ci0JCQlTdHJpbmcgaWQgPSBkaWFsb2cuZ2V0SWQoKTsKLQkJCWlmIChmaWxlICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgdXJpID0gbnVsbDsKLQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCXVyaSA9IFVSSUhlbHBlci5nZXRSZWxhdGl2ZVVSSShmaWxlLmdldExvY2F0aW9uKCksIHJlc291cmNlTG9jYXRpb24pOwotCQkJCQlncmFtbWFyVVJJID0gZmlsZS5nZXRMb2NhdGlvbigpLnRvT1NTdHJpbmcoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCXVyaSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJCWdyYW1tYXJVUkkgPSB1cmk7Ci0JCQkJfQotCQkJCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQodXJpKTsKLQkJCX0KLQkJCWVsc2UgaWYgKGlkICE9IG51bGwpIHsKLQkJCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRUZXh0KGlkKTsKLQkJCQlVUklSZXNvbHZlciByZXNvbHZlciA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCQkJZ3JhbW1hclVSSSA9IHJlc29sdmVyLnJlc29sdmUobnVsbCwgaWQsIGlkKTsKLQkJCX0KLQotCi0JCQlDTURvY3VtZW50IGRvY3VtZW50ID0gQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLmNyZWF0ZUNNRG9jdW1lbnQoZ3JhbW1hclVSSSwgInhzZCIpOyAvLyROT04tTkxTLTEkCi0JCQlMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0gKExpc3QpIGRvY3VtZW50LmdldFByb3BlcnR5KCJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbmFtZXNwYWNlSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KDApOwotCQkJaWYgKHVyaUZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCAmJiBpbmZvLnVyaSAhPSBudWxsKSB7Ci0JCQkJdXJpRmllbGQuc2V0VGV4dChpbmZvLnVyaSk7Ci0JCQl9Ci0JCQlpZiAocHJlZml4RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwICYmIGluZm8ucHJlZml4ICE9IG51bGwpIHsKLQkJCQlwcmVmaXhGaWVsZC5zZXRUZXh0KGluZm8ucHJlZml4KTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHNldFJlc291cmNlTG9jYXRpb24oSVBhdGggcGF0aCkgewotCQlyZXNvdXJjZUxvY2F0aW9uID0gcGF0aDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVFcnJvck1lc3NhZ2VMYWJlbCgpIHsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIHVwZGF0ZU9LQnV0dG9uU3RhdGUoKSB7Ci0JCWlmIChva0J1dHRvbiAhPSBudWxsKSB7Ci0JCQlpZiAodXJpRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwICYmIHByZWZpeEZpZWxkLmdldFRleHQoKS50cmltKCkubGVuZ3RoKCkgPT0gMCAmJiBsb2NhdGlvbkhpbnRGaWVsZC5nZXRUZXh0KCkudHJpbSgpLmxlbmd0aCgpID09IDApCi0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0JCQllbHNlCi0JCQkJb2tCdXR0b24uc2V0RW5hYmxlZChlcnJvck1lc3NhZ2UgPT0gbnVsbCk7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVXaWRnZXRzKCkgewotCQljb21wdXRlRXJyb3JNZXNzYWdlKCk7Ci0JCXVwZGF0ZUVycm9yTWVzc2FnZUxhYmVsKCk7Ci0JCXVwZGF0ZU9LQnV0dG9uU3RhdGUoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9FZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiM2ZlNjYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5QbGF0Zm9ybVVJOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWwuWE1MQ29tbW9uVUlDb250ZXh0SWRzOwotaW1wb3J0IG9yZy53M2MuZG9tLlByb2Nlc3NpbmdJbnN0cnVjdGlvbjsKLQotcHVibGljIGNsYXNzIEVkaXRQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25EaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmcgZGF0YTsKLQlwcm90ZWN0ZWQgVGV4dCBkYXRhRmllbGQ7Ci0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXQ7Ci0JcHJvdGVjdGVkIFRleHQgdGFyZ2V0RmllbGQ7Ci0KLQlwdWJsaWMgRWRpdFByb2Nlc3NpbmdJbnN0cnVjdGlvbkRpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgUHJvY2Vzc2luZ0luc3RydWN0aW9uIHBpKSB7Ci0JCXRoaXMocGFyZW50U2hlbGwsIHBpLmdldFRhcmdldCgpLCBwaS5nZXREYXRhKCkpOwotCX0KLQotCXB1YmxpYyBFZGl0UHJvY2Vzc2luZ0luc3RydWN0aW9uRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMudGFyZ2V0ID0gdGFyZ2V0OwotCQl0aGlzLmRhdGEgPSBkYXRhOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGJ1dHRvblByZXNzZWQoaW50IGJ1dHRvbklkKSB7Ci0JCXRhcmdldCA9IGdldE1vZGVsVmFsdWUodGFyZ2V0RmllbGQuZ2V0VGV4dCgpKTsKLQkJZGF0YSA9IGdldE1vZGVsVmFsdWUoZGF0YUZpZWxkLmdldFRleHQoKSk7Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLSAKLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVCdXR0b25zRm9yQnV0dG9uQmFyKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYTEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYTEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX1BST0NFU1NJTkdfRElBTE9HKTsKLQotCQlDb21wb3NpdGUgY29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShkaWFsb2dBcmVhMSwgU1dULk5PTkUpOwotCQlHcmlkTGF5b3V0IGxheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWxheW91dC5udW1Db2x1bW5zID0gMjsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC53aWR0aEhpbnQgPSAyNTA7Ci0KLQkJTGFiZWwgdGFyZ2V0TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCXRhcmdldExhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfVEFSR0VUX0NPTE9OKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRhcmdldEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCXRhcmdldEZpZWxkLnNldExheW91dERhdGEoZ2QpOwotCQl0YXJnZXRGaWVsZC5zZXRUZXh0KGdldERpc3BsYXlWYWx1ZSh0YXJnZXQpKTsKLQotCQlMYWJlbCBkYXRhTGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRhdGFMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0RBVEFfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJZGF0YUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCWRhdGFGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGF0YUZpZWxkLnNldFRleHQoZ2V0RGlzcGxheVZhbHVlKGRhdGEpKTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTE7Ci0JfQotCi0JcHJvdGVjdGVkIExhYmVsIGNyZWF0ZU1lc3NhZ2VBcmVhKENvbXBvc2l0ZSBjb21wb3NpdGUpIHsKLQkJTGFiZWwgbGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCS8vbGFiZWwuc2V0VGV4dChtZXNzYWdlKTsKLQkJcmV0dXJuIGxhYmVsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKLQkJcmV0dXJuIGRhdGE7Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyBnZXREaXNwbGF5VmFsdWUoU3RyaW5nIHN0cmluZykgewotCQlyZXR1cm4gc3RyaW5nICE9IG51bGwgPyBzdHJpbmcgOiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgZ2V0TW9kZWxWYWx1ZShTdHJpbmcgc3RyaW5nKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlpZiAoc3RyaW5nICE9IG51bGwgJiYgc3RyaW5nLnRyaW0oKS5sZW5ndGgoKSA+IDApIHsKLQkJCXJlc3VsdCA9IHN0cmluZzsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHVibGljIFN0cmluZyBnZXRUYXJnZXQoKSB7Ci0JCXJldHVybiB0YXJnZXQ7Ci0JfQotfQotCi0KLQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL0VkaXRTY2hlbWFJbmZvRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYWVmZGMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvRWRpdFNjaGVtYUluZm9EaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuSVBhdGg7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsLlhNTENvbW1vblVJQ29udGV4dElkczsKLQotcHVibGljIGNsYXNzIEVkaXRTY2hlbWFJbmZvRGlhbG9nIGV4dGVuZHMgRGlhbG9nIGltcGxlbWVudHMgVXBkYXRlTGlzdGVuZXIgewotCS8vIHByb3RlY3RlZCBOYW1lc3BhY2VJbmZvVGFibGUgbmFtZXNwYWNlSW5mb1RhYmxlOwotCXByb3RlY3RlZCBMYWJlbCBlcnJvck1lc3NhZ2VMYWJlbDsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdDsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQotCXB1YmxpYyBFZGl0U2NoZW1hSW5mb0RpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0JCVBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0SGVscFN5c3RlbSgpLnNldEhlbHAoZGlhbG9nQXJlYSwgWE1MQ29tbW9uVUlDb250ZXh0SWRzLlhDVUlfU0NIRU1BX0lORk9fRElBTE9HKTsKLQkJCi0JCUNvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nIGVkaXROYW1lc3BhY2VzQ29udHJvbCA9IG5ldyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhkaWFsb2dBcmVhLCByZXNvdXJjZUxvY2F0aW9uLCBYTUxVSU1lc3NhZ2VzLl9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TLCBmYWxzZSwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJZWRpdE5hbWVzcGFjZXNDb250cm9sLnNldE5hbWVzcGFjZUluZm9MaXN0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQllZGl0TmFtZXNwYWNlc0NvbnRyb2wudXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQotCQlyZXR1cm4gZGlhbG9nQXJlYTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBnZXREaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJcmV0dXJuIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQl9Ci0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJcmV0dXJuIG5hbWVzcGFjZUluZm9MaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCkgewotCQluYW1lc3BhY2VJbmZvTGlzdCA9IGxpc3Q7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIoKTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IGhlbHBlci5jb21wdXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0LCBudWxsKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9jY3VyZWQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGFyZykgewotCQl1cGRhdGVFcnJvck1lc3NhZ2UoKExpc3QpIGFyZyk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzNjBjMy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwudXRpbC5VUklIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkRPTU5hbWVzcGFjZUluZm9NYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotcHVibGljIGNsYXNzIE5hbWVzcGFjZUluZm9FcnJvckhlbHBlciB7Ci0KLQlwcm90ZWN0ZWQgTGlzdCBlcnJvckxpc3Q7Ci0KLQlwdWJsaWMgTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyKCkgewotCX0KLQotCXB1YmxpYyBTdHJpbmcgY29tcHV0ZUVycm9yTWVzc2FnZShMaXN0IG5hbWVzcGFjZUluZm9MaXN0LCBVUklSZXNvbHZlciBpZFJlc29sdmVyKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQlIYXNodGFibGUgcHJlZml4VGFibGUgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCUhhc2h0YWJsZSB1cmlUYWJsZSA9IG5ldyBIYXNodGFibGUoKTsKLQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gbnNJbmZvID0gKE5hbWVzcGFjZUluZm8pIGl0ZXJhdG9yLm5leHQoKTsKLQkJCW5zSW5mby5ub3JtYWxpemUoKTsKLQotCQkJU3RyaW5nIHVyaWtleSA9IG5zSW5mby51cmkgIT0gbnVsbCA/IG5zSW5mby51cmkgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJTmFtZXNwYWNlSW5mbyBuc0luZm8yID0gbnVsbDsKLQkJCWlmICgobnNJbmZvMiA9IChOYW1lc3BhY2VJbmZvKSB1cmlUYWJsZS5nZXQodXJpa2V5KSkgIT0gbnVsbCkgewotCQkJCWlmIChuc0luZm8udXJpICE9IG51bGwgJiYgbnNJbmZvLnVyaS5lcXVhbHMobnNJbmZvMi51cmkpKSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIX05BTUUgKyAiJyIgKyBuc0luZm8udXJpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCX0gZWxzZSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfTU9SRV9USEFOX09ORV9OU19XSVRIT1VUX05BTUU7IC8vJE5PTi1OTFMtMSQKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9IGVsc2UgewotCQkJCXVyaVRhYmxlLnB1dCh1cmlrZXksIG5zSW5mbyk7Ci0JCQl9Ci0KLQkJCWlmIChuc0luZm8udXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcga2V5ID0gbnNJbmZvLnByZWZpeCAhPSBudWxsID8gbnNJbmZvLnByZWZpeCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKHByZWZpeFRhYmxlLmdldChrZXkpICE9IG51bGwpIHsKLQkJCQkJaWYgKG5zSW5mby5wcmVmaXggIT0gbnVsbCkgewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhfUFJFRklYICsgIiciICsgbnNJbmZvLnByZWZpeCArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCWJyZWFrOwotCQkJCQl9IGVsc2UgewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19NT1JFX1RIQU5fT05FX05TX1dJVEhPVVRfUFJFRklYOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCX0gZWxzZSB7Ci0JCQkJCXByZWZpeFRhYmxlLnB1dChrZXksIG5zSW5mbyk7Ci0JCQkJfQotCi0JCQkJaWYgKG5zSW5mby5sb2NhdGlvbkhpbnQgIT0gbnVsbCAmJiBpZFJlc29sdmVyICE9IG51bGwpIHsKLQkJCQkJU3RyaW5nIGdyYW1tYXJVUkkgPSBpZFJlc29sdmVyLnJlc29sdmUobnVsbCwgbnNJbmZvLmxvY2F0aW9uSGludCwgbnNJbmZvLmxvY2F0aW9uSGludCk7Ci0JCQkJCWlmICghVVJJSGVscGVyLmlzUmVhZGFibGVVUkkoZ3JhbW1hclVSSSwgZmFsc2UpKSB7Ci0JCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX1NDSEVNQV9DQU5fTk9UX0JFX0xPQ0FURUQgKyAiICciICsgbnNJbmZvLmxvY2F0aW9uSGludCArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJCWlmIChpZFJlc29sdmVyICE9IG51bGwgJiYgbnNJbmZvLmxvY2F0aW9uSGludCA9PSBudWxsICYmICFuc0luZm8udXJpLmVxdWFscyhET01OYW1lc3BhY2VJbmZvTWFuYWdlci5YU0lfVVJJKSkgewotCQkJCQlyZXN1bHQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9XQVJOSU5HX0xPQ0FUSU9OX0hJTlRfTk9UX1NQRUNJRklFRCArICIgJyIgKyBuc0luZm8udXJpICsgIiciOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQgLy8kTk9OLU5MUy0zJAotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCWlmIChuc0luZm8ucHJlZml4ICE9IG51bGwpIHsKLQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfV0FSTklOR19OQU1FU1BBQ0VfTkFNRV9OT1RfU1BFQ0lGSUVEICsgIiAnIiArIG5zSW5mby5wcmVmaXggKyAiJyI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJCAvLyROT04tTkxTLTMkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBhZGRpdGlvbmFsIHRlc3RzCi0JCWlmIChyZXN1bHQgPT0gbnVsbCkgewotCQkJZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IG5hbWVzcGFjZUluZm9MaXN0Lml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspIHsKLQkJCQlOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpdGVyYXRvci5uZXh0KCk7Ci0JCQkJbnNJbmZvLm5vcm1hbGl6ZSgpOwotCQkJCWlmIChuc0luZm8udXJpICE9IG51bGwgJiYgbnNJbmZvLmlzUHJlZml4UmVxdWlyZWQgJiYgbnNJbmZvLnByZWZpeCA9PSBudWxsKSB7Ci0JCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX1dBUk5JTkdfUFJFRklYX05PVF9TUEVDSUZJRUQgKyAiICciICsgbnNJbmZvLnVyaSArICInIjsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9OYW1lc3BhY2VJbmZvVGFibGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL05hbWVzcGFjZUluZm9UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjgzMGU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL05hbWVzcGFjZUluZm9UYWJsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5Db2x1bW5XZWlnaHREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXJMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRleHRDZWxsRWRpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLndpbmRvdy5XaW5kb3c7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLk1vdXNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVJdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgTmFtZXNwYWNlSW5mb1RhYmxlIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCS8qKgotCSAqIE5hbWVzcGFjZUluZm9UYWJsZUxhYmVsUHJvdmlkZXIKLQkgKi8KLQlwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQotCQlwdWJsaWMgdm9pZCBhZGRMaXN0ZW5lcihJTGFiZWxQcm92aWRlckxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQl9Ci0KLQkJcHVibGljIEltYWdlIGdldENvbHVtbkltYWdlKE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQotCQlwdWJsaWMgU3RyaW5nIGdldENvbHVtblRleHQoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbikgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG9iamVjdDsKLQkJCVN0cmluZyByZXN1bHQgPSBudWxsOwotCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQljYXNlIDAgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8udXJpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSAxIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLnByZWZpeDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgMiA6IHsKLQkJCQkJcmVzdWx0ID0gaW5mby5sb2NhdGlvbkhpbnQ7Ci0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCX0KLQkJCXJlc3VsdCA9IHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChyZXN1bHQuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJc3dpdGNoIChjb2x1bW4pIHsKLQkJCQkJY2FzZSAwIDogewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfTk9fTkFNRVNQQUNFX05BTUU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJCWNhc2UgMSA6IHsKLQkJCQkJCXJlc3VsdCA9IFhNTFVJTWVzc2FnZXMuX1VJX05PX1BSRUZJWDsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJIFN0cmluZyBnZXREZWZhdWx0UHJlZml4KCkgewotCQkJU3RyaW5nIGRlZmF1bHRQcmVmaXggPSAicCI7IC8vJE5PTi1OTFMtMSQKLQkJCWlmIChuYW1lc3BhY2VJbmZvTGlzdCA9PSBudWxsKQotCQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQkJVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKTsgaSsrKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBuc2luZm8gPSAoTmFtZXNwYWNlSW5mbykgbmFtZXNwYWNlSW5mb0xpc3QuZ2V0KGkpOwotCQkJCWlmIChuc2luZm8ucHJlZml4ICE9IG51bGwpCi0JCQkJCXYuYWRkRWxlbWVudChuc2luZm8ucHJlZml4KTsKLQkJCX0KLQkJCWlmICh2LmNvbnRhaW5zKGRlZmF1bHRQcmVmaXgpKSB7Ci0JCQkJU3RyaW5nIHMgPSBkZWZhdWx0UHJlZml4OwotCQkJCWZvciAoaW50IGogPSAwOyB2LmNvbnRhaW5zKHMpOyBqKyspIHsKLQkJCQkJcyA9IGRlZmF1bHRQcmVmaXggKyBJbnRlZ2VyLnRvU3RyaW5nKGopOwotCQkJCX0KLQkJCQlyZXR1cm4gczsKLQkJCX0gZWxzZQotCQkJCXJldHVybiBkZWZhdWx0UHJlZml4OwotCQl9Ci0KLQkJcHVibGljIE9iamVjdFtdIGdldEVsZW1lbnRzKE9iamVjdCBpbnB1dEVsZW1lbnQpIHsKLQkJCXJldHVybiBuYW1lc3BhY2VJbmZvTGlzdC50b0FycmF5KCk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZElucHV0LCBPYmplY3QgbmV3SW5wdXQpIHsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRGVsZXRlZChPYmplY3QgZWxlbWVudCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBvYmplY3QsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNMYWJlbFByb3BlcnR5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHkpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHJlbW92ZUxpc3RlbmVyKElMYWJlbFByb3ZpZGVyTGlzdGVuZXIgbGlzdGVuZXIpIHsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0hJTlQgPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9MT0NBVElPTl9ISU5UOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRVNQQUNFX1VSSSA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX05BTUVTUEFDRV9OQU1FOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfUFJFRklYOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZHVtbXlSb3dzUmVtb3ZlZCA9IGZhbHNlOwotCXByb3RlY3RlZCBCdXR0b24gZWRpdEJ1dHRvbjsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBWZWN0b3IoKTsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgTmFtZXNwYWNlSW5mb1RhYmxlTGFiZWxQcm92aWRlciBwcm92aWRlcjsKLQlwcm90ZWN0ZWQgSVBhdGggcmVzb3VyY2VMb2NhdGlvbjsKLQlwcm90ZWN0ZWQgVGFibGVWaWV3ZXIgdGFibGVWaWV3ZXI7Ci0JcHJvdGVjdGVkIFVwZGF0ZUxpc3RlbmVyIHVwZGF0ZUxpc3RlbmVyOwotCXByb3RlY3RlZCBpbnQgdmlzaWJsZVJvd3MgPSAtMTsKLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCkgewotCQl0aGlzKHBhcmVudCwgLTEsIC0xLCAtMSk7Ci0JfQotCi0JcHVibGljIE5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgdmlzaWJsZVJvd3MpIHsKLQkJdGhpcyhwYXJlbnQsIC0xLCAtMSwgdmlzaWJsZVJvd3MpOwotCX0KLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQpIHsKLQkJdGhpcyhwYXJlbnQsIHdpZHRoSGludCwgaGVpZ2h0SGludCwgLTEpOwotCX0KLQotCXB1YmxpYyBOYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoSGludCwgaW50IGhlaWdodEhpbnQsIGludCB2aXNpYmxlUm93cykgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJc2V0TGF5b3V0KGNyZWF0ZUdyaWRMYXlvdXQoKSk7Ci0JCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlHcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotCQluYW1lc3BhY2VJbmZvR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OKTsgLy8kTk9OLU5MUy0xJAotCQluYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlpZiAod2lkdGhIaW50ICE9IC0xKSB7Ci0JCQlnZC53aWR0aEhpbnQgPSB3aWR0aEhpbnQ7Ci0JCX0KLQkJaWYgKGhlaWdodEhpbnQgIT0gLTEpIHsKLQkJCWdkLmhlaWdodEhpbnQgPSBoZWlnaHRIaW50OwotCQl9Ci0JCW5hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJLy9Xb3JrYmVuY2hIZWxwLnNldEhlbHAobmFtZXNwYWNlSW5mb0dyb3VwLCBuZXcKLQkJLy8gQ29udHJvbENvbnRleHRDb21wdXRlcihuYW1lc3BhY2VJbmZvR3JvdXAsCi0JCS8vIFhNTEJ1aWxkZXJDb250ZXh0SWRzLlhNTENfTkFNRVNQQUNFX0dST1VQKSk7Ci0JCVN0cmluZ1tdIHRpdGxlQXJyYXkgPSB7TkFNRVNQQUNFX1VSSSwgUFJFRklYLCBMT0NBVElPTl9ISU5UfTsKLQkJdGFibGVWaWV3ZXIgPSBuZXcgVGFibGVWaWV3ZXIobmFtZXNwYWNlSW5mb0dyb3VwLCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCQlwcm92aWRlciA9IG5ldyBOYW1lc3BhY2VJbmZvVGFibGVMYWJlbFByb3ZpZGVyKCk7Ci0JCXRhYmxlVmlld2VyLnNldENvbnRlbnRQcm92aWRlcihwcm92aWRlcik7Ci0JCXRhYmxlVmlld2VyLnNldExhYmVsUHJvdmlkZXIocHJvdmlkZXIpOwotCQl0YWJsZVZpZXdlci5zZXRDb2x1bW5Qcm9wZXJ0aWVzKHRpdGxlQXJyYXkpOwotCQlUYWJsZSB0YWJsZSA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCQlpbnRbXSB3aWR0aEFycmF5ID0gezUwLCAyMCwgMzB9OwotCQlUYWJsZUxheW91dCBsYXlvdXQgPSBuZXcgVGFibGVMYXlvdXQoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCB0aXRsZUFycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIGkpOwotCQkJY29sdW1uLnNldFRleHQodGl0bGVBcnJheVtpXSk7Ci0JCQljb2x1bW4uc2V0QWxpZ25tZW50KFNXVC5MRUZUKTsKLQkJCWxheW91dC5hZGRDb2x1bW5EYXRhKG5ldyBDb2x1bW5XZWlnaHREYXRhKHdpZHRoQXJyYXlbaV0sIHRydWUpKTsKLQkJfQotCQl0aGlzLnZpc2libGVSb3dzID0gdmlzaWJsZVJvd3M7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdmlzaWJsZVJvd3M7IGkrKykgewotCQkJVGFibGVJdGVtIGl0ZW0gPSBuZXcgVGFibGVJdGVtKHRhYmxlLCBTV1QuTk9ORSk7Ci0JCQlpdGVtLnNldFRleHQoIiMjIyMjIyMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXRhYmxlLnNldExheW91dChsYXlvdXQpOwotCQlDZWxsRWRpdG9yW10gY2VsbEVkaXRvcnMgPSBuZXcgQ2VsbEVkaXRvclt0aXRsZUFycmF5Lmxlbmd0aF07Ci0JCWNlbGxFZGl0b3JzWzFdID0gbmV3IFRleHRDZWxsRWRpdG9yKHRhYmxlKTsKLQkJY2VsbEVkaXRvcnNbMl0gPSBuZXcgVGV4dENlbGxFZGl0b3IodGFibGUpOwotCQl0YWJsZVZpZXdlci5zZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JCU1vdXNlQWRhcHRlciBtb3VzZUFkYXB0ZXIgPSBuZXcgTW91c2VBZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgbW91c2VEb3VibGVDbGljayhNb3VzZUV2ZW50IGUpIHsKLQkJCQlpZiAodGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5nZXRJdGVtKG5ldyBQb2ludChlLngsIGUueSkpICE9IG51bGwpIHsKLQkJCQkJcGVyZm9ybUVkaXQoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlLmFkZE1vdXNlTGlzdGVuZXIobW91c2VBZGFwdGVyKTsKLQkJY3JlYXRlQnV0dG9ucyhuYW1lc3BhY2VJbmZvR3JvdXApOwotCQlJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyIHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKTsKLQkJCX0KLQkJfTsKLQkJdGFibGVWaWV3ZXIuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKHNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUdyaWRMYXlvdXQgZ3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCWdyaWRMYXlvdXQubWFyZ2luSGVpZ2h0ID0gMDsKLQkJZ3JpZExheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCWNvbXBvc2l0ZS5zZXRMYXlvdXQoZ3JpZExheW91dCk7Ci0JCUJ1dHRvbiBoaWRkZW5CdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQloaWRkZW5CdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCWhpZGRlbkJ1dHRvbi5zZXRWaXNpYmxlKGZhbHNlKTsKLQkJaGlkZGVuQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQlTZWxlY3Rpb25MaXN0ZW5lciBzZWxlY3Rpb25MaXN0ZW5lciA9IG5ldyBTZWxlY3Rpb25BZGFwdGVyKCkgewotCQkJcHVibGljIHZvaWQgd2lkZ2V0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCQkJCWlmIChlLndpZGdldCA9PSBuZXdCdXR0b24pIHsKLQkJCQkJcGVyZm9ybU5ldygpOwotCQkJCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gZWRpdEJ1dHRvbikgewotCQkJCQlwZXJmb3JtRWRpdCgpOwotCQkJCX0gZWxzZSBpZiAoZS53aWRnZXQgPT0gZGVsZXRlQnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1EZWxldGUoKTsKLQkJCQl9Ci0JCQl9Ci0JCX07Ci0JCS8vIGNyZWF0ZSBhIGNvbXBvc2l0ZSB0byBob2xkIHRoZSB0aHJlZSBidXR0b25zCi0JCUNvbXBvc2l0ZSBidXR0b25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQlidXR0b25Db21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCWJ1dHRvbkdyaWRMYXlvdXQubnVtQ29sdW1ucyA9IDM7Ci0JCWJ1dHRvbkdyaWRMYXlvdXQubWFrZUNvbHVtbnNFcXVhbFdpZHRoID0gdHJ1ZTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dChidXR0b25HcmlkTGF5b3V0KTsKLQkJLy8gYWRkIHRoZSBOZXcgYnV0dG9uCi0JCS8vCi0JCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCW5ld0J1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9ORVcpOyAvLyROT04tTkxTLTEkCi0JCW5ld0J1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJbmV3QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJLy8gYWRkIHRoZSBFZGl0IGJ1dHRvbgotCQkvLwotCQllZGl0QnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZWRpdEJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9FRElUKTsgLy8kTk9OLU5MUy0xJAotCQllZGl0QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQllZGl0QnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJLy8gYWRkIHRoZSBEZWxldGUgYnV0dG9uCi0JCS8vCi0JCWRlbGV0ZUJ1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0JVVFRPTl9ERUxFVEUpOyAvLyROT04tTkxTLTEkCi0JCWRlbGV0ZUJ1dHRvbi5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJZGVsZXRlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQl9Ci0KLQlwdWJsaWMgR3JpZExheW91dCBjcmVhdGVHcmlkTGF5b3V0KCkgewotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJZ3JpZExheW91dC5ob3Jpem9udGFsU3BhY2luZyA9IDA7Ci0JCXJldHVybiBncmlkTGF5b3V0OwotCX0KLQotCXB1YmxpYyBMaXN0IGdldE5hbWVzcGFjZUluZm9MaXN0KCkgewotCQlyZXR1cm4gbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JfQotCi0JcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gZ2V0VGFyZ2V0TmFtZXNwYWNlSW5mbygpIHsKLQkJcmV0dXJuIChuYW1lc3BhY2VJbmZvTGlzdCAhPSBudWxsICYmIG5hbWVzcGFjZUluZm9MaXN0LnNpemUoKSA+IDApID8gKE5hbWVzcGFjZUluZm8pIG5hbWVzcGFjZUluZm9MaXN0LmdldCgwKSA6IG51bGw7Ci0JfQotCi0JcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGludm9rZURpYWxvZyhTdHJpbmcgdGl0bGUsIE5hbWVzcGFjZUluZm8gaW5mbykgewotCQlTaGVsbCBzaGVsbCA9IFhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0U2hlbGwoKTsKLQkJRWRpdE5hbWVzcGFjZUluZm9EaWFsb2cgZGlhbG9nID0gbmV3IEVkaXROYW1lc3BhY2VJbmZvRGlhbG9nKHNoZWxsLCBpbmZvKTsKLQkJZGlhbG9nLmNyZWF0ZSgpOwotCQlkaWFsb2cuZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJZGlhbG9nLnNldEJsb2NrT25PcGVuKHRydWUpOwotCQlkaWFsb2cuc2V0UmVzb3VyY2VMb2NhdGlvbihyZXNvdXJjZUxvY2F0aW9uKTsKLQkJZGlhbG9nLm9wZW4oKTsKLQkJcmV0dXJuIGRpYWxvZzsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVsYXllZFVwZGF0ZSgpIHsKLQkJUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpIHsKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQl1cGRhdGUoKTsKLQkJCX0KLQkJfTsKLQkJZ2V0RGlzcGxheSgpLmFzeW5jRXhlYyhkZWxheWVkVXBkYXRlKTsKLQkJaWYgKHVwZGF0ZUxpc3RlbmVyICE9IG51bGwpIHsKLQkJCXVwZGF0ZUxpc3RlbmVyLnVwZGF0ZU9jY3VyZWQodGhpcywgbmFtZXNwYWNlSW5mb0xpc3QpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybURlbGV0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgIT0gbnVsbCkgewotCQkJbmFtZXNwYWNlSW5mb0xpc3QucmVtb3ZlKHNlbGVjdGVkT2JqZWN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdCgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBOYW1lc3BhY2VJbmZvKSB7Ci0JCQlpbnZva2VEaWFsb2coWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiwgKE5hbWVzcGFjZUluZm8pIHNlbGVjdGVkT2JqZWN0KTsgLy8kTk9OLU5MUy0xJAotCQkJcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1OZXcoKSB7Ci0JCU5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0JCUVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGRpYWxvZyA9IGludm9rZURpYWxvZyhYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfTkFNRVNQQUNFX0lORk9STUFUSU9OLCBpbmZvKTsgLy8kTk9OLU5MUy0xJAotCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0LmFkZChpbmZvKTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IG5hbWVzcGFjZUluZm9MaXN0KSB7Ci0JCXRoaXMubmFtZXNwYWNlSW5mb0xpc3QgPSBuYW1lc3BhY2VJbmZvTGlzdDsKLQkJdXBkYXRlKCk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0UmVzb3VyY2VMb2NhdGlvbihJUGF0aCByZXNvdXJjZUxvY2F0aW9uKSB7Ci0JCXRoaXMucmVzb3VyY2VMb2NhdGlvbiA9IHJlc291cmNlTG9jYXRpb247Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VXBkYXRlTGlzdGVuZXIoVXBkYXRlTGlzdGVuZXIgdXBkYXRlTGlzdGVuZXIpIHsKLQkJdGhpcy51cGRhdGVMaXN0ZW5lciA9IHVwZGF0ZUxpc3RlbmVyOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJdXBkYXRlSGVscGVyKG5hbWVzcGFjZUluZm9MaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gdGFibGVWaWV3ZXIuZ2V0U2VsZWN0aW9uKCk7Ci0JCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIHNlbGVjdGVkT2JqZWN0OwotCQllZGl0QnV0dG9uLnNldEVuYWJsZWQoaW5mbyAhPSBudWxsKTsKLQkJZGVsZXRlQnV0dG9uLnNldEVuYWJsZWQoaW5mbyAhPSBudWxsICYmIGluZm8uZ2V0UHJvcGVydHkoInVucmVtb3ZhYmxlIikgPT0gbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgdm9pZCB1cGRhdGVIZWxwZXIoTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCkgewotCQlpZiAodmlzaWJsZVJvd3MgIT0gLTEgJiYgIWR1bW15Um93c1JlbW92ZWQpIHsKLQkJCWR1bW15Um93c1JlbW92ZWQgPSB0cnVlOwotCQkJdGFibGVWaWV3ZXIuZ2V0VGFibGUoKS5yZW1vdmVBbGwoKTsKLQkJfQotCQlJU2VsZWN0aW9uIHNlbGVjdGlvbiA9IHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpOwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCWlmIChzZWxlY3Rpb24uaXNFbXB0eSgpKSB7Ci0JCQlpZiAobmFtZXNwYWNlSW5mb0xpc3Quc2l6ZSgpID4gMCkgewotCQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihuYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCkpKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXRhYmxlVmlld2VyLnNldFNlbGVjdGlvbihzZWxlY3Rpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRmYzk2OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5EaWFsb2c7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuZGlhbG9ncy5JRGlhbG9nQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBpbnQgY2F0YWxvZ0VudHJ5VHlwZTsKLQlwcm90ZWN0ZWQgU3RyaW5nW10gZXh0ZW5zaW9uczsKLQlwcm90ZWN0ZWQgSUZpbGUgZmlsZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIGlkOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsIHBhbmVsOwotCi0JcHVibGljIFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhTaGVsbCBwYXJlbnRTaGVsbCwgU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQl0aGlzKHBhcmVudFNoZWxsLCBleHRlbnNpb25zLCAwKTsKLQl9Ci0KLQlwdWJsaWMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmdbXSBleHRlbnNpb25zLCBpbnQgY2F0YWxvZ0VudHJ5VHlwZSkgewotCQlzdXBlcihwYXJlbnRTaGVsbCk7Ci0JCXNldFNoZWxsU3R5bGUoZ2V0U2hlbGxTdHlsZSgpIHwgU1dULlJFU0laRSk7Ci0JCXRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0JCXRoaXMuY2F0YWxvZ0VudHJ5VHlwZSA9IGNhdGFsb2dFbnRyeVR5cGU7Ci0JfQotCi0KLQlwcm90ZWN0ZWQgdm9pZCBidXR0b25QcmVzc2VkKGludCBidXR0b25JZCkgewotCQlpZiAoYnV0dG9uSWQgPT0gSURpYWxvZ0NvbnN0YW50cy5PS19JRCkgewotCQkJZmlsZSA9IHBhbmVsLmdldEZpbGUoKTsKLQkJCWlkID0gcGFuZWwuZ2V0WE1MQ2F0YWxvZ0lkKCk7Ci0JCX0KLQkJc3VwZXIuYnV0dG9uUHJlc3NlZChidXR0b25JZCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCW9rQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotCQljcmVhdGVCdXR0b24ocGFyZW50LCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9JRCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfTEFCRUwsIGZhbHNlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVEaWFsb2dBcmVhKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29tcG9zaXRlIGRpYWxvZ0FyZWEgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVEaWFsb2dBcmVhKHBhcmVudCk7Ci0KLQkJcGFuZWwgPSBuZXcgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoZGlhbG9nQXJlYSk7Ci0JCXBhbmVsLnNldENhdGFsb2dFbnRyeVR5cGUoY2F0YWxvZ0VudHJ5VHlwZSk7Ci0JCXBhbmVsLnNldEZpbHRlckV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCXBhbmVsLnNldFZpc2libGVIZWxwZXIodHJ1ZSk7Ci0JCVNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZFBhbmVsLkxpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgY29tcGxldGlvblN0YXRlQ2hhbmdlZCgpIHsKLQkJCQl1cGRhdGVCdXR0b25TdGF0ZSgpOwotCQkJfQotCQl9OwotCQlwYW5lbC5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBpZDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVCdXR0b25TdGF0ZSgpIHsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZChwYW5lbC5nZXRGaWxlKCkgIT0gbnVsbCB8fCBwYW5lbC5nZXRYTUxDYXRhbG9nSWQoKSAhPSBudWxsKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzNTRlYy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWRQYW5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU2VsZWN0aW9uQ2hhbmdlZEV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25FdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5wYXJ0LlBhZ2VCb29rOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwudmlld2Vycy5TZWxlY3RTaW5nbGVGaWxlVmlldzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQkvKioKLQkgKiBUT0RPOiBDaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBpbnRlcmZhY2U7ICJMaXN0ZW5lciIgaXMgdXNlZCBieSBTV1QuCi0JICovCi0JcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciB7Ci0JCXZvaWQgY29tcGxldGlvblN0YXRlQ2hhbmdlZCgpOwotCX0KLQotCXByb3RlY3RlZCBjbGFzcyBNeVNlbGVjdFNpbmdsZUZpbGVWaWV3IGV4dGVuZHMgU2VsZWN0U2luZ2xlRmlsZVZpZXcgaW1wbGVtZW50cyBTZWxlY3RTaW5nbGVGaWxlVmlldy5MaXN0ZW5lciB7Ci0JCXByb3RlY3RlZCBDb250cm9sIGNvbnRyb2w7Ci0KLQkJcHVibGljIE15U2VsZWN0U2luZ2xlRmlsZVZpZXcoQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIobnVsbCwgdHJ1ZSk7Ci0JCQkvL1N0cmluZ1tdIGV4dCA9IHsiLmR0ZCJ9OwotCQkJLy9hZGRGaWx0ZXJFeHRlbnNpb25zKGV4dCk7Ci0JCQljb250cm9sID0gY3JlYXRlQ29udHJvbChwYXJlbnQpOwotCQkJY29udHJvbC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJCU15U2VsZWN0U2luZ2xlRmlsZVZpZXcudGhpcy5zZXRMaXN0ZW5lcih0aGlzKTsKLQkJfQotCi0JCXB1YmxpYyBDb250cm9sIGdldENvbnRyb2woKSB7Ci0JCQlyZXR1cm4gY29udHJvbDsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIHNldENvbnRyb2xDb21wbGV0ZShib29sZWFuIGlzQ29tcGxldGUpIHsKLQkJCXVwZGF0ZUNvbXBsZXRpb25TdGF0ZUNoYW5nZSgpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIGlzVmlzaWJsZSkgewotCQkJc3VwZXIuc2V0VmlzaWJsZUhlbHBlcihpc1Zpc2libGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIExpc3RlbmVyIGxpc3RlbmVyOwotCXByb3RlY3RlZCBQYWdlQm9vayBwYWdlQm9vazsKLQotCXByb3RlY3RlZCBCdXR0b25bXSByYWRpb0J1dHRvbjsKLQlwcm90ZWN0ZWQgTXlTZWxlY3RTaW5nbGVGaWxlVmlldyBzZWxlY3RTaW5nbGVGaWxlVmlldzsKLQlwcm90ZWN0ZWQgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwgc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWw7Ci0KLQlwdWJsaWMgU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkUGFuZWwoQ29tcG9zaXRlIHBhcmVudCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQotCQkvLyBjb250YWluZXIgZ3JvdXAKLQkJc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpOwotCQlnZC5oZWlnaHRIaW50ID0gNDAwOwotCQlnZC53aWR0aEhpbnQgPSA0MDA7Ci0JCXNldExheW91dERhdGEoZ2QpOwotCi0JCXJhZGlvQnV0dG9uID0gbmV3IEJ1dHRvblsyXTsKLQkJcmFkaW9CdXR0b25bMF0gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7Ci0JCXJhZGlvQnV0dG9uWzBdLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX1dPUktTUEFDRSk7IC8vJE5PTi1OTFMtMSQKLQkJcmFkaW9CdXR0b25bMF0uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0JCXJhZGlvQnV0dG9uWzBdLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJcmFkaW9CdXR0b25bMF0uYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJcmFkaW9CdXR0b25bMV0gPSBuZXcgQnV0dG9uKHRoaXMsIFNXVC5SQURJTyk7Ci0JCXJhZGlvQnV0dG9uWzFdLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfUkFESU9fQlVUVE9OX1NFTEVDVF9GUk9NX0NBVEFMT0cpOyAvLyROT04tTkxTLTEkCi0JCXJhZGlvQnV0dG9uWzFdLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlyYWRpb0J1dHRvblsxXS5hZGRTZWxlY3Rpb25MaXN0ZW5lcih0aGlzKTsKLQotCQlwYWdlQm9vayA9IG5ldyBQYWdlQm9vayh0aGlzLCBTV1QuTk9ORSk7Ci0JCXBhZ2VCb29rLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3ID0gbmV3IE15U2VsZWN0U2luZ2xlRmlsZVZpZXcocGFnZUJvb2spOwotCi0JCUlDYXRhbG9nIHhtbENhdGFsb2cgPSBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXREZWZhdWx0WE1MQ2F0YWxvZygpOwotCQlzZWxlY3RYTUxDYXRhbG9nSWRQYW5lbCA9IG5ldyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChwYWdlQm9vaywgeG1sQ2F0YWxvZyk7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFRhYmxlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQkJCX0KLQkJfSk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdFNpbmdsZUZpbGVWaWV3LmdldENvbnRyb2woKSk7Ci0JfQotCi0JcHVibGljIElGaWxlIGdldEZpbGUoKSB7Ci0JCUlGaWxlIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblswXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0RmlsZSgpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHVibGljIElDYXRhbG9nRW50cnkgZ2V0WE1MQ2F0YWxvZ0VudHJ5KCkgewotCQlJQ2F0YWxvZ0VudHJ5IHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFhNTENhdGFsb2dJZCgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0SWQoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0WE1MQ2F0YWxvZ1VSSSgpIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCWlmIChyYWRpb0J1dHRvblsxXS5nZXRTZWxlY3Rpb24oKSkgewotCQkJcmVzdWx0ID0gc2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuZ2V0VVJJKCk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLnNldENhdGFsb2dFbnRyeVR5cGUoY2F0YWxvZ0VudHJ5VHlwZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0RmlsdGVyRXh0ZW5zaW9ucyhTdHJpbmdbXSBmaWx0ZXJFeHRlbnNpb25zKSB7Ci0JCXNlbGVjdFNpbmdsZUZpbGVWaWV3LnJlc2V0RmlsdGVycygpOwotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5hZGRGaWx0ZXJFeHRlbnNpb25zKGZpbHRlckV4dGVuc2lvbnMpOwotCi0JCXNlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmdldFRhYmxlVmlld2VyKCkuc2V0RmlsdGVyRXh0ZW5zaW9ucyhmaWx0ZXJFeHRlbnNpb25zKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgewotCQl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VmlzaWJsZUhlbHBlcihib29sZWFuIGlzVmlzaWJsZSkgewotCQlzZWxlY3RTaW5nbGVGaWxlVmlldy5zZXRWaXNpYmxlSGVscGVyKGlzVmlzaWJsZSk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQ29tcGxldGlvblN0YXRlQ2hhbmdlKCkgewotCQlpZiAobGlzdGVuZXIgIT0gbnVsbCkgewotCQkJbGlzdGVuZXIuY29tcGxldGlvblN0YXRlQ2hhbmdlZCgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgd2lkZ2V0RGVmYXVsdFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCWlmIChlLndpZGdldCA9PSByYWRpb0J1dHRvblswXSkgewotCQkJcGFnZUJvb2suc2hvd1BhZ2Uoc2VsZWN0U2luZ2xlRmlsZVZpZXcuZ2V0Q29udHJvbCgpKTsKLQkJfSBlbHNlIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKHNlbGVjdFhNTENhdGFsb2dJZFBhbmVsKTsKLQkJfQotCQl1cGRhdGVDb21wbGV0aW9uU3RhdGVDaGFuZ2UoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9TZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZERpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmVhNDQzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZERpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LlNXVDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbC5YTUxDb21tb25VSUNvbnRleHRJZHM7Ci0KLQotCi0KLXB1YmxpYyBjbGFzcyBTZWxlY3RYTUxDYXRhbG9nSWREaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCXByb3RlY3RlZCBCdXR0b24gb2tCdXR0b247Ci0JcHJvdGVjdGVkIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIHBhbmVsOwotCXByb3RlY3RlZCBTdHJpbmcgcHVibGljSWQ7Ci0JcHJvdGVjdGVkIFN0cmluZyBzeXN0ZW1JZDsKLQotCXB1YmxpYyBTZWxlY3RYTUxDYXRhbG9nSWREaWFsb2coU2hlbGwgcGFyZW50U2hlbGwsIFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJc3VwZXIocGFyZW50U2hlbGwpOwotCQlzZXRTaGVsbFN0eWxlKGdldFNoZWxsU3R5bGUoKSB8IFNXVC5SRVNJWkUpOwotCQl0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJCU9iamVjdCBzZWxlY3RlZE9iamVjdCA9IChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgPyAoKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb24pLmdldEZpcnN0RWxlbWVudCgpIDogbnVsbDsKLQotCQkJaWYgKHNlbGVjdGVkT2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8gPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCQkJcHVibGljSWQgPSBtYXBwaW5nSW5mby5nZXRLZXkoKTsKLQkJCQlzeXN0ZW1JZCA9IGNvbXB1dGVEZWZhdWx0U3lzdGVtSWQobWFwcGluZ0luZm8pOwotCQkJfQotCQl9Ci0JCXN1cGVyLmJ1dHRvblByZXNzZWQoYnV0dG9uSWQpOwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZURlZmF1bHRTeXN0ZW1JZChJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvKSB7Ci0JCVN0cmluZyByZXN1bHQgPSBtYXBwaW5nSW5mby5nZXRBdHRyaWJ1dGVWYWx1ZShJQ2F0YWxvZ0VudHJ5LkFUVFJfV0VCX1VSTCk7Ci0JCWlmIChyZXN1bHQgPT0gbnVsbCAmJiBtYXBwaW5nSW5mby5nZXRVUkkoKSAhPSBudWxsKSB7Ci0JCQlpbnQgaW5kZXggPSBtYXBwaW5nSW5mby5nZXRVUkkoKS5sYXN0SW5kZXhPZigiLyIpOyAvLyROT04tTkxTLTEkCi0JCQlTdHJpbmcgbGFzdFNlZ21lbnQgPSBpbmRleCAhPSAtMSA/IG1hcHBpbmdJbmZvLmdldFVSSSgpLnN1YnN0cmluZyhpbmRleCArIDEpIDogbWFwcGluZ0luZm8uZ2V0VVJJKCk7Ci0JCQlyZXN1bHQgPSBsYXN0U2VnbWVudDsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUJ1dHRvbnNGb3JCdXR0b25CYXIoQ29tcG9zaXRlIHBhcmVudCkgewotCQlva0J1dHRvbiA9IGNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuT0tfSUQsIElEaWFsb2dDb25zdGFudHMuT0tfTEFCRUwsIHRydWUpOwotCQlva0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLQkJY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5DQU5DRUxfSUQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0xBQkVMLCBmYWxzZSk7Ci0JfQotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlRGlhbG9nQXJlYShDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBkaWFsb2dBcmVhID0gKENvbXBvc2l0ZSkgc3VwZXIuY3JlYXRlRGlhbG9nQXJlYShwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGRpYWxvZ0FyZWEsIFhNTENvbW1vblVJQ29udGV4dElkcy5YQ1VJX0NBVEFMT0dfRElBTE9HKTsKLQotCQlJQ2F0YWxvZyB4bWxDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJcGFuZWwgPSBuZXcgU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwoZGlhbG9nQXJlYSwgeG1sQ2F0YWxvZyk7Ci0KLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBJU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKCkgewotCQkJcHVibGljIHZvaWQgc2VsZWN0aW9uQ2hhbmdlZChTZWxlY3Rpb25DaGFuZ2VkRXZlbnQgZXZlbnQpIHsKLQkJCQl1cGRhdGVCdXR0b25TdGF0ZSgpOwotCQkJfQotCQl9OwotCQlwYW5lbC5nZXRUYWJsZVZpZXdlcigpLnNldEZpbHRlckV4dGVuc2lvbnMoZXh0ZW5zaW9ucyk7Ci0JCXBhbmVsLmdldFRhYmxlVmlld2VyKCkuYWRkU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyKGxpc3RlbmVyKTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0JCXJldHVybiBwdWJsaWNJZDsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFN5c3RlbUlkKCkgewotCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlQnV0dG9uU3RhdGUoKSB7Ci0JCUlTZWxlY3Rpb24gc2VsZWN0aW9uID0gcGFuZWwuZ2V0VGFibGVWaWV3ZXIoKS5nZXRTZWxlY3Rpb24oKTsKLQkJb2tCdXR0b24uc2V0RW5hYmxlZCghc2VsZWN0aW9uLmlzRW1wdHkoKSk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1NlbGVjdFhNTENhdGFsb2dJZFBhbmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwZWQ5YmQuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvU2VsZWN0WE1MQ2F0YWxvZ0lkUGFuZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklOZXh0Q2F0YWxvZzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIFNlbGVjdFhNTENhdGFsb2dJZFBhbmVsIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQlwcm90ZWN0ZWQgaW50IGNhdGFsb2dFbnRyeVR5cGU7Ci0JcHJvdGVjdGVkIGJvb2xlYW4gZG9UYWJsZVNpemVIYWNrID0gZmFsc2U7Ci0KLQlwcm90ZWN0ZWQgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIHRhYmxlVmlld2VyOwotCXByb3RlY3RlZCBJQ2F0YWxvZyBmWG1sQ2F0YWxvZzsKLQotCXB1YmxpYyBTZWxlY3RYTUxDYXRhbG9nSWRQYW5lbChDb21wb3NpdGUgcGFyZW50LCBJQ2F0YWxvZyB4bWxDYXRhbG9nKSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQl0aGlzLmZYbWxDYXRhbG9nID0geG1sQ2F0YWxvZzsKLQotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQl0aGlzLnNldExheW91dChncmlkTGF5b3V0KTsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKTsKLQkJZ2QuaGVpZ2h0SGludCA9IDIwMDsKLQkJZ2Qud2lkdGhIaW50ID0gNzAwOwotCQl0aGlzLnNldExheW91dERhdGEoZ2QpOwotCi0JCUxhYmVsIGxhYmVsID0gbmV3IExhYmVsKHRoaXMsIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9YTUxfQ0FUQUxPR19DT0xPTik7IC8vJE5PTi1OTFMtMSQKLQotCQl0YWJsZVZpZXdlciA9IGNyZWF0ZVRhYmxlVmlld2VyKHRoaXMpOwotCQl0YWJsZVZpZXdlci5nZXRDb250cm9sKCkuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KCJkdW1teSIpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIFhNTENhdGFsb2dUYWJsZVZpZXdlciBjcmVhdGVUYWJsZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVN0cmluZyBoZWFkaW5nc1tdID0gbmV3IFN0cmluZ1syXTsKLQkJaGVhZGluZ3NbMF0gPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9LRVk7IC8vJE5PTi1OTFMtMSQKLQkJaGVhZGluZ3NbMV0gPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9VUkk7IC8vJE5PTi1OTFMtMSQKLQotCQlYTUxDYXRhbG9nVGFibGVWaWV3ZXIgdGhlVGFibGVWaWV3ZXIgPSBuZXcgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyKHBhcmVudCwgaGVhZGluZ3MpIHsKLQotCQkJcHJvdGVjdGVkIHZvaWQgYWRkWE1MQ2F0YWxvZ0VudHJpZXMoTGlzdCBsaXN0LCBJQ2F0YWxvZ0VudHJ5W10gZW50cmllcykgewotCQkJCWZvciAoaW50IGk9MDsgaSA8IGVudHJpZXMubGVuZ3RoOyBpKyspIHsKLQkJCQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQkJCWlmIChjYXRhbG9nRW50cnlUeXBlID09IDApIHsKLQkJCQkJCWxpc3QuYWRkKGVudHJ5KTsKLQkJCQkJfSBlbHNlIGlmIChjYXRhbG9nRW50cnlUeXBlID09IGVudHJ5LmdldEVudHJ5VHlwZSgpKSB7Ci0JCQkJCQlsaXN0LmFkZChlbnRyeSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCXB1YmxpYyBDb2xsZWN0aW9uIGdldFhNTENhdGFsb2dFbnRyaWVzKCkgewotCQkJCUxpc3QgcmVzdWx0ID0gbnVsbDsKLQotCQkJCWlmIChmWG1sQ2F0YWxvZyA9PSBudWxsIHx8IGRvVGFibGVTaXplSGFjaykgewotCQkJCQkvLyB0aGlzIGxldHMgdXMgY3JlYXRlIGEgdGFibGUgd2l0aCBhbiBpbml0aWFsIGhlaWdodCBvZgotCQkJCQkvLyAxMCByb3dzCi0JCQkJCS8vIG90aGVyd2lzZSB3ZSBnZXQgc3R1Y2sgd2l0aCAwIHJvdyBoZWlnaCB0YWJsZS4uLiB0aGF0J3MKLQkJCQkJLy8gdG9vIHNtYWxsCi0JCQkJCWRvVGFibGVTaXplSGFjayA9IGZhbHNlOwotCQkJCQlyZXN1bHQgPSBuZXcgVmVjdG9yKCk7Ci0JCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0JCQkJCQlyZXN1bHQuYWRkKCIiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQl9Ci0JCQkJfSBlbHNlIHsKLQkJCQkJcmVzdWx0ID0gbmV3IFZlY3RvcigpOwotCQkJCQkgSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZlhtbENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0JCQkJICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5leHRDYXRhbG9ncy5sZW5ndGg7IGkrKykKLQkJCQkgICAgICAgIHsKLQkJCQkgICAgICAgICAgICBJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLQkJCQkgICAgICAgICAgICBJQ2F0YWxvZyByZWZlcmVuY2VkQ2F0YWxvZyA9IGNhdGFsb2cuZ2V0UmVmZXJlbmNlZENhdGFsb2coKTsKLQkJCQkgICAgICAgICAgICBpZiAocmVmZXJlbmNlZENhdGFsb2cgIT0gbnVsbCkKLQkJCQkgICAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgICAgIGlmIChYTUxDb3JlUGx1Z2luLlNZU1RFTV9DQVRBTE9HX0lECi0JCQkJICAgICAgICAgICAgICAgICAgICAgICAgLmVxdWFscyhyZWZlcmVuY2VkQ2F0YWxvZy5nZXRJZCgpKSkKLQkJCQkgICAgICAgICAgICAgICAgewotCQkJCSAgICAgICAgICAgICAgICAgICAgSUNhdGFsb2cgc3lzdGVtQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCSAgICAgICAgICAgICAgICAgICAgYWRkWE1MQ2F0YWxvZ0VudHJpZXMocmVzdWx0LCBzeXN0ZW1DYXRhbG9nLmdldENhdGFsb2dFbnRyaWVzKCkpOwotCQkJCSAgICAgICAgICAgICAgICAgICAgCi0JCQkJICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoWE1MQ29yZVBsdWdpbi5VU0VSX0NBVEFMT0dfSUQKLQkJCQkgICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKQotCQkJCSAgICAgICAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgICAgIAlJQ2F0YWxvZyB1c2VyQ2F0YWxvZyA9IHJlZmVyZW5jZWRDYXRhbG9nOwotCQkJCSAgICAgICAgICAgICAgICAgICAgYWRkWE1MQ2F0YWxvZ0VudHJpZXMocmVzdWx0LCB1c2VyQ2F0YWxvZy5nZXRDYXRhbG9nRW50cmllcygpKTsKLQkJCQkgICAJCQkJIAotCQkJCSAgICAgICAgICAgICAgICB9Ci0JCQkJICAgICAgICAgICAgfQotCQkJCSAgICAgICAgfQotCQkJCX0KLQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJfQotCQl9OwotCQlyZXR1cm4gdGhlVGFibGVWaWV3ZXI7Ci0JfQotCi0KLQlwdWJsaWMgU3RyaW5nIGdldElkKCkgewotCQlJQ2F0YWxvZ0VudHJ5IGVudHJ5ID0gZ2V0WE1MQ2F0YWxvZ0VudHJ5KCk7Ci0JCXJldHVybiBlbnRyeSAhPSBudWxsID8gZW50cnkuZ2V0S2V5KCkgOiBudWxsOwotCX0KLQotCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXIgZ2V0VGFibGVWaWV3ZXIoKSB7Ci0JCXJldHVybiB0YWJsZVZpZXdlcjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFVSSSgpIHsKLQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGdldFhNTENhdGFsb2dFbnRyeSgpOwotCQlyZXR1cm4gZW50cnkgIT0gbnVsbCA/IGVudHJ5LmdldFVSSSgpIDogbnVsbDsKLQl9Ci0KLQlwdWJsaWMgSUNhdGFsb2dFbnRyeSBnZXRYTUxDYXRhbG9nRW50cnkoKSB7Ci0JCUlDYXRhbG9nRW50cnkgcmVzdWx0ID0gbnVsbDsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJT2JqZWN0IHNlbGVjdGVkT2JqZWN0ID0gKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSA/ICgoSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHNlbGVjdGlvbikuZ2V0Rmlyc3RFbGVtZW50KCkgOiBudWxsOwotCQlpZiAoc2VsZWN0ZWRPYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQlyZXN1bHQgPSAoSUNhdGFsb2dFbnRyeSkgc2VsZWN0ZWRPYmplY3Q7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRDYXRhbG9nRW50cnlUeXBlKGludCBjYXRhbG9nRW50cnlUeXBlKSB7Ci0JCXRoaXMuY2F0YWxvZ0VudHJ5VHlwZSA9IGNhdGFsb2dFbnRyeVR5cGU7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9VcGRhdGVMaXN0ZW5lci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RpYWxvZ3MvVXBkYXRlTGlzdGVuZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc5NzBjZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9VcGRhdGVMaXN0ZW5lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzOwotCi1wdWJsaWMgaW50ZXJmYWNlIFVwZGF0ZUxpc3RlbmVyIHsKLQotCXB1YmxpYyB2b2lkIHVwZGF0ZU9jY3VyZWQoT2JqZWN0IG9iamVjdCwgT2JqZWN0IGFyZyk7Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZGlhbG9ncy9YTUxDYXRhbG9nVGFibGVWaWV3ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODBlNDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kaWFsb2dzL1hNTENhdGFsb2dUYWJsZVZpZXdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9nczsKLQotaW1wb3J0IGNvbS5pYm0uaWN1LnRleHQuQ29sbGF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5BY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlckZpbHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5JbWFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGFibGVDb2x1bW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC51dGlsLlVSSUhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY2F0YWxvZy5wcm92aXNpb25hbC5JQ2F0YWxvZ0VudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZWRpdG9yLlhNTEVkaXRvclBsdWdpbkltYWdlczsKLQotCi1wdWJsaWMgY2xhc3MgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyIGV4dGVuZHMgVGFibGVWaWV3ZXIgewotCi0KLQlwdWJsaWMgY2xhc3MgQ2F0YWxvZ0VudHJ5Q29udGVudFByb3ZpZGVyIGltcGxlbWVudHMgSVN0cnVjdHVyZWRDb250ZW50UHJvdmlkZXIgewotCi0JCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0W10gZ2V0RWxlbWVudHMoT2JqZWN0IGVsZW1lbnQpIHsKLQkJCU9iamVjdFtdIGFycmF5ID0gZ2V0WE1MQ2F0YWxvZ0VudHJpZXMoKS50b0FycmF5KCk7Ci0JCQlDb21wYXJhdG9yIGNvbXBhcmF0b3IgPSBuZXcgQ29tcGFyYXRvcigpIHsKLQkJCQlwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLQkJCQkJaW50IHJlc3VsdCA9IDA7Ci0JCQkJCWlmIChvMSBpbnN0YW5jZW9mIElDYXRhbG9nRW50cnkgJiYgbzIgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJCQlJQ2F0YWxvZ0VudHJ5IG1hcHBpbmdJbmZvMSA9IChJQ2F0YWxvZ0VudHJ5KSBvMTsKLQkJCQkJCUlDYXRhbG9nRW50cnkgbWFwcGluZ0luZm8yID0gKElDYXRhbG9nRW50cnkpIG8yOwotCQkJCQkJcmVzdWx0ID0gQ29sbGF0b3IuZ2V0SW5zdGFuY2UoKS5jb21wYXJlKG1hcHBpbmdJbmZvMS5nZXRLZXkoKSwgbWFwcGluZ0luZm8yLmdldEtleSgpKTsKLQkJCQkJfQotCQkJCQlyZXR1cm4gcmVzdWx0OwotCQkJCX0KLQkJCX07Ci0JCQlBcnJheXMuc29ydChhcnJheSwgY29tcGFyYXRvcik7Ci0JCQlyZXR1cm4gYXJyYXk7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBpbnB1dENoYW5nZWQoVmlld2VyIHZpZXdlciwgT2JqZWN0IG9sZCwgT2JqZWN0IG5ld29iaikgewotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gaXNEZWxldGVkKE9iamVjdCBvYmplY3QpIHsKLQkJCXJldHVybiBmYWxzZTsKLQkJfQotCX0KLQotCXB1YmxpYyBjbGFzcyBDYXRhbG9nRW50cnlMYWJlbFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIgewotCi0JCXB1YmxpYyBJbWFnZSBnZXRDb2x1bW5JbWFnZShPYmplY3Qgb2JqZWN0LCBpbnQgY29sdW1uSW5kZXgpIHsKLQkJCUltYWdlIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAoY29sdW1uSW5kZXggPT0gMCkgewotCQkJCUltYWdlIGJhc2UgPSBudWxsOwotCQkJCWlmIChvYmplY3QgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQkJU3RyaW5nIHVyaSA9IGNhdGFsb2dFbnRyeS5nZXRVUkkoKTsKLQkJCQkJaWYgKHVyaS5lbmRzV2l0aCgiZHRkIikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCQkJYmFzZSA9IGR0ZEZpbGVJbWFnZTsKLQkJCQkJfSBlbHNlIGlmICh1cmkuZW5kc1dpdGgoInhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJhc2UgPSB4c2RGaWxlSW1hZ2U7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQliYXNlID0gdW5rbm93bkZpbGVJbWFnZTsKLQkJCQkJfQotCi0JCQkJCWlmIChiYXNlICE9IG51bGwpIHsKLQkJCQkJCWlmIChVUklIZWxwZXIuaXNSZWFkYWJsZVVSSSh1cmksIGZhbHNlKSkgewotCQkJCQkJCXJlc3VsdCA9IGJhc2U7Ci0JCQkJCQl9IGVsc2UgewotCQkJCQkJCS8vVE9ETy4uLiBTU0UgcG9ydAotCQkJCQkJCXJlc3VsdCA9IGJhc2U7Ly9pbWFnZUZhY3RvcnkuY3JlYXRlQ29tcG9zaXRlSW1hZ2UoYmFzZSwKLQkJCQkJCQkvLyBlcnJvckltYWdlLAotCQkJCQkJCS8vIEltYWdlRmFjdG9yeS5CT1RUT01fTEVGVCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW5JbmRleCkgewotCQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0JCQlpZiAob2JqZWN0IGluc3RhbmNlb2YgSUNhdGFsb2dFbnRyeSkgewotCQkJCUlDYXRhbG9nRW50cnkgY2F0YWxvZ0VudHJ5ID0gKElDYXRhbG9nRW50cnkpIG9iamVjdDsKLQkJCQlyZXN1bHQgPSBjb2x1bW5JbmRleCA9PSAwID8gY2F0YWxvZ0VudHJ5LmdldEtleSgpIDogY2F0YWxvZ0VudHJ5LmdldFVSSSgpOwotCQkJCXJlc3VsdCA9IFVSSUhlbHBlci5yZW1vdmVQbGF0Zm9ybVJlc291cmNlUHJvdG9jb2wocmVzdWx0KTsKLQkJCX0KLQkJCXJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6ICIiOyAvLyROT04tTkxTLTEkCi0JCX0KLQl9Ci0KLQotCWNsYXNzIFhNTENhdGFsb2dUYWJsZVZpZXdlckZpbHRlciBleHRlbmRzIFZpZXdlckZpbHRlciB7Ci0JCXByb3RlY3RlZCBTdHJpbmdbXSBleHRlbnNpb25zOwotCi0JCXB1YmxpYyBYTUxDYXRhbG9nVGFibGVWaWV3ZXJGaWx0ZXIoU3RyaW5nW10gZXh0ZW5zaW9ucykgewotCQkJdGhpcy5leHRlbnNpb25zID0gZXh0ZW5zaW9uczsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzRmlsdGVyUHJvcGVydHkoT2JqZWN0IGVsZW1lbnQsIE9iamVjdCBwcm9wZXJ0eSkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIGJvb2xlYW4gc2VsZWN0KFZpZXdlciB2aWV3ZXIsIE9iamVjdCBwYXJlbnQsIE9iamVjdCBlbGVtZW50KSB7Ci0JCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQkJaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBJQ2F0YWxvZ0VudHJ5KSB7Ci0JCQkJSUNhdGFsb2dFbnRyeSBjYXRhbG9nRW50cnkgPSAoSUNhdGFsb2dFbnRyeSkgZWxlbWVudDsKLQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNhdGFsb2dFbnRyeS5nZXRVUkkoKS5lbmRzV2l0aChleHRlbnNpb25zW2ldKSkgewotCQkJCQkJcmVzdWx0ID0gdHJ1ZTsKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZHRkRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9EVERGSUxFKTsKLQotCXByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIEVSUk9SX1NUQVRFX0tFWSA9ICJlcnJvcnN0YXRla2V5IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgZXJyb3JJbWFnZSA9IFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PVlJfRVJST1IpOwotCi0JcHJvdGVjdGVkIHN0YXRpYyBJbWFnZSB1bmtub3duRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UWFRFWFQpOwotCXByb3RlY3RlZCBzdGF0aWMgSW1hZ2UgeHNkRmlsZUltYWdlID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9YU0RGSUxFKTsKLQotCS8vcHJvdGVjdGVkIEltYWdlRmFjdG9yeSBpbWFnZUZhY3RvcnkgPSBuZXcgSW1hZ2VGYWN0b3J5KCk7Ci0KLQlwdWJsaWMgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyKENvbXBvc2l0ZSBwYXJlbnQsIFN0cmluZ1tdIGNvbHVtblByb3BlcnRpZXMpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04pOwotCi0JCVRhYmxlIHRhYmxlID0gZ2V0VGFibGUoKTsKLQkJdGFibGUuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRIZWFkZXJWaXNpYmxlKHRydWUpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUodHJ1ZSk7Ci0KLQkJVGFibGVMYXlvdXQgbGF5b3V0ID0gbmV3IFRhYmxlTGF5b3V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllcy5sZW5ndGg7IGkrKykgewotCQkJVGFibGVDb2x1bW4gY29sdW1uID0gbmV3IFRhYmxlQ29sdW1uKHRhYmxlLCBpKTsKLQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNbaV0pOwotCQkJY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YSg1MCwgdHJ1ZSkpOwotCQl9Ci0JCXRhYmxlLnNldExheW91dChsYXlvdXQpOwotCQl0YWJsZS5zZXRMaW5lc1Zpc2libGUoZmFsc2UpOwotCi0JCXNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllcyk7Ci0KLQkJc2V0Q29udGVudFByb3ZpZGVyKG5ldyBDYXRhbG9nRW50cnlDb250ZW50UHJvdmlkZXIoKSk7Ci0JCXNldExhYmVsUHJvdmlkZXIobmV3IENhdGFsb2dFbnRyeUxhYmVsUHJvdmlkZXIoKSk7Ci0JfQotCi0JcHVibGljIENvbGxlY3Rpb24gZ2V0WE1MQ2F0YWxvZ0VudHJpZXMoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCi0JcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtZW51TWFuYWdlcikgewotCQlBY3Rpb24gYWN0aW9uID0gbmV3IEFjdGlvbigiaGVsbG8iKSB7IC8vJE5PTi1OTFMtMSQKLQkJCXB1YmxpYyB2b2lkIHJ1bigpIHsKLQkJCQlTeXN0ZW0ub3V0LnByaW50bG4oInJ1biEiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQl9OwotCQltZW51TWFuYWdlci5hZGQoYWN0aW9uKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXRGaWx0ZXJFeHRlbnNpb25zKFN0cmluZ1tdIGV4dGVuc2lvbnMpIHsKLQkJcmVzZXRGaWx0ZXJzKCk7Ci0JCWFkZEZpbHRlcihuZXcgWE1MQ2F0YWxvZ1RhYmxlVmlld2VyRmlsdGVyKGV4dGVuc2lvbnMpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL0RyYWdOb2RlQ29tbWFuZC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9EcmFnTm9kZUNvbW1hbmQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0MzkxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL0RyYWdOb2RlQ29tbWFuZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5kbmQuRE5EOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIERyYWdOb2RlQ29tbWFuZCBleHRlbmRzIERlZmF1bHREcmFnQW5kRHJvcENvbW1hbmQgewotCXByaXZhdGUgTGlzdCBmU2VsZWN0aW9uczsKLQlwcml2YXRlIFRyZWVWaWV3ZXIgZlRyZWVWaWV3ZXI7Ci0JCi0JcHVibGljIERyYWdOb2RlQ29tbWFuZChPYmplY3QgdGFyZ2V0LCBmbG9hdCBsb2NhdGlvbiwgaW50IG9wZXJhdGlvbnMsIGludCBvcGVyYXRpb24sIENvbGxlY3Rpb24gc291cmNlcywgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCXN1cGVyKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlcyk7Ci0JCWZUcmVlVmlld2VyID0gdHJlZVZpZXdlcjsKLQkJZlNlbGVjdGlvbnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGJlZ2luTW9kZWxDaGFuZ2UoTm9kZSBub2RlLCBib29sZWFuIGJhdGNoVXBkYXRlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgc3RydWN0dXJlZE1vZGVsID0gZ2V0U3RydWN0dXJlZE1vZGVsKG5vZGUpOwotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCVN0cmluZyB1bmRvRGVzYyA9IG5ldyBTdHJpbmcoKTsKLQkJCWlmIChnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9NT1ZFKSB7Ci0JCQkJdW5kb0Rlc2MgPSBYTUxVSU1lc3NhZ2VzLkRyYWdOb2RlQ29tbWFuZF8wOwotCQkJfSBlbHNlIGlmIChnZXRPcGVyYXRpb24oKSA9PSBETkQuRFJPUF9DT1BZKSB7Ci0JCQkJdW5kb0Rlc2MgPSBYTUxVSU1lc3NhZ2VzLkRyYWdOb2RlQ29tbWFuZF8xOwotCQkJfQotCQkJCi0JCQlzdHJ1Y3R1cmVkTW9kZWwuYmVnaW5SZWNvcmRpbmcodGhpcywgdW5kb0Rlc2MpOwotCQkJaWYgKGJhdGNoVXBkYXRlKSB7Ci0JCQkJLy8gIHN0cnVjdHVyZWRNb2RlbC5hYm91dFRvQ2hhbmdlTW9kZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyBib29sZWFuIGNhbkV4ZWN1dGUoKSB7Ci0JCXJldHVybiBleGVjdXRlSGVscGVyKHRydWUpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBkb01vZGlmeShOb2RlIHNvdXJjZSwgTm9kZSBwYXJlbnROb2RlLCBOb2RlIHJlZkNoaWxkLCBib29sZWFuIHRlc3RPbmx5KSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWlmIChzb3VyY2UuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKSB7Ci0JCQlBdHRyIHNvdXJjZUF0dHJpYnV0ZSA9IChBdHRyKSBzb3VyY2U7Ci0JCQlFbGVtZW50IHNvdXJjZUF0dHJpYnV0ZU93bmVyRWxlbWVudCA9IHNvdXJjZUF0dHJpYnV0ZS5nZXRPd25lckVsZW1lbnQoKTsKLQkJCWlmIChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgc291cmNlQXR0cmlidXRlT3duZXJFbGVtZW50ICE9IHBhcmVudE5vZGUpIHsKLQkJCQlyZXN1bHQgPSB0cnVlOwotCQkJCWlmICghdGVzdE9ubHkpIHsKLQkJCQkJdHJ5IHsKLQkJCQkJCWlmKGdldE9wZXJhdGlvbigpID09IERORC5EUk9QX01PVkUpIHsKLQkJCQkJCQlFbGVtZW50IHRhcmdldEVsZW1lbnQgPSAoRWxlbWVudCkgcGFyZW50Tm9kZTsKLQkJCQkJCQlzb3VyY2VBdHRyaWJ1dGVPd25lckVsZW1lbnQucmVtb3ZlQXR0cmlidXRlTm9kZShzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJCXRhcmdldEVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLnNldE5hbWVkSXRlbShzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJCWZTZWxlY3Rpb25zLmFkZChzb3VyY2VBdHRyaWJ1dGUpOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoZ2V0T3BlcmF0aW9uKCkgPT0gRE5ELkRST1BfQ09QWSkgewotCQkJCQkJCUF0dHIgY2xvbmVBdHRyaWJ1dGUgPSAoQXR0cikgc291cmNlQXR0cmlidXRlLmNsb25lTm9kZShmYWxzZSk7CQkJCQkJCi0JCQkJCQkJRWxlbWVudCB0YXJnZXRFbGVtZW50ID0gKEVsZW1lbnQpIHBhcmVudE5vZGU7Ci0JCQkJCQkJdGFyZ2V0RWxlbWVudC5nZXRBdHRyaWJ1dGVzKCkuc2V0TmFtZWRJdGVtKGNsb25lQXR0cmlidXRlKTsKLQkJCQkJCQlmU2VsZWN0aW9ucy5hZGQoY2xvbmVBdHRyaWJ1dGUpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0JCWVsc2UgewotCQkJaWYgKChwYXJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgfHwgcGFyZW50Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRE9DVU1FTlRfTk9ERSkgJiYgCi0JCQkJIShyZWZDaGlsZCBpbnN0YW5jZW9mIEF0dHIpKSB7Ci0JCQkJcmVzdWx0ID0gdHJ1ZTsKLQotCQkJCWlmICghdGVzdE9ubHkpIHsKLQkJCQkJaWYgKGlzQW5jZXN0b3Ioc291cmNlLCBwYXJlbnROb2RlKSkgewotCQkJCQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oImNhbiBub3QgcGVyZm9ybSB0aGlzIGRyYWcgZHJvcCBvcGVyYXRpb24uLi4uIHRvZG8uLi4gcG9wIHVwIGRpYWxvZyIpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gZGVmZWN0IDIyMTA1NSB0aGlzIHRlc3QgaXMgcmVxdWlyZWQgb3IgZWxzZSB0aGUgbm9kZSB3aWxsCi0JCQkJCQkvLyBiZSByZW1vdmVkIGZyb20gdGhlIHRyZWUgYW5kIHRoZSBpbnNlcnQgd2lsbCBmYWlsCi0JCQkJCQlpZiAoc291cmNlICE9IHJlZkNoaWxkKSB7Ci0JCQkJCQkJaWYoZ2V0T3BlcmF0aW9uKCkgPT0gRE5ELkRST1BfTU9WRSkgewotCQkJCQkJCQlzb3VyY2UuZ2V0UGFyZW50Tm9kZSgpLnJlbW92ZUNoaWxkKHNvdXJjZSk7Ci0JCQkJCQkJCXBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHNvdXJjZSwgcmVmQ2hpbGQpOwotCQkJCQkJCQlmU2VsZWN0aW9ucy5hZGQoc291cmNlKTsKLQkJCQkJCQl9Ci0JCQkJCQkJZWxzZSBpZiAoZ2V0T3BlcmF0aW9uKCkgPT0gRE5ELkRST1BfQ09QWSkgewotCQkJCQkJCQlOb2RlIG5vZGVDbG9uZSA9IHNvdXJjZS5jbG9uZU5vZGUodHJ1ZSk7Ci0JCQkJCQkJCXBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGVDbG9uZSwgcmVmQ2hpbGQpOwotCQkJCQkJCQlmU2VsZWN0aW9ucy5hZGQobm9kZUNsb25lKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0JCi0JcHJpdmF0ZSB2b2lkIGVuZE1vZGVsQ2hhbmdlKE5vZGUgbm9kZSwgYm9vbGVhbiBiYXRjaFVwZGF0ZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCA9IGdldFN0cnVjdHVyZWRNb2RlbChub2RlKTsKLQkJaWYgKHN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKSB7Ci0JCQlzdHJ1Y3R1cmVkTW9kZWwuZW5kUmVjb3JkaW5nKHRoaXMpOwotCQkJaWYgKGJhdGNoVXBkYXRlKSB7Ci0JCQkJLy8gIHN0cnVjdHVyZWRNb2RlbC5jaGFuZ2VkTW9kZWwoKTsKLQkJCX0KLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7Ci0JCWV4ZWN1dGVIZWxwZXIoZmFsc2UpOwotCQkKLQkJLy8gTWFrZSBvdXIgc2VsZWN0aW9uIGlmIHRoZSB0cmVlVmlld2VyICE9IG51bGwKLQkJaWYgKGZUcmVlVmlld2VyICE9IG51bGwpIHsKLQkJCVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbGVjdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkU2VsZWN0aW9uKGZTZWxlY3Rpb25zKTsKLQkJCWZUcmVlVmlld2VyLnNldFNlbGVjdGlvbihzdHJ1Y3R1cmVkU2VsZWN0aW9uKTsKLQkJfQotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBleGVjdXRlSGVscGVyKGJvb2xlYW4gdGVzdE9ubHkpIHsKLQkJYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCQlpZiAodGFyZ2V0IGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSB0YXJnZXROb2RlID0gKE5vZGUpIHRhcmdldDsKLQkJCU5vZGUgcGFyZW50Tm9kZSA9IGdldFBhcmVudEZvckRyb3BQb3NpdGlvbih0YXJnZXROb2RlKTsKLQkJCU5vZGUgcmVmQ2hpbGQgPSBnZXRSZWZDaGlsZCh0YXJnZXROb2RlKTsKLQotCQkJVmVjdG9yIHNvdXJjZXNMaXN0ID0gbmV3IFZlY3RvcigpOwotCQkJc291cmNlc0xpc3QuYWRkQWxsKHNvdXJjZXMpOwotCi0JCQlyZW1vdmVNZW1iZXJEZXNjZW5kYW50cyhzb3VyY2VzTGlzdCk7Ci0JCQlib29sZWFuIHBlcmZvcm1CYXRjaFVwZGF0ZSA9IHNvdXJjZXNMaXN0LnNpemUoKSA+IDU7Ci0KLQkJCWlmICghdGVzdE9ubHkpIHsKLQkJCQliZWdpbk1vZGVsQ2hhbmdlKHRhcmdldE5vZGUsIHBlcmZvcm1CYXRjaFVwZGF0ZSk7Ci0JCQl9Ci0JCQlmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VzTGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCQlPYmplY3Qgc291cmNlID0gaS5uZXh0KCk7Ci0JCQkJaWYgKHNvdXJjZSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJaWYgKCEocmVmQ2hpbGQgPT0gbnVsbCAmJiB0YXJnZXROb2RlIGluc3RhbmNlb2YgQXR0cikpIHsKLQkJCQkJCXJlc3VsdCA9IGRvTW9kaWZ5KChOb2RlKSBzb3VyY2UsIHBhcmVudE5vZGUsIHJlZkNoaWxkLCB0ZXN0T25seSk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQlyZXN1bHQgPSBmYWxzZTsKLQkJCQkJfQotCQkJCQlpZiAoIXJlc3VsdCkgewotCQkJCQkJYnJlYWs7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlpZiAoIXRlc3RPbmx5KSB7Ci0JCQkJZW5kTW9kZWxDaGFuZ2UodGFyZ2V0Tm9kZSwgcGVyZm9ybUJhdGNoVXBkYXRlKTsKLQkJCX0KLQkJfSBlbHNlIHsKLQkJCXJlc3VsdCA9IGZhbHNlOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0KLQlwdWJsaWMgaW50IGdldEZlZWRiYWNrKCkgewotCQlpbnQgcmVzdWx0ID0gRE5ELkZFRURCQUNLX1NFTEVDVDsKLQkJaWYgKGxvY2F0aW9uID4gMC43NSkgewotCQkJcmVzdWx0ID0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUjsKLQkJfSBlbHNlIGlmIChsb2NhdGlvbiA8IDAuMjUpIHsKLQkJCXJlc3VsdCA9IERORC5GRUVEQkFDS19JTlNFUlRfQkVGT1JFOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBOb2RlIGdldFBhcmVudEZvckRyb3BQb3NpdGlvbihOb2RlIG5vZGUpIHsKLQkJTm9kZSByZXN1bHQgPSBudWxsOwotCi0JCWludCBmZWVkYmFjayA9IGdldEZlZWRiYWNrKCk7Ci0JCWlmIChmZWVkYmFjayA9PSBETkQuRkVFREJBQ0tfU0VMRUNUKSB7Ci0JCQlyZXN1bHQgPSBub2RlOwotCQl9IGVsc2UgewotCQkJcmVzdWx0ID0gZ2V0UGFyZW50T3JPd25lcihub2RlKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCi0JcHJpdmF0ZSBOb2RlIGdldFBhcmVudE9yT3duZXIoTm9kZSBub2RlKSB7Ci0JCXJldHVybiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuQVRUUklCVVRFX05PREUpID8gKChBdHRyKSBub2RlKS5nZXRPd25lckVsZW1lbnQoKSA6IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCX0KLQotCi0JcHJpdmF0ZSBOb2RlIGdldFJlZkNoaWxkKE5vZGUgbm9kZSkgewotCQlOb2RlIHJlc3VsdCA9IG51bGw7Ci0KLQkJaW50IGZlZWRiYWNrID0gZ2V0RmVlZGJhY2soKTsKLQotCQlpZiAoZmVlZGJhY2sgPT0gRE5ELkZFRURCQUNLX0lOU0VSVF9CRUZPUkUpIHsKLQkJCXJlc3VsdCA9IG5vZGU7Ci0JCX0gZWxzZSBpZiAoZmVlZGJhY2sgPT0gRE5ELkZFRURCQUNLX0lOU0VSVF9BRlRFUikgewotCQkJcmVzdWx0ID0gbm9kZS5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJpdmF0ZSBJU3RydWN0dXJlZE1vZGVsIGdldFN0cnVjdHVyZWRNb2RlbCAoTm9kZSBub2RlKSB7Ci0JCUlTdHJ1Y3R1cmVkTW9kZWwgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkgewotCQkJcmVzdWx0ID0gKChJRE9NTm9kZSkgbm9kZSkuZ2V0TW9kZWwoKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8vIHJldHVybnMgdHJ1ZSBpZiBhIGlzIGFuIGFuY2VzdG9yZSBvZiBiCi0JLy8KLQlwcml2YXRlIGJvb2xlYW4gaXNBbmNlc3RvcihOb2RlIGEsIE5vZGUgYikgewotCQlib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotCQlmb3IgKE5vZGUgcGFyZW50ID0gYjsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IHBhcmVudC5nZXRQYXJlbnROb2RlKCkpIHsKLQkJCWlmIChwYXJlbnQgPT0gYSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHJlbW92ZXMgbWVtYmVycyBvZiB0aGUgbGlzdCB0aGF0IGhhdmUgYW5jZXN0b3JzIHRoYXQgYXJlCi0JICogYWxzbyBtZW1iZXJzIG9mIHRoZSBsaXN0LgotCSAqLwotCXByaXZhdGUgdm9pZCByZW1vdmVNZW1iZXJEZXNjZW5kYW50cyhMaXN0IGxpc3QpIHsKLQkJSGFzaHRhYmxlIHRhYmxlID0gbmV3IEhhc2h0YWJsZSgpOwotCQlmb3IgKEl0ZXJhdG9yIGkgPSBsaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJT2JqZWN0IG5vZGUgPSBpLm5leHQoKTsKLQkJCXRhYmxlLnB1dChub2RlLCBub2RlKTsKLQkJfQotCi0JCWZvciAoaW50IGkgPSBsaXN0LnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgbGlzdC5nZXQoaSk7Ci0JCQlmb3IgKE5vZGUgcGFyZW50ID0gZ2V0UGFyZW50T3JPd25lcihub2RlKTsgcGFyZW50ICE9IG51bGw7IHBhcmVudCA9IGdldFBhcmVudE9yT3duZXIocGFyZW50KSkgewotCQkJCWlmICh0YWJsZS5nZXQocGFyZW50KSAhPSBudWxsKSB7Ci0JCQkJCWxpc3QucmVtb3ZlKGkpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL1hNTERyYWdBbmREcm9wTWFuYWdlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2RuZC9YTUxEcmFnQW5kRHJvcE1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNhNmVlNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG5kL1hNTERyYWdBbmREcm9wTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kbmQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLkRORDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZG5kLlRyYW5zZmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udWkuaW50ZXJuYWwuZG5kLkRyYWdBbmREcm9wQ29tbWFuZDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5EcmFnQW5kRHJvcE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuT2JqZWN0VHJhbnNmZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuVmlld2VyRHJhZ0FkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51aS5pbnRlcm5hbC5kbmQuVmlld2VyRHJvcEFkYXB0ZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFhNTERyYWdBbmREcm9wTWFuYWdlciBpbXBsZW1lbnRzIERyYWdBbmREcm9wTWFuYWdlciB7Ci0JcHJpdmF0ZSBUcmVlVmlld2VyIGZWaWV3ZXI7Ci0JCi0JcHVibGljIHN0YXRpYyB2b2lkIGFkZERyYWdBbmREcm9wU3VwcG9ydChUcmVlVmlld2VyIHZpZXdlcikgewotCQlpbnQgZG5kT3BlcmF0aW9ucyA9IERORC5EUk9QX0NPUFkgfCBETkQuRFJPUF9NT1ZFIHwgRE5ELkRST1BfTElOSzsKLQkJVHJhbnNmZXJbXSB0cmFuc2ZlcnMgPSBuZXcgVHJhbnNmZXJbXXtPYmplY3RUcmFuc2Zlci5nZXRJbnN0YW5jZSgpfTsKLQkJdmlld2VyLmFkZERyYWdTdXBwb3J0KGRuZE9wZXJhdGlvbnMsIHRyYW5zZmVycywgbmV3IFZpZXdlckRyYWdBZGFwdGVyKHZpZXdlcikpOwotCQl2aWV3ZXIuYWRkRHJvcFN1cHBvcnQoZG5kT3BlcmF0aW9ucywgdHJhbnNmZXJzLCBuZXcgVmlld2VyRHJvcEFkYXB0ZXIodmlld2VyLCBuZXcgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyKHZpZXdlcikpKTsKLQl9Ci0KLQlwdWJsaWMgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyKCkgewotCQlzdXBlcigpOwotCX0KLQkKLQlwdWJsaWMgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JfQotCi0JcHVibGljIERyYWdBbmREcm9wQ29tbWFuZCBjcmVhdGVDb21tYW5kKE9iamVjdCB0YXJnZXQsIGZsb2F0IGxvY2F0aW9uLCBpbnQgb3BlcmF0aW9ucywgaW50IG9wZXJhdGlvbiwgQ29sbGVjdGlvbiBzb3VyY2UpIHsKLQkJRHJhZ0FuZERyb3BDb21tYW5kIHJlc3VsdCA9IG51bGw7Ci0JCWlmICh0YXJnZXQgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXN1bHQgPSBuZXcgRHJhZ05vZGVDb21tYW5kKHRhcmdldCwgbG9jYXRpb24sIG9wZXJhdGlvbnMsIG9wZXJhdGlvbiwgc291cmNlLCBmVmlld2VyKTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YTUxEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZG91YmxlY2xpY2svWE1MRG91YmxlQ2xpY2tTdHJhdGVneS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGY3NTYwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9kb3VibGVjbGljay9YTUxEb3VibGVDbGlja1N0cmF0ZWd5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyODUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRvdWJsZWNsaWNrOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5EZWZhdWx0VGV4dERvdWJsZUNsaWNrU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLlN0cnVjdHVyZWRNb2RlbE1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklTdHJ1Y3R1cmVkTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi1wdWJsaWMgY2xhc3MgWE1MRG91YmxlQ2xpY2tTdHJhdGVneSBleHRlbmRzIERlZmF1bHRUZXh0RG91YmxlQ2xpY2tTdHJhdGVneSB7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIERPVUJMRV9RVU9URSA9ICdcIic7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNJTkdMRV9RVU9URSA9ICdcJyc7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjaGFyIFNQQUNFID0gJyAnOwotCXByb3RlY3RlZCBpbnQgZkNhcmV0UG9zaXRpb24gPSAtMTsKLQlwcm90ZWN0ZWQgaW50IGZEb3VibGVDbGlja0NvdW50ID0gMDsKLQlwcm90ZWN0ZWQgTm9kZSBmTm9kZSA9IG51bGw7Ci0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cmluZyBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIElTdHJ1Y3R1cmVkTW9kZWwgZlN0cnVjdHVyZWRNb2RlbCA9IG51bGw7Ci0JcHJvdGVjdGVkIFN0cnVjdHVyZWRUZXh0Vmlld2VyIGZTdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLQlwcm90ZWN0ZWQgSVRleHRSZWdpb24gZlRleHRSZWdpb24gPSBudWxsOwotCi0JcHVibGljIHZvaWQgZG91YmxlQ2xpY2tlZChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyKSB7Ci0JCWlmICh0ZXh0Vmlld2VyIGluc3RhbmNlb2YgU3RydWN0dXJlZFRleHRWaWV3ZXIpIHsKLQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlciA9IChTdHJ1Y3R1cmVkVGV4dFZpZXdlcikgdGV4dFZpZXdlcjsKLQkJCXRyeSB7Ci0JCQkJZlN0cnVjdHVyZWRNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZlN0cnVjdHVyZWRUZXh0Vmlld2VyLmdldERvY3VtZW50KCkpOwotCi0JCQkJaWYgKGZTdHJ1Y3R1cmVkTW9kZWwgIT0gbnVsbCkgewotCQkJCQlpbnQgY2FyZXRQb3NpdGlvbiA9IHRleHRWaWV3ZXIuZ2V0U2VsZWN0ZWRSYW5nZSgpLng7Ci0JCQkJCWlmIChjYXJldFBvc2l0aW9uIDwgMCkKLQkJCQkJCXJldHVybjsKLQotCQkJCQlmTm9kZSA9IChOb2RlKSBmU3RydWN0dXJlZE1vZGVsLmdldEluZGV4ZWRSZWdpb24oY2FyZXRQb3NpdGlvbik7Ci0JCQkJCWlmIChmTm9kZSA9PSBudWxsKQotCQkJCQkJcmV0dXJuOwotCi0JCQkJCXVwZGF0ZURvdWJsZUNsaWNrQ291bnQoY2FyZXRQb3NpdGlvbik7Ci0JCQkJCXVwZGF0ZVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQkJCQl1cGRhdGVUZXh0UmVnaW9uKCk7Ci0KLQkJCQkJaWYgKGZOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQlwcm9jZXNzVGV4dERvdWJsZUNsaWNrZWQoKTsKLQkJCQkJZWxzZQotCQkJCQkJcHJvY2Vzc0VsZW1lbnREb3VibGVDbGlja2VkKCk7Ci0JCQkJfQotCQkJfSBmaW5hbGx5IHsKLQkJCQlpZiAoZlN0cnVjdHVyZWRNb2RlbCAhPSBudWxsKQotCQkJCQlmU3RydWN0dXJlZE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFBvaW50IGdldFdvcmQoU3RyaW5nIHN0cmluZywgaW50IGN1cnNvcikgewotCQlpZiAoc3RyaW5nID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQotCQlpbnQgd29yZFN0YXJ0ID0gMDsKLQkJaW50IHdvcmRFbmQgPSBzdHJpbmcubGVuZ3RoKCk7Ci0KLQkJd29yZFN0YXJ0ID0gc3RyaW5nLmxhc3RJbmRleE9mKFNQQUNFLCBjdXJzb3IgLSAxKTsKLQkJaW50IHRlbXAgPSBzdHJpbmcubGFzdEluZGV4T2YoU0lOR0xFX1FVT1RFLCBjdXJzb3IgLSAxKTsKLQkJd29yZFN0YXJ0ID0gTWF0aC5tYXgod29yZFN0YXJ0LCB0ZW1wKTsKLQkJdGVtcCA9IHN0cmluZy5sYXN0SW5kZXhPZihET1VCTEVfUVVPVEUsIGN1cnNvciAtIDEpOwotCQl3b3JkU3RhcnQgPSBNYXRoLm1heCh3b3JkU3RhcnQsIHRlbXApOwotCQlpZiAod29yZFN0YXJ0ID09IC0xKQotCQkJd29yZFN0YXJ0ID0gY3Vyc29yOwotCQllbHNlCi0JCQl3b3JkU3RhcnQrKzsKLQotCQl3b3JkRW5kID0gc3RyaW5nLmluZGV4T2YoU1BBQ0UsIGN1cnNvcik7Ci0JCWlmICh3b3JkRW5kID09IC0xKQotCQkJd29yZEVuZCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJdGVtcCA9IHN0cmluZy5pbmRleE9mKFNJTkdMRV9RVU9URSwgY3Vyc29yKTsKLQkJaWYgKHRlbXAgPT0gLTEpCi0JCQl0ZW1wID0gc3RyaW5nLmxlbmd0aCgpOwotCQl3b3JkRW5kID0gTWF0aC5taW4od29yZEVuZCwgdGVtcCk7Ci0JCXRlbXAgPSBzdHJpbmcuaW5kZXhPZihET1VCTEVfUVVPVEUsIGN1cnNvcik7Ci0JCWlmICh0ZW1wID09IC0xKQotCQkJdGVtcCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJd29yZEVuZCA9IE1hdGgubWluKHdvcmRFbmQsIHRlbXApOwotCQlpZiAod29yZEVuZCA9PSBzdHJpbmcubGVuZ3RoKCkpCi0JCQl3b3JkRW5kID0gY3Vyc29yOwotCi0JCWlmICgod29yZFN0YXJ0ID09IHdvcmRFbmQpICYmICFpc1F1b3RlZChzdHJpbmcpKSB7Ci0JCQl3b3JkU3RhcnQgPSAwOwotCQkJd29yZEVuZCA9IHN0cmluZy5sZW5ndGgoKTsKLQkJfQotCi0JCXJldHVybiBuZXcgUG9pbnQod29yZFN0YXJ0LCB3b3JkRW5kKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1F1b3RlZChTdHJpbmcgc3RyaW5nKSB7Ci0JCWlmICgoc3RyaW5nID09IG51bGwpIHx8IChzdHJpbmcubGVuZ3RoKCkgPCAyKSkKLQkJCXJldHVybiBmYWxzZTsKLQotCQlpbnQgbGFzdEluZGV4ID0gc3RyaW5nLmxlbmd0aCgpIC0gMTsKLQkJY2hhciBmaXJzdENoYXIgPSBzdHJpbmcuY2hhckF0KDApOwotCQljaGFyIGxhc3RDaGFyID0gc3RyaW5nLmNoYXJBdChsYXN0SW5kZXgpOwotCi0JCXJldHVybiAoKChmaXJzdENoYXIgPT0gU0lOR0xFX1FVT1RFKSAmJiAobGFzdENoYXIgPT0gU0lOR0xFX1FVT1RFKSkgfHwgKChmaXJzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSAmJiAobGFzdENoYXIgPT0gRE9VQkxFX1FVT1RFKSkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0ckVxdWFsc0RvdWJsZUNsaWNrZWQyVGltZXMoKSB7Ci0JCWludCBwcmV2UmVnaW9uT2Zmc2V0ID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikgLSAxOwotCQlJVGV4dFJlZ2lvbiBwcmV2UmVnaW9uID0gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChwcmV2UmVnaW9uT2Zmc2V0KTsKLQkJaW50IG5leHRSZWdpb25PZmZzZXQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldChmVGV4dFJlZ2lvbik7Ci0JCUlUZXh0UmVnaW9uIG5leHRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KG5leHRSZWdpb25PZmZzZXQpOwotCi0JCWlmICgocHJldlJlZ2lvbiAhPSBudWxsKSAmJiAocHJldlJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSAmJiAobmV4dFJlZ2lvbiAhPSBudWxsKSAmJiAobmV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkpIHsKLQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldlJlZ2lvbiksIG5leHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gcHJldlJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0ck5hbWVEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgbmV4dFJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KGZUZXh0UmVnaW9uKTsKLQkJSVRleHRSZWdpb24gbmV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV4dFJlZ2lvbk9mZnNldCk7Ci0KLQkJaWYgKG5leHRSZWdpb24gIT0gbnVsbCkgewotCQkJbmV4dFJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KG5leHRSZWdpb24pOwotCQkJbmV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQobmV4dFJlZ2lvbk9mZnNldCk7Ci0JCQlpZiAoKG5leHRSZWdpb24gIT0gbnVsbCkgJiYgKG5leHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIG5leHRSZWdpb24uZ2V0VGV4dEVuZCgpIC0gZlRleHRSZWdpb24uZ2V0U3RhcnQoKSk7Ci0JCQl9IGVsc2UgewotCQkJCS8vIGF0dHJpYnV0ZSBoYXMgbm8gdmFsdWUKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NFbGVtZW50QXR0clZhbHVlRG91YmxlQ2xpY2tlZCgpIHsKLQkJU3RyaW5nIHJlZ2lvblRleHQgPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQoZlRleHRSZWdpb24pOwotCi0JCWlmIChmRG91YmxlQ2xpY2tDb3VudCA9PSAxKSB7Ci0JCQlQb2ludCB3b3JkID0gZ2V0V29yZChyZWdpb25UZXh0LCBmQ2FyZXRQb3NpdGlvbiAtIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pKTsKLQkJCWlmICh3b3JkLnggPT0gd29yZC55KSB7IC8vIG5vIHdvcmQgZm91bmQ7IHNlbGVjdCB3aG9sZSByZWdpb24KLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSwgcmVnaW9uVGV4dC5sZW5ndGgoKSk7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQrKzsKLQkJCX0gZWxzZQotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pICsgd29yZC54LCB3b3JkLnkgLSB3b3JkLngpOwotCQl9IGVsc2UgaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDIpIHsKLQkJCWlmIChpc1F1b3RlZChyZWdpb25UZXh0KSkgewotCQkJCS8vID09PiAvLyBQb2ludCB3b3JkID0gZ2V0V29yZChyZWdpb25UZXh0LCBmQ2FyZXRQb3NpdGlvbiAtCi0JCQkJLy8gZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikpOwotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pLCByZWdpb25UZXh0Lmxlbmd0aCgpKTsKLQkJCX0gZWxzZQotCQkJCXByb2Nlc3NFbGVtZW50QXR0clZhbHVlRG91YmxlQ2xpY2tlZDJUaW1lcygpOwotCQl9IGVsc2UgaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDMpIHsKLQkJCWlmIChpc1F1b3RlZChyZWdpb25UZXh0KSkKLQkJCQlwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQyVGltZXMoKTsKLQkJCWVsc2UgewotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSk7Ci0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJfQotCQl9IGVsc2UgeyAvLyBmRG91YmxlQ2xpY2tDb3VudCA9PSA0Ci0JCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnRBdHRyVmFsdWVEb3VibGVDbGlja2VkMlRpbWVzKCkgewotCQlpbnQgcHJldlJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pIC0gMTsKLQkJSVRleHRSZWdpb24gcHJldlJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldlJlZ2lvbk9mZnNldCk7Ci0KLQkJaWYgKHByZXZSZWdpb24gIT0gbnVsbCkgewotCQkJcHJldlJlZ2lvbk9mZnNldCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocHJldlJlZ2lvbikgLSAxOwotCQkJcHJldlJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQocHJldlJlZ2lvbk9mZnNldCk7Ci0JCQlpZiAoKHByZXZSZWdpb24gIT0gbnVsbCkgJiYgKHByZXZSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHByZXZSZWdpb24pLCBmVGV4dFJlZ2lvbi5nZXRUZXh0RW5kKCkgLSBwcmV2UmVnaW9uLmdldFN0YXJ0KCkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0VsZW1lbnREb3VibGVDbGlja2VkKCkgewotCQlpZiAoZlRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQlwcm9jZXNzRWxlbWVudEF0dHJWYWx1ZURvdWJsZUNsaWNrZWQoKTsgLy8gc3BlY2lhbCBoYW5kbGluZyBmb3IKLQkJLy8gWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUKLQkJZWxzZSB7Ci0JCQlpZiAoZkRvdWJsZUNsaWNrQ291bnQgPT0gMSkgewotCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnQoKSArIGZUZXh0UmVnaW9uLmdldFN0YXJ0KCksIGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQl9IGVsc2UgaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDIpIHsKLQkJCQlpZiAoZlRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSkKLQkJCQkJcHJvY2Vzc0VsZW1lbnRBdHRyTmFtZURvdWJsZUNsaWNrZWQyVGltZXMoKTsKLQkJCQllbHNlIGlmIChmVGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMpCi0JCQkJCXByb2Nlc3NFbGVtZW50QXR0ckVxdWFsc0RvdWJsZUNsaWNrZWQyVGltZXMoKTsKLQkJCQllbHNlIHsKLQkJCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpLCBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldExlbmd0aCgpKTsKLQkJCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAwOwotCQkJCX0KLQkJCX0gZWxzZSB7IC8vIGZEb3VibGVDbGlja0NvdW50ID09IDMKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCX0KLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHByb2Nlc3NUZXh0RG91YmxlQ2xpY2tlZCgpIHsKLQkJaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDEpIHsKLQkJCXN1cGVyLmRvdWJsZUNsaWNrZWQoZlN0cnVjdHVyZWRUZXh0Vmlld2VyKTsKLQotCQkJUG9pbnQgc2VsZWN0ZWRSYW5nZSA9IGZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5nZXRTZWxlY3RlZFJhbmdlKCk7Ci0JCQlpZiAoKHNlbGVjdGVkUmFuZ2UueCA9PSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KGZUZXh0UmVnaW9uKSkgJiYgKHNlbGVjdGVkUmFuZ2UueSA9PSBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpKQotCQkJCS8vIG9ubHkgb25lIHdvcmQgaW4gcmVnaW9uLCBza2lwIG9uZSBsZXZlbCBvZiBkb3VibGUgY2xpY2sKLQkJCQkvLyBzZWxlY3Rpb24KLQkJCQlmRG91YmxlQ2xpY2tDb3VudCsrOwotCQl9IGVsc2UgaWYgKGZEb3VibGVDbGlja0NvdW50ID09IDIpIHsKLQkJCWlmIChmVGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5VTkRFRklORUQpIHsKLQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCWZEb3VibGVDbGlja0NvdW50ID0gMDsKLQkJCX0gZWxzZSB7Ci0JCQkJaWYgKGlzUXVvdGVkKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RnVsbFRleHQoZlRleHRSZWdpb24pKSkKLQkJCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbikgKyAxLCBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkgLSAyKTsKLQkJCQllbHNlCi0JCQkJCWZTdHJ1Y3R1cmVkVGV4dFZpZXdlci5zZXRTZWxlY3RlZFJhbmdlKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoZlRleHRSZWdpb24pLCBmVGV4dFJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCkpOwotCQkJfQotCQl9IGVsc2UgewotCQkJaWYgKChmRG91YmxlQ2xpY2tDb3VudCA9PSAzKSAmJiBpc1F1b3RlZChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KGZUZXh0UmVnaW9uKSkpCi0JCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChmVGV4dFJlZ2lvbiksIGZUZXh0UmVnaW9uLmdldFRleHRMZW5ndGgoKSk7Ci0JCQllbHNlIHsKLQkJCQlpZiAoKGZEb3VibGVDbGlja0NvdW50ID09IDMpICYmIGlzUXVvdGVkKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25UZXh0KSkKLQkJCQkJZlN0cnVjdHVyZWRUZXh0Vmlld2VyLnNldFNlbGVjdGVkUmFuZ2UoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydCgpICsgMSwgZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKSAtIDIpOwotCQkJCWVsc2UgewotCQkJCQlmU3RydWN0dXJlZFRleHRWaWV3ZXIuc2V0U2VsZWN0ZWRSYW5nZShmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0KCksIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQkJCQlmRG91YmxlQ2xpY2tDb3VudCA9IDA7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0TW9kZWwoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJZlN0cnVjdHVyZWRNb2RlbCA9IHN0cnVjdHVyZWRNb2RlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVEb3VibGVDbGlja0NvdW50KGludCBjYXJldFBvc2l0aW9uKSB7Ci0JCWlmIChmQ2FyZXRQb3NpdGlvbiA9PSBjYXJldFBvc2l0aW9uKSB7Ci0JCQlpZiAoZlN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiAhPSBudWxsKQotCQkJCWZEb3VibGVDbGlja0NvdW50Kys7Ci0JCQllbHNlCi0JCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAxOwotCQl9IGVsc2UgewotCQkJZkNhcmV0UG9zaXRpb24gPSBjYXJldFBvc2l0aW9uOwotCQkJZkRvdWJsZUNsaWNrQ291bnQgPSAxOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgewotCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uID0gZlN0cnVjdHVyZWRNb2RlbC5nZXRTdHJ1Y3R1cmVkRG9jdW1lbnQoKS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChmQ2FyZXRQb3NpdGlvbik7Ci0JCWlmIChmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uICE9IG51bGwpCi0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpOwotCQllbHNlCi0JCQlmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uVGV4dCA9ICIiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVGV4dFJlZ2lvbigpIHsKLQkJaWYgKGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gIT0gbnVsbCkgewotCQkJZlRleHRSZWdpb24gPSBmU3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbkF0Q2hhcmFjdGVyT2Zmc2V0KGZDYXJldFBvc2l0aW9uKTsKLQkJCS8vIGlmIGZUZXh0UmVnaW9uIGlzIG51bGwsIGl0IG1lYW5zIHdlIGFyZSBhdCBqdXN0IHBhc3QgdGhlIGxhc3QKLQkJCS8vIGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sCi0JCQkvLyBhdCB0aGUgdmVyeSBlbmQgb2YgdGhlIGRvY3VtZW50LCBzbyB3ZSdsbCB1c2UgdGhlIGxhc3QgdGV4dAotCQkJLy8gcmVnaW9uIGluIHRoZSBkb2N1bWVudAotCQkJaWYgKGZUZXh0UmVnaW9uID09IG51bGwpIHsKLQkJCQlmVGV4dFJlZ2lvbiA9IGZTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZkNhcmV0UG9zaXRpb24gLSAxKTsKLQkJCX0KLQkJfSBlbHNlCi0JCQlmVGV4dFJlZ2lvbiA9IG51bGw7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9DTUltYWdlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9DTUltYWdlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTA2MTkwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvQ01JbWFnZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEBhdXRob3IgbnNkCi0gKi8KLXB1YmxpYyBjbGFzcyBDTUltYWdlVXRpbCB7Ci0KLQlwdWJsaWMgc3RhdGljIENNTm9kZSBnZXREZWNsYXJhdGlvbihOb2RlIG5vZGUpIHsKLQkJQ01Ob2RlIGRlY2wgPSBudWxsOwotCQlNb2RlbFF1ZXJ5IG1xID0gbnVsbDsKLQkJc3dpdGNoIChub2RlLmdldE5vZGVUeXBlKCkpIHsKLQkJCWNhc2UgTm9kZS5BVFRSSUJVVEVfTk9ERSA6IHsKLQkJCQltcSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoKChBdHRyKSBub2RlKS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCWRlY2wgPSBtcS5nZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKChBdHRyKSBub2RlKTsKLQkJCX0KLQkJCQlicmVhazsKLQkJCWNhc2UgTm9kZS5FTEVNRU5UX05PREUgOiB7Ci0JCQkJbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQlkZWNsID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oKEVsZW1lbnQpIG5vZGUpOwotCQkJfQotCQkJCWJyZWFrOwotCQl9Ci0JCXJldHVybiBkZWNsOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoY21ub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJSW1hZ2UgaW1hZ2UgPSBudWxsOwotCQlJbWFnZURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldEltYWdlRGVzY3JpcHRvcihjbW5vZGUpOwotCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2NyaXB0b3IuY3JlYXRlSW1hZ2UoZmFsc2UpOwotCQl9Ci0JCXJldHVybiBpbWFnZTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoQ01Ob2RlIGNtbm9kZSkgewotCQlpZiAoY21ub2RlID09IG51bGwpCi0JCQlyZXR1cm4gbnVsbDsKLQkJLy8gY2FjaGUgQ00tc3BlY2lmaWVkIGltYWdlcyB3aXRoIHRoZSBYTUwgVUkgcGx1Z2luCi0JCVN0cmluZyBpbWFnZVVSTFN0cmluZyA9IChTdHJpbmcpIGNtbm9kZS5nZXRQcm9wZXJ0eSgic21hbGwtaWNvbiIpOyAvLyROT04tTkxTLTEkCi0JCUltYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbnVsbDsKLQkJaWYgKGltYWdlVVJMU3RyaW5nICE9IG51bGwgJiYgaW1hZ2VVUkxTdHJpbmcubGVuZ3RoKCkgPiAwKSB7Ci0JCQlkZXNjcmlwdG9yID0gWE1MVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZVJlZ2lzdHJ5KCkKLQkJCQkJLmdldERlc2NyaXB0b3IoaW1hZ2VVUkxTdHJpbmcpOwotCQkJaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotCQkJCXRyeSB7Ci0JCQkJCVVSTCBpbWFnZVVSTCA9IG5ldyBVUkwoaW1hZ2VVUkxTdHJpbmcpOwotCQkJCQlVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBpbWFnZVVSTC5vcGVuQ29ubmVjdGlvbigpOwotCQkJCQljb25uZWN0aW9uLnNldFVzZUNhY2hlcyhmYWxzZSk7Ci0JCQkJCUltYWdlRGF0YSBkYXRhID0gbmV3IEltYWdlRGF0YShjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpOwotCQkJCQlkZXNjcmlwdG9yID0gSW1hZ2VEZXNjcmlwdG9yLmNyZWF0ZUZyb21JbWFnZURhdGEoZGF0YSk7Ci0JCQkJCVhNTFVJUGx1Z2luLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VSZWdpc3RyeSgpLnB1dCgKLQkJCQkJCQlpbWFnZVVSTFN0cmluZywgZGVzY3JpcHRvcik7Ci0JCQkJfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLQkJCQkJZGVzY3JpcHRvciA9IG51bGw7Ci0JCQkJfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotCQkJCQlkZXNjcmlwdG9yID0gbnVsbDsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogCi0JICovCi0JcHJpdmF0ZSBDTUltYWdlVXRpbCgpIHsKLQkJc3VwZXIoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9JSGVscENvbnRleHRJZHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmUxODZkMC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL0lIZWxwQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogSGVscCBjb250ZXh0IGlkcyBmb3IgdGhlIFhNTCBTb3VyY2UgRWRpdG9yLgotICogPHA+Ci0gKiBUaGlzIGludGVyZmFjZSBjb250YWlucyBjb25zdGFudHMgb25seTsgaXQgaXMgbm90IGludGVuZGVkIHRvIGJlCi0gKiBpbXBsZW1lbnRlZC4KLSAqIDwvcD4KLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIElIZWxwQ29udGV4dElkcyB7Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS4KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBYTUxVSVBsdWdpbi5JRCArICIuIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gZmlndXJlZCBvdXQgb24gdGhlIGZseQotCS8vIC8vIFhNTCBTb3VyY2UgcGFnZSBlZGl0b3IKLQkvLyBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfU09VUkNFVklFV19IRUxQSUQgPQotCS8vIENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUwgKyJfc291cmNlX0hlbHBJZCI7IC8vJE5PTi1OTFMtMSQKLQotCS8vIFhNTCBGaWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUFJFRldFQlhfRklMRVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDYwIjsgLy8kTk9OLU5MUy0xJAotCS8vIFhNTCBTb3VyY2UgUHJlZmVyZW5jZSBwYWdlCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1BSRUZXRUJYX1NPVVJDRV9IRUxQSUQgPSBQUkVGSVggKyAid2VieDAwNjEiOyAvLyROT04tTkxTLTEkCi0JLy8gWE1MIFN0eWxlcyBQcmVmZXJlbmNlIHBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfUFJFRldFQlhfU1RZTEVTX0hFTFBJRCA9IFBSRUZJWCArICJ3ZWJ4MDA2MiI7IC8vJE5PTi1OTFMtMSQKLQkvLyBYTUwgVGVtcGxhdGVzIFByZWZlcmVuY2UgcGFnZQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTF9QUkVGV0VCWF9URU1QTEFURVNfSEVMUElEID0gUFJFRklYICsgIndlYngwMDYzIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gWE1MIENsZWFudXAgZGlhbG9nCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xFQU5VUF9YTUxfSEVMUElEID0gUFJFRklYICsgInhtbG0xMjAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLy8gWE1MIE5ldyBGaWxlIFdpemFyZCAtIFRlbXBsYXRlIFBhZ2UKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfTkVXV0laQVJEX1RFTVBMQVRFX0hFTFBJRCA9IFBSRUZJWCArICJ4bWx3MDAxMCI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9lZGl0b3IvWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzMzhkZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlUmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkltYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLQotLyoqCi0gKiBIZWxwZXIgY2xhc3MgdG8gaGFuZGxlIGltYWdlcyBwcm92aWRlZCBieSB0aGlzIHBsdWctaW4uCi0gKiAKLSAqIE5PVEU6IEZvciBpbnRlcm5hbCB1c2Ugb25seS4gRm9yIGltYWdlcyB1c2VkIGV4dGVybmFsbHksIHBsZWFzZSB1c2UgdGhlCi0gKiBTaGFyZWQqKipJbWFnZUhlbHBlciBjbGFzcyBpbnN0ZWFkLgotICogCi0gKiBAYXV0aG9yIGFteXd1Ci0gKi8KLXB1YmxpYyBjbGFzcyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHJpdmF0ZSBzdGF0aWMgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIgaW5zdGFuY2UgPSBudWxsOwotCi0JLyoqCi0JICogR2V0cyB0aGUgaW5zdGFuY2UuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGEgWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIKLQkgKi8KLQlwdWJsaWMgc3luY2hyb25pemVkIHN0YXRpYyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciBnZXRJbnN0YW5jZSgpIHsKLQkJaWYgKGluc3RhbmNlID09IG51bGwpCi0JCQlpbnN0YW5jZSA9IG5ldyBYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlcigpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JLy8JIHNhdmUgYSBkZXNjcmlwdG9yIGZvciBlYWNoIGltYWdlCi0JcHJpdmF0ZSBIYXNoTWFwIGZJbWFnZURlc2NSZWdpc3RyeSA9IG51bGw7Ci0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgUExVR0lOSUQgPSBYTUxVSVBsdWdpbi5JRDsKLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZnJvbSB0aGUgZ2l2ZW4gcmVzb3VyY2UgYW5kIGFkZHMgdGhlIGltYWdlIHRvIHRoZQotCSAqIGltYWdlIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSByZXNvdXJjZQotCSAqIEByZXR1cm4gSW1hZ2UKLQkgKi8KLQlwcml2YXRlIEltYWdlIGNyZWF0ZUltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZURlc2NyaXB0b3IgZGVzYyA9IGdldEltYWdlRGVzY3JpcHRvcihyZXNvdXJjZSk7Ci0JCUltYWdlIGltYWdlID0gbnVsbDsKLQotCQlpZiAoZGVzYyAhPSBudWxsKSB7Ci0JCQlpbWFnZSA9IGRlc2MuY3JlYXRlSW1hZ2UoKTsKLQkJCS8vIGRvbnQgYWRkIHRoZSBtaXNzaW5nIGltYWdlIGRlc2NyaXB0b3IgaW1hZ2UgdG8gdGhlIGltYWdlCi0JCQkvLyByZWdpc3RyeQotCQkJaWYgKCFkZXNjLmVxdWFscyhJbWFnZURlc2NyaXB0b3IuZ2V0TWlzc2luZ0ltYWdlRGVzY3JpcHRvcigpKSkKLQkJCQlnZXRJbWFnZVJlZ2lzdHJ5KCkucHV0KHJlc291cmNlLCBpbWFnZSk7Ci0JCX0KLQkJcmV0dXJuIGltYWdlOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW4gaW1hZ2UgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBpbWFnZUZpbGVQYXRoIGFuZCBhZGRzIHRoZQotCSAqIGltYWdlIGRlc2NyaXB0b3IgdG8gdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIGFuIGltYWdlCi0JICogZGVzY3JpcHRvciBjb3VsZCBub3QgYmUgY3JlYXRlZCwgdGhlIGRlZmF1bHQgIm1pc3NpbmciIGltYWdlIGRlc2NyaXB0b3IKLQkgKiBpcyByZXR1cm5lZCBidXQgbm90IGFkZGVkIHRvIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHJlZ2lzdHJ5LgotCSAqIAotCSAqIEBwYXJhbSBpbWFnZUZpbGVQYXRoCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgaW1hZ2UgZGVzY3JpcHRvciBmb3IgaW1hZ2VGaWxlUGF0aCBvciBkZWZhdWx0Ci0JICogICAgICAgICAibWlzc2luZyIgaW1hZ2UgZGVzY3JpcHRvciBpZiByZXNvdXJjZSBjb3VsZCBub3QgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEltYWdlRGVzY3JpcHRvciBjcmVhdGVJbWFnZURlc2NyaXB0b3IoU3RyaW5nIGltYWdlRmlsZVBhdGgpIHsKLQkJSW1hZ2VEZXNjcmlwdG9yIGltYWdlRGVzY3JpcHRvciA9IEFic3RyYWN0VUlQbHVnaW4uaW1hZ2VEZXNjcmlwdG9yRnJvbVBsdWdpbihQTFVHSU5JRCwgaW1hZ2VGaWxlUGF0aCk7Ci0JCWlmIChpbWFnZURlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJZ2V0SW1hZ2VEZXNjcmlwdG9yUmVnaXN0cnkoKS5wdXQoaW1hZ2VGaWxlUGF0aCwgaW1hZ2VEZXNjcmlwdG9yKTsKLQkJfSBlbHNlIHsKLQkJCWltYWdlRGVzY3JpcHRvciA9IEltYWdlRGVzY3JpcHRvci5nZXRNaXNzaW5nSW1hZ2VEZXNjcmlwdG9yKCk7Ci0JCX0KLQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGZyb20gdGhlIGltYWdlIHJlZ2lzdHJ5LgotCSAqIElmIHRoZSBpbWFnZSBjYW5ub3QgYmUgcmV0cmlldmVkLCBhdHRlbXB0IHRvIGZpbmQgYW5kIGxvYWQgdGhlIGltYWdlIGF0Ci0JICogdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSB0byByZXRyaWV2ZQotCSAqIEByZXR1cm4gSW1hZ2UgdGhlIGltYWdlIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBvciBudWxsIGlmIG9uZSBjb3VsZAotCSAqICAgICAgICAgbm90IGJlIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlIGdldEltYWdlKFN0cmluZyByZXNvdXJjZSkgewotCQlJbWFnZSBpbWFnZSA9IGdldEltYWdlUmVnaXN0cnkoKS5nZXQocmVzb3VyY2UpOwotCQlpZiAoaW1hZ2UgPT0gbnVsbCkgewotCQkJLy8gY3JlYXRlIGFuIGltYWdlCi0JCQlpbWFnZSA9IGNyZWF0ZUltYWdlKHJlc291cmNlKTsKLQkJfQotCQlyZXR1cm4gaW1hZ2U7Ci0JfQotCi0JLyoqCi0JICogUmV0cmlldmVzIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCByZXNvdXJjZSBmcm9tIHRoZSBpbWFnZQotCSAqIGRlc2NyaXB0b3IgcmVnaXN0cnkuIElmIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGNhbm5vdCBiZSByZXRyaWV2ZWQsCi0JICogYXR0ZW1wdCB0byBmaW5kIGFuZCBsb2FkIHRoZSBpbWFnZSBkZXNjcmlwdG9yIGF0IHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQKLQkgKiBpbiByZXNvdXJjZS4KLQkgKiAKLQkgKiBAcGFyYW0gcmVzb3VyY2UKLQkgKiAgICAgICAgICAgIHRoZSBpbWFnZSBkZXNjcmlwdG9yIHRvIHJldHJpZXZlCi0JICogQHJldHVybiBJbWFnZURlc2NyaXB0b3IgdGhlIGltYWdlIGRlc2NyaXB0b3IgYXNzb2NhdGVkIHdpdGggcmVzb3VyY2Ugb3IKLQkgKiAgICAgICAgIHRoZSBkZWZhdWx0ICJtaXNzaW5nIiBpbWFnZSBkZXNjcmlwdG9yIGlmIG9uZSBjb3VsZCBub3QgYmUKLQkgKiAgICAgICAgIGZvdW5kCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHJlc291cmNlKSB7Ci0JCUltYWdlRGVzY3JpcHRvciBpbWFnZURlc2NyaXB0b3IgPSBudWxsOwotCQlPYmplY3QgbyA9IGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkuZ2V0KHJlc291cmNlKTsKLQkJaWYgKG8gPT0gbnVsbCkgewotCQkJLy9jcmVhdGUgYSBkZXNjcmlwdG9yCi0JCQlpbWFnZURlc2NyaXB0b3IgPSBjcmVhdGVJbWFnZURlc2NyaXB0b3IocmVzb3VyY2UpOwotCQl9IGVsc2UgewotCQkJaW1hZ2VEZXNjcmlwdG9yID0gKEltYWdlRGVzY3JpcHRvcikgbzsKLQkJfQotCQlyZXR1cm4gaW1hZ2VEZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luLgotCSAqIAotCSAqIEByZXR1cm4gSGFzaE1hcCAtIGltYWdlIGRlc2NyaXB0b3IgcmVnaXN0cnkgZm9yIHRoaXMgcGx1Z2luCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGdldEltYWdlRGVzY3JpcHRvclJlZ2lzdHJ5KCkgewotCQlpZiAoZkltYWdlRGVzY1JlZ2lzdHJ5ID09IG51bGwpCi0JCQlmSW1hZ2VEZXNjUmVnaXN0cnkgPSBuZXcgSGFzaE1hcCgpOwotCQlyZXR1cm4gZkltYWdlRGVzY1JlZ2lzdHJ5OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGltYWdlIHJlZ2lzdHJ5IGZvciB0aGlzIHBsdWdpbi4KLQkgKiAKLQkgKiBAcmV0dXJuIEltYWdlUmVnaXN0cnkgLSBpbWFnZSByZWdpc3RyeSBmb3IgdGhpcyBwbHVnaW4KLQkgKi8KLQlwcml2YXRlIEltYWdlUmVnaXN0cnkgZ2V0SW1hZ2VSZWdpc3RyeSgpIHsKLQkJcmV0dXJuIEpGYWNlUmVzb3VyY2VzLmdldEltYWdlUmVnaXN0cnkoKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2VkaXRvci9YTUxFZGl0b3JQbHVnaW5JbWFnZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmJiNGFkNy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvZWRpdG9yL1hNTEVkaXRvclBsdWdpbkltYWdlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvcjsKLQotLyoqCi0gKiBCdW5kbGUgb2YgbW9zdCBpbWFnZXMgdXNlZCBieSB0aGUgWE1MIFNvdXJjZSBFZGl0b3IgcGx1Zy1pbi4KLSAqLwotcHVibGljIGNsYXNzIFhNTEVkaXRvclBsdWdpbkltYWdlcyB7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfQ09OU1RSQUlOT0ZGID0gImljb25zL2Z1bGwvZHRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PTiA9ICJpY29ucy9mdWxsL2R0b29sMTYvY29uc3RyYWlub24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9STERHUk1SID0gImljb25zL2Z1bGwvZHRvb2wxNi9ybGRncm1yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRFRPT0xfVkFMSURBVEUgPSAiaWNvbnMvZnVsbC9kdG9vbDE2L3ZhbGlkYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQ09OU1RSQUlOT0ZGID0gImljb25zL2Z1bGwvZXRvb2wxNi9jb25zdHJhaW5vZmYuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9DT05TVFJBSU5PTiA9ICJpY29ucy9mdWxsL2V0b29sMTYvY29uc3RyYWlub24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19FVE9PTF9STERHUk1SID0gImljb25zL2Z1bGwvZXRvb2wxNi9ybGRncm1yLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfVkFMSURBVEUgPSAiaWNvbnMvZnVsbC9ldG9vbDE2L3ZhbGlkYXRlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FERF9DT1JSRUNUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvYWRkX2NvcnJlY3Rpb24uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQVRUX1JFUV9PQkogPSAiaWNvbnMvZnVsbC9vYmoxNi9hdHRfcmVxX29iai5naWYiOyAvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0FUVFJJQlVURSA9ICJpY29ucy9mdWxsL29iajE2L2F0dHJpYnV0ZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0RBVEFTRUNUSU9OID0gImljb25zL2Z1bGwvb2JqMTYvY2RhdGFzZWN0aW9uLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0NPTU1FTlQgPSAiaWNvbnMvZnVsbC9vYmoxNi9jb21tZW50X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9DT1JSRUNUSU9OX0NIQU5HRSA9ICJpY29ucy9mdWxsL29iajE2L2NvcnJlY3Rpb25fY2hhbmdlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0RPQ1RZUEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9kb2N0eXBlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0RUREZJTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9kdGRmaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQJCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9FTEVNRU5UID0gImljb25zL2Z1bGwvb2JqMTYvZWxlbWVudF9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5USVRZID0gImljb25zL2Z1bGwvb2JqMTYvZW50aXR5LmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0UgPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnRpdHlfcmVmZXJlbmNlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VOVU0gPSAiaWNvbnMvZnVsbC9vYmoxNi9lbnVtLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0xPQ0FMX1ZBUklBQkxFID0gImljb25zL2Z1bGwvb2JqMTYvbG9jYWx2YXJpYWJsZV9vYmouZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfTk9UQVRJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9ub3RhdGlvbi5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9QUk9DRVNTSU5HSU5TVFJVQ1RJT04gPSAiaWNvbnMvZnVsbC9vYmoxNi9wcm9pbnN0X29iai5naWYiOyAvLyROT04tTkxTLTEkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfR0VORVJJQyA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLmdpZiI7IC8vJE5PTi1OTFMtMSQKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19HRU5FUklDX0RFRU1QSEFTSVpFRCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLWRlZW1waGFzaXplZC5naWYiOyAvLyROT04tTkxTLTEkICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0dFTkVSSUNfRU1QSEFTSVpFRCA9ICJpY29ucy9mdWxsL29iajE2L3RhZy1nZW5lcmljLWVtcGhhc2l6ZWQuZ2lmIjsgLy8kTk9OLU5MUy0xJCAgICAgICAgCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9UQUdfTUFDUk8gPSAiaWNvbnMvZnVsbC9vYmoxNi90YWctbWFjcm8uZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVFhURVhUID0gImljb25zL2Z1bGwvb2JqMTYvdGV4dC5naWYiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9XQVJOSU5HX09CSiA9ICJpY29ucy9mdWxsL29iajE2L3dhcm5pbmdfb2JqLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1hTREZJTEUgPSAiaWNvbnMvZnVsbC9vYmoxNi9YU0RGaWxlLmdpZiI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfRVJST1IgPSAiaWNvbnMvZnVsbC9vdnIxNi9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfU1RBTEVfRVJST1IgPSAiaWNvbnMvZnVsbC9vdnIxNi9zdGFsZV9lcnJvcl9vdnIuZ2lmIjsgLy8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PVlJfV0FSTiA9ICJpY29ucy9mdWxsL292cjE2L3dhcm5fb3ZyLmdpZiI7IC8vJE5PTi1OTFMtMSQKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThlODZmYi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUVkaXRvcklucHV0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluazsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSW1hZ2VEZXNjcmlwdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklFZGl0b3JJbnB1dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklQZXJzaXN0YWJsZUVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyOwotCi0vKioKLSAqIEVkaXRvcklucHV0IGZvciBleHRlcm5hbCBmaWxlcy4gQ29waWVkIGZyb20KLSAqIG9yZy5lY2xpcHNlLnVpLmludGVybmFsLmVkaXRvcnMudGV4dC5KYXZhRmlsZUVkaXRvcklucHV0Ci0gKi8KLWNsYXNzIEV4dGVybmFsRmlsZUVkaXRvcklucHV0IGltcGxlbWVudHMgSUVkaXRvcklucHV0LCBJTG9jYXRpb25Qcm92aWRlciB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCQotCS8qKgotCSAqIFRoZSB3b3JrYmVuY2ggYWRhcHRlciB3aGljaCBzaW1wbHkgcHJvdmlkZXMgdGhlIGxhYmVsLgotCSAqLwotCXByaXZhdGUgY2xhc3MgV29ya2JlbmNoQWRhcHRlciBpbXBsZW1lbnRzIElXb3JrYmVuY2hBZGFwdGVyIHsKLQkJLyoKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS5tb2RlbC5JV29ya2JlbmNoQWRhcHRlciNnZXRDaGlsZHJlbihqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdFtdIGdldENoaWxkcmVuKE9iamVjdCBvKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0SW1hZ2VEZXNjcmlwdG9yKGphdmEubGFuZy5PYmplY3QpCi0JCSAqLwotCQlwdWJsaWMgSW1hZ2VEZXNjcmlwdG9yIGdldEltYWdlRGVzY3JpcHRvcihPYmplY3Qgb2JqZWN0KSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCS8qCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkubW9kZWwuSVdvcmtiZW5jaEFkYXB0ZXIjZ2V0TGFiZWwoamF2YS5sYW5nLk9iamVjdCkKLQkJICovCi0JCXB1YmxpYyBTdHJpbmcgZ2V0TGFiZWwoT2JqZWN0IG8pIHsKLQkJCXJldHVybiAoKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvKS5nZXROYW1lKCk7Ci0JCX0KLQotCQkvKgotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLm1vZGVsLklXb3JrYmVuY2hBZGFwdGVyI2dldFBhcmVudChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIE9iamVjdCBnZXRQYXJlbnQoT2JqZWN0IG8pIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBGaWxlIGZGaWxlOwotCXByaXZhdGUgV29ya2JlbmNoQWRhcHRlciBmV29ya2JlbmNoQWRhcHRlciA9IG5ldyBXb3JrYmVuY2hBZGFwdGVyKCk7Ci0KLQlwdWJsaWMgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQoRmlsZSBmaWxlKSB7Ci0JCXN1cGVyKCk7Ci0JCWZGaWxlID0gZmlsZTsKLQkJZldvcmtiZW5jaEFkYXB0ZXIgPSBuZXcgV29ya2JlbmNoQWRhcHRlcigpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZXhpc3RzKCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBleGlzdHMoKSB7Ci0JCXJldHVybiBmRmlsZS5leGlzdHMoKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldEltYWdlRGVzY3JpcHRvcigpCi0JICovCi0JcHVibGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoKSB7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0TmFtZSgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0TmFtZSgpOwotCX0KLQotCS8qCi0JICogQHNlZSBvcmcuZWNsaXBzZS51aS5JRWRpdG9ySW5wdXQjZ2V0UGVyc2lzdGFibGUoKQotCSAqLwotCXB1YmxpYyBJUGVyc2lzdGFibGVFbGVtZW50IGdldFBlcnNpc3RhYmxlKCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0I2dldFRvb2xUaXBUZXh0KCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFRvb2xUaXBUZXh0KCkgewotCQlyZXR1cm4gZkZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQWRhcHRhYmxlI2dldEFkYXB0ZXIoamF2YS5sYW5nLkNsYXNzKQotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0QWRhcHRlcihDbGFzcyBhZGFwdGVyKSB7Ci0JCWlmIChJTG9jYXRpb25Qcm92aWRlci5jbGFzcy5lcXVhbHMoYWRhcHRlcikpCi0JCQlyZXR1cm4gdGhpczsKLQkJaWYgKElXb3JrYmVuY2hBZGFwdGVyLmNsYXNzLmVxdWFscyhhZGFwdGVyKSkKLQkJCXJldHVybiBmV29ya2JlbmNoQWRhcHRlcjsKLQkJcmV0dXJuIFBsYXRmb3JtLmdldEFkYXB0ZXJNYW5hZ2VyKCkuZ2V0QWRhcHRlcih0aGlzLCBhZGFwdGVyKTsKLQl9Ci0KLQkvKgotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkuZWRpdG9ycy50ZXh0LklMb2NhdGlvblByb3ZpZGVyI2dldFBhdGgoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgSVBhdGggZ2V0UGF0aChPYmplY3QgZWxlbWVudCkgewotCQlpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSB7Ci0JCQlFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCBpbnB1dCA9IChFeHRlcm5hbEZpbGVFZGl0b3JJbnB1dCkgZWxlbWVudDsKLQkJCXJldHVybiBQYXRoLmZyb21PU1N0cmluZyhpbnB1dC5mRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCQotICAgIC8qCi0gICAgICogQHNlZSBvcmcuZWNsaXBzZS51aS5JUGF0aEVkaXRvcklucHV0I2dldFBhdGgoKQotICAgICAqIEBzaW5jZSAzLjEKLSAgICAgKi8KLSAgICBwdWJsaWMgSVBhdGggZ2V0UGF0aCgpIHsKLSAgICAgICAgcmV0dXJuIFBhdGguZnJvbU9TU3RyaW5nKGZGaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICB9Ci0KLQkvKgotCSAqIEBzZWUgamF2YS5sYW5nLk9iamVjdCNlcXVhbHMoamF2YS5sYW5nLk9iamVjdCkKLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLQkJaWYgKG8gPT0gdGhpcykKLQkJCXJldHVybiB0cnVlOwotCi0JCWlmIChvIGluc3RhbmNlb2YgRXh0ZXJuYWxGaWxlRWRpdG9ySW5wdXQpIHsKLQkJCUV4dGVybmFsRmlsZUVkaXRvcklucHV0IGlucHV0ID0gKEV4dGVybmFsRmlsZUVkaXRvcklucHV0KSBvOwotCQkJcmV0dXJuIGZGaWxlLmVxdWFscyhpbnB1dC5mRmlsZSk7Ci0JCX0KLQkJCi0gICAgICAgIGlmIChvIGluc3RhbmNlb2YgSVBhdGhFZGl0b3JJbnB1dCkgewotICAgICAgICAgICAgSVBhdGhFZGl0b3JJbnB1dCBpbnB1dD0gKElQYXRoRWRpdG9ySW5wdXQpbzsKLSAgICAgICAgICAgIHJldHVybiBnZXRQYXRoKCkuZXF1YWxzKGlucHV0LmdldFBhdGgoKSk7Ci0gICAgICAgIH0KLQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiBAc2VlIGphdmEubGFuZy5PYmplY3QjaGFzaENvZGUoKQotCSAqLwotCXB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0JCXJldHVybiBmRmlsZS5oYXNoQ29kZSgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvaHlwZXJsaW5rL0V4dGVybmFsRmlsZUh5cGVybGluay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTZhMDcyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvRXh0ZXJuYWxGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvckRlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvcklucHV0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBhcnRJbml0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuaWRlLklERTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBIeXBlcmxpbmsgZm9yIGV4dGVybmFsIGZpbGVzLgotICovCi1jbGFzcyBFeHRlcm5hbEZpbGVIeXBlcmxpbmsgaW1wbGVtZW50cyBJSHlwZXJsaW5rIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0JCi0JcHJpdmF0ZSBJUmVnaW9uIGZIeXBlcmxpbmtSZWdpb247Ci0JcHJpdmF0ZSBGaWxlIGZIeXBlcmxpbmtGaWxlOwotCi0JcHVibGljIEV4dGVybmFsRmlsZUh5cGVybGluayhJUmVnaW9uIHJlZ2lvbiwgRmlsZSBmaWxlKSB7Ci0JCWZIeXBlcmxpbmtGaWxlID0gZmlsZTsKLQkJZkh5cGVybGlua1JlZ2lvbiA9IHJlZ2lvbjsKLQl9Ci0JCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZkh5cGVybGlua1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBvcGVuKCkgewotCQlpZiAoZkh5cGVybGlua0ZpbGUgIT0gbnVsbCkgewotCQkJSUVkaXRvcklucHV0IGlucHV0ID0gbmV3IEV4dGVybmFsRmlsZUVkaXRvcklucHV0KGZIeXBlcmxpbmtGaWxlKTsKLQkJCUlFZGl0b3JEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0JCQl0cnkgewotCQkJCWRlc2NyaXB0b3IgPSBJREUuZ2V0RWRpdG9yRGVzY3JpcHRvcihpbnB1dC5nZXROYW1lKCksIHRydWUpOwotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJSVdvcmtiZW5jaFBhZ2UgcGFnZSA9IFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0QWN0aXZlV29ya2JlbmNoV2luZG93KCkuZ2V0QWN0aXZlUGFnZSgpOwotCQkJCQlJREUub3BlbkVkaXRvcihwYWdlLCBpbnB1dCwgZGVzY3JpcHRvci5nZXRJZCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gZSkgewotCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkdfREVCVUcsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKLQkJCX0KLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvV29ya3NwYWNlRmlsZUh5cGVybGluay5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZmU5Y2IuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9Xb3Jrc3BhY2VGaWxlSHlwZXJsaW5rLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSVdvcmtiZW5jaFBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGFydEluaXRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5pZGUuSURFOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IuSVRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLS8qKgotICogSHlwZXJsaW5rIGZvciBmaWxlcyB3aXRoaW4gdGhlIHdvcmtzcGFjZS4gKEFzIGxvbmcgYXMgdGhlcmUgaXMgYW4gSUZpbGUsCi0gKiB0aGlzIGNhbiBiZSB1c2VkKSBPcGVucyB0aGUgZGVmYXVsdCBlZGl0b3IgZm9yIHRoZSBmaWxlLgotICovCi1jbGFzcyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIGltcGxlbWVudHMgSUh5cGVybGluayB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgZXhpc3QgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5oeXBlcmxpbmsKLQkvLyBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmludGVybmFsLmh5cGVybGluawotCi0JcHJpdmF0ZSBJUmVnaW9uIGZSZWdpb247Ci0JcHJpdmF0ZSBJRmlsZSBmRmlsZTsKLQlwcml2YXRlIElSZWdpb24gZkhpZ2hsaWdodFJhbmdlOwotCi0JcHVibGljIFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoSVJlZ2lvbiByZWdpb24sIElGaWxlIGZpbGUpIHsKLQkJZlJlZ2lvbiA9IHJlZ2lvbjsKLQkJZkZpbGUgPSBmaWxlOwotCX0KLQotCXB1YmxpYyBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rKElSZWdpb24gcmVnaW9uLCBJRmlsZSBmaWxlLCBJUmVnaW9uIHJhbmdlKSB7Ci0JCWZSZWdpb24gPSByZWdpb247Ci0JCWZGaWxlID0gZmlsZTsKLQkJZkhpZ2hsaWdodFJhbmdlID0gcmFuZ2U7Ci0JfQotCi0JcHVibGljIElSZWdpb24gZ2V0SHlwZXJsaW5rUmVnaW9uKCkgewotCQlyZXR1cm4gZlJlZ2lvbjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0VHlwZUxhYmVsKCkKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFR5cGVMYWJlbCgpIHsKLQkJLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmsjZ2V0SHlwZXJsaW5rVGV4dCgpCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRIeXBlcmxpbmtUZXh0KCkgewotCQkvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyB2b2lkIG9wZW4oKSB7Ci0JCWlmIChmRmlsZSAhPSBudWxsICYmIGZGaWxlLmV4aXN0cygpKSB7Ci0JCQl0cnkgewotCQkJCUlXb3JrYmVuY2hQYWdlIHBhZ2UgPSBQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldEFjdGl2ZVBhZ2UoKTsKLQkJCQlJRWRpdG9yUGFydCBlZGl0b3IgPSBJREUub3BlbkVkaXRvcihwYWdlLCBmRmlsZSwgdHJ1ZSk7Ci0JCQkJLy8gaGlnaGxpZ2h0IHJhbmdlIGluIGVkaXRvciBpZiBwb3NzaWJsZQotCQkJCWlmIChmSGlnaGxpZ2h0UmFuZ2UgIT0gbnVsbCAmJiBlZGl0b3IgaW5zdGFuY2VvZiBJVGV4dEVkaXRvcikgewotCQkJCQkoKElUZXh0RWRpdG9yKSBlZGl0b3IpLnNldEhpZ2hsaWdodFJhbmdlKGZIaWdobGlnaHRSYW5nZS5nZXRPZmZzZXQoKSwgZkhpZ2hsaWdodFJhbmdlLmdldExlbmd0aCgpLCB0cnVlKTsKLQkJCQl9Ci0JCQl9Ci0JCQljYXRjaCAoUGFydEluaXRFeGNlcHRpb24gcGllKSB7Ci0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgcGllLmdldE1lc3NhZ2UoKSwgcGllKTsKLQkJCX0KLQkJfQotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL2h5cGVybGluay9YTUxIeXBlcmxpbmtEZXRlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTVjNGIzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9oeXBlcmxpbmsvWE1MSHlwZXJsaW5rRGV0ZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwNSArMCwwIEBACi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuaHlwZXJsaW5rOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSSTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGNvbS5pYm0uaWN1LnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5JSHlwZXJsaW5rOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaHlwZXJsaW5rLklIeXBlcmxpbmtEZXRlY3RvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0Lmh5cGVybGluay5VUkxIeXBlcmxpbms7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01EYXRhVHlwZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5ET01OYW1lc3BhY2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5BdHRyOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50VHlwZTsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIERldGVjdHMgaHlwZXJsaW5rcyBpbiBYTUwgdGFncy4gSW5jbHVkZXMgZGV0ZWN0aW9uIGluIERPQ1RZUEUgYW5kIGF0dHJpYnV0ZQotICogdmFsdWVzLiBSZXNvbHZlcyByZWZlcmVuY2VzIHRvIHNjaGVtYXMsIGR0ZHMsIGV0YyB1c2luZyB0aGUgQ29tbW9uIFVSSQotICogUmVzb2x2ZXIuCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIFhNTEh5cGVybGlua0RldGVjdG9yIGltcGxlbWVudHMgSUh5cGVybGlua0RldGVjdG9yIHsKLQkvLyBjb3BpZXMgb2YgdGhpcyBjbGFzcyBleGlzdCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmludGVybmFsLmh5cGVybGluawotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwuaHlwZXJsaW5rCi0KLQlwcml2YXRlIGZpbmFsIFN0cmluZyBIVFRQX1BST1RPQ09MID0gImh0dHA6Ly8iOy8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIGZpbmFsIFN0cmluZyBOT19OQU1FU1BBQ0VfU0NIRU1BX0xPQ0FUSU9OID0gIm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24iOyAvLyROT04tTkxTLTEkCi0JcHJpdmF0ZSBmaW5hbCBTdHJpbmcgU0NIRU1BX0xPQ0FUSU9OID0gInNjaGVtYUxvY2F0aW9uIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhNTE5TID0gInhtbG5zIjsgLy8kTk9OLU5MUy0xJAotCXByaXZhdGUgZmluYWwgU3RyaW5nIFhTSV9OQU1FU1BBQ0VfVVJJID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogQ3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBoeXBlcmxpbmsKLQkgKiAKLQkgKiBAcGFyYW0gdXJpU3RyaW5nCi0JICogQHBhcmFtIGh5cGVybGlua1JlZ2lvbgotCSAqIEByZXR1cm4gSUh5cGVybGluawotCSAqLwotCXByaXZhdGUgSUh5cGVybGluayBjcmVhdGVIeXBlcmxpbmsoU3RyaW5nIHVyaVN0cmluZywgSVJlZ2lvbiBoeXBlcmxpbmtSZWdpb24sIElEb2N1bWVudCBkb2N1bWVudCwgTm9kZSBub2RlKSB7Ci0JCUlIeXBlcmxpbmsgbGluayA9IG51bGw7Ci0KLQkJaWYgKGlzSHR0cCh1cmlTdHJpbmcpKSB7Ci0JCQlsaW5rID0gbmV3IFVSTEh5cGVybGluayhoeXBlcmxpbmtSZWdpb24sIHVyaVN0cmluZyk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyB0cnkgdG8gbG9jYXRlIHRoZSBmaWxlIGluIHRoZSB3b3Jrc3BhY2UKLQkJCUZpbGUgc3lzdGVtRmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoc3lzdGVtRmlsZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHN5c3RlbVBhdGggPSBzeXN0ZW1GaWxlLmdldFBhdGgoKTsKLQkJCQlJRmlsZSBmaWxlID0gZ2V0RmlsZShzeXN0ZW1QYXRoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCS8vIHRoaXMgaXMgYSBXb3Jrc3BhY2VGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZXhpc3RzIGluCi0JCQkJCS8vIHdvcmtzcGFjZQotCQkJCQlsaW5rID0gbmV3IFdvcmtzcGFjZUZpbGVIeXBlcmxpbmsoaHlwZXJsaW5rUmVnaW9uLCBmaWxlKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIHRoaXMgaXMgYW4gRXh0ZXJuYWxGaWxlSHlwZXJsaW5rIHNpbmNlIGZpbGUgZG9lcyBub3QKLQkJCQkJLy8gZXhpc3QgaW4gd29ya3NwYWNlCi0JCQkJCWxpbmsgPSBuZXcgRXh0ZXJuYWxGaWxlSHlwZXJsaW5rKGh5cGVybGlua1JlZ2lvbiwgc3lzdGVtRmlsZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBsaW5rOwotCX0KLQotCXB1YmxpYyBJSHlwZXJsaW5rW10gZGV0ZWN0SHlwZXJsaW5rcyhJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHJlZ2lvbiwgYm9vbGVhbiBjYW5TaG93TXVsdGlwbGVIeXBlcmxpbmtzKSB7Ci0JCS8vIGZvciBub3csIG9ubHkgY2FwYWJsZSBvZiBjcmVhdGluZyAxIGh5cGVybGluawotCQlMaXN0IGh5cGVybGlua3MgPSBuZXcgQXJyYXlMaXN0KDApOwotCi0JCWlmIChyZWdpb24gIT0gbnVsbCAmJiB0ZXh0Vmlld2VyICE9IG51bGwpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKTsKLQkJCU5vZGUgY3VycmVudE5vZGUgPSBnZXRDdXJyZW50Tm9kZShkb2N1bWVudCwgcmVnaW9uLmdldE9mZnNldCgpKTsKLQkJCWlmIChjdXJyZW50Tm9kZSAhPSBudWxsKSB7Ci0JCQkJU3RyaW5nIHVyaVN0cmluZyA9IG51bGw7Ci0JCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCQkJLy8gZG9jdHlwZSBub2RlcwotCQkJCQl1cmlTdHJpbmcgPSBnZXRVUklTdHJpbmcoY3VycmVudE5vZGUsIGRvY3VtZW50KTsKLQkJCQl9Ci0JCQkJZWxzZSBpZiAoY3VycmVudE5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkvLyBlbGVtZW50IG5vZGVzCi0JCQkJCUF0dHIgY3VycmVudEF0dHIgPSBnZXRDdXJyZW50QXR0ck5vZGUoY3VycmVudE5vZGUsIHJlZ2lvbi5nZXRPZmZzZXQoKSk7Ci0JCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBsaW5rIGZvciBjdXJyZW50IGF0dHJpYnV0ZQotCQkJCQkJLy8gcmVzb2x2ZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCQkJCXVyaVN0cmluZyA9IGdldFVSSVN0cmluZyhjdXJyZW50QXR0ciwgZG9jdW1lbnQpOwotCQkJCQkJLy8gdmVyaWZ5IHZhbGlkaXR5IG9mIHVyaSBzdHJpbmcKLQkJCQkJCWlmICh1cmlTdHJpbmcgPT0gbnVsbCB8fCAhaXNWYWxpZFVSSSh1cmlTdHJpbmcpKQotCQkJCQkJCS8vIHJlc2V0IGN1cnJlbnQgYXR0cmlidXRlCi0JCQkJCQkJY3VycmVudEF0dHIgPSBudWxsOwotCQkJCQl9Ci0JCQkJCWlmIChjdXJyZW50QXR0ciA9PSBudWxsKSB7Ci0JCQkJCQkvLyB0cnkgdG8gZmluZCBhIGxpbmthYmxlIGF0dHJpYnV0ZSB3aXRoaW4gZWxlbWVudAotCQkJCQkJY3VycmVudEF0dHIgPSBnZXRMaW5rYWJsZUF0dHIoKEVsZW1lbnQpIGN1cnJlbnROb2RlKTsKLQkJCQkJCWlmIChjdXJyZW50QXR0ciAhPSBudWxsKSB7Ci0JCQkJCQkJdXJpU3RyaW5nID0gZ2V0VVJJU3RyaW5nKGN1cnJlbnRBdHRyLCBkb2N1bWVudCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJY3VycmVudE5vZGUgPSBjdXJyZW50QXR0cjsKLQkJCQl9Ci0JCQkJLy8gdHJ5IHRvIGNyZWF0ZSBoeXBlcmxpbmsgZnJvbSBpbmZvcm1hdGlvbiBnYXRoZXJlZAotCQkJCWlmICh1cmlTdHJpbmcgIT0gbnVsbCAmJiBjdXJyZW50Tm9kZSAhPSBudWxsICYmIGlzVmFsaWRVUkkodXJpU3RyaW5nKSkgewotCQkJCQlJUmVnaW9uIGh5cGVybGlua1JlZ2lvbiA9IGdldEh5cGVybGlua1JlZ2lvbihjdXJyZW50Tm9kZSk7Ci0JCQkJCUlIeXBlcmxpbmsgaHlwZXJsaW5rID0gY3JlYXRlSHlwZXJsaW5rKHVyaVN0cmluZywgaHlwZXJsaW5rUmVnaW9uLCBkb2N1bWVudCwgY3VycmVudE5vZGUpOwotCQkJCQlpZiAoaHlwZXJsaW5rICE9IG51bGwpIHsKLQkJCQkJCWh5cGVybGlua3MuYWRkKGh5cGVybGluayk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJaWYgKGh5cGVybGlua3Muc2l6ZSgpID09IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIChJSHlwZXJsaW5rW10pIGh5cGVybGlua3MudG9BcnJheShuZXcgSUh5cGVybGlua1swXSk7Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBiYXNlIGxvY2F0aW9uIGZyb20gdGhlIGN1cnJlbnQgbW9kZWwgKGxvY2FsIGZpbGUgc3lzdGVtKQotCSAqLwotCXByaXZhdGUgU3RyaW5nIGdldEJhc2VMb2NhdGlvbihJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCi0JCS8vIGdldCB0aGUgYmFzZSBsb2NhdGlvbiBmcm9tIHRoZSBjdXJyZW50IG1vZGVsCi0JCUlTdHJ1Y3R1cmVkTW9kZWwgc01vZGVsID0gbnVsbDsKLQkJdHJ5IHsKLQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZG9jdW1lbnQpOwotCQkJaWYgKHNNb2RlbCAhPSBudWxsKSB7Ci0JCQkJSVBhdGggbG9jYXRpb24gPSBuZXcgUGF0aChzTW9kZWwuZ2V0QmFzZUxvY2F0aW9uKCkpOwotCQkJCWlmIChsb2NhdGlvbi50b0ZpbGUoKS5leGlzdHMoKSkgewotCQkJCQliYXNlTG9jID0gbG9jYXRpb24udG9TdHJpbmcoKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChsb2NhdGlvbi5zZWdtZW50Q291bnQoKSA+IDEpCi0JCQkJCQliYXNlTG9jID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKGxvY2F0aW9uKS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCk7Ci0JCQkJCWVsc2UKLQkJCQkJCWJhc2VMb2MgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmdldExvY2F0aW9uKCkuYXBwZW5kKGxvY2F0aW9uKS50b1N0cmluZygpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCXNNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4gYmFzZUxvYzsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgdGhlIENNRWxlbWVudERlY2xhcmF0aW9uIGZvciBhbiBlbGVtZW50Ci0JICogCi0JICogQHBhcmFtIGVsZW1lbnQKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uCi0JICovCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbihFbGVtZW50IGVsZW1lbnQpIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBudWxsOwotCi0JCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJaWYgKG1xICE9IG51bGwpIHsKLQkJCWVkID0gbXEuZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oZWxlbWVudCk7Ci0JCX0KLQkJcmV0dXJuIGVkOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBub2RlIHdpdGhpbiBub2RlIGF0IG9mZnNldAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHBhcmFtIG9mZnNldAotCSAqIEByZXR1cm4gQXR0cgotCSAqLwotCXByaXZhdGUgQXR0ciBnZXRDdXJyZW50QXR0ck5vZGUoTm9kZSBub2RlLCBpbnQgb2Zmc2V0KSB7Ci0JCWlmICgobm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pICYmICgoSW5kZXhlZFJlZ2lvbikgbm9kZSkuY29udGFpbnMob2Zmc2V0KSAmJiAobm9kZS5oYXNBdHRyaWJ1dGVzKCkpKSB7Ci0JCQlOYW1lZE5vZGVNYXAgYXR0cnMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCS8vIGdvIHRocm91Z2ggZWFjaCBhdHRyaWJ1dGUgaW4gbm9kZSBhbmQgaWYgYXR0cmlidXRlIGNvbnRhaW5zCi0JCQkvLyBvZmZzZXQsIHJldHVybiB0aGF0IGF0dHJpYnV0ZQotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRycy5nZXRMZW5ndGgoKTsgKytpKSB7Ci0JCQkJLy8gYXNzdW1wdGlvbiB0aGF0IGlmIHBhcmVudCBub2RlIGlzIG9mIHR5cGUgSW5kZXhlZFJlZ2lvbiwKLQkJCQkvLyB0aGVuIGl0cyBhdHRyaWJ1dGVzIHdpbGwgYWxzbyBiZSBvZiB0eXBlIEluZGV4ZWRSZWdpb24KLQkJCQlJbmRleGVkUmVnaW9uIGF0dFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBhdHRycy5pdGVtKGkpOwotCQkJCWlmIChhdHRSZWdpb24uY29udGFpbnMob2Zmc2V0KSkgewotCQkJCQlyZXR1cm4gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIG5vZGUgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gaW4gdGhlIGRvY3VtZW50LiBudWxsIGlmIG5vCi0JICogbm9kZSBpcyBzZWxlY3RlZAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiBAcmV0dXJuIE5vZGUgZWl0aGVyIGVsZW1lbnQsIGRvY3R5cGUsIHRleHQsIG9yIG51bGwKLQkgKi8KLQlwcml2YXRlIE5vZGUgZ2V0Q3VycmVudE5vZGUoSURvY3VtZW50IGRvY3VtZW50LCBpbnQgb2Zmc2V0KSB7Ci0JCS8vIGdldCB0aGUgY3VycmVudCBub2RlIGF0IHRoZSBvZmZzZXQgKHJldHVybnMgZWl0aGVyOiBlbGVtZW50LAotCQkvLyBkb2N0eXBlLCB0ZXh0KQotCQlJbmRleGVkUmVnaW9uIGlub2RlID0gbnVsbDsKLQkJSVN0cnVjdHVyZWRNb2RlbCBzTW9kZWwgPSBudWxsOwotCQl0cnkgewotCQkJc01vZGVsID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKS5nZXRFeGlzdGluZ01vZGVsRm9yUmVhZChkb2N1bWVudCk7Ci0JCQlpZihzTW9kZWwgIT0gbnVsbCkgewotCQkJCWlub2RlID0gc01vZGVsLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJCQlpZiAoaW5vZGUgPT0gbnVsbCkKLQkJCQkJaW5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihvZmZzZXQgLSAxKTsKLQkJCX0KLQkJfQotCQlmaW5hbGx5IHsKLQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCX0KLQotCQlpZiAoaW5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlyZXR1cm4gKE5vZGUpIGlub2RlOwotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYW4gSUZpbGUgZnJvbSB0aGUgZ2l2ZW4gdXJpIGlmIHBvc3NpYmxlLCBudWxsIGlmIGNhbm5vdCBmaW5kCi0JICogZmlsZSBmcm9tIHVyaS4KLQkgKiAKLQkgKiBAcGFyYW0gZmlsZVN0cmluZwotCSAqICAgICAgICAgICAgZmlsZSBzeXN0ZW0gcGF0aAotCSAqIEByZXR1cm4gcmV0dXJucyBJRmlsZSBpZiBmaWxlU3RyaW5nIGV4aXN0cyBpbiB0aGUgd29ya3NwYWNlCi0JICovCi0JcHJpdmF0ZSBJRmlsZSBnZXRGaWxlKFN0cmluZyBmaWxlU3RyaW5nKSB7Ci0JCUlGaWxlIGZpbGUgPSBudWxsOwotCi0JCWlmIChmaWxlU3RyaW5nICE9IG51bGwpIHsKLQkJCUlGaWxlW10gZmlsZXMgPSBSZXNvdXJjZXNQbHVnaW4uZ2V0V29ya3NwYWNlKCkuZ2V0Um9vdCgpLmZpbmRGaWxlc0ZvckxvY2F0aW9uKG5ldyBQYXRoKGZpbGVTdHJpbmcpKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoICYmIGZpbGUgPT0gbnVsbDsgaSsrKQotCQkJCWlmIChmaWxlc1tpXS5leGlzdHMoKSkKLQkJCQkJZmlsZSA9IGZpbGVzW2ldOwotCQl9Ci0KLQkJcmV0dXJuIGZpbGU7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlIGEgZmlsZSBmcm9tIHRoZSBnaXZlbiB1cmkgc3RyaW5nCi0JICogCi0JICogQHBhcmFtIHVyaVN0cmluZyAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHVyaVN0cmluZyBpcyBub3QgaHR0cDovLwotCSAqIEByZXR1cm4gRmlsZSBjcmVhdGVkIGZyb20gdXJpU3RyaW5nIGlmIHBvc3NpYmxlLCBudWxsIG90aGVyd2lzZQotCSAqLwotCXByaXZhdGUgRmlsZSBnZXRGaWxlRnJvbVVyaVN0cmluZyhTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCUZpbGUgZmlsZSA9IG51bGw7Ci0JCXRyeSB7Ci0JCQkvLyBmaXJzdCBqdXN0IHRyeSB0byBjcmVhdGUgYSBmaWxlIGRpcmVjdGx5IGZyb20gdXJpU3RyaW5nIGFzCi0JCQkvLyBkZWZhdWx0IGluIGNhc2UgY3JlYXRlIGZpbGUgZnJvbSB1cmkgZG9lcyBub3Qgd29yawotCQkJZmlsZSA9IG5ldyBGaWxlKHVyaVN0cmluZyk7Ci0KLQkJCS8vIHRyeSB0byBjcmVhdGUgZmlsZSBmcm9tIHVyaQotCQkJVVJJIHVyaSA9IG5ldyBVUkkodXJpU3RyaW5nKTsKLQkJCWZpbGUgPSBuZXcgRmlsZSh1cmkpOwotCQl9Ci0JCWNhdGNoIChFeGNlcHRpb24gZSkgewotCQkJLy8gaWYgZXhjZXB0aW9uIGlzIHRocm93biB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIEZpbGUganVzdCBpZ25vcmUKLQkJCS8vIGFuZCBmaWxlIHdpbGwgYmUgbnVsbAotCQl9Ci0JCXJldHVybiBmaWxlOwotCX0KLQotCXByaXZhdGUgSVJlZ2lvbiBnZXRIeXBlcmxpbmtSZWdpb24oTm9kZSBub2RlKSB7Ci0JCUlSZWdpb24gaHlwZXJSZWdpb24gPSBudWxsOwotCi0JCWlmIChub2RlICE9IG51bGwpIHsKLQkJCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkJaWYgKG5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfVFlQRV9OT0RFKSB7Ci0JCQkJLy8gaGFuZGxlIGRvYyB0eXBlIG5vZGUKLQkJCQlJRE9NTm9kZSBkb2NOb2RlID0gKElET01Ob2RlKSBub2RlOwotCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCksIGRvY05vZGUuZ2V0RW5kT2Zmc2V0KCkgLSBkb2NOb2RlLmdldFN0YXJ0T2Zmc2V0KCkpOwotCQkJfQotCQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCS8vIGhhbmRsZSBhdHRyaWJ1dGUgbm9kZXMKLQkJCQlJRE9NQXR0ciBhdHQgPSAoSURPTUF0dHIpIG5vZGU7Ci0JCQkJLy8gZG8gbm90IGluY2x1ZGUgcXVvdGVzIGluIGF0dHJpYnV0ZSB2YWx1ZSByZWdpb24KLQkJCQlpbnQgcmVnT2Zmc2V0ID0gYXR0LmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKTsKLQkJCQlJVGV4dFJlZ2lvbiB2YWx1ZVJlZ2lvbiA9IGF0dC5nZXRWYWx1ZVJlZ2lvbigpOwotCQkJCWlmICh2YWx1ZVJlZ2lvbiAhPSBudWxsKSB7Ci0JCQkJCWludCByZWdMZW5ndGggPSB2YWx1ZVJlZ2lvbi5nZXRUZXh0TGVuZ3RoKCk7Ci0JCQkJCVN0cmluZyBhdHRWYWx1ZSA9IGF0dC5nZXRWYWx1ZVJlZ2lvblRleHQoKTsKLQkJCQkJaWYgKFN0cmluZ1V0aWxzLmlzUXVvdGVkKGF0dFZhbHVlKSkgewotCQkJCQkJKytyZWdPZmZzZXQ7Ci0JCQkJCQlyZWdMZW5ndGggPSByZWdMZW5ndGggLSAyOwotCQkJCQl9Ci0JCQkJCWh5cGVyUmVnaW9uID0gbmV3IFJlZ2lvbihyZWdPZmZzZXQsIHJlZ0xlbmd0aCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBoeXBlclJlZ2lvbjsKLQl9Ci0KLQkvKioKLQkgKiBBdHRlbXB0cyB0byBmaW5kIGFuIGF0dHJpYnV0ZSB3aXRoaW4gZWxlbWVudCB0aGF0IGlzIG9wZW5hYmxlLgotCSAqIAotCSAqIEBwYXJhbSBlbGVtZW50IC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHJldHVybiBBdHRyIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSB1c2VkIGZvciBvcGVuIG9uLCBudWxsIGlmIG5vCi0JICogICAgICAgICBhdHRyaWJ1dGUgY291bGQgYmUgZm91bmQKLQkgKi8KLQlwcml2YXRlIEF0dHIgZ2V0TGlua2FibGVBdHRyKEVsZW1lbnQgZWxlbWVudCkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotCQkvLyBnZXQgdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IgdGhpcyBub2RlCi0JCU5hbWVkTm9kZU1hcCBhdHRycyA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlcygpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJzLmdldExlbmd0aCgpOyArK2kpIHsKLQkJCS8vIGNoZWNrIGlmIHRoaXMgYXR0cmlidXRlIGlzICJvcGVuT24tYWJsZSIKLQkJCUF0dHIgYXR0ID0gKEF0dHIpIGF0dHJzLml0ZW0oaSk7Ci0JCQlpZiAoaXNMaW5rYWJsZUF0dHIoYXR0LCBlZCkpIHsKLQkJCQlyZXR1cm4gYXR0OwotCQkJfQotCQl9Ci0JCXJldHVybiBudWxsOwotCX0KLQotCS8qKgotCSAqIEZpbmQgdGhlIGxvY2F0aW9uIGhpbnQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2VVUkkgaWYgaXQgZXhpc3RzCi0JICogCi0JICogQHBhcmFtIGVsZW1lbnROb2RlIC0KLQkgKiAgICAgICAgICAgIGNhbm5vdCBiZSBudWxsCi0JICogQHBhcmFtIG5hbWVzcGFjZVVSSSAtCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEByZXR1cm4gbG9jYXRpb24gaGludCAoc3lzdGVtSWQpIGlmIGl0IHdhcyBmb3VuZCwgbnVsbCBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRMb2NhdGlvbkhpbnQoRWxlbWVudCBlbGVtZW50Tm9kZSwgU3RyaW5nIG5hbWVzcGFjZVVSSSkgewotCQlBdHRyIHNjaGVtYUxvY05vZGUgPSBlbGVtZW50Tm9kZS5nZXRBdHRyaWJ1dGVOb2RlTlMoWFNJX05BTUVTUEFDRV9VUkksIFNDSEVNQV9MT0NBVElPTik7Ci0JCWlmIChzY2hlbWFMb2NOb2RlICE9IG51bGwpIHsKLQkJCVN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoc2NoZW1hTG9jTm9kZS5nZXRWYWx1ZSgpKTsKLQkJCXdoaWxlIChzdC5oYXNNb3JlVG9rZW5zKCkpIHsKLQkJCQlTdHJpbmcgcHVibGljSWQgPSBzdC5oYXNNb3JlVG9rZW5zKCkgPyBzdC5uZXh0VG9rZW4oKSA6IG51bGw7Ci0JCQkJU3RyaW5nIHN5c3RlbUlkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCS8vIGZvdW5kIGxvY2F0aW9uIGhpbnQKLQkJCQlpZiAobmFtZXNwYWNlVVJJLmVxdWFsc0lnbm9yZUNhc2UocHVibGljSWQpKQotCQkJCQlyZXR1cm4gc3lzdGVtSWQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgVVJJIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSBub2RlIC0KLQkgKiAgICAgICAgICAgIGFzc3VtZXMgbm90IG51bGwKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRVUklTdHJpbmcoTm9kZSBub2RlLCBJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJU3RyaW5nIHJlc29sdmVkVVJJID0gbnVsbDsKLQkJLy8gbmVlZCB0aGUgYmFzZSBsb2NhdGlvbiwgcHVibGljSWQsIGFuZCBzeXN0ZW1JZCBmb3IgVVJJUmVzb2x2ZXIKLQkJU3RyaW5nIGJhc2VMb2MgPSBudWxsOwotCQlTdHJpbmcgcHVibGljSWQgPSBudWxsOwotCQlTdHJpbmcgc3lzdGVtSWQgPSBudWxsOwotCi0JCXNob3J0IG5vZGVUeXBlID0gbm9kZS5nZXROb2RlVHlwZSgpOwotCQkvLyBoYW5kbGUgZG9jIHR5cGUgbm9kZQotCQlpZiAobm9kZVR5cGUgPT0gTm9kZS5ET0NVTUVOVF9UWVBFX05PREUpIHsKLQkJCWJhc2VMb2MgPSBnZXRCYXNlTG9jYXRpb24oZG9jdW1lbnQpOwotCQkJcHVibGljSWQgPSAoKERvY3VtZW50VHlwZSkgbm9kZSkuZ2V0UHVibGljSWQoKTsKLQkJCXN5c3RlbUlkID0gKChEb2N1bWVudFR5cGUpIG5vZGUpLmdldFN5c3RlbUlkKCk7Ci0JCX0KLQkJZWxzZSBpZiAobm9kZVR5cGUgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJLy8gaGFuZGxlIGF0dHJpYnV0ZSBub2RlCi0JCQlBdHRyIGF0dHJOb2RlID0gKEF0dHIpIG5vZGU7Ci0JCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyTm9kZS5nZXROYW1lKCk7Ci0JCQlTdHJpbmcgYXR0clZhbHVlID0gYXR0ck5vZGUuZ2V0VmFsdWUoKTsKLQkJCWF0dHJWYWx1ZSA9IFN0cmluZ1V0aWxzLnN0cmlwKGF0dHJWYWx1ZSk7Ci0JCQlpZiAoYXR0clZhbHVlICE9IG51bGwgJiYgYXR0clZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCWJhc2VMb2MgPSBnZXRCYXNlTG9jYXRpb24oZG9jdW1lbnQpOwotCQkJCQotCQkJCS8vIGhhbmRsZSBzY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUKLQkJCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCQkJU3RyaW5nIHVucHJlZml4ZWROYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dHJOYW1lKTsKLQkJCQlpZiAoKFhNTE5TLmVxdWFscyhwcmVmaXgpKSB8fCAoWE1MTlMuZXF1YWxzKHVucHJlZml4ZWROYW1lKSkpIHsKLQkJCQkJcHVibGljSWQgPSBhdHRyVmFsdWU7Ci0JCQkJCXN5c3RlbUlkID0gZ2V0TG9jYXRpb25IaW50KGF0dHJOb2RlLmdldE93bmVyRWxlbWVudCgpLCBwdWJsaWNJZCk7Ci0JCQkJCWlmIChzeXN0ZW1JZCA9PSBudWxsKSB7Ci0JCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0ck5vZGUpKSkgJiYgKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkgewotCQkJCQkvLyBmb3Igbm93IGp1c3QgdXNlIHRoZSBmaXJzdCBwYWlyCi0JCQkJCS8vIG5lZWQgdG8gbG9vayBpbnRvIGJlaW5nIG1vcmUgcHJlY2lzZQotCQkJCQlTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGF0dHJWYWx1ZSk7Ci0JCQkJCXB1YmxpY0lkID0gc3QuaGFzTW9yZVRva2VucygpID8gc3QubmV4dFRva2VuKCkgOiBudWxsOwotCQkJCQlzeXN0ZW1JZCA9IHN0Lmhhc01vcmVUb2tlbnMoKSA/IHN0Lm5leHRUb2tlbigpIDogbnVsbDsKLQkJCQkJLy8gZWxzZSBjaGVjayBpZiB4bWxucyBwdWJsaWNJZCA9IHZhbHVlCi0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlzeXN0ZW1JZCA9IGF0dHJWYWx1ZTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlyZXNvbHZlZFVSSSA9IHJlc29sdmVVUkkoYmFzZUxvYywgcHVibGljSWQsIHN5c3RlbUlkKTsKLQkJcmV0dXJuIHJlc29sdmVkVVJJOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHVyaVN0cmluZyBpcyBhbiBodHRwIHN0cmluZwotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIHRydWUgaWYgdXJpU3RyaW5nIGlzIGh0dHAgc3RyaW5nLCBmYWxzZSBvdGhlcndpc2UKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNIdHRwKFN0cmluZyB1cmlTdHJpbmcpIHsKLQkJYm9vbGVhbiBpc0h0dHAgPSBmYWxzZTsKLQkJaWYgKHVyaVN0cmluZyAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgdGVtcFN0cmluZyA9IHVyaVN0cmluZy50b0xvd2VyQ2FzZSgpOwotCQkJaWYgKHRlbXBTdHJpbmcuc3RhcnRzV2l0aChIVFRQX1BST1RPQ09MKSkKLQkJCQlpc0h0dHAgPSB0cnVlOwotCQl9Ci0JCXJldHVybiBpc0h0dHA7Ci0JfQotCi0JLyoqCi0JICogQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gYXR0cmlidXRlIGlzIG9wZW5hYmxlLiBBdHRyaWJ1dGUgaXMgb3BlbmFibGUKLQkgKiBpZiBpdCBpcyBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBhdHRyaWJ1dGUgb3IgaWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcwotCSAqIG9mIHR5cGUgVVJJLgotCSAqIAotCSAqIEBwYXJhbSBhdHRyCi0JICogICAgICAgICAgICBjYW5ub3QgYmUgbnVsbAotCSAqIEBwYXJhbSBjbUVsZW1lbnQKLQkgKiAgICAgICAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXR0cmlidXRlIChjYW4gYmUKLQkgKiAgICAgICAgICAgIG51bGwpCi0JICogQHJldHVybiB0cnVlIGlmIHRoaXMgYXR0cmlidXRlIGlzICJvcGVuT24tYWJsZSIgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTGlua2FibGVBdHRyKEF0dHIgYXR0ciwgQ01FbGVtZW50RGVjbGFyYXRpb24gY21FbGVtZW50KSB7Ci0JCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0TmFtZSgpOwotCQlTdHJpbmcgcHJlZml4ID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFByZWZpeChhdHRyTmFtZSk7Ci0JCVN0cmluZyB1bnByZWZpeGVkTmFtZSA9IERPTU5hbWVzcGFjZUhlbHBlci5nZXRVbnByZWZpeGVkTmFtZShhdHRyTmFtZSk7Ci0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgaXMgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0JCWlmICgoWE1MTlMuZXF1YWxzKHByZWZpeCkpIHx8IChYTUxOUy5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkKLQkJCXJldHVybiB0cnVlOwotCi0JCS8vIGRldGVybWluZSBpZiBhdHRyaWJ1dGUgY29udGFpbnMgc2NoZW1hIGxvY2F0aW9uCi0JCWlmICgoWFNJX05BTUVTUEFDRV9VUkkuZXF1YWxzKERPTU5hbWVzcGFjZUhlbHBlci5nZXROYW1lc3BhY2VVUkkoYXR0cikpKSAmJiAoKFNDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSB8fCAoTk9fTkFNRVNQQUNFX1NDSEVNQV9MT0NBVElPTi5lcXVhbHModW5wcmVmaXhlZE5hbWUpKSkpCi0JCQlyZXR1cm4gdHJ1ZTsKLQotCQkvLyBkZXRlcm1pbmUgaWYgYXR0cmlidXRlIHZhbHVlIGlzIG9mIHR5cGUgVVJJCi0JCWlmIChjbUVsZW1lbnQgIT0gbnVsbCkgewotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBjbUVsZW1lbnQuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyTmFtZSk7Ci0JCQlpZiAoKGF0dHJEZWNsICE9IG51bGwpICYmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpICYmIChDTURhdGFUeXBlLlVSSS5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJcmV0dXJuIHRydWU7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB1cmlTdHJpbmcgaXMgcmVhbGx5IHBvaW50aW5nIHRvIGEgZmlsZQotCSAqIAotCSAqIEBwYXJhbSB1cmlTdHJpbmcKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNWYWxpZFVSSShTdHJpbmcgdXJpU3RyaW5nKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCi0JCWlmIChpc0h0dHAodXJpU3RyaW5nKSkKLQkJCWlzVmFsaWQgPSB0cnVlOwotCQllbHNlIHsKLQkJCUZpbGUgZmlsZSA9IGdldEZpbGVGcm9tVXJpU3RyaW5nKHVyaVN0cmluZyk7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKQotCQkJCWlzVmFsaWQgPSBmaWxlLmlzRmlsZSgpOwotCQl9Ci0JCXJldHVybiBpc1ZhbGlkOwotCX0KLQotCS8qKgotCSAqIFJlc29sdmVzIHRoZSBnaXZlbiBVUkkgaW5mb3JtYXRpb24KLQkgKiAKLQkgKiBAcGFyYW0gYmFzZUxvY2F0aW9uCi0JICogQHBhcmFtIHB1YmxpY0lkCi0JICogQHBhcmFtIHN5c3RlbUlkCi0JICogQHJldHVybiBTdHJpbmcgcmVzb2x2ZWQgdXJpLgotCSAqLwotCXByaXZhdGUgU3RyaW5nIHJlc29sdmVVUkkoU3RyaW5nIGJhc2VMb2NhdGlvbiwgU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKLQkJLy8gZG9udCByZXNvbHZlIGlmIHRoZXJlJ3Mgbm90aGluZyB0byByZXNvbHZlCi0JCWlmICgoYmFzZUxvY2F0aW9uID09IG51bGwpICYmIChwdWJsaWNJZCA9PSBudWxsKSAmJiAoc3lzdGVtSWQgPT0gbnVsbCkpCi0JCQlyZXR1cm4gbnVsbDsKLQkJcmV0dXJuIFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIHB1YmxpY0lkLCBzeXN0ZW1JZCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzQ29udHJvbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzQ29udHJvbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDViYzk4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwubnNlZGl0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS53aW5kb3cuV2luZG93OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5CdXR0b247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBhcnQuUGFnZUJvb2s7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlci5pbnRlcm5hbC5wcm92aXNpb25hbC5VUklSZXNvbHZlclBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnV0aWwuVVJJSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmRpYWxvZ3MuU2VsZWN0RmlsZU9yWE1MQ2F0YWxvZ0lkRGlhbG9nOwotCi1wdWJsaWMgY2xhc3MgQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2wgZXh0ZW5kcyBDb21wb3NpdGUgaW1wbGVtZW50cyBTZWxlY3Rpb25MaXN0ZW5lciB7Ci0KLQljbGFzcyBFZGl0TmFtZXNwYWNlQ29udHJvbCBleHRlbmRzIENvbXBvc2l0ZSB7Ci0JCXByb3RlY3RlZCBCdXR0b24gYnJvd3NlQnV0dG9uOwotCQlUZXh0IGxvY2F0aW9uSGludEZpZWxkOwotCQlUZXh0IHByZWZpeEZpZWxkOwotCQlUZXh0IHVyaUZpZWxkOwotCi0JCS8vcHJvdGVjdGVkIE5hbWVzcGFjZUluZm8gaW5mbzsKLQotCQlwdWJsaWMgRWRpdE5hbWVzcGFjZUNvbnRyb2woQ29tcG9zaXRlIHBhcmVudCkgewotCQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7IC8vQk9SREVSKTsKLQkJCXNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQkJCXNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0aGlzLCBTV1QuTk9ORSk7Ci0JCQlsYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0VOVEVSX1JFUV9QUkVGSVhfQU5EX05BTUVTUEFDRSk7IC8vJE5PTi1OTFMtMSQKLQotCQkJQ29tcG9zaXRlIGNvbXBvc2l0ZSA9IG5ldyBDb21wb3NpdGUodGhpcywgU1dULk5PTkUpOwotCQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQkJbGF5b3V0Lm51bUNvbHVtbnMgPSAzOwotCQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJCWxheW91dC52ZXJ0aWNhbFNwYWNpbmcgPSAxOwotCQkJY29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCi0JCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQkJZ2Qud2lkdGhIaW50ID0gMzUwOwotCQkJY29tcG9zaXRlLnNldExheW91dERhdGEoZ2QpOwotCi0JCQkvLyByb3cgMQotCQkJLy8KLQkJCUxhYmVsIHByZWZpeExhYmVsID0gbmV3IExhYmVsKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJcHJlZml4TGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QUkVGSVhfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJCXByZWZpeEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlwcmVmaXhGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vcHJlZml4RmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoaW5mby5wcmVmaXgpKTsKLQkJCS8vcHJlZml4RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy9wcmVmaXhGaWVsZC5zZXRFbmFibGVkKGluZm8uZ2V0UHJvcGVydHkoInByZWZpeC1yZWFkT25seSIpID09Ci0JCQkvLyBudWxsKTsKLQkJCW5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQotCQkJLy8gcm93IDIKLQkJCS8vCi0JCQlMYWJlbCB1cmlMYWJlbCA9IG5ldyBMYWJlbChjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCXVyaUxhYmVsLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUVfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJCXVyaUZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQl1cmlGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vdXJpRmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoaW5mby51cmkpKTsKLQkJCS8vdXJpRmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy91cmlGaWVsZC5zZXRFbmFibGVkKGluZm8uZ2V0UHJvcGVydHkoInVyaS1yZWFkT25seSIpID09IG51bGwpOwotCi0JCQluZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0KLQkJCS8vIHJvdyAzCi0JCQkvLwotCQkJTGFiZWwgbG9jYXRpb25IaW50TGFiZWwgPSBuZXcgTGFiZWwoY29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCQlsb2NhdGlvbkhpbnRMYWJlbC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlRfQ09MT04pOyAvLyROT04tTkxTLTEkCi0KLQkJCWxvY2F0aW9uSGludEZpZWxkID0gbmV3IFRleHQoY29tcG9zaXRlLCBTV1QuU0lOR0xFIHwgU1dULkJPUkRFUik7Ci0JCQlsb2NhdGlvbkhpbnRGaWVsZC5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJCS8vbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dChnZXREaXNwbGF5VmFsdWUoaW5mby5sb2NhdGlvbkhpbnQpKTsKLQkJCS8vbG9jYXRpb25IaW50RmllbGQuYWRkTW9kaWZ5TGlzdGVuZXIobW9kaWZ5TGlzdGVuZXIpOwotCQkJLy9sb2NhdGlvbkhpbnRGaWVsZC5zZXRFbmFibGVkKGluZm8uZ2V0UHJvcGVydHkoImxvY2F0aW9uSGludC1yZWFkT25seSIpCi0JCQkvLyA9PSBudWxsKTsKLQotCQkJU2VsZWN0aW9uTGlzdGVuZXIgc2VsZWN0aW9uTGlzdGVuZXIgPSBuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJCXBlcmZvcm1Ccm93c2UoKTsKLQkJCQl9Ci0JCQl9OwotCi0JCQlicm93c2VCdXR0b24gPSBuZXcgQnV0dG9uKGNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQkJYnJvd3NlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfQlJPV1NFKTsgLy8kTk9OLU5MUy0xJAotCQkJYnJvd3NlQnV0dG9uLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHNlbGVjdGlvbkxpc3RlbmVyKTsKLQkJCWJyb3dzZUJ1dHRvbi5zZXRFbmFibGVkKGxvY2F0aW9uSGludEZpZWxkLmdldEVuYWJsZWQoKSk7Ci0JCX0KLQotCQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtQnJvd3NlKCkgewotCQkJU3RyaW5nW10gZXh0ZW5zaW9ucyA9IHsiLnhzZCJ9OyAvLyROT04tTkxTLTEkCi0JCQlTZWxlY3RGaWxlT3JYTUxDYXRhbG9nSWREaWFsb2cgZGlhbG9nID0gbmV3IFNlbGVjdEZpbGVPclhNTENhdGFsb2dJZERpYWxvZyhnZXRTaGVsbCgpLCBleHRlbnNpb25zKTsKLQkJCWRpYWxvZy5jcmVhdGUoKTsKLQkJCWRpYWxvZy5nZXRTaGVsbCgpLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfU0VMRUNUX0ZJTEUpOyAvLyROT04tTkxTLTEkCi0JCQlkaWFsb2cuc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCQlkaWFsb2cub3BlbigpOwotCi0JCQlpZiAoZGlhbG9nLmdldFJldHVybkNvZGUoKSA9PSBXaW5kb3cuT0spIHsKLQkJCQkvL1N0cmluZyBncmFtbWFyVVJJID0gbnVsbDsKLQkJCQlJRmlsZSBmaWxlID0gZGlhbG9nLmdldEZpbGUoKTsKLQkJCQlTdHJpbmcgaWQgPSBkaWFsb2cuZ2V0SWQoKTsKLQkJCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJCVN0cmluZyB1cmkgPSBudWxsOwotCQkJCQlpZiAocmVzb3VyY2VMb2NhdGlvbiAhPSBudWxsKSB7Ci0JCQkJCQl1cmkgPSBVUklIZWxwZXIuZ2V0UmVsYXRpdmVVUkkoZmlsZS5nZXRMb2NhdGlvbigpLCByZXNvdXJjZUxvY2F0aW9uKTsKLQkJCQkJCS8vZ3JhbW1hclVSSSA9IGZpbGUuZ2V0TG9jYXRpb24oKS50b09TU3RyaW5nKCk7Ci0JCQkJCX0gZWxzZSB7Ci0JCQkJCQl1cmkgPSBmaWxlLmdldExvY2F0aW9uKCkudG9PU1N0cmluZygpOwotCQkJCQkJLy9ncmFtbWFyVVJJID0gdXJpOwotCQkJCQl9Ci0JCQkJCWxvY2F0aW9uSGludEZpZWxkLnNldFRleHQodXJpKTsKLQkJCQl9IGVsc2UgaWYgKGlkICE9IG51bGwpIHsKLQkJCQkJbG9jYXRpb25IaW50RmllbGQuc2V0VGV4dChpZCk7Ci0JCQkJCS8vVVJJUmVzb2x2ZXIgcmVzb2x2ZXIgPSAKLQkJCQkJCVVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCk7Ci0JCQkJCS8vZ3JhbW1hclVSSSA9IHJlc29sdmVyLnJlc29sdmUobnVsbCwgaWQsIGlkKTsKLQkJCQl9Ci0KLQkJCQl0cnkgewotCQkJCQkvL1RPRE8gQ01Eb2N1bWVudCBkb2N1bWVudCA9Ci0JCQkJCS8vIENNRG9jdW1lbnRCdWlsZGVyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5idWlsZENNRG9jdW1lbnQoZ3JhbW1hclVSSSk7Ci0JCQkJCS8vCQkJCSBMaXN0IG5hbWVzcGFjZUluZm9MaXN0ID0KLQkJCQkJLy8gKExpc3QpZG9jdW1lbnQuZ2V0UHJvcGVydHkoImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uYW1lc3BhY2VJbmZvIik7Ci0JCQkJCS8vCQkJCSBOYW1lc3BhY2VJbmZvIGluZm8gPQotCQkJCQkvLyAoTmFtZXNwYWNlSW5mbyluYW1lc3BhY2VJbmZvTGlzdC5nZXQoMCk7Ci0JCQkJCS8vCQkJCSBpZiAodXJpRmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwICYmIGluZm8udXJpCi0JCQkJCS8vICE9IG51bGwpCi0JCQkJCS8vCQkJCSB7Ci0JCQkJCS8vCQkJCQkgdXJpRmllbGQuc2V0VGV4dChpbmZvLnVyaSk7Ci0JCQkJCS8vCQkJCSB9Ci0JCQkJCS8vCQkJCSBpZiAocHJlZml4RmllbGQuZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKSA9PSAwICYmCi0JCQkJCS8vIGluZm8ucHJlZml4ICE9IG51bGwpCi0JCQkJCS8vCQkJCSB7Ci0JCQkJCS8vCQkJCQkgcHJlZml4RmllbGQuc2V0VGV4dChpbmZvLnByZWZpeCk7Ci0JCQkJCS8vCQkJCSB9Ci0JCQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgQnV0dG9uIGRlbGV0ZUJ1dHRvbjsKLQlwcm90ZWN0ZWQgQnV0dG9uIGVkaXRCdXR0b247Ci0JcHJvdGVjdGVkIEVkaXROYW1lc3BhY2VDb250cm9sIGVkaXROYW1lc3BhY2VDb250cm9sOwotCXByb3RlY3RlZCBpbnQgaGVpZ2h0SGludCA9IDI1MDsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQlwcm90ZWN0ZWQgQnV0dG9uIG5ld0J1dHRvbjsKLQlwcm90ZWN0ZWQgUGFnZUJvb2sgcGFnZUJvb2s7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByYWRpbzE7Ci0JcHJvdGVjdGVkIEJ1dHRvbiByYWRpbzI7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSB0YWJsZVNlY3Rpb247Ci0JcHJvdGVjdGVkIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZSB0YWJsZVZpZXdlcjsKLQlwcm90ZWN0ZWQgaW50IHdpZHRoSGludCA9IDUwMDsKLQotCi0JcHVibGljIENvbW1vbkFkZE5hbWVzcGFjZXNDb250cm9sKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbikgewotCQlzdXBlcihwYXJlbnQsIHN0eWxlKTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJaWYgKHdpZHRoSGludCAhPSAtMSkgewotCQkJZ2Qud2lkdGhIaW50ID0gd2lkdGhIaW50OwotCQl9Ci0JCWlmIChoZWlnaHRIaW50ICE9IC0xKSB7Ci0JCQlnZC5oZWlnaHRIaW50ID0gaGVpZ2h0SGludDsKLQkJfQotCQlzZXRMYXlvdXREYXRhKGdkKTsKLQkJc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCi0JCXJhZGlvMSA9IG5ldyBCdXR0b24odGhpcywgU1dULlJBRElPKTsKLQkJcmFkaW8xLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfU0VMRUNUX1JFR0lTVEVSRURfTkFNRVNQQUNFUyk7IC8vJE5PTi1OTFMtMSQKLQkJcmFkaW8xLmFkZFNlbGVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCi0JCXJhZGlvMiA9IG5ldyBCdXR0b24odGhpcywgU1dULlJBRElPKTsKLQkJcmFkaW8yLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfU1BFQ0lGWV9ORVdfTkFNRVNQQUNFKTsgLy8kTk9OLU5MUy0xJAotCQlyYWRpbzIuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJTGFiZWwgc2VwYXJhdG9yID0gbmV3IExhYmVsKHRoaXMsIFNXVC5TRVBBUkFUT1IgfCBTV1QuSE9SSVpPTlRBTCk7Ci0JCXNlcGFyYXRvci5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpKTsKLQkJLy9Hcm91cCBuYW1lc3BhY2VJbmZvR3JvdXAgPSBuZXcgR3JvdXAodGhpcywgU1dULk5PTkUpOwotCQkvL25hbWVzcGFjZUluZm9Hcm91cC5zZXRUZXh0KCJOYW1lc3BhY2UgRGVjbGFyYXRpb25zIik7Ci0JCS8vIC8vWE1MQ29tbW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9MQUJFTF9YTUxfU0NIRU1BX0lORk9STUFUSU9OIikpOwotCQkvL25hbWVzcGFjZUluZm9Hcm91cC5zZXRMYXlvdXQobmV3IEdyaWRMYXlvdXQoMiwgZmFsc2UpKTsKLQkJLy9uYW1lc3BhY2VJbmZvR3JvdXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0JCXBhZ2VCb29rID0gbmV3IFBhZ2VCb29rKHRoaXMsIFNXVC5OT05FKTsKLQkJcGFnZUJvb2suc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKSk7Ci0KLQkJdGFibGVTZWN0aW9uID0gbmV3IENvbXBvc2l0ZShwYWdlQm9vaywgU1dULk5PTkUpOwotCQl0YWJsZVNlY3Rpb24uc2V0TGF5b3V0KG5ldyBHcmlkTGF5b3V0KCkpOwotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbCh0YWJsZVNlY3Rpb24sIFNXVC5OT05FKTsKLQkJbGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9TRUxFQ1RfTkFNRVNQQUNFX1RPX0FERCk7IC8vJE5PTi1OTFMtMSQKLQotCQl0YWJsZVZpZXdlciA9IG5ldyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUodGFibGVTZWN0aW9uLCBTV1QuQ0hFQ0ssIDYpOwotCQllZGl0TmFtZXNwYWNlQ29udHJvbCA9IG5ldyBFZGl0TmFtZXNwYWNlQ29udHJvbChwYWdlQm9vayk7Ci0JCXBhZ2VCb29rLnNob3dQYWdlKHRhYmxlU2VjdGlvbik7Ci0KLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCX0KLQotCi0KLQlwdWJsaWMgTGlzdCBnZXROYW1lc3BhY2VJbmZvTGlzdCgpIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpZiAocmFkaW8xLmdldFNlbGVjdGlvbigpKSB7Ci0JCQlUYWJsZUl0ZW1bXSBpdGVtcyA9IHRhYmxlVmlld2VyLmdldFRhYmxlKCkuZ2V0SXRlbXMoKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHsKLQkJCQlUYWJsZUl0ZW0gaXRlbSA9IGl0ZW1zW2ldOwotCQkJCWlmIChpdGVtLmdldENoZWNrZWQoKSkgewotCQkJCQlsaXN0LmFkZChpdGVtLmdldERhdGEoKSk7Ci0JCQkJfQotCQkJfQotCQl9IGVsc2UgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLQkJCWluZm8ucHJlZml4ID0gZWRpdE5hbWVzcGFjZUNvbnRyb2wucHJlZml4RmllbGQuZ2V0VGV4dCgpOwotCQkJaW5mby51cmkgPSBlZGl0TmFtZXNwYWNlQ29udHJvbC51cmlGaWVsZC5nZXRUZXh0KCk7Ci0JCQlpbmZvLmxvY2F0aW9uSGludCA9IGVkaXROYW1lc3BhY2VDb250cm9sLmxvY2F0aW9uSGludEZpZWxkLmdldFRleHQoKTsKLQkJCWxpc3QuYWRkKGluZm8pOwotCQl9Ci0JCXJldHVybiBsaXN0OwotCX0KLQotCXB1YmxpYyB2b2lkIHNldE5hbWVzcGFjZUluZm9MaXN0KExpc3QgbGlzdCkgewotCQluYW1lc3BhY2VJbmZvTGlzdCA9IGxpc3Q7Ci0JCXRhYmxlVmlld2VyLnNldElucHV0KG5hbWVzcGFjZUluZm9MaXN0KTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCB3aWRnZXREZWZhdWx0U2VsZWN0ZWQoU2VsZWN0aW9uRXZlbnQgZSkgewotCX0KLQotCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJaWYgKGUud2lkZ2V0ID09IHJhZGlvMSkgewotCQkJcGFnZUJvb2suc2hvd1BhZ2UodGFibGVTZWN0aW9uKTsKLQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSByYWRpbzIpIHsKLQkJCXBhZ2VCb29rLnNob3dQYWdlKGVkaXROYW1lc3BhY2VDb250cm9sKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uQWRkTmFtZXNwYWNlc0RpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwODRhZWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25BZGROYW1lc3BhY2VzRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQYXRoOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmRpYWxvZ3MuSURpYWxvZ0NvbnN0YW50czsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5SZWN0YW5nbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNoZWxsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5YTUxDb3JlUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jYXRhbG9nLnByb3Zpc2lvbmFsLklDYXRhbG9nRW50cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNhdGFsb2cucHJvdmlzaW9uYWwuSU5leHRDYXRhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotCi0KLQotcHVibGljIGNsYXNzIENvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2cgZXh0ZW5kcyBEaWFsb2cgewotCXByb3RlY3RlZCBDb21tb25BZGROYW1lc3BhY2VzQ29udHJvbCBhZGROYW1lc3BhY2VzQ29udHJvbDsKLQlwcm90ZWN0ZWQgTGlzdCBleGlzdGluZ05hbWVzcGFjZXM7Ci0JcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3Q7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBva0J1dHRvbjsKLQlwcm90ZWN0ZWQgSGFzaE1hcCBwcmVmZXJyZWRQcmVmaXhUYWJsZSA9IG5ldyBIYXNoTWFwKCk7Ci0JcHJvdGVjdGVkIElQYXRoIHJlc291cmNlTG9jYXRpb247Ci0JcHJvdGVjdGVkIFN0cmluZyB0aXRsZTsKLQotCXB1YmxpYyBDb21tb25BZGROYW1lc3BhY2VzRGlhbG9nKFNoZWxsIHBhcmVudFNoZWxsLCBTdHJpbmcgdGl0bGUsIElQYXRoIHJlc291cmNlTG9jYXRpb24sIExpc3QgZXhpc3RpbmdOYW1lc3BhY2VzKSB7Ci0JCXN1cGVyKHBhcmVudFNoZWxsKTsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJc2V0U2hlbGxTdHlsZShnZXRTaGVsbFN0eWxlKCkgfCBTV1QuUkVTSVpFKTsKLQkJdGhpcy50aXRsZSA9IHRpdGxlOwotCQl0aGlzLmV4aXN0aW5nTmFtZXNwYWNlcyA9IGV4aXN0aW5nTmFtZXNwYWNlczsKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsLyIsICJ3c2RsIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3dzZGwvc29hcC8iLCAic29hcCIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93c2RsL2h0dHAvIiwgImh0dHAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvd3NkbC9taW1lLyIsICJtaW1lIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQlwcmVmZXJyZWRQcmVmaXhUYWJsZS5wdXQoImh0dHA6Ly9zY2hlbWFzLnhtbHNvYXAub3JnL3NvYXAvZW5jb2RpbmcvIiwgInNvYXBlbmMiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3NjaGVtYXMueG1sc29hcC5vcmcvc29hcC9lbnZlbG9wZS8iLCAic29hcGVudiIpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJcHJlZmVycmVkUHJlZml4VGFibGUucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCXByZWZlcnJlZFByZWZpeFRhYmxlLnB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAieHNkIik7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZEJ1aWx0SW5OYW1lc3BhY2VzKExpc3QgbGlzdCkgewotCQlTdHJpbmcgeHNpTmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgeHNkTmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIjsgLy8kTk9OLU5MUy0xJAotCQlpZiAoIWlzQWxyZWFkeURlY2xhcmVkKHhzaU5hbWVzcGFjZSkpIHsKLQkJCWxpc3QuYWRkKG5ldyBOYW1lc3BhY2VJbmZvKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiLCBudWxsKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JCWlmICghaXNBbHJlYWR5RGVjbGFyZWQoeHNkTmFtZXNwYWNlKSkgewotCQkJbGlzdC5hZGQobmV3IE5hbWVzcGFjZUluZm8oImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgInhzZCIsIG51bGwpKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBhZGRDYXRhbG9nTWFwVG9MaXN0KElDYXRhbG9nIGNhdGFsb2csIExpc3QgbGlzdCkgewotCQlJQ2F0YWxvZ0VudHJ5W10gZW50cmllcyA9IGNhdGFsb2cuZ2V0Q2F0YWxvZ0VudHJpZXMoKTsKLQkJZm9yICggaW50IGkgPSAwOyBpIDwgZW50cmllcy5sZW5ndGg7IGkrKykgewotCQkJSUNhdGFsb2dFbnRyeSBlbnRyeSA9IGVudHJpZXNbaV07Ci0JCQlpZiAoZW50cnkuZ2V0RW50cnlUeXBlKCkgPT0gSUNhdGFsb2dFbnRyeS5FTlRSWV9UWVBFX1BVQkxJQyAmJiBlbnRyeS5nZXRVUkkoKS5lbmRzV2l0aCgiLnhzZCIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlpZiAoIWlzQWxyZWFkeURlY2xhcmVkKGVudHJ5LmdldEtleSgpKSkgewotCQkJCQlOYW1lc3BhY2VJbmZvIG5hbWVzcGFjZUluZm8gPSBuZXcgTmFtZXNwYWNlSW5mbyhlbnRyeS5nZXRLZXkoKSwgInh4IiwgbnVsbCk7IC8vJE5PTi1OTFMtMSQKLQkJCQkJbGlzdC5hZGQobmFtZXNwYWNlSW5mbyk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgYnV0dG9uUHJlc3NlZChpbnQgYnV0dG9uSWQpIHsKLQkJaWYgKGJ1dHRvbklkID09IElEaWFsb2dDb25zdGFudHMuT0tfSUQpIHsKLQkJCW5hbWVzcGFjZUluZm9MaXN0ID0gYWRkTmFtZXNwYWNlc0NvbnRyb2wuZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKTsKLQkJfQotCQlzdXBlci5idXR0b25QcmVzc2VkKGJ1dHRvbklkKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBjb21wdXRlQWRkYWJsZVByZWZpeGVzKExpc3QgYWRkYWJsZUxpc3QsIExpc3QgZXhpc2l0aW5nTGlzdCkgewotCQlIYXNoTWFwIG1hcCA9IG5ldyBIYXNoTWFwKCk7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGV4aXNpdGluZ0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoaW5mby5wcmVmaXggIT0gbnVsbCkgewotCQkJCW1hcC5wdXQoaW5mby5wcmVmaXgsIGluZm8pOwotCQkJfQotCQl9Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGFkZGFibGVMaXN0Lml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykgewotCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIGkubmV4dCgpOwotCQkJaWYgKGluZm8udXJpICE9IG51bGwpIHsKLQkJCQlTdHJpbmcgcHJlZml4ID0gKFN0cmluZykgcHJlZmVycmVkUHJlZml4VGFibGUuZ2V0KGluZm8udXJpKTsKLQkJCQlpbmZvLnByZWZpeCA9IGdldFVuaXF1ZVByZWZpeChtYXAsIHByZWZpeCwgaW5mby51cmkpOwotCQkJCW1hcC5wdXQoaW5mby5wcmVmaXgsIGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIGludCBjcmVhdGVBbmRPcGVuKCkgewotCQljcmVhdGUoKTsKLQkJZ2V0U2hlbGwoKS5zZXRUZXh0KHRpdGxlKTsKLQkJUmVjdGFuZ2xlIHIgPSBnZXRTaGVsbCgpLmdldEJvdW5kcygpOwotCQlnZXRTaGVsbCgpLnNldEJvdW5kcyhyLnggKyA4MCwgci55ICsgODAsIHIud2lkdGgsIHIuaGVpZ2h0KTsKLQkJc2V0QmxvY2tPbk9wZW4odHJ1ZSk7Ci0JCXJldHVybiBvcGVuKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9uc0ZvckJ1dHRvbkJhcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCW9rQnV0dG9uID0gY3JlYXRlQnV0dG9uKHBhcmVudCwgSURpYWxvZ0NvbnN0YW50cy5PS19JRCwgSURpYWxvZ0NvbnN0YW50cy5PS19MQUJFTCwgdHJ1ZSk7Ci0JCWNyZWF0ZUJ1dHRvbihwYXJlbnQsIElEaWFsb2dDb25zdGFudHMuQ0FOQ0VMX0lELCBJRGlhbG9nQ29uc3RhbnRzLkNBTkNFTF9MQUJFTCwgZmFsc2UpOwotCX0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZUNvbnRlbnRzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJQ29udHJvbCBjb250cm9sID0gc3VwZXIuY3JlYXRlQ29udGVudHMocGFyZW50KTsKLQkJcmV0dXJuIGNvbnRyb2w7Ci0JfQotCi0KLQotCXByb3RlY3RlZCBDb250cm9sIGNyZWF0ZURpYWxvZ0FyZWEoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgZGlhbG9nQXJlYSA9IChDb21wb3NpdGUpIHN1cGVyLmNyZWF0ZURpYWxvZ0FyZWEocGFyZW50KTsKLQkJYWRkTmFtZXNwYWNlc0NvbnRyb2wgPSBuZXcgQ29tbW9uQWRkTmFtZXNwYWNlc0NvbnRyb2woZGlhbG9nQXJlYSwgU1dULk5PTkUsIHJlc291cmNlTG9jYXRpb24pOwotCQlMaXN0IGxpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLQkJYWRkQnVpbHRJbk5hbWVzcGFjZXMobGlzdCk7Ci0JCUlDYXRhbG9nIGRlZmF1bHRDYXRhbG9nID0gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0RGVmYXVsdFhNTENhdGFsb2coKTsKLQkJSU5leHRDYXRhbG9nW10gbmV4dENhdGFsb2dzID0gZGVmYXVsdENhdGFsb2cuZ2V0TmV4dENhdGFsb2dzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmV4dENhdGFsb2dzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTmV4dENhdGFsb2cgY2F0YWxvZyA9IG5leHRDYXRhbG9nc1tpXTsKLSAgICAgICAgICAgIElDYXRhbG9nIHJlZmVyZW5jZWRDYXRhbG9nID0gY2F0YWxvZy5nZXRSZWZlcmVuY2VkQ2F0YWxvZygpOwotICAgICAgICAgICAgaWYgKHJlZmVyZW5jZWRDYXRhbG9nICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKFhNTENvcmVQbHVnaW4uVVNFUl9DQVRBTE9HX0lECi0gICAgICAgICAgICAgICAgICAgICAgICAuZXF1YWxzKHJlZmVyZW5jZWRDYXRhbG9nLmdldElkKCkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAJSUNhdGFsb2cgdXNlckNhdGFsb2cgPSByZWZlcmVuY2VkQ2F0YWxvZzsKLSAgICAgICAgICAgICAgICAJYWRkQ2F0YWxvZ01hcFRvTGlzdCh1c2VyQ2F0YWxvZywgbGlzdCk7Ci0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFhNTENvcmVQbHVnaW4uU1lTVEVNX0NBVEFMT0dfSUQKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocmVmZXJlbmNlZENhdGFsb2cuZ2V0SWQoKSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIAlJQ2F0YWxvZyBzeXN0ZW1DYXRhbG9nID0gcmVmZXJlbmNlZENhdGFsb2c7Ci0gICAgICAgICAgICAJCWFkZENhdGFsb2dNYXBUb0xpc3Qoc3lzdGVtQ2F0YWxvZywgbGlzdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0JCi0JCWNvbXB1dGVBZGRhYmxlUHJlZml4ZXMobGlzdCwgZXhpc3RpbmdOYW1lc3BhY2VzKTsKLQotCQlhZGROYW1lc3BhY2VzQ29udHJvbC5zZXROYW1lc3BhY2VJbmZvTGlzdChsaXN0KTsKLQkJcmV0dXJuIGRpYWxvZ0FyZWE7Ci0JfQotCi0JcHVibGljIExpc3QgZ2V0TmFtZXNwYWNlSW5mb0xpc3QoKSB7Ci0JCXJldHVybiBuYW1lc3BhY2VJbmZvTGlzdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIGdldFByZWZlcnJlZFByZWZpeChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCXJldHVybiAoU3RyaW5nKSBwcmVmZXJyZWRQcmVmaXhUYWJsZS5nZXQobmFtZXNwYWNlVVJJKTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVQcmVmaXgoSGFzaE1hcCBwcmVmaXhNYXAsIFN0cmluZyBwcmVmaXgsIFN0cmluZyB1cmkpIHsKLQkJaWYgKHByZWZpeCA9PSBudWxsKSB7Ci0JCQlpbnQgbGFzdEluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQlpZiAobGFzdEluZGV4ID09IHVyaS5sZW5ndGgoKSAtIDEpIHsKLQkJCQl1cmkgPSB1cmkuc3Vic3RyaW5nKDAsIGxhc3RJbmRleCk7Ci0JCQkJbGFzdEluZGV4ID0gdXJpLmxhc3RJbmRleE9mKCcvJyk7Ci0JCQl9Ci0JCQlwcmVmaXggPSB1cmkuc3Vic3RyaW5nKGxhc3RJbmRleCArIDEpOwotCQkJaWYgKHByZWZpeC5sZW5ndGgoKSA+IDIwIHx8IHByZWZpeC5pbmRleE9mKCc6JykgIT0gLTEpIHsKLQkJCQlwcmVmaXggPSBudWxsOwotCQkJfQotCQl9Ci0JCWlmIChwcmVmaXggPT0gbnVsbCkgewotCQkJcHJlZml4ID0gInAiOyAvLyROT04tTkxTLTEkCi0JCX0KLQkJaWYgKHByZWZpeE1hcC5nZXQocHJlZml4KSAhPSBudWxsKSB7Ci0JCQlTdHJpbmcgYmFzZSA9IHByZWZpeDsKLQkJCWZvciAoaW50IGNvdW50ID0gMDsgcHJlZml4TWFwLmdldChwcmVmaXgpICE9IG51bGw7IGNvdW50KyspIHsKLQkJCQlwcmVmaXggPSBiYXNlICsgY291bnQ7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHByZWZpeDsKLQl9Ci0KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0FscmVhZHlEZWNsYXJlZChTdHJpbmcgbmFtZXNwYWNlVVJJKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0JCWZvciAoSXRlcmF0b3IgaSA9IGV4aXN0aW5nTmFtZXNwYWNlcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspIHsKLQkJCU5hbWVzcGFjZUluZm8gbmFtZXNwYWNlSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBpLm5leHQoKTsKLQkJCWlmIChuYW1lc3BhY2VVUkkuZXF1YWxzKG5hbWVzcGFjZUluZm8udXJpKSkgewotCQkJCXJlc3VsdCA9IHRydWU7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMGQ5YzMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5uc2VkaXQ7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uQ2hhbmdlZExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TZWxlY3Rpb25DaGFuZ2VkRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uud2luZG93LldpbmRvdzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uTGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkTGF5b3V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuU2hlbGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLk5hbWVzcGFjZUluZm87Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kaWFsb2dzLkVkaXROYW1lc3BhY2VJbmZvRGlhbG9nOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuZGlhbG9ncy5OYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXI7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyB7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBjb21tb25Db21wb3NpdGU7Ci0JcHJvdGVjdGVkIEJ1dHRvbiBkZWxldGVCdXR0b247Ci0JcHJvdGVjdGVkIEJ1dHRvbiBlZGl0QnV0dG9uOwotCi0JcHJvdGVjdGVkIExhYmVsIGVycm9yTWVzc2FnZUxhYmVsOwotCXByb3RlY3RlZCBpbnQgaGVpZ2h0SGludCA9IDI1MDsKLQlwcm90ZWN0ZWQgTGlzdCBuYW1lc3BhY2VJbmZvTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCXByb3RlY3RlZCBCdXR0b24gbmV3QnV0dG9uOwotCXByb3RlY3RlZCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uOwotCi0JcHJpdmF0ZSBib29sZWFuIHNob3dMb2NhdGlvblRleHQgPSBmYWxzZTsKLQlwcm90ZWN0ZWQgU3RyaW5nIHRhYmxlTGFiZWwgPSAiIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUgdGFibGVWaWV3ZXI7Ci0KLQlwcm90ZWN0ZWQgQ29tcG9zaXRlIHRvcENvbXBvc2l0ZTsKLQlwcm90ZWN0ZWQgYm9vbGVhbiB1c2VHcm91cDsKLQlwcm90ZWN0ZWQgaW50IHdpZHRoSGludCA9IDUwMDsKLQotCXB1YmxpYyBDb21tb25FZGl0TmFtZXNwYWNlc0RpYWxvZyhDb21wb3NpdGUgcGFyZW50LCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uLCBTdHJpbmcgc3RyaW5nVGFibGVMYWJlbCkgewotCQl0aGlzKHBhcmVudCwgcmVzb3VyY2VMb2NhdGlvbiwgc3RyaW5nVGFibGVMYWJlbCwgZmFsc2UsIGZhbHNlKTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2coQ29tcG9zaXRlIHBhcmVudCwgSVBhdGggcmVzb3VyY2VMb2NhdGlvbiwgU3RyaW5nIHN0cmluZ1RhYmxlTGFiZWwsIGJvb2xlYW4gdXNlR3JvdXAsIGJvb2xlYW4gc2hvd0xvY1RleHQpIHsKLQkJdGhpcy5yZXNvdXJjZUxvY2F0aW9uID0gcmVzb3VyY2VMb2NhdGlvbjsKLQkJdGFibGVMYWJlbCA9IHN0cmluZ1RhYmxlTGFiZWw7Ci0JCXRoaXMudXNlR3JvdXAgPSB1c2VHcm91cDsKLQkJc2hvd0xvY2F0aW9uVGV4dCA9IHNob3dMb2NUZXh0OwotCi0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCk7Ci0JCWlmICh3aWR0aEhpbnQgIT0gLTEpIHsKLQkJCWdkLndpZHRoSGludCA9IHdpZHRoSGludDsKLQkJfQotCQlpZiAoaGVpZ2h0SGludCAhPSAtMSkgewotCQkJZ2QuaGVpZ2h0SGludCA9IGhlaWdodEhpbnQ7Ci0JCX0KLQotCQkvLyBTZXQgR3JpZERhdGEgYW5kIEdyaWRMYXlvdXQgZm9yIHRoZSBwYXJlbnQgQ29tcG9zaXRlCi0JCXBhcmVudC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJcGFyZW50LnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkvLyBDcmVhdGUgdGhlIHRvcCBDb21wb3NpdGUKLQkJdG9wQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShwYXJlbnQsIFNXVC5OT05FKTsKLQkJR3JpZERhdGEgdG9wRGF0YSA9IG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQl0b3BEYXRhLmhlaWdodEhpbnQgPSAwOwotCQl0b3BDb21wb3NpdGUuc2V0TGF5b3V0RGF0YSh0b3BEYXRhKTsKLQkJdG9wQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgpKTsKLQotCQkvLyBDcmVhdGUgdGhlICdjb21tb24nL21pZGRsZSBDb21wb3NpdGUKLQkJaWYgKHVzZUdyb3VwKSB7Ci0JCQljb21tb25Db21wb3NpdGUgPSBuZXcgR3JvdXAocGFyZW50LCBTV1QuTk9ORSk7Ci0JCX0gZWxzZSB7Ci0JCQljb21tb25Db21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQl9Ci0JCWNvbW1vbkNvbXBvc2l0ZS5zZXRMYXlvdXREYXRhKG5ldyBHcmlkRGF0YShHcmlkRGF0YS5GSUxMX0JPVEgpKTsKLQkJY29tbW9uQ29tcG9zaXRlLnNldExheW91dChuZXcgR3JpZExheW91dCgzLCBmYWxzZSkpOwotCi0JCS8vIEFkZCB0aGUgZXJyb3IgTWVzc2FnZSBMYWJlbAotCQllcnJvck1lc3NhZ2VMYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5OT05FKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0TGF5b3V0RGF0YShjcmVhdGVIb3Jpem9udGFsRmlsbCgpKTsKLQkJQ29sb3IgY29sb3IgPSBuZXcgQ29sb3IoZXJyb3JNZXNzYWdlTGFiZWwuZ2V0RGlzcGxheSgpLCAyMDAsIDAsIDApOwotCQllcnJvck1lc3NhZ2VMYWJlbC5zZXRGb3JlZ3JvdW5kKGNvbG9yKTsKLQotCQljcmVhdGVDb250cm9sQXJlYSgpOwotCX0KLQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQnV0dG9ucyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHBhcmVudCwgU1dULk5PTkUpOwotCQljb21wb3NpdGUuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9WRVJUSUNBTCkpOwotCQlHcmlkTGF5b3V0IGdyaWRMYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlncmlkTGF5b3V0Lm51bUNvbHVtbnMgPSAxOwotCQlncmlkTGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWdyaWRMYXlvdXQubWFyZ2luV2lkdGggPSAwOwotCQljb21wb3NpdGUuc2V0TGF5b3V0KGdyaWRMYXlvdXQpOwotCi0JCVNlbGVjdGlvbkxpc3RlbmVyIHNlbGVjdGlvbkxpc3RlbmVyID0gbmV3IFNlbGVjdGlvbkFkYXB0ZXIoKSB7Ci0JCQlwdWJsaWMgdm9pZCB3aWRnZXRTZWxlY3RlZChTZWxlY3Rpb25FdmVudCBlKSB7Ci0JCQkJaWYgKGUud2lkZ2V0ID09IG5ld0J1dHRvbikgewotCQkJCQlwZXJmb3JtTmV3KCk7Ci0JCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBlZGl0QnV0dG9uKSB7Ci0JCQkJCXBlcmZvcm1FZGl0KCk7Ci0JCQkJfSBlbHNlIGlmIChlLndpZGdldCA9PSBkZWxldGVCdXR0b24pIHsKLQkJCQkJcGVyZm9ybURlbGV0ZSgpOwotCQkJCX0KLQkJCX0KLQkJfTsKLQotCQkvLyBjcmVhdGUgYSBjb21wb3NpdGUgdG8gaG9sZCB0aGUgdGhyZWUgYnV0dG9ucwotCQlDb21wb3NpdGUgYnV0dG9uQ29tcG9zaXRlID0gbmV3IENvbXBvc2l0ZShjb21wb3NpdGUsIFNXVC5OT05FKTsKLQkJYnV0dG9uQ29tcG9zaXRlLnNldExheW91dERhdGEoY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCUdyaWRMYXlvdXQgYnV0dG9uR3JpZExheW91dCA9IG5ldyBHcmlkTGF5b3V0KCk7Ci0JCS8vYnV0dG9uR3JpZExheW91dC5udW1Db2x1bW5zID0gMzsKLQkJLy9idXR0b25HcmlkTGF5b3V0Lm1ha2VDb2x1bW5zRXF1YWxXaWR0aCA9IHRydWU7Ci0JCWJ1dHRvbkNvbXBvc2l0ZS5zZXRMYXlvdXQoYnV0dG9uR3JpZExheW91dCk7Ci0KLQkJLy8gYWRkIHRoZSBOZXcgYnV0dG9uCi0JCS8vCi0JCW5ld0J1dHRvbiA9IG5ldyBCdXR0b24oYnV0dG9uQ29tcG9zaXRlLCBTV1QuTk9ORSk7Ci0JCS8vbmV3QnV0dG9uLnNldFRleHQoIiAiICsKLQkJLy8gWE1MQ29tbW9uVUlQbHVnaW4uZ2V0SW5zdGFuY2UoKS5nZXRTdHJpbmcoIl9VSV9CVVRUT05fTkVXIikgKyAiICIpOwotCQluZXdCdXR0b24uc2V0VGV4dCgiICAgIiArIFhNTFVJTWVzc2FnZXMuQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2dfMCArICIgICAiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkIC8vJE5PTi1OTFMtMyQKLQkJbmV3QnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAvL1ZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQluZXdCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGFkZCB0aGUgRWRpdCBidXR0b24KLQkJLy8KLQkJLy9nZCA9IG5ldyBHcmlkRGF0YSgpOwotCQkvL2dkLmhvcml6b250YWxBbGlnbm1lbnQgPSBnZC5GSUxMOwotCQkvL2dkLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCi0JCWVkaXRCdXR0b24gPSBuZXcgQnV0dG9uKGJ1dHRvbkNvbXBvc2l0ZSwgU1dULk5PTkUpOwotCQllZGl0QnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfQlVUVE9OX0VESVQpOyAvLyROT04tTkxTLTEkCi0JCWVkaXRCdXR0b24uc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7IC8vVmlld1V0aWxpdHkuY3JlYXRlSG9yaXpvbnRhbEZpbGwoKSk7Ci0JCWVkaXRCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCi0JCS8vIGFkZCB0aGUgRGVsZXRlIGJ1dHRvbgotCQkvLwotCQkvL2dkID0gbmV3IEdyaWREYXRhKCk7Ci0JCS8vZ2QuaG9yaXpvbnRhbEFsaWdubWVudCA9IGdkLkZJTEw7Ci0JCS8vZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0KLQkJZGVsZXRlQnV0dG9uID0gbmV3IEJ1dHRvbihidXR0b25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJZGVsZXRlQnV0dG9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5fVUlfQlVUVE9OX0RFTEVURSk7IC8vJE5PTi1OTFMtMSQKLQkJZGVsZXRlQnV0dG9uLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOyAvL1ZpZXdVdGlsaXR5LmNyZWF0ZUhvcml6b250YWxGaWxsKCkpOwotCQlkZWxldGVCdXR0b24uYWRkU2VsZWN0aW9uTGlzdGVuZXIoc2VsZWN0aW9uTGlzdGVuZXIpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9sQXJlYSgpIHsKLQkJaWYgKHVzZUdyb3VwKSB7Ci0JCQkoKEdyb3VwKSBjb21tb25Db21wb3NpdGUpLnNldFRleHQodGFibGVMYWJlbCk7Ci0JCX0gZWxzZSB7Ci0JCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChjb21tb25Db21wb3NpdGUsIFNXVC5OT05FKTsKLQkJCWxhYmVsLnNldFRleHQodGFibGVMYWJlbCk7Ci0JCQlsYWJlbC5zZXRMYXlvdXREYXRhKGNyZWF0ZUdyaWREYXRhKGZhbHNlLCAzKSk7Ci0JCX0KLQotCQl0YWJsZVZpZXdlciA9IG5ldyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoY29tbW9uQ29tcG9zaXRlLCA2LCBzaG93TG9jYXRpb25UZXh0KTsKLQkJdGFibGVWaWV3ZXIuZ2V0Q29udHJvbCgpLnNldExheW91dERhdGEoY3JlYXRlR3JpZERhdGEodHJ1ZSwgMikpOwotCQljcmVhdGVCdXR0b25zKGNvbW1vbkNvbXBvc2l0ZSk7Ci0KLQkJdGFibGVWaWV3ZXIuc2V0SW5wdXQobmFtZXNwYWNlSW5mb0xpc3QpOwotCQl1cGRhdGVCdXR0b25FbmFibGVkU3RhdGUoKTsKLQkJSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lciBzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIgPSBuZXcgSVNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcigpIHsKLQkJCXB1YmxpYyB2b2lkIHNlbGVjdGlvbkNoYW5nZWQoU2VsZWN0aW9uQ2hhbmdlZEV2ZW50IGV2ZW50KSB7Ci0JCQkJdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCk7Ci0JCQl9Ci0JCX07Ci0JCXRhYmxlVmlld2VyLmFkZFNlbGVjdGlvbkNoYW5nZWRMaXN0ZW5lcihzZWxlY3Rpb25DaGFuZ2VkTGlzdGVuZXIpOwotCX0KLQotCXByb3RlY3RlZCBHcmlkRGF0YSBjcmVhdGVHcmlkRGF0YShib29sZWFuIGJvdGgsIGludCBzcGFuKSB7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKGJvdGggPyBHcmlkRGF0YS5GSUxMX0JPVEggOiBHcmlkRGF0YS5GSUxMX0hPUklaT05UQUwpOwotCQlnZC5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCXJldHVybiBnZDsKLQl9Ci0KLQlwcml2YXRlIEdyaWREYXRhIGNyZWF0ZUhvcml6b250YWxGaWxsKCkgewotCQlHcmlkRGF0YSBnZCA9IG5ldyBHcmlkRGF0YSgpOwotCQlnZC5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZ2QuZ3JhYkV4Y2Vzc0hvcml6b250YWxTcGFjZSA9IHRydWU7Ci0JCXJldHVybiBnZDsKLQl9Ci0KLQotCi0JcHVibGljIE5hbWVzcGFjZUluZm8gZ2V0TmFtZXNwYWNlSW5mbyhTdHJpbmcgbmFtZXNwYWNlKSB7Ci0JCU5hbWVzcGFjZUluZm8gcmVzdWx0ID0gbnVsbDsKLQkJZm9yIChJdGVyYXRvciBpID0gbmFtZXNwYWNlSW5mb0xpc3QuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KSB7Ci0JCQlOYW1lc3BhY2VJbmZvIGluZm8gPSAoTmFtZXNwYWNlSW5mbykgaS5uZXh0KCk7Ci0JCQlpZiAoaW5mby51cmkgIT0gbnVsbCAmJiBpbmZvLnVyaS5lcXVhbHMobmFtZXNwYWNlKSkgewotCQkJCXJlc3VsdCA9IGluZm87Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgT2JqZWN0IGdldFNlbGVjdGlvbihJU2VsZWN0aW9uIHNlbGVjdGlvbikgewotCQlpZiAoc2VsZWN0aW9uID09IG51bGwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9IC8vIGVuZCBvZiBpZiAoKQotCi0JCU9iamVjdCByZXN1bHQgPSBudWxsOwotCQlpZiAoc2VsZWN0aW9uIGluc3RhbmNlb2YgSVN0cnVjdHVyZWRTZWxlY3Rpb24pIHsKLQkJCUlTdHJ1Y3R1cmVkU2VsZWN0aW9uIGVzID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQlJdGVyYXRvciBpID0gZXMuaXRlcmF0b3IoKTsKLQkJCWlmIChpLmhhc05leHQoKSkgewotCQkJCXJlc3VsdCA9IGkubmV4dCgpOwotCQkJfQotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoKLQkgKiBVc2UgdGhlIHJldHVybmVkIENvbXBvc2l0ZSB0byBhZGQgY29udGVudCBhYm92ZSB0aGUgJ2NvbW1vbiBjb250ZW50cycuCi0JICogTm90ZTogVGhlIEdyaWREYXRhIGZvciB0aGUgcmV0dXJuZWQgQ29tcG9zaXRlIGhhcyBhIGhlaWdodEhpbnQgPSAwLgotCSAqIFRoaXMgbWVhbnMgd2hlbiB1c2luZyB0aGUgcmV0dXJuZWQgQ29tcG9zaXRlLCB0aGUgR3JpZERhdGEgbXVzdCBiZQotCSAqIHJlc2V0LCBlbHNlIHRoZSBDb21wb3NpdGUgYW5kIGl0J3MgY29udGVudHMgd2lsbCBub3QgYXBwZWFyLgotCSAqLwotCXByb3RlY3RlZCBDb21wb3NpdGUgZ2V0VG9wQ29tcG9zaXRlKCkgewotCQlyZXR1cm4gdG9wQ29tcG9zaXRlOwotCX0KLQotCXByb3RlY3RlZCBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyBpbnZva2VEaWFsb2coU3RyaW5nIHRpdGxlLCBOYW1lc3BhY2VJbmZvIGluZm8pIHsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUVkaXROYW1lc3BhY2VJbmZvRGlhbG9nIGRpYWxvZyA9IG5ldyBFZGl0TmFtZXNwYWNlSW5mb0RpYWxvZyhzaGVsbCwgaW5mbyk7Ci0JCWRpYWxvZy5jcmVhdGUoKTsKLQkJZGlhbG9nLmdldFNoZWxsKCkuc2V0VGV4dCh0aXRsZSk7Ci0JCWRpYWxvZy5zZXRCbG9ja09uT3Blbih0cnVlKTsKLQkJZGlhbG9nLnNldFJlc291cmNlTG9jYXRpb24ocmVzb3VyY2VMb2NhdGlvbik7Ci0JCWRpYWxvZy5vcGVuKCk7Ci0JCXJldHVybiBkaWFsb2c7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlbGF5ZWRVcGRhdGUoKSB7Ci0JCXRhYmxlVmlld2VyLnJlZnJlc2goKTsKLQkJLyoKLQkJICogUnVubmFibGUgZGVsYXllZFVwZGF0ZSA9IG5ldyBSdW5uYWJsZSgpIHsgcHVibGljIHZvaWQgcnVuKCkgewotCQkgKiB0YWJsZVZpZXdlci5yZWZyZXNoKCk7IH0gfTsKLQkJICogRGlzcGxheS5nZXRDdXJyZW50KCkuYXN5bmNFeGVjKGRlbGF5ZWRVcGRhdGUpOwotCQkgKi8KLQkJLy9pZiAodXBkYXRlTGlzdGVuZXIgIT0gbnVsbCkKLQkJLy97Ci0JCS8vICB1cGRhdGVMaXN0ZW5lci51cGRhdGVPY2N1cmVkKHRoaXMsIG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJLy99Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybURlbGV0ZSgpIHsKLQkJSVNlbGVjdGlvbiBzZWxlY3Rpb24gPSB0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKTsKLQkJaWYgKHNlbGVjdGlvbiBpbnN0YW5jZW9mIElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSB7Ci0JCQlJU3RydWN0dXJlZFNlbGVjdGlvbiBzdHJ1Y3R1cmVkU2VsZWN0aW9uID0gKElTdHJ1Y3R1cmVkU2VsZWN0aW9uKSBzZWxlY3Rpb247Ci0JCQluYW1lc3BhY2VJbmZvTGlzdC5yZW1vdmVBbGwoc3RydWN0dXJlZFNlbGVjdGlvbi50b0xpc3QoKSk7Ci0JCQl1cGRhdGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QpOwotCQkJcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIHBlcmZvcm1FZGl0KCkgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJaWYgKHNlbGVjdGlvbiAhPSBudWxsKSB7Ci0JCQlpbnZva2VEaWFsb2coWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkVXX05BTUVTUEFDRV9JTkZPUk1BVElPTiwgKE5hbWVzcGFjZUluZm8pIHNlbGVjdGlvbik7IC8vJE5PTi1OTFMtMSQKLQkJCXVwZGF0ZUVycm9yTWVzc2FnZShuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JCQlwZXJmb3JtRGVsYXllZFVwZGF0ZSgpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcGVyZm9ybU5ldygpIHsKLQkJU2hlbGwgc2hlbGwgPSBYTUxVSVBsdWdpbi5nZXRJbnN0YW5jZSgpLmdldFdvcmtiZW5jaCgpLmdldEFjdGl2ZVdvcmtiZW5jaFdpbmRvdygpLmdldFNoZWxsKCk7Ci0JCUNvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2cgZGlhbG9nID0gbmV3IENvbW1vbkFkZE5hbWVzcGFjZXNEaWFsb2coc2hlbGwsIFhNTFVJTWVzc2FnZXMuX1VJX0FERF9OQU1FU1BBQ0VfREVDTEFSQVRJT05TLCByZXNvdXJjZUxvY2F0aW9uLCBuYW1lc3BhY2VJbmZvTGlzdCk7IC8vJE5PTi1OTFMtMSQKLQkJZGlhbG9nLmNyZWF0ZUFuZE9wZW4oKTsKLQkJaWYgKGRpYWxvZy5nZXRSZXR1cm5Db2RlKCkgPT0gV2luZG93Lk9LKSB7Ci0JCQluYW1lc3BhY2VJbmZvTGlzdC5hZGRBbGwoZGlhbG9nLmdldE5hbWVzcGFjZUluZm9MaXN0KCkpOwotCQkJdXBkYXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0KTsKLQkJCXBlcmZvcm1EZWxheWVkVXBkYXRlKCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBzZXROYW1lc3BhY2VJbmZvTGlzdChMaXN0IGxpc3QpIHsKLQkJbmFtZXNwYWNlSW5mb0xpc3QgPSBsaXN0OwotCQl0YWJsZVZpZXdlci5zZXRJbnB1dChuYW1lc3BhY2VJbmZvTGlzdCk7Ci0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlQnV0dG9uRW5hYmxlZFN0YXRlKCkgewotCQlPYmplY3Qgc2VsZWN0aW9uID0gZ2V0U2VsZWN0aW9uKHRhYmxlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIHNlbGVjdGlvbjsKLQkJZWRpdEJ1dHRvbi5zZXRFbmFibGVkKGluZm8gIT0gbnVsbCk7Ci0JCWRlbGV0ZUJ1dHRvbi5zZXRFbmFibGVkKGluZm8gIT0gbnVsbCAmJiBpbmZvLmdldFByb3BlcnR5KCJ1bnJlbW92YWJsZSIpID09IG51bGwpOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHVibGljIHZvaWQgdXBkYXRlRXJyb3JNZXNzYWdlKExpc3QgbmFtZXNwYWNlSW5mb0xpc3QpIHsKLQkJTmFtZXNwYWNlSW5mb0Vycm9ySGVscGVyIGhlbHBlciA9IG5ldyBOYW1lc3BhY2VJbmZvRXJyb3JIZWxwZXIoKTsKLQkJU3RyaW5nIGVycm9yTWVzc2FnZSA9IGhlbHBlci5jb21wdXRlRXJyb3JNZXNzYWdlKG5hbWVzcGFjZUluZm9MaXN0LCBudWxsKTsKLQkJZXJyb3JNZXNzYWdlTGFiZWwuc2V0VGV4dChlcnJvck1lc3NhZ2UgIT0gbnVsbCA/IGVycm9yTWVzc2FnZSA6ICIiKTsgLy8kTk9OLU5MUy0xJAotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiYWU0MDYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL25zZWRpdC9Db21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoKLSAqIFRoaXMgY2xhc3MgaXMgYW4gZXh0ZW5zaW9uIG9mIENvbW1vbkVkaXROYW1lc3BhY2VzRGlhbG9nLiBUaGlzIGNsYXNzIGFkZHMKLSAqIHRoZSB0YXJnZXQgbmFtZXNwYWNlcyBkaWFsb2cgZmllbGQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb21tb25FZGl0TmFtZXNwYWNlc1RhcmdldEZpZWxkRGlhbG9nIGV4dGVuZHMgQ29tbW9uRWRpdE5hbWVzcGFjZXNEaWFsb2cgewotCi0JY2xhc3MgVGFyZ2V0TmFtZXNwYWNlTW9kaWZ5TGlzdGVuZXIgaW1wbGVtZW50cyBNb2RpZnlMaXN0ZW5lciB7Ci0JCXB1YmxpYyB2b2lkIG1vZGlmeVRleHQoTW9kaWZ5RXZlbnQgZSkgewotCQkJU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZTsKLQkJCXRhcmdldE5hbWVzcGFjZSA9IHRhcmdldE5hbWVzcGFjZUZpZWxkLmdldFRleHQoKTsKLQkJCXVwZGF0ZVRhcmdldE5hbWVzcGFjZUFuZE5hbWVzcGFjZUluZm8ob2xkVGFyZ2V0TmFtZXNwYWNlLCB0YXJnZXROYW1lc3BhY2UpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFN0cmluZyB0YXJnZXROYW1lc3BhY2U7Ci0JcHJvdGVjdGVkIFRleHQgdGFyZ2V0TmFtZXNwYWNlRmllbGQ7Ci0KLQlwdWJsaWMgQ29tbW9uRWRpdE5hbWVzcGFjZXNUYXJnZXRGaWVsZERpYWxvZyhDb21wb3NpdGUgcGFyZW50LCBJUGF0aCByZXNvdXJjZUxvY2F0aW9uMSkgewotCQlzdXBlcihwYXJlbnQsIHJlc291cmNlTG9jYXRpb24xLCBYTUxVSU1lc3NhZ2VzLl9VSV9OQU1FU1BBQ0VfREVDTEFSQVRJT05TKTsgLy8kTk9OLU5MUy0xJAotCi0JCUNvbXBvc2l0ZSB0YXJnZXRDb21wID0gZ2V0VG9wQ29tcG9zaXRlKCk7Ci0JCXRhcmdldENvbXAuc2V0TGF5b3V0RGF0YShuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9IT1JJWk9OVEFMKSk7Ci0KLQkJR3JpZERhdGEgZ2QgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJTGFiZWwgdGFyZ2V0TmFtZXNwYWNlTGFiZWwgPSBuZXcgTGFiZWwodGFyZ2V0Q29tcCwgU1dULk5PTkUpOwotCQl0YXJnZXROYW1lc3BhY2VMYWJlbC5zZXRMYXlvdXREYXRhKGdkKTsKLQkJdGFyZ2V0TmFtZXNwYWNlTGFiZWwuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLl9VSV9UQVJHRVRfTkFNRVNQQUNFKTsgLy8kTk9OLU5MUy0xJAotCi0JCXRhcmdldE5hbWVzcGFjZUZpZWxkID0gbmV3IFRleHQodGFyZ2V0Q29tcCwgU1dULkJPUkRFUik7Ci0JCXRhcmdldE5hbWVzcGFjZUZpZWxkLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQl0YXJnZXROYW1lc3BhY2VGaWVsZC5hZGRNb2RpZnlMaXN0ZW5lcihuZXcgVGFyZ2V0TmFtZXNwYWNlTW9kaWZ5TGlzdGVuZXIoKSk7Ci0KLQkJLy8gY3JlYXRlQ29udHJvbEFyZWEoKTsKLQl9Ci0KLQlwdWJsaWMgU3RyaW5nIGdldFRhcmdldE5hbWVzcGFjZSgpIHsKLQkJcmV0dXJuIHRhcmdldE5hbWVzcGFjZTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwZXJmb3JtRWRpdCgpIHsKLQkJT2JqZWN0IHNlbGVjdGlvbiA9IGdldFNlbGVjdGlvbih0YWJsZVZpZXdlci5nZXRTZWxlY3Rpb24oKSk7Ci0JCWlmIChzZWxlY3Rpb24gIT0gbnVsbCkgewotCQkJYm9vbGVhbiBlZGl0VGFyZ2V0TmFtZXNwYWNlID0gZmFsc2U7Ci0JCQlOYW1lc3BhY2VJbmZvIG5zSW5mbyA9IChOYW1lc3BhY2VJbmZvKSBzZWxlY3Rpb247Ci0JCQlpZiAoZ2V0VGFyZ2V0TmFtZXNwYWNlKCkuZXF1YWxzKG5zSW5mby51cmkpKSB7Ci0JCQkJZWRpdFRhcmdldE5hbWVzcGFjZSA9IHRydWU7Ci0JCQl9Ci0KLQkJCWludm9rZURpYWxvZyhYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9ORVdfTkFNRVNQQUNFX0lORk9STUFUSU9OLCBuc0luZm8pOyAvLyROT04tTkxTLTEkCi0JCQl1cGRhdGVFcnJvck1lc3NhZ2UobmFtZXNwYWNlSW5mb0xpc3QpOwotCQkJcGVyZm9ybURlbGF5ZWRVcGRhdGUoKTsKLQotCQkJaWYgKGVkaXRUYXJnZXROYW1lc3BhY2UpIHsKLQkJCQl0YXJnZXROYW1lc3BhY2VGaWVsZC5zZXRUZXh0KG5zSW5mby51cmkpOwotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgc2V0VGFyZ2V0TmFtZXNwYWNlKFN0cmluZyB0aGVUYXJnZXROYW1lc3BhY2UpIHsKLQkJdGFyZ2V0TmFtZXNwYWNlID0gdGhlVGFyZ2V0TmFtZXNwYWNlICE9IG51bGwgPyB0aGVUYXJnZXROYW1lc3BhY2UgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQl0YXJnZXROYW1lc3BhY2VGaWVsZC5zZXRUZXh0KHRhcmdldE5hbWVzcGFjZSk7Ci0JCS8vIHVwZGF0ZVRhcmdldE5hbWVzcGFjZUFuZE5hbWVzcGFjZUluZm8odGFyZ2V0TmFtZXNwYWNlKTsKLQl9Ci0KLQl2b2lkIHVwZGF0ZVRhcmdldE5hbWVzcGFjZUFuZE5hbWVzcGFjZUluZm8oU3RyaW5nIG9sZFRhcmdldE5hbWVzcGFjZSwgU3RyaW5nIG5ld1RhcmdldE5hbWVzcGFjZSkgewotCQlOYW1lc3BhY2VJbmZvIGluZm8gPSBnZXROYW1lc3BhY2VJbmZvKG5ld1RhcmdldE5hbWVzcGFjZSk7Ci0JCWlmIChpbmZvID09IG51bGwpIHsKLQkJCWluZm8gPSBnZXROYW1lc3BhY2VJbmZvKG9sZFRhcmdldE5hbWVzcGFjZSk7Ci0JCQlpZiAoaW5mbyA9PSBudWxsKSB7Ci0JCQkJaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKG5ld1RhcmdldE5hbWVzcGFjZSwgInRucyIsIG51bGwpOyAvLyROT04tTkxTLTEkCi0JCQkJbmFtZXNwYWNlSW5mb0xpc3QuYWRkKGluZm8pOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJaW5mby51cmkgPSB0YXJnZXROYW1lc3BhY2U7Ci0JCQl9Ci0JCX0KLQkJdGFibGVWaWV3ZXIucmVmcmVzaCgpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvbnNlZGl0L0NvbW1vbk5hbWVzcGFjZUluZm9UYWJsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmIzNzNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9uc2VkaXQvQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLm5zZWRpdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbHVtbldlaWdodERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU3RydWN0dXJlZENvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklUYWJsZUxhYmVsUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5MYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVGFibGVMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UYWJsZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW91c2VFdmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlQ29sdW1uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlRhYmxlSXRlbTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuTmFtZXNwYWNlSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLXB1YmxpYyBjbGFzcyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUgZXh0ZW5kcyBUYWJsZVZpZXdlciB7Ci0KLQkvKioKLQkgKiBOYW1lc3BhY2VJbmZvVGFibGVMYWJlbFByb3ZpZGVyCi0JICovCi0JcHJvdGVjdGVkIGNsYXNzIFByb3ZpZGVyIGV4dGVuZHMgTGFiZWxQcm92aWRlciBpbXBsZW1lbnRzIElUYWJsZUxhYmVsUHJvdmlkZXIsIElTdHJ1Y3R1cmVkQ29udGVudFByb3ZpZGVyIHsKLQkJVmlld2VyIHZpZXdlcjsKLQotCQlwdWJsaWMgSW1hZ2UgZ2V0Q29sdW1uSW1hZ2UoT2JqZWN0IG9iamVjdCwgaW50IGNvbHVtbkluZGV4KSB7Ci0JCQlJbWFnZSByZXN1bHQgPSBudWxsOwotCQkJaW50IGNvbHVtbkNvZGUgPSBnZXRDb2x1bW5Db2RlKGNvbHVtbkluZGV4KTsKLQkJCWlmIChjb2x1bW5Db2RlID09IENPTFVNTl9MT0NBVElPTl9ISU5UKSB7Ci0JCQkJTmFtZXNwYWNlSW5mbyBpbmZvID0gKE5hbWVzcGFjZUluZm8pIG9iamVjdDsKLQkJCQlpZiAoaW5mby5sb2NhdGlvbkhpbnQgPT0gbnVsbCB8fCBpbmZvLmxvY2F0aW9uSGludC50cmltKCkuZXF1YWxzKCIiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJCS8vIENvbW1lbnQgdGhpcyBvdXQgdW50aWwgd2Ugc29sdmUgdGhlIGFsaWdubWVudC8oc3BhY2UKLQkJCQkJLy8gZm9yIGltYWdlIGJlaW5nIGFsbG9jYXRlZAotCQkJCQkvLyB0byBwcmVmaXggY29sdW1uKSAuLi4uLi4KLQkJCQkJLy8gICAgICAgICAgcmVzdWx0ID0KLQkJCQkJLy8gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9XQVJOSU5HX09CSik7Ci0JCQkJfQotCQkJfQotCi0JCQlyZXR1cm4gcmVzdWx0OwotCQl9Ci0KLQkJcHVibGljIFN0cmluZyBnZXRDb2x1bW5UZXh0KE9iamVjdCBvYmplY3QsIGludCBjb2x1bW4pIHsKLQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmplY3Q7Ci0JCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJCWludCBjb2x1bW5Db2RlID0gZ2V0Q29sdW1uQ29kZShjb2x1bW4pOwotCQkJc3dpdGNoIChjb2x1bW5Db2RlKSB7Ci0JCQkJY2FzZSBDT0xVTU5fUFJFRklYIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLnByZWZpeDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWNhc2UgQ09MVU1OX05BTUVTUEFDRV9VUkkgOiB7Ci0JCQkJCXJlc3VsdCA9IGluZm8udXJpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJY2FzZSBDT0xVTU5fQ0hFQ0tCT1ggOiB7Ci0JCQkJCXJlc3VsdCA9ICIiOyAvL2luZm8ubG9jYXRpb25IaW50OyAvLyROT04tTkxTLTEkCi0JCQkJCWJyZWFrOwotCQkJCX0KLQkJCQljYXNlIENPTFVNTl9MT0NBVElPTl9ISU5UIDogewotCQkJCQlyZXN1bHQgPSBpbmZvLmxvY2F0aW9uSGludDsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJfQotCQkJcmVzdWx0ID0gcmVzdWx0ICE9IG51bGwgPyByZXN1bHQgOiAiIjsgLy8kTk9OLU5MUy0xJAotCQkJaWYgKHJlc3VsdC5lcXVhbHMoIiIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlzd2l0Y2ggKGNvbHVtbkNvZGUpIHsKLQkJCQkJY2FzZSBDT0xVTU5fUFJFRklYIDogewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfTk9fUFJFRklYOyAvLyROT04tTkxTLTEkCi0JCQkJCQlicmVhazsKLQkJCQkJfQotCQkJCQljYXNlIENPTFVNTl9OQU1FU1BBQ0VfVVJJIDogewotCQkJCQkJcmVzdWx0ID0gWE1MVUlNZXNzYWdlcy5fVUlfTk9fTkFNRVNQQUNFX05BTUU7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCWJyZWFrOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHJlc3VsdDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3RbXSBnZXRFbGVtZW50cyhPYmplY3QgaW5wdXRFbGVtZW50KSB7Ci0JCQlMaXN0IGxpc3QgPSAoTGlzdCkgdmlld2VyLmdldElucHV0KCk7Ci0JCQlyZXR1cm4gbGlzdCAhPSBudWxsID8gbGlzdC50b0FycmF5KCkgOiBudWxsOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgaW5wdXRDaGFuZ2VkKFZpZXdlciB2aWV3ZXIsIE9iamVjdCBvbGRJbnB1dCwgT2JqZWN0IG5ld0lucHV0KSB7Ci0JCQl0aGlzLnZpZXdlciA9IHZpZXdlcjsKLQkJfQotCX0KLQotCWNsYXNzIFRhYmxlSXRlbUNoZWNrZXIgZXh0ZW5kcyBNb3VzZUFkYXB0ZXIgewotCQlwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7Ci0JCQlUYWJsZUl0ZW0gaXRlbSA9IGdldFRhYmxlKCkuZ2V0SXRlbShuZXcgUG9pbnQoZS54LCBlLnkpKTsKLQkJCWlmIChpdGVtICE9IG51bGwpIHsKLQkJCQlPYmplY3Qgb2JqID0gaXRlbS5nZXREYXRhKCk7Ci0JCQkJaWYgKG9iaiAhPSBudWxsKSB7Ci0JCQkJCU5hbWVzcGFjZUluZm8gaW5mbyA9IChOYW1lc3BhY2VJbmZvKSBvYmo7Ci0JCQkJCVRhYmxlQ29sdW1uIGNvbCA9IGdldFRhYmxlKCkuZ2V0Q29sdW1uKDApOwotCQkJCQlpZiAoZS54IDwgY29sLmdldFdpZHRoKCkpIC8vIGlmIHRoZSBwb2ludCBmYWxscyB3aXRoaW4gdGhlCi0JCQkJCS8vIFNlbGVjdCBjb2x1bW4gdGhlbiBwZXJmb3JtCi0JCQkJCS8vIGNoZWNrL3VuY2hlY2sKLQkJCQkJewotCQkJCQkJU3RyaW5nIGN1cnJlbnRTdGF0ZSA9IChTdHJpbmcpIGluZm8uZ2V0UHJvcGVydHkoImNoZWNrZWQiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJU3lzdGVtLm91dC5wcmludGxuKCJjdXJyZW50U3RhdGUiICsgY3VycmVudFN0YXRlKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJaWYgKGN1cnJlbnRTdGF0ZSA9PSBudWxsIHx8IGN1cnJlbnRTdGF0ZS5lcXVhbHMoImZhbHNlIikpIC8vJE5PTi1OTFMtMSQKLQkJCQkJCXsKLQkJCQkJCQlpbmZvLnNldFByb3BlcnR5KCJjaGVja2VkIiwgInRydWUiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9IGVsc2UgewotCQkJCQkJCWluZm8uc2V0UHJvcGVydHkoImNoZWNrZWQiLCAiZmFsc2UiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCQl9Ci0JCQkJCQlyZWZyZXNoKCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fQ0hFQ0tCT1ggPSAxOwotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTFVNTl9MT0NBVElPTl9ISU5UID0gNDsKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGludCBDT0xVTU5fTkFNRVNQQUNFX1VSSSA9IDI7Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBpbnQgQ09MVU1OX1BSRUZJWCA9IDM7Ci0KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9DSEVDS0JPWCA9ICIiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgTEFCRUxfTE9DQVRJT05fSElOVCA9IFhNTFVJTWVzc2FnZXMuX1VJX0xBQkVMX0xPQ0FUSU9OX0hJTlQ7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9OQU1FU1BBQ0VfVVJJID0gWE1MVUlNZXNzYWdlcy5fVUlfTEFCRUxfTkFNRVNQQUNFX05BTUU7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBMQUJFTF9QUkVGSVggPSBYTUxVSU1lc3NhZ2VzLl9VSV9MQUJFTF9QUkVGSVg7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgTGlzdCBjaGVja2VkTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotCS8vcHJvdGVjdGVkIExpc3QgbmFtZXNwYWNlSW5mb0xpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JcHJvdGVjdGVkIGludFtdIGNvbHVtbkluZGV4TWFwOwotCXByb3RlY3RlZCBib29sZWFuIHNob3dDaGVja0JveGVzID0gdHJ1ZTsKLQlwcml2YXRlIGJvb2xlYW4gc2hvd0xvY2F0aW9uVGV4dCA9IGZhbHNlOwotCi0JcHJpdmF0ZSBUYWJsZSB0YWJsZTsKLQlwcm90ZWN0ZWQgaW50IHZpc2libGVSb3dzID0gLTE7Ci0KLQlwdWJsaWMgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCB2aXNpYmxlUm93cykgewotCQl0aGlzKHBhcmVudCwgU1dULkZVTExfU0VMRUNUSU9OIHwgU1dULk1VTFRJIHwgU1dULkJPUkRFUiwgdmlzaWJsZVJvd3MsIGZhbHNlKTsKLQl9Ci0KLQkvL3Byb3RlY3RlZCBDZWxsRWRpdG9yIGdldENlbGxFZGl0b3IoaW50IGNvbHVtbikKLQkvLyB7Ci0JLy8gIHJldHVybiAoY29sdW1uID09IENPTFVNTl9DSEVDS0JPWCkgPyBjaGVja0JveENlbGxFZGl0b3IgOgotCS8vIHRleHRDZWxsRWRpdG9yOwotCS8vIH0KLQotCXB1YmxpYyBDb21tb25OYW1lc3BhY2VJbmZvVGFibGUoQ29tcG9zaXRlIHBhcmVudCwgaW50IHZpc2libGVSb3dzLCBib29sZWFuIHNob3dMb2NhdGlvblRleHQpIHsKLQkJdGhpcyhwYXJlbnQsIFNXVC5GVUxMX1NFTEVDVElPTiB8IFNXVC5NVUxUSSB8IFNXVC5CT1JERVIsIHZpc2libGVSb3dzLCBzaG93TG9jYXRpb25UZXh0KTsKLQl9Ci0KLQlwdWJsaWMgQ29tbW9uTmFtZXNwYWNlSW5mb1RhYmxlKENvbXBvc2l0ZSBwYXJlbnQsIGludCBzdHlsZSwgaW50IHZpc2libGVSb3dzKSB7Ci0JCXRoaXMocGFyZW50LCBTV1QuRlVMTF9TRUxFQ1RJT04gfCBTV1QuTVVMVEkgfCBTV1QuQk9SREVSIHwgc3R5bGUsIHZpc2libGVSb3dzLCBmYWxzZSk7Ci0JfQotCi0JcHVibGljIENvbW1vbk5hbWVzcGFjZUluZm9UYWJsZShDb21wb3NpdGUgcGFyZW50LCBpbnQgc3R5bGUsIGludCB2aXNpYmxlUm93cywgYm9vbGVhbiBzaG93TG9jYXRpb25UZXh0KSB7Ci0JCXN1cGVyKG5ldyBUYWJsZShwYXJlbnQsIHN0eWxlKSk7Ci0JCWdldFRhYmxlKCkuc2V0TGluZXNWaXNpYmxlKHRydWUpOwotCQl0aGlzLnNob3dDaGVja0JveGVzID0gKHN0eWxlICYgU1dULkNIRUNLKSAhPSAwOwotCQljb2x1bW5JbmRleE1hcCA9IGNyZWF0ZUNvbHVtbkluZGV4TWFwKCk7Ci0JCXRoaXMuc2hvd0xvY2F0aW9uVGV4dCA9IHNob3dMb2NhdGlvblRleHQ7Ci0KLQkJUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIoKTsKLQkJc2V0Q29udGVudFByb3ZpZGVyKHByb3ZpZGVyKTsKLQkJc2V0TGFiZWxQcm92aWRlcihwcm92aWRlcik7Ci0KLQkJU3RyaW5nW10gY29sdW1uUHJvcGVydGllc0FycmF5ID0gY3JlYXRlQ29sdW1uUHJvcGVydGllc0FycmF5KCk7Ci0JCXNldENvbHVtblByb3BlcnRpZXMoY29sdW1uUHJvcGVydGllc0FycmF5KTsKLQotCQl0YWJsZSA9IGdldFRhYmxlKCk7Ci0JCXRhYmxlLnNldEhlYWRlclZpc2libGUodHJ1ZSk7Ci0JCXRhYmxlLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfQk9USCkpOwotCi0JCVRhYmxlTGF5b3V0IGxheW91dCA9IG5ldyBUYWJsZUxheW91dCgpOwotCi0JCWZvciAoaW50IGkgPSAwOyBpIDwgY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aDsgaSsrKSB7Ci0JCQlUYWJsZUNvbHVtbiBjb2x1bW4gPSBuZXcgVGFibGVDb2x1bW4odGFibGUsIGkpOwotCQkJaWYgKChjb2x1bW5Qcm9wZXJ0aWVzQXJyYXlbaV0pLmVxdWFscyhMQUJFTF9MT0NBVElPTl9ISU5UKSkgewotCQkJCWlmIChzaG93TG9jYXRpb25UZXh0KSB7Ci0JCQkJCWNvbHVtbi5zZXRUZXh0KGNvbHVtblByb3BlcnRpZXNBcnJheVtpXSk7Ci0JCQkJfSBlbHNlIHsKLQkJCQkJLy8gQ29tbWVudCB0aGlzIG91dCB1bnRpbCB3ZSBzb2x2ZSB0aGUgYWxpZ25tZW50LyhzcGFjZQotCQkJCQkvLyBmb3IgaW1hZ2UgYmVpbmcgYWxsb2NhdGVkCi0JCQkJCS8vIHRvIHByZWZpeCBjb2x1bW4pIC4uLi4uLgotCQkJCQkvLyAgICAgICAgICAJY29sdW1uLnNldEltYWdlKFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2UoWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfVFhURVhUKSk7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLQkJCQljb2x1bW4uc2V0VGV4dChjb2x1bW5Qcm9wZXJ0aWVzQXJyYXlbaV0pOwotCQkJfQotCQkJY29sdW1uLnNldEFsaWdubWVudChTV1QuTEVGVCk7Ci0JCQlsYXlvdXQuYWRkQ29sdW1uRGF0YShuZXcgQ29sdW1uV2VpZ2h0RGF0YShnZXRDb2x1bW5XaWR0aChpKSwgdHJ1ZSkpOwotCQl9Ci0JCXRhYmxlLnNldExheW91dChsYXlvdXQpOwotCi0JCXRoaXMudmlzaWJsZVJvd3MgPSB2aXNpYmxlUm93czsKLQkJLy9mb3IgKGludCBpID0gMDsgaSA8IHZpc2libGVSb3dzOyBpKyspCi0JCS8vIHsKLQkJLy8gIFRhYmxlSXRlbSBpdGVtID0gbmV3IFRhYmxlSXRlbSh0YWJsZSwgU1dULk5PTkUpOwotCQkvLyAgaXRlbS5zZXRUZXh0KCIjIyMjIyMjIik7Ci0JCS8vfQotCQkvL2NoZWNrQm94Q2VsbEVkaXRvciA9IG5ldyBOYW1lc3BhY2VJbmZvQ2hlY2tib3hDZWxsRWRpdG9yKHRhYmxlKTsKLQkJLy90ZXh0Q2VsbEVkaXRvciA9IG5ldyBUZXh0Q2VsbEVkaXRvcih0YWJsZSk7Ci0KLQkJLyoKLQkJICogQ2VsbEVkaXRvcltdIGNlbGxFZGl0b3JzID0gbmV3Ci0JCSAqIENlbGxFZGl0b3JbY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aF07IGZvciAoaW50IGkgPSAwOyBpIDwKLQkJICogY29sdW1uUHJvcGVydGllc0FycmF5Lmxlbmd0aDsgaSsrKSB7IGNlbGxFZGl0b3JzW2ldID0KLQkJICogZ2V0Q2VsbEVkaXRvcihpKTsgfSBzZXRDZWxsRWRpdG9ycyhjZWxsRWRpdG9ycyk7Ci0JCSAqLwotCQkvL2lmIChzaG93Q2hlY2tCb3hlcykKLQkJLy97Ci0JCS8vICBnZXRUYWJsZSgpLmFkZE1vdXNlTGlzdGVuZXIobmV3IFRhYmxlSXRlbUNoZWNrZXIoKSk7Ci0JCS8vfQotCX0KLQotCS8vcHJvdGVjdGVkIENlbGxFZGl0b3IgY2hlY2tCb3hDZWxsRWRpdG9yOwotCS8vcHJvdGVjdGVkIENlbGxFZGl0b3IgdGV4dENlbGxFZGl0b3I7Ci0KLQlwcm90ZWN0ZWQgaW50W10gY3JlYXRlQ29sdW1uSW5kZXhNYXAoKSB7Ci0JCWludFtdIHJlc3VsdCA9IG5ldyBpbnRbc2hvd0NoZWNrQm94ZXMgPyA0IDogM107Ci0JCWludCBpID0gMDsKLQkJaWYgKHNob3dDaGVja0JveGVzKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IENPTFVNTl9DSEVDS0JPWDsKLQkJfQotCQlyZXN1bHRbaSsrXSA9IENPTFVNTl9QUkVGSVg7Ci0JCXJlc3VsdFtpKytdID0gQ09MVU1OX05BTUVTUEFDRV9VUkk7Ci0JCWlmICghc2hvd0NoZWNrQm94ZXMpIHsKLQkJCXJlc3VsdFtpKytdID0gQ09MVU1OX0xPQ0FUSU9OX0hJTlQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gY3JlYXRlQ29sdW1uUHJvcGVydGllc0FycmF5KCkgewotCQlTdHJpbmdbXSByZXN1bHQgPSBuZXcgU3RyaW5nWzNdOwotCQlpbnQgaSA9IDA7Ci0JCWlmIChzaG93Q2hlY2tCb3hlcykgewotCQkJcmVzdWx0W2krK10gPSBMQUJFTF9DSEVDS0JPWDsKLQkJfQotCQlyZXN1bHRbaSsrXSA9IExBQkVMX1BSRUZJWDsKLQkJcmVzdWx0W2krK10gPSBMQUJFTF9OQU1FU1BBQ0VfVVJJOwotCQlpZiAoIXNob3dDaGVja0JveGVzKSB7Ci0JCQlyZXN1bHRbaSsrXSA9IExBQkVMX0xPQ0FUSU9OX0hJTlQ7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQlwcm90ZWN0ZWQgaW50IGdldENvbHVtbkNvZGUoaW50IGNvbHVtbikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJaWYgKGNvbHVtbiA8IGNvbHVtbkluZGV4TWFwLmxlbmd0aCkgewotCQkJcmVzdWx0ID0gY29sdW1uSW5kZXhNYXBbY29sdW1uXTsKLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCXByb3RlY3RlZCBpbnQgZ2V0Q29sdW1uV2lkdGgoaW50IGNvbHVtbikgewotCQlpbnQgcmVzdWx0ID0gMDsKLQkJc3dpdGNoIChnZXRDb2x1bW5Db2RlKGNvbHVtbikpIHsKLQkJCWNhc2UgQ09MVU1OX1BSRUZJWCA6IHsKLQkJCQlyZXN1bHQgPSA1OwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBDT0xVTU5fTkFNRVNQQUNFX1VSSSA6IHsKLQkJCQkvLyBTaXplIGNvbHVtbnMgZGlmZmVyZW50bHkgd2hlbiBsb2NhdGlvbiBoaW50IHRleHQgbGFiZWwgaXMKLQkJCQkvLyBkaXNwbGF5ZWQKLQkJCQlpZiAoc2hvd0xvY2F0aW9uVGV4dCkgewotCQkJCQlyZXN1bHQgPSAxMDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSAyMDsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIENPTFVNTl9DSEVDS0JPWCA6IHsKLQkJCQlyZXN1bHQgPSAxOyAvL2luZm8ubG9jYXRpb25IaW50OwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBDT0xVTU5fTE9DQVRJT05fSElOVCA6IHsKLQkJCQkvLyBTaXplIGNvbHVtbnMgZGlmZmVyZW50bHkgd2hlbiBsb2NhdGlvbiBoaW50IHRleHQgbGFiZWwgaXMKLQkJCQkvLyBkaXNwbGF5ZWQKLQkJCQlpZiAoc2hvd0xvY2F0aW9uVGV4dCkgewotCQkJCQlyZXN1bHQgPSAxMDsKLQkJCQl9IGVsc2UgewotCQkJCQlyZXN1bHQgPSAyOwotCQkJCX0KLQkJCQlicmVhazsKLQkJCX0KLQkJfQotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQkvKgotCSAqIHByb3RlY3RlZCBjbGFzcyBOYW1lc3BhY2VJbmZvQ2VsbE1vZGlmaWVyIGltcGxlbWVudHMgSUNlbGxNb2RpZmllciB7Ci0JICogcHVibGljIE5hbWVzcGFjZUluZm9DZWxsTW9kaWZpZXIoKSB7IH0KLQkgKiAKLQkgKiBwdWJsaWMgYm9vbGVhbiBjYW5Nb2RpZnkoT2JqZWN0IGVsZW1lbnQsIFN0cmluZyBwcm9wZXJ0eSkgeyBpZgotCSAqIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfQ0hFQ0tCT1gpKSB7IHJldHVybiB0cnVlOyB9IGVsc2UgaWYKLQkgKiAocHJvcGVydHkuZXF1YWxzKExBQkVMX1BSRUZJWCkpIHsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlOyB9Ci0JICogCi0JICogcHVibGljIE9iamVjdCBnZXRWYWx1ZShPYmplY3QgZWxlbWVudCwgU3RyaW5nIHByb3BlcnR5KSB7IGludCBjb2x1bW4gPQotCSAqIDA7IGlmIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfQ0hFQ0tCT1gpKSB7IGNvbHVtbiA9IDA7IH0gZWxzZSBpZgotCSAqIChwcm9wZXJ0eS5lcXVhbHMoTEFCRUxfUFJFRklYKSkgeyBjb2x1bW4gPSAxOyB9IGVsc2UgaWYKLQkgKiAocHJvcGVydHkuZXF1YWxzKExBQkVMX05BTUVTUEFDRV9VUkkpKSB7IGNvbHVtbiA9IDI7IH0KLQkgKiAKLQkgKiAvL2lmIChlbGVtZW50IGluc3RhbmNlb2YgVGFibGVFbGVtZW50KSAvL3sgLy8gcmV0dXJuCi0JICogcHJvdmlkZXIuZ2V0Q29sdW1uVGV4dChlbGVtZW50LCBjb2x1bW4pOyAvL30gLy9lbHNlIC8veyAvLyByZXR1cm4gbnVsbDsgLy8gfQotCSAqIHJldHVybiAiaGVsbG8iOyB9Ci0JICogCi0JICogcHVibGljIHZvaWQgbW9kaWZ5KE9iamVjdCBlbGVtZW50LCBTdHJpbmcgcHJvcGVydHksIE9iamVjdCB2YWx1ZSkgeyB9IH0KLQkgKiAKLQkgKiBwcm90ZWN0ZWQgY2xhc3MgTmFtZXNwYWNlSW5mb0NoZWNrYm94Q2VsbEVkaXRvciBleHRlbmRzCi0JICogQ2hlY2tib3hDZWxsRWRpdG9yIGltcGxlbWVudHMgTW91c2VMaXN0ZW5lciB7IHB1YmxpYwotCSAqIE5hbWVzcGFjZUluZm9DaGVja2JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgeyBzdXBlcihwYXJlbnQpOyB9Ci0JICogCi0JICogcHJvdGVjdGVkIHZvaWQgZG9TZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsgfQotCSAqIAotCSAqIHB1YmxpYyB2b2lkIGFjdGl2YXRlKCkgeyBzdXBlci5hY3RpdmF0ZSgpOyBkZWFjdGl2YXRlKCk7Ci0JICogRGlzcGxheS5nZXRDdXJyZW50KCkuZ2V0Rm9jdXNDb250cm9sKCkucmVkcmF3KCk7IH0KLQkgKiAKLQkgKiBwdWJsaWMgdm9pZCBtb3VzZURvd24oTW91c2VFdmVudCBlKSB7IGlmIChnZXRUYWJsZSgpLmdldEl0ZW0obmV3Ci0JICogUG9pbnQoZS54LCBlLnkpKSAhPSBudWxsKSB7IH0gfSBwdWJsaWMgdm9pZCBtb3VzZURvdWJsZUNsaWNrKE1vdXNlRXZlbnQKLQkgKiBlKSB7IH0gcHVibGljIHZvaWQgbW91c2VVcChNb3VzZUV2ZW50IGUpIHsgfSB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL0VuY29kaW5nU2V0dGluZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRlNGYzOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvRW5jb2RpbmdTZXR0aW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuTW9kaWZ5RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZExheW91dDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuTGFiZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBFbmNvZGluZ1NldHRpbmdzIGlzIGEgY29tcG9zaXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSB0aGUgc2V0IG9mCi0gKiBlbmNvZGluZyB2YWx1ZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyLiBUaGUgbGlzdCBvZiBlbmNvZGluZyB2YWx1ZXMKLSAqIGlzIGJhc2VkIG9mZiB0aGUgU3VwcG9ydGVkSmF2YUVuY29kaW5nIGNsYXNzLiBBcyB0aGUgdXNlciBzZWxlY3RzIGFuCi0gKiBlbmNvZGluZyBmcm9tIHRoZSBjb21ibyBib3gsIHRoZSByZWFkb25seSBmaWVsZCBiZWxvdyBpdCBjaGFuZ2VzIHRvIHNob3cKLSAqIHRoZSBJQU5BIHRhZyBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVuY29kaW5nIGRlc2NyaXB0aW9uLiBUaGUgbGFiZWxzIGZvciB0aGUKLSAqIHdpZGdldHMgYXJlIGNvbmZpZ3VyYWJsZSBhbmQgdGhlIGluaXRpYWwgdmFsdWUgdG8gZGlzcGxheSB0byB0aGUgdXNlciBjYW4KLSAqIGJlIHNldCB1c2luZyB0aGUgc2V0SUFOQVRhZygpLiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGVudHJ5J3MgSUFOQSB0YWcgY2FuCi0gKiBiZSByZXRyaWV2ZWQgd2l0aCBnZXRJQU5BVGFnKCkuIEVudHJpZXMgZGlzcGxheWVkIHRvIHRoZSB1c2VyIGNhbiBiZSBhZGRlZAotICogYW5kIHJlbW92ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbmNvZGluZ1NldHRpbmdzIGV4dGVuZHMgQ29tcG9zaXRlIHsKLQotCXByaXZhdGUgY2xhc3MgQ29tYm9MaXN0ZW5lciBpbXBsZW1lbnRzIE1vZGlmeUxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgbW9kaWZ5VGV4dChNb2RpZnlFdmVudCBlKSB7Ci0JCQlpbnQgaSA9IGVuY29kaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKTsKLQkJCWlmIChpID49IDAgJiYgaSA8IGlhbmFWZWN0b3Iuc2l6ZSgpKQotCQkJCWlhbmFUZXh0LnNldFRleHQoKFN0cmluZykgKGlhbmFWZWN0b3IuZWxlbWVudEF0KGVuY29kaW5nQ29tYm8uZ2V0U2VsZWN0aW9uSW5kZXgoKSkpKTsKLQkJfQotCX0KLQotCXByaXZhdGUgc3RhdGljIFN0cmluZyBFTkNPRElOR19MQUJFTCA9IFhNTFVJTWVzc2FnZXMuRW5jb2RpbmdTZXR0aW5nc18xOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgSUFOQV9MQUJFTCA9IFhNTFVJTWVzc2FnZXMuRW5jb2RpbmdTZXR0aW5nc18wOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIE1vZGlmeUxpc3RlbmVyIGNvbWJvTGlzdGVuZXIgPSBuZXcgQ29tYm9MaXN0ZW5lcigpOwotCXByb3RlY3RlZCBDb21ibyBlbmNvZGluZ0NvbWJvOwotCXByb3RlY3RlZCBMYWJlbCBlbmNvZGluZ0xhYmVsLCBpYW5hTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgaWFuYVRleHQ7Ci0JcHJvdGVjdGVkIFZlY3RvciBpYW5hVmVjdG9yOwotCi0JLyoqCi0JICogTWV0aG9kIEVuY29kaW5nU2V0dGluZ3MuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqLwotCXB1YmxpYyBFbmNvZGluZ1NldHRpbmdzKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWluaXQoSUFOQV9MQUJFTCwgRU5DT0RJTkdfTEFCRUwpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBFbmNvZGluZ1NldHRpbmdzLgotCSAqIAotCSAqIEBwYXJhbSBwYXJlbnQKLQkgKiBAcGFyYW0gZW5jb2RpbmdMYWJlbCAtCi0JICogICAgICAgICAgICB0ZXh0IGxhYmVsIHRvIHVzZSBiZXNpZGUgdGhlIGxvY2FsZSBzZW5zaXRpdmUgZGVzY3JpcHRpb24gb2YKLQkgKiAgICAgICAgICAgIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZW5jb2RpbmcKLQkgKi8KLQlwdWJsaWMgRW5jb2RpbmdTZXR0aW5ncyhDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgZW5jb2RpbmdMYWJlbCkgewotCQlzdXBlcihwYXJlbnQsIFNXVC5OT05FKTsKLQkJaW5pdChJQU5BX0xBQkVMLCBlbmNvZGluZ0xhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgRW5jb2RpbmdTZXR0aW5ncy4KLQkgKiAKLQkgKiBAcGFyYW0gcGFyZW50Ci0JICogQHBhcmFtIGlhbmFMYWJlbCA9Ci0JICogICAgICAgICAgICB0ZXh0IGxhYmVsIHRvIHVzZSBiZXNpZGUgdGhlIGRpc3BsYXkgb25seSBJQU5BIGZpZWxkCi0JICogQHBhcmFtIGVuY29kaW5nTGFiZWwgLQotCSAqICAgICAgICAgICAgdGV4dCBsYWJlbCB0byB1c2UgYmVzaWRlIHRoZSBsb2NhbGUgc2Vuc2l0aXZlIGRlc2NyaXB0aW9uIG9mCi0JICogICAgICAgICAgICB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVuY29kaW5nCi0JICovCi0JcHVibGljIEVuY29kaW5nU2V0dGluZ3MoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nIGlhbmFMYWJlbCwgU3RyaW5nIGVuY29kaW5nTGFiZWwpIHsKLQkJc3VwZXIocGFyZW50LCBTV1QuTk9ORSk7Ci0JCWluaXQoaWFuYUxhYmVsLCBlbmNvZGluZ0xhYmVsKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgYWRkRW50cnkuIEFkZCBhbiBlbnRyeSB0byB0aGUgZW5kIG9mIHRoZSBFbmNvZGluZyBDb21ib2JveAotCSAqIAotCSAqIEBwYXJhbSBkZXNjcmlwdGlvbiAtCi0JICogICAgICAgICAgICBlbmNvZGluZyBkZXNjcmlwdGlvbiB0byBkaXNwbGF5Ci0JICogQHBhcmFtIGlhbmFUYWcgLQotCSAqICAgICAgICAgICAgSUFOQSB0YWcgZm9yIHRoZSBkZXNjcmlwdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEVudHJ5KFN0cmluZyBkZXNjcmlwdGlvbiwgU3RyaW5nIGlhbmFUYWcpIHsKLQkJZW5jb2RpbmdDb21iby5hZGQoZGVzY3JpcHRpb24pOwotCQlpYW5hVmVjdG9yLmFkZChpYW5hVGFnKTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgYWRkRW50cnkuIEFkZCBhbiBlbnRyeSB0byB0aGUgRW5jb2RpbmcgQ29tYm9ib3ggYXQgaW5kZXggaW5kZXgKLQkgKiAKLQkgKiBAcGFyYW0gZGVzY3JpcHRpb24gLQotCSAqICAgICAgICAgICAgZW5jb2RpbmcgZGVzY3JpcHRpb24gdG8gZGlzcGxheQotCSAqIEBwYXJhbSBpYW5hVGFnIC0KLQkgKiAgICAgICAgICAgIElBTkEgdGFnIGZvciB0aGUgZGVzY3JpcHRpb24KLQkgKiBAcGFyYW0gaW5kZXggLQotCSAqICAgICAgICAgICAgaW5kZXggaW50byB0aGUgY29tYm8gdG8gYWRkIHRvCi0JICovCi0JcHVibGljIHZvaWQgYWRkRW50cnkoU3RyaW5nIGRlc2NyaXB0aW9uLCBTdHJpbmcgaWFuYVRhZywgaW50IGluZGV4KSB7Ci0JCWlmIChpbmRleCA9PSBpYW5hVmVjdG9yLnNpemUoKSkgewotCQkJLy8ganVzdCBhZGQgdG8gdGhlIGVuZAotCQkJYWRkRW50cnkoZGVzY3JpcHRpb24sIGlhbmFUYWcpOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBpYW5hVmVjdG9yLnNpemUoKSkgewotCQkJZW5jb2RpbmdDb21iby5hZGQoZGVzY3JpcHRpb24sIGluZGV4KTsKLQkJCWlhbmFWZWN0b3IuYWRkKGluZGV4LCBpYW5hVGFnKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCBDb21ibyBjcmVhdGVDb21ib0JveChDb21wb3NpdGUgcGFyZW50LCBib29sZWFuIGlzUmVhZE9ubHkpIHsKLQkJaW50IHN0eWxlID0gaXNSZWFkT25seSA9PSB0cnVlID8gU1dULlJFQURfT05MWSA6IFNXVC5EUk9QX0RPV047Ci0KLQkJQ29tYm8gY29tYm8gPSBuZXcgQ29tYm8ocGFyZW50LCBzdHlsZSk7Ci0KLQkJR3JpZERhdGEgZGF0YSA9IG5ldyBHcmlkRGF0YSgpOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQljb21iby5zZXRMYXlvdXREYXRhKGRhdGEpOwotCQlyZXR1cm4gY29tYm87Ci0JfQotCi0JLyoqCi0JICogSGVscGVyIG1ldGhvZCBmb3IgY3JlYXRpbmcgbGFiZWxzLgotCSAqLwotCXByb3RlY3RlZCBMYWJlbCBjcmVhdGVMYWJlbChDb21wb3NpdGUgcGFyZW50LCBTdHJpbmcgdGV4dCkgewotCQlMYWJlbCBsYWJlbCA9IG5ldyBMYWJlbChwYXJlbnQsIFNXVC5MRUZUKTsKLQkJbGFiZWwuc2V0VGV4dCh0ZXh0KTsKLQotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkZJTEw7Ci0JCWxhYmVsLnNldExheW91dERhdGEoZGF0YSk7Ci0JCXJldHVybiBsYWJlbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgVGV4dCBjcmVhdGVUZXh0RmllbGQoQ29tcG9zaXRlIHBhcmVudCwgaW50IHdpZHRoKSB7Ci0JCVRleHQgdGV4dCA9IG5ldyBUZXh0KHBhcmVudCwgU1dULlNJTkdMRSB8IFNXVC5SRUFEX09OTFkpOwotCi0JCUdyaWREYXRhIGRhdGEgPSBuZXcgR3JpZERhdGEoKTsKLQkJZGF0YS5ob3Jpem9udGFsQWxpZ25tZW50ID0gR3JpZERhdGEuRklMTDsKLQkJZGF0YS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQkJZGF0YS53aWR0aEhpbnQgPSB3aWR0aDsKLQkJdGV4dC5zZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCXJldHVybiB0ZXh0OwotCX0KLQotCS8qKgotCSAqIEBzZWUgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuV2lkZ2V0I2Rpc3Bvc2UoKQotCSAqLwotCXB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0JCWVuY29kaW5nQ29tYm8ucmVtb3ZlTW9kaWZ5TGlzdGVuZXIoY29tYm9MaXN0ZW5lcik7Ci0JCXN1cGVyLmRpc3Bvc2UoKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgZmlsbENvbWJvKCkgewotCQl0cnkgewotCQkJU3RyaW5nW10gaWFuYVRhZ3MgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0Q29tbW9uQ2hhcnNldE5hbWVzKCk7Ci0JCQlpbnQgdG90YWxOdW0gPSBpYW5hVGFncy5sZW5ndGg7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsTnVtOyBpKyspIHsKLQkJCQlTdHJpbmcgaWFuYSA9IGlhbmFUYWdzW2ldOwotCQkJCVN0cmluZyBlbmMgPSBDb21tb25DaGFyc2V0TmFtZXMuZ2V0RGlzcGxheVN0cmluZyhpYW5hKTsKLQotCQkJCWlmIChlbmMgIT0gbnVsbCkgewotCQkJCQllbmNvZGluZ0NvbWJvLmFkZChlbmMpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCUxvZ2dlci5sb2coTG9nZ2VyLldBUk5JTkcsICJDb21tb25DaGFyc2V0TmFtZXMuZ2V0RGlzcGxheVN0cmluZygiICsgaWFuYSArICIpIHJldHVybmVkIG51bGwiKTsgLy8kTk9OLU5MUy0xJCAvLyROT04tTkxTLTIkCi0JCQkJCWVuY29kaW5nQ29tYm8uYWRkKGlhbmEpOwotCQkJCX0KLQkJCQlpYW5hVmVjdG9yLmFkZChpYW5hKTsKLQkJCX0KLQkJfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJCS8vTWVzc2FnZURpYWxvZy5vcGVuRXJyb3IoZ2V0U2hlbGwoKSwgIlJlc291cmNlIGV4Y2VwdGlvbiIsCi0JCQkvLyAiVW5hYmxlIHRvIG9idGFpbiBlbmNvZGluZyBzdHJpbmdzLiBDaGVjayByZXNvdXJjZSBmaWxlIik7Ci0JCQkvL1hNTEVuY29kaW5nUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlKGUudG9TdHJpbmcoKSk7Ci0JCQkvL1hNTEVuY29kaW5nUGx1Z2luLmdldFBsdWdpbigpLmdldE1zZ0xvZ2dlcigpLndyaXRlQ3VycmVudFRocmVhZCgpOwotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuRVJST1IsICJFeGNlcHRpb24iLCBlKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Z2V0RW5jb2Rpbmc8L2NvZGU+IEdldCB0aGUgZGVzY3JpcHRpdmUgZW5jb2RpbmcgbmFtZSB0aGF0IHdhcwotCSAqIHNlbGVjdGVkLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRFbmNvZGluZygpIHsKLQkJcmV0dXJuIGVuY29kaW5nQ29tYm8uZ2V0VGV4dCgpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBnZXRFbmNvZGluZ0NvbWJvLiBSZXR1cm5zIHRoZSBjb21ibyB1c2VkIHRvIGRpc3BsYXkgdGhlIGVuY29kaW5nCi0JICogZGVzY3JpcHRpb25zLgotCSAqIAotCSAqIEByZXR1cm4gQ29tYm8KLQkgKi8KLQlwdWJsaWMgQ29tYm8gZ2V0RW5jb2RpbmdDb21ibygpIHsKLQkJcmV0dXJuIGVuY29kaW5nQ29tYm87Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Z2V0SUFOQVRhZzwvY29kZT4gR2V0IHRoZSBJQU5BIHRhZyBlcXVpdmFsZW50IG9mIHRoZSBzZWxlY3RlZAotCSAqIGRlc2NyaXB0aXZlIGVuY29kaW5nIG5hbWUKLQkgKiAKLQkgKiBAcmV0dXJuIGEgPGNvZGU+U3RyaW5nPC9jb2RlPiB2YWx1ZQotCSAqLwotCXB1YmxpYyBTdHJpbmcgZ2V0SUFOQVRhZygpIHsKLQkJaW50IGkgPSBlbmNvZGluZ0NvbWJvLmdldFNlbGVjdGlvbkluZGV4KCk7Ci0JCWlmIChpID49IDApIHsKLQkJCXJldHVybiAoU3RyaW5nKSAoaWFuYVZlY3Rvci5lbGVtZW50QXQoaSkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXQoU3RyaW5nIGlhbmFMYWJlbFN0ciwgU3RyaW5nIGVuY29kaW5nTGFiZWxTdHIpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDI7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCWVuY29kaW5nTGFiZWwgPSBjcmVhdGVMYWJlbCh0aGlzLCBlbmNvZGluZ0xhYmVsU3RyKTsKLQkJZW5jb2RpbmdDb21ibyA9IGNyZWF0ZUNvbWJvQm94KHRoaXMsIHRydWUpOwotCQlpYW5hTGFiZWwgPSBjcmVhdGVMYWJlbCh0aGlzLCBpYW5hTGFiZWxTdHIpOwotCQlpYW5hVGV4dCA9IGNyZWF0ZVRleHRGaWVsZCh0aGlzLCAyMCk7Ci0JCWlhbmFWZWN0b3IgPSBuZXcgVmVjdG9yKCk7Ci0KLQkJZmlsbENvbWJvKCk7Ci0JCXJlc2V0VG9EZWZhdWx0RW5jb2RpbmcoKTsKLQkJZW5jb2RpbmdDb21iby5hZGRNb2RpZnlMaXN0ZW5lcihjb21ib0xpc3RlbmVyKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5pc0VuY29kaW5nSW5MaXN0PC9jb2RlPiBDaGVja3Mgd2hldGhlciB0aGUgZW5jb2RpbmcgbmFtZSBpcyBpbgotCSAqIHRoZSBjb21ibwotCSAqIAotCSAqIEBwYXJhbSBlbmMKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+c3RyaW5nPC9jb2RlPiB2YWx1ZS4gVGhlIGVuY29kaW5nIG5hbWUuCi0JICogQHJldHVybiBhIDxjb2RlPmJvb2xlYW48L2NvZGU+IHZhbHVlLiBUUlVFIGlmIGVuY29kaW5nIGlzIGluIGxpc3QuCi0JICogICAgICAgICBGQUxTRSBpZiBlbmNvZGluZyBpcyBub3QgaW4gbGlzdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0VuY29kaW5nSW5MaXN0KFN0cmluZyBlbmMpIHsKLQkJaW50IGkgPSBlbmNvZGluZ0NvbWJvLmluZGV4T2YoZW5jKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJcmV0dXJuIHRydWU7Ci0JCX0KLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCS8qKgotCSAqIDxjb2RlPmlzSUFOQVRhZ0luTGlzdDwvY29kZT4gQ2hlY2tzIHdoZXRoZXIgdGhlIElBTkEgdGFnIGlzIGluIHRoZQotCSAqIGNvbWJvCi0JICogCi0JICogQHBhcmFtIGlhbmFUYWcKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+c3RyaW5nPC9jb2RlPiB2YWx1ZS4gVGhlIElBTkEgdGFnLgotCSAqIEByZXR1cm4gYSA8Y29kZT5ib29sZWFuPC9jb2RlPiB2YWx1ZS4gVFJVRSBpZiB0YWcgaXMgaW4gbGlzdC4gRkFMU0UKLQkgKiAgICAgICAgIGlmIHRhZyBpcyBub3QgaW4gbGlzdC4KLQkgKi8KLQlwdWJsaWMgYm9vbGVhbiBpc0lBTkFUYWdJbkxpc3QoU3RyaW5nIGlhbmFUYWcpIHsKLQkJaW50IGkgPSBpYW5hVmVjdG9yLmluZGV4T2YoaWFuYVRhZyk7Ci0JCWlmIChpID49IDApIHsKLQkJCXJldHVybiB0cnVlOwotCQl9Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBNZXRob2QgcmVtb3ZlRW50cnkuIFJlbW92ZXMgYm90aCB0aGUgZGVzY3JpcHRpb24gYW5kIHRoZSBJQU5BIHRhZyBhdAotCSAqIHRoZSBzcGVjaWZpZWQgaW5kZXgKLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXgKLQkgKi8KLQlwdWJsaWMgdm9pZCByZW1vdmVFbnRyeShpbnQgaW5kZXgpIHsKLQkJaWYgKDAgPD0gaW5kZXggJiYgaW5kZXggPCBpYW5hVmVjdG9yLnNpemUoKSkgewotCQkJZW5jb2RpbmdDb21iby5yZW1vdmUoaW5kZXgpOwotCQkJaWFuYVZlY3Rvci5yZW1vdmUoaW5kZXgpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogTWV0aG9kIHJlc2V0VG9EZWZhdWx0RW5jb2RpbmcuIFJlc2V0IHRoZSBjb250cm9sIHRvIHRoZSBkZWZhdWx0Ci0JICogZW5jb2RpbmcuIEN1cnJlbnRseSBVVEYtOAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0VG9EZWZhdWx0RW5jb2RpbmcoKSB7Ci0JCVN0cmluZyBkZWZhdWx0SUFOQVRhZyA9ICJVVEYtOCI7IC8vJE5PTi1OTFMtMSQKLQkJaWFuYVRleHQuc2V0VGV4dChkZWZhdWx0SUFOQVRhZyk7Ci0JCXNldElBTkFUYWcoZGVmYXVsdElBTkFUYWcpOwotCX0KLQotCS8qKgotCSAqIE1ldGhvZCBzZXRFbmFibGVkLiBFbmFibGUvZGlzYWJsZSB0aGUgRW5jb2RpbmdTZXR0aW5ncyBjb21wb3NpdGUuCi0JICogCi0JICogQHBhcmFtIGVuYWJsZWQKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotCQllbmNvZGluZ0NvbWJvLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWVuY29kaW5nTGFiZWwuc2V0RW5hYmxlZChlbmFibGVkKTsKLQkJaWFuYUxhYmVsLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JCWlhbmFUZXh0LnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+c2V0RW5jb2Rpbmc8L2NvZGU+IFNldCB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb21ibyB0byB0aGUKLQkgKiBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lLgotCSAqIAotCSAqIEBwYXJhbSBlbmMKLQkgKiAgICAgICAgICAgIGEgPGNvZGU+c3RyaW5nPC9jb2RlPiB2YWx1ZS4gTm90ZSB0aGlzIGlzIG5vdCB0aGUgSUFOQQotCSAqICAgICAgICAgICAgdGFnLgotCSAqLwotCXB1YmxpYyB2b2lkIHNldEVuY29kaW5nKFN0cmluZyBlbmMpIHsKLQkJZW5jb2RpbmdDb21iby5zZXRUZXh0KGVuYyk7Ci0JCWVuY29kaW5nQ29tYm8uc2VsZWN0KGVuY29kaW5nQ29tYm8uaW5kZXhPZihlbmMpKTsKLQl9Ci0KLQkvKioKLQkgKiA8Y29kZT5zZXRJQU5BVGFnPC9jb2RlPiBTZXQgdGhlIElBTkEgdGFnIGZvciB0aGUgY29tYm8KLQkgKiAKLQkgKiBAcGFyYW0gaWFuYVRhZwotCSAqICAgICAgICAgICAgYSA8Y29kZT5zdHJpbmc8L2NvZGU+IHZhbHVlLiBUaGUgSUFOQSB0YWcuCi0JICovCi0JcHVibGljIHZvaWQgc2V0SUFOQVRhZyhTdHJpbmcgaWFuYVRhZykgewotCQlpbnQgaSA9IGlhbmFWZWN0b3IuaW5kZXhPZihpYW5hVGFnKTsKLQkJaWYgKGkgPj0gMCkgewotCQkJZW5jb2RpbmdDb21iby5zZWxlY3QoaSk7Ci0JCX0KLQl9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9Xb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncy5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1dvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTZiMWEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1dvcmtiZW5jaERlZmF1bHRFbmNvZGluZ1NldHRpbmdzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuUmVzb3VyY2VzUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5TZWxlY3Rpb25BZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ldmVudHMuU2VsZWN0aW9uRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmxheW91dC5HcmlkRGF0YTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWRMYXlvdXQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuZW5jb2RpbmcuQ29tbW9uQ2hhcnNldE5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncyBpcyBhbiBleHRlbnNpb24gb2YgRW5jb2RpbmdTZXR0aW5ncy4gVGhpcwotICogY29tcG9zaXRlIGNvbnRhaW5zIEVuY29kaW5nU2V0dGluZ3MgZm9yIHVzZXJzIHRvIHNlbGVjdCB0aGUgZW5jb2RpbmcgdGhleQotICogZGVzaXJlIGFzIHdlbGwgYXMgYSBjaGVja2JveCBmb3IgdXNlcnMgdG8gc2VsZWN0IHRvIHVzZSB0aGUgZGVmYXVsdAotICogd29ya2JlbmNoIGVuY29kaW5nIGluc3RlYWQuCi0gKiAKLSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy5FbmNvZGluZ1NldHRpbmdzCi0gKi8KLXB1YmxpYyBjbGFzcyBXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncyBleHRlbmRzIENvbXBvc2l0ZSB7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgSU5ERU5UID0gMTU7Ci0JcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktCRU5DSF9ERUZBVUxUID0gIiI7IC8vJE5PTi1OTFMtMSQKLQlwcml2YXRlIEVuY29kaW5nU2V0dGluZ3MgZkVuY29kaW5nU2V0dGluZ3M7Ci0JcHJpdmF0ZSBTdHJpbmcgZk5vbkRlZmF1bHRJQU5BID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBmVXNlRGVmYXVsdEJ1dHRvbjsKLQotCXB1YmxpYyBXb3JrYmVuY2hEZWZhdWx0RW5jb2RpbmdTZXR0aW5ncyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCXN1cGVyKHBhcmVudCwgU1dULk5PTkUpOwotCQljcmVhdGVDb250cm9scygpOwotCX0KLQotCXByaXZhdGUgdm9pZCBjcmVhdGVDb250cm9scygpIHsKLQkJR3JpZExheW91dCBsYXlvdXQgPSBuZXcgR3JpZExheW91dCgpOwotCQlsYXlvdXQubnVtQ29sdW1ucyA9IDE7Ci0JCWxheW91dC5tYXJnaW5XaWR0aCA9IDA7Ci0JCXNldExheW91dChsYXlvdXQpOwotCQlHcmlkRGF0YSBkYXRhID0gbmV3IEdyaWREYXRhKCk7Ci0JCWRhdGEudmVydGljYWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmhvcml6b250YWxBbGlnbm1lbnQgPSBHcmlkRGF0YS5GSUxMOwotCQlkYXRhLmdyYWJFeGNlc3NIb3Jpem9udGFsU3BhY2UgPSB0cnVlOwotCQlzZXRMYXlvdXREYXRhKGRhdGEpOwotCi0JCUNvbXBvc2l0ZSBkZWZhdWx0RW5jb2RpbmdDb21wb3NpdGUgPSBuZXcgQ29tcG9zaXRlKHRoaXMsIFNXVC5OT05FKTsKLQkJbGF5b3V0ID0gbmV3IEdyaWRMYXlvdXQoKTsKLQkJbGF5b3V0Lm1hcmdpbldpZHRoID0gMDsKLQkJbGF5b3V0Lm1hcmdpbkhlaWdodCA9IDA7Ci0JCWRhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuRklMTF9CT1RIKTsKLQkJZGVmYXVsdEVuY29kaW5nQ29tcG9zaXRlLnNldExheW91dChsYXlvdXQpOwotCQlkZWZhdWx0RW5jb2RpbmdDb21wb3NpdGUuc2V0TGF5b3V0RGF0YShkYXRhKTsKLQotCQlmVXNlRGVmYXVsdEJ1dHRvbiA9IG5ldyBCdXR0b24oZGVmYXVsdEVuY29kaW5nQ29tcG9zaXRlLCBTV1QuQ0hFQ0spOwotCQlmVXNlRGVmYXVsdEJ1dHRvbi5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuV29ya2JlbmNoRGVmYXVsdEVuY29kaW5nU2V0dGluZ3NfMCk7IC8vJE5PTi1OTFMtMSQKLQotCQlmVXNlRGVmYXVsdEJ1dHRvbi5hZGRTZWxlY3Rpb25MaXN0ZW5lcihuZXcgU2VsZWN0aW9uQWRhcHRlcigpIHsKLQkJCXB1YmxpYyB2b2lkIHdpZGdldFNlbGVjdGVkKFNlbGVjdGlvbkV2ZW50IGUpIHsKLQkJCQloYW5kbGVVc2VEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoKTsKLQkJCX0KLQkJfSk7Ci0KLQkJZkVuY29kaW5nU2V0dGluZ3MgPSBuZXcgRW5jb2RpbmdTZXR0aW5ncyh0aGlzKTsKLQkJKChHcmlkTGF5b3V0KSBmRW5jb2RpbmdTZXR0aW5ncy5nZXRMYXlvdXQoKSkubWFyZ2luV2lkdGggPSAwOwotCQkoKEdyaWREYXRhKSBmRW5jb2RpbmdTZXR0aW5ncy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxJbmRlbnQgPSBJTkRFTlQ7Ci0KLQl9Ci0KLQlwcml2YXRlIENvbWJvIGdldEVuY29kaW5nQ29tYm8oKSB7Ci0JCXJldHVybiBmRW5jb2RpbmdTZXR0aW5ncy5nZXRFbmNvZGluZ0NvbWJvKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+Z2V0SUFOQVRhZzwvY29kZT4gR2V0IHRoZSBJQU5BIHRhZyBlcXVpdmFsZW50IG9mIHRoZSBzZWxlY3RlZAotCSAqIGRlc2NyaXB0aXZlIGVuY29kaW5nIG5hbWUuIFJldHVybnMgZW1wdHkgc3RyaW5nIGlmIHVzaW5nIHdvcmtiZW5jaAotCSAqIGVuY29kaW5nLgotCSAqIAotCSAqIEByZXR1cm4gYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHZhbHVlCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRJQU5BVGFnKCkgewotCQlpZiAoIWlzRGVmYXVsdCgpKQotCQkJcmV0dXJuIGZFbmNvZGluZ1NldHRpbmdzLmdldElBTkFUYWcoKTsKLQkJcmV0dXJuIFdPUktCRU5DSF9ERUZBVUxUOwotCX0KLQotCXByaXZhdGUgU3RyaW5nIGdldFdvcmtiZW5jaEVuY29kaW5nKCkgewotCQlyZXR1cm4gUmVzb3VyY2VzUGx1Z2luLmdldEVuY29kaW5nKCk7Ci0JfQotCi0Jdm9pZCBoYW5kbGVVc2VEZWZhdWx0QnV0dG9uU2VsZWN0ZWQoKSB7Ci0JCWlmIChmVXNlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSkgewotCQkJZk5vbkRlZmF1bHRJQU5BID0gZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpOwotCQkJU3RyaW5nIHdvcmtiZW5jaFZhbHVlID0gZ2V0V29ya2JlbmNoRW5jb2RpbmcoKTsKLQkJCXdvcmtiZW5jaFZhbHVlID0gQ29tbW9uQ2hhcnNldE5hbWVzLmdldElhbmFQcmVmZXJyZWRDaGFyc2V0TmFtZSh3b3JrYmVuY2hWYWx1ZSk7Ci0JCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKHdvcmtiZW5jaFZhbHVlKTsKLQkJfSBlbHNlIGlmIChmTm9uRGVmYXVsdElBTkEgIT0gbnVsbCkgewotCQkJZkVuY29kaW5nU2V0dGluZ3Muc2V0SUFOQVRhZyhmTm9uRGVmYXVsdElBTkEpOwotCQl9Ci0JCWdldEVuY29kaW5nQ29tYm8oKS5zZXRFbmFibGVkKCFmVXNlRGVmYXVsdEJ1dHRvbi5nZXRTZWxlY3Rpb24oKSk7Ci0JCWZFbmNvZGluZ1NldHRpbmdzLnNldEVuYWJsZWQoIWZVc2VEZWZhdWx0QnV0dG9uLmdldFNlbGVjdGlvbigpKTsKLQl9Ci0KLQlwcml2YXRlIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotCQlyZXR1cm4gZlVzZURlZmF1bHRCdXR0b24uZ2V0U2VsZWN0aW9uKCk7Ci0JfQotCi0JLyoqCi0JICogPGNvZGU+c2V0RW5jb2Rpbmc8L2NvZGU+IFNldCB0aGUgc2VsZWN0aW9uIGluIHRoZSBjb21ibyB0byB0aGUKLQkgKiBkZXNjcmlwdGl2ZSBlbmNvZGluZyBuYW1lLiBTZWxlY3RzIHVzZSB3b3JrYmVuY2ggZW5jb2RpbmcgaWYgaWFuYVRhZyBpcwotCSAqIG51bGwgb3IgZW1wdHkgc3RyaW5nLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHNldElBTkFUYWcoU3RyaW5nIGlhbmFUYWcpIHsKLQkJaWYgKGlhbmFUYWcgPT0gbnVsbCB8fCBpYW5hVGFnLmVxdWFscyhXT1JLQkVOQ0hfREVGQVVMVCkpIHsKLQkJCWZVc2VEZWZhdWx0QnV0dG9uLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpOwotCQl9IGVsc2UgewotCQkJZlVzZURlZmF1bHRCdXR0b24uc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJCWhhbmRsZVVzZURlZmF1bHRCdXR0b25TZWxlY3RlZCgpOwotCQkJaWYgKCFpc0RlZmF1bHQoKSkKLQkJCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGlhbmFUYWcpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvbG9yUGFnZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTENvbG9yUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWQ5MzUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxDb2xvclBhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OwotaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbnRyb2w7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlNTRVVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuT3ZlcmxheVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLk92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0Q29sb3JQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuU3R5bGVkVGV4dENvbG9yUGlja2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5jb250ZW50dHlwZS5Db250ZW50VHlwZUlkRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi1wdWJsaWMgY2xhc3MgWE1MQ29sb3JQYWdlIGV4dGVuZHMgQWJzdHJhY3RDb2xvclBhZ2UgewotCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIHBhcmVudCkgewotCQlDb21wb3NpdGUgcGFnZUNvbXBvbmVudCA9IGNyZWF0ZUNvbXBvc2l0ZShwYXJlbnQsIDEpOwotCQkoKEdyaWREYXRhKSBwYWdlQ29tcG9uZW50LmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbEFsaWdubWVudCA9IEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fRklMTDsKLQotCQlzdXBlci5jcmVhdGVDb250ZW50cyhwYWdlQ29tcG9uZW50KTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChwYWdlQ29tcG9uZW50LCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1NUWUxFU19IRUxQSUQpOwotCQlyZXR1cm4gcGFnZUNvbXBvbmVudDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgdXAgYWxsIHRoZSBzdHlsZSBwcmVmZXJlbmNlIGtleXMgaW4gdGhlIG92ZXJsYXkgc3RvcmUKLQkgKi8KLQlwcm90ZWN0ZWQgT3ZlcmxheUtleVtdIGNyZWF0ZU92ZXJsYXlTdG9yZUtleXMoKSB7Ci0JCUFycmF5TGlzdCBvdmVybGF5S2V5cyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0JCUl0ZXJhdG9yIGkgPSBzdHlsZUxpc3QuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpKSB7Ci0JCQlvdmVybGF5S2V5cy5hZGQobmV3IE92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleShPdmVybGF5UHJlZmVyZW5jZVN0b3JlLlNUUklORywgKFN0cmluZykgaS5uZXh0KCkpKTsKLQkJfQotCi0JCU92ZXJsYXlQcmVmZXJlbmNlU3RvcmUuT3ZlcmxheUtleVtdIGtleXMgPSBuZXcgT3ZlcmxheVByZWZlcmVuY2VTdG9yZS5PdmVybGF5S2V5W292ZXJsYXlLZXlzLnNpemUoKV07Ci0JCW92ZXJsYXlLZXlzLnRvQXJyYXkoa2V5cyk7Ci0JCXJldHVybiBrZXlzOwotCX0KLQotCXByb3RlY3RlZCBJUHJlZmVyZW5jZVN0b3JlIGRvR2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0U2FtcGxlVGV4dCgpIHsKLQkJcmV0dXJuIFhNTFVJTWVzc2FnZXMuU2FtcGxlX1hNTF9kb2M7IC8vJE5PTi1OTFMtMSQgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz5cbjw/Y3VzdG9tUHJvY2Vzc2luZ0luc3RydWN0aW9uXG5cdFhNTCBwcm9jZXNzb3Igc3BlY2lmaWNcblx0Y29udGVudCA/PlxuPCFET0NUWVBFIGNvbG9yc1xuXHRQVUJMSUMgXCIvL0lCTS9YTUwvQ09MT1JTL1wiIFwiY29sb3JzLmR0ZFwiPlxuPGNvbG9ycz5cblx0PCEtLSBiZWdpbiBjb2xvciBkZWZpbml0aW9ucyAtLT5cblx0PGNvbG9yIG5hbWU9XCJwbGFpbnRleHRcIiBmb3JlZ3JvdW5kPVwiIzAwMDAwMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIi8+XG5cdDxjb2xvciBuYW1lPVwiYm9sZFwiIGZvcmVncm91bmQ9XCIjMDAwMDAwXCJcblx0XHRiYWNrZ3JvdW5kPVwiI0IzQUNBMFwiPlxuXHQ8IVtDREFUQVs8MTIzNDU2Nzg5Pl1dPlxuXHROb3JtYWwgdGV4dCBjb250ZW50LlxuXHQ8Y29sb3IgbmFtZT1cImludmVyc2VcIiBmb3JlZ3JvdW5kPVwiI0YwRjBGMFwiXG5cdFx0YmFja2dyb3VuZD1cIiNENEQwQzhcIi8+XG5cbjwvY29sb3JzPlxuIjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tbW9uQ29udGV4dFN0eWxlTWFwKERpY3Rpb25hcnkgY29udGV4dFN0eWxlTWFwKSB7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhUKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4sIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfREVDTEFSQVRJT05fQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMQVJBVElPTiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9FTEVNRU5UX0RFQ0xfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0KLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5ULCBJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRDb21tb25EZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQotCQkvLyBjcmVhdGUgZGVzY3JpcHRpb25zIGZvciBoaWxpZ2h0aW5nIHR5cGVzCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfRGVsaW1pdGVyc19VSV8pOyAvLyROT04tTkxTLTEkID0gIkNvbW1lbnQgRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9URVhULCBYTUxVSU1lc3NhZ2VzLkNvbW1lbnRfQ29udGVudF9VSV8pOyAvLyROT04tTkxTLTEkID0gIkNvbW1lbnQgQ29udGVudCIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5UYWdfRGVsaW1pdGVyc19VSV8pOyAvLyROT04tTkxTLTEkID0gIlRhZyBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgWE1MVUlNZXNzYWdlcy5UYWdfTmFtZXNfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJUYWcgTmFtZXMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfTmFtZXNfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJBdHRyaWJ1dGUgTmFtZXMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUsIFhNTFVJTWVzc2FnZXMuQXR0cmlidXRlX1ZhbHVlc19VSV8pOyAvLyROT04tTkxTLTEkID0gIkF0dHJpYnV0ZSBWYWx1ZXMiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLkRlY2xhcmF0aW9uX0RlbGltaXRlcnNfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJEZWNsYXJhdGlvbiBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCwgWE1MVUlNZXNzYWdlcy5Db250ZW50X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiQ29udGVudCIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0Q29tbW9uU3R5bGVMaXN0KEFycmF5TGlzdCBsaXN0KSB7Ci0KLQkJLy9saXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJLy9saXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCS8vbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCS8vbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCi0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfQk9SREVSKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5ERUNMX0JPUkRFUik7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdENvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCi0JCWluaXRDb21tb25Db250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJaW5pdERvY1R5cGVDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9PUEVOLCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9DREFUQV9URVhULCBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UsIElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUik7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCwgSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX0NMT1NFLCBJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSKTsKLQotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREZXNjcmlwdGlvbnMoRGljdGlvbmFyeSBkZXNjcmlwdGlvbnMpIHsKLQotCQlpbml0Q29tbW9uRGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCWluaXREb2NUeXBlRGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX0JPUkRFUiwgWE1MVUlNZXNzYWdlcy5DREFUQV9EZWxpbWl0ZXJzX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiQ0RBVEEgRGVsaW1pdGVycyIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCwgWE1MVUlNZXNzYWdlcy5DREFUQV9Db250ZW50X1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiQ0RBVEEgQ29udGVudCIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuUElfQk9SREVSLCBYTUxVSU1lc3NhZ2VzLlByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fRGVsX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBEZWxpbWl0ZXJzIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9DT05URU5ULCBYTUxVSU1lc3NhZ2VzLlByb2Nlc3NpbmdfSW5zdHJ1Y3Rpb25fQ29uX1VJX19VSV8pOyAvLyROT04tTkxTLTEkID0gIlByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb24gQ29udGVudCIKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0RG9jVHlwZUNvbnRleHRTdHlsZU1hcChEaWN0aW9uYXJ5IGNvbnRleHRTdHlsZU1hcCkgewotCi0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRUxFTUVOVF9ERUNMX05BTUUsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfREVDTEFSQVRJT04sIElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9ERUNMQVJBVElPTl9DTE9TRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSKTsKLQotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfTkFNRSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWNvbnRleHRTdHlsZU1hcC5wdXQoRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJMSUMsIElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRiwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKTsKLQkJY29udGV4dFN0eWxlTWFwLnB1dChET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1RFTSwgSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQljb250ZXh0U3R5bGVNYXAucHV0KERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLCBJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXREb2NUeXBlRGVzY3JpcHRpb25zKERpY3Rpb25hcnkgZGVzY3JpcHRpb25zKSB7Ci0KLQkJLy8gY3JlYXRlIGRlc2NyaXB0aW9ucyBmb3IgaGlsaWdodGluZyB0eXBlcyBmb3IgRE9DVFlQRSByZWxhdGVkIGl0ZW1zCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX05hbWVfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJET0NUWVBFIE5hbWUiCi0JCWRlc2NyaXB0aW9ucy5wdXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9TWVNURU1fUFVCTElDX0tleXdfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJET0NUWVBFIFNZU1RFTS9QVUJMSUMgS2V5d29yZCIKLQkJZGVzY3JpcHRpb25zLnB1dChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYsIFhNTFVJTWVzc2FnZXMuRE9DVFlQRV9QdWJsaWNfUmVmZXJlbmNlX1VJXyk7IC8vJE5PTi1OTFMtMSQgPSAiRE9DVFlQRSBQdWJsaWMgUmVmZXJlbmNlIgotCQlkZXNjcmlwdGlvbnMucHV0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRiwgWE1MVUlNZXNzYWdlcy5ET0NUWVBFX1N5c3RlbV9SZWZlcmVuY2VfVUlfKTsgLy8kTk9OLU5MUy0xJCA9ICJET0NUWVBFIFN5c3RlbSBSZWZlcmVuY2UiCi0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdERvY1R5cGVTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FKTsKLQkJbGlzdC5hZGQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRTdHlsZUxpc3QoQXJyYXlMaXN0IGxpc3QpIHsKLQkJaW5pdENvbW1vblN0eWxlTGlzdChsaXN0KTsKLQkJaW5pdERvY1R5cGVTdHlsZUxpc3QobGlzdCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCWxpc3QuYWRkKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQlsaXN0LmFkZChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQkvLyByZXF1aXJlZCBzaW5jZSB0aGUgc3VwZXJjbGFzcyAqcmVtb3ZlcyogZXhpc3RpbmcgcHJlZmVyZW5jZXMgYmVmb3JlCi0JCS8vIHNhdmluZyBpdHMgb3duCi0JCXN1cGVyLnBlcmZvcm1PaygpOwotCi0JCVNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsKLQkJcmV0dXJuIHRydWU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc2V0dXBQaWNrZXIoU3R5bGVkVGV4dENvbG9yUGlja2VyIHBpY2tlcikgewotCQlJTW9kZWxNYW5hZ2VyIG1tYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQkJcGlja2VyLnNldFBhcnNlcihtbWFuYWdlci5jcmVhdGVTdHJ1Y3R1cmVkRG9jdW1lbnRGb3IoQ29udGVudFR5cGVJZEZvclhNTC5Db250ZW50VHlwZUlEX1hNTCkuZ2V0UGFyc2VyKCkpOwotCi0JCURpY3Rpb25hcnkgZGVzY3JpcHRpb25zID0gbmV3IEhhc2h0YWJsZSgpOwotCQlpbml0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0KLQkJRGljdGlvbmFyeSBjb250ZXh0U3R5bGVNYXAgPSBuZXcgSGFzaHRhYmxlKCk7Ci0JCWluaXRDb250ZXh0U3R5bGVNYXAoY29udGV4dFN0eWxlTWFwKTsKLQotCQlBcnJheUxpc3Qgc3R5bGVMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQlpbml0U3R5bGVMaXN0KHN0eWxlTGlzdCk7Ci0KLQkJcGlja2VyLnNldENvbnRleHRTdHlsZU1hcChjb250ZXh0U3R5bGVNYXApOwotCQlwaWNrZXIuc2V0RGVzY3JpcHRpb25zKGRlc2NyaXB0aW9ucyk7Ci0JCXBpY2tlci5zZXRTdHlsZUxpc3Qoc3R5bGVMaXN0KTsKLQl9Ci0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdENvbG9yUGFnZSNzYXZlUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCB2b2lkIHNhdmVQcmVmZXJlbmNlcygpIHsKLQkJWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MRmlsZXNQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTcxNjY5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxGaWxlc1ByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5QcmVmZXJlbmNlczsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudC5JQ29udGVudFR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uub3NnaS51dGlsLk5MUzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QubGF5b3V0LkdyaWREYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkJ1dHRvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29udHJvbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Hcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5MYWJlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5UZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmVuY29kaW5nLkNvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMudWkuQWJzdHJhY3RQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MQ29yZVByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuY29udGVudHR5cGUuQ29udGVudFR5cGVJZEZvclhNTDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi1wdWJsaWMgY2xhc3MgWE1MRmlsZXNQcmVmZXJlbmNlUGFnZSBleHRlbmRzIEFic3RyYWN0UHJlZmVyZW5jZVBhZ2UgewotCXByb3RlY3RlZCBFbmNvZGluZ1NldHRpbmdzIGZFbmNvZGluZ1NldHRpbmdzID0gbnVsbDsKLQotCXByb3RlY3RlZCBDb21ibyBmRW5kT2ZMaW5lQ29kZSA9IG51bGw7Ci0JcHJpdmF0ZSBWZWN0b3IgZkVPTENvZGVzID0gbnVsbDsKLQlwcml2YXRlIFRleHQgZkRlZmF1bHRTdWZmaXggPSBudWxsOwotCXByaXZhdGUgTGlzdCBmVmFsaWRFeHRlbnNpb25zID0gbnVsbDsKLQlwcml2YXRlIEJ1dHRvbiBmV2Fybk5vR3JhbW1hciA9IG51bGw7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9GSUxFU19IRUxQSUQpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nT3JTYXZpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQkJY3JlYXRlQ29udGVudHNGb3JWYWxpZGF0aW5nR3JvdXAoY29tcG9zaXRlKTsKLQotCQlzZXRTaXplKGNvbXBvc2l0ZSk7Ci0JCWxvYWRQcmVmZXJlbmNlcygpOwotCi0JCXJldHVybiBjb21wb3NpdGU7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JDcmVhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgY3JlYXRpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNyZWF0aW5nR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzKTsKLQotCQkvLyBEZWZhdWx0IGV4dGVuc2lvbiBmb3IgTmV3IGZpbGUgV2l6YXJkCi0JCWNyZWF0ZUxhYmVsKGNyZWF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25MYWJlbCk7Ci0JCWZEZWZhdWx0U3VmZml4ID0gY3JlYXRlVGV4dEZpZWxkKGNyZWF0aW5nR3JvdXApOwotCQlmRGVmYXVsdFN1ZmZpeC5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKGNyZWF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuRW5jb2RpbmdfZGVzYyk7Ci0JCSgoR3JpZERhdGEpIGxhYmVsLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmRW5jb2RpbmdTZXR0aW5ncyA9IG5ldyBFbmNvZGluZ1NldHRpbmdzKGNyZWF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuRW5jb2RpbmcpOwotCQkoKEdyaWREYXRhKSBmRW5jb2RpbmdTZXR0aW5ncy5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNyZWF0aW5nT3JTYXZpbmdHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGNyZWF0aW5nT3JTYXZpbmdHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNyZWF0aW5nT3JTYXZpbmdHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ3JlYXRpbmdfb3Jfc2F2aW5nX2ZpbGVzKTsKLQotCQlMYWJlbCBsYWJlbCA9IGNyZWF0ZUxhYmVsKGNyZWF0aW5nT3JTYXZpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5FbmRfb2ZfbGluZV9jb2RlX2Rlc2MpOwotCQkoKEdyaWREYXRhKSBsYWJlbC5nZXRMYXlvdXREYXRhKCkpLmhvcml6b250YWxTcGFuID0gMjsKLQkJKChHcmlkRGF0YSkgbGFiZWwuZ2V0TGF5b3V0RGF0YSgpKS5ncmFiRXhjZXNzSG9yaXpvbnRhbFNwYWNlID0gdHJ1ZTsKLQotCQljcmVhdGVMYWJlbChjcmVhdGluZ09yU2F2aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuRW5kX29mX2xpbmVfY29kZSk7Ci0JCWZFbmRPZkxpbmVDb2RlID0gY3JlYXRlRHJvcERvd25Cb3goY3JlYXRpbmdPclNhdmluZ0dyb3VwKTsKLQkJcG9wdWxhdGVMaW5lRGVsaW1pdGVycygpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGNyZWF0ZUNvbnRlbnRzRm9yVmFsaWRhdGluZ0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgdmFsaWRhdGluZ0dyb3VwID0gY3JlYXRlR3JvdXAocGFyZW50LCAyKTsKLQkJdmFsaWRhdGluZ0dyb3VwLnNldFRleHQoWE1MVUlNZXNzYWdlcy5WYWxpZGF0aW5nX2ZpbGVzKTsKLQotCQlpZiAoZldhcm5Ob0dyYW1tYXIgPT0gbnVsbCkgewotCQkJZldhcm5Ob0dyYW1tYXIgPSBjcmVhdGVDaGVja0JveCh2YWxpZGF0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuV2Fybl9ub19ncmFtbWFyX3NwZWNpZmllZCk7Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotCQlmRGVmYXVsdFN1ZmZpeC5yZW1vdmVNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQkJc3VwZXIuZGlzcG9zZSgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpIHsKLQkJWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7IC8vIG1vZGVsCi0JfQotCi0JLyoqCi0JICogR2V0IGNvbnRlbnQgdHlwZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBuZXcgZmlsZSB3aXphcmQKLQkgKiAKLQkgKiBAcmV0dXJuIElDb250ZW50VHlwZQotCSAqLwotCXByb3RlY3RlZCBJQ29udGVudFR5cGUgZ2V0Q29udGVudFR5cGUoKSB7Ci0JCXJldHVybiBQbGF0Zm9ybS5nZXRDb250ZW50VHlwZU1hbmFnZXIoKS5nZXRDb250ZW50VHlwZShDb250ZW50VHlwZUlkRm9yWE1MLkNvbnRlbnRUeXBlSURfWE1MKTsKLQl9Ci0KLQkvKioKLQkgKiBHZXQgbGlzdCBvZiB2YWxpZCBleHRlbnNpb25zCi0JICogCi0JICogQHJldHVybiBMaXN0Ci0JICovCi0JcHJpdmF0ZSBMaXN0IGdldFZhbGlkRXh0ZW5zaW9ucygpIHsKLQkJaWYgKGZWYWxpZEV4dGVuc2lvbnMgPT0gbnVsbCkgewotCQkJSUNvbnRlbnRUeXBlIHR5cGUgPSBnZXRDb250ZW50VHlwZSgpOwotCQkJZlZhbGlkRXh0ZW5zaW9ucyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdCh0eXBlLmdldEZpbGVTcGVjcyhJQ29udGVudFR5cGUuRklMRV9FWFRFTlNJT05fU1BFQykpKTsKLQkJfQotCQlyZXR1cm4gZlZhbGlkRXh0ZW5zaW9uczsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBsaW5lIGRlbGltaXRlciBwcmVmZXJlbmNlCi0JICogCi0JICogQHJldHVybiBhIGxpbmUgZGVsaW1pdGVyIGNvbnN0YW50IGZyb20gQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50RU9MQ29kZSgpIHsKLQkJaW50IGkgPSBmRW5kT2ZMaW5lQ29kZS5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgKGZFT0xDb2Rlcy5lbGVtZW50QXQoaSkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5wcmVmZXJlbmNlcy51aS5BYnN0cmFjdFByZWZlcmVuY2VQYWdlI2dldE1vZGVsUHJlZmVyZW5jZXMoKQotCSAqLwotCXByb3RlY3RlZCBQcmVmZXJlbmNlcyBnZXRNb2RlbFByZWZlcmVuY2VzKCkgewotCQlyZXR1cm4gWE1MQ29yZVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UGx1Z2luUHJlZmVyZW5jZXMoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzKCkgewotCQlpbml0aWFsaXplVmFsdWVzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JDcmVhdGluZ0dyb3VwKCk7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yQ3JlYXRpbmdHcm91cCgpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5ERUZBVUxUX0VYVEVOU0lPTik7Ci0JCWZEZWZhdWx0U3VmZml4LnNldFRleHQoc3VmZml4KTsKLQotCQlTdHJpbmcgZW5jb2RpbmcgPSBnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQotCQlmRW5jb2RpbmdTZXR0aW5ncy5zZXRJQU5BVGFnKGVuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKCkgewotCQlTdHJpbmcgZW5kT2ZMaW5lQ29kZSA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSk7Ci0KLQkJaWYgKGVuZE9mTGluZUNvZGUubGVuZ3RoKCkgPiAwKQotCQkJc2V0Q3VycmVudEVPTENvZGUoZW5kT2ZMaW5lQ29kZSk7Ci0JCWVsc2UKLQkJCXNldEN1cnJlbnRFT0xDb2RlKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk5PX1RSQU5TTEFUSU9OKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yVmFsaWRhdGluZ0dyb3VwKCkgewotCQlib29sZWFuIHdhcm5Ob0dyYW1tYXJCdXR0b25TZWxlY3RlZCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0FSTl9OT19HUkFNTUFSKTsKLQotCi0JCWlmIChmV2Fybk5vR3JhbW1hciAhPSBudWxsKSB7Ci0JCQlmV2Fybk5vR3JhbW1hci5zZXRTZWxlY3Rpb24od2Fybk5vR3JhbW1hckJ1dHRvblNlbGVjdGVkKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0cygpIHsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckNyZWF0aW5nR3JvdXAoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yVmFsaWRhdGluZ0dyb3VwKCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yQ3JlYXRpbmdHcm91cCgpIHsKLQkJU3RyaW5nIHN1ZmZpeCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuREVGQVVMVF9FWFRFTlNJT04pOwotCQlmRGVmYXVsdFN1ZmZpeC5zZXRUZXh0KHN1ZmZpeCk7Ci0KLQkJU3RyaW5nIGVuY29kaW5nID0gZ2V0TW9kZWxQcmVmZXJlbmNlcygpLmdldERlZmF1bHRTdHJpbmcoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuT1VUUFVUX0NPREVTRVQpOwotCi0JCWZFbmNvZGluZ1NldHRpbmdzLnNldElBTkFUYWcoZW5jb2RpbmcpOwotCQkvLyBmRW5jb2RpbmdTZXR0aW5ncy5yZXNldFRvRGVmYXVsdEVuY29kaW5nKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yQ3JlYXRpbmdPclNhdmluZ0dyb3VwKCkgewotCQlTdHJpbmcgZW5kT2ZMaW5lQ29kZSA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkVORF9PRl9MSU5FX0NPREUpOwotCi0JCWlmIChlbmRPZkxpbmVDb2RlLmxlbmd0aCgpID4gMCkKLQkJCXNldEN1cnJlbnRFT0xDb2RlKGVuZE9mTGluZUNvZGUpOwotCQllbHNlCi0JCQlzZXRDdXJyZW50RU9MQ29kZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5OT19UUkFOU0xBVElPTik7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yVmFsaWRhdGluZ0dyb3VwKCkgewotCQlib29sZWFuIHdhcm5Ob0dyYW1tYXJCdXR0b25TZWxlY3RlZCA9IGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLldBUk5fTk9fR1JBTU1BUik7Ci0KLQkJaWYgKGZXYXJuTm9HcmFtbWFyICE9IG51bGwpIHsKLQkJCWZXYXJuTm9HcmFtbWFyLnNldFNlbGVjdGlvbih3YXJuTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQpOwotCQl9Ci0JfQotCi0JcHVibGljIGJvb2xlYW4gcGVyZm9ybU9rKCkgewotCQlib29sZWFuIHJlc3VsdCA9IHN1cGVyLnBlcmZvcm1PaygpOwotCi0JCWRvU2F2ZVByZWZlcmVuY2VTdG9yZSgpOwotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogUG9wdWxhdGVzIHRoZSB2ZWN0b3IgY29udGFpbmluZyB0aGUgbGluZSBkZWxpbWl0ZXIgdG8gZGlzcGxheSBzdHJpbmcKLQkgKiBtYXBwaW5nIGFuZCB0aGUgY29tYm9ib3ggZGlzcGxheWluZyBsaW5lIGRlbGltaXRlcnMKLQkgKi8KLQlwcml2YXRlIHZvaWQgcG9wdWxhdGVMaW5lRGVsaW1pdGVycygpIHsKLQkJZkVPTENvZGVzID0gbmV3IFZlY3RvcigpOwotCQlmRW5kT2ZMaW5lQ29kZS5hZGQoWE1MVUlNZXNzYWdlcy5FT0xfVW5peCk7Ci0JCWZFT0xDb2Rlcy5hZGQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuTEYpOwotCi0JCWZFbmRPZkxpbmVDb2RlLmFkZChYTUxVSU1lc3NhZ2VzLkVPTF9NYWMpOwotCQlmRU9MQ29kZXMuYWRkKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLkNSKTsKLQotCQlmRW5kT2ZMaW5lQ29kZS5hZGQoWE1MVUlNZXNzYWdlcy5FT0xfV2luZG93cyk7Ci0JCWZFT0xDb2Rlcy5hZGQoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuQ1JMRik7Ci0KLQkJZkVuZE9mTGluZUNvZGUuYWRkKFhNTFVJTWVzc2FnZXMuRU9MX05vVHJhbnNsYXRpb24pOwotCQlmRU9MQ29kZXMuYWRkKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk5PX1RSQU5TTEFUSU9OKTsKLQl9Ci0KLQkvKioKLQkgKiBTZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIGluIHRoZSBlb2wgY29tYm9ib3gKLQkgKiAKLQkgKi8KLQlwcml2YXRlIHZvaWQgc2V0Q3VycmVudEVPTENvZGUoU3RyaW5nIGVvbENvZGUpIHsKLQkJLy8gQ2xlYXIgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLgotCQlmRW5kT2ZMaW5lQ29kZS5jbGVhclNlbGVjdGlvbigpOwotCQlmRW5kT2ZMaW5lQ29kZS5kZXNlbGVjdEFsbCgpOwotCi0JCWludCBpID0gZkVPTENvZGVzLmluZGV4T2YoZW9sQ29kZSk7Ci0JCWlmIChpID49IDApIHsKLQkJCWZFbmRPZkxpbmVDb2RlLnNlbGVjdChpKTsKLQkJfQotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzKCkgewotCQlzdG9yZVZhbHVlc0ZvckNyZWF0aW5nT3JTYXZpbmdHcm91cCgpOwotCQlzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKTsKLQkJc3RvcmVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckNyZWF0aW5nR3JvdXAoKSB7Ci0JCVN0cmluZyBzdWZmaXggPSBmRGVmYXVsdFN1ZmZpeC5nZXRUZXh0KCk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkRFRkFVTFRfRVhURU5TSU9OLCBzdWZmaXgpOwotCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShDb21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lcy5PVVRQVVRfQ09ERVNFVCwgZkVuY29kaW5nU2V0dGluZ3MuZ2V0SUFOQVRhZygpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckNyZWF0aW5nT3JTYXZpbmdHcm91cCgpIHsKLQkJU3RyaW5nIGVvbENvZGUgPSBnZXRDdXJyZW50RU9MQ29kZSgpOwotCQlnZXRNb2RlbFByZWZlcmVuY2VzKCkuc2V0VmFsdWUoQ29tbW9uRW5jb2RpbmdQcmVmZXJlbmNlTmFtZXMuRU5EX09GX0xJTkVfQ09ERSwgZW9sQ29kZSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXNGb3JWYWxpZGF0aW5nR3JvdXAoKSB7Ci0JCWlmIChmV2Fybk5vR3JhbW1hciAhPSBudWxsKSB7Ci0JCQlib29sZWFuIHdhcm5Ob0dyYW1tYXJCdXR0b25TZWxlY3RlZCA9IGZXYXJuTm9HcmFtbWFyLmdldFNlbGVjdGlvbigpOwotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuV0FSTl9OT19HUkFNTUFSLCB3YXJuTm9HcmFtbWFyQnV0dG9uU2VsZWN0ZWQpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgdmFsaWRhdGVWYWx1ZXMoKSB7Ci0JCWJvb2xlYW4gaXNWYWxpZCA9IGZhbHNlOwotCQlJdGVyYXRvciBpID0gZ2V0VmFsaWRFeHRlbnNpb25zKCkuaXRlcmF0b3IoKTsKLQkJd2hpbGUgKGkuaGFzTmV4dCgpICYmICFpc1ZhbGlkKSB7Ci0JCQlTdHJpbmcgZXh0ZW5zaW9uID0gKFN0cmluZykgaS5uZXh0KCk7Ci0JCQlpc1ZhbGlkID0gZXh0ZW5zaW9uLmVxdWFsc0lnbm9yZUNhc2UoZkRlZmF1bHRTdWZmaXguZ2V0VGV4dCgpKTsKLQkJfQotCi0JCWlmICghaXNWYWxpZCkgewotCQkJc2V0RXJyb3JNZXNzYWdlKE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuWE1MRmlsZXNQcmVmZXJlbmNlUGFnZV9FeHRlbnNpb25FcnJvciwgZ2V0VmFsaWRFeHRlbnNpb25zKCkudG9TdHJpbmcoKSkpOwotCQkJc2V0VmFsaWQoZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJc2V0RXJyb3JNZXNzYWdlKG51bGwpOwotCQkJc2V0VmFsaWQodHJ1ZSk7Ci0JCX0KLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MU291cmNlUHJlZmVyZW5jZVBhZ2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjExZTQ0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxTb3VyY2VQcmVmZXJlbmNlUGFnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUzICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5JUHJlZmVyZW5jZVN0b3JlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5TV1Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmV2ZW50cy5Nb2RpZnlMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZXZlbnRzLlNlbGVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5sYXlvdXQuR3JpZERhdGE7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQnV0dG9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbWJvOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkxhYmVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLlNwaW5uZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuVGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByZWZlcmVuY2VzLnVpLkFic3RyYWN0UHJlZmVyZW5jZVBhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLlhNTENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhNTENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuSUhlbHBDb250ZXh0SWRzOwotCi1wdWJsaWMgY2xhc3MgWE1MU291cmNlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VQYWdlIGltcGxlbWVudHMgTW9kaWZ5TGlzdGVuZXIsIFNlbGVjdGlvbkxpc3RlbmVyLCBJV29ya2JlbmNoUHJlZmVyZW5jZVBhZ2UgewotCXByaXZhdGUgZmluYWwgaW50IE1JTl9JTkRFTlRBVElPTl9TSVpFID0gMDsKLQlwcml2YXRlIGZpbmFsIGludCBNQVhfSU5ERU5UQVRJT05fU0laRSA9IDE2OwotCi0JLy8gQ29udGVudCBBc3Npc3QKLQlwcm90ZWN0ZWQgQnV0dG9uIGZBdXRvUHJvcG9zZTsKLQlwcm90ZWN0ZWQgTGFiZWwgZkF1dG9Qcm9wb3NlTGFiZWw7Ci0JcHJvdGVjdGVkIFRleHQgZkF1dG9Qcm9wb3NlVGV4dDsKLQlwcml2YXRlIENvbWJvIGZTdWdnZXN0aW9uU3RyYXRlZ3lDb21ibzsKLQlwcml2YXRlIFZlY3RvciBmU3VnZ2VzdGlvblN0cmF0ZWdpZXMgPSBudWxsOwotCXByb3RlY3RlZCBCdXR0b24gZkNsZWFyQWxsQmxhbmtMaW5lczsKLQotCS8vIEZvcm1hdHRpbmcKLQlwcm90ZWN0ZWQgTGFiZWwgZkxpbmVXaWR0aExhYmVsOwotCXByb3RlY3RlZCBUZXh0IGZMaW5lV2lkdGhUZXh0OwotCXByb3RlY3RlZCBCdXR0b24gZlNwbGl0TXVsdGlBdHRyczsKLQlwcml2YXRlIEJ1dHRvbiBmSW5kZW50VXNpbmdUYWJzOwotCXByaXZhdGUgQnV0dG9uIGZJbmRlbnRVc2luZ1NwYWNlczsKLQlwcml2YXRlIFNwaW5uZXIgZkluZGVudGF0aW9uU2l6ZTsKLQotCS8vIGdyYW1tYXIgY29uc3RyYWludHMKLQlwcm90ZWN0ZWQgQnV0dG9uIGZVc2VJbmZlcnJlZEdyYW1tYXI7Ci0KLQlwcm90ZWN0ZWQgQ29udHJvbCBjcmVhdGVDb250ZW50cyhDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUNvbXBvc2l0ZSBjb21wb3NpdGUgPSAoQ29tcG9zaXRlKSBzdXBlci5jcmVhdGVDb250ZW50cyhwYXJlbnQpOwotCQlQbGF0Zm9ybVVJLmdldFdvcmtiZW5jaCgpLmdldEhlbHBTeXN0ZW0oKS5zZXRIZWxwKGNvbXBvc2l0ZSwgSUhlbHBDb250ZXh0SWRzLlhNTF9QUkVGV0VCWF9TT1VSQ0VfSEVMUElEKTsKLQotCQljcmVhdGVDb250ZW50c0ZvckZvcm1hdHRpbmdHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChjb21wb3NpdGUpOwotCQljcmVhdGVDb250ZW50c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKGNvbXBvc2l0ZSk7Ci0JCXNldFNpemUoY29tcG9zaXRlKTsKLQkJbG9hZFByZWZlcmVuY2VzKCk7Ci0KLQkJcmV0dXJuIGNvbXBvc2l0ZTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckNvbnRlbnRBc3Npc3RHcm91cChDb21wb3NpdGUgcGFyZW50KSB7Ci0JCUdyb3VwIGNvbnRlbnRBc3Npc3RHcm91cCA9IGNyZWF0ZUdyb3VwKHBhcmVudCwgMik7Ci0JCWNvbnRlbnRBc3Npc3RHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuQ29udGVudF9hc3Npc3RfVUlfKTsKLQotCQlmQXV0b1Byb3Bvc2UgPSBjcmVhdGVDaGVja0JveChjb250ZW50QXNzaXN0R3JvdXAsIFhNTFVJTWVzc2FnZXMuQXV0b21hdGljYWxseV9tYWtlX3N1Z2dlc3RfVUlfKTsKLQkJKChHcmlkRGF0YSkgZkF1dG9Qcm9wb3NlLmdldExheW91dERhdGEoKSkuaG9yaXpvbnRhbFNwYW4gPSAyOwotCQlmQXV0b1Byb3Bvc2UuYWRkU2VsZWN0aW9uTGlzdGVuZXIodGhpcyk7Ci0KLQkJZkF1dG9Qcm9wb3NlTGFiZWwgPSBjcmVhdGVMYWJlbChjb250ZW50QXNzaXN0R3JvdXAsIFhNTFVJTWVzc2FnZXMuUHJvbXB0X3doZW5fdGhlc2VfY2hhcmFjdGVfVUlfKTsKLQkJZkF1dG9Qcm9wb3NlVGV4dCA9IGNyZWF0ZVRleHRGaWVsZChjb250ZW50QXNzaXN0R3JvdXApOwotCi0JCWNyZWF0ZUxhYmVsKGNvbnRlbnRBc3Npc3RHcm91cCwgWE1MVUlNZXNzYWdlcy5TdWdnZXN0aW9uX1N0cmF0ZWd5KTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvID0gbmV3IENvbWJvKGNvbnRlbnRBc3Npc3RHcm91cCwgU1dULlJFQURfT05MWSk7Ci0JCWZTdWdnZXN0aW9uU3RyYXRlZ2llcyA9IG5ldyBWZWN0b3IoKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCkpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uYWRkKFhNTFVJTWVzc2FnZXMuU3VnZ2VzdGlvbl9TdHJhdGVneV9MYXgpOwotCQlmU3VnZ2VzdGlvblN0cmF0ZWdpZXMuYWRkKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlNVR0dFU1RJT05fU1RSQVRFR1lfVkFMVUVfTEFYKTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmFkZChYTUxVSU1lc3NhZ2VzLlN1Z2dlc3Rpb25fU3RyYXRlZ3lfU3RyaWN0KTsKLQkJZlN1Z2dlc3Rpb25TdHJhdGVnaWVzLmFkZChYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX1NUUklDVCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgY3JlYXRlQ29udGVudHNGb3JGb3JtYXR0aW5nR3JvdXAoQ29tcG9zaXRlIHBhcmVudCkgewotCQlHcm91cCBmb3JtYXR0aW5nR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDIpOwotCQlmb3JtYXR0aW5nR3JvdXAuc2V0VGV4dChYTUxVSU1lc3NhZ2VzLkZvcm1hdHRpbmdfVUlfKTsKLQotCQlmTGluZVdpZHRoTGFiZWwgPSBjcmVhdGVMYWJlbChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuTGluZV93aWR0aF9fVUlfKTsKLQkJZkxpbmVXaWR0aFRleHQgPSBuZXcgVGV4dChmb3JtYXR0aW5nR3JvdXAsIFNXVC5TSU5HTEUgfCBTV1QuQk9SREVSKTsKLQkJR3JpZERhdGEgZ0RhdGEgPSBuZXcgR3JpZERhdGEoR3JpZERhdGEuSE9SSVpPTlRBTF9BTElHTl9CRUdJTk5JTkcgfCBHcmlkRGF0YS5CRUdJTk5JTkcpOwotCQlnRGF0YS53aWR0aEhpbnQgPSAyNTsKLQkJZkxpbmVXaWR0aFRleHQuc2V0TGF5b3V0RGF0YShnRGF0YSk7Ci0JCWZMaW5lV2lkdGhUZXh0LmFkZE1vZGlmeUxpc3RlbmVyKHRoaXMpOwotCi0JCWZTcGxpdE11bHRpQXR0cnMgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuU3BsaXRfbXVsdGlwbGVfYXR0cmlidXRlcyk7Ci0JCSgoR3JpZERhdGEpIGZTcGxpdE11bHRpQXR0cnMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMgPSBjcmVhdGVDaGVja0JveChmb3JtYXR0aW5nR3JvdXAsIFhNTFVJTWVzc2FnZXMuQ2xlYXJfYWxsX2JsYW5rX2xpbmVzX1VJXyk7Ci0JCSgoR3JpZERhdGEpIGZDbGVhckFsbEJsYW5rTGluZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJZkluZGVudFVzaW5nVGFicyA9IGNyZWF0ZVJhZGlvQnV0dG9uKGZvcm1hdHRpbmdHcm91cCwgWE1MVUlNZXNzYWdlcy5JbmRlbnRfdXNpbmdfdGFicyk7Ci0JCSgoR3JpZERhdGEpIGZJbmRlbnRVc2luZ1RhYnMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJZkluZGVudFVzaW5nU3BhY2VzID0gY3JlYXRlUmFkaW9CdXR0b24oZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkluZGVudF91c2luZ19zcGFjZXMpOwotCQkoKEdyaWREYXRhKSBmSW5kZW50VXNpbmdTcGFjZXMuZ2V0TGF5b3V0RGF0YSgpKS5ob3Jpem9udGFsU3BhbiA9IDI7Ci0KLQkJY3JlYXRlTGFiZWwoZm9ybWF0dGluZ0dyb3VwLCBYTUxVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemUpOwotCQlmSW5kZW50YXRpb25TaXplID0gbmV3IFNwaW5uZXIoZm9ybWF0dGluZ0dyb3VwLCBTV1QuUkVBRF9PTkxZIHwgU1dULkJPUkRFUik7Ci0JCUdyaWREYXRhIGdkID0gbmV3IEdyaWREYXRhKEdyaWREYXRhLkhPUklaT05UQUxfQUxJR05fQkVHSU5OSU5HKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRMYXlvdXREYXRhKGdkKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLkluZGVudGF0aW9uX3NpemVfdGlwKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRNaW5pbXVtKE1JTl9JTkRFTlRBVElPTl9TSVpFKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRNYXhpbXVtKE1BWF9JTkRFTlRBVElPTl9TSVpFKTsKLQkJZkluZGVudGF0aW9uU2l6ZS5zZXRJbmNyZW1lbnQoMSk7Ci0JCWZJbmRlbnRhdGlvblNpemUuc2V0UGFnZUluY3JlbWVudCg0KTsKLQkJZkluZGVudGF0aW9uU2l6ZS5hZGRNb2RpZnlMaXN0ZW5lcih0aGlzKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBjcmVhdGVDb250ZW50c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKENvbXBvc2l0ZSBwYXJlbnQpIHsKLQkJR3JvdXAgZ3JhbW1hckNvbnN0cmFpbnRzR3JvdXAgPSBjcmVhdGVHcm91cChwYXJlbnQsIDEpOwotCQlncmFtbWFyQ29uc3RyYWludHNHcm91cC5zZXRUZXh0KFhNTFVJTWVzc2FnZXMuR3JhbW1hcl9Db25zdHJhaW50cyk7Ci0JCWdyYW1tYXJDb25zdHJhaW50c0dyb3VwLnNldExheW91dERhdGEobmV3IEdyaWREYXRhKEdyaWREYXRhLkZJTExfSE9SSVpPTlRBTCB8IEdyaWREYXRhLkdSQUJfSE9SSVpPTlRBTCkpOwotCi0JCWZVc2VJbmZlcnJlZEdyYW1tYXIgPSBjcmVhdGVDaGVja0JveChncmFtbWFyQ29uc3RyYWludHNHcm91cCwgWE1MVUlNZXNzYWdlcy5Vc2VfaW5mZXJyZWRfZ3JhbW1hcl9pbl9hYnNlbmNlX29mKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSVByZWZlcmVuY2VTdG9yZSBkb0dldFByZWZlcmVuY2VTdG9yZSgpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NhdmVQcmVmZXJlbmNlU3RvcmUoKSB7Ci0JCVhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5zYXZlUGx1Z2luUHJlZmVyZW5jZXMoKTsgLy8gZWRpdG9yCi0JCVhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLnNhdmVQbHVnaW5QcmVmZXJlbmNlcygpOyAvLyBtb2RlbAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVZhbHVlcygpIHsKLQkJaWYgKGZBdXRvUHJvcG9zZSAhPSBudWxsKSB7Ci0JCQlpZiAoZkF1dG9Qcm9wb3NlLmdldFNlbGVjdGlvbigpKSB7Ci0JCQkJZkF1dG9Qcm9wb3NlTGFiZWwuc2V0RW5hYmxlZCh0cnVlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQodHJ1ZSk7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmQXV0b1Byb3Bvc2VMYWJlbC5zZXRFbmFibGVkKGZhbHNlKTsKLQkJCQlmQXV0b1Byb3Bvc2VUZXh0LnNldEVuYWJsZWQoZmFsc2UpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIFByZWZlcmVuY2VzIGdldE1vZGVsUHJlZmVyZW5jZXMoKSB7Ci0JCXJldHVybiBYTUxDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpOwotCX0KLQotCS8qKgotCSAqIFJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZQotCSAqIAotCSAqIEByZXR1cm4gYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGNvbnN0YW50IGZyb20gWE1MVUlQcmVmZXJlbmNlTmFtZXMKLQkgKi8KLQlwcml2YXRlIFN0cmluZyBnZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KCkgewotCQlpbnQgaSA9IGZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5nZXRTZWxlY3Rpb25JbmRleCgpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlyZXR1cm4gKFN0cmluZykgKGZTdWdnZXN0aW9uU3RyYXRlZ2llcy5lbGVtZW50QXQoaSkpOwotCQl9Ci0JCXJldHVybiAiIjsgLy8kTk9OLU5MUy0xJAotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXMoKSB7Ci0JCWluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJaW5pdGlhbGl6ZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpOwotCQlpbml0aWFsaXplVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBpbml0aWFsaXplVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlmQXV0b1Byb3Bvc2Uuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldEJvb2xlYW4oWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFKSk7Ci0JCWZBdXRvUHJvcG9zZVRleHQuc2V0VGV4dChnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRTdHJpbmcoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFX0NPREUpKTsKLQkJU3RyaW5nIHN1Z2dlc3Rpb25TdHJhdGVneSA9IGdldFByZWZlcmVuY2VTdG9yZSgpLmdldFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZKTsKLQkJaWYgKHN1Z2dlc3Rpb25TdHJhdGVneS5sZW5ndGgoKSA+IDApCi0JCQlzZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KHN1Z2dlc3Rpb25TdHJhdGVneSk7Ci0JCWVsc2UKLQkJCXNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9MQVgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGluaXRpYWxpemVWYWx1ZXNGb3JGb3JtYXR0aW5nR3JvdXAoKSB7Ci0JCS8vIEZvcm1hdHRpbmcKLQkJZkxpbmVXaWR0aFRleHQuc2V0VGV4dChnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQlmU3BsaXRNdWx0aUF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0Qm9vbGVhbihYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTKSk7Ci0JCWZDbGVhckFsbEJsYW5rTGluZXMuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRCb29sZWFuKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTKSk7Ci0KLQkJaWYgKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuVEFCLmVxdWFscyhnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCi0JCWZJbmRlbnRhdGlvblNpemUuc2V0U2VsZWN0aW9uKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXRJbnQoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5JTkRFTlRBVElPTl9TSVpFKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgaW5pdGlhbGl6ZVZhbHVlc0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKCkgewotCQlmVXNlSW5mZXJyZWRHcmFtbWFyLnNldFNlbGVjdGlvbihnZXRQcmVmZXJlbmNlU3RvcmUoKS5nZXRCb29sZWFuKFhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzKCkgewotCQlwZXJmb3JtRGVmYXVsdHNGb3JGb3JtYXR0aW5nR3JvdXAoKTsKLQkJcGVyZm9ybURlZmF1bHRzRm9yQ29udGVudEFzc2lzdEdyb3VwKCk7Ci0JCXBlcmZvcm1EZWZhdWx0c0ZvckdyYW1tYXJDb25zdHJhaW50c0dyb3VwKCk7Ci0KLQkJdmFsaWRhdGVWYWx1ZXMoKTsKLQkJZW5hYmxlVmFsdWVzKCk7Ci0KLQkJc3VwZXIucGVyZm9ybURlZmF1bHRzKCk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgcGVyZm9ybURlZmF1bHRzRm9yQ29udGVudEFzc2lzdEdyb3VwKCkgewotCQkvLyBDb250ZW50IEFzc2lzdAotCQlmQXV0b1Byb3Bvc2Uuc2V0U2VsZWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLmdldERlZmF1bHRCb29sZWFuKFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRSkpOwotCQlmQXV0b1Byb3Bvc2VUZXh0LnNldFRleHQoZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSkpOwotCQlTdHJpbmcgc3VnZ2VzdGlvblN0cmF0ZWd5ID0gZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdFN0cmluZyhYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZKTsKLQkJaWYgKHN1Z2dlc3Rpb25TdHJhdGVneS5sZW5ndGgoKSA+IDApCi0JCQlzZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KHN1Z2dlc3Rpb25TdHJhdGVneSk7Ci0JCWVsc2UKLQkJCXNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koWE1MVUlQcmVmZXJlbmNlTmFtZXMuU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9MQVgpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHBlcmZvcm1EZWZhdWx0c0ZvckZvcm1hdHRpbmdHcm91cCgpIHsKLQkJLy8gRm9ybWF0dGluZwotCQlmTGluZVdpZHRoVGV4dC5zZXRUZXh0KGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuTElORV9XSURUSCkpOwotCQlmU3BsaXRNdWx0aUF0dHJzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUExJVF9NVUxUSV9BVFRSUykpOwotCQlmQ2xlYXJBbGxCbGFua0xpbmVzLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5DTEVBUl9BTExfQkxBTktfTElORVMpKTsKLQotCQlpZiAoWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIuZXF1YWxzKGdldE1vZGVsUHJlZmVyZW5jZXMoKS5nZXREZWZhdWx0U3RyaW5nKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUikpKSB7Ci0JCQlmSW5kZW50VXNpbmdUYWJzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1NwYWNlcy5zZXRTZWxlY3Rpb24oZmFsc2UpOwotCQl9Ci0JCWVsc2UgewotCQkJZkluZGVudFVzaW5nU3BhY2VzLnNldFNlbGVjdGlvbih0cnVlKTsKLQkJCWZJbmRlbnRVc2luZ1RhYnMuc2V0U2VsZWN0aW9uKGZhbHNlKTsKLQkJfQotCQlmSW5kZW50YXRpb25TaXplLnNldFNlbGVjdGlvbihnZXRNb2RlbFByZWZlcmVuY2VzKCkuZ2V0RGVmYXVsdEludChYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLklOREVOVEFUSU9OX1NJWkUpKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBwZXJmb3JtRGVmYXVsdHNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpIHsKLQkJZlVzZUluZmVycmVkR3JhbW1hci5zZXRTZWxlY3Rpb24oZ2V0UHJlZmVyZW5jZVN0b3JlKCkuZ2V0RGVmYXVsdEJvb2xlYW4oWE1MVUlQcmVmZXJlbmNlTmFtZXMuVVNFX0lORkVSUkVEX0dSQU1NQVIpKTsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBwZXJmb3JtT2soKSB7Ci0JCWJvb2xlYW4gcmVzdWx0ID0gc3VwZXIucGVyZm9ybU9rKCk7Ci0KLQkJZG9TYXZlUHJlZmVyZW5jZVN0b3JlKCk7Ci0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKioKLQkgKiBTZXQgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGluIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgY29tYm8gYm94Ci0JICogCi0JICogQHBhcmFtIHN0cmF0ZWd5Ci0JICovCi0JcHJpdmF0ZSB2b2lkIHNldEN1cnJlbnRTdWdnZXN0aW9uU3RyYXRlZ3koU3RyaW5nIHN0cmF0ZWd5KSB7Ci0JCS8vIENsZWFyIHRoZSBjdXJyZW50IHNlbGVjdGlvbi4KLQkJZlN1Z2dlc3Rpb25TdHJhdGVneUNvbWJvLmNsZWFyU2VsZWN0aW9uKCk7Ci0JCWZTdWdnZXN0aW9uU3RyYXRlZ3lDb21iby5kZXNlbGVjdEFsbCgpOwotCi0JCWludCBpID0gZlN1Z2dlc3Rpb25TdHJhdGVnaWVzLmluZGV4T2Yoc3RyYXRlZ3kpOwotCQlpZiAoaSA+PSAwKSB7Ci0JCQlmU3VnZ2VzdGlvblN0cmF0ZWd5Q29tYm8uc2VsZWN0KGkpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXMoKSB7Ci0JCXN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yQ29udGVudEFzc2lzdEdyb3VwKCk7Ci0JCXN0b3JlVmFsdWVzRm9yR3JhbW1hckNvbnN0cmFpbnRzR3JvdXAoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBzdG9yZVZhbHVlc0ZvckNvbnRlbnRBc3Npc3RHcm91cCgpIHsKLQkJLy8gQ29udGVudCBBc3Npc3QKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoWE1MVUlQcmVmZXJlbmNlTmFtZXMuQVVUT19QUk9QT1NFLCBmQXV0b1Byb3Bvc2UuZ2V0U2VsZWN0aW9uKCkpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0VfQ09ERSwgZkF1dG9Qcm9wb3NlVGV4dC5nZXRUZXh0KCkpOwotCQlnZXRQcmVmZXJlbmNlU3RvcmUoKS5zZXRWYWx1ZShYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZLCBnZXRDdXJyZW50U3VnZ2VzdGlvblN0cmF0ZWd5KCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHN0b3JlVmFsdWVzRm9yRm9ybWF0dGluZ0dyb3VwKCkgewotCQkvLyBGb3JtYXR0aW5nCi0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLkxJTkVfV0lEVEgsIGZMaW5lV2lkdGhUZXh0LmdldFRleHQoKSk7Ci0JCWdldE1vZGVsUHJlZmVyZW5jZXMoKS5zZXRWYWx1ZShYTUxDb3JlUHJlZmVyZW5jZU5hbWVzLlNQTElUX01VTFRJX0FUVFJTLCBmU3BsaXRNdWx0aUF0dHJzLmdldFNlbGVjdGlvbigpKTsKLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuQ0xFQVJfQUxMX0JMQU5LX0xJTkVTLCBmQ2xlYXJBbGxCbGFua0xpbmVzLmdldFNlbGVjdGlvbigpKTsKLQotCQlpZiAoZkluZGVudFVzaW5nVGFicy5nZXRTZWxlY3Rpb24oKSkgewotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5UQUIpOwotCQl9Ci0JCWVsc2UgewotCQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fQ0hBUiwgWE1MQ29yZVByZWZlcmVuY2VOYW1lcy5TUEFDRSk7Ci0JCX0KLQkJZ2V0TW9kZWxQcmVmZXJlbmNlcygpLnNldFZhbHVlKFhNTENvcmVQcmVmZXJlbmNlTmFtZXMuSU5ERU5UQVRJT05fU0laRSwgZkluZGVudGF0aW9uU2l6ZS5nZXRTZWxlY3Rpb24oKSk7Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgc3RvcmVWYWx1ZXNGb3JHcmFtbWFyQ29uc3RyYWludHNHcm91cCgpIHsKLQkJZ2V0UHJlZmVyZW5jZVN0b3JlKCkuc2V0VmFsdWUoWE1MVUlQcmVmZXJlbmNlTmFtZXMuVVNFX0lORkVSUkVEX0dSQU1NQVIsIGZVc2VJbmZlcnJlZEdyYW1tYXIuZ2V0U2VsZWN0aW9uKCkpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVmFsdWVzKCkgewotCQlib29sZWFuIGlzRXJyb3IgPSBmYWxzZTsKLQkJU3RyaW5nIHdpZHRoVGV4dCA9IG51bGw7Ci0KLQkJaWYgKGZMaW5lV2lkdGhUZXh0ICE9IG51bGwpIHsKLQkJCXRyeSB7Ci0JCQkJd2lkdGhUZXh0ID0gZkxpbmVXaWR0aFRleHQuZ2V0VGV4dCgpOwotCQkJCWludCBmb3JtYXR0aW5nTGluZVdpZHRoID0gSW50ZWdlci5wYXJzZUludCh3aWR0aFRleHQpOwotCQkJCWlmICgoZm9ybWF0dGluZ0xpbmVXaWR0aCA8IFdJRFRIX1ZBTElEQVRJT05fTE9XRVJfTElNSVQpIHx8IChmb3JtYXR0aW5nTGluZVdpZHRoID4gV0lEVEhfVkFMSURBVElPTl9VUFBFUl9MSU1JVCkpCi0JCQkJCXRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oKTsKLQkJCX0KLQkJCWNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZleGMpIHsKLQkJCQlzZXRJbnZhbGlkSW5wdXRNZXNzYWdlKHdpZHRoVGV4dCk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJCWlzRXJyb3IgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaW50IGluZGVudFNpemUgPSAwOwotCQlpZiAoZkluZGVudGF0aW9uU2l6ZSAhPSBudWxsKSB7Ci0JCQl0cnkgewotCQkJCWluZGVudFNpemUgPSBmSW5kZW50YXRpb25TaXplLmdldFNlbGVjdGlvbigpOwotCQkJCWlmICgoaW5kZW50U2l6ZSA8IE1JTl9JTkRFTlRBVElPTl9TSVpFKSB8fCAoaW5kZW50U2l6ZSA+IE1BWF9JTkRFTlRBVElPTl9TSVpFKSkKLQkJCQkJdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigpOwotCQkJfQotCQkJY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBuZmV4YykgewotCQkJCXNldEludmFsaWRJbnB1dE1lc3NhZ2UoSW50ZWdlci50b1N0cmluZyhpbmRlbnRTaXplKSk7Ci0JCQkJc2V0VmFsaWQoZmFsc2UpOwotCQkJCWlzRXJyb3IgPSB0cnVlOwotCQkJfQotCQl9Ci0KLQkJaWYgKCFpc0Vycm9yKSB7Ci0JCQlzZXRFcnJvck1lc3NhZ2UobnVsbCk7Ci0JCQlzZXRWYWxpZCh0cnVlKTsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVGVtcGxhdGVQcmVmZXJlbmNlUGFnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTRjZjMyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UucmVzb3VyY2UuSkZhY2VSZXNvdXJjZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuSVNvdXJjZVZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5Tb3VyY2VWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UuU291cmNlVmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuU1dUOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db250cm9sOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLlBsYXRmb3JtVUk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLlN0cnVjdHVyZWRUZXh0Vmlld2VyQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLlN0cnVjdHVyZWRUZXh0Vmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuTGluZVN0eWxlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmNvbnRlbnR0eXBlLkNvbnRlbnRUeXBlSWRGb3JYTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5TdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb25YTUw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmVkaXRvci5JSGVscENvbnRleHRJZHM7Ci0KLQotLyoqCi0gKiBQcmVmZXJlbmNlIHBhZ2UgZm9yIFhNTCB0ZW1wbGF0ZXMKLSAqLwotcHVibGljIGNsYXNzIFhNTFRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UgZXh0ZW5kcyBUZW1wbGF0ZVByZWZlcmVuY2VQYWdlIHsKLQotCXB1YmxpYyBYTUxUZW1wbGF0ZVByZWZlcmVuY2VQYWdlKCkgewotCQlYTUxVSVBsdWdpbiB4bWxFZGl0b3JQbHVnaW4gPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCk7Ci0KLQkJc2V0UHJlZmVyZW5jZVN0b3JlKHhtbEVkaXRvclBsdWdpbi5nZXRQcmVmZXJlbmNlU3RvcmUoKSk7Ci0JCXNldFRlbXBsYXRlU3RvcmUoeG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlU3RvcmUoKSk7Ci0JCXNldENvbnRleHRUeXBlUmVnaXN0cnkoeG1sRWRpdG9yUGx1Z2luLmdldFRlbXBsYXRlQ29udGV4dFJlZ2lzdHJ5KCkpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UucHJlZmVyZW5jZS5QcmVmZXJlbmNlUGFnZSNjcmVhdGVDb250ZW50cyhvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGUpCi0JICovCi0JcHJvdGVjdGVkIENvbnRyb2wgY3JlYXRlQ29udGVudHMoQ29tcG9zaXRlIGFuY2VzdG9yKSB7Ci0JCUNvbnRyb2wgYyA9IHN1cGVyLmNyZWF0ZUNvbnRlbnRzKGFuY2VzdG9yKTsKLQkJUGxhdGZvcm1VSS5nZXRXb3JrYmVuY2goKS5nZXRIZWxwU3lzdGVtKCkuc2V0SGVscChjLCBJSGVscENvbnRleHRJZHMuWE1MX1BSRUZXRUJYX1RFTVBMQVRFU19IRUxQSUQpOwotCQlyZXR1cm4gYzsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLnVpLnRleHRlZGl0b3IudGVtcGxhdGVzLlRlbXBsYXRlUHJlZmVyZW5jZVBhZ2UjY3JlYXRlVmlld2VyKG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNvbXBvc2l0ZSkKLQkgKi8KLQlwcm90ZWN0ZWQgU291cmNlVmlld2VyIGNyZWF0ZVZpZXdlcihDb21wb3NpdGUgcGFyZW50KSB7Ci0JCVNvdXJjZVZpZXdlciB2aWV3ZXIgPSBudWxsOwotCQlTdHJpbmcgY29udGVudFR5cGVJRCA9IENvbnRlbnRUeXBlSWRGb3JYTUwuQ29udGVudFR5cGVJRF9YTUw7Ci0JCVNvdXJjZVZpZXdlckNvbmZpZ3VyYXRpb24gc291cmNlVmlld2VyQ29uZmlndXJhdGlvbiA9IG5ldyBTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24oKSB7Ci0JCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlckNvbmZpZ3VyYXRpb24gYmFzZUNvbmZpZ3VyYXRpb24gPSBuZXcgU3RydWN0dXJlZFRleHRWaWV3ZXJDb25maWd1cmF0aW9uWE1MKCk7Ci0KLQkJCXB1YmxpYyBTdHJpbmdbXSBnZXRDb25maWd1cmVkQ29udGVudFR5cGVzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyKSB7Ci0JCQkJcmV0dXJuIGJhc2VDb25maWd1cmF0aW9uLmdldENvbmZpZ3VyZWRDb250ZW50VHlwZXMoc291cmNlVmlld2VyKTsKLQkJCX0KLQotCQkJcHVibGljIExpbmVTdHlsZVByb3ZpZGVyW10gZ2V0TGluZVN0eWxlUHJvdmlkZXJzKElTb3VyY2VWaWV3ZXIgc291cmNlVmlld2VyLCBTdHJpbmcgcGFydGl0aW9uVHlwZSkgewotCQkJCXJldHVybiBiYXNlQ29uZmlndXJhdGlvbi5nZXRMaW5lU3R5bGVQcm92aWRlcnMoc291cmNlVmlld2VyLCBwYXJ0aXRpb25UeXBlKTsKLQkJCX0KLQkJfTsKLQkJdmlld2VyID0gbmV3IFN0cnVjdHVyZWRUZXh0Vmlld2VyKHBhcmVudCwgbnVsbCwgbnVsbCwgZmFsc2UsIFNXVC5CT1JERVIgfCBTV1QuVl9TQ1JPTEwgfCBTV1QuSF9TQ1JPTEwpOwotCQkoKFN0cnVjdHVyZWRUZXh0Vmlld2VyKSB2aWV3ZXIpLmdldFRleHRXaWRnZXQoKS5zZXRGb250KEpGYWNlUmVzb3VyY2VzLmdldFRleHRGb250KCkpOwotCQlJU3RydWN0dXJlZE1vZGVsIHNjcmF0Y2hNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuY3JlYXRlVW5NYW5hZ2VkU3RydWN0dXJlZE1vZGVsRm9yKGNvbnRlbnRUeXBlSUQpOwotCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBzY3JhdGNoTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCk7Ci0JCXZpZXdlci5jb25maWd1cmUoc291cmNlVmlld2VyQ29uZmlndXJhdGlvbik7Ci0JCXZpZXdlci5zZXREb2N1bWVudChkb2N1bWVudCk7Ci0JCXJldHVybiB2aWV3ZXI7Ci0JfQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UudWkudGV4dGVkaXRvci50ZW1wbGF0ZXMuVGVtcGxhdGVQcmVmZXJlbmNlUGFnZSNpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc1Nob3dGb3JtYXR0ZXJTZXR0aW5nKCkgewotCQkvLyB0ZW1wbGF0ZSBmb3JtYXR0aW5nIGhhcyBub3QgYmVlbiBpbXBsZW1lbnRlZAotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlUGFnZSNwZXJmb3JtT2soKQotCSAqLwotCXB1YmxpYyBib29sZWFuIHBlcmZvcm1PaygpIHsKLQkJYm9vbGVhbiBvayA9IHN1cGVyLnBlcmZvcm1PaygpOwotCQlYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuc2F2ZVBsdWdpblByZWZlcmVuY2VzKCk7Ci0JCXJldHVybiBvazsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQxZDc2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YTUxVSVByZWZlcmVuY2VJbml0aWFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcmVmZXJlbmNlcy51aS5Db2xvckhlbHBlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc3R5bGUuSVN0eWxlQ29uc3RhbnRzWE1MOwotCi0vKioKLSAqIFNldHMgZGVmYXVsdCB2YWx1ZXMgZm9yIFhNTCBVSSBwcmVmZXJlbmNlcwotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJUHJlZmVyZW5jZVN0b3JlIHN0b3JlID0gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCQkKLQkJc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5BVVRPX1BST1BPU0UsIHRydWUpOwotCQlzdG9yZS5zZXREZWZhdWx0KFhNTFVJUHJlZmVyZW5jZU5hbWVzLkFVVE9fUFJPUE9TRV9DT0RFLCAiPCIpOyAvLyROT04tTkxTLTEkCi0JCS8vIGh0dHBzOi8vYnVncy5lY2xpcHNlLm9yZy9idWdzL3Nob3dfYnVnLmNnaT9pZD0xNDA5NDYKLSAgICAgICAgc3RvcmUuc2V0RGVmYXVsdChYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZLCBYTUxVSVByZWZlcmVuY2VOYW1lcy5TVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX1NUUklDVCk7Ci0JCXN0b3JlLnNldERlZmF1bHQoCi0JCQkJCVhNTFVJUHJlZmVyZW5jZU5hbWVzLlVTRV9JTkZFUlJFRF9HUkFNTUFSLCB0cnVlKTsKLQotCQkvLyBYTUwgU3R5bGUgUHJlZmVyZW5jZXMKLQkJU3RyaW5nIE5PQkFDS0dST1VOREJPTEQgPSAiIHwgbnVsbCB8IGZhbHNlIjsgLy8kTk9OLU5MUy0xJAotCQlTdHJpbmcgc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDEyNywgMCwgMTI3KQotCQkJCSsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoNDIsIDAsIDI1NSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gIm51bGwiICsgTk9CQUNLR1JPVU5EQk9MRDsgLy8kTk9OLU5MUy0xJAotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUywgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZAotCQkvLyB2YWx1ZQotCQkvLyBpcwotCQkvLyBibGFjazsKLQkJLy8gbGVhdmluZwotCQkvLyBhcwotCQkvLyB3aWRnZXQKLQkJLy8gZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgOTUsIDE5MSkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRFQ0xfQk9SREVSLCBzdHlsZVZhbHVlKTsKLQotCQlzdHlsZVZhbHVlID0gQ29sb3JIZWxwZXIuZ2V0Q29sb3JTdHJpbmcoMCwgMCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGLAotCQkJCXN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygxMjgsIDEyOCwgMTI4KQotCQkJCSsgTk9CQUNLR1JPVU5EQk9MRDsKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRCwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDYzLCAxMjcsIDk1KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLAotCQkJCXN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSAibnVsbCIgKyBOT0JBQ0tHUk9VTkRCT0xEOyAvLyROT04tTkxTLTEkCi0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlhNTF9DT05URU5ULCBzdHlsZVZhbHVlKTsgLy8gc3BlY2lmaWVkCi0JCS8vIHZhbHVlCi0JCS8vIGlzCi0JCS8vIGJsYWNrOwotCQkvLyBsZWF2aW5nCi0JCS8vIGFzCi0JCS8vIHdpZGdldAotCQkvLyBkZWZhdWx0Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZyg2MywgMTI3LCAxMjcpCi0JCQkJKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9IENvbG9ySGVscGVyLmdldENvbG9yU3RyaW5nKDAsIDEyOCwgMTI4KSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUiwgc3R5bGVWYWx1ZSk7Ci0KLQkJc3R5bGVWYWx1ZSA9ICJudWxsIiArIE5PQkFDS0dST1VOREJPTEQ7IC8vJE5PTi1OTFMtMSQKLQkJc3RvcmUuc2V0RGVmYXVsdChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCwgc3R5bGVWYWx1ZSk7IC8vIHNwZWNpZmllZAotCQkvLyB2YWx1ZQotCQkvLyBpcwotCQkvLyBibGFjazsKLQkJLy8gbGVhdmluZwotCQkvLyBhcwotCQkvLyB3aWRnZXQKLQkJLy8gZGVmYXVsdAotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygwLCAxMjgsIDEyOCkgKyBOT0JBQ0tHUk9VTkRCT0xEOwotCQlzdG9yZS5zZXREZWZhdWx0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIsIHN0eWxlVmFsdWUpOwotCi0JCXN0eWxlVmFsdWUgPSBDb2xvckhlbHBlci5nZXRDb2xvclN0cmluZygwLCAwLCAwKSArIE5PQkFDS0dST1VOREJPTEQ7Ci0JCXN0b3JlLnNldERlZmF1bHQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQsIHN0eWxlVmFsdWUpOwotCX0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ByZWZlcmVuY2VzL1hNTFVJUHJlZmVyZW5jZU5hbWVzLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzNTUzMi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWE1MVUlQcmVmZXJlbmNlTmFtZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBQcmVmZXJlbmNlIGtleXMgZm9yIFhNTCBVSQotICovCi1wdWJsaWMgY2xhc3MgWE1MVUlQcmVmZXJlbmNlTmFtZXMgewotICAKLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIFN0cmluZyBTVUdHRVNUSU9OX1NUUkFURUdZX1ZBTFVFX0xBWCA9ICJMYXgiOwkvLyROT04tTkxTLTEkCi0gICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VHR0VTVElPTl9TVFJBVEVHWV9WQUxVRV9TVFJJQ1QgPSAiU3RyaWN0IjsJICAvLyROT04tTkxTLTEkCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgaWYgY29kZSBhc3Npc3QgZ2V0cyBhdXRvIGFjdGl2YXRlZC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1BST1BPU0UgPSBnZXRBdXRvUHJvcG9zZUtleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF1dG9Qcm9wb3NlS2V5KCkgewotCQlyZXR1cm4gImF1dG9Qcm9wb3NlIjsvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgaG9sZHMgdGhlIGNoYXJhY3RlcnMgdGhhdCBhdXRvIGFjdGl2YXRlIGNvZGUKLQkgKiBhc3Npc3QuCi0JICogPHA+Ci0JICogVmFsdWUgaXMgb2YgdHlwZSA8Y29kZT5TdHJpbmc8L2NvZGU+LiBBbGwgY2hhcmFjdGVycyB0aGF0IHRyaWdnZXIKLQkgKiBhdXRvIGNvZGUgYXNzaXN0LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRPX1BST1BPU0VfQ09ERSA9IGdldEF1dG9Qcm9wb3NlQ29kZUtleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF1dG9Qcm9wb3NlQ29kZUtleSgpIHsKLQkJcmV0dXJuICJhdXRvUHJvcG9zZUNvZGUiOy8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIGN1c3RvbWl6ZWQgdGVtcGxhdGVzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVTX0tFWSA9IGdldFRlbXBsYXRlc0tleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRlbXBsYXRlc0tleSgpIHsKLQkJcmV0dXJuICJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmN1c3RvbV90ZW1wbGF0ZXMiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JLyoqCi0JICogQSBuYW1lZCBwcmVmZXJlbmNlIHRoYXQgY29udHJvbHMgd2hldGhlciBvciBncmFtbWFyIHNob3VsZCBiZSBpbmZlcnJlZAotCSAqIG9yIG5vdC4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPkJvb2xlYW48L2NvZGU+LgotCSAqIDwvcD4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VfSU5GRVJSRURfR1JBTU1BUiA9IGdldFVzZUluZmVycmVkR3JhbW1hcktleSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFVzZUluZmVycmVkR3JhbW1hcktleSgpIHsKLQkJcmV0dXJuICJ1c2VJbmZlcnJlZEdyYW1tYXIiOyAvLyROT04tTkxTLTEkCi0JfQotICAgIAotICAgIC8qKgotICAgICAqIEEgbmFtZWQgcHJlZmVyZW5jZSB0aGF0IGhvbGRzIHRoZSBjaGFyYWN0ZXJzIHRoYXQgYXV0byBhY3RpdmF0ZSBjb2RlCi0gICAgICogYXNzaXN0LgotICAgICAqIDxwPgotICAgICAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4gQWxsIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VyCi0gICAgICogYXV0byBjb2RlIGFzc2lzdC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VHR0VTVElPTl9TVFJBVEVHWSA9IGdldFN1Z2dlc3Rpb25TdHJhdGVnZXlLZXkoKTsKLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTdWdnZXN0aW9uU3RyYXRlZ2V5S2V5KCkgewotICAgICAgICByZXR1cm4gInN1Z2dlc3Rpb25TdHJhdGVneSI7Ly8kTk9OLU5MUy0xJAotICAgIH0gICAgCi0KLQkvKioKLQkgKiBUaGUga2V5IHRvIHN0b3JlIHRoZSBsYXN0IHRlbXBsYXRlIG5hbWUgdXNlZCBpbiBuZXcgRFREIGZpbGUgd2l6YXJkLgotCSAqIFRlbXBsYXRlIG5hbWUgaXMgc3RvcmVkIGluc3RlYWQgb2YgdGVtcGxhdGUgaWQgYmVjYXVzZSB1c2VyLWNyZWF0ZWQKLQkgKiB0ZW1wbGF0ZXMgZG8gbm90IGhhdmUgdGVtcGxhdGUgaWRzLgotCSAqIDxwPgotCSAqIFZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+U3RyaW5nPC9jb2RlPi4KLQkgKiA8L3A+Ci0JICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkVXX0ZJTEVfVEVNUExBVEVfTkFNRSA9ICJuZXdGaWxlVGVtcGxhdGVOYW1lIjsgLy8kTk9OLU5MUy0xJAotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNDE1ZjkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBDb250YWlucyBhIHNldCBvZiBwcm9qZWN0aW9uIG1vZGVsIGFkZGl0aW9ucy9kZWxldGlvbnMvbW9kaWZpY2F0aW9ucwotICovCi1jbGFzcyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyB7Ci0JLy8gY29waWVzIG9mIHRoaXMgY2xhc3MgbG9jYXRlZCBpbjoKLQkvLyBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLmludGVybmFsLnByb2plY3Rpb24KLQkvLyBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JcHJpdmF0ZSBOb2RlIGZOb2RlOwotCXByaXZhdGUgQW5ub3RhdGlvbltdIGZEZWxldGlvbnM7Ci0JcHJpdmF0ZSBNYXAgZkFkZGl0aW9uczsKLQlwcml2YXRlIEFubm90YXRpb25bXSBmTW9kaWZpY2F0aW9uczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCWZOb2RlID0gbm9kZTsKLQkJZkRlbGV0aW9ucyA9IGRlbGV0aW9uczsKLQkJZkFkZGl0aW9ucyA9IGFkZGl0aW9uczsKLQkJZk1vZGlmaWNhdGlvbnMgPSBtb2RpZmljYXRpb25zOwotCX0KLQotCXB1YmxpYyBNYXAgZ2V0QWRkaXRpb25zKCkgewotCQlyZXR1cm4gZkFkZGl0aW9uczsKLQl9Ci0KLQlwdWJsaWMgQW5ub3RhdGlvbltdIGdldERlbGV0aW9ucygpIHsKLQkJcmV0dXJuIGZEZWxldGlvbnM7Ci0JfQotCi0JcHVibGljIEFubm90YXRpb25bXSBnZXRNb2RpZmljYXRpb25zKCkgewotCQlyZXR1cm4gZk1vZGlmaWNhdGlvbnM7Ci0JfQotCi0JcHVibGljIE5vZGUgZ2V0Tm9kZSgpIHsKLQkJcmV0dXJuIGZOb2RlOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Y2JhNDIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLkFubm90YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5BYnN0cmFjdEFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZUFkYXB0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBleHRlbmRzIEFic3RyYWN0QWRhcHRlckZhY3RvcnkgewotCS8qKgotCSAqIExpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIGN1cnJlbnRseSBhc3NvY2lhdGVkIHdpdGggdGhpcyBwcm9qZWN0aW9uCi0JICogbW9kZWwgbm9kZSBhZGFwdGVyIGZhY3RvcnkuCi0JICovCi0JcHJpdmF0ZSBIYXNoTWFwIGZQcm9qZWN0aW9uVmlld2VyczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwoKSB7Ci0JCXN1cGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzLCB0cnVlKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgSU5vZGVBZGFwdGVyIGNyZWF0ZUFkYXB0ZXIoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwgYWRhcHRlciA9IG51bGw7Ci0KLQkJLy8gY3JlYXRlIGFkYXB0ZXIgZm9yIGV2ZXJ5IGVsZW1lbnQgdGFnCi0JCWlmICgoaXNBY3RpdmUoKSkgJiYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpICYmICgoTm9kZSkgdGFyZ2V0KS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlhZGFwdGVyID0gbmV3IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MKHRoaXMpOwotCQkJYWRhcHRlci51cGRhdGVBZGFwdGVyKChOb2RlKSB0YXJnZXQpOwotCQl9Ci0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJuIHRydWUgaWYgdGhpcyBmYWN0b3J5IGlzIGN1cnJlbnRseSBhY3RpdmVseSBtYW5hZ2luZyBwcm9qZWN0aW9uCi0JICogCi0JICogQHJldHVybgotCSAqLwotCWJvb2xlYW4gaXNBY3RpdmUoKSB7Ci0JCXJldHVybiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwgJiYgIWZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZXMgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGlmIGRvY3VtZW50IGlzIG5vdCBpbiBmbHV4LgotCSAqIE90aGVyd2lzZSwgcXVldWVzIHVwIHRoZSBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgd2hlbiBkb2N1bWVudCBpcyByZWFkeS4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBkZWxldGlvbnMKLQkgKiBAcGFyYW0gYWRkaXRpb25zCi0JICogQHBhcmFtIG1vZGlmaWNhdGlvbnMKLQkgKi8KLQl2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhOb2RlIG5vZGUsIEFubm90YXRpb25bXSBkZWxldGlvbnMsIE1hcCBhZGRpdGlvbnMsIEFubm90YXRpb25bXSBtb2RpZmljYXRpb25zKSB7Ci0JCXF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBkZWxldGlvbnMsIGFkZGl0aW9ucywgbW9kaWZpY2F0aW9ucywgbnVsbCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgZm9yIGEgc3BlY2lmaWMgcHJvamVjdGlvbiB2aWV3ZXIgaWYKLQkgKiBkb2N1bWVudCBpcyBub3QgaW4gZmx1eC4gT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZAotCSAqIHdoZW4gZG9jdW1lbnQgaXMgcmVhZHkuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gZGVsZXRpb25zCi0JICogQHBhcmFtIGFkZGl0aW9ucwotCSAqIEBwYXJhbSBtb2RpZmljYXRpb25zCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKE5vZGUgbm9kZSwgQW5ub3RhdGlvbltdIGRlbGV0aW9ucywgTWFwIGFkZGl0aW9ucywgQW5ub3RhdGlvbltdIG1vZGlmaWNhdGlvbnMsIFByb2plY3Rpb25WaWV3ZXIgdmlld2VyKSB7Ci0JCS8vIGNyZWF0ZSBhIGNoYW5nZSBvYmplY3QgZm9yIGxhdGVzdCBjaGFuZ2UgYW5kIGFkZCB0byBxdWV1ZQotCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UgPSBuZXcgUHJvamVjdGlvbkFubm90YXRpb25Nb2RlbENoYW5nZXMobm9kZSwgZGVsZXRpb25zLCBhZGRpdGlvbnMsIG1vZGlmaWNhdGlvbnMpOwotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCWlmICh2aWV3ZXIgIT0gbnVsbCkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgZlByb2plY3Rpb25WaWV3ZXJzLmdldCh2aWV3ZXIpOwotCQkJCWlmIChpbmZvICE9IG51bGwpIHsKLQkJCQkJaW5mby5xdWV1ZUFubm90YXRpb25Nb2RlbENoYW5nZXMobmV3Q2hhbmdlKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJCXdoaWxlIChpbmZvcy5oYXNOZXh0KCkpIHsKLQkJCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBpbmZvcy5uZXh0KCk7Ci0JCQkJCWluZm8ucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5ld0NoYW5nZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLQkJLy8gZ28gdGhyb3VnaCBldmVyeSBwcm9qZWN0aW9udmlld2VyIGFuZCBjYWxsCi0JCS8vIHJlbW92ZVByb2plY3Rpb25WaWV3ZXIodmlld2VyKTsKLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyAhPSBudWxsKSB7Ci0JCQlJdGVyYXRvciBpbmZvcyA9IGZQcm9qZWN0aW9uVmlld2Vycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGluZm9zLmhhc05leHQoKSkgewotCQkJCVByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvID0gKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbikgaW5mb3MubmV4dCgpOwotCQkJCWluZm8uZGlzcG9zZSgpOwotCQkJCWluZm9zLnJlbW92ZSgpOwotCQkJfQotCQkJZlByb2plY3Rpb25WaWV3ZXJzID0gbnVsbDsKLQkJfQotCQlzdXBlci5yZWxlYXNlKCk7Ci0JfQotCi0JLyoqCi0JICogQWRkcyB2aWV3ZXIgdG8gbGlzdCBvZiBwcm9qZWN0aW9uIHZpZXdlcnMgdGhpcyBmYWN0b3J5IGlzIGFzc29jaWF0ZWQKLQkgKiB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIHZpZXdlcidzIGRvY3VtZW50IGFuZCBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwKLQkgKiAgICAgICAgICAgIGFyZSBub3QgbnVsbAotCSAqLwotCXZvaWQgYWRkUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyByZW1vdmUgb2xkIGVudHJ5IGlmIGl0IGV4aXN0cwotCQlyZW1vdmVQcm9qZWN0aW9uVmlld2VyKHZpZXdlcik7Ci0KLQkJaWYgKGZQcm9qZWN0aW9uVmlld2VycyA9PSBudWxsKSB7Ci0JCQlmUHJvamVjdGlvblZpZXdlcnMgPSBuZXcgSGFzaE1hcCgpOwotCQl9Ci0KLQkJLy8gY3JlYXRlIG5ldyBvYmplY3QgY29udGFpbmluZyBwcm9qZWN0aW9uIHZpZXdlciBhbmQgaXRzIGluZm8KLQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSBuZXcgUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKHZpZXdlcik7Ci0JCWZQcm9qZWN0aW9uVmlld2Vycy5wdXQodmlld2VyLCBpbmZvKTsKLQkJaW5mby5pbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyB0aGUgZ2l2ZW4gdmlld2VyIGZyb20gdGhlIGxpc3Qgb2YgcHJvamVjdGlvbiB2aWV3ZXJzIHRoaXMKLQkgKiBmYWN0b3IgaXMgYXNzb2NpYXRlZCB3aXRoCi0JICogCi0JICogQHBhcmFtIHZpZXdlcgotCSAqLwotCXZvaWQgcmVtb3ZlUHJvamVjdGlvblZpZXdlcihQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlpZiAoZlByb2plY3Rpb25WaWV3ZXJzICE9IG51bGwpIHsKLQkJCS8vIHJlbW92ZSBlbnRyeSBmcm9tIGxpc3Qgb2Ygdmlld2VycwotCQkJUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uIGluZm8gPSAoUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uKSBmUHJvamVjdGlvblZpZXdlcnMucmVtb3ZlKHZpZXdlcik7Ci0JCQlpZiAoaW5mbyAhPSBudWxsKSB7Ci0JCQkJaW5mby5kaXNwb3NlKCk7Ci0JCQl9Ci0JCQkvLyBpZiByZW1vdmluZyBsYXN0IHByb2plY3Rpb24gdmlld2VyLCBjbGVhciBvdXQgZXZlcnl0aGluZwotCQkJaWYgKGZQcm9qZWN0aW9uVmlld2Vycy5pc0VtcHR5KCkpIHsKLQkJCQlmUHJvamVjdGlvblZpZXdlcnMgPSBudWxsOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1Byb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyMDI2YmMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUG9zaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uQW5ub3RhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25WaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkZvbnRNZXRyaWNzOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC5ncmFwaGljcy5HQzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgd2l0aCBwcm9qZWN0aW9uIGFubm90YXRpb25zIGZvciB0aGlzCi0gKiBhZGFwdGVyIG5vZGUncyBjaGlsZHJlbgotICovCi1wdWJsaWMgY2xhc3MgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCXByaXZhdGUgZmluYWwgc3RhdGljIGJvb2xlYW4gZGVidWdQcm9qZWN0aW9uUGVyZiA9ICJ0cnVlIi5lcXVhbHNJZ25vcmVDYXNlKFBsYXRmb3JtLmdldERlYnVnT3B0aW9uKCJvcmcuZWNsaXBzZS53c3QueG1sLnVpL3Byb2plY3Rpb25wZXJmIikpOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQotCXByaXZhdGUgY2xhc3MgVGFnUHJvamVjdGlvbkFubm90YXRpb24gZXh0ZW5kcyBQcm9qZWN0aW9uQW5ub3RhdGlvbiB7Ci0JCXByaXZhdGUgYm9vbGVhbiBmSXNWaXNpYmxlID0gZmFsc2U7IC8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCXByaXZhdGUgTm9kZSBmTm9kZTsKLQotCQlwdWJsaWMgVGFnUHJvamVjdGlvbkFubm90YXRpb24oTm9kZSBub2RlLCBib29sZWFuIGlzQ29sbGFwc2VkKSB7Ci0JCQlzdXBlcihpc0NvbGxhcHNlZCk7Ci0JCQlmTm9kZSA9IG5vZGU7Ci0JCX0KLQotCQlwdWJsaWMgTm9kZSBnZXROb2RlKCkgewotCQkJcmV0dXJuIGZOb2RlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgc2V0Tm9kZShOb2RlIG5vZGUpIHsKLQkJCWZOb2RlID0gbm9kZTsKLQkJfQotCi0JCS8qKgotCQkgKiBEb2VzIG5vdCBwYWludCBoaWRkZW4gYW5ub3RhdGlvbnMuIEFubm90YXRpb25zIGFyZSBoaWRkZW4gd2hlbiB0aGV5Ci0JCSAqIG9ubHkgc3BhbiBvbmUgbGluZS4KLQkJICogCi0JCSAqIEBzZWUgUHJvamVjdGlvbkFubm90YXRpb24jcGFpbnQob3JnLmVjbGlwc2Uuc3d0LmdyYXBoaWNzLkdDLAotCQkgKiAgICAgIG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkNhbnZhcywKLQkJICogICAgICBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuUmVjdGFuZ2xlKQotCQkgKi8KLQkJcHVibGljIHZvaWQgcGFpbnQoR0MgZ2MsIENhbnZhcyBjYW52YXMsIFJlY3RhbmdsZSByZWN0YW5nbGUpIHsKLQkJCS8qIHdvcmthcm91bmQgZm9yIEJVRzg1ODc0ICovCi0JCQkvKgotCQkJICogb25seSBuZWVkIHRvIGNoZWNrIGFubm90YXRpb25zIHRoYXQgYXJlIGV4cGFuZGVkIGJlY2F1c2UgaGlkZGVuCi0JCQkgKiBhbm5vdGF0aW9ucyBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGdpdmVuIHRoZSBjaGFuY2UgdG8KLQkJCSAqIGNvbGxhcHNlLgotCQkJICovCi0JCQlpZiAoIWlzQ29sbGFwc2VkKCkpIHsKLQkJCQkvLyB3b3JraW5nIHdpdGggcmVjdGFuZ2xlLCBzbyBsaW5lIGhlaWdodAotCQkJCUZvbnRNZXRyaWNzIG1ldHJpY3MgPSBnYy5nZXRGb250TWV0cmljcygpOwotCQkJCWlmIChtZXRyaWNzICE9IG51bGwpIHsKLQkJCQkJLy8gZG8gbm90IGRyYXcgYW5ub3RhdGlvbnMgdGhhdCBvbmx5IHNwYW4gb25lIGxpbmUgYW5kCi0JCQkJCS8vIG1hcmsgdGhlbSBhcyBub3QgdmlzaWJsZQotCQkJCQlpZiAoKHJlY3RhbmdsZS5oZWlnaHQgLyBtZXRyaWNzLmdldEhlaWdodCgpKSA8PSAxKSB7Ci0JCQkJCQlmSXNWaXNpYmxlID0gZmFsc2U7Ci0JCQkJCQlyZXR1cm47Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmSXNWaXNpYmxlID0gdHJ1ZTsKLQkJCXN1cGVyLnBhaW50KGdjLCBjYW52YXMsIHJlY3RhbmdsZSk7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvbkFubm90YXRpb24jbWFya0NvbGxhcHNlZCgpCi0JCSAqLwotCQlwdWJsaWMgdm9pZCBtYXJrQ29sbGFwc2VkKCkgewotCQkJLyogd29ya2Fyb3VuZCBmb3IgQlVHODU4NzQgKi8KLQkJCS8vIGRvIG5vdCBtYXJrIGNvbGxhcHNlZCBpZiBhbm5vdGF0aW9uIGlzIG5vdCB2aXNpYmxlCi0JCQlpZiAoZklzVmlzaWJsZSkKLQkJCQlzdXBlci5tYXJrQ29sbGFwc2VkKCk7Ci0JCX0KLQl9Ci0KLQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgZkFkYXB0ZXJGYWN0b3J5OwotCXByaXZhdGUgTWFwIGZUYWdBbm5vdGF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0KLQlwdWJsaWMgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZhY3RvcnkpIHsKLQkJZkFkYXB0ZXJGYWN0b3J5ID0gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGUgYSBwcm9qZWN0aW9uIHBvc2l0aW9uIGZyb20gdGhlIGdpdmVuIG5vZGUuIEFibGUgdG8gZ2V0Ci0JICogcHJvamVjdGlvbiBwb3NpdGlvbiBpZiBub2RlIGlzTm9kZVByb2plY3RhYmxlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBudWxsIGlmIG5vIHByb2plY3Rpb24gcG9zaXRpb24gcG9zc2libGUsIGEgUG9zaXRpb24gb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBQb3NpdGlvbiBjcmVhdGVQcm9qZWN0aW9uUG9zaXRpb24oTm9kZSBub2RlKSB7Ci0JCVBvc2l0aW9uIHBvcyA9IG51bGw7Ci0JCWlmIChpc05vZGVQcm9qZWN0YWJsZShub2RlKSAmJiBub2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJLy8gSURvY3VtZW50IGRvY3VtZW50ID0KLQkJCS8vIGZBZGFwdGVyRmFjdG9yeS5nZXRQcm9qZWN0aW9uVmlld2VyKCkuZ2V0RG9jdW1lbnQoKTsKLQkJCS8vIGlmIChkb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJbmRleGVkUmVnaW9uIGlub2RlID0gKEluZGV4ZWRSZWdpb24pIG5vZGU7Ci0JCQlpbnQgc3RhcnQgPSBpbm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJaW50IGVuZCA9IGlub2RlLmdldEVuZE9mZnNldCgpOwotCQkJaWYgKHN0YXJ0ID49IDAgJiYgc3RhcnQgPCBlbmQpIHsKLQkJCQkvLyByZWdpb24tYmFzZWQKLQkJCQkvLyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgbm8gcmVnaW9uIGluY3JlYXNlIHdoZW4gYWRkCi0JCQkJLy8gbmV3bGluZQotCQkJCXBvcyA9IG5ldyBQb3NpdGlvbihzdGFydCwgZW5kIC0gc3RhcnQpOwotCQkJCS8vIHRyeSB7Ci0JCQkJLy8gLy8gbGluZS1iYXNlZAotCQkJCS8vIC8vIGV4dHJhIGxpbmUgd2hlbiBjb2xsYXBzZWQsIGJ1dCBubyByZWdpb24gaW5jcmVhc2Ugd2hlbgotCQkJCS8vIGFkZCBuZXdsaW5lCi0JCQkJLy8gSVJlZ2lvbiBzdGFydExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KHN0YXJ0KTsKLQkJCQkvLyBJUmVnaW9uIGVuZExpbmVSZWdpb24gPQotCQkJCS8vIGRvY3VtZW50LmdldExpbmVJbmZvcm1hdGlvbk9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaW50IHN0YXJ0T2Zmc2V0ID0gc3RhcnRMaW5lUmVnaW9uLmdldE9mZnNldCgpOwotCQkJCS8vIGludCBlbmRPZmZzZXQgPSBlbmRMaW5lUmVnaW9uLmdldE9mZnNldCgpICsKLQkJCQkvLyBlbmRMaW5lUmVnaW9uLmdldExlbmd0aCgpOwotCQkJCS8vIGlmIChlbmRPZmZzZXQgPiBzdGFydE9mZnNldCkgewotCQkJCS8vIHBvcyA9IG5ldyBQb3NpdGlvbihzdGFydE9mZnNldCwgZW5kT2Zmc2V0IC0gc3RhcnRPZmZzZXQpOwotCQkJCS8vIH0KLQotCQkJCS8vIC8vIGxpbmUtYmFzZWQKLQkJCQkvLyAvLyBubyBleHRyYSBsaW5lIHdoZW4gY29sbGFwc2VkLCBidXQgcmVnaW9uIGluY3JlYXNlIHdoZW4KLQkJCQkvLyBhZGQgbmV3bGluZQotCQkJCS8vIGludCBzdGFydExpbmUgPSBkb2N1bWVudC5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQkJCS8vIGludCBlbmRMaW5lID0gZG9jdW1lbnQuZ2V0TGluZU9mT2Zmc2V0KGVuZCk7Ci0JCQkJLy8gaWYgKGVuZExpbmUgKyAxIDwgZG9jdW1lbnQuZ2V0TnVtYmVyT2ZMaW5lcygpKSB7Ci0JCQkJLy8gaW50IG9mZnNldCA9IGRvY3VtZW50LmdldExpbmVPZmZzZXQoc3RhcnRMaW5lKTsKLQkJCQkvLyBpbnQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQuZ2V0TGluZU9mZnNldChlbmRMaW5lICsgMSk7Ci0JCQkJLy8gcG9zID0gbmV3IFBvc2l0aW9uKG9mZnNldCwgZW5kT2Zmc2V0IC0gb2Zmc2V0KTsKLQkJCQkvLyB9Ci0JCQkJLy8gfQotCQkJCS8vIGNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiB4KSB7Ci0JCQkJLy8gTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgbnVsbCwgeCk7Ci0JCQkJLy8gfQotCQkJfQotCQkJLy8gfQotCQl9Ci0JCXJldHVybiBwb3M7Ci0JfQotCi0JLyoqCi0JICogRmluZCBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBmb3Igbm9kZSBpbiB0aGUgY3VycmVudCBsaXN0IG9mIHByb2plY3Rpb24KLQkgKiBhbm5vdGF0aW9ucyBmb3IgdGhpcyBhZGFwdGVyCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uCi0JICovCi0JcHJpdmF0ZSBUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBnZXRFeGlzdGluZ0Fubm90YXRpb24oTm9kZSBub2RlKSB7Ci0JCVRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uIGFubm8gPSBudWxsOwotCi0JCWlmICgobm9kZSAhPSBudWxsKSAmJiAoIWZUYWdBbm5vdGF0aW9ucy5pc0VtcHR5KCkpKSB7Ci0JCQlJdGVyYXRvciBpdCA9IGZUYWdBbm5vdGF0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCQkJd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBhbm5vID09IG51bGwpIHsKLQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBhID0gKFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKSBpdC5uZXh0KCk7Ci0JCQkJTm9kZSBuID0gYS5nZXROb2RlKCk7Ci0JCQkJaWYgKG5vZGUuZXF1YWxzKG4pKSB7Ci0JCQkJCWFubm8gPSBhOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gYW5ubzsKLQl9Ci0KLQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCXJldHVybiB0eXBlID09IFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdHJ1ZSBpZiBub2RlIGlzIGEgbm9kZSB0eXBlIGFibGUgdG8gZm9sZAotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogQHJldHVybiBib29sZWFuIHRydWUgaWYgbm9kZSBpcyBwcm9qZWN0YWJsZSwgZmFsc2Ugb3RoZXJ3aXNlCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzTm9kZVByb2plY3RhYmxlKE5vZGUgbm9kZSkgewotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlyZXR1cm4gdHJ1ZTsKLQkJfQotCQlyZXR1cm4gZmFsc2U7Ci0JfQotCi0JcHVibGljIHZvaWQgbm90aWZ5Q2hhbmdlZChJTm9kZU5vdGlmaWVyIG5vdGlmaWVyLCBpbnQgZXZlbnRUeXBlLCBPYmplY3QgY2hhbmdlZEZlYXR1cmUsIE9iamVjdCBvbGRWYWx1ZSwgT2JqZWN0IG5ld1ZhbHVlLCBpbnQgcG9zKSB7Ci0JCS8vIGNoZWNrIGlmIGZvbGRpbmcgaXMgZXZlbiBlbmFibGVkLCBpZiBub3QsIGp1c3QgaWdub3JlIG5vdGlmeUNoYW5nZWQKLQkJLy8gZXZlbnRzCi0JCWlmICghZkFkYXB0ZXJGYWN0b3J5LmlzQWN0aXZlKCkpIHsKLQkJCXJldHVybjsKLQkJfQotCi0JCWlmICgoZXZlbnRUeXBlID09IElOb2RlTm90aWZpZXIuU1RSVUNUVVJFX0NIQU5HRUQpICYmIChub3RpZmllciBpbnN0YW5jZW9mIE5vZGUpKSB7Ci0JCQl1cGRhdGVBZGFwdGVyKChOb2RlKSBub3RpZmllcik7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVcGRhdGUgdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBvZiBhbGwgdGhlIG5vZGVzIHRoYXQgYXJlIGNoaWxkcmVuIG9mCi0JICogbm9kZQotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICovCi0Jdm9pZCB1cGRhdGVBZGFwdGVyKE5vZGUgbm9kZSkgewotCQl1cGRhdGVBZGFwdGVyKG5vZGUsIG51bGwpOwotCX0KLQotCS8qKgotCSAqIFVwZGF0ZSB0aGUgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG9mIGFsbCB0aGUgbm9kZXMgdGhhdCBhcmUgY2hpbGRyZW4gb2YKLQkgKiBub2RlIGFuZCBhZGRzIGFsbCBwcm9qZWN0aW9uIGFubm90YXRpb25zIHRvIHZpZXdlciAoZm9yIG5ld2x5IGFkZGVkCi0JICogdmlld2VycykKLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSB2aWV3ZXIKLQkgKi8KLQl2b2lkIHVwZGF0ZUFkYXB0ZXIoTm9kZSBub2RlLCBQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJTWFwIGFkZGl0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0JCU1hcCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMgPSBuZXcgSGFzaE1hcCgpOwotCi0JCS8vIGdvIHRocm91Z2ggaW1tZWRpYXRlIGNoaWxkIG5vZGVzIGFuZCBmaWd1cmUgb3V0IHByb2plY3Rpb24KLQkJLy8gbW9kZWwgYW5ub3RhdGlvbnMKLQkJaWYgKG5vZGUgIT0gbnVsbCkgewotCQkJTm9kZSBjaGlsZE5vZGUgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChjaGlsZE5vZGUgIT0gbnVsbCkgewotCQkJCVBvc2l0aW9uIG5ld1BvcyA9IGNyZWF0ZVByb2plY3Rpb25Qb3NpdGlvbihjaGlsZE5vZGUpOwotCQkJCWlmIChuZXdQb3MgIT0gbnVsbCkgewotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBuZXdBbm5vdGF0aW9uID0gbmV3IFRhZ1Byb2plY3Rpb25Bbm5vdGF0aW9uKGNoaWxkTm9kZSwgZmFsc2UpOwotCQkJCQlUYWdQcm9qZWN0aW9uQW5ub3RhdGlvbiBleGlzdGluZyA9IGdldEV4aXN0aW5nQW5ub3RhdGlvbihjaGlsZE5vZGUpOwotCQkJCQlpZiAoZXhpc3RpbmcgPT0gbnVsbCkgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGFkZAotCQkJCQkJYWRkaXRpb25zLnB1dChuZXdBbm5vdGF0aW9uLCBuZXdQb3MpOwotCQkJCQl9Ci0JCQkJCWVsc2UgewotCQkJCQkJLy8gYWRkIHRvIG1hcCBjb250YWluaW5nIGFsbCBhbm5vdGF0aW9ucyBmb3IgdGhpcwotCQkJCQkJLy8gYWRhcHRlcgotCQkJCQkJcHJvamVjdGlvbkFubm90YXRpb25zLnB1dChleGlzdGluZywgbmV3UG9zKTsKLQkJCQkJCS8vIHJlbW92ZSBmcm9tIG1hcCBjb250YWluaW5nIGFubm90YXRpb25zIHRvIGRlbGV0ZQotCQkJCQkJZlRhZ0Fubm90YXRpb25zLnJlbW92ZShleGlzdGluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJY2hpbGROb2RlID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0JCQl9Ci0KLQkJCS8vIGluIHRoZSBlbmQsIHdhbnQgdG8gZGVsZXRlIGFueXRoaW5nIGxlZnRvdmVyIGluIG9sZCBsaXN0LCBhZGQKLQkJCS8vIGV2ZXJ5dGhpbmcgaW4gYWRkaXRpb25zLCBhbmQgdXBkYXRlIGV2ZXJ5dGhpbmcgaW4KLQkJCS8vIHByb2plY3Rpb25Bbm5vdGF0aW9ucwotCQkJUHJvamVjdGlvbkFubm90YXRpb25bXSBvbGRMaXN0ID0gbnVsbDsKLQkJCWlmICghZlRhZ0Fubm90YXRpb25zLmlzRW1wdHkoKSkgewotCQkJCW9sZExpc3QgPSAoUHJvamVjdGlvbkFubm90YXRpb25bXSkgZlRhZ0Fubm90YXRpb25zLmtleVNldCgpLnRvQXJyYXkobmV3IFByb2plY3Rpb25Bbm5vdGF0aW9uWzBdKTsKLQkJCX0KLQkJCVByb2plY3Rpb25Bbm5vdGF0aW9uW10gbW9kaWZ5TGlzdCA9IG51bGw7Ci0JCQlpZiAoIXByb2plY3Rpb25Bbm5vdGF0aW9ucy5pc0VtcHR5KCkpIHsKLQkJCQltb2RpZnlMaXN0ID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uW10pIHByb2plY3Rpb25Bbm5vdGF0aW9ucy5rZXlTZXQoKS50b0FycmF5KG5ldyBQcm9qZWN0aW9uQW5ub3RhdGlvblswXSk7Ci0JCQl9Ci0KLQkJCS8vIHNwZWNpZmljYWxseSBhZGQgYWxsIGFubm90YXRpb25zIHRvIHZpZXdlcgotCQkJaWYgKHZpZXdlciAhPSBudWxsICYmICFwcm9qZWN0aW9uQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7Ci0JCQkJZkFkYXB0ZXJGYWN0b3J5LnF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhub2RlLCBudWxsLCBwcm9qZWN0aW9uQW5ub3RhdGlvbnMsIG51bGwsIHZpZXdlcik7Ci0JCQl9Ci0KLQkJCS8vIG9ubHkgdXBkYXRlIHdoZW4gdGhlcmUgaXMgc29tZXRoaW5nIHRvIHVwZGF0ZQotCQkJaWYgKChvbGRMaXN0ICE9IG51bGwgJiYgb2xkTGlzdC5sZW5ndGggPiAwKSB8fCAoIWFkZGl0aW9ucy5pc0VtcHR5KCkpIHx8IChtb2RpZnlMaXN0ICE9IG51bGwgJiYgbW9kaWZ5TGlzdC5sZW5ndGggPiAwKSkKLQkJCQlmQWRhcHRlckZhY3RvcnkucXVldWVBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKG5vZGUsIG9sZExpc3QsIGFkZGl0aW9ucywgbW9kaWZ5TGlzdCk7Ci0JCX0KLQotCQkvLyBzYXZlIG5ldyBsaXN0IG9mIGFubm90YXRpb25zCi0JCWZUYWdBbm5vdGF0aW9ucyA9IHByb2plY3Rpb25Bbm5vdGF0aW9uczsKLQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN0cmluZyBub2RlTmFtZSA9IG5vZGUgIT0gbnVsbCA/IG5vZGUuZ2V0Tm9kZU5hbWUoKSA6ICJudWxsIjsgLy8kTk9OLU5MUy0xJAotCQkJU3lzdGVtLm91dC5wcmludGxuKCJQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTC51cGRhdGVBZGFwdGVyICgiICsgbm9kZU5hbWUgKyAiKToiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb2plY3Rpb24vUHJvamVjdGlvblZpZXdlckluZm9ybWF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIwYzExOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9Qcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkRvY3VtZW50RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnRMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnNvdXJjZS5wcm9qZWN0aW9uLlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5Qcm9qZWN0aW9uVmlld2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotCi0vKioKLSAqIENvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgcHJvamVjdGlvbiB2aWV3ZXIgYW5kIGFsc28gbWFuYWdlcyB1cGRhdGluZwotICogdGhlIHZpZXdlcidzIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotICovCi1jbGFzcyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gewotCS8vIGNvcGllcyBvZiB0aGlzIGNsYXNzIGxvY2F0ZWQgaW46Ci0JLy8gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS5pbnRlcm5hbC5wcm9qZWN0aW9uCi0JLy8gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCS8vIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW50ZXJuYWwucHJvamVjdGlvbgotCi0JLyoqCi0JICogTGlzdGVucyB0byBkb2N1bWVudCB0byBiZSBhd2FyZSBvZiB3aGVuIHRvIHVwZGF0ZSB0aGUgcHJvamVjdGlvbgotCSAqIGFubm90YXRpb24gbW9kZWwuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBEb2N1bWVudExpc3RlbmVyIGltcGxlbWVudHMgSURvY3VtZW50TGlzdGVuZXIgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgRG9jdW1lbnRMaXN0ZW5lcihQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24gaW5mbykgewotCQkJZkluZm8gPSBpbmZvOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKERvY3VtZW50RXZlbnQgZXZlbnQpIHsKLQkJCUlEb2N1bWVudCBkb2N1bWVudCA9IGV2ZW50LmdldERvY3VtZW50KCk7Ci0JCQlpZiAoZkluZm8uZ2V0RG9jdW1lbnQoKSA9PSBkb2N1bWVudCkgewotCQkJCWZJbmZvLnNldElzRG9jdW1lbnRDaGFuZ2luZyh0cnVlKTsKLQkJCX0KLQkJfQotCi0JCXB1YmxpYyB2b2lkIGRvY3VtZW50Q2hhbmdlZChEb2N1bWVudEV2ZW50IGV2ZW50KSB7Ci0JCQkvLyByZWdpc3RlciBhIHBvc3Qgbm90aWZpY2F0aW9uIHJlcGxhY2Ugc28gdGhhdCBwcm9qZWN0aW9uCi0JCQkvLyBhbm5vdGF0aW9uIG1vZGVsIHdpbGwgYmUgdXBkYXRlZCBhZnRlciBhbGwgZG9jdW1lbnRDaGFuZ2VkCi0JCQkvLyBsaXN0ZW5lcnMgaGF2ZSBiZWVuIG5vdGlmaWVkCi0JCQlJRG9jdW1lbnQgZG9jdW1lbnQgPSBldmVudC5nZXREb2N1bWVudCgpOwotCQkJaWYgKGRvY3VtZW50IGluc3RhbmNlb2YgSURvY3VtZW50RXh0ZW5zaW9uICYmIGZJbmZvLmdldERvY3VtZW50KCkgPT0gZG9jdW1lbnQpIHsKLQkJCQlpZiAoZkluZm8uaGFzQ2hhbmdlc1F1ZXVlZCgpKQotCQkJCQkoKElEb2N1bWVudEV4dGVuc2lvbikgZG9jdW1lbnQpLnJlZ2lzdGVyUG9zdE5vdGlmaWNhdGlvblJlcGxhY2UodGhpcywgbmV3IFBvc3REb2N1bWVudENoYW5nZWRMaXN0ZW5lcihmSW5mbykpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogRXNzZW50aWFsbHkgYSBwb3N0IGRvY3VtZW50IGNoYW5nZWQgbGlzdGVuZXIgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYWZ0ZXIKLQkgKiBkb2N1bWVudGNoYW5nZWQgaGFzIGJlZW4gZmlyZWQuCi0JICovCi0JcHJpdmF0ZSBjbGFzcyBQb3N0RG9jdW1lbnRDaGFuZ2VkTGlzdGVuZXIgaW1wbGVtZW50cyBJRG9jdW1lbnRFeHRlbnNpb24uSVJlcGxhY2UgewotCQlwcml2YXRlIFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBmSW5mbzsKLQotCQlwdWJsaWMgUG9zdERvY3VtZW50Q2hhbmdlZExpc3RlbmVyKFByb2plY3Rpb25WaWV3ZXJJbmZvcm1hdGlvbiBpbmZvKSB7Ci0JCQlmSW5mbyA9IGluZm87Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwZXJmb3JtKElEb2N1bWVudCBkb2N1bWVudCwgSURvY3VtZW50TGlzdGVuZXIgb3duZXIpIHsKLQkJCWZJbmZvLmFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQkJZkluZm8uc2V0SXNEb2N1bWVudENoYW5naW5nKGZhbHNlKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjdXJyZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24KLQkgKiB2aWV3ZXIKLQkgKi8KLQlwcml2YXRlIFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwgZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWw7Ci0JLyoqCi0JICogRG9jdW1lbnQgY3VycmVudGx5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCS8qKgotCSAqIExpc3RlbmVyIHRvIGZQcm9qZWN0aW9uVmlld2VyJ3MgZG9jdW1lbnQKLQkgKi8KLQlwcml2YXRlIElEb2N1bWVudExpc3RlbmVyIGZEb2N1bWVudExpc3RlbmVyOwotCS8qKgotCSAqIEluZGljYXRlcyB3aGV0aGVyIG9yIG5vdCBkb2N1bWVudCBpcyBpbiB0aGUgbWlkZGxlIG9mIGNoYW5naW5nCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZJc0RvY3VtZW50Q2hhbmdpbmcgPSBmYWxzZTsKLQkvKioKLQkgKiBMaXN0IG9mIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbCBjaGFuZ2VzIHRoYXQgbmVlZCB0byBiZSBhcHBsaWVkCi0JICovCi0JcHJpdmF0ZSBMaXN0IGZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlczsKLQotCXB1YmxpYyBQcm9qZWN0aW9uVmlld2VySW5mb3JtYXRpb24oUHJvamVjdGlvblZpZXdlciB2aWV3ZXIpIHsKLQkJZkRvY3VtZW50ID0gdmlld2VyLmdldERvY3VtZW50KCk7Ci0JCWZQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsID0gdmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKTsKLQl9Ci0KLQlJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmRG9jdW1lbnQ7Ci0JfQotCi0JcHJpdmF0ZSBMaXN0IGdldFF1ZXVlZEFubm90YXRpb25DaGFuZ2VzKCkgewotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID09IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJfQotCQlyZXR1cm4gZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzOwotCX0KLQotCXZvaWQgc2V0SXNEb2N1bWVudENoYW5naW5nKGJvb2xlYW4gY2hhbmdpbmcpIHsKLQkJZklzRG9jdW1lbnRDaGFuZ2luZyA9IGNoYW5naW5nOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0RvY3VtZW50Q2hhbmdpbmcoKSB7Ci0JCXJldHVybiBmSXNEb2N1bWVudENoYW5naW5nOwotCX0KLQotCS8qKgotCSAqIEFwcGxpZXMgdGhlIHBlbmRpbmcgcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsIGNoYW5nZXMgdG8gdGhlCi0JICogcHJvamVjdGlvbiBhbm5vdGF0aW9uIG1vZGVsLgotCSAqLwotCXZvaWQgYXBwbHlBbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKCkgewotCQlMaXN0IHF1ZXVlZENoYW5nZXMgPSBnZXRRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcygpOwotCQkvLyBnbyB0aHJvdWdoIGFsbCB0aGUgcGVuZGluZyBhbm5vdGF0aW9uIGNoYW5nZXMgYW5kIGFwcGx5Ci0JCS8vIHRoZW0gdG8KLQkJLy8gdGhlIHByb2plY3Rpb24gYW5ub3RhdGlvbiBtb2RlbAotCQl3aGlsZSAoIXF1ZXVlZENoYW5nZXMuaXNFbXB0eSgpKSB7Ci0JCQlQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBjaGFuZ2VzID0gKFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWxDaGFuZ2VzKSBxdWV1ZWRDaGFuZ2VzLnJlbW92ZSgwKTsKLQkJCXRyeSB7Ci0JCQkJZlByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwubW9kaWZ5QW5ub3RhdGlvbnMoY2hhbmdlcy5nZXREZWxldGlvbnMoKSwgY2hhbmdlcy5nZXRBZGRpdGlvbnMoKSwgY2hhbmdlcy5nZXRNb2RpZmljYXRpb25zKCkpOwotCQkJfQotCQkJY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0JCQkJLy8gaWYgYW55dGhpbmcgZ29lcyB3cm9uZywgbG9nIGl0IGJlIGNvbnRpbnVlCi0JCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbm5vdGF0aW9uIGNoYW5nZXMgcXVldWVkIHVwLCBmYWxzZSBvdGhlcndpc2UKLQkgKiAKLQkgKiBAcmV0dXJuIGJvb2xlYW4KLQkgKi8KLQlib29sZWFuIGhhc0NoYW5nZXNRdWV1ZWQoKSB7Ci0JCXJldHVybiAhZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5pc0VtcHR5KCk7Ci0JfQotCi0JLyoqCi0JICogVXBkYXRlcyBwcm9qZWN0aW9uIGFubm90YXRpb24gbW9kZWwgaWYgZG9jdW1lbnQgaXMgbm90IGluIGZsdXguCi0JICogT3RoZXJ3aXNlLCBxdWV1ZXMgdXAgdGhlIGNoYW5nZXMgdG8gYmUgYXBwbGllZCB3aGVuIGRvY3VtZW50IGlzIHJlYWR5LgotCSAqLwotCXB1YmxpYyB2b2lkIHF1ZXVlQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyhQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsQ2hhbmdlcyBuZXdDaGFuZ2UpIHsKLQkJLyoKLQkJICogZnV0dXJlX1RPRE86IG1heWJlIGltcHJvdmUgYnkgY2hlY2tpbmcgaWYgYW5ub3RhdGlvbiBwcm9qZWN0aW9uCi0JCSAqIG1vZGVsIGNoYW5nZSBhbHJlYWR5IGV4aXN0cyBmb3Igbm9kZS4gaWYgc28sIHRocm93IG91dCBvbGQgY2hhbmdlLgotCQkgKi8KLQkJZ2V0UXVldWVkQW5ub3RhdGlvbkNoYW5nZXMoKS5hZGQobmV3Q2hhbmdlKTsKLQotCQkvLyBpZiBkb2N1bWVudCBpc24ndCBjaGFuZ2luZywgZ28gYWhlYWQgYW5kIGFwcGx5IGl0Ci0JCWlmICghaXNEb2N1bWVudENoYW5naW5nKCkpIHsKLQkJCWFwcGx5QW5ub3RhdGlvbk1vZGVsQ2hhbmdlcygpOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJLy8gYWRkIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciA9PSBudWxsKSB7Ci0JCQlmRG9jdW1lbnRMaXN0ZW5lciA9IG5ldyBEb2N1bWVudExpc3RlbmVyKHRoaXMpOwotCQl9Ci0JCWdldERvY3VtZW50KCkuYWRkRG9jdW1lbnRMaXN0ZW5lcihmRG9jdW1lbnRMaXN0ZW5lcik7Ci0JfQotCi0JcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLQkJLy8gcmVtb3ZlIGRvY3VtZW50IGxpc3RlbmVyCi0JCWlmIChmRG9jdW1lbnRMaXN0ZW5lciAhPSBudWxsKSB7Ci0JCQlnZXREb2N1bWVudCgpLnJlbW92ZURvY3VtZW50TGlzdGVuZXIoZkRvY3VtZW50TGlzdGVuZXIpOwotCQl9Ci0KLQkJLy8gY2xlYXIgb3V0IGxpc3Qgb2YgcXVldWVkIGNoYW5nZXMgc2luY2UgaXQgbWF5IG5vIGxvbmdlcgotCQkvLyBiZSBhY2N1cmF0ZQotCQlpZiAoZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzICE9IG51bGwpIHsKLQkJCWZRdWV1ZWRBbm5vdGF0aW9uQ2hhbmdlcy5jbGVhcigpOwotCQkJZlF1ZXVlZEFubm90YXRpb25DaGFuZ2VzID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvamVjdGlvbi9TdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM2OWQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9qZWN0aW9uL1N0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjQgKzAsMCBAQAotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb2plY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGxhdGZvcm07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dElucHV0TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5zb3VyY2UucHJvamVjdGlvbi5JUHJvamVjdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuc291cmNlLnByb2plY3Rpb24uUHJvamVjdGlvblZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuU3RydWN0dXJlZE1vZGVsTWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwuUHJvcGFnYXRpbmdBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5tb2RlbC5GYWN0b3J5UmVnaXN0cnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb2plY3Rpb24uSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBVcGRhdGVzIHRoZSBwcm9qZWN0aW9uIG1vZGVsIG9mIGEgc3RydWN0dXJlZCBtb2RlbCBmb3IgWE1MLgotICovCi1wdWJsaWMgY2xhc3MgU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwgaW1wbGVtZW50cyBJU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXIsIElQcm9qZWN0aW9uTGlzdGVuZXIsIElUZXh0SW5wdXRMaXN0ZW5lciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgYm9vbGVhbiBkZWJ1Z1Byb2plY3Rpb25QZXJmID0gInRydWUiLmVxdWFsc0lnbm9yZUNhc2UoUGxhdGZvcm0uZ2V0RGVidWdPcHRpb24oIm9yZy5lY2xpcHNlLndzdC54bWwudWkvcHJvamVjdGlvbnBlcmYiKSk7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCi0JcHJpdmF0ZSBJRG9jdW1lbnQgZkRvY3VtZW50OwotCXByaXZhdGUgUHJvamVjdGlvblZpZXdlciBmVmlld2VyOwotCXByaXZhdGUgYm9vbGVhbiBmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSBmYWxzZTsKLQkvKioKLQkgKiBNYXhpbXVtIG51bWJlciBvZiBjaGlsZCBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvciBwZXJmb3JtYW5jZQotCSAqIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX0NISUxEUkVOID0gMTA7Ci0JLyoqCi0JICogTWF4aW11bSBudW1iZXIgb2Ygc2libGluZyBub2RlcyB0byBhZGQgYWRhcHRlcnMgdG8gKGxpbWl0IGZvcgotCSAqIHBlcmZvcm1hbmNlIHNha2UpCi0JICovCi0JcHJpdmF0ZSBmaW5hbCBpbnQgTUFYX1NJQkxJTkdTID0gMTAwMDsKLQotCS8qKgotCSAqIEFkZHMgYW4gYWRhcHRlciB0byBub2RlIGFuZCBpdHMgY2hpbGRyZW4KLQkgKiAKLQkgKiBAcGFyYW0gbm9kZQotCSAqIEBwYXJhbSBjaGlsZExldmVsCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihOb2RlIG5vZGUsIGludCBjaGlsZExldmVsKSB7Ci0JCS8vIHN0b3AgYWRkaW5nIGluaXRpYWwgYWRhcHRlcnMgTUFYX0NISUxEUkVOIGxldmVscyBkZWVwIGZvcgotCQkvLyBwZXJmb3JtYW5jZSBzYWtlCi0JCWlmIChub2RlIGluc3RhbmNlb2YgSU5vZGVOb3RpZmllciAmJiBjaGlsZExldmVsIDwgTUFYX0NISUxEUkVOKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCB1cGRhdGUgdGhlCi0JCQkvLyBhZGFwdGVyIHdpdGggcHJvamVjdGlvbiBpbmZvcm1hdGlvbgotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwgYWRhcHRlciA9IChQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlclhNTCkgbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlhZGFwdGVyLnVwZGF0ZUFkYXB0ZXIobm9kZSwgZlZpZXdlcik7Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQkvLyBqdXN0IGNhbGwgZ2V0YWRhcHRlciBzbyB0aGUgYWRhcHRlciBpcyBjcmVhdGVkIGFuZAotCQkJCS8vIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQKLQkJCQlub3RpZmllci5nZXRBZGFwdGVyRm9yKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzKTsKLQkJCX0KLQkJCWludCBzaWJsaW5nTGV2ZWwgPSAwOwotCQkJTm9kZSBuZXh0Q2hpbGQgPSBub2RlLmdldEZpcnN0Q2hpbGQoKTsKLQkJCXdoaWxlIChuZXh0Q2hpbGQgIT0gbnVsbCAmJiBzaWJsaW5nTGV2ZWwgPCBNQVhfU0lCTElOR1MpIHsKLQkJCQlOb2RlIGNoaWxkTm9kZSA9IG5leHRDaGlsZDsKLQkJCQluZXh0Q2hpbGQgPSBjaGlsZE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCWFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGNoaWxkTGV2ZWwgKyAxKTsKLQkJCX0KLQkJfQotCX0KLQotCS8qKgotCSAqIEdvZXMgdGhyb3VnaCBldmVyeSBub2RlIGFuZCBhZGRzIGFuIGFkYXB0ZXIgb250byBlYWNoIGZvciB0cmFja2luZwotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIGFkZEFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlpbnQgc2libGluZ0xldmVsID0gMDsKLQkJCQkJCU5vZGUgbmV4dFNpYmxpbmcgPSAoTm9kZSkgc3RhcnROb2RlOwotCQkJCQkJd2hpbGUgKG5leHRTaWJsaW5nICE9IG51bGwgJiYgc2libGluZ0xldmVsIDwgTUFYX1NJQkxJTkdTKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCWFkZEFkYXB0ZXJUb05vZGVBbmRDaGlsZHJlbihjdXJyZW50Tm9kZSwgMCk7Ci0JCQkJCQkJKytzaWJsaW5nTGV2ZWw7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCQlmaW5hbGx5IHsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAoZGVidWdQcm9qZWN0aW9uUGVyZikgewotCQkJbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLQkJCVN5c3RlbS5vdXQucHJpbnRsbigiU3RydWN0dXJlZFRleHRGb2xkaW5nUHJvdmlkZXJYTUwuYWRkQWxsQWRhcHRlcnM6ICIgKyAoZW5kIC0gc3RhcnQpKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JfQotCi0JLyoqCi0JICogR2V0IHRoZSBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgdG8gdXNlIHdpdGggdGhpcyBwcm92aWRlci4KLQkgKiAKLQkgKiBAcmV0dXJuIFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTAotCSAqLwotCXByaXZhdGUgUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGdldEFkYXB0ZXJGYWN0b3J5KGJvb2xlYW4gY3JlYXRlSWZOZWVkZWQpIHsKLQkJbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotCi0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBmYWN0b3J5ID0gbnVsbDsKLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJRmFjdG9yeVJlZ2lzdHJ5IGZhY3RvcnlSZWdpc3RyeSA9IHNNb2RlbC5nZXRGYWN0b3J5UmVnaXN0cnkoKTsKLQotCQkJCQkvLyBnZXR0aW5nIHRoZSBwcm9qZWN0aW9ubW9kZWxub2RlYWRhcHRlciBmb3IgdGhlIGZpcnN0Ci0JCQkJCS8vIHRpbWUKLQkJCQkJLy8gc28gZG8gc29tZSBpbml0aWFsaXppbmcKLQkJCQkJaWYgKCFmYWN0b3J5UmVnaXN0cnkuY29udGFpbnMoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpICYmIGNyZWF0ZUlmTmVlZGVkKSB7Ci0JCQkJCQlQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwgbmV3RmFjdG9yeSA9IG5ldyBQcm9qZWN0aW9uTW9kZWxOb2RlQWRhcHRlckZhY3RvcnlYTUwoKTsKLQotCQkJCQkJLy8gYWRkIGZhY3RvcnkgdG8gZmFjdG9yeSByZWdpc3RyeQotCQkJCQkJZmFjdG9yeVJlZ2lzdHJ5LmFkZEZhY3RvcnkobmV3RmFjdG9yeSk7Ci0KLQkJCQkJCS8vIGFkZCBmYWN0b3J5IHRvIHByb3BvZ2F0aW5nIGFkYXB0ZXIKLQkJCQkJCUlET01Nb2RlbCBkb21Nb2RlbCA9IChJRE9NTW9kZWwpIHNNb2RlbDsKLQkJCQkJCURvY3VtZW50IGRvY3VtZW50ID0gZG9tTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQkJCQkJCVByb3BhZ2F0aW5nQWRhcHRlciBwcm9wYWdhdGluZ0FkYXB0ZXIgPSAoUHJvcGFnYXRpbmdBZGFwdGVyKSAoKElOb2RlTm90aWZpZXIpIGRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKFByb3BhZ2F0aW5nQWRhcHRlci5jbGFzcyk7Ci0JCQkJCQlpZiAocHJvcGFnYXRpbmdBZGFwdGVyICE9IG51bGwpIHsKLQkJCQkJCQlwcm9wYWdhdGluZ0FkYXB0ZXIuYWRkQWRhcHRPbkNyZWF0ZUZhY3RvcnkobmV3RmFjdG9yeSk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQotCQkJCQkvLyB0cnkgYW5kIGdldCB0aGUgZmFjdG9yeQotCQkJCQlmYWN0b3J5ID0gKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCkgZmFjdG9yeVJlZ2lzdHJ5LmdldEZhY3RvcnlGb3IoUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJYTUwuY2xhc3MpOwotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkKLQkJCQkJc01vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLmdldEFkYXB0ZXJGYWN0b3J5OiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCQlyZXR1cm4gZmFjdG9yeTsKLQl9Ci0KLQkvKioKLQkgKiBJbml0aWFsaXplIHRoaXMgcHJvdmlkZXIgd2l0aCB0aGUgY29ycmVjdCBkb2N1bWVudC4gQXNzdW1lcyBwcm9qZWN0aW9uCi0JICogaXMgZW5hYmxlZC4gKG90aGVyd2lzZSwgb25seSBpbnN0YWxsIHdvdWxkIGhhdmUgYmVlbiBjYWxsZWQpCi0JICovCi0JcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLQkJaWYgKCFpc0luc3RhbGxlZCgpKQotCQkJcmV0dXJuOwotCi0JCS8vIGNsZWFyIG91dCBvbGQgaW5mbwotCQlwcm9qZWN0aW9uRGlzYWJsZWQoKTsKLQotCQlmRG9jdW1lbnQgPSBmVmlld2VyLmdldERvY3VtZW50KCk7Ci0KLQkJLy8gc2V0IHByb2plY3Rpb24gdmlld2VyIG9uIG5ldyBkb2N1bWVudCdzIGFkYXB0ZXIgZmFjdG9yeQotCQlpZiAoZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkgIT0gbnVsbCkgewotCQkJUHJvamVjdGlvbk1vZGVsTm9kZUFkYXB0ZXJGYWN0b3J5WE1MIGZhY3RvcnkgPSBnZXRBZGFwdGVyRmFjdG9yeSh0cnVlKTsKLQkJCWlmIChmYWN0b3J5ICE9IG51bGwpIHsKLQkJCQlmYWN0b3J5LmFkZFByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCQl9Ci0KLQkJCWFkZEFsbEFkYXB0ZXJzKCk7Ci0JCX0KLQkJZlByb2plY3Rpb25OZWVkc1RvQmVFbmFibGVkID0gZmFsc2U7Ci0JfQotCi0JLyoqCi0JICogQXNzb2NpYXRlIGEgUHJvamVjdGlvblZpZXdlciB3aXRoIHRoaXMgSVN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyCi0JICogCi0JICogQHBhcmFtIHZpZXdlciAtCi0JICogICAgICAgICAgICBhc3N1bWVzIG5vdCBudWxsCi0JICovCi0JcHVibGljIHZvaWQgaW5zdGFsbChQcm9qZWN0aW9uVmlld2VyIHZpZXdlcikgewotCQkvLyB1bmluc3RhbGwgYmVmb3JlIHRyeWluZyB0byBpbnN0YWxsIG5ldyB2aWV3ZXIKLQkJaWYgKGlzSW5zdGFsbGVkKCkpIHsKLQkJCXVuaW5zdGFsbCgpOwotCQl9Ci0JCWZWaWV3ZXIgPSB2aWV3ZXI7Ci0JCWZWaWV3ZXIuYWRkUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQlmVmlld2VyLmFkZFRleHRJbnB1dExpc3RlbmVyKHRoaXMpOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpc0luc3RhbGxlZCgpIHsKLQkJcmV0dXJuIGZWaWV3ZXIgIT0gbnVsbDsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBwcm9qZWN0aW9uRGlzYWJsZWQoKSB7Ci0JCVByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyRmFjdG9yeVhNTCBmYWN0b3J5ID0gZ2V0QWRhcHRlckZhY3RvcnkoZmFsc2UpOwotCQlpZiAoZmFjdG9yeSAhPSBudWxsKSB7Ci0JCQlmYWN0b3J5LnJlbW92ZVByb2plY3Rpb25WaWV3ZXIoZlZpZXdlcik7Ci0JCX0KLQotCQkvLyBjbGVhciBvdXQgYWxsIGFubm90YXRpb25zCi0JCWlmIChmVmlld2VyLmdldFByb2plY3Rpb25Bbm5vdGF0aW9uTW9kZWwoKSAhPSBudWxsKQotCQkJZlZpZXdlci5nZXRQcm9qZWN0aW9uQW5ub3RhdGlvbk1vZGVsKCkucmVtb3ZlQWxsQW5ub3RhdGlvbnMoKTsKLQotCQlyZW1vdmVBbGxBZGFwdGVycygpOwotCi0JCWZEb2N1bWVudCA9IG51bGw7Ci0JCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHByb2plY3Rpb25FbmFibGVkKCkgewotCQlpbml0aWFsaXplKCk7Ci0JfQotCi0JLyoqCi0JICogUmVtb3ZlcyBhbiBhZGFwdGVyIGZyb20gbm9kZSBhbmQgaXRzIGNoaWxkcmVuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcGFyYW0gbGV2ZWwKLQkgKi8KLQlwcml2YXRlIHZvaWQgcmVtb3ZlQWRhcHRlckZyb21Ob2RlQW5kQ2hpbGRyZW4oTm9kZSBub2RlLCBpbnQgbGV2ZWwpIHsKLQkJaWYgKG5vZGUgaW5zdGFuY2VvZiBJTm9kZU5vdGlmaWVyKSB7Ci0JCQlJTm9kZU5vdGlmaWVyIG5vdGlmaWVyID0gKElOb2RlTm90aWZpZXIpIG5vZGU7Ci0KLQkJCS8vIHRyeSBhbmQgZ2V0IHRoZSBhZGFwdGVyIGZvciB0aGUgY3VycmVudCBub2RlIGFuZCByZW1vdmUgaXQKLQkJCUlOb2RlQWRhcHRlciBhZGFwdGVyID0gbm90aWZpZXIuZ2V0RXhpc3RpbmdBZGFwdGVyKFByb2plY3Rpb25Nb2RlbE5vZGVBZGFwdGVyWE1MLmNsYXNzKTsKLQkJCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCQlub3RpZmllci5yZW1vdmVBZGFwdGVyKGFkYXB0ZXIpOwotCQkJfQotCi0JCQlOb2RlIG5leHRDaGlsZCA9IG5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQkJd2hpbGUgKG5leHRDaGlsZCAhPSBudWxsKSB7Ci0JCQkJTm9kZSBjaGlsZE5vZGUgPSBuZXh0Q2hpbGQ7Ci0JCQkJbmV4dENoaWxkID0gY2hpbGROb2RlLmdldE5leHRTaWJsaW5nKCk7Ci0KLQkJCQlyZW1vdmVBZGFwdGVyRnJvbU5vZGVBbmRDaGlsZHJlbihjaGlsZE5vZGUsIGxldmVsICsgMSk7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBHb2VzIHRocm91Z2ggZXZlcnkgbm9kZSBhbmQgcmVtb3ZlcyBhZGFwdGVyIGZyb20gZWFjaCBmb3IgY2xlYW51cAotCSAqIHB1cnBvc2VzCi0JICovCi0JcHJpdmF0ZSB2b2lkIHJlbW92ZUFsbEFkYXB0ZXJzKCkgewotCQlsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0KLQkJaWYgKGZEb2N1bWVudCAhPSBudWxsKSB7Ci0JCQlJU3RydWN0dXJlZE1vZGVsIHNNb2RlbCA9IG51bGw7Ci0JCQl0cnkgewotCQkJCXNNb2RlbCA9IFN0cnVjdHVyZWRNb2RlbE1hbmFnZXIuZ2V0TW9kZWxNYW5hZ2VyKCkuZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoZkRvY3VtZW50KTsKLQkJCQlpZiAoc01vZGVsICE9IG51bGwpIHsKLQkJCQkJaW50IHN0YXJ0T2Zmc2V0ID0gMDsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBzdGFydE5vZGUgPSBzTW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQkJCWlmIChzdGFydE5vZGUgaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQkJCQlOb2RlIG5leHRTaWJsaW5nID0gKE5vZGUpIHN0YXJ0Tm9kZTsKLQkJCQkJCXdoaWxlIChuZXh0U2libGluZyAhPSBudWxsKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5leHRTaWJsaW5nOwotCQkJCQkJCW5leHRTaWJsaW5nID0gY3VycmVudE5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQotCQkJCQkJCXJlbW92ZUFkYXB0ZXJGcm9tTm9kZUFuZENoaWxkcmVuKGN1cnJlbnROb2RlLCAwKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWZpbmFsbHkgewotCQkJCWlmIChzTW9kZWwgIT0gbnVsbCkgewotCQkJCQlzTW9kZWwucmVsZWFzZUZyb21SZWFkKCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJaWYgKGRlYnVnUHJvamVjdGlvblBlcmYpIHsKLQkJCWxvbmcgZW5kID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0JCQlTeXN0ZW0ub3V0LnByaW50bG4oIlN0cnVjdHVyZWRUZXh0Rm9sZGluZ1Byb3ZpZGVyWE1MLnJlbW92ZUFsbEFkYXB0ZXJzOiAiICsgKGVuZCAtIHN0YXJ0KSk7IC8vJE5PTi1OTFMtMSQKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGlucHV0RG9jdW1lbnRBYm91dFRvQmVDaGFuZ2VkKElEb2N1bWVudCBvbGRJbnB1dCwgSURvY3VtZW50IG5ld0lucHV0KSB7Ci0JCS8vIGlmIGZvbGRpbmcgaXMgZW5hYmxlZCBhbmQgbmV3IGRvY3VtZW50IGlzIGdvaW5nIHRvIGJlIGEgdG90YWxseQotCQkvLyBkaWZmZXJlbnQgZG9jdW1lbnQsIGRpc2FibGUgcHJvamVjdGlvbgotCQlpZiAoZkRvY3VtZW50ICE9IG51bGwgJiYgZkRvY3VtZW50ICE9IG5ld0lucHV0KSB7Ci0JCQkvLyBkaXNhYmxlIHByb2plY3Rpb24gYW5kIGRpc2Nvbm5lY3QgZXZlcnl0aGluZwotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0JCQlmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgPSB0cnVlOwotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgaW5wdXREb2N1bWVudENoYW5nZWQoSURvY3VtZW50IG9sZElucHV0LCBJRG9jdW1lbnQgbmV3SW5wdXQpIHsKLQkJLy8gaWYgcHJvamVjdGlvbiB3YXMgcHJldmlvdXNseSBlbmFibGVkIGJlZm9yZSBpbnB1dCBkb2N1bWVudCBjaGFuZ2VkCi0JCS8vIGFuZCBuZXcgZG9jdW1lbnQgaXMgZGlmZmVyZW50IHRoYW4gb2xkIGRvY3VtZW50Ci0JCWlmIChmUHJvamVjdGlvbk5lZWRzVG9CZUVuYWJsZWQgJiYgZkRvY3VtZW50ID09IG51bGwgJiYgbmV3SW5wdXQgIT0gbnVsbCkgewotCQkJcHJvamVjdGlvbkVuYWJsZWQoKTsKLQkJCWZQcm9qZWN0aW9uTmVlZHNUb0JlRW5hYmxlZCA9IGZhbHNlOwotCQl9Ci0JfQotCi0JLyoqCi0JICogRGlzY29ubmVjdCB0aGlzIElTdHJ1Y3R1cmVkVGV4dEZvbGRpbmdQcm92aWRlciBmcm9tIHByb2plY3Rpb24gdmlld2VyCi0JICovCi0JcHVibGljIHZvaWQgdW5pbnN0YWxsKCkgewotCQlpZiAoaXNJbnN0YWxsZWQoKSkgewotCQkJcHJvamVjdGlvbkRpc2FibGVkKCk7Ci0KLQkJCWZWaWV3ZXIucmVtb3ZlUHJvamVjdGlvbkxpc3RlbmVyKHRoaXMpOwotCQkJZlZpZXdlci5yZW1vdmVUZXh0SW5wdXRMaXN0ZW5lcih0aGlzKTsKLQkJCWZWaWV3ZXIgPSBudWxsOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzAyMjQwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL0VudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi0KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNlbGxFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LndpZGdldHMuQ29tcG9zaXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlEZXNjcmlwdG9yOwotCi0vKioKLSAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgZm9yIHByb3BlcnRpZXMgd2hpY2ggcmVxdWlyZSBhIGNvbWJvIGJveCBjZWxsCi0gKiBlZGl0b3IgYW5kIHdob3NlIHZhbHVlcyBjb25zaXN0IG9mIGEgbGlzdCBvZiBlbnVtZXJhdGVkIHN0cmluZ3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yIGV4dGVuZHMgUHJvcGVydHlEZXNjcmlwdG9yIHsKLQlwcm90ZWN0ZWQgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yIGZFZGl0b3I7Ci0JcHJvdGVjdGVkIENvbXBvc2l0ZSBmUGFyZW50OwotCi0JLyoqCi0JICogVGhlIGVudW1lcmF0ZWQgcG9zc2libGUgdmFsdWVzIGZvciB0aGUgZGVzY3JpYmVkIHByb3BlcnR5Ci0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBmVmFsdWVzW10gPSBudWxsOwotCi0JcHVibGljIEVudW1lcmF0ZWRTdHJpbmdQcm9wZXJ0eURlc2NyaXB0b3IoT2JqZWN0IGlkLCBTdHJpbmcgbmV3RGlzcGxheU5hbWUsIFN0cmluZ1tdIHZhbHVlc0FycmF5KSB7Ci0JCXN1cGVyKGlkLCBuZXdEaXNwbGF5TmFtZSk7Ci0JCXNldERlc2NyaXB0aW9uKChTdHJpbmcpIGlkKTsKLQkJZlZhbHVlcyA9IHZhbHVlc0FycmF5OwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgY2VsbCBlZGl0b3IgZm9yIGVkaXRpbmcgdGhpcyBwcm9wZXJ0eS4KLQkgKiBSZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZSBwcm9wZXJ0eSBpcyBub3QgZWRpdGFibGUuCi0JICogCi0JICogQHBhcmFtIHBhcmVudAotCSAqICAgICAgICAgICAgdGhlIHBhcmVudCB3aWRnZXQgZm9yIHRoZSBjZWxsIGVkaXRvcgotCSAqIEByZXR1cm4gdGhlIGNlbGwgZWRpdG9yIGZvciB0aGlzIHByb3BlcnR5LCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZgotCSAqICAgICAgICAgdGhpcyBwcm9wZXJ0eSBjYW5ub3QgYmUgZWRpdGVkCi0JICovCi0JcHVibGljIENlbGxFZGl0b3IgY3JlYXRlUHJvcGVydHlFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCkgewotCQkvLyBDaGVjayB0byBzZWUgaWYgd2UgYWxyZWFkeSBoYXZlIGEgQ2VsbCBFZGl0b3Igd2l0aCBhIHZhbGlkIENvbnRyb2wKLQkJLy8gdW5kZXIgdGhlIGdpdmVuIHBhcmVudC4KLQkJLy8gSWYgYW55IG9mIHRoYXQncyBub3QgdHJ1ZSwgY3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgQ2VsbCBFZGl0b3IKLQkJaWYgKGZFZGl0b3IgPT0gbnVsbCB8fCBmRWRpdG9yLmdldENvbnRyb2woKSA9PSBudWxsIHx8IGZFZGl0b3IuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSB8fCBwYXJlbnQgIT0gZlBhcmVudCkKLQkJCWZFZGl0b3IgPSBuZXcgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yKHBhcmVudCwgZlZhbHVlcyk7Ci0JCWZQYXJlbnQgPSBwYXJlbnQ7Ci0JCXJldHVybiBmRWRpdG9yOwotCX0KLQotCXB1YmxpYyB2b2lkIHVwZGF0ZVZhbHVlcyhTdHJpbmcgbmV3VmFsdWVzW10pIHsKLQkJaWYgKEFycmF5cy5lcXVhbHMoZlZhbHVlcywgbmV3VmFsdWVzKSkKLQkJCXJldHVybjsKLQkJZlZhbHVlcyA9IG5ld1ZhbHVlczsKLQkJaWYgKGZFZGl0b3IgIT0gbnVsbCkgewotCQkJZkVkaXRvci5zZXRJdGVtcyhuZXdWYWx1ZXMpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TdHJpbmdDb21ib0JveENlbGxFZGl0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmNDc4OC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvcGVydGllcy9TdHJpbmdDb21ib0JveENlbGxFZGl0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvcGVydGllczsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLkNvbWJvQm94Q2VsbEVkaXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuY3VzdG9tLkNDb21ibzsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3Qud2lkZ2V0cy5Db21wb3NpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5Mb2dnZXI7Ci0KLQotLyoqCi0gKiBBbiBleHRlbmRlZCBDb21ib0JveENlbGxFZGl0b3IgdGhhdCBzZWxlY3RzIGFuZCByZXR1cm5zIFN0cmluZ3MKLSAqLwotCi1wdWJsaWMgY2xhc3MgU3RyaW5nQ29tYm9Cb3hDZWxsRWRpdG9yIGV4dGVuZHMgQ29tYm9Cb3hDZWxsRWRpdG9yIHsKLQlwcml2YXRlIGJvb2xlYW4gZlNldHRpbmdWYWx1ZSA9IGZhbHNlOwotCi0JLyoqCi0JICogIAotCSAqLwotCXB1YmxpYyBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBpdGVtcwotCSAqLwotCXB1YmxpYyBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMpIHsKLQkJc3VwZXIocGFyZW50LCBpdGVtcyk7Ci0JfQotCi0JLyoqCi0JICogQHBhcmFtIHBhcmVudAotCSAqIEBwYXJhbSBpdGVtcwotCSAqIEBwYXJhbSBzdHlsZQotCSAqLwotCXB1YmxpYyBTdHJpbmdDb21ib0JveENlbGxFZGl0b3IoQ29tcG9zaXRlIHBhcmVudCwgU3RyaW5nW10gaXRlbXMsIGludCBzdHlsZSkgewotCQlzdXBlcihwYXJlbnQsIGl0ZW1zLCBzdHlsZSk7Ci0JfQotCi0JcHJvdGVjdGVkIE9iamVjdCBkb0dldFZhbHVlKCkgewotCQkvLyBvdGhlcndpc2UgbGltaXRzIHRvIHNldCBvZiB2YWxpZCB2YWx1ZXMKLQkJT2JqZWN0IGluZGV4ID0gc3VwZXIuZG9HZXRWYWx1ZSgpOwotCQlpbnQgc2VsZWN0aW9uID0gLTE7Ci0JCWlmIChpbmRleCBpbnN0YW5jZW9mIEludGVnZXIpCi0JCQlzZWxlY3Rpb24gPSAoKEludGVnZXIpIGluZGV4KS5pbnRWYWx1ZSgpOwotCQlpZiAoc2VsZWN0aW9uID49IDApCi0JCQlyZXR1cm4gZ2V0SXRlbXMoKVtzZWxlY3Rpb25dOwotCQllbHNlIGlmIChnZXRDb250cm9sKCkgaW5zdGFuY2VvZiBDQ29tYm8pIHsKLQkJCS8vIHJldHJpZXZlIHRoZSBhY3R1YWwgdGV4dCBhcyB0aGUgbGlzdCBvZiB2YWxpZCBpdGVtcyBkb2Vzbid0Ci0JCQkvLyBjb250YWluIHRoZSB2YWx1ZQotCQkJcmV0dXJuICgoQ0NvbWJvKSBnZXRDb250cm9sKCkpLmdldFRleHQoKTsKLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBkb1NldFZhbHVlKE9iamVjdCB2YWx1ZSkgewotCQlpZiAoZlNldHRpbmdWYWx1ZSkKLQkJCXJldHVybjsKLQkJZlNldHRpbmdWYWx1ZSA9IHRydWU7Ci0JCWlmICh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpIHsKLQkJCXN1cGVyLmRvU2V0VmFsdWUodmFsdWUpOwotCQl9IGVsc2UgewotCQkJU3RyaW5nIHN0cmluZ1ZhbHVlID0gdmFsdWUudG9TdHJpbmcoKTsKLQkJCWludCBzZWxlY3Rpb24gPSAtMTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZ2V0SXRlbXMoKS5sZW5ndGg7IGkrKykKLQkJCQlpZiAoZ2V0SXRlbXMoKVtpXS5lcXVhbHMoc3RyaW5nVmFsdWUpKQotCQkJCQlzZWxlY3Rpb24gPSBpOwotCQkJaWYgKHNlbGVjdGlvbiA+PSAwKQotCQkJCXN1cGVyLmRvU2V0VmFsdWUobmV3IEludGVnZXIoc2VsZWN0aW9uKSk7Ci0JCQllbHNlIHsKLQkJCQlzdXBlci5kb1NldFZhbHVlKG5ldyBJbnRlZ2VyKC0xKSk7Ci0JCQkJaWYgKGdldENvbnRyb2woKSBpbnN0YW5jZW9mIENDb21ibyAmJiAhc3RyaW5nVmFsdWUuZXF1YWxzKCgoQ0NvbWJvKSBnZXRDb250cm9sKCkpLmdldFRleHQoKSkpIHsKLQkJCQkJLy8gdXBkYXRlIHRoZSBUZXh0IHdpZGdldAotCQkJCQkoKENDb21ibykgZ2V0Q29udHJvbCgpKS5zZXRUZXh0KHN0cmluZ1ZhbHVlKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZlNldHRpbmdWYWx1ZSA9IGZhbHNlOwotCX0KLQotCXB1YmxpYyB2b2lkIHNldEl0ZW1zKFN0cmluZ1tdIG5ld0l0ZW1zKSB7Ci0JCWlmIChnZXRDb250cm9sKCkgPT0gbnVsbCB8fCBnZXRDb250cm9sKCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlMb2dnZXIubG9nKExvZ2dlci5FUlJPUiwgIkF0dGVtcHRlZCB0byB1cGRhdGUgaXRlbSBsaXN0IGZvciBkaXNwb3NlZCBjZWxsIGVkaXRvciIpOyAvLyROT04tTkxTLTEkCi0JCQlyZXR1cm47Ci0JCX0KLQotCQkvLyBrZWVwIHNlbGVjdGlvbiBpZiBwb3NzaWJsZQotCQlPYmplY3QgcHJldmlvdXNTZWxlY3RlZFZhbHVlID0gZ2V0VmFsdWUoKTsKLQkJc3VwZXIuc2V0SXRlbXMobmV3SXRlbXMpOwotCQlpZiAocHJldmlvdXNTZWxlY3RlZFZhbHVlICE9IG51bGwgJiYgZ2V0Q29udHJvbCgpIGluc3RhbmNlb2YgQ0NvbWJvKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0l0ZW1zLmxlbmd0aDsgaSsrKSB7Ci0JCQkJaWYgKG5ld0l0ZW1zW2ldLmVxdWFscyhwcmV2aW91c1NlbGVjdGVkVmFsdWUpKQotCQkJCQlzZXRWYWx1ZShwcmV2aW91c1NlbGVjdGVkVmFsdWUpOwotCQkJfQotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvWE1MUHJvcGVydHlTb3VyY2UuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3Zjk0YzAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3BlcnRpZXMvWE1MUHJvcGVydHlTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczOCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5wcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnN3dC53aWRnZXRzLkRpc3BsYXk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuUGxhdGZvcm1VSTsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5JUHJvcGVydHlTaGVldEVudHJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlMjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS52aWV3cy5wcm9wZXJ0aWVzLlRleHRQcm9wZXJ0eURlc2NyaXB0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlTm90aWZpZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5wcm9wZXJ0aWVzLklQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuZG9jdW1lbnQuRG9jdW1lbnRUeXBlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5VXRpbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTU5vZGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRE9NRXhjZXB0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQW4gSVByb3BlcnR5U291cmNlIGltcGxlbWVudGF0aW9uIGZvciBhIEpGYWNlIHZpZXdlciB1c2VkIHRvIGRpc3BsYXkKLSAqIHByb3BlcnRpZXMgb2YgRE9NIG5vZGVzLgotICovCi1wdWJsaWMgY2xhc3MgWE1MUHJvcGVydHlTb3VyY2UgaW1wbGVtZW50cyBJUHJvcGVydHlTb3VyY2UsIElQcm9wZXJ0eVNvdXJjZUV4dGVuc2lvbiwgSVByb3BlcnR5U291cmNlMiB7Ci0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgQ0FURUdPUllfQVRUUklCVVRFUyA9IFhNTFVJTWVzc2FnZXMuWE1MUHJvcGVydHlTb3VyY2VBZGFwdGVyXzA7IC8vJE5PTi1OTFMtMSQKLQotCXByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gZlNldEV4cGVydEZpbHRlciA9IGZhbHNlOwotCi0JLyoqCi0JICogZGVyaXZlIGNhdGVnb3JpZXMgZnJvbSBDTURhdGFUeXBlczsgZGlzYWJsZWQgdW50aWwgZGlzcGxheSBzdHJpbmdzIGNhbgotCSAqIGJlIHBsYW5uZWQKLQkgKi8KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZTaG91bGREZXJpdmVDYXRlZ29yaWVzID0gZmFsc2U7Ci0KLQlwcml2YXRlIGZpbmFsIHN0YXRpYyBib29sZWFuIGZTb3J0RW51bWVyYXRlZFZhbHVlcyA9IHRydWU7Ci0KLQkvKioKLQkgKiBOb3RlOiB3ZSB3YW50IHRoZSBkZWZhdWx0IGZDYXNlU2Vuc2l0aXZlIHRvIGJlIHRydWUsIGJ1dCwgdG8gYXZvaWQKLQkgKiBtZWFuaW5nbGVzcyBkb3VibGUgaW5pdGlhbGl6YXRpb24sIHdlIGxlYXZlIGRlZmF1bHQgaGVyZSwgYW5kIHNldCBpbgotCSAqIGNvbnN0cnVjdG9yIG9ubHkuCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGZDYXNlU2Vuc2l0aXZlOwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvcltdIGZEZXNjcmlwdG9ycyA9IG51bGw7Ci0JcHJpdmF0ZSBOb2RlIGZOb2RlID0gbnVsbDsKLQotCXByaXZhdGUgU3RhY2sgZlZhbHVlc0JlaW5nU2V0ID0gbmV3IFN0YWNrKCk7Ci0KLQlwdWJsaWMgWE1MUHJvcGVydHlTb3VyY2UoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJc3VwZXIoKTsKLQkJZk5vZGUgPSBpbml0Tm9kZSh0YXJnZXQpOwotCQlmQ2FzZVNlbnNpdGl2ZSA9IGluaXRDYXNlU2Vuc2l0aXZlKGZOb2RlKTsKLQotCX0KLQotCS8qKiBzZXBlcmF0ZSBtZXRob2QganVzdCB0byBpc29sYXRlIGVycm9yIHByb2Nlc3NpbmcgKi8KLQlwcml2YXRlIE5vZGUgaW5pdE5vZGUoSU5vZGVOb3RpZmllciB0YXJnZXQpIHsKLQkJTm9kZSBub2RlID0gbnVsbDsKLQkJaWYgKHRhcmdldCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCW5vZGUgPSAoTm9kZSkgdGFyZ2V0OwotCQl9Ci0JCWVsc2UgewotCQkJdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWE1MUHJvcGVydHlTb3VyY2UgaXMgb25seSBmb3IgTm9kZXMiKTsgLy8kTk9OLU5MUy0xJAotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCXByaXZhdGUgYm9vbGVhbiBpbml0Q2FzZVNlbnNpdGl2ZShOb2RlIG5vZGUpIHsKLQkJLy8gYWxtb3N0IGFsbCB0YWdzIGFyZSBjYXNlIHNlbnN0aXZlLCBleGNlcHQgdGhhdCBvbGQgSFRNTAotCQlib29sZWFuIGNhc2VTZW5zaXRpdmUgPSB0cnVlOwotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlpZiAobm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQlhZGFwdGVyID0gZ2V0RG9jVHlwZUZyb21ET01Ob2RlKG5vZGUpOwotCQl9Ci0JCWlmIChhZGFwdGVyICE9IG51bGwpIHsKLQkJCWNhc2VTZW5zaXRpdmUgPSAoYWRhcHRlci5nZXRUYWdOYW1lQ2FzZSgpID09IERvY3VtZW50VHlwZUFkYXB0ZXIuU1RSSUNUX0NBU0UpOwotCQl9Ci0JCXJldHVybiBjYXNlU2Vuc2l0aXZlOwotCX0KLQotCS8qKgotCSAqIGJ5ICJpbnRlcm5hbCBzcGVjIiB0aGUgRE9DVFlQRSBhZGFwdGVyIGlzIG9ubHkgYXZhaWxhYmxlIGZyb20gRG9jdW1lbnQKLQkgKiBOb2RlCi0JICogCi0JICogQHJldHVybiB7QGxpbmsgRG9jdW1lbnRUeXBlQWRhcHRlcn0KLQkgKi8KLQlwcml2YXRlIERvY3VtZW50VHlwZUFkYXB0ZXIgZ2V0RG9jVHlwZUZyb21ET01Ob2RlKE5vZGUgbm9kZSkgewotCQlEb2N1bWVudFR5cGVBZGFwdGVyIGFkYXB0ZXIgPSBudWxsOwotCQlEb2N1bWVudCBvd25lckRvY3VtZW50ID0gbm9kZS5nZXRPd25lckRvY3VtZW50KCk7Ci0JCWlmIChvd25lckRvY3VtZW50ID09IG51bGwpIHsKLQkJCS8vIGlmIG93bmVyRG9jdW1lbnQgaXMgbnVsbCwgdGhlbiBmTm9kZSBtdXN0IGJlIHRoZSBEb2N1bWVudCBOb2RlCi0JCQkvLyBbb2xkLCBvbGQgY29tbWVudF0KLQkJCS8vIGhtbW1tLCBndWVzcyBub3QuIFNlZQotCQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTEzMDIzMwotCQkJLy8gZ3Vlc3MgdGhpcyBpcyB1c2VkIGZvciBtYW55IElOb2RlTm90aWZpZXJzLCBub3QganVzdCBYTUwuCi0JCQkvLyAoYW5kIERURCdzIHVzZSBJRE9NTm9kZT8gLi4uIHRoYXQgZG9lc24ndCBzb3VuZCBxdWl0ZSByaWdodAotCQkJLy8gLi4uIGJ1dCwgbWF5YmUgYSBzZXBhcmF0ZSBpc3N1ZSkuCi0JCQlpZiAobm9kZSBpbnN0YW5jZW9mIERvY3VtZW50KSB7Ci0JCQkJb3duZXJEb2N1bWVudCA9IChEb2N1bWVudCkgbm9kZTsKLQkJCX0KLQkJfQotCQlpZihvd25lckRvY3VtZW50ICE9IG51bGwpIHsKLQkJCWFkYXB0ZXIgPSAoRG9jdW1lbnRUeXBlQWRhcHRlcikgKChJTm9kZU5vdGlmaWVyKSBvd25lckRvY3VtZW50KS5nZXRBZGFwdGVyRm9yKERvY3VtZW50VHlwZUFkYXB0ZXIuY2xhc3MpOwotCQl9Ci0KLQkJcmV0dXJuIGFkYXB0ZXI7Ci0JfQotCi0JcHJpdmF0ZSBTdHJpbmdbXSBfZ2V0VmFsaWRGaXhlZFN0cmluZ3MoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCwgQ01EYXRhVHlwZSBoZWxwZXIpIHsKLQkJU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQlMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoMSk7Ci0JCVN0cmluZyBpbXBsaWVkVmFsdWUgPSBoZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCWlmIChpbXBsaWVkVmFsdWUgIT0gbnVsbCkKLQkJCXZhbHVlcy5hZGQoaW1wbGllZFZhbHVlKTsKLQkJYm9vbGVhbiBjaGVja0lmQ3VycmVudFZhbHVlSXNJbmNsdWRlZCA9IChmTm9kZS5nZXRBdHRyaWJ1dGVzKCkgIT0gbnVsbCAmJiBmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpICE9IG51bGwgJiYgZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKSAhPSBudWxsKTsKLQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0luY2x1ZGVkKSB7Ci0JCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbnVsbDsKLQkJCWN1cnJlbnRWYWx1ZSA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQlpZiAoIWN1cnJlbnRWYWx1ZS5lcXVhbHMoaW1wbGllZFZhbHVlKSkKLQkJCQl2YWx1ZXMuYWRkKGN1cnJlbnRWYWx1ZSk7Ci0JCX0KLQkJU3RyaW5nW10gdmFsaWRTdHJpbmdzID0gbmV3IFN0cmluZ1t2YWx1ZXMuc2l6ZSgpXTsKLQkJdmFsaWRTdHJpbmdzID0gKFN0cmluZ1tdKSB2YWx1ZXMudG9BcnJheSh2YWxpZFN0cmluZ3MpOwotCQlyZXR1cm4gdmFsaWRTdHJpbmdzOwotCX0KLQotCXByaXZhdGUgU3RyaW5nW10gX2dldFZhbGlkU3RyaW5ncyhDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsLCBDTURhdGFUeXBlIHZhbHVlc0hlbHBlcikgewotCQlTdHJpbmcgYXR0cmlidXRlTmFtZSA9IGF0dHJEZWNsLmdldEF0dHJOYW1lKCk7Ci0JCUxpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgxKTsKLQkJYm9vbGVhbiBjdXJyZW50VmFsdWVLbm93biA9IGZhbHNlOwotCQlib29sZWFuIGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duID0gKGZOb2RlLmdldEF0dHJpYnV0ZXMoKSAhPSBudWxsICYmIGZOb2RlLmdldEF0dHJpYnV0ZXMoKS5nZXROYW1lZEl0ZW0oYXR0cmlidXRlTmFtZSkgIT0gbnVsbCAmJiBmTm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJpYnV0ZU5hbWUpLmdldE5vZGVWYWx1ZSgpICE9IG51bGwpOwotCQlTdHJpbmcgY3VycmVudFZhbHVlID0gbnVsbDsKLQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duKQotCQkJY3VycmVudFZhbHVlID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbShhdHRyaWJ1dGVOYW1lKS5nZXROb2RlVmFsdWUoKTsKLQotCQlpZiAodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZUtpbmQoKSA9PSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfRklYRUQgJiYgdmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpICE9IG51bGwpIHsKLQkJCS8vIEZJWEVEIHZhbHVlCi0JCQljdXJyZW50VmFsdWVLbm93biA9IGN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIHZhbHVlc0hlbHBlci5nZXRJbXBsaWVkVmFsdWUoKS5lcXVhbHMoY3VycmVudFZhbHVlKTsKLQkJCXZhbHVlcy5hZGQodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpKTsKLQkJfQotCQllbHNlIHsKLQkJCS8vIEVOVU1FUkFURUQgdmFsdWVzCi0JCQlTdHJpbmdbXSB2YWx1ZVN0cmluZ3MgPSBudWxsOwotCQkJLy8gdmFsdWVTdHJpbmdzID0gdmFsdWVzSGVscGVyLmdldEVudW1lcmF0ZWRWYWx1ZXMoKTsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoZk5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwgJiYgZk5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCXZhbHVlU3RyaW5ncyA9IG1vZGVsUXVlcnkuZ2V0UG9zc2libGVEYXRhVHlwZVZhbHVlcygoRWxlbWVudCkgZk5vZGUsIGF0dHJEZWNsKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCXZhbHVlU3RyaW5ncyA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RW51bWVyYXRlZFZhbHVlcygpOwotCQkJfQotCQkJaWYgKHZhbHVlU3RyaW5ncyAhPSBudWxsKSB7Ci0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZVN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKGNoZWNrSWZDdXJyZW50VmFsdWVJc0tub3duICYmIHZhbHVlU3RyaW5nc1tpXS5lcXVhbHMoY3VycmVudFZhbHVlKSkKLQkJCQkJCWN1cnJlbnRWYWx1ZUtub3duID0gdHJ1ZTsKLQkJCQkJdmFsdWVzLmFkZCh2YWx1ZVN0cmluZ3NbaV0pOwotCQkJCX0KLQkJCX0KLQkJfQotCQlpZiAodmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfTk9ORSAmJiB2YWx1ZXNIZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJaWYgKCF2YWx1ZXMuY29udGFpbnModmFsdWVzSGVscGVyLmdldEltcGxpZWRWYWx1ZSgpKSkKLQkJCQl2YWx1ZXMuYWRkKHZhbHVlc0hlbHBlci5nZXRJbXBsaWVkVmFsdWUoKSk7Ci0JCX0KLQotCQlpZiAoY2hlY2tJZkN1cnJlbnRWYWx1ZUlzS25vd24gJiYgIWN1cnJlbnRWYWx1ZUtub3duICYmIGN1cnJlbnRWYWx1ZSAhPSBudWxsICYmIGN1cnJlbnRWYWx1ZS5sZW5ndGgoKSA+IDApCi0JCQl2YWx1ZXMuYWRkKGN1cnJlbnRWYWx1ZSk7Ci0JCVN0cmluZ1tdIHZhbGlkU3RyaW5ncyA9IG5ldyBTdHJpbmdbdmFsdWVzLnNpemUoKV07Ci0JCXZhbGlkU3RyaW5ncyA9IChTdHJpbmdbXSkgdmFsdWVzLnRvQXJyYXkodmFsaWRTdHJpbmdzKTsKLQkJcmV0dXJuIHZhbGlkU3RyaW5nczsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihTdHJpbmcgYXR0cmlidXRlTmFtZSkgewotCQlyZXR1cm4gY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyaWJ1dGVOYW1lLCBmYWxzZSk7Ci0JfQotCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZURlZmF1bHRQcm9wZXJ0eURlc2NyaXB0b3IoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIGJvb2xlYW4gaGlkZU9uRmlsdGVyKSB7Ci0JCS8vIFRoZSBkZXNjcmlwdG9yIGNsYXNzIHVzZWQgaGVyZSBpcyBhbHNvIHVzZWQgaW4KLQkJLy8gdXBkYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpCi0JCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJpYnV0ZU5hbWUsIGF0dHJpYnV0ZU5hbWUpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KG51bGwpKTsKLQkJZGVzY3JpcHRvci5zZXREZXNjcmlwdGlvbihhdHRyaWJ1dGVOYW1lKTsKLQkJaWYgKGhpZGVPbkZpbHRlciAmJiBmU2V0RXhwZXJ0RmlsdGVyKQotCQkJZGVzY3JpcHRvci5zZXRGaWx0ZXJGbGFncyhuZXcgU3RyaW5nW117SVByb3BlcnR5U2hlZXRFbnRyeS5GSUxURVJfSURfRVhQRVJUfSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCS8qKgotCSAqIENyZWF0ZXMgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGZvciBhbiBhdHRyaWJ1dGUgd2l0aCBFTlVNRVJBVEVEIHZhbHVlcyAtCi0JICogaWYgdGhlIHZhbHVlIGRvZXMgbm90IGV4aXN0LCBhbiBlZGl0YWJsZSBjb21ibyBib3ggaXMgcmV0dXJuZWQgLSBpZiB0aGUKLQkgKiB2YWx1ZSBleGlzdHMgYnV0IGlzIG5vdCBvbmUgaW4gdGhlIGVudW1lcmF0ZWQgbGlzdCBvZiB2YWx1ZSwgYSBjb21ibwotCSAqIGJveCBmZWF0dXJpbmcgdGhlIGN1cnJlbnQgYW5kIGNvcnJlY3QgdmFsdWVzIGlzIHJldHVybmVkIC0gaWYgdGhlIHZhbHVlCi0JICogZXhpc3RzIGFuZCBpdCBpcyBhIHZhbGlkIHZhbHVlLCBhIGNvbWJvIGJveCBmZWF0dXJpbmcgdGhlIGNvcnJlY3QKLQkgKiB2YWx1ZXMgd2l0aCB0aGUgY3VycmVudCBvbmUgdmlzaWJsZSBpcyByZXR1cm5lZAotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvciBjcmVhdGVFbnVtZXJhdGVkUHJvcGVydHlEZXNjcmlwdG9yKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIENNRGF0YVR5cGUgdmFsdWVzSGVscGVyKSB7Ci0JCS8vIHRoZSBkaXNwbGF5TmFtZSBNVVNUIGJlIHNldAotCQlFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbC5nZXRBdHRyTmFtZSgpLCBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpLCBfZ2V0VmFsaWRTdHJpbmdzKGF0dHJEZWNsLCB2YWx1ZXNIZWxwZXIpKTsKLQkJZGVzY3JpcHRvci5zZXRDYXRlZ29yeShnZXRDYXRlZ29yeShhdHRyRGVjbCkpOwotCQlkZXNjcmlwdG9yLnNldERlc2NyaXB0aW9uKGF0dHJEZWNsLmdldEF0dHJOYW1lKCkpOwotCQlpZiAoYXR0ckRlY2wuZ2V0VXNhZ2UoKSAhPSBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uLlJFUVVJUkVEICYmIGZTZXRFeHBlcnRGaWx0ZXIpCi0JCQlkZXNjcmlwdG9yLnNldEZpbHRlckZsYWdzKG5ldyBTdHJpbmdbXXtJUHJvcGVydHlTaGVldEVudHJ5LkZJTFRFUl9JRF9FWFBFUlR9KTsKLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogQ3JlYXRlcyBhIHByb3BlcnR5IGRlc2NyaXB0b3IgZm9yIGFuIGF0dHJpYnV0ZSB3aXRoIGEgRklYRUQgdmFsdWUgLSBpZgotCSAqIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgYW4gZWRpdGFibGUgY29tYm8gYm94IGlzIHJldHVybmVkIC0gaWYgdGhlCi0JICogdmFsdWUgZXhpc3RzIGJ1dCBpcyBub3QgdGhlIGZpeGVkL2RlZmF1bHQgdmFsdWUsIGEgY29tYm8gYm94IGZlYXR1cmluZwotCSAqIHRoZSBjdXJyZW50IGFuZCBjb3JyZWN0IHZhbHVlIGlzIHJldHVybmVkIC0gaWYgdGhlIHZhbHVlIGV4aXN0cyBhbmQgaXQKLQkgKiBpcyB0aGUgZml4ZWQvZGVmYXVsdCB2YWx1ZSwgbm8gY2VsbCBlZGl0b3IgaXMgcHJvdmlkZWQgImxvY2tpbmciIHRoZQotCSAqIHZhbHVlIGluCi0JICovCi0JcHJpdmF0ZSBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZUZpeGVkUHJvcGVydHlEZXNjcmlwdG9yKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wsIENNRGF0YVR5cGUgaGVscGVyKSB7Ci0JCS8vIHRoZSBkaXNwbGF5TmFtZSBNVVNUIGJlIHNldAotCQlFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRW51bWVyYXRlZFN0cmluZ1Byb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbC5nZXROb2RlTmFtZSgpLCBhdHRyRGVjbC5nZXROb2RlTmFtZSgpLCBfZ2V0VmFsaWRGaXhlZFN0cmluZ3MoYXR0ckRlY2wsIGhlbHBlcikpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KGF0dHJEZWNsKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yOwotCX0KLQotCXByb3RlY3RlZCBJUHJvcGVydHlEZXNjcmlwdG9yIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG51bGw7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCi0JCWlmIChhdHRyVHlwZSAhPSBudWxsKSB7Ci0JCQkvLyBoYW5kbGUgZGVjbGFyYXRpb25zIHRoYXQgcHJvdmlkZSBGSVhFRC9FTlVNRVJBVEVEIHZhbHVlcwotCQkJaWYgKGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKSAhPSBudWxsICYmIGF0dHJUeXBlLmdldEVudW1lcmF0ZWRWYWx1ZXMoKS5sZW5ndGggPiAwKSB7Ci0JCQkJZGVzY3JpcHRvciA9IGNyZWF0ZUVudW1lcmF0ZWRQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wsIGF0dHJUeXBlKTsKLQkJCX0KLQkJCWVsc2UgaWYgKChhdHRyRGVjbC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uRklYRUQgfHwgYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlS2luZCgpID09IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9GSVhFRCkgJiYgYXR0clR5cGUuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVGaXhlZFByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCwgYXR0clR5cGUpOwotCQkJfQotCQkJZWxzZSB7Ci0JCQkJLy8gcGxhaW4gdGV4dAotCQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsKTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCS8vIG5vIGV4dHJhIGluZm9ybWF0aW9uIGdpdmVuCi0JCQlkZXNjcmlwdG9yID0gY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCX0KLQkJcmV0dXJuIGRlc2NyaXB0b3I7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIHZhbGlkIGRlc2NyaXB0b3JzLgotCSAqLwotCXByaXZhdGUgSVByb3BlcnR5RGVzY3JpcHRvcltdIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcnMoKSB7Ci0JCUNNTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBudWxsOwotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlhdHRyTWFwID0gZWQuZ2V0QXR0cmlidXRlcygpOwotCQl9Ci0KLQkJTGlzdCBkZXNjcmlwdG9yTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJTGlzdCBuYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSBudWxsOwotCi0JCS8vIGFkZCBkZXNjcmlwdG9ycyBmb3IgZXhpc3RpbmcgYXR0cmlidXRlcwotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOyBpKyspIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCS8vIGlmIG1ldGFpbmZvIGlzIHByZXNlbnQgZm9yIHRoaXMgYXR0cmlidXRlLCB1c2UgdGhlCi0JCQkJLy8gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiB0byBkZXJpdmUgYSBkZXNjcmlwdG9yCi0JCQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkgewotCQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJCQkJaWYgKGZDYXNlU2Vuc2l0aXZlKQotCQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5nZXROYW1lZEl0ZW0oYXR0ck5hbWUpOwotCQkJCQllbHNlIHsKLQkJCQkJCWF0dHJEZWNsID0gbnVsbDsKLQkJCQkJCWZvciAoaW50IGogPSAwOyBqIDwgYXR0ck1hcC5nZXRMZW5ndGgoKTsgaisrKSB7Ci0JCQkJCQkJaWYgKCFmQ2FzZVNlbnNpdGl2ZSAmJiBhdHRyTWFwLml0ZW0oaikuZ2V0Tm9kZU5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgewotCQkJCQkJCQlhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBhdHRyTWFwLml0ZW0oaik7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQkvLyBiZSBjb25zaXN0ZW50OiBpZiB0aGVyZSdzIG1ldGFpbmZvLCB1c2UgKnRoYXQqIGFzIHRoZQotCQkJCS8vIGRlc2NyaXB0b3IgSUQKLQkJCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJCQlkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsKTsKLQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQkJCW5hbWVzLmFkZChhdHRyRGVjbC5nZXROb2RlTmFtZSgpKTsKLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWRlc2NyaXB0b3IgPSBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHIuZ2V0TmFtZSgpKTsKLQkJCQkJaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLQkJCQkJCW5hbWVzLmFkZChhdHRyLmdldE5hbWUoKSk7Ci0JCQkJfQotCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0JCQkJCWRlc2NyaXB0b3JMaXN0LmFkZChkZXNjcmlwdG9yKTsKLQkJCX0KLQkJfQotCi0JCS8vIGFkZCBkZXNjcmlwdG9ycyBmcm9tIHRoZSBtZXRhaW5mbyB0aGF0IGFyZSBub3QgeWV0IGxpc3RlZAotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShpKTsKLQkJCQlpZiAoIW5hbWVzLmNvbnRhaW5zKGF0dHJEZWNsLmdldEF0dHJOYW1lKCkpKSB7Ci0JCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgaG9sZERlc2NyaXB0b3IgPSBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoYXR0ckRlY2wpOwotCQkJCQlpZiAoaG9sZERlc2NyaXB0b3IgIT0gbnVsbCkgewotCQkJCQkJZGVzY3JpcHRvckxpc3QuYWRkKGhvbGREZXNjcmlwdG9yKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJfQotCi0JCUlQcm9wZXJ0eURlc2NyaXB0b3JbXSBkZXNjcmlwdG9ycyA9IG5ldyBJUHJvcGVydHlEZXNjcmlwdG9yW2Rlc2NyaXB0b3JMaXN0LnNpemUoKV07Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspCi0JCQlkZXNjcmlwdG9yc1tpXSA9IChJUHJvcGVydHlEZXNjcmlwdG9yKSBkZXNjcmlwdG9yTGlzdC5nZXQoaSk7Ci0JCXJldHVybiBkZXNjcmlwdG9yczsKLQl9Ci0KLQlwcml2YXRlIElQcm9wZXJ0eURlc2NyaXB0b3IgY3JlYXRlVGV4dFByb3BlcnR5RGVzY3JpcHRvcihDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCVRleHRQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG5ldyBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsLmdldEF0dHJOYW1lKCksIGF0dHJEZWNsLmdldEF0dHJOYW1lKCkpOwotCQlkZXNjcmlwdG9yLnNldENhdGVnb3J5KGdldENhdGVnb3J5KGF0dHJEZWNsKSk7Ci0JCWRlc2NyaXB0b3Iuc2V0RGVzY3JpcHRpb24oYXR0ckRlY2wuZ2V0QXR0ck5hbWUoKSk7Ci0JCWlmIChhdHRyRGVjbC5nZXRVc2FnZSgpICE9IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQgJiYgZlNldEV4cGVydEZpbHRlcikKLQkJCWRlc2NyaXB0b3Iuc2V0RmlsdGVyRmxhZ3MobmV3IFN0cmluZ1tde0lQcm9wZXJ0eVNoZWV0RW50cnkuRklMVEVSX0lEX0VYUEVSVH0pOwotCQlyZXR1cm4gZGVzY3JpcHRvcjsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZyBnZXRDYXRlZ29yeShDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsKSB7Ci0JCWlmIChhdHRyRGVjbCAhPSBudWxsKSB7Ci0JCQlpZiAoYXR0ckRlY2wuc3VwcG9ydHMoImNhdGVnb3J5IikpIHsgLy8kTk9OLU5MUy0xJAotCQkJCXJldHVybiAoU3RyaW5nKSBhdHRyRGVjbC5nZXRQcm9wZXJ0eSgiY2F0ZWdvcnkiKTsgLy8kTk9OLU5MUy0xJAotCQkJfQotCQkJaWYgKGZTaG91bGREZXJpdmVDYXRlZ29yaWVzICYmIGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCAmJiBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldE5vZGVOYW1lKCkgIT0gbnVsbCAmJiBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpLmdldE5vZGVOYW1lKCkubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJcmV0dXJuIGF0dHJEZWNsLmdldEF0dHJUeXBlKCkuZ2V0RGF0YVR5cGVOYW1lKCk7Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIENBVEVHT1JZX0FUVFJJQlVURVM7Ci0JfQotCi0JcHJpdmF0ZSBDTUVsZW1lbnREZWNsYXJhdGlvbiBnZXREZWNsYXJhdGlvbigpIHsKLQkJaWYgKGZOb2RlID09IG51bGwgfHwgZk5vZGUuZ2V0Tm9kZVR5cGUoKSAhPSBOb2RlLkVMRU1FTlRfTk9ERSkKLQkJCXJldHVybiBudWxsOwotCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGZOb2RlLmdldE93bmVyRG9jdW1lbnQoKSk7Ci0JCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCXJldHVybiBtb2RlbFF1ZXJ5LmdldENNRWxlbWVudERlY2xhcmF0aW9uKChFbGVtZW50KSBmTm9kZSk7Ci0JCX0KLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JcHJpdmF0ZSBEaXNwbGF5IGdldERpc3BsYXkoKSB7Ci0KLQkJcmV0dXJuIFBsYXRmb3JtVUkuZ2V0V29ya2JlbmNoKCkuZ2V0RGlzcGxheSgpOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgYSB2YWx1ZSBmb3IgdGhpcyBOb2RlIHRoYXQgY2FuIGJlIGVkaXR0ZWQgaW4gYSBwcm9wZXJ0eSBzaGVldC4KLQkgKiAKLQkgKiBAcmV0dXJuIGEgdmFsdWUgdGhhdCBjYW4gYmUgZWRpdHRlZAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0RWRpdGFibGVWYWx1ZSgpIHsKLQkJcmV0dXJuIG51bGw7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzLgotCSAqIAotCSAqIEByZXR1cm4gYWxsIHZhbGlkIGRlc2NyaXB0b3JzLgotCSAqLwotCXB1YmxpYyBmaW5hbCBJUHJvcGVydHlEZXNjcmlwdG9yW10gZ2V0UHJvcGVydHlEZXNjcmlwdG9ycygpIHsKLQkJaWYgKGZEZXNjcmlwdG9ycyA9PSBudWxsIHx8IGZEZXNjcmlwdG9ycy5sZW5ndGggPT0gMCkgewotCQkJZkRlc2NyaXB0b3JzID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQl9Ci0JCWVsc2UgewotCQkJdXBkYXRlUHJvcGVydHlEZXNjcmlwdG9ycygpOwotCQl9Ci0JCXJldHVybiBmRGVzY3JpcHRvcnM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBmb3IgdGhlIG5hbWVkIHByb3BlcnR5LgotCSAqIAotCSAqLwotCXB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHlWYWx1ZShPYmplY3QgbmFtZU9iamVjdCkgewotCQlTdHJpbmcgbmFtZSA9IG5hbWVPYmplY3QudG9TdHJpbmcoKTsKLQkJU3RyaW5nIHJldHVybmVkVmFsdWUgPSBudWxsOwotCQlOYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJNYXAgIT0gbnVsbCkgewotCQkJTm9kZSBhdHRyaWJ1dGUgPSBhdHRyTWFwLmdldE5hbWVkSXRlbShuYW1lKTsKLQkJCWlmIChhdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCWlmIChhdHRyaWJ1dGUgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCQkJcmV0dXJuZWRWYWx1ZSA9ICgoSURPTU5vZGUpIGF0dHJpYnV0ZSkuZ2V0VmFsdWVTb3VyY2UoKTsKLQkJCQllbHNlCi0JCQkJCXJldHVybmVkVmFsdWUgPSBhdHRyaWJ1dGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQl9Ci0JCX0KLQkJaWYgKHJldHVybmVkVmFsdWUgPT0gbnVsbCkKLQkJCXJldHVybmVkVmFsdWUgPSAiIjsgLy8kTk9OLU5MUy0xJAotCQlyZXR1cm4gcmV0dXJuZWRWYWx1ZTsKLQl9Ci0KLQlwcml2YXRlIFN0cmluZ1tdIGdldFZhbGlkVmFsdWVzKENNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wpIHsKLQkJaWYgKGF0dHJEZWNsID09IG51bGwpCi0JCQlyZXR1cm4gbmV3IFN0cmluZ1swXTsKLQotCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IG51bGw7Ci0JCUNNRGF0YVR5cGUgYXR0clR5cGUgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQlpZiAoYXR0clR5cGUgIT0gbnVsbCkgewotCQkJdmFsaWRWYWx1ZXMgPSBfZ2V0VmFsaWRTdHJpbmdzKGF0dHJEZWNsLCBhdHRyVHlwZSk7Ci0JCQlpZiAoZlNvcnRFbnVtZXJhdGVkVmFsdWVzKQotCQkJCUFycmF5cy5zb3J0KHZhbGlkVmFsdWVzKTsKLQkJfQotCQlpZiAodmFsaWRWYWx1ZXMgPT0gbnVsbCkKLQkJCXZhbGlkVmFsdWVzID0gbmV3IFN0cmluZ1swXTsKLQkJcmV0dXJuIHZhbGlkVmFsdWVzOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZW1vdmFibGUoT2JqZWN0IGlkKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlSZXNldHRhYmxlKE9iamVjdCBpZCkgewotCQlib29sZWFuIHJlc2V0dGFibGUgPSBmYWxzZTsKLQkJU3RyaW5nIHByb3BlcnR5ID0gaWQudG9TdHJpbmcoKTsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0ckRlY2xzID0gbnVsbDsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlhdHRyRGVjbHMgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCX0KLQotCQlpZiAoYXR0ckRlY2xzICE9IG51bGwpIHsKLQkJCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ckRlY2xzLmdldE5hbWVkSXRlbShwcm9wZXJ0eSk7Ci0JCQlpZiAoYXR0ckRlY2wgIT0gbnVsbCkgewotCQkJCWlmIChhdHRyRGVjbC5nZXRBdHRyVHlwZSgpICE9IG51bGwpIHsKLQkJCQkJQ01EYXRhVHlwZSBoZWxwZXIgPSBhdHRyRGVjbC5nZXRBdHRyVHlwZSgpOwotCQkJCQlpZiAoaGVscGVyLmdldEltcGxpZWRWYWx1ZUtpbmQoKSAhPSBDTURhdGFUeXBlLklNUExJRURfVkFMVUVfTk9ORSAmJiBoZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCkgIT0gbnVsbCkgewotCQkJCQkJcmVzZXR0YWJsZSA9IHRydWU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJcmV0dXJuIHJlc2V0dGFibGU7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB3aGV0aGVyIHRoZSBwcm9wZXJ0eSB2YWx1ZSBoYXMgY2hhbmdlZCBmcm9tIHRoZSBkZWZhdWx0LgotCSAqIAotCSAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaGFzCi0JICogICAgICAgICBjaGFuZ2VkIGZyb20gaXRzIG9yaWdpbmFsIGRlZmF1bHQgdmFsdWU7IDxjb2RlPmZhbHNlPC9jb2RlPgotCSAqICAgICAgICAgb3RoZXJ3aXNlLgotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzUHJvcGVydHlTZXQoT2JqZWN0IHByb3BlcnR5T2JqZWN0KSB7Ci0JCVN0cmluZyBwcm9wZXJ0eSA9IHByb3BlcnR5T2JqZWN0LnRvU3RyaW5nKCk7Ci0KLQkJTmFtZWROb2RlTWFwIGF0dHJNYXAgPSBmTm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCWlmIChhdHRyTWFwICE9IG51bGwpCi0JCQlyZXR1cm4gYXR0ck1hcC5nZXROYW1lZEl0ZW0ocHJvcGVydHkpICE9IG51bGw7Ci0JCXJldHVybiBmYWxzZTsKLQl9Ci0KLQkvKioKLQkgKiBSZW1vdmUgdGhlIGdpdmVuIGF0dHJpYnV0ZSBmcm9tIHRoZSBOb2RlCi0JICogCi0JICogQHBhcmFtIHByb3BlcnR5T2JqZWN0Ci0JICovCi0JcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoT2JqZWN0IHByb3BlcnR5T2JqZWN0KSB7Ci0JCU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gZk5vZGUuZ2V0QXR0cmlidXRlcygpOwotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQlOb2RlIGF0dHJpYnV0ZSA9IGF0dHJNYXAuZ2V0TmFtZWRJdGVtKHByb3BlcnR5T2JqZWN0LnRvU3RyaW5nKCkpOwotCQkJaWYgKGF0dHJpYnV0ZSAhPSBudWxsKSB7Ci0JCQkJdHJ5IHsKLQkJCQkJYXR0ck1hcC5yZW1vdmVOYW1lZEl0ZW0ocHJvcGVydHlPYmplY3QudG9TdHJpbmcoKSk7Ci0JCQkJfQotCQkJCWNhdGNoIChET01FeGNlcHRpb24gZSkgewotCQkJCQlpZiAoZS5jb2RlICE9IERPTUV4Y2VwdGlvbi5JTlZBTElEX01PRElGSUNBVElPTl9FUlIpIHsKLQkJCQkJCUxvZ2dlci5sb2dFeGNlcHRpb24oZSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBSZXNldHMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSdzIHZhbHVlIHRvIGl0cyBkZWZhdWx0IHZhbHVlLgotCSAqIAotCSAqLwotCXB1YmxpYyB2b2lkIHJlc2V0UHJvcGVydHlWYWx1ZShPYmplY3QgcHJvcGVydHlPYmplY3QpIHsKLQkJU3RyaW5nIHByb3BlcnR5ID0gcHJvcGVydHlPYmplY3QudG9TdHJpbmcoKTsKLQkJQ01OYW1lZE5vZGVNYXAgYXR0ckRlY2xzID0gbnVsbDsKLQotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IGdldERlY2xhcmF0aW9uKCk7Ci0JCWlmIChlZCAhPSBudWxsKSB7Ci0JCQlhdHRyRGVjbHMgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJaWYgKGF0dHJEZWNscyAhPSBudWxsKSB7Ci0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJEZWNscy5nZXROYW1lZEl0ZW0ocHJvcGVydHkpOwotCQkJU3RyaW5nIGRlZlZhbHVlID0gbnVsbDsKLQkJCWlmIChhdHRyRGVjbCAhPSBudWxsKSB7Ci0JCQkJaWYgKGF0dHJEZWNsLmdldEF0dHJUeXBlKCkgIT0gbnVsbCkgewotCQkJCQlDTURhdGFUeXBlIGhlbHBlciA9IGF0dHJEZWNsLmdldEF0dHJUeXBlKCk7Ci0JCQkJCWlmIChoZWxwZXIuZ2V0SW1wbGllZFZhbHVlS2luZCgpICE9IENNRGF0YVR5cGUuSU1QTElFRF9WQUxVRV9OT05FICYmIGhlbHBlci5nZXRJbXBsaWVkVmFsdWUoKSAhPSBudWxsKQotCQkJCQkJZGVmVmFsdWUgPSBoZWxwZXIuZ2V0SW1wbGllZFZhbHVlKCk7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGRlZlZhbHVlICE9IG51bGwgJiYgZGVmVmFsdWUubGVuZ3RoKCkgPiAwKSB7Ci0JCQkJKChBdHRyKSBhdHRyTWFwLmdldE5hbWVkSXRlbShwcm9wZXJ0eSkpLnNldFZhbHVlKGRlZlZhbHVlKTsKLQkJCX0KLQkJCWVsc2UgewotCQkJCWF0dHJNYXAucmVtb3ZlTmFtZWRJdGVtKHByb3BlcnR5KTsKLQkJCX0KLQkJfQotCQllbHNlIHsKLQkJCWF0dHJNYXAucmVtb3ZlTmFtZWRJdGVtKHByb3BlcnR5KTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFNldHMgdGhlIG5hbWVkIHByb3BlcnR5IHRvIHRoZSBnaXZlbiB2YWx1ZS4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBuYW1lT2JqZWN0LCBPYmplY3QgdmFsdWUpIHsKLQkJLy8gQXZvaWQgY3ljbGluZyAtIGNhbiBoYXBwZW4gaWYgYSBjbG9zaW5nIGNlbGwgZWRpdG9yIGNhdXNlcyBhCi0JCS8vIHJlZnJlc2gKLQkJLy8gb24gdGhlIFByb3BlcnR5U2hlZXQgcGFnZSBhbmQgdGhlIHNldElucHV0IGFnYWluIGFza3MgdGhlIGVkaXRvciB0bwotCQkvLyBjbG9zZTsgYmVzaWRlcywgd2h5IGFwcGx5IHRoZSBzYW1lIHZhbHVlIHR3aWNlPwotCQlpZiAoIWZWYWx1ZXNCZWluZ1NldC5pc0VtcHR5KCkgJiYgZlZhbHVlc0JlaW5nU2V0LnBlZWsoKSA9PSBuYW1lT2JqZWN0KQotCQkJcmV0dXJuOwotCQlmVmFsdWVzQmVpbmdTZXQucHVzaChuYW1lT2JqZWN0KTsKLQkJU3RyaW5nIG5hbWUgPSBuYW1lT2JqZWN0LnRvU3RyaW5nKCk7Ci0JCVN0cmluZyB2YWx1ZVN0cmluZyA9IG51bGw7Ci0JCWlmICh2YWx1ZSAhPSBudWxsKQotCQkJdmFsdWVTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpOwotCQlOYW1lZE5vZGVNYXAgYXR0ck1hcCA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJdHJ5IHsKLQkJCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCQlBdHRyIGF0dHIgPSAoQXR0cikgYXR0ck1hcC5nZXROYW1lZEl0ZW0obmFtZSk7Ci0JCQkJaWYgKGF0dHIgIT0gbnVsbCkgewotCQkJCQkvLyBFWElTVElORyBWQUxVRQotCQkJCQkvLyBwb3RlbnRpYWwgb3V0IG9mIGNvbnRyb2wgbG9vcCBpZiB1cGRhdGluZyB0aGUgdmFsdWUKLQkJCQkJLy8gdHJpZ2dlcnMgYSB2aWV3ZXIgdXBkYXRlLCBmb3JjaW5nIHRoZQotCQkJCQkvLyBhY3RpdmUgY2VsbCBlZGl0b3IgdG8gc2F2ZSBpdHMgdmFsdWUgYW5kIGNhdXNpbmcgdGhlCi0JCQkJCS8vIGxvb3AgdG8gY29udGludWUKLQkJCQkJaWYgKGF0dHIuZ2V0VmFsdWUoKSA9PSBudWxsIHx8ICFhdHRyLmdldFZhbHVlKCkuZXF1YWxzKHZhbHVlU3RyaW5nKSkgewotCQkJCQkJaWYgKGF0dHIgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCQkJCQkoKElET01Ob2RlKSBhdHRyKS5zZXRWYWx1ZVNvdXJjZSh2YWx1ZVN0cmluZyk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJYXR0ci5zZXRWYWx1ZSh2YWx1ZVN0cmluZyk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCS8vIE5FVyg/KSB2YWx1ZQotCQkJCQlpZiAodmFsdWUgIT0gbnVsbCkgeyAvLyBuZXZlciBjcmVhdGUgYW4gZW1wdHkgYXR0cmlidXRlCi0JCQkJCQlBdHRyIG5ld0F0dHIgPSBmTm9kZS5nZXRPd25lckRvY3VtZW50KCkuY3JlYXRlQXR0cmlidXRlKG5hbWUpOwotCQkJCQkJaWYgKG5ld0F0dHIgaW5zdGFuY2VvZiBJRE9NTm9kZSkKLQkJCQkJCQkoKElET01Ob2RlKSBuZXdBdHRyKS5zZXRWYWx1ZVNvdXJjZSh2YWx1ZVN0cmluZyk7Ci0JCQkJCQllbHNlCi0JCQkJCQkJbmV3QXR0ci5zZXRWYWx1ZSh2YWx1ZVN0cmluZyk7Ci0JCQkJCQlhdHRyTWFwLnNldE5hbWVkSXRlbShuZXdBdHRyKTsKLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCWVsc2UgewotCQkJCWlmIChmTm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQpIHsKLQkJCQkJKChFbGVtZW50KSBmTm9kZSkuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlU3RyaW5nKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJY2F0Y2ggKERPTUV4Y2VwdGlvbiBlKSB7Ci0JCQlEaXNwbGF5IGQgPSBnZXREaXNwbGF5KCk7Ci0JCQlpZiAoZCAhPSBudWxsKQotCQkJCWQuYmVlcCgpOwotCQl9Ci0JCWZWYWx1ZXNCZWluZ1NldC5wb3AoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCB1cGRhdGVQcm9wZXJ0eURlc2NyaXB0b3JzKCkgewotCQlpZiAoZkRlc2NyaXB0b3JzID09IG51bGwgfHwgZkRlc2NyaXB0b3JzLmxlbmd0aCA9PSAwKQotCQkJLy8gTm90aGluZyB0byB1cGRhdGUKLQkJCXJldHVybjsKLQotCQkvLyBMaXN0IG9mIGFsbCBuYW1lcyBlbmNvdW50ZXJlZCBpbiB0aGUgdGFnIGFuZCBkZWZpbmVkIGJ5IHRoZSBlbGVtZW50Ci0JCUxpc3QgZGVjbGFyZWROYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQkJLy8gTmV3IGRlc2NyaXB0b3IgbGlzdCB0aGF0IHdpbGwgYmVjb21lIGZEZXNjcmlwdG9ycyBhZnRlciBhbGwKLQkJLy8gcHJvY2Vzc2luZyBpcyBkb25lCi0JCUxpc3QgZGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0JCS8vIE5hbWVzIG9mIHRoZSBkZXNjcmlwdG9ycyBpbiB0aGUgYWJvdmUgTGlzdAotCQlMaXN0IGRlc2NyaXB0b3JOYW1lcyA9IG5ldyBBcnJheUxpc3QoKTsKLQotCQkvLyBVcGRhdGUgYW55IGRlc2NyaXB0b3JzIGRlcml2ZWQgZnJvbSB0aGUgbWV0YWluZm8KLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSBnZXREZWNsYXJhdGlvbigpOwotCQlDTU5hbWVkTm9kZU1hcCBhdHRyTWFwID0gbnVsbDsKLQkJaWYgKGVkICE9IG51bGwpIHsKLQkJCWF0dHJNYXAgPSBlZC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCX0KLQkJLy8gVXBkYXRlIGV4aXRpbmcgZGVzY3JpcHRvcnM7IG5vdCBhZGRlZCB0byB0aGUgZmluYWwgbGlzdCBoZXJlCi0JCWlmIChhdHRyTWFwICE9IG51bGwpIHsKLQkJCS8vIFVwZGF0ZSBleGlzdGluZyBkZXNjcmlwdG9yIHR5cGVzIGJhc2VkIG9uIG1ldGFpbmZvCi0JCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dHJEZWNsID0gbnVsbDsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0ck1hcC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0ck1hcC5pdGVtKGkpOwotCQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHJEZWNsLmdldEF0dHJOYW1lKCk7Ci0JCQkJaWYgKCFkZWNsYXJlZE5hbWVzLmNvbnRhaW5zKGF0dHJOYW1lKSkgewotCQkJCQlkZWNsYXJlZE5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJfQotCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZkRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJCWJvb2xlYW4gc2FtZU5hbWUgPSAoZkNhc2VTZW5zaXRpdmUgJiYgZkRlc2NyaXB0b3JzW2pdLmdldElkKCkuZXF1YWxzKGF0dHJEZWNsLmdldE5vZGVOYW1lKCkpKSB8fCAoIWZDYXNlU2Vuc2l0aXZlICYmIGF0dHJEZWNsLmdldE5vZGVOYW1lKCkuZXF1YWxzKGZEZXNjcmlwdG9yc1tqXS5nZXRJZCgpLnRvU3RyaW5nKCkpKTsKLQkJCQkJaWYgKHNhbWVOYW1lKSB7Ci0JCQkJCQlTdHJpbmdbXSB2YWxpZFZhbHVlcyA9IGdldFZhbGlkVmFsdWVzKGF0dHJEZWNsKTsKLQkJCQkJCS8vIFVwZGF0ZSB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcwotCQkJCQkJLy8gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiAob25seSBlbnVtZXJhdGVkIHZhbHVlcyBnZXQKLQkJCQkJCS8vIHVwZGF0ZWQgZm9yIG5vdykKLQkJCQkJCWlmIChmRGVzY3JpcHRvcnNbal0gaW5zdGFuY2VvZiBFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKSB7Ci0JCQkJCQkJKChFbnVtZXJhdGVkU3RyaW5nUHJvcGVydHlEZXNjcmlwdG9yKSBmRGVzY3JpcHRvcnNbal0pLnVwZGF0ZVZhbHVlcyh2YWxpZFZhbHVlcyk7Ci0JCQkJCQl9Ci0JCQkJCQkvLyBSZXBsYWNlIHdpdGggYmV0dGVyIGRlc2NyaXB0b3IKLQkJCQkJCWVsc2UgaWYgKHZhbGlkVmFsdWVzICE9IG51bGwgJiYgdmFsaWRWYWx1ZXMubGVuZ3RoID4gMCkgewotCQkJCQkJCWZEZXNjcmlwdG9yc1tqXSA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvLyBVcGRhdGUgZXhpc3RpbmcgZGVzY3JpcHRvcnMgYmFzZWQgb24gbm90IGhhdmluZyBhbnkgbWV0YWluZm8KLQkJCWZvciAoaW50IGogPSAwOyBqIDwgZkRlc2NyaXB0b3JzLmxlbmd0aDsgaisrKSB7Ci0JCQkJLy8gUmVwbGFjZSB3aXRoIGJhc2ljIGRlc2NyaXB0b3IKLQkJCQlpZiAoIShmRGVzY3JpcHRvcnNbal0gaW5zdGFuY2VvZiBUZXh0UHJvcGVydHlEZXNjcmlwdG9yKSkgewotCQkJCQlmRGVzY3JpcHRvcnNbal0gPSBjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKChTdHJpbmcpIGZEZXNjcmlwdG9yc1tqXS5nZXRJZCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQlOYW1lZE5vZGVNYXAgYXR0cmlidXRlcyA9IGZOb2RlLmdldEF0dHJpYnV0ZXMoKTsKLQotCQkvLyBSZW1vdmUgZGVzY3JpcHRvcnMgZm9yIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgcHJlc2VudCBBTkQgYXJlbid0Ci0JCS8vIGtub3duIHRocm91Z2ggbWV0YWluZm8sCi0JCS8vIGRvIHRoaXMgYnkgb25seSByZXVzaW5nIGV4aXN0aW5nIGRlc2NyaXB0b3JzIGZvciBhdHRyaWJ1dGVzIHRoYXQKLQkJLy8gYXJlIHByZXNlbnQgb3IgZGVjbGFyZWQKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmRGVzY3JpcHRvcnMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChmRGVzY3JpcHRvcnNbaV0gIT0gbnVsbCkgewotCQkJCVN0cmluZyBkZXNjcmlwdG9yTmFtZSA9IGZEZXNjcmlwdG9yc1tpXS5nZXRJZCgpLnRvU3RyaW5nKCk7Ci0JCQkJaWYgKChkZWNsYXJlZE5hbWVzLmNvbnRhaW5zKGRlc2NyaXB0b3JOYW1lKSB8fCAoYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oZGVzY3JpcHRvck5hbWUpICE9IG51bGwpKSAmJiAhZGVzY3JpcHRvck5hbWVzLmNvbnRhaW5zKGRlc2NyaXB0b3JOYW1lKSkgewotCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGRlc2NyaXB0b3JOYW1lKTsKLQkJCQkJZGVzY3JpcHRvcnMuYWRkKGZEZXNjcmlwdG9yc1tpXSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gQWRkIGRlc2NyaXB0b3JzIGZvciBkZWNsYXJlZCBhdHRyaWJ1dGVzIHRoYXQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZQotCQlpZiAoYXR0ck1hcCAhPSBudWxsKSB7Ci0JCQkvLyBVcGRhdGUgZXhpc3RpbmcgZGVzY3JpcHRvciB0eXBlcyBiYXNlZCBvbiBtZXRhaW5mbwotCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IG51bGw7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJNYXAuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJNYXAuaXRlbShpKTsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyRGVjbC5nZXRBdHRyTmFtZSgpOwotCQkJCWlmIChmQ2FzZVNlbnNpdGl2ZSkgewotCQkJCQlpZiAoIWRlc2NyaXB0b3JOYW1lcy5jb250YWlucyhhdHRyTmFtZSkpIHsKLQkJCQkJCUlQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcihhdHRyRGVjbCk7Ci0JCQkJCQlpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0JCQkJCQkJZGVzY3JpcHRvck5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQkJZGVzY3JpcHRvcnMuYWRkKGRlc2NyaXB0b3IpOwotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJCWVsc2UgewotCQkJCQlib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotCQkJCQlmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JOYW1lcy5zaXplKCk7IGorKykKLQkJCQkJCWV4aXN0cyA9IChkZXNjcmlwdG9yTmFtZXMuZ2V0KGopLnRvU3RyaW5nKCkuZXF1YWxzSWdub3JlQ2FzZShhdHRyTmFtZSkpIHx8IGV4aXN0czsKLQkJCQkJaWYgKCFleGlzdHMpIHsKLQkJCQkJCWRlc2NyaXB0b3JOYW1lcy5hZGQoYXR0ck5hbWUpOwotCQkJCQkJSVByb3BlcnR5RGVzY3JpcHRvciBkZXNjcmlwdG9yID0gY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKGF0dHJEZWNsKTsKLQkJCQkJCWlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLQkJCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCQlkZXNjcmlwdG9ycy5hZGQoZGVzY3JpcHRvcik7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0JCX0KLQotCQkvLyBBZGQgZGVzY3JpcHRvcnMgZm9yIGV4aXN0aW5nIGF0dHJpYnV0ZXMgdGhhdCBkb24ndCBhbHJlYWR5IGhhdmUgb25lCi0JCWlmIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJQXR0ciBhdHRyID0gKEF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQlTdHJpbmcgYXR0ck5hbWUgPSBhdHRyLmdldE5hbWUoKTsKLQkJCQlpZiAoZkNhc2VTZW5zaXRpdmUpIHsKLQkJCQkJaWYgKCFkZXNjcmlwdG9yTmFtZXMuY29udGFpbnMoYXR0ck5hbWUpKSB7Ci0JCQkJCQlkZXNjcmlwdG9yTmFtZXMuYWRkKGF0dHJOYW1lKTsKLQkJCQkJCWRlc2NyaXB0b3JzLmFkZChjcmVhdGVEZWZhdWx0UHJvcGVydHlEZXNjcmlwdG9yKGF0dHJOYW1lKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWJvb2xlYW4gZXhpc3RzID0gZmFsc2U7Ci0JCQkJCWZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvck5hbWVzLnNpemUoKTsgaisrKQotCQkJCQkJZXhpc3RzID0gKGRlc2NyaXB0b3JOYW1lcy5nZXQoaikudG9TdHJpbmcoKS5lcXVhbHNJZ25vcmVDYXNlKGF0dHJOYW1lKSkgfHwgZXhpc3RzOwotCQkJCQlpZiAoIWV4aXN0cykgewotCQkJCQkJZGVzY3JpcHRvck5hbWVzLmFkZChhdHRyTmFtZSk7Ci0JCQkJCQlkZXNjcmlwdG9ycy5hZGQoY3JlYXRlRGVmYXVsdFByb3BlcnR5RGVzY3JpcHRvcihhdHRyTmFtZSkpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQl9Ci0KLQkJLy8gVXBkYXRlIGZEZXNjcmlwdG9ycwotCQlJUHJvcGVydHlEZXNjcmlwdG9yW10gbmV3RGVzY3JpcHRvcnMgPSBuZXcgSVByb3BlcnR5RGVzY3JpcHRvcltkZXNjcmlwdG9ycy5zaXplKCldOwotCQlmb3IgKGludCBpID0gMDsgaSA8IG5ld0Rlc2NyaXB0b3JzLmxlbmd0aDsgaSsrKQotCQkJbmV3RGVzY3JpcHRvcnNbaV0gPSAoSVByb3BlcnR5RGVzY3JpcHRvcikgZGVzY3JpcHRvcnMuZ2V0KGkpOwotCQlmRGVzY3JpcHRvcnMgPSBuZXdEZXNjcmlwdG9yczsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcHJvdmlzaW9uYWwvSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9JRE9NU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDE4YjA4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9JRE9NU291cmNlRWRpdGluZ1RleHRUb29scy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3Zpc2lvbmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5CYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuTm9kZUxvY2F0aW9uOwotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgSURPTVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMgZXh0ZW5kcyBJU291cmNlRWRpdGluZ1RleHRUb29scyB7Ci0JLyoqCi0JICogUmV0dXJucyBhIFczQyBET00gZG9jdW1lbnQKLQkgKiAKLQkgKiBAcmV0dXJuIERvY3VtZW50IG9iamVjdCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBjb3JyZXNwb25kaW5nCi0JICogICAgICAgICBkb2N1bWVudCBkb2VzIG5vdCBleGlzdAotCSAqLwotCURvY3VtZW50IGdldERPTURvY3VtZW50KCk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRoZSBXM0MgRE9NIE5vZGUgYXQgdGhlIGdpdmVuIG9mZnNldAotCSAqIAotCSAqIEBwYXJhbSBvZmZzZXQKLQkgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgd2l0aGluIHRoZSBJRG9jdW1lbnQKLQkgKiBAcmV0dXJuIGEgTm9kZSBhdCB0aGF0IGxvY2F0aW9uLCBpZiBvbmUgaXMgcHJlc2VudAotCSAqIAotCSAqIEB0aHJvd3MgQmFkTG9jYXRpb25FeGNlcHRpb24KLQkgKiAgICAgICAgICAgICBmb3IgaW52YWxpZCBvZmZzZXRzCi0JICovCi0JTm9kZSBnZXROb2RlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbjsKLQotCS8qKgotCSAqIFJldHVybnMgYSBOb2RlTG9jYXRpb24gb2JqZWN0IGRlc2NyaWJpbmcgdGhlIHBvc2l0aW9uIGluZm9ybWF0aW9uIG9mCi0JICogdGhlIE5vZGUncyBzdGFydCBhbmQgZW5kIHRhZ3MuCi0JICogCi0JICogQHBhcmFtIG5vZGUKLQkgKiBAcmV0dXJuIFRoZSBOb2RlTG9jYXRpb24gZm9yIHRoaXMgTm9kZSwgbnVsbCBmb3IgdW5zdXBwb3J0ZWQgTm9kZQotCSAqICAgICAgICAgaW5zdGFuY2VzLgotCSAqLwotCU5vZGVMb2NhdGlvbiBnZXROb2RlTG9jYXRpb24oTm9kZSBub2RlKTsKLQotCS8qKgotCSAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2VydmVyLXNpZGUgcGFnZSBsYW5ndWFnZSBmb3IgdGhlIERvY3VtZW50IG9mIHRoZQotCSAqIGdpdmVuIE5vZGUuCi0JICogCi0JICogQHJldHVybiBUaGUgc2VydmVyLXNpZGUgcGFnZSBsYW5ndWFnZSBmb3IgdGhpcyBub2RlbSBudWxsIGZvciBOb2RlcwotCSAqICAgICAgICAgd2l0aGluIHVuc3VwcG9ydGVkIERvY3VtZW50cy4KLQkgKi8KLQlTdHJpbmcgZ2V0UGFnZUxhbmd1YWdlKE5vZGUgbm9kZSk7Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHN0YXJ0IG9mZnNldCBvZiBnaXZlbiBOb2RlLgotCSAqIAotCSAqIEBwYXJhbSBub2RlCi0JICogICAgICAgICAgICB3M2MgPGNvZGU+Tm9kZTwvY29kZT4gb2JqZWN0IHRvIGNoZWNrCi0JICogQHJldHVybiB0aGUgc3RhcnQgb2Zmc2V0IG9yIC0xIGZvciB1bnN1cHBvcnRlZCBOb2RlcwotCSAqLwotCWludCBnZXRTdGFydE9mZnNldChOb2RlIG5vZGUpOwotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1hNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9wcm92aXNpb25hbC9YTUxTb3VyY2VFZGl0aW5nVGV4dFRvb2xzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5OWNjYzkuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3Byb3Zpc2lvbmFsL1hNTFNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJvdmlzaW9uYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkuSUVkaXRvclBhcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLklOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVOb3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuU3RydWN0dXJlZFRleHRFZGl0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TdHJ1Y3R1cmVkVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLmV4dGVuc2lvbnMuSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5leHRlbnNpb25zLmJyZWFrcG9pbnQuTm9kZUxvY2F0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuZG9jdW1lbnQuSURPTVRleHQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIElTb3VyY2VFZGl0aW5nVGV4dFRvb2xzIGludGVyZmFjZQotICovCi1wdWJsaWMgY2xhc3MgWE1MU291cmNlRWRpdGluZ1RleHRUb29scyBpbXBsZW1lbnRzIElET01Tb3VyY2VFZGl0aW5nVGV4dFRvb2xzLCBJTm9kZUFkYXB0ZXIgewotCi0JcHJvdGVjdGVkIGNsYXNzIE5vZGVMb2NhdGlvbkltcGwgaW1wbGVtZW50cyBOb2RlTG9jYXRpb24gewotCQlwcml2YXRlIElET01Ob2RlIG5vZGU7Ci0KLQkJcHVibGljIE5vZGVMb2NhdGlvbkltcGwoSURPTU5vZGUgeG1sbm9kZSkgewotCQkJc3VwZXIoKTsKLQkJCW5vZGUgPSB4bWxub2RlOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRFbmRUYWdFbmRPZmZzZXQoKSB7Ci0JCQlpZiAobm9kZS5nZXRFbmRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKSAhPSBudWxsKQotCQkJCXJldHVybiBub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldEVuZE9mZnNldCgpOwotCQkJcmV0dXJuIC0xOwotCQl9Ci0KLQkJcHVibGljIGludCBnZXRFbmRUYWdTdGFydE9mZnNldCgpIHsKLQkJCWlmIChub2RlLmdldEVuZFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpCi0JCQkJcmV0dXJuIG5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U3RhcnRUYWdFbmRPZmZzZXQoKSB7Ci0JCQlpZiAobm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpICE9IG51bGwpCi0JCQkJcmV0dXJuIG5vZGUuZ2V0U3RhcnRTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0U3RhcnRUYWdTdGFydE9mZnNldCgpIHsKLQkJCWlmIChub2RlLmdldFN0YXJ0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KLQl9Ci0KLQlTdHJ1Y3R1cmVkVGV4dEVkaXRvciBmVGV4dEVkaXRvciA9IG51bGw7Ci0KLQlwdWJsaWMgaW50IGdldENhcmV0T2Zmc2V0KCkgewotCQlTdHJ1Y3R1cmVkVGV4dFZpZXdlciBzdHYgPSBmVGV4dEVkaXRvci5nZXRUZXh0Vmlld2VyKCk7Ci0JCWlmIChzdHYgIT0gbnVsbCAmJiBzdHYuZ2V0VGV4dFdpZGdldCgpICE9IG51bGwgJiYgIXN0di5nZXRUZXh0V2lkZ2V0KCkuaXNEaXNwb3NlZCgpKSB7Ci0JCQlyZXR1cm4gc3R2LndpZGdldE9mZnNldDJNb2RlbE9mZnNldChzdHYuZ2V0VGV4dFdpZGdldCgpLmdldENhcmV0T2Zmc2V0KCkpOwotCQl9Ci0JCXJldHVybiAwOwotCX0KLQotCXB1YmxpYyBJRG9jdW1lbnQgZ2V0RG9jdW1lbnQoKSB7Ci0JCXJldHVybiBmVGV4dEVkaXRvci5nZXREb2N1bWVudFByb3ZpZGVyKCkuZ2V0RG9jdW1lbnQoZlRleHRFZGl0b3IuZ2V0RWRpdG9ySW5wdXQoKSk7Ci0JfQotCi0JcHVibGljIERvY3VtZW50IGdldERPTURvY3VtZW50KCkgewotCQlyZXR1cm4gKERvY3VtZW50KSBmVGV4dEVkaXRvci5nZXRNb2RlbCgpLmdldEFkYXB0ZXIoRG9jdW1lbnQuY2xhc3MpOwotCX0KLQotCS8qCi0JICogSWYgc2ltaWxhciBmdW5jdGlvbiBpcyBuZWVkZWQsIGNvbXBvc2l0ZSBpdCBhcm91bmQgdGhlIHRleHQgZWRpdG9yJ3MKLQkgKiBpbnN0YW5jZS4gUmVtb3ZlZCBhbHNvIGJlY2F1c2UgaXQgcmV0dXJucyBhbiBhbHJlYWQtcmVsZWFzZWQgbW9kZWwKLQkgKiAKLQkgKiBwdWJsaWMgRG9jdW1lbnQgZ2V0RE9NRG9jdW1lbnQoSU1hcmtlciBtYXJrZXIpIHsgaWYgKG1hcmtlciA9PSBudWxsKQotCSAqIHJldHVybiBudWxsOwotCSAqIAotCSAqIElSZXNvdXJjZSByZXMgPSBtYXJrZXIuZ2V0UmVzb3VyY2UoKTsgaWYgKHJlcyA9PSBudWxsIHx8ICEocmVzCi0JICogaW5zdGFuY2VvZiBJRmlsZSkpIHJldHVybiBudWxsOwotCSAqIAotCSAqIElNb2RlbE1hbmFnZXIgbW0gPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpOwotCSAqIElTdHJ1Y3R1cmVkTW9kZWwgbW9kZWwgPSBudWxsOyB0cnkgeyBtb2RlbCA9Ci0JICogbW0uZ2V0RXhpc3RpbmdNb2RlbEZvclJlYWQoKElGaWxlKSByZXMpOyBpZiAobW9kZWwgPT0gbnVsbCB8fCAhKG1vZGVsCi0JICogaW5zdGFuY2VvZiBJRE9NTW9kZWwpKSByZXR1cm4gbnVsbDsKLQkgKiAKLQkgKiByZXR1cm4gKChJRE9NTW9kZWwpIG1vZGVsKS5nZXREb2N1bWVudCgpOyB9IGZpbmFsbHkgeyBpZiAobW9kZWwgIT0KLQkgKiBudWxsKSBtb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsgfSB9Ci0JICovCi0KLQlwdWJsaWMgSUVkaXRvclBhcnQgZ2V0RWRpdG9yUGFydCgpIHsKLQkJcmV0dXJuIGZUZXh0RWRpdG9yLmdldEVkaXRvclBhcnQoKTsKLQl9Ci0KLQlwdWJsaWMgTm9kZSBnZXROb2RlKGludCBvZmZzZXQpIHRocm93cyBCYWRMb2NhdGlvbkV4Y2VwdGlvbiB7Ci0JCU5vZGUgbm9kZSA9IG51bGw7Ci0JCWlmICgwIDw9IG9mZnNldCAmJiBvZmZzZXQgPD0gZ2V0RG9jdW1lbnQoKS5nZXRMZW5ndGgoKSkgewotCQkJbm9kZSA9IChOb2RlKSBmVGV4dEVkaXRvci5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24ob2Zmc2V0KTsKLQkJfQotCQllbHNlIHsKLQkJCXRocm93IG5ldyBCYWRMb2NhdGlvbkV4Y2VwdGlvbigpOwotCQl9Ci0JCXJldHVybiBub2RlOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5leHRlbnNpb25zLlNvdXJjZUVkaXRpbmdUZXh0VG9vbHMjZ2V0Tm9kZUxvY2F0aW9uKG9yZy53M2MuZG9tLk5vZGUpCi0JICovCi0JcHVibGljIE5vZGVMb2NhdGlvbiBnZXROb2RlTG9jYXRpb24oTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYgbm9kZSBpbnN0YW5jZW9mIElET01Ob2RlKQotCQkJcmV0dXJuIG5ldyBOb2RlTG9jYXRpb25JbXBsKChJRE9NTm9kZSkgbm9kZSk7Ci0JCXJldHVybiBudWxsOwotCX0KLQotCXB1YmxpYyBTdHJpbmcgZ2V0UGFnZUxhbmd1YWdlKE5vZGUgbm9kZSkgewotCQlyZXR1cm4gIiI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwdWJsaWMgSVRleHRTZWxlY3Rpb24gZ2V0U2VsZWN0aW9uKCkgewotCQlyZXR1cm4gKElUZXh0U2VsZWN0aW9uKSBmVGV4dEVkaXRvci5nZXRTZWxlY3Rpb25Qcm92aWRlcigpLmdldFNlbGVjdGlvbigpOwotCX0KLQotCS8qKgotCSAqIElFeHRlbmRlZE1hcmt1cEVkaXRvciBtZXRob2QKLQkgKi8KLQkvLyBwdWJsaWMgTGlzdCBnZXRTZWxlY3RlZE5vZGVzKCkgewotCS8vIFZpZXdlclNlbGVjdGlvbk1hbmFnZXIgdnNtID0gZ2V0Vmlld2VyU2VsZWN0aW9uTWFuYWdlcigpOwotCS8vIHJldHVybiAodnNtICE9IG51bGwpID8gdnNtLmdldFNlbGVjdGVkTm9kZXMoKSA6IG51bGw7Ci0JLy8gfQotCXB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoTm9kZSBub2RlKSB7Ci0JCWlmIChub2RlID09IG51bGwgfHwgIShub2RlIGluc3RhbmNlb2YgSURPTVRleHQpKQotCQkJcmV0dXJuIC0xOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZm5vZGUgPSAoKElET01UZXh0KSBub2RlKS5nZXRGaXJzdFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotCQlyZXR1cm4gZm5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5jb3JlLklOb2RlQWRhcHRlciNpc0FkYXB0ZXJGb3JUeXBlKGphdmEubGFuZy5PYmplY3QpCi0JICovCi0JcHVibGljIGJvb2xlYW4gaXNBZGFwdGVyRm9yVHlwZShPYmplY3QgdHlwZSkgewotCQlyZXR1cm4gSVNvdXJjZUVkaXRpbmdUZXh0VG9vbHMuY2xhc3MuZXF1YWxzKHR5cGUpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvcmUuSU5vZGVBZGFwdGVyI25vdGlmeUNoYW5nZWQob3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmNvcmUuSU5vZGVOb3RpZmllciwKLQkgKiAgICAgIGludCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgamF2YS5sYW5nLk9iamVjdCwgaW50KQotCSAqLwotCXB1YmxpYyB2b2lkIG5vdGlmeUNoYW5nZWQoSU5vZGVOb3RpZmllciBub3RpZmllciwgaW50IGV2ZW50VHlwZSwgT2JqZWN0IGNoYW5nZWRGZWF0dXJlLCBPYmplY3Qgb2xkVmFsdWUsIE9iamVjdCBuZXdWYWx1ZSwgaW50IHBvcykgewotCX0KLQotCXB1YmxpYyB2b2lkIHNldFRleHRFZGl0b3IoU3RydWN0dXJlZFRleHRFZGl0b3IgZWRpdG9yKSB7Ci0JCWZUZXh0RWRpdG9yID0gZWRpdG9yOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvcmVnaXN0cnkvQWRhcHRlckZhY3RvcnlQcm92aWRlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWI5ZGYxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9yZWdpc3RyeS9BZGFwdGVyRmFjdG9yeVByb3ZpZGVyRm9yWE1MLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucmVnaXN0cnk7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLmx0ay5tb2RlbGhhbmRsZXIuSURvY3VtZW50VHlwZUhhbmRsZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLm1vZGVsLkZhY3RvcnlSZWdpc3RyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwudXRpbC5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5JSkZhY2VOb2RlQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnJlZ2lzdHJ5LkFkYXB0ZXJGYWN0b3J5UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbGhhbmRsZXIuTW9kZWxIYW5kbGVyRm9yWE1MOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuRE9NT2JzZXJ2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLkpGYWNlTm9kZUFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwucHJlZmVyZW5jZXMuWE1MVUlQcmVmZXJlbmNlTmFtZXM7Ci0KLS8qKgotICogIAotICovCi1wdWJsaWMgY2xhc3MgQWRhcHRlckZhY3RvcnlQcm92aWRlckZvclhNTCBpbXBsZW1lbnRzIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIgewotCi0JLyoKLQkgKiBAc2VlIEFkYXB0ZXJGYWN0b3J5UHJvdmlkZXIjYWRkQWRhcHRlckZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsKQotCSAqLwotCXB1YmxpYyB2b2lkIGFkZEFkYXB0ZXJGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQotCQkvLyBhZGQgdGhlIG5vcm1hbCBjb250ZW50IGJhc2VkIGZhY3RvcmllcyB0byBtb2RlbCdzIHJlZ2lzdHJ5Ci0JCWFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhzdHJ1Y3R1cmVkTW9kZWwpOwotCX0KLQotCXByb3RlY3RlZCB2b2lkIGFkZENvbnRlbnRCYXNlZEZhY3RvcmllcyhJU3RydWN0dXJlZE1vZGVsIHN0cnVjdHVyZWRNb2RlbCkgewotCQlGYWN0b3J5UmVnaXN0cnkgZmFjdG9yeVJlZ2lzdHJ5ID0gc3RydWN0dXJlZE1vZGVsLmdldEZhY3RvcnlSZWdpc3RyeSgpOwotCQlBc3NlcnQuaXNOb3ROdWxsKGZhY3RvcnlSZWdpc3RyeSwgIlByb2dyYW0gRXJyb3I6IGNsaWVudCBjYWxsZXIgbXVzdCBlbnN1cmUgbW9kZWwgaGFzIGZhY3RvcnkgcmVnaXN0cnkiKTsgLy8kTk9OLU5MUy0xJAotCQlJTm9kZUFkYXB0ZXJGYWN0b3J5IGZhY3RvcnkgPSBudWxsOwotCi0JCWZhY3RvcnkgPSBmYWN0b3J5UmVnaXN0cnkuZ2V0RmFjdG9yeUZvcihJSkZhY2VOb2RlQWRhcHRlci5jbGFzcyk7Ci0JCWlmIChmYWN0b3J5ID09IG51bGwpIHsKLQkJCWZhY3RvcnkgPSBuZXcgSkZhY2VOb2RlQWRhcHRlckZhY3RvcnkoKTsKLQkJCWZhY3RvcnlSZWdpc3RyeS5hZGRGYWN0b3J5KGZhY3RvcnkpOwotCQl9Ci0KLQkJLy8gY3MuLi4gYWRkZWQgZm9yIGluZmVycmVkIGdyYW1tYXIgc3VwcG9ydAotCQkvLwotCQlpZiAoc3RydWN0dXJlZE1vZGVsICE9IG51bGwpIHsKLQkJCU1vZGVsUXVlcnkgbW9kZWxRdWVyeSA9IE1vZGVsUXVlcnlVdGlsLmdldE1vZGVsUXVlcnkoc3RydWN0dXJlZE1vZGVsKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpIHsKLQkJCQlDTURvY3VtZW50TWFuYWdlciBkb2N1bWVudE1hbmFnZXIgPSBtb2RlbFF1ZXJ5LmdldENNRG9jdW1lbnRNYW5hZ2VyKCk7Ci0JCQkJaWYgKGRvY3VtZW50TWFuYWdlciAhPSBudWxsKSB7Ci0JCQkJCUlQcmVmZXJlbmNlU3RvcmUgc3RvcmUgPSBYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkuZ2V0UHJlZmVyZW5jZVN0b3JlKCk7Ci0JCQkJCWJvb2xlYW4gdXNlSW5mZXJyZWRHcmFtbWFyID0gKHN0b3JlICE9IG51bGwpID8gc3RvcmUuZ2V0Qm9vbGVhbihYTUxVSVByZWZlcmVuY2VOYW1lcy5VU0VfSU5GRVJSRURfR1JBTU1BUikgOiB0cnVlOwotCi0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVNZTkNfTE9BRCwgdHJ1ZSk7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FELCBmYWxzZSk7Ci0JCQkJCWRvY3VtZW50TWFuYWdlci5zZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfVVNFX0NBQ0hFRF9SRVNPTFZFRF9VUkksIHRydWUpOwotCQkJCQlET01PYnNlcnZlciBkb21PYnNlcnZlciA9IG5ldyBET01PYnNlcnZlcihzdHJ1Y3R1cmVkTW9kZWwpOwotCQkJCQlkb21PYnNlcnZlci5zZXRHcmFtbWFySW5mZXJlbmNlRW5hYmxlZCh1c2VJbmZlcnJlZEdyYW1tYXIpOwotCQkJCQlkb21PYnNlcnZlci5pbml0KCk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JLyogKG5vbi1KYXZhZG9jKQotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5wcm92aXNpb25hbC5yZWdpc3RyeS5BZGFwdGVyRmFjdG9yeVByb3ZpZGVyI2lzRm9yKG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5sdGsubW9kZWxoYW5kbGVyLklEb2N1bWVudFR5cGVIYW5kbGVyKQotCSAqLwotCXB1YmxpYyBib29sZWFuIGlzRm9yKElEb2N1bWVudFR5cGVIYW5kbGVyIGNvbnRlbnRUeXBlRGVzY3JpcHRpb24pIHsKLQkJcmV0dXJuIChjb250ZW50VHlwZURlc2NyaXB0aW9uIGluc3RhbmNlb2YgTW9kZWxIYW5kbGVyRm9yWE1MKTsKLQl9Ci0KLQlwdWJsaWMgdm9pZCByZWluaXRpYWxpemVGYWN0b3JpZXMoSVN0cnVjdHVyZWRNb2RlbCBzdHJ1Y3R1cmVkTW9kZWwpIHsKLQkJLy8gbm90aGluZyB0byBkbywgc2luY2Ugbm8gZW1iZWRkZWQgdHlwZQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODRmMmVjOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VhcmNoL1hNTEZpbmRPY2N1cnJlbmNlc0FjdGlvbkRlbGVnYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5zZWFyY2guRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGU7Ci0KLS8qKgotICogU2V0cyB1cCBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSBmb3IgeG1sIGZpbmQgb2NjdXJyZW5jZXMgcHJvY2Vzc29ycwotICovCi1wdWJsaWMgY2xhc3MgWE1MRmluZE9jY3VycmVuY2VzQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBGaW5kT2NjdXJyZW5jZXNBY3Rpb25EZWxlZ2F0ZSB7Ci0JcHJpdmF0ZSBMaXN0IGZQcm9jZXNzb3JzOwotCi0JcHJvdGVjdGVkIExpc3QgZ2V0UHJvY2Vzc29ycygpIHsKLQkJaWYgKGZQcm9jZXNzb3JzID09IG51bGwpIHsKLQkJCWZQcm9jZXNzb3JzID0gbmV3IEFycmF5TGlzdCgpOwotCQkJWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIGh0bWxQcm9jZXNzb3IgPSBuZXcgWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yKCk7Ci0JCQlmUHJvY2Vzc29ycy5hZGQoaHRtbFByb2Nlc3Nvcik7Ci0JCX0KLQkJcmV0dXJuIGZQcm9jZXNzb3JzOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VhcmNoL1hNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3Nvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTkwYzM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWFyY2gvWE1MRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWFyY2g7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlYXJjaC5GaW5kT2NjdXJyZW5jZXNQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnJlZ2lvbnMuRE9NUmVnaW9uQ29udGV4dDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGV4dC5JWE1MUGFydGl0aW9uczsKLQotLyoqCi0gKiBDb25maWd1cmVzIGEgRmluZE9jY3VycmVuY2VzUHJvY2Vzc29yIHdpdGggWE1MIHBhcnRpdGlvbnMgYW5kIHJlZ2lvbnMKLSAqLwotcHVibGljIGNsYXNzIFhNTEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciBleHRlbmRzIEZpbmRPY2N1cnJlbmNlc1Byb2Nlc3NvciB7Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0UGFydGl0aW9uVHlwZXMoKSB7Ci0JCXJldHVybiBuZXcgU3RyaW5nW117SVhNTFBhcnRpdGlvbnMuWE1MX0RFRkFVTFR9OwotCX0KLQotCXByb3RlY3RlZCBTdHJpbmdbXSBnZXRSZWdpb25UeXBlcygpIHsKLQkJcmV0dXJuIG5ldyBTdHJpbmdbXXtET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSwgRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FLCBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFfTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVmYWM2Yi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3RFbmNsb3NpbmdYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuc2VsZWN0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklBY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0RW5jbG9zaW5nWE1MQWN0aW9uRGVsZWdhdGUgZXh0ZW5kcyBTdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGUgewotCi0JcHJvdGVjdGVkIEluZGV4ZWRSZWdpb24gZ2V0Q3Vyc29ySW5kZXhlZFJlZ2lvbihJRG9jdW1lbnQgZG9jdW1lbnQsIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJSW5kZXhlZFJlZ2lvbiBpbmRleGVkUmVnaW9uID0gbnVsbDsKLQkJCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpKTsKLQotCQlyZXR1cm4gaW5kZXhlZFJlZ2lvbjsKLQl9Ci0KLQlwcm90ZWN0ZWQgUmVnaW9uIGdldE5ld1NlbGVjdGlvblJlZ2lvbihJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24sIElUZXh0U2VsZWN0aW9uIHRleHRTZWxlY3Rpb24pIHsKLQkJUmVnaW9uIG5ld1JlZ2lvbiA9IG51bGw7Ci0JCWlmIChpbmRleGVkUmVnaW9uIGluc3RhbmNlb2YgTm9kZSkgewotCQkJTm9kZSBjdXJzb3JOb2RlID0gKE5vZGUpIGluZGV4ZWRSZWdpb247Ci0KLQkJCS8vIHVzZSBwYXJlbnQgbm9kZSBmb3IgZW1wdHkgdGV4dCBub2RlCi0JCQlpZiAoY3Vyc29yTm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFICYmIGN1cnNvck5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID09IDApIHsKLQkJCQljdXJzb3JOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAoY3Vyc29yTm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pCi0JCQkJCWluZGV4ZWRSZWdpb24gPSAoSW5kZXhlZFJlZ2lvbikgY3Vyc29yTm9kZTsKLQkJCX0KLQotCQkJUmVnaW9uIGN1cnNvck5vZGVSZWdpb24gPSBuZXcgUmVnaW9uKGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgaW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIGluZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0KLQkJCWlmIChjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA8PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpKSB7Ci0JCQkJTm9kZSBuZXdOb2RlID0gY3Vyc29yTm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdEVuY2xvc2luZ19sYWJlbCk7Ci0JCQlhY3Rpb24uc2V0VG9vbFRpcFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3RFbmNsb3NpbmdfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViMzg1ZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc2VsZWN0aW9uL1N0cnVjdHVyZWRTZWxlY3ROZXh0WE1MQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zZWxlY3Rpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUFjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklEb2N1bWVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuVGV4dFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnNlbGVjdGlvbi5TdHJ1Y3R1cmVkU2VsZWN0QWN0aW9uRGVsZWdhdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLXB1YmxpYyBjbGFzcyBTdHJ1Y3R1cmVkU2VsZWN0TmV4dFhNTEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCWludCBvZmZzZXQgPSB0ZXh0U2VsZWN0aW9uLmdldE9mZnNldCgpICsgdGV4dFNlbGVjdGlvbi5nZXRMZW5ndGgoKSAtIDE7Ci0JCWlmIChvZmZzZXQgPCAwKQotCQkJb2Zmc2V0ID0gMDsKLQotCQlJbmRleGVkUmVnaW9uIGluZGV4ZWRSZWdpb24gPSBudWxsOwotCi0JCWluZGV4ZWRSZWdpb24gPSBnZXRJbmRleGVkUmVnaW9uKGRvY3VtZW50LCBvZmZzZXQpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmIChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCWludCBjdXJyZW50T2Zmc2V0ID0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKTsKLQkJCWludCBjdXJyZW50RW5kT2Zmc2V0ID0gY3VycmVudE9mZnNldCArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCk7Ci0JCQlpZiAoY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPD0gY3VycmVudEVuZE9mZnNldCAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpICsgY3Vyc29yTm9kZVJlZ2lvbi5nZXRMZW5ndGgoKSA+PSBjdXJyZW50T2Zmc2V0ICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpIDw9IGN1cnJlbnRFbmRPZmZzZXQpIHsKLQkJCQluZXdSZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24yKGluZGV4ZWRSZWdpb24sIHRleHRTZWxlY3Rpb24pOwotCQkJfQotCQkJZWxzZQotCQkJCW5ld1JlZ2lvbiA9IGN1cnNvck5vZGVSZWdpb247Ci0JCX0KLQkJcmV0dXJuIG5ld1JlZ2lvbjsKLQl9Ci0KLQlwdWJsaWMgdm9pZCBpbml0KElBY3Rpb24gYWN0aW9uKSB7Ci0JCWlmIChhY3Rpb24gIT0gbnVsbCkgewotCQkJYWN0aW9uLnNldFRleHQoWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdE5leHRfdG9vbHRpcCk7Ci0JCQlhY3Rpb24uc2V0RGVzY3JpcHRpb24oWE1MVUlNZXNzYWdlcy5TdHJ1Y3R1cmVTZWxlY3ROZXh0X2Rlc2NyaXB0aW9uKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIHdhcyBzZXBhcmF0ZWQgb3V0IGZyb20gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uMiBiZWNhdXNlIHRoZQotCSAqIGNvZGUgaW4gaGVyZSBpcyBhbGxvd2VkIHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseS4KLQkgKiAKLQkgKiBAcGFyYW0gaW5kZXhlZFJlZ2lvbgotCSAqIEBwYXJhbSB0ZXh0U2VsZWN0aW9uCi0JICogQHJldHVybiBuZXcgcmVnaW9uIHRvIHNlbGVjdCBvciBudWxsIGlmIG5vbmUKLQkgKi8KLQlwcml2YXRlIFJlZ2lvbiBnZXROZXdTZWxlY3Rpb25SZWdpb24yKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQkJCU5vZGUgbmV3Tm9kZSA9IG5vZGUuZ2V0TmV4dFNpYmxpbmcoKTsKLQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQluZXdOb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0KLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24obmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBuZXdJbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gbmV3SW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlpZiAobmV3Tm9kZSBpbnN0YW5jZW9mIEluZGV4ZWRSZWdpb24pIHsKLQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCW5ld1JlZ2lvbiA9IG5ldyBSZWdpb24odGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCQkJCWlmIChuZXdOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJCQluZXdSZWdpb24gPSBnZXROZXdTZWxlY3Rpb25SZWdpb24yKG5ld0luZGV4ZWRSZWdpb24sIG5ldyBUZXh0U2VsZWN0aW9uKG5ld1JlZ2lvbi5nZXRPZmZzZXQoKSwgbmV3UmVnaW9uLmdldExlbmd0aCgpKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBuZXdSZWdpb247Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3NlbGVjdGlvbi9TdHJ1Y3R1cmVkU2VsZWN0UHJldmlvdXNYTUxBY3Rpb25EZWxlZ2F0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmIyMDYyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zZWxlY3Rpb24vU3RydWN0dXJlZFNlbGVjdFByZXZpb3VzWE1MQWN0aW9uRGVsZWdhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnNlbGVjdGlvbjsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5SZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5UZXh0U2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuc2VsZWN0aW9uLlN0cnVjdHVyZWRTZWxlY3RBY3Rpb25EZWxlZ2F0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotcHVibGljIGNsYXNzIFN0cnVjdHVyZWRTZWxlY3RQcmV2aW91c1hNTEFjdGlvbkRlbGVnYXRlIGV4dGVuZHMgU3RydWN0dXJlZFNlbGVjdEFjdGlvbkRlbGVnYXRlIHsKLQotCXByb3RlY3RlZCBJbmRleGVkUmVnaW9uIGdldEN1cnNvckluZGV4ZWRSZWdpb24oSURvY3VtZW50IGRvY3VtZW50LCBJVGV4dFNlbGVjdGlvbiB0ZXh0U2VsZWN0aW9uKSB7Ci0JCUluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiA9IG51bGw7Ci0KLQkJaW5kZXhlZFJlZ2lvbiA9IGdldEluZGV4ZWRSZWdpb24oZG9jdW1lbnQsIHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkpOwotCi0JCXJldHVybiBpbmRleGVkUmVnaW9uOwotCX0KLQotCXByb3RlY3RlZCBSZWdpb24gZ2V0TmV3U2VsZWN0aW9uUmVnaW9uKEluZGV4ZWRSZWdpb24gaW5kZXhlZFJlZ2lvbiwgSVRleHRTZWxlY3Rpb24gdGV4dFNlbGVjdGlvbikgewotCQlSZWdpb24gbmV3UmVnaW9uID0gbnVsbDsKLQkJaWYgKGluZGV4ZWRSZWdpb24gaW5zdGFuY2VvZiBOb2RlKSB7Ci0JCQlOb2RlIGN1cnNvck5vZGUgPSAoTm9kZSkgaW5kZXhlZFJlZ2lvbjsKLQotCQkJLy8gdXNlIHBhcmVudCBub2RlIGZvciBlbXB0eSB0ZXh0IG5vZGUKLQkJCWlmIChjdXJzb3JOb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUgJiYgY3Vyc29yTm9kZS5nZXROb2RlVmFsdWUoKS50cmltKCkubGVuZ3RoKCkgPT0gMCkgewotCQkJCWN1cnNvck5vZGUgPSBjdXJzb3JOb2RlLmdldFBhcmVudE5vZGUoKTsKLQotCQkJCWlmIChjdXJzb3JOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikKLQkJCQkJaW5kZXhlZFJlZ2lvbiA9IChJbmRleGVkUmVnaW9uKSBjdXJzb3JOb2RlOwotCQkJfQotCi0JCQlSZWdpb24gY3Vyc29yTm9kZVJlZ2lvbiA9IG5ldyBSZWdpb24oaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpLCBpbmRleGVkUmVnaW9uLmdldEVuZE9mZnNldCgpIC0gaW5kZXhlZFJlZ2lvbi5nZXRTdGFydE9mZnNldCgpKTsKLQotCQkJaWYgKGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgPj0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSAmJiBjdXJzb3JOb2RlUmVnaW9uLmdldE9mZnNldCgpIDw9IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgKyB0ZXh0U2VsZWN0aW9uLmdldExlbmd0aCgpICYmIGN1cnNvck5vZGVSZWdpb24uZ2V0T2Zmc2V0KCkgKyBjdXJzb3JOb2RlUmVnaW9uLmdldExlbmd0aCgpID49IHRleHRTZWxlY3Rpb24uZ2V0T2Zmc2V0KCkgJiYgY3Vyc29yTm9kZVJlZ2lvbi5nZXRPZmZzZXQoKSArIGN1cnNvck5vZGVSZWdpb24uZ2V0TGVuZ3RoKCkgPD0gdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkpIHsKLQkJCQlOb2RlIG5ld05vZGUgPSBjdXJzb3JOb2RlLmdldFByZXZpb3VzU2libGluZygpOwotCQkJCWlmIChuZXdOb2RlID09IG51bGwpIHsKLQkJCQkJbmV3Tm9kZSA9IGN1cnNvck5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCi0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgbmV3SW5kZXhlZFJlZ2lvbi5nZXRFbmRPZmZzZXQoKSAtIG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSB7Ci0JCQkJCWlmIChuZXdOb2RlIGluc3RhbmNlb2YgSW5kZXhlZFJlZ2lvbikgewotCQkJCQkJSW5kZXhlZFJlZ2lvbiBuZXdJbmRleGVkUmVnaW9uID0gKEluZGV4ZWRSZWdpb24pIG5ld05vZGU7Ci0JCQkJCQluZXdSZWdpb24gPSBuZXcgUmVnaW9uKG5ld0luZGV4ZWRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKSwgdGV4dFNlbGVjdGlvbi5nZXRPZmZzZXQoKSArIHRleHRTZWxlY3Rpb24uZ2V0TGVuZ3RoKCkgLSBuZXdJbmRleGVkUmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCkpOwotCi0JCQkJCQlpZiAobmV3Tm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKQotCQkJCQkJCW5ld1JlZ2lvbiA9IGdldE5ld1NlbGVjdGlvblJlZ2lvbihuZXdJbmRleGVkUmVnaW9uLCBuZXcgVGV4dFNlbGVjdGlvbihuZXdSZWdpb24uZ2V0T2Zmc2V0KCksIG5ld1JlZ2lvbi5nZXRMZW5ndGgoKSkpOwotCQkJCQl9Ci0JCQkJfQotCi0JCQl9Ci0JCQllbHNlCi0JCQkJbmV3UmVnaW9uID0gY3Vyc29yTm9kZVJlZ2lvbjsKLQkJfQotCQlyZXR1cm4gbmV3UmVnaW9uOwotCX0KLQotCXB1YmxpYyB2b2lkIGluaXQoSUFjdGlvbiBhY3Rpb24pIHsKLQkJaWYgKGFjdGlvbiAhPSBudWxsKSB7Ci0JCQlhY3Rpb24uc2V0VGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX2xhYmVsKTsKLQkJCWFjdGlvbi5zZXRUb29sVGlwVGV4dChYTUxVSU1lc3NhZ2VzLlN0cnVjdHVyZVNlbGVjdFByZXZpb3VzX3Rvb2x0aXApOwotCQkJYWN0aW9uLnNldERlc2NyaXB0aW9uKFhNTFVJTWVzc2FnZXMuU3RydWN0dXJlU2VsZWN0UHJldmlvdXNfZGVzY3JpcHRpb24pOwotCQl9Ci0JfQotCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzWE1MLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvSVN0eWxlQ29uc3RhbnRzWE1MLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDA4NmYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3N0eWxlL0lTdHlsZUNvbnN0YW50c1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnN0eWxlOwotCi0vKioKLSAqIENvbnRhaW5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHN0eWxlcyB1c2VkIGJ5IExpbmVTdHlsZVByb3ZpZGVyLAotICogQ29sb3JNYW5hZ2VyLCBhbmQgYW55IG90aGVycyB3aG8gbWF5IGJlIGludGVyZXN0ZWQKLSAqLwotcHVibGljIGludGVyZmFjZSBJU3R5bGVDb25zdGFudHNYTUwgewotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tHUk9VTkQgPSAiYmFja2dyb3VuZCI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9CT1JERVIgPSAiY2RhdGFCb3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDREFUQV9URVhUID0gImNkYXRhVGV4dCI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1FTlRfQk9SREVSID0gImNvbW1lbnRCb3JkZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NRU5UX1RFWFQgPSAiY29tbWVudFRleHQiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUNMX0JPUkRFUiA9ICJkZWNsQm9kZXIiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBET0NUWVBFX0VYVEVSTkFMX0lEID0gImRvY3R5cGVFeHRlcm5hbElkIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYgPSAiZG9jdHlwZUV4dGVybmFsUHVicmVmIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYgPSAiZG9jdHlwZUV4dHJlbmFsU3lzcmVmIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRV9OQU1FID0gImRvY3R5cGVOYW1lIjsvLyROT04tTkxTLTEkCi0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JFR1JPVU5EID0gImZvcmVncm91bmQiOyAvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQk9SREVSID0gInBpQm9yZGVyIjsvLyROT04tTkxTLTEkCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUElfQ09OVEVOVCA9ICJwaUNvbnRlbnQiOy8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSSUJVVEVfRVFVQUxTID0gInRhZ0F0dHJpYnV0ZUVxdWFscyI7IC8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQVRUUklCVVRFX05BTUUgPSAidGFnQXR0cmlidXRlTmFtZSI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19BVFRSSUJVVEVfVkFMVUUgPSAidGFnQXR0cmlidXRlVmFsdWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQUdfQk9SREVSID0gInRhZ0JvcmRlciI7Ly8kTk9OLU5MUy0xJAotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBR19OQU1FID0gInRhZ05hbWUiOy8vJE5PTi1OTFMtMSQKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfQ09OVEVOVCA9ICJ4bWxDb250ZW50IjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvc3R5bGUvTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZhNjM1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC9zdHlsZS9MaW5lU3R5bGVQcm92aWRlckZvclhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5zdHlsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnByZWZlcmVuY2UuSVByZWZlcmVuY2VTdG9yZTsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlRleHRBdHRyaWJ1dGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5Qcm9wZXJ0eUNoYW5nZUV2ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklUZXh0UmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucHJvdmlzaW9uYWwuc3R5bGUuQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnByb3Zpc2lvbmFsLnN0eWxlLkxpbmVTdHlsZVByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5yZWdpb25zLkRPTVJlZ2lvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSVBsdWdpbjsKLQotcHVibGljIGNsYXNzIExpbmVTdHlsZVByb3ZpZGVyRm9yWE1MIGV4dGVuZHMgQWJzdHJhY3RMaW5lU3R5bGVQcm92aWRlciBpbXBsZW1lbnRzIExpbmVTdHlsZVByb3ZpZGVyIHsKLQlwdWJsaWMgTGluZVN0eWxlUHJvdmlkZXJGb3JYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JfQotCi0JcHJvdGVjdGVkIFRleHRBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlRm9yKElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvKioKLQkJICogYSBtZXRob2QgdG8gY2VudHJhbGl6ZSBhbGwgdGhlICJmb3JtYXQgcnVsZXMiIGZvciByZWdpb25zCi0JCSAqIHNwZWNpZmljYWxseSBhc3NvY2lhdGVkIGZvciBob3cgdG8gIm9wZW4iIHRoZSByZWdpb24uCi0JCSAqLwotCQkvLyBub3Qgc3VyZSB3aHkgdGhpcyBpcyBjb21pbmcgdGhyb3VnaCBudWxsLCBidXQganVzdCB0byBjYXRjaCBpdAotCQlpZiAocmVnaW9uID09IG51bGwpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkNEQVRBX1RFWFQpOwotCQl9Ci0JCVN0cmluZyB0eXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTlRFTlQpIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfSU5URVJOQUxfU1VCU0VUKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQl9IGVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTkRfVEFHX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSkgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0JPUkRFUik7Ci0JCX0gZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVCk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfTkFNRSk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0RFQ0xBUkFUSU9OKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfTkFNRSk7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQl9IGVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX0VRVUFMUyk7Ci0JCX0gZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9PUEVOKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT01NRU5UX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09NTUVOVF9URVhUKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9OQU1FKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX05BTUUpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVCkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVCk7Ci0JCX0gZWxzZSBpZiAoKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTikgfHwgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ0xPU0UpKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQl9IGVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX09QRU4pIHx8ICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RFQ0xBUkFUSU9OX0NMT1NFKSkgewotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQl9IGVsc2UgaWYgKHR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRE9DVFlQRV9FWFRFUk5BTF9JRF9TWVNSRUYpIHsKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfUFVCUkVGKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRik7Ci0JCX0gZWxzZSBpZiAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQkxJQyB8fCB0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0RPQ1RZUEVfRVhURVJOQUxfSURfU1lTVEVNKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuVU5ERUZJTkVEKSB7Ci0JCQlyZXR1cm4gKFRleHRBdHRyaWJ1dGUpIGdldFRleHRBdHRyaWJ1dGVzKCkuZ2V0KElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJfSBlbHNlIGlmICh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuV0hJVEVfU1BBQ0UpIHsKLQkJCS8vIHdoaXRlIHNwYWNlIGlzIG5vcm1hbGwgbm90IG9uIGl0cyBvd24gLi4uIGJ1dCB3aGVuIGl0IGlzLCB3ZSdsbAotCQkJLy8gdHJlYXQgYXMgY29udGVudAotCQkJcmV0dXJuIChUZXh0QXR0cmlidXRlKSBnZXRUZXh0QXR0cmlidXRlcygpLmdldChJU3R5bGVDb25zdGFudHNYTUwuWE1MX0NPTlRFTlQpOwotCQl9IGVsc2UgaWYgKCh0eXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0NIQVJfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTlRJVFlfUkVGRVJFTkNFKSB8fCAodHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9QRV9SRUZFUkVOQ0UpKSB7Ci0JCQkvLyB3ZSBtYXkgd2FudCB0byBjaGFyYWN0ZXIgYW5kIGVudGl0eSByZWZlcmVuY2VzIHRvIGhhdmUgaXQgb3duCi0JCQkvLyBjb2xvciBpbiBmdXR1cmUsCi0JCQkvLyBidXQgZm9yIG5vdywgd2UnbGwgbWFrZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCXJldHVybiAoVGV4dEF0dHJpYnV0ZSkgZ2V0VGV4dEF0dHJpYnV0ZXMoKS5nZXQoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfVkFMVUUpOwotCQl9IGVsc2UgewotCQkJLy8gZGVmYXVsdCwgcmV0dXJuIG51bGwgdG8gc2lnbmFsICJub3QgaGFuZGxlZCIKLQkJCS8vIGluIHdoaWNoIGNhc2UsIG90aGVyIGZhY3RvcmllcyBzaG91bGQgYmUgdHJpZWQKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0Q29sb3JQcmVmZXJlbmNlcygpIHsKLQkJcmV0dXJuIFhNTFVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQcmVmZXJlbmNlU3RvcmUoKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgdm9pZCBoYW5kbGVQcm9wZXJ0eUNoYW5nZShQcm9wZXJ0eUNoYW5nZUV2ZW50IGV2ZW50KSB7Ci0JCVN0cmluZyBzdHlsZUtleSA9IG51bGw7Ci0KLQkJaWYgKGV2ZW50ICE9IG51bGwpIHsKLQkJCVN0cmluZyBwcmVmS2V5ID0gZXZlbnQuZ2V0UHJvcGVydHkoKTsKLQkJCS8vIGNoZWNrIGlmIHByZWZlcmVuY2UgY2hhbmdlZCBpcyBhIHN0eWxlIHByZWZlcmVuY2UKLQkJCWlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUU7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19CT1JERVI7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX05BTUUuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRS5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQVRUUklCVVRFX1ZBTFVFOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFMuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9FUVVBTFM7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX0JPUkRFUjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkNPTU1FTlRfVEVYVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQ7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfQk9SREVSOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuQ0RBVEFfVEVYVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVI7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lELmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSUQ7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1BVQlJFRjsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfRVhURVJOQUxfSURfU1lTUkVGOwotCQkJfSBlbHNlIGlmIChJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9OQU1FLmVxdWFscyhwcmVmS2V5KSkgewotCQkJCXN0eWxlS2V5ID0gSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRTsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQuZXF1YWxzKHByZWZLZXkpKSB7Ci0JCQkJc3R5bGVLZXkgPSBJU3R5bGVDb25zdGFudHNYTUwuUElfQ09OVEVOVDsKLQkJCX0gZWxzZSBpZiAoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0JPUkRFUi5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVI7Ci0JCQl9IGVsc2UgaWYgKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVC5lcXVhbHMocHJlZktleSkpIHsKLQkJCQlzdHlsZUtleSA9IElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVDsKLQkJCX0KLQkJfQotCi0JCWlmIChzdHlsZUtleSAhPSBudWxsKSB7Ci0JCQkvLyBvdmVyd3JpdGUgc3R5bGUgcHJlZmVyZW5jZSB3aXRoIG5ldyB2YWx1ZQotCQkJYWRkVGV4dEF0dHJpYnV0ZShzdHlsZUtleSk7Ci0JCQlzdXBlci5oYW5kbGVQcm9wZXJ0eUNoYW5nZShldmVudCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBMb2FkcyB0ZXh0IGF0dHJpYnV0ZXMgaW50byBtYXAuIE1ha2Ugc3VyZSBtYXAgaXMgY2xlYXJlZCBiZWZvcmUgY2FsbGluZwotCSAqIHRoaXMuCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgbG9hZENvbG9ycygpIHsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX05BTUUpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5UQUdfQk9SREVSKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9OQU1FKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuVEFHX0FUVFJJQlVURV9WQUxVRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlRBR19BVFRSSUJVVEVfRVFVQUxTKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuQ09NTUVOVF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DT01NRU5UX1RFWFQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5DREFUQV9URVhUKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuREVDTF9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEKTsKLQkJYWRkVGV4dEF0dHJpYnV0ZShJU3R5bGVDb25zdGFudHNYTUwuRE9DVFlQRV9FWFRFUk5BTF9JRF9QVUJSRUYpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5ET0NUWVBFX0VYVEVSTkFMX0lEX1NZU1JFRik7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLkRPQ1RZUEVfTkFNRSk7Ci0JCWFkZFRleHRBdHRyaWJ1dGUoSVN0eWxlQ29uc3RhbnRzWE1MLlBJX0NPTlRFTlQpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5QSV9CT1JERVIpOwotCQlhZGRUZXh0QXR0cmlidXRlKElTdHlsZUNvbnN0YW50c1hNTC5YTUxfQ09OVEVOVCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vTWFya3VwVGFnSW5mb1Byb3ZpZGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9NYXJrdXBUYWdJbmZvUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI1NTNkOC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9NYXJrdXBUYWdJbmZvUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50YXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLQotLyoqCi0gKiBQcm92aWRlcyBiYXNpYyB0YWcgaW5mb3JtYXRpb24gc3VjaCBhcyBlbGVtZW50L2F0dHJpYnV0ZSBuYW1lLCBkYXRhIHR5cGUsCi0gKiBhbmQgdGFnIGluZm8vZG9jdW1lbnRhdGlvbiBmb3IgQ01Ob2Rlcy4gVXNlcyBIVE1MIHRvIGVuaGFuY2UgcHJlc2VudGF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTWFya3VwVGFnSW5mb1Byb3ZpZGVyIHsKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBCT0xEX0VORCA9ICI8L2I+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEJPTERfU1RBUlQgPSAiPGI+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEhFQURJTkdfRU5EID0gIjwvaDU+IjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBmaW5hbCBzdGF0aWMgU3RyaW5nIEhFQURJTkdfU1RBUlQgPSAiPGg1PiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBMSVNUX0JFR0lOID0gIjx1bD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTElTVF9FTEVNRU5UID0gIjxsaT4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgTkVXX0xJTkUgPSAiPGRsPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBQQVJBR1JBUEhfRU5EID0gIjwvcD4iOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIGZpbmFsIHN0YXRpYyBTdHJpbmcgUEFSQUdSQVBIX1NUQVJUID0gIjxwPiI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgZmluYWwgc3RhdGljIFN0cmluZyBTUEFDRSA9ICIgIjsgLy8kTk9OLU5MUy0xJAotCi0JLyoqCi0JICogUmV0dXJucyBiYXNpYyB0YWcgaW5mb3JtYXRpb24gZm9yIGRpc3BsYXkgZ2l2ZW4gYSBDTU5vZGUKLQkgKiAgCi0JICogQHJldHVybiBTdHJpbmcKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm8oQ01Ob2RlIG5vZGUpIHsKLQkJaWYgKG5vZGUgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0JCS8vIHdlIGFzc3VtZSB0aGF0IGlmIHRoZXJlIGlzIHRhZ0luZm8gcHJlc2VudCwgb25seSBkaXNwbGF5IHRhZ0luZm8KLQkJcHJpbnRUYWdJbmZvKHNiLCBub2RlKTsKLQotCQkvLyBubyB0YWdJbmZvIHByZXNlbnQsIHNvIHRyeSB0byBkaXNwbGF5IHRhZyBkZXNjcmlwdGlvbgotCQlpZiAoc2IubGVuZ3RoKCkgPT0gMCkgewotCQkJcHJpbnREZXNjcmlwdGlvbihzYiwgbm9kZSk7Ci0JCX0KLQotCQkvLyBubyB0YWcgZGVzY3JpcHRpb24gcHJlc2VudCBlaXRoZXIsIHNvIGRpc3BsYXkgZGVmYXVsdCBpbmZvCi0JCWlmIChzYi5sZW5ndGgoKSA9PSAwKSB7Ci0JCQlwcmludERlZmF1bHRJbmZvKG5vZGUsIHNiKTsKLQkJfQotCi0JCXJldHVybiBzYi50b1N0cmluZygpOwotCX0KLQotCS8qKgotCSAqIEFkZHMgZGF0YVR5cGUncyBkYXRhIHR5cGUgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBlbnVtZXJhdGVkIHR5cGUgdmFsdWVzCi0JICogdG8gc3RyaW5nIGJ1ZmZlciwgc2IKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERhdGFUeXBlSW5mbyhTdHJpbmdCdWZmZXIgc2IsIENNRGF0YVR5cGUgZGF0YVR5cGUpIHsKLQkJU3RyaW5nIGRhdGFUeXBlTmFtZSA9IGRhdGFUeXBlLmdldE5vZGVOYW1lKCk7Ci0JCWlmICgoZGF0YVR5cGVOYW1lICE9IG51bGwpICYmIChkYXRhVHlwZU5hbWUubGVuZ3RoKCkgPiAwKSkgewotCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkRhdGFfVHlwZV9fX180ICsgU1BBQ0UgKyBCT0xEX0VORCk7Ci0JCQlzYi5hcHBlbmQoZGF0YVR5cGVOYW1lKTsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJfQotCQlTdHJpbmdbXSBlbnVtZXJhdGVkVmFsdWUgPSBkYXRhVHlwZS5nZXRFbnVtZXJhdGVkVmFsdWVzKCk7Ci0JCWlmIChlbnVtZXJhdGVkVmFsdWUgIT0gbnVsbCAmJiBlbnVtZXJhdGVkVmFsdWUubGVuZ3RoID4gMCkgewotCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkVudW1lcmF0ZWRfVmFsdWVzX19fXzUgKyBTUEFDRSArIEJPTERfRU5EKTsKLQkJCXNiLmFwcGVuZChMSVNUX0JFR0lOKTsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgZW51bWVyYXRlZFZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0JCQkJc2IuYXBwZW5kKExJU1RfRUxFTUVOVCArIGVudW1lcmF0ZWRWYWx1ZVtpXSk7Ci0JCQl9Ci0JCQlzYi5hcHBlbmQoUEFSQUdSQVBIX0VORCk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSBkZWZhdWx0IGluZm8gKGVsZW1lbnQgbmFtZSwgY29udGVudCBtb2RlbCwgZGF0YSB0eXBlKSBvZgotCSAqIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwgc2IKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlZmF1bHRJbmZvKENNTm9kZSBub2RlLCBTdHJpbmdCdWZmZXIgc2IpIHsKLQkJewotCi0JCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IENNTm9kZS5FTEVNRU5UX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24pIG5vZGU7Ci0JCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkVsZW1lbnRfX19fMSArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJCXNiLmFwcGVuZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJCQlwcmludERvY3VtZW50YXRpb24oc2IsIG5vZGUpOwotCQkJCWlmIChlZC5nZXRDb250ZW50VHlwZSgpID09IENNRWxlbWVudERlY2xhcmF0aW9uLlBDREFUQSkgewotCQkJCQlDTURhdGFUeXBlIGRhdGFUeXBlID0gZWQuZ2V0RGF0YVR5cGUoKTsKLQkJCQkJaWYgKGRhdGFUeXBlICE9IG51bGwpIHsKLQkJCQkJCXByaW50RGF0YVR5cGVJbmZvKHNiLCBkYXRhVHlwZSk7Ci0JCQkJCX0KLQkJCQl9IGVsc2UgewotCQkJCQlDTURlc2NyaXB0aW9uQnVpbGRlciBidWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0JCQkJCVN0cmluZyBkZXNjcmlwdGlvbiA9IGJ1aWxkZXIuYnVpbGREZXNjcmlwdGlvbihub2RlKTsKLQkJCQkJaWYgKChkZXNjcmlwdGlvbiAhPSBudWxsKSAmJiAoZGVzY3JpcHRpb24ubGVuZ3RoKCkgPiAwKSkgewotCQkJCQkJc2IuYXBwZW5kKFBBUkFHUkFQSF9TVEFSVCArIEJPTERfU1RBUlQgKyBYTUxVSU1lc3NhZ2VzLkNvbnRlbnRfTW9kZWxfX19fMiArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJCQkJc2IuYXBwZW5kKGRlc2NyaXB0aW9uICsgUEFSQUdSQVBIX0VORCk7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9IGVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBDTU5vZGUuQVRUUklCVVRFX0RFQ0xBUkFUSU9OKSB7Ci0JCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhZCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBub2RlOwotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfX19fMyArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJCXNiLmFwcGVuZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJCQlwcmludERvY3VtZW50YXRpb24oc2IsIG5vZGUpOwotCQkJCUNNRGF0YVR5cGUgZGF0YVR5cGUgPSBhZC5nZXRBdHRyVHlwZSgpOwotCQkJCWlmIChkYXRhVHlwZSAhPSBudWxsKSB7Ci0JCQkJCXByaW50RGF0YVR5cGVJbmZvKHNiLCBkYXRhVHlwZSk7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gQ01Ob2RlLkRBVEFfVFlQRSkgewotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyBCT0xEX1NUQVJUICsgWE1MVUlNZXNzYWdlcy5EYXRhX1R5cGVfX19fNCArIFNQQUNFICsgQk9MRF9FTkQpOwotCQkJCXNiLmFwcGVuZChub2RlLmdldE5vZGVOYW1lKCkpOwotCQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfRU5EKTsKLQkJCQlwcmludERvY3VtZW50YXRpb24oc2IsIG5vZGUpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgZGVzY3JpcHRpb24gcHJvcGVydHkgb2YgdGhlIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwgc2IKLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgdm9pZCBwcmludERlc2NyaXB0aW9uKFN0cmluZ0J1ZmZlciBzYiwgQ01Ob2RlIG5vZGUpIHsKLQkJU3RyaW5nIHRhZ0luZm8gPSAoU3RyaW5nKSBub2RlLmdldFByb3BlcnR5KCJkZXNjcmlwdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YWdJbmZvICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyB0YWdJbmZvLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JfQotCi0JLyoqCi0JICogQWRkcyB0aGUgdGFnIGRvY3VtZW50YXRpb24gcHJvcGVydHkgb2YgdGhlIENNTm9kZSB0byB0aGUgc3RyaW5nIGJ1ZmZlciwKLQkgKiBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50RG9jdW1lbnRhdGlvbihTdHJpbmdCdWZmZXIgc2IsIENNTm9kZSBub2RlKSB7Ci0JCUNNTm9kZUxpc3Qgbm9kZUxpc3QgPSAoQ01Ob2RlTGlzdCkgbm9kZS5nZXRQcm9wZXJ0eSgiZG9jdW1lbnRhdGlvbiIpOyAvLyROT04tTkxTLTEkCi0JCWlmICgobm9kZUxpc3QgIT0gbnVsbCkgJiYgKG5vZGVMaXN0LmdldExlbmd0aCgpID4gMCkpIHsKLQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCUNNRG9jdW1lbnRhdGlvbiBkb2N1bWVudGF0aW9uID0gKENNRG9jdW1lbnRhdGlvbikgbm9kZUxpc3QuaXRlbShpKTsKLQkJCQlTdHJpbmcgZG9jID0gZG9jdW1lbnRhdGlvbi5nZXRWYWx1ZSgpOwotCQkJCWlmIChkb2MgIT0gbnVsbCkgewotCQkJCQlzYi5hcHBlbmQoUEFSQUdSQVBIX1NUQVJUICsgZG9jLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQkJCX0KLQkJCX0KLQkJCXNiLmFwcGVuZChORVdfTElORSk7Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBBZGRzIHRoZSB0YWcgaW5mbyBwcm9wZXJ0eSBvZiB0aGUgQ01Ob2RlIHRvIHRoZSBzdHJpbmcgYnVmZmVyLCBzYgotCSAqIAotCSAqLwotCXByb3RlY3RlZCB2b2lkIHByaW50VGFnSW5mbyhTdHJpbmdCdWZmZXIgc2IsIENNTm9kZSBub2RlKSB7Ci0JCVN0cmluZyB0YWdJbmZvID0gKFN0cmluZykgbm9kZS5nZXRQcm9wZXJ0eSgidGFnSW5mbyIpOyAvLyROT04tTkxTLTEkCi0JCWlmICh0YWdJbmZvICE9IG51bGwpIHsKLQkJCXNiLmFwcGVuZChQQVJBR1JBUEhfU1RBUlQgKyB0YWdJbmZvLnRyaW0oKSArIFBBUkFHUkFQSF9FTkQpOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MSW5mb3JtYXRpb25Qcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGZlZTIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90YWdpbmZvL1hNTEluZm9ybWF0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgSmVucyBMdWtvd3NraS9Jbm5vb3ByYWN0IC0gaW5pdGlhbCByZW5hbWluZy9yZXN0cnVjdHVyaW5nCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50YWdpbmZvOwotCi0KLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LmluZm9ybWF0aW9uLklJbmZvcm1hdGlvblByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXJFeHRlbnNpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5TU0VVSVBsdWdpbjsKLQotLyoqCi0gKiBQcm92aWRlcyBjb250ZXh0IGluZm9ybWF0aW9uIGZvciBYTUwgdGFncyAoU2hvd3MgdG9vbHRpcCBkZXNjcmlwdGlvbikKLSAqIAotICogQGF1dGhvciBhbXl3dQotICovCi1wdWJsaWMgY2xhc3MgWE1MSW5mb3JtYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIElJbmZvcm1hdGlvblByb3ZpZGVyLCBJSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiB7Ci0KLQlwcml2YXRlIElUZXh0SG92ZXIgZlRleHRIb3ZlciA9IG51bGw7Ci0KLQlwdWJsaWMgWE1MSW5mb3JtYXRpb25Qcm92aWRlcigpIHsKLQkJZlRleHRIb3ZlciA9IFNTRVVJUGx1Z2luLmdldERlZmF1bHQoKS5nZXRUZXh0SG92ZXJNYW5hZ2VyKCkuY3JlYXRlQmVzdE1hdGNoSG92ZXIobmV3IFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvcigpKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuaW5mb3JtYXRpb24uSUluZm9ybWF0aW9uUHJvdmlkZXIjZ2V0SW5mb3JtYXRpb24ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEluZm9ybWF0aW9uKElUZXh0Vmlld2VyIHRleHRWaWV3ZXIsIElSZWdpb24gc3ViamVjdCkgewotCQlyZXR1cm4gKFN0cmluZykgZ2V0SW5mb3JtYXRpb24yKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlckV4dGVuc2lvbiNnZXRJbmZvcm1hdGlvbjIob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgT2JqZWN0IGdldEluZm9ybWF0aW9uMihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBJUmVnaW9uIHN1YmplY3QpIHsKLQkJcmV0dXJuIGZUZXh0SG92ZXIuZ2V0SG92ZXJJbmZvKHRleHRWaWV3ZXIsIHN1YmplY3QpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5pbmZvcm1hdGlvbi5JSW5mb3JtYXRpb25Qcm92aWRlciNnZXRTdWJqZWN0KG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRWaWV3ZXIsCi0JICogICAgICBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0U3ViamVjdChJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0KSB7Ci0JCXJldHVybiBmVGV4dEhvdmVyLmdldEhvdmVyUmVnaW9uKHRleHRWaWV3ZXIsIG9mZnNldCk7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RhZ2luZm8vWE1MVGFnSW5mb0hvdmVyUHJvY2Vzc29yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgyNWRkOS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGFnaW5mby9YTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzNiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGFnaW5mbzsKLQotCi0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LlJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSW5kZXhlZFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JU3RydWN0dXJlZERvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVRleHRSZWdpb25MaXN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC51dGlsLkRlYnVnOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudGFzc2lzdC5Db250ZW50QXNzaXN0VXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC50YWdpbmZvLkFic3RyYWN0SG92ZXJQcm9jZXNzb3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVkTm9kZU1hcDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLm1vZGVscXVlcnkuTW9kZWxRdWVyeTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLnV0aWwuRE9NTmFtZXNwYWNlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnlVdGlsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotCi0vKioKLSAqIFByb3ZpZGVzIGhvdmVyIGhlbHAgZG9jdW1lbnRhdGlvbiBmb3IgeG1sIHRhZ3MKLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LklUZXh0SG92ZXIKLSAqLwotcHVibGljIGNsYXNzIFhNTFRhZ0luZm9Ib3ZlclByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0SG92ZXJQcm9jZXNzb3IgewotCXByb3RlY3RlZCBNYXJrdXBUYWdJbmZvUHJvdmlkZXIgZkluZm9Qcm92aWRlciA9IG51bGw7Ci0KLQkvKioKLQkgKiBDb25zdHJ1Y3RvciBmb3IgWE1MVGV4dEhvdmVyUHJvY2Vzc29yLgotCSAqLwotCXB1YmxpYyBYTUxUYWdJbmZvSG92ZXJQcm9jZXNzb3IoKSB7Ci0JCS8vIG5vdGhpbmcKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgZG9jdW1lbnRhdGlvbiB0byBkaXNwbGF5IGluIHRoZSBob3ZlciBoZWxwIHBvcHVwLgotCSAqIAotCSAqIEByZXR1cm4gU3RyaW5nIGFueSBkb2N1bWVudGF0aW9uIGluZm9ybWF0aW9uIHRvIGRpc3BsYXkKLQkgKiAgICAgICAgIDxjb2RlPm51bGw8L2NvZGU+IGlmIHRoZXJlIGlzIG5vdGhpbmcgdG8gZGlzcGxheS4KLQkgKiAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVIb3ZlckhlbHAoSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IGRvY3VtZW50UG9zaXRpb24pIHsKLQkJU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0KLQkJSW5kZXhlZFJlZ2lvbiB0cmVlTm9kZSA9IENvbnRlbnRBc3Npc3RVdGlscy5nZXROb2RlQXQodGV4dFZpZXdlciwgZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmICh0cmVlTm9kZSA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCU5vZGUgbm9kZSA9IChOb2RlKSB0cmVlTm9kZTsKLQotCQl3aGlsZSAobm9kZSAhPSBudWxsICYmIG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSAmJiBub2RlLmdldFBhcmVudE5vZGUoKSAhPSBudWxsKQotCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQlJRE9NTm9kZSBwYXJlbnROb2RlID0gKElET01Ob2RlKSBub2RlOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQoZG9jdW1lbnRQb3NpdGlvbik7Ci0JCWlmIChmbGF0Tm9kZSAhPSBudWxsKSB7Ci0JCQlJVGV4dFJlZ2lvbiByZWdpb24gPSBmbGF0Tm9kZS5nZXRSZWdpb25BdENoYXJhY3Rlck9mZnNldChkb2N1bWVudFBvc2l0aW9uKTsKLQkJCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJCXJlc3VsdCA9IGNvbXB1dGVSZWdpb25IZWxwKHRyZWVOb2RlLCBwYXJlbnROb2RlLCBmbGF0Tm9kZSwgcmVnaW9uKTsKLQkJCX0KLQkJfQotCi0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JLyoqCi0JICogQ29tcHV0ZXMgdGhlIGhvdmVyaGVscCBiYXNlZCBvbiByZWdpb24KLQkgKiAKLQkgKiBAcmV0dXJuIFN0cmluZyBob3ZlcmhlbHAKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVSZWdpb25IZWxwKEluZGV4ZWRSZWdpb24gdHJlZU5vZGUsIElET01Ob2RlIHBhcmVudE5vZGUsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQlTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLQkJaWYgKHJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuIG51bGw7Ci0JCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpCi0JCQlyZXN1bHQgPSBjb21wdXRlVGFnTmFtZUhlbHAoKElET01Ob2RlKSB0cmVlTm9kZSwgcGFyZW50Tm9kZSwgZmxhdE5vZGUsIHJlZ2lvbik7Ci0JCWVsc2UgaWYgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKQotCQkJcmVzdWx0ID0gY29tcHV0ZVRhZ0F0dE5hbWVIZWxwKChJRE9NTm9kZSkgdHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQllbHNlIGlmIChyZWdpb25UeXBlID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfVkFMVUUpCi0JCQlyZXN1bHQgPSBjb21wdXRlVGFnQXR0VmFsdWVIZWxwKChJRE9NTm9kZSkgdHJlZU5vZGUsIHBhcmVudE5vZGUsIGZsYXROb2RlLCByZWdpb24pOwotCQlyZXR1cm4gcmVzdWx0OwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgYXR0cmlidXRlIG5hbWUKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdBdHROYW1lSGVscChJRE9NTm9kZSB4bWxub2RlLCBJRE9NTm9kZSBwYXJlbnROb2RlLCBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGZsYXROb2RlLCBJVGV4dFJlZ2lvbiByZWdpb24pIHsKLQkJQ01FbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudERlY2wgPSBnZXRDTUVsZW1lbnREZWNsYXJhdGlvbih4bWxub2RlKTsKLQkJU3RyaW5nIGF0dE5hbWUgPSBmbGF0Tm9kZS5nZXRUZXh0KHJlZ2lvbik7Ci0JCUNNQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0RGVjbCA9IGdldENNQXR0cmlidXRlRGVjbGFyYXRpb24oZWxlbWVudERlY2wsIGF0dE5hbWUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8oZWxlbWVudERlY2wsIGF0dERlY2wpOwotCX0KLQotCS8qKgotCSAqIENvbXB1dGVzIHRoZSBob3ZlciBoZWxwIGZvciB0aGUgYXR0cmlidXRlIHZhbHVlICh0aGlzIGlzIHRoZSBzYW1lIGFzCi0JICogdGhlIGF0dHJpYnV0ZSBuYW1lJ3MgaGVscCkKLQkgKi8KLQlwcm90ZWN0ZWQgU3RyaW5nIGNvbXB1dGVUYWdBdHRWYWx1ZUhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sbm9kZSk7Ci0JCUlUZXh0UmVnaW9uIGF0dHJOYW1lUmVnaW9uID0gZ2V0QXR0ck5hbWVSZWdpb24oeG1sbm9kZSwgcmVnaW9uKTsKLQotCQlTdHJpbmcgYXR0TmFtZSA9IGZsYXROb2RlLmdldFRleHQoYXR0ck5hbWVSZWdpb24pOwotCQlDTUF0dHJpYnV0ZURlY2xhcmF0aW9uIGF0dERlY2wgPSBnZXRDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKGVsZW1lbnREZWNsLCBhdHROYW1lKTsKLQkJcmV0dXJuIGdldEFkZGl0aW9uYWxJbmZvKGVsZW1lbnREZWNsLCBhdHREZWNsKTsKLQl9Ci0KLQkvKioKLQkgKiBDb21wdXRlcyB0aGUgaG92ZXIgaGVscCBmb3IgdGhlIHRhZyBuYW1lCi0JICovCi0JcHJvdGVjdGVkIFN0cmluZyBjb21wdXRlVGFnTmFtZUhlbHAoSURPTU5vZGUgeG1sbm9kZSwgSURPTU5vZGUgcGFyZW50Tm9kZSwgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBmbGF0Tm9kZSwgSVRleHRSZWdpb24gcmVnaW9uKSB7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gZ2V0Q01FbGVtZW50RGVjbGFyYXRpb24oeG1sbm9kZSk7Ci0JCUNNRWxlbWVudERlY2xhcmF0aW9uIHBlbGVtZW50RGVjbCA9IGdldENNRWxlbWVudERlY2xhcmF0aW9uKHBhcmVudE5vZGUpOwotCQlyZXR1cm4gZ2V0QWRkaXRpb25hbEluZm8ocGVsZW1lbnREZWNsLCBlbGVtZW50RGVjbCk7Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIGNtbm9kZSdzIGRvY3VtZW50YXRpb24gdG8gZGlzcGxheSBpbiB0aGUgaG92ZXIgaGVscCBwb3B1cC4gSWYKLQkgKiBubyBkb2N1bWVudGF0aW9uIGV4aXN0cyBmb3IgY21ub2RlLCB0cnkgZGlzcGxheWluZyBwYXJlbnRPck93bmVyJ3MKLQkgKiBkb2N1bWVudGF0aW9uCi0JICogCi0JICogQHJldHVybiBTdHJpbmcgYW55IGRvY3VtZW50YXRpb24gaW5mb3JtYXRpb24gdG8gZGlzcGxheSBmb3IgY21ub2RlLgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBkaXNwbGF5LgotCSAqLwotCXByb3RlY3RlZCBTdHJpbmcgZ2V0QWRkaXRpb25hbEluZm8oQ01Ob2RlIHBhcmVudE9yT3duZXIsIENNTm9kZSBjbW5vZGUpIHsKLQkJU3RyaW5nIGFkZGxJbmZvID0gbnVsbDsKLQotCQlpZiAoY21ub2RlID09IG51bGwpIHsKLQkJCWlmIChEZWJ1Zy5kaXNwbGF5V2FybmluZ3MpIHsKLQkJCQluZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOdWxsIGRlY2xhcmF0aW9uISIpLnByaW50U3RhY2tUcmFjZSgpOyAvLyROT04tTkxTLTEkCi0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCWFkZGxJbmZvID0gZ2V0SW5mb1Byb3ZpZGVyKCkuZ2V0SW5mbyhjbW5vZGUpOwotCQlpZiAoYWRkbEluZm8gPT0gbnVsbCAmJiBwYXJlbnRPck93bmVyICE9IG51bGwpCi0JCQlhZGRsSW5mbyA9IGdldEluZm9Qcm92aWRlcigpLmdldEluZm8ocGFyZW50T3JPd25lcik7Ci0JCXJldHVybiBhZGRsSW5mbzsKLQl9Ci0KLQkvKioKLQkgKiBGaW5kIHRoZSByZWdpb24gb2YgdGhlIGF0dHJpYnV0ZSBuYW1lIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIHZhbHVlCi0JICogcmVnaW9uCi0JICogCi0JICovCi0JcHJvdGVjdGVkIElUZXh0UmVnaW9uIGdldEF0dHJOYW1lUmVnaW9uKElET01Ob2RlIG5vZGUsIElUZXh0UmVnaW9uIHJlZ2lvbikgewotCQkvLyBGaW5kIHRoZSBhdHRyaWJ1dGUgbmFtZSBmb3Igd2hpY2ggdGhpcyBwb3NpdGlvbiBzaG91bGQgaGF2ZSBhIHZhbHVlCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gb3BlbiA9IG5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKTsKLQkJSVRleHRSZWdpb25MaXN0IG9wZW5SZWdpb25zID0gb3Blbi5nZXRSZWdpb25zKCk7Ci0JCWludCBpID0gb3BlblJlZ2lvbnMuaW5kZXhPZihyZWdpb24pOwotCQlpZiAoaSA8IDApCi0JCQlyZXR1cm4gbnVsbDsKLQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IG51bGw7Ci0JCXdoaWxlIChpID49IDApIHsKLQkJCW5hbWVSZWdpb24gPSBvcGVuUmVnaW9ucy5nZXQoaS0tKTsKLQkJCWlmIChuYW1lUmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUpCi0JCQkJYnJlYWs7Ci0JCX0KLQkJcmV0dXJuIG5hbWVSZWdpb247Ci0JfQotCi0JLyoqCi0JICogUmV0cmVpdmVzIENNQXR0cmlidXRlRGVjbGFyYXRpb24gaW5kaWNhdGVkIGJ5IGF0dHJpYnV0ZSBuYW1lIHdpdGhpbgotCSAqIGVsZW1lbnREZWNsCi0JICovCi0JcHJvdGVjdGVkIENNQXR0cmlidXRlRGVjbGFyYXRpb24gZ2V0Q01BdHRyaWJ1dGVEZWNsYXJhdGlvbihDTUVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50RGVjbCwgU3RyaW5nIGF0dE5hbWUpIHsKLQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IG51bGw7Ci0KLQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCUNNTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQlTdHJpbmcgbm9wcmVmaXhOYW1lID0gRE9NTmFtZXNwYWNlSGVscGVyLmdldFVucHJlZml4ZWROYW1lKGF0dE5hbWUpOwotCQkJaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgewotCQkJCWF0dHJEZWNsID0gKENNQXR0cmlidXRlRGVjbGFyYXRpb24pIGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKG5vcHJlZml4TmFtZSk7Ci0JCQkJaWYgKGF0dHJEZWNsID09IG51bGwpIHsKLQkJCQkJYXR0ckRlY2wgPSAoQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbikgYXR0cmlidXRlcy5nZXROYW1lZEl0ZW0oYXR0TmFtZSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JCXJldHVybiBhdHRyRGVjbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXRyZWl2ZXMgQ01FbGVtZW50RGVjbGFyYXRpb24gZm9yIGdpdmVuIG5vZGUKLQkgKiAKLQkgKiBAcmV0dXJuIENNRWxlbWVudERlY2xhcmF0aW9uIC0gQ01FbGVtZW50RGVjbGFyYXRpb24gb2Ygbm9kZSBvcgotCSAqICAgICAgICAgPGNvZGU+bnVsbDwvY29kZT4gaWYgbm90IHBvc3NpYmxlCi0JICovCi0JcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldENNRWxlbWVudERlY2xhcmF0aW9uKE5vZGUgbm9kZSkgewotCQlDTUVsZW1lbnREZWNsYXJhdGlvbiByZXN1bHQgPSBudWxsOwotCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQlNb2RlbFF1ZXJ5IG1vZGVsUXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KG5vZGUuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCWlmIChtb2RlbFF1ZXJ5ICE9IG51bGwpCi0JCQkJcmVzdWx0ID0gbW9kZWxRdWVyeS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbigoRWxlbWVudCkgbm9kZSk7Ci0JCX0KLQkJcmV0dXJuIHJlc3VsdDsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVRleHRIb3ZlciNnZXRIb3ZlckluZm8ob3JnLmVjbGlwc2UuamZhY2UudGV4dC5JVGV4dFZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbikKLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldEhvdmVySW5mbyhJVGV4dFZpZXdlciB2aWV3ZXIsIElSZWdpb24gaG92ZXJSZWdpb24pIHsKLQkJaWYgKChob3ZlclJlZ2lvbiA9PSBudWxsKSB8fCAodmlld2VyID09IG51bGwpIHx8ICh2aWV3ZXIuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKSkKLQkJCXJldHVybiBudWxsOwotCi0JCVN0cmluZyBkaXNwbGF5VGV4dCA9IG51bGw7Ci0JCWludCBkb2N1bWVudE9mZnNldCA9IGhvdmVyUmVnaW9uLmdldE9mZnNldCgpOwotCQlkaXNwbGF5VGV4dCA9IGNvbXB1dGVIb3ZlckhlbHAodmlld2VyLCBkb2N1bWVudE9mZnNldCk7Ci0KLQkJcmV0dXJuIGRpc3BsYXlUZXh0OwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHJlZ2lvbiB0byBob3ZlciB0aGUgdGV4dCBvdmVyIGJhc2VkIG9uIHRoZSBvZmZzZXQuCi0JICogCi0JICogQHBhcmFtIHRleHRWaWV3ZXIKLQkgKiBAcGFyYW0gb2Zmc2V0Ci0JICogCi0JICogQHJldHVybiBJUmVnaW9uIHJlZ2lvbiB0byBob3ZlciBvdmVyIGlmIG9mZnNldCBpcyB3aXRoaW4gdGFnIG5hbWUsCi0JICogICAgICAgICBhdHRyaWJ1dGUgbmFtZSwgb3IgYXR0cmlidXRlIHZhbHVlIGFuZCBpZiBvZmZzZXQgaXMgbm90IG92ZXIKLQkgKiAgICAgICAgIGludmFsaWQgd2hpdGVzcGFjZS4gb3RoZXJ3aXNlLCByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+Ci0JICogCi0JICogQHNlZSBJVGV4dEhvdmVyI2dldEhvdmVyUmVnaW9uKElUZXh0Vmlld2VyLCBpbnQpCi0JICovCi0JcHVibGljIElSZWdpb24gZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIgdGV4dFZpZXdlciwgaW50IG9mZnNldCkgewotCQlpZiAoKHRleHRWaWV3ZXIgPT0gbnVsbCkgfHwgKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJfQotCi0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gb25seSBzdXBwbHkgaG92ZXJoZWxwIGZvciB0YWcgbmFtZSwgYXR0cmlidXRlIG5hbWUsIG9yCi0JCQkvLyBhdHRyaWJ1dGUgdmFsdWUKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBhdCB3aGl0ZXNwYWNlIGJlZm9yZSBvciBhZnRlciBsaW5lCi0JCQkJCUlSZWdpb24gbGluZSA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCQkJCQlpZiAoKG9mZnNldCA+IChsaW5lLmdldE9mZnNldCgpKSkgJiYgKG9mZnNldCA8IChsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSkpKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW4gcmVnaW9uJ3MgdHJhaWxpbmcgd2hpdGVzcGFjZQotCQkJCQkJLy8gKHdoaXRlc3BhY2UgYWZ0ZXIgcmVsZXZhbnQgaW5mbykKLQkJCQkJCWlmIChvZmZzZXQgPCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBAZGVwcmVjYXRlZCBpZiBlbmFibGVkIGZsYWcgaXMgZmFsc2UsIGRvbnQgY2FsbCBnZXRIb3ZlclJlZ2lvbiBpbiB0aGUKLQkgKiAgICAgICAgICAgICBmaXJzdCBwbGFjZSBpZiB0cnVlLCB1c2UgZ2V0SG92ZXJSZWdpb24oSVRleHRWaWV3ZXIsIGludCkKLQkgKi8KLQlwdWJsaWMgSVJlZ2lvbiBnZXRIb3ZlclJlZ2lvbihJVGV4dFZpZXdlciB0ZXh0Vmlld2VyLCBpbnQgb2Zmc2V0LCBib29sZWFuIGVuYWJsZWQpIHsKLQkJaWYgKCghZW5hYmxlZCkgfHwgKHRleHRWaWV3ZXIgPT0gbnVsbCkgfHwgKHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSA9PSBudWxsKSkKLQkJCXJldHVybiBudWxsOwotCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gZmxhdE5vZGUgPSAoKElTdHJ1Y3R1cmVkRG9jdW1lbnQpIHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKSkuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJSVRleHRSZWdpb24gcmVnaW9uID0gbnVsbDsKLQotCQlpZiAoZmxhdE5vZGUgIT0gbnVsbCkgewotCQkJcmVnaW9uID0gZmxhdE5vZGUuZ2V0UmVnaW9uQXRDaGFyYWN0ZXJPZmZzZXQob2Zmc2V0KTsKLQkJfQotCi0JCWlmIChyZWdpb24gIT0gbnVsbCkgewotCQkJLy8gb25seSBzdXBwbHkgaG92ZXJoZWxwIGZvciB0YWcgbmFtZSwgYXR0cmlidXRlIG5hbWUsIG9yCi0JCQkvLyBhdHRyaWJ1dGUgdmFsdWUKLQkJCVN0cmluZyByZWdpb25UeXBlID0gcmVnaW9uLmdldFR5cGUoKTsKLQkJCWlmICgocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgfHwgKHJlZ2lvblR5cGUgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9OQU1FKSB8fCAocmVnaW9uVHlwZSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKSkgewotCQkJCXRyeSB7Ci0JCQkJCS8vIGNoZWNrIGlmIHdlIGFyZSBhdCB3aGl0ZXNwYWNlIGJlZm9yZSBvciBhZnRlciBsaW5lCi0JCQkJCUlSZWdpb24gbGluZSA9IHRleHRWaWV3ZXIuZ2V0RG9jdW1lbnQoKS5nZXRMaW5lSW5mb3JtYXRpb25PZk9mZnNldChvZmZzZXQpOwotCQkJCQlpZiAoKG9mZnNldCA+IChsaW5lLmdldE9mZnNldCgpKSkgJiYgKG9mZnNldCA8IChsaW5lLmdldE9mZnNldCgpICsgbGluZS5nZXRMZW5ndGgoKSkpKSB7Ci0JCQkJCQkvLyBjaGVjayBpZiB3ZSBhcmUgaW4gcmVnaW9uJ3MgdHJhaWxpbmcgd2hpdGVzcGFjZQotCQkJCQkJLy8gKHdoaXRlc3BhY2UgYWZ0ZXIgcmVsZXZhbnQgaW5mbykKLQkJCQkJCWlmIChvZmZzZXQgPCBmbGF0Tm9kZS5nZXRUZXh0RW5kT2Zmc2V0KHJlZ2lvbikpIHsKLQkJCQkJCQlyZXR1cm4gbmV3IFJlZ2lvbihmbGF0Tm9kZS5nZXRTdGFydE9mZnNldChyZWdpb24pLCByZWdpb24uZ2V0VGV4dExlbmd0aCgpKTsKLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCQljYXRjaCAoQmFkTG9jYXRpb25FeGNlcHRpb24gZSkgewotCQkJCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQkJCX0KLQkJCX0KLQkJfQotCQlyZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBHZXRzIHRoZSBpbmZvUHJvdmlkZXIuCi0JICogCi0JICogQHJldHVybiBSZXR1cm5zIGZJbmZvUHJvdmlkZXIgYW5kIGlmIGZJbmZvUHJvdmlkZXIgd2FzCi0JICogICAgICAgICA8Y29kZT5udWxsPC9jb2RlPiBzZXQgZkluZm9Qcm92aWRlciB0byBEZWZhdWx0SW5mb1Byb3ZpZGVyCi0JICovCi0JcHVibGljIE1hcmt1cFRhZ0luZm9Qcm92aWRlciBnZXRJbmZvUHJvdmlkZXIoKSB7Ci0JCWlmIChmSW5mb1Byb3ZpZGVyID09IG51bGwpIHsKLQkJCWZJbmZvUHJvdmlkZXIgPSBuZXcgTWFya3VwVGFnSW5mb1Byb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZJbmZvUHJvdmlkZXI7Ci0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RlbXBsYXRlcy9FbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzliMDQyLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvRW5jb2RpbmdUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXJYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAgICAgCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC50ZW1wbGF0ZXM7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LnRlbXBsYXRlcy5TaW1wbGVUZW1wbGF0ZVZhcmlhYmxlUmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudGV4dC50ZW1wbGF0ZXMuVGVtcGxhdGVDb250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5lbmNvZGluZy5Db21tb25FbmNvZGluZ1ByZWZlcmVuY2VOYW1lczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuWE1MQ29yZVBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJTWVzc2FnZXM7Ci0KLQotcHVibGljIGNsYXNzIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MIGV4dGVuZHMgU2ltcGxlVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyIHsKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkdfVFlQRSA9IGdldEVuY29kaW5nVHlwZSgpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEVuY29kaW5nVHlwZSgpIHsKLQkJcmV0dXJuICJlbmNvZGluZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQkvKioKLQkgKiBDcmVhdGVzIGEgbmV3IGVuY29kaW5nIHZhcmlhYmxlCi0JICovCi0JcHVibGljIEVuY29kaW5nVGVtcGxhdGVWYXJpYWJsZVJlc29sdmVyWE1MKCkgewotCQlzdXBlcihFTkNPRElOR19UWVBFLCBYTUxVSU1lc3NhZ2VzLkNyZWF0aW5nX2ZpbGVzX2VuY29kaW5nKTsKLQl9Ci0KLQlwcm90ZWN0ZWQgU3RyaW5nIHJlc29sdmUoVGVtcGxhdGVDb250ZXh0IGNvbnRleHQpIHsKLQkJcmV0dXJuIFhNTENvcmVQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFBsdWdpblByZWZlcmVuY2VzKCkuZ2V0U3RyaW5nKENvbW1vbkVuY29kaW5nUHJlZmVyZW5jZU5hbWVzLk9VVFBVVF9DT0RFU0VUKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwN2IyZjc4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZUlkc1hNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotcHVibGljIGNsYXNzIFRlbXBsYXRlQ29udGV4dFR5cGVJZHNYTUwgewotCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMID0gZ2V0QWxsKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVFRSSUJVVEUgPSBnZXRBdHRyaWJ1dGUoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFUVFJJQlVURV9WQUxVRSA9IGdldEF0dHJpYnV0ZVZhbHVlKCk7Ci0KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBORVcgPSBnZXROZXcoKTsKLQotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9IGdldFRhZygpOwotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEFsbCgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hbGwiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZSgpIHsKLQkJcmV0dXJuIGdldFByZWZpeCgpICsgIl9hdHRyaWJ1dGUiOyAvLyROT04tTkxTLTEkCi0JfQotCi0JcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldEF0dHJpYnV0ZVZhbHVlKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX2F0dHJpYnV0ZV92YWx1ZSI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TmV3KCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX25ldyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KCkgewotCQlyZXR1cm4gInhtbCI7IC8vJE5PTi1OTFMtMSQKLQl9Ci0KLQlwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VGFnKCkgewotCQlyZXR1cm4gZ2V0UHJlZml4KCkgKyAiX3RhZyI7IC8vJE5PTi1OTFMtMSQKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGVtcGxhdGVzL1RlbXBsYXRlQ29udGV4dFR5cGVYTUwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2NjZjIwLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC90ZW1wbGF0ZXMvVGVtcGxhdGVDb250ZXh0VHlwZVhNTC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlczsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLkdsb2JhbFRlbXBsYXRlVmFyaWFibGVzOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQudGVtcGxhdGVzLlRlbXBsYXRlQ29udGV4dFR5cGU7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgWE1MIHRlbXBsYXRlIGNvbnRleHQgdHlwZXMuIFRlbXBsYXRlcyBvZiB0aGlzIGNvbnRleHQgdHlwZQotICogYXBwbHkgdG8gYW55IHBsYWNlIHdpdGhpbiBYTUwgY29udGVudCB0eXBlLgotICovCi1wdWJsaWMgY2xhc3MgVGVtcGxhdGVDb250ZXh0VHlwZVhNTCBleHRlbmRzIFRlbXBsYXRlQ29udGV4dFR5cGUgewotCi0JcHVibGljIFRlbXBsYXRlQ29udGV4dFR5cGVYTUwoKSB7Ci0JCXN1cGVyKCk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5DdXJzb3IoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5EYXRlKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuRG9sbGFyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuTGluZVNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlRpbWUoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBHbG9iYWxUZW1wbGF0ZVZhcmlhYmxlcy5Vc2VyKCkpOwotCQlhZGRSZXNvbHZlcihuZXcgR2xvYmFsVGVtcGxhdGVWYXJpYWJsZXMuV29yZFNlbGVjdGlvbigpKTsKLQkJYWRkUmVzb2x2ZXIobmV3IEdsb2JhbFRlbXBsYXRlVmFyaWFibGVzLlllYXIoKSk7Ci0JCWFkZFJlc29sdmVyKG5ldyBFbmNvZGluZ1RlbXBsYXRlVmFyaWFibGVSZXNvbHZlclhNTCgpKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdGV4dC9YTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1YjMzZDguLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3RleHQvWE1MRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRleHQ7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnRleHQuRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotCi0KLXB1YmxpYyBjbGFzcyBYTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyIGV4dGVuZHMgRG9jdW1lbnRSZWdpb25FZGdlTWF0Y2hlciB7Ci0KLQotCXB1YmxpYyBYTUxEb2N1bWVudFJlZ2lvbkVkZ2VNYXRjaGVyKCkgewotCQlzdXBlcihuZXcgU3RyaW5nW117RE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUsIERPTVJlZ2lvbkNvbnRleHQuWE1MX0NPTU1FTlRfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfQ0RBVEFfVEVYVCwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfT1BFTiwgRE9NUmVnaW9uQ29udGV4dC5YTUxfUElfQ09OVEVOVH0sIG51bGwpOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1NoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9TaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Q5MzJjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1NoYXJlZFhNTEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudXRpbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5zd3QuZ3JhcGhpY3MuSW1hZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5lZGl0b3IuWE1MRWRpdG9yUGx1Z2luSW1hZ2VzOwotCi0KLXB1YmxpYyBjbGFzcyBTaGFyZWRYTUxFZGl0b3JQbHVnaW5JbWFnZUhlbHBlciB7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX0NPTlNUUkFJTk9GRiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQ09OU1RSQUlOT0ZGOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19EVE9PTF9DT05TVFJBSU5PTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRFRPT0xfQ09OU1RSQUlOT047Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX1JMREdSTVIgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0RUT09MX1JMREdSTVI7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0RUT09MX1ZBTElEQVRFID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19EVE9PTF9WQUxJREFURTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfQ09OU1RSQUlOT0ZGID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9DT05TVFJBSU5PRkY7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX0VUT09MX0NPTlNUUkFJTk9OID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19FVE9PTF9DT05TVFJBSU5PTjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfUkxER1JNUiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfRVRPT0xfUkxER1JNUjsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfRVRPT0xfVkFMSURBVEUgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX0VUT09MX1ZBTElEQVRFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQVRUUklCVVRFID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQVRUUklCVVRFOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ0RBVEFTRUNUSU9OID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfQ0RBVEFTRUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfQ09NTUVOVCA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0NPTU1FTlQ7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9ET0NUWVBFID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRE9DVFlQRTsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX0VMRU1FTlQgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9FTEVNRU5UOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5USVRZID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfRU5USVRZOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfRU5USVRZX1JFRkVSRU5DRSA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX0VOVElUWV9SRUZFUkVOQ0U7Ci0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1HX09CSl9OT1RBVElPTiA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX05PVEFUSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfUFJPQ0VTU0lOR0lOU1RSVUNUSU9OID0gWE1MRWRpdG9yUGx1Z2luSW1hZ2VzLklNR19PQkpfUFJPQ0VTU0lOR0lOU1RSVUNUSU9OOwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElNR19PQkpfVEFHX0dFTkVSSUMgPSBYTUxFZGl0b3JQbHVnaW5JbWFnZXMuSU1HX09CSl9UQUdfR0VORVJJQzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RBR19NQUNSTyA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RBR19NQUNSTzsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfT0JKX1RYVEVYVCA9IFhNTEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1RYVEVYVDsKLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgc3BlY2lmaWVkIGltYWdlIGZyb20gdGhlIHhtbCBzb3VyY2UgZWRpdG9yIHBsdWdpbidzIGltYWdlCi0JICogcmVnaXN0cnkuIE5vdGU6IFRoZSByZXR1cm5lZCA8Y29kZT5JbWFnZTwvY29kZT4gaXMgbWFuYWdlZCBieSB0aGUKLQkgKiB3b3JrYmVuY2g7IGNsaWVudHMgbXVzdCA8Yj5ub3QgPC9iPiBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCBpbWFnZS4KLQkgKiAKLQkgKiBAcGFyYW0gc3ltYm9saWNOYW1lCi0JICogICAgICAgICAgICB0aGUgc3ltYm9saWMgbmFtZSBvZiB0aGUgaW1hZ2U7IHRoZXJlIGFyZSBjb25zdGFudHMgZGVjbGFyZWQKLQkgKiAgICAgICAgICAgIGluIHRoaXMgY2xhc3MgZm9yIGJ1aWxkLWluIGltYWdlcyB0aGF0IGNvbWUgd2l0aCB0aGUgeG1sCi0JICogICAgICAgICAgICBzb3VyY2UgZWRpdG9yCi0JICogQHJldHVybiB0aGUgaW1hZ2UsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGlmIG5vdCBmb3VuZAotCSAqLwotCXB1YmxpYyBzdGF0aWMgSW1hZ2UgZ2V0SW1hZ2UoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZShzeW1ib2xpY05hbWUpOwotCX0KLQotCS8qKgotCSAqIFJldHJpZXZlcyB0aGUgaW1hZ2UgZGVzY3JpcHRvciBmb3Igc3BlY2lmaWVkIGltYWdlIGZyb20gdGhlIHhtbCBzb3VyY2UKLQkgKiBlZGl0b3IgcGx1Z2luJ3MgaW1hZ2UgcmVnaXN0cnkuIFVubGlrZSA8Y29kZT5JbWFnZTwvY29kZT5zLCBpbWFnZQotCSAqIGRlc2NyaXB0b3JzIHRoZW1zZWx2ZXMgZG8gbm90IG5lZWQgdG8gYmUgZGlzcG9zZWQuCi0JICogCi0JICogQHBhcmFtIHN5bWJvbGljTmFtZQotCSAqICAgICAgICAgICAgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGltYWdlOyB0aGVyZSBhcmUgY29uc3RhbnRzIGRlY2xhcmVkCi0JICogICAgICAgICAgICBpbiB0aGlzIGludGVyZmFjZSBmb3IgYnVpbGQtaW4gaW1hZ2VzIHRoYXQgY29tZSB3aXRoIHRoZSB4bWwKLQkgKiAgICAgICAgICAgIHNvdXJjZSBlZGl0b3IKLQkgKiBAcmV0dXJuIHRoZSBpbWFnZSBkZXNjcmlwdG9yLCBvciA8Y29kZT5udWxsPC9jb2RlPiBpZiBub3QgZm91bmQKLQkgKi8KLQlwdWJsaWMgc3RhdGljIEltYWdlRGVzY3JpcHRvciBnZXRJbWFnZURlc2NyaXB0b3IoU3RyaW5nIHN5bWJvbGljTmFtZSkgewotCQlyZXR1cm4gWE1MRWRpdG9yUGx1Z2luSW1hZ2VIZWxwZXIuZ2V0SW5zdGFuY2UoKS5nZXRJbWFnZURlc2NyaXB0b3Ioc3ltYm9saWNOYW1lKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9YTUxDb21tb25SZXNvdXJjZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblJlc291cmNlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2Y0MWY3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblJlc291cmNlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnRleHQuTWVzc2FnZUZvcm1hdDsKLWltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnJlc291cmNlLkltYWdlRGVzY3JpcHRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS51aS5JV29ya2JlbmNoOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnBsdWdpbi5BYnN0cmFjdFVJUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci0KLS8qKgotICogQGRlcHJlY2F0ZWQgdXNlIFhNTFVJUGx1Z2luLmdldFJlc291cmNlU3RyaW5nKCkgaW5zdGVhZAotICovCi0vKioKLSAqIFRoaXMgY2xhc3MgZXhpc3RzIHRlbXBvcmFyaWx5IHVudGlsIHRoZSBwcm9wZXJ0aWVzIGZpbGVzIGNhbiBiZQotICogcmUtb3JnYW5pemVkIGFuZCB0aGUgdmFyaW91cyByZXNvdXJjZSByZWZlcmVuY2VzIGNhbiBiZSB1cGRhdGVkCi0gKi8KLXB1YmxpYyBjbGFzcyBYTUxDb21tb25SZXNvdXJjZXMgewotCXByb3RlY3RlZCBzdGF0aWMgWE1MQ29tbW9uUmVzb3VyY2VzIGluc3RhbmNlOwotCi0JcHVibGljIHN5bmNocm9uaXplZCBzdGF0aWMgWE1MQ29tbW9uUmVzb3VyY2VzIGdldEluc3RhbmNlKCkgewotCQlpZiAoaW5zdGFuY2UgPT0gbnVsbCkKLQkJCWluc3RhbmNlID0gbmV3IFhNTENvbW1vblJlc291cmNlcyhYTUxVSVBsdWdpbi5nZXREZWZhdWx0KCkpOwotCQlyZXR1cm4gaW5zdGFuY2U7Ci0JfQotCi0JcHJpdmF0ZSBYTUxVSVBsdWdpbiBlZGl0b3JQbHVnaW47Ci0KLQlwcml2YXRlIFJlc291cmNlQnVuZGxlIHJlc291cmNlQnVuZGxlOwotCi0JcHVibGljIFhNTENvbW1vblJlc291cmNlcyhYTUxVSVBsdWdpbiBlZGl0b3JQbHVnaW4pIHsKLQkJaW5zdGFuY2UgPSB0aGlzOwotCQl0aGlzLmVkaXRvclBsdWdpbiA9IGVkaXRvclBsdWdpbjsKLQkJdHJ5IHsKLQkJCXJlc291cmNlQnVuZGxlID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLlhNTFVJUGx1Z2luUmVzb3VyY2VzIik7IC8vJE5PTi1OTFMtMSQKLQkJfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotCQkJLy9UT0RPLi4uIGxvZyBhbiBlcnJvciBtZXNzYWdlCi0JCQkvL0IyQlV0aWxQbHVnaW4uZ2V0UGx1Z2luKCkuZ2V0TXNnTG9nZ2VyKCkud3JpdGUoQjJCVXRpbFBsdWdpbi5nZXRHVUlTdHJpbmcoIl9XQVJOX1BMVUdJTl9QUk9QRVJUSUVTX01JU1NJTkciKQotCQkJLy8gKyBkZXNjcmlwdG9yLmdldExhYmVsKCkpOwotCQkJcmVzb3VyY2VCdW5kbGUgPSBudWxsOwotCQl9Ci0JfQotCi0JIEltYWdlRGVzY3JpcHRvciBfZ2V0SW1hZ2VEZXNjcmlwdG9yKFN0cmluZyBpY29uTmFtZSkgewotCQlyZXR1cm4gQWJzdHJhY3RVSVBsdWdpbi5pbWFnZURlc2NyaXB0b3JGcm9tUGx1Z2luKFhNTFVJUGx1Z2luLklELCBpY29uTmFtZSk7Ci0JfQotCi0KLQlwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoKSB7Ci0JCXJldHVybiByZXNvdXJjZUJ1bmRsZTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIGdldHMgdGhlIHN0cmluZyByZXNvdXJjZS4KLQkgKi8KLQlwdWJsaWMgU3RyaW5nIGdldFN0cmluZyhTdHJpbmcga2V5KSB7Ci0JCXJldHVybiBnZXRSZXNvdXJjZUJ1bmRsZSgpLmdldFN0cmluZyhrZXkpOwotCX0KLQotCS8qKgotCSAqIFRoaXMgZ2V0cyB0aGUgc3RyaW5nIHJlc291cmNlIGFuZCBkb2VzIG9uZSBzdWJzdGl0dXRpb24uCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxKSB7Ci0JCXJldHVybiBNZXNzYWdlRm9ybWF0LmZvcm1hdChnZXRTdHJpbmcoa2V5KSwgbmV3IE9iamVjdFtde3MxfSk7Ci0JfQotCi0JLyoqCi0JICogVGhpcyBnZXRzIHRoZSBzdHJpbmcgcmVzb3VyY2UgYW5kIGRvZXMgdHdvIHN1YnN0aXR1dGlvbnMuCi0JICovCi0JcHVibGljIFN0cmluZyBnZXRTdHJpbmcoU3RyaW5nIGtleSwgT2JqZWN0IHMxLCBPYmplY3QgczIpIHsKLQkJcmV0dXJuIE1lc3NhZ2VGb3JtYXQuZm9ybWF0KGdldFN0cmluZyhrZXkpLCBuZXcgT2JqZWN0W117czEsIHMyfSk7Ci0JfQotCi0JcHVibGljIElXb3JrYmVuY2ggZ2V0V29ya2JlbmNoKCkgewotCQlyZXR1cm4gZWRpdG9yUGx1Z2luLmdldFdvcmtiZW5jaCgpOwotCX0KLQkvKgotCSAqIHB1YmxpYyBJbWFnZUZhY3RvcnkgZ2V0SW1hZ2VGYWN0b3J5KCkgeyByZXR1cm4gaW1hZ2VGYWN0b3J5OyB9Ci0JICovCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdXRpbC9YTUxDb21tb25VSUNvbnRleHRJZHMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblVJQ29udGV4dElkcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzJjZmNhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC91dGlsL1hNTENvbW1vblVJQ29udGV4dElkcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC51dGlsOwotCi0vKioKLSAqIENvbnRleHQgaGVscCBpZCBjb25zdGFudHMuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgWE1MQ29tbW9uVUlDb250ZXh0SWRzIHsKLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQTFVHSU5fTkFNRSA9ICJvcmcuZWNsaXBzZS53c3QueG1sLnVpIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDUwMCBmb3IgRWRpdCBBdHRyaWJ1dGUgSW5zdHJ1Y3Rpb24gRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9BVFRSSUJVVEVfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwNTAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDQwMCBmb3IgU2VsZWN0IFhNTCBDYXRhbG9nIElEIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfQ0FUQUxPR19ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTA0MDAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEcyBmb3IgWE1MIENvbW1vbiBVSSB1c2UgeGN1aXh4eCBjb250ZXh0IElEcyAqLwotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDAxMCBmb3IgRWRpdCBEb2N0eXBlIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRE9DVFlQRV9ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTAwMTAiOyAvLyROT04tTkxTLTEkCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDAzMCBmb3IgUHVibGljIElEIFRleHQgRWRpdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRE9DVFlQRV9QVUJMSUMgPSBQTFVHSU5fTkFNRSArICIueGN1aTAwMzAiOyAvLyROT04tTkxTLTEkCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDAyMCBmb3IgUm9vdCBFbGVtZW50IE5hbWUgVGV4dCBFZGl0ICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9ET0NUWVBFX1JPT1QgPSBQTFVHSU5fTkFNRSArICIueGN1aTAwMjAiOyAvLyROT04tTkxTLTEkCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDA0MCBmb3IgU3lzdGVtIElEIFRleHQgRWRpdCAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfRE9DVFlQRV9TWVNURU0gPSBQTFVHSU5fTkFNRSArICIueGN1aTAwNTAiOyAvLyROT04tTkxTLTEkCi0KLQkvKiBDT05URVhUX0lEIHhjdWkwMzAwIGZvciBFZGl0IEVsZW1lbnQgSW5zdHJ1Y3Rpb24gRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9FTEVNRU5UX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDYwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTAyMDAgZm9yIEVkaXQgTmFtZXNwYWNlIERpYWxvZyAqLwotCXB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhDVUlfTkFNRVNQQUNFX0RJQUxPRyA9IFBMVUdJTl9OQU1FICsgIi54Y3VpMDIwMCI7IC8vJE5PTi1OTFMtMSQKLQotCS8qIENPTlRFWFRfSUQgeGN1aTAzMDAgZm9yIEVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbiBEaWFsb2cgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYQ1VJX1BST0NFU1NJTkdfRElBTE9HID0gUExVR0lOX05BTUUgKyAiLnhjdWkwMzAwIjsgLy8kTk9OLU5MUy0xJAotCi0JLyogQ09OVEVYVF9JRCB4Y3VpMDEwMCBmb3IgRWRpdCBTY2hlbWEgSW5mb3JtYXRpb24gRGlhbG9nICovCi0JcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWENVSV9TQ0hFTUFfSU5GT19ESUFMT0cgPSBQTFVHSU5fTkFNRSArICIueGN1aTAxMDAiOyAvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvaW50ZXJuYWwvdmFsaWRhdGlvbi9EZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YmQyMjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVByb2plY3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSVJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLlJlc291cmNlc1BsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGF0aDsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JbmRleGVkUmVnaW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLmNvcmUuSU1lc3NhZ2VBY2Nlc3M7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuY29yZS5WYWxpZGF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUHJvamVjdFZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVJlcG9ydGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5wcm92aXNpb25hbC5jb3JlLklWYWxpZGF0b3JKb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01BdHRyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01FbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTW9kZWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NVGV4dDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLQotLyoqCi0gKiBBIERlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3IgY2FsbHMgaXRzIGRlbGVnYXRlIHZhbGlkYXRvciB0byBnZXQgYSBsaXN0Ci0gKiBvZiB2YWxpZGF0aW9uIGVycm9yIElNZXNzYWdlcy4gVXNpbmcgaW5mb3JtYXRpb24gaW4gdGhpcyBJTWVzc2FnZSB0aGUKLSAqIERlbGVnYXRpbmdSZWNvbmNpbGVWYWxpZGF0b3IgdXBkYXRlcyB0aGUgSU1lc3NhZ2Ugd2l0aCBhbiBvZmZzZXQgYW5kIGxlbmd0aAotICogdG8gZ2l2ZSBhIGdvb2QgcmFuZ2UgdG8gYmUgInNxdWlnZ2xlZCIgYW5kIGFkZHMgdGhlIG1lc3NhZ2VzIHRvIHRoZQotICogSVJlcG9ydGVyCi0gKiAKLSAqIEBhdXRob3IgTWFyayBIdXRjaGluc29uCi0gKiAKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yIHsKLQkvLyB0aGUgc2VsZWN0aW9uIHN0cmF0ZWdpZXM6Ci0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMX0FUVFJJQlVURVMgPSAiQUxMX0FUVFJJQlVURVMiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX05BTUUgPSAiQVRUUklCVVRFX05BTUUiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVRUUklCVVRFX1ZBTFVFID0gIkFUVFJJQlVURV9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFSVF9UQUcgPSAiU1RBUlRfVEFHIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFRFWFQgPSAiVEVYVCI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBGSVJTVF9OT05fV0hJVEVTUEFDRV9URVhUID0gIkZJUlNUX05PTl9XSElURVNQQUNFX1RFWFQiOyAvLyROT04tTkxTLTEkCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVYVF9FTlRJVFlfUkVGRVJFTkNFID0gIlRFWFRfRU5USVRZX1JFRkVSRU5DRSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSA9ICJWQUxVRV9PRl9BVFRSSUJVVEVfV0lUSF9HSVZFTl9WQUxVRSI7IC8vJE5PTi1OTFMtMSQKLQkKLSAgLyoqCi0gICAqIFRoaXMgY29uc3RhbnQgc3BlY2lmaWVzIHRoZSBhdHRyaWJ1dGUgbmFtZSB0aGF0IHNwZWNpZmllcyB0aGUgc2lkZSBvZiB0aGUgJ3N0YXJ0IHRhZycKLSAgICogdGhhdCB0aGUgdmFsaWRhdG9yIGhhcyB1c2VkIHRvIHJlcG9ydCBhbiBlcnJvci4gIEEgdmFsaWRhdG9yIG1heSBjaG9vc2UgdG8gcmVwb3J0IGEgbWVzc2FnZQotICAgKiBhdCB0aGUgbGVmdCAodGhlIHN0YXJ0IG9mIHRoZSBzdGFydCB0YWcpb3IgYXQgdGhlIHJpZ2h0ICh0aGUgZW5kIG9mIHRoZSBzdGFydCB0YWcpLgotICAgKiBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzcGVjaWZpZWQgZXJyb3IgRVJST1JfU0lERV9MRUZUIGlzIHRoZSBkZWZhdWx0LgotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TSURFID0gIkVSUk9SX1NJREUiOyAvLyROT04tTkxTLTEkCi0JCi0gIC8qKgotICAgKiBXaGVuIHRoZSBFUlJPUl9TSURFIGF0dHJpYnV0ZSBzcGVjaWZpZXMgdGhlIEVSUk9SX1NJREVfTEVGVCB2YWx1ZSBpdCBpcyBhc3N1bWVkCi0gICAqIHRoYXQgdGhlIG1lc3NhZ2Ugc3BlY2lmaWVzIGEgbG9jYXRpb24gdG8gdGhlIGxlZnQgb2YgdGhlIHN0YXJ0IHRhZwotICAgKi8KLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TSURFX0xFRlQgPSAiRVJST1JfU0lERV9MRUZUIjsgLy8kTk9OLU5MUy0xJAkKLQkKLSAgLyoqCi0gICAqIFdoZW4gdGhlIEVSUk9SX1NJREUgYXR0cmlidXRlIHNwZWNpZmllcyB0aGUgRVJST1JfU0lERV9SSUdIVCB2YWx1ZSBpdCBpcyBhc3N1bWVkCi0gICAqIHRoYXQgdGhlIG1lc3NhZ2Ugc3BlY2lmaWVzIGEgbG9jYXRpb24gdG8gdGhlIHJpZ2h0IG9mIHRoZSBzdGFydCB0YWcKLSAgICovCQotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1NJREVfUklHSFQgPSAiRVJST1JfU0lERV9SSUdIVCI7IC8vJE5PTi1OTFMtMSQJCi0JCi0JcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09MVU1OX05VTUJFUl9BVFRSSUJVVEUgPSAiY29sdW1uTnVtYmVyIjsgLy8kTk9OLU5MUy0xJAotCXByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFNRVUlHR0xFX1NFTEVDVElPTl9TVFJBVEVHWV9BVFRSSUJVVEUgPSAic3F1aWdnbGVTZWxlY3Rpb25TdHJhdGVneSI7IC8vJE5PTi1OTFMtMSQKLQlwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBTUVVJR0dMRV9OQU1FX09SX1ZBTFVFX0FUVFJJQlVURSA9ICJzcXVpZ2dsZU5hbWVPclZhbHVlIjsgLy8kTk9OLU5MUy0xJAotCi0JcHVibGljIERlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3IoKSB7Ci0JCXN1cGVyKCk7IC8vIGNvbnN0cnVjdG9yCi0JfQotCi0JcHVibGljIHZvaWQgY2xlYW51cChJUmVwb3J0ZXIgYXJnMCkgeyAvLyBkb24ndCBuZWVkIHRvIGltcGxlbWVudAotCX0KLQotCS8vIE15IEltcGxlbWVudGF0aW9uIG9mIElIZWxwZXIKLQljbGFzcyBNeUhlbHBlciBpbXBsZW1lbnRzIElQcm9qZWN0VmFsaWRhdGlvbkNvbnRleHQgewotCQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKLQotCQlJRmlsZSBmaWxlOwotCi0JCXB1YmxpYyBNeUhlbHBlcihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgSUZpbGUgZmlsZSkgewotCQkJdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOwotCQkJdGhpcy5maWxlID0gZmlsZTsKLQkJfQotCi0JCXB1YmxpYyBpbnQgZ2V0QnVpbGRLaW5kKCkgewotCQkJcmV0dXJuIDA7Ci0JCX0KLQotCQlwdWJsaWMgT2JqZWN0IGxvYWRNb2RlbChTdHJpbmcgc3ltYm9saWNOYW1lLCBPYmplY3RbXSBwYXJtcykgewotCQkJaWYgKHN5bWJvbGljTmFtZS5lcXVhbHMoImdldEZpbGUiKSkgeyAvLyROT04tTkxTLTEkCi0JCQkJcmV0dXJuIGZpbGU7Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBPYmplY3QgbG9hZE1vZGVsKFN0cmluZyBzeW1ib2xpY05hbWUpIHsKLQkJCWlmIChzeW1ib2xpY05hbWUuZXF1YWxzKCJpbnB1dFN0cmVhbSIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlyZXR1cm4gaW5wdXRTdHJlYW07Ci0JCQl9Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBTdHJpbmdbXSBnZXRVUklzKCkgewotCQkJaWYgKGZpbGUgIT0gbnVsbCkKLQkJCQlyZXR1cm4gbmV3IFN0cmluZ1tde2ZpbGUuZ2V0RnVsbFBhdGgoKS50b1N0cmluZygpfTsKLQkJCXJldHVybiBuZXcgU3RyaW5nWzBdOwotCQl9Ci0KLQkJcHVibGljIElQcm9qZWN0IGdldFByb2plY3QoKSB7Ci0JCQlpZiAoZmlsZSAhPSBudWxsKSB7Ci0JCQkJcmV0dXJuIGZpbGUuZ2V0UHJvamVjdCgpOwotCQkJfQotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci0KLQkvLyBNeSBJbXBsZW1lbnRhdGlvbiBvZiBJUmVwb3J0ZXIKLQljbGFzcyBNeVJlcG9ydGVyIGltcGxlbWVudHMgSVJlcG9ydGVyIHsKLQkJTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCi0JCXB1YmxpYyBNeVJlcG9ydGVyKCkgewotCQkJc3VwZXIoKTsKLQkJfQotCi0JCXB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoSVZhbGlkYXRvciBvcmlnaW4sIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJCWxpc3QuYWRkKG1lc3NhZ2UpOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgZGlzcGxheVN1YnRhc2soSVZhbGlkYXRvciB2YWxpZGF0b3IsIElNZXNzYWdlIG1lc3NhZ2UpIHsKLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIElNZXNzYWdlQWNjZXNzIGdldE1lc3NhZ2VBY2Nlc3MoKSB7Ci0JCQlyZXR1cm4gbnVsbDsKLQkJfQotCi0JCXB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4sIE9iamVjdCBvYmplY3QpIHsgLy8gZG8KLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlQWxsTWVzc2FnZXMoSVZhbGlkYXRvciBvcmlnaW4pIHsKLQkJCS8qIGRvIG5vdCBuZWVkIHRvIGltcGxlbWVudCAqLwotCQl9Ci0KLQkJcHVibGljIHZvaWQgcmVtb3ZlTWVzc2FnZVN1YnNldChJVmFsaWRhdG9yIHZhbGlkYXRvciwgT2JqZWN0IG9iaiwgU3RyaW5nIGdyb3VwTmFtZSkgey8vIGRvCi0JCQkvKiBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgKi8KLQkJfQotCi0JCXB1YmxpYyBMaXN0IGdldE1lc3NhZ2VzKCkgewotCQkJcmV0dXJuIGxpc3Q7Ci0JCX0KLQl9Ci0KLQlwcm90ZWN0ZWQgYWJzdHJhY3QgSVZhbGlkYXRvciBnZXREZWxlZ2F0ZVZhbGlkYXRvcigpOwotCi0JLyoqCi0JICogQ2FsbHMgYSBkZWxlZ2F0ZSB2YWxpZGF0b3IgZ2V0dGluZyBhbmQgdXBkYXRlcyBpdCdzIGxpc3Qgb2YKLQkgKiBWYWxpZGF0aW9uTWVzc2FnZXMgd2l0aCBhIGdvb2Qgc3F1aWdnbGUgb2Zmc2V0IGFuZCBsZW5ndGguCi0JICogCi0JICogQHBhcmFtIGhlbHBlcgotCSAqICAgICAgICAgICAgbG9hZHMgYW4gb2JqZWN0LgotCSAqIEBwYXJhbSByZXBvcnRlcgotCSAqICAgICAgICAgICAgSXMgYW4gaW5zdGFuY2Ugb2YgYW4gSVJlcG9ydGVyIGludGVyZmFjZSwgd2hpY2ggaXMgdXNlZCBmb3IKLQkgKiAgICAgICAgICAgIGludGVyYWN0aW9uIHdpdGggdGhlIHVzZXIuCi0JICovCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCVN0cmluZ1tdIGRlbHRhID0gaGVscGVyLmdldFVSSXMoKTsKLQkJaWYgKGRlbHRhLmxlbmd0aCA+IDApIHsKLQkJCS8vIGdldCB0aGUgZmlsZSwgbW9kZWwgYW5kIGRvY3VtZW50OgotCQkJSUZpbGUgZmlsZSA9IGdldEZpbGUoZGVsdGFbMF0pOwotCQkJSURPTU1vZGVsIHhtbE1vZGVsID0gZ2V0TW9kZWxGb3JSZXNvdXJjZShmaWxlKTsKLQkJCXRyeSB7Ci0JCQkJSURPTURvY3VtZW50IGRvY3VtZW50ID0geG1sTW9kZWwuZ2V0RG9jdW1lbnQoKTsKLQotCQkJCS8vIHN0b3JlIHRoZSB0ZXh0IGluIGEgYnl0ZSBhcnJheTsgbWFrZSBhIGZ1bGwgY29weSB0byBlYXNlCi0JCQkJLy8gYW55IHRocmVhZGluZyBwcm9ibGVtcwotCQkJCWJ5dGVbXSBieXRlQXJyYXk7Ci0JCQkJdHJ5IHsKLQkJCQkJYnl0ZUFycmF5ID0geG1sTW9kZWwuZ2V0U3RydWN0dXJlZERvY3VtZW50KCkuZ2V0KCkuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0JCQkJfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0JCQkJCS8vIE5vdCBsaWtlbHkgdG8gaGFwcGVuCi0JCQkJCWJ5dGVBcnJheSA9IHhtbE1vZGVsLmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldCgpLmdldEJ5dGVzKCk7Ci0JCQkJfQotCi0JCQkJaWYgKGlzRGVsZWdhdGVWYWxpZGF0b3JFbmFibGVkKGZpbGUpKSB7Ci0JCQkJCUlWYWxpZGF0b3IgdmFsaWRhdG9yID0gZ2V0RGVsZWdhdGVWYWxpZGF0b3IoKTsKLQkJCQkJaWYgKHZhbGlkYXRvciAhPSBudWxsKSB7Ci0JCQkJCQkvLyBWYWxpZGF0ZSB0aGUgZmlsZToKLQkJCQkJCUlWYWxpZGF0aW9uQ29udGV4dCB2SGVscGVyID0gbmV3IE15SGVscGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlQXJyYXkpLCBmaWxlKTsKLQkJCQkJCU15UmVwb3J0ZXIgdlJlcG9ydGVyID0gbmV3IE15UmVwb3J0ZXIoKTsKLQkJCQkJCWlmICh2YWxpZGF0b3IgaW5zdGFuY2VvZiBJVmFsaWRhdG9ySm9iKSB7Ci0JCQkJCQkJKChJVmFsaWRhdG9ySm9iKSB2YWxpZGF0b3IpLnZhbGlkYXRlSW5Kb2IodkhlbHBlciwgdlJlcG9ydGVyKTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgewotCQkJCQkJCXZhbGlkYXRvci52YWxpZGF0ZSh2SGVscGVyLCB2UmVwb3J0ZXIpOwotCQkJCQkJfQotCQkJCQkJTGlzdCBtZXNzYWdlcyA9IHZSZXBvcnRlci5saXN0OwotCi0JCQkJCQkvLyBzZXQgdGhlIG9mZnNldCBhbmQgbGVuZ3RoCi0JCQkJCQl1cGRhdGVWYWxpZGF0aW9uTWVzc2FnZXMobWVzc2FnZXMsIGRvY3VtZW50LCByZXBvcnRlcik7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQotCQkJZmluYWxseSB7Ci0JCQkJaWYgKHhtbE1vZGVsICE9IG51bGwpCi0JCQkJCXhtbE1vZGVsLnJlbGVhc2VGcm9tUmVhZCgpOwotCQkJfQotCQl9Ci0JfQotCi0JLyoqCi0JICogaXRlcmF0ZXMgdGhyb3VnaCB0aGUgbWVzc2FnZXMgYW5kIGNhbGN1bGF0ZXMgYSAiYmV0dGVyIiBvZmZzZXQgYW5kCi0JICogbGVuZ3RoCi0JICogCi0JICogQHBhcmFtIG1lc3NhZ2VzIC0KLQkgKiAgICAgICAgICAgIGEgTGlzdCBvZiBJTWVzc2FnZXMKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50Ci0JICogQHBhcmFtIHJlcG9ydGVyIC0KLQkgKiAgICAgICAgICAgIHRoZSByZXBvcnRlciB0aGUgbWVzc2FnZXMgYXJlIHRvIGJlIGFkZGVkIHRvCi0JICovCi0JcHJvdGVjdGVkIHZvaWQgdXBkYXRlVmFsaWRhdGlvbk1lc3NhZ2VzKExpc3QgbWVzc2FnZXMsIElET01Eb2N1bWVudCBkb2N1bWVudCwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMuc2l6ZSgpOyBpKyspIHsKLQkJCUlNZXNzYWdlIG1lc3NhZ2UgPSAoSU1lc3NhZ2UpIG1lc3NhZ2VzLmdldChpKTsKLQkJCXRyeSB7Ci0JCQkJaWYgKG1lc3NhZ2UuZ2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFKSAhPSBudWxsKSB7Ci0JCQkJCWludCBjb2x1bW4gPSAoKEludGVnZXIpIG1lc3NhZ2UuZ2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFKSkuaW50VmFsdWUoKTsKLQkJCQkJU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5ID0gKFN0cmluZykgbWVzc2FnZS5nZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSk7Ci0JCQkJCVN0cmluZyBuYW1lT3JWYWx1ZSA9IChTdHJpbmcpIG1lc3NhZ2UuZ2V0QXR0cmlidXRlKFNRVUlHR0xFX05BTUVfT1JfVkFMVUVfQVRUUklCVVRFKTsKLQotCQkJCQkvLyBjb252ZXJ0IHRoZSBsaW5lIGFuZCBDb2x1bW4gbnVtYmVycyB0byBhbiBvZmZzZXQ6Ci0JCQkJCWludCBzdGFydCA9IGRvY3VtZW50LmdldFN0cnVjdHVyZWREb2N1bWVudCgpLmdldExpbmVPZmZzZXQobWVzc2FnZS5nZXRMaW5lTnVtYmVyKCkgLSAxKSArIGNvbHVtbiAtIDE7Ci0KLQkJCQkJLy8gY2FsY3VsYXRlIHRoZSAiYmV0dGVyIiBzdGFydCBhbmQgZW5kIG9mZnNldDoKLQkJCQkJaW50W10gcmVzdWx0ID0gY29tcHV0ZVN0YXJ0QW5kRW5kTG9jYXRpb24oc3RhcnQsIHNlbGVjdGlvblN0cmF0ZWd5LCBnZXRFcnJvclNpZGUobWVzc2FnZSksIG5hbWVPclZhbHVlLCBkb2N1bWVudCk7Ci0JCQkJCWlmIChyZXN1bHQgIT0gbnVsbCkgewotCQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQocmVzdWx0WzBdKTsKLQkJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHJlc3VsdFsxXSAtIHJlc3VsdFswXSk7Ci0JCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJY2F0Y2ggKEJhZExvY2F0aW9uRXhjZXB0aW9uIGUpIHsgLy8gdGhpcyBleGNlcHRpb24gc2hvdWxkIG5vdAotCQkJCS8vIG9jY3VyIC0gaXQgaXMgdGhyb3duIGlmCi0JCQkJLy8gdHJ5aW5nIHRvIGNvbnZlcnQgYW4KLQkJCQkvLyBpbnZhbGlkIGxpbmUgbnVtYmVyIHRvIGFuZAotCQkJCS8vIG9mZnNldAotCQkJfQotCi0JCX0KLQl9Ci0KLQkvKioKLQkgKiBAcGFyYW0gZGVsdGEKLQkgKiAgICAgICAgICAgIHRoZSBJRmlsZURlbHRhIGNvbnRhaW5pbmcgdGhlIGZpbGUgbmFtZSB0byBnZXQKLQkgKiBAcmV0dXJuIHRoZSBJRmlsZQotCSAqLwotCXB1YmxpYyBJRmlsZSBnZXRGaWxlKFN0cmluZyBkZWx0YSkgewotCQlJUmVzb3VyY2UgcmVzID0gUmVzb3VyY2VzUGx1Z2luLmdldFdvcmtzcGFjZSgpLmdldFJvb3QoKS5nZXRGaWxlKG5ldyBQYXRoKGRlbHRhKSk7Ci0JCXJldHVybiByZXMgaW5zdGFuY2VvZiBJRmlsZSA/IChJRmlsZSkgcmVzIDogbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiAKLQkgKiBAcGFyYW0gZmlsZQotCSAqICAgICAgICAgICAgdGhlIGZpbGUgdG8gZ2V0IHRoZSBtb2RlbCBmb3IKLQkgKiBAcmV0dXJuIHRoZSBmaWxlJ3MgWE1MTW9kZWwKLQkgKi8KLQlwcm90ZWN0ZWQgSURPTU1vZGVsIGdldE1vZGVsRm9yUmVzb3VyY2UoSUZpbGUgZmlsZSkgewotCQlJU3RydWN0dXJlZE1vZGVsIG1vZGVsID0gbnVsbDsKLQkJSU1vZGVsTWFuYWdlciBtYW5hZ2VyID0gU3RydWN0dXJlZE1vZGVsTWFuYWdlci5nZXRNb2RlbE1hbmFnZXIoKTsKLQotCQl0cnkgewotCQkJbW9kZWwgPSBtYW5hZ2VyLmdldE1vZGVsRm9yUmVhZChmaWxlKTsKLQkJCS8vIFRPRE8uLiBIVE1MIHZhbGlkYXRvciB0cmllcyBhZ2FpbiB0byBnZXQgYSBtb2RlbCBhIDJuZCB3YXkKLQkJfQotCQljYXRjaCAoRXhjZXB0aW9uIGUpIHsKLQkJCS8vIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0JCX0KLQotCQlyZXR1cm4gbW9kZWwgaW5zdGFuY2VvZiBJRE9NTW9kZWwgPyAoSURPTU1vZGVsKSBtb2RlbCA6IG51bGw7Ci0JfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCB1c2UgY29tcHV0ZVN0YXJ0RW5kTG9jYXRpb24oaW50IHN0YXJ0T2Zmc2V0LCBTdHJpbmcgZXJyb3JNZXNzYWdlLCBTdHJpbmcgc2VsZWN0aW9uU3RyYXRlZ3ksIGJvb2xlYW4gbGVmdEVycm9yLCBTdHJpbmcgbmFtZU9yVmFsdWUsIElET01Eb2N1bWVudCBkb2N1bWVudCkgewotICAgKgotICAgKi8KLSAgcHJvdGVjdGVkIGludFtdIGNvbXB1dGVTdGFydEVuZExvY2F0aW9uKGludCBzdGFydE9mZnNldCwgU3RyaW5nIGVycm9yTWVzc2FnZSwgU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5LCBTdHJpbmcgbmFtZU9yVmFsdWUsIElET01Eb2N1bWVudCBkb2N1bWVudCkgCi0gIHsKLSAgICByZXR1cm4gY29tcHV0ZVN0YXJ0QW5kRW5kTG9jYXRpb24oc3RhcnRPZmZzZXQsIHNlbGVjdGlvblN0cmF0ZWd5LCBFUlJPUl9TSURFX1JJR0hULCBuYW1lT3JWYWx1ZSwgZG9jdW1lbnQpOwotICB9ICAKLSAgCi0JLyoqCi0JICogQ2FsY3VsYXRlcyB0aGUgImJldHRlciIgb2Zmc2V0cy4KLQkgKiBAcGFyYW0gc3RhcnRPZmZzZXQgLQotCSAqICAgICAgICAgICAgdGhlIG9mZnNldCBnaXZlbiBieSBYZXJjZXMKLQkgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIC0KLQkgKiAgICAgICAgICAgIHRoZSBYZXJjZXMgZXJyb3IgTWVzc2FnZQotCSAqIEBwYXJhbSBzZWxlY3Rpb25TdHJhdGVneSAtCi0JICogICAgICAgICAgICB0aGUgc2VsZWN0aW9uU3RyYXRlZ3kKLQkgKiBAcGFyYW0gZG9jdW1lbnQgLQotCSAqICAgICAgICAgICAgdGhlIGRvY3VtZW50Ci0JICogQHJldHVybiBpbnRbXSAtIHBvc2l0aW9uIDAgaGFzIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHNxdWlnZ2xlIHJhbmdlLAotCSAqICAgICAgICAgcG9zaXRpb24gMSBoYXMgdGhlIGVuZE9mZnNldAotCSAqLwotCS8qCi0JICogVGhlIHdheSB0aGUgb2Zmc2V0cyBpcyBjYWxjdWxhdGVkIGlzOiAtIGZpbmQgdGhlIGluZGV4ZWQgcmVnaW9uCi0JICogKGVsZW1lbnQpIGNsb3Nlc3QgdG8gdGhlIGdpdmVuIG9mZnNldCAtIGlmIHdlIGFyZSBiZXR3ZWVuIHR3byBlbGVtZW50cywKLQkgKiBjaG9vc2luZyBsZWZ0IG9yIHJpZ2h0IGVsZW1lbnQgd2lsbCBkZXBlbmQgb24gcGFyYW1ldGVyICdlcnJvclNpZGUnIAotCSAqIC0gYmFzZWQgb24gdGhlIHNlbGVjdGlvblN0cmF0ZWd5IGNob29zZSB0aGUgdW5kZXJsaW5pbmcgc3RyYXRlZ3kgCi0JICogIChlZyBTVEFSVF9UQUcgbWVhbnMgdW5kZXJsaW5lIHRoZSBzdGFydCB0YWcgb2YgdGhhdCBlbGVtZW50KSAKLQkgKiAtIHVzZSBpbmZvcm1hdGlvbiBmcm9tIG5hbWVPclZhbHVlIGFuZCB0aGUgRE9NIHRvCi0JICogZ2V0IGJldHRlciBvZmZzZXRzCi0JICogCi0JICovCi0JcHJvdGVjdGVkIGludFtdIGNvbXB1dGVTdGFydEFuZEVuZExvY2F0aW9uKGludCBzdGFydE9mZnNldCwgU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5LCBTdHJpbmcgZXJyb3JTaWRlLCBTdHJpbmcgbmFtZU9yVmFsdWUsIElET01Eb2N1bWVudCBkb2N1bWVudCkgewotCQl0cnkgewotCQkJaW50IHN0YXJ0RW5kUG9zaXRpb25zW10gPSBuZXcgaW50WzJdOwotCi0JCQlJbmRleGVkUmVnaW9uIHJlZ2lvbiA9IGRvY3VtZW50LmdldE1vZGVsKCkuZ2V0SW5kZXhlZFJlZ2lvbihzdGFydE9mZnNldCk7Ci0JCQlJbmRleGVkUmVnaW9uIHByZXZSZWdpb24gPSBkb2N1bWVudC5nZXRNb2RlbCgpLmdldEluZGV4ZWRSZWdpb24oc3RhcnRPZmZzZXQgLSAxKTsKLQotCQkJaWYgKHByZXZSZWdpb24gIT0gcmVnaW9uKSB7Ci0JCQkJLy8gaWYgYmV0d2VlbiB0d28gcmVnaW9ucyB3ZSB1c2UgdGhlICdlcnJvclNpZGUnIHRvIHVuZGVyc3RhbmQgd2hpY2gKLQkJCQkvLyBlbGVtZW50IGlzIGFwcGxpY2FibGUuICBpZiB3ZSBrbm93IHRoZSBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCB0byB0aGUKLQkJCQkvLyByaWdodCBvZiB0aGUgdGFnLCB0aGVuIHdlIGNhbiBhc3N1bWUgd2UgbmVlZCB0byBzdGVwIGJhY2sgdG8gdGhlIHByZXZpb3VzCi0JCQkJLy8gcmVnaW9uIHRvIGxhbmQgYXQgdGhlICdjb3JyZWN0IGxvY2F0aW9uLiAgT3RoZXJ3aXNlIGFzc3VtZSB3ZSdyZQotCQkJCS8vIGV4YWN0bHkgd2hlcmUgd2UgbmVlZCB0byBiZS4JCQkJCi0JCQkJaWYgKEVSUk9SX1NJREVfTEVGVC5lcXVhbHMoZXJyb3JTaWRlKSkKLQkJCQl7Ci0JCQkJICByZWdpb24gPSBwcmV2UmVnaW9uOwotCQkJCX0gIAotCQkJfQotCi0JCQkvLyBpbml0aWFsaXplIHN0YXJ0IGFuZCBlbmQgcG9zaXRpb25zIHRvIGJlIHRoZSBzdGFydCBwb3NpdGlvbnMKLQkJCS8vIHRoaXMgbWVhbnMgaWYgdGhlCi0JCQkvLyBzcGVjaWFsIGNhc2UgaXMgbm90IHRha2VuIGNhcmUgb2YgYmVsb3cgdGhlIHN0YXJ0IGFuZCBlbmQKLQkJCS8vIG9mZnNldCBhcmUgc2V0IHRvIGJlCi0JCQkvLyB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiB3aGVyZSB0aGUgZXJyb3Igd2FzCi0JCQlpZiAocmVnaW9uICE9IG51bGwpIHsKLQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnRFbmRQb3NpdGlvbnNbMF07Ci0JCQl9Ci0JCQllbHNlIHsgLy8gdGhpcyB3aWxsIG1lc3NhZ2Ugd2lsbCBub3QgZ2V0IGFkZGVkIHRvIHRoZSBJUmVwb3J0ZXIKLQkJCQkvLyBzaW5jZSB0aGUgbGVuZ3RoIGlzIDAKLQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IDA7Ci0JCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSAwOwotCQkJfQotCQkJaWYgKHJlZ2lvbiBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgcmVnaW9uOwotCi0JCQkJaWYgKFNUQVJUX1RBRy5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ly8gdGhlbiB3ZSB3YW50IHRvCi0JCQkJCS8vIHVuZGVybGluZSB0aGUgb3BlbmluZyB0YWcKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gZWxlbWVudC5nZXRTdGFydE9mZnNldCgpICsgMTsKLQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnRFbmRQb3NpdGlvbnNbMF0gKyBlbGVtZW50LmdldFRhZ05hbWUoKS5sZW5ndGgoKTsKLQkJCQkJfQotCQkJCX0KLQkJCQllbHNlIGlmIChBVFRSSUJVVEVfTkFNRS5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7IC8vIGluCi0JCQkJCS8vIHVuZGVybGluZSB0aGUgYXR0cmlidXRlJ3MgbmFtZQotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJSURPTU5vZGUgYXR0cmlidXRlTm9kZSA9IChJRE9NTm9kZSkgKGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lT3JWYWx1ZSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZU5vZGUgIT0gbnVsbCkgewotCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gYXR0cmlidXRlTm9kZS5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gYXR0cmlidXRlTm9kZS5nZXRTdGFydE9mZnNldCgpICsgbmFtZU9yVmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQVRUUklCVVRFX1ZBTFVFLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gdW5kZXJsaW5lIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZQotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlJRE9NRWxlbWVudCBlbGVtZW50ID0gKElET01FbGVtZW50KSBub2RlOwotCQkJCQkJSURPTUF0dHIgYXR0cmlidXRlTm9kZSA9IChJRE9NQXR0cikgKGVsZW1lbnQuZ2V0QXR0cmlidXRlTm9kZShuYW1lT3JWYWx1ZSkpOwotCQkJCQkJaWYgKGF0dHJpYnV0ZU5vZGUgIT0gbnVsbCkgewotCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzBdID0gYXR0cmlidXRlTm9kZS5nZXRWYWx1ZVJlZ2lvblN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydEVuZFBvc2l0aW9uc1swXSArIGF0dHJpYnV0ZU5vZGUuZ2V0VmFsdWVSZWdpb25UZXh0KCkubGVuZ3RoKCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoQUxMX0FUVFJJQlVURVMuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgewotCQkJCQkvLyB1bmRlcmxpbmUgYWxsIGF0dHJpYnV0ZXMKLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlpZiAoYXR0cmlidXRlcyAhPSBudWxsKSB7Ci0JCQkJCQkJSURPTU5vZGUgZmlyc3QgPSAoSURPTU5vZGUpIGF0dHJpYnV0ZXMuaXRlbSgwKTsKLQkJCQkJCQlJRE9NTm9kZSBsYXN0ID0gKElET01Ob2RlKSBhdHRyaWJ1dGVzLml0ZW0oYXR0cmlidXRlcy5nZXRMZW5ndGgoKSAtIDEpOwotCQkJCQkJCWlmIChmaXJzdCAhPSBudWxsICYmIGxhc3QgIT0gbnVsbCkgewotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGZpcnN0LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gbGFzdC5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoVEVYVC5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ci0JCQkJCS8vIHVuZGVybGluZSB0aGUgdGV4dCBiZXR3ZWVuIHRoZSB0YWdzCi0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCUlET01UZXh0IHRleHROb2RlID0gKElET01UZXh0KSBub2RlOwotCQkJCQkJaW50IHN0YXJ0ID0gdGV4dE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCVN0cmluZyB2YWx1ZSA9IHRleHROb2RlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJaW50IGluZGV4ID0gMDsKLQkJCQkJCWNoYXIgY3VyQ2hhciA9IHZhbHVlLmNoYXJBdChpbmRleCk7Ci0JCQkJCQkvLyBoZXJlIHdlIGFyZSBmaW5kaW5nIHN0YXJ0IG9mZnNldCBieSBza2lwcGluZyBvdmVyCi0JCQkJCQkvLyB3aGl0ZXNwYWNlOgotCQkJCQkJd2hpbGUgKGN1ckNoYXIgPT0gJ1xuJyB8fCBjdXJDaGFyID09ICdcdCcgfHwgY3VyQ2hhciA9PSAnXHInIHx8IGN1ckNoYXIgPT0gJyAnKSB7Ci0JCQkJCQkJY3VyQ2hhciA9IHZhbHVlLmNoYXJBdChpbmRleCk7Ci0JCQkJCQkJaW5kZXgrKzsKLQkJCQkJCX0KLQkJCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJCQlpbmRleC0tOwotCi0JCQkJCQl9Ci0JCQkJCQlzdGFydCA9IHN0YXJ0ICsgaW5kZXg7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHN0YXJ0ICsgaW5kZXg7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0ICsgdmFsdWUudHJpbSgpLmxlbmd0aCgpOwotCQkJCQl9Ci0JCQkJCWVsc2UgaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJSURPTUVsZW1lbnQgZWxlbWVudCA9IChJRE9NRWxlbWVudCkgbm9kZTsKLQkJCQkJCU5vZGUgY2hpbGQgPSBlbGVtZW50LmdldEZpcnN0Q2hpbGQoKTsKLQkJCQkJCWlmIChjaGlsZCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJCQkJSURPTU5vZGUgeG1sQ2hpbGQgPSAoKElET01Ob2RlKSBjaGlsZCk7Ci0JCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSB4bWxDaGlsZC5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0geG1sQ2hpbGQuZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0JCQkJZWxzZSBpZiAoRklSU1RfTk9OX1dISVRFU1BBQ0VfVEVYVC5lcXVhbHMoc2VsZWN0aW9uU3RyYXRlZ3kpKSB7Ci0JCQkJCS8vIHNlYXJjaCB0aHJvdWdoIGFsbCBjaGlsZCBub2RlcyBhbmQgcmV0dXJuIHJhbmdlIG9mCi0JCQkJCS8vIGZpcnN0IG5vbi13aGl0ZXNwYWNlCi0JCQkJCS8vIHRleHQgbm9kZQotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQlOb2RlTGlzdCBub2RlcyA9IG5vZGUuZ2V0Q2hpbGROb2RlcygpOwotCQkJCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBub2Rlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQkJTm9kZSBjdXJyZW50Tm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0JCQkJCQkJaWYgKGN1cnJlbnROb2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpIHsKLQkJCQkJCQkJLy8gVE9ETyAoVHJ1bmcpIEkgZG9uJ3QgdGhpbmsgd2Ugc2hvdWxkIGNhbGwgZ2V0Tm9kZVZhbHVlKCksIHRyaW0oKSwgbGVuZ3RoKCkgcmVwZWF0ZWRseS4KLQkJCQkJCQkJLy8gVGhpcyBpcyBpbmVmZmljaWVudCwgdG8gaW1wcm92ZSB1c2UgbG9jYWwgdmFyaWFibGVzIHRvIHN0b3JlIHZhbHVlcy4KLQkJCQkJCQkJSURPTVRleHQgdGV4dE5vZGUgPSAoSURPTVRleHQpIGN1cnJlbnROb2RlOwotCQkJCQkJCQlpZiAodGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCkudHJpbSgpLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQkJU3RyaW5nIHZhbHVlID0gdGV4dE5vZGUuZ2V0Tm9kZVZhbHVlKCk7Ci0JCQkJCQkJCQlpbnQgaW5kZXggPSAwOwotCQkJCQkJCQkJaW50IHN0YXJ0ID0gdGV4dE5vZGUuZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCQkJCQkJCWNoYXIgY3VyQ2hhciA9IHZhbHVlLmNoYXJBdChpbmRleCk7Ci0JCQkJCQkJCQkvLyBoZXJlIHdlIGFyZSBmaW5kaW5nIHN0YXJ0IG9mZnNldCBieQotCQkJCQkJCQkJLy8gc2tpcHBpbmcgb3ZlciB3aGl0ZXNwYWNlOgotCQkJCQkJCQkJd2hpbGUgKGN1ckNoYXIgPT0gJ1xuJyB8fCBjdXJDaGFyID09ICdcdCcgfHwgY3VyQ2hhciA9PSAnXHInIHx8IGN1ckNoYXIgPT0gJyAnKSB7Ci0JCQkJCQkJCQkJY3VyQ2hhciA9IHZhbHVlLmNoYXJBdChpbmRleCk7Ci0JCQkJCQkJCQkJaW5kZXgrKzsKLQkJCQkJCQkJCX0KLQkJCQkJCQkJCWlmIChpbmRleCA+IDApIHsKLQkJCQkJCQkJCQlpbmRleC0tOwotCi0JCQkJCQkJCQl9Ci0JCQkJCQkJCQlzdGFydCA9IHN0YXJ0ICsgaW5kZXg7Ci0JCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHN0YXJ0OwotCQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSBzdGFydCArIHZhbHVlLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJfQotCi0JCQkJCQl9Ci0JCQkJCX0KLQkJCQl9Ci0KLQkJCQllbHNlIGlmIChURVhUX0VOVElUWV9SRUZFUkVOQ0UuZXF1YWxzKHNlbGVjdGlvblN0cmF0ZWd5KSkgewotCQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRU5USVRZX1JFRkVSRU5DRV9OT0RFKSB7Ci0JCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IHJlZ2lvbi5nZXRTdGFydE9mZnNldCgpOwotCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMV0gPSByZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCQkJCX0KLQkJCQkJZWxzZSBpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFKSB7Ci0JCQkJCQkvKgotCQkJCQkJICogSW4gdGhpcyBjYXNlIHRoZSB1bmRlY2xhcmVkIGVudGl0eSBtaWdodCBiZSBpbiBvbmUKLQkJCQkJCSAqIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWVzLiBTZWFyY2ggdGhyb3VnaCB0aGUKLQkJCQkJCSAqIGF0dHJpYnV0ZXMgdG8gZmluZCB0aGUgcmFuZ2Ugb2YgdGhlIHVuZGVjbGFyZWQKLQkJCQkJCSAqIGVudGl0eS4KLQkJCQkJCSAqLwotCQkJCQkJU3RyaW5nIGVudGl0eSA9ICImIiArIG5hbWVPclZhbHVlICsgIjsiOyAvLyROT04tTkxTLTEkIC8vJE5PTi1OTFMtMiQKLQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gbm9kZS5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlmb3IgKGludCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCQkJCUlET01BdHRyIGF0dHIgPSAoSURPTUF0dHIpIGF0dHJpYnV0ZXMuaXRlbShpKTsKLQkJCQkJCQlTdHJpbmcgbm9kZVZhbHVlID0gYXR0ci5nZXROb2RlVmFsdWUoKTsKLQkJCQkJCQlpbnQgaW5kZXggPSBub2RlVmFsdWUuaW5kZXhPZihlbnRpdHkpOwotCQkJCQkJCWlmIChpbmRleCAhPSAtMSkgewotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1swXSA9IGF0dHIuZ2V0VmFsdWVSZWdpb25TdGFydE9mZnNldCgpICsgaW5kZXggKyAxOwotCQkJCQkJCQlzdGFydEVuZFBvc2l0aW9uc1sxXSA9IHN0YXJ0RW5kUG9zaXRpb25zWzBdICsgZW50aXR5Lmxlbmd0aCgpOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCi0JCQkJfQotCQkJCWVsc2UgaWYgKFZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFLmVxdWFscyhzZWxlY3Rpb25TdHJhdGVneSkpIHsKLQkJCQkJLy8gVE9ETyAoVHJ1bmcpIGRvIHdlIHJlYWxseSBuZWVkIHRoaXMgc3RyYXRlZ3kgPwotCQkJCQkvLyBJZiB3ZSBrbm93IHRoZSBuYW1lIG9mIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHdlIGNhbiByZXRyaWV2ZSBpdHMgdmFsdWUuCi0JCQkJCS8vIEhlbmNlLCB3ZSBjYW4gaW5jb3BlcmF0ZSB0aGlzIHN0cmF0ZWd5IHdpdGggQVRUUklCVVRFX1ZBTFVFID8KLQkJCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewotCQkJCQkJLy8gaGVyZSB3ZSB3aWxsIHNlYXJjaCB0aHJvdWdoIGFsbCBhdHRyaWJ1dGVzIGZvciB0aGUKLQkJCQkJCS8vIG9uZSB3aXRoIHRoZQotCQkJCQkJLy8gd2l0aCB0aGUgdmFsdWUgd2Ugd2FudDoKLQkJCQkJCS8vIFRPRE8gKFRydW5nKSBJIHNlZSBhIHBvdGVudGlhbCBwcm9ibGVtIGhlcmUuCi0JCQkJCQkvLyBXaGF0IGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBhbm90aGVyIGF0dHJpYnV0ZSBoYXZpbmcgdGhlIHNhbWUgdmFsdWUKLQkJCQkJCS8vIHdpdGggdGhpcyBhdHRyaWJ1dGUncyBidWdneSB2YWx1ZSA/Ci0JCQkJCQkvLyBOZWVkIHRvIHNvbHZlIHdoZW4gdGltZSBwZXJtaXRzLgotCQkJCQkJTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBub2RlLmdldEF0dHJpYnV0ZXMoKTsKLQkJCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0JCQkJCQkJSURPTUF0dHIgYXR0ciA9IChJRE9NQXR0cikgYXR0cmlidXRlcy5pdGVtKGkpOwotCQkJCQkJCVN0cmluZyBub2RlVmFsdWUgPSBhdHRyLmdldE5vZGVWYWx1ZSgpLnRyaW0oKTsKLQkJCQkJCQlpZiAobm9kZVZhbHVlLmVxdWFscyhuYW1lT3JWYWx1ZSkpIHsKLQkJCQkJCQkJc3RhcnRFbmRQb3NpdGlvbnNbMF0gPSBhdHRyLmdldFZhbHVlUmVnaW9uU3RhcnRPZmZzZXQoKSArIDE7Ci0JCQkJCQkJCXN0YXJ0RW5kUG9zaXRpb25zWzFdID0gc3RhcnRFbmRQb3NpdGlvbnNbMF0gKyBub2RlVmFsdWUubGVuZ3RoKCk7Ci0JCQkJCQkJCWJyZWFrOwotCQkJCQkJCX0KLQkJCQkJCX0KLQkJCQkJfQotCQkJCX0KLQkJCX0KLQkJCXJldHVybiBzdGFydEVuZFBvc2l0aW9uczsKLQkJfQotCQkvLyBjYXRjaCAoRXhjZXB0aW9uIGUpIHsgLy8gZS5wcmludFN0YWNrVHJhY2UoKTsKLQkJLy8gfQotCQlmaW5hbGx5IHsKLQkJfQotCQkvLyByZXR1cm4gbnVsbDsKLQl9Ci0KLQkvKioKLQkgKiBSZXR1cm5zIHRydWUgaWYgZGVsZWdhdGUgdmFsaWRhdG9yIGlzIGVuYWJsZWQgYmFzZWQgb24gVmFsaWRhdGlvbgotCSAqIHByZWZlcmVuY2VzCi0JICogCi0JICogQHBhcmFtIGZpbGUKLQkgKiBAcmV0dXJuIGZhbHNlIGlmIGRlbGVnYXRlIHZhbGlkYXRvciBpcyBub3QgZW5hYmxlZCBiYXNlZCBvbiBWYWxpZGF0b2luCi0JICogICAgICAgICBwcmVmZXJlbmNlcywgdHJ1ZSBvdGhlcndpc2UKLQkgKi8KLQlwcm90ZWN0ZWQgYm9vbGVhbiBpc0RlbGVnYXRlVmFsaWRhdG9yRW5hYmxlZChJRmlsZSBmaWxlKSB7Ci0JCXJldHVybiB0cnVlOwotCX0KLQkKLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRFcnJvclNpZGUoSU1lc3NhZ2UgbWVzc2FnZSkKLSAgewotICAgIC8vIG5vdGUgdGhhdCBpZiB0aGUgRVJST1JfU0lERSBpcyB1bnNwZWNpZmllZCB3ZSByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUgRVJST1JfU0lERV9MRUZUICAgIAotICAgIE9iamVjdCB2YWx1ZSA9IG1lc3NhZ2UuZ2V0QXR0cmlidXRlKEVSUk9SX1NJREUpOwotICAgIHJldHVybiBFUlJPUl9TSURFX1JJR0hULmVxdWFscyh2YWx1ZSkgPyBFUlJPUl9TSURFX1JJR0hUIDogRVJST1JfU0lERV9MRUZUOwotICB9CQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvckZvclhNTC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU5MTA3Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL0RlbGVnYXRpbmdTb3VyY2VWYWxpZGF0b3JGb3JYTUwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMuSUZpbGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuQ29uZmlndXJhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuUHJvamVjdENvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvblJlZ2lzdHJ5UmVhZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRvck1ldGFEYXRhOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLlZhbGlkYXRpb25GYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLkxvZ2dlcjsKLQotLyoqCi0gKiBAYXV0aG9yIE1hcmsgSHV0Y2hpbnNvbgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MIGV4dGVuZHMgRGVsZWdhdGluZ1NvdXJjZVZhbGlkYXRvciB7Ci0JcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFZBTElEQVRPUl9DTEFTUyA9ICJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlZhbGlkYXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCXB1YmxpYyBEZWxlZ2F0aW5nU291cmNlVmFsaWRhdG9yRm9yWE1MKCkgewotCQlzdXBlcigpOwotCX0KLQotCXByb3RlY3RlZCBJVmFsaWRhdG9yIGdldERlbGVnYXRlVmFsaWRhdG9yKCkgewotCQlJVmFsaWRhdG9yIHJlc3VsdCA9IG51bGw7Ci0JCXRyeSB7Ci0JCQlyZXN1bHQgPSBWYWxpZGF0aW9uRmFjdG9yeS5pbnN0YW5jZS5nZXRWYWxpZGF0b3IoVkFMSURBVE9SX0NMQVNTKTsKLQkJfQotCQljYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiByZXN1bHQ7Ci0JfQotCi0JcHJvdGVjdGVkIGJvb2xlYW4gaXNEZWxlZ2F0ZVZhbGlkYXRvckVuYWJsZWQoSUZpbGUgZmlsZSkgewotCQlib29sZWFuIGVuYWJsZWQgPSB0cnVlOwotCQl0cnkgewotCQkJUHJvamVjdENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IENvbmZpZ3VyYXRpb25NYW5hZ2VyLmdldE1hbmFnZXIoKS5nZXRQcm9qZWN0Q29uZmlndXJhdGlvbihmaWxlLmdldFByb2plY3QoKSk7Ci0JCQlWYWxpZGF0b3JNZXRhRGF0YSB2bWQgPSBWYWxpZGF0aW9uUmVnaXN0cnlSZWFkZXIuZ2V0UmVhZGVyKCkuZ2V0VmFsaWRhdG9yTWV0YURhdGEoVkFMSURBVE9SX0NMQVNTKTsKLQkJCWlmIChjb25maWd1cmF0aW9uLmlzQnVpbGRFbmFibGVkKHZtZCkgfHwgY29uZmlndXJhdGlvbi5pc01hbnVhbEVuYWJsZWQodm1kKSkKLQkJCQllbmFibGVkID0gdHJ1ZTsKLQkJCWVsc2UKLQkJCQllbmFibGVkID0gZmFsc2U7Ci0JCX0KLQkJY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotCQkJTG9nZ2VyLmxvZyhMb2dnZXIuV0FSTklOR19ERUJVRywgZS5nZXRNZXNzYWdlKCksIGUpOwotCQl9Ci0JCXJldHVybiBlbmFibGVkOwotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS9pbnRlcm5hbC92YWxpZGF0aW9uL01hcmt1cFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYjdlNjIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL2ludGVybmFsL3ZhbGlkYXRpb24vTWFya3VwVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDkgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnZhbGlkYXRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS50ZXh0LkJhZExvY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnRleHQuSVJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5vc2dpLnV0aWwuTkxTOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5TdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JU3RydWN0dXJlZE1vZGVsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC50ZXh0LklTdHJ1Y3R1cmVkRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLnRleHQuSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwudGV4dC5JVGV4dFJlZ2lvbkxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5yZWNvbmNpbGUuUmVjb25jaWxlQW5ub3RhdGlvbktleTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS5UZW1wb3JhcnlBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwucmVjb25jaWxlLnZhbGlkYXRvci5Bbm5vdGF0aW9uSW5mbzsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSVNvdXJjZVZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLnJlY29uY2lsZS52YWxpZGF0b3IuSW5jcmVtZW50YWxSZXBvcnRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbi5pbnRlcm5hbC5jb3JlLlZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwub3BlcmF0aW9ucy5Mb2NhbGl6ZWRNZXNzYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JUmVwb3J0ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdGlvbkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwucHJvdmlzaW9uYWwuY29yZS5JVmFsaWRhdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5kb2N1bWVudC5JRE9NTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwucmVnaW9ucy5ET01SZWdpb25Db250ZXh0OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuTG9nZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmNvcnJlY3Rpb24uUHJvYmxlbUlEc1hNTDsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi0vKioKLSAqIEJhc2ljIFhNTCBzeW50YXggY2hlY2tpbmcgc3RlcC4KLSAqIE9ubHkgdXNlZCBhcyBJU291cmNlVmFsaWRhdG9yIGF0IHRoZSBtb21tZW50Ci0gKiAKLSAqIEBhdXRob3IgcGF2ZXJ5Ci0gKi8KLXB1YmxpYyBjbGFzcyBNYXJrdXBWYWxpZGF0b3IgaW1wbGVtZW50cyBJVmFsaWRhdG9yLCBJU291cmNlVmFsaWRhdG9yIHsKLQlwcml2YXRlIFN0cmluZyBEUVVPVEUgPSAiXCIiOyAvLyROT04tTkxTLTEkCi0KLQlwcm90ZWN0ZWQgU3RyaW5nIFNFVkVSSVRZX0FUVFJfTUlTU0lOR19WQUxVRSA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1I7Ci0JcHJvdGVjdGVkIFN0cmluZyBTRVZFUklUWV9BVFRSX05PX1ZBTFVFID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUjsKLQkvLyBzZXZlcml0aWVzIGZvciB0aGUgcHJvYmxlbXMgZGlzY292ZXJhYmxlIGJ5IHRoaXMgcmVjb25jaWxlcjsgcG9zc2libHkKLQkvLyB1c2VyIGNvbmZpZ3VyYWJsZSBsYXRlcgotCXByb3RlY3RlZCBTdHJpbmcgU0VWRVJJVFlfR0VORVJJQ19JTExGT1JNRURfU1lOVEFYID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9XQVJOSU5HOwotCXByb3RlY3RlZCBTdHJpbmcgU0VWRVJJVFlfU1RSVUNUVVJFID0gVGVtcG9yYXJ5QW5ub3RhdGlvbi5BTk5PVF9FUlJPUjsKLQlwcm90ZWN0ZWQgU3RyaW5nIFNFVkVSSVRZX1NZTlRBWF9FUlJPUiA9IFRlbXBvcmFyeUFubm90YXRpb24uQU5OT1RfRVJST1I7Ci0JLy8gdXNlZCBmb3IgYXR0cmlidXRlIHF1b3RlIGNoZWNraW5nCi0JcHJpdmF0ZSBTdHJpbmcgU1FVT1RFID0gIiciOyAvLyROT04tTkxTLTEkCi0KLQlwcml2YXRlIElEb2N1bWVudCBmRG9jdW1lbnQ7Ci0KLQlwcml2YXRlIHZvaWQgYWRkQXR0cmlidXRlRXJyb3IoU3RyaW5nIG1lc3NhZ2VUZXh0LCBTdHJpbmcgYXR0cmlidXRlVmFsdWVUZXh0LCBpbnQgc3RhcnQsIGludCBsZW5ndGgsIGludCBwcm9ibGVtSWQsIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc2RSZWdpb24sICBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLSAgICAgICAgCi0gICAgICAgIGlmIChzZFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0gICAgICAgIGludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLSAgICAgICAgTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotICAgICAgICBtZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0gICAgICAgIG1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0gICAgICAgIAotICAgICAgICBBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIHByb2JsZW1JZCwgYXR0cmlidXRlVmFsdWVUZXh0KTsKLSAgICAgICAgKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQl9Ci0KLQlwcml2YXRlIHZvaWQgY2hlY2tBdHRyaWJ1dGVzSW5FbmRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotICAgICAgICAKLSAgICAgICAgaWYoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLQkJSVRleHRSZWdpb25MaXN0IHRleHRSZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCWludCBlbmQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0RW5kT2Zmc2V0KCk7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgdGV4dFJlZ2lvbnMuc2l6ZSgpICYmIGVycm9yQ291bnQgPCBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneS5FTEVNRU5UX0VSUk9SX0xJTUlUICYmICFzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCk7IGkrKykgewotCQkJSVRleHRSZWdpb24gdGV4dFJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpKTsKLQkJCWlmICh0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX05BTUUgfHwgdGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9FUVVBTFMgfHwgdGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWlmIChzdGFydCA+IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldCh0ZXh0UmVnaW9uKSkKLQkJCQkJc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQodGV4dFJlZ2lvbik7Ci0JCQkJZW5kID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEVuZE9mZnNldCh0ZXh0UmVnaW9uKTsKLQkJCQllcnJvckNvdW50Kys7Ci0JCQl9Ci0JCX0KLQkJLy8gY3JlYXRlIG9uZSBlcnJvciBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIGVuZCB0YWcKLQkJaWYgKGVycm9yQ291bnQgPiAwKSB7Ci0JCQkvLyBQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0JCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLkVuZF90YWdfaGFzX2F0dHJpYnV0ZXM7Ci0JCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5OT1JNQUxfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGVuZCAtIHN0YXJ0KTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGdldExpbmVOdW1iZXIoc3RhcnQpKTsKLQkJCQotCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlLCBQcm9ibGVtSURzWE1MLkF0dHJzSW5FbmRUYWcsIG51bGwpOwotCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJfQotCX0KLQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2luZ0JyYWNrZXQoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotICAgICAgICAKLSAgICAgICAgaWYoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlJVGV4dFJlZ2lvbiByID0gbnVsbDsKLQkJYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKSAgJiYgIXN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKTsgaSsrKSB7Ci0JCQlyID0gcmVnaW9ucy5nZXQoaSk7Ci0JCQlpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFIHx8IHIuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX0VNUFRZX1RBR19DTE9TRSkKLQkJCQljbG9zZWQgPSB0cnVlOwotCQl9Ci0JCWlmICghY2xvc2VkKSB7Ci0KLQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF82OwotCi0JCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQoKTsKLQkJCWludCBsZW5ndGggPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dCgpLnRyaW0oKS5sZW5ndGgoKTsKLQkJCWludCBsaW5lTm8gPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLQkJCQotCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQkKLQkJCUFubm90YXRpb25JbmZvIGluZm8gPSBuZXcgQW5ub3RhdGlvbkluZm8obWVzc2FnZSwgUHJvYmxlbUlEc1hNTC5NaXNzaW5nQ2xvc2luZ0JyYWNrZXQsIG51bGwpOwotCQkJKChJbmNyZW1lbnRhbFJlcG9ydGVyKXJlcG9ydGVyKS5hZGRBbm5vdGF0aW9uSW5mbyh0aGlzLCBpbmZvKTsKLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0VtcHR5VGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0JCS8vIG5hdmlnYXRlIHRvIG5hbWUKLQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQlpZiAocmVnaW9ucy5zaXplKCkgPT0gMikgewotCQkJLy8gbWlzc2luZyBuYW1lIHJlZ2lvbgotCQkJaWYgKHJlZ2lvbnMuZ2V0KDApLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiAmJiByZWdpb25zLmdldCgxKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0NMT1NFKSB7Ci0JCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzM7Ci0JCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRMZW5ndGgoKTsKLQkJCQlpbnQgbGluZU5vID0gZ2V0TGluZU51bWJlcihzdGFydCk7Ci0JCQkJCi0JCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGxpbmVObyk7Ci0JCQkJCi0JCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlLCBQcm9ibGVtSURzWE1MLkVtcHR5VGFnLCBudWxsKTsKLQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBpbnQgZ2V0TGluZU51bWJlcihpbnQgc3RhcnQpIHsKLQkJaW50IGxpbmVObyA9IC0xOwotCQl0cnkgewotCQkJbGluZU5vID0gZ2V0RG9jdW1lbnQoKS5nZXRMaW5lT2ZPZmZzZXQoc3RhcnQpOwotCQl9Ci0JCWNhdGNoIChCYWRMb2NhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JCQlMb2dnZXIubG9nRXhjZXB0aW9uKGUpOwotCQl9Ci0JCXJldHVybiBsaW5lTm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrRm9yQXR0cmlidXRlVmFsdWUoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIElSZXBvcnRlciByZXBvcnRlcikgewotICAgICAgICAKLSAgICAgICAgaWYoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLQkJLy8gY2hlY2sgZm9yIGF0dHJpYnV0ZXMgd2l0aG91dCBhIHZhbHVlCi0JCS8vIHRyYWNrIHRoZSBhdHRyaWJ1dGUvZXF1YWxzL3ZhbHVlIHNlcXVlbmNlIHVzaW5nIGEgc3RhdGUgb2YgMCwgMSAsMgotCQkvLyByZXByZXNlbnRpbmcgdGhlIG5hbWUsID0sIGFuZCB2YWx1ZSwgcmVzcGVjdGl2ZWx5Ci0JCWludCBhdHRyU3RhdGUgPSAwOwotCQlJVGV4dFJlZ2lvbkxpc3QgdGV4dFJlZ2lvbnMgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0UmVnaW9ucygpOwotCQkvLyBSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9IGNyZWF0ZUtleShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFNjb3BlKCkpOwotCQkKLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHRleHRSZWdpb25zLnNpemUoKSAmJiBlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVDsgaSsrKSB7Ci0JCQlJVGV4dFJlZ2lvbiB0ZXh0UmVnaW9uID0gdGV4dFJlZ2lvbnMuZ2V0KGkpOwotCQkJaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfTkFNRSB8fCBpc1RhZ0Nsb3NlVGV4dFJlZ2lvbih0ZXh0UmVnaW9uKSkgewotCQkJCS8vIGRhbmdsaW5nIG5hbWUgYW5kICc9JwotCQkJCWlmIChhdHRyU3RhdGUgPT0gMiAmJiBpID49IDIpIHsKLQkJCQkJLy8gY3JlYXRlIGFubm90YXRpb24KLQkJCQkJSVRleHRSZWdpb24gbmFtZVJlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpIC0gMik7Ci0JCQkJCU9iamVjdFtdIGFyZ3MgPSB7c3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbil9OwotCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBOTFMuYmluZChYTUxVSU1lc3NhZ2VzLkF0dHJpYnV0ZV9faXNfbWlzc2luZ19hX3ZhbHVlLCBhcmdzKTsKLQkJCQkJCi0JCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChuYW1lUmVnaW9uKTsKLQkJCQkJaW50IGVuZCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRFbmRPZmZzZXQoKTsKLQkJCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCQkJCQlpbnQgdGV4dExlbmd0aCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRUZXh0KG5hbWVSZWdpb24pLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJCi0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aCh0ZXh0TGVuZ3RoKTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8obGluZU5vKTsKLQkJCQkJCi0JCQkJCS8vIHF1aWNrIGZpeCBpbmZvCi0JCQkJCUlUZXh0UmVnaW9uIGVxdWFsc1JlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpIC0gMiArIDEpOwotCQkJCQlpbnQgaW5zZXJ0T2Zmc2V0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHRFbmRPZmZzZXQoZXF1YWxzUmVnaW9uKSAtIGVuZDsKLQkJCQkJT2JqZWN0W10gYWRkaXRpb25hbEZpeEluZm8gPSB7c3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQobmFtZVJlZ2lvbiksIG5ldyBJbnRlZ2VyKGluc2VydE9mZnNldCl9OwotCQkJCQkKLQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlLCBQcm9ibGVtSURzWE1MLk1pc3NpbmdBdHRyVmFsdWUsIGFkZGl0aW9uYWxGaXhJbmZvKTsKLQkJCQkJCi0JCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcilyZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJCQotCQkJCQkvLyBhbm5vdGF0aW9uLnNldEFkZGl0aW9uYWxGaXhJbmZvKGFkZGl0aW9uYWxGaXhJbmZvKTsKLQkJCQkJLy9yZXN1bHRzLmFkZChhbm5vdGF0aW9uKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCQkvLyBuYW1lIGJ1dCBubyAnPScgKFhNTCBvbmx5KQotCQkJCWVsc2UgaWYgKGF0dHJTdGF0ZSA9PSAxICYmIGkgPj0gMSkgewotCQkJCQkvLyBjcmVhdGUgYW5ub3RhdGlvbgotCQkJCQlJVGV4dFJlZ2lvbiBwcmV2aW91c1JlZ2lvbiA9IHRleHRSZWdpb25zLmdldChpIC0gMSk7Ci0JCQkJCU9iamVjdFtdIGFyZ3MgPSB7c3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocHJldmlvdXNSZWdpb24pfTsKLQkJCQkJU3RyaW5nIG1lc3NhZ2VUZXh0ID0gTkxTLmJpbmQoWE1MVUlNZXNzYWdlcy5BdHRyaWJ1dGVfX2hhc19ub192YWx1ZSwgYXJncyk7Ci0JCQkJCWludCBzdGFydCA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChwcmV2aW91c1JlZ2lvbik7Ci0JCQkJCWludCB0ZXh0TGVuZ3RoID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocHJldmlvdXNSZWdpb24pLnRyaW0oKS5sZW5ndGgoKTsKLQkJCQkJaW50IGxpbmVObyA9IGdldExpbmVOdW1iZXIoc3RhcnQpOwotCQkJCQkKLQkJCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCQltZXNzYWdlLnNldE9mZnNldChzdGFydCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKHRleHRMZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTm8pOwotCQkJCQkKLQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlLCBQcm9ibGVtSURzWE1MLk5vQXR0clZhbHVlLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChwcmV2aW91c1JlZ2lvbikpOwotCQkJCi0JCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcilyZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJCQotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJCWF0dHJTdGF0ZSA9IDE7Ci0JCQl9IGVsc2UgaWYgKHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19BVFRSSUJVVEVfRVFVQUxTKSB7Ci0JCQkJYXR0clN0YXRlID0gMjsKLQkJCX0gZWxzZSBpZiAodGV4dFJlZ2lvbi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX0FUVFJJQlVURV9WQUxVRSkgewotCQkJCWF0dHJTdGF0ZSA9IDA7Ci0JCQl9Ci0JCX0KLQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja0ZvclNwYWNlQmVmb3JlTmFtZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0gICAgICAgIAotICAgICAgICBpZihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotCQlTdHJpbmcgc2RSZWdpb25UZXh0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZ1bGxUZXh0KCk7Ci0JCWlmIChzZFJlZ2lvblRleHQuc3RhcnRzV2l0aCgiICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQkJaWYgKHByZXYgIT0gbnVsbCkgewotCQkJCS8vIHRoaXMgaXMgcG9zc2libHkgdGhlIGNhc2Ugb2YgIjwgdGFnIgotCQkJCWlmIChwcmV2LmdldFJlZ2lvbnMoKS5zaXplKCkgPT0gMSAmJiBpc1N0YXJ0VGFnKHByZXYpKSB7Ci0JCQkJCS8vIGFkZCB0aGUgZXJyb3IgZm9yIHByZWNlZGluZyBzcGFjZSBpbiB0YWcgbmFtZQotCQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMjsKLQkJCQkJaW50IHN0YXJ0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJCS8vIGZpbmQgbGVuZ3RoIG9mIHdoaXRlc3BhY2UKLQkJCQkJaW50IGxlbmd0aCA9IHNkUmVnaW9uVGV4dC50cmltKCkuZXF1YWxzKCIiKSA/IHNkUmVnaW9uVGV4dC5sZW5ndGgoKSA6IHNkUmVnaW9uVGV4dC5pbmRleE9mKHNkUmVnaW9uVGV4dC50cmltKCkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQotCQkJCQlMb2NhbGl6ZWRNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgTG9jYWxpemVkTWVzc2FnZShJTWVzc2FnZS5ISUdIX1NFVkVSSVRZLCBtZXNzYWdlVGV4dCk7Ci0JCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQkJbWVzc2FnZS5zZXRMZW5ndGgobGVuZ3RoKTsKLQkJCQkJbWVzc2FnZS5zZXRMaW5lTm8oZ2V0TGluZU51bWJlcihzdGFydCkpOwotCQkJCQkKLQkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlLCBQcm9ibGVtSURzWE1MLlNwYWNlc0JlZm9yZVRhZ05hbWUsIG51bGwpOwotCQkJCQkoKEluY3JlbWVudGFsUmVwb3J0ZXIpcmVwb3J0ZXIpLmFkZEFubm90YXRpb25JbmZvKHRoaXMsIGluZm8pOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja05vTmFtZXNwYWNlSW5QSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0gICAgICAgIAotICAgICAgICBpZihzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotCQkvLyBuYXZpZ2F0ZSB0byBuYW1lCi0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCWludCBlcnJvckNvdW50ID0gMDsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCByZWdpb25zLnNpemUoKSAmJiBlcnJvckNvdW50IDwgQWJzdHJhY3RTdHJ1Y3R1cmVkVGV4dFJlY29uY2lsaW5nU3RyYXRlZ3kuRUxFTUVOVF9FUlJPUl9MSU1JVCAmJiAhc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfTkFNRSkgewotCQkJCVN0cmluZyBwaVRleHQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0VGV4dChyKTsKLQkJCQlpbnQgaW5kZXggPSBwaVRleHQuaW5kZXhPZigiOiIpOyAvLyROT04tTkxTLTEkCi0JCQkJaWYgKGluZGV4ICE9IC0xKSB7Ci0JCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF80OwotCQkJCQlpbnQgc3RhcnQgPSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQocikgKyBpbmRleDsKLQkJCQkJaW50IGxlbmd0aCA9IHBpVGV4dC50cmltKCkubGVuZ3RoKCkgLSBpbmRleDsKLQkJCQkJCi0JCQkJCUxvY2FsaXplZE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLQkJCQkJbWVzc2FnZS5zZXRPZmZzZXQoc3RhcnQpOwotCQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCQltZXNzYWdlLnNldExpbmVObyhnZXRMaW5lTnVtYmVyKHN0YXJ0KSk7Ci0JCQkJCQotCQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIFByb2JsZW1JRHNYTUwuTmFtZXNwYWNlSW5QSSwgbnVsbCk7Ci0JCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcilyZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0KLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgdm9pZCBjaGVja1F1b3Rlc0ZvckF0dHJpYnV0ZVZhbHVlcyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCUlUZXh0UmVnaW9uTGlzdCByZWdpb25zID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFJlZ2lvbnMoKTsKLQkJSVRleHRSZWdpb24gciA9IG51bGw7Ci0JCVN0cmluZyBhdHRyVmFsdWVUZXh0ID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGVycm9yQ291bnQgPSAwOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpICYmIGVycm9yQ291bnQgPCBBYnN0cmFjdFN0cnVjdHVyZWRUZXh0UmVjb25jaWxpbmdTdHJhdGVneS5FTEVNRU5UX0VSUk9SX0xJTUlUOyBpKyspIHsKLQkJCXIgPSByZWdpb25zLmdldChpKTsKLQkJCWlmIChyLmdldFR5cGUoKSAhPSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQVRUUklCVVRFX1ZBTFVFKQotCQkJCWNvbnRpbnVlOwotCi0JCQlhdHRyVmFsdWVUZXh0ID0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFRleHQocik7Ci0JCQkvLyBhdHRyaWJ1dGUgdmFsdWUgaW5jbHVkZXMgcXVvdGVzIGluIHRoZSBzdHJpbmcKLQkJCS8vIHNwbGl0IHVwIGF0dHJpYnV0ZSB2YWx1ZSBvbiBxdW90ZXMKLQkJCS8qCi0JCQkgKiBXT1JLQVJPVU5EIHRpbGwKLQkJCSAqIGh0dHA6Ly9kZXYuaWN1LXByb2plY3Qub3JnL2NnaS1iaW4vaWN1LWJ1Z3MvaW5jb21pbmc/ZmluZGlkPTUyMDcKLQkJCSAqIGlzIGZpeGVkLiAoQWxzbyBzZWUgQlVHMTQzNjI4KQotCQkJICovCi0KLQkJCWphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcihhdHRyVmFsdWVUZXh0LCAiXCInIiwgdHJ1ZSk7IC8vJE5PTi1OTFMtMSQKLQkJCWludCBzaXplID0gc3QuY291bnRUb2tlbnMoKTsKLQkJCS8vIGdldCB0aGUgcGllY2VzIG9mIHRoZSBhdHRyaWJ1dGUgdmFsdWUKLQkJCVN0cmluZyBvbmUgPSAiIiwgdHdvID0gIiI7IC8vJE5PTi1OTFMtMSQgLy8kTk9OLU5MUy0yJAotCQkJaWYgKHNpemUgPiAwKQotCQkJCW9uZSA9IHN0Lm5leHRUb2tlbigpOwotCQkJaWYgKHNpemUgPiAxKQotCQkJCXR3byA9IHN0Lm5leHRUb2tlbigpOwotCQkJaWYgKHNpemUgPiAyKSB7Ci0JCQkJLy8gc2hvdWxkIGJlIGhhbmRsZWQgYnkgcGFyc2luZy4uLgotCQkJCS8vIGFzIGluIHdlIGNhbid0IGhhdmUgYW4gYXR0cmlidXRlIHZhbHVlIGxpa2U6IDxlbGVtZW50Ci0JCQkJLy8gYXR0cj0iYSJiImMiLz4KLQkJCQkvLyBhbmQgPGVsZW1lbnQgYXR0cj0nYSJiImMnIC8+IGlzIGxlZ2FsCi0JCQkJY29udGludWU7Ci0JCQl9Ci0KLQotCQkJaWYgKHNpemUgPT0gMSkgewotCQkJCWlmIChvbmUuZXF1YWxzKERRVU9URSkgfHwgb25lLmVxdWFscyhTUVVPVEUpKSB7Ci0JCQkJCS8vIG1pc3NpbmcgY2xvc2luZyBxdW90ZQotCQkJCQlTdHJpbmcgbWVzc2FnZSA9IFhNTFVJTWVzc2FnZXMuUmVjb25jaWxlU3RlcEZvck1hcmt1cF8wOwotCQkJCQlhZGRBdHRyaWJ1dGVFcnJvcihtZXNzYWdlLCBhdHRyVmFsdWVUZXh0LCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0U3RhcnRPZmZzZXQociksIGF0dHJWYWx1ZVRleHQudHJpbSgpLmxlbmd0aCgpLCBQcm9ibGVtSURzWE1MLlVuY2xhc3NpZmllZCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCQkJCWVycm9yQ291bnQrKzsKLQkJCQl9IGVsc2UgewotCQkJCQkvLyBtaXNzaW5nIGJvdGgKLQkJCQkJU3RyaW5nIG1lc3NhZ2UgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfMTsKLQkJCQkJYWRkQXR0cmlidXRlRXJyb3IobWVzc2FnZSwgYXR0clZhbHVlVGV4dCwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldFN0YXJ0T2Zmc2V0KHIpLCBhdHRyVmFsdWVUZXh0LnRyaW0oKS5sZW5ndGgoKSwgUHJvYmxlbUlEc1hNTC5BdHRyVmFsdWVOb3RRdW90ZWQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJCQllcnJvckNvdW50Kys7Ci0JCQkJfQotCQkJfSBlbHNlIGlmIChzaXplID09IDIpIHsKLQkJCQlpZiAob25lLmVxdWFscyhTUVVPVEUpICYmICF0d28uZXF1YWxzKFNRVU9URSkgfHwgb25lLmVxdWFscyhEUVVPVEUpICYmICF0d28uZXF1YWxzKERRVU9URSkpIHsKLQkJCQkJLy8gbWlzc2luZyBjbG9zaW5nIHF1b3RlCi0JCQkJCVN0cmluZyBtZXNzYWdlID0gWE1MVUlNZXNzYWdlcy5SZWNvbmNpbGVTdGVwRm9yTWFya3VwXzA7Ci0JCQkJCWFkZEF0dHJpYnV0ZUVycm9yKG1lc3NhZ2UsIGF0dHJWYWx1ZVRleHQsIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRTdGFydE9mZnNldChyKSwgYXR0clZhbHVlVGV4dC50cmltKCkubGVuZ3RoKCksIFByb2JsZW1JRHNYTUwuVW5jbGFzc2lmaWVkLCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCQkJZXJyb3JDb3VudCsrOwotCQkJCX0KLQkJCX0KLQkJfQotCQkvLyBlbmQgb2YgcmVnaW9uIGZvciBsb29wCi0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhcnRFbmRUYWdQYWlycyhJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKHNkUmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAKLQkJLy8gY2hlY2sgc3RhcnQvZW5kIHRhZyBwYWlycwotCQlJRE9NTm9kZSB4bWxOb2RlID0gZ2V0WE1MTm9kZShzZFJlZ2lvbik7Ci0gICAgICAgIAotICAgICAgICBpZih4bWxOb2RlID09IG51bGwpCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIAotCQlib29sZWFuIHNlbGZDbG9zZWQgPSBmYWxzZTsKLQkJU3RyaW5nIHRhZ05hbWUgPSBudWxsOwotCQlpbnQgbGVuZ3RoID0gMDsKLQotCQlpZiAoeG1sTm9kZS5pc0NvbnRhaW5lcigpKSB7Ci0JCQlJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGVuZFJlZ2lvbiA9IHhtbE5vZGUuZ2V0RW5kU3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCk7Ci0JCQlpZiAoZW5kUmVnaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0YXJ0UmVnaW9uID0geG1sTm9kZS5nZXRTdGFydFN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbigpOwotICAgICAgICAgICAgICAgIGlmKCFzdGFydFJlZ2lvbi5pc0RlbGV0ZWQoKSkgewotICAgIAkJCQkvLyBhbmFseXplIHRoZSB0YWcgKGNoZWNrIHNlbGYgY2xvc2luZykKLSAgICAJCQkJSVRleHRSZWdpb25MaXN0IHJlZ2lvbnMgPSBzdGFydFJlZ2lvbi5nZXRSZWdpb25zKCk7Ci0gICAgCQkJCUlUZXh0UmVnaW9uIHIgPSBudWxsOwotICAgIAkJCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAJCQkJCXIgPSByZWdpb25zLmdldChpKTsKLSAgICAJCQkJCWlmIChyLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTiB8fCByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLSAgICAJCQkJCQlsZW5ndGgrKzsKLSAgICAJCQkJCX0gZWxzZSBpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfVEFHX05BTUUpIHsKLSAgICAJCQkJCQl0YWdOYW1lID0gc2RSZWdpb24uZ2V0VGV4dChyKTsKLSAgICAJCQkJCQlsZW5ndGggKz0gdGFnTmFtZS5sZW5ndGgoKTsKLSAgICAJCQkJCX0gZWxzZSBpZiAoci5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU1QVFlfVEFHX0NMT1NFKSB7Ci0gICAgCQkJCQkJc2VsZkNsb3NlZCA9IHRydWU7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCX0KLSAgICAKLSAgICAJCQkJaWYgKCFzZWxmQ2xvc2VkICYmIHRhZ05hbWUgIT0gbnVsbCkgewotICAgIAkJCQkJT2JqZWN0W10gYXJncyA9IHt0YWdOYW1lfTsKLSAgICAJCQkJCVN0cmluZyBtZXNzYWdlVGV4dCA9IE5MUy5iaW5kKFhNTFVJTWVzc2FnZXMuTWlzc2luZ19lbmRfdGFnXywgYXJncyk7Ci0gICAgCi0gICAgCQkJCQlpbnQgc3RhcnQgPSBzZFJlZ2lvbi5nZXRTdGFydCgpOwotICAgIAkJCQkJaW50IGxpbmVOdW1iZXIgPSBnZXRMaW5lTnVtYmVyKHN0YXJ0KTsKLSAgICAJCQkJCQotICAgIAkJCQkJLy9TRVZFUklUWV9TVFJVQ1RVUkUgPT0gSU1lc3NhZ2UuSElHSF9TRVZFUklUWQotICAgIAkJCQkJSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBMb2NhbGl6ZWRNZXNzYWdlKElNZXNzYWdlLkhJR0hfU0VWRVJJVFksIG1lc3NhZ2VUZXh0KTsKLSAgICAJCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLSAgICAJCQkJCW1lc3NhZ2Uuc2V0TGVuZ3RoKGxlbmd0aCk7Ci0gICAgCQkJCQltZXNzYWdlLnNldExpbmVObyhsaW5lTnVtYmVyKTsKLSAgICAJCQkJCQotICAgIAkJCQkJaWYocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSB7Ci0gICAgCQkJCQkJCi0gICAgICAgIAkJCQkJT2JqZWN0W10gYWRkaXRpb25hbEZpeEluZm8gPSBnZXRTdGFydEVuZEZpeEluZm8oeG1sTm9kZSwgdGFnTmFtZSwgcik7Ci0gICAgICAgIAkJCQkJCi0gICAgICAgIAkJCQkJQW5ub3RhdGlvbkluZm8gaW5mbyA9IG5ldyBBbm5vdGF0aW9uSW5mbyhtZXNzYWdlLCBQcm9ibGVtSURzWE1MLk1pc3NpbmdFbmRUYWcsIGFkZGl0aW9uYWxGaXhJbmZvKTsKLSAgICAgICAgCQkJCQkvL2Fubm90YXRpb24uc2V0QWRkaXRpb25hbEZpeEluZm8oYWRkaXRpb25hbEZpeEluZm8pOwotICAgICAgICAJCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcilyZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0gICAgCQkJCQl9Ci0gICAgCQkJCQllbHNlIHsKLSAgICAJCQkJCQlyZXBvcnRlci5hZGRNZXNzYWdlKHRoaXMsIG1lc3NhZ2UpOwotICAgIAkJCQkJfQotICAgIAkJCQl9Ci0gICAgCQkJfQotICAgICAgICAgICAgfQotCi0JCX0KLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldFN0YXJ0RW5kRml4SW5mbyhJRE9NTm9kZSB4bWxOb2RlLCBTdHJpbmcgdGFnTmFtZSwgSVRleHRSZWdpb24gcikgewotCQkvLyBxdWljayBmaXggaW5mbwotCQlTdHJpbmcgdGFnQ2xvc2UgPSAiLz4iOyAvLyROT04tTkxTLTEkCi0JCWludCB0YWdDbG9zZU9mZnNldCA9IHhtbE5vZGUuZ2V0Rmlyc3RTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24oKS5nZXRFbmRPZmZzZXQoKTsKLQkJaWYgKHIgIT0gbnVsbCAmJiByLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfQ0xPU0UpIHsKLQkJCXRhZ0Nsb3NlID0gIi8iOyAvLyROT04tTkxTLTEkCi0JCQl0YWdDbG9zZU9mZnNldC0tOwotCQl9Ci0JCUlET01Ob2RlIGZpcnN0Q2hpbGQgPSAoSURPTU5vZGUpIHhtbE5vZGUuZ2V0Rmlyc3RDaGlsZCgpOwotCQl3aGlsZSAoZmlyc3RDaGlsZCAhPSBudWxsICYmIGZpcnN0Q2hpbGQuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLlRFWFRfTk9ERSkgewotCQkJZmlyc3RDaGlsZCA9IChJRE9NTm9kZSkgZmlyc3RDaGlsZC5nZXROZXh0U2libGluZygpOwotCQl9Ci0JCWludCBlbmRPZmZzZXQgPSB4bWxOb2RlLmdldEVuZE9mZnNldCgpOwotCQlpbnQgZmlyc3RDaGlsZFN0YXJ0T2Zmc2V0ID0gZmlyc3RDaGlsZCA9PSBudWxsID8gZW5kT2Zmc2V0IDogZmlyc3RDaGlsZC5nZXRTdGFydE9mZnNldCgpOwotCQlPYmplY3RbXSBhZGRpdGlvbmFsRml4SW5mbyA9IHt0YWdOYW1lLCB0YWdDbG9zZSwgbmV3IEludGVnZXIodGFnQ2xvc2VPZmZzZXQpLCBuZXcgSW50ZWdlcih4bWxOb2RlLmdldEZpcnN0U3RydWN0dXJlZERvY3VtZW50UmVnaW9uKCkuZ2V0RW5kT2Zmc2V0KCkpLCAvLyBzdGFydFRhZ0VuZE9mZnNldAotCQkJCQluZXcgSW50ZWdlcihmaXJzdENoaWxkU3RhcnRPZmZzZXQpLCAvLyBmaXJzdENoaWxkU3RhcnRPZmZzZXQKLQkJCQkJbmV3IEludGVnZXIoZW5kT2Zmc2V0KX07IC8vIGVuZE9mZnNldAotCQlyZXR1cm4gYWRkaXRpb25hbEZpeEluZm87Ci0JfQotCi0JcHJpdmF0ZSB2b2lkIGNoZWNrU3RhcnRpbmdTcGFjZUZvclBJKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCBJUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKLSAgICAgICAgCi0gICAgICAgIGlmKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gcHJldiA9IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRQcmV2aW91cygpOwotCQlpZiAocHJldiAhPSBudWxsICYmICFwcmV2LmlzRGVsZXRlZCgpKSB7Ci0JCQlTdHJpbmcgcHJldlRleHQgPSBwcmV2LmdldEZ1bGxUZXh0KCk7Ci0JCQlpZiAocHJldi5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfQ09OVEVOVCAmJiBwcmV2VGV4dC5lbmRzV2l0aCgiICIpKSB7IC8vJE5PTi1OTFMtMSQKLQkJCQlTdHJpbmcgbWVzc2FnZVRleHQgPSBYTUxVSU1lc3NhZ2VzLlJlY29uY2lsZVN0ZXBGb3JNYXJrdXBfNTsKLQkJCQlpbnQgc3RhcnQgPSBwcmV2LmdldFN0YXJ0T2Zmc2V0KCk7Ci0JCQkJaW50IGxlbmd0aCA9IHByZXYuZ2V0TGVuZ3RoKCk7Ci0JCQkJCi0JCQkJTG9jYWxpemVkTWVzc2FnZSBtZXNzYWdlID0gbmV3IExvY2FsaXplZE1lc3NhZ2UoSU1lc3NhZ2UuSElHSF9TRVZFUklUWSwgbWVzc2FnZVRleHQpOwotCQkJCW1lc3NhZ2Uuc2V0T2Zmc2V0KHN0YXJ0KTsKLQkJCQltZXNzYWdlLnNldExlbmd0aChsZW5ndGgpOwotCQkJCW1lc3NhZ2Uuc2V0TGluZU5vKGdldExpbmVOdW1iZXIoc3RhcnQpKTsKLQkJCQkKLQkJCQlBbm5vdGF0aW9uSW5mbyBpbmZvID0gbmV3IEFubm90YXRpb25JbmZvKG1lc3NhZ2UsIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlUEksIG51bGwpOwotCQkJCSgoSW5jcmVtZW50YWxSZXBvcnRlcilyZXBvcnRlcikuYWRkQW5ub3RhdGlvbkluZm8odGhpcywgaW5mbyk7Ci0JCQkJCi0vLwkJCQlQb3NpdGlvbiBwID0gbmV3IFBvc2l0aW9uKHN0YXJ0LCBsZW5ndGgpOwotLy8JCQkJCi0vLwkJCQlSZWNvbmNpbGVBbm5vdGF0aW9uS2V5IGtleSA9IGNyZWF0ZUtleShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIGdldFNjb3BlKCkpOwotLy8JCQkJVGVtcG9yYXJ5QW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gbmV3IFRlbXBvcmFyeUFubm90YXRpb24ocCwgU0VWRVJJVFlfU1lOVEFYX0VSUk9SLCBtZXNzYWdlLCBrZXksIFByb2JsZW1JRHNYTUwuU3BhY2VzQmVmb3JlUEkpOwotLy8JCQkJcmVzdWx0cy5hZGQoYW5ub3RhdGlvbik7Ci0JCQl9Ci0JCX0KLQl9Ci0KLQlwdWJsaWMgaW50IGdldFNjb3BlKCkgewotCQlyZXR1cm4gUmVjb25jaWxlQW5ub3RhdGlvbktleS5QQVJUSUFMOwotCX0KLQotCXByaXZhdGUgSURPTU5vZGUgZ2V0WE1MTm9kZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHNkUmVnaW9uKSB7Ci0gICAgICAgIAotICAgICAgICBpZihzZFJlZ2lvbiA9PSBudWxsKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIAotCQlJU3RydWN0dXJlZE1vZGVsIHhNb2RlbCA9IG51bGw7Ci0JCUlET01Ob2RlIHhtbE5vZGUgPSBudWxsOwotCQkvLyBnZXQvcmVsZWFzZSBtb2RlbHMgc2hvdWxkIGFsd2F5cyBiZSBpbiBhIHRyeS9maW5hbGx5IGJsb2NrCi0JCXRyeSB7Ci0JCQl4TW9kZWwgPSBTdHJ1Y3R1cmVkTW9kZWxNYW5hZ2VyLmdldE1vZGVsTWFuYWdlcigpLmdldEV4aXN0aW5nTW9kZWxGb3JSZWFkKGdldERvY3VtZW50KCkpOwotCQkJLy8geE1vZGVsIGlzIHNvbWV0aW1lIG51bGwsIHdoZW4gY2xvc2luZyBlZGl0b3IsIGZvciBleGFtcGxlCi0JCQlpZiAoeE1vZGVsICE9IG51bGwpIHsKLQkJCQl4bWxOb2RlID0gKElET01Ob2RlKSB4TW9kZWwuZ2V0SW5kZXhlZFJlZ2lvbihzZFJlZ2lvbi5nZXRTdGFydCgpKTsKLQkJCX0KLQkJfSBmaW5hbGx5IHsKLQkJCWlmICh4TW9kZWwgIT0gbnVsbCkgewotCQkJCXhNb2RlbC5yZWxlYXNlRnJvbVJlYWQoKTsKLQkJCX0KLQkJfQotCQlyZXR1cm4geG1sTm9kZTsKLQl9Ci0KLQkvKioKLQkgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYSBYTUwgImVuZCB0YWciCi0JICogc2luY2UgdGhleSdyZSBub3QgYWxsb3dlZCB0byBoYXZlIGF0dHJpYnV0ZSBJVGV4dFJlZ2lvbnMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzRW5kVGFnKElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0JCWlmIChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gPT0gbnVsbCB8fCBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uaXNEZWxldGVkKCkpCi0JCQlyZXR1cm4gZmFsc2U7Ci0JCXJldHVybiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24uZ2V0Rmlyc3RSZWdpb24oKS5nZXRUeXBlKCkgPT0gRE9NUmVnaW9uQ29udGV4dC5YTUxfRU5EX1RBR19PUEVOOwotCX0KLQotCS8qKgotCSAqIERldGVybWluZXMgaWYgdGhlIElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gaXMgYW4gWE1MIFByb2Nlc3NpbmcKLQkgKiBJbnN0cnVjdGlvbgotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNQSShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikgewotICAgICAgICBpZiAoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uID09IG51bGwgfHwgc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmlzRGVsZXRlZCgpKQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotCQlyZXR1cm4gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLmdldEZpcnN0UmVnaW9uKCkuZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1BJX09QRU47Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIGlzIGEgWE1MICJzdGFydCB0YWciCi0JICogc2luY2UgdGhleSBuZWVkIHRvIGJlIGNoZWNrZWQgZm9yIHByb3BlciBYTUwgYXR0cmlidXRlIHJlZ2lvbiBzZXF1ZW5jZXMKLQkgKiAKLQkgKiBAcGFyYW0gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uCi0JICogCi0JICovCi0JcHJpdmF0ZSBib29sZWFuIGlzU3RhcnRUYWcoSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pIHsKLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLQkJCXJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9UQUdfT1BFTjsKLQl9Ci0KLQkvLyBCZWNhdXNlIHdlIGNoZWNrIHRoZSAicHJvcGVyIiBjbG9zaW5nIHNlcGFyYXRlbHkgZnJvbSBhdHRyaWJ1dGUKLQkvLyBzZXF1ZW5jaW5nLCB3ZSBuZWVkIHRvIGtub3cgd2hhdCdzCi0JLy8gYW4gYXBwcm9wcmlhdGUgY2xvc2UuCi0JcHJpdmF0ZSBib29sZWFuIGlzVGFnQ2xvc2VUZXh0UmVnaW9uKElUZXh0UmVnaW9uIHRleHRSZWdpb24pIHsKLQkJcmV0dXJuIHRleHRSZWdpb24uZ2V0VHlwZSgpID09IERPTVJlZ2lvbkNvbnRleHQuWE1MX1RBR19DTE9TRSB8fCB0ZXh0UmVnaW9uLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9FTVBUWV9UQUdfQ0xPU0U7Ci0JfQotCi0JLyoqCi0JICogRGV0ZXJtaW5lcyBpZiB0aGUgSVN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiBpcyBYTUwgQ29udGVudAotCSAqIAotCSAqIEBwYXJhbSBzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24KLQkgKiAKLQkgKi8KLQlwcml2YXRlIGJvb2xlYW4gaXNYTUxDb250ZW50KElTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24gc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSB7Ci0gICAgICAgIGlmKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsIHx8IHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5pc0RlbGV0ZWQoKSkKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLQkJcmV0dXJuIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbi5nZXRGaXJzdFJlZ2lvbigpLmdldFR5cGUoKSA9PSBET01SZWdpb25Db250ZXh0LlhNTF9DT05URU5UOwotCX0KLQotCXByaXZhdGUgdm9pZCBzZXREb2N1bWVudChJRG9jdW1lbnQgZG9jKXsKLQkJZkRvY3VtZW50ID0gZG9jOwotCX0KLQlwcml2YXRlIElEb2N1bWVudCBnZXREb2N1bWVudCgpIHsKLQkJcmV0dXJuIGZEb2N1bWVudDsKLQl9Ci0JCi0JcHVibGljIHZvaWQgY29ubmVjdChJRG9jdW1lbnQgZG9jdW1lbnQpIHsKLQkJc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwotCX0KLQotCXB1YmxpYyB2b2lkIGRpc2Nvbm5lY3QoSURvY3VtZW50IGRvY3VtZW50KSB7Ci0JCXNldERvY3VtZW50KG51bGwpOwotCX0KLQotCXB1YmxpYyB2b2lkIHZhbGlkYXRlKElSZWdpb24gZGlydHlSZWdpb24sIElWYWxpZGF0aW9uQ29udGV4dCBoZWxwZXIsIElSZXBvcnRlciByZXBvcnRlcikgewotCQlpZihnZXREb2N1bWVudCgpID09IG51bGwpCi0JCQlyZXR1cm47Ci0JCWlmKCEocmVwb3J0ZXIgaW5zdGFuY2VvZiBJbmNyZW1lbnRhbFJlcG9ydGVyKSkKLQkJCXJldHVybjsKLQkJaWYoIShnZXREb2N1bWVudCgpIGluc3RhbmNlb2YgSVN0cnVjdHVyZWREb2N1bWVudCkpCi0JCQlyZXR1cm47Ci0KLQkJLy8gcmVtb3ZlIG9sZCBtZXNzYWdlcwotCQlyZXBvcnRlci5yZW1vdmVBbGxNZXNzYWdlcyh0aGlzKTsKLQkJCi0JCUlTdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb25bXSByZWdpb25zID0gKChJU3RydWN0dXJlZERvY3VtZW50KWZEb2N1bWVudCkuZ2V0U3RydWN0dXJlZERvY3VtZW50UmVnaW9ucyhkaXJ0eVJlZ2lvbi5nZXRPZmZzZXQoKSwgZGlydHlSZWdpb24uZ2V0TGVuZ3RoKCkpOwotCQlmb3IgKGludCBpID0gMDsgaSA8IHJlZ2lvbnMubGVuZ3RoOyBpKyspIHsKLQkJCXZhbGlkYXRlKHJlZ2lvbnNbaV0sIHJlcG9ydGVyKTsKLQkJfQotCX0KLQkKLQlwdWJsaWMgdm9pZCB2YWxpZGF0ZShJU3RydWN0dXJlZERvY3VtZW50UmVnaW9uIHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0KLQkJaWYgKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiA9PSBudWxsKQotCQkJcmV0dXJuOwotCQkKLQkJaWYgKGlzU3RhcnRUYWcoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uKSkgewotCQkJLy8gY2hlY2sgZm9yIGF0dHJpYnV0ZXMgd2l0aG91dCBhIHZhbHVlCi0JCQljaGVja0ZvckF0dHJpYnV0ZVZhbHVlKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgaWYgc3RhcnRlZCB0YWcgaXMgZW5kZWQKLQkJCWNoZWNrU3RhcnRFbmRUYWdQYWlycyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsJCQotCQkJLy8gY2hlY2sgZW1wdHkgdGFnIDw+Ci0JCQljaGVja0VtcHR5VGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCBlYWNoIGF0dHJpYnV0ZSBoYXMgcXVvdGVzCi0JCQljaGVja1F1b3Rlc0ZvckF0dHJpYnV0ZVZhbHVlcyhzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCS8vIGNoZWNrIHRoYXQgdGhlIGNsb3NpbmcgJz4nIGlzIHRoZXJlCi0JCQljaGVja0Nsb3NpbmdCcmFja2V0KHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9IGVsc2UgaWYgKGlzRW5kVGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbikpIHsKLQkJCWNoZWNrQXR0cmlidXRlc0luRW5kVGFnKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQkJLy8gY2hlY2sgdGhhdCB0aGUgY2xvc2luZyAnPicgaXMgdGhlcmUKLQkJCWNoZWNrQ2xvc2luZ0JyYWNrZXQoc3RydWN0dXJlZERvY3VtZW50UmVnaW9uLCByZXBvcnRlcik7Ci0JCX0gZWxzZSBpZiAoaXNQSShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQkvLyBjaGVjayB2YWxpZGl0eSBvZiBwcm9jZXNzaW5nIGluc3RydWN0aW9uCi0JCQljaGVja1N0YXJ0aW5nU3BhY2VGb3JQSShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJCWNoZWNrTm9OYW1lc3BhY2VJblBJKHN0cnVjdHVyZWREb2N1bWVudFJlZ2lvbiwgcmVwb3J0ZXIpOwotCQl9IGVsc2UgaWYgKGlzWE1MQ29udGVudChzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24pKSB7Ci0JCQljaGVja0ZvclNwYWNlQmVmb3JlTmFtZShzdHJ1Y3R1cmVkRG9jdW1lbnRSZWdpb24sIHJlcG9ydGVyKTsKLQkJfQotCX0KLQotCXB1YmxpYyB2b2lkIGNsZWFudXAoSVJlcG9ydGVyIHJlcG9ydGVyKSB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotCi0JcHVibGljIHZvaWQgdmFsaWRhdGUoSVZhbGlkYXRpb25Db250ZXh0IGhlbHBlciwgSVJlcG9ydGVyIHJlcG9ydGVyKSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0JCS8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLQkJCi0JfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1hNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3NyYy9vcmcvZWNsaXBzZS93c3QveG1sL3VpL3ZpZXdzL2NvbnRlbnRvdXRsaW5lL1hNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzM3OTUxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9jb250ZW50b3V0bGluZS9YTUxDb250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54bWwudWkudmlld3MuY29udGVudG91dGxpbmU7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSUNvbnRyaWJ1dGlvbkl0ZW07Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TGlzdGVuZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UuYWN0aW9uLklNZW51TWFuYWdlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS5wcmVmZXJlbmNlLklQcmVmZXJlbmNlU3RvcmU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2UudXRpbC5UcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS51dGlsLlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUNvbnRlbnRQcm92aWRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLklTdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuU3RydWN0dXJlZFNlbGVjdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5EcmFnU291cmNlRXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5Ecm9wVGFyZ2V0RXZlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uuc3d0LmRuZC5UcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5PYmplY3RUcmFuc2ZlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcmFnQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVpLmludGVybmFsLmRuZC5WaWV3ZXJEcm9wQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSVN0cnVjdHVyZWRNb2RlbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUudXRpbHMuU3RyaW5nVXRpbHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmludGVybmFsLmNvbnRlbnRvdXRsaW5lLlByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlSGVscGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkuaW50ZXJuYWwuZWRpdG9yLkVkaXRvclBsdWdpbkltYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURhdGFUeXBlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5Lk1vZGVsUXVlcnk7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5YTUxVSU1lc3NhZ2VzOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVDb250ZW50UHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5jb250ZW50b3V0bGluZS5KRmFjZU5vZGVMYWJlbFByb3ZpZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuY29udGVudG91dGxpbmUuWE1MTm9kZUFjdGlvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbnRlcm5hbC5kbmQuWE1MRHJhZ0FuZERyb3BNYW5hZ2VyOwotaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7Ci1pbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotLyoqCi0gKiBPdXRsaW5lIENvbmZpZ3VyYXRpb24gZm9yIGdlbmVyaWMgWE1MIHN1cHBvcnQsIGV4cGVjdHMgdGhhdCB0aGUgdmlld2VyJ3MKLSAqIGlucHV0IHdpbGwgYmUgdGhlIERPTSBNb2RlbC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbgotICogQHNpbmNlIDEuMAotICovCi1wdWJsaWMgY2xhc3MgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIGV4dGVuZHMgQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uIHsKLQlwcml2YXRlIGNsYXNzIEFjdGlvbk1hbmFnZXJNZW51TGlzdGVuZXIgaW1wbGVtZW50cyBJTWVudUxpc3RlbmVyLCBJUmVsZWFzYWJsZSB7Ci0JCXByaXZhdGUgWE1MTm9kZUFjdGlvbk1hbmFnZXIgZkFjdGlvbk1hbmFnZXI7Ci0JCXByaXZhdGUgVHJlZVZpZXdlciBmVHJlZVZpZXdlcjsKLQotCQlwdWJsaWMgQWN0aW9uTWFuYWdlck1lbnVMaXN0ZW5lcihUcmVlVmlld2VyIHZpZXdlcikgewotCQkJZlRyZWVWaWV3ZXIgPSB2aWV3ZXI7Ci0JCX0KLQotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLmFjdGlvbi5JTWVudUxpc3RlbmVyI21lbnVBYm91dFRvU2hvdyhvcmcuZWNsaXBzZS5qZmFjZS5hY3Rpb24uSU1lbnVNYW5hZ2VyKQotCQkgKi8KLQkJcHVibGljIHZvaWQgbWVudUFib3V0VG9TaG93KElNZW51TWFuYWdlciBtYW5hZ2VyKSB7Ci0JCQlpZiAoZkFjdGlvbk1hbmFnZXIgPT0gbnVsbCkgewotCQkJCWZBY3Rpb25NYW5hZ2VyID0gY3JlYXRlTm9kZUFjdGlvbk1hbmFnZXIoZlRyZWVWaWV3ZXIpOwotCQkJfQotCQkJZkFjdGlvbk1hbmFnZXIuZmlsbENvbnRleHRNZW51KG1hbmFnZXIsIGZUcmVlVmlld2VyLmdldFNlbGVjdGlvbigpKTsKLQkJfQotCi0JCS8qCi0JCSAqIChub24tSmF2YWRvYykKLQkJICogCi0JCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbnRlcm5hbC5JUmVsZWFzYWJsZSNyZWxlYXNlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHJlbGVhc2UoKSB7Ci0JCQlmVHJlZVZpZXdlciA9IG51bGw7Ci0JCQlpZiAoZkFjdGlvbk1hbmFnZXIgIT0gbnVsbCkgewotCQkJCWZBY3Rpb25NYW5hZ2VyLnNldE1vZGVsKG51bGwpOwotCQkJfQotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBBdHRyaWJ1dGVTaG93aW5nTGFiZWxQcm92aWRlciBleHRlbmRzIEpGYWNlTm9kZUxhYmVsUHJvdmlkZXIgewotCQkvKgotCQkgKiAobm9uLUphdmFkb2MpCi0JCSAqIAotCQkgKiBAc2VlIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSUxhYmVsUHJvdmlkZXIjZ2V0VGV4dChqYXZhLmxhbmcuT2JqZWN0KQotCQkgKi8KLQkJcHVibGljIFN0cmluZyBnZXRUZXh0KE9iamVjdCBvKSB7Ci0JCQlTdHJpbmdCdWZmZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWZmZXIoc3VwZXIuZ2V0VGV4dChvKSk7Ci0JCQlpZiAobyBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgbzsKLQkJCQlpZiAobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuRUxFTUVOVF9OT0RFICYmIGZTaG93QXR0cmlidXRlcykgewotCQkJCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg0NDQKLQkJCQkJaWYgKG5vZGUuaGFzQXR0cmlidXRlcygpKSB7Ci0JCQkJCQlFbGVtZW50IGVsZW1lbnQgPSAoRWxlbWVudCkgbm9kZTsKLQkJCQkJCU5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGVzKCk7Ci0JCQkJCQlOb2RlIGlkVHlwZWRBdHRyaWJ1dGUgPSBudWxsOwotCQkJCQkJTm9kZSByZXF1aXJlZEF0dHJpYnV0ZSA9IG51bGw7Ci0JCQkJCQlib29sZWFuIGhhc0lkID0gZmFsc2U7Ci0JCQkJCQlib29sZWFuIGhhc05hbWUgPSBmYWxzZTsKLQkJCQkJCU5vZGUgc2hvd25BdHRyaWJ1dGUgPSBudWxsOwotCi0JCQkJCQkvLyB0cnkgdG8gZ2V0IGNvbnRlbnQgbW9kZWwgZWxlbWVudAotCQkJCQkJLy8gZGVjbGFyYXRpb24KLQkJCQkJCUNNRWxlbWVudERlY2xhcmF0aW9uIGVsZW1lbnREZWNsID0gbnVsbDsKLQkJCQkJCU1vZGVsUXVlcnkgbXEgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KGVsZW1lbnQuZ2V0T3duZXJEb2N1bWVudCgpKTsKLQkJCQkJCWlmIChtcSAhPSBudWxsKSB7Ci0JCQkJCQkJZWxlbWVudERlY2wgPSBtcS5nZXRDTUVsZW1lbnREZWNsYXJhdGlvbihlbGVtZW50KTsKLQkJCQkJCX0KLQkJCQkJCS8vIGZpbmQgYW4gYXR0cmlidXRlIG9mIHR5cGUgKG9yIGp1c3QgbmFtZWQpCi0JCQkJCQkvLyBJRAotCQkJCQkJaWYgKGVsZW1lbnREZWNsICE9IG51bGwpIHsKLQkJCQkJCQlpbnQgaSA9IDA7Ci0JCQkJCQkJd2hpbGUgKGkgPCBhdHRyaWJ1dGVzLmdldExlbmd0aCgpICYmIGlkVHlwZWRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCQkJCQlOb2RlIGF0dHIgPSBhdHRyaWJ1dGVzLml0ZW0oaSk7Ci0JCQkJCQkJCVN0cmluZyBhdHRyTmFtZSA9IGF0dHIuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCQkJQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyRGVjbCA9IChDTUF0dHJpYnV0ZURlY2xhcmF0aW9uKSBlbGVtZW50RGVjbC5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKGF0dHJOYW1lKTsKLQkJCQkJCQkJaWYgKGF0dHJEZWNsICE9IG51bGwpIHsKLQkJCQkJCQkJCWlmICgoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKSAhPSBudWxsKSAmJiAoQ01EYXRhVHlwZS5JRC5lcXVhbHMoYXR0ckRlY2wuZ2V0QXR0clR5cGUoKS5nZXREYXRhVHlwZU5hbWUoKSkpKSB7Ci0JCQkJCQkJCQkJaWRUeXBlZEF0dHJpYnV0ZSA9IGF0dHI7Ci0JCQkJCQkJCQl9Ci0JCQkJCQkJCQllbHNlIGlmIChhdHRyRGVjbC5nZXRVc2FnZSgpID09IENNQXR0cmlidXRlRGVjbGFyYXRpb24uUkVRVUlSRUQgJiYgcmVxdWlyZWRBdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCQkJCQkJCS8vIGFzIGEgYmFja3VwLCBrZWVwIHRhYnMgb24KLQkJCQkJCQkJCQkvLyBhbnkgcmVxdWlyZWQKLQkJCQkJCQkJCQkvLyBhdHRyaWJ1dGVzCi0JCQkJCQkJCQkJcmVxdWlyZWRBdHRyaWJ1dGUgPSBhdHRyOwotCQkJCQkJCQkJfQotCQkJCQkJCQkJZWxzZSB7Ci0JCQkJCQkJCQkJaGFzSWQgPSBoYXNJZCB8fCBhdHRyTmFtZS5lcXVhbHMoImlkIik7IC8vJE5PTi1OTFMtMSQKLQkJCQkJCQkJCQloYXNOYW1lID0gaGFzTmFtZSB8fCBhdHRyTmFtZS5lcXVhbHMoIm5hbWUiKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCQkJfQotCQkJCQkJCQl9Ci0JCQkJCQkJCSsraTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0KLQkJCQkJCS8qCi0JCQkJCQkgKiBJZiBubyBzdWl0YWJsZSBhdHRyaWJ1dGUgd2FzIGZvdW5kLCB0cnkgdXNpbmcgYQotCQkJCQkJICogcmVxdWlyZWQgYXR0cmlidXRlLCBpZiBub25lLCB0aGVuIHByZWZlciAiaWQiIG9yCi0JCQkJCQkgKiAibmFtZSIsIG90aGVyd2lzZSBqdXN0IHVzZSBmaXJzdCBhdHRyaWJ1dGUKLQkJCQkJCSAqLwotCQkJCQkJaWYgKGlkVHlwZWRBdHRyaWJ1dGUgIT0gbnVsbCkgewotCQkJCQkJCXNob3duQXR0cmlidXRlID0gaWRUeXBlZEF0dHJpYnV0ZTsKLQkJCQkJCX0KLQkJCQkJCWVsc2UgaWYgKHJlcXVpcmVkQXR0cmlidXRlICE9IG51bGwpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IHJlcXVpcmVkQXR0cmlidXRlOwotCQkJCQkJfQotCQkJCQkJZWxzZSBpZiAoaGFzSWQpIHsKLQkJCQkJCQlzaG93bkF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXMuZ2V0TmFtZWRJdGVtKCJpZCIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQllbHNlIGlmIChoYXNOYW1lKSB7Ci0JCQkJCQkJc2hvd25BdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldE5hbWVkSXRlbSgibmFtZSIpOyAvLyROT04tTkxTLTEkCi0JCQkJCQl9Ci0JCQkJCQlpZiAoc2hvd25BdHRyaWJ1dGUgPT0gbnVsbCkgewotCQkJCQkJCXNob3duQXR0cmlidXRlID0gYXR0cmlidXRlcy5pdGVtKDApOwotCQkJCQkJfQotCi0JCQkJCQkvLyBkaXNwbGF5IHRoZSBhdHRyaWJ1dGUgYW5kIHZhbHVlICh3aXRob3V0IHF1b3RlcykKLQkJCQkJCVN0cmluZyBhdHRyaWJ1dGVOYW1lID0gc2hvd25BdHRyaWJ1dGUuZ2V0Tm9kZU5hbWUoKTsKLQkJCQkJCWlmIChhdHRyaWJ1dGVOYW1lICE9IG51bGwgJiYgYXR0cmlidXRlTmFtZS5sZW5ndGgoKSA+IDApIHsKLQkJCQkJCQl0ZXh0LmFwcGVuZCgiICIgKyBhdHRyaWJ1dGVOYW1lKTsgLy8kTk9OLU5MUy0xJAotCQkJCQkJCVN0cmluZyBhdHRyaWJ1dGVWYWx1ZSA9IHNob3duQXR0cmlidXRlLmdldE5vZGVWYWx1ZSgpOwotCQkJCQkJCWlmIChhdHRyaWJ1dGVWYWx1ZSAhPSBudWxsICYmIGF0dHJpYnV0ZVZhbHVlLmxlbmd0aCgpID4gMCkgewotCQkJCQkJCQl0ZXh0LmFwcGVuZCgiPSIgKyBTdHJpbmdVdGlscy5zdHJpcChhdHRyaWJ1dGVWYWx1ZSkpOyAvLyROT04tTkxTLTEkCi0JCQkJCQkJfQotCQkJCQkJfQotCQkJCQl9Ci0JCQkJfQotCQkJfQotCQkJcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLQkJfQotCX0KLQotCS8qKgotCSAqIFRvZ2dsZSBhY3Rpb24gZm9yIHdoZXRoZXIgb3Igbm90IHRvIGRpc3BsYXkgZWxlbWVudCdzIGZpcnN0IGF0dHJpYnV0ZQotCSAqLwotCXByaXZhdGUgY2xhc3MgVG9nZ2xlU2hvd0F0dHJpYnV0ZUFjdGlvbiBleHRlbmRzIFByb3BlcnR5Q2hhbmdlVXBkYXRlQWN0aW9uIHsKLQkJLy8gaHR0cHM6Ly9idWdzLmVjbGlwc2Uub3JnL2J1Z3Mvc2hvd19idWcuY2dpP2lkPTg4NDQ0Ci0JCXByaXZhdGUgVHJlZVZpZXdlciBmVHJlZVZpZXdlcjsKLQotCQlwdWJsaWMgVG9nZ2xlU2hvd0F0dHJpYnV0ZUFjdGlvbihJUHJlZmVyZW5jZVN0b3JlIHN0b3JlLCBTdHJpbmcgcHJlZmVyZW5jZSwgVHJlZVZpZXdlciB0cmVlVmlld2VyKSB7Ci0JCQlzdXBlcihYTUxVSU1lc3NhZ2VzLlhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbl8wLCBzdG9yZSwgcHJlZmVyZW5jZSwgdHJ1ZSk7Ci0JCQlzZXRUb29sVGlwVGV4dChnZXRUZXh0KCkpOwotCQkJLy8gaW1hZ2VzIG5lZWRlZAotCQkJLy8gc2V0RGlzYWJsZWRJbWFnZURlc2NyaXB0b3IoU1lOQ0VEX0QpOwotCQkJLy8gKG5zZCkgdGVtcG9yYXJpbHkgcmUtdXNlIFByb3BlcnRpZXMgdmlldyBpbWFnZQotCQkJc2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlSGVscGVyLmdldEluc3RhbmNlKCkuZ2V0SW1hZ2VEZXNjcmlwdG9yKEVkaXRvclBsdWdpbkltYWdlcy5JTUdfT0JKX1BST1BfUFMpKTsKLQkJCWZUcmVlVmlld2VyID0gdHJlZVZpZXdlcjsKLQkJCXVwZGF0ZSgpOwotCQl9Ci0KLQkJLyoKLQkJICogKG5vbi1KYXZhZG9jKQotCQkgKiAKLQkJICogQHNlZSBvcmcuZWNsaXBzZS51aS50ZXh0ZWRpdG9yLklVcGRhdGUjdXBkYXRlKCkKLQkJICovCi0JCXB1YmxpYyB2b2lkIHVwZGF0ZSgpIHsKLQkJCXN1cGVyLnVwZGF0ZSgpOwotCQkJZlNob3dBdHRyaWJ1dGVzID0gaXNDaGVja2VkKCk7Ci0KLQkJCS8vIG5vdGlmeSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY2hhbmdlCi0JCQllbmFibGVTaG93QXR0cmlidXRlcyhmU2hvd0F0dHJpYnV0ZXMsIGZUcmVlVmlld2VyKTsKLQotCQkJLy8gcmVmcmVzaCB0aGUgb3V0bGluZSB2aWV3Ci0JCQlmVHJlZVZpZXdlci5yZWZyZXNoKHRydWUpOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBJQ29udGVudFByb3ZpZGVyIGZDb250ZW50UHJvdmlkZXIgPSBudWxsOwotCi0JcHJpdmF0ZSBBY3Rpb25NYW5hZ2VyTWVudUxpc3RlbmVyIGZDb250ZXh0TWVudUZpbGxlciA9IG51bGw7Ci0KLQlwcml2YXRlIElMYWJlbFByb3ZpZGVyIGZMYWJlbFByb3ZpZGVyID0gbnVsbDsKLQotCWJvb2xlYW4gZlNob3dBdHRyaWJ1dGVzID0gZmFsc2U7Ci0KLQlwcml2YXRlIFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyW10gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQlwcml2YXRlIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyczsKLQotCS8qCi0JICogUHJlZmVyZW5jZSBrZXkgZm9yIFNob3cgQXR0cmlidXRlcwotCSAqLwotCXByaXZhdGUgZmluYWwgU3RyaW5nIE9VVExJTkVfU0hPV19BVFRSSUJVVEVfUFJFRiA9ICJvdXRsaW5lLXNob3ctYXR0cmlidXRlLWVkaXRvciI7IC8vJE5PTi1OTFMtMSQKLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgWE1MQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uCi0JICovCi0JcHVibGljIFhNTENvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbigpIHsKLQkJLy8gTXVzdCBoYXZlIGVtcHR5IGNvbnN0cnVjdG9yIHRvIGNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24KLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2NyZWF0ZU1lbnVDb250cmlidXRpb25zKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwcm90ZWN0ZWQgSUNvbnRyaWJ1dGlvbkl0ZW1bXSBjcmVhdGVNZW51Q29udHJpYnV0aW9ucyhUcmVlVmlld2VyIHZpZXdlcikgewotCQlJQ29udHJpYnV0aW9uSXRlbVtdIGl0ZW1zOwotCQkvLyBodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9zaG93X2J1Zy5jZ2k/aWQ9ODg0NDQKLQkJSUNvbnRyaWJ1dGlvbkl0ZW0gc2hvd0F0dHJpYnV0ZUl0ZW0gPSBuZXcgUHJvcGVydHlDaGFuZ2VVcGRhdGVBY3Rpb25Db250cmlidXRpb25JdGVtKG5ldyBUb2dnbGVTaG93QXR0cmlidXRlQWN0aW9uKGdldFByZWZlcmVuY2VTdG9yZSgpLCBPVVRMSU5FX1NIT1dfQVRUUklCVVRFX1BSRUYsIHZpZXdlcikpOwotCQlpdGVtcyA9IHN1cGVyLmNyZWF0ZU1lbnVDb250cmlidXRpb25zKHZpZXdlcik7Ci0JCWlmIChpdGVtcyA9PSBudWxsKSB7Ci0JCQlpdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtde3Nob3dBdHRyaWJ1dGVJdGVtfTsKLQkJfQotCQllbHNlIHsKLQkJCUlDb250cmlidXRpb25JdGVtW10gY29tYmluZWRJdGVtcyA9IG5ldyBJQ29udHJpYnV0aW9uSXRlbVtpdGVtcy5sZW5ndGggKyAxXTsKLQkJCVN5c3RlbS5hcnJheWNvcHkoaXRlbXMsIDAsIGNvbWJpbmVkSXRlbXMsIDAsIGl0ZW1zLmxlbmd0aCk7Ci0JCQljb21iaW5lZEl0ZW1zW2l0ZW1zLmxlbmd0aF0gPSBzaG93QXR0cmlidXRlSXRlbTsKLQkJCWl0ZW1zID0gY29tYmluZWRJdGVtczsKLQkJfQotCQlyZXR1cm4gaXRlbXM7Ci0JfQotCi0JLyoqCi0JICogUmV0dXJucyB0aGUgTm9kZUFjdGlvbk1hbmFnZXIgdG8gdXNlIGZvciB0aGUgZ2l2ZW4gdHJlZVZpZXdlci4KLQkgKiA8cD4KLQkgKiBOb3QgQVBJLiBNYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgotCSAqIDwvcD4KLQkgKiAKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqIEByZXR1cm4gYSBub2RlIGFjdGlvbiBtYW5hZ2VyIGZvciB1c2Ugd2l0aCB0aGlzIHRyZWUgdmlld2VyCi0JICovCi0JcHJvdGVjdGVkIFhNTE5vZGVBY3Rpb25NYW5hZ2VyIGNyZWF0ZU5vZGVBY3Rpb25NYW5hZ2VyKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlyZXR1cm4gbmV3IFhNTE5vZGVBY3Rpb25NYW5hZ2VyKChJU3RydWN0dXJlZE1vZGVsKSB0cmVlVmlld2VyLmdldElucHV0KCksIHRyZWVWaWV3ZXIpOwotCX0KLQotCS8qKgotCSAqIE5vdGlmaWVzIHRoaXMgY29uZmlndXJhdGlvbiB0aGF0IHRoZSBmbGFnIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90Ci0JICogdG8gc2hvdyBhdHRyaWJ1dGUgdmFsdWVzIGluIHRoZSB0cmVlIHZpZXdlciBoYXMgY2hhbmdlZC4gVGhlIHRyZWUKLQkgKiB2aWV3ZXIgaXMgYXV0b21hdGljYWxseSByZWZyZXNoZWQgYWZ0ZXJ3YXJkcyB0byB1cGRhdGUgdGhlIGxhYmVscy4KLQkgKiAKLQkgKiBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIG1ldGhvZCwgYnV0IHJhdGhlciBzaG91bGQgcmVhY3QgdG8gaXQuCi0JICogCi0JICogQHBhcmFtIHNob3dBdHRyaWJ1dGVzCi0JICogICAgICAgICAgICBmbGFnIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdG8gc2hvdyBhdHRyaWJ1dGUgdmFsdWVzIGluCi0JICogICAgICAgICAgICB0aGUgdHJlZSB2aWV3ZXIKLQkgKiBAcGFyYW0gdHJlZVZpZXdlcgotCSAqICAgICAgICAgICAgdGhlIFRyZWVWaWV3ZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29uZmlndXJhdGlvbgotCSAqLwotCXByb3RlY3RlZCB2b2lkIGVuYWJsZVNob3dBdHRyaWJ1dGVzKGJvb2xlYW4gc2hvd0F0dHJpYnV0ZXMsIFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQkvLyBub3RoaW5nIGJ5IGRlZmF1bHQKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldENvbnRlbnRQcm92aWRlcihvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIElDb250ZW50UHJvdmlkZXIgZ2V0Q29udGVudFByb3ZpZGVyKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCWlmIChmQ29udGVudFByb3ZpZGVyID09IG51bGwpIHsKLQkJCWZDb250ZW50UHJvdmlkZXIgPSBuZXcgSkZhY2VOb2RlQ29udGVudFByb3ZpZGVyKCk7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZW50UHJvdmlkZXI7Ci0JfQotCi0JcHJpdmF0ZSBPYmplY3QgZ2V0RmlsdGVyZWROb2RlKE9iamVjdCBvYmplY3QpIHsKLQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCU5vZGUgbm9kZSA9IChOb2RlKSBvYmplY3Q7Ci0KLQkJCS8vIHJlcGxhY2UgYXR0cmlidXRlIG5vZGUgaW4gc2VsZWN0aW9uIHdpdGggaXRzIHBhcmVudAotCQkJaWYgKG5vZGUuZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkFUVFJJQlVURV9OT0RFKQotCQkJCW5vZGUgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJLy8gcmVwbGFjZSBUZXh0Tm9kZSBpbiBzZWxlY3Rpb24gd2l0aCBpdHMgcGFyZW50Ci0JCQllbHNlIGlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5URVhUX05PREUpCi0JCQkJbm9kZSA9IG5vZGUuZ2V0UGFyZW50Tm9kZSgpOwotCQkJcmV0dXJuIG5vZGU7Ci0JCX0KLQkJcmV0dXJuIG9iamVjdDsKLQl9Ci0KLQlwcml2YXRlIE9iamVjdFtdIGdldEZpbHRlcmVkTm9kZXMoT2JqZWN0W10gZmlsdGVyZWROb2RlcykgewotCQlmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlcmVkTm9kZXMubGVuZ3RoOyBpKyspIHsKLQkJCWZpbHRlcmVkTm9kZXNbaV0gPSBnZXRGaWx0ZXJlZE5vZGUoZmlsdGVyZWROb2Rlc1tpXSk7Ci0JCX0KLQkJcmV0dXJuIGZpbHRlcmVkTm9kZXM7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRMYWJlbFByb3ZpZGVyKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlcikKLQkgKi8KLQlwdWJsaWMgSUxhYmVsUHJvdmlkZXIgZ2V0TGFiZWxQcm92aWRlcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkxhYmVsUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZkxhYmVsUHJvdmlkZXIgPSBuZXcgQXR0cmlidXRlU2hvd2luZ0xhYmVsUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZkxhYmVsUHJvdmlkZXI7Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRNZW51TGlzdGVuZXIob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBJTWVudUxpc3RlbmVyIGdldE1lbnVMaXN0ZW5lcihUcmVlVmlld2VyIHZpZXdlcikgewotCQlpZiAoZkNvbnRleHRNZW51RmlsbGVyID09IG51bGwpIHsKLQkJCWZDb250ZXh0TWVudUZpbGxlciA9IG5ldyBBY3Rpb25NYW5hZ2VyTWVudUxpc3RlbmVyKHZpZXdlcik7Ci0JCX0KLQkJcmV0dXJuIGZDb250ZXh0TWVudUZpbGxlcjsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFByZWZlcmVuY2VTdG9yZSgpCi0JICovCi0JcHJvdGVjdGVkIElQcmVmZXJlbmNlU3RvcmUgZ2V0UHJlZmVyZW5jZVN0b3JlKCkgewotCQlyZXR1cm4gWE1MVUlQbHVnaW4uZ2V0RGVmYXVsdCgpLmdldFByZWZlcmVuY2VTdG9yZSgpOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jZ2V0U2VsZWN0aW9uKG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuVHJlZVZpZXdlciwKLQkgKiAgICAgIG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVNlbGVjdGlvbikKLQkgKi8KLQlwdWJsaWMgSVNlbGVjdGlvbiBnZXRTZWxlY3Rpb24oVHJlZVZpZXdlciB2aWV3ZXIsIElTZWxlY3Rpb24gc2VsZWN0aW9uKSB7Ci0JCUlTZWxlY3Rpb24gZmlsdGVyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJT2JqZWN0W10gZmlsdGVyZWROb2RlcyA9IGdldEZpbHRlcmVkTm9kZXMoKChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uKS50b0FycmF5KCkpOwotCQkJZmlsdGVyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihmaWx0ZXJlZE5vZGVzKTsKLQkJfQotCQlyZXR1cm4gZmlsdGVyZWRTZWxlY3Rpb247Ci0JfQotCi0JLyoKLQkgKiAobm9uLUphdmFkb2MpCi0JICogCi0JICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLmNvbnRlbnRvdXRsaW5lLkNvbnRlbnRPdXRsaW5lQ29uZmlndXJhdGlvbiNnZXRUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyBUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcltdIGdldFRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVycyhUcmVlVmlld2VyIHRyZWVWaWV3ZXIpIHsKLQkJaWYgKGZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPT0gbnVsbCkgewotCQkJLy8gZW11bGF0ZSB0aGUgWE1MRHJhZ0FuZERyb3BNYW5hZ2VyCi0JCQlmaW5hbCBWaWV3ZXJEcmFnQWRhcHRlciBkcmFnQWRhcHRlciA9IG5ldyBWaWV3ZXJEcmFnQWRhcHRlcih0cmVlVmlld2VyKTsKLQkJCWZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPSBuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXJbXXtuZXcgVHJhbnNmZXJEcmFnU291cmNlTGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZHJhZ0ZpbmlzaGVkKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlkcmFnQWRhcHRlci5kcmFnRmluaXNoZWQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdTZXREYXRhKERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlkcmFnQWRhcHRlci5kcmFnU2V0RGF0YShldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJhZ1N0YXJ0KERyYWdTb3VyY2VFdmVudCBldmVudCkgewotCQkJCQlkcmFnQWRhcHRlci5kcmFnU3RhcnQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyBUcmFuc2ZlciBnZXRUcmFuc2ZlcigpIHsKLQkJCQkJcmV0dXJuIE9iamVjdFRyYW5zZmVyLmdldEluc3RhbmNlKCk7Ci0JCQkJfQotCQkJfX07Ci0JCX0KLQotCQlyZXR1cm4gZlRyYW5zZmVyRHJhZ1NvdXJjZUxpc3RlbmVyczsKLQl9Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MuY29udGVudG91dGxpbmUuQ29udGVudE91dGxpbmVDb25maWd1cmF0aW9uI2dldFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyhvcmcuZWNsaXBzZS5qZmFjZS52aWV3ZXJzLlRyZWVWaWV3ZXIpCi0JICovCi0JcHVibGljIFRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVyW10gZ2V0VHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzKFRyZWVWaWV3ZXIgdHJlZVZpZXdlcikgewotCQlpZiAoZlRyYW5zZmVyRHJvcFRhcmdldExpc3RlbmVycyA9PSBudWxsKSB7Ci0JCQkvLyBlbXVsYXRlIHRoZSBYTUxEcmFnQW5Ecm9wTWFuYWdlcgotCQkJZmluYWwgVmlld2VyRHJvcEFkYXB0ZXIgZHJvcEFkYXB0ZXIgPSBuZXcgVmlld2VyRHJvcEFkYXB0ZXIodHJlZVZpZXdlciwgbmV3IFhNTERyYWdBbmREcm9wTWFuYWdlcigpKTsKLQkJCWZUcmFuc2ZlckRyb3BUYXJnZXRMaXN0ZW5lcnMgPSBuZXcgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJbXXtuZXcgVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXIoKSB7Ci0JCQkJcHVibGljIHZvaWQgZHJhZ0VudGVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlkcm9wQWRhcHRlci5kcmFnRW50ZXIoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdMZWF2ZShEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJhZ0xlYXZlKGV2ZW50KTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgdm9pZCBkcmFnT3BlcmF0aW9uQ2hhbmdlZChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJhZ09wZXJhdGlvbkNoYW5nZWQoZXZlbnQpOwotCQkJCX0KLQotCQkJCXB1YmxpYyB2b2lkIGRyYWdPdmVyKERyb3BUYXJnZXRFdmVudCBldmVudCkgewotCQkJCQlkcm9wQWRhcHRlci5kcmFnT3ZlcihldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJvcChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJvcChldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIHZvaWQgZHJvcEFjY2VwdChEcm9wVGFyZ2V0RXZlbnQgZXZlbnQpIHsKLQkJCQkJZHJvcEFkYXB0ZXIuZHJvcEFjY2VwdChldmVudCk7Ci0JCQkJfQotCi0JCQkJcHVibGljIFRyYW5zZmVyIGdldFRyYW5zZmVyKCkgewotCQkJCQlyZXR1cm4gT2JqZWN0VHJhbnNmZXIuZ2V0SW5zdGFuY2UoKTsKLQkJCQl9Ci0KLQkJCQlwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoRHJvcFRhcmdldEV2ZW50IGV2ZW50KSB7Ci0JCQkJCXJldHVybiBnZXRUcmFuc2ZlcigpLmlzU3VwcG9ydGVkVHlwZShldmVudC5jdXJyZW50RGF0YVR5cGUpOwotCQkJCX0KLQkJCX19OwotCQl9Ci0JCXJldHVybiBmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzOwotCX0KLQotCS8qCi0JICogKG5vbi1KYXZhZG9jKQotCSAqIAotCSAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnNzZS51aS52aWV3cy5jb250ZW50b3V0bGluZS5Db250ZW50T3V0bGluZUNvbmZpZ3VyYXRpb24jdW5jb25maWd1cmUob3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5UcmVlVmlld2VyKQotCSAqLwotCXB1YmxpYyB2b2lkIHVuY29uZmlndXJlKFRyZWVWaWV3ZXIgdmlld2VyKSB7Ci0JCXN1cGVyLnVuY29uZmlndXJlKHZpZXdlcik7Ci0JCWZUcmFuc2ZlckRyYWdTb3VyY2VMaXN0ZW5lcnMgPSBudWxsOwotCQlmVHJhbnNmZXJEcm9wVGFyZ2V0TGlzdGVuZXJzID0gbnVsbDsKLQkJaWYgKGZDb250ZXh0TWVudUZpbGxlciAhPSBudWxsKSB7Ci0JCQlmQ29udGV4dE1lbnVGaWxsZXIucmVsZWFzZSgpOwotCQkJZkNvbnRleHRNZW51RmlsbGVyID0gbnVsbDsKLQkJfQotCX0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvc3JjL29yZy9lY2xpcHNlL3dzdC94bWwvdWkvdmlld3MvcHJvcGVydGllcy9YTUxQcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTc4MDU1Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3htbC91aS92aWV3cy9wcm9wZXJ0aWVzL1hNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqICAgICBKZW5zIEx1a293c2tpL0lubm9vcHJhY3QgLSBpbml0aWFsIHJlbmFtaW5nL3Jlc3RydWN0dXJpbmcKLSAqICAgICAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnZpZXdzLnByb3BlcnRpZXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklQcm9ncmVzc01vbml0b3I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLklTdGF0dXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlN0YXR1czsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuam9icy5Kb2I7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5JU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpmYWNlLnZpZXdlcnMuSVN0cnVjdHVyZWRTZWxlY3Rpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UuamZhY2Uudmlld2Vycy5TdHJ1Y3R1cmVkU2VsZWN0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLklXb3JrYmVuY2hQYXJ0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnByb2dyZXNzLlVJSm9iOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U2hlZXRQYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnVpLnZpZXdzLnByb3BlcnRpZXMuSVByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmVjbGlwc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0UGFnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3Quc3NlLmNvcmUuaW50ZXJuYWwucHJvdmlzaW9uYWwuSU5vZGVBZGFwdGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZS5pbnRlcm5hbC5wcm92aXNpb25hbC5JTm9kZU5vdGlmaWVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudmlld3MucHJvcGVydGllcy5Qcm9wZXJ0eVNoZWV0Q29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5tb2RlbHF1ZXJ5LkNNRG9jdW1lbnRNYW5hZ2VyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5DTURvY3VtZW50TWFuYWdlckxpc3RlbmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwubW9kZWxxdWVyeS5Nb2RlbFF1ZXJ5OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5DTURvY3VtZW50Q2FjaGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLm1vZGVscXVlcnkuTW9kZWxRdWVyeVV0aWw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnByb3Zpc2lvbmFsLmRvY3VtZW50LklET01Ob2RlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwuWE1MVUlNZXNzYWdlczsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnByb3BlcnRpZXMuWE1MUHJvcGVydHlTb3VyY2U7Ci1pbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLS8qKgotICogQ29uZmlndXJhdGlvbiBmb3IgcHJvcGVydHkgc2hlZXQgcGFnZSB3aGljaCBzaG93cyBYTUwgY29udGVudC4KLSAqIAotICogQHNlZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnZpZXdzLnByb3BlcnRpZXMuUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLSAqIEBzaW5jZSAxLjAKLSAqLwotcHVibGljIGNsYXNzIFhNTFByb3BlcnR5U2hlZXRDb25maWd1cmF0aW9uIGV4dGVuZHMgUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24gewotCXByaXZhdGUgY2xhc3MgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyIHsKLQkJcHVibGljIHZvaWQgY2FjaGVDbGVhcmVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSkgewotCQkJLy8gbm90aGluZyB0byBkbwotCQl9Ci0KLQkJcHVibGljIHZvaWQgY2FjaGVVcGRhdGVkKENNRG9jdW1lbnRDYWNoZSBjYWNoZSwgZmluYWwgU3RyaW5nIHVyaSwgaW50IG9sZFN0YXR1cywgaW50IG5ld1N0YXR1cywgQ01Eb2N1bWVudCBjbURvY3VtZW50KSB7Ci0JCQlpZiAobmV3U3RhdHVzID09IENNRG9jdW1lbnRDYWNoZS5TVEFUVVNfTE9BREVEIHx8IG5ld1N0YXR1cyA9PSBDTURvY3VtZW50Q2FjaGUuU1RBVFVTX0VSUk9SKSB7Ci0JCQkJcmVmcmVzaFBhZ2VzKCk7Ci0JCQl9Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBwcm9wZXJ0eUNoYW5nZWQoQ01Eb2N1bWVudE1hbmFnZXIgY21Eb2N1bWVudE1hbmFnZXIsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKLQkJCWlmIChjbURvY3VtZW50TWFuYWdlci5nZXRQcm9wZXJ0eUVuYWJsZWQoQ01Eb2N1bWVudE1hbmFnZXIuUFJPUEVSVFlfQVVUT19MT0FEKSkgewotCQkJCXJlZnJlc2hQYWdlcygpOwotCQkJfQotCQl9Ci0KLQkJcHJpdmF0ZSB2b2lkIHJlZnJlc2hQYWdlcygpIHsKLQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuYWRkUHJvcGVydHlTaGVldFBhZ2UoZlByb3BlcnR5U2hlZXRQYWdlKTsKLQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuc2NoZWR1bGUoUHJvcGVydGllc1JlZnJlc2hKb2IuVVBEQVRFX0RFTEFZKTsKLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgUHJvcGVydGllc1JlZnJlc2hKb2IgZXh0ZW5kcyBVSUpvYiB7Ci0JCXB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVQREFURV9ERUxBWSA9IDIwMDsKLQotCQlwcml2YXRlIFNldCBwcm9wZXJ0eVNoZWV0UGFnZXMgPSBudWxsOwotCi0JCXB1YmxpYyBQcm9wZXJ0aWVzUmVmcmVzaEpvYigpIHsKLQkJCXN1cGVyKFhNTFVJTWVzc2FnZXMuSkZhY2VOb2RlQWRhcHRlcl8xKTsKLQkJCXNldFN5c3RlbSh0cnVlKTsKLQkJCXNldFByaW9yaXR5KEpvYi5TSE9SVCk7Ci0JCQlwcm9wZXJ0eVNoZWV0UGFnZXMgPSBuZXcgSGFzaFNldCgxKTsKLQkJfQotCi0JCXZvaWQgYWRkUHJvcGVydHlTaGVldFBhZ2UoSVByb3BlcnR5U2hlZXRQYWdlIHBhZ2UpIHsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcy5hZGQocGFnZSk7Ci0JCQlzY2hlZHVsZShVUERBVEVfREVMQVkpOwotCQl9Ci0KLQkJcHVibGljIElTdGF0dXMgcnVuSW5VSVRocmVhZChJUHJvZ3Jlc3NNb25pdG9yIG1vbml0b3IpIHsKLQkJCU9iamVjdFtdIHBhZ2VzID0gcHJvcGVydHlTaGVldFBhZ2VzLnRvQXJyYXkoKTsKLQkJCXByb3BlcnR5U2hlZXRQYWdlcy5jbGVhcigpOwotCi0JCQlmb3IgKGludCBpID0gMDsgaSA8IHBhZ2VzLmxlbmd0aDsgaSsrKSB7Ci0JCQkJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSA9IChQcm9wZXJ0eVNoZWV0UGFnZSkgcGFnZXNbaV07Ci0JCQkJaWYgKHBhZ2UuZ2V0Q29udHJvbCgpICE9IG51bGwgJiYgIXBhZ2UuZ2V0Q29udHJvbCgpLmlzRGlzcG9zZWQoKSkgewotCQkJCQlwYWdlLnJlZnJlc2goKTsKLQkJCQl9Ci0JCQl9Ci0KLQkJCXJldHVybiBTdGF0dXMuT0tfU1RBVFVTOwotCQl9Ci0JfQotCi0JcHJpdmF0ZSBjbGFzcyBYTUxQcm9wZXJ0eVNoZWV0UmVmcmVzaEFkYXB0ZXIgaW1wbGVtZW50cyBJTm9kZUFkYXB0ZXIgewotCQlwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKSB7Ci0JCQlyZXR1cm4gZmFsc2U7Ci0JCX0KLQotCQlwdWJsaWMgdm9pZCBub3RpZnlDaGFuZ2VkKElOb2RlTm90aWZpZXIgbm90aWZpZXIsIGludCBldmVudFR5cGUsIE9iamVjdCBjaGFuZ2VkRmVhdHVyZSwgT2JqZWN0IG9sZFZhbHVlLCBPYmplY3QgbmV3VmFsdWUsIGludCBwb3MpIHsKLQkJCWlmIChmUHJvcGVydHlTaGVldFBhZ2UgIT0gbnVsbCkgewotCQkJCWdldFByb3BlcnRpZXNSZWZyZXNoSm9iKCkuYWRkUHJvcGVydHlTaGVldFBhZ2UoZlByb3BlcnR5U2hlZXRQYWdlKTsKLQkJCX0KLQkJfQotCX0KLQotCXByaXZhdGUgY2xhc3MgWE1MUHJvcGVydHlTb3VyY2VQcm92aWRlciBpbXBsZW1lbnRzIElQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyIHsKLQkJcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2UgZlByb3BlcnR5U291cmNlID0gbnVsbDsKLQkJcHJpdmF0ZSBJTm9kZU5vdGlmaWVyIGZTb3VyY2UgPSBudWxsOwotCi0JCXB1YmxpYyBJUHJvcGVydHlTb3VyY2UgZ2V0UHJvcGVydHlTb3VyY2UoT2JqZWN0IG9iamVjdCkgewotCQkJaWYgKGZTb3VyY2UgIT0gbnVsbCAmJiBvYmplY3QuZXF1YWxzKGZTb3VyY2UpKSB7Ci0JCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJCX0KLQotCQkJaWYgKG9iamVjdCBpbnN0YW5jZW9mIElET01Ob2RlKSB7Ci0JCQkJZlNvdXJjZSA9IChJTm9kZU5vdGlmaWVyKSBvYmplY3Q7Ci0JCQkJZlByb3BlcnR5U291cmNlID0gKElQcm9wZXJ0eVNvdXJjZSkgZlNvdXJjZS5nZXRBZGFwdGVyRm9yKElQcm9wZXJ0eVNvdXJjZS5jbGFzcyk7Ci0JCQkJaWYgKGZQcm9wZXJ0eVNvdXJjZSA9PSBudWxsKSB7Ci0JCQkJCWZQcm9wZXJ0eVNvdXJjZSA9IG5ldyBYTUxQcm9wZXJ0eVNvdXJjZSgoSU5vZGVOb3RpZmllcikgb2JqZWN0KTsKLQkJCQl9Ci0JCQl9Ci0JCQllbHNlIHsKLQkJCQlmU291cmNlID0gbnVsbDsKLQkJCQlmUHJvcGVydHlTb3VyY2UgPSBudWxsOwotCQkJfQotCQkJcmV0dXJuIGZQcm9wZXJ0eVNvdXJjZTsKLQkJfQotCX0KLQotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwgZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lckltcGwoKTsKLQlwcml2YXRlIFByb3BlcnRpZXNSZWZyZXNoSm9iIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYiA9IG51bGw7Ci0JSVByb3BlcnR5U2hlZXRQYWdlIGZQcm9wZXJ0eVNoZWV0UGFnZSA9IG51bGw7Ci0JcHJpdmF0ZSBJUHJvcGVydHlTb3VyY2VQcm92aWRlciBmUHJvcGVydHlTb3VyY2VQcm92aWRlciA9IG51bGw7Ci0JcHJpdmF0ZSBJTm9kZUFkYXB0ZXIgZlJlZnJlc2hBZGFwdGVyID0gbmV3IFhNTFByb3BlcnR5U2hlZXRSZWZyZXNoQWRhcHRlcigpOwotCXByaXZhdGUgQ01Eb2N1bWVudE1hbmFnZXJbXSBmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnMgPSBuZXcgQ01Eb2N1bWVudE1hbmFnZXJbMF07Ci0JcHJpdmF0ZSBJTm9kZU5vdGlmaWVyW10gZlNlbGVjdGVkTm90aWZpZXJzID0gbmV3IElOb2RlTm90aWZpZXJbMF07Ci0KLQotCS8qKgotCSAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24KLQkgKi8KLQlwdWJsaWMgWE1MUHJvcGVydHlTaGVldENvbmZpZ3VyYXRpb24oKSB7Ci0JCS8vIE11c3QgaGF2ZSBlbXB0eSBjb25zdHJ1Y3RvciB0byBjcmVhdGVFeGVjdXRhYmxlRXh0ZW5zaW9uCi0JCXN1cGVyKCk7Ci0JfQotCi0JcHVibGljIElTZWxlY3Rpb24gZ2V0SW5wdXRTZWxlY3Rpb24oSVdvcmtiZW5jaFBhcnQgc2VsZWN0aW5nUGFydCwgSVNlbGVjdGlvbiBzZWxlY3Rpb24pIHsKLQkJaWYgKGZTZWxlY3RlZE5vdGlmaWVycyAhPSBudWxsKSB7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGZTZWxlY3RlZE5vdGlmaWVycy5sZW5ndGg7IGkrKykgewotCQkJCWZTZWxlY3RlZE5vdGlmaWVyc1tpXS5yZW1vdmVBZGFwdGVyKGZSZWZyZXNoQWRhcHRlcik7Ci0JCQl9Ci0JCQlmU2VsZWN0ZWROb3RpZmllcnMgPSBudWxsOwotCQl9Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZlNlbGVjdGVkQ01Eb2N1bWVudE1hbmFnZXJzLmxlbmd0aDsgaSsrKSB7Ci0JCQlmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnNbaV0ucmVtb3ZlTGlzdGVuZXIoZkNNRG9jdW1lbnRNYW5hZ2VyTGlzdGVuZXIpOwotCQl9Ci0KLQkJSVNlbGVjdGlvbiBwcmVmZXJyZWRTZWxlY3Rpb24gPSBzZWxlY3Rpb247Ci0JCWlmIChzZWxlY3Rpb24gaW5zdGFuY2VvZiBJU3RydWN0dXJlZFNlbGVjdGlvbikgewotCQkJSVN0cnVjdHVyZWRTZWxlY3Rpb24gc3RydWN0dXJlZFNlbCA9IChJU3RydWN0dXJlZFNlbGVjdGlvbikgc2VsZWN0aW9uOwotCi0JCQkvKgotCQkJICogT24gQXR0ciBub2Rlcywgc2VsZWN0IHRoZSBvd25lciBFbGVtZW50LiBPbiBUZXh0IG5vZGVzLCBzZWxlY3QKLQkJCSAqIHRoZSBwYXJlbnQgRWxlbWVudC4KLQkJCSAqLwotCQkJT2JqZWN0W10gc2VsZWN0ZWRPYmplY3RzID0gbmV3IE9iamVjdFtzdHJ1Y3R1cmVkU2VsLnNpemUoKV07Ci0JCQlTeXN0ZW0uYXJyYXljb3B5KHN0cnVjdHVyZWRTZWwudG9BcnJheSgpLCAwLCBzZWxlY3RlZE9iamVjdHMsIDAsIHNlbGVjdGVkT2JqZWN0cy5sZW5ndGgpOwotCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQlPYmplY3QgaW5vZGUgPSBzZWxlY3RlZE9iamVjdHNbaV07Ci0JCQkJaWYgKGlub2RlIGluc3RhbmNlb2YgTm9kZSkgewotCQkJCQlOb2RlIG5vZGUgPSAoTm9kZSkgaW5vZGU7Ci0JCQkJCS8vIHJlcGxhY2UgQXR0cmlidXRlIE5vZGUgd2l0aCBpdHMgb3duZXIKLQkJCQkJTm9kZSBwYXJlbnROb2RlID0gbm9kZS5nZXRQYXJlbnROb2RlKCk7Ci0JCQkJCWlmIChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5BVFRSSUJVVEVfTk9ERSkgewotCQkJCQkJRWxlbWVudCBvd25lckVsZW1lbnQgPSAoKEF0dHIpIG5vZGUpLmdldE93bmVyRWxlbWVudCgpOwotCQkJCQkJc2VsZWN0ZWRPYmplY3RzW2ldID0gb3duZXJFbGVtZW50OwotCQkJCQl9Ci0JCQkJCS8vIHJlcGxhY2UgVGV4dCBOb2RlIHdpdGggaXRzIHBhcmVudAotCQkJCQllbHNlIGlmICgobm9kZS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFIHx8IChub2RlLmdldE5vZGVUeXBlKCkgPT0gTm9kZS5DREFUQV9TRUNUSU9OX05PREUpKSAmJiBwYXJlbnROb2RlICE9IG51bGwpIHsKLQkJCQkJCXNlbGVjdGVkT2JqZWN0c1tpXSA9IHBhcmVudE5vZGU7Ci0JCQkJCX0KLQkJCQl9Ci0JCQl9Ci0KLQkJCWlmIChzZWxlY3RlZE9iamVjdHMubGVuZ3RoID4gMCkgewotCQkJCVNldCBtYW5hZ2VycyA9IG5ldyBIYXNoU2V0KDEpOwotCQkJCVNldCBzZWxlY3RlZE5vdGlmaWVycyA9IG5ldyBIYXNoU2V0KDEpOwotCi0JCQkJZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxlY3RlZE9iamVjdHMubGVuZ3RoOyBpKyspIHsKLQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIE5vZGUpIHsKLQkJCQkJCU1vZGVsUXVlcnkgcXVlcnkgPSBNb2RlbFF1ZXJ5VXRpbC5nZXRNb2RlbFF1ZXJ5KCgoTm9kZSkgc2VsZWN0ZWRPYmplY3RzW2ldKS5nZXRPd25lckRvY3VtZW50KCkpOwotCQkJCQkJaWYgKHF1ZXJ5ICE9IG51bGwpIHsKLQkJCQkJCQlDTURvY3VtZW50TWFuYWdlciBtZ3IgPSBxdWVyeS5nZXRDTURvY3VtZW50TWFuYWdlcigpOwotCQkJCQkJCWlmIChtZ3IgIT0gbnVsbCkgewotCQkJCQkJCQltYW5hZ2Vycy5hZGQobWdyKTsKLQkJCQkJCQkJbWdyLmFkZExpc3RlbmVyKGZDTURvY3VtZW50TWFuYWdlckxpc3RlbmVyKTsKLQkJCQkJCQl9Ci0JCQkJCQl9Ci0JCQkJCX0KLQkJCQkJLyoKLQkJCQkJICogQWRkIFVJIHJlZnJlc2ggYWRhcHRlcnMgYW5kIHJlbWVtYmVyIG5vdGlmaWVycyBmb3IKLQkJCQkJICogbGF0ZXIgcmVtb3ZhbAotCQkJCQkgKi8KLQkJCQkJaWYgKHNlbGVjdGVkT2JqZWN0c1tpXSBpbnN0YW5jZW9mIElOb2RlTm90aWZpZXIpIHsKLQkJCQkJCXNlbGVjdGVkTm90aWZpZXJzLmFkZChzZWxlY3RlZE9iamVjdHNbaV0pOwotCQkJCQkJKChJTm9kZU5vdGlmaWVyKSBzZWxlY3RlZE9iamVjdHNbaV0pLmFkZEFkYXB0ZXIoZlJlZnJlc2hBZGFwdGVyKTsKLQkJCQkJfQotCQkJCX0KLQkJCQlmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnMgPSAoQ01Eb2N1bWVudE1hbmFnZXJbXSkgbWFuYWdlcnMudG9BcnJheShuZXcgQ01Eb2N1bWVudE1hbmFnZXJbbWFuYWdlcnMuc2l6ZSgpXSk7Ci0JCQkJZlNlbGVjdGVkTm90aWZpZXJzID0gKElOb2RlTm90aWZpZXJbXSkgc2VsZWN0ZWROb3RpZmllcnMudG9BcnJheShuZXcgSU5vZGVOb3RpZmllcltzZWxlY3RlZE5vdGlmaWVycy5zaXplKCldKTsKLQkJCX0KLQotCi0JCQlwcmVmZXJyZWRTZWxlY3Rpb24gPSBuZXcgU3RydWN0dXJlZFNlbGVjdGlvbihzZWxlY3RlZE9iamVjdHMpOwotCQl9Ci0JCXJldHVybiBwcmVmZXJyZWRTZWxlY3Rpb247Ci0JfQotCi0JUHJvcGVydGllc1JlZnJlc2hKb2IgZ2V0UHJvcGVydGllc1JlZnJlc2hKb2IoKSB7Ci0JCWlmIChmUHJvcGVydGllc1JlZnJlc2hKb2IgPT0gbnVsbCkgewotCQkJZlByb3BlcnRpZXNSZWZyZXNoSm9iID0gbmV3IFByb3BlcnRpZXNSZWZyZXNoSm9iKCk7Ci0JCX0KLQkJcmV0dXJuIGZQcm9wZXJ0aWVzUmVmcmVzaEpvYjsKLQl9Ci0KLQlwdWJsaWMgSVByb3BlcnR5U291cmNlUHJvdmlkZXIgZ2V0UHJvcGVydHlTb3VyY2VQcm92aWRlcihJUHJvcGVydHlTaGVldFBhZ2UgcGFnZSkgewotCQlpZiAoZlByb3BlcnR5U291cmNlUHJvdmlkZXIgPT0gbnVsbCkgewotCQkJZlByb3BlcnR5U2hlZXRQYWdlID0gcGFnZTsKLQkJCWZQcm9wZXJ0eVNvdXJjZVByb3ZpZGVyID0gbmV3IFhNTFByb3BlcnR5U291cmNlUHJvdmlkZXIoKTsKLQkJfQotCQlyZXR1cm4gZlByb3BlcnR5U291cmNlUHJvdmlkZXI7Ci0JfQotCi0KLQlwdWJsaWMgdm9pZCB1bmNvbmZpZ3VyZSgpIHsKLQkJc3VwZXIudW5jb25maWd1cmUoKTsKLQkJZm9yIChpbnQgaSA9IDA7IGkgPCBmU2VsZWN0ZWRDTURvY3VtZW50TWFuYWdlcnMubGVuZ3RoOyBpKyspIHsKLQkJCWZTZWxlY3RlZENNRG9jdW1lbnRNYW5hZ2Vyc1tpXS5yZW1vdmVMaXN0ZW5lcihmQ01Eb2N1bWVudE1hbmFnZXJMaXN0ZW5lcik7Ci0JCX0KLQkJZlByb3BlcnR5U2hlZXRQYWdlID0gbnVsbDsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMWFlZjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpL3RlbXBsYXRlcy94bWxkZWZhdWx0LXRlbXBsYXRlcy5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIEplbnMgTHVrb3dza2kvSW5ub29wcmFjdCAtIGluaXRpYWwgcmVuYW1pbmcvcmVzdHJ1Y3R1cmluZwotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1UZW1wbGF0ZXMuY29tbWVudC5uYW1lPWNvbW1lbnQKLVRlbXBsYXRlcy5jb21tZW50LmRlc2M9eG1sIGNvbW1lbnQKLVRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbi5uYW1lPXhtbCBkZWNsYXJhdGlvbgotVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2M9eG1sIGRlY2xhcmF0aW9uCi1UZW1wbGF0ZXMueHNscGkubmFtZT1YU0wgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbgotVGVtcGxhdGVzLnhzbHBpLmRlc2M9WFNMIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54bWwudWkvdGVtcGxhdGVzL3htbGRlZmF1bHQtdGVtcGxhdGVzLnhtbCBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjdkMjA2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS90ZW1wbGF0ZXMveG1sZGVmYXVsdC10ZW1wbGF0ZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHRlbXBsYXRlcz4KLTx0ZW1wbGF0ZSBuYW1lPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLm5hbWUiIGRlc2NyaXB0aW9uPSIlVGVtcGxhdGVzLnhtbGRlY2xhcmF0aW9uLmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy54bWxkZWNsYXJhdGlvbiIgY29udGV4dD0ieG1sX25ldyIgZW5hYmxlZD0idHJ1ZSI+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJHtlbmNvZGluZ30iPyZndDs8L3RlbXBsYXRlPgotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMuY29tbWVudC5uYW1lIiBkZXNjcmlwdGlvbj0iJVRlbXBsYXRlcy5jb21tZW50LmRlc2MiIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLnRlbXBsYXRlcy5jb21tZW50IiBjb250ZXh0PSJ4bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7IS0tICR7Y3Vyc29yfSAtLSZndDs8L3RlbXBsYXRlPgotPHRlbXBsYXRlIG5hbWU9IiVUZW1wbGF0ZXMueHNscGkubmFtZSIgZGVzY3JpcHRpb249IiVUZW1wbGF0ZXMueHNscGkuZGVzYyIgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWwudWkuaW50ZXJuYWwudGVtcGxhdGVzLnhzbHBpIiBjb250ZXh0PSJ4bWxfdGFnIiBlbmFibGVkPSJ0cnVlIj4mbHQ7P3htbC1zdHlsZXNoZWV0IHR5cGU9InRleHQveHNsIiBocmVmPSIke2N1cnNvcn0iPyZndDs8L3RlbXBsYXRlPgotCi08L3RlbXBsYXRlcz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jbGFzc3BhdGggYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY2xhc3NwYXRoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWFhZGZmLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5jbGFzc3BhdGgKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjLWNvbnRlbnRtb2RlbCIga2luZD0ic3JjIi8+Ci0JPGNsYXNzcGF0aGVudHJ5IHBhdGg9InNyYy12YWxpZGF0aW9uIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ic3JjIiBraW5kPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UuamR0LmxhdW5jaGluZy5KUkVfQ09OVEFJTkVSIiBraW5kPSJjb24iLz4KLQk8Y2xhc3NwYXRoZW50cnkgcGF0aD0ib3JnLmVjbGlwc2UucGRlLmNvcmUucmVxdWlyZWRQbHVnaW5zIiBraW5kPSJjb24iPgotCQk8YWNjZXNzcnVsZXM+Ci0JCQk8YWNjZXNzcnVsZSBraW5kPSJhY2Nlc3NpYmxlIiBwYXR0ZXJuPSJvcmcvZWNsaXBzZS93c3QvKioiLz4KLQkJPC9hY2Nlc3NydWxlcz4KLQk8L2NsYXNzcGF0aGVudHJ5PgotCTxjbGFzc3BhdGhlbnRyeSBwYXRoPSJiaW4iIGtpbmQ9Im91dHB1dCIvPgotPC9jbGFzc3BhdGg+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY3ZzaWdub3JlIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkZDdkZS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4KLXRlbXAuZm9sZGVyCi1idWlsZC54bWwKLUBkb3QKLXNyYy56aXAKLWphdmFDb21waWxlci4uLmFyZ3MKZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5wcm9qZWN0IGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWY4ZWYuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QueHNkLmNvcmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhYnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UuamR0LmNvcmUuamF2YW5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzU3NTAuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBBcHIgMTcgMDE6NDg6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1saW5lLnNlcGFyYXRvcj1cclxuCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmN2JhYzcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1NhdCBBdWcgMTkgMTY6MzE6NDMgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAxYzdhZC4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi0jTW9uIEFwciAxNyAwMTo0ODozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0Ci1vcmcuZWNsaXBzZS5qZHQudWkudGV4dC5jdXN0b21fY29kZV90ZW1wbGF0ZXM9PD94bWwgdmVyc2lvblw9IjEuMCIgZW5jb2RpbmdcPSJVVEYtOCI/PlxyXG48dGVtcGxhdGVzLz4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTIyYmIuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSNNb24gQXByIDE3IDAyOjAxOjMzIEVEVCAyMDA2Ci1jb21waWxlcnMuaW5jb21wYXRpYmxlLWVudmlyb25tZW50PTAKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhM2Y4Mi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVfVUlfUExVR0lOX05BTUUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZTsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4xLjIwMC5xdWFsaWZpZXIKLUJ1bmRsZS1BY3RpdmF0b3I6IG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5YU0RDb3JlUGx1Z2luCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDt4LWludGVybmFsOj10cnVlLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7eC1pbnRlcm5hbDo9dHJ1ZSwKLSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWw7eC1mcmllbmRzOj0ib3JnLmVjbGlwc2Uud3N0LnhzZC51aSIsCi0gb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzO3gtZnJpZW5kczo9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLAotIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UKLVJlcXVpcmUtQnVuZGxlOiBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWU7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLmVtZi5lY29yZTtidW5kbGUtdmVyc2lvbj0iWzIuMi4wLDIuMy4wKSIsCi0gb3JnLmVjbGlwc2Uud3N0LmNvbW1vbi51cmlyZXNvbHZlcjtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UueHNkO2J1bmRsZS12ZXJzaW9uPSJbMi4yLjAsMi4zLjApIiwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmU7YnVuZGxlLXZlcnNpb249IlsxLjEuMCwxLjIuMCkiLAotIG9yZy5lY2xpcHNlLndzdC5zc2UuY29yZTtidW5kbGUtdmVyc2lvbj0iWzEuMS4wLDEuMi4wKSIsCi0gb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXM7YnVuZGxlLXZlcnNpb249IlszLjIuMCwzLjMuMCkiLAotIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uO2J1bmRsZS12ZXJzaW9uPSJbMS4xLjAsMS4yLjApIiwKLSBvcmcuYXBhY2hlLnhlcmNlcztidW5kbGUtdmVyc2lvbj0iWzIuOC4wLDIuOS4wKSIKLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCi0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2Fib3V0Lmh0bWwgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9idWlsZC5wcm9wZXJ0aWVzIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmExYmE5NS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMgICAgIAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID0gTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgLixcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sCi1qYXJzLmNvbXBpbGUub3JkZXIgPSAuCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCi1vdXRwdXQuLiA9IGJpbi8KLXNvdXJjZS4uID0gc3JjLWNvbnRlbnRtb2RlbC8sXAotICAgICAgICAgICBzcmMtdmFsaWRhdGlvbi8sXAotICAgICAgICAgICBzcmMvCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ucHJvcGVydGllcyBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWMzMmM5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSEgUHJvcGVydGllcyBmaWxlIGZvciBjb21wb25lbnQ6IFhNTCBTY2hlbWEgVmFsaWRhdG9yCi0KLSEKLSEgUGx1Z2luCi0hCi1fVUlfUExVR0lOX05BTUUgICAgICAgICAgICAgICAgICAgICAgICAgICA9IFhTRCBDb3JlIFBsdWdpbgotWFNEX0NvbnRlbnRfVHlwZT1YU0QKLQotX1VJX1hNTF9TQ0hFTUFfVkFMSURBVE9SICAgICAgICAgICAgICAgICAgPSBYTUwgU2NoZW1hIFZhbGlkYXRvcgotX1VJX1hFUkNFU19WQUxJREFUT1JfREVMRUdBVEUgICAgICAgCSAgPSBYZXJjZXMtYmFzZWQgWE1MIFNjaGVtYSBWYWxpZGF0b3IKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ueG1sIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWJhZjAxZi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTxwbHVnaW4+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuY29udGVudFR5cGVzIj4KLQkJPGNvbnRlbnQtdHlwZQotCQkJcHJpb3JpdHk9ImhpZ2giCi0JCQluYW1lPSIlWFNEX0NvbnRlbnRfVHlwZSIKLQkJCWlkPSJ4c2Rzb3VyY2UiCi0JCQliYXNlLXR5cGU9Im9yZy5lY2xpcHNlLmNvcmUucnVudGltZS54bWwiCi0JCQlkZWZhdWx0LWNoYXJzZXQ9IlVURi04IgotCQkJZmlsZS1leHRlbnNpb25zPSJ4c2QiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuZG9jdW1lbnRGYWN0b3JpZXMiPgotCQk8ZmFjdG9yeQotCQkJdHlwZT0ieHNkIgotCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLkNNRG9jdW1lbnRGYWN0b3J5WFNEIj4KLQkJPC9mYWN0b3J5PgotCTwvZXh0ZW5zaW9uPgotCQotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTwhLS0gUmVnaXN0ZXIgdGhlIFhTRCB2YWxpZGF0b3Igd2l0aCB0aGUgdmFsaWRhdGlvbiAJCS0tPgotCTwhLS0gZnJhbWV3b3JrLiAJCQkJCQkJCQkJICAgIC0tPgotCTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCTxleHRlbnNpb24KLQkJaWQ9InhzZFZhbGlkYXRvciIKLQkJbmFtZT0iJV9VSV9YTUxfU0NIRU1BX1ZBTElEQVRPUiIKLQkJcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvciI+Ci0JCTx2YWxpZGF0b3I+Ci0JCQk8ZmlsdGVyCi0JCQkJb2JqZWN0Q2xhc3M9Im9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLklGaWxlIgotCQkJCWNhc2VTZW5zaXRpdmU9ImZhbHNlIgotCQkJCW5hbWVGaWx0ZXI9IioueHNkIj4KLQkJCTwvZmlsdGVyPgotCQkJCi0JCQk8aGVscGVyCi0JCQkJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuSGVscGVyIj4KLQkJCTwvaGVscGVyPgotCQkJCi0JCQk8cnVuCi0gICAgICAgICBhc3luYz0idHJ1ZSIKLSAgICAgICAgIGNsYXNzPSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3IiCi0gICAgICAgICBlbmFibGVkPSJ0cnVlIgotICAgICAgICAgZnVsbEJ1aWxkPSJ0cnVlIgotICAgICAgICAgaW5jcmVtZW50YWw9InRydWUiPgotCQkJPC9ydW4+Ci0gICAgICAgPCEtLSA8bWFya2VySWQgbWFya2VySWRWYWx1ZT0ib3JnLmVjbGlwc2UueHNkLmRpYWdub3N0aWMiLz4tLT4KLQkJPC92YWxpZGF0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uCi0gICAgICAgcG9pbnQ9Im9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLnZhbGlkYXRvckRlbGVnYXRlcyI+Ci0gICAgCTxkZWxlZ2F0ZQotICAgICAgICAJY2xhc3M9Im9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmVjbGlwc2UuVmFsaWRhdG9yIgotCQkJbmFtZT0iJV9VSV9YRVJDRVNfVkFMSURBVE9SX0RFTEVHQVRFIgotICAgICAgICAJdGFyZ2V0PSJvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlLlhTRERlbGVnYXRpbmdWYWxpZGF0b3IiLz4KLQkgPC9leHRlbnNpb24+Ci0JIAotCSA8IS0tIGluaXRpYWxpemUgeG1sIGNvcmUgcHJlZmVyZW5jZXMgLS0+Ci0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzIj4KLQkJPGluaXRpYWxpemVyCi0JCQljbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIiIC8+Ci0JPC9leHRlbnNpb24+Ci0KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTURvY3VtZW50RmFjdG9yeVhTRC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9DTURvY3VtZW50RmFjdG9yeVhTRC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDUzZWY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Eb2N1bWVudEZhY3RvcnlYU0QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5mYWN0b3J5LkNNRG9jdW1lbnRGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYWNrYWdlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5pbXBsLlhTRFBhY2thZ2VJbXBsOwotCi0vKioKLSAqICBUaGlzIGJ1aWxkZXIgaGFuZGxlcyBidWlsZGluZyAuZHRkIC8gLnhzZCBncmFtbWFyIGZpbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBDTURvY3VtZW50RmFjdG9yeVhTRCBpbXBsZW1lbnRzIENNRG9jdW1lbnRGYWN0b3J5Ci17Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhTRF9GSUxFX1RZUEUgPSAiWFNEIjsKLQotICBwdWJsaWMgQ01Eb2N1bWVudEZhY3RvcnlYU0QoKSAKLSAgeyAgCi0gICAgLy8gaGVyZSB3ZSBjYWxsIGluaXQgb24gdGhlIFhTRCBhbmQgRFREIHBhY2thZ2VzIHRvIGF2b2lkIHN0cmFuZ2UgaW5pdGlhbGl6YXRpb24gYnVncwotICAgIC8vCi0gICAgWFNEUGFja2FnZUltcGwuaW5pdCgpOwotICAgIFhTRFBhY2thZ2UuZUlOU1RBTkNFLmdldFhTREZhY3RvcnkoKTsgIAotICB9Ci0KLSAKLSAgcHVibGljIENNRG9jdW1lbnQgY3JlYXRlQ01Eb2N1bWVudChTdHJpbmcgdXJpKQotICB7ICAgICAgICAgICAgICAgICAgCQotICAgIENNRG9jdW1lbnQgcmVzdWx0ID0gbnVsbDsKLSAgICB0cnkKLSAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgcmVzdWx0ID0gWFNESW1wbC5idWlsZENNRG9jdW1lbnQodXJpKTsgICAgIAotICAgIH0KLSAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgewotICAgIAllLnByaW50U3RhY2tUcmFjZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OyAgCi0gIH0gCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL0NNTm9kZUltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Ob2RlSW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjhhNjUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvQ01Ob2RlSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24ubm90aWZ5LmltcGwuQWRhcHRlckltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5vZGU7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBDTU5vZGVJbXBsIGV4dGVuZHMgQWRhcHRlckltcGwgaW1wbGVtZW50cyBDTU5vZGUKLXsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTiA9ICJkb2N1bWVudGF0aW9uIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9TT1VSQ0UgPSAiZG9jdW1lbnRhdGlvblNvdXJjZSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UgPSAiZG9jdW1lbnRhdGlvbkxhbmd1YWdlIjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTU9GX05PVElGSUVSID0gImtleSI7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFRklOSVRJT05fSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvZGVmaW5pdGlvbkluZm8iOwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9ERUZJTklUSU9OID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9kZWZpbml0aW9uIjsKLQotICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldEtleSgpOwotCi0gIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lLCBPYmplY3Qgb2JqZWN0KQotICB7Ci0JICAvL25vIHByb3BlcnR5ZXMgc3VwcG9ydGVkPyAKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RDTU1hbmFnZXIuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEQ01NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NmY0NWMuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RDTU1hbmFnZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuQ29yZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUuUGx1Z2luOwotCi1wdWJsaWMgY2xhc3MgWFNEQ01NYW5hZ2VyIGV4dGVuZHMgUGx1Z2luIAotewotICBwcml2YXRlIHN0YXRpYyBYU0RDTU1hbmFnZXIgaW5zdGFuY2U7Ci0gIAotICBwdWJsaWMgWFNEQ01NYW5hZ2VyKCkgCi0gIHsKLSAgICBzdXBlcigpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIFhTRENNTWFuYWdlciBnZXRJbnN0YW5jZSgpIHsKLSAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgaW5zdGFuY2UgPSBuZXcgWFNEQ01NYW5hZ2VyKCk7Ci0gICAgfQotICAgIHJldHVybiBpbnN0YW5jZTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgc3RhcnR1cCgpIHRocm93cyBDb3JlRXhjZXB0aW9uIAotICB7Ci0gICAgWFNEVHlwZVV0aWwuaW5pdGlhbGl6ZSgpOwotICAgIC8vQ29udGVudE1vZGVsTWFuYWdlci5nZXRJbnN0YW5jZSgpLnNldEluZmVycmVkR3JhbW1hckZhY3RvcnkobmV3IEluZmVycmVkR3JhbW1hckZhY3RvcnlJbXBsKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTREltcGwuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNESW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDg3MmUzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNESW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg2MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLnV0aWwuVVJJOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5FT2JqZWN0OwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuZWNvcmUucmVzb3VyY2UuaW1wbC5SZXNvdXJjZVNldEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLmltcGwuVVJJQ29udmVydGVySW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BbnlFbGVtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNQ29udGVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNRGF0YVR5cGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTURvY3VtZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01Eb2N1bWVudGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01FbGVtZW50RGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTUdyb3VwOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuQ01OYW1lZE5vZGVNYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5DTU5hbWVzcGFjZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLkNNTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5hbm5vdGF0aW9uLkFubm90YXRpb25NYXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNRGF0YVR5cGVJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Eb2N1bWVudEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC5iYXNpYy5DTUVudGl0eURlY2xhcmF0aW9uSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwuY29udGVudG1vZGVsLmJhc2ljLkNNR3JvdXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01OYW1lZE5vZGVNYXBJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwuYmFzaWMuQ01Ob2RlTGlzdEltcGw7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLmNvbnRlbnRtb2RlbC51dGlsLkNNRGVzY3JpcHRpb25CdWlsZGVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC5jb250ZW50bW9kZWwudXRpbC5OYW1lc3BhY2VJbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLnV0aWwuWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBbm5vdGF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlVXNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wb3NpdG9yOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb25jcmV0ZUNvbXBvbmVudDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29uc3RyYWludDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29udGVudFR5cGVDYXRlZ29yeTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNERWxlbWVudERlY2xhcmF0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RFbnVtZXJhdGlvbkZhY2V0OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RGb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RJbXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXA7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE1vZGVsR3JvdXBEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEUGFydGljbGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNpbXBsZVR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEV2lsZGNhcmQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLmltcGwuWFNEU2NoZW1hSW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFN3aXRjaDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7Ci1pbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKLQotLyoqCi0gKiBVdGlsaXR5IGNsYXNzIHRvIGJ1aWxkIGNtbm9kZXMgZnJvbSBYTUwgU2NoZW1hIG5vZGVzLiBUaGUgWE1MIFNjaGVtYSBtb2RlbCBpcwotICogZm91bmQgaW4gdGhlIG9yZy5lY2xpcHNlLnhzZCBwbHVnaW4uCi0gKiAKLSAqIFRPRE86IGdldE5hbWVzcGFjZVVSSSgpY3VycmVudGx5IGFsd2F5cyByZXR1cm5zICcjI2FueScuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RJbXBsCi17Ci0gIC8qCi0gICAqIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBjbW5vZGVzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBkZWZpbmVkIGluCi0gICAqIENNTm9kZUltcGwgY2xhc3M6IFBST1BFUlRZX0RPQ1VNRU5UQVRJT04gUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9TT1VSQ0UKLSAgICogUFJPUEVSVFlfRE9DVU1FTlRBVElPTl9MQU5HVUFHRSBQUk9QRVJUWV9NT0ZfTk9USUZJRVIKLSAgICogUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPIFBST1BFUlRZX0RFRklOSVRJT04KLSAgICogCi0gICAqIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MsIFhTREltcGw6Ci0gICAqIFBST1BFUlRZX0NNRE9DVU1FTlQgUFJPUEVSVFlfVVNFU19MT0NBTF9FTEVNRU5UX0RFQ0xBUkFUSU9OUwotICAgKiBQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFIFBST1BFUlRZX05TX1BSRUZJWF9RVUFMSUZJQ0FUSU9OCi0gICAqIFBST1BFUlRZX05JTExBQkxFIFBST1BFUlRZX1NQRUMKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0NNRE9DVU1FTlQgPSAiQ01Eb2N1bWVudCI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1VTRVNfTE9DQUxfRUxFTUVOVF9ERUNMQVJBVElPTlMgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3VzZXNMb2NhbEVsZW1lbnREZWNsYXJhdGlvbnMiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9pc05hbWVTcGFjZUF3YXJlIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTlNfUFJFRklYX1FVQUxJRklDQVRJT04gPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL25zUHJlZml4UXVhbGlmaWNhdGlvbiI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX05JTExBQkxFID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9uaWxsYWJsZSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX1NQRUMgPSAic3BlYyI7Ci0gIC8qCi0gICAqIHByb3BlcnRpZXMgY29tbW9uIHRvIGFsbCBDTURvY3VtZW50IG5vZGVzOiBQUk9QRVJUWV9UQVJHRVRfTkFNRVNQQUNFX1VSSQotICAgKiBQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTyBQUk9QRVJUWV9OQU1FU1BBQ0VfSU5GTwotICAgKiBQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCBQUk9QRVJUWV9BTk5PVEFUSU9OX01BUAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkgPSAiaHR0cDovL29yZy5lY2xpcHNlLndzdC9jbS9wcm9wZXJ0aWVzL3RhcmdldE5hbWVzcGFjZVVSSSI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0lNUE9SVEVEX05BTUVTUEFDRV9JTkZPID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9pbXBvcnRlZE5hbWVzcGFjZUluZm8iOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FU1BBQ0VfSU5GTyA9ICJodHRwOi8vb3JnLmVjbGlwc2Uud3N0L2NtL3Byb3BlcnRpZXMvbmFtZXNwYWNlSW5mbyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0VMRU1FTlRfRk9STV9ERUZBVUxUID0gImh0dHA6Ly9vcmcuZWNsaXBzZS53c3QvY20vcHJvcGVydGllcy9lbGVtZW50Rm9ybURlZmF1bHQiOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9BTk5PVEFUSU9OX01BUCA9ICJhbm5vdGF0aW9uTWFwIjsKLSAgLyoKLSAgICogcHJvcGVydGllcyBjb21tb24gdG8gYWxsIENNRWxlbWVudERlY2xhcmF0aW9uIG5vZGVzOiBQUk9QRVJUWV9YU0lUWVBFUwotICAgKiBQUk9QRVJUWV9ERVJJVkVEX0VMRU1FTlRfREVDTEFSQVRJT04gUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQCi0gICAqIFBST1BFUlRZX0FCU1RSQUNUCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9YU0lUWVBFUyA9ICJYU0lUeXBlcyI7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1BFUlRZX0RFUklWRURfRUxFTUVOVF9ERUNMQVJBVElPTiA9ICJEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQID0gIlN1YnN0aXR1dGlvbkdyb3VwIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQUJTVFJBQ1QgPSAiQWJzdHJhY3QiOwotICAvKioKLSAgICogRGVmaW5pdGlvbiBpbmZvIGZvciBlbGVtZW50IGRlY2xhcmF0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRklOSVRJT05fSU5GT19HTE9CQUwgPSAiZ2xvYmFsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGSU5JVElPTl9JTkZPX0xPQ0FMID0gImxvY2FsIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX0xBTkdfQVRUUklCVVRFID0gInhtbDpsYW5nIjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUExBVEZPUk1fUFJPVE9DT0wgPSAicGxhdGZvcm06IjsKLSAgcHJvdGVjdGVkIHN0YXRpYyBYU0RBZGFwdGVyRmFjdG9yeUltcGwgeHNkQWRhcHRlckZhY3RvcnlJbXBsID0gbmV3IFhTREFkYXB0ZXJGYWN0b3J5SW1wbCgpOwotICBwcm90ZWN0ZWQgc3RhdGljIFhTSURvY3VtZW50IHhzaURvY3VtZW50ID0gbmV3IFhTSURvY3VtZW50KCk7Ci0KLSAgLyoqCi0gICAqIEdpdmVuIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudCwgcGFyc2UgdGhlIGRvY3VtZW50IGFuZCBidWlsZAotICAgKiBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICogCi0gICAqIEBwYXJhbSB1cmkgLQotICAgKiAgICAgICAgICB0aGUgdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50Ci0gICAqIEBwYXJhbSBncmFtbWFyRXJyb3JDaGVja2luZyAtCi0gICAqICAgICAgICAgIGdyYW1tYXIgZXJyb3IgY2hlY2tpbmcgZmxhZwotICAgKiBAcGFyYW0gZXJyb3JMaXN0IC0KLSAgICogICAgICAgICAgdGhlIHJlc3VsdGluZyBlcnJvciBsaXN0Ci0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKiBAZGVwcmVjYXRlZCAtLSB1c2UgYnVpbGRDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyB1cmksIGludCBncmFtbWFyRXJyb3JDaGVja2luZywgTGlzdCBlcnJvckxpc3QpCi0gIHsKLSAgICByZXR1cm4gYnVpbGRDTURvY3VtZW50KHVyaSk7Ci0gIH0KLQotICAvKioKLSAgICogR2l2ZW4gdXJpIGZvciBhbiBYTUwgU2NoZW1hIGRvY3VtZW50LCBwYXJzZSB0aGUgZG9jdW1lbnQgYW5kIGJ1aWxkCi0gICAqIGNvcnJlc3BvbmRpbmcgQ01Eb2N1bWVudCBub2RlLgotICAgKiAKLSAgICogQHBhcmFtIHVyaSAtCi0gICAqICAgICAgICAgIHRoZSB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQKLSAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENNRG9jdW1lbnQgYnVpbGRDTURvY3VtZW50KFN0cmluZyB1cmkpCi0gIHsKLSAgICBDTURvY3VtZW50IGNtRG9jdW1lbnQgPSBudWxsOwotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBidWlsZFhTRE1vZGVsKHVyaSk7Ci0gICAgaWYgKHhzZFNjaGVtYSAhPSBudWxsKQotICAgIHsKLSAgICAgIGNtRG9jdW1lbnQgPSAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RTY2hlbWEpOwotICAgIH0KLSAgICByZXR1cm4gY21Eb2N1bWVudDsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiB1cmkgZm9yIGFuIFhNTCBTY2hlbWEgZG9jdW1lbnQsIHBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQKLSAgICogY29ycmVzcG9uZGluZyBDTURvY3VtZW50IG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdXJpIC0KLSAgICogICAgICAgICAgdGhlIHVyaSBmb3IgYW4gWE1MIFNjaGVtYSBkb2N1bWVudAotICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIENNRG9jdW1lbnQgbm9kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgWFNEU2NoZW1hIGJ1aWxkWFNETW9kZWwoU3RyaW5nIHVyaVN0cmluZykKLSAgewotICAgIFhTRFNjaGVtYSB4c2RTY2hlbWEgPSBudWxsOwotIAotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIGlmIFhNTCBTY2hlbWEgZm9yIFNjaGVtYSBpcyByZXF1ZXN0ZWQsIGdldCBpdCB0aHJvdWdoIHNjaGVtYSBtb2RlbCAKLSAgICAgIGlmICh1cmlTdHJpbmcuZW5kc1dpdGgoIjIwMDEvWE1MU2NoZW1hLnhzZCIpKQotICAgICAgewotICAgICAgCXhzZFNjaGVtYSA9IFhTRFNjaGVtYUltcGwuZ2V0U2NoZW1hRm9yU2NoZW1hKFhTRENvbnN0YW50cy5TQ0hFTUFfRk9SX1NDSEVNQV9VUklfMjAwMSk7CQkJCi0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7IAkKLSAgICAgICAgUmVzb3VyY2VTZXQgcmVzb3VyY2VTZXQgPSBuZXcgUmVzb3VyY2VTZXRJbXBsKCk7Ci0gICAgICAgIC8vcmVzb3VyY2VTZXQuZ2V0QWRhcHRlckZhY3RvcmllcygpLmFkZChuZXcgWFNEU2NoZW1hTG9jYXRpb25SZXNvbHZlckFkYXB0ZXJGYWN0b3J5KCkpOwotICAgICAgICByZXNvdXJjZVNldC5nZXRBZGFwdGVyRmFjdG9yaWVzKCkuYWRkKG5ldyBYU0RTY2hlbWFMb2NhdG9yQWRhcHRlckZhY3RvcnkoKSk7Ci0gICAgICAgICAgCi0gICAgICAgIFVSSSB1cmkgPSBjcmVhdGVVUkkodXJpU3RyaW5nKTsgICAKLSAgICAgICAgCi0gICAgICAgIC8vIENTIDogYnVnIDExMzUzNyBlbnN1cmUgd2UgcGVyZm9ybSBwaHlzaWNhbCByZXNvbHV0aW9uIGJlZm9yZSBvcGVuaW5nIGEgc3RyZWFtIGZvciB0aGUgcmVzb3VyY2UKLSAgICAgICAgLy8KLSAgICAgICAgU3RyaW5nIHBoeXNpY2FsTG9jYXRpb24gPSBVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpLnJlc29sdmVQaHlzaWNhbExvY2F0aW9uKCIiLCAiIiwgdXJpU3RyaW5nKTsgICAgICAgCi0gICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzb3VyY2VTZXQuZ2V0VVJJQ29udmVydGVyKCkuY3JlYXRlSW5wdXRTdHJlYW0oVVJJLmNyZWF0ZVVSSShwaHlzaWNhbExvY2F0aW9uKSk7Ci0gICAgICAgIFhTRFJlc291cmNlSW1wbCByZXNvdXJjZSA9IChYU0RSZXNvdXJjZUltcGwpcmVzb3VyY2VTZXQuY3JlYXRlUmVzb3VyY2UoVVJJLmNyZWF0ZVVSSSgiKi54c2QiKSk7Ci0gICAgICAgIHJlc291cmNlLnNldFVSSSh1cmkpOwotICAgICAgICByZXNvdXJjZS5sb2FkKGlucHV0U3RyZWFtLCBudWxsKTsgICAgICAgICAKLSAgICAgICAgeHNkU2NoZW1hID0gcmVzb3VyY2UuZ2V0U2NoZW1hKCk7ICAgICAgCi0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgfQotICAgIHJldHVybiB4c2RTY2hlbWE7Ci0gIH0KLSAgCi0gIC8vIFRPRE8gLi4uIGxvb2tzIGxpa2Ugd2UgY2FuIHJlbW92ZSB0aGlzIGNsYXNzPwotICAvLwotICBzdGF0aWMgY2xhc3MgSW50ZXJuYWxVUklDb252ZXJ0ZXIgZXh0ZW5kcyBVUklDb252ZXJ0ZXJJbXBsCi0gIHsKLSAgICBwcm90ZWN0ZWQgSW5wdXRTdHJlYW0gY3JlYXRlVVJMSW5wdXRTdHJlYW0oVVJJIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgaWYgKCJodHRwIi5lcXVhbHModXJpLnNjaGVtZSgpKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHRoZVVSSSA9IHVyaS50b1N0cmluZygpOwotICAgICAgICBTdHJpbmcgbWFwcGVkID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlKHRoZVVSSSwgdGhlVVJJLCB0aGVVUkkpOwotICAgICAgICBpZiAobWFwcGVkICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB1cmkgPSBjcmVhdGVVUkkobWFwcGVkKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHN1cGVyLmNyZWF0ZVVSTElucHV0U3RyZWFtKHVyaSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gYXBwcm9wcmlhdGUgVVJJIGJhc2VkIG9uIGEgdXJpIHN0cmluZy4KLSAgICogCi0gICAqIEBwYXJhbSB1cmlTdHJpbmcgLQotICAgKiAgICAgICAgICBhIHVyaSBzdHJpbmcuCi0gICAqIEByZXR1cm4gYW4gYXBwcm9wcmlhdGUgVVJJIGJhc2VkIG9uIGEgdXJpIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVVJJIGNyZWF0ZVVSSShTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgaWYgKGhhc1Byb3RvY29sKHVyaVN0cmluZykpCi0gICAgICByZXR1cm4gVVJJLmNyZWF0ZVVSSSh1cmlTdHJpbmcpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiBVUkkuY3JlYXRlRmlsZVVSSSh1cmlTdHJpbmcpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNQcm90b2NvbChTdHJpbmcgdXJpKQotICB7Ci0gICAgYm9vbGVhbiByZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAodXJpICE9IG51bGwpCi0gICAgewotICAgICAgaW50IGluZGV4ID0gdXJpLmluZGV4T2YoIjoiKTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSAmJiBpbmRleCA+IDIpIC8vIGFzc3VtZSBwcm90b2NvbCB3aXRoIGJlIGxlbmd0aCAzIHNvIHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSdDJyBpbiAnQzovJyBpcyBub3QgaW50ZXJwcmV0ZWQgYXMgYQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdG9jb2wKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgc3RyaW5nIGJlZ2lucyB3aXRoIHBsYXRmb3JtIHByb3RvY29sLgotICAgKiAKLSAgICogQHBhcmFtIHVyaVN0cmluZyAtCi0gICAqICAgICAgICAgIGEgdXJpIHN0cmluZy4KLSAgICogQHJldHVybiB0cnVlIGlmIHN0cmluZyBiZWdpbnMgd2l0aCBwbGF0Zm9ybSBwcm90b2NvbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB3aXRoUGxhdGZvcm1Qcm90b2NvbChTdHJpbmcgdXJpU3RyaW5nKQotICB7Ci0gICAgcmV0dXJuIHVyaVN0cmluZy5zdGFydHNXaXRoKFBMQVRGT1JNX1BST1RPQ09MKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgKiAKLSAgICogQHBhcmFtIGNvbXBvbmVudCAtCi0gICAqICAgICAgICAgIGEgY29uY3JldGUgY29tcG9uZW50LgotICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldE1pbk9jY3VycyhYU0RDb25jcmV0ZUNvbXBvbmVudCBjb21wb25lbnQpCi0gIHsKLSAgICBpbnQgbWluT2NjdXIgPSAxOwotICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBPYmplY3QgbyA9IGNvbXBvbmVudC5nZXRDb250YWluZXIoKTsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgWFNEUGFydGljbGUpCi0gICAgICB7Ci0gICAgICAgIGlmICgoKFhTRFBhcnRpY2xlKSBvKS5pc1NldE1pbk9jY3VycygpKQotICAgICAgICB7Ci0gICAgICAgICAgdHJ5Ci0gICAgICAgICAgewotICAgICAgICAgICAgbWluT2NjdXIgPSAoKFhTRFBhcnRpY2xlKSBvKS5nZXRNaW5PY2N1cnMoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG1pbk9jY3VyID0gMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIG1pbk9jY3VyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAiMSIuCi0gICAqIAotICAgKiBAcGFyYW0gY29tcG9uZW50IC0KLSAgICogICAgICAgICAgYSBjb25jcmV0ZSBjb21wb25lbnQuCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0TWF4T2NjdXJzKFhTRENvbmNyZXRlQ29tcG9uZW50IGNvbXBvbmVudCkKLSAgewotICAgIGludCBtYXhPY2N1ciA9IDE7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgIHsKLSAgICAgIE9iamVjdCBvID0gY29tcG9uZW50LmdldENvbnRhaW5lcigpOwotICAgICAgaWYgKG8gaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCgoWFNEUGFydGljbGUpIG8pLmlzU2V0TWF4T2NjdXJzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXhPY2N1ciA9ICgoWFNEUGFydGljbGUpIG8pLmdldE1heE9jY3VycygpOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgbWF4T2NjdXIgPSAxOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbWF4T2NjdXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBnaXZlbiB0eXBlLgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUgLQotICAgKiAgICAgICAgICBhIHR5cGUgZGVmaW5pdGlvbi4KLSAgICogQHJldHVybiB0aGUgZW51bWVyYXRlZCB2YWx1ZXMgZm9yIHRoZSBnaXZlbiB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfTkFNRV9CT09MRUFOID0gImJvb2xlYW4iOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUWVBFX1ZBTFVFX1RSVUUgPSAidHJ1ZSI7IC8vJE5PTi1OTFMtMSQKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFRZUEVfVkFMVUVfRkFMU0U9ICJmYWxzZSI7IC8vJE5PTi1OTFMtMSQgIAotICAKLSAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yVHlwZShYU0RUeXBlRGVmaW5pdGlvbiB0eXBlKQotICB7Ci0gICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICB7ICAgICAgICAgCi0gICAgICBpZiAoVFlQRV9OQU1FX0JPT0xFQU4uZXF1YWxzKHR5cGUuZ2V0TmFtZSgpKSAmJiB0eXBlLmdldFNjaGVtYSgpLmdldFNjaGVtYUZvclNjaGVtYSgpID09IHR5cGUuZ2V0U2NoZW1hKCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdC5hZGQoVFlQRV9WQUxVRV9UUlVFKTsKLSAgICAgICAgcmVzdWx0LmFkZChUWVBFX1ZBTFVFX0ZBTFNFKTsKLSAgICAgIH0gCi0gICAgICBlbHNlCi0gICAgICB7ICAgICAgICAKLSAgICAgICAgTGlzdCBlbnVtZXJhdGlvbkZhY2V0cyA9ICgoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pIHR5cGUpLmdldEVudW1lcmF0aW9uRmFjZXRzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGVudW1lcmF0aW9uRmFjZXRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTREVudW1lcmF0aW9uRmFjZXQgZW51bUZhY2V0ID0gKFhTREVudW1lcmF0aW9uRmFjZXQpIGkubmV4dCgpOwotICAgICAgICAgIExpc3QgdmFsdWVzID0gZW51bUZhY2V0LmdldFZhbHVlKCk7Ci0gICAgICAgICAgZm9yIChJdGVyYXRvciBqID0gdmFsdWVzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOykKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBPYmplY3QgbyA9IGoubmV4dCgpOwotICAgICAgICAgICAgaWYgKG8gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgcmVzdWx0LmFkZChvLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfSAgCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSAgCi0gICAgU3RyaW5nW10gYXJyYXkgPSBuZXcgU3RyaW5nW3Jlc3VsdC5zaXplKCldOwotICAgIHJlc3VsdC50b0FycmF5KGFycmF5KTsKLSAgICByZXR1cm4gYXJyYXk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzIGZyb20gdGhlIGdpdmVuIGFubm90YXRpb24uIFdvcmtpbmcKLSAgICogd2l0aCBkb2N1bWVudGF0aW9uIGVsZW1lbnRzIHJlcXVpcmVzIGRyb3BwaW5nIGRvd24gaW50byB0aGUgRE9NIG1vZGVsLgotICAgKiAKLSAgICogQHBhcmFtIGFubm90YXRpb24gLQotICAgKiAgICAgICAgICBhbiBYU0RBbm5vdGF0aW9uIG5vZGUuCi0gICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbnMoWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uKQotICB7Ci0gICAgQ01Ob2RlTGlzdEltcGwgZG9jdW1lbnRhdGlvbnMgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIExpc3QgZG9jdW1lbnRhdGlvbnNFbGVtZW50cyA9IGFubm90YXRpb24uZ2V0VXNlckluZm9ybWF0aW9uKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBkb2N1bWVudGF0aW9uc0VsZW1lbnRzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgZG9jdW1lbnRhdGlvbnMuZ2V0TGlzdCgpLmFkZChuZXcgRG9jdW1lbnRhdGlvbkltcGwoKEVsZW1lbnQpIGkubmV4dCgpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkb2N1bWVudGF0aW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHVibGljIHN0YXRpYyBMaXN0IGZpbmRUeXBlc0Rlcml2ZWRGcm9tKFhTRFNjaGVtYSBzY2hlbWEsCi0gICAqIFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZyBsb2NhbE5hbWUpIGluIGNsYXNzIFhTRFNjaGVtYVF1ZXJ5VG9vbHMgZm91bmQgaW4KLSAgICogb3JnLmVjbGlwc2UueHNkIHBsdWdpbi4KLSAgICogCi0gICAqIEZpbmQgdHlwZURlZmluaXRpb25zIHRoYXQgZGVyaXZlIGZyb20gYSBnaXZlbiB0eXBlLgotICAgKiAKLSAgICogQHBhcmFtIHR5cGUKLSAgICogICAgICAgICAgdGhlIHR5cGUgZGVyaXZlZCBmcm9tCi0gICAqIEByZXR1cm4gTGlzdCBvZiBhbnkgWFNEVHlwZURlZmluaXRpb25zIGZvdW5kCi0gICAqLwotICBwdWJsaWMgc3RhdGljIExpc3QgZmluZFR5cGVzRGVyaXZlZEZyb20oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIEFycmF5TGlzdCB0eXBlc0Rlcml2ZWRGcm9tID0gbmV3IEFycmF5TGlzdCgpOwotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgWFNEU2NoZW1hIHNjaGVtYSA9IHR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgICBTdHJpbmcgbG9jYWxOYW1lID0gdHlwZS5nZXROYW1lKCk7Ci0gICAgICBpZiAoKG51bGwgIT0gc2NoZW1hKSAmJiAobnVsbCAhPSBsb2NhbE5hbWUpKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlID0gc2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICAvLyBBIGhhbmR5IGNvbnZlbmllbmNlIG1ldGhvZCBxdWlja2x5IGdldHMgYWxsCi0gICAgICAgIC8vIHR5cGVEZWZpbml0aW9ucyB3aXRoaW4gb3VyIHNjaGVtYTsgbm90ZSB0aGF0Ci0gICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IHRoaXMgcmV0dXJucyB0eXBlcyBpbiBpbmNsdWRlZCwKLSAgICAgICAgLy8gaW1wb3J0ZWQsIG9yIHJlZGVmaW5lZCBzY2hlbWFzIGlzIHN1YmplY3QgdG8gY2hhbmdlCi0gICAgICAgIExpc3QgdHlwZWRlZnMgPSBzY2hlbWEuZ2V0VHlwZURlZmluaXRpb25zKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IHR5cGVkZWZzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHR5cGVkZWYgPSAoWFNEVHlwZURlZmluaXRpb24pIGl0ZXIubmV4dCgpOwotICAgICAgICAgIGlmICh0eXBlZGVmIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIC8vIFdhbGsgdGhlIGJhc2VUeXBlcyBmcm9tIHRoaXMgdHlwZWRlZiBzZWVpbmcgaWYgYW55Ci0gICAgICAgICAgICAvLyBvZiB0aGVtIG1hdGNoIHRoZSByZXF1ZXN0ZWQgb25lCi0gICAgICAgICAgICBpZiAoaXNUeXBlRGVyaXZlZEZyb20odHlwZWRlZiwgbmFtZXNwYWNlLCBsb2NhbE5hbWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBpdCwgcmV0dXJuIHRoZSBvcmlnaW5hbCBvbmUgYW5kIGNvbnRpbnVlCi0gICAgICAgICAgICAgIHR5cGVzRGVyaXZlZEZyb20uYWRkKHR5cGVkZWYpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHR5cGVzRGVyaXZlZEZyb207Ci0gIH0KLQotICAvKioKLSAgICogQWRhcHRlZCBmcm9tIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBpc1R5cGVEZXJpdmVkRnJvbShYU0RUeXBlRGVmaW5pdGlvbgotICAgKiB0eXBlZGVmLCBTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbG9jYWxOYW1lKSBpbiBjbGFzcyBYU0RTY2hlbWFRdWVyeVRvb2xzCi0gICAqIGZvdW5kIGluIG9yZy5lY2xpcHNlLnhzZCBwbHVnaW4uCi0gICAqIAotICAgKiBSZWN1cnNpdmUgd29ya2VyIG1ldGhvZCB0byBmaW5kIHR5cGVEZWZpbml0aW9ucyB0aGF0IGRlcml2ZSBmcm9tIGEgbmFtZWQKLSAgICogdHlwZS4KLSAgICogCi0gICAqIEBzZWUgI2ZpbmRUeXBlc0Rlcml2ZWRGcm9tKFhTRFNjaGVtYSwgU3RyaW5nLCBTdHJpbmcpCi0gICAqIEBwYXJhbSB0eXBlRGVmCi0gICAqICAgICAgICAgIHRvIHNlZSBpZiBpdCdzIGRlcml2ZWQgZnJvbQotICAgKiBAcGFyYW0gbmFtZXNwYWNlCi0gICAqICAgICAgICAgIGZvciB0aGUgdHlwZSBkZXJpdmVkIGZyb20KLSAgICogQHBhcmFtIGxvY2FsTmFtZQotICAgKiAgICAgICAgICBmb3IgdGhlIHR5cGUgZGVyaXZlZCBmcm9tCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiBpdCBpczsgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNUeXBlRGVyaXZlZEZyb20oWFNEVHlwZURlZmluaXRpb24gdHlwZWRlZiwgU3RyaW5nIG5hbWVzcGFjZSwgU3RyaW5nIGxvY2FsTmFtZSkKLSAgewotICAgIC8vIFdhbGsgdGhlIGJhc2VUeXBlcyBmcm9tIHRoaXMgdHlwZWRlZiBzZWVpbmcgaWYgYW55Ci0gICAgLy8gb2YgdGhlbSBtYXRjaCB0aGUgcmVxdWVzdGVkIG9uZQotICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2VUeXBlID0gdHlwZWRlZi5nZXRCYXNlVHlwZSgpOwotICAgIGlmIChiYXNlVHlwZSA9PSBudWxsKQotICAgCXsKLSAgICAgIC8vIHR5cGVkZWYgaXMgYSByb290IHR5cGUgbGlrZSB4c2Q6YW55VHlwZSwgc28gaXQgaGFzIG5vIGJhc2UKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gQXMgdGhpcyBjb252ZW5pZW5jZSBtZXRob2QgaWYgb3VyIHBhcmFtZXRlcnMgbWF0Y2gKLSAgICBpZiAoYmFzZVR5cGUuaGFzTmFtZUFuZFRhcmdldE5hbWVzcGFjZShsb2NhbE5hbWUsIG5hbWVzcGFjZSkpCi0gICAgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIFhTRFR5cGVEZWZpbml0aW9uIHJvb3RUeXBlID0gdHlwZWRlZi5nZXRSb290VHlwZSgpOwotICAgIGlmIChyb290VHlwZSA9PSBiYXNlVHlwZSkKLSAgICB7Ci0gICAgICAvLyBJZiB3ZSd2ZSBoaXQgdGhlIHJvb3QsIHdlIGFyZW4ndCBkZXJpdmVkIGZyb20gaXQKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIE90aGVyd2lzZSBjb250aW51ZSB0byB0cmF2ZXJzZSB1cHdhcmRzCi0gICAgICByZXR1cm4gaXNUeXBlRGVyaXZlZEZyb20oYmFzZVR5cGUsIG5hbWVzcGFjZSwgbG9jYWxOYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyBjbW5vZGUgb2YgdGhlIHNwZWNpZmllZCBYTUwgU2NoZW1hIG5vZGUuCi0gICAqIAotICAgKiBAcGFyYW0gdGFyZ2V0IC0KLSAgICogICAgICAgICAgYW4gWE1MIFNjaGVtYSBub2RlCi0gICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgY21ub2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDTU5vZGUgZ2V0QWRhcHRlcihOb3RpZmllciBvKQotICB7Ci0gICAgcmV0dXJuIChDTU5vZGUpIHhzZEFkYXB0ZXJGYWN0b3J5SW1wbC5hZGFwdChvKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGFwdGVkIGZyb20gcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5zLCBib29sZWFuIHdpdGhDb2xvbikgaW4gY2xhc3MKLSAgICogVHlwZXNIZWxwZXIgZm91bmQgaW4gb3JnLmVjbGlwc2Uud3N0LnhzZC5lZGl0b3IgcGx1Z2luLgotICAgKiAKLSAgICogQHBhcmFtIHNjaGVtYSAtCi0gICAqICAgICAgICAgIHRoZSByZWxldmFudCBzY2hlbWEKLSAgICogQHBhcmFtIG5zIC0KLSAgICogICAgICAgICAgdGhlIHJlbGV2YW50IG5hbWVzcGFjZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJlZml4KFhTRFNjaGVtYSBzY2hlbWEsIFN0cmluZyBucykKLSAgewotICAgIFN0cmluZyBrZXkgPSAiIjsKLSAgICBpZiAoKHNjaGVtYSAhPSBudWxsKSAmJiAobnMgIT0gbnVsbCkpCi0gICAgewotICAgICAgTWFwIG1hcCA9IHNjaGVtYS5nZXRRTmFtZVByZWZpeFRvTmFtZXNwYWNlTWFwKCk7Ci0gICAgICBJdGVyYXRvciBpdGVyID0gbWFwLmtleVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIE9iamVjdCBrZXlPYmogPSBpdGVyLm5leHQoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbWFwLmdldChrZXlPYmopOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS50b1N0cmluZygpLmVxdWFscyhucykpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoa2V5T2JqICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAga2V5ID0ga2V5T2JqLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBrZXkgPSAiIjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGtleTsKLSAgfQotICAvKioKLSAgICogVGhlIEZhY3RvcnkgZm9yIHRoZSBYU0QgYWRhcHRlciBtb2RlbC4gSXQgcHJvdmlkZXMgYSBjcmVhdGUgbWV0aG9kIGZvciBlYWNoCi0gICAqIG5vbi1hYnN0cmFjdCBjbGFzcyBvZiB0aGUgbW9kZWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTREFkYXB0ZXJGYWN0b3J5SW1wbCBleHRlbmRzIEFkYXB0ZXJGYWN0b3J5SW1wbAotICB7Ci0gICAgcHVibGljIEFkYXB0ZXIgY3JlYXRlQWRhcHRlcihOb3RpZmllciB0YXJnZXQpCi0gICAgewotICAgICAgWFNEU3dpdGNoIHhzZFN3aXRjaCA9IG5ldyBYU0RTd2l0Y2goKQotICAgICAgewotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RXaWxkY2FyZChYU0RXaWxkY2FyZCBvYmplY3QpCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFhTRFdpbGRjYXJkQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbkFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTREF0dHJpYnV0ZVVzZShYU0RBdHRyaWJ1dGVVc2Ugb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGNhc2VYU0RFbGVtZW50RGVjbGFyYXRpb24oWFNERWxlbWVudERlY2xhcmF0aW9uIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcihvYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBjYXNlWFNETW9kZWxHcm91cChYU0RNb2RlbEdyb3VwIG9iamVjdCkKLSAgICAgICAgewotICAgICAgICAgIHJldHVybiBuZXcgWFNETW9kZWxHcm91cEFkYXB0ZXIob2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgY2FzZVhTRFNjaGVtYShYU0RTY2hlbWEgb2JqZWN0KQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBYU0RTY2hlbWFBZGFwdGVyKG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBPYmplY3QgbyA9IHhzZFN3aXRjaC5kb1N3aXRjaCgoRU9iamVjdCkgdGFyZ2V0KTsKLSAgICAgIEFkYXB0ZXIgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgQWRhcHRlcikKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gKEFkYXB0ZXIpIG87Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFRocmVhZC5kdW1wU3RhY2soKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIEFkYXB0ZXIgYWRhcHQoTm90aWZpZXIgdGFyZ2V0KQotICAgIHsKLSAgICAgIHJldHVybiBhZGFwdCh0YXJnZXQsIHRoaXMpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEQmFzZUFkYXB0ZXIgLS0gYW4gYWJzdHJhY3QgYmFzZSBub2RlIGluIHRoZSBtb2RlbC4gQWxsIG90aGVyIG1vZGVsIG5vZGVzCi0gICAqIGFyZSBkZXJpdmVkIGZyb20gaXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFhTREJhc2VBZGFwdGVyIGV4dGVuZHMgQ01Ob2RlSW1wbAotICB7Ci0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3RJbXBsIGRvY3VtZW50YXRpb24gPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBvZiB0aGUgZ2l2ZW4gZmFjdG9yeSBpcyB0aGUgZmFjdG9yeSBmb3IgdGhpcyBYU0QgYWRhcHRlcgotICAgICAqIG1vZGVsLgotICAgICAqIAotICAgICAqIEBwYXJhbSB0eXBlIC0KLSAgICAgKiAgICAgICAgICBhIGZhY3RvcnkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgaXMgdGhlIGFkYXB0ZXIgZmFjdG9yeSBmb3IgdGhpcyBtb2RlbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FkYXB0ZXJGb3JUeXBlKE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiB0eXBlID09IHhzZEFkYXB0ZXJGYWN0b3J5SW1wbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZCBmb3IgdGhpcyBjbGFzcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05TX1BSRUZJWF9RVUFMSUZJQ0FUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX05JTExBQkxFKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX1VTRVNfTE9DQUxfRUxFTUVOVF9ERUNMQVJBVElPTlMpCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fU09VUkNFKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RPQ1VNRU5UQVRJT05fTEFOR1VBR0UpCi0gICAgICAgICAgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9NT0ZfTk9USUZJRVIpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfREVGSU5JVElPTl9JTkZPKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0RFRklOSVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQ01ET0NVTUVOVCkKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0lTX05BTUVfU1BBQ0VfQVdBUkUpIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1BFQykgfHwgc3VwZXIuc3VwcG9ydHMocHJvcGVydHlOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuIFRoaXMgcmVwcmVzZW50cyB0aGUKLSAgICAgKiBuaWxsYWJsZSBpbmZvc2V0IHByb3BlcnR5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4gQWxsIGRlcml2ZWQKLSAgICAgKiBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ05pbGxhYmxlJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNOaWxsYWJsZSgpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuIFRoZSBkZWZhdWx0Ci0gICAgICogdmFsdWUgaXMgbnVsbDsgQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8KLSAgICAgKiBub3Qgd2FudCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eQotICAgICAqIENNTm9kZUxpc3Q7IEFsbCBkZXJpdmVkIGNsYXNzZXMgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBpZiB0aGV5IGRvIG5vdAotICAgICAqIHdhbnQgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuIFJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9DTURPQ1VNRU5UKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0Q01Eb2N1bWVudCgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ET0NVTUVOVEFUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RG9jdW1lbnRhdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9VU0VTX0xPQ0FMX0VMRU1FTlRfREVDTEFSQVRJT05TKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQm9vbGVhbi5UUlVFOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JU19OQU1FX1NQQUNFX0FXQVJFKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gQm9vbGVhbi5UUlVFOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OU19QUkVGSVhfUVVBTElGSUNBVElPTikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OSUxMQUJMRSkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGlzTmlsbGFibGUoKSA/IHhzaURvY3VtZW50Lm5pbEF0dHJpYnV0ZSA6IG51bGw7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX01PRl9OT1RJRklFUikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldEtleSgpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9TUEVDKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0U3BlYygpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgICB7Ci0gICAgICAgICAgQ01Eb2N1bWVudCBjbURvY3VtZW50ID0gZ2V0Q01Eb2N1bWVudCgpOwotICAgICAgICAgIGlmIChjbURvY3VtZW50IGluc3RhbmNlb2YgWFNEU2NoZW1hQWRhcHRlcikKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBBbm5vdGF0aW9uTWFwIG1hcCA9ICgoWFNEU2NoZW1hQWRhcHRlcikgY21Eb2N1bWVudCkuYW5ub3RhdGlvbk1hcDsKLSAgICAgICAgICAgIGlmIChtYXAgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgU3RyaW5nIHNwZWMgPSBnZXRTcGVjKCk7Ci0gICAgICAgICAgICAgIGlmIChzcGVjICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBtYXAuZ2V0UHJvcGVydHkoZ2V0U3BlYygpLCBwcm9wZXJ0eU5hbWUpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICAgICAKLQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXSB3aGljaCBhZmZlY3RzIHRoZSB0YXJnZXQKLSAgICAgKiBuYW1lc3BhY2Ugb2YgbG9jYWxseSBzY29wZWQgZmVhdHVyZXMuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG51bGwuIEFsbAotICAgICAqIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlIGRlZmF1bHQKLSAgICAgKiB2YWx1ZS4gQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBnZW5lcmFsIFhQYXRoIGV4cHJlc3Npb24gZm9yIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3BlYygpCi0gICAgewotICAgICAgcmV0dXJuICIvLyIgKyBnZXROb2RlTmFtZSgpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEU2NoZW1hQWRhcHRlciBpbXBsZW1lbnRzIENNRG9jdW1lbnQuIEEgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1vZGVsCi0gICAqIG9iamVjdCAnU2NoZW1hJy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEU2NoZW1hQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Eb2N1bWVudAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYSB4c2RTY2hlbWE7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBuYW1lZE5vZGVNYXA7Ci0gICAgcHJvdGVjdGVkIENNTmFtZWROb2RlTWFwSW1wbCBlbnRpdHlOb2RlTWFwOwotICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGFubm90YXRpb25NYXAgPSBuZXcgQW5ub3RhdGlvbk1hcCgpOwotICAgIHByb3RlY3RlZCBIYXNodGFibGUgc3Vic3RpdHV0aW9uR3JvdXBUYWJsZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RTY2hlbWEgLQotICAgICAqICAgICAgICAgIHRoZSBzY2hlbWEgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgWFNEU2NoZW1hQWRhcHRlcihYU0RTY2hlbWEgeHNkU2NoZW1hKQotICAgIHsKLSAgICAgIHRoaXMueHNkU2NoZW1hID0geHNkU2NoZW1hOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFNjaGVtYTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWxlbmFtZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBmaWxlbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICAvLyBTZWUgYnVpbGRDTURvY3VtZW50KCkgYWJvdmUuCi0gICAgICByZXR1cm4geHNkU2NoZW1hLmdldFNjaGVtYUxvY2F0aW9uKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9UQVJHRVRfTkFNRVNQQUNFX1VSSSkgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9JTVBPUlRFRF9OQU1FU1BBQ0VfSU5GTykgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9OQU1FU1BBQ0VfSU5GTykKLSAgICAgICAgICB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0VMRU1FTlRfRk9STV9ERUZBVUxUKSB8fCBwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FOTk9UQVRJT05fTUFQKSB8fCBzdXBlci5zdXBwb3J0cyhwcm9wZXJ0eU5hbWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIHByZWZpeCBpcyBnbG9iYWxseSByZXF1aXJlZCBmb3IgZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHhzZFNjaGVtYSAtCi0gICAgICogICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUuCi0gICAgICogQHJldHVybiB0cnVlIGlmIGEgcHJlZml4IGlzIGdsb2JhbGx5IHJlcXVpcmVkIGZvciBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1ByZWZpeFJlcXVpcmVkKFhTRFNjaGVtYSB4c2RTY2hlbWEpCi0gICAgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgICAgaWYgKHhzZFNjaGVtYS5pc1NldEVsZW1lbnRGb3JtRGVmYXVsdCgpKQotICAgICAgICByZXN1bHQgPSAhKHhzZFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXRWYWx1ZSgpID09IFhTREZvcm0uUVVBTElGSUVEKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBwcm9wZXJ0eSBuYW1lLiBSZXR1cm5zIG51bGwgaWYgdGhlCi0gICAgICogcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgIHsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBudWxsOwotICAgICAgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfVEFSR0VUX05BTUVTUEFDRV9VUkkpKQotICAgICAgewotICAgICAgICByZXN1bHQgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0lNUE9SVEVEX05BTUVTUEFDRV9JTkZPKSkKLSAgICAgIHsKLSAgICAgICAgTGlzdCBsaXN0ID0gbmV3IFZlY3RvcigpOwotICAgICAgICBnZXRJbXBvcnRlZE5hbWVzcGFjZUluZm8oeHNkU2NoZW1hLCBsaXN0KTsKLSAgICAgICAgcmVzdWx0ID0gbGlzdDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfTkFNRVNQQUNFX0lORk8pKQotICAgICAgewotICAgICAgICBMaXN0IGxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0gICAgICAgIE5hbWVzcGFjZUluZm8gaW5mbyA9IG5ldyBOYW1lc3BhY2VJbmZvKCk7Ci0gICAgICAgIGluZm8udXJpID0geHNkU2NoZW1hLmdldFRhcmdldE5hbWVzcGFjZSgpOwotICAgICAgICBpbmZvLnByZWZpeCA9IGdldFByZWZpeCh4c2RTY2hlbWEsIGluZm8udXJpKTsKLSAgICAgICAgaW5mby5sb2NhdGlvbkhpbnQgPSBudWxsOyAvLyBub3RlIHRoYXQgdGhpcyBsb2NhdGlvbkhpbnQgaW5mbyBpcyBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSByb290IHhzZCBmaWxlCi0gICAgICAgIGluZm8uaXNQcmVmaXhSZXF1aXJlZCA9IGlzUHJlZml4UmVxdWlyZWQoeHNkU2NoZW1hKTsKLSAgICAgICAgbGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgIGdldEltcG9ydGVkTmFtZXNwYWNlSW5mbyh4c2RTY2hlbWEsIGxpc3QpOwotICAgICAgICByZXN1bHQgPSBsaXN0OwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9FTEVNRU5UX0ZPUk1fREVGQVVMVCkpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHhzZFNjaGVtYS5nZXRFbGVtZW50Rm9ybURlZmF1bHQoKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FOTk9UQVRJT05fTUFQKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gYW5ub3RhdGlvbk1hcDsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoImFsbEVsZW1lbnRzIikpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldEFsbEVsZW1lbnRzKCk7Ci0gICAgICB9ICAKLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5zdGFydHNXaXRoKCJnZXRFbGVtZW50Rm9yVHlwZSMiKSkKLSAgICAgIHsKLSAgICAgICAgaW50IGluZGV4ID0gcHJvcGVydHlOYW1lLmluZGV4T2YoIiMiKTsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gcHJvcGVydHlOYW1lLnN1YnN0cmluZyhpbmRleCArIDEsIHByb3BlcnR5TmFtZS5sZW5ndGgoKSk7Ci0gICAgICAgIC8vCi0gICAgICAgIC8vCi0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIHRkID0geHNkU2NoZW1hLnJlc29sdmVUeXBlRGVmaW5pdGlvbih0eXBlTmFtZSk7Ci0gICAgICAgIGlmICh0ZCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgTG9jYWxFbGVtZW50VmlzaXRvciBsb2NhbEVsZW1lbnRWaXNpdG9yID0gbmV3IExvY2FsRWxlbWVudFZpc2l0b3IoKTsKLSAgICAgICAgICBsb2NhbEVsZW1lbnRWaXNpdG9yLnZpc2l0VHlwZURlZmluaXRpb24odGQpOwotICAgICAgICAgIHJlc3VsdCA9IGxvY2FsRWxlbWVudFZpc2l0b3IuZ2V0Q01OYW1lZE5vZGVNYXAoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXN1bHQgPSBzdXBlci5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXIgaW5mb3JtYXRpb24gb24gbmFtZXNwYWNlcyB1c2VkIGluIGV4dGVybmFsIHJlZmVyZW5jZXMuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRoZVhTRFNjaGVtYSAtCi0gICAgICogICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgc2NoZW1hIG5vZGUKLSAgICAgKiBAcGFyYW0gbGlzdCAtCi0gICAgICogICAgICAgICAgdGhlIGxpc3Qgb2YgaW1wb3J0ZWQgbmFtZXNwYWNlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRJbXBvcnRlZE5hbWVzcGFjZUluZm8oWFNEU2NoZW1hIHRoZVhTRFNjaGVtYSwgTGlzdCBsaXN0KQotICAgIHsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSB0aGVYU0RTY2hlbWEuZ2V0Q29udGVudHMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBYU0RTY2hlbWFDb250ZW50IGNvbnRlbnQgPSAoWFNEU2NoZW1hQ29udGVudCkgaXRlcmF0b3IubmV4dCgpOwotICAgICAgICBpZiAoY29udGVudCBpbnN0YW5jZW9mIFhTREltcG9ydCkKLSAgICAgICAgewotICAgICAgICAgIFhTREltcG9ydCB4SW1wb3J0ID0gKFhTREltcG9ydCkgY29udGVudDsKLSAgICAgICAgICBYU0RTY2hlbWEgaW1wb3J0ZWRYU0RTY2hlbWEgPSB4SW1wb3J0LmdldFJlc29sdmVkU2NoZW1hKCk7Ci0gICAgICAgICAgTmFtZXNwYWNlSW5mbyBpbmZvID0gbmV3IE5hbWVzcGFjZUluZm8oKTsKLSAgICAgICAgICBpbmZvLnVyaSA9IHhJbXBvcnQuZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgaW5mby5wcmVmaXggPSBnZXRQcmVmaXgoaW1wb3J0ZWRYU0RTY2hlbWEsIGluZm8udXJpKTsKLSAgICAgICAgICBpbmZvLmxvY2F0aW9uSGludCA9IHhJbXBvcnQuZ2V0U2NoZW1hTG9jYXRpb24oKTsKLSAgICAgICAgICBpZiAoaW1wb3J0ZWRYU0RTY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBpbmZvLmlzUHJlZml4UmVxdWlyZWQgPSBpc1ByZWZpeFJlcXVpcmVkKGltcG9ydGVkWFNEU2NoZW1hKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbGlzdC5hZGQoaW5mbyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHNldCBvZiBuYW1lZCAodG9wLWxldmVsKSBlbGVtZW50IGRlY2xhcmF0aW9ucyBmb3IgdGhpcyBzY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzZXQgb2YgbmFtZWQgKHRvcC1sZXZlbCkgZWxlbWVudCBkZWNsYXJhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBpZiAobmFtZWROb2RlTWFwID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG5hbWVkTm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgICAgCi0gICAgICAgIC8vIE5vdGUgdGhhdCBpZiB3ZSBjYWxsIHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkKLSAgICAgICAgLy8gd2UgZ2V0ICdtb3JlJyBlbGVtZW50cyB0aGFuIHdlIHJlYWxseSB3YW50IHNpbmNlIHdlIGFsc28KLSAgICAgICAgLy8gZ2V0ICdpbXBvcnRlZCcgZWxlbWVudHMuICBCZWxvdyB3ZSB0ZXN0IHRvIGVuc3VyZSB0aGUgZWxlbWVudHMKLSAgICAgICAgLy8gYWN0dWFsbHkgaGF2ZSB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBzY2hlbWEuCi0gICAgICAgIFN0cmluZyB0YXJnZXROYW1lc3BhY2UgPSB4c2RTY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHhzZFNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNERWxlbWVudERlY2xhcmF0aW9uIGVkID0gKFhTREVsZW1lbnREZWNsYXJhdGlvbikgaS5uZXh0KCk7Ci0gICAgICAgICAgaWYgKHRhcmdldE5hbWVzcGFjZSAhPSBudWxsID8gdGFyZ2V0TmFtZXNwYWNlLmVxdWFscyhlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSkgOiBlZC5nZXRUYXJnZXROYW1lc3BhY2UoKSA9PSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgYWRhcHRlciA9IChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyKSBnZXRBZGFwdGVyKGVkKTsKLSAgICAgICAgICAgIG5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoYWRhcHRlci5nZXROb2RlTmFtZSgpLCBhZGFwdGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBuYW1lZE5vZGVNYXA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYnVpbHQtaW4gZW50aXR5IGRlY2xhcmF0aW9ucy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBidWlsdC1pbiBlbnRpdHkgZGVjbGFyYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRFbnRpdGllcygpCi0gICAgewotICAgICAgaWYgKGVudGl0eU5vZGVNYXAgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZW50aXR5Tm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICAgICAgLy8gYWRkIHRoZSBidWlsdCBpbiBlbnRpdHkgZGVjbGFyYXRpb25zCi0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJhbXAiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImFtcCIsICImIikpOwotICAgICAgICBlbnRpdHlOb2RlTWFwLmdldEhhc2h0YWJsZSgpLnB1dCgibHQiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoImx0IiwgIjwiKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJndCIsIG5ldyBDTUVudGl0eURlY2xhcmF0aW9uSW1wbCgiZ3QiLCAiPiIpKTsKLSAgICAgICAgZW50aXR5Tm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoInF1b3QiLCBuZXcgQ01FbnRpdHlEZWNsYXJhdGlvbkltcGwoInF1b3QiLCAiXCIiKSk7Ci0gICAgICAgIGVudGl0eU5vZGVNYXAuZ2V0SGFzaHRhYmxlKCkucHV0KCJhcG9zIiwgbmV3IENNRW50aXR5RGVjbGFyYXRpb25JbXBsKCJhcG9zIiwgIiciKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZW50aXR5Tm9kZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBET0NVTUVOVDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybnMgbnVsbC4gISEhIFdoeSBhcmUgd2Ugbm90IGltcGxlbWVudGluZyB0aGlzPz8/PyBAcmV0dXJuIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIENNTmFtZXNwYWNlIGdldE5hbWVzcGFjZSgpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGlzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhpcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIENNTmFtZWROb2RlTWFwIGdldEFsbEVsZW1lbnRzKCkKLSAgICB7Ci0gICAgICBDTU5hbWVkTm9kZU1hcEltcGwgbWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gZ2V0RWxlbWVudHMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBDTUVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChDTUVsZW1lbnREZWNsYXJhdGlvbilpLm5leHQoKTsKLSAgICAgICAgbWFwLnB1dChlZCk7ICAgICAgICAgICAKLSAgICAgICAgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMobWFwLCBlZCk7ICAgICAgICAgICAgICAKLSAgICAgIH0gICAgIAotICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0gICAgCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMoQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCwgQ01FbGVtZW50RGVjbGFyYXRpb24gcGFyZW50RWxlbWVudERlY2xhcmF0aW9uKQotICAgIHsKLSAgICAgIENNTmFtZWROb2RlTWFwIGxvY2FsRWxlbWVudE1hcCA9IHBhcmVudEVsZW1lbnREZWNsYXJhdGlvbi5nZXRMb2NhbEVsZW1lbnRzKCk7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBsb2NhbEVsZW1lbnRNYXAuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICAgIHsKLSAgICAgICAgQ01FbGVtZW50RGVjbGFyYXRpb24gZWQgPSAoQ01FbGVtZW50RGVjbGFyYXRpb24paS5uZXh0KCk7Ci0gICAgICAgIGlmIChtYXAuZ2V0TmFtZWRJdGVtKGVkLmdldE5vZGVOYW1lKCkpID09IG51bGwpCi0gICAgICAgIHsgIAotICAgICAgICAgIG1hcC5wdXQoZWQpOyAgICAgICAgCi0gICAgICAgICAgYWRkTG9jYWxFbGVtZW50RGVmaW5pdGlvbnMobWFwLCBlZCk7Ci0gICAgICAgIH0gIAotICAgICAgfSAgICAgICAgICAgICAgIAotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNEQXR0cmlidXRlVXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24uIEEgcmVwcmVzZW50YXRpb24KLSAgICogb2YgdGhlIG1vZGVsIG9iamVjdCAnQXR0cmlidXRlIFVzZScuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNQXR0cmlidXRlRGVjbGFyYXRpb24KLSAgewotICAgIC8vIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgWE1MIFNjaGVtYSBub2RlCi0gICAgcHJvdGVjdGVkIFhTREF0dHJpYnV0ZVVzZSB4c2RBdHRyaWJ1dGVVc2U7Ci0gICAgLy8gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IG5ldyBEYXRhVHlwZUltcGwoKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RBdHRyaWJ1dGVVc2UgLQotICAgICAqICAgICAgICAgIHRoZSBYTUwgU2NoZW1hIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIoWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSkKLSAgICB7Ci0gICAgICB0aGlzLnhzZEF0dHJpYnV0ZVVzZSA9IHhzZEF0dHJpYnV0ZVVzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RBdHRyaWJ1dGVVc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGdlbmVyYWwgWFBhdGggZXhwcmVzc2lvbiBmb3IgdGhlIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGdlbmVyYWwgWFBhdGggZXhwcmVzc2lvbiBmb3IgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTcGVjKCkKLSAgICB7Ci0gICAgICByZXR1cm4gIi8vQCIgKyBnZXRBdHRyTmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEFUVFJJQlVURV9ERUNMQVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBTaW1pbGFyIHRvIGdldEF0dHJOYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0QXR0ck5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBnZXRFbnVtQXR0ciBtZXRob2QKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGphdmEudXRpbC5FbnVtZXJhdGlvbgotICAgICAqIEBkZXByZWNhdGVkIC0tIHRvIGJlIHJlcGxhY2VkIGluIGZ1dHVyZSB3aXRoIGFkZGl0aW9uYWwgQ01EYXRhVHlwZQotICAgICAqICAgICAgICAgICAgIG1ldGhvZHMgKGN1cnJlbnRseSBmb3VuZCBvbiBDTURhdGFUeXBlSGVscGVyKQotICAgICAqLwotICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRFbnVtQXR0cigpCi0gICAgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKENvbGxlY3Rpb25zLkVNUFRZX0xJU1QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBhdHRyaWJ1dGUuIFNpbWlsYXIgdG8gZ2V0Tm9kZU5hbWUoKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0ck5hbWUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKS5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgYXR0cmlidXRlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01EYXRhVHlwZSBnZXRBdHRyVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRhdGFUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRhdGFUeXBlLmdldEltcGxpZWRWYWx1ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHVzYWdlIGNvbnN0cmFpbnQgZm9yIHRoaXMgYXR0cmlidXRlLiBUaGUgdXNhZ2VzIGFyZSBkZWZpbmVkCi0gICAgICogaW4gQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbiBjbGFzcyAoT1BUSU9OQUwsIFJFUVVJUkVELCBGSVhFRCBvcgotICAgICAqIFBST0hJQklURUQpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHVzYWdlIGNvbnN0cmFpbnQgZm9yIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VXNhZ2UoKQotICAgIHsKLSAgICAgIGludCB1c2VLaW5kID0gT1BUSU9OQUw7Ci0gICAgICBzd2l0Y2ggKHhzZEF0dHJpYnV0ZVVzZS5nZXRVc2UoKS5nZXRWYWx1ZSgpKQotICAgICAgewotICAgICAgICBjYXNlIFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5Lk9QVElPTkFMIDogewotICAgICAgICAgIHVzZUtpbmQgPSBPUFRJT05BTDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIFhTREF0dHJpYnV0ZVVzZUNhdGVnb3J5LlBST0hJQklURUQgOiB7Ci0gICAgICAgICAgdXNlS2luZCA9IFBST0hJQklURUQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBYU0RBdHRyaWJ1dGVVc2VDYXRlZ29yeS5SRVFVSVJFRCA6IHsKLSAgICAgICAgICB1c2VLaW5kID0gUkVRVUlSRUQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB1c2VLaW5kOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZvcm0gW2F0dHJpYnV0ZV0gd2hpY2ggYWZmZWN0cyB0aGUgdGFyZ2V0Ci0gICAgICogbmFtZXNwYWNlIG9mIGxvY2FsbHkgc2NvcGVkIGZlYXR1cmVzLiBJZiB0aGUgZm9ybSBpcyBub3Qgc2V0IG9uIHRoaXMKLSAgICAgKiBhdHRyaWJ1dGUsIHRoZW4gc2VlIGlmIHRoZXJlIGlzIGEgZ2xvYmFsbHkgZGVmaW5lZCBkZWZhdWx0LiBAcmV0dXJuIHRoZQotICAgICAqIHZhbHVlIG9mIHRoZSBmb3JtIFthdHRyaWJ1dGVdLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZm9ybSA9IG51bGw7Ci0gICAgICBpZiAoeHNkQXR0cmlidXRlVXNlLmdldENvbnRlbnQoKSAhPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb24oKSkKLSAgICAgIHsKLSAgICAgIAlmb3JtID0gICJxdWFsaWZpZWQiOwotICAgICAgfQkKLSAgICAgIGVsc2UgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb250ZW50KCkuaXNTZXRGb3JtKCkpCi0gICAgICB7Ci0gICAgICAgIGZvcm0gPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29udGVudCgpLmdldEZvcm0oKS5nZXROYW1lKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0U2NoZW1hKCk7Ci0gICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICBmb3JtID0gc2NoZW1hLmdldEF0dHJpYnV0ZUZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZvcm07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0QW5ub3RhdGlvbigpOwotICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKGFubm90YXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RBdHRyaWJ1dGVVc2UuZ2V0U2NoZW1hKCkpOwotICAgIH0KLSAgICAvKioKLSAgICAgKiBYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyLkRhdGFUeXBlSW1wbCBBbiBpbm5lciBjbGFzcyB0byBob2xkIHR5cGUKLSAgICAgKiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGNsYXNzIERhdGFUeXBlSW1wbCBpbXBsZW1lbnRzIENNRGF0YVR5cGUKLSAgICB7Ci0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIENNTm9kZS5EQVRBX1RZUEU7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHR5cGUuIFNhbWUgYXMgZ2V0RGF0YVR5cGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nIGdldE5vZGVOYW1lKCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldERhdGFUeXBlTmFtZSgpOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgZmFsc2UuIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBhbnkgcHJvcGVydGllcy4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gZmFsc2UuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIG51bGwuIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBhbnkgcHJvcGVydGllcy4KLSAgICAgICAqIAotICAgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgICAqIEByZXR1cm4gbnVsbC4KLSAgICAgICAqLwotICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS4gU2FtZSBhcyBnZXROb2RlTmFtZSgpLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKQotICAgICAgewotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzYyA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIFN0cmluZyB0eXBlTmFtZSA9IHNjLmdldE5hbWUoKTsKLSAgICAgICAgcmV0dXJuIHR5cGVOYW1lICE9IG51bGwgPyB0eXBlTmFtZSA6ICJzdHJpbmciOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGtpbmQgb2YgY29uc3RyYWludDogbm9uZSwgZGVmYXVsdCBvciBmaXhlZC4gVGhlIGtpbmRzIGFyZQotICAgICAgICogZGVmaW5lZCBpbiBDTURhdGFUeXBlIGNsYXNzIChJTVBMSUVEX1ZBTFVFX05PTkUsIElNUExJRURfVkFMVUVfRklYRUQgb3IKLSAgICAgICAqIElNUExJRURfVkFMVUVfREVGQVVMVCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGtpbmQgb2YgY29uc3RyYWludDogbm9uZSwgZGVmYXVsdCBvciBmaXhlZC4KLSAgICAgICAqLwotICAgICAgcHVibGljIGludCBnZXRJbXBsaWVkVmFsdWVLaW5kKCkKLSAgICAgIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IElNUExJRURfVkFMVUVfTk9ORTsKLSAgICAgICAgaWYgKHhzZEF0dHJpYnV0ZVVzZS5pc1NldENvbnN0cmFpbnQoKSkKLSAgICAgICAgewotICAgICAgICAgIGlmICh4c2RBdHRyaWJ1dGVVc2UuZ2V0Q29uc3RyYWludCgpLmdldFZhbHVlKCkgPT0gWFNEQ29uc3RyYWludC5ERUZBVUxUKQotICAgICAgICAgICAgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9ERUZBVUxUOwotICAgICAgICAgIGVsc2UgaWYgKHhzZEF0dHJpYnV0ZVVzZS5nZXRDb25zdHJhaW50KCkuZ2V0VmFsdWUoKSA9PSBYU0RDb25zdHJhaW50LkZJWEVEKQotICAgICAgICAgICAgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9GSVhFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IG9yIGZpeGVkIGNvbnN0cmFpbnQuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW1wbGllZFZhbHVlKCkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmICh4c2RBdHRyaWJ1dGVVc2UuaXNTZXRDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSB4c2RBdHRyaWJ1dGVVc2UuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yVHlwZShnZXRYU0RUeXBlKCkpOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIEdlbmVyYXRlIGEgdmFsaWQgdmFsdWUgZm9yIHRoZSBhdHRyaWJ1dGUgYmFzZWQgb24gaXRzIHR5cGUuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gYSB2YWxpZCB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZSBiYXNlZCBvbiBpdHMgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZUluc3RhbmNlVmFsdWUoKQotICAgICAgewotICAgICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0geHNkQXR0cmlidXRlVXNlLmdldEF0dHJpYnV0ZURlY2xhcmF0aW9uKCk7Ci0gICAgICAgIHJldHVybiBYU0RUeXBlVXRpbC5nZXRJbnN0YW5jZVZhbHVlKGF0dHIuZ2V0UmVzb2x2ZWRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpLmdldFR5cGVEZWZpbml0aW9uKCkpOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICAgKi8KLSAgICAgIHByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiBnZXRYU0RUeXBlKCkKLSAgICAgIHsKLSAgICAgICAgWFNEQXR0cmlidXRlRGVjbGFyYXRpb24gYXR0ciA9IHhzZEF0dHJpYnV0ZVVzZS5nZXRBdHRyaWJ1dGVEZWNsYXJhdGlvbigpOwotICAgICAgICByZXR1cm4gYXR0ci5nZXRSZXNvbHZlZEF0dHJpYnV0ZURlY2xhcmF0aW9uKCkuZ2V0VHlwZURlZmluaXRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsIGltcGxlbWVudHMgQ01FbGVtZW50RGVjbGFyYXRpb24uIFRoaXMgaXMgdGhlCi0gICAqIGJhc2UgY2xhc3MgZm9yIFhTREVsZW1lbnREZWNsYXJhdGlvbiBhbmQgRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwuCi0gICAqIAotICAgKiBBYnN0cmFjdCBtZXRob2RzIGluIHRoaXMgY2xhc3MgYXJlOiBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0IGdldEtleSgpOyBwdWJsaWMKLSAgICogYWJzdHJhY3QgT2JqZWN0IGdldE5TUHJlZml4UXVhbGlmaWNhdGlvbigpOyBwdWJsaWMgYWJzdHJhY3QKLSAgICogWFNERWxlbWVudERlY2xhcmF0aW9uIGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpOyBwdWJsaWMgYWJzdHJhY3QKLSAgICogWFNEVHlwZURlZmluaXRpb24gZ2V0WFNEVHlwZSgpOyBwdWJsaWMgYWJzdHJhY3QgTGlzdCBnZXRYU0lUeXBlcygpOyBwdWJsaWMKLSAgICogYWJzdHJhY3QgQ01FbGVtZW50RGVjbGFyYXRpb24gZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbihTdHJpbmcKLSAgICogdXJpUXVhbGlmaWVkVHlwZU5hbWUpOyBwdWJsaWMgYWJzdHJhY3QgQ01Ob2RlIGdldERlZmluaXRpb24oKTsgcHVibGljCi0gICAqIGFic3RyYWN0IFN0cmluZyBnZXREZWZpbml0aW9uSW5mbygpOyBwdWJsaWMgYWJzdHJhY3QgQ01Ob2RlTGlzdEltcGwKLSAgICogZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwgZXh0ZW5kcyBYU0RCYXNlQWRhcHRlciBpbXBsZW1lbnRzIENNRWxlbWVudERlY2xhcmF0aW9uCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IG5ldyBEYXRhVHlwZUltcGwoKTsKLSAgICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXAgbmFtZWROb2RlTWFwOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gRUxFTUVOVF9ERUNMQVJBVElPTjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBUaGUgc2FtZSBhcyBnZXRFbGVtZW50TmFtZSgpLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuIGdldEVsZW1lbnROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQuIFRoZSBzYW1lIGFzIGdldE5vZGVOYW1lKCkuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRFbGVtZW50TmFtZSgpCi0gICAgewotICAgICAgU3RyaW5nIHJlc3VsdCA9IGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TmFtZSgpOwotICAgICAgcmV0dXJuIHJlc3VsdCAhPSBudWxsID8gcmVzdWx0IDogIiI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgZm9yIHRoaXMgY2xhc3MuCi0gICAgICogCi0gICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAtCi0gICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICB7Ci0gICAgICByZXR1cm4gcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9YU0lUWVBFUykgfHwgcHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ERVJJVkVEX0VMRU1FTlRfREVDTEFSQVRJT04pIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQKQotICAgICAgICAgIHx8IHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfQUJTVFJBQ1QpIHx8IHN1cGVyLnN1cHBvcnRzKHByb3BlcnR5TmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0S2V5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2YgYXR0cmlidXRlcyBkZWZpbmVkIGZvciB0aGlzIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc2V0IG9mIGF0dHJpYnV0ZXMgZGVmaW5lZCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBDTU5hbWVkTm9kZU1hcCBnZXRBdHRyaWJ1dGVzKCkKLSAgICB7Ci0gICAgICBDTU5hbWVkTm9kZU1hcEltcGwgbWFwID0gbmV3IENNTmFtZWROb2RlTWFwSW1wbCgpOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBnZXRYU0RUeXBlKCk7Ci0gICAgICBnZXRBdHRyaWJ1dGVzKG1hcCwgdGQpOwotICAgICAgYWRkWFNJVHlwZUF0dHJpYnV0ZShtYXApOwotICAgICAgcmV0dXJuIG1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHYXRoZXIgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIGRlZmluZWQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gbWFwIC0KLSAgICAgKiAgICAgICAgICB1c2VkIGZvciByZXR1cm5pbmcgdGhlIHNldCBvZiBhdHRyaWJ1dGVzLgotICAgICAqIEBwYXJhbSB4c2RUeXBlRGVmaW5pdGlvbiAtCi0gICAgICogICAgICAgICAgdGhlIHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldEF0dHJpYnV0ZXMoQ01OYW1lZE5vZGVNYXBJbXBsIG1hcCwgWFNEVHlwZURlZmluaXRpb24geHNkVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgaWYgKHhzZFR5cGVEZWZpbml0aW9uIGluc3RhbmNlb2YgWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKQotICAgICAgewotICAgICAgICBYU0RDb21wbGV4VHlwZURlZmluaXRpb24gY3RkID0gKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikgeHNkVHlwZURlZmluaXRpb247Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGN0ZC5nZXRBdHRyaWJ1dGVVc2VzKCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEQXR0cmlidXRlVXNlIHhzZEF0dHJpYnV0ZVVzZSA9IChYU0RBdHRyaWJ1dGVVc2UpIGkubmV4dCgpOwotICAgICAgICAgIFhTREF0dHJpYnV0ZVVzZUFkYXB0ZXIgYWRhcHRlciA9IChYU0RBdHRyaWJ1dGVVc2VBZGFwdGVyKSBnZXRBZGFwdGVyKHhzZEF0dHJpYnV0ZVVzZSk7Ci0gICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCAmJiBhZGFwdGVyLmdldE5vZGVOYW1lKCkgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBtYXAuZ2V0SGFzaHRhYmxlKCkucHV0KGFkYXB0ZXIuZ2V0Tm9kZU5hbWUoKSwgYWRhcHRlcik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Db250ZW50IGdldENvbnRlbnQoKQotICAgIHsKLSAgICAgIENNQ29udGVudCByZXN1bHQgPSBudWxsOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBnZXRYU0RUeXBlKCk7Ci0gICAgICBpZiAodGQgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIERlcml2ZWRDaGlsZFZpc2l0b3IgZGN2ID0gbmV3IERlcml2ZWRDaGlsZFZpc2l0b3IodGQpOwotICAgICAgICBkY3YudmlzaXRUeXBlRGVmaW5pdGlvbih0ZCk7Ci0gICAgICAgIENNTm9kZUxpc3Qgbm9kZUxpc3QgPSBkY3YuZ2V0Q2hpbGROb2RlTGlzdCgpOwotICAgICAgICBpZiAobm9kZUxpc3QuZ2V0TGVuZ3RoKCkgPiAxKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gbmV3IENNR3JvdXBJbXBsKG5vZGVMaXN0LCBDTUdyb3VwLlNFUVVFTkNFKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChub2RlTGlzdC5nZXRMZW5ndGgoKSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXN1bHQgPSAoQ01Db250ZW50KSBub2RlTGlzdC5pdGVtKDApOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnQgdHlwZSBvZiB0aGlzIGVsZW1lbnQuIFRoZSBjb250ZW50IHR5cGUgaXMgZGVmaW5lZCBpbgotICAgICAqIENNRWxlbWVudERlY2xhcmF0aW9uIChBTlksIEVNUFRZLCBFTEVNRU5ULCBNSVhFRCwgUENEQVRBIG9yIENEQVRBKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IHR5cGUgb2YgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q29udGVudFR5cGUoKQotICAgIHsKLSAgICAgIGludCBjb250ZW50VHlwZSA9IEVNUFRZOwotICAgICAgWFNEVHlwZURlZmluaXRpb24gdGQgPSBnZXRYU0RUeXBlKCk7Ci0gICAgICBpZiAodGQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHR5cGVOYW1lID0gdGQuZ2V0TmFtZSgpOwotICAgICAgICBpZiAodHlwZU5hbWUgIT0gbnVsbCAmJiB0eXBlTmFtZS5lcXVhbHMoImFueVR5cGUiKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRlbnRUeXBlID0gQU5ZOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGNvbnRlbnRUeXBlID0gUENEQVRBOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICh0ZCBpbnN0YW5jZW9mIFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgWFNEQ29udGVudFR5cGVDYXRlZ29yeSBjYXRlZ29yeSA9ICgoWFNEQ29tcGxleFR5cGVEZWZpbml0aW9uKSB0ZCkuZ2V0Q29udGVudFR5cGVDYXRlZ29yeSgpOwotICAgICAgICBpZiAoY2F0ZWdvcnkgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIHN3aXRjaCAoY2F0ZWdvcnkuZ2V0VmFsdWUoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkuRUxFTUVOVF9PTkxZIDoKLSAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBFTEVNRU5UOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgWFNEQ29udGVudFR5cGVDYXRlZ29yeS5FTVBUWSA6Ci0gICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gRU1QVFk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBYU0RDb250ZW50VHlwZUNhdGVnb3J5Lk1JWEVEIDoKLSAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBNSVhFRDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFhTRENvbnRlbnRUeXBlQ2F0ZWdvcnkuU0lNUExFIDoKLSAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBQQ0RBVEE7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGNvbnRlbnRUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIENNRGF0YVR5cGUgZ2V0RGF0YVR5cGUoKQotICAgIHsKLSAgICAgIENNRGF0YVR5cGUgcmVzdWx0ID0gbnVsbDsKLSAgICAgIGludCBjb250ZW50VHlwZSA9IGdldENvbnRlbnRUeXBlKCk7Ci0gICAgICBib29sZWFuIGhhc0RhdGFUeXBlID0gY29udGVudFR5cGUgPT0gUENEQVRBIHx8IGNvbnRlbnRUeXBlID09IE1JWEVEOwotICAgICAgaWYgKGhhc0RhdGFUeXBlKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBkYXRhVHlwZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNaW5PY2N1cnMoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgICAqICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZGVjbGFyYXRpb24gaWYgdGhpcyBpcyBhbiBlbGVtZW50Ci0gICAgICogcmVmZXJlbmNlLiBPdGhlcndpc2UgaXQgcmV0dXJucyBpdHNlbGYuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogbG9jYWwuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqICAgICAgICAgbG9jYWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXREZWZpbml0aW9uSW5mbygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZWxlbWVudHMgbG9jYWwgdG8gdGhpcyBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnRzIGxvY2FsIHRvIHRoaXMgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0TG9jYWxFbGVtZW50cygpCi0gICAgewotICAgICAgaWYgKG5hbWVkTm9kZU1hcCA9PSBudWxsKQotICAgICAgewotICAgICAgICBMb2NhbEVsZW1lbnRWaXNpdG9yIGxvY2FsRWxlbWVudFZpc2l0b3IgPSBuZXcgTG9jYWxFbGVtZW50VmlzaXRvcigpOwotICAgICAgICBsb2NhbEVsZW1lbnRWaXNpdG9yLnZpc2l0VHlwZURlZmluaXRpb24oZ2V0WFNEVHlwZSgpKTsKLSAgICAgICAgbmFtZWROb2RlTWFwID0gbG9jYWxFbGVtZW50VmlzaXRvci5nZXRDTU5hbWVkTm9kZU1hcCgpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5hbWVkTm9kZU1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHByb3BlcnR5IG5hbWUuIFJldHVybnMgbnVsbCBpZiB0aGUKLSAgICAgKiBwcm9wZXJ0eSBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgcHJvcGVydHkgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgT2JqZWN0IHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ERUZJTklUSU9OX0lORk8pKQotICAgICAgewotICAgICAgICByZXN1bHQgPSBnZXREZWZpbml0aW9uSW5mbygpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9ERUZJTklUSU9OKSkKLSAgICAgIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHlOYW1lLmVxdWFscyhQUk9QRVJUWV9YU0lUWVBFUykpCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IGdldFhTSVR5cGVzKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuc3RhcnRzV2l0aChQUk9QRVJUWV9ERVJJVkVEX0VMRU1FTlRfREVDTEFSQVRJT04pKQotICAgICAgewotICAgICAgICBpbnQgaW5kZXggPSBwcm9wZXJ0eU5hbWUuaW5kZXhPZigiPSIpOwotICAgICAgICBpZiAoaW5kZXggIT0gLTEpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUgPSBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSk7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0RGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbih1cmlRdWFsaWZpZWRUeXBlTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5TmFtZS5lcXVhbHMoUFJPUEVSVFlfU1VCU1RJVFVUSU9OX0dST1VQKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eU5hbWUuZXF1YWxzKFBST1BFUlRZX0FCU1RSQUNUKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEFic3RyYWN0KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJlc3VsdCA9IHN1cGVyLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTmlsbGFibGUnIGF0dHJpYnV0ZS4gVGhpcyByZXByZXNlbnRzIHRoZQotICAgICAqIG5pbGxhYmxlIGluZm9zZXQgcHJvcGVydHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGZhbHNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTmlsbGFibGUnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05pbGxhYmxlKCkKLSAgICB7Ci0gICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNTZXROaWxsYWJsZSgpKQotICAgICAgICByZXR1cm4gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNOaWxsYWJsZSgpOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBlbGVtZW50IGlzICdBYnN0cmFjdCcuCi0gICAgICogCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbGVtZW50IGlzICdBYnN0cmFjdCcuCi0gICAgICovCi0gICAgcHVibGljIEJvb2xlYW4gZ2V0QWJzdHJhY3QoKQotICAgIHsKLSAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKS5pc0Fic3RyYWN0KCk7Ci0gICAgICAvLyBUT0RPLi4uIGhvdyBkbyB3ZSBoYW5kbGUgZWxlbWVudHMgd2l0aCBhYnN0cmFjdCB0eXBlJ3MgPwotICAgICAgcmV0dXJuIHJlc3VsdCA/IEJvb2xlYW4uVFJVRSA6IEJvb2xlYW4uRkFMU0U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0IGdldERvY3VtZW50YXRpb24oKQotICAgIHsKLSAgICAgIFhTREFubm90YXRpb24gYW5ub3RhdGlvbiA9IGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldEFubm90YXRpb24oKTsKLSAgICAgIHJldHVybiBnZXREb2N1bWVudGF0aW9ucyhhbm5vdGF0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTGlzdCBnZXRYU0lUeXBlcygpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBhZGRYU0lUeXBlQXR0cmlidXRlKENNTmFtZWROb2RlTWFwSW1wbCBtYXApCi0gICAgewotICAgICAgTGlzdCBsaXN0ID0gZ2V0WFNJVHlwZXMoKTsKLSAgICAgIGludCBsaXN0U2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgICAgaWYgKGxpc3RTaXplID4gMSkKLSAgICAgIHsKLSAgICAgICAgQ01EYXRhVHlwZSBkYXRhVHlwZSA9IG5ldyBDTURhdGFUeXBlSW1wbCgidHlwZU5hbWVzIiwgKFN0cmluZykgbnVsbCk7Ci0gICAgICAgIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIGF0dHJpYnV0ZSA9IG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCgidHlwZSIsIENNQXR0cmlidXRlRGVjbGFyYXRpb24uT1BUSU9OQUwsIGRhdGFUeXBlKTsKLSAgICAgICAgYXR0cmlidXRlLnNldENNRG9jdW1lbnQoeHNpRG9jdW1lbnQpOwotICAgICAgICBhdHRyaWJ1dGUuc2V0UHJlZml4UXVhbGlmaWNhdGlvbih0cnVlKTsKLSAgICAgICAgYXR0cmlidXRlLnNldFhTSVR5cGVzKGxpc3QpOwotICAgICAgICBtYXAuZ2V0SGFzaHRhYmxlKCkucHV0KGF0dHJpYnV0ZS5nZXROb2RlTmFtZSgpLCBhdHRyaWJ1dGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsgICAgICAKLSAgICAgIFhTRFNjaGVtYSBzY2hlbWEgPSBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpOwotICAgICAgaWYgKHNjaGVtYSA9PSBudWxsKQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIGVsc2UgIAotICAgICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoc2NoZW1hKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4gVGhlIGdyb3VwIGNvbnNpc3RzIG9mOgotICAgICAqIDEuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGl0c2VsZiAyLiBhbmQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBoYXMKLSAgICAgKiBhIHtzdWJzdGl0dXRpb24gZ3JvdXAgYWZmaWxpYXRpb259IGluIHRoZSBncm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBDTU5vZGVMaXN0SW1wbCBnZXRTdWJzdGl0dXRpb25Hcm91cCgpOwotICAgIC8qCi0gICAgICogWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlci5EYXRhVHlwZUltcGwgQW4gaW5uZXIgY2xhc3MgdG8gaG9sZCB0eXBlCi0gICAgICogaW5mb3JtYXRpb24gZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgY2xhc3MgRGF0YVR5cGVJbXBsIGltcGxlbWVudHMgQ01EYXRhVHlwZQotICAgIHsKLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgICAgewotICAgICAgICByZXR1cm4gQ01Ob2RlLkRBVEFfVFlQRTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHR5cGUuIFNhbWUgYXMgZ2V0RGF0YVR5cGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXREYXRhVHlwZU5hbWUoKTsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIGZhbHNlLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgYW55IHByb3BlcnRpZXMuCi0gICAgICAgKiAKLSAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICAgKiBAcmV0dXJuIGZhbHNlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhTdHJpbmcgcHJvcGVydHlOYW1lKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyBudWxsLiBUaGlzIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgYW55IHByb3BlcnRpZXMuCi0gICAgICAgKiAKLSAgICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAgICogICAgICAgICAgbmFtZSBvZiBhIHByb3BlcnR5Ci0gICAgICAgKiBAcmV0dXJuIG51bGwuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCB0eXBlLiBTYW1lIGFzIGdldE5vZGVOYW1lKCkuCi0gICAgICAgKiAKLSAgICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZS4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXREYXRhVHlwZU5hbWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgdHlwZU5hbWUgPSBudWxsOwotICAgICAgICBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbiBzdGQgPSBnZXRYU0RUeXBlKCkuZ2V0U2ltcGxlVHlwZSgpOwotICAgICAgICBpZiAoc3RkICE9IG51bGwpCi0gICAgICAgICAgdHlwZU5hbWUgPSBzdGQuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gdHlwZU5hbWUgIT0gbnVsbCA/IHR5cGVOYW1lIDogInN0cmluZyI7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLiBUaGUga2luZHMgYXJlCi0gICAgICAgKiBkZWZpbmVkIGluIENNRGF0YVR5cGUgY2xhc3MgKElNUExJRURfVkFMVUVfTk9ORSwgSU1QTElFRF9WQUxVRV9GSVhFRCBvcgotICAgICAgICogSU1QTElFRF9WQUxVRV9ERUZBVUxUKS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUga2luZCBvZiBjb25zdHJhaW50OiBub25lLCBkZWZhdWx0IG9yIGZpeGVkLgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldEltcGxpZWRWYWx1ZUtpbmQoKQotICAgICAgewotICAgICAgICBpbnQgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9OT05FOwotICAgICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuaXNTZXRDb25zdHJhaW50KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0Q29uc3RyYWludCgpLmdldFZhbHVlKCkgPT0gWFNEQ29uc3RyYWludC5ERUZBVUxUKQotICAgICAgICAgICAgcmVzdWx0ID0gSU1QTElFRF9WQUxVRV9ERUZBVUxUOwotICAgICAgICAgIGVsc2UgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldENvbnN0cmFpbnQoKS5nZXRWYWx1ZSgpID09IFhTRENvbnN0cmFpbnQuRklYRUQpCi0gICAgICAgICAgICByZXN1bHQgPSBJTVBMSUVEX1ZBTFVFX0ZJWEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgb3IgZml4ZWQgY29uc3RyYWludC4KLSAgICAgICAqLwotICAgICAgcHVibGljIFN0cmluZyBnZXRJbXBsaWVkVmFsdWUoKQotICAgICAgewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmlzU2V0Q29uc3RyYWludCgpKQotICAgICAgICB7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0WFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0TGV4aWNhbFZhbHVlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBSZXR1cm5zIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICogCi0gICAgICAgKiBAcmV0dXJuIHRoZSBlbnVtZXJhdGVkIHZhbHVlcyBmb3IgdGhlIGF0dHJpYnV0ZSB0eXBlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RW51bWVyYXRlZFZhbHVlcygpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBnZXRFbnVtZXJhdGVkVmFsdWVzRm9yVHlwZShnZXRYU0RUeXBlKCkpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlSW5zdGFuY2VWYWx1ZSgpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBYU0RUeXBlVXRpbC5nZXRJbnN0YW5jZVZhbHVlKGdldFhTRFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgICAqIAotICAgICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAgICovCi0gICAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKGdldFhTREVsZW1lbnREZWNsYXJhdGlvbigpLmdldFNjaGVtYSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgLyoqCi0gICAqIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIgaW1wbGVtZW50cyBDTUVsZW1lbnREZWNsYXJhdGlvbi4gQQotICAgKiByZXByZXNlbnRhdGlvbiBvZiB0aGUgbW9kZWwgb2JqZWN0ICdFbGVtZW50IERlY2xhcmF0aW9uJy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlciBleHRlbmRzIEVsZW1lbnREZWNsYXJhdGlvbkJhc2VJbXBsCi0gIHsKLSAgICBwcm90ZWN0ZWQgTGlzdCBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyA9IG51bGw7Ci0gICAgcHJvdGVjdGVkIExpc3QgeHNpVHlwZXMgPSBudWxsOwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24geHNkRWxlbWVudERlY2xhcmF0aW9uOwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBzdWJzdGl0dXRpb25Hcm91cDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSB4c2RFbGVtZW50RGVjbGFyYXRpb24gLQotICAgICAqICAgICAgICAgIHRoZSBYTUwgU2NoZW1hIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFhTREVsZW1lbnREZWNsYXJhdGlvbkFkYXB0ZXIoWFNERWxlbWVudERlY2xhcmF0aW9uIHhzZEVsZW1lbnREZWNsYXJhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnhzZEVsZW1lbnREZWNsYXJhdGlvbiA9IHhzZEVsZW1lbnREZWNsYXJhdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb24gZ2V0UmVzb2x2ZWRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgcmVmZXJlbmNlZCBlbGVtZW50IGRlY2xhcmF0aW9uIGlmIHRoaXMgaXMgYW4gZWxlbWVudAotICAgICAqIHJlZmVyZW5jZS4gT3RoZXJ3aXNlIGl0IHJldHVybnMgaXRzZWxmLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYW4gZWxlbWVudCBkZWNsYXJhdGlvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Ob2RlIGdldERlZmluaXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRBZGFwdGVyKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5nZXRSZXNvbHZlZEVsZW1lbnREZWNsYXJhdGlvbigpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIGluZGljYXRpbmcgd2hldGhlciB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpcyBnbG9iYWwgb3IKLSAgICAgKiBsb2NhbC4gUmV0dXJucyBudWxsIGlmIHRoaXMgaXMgYW4gZWxlbWVudCByZWZlcmVuY2UuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogICAgICAgICBsb2NhbC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldERlZmluaXRpb25JbmZvKCkKLSAgICB7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgZWxzZSBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzR2xvYmFsKCkpCi0gICAgICAgIHJldHVybiBERUZJTklUSU9OX0lORk9fR0xPQkFMOwotICAgICAgZWxzZQotICAgICAgICByZXR1cm4gREVGSU5JVElPTl9JTkZPX0xPQ0FMOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0TlNQcmVmaXhRdWFsaWZpY2F0aW9uKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgZm9ybSA9IG51bGw7Ci0gICAgICBpZiAoeHNkRWxlbWVudERlY2xhcmF0aW9uLmlzRWxlbWVudERlY2xhcmF0aW9uUmVmZXJlbmNlKCkpCi0gICAgICB7Ci0gICAgICAgIGZvcm0gPSAicXVhbGlmaWVkIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKHhzZEVsZW1lbnREZWNsYXJhdGlvbi5pc1NldEZvcm0oKSkKLSAgICAgICAgewotICAgICAgICAgIGZvcm0gPSB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0Rm9ybSgpLmdldE5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0geHNkRWxlbWVudERlY2xhcmF0aW9uLmdldFNjaGVtYSgpOwotICAgICAgICAgIGlmIChzY2hlbWEgIT0gbnVsbCkKLSAgICAgICAgICAgIGZvcm0gPSBzY2hlbWEuZ2V0RWxlbWVudEZvcm1EZWZhdWx0KCkuZ2V0TmFtZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZm9ybTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RFbGVtZW50RGVjbGFyYXRpb24uZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKS5nZXRUeXBlRGVmaW5pdGlvbigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRYU0lUeXBlcygpCi0gICAgewotICAgICAgaWYgKHhzaVR5cGVzID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXB1dGVEZXJpdmVkVHlwZUluZm8oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB4c2lUeXBlczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb21wdXRlRGVyaXZlZFR5cGVJbmZvKCkKLSAgICB7Ci0gICAgICB4c2lUeXBlcyA9IG5ldyBWZWN0b3IoKTsKLSAgICAgIGRlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25zID0gbmV3IFZlY3RvcigpOwotICAgICAgY29tcHV0ZURlcml2ZWRUeXBlSW5mb0hlbHBlcihnZXRYU0RUeXBlKCksIHhzaVR5cGVzLCBkZXJpdmVkRWxlbWVudERlY2xhcmF0aW9ucyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgY29tcHV0ZURlcml2ZWRUeXBlSW5mb0hlbHBlcihYU0RUeXBlRGVmaW5pdGlvbiB0eXBlLCBMaXN0IHR5cGVOYW1lTGlzdCwgTGlzdCBlZExpc3QpCi0gICAgewotICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgICB7Ci0gICAgICAgIExpc3QgZGVyaXZlZFR5cGVzID0gZmluZFR5cGVzRGVyaXZlZEZyb20odHlwZSk7Ci0gICAgICAgIEFycmF5TGlzdCBpbmNsdXNpdmVEZXJpdmVkVHlwZXMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGluY2x1c2l2ZURlcml2ZWRUeXBlcy5hZGQodHlwZSk7Ci0gICAgICAgIGlmICgoZGVyaXZlZFR5cGVzICE9IG51bGwpICYmIChkZXJpdmVkVHlwZXMuc2l6ZSgpID4gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpbmNsdXNpdmVEZXJpdmVkVHlwZXMuYWRkQWxsKGRlcml2ZWRUeXBlcyk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gaW5jbHVzaXZlRGVyaXZlZFR5cGVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGRlcml2ZWRUeXBlID0gKFhTRFR5cGVEZWZpbml0aW9uKSBpLm5leHQoKTsKLSAgICAgICAgICBYU0RTY2hlbWEgc2NoZW1hID0gZGVyaXZlZFR5cGUuZ2V0U2NoZW1hKCk7Ci0gICAgICAgICAgaWYgKHNjaGVtYSAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyB1cmkgPSBzY2hlbWEuZ2V0VGFyZ2V0TmFtZXNwYWNlKCk7Ci0gICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGRlcml2ZWRUeXBlLmdldE5hbWUoKTsKLSAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG5hbWUgPSB1cmkgIT0gbnVsbCA/ICgiWyIgKyB1cmkgKyAiXSIgKyBuYW1lKSA6IG5hbWU7Ci0gICAgICAgICAgICAgIHR5cGVOYW1lTGlzdC5hZGQobmFtZSk7Ci0gICAgICAgICAgICAgIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGVkID0gbmV3IERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsKHRoaXMsIGRlcml2ZWRUeXBlLCBuYW1lKTsKLSAgICAgICAgICAgICAgZWRMaXN0LmFkZChlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKQotICAgIHsKLSAgICAgIENNRWxlbWVudERlY2xhcmF0aW9uIHJlc3VsdCA9IG51bGw7Ci0gICAgICBpZiAoZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgY29tcHV0ZURlcml2ZWRUeXBlSW5mbygpOwotICAgICAgfQotICAgICAgZm9yIChJdGVyYXRvciBpID0gZGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbnMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCBlZCA9IChEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbCkgaS5uZXh0KCk7Ci0gICAgICAgIGlmICgoZWQgIT0gbnVsbCkgJiYgKGVkLnVyaVF1YWxpZmllZFR5cGVOYW1lICE9IG51bGwpKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGVkLnVyaVF1YWxpZmllZFR5cGVOYW1lLmVxdWFscyh1cmlRdWFsaWZpZWRUeXBlTmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0ID0gZWQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc3Vic3RpdHV0aW9uIGdyb3VwIGZvciB0aGlzIGVsZW1lbnQuIFRoZSBncm91cCBjb25zaXN0cyBvZjoKLSAgICAgKiAxLiB0aGUgZWxlbWVudCBkZWNsYXJhdGlvbiBpdHNlbGYgMi4gYW5kIGFueSBlbGVtZW50IGRlY2xhcmF0aW9uIHRoYXQgaGFzCi0gICAgICogYSB7c3Vic3RpdHV0aW9uIGdyb3VwIGFmZmlsaWF0aW9ufSBpbiB0aGUgZ3JvdXAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdEltcGwgZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKQotICAgIHsKLSAgICAgIGlmIChzdWJzdGl0dXRpb25Hcm91cCA9PSBudWxsKQotICAgICAgewotICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgICAgICBMaXN0IHNncm91cCA9IGdldFJlc29sdmVkWFNERWxlbWVudERlY2xhcmF0aW9uKCkuZ2V0U3Vic3RpdHV0aW9uR3JvdXAoKTsKLSAgICAgICAgZm9yIChJdGVyYXRvciBpID0gc2dyb3VwLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTREVsZW1lbnREZWNsYXJhdGlvbiBlZCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGkubmV4dCgpOyAgCi0gICAgICAgICAgc3Vic3RpdHV0aW9uR3JvdXAuYWRkKGdldEFkYXB0ZXIoZWQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHN1YnN0aXR1dGlvbkdyb3VwOwotICAgIH0KLSAgfQotICAvKioKLSAgICogRGVyaXZlZEVsZW1lbnREZWNsYXJhdGlvbkltcGwgZXh0ZW5kcyBFbGVtZW50RGVjbGFyYXRpb25CYXNlSW1wbAotICAgKiAgCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb25JbXBsIGV4dGVuZHMgRWxlbWVudERlY2xhcmF0aW9uQmFzZUltcGwKLSAgewotICAgIHByb3RlY3RlZCBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIG93bmVyOwotICAgIHByb3RlY3RlZCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlOwotICAgIHB1YmxpYyBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gb3duZXIgLQotICAgICAqIEBwYXJhbSB4c2RUeXBlIC0KLSAgICAgKiBAcGFyYW0gdXJpUXVhbGlmaWVkVHlwZU5hbWUgLQotICAgICAqLwotICAgIHB1YmxpYyBEZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uSW1wbChYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIG93bmVyLCBYU0RUeXBlRGVmaW5pdGlvbiB4c2RUeXBlLCBTdHJpbmcgdXJpUXVhbGlmaWVkVHlwZU5hbWUpCi0gICAgewotICAgICAgdGhpcy5vd25lciA9IG93bmVyOwotICAgICAgdGhpcy54c2RUeXBlID0geHNkVHlwZTsKLSAgICAgIHRoaXMudXJpUXVhbGlmaWVkVHlwZU5hbWUgPSB1cmlRdWFsaWZpZWRUeXBlTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRYU0RFbGVtZW50RGVjbGFyYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiAoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvd25lci5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTREVsZW1lbnREZWNsYXJhdGlvbiBnZXRSZXNvbHZlZFhTREVsZW1lbnREZWNsYXJhdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuICgoWFNERWxlbWVudERlY2xhcmF0aW9uKSBvd25lci5nZXRLZXkoKSkuZ2V0UmVzb2x2ZWRFbGVtZW50RGVjbGFyYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXRLZXkoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEgdHlwZSBkZWZpbml0aW9uLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYSB0eXBlIGRlZmluaXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFhTRFR5cGVEZWZpbml0aW9uIGdldFhTRFR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RUeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHR5cGUgbmFtZXMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdHlwZSBuYW1lcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgTGlzdCBnZXRYU0lUeXBlcygpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldFhTSVR5cGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHVyaSBxdWFsaWZpZWQKLSAgICAgKiB0eXBlIG5hbWUuCi0gICAgICogCi0gICAgICogQHBhcmFtIHVyaVF1YWxpZmllZFR5cGVOYW1lIC0KLSAgICAgKiAgICAgICAgICBhIHVyaSBxdWFsaWZpZWQgdHlwZSBuYW1lCi0gICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgZGVjbGFyYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNRWxlbWVudERlY2xhcmF0aW9uIGdldERlcml2ZWRFbGVtZW50RGVjbGFyYXRpb24oU3RyaW5nIHVyaVF1YWxpZmllZFR5cGVOYW1lKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXREZXJpdmVkRWxlbWVudERlY2xhcmF0aW9uKHVyaVF1YWxpZmllZFR5cGVOYW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSByZWZlcmVuY2VkIGVsZW1lbnQgZGVjbGFyYXRpb24gaWYgdGhpcyBpcyBhbiBlbGVtZW50Ci0gICAgICogcmVmZXJlbmNlLiBPdGhlcndpc2UgaXQgcmV0dXJucyBpdHNlbGYuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlbGVtZW50IGRlY2xhcmF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGUgZ2V0RGVmaW5pdGlvbigpCi0gICAgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHN0cmluZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGVsZW1lbnQgZGVjbGFyYXRpb24gaXMgZ2xvYmFsIG9yCi0gICAgICogbG9jYWwuIFJldHVybnMgbnVsbCBpZiB0aGlzIGlzIGFuIGVsZW1lbnQgcmVmZXJlbmNlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBzdHJpbmcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGlzIGdsb2JhbCBvcgotICAgICAqICAgICAgICAgbG9jYWwuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXREZWZpbml0aW9uSW5mbygpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldERlZmluaXRpb25JbmZvKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgZm9ybSBbYXR0cmlidXRlXSB3aGljaCBhZmZlY3RzIHRoZSB0YXJnZXQKLSAgICAgKiBuYW1lc3BhY2Ugb2YgbG9jYWxseSBzY29wZWQgZmVhdHVyZXMuIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmb3JtCi0gICAgICogW2F0dHJpYnV0ZV0uCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKQotICAgIHsKLSAgICAgIHJldHVybiBvd25lci5nZXROU1ByZWZpeFF1YWxpZmljYXRpb24oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzdWJzdGl0dXRpb24gZ3JvdXAgZm9yIHRoaXMgZWxlbWVudC4gVGhlIGdyb3VwIGNvbnNpc3RzIG9mOgotICAgICAqIDEuIHRoZSBlbGVtZW50IGRlY2xhcmF0aW9uIGl0c2VsZiAyLiBhbmQgYW55IGVsZW1lbnQgZGVjbGFyYXRpb24gdGhhdCBoYXMKLSAgICAgKiBhIHtzdWJzdGl0dXRpb24gZ3JvdXAgYWZmaWxpYXRpb259IGluIHRoZSBncm91cAotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHN1YnN0aXR1dGlvbiBncm91cCBmb3IgdGhpcyBlbGVtZW50LgotICAgICAqLwotICAgIHByb3RlY3RlZCBDTU5vZGVMaXN0SW1wbCBnZXRTdWJzdGl0dXRpb25Hcm91cCgpCi0gICAgewotICAgICAgcmV0dXJuIG93bmVyLmdldFN1YnN0aXR1dGlvbkdyb3VwKCk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RXaWxkY2FyZEFkYXB0ZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNEV2lsZGNhcmRBZGFwdGVyIGV4dGVuZHMgWFNEQmFzZUFkYXB0ZXIgaW1wbGVtZW50cyBDTUFueUVsZW1lbnQKLSAgewotICAgIHByb3RlY3RlZCBYU0RXaWxkY2FyZCB4c2RXaWxkY2FyZDsKLQotICAgIHB1YmxpYyBYU0RXaWxkY2FyZEFkYXB0ZXIoWFNEV2lsZGNhcmQgeHNkV2lsZGNhcmQpCi0gICAgewotICAgICAgdGhpcy54c2RXaWxkY2FyZCA9IHhzZFdpbGRjYXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUgd2hpY2ggaXMgdGhlIGNvcnJlc3BvbmRpbmcgWE1MIFNjaGVtYQotICAgICAqIG5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUga2V5IGZvciB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldEtleSgpCi0gICAgewotICAgICAgcmV0dXJuIHhzZFdpbGRjYXJkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIEFOWV9FTEVNRU5UOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICJhbnkiOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZXNwYWNlVVJJKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdXJpID0geHNkV2lsZGNhcmQuZ2V0RWxlbWVudCgpLmdldEF0dHJpYnV0ZSgibmFtZXNwYWNlIik7Ci0gICAgICByZXR1cm4gKHVyaSAhPSBudWxsIHx8IHVyaS5sZW5ndGgoKSA9PSAwKSA/IHVyaSA6ICIjI2FueSI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNaW5PY2N1cnMoeHNkV2lsZGNhcmQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcwotICAgICAqICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1heE9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWF4T2NjdXJzKHhzZFdpbGRjYXJkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBjbWRvY3VtZW50IHRoYXQgaXMgdGhlIG93bmVyIG9mIHRoaXMgY21ub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNtZG9jdW1lbnQgY29ycmVzcG9uZGluZyB0byB0aGlzIGNtbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ01Eb2N1bWVudCBnZXRDTURvY3VtZW50KCkKLSAgICB7Ci0gICAgICByZXR1cm4gKENNRG9jdW1lbnQpIGdldEFkYXB0ZXIoeHNkV2lsZGNhcmQuZ2V0U2NoZW1hKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgZG9jdW1lbnRhdGlvbiBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdCBnZXREb2N1bWVudGF0aW9uKCkKLSAgICB7Ci0gICAgICBYU0RBbm5vdGF0aW9uIGFubm90YXRpb24gPSB4c2RXaWxkY2FyZC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0RNb2RlbEdyb3VwQWRhcHRlcgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RNb2RlbEdyb3VwQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Hcm91cAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRE1vZGVsR3JvdXAgeHNkTW9kZWxHcm91cDsKLQotICAgIHB1YmxpYyBYU0RNb2RlbEdyb3VwQWRhcHRlcigpCi0gICAgewotICAgIH0KLQotICAgIHB1YmxpYyBYU0RNb2RlbEdyb3VwQWRhcHRlcihYU0RNb2RlbEdyb3VwIHhzZE1vZGVsR3JvdXApCi0gICAgewotICAgICAgdGhpcy54c2RNb2RlbEdyb3VwID0geHNkTW9kZWxHcm91cDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBub2RlLiBUaGUgdHlwZXMgYXJlIGRlZmluZWQgaW4gQ01Ob2RlIGNsYXNzCi0gICAgICogKEFOWV9FTEVNRU5ULCBBVFRSSUJVVEVfREVDTEFSQVRJT04sIERBVEFfVFlQRSwgRE9DVU1FTlQsCi0gICAgICogRUxFTUVOVF9ERUNMQVJBVElPTiwgRU5USVRZX0RFQ0xBUkFUSU9OLCBHUk9VUCwgTkFNRV9TUEFDRSBvcgotICAgICAqIERPQ1VNRU5UQVRJT04pLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhpcyBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Tm9kZVR5cGUoKQotICAgIHsKLSAgICAgIHJldHVybiBHUk9VUDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlIHdoaWNoIGlzIHRoZSBjb3JyZXNwb25kaW5nIFhNTCBTY2hlbWEKLSAgICAgKiBub2RlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGtleSBmb3IgdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXRLZXkoKQotICAgIHsKLSAgICAgIHJldHVybiB4c2RNb2RlbEdyb3VwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGdyb3VwLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIGdyb3VwLgotICAgICAqLwotICAgIHB1YmxpYyBDTU5vZGVMaXN0IGdldENoaWxkTm9kZXMoKQotICAgIHsKLSAgICAgIENNTm9kZUxpc3RJbXBsIG5vZGVMaXN0ID0gbmV3IENNTm9kZUxpc3RJbXBsKCk7Ci0gICAgICBpZiAoeHNkTW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSB4c2RNb2RlbEdyb3VwLmdldFBhcnRpY2xlcygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpLm5leHQoKTsKLSAgICAgICAgICBYU0RQYXJ0aWNsZUNvbnRlbnQgY29udGVudCA9IHBhcnRpY2xlLmdldENvbnRlbnQoKTsKLSAgICAgICAgICBDTU5vZGUgYWRhcHRlciA9IGdldEFkYXB0ZXIoY29udGVudCk7Ci0gICAgICAgICAgaWYgKGFkYXB0ZXIgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBub2RlTGlzdC5nZXRMaXN0KCkuYWRkKGFkYXB0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIG5vZGVMaXN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIG5vZGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4KLSAgICAgKiBBbGwgZGVyaXZlZCBjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgdGhleSBkbyBub3Qgd2FudCB0aGUKLSAgICAgKiBkZWZhdWx0IHZhbHVlLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgQ01EZXNjcmlwdGlvbkJ1aWxkZXIgZGVzY3JpcHRpb25CdWlsZGVyID0gbmV3IENNRGVzY3JpcHRpb25CdWlsZGVyKCk7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRpb25CdWlsZGVyLmJ1aWxkRGVzY3JpcHRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWluIE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWluT2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNaW5PY2N1cnMoeHNkTW9kZWxHcm91cCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzCi0gICAgICogIjEiLgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSAnTWF4IE9jY3VycycgYXR0cmlidXRlLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TWF4T2NjdXIoKQotICAgIHsKLSAgICAgIHJldHVybiBnZXRNYXhPY2N1cnMoeHNkTW9kZWxHcm91cCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIG9wZXJhdG9yIG9mIHRoaXMgZ3JvdXAgLS0gQ0hPSUNFLCBTRVFVRU5DRSBvciBBTEwgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb3BlcmF0b3Igb2YgdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkKLSAgICB7Ci0gICAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICAgIC8vdG9kby4uLiBoYW5kbGUgQUxPTkUgY2FzZSBieSBjaGVja2lnIGlmIGNoaWxkIGNvdW50ID09IDEKLSAgICAgIGlmICh4c2RNb2RlbEdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHN3aXRjaCAoeHNkTW9kZWxHcm91cC5nZXRDb21wb3NpdG9yKCkuZ2V0VmFsdWUoKSkKLSAgICAgICAgewotICAgICAgICAgIGNhc2UgWFNEQ29tcG9zaXRvci5DSE9JQ0UgOiB7Ci0gICAgICAgICAgICByZXN1bHQgPSBDSE9JQ0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLlNFUVVFTkNFIDogewotICAgICAgICAgICAgcmVzdWx0ID0gU0VRVUVOQ0U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBYU0RDb21wb3NpdG9yLkFMTCA6IHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEFMTDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkTW9kZWxHcm91cC5nZXRBbm5vdGF0aW9uKCk7Ci0gICAgICByZXR1cm4gZ2V0RG9jdW1lbnRhdGlvbnMoYW5ub3RhdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY21kb2N1bWVudCB0aGF0IGlzIHRoZSBvd25lciBvZiB0aGlzIGNtbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBjbWRvY3VtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBjbW5vZGUuCi0gICAgICovCi0gICAgcHVibGljIENNRG9jdW1lbnQgZ2V0Q01Eb2N1bWVudCgpCi0gICAgewotICAgICAgcmV0dXJuIChDTURvY3VtZW50KSBnZXRBZGFwdGVyKHhzZE1vZGVsR3JvdXAuZ2V0U2NoZW1hKCkpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogWFNETW9kZWxHcm91cERlZmluaXRpb25BZGFwdGVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlciBleHRlbmRzIFhTREJhc2VBZGFwdGVyIGltcGxlbWVudHMgQ01Hcm91cAotICB7Ci0gICAgcHJvdGVjdGVkIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uOwotCi0gICAgcHVibGljIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uQWRhcHRlcihYU0RNb2RlbEdyb3VwRGVmaW5pdGlvbiB4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLnhzZE1vZGVsR3JvdXBEZWZpbml0aW9uID0geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIHR5cGVzIGFyZSBkZWZpbmVkIGluIENNTm9kZSBjbGFzcwotICAgICAqIChBTllfRUxFTUVOVCwgQVRUUklCVVRFX0RFQ0xBUkFUSU9OLCBEQVRBX1RZUEUsIERPQ1VNRU5ULAotICAgICAqIEVMRU1FTlRfREVDTEFSQVRJT04sIEVOVElUWV9ERUNMQVJBVElPTiwgR1JPVVAsIE5BTUVfU1BBQ0Ugb3IKLSAgICAgKiBET0NVTUVOVEFUSU9OKS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB0eXBlIG9mIHRoaXMgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE5vZGVUeXBlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gR1JPVVA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGNtbm9kZSB3aGljaCBpcyB0aGUgY29ycmVzcG9uZGluZyBYTUwgU2NoZW1hCi0gICAgICogbm9kZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBrZXkgZm9yIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkKLSAgICB7Ci0gICAgICByZXR1cm4geHNkTW9kZWxHcm91cERlZmluaXRpb247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICogCi0gICAgICogQHJldHVybiBhIGxpc3Qgb2YgdGhlIGNoaWxkcmVuIG9mIHRoaXMgZ3JvdXAuCi0gICAgICovCi0gICAgcHVibGljIENNTm9kZUxpc3QgZ2V0Q2hpbGROb2RlcygpCi0gICAgewotICAgICAgQ01Ob2RlTGlzdEltcGwgbm9kZUxpc3QgPSBuZXcgQ01Ob2RlTGlzdEltcGwoKTsKLSAgICAgIFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCA9IHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAobW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICBDTU5vZGUgYWRhcHRlciA9IGdldEFkYXB0ZXIobW9kZWxHcm91cCk7Ci0gICAgICAgIG5vZGVMaXN0LmFkZChhZGFwdGVyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBub2RlTGlzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBub2RlLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICogQWxsIGRlcml2ZWQgY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHRoZXkgZG8gbm90IHdhbnQgdGhlCi0gICAgICogZGVmYXVsdCB2YWx1ZS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9kZU5hbWUoKQotICAgIHsKLSAgICAgIENNRGVzY3JpcHRpb25CdWlsZGVyIGRlc2NyaXB0aW9uQnVpbGRlciA9IG5ldyBDTURlc2NyaXB0aW9uQnVpbGRlcigpOwotICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uQnVpbGRlci5idWlsZERlc2NyaXB0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mICdNaW4gT2NjdXJzJyBhdHRyaWJ1dGUuIFRoZSBkZWZhdWx0IHZhbHVlIGlzICIxIi4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgJ01pbiBPY2N1cnMnIGF0dHJpYnV0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE1pbk9jY3VyKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZ2V0TWluT2NjdXJzKHhzZE1vZGVsR3JvdXBEZWZpbml0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgJ01heCBPY2N1cnMnIGF0dHJpYnV0ZS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMKLSAgICAgKiAiMSIuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlICdNYXggT2NjdXJzJyBhdHRyaWJ1dGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRNYXhPY2N1cigpCi0gICAgewotICAgICAgcmV0dXJuIGdldE1heE9jY3Vycyh4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIG9wZXJhdG9yIG9mIHRoaXMgZ3JvdXAgLS0gQ0hPSUNFLCBTRVFVRU5DRSBvciBBTEwgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgb3BlcmF0b3Igb2YgdGhpcyBncm91cC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldE9wZXJhdG9yKCkKLSAgICB7Ci0gICAgICByZXR1cm4gWFNEQ29tcG9zaXRvci5TRVFVRU5DRTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBkb2N1bWVudGF0aW9uIGVsZW1lbnRzLgotICAgICAqIAotICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGRvY3VtZW50YXRpb24gZWxlbWVudHMuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIENNTm9kZUxpc3QgZ2V0RG9jdW1lbnRhdGlvbigpCi0gICAgewotICAgICAgWFNEQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0geHNkTW9kZWxHcm91cERlZmluaXRpb24uZ2V0QW5ub3RhdGlvbigpOwotICAgICAgcmV0dXJuIGdldERvY3VtZW50YXRpb25zKGFubm90YXRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNtZG9jdW1lbnQgdGhhdCBpcyB0aGUgb3duZXIgb2YgdGhpcyBjbW5vZGUuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgY21kb2N1bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY21ub2RlLgotICAgICAqLwotICAgIHB1YmxpYyBDTURvY3VtZW50IGdldENNRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiAoQ01Eb2N1bWVudCkgZ2V0QWRhcHRlcih4c2RNb2RlbEdyb3VwRGVmaW5pdGlvbi5nZXRTY2hlbWEoKSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBEb2N1bWVudGF0aW9uSW1wbCBpbXBsZW1lbnRzIENNRG9jdW1lbnRhdGlvbi4gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUKLSAgICogZG9jdW1lbnRhdGlvbiBlbGVtZW50IHBhcnQgb2YgdGhlICdVc2VyIEluZm9ybWF0aW9uJyBmZWF0dXJlLiBXb3JraW5nIHdpdGgKLSAgICogdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudCByZXF1aXJlcyBkcm9wcGluZyBkb3duIGludG8gdGhlIERPTSBtb2RlbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRG9jdW1lbnRhdGlvbkltcGwgaW1wbGVtZW50cyBDTURvY3VtZW50YXRpb24KLSAgewotICAgIHByb3RlY3RlZCBFbGVtZW50IGRvY3VtZW50YXRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiAtCi0gICAgICogICAgICAgICAgYSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIERvY3VtZW50YXRpb25JbXBsKEVsZW1lbnQgZG9jdW1lbnRhdGlvbikKLSAgICB7Ci0gICAgICB0aGlzLmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG5vZGUuIFRoZSB0eXBlcyBhcmUgZGVmaW5lZCBpbiBDTU5vZGUgY2xhc3MKLSAgICAgKiAoQU5ZX0VMRU1FTlQsIEFUVFJJQlVURV9ERUNMQVJBVElPTiwgREFUQV9UWVBFLCBET0NVTUVOVCwKLSAgICAgKiBFTEVNRU5UX0RFQ0xBUkFUSU9OLCBFTlRJVFlfREVDTEFSQVRJT04sIEdST1VQLCBOQU1FX1NQQUNFIG9yCi0gICAgICogRE9DVU1FTlRBVElPTikuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIG5vZGUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXROb2RlVHlwZSgpCi0gICAgewotICAgICAgcmV0dXJuIERPQ1VNRU5UQVRJT047Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICogCi0gICAgICogQHJldHVybiBhbiBlbXB0eSBzdHJpbmcgdmFsdWUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROb2RlTmFtZSgpCi0gICAgewotICAgICAgcmV0dXJuICIiOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgZmFsc2UuIFRoaXMgY2xhc3MgZG9lcyBub3Qgc3VwcG9ydCBhbnkgcHJvcGVydGllcy4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIC0KLSAgICAgKiAgICAgICAgICBuYW1lIG9mIGEgcHJvcGVydHkKLSAgICAgKiBAcmV0dXJuIGZhbHNlLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgbnVsbC4gVGhpcyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGFueSBwcm9wZXJ0aWVzLgotICAgICAqIAotICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgLQotICAgICAqICAgICAgICAgIG5hbWUgb2YgYSBwcm9wZXJ0eQotICAgICAqIEByZXR1cm4gbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgY29udGVudCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqIAotICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGRvY3VtZW50YXRpb24gZWxlbWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29udGVudCA9ICIiOwotICAgICAgYm9vbGVhbiBjb250ZW50Rm91bmQgPSBmYWxzZTsKLSAgICAgIE5vZGVMaXN0IG5vZGVzID0gZG9jdW1lbnRhdGlvbi5nZXRDaGlsZE5vZGVzKCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGVzLmdldExlbmd0aCgpOyBpKyspCi0gICAgICB7Ci0gICAgICAgIE5vZGUgbm9kZSA9IG5vZGVzLml0ZW0oaSk7Ci0gICAgICAgIGlmIChub2RlIGluc3RhbmNlb2YgVGV4dCkKLSAgICAgICAgewotICAgICAgICAgIGNvbnRlbnRGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgY29udGVudCArPSBub2RlLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gY29udGVudEZvdW5kID8gY29udGVudCA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgeG1sOmxhbmcgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpCi0gICAgewotICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24uaGFzQXR0cmlidXRlTlMoWFNEQ29uc3RhbnRzLlhNTF9OQU1FU1BBQ0VfVVJJXzE5OTgsIFhNTF9MQU5HX0FUVFJJQlVURSkgPyBkb2N1bWVudGF0aW9uLmdldEF0dHJpYnV0ZU5TKFhTRENvbnN0YW50cy5YTUxfTkFNRVNQQUNFX1VSSV8xOTk4LCBYTUxfTEFOR19BVFRSSUJVVEUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzb3VyY2UgYXR0cmlidXRlIHZhbHVlIG9mIHRoZSBkb2N1bWVudGF0aW9uIGVsZW1lbnQuCi0gICAgICogCi0gICAgICogQHJldHVybiB0aGUgc291cmNlIGF0dHJpYnV0ZSB2YWx1ZSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBlbGVtZW50LgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlKCkKLSAgICB7Ci0gICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbi5oYXNBdHRyaWJ1dGVOUyhudWxsLCBYU0RDb25zdGFudHMuU09VUkNFX0FUVFJJQlVURSkgPyBkb2N1bWVudGF0aW9uLmdldEF0dHJpYnV0ZU5TKG51bGwsIFhTRENvbnN0YW50cy5TT1VSQ0VfQVRUUklCVVRFKSA6IG51bGw7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBYU0lEb2N1bWVudCBleHRlbmRzIENNRG9jdW1lbnRJbXBsLiBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaG9sZCB0aG9zZQotICAgKiBhdHRyaWJ1dGVzIHRoYXQgYXJlIGZvciBkaXJlY3QgdXNlIGluIGFueSBYTUwgZG9jdW1lbnRzLiBUaGVzZSBhdHRyaWJ1dGVzCi0gICAqIGFyZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UsIHdoaWNoIGhhcyB0aGUgbmFtZXNwYWNlIG5hbWUKLSAgICogaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UuIEF0dHJpYnV0ZXMgaW4gdGhpcyBuYW1lc3BhY2UKLSAgICogaW5jbHVkZTogeHNpOnR5cGUgeHNpOm5pbCB4c2k6c2NoZW1hTG9jYXRpb24geHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb24KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgWFNJRG9jdW1lbnQgZXh0ZW5kcyBDTURvY3VtZW50SW1wbAotICB7Ci0gICAgcHVibGljIENNQXR0cmlidXRlRGVjbGFyYXRpb25JbXBsIG5pbEF0dHJpYnV0ZTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLiBDcmVhdGVzIHRoZSAneHNpOm5pbCcKLSAgICAgKi8KLSAgICBwdWJsaWMgWFNJRG9jdW1lbnQoKQotICAgIHsKLSAgICAgIHN1cGVyKFhTRENvbnN0YW50cy5TQ0hFTUFfSU5TVEFOQ0VfVVJJXzIwMDEpOwotICAgICAgLy8gY3JlYXRlIHRoZSAnbmlsbCcgYXR0cmlidXRlCi0gICAgICBTdHJpbmdbXSB2YWx1ZXMgPSB7ImZhbHNlIiwgInRydWUifTsKLSAgICAgIG5pbEF0dHJpYnV0ZSA9IG5ldyBDTUF0dHJpYnV0ZURlY2xhcmF0aW9uSW1wbCgibmlsIiwgQ01BdHRyaWJ1dGVEZWNsYXJhdGlvbi5SRVFVSVJFRCwgbmV3IENNRGF0YVR5cGVJbXBsKCJib29sZWFuIiwgdmFsdWVzKSk7Ci0gICAgICBuaWxBdHRyaWJ1dGUuc2V0UHJlZml4UXVhbGlmaWNhdGlvbih0cnVlKTsKLSAgICAgIG5pbEF0dHJpYnV0ZS5zZXRDTURvY3VtZW50KHRoaXMpOwotICAgIH0KLSAgfQotICAvKioKLSAgICogTm90ZSB0aGlzIFhTRCBtb2RlbCB2aXNpdG9yIGRpZmZlcnMgZnJvbSB0aGUgWFNEIG1vZGVsIHZpc2l0b3IgaW4KLSAgICogb3JnLmVjbGlwc2Uud3N0LnhzZC5lZGl0b3IgcGx1Z2luLiBJbiB2aXNpdE1vZGVsR3JvdXAgbWV0aG9kIHdlIGNhbGwKLSAgICogZ2V0UGFydGljbGVzKCkgaW5zdGVhZCBvZiBnZXRDb250ZW50cygpLiBUaGlzIGdhdGhlcnMgYWxsIG9mIHRoZSBjb250ZW50IG9mCi0gICAqIGEgZGVyaXZlZCB0eXBlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBYU0RDTVZpc2l0b3IgZXh0ZW5kcyBYU0RWaXNpdG9yCi0gIHsKLSAgICBwdWJsaWMgdm9pZCB2aXNpdFNpbXBsZVR5cGVEZWZpbml0aW9uKFhTRFNpbXBsZVR5cGVEZWZpbml0aW9uIHR5cGUpCi0gICAgewotICAgICAgWFNEUGFydGljbGUgY3RkID0gdHlwZS5nZXRDb21wbGV4VHlwZSgpOwotICAgICAgaWYgKGN0ZCAhPSBudWxsKQotICAgICAgICB2aXNpdFBhcnRpY2xlKGN0ZCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgICB7Ci0gICAgICBpZiAobW9kZWxHcm91cC5nZXRQYXJ0aWNsZXMoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRQYXJ0aWNsZXMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgWFNEUGFydGljbGUgcGFydGljbGUgPSAoWFNEUGFydGljbGUpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICB2aXNpdFBhcnRpY2xlKHBhcnRpY2xlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oWFNETW9kZWxHcm91cERlZmluaXRpb24gbW9kZWxHcm91cERlZikKLSAgICB7Ci0gICAgICBYU0RNb2RlbEdyb3VwIG1vZGVsR3JvdXAgPSBtb2RlbEdyb3VwRGVmLmdldFJlc29sdmVkTW9kZWxHcm91cERlZmluaXRpb24oKS5nZXRNb2RlbEdyb3VwKCk7Ci0gICAgICBpZiAobW9kZWxHcm91cCAhPSBudWxsKQotICAgICAgewotICAgICAgICB2aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBBIHZpc2l0b3IgY2xhc3MgdGhhdCB3YWxrcyB0aGUgeHNkIG1vZGVsIGFuZCBjb21wdXRlcyB0aGUgbGlzdCBvZiBjaGlsZHJlbgotICAgKiB0aGF0IGJlbG9uZyB0byB0aGUgaW5pdGlhbGx5IHZpc2l0ZWQgZWxlbWVudCB0eXBlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBEZXJpdmVkQ2hpbGRWaXNpdG9yIGV4dGVuZHMgWFNEQ01WaXNpdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ01Ob2RlTGlzdEltcGwgY2hpbGROb2RlTGlzdCA9IG5ldyBDTU5vZGVMaXN0SW1wbCgpOwotICAgIHByb3RlY3RlZCBMaXN0IGJhc2VUeXBlTGlzdCA9IG5ldyBWZWN0b3IoKTsKLSAgICBPYmplY3Qgcm9vdDsKLQotICAgIERlcml2ZWRDaGlsZFZpc2l0b3IoT2JqZWN0IHJvb3QpCi0gICAgewotICAgICAgdGhpcy5yb290ID0gcm9vdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ01Ob2RlTGlzdEltcGwgZ2V0Q2hpbGROb2RlTGlzdCgpCi0gICAgewotICAgICAgcmV0dXJuIGNoaWxkTm9kZUxpc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgICB7Ci0gICAgICBjaGlsZE5vZGVMaXN0LmdldExpc3QoKS5hZGQoZ2V0QWRhcHRlcih3aWxkY2FyZCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKGVsZW1lbnQpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXAoWFNETW9kZWxHcm91cCBtb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKG1vZGVsR3JvdXApKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIGNoaWxkTm9kZUxpc3QuZ2V0TGlzdCgpLmFkZChnZXRBZGFwdGVyKG1vZGVsR3JvdXBEZWZpbml0aW9uKSk7Ci0gICAgfQotICB9Ci0gIC8qKgotICAgKiBBIHZpc2l0b3IgY2xhc3MgdGhhdCBnYXRoZXJzIGFsbCBvZiB0aGUgZWxlbWVudHMgd2l0aGluIGEgdHlwZSBkZWZpbml0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2NhbEVsZW1lbnRWaXNpdG9yIGV4dGVuZHMgWFNEQ01WaXNpdG9yCi0gIHsKLSAgICBwcm90ZWN0ZWQgQ01OYW1lZE5vZGVNYXBJbXBsIG5hbWVkTm9kZU1hcCA9IG5ldyBDTU5hbWVkTm9kZU1hcEltcGwoKTsKLSAgICBwcm90ZWN0ZWQgTGlzdCBiYXNlVHlwZUxpc3QgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB2aXNpdEVsZW1lbnREZWNsYXJhdGlvbihYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCkKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb25BZGFwdGVyIGFkYXB0ZXIgPSAoWFNERWxlbWVudERlY2xhcmF0aW9uQWRhcHRlcikgZ2V0QWRhcHRlcihlbGVtZW50KTsKLSAgICAgIG5hbWVkTm9kZU1hcC5nZXRIYXNodGFibGUoKS5wdXQoYWRhcHRlci5nZXROb2RlTmFtZSgpLCBhZGFwdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ01OYW1lZE5vZGVNYXAgZ2V0Q01OYW1lZE5vZGVNYXAoKQotICAgIHsKLSAgICAgIHJldHVybiBuYW1lZE5vZGVNYXA7Ci0gICAgfQotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RUeXBlVXRpbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC9YU0RUeXBlVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQ2ODY4Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVHlwZVV0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTaW1wbGVUeXBlRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEVHlwZURlZmluaXRpb247Ci0KLS8qKgotICogSGVscGVyIGNsYXNzIHRvIGdlbmVyYXRlIHZhbGlkIHZhbHVlcyBmb3IgYnVpbHQtaW4gc2ltcGxlIHR5cGVzLgotICovCi0KLXB1YmxpYyBjbGFzcyBYU0RUeXBlVXRpbAotewotICBwcm90ZWN0ZWQgc3RhdGljIE1hcCBkZWZhdWx0VmFsdWUgPSBuZXcgSGFzaE1hcCgpOwotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0aWFsaXplKCkKLSAgewotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImFueVNpbXBsZVR5cGUiLCBudWxsKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJhbnlUeXBlIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYW55VVJJIiwgImh0dHA6Ly90ZW1wdXJpLm9yZyIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImJhc2U2NEJpbmFyeSIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYm9vbGVhbiIsICJ0cnVlIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiYnl0ZSIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZGF0ZSIsICIyMDAxLTAxLTAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZGF0ZVRpbWUiLCAiMjAwMS0xMi0zMVQxMjowMDowMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImRlY2ltYWwiLCAiMC4wIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZG91YmxlIiwgIjAuMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImR1cmF0aW9uIiwgIlAxRCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIkVOVElUWSIsICJlbnRpdHkiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJFTlRJVElFUyIsICJlbnRpdGllcyIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImZsb2F0IiwgIjAuMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImdEYXkiLCAiLS0tMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnTW9udGgiLCAiLS0wMS0tIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ01vbnRoRGF5IiwgIi0tMDEtMDEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJnWWVhciIsICIyMDAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiZ1llYXJNb250aCIsICIyMDAxLTAxIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiaGV4QmluYXJ5IiwgIjBGMDAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJJRCIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIklEUkVGIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiSURSRUZTIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiaW50IiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJpbnRlZ2VyIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJsYW5ndWFnZSIsICJFTiIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoImxvbmciLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5hbWUiLCAiTmFtZSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIk5DTmFtZSIsICJOQ05hbWUiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJuZWdhdGl2ZUludGVnZXIiLCAiLTEiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOTVRPS0VOIiwgIk5NVE9LRU4iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJOTVRPS0VOUyIsICJOTVRPS0VOUyIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIm5vbk5lZ2F0aXZlSW50ZWdlciIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgibm9uUG9zaXRpdmVJbnRlZ2VyIiwgIjAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJub3JtYWxpemVkU3RyaW5nIiwgbnVsbCk7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgiTk9UQVRJT04iLCAiTk9UQVRJT04iKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJwb3NpdGl2ZUludGVnZXIiLCAiMSIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoIlFOYW1lIiwgIlFOYW1lIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgic2hvcnQiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInN0cmluZyIsIG51bGwpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInRpbWUiLCAiMTI6MDA6MDAiKTsKLSAgICBkZWZhdWx0VmFsdWUucHV0KCJ0b2tlbiIsICJ0b2tlbiIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInVuc2lnbmVkQnl0ZSIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidW5zaWduZWRJbnQiLCAiMCIpOwotICAgIGRlZmF1bHRWYWx1ZS5wdXQoInVuc2lnbmVkTG9uZyIsICIwIik7Ci0gICAgZGVmYXVsdFZhbHVlLnB1dCgidW5zaWduZWRTaG9ydCIsICIwIik7Ci0gIH0KLQotCi0gIC8qCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdHlwZSBpcyBidWlsdC1pbi4KLSAgICogQHBhcmFtIHR5cGUgLSBhbiBYU0RUeXBlRGVmaW5pdGlvbiBvYmplY3QuCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBidWlsdC1pbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0J1aWx0SW4oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgeyAKLSAgICBib29sZWFuIHJlc3VsdCA9IGZhbHNlOwotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgU3RyaW5nIG5hbWUgPSB0eXBlLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAgZGVmYXVsdFZhbHVlLmNvbnRhaW5zS2V5KG5hbWUpOyAKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgYSB2YWxpZCBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2ltcGxlIHR5cGUuCi0gICAqIEBwYXJhbSB0eXBlIC0gYSBzaW1wbGUgYnVpbHQtaW4gdHlwZS4KLSAgICogQHJldHVybiBhIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBzaW1wbGUgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEluc3RhbmNlVmFsdWUoWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKGlzQnVpbHRJbih0eXBlKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWVJRCA9IHR5cGUuZ2V0TmFtZSgpOwotICAgICAgICByZXR1cm4gKFN0cmluZylkZWZhdWx0VmFsdWUuZ2V0KG5hbWVJRCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFhTRFR5cGVEZWZpbml0aW9uIGJhc2V0eXBlID0gdHlwZS5nZXRCYXNlVHlwZSgpOwotICAgICAgICBpZiAoYmFzZXR5cGUgIT0gdHlwZSkgcmV0dXJuIGdldEluc3RhbmNlVmFsdWUoYmFzZXR5cGUpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL1hTRFZpc2l0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVmlzaXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBlMWE0Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvWFNEVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb250ZW50bW9kZWwuaW50ZXJuYWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQXR0cmlidXRlRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEQ29tcGxleFR5cGVDb250ZW50OwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RDb21wbGV4VHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTREVsZW1lbnREZWNsYXJhdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNESWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNETW9kZWxHcm91cERlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRE5vdGF0aW9uRGVjbGFyYXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFBhcnRpY2xlOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RQYXJ0aWNsZUNvbnRlbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYTsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QuWFNEU2ltcGxlVHlwZURlZmluaXRpb247Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLlhTRFR5cGVEZWZpbml0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RXaWxkY2FyZDsKLQotcHVibGljIGNsYXNzIFhTRFZpc2l0b3IKLXsKLSAgcHVibGljIFhTRFZpc2l0b3IoKQotICB7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBYU0RTY2hlbWEgc2NoZW1hOwotICAKLSAgcHVibGljIHZvaWQgdmlzaXRTY2hlbWEoWFNEU2NoZW1hIHNjaGVtYSkKLSAgewotICAgIHRoaXMuc2NoZW1hID0gc2NoZW1hOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyID0gKFhTREF0dHJpYnV0ZURlY2xhcmF0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdEF0dHJpYnV0ZURlY2xhcmF0aW9uKGF0dHIpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldFR5cGVEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEVHlwZURlZmluaXRpb24gdHlwZSA9IChYU0RUeXBlRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRUeXBlRGVmaW5pdGlvbih0eXBlKTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRFbGVtZW50RGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RFbGVtZW50RGVjbGFyYXRpb24gZWxlbWVudCA9IChYU0RFbGVtZW50RGVjbGFyYXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCA9IChYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICB2aXNpdElkZW50aXR5Q29uc3RyYWludERlZmluaXRpb24oaWRlbnRpdHlDb25zdHJhaW50KTsKLSAgICB9Ci0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IHNjaGVtYS5nZXRNb2RlbEdyb3VwRGVmaW5pdGlvbnMoKS5pdGVyYXRvcigpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXAgPSAoWFNETW9kZWxHcm91cERlZmluaXRpb24pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24obW9kZWxHcm91cCk7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBzY2hlbWEuZ2V0QXR0cmlidXRlR3JvdXBEZWZpbml0aW9ucygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwID0gKFhTREF0dHJpYnV0ZUdyb3VwRGVmaW5pdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oYXR0cmlidXRlR3JvdXApOwotICAgIH0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gc2NoZW1hLmdldE5vdGF0aW9uRGVjbGFyYXRpb25zKCkuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIGVsZW1lbnQgPSAoWFNETm90YXRpb25EZWNsYXJhdGlvbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgdmlzaXROb3RhdGlvbkRlY2xhcmF0aW9uKGVsZW1lbnQpOwotICAgIH0KLSAgICAKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVEZWNsYXJhdGlvbihYU0RBdHRyaWJ1dGVEZWNsYXJhdGlvbiBhdHRyKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0VHlwZURlZmluaXRpb24oWFNEVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlIGluc3RhbmNlb2YgWFNEU2ltcGxlVHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pdHlwZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBYU0RDb21wbGV4VHlwZURlZmluaXRpb24pCi0gICAgewotICAgICAgdmlzaXRDb21wbGV4VHlwZURlZmluaXRpb24oKFhTRENvbXBsZXhUeXBlRGVmaW5pdGlvbil0eXBlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0RWxlbWVudERlY2xhcmF0aW9uKFhTREVsZW1lbnREZWNsYXJhdGlvbiBlbGVtZW50KQotICB7Ci0gICAgaWYgKGVsZW1lbnQuaXNFbGVtZW50RGVjbGFyYXRpb25SZWZlcmVuY2UoKSkKLSAgICB7Ci0gICAgfQotICAgIGVsc2UgaWYgKGVsZW1lbnQuZ2V0QW5vbnltb3VzVHlwZURlZmluaXRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHZpc2l0VHlwZURlZmluaXRpb24oZWxlbWVudC5nZXRBbm9ueW1vdXNUeXBlRGVmaW5pdGlvbigpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0SWRlbnRpdHlDb25zdHJhaW50RGVmaW5pdGlvbihYU0RJZGVudGl0eUNvbnN0cmFpbnREZWZpbml0aW9uIGlkZW50aXR5Q29uc3RyYWludCkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdE1vZGVsR3JvdXBEZWZpbml0aW9uKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uIG1vZGVsR3JvdXBEZWYpCi0gIHsKLSAgICBpZiAoIW1vZGVsR3JvdXBEZWYuaXNNb2RlbEdyb3VwRGVmaW5pdGlvblJlZmVyZW5jZSgpKQotICAgIHsKLSAgICAgIGlmIChtb2RlbEdyb3VwRGVmLmdldE1vZGVsR3JvdXAoKSAhPSBudWxsKQotICAgICAgewotICAgICAgICB2aXNpdE1vZGVsR3JvdXAobW9kZWxHcm91cERlZi5nZXRNb2RlbEdyb3VwKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGVHcm91cERlZmluaXRpb24oWFNEQXR0cmlidXRlR3JvdXBEZWZpbml0aW9uIGF0dHJpYnV0ZUdyb3VwKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0Tm90YXRpb25EZWNsYXJhdGlvbihYU0ROb3RhdGlvbkRlY2xhcmF0aW9uIG5vdGF0aW9uKQotICB7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0U2ltcGxlVHlwZURlZmluaXRpb24oWFNEU2ltcGxlVHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdENvbXBsZXhUeXBlRGVmaW5pdGlvbihYU0RDb21wbGV4VHlwZURlZmluaXRpb24gdHlwZSkKLSAgewotICAgIGlmICh0eXBlLmdldENvbnRlbnRUeXBlKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBYU0RDb21wbGV4VHlwZUNvbnRlbnQgY29tcGxleENvbnRlbnQgPSB0eXBlLmdldENvbnRlbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RTaW1wbGVUeXBlRGVmaW5pdGlvbikKLSAgICAgIHsKLSAgICAgICAgdmlzaXRTaW1wbGVUeXBlRGVmaW5pdGlvbigoWFNEU2ltcGxlVHlwZURlZmluaXRpb24pY29tcGxleENvbnRlbnQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY29tcGxleENvbnRlbnQgaW5zdGFuY2VvZiBYU0RQYXJ0aWNsZSkKLSAgICAgIHsKLSAgICAgICAgdmlzaXRQYXJ0aWNsZSgoWFNEUGFydGljbGUpIGNvbXBsZXhDb250ZW50KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHZpc2l0UGFydGljbGUoWFNEUGFydGljbGUgcGFydGljbGUpCi0gIHsKLSAgICB2aXNpdFBhcnRpY2xlQ29udGVudChwYXJ0aWNsZS5nZXRDb250ZW50KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB2aXNpdFBhcnRpY2xlQ29udGVudChYU0RQYXJ0aWNsZUNvbnRlbnQgcGFydGljbGVDb250ZW50KQotICB7Ci0gICAgaWYgKHBhcnRpY2xlQ29udGVudCBpbnN0YW5jZW9mIFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cERlZmluaXRpb24oKFhTRE1vZGVsR3JvdXBEZWZpbml0aW9uKSBwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RNb2RlbEdyb3VwKQotICAgIHsKLSAgICAgIHZpc2l0TW9kZWxHcm91cCgoWFNETW9kZWxHcm91cClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RFbGVtZW50RGVjbGFyYXRpb24pCi0gICAgewotICAgICAgdmlzaXRFbGVtZW50RGVjbGFyYXRpb24oKFhTREVsZW1lbnREZWNsYXJhdGlvbilwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgICBlbHNlIGlmIChwYXJ0aWNsZUNvbnRlbnQgaW5zdGFuY2VvZiBYU0RXaWxkY2FyZCkKLSAgICB7Ci0gICAgICB2aXNpdFdpbGRjYXJkKChYU0RXaWxkY2FyZClwYXJ0aWNsZUNvbnRlbnQpOwotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRNb2RlbEdyb3VwKFhTRE1vZGVsR3JvdXAgbW9kZWxHcm91cCkKLSAgewotICAgIGlmIChtb2RlbEdyb3VwLmdldENvbnRlbnRzKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gbW9kZWxHcm91cC5nZXRDb250ZW50cygpLml0ZXJhdG9yKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIFhTRFBhcnRpY2xlIHBhcnRpY2xlID0gKFhTRFBhcnRpY2xlKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgIHZpc2l0UGFydGljbGUocGFydGljbGUpOwotICAgICAgfQotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdmlzaXRXaWxkY2FyZChYU0RXaWxkY2FyZCB3aWxkY2FyZCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtY29udGVudG1vZGVsL29yZy9lY2xpcHNlL3dzdC94c2QvY29udGVudG1vZGVsL2ludGVybmFsL3V0aWwvWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYTVkZjEuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JBZGFwdGVyRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC51dGlsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmNvbW1vbi5ub3RpZnkuQWRhcHRlcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5Ob3RpZmllcjsKLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJGYWN0b3J5SW1wbDsKLWltcG9ydCBvcmcuZWNsaXBzZS54c2QudXRpbC5YU0RTY2hlbWFMb2NhdG9yOwotCi1wdWJsaWMgY2xhc3MgWFNEU2NoZW1hTG9jYXRvckFkYXB0ZXJGYWN0b3J5IGV4dGVuZHMgQWRhcHRlckZhY3RvcnlJbXBsCi17Ci0gICAgcHJvdGVjdGVkIFhTRFNjaGVtYUxvY2F0b3JJbXBsIHNjaGVtYUxvY2F0b3IgPSBuZXcgWFNEU2NoZW1hTG9jYXRvckltcGwoKTsKLQotICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeUZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRhcHRlciBhZGFwdE5ldyhOb3RpZmllciB0YXJnZXQsIE9iamVjdCB0eXBlKQotICAgIHsKLSAgICAgIHJldHVybiBzY2hlbWFMb2NhdG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy1jb250ZW50bW9kZWwvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb250ZW50bW9kZWwvaW50ZXJuYWwvdXRpbC9YU0RTY2hlbWFMb2NhdG9ySW1wbC5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDIyYjcuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLWNvbnRlbnRtb2RlbC9vcmcvZWNsaXBzZS93c3QveHNkL2NvbnRlbnRtb2RlbC9pbnRlcm5hbC91dGlsL1hTRFNjaGVtYUxvY2F0b3JJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29udGVudG1vZGVsLmludGVybmFsLnV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS5lbWYuY29tbW9uLm5vdGlmeS5pbXBsLkFkYXB0ZXJJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5jb21tb24udXRpbC5VUkk7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuZW1mLmVjb3JlLnJlc291cmNlLlJlc291cmNlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmVtZi5lY29yZS5yZXNvdXJjZS5SZXNvdXJjZVNldDsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyUGx1Z2luOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC5YU0RTY2hlbWE7Ci1pbXBvcnQgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEUmVzb3VyY2VJbXBsOwotaW1wb3J0IG9yZy5lY2xpcHNlLnhzZC51dGlsLlhTRFNjaGVtYUxvY2F0b3I7Ci0KLXB1YmxpYyBjbGFzcyBYU0RTY2hlbWFMb2NhdG9ySW1wbCBleHRlbmRzIEFkYXB0ZXJJbXBsIGltcGxlbWVudHMgWFNEU2NoZW1hTG9jYXRvcgotewotICAgIC8qKgotICAgICAqIEBzZWUgb3JnLmVjbGlwc2UueHNkLnV0aWwuWFNEU2NoZW1hTG9jYXRvciNsb2NhdGVTY2hlbWEob3JnLmVjbGlwc2UueHNkLlhTRFNjaGVtYSwKLSAgICAgKiAgICAgIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcpCi0gICAgICovCi0gICAgcHVibGljIFhTRFNjaGVtYSBsb2NhdGVTY2hlbWEoWFNEU2NoZW1hIHhzZFNjaGVtYSwgU3RyaW5nIG5hbWVzcGFjZVVSSSwgU3RyaW5nIHJhd1NjaGVtYUxvY2F0aW9uVVJJLCBTdHJpbmcgcmVzb2x2ZWRTY2hlbWFMb2NhdGlvblVSSSkKLSAgICB7Ci0gICAgICBYU0RTY2hlbWEgcmVzdWx0ID0gbnVsbDsKLSAgICAgIFN0cmluZyBiYXNlTG9jYXRpb24gPSB4c2RTY2hlbWEuZ2V0U2NoZW1hTG9jYXRpb24oKTsgICAgICAKLSAgICAgIFN0cmluZyByZXNvbHZlZFVSSSA9IFVSSVJlc29sdmVyUGx1Z2luLmNyZWF0ZVJlc29sdmVyKCkucmVzb2x2ZShiYXNlTG9jYXRpb24sIG5hbWVzcGFjZVVSSSwgcmF3U2NoZW1hTG9jYXRpb25VUkkpOyAKLSAgICAgIGlmIChyZXNvbHZlZFVSSSA9PSBudWxsKSAKLSAgICAgIHsKLSAgICAgICAgcmVzb2x2ZWRVUkkgPSByZXNvbHZlZFNjaGVtYUxvY2F0aW9uVVJJOyAgICAgICAKLSAgICAgIH0KLSAgICAgIHRyeQotICAgICAgeyAgICAgICAgCi0gICAgICAgIFJlc291cmNlU2V0IHJlc291cmNlU2V0ID0geHNkU2NoZW1hLmVSZXNvdXJjZSgpLmdldFJlc291cmNlU2V0KCk7Ci0gICAgICAgIFVSSSB1cmkgPSBVUkkuY3JlYXRlVVJJKHJlc29sdmVkVVJJKTsKLSAgICAgICAgUmVzb3VyY2UgciA9IHJlc291cmNlU2V0LmdldFJlc291cmNlKHVyaSwgZmFsc2UpOyAKLSAgICAgICAgWFNEUmVzb3VyY2VJbXBsIHJlc29sdmVkUmVzb3VyY2UgPSBudWxsOwotICAgICAgICBpZiAociBpbnN0YW5jZW9mIFhTRFJlc291cmNlSW1wbCkKLSAgICAgICAgewotICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UgPSAoWFNEUmVzb3VyY2VJbXBsKXI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSAgICAgICAgCi0gICAgICAgIHsgIAotICAgICAgICAgIFN0cmluZyBwaHlzaWNhbExvY2F0aW9uID0gVVJJUmVzb2x2ZXJQbHVnaW4uY3JlYXRlUmVzb2x2ZXIoKS5yZXNvbHZlUGh5c2ljYWxMb2NhdGlvbihiYXNlTG9jYXRpb24sIG5hbWVzcGFjZVVSSSwgcmVzb2x2ZWRVUkkpOyAgICAgCi0gICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNvdXJjZVNldC5nZXRVUklDb252ZXJ0ZXIoKS5jcmVhdGVJbnB1dFN0cmVhbShVUkkuY3JlYXRlVVJJKHBoeXNpY2FsTG9jYXRpb24pKTsKLSAgICAgICAgICByZXNvbHZlZFJlc291cmNlID0gKFhTRFJlc291cmNlSW1wbClyZXNvdXJjZVNldC5jcmVhdGVSZXNvdXJjZShVUkkuY3JlYXRlVVJJKCIqLnhzZCIpKTsKLSAgICAgICAgICByZXNvbHZlZFJlc291cmNlLnNldFVSSSh1cmkpOwotICAgICAgICAgIHJlc29sdmVkUmVzb3VyY2UubG9hZChpbnB1dFN0cmVhbSwgbnVsbCk7ICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdCA9IHJlc29sdmVkUmVzb3VyY2UuZ2V0U2NoZW1hKCk7Ci0gICAgICB9Ci0gICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZXhjZXB0aW9uKQotICAgICAgewotICAgICAgICAvLyBJdCBpcyBnZW5lcmFsbHkgbm90IGFuIGVycm9yIHRvIGZhaWwgdG8gcmVzb2x2ZS4KLSAgICAgICAgLy8gSWYgYSByZXNvdXJjZSBpcyBhY3R1YWxseSBjcmVhdGVkLCAKLSAgICAgICAgLy8gd2hpY2ggaGFwcGVucyBvbmx5IHdoZW4gd2UgY2FuIGNyZWF0ZSBhbiBpbnB1dCBzdHJlYW0sCi0gICAgICAgIC8vIHRoZW4gaXQncyBhbiBlcnJvciBpZiBpdCdzIG5vdCBhIGdvb2Qgc2NoZW1hCi0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzQWRhdHBlckZvclR5cGUoT2JqZWN0IHR5cGUpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUgPT0gWFNEU2NoZW1hTG9jYXRvci5jbGFzczsKLSAgICB9ICAKLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9YU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmI4Mjc5Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uOwotCi0vKioKLSAqIEFuIFhTRCB2YWxpZGF0aW9uIGNvbmZpZ3VyYXRpb24gYWxsb3dzIHNldHRpbmcgc3BlY2lmaWMgY29uZmlndXJhdGlvbgotICogaW5mb3JtYXRpb24gZm9yIGEgV1RQIFhTRCB2YWxpZGF0aW9uIHJ1bi4gQW55IGZlYXR1cmVzIGFuZCBwcm9wZXJ0aWVzCi0gKiBzZXQgb24gdGhpcyBjb25maWd1cmF0aW9uIHNob3VsZCBub3QgYmUgY29uZnVzZWQgd2l0aCB0aG9zZSBmcm9tCi0gKiBwYXJzZXJzIHN1Y2ggYXMgWGVyY2VzLiAoVGhpcyBvYmplY3QgZG9lcyBub3QgYnkgZGVmYXVsdCB3cmFwIGZlYXR1cmVzCi0gKiBhbmQgcHJvcGVydGllcyBmcm9tIHNwZWNpZmljIHBhcnNlcnMuKQotICovCi1wdWJsaWMgY2xhc3MgWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24gCi17Ci0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIEhPTk9VUl9BTExfU0NIRU1BX0xPQ0FUSU9OUyA9ICJIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMiOyAvLyROT04tTkxTLTEkCi0gIHByaXZhdGUgYm9vbGVhbiBob25vdXJfYWxsX3NjaGVtYV9sb2NhdGlvbnMgPSBmYWxzZTsKLSAgCi0gIC8qKgotICAgKiBTZXQgYSBmZWF0dXJlIG9mIHRoaXMgY29uZmlndXJhdGlvbi4KLSAgICogCi0gICAqIEBwYXJhbSBmZWF0dXJlCi0gICAqIAkJVGhlIGZlYXR1cmUgdG8gc2V0LgotICAgKiBAcGFyYW0gdmFsdWUKLSAgICogCQlUaGUgdmFsdWUgdG8gc2V0IGZvciB0aGUgZmVhdHVyZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLmVxdWFscyhmZWF0dXJlKSkKLQkgIGhvbm91cl9hbGxfc2NoZW1hX2xvY2F0aW9ucyA9IHZhbHVlOwotCWVsc2UKLQkgIHRocm93IG5ldyBFeGNlcHRpb24oIkZlYXR1cmUgbm90IHJlY29nbml6ZWQuIik7IC8vJE5PTi1OTFMtMSQKLQkKLSAgfQotICAKLSAgCi0gIC8qKgotICAgKiBHZXQgdGhlIHZhbHVlIGZvciBhIGdpdmVuIGZlYXR1cmUuIElmIHRoZSBmZWF0dXJlIGlzIG5vdCBkZWZpbmVkCi0gICAqIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgKiAKLSAgICogQHBhcmFtIGZlYXR1cmUKLSAgICogCQlUaGUgZmVhdHVyZSBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuCi0gICAqIAkJVGhlIGZlYXR1cmUncyB2YWx1ZSwgdHJ1ZSBvciBmYWxzZS4KLSAgICogQHRocm93cyAKLSAgICogCQlBbiBleGNlcHRpb24gaXMgdGhyb3duIGlmIHRoZSBmZWF0dXJlIGlzIG5vdCByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZSkgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0JaWYoSE9OT1VSX0FMTF9TQ0hFTUFfTE9DQVRJT05TLmVxdWFscyhmZWF0dXJlKSkKLQkgIHJldHVybiBob25vdXJfYWxsX3NjaGVtYV9sb2NhdGlvbnM7Ci0JCi0JdGhyb3cgbmV3IEV4Y2VwdGlvbigiRmVhdHVyZSBub3QgcmVjb2duaXplZC4iKTsgLy8kTk9OLU5MUy0xJAotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL1hTRFZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTM3NmUuLjAwMDAwMDAKLS0tIGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vWFNEVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzcgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLmltcGwuQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnBhcnNlcnMuWE1MR3JhbW1hclByZXBhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy51dGlsLlhNTEdyYW1tYXJQb29sSW1wbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkuWE1MUmVzb3VyY2VJZGVudGlmaWVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTklFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLmdyYW1tYXJzLlhNTEdyYW1tYXJEZXNjcmlwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhlcmNlcy54bmkucGFyc2VyLlhNTEVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY29tbW9uLnVyaXJlc29sdmVyLmludGVybmFsLnByb3Zpc2lvbmFsLlVSSVJlc29sdmVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLlhNTFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25JbmZvOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvblJlcG9ydDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FcnJvcjsKLQotLyoqCi0gKiBUaGUgWFNEVmFsaWRhdG9yIHdpbGwgdmFsaWRhdGUgWFNEIGZpbGVzLgotICovCi1wdWJsaWMgY2xhc3MgWFNEVmFsaWRhdG9yCi17Ci0gIHByb3RlY3RlZCBVUklSZXNvbHZlciB1cmlyZXNvbHZlciA9IG51bGw7Ci0KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSkKLSAgewotICAgIHJldHVybiB2YWxpZGF0ZSh1cmksIG51bGwpOwotICB9Ci0gIAotICBwdWJsaWMgVmFsaWRhdGlvblJlcG9ydCB2YWxpZGF0ZShTdHJpbmcgdXJpLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkKLSAgewotCXJldHVybiB2YWxpZGF0ZSh1cmksIG51bGwsIG51bGwpOwotICB9Ci0gIAotICAvKioKLSAgICogVmFsaWRhdGUgdGhlIFhTRCBmaWxlIHNwZWNpZmllZCBieSB0aGUgVVJJLgotICAgKiAKLSAgICogQHBhcmFtIHVyaQotICAgKiAJCVRoZSBVUkkgb2YgdGhlIFhTRCBmaWxlIHRvIHZhbGlkYXRlLgotICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gCi0gICAqIAkJQW4gaW5wdXQgc3RyZWFtIHJlcHJlc2VudGluZyB0aGUgWFNEIGZpbGUgdG8gdmFsaWRhdGUuCi0gICAqIEBwYXJhbSBjb25maWd1cmF0aW9uCi0gICAqIAkJQSBjb25maWd1cmF0aW9uIGZvciB0aGlzIHZhbGlkYXRpb24gcnVuLgotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pCi0gIHsKLQlpZihjb25maWd1cmF0aW9uID09IG51bGwpCi0JewotCSAgY29uZmlndXJhdGlvbiA9IG5ldyBYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbigpOwotCX0KLQlWYWxpZGF0aW9uSW5mbyB2YWxpbmZvID0gbmV3IFZhbGlkYXRpb25JbmZvKHVyaSk7Ci0JWFNERXJyb3JIYW5kbGVyIGVycm9ySGFuZGxlciA9IG5ldyBYU0RFcnJvckhhbmRsZXIodmFsaW5mbyk7Ci0JdHJ5Ci0JewotCSAgWE1MR3JhbW1hclByZXBhcnNlciBncmFtbWFyUHJlcGFyc2VyID0gbmV3IFhNTEdyYW1tYXJQcmVwYXJzZXIoKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIucmVnaXN0ZXJQcmVwYXJzZXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEsbnVsbC8qc2NoZW1hTG9hZGVyKi8pOwotCQkgIAotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRQcm9wZXJ0eShDb25zdGFudHMuWEVSQ0VTX1BST1BFUlRZX1BSRUZJWCArIENvbnN0YW50cy5YTUxHUkFNTUFSX1BPT0xfUFJPUEVSVFksIG5ldyBYTUxHcmFtbWFyUG9vbEltcGwoKSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5DT05USU5VRV9BRlRFUl9GQVRBTF9FUlJPUl9GRUFUVVJFLCBmYWxzZSk7Ci0gICAgICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5OQU1FU1BBQ0VTX0ZFQVRVUkUsIHRydWUpOwotICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuTkFNRVNQQUNFX1BSRUZJWEVTX0ZFQVRVUkUsIHRydWUpOwotCSAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuVkFMSURBVElPTl9GRUFUVVJFLCB0cnVlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLlNDSEVNQV9WQUxJREFUSU9OX0ZFQVRVUkUsIHRydWUpOwotICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRGZWF0dXJlKENvbnN0YW50cy5YRVJDRVNfRkVBVFVSRV9QUkVGSVggKyBDb25zdGFudHMuU0NIRU1BX0ZVTExfQ0hFQ0tJTkcsIGZhbHNlKTsKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgQ29uc3RhbnRzLkVYVEVSTkFMX0dFTkVSQUxfRU5USVRJRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5FWFRFUk5BTF9QQVJBTUVURVJfRU5USVRJRVNfRkVBVFVSRSwgdHJ1ZSk7Ci0JICBncmFtbWFyUHJlcGFyc2VyLnNldEZlYXR1cmUoQ29uc3RhbnRzLlhFUkNFU19GRUFUVVJFX1BSRUZJWCArIENvbnN0YW50cy5XQVJOX09OX0RVUExJQ0FURV9BVFRERUZfRkVBVFVSRSwgdHJ1ZSk7Ci0JICAgICAKLQkgIGlmKGNvbmZpZ3VyYXRpb24uZ2V0RmVhdHVyZShYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpKQotCSAgewotCSAgICB0cnkKLQkgICAgewotCSAgICAgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RmVhdHVyZShDb25zdGFudHMuWEVSQ0VTX0ZFQVRVUkVfUFJFRklYICsgImhvbm91ci1hbGwtc2NoZW1hTG9jYXRpb25zIiwgdHJ1ZSk7Ci0JICAgIH0KLSAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotCSAgICB7Ci0JICAgICAgLy8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgaWdub3JlCi0JICAgIH0KLQkgIH0KLQkgICAgICAKLQkgIGdyYW1tYXJQcmVwYXJzZXIuc2V0RXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlcik7Ci0JICBpZiAodXJpcmVzb2x2ZXIgIT0gbnVsbCkKLQkgIHsKLQkgICAgWFNERW50aXR5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgWFNERW50aXR5UmVzb2x2ZXIodXJpcmVzb2x2ZXIsIHVyaSk7Ci0JICAgIGlmIChyZXNvbHZlciAhPSBudWxsKQotCSAgICB7Ci0JICAgICAgZ3JhbW1hclByZXBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihyZXNvbHZlcik7Ci0JICAgIH0KLQkgIH0KLQotCSAgdHJ5Ci0JICB7Ci0JICAJWE1MSW5wdXRTb3VyY2UgaXMgPSBuZXcgWE1MSW5wdXRTb3VyY2UobnVsbCwgdXJpLCB1cmksIGlucHV0U3RyZWFtLCBudWxsKTsKLQkgICAgZ3JhbW1hclByZXBhcnNlci5nZXRMb2FkZXIoWE1MR3JhbW1hckRlc2NyaXB0aW9uLlhNTF9TQ0hFTUEpOwotCQlncmFtbWFyUHJlcGFyc2VyLnByZXBhcnNlR3JhbW1hcihYTUxHcmFtbWFyRGVzY3JpcHRpb24uWE1MX1NDSEVNQSxpcyk7Ci0JICB9Ci0JICBjYXRjaCAoRXhjZXB0aW9uIGUpCi0JICB7Ci0JICAgIC8vcGFyc2VyIHdpbGwgcmV0dXJuIG51bGwgcG9pbnRlciBleGNlcHRpb24gaWYgdGhlIGRvY3VtZW50IGlzIHN0cnVjdHVyYWxseSBpbnZhbGlkCi0JCS8vVE9ETzogbG9nIGVycm9yIG1lc3NhZ2UKLQkJLy9TeXN0ZW0ub3V0LnByaW50bG4oZSk7Ci0gICAgICB9Ci0JfQotCWNhdGNoIChFeGNlcHRpb24gZSkKLQl7Ci0gICAgICAvLyBUT0RPOiBsb2cgZXJyb3IuCi0JICAvL1N5c3RlbS5vdXQucHJpbnRsbihlKTsKLQl9Ci0JcmV0dXJuIHZhbGluZm87Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBVUkkgcmVzb2x2ZXIgdG8gdXNlIHdpdGggWFNEIHZhbGlkYXRpb24uCi0gICAqIAotICAgKiBAcGFyYW0gdXJpcmVzb2x2ZXIKLSAgICogICAgICAgICAgVGhlIFVSSSByZXNvbHZlciB0byB1c2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciB1cmlyZXNvbHZlcikKLSAgewotICAgIHRoaXMudXJpcmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgWFNERXJyb3JIYW5kbGVyIGhhbmRsZSBYZXJjZXMgcGFyc2luZyBlcnJvcnMgYW5kIHB1dHMgdGhlIGVycm9ycwotICAgKiBpbnRvIHRoZSBnaXZlbiBWYWxpZGF0aW9uSW5mbyBvYmplY3QuCi0gICAqLwotICBwcm90ZWN0ZWQgY2xhc3MgWFNERXJyb3JIYW5kbGVyIGltcGxlbWVudHMgWE1MRXJyb3JIYW5kbGVyCi0gIHsKLQkgIAotICAgIHByaXZhdGUgZmluYWwgVmFsaWRhdGlvbkluZm8gdmFsaW5mbzsKLQotICAgIHB1YmxpYyBYU0RFcnJvckhhbmRsZXIoVmFsaWRhdGlvbkluZm8gdmFsaW5mbykKLSAgICB7Ci0gICAgICB0aGlzLnZhbGluZm8gPSB2YWxpbmZvOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBBZGQgYSB2YWxpZGF0aW9uIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gc2V2ZXJpdHkuCi0gICAgICogCi0gICAgICogQHBhcmFtIGVycm9yS2V5IFRoZSBYZXJjZXMgZXJyb3Iga2V5LgotICAgICAqIEBwYXJhbSBleGNlcHRpb24gVGhlIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gc2V2ZXJpdHkgVGhlIHNldmVyaXR5IG9mIHRoZSB2YWxpZGF0aW9uIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVmFsaWRhdGlvbk1lc3NhZ2UoU3RyaW5nIGVycm9yS2V5LCBYTUxQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24sIGludCBzZXZlcml0eSkKLSAgICB7IAotICAgICAgU3RyaW5nIHN5c3RlbUlkID0gZXhjZXB0aW9uLmdldEV4cGFuZGVkU3lzdGVtSWQoKTsKLSAgICAgIGlmIChzeXN0ZW1JZCAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAoc2V2ZXJpdHkgPT0gRE9NRXJyb3IuU0VWRVJJVFlfV0FSTklORykKLSAgICAgICAgewotICAgICAgICAgIHZhbGluZm8uYWRkV2FybmluZyhleGNlcHRpb24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBleGNlcHRpb24uZ2V0TGluZU51bWJlcigpLCBleGNlcHRpb24uZ2V0Q29sdW1uTnVtYmVyKCksIHN5c3RlbUlkKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICB2YWxpbmZvLmFkZEVycm9yKGV4Y2VwdGlvbi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGV4Y2VwdGlvbi5nZXRMaW5lTnVtYmVyKCksIGV4Y2VwdGlvbi5nZXRDb2x1bW5OdW1iZXIoKSwgc3lzdGVtSWQsIGVycm9yS2V5LCBudWxsKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI3dhcm5pbmcoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3YXJuaW5nKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotCXsKLSAgICAJYWRkVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX1dBUk5JTkcpOwotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI2Vycm9yKGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5TdHJpbmcsIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MUGFyc2VFeGNlcHRpb24pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXJyb3IoU3RyaW5nIGRvbWFpbiwgU3RyaW5nIGtleSwgWE1MUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB0aHJvd3MgWE5JRXhjZXB0aW9uCi0gICAgewotICAgIAlhZGRWYWxpZGF0aW9uTWVzc2FnZShrZXksIGV4Y2VwdGlvbiwgRE9NRXJyb3IuU0VWRVJJVFlfRVJST1IpOwotCX0KLQotICAgIC8qIChub24tSmF2YWRvYykKLSAgICAgKiBAc2VlIG9yZy5hcGFjaGUueGVyY2VzLnhuaS5wYXJzZXIuWE1MRXJyb3JIYW5kbGVyI2ZhdGFsRXJyb3IoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLlN0cmluZywgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxQYXJzZUV4Y2VwdGlvbikKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBmYXRhbEVycm9yKFN0cmluZyBkb21haW4sIFN0cmluZyBrZXksIFhNTFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIFhOSUV4Y2VwdGlvbgotCXsKLSAgICAJYWRkVmFsaWRhdGlvbk1lc3NhZ2Uoa2V5LCBleGNlcHRpb24sIERPTUVycm9yLlNFVkVSSVRZX0ZBVEFMX0VSUk9SKTsKLQl9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIFhTREVudGl0eVJlc29sdmVyIHdyYXBzIGFuIGlkcmVzb2x2ZXIgdG8gcHJvdmlkZSBlbnRpdHkgcmVzb2x1dGlvbiB0bwotICAgKiB0aGUgWFNEIHZhbGlkYXRvci4KLSAgICovCi0gIHByb3RlY3RlZCBjbGFzcyBYU0RFbnRpdHlSZXNvbHZlciBpbXBsZW1lbnRzIFhNTEVudGl0eVJlc29sdmVyCi0gIHsKLSAgICBwcml2YXRlIFVSSVJlc29sdmVyIHVyaXJlc29sdmVyID0gbnVsbDsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdG9yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBpZHJlc29sdmVyCi0gICAgICogICAgICAgICAgVGhlIGlkcmVzb2x2ZXIgdGhpcyBlbnRpdHkgcmVzb2x2ZXIgd3JhcHMuCi0gICAgICogQHBhcmFtIGJhc2Vsb2NhdGlvbiBUaGUgYmFzZSBsb2NhdGlvbiB0byByZXNvbHZlIHdpdGguCi0gICAgICovCi0gICAgcHVibGljIFhTREVudGl0eVJlc29sdmVyKFVSSVJlc29sdmVyIHVyaXJlc29sdmVyLCBTdHJpbmcgYmFzZWxvY2F0aW9uKQotICAgIHsKLSAgICAgIHRoaXMudXJpcmVzb2x2ZXIgPSB1cmlyZXNvbHZlcjsKLSAgICB9Ci0gICAgCi0gICAgLyogKG5vbi1KYXZhZG9jKQotICAgICAqIEBzZWUgb3JnLmFwYWNoZS54ZXJjZXMueG5pLnBhcnNlci5YTUxFbnRpdHlSZXNvbHZlciNyZXNvbHZlRW50aXR5KG9yZy5hcGFjaGUueGVyY2VzLnhuaS5YTUxSZXNvdXJjZUlkZW50aWZpZXIpCi0gICAgICovCi0gICAgcHVibGljIFhNTElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoWE1MUmVzb3VyY2VJZGVudGlmaWVyIHJlc291cmNlSWRlbnRpZmllcikgdGhyb3dzIFhOSUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICBTdHJpbmcgbGl0ZXJhbFN5c3RlbUlkID0gcmVzb3VyY2VJZGVudGlmaWVyLmdldExpdGVyYWxTeXN0ZW1JZCgpOwotICAgICAgaWYobGl0ZXJhbFN5c3RlbUlkICE9IG51bGwpCi0gICAgICB7Ci0gICAgCXJlc291cmNlSWRlbnRpZmllci5zZXRMaXRlcmFsU3lzdGVtSWQobGl0ZXJhbFN5c3RlbUlkLnJlcGxhY2UoJ1xcJywnLycpKTsKLSAgICAgIH0KLSAgICAgICAgLy8gVE9ETyBjczogSW4gcmV2aXNpb24gMS4xIHdlIGV4cGxpY2l0bHkgb3BlbmVkIGEgc3RyZWFtIHRvIGVuc3VyZQotICAgICAgICAvLyBmaWxlIEkvTyBwcm9ibGVtcyBwcm9kdWNlZCBtZXNzYWdlcy4gSSd2ZSByZW1vdmUgdGhpcyBmdWRnZSBmb3Igbm93Ci0gICAgICAgIC8vIHNpbmNlIEkgY2FuJ3Qgc2VlbSB0byByZXByb2R1Y2UgdGhlIHByb2JsZW0gaXQgd2FzIGludGVuZGVkIHRvIGZpeC4KLSAgICAgICAgLy8gSSdtIGhvcGluZyB0aGUgbmV3ZXIgWGVyY2VzIGNvZGUgYmFzZSBoYXMgZml4ZWQgdGhpcyBwcm9ibGVtIGFuZCB0aGUgZnVkZ2UgaXMgZGVmdW5jdC4KLSAgICAgICAgcmV0dXJuIFhNTFZhbGlkYXRvci5faW50ZXJuYWxSZXNvbHZlRW50aXR5KHVyaXJlc29sdmVyLCByZXNvdXJjZUlkZW50aWZpZXIpOwotICAgICAgCi0gICAgfQotICB9ICAgCi19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9WYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1MGFhNS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2U7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvcjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLk5lc3RlZFZhbGlkYXRvckNvbnRleHQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5WYWxpZGF0aW9uTWVzc2FnZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5jb3JlLlZhbGlkYXRpb25SZXBvcnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLlhTRENvcmVQbHVnaW47Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzLlhTRENvcmVQcmVmZXJlbmNlTmFtZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3IgZXh0ZW5kcyBBYnN0cmFjdE5lc3RlZFZhbGlkYXRvcgotewotICBwcm90ZWN0ZWQgSGFzaE1hcCB4c2RDb25maWd1cmF0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNzZXR1cFZhbGlkYXRpb24ob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgc2V0dXBWYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLQlYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IFhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uKCk7Ci0JYm9vbGVhbiBob25vdXJBbGxTY2hlbWFMb2NhdGlvbnMgPSBYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRQbHVnaW5QcmVmZXJlbmNlcygpLmdldEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMpOwotCXRyeQotCXsKLQkgIGNvbmZpZ3VyYXRpb24uc2V0RmVhdHVyZShYU0RWYWxpZGF0aW9uQ29uZmlndXJhdGlvbi5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMsIGhvbm91ckFsbFNjaGVtYUxvY2F0aW9ucyk7Ci0JfQotCWNhdGNoKEV4Y2VwdGlvbiBlKQotCXsKLQkgIC8vIFVuYWJsZSB0byBzZXQgdGhlIGhvbm91ciBhbGwgc2NoZW1hIGxvY2F0aW9ucyBvcHRpb24uIERvIG5vdGhpbmcuCi0JfQotCXhzZENvbmZpZ3VyYXRpb25zLnB1dChjb250ZXh0LCBjb25maWd1cmF0aW9uKTsKLQkKLQlzdXBlci5zZXR1cFZhbGlkYXRpb24oY29udGV4dCk7Ci0gIH0KLQotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciN0ZWFyZG93blZhbGlkYXRpb24ob3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgdGVhcmRvd25WYWxpZGF0aW9uKE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkgCi0gIHsKLQl4c2RDb25maWd1cmF0aW9ucy5yZW1vdmUoY29udGV4dCk7Ci0JCi0Jc3VwZXIudGVhcmRvd25WYWxpZGF0aW9uKGNvbnRleHQpOwotICB9Ci0KLSAgLyogKG5vbi1KYXZhZG9jKQotICAgKiBAc2VlIG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuQWJzdHJhY3ROZXN0ZWRWYWxpZGF0b3IjdmFsaWRhdGUoamF2YS5sYW5nLlN0cmluZywgamF2YS5pby5JbnB1dFN0cmVhbSwgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5OZXN0ZWRWYWxpZGF0b3JDb250ZXh0KQotICAgKi8KLSAgcHVibGljIFZhbGlkYXRpb25SZXBvcnQgdmFsaWRhdGUoU3RyaW5nIHVyaSwgSW5wdXRTdHJlYW0gaW5wdXRzdHJlYW0sIE5lc3RlZFZhbGlkYXRvckNvbnRleHQgY29udGV4dCkKLSAgeyAgCi0JWFNEVmFsaWRhdG9yIHZhbGlkYXRvciA9IFhTRFZhbGlkYXRvci5nZXRJbnN0YW5jZSgpOwotCQotCVhTRFZhbGlkYXRpb25Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSAoWFNEVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb24peHNkQ29uZmlndXJhdGlvbnMuZ2V0KGNvbnRleHQpOwotCi0JVmFsaWRhdGlvblJlcG9ydCB2YWxyZXBvcnQgPSBudWxsOwotCQotCXZhbHJlcG9ydCA9IHZhbGlkYXRvci52YWxpZGF0ZSh1cmksIGlucHV0c3RyZWFtLCBjb25maWd1cmF0aW9uKTsKLQkJICAgICAgICAKLQlyZXR1cm4gdmFscmVwb3J0OwotICB9Ci0JICAKLSAgLyoqCi0gICAqIFN0b3JlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gaW4gdGhlIG1lc3NhZ2UgcGFyYW1ldGVycy4gRm9yIFhTRCB2YWxpZGF0aW9uIHRoZXJlCi0gICAqIGFyZSB0aHJlZSBhZGRpdGlvbmFsIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiB0byBzdG9yZToKLSAgICogcGFyYW1bMF0gPSB0aGUgY29sdW1uIG51bWJlciBvZiB0aGUgZXJyb3IKLSAgICogcGFyYW1bMV0gPSB0aGUgJ3NxdWlnZ2xlIHNlbGVjdGlvbiBzdHJhdGVneScgZm9yIHdoaWNoIERPTSBwYXJ0IHRvIHNxdWlnZ2xlCi0gICAqIHBhcmFtWzJdID0gdGhlIG5hbWUgb3IgdmFsdWUgb2Ygd2hhdCBpcyB0byBiZSBzcXVpZ2dsZWQKLSAgICogCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNhZGRJbmZvVG9NZXNzYWdlKG9yZy5lY2xpcHNlLndzdC54bWwuY29yZS5pbnRlcm5hbC52YWxpZGF0aW9uLmNvcmUuVmFsaWRhdGlvbk1lc3NhZ2UsIG9yZy5lY2xpcHNlLndzdC52YWxpZGF0aW9uLmludGVybmFsLnByb3Zpc2lvbmFsLmNvcmUuSU1lc3NhZ2UpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhZGRJbmZvVG9NZXNzYWdlKFZhbGlkYXRpb25NZXNzYWdlIHZhbGlkYXRpb25NZXNzYWdlLCBJTWVzc2FnZSBtZXNzYWdlKQotICB7IAotCVN0cmluZyBrZXkgPSB2YWxpZGF0aW9uTWVzc2FnZS5nZXRLZXkoKTsKLQlpZihrZXkgIT0gbnVsbCkKLQl7Ci0JICBYU0RNZXNzYWdlSW5mb0hlbHBlciBtZXNzYWdlSW5mb0hlbHBlciA9IG5ldyBYU0RNZXNzYWdlSW5mb0hlbHBlcigpOwotCSAgU3RyaW5nW10gbWVzc2FnZUluZm8gPSBtZXNzYWdlSW5mb0hlbHBlci5jcmVhdGVNZXNzYWdlSW5mbyhrZXksIHZhbGlkYXRpb25NZXNzYWdlLmdldE1lc3NhZ2UoKSk7Ci0KLQkgIG1lc3NhZ2Uuc2V0QXR0cmlidXRlKENPTFVNTl9OVU1CRVJfQVRUUklCVVRFLCBuZXcgSW50ZWdlcih2YWxpZGF0aW9uTWVzc2FnZS5nZXRDb2x1bW5OdW1iZXIoKSkpOwotCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfU0VMRUNUSU9OX1NUUkFURUdZX0FUVFJJQlVURSwgbWVzc2FnZUluZm9bMF0pOwotCSAgbWVzc2FnZS5zZXRBdHRyaWJ1dGUoU1FVSUdHTEVfTkFNRV9PUl9WQUxVRV9BVFRSSUJVVEUsIG1lc3NhZ2VJbmZvWzFdKTsKLQl9Ci0gIH0KLQotICAvKgotICAgKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uY29yZS5BYnN0cmFjdE5lc3RlZFZhbGlkYXRvciNnZXRWYWxpZGF0b3JJRCgpCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFZhbGlkYXRvcklEKCkKLSAgewotICAgIC8vIEJlY2F1c2UgdGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgZGVsZWdhdGUsIHJldHVybiB0aGUgaWQgb2YgdGhlIHZhbGlkYXRvcgotICAgIC8vIHdoaWNoIGRlbGVnYXRlcyB0byB0aGlzIGNsYXNzLgotCi0gICAgcmV0dXJuIFhTRERlbGVnYXRpbmdWYWxpZGF0b3IuY2xhc3MuZ2V0TmFtZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRERlbGVnYXRpbmdWYWxpZGF0b3IuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNERGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjYxNWJhLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNERGVsZWdhdGluZ1ZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKgotICogQ29udHJpYnV0b3JzOgotICogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcGFja2FnZSBvcmcuZWNsaXBzZS53c3QueHNkLmNvcmUuaW50ZXJuYWwudmFsaWRhdGlvbi5lY2xpcHNlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnZhbGlkYXRpb24uaW50ZXJuYWwuZGVsZWdhdGVzLkRlbGVnYXRpbmdWYWxpZGF0b3I7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lIChjbGFzcyBuYW1lKSB3aGljaCB0aGUgdmFsaWRhdGlvbiBmcmFtZXdvcmsKLSAqIHdpbGwgdXNlIHRvIGlkZW50aWZ5IHRoZSBYU0QgdmFsaWRhdG9yLiBUaGUgYWN0dWFsIGRlbGVnYXRpbmcgdmFsaWRhdG9yCi0gKiBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IHRoZSBiYXNlIGNsYXNzLiBUaGUgYWN0dWFsIHZhbGlkYXRpb24KLSAqIGZ1bmN0aW9uYWxpdHkgaXMgcHJvdmlkZWQgYnkgdGhlIGRlbGVnYXRlcyByZWdpc3RlcmVkIHdpdGggdGhpcyBjbGFzcyBhcwotICogdGhlaXIgdGFyZ2V0LgotICovCi1wdWJsaWMgY2xhc3MgWFNERGVsZWdhdGluZ1ZhbGlkYXRvciBleHRlbmRzIERlbGVnYXRpbmdWYWxpZGF0b3IKLXsKLSAgLyoqCi0gICAqIERlZmF1bHQgY29uc3RydWN0b3IuCi0gICAqLwotICBwdWJsaWMgWFNERGVsZWdhdGluZ1ZhbGlkYXRvcigpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RNZXNzYWdlSW5mb0hlbHBlci5qYXZhIGIvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjLXZhbGlkYXRpb24vb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ZhbGlkYXRpb24vZWNsaXBzZS9YU0RNZXNzYWdlSW5mb0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDE2NTgzLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNETWVzc2FnZUluZm9IZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotCi0vKioKLSAqIFRoZSBYU0RNZXNzYWdlSW5mb0hlbHBlciBjcmVhdGVzIGEgc3RyaW5nIHdpdGggdGhlCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RNZXNzYWdlSW5mb0hlbHBlcgotewotICBwdWJsaWMgWFNETWVzc2FnZUluZm9IZWxwZXIoKQotICB7IHN1cGVyKCk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nW10gY3JlYXRlTWVzc2FnZUluZm8oU3RyaW5nIGVycm9yS2V5LCBTdHJpbmcgZXJyb3JNZXNzYWdlKQotICB7IAotICAgIC8vTm93IG1hcCB0aGUgZXJyb3Iga2V5IHRvIHdoYXQgd2Ugd291bGQgd2FudCB0byB1bmRlcmxpbmU6Ci0gICAgU3RyaW5nIG5hbWVPclZhbHVlID0gIiI7Ci0gICAgU3RyaW5nIHNlbGVjdGlvblN0cmF0ZWd5ID0gIiI7Ci0gICAgaWYoZXJyb3JLZXkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtZWx0LWludmFsaWQtY29udGVudC4xIikgfHwgZXJyb3JLZXkuZXF1YWxzKCJzNHMtZWx0LW11c3QtbWF0Y2guMSIpIHx8IAotICAgIAkJICBlcnJvcktleS5lcXVhbHMoInM0cy1hdHQtbXVzdC1hcHBlYXIiKSB8fCBlcnJvcktleS5lcXVhbHMoInM0cy1lbHQtaW52YWxpZC1jb250ZW50LjIiKSkKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIlNUQVJUX1RBRyI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoInM0cy1hdHQtbm90LWFsbG93ZWQiKSkKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIkFUVFJJQlVURV9OQU1FIjsKLSAgICAgICAgbmFtZU9yVmFsdWUgPSBnZXRGaXJzdFN0cmluZ0JldHdlZW5TaW5nbGVRdW90ZXMoZXJyb3JNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGVycm9yS2V5LmVxdWFscygiczRzLWF0dC1pbnZhbGlkLXZhbHVlIikpCi0gICAgICB7IAotICAgIAlzZWxlY3Rpb25TdHJhdGVneSA9ICJBVFRSSUJVVEVfVkFMVUUiOwotICAgICAgICBuYW1lT3JWYWx1ZSA9IGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhlcnJvck1lc3NhZ2UpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXJyb3JLZXkuZXF1YWxzKCJzNHMtZWx0LWNoYXJhY3RlciIpKQotICAgICAgeyAKLSAgICAJc2VsZWN0aW9uU3RyYXRlZ3kgPSAiVEVYVCI7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChlcnJvcktleS5lcXVhbHMoInNyYy1yZXNvbHZlLjQuMiIpIHx8IGVycm9yS2V5LmVxdWFscygic3JjLXJlc29sdmUiKSkKLSAgICAgIHsgCi0gICAgCXNlbGVjdGlvblN0cmF0ZWd5ID0gIlZBTFVFX09GX0FUVFJJQlVURV9XSVRIX0dJVkVOX1ZBTFVFIjsKLSAgICAgICAgbmFtZU9yVmFsdWUgPSBnZXRGaXJzdFN0cmluZ0JldHdlZW5TaW5nbGVRdW90ZXMoZXJyb3JNZXNzYWdlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgU3RyaW5nIG1lc3NhZ2VJbmZvW10gPSBuZXcgU3RyaW5nWzJdOwotICAgIG1lc3NhZ2VJbmZvWzBdID0gc2VsZWN0aW9uU3RyYXRlZ3k7Ci0gICAgbWVzc2FnZUluZm9bMV0gPSBuYW1lT3JWYWx1ZTsKLSAgICByZXR1cm4gbWVzc2FnZUluZm87ICAgIAotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZ2V0IHRoZSB2YWx1ZSBiZXR3ZWVuIHRoZSBmaXJzdCBwYWlyIG9mIHNpbmdsZSBxdW90ZXMKLSAgICogSXQgaXMgdXNlZCB0byBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gdGhlIGVycm9yIE1lc3NhZ2UgKGZvciBleGFtcGxlCi0gICAqIGFuIGF0dHJpYnV0ZSBuYW1lKQotICAgKiAKLSAgICogQHBhcmFtIHMKLSAgICogCQlUaGUgc3RyaW5nIHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEZpcnN0U3RyaW5nQmV0d2VlblNpbmdsZVF1b3RlcyhTdHJpbmcgcykKLSAgewotICAgIGludCBmaXJzdCA9IHMuaW5kZXhPZigiJyIpOwotICAgIGludCBzZWNvbmQgPSBzLmluZGV4T2YoIiciLCBmaXJzdCArIDEpOwotICAgIFN0cmluZyBiZXR3ZWVuUXVvdGVzID0gbnVsbDsKLSAgICBpZiAoZmlyc3QgIT0gLTEgJiYgc2Vjb25kICE9IC0xKQotICAgIHsgYmV0d2VlblF1b3RlcyA9IHMuc3Vic3RyaW5nKGZpcnN0ICsgMSwgc2Vjb25kKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJldHdlZW5RdW90ZXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNEVmFsaWRhdG9yLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMtdmFsaWRhdGlvbi9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvdmFsaWRhdGlvbi9lY2xpcHNlL1hTRFZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWIxYmE2Li4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy12YWxpZGF0aW9uL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC92YWxpZGF0aW9uL2VjbGlwc2UvWFNEVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uZWNsaXBzZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jb21tb24udXJpcmVzb2x2ZXIuaW50ZXJuYWwucHJvdmlzaW9uYWwuVVJJUmVzb2x2ZXJQbHVnaW47Ci0KLQotLyoqCi0gKiBBbiBYU0QgdmFsaWRhdG9yIHNwZWNpZmljIHRvIEVjbGlwc2UuIFRoaXMgdmFsaWRhdG9yIHdpbGwgd3JhcCB0aGUgaW50ZXJuYWwKLSAqIFhTRCB2YWxpZGF0b3IgYW4gcHJvdmlkZSBhdXRvbWF0aWMgVVJJIHJlc29sdXRpb24gc3VwcG9ydC4KLSAqIFVzaW5nIHRoaXMgY2xhc3MgaXMgZXF1aXZhbGVudCB0byB1c2luZyB0aGUgaW50ZXJuYWwgWFNEIHZhbGlkYXRvciBhbmQgcmVnaXN0ZXJpbmcKLSAqIHRoZSBVUkkgcmVzb2x2ZXIgZnJvbSB0aGUgVVJJIHJlc29sdXRpb24gZnJhbWV3b3JrLgotICovCi1wdWJsaWMgY2xhc3MgWFNEVmFsaWRhdG9yIGV4dGVuZHMgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnZhbGlkYXRpb24uWFNEVmFsaWRhdG9yCi17Ci0gIHByaXZhdGUgc3RhdGljIFhTRFZhbGlkYXRvciBpbnN0YW5jZSA9IG51bGw7Ci0gIAotICAvKioKLSAgICogUmV0dXJuIHRoZSBvbmUgYW5kIG9ubHkgaW5zdGFuY2Ugb2YgdGhlIFhTRCB2YWxpZGF0b3IuIFRoZSB2YWxpZGF0b3IKLSAgICogY2FuIGJlIHJldXNlZCBhbmQgY2Fubm90IGJlIGN1c3RvbWl6ZWQgc28gdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIGluc3RhbmNlIG9mIGl0LgotICAgKiAKLSAgICogQHJldHVybiBUaGUgb25lIGFuZCBvbmx5IGluc3RhbmNlIG9mIHRoZSBYU0QgdmFsaWRhdG9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBYU0RWYWxpZGF0b3IgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYoaW5zdGFuY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpbnN0YW5jZSA9IG5ldyBYU0RWYWxpZGF0b3IoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotICB9Ci0gIC8qKgotICAgKiBDb25zdHJ1Y3Rvci4gQ3JlYXRlIHRoZSBYU0QgdmFsaWRhdG9yIGFuZCBzZXQgdGhlIFVSSSByZXNvbHZlci4KLSAgICovCi0gIHByb3RlY3RlZCBYU0RWYWxpZGF0b3IoKQotICB7Ci0gICAgdGhpcy5zZXRVUklSZXNvbHZlcihVUklSZXNvbHZlclBsdWdpbi5jcmVhdGVSZXNvbHZlcigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9YU0RDb3JlUGx1Z2luLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL1hTRENvcmVQbHVnaW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzMGYyNi4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL1hTRENvcmVQbHVnaW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0qIENvcHlyaWdodCAoYykgMjAwNCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSogCi0qIENvbnRyaWJ1dG9yczoKLSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIEluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsdWdpbjsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueHNkLmNvbnRlbnRtb2RlbC5pbnRlcm5hbC5YU0RDTU1hbmFnZXI7Ci1pbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7Ci0KLS8qKgotICogVGhlIG1haW4gcGx1Z2luIGNsYXNzIHRvIGJlIHVzZWQgaW4gdGhlIGRlc2t0b3AuCi0gKi8KLXB1YmxpYyBjbGFzcyBYU0RDb3JlUGx1Z2luIGV4dGVuZHMgUGx1Z2luIHsKLQkvL1RoZSBzaGFyZWQgaW5zdGFuY2UuCi0JcHJpdmF0ZSBzdGF0aWMgWFNEQ29yZVBsdWdpbiBwbHVnaW47Ci0JCi0JLyoqCi0JICogVGhlIGNvbnN0cnVjdG9yLgotCSAqLwotCXB1YmxpYyBYU0RDb3JlUGx1Z2luKCkgewotCQlzdXBlcigpOwotCQlwbHVnaW4gPSB0aGlzOwotCX0KLQotCS8qKgotCSAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB1cG9uIHBsdWctaW4gYWN0aXZhdGlvbgotCSAqLwotCXB1YmxpYyB2b2lkIHN0YXJ0KEJ1bmRsZUNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0JCXN1cGVyLnN0YXJ0KGNvbnRleHQpOwotICAgIFhTRENNTWFuYWdlci5nZXRJbnN0YW5jZSgpLnN0YXJ0dXAoKTsKLQl9Ci0KLQkvKioKLQkgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGUgcGx1Zy1pbiBpcyBzdG9wcGVkCi0JICovCi0JcHVibGljIHZvaWQgc3RvcChCdW5kbGVDb250ZXh0IGNvbnRleHQpIHRocm93cyBFeGNlcHRpb24gewotCQlzdXBlci5zdG9wKGNvbnRleHQpOwotCQlwbHVnaW4gPSBudWxsOwotCX0KLQotCS8qKgotCSAqIFJldHVybnMgdGhlIHNoYXJlZCBpbnN0YW5jZS4KLQkgKi8KLQlwdWJsaWMgc3RhdGljIFhTRENvcmVQbHVnaW4gZ2V0RGVmYXVsdCgpIHsKLQkJcmV0dXJuIHBsdWdpbjsKLQl9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9vcmcuZWNsaXBzZS53c3QueHNkLmNvcmUvc3JjL29yZy9lY2xpcHNlL3dzdC94c2QvY29yZS9pbnRlcm5hbC9wcmVmZXJlbmNlcy9YU0RDb3JlUHJlZmVyZW5jZUluaXRpYWxpemVyLmphdmEgYi9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc1ZTNhMS4uMDAwMDAwMAotLS0gYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLnByZWZlcmVuY2VzOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLkFic3RyYWN0UHJlZmVyZW5jZUluaXRpYWxpemVyOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5EZWZhdWx0U2NvcGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnByZWZlcmVuY2VzLklFY2xpcHNlUHJlZmVyZW5jZXM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlLmludGVybmFsLlhTRENvcmVQbHVnaW47Ci0KLS8qKgotICogU2V0cyBkZWZhdWx0IHZhbHVlcyBmb3IgWFNEIENvcmUgcHJlZmVyZW5jZXMKLSAqLwotcHVibGljIGNsYXNzIFhTRENvcmVQcmVmZXJlbmNlSW5pdGlhbGl6ZXIgZXh0ZW5kcyBBYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciB7Ci0KLQkvKgotCSAqIChub24tSmF2YWRvYykKLQkgKiAKLQkgKiBAc2VlIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5wcmVmZXJlbmNlcy5BYnN0cmFjdFByZWZlcmVuY2VJbml0aWFsaXplciNpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkKLQkgKi8KLQlwdWJsaWMgdm9pZCBpbml0aWFsaXplRGVmYXVsdFByZWZlcmVuY2VzKCkgewotCQlJRWNsaXBzZVByZWZlcmVuY2VzIG5vZGUgPSBuZXcgRGVmYXVsdFNjb3BlKCkuZ2V0Tm9kZShYU0RDb3JlUGx1Z2luLmdldERlZmF1bHQoKS5nZXRCdW5kbGUoKS5nZXRTeW1ib2xpY05hbWUoKSk7Ci0JCQotCQkvLyBWYWxpZGF0aW9uIHByZWZlcmVuY2VzLgotCQlub2RlLnB1dEJvb2xlYW4oWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5IT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMsIGZhbHNlKTsKLQl9Ci19CmRpZmYgLS1naXQgYS9idW5kbGVzL29yZy5lY2xpcHNlLndzdC54c2QuY29yZS9zcmMvb3JnL2VjbGlwc2Uvd3N0L3hzZC9jb3JlL2ludGVybmFsL3ByZWZlcmVuY2VzL1hTRENvcmVQcmVmZXJlbmNlTmFtZXMuamF2YSBiL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzdkMGNjLi4wMDAwMDAwCi0tLSBhL2J1bmRsZXMvb3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlL3NyYy9vcmcvZWNsaXBzZS93c3QveHNkL2NvcmUvaW50ZXJuYWwvcHJlZmVyZW5jZXMvWFNEQ29yZVByZWZlcmVuY2VOYW1lcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC54c2QuY29yZS5pbnRlcm5hbC5wcmVmZXJlbmNlczsKLQotLyoqCi0gKiBDb21tb24gcHJlZmVyZW5jZSBrZXlzIHVzZWQgYnkgWFNEIGNvcmUKLSAqLwotcHVibGljIGNsYXNzIFhTRENvcmVQcmVmZXJlbmNlTmFtZXMgewotCXByaXZhdGUgWFNEQ29yZVByZWZlcmVuY2VOYW1lcygpIHsKLQkJLy8gZW1wdHkgcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyB1c2VycyBjYW5ub3QgaW5zdGFudGlhdGUgY2xhc3MKLQl9Ci0JLyoqCi0JICogSW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IGFsbCBzY2hlbWEgbG9jYXRpb25zIHNob3VsZCBiZSBob25vdXJlZAotCSAqIGR1cmluZyBYU0QgdmFsaWRhdGlvbi4KLQkgKiA8cD4KLQkgKiBWYWx1ZSBpcyBvZiB0eXBlIDxjb2RlPmJvb2xlYW48L2NvZGU+LjxiciAvPgotCSAqIFBvc3NpYmxlIHZhbHVlczoge1RSVUUsIEZBTFNFfQotCSAqIDwvcD4KLQkgKiAKLQkgKi8KLQlwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIT05PVVJfQUxMX1NDSEVNQV9MT0NBVElPTlMgPSAiaG9ub3VyQWxsU2NoZW1hTG9jYXRpb25zIjsvLyROT04tTkxTLTEkCi19CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY2xhc3NwYXRoIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmNsYXNzcGF0aApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUxYzhmMi4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uY2xhc3NwYXRoCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGNsYXNzcGF0aD4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ic3JjIiBwYXRoPSJzcmMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5qZHQubGF1bmNoaW5nLkpSRV9DT05UQUlORVIiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0iY29uIiBwYXRoPSJvcmcuZWNsaXBzZS5wZGUuY29yZS5yZXF1aXJlZFBsdWdpbnMiLz4KLQk8Y2xhc3NwYXRoZW50cnkga2luZD0ib3V0cHV0IiBwYXRoPSJiaW4iLz4KLTwvY2xhc3NwYXRoPgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2I5YzUuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluCi1idWlsZC5wcm9wZXJ0aWVzCi1idWlsZC54bWwKLXNzZWp1bml0LmphcgotdGVtcC5mb2xkZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5wcm9qZWN0IGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZjUxMDkuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0czwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLmpkdC5jb3JlLmphdmFidWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5qZHQuY29yZS5qYXZhbmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL01FVEEtSU5GL01BTklGRVNULk1GIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjODk4YmEuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlQnVuZGxlLU5hbWUuMAotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHM7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDAuNy4wCi1CdW5kbGUtQ2xhc3NQYXRoOiBzc2V1bml0dGVzdHMuamFyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUV4cG9ydC1QYWNrYWdlOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cywKLSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzCi1SZXF1aXJlLUJ1bmRsZTogb3JnLmp1bml0LAotIG9yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLAotIG9yZy5lY2xpcHNlLmNvcmUucnVudGltZSwKLSBvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2UuanN0LmpzcC50ZXN0cy5lbmNvZGluZywKLSBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLnRlc3RzLAotIG9yZy5lY2xpcHNlLmpzdC5qc3AudWkudGVzdHMucGVyZm9ybWFuY2UsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5jc3MudGVzdHMuZW5jb2RpbmcsCi0gb3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZXN0cy5wZXJmb3JtYW5jZSwKLSBvcmcuZWNsaXBzZS53c3QuZHRkLnVpLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudGVzdHMuZW5jb2RpbmcsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkudGVzdHMucGVyZm9ybWFuY2UsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LnNzZS51aS50ZXN0cy5wZXJmb3JtYW5jZSwKLSBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGVzdHMsCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC50ZXN0cy5lbmNvZGluZywKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlc3RzLnBlcmZvcm1hbmNlLAotIG9yZy5lY2xpcHNlLndzdC54bWwudmFsaWRhdGlvbi50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QueG1sLnVpLAotIG9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLAotIG9yZy5lY2xpcHNlLndzdC54c2QudmFsaWRhdGlvbi50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QuY3NzLnVpLnRlc3RzLAotIG9yZy5lY2xpcHNlLndzdC5zc2UudWksCi0gb3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZXN0cywKLSBvcmcuZWNsaXBzZS53c3QudmFsaWRhdGlvbgpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZiBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL2ljb25zL3NvdXJjZUVkaXRvci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZWJkYjguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvaWNvbnMvc291cmNlRWRpdG9yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNDM3MGIuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyAgICAgCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1YTUxfU291cmNlX1BhZ2VfRWRpdG9yLm5hbWU9WE1MIFNvdXJjZSBQYWdlIEVkaXRvcgotSmF2YVNjcmlwdF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZT1KYXZhU2NyaXB0IFNvdXJjZSBQYWdlIEVkaXRvcgotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFVuaXQgVGVzdHMKLWFkZGl0aW9uYWxUZXN0cz1BZGRpdGlvbmFsIFRlc3RDYXNlcyBhbmQgVGVzdFN1aXRlcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwgYi9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjllZTE5Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLSAgICAgICAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UudWkuZWRpdG9ycyI+Ci0gICAgICAgICAgICAgICAgPGVkaXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iJVhNTF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIGljb249Imljb25zL3NvdXJjZUVkaXRvci5naWYiCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cmlidXRvckNsYXNzPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3JYTUwiCi0gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ib3JnLmVjbGlwc2Uud3N0LnNzZS51aS5TdHJ1Y3R1cmVkVGV4dEVkaXRvciIKLSAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbGljRm9udE5hbWU9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkudGV4dGZvbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBpZD0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLnhtbC5zb3VyY2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS5jb3JlLnJ1bnRpbWUueG1sIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRlbnRUeXBlQmluZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZUlkPSJvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUueG1sc291cmNlIiAvPgotICAgICAgICAgICAgICAgIDwvZWRpdG9yPgotICAgICAgICA8L2V4dGVuc2lvbj4KLSAgICAgICAgCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLnVpLmVkaXRvcnMiPgotCQk8ZWRpdG9yCi0JCQluYW1lPSIlSmF2YVNjcmlwdF9Tb3VyY2VfUGFnZV9FZGl0b3IubmFtZSIKLQkJCWljb249Imljb25zL3NvdXJjZUVkaXRvci5naWYiCi0JCQlleHRlbnNpb25zPSJqcyIKLQkJCWNvbnRyaWJ1dG9yQ2xhc3M9Im9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpLmludGVybmFsLmFjdGlvbnMuQWN0aW9uQ29udHJpYnV0b3JKUyIKLQkJCWNsYXNzPSJvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC51aS5pbnRlcm5hbC5lZGl0b3IuSlNFZGl0b3IiCi0JCQlzeW1ib2xpY0ZvbnROYW1lPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLnRleHRmb250IgotCQkJaWQ9Im9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LmNvcmUuamF2YXNjcmlwdHNvdXJjZS5zb3VyY2UiPgotCQkJPGNvbnRlbnRUeXBlQmluZGluZwotCQkJCWNvbnRlbnRUeXBlSWQ9Im9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LmNvcmUuamF2YXNjcmlwdHNvdXJjZSIgLz4KLQkJPC9lZGl0b3I+Ci0JPC9leHRlbnNpb24+Ci0KLQk8ZXh0ZW5zaW9uLXBvaW50IGlkPSJhZGRpdGlvbmFsVGVzdHMiIG5hbWU9IiVhZGRpdGlvbmFsVGVzdHMiLz4KLQotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3Rlckxpc3RUZXN0U3VpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1NzdlZS4uMDAwMDAwMAotLS0gYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvTWFzdGVyTGlzdFRlc3RTdWl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0LDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiAKLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUKLSAqIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaAotICogYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKiAKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5Db3JlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lY2xpcHNlLmNvcmUucnVudGltZS5JQ29uZmlndXJhdGlvbkVsZW1lbnQ7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuY29yZS5ydW50aW1lLlBsYXRmb3JtOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AuY29yZS50ZXN0cy5KU1BDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLmpzdC5qc3AudGVzdHMuZW5jb2RpbmcuSlNQRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZXN0cy5KU1BVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLmNvcmUudGVzdHMuQ1NTQ29yZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuY3NzLnRlc3RzLmVuY29kaW5nLkNTU0VuY29kaW5nVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5jc3MudWkudGVzdHMuQ1NTVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS50ZXN0cy5EVERVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC5jb3JlLnRlc3RzLkhUTUxDb3JlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnRlc3RzLmVuY29kaW5nLkhUTUxFbmNvZGluZ1Rlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS50ZXN0cy5IVE1MVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlLnRlc3RzLlNTRU1vZGVsVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVzdHMuU1NFVUlUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlLnRlc3RzLlNTRU1vZGVsWE1MVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC54bWwudGVzdHMuZW5jb2RpbmcuRW5jb2RpbmdUZXN0U3VpdGU7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhtbC51aS50ZXN0cy5YTUxVSVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnZhbGlkYXRpb24udGVzdHMuaW50ZXJuYWwuQWxsWE1MVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LnhzZC52YWxpZGF0aW9uLnRlc3RzLmludGVybmFsLkFsbFhTRFRlc3RzOwotCi1wdWJsaWMgY2xhc3MgTWFzdGVyTGlzdFRlc3RTdWl0ZSBleHRlbmRzIFRlc3RTdWl0ZSB7Ci0KLQlwdWJsaWMgTWFzdGVyTGlzdFRlc3RTdWl0ZSgpIHsKLQkJc3VwZXIoIkFsbCBUZXN0cyIpOwotCi0JCVN5c3RlbS5zZXRQcm9wZXJ0eSgid3RwLmF1dG90ZXN0Lm5vbmludGVyYWN0aXZlIiwgInRydWUiKTsKLQotCQlhZGRUZXN0KFNTRU1vZGVsVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFNTRU1vZGVsWE1MVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KENTU0NvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSFRNTENvcmVUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSlNQQ29yZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQotCQlhZGRUZXN0KEFsbFhNTFRlc3RzLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoQ1NTRW5jb2RpbmdUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSFRNTEVuY29kaW5nVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEpTUEVuY29kaW5nVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoQ1NTVUlUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSFRNTFVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFNTRVVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KFhNTFVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KERURFVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCQlhZGRUZXN0KEpTUFVJVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0JCWFkZFRlc3QoQWxsWFNEVGVzdHMuc3VpdGUoKSk7Ci0KLQkJLy8gYWRkVGVzdChSZWdyZXNzaW9uQnVja2V0LnN1aXRlKCkpOwotCQkvLyBhZGRUZXN0KEFsbFRlc3RDYXNlcy5zdWl0ZSgpKTsKLQotCQlJQ29uZmlndXJhdGlvbkVsZW1lbnRbXSBlbGVtZW50cyA9IFBsYXRmb3JtLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkuZ2V0Q29uZmlndXJhdGlvbkVsZW1lbnRzRm9yKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5hZGRpdGlvbmFsU3VpdGVzIik7Ci0JCWZvciAoaW50IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKLQkJCWlmIChlbGVtZW50c1tpXS5nZXROYW1lKCkuZXF1YWxzKCJzdWl0ZSIpKSB7Ci0JCQkJVGVzdFN1aXRlIHN1aXRlOwotCQkJCXRyeSB7Ci0JCQkJCXN1aXRlID0gKFRlc3RTdWl0ZSkgZWxlbWVudHNbaV0uY3JlYXRlRXhlY3V0YWJsZUV4dGVuc2lvbigiY2xhc3MiKTsKLQkJCQkJYWRkVGVzdChzdWl0ZSk7Ci0JCQkJfQotCQkJCWNhdGNoIChDb3JlRXhjZXB0aW9uIGUpIHsKLQkJCQkJUGxhdGZvcm0uZ2V0TG9nKFBsYXRmb3JtLmdldEJ1bmRsZSgib3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMiKSkubG9nKGUuZ2V0U3RhdHVzKCkpOwotCQkJCX0KLQkJCX0KLQkJCWVsc2UgaWYgKGVsZW1lbnRzW2ldLmdldE5hbWUoKS5lcXVhbHMoInRlc3QiKSkgewotCQkJCVRlc3QgdGVzdDsKLQkJCQl0cnkgewotCQkJCQl0ZXN0ID0gKFRlc3QpIGVsZW1lbnRzW2ldLmNyZWF0ZUV4ZWN1dGFibGVFeHRlbnNpb24oImNsYXNzIik7Ci0JCQkJCWFkZFRlc3QobmV3IFRlc3RTdWl0ZSh0ZXN0LmdldENsYXNzKCkpKTsKLQkJCQl9Ci0JCQkJY2F0Y2ggKENvcmVFeGNlcHRpb24gZSkgewotCQkJCQlQbGF0Zm9ybS5nZXRMb2coUGxhdGZvcm0uZ2V0QnVuZGxlKCJvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cyIpKS5sb2coZS5nZXRTdGF0dXMoKSk7Ci0JCQkJfQotCQkJfQotCQl9Ci0JfQotCi0JcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKLQkJLy8gdGhpcyBtZXRob2QgbmVlZHMgdG8gZXhpc3QsIGJ1dCBkb2Vzbid0IHJlYWxseSBkbyBhbnl0aGluZwotCQkvLyBvdGhlciB0aGFuIHRvIHNpZ25hbCB0byBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KLQkJLy8gVGhlIHJlc3QgaXQgYXV0b21hdGljIGZyb20gdGhlIHRlc3RzIGFkZGVkIGluIGNvbnN0cnVjdG9yLgotCX0KLX0KZGlmZiAtLWdpdCBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9NYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZS5qYXZhIGIvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3RlclBlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0OTEwMTQuLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL01hc3RlclBlcmZvcm1hbmNlVGVzdFN1aXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogICAgIAotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXBhY2thZ2Ugb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi1pbXBvcnQgb3JnLmVjbGlwc2UuanN0LmpzcC51aS50ZXN0cy5wZXJmb3JtYW5jZS5KU1BVSVBlcmZvcm1hbmNlVGVzdHM7Ci1pbXBvcnQgb3JnLmVjbGlwc2Uud3N0LmNzcy51aS50ZXN0cy5wZXJmb3JtYW5jZS5DU1NVSVBlcmZvcm1hbmNlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLnRlc3RzLnBlcmZvcm1hbmNlLkhUTUxVSVBlcmZvcm1hbmNlVGVzdFN1aXRlOwotaW1wb3J0IG9yZy5lY2xpcHNlLndzdC5zc2UudWkudGVzdHMucGVyZm9ybWFuY2UuU1NFVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZTsKLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLnVpLnRlc3RzLnBlcmZvcm1hbmNlLlhNTFVJUGVyZm9ybWFuY2VUZXN0U3VpdGU7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzCi0gKiBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zCi0gKiBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQKLSAqIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICogCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotcHVibGljIGNsYXNzIE1hc3RlclBlcmZvcm1hbmNlVGVzdFN1aXRlIGV4dGVuZHMgVGVzdFN1aXRlIHsKLQotCXB1YmxpYyBNYXN0ZXJQZXJmb3JtYW5jZVRlc3RTdWl0ZSgpIHsKLQkJc3VwZXIoIkFsbCBUZXN0cyIpOwotCi0JCWFkZFRlc3QoSlNQVUlQZXJmb3JtYW5jZVRlc3RzLnN1aXRlKCkpOwotCQlhZGRUZXN0KENTU1VJUGVyZm9ybWFuY2VUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoSFRNTFVJUGVyZm9ybWFuY2VUZXN0U3VpdGUuc3VpdGUoKSk7Ci0JCWFkZFRlc3QoU1NFVUlQZXJmb3JtYW5jZVRlc3RTdWl0ZS5zdWl0ZSgpKTsKLQkJYWRkVGVzdChYTUxVSVBlcmZvcm1hbmNlVGVzdFN1aXRlLnN1aXRlKCkpOwotCi0KLQl9Ci0KLQlwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgewotCQkvLyB0aGlzIG1ldGhvZCBuZWVkcyB0byBleGlzdCwgYnV0IGRvZXNuJ3QgcmVhbGx5IGRvIGFueXRoaW5nCi0JfQotCi19CmRpZmYgLS1naXQgYS9kZXZlbG9wbWVudC9vcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy9zcmMvb3JnL2VjbGlwc2Uvd3N0L3NzZS91bml0dGVzdHMvbWlub3J0b29scy9UZXN0U3RyaW5nVXRpbHMuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmdVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDBkNWU1Li4wMDAwMDAwCi0tLSBhL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1Rlc3RTdHJpbmdVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwNCBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotcGFja2FnZSBvcmcuZWNsaXBzZS53c3Quc3NlLnVuaXR0ZXN0cy5taW5vcnRvb2xzOwotCi0KLQotcHVibGljIGNsYXNzIFRlc3RTdHJpbmdVdGlscyB7Ci0KLQkvKioKLQkgKiBUZXN0U3RyaW5nVXRpbHMgY29uc3RydWN0b3IgY29tbWVudC4KLQkgKi8KLQlwcml2YXRlIFRlc3RTdHJpbmdVdGlscygpIHsKLQkJc3VwZXIoKTsKLQl9Ci0KLQkvKioKLQkgKiBSZXBsYWNlIG1hdGNoaW5nIGxpdGVyYWwgcG9ydGlvbnMgb2YgYSBzdHJpbmcgd2l0aCBhbm90aGVyIHN0cmluZwotCSAqLwotCXB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlcGxhY2UoU3RyaW5nIGFTdHJpbmcsIFN0cmluZyBzb3VyY2UsIFN0cmluZyB0YXJnZXQpIHsKLQkJaWYgKGFTdHJpbmcgPT0gbnVsbCkKLQkJCXJldHVybiBudWxsOwotCQlTdHJpbmcgbm9ybWFsU3RyaW5nID0gIiI7IC8vJE5PTi1OTFMtMSQKLQkJaW50IGxlbmd0aCA9IGFTdHJpbmcubGVuZ3RoKCk7Ci0JCWludCBwb3NpdGlvbiA9IDA7Ci0JCWludCBwcmV2aW91cyA9IDA7Ci0JCWludCBzcGFjZXIgPSBzb3VyY2UubGVuZ3RoKCk7Ci0JCXdoaWxlIChwb3NpdGlvbiArIHNwYWNlciAtIDEgPCBsZW5ndGggJiYgYVN0cmluZy5pbmRleE9mKHNvdXJjZSwgcG9zaXRpb24pID4gLTEpIHsKLQkJCXBvc2l0aW9uID0gYVN0cmluZy5pbmRleE9mKHNvdXJjZSwgcHJldmlvdXMpOwotCQkJbm9ybWFsU3RyaW5nID0gbm9ybWFsU3RyaW5nICsgYVN0cmluZy5zdWJzdHJpbmcocHJldmlvdXMsIHBvc2l0aW9uKSArIHRhcmdldDsKLQkJCXBvc2l0aW9uICs9IHNwYWNlcjsKLQkJCXByZXZpb3VzID0gcG9zaXRpb247Ci0JCX0KLQkJbm9ybWFsU3RyaW5nID0gbm9ybWFsU3RyaW5nICsgYVN0cmluZy5zdWJzdHJpbmcocG9zaXRpb24sIGFTdHJpbmcubGVuZ3RoKCkpOwotCi0JCXJldHVybiBub3JtYWxTdHJpbmc7Ci0JfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVmVyc2lvblJlbW92ZXIuamF2YSBiL2RldmVsb3BtZW50L29yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzL3NyYy9vcmcvZWNsaXBzZS93c3Qvc3NlL3VuaXR0ZXN0cy9taW5vcnRvb2xzL1ZlcnNpb25SZW1vdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMWE2NjguLjAwMDAwMDAKLS0tIGEvZGV2ZWxvcG1lbnQvb3JnLmVjbGlwc2Uud3N0LnNzZS51bml0dGVzdHMvc3JjL29yZy9lY2xpcHNlL3dzdC9zc2UvdW5pdHRlc3RzL21pbm9ydG9vbHMvVmVyc2lvblJlbW92ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNSArMCwwIEBACi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1wYWNrYWdlIG9yZy5lY2xpcHNlLndzdC5zc2UudW5pdHRlc3RzLm1pbm9ydG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuZWNsaXBzZS53c3QueG1sLmNvcmUudGVzdHMudXRpbC5Db21tb25YTUw7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7Ci1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLWltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotCi0vKioKLSAqIE1vZGlmaWVzIHBsdWdpbi54bWwgYW5kIGZyYWdtZW50LnhtbCBmaWxlcyB0byBub3QgcmVxdWlyZSBzcGVjaWZpYyB2ZXJzaW9ucwotICogb2YgdGhlaXIgcGx1Z2luIGRlcGVuZGVuY2llcy4KLSAqIAotICogQGF1dGhvciBuaXRpbgotICovCi1wdWJsaWMgY2xhc3MgVmVyc2lvblJlbW92ZXIgewotCi0JY2hhcltdIGNoYXJidWZmID0gbmV3IGNoYXJbMjA0OF07Ci0JU3RyaW5nQnVmZmVyIHMgPSBudWxsOwotCi0JcHVibGljIFZlcnNpb25SZW1vdmVyKCkgewotCQlzdXBlcigpOwotCX0KLQotCi0KLQlwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7Ci0JCWlmIChhcmdzLmxlbmd0aCA8IDEpCi0JCQluZXcgVmVyc2lvblJlbW92ZXIoKS52aXNpdChuZXcgRmlsZSgiZDovdGFyZ2V0IikpOwotCQllbHNlCi0JCQluZXcgVmVyc2lvblJlbW92ZXIoKS52aXNpdChuZXcgRmlsZShhcmdzWzBdKSk7Ci0JfQotCi0KLQotCXByb3RlY3RlZCB2b2lkIHZpc2l0KEZpbGUgZmlsZSkgewotCQkvLyBTa2lwIGRpcmVjdG9yaWVzIGxpa2Ugb3JnLmVjbGlwc2UuKiwgb3JnLmFwYWNoZS4qLCBhbmQgb3JnLmp1bml0LioKLQkJaWYgKGZpbGUuaXNEaXJlY3RvcnkoKSAmJiAhZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmVjbGlwc2UuIikgJiYgIWZpbGUuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoIm9yZy5hcGFjaGUiKSAmJiAhZmlsZS5nZXROYW1lKCkuc3RhcnRzV2l0aCgib3JnLmp1bml0IikpIHsKLQkJCVN0cmluZ1tdIGNvbnRlbnRzID0gZmlsZS5saXN0KCk7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnRzLmxlbmd0aDsgaSsrKQotCQkJCXZpc2l0KG5ldyBGaWxlKGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAnLycgKyBjb250ZW50c1tpXSkpOwotCQl9Ci0JCWVsc2UgewotCQkJZml4dXBGaWxlKGZpbGUpOwotCQl9Ci0JfQotCi0JcHJvdGVjdGVkIHZvaWQgZml4dXBGaWxlKEZpbGUgZmlsZSkgewotCQkvLyBvbmx5IGxvYWQgYW5kIGZpeHVwIGZpbGVzIG5hbWVkIHBsdWdpbi54bWwgb3IgZnJhZ21lbnQueG1sIHVuZGVyIGVjbGlwc2VccGx1Z2luc1xYWFhYWFhYLioKLQkJaWYgKCEoZmlsZS5nZXROYW1lKCkuZXF1YWxzSWdub3JlQ2FzZSgicGx1Z2luLnhtbCIpIHx8IGZpbGUuZ2V0TmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImZyYWdtZW50LnhtbCIpKSB8fCBmaWxlLmdldEFic29sdXRlUGF0aCgpLmluZGV4T2YoImVjbGlwc2VcXHBsdWdpbnNcXFhYWFhYWFguIikgPT0gLTEpCi0JCQlyZXR1cm47Ci0JCS8vCQlTeXN0ZW0ub3V0LnByaW50bG4oZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7Ci0JCXRyeSB7Ci0JCQlEb2N1bWVudCBkb2MgPSBDb21tb25YTUwuZ2V0RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UoZmlsZSk7Ci0JCQlOb2RlTGlzdCBpbXBvcnRzID0gbnVsbDsKLQkJCWlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJwbHVnaW4ueG1sIikpCi0JCQkJaW1wb3J0cyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW1wb3J0Iik7Ci0JCQllbHNlIGlmIChmaWxlLmdldE5hbWUoKS5lcXVhbHNJZ25vcmVDYXNlKCJmcmFnbWVudC54bWwiKSkKLQkJCQlpbXBvcnRzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJmcmFnbWVudCIpOwotCQkJYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0JCQlmb3IgKGludCBpID0gMDsgaSA8IGltcG9ydHMuZ2V0TGVuZ3RoKCk7IGkrKykgewotCQkJCU5vZGUgaW1wb3J0Tm9kZSA9IGltcG9ydHMuaXRlbShpKTsKLQkJCQlpZiAoaW1wb3J0Tm9kZS5nZXROb2RlTmFtZSgpLmVxdWFsc0lnbm9yZUNhc2UoImltcG9ydCIpICYmIGltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgidmVyc2lvbiIpICE9IG51bGwpIHsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpLnJlbW92ZU5hbWVkSXRlbSgidmVyc2lvbiIpOwotCQkJCX0KLQkJCQlpZiAoaW1wb3J0Tm9kZS5nZXRBdHRyaWJ1dGVzKCkuZ2V0TmFtZWRJdGVtKCJwbHVnaW4tdmVyc2lvbiIpICE9IG51bGwpIHsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJCWltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpLnJlbW92ZU5hbWVkSXRlbSgicGx1Z2luLXZlcnNpb24iKTsKLQkJCQl9Ci0JCQkJaWYgKGltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpLmdldE5hbWVkSXRlbSgibWF0Y2giKSAhPSBudWxsKSB7Ci0JCQkJCWltcG9ydE5vZGUuZ2V0QXR0cmlidXRlcygpLnJlbW92ZU5hbWVkSXRlbSgibWF0Y2giKTsKLQkJCQkJY2hhbmdlZCA9IHRydWU7Ci0JCQkJfQotCQkJfQotCQkJaWYgKGNoYW5nZWQpIHsKLQkJCQlGaWxlT3V0cHV0U3RyZWFtIG9zdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlLmdldEFic29sdXRlUGF0aCgpKTsKLQkJCQlDb21tb25YTUwuc2VyaWFsaXplKGRvYywgb3N0cmVhbSk7Ci0JCQkJb3N0cmVhbS5jbG9zZSgpOwotCQkJCVN5c3RlbS5vdXQucHJpbnRsbigiTW9kaWZpZWQgIiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotCQkJfQotCQl9Ci0JCWNhdGNoIChTQVhFeGNlcHRpb24gZSkgewotCQkJU3lzdGVtLmVyci5wcmludGxuKGZpbGUuZ2V0UGF0aCgpICsgIjogIiArIGUpOwotCQl9Ci0JCWNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0JCQlTeXN0ZW0uZXJyLnByaW50bG4oZmlsZS5nZXRQYXRoKCkgKyAiOiAiICsgZSk7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiZTFiYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWMxZmVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0VkaXRvckpzcENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0ianNwZjEwMDAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB2YWx1ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdHM6Ci0tICA8Yj5DaGFyYWN0ZXIgY29kZTo8L2I+IFNwZWNpZmllcyB0aGUgcGFnZSBkaXJlY3RpdmUncyBwYWdlRW5jb2RpbmcgdmFsdWUgYW5kIGNvbnRlbnRUeXBlIGNoYXJzZXQuIEluIEhUTUwgZG9jdW1lbnRzLCB0aGlzIHZhbHVlIGlzIGFsc28gdXNlZCBmb3IgdGhlICZsdDtNRVRBJmd0OyB0YWcncyBjaGFyc2V0IHByb3BlcnR5LgotLSAgPGI+TGFuZ3VhZ2U6PC9iPiBTcGVjaWZpZXMgdGhlIHBhZ2UgZGlyZWN0aXZlJ3MgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCi0tICA8Yj5Db250ZW50IFR5cGU6PC9iPiBTcGVjaWZpZXMgdGhlIGNvbnRlbnRUeXBlJ3MgVFlQRSB2YWx1ZSBmb3IgdGhlIHBhZ2UgZGlyZWN0aXZlLiBJbiBIVE1MIGRvY3VtZW50cywgdGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgZm9yIHRoZSAmbHQ7TUVUQSZndDsgdGFnJ3MgY29udGVudCBwcm9wZXJ0eS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJqc3ByMDAxMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPlJlbmFtZSBSZXNvdXJjZTwvYj4gZGlhbG9nLCBpZiBhcHBsaWNhYmxlLCB3aGljaCBsZXRzIHlvdSByZW5hbWUgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBKYXZhIGVsZW1lbnQgYW5kIHJlZmVyZW5jZXMgdG8gdGhhdCBlbGVtZW50LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNvdXJjZSBjb2RlIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9ImpzcHIwMDIwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+TW92ZTwvYj4gZGlhbG9nLCBpZiBhcHBsaWNhYmxlLCB3aGljaCBsZXRzIHlvdSBtb3ZlIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50LiBGb3IgZXhhbXBsZSwgeW91IGNhbiBtb3ZlIGEgbWV0aG9kIGZyb20gb25lIGNsYXNzIHRvIGFub3RoZXIuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTb3VyY2UgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgc291cmNlIGNvZGUgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZS4KLQotVmFyaW91cyBkZXZlbG9wbWVudCBwbGF0Zm9ybXMgdXNlIGRpZmZlcmVudCBsaW5lIGRlbGltaXRlcnMgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgbmV3IGxpbmUuIFNlbGVjdCB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IGNvcnJlc3BvbmRzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybS4KLTxiPk5vdGU6PC9iPiBUaGlzIGRlbGltaXRlciB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIGFueSBkb2N1bWVudHMgdGhhdCBjdXJyZW50bHkgZXhpc3QuIEl0IHdpbGwgYmUgYWRkZWQgb25seSB0byBkb2N1bWVudHMgdGhhdCB5b3UgY3JlYXRlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPiwgb3IgdG8gZXhpc3RpbmcgZmlsZXMgdGhhdCB5b3Ugb3BlbiBhbmQgdGhlbiByZXNhdmUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LgotCi1UaGUgZW5jb2RpbmcgYXR0cmlidXRlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2V0IHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIEpTUCBmaWxlcy4gIENoYW5naW5nIHRoZSBlbmNvZGluZyBjYXVzZXMgYW55IG5ldyBKU1AgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDUxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nIHRoYXQgdGhlIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLiIKLQotVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQotVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBwdXNoIGJ1dHRvbnMgb3BlbiA8Yj5Db2xvcjwvYj4gZGlhbG9nIGJveGVzIHRoYXQgbGV0IHlvdSBzcGVjaWZ5IHRleHQgZm9yZWdyb3VuZCBhbmQgYmFja2dyb3VuZCBjb2xvcnMsIHJlc3BlY3RpdmVseS4gU2VsZWN0IHRoZSA8Yj5Cb2xkPC9iPiBjaGVjayBib3ggdG8gbWFrZSB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgdHlwZSBhcHBlYXIgaW4gYm9sZC4KLQotQ2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdDwvYj4gcHVzaCBidXR0b24gdG8gc2V0IHRoZSBoaWdobGlnaHRpbmcgc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MiI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGNyZWF0ZSBuZXcgYW5kIGVkaXQgZXhpc3RpbmcgdGVtcGxhdGVzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGVkaXQgYSBKU1AgZmlsZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDUwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+Q2xlYW51cDwvYj4gZGlhbG9nLCB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkIGFuZCBmb3JtYXR0ZWQuIENsZWFudXAgaW5jbHVkZXMgc3VjaCBhY3Rpdml0aWVzIGFzIGluc2VydGluZyBtaXNzaW5nIHRhZ3MsIGFkZGluZyBxdW90YXRpb24gbWFya3MgYXJvdW5kIGF0dHJpYnV0ZSB2YWx1ZXMsIG5vZGUgY2FwaXRhbGl6YXRpb24sIGFuZCBmb3JtYXR0aW5nIGEgZG9jdW1lbnQuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMyLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0VkaXRvckpzcENvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MDgzNWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvRWRpdG9ySnNwQ29udGV4dHMyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0ianNwc291cmNlX3NvdXJjZV9IZWxwSWQiPgotPGRlc2NyaXB0aW9uPlRoZSBKU1Agc291cmNlIHBhZ2UgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBKYXZhU2VydmVyIFBhZ2VzIGZpbGUuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbCIvPgotPHRvcGljIGxhYmVsPSJNYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQIGZpbGVzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9ImpzcGYxMDAwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdmFsdWVzIGZvciB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0aGUgZHJvcC1kb3duIGxpc3RzOgotLSAgPGI+Q2hhcmFjdGVyIGNvZGU6PC9iPiBTcGVjaWZpZXMgdGhlIHBhZ2UgZGlyZWN0aXZlJ3MgcGFnZUVuY29kaW5nIHZhbHVlIGFuZCBjb250ZW50VHlwZSBjaGFyc2V0LiBJbiBIVE1MIGRvY3VtZW50cywgdGhpcyB2YWx1ZSBpcyBhbHNvIHVzZWQgZm9yIHRoZSAmbHQ7TUVUQSZndDsgdGFnJ3MgY2hhcnNldCBwcm9wZXJ0eS4KLS0gIDxiPkxhbmd1YWdlOjwvYj4gU3BlY2lmaWVzIHRoZSBwYWdlIGRpcmVjdGl2ZSdzIHByb2dyYW1taW5nIGxhbmd1YWdlLgotLSAgPGI+Q29udGVudCBUeXBlOjwvYj4gU3BlY2lmaWVzIHRoZSBjb250ZW50VHlwZSdzIFRZUEUgdmFsdWUgZm9yIHRoZSBwYWdlIGRpcmVjdGl2ZS4gSW4gSFRNTCBkb2N1bWVudHMsIHRoaXMgdmFsdWUgaXMgYWxzbyB1c2VkIGZvciB0aGUgJmx0O01FVEEmZ3Q7IHRhZydzIGNvbnRlbnQgcHJvcGVydHkuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ianNwcjAwMTAiPgotPGRlc2NyaXB0aW9uPlNlbGVjdCB0aGlzIG9wdGlvbiB0byBvcGVuIHRoZSA8Yj5SZWZhY3RvciBSZW5hbWU8L2I+IGRpYWxvZywgaWYgYXBwbGljYWJsZSwgd2hpY2ggbGV0cyB5b3UgcmVuYW1lIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgSmF2YSBlbGVtZW50IGFuZCByZWZlcmVuY2VzIHRvIHRoYXQgZWxlbWVudC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNvdXJjZSBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBzb3VyY2UgY29kZSAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJqc3ByMDAyMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPlJlZmFjdG9yIE1vdmU8L2I+IGRpYWxvZywgaWYgYXBwbGljYWJsZSwgd2hpY2ggbGV0cyB5b3UgbW92ZSB0aGUgY3VycmVudGx5IHNlbGVjdGVkIEphdmEgZWxlbWVudC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gbW92ZSBhIG1ldGhvZCBmcm9tIG9uZSBjbGFzcyB0byBhbm90aGVyLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU291cmNlIGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNvdXJjZSBjb2RlIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwNTAiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGUuCi0KLVZhcmlvdXMgZGV2ZWxvcG1lbnQgcGxhdGZvcm1zIHVzZSBkaWZmZXJlbnQgbGluZSBkZWxpbWl0ZXJzIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBhIG5ldyBsaW5lLiBTZWxlY3QgdGhlIG9wZXJhdGluZyBzeXN0ZW0gdGhhdCBjb3JyZXNwb25kcyB0byB5b3VyIGRldmVsb3BtZW50IG9yIGRlcGxveW1lbnQgcGxhdGZvcm0uCi08Yj5Ob3RlOjwvYj4gVGhpcyBkZWxpbWl0ZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBhbnkgZG9jdW1lbnRzIHRoYXQgY3VycmVudGx5IGV4aXN0LiBJdCB3aWxsIGJlIGFkZGVkIG9ubHkgdG8gZG9jdW1lbnRzIHRoYXQgeW91IGNyZWF0ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4sIG9yIHRvIGV4aXN0aW5nIGZpbGVzIHRoYXQgeW91IG9wZW4gYW5kIHRoZW4gcmVzYXZlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPi4KLQotVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBKU1AgZmlsZXMuICBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcgSlNQIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgZnJvbSBzY3JhdGNoIHRvIHVzZSB0aGUgc2VsZWN0ZWQgZW5jb2RpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA1MSI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS4iCi0KLVRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IGZpZWxkIGNvbnRhaW5zIGEgbGlzdCBvZiBhbGwgdGhlIHNvdXJjZSB0eXBlcyB0aGF0IHlvdSBjYW4gc2VsZWN0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBlaXRoZXIgc2VsZWN0IHRoZSBjb250ZW50IHR5cGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggZnJvbSB0aGUgZHJvcC1kb3duIGxpc3QsIG9yIGNsaWNrIHRleHQgaW4gdGhlIHRleHQgc2FtcGxlIHdpbmRvdyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBjb250ZW50IHR5cGUgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGNoYW5nZSB0aGUgdGV4dCBoaWdobGlnaHRpbmcuCi0KLVRoZSA8Yj5Gb3JlZ3JvdW5kPC9iPiBhbmQgPGI+QmFja2dyb3VuZDwvYj4gcHVzaCBidXR0b25zIG9wZW4gPGI+Q29sb3I8L2I+IGRpYWxvZyBib3hlcyB0aGF0IGxldCB5b3Ugc3BlY2lmeSB0ZXh0IGZvcmVncm91bmQgYW5kIGJhY2tncm91bmQgY29sb3JzLCByZXNwZWN0aXZlbHkuIFNlbGVjdCB0aGUgPGI+Qm9sZDwvYj4gY2hlY2sgYm94IHRvIG1ha2UgdGhlIHNwZWNpZmllZCBjb250ZW50IHR5cGUgYXBwZWFyIGluIGJvbGQuCi0KLUNsaWNrIHRoZSA8Yj5SZXN0b3JlIERlZmF1bHQ8L2I+IHB1c2ggYnV0dG9uIHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VieDAwNTIiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjcmVhdGUgbmV3IGFuZCBlZGl0IGV4aXN0aW5nIHRlbXBsYXRlcyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBlZGl0IGEgSlNQIGZpbGUuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTA1MCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIG9wZW4gdGhlIDxiPkNsZWFudXA8L2I+IGRpYWxvZywgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZCBhbmQgZm9ybWF0dGVkLiBDbGVhbnVwIGluY2x1ZGVzIHN1Y2ggYWN0aXZpdGllcyBhcyBpbnNlcnRpbmcgbWlzc2luZyB0YWdzLCBhZGRpbmcgcXVvdGF0aW9uIG1hcmtzIGFyb3VuZCBhdHRyaWJ1dGUgdmFsdWVzLCBub2RlIGNhcGl0YWxpemF0aW9uLCBhbmQgZm9ybWF0dGluZyBhIGRvY3VtZW50LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0pzcFdpekNvbnRleHRzLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL0pzcFdpekNvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQwODVlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9Kc3BXaXpDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotCTxjb250ZXh0IGlkPSJqc3B3MDAxMCI+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVNlbGVjdCB0aGUgSlNQIHRlbXBsYXRlIGNoZWNrYm94IHRvIGNyZWF0ZSB5b3VyIEpTUCBmaWxlIGJhc2VkIG9uIGEgZGVmYXVsdCB0ZW1wbGF0ZS4gWW91IGNhbiBjaG9vc2UgdG8gaGF2ZSB5b3VyIEpTUCBjcmVhdGVkIHdpdGggSFRNTCwgWEhUTUwsIG9yIFhIVE1MIHdpdGggWE1MIG1hcmt1cC4gSWYgeW91IGRvIG5vdCBzZWxlY3QgYSB0ZW1wbGF0ZSwgeW91ciBuZXdseSBjcmVhdGVkIEpTUCBmaWxlIHdpbGwgYmUgY29tcGxldGVseSBibGFuay4KLQkJPC9kZXNjcmlwdGlvbj4KLQk8L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdjMDdiMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJVBsdWdpbi5uYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJUJ1bmRsZS1WZW5kb3IuMAotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzY2I2YzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IEVkaXRvckpzcENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBFZGl0b3JKc3BDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIEVkaXRvckpzcENvbnRleHRzMi54bWwsXAotICAgICAgICAgICAgICAgRWRpdG9ySnNwQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS5qc3QuanNwLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM4YzQ0ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotIyBOTFNfTUVTU0FHRUZPUk1BVF9WQVIKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFRyYW5zbGF0aW9uIEluc3RydWN0aW9uOiBzZWN0aW9uIHRvIGJlIHRyYW5zbGF0ZWQKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1QbHVnaW4ubmFtZSA9IEpTUCB0b29scyBpbmZvcG9wcwotCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLmpzdC5qc3AudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDFiMTE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2UuanN0LmpzcC51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMSI/PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySnNwQ29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySnNwQ29udGV4dHMyLnhtbCIgcGx1Z2luPSJvcmcuZWNsaXBzZS5qc3QuanNwLmNvcmUiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iSnNwV2l6Q29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLmpzdC5qc3AudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNjODQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyXzEuMC4wLmphcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRjNzViOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZDZkYWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDMucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcHJvdmlkZXJOYW1lCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KLUVjbGlwc2UtTGF6eVN0YXJ0OiB0cnVlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYm9vay5jc3MgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ib29rLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMjU1My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9ib29rLmNzcworKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi1AaW1wb3J0ICIuLi9QUk9EVUNUX1BMVUdJTi9ib29rLmNzcyI7Ci0KLVAuQ29kZSB7Ci0JZGlzcGxheTogYmxvY2s7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl0ZXh0LWluZGVudDogMC4wMHB0OwotCW1hcmdpbi10b3A6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4wMDAwMDBwdDsKLQltYXJnaW4tcmlnaHQ6IDAuMDAwMDAwcHQ7Ci0JbWFyZ2luLWxlZnQ6IDE1cHQ7Ci0JZm9udC1zaXplOiAxMC4wMDAwMDBwdDsKLQlmb250LXdlaWdodDogbWVkaXVtOwotCWZvbnQtc3R5bGU6IFJlZ3VsYXI7Ci0JY29sb3I6ICM0NDQ0Q0M7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkNvdXJpZXIgTmV3IjsKLX0KLQotSDYuQ2FwdGlvbkZpZ0NvbHVtbiB7Ci0JZGlzcGxheTogYmxvY2s7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQl0ZXh0LWluZGVudDogMC4wMDAwMDBwdDsKLQltYXJnaW4tdG9wOiAzLjAwMDAwMHB0OwotCW1hcmdpbi1ib3R0b206IDExLjAwMDAwMHB0OwotCW1hcmdpbi1yaWdodDogMC4wMDAwMDBwdDsKLQltYXJnaW4tbGVmdDogMC4wMDAwMDBwdDsKLQlmb250LXNpemU6IDkuMDAwMDAwcHQ7Ci0JZm9udC13ZWlnaHQ6IG1lZGl1bTsKLQlmb250LXN0eWxlOiBJdGFsaWM7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkFyaWFsIjsKLX0KLQotUC5Ob3RlIHsKLQlkaXNwbGF5OiBibG9jazsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCXRleHQtaW5kZW50OiAwcHQ7Ci0JbWFyZ2luLXRvcDogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLWJvdHRvbTogMTkuNTAwMDAwcHQ7Ci0JbWFyZ2luLXJpZ2h0OiAwLjAwMDAwMHB0OwotCW1hcmdpbi1sZWZ0OiAzMHB0OwotCWZvbnQtc2l6ZTogMTEuMDAwMDAwcHQ7Ci0JZm9udC13ZWlnaHQ6IG1lZGl1bTsKLQlmb250LXN0eWxlOiBJdGFsaWM7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCXZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsKLQl0ZXh0LXRyYW5zZm9ybTogbm9uZTsKLQlmb250LWZhbWlseTogIkFyaWFsIjsKLX0KLQotRU0uVUlMYWJlbCB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JZm9udC1zdHlsZTogUmVndWxhcjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotfQotCi1FTS5Db2RlTmFtZSB7Ci0JZm9udC13ZWlnaHQ6IEJvbGQ7Ci0JZm9udC1zdHlsZTogUmVndWxhcjsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JdmVydGljYWwtYWxpZ246IGJhc2VsaW5lOwotCXRleHQtdHJhbnNmb3JtOiBub25lOwotCWZvbnQtZmFtaWx5OiAiQ291cmllciBOZXciOwotfQotCi0vKiBmb2xsb3dpbmcgZm9udCBmYWNlIGRlY2xhcmF0aW9ucyBuZWVkIHRvIGJlIHJlbW92ZWQgZm9yIERCQ1MgKi8KLWJvZHksaDEsaDIsaDMsaDQsaDUsaDYscCx0YWJsZSx0ZCxjYXB0aW9uLHRoLHVsLG9sLGRsLGxpLGRkLGR0IHsKLQlmb250LWZhbWlseTogQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKLQljb2xvcjogIzAwMDAwMAotfQotCi1wcmUgewotCWZvbnQtZmFtaWx5OiBDb3VyaWVyLCBtb25vc3BhY2UKLX0KLQotLyogZW5kIGZvbnQgZmFjZSBkZWNsYXJhdGlvbnMgKi8KLQkvKiBmb2xsb3dpbmcgZm9udCBzaXplIGRlY2xhcmF0aW9ucyBzaG91bGQgYmUgT0sgZm9yIERCQ1MgKi8KLWJvZHksaDEsaDIsaDMsaDQsaDUsaDYscCx0YWJsZSx0ZCxjYXB0aW9uLHRoLHVsLG9sLGRsLGxpLGRkLGR0IHsKLQlmb250LXNpemU6IDEwcHQ7Ci19Ci0KLXByZSB7Ci0JZm9udC1zaXplOiAxMHB0Ci19Ci0KLS8qIGVuZCBmb250IHNpemUgZGVjbGFyYXRpb25zICovCi1ib2R5IHsKLQliYWNrZ3JvdW5kOiAjRkZGRkZGCi19Ci0KLWgxIHsKLQlmb250LXNpemU6IDE4cHQ7Ci0JbWFyZ2luLXRvcDogNTsKLQltYXJnaW4tYm90dG9tOiAxCi19Ci0KLWgyIHsKLQlmb250LXNpemU6IDE0cHQ7Ci0JbWFyZ2luLXRvcDogMjU7Ci0JbWFyZ2luLWJvdHRvbTogMwotfQotCi1oMyB7Ci0JZm9udC1zaXplOiAxMXB0OwotCW1hcmdpbi10b3A6IDIwOwotCW1hcmdpbi1ib3R0b206IDMKLX0KLQotaDQgewotCWZvbnQtc2l6ZTogMTBwdDsKLQltYXJnaW4tdG9wOiAyMDsKLQltYXJnaW4tYm90dG9tOiAzOwotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi1wIHsKLQltYXJnaW4tdG9wOiAxMHB4OwotCW1hcmdpbi1ib3R0b206IDEwcHgKLX0KLQotcHJlIHsKLQltYXJnaW4tbGVmdDogNjsKLQlmb250LXNpemU6IDlwdAotfQotCi1hOmxpbmsgewotCWNvbG9yOiAjMDAwMEZGCi19Ci0KLWE6aG92ZXIgewotCWNvbG9yOiAjMDAwMDgwCi19Ci0KLWE6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUKLX0KLQotdWwgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotbGkgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMAotfQotCi1saSBwIHsKLQltYXJnaW4tdG9wOiAwOwotCW1hcmdpbi1ib3R0b206IDAKLX0KLQotb2wgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotZGwgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMTAKLX0KLQotZHQgewotCW1hcmdpbi10b3A6IDA7Ci0JbWFyZ2luLWJvdHRvbTogMDsKLQlmb250LXdlaWdodDogYm9sZAotfQotCi1kZCB7Ci0JbWFyZ2luLXRvcDogMDsKLQltYXJnaW4tYm90dG9tOiAwCi19Ci0KLXN0cm9uZyB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQKLX0KLQotZW0gewotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi12YXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYwotfQotCi1kaXYucmV2aXNpb24gewotCWJvcmRlci1sZWZ0LXN0eWxlOiBzb2xpZDsKLQlib3JkZXItbGVmdC13aWR0aDogdGhpbjsKLQlib3JkZXItbGVmdC1jb2xvcjogIzdCNjhFRTsKLQlwYWRkaW5nLWxlZnQ6IDUKLX0KLQotdGggewotCWZvbnQtd2VpZ2h0OiBib2xkCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkMjcwZTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgY29tbW9uLmNzcyxcCi0gICAgICAgICAgICAgICBjb21tb25sdHIuY3NzLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIG5vdGljZXMuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvYy54bWwsXAotICAgICAgICAgICAgICAgdG9waWNzLyxcCi0gICAgICAgICAgICAgICBib29rLmNzcyxcCi0gICAgICAgICAgICAgICBjb21tb25ydGwuY3NzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY0ZjNmMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTE5NyArMCwwIEBACi1ib2R5IHsKLQlmb250LWZhbWlseTogQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjhlbTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotCWNvbG9yOiBCbGFjazsKLQltYXJnaW4tcmlnaHQ6IDVlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5pYm1maWxlcGF0aCB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEwMCU7Ci19Ci0KLS5pYm1jb21tYW5kIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmlibWVtcGhhc2lzIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5tdiwucGssLnBrZGVmLC5wdiB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEwMCU7Ci0JcGFkZGluZy10b3A6IDBlbTsKLQlwYWRkaW5nLXJpZ2h0OiAuM2VtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci0JcGFkZGluZy1sZWZ0OiAuM2VtOwotfQotCi10dCxzYW1wIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotQk9EWS5uYXYgewotCWJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSByaWRnZSBibGFjazsKLQlmb250LXNpemU6IDAuOTVlbTsKLX0KLQotLmJhc2UgewotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtdmFyaWFudDogbm9ybWFsOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwotfQotCi1UQUJMRSB7Ci0JY29sb3I6IGJsYWNrOwotCXdpZHRoOiA5MCU7Ci0JYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKLQlib3JkZXItY29sb3I6IEJsYWNrOwotCWJhY2tncm91bmQ6IHdoaXRlOwotCW1hcmdpbi10b3A6IDAuNWVtOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCW1hcmdpbi1sZWZ0OiAwZW07Ci0JbWFyZ2luLXJpZ2h0OiAwZW07Ci19Ci0KLS50YmxkZXNjIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLVRIIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuN2VtOwotCWNvbG9yOiBibGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4zZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy1yaWdodDogMWVtOwotfQotCi1USC5iYXNlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogYmxhY2s7Ci0JYm9yZGVyOiAxIHNvbGlkICM2MDYwNjA7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RjZGFkYTsKLQlwYWRkaW5nLXRvcDogMC42NWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjY1ZW07Ci0JcGFkZGluZy1sZWZ0OiAxZW07Ci0JcGFkZGluZy1yaWdodDogMWVtOwotfQotCi1URCB7Ci0JZm9udC1zaXplOiAwLjdlbTsKLQljb2xvcjogYmxhY2s7Ci0JYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjNlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLUNJVEUgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotRU0gewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotU1RST05HIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotY2FwdGlvbiB7Ci0JdGV4dC1hbGlnbjogbGVmdDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLURUIHsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLX0KLQotREQgewotCW1hcmdpbi1sZWZ0OiAxLjBlbTsKLX0KLQotUFJFLHByZS5jZ3JhcGhpYyB7Ci0JZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKLQlmb250LXNpemU6IDEycHg7Ci0JYmFja2dyb3VuZC1jb2xvcjogI2RhZGFkYTsKLQlwYWRkaW5nOiA1cHg7Ci19Ci0KLS5pdGFsaWMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmJvbGQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udW5kZXJsaW5lZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLWl0YWxpYywuYm9sZEl0YWxpYyB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uc21hbGxDYXBzLC5zbWFsbGNhcHMgewotCXRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7Ci0JZm9udC1zaXplOiBzbWFsbGVyOwotCWZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKLX0KLQotLml0YWxpYy11bmRlcmxpbmVkIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLXVuZGVybGluZWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uYm9sZC1pdGFsaWMtdW5kZXJsaW5lZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uc21hbGxjYXBzLXVuZGVybGluZWQgewotCWZvbnQtdmFyaWFudDogc21hbGwtY2FwczsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmVtcGhhc2lzIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5pbmxpbmVkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLnNpZGViYXIgewotCWJhY2tncm91bmQ6ICNjY2NjY2M7Ci19Ci0KLUE6bGluayB7Ci0JY29sb3I6ICMwMDY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLUE6dmlzaXRlZCB7Ci0JY29sb3I6ICM5OTY2OTk7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLUE6YWN0aXZlIHsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTpob3ZlciB7Ci0JY29sb3I6ICM5OTY2OTk7OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLnRvY2xpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRvY2xpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEucHRvY2xpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOmFjdGl2ZSB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5wdG9jbGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuaW5kZXhsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLmZpZ3VyZWxpc3Q6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmZpZ3VyZWxpc3Q6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDp2aXNpdGVkIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEudGFibGVsaXN0OmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudGFibGVsaXN0OnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1hLmJvbGRncmV5bGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotYS5ib2xkZ3JleWxpbms6aG92ZXIgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi0ucnVubmluZ2hlYWRlciB7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtc2l6ZTogMC43ZW07Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjdlbTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTpsaW5rIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6YWN0aXZlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6dmlzaXRlZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6ICMwMDAwMDA7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmhvdmVyIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotI2JyZWFkY3J1bWIsLmJyZWFkY3J1bWIsc3Bhbi5icmVhZGNydW1icyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci19Ci0KLS5mYXN0cGF0aCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmZhc3RwYXRodGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0udG9jIHsKLQlmb250LXNpemU6IHNtYWxsOwotfQotCi0ubmVzdGVkMCB7Ci0JbWFyZ2luLXRvcDogMGVtOwotfQotCi0ucCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotfQotCi1zcGFuLmZpZ2NhcCB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLmZpZ2Rlc2MgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LmZpZ2JveCB7Ci0JCi19Ci0KLWRpdi5maWdydWxlcyB7Ci0JCi19Ci0KLWRpdi5maWdub25lIHsKLQkKLX0KLQotLmZpZ25vbmUgewotCQotfQotCi0uZmlnYm9yZGVyIHsKLQkKLX0KLQotLmZpZ3NpZGVzIHsKLQkKLX0KLQotLmZpZ3RvcCB7Ci0JCi19Ci0KLS5maWdib3R0b20gewotCQotfQotCi0uZmlndG9wYm90IHsKLQkKLX0KLQotLnBhcmVudGxpbmsgewotCQotfQotCi0ucHJldmxpbmsgewotCQotfQotCi0ubmV4dGxpbmsgewotCQotfQotCi0ucmVsY29uY2VwdHNoZCB7Ci0JCi19Ci0KLS5yZWx0YXNrc2hkIHsKLQkKLX0KLQotLnJlbHJlZmhkIHsKLQkKLX0KLQotLnN5bm5vbmUgewotCQotfQotCi0uc3luYm9yZGVyIHsKLQkKLX0KLQotLnN5bnNpZGVzIHsKLQkKLX0KLQotLnN5bnRvcCB7Ci0JCi19Ci0KLS5zeW5ib3R0b20gewotCQotfQotCi0uc3ludG9wYm90IHsKLQkKLX0KLQotLnNraXAgewotCW1hcmdpbi10b3A6IDFlbTsKLX0KLQotLnNraXBzcGFjZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnVsY2hpbGRsaW5rIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ub2xjaGlsZGxpbmsgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLXVsLG9sIHsKLQltYXJnaW4tdG9wOiAwLjFlbTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci19Ci0KLXVsLnNpbXBsZSB7Ci0JbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotCi11bC5pbmRleGxpc3QgewotCWxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKLX0KLQotT0wgTEkgewotCW1hcmdpbi10b3A6IDAuMGVtOwotCW1hcmdpbi1ib3R0b206IDAuMGVtOwotCW1hcmdpbi1sZWZ0OiAwLjBlbTsKLX0KLQotVUwgTEkgewotCW1hcmdpbi10b3A6IDAuMGVtOwotCW1hcmdpbi1ib3R0b206IDAuMGVtOwotCW1hcmdpbi1sZWZ0OiAwLjBlbTsKLX0KLQotT0wgTEkgRElWIFAgewotCWxpc3Qtc3R5bGUtdHlwZTogZGVjaW1hbDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotVUwgTEkgRElWIFAgewotCWxpc3Qtc3R5bGUtdHlwZTogZGlzYzsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotKiBbY29tcGFjdD0ieWVzIl0+bGkgewotCW1hcmdpbi10b3A6IDAgZW07Ci19Ci0KLSogW2NvbXBhY3Q9Im5vIl0+bGkgewotCW1hcmdpbi10b3A6IDAuNWVtOwotfQotCi1ociB7Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCW1hcmdpbi10b3A6IDBlbTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctYm90dG9tOiAwZW07Ci0Jd2lkdGg6IDkwJTsKLQljb2xvcjogI2NjY2NjYzsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLUgxLC50aXRsZSwucGFnZXRpdGxlLC50b3BpY3RpdGxlMSB7Ci0JZm9udC1zaXplOiAxLjVlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0Jd29yZC1zcGFjaW5nOiAwLjFlbTsKLX0KLQotSDIsLnN1YnRpdGxlLC5wYWdlc3VidGl0bGUsLnRvcGljdGl0bGUyIHsKLQlmb250LXNpemU6IDEuMjVlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMGVtOwotfQotCi1IMywuYm9sZHRpdGxlLC50b3BpY3RpdGxlMyB7Ci0JZm9udC1zaXplOiAxLjBlbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMWVtOwotfQotCi1INCwudG9waWN0aXRsZTQgewotCWZvbnQtc2l6ZTogMC45ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjFlbTsKLX0KLQotaDUsLnRvcGljdGl0bGU1IHsKLQlmb250LXNpemU6IDAuOGVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLX0KLQotaDYsLnRvcGljdGl0bGU2IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLX0KLQotZGl2LmhlYWR0aXRsZSB7Ci0JZm9udC1zaXplOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLX0KLQotZGl2LmhlYWQwIHsKLQlmb250LXNpemU6IDAuOWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAwZW07Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci19Ci0KLWRpdi5oZWFkMSB7Ci0JZm9udC1zaXplOiAwLjhlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMWVtOwotCXBhZGRpbmctdG9wOiAwLjVlbTsKLX0KLQotZGl2LmhlYWQyIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2LmhlYWQzIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotZGl2LmhlYWQ0IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDRlbTsKLX0KLQotZGl2LmhlYWQ1IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDVlbTsKLX0KLQotZGl2LmhlYWQ2IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDZlbTsKLX0KLQotZGl2LmhlYWQ3IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDdlbTsKLX0KLQotZGl2LmhlYWQ4IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDhlbTsKLX0KLQotZGl2LmhlYWQ5IHsKLQlmb250LXNpemU6IDAuN2VtOwotCWZvbnQtd2VpZ2h0OiBub3JtYWw7Ci0JbWFyZ2luLWxlZnQ6IDllbTsKLX0KLQotLnRpcCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnRpcHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmZpcnN0Y29sIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnB0b2NIMSB7Ci0JZm9udC1zaXplOiB4LXNtYWxsOwotfQotCi0ucHRvY0gyIHsKLQlmb250LXNpemU6IHgtc21hbGw7Ci19Ci0KLS5zdGl0bGUgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLm50ZSB7Ci0JCi19Ci0KLS54eGxpbmVzIHsKLQl3aGl0ZS1zcGFjZTogcHJlOwotCWZvbnQtc2l6ZTogMC45NWVtOwotfQotCi0uc2VjdGlvbnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMGVtOwotCWNvbG9yOiBibGFjazsKLQlmb250LXNpemU6IDEuMmVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYuaW1hZ2VsZWZ0IHsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotfQotCi1kaXYuaW1hZ2VjZW50ZXIgewotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2LmltYWdlcmlnaHQgewotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1kaXYuaW1hZ2VqdXN0aWZ5IHsKLQl0ZXh0LWFsaWduOiBqdXN0aWZ5OwotfQotCi1kaXYubW1vYmogewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYubW1vYmpsZWZ0IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLWRpdi5tbW9iamNlbnRlciB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5tbW9ianJpZ2h0IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IHJpZ2h0OwotfQotCi1wcmUuc2NyZWVuIHsKLQlwYWRkaW5nOiAxZW0gMWVtIDFlbSAxZW07Ci0JbWFyZ2luLXRvcDogMC40ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC40ZW07Ci0JYm9yZGVyOiB0aGluIHNvbGlkIEJsYWNrOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotLnByZXJlcSB7Ci0JbWFyZ2luLWxlZnQ6IDEuNWVtOwotfQotCi0uZGVmTGlzdEhlYWQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLm12IHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ubWQgewotCXRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwotfQotCi0ucGssc3Bhbi5wayB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ucGtkZWYgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLnB2IHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ucHZkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotc3Bhbi5rd2QgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLmtkd2RlZiB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5wYXJtTGlzdEt3ZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5wYXJtTGlzdFZhciB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1zcGFuLm9wZXIgewotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLX0KLQotc3Bhbi5vcGVyZGVmIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotVkFSLHNwYW4udmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4udmFyZGVmIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWRpdi5tc2cgewotCXBhZGRpbmc6IDAuMmVtIDFlbSAxZW0gMWVtOwotCW1hcmdpbi10b3A6IDAuNGVtOwotCW1hcmdpbi1ib3R0b206IDAuNGVtOwotfQotCi1kaXYubXNnbnVtIHsKLQlmbG9hdDogbGVmdDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JbWFyZ2luLXJpZ2h0OiAxZW07Ci19Ci0KLWRpdi5tc2d0ZXh0IHsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLWRpdi5tc2dpdGVtdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1wLm1zZ2l0ZW0gewotCW1hcmdpbi10b3A6IDBlbTsKLX0KLQotLmF0dGVudGlvbixkaXYuYXR0ZW50aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uYXR0ZW50aW9udGl0bGUsc3Bhbi5hdHRlbnRpb250aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5jYXV0aW9udGl0bGUsZGl2LmNhdXRpb250aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uY2F1dGlvbixkaXYuY2F1dGlvbiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmRhbmdlcixkaXYuZGFuZ2VyIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXI6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5kYW5nZXJ0aXRsZSxkaXYuZGFuZ2VydGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmltcG9ydGFudCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmltcG9ydGFudHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnJlbWVtYmVyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ucmVtZW1iZXJ0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5yZXN0cmljdGlvbiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLnJlc3RyaWN0aW9udGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYud2FybmluZ3RpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2Lndhcm5pbmdib2R5IHsKLQltYXJnaW4tbGVmdDogMmVtCi19Ci0KLS5ub3RlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ubm90ZXRpdGxlLGRpdi5ub3RldGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYubm90ZWJvZHkgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5ub3RlbGlzdHRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotZGl2LmZubnVtIHsKLQlmbG9hdDogbGVmdDsKLX0KLQotZGl2LmZudGV4dCB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2LnN0ZXBsIHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuc3RlcGxudW0gewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZsb2F0OiBsZWZ0OwotCW1hcmdpbi1sZWZ0OiAwLjVlbTsKLX0KLQotZGl2LnN0ZXBsdGV4dCB7Ci0JbWFyZ2luLWxlZnQ6IDVlbTsKLX0KLQotZGl2LnN0ZXBsbnVtIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDAuNWVtOwotfQotCi1kaXYuc3RlcGx0ZXh0IHsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYubGVkaSB7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotZGl2LmxlZGVzYyB7Ci0JbWFyZ2luLWxlZnQ6IDNlbTsKLX0KLQotc3Bhbi5wYmxrdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYucGJsa2xibGJveCB7Ci0JcGFkZGluZzogMC41ZW0gMC41ZW0gMC41ZW0gMC41ZW07Ci0JYm9yZGVyOiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci19Ci0KLXNwYW4uZWRub3RpY2VzdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1zcGFuLnVpY29udHJvbCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4udGVybSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4uaWR4c2hvdyB7Ci0JY29sb3I6IGdyZWVuOwotfQotCi1kaXYuY29kZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi1zcGFuLnJlZmtleSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6IHdoaXRlOwotCWJhY2tncm91bmQtY29sb3I6IGJsYWNrOwotfQotCi10dC5hcGwgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LnF1YWxpZnN0YXJ0IHsKLQlwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXItdG9wOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYucXVhbGlmZW5kIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjFlbSAwLjVlbTsKLQlib3JkZXItYm90dG9tOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi0ubm9zaGFkZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci19Ci0KLS54bGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0IwQjBCMDsKLX0KLQotLm1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhDOEM4QzsKLX0KLQotLmRhcmsgewotCWJhY2tncm91bmQtY29sb3I6ICM2RTZFNkU7Ci19Ci0KLS54ZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzU4NTg1ODsKLX0KLQotLmxpZ2h0LXllbGxvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsKLX0KLQotLmtoYWtpIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQzk5OwotfQotCi0ubWVkaXVtLWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICM2Njk5Q0M7Ci19Ci0KLS5saWdodC1ibHVlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOwotfQotCi0ubWlkLWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci19Ci0KLS5saWdodC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0ubGlnaHRlc3QtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U2RTZFNjsKLX0KLQotI2NoYW5nZWQgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlsZWZ0OiAwLjJlbTsKLQljb2xvcjogIzdCNjhFRTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotSU5QVVQuYnV0dG9ucyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci0JYm9yZGVyLXRvcDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItYm90dG9tOiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItbGVmdDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotLmNncmFwaGljIHsKLQlmb250LXNpemU6IDkwJTsKLQljb2xvcjogYmxhY2s7Ci19Ci0KLS5haXgsLmhwdXgsLnN1biwudW5peCwud2luMiwud2lubnQsLndpbiwuem9zLC5saW51eCwub3MzOTAsLm9zNDAwLC5jLC5jcGx1c3BsdXMsLmNvYm9sLC5mb3J0cmFuLC5qYXZhLC5tYWNvc3gsLm9zMiwucGwxLC5ycGcKLQl7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQl0ZXh0LWluZGVudDogNTVweDsKLX0KLQotLmFpeCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYWl4LmdpZik7Ci19Ci0KLS5ocHV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdocHV4LmdpZik7Ci19Ci0KLS5zdW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3NvbGFyaXMuZ2lmKTsKLX0KLQotLnVuaXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3VuaXguZ2lmKTsKLX0KLQotLndpbjIgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzIwMDAuZ2lmKTsKLX0KLQotLndpbnhwIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd4cC5naWYpOwotfQotCi0ud2lubnQgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ250LmdpZik7Ci19Ci0KLS53aW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3dpbi5naWYpOwotfQotCi0uem9zIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd6b3MuZ2lmKTsKLX0KLQotLmxpbnV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdsaW51eC5naWYpOwotfQotCi0ub3MzOTAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzM5MC5naWYpOwotfQotCi0ub3M0MDAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzQwMC5naWYpOwotfQotCi0uYyB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYy5naWYpOwotfQotCi0uY3BsdXNwbHVzIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjcHAuZ2lmKTsKLX0KLQotLmNvYm9sIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjb2JvbC5naWYpOwotfQotCi0uZm9ydHJhbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nZm9ydHJhbi5naWYpOwotfQotCi0uamF2YSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5namF2YS5naWYpOwotfQotCi0ubWFjb3N4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdtYWNvc3guZ2lmKTsKLX0KLQotLm9zMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nb3MyLmdpZik7Ci19Ci0KLS5wbDEgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3BsMS5naWYpOwotfQotCi0ucnBnIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdycGcuZ2lmKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25sdHIuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9ubHRyLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhODE5NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25sdHIuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTMwNiArMCwwIEBACi0vKgotIHwgKGMpIENvcHlyaWdodCBJQk0gQ29ycC4gMjAwNCwgMjAwNSBBbGwgUmlnaHRzIFJlc2VydmVkLgotICovCi0gCi0udW5yZXNvbHZlZCB7IGJhY2tncm91bmQtY29sb3I6IHNreWJsdWU7IH0KLS5ub1RlbXBsYXRlIHsgYmFja2dyb3VuZC1jb2xvcjogeWVsbG93OyB9Ci0KLS5iYXNlIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsgfQotCi0vKiBBZGQgc3BhY2UgZm9yIHRvcCBsZXZlbCB0b3BpY3MgKi8KLS5uZXN0ZWQwIHsgbWFyZ2luLXRvcCA6IDFlbTt9Ci0KLS8qIGRpdiB3aXRoIGNsYXNzPXAgaXMgdXNlZCBmb3IgcGFyYWdyYXBocyB0aGF0IGNvbnRhaW4gYmxvY2tzLCB0byBrZWVwIHRoZSBYSFRNTCB2YWxpZCAqLwotLnAge21hcmdpbi10b3A6IDFlbX0KLQotLyogRGVmYXVsdCBvZiBpdGFsaWNzIHRvIHNldCBhcGFydCBmaWd1cmUgY2FwdGlvbnMgKi8KLS5maWdjYXAgeyBmb250LXN0eWxlOiBpdGFsaWMgfQotLmZpZ2Rlc2MgeyBmb250LXN0eWxlOiBub3JtYWwgfQotCi0vKiBVc2UgQGZyYW1lIHRvIGNyZWF0ZSBmcmFtZXMgb24gZmlndXJlcyAqLwotLmZpZ2JvcmRlciB7IGJvcmRlci1zdHlsZTogc29saWQ7IHBhZGRpbmctbGVmdCA6IDNweDsgYm9yZGVyLXdpZHRoIDogMnB4OyBwYWRkaW5nLXJpZ2h0IDogM3B4OyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlnc2lkZXMgeyBib3JkZXItbGVmdCA6IDJweCBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItcmlnaHQgOiAycHggc29saWQ7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWd0b3AgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0uZmlnYm90dG9tIHsgYm9yZGVyLWJvdHRvbSA6IDJweCBzb2xpZDsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWd0b3Bib3QgeyBib3JkZXItdG9wIDogMnB4IHNvbGlkOyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBtYXJnaW4tdG9wOiAxZW07IGJvcmRlci1jb2xvciA6IFNpbHZlcjt9Ci0KLS8qIE1vc3QgbGluayBncm91cHMgYXJlIGNyZWF0ZWQgd2l0aCA8ZGl2Pi4gRW5zdXJlIHRoZXkgaGF2ZSBzcGFjZSBiZWZvcmUgYW5kIGFmdGVyLiAqLwotLnVsbGlua3MgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotLnVsY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLm9sY2hpbGRsaW5rIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmxpbmtsaXN0IHsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5saW5rbGlzdHdpdGhjaGlsZCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtICB9Ci0uc3VibGlua2xpc3QgeyBtYXJnaW4tbGVmdDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnJlbGNvbmNlcHRzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHRhc2tzIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnJlbHJlZiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxpbmZvIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmJyZWFkY3J1bWIgeyBmb250LXNpemUgOiBzbWFsbGVyOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnByZXJlcSB7IG1hcmdpbi1sZWZ0IDogMjBweDt9Ci0KLS8qIFNldCBoZWFkaW5nIHNpemVzLCBnZXR0aW5nIHNtYWxsZXIgZm9yIGRlZXBlciBuZXN0aW5nICovCi0udG9waWN0aXRsZTEgeyBtYXJnaW4tdG9wOiAwcGM7IG1hcmdpbi1ib3R0b206IC4xZW07IGZvbnQtc2l6ZTogMS4zNGVtOyB9Ci0udG9waWN0aXRsZTIgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC40NWVtOyBmb250LXNpemU6IDEuMTdlbTsgfQotLnRvcGljdGl0bGUzIHsgbWFyZ2luLXRvcDogMXBjOyBtYXJnaW4tYm90dG9tOiAuMTdlbTsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTQgeyBtYXJnaW4tdG9wOiAuODNlbTsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0udG9waWN0aXRsZTUgeyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNiB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLS5zZWN0aW9udGl0bGUgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDBlbTsgY29sb3I6IGJsYWNrOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7fQotLnNlY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZXhhbXBsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLyogQWxsIG5vdGUgZm9ybWF0cyBoYXZlIHRoZSBzYW1lIGRlZmF1bHQgcHJlc2VudGF0aW9uICovCi0ubm90ZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0ubm90ZXRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLm5vdGVsaXN0dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0udGlwIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS50aXB0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5mYXN0cGF0aCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uZmFzdHBhdGh0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5pbXBvcnRhbnQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmltcG9ydGFudHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlbWVtYmVyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZW1lbWJlcnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLnJlc3RyaWN0aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5yZXN0cmljdGlvbnRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmF0dGVudGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uYXR0ZW50aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uZGFuZ2VyIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5jYXV0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uY2F1dGlvbiB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tYm90dG9tIDogMWVtOyB9Ci0KLS8qIFNpbXBsZSBsaXN0cyBkbyBub3QgZ2V0IGEgYnVsbGV0ICovCi11bC5zaW1wbGUgeyBsaXN0LXN0eWxlLXR5cGU6IG5vbmUgfQotCi0vKiBVc2VkIG9uIHRoZSBmaXJzdCBjb2x1bW4gb2YgYSB0YWJsZSwgd2hlbiByb3doZWFkZXI9ImZpcnN0Y29sIiBpcyB1c2VkICovCi0uZmlyc3Rjb2wgeyBmb250LXdlaWdodCA6IGJvbGQ7fQotCi0vKiBWYXJpb3VzIGJhc2ljIHBocmFzZSBzdHlsZXMgKi8KLS5ib2xkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5ib2xkSXRhbGljIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLml0YWxpYyB7IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnVuZGVybGluZWQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotLnVpY29udHJvbCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ucGFybW5hbWUgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmt3ZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0uZGVma3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udmFyIHsgZm9udC1zdHlsZSA6IGl0YWxpYzt9Ci0uc2hvcnRjdXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQotCi0vKiBEZWZhdWx0IG9mIGJvbGQgZm9yIGRlZmluaXRpb24gbGlzdCB0ZXJtcyAqLwotLmRsdGVybSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0KLS8qIFVzZSBDU1MgdG8gZXhwYW5kIGxpc3RzIHdpdGggQGNvbXBhY3Q9Im5vIiAqLwotLmRsdGVybWV4cGFuZCB7IGZvbnQtd2VpZ2h0OiBib2xkOyBtYXJnaW4tdG9wOiAxZW07IH0KLSpbY29tcGFjdD0ieWVzIl0+bGkgeyBtYXJnaW4tdG9wOiAwZW07fQotKltjb21wYWN0PSJubyJdPmxpIHsgbWFyZ2luLXRvcDogLjUzZW07fQkKLS5saWV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zbGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGxleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uZGRleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5zdWJzdGVwZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGlnbiBpbWFnZXMgYmFzZWQgb24gQGFsaWduIG9uIHRvcGljL2ltYWdlICovCi1kaXYuaW1hZ2VsZWZ0IHsgdGV4dC1hbGlnbjogbGVmdCB9Ci1kaXYuaW1hZ2VjZW50ZXIgeyB0ZXh0LWFsaWduOiBjZW50ZXIgfQotZGl2LmltYWdlcmlnaHQgeyB0ZXh0LWFsaWduOiByaWdodCB9Ci1kaXYuaW1hZ2VqdXN0aWZ5IHsgdGV4dC1hbGlnbjoganVzdGlmeSB9Ci0KLXByZS5zY3JlZW4geyBwYWRkaW5nOiA1cHggNXB4IDVweCA1cHg7IGJvcmRlcjogb3V0c2V0OyBiYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0NDOyBtYXJnaW4tdG9wOiAycHg7IG1hcmdpbi1ib3R0b20gOiAycHg7IHdoaXRlLXNwYWNlOiBwcmV9Ci0KLS8qIGNvcGllZCBmcm9tIGNvbW1vbi5jc3MgKi8KLWJvZHkgewotCWZvbnQtZmFtaWx5OiBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuOGVtOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci0JY29sb3I6IEJsYWNrOwotCW1hcmdpbi1yaWdodDogNWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmlibWZpbGVwYXRoIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLX0KLQotLmlibWNvbW1hbmQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaWJtZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLm12LC5waywucGtkZWYsLnB2IHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTAwJTsKLQlwYWRkaW5nLXRvcDogMGVtOwotCXBhZGRpbmctcmlnaHQ6IC4zZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWxlZnQ6IC4zZW07Ci19Ci0KLXR0LHNhbXAgewotCWZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi1CT0RZLm5hdiB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjsKLQlib3JkZXItcmlnaHQ6IDAuMmVtIHJpZGdlIGJsYWNrOwotCWZvbnQtc2l6ZTogMC45NWVtOwotfQotCi0uYmFzZSB7Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC12YXJpYW50OiBub3JtYWw7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7Ci19Ci0KLVRBQkxFIHsKLQljb2xvcjogYmxhY2s7Ci0Jd2lkdGg6IDkwJTsKLQlib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwotCWJvcmRlci1jb2xvcjogQmxhY2s7Ci0JYmFja2dyb3VuZDogd2hpdGU7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC41ZW07Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tcmlnaHQ6IDBlbTsKLX0KLQotLnRibGRlc2MgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotVEggewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC43ZW07Ci0JY29sb3I6IGJsYWNrOwotCWJhY2tncm91bmQtY29sb3I6ICNkYWRhZGE7Ci0JcGFkZGluZy10b3A6IDAuMWVtOwotCXBhZGRpbmctYm90dG9tOiAwLjNlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVRILmJhc2UgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiBibGFjazsKLQlib3JkZXI6IDEgc29saWQgIzYwNjA2MDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGNkYWRhOwotCXBhZGRpbmctdG9wOiAwLjY1ZW07Ci0JcGFkZGluZy1ib3R0b206IDAuNjVlbTsKLQlwYWRkaW5nLWxlZnQ6IDFlbTsKLQlwYWRkaW5nLXJpZ2h0OiAxZW07Ci19Ci0KLVREIHsKLQlmb250LXNpemU6IDAuN2VtOwotCWNvbG9yOiBibGFjazsKLQliYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKLQlwYWRkaW5nLXRvcDogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuM2VtOwotCXBhZGRpbmctbGVmdDogMWVtOwotCXBhZGRpbmctcmlnaHQ6IDFlbTsKLX0KLQotQ0lURSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1FTSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1TVFJPTkcgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1jYXB0aW9uIHsKLQl0ZXh0LWFsaWduOiBsZWZ0OwotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotRFQgewotCW1hcmdpbi10b3A6IDAuNWVtOwotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotfQotCi1ERCB7Ci0JbWFyZ2luLWxlZnQ6IDEuMGVtOwotfQotCi1QUkUscHJlLmNncmFwaGljIHsKLQlmb250LWZhbWlseTogbW9ub3NwYWNlOwotCWZvbnQtc2l6ZTogMTJweDsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjZGFkYWRhOwotCXBhZGRpbmc6IDVweDsKLX0KLQotLml0YWxpYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uYm9sZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS51bmRlcmxpbmVkIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtaXRhbGljLC5ib2xkSXRhbGljIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLS5zbWFsbENhcHMsLnNtYWxsY2FwcyB7Ci0JdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKLQlmb250LXNpemU6IHNtYWxsZXI7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotfQotCi0uaXRhbGljLXVuZGVybGluZWQgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLmJvbGQtdW5kZXJsaW5lZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5ib2xkLWl0YWxpYy11bmRlcmxpbmVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLS5zbWFsbGNhcHMtdW5kZXJsaW5lZCB7Ci0JZm9udC12YXJpYW50OiBzbWFsbC1jYXBzOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0uZW1waGFzaXMgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotLmlubGluZWRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi0uc2lkZWJhciB7Ci0JYmFja2dyb3VuZDogI2NjY2NjYzsKLX0KLQotQTpsaW5rIHsKLQljb2xvcjogIzAwNjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTp2aXNpdGVkIHsKLQljb2xvcjogIzk5NjY5OTsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotQTphY3RpdmUgewotCWNvbG9yOiAjMDA2Njk5OwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1BOmhvdmVyIHsKLQljb2xvcjogIzk5NjY5OTs7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEudG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEudG9jbGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5wdG9jbGluazpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6YWN0aXZlIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEucHRvY2xpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnB0b2NsaW5rOmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS5pbmRleGxpbms6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5pbmRleGxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLmluZGV4bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDpsaW5rIHsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLWEuZmlndXJlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OnZpc2l0ZWQgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS5maWd1cmVsaXN0OmhvdmVyIHsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotYS50YWJsZWxpc3Q6bGluayB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDphY3RpdmUgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotYS50YWJsZWxpc3Q6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotfQotCi1hLnRhYmxlbGlzdDpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLWEuYm9sZGdyZXlsaW5rOmxpbmsgewotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLQljb2xvcjogIzMzMzMzMzsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZm9udC1zaXplOiAwLjllbTsKLX0KLQotYS5ib2xkZ3JleWxpbms6dmlzaXRlZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBub25lOwotCWNvbG9yOiAjMzMzMzMzOwotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmb250LXNpemU6IDAuOWVtOwotfQotCi1hLmJvbGRncmV5bGluazpob3ZlciB7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci0JY29sb3I6ICMzMzMzMzM7Ci0JZm9udC1mYW1pbHk6IFZlcmRhbmEsIEFyaWFsLCBzYW5zLXNlcmlmOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWZvbnQtc2l6ZTogMC45ZW07Ci19Ci0KLS5ydW5uaW5naGVhZGVyIHsKLQlmb250LWZhbWlseTogVmVyZGFuYSwgQXJpYWwsIHNhbnMtc2VyaWY7Ci0JZm9udC1zaXplOiAwLjdlbTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgewotCWZvbnQtZmFtaWx5OiBWZXJkYW5hLCBBcmlhbCwgc2Fucy1zZXJpZjsKLQlmb250LXNpemU6IDAuN2VtOwotfQotCi0ucnVubmluZ2Zvb3RlciBhOmxpbmsgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTphY3RpdmUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogbm9uZTsKLX0KLQotLnJ1bm5pbmdmb290ZXIgYTp2aXNpdGVkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQljb2xvcjogIzAwMDAwMDsKLQl0ZXh0LWRlY29yYXRpb246IG5vbmU7Ci19Ci0KLS5ydW5uaW5nZm9vdGVyIGE6aG92ZXIgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCWNvbG9yOiAjMDAwMDAwOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0jYnJlYWRjcnVtYiwuYnJlYWRjcnVtYixzcGFuLmJyZWFkY3J1bWJzIHsKLQlmb250LXNpemU6IDAuNzVlbTsKLX0KLQotLmZhc3RwYXRoIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZmFzdHBhdGh0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS50b2MgewotCWZvbnQtc2l6ZTogc21hbGw7Ci19Ci0KLS5uZXN0ZWQwIHsKLQltYXJnaW4tdG9wOiAwZW07Ci19Ci0KLS5wIHsKLQltYXJnaW4tdG9wOiAxZW07Ci19Ci0KLXNwYW4uZmlnY2FwIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4uZmlnZGVzYyB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotfQotCi1kaXYuZmlnYm94IHsKLQkKLX0KLQotZGl2LmZpZ3J1bGVzIHsKLQkKLX0KLQotZGl2LmZpZ25vbmUgewotCQotfQotCi0uZmlnbm9uZSB7Ci0JCi19Ci0KLS5maWdib3JkZXIgewotCQotfQotCi0uZmlnc2lkZXMgewotCQotfQotCi0uZmlndG9wIHsKLQkKLX0KLQotLmZpZ2JvdHRvbSB7Ci0JCi19Ci0KLS5maWd0b3Bib3QgewotCQotfQotCi0ucGFyZW50bGluayB7Ci0JCi19Ci0KLS5wcmV2bGluayB7Ci0JCi19Ci0KLS5uZXh0bGluayB7Ci0JCi19Ci0KLS5yZWxjb25jZXB0c2hkIHsKLQkKLX0KLQotLnJlbHRhc2tzaGQgewotCQotfQotCi0ucmVscmVmaGQgewotCQotfQotCi0uc3lubm9uZSB7Ci0JCi19Ci0KLS5zeW5ib3JkZXIgewotCQotfQotCi0uc3luc2lkZXMgewotCQotfQotCi0uc3ludG9wIHsKLQkKLX0KLQotLnN5bmJvdHRvbSB7Ci0JCi19Ci0KLS5zeW50b3Bib3QgewotCQotfQotCi0uc2tpcCB7Ci0JbWFyZ2luLXRvcDogMWVtOwotfQotCi0uc2tpcHNwYWNlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udWxjaGlsZGxpbmsgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5vbGNoaWxkbGluayB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotdWwsb2wgewotCW1hcmdpbi10b3A6IDAuMWVtOwotCXBhZGRpbmctdG9wOiAwLjFlbTsKLX0KLQotdWwuc2ltcGxlIHsKLQlsaXN0LXN0eWxlLXR5cGU6IG5vbmU7Ci19Ci0KLXVsLmluZGV4bGlzdCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBub25lOwotfQotCi1PTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1VTCBMSSB7Ci0JbWFyZ2luLXRvcDogMC4wZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4wZW07Ci0JbWFyZ2luLWxlZnQ6IDAuMGVtOwotfQotCi1PTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkZWNpbWFsOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi1VTCBMSSBESVYgUCB7Ci0JbGlzdC1zdHlsZS10eXBlOiBkaXNjOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDAuMmVtOwotfQotCi0qIFtjb21wYWN0PSJ5ZXMiXT5saSB7Ci0JbWFyZ2luLXRvcDogMCBlbTsKLX0KLQotKiBbY29tcGFjdD0ibm8iXT5saSB7Ci0JbWFyZ2luLXRvcDogMC41ZW07Ci19Ci0KLWhyIHsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JbWFyZ2luLXRvcDogMGVtOwotCXBhZGRpbmctdG9wOiAwZW07Ci0JcGFkZGluZy1ib3R0b206IDBlbTsKLQl3aWR0aDogOTAlOwotCWNvbG9yOiAjY2NjY2NjOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotSDEsLnRpdGxlLC5wYWdldGl0bGUsLnRvcGljdGl0bGUxIHsKLQlmb250LXNpemU6IDEuNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjVlbTsKLQl3b3JkLXNwYWNpbmc6IDAuMWVtOwotfQotCi1IMiwuc3VidGl0bGUsLnBhZ2VzdWJ0aXRsZSwudG9waWN0aXRsZTIgewotCWZvbnQtc2l6ZTogMS4yNWVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4wZW07Ci19Ci0KLUgzLC5ib2xkdGl0bGUsLnRvcGljdGl0bGUzIHsKLQlmb250LXNpemU6IDEuMGVtOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLQlwYWRkaW5nLWJvdHRvbTogMC4xZW07Ci19Ci0KLUg0LC50b3BpY3RpdGxlNCB7Ci0JZm9udC1zaXplOiAwLjllbTsKLQlmb250LXN0eWxlOiBub3JtYWw7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4xZW07Ci0JcGFkZGluZy1ib3R0b206IDAuMWVtOwotfQotCi1oNSwudG9waWN0aXRsZTUgewotCWZvbnQtc2l6ZTogMC44ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1oNiwudG9waWN0aXRsZTYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDBlbTsKLQlwYWRkaW5nLWJvdHRvbTogMGVtOwotfQotCi1kaXYuaGVhZHRpdGxlIHsKLQlmb250LXNpemU6IDFlbTsKLQlmb250LXdlaWdodDogYm9sZDsKLQltYXJnaW4tbGVmdDogMGVtOwotfQotCi1kaXYuaGVhZDAgewotCWZvbnQtc2l6ZTogMC45ZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWxlZnQ6IDBlbTsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLX0KLQotZGl2LmhlYWQxIHsKLQlmb250LXNpemU6IDAuOGVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1sZWZ0OiAxZW07Ci0JcGFkZGluZy10b3A6IDAuNWVtOwotfQotCi1kaXYuaGVhZDIgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuaGVhZDMgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYuaGVhZDQgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNGVtOwotfQotCi1kaXYuaGVhZDUgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuaGVhZDYgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogNmVtOwotfQotCi1kaXYuaGVhZDcgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogN2VtOwotfQotCi1kaXYuaGVhZDggewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOGVtOwotfQotCi1kaXYuaGVhZDkgewotCWZvbnQtc2l6ZTogMC43ZW07Ci0JZm9udC13ZWlnaHQ6IG5vcm1hbDsKLQltYXJnaW4tbGVmdDogOWVtOwotfQotCi0udGlwIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0udGlwdGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uZmlyc3Rjb2wgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucHRvY0gxIHsKLQlmb250LXNpemU6IHgtc21hbGw7Ci19Ci0KLS5wdG9jSDIgewotCWZvbnQtc2l6ZTogeC1zbWFsbDsKLX0KLQotLnN0aXRsZSB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi0ubnRlIHsKLQkKLX0KLQotLnh4bGluZXMgewotCXdoaXRlLXNwYWNlOiBwcmU7Ci0JZm9udC1zaXplOiAwLjk1ZW07Ci19Ci0KLS5zZWN0aW9udGl0bGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAwZW07Ci0JY29sb3I6IGJsYWNrOwotCWZvbnQtc2l6ZTogMS4yZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5pbWFnZWxlZnQgewotCXRleHQtYWxpZ246IGxlZnQ7Ci19Ci0KLWRpdi5pbWFnZWNlbnRlciB7Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYuaW1hZ2VyaWdodCB7Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLWRpdi5pbWFnZWp1c3RpZnkgewotCXRleHQtYWxpZ246IGp1c3RpZnk7Ci19Ci0KLWRpdi5tbW9iaiB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQl0ZXh0LWFsaWduOiBjZW50ZXI7Ci19Ci0KLWRpdi5tbW9iamxlZnQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogbGVmdDsKLX0KLQotZGl2Lm1tb2JqY2VudGVyIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotCXRleHQtYWxpZ246IGNlbnRlcjsKLX0KLQotZGl2Lm1tb2JqcmlnaHQgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci0JdGV4dC1hbGlnbjogcmlnaHQ7Ci19Ci0KLXByZS5zY3JlZW4gewotCXBhZGRpbmc6IDFlbSAxZW0gMWVtIDFlbTsKLQltYXJnaW4tdG9wOiAwLjRlbTsKLQltYXJnaW4tYm90dG9tOiAwLjRlbTsKLQlib3JkZXI6IHRoaW4gc29saWQgQmxhY2s7Ci0JZm9udC1zaXplOiAxMDAlOwotfQotCi0ucHJlcmVxIHsKLQltYXJnaW4tbGVmdDogMS41ZW07Ci19Ci0KLS5kZWZMaXN0SGVhZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ubXYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5tZCB7Ci0JdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Ci19Ci0KLS5wayxzcGFuLnBrIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotc3Bhbi5wa2RlZiB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Ci19Ci0KLXNwYW4ucHYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi5wdmRlZiB7Ci0JZm9udC1zdHlsZTogaXRhbGljOwotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1zcGFuLmt3ZCB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4ua2R3ZGVmIHsKLQlmb250LXdlaWdodDogYm9sZDsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotLnBhcm1MaXN0S3dkIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnBhcm1MaXN0VmFyIHsKLQlmb250LXN0eWxlOiBpdGFsaWM7Ci19Ci0KLXNwYW4ub3BlciB7Ci0JZm9udC1zdHlsZTogbm9ybWFsOwotfQotCi1zcGFuLm9wZXJkZWYgewotCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwotfQotCi1WQVIsc3Bhbi52YXIgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotc3Bhbi52YXJkZWYgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKLX0KLQotZGl2Lm1zZyB7Ci0JcGFkZGluZzogMC4yZW0gMWVtIDFlbSAxZW07Ci0JbWFyZ2luLXRvcDogMC40ZW07Ci0JbWFyZ2luLWJvdHRvbTogMC40ZW07Ci19Ci0KLWRpdi5tc2dudW0gewotCWZsb2F0OiBsZWZ0OwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLQltYXJnaW4tcmlnaHQ6IDFlbTsKLX0KLQotZGl2Lm1zZ3RleHQgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotZGl2Lm1zZ2l0ZW10aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXAubXNnaXRlbSB7Ci0JbWFyZ2luLXRvcDogMGVtOwotfQotCi0uYXR0ZW50aW9uLGRpdi5hdHRlbnRpb24gewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5hdHRlbnRpb250aXRsZSxzcGFuLmF0dGVudGlvbnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLmNhdXRpb250aXRsZSxkaXYuY2F1dGlvbnRpdGxlIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLS5jYXV0aW9uLGRpdi5jYXV0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uZGFuZ2VyLGRpdi5kYW5nZXIgewotCXBhZGRpbmc6IDAuNWVtIDAuNWVtIDAuNWVtIDAuNWVtOwotCWJvcmRlcjogc29saWQ7Ci0JYm9yZGVyLXdpZHRoOiB0aGluOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotCW1hcmdpbi10b3A6IDAuMmVtOwotCW1hcmdpbi1ib3R0b206IDFlbTsKLX0KLQotLmRhbmdlcnRpdGxlLGRpdi5kYW5nZXJ0aXRsZSB7Ci0JbWFyZ2luLXRvcDogMWVtOwotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0uaW1wb3J0YW50IHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0uaW1wb3J0YW50dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi0ucmVtZW1iZXIgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5yZW1lbWJlcnRpdGxlIHsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotLnJlc3RyaWN0aW9uIHsKLQltYXJnaW4tdG9wOiAxZW07Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi0ucmVzdHJpY3Rpb250aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi53YXJuaW5ndGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYud2FybmluZ2JvZHkgewotCW1hcmdpbi1sZWZ0OiAyZW0KLX0KLQotLm5vdGUgewotCW1hcmdpbi10b3A6IDFlbTsKLQltYXJnaW4tYm90dG9tOiAxZW07Ci19Ci0KLS5ub3RldGl0bGUsZGl2Lm5vdGV0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5ub3RlYm9keSB7Ci0JbWFyZ2luLWxlZnQ6IDJlbTsKLX0KLQotZGl2Lm5vdGVsaXN0dGl0bGUgewotCWZvbnQtd2VpZ2h0OiBib2xkOwotfQotCi1kaXYuZm5udW0gewotCWZsb2F0OiBsZWZ0OwotfQotCi1kaXYuZm50ZXh0IHsKLQltYXJnaW4tbGVmdDogMmVtOwotfQotCi1kaXYuc3RlcGwgewotCW1hcmdpbi1sZWZ0OiAyZW07Ci19Ci0KLWRpdi5zdGVwbG51bSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JZmxvYXQ6IGxlZnQ7Ci0JbWFyZ2luLWxlZnQ6IDAuNWVtOwotfQotCi1kaXYuc3RlcGx0ZXh0IHsKLQltYXJnaW4tbGVmdDogNWVtOwotfQotCi1kaXYuc3RlcGxudW0gewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLQlmb250LXdlaWdodDogYm9sZDsKLQlmbG9hdDogbGVmdDsKLQltYXJnaW4tbGVmdDogMC41ZW07Ci19Ci0KLWRpdi5zdGVwbHRleHQgewotCW1hcmdpbi1ib3R0b206IDAuNWVtOwotCW1hcmdpbi1sZWZ0OiAzZW07Ci19Ci0KLWRpdi5sZWRpIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1kaXYubGVkZXNjIHsKLQltYXJnaW4tbGVmdDogM2VtOwotfQotCi1zcGFuLnBibGt0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLWRpdi5wYmxrbGJsYm94IHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXI6IHNvbGlkOwotCWJvcmRlci13aWR0aDogdGhpbjsKLQltYXJnaW4tdG9wOiAwLjJlbTsKLX0KLQotc3Bhbi5lZG5vdGljZXN0aXRsZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4udGVybSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci19Ci0KLXNwYW4uaWR4c2hvdyB7Ci0JY29sb3I6IGdyZWVuOwotfQotCi1kaXYuY29kZSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMWVtOwotfQotCi1zcGFuLnJlZmtleSB7Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JY29sb3I6IHdoaXRlOwotCWJhY2tncm91bmQtY29sb3I6IGJsYWNrOwotfQotCi10dC5hcGwgewotCWZvbnQtc3R5bGU6IGl0YWxpYzsKLX0KLQotZGl2LnF1YWxpZnN0YXJ0IHsKLQlwYWRkaW5nOiAwLjFlbSAwLjVlbSAwLjVlbSAwLjVlbTsKLQlib3JkZXItdG9wOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLXRvcDogMC4yZW07Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi1kaXYucXVhbGlmZW5kIHsKLQlwYWRkaW5nOiAwLjVlbSAwLjVlbSAwLjFlbSAwLjVlbTsKLQlib3JkZXItYm90dG9tOiBzb2xpZDsKLQlib3JkZXItbGVmdDogc29saWQ7Ci0JYm9yZGVyLXJpZ2h0OiBzb2xpZDsKLQlib3JkZXItd2lkdGg6IHRoaW47Ci0JZm9udC13ZWlnaHQ6IGJvbGQ7Ci0JbWFyZ2luLWJvdHRvbTogMC4yZW07Ci0JdGV4dC1hbGlnbjogY2VudGVyOwotfQotCi0ubm9zaGFkZSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Ci19Ci0KLS54bGlnaHQgewotCWJhY2tncm91bmQtY29sb3I6ICNEQURBREE7Ci19Ci0KLS5saWdodCB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0IwQjBCMDsKLX0KLQotLm1lZGl1bSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzhDOEM4QzsKLX0KLQotLmRhcmsgewotCWJhY2tncm91bmQtY29sb3I6ICM2RTZFNkU7Ci19Ci0KLS54ZGFyayB7Ci0JYmFja2dyb3VuZC1jb2xvcjogIzU4NTg1ODsKLX0KLQotLmxpZ2h0LXllbGxvdyB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZDQzsKLX0KLQotLmtoYWtpIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQzk5OwotfQotCi0ubWVkaXVtLWJsdWUgewotCWJhY2tncm91bmQtY29sb3I6ICM2Njk5Q0M7Ci19Ci0KLS5saWdodC1ibHVlIHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjQ0NDQ0ZGOwotfQotCi0ubWlkLWdyZXkgewotCWJhY2tncm91bmQtY29sb3I6ICNDQ0NDQ0M7Ci19Ci0KLS5saWdodC1ncmV5IHsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjREFEQURBOwotfQotCi0ubGlnaHRlc3QtZ3JleSB7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0U2RTZFNjsKLX0KLQotI2NoYW5nZWQgewotCXBvc2l0aW9uOiBhYnNvbHV0ZTsKLQlsZWZ0OiAwLjJlbTsKLQljb2xvcjogIzdCNjhFRTsKLQliYWNrZ3JvdW5kLWNvbG9yOiAjRkZGRkZGOwotCWZvbnQtc3R5bGU6IG5vcm1hbDsKLQlmb250LXdlaWdodDogYm9sZDsKLX0KLQotSU5QVVQuYnV0dG9ucyB7Ci0JZm9udC1zaXplOiAwLjc1ZW07Ci0JYm9yZGVyLXRvcDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYm9yZGVyLXJpZ2h0OiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItYm90dG9tOiAwLjJlbSBvdXRzZXQgIzAwMDAwMDsKLQlib3JkZXItbGVmdDogMC4yZW0gb3V0c2V0ICNCMUIxQjE7Ci0JYmFja2dyb3VuZC1jb2xvcjogI0UyRTJFMjsKLQltYXJnaW4tYm90dG9tOiAwLjJlbTsKLX0KLQotLmNncmFwaGljIHsKLQlmb250LXNpemU6IDkwJTsKLQljb2xvcjogYmxhY2s7Ci19Ci0KLS5haXgsLmhwdXgsLnN1biwudW5peCwud2luMiwud2lubnQsLndpbiwuem9zLC5saW51eCwub3MzOTAsLm9zNDAwLC5jLC5jcGx1c3BsdXMsLmNvYm9sLC5mb3J0cmFuLC5qYXZhLC5tYWNvc3gsLm9zMiwucGwxLC5ycGcKLQl7Ci0JYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKLQliYWNrZ3JvdW5kLXBvc2l0aW9uOiB0b3AgbGVmdDsKLQltYXJnaW4tdG9wOiAwLjVlbTsKLQl0ZXh0LWluZGVudDogNTVweDsKLX0KLQotLmFpeCB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYWl4LmdpZik7Ci19Ci0KLS5ocHV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdocHV4LmdpZik7Ci19Ci0KLS5zdW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3NvbGFyaXMuZ2lmKTsKLX0KLQotLnVuaXggewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3VuaXguZ2lmKTsKLX0KLQotLndpbjIgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzIwMDAuZ2lmKTsKLX0KLQotLndpbnhwIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd4cC5naWYpOwotfQotCi0ud2lubnQgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ250LmdpZik7Ci19Ci0KLS53aW4gewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3dpbi5naWYpOwotfQotCi0uem9zIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmd6b3MuZ2lmKTsKLX0KLQotLmxpbnV4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdsaW51eC5naWYpOwotfQotCi0ub3MzOTAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzM5MC5naWYpOwotfQotCi0ub3M0MDAgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZzQwMC5naWYpOwotfQotCi0uYyB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nYy5naWYpOwotfQotCi0uY3BsdXNwbHVzIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjcHAuZ2lmKTsKLX0KLQotLmNvYm9sIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdjb2JvbC5naWYpOwotfQotCi0uZm9ydHJhbiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nZm9ydHJhbi5naWYpOwotfQotCi0uamF2YSB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5namF2YS5naWYpOwotfQotCi0ubWFjb3N4IHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdtYWNvc3guZ2lmKTsKLX0KLQotLm9zMiB7Ci0JYmFja2dyb3VuZC1pbWFnZTogdXJsKG5nb3MyLmdpZik7Ci19Ci0KLS5wbDEgewotCWJhY2tncm91bmQtaW1hZ2U6IHVybChuZ3BsMS5naWYpOwotfQotCi0ucnBnIHsKLQliYWNrZ3JvdW5kLWltYWdlOiB1cmwobmdycGcuZ2lmKTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25ydGwuY3NzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9ucnRsLmNzcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM1MGIwMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb25ydGwuY3NzCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gfCAoYykgQ29weXJpZ2h0IElCTSBDb3JwLiAyMDA0LCAyMDA1IEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKi8KLSAKLS51bnJlc29sdmVkIHsgYmFja2dyb3VuZC1jb2xvcjogc2t5Ymx1ZTsgfQotLm5vVGVtcGxhdGUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB5ZWxsb3c7IH0KLQotLmJhc2UgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOyB9Ci0KLS8qIEFkZCBzcGFjZSBmb3IgdG9wIGxldmVsIHRvcGljcyAqLwotLm5lc3RlZDAgeyBtYXJnaW4tdG9wIDogMWVtO30KLQotLyogZGl2IHdpdGggY2xhc3M9cCBpcyB1c2VkIGZvciBwYXJhZ3JhcGhzIHRoYXQgY29udGFpbiBibG9ja3MsIHRvIGtlZXAgdGhlIFhIVE1MIHZhbGlkICovCi0ucCB7bWFyZ2luLXRvcDogMWVtfQotCi0vKiBEZWZhdWx0IG9mIGl0YWxpY3MgdG8gc2V0IGFwYXJ0IGZpZ3VyZSBjYXB0aW9ucyAqLwotLmZpZ2NhcCB7IGZvbnQtc3R5bGU6IGl0YWxpYyB9Ci0uZmlnZGVzYyB7IGZvbnQtc3R5bGU6IG5vcm1hbCB9Ci0KLS8qIFVzZSBAZnJhbWUgdG8gY3JlYXRlIGZyYW1lcyBvbiBmaWd1cmVzICovCi0uZmlnYm9yZGVyIHsgYm9yZGVyLXN0eWxlOiBzb2xpZDsgcGFkZGluZy1sZWZ0IDogM3B4OyBib3JkZXItd2lkdGggOiAycHg7IHBhZGRpbmctcmlnaHQgOiAzcHg7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdzaWRlcyB7IGJvcmRlci1sZWZ0IDogMnB4IHNvbGlkOyBwYWRkaW5nLWxlZnQgOiAzcHg7IGJvcmRlci1yaWdodCA6IDJweCBzb2xpZDsgcGFkZGluZy1yaWdodCA6IDNweDsgbWFyZ2luLXRvcDogMWVtOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLS5maWdib3R0b20geyBib3JkZXItYm90dG9tIDogMnB4IHNvbGlkOyBib3JkZXItY29sb3IgOiBTaWx2ZXI7fQotLmZpZ3RvcGJvdCB7IGJvcmRlci10b3AgOiAycHggc29saWQ7IGJvcmRlci1ib3R0b20gOiAycHggc29saWQ7IG1hcmdpbi10b3A6IDFlbTsgYm9yZGVyLWNvbG9yIDogU2lsdmVyO30KLQotLyogTW9zdCBsaW5rIGdyb3VwcyBhcmUgY3JlYXRlZCB3aXRoIDxkaXY+LiBFbnN1cmUgdGhleSBoYXZlIHNwYWNlIGJlZm9yZSBhbmQgYWZ0ZXIuICovCi0udWxsaW5rcyB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0udWxjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ub2xjaGlsZGxpbmsgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3QgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ubGlua2xpc3R3aXRoY2hpbGQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1yaWdodDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbSAgfQotLnN1YmxpbmtsaXN0IHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tcmlnaHQ6IDEuNWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gIH0KLS5yZWxjb25jZXB0cyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWx0YXNrcyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5yZWxyZWYgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0ucmVsaW5mbyB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5icmVhZGNydW1iIHsgZm9udC1zaXplIDogc21hbGxlcjsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5wcmVyZXEgeyBtYXJnaW4tcmlnaHQgOiAyMHB4O30KLQotLyogU2V0IGhlYWRpbmcgc2l6ZXMsIGdldHRpbmcgc21hbGxlciBmb3IgZGVlcGVyIG5lc3RpbmcgKi8KLS50b3BpY3RpdGxlMSB7IG1hcmdpbi10b3A6IDBwYzsgbWFyZ2luLWJvdHRvbTogLjFlbTsgZm9udC1zaXplOiAxLjM0ZW07IH0KLS50b3BpY3RpdGxlMiB7IG1hcmdpbi10b3A6IDFwYzsgbWFyZ2luLWJvdHRvbTogLjQ1ZW07IGZvbnQtc2l6ZTogMS4xN2VtOyB9Ci0udG9waWN0aXRsZTMgeyBtYXJnaW4tdG9wOiAxcGM7IG1hcmdpbi1ib3R0b206IC4xN2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNCB7IG1hcmdpbi10b3A6IC44M2VtOyBmb250LXNpemU6IDEuMTdlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS50b3BpY3RpdGxlNSB7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDsgfQotLnRvcGljdGl0bGU2IHsgZm9udC1zaXplOiAxLjE3ZW07IGZvbnQtc3R5bGU6IGl0YWxpYzsgfQotLnNlY3Rpb250aXRsZSB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMGVtOyBjb2xvcjogYmxhY2s7IGZvbnQtc2l6ZTogMS4xN2VtOyBmb250LXdlaWdodDogYm9sZDt9Ci0uc2VjdGlvbiB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLS5leGFtcGxlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotCi0vKiBBbGwgbm90ZSBmb3JtYXRzIGhhdmUgdGhlIHNhbWUgZGVmYXVsdCBwcmVzZW50YXRpb24gKi8KLS5ub3RlIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5ub3RldGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ubm90ZWxpc3R0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS50aXAgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnRpcHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmZhc3RwYXRoIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5mYXN0cGF0aHRpdGxlIHsgZm9udC13ZWlnaHQ6IGJvbGQgfQotLmltcG9ydGFudCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbSA6IDFlbTt9Ci0uaW1wb3J0YW50dGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVtZW1iZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlbWVtYmVydGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0ucmVzdHJpY3Rpb24geyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLnJlc3RyaWN0aW9udGl0bGUgeyBmb250LXdlaWdodDogYm9sZCB9Ci0uYXR0ZW50aW9uIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tIDogMWVtO30KLS5hdHRlbnRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXJ0aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5kYW5nZXIgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b20gOiAxZW07fQotLmNhdXRpb250aXRsZSB7IGZvbnQtd2VpZ2h0OiBib2xkIH0KLS5jYXV0aW9uIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi1ib3R0b20gOiAxZW07IH0KLQotLyogU2ltcGxlIGxpc3RzIGRvIG5vdCBnZXQgYSBidWxsZXQgKi8KLXVsLnNpbXBsZSB7IGxpc3Qtc3R5bGUtdHlwZTogbm9uZSB9Ci0KLS8qIFVzZWQgb24gdGhlIGZpcnN0IGNvbHVtbiBvZiBhIHRhYmxlLCB3aGVuIHJvd2hlYWRlcj0iZmlyc3Rjb2wiIGlzIHVzZWQgKi8KLS5maXJzdGNvbCB7IGZvbnQtd2VpZ2h0IDogYm9sZDt9Ci0KLS8qIFZhcmlvdXMgYmFzaWMgcGhyYXNlIHN0eWxlcyAqLwotLmJvbGQgeyBmb250LXdlaWdodDogYm9sZDsgfQotLmJvbGRJdGFsaWMgeyBmb250LXdlaWdodDogYm9sZDsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0uaXRhbGljIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci0udW5kZXJsaW5lZCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0udWljb250cm9sIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5wYXJtbmFtZSB7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci0ua3dkIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLS5kZWZrd2QgeyBmb250LXdlaWdodDogYm9sZDsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLS52YXIgeyBmb250LXN0eWxlIDogaXRhbGljO30KLS5zaG9ydGN1dCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci0KLS8qIERlZmF1bHQgb2YgYm9sZCBmb3IgZGVmaW5pdGlvbiBsaXN0IHRlcm1zICovCi0uZGx0ZXJtIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLQotLyogVXNlIENTUyB0byBleHBhbmQgbGlzdHMgd2l0aCBAY29tcGFjdD0ibm8iICovCi0uZGx0ZXJtZXhwYW5kIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IG1hcmdpbi10b3A6IDFlbTsgfQotKltjb21wYWN0PSJ5ZXMiXT5saSB7IG1hcmdpbi10b3A6IDBlbTt9Ci0qW2NvbXBhY3Q9Im5vIl0+bGkgeyBtYXJnaW4tdG9wOiAuNTNlbTt9Ci0ubGlleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc2xpZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRsZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLmRkZXhwYW5kIHsgbWFyZ2luLXRvcDogMWVtOyBtYXJnaW4tYm90dG9tOiAxZW0gfQotLnN0ZXBleHBhbmQgeyBtYXJnaW4tdG9wOiAxZW07IG1hcmdpbi1ib3R0b206IDFlbSB9Ci0uc3Vic3RlcGV4cGFuZCB7IG1hcmdpbi10b3A6IDFlbTsgbWFyZ2luLWJvdHRvbTogMWVtIH0KLQotLyogQWxpZ24gaW1hZ2VzIGJhc2VkIG9uIEBhbGlnbiBvbiB0b3BpYy9pbWFnZSAqLwotZGl2LmltYWdlbGVmdCB7IHRleHQtYWxpZ246IGxlZnQgfQotZGl2LmltYWdlY2VudGVyIHsgdGV4dC1hbGlnbjogY2VudGVyIH0KLWRpdi5pbWFnZXJpZ2h0IHsgdGV4dC1hbGlnbjogcmlnaHQgfQotZGl2LmltYWdlanVzdGlmeSB7IHRleHQtYWxpZ246IGp1c3RpZnkgfQotCi1wcmUuc2NyZWVuIHsgcGFkZGluZzogNXB4IDVweCA1cHggNXB4OyBib3JkZXI6IG91dHNldDsgYmFja2dyb3VuZC1jb2xvcjogI0NDQ0NDQzsgbWFyZ2luLXRvcDogMnB4OyBtYXJnaW4tYm90dG9tIDogMnB4OyB3aGl0ZS1zcGFjZTogcHJlfQotCi0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3RFeGlzdGluZ1NlcnZlci5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvU2VsZWN0RXhpc3RpbmdTZXJ2ZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOThkYmU0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3RFeGlzdGluZ1NlcnZlci5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvU2VsZWN0TmV3U2VydmVyLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3ROZXdTZXJ2ZXIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWY2YjQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9TZWxlY3ROZXdTZXJ2ZXIuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUxLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA2NGJiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTIuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYTQzNDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmUzLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTMuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDg3ZDBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU0LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzNGJiZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvWE1MQ2F0YWxvZy1GaWd1cmU0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9YTUxDYXRhbG9nLUZpZ3VyZTUuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NDYxNGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL1hNTENhdGFsb2ctRmlndXJlNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2U5OUwuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlOTlMLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2YWJkYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2U5OUwuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlRUo5LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUVKOS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNzM1MGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlRUo5LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUlBSS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VJQUkuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmY2MjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZUlBSS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VMS0YuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTEtGLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY5OGY0Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VMS0YuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTzc4LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZU83OC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MDc3ZjguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL2ltYWdlTzc4LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZVU3MS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvaW1hZ2VVNzEuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWUwNDMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9pbWFnZVU3MS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvbm90ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvbm90ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MjYwZGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL25vdGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50RFRELnBuZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudERURC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1ZjI2MGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3NlbGVjdFJvb3RFbGVtZW50RFRELnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudFhTRC5wbmcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvc2VsZWN0Um9vdEVsZW1lbnRYU0QucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTU1ZWQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy9zZWxlY3RSb290RWxlbWVudFhTRC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjg0NGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxfbWFpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbF9tYWluLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYwNzRlOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbF9tYWluLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJhY2tidXR0b24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmFja2J1dHRvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViY2QxYzcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItYmFja2J1dHRvbi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1iaW5kaW5nLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJpbmRpbmcuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTc0ZDU3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWJpbmRpbmcuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItY29tcGxleC10eXBlLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWNvbXBsZXgtdHlwZS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDYwNzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItY29tcGxleC10eXBlLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLWZpbmlzaGVkLXdzZGwuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItZmluaXNoZWQtd3NkbC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNTYzNDIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItZmluaXNoZWQtd3NkbC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1uZXctb3BlcmF0aW9uLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1vcGVyYXRpb24uanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGMzNGEzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1vcGVyYXRpb24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXNrZWxldG9uLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy1za2VsZXRvbi5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ZGRiMjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXNrZWxldG9uLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLW5ldy13aXphcmQuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXdpemFyZC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTUzZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3ItbmV3LXdpemFyZC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXRlbGVtZW50LWRpYWxvZy5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMvd3NkbGVkaXRvci1zZXRlbGVtZW50LWRpYWxvZy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0ODE2NWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0ZWxlbWVudC1kaWFsb2cuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0dHlwZS1kaWFsb2cuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc2V0dHlwZS1kaWFsb2cuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTM2YTY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNldHR5cGUtZGlhbG9nLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy93c2RsZWRpdG9yLXNtYXJ0LXJlbmFtZTEuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc21hcnQtcmVuYW1lMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNjhhNDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3dzZGxlZGl0b3Itc21hcnQtcmVuYW1lMS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWJhY2tidXR0b24uanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1iYWNrYnV0dG9uLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA5MjYwNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWJhY2tidXR0b24uanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUxLmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMS5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjRmNmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUxLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMi5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTIuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MThjNjA2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlMi5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTMuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmUzLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2YjZlNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTMuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU0LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMTg3ZGEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU0LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNS5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTUuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTYyMmVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNS5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTYuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU2LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNTNiOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTYuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU3LmpwZyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlNy5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmYjc1MjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU3LmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOC5qcGcgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTguanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjYxNzcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2ltYWdlcy94c2RlZGl0b3ItZmlndXJlOC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTkuanBnIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvaW1hZ2VzL3hzZGVkaXRvci1maWd1cmU5LmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjY0ZWVjYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9pbWFnZXMveHNkZWRpdG9yLWZpZ3VyZTkuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvbm90aWNlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvbm90aWNlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDE2Mzg3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL25vdGljZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTwhZG9jdHlwZSBodG1sIHB1YmxpYyAiLS8vdzNjLy9kdGQgaHRtbCA0LjAgdHJhbnNpdGlvbmFsLy9lbiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TElOSyBSRUw9IlNUWUxFU0hFRVQiIEhSRUY9ImJvb2suY3NzIiBDSEFSU0VUPSJJU08tODg1OS0xIgotCVRZUEU9InRleHQvY3NzIj4KLTx0aXRsZT5MZWdhbCBOb3RpY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotCi08aDM+PGEgTkFNRT0iTm90aWNlcyI+PC9hPk5vdGljZXM8L2gzPgotPHA+VGhlIG1hdGVyaWFsIGluIHRoaXMgZ3VpZGUgaXMgQ29weXJpZ2h0IChjKSBJQk0gQ29ycG9yYXRpb24gYW5kCi1vdGhlcnMgMjAwMCwgMjAwNi48L3A+Ci08cD48YSBocmVmPSJhYm91dC5odG1sIj5UZXJtcyBhbmQgY29uZGl0aW9ucyByZWdhcmRpbmcgdGhlIHVzZSBvZiB0aGlzCi1ndWlkZS48L2E+PC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE2M2I4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICA9IE1hc3RlciBVc2VyIERvYyBUT0MKLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhNjE3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPHBsdWdpbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0JCTx0b2MgZmlsZT0idG9jLnhtbCIgcHJpbWFyeT0idHJ1ZSIgLz4KLQk8L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMDYwZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotCSogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotCSogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotCSogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0JKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotCSogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLQkqIAotCSogQ29udHJpYnV0b3JzOgotCSogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotCSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gRGVmaW5lIHRoZSB0b3AgbGV2ZWwgdG9waWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPHRvYyBsYWJlbD0iV2ViIEFwcGxpY2F0aW9uIERldmVsb3BtZW50IFVzZXIgR3VpZGUiCi0JdG9waWM9InRvcGljcy9vdmVydmlldy5odG1sIj4KLQotCTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgV2ViIGFwcGxpY2F0aW9ucyI+Ci0JCTxsaW5rCi0JCQl0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJDcmVhdGluZyBKMkVFIGFuZCBlbnRlcnByaXNlIGFwcGxpY2F0aW9ucyI+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvanN0X2oyZWVfdG9jLnhtbCIgLz4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS5qc3QuZWpiLmRvYy51c2VyL2VqYl90b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJFZGl0aW5nIG1hcmt1cCBsYW5ndWFnZSBmaWxlcyIKLQkJaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIj4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MueG1sIiAvPgotCQk8bGluawotCQkJdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sIiAvPgotCQk8bGluawotCQkJdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLnhtbCIgLz4KLQkJPGxpbmsKLQkJCXRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RlZGl0b3JtYXBfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTwhLS0gPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sLmRvYy51c2VyL3htbF90b2MueG1sIi8+LS0+Ci0JPHRvcGljIGxhYmVsPSJEZXZlbG9waW5nIFdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9ucyI+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2UuanN0LndzLmRvYy51c2VyL3dlYnNlcnZpY2VfdG9jLnhtbCIgLz4KLQk8L3RvcGljPgotCTx0b3BpYyBsYWJlbD0iVXNpbmcgZGF0YSB0b29scyI+Ci0JCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LmRhdGF0b29scy5zZXJ2ZXIudWkuZG9jLnVzZXIvZGF0YWJhc2VfZXhwbG9yZXJfdG9jLnhtbCIgLz4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QuZGF0YXRvb2xzLnNlcnZlci51aS5kb2MudXNlci9kYXRhb3V0cHV0X3ZpZXdfdG9jLnhtbCIgLz4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QuZGF0YXRvb2xzLmNvbm5lY3Rpb24udWkuZG9jLnVzZXIvY29ubmVjdGlvbl91aV90b2MueG1sIiAvPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC5kYXRhdG9vbHMuZmUudWkuZG9jLnVzZXIvZmVfdWlfdG9jLnhtbCIgLz4KLQkJPGxpbmsgdG9jPSIuLi9vcmcuZWNsaXBzZS53c3QuZGF0YXRvb2xzLmRhdGEudWkuZG9jLnVzZXIvZGF0YV91aV90b2MueG1sIiAvPgotCQk8bGluayB0b2M9Ii4uL29yZy5lY2xpcHNlLndzdC5zcWxlZGl0b3IuZG9jLnVzZXIvc3FsZWRpdG9yX3RvYy54bWwiIC8+Ci0JPC90b3BpYz4KLQk8dG9waWMgbGFiZWw9IlVzaW5nIHRoZSBzZXJ2ZXIgdG9vbHMiPgotICAJCTxsaW5rIHRvYz0iLi4vb3JnLmVjbGlwc2Uud3N0LnNlcnZlci51aS5kb2MudXNlci93dHBfbWFpbl90b2MueG1sIiAvPgotCTwvdG9waWM+Ci0JPHRvcGljIGxhYmVsPSJMaW1pdGF0aW9ucyBhbmQgS25vd24gSXNzdWVzIiBocmVmPSJ0b3BpY3MvbGltaXRhdGlvbnMuaHRtbCIgLz4KLQk8dG9waWMgbGFiZWw9IkxlZ2FsIiBocmVmPSJub3RpY2VzLmh0bWwiIC8+Ci08L3RvYz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci90b3BpY3MvbGltaXRhdGlvbnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9saW1pdGF0aW9ucy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWI2ZjNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9saW1pdGF0aW9ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCFkb2N0eXBlIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIKLQlocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5XZWIgVG9vbHMgUHJvamVjdCBMaW1pdGF0aW9ucyBhbmQgS25vd24gSXNzdWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPldlYiBUb29scyBQcm9qZWN0IExpbWl0YXRpb25zIGFuZCBLbm93biBJc3N1ZXM8L2gxPgotPHA+VGhlIGZvbGxvd2luZyBhcmUgbGltaXRhdGlvbnMgYW5kIGtub3duIGlzc3Vlczo8L3A+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PGI+V2hlbiB1c2luZyBYRG9jbGV0IHRoZSBnZW5lcmF0aW9uIGRvZXMgbm90IGFwcGVhciB0byBydW4uPC9iPjwvZHQ+Ci08ZGQ+PHA+Q2F1c2U6IFhEb2NsZXQgaGFzIHNvbWUgbGltaXRhdGlvbnMgd2l0aCBsb25nIHBhdGggbmFtZXMuPC9wPgotPHA+U29sdXRpb246IFlvdSBzaG91bGQgaW5zdGFsbCBFY2xpcHNlIGFuZCB0aGUgV2ViIFRvb2xzIFBsYXRmb3JtIGludG8gYSBkaXJlY3Rvcnkgd2l0aCBhIHNob3J0Ci1wYXRoLjwvcD4KLTwvZGQ+Ci08ZHQgY2xhc3M9ImRsdGVybSI+PGI+V2hlbiBjcmVhdGluZyBhIFdlYiBzZXJ2aWNlIHlvdSBtYXkgc2VlIGEgbWVzc2FnZSBzaW1pbGFyIHRvIHRoZSBmb2xsb3dpbmcgb25lOjwvYj48L2R0PgotPGRkPjxwPjxzYW1wPm9yZy5hcGFjaGUuYXhpcy51dGlscy5KYXZhVXRpbHMgaXNBdHRhY2htZW50U3VwcG9ydGVkCi1XQVJOSU5HOiBVbmFibGUgdG8gZmluZCByZXF1aXJlZCBjbGFzc2VzIChqYXZheC5hY3RpdmF0aW9uLkRhdGFIYW5kbGVyIGFuZCAKLWphdmF4Lm1haWwuaW50ZXJuZXQuTWltZU11bHRpcGFydCkuIEF0dGFjaG1lbnQgc3VwcG9ydCBpcyBkaXNhYmxlZC4KLTwvc2FtcD48L3A+Ci08cD5DYXVzZTogQXR0YWNobWVudCBzdXBwb3J0IGlzIGRpc2FibGVkLjwvcD4KLTxwPlNvbHV0aW9uOiBUaGUgQXBhY2hlIEF4aXMgdG9vbHMgc2hvdWxkIGF1dG8tZGV0ZWN0IHRoZSBqYXZheC5hY3RpdmF0aW9uIGNsYXNzZXMgcHJvdmlkZWQgeW91IGFkZCAKLTxzYW1wPmFjdGl2YXRpb24uamFyPC9zYW1wPiB0byB0aGUgYnVpbGQgcGF0aCBvZiB0aGUgcHJvamVjdCB0byB3aGljaCB5b3UgYXJlIGdlbmVyYXRpbmcgeW91ciBXZWIgc2VydmljZSBvciBjbGllbnQuIAotRm9yIHNlcnZpY2VzLCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gbWFrZSBzdXJlIDxzYW1wPmFjdGl2YXRpb24uamFyPC9zYW1wPiBpcyBhdmFpbGFibGUgdG8gdGhlIFRvbWNhdCBKUkUsIGVpdGhlciBieSAKLWluY2x1ZGluZyBpdCBpbiB0aGUgc2VydmVyJ3MgZ2xvYmFsIGNsYXNzcGF0aCBvciBieSBwbGFjaW5nIGEgY29weSBvZiBhY3RpdmF0aW9uLmphciBpbnRvIHRoZSB0YXJnZXQgV2ViIAotcHJvamVjdCdzIDxzYW1wPmxpYi88L3NhbXA+IGRpcmVjdG9yeS4KLTwvcD4KLTwvZGQ+Ci08L2RsPgotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL3RvcGljcy9vdmVydmlldy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL292ZXJ2aWV3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4YzIxZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvdG9waWNzL292ZXJ2aWV3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IWRvY3R5cGUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIgotCWhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiAvPgotPHRpdGxlPldlYiBUb29scyBQcm9qZWN0IE92ZXJ2aWV3PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5PgotPGgxPldlYiBUb29scyBQcm9qZWN0IE92ZXJ2aWV3PC9oMT4KLTxwPlRoZSBXZWIgVG9vbHMgUHJvamVjdCBhaW1zIHRvIHByb3ZpZGUgY29tbW9uIGluZnJhc3RydWN0dXJlIGF2YWlsYWJsZQotdG8gYW55IEVjbGlwc2UtYmFzZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgdGFyZ2V0aW5nIFdlYi1lbmFibGVkCi1hcHBsaWNhdGlvbnMuPC9wPgotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYyZjY5ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwY2Y0ZGExLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL0VkaXRvckR0ZENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotPGRlc2NyaXB0aW9uLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAyMCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBmaWxlLgotCi1UaGUgbGluZSBkZWxpbWl0ZXJzIGFyZSBDdHJsLUogKFVOSVgpLCBDdHJsLU0gKE1hYyksIG9yIEN0cmwtTSBDdHJsLUogKFdpbmRvd3MpLjwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0id2VieDAwMjEiPgotPGRlc2NyaXB0aW9uPlRoaXMgcGFnZSBsZXRzIHlvdSBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcgdGhhdCB0aGUgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS4KLQotVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQotVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBwdXNoIGJ1dHRvbnMgb3BlbiA8Yj5Db2xvcjwvYj4gZGlhbG9nIGJveGVzIHRoYXQgYWxsb3cgeW91IHRvIHNwZWNpZnkgdGV4dCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycywgcmVzcGVjdGl2ZWx5LiBTZWxlY3QgdGhlIDxiPkJvbGQ8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlIGFwcGVhciBpbiBib2xkLgotCi1DbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0PC9iPiBwdXNoIGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5odG1sIiBsYWJlbD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IndlYngwMDIyIj4KLTxkZXNjcmlwdGlvbj5UZW1wbGF0ZXMgYXJlIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIERURCBmaWxlIHdoZW4gaXQgaXMgY3JlYXRlZC4KLQotQ2xpY2sgPGI+TmV3PC9iPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5IG5ldyB0ZW1wbGF0ZS4KLQotU3VwcGx5IGEgbmV3IHRlbXBsYXRlIDxiPk5hbWU8L2I+IGFuZCA8Yj5EZXNjcmlwdGlvbjwvYj4uIFRoZSA8Yj5Db250ZXh0PC9iPiBmb3IgdGhlIHRlbXBsYXRlIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIFNwZWNpZnkgdGhlIDxiPlBhdHRlcm48L2I+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nIHRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0LgotCi1JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxiPkluc2VydCBWYXJpYWJsZTwvYj4gYnV0dG9uIGFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLiBGb3IgZXhhbXBsZSwgdGhlIDxiPmRhdGU8L2I+IHZhcmlhYmxlIGluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuCi0KLVlvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lIFByZWZlcmVuY2VzIHBhZ2UuCi0KLUlmIHlvdSBoYXZlIGEgdGVtcGxhdGUgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBjbGVhciBpdHMgY2hlY2sgYm94IGluIHRoZSA8Yj5UZW1wbGF0ZXM8L2I+IHByZWZlcmVuY2VzIHBhZ2UuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5odG1sIiBsYWJlbD0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sIiBsYWJlbD0iQ3JlYXRpbmcgRFREIGZpbGVzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0iZHRkdzAwMTAiPgotPGRlc2NyaXB0aW9uPkNsaWNrIHRoZSA8Yj5Vc2UgRFREIFRlbXBsYXRlPC9iPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8gdXNlIGEgRFREIHRlbXBsYXRlIGFzIHRoZSBpbml0aWFsIGNvbnRlbnQgaW4geW91ciBuZXcgRFREIHBhZ2UuIEEgbGlzdCBvZiBhdmFpbGFibGUgRFREIHRlbXBsYXRlcyBpcyBsaXN0ZWQgLSBzZWxlY3QgdGhlIG9uZSB5b3Ugd2FudCB0byB1c2UuIEEgcHJldmlldyBvZiB5b3VyIERURCBmaWxlIGlzIHNob3duIG9uY2UgeW91IHNlbGVjdCBhIERURCB0ZW1wbGF0ZS48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwiIGxhYmVsPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0ZHRkLmh0bWwiIGxhYmVsPSJDcmVhdGluZyBEVEQgZmlsZXMiLz4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0czIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvRWRpdG9yRHRkQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0NGQyNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9FZGl0b3JEdGRDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci08ZGVzY3JpcHRpb24vPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9ImR0ZHNvdXJjZV9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgRFREIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uLgotCi1UaGUgZWRpdG9yIHByb3ZpZGVzIHRleHQgZWRpdGluZyBmZWF0dXJlcyBzdWNoIGFzIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLgotPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M5NmRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNTk4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NGNhODUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvckR0ZENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgRWRpdG9yRHRkQ29udGV4dHMyLnhtbAotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjNTJiYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGQudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA0IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICAgID0gRFREIEVkaXRvciBpbmZvcG9wcwotcGx1Z2luUHJvdmlkZXIgPSBFY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZC51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhNTdmYmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yRHRkQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckR0ZENvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5kdGQuY29yZSIvPgotPC9leHRlbnNpb24+Ci0KLQotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgwZmM5Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyXzEuMC4wLmphcgotdGVtcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ4NmQ3YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmYTVjOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDhiNWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjJhYzY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5MzY4Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjQ5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjhhNTE2My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFRERWRpdG9ybWFwX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiIgIm1hcC5kdGQiPg0KLTxtYXAgY29sbGVjdGlvbi10eXBlPSJzZXF1ZW5jZSIgdGl0bGU9IkRURCBFZGl0b3IiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dvcmtkdGRzLmRpdGEiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggRFREcyIgdHlwZT0iY29uY2VwdCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90Y3JldGR0ZC5kaXRhIiBsaW5raW5nPSJub3JtYWwiIG5hdnRpdGxlPSJDcmVhdGluZyBEVERzIg0KLXR5cGU9InRhc2siPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAtIE92ZXJ2aWV3Ig0KLXR5cGU9ImNvbmNlcHQiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c3Jjc3QuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RkdGVtcGx0LmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90aW1wdGR0ZC5kaXRhIiBuYXZ0aXRsZT0iSW1wb3J0aW5nIERURHMiIHR5cGU9InRhc2siPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmFsZHRkLmRpdGEiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIERURHMiIHR5cGU9InRhc2siPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yZHRkaWNvbnMuZGl0YSIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3IiDQotdHlwZT0icmVmZXJlbmNlIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RUREVkaXRvcm1hcF90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTU5ZWI4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9EVERFZGl0b3JtYXBfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkRURCBFZGl0b3IiIHRvcGljPSJ0b3BpY3MvY3dvcmtkdGRzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggRFREcyIgaHJlZj0idG9waWNzL2N3b3JrZHRkcy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgRFREcyIgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmh0bWwiPgotPHRvcGljIGxhYmVsPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBocmVmPSJ0b3BpY3MvdGVkdHNyY3N0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90ZHRlbXBsdC5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgRFREcyIgaHJlZj0idG9waWNzL3RpbXB0ZHRkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBEVERzIiBocmVmPSJ0b3BpY3MvdHZhbGR0ZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3IiIGhyZWY9InRvcGljcy9yZHRkaWNvbnMuaHRtbCIvPgotPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL0RURHJlZnRhYmxlLmRpdGFtYXAgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFREcmVmdGFibGUuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA1YjAzMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvRFREcmVmdGFibGUuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iICJtYXAuZHRkIj4NCi08bWFwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmRpdGEiIGxpbmtpbmc9Im5vcm1hbCIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgbmV3IERURCINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAtIE92ZXJ2aWV3Ig0KLXR5cGU9ImNvbmNlcHQiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NkdGRvdmVyLmRpdGEiIG5hdnRpdGxlPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb24gLSBPdmVydmlldyINCi10eXBlPSJjb25jZXB0Ij48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZhbGR0ZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBEVERzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmRpdGEiIGxpbmtpbmc9Im5vcm1hbCIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgbmV3IERURCINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGR0ZW1wbHQuZGl0YSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJkZjg5ZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAzLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTQyODg3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBEVERFZGl0b3JtYXBfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgaW1hZ2VzLyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9Db21tZW50LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTYxMWQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfRWxlbWVudC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmNDg4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbGVtZW50LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbnRpdHkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQxNTA2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL0FERF9FbnRpdHlfUmVmZXJlbmNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWZhOWI5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfTm90YXRpb24uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9BRERfTm90YXRpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FkMDg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQUREX05vdGF0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliYTgyNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRENob2ljZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmYzZjk3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmNkZTk0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvYXR0cmlidXRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvYXR0cmlidXRlX2xpc3QuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZjAyOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25EVERGaWxlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbkRUREZpbGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzk5MTQzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbkRUREZpbGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYW55LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmFueS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMTdkOTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVtcHR5LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvbmVtcHR5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5ZTNkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbXB0eS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9vcmdhbml6ZV9kdGRfbG9naWNhbGx5LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkzYzZiYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL29yZ2FuaXplX2R0ZF9sb2dpY2FsbHkuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zb3J0LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9pbWFnZXMvc29ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzYzVkMGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9zb3J0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWM2MGE1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMSI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPHBsdWdpbj4KLQotICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICA8dG9jIGZpbGU9IkRUREVkaXRvcm1hcF90b2MueG1sIi8+Ci0gIDwvZXh0ZW5zaW9uPgotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotCQk8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCIvPiAgICAgCi0JPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci5tYXBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2NiZDcyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxtYXBsaXN0IHZlcnNpb249IjMuNi4yIj4NCi0gIDxuYXY+DQotICAgIDxtYXAgZmlsZT0iRFRERWRpdG9ybWFwX3RvYy5kaXRhbWFwIi8+DQotICA8L25hdj4NCi0gIDxsaW5rPg0KLSAgICA8bWFwIGZpbGU9IkRUREVkaXRvcm1hcF90b2MuZGl0YW1hcCIvPg0KLSAgICA8bWFwIGZpbGU9IkRURHJlZnRhYmxlLmRpdGFtYXAiLz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjJiOWQ1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0ic2VjdXJpdHkiIGNvbnRlbnQ9InB1YmxpYyIgLz4KLTxtZXRhIG5hbWU9IlJvYm90cyIgY29udGVudD0iaW5kZXgsZm9sbG93IiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBuYW1lPSJEQy5Gb3JtYXQiIGNvbnRlbnQ9IlhIVE1MIiAvPgotPCEtLSBBbGwgcmlnaHRzIHJlc2VydmVkLiBMaWNlbnNlZCBNYXRlcmlhbHMgUHJvcGVydHkgb2YgSUJNIC0tPgotPCEtLSBVUyBHb3Zlcm5tZW50IFVzZXJzIFJlc3RyaWN0ZWQgUmlnaHRzIC0tPgotPCEtLSBVc2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgcmVzdHJpY3RlZCBieSAtLT4KLTwhLS0gR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAtLT4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImlibWRpdGEuY3NzIiAvPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0ic3dnX2luZm9fY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5JbmRleDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLTxoMT5JbmRleDwvaDE+Ci08c3Ryb25nPkQ8L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5EVEQgZWRpdG9yCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3JkdGRpY29ucy5odG1sI3JpY29ucyI+aWNvbnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+RFREIHRlbXBsYXRlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZHRlbXBsdC5odG1sI3R3bWFjcm8iPmNyZWF0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPkRURHMgKGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMpCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RjcmV0ZHRkLmh0bWwjdGNyZXRkdGQiPmNyZWF0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGltcHRkdGQuaHRtbCN0aW1wdGR0ZCI+aW1wb3J0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2R0ZG92ZXIuaHRtbCNjZHRkb3ZlciI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90dmFsZHRkLmh0bWwjdHZhbGR0ZCI+dmFsaWRhdGluZzwvYT4KLTwvbGk+Ci08bGk+WE1MIGVkaXRvciBwcmVmZXJlbmNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0c3Jjc3QuaHRtbCN0dGFnaGlsdCI+c2V0dGluZyBoaWdobGlnaHRpbmcgc3R5bGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz5UPC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+dGVtcGxhdGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RkdGVtcGx0Lmh0bWwjdHdtYWNybyI+RFREczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPlg8L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5YTUwgZWRpdG9yCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+cHJlZmVyZW5jZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHNyY3N0Lmh0bWwjdHRhZ2hpbHQiPnNldHRpbmcgRFREIGhpZ2hsaWdodGluZyBzdHlsZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY0NTliMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJEVERzIChkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zKSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXRkdGQuaHRtbCN0Y3JldGR0ZCIgdGl0bGU9IkNyZWF0aW5nIERURHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NkdGRvdmVyLmh0bWwjY2R0ZG92ZXIiIHRpdGxlPSJEb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iWE1MIGVkaXRvciBwcmVmZXJlbmNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyBoaWdobGlnaHRpbmcgc3R5bGVzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c3Jjc3QuaHRtbCN0dGFnaGlsdCIgdGl0bGU9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGltcHRkdGQuaHRtbCN0aW1wdGR0ZCIgdGl0bGU9IkltcG9ydGluZyBEVERzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R2YWxkdGQuaHRtbCN0dmFsZHRkIiB0aXRsZT0iVmFsaWRhdGluZyBEVERzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcmVmZXJlbmNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyBEVEQgaGlnaGxpZ2h0aW5nIHN0eWxlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNyY3N0Lmh0bWwjdHRhZ2hpbHQiIHRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJEVEQgdGVtcGxhdGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZHRlbXBsdC5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ0ZW1wbGF0ZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJEVERzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGR0ZW1wbHQuaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRFREIGVkaXRvciI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imljb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcmR0ZGljb25zLmh0bWwjcmljb25zIiB0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEwY2U4Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgTkxTX01FU1NBR0VGT1JNQVRfVkFSCi0KLXBsdWdpbk5hbWUgICAgID0gRFREIEVkaXRvciBkb2N1bWVudGF0aW9uCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWM2MGE1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjEiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLSAgPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgPHRvYyBmaWxlPSJEVERFZGl0b3JtYXBfdG9jLnhtbCIvPgotICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLQkJPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4gICAgIAotCTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NkdGRvdmVyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NWZjMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIiAgImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2R0ZG92ZXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSAtIG92ZXJ2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIHByb3ZpZGVzIHlvdSB3aXRoIHRoZSBtZWFucyB0bw0KLXZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91DQotY2FuIHNwZWNpZnkgcnVsZXMgdGhhdCBjb250cm9sIHRoZSBzdHJ1Y3R1cmUgb2YgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZQ0KLXRoZSBEVEQgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5EVERzIChkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zKTxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+QSBEVEQgY2FuIGNvbnRhaW4gZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBub3RhdGlvbnMsDQotYW5kIGVudGl0aWVzIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4gSXQgYWxzbyBlc3RhYmxpc2hlcw0KLWNvbnN0cmFpbnRzIGZvciBob3cgZWFjaCBlbGVtZW50LCBhdHRyaWJ1dGUsIG5vdGF0aW9uLCBhbmQgZW50aXR5IGNhbiBiZSB1c2VkDQotd2l0aGluIGFueSBvZiB0aGUgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS48L3A+DQotPHA+VG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCB0aGUgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieQ0KLWEgRFREIChvciBhbiBYTUwgc2NoZW1hKSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURA0KLShvciBYTUwgc2NoZW1hKS48L3A+DQotPHA+Q2VydGFpbiBYTUwgcGFyc2VycyBoYXZlIHRoZSBhYmlsaXR5IHRvIHJlYWQgRFREcyBhbmQgY2hlY2sgdG8gc2VlIGlmIHRoZQ0KLVhNTCBmaWxlIGl0IGlzIHJlYWRpbmcgZm9sbG93cyBhbGwgb2YgdGhvc2UgcnVsZXMuIFdoaWxlIHRoZSBwYXJzZXIgaXMgcmVhZGluZw0KLXRoZSBYTUwgZmlsZSwgaXQgd2lsbCBjaGVjayBlYWNoIGxpbmUgdG8gYmUgc3VyZSB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSBydWxlcw0KLXRoYXQgYXJlIGxhaWQgb3V0IGluIHRoZSBEVEQgZmlsZS4gSWYgdGhlcmUgaXMgYSBwcm9ibGVtLCB0aGUgcGFyc2VyIGdlbmVyYXRlcw0KLWFuIGVycm9yIGFuZCBwb2ludHMgdG8gd2hlcmUgdGhlIGVycm9yIG9jY3VycyBpbiB0aGUgWE1MIGZpbGUuIFRoaXMga2luZCBvZg0KLXBhcnNlciBpcyBjYWxsZWQgYSB2YWxpZGF0aW5nIHBhcnNlciBiZWNhdXNlIGl0IHZhbGlkYXRlcyB0aGUgY29udGVudCBvZiB0aGUNCi1YTUwgZmlsZSBhZ2FpbnN0IHRoZSBEVEQuPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jZHRkb3Zlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmUzZWE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY2R0ZG92ZXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMgKERURHMpIC0gb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgcHJvdmlkZXMgeW91IHdpdGggdGhlIG1lYW5zIHRvIHZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91IGNhbiBzcGVjaWZ5IHJ1bGVzIHRoYXQgY29udHJvbCB0aGUgc3RydWN0dXJlIG9mIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgbWVhbnMgdG8gdmFsaWRhdGUgWE1MIGZpbGVzIGFnYWluc3QgYSBzZXQgb2YgcnVsZXMuIFdoZW4geW91IGNyZWF0ZSBhIERURCBmaWxlLCB5b3UgY2FuIHNwZWNpZnkgcnVsZXMgdGhhdCBjb250cm9sIHRoZSBzdHJ1Y3R1cmUgb2YgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iRFREcyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyksIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREcyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyksIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2R0ZG92ZXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2R0ZG92ZXIiPjxhIG5hbWU9ImNkdGRvdmVyIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Eb2N1bWVudCB0eXBlIGRlZmluaXRpb25zIChEVERzKSAtIG92ZXJ2aWV3PC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBwcm92aWRlcyB5b3Ugd2l0aCB0aGUgbWVhbnMgdG8KLXZhbGlkYXRlIFhNTCBmaWxlcyBhZ2FpbnN0IGEgc2V0IG9mIHJ1bGVzLiBXaGVuIHlvdSBjcmVhdGUgYSBEVEQgZmlsZSwgeW91Ci1jYW4gc3BlY2lmeSBydWxlcyB0aGF0IGNvbnRyb2wgdGhlIHN0cnVjdHVyZSBvZiBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlCi10aGUgRFREIGZpbGUuPC9wPgotCi08cD5BIERURCBjYW4gY29udGFpbiBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIG5vdGF0aW9ucywKLWFuZCBlbnRpdGllcyBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIEl0IGFsc28gZXN0YWJsaXNoZXMKLWNvbnN0cmFpbnRzIGZvciBob3cgZWFjaCBlbGVtZW50LCBhdHRyaWJ1dGUsIG5vdGF0aW9uLCBhbmQgZW50aXR5IGNhbiBiZSB1c2VkCi13aXRoaW4gYW55IG9mIHRoZSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLjwvcD4KLQotPHA+VG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCB0aGUgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieQotYSBEVEQgKG9yIGFuIFhNTCBzY2hlbWEpLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFRECi0ob3IgWE1MIHNjaGVtYSkuPC9wPgotCi08cD5DZXJ0YWluIFhNTCBwYXJzZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVhZCBEVERzIGFuZCBjaGVjayB0byBzZWUgaWYgdGhlCi1YTUwgZmlsZSBpdCBpcyByZWFkaW5nIGZvbGxvd3MgYWxsIG9mIHRob3NlIHJ1bGVzLiBXaGlsZSB0aGUgcGFyc2VyIGlzIHJlYWRpbmcKLXRoZSBYTUwgZmlsZSwgaXQgd2lsbCBjaGVjayBlYWNoIGxpbmUgdG8gYmUgc3VyZSB0aGF0IGl0IGNvbmZvcm1zIHRvIHRoZSBydWxlcwotdGhhdCBhcmUgbGFpZCBvdXQgaW4gdGhlIERURCBmaWxlLiBJZiB0aGVyZSBpcyBhIHByb2JsZW0sIHRoZSBwYXJzZXIgZ2VuZXJhdGVzCi1hbiBlcnJvciBhbmQgcG9pbnRzIHRvIHdoZXJlIHRoZSBlcnJvciBvY2N1cnMgaW4gdGhlIFhNTCBmaWxlLiBUaGlzIGtpbmQgb2YKLXBhcnNlciBpcyBjYWxsZWQgYSB2YWxpZGF0aW5nIHBhcnNlciBiZWNhdXNlIGl0IHZhbGlkYXRlcyB0aGUgY29udGVudCBvZiB0aGUKLVhNTCBmaWxlIGFnYWluc3QgdGhlIERURC48L3A+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIiB0aXRsZT0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iPkNyZWF0aW5nIERURHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODUwZDQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0id29ya2luZ3dpdGhkdGRzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Xb3JraW5nIHdpdGggRFREczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9zaG9ydGRlc2M+DQotPGNvbmJvZHk+PC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMDM5NT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmtkdGRzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0M2E1ODEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya2R0ZHMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ildvcmtpbmcgd2l0aCBEVERzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOiIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90aW1wdGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZhbGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcmR0ZGljb25zLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0id29ya2luZ3dpdGhkdGRzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIERURHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtpbmd3aXRoZHRkcyI+PGEgbmFtZT0id29ya2luZ3dpdGhkdGRzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggRFREczwvaDE+Ci0KLQotPGRpdj48cD5UaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotPC9kaXY+Ci0KLTxkaXY+Ci08dWwgY2xhc3M9InVsbGlua3MiPgotPGxpIGNsYXNzPSJ1bGNoaWxkbGluayI+PHN0cm9uZz48YSBocmVmPSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCI+Q3JlYXRpbmcgRFREczwvYT48L3N0cm9uZz48YnIgLz4KLUEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3RpbXB0ZHRkLmh0bWwiPkltcG9ydGluZyBEVERzPC9hPjwvc3Ryb25nPjxiciAvPgotSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIERURCBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURCBlZGl0b3IuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3R2YWxkdGQuaHRtbCI+VmFsaWRhdGluZyBEVERzPC9hPjwvc3Ryb25nPjxiciAvPgotVmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuPC9saT4KLTxsaSBjbGFzcz0idWxjaGlsZGxpbmsiPjxzdHJvbmc+PGEgaHJlZj0iLi4vdG9waWNzL3JkdGRpY29ucy5odG1sIj5JY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yPC9hPjwvc3Ryb25nPjxiciAvPgotVGhlc2UgRFREIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgdmlldy48L2xpPgotPC91bD4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmR0ZGljb25zLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDY5NWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmljb25zIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBEVEQgZWRpdG9yPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZXNlIERURCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIHZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREIGVkaXRvcjxpbmRleHRlcm0+aWNvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHRhYmxlPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeT5JY29uJm5ic3A7PC9lbnRyeT4NCi08ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGhlYWQ+DQotPHRib2R5Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSI+PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uYW55LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEFOWSBjb250ZW50DQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PkFOWSBjb250ZW50IChjb250ZW50IG1vZGVsKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgYXR0cmlidXRlDQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWF0dHJpYnV0ZSBsaXN0IGljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGUgbGlzdDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQUREX0NvbW1lbnQuZ2lmIj48YWx0PlRoaXMNCi1ncmFwaGljIGlzIHRoZSBjb21tZW50IGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMxIj5jb21tZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudA0KLW1vZGVsIC0gY2hvaWNlIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbnRlbnQgbW9kZWwgLSBjaG9pY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGNvbnRlbnQNCi1tb2RlbCAtIHNlcXVlbmNlIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9BRERfRWxlbWVudC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50DQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PmVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL25lbXB0eS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBFTVBUWQ0KLWNvbnRlbnQgKGNvbnRlbnQgbW9kZWwpIGljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5FTVBUWSBjb250ZW50IChjb250ZW50IG1vZGVsKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9BRERfRW50aXR5LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVudGl0eQ0KLWljb248L2FsdD48L2ltYWdlPiA8L2VudHJ5Pg0KLTxlbnRyeT5lbnRpdHk8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQUREX05vdGF0aW9uLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIG5vdGF0aW9uDQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5Pm5vdGF0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9BRERfRW50aXR5X1JlZmVyZW5jZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljDQotaXMgdGhlIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIGljb248L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PnBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPHNlY3Rpb24+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZHRkaWNvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwMWU3ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JkdGRpY29ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGVzZSBEVEQgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSB2aWV3LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGVzZSBEVEQgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURCBlZGl0b3IsIGljb25zIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRFREIGVkaXRvciwgaWNvbnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmljb25zIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgRFREIGVkaXRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmljb25zIj48YSBuYW1lPSJyaWNvbnMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkljb25zIHVzZWQgaW4gdGhlIERURCBlZGl0b3I8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZXNlIERURCBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lIHZpZXcuPC9wPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0aGVhZCBhbGlnbj0ibGVmdCI+Ci08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGlkPSJOMTAwNjMiPkljb27CoDwvdGg+Ci0KLTx0aCB2YWxpZ249InRvcCIgaWQ9Ik4xMDA2QSI+RGVzY3JpcHRpb248L3RoPgotCi08L3RyPgotCi08L3RoZWFkPgotCi08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPiZuYnNwOzwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+Jm5ic3A7PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uYW55LmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIEFOWSBjb250ZW50JiMxMDtpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPkFOWSBjb250ZW50IChjb250ZW50IG1vZGVsKTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9hdHRyaWJ1dGUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgYXR0cmlidXRlJiMxMDtpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2QSAiPmF0dHJpYnV0ZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9hdHRyaWJ1dGVfbGlzdC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7YXR0cmlidXRlIGxpc3QgaWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5hdHRyaWJ1dGUgbGlzdDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+PGltZyBzcmM9Ii4uL2ltYWdlcy9BRERfQ29tbWVudC5naWYiIGFsdD0iVGhpcyYjMTA7Z3JhcGhpYyBpcyB0aGUgY29tbWVudCBpY29uIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+Y29tbWVudDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQ2hvaWNlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGNvbnRlbnQmIzEwO21vZGVsIC0gY2hvaWNlIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5jb250ZW50IG1vZGVsIC0gY2hvaWNlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RTZXF1ZW5jZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBjb250ZW50JiMxMDttb2RlbCAtIHNlcXVlbmNlIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5jb250ZW50IG1vZGVsIC0gc2VxdWVuY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvQUREX0VsZW1lbnQuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgZWxlbWVudCYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5lbGVtZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uZW1wdHkuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgRU1QVFkmIzEwO2NvbnRlbnQgKGNvbnRlbnQgbW9kZWwpIGljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+RU1QVFkgY29udGVudCAoY29udGVudCBtb2RlbCk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2MyAiPjxpbWcgc3JjPSIuLi9pbWFnZXMvQUREX0VudGl0eS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBlbnRpdHkmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZBICI+ZW50aXR5PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNjMgIj48aW1nIHNyYz0iLi4vaW1hZ2VzL0FERF9Ob3RhdGlvbi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBub3RhdGlvbiYjMTA7aWNvbiIgLz4gPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5ub3RhdGlvbjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDYzICI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvQUREX0VudGl0eV9SZWZlcmVuY2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyYjMTA7aXMgdGhlIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkEgIj5wYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL2N3b3JrZHRkcy5odG1sIiB0aXRsZT0iVGhpcyBzZWN0aW9ucyBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgZm9sbG93aW5nOiI+V29ya2luZyB3aXRoIERURHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTM4MzJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGNyZXRkdGQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIERURHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkNyZWF0aW5nIGEgbmV3IGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKTwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbg0KLWJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdA0KLWl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywNCi1hbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlDQotRFREIGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREcyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyk8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPkZvbGxvdw0KLXRoZXNlIHN0ZXBzIHRvIGNyZWF0ZSBhIG5ldyBEVEQ6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JZiBuZWNlc3NhcnksIGNyZWF0ZSBhIHByb2plY3QgdG8gY29udGFpbiB0aGUgRFRELjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSB3b3JrYmVuY2gsIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5GaWxlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUw8L3VpY29udHJvbD4NCi08dWljb250cm9sPiBEVEQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBEVEQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBuYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mDQotdGhlIERURCwgZm9yIGV4YW1wbGUgPHVzZXJpbnB1dD5NeURURC5kdGQ8L3VzZXJpbnB1dD4uPC9jbWQ+PGluZm8+VGhlIG5hbWUNCi1vZiB5b3VyIERURCBmaWxlIG11c3QgZW5kIHdpdGggdGhlIGV4dGVuc2lvbiA8dXNlcmlucHV0Pi5kdGQ8L3VzZXJpbnB1dD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gdXNlIGEgRFREIHRlbXBsYXRlIGFzIHRoZSBiYXNpcyBmb3IgeW91ciBuZXcgRFREIGZpbGUuDQotVG8gZG8gc28sIGNsaWNrIHRoZSA8dWljb250cm9sPlVzZSBEVEQgVGVtcGxhdGU8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQNCi1zZWxlY3QgdGhlIHRlbXBsYXRlIHlvdSB3YW50IHRvIHVzZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBEVEQgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGF1dG9tYXRpY2FsbHksIGJ5IGRlZmF1bHQsDQotb3BlbnMgaW4gdGhlIERURCBlZGl0b3IuIEluIHRoZSBEVEQgZWRpdG9yLCB5b3UgY2FuIG1hbnVhbGx5IGFkZCBlbGVtZW50cywNCi1hdHRyaWJ1dGVzLCBub3RhdGlvbnMsIGVudGl0aWVzLCBhbmQgY29tbWVudHMgdG8gdGhlIERURC4gSWYgeW91IGNsb3NlIHRoZQ0KLWZpbGUsIGFuZCB3YW50IHRvIGxhdGVyIHJlLW9wZW4gaXQgaW4gdGhlIERURCBlZGl0b3IsIGRvdWJsZS1jbGljayBpdCBpbiB0aGUNCi1OYXZpZ2F0b3Igdmlldy48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTJmNDBjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXRkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB2YWxpZGF0ZSBhbiBYTUwgZmlsZS4gQWZ0ZXIgeW91IGhhdmUgY3JlYXRlZCBhIERURCwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LCBhZGRpbmcgZGVjbGFyYXRpb25zIHRoYXQgZGVmaW5lIGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBlbnRpdGllcywgYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZSBEVEQgZmlsZS4iIC8+Ci08bWV0YSBjb250ZW50PSJEVERzIChkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zKSwgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzIChkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zKSwgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNyZXRkdGQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIG5ldyBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCk8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV0ZHRkIj48YSBuYW1lPSJ0Y3JldGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgRFREczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBkb2N1bWVudCB0eXBlIGRlZmluaXRpb24gKERURCkgY29udGFpbnMgYSBzZXQgb2YgcnVsZXMgdGhhdCBjYW4KLWJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdAotaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLAotYW5kIG5vdGF0aW9ucywgYW5kIGhvdyB0aGV5IGNhbiBiZSB1c2VkIGZvciBhbnkgWE1MIGZpbGVzIHRoYXQgcmVmZXJlbmNlIHRoZQotRFREIGZpbGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cCAvPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5Gb2xsb3cKLXRoZXNlIHN0ZXBzIHRvIGNyZWF0ZSBhIG5ldyBEVEQ6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgbmVjZXNzYXJ5LCBjcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIERURC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgd29ya2JlbmNoLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBEVEQ8L3NwYW4+PC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgRFRELjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIG5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mCi10aGUgRFRELCBmb3IgZXhhbXBsZSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPk15RFRELmR0ZDwva2JkPi48L3NwYW4+IFRoZSBuYW1lCi1vZiB5b3VyIERURCBmaWxlIG11c3QgZW5kIHdpdGggdGhlIGV4dGVuc2lvbiA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPi5kdGQ8L2tiZD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiB1c2UgYSBEVEQgdGVtcGxhdGUgYXMgdGhlIGJhc2lzIGZvciB5b3VyIG5ldyBEVEQgZmlsZS4KLVRvIGRvIHNvLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VXNlIERURCBUZW1wbGF0ZTwvc3Bhbj4gY2hlY2sgYm94LCBhbmQKLXNlbGVjdCB0aGUgdGVtcGxhdGUgeW91IHdhbnQgdG8gdXNlLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBEVEQgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGF1dG9tYXRpY2FsbHksIGJ5IGRlZmF1bHQsCi1vcGVucyBpbiB0aGUgRFREIGVkaXRvci4gSW4gdGhlIERURCBlZGl0b3IsIHlvdSBjYW4gbWFudWFsbHkgYWRkIGVsZW1lbnRzLAotYXR0cmlidXRlcywgbm90YXRpb25zLCBlbnRpdGllcywgYW5kIGNvbW1lbnRzIHRvIHRoZSBEVEQuIElmIHlvdSBjbG9zZSB0aGUKLWZpbGUsIGFuZCB3YW50IHRvIGxhdGVyIHJlLW9wZW4gaXQgaW4gdGhlIERURCBlZGl0b3IsIGRvdWJsZS1jbGljayBpdCBpbiB0aGUKLU5hdmlnYXRvciB2aWV3LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIHRpdGxlPSJUaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6Ij5Xb3JraW5nIHdpdGggRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzODA4MTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZHRlbXBsdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+Ci08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4KLTx0YXNrIGlkPSJ0d21hY3JvIiB4bWw6bGFuZz0iZW4tdXMiPgotPHRpdGxlPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC90aXRsZT4KLTx0aXRsZWFsdHM+Ci08c2VhcmNodGl0bGU+V29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXM8L3NlYXJjaHRpdGxlPgotPC90aXRsZWFsdHM+Ci08c2hvcnRkZXNjPlRlbXBsYXRlcyBhcmUgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvCi1hIERURCBmaWxlIHdoZW4gaXQgaXMgY3JlYXRlZC4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUKLWEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQKLXRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvc2hvcnRkZXNjPgotPHByb2xvZz48bWV0YWRhdGE+Ci08a2V5d29yZHM+PGluZGV4dGVybT5EVEQgdGVtcGxhdGVzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPgotPGluZGV4dGVybT50ZW1wbGF0ZXM8aW5kZXh0ZXJtPkRURHM8L2luZGV4dGVybT48L2luZGV4dGVybT4KLTwva2V5d29yZHM+Ci08L21ldGFkYXRhPjwvcHJvbG9nPgotPHRhc2tib2R5PgotPGNvbnRleHQ+PHA+VG8gY3JlYXRlIGEgbmV3IERURCB0ZW1wbGF0ZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4KLTxzdGVwcz4KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPgotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+RFREIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5EVEQKLVRlbXBsYXRlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgY29tcGxldGVseQotbmV3IHRlbXBsYXRlLjwvY21kPjwvc3RlcD4KLTxzdGVwPjxjbWQ+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBhbmQgPHVpY29udHJvbD5EZXNjcmlwdGlvbjwvdWljb250cm9sPi48L2NtZD4KLTwvc3RlcD4KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5Db250ZXh0PC91aWNvbnRyb2w+IGZvciB0aGUgdGVtcGxhdGUuPC9jbWQ+Ci08aW5mbz5UaGlzIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsCi1saXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiA8L2luZm8+PC9zdGVwPgotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcKLXRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQKLWFzc2lzdC48L2NtZD48L3N0ZXA+Ci08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHVpY29udHJvbD5JbnNlcnQgVmFyaWFibGU8L3VpY29udHJvbD4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC4gPC9jbWQ+PGluZm8+Rm9yIGV4YW1wbGUsIHRoZSA8Yj5kYXRlPC9iPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4gPC9pbmZvPjwvc3RlcD4KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvCi1zYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+Ci08L3N0ZXBzPgotPHBvc3RyZXE+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUKLXByZWZlcmVuY2VzIHBhZ2UuIDxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUgdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlLAotYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyIGluIHRoZSBEVEQgdGVtcGxhdGVzIGxpc3Qgd2hlbgoteW91IGNyZWF0ZSBhIGZpbGUsIGdvIHRvIHRoZTxiPiBEVEQgVGVtcGxhdGVzPC9iPiBwcmVmZXJlbmNlcyBwYWdlIGFuZCBjbGVhcgotaXRzIGNoZWNrIGJveC48L3A+PC9wb3N0cmVxPgotPC90YXNrYm9keT4KLTwvdGFzaz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGR0ZW1wbHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMzYTc1NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkdGVtcGx0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggRFREIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUZW1wbGF0ZXMgYXJlIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIERURCBmaWxlIHdoZW4gaXQgaXMgY3JlYXRlZC4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGVtcGxhdGVzIGFyZSBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBEVEQgZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlIGEgY2VydGFpbiBwaWVjZSBvZiBjb2RlIHlvdSB3YW50IHRvIHJldXNlIHNldmVyYWwgdGltZXMsIGFuZCB5b3UgZG8gbm90IHdhbnQgdG8gd3JpdGUgaXQgb3V0IGV2ZXJ5IHRpbWUuIiAvPgotPG1ldGEgY29udGVudD0iRFREIHRlbXBsYXRlcywgY3JlYXRpbmcsIHRlbXBsYXRlcywgRFREcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURCB0ZW1wbGF0ZXMsIGNyZWF0aW5nLCB0ZW1wbGF0ZXMsIERURHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d21hY3JvIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIERURCB0ZW1wbGF0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3bWFjcm8iPjxhIG5hbWU9InR3bWFjcm8iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldvcmtpbmcgd2l0aCBEVEQgdGVtcGxhdGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5UZW1wbGF0ZXMgYXJlIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50bwotYSBEVEQgZmlsZSB3aGVuIGl0IGlzIGNyZWF0ZWQuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuIHlvdSBoYXZlCi1hIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50Ci10byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGNyZWF0ZSBhIG5ldyBEVEQgdGVtcGxhdGUgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RFREIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRURAotVGVtcGxhdGVzPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5Ci1uZXcgdGVtcGxhdGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3VwcGx5IGEgbmV3IHRlbXBsYXRlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZXNjcmlwdGlvbjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZXh0PC9zcGFuPiBmb3IgdGhlIHRlbXBsYXRlLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsCi1saXN0IHdoZW4gY29udGVudCBhc3Npc3QgaXMgcmVxdWVzdGVkLiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBhdHRlcm48L3NwYW4+IGZvciB5b3VyIHRlbXBsYXRlIHVzaW5nCi10aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50Ci1hc3Npc3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGU8L3NwYW4+IGJ1dHRvbgotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIDwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8c3Ryb25nPmRhdGU8L3N0cm9uZz4gdmFyaWFibGUKLWluZGljYXRlcyB0aGUgY3VycmVudCBkYXRlIHdpbGwgYmUgaW5zZXJ0ZWQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+IGFuZCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0bwotc2F2ZSB5b3VyIGNoYW5nZXMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZSBzYW1lCi1wcmVmZXJlbmNlcyBwYWdlLiA8cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlIHRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSwKLWJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhciBpbiB0aGUgRFREIHRlbXBsYXRlcyBsaXN0IHdoZW4KLXlvdSBjcmVhdGUgYSBmaWxlLCBnbyB0byB0aGU8c3Ryb25nPiBEVEQgVGVtcGxhdGVzPC9zdHJvbmc+IHByZWZlcmVuY2VzIHBhZ2UgYW5kIGNsZWFyCi1pdHMgY2hlY2sgYm94LjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvdGNyZXRkdGQuaHRtbCIgdGl0bGU9IkEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uIChEVEQpIGNvbnRhaW5zIGEgc2V0IG9mIHJ1bGVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmFsaWRhdGUgYW4gWE1MIGZpbGUuIEFmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBEVEQsIHlvdSBjYW4gZWRpdCBpdCBtYW51YWxseSwgYWRkaW5nIGRlY2xhcmF0aW9ucyB0aGF0IGRlZmluZSBlbGVtZW50cywgYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMsIGFuZCBob3cgdGhleSBjYW4gYmUgdXNlZCBmb3IgYW55IFhNTCBmaWxlcyB0aGF0IHJlZmVyZW5jZSB0aGUgRFREIGZpbGUuIj5DcmVhdGluZyBEVERzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGE2NjkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPgotPHRhc2sgaWQ9InR0YWdoaWx0IiB4bWw6bGFuZz0iZW4tdXMiPgotPHRpdGxlPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L3RpdGxlPgotPHRpdGxlYWx0cz4KLTxzZWFyY2h0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciBEVEQgZmlsZXM8L3NlYXJjaHRpdGxlPgotPC90aXRsZWFsdHM+Ci08c2hvcnRkZXNjPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIERURCBzb3VyY2UKLWNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgRFREIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3Nob3J0ZGVzYz4KLTxwcm9sb2c+PG1ldGFkYXRhPgotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREcyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyk8aW5kZXh0ZXJtPlhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8aW5kZXh0ZXJtPnNldHRpbmcgaGlnaGxpZ2h0aW5nIHN0eWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPgotPGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5wcmVmZXJlbmNlczxpbmRleHRlcm0+c2V0dGluZyBEVEQgaGlnaGxpZ2h0aW5nIHN0eWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPgotPC9rZXl3b3Jkcz4KLTwvbWV0YWRhdGE+PC9wcm9sb2c+Ci08dGFza2JvZHk+Ci08Y29udGV4dD48cD5UbyBzZXQgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgdGhlIERURCBjb2RlLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4KLTxzdGVwcz4KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPgotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+RFREIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD4gRFRECi1TdHlsZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+Ci08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPkNvbnRlbnQgdHlwZTwvdWljb250cm9sPiBsaXN0LCBzZWxlY3QgdGhlIHNvdXJjZQotdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGFsc28gY2xpY2sKLXRleHQgaW4gdGhlIHNhbXBsZSB0ZXh0IHRvIHNwZWNpZnkgdGhlIHNvdXJjZSB0YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldAotYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLjwvY21kPjwvc3RlcD4KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+Rm9yZWdyb3VuZDwvdWljb250cm9sPiBib3guPC9jbWQ+PC9zdGVwPgotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4KLWFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+QmFja2dyb3VuZDwvdWljb250cm9sPiBib3guPC9jbWQ+PC9zdGVwPgotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlaGluZCB0aGUgdGFnIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPgotPC9zdGVwPgotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIDx1aWNvbnRyb2w+Qm9sZDwvdWljb250cm9sPiBjaGVjayBib3ggaWYgeW91IHdhbnQgdG8KLW1ha2UgdGhlIHR5cGUgYm9sZC48L2NtZD48L3N0ZXA+Ci08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+UmVzdG9yZSBEZWZhdWx0PC91aWNvbnRyb2w+IHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nCi1zdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gSWYgeW91IG9ubHkgd2FudCB0byByZXNldCB0aGUgdmFsdWUgZm9yCi1hIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLCBzZWxlY3QgaXQgaW4gdGhlIDx1aWNvbnRyb2w+Q29udGVudCB0eXBlIDwvdWljb250cm9sPiBmaWVsZCwKLXRoZSBjbGljayB0aGUgPHVpY29udHJvbD5SZXN0b3JlIERlZmF1bHQ8L3VpY29udHJvbD4gYnV0dG9uIG5leHQgdG8gaXQuIDwvY21kPgotPC9zdGVwPgotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgeW91ciBjaGFuZ2VzLjwvY21kPjwvc3RlcD4KLTwvc3RlcHM+Ci08cmVzdWx0PjwvcmVzdWx0PgotPC90YXNrYm9keT4KLTwvdGFzaz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzcmNzdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTM0MzgyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNyY3N0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIERURCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBEVEQgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIERURCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBEVEQgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIiAvPgotPG1ldGEgY29udGVudD0iRFREcyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyksIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMsIHNldHRpbmcgaGlnaGxpZ2h0aW5nIHN0eWxlcywgWE1MIGVkaXRvciwgcHJlZmVyZW5jZXMsIHNldHRpbmcgRFREIGhpZ2hsaWdodGluZyBzdHlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzIChkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zKSwgWE1MIGVkaXRvciBwcmVmZXJlbmNlcywgc2V0dGluZyBoaWdobGlnaHRpbmcgc3R5bGVzLCBYTUwgZWRpdG9yLCBwcmVmZXJlbmNlcywgc2V0dGluZyBEVEQgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JldGR0ZC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR0YWdoaWx0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyBmb3IgRFREIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0dGFnaGlsdCI+PGEgbmFtZT0idHRhZ2hpbHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIERURCBzb3VyY2UKLWNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgRFREIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgRFREIGNvZGUsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RFREIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBEVEQKLVN0eWxlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgdHlwZTwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UKLXRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBhbHNvIGNsaWNrCi10ZXh0IGluIHRoZSBzYW1wbGUgdGV4dCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQKLWEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JlZ3JvdW5kPC9zcGFuPiBib3guPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmFja2dyb3VuZDwvc3Bhbj4gYm94Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBjb2xvciB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWhpbmQgdGhlIHRhZyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJvbGQ8L3NwYW4+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bwotbWFrZSB0aGUgdHlwZSBib2xkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZwotc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIElmIHlvdSBvbmx5IHdhbnQgdG8gcmVzZXQgdGhlIHZhbHVlIGZvcgotYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IHR5cGUgPC9zcGFuPiBmaWVsZCwKLXRoZSBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiBidXR0b24gbmV4dCB0byBpdC4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJmYW1pbHlsaW5rcyI+Ci08ZGl2IGNsYXNzPSJwYXJlbnRsaW5rIj48c3Ryb25nPlBhcmVudCB0b3BpYzo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0ZHRkLmh0bWwiIHRpdGxlPSJBIGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbiAoRFREKSBjb250YWlucyBhIHNldCBvZiBydWxlcyB0aGF0IGNhbiBiZSB1c2VkIHRvIHZhbGlkYXRlIGFuIFhNTCBmaWxlLiBBZnRlciB5b3UgaGF2ZSBjcmVhdGVkIGEgRFRELCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHksIGFkZGluZyBkZWNsYXJhdGlvbnMgdGhhdCBkZWZpbmUgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGVudGl0aWVzLCBhbmQgbm90YXRpb25zLCBhbmQgaG93IHRoZXkgY2FuIGJlIHVzZWQgZm9yIGFueSBYTUwgZmlsZXMgdGhhdCByZWZlcmVuY2UgdGhlIERURCBmaWxlLiI+Q3JlYXRpbmcgRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZWQ1YmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0aW1wdGR0ZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SW1wb3J0aW5nIERURHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkltcG9ydGluZyBEVERzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBEVEQgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mDQotdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURA0KLWVkaXRvci4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREcyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyk8aW5kZXh0ZXJtPmltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gaW1wb3J0IGEgRFREIGludG8gdGhlIHdvcmtiZW5jaCwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPjx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBpbXBvcnQgc291cmNlIGFuZCBjbGljayA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+RmlsbCBpbiB0aGUgZmllbGRzIGluIHRoZSA8dWljb250cm9sPkltcG9ydDwvdWljb250cm9sPiB3aXphcmQNCi1hcyBuZWNlc3NhcnkuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgYXJlIGZpbmlzaGVkLCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIERURCBmaWxlIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgZG91YmxlLWNsaWNrIGl0IHRvDQotb3BlbiBpdCBpbiB0aGUgRFREIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPkFmdGVyIHlvdSBoYXZlIGltcG9ydGVkIGEgRFREIGZpbGUgaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuZWQNCi1pdCBpbiB0aGUgRFREIGVkaXRvciwgeW91IGNhbiBlZGl0IGl0IG1hbnVhbGx5LjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXB0ZHRkLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Y2ZiYmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wdGR0ZC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSW1wb3J0aW5nIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIERURCBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIERURCBlZGl0b3IuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBEVEQgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBEVEQgZWRpdG9yLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkRURHMgKGRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnMpLCBpbXBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzIChkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zKSwgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3b3JrZHRkcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRpbXB0ZHRkIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIERURHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRpbXB0ZHRkIj48YSBuYW1lPSJ0aW1wdGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIERURHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBEVEQgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mCi10aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUgRFRECi1lZGl0b3IuIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VG8gaW1wb3J0IGEgRFREIGludG8gdGhlIHdvcmtiZW5jaCwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj4KLTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGltcG9ydCBzb3VyY2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5GaWxsIGluIHRoZSBmaWVsZHMgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkltcG9ydDwvc3Bhbj4gd2l6YXJkCi1hcyBuZWNlc3NhcnkuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5XaGVuIHlvdSBhcmUgZmluaXNoZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgRFREIGZpbGUgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBkb3VibGUtY2xpY2sgaXQgdG8KLW9wZW4gaXQgaW4gdGhlIERURCBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkFmdGVyIHlvdSBoYXZlIGltcG9ydGVkIGEgRFREIGZpbGUgaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuZWQKLWl0IGluIHRoZSBEVEQgZWRpdG9yLCB5b3UgY2FuIGVkaXQgaXQgbWFudWFsbHkuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PgotPGRpdiBjbGFzcz0iZmFtaWx5bGlua3MiPgotPGRpdiBjbGFzcz0icGFyZW50bGluayI+PHN0cm9uZz5QYXJlbnQgdG9waWM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgdGl0bGU9IlRoaXMgc2VjdGlvbnMgY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiPldvcmtpbmcgd2l0aCBEVERzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LmR0ZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZhbGR0ZC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkMzMxM2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR2YWxkdGQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlZhbGlkYXRpbmcgRFREczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VmFsaWRhdGluZyBEVERzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlZhbGlkYXRpbmcgYSBEVEQgZmlsZSBsZXRzIHlvdSB2ZXJpZnkgdGhhdCBpdCBpcyB3ZWxsIGZvcm1lZCBhbmQNCi1kb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+RFREcyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyk8aW5kZXh0ZXJtPnZhbGlkYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLiZuYnNwOzwvcD48cD5UbyB2YWxpZGF0ZQ0KLWEgRFRELCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgYW5kIGNsaWNrIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPlZhbGlkYXRlIERURCBGaWxlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5BIGRpYWxvZyBvcGVucywgaW5kaWNhdGluZyBpZiB0aGUgRFREIGZpbGUgd2FzIHN1Y2Nlc3NmdWxseSB2YWxpZGF0ZWQNCi1vciBub3QuIElmIHRoZSBmaWxlIGlzIGludmFsaWQsIGFueSBlcnJvcnMgd2lsbCBhcHBlYXIgaW4gdGhlIFByb2JsZW1zIHZpZXcuICZuYnNwOzxwPjxiPk5vdGU8L2I+Og0KLUlmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZyB0aGF0IHRoZSBQcm9ibGVtcyB2aWV3IGlzIGZ1bGwsDQoteW91IGNhbiBpbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQgYnkgc2VsZWN0aW5nIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD48dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBmcm9tDQotdGhlIHByb2plY3QncyBwb3AtdXAgbWVudSBhbmQgc3BlY2lmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMNCi1hbGxvd2VkLiBZb3UgbWlnaHQgaGF2ZSB0byBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+T3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpbiBvcmRlciB0byBlbmFibGUgdGhlIDx1aWNvbnRyb2w+TWF4aW11bSBudW1iZXIgb2YgdmFsaWRhdGlvbiBtZXNzYWdlczwvdWljb250cm9sPiBmaWVsZDwvcD48cD5Zb3UNCi1jYW4gc2V0IHVwIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzDQotYXJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbS4gRnJvbSBhIHByb2plY3QncyBwb3AtdXAgbWVudQ0KLXNlbGVjdCAgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+LCB0aGVuIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD4uDQotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VyJm5ic3A7cHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUNCi1WYWxpZGF0aW9uIHBhZ2UuJm5ic3A7PC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmRpdGEiIHNjb3BlPSJwZWVyIj4NCi08ZGVzYz5HZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb248L2Rlc2M+DQotPC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmFsZHRkLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE0OWYxZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5kdGRlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2YWxkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgRFREcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJWYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kIGRvZXMgbm90IGNvbnRhaW4gYW55IGVycm9ycy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVmFsaWRhdGluZyBhIERURCBmaWxlIGxldHMgeW91IHZlcmlmeSB0aGF0IGl0IGlzIHdlbGwgZm9ybWVkIGFuZCBkb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuIiAvPgotPG1ldGEgY29udGVudD0iRFREcyAoZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9ucyksIHZhbGlkYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJEVERzIChkb2N1bWVudCB0eXBlIGRlZmluaXRpb25zKSwgdmFsaWRhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd29ya2R0ZHMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHZhbGR0ZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlZhbGlkYXRpbmcgRFREczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHZhbGR0ZCI+PGEgbmFtZT0idHZhbGR0ZCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFsaWRhdGluZyBEVERzPC9oMT4KLQotCi0KLQotPGRpdj48cD5WYWxpZGF0aW5nIGEgRFREIGZpbGUgbGV0cyB5b3UgdmVyaWZ5IHRoYXQgaXQgaXMgd2VsbCBmb3JtZWQgYW5kCi1kb2VzIG5vdCBjb250YWluIGFueSBlcnJvcnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLsKgPC9wPgotPHA+VG8gdmFsaWRhdGUKLWEgRFRELCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLQotPGRpdiBjbGFzcz0icCI+PHNwYW4+SW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayB0aGUgRFREIGFuZCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGUgRFREIEZpbGU8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9kaXY+Ci0KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+QSBkaWFsb2cgb3BlbnMsIGluZGljYXRpbmcgaWYgdGhlIERURCBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgdmFsaWRhdGVkCi1vciBub3QuIElmIHRoZSBmaWxlIGlzIGludmFsaWQsIGFueSBlcnJvcnMgd2lsbCBhcHBlYXIgaW4gdGhlIFByb2JsZW1zIHZpZXcuIMKgPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OgotSWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zIHZpZXcgaXMgZnVsbCwKLXlvdSBjYW4gaW5jcmVhc2UgdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkIGJ5IHNlbGVjdGluZyA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPjwvc3Bhbj4gZnJvbQotdGhlIHByb2plY3QncyBwb3AtdXAgbWVudSBhbmQgc3BlY2lmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMKLWFsbG93ZWQuIFlvdSBtaWdodCBoYXZlIHRvIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3ZlcnJpZGUgdmFsaWRhdGlvbiBwcmVmZXJlbmNlczwvc3Bhbj4gY2hlY2sKLWJveCBpbiBvcmRlciB0byBlbmFibGUgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1heGltdW0gbnVtYmVyIG9mIHZhbGlkYXRpb24gbWVzc2FnZXM8L3NwYW4+IGZpZWxkPC9wPgotPHA+WW91Ci1jYW4gc2V0IHVwIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QgcmVzb3VyY2VzCi1hcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBGcm9tIGEgcHJvamVjdCdzIHBvcC11cCBtZW51Ci1zZWxlY3QgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+LCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPi4KLUFueSB2YWxpZGF0b3JzIHlvdSBjYW4gcnVuIGFnYWluc3QgeW91csKgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUKLVZhbGlkYXRpb24gcGFnZS7CoDwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImZhbWlseWxpbmtzIj4KLTxkaXYgY2xhc3M9InBhcmVudGxpbmsiPjxzdHJvbmc+UGFyZW50IHRvcGljOjwvc3Ryb25nPiA8YSBocmVmPSIuLi90b3BpY3MvY3dvcmtkdGRzLmh0bWwiIHRpdGxlPSJUaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6Ij5Xb3JraW5nIHdpdGggRFREczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsaW5mbyI+PHN0cm9uZz5SZWxhdGVkIGluZm9ybWF0aW9uPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sIiB0aXRsZT0iR2VuZXJhbCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uIj4uLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbDwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YWExYjQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0VkaXRvckh0bWxDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI4ZGMxMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci0KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9Im1pc2MwMTcwIj4KLTxkZXNjcmlwdGlvbj5Vc2UgdGhpcyBkaWFsb2cgdG8gZWRpdCB0aGUgV2ViIGNvbnRlbnQgc2V0dGluZ3MgZm9yIGEgV2ViIHByb2plY3QuIFlvdSBjYW4gc3BlY2lmeSB0aGUgZGVmYXVsdCBkb2N1bWVudCB0eXBlLCBDU1MgcHJvZmlsZSwgYW5kIHRhcmdldCBkZXZpY2UuIFRoZSBwdWJsaWMgSUQgYW5kIHN5c3RlbSBJRCBhcmUgcG9wdWxhdGVkIGF1dG9tYXRpY2FsbHkuIFRvIHJlc3RvcmUgdGhlIGRlZmF1bHRzLCBjbGljayA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPi4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAzMCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUsIHNhdmUsIG9yIGxvYWQgYW4gSFRNTCBmaWxlLgotCi1WYXJpb3VzIGRldmVsb3BtZW50IHBsYXRmb3JtcyB1c2UgZGlmZmVyZW50IGxpbmUgZGVsaW1pdGVycyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZS4gU2VsZWN0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgY29ycmVzcG9uZHMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtLgotPGI+Tm90ZTo8L2I+IFRoaXMgZGVsaW1pdGVyIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgYmUgYWRkZWQgdG8gYW55IGRvY3VtZW50cyB0aGF0IGN1cnJlbnRseSBleGlzdC4gSXQgd2lsbCBiZSBhZGRlZCBvbmx5IHRvIGRvY3VtZW50cyB0aGF0IHlvdSBjcmVhdGUgYWZ0ZXIgeW91IHNlbGVjdCB0aGUgbGluZSBkZWxpbWl0ZXIgdHlwZSBhbmQgY2xpY2sgPGI+QXBwbHk8L2I+LCBvciB0byBleGlzdGluZyBmaWxlcyB0aGF0IHlvdSBvcGVuIGFuZCB0aGVuIHJlc2F2ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4uCi0KLVRoZSBlbmNvZGluZyBhdHRyaWJ1dGUgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gZWl0aGVyIGNyZWF0aW5nIEhUTUwgZmlsZXMgb3IgbG9hZGluZyB5b3VyIEhUTUwgZmlsZXMgaW50byB0aGUgZWRpdG9yLiAgQ2hhbmdpbmcgdGhlIGNyZWF0aW5nIGZpbGVzIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3IEhUTUwgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDMxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgZm9ybWF0dGluZywgY29udGVudCBhc3Npc3QsIGFuZCBjYXBpdGFsaXphdGlvbiBzdHlsZSB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBlZGl0IGFuIEhUTUwgZmlsZS4KLQotRW50ZXIgYSBtYXhpbXVtIHdpZHRoIGluIHRoZSA8Yj5MaW5lIHdpZHRoPC9iPiBmaWVsZCB0byBzcGVjaWZ5IHRoZSBsaW5lIHdpZHRoIHRvIGJyZWFrIGEgbGluZSB0byBmaXQgb250byBtb3JlIHRoYW4gb25lIGxpbmUgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLgotCi1TZWxlY3QgPGI+U3BsaXQgbXVsdGlwbGUgYXR0cmlidXRlcyBlYWNoIG9uIGEgbmV3IGxpbmU8L2I+IHRvIHN0YXJ0IGV2ZXJ5IGF0dHJpYnV0ZSBvbiBhIG5ldyBsaW5lIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4gQXR0cmlidXRlcyB3aWxsIHJldHVybiB0byB0aGUgc2FtZSBtYXJnaW4gYXMgdGhlIHByZXZpb3VzIGxpbmUuCi0KLVNlbGVjdCA8Yj5JbmRlbnQgdXNpbmcgdGFiczwvYj4gaWYgeW91IHdhbnQgdG8gdXNlIHRhYiBjaGFyYWN0ZXJzIChcdCkgYXMgdGhlIHN0YW5kYXJkIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uCi0KLUlmIHlvdSBwcmVmZXIgdG8gdXNlIHNwYWNlcywgc2VsZWN0IDxiPkluZGVudCB1c2luZyBzcGFjZXM8L2I+LgotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgPGI+SW5kZW50YXRpb24gc2l6ZTwvYj4gd2hpY2ggaXMgdGhlIG51bWJlciBvZiB0YWJzIG9yIHNwYWNlIGNoYXJhY3RlcnMgdXNlZCBmb3IgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi4KLQotU2VsZWN0IDxiPkNsZWFyIGFsbCBibGFuayBsaW5lczwvYj4gdG8gcmVtb3ZlIGJsYW5rIGxpbmVzIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4KLQotVG8gYXBwbHkgdGhlc2UgZm9ybWF0dGluZyBzdHlsZXMsIHNlbGVjdCB0aGUgPGI+Rm9ybWF0IERvY3VtZW50PC9iPiBtZW51IGl0ZW0uCi0KLUlmIHRoZSA8Yj5BdXRvbWF0aWNhbGx5IG1ha2Ugc3VnZ2VzdGlvbnM8L2I+IGNoZWNrIGJveCBpcyBzZWxlY3RlZCwgeW91IGNhbiBzcGVjaWZ5IHRoYXQgY2VydGFpbiBjaGFyYWN0ZXJzIHdpbGwgY2F1c2UgdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkuIFNwZWNpZnkgdGhlc2UgY2hhcmFjdGVycyBpbiB0aGUgPGI+UHJvbXB0IHdoZW4gdGhlc2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ8L2I+IGZpZWxkLgotCi1TZWxlY3QgdGhlIFVwcGVyY2FzZSBvciBMb3dlcmNhc2UgcmFkaW8gYnV0dG9uIHRvIGRldGVybWluZSB0aGUgY2FzZSBmb3IgdGFnIGFuZCBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgZG9jdW1lbnQgd2hlbiB1c2luZyBjb250ZW50IGFzc2lzdCBvciBjb2RlIGdlbmVyYXRpb24uCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ4MDAzMiI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBIVE1MIGVkaXRvciBkb2VzIHdoZW4geW91IGFyZSBlZGl0aW5nIGEgZmlsZS4KLQotVGhlIDxiPkNvbnRlbnQgdHlwZTwvYj4gZmllbGQgY29udGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUgc291cmNlIHR5cGVzIHRoYXQgeW91IGNhbiBzZWxlY3QgYSBoaWdobGlnaHRpbmcgc3R5bGUgZm9yLiBZb3UgY2FuIGVpdGhlciBzZWxlY3QgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBmcm9tIHRoZSBkcm9wLWRvd24gbGlzdCwgb3IgY2xpY2sgdGV4dCBpbiB0aGUgdGV4dCBzYW1wbGUgd2luZG93IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGNvbnRlbnQgdHlwZSBmb3Igd2hpY2ggeW91IHdhbnQgdG8gY2hhbmdlIHRoZSB0ZXh0IGhpZ2hsaWdodGluZy4KLQotVGhlIDxiPkZvcmVncm91bmQ8L2I+IGFuZCA8Yj5CYWNrZ3JvdW5kPC9iPiBwdXNoIGJ1dHRvbnMgb3BlbiA8Yj5Db2xvcjwvYj4gZGlhbG9nIGJveGVzIHRoYXQgYWxsb3cgeW91IHRvIHNwZWNpZnkgdGV4dCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycywgcmVzcGVjdGl2ZWx5LiBTZWxlY3QgdGhlIDxiPkJvbGQ8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlIGFwcGVhciBpbiBib2xkLgotCi1DbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0PC9iPiBwdXNoIGJ1dHRvbiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZyBzdHlsZXMgYmFjayB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDMzIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3JlYXRlIG5ldyBhbmQgZWRpdCBleGlzdGluZyB0ZW1wbGF0ZXMgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgZWRpdCBhbiBIVE1MIGZpbGUuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0ieG1sbTExMDAiPgotPGRlc2NyaXB0aW9uPkNsZWFudXAgb3B0aW9ucyBlbmFibGUgeW91IHRvIHVwZGF0ZSBhIGRvY3VtZW50IHNvIHRoYXQgaXQgaXMgd2VsbC1mb3JtZWQgYW5kIGZvcm1hdHRlZC4KLQotVGhlIGZvbGxvd2luZyBjbGVhbnVwIG9wdGlvbnMgbGV0IHlvdSBzZWxlY3QgcmFkaW8gYnV0dG9ucyB0byBjaG9vc2UgdGhlIHR5cGUgb2YgY2xlYW51cCB0byBiZSBwZXJmb3JtZWQ6Ci0tIDxiPlRhZyBuYW1lIGNhc2UgZm9yIEhUTUw8L2I+OiBVbmxlc3Mgc2V0IHRvIDxiPkFzLWlzPC9iPiwgY2hhbmdlcyB0aGUgY2FzZSBvZiBhbGwgdGFncyBpbiBhIGZpbGUgZm9yIGVhc2llciB2aXN1YWwgcGFyc2luZyBhbmQgY29uc2lzdGVuY3kuCi0tIDxiPkF0dHJpYnV0ZSBuYW1lIGNhc2UgZm9yIEhUTUw8L2I+OiBVbmxlc3Mgc2V0IHRvIDxiPkFzLWlzPC9iPiwgY2hhbmdlcyB0aGUgY2FzZSBvZiBhbGwgYXR0cmlidXRlcyBpbiBhIGZpbGUgZm9yIGVhc2llciB2aXN1YWwgcGFyc2luZyBhbmQgY29uc2lzdGVuY3kuCi0KLVRoZSBmb2xsb3dpbmcgY2xlYW51cCBvcHRpb25zIGNhbiBiZSBzZXQgdG8gb24gb3Igb2ZmLCBzbyB0aGF0IHlvdSBjYW4gbGltaXQgdGhlIHR5cGUgb2YgY2xlYW51cCBwZXJmb3JtZWQ6Ci0tIDxiPkluc2VydCByZXF1aXJlZCBhdHRyaWJ1dGVzPC9iPjogSW5zZXJ0cyBhbiBtaXNzaW5nIGF0dHJpYnV0ZXMgdGhhdCBhcmUgcmVxdWlyZWQgYnkgdGhlIHRhZyB0byBtYWtlIHRoZSBlbGVtZW50IG9yIGRvY3VtZW50IHdlbGwtZm9ybWVkLgotLSA8Yj5JbnNlcnQgbWlzc2luZyB0YWdzPC9iPjogQ29tcGxldGVzIGFueSBtaXNzaW5nIHRhZ3MgKHN1Y2ggYXMgYWRkaW5nIGFuIGVuZCB0YWcpIG5lY2Vzc2FyeSB0byBtYWtlIHRoZSBlbGVtZW50IG9yIGRvY3VtZW50IHdlbGwtZm9ybWVkLgotLSA8Yj5RdW90ZSBhdHRyaWJ1dGUgdmFsdWVzPC9iPjogQXBwcm9wcmlhdGVseSBhZGRzIGRvdWJsZS0gb3Igc2luZ2xlLXF1b3RlcyBiZWZvcmUgYW5kIGFmdGVyIGF0dHJpYnV0ZSB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZy4KLS0gPGI+Rm9ybWF0IHNvdXJjZTwvYj46IEZvcm1hdHMgdGhlIGRvY3VtZW50IGp1c3QgYXMgdGhlIDxiPkZvcm1hdCBEb2N1bWVudDwvYj4gY29udGV4dCBtZW51IG9wdGlvbiBkb2VzLCBpbW1lZGlhdGVseSBhZnRlciBwZXJmb3JtaW5nIGFueSBvdGhlciBzcGVjaWZpZWQgPGI+Q2xlYW51cDwvYj4gb3B0aW9ucy4KLS0gPGI+Q29udmVydCBsaW5lIGRlbGltaXRlcnMgdG88L2I+OiBDb252ZXJ0cyBhbGwgbGluZSBkZWxpbWl0ZXJzIGluIHRoZSBmaWxlIHRvIHRoZSBzZWxlY3RlZCBvcGVyYXRpbmcgc3lzdGVtJ3MgdHlwZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzMi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvRWRpdG9ySHRtbENvbnRleHRzMi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MTQxODcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0VkaXRvckh0bWxDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLQotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iaHRtbHNvdXJjZV9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgSFRNTCBzb3VyY2UgcGFnZSBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGZpbGUgdGhhdCBpcyBjb2RlZCBpbiB0aGUgSHlwZXJ0ZXh0IE1hcmt1cCBMYW5ndWFnZSBvciBpbiBYSFRNTC4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgdXNlci1kZWZpbmVkIHRlbXBsYXRlcywgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuaHRtbCIvPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9IVE1MV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0hUTUxXaXpDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNjhjZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL0hUTUxXaXpDb250ZXh0cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9Imh0bWx3MDAxMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSBIVE1MIHRlbXBsYXRlIGNoZWNrYm94IHRvIGNyZWF0ZSB5b3VyIEhUTUwgZmlsZSBiYXNlZCBvbiBhIGRlZmF1bHQgdGVtcGxhdGUuIENob29zZSBvbmUgb2YgdGhlIGZyYW1lc2V0IHRlbXBsYXRlcyBpZiB5b3UgYXJlIGRldmVsb3BpbmcgYSBXZWIgc2l0ZSB3aXRoIGZyYW1lcy4gSWYgeW91IGRvIG5vdCBzZWxlY3QgYSB0ZW1wbGF0ZSwgeW91ciBuZXdseSBjcmVhdGVkIEpTUCBmaWxlIHdpbGwgYmUgY29tcGxldGVseSBibGFuay4KLTwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci0KLQotCi08L2NvbnRleHRzPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGVlOTMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4wMDEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWY5NzAxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIGFib3V0Lmh0bWwsXAotICAgICAgICAgICAgICAgRWRpdG9ySHRtbENvbnRleHRzLnhtbCxcCi0gICAgICAgICAgICAgICBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgRWRpdG9ySHRtbENvbnRleHRzMi54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMKLXNyYy5pbmNsdWRlcyA9IGJ1aWxkLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI0NDQ0Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IEhUTUwgZWRpdG9yIGluZm9wb3BzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwODVlNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5odG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySHRtbENvbnRleHRzLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2Uud3N0Lmh0bWwudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9ySHRtbENvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiLz4KLSAgICAgICAgIDxjb250ZXh0cyBmaWxlPSJIVE1MV2l6Q29udGV4dHMueG1sIiBwbHVnaW49Im9yZy5lY2xpcHNlLndzdC5odG1sLnVpIi8+Ci08L2V4dGVuc2lvbj4KLQotCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2EyZjg4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1idWlsZC54bWwKLW9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJfMS4wLjAuamFyCi10ZW1wCi1EaXRhTGluay5jYXQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZDY0MDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlcjwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzIxMzE1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJUJ1bmRsZS1OYW1lLjAKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXI7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4yMDMucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDg5ZjJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICBzc2VfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25jb250YXNzLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmNvbnRhc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODIwMTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmNvbnRhc3MuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9uanNjZGFzdC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25qc2NkYXN0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFhMTQxYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25qc2NkYXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2MxMzVjZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25saW51eC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL25tYWNzY3JwLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbm1hY3NjcnAuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGE2MzcxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbm1hY3NjcnAuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ucXVlc3QuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL2ltYWdlcy9ucXVlc3QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmFhMWUyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbnF1ZXN0LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbndpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTVmOWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9pbWFnZXMvbndpbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvbXlwbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL215cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUwNWRlNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Zy1pbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwIHBhZ2VzICAgICAgLS0+Ci08IS0tIGZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgKHNvdXJjZSBlZGl0b3JzKS4gICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MgZmlsZT0ic3NlX3RvYy54bWwiPgotICAgICAgPC90b2M+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZjRkYTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJzc2VfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkZjQ4ZWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXJpbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxpbmRleD4KLSAgPGVudHJ5IGtleXdvcmQ9InRlbXBsYXRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCNjc3JjZWR0MDA0IiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZW1vdmluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuaHRtbCNjc3JjZWR0MDA0IiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJIVE1MIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sI3RzcmNlZHQwMjQiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iSlNQIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5odG1sI3RzcmNlZHQwMjgiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwjdHNyY2VkdDAyNyIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sI2NzcmNlZHQwMDQiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByZWZlcmVuY2Ugc2V0dGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjUuaHRtbCN0c3JjZWR0MDI1IiB0aXRsZT0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDUuaHRtbCN0c3JjZWR0MDA1IiB0aXRsZT0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiLz4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sI2NzcmNlZHQwMDYiIHRpdGxlPSJDb250ZW50IGFzc2lzdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InRleHQgc2VhcmNoIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNy5odG1sI3RzcmNlZHQwMDciIHRpdGxlPSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzcGVsbCBjaGVjayI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTAuaHRtbCN0c3JjZWR0MDEwIiB0aXRsZT0iQ2hlY2tpbmcgc3BlbGxpbmciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ibWFya3VwIGxhbmd1YWdlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwjdHNyY2VkdDAwMCIgdGl0bGU9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ibWFya3VwIGxhbmd1YWdlIGVkaXRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuaHRtbCN0c3JjZWR0MDAwIiB0aXRsZT0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwMC5odG1sI3RzcmNlZHQwMDAiIHRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMDEuaHRtbCN0c3JjZWR0MDAxIiB0aXRsZT0iU2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIGFuZCByZW1vdmluZyB0ZW1wbGF0ZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI3Lmh0bWwjdHNyY2VkdDAyNyIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZhbGlkYXRpb24iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJzb3VyY2UgdnMgYmF0Y2giPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuaHRtbCNjc3JjZWR0MDAxIiB0aXRsZT0iU291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImFubm90YXRpb24gcHJlZmVyZW5jZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJtYXJrdXAgbGFuZ3VhZ2Ugc2V0dGluZ3MiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDAxLmh0bWwjdHNyY2VkdDAwMSIgdGl0bGU9IlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5odG1sI3RzcmNlZHQwMDUiIHRpdGxlPSJHZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3NyY2VkdDAwNi5odG1sI2NzcmNlZHQwMDYiIHRpdGxlPSJDb250ZW50IGFzc2lzdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVuYWJsaW5nIGZvciBKU1AgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDIzLmh0bWwjdHNyY2VkdDAyMyIgdGl0bGU9IkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlNQIGZpbGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBhc3Npc3QgZW5hYmxlbWVudCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuaHRtbCN0c3JjZWR0MDIzIiB0aXRsZT0iRW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJmaWxlIHR5cGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdG9ycyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5odG1sI3Rjb250ZW50dHlwZSIgdGl0bGU9IkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBhZGRpdGlvbmFsIGZpbGVzIHR5cGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgdHlwZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im1hcHBpbmcgZmlsZSBleHRlbnNpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwjdGNvbnRlbnR0eXBlIiB0aXRsZT0iQXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZmlsZSBleHRlbnNpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0ibWFwcGluZyBjb250ZW50IHR5cGUiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90Y29udGVudHR5cGUuaHRtbCN0Y29udGVudHR5cGUiIHRpdGxlPSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlbmNvZGluZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZpbGVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmh0bWwjY2VuY29kaW5nIiB0aXRsZT0iRmlsZSBFbmNvZGluZyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzcGVsbCBjaGVjayI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxMC5odG1sI3RzcmNlZHQwMTAiIHRpdGxlPSJDaGVja2luZyBzcGVsbGluZyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJIVE1MIj4KLSAgICA8ZW50cnkga2V5d29yZD0idGVtcGxhdGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJyZW1vdmluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sI3RzcmNlZHQwMjQiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sI3RzcmNlZHQwMjQiIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9InJldXNlIHdpdGggc25pcHBldHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCN0c3JjZWR0MDI2IiB0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icmV1c2Ugd2l0aCBzbmlwcGV0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjYuaHRtbCN0c3JjZWR0MDI2IiB0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSlNQIHRlbXBsYXRlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCN0c3JjZWR0MDI4IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icmVtb3ZpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI4Lmh0bWwjdHNyY2VkdDAyOCIgdGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJ4bWwgdGVtcGxhdGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOS5odG1sI3RzcmNlZHQwMjciIHRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZW1vdmluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMjkuaHRtbCN0c3JjZWR0MDI3IiB0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNuaXBwZXRzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI2Lmh0bWwjdHNyY2VkdDAyNiIgdGl0bGU9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZHJhd2VycyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDE0Lmh0bWwjdHNyY2VkdDAxNCIgdGl0bGU9IkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImRlbGV0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDE0Lmh0bWwjdHNyY2VkdDAxNCIgdGl0bGU9IkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgaXRlbXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCN0c3JjZWR0MDE0IiB0aXRsZT0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iaGlkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDE0Lmh0bWwjdHNyY2VkdDAxNCIgdGl0bGU9IkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgaXRlbXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDIyLmh0bWwjdHNyY2VkdDAyMiIgdGl0bGU9IkVkaXRpbmcgc25pcHBldCBpdGVtcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImRlbGV0aW5nIG9yIGhpZGluZyBkcmF3ZXJzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNi5odG1sI3RzcmNlZHQwMTYiIHRpdGxlPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkphdmFTY3JpcHQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZXVzZSB3aXRoIHNuaXBwZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5odG1sI3RzcmNlZHQwMjYiIHRpdGxlPSJFZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJKU1AgY29kZSI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InJldXNlIHdpdGggc25pcHBldHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI2Lmh0bWwjdHNyY2VkdDAyNiIgdGl0bGU9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpTUCB0YWdzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3VzdG9tIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJyZXVzZSB3aXRoIHNuaXBwZXRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDI2Lmh0bWwjdHNyY2VkdDAyNiIgdGl0bGU9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJTbmlwcGV0cyB2aWV3Ij4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jc3JjZWR0MDAxLmh0bWwjY3NyY2VkdDAwMSIgdGl0bGU9IlNuaXBwZXRzIHZpZXciLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic25pcHBldCBkcmF3ZXJzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIGl0ZW1zIHRvIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNS5odG1sI3RzcmNlZHQwMTUiIHRpdGxlPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzbmlwcGV0IGl0ZW1zIj4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIHRvIGRyYXdlcnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c3JjZWR0MDE1Lmh0bWwjdHNyY2VkdDAxNSIgdGl0bGU9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImRyYXdlcnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJkZWxldGluZyBzbmlwcGV0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCN0c3JjZWR0MDE2IiB0aXRsZT0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImhpZGluZyBzbmlwcGV0cyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCN0c3JjZWR0MDE2IiB0aXRsZT0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk3YzJmMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgcHJvcGVydGllcyBmaWxlIGZvciBvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgYW5kIHNuaXBwZXRzIGRvY3VtZW50YXRpb24KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTA1ZGU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Zy1pbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwIHBhZ2VzICAgICAgLS0+Ci08IS0tIGZvciB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgKHNvdXJjZSBlZGl0b3JzKS4gICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotICAgIDxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICAgIDx0b2MgZmlsZT0ic3NlX3RvYy54bWwiPgotICAgICAgPC90b2M+Ci0gICA8L2V4dGVuc2lvbj4KLQk8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyaW5kZXgueG1sIi8+Ci08L2V4dGVuc2lvbj4KLTwvcGx1Z2luPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwYmM3NTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgbWFwIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIE1hcC8vRU4iDQotICJtYXAuZHRkIj4NCi08bWFwIGlkPSJ3c3Rzc2V0b2MiIGxpbmtpbmc9Im5vbmUiIHRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NzcmNlZHQwMDQuZGl0YSIgbmF2dGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMDAuZGl0YSIgbG9ja3RpdGxlPSJ5ZXMiIG5hdnRpdGxlPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAiDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuZGl0YSIgbmF2dGl0bGU9IlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbiINCi10eXBlPSJjb25jZXB0Ij48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNS5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDAxLmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNS5kaXRhIiBuYXZ0aXRsZT0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jc3JjZWR0MDA2LmRpdGEiIG5hdnRpdGxlPSJDb250ZW50IGFzc2lzdCIgdHlwZT0iY29uY2VwdCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjMuZGl0YSIgbmF2dGl0bGU9Ik1ha2luZyBjb250ZW50IGFzc2lzdCB3b3JrIGZvciBKU1AgZmlsZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNvbnRlbnR0eXBlLmRpdGEiIG5hdnRpdGxlPSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggZmlsZSB0eXBlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2VuY29kaW5nLmRpdGEiIG5hdnRpdGxlPSJGaWxlIEVuY29kaW5nIiB0eXBlPSJjb25jZXB0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAwNy5kaXRhIiBuYXZ0aXRsZT0iU2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmRpdGEiIG5hdnRpdGxlPSJDaGVja2luZyBzcGVsbGluZyIgdHlwZT0idGFzayI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMjcuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3Ig0KLXR5cGU9InRhc2siPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlcyINCi10eXBlPSJ0YXNrIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyOC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDI5LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXciDQotdHlwZT0idGFzayI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jc3JjZWR0MDAxLmRpdGEiIG5hdnRpdGxlPSJTbmlwcGV0cyB2aWV3IiB0eXBlPSJjb25jZXB0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAxNC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIHNuaXBwZXRzIGRyYXdlcnMiDQotdHlwZT0idGFzayI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzcmNlZHQwMTUuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDIyLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiIHR5cGU9InRhc2siPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3JjZWR0MDE2LmRpdGEiIG5hdnRpdGxlPSJEZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzIg0KLXR5cGU9InRhc2siPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC9tYXA+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3NzZV90b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmYzYjdmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci9zc2VfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08dG9jIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgdG9waWNzPSJ0b3BpY3MvY3NyY2VkdDAwNC5odG1sIj4KLSAgIDx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9InRvcGljcy9jc3JjZWR0MDA0Lmh0bWwiPgotICAgICAgPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAiIGhyZWY9InRvcGljcy90c3JjZWR0MDAwLmh0bWwiPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJTb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb24iIGhyZWY9InRvcGljcy9jdmFsaWRhdGUuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjUuaHRtbCI+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMDEuaHRtbCIvPgotICAgICAgICAgPC90b3BpYz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9InRvcGljcy90c3JjZWR0MDA1Lmh0bWwiPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJDb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL2NzcmNlZHQwMDYuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJNYWtpbmcgY29udGVudCBhc3Npc3Qgd29yayBmb3IgSlNQIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyMy5odG1sIi8+Ci0gICAgICAgICA8L3RvcGljPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJBc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggZmlsZSB0eXBlcyIgaHJlZj0idG9waWNzL3Rjb250ZW50dHlwZS5odG1sIi8+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkZpbGUgRW5jb2RpbmciIGhyZWY9InRvcGljcy9jZW5jb2RpbmcuaHRtbCIvPgotICAgICAgICAgPHRvcGljIGxhYmVsPSJTZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGUiIGhyZWY9InRvcGljcy90c3JjZWR0MDA3Lmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQ2hlY2tpbmcgc3BlbGxpbmciIGhyZWY9InRvcGljcy90c3JjZWR0MDEwLmh0bWwiLz4KLSAgICAgICAgIDx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXciIGhyZWY9InRvcGljcy90c3JjZWR0MDI3Lmh0bWwiPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNC5odG1sIi8+Ci0gICAgICAgICAgICA8dG9waWMgbGFiZWw9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMjguaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDI5Lmh0bWwiLz4KLSAgICAgICAgIDwvdG9waWM+Ci0gICAgICAgICA8dG9waWMgbGFiZWw9IkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvdHNyY2VkdDAyNi5odG1sIj4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iU25pcHBldHMgdmlldyIgaHJlZj0idG9waWNzL2NzcmNlZHQwMDEuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJBZGRpbmcgc25pcHBldHMgZHJhd2VycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMTQuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMTUuaHRtbCIvPgotICAgICAgICAgICAgPHRvcGljIGxhYmVsPSJFZGl0aW5nIHNuaXBwZXQgaXRlbXMiIGhyZWY9InRvcGljcy90c3JjZWR0MDIyLmh0bWwiLz4KLSAgICAgICAgICAgIDx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIgaHJlZj0idG9waWNzL3RzcmNlZHQwMTYuaHRtbCIvPgotICAgICAgICAgPC90b3BpYz4KLSAgICAgIDwvdG9waWM+Ci0gICA8L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYTljMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NlbmNvZGluZy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY2VuY29kaW5nIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5GaWxlIEVuY29kaW5nPC90aXRsZT4NCi08c2hvcnRkZXNjPjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmVuY29kaW5nPGluZGV4dGVybT5maWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD4gVGhlIGNoYXJhY3RlciBlbmNvZGluZyBpbiBYTUwsIChYKUhUTUwgZmlsZXMsIGFuZCBKU1AgZmlsZXMgY2FuIGJlIHNwZWNpZmllZA0KLWFuZCBpbnZva2VkIGluIG1hbnkgZGlmZmVyZW50IHdheXM7IGhvd2V2ZXIsIHdlIHJlY29tbWVuZCB0aGF0IHlvdSBzcGVjaWZ5DQotdGhlIGVuY29kaW5nIGluIGVhY2ggb25lIG9mIHlvdXIgc291cmNlIGZpbGVzLCBmb3IgdGhhdCBpcyB3aGVyZSBtYW55IFhNTCwNCi1IVE1MLCBKU1AgZWRpdG9ycyBleHBlY3QgdG8gZmluZCB0aGUgZW5jb2RpbmcuPC9wPg0KLTxwPkZvciBleGFtcGxlLCBmb3IgSlNQIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSBwYWdlRW5jb2RpbmcgYXR0cmlidXRlIGFuZC9vcg0KLXRoZSBjb250ZW50VHlwZSBhdHRyaWJ1dGUgaW4gdGhlIHBhZ2UgZGlyZWN0aXZlLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nDQotZXhhbXBsZTo8Y29kZWJsb2NrPiZsdDslQCBwYWdlIGxhbmd1YWdlPSJqYXZhIiBjb250ZW50VHlwZT0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiDQotICAgIHBhZ2VFbmNvZGluZz0iSVNPLTg4NTktMSIlJmd0Ow0KLTwvY29kZWJsb2NrPjwvcD4NCi08cD5Gb3IgWE1MIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSBlbmNvZGluZyBwc2V1ZG8tYXR0cmlidXRlIGluIHRoZSB4bWwgZGVjbGFyYXRpb24NCi1hdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudCBvciB0aGUgdGV4dCBkZWNsYXJhdGlvbiBhdCB0aGUgc3RhcnQgb2YgYW4gZW50aXR5LA0KLWFzIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTogPGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIiA/PjwvY29kZWJsb2NrPjwvcD4NCi08cD5Gb3IgKFgpSFRNTCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgJmx0O21ldGEmZ3Q7IHRhZyBpbnNpZGUgdGhlICZsdDtoZWFkJmd0Ow0KLXRhZ3MsIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZTo8Y29kZWJsb2NrPiZsdDttZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiIC8+PC9jb2RlYmxvY2s+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY2VuY29kaW5nLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2M2ZhYmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jZW5jb2RpbmcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+RmlsZSBFbmNvZGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2VuY29kaW5nIj48YSBuYW1lPSJjZW5jb2RpbmciPjwhLS0gLS0+PC9hPgotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RmlsZSBFbmNvZGluZzwvaDE+Ci08ZGl2PjxwPjwvcD4KLTxwPiBUaGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIFhNTCwgKFgpSFRNTCBmaWxlcywgYW5kIEpTUCBmaWxlcyBjYW4gYmUgc3BlY2lmaWVkCi1hbmQgaW52b2tlZCBpbiBtYW55IGRpZmZlcmVudCB3YXlzOyBob3dldmVyLCB3ZSByZWNvbW1lbmQgdGhhdCB5b3Ugc3BlY2lmeQotdGhlIGVuY29kaW5nIGluIGVhY2ggb25lIG9mIHlvdXIgc291cmNlIGZpbGVzLCBmb3IgdGhhdCBpcyB3aGVyZSBtYW55IFhNTCwKLUhUTUwsIEpTUCBlZGl0b3JzIGV4cGVjdCB0byBmaW5kIHRoZSBlbmNvZGluZy48L3A+Ci08ZGl2IGNsYXNzPSJwIj5Gb3IgZXhhbXBsZSwgZm9yIEpTUCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgcGFnZUVuY29kaW5nIGF0dHJpYnV0ZSBhbmQvb3IKLXRoZSBjb250ZW50VHlwZSBhdHRyaWJ1dGUgaW4gdGhlIHBhZ2UgZGlyZWN0aXZlLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nCi1leGFtcGxlOjxwcmU+Jmx0OyVAIHBhZ2UgbGFuZ3VhZ2U9ImphdmEiIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSIKLSAgICBwYWdlRW5jb2Rpbmc9IklTTy04ODU5LTEiJSZndDs8L3ByZT4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+Rm9yIFhNTCBmaWxlcywgeW91IG1pZ2h0IHVzZSB0aGUgZW5jb2RpbmcgcHNldWRvLWF0dHJpYnV0ZSBpbiB0aGUgeG1sIGRlY2xhcmF0aW9uCi1hdCB0aGUgc3RhcnQgb2YgYSBkb2N1bWVudCBvciB0aGUgdGV4dCBkZWNsYXJhdGlvbiBhdCB0aGUgc3RhcnQgb2YgYW4gZW50aXR5LAotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOiA8cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiID8mZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPkZvciAoWClIVE1MIGZpbGVzLCB5b3UgbWlnaHQgdXNlIHRoZSAmbHQ7bWV0YSZndDsgdGFnIGluc2lkZSB0aGUgJmx0O2hlYWQmZ3Q7Ci10YWdzLCBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PHByZT4mbHQ7bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IiAvJmd0OzwvcHJlPgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDEuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Zjg1Yzk1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3NyY2VkdDAwMSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U25pcHBldHMgdmlldzwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZw0KLW9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoDQotZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5TbmlwcGV0cyB2aWV3PGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD4gVGhlIFNuaXBwZXRzIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdQ0KLWRlZmluZSBhbmQgaW5jbHVkZS4gVG8gdmlldyBvciBjb2xsYXBzZSB0aGUgb2JqZWN0cyBpbiBhIHNwZWNpZmljIGRyYXdlciwNCi1jbGljayB0aGUgZHJhd2VyIG5hbWUuPC9wPg0KLTxwPlRoZSBTbmlwcGV0cyB2aWV3IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiA8dWw+DQotPGxpPkRyYWctYW5kLWRyb3AgdG8gdmFyaW91cyBzb3VyY2UgZWRpdGluZyBwYWdlczogWW91IGNhbiBkcmFnIGl0ZW1zIGZyb20NCi10aGUgdmlldyBpbnRvIHRoZSBhY3RpdmUgZWRpdG9yIGFuZCB0aGUgdGV4dCB3aWxsIGJlIGRyb3BwZWQgaW50byB0aGUgZG9jdW1lbnQNCi1hdCB0aGUgY3Vyc29yIGxvY2F0aW9uIDwvbGk+DQotPGxpPkRvdWJsZS1jbGljayBzdXBwb3J0OiBZb3UgY2FuIGRvdWJsZS1jbGljayBvbiBhbiBpdGVtIGFuZCBoYXZlIGl0IGluc2VydGVkDQotYXQgdGhlIGN1cnJlbnQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBhY3RpdmUgZWRpdG9yIDwvbGk+DQotPGxpPlVzZXItZGVmaW5lZCBkcmF3ZXJzIGFuZCBpdGVtczogWW91IGNhbiBkZWZpbmUsIGVkaXQsIGFuZCByZW1vdmUgaXRlbXMNCi1mcm9tIHZpZXcgZHJhd2VycyBhcyBkZXNpcmVkLjwvbGk+DQotPGxpPlBsdWctaW4tZGVmaW5lZCBkcmF3ZXJzIGFuZCBpdGVtczogUGx1Zy1pbiBkZXZlbG9wZXJzIGNhbiBjb250cmlidXRlIGENCi1kZWZhdWx0IGxpc3Qgb2YgaXRlbXMgdG8gdGhlaXIgb3duIGRyYXdlcnMuPC9saT4NCi08bGk+VmFyaWFibGVzIGluIGluc2VydGlvbnM6IEJ5IGRlZmF1bHQsIGl0ZW1zIHdpbGwgYmUgZWRpdGVkIHVzaW5nIGEgZGlhbG9nDQotYW5kLCB3aGVuIGluc2VydGVkLCB5b3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSB2YXJpYWJsZXMuPC9saT4NCi08bGk+Q3VzdG9taXphdGlvbjogWW91IGNhbiBzZWxlY3Qgd2hpY2ggZHJhd2VycyBhbmQgaXRlbXMgYXJlIHNob3duIGluIHRoZQ0KLVNuaXBwZXRzIHZpZXcuPC9saT4NCi08bGk+Q3VzdG9tIGluc2VydGlvbjogUGx1Zy1pbiBkZXZlbG9wZXJzIGNhbiBjdXN0b21pemUgdGhlIGJlaGF2aW9yIG9mIGl0ZW1zDQotc28gdGhhdCB3aGVuIHRoZXkgYXJlIGRyb3BwZWQgZHVyaW5nIGEgZHJhZy1hbmQtZHJvcCBhY3Rpb24sIGJvdGggdGhlIHRleHQNCi10aGF0IGlzIGluc2VydGVkIGFuZCB0aGUgaW5zZXJ0aW9uIGxvY2F0aW9uIGFyZSBzdHJpY3RseSBkZWZpbmVkLjwvbGk+DQotPC91bD48L3A+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTUuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwMS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2U5ZGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDAxLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTbmlwcGV0cyB2aWV3IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlNuaXBwZXRzIHZpZXcsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iU25pcHBldHMgdmlldywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3NyY2VkdDAwMSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNuaXBwZXRzIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNzcmNlZHQwMDEiPjxhIG5hbWU9ImNzcmNlZHQwMDEiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNuaXBwZXRzIHZpZXc8L2gxPgotCi0KLQotPGRpdj48cD5UaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZwotb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHTihKIsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aAotZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy48L3A+Ci0KLTxwPiBUaGUgU25pcHBldHMgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91Ci1kZWZpbmUgYW5kIGluY2x1ZGUuIFRvIHZpZXcgb3IgY29sbGFwc2UgdGhlIG9iamVjdHMgaW4gYSBzcGVjaWZpYyBkcmF3ZXIsCi1jbGljayB0aGUgZHJhd2VyIG5hbWUuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5UaGUgU25pcHBldHMgdmlldyBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczogPHVsPgotPGxpPkRyYWctYW5kLWRyb3AgdG8gdmFyaW91cyBzb3VyY2UgZWRpdGluZyBwYWdlczogWW91IGNhbiBkcmFnIGl0ZW1zIGZyb20KLXRoZSB2aWV3IGludG8gdGhlIGFjdGl2ZSBlZGl0b3IgYW5kIHRoZSB0ZXh0IHdpbGwgYmUgZHJvcHBlZCBpbnRvIHRoZSBkb2N1bWVudAotYXQgdGhlIGN1cnNvciBsb2NhdGlvbiA8L2xpPgotCi08bGk+RG91YmxlLWNsaWNrIHN1cHBvcnQ6IFlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGFuIGl0ZW0gYW5kIGhhdmUgaXQgaW5zZXJ0ZWQKLWF0IHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgYWN0aXZlIGVkaXRvciA8L2xpPgotCi08bGk+VXNlci1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBZb3UgY2FuIGRlZmluZSwgZWRpdCwgYW5kIHJlbW92ZSBpdGVtcwotZnJvbSB2aWV3IGRyYXdlcnMgYXMgZGVzaXJlZC48L2xpPgotCi08bGk+UGx1Zy1pbi1kZWZpbmVkIGRyYXdlcnMgYW5kIGl0ZW1zOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGNvbnRyaWJ1dGUgYQotZGVmYXVsdCBsaXN0IG9mIGl0ZW1zIHRvIHRoZWlyIG93biBkcmF3ZXJzLjwvbGk+Ci0KLTxsaT5WYXJpYWJsZXMgaW4gaW5zZXJ0aW9uczogQnkgZGVmYXVsdCwgaXRlbXMgd2lsbCBiZSBlZGl0ZWQgdXNpbmcgYSBkaWFsb2cKLWFuZCwgd2hlbiBpbnNlcnRlZCwgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUgdmFyaWFibGVzLjwvbGk+Ci0KLTxsaT5DdXN0b21pemF0aW9uOiBZb3UgY2FuIHNlbGVjdCB3aGljaCBkcmF3ZXJzIGFuZCBpdGVtcyBhcmUgc2hvd24gaW4gdGhlCi1TbmlwcGV0cyB2aWV3LjwvbGk+Ci0KLTxsaT5DdXN0b20gaW5zZXJ0aW9uOiBQbHVnLWluIGRldmVsb3BlcnMgY2FuIGN1c3RvbWl6ZSB0aGUgYmVoYXZpb3Igb2YgaXRlbXMKLXNvIHRoYXQgd2hlbiB0aGV5IGFyZSBkcm9wcGVkIGR1cmluZyBhIGRyYWctYW5kLWRyb3AgYWN0aW9uLCBib3RoIHRoZSB0ZXh0Ci10aGF0IGlzIGluc2VydGVkIGFuZCB0aGUgaW5zZXJ0aW9uIGxvY2F0aW9uIGFyZSBzdHJpY3RseSBkZWZpbmVkLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYTczZDUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3NyY2VkdDAwNCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPjxxPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3I8L3E+IGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0DQoteW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvcg0KLVhNTC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGtleXdvcmQ+c291cmNlIGVkaXRvcnM8L2tleXdvcmQ+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPjxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48aW5kZXh0ZXJtPnJlbW92aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi1UaGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyByZXByZXNlbnRlZCBieSB2YXJpb3VzIGVkaXRvcnMgdGhhdCB5b3UgY2FuDQotdXNlIHRvIGVkaXQgZmlsZXMgY29kZWQgd2l0aCBtYXJrdXAgdGFnczo8L3A+DQotPHRhYmxlPg0KLTx0Z3JvdXAgY29scz0iMyI+PGNvbHNwZWMgY29sbmFtZT0iY29sMSIgY29sd2lkdGg9Ijg5KiIvPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDIiDQotY29sd2lkdGg9IjEzNCoiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMCIgY29sd2lkdGg9IjY5KiIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIiB2YWxpZ249InRvcCI+RmlsZSB0eXBlPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiIgdmFsaWduPSJ0b3AiPkVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIiB2YWxpZ249InRvcCI+Q29udGVudCBhc3Npc3Q/PC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5DYXNjYWRpbmcgc3R5bGUgc2hlZXQ8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5DU1Mgc291cmNlIHBhZ2UgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uczwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkRURCBzb3VyY2UgcGFnZSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+Tm88L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkhUTUw8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5IVE1MIHNvdXJjZSBwYWdlIGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+PHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gc291cmNlIHBhZ2UgZWRpdG9yIG9yIHNvdXJjZQ0KLXRhYiBvZiBKYXZhU2NyaXB0IGVkaXRvcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj5ZZXM8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkpTUDwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkpTUCBzb3VyY2UgcGFnZSBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5YTUw8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Tb3VyY2UgdGFiIG9mIFhNTCBlZGl0b3I8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCI+WWVzPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5YU0QgKHNjaGVtYSk8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wyIj5Tb3VyY2UgdGFiIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPlllczwvZW50cnk+DQotPC9yb3c+DQotPC90Ym9keT4NCi08L3Rncm91cD4NCi08L3RhYmxlPg0KLTxwPllvdSBjYW4gYWNjZXNzIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGJ5IHJpZ2h0LWNsaWNraW5nIG9uIGEgcmVsZXZhbnQNCi1maWxlIG5hbWUgaW4gTmF2aWdhdG9yIG9yIFBhY2thZ2UgRXhwbG9yZXIgdmlldyBhbmQgdGhlbiBjbGlja2luZyA8dWljb250cm9sPk9wZW4NCi1XaXRoPC91aWNvbnRyb2w+IGFuZCBzZWxlY3RpbmcgdGhlIGVkaXRvciBtZW50aW9uZWQgYWJvdmUuPC9wPg0KLTxwPlRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHByb3ZpZGVzIGEgY29uc2lzdGVudCBpbnRlcmZhY2UgcmVnYXJkbGVzcyBvZg0KLXRoZSBtYXJrdXAgbGFuZ3VhZ2Ugd2l0aCB3aGljaCBpdCBpcyBhc3NvY2lhdGVkLiBJdCBwcm92aWRlcyBjYXBhYmlsaXRpZXMNCi1zdWNoIGFzIGZpbmQgYW5kIHJlcGxhY2UsIHVuZG8sIHJlZG8sIGEgc3BlbGxpbmcgY2hlY2tlciwgYW5kIGNvZGluZyBhc3Npc3RhbmNlDQotKHVubGVzcyBvdGhlcndpc2Ugbm90ZWQpLiBJdCBhbHNvIGhpZ2hsaWdodHMgc3ludGF4IGluIGRpZmZlcmVudCBjb2xvcnMuIEZvbGxvd2luZw0KLWlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcidzIGNhcGFiaWxpdGllczo8L3A+DQotPGRsPjxkbGVudHJ5Pg0KLTxkdD5zeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4NCi08ZGQ+RWFjaCBrZXl3b3JkIHR5cGUgYW5kIHN5bnRheCB0eXBlIGlzIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5LCBlbmFibGluZw0KLXlvdSB0byBlYXNpbHkgZmluZCBhIGNlcnRhaW4ga2luZCBvZiBrZXl3b3JkIGZvciBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgaW4NCi1IVE1MLCBlbGVtZW50IG5hbWVzLCBhdHRyaWJ1dGUgbmFtZXMsIGF0dHJpYnV0ZSB2YWx1ZXMsIGFuZCBjb21tZW50cyBoYXZlDQotZGlmZmVyZW50IGNvbG9yczsgaW4gPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZQ0KLW5hbWVzLCBxdW90ZWQgdGV4dCBzdHJpbmdzLCBhbmQgY29tbWVudHMgaGF2ZSBkaWZmZXJlbnQgY29sb3JzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD51bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbzwvZHQ+DQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UgbWFkZQ0KLXRvIGEgZmlsZSBmb3IgdGhlIGVudGlyZSBlZGl0aW5nIHNlc3Npb24uIEZvciB0ZXh0LCBjaGFuZ2VzIGFyZSBpbmNyZW1lbnRlZA0KLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5jb250ZW50IGFzc2lzdDwvZHQ+DQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSB0byBpbnNlcnQgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gZnVuY3Rpb25zLCBIVE1MIHRhZ3MsIG9yDQotb3RoZXIga2V5d29yZHMuIENob2ljZXMgYXZhaWxhYmxlIGluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGFyZSBiYXNlZCBvbg0KLWZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBzeW50YXggb2YgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBmaWxlIGlzIGNvZGVkLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD51c2VyLWRlZmluZWQgdGVtcGxhdGVzIGFuZCBzbmlwcGV0czwvZHQ+DQotPGRkPkJ5IHVzaW5nIHRoZSBTbmlwcGV0cyB2aWV3LCB5b3UgY2FuIGFjY2VzcyB1c2VyLWRlZmluZWQgY29kZSBzbmlwcGV0cw0KLWFuZCAoZm9yIGFsbCBjb2RlIHR5cGVzIGV4Y2VwdCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPikgdGVtcGxhdGVzIHRvIGhlbHAgeW91DQotcXVpY2tseSBhZGQgcmVndWxhcmx5IHVzZWQgdGV4dCBzdHJpbmdzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5mdW5jdGlvbiBzZWxlY3Rpb248L2R0Pg0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IsIHRoZSBmdW5jdGlvbiBvciB0YWcgc2VsZWN0aW9uIGluZGljYXRvcg0KLWhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBmdW5jdGlvbiBvciB0YWcgaW4gdGhlIHZlcnRpY2FsDQotcnVsZXIgb24gdGhlIGxlZnQgYXJlYSBvZiB0aGUgU291cmNlIHBhZ2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PnBvcC11cCBtZW51IG9wdGlvbnM8L2R0Pg0KLTxkZD5UaGVzZSBhcmUgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zIGF2YWlsYWJsZSBpbiB0aGUgd29ya2JlbmNoIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPiBtZW51LjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA2LmRpdGEiPjxsaW5rdGV4dD5Db250ZW50IGFzc2lzdDwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNkNTVlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIiAvPgotPG1ldGEgY29udGVudD0ic291cmNlIGVkaXRvcnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzb3VyY2UgZWRpdG9ycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDYuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNzcmNlZHQwMDQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3NyY2VkdDAwNCI+PGEgbmFtZT0iY3NyY2VkdDAwNCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPjxzcGFuIGNsYXNzPSJxIj4iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciI8L3NwYW4+IGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0Ci15b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yCi1YTUwuPC9wPgotCi08cD4KLQotVGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgcmVwcmVzZW50ZWQgYnkgdmFyaW91cyBlZGl0b3JzIHRoYXQgeW91IGNhbgotdXNlIHRvIGVkaXQgZmlsZXMgY29kZWQgd2l0aCBtYXJrdXAgdGFnczo8L3A+Ci0KLQotPGRpdiBjbGFzcz0idGFibGVub2JvcmRlciI+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBmcmFtZT0iYm9yZGVyIiBib3JkZXI9IjEiIHJ1bGVzPSJhbGwiPgotPHRoZWFkIGFsaWduPSJsZWZ0Ij4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaWQ9Ik4xMDA4QSI+RmlsZSB0eXBlPC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBpZD0iTjEwMDkyIj5FZGl0b3I8L3RoPgotCi08dGggdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGlkPSJOMTAwOUEiPkNvbnRlbnQgYXNzaXN0PzwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDhBICI+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOTIgIj5DU1Mgc291cmNlIHBhZ2UgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOUEgIj5ZZXM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIzMC40Nzk0NTIwNTQ3OTQ1MiUiIGhlYWRlcnM9Ik4xMDA4QSAiPkRvY3VtZW50IHR5cGUgZGVmaW5pdGlvbnM8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0NS44OTA0MTA5NTg5MDQxMSUiIGhlYWRlcnM9Ik4xMDA5MiAiPkRURCBzb3VyY2UgcGFnZSBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5QSAiPk5vPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzAuNDc5NDUyMDU0Nzk0NTIlIiBoZWFkZXJzPSJOMTAwOEEgIj5IVE1MPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOTIgIj5IVE1MIHNvdXJjZSBwYWdlIGVkaXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjYzMDEzNjk4NjMwMTM3JSIgaGVhZGVycz0iTjEwMDlBICI+WWVzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzAuNDc5NDUyMDU0Nzk0NTIlIiBoZWFkZXJzPSJOMTAwOEEgIj5KYXZhU2NyaXB04oSiPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOTIgIj5KYXZhU2NyaXB0IHNvdXJjZSBwYWdlIGVkaXRvciBvciBzb3VyY2UKLXRhYiBvZiBKYXZhU2NyaXB0IGVkaXRvcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjIzLjYzMDEzNjk4NjMwMTM3JSIgaGVhZGVycz0iTjEwMDlBICI+WWVzPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzAuNDc5NDUyMDU0Nzk0NTIlIiBoZWFkZXJzPSJOMTAwOEEgIj5KU1A8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI0NS44OTA0MTA5NTg5MDQxMSUiIGhlYWRlcnM9Ik4xMDA5MiAiPkpTUCBzb3VyY2UgcGFnZSBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5QSAiPlllczwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDhBICI+WE1MPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOTIgIj5Tb3VyY2UgdGFiIG9mIFhNTCBlZGl0b3I8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSIyMy42MzAxMzY5ODYzMDEzNyUiIGhlYWRlcnM9Ik4xMDA5QSAiPlllczwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjMwLjQ3OTQ1MjA1NDc5NDUyJSIgaGVhZGVycz0iTjEwMDhBICI+WFNEIChzY2hlbWEpPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iNDUuODkwNDEwOTU4OTA0MTElIiBoZWFkZXJzPSJOMTAwOTIgIj5Tb3VyY2UgdGFiIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMjMuNjMwMTM2OTg2MzAxMzclIiBoZWFkZXJzPSJOMTAwOUEgIj5ZZXM8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxwPllvdSBjYW4gYWNjZXNzIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGJ5IHJpZ2h0LWNsaWNraW5nIG9uIGEgcmVsZXZhbnQKLWZpbGUgbmFtZSBpbiBOYXZpZ2F0b3Igb3IgUGFja2FnZSBFeHBsb3JlciB2aWV3IGFuZCB0aGVuIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4KLVdpdGg8L3NwYW4+IGFuZCBzZWxlY3RpbmcgdGhlIGVkaXRvciBtZW50aW9uZWQgYWJvdmUuPC9wPgotCi08cD5UaGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBwcm92aWRlcyBhIGNvbnNpc3RlbnQgaW50ZXJmYWNlIHJlZ2FyZGxlc3Mgb2YKLXRoZSBtYXJrdXAgbGFuZ3VhZ2Ugd2l0aCB3aGljaCBpdCBpcyBhc3NvY2lhdGVkLiBJdCBwcm92aWRlcyBjYXBhYmlsaXRpZXMKLXN1Y2ggYXMgZmluZCBhbmQgcmVwbGFjZSwgdW5kbywgcmVkbywgYSBzcGVsbGluZyBjaGVja2VyLCBhbmQgY29kaW5nIGFzc2lzdGFuY2UKLSh1bmxlc3Mgb3RoZXJ3aXNlIG5vdGVkKS4gSXQgYWxzbyBoaWdobGlnaHRzIHN5bnRheCBpbiBkaWZmZXJlbnQgY29sb3JzLiBGb2xsb3dpbmcKLWlzIGEgYnJpZWYgZGVzY3JpcHRpb24gb2Ygc29tZSBvZiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcidzIGNhcGFiaWxpdGllczo8L3A+Ci0KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5zeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4KLQotPGRkPkVhY2gga2V5d29yZCB0eXBlIGFuZCBzeW50YXggdHlwZSBpcyBoaWdobGlnaHRlZCBkaWZmZXJlbnRseSwgZW5hYmxpbmcKLXlvdSB0byBlYXNpbHkgZmluZCBhIGNlcnRhaW4ga2luZCBvZiBrZXl3b3JkIGZvciBlZGl0aW5nLiBGb3IgZXhhbXBsZSwgaW4KLUhUTUwsIGVsZW1lbnQgbmFtZXMsIGF0dHJpYnV0ZSBuYW1lcywgYXR0cmlidXRlIHZhbHVlcywgYW5kIGNvbW1lbnRzIGhhdmUKLWRpZmZlcmVudCBjb2xvcnM7IGluIEphdmFTY3JpcHQsIGZ1bmN0aW9uIGFuZCB2YXJpYWJsZQotbmFtZXMsIHF1b3RlZCB0ZXh0IHN0cmluZ3MsIGFuZCBjb21tZW50cyBoYXZlIGRpZmZlcmVudCBjb2xvcnMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+dW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0PgotCi08ZGQ+VGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8gaW5jcmVtZW50YWxseSB1bmRvIGFuZCByZWRvIGV2ZXJ5IGNoYW5nZSBtYWRlCi10byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUgaW5jcmVtZW50ZWQKLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPmNvbnRlbnQgYXNzaXN0PC9kdD4KLQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSB0byBpbnNlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbnMsIEhUTUwgdGFncywgb3IKLW90aGVyIGtleXdvcmRzLiBDaG9pY2VzIGF2YWlsYWJsZSBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCBhcmUgYmFzZWQgb24KLWZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoZSBzeW50YXggb2YgdGhlIGxhbmd1YWdlIGluIHdoaWNoIHRoZSBmaWxlIGlzIGNvZGVkLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPnVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMgYW5kIHNuaXBwZXRzPC9kdD4KLQotPGRkPkJ5IHVzaW5nIHRoZSBTbmlwcGV0cyB2aWV3LCB5b3UgY2FuIGFjY2VzcyB1c2VyLWRlZmluZWQgY29kZSBzbmlwcGV0cwotYW5kIChmb3IgYWxsIGNvZGUgdHlwZXMgZXhjZXB0IEphdmFTY3JpcHQpIHRlbXBsYXRlcyB0byBoZWxwIHlvdQotcXVpY2tseSBhZGQgcmVndWxhcmx5IHVzZWQgdGV4dCBzdHJpbmdzLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPmZ1bmN0aW9uIHNlbGVjdGlvbjwvZHQ+Ci0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IsIHRoZSBmdW5jdGlvbiBvciB0YWcgc2VsZWN0aW9uIGluZGljYXRvcgotaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIGZ1bmN0aW9uIG9yIHRhZyBpbiB0aGUgdmVydGljYWwKLXJ1bGVyIG9uIHRoZSBsZWZ0IGFyZWEgb2YgdGhlIFNvdXJjZSBwYWdlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPnBvcC11cCBtZW51IG9wdGlvbnM8L2R0PgotCi08ZGQ+VGhlc2UgYXJlIHRoZSBzYW1lIGVkaXRpbmcgb3B0aW9ucyBhdmFpbGFibGUgaW4gdGhlIHdvcmtiZW5jaCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiBtZW51LjwvZGQ+Ci0KLTwvZGw+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNi5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLiI+Q29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDUwOWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiLi5cZHRkXGNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3NyY2VkdDAwNiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q29udGVudCBhc3Npc3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+Q29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3INCi1maW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3INCi1pbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucw0KLWZvciBjb21wbGV0aW9uLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPmNvbnRlbnQgYXNzaXN0PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPk1vc3Qgb2YgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGhhdmUgY29udGVudCBhc3Npc3QuIEZvciBhIGxpc3Qgb2YNCi1lZGl0b3JzIHRoYXQgaGF2ZSBjb250ZW50IGFzc2lzdCwgc2VlIDx4cmVmIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSIgdHlwZT0iY29uY2VwdCI+U3RydWN0dXJlZA0KLXRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlczwveHJlZj4uIEZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2V0IGNvbnRlbnQNCi1hc3Npc3RhbmNlLCBzZWUgPHhyZWYgaHJlZj0idHNyY2VkdDAwNS5kaXRhIiB0eXBlPSJ0YXNrIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZQ0KLWluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC94cmVmPjwvcD4NCi08cD5UaGUgc2VjdGlvbnMgYmVsb3cgZGVzY3JpYmUgc3BlY2lmaWNzIG9mIEhUTUwgY29udGVudCBhc3Npc3QsIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IGNvbnRlbnQNCi1hc3Npc3QsIGFuZCBKU1AgY29udGVudCBhc3Npc3QuPC9wPg0KLTxzZWN0aW9uPjx0aXRsZT5IVE1MIGNvbnRlbnQgYXNzaXN0PC90aXRsZT48cD5IVE1MIGlzIGZsZXhpYmxlIGluIHRoYXQgc29tZQ0KLUhUTUwgZWxlbWVudHMgYWxsb3cgZW5kIHRhZ3MgdG8gYmUgb3B0aW9uYWxseSBvbWl0dGVkLCBzdWNoIGFzIDxjb2RlcGg+UDwvY29kZXBoPiwgPGNvZGVwaD5EVDwvY29kZXBoPiwgPGNvZGVwaD5ERDwvY29kZXBoPiwgPGNvZGVwaD5MSTwvY29kZXBoPiwgPGNvZGVwaA0KLT5USEVBRDwvY29kZXBoPiwgPGNvZGVwaD5UUjwvY29kZXBoPiwgPGNvZGVwaD5URDwvY29kZXBoPiwgPGNvZGVwaD5USDwvY29kZXBoPiwNCi1hbmQgc28gb24uIE90aGVyIEhUTUwgZWxlbWVudHMgdGhhdCBhcmUgZGVmaW5lZCB0byBoYXZlIG5vIGNvbnRlbnQgbWF5IHJlcXVpcmUNCi10aGUgZW5kIHRhZyBhbHdheXMgYmUgb21pdHRlZCwgc3VjaCBhcyA8Y29kZXBoPkJSPC9jb2RlcGg+LCA8Y29kZXBoPkhSPC9jb2RlcGg+LCA8Y29kZXBoPkxJTks8L2NvZGVwaD4sIDxjb2RlcGg+TUVUQTwvY29kZXBoPiwNCi1hbmQgPGNvZGVwaD5JTUc8L2NvZGVwaD4uIFRoaXMgZmxleGliaWxpdHkgbWFrZXMgdGhlIGNvbnRlbnQgYXNzaXN0IGZ1bmN0aW9uDQotd2l0aGluIHRoZSBIVE1MIHNvdXJjZSBwYWdlIGVkaXRvciBsZXNzIHByZWNpc2UgdGhhbiBpdCBtaWdodCBiZSB3aXRoIGEgbW9yZQ0KLXJpZ2lkbHkgY29uc3RyYWluZWQgbWFya3VwIGxhbmd1YWdlLjwvcD48cD5IVE1MIGNvbnRlbnQgYXNzaXN0IGlzIG1vc3QgYmVuZWZpY2lhbA0KLXdoZW4geW91IG5lZWQgdG8gY29tcGxldGUgYSB0YWcgbmFtZSwgYWRkIGFuIGF0dHJpYnV0ZSBuYW1lLXZhbHVlIHBhaXIgd2l0aGluDQotYSBzdGFydCB0YWcsIG9yIHNlbGVjdCBmcm9tIGFuIGVudW1lcmF0ZWQgbGlzdCBvZiBhdHRyaWJ1dGUgdmFsdWVzLjwvcD48cD5BbHRob3VnaA0KLWNvbnRlbnQgYXNzaXN0IG9ubHkgc2hvd3MgYXR0cmlidXRlIG5hbWVzIHRoYXQgaGF2ZSBub3QgYWxyZWFkeSBiZWVuIHNwZWNpZmllZA0KLWluIGEgc3RhcnQgdGFnLCBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBncmFtbWFyIGNvbnN0cmFpbnRzIGZvciB0YWdzLg0KLUZvciBleGFtcGxlLCB0aGUgPGNvZGVwaD5IRUFEPC9jb2RlcGg+IGVsZW1lbnQgaW4gSFRNTCBvbmx5IHBlcm1pdHMgemVybyBvcg0KLW9uZSBvY2N1cnJlbmNlcyBvZiBhIDxjb2RlcGg+VElUTEU8L2NvZGVwaD4gdGFnIGluIGl0cyBjb250ZW50LiBJZiB5b3UgcHJvbXB0DQotZm9yIGNvbnRlbnQgYXNzaXN0IHdpdGhpbiBhIDxjb2RlcGg+SEVBRDwvY29kZXBoPiBjb250ZW50IHRoYXQgYWxyZWFkeSBjb250YWlucw0KLWEgPGNvZGVwaD5USVRMRTwvY29kZXBoPiB0YWcsIGNvbnRlbnQgYXNzaXN0IHdpbGwgc3RpbGwgc2hvdyA8Y29kZXBoPlRJVExFPC9jb2RlcGg+IGluDQotaXRzIHByb3Bvc2FsIGxpc3QuPC9wPjxwPkhvd2V2ZXIsIGlmIGFuIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBhY2NvcmRpbmcgdG8NCi10aGUgRFREL1NjaGVtYSwgdGhhdCBhdHRyaWJ1dGUgd2lsbCBzaG93IHVwIGF0IHRoZSB0b3Agb2YgdGhlIGxpc3QsIHdpdGggYQ0KLXllbGxvdyBjaXJjbGUgaW5kaWNhdG9yIG9uIGl0cyBpY29uLjwvcD48cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uDQotd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZC4NCi1UaGUgbGlzdCBpcyBiYXNlZCBvbiB0aGUgY29udGV4dC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgZGlyZWN0bHkNCi1hZnRlciBhbiBvcGVuaW5nIHBhcmFncmFwaCB0YWcgKDxjb2RlcGg+Jmx0O3A+PC9jb2RlcGg+KSAsIHRoZSBmaXJzdCBpdGVtDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3Qgd2lsbCBiZSB0aGUgY29ycmVzcG9uZGluZyBjbG9zaW5nIHBhcmFncmFwaCAoPGNvZGVwaD4mbHQ7L3A+PC9jb2RlcGg+KQ0KLXRhZy48L3A+PHA+VGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgZGlzcGxheXMgYWxsIGF2YWlsYWJsZSB0YWdzIGZvciB0aGUgY3VycmVudA0KLWN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gVGhlIHBpY3R1cmUgYmVsb3cgc2hvd3MgdGhlIGRlZmF1bHQNCi1jb250ZW50IGFzc2lzdCBsaXN0IGZvciBhIHBhcmFncmFwaCB0YWcgZXhhbXBsZTo8aW1hZ2UgYWx0PSJIVE1MIENvbnRlbnQgYXNzaXN0Ig0KLWhyZWY9Ii4uL2ltYWdlcy9uY29udGFzcy5naWYiIHBsYWNlbWVudD0iYnJlYWsiPjwvaW1hZ2U+PC9wPjxwPlRhZyBwcm9wb3NhbHMNCi1hcmUgbGlzdGVkIGFscGhhYmV0aWNhbGx5LiBJZiB5b3UgdHlwZSBhIDxjb2RlcGg+Jmx0OzwvY29kZXBoPiAodG8gYmVnaW4gYQ0KLW5ldyB0YWcpIGJlZm9yZSBwcm9tcHRpbmcgZm9yIGNvbnRlbnQgYXNzaXN0LCBhbmQgYmVnaW4gdHlwaW5nIHRoZSBmaXJzdCBvbmUNCi1vciB0d28gbGV0dGVycyBvZiB0aGUgdGFnIHRoYXQgeW91IHdhbnQgdG8gYWRkLCB0aGUgcHJvcG9zYWwgbGlzdCBhdXRvbWF0aWNhbGx5DQotcmVmcmVzaGVzIHRvIHJlZmxlY3QgcHJvcG9zYWxzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4geW91IGhhdmUgdHlwZWQuIElmIHlvdQ0KLWRvIG5vdCB0eXBlIGEgPGNvZGVwaD4mbHQ7PC9jb2RlcGg+IGJlZm9yZSBwcm9tcHRpbmcgZm9yIGNvbnRlbnQgYXNzaXN0LCB5b3UNCi1jYW4gY2xpY2sgd2l0aGluIHRoZSBwcm9wb3NhbCBsaXN0IGFuZCB0aGVuIHR5cGUgdGhlIGxldHRlciB0aGF0IHRoZSB0YWcgYmVnaW5zDQotd2l0aCwgdG8gcmVkdWNlIChzb21ld2hhdCkgdGhlIGFtb3VudCBvZiBzY3JvbGxpbmcgdG8gbG9jYXRlIHRoZSBkZXNpcmVkIHRhZy48L3A+PHA+QXMNCi15b3UgdHlwZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsZXR0ZXJzIG9mIHRoZSBhdHRyaWJ1dGUgbmFtZXMgb3IgZW51bWVyYXRlZA0KLWF0dHJpYnV0ZSB2YWx1ZXMgdGhhdCB5b3Ugd2FudCB0byBhZGQgdG8gYSB0YWcsIHRoZSBsaXN0IGF1dG9tYXRpY2FsbHkgcmVmcmVzaGVzDQotdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZC48L3A+PG5vdGUgdHlwZT0icmVzdHJpY3Rpb24iPjxpbWFnZQ0KLWFsdD0iRm9yIExpbnV4LiIgaHJlZj0iLi4vaW1hZ2VzL25saW51eC5naWYiPjwvaW1hZ2U+IFdoZW4gdXNpbmcgTGludXggKE1vdGlmDQotb3IgR1RLKSBhbmQgYSBEQkNTIGxvY2FsZSwgZG91YmxlLWNsaWNraW5nIG9uIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGNhbg0KLXNvbWV0aW1lcyBjYXVzZSB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gVk0gdG8gdGVybWluYXRlLiBJbnN0ZWFkIG9mIGRvdWJsZS1jbGlja2luZw0KLW9uIHRoZSBsaXN0LCB1c2UgdGhlIGFycm93cyBhbmQgRW50ZXIga2V5cyB0byBtYWtlIHRoZSBzZWxlY3Rpb24gZnJvbSB0aGUNCi1saXN0Ljwvbm90ZT48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IGNvbnRlbnQgYXNzaXN0PC90aXRsZT48cD5JdGVtcyBpbiB0aGUgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gY29udGVudA0KLWFzc2lzdCBsaXN0IGFyZSBwcmVjZWRlZCBieSBhbiBJbnRlcm5ldCBFeHBsb3JlciBpY29uLCBhIE5ldHNjYXBlIGljb24sIG9yDQotYm90aCwgdG8gaW5kaWNhdGUgd2hldGhlciBzcGVjaWZpYyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBvYmplY3RzLCBtZXRob2RzLCBvciBmdW5jdGlvbnMNCi1hcmUgc3VwcG9ydGVkIGJ5IG9uZSBvciBib3RoIGJyb3dzZXJzLiBJZiB0aGUgSW50ZXJuZXQgRXhwbG9yZXIgaWNvbiBpcyBwcmVzZW50LA0KLWl0IGluZGljYXRlcyB0aGF0IHRoZSBvYmplY3QsIG1ldGhvZCwgb3IgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IEludGVybmV0DQotRXhwbG9yZXIgVmVyc2lvbiA1LjAgb3IgaGlnaGVyLiAgSWYgdGhlIE5ldHNjYXBlIGljb24gaXMgcHJlc2VudCwgaXQgaW5kaWNhdGVzDQotdGhhdCB0aGUgb2JqZWN0LCBtZXRob2QsIG9yIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSBOZXRzY2FwZSBOYXZpZ2F0b3IgVmVyc2lvbg0KLTQuNyBvciBoaWdoZXIuIEEgcXVlc3Rpb24gbWFyayBpY29uICg8aW1hZ2UgYWx0PSJRdWVzdGlvbiBtYXJrIGljb24iIGhyZWY9Ii4uL2ltYWdlcy9ucXVlc3QuZ2lmIg0KLXBsYWNlbWVudD0iaW5saW5lIj48L2ltYWdlPikgaW4gcGxhY2Ugb2Ygb25lIG9mIHRoZSBicm93c2VyIGljb25zIGluZGljYXRlcw0KLXRoYXQgaXQgaXMgdW5rbm93biB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBvYmplY3QsIG1ldGhvZCwgb3IgZnVuY3Rpb24uPC9wPjxwPlRoZQ0KLXBpY3R1cmUgYmVsb3cgc2hvd3MgdGhlIGRlZmF1bHQgY29udGVudCBhc3Npc3QgbGlzdCB3aXRoaW4gYSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBmaWxlOjxpbWFnZQ0KLWFsdD0iSmF2YVNjcmlwdCBjb250ZW50IGFzc2lzdCIgaHJlZj0iLi4vaW1hZ2VzL25qc2NkYXN0LmdpZiIgcGxhY2VtZW50PSJicmVhayI+DQotPC9pbWFnZT48L3A+PHA+Q29kZSBwcm9wb3NhbHMgYXJlIGxpc3RlZCBhbHBoYWJldGljYWxseS4gSWYgeW91IHR5cGUgYSA8Y29kZXBoPi4gPC9jb2RlcGg+IChpbmNsdWRlDQotdGhlIHNwYWNlKSBiZWZvcmUgcHJvbXB0aW5nIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGJlZ2luIHR5cGluZyB0aGUgZmlyc3QNCi1vbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIGNvZGUgdGhhdCB5b3Ugd2FudCB0byBhZGQsIHRoZSBwcm9wb3NhbCBsaXN0IGF1dG9tYXRpY2FsbHkNCi1yZWZyZXNoZXMgdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZCwgdG8gcmVkdWNlDQotKHNvbWV3aGF0KSB0aGUgYW1vdW50IG9mIHNjcm9sbGluZyB0byBsb2NhdGUgdGhlIGRlc2lyZWQgY29kZS48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5KU1AgY29udGVudCBhc3Npc3Q8L3RpdGxlPjxwPllvdSBoYXZlIG1hbnkgb3B0aW9ucyBmb3IgZW1iZWRkaW5nIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGFuZA0KLUhUTUwgY29kZSBpbiB5b3VyIEpTUCBwYWdlcyBieSB1c2luZyBjb250ZW50IGFzc2lzdC48L3A+PHA+QWxsIG9mIHRoZSBKU1ANCi10YWdzIGFyZSBpbmNsdWRlZCBib3RoIGluIHRoZSB0ZW1wbGF0ZSBsaXN0IGFuZCBpbiBYTUwgZm9ybWF0IChmb3IgZXhhbXBsZSwgPGNvZGVwaD4mbHQ7anNwOmV4cHJlc3Npb24+PC9jb2RlcGg+KS4NCi1UbyBhZGQgSlNQIHNjcmlwdGxldCB0YWdzLCBmb3IgZXhhbXBsZSwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBhcHByb3ByaWF0ZQ0KLXBvc2l0aW9uIGluIHRoZSBmaWxlIGFuZCBwcmVzcyBDdHJsK1NwYWNlIHRvIHVzZSBjb250ZW50IGFzc2lzdC4gU2VsZWN0IDxpbWFnZQ0KLWFsdD0iSlNQIHNjcmlwdGxldCBjb250ZW50IGFzc2lzdCIgaHJlZj0iLi4vaW1hZ2VzL25tYWNzY3JwLmdpZiIgcGxhY2VtZW50PSJpbmxpbmUiPg0KLTwvaW1hZ2U+IGZyb20gdGhlIHByb3Bvc2FsIGxpc3QgdG8gaW5zZXJ0IDxjb2RlcGg+Jmx0OyUgJT48L2NvZGVwaD4gIGluIHRoZQ0KLWRvY3VtZW50LjwvcD48cD5TY3JpcHRsZXRzIGFyZSBpbnNlcnRlZCBpbiBhIHRhZyA8Y29kZXBoPiZsdDslICU+PC9jb2RlcGg+Lg0KLUZvciBleGFtcGxlOiA8Y29kZWJsb2NrPiZsdDslIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICU+PC9jb2RlYmxvY2s+PC9wPjxwPlRoaXMNCi1leGFtcGxlIHdpbGwgZXZhbHVhdGUgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHN0YXRlbWVudCB0byBnZXQgdGhlIGN1cnJlbnQgdGltZSBpbg0KLW1pbGxpc2Vjb25kcy48L3A+PHA+VG8gaGF2ZSB0aGUgcmVzdWx0IG9mIHRoZSBzdGF0ZW1lbnQgaW5zZXJ0ZWQgaW4gdGhlIGZpbGUsDQotcHV0IGFuIGVxdWFscyBzaWduICg9KSBpbiB0aGUgZnJvbnQgb2YgdGhlIHN0YXRlbWVudC4gRm9yIGV4YW1wbGU6IDxjb2RlYmxvY2s+Jmx0O2I+VGhpcyBpcyB0aGUgdGltZSA6ICZsdDslPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSU+Jmx0Oy9iPjwvY29kZWJsb2NrDQotPjwvcD48cD5XaGVuIHlvdSBhcmUgd2l0aGluIGEgc2NyaXB0bGV0IHlvdSBhcmUgd3JpdGluZyBwdXJlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvZGUuDQotVGhlcmVmb3JlLCBjb250ZW50IGFzc2lzdCB3b3JrcyBleGFjdGx5IHRoZSBzYW1lIGFzIGl0IGRvZXMgZm9yIHRoZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBlZGl0b3IuDQotRm9yIGV4YW1wbGUsIGlmIHlvdSByZXF1ZXN0IGNvbnRlbnQgYXNzaXN0IGFmdGVyIDxjb2RlcGg+U3lzdGVtPC9jb2RlcGg+LA0KLWNvbnRlbnQgYXNzaXN0IGRpc3BsYXlzIGEgbGlzdCBvZiBtZXRob2RzLiA8bm90ZT48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb250ZW50IGFzc2lzdCB3b3JrcyBvbmx5IGluIGEgV2ViDQotcHJvamVjdCwgYmVjYXVzZSBpdCByZXF1aXJlcyBhIGJ1aWxkcGF0aCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGFzc2VzLjwvbm90ZT48L3A+PHA+VGhlcmUNCi1hcmUgYWxzbyBzcGVjaWFsIHRhZ3Mgc3VjaCBhcyB1c2VCZWFuLiBGb3IgZXhhbXBsZTogPGNvZGVibG9jaz4mbHQ7anNwOnVzZUJlYW4gaWQ9InVzZUJlYW4iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8+PC9jb2RlYmxvY2s+PC9wPjxwPlRoZQ0KLXVzZUJlYW4gdGFnIGVuYWJsZXMgeW91IHRvIGNyZWF0ZSBhIGJlYW4gY2FsbGVkIDxjb2RlcGg+YVN0cmluZzwvY29kZXBoPiBvZg0KLXR5cGUgPGNvZGVwaD5TdHJpbmc8L2NvZGVwaD4uIFRoZW4gd2hlbiB5b3UgdXNlIGNvbnRlbnQgYXNzaXN0LCB0aGlzIGlzIHJlY29nbml6ZWQNCi1hcyBhIGRlY2xhcmVkIHZhcmlhYmxlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBhZnRlciA8Y29kZXBoPmFTdHJpbmc8L2NvZGVwaD4sDQotYXMgZm9sbG93czo8L3A+PHA+IDxjb2RlYmxvY2s+Jmx0OyUgYVN0cmluZy4gJT4gPC9jb2RlYmxvY2s+dGhlIGNvbnRlbnQgYXNzaXN0DQotbGlzdCBzaG93cyBhdmFpbGFibGUgbWV0aG9kcy4gVGhpcyBpcyBiZWNhdXNlIDxjb2RlcGg+YVN0cmluZzwvY29kZXBoPiBoYXMNCi1iZWVuIGRlY2xhcmVkIGFzIGEgYmVhbiBvZiB0eXBlIFN0cmluZy48L3A+PHA+SWYgeW91IHVzZSBjb250ZW50IGFzc2lzdCBhZnRlcg0KLXRoZSA8Y29kZXBoPmE8L2NvZGVwaD4sIGFzIGZvbGxvd3M6IDxjb2RlYmxvY2s+Jmx0OyUgYSAlPiA8L2NvZGVibG9jaz5jb250ZW50DQotYXNzaXN0IGtub3dzIHRoYXQgPGNvZGVwaD5hU3RyaW5nPC9jb2RlcGg+IGV4aXN0cywgYW5kIGl0IGlzIHNob3duIGluIHRoZQ0KLWNvbnRlbnQgYXNzaXN0IGxpc3QuPC9wPjwvc2VjdGlvbj4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDA1LmRpdGEiPjxsaW5rdGV4dD5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkDQotdGV4dCBlZGl0b3JzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTdlNzg4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbnRlbnQgYXNzaXN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLiIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbnRlbnQgYXNzaXN0LCBvdmVydmlldywgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdCwgb3ZlcnZpZXcsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDA1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjc3JjZWR0MDA2IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q29udGVudCBhc3Npc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNzcmNlZHQwMDYiPjxhIG5hbWU9ImNzcmNlZHQwMDYiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNvbnRlbnQgYXNzaXN0PC9oMT4KLQotCi0KLTxkaXY+PHA+Q29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IKLWZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvcgotaW4gdGhlIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMKLWZvciBjb21wbGV0aW9uLjwvcD4KLQotPHA+TW9zdCBvZiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgaGF2ZSBjb250ZW50IGFzc2lzdC4gRm9yIGEgbGlzdCBvZgotZWRpdG9ycyB0aGF0IGhhdmUgY29udGVudCBhc3Npc3QsIHNlZSA8YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzPC9hPi4gRm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZXQgY29udGVudAotYXNzaXN0YW5jZSwgc2VlIDxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9wPgotCi08cD5UaGUgc2VjdGlvbnMgYmVsb3cgZGVzY3JpYmUgc3BlY2lmaWNzIG9mIEhUTUwgY29udGVudCBhc3Npc3QsIEphdmFTY3JpcHTihKIgY29udGVudAotYXNzaXN0LCBhbmQgSlNQIGNvbnRlbnQgYXNzaXN0LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkhUTUwgY29udGVudCBhc3Npc3Q8L2g0PjxwPkhUTUwgaXMgZmxleGlibGUgaW4gdGhhdCBzb21lCi1IVE1MIGVsZW1lbnRzIGFsbG93IGVuZCB0YWdzIHRvIGJlIG9wdGlvbmFsbHkgb21pdHRlZCwgc3VjaCBhcyA8c2FtcCBjbGFzcz0iY29kZXBoIj5QPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+RFQ8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5ERDwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkxJPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VEhFQUQ8L3NhbXA+LCA8c2FtcCBjbGFzcz0iY29kZXBoIj5UUjwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlREPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VEg8L3NhbXA+LAotYW5kIHNvIG9uLiBPdGhlciBIVE1MIGVsZW1lbnRzIHRoYXQgYXJlIGRlZmluZWQgdG8gaGF2ZSBubyBjb250ZW50IG1heSByZXF1aXJlCi10aGUgZW5kIHRhZyBhbHdheXMgYmUgb21pdHRlZCwgc3VjaCBhcyA8c2FtcCBjbGFzcz0iY29kZXBoIj5CUjwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPkhSPC9zYW1wPiwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+TElOSzwvc2FtcD4sIDxzYW1wIGNsYXNzPSJjb2RlcGgiPk1FVEE8L3NhbXA+LAotYW5kIDxzYW1wIGNsYXNzPSJjb2RlcGgiPklNRzwvc2FtcD4uIFRoaXMgZmxleGliaWxpdHkgbWFrZXMgdGhlIGNvbnRlbnQgYXNzaXN0IGZ1bmN0aW9uCi13aXRoaW4gdGhlIEhUTUwgc291cmNlIHBhZ2UgZWRpdG9yIGxlc3MgcHJlY2lzZSB0aGFuIGl0IG1pZ2h0IGJlIHdpdGggYSBtb3JlCi1yaWdpZGx5IGNvbnN0cmFpbmVkIG1hcmt1cCBsYW5ndWFnZS48L3A+Ci08cD5IVE1MIGNvbnRlbnQgYXNzaXN0IGlzIG1vc3QgYmVuZWZpY2lhbAotd2hlbiB5b3UgbmVlZCB0byBjb21wbGV0ZSBhIHRhZyBuYW1lLCBhZGQgYW4gYXR0cmlidXRlIG5hbWUtdmFsdWUgcGFpciB3aXRoaW4KLWEgc3RhcnQgdGFnLCBvciBzZWxlY3QgZnJvbSBhbiBlbnVtZXJhdGVkIGxpc3Qgb2YgYXR0cmlidXRlIHZhbHVlcy48L3A+Ci08cD5BbHRob3VnaAotY29udGVudCBhc3Npc3Qgb25seSBzaG93cyBhdHRyaWJ1dGUgbmFtZXMgdGhhdCBoYXZlIG5vdCBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkCi1pbiBhIHN0YXJ0IHRhZywgaXQgZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgZ3JhbW1hciBjb25zdHJhaW50cyBmb3IgdGFncy4KLUZvciBleGFtcGxlLCB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+SEVBRDwvc2FtcD4gZWxlbWVudCBpbiBIVE1MIG9ubHkgcGVybWl0cyB6ZXJvIG9yCi1vbmUgb2NjdXJyZW5jZXMgb2YgYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5USVRMRTwvc2FtcD4gdGFnIGluIGl0cyBjb250ZW50LiBJZiB5b3UgcHJvbXB0Ci1mb3IgY29udGVudCBhc3Npc3Qgd2l0aGluIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+SEVBRDwvc2FtcD4gY29udGVudCB0aGF0IGFscmVhZHkgY29udGFpbnMKLWEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+VElUTEU8L3NhbXA+IHRhZywgY29udGVudCBhc3Npc3Qgd2lsbCBzdGlsbCBzaG93IDxzYW1wIGNsYXNzPSJjb2RlcGgiPlRJVExFPC9zYW1wPiBpbgotaXRzIHByb3Bvc2FsIGxpc3QuPC9wPgotPHA+SG93ZXZlciwgaWYgYW4gYXR0cmlidXRlIGlzIHJlcXVpcmVkIGFjY29yZGluZyB0bwotdGhlIERURC9TY2hlbWEsIHRoYXQgYXR0cmlidXRlIHdpbGwgc2hvdyB1cCBhdCB0aGUgdG9wIG9mIHRoZSBsaXN0LCB3aXRoIGEKLXllbGxvdyBjaXJjbGUgaW5kaWNhdG9yIG9uIGl0cyBpY29uLjwvcD4KLTxwPklmIHlvdXIgY3Vyc29yIGlzIGluIGEgcG9zaXRpb24KLXdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcyBpcyBkaXNwbGF5ZWQuCi1UaGUgbGlzdCBpcyBiYXNlZCBvbiB0aGUgY29udGV4dC4gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgZGlyZWN0bHkKLWFmdGVyIGFuIG9wZW5pbmcgcGFyYWdyYXBoIHRhZyAoPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0O3AmZ3Q7PC9zYW1wPikgLCB0aGUgZmlyc3QgaXRlbQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3Qgd2lsbCBiZSB0aGUgY29ycmVzcG9uZGluZyBjbG9zaW5nIHBhcmFncmFwaCAoPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0Oy9wJmd0Ozwvc2FtcD4pCi10YWcuPC9wPgotPHA+VGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgZGlzcGxheXMgYWxsIGF2YWlsYWJsZSB0YWdzIGZvciB0aGUgY3VycmVudAotY3Vyc29yIHBvc2l0aW9uLCBpbmNsdWRpbmcgdGVtcGxhdGVzLiBUaGUgcGljdHVyZSBiZWxvdyBzaG93cyB0aGUgZGVmYXVsdAotY29udGVudCBhc3Npc3QgbGlzdCBmb3IgYSBwYXJhZ3JhcGggdGFnIGV4YW1wbGU6PGJyIC8+PGltZyBzcmM9Ii4uL2ltYWdlcy9uY29udGFzcy5naWYiIGFsdD0iSFRNTCBDb250ZW50IGFzc2lzdCIgLz48YnIgLz48L3A+Ci08cD5UYWcgcHJvcG9zYWxzCi1hcmUgbGlzdGVkIGFscGhhYmV0aWNhbGx5LiBJZiB5b3UgdHlwZSBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDs8L3NhbXA+ICh0byBiZWdpbiBhCi1uZXcgdGFnKSBiZWZvcmUgcHJvbXB0aW5nIGZvciBjb250ZW50IGFzc2lzdCwgYW5kIGJlZ2luIHR5cGluZyB0aGUgZmlyc3Qgb25lCi1vciB0d28gbGV0dGVycyBvZiB0aGUgdGFnIHRoYXQgeW91IHdhbnQgdG8gYWRkLCB0aGUgcHJvcG9zYWwgbGlzdCBhdXRvbWF0aWNhbGx5Ci1yZWZyZXNoZXMgdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZC4gSWYgeW91Ci1kbyBub3QgdHlwZSBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDs8L3NhbXA+IGJlZm9yZSBwcm9tcHRpbmcgZm9yIGNvbnRlbnQgYXNzaXN0LCB5b3UKLWNhbiBjbGljayB3aXRoaW4gdGhlIHByb3Bvc2FsIGxpc3QgYW5kIHRoZW4gdHlwZSB0aGUgbGV0dGVyIHRoYXQgdGhlIHRhZyBiZWdpbnMKLXdpdGgsIHRvIHJlZHVjZSAoc29tZXdoYXQpIHRoZSBhbW91bnQgb2Ygc2Nyb2xsaW5nIHRvIGxvY2F0ZSB0aGUgZGVzaXJlZCB0YWcuPC9wPgotPHA+QXMKLXlvdSB0eXBlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lcyBvciBlbnVtZXJhdGVkCi1hdHRyaWJ1dGUgdmFsdWVzIHRoYXQgeW91IHdhbnQgdG8gYWRkIHRvIGEgdGFnLCB0aGUgbGlzdCBhdXRvbWF0aWNhbGx5IHJlZnJlc2hlcwotdG8gcmVmbGVjdCBwcm9wb3NhbHMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybiB5b3UgaGF2ZSB0eXBlZC48L3A+Ci08ZGl2IGNsYXNzPSJyZXN0cmljdGlvbiI+PHNwYW4gY2xhc3M9InJlc3RyaWN0aW9udGl0bGUiPlJlc3RyaWN0aW9uOjwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9ubGludXguZ2lmIiBhbHQ9IkZvciBMaW51eC4iIC8+IFdoZW4gdXNpbmcgTGludXggKE1vdGlmCi1vciBHVEspIGFuZCBhIERCQ1MgbG9jYWxlLCBkb3VibGUtY2xpY2tpbmcgb24gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgY2FuCi1zb21ldGltZXMgY2F1c2UgdGhlIEphdmHihKIgVk0gdG8gdGVybWluYXRlLiBJbnN0ZWFkIG9mIGRvdWJsZS1jbGlja2luZwotb24gdGhlIGxpc3QsIHVzZSB0aGUgYXJyb3dzIGFuZCBFbnRlciBrZXlzIHRvIG1ha2UgdGhlIHNlbGVjdGlvbiBmcm9tIHRoZQotbGlzdC48L2Rpdj4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+SmF2YVNjcmlwdCBjb250ZW50IGFzc2lzdDwvaDQ+PHA+SXRlbXMgaW4gdGhlIEphdmFTY3JpcHQgY29udGVudAotYXNzaXN0IGxpc3QgYXJlIHByZWNlZGVkIGJ5IGFuIEludGVybmV0IEV4cGxvcmVyIGljb24sIGEgTmV0c2NhcGUgaWNvbiwgb3IKLWJvdGgsIHRvIGluZGljYXRlIHdoZXRoZXIgc3BlY2lmaWMgSmF2YVNjcmlwdCBvYmplY3RzLCBtZXRob2RzLCBvciBmdW5jdGlvbnMKLWFyZSBzdXBwb3J0ZWQgYnkgb25lIG9yIGJvdGggYnJvd3NlcnMuIElmIHRoZSBJbnRlcm5ldCBFeHBsb3JlciBpY29uIGlzIHByZXNlbnQsCi1pdCBpbmRpY2F0ZXMgdGhhdCB0aGUgb2JqZWN0LCBtZXRob2QsIG9yIGZ1bmN0aW9uIGlzIHN1cHBvcnRlZCBieSBJbnRlcm5ldAotRXhwbG9yZXIgVmVyc2lvbiA1LjAgb3IgaGlnaGVyLiAgSWYgdGhlIE5ldHNjYXBlIGljb24gaXMgcHJlc2VudCwgaXQgaW5kaWNhdGVzCi10aGF0IHRoZSBvYmplY3QsIG1ldGhvZCwgb3IgZnVuY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IE5ldHNjYXBlIE5hdmlnYXRvciBWZXJzaW9uCi00Ljcgb3IgaGlnaGVyLiBBIHF1ZXN0aW9uIG1hcmsgaWNvbiAoPGltZyBzcmM9Ii4uL2ltYWdlcy9ucXVlc3QuZ2lmIiBhbHQ9IlF1ZXN0aW9uIG1hcmsgaWNvbiIgLz4pIGluIHBsYWNlIG9mIG9uZSBvZiB0aGUgYnJvd3NlciBpY29ucyBpbmRpY2F0ZXMKLXRoYXQgaXQgaXMgdW5rbm93biB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHRoZSBvYmplY3QsIG1ldGhvZCwgb3IgZnVuY3Rpb24uPC9wPgotPHA+VGhlCi1waWN0dXJlIGJlbG93IHNob3dzIHRoZSBkZWZhdWx0IGNvbnRlbnQgYXNzaXN0IGxpc3Qgd2l0aGluIGEgSmF2YVNjcmlwdCBmaWxlOjxiciAvPjxpbWcgc3JjPSIuLi9pbWFnZXMvbmpzY2Rhc3QuZ2lmIiBhbHQ9IkphdmFTY3JpcHQgY29udGVudCBhc3Npc3QiIC8+PGJyIC8+PC9wPgotPHA+Q29kZSBwcm9wb3NhbHMgYXJlIGxpc3RlZCBhbHBoYWJldGljYWxseS4gSWYgeW91IHR5cGUgYSA8c2FtcCBjbGFzcz0iY29kZXBoIj4uIDwvc2FtcD4gKGluY2x1ZGUKLXRoZSBzcGFjZSkgYmVmb3JlIHByb21wdGluZyBmb3IgY29udGVudCBhc3Npc3QsIGFuZCBiZWdpbiB0eXBpbmcgdGhlIGZpcnN0Ci1vbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIGNvZGUgdGhhdCB5b3Ugd2FudCB0byBhZGQsIHRoZSBwcm9wb3NhbCBsaXN0IGF1dG9tYXRpY2FsbHkKLXJlZnJlc2hlcyB0byByZWZsZWN0IHByb3Bvc2FscyB0aGF0IG1hdGNoIHRoZSBwYXR0ZXJuIHlvdSBoYXZlIHR5cGVkLCB0byByZWR1Y2UKLShzb21ld2hhdCkgdGhlIGFtb3VudCBvZiBzY3JvbGxpbmcgdG8gbG9jYXRlIHRoZSBkZXNpcmVkIGNvZGUuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5KU1AgY29udGVudCBhc3Npc3Q8L2g0PjxwPllvdSBoYXZlIG1hbnkgb3B0aW9ucyBmb3IgZW1iZWRkaW5nIEphdmEgYW5kCi1IVE1MIGNvZGUgaW4geW91ciBKU1AgcGFnZXMgYnkgdXNpbmcgY29udGVudCBhc3Npc3QuPC9wPgotPHA+QWxsIG9mIHRoZSBKU1AKLXRhZ3MgYXJlIGluY2x1ZGVkIGJvdGggaW4gdGhlIHRlbXBsYXRlIGxpc3QgYW5kIGluIFhNTCBmb3JtYXQgKGZvciBleGFtcGxlLCA8c2FtcCBjbGFzcz0iY29kZXBoIj4mbHQ7anNwOmV4cHJlc3Npb24mZ3Q7PC9zYW1wPikuCi1UbyBhZGQgSlNQIHNjcmlwdGxldCB0YWdzLCBmb3IgZXhhbXBsZSwgbW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBhcHByb3ByaWF0ZQotcG9zaXRpb24gaW4gdGhlIGZpbGUgYW5kIHByZXNzIEN0cmwrU3BhY2UgdG8gdXNlIGNvbnRlbnQgYXNzaXN0LiBTZWxlY3QgPGltZyBzcmM9Ii4uL2ltYWdlcy9ubWFjc2NycC5naWYiIGFsdD0iSlNQIHNjcmlwdGxldCBjb250ZW50IGFzc2lzdCIgLz4gZnJvbSB0aGUgcHJvcG9zYWwgbGlzdCB0byBpbnNlcnQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyUgJSZndDs8L3NhbXA+ICBpbiB0aGUKLWRvY3VtZW50LjwvcD4KLTxkaXYgY2xhc3M9InAiPlNjcmlwdGxldHMgYXJlIGluc2VydGVkIGluIGEgdGFnIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDslICUmZ3Q7PC9zYW1wPi4KLUZvciBleGFtcGxlOiA8cHJlPiZsdDslIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICUmZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoaXMKLWV4YW1wbGUgd2lsbCBldmFsdWF0ZSB0aGUgSmF2YSBzdGF0ZW1lbnQgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWUgaW4KLW1pbGxpc2Vjb25kcy48L3A+Ci08ZGl2IGNsYXNzPSJwIj5UbyBoYXZlIHRoZSByZXN1bHQgb2YgdGhlIHN0YXRlbWVudCBpbnNlcnRlZCBpbiB0aGUgZmlsZSwKLXB1dCBhbiBlcXVhbHMgc2lnbiAoPSkgaW4gdGhlIGZyb250IG9mIHRoZSBzdGF0ZW1lbnQuIEZvciBleGFtcGxlOiA8cHJlPiZsdDtiJmd0O1RoaXMgaXMgdGhlIHRpbWUgOiAmbHQ7JT0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCklJmd0OyZsdDsvYiZndDs8L3ByZT4KLTwvZGl2PgotPGRpdiBjbGFzcz0icCI+V2hlbiB5b3UgYXJlIHdpdGhpbiBhIHNjcmlwdGxldCB5b3UgYXJlIHdyaXRpbmcgcHVyZSBKYXZhIGNvZGUuCi1UaGVyZWZvcmUsIGNvbnRlbnQgYXNzaXN0IHdvcmtzIGV4YWN0bHkgdGhlIHNhbWUgYXMgaXQgZG9lcyBmb3IgdGhlIEphdmEgZWRpdG9yLgotRm9yIGV4YW1wbGUsIGlmIHlvdSByZXF1ZXN0IGNvbnRlbnQgYXNzaXN0IGFmdGVyIDxzYW1wIGNsYXNzPSJjb2RlcGgiPlN5c3RlbTwvc2FtcD4sCi1jb250ZW50IGFzc2lzdCBkaXNwbGF5cyBhIGxpc3Qgb2YgbWV0aG9kcy4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEphdmEgY29udGVudCBhc3Npc3Qgd29ya3Mgb25seSBpbiBhIFdlYgotcHJvamVjdCwgYmVjYXVzZSBpdCByZXF1aXJlcyBhIGJ1aWxkcGF0aCB0byBmaW5kIHRoZSBhcHByb3ByaWF0ZSBKYXZhIGNsYXNzZXMuPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPlRoZXJlCi1hcmUgYWxzbyBzcGVjaWFsIHRhZ3Mgc3VjaCBhcyB1c2VCZWFuLiBGb3IgZXhhbXBsZTogPHByZT4mbHQ7anNwOnVzZUJlYW4gaWQ9InVzZUJlYW4iIGNsYXNzPSJqYXZhLmxhbmcuU3RyaW5nIi8mZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoZQotdXNlQmVhbiB0YWcgZW5hYmxlcyB5b3UgdG8gY3JlYXRlIGEgYmVhbiBjYWxsZWQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gb2YKLXR5cGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+U3RyaW5nPC9zYW1wPi4gVGhlbiB3aGVuIHlvdSB1c2UgY29udGVudCBhc3Npc3QsIHRoaXMgaXMgcmVjb2duaXplZAotYXMgYSBkZWNsYXJlZCB2YXJpYWJsZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgYWZ0ZXIgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4sCi1hcyBmb2xsb3dzOjwvcD4KLTxkaXYgY2xhc3M9InAiPiA8cHJlPiZsdDslIGFTdHJpbmcuICUmZ3Q7IDwvcHJlPgotdGhlIGNvbnRlbnQgYXNzaXN0Ci1saXN0IHNob3dzIGF2YWlsYWJsZSBtZXRob2RzLiBUaGlzIGlzIGJlY2F1c2UgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gaGFzCi1iZWVuIGRlY2xhcmVkIGFzIGEgYmVhbiBvZiB0eXBlIFN0cmluZy48L2Rpdj4KLTxkaXYgY2xhc3M9InAiPklmIHlvdSB1c2UgY29udGVudCBhc3Npc3QgYWZ0ZXIKLXRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hPC9zYW1wPiwgYXMgZm9sbG93czogPHByZT4mbHQ7JSBhICUmZ3Q7IDwvcHJlPgotY29udGVudAotYXNzaXN0IGtub3dzIHRoYXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YVN0cmluZzwvc2FtcD4gZXhpc3RzLCBhbmQgaXQgaXMgc2hvd24gaW4gdGhlCi1jb250ZW50IGFzc2lzdCBsaXN0LjwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDA1Lmh0bWwiIHRpdGxlPSJUbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiI+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZAotdGV4dCBlZGl0b3JzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI0Lmh0bWwiIHRpdGxlPSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2N2YWxpZGF0ZS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjkyODdiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICIuLlxkdGRcY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjc3JjZWR0MDAxIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Tb3VyY2UgYW5kIGJhdGNoIHZhbGlkYXRpb248L3RpdGxlPg0KLTxzaG9ydGRlc2M+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+dmFsaWRhdGlvbjxpbmRleHRlcm0+c291cmNlIHZzIGJhdGNoPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgdmFsaWRhdGlvbiB0aGF0IGNhbiBvY2N1ciB3aGVuIHlvdSBhcmUgd29ya2luZyB3aXRoDQotc291cmNlIGZpbGVzIGluIGEgc3RydWN0dXJlZCBzb3VyY2UgZWRpdG9yOiBzb3VyY2UgdmFsaWRhdGlvbiBhbmQgYmF0Y2ggdmFsaWRhdGlvbi4gPC9wPg0KLTxwPlNvdXJjZSB2YWxpZGF0aW9uIG9jY3VycyBhcyB5b3UgdHlwZSB5b3VyIGNvZGU7IHRoaXMgdmFsaWRhdGlvbiByZWZsZWN0cw0KLXRoZSAidW5zYXZlZCIgYW5kICJ1bmJ1aWx0IiBjb250ZW50cyBvZiB0aGUgc291cmNlIHlvdSBhcmUgZWRpdGluZy4gRm9yIGV4YW1wbGUsDQotaWYgeW91IHdlcmUgdG8gdHlwZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gYSBKU1AgZWRpdG9yOjxsaW5lcz48Y29kZXBoPiZsdDtmb286YmFyPjwvY29kZXBoPjwvbGluZXM+d2hlcmUgPGNvZGVwaD5mb286YmFyPC9jb2RlcGg+aXMNCi1hIHRhZyB0aGF0IGRvZXMgbm90IGV4aXN0LCB0aGUgcHJvYmxlbSB3b3VsZCBiZSBkaXNjb3ZlcmVkIGltbWVkaWF0ZWx5IGFuZA0KLXdvdWxkIGFwcGVhciB1bmRlcmxpbmVkIGluIHRoZSBlZGl0b3IuIFRoZSBhZHZhbnRhZ2Ugb2YgdGhpcyB0eXBlIG9mIHZhbGlkYXRpb24NCi1pcyB0aGF0IGl0IGNhbiBhbGVydCB5b3UgdG8gZXJyb3JzIGluc3RhbnRseS48bm90ZT5UbyB0dXJuIHNvdXJjZSB2YWxpZGF0aW9uDQotb24gKG9yIG9mZikgZm9yIGFsbCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPjx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBhbmQgY2hlY2sgKG9yDQotdW5jaGVjaykgPGI+UmVwb3J0IHByb2JsZW1zIGFzIHlvdSB0eXBlPC9iPi48L25vdGU+PC9wPg0KLTxwPkJhdGNoIHZhbGlkYXRpb24gb2NjdXJzIG9uIHNhdmVkIGZpbGVzLiBJdCBjYW4gY2F0Y2ggYnVpbGQgcHJvY2VzcyBlcnJvcnMNCi1hbmQgb3RoZXIgZXJyb3JzIHRoYXQgdGhlIHNvdXJjZSB2YWxpZGF0b3IgY2Fubm90LiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3UNCi10eXBlZCB0aGUgZm9sbG93aW5nIGluIGEgSlNQIGVkaXRvcjo8bGluZXM+DQotPGNvZGVwaD4mbHQ7JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIgcHJlZml4PSJoIiU+DQotJmx0OyVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlPjwvY29kZXBoPjwvbGluZXM+SW4NCi10aGlzIGV4YW1wbGUsIHRoZSBzYW1lIHByZWZpeCBpcyB1c2VkIHR3aWNlLiBUaGlzIHdvdWxkIHByb21wdCB0aGUgYmF0Y2ggdmFsaWRhdG9yDQotdG8gdHJpZ2dlciBtYXJrZXJzIGFuZCB0byBnZW5lcmF0ZSBidWlsZCB3YXJuaW5ncyBpbiB0aGUgUHJvYmxlbXMgdmlldyBhbmQNCi1pbiB0aGUgTmF2aWdhdG9yLiA8L3A+DQotPHA+QmF0Y2ggdmFsaWRhdGlvbiBjYW4gdW5jb3ZlciBlcnJvcnMgaW4gbXVsdGlwbGUgZmlsZXMgYXQgb25jZSBhbmQgZ2l2ZQ0KLXlvdSBhIGNvbXByZWhlbnNpdmUgdmlldyBvZiB3aGVyZSBwcm9ibGVtYXRpYyBjb2RlIGNhbiBiZSBmb3VuZCBpbiB5b3VyIHByb2plY3QuDQotTW9yZW92ZXIsIHlvdSBkbyBub3QgbmVlZCB0byBvcGVuIGZpbGVzIGluIGFuIGVkaXRvciB0byBydW4gYmF0Y2ggdmFsaWRhdGlvbi4NCi1UbyBydW4gYmF0Y2ggdmFsaWRhdGlvbiBvbiBzcGVjaWZpYyBmaWxlcywgc2VsZWN0IGFuZCByaWdodCBjbGljayB0aGUgZmlsZXMNCi1pbiB0aGUgUHJvamVjdCBFeHBsb3JlciBhbmQgdGhlbiBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UnVuIFZhbGlkYXRpb248L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiBmcm9tIHRoZSBwb3B1cCBtZW51LjwvcD4NCi08bm90ZT5UbyBzZXQgcHJlZmVyZW5jZXMgZm9yIGJhdGNoIHZhbGlkYXRpb24sIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvbm90ZT4NCi08L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3ZhbGlkYXRlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZmUwZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jdmFsaWRhdGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+U291cmNlIGFuZCBiYXRjaCB2YWxpZGF0aW9uPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjc3JjZWR0MDAxIj48YSBuYW1lPSJjc3JjZWR0MDAxIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNvdXJjZSBhbmQgYmF0Y2ggdmFsaWRhdGlvbjwvaDE+Ci08ZGl2PjxwPjwvcD4KLTxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgdmFsaWRhdGlvbiB0aGF0IGNhbiBvY2N1ciB3aGVuIHlvdSBhcmUgd29ya2luZyB3aXRoCi1zb3VyY2UgZmlsZXMgaW4gYSBzdHJ1Y3R1cmVkIHNvdXJjZSBlZGl0b3I6IHNvdXJjZSB2YWxpZGF0aW9uIGFuZCBiYXRjaCB2YWxpZGF0aW9uLiA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5Tb3VyY2UgdmFsaWRhdGlvbiBvY2N1cnMgYXMgeW91IHR5cGUgeW91ciBjb2RlOyB0aGlzIHZhbGlkYXRpb24gcmVmbGVjdHMKLXRoZSAidW5zYXZlZCIgYW5kICJ1bmJ1aWx0IiBjb250ZW50cyBvZiB0aGUgc291cmNlIHlvdSBhcmUgZWRpdGluZy4gRm9yIGV4YW1wbGUsCi1pZiB5b3Ugd2VyZSB0byB0eXBlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiBhIEpTUCBlZGl0b3I6PHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0O2ZvbzpiYXImZ3Q7PC9zYW1wPjwvcD4KLXdoZXJlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmZvbzpiYXI8L3NhbXA+aXMKLWEgdGFnIHRoYXQgZG9lcyBub3QgZXhpc3QsIHRoZSBwcm9ibGVtIHdvdWxkIGJlIGRpc2NvdmVyZWQgaW1tZWRpYXRlbHkgYW5kCi13b3VsZCBhcHBlYXIgdW5kZXJsaW5lZCBpbiB0aGUgZWRpdG9yLiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgdHlwZSBvZiB2YWxpZGF0aW9uCi1pcyB0aGF0IGl0IGNhbiBhbGVydCB5b3UgdG8gZXJyb3JzIGluc3RhbnRseS48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVG8gdHVybiBzb3VyY2UgdmFsaWRhdGlvbgotb24gKG9yIG9mZikgZm9yIGFsbCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3JzPC9zcGFuPjwvc3Bhbj4gYW5kIGNoZWNrIChvcgotdW5jaGVjaykgPHN0cm9uZz5SZXBvcnQgcHJvYmxlbXMgYXMgeW91IHR5cGU8L3N0cm9uZz4uPC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InAiPkJhdGNoIHZhbGlkYXRpb24gb2NjdXJzIG9uIHNhdmVkIGZpbGVzLiBJdCBjYW4gY2F0Y2ggYnVpbGQgcHJvY2VzcyBlcnJvcnMKLWFuZCBvdGhlciBlcnJvcnMgdGhhdCB0aGUgc291cmNlIHZhbGlkYXRvciBjYW5ub3QuIEZvciBleGFtcGxlLCBzdXBwb3NlIHlvdQotdHlwZWQgdGhlIGZvbGxvd2luZyBpbiBhIEpTUCBlZGl0b3I6PHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0OyVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlJmd0OzxiciAvPgotJmx0OyVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlJmd0Ozwvc2FtcD48L3A+Ci1JbgotdGhpcyBleGFtcGxlLCB0aGUgc2FtZSBwcmVmaXggaXMgdXNlZCB0d2ljZS4gVGhpcyB3b3VsZCBwcm9tcHQgdGhlIGJhdGNoIHZhbGlkYXRvcgotdG8gdHJpZ2dlciBtYXJrZXJzIGFuZCB0byBnZW5lcmF0ZSBidWlsZCB3YXJuaW5ncyBpbiB0aGUgUHJvYmxlbXMgdmlldyBhbmQKLWluIHRoZSBOYXZpZ2F0b3IuIDwvZGl2PgotPHA+QmF0Y2ggdmFsaWRhdGlvbiBjYW4gdW5jb3ZlciBlcnJvcnMgaW4gbXVsdGlwbGUgZmlsZXMgYXQgb25jZSBhbmQgZ2l2ZQoteW91IGEgY29tcHJlaGVuc2l2ZSB2aWV3IG9mIHdoZXJlIHByb2JsZW1hdGljIGNvZGUgY2FuIGJlIGZvdW5kIGluIHlvdXIgcHJvamVjdC4KLU1vcmVvdmVyLCB5b3UgZG8gbm90IG5lZWQgdG8gb3BlbiBmaWxlcyBpbiBhbiBlZGl0b3IgdG8gcnVuIGJhdGNoIHZhbGlkYXRpb24uCi1UbyBydW4gYmF0Y2ggdmFsaWRhdGlvbiBvbiBzcGVjaWZpYyBmaWxlcywgc2VsZWN0IGFuZCByaWdodCBjbGljayB0aGUgZmlsZXMKLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIGFuZCB0aGVuIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJ1biBWYWxpZGF0aW9uPC9zcGFuPjwvc3Bhbj4gZnJvbSB0aGUgcG9wdXAgbWVudS48L3A+Ci08ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVG8gc2V0IHByZWZlcmVuY2VzIGZvciBiYXRjaCB2YWxpZGF0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPjwvc3Bhbj48L2Rpdj4KLTwvZGl2PgotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PjwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90Y29udGVudHR5cGUuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVjMzVhOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3Rjb250ZW50dHlwZS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idGNvbnRlbnR0eXBlIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Bc3NvY2lhdGluZyBlZGl0b3JzIHdpdGggYWRkaXRpb25hbCBmaWxlcyB0eXBlczwvdGl0bGU+DQotPHNob3J0ZGVzYz48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5maWxlIHR5cGVzPGluZGV4dGVybT5lZGl0b3JzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5jb250ZW50IHR5cGU8aW5kZXh0ZXJtPm1hcHBpbmcgZmlsZSBleHRlbnNpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5maWxlIGV4dGVuc2lvbnM8aW5kZXh0ZXJtPm1hcHBpbmcgY29udGVudCB0eXBlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Zb3UgY2FuIGFzc29jaWF0ZSBjZXJ0YWluIGVkaXRvcnMgd2l0aCBhIGZpbGUgdHlwZSBieSBjbGlja2luZw0KLW9uIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPkdlbmVyYWw8L3VpY29udHJvbD48dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48dWljb250cm9sPkZpbGUNCi1Bc3NvY2lhdGlvbjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IGFuZCBzZXR0aW5nIHVwIHRoZSBhc3NvY2lhdGlvbnMgaW4gdGhlDQotRmlsZSBBc3NvY2lhdGlvbnMgV2luZG93LjwvcD48cD5Tb21lIEVjbGlwc2UtYmFzZWQgZWRpdG9ycywgaG93ZXZlciwgd2lsbA0KLW9ubHkgcmVjb2duaXplIGEgZmlsZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuIENvbnNlcXVlbnRseSwgaWYNCi15b3Ugd2FudCB0byBhc3NvY2lhdGUgYW4gYWRkaXRpb25hbCBmaWxlIHR5cGUgd2l0aCBzb21lIGVkaXRvcnMsIHlvdSBtYXkgaGF2ZQ0KLXRvIGZpcnN0IG1hcCB0aGUgY29udGVudCB0eXBlIHdpdGggaXRzIGZpbGUgZXh0ZW5zaW9uLiBUbyBtYXAgYSBjb250ZW50IHR5cGUNCi13aXRoIGEgZmlsZSBleHRlbnNpb24sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD48b2w+DQotPGxpPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+Q29udGVudCBUeXBlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiBUaGUgQ29udGVudCBUeXBlIHdpbmRvdw0KLWFwcGVhcnMuIDwvbGk+DQotPGxpPlNlbGVjdCBhIGNvbnRlbnQgdHlwZSBpbiB0aGUgQ29udGVudCBUeXBlIHdpbmRvdywgYW5kIHRoZW4gc2VsZWN0IDxiPkFkZDwvYj4gLg0KLVRoZSBEZWZpbmUgYSBOZXcgRmlsZSBUeXBlIHdpbmRvdyBhcHBlYXJzLjwvbGk+DQotPGxpPlR5cGUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdHlwZSwgYW5kIHRoZW4gY2xpY2sgPGI+T0s8L2I+LjwvbGk+DQotPC9vbD48L2NvbnRleHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90Y29udGVudHR5cGUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdGNvbnRlbnR0eXBlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlOWRmMjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90Y29udGVudHR5cGUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+QXNzb2NpYXRpbmcgZWRpdG9ycyB3aXRoIGFkZGl0aW9uYWwgZmlsZXMgdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjb250ZW50dHlwZSI+PGEgbmFtZT0idGNvbnRlbnR0eXBlIj48IS0tIC0tPjwvYT4KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFzc29jaWF0aW5nIGVkaXRvcnMgd2l0aCBhZGRpdGlvbmFsIGZpbGVzIHR5cGVzPC9oMT4KLTxkaXY+PHA+PC9wPgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhc3NvY2lhdGUgY2VydGFpbiBlZGl0b3JzIHdpdGggYSBmaWxlIHR5cGUgYnkgY2xpY2tpbmcKLW9uIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlCi1Bc3NvY2lhdGlvbjwvc3Bhbj48L3NwYW4+IGFuZCBzZXR0aW5nIHVwIHRoZSBhc3NvY2lhdGlvbnMgaW4gdGhlCi1GaWxlIEFzc29jaWF0aW9ucyBXaW5kb3cuPC9wPgotPHA+U29tZSBFY2xpcHNlLWJhc2VkIGVkaXRvcnMsIGhvd2V2ZXIsIHdpbGwKLW9ubHkgcmVjb2duaXplIGEgZmlsZSBiYXNlZCBvbiB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUuIENvbnNlcXVlbnRseSwgaWYKLXlvdSB3YW50IHRvIGFzc29jaWF0ZSBhbiBhZGRpdGlvbmFsIGZpbGUgdHlwZSB3aXRoIHNvbWUgZWRpdG9ycywgeW91IG1heSBoYXZlCi10byBmaXJzdCBtYXAgdGhlIGNvbnRlbnQgdHlwZSB3aXRoIGl0cyBmaWxlIGV4dGVuc2lvbi4gVG8gbWFwIGEgY29udGVudCB0eXBlCi13aXRoIGEgZmlsZSBleHRlbnNpb24sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4KLTxvbD48bGk+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IFR5cGVzPC9zcGFuPjwvc3Bhbj4uIFRoZSBDb250ZW50IFR5cGUgd2luZG93Ci1hcHBlYXJzLiA8L2xpPgotPGxpPlNlbGVjdCBhIGNvbnRlbnQgdHlwZSBpbiB0aGUgQ29udGVudCBUeXBlIHdpbmRvdywgYW5kIHRoZW4gc2VsZWN0IDxzdHJvbmc+QWRkPC9zdHJvbmc+IC4KLVRoZSBEZWZpbmUgYSBOZXcgRmlsZSBUeXBlIHdpbmRvdyBhcHBlYXJzLjwvbGk+Ci08bGk+VHlwZSB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0eXBlLCBhbmQgdGhlbiBjbGljayA8c3Ryb25nPk9LPC9zdHJvbmc+LjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjI5YTBlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAwMCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+RWRpdGluZyBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXc8L25hdnRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgPHRlcm0+c3RydWN0dXJlZA0KLXRleHQgZWRpdG9yPC90ZXJtPi4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbg0KLXVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5tYXJrdXAgbGFuZ3VhZ2VzPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczxpbmRleHRlcm0+bWFya3VwIGxhbmd1YWdlIGVkaXRpbmc8L2luZGV4dGVybT48aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5JbiBhZGRpdGlvbiB0byBiYXNpYyBlZGl0aW5nIHRhc2tzIHN1Y2ggYXMgYWRkaW5nLCBtb2RpZnlpbmcsIGFuZA0KLWRlbGV0aW5nIHRleHQsIHlvdSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOjwvY29udGV4dD4NCi08c3RlcHMtdW5vcmRlcmVkPg0KLTxzdGVwPjxjbWQ+PHhyZWYgaHJlZj0idHNyY2VkdDAyNS5kaXRhIiB0eXBlPSJ0YXNrIj5TZXQgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L3hyZWY+PC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+PHhyZWYgaHJlZj0idHNyY2VkdDAwNS5kaXRhIiB0eXBlPSJ0YXNrIj5HZXQgY29udGVudCBhc3Npc3RhbmNlDQotaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L3hyZWY+PC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+PHhyZWYgaHJlZj0idHNyY2VkdDAwNy5kaXRhIiB0eXBlPSJ0YXNrIj5TZWFyY2ggb3IgZmluZCB0ZXh0IHdpdGhpbg0KLWEgZmlsZTwveHJlZj48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD48eHJlZiBocmVmPSJ0c3JjZWR0MDEwLmRpdGEiIHR5cGU9InRhc2siPkNoZWNrIHNwZWxsaW5nPC94cmVmPjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPjx4cmVmIGhyZWY9InRzcmNlZHQwMjcuZGl0YSIgdHlwZT0idGFzayI+QWRkIG9yIHJlbW92ZSBtYXJrdXAgbGFuZ3VhZ2UNCi10ZW1wbGF0ZXM8L3hyZWY+PC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+PHhyZWYgaHJlZj0idHNyY2VkdDAyNi5kaXRhIiB0eXBlPSJ0YXNrIj5FZGl0IHdpdGggc25pcHBldHM8L3hyZWY+PC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHMtdW5vcmRlcmVkPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJjc3JjZWR0MDA2LmRpdGEiPjxsaW5rdGV4dD5Db250ZW50IGFzc2lzdDwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI1LmRpdGEiPjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDA1LmRpdGEiPjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDA3LmRpdGEiPjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDEwLmRpdGEiPjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiPjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM4ZDRmMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiIgLz4KLTxtZXRhIGNvbnRlbnQ9Im1hcmt1cCBsYW5ndWFnZXMsIGVkaXRpbmcsIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBtYXJrdXAgbGFuZ3VhZ2UgZWRpdGluZywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJtYXJrdXAgbGFuZ3VhZ2VzLCBlZGl0aW5nLCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgbWFya3VwIGxhbmd1YWdlIGVkaXRpbmcsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDA1Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxMC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI3Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjYuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDAwIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAwMCI+PGEgbmFtZT0idHNyY2VkdDAwMCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldzwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgPGRmbiBjbGFzcz0idGVybSI+c3RydWN0dXJlZAotdGV4dCBlZGl0b3I8L2Rmbj4uIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4KLXVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkluIGFkZGl0aW9uIHRvIGJhc2ljIGVkaXRpbmcgdGFza3Mgc3VjaCBhcyBhZGRpbmcsIG1vZGlmeWluZywgYW5kCi1kZWxldGluZyB0ZXh0LCB5b3UgY2FuIHBlcmZvcm0gdGhlIGZvbGxvd2luZyB0YXNrczo8L2Rpdj4KLQotPHVsPgotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMjUuaHRtbCI+U2V0IHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCI+R2V0IGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPjxhIGhyZWY9InRzcmNlZHQwMDcuaHRtbCI+U2VhcmNoIG9yIGZpbmQgdGV4dCB3aXRoaW4gYSBmaWxlPC9hPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+PGEgaHJlZj0idHNyY2VkdDAxMC5odG1sIj5DaGVjayBzcGVsbGluZzwvYT48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+PGEgaHJlZj0idHNyY2VkdDAyNy5odG1sIj5BZGQgb3IgcmVtb3ZlIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXM8L2E+PC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiPkVkaXQgd2l0aCBzbmlwcGV0czwvYT48L3NwYW4+Ci08L2xpPgotCi08L3VsPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDYuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iPkNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjUuaHRtbCIgdGl0bGU9IiI+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCIgdGl0bGU9IlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwNy5odG1sIiB0aXRsZT0iIj5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMTAuaHRtbCIgdGl0bGU9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iPkNoZWNraW5nIHNwZWxsaW5nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlIHRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI2Lmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiI+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcxYjgzNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMDEiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+U2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIHNldCA8dGVybT5hbm5vdGF0aW9uIHByZWZlcmVuY2VzPC90ZXJtPiBmb3INCi1XZWIgYW5kIFhNTCBmaWxlcy4gVGhlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgaW5jbHVkZSB3aGV0aGVyIHRvIGFuYWx5emUgdGhlDQotc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlDQotdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXINCi10ZXh0Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPmFubm90YXRpb24gcHJlZmVyZW5jZXM8aW5kZXh0ZXJtPm1hcmt1cCBsYW5ndWFnZSBzZXR0aW5nczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+bWFya3VwIGxhbmd1YWdlczxpbmRleHRlcm0+c2V0dGluZyBhbm5vdGF0aW9uIHByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+QnkgZGVmYXVsdCwgd2hlbiB5b3UgZWRpdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IsIHlvdXIgc291cmNlDQotY29kZSBpcyB2YWxpZGF0ZWQgYXMgeW91IHR5cGUgaXQgaW4uIExpa2Ugb3RoZXIgRWNsaXBzZS1iYXNlZCBlZGl0b3JzLCB0aGUNCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyBmbGFnIHdhcm5pbmdzIGFuZCBlcnJvcnMgaW4gdGhlDQotc291cmNlIGNvZGUgaW4gdGhlIGVkaXRvciBhcmVhLiBUaGUgd2FybmluZ3MgYW5kIGVycm9ycyBhbHNvIHNob3cgdXAgaW4gdGhlDQotVGFza3MgdmlldyB3aGVuIHlvdSBzYXZlIHRoZSBmaWxlLjwvcD48bm90ZT5IaWdobGlnaHRpbmcgaXMgZnVsbHkgZHluYW1pYw0KLXdpdGggdGhlIGV4Y2VwdGlvbiBvZiBzZWFyY2ggcmVzdWx0cy4gU2VhcmNoIHJlc3VsdHMgYXJlIGhpZ2hsaWdodGVkIGJhc2VkDQotdXBvbiB3aGF0IGhhcyBiZWVuIHNhdmVkIHRvIGRpc2suPC9ub3RlPjxub3RlIHR5cGU9InRpcCI+WW91IGNhbiBpbXByb3ZlIGENCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yJ3MgcGVyZm9ybWFuY2UgYnkgdHVybmluZyBvZmYgdGhlIHJlYWwtdGltZSB2YWxpZGF0aW9uLjwvbm90ZT48cD5Ubw0KLXNldCBhbm5vdGF0aW9uIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2NtZD48c3RlcHJlc3VsdD5BIFByZWZlcmVuY2VzIHdpbmRvdyBhcHBlYXJzLjwvc3RlcHJlc3VsdD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPlRvIHR1cm4gb2ZmIHJlYWwtdGltZSBzeW50YXggdmFsaWRhdGlvbiwgY2xpY2sgPHVpY29udHJvbD5TdHJ1Y3R1cmVkDQotVGV4dCBFZGl0b3I8L3VpY29udHJvbD4gYW5kIHVuY2hlY2sgdGhlIDx1aWNvbnRyb2w+QW5hbHl6ZSBhbm5vdGF0aW9ucyB3aGlsZQ0KLXR5cGluZzwvdWljb250cm9sPiBib3guPC9jaG9pY2U+DQotPGNob2ljZT5UbyBjb250cm9sIG90aGVyIGFubm90YXRpb24gc2V0dGluZ3MsIGNsaWNrIDx1aWNvbnRyb2w+QW5ub3RhdGlvbnM8L3VpY29udHJvbD4gYW5kDQotc2VsZWN0IHlvdXIgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgcHJlZmVyZW5jZXMgYW5kIGNsb3NlDQotdGhlIHBhZ2UuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjUuZGl0YSI+PGxpbmt0ZXh0PlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAxLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2OWU4NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDEuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBzZXQgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgV2ViIGFuZCBYTUwgZmlsZXMuIFRoZSBhbm5vdGF0aW9uIHByZWZlcmVuY2VzIGluY2x1ZGUgd2hldGhlciB0byBhbmFseXplIHRoZSBzeW50YWN0aWMgdmFsaWRpdHkgb2YgeW91ciBmaWxlIHdoaWxlIHlvdSBhcmUgdHlwaW5nIGFuZCB3aGF0IGNvbG9ycyB0byB1c2UgdG8gaGlnaGxpZ2h0IGVycm9ycywgd2FybmluZ3MsIHRhc2tzLCBzZWFyY2ggcmVzdWx0cywgYm9va21hcmtzLCBhbmQgb3RoZXIgdGV4dC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIFdlYiBhbmQgWE1MIGZpbGVzLiBUaGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBpbmNsdWRlIHdoZXRoZXIgdG8gYW5hbHl6ZSB0aGUgc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlIHRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyIHRleHQuIiAvPgotPG1ldGEgY29udGVudD0iYW5ub3RhdGlvbiBwcmVmZXJlbmNlcywgbWFya3VwIGxhbmd1YWdlIHNldHRpbmdzLCBtYXJrdXAgbGFuZ3VhZ2VzLCBzZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJhbm5vdGF0aW9uIHByZWZlcmVuY2VzLCBtYXJrdXAgbGFuZ3VhZ2Ugc2V0dGluZ3MsIG1hcmt1cCBsYW5ndWFnZXMsIHNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMDEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIG1hcmt1cCBsYW5ndWFnZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMDEiPjxhIG5hbWU9InRzcmNlZHQwMDEiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3IgbWFya3VwIGxhbmd1YWdlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gc2V0IDxkZm4gY2xhc3M9InRlcm0iPmFubm90YXRpb24gcHJlZmVyZW5jZXM8L2Rmbj4gZm9yCi1XZWIgYW5kIFhNTCBmaWxlcy4gVGhlIGFubm90YXRpb24gcHJlZmVyZW5jZXMgaW5jbHVkZSB3aGV0aGVyIHRvIGFuYWx5emUgdGhlCi1zeW50YWN0aWMgdmFsaWRpdHkgb2YgeW91ciBmaWxlIHdoaWxlIHlvdSBhcmUgdHlwaW5nIGFuZCB3aGF0IGNvbG9ycyB0byB1c2UKLXRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyCi10ZXh0LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkJ5IGRlZmF1bHQsIHdoZW4geW91IGVkaXQgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLCB5b3VyIHNvdXJjZQotY29kZSBpcyB2YWxpZGF0ZWQgYXMgeW91IHR5cGUgaXQgaW4uIExpa2Ugb3RoZXIgRWNsaXBzZS1iYXNlZCBlZGl0b3JzLCB0aGUKLXN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIGZsYWcgd2FybmluZ3MgYW5kIGVycm9ycyBpbiB0aGUKLXNvdXJjZSBjb2RlIGluIHRoZSBlZGl0b3IgYXJlYS4gVGhlIHdhcm5pbmdzIGFuZCBlcnJvcnMgYWxzbyBzaG93IHVwIGluIHRoZQotVGFza3MgdmlldyB3aGVuIHlvdSBzYXZlIHRoZSBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBIaWdobGlnaHRpbmcgaXMgZnVsbHkgZHluYW1pYwotd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHNlYXJjaCByZXN1bHRzLiBTZWFyY2ggcmVzdWx0cyBhcmUgaGlnaGxpZ2h0ZWQgYmFzZWQKLXVwb24gd2hhdCBoYXMgYmVlbiBzYXZlZCB0byBkaXNrLjwvZGl2PgotPGRpdiBjbGFzcz0idGlwIj48c3BhbiBjbGFzcz0idGlwdGl0bGUiPlRpcDo8L3NwYW4+IFlvdSBjYW4gaW1wcm92ZSBhCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9yJ3MgcGVyZm9ybWFuY2UgYnkgdHVybmluZyBvZmYgdGhlIHJlYWwtdGltZSB2YWxpZGF0aW9uLjwvZGl2PgotPHA+VG8KLXNldCBhbm5vdGF0aW9uIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLTwvc3Bhbj4uPC9zcGFuPiBBIFByZWZlcmVuY2VzIHdpbmRvdyBhcHBlYXJzLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXRvcnM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3Qgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8L3NwYW4+Ci08dWw+Ci08bGk+VG8gdHVybiBvZmYgcmVhbC10aW1lIHN5bnRheCB2YWxpZGF0aW9uLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkCi1UZXh0IEVkaXRvcjwvc3Bhbj4gYW5kIHVuY2hlY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFuYWx5emUgYW5ub3RhdGlvbnMgd2hpbGUKLXR5cGluZzwvc3Bhbj4gYm94LjwvbGk+Ci0KLTxsaT5UbyBjb250cm9sIG90aGVyIGFubm90YXRpb24gc2V0dGluZ3MsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFubm90YXRpb25zPC9zcGFuPiBhbmQKLXNlbGVjdCB5b3VyIGFubm90YXRpb24gcHJlZmVyZW5jZXMuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8gc2F2ZSB5b3VyIHByZWZlcmVuY2VzIGFuZCBjbG9zZQotdGhlIHBhZ2UuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI1Lmh0bWwiIHRpdGxlPSIiPlNldHRpbmcgcHJlZmVyZW5jZXMgZm9yIHN0cnVjdHVyZWQKLXRleHQgZWRpdG9yczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmYyNjJhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAwNSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L3RpdGxlPg0KLTwhLS1Gb3JtZXJseSAiVXNpbmcgSmF2YVNjcmlwdCBjb250ZW50IGFzc2lzdCI7IG1vdmVkIHNvbWUgSmF2YVNjcmlwdC1zcGVjaWZpYyBjb250ZW50IHRvIGNzcmNlZHQwMDYuZGl0YSAoIkNvbnRlbnQgYXNzaXN0IiktLT4NCi08dGl0bGVhbHRzPg0KLTxuYXZ0aXRsZT5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZTwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UbyBnZXQgaGVscCBpbiBhZGRpbmcgbWFya3VwIHRvIGEgZmlsZSwgeW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QNCi1pbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnDQotb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5jb250ZW50IGFzc2lzdDxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+Q29udGVudCBhc3Npc3QgYWxzbyBlbmFibGVzIHlvdSB0byBzZWxlY3QgYW5kIGluc2VydCB0ZW1wbGF0ZXMgaW4NCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcw0KLXRoZSBjb250ZXh0IGZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9jb250ZXh0Pg0KLTxzdGVwcy11bm9yZGVyZWQ+DQotPHN0ZXA+PGNtZD48L2NtZD48aW5mbz5Zb3UgY2FuIHJlcXVlc3QgY29udGVudCBhc3Npc3QgaW4gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcNCi10d28gd2F5czo8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT5Gcm9tIHRoZSA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4gbWVudSwgc2VsZWN0IDx1aWNvbnRyb2w+Q29udGVudA0KLUFzc2lzdDwvdWljb250cm9sPjwvY2hvaWNlPg0KLTxjaG9pY2U+UHJlc3MgQ3RybCtTcGFjZTwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08aW5mbz48cD5JbiBhZGRpdGlvbiwgeW91IGNhbiBzZXQgYSBwcmVmZXJlbmNlIHRoYXQgY2F1c2VzIGNvbnRlbnQgYXNzaXN0DQotdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkgd2hlbiBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlIHR5cGVkLCBzdWNoIGFzIDxjb2RlcGg+LjwvY29kZXBoPiBpbg0KLXRoZSBjYXNlIG9mIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IG9yIDxjb2RlcGg+Jmx0OzwvY29kZXBoPiBpbiB0aGUgY2FzZQ0KLW9mIEhUTUwgYW5kIFhNTC4gVG8gc2V0IHRoaXMgcHJlZmVyZW5jZSwgc2VsZWN0IDx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSA8dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPiBtZW51LCBhbmQgdGhlbiBzZWxlY3QgPHVpY29udHJvbD5XZWIgYW5kDQotWE1MIEZpbGVzPC91aWNvbnRyb2w+LCBmb2xsb3dlZCBieSBvbmUgb2YgdGhlIGZvbGxvd2luZyBzZXF1ZW5jZXM6PHVsPg0KLTxsaT48bWVudWNhc2NhZGU+PHVpY29udHJvbD5IVE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIFNvdXJjZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9saT4NCi08bGk+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+SmF2YVNjcmlwdCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+SmF2YVNjcmlwdA0KLVNvdXJjZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+PC9saT4NCi08bGk+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+WE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgU291cmNlPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT48L2xpPg0KLTwvdWw+SW4gdGhlIDx1aWNvbnRyb2w+Q29udGVudCBhc3Npc3Q8L3VpY29udHJvbD4gZ3JvdXAgYm94LCBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+QXV0b21hdGljYWxseQ0KLW1ha2Ugc3VnZ2VzdGlvbnM8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgc3VwcGx5IGFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMNCi10aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvcD48cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uDQotd2hlcmUgY29udGVudCBhc3Npc3QgaXMgYXZhaWxhYmxlLCBhIHBvcC11cCBsaXN0IG9mIGFsbCBhdmFpbGFibGUgY2hvaWNlcw0KLWlzIGRpc3BsYXllZC4gRm9yIGVhY2ggb2YgdGhlc2UgY2hvaWNlcywgYSBicmllZiBkZXNjcmlwdGlvbiBvZiB0aGUgY29kZSBpcw0KLXByb3ZpZGVkLjwvcD48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHMtdW5vcmRlcmVkPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPCEtLSAgPGxpbmsgaHJlZj0iY29udGVudGFzc2lzdCIgdHlwZT0ic2hvd21lIiBmb3JtYXQ9InZpZXdsZXQiPjxsaW5rdGV4dD5TaG93IE1lPC9saW5rdGV4dD48L2xpbms+ICAtLT4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNi5kaXRhIj48bGlua3RleHQ+Q29udGVudCBhc3Npc3Q8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMy5kaXRhIj48bGlua3RleHQ+TWFraW5nIGNvbnRlbnQgYXNzaXN0IHdvcmsgZm9yIEpTUA0KLWZpbGVzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNy5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UNCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTY0MGJkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVG8gZ2V0IGhlbHAgaW4gYWRkaW5nIG1hcmt1cCB0byBhIGZpbGUsIHlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdCwgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJjb250ZW50IGFzc2lzdCwgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI3Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDA1IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+R2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMDUiPjxhIG5hbWU9InRzcmNlZHQwMDUiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPC9oMT4KLQotCi0KLQotCi08ZGl2PjxwPlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdAotaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBDb250ZW50IGFzc2lzdCBoZWxwcyB5b3UgaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZwotb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkNvbnRlbnQgYXNzaXN0IGFsc28gZW5hYmxlcyB5b3UgdG8gc2VsZWN0IGFuZCBpbnNlcnQgdGVtcGxhdGVzIGluCi1zdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcwotdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi48L2Rpdj4KLQotCi08ZGl2IGNsYXNzPSJwIj48c3BhbiAvPiBZb3UgY2FuIHJlcXVlc3QgY29udGVudCBhc3Npc3QgaW4gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcKLXR3byB3YXlzOgotPHVsPgotPGxpPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50Ci1Bc3Npc3Q8L3NwYW4+PC9saT4KLQotPGxpPlByZXNzIEN0cmwrU3BhY2U8L2xpPgotCi08L3VsPgotCi0gPGRpdiBjbGFzcz0icCI+SW4gYWRkaXRpb24sIHlvdSBjYW4gc2V0IGEgcHJlZmVyZW5jZSB0aGF0IGNhdXNlcyBjb250ZW50IGFzc2lzdAotdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkgd2hlbiBjZXJ0YWluIGNoYXJhY3RlcnMgYXJlIHR5cGVkLCBzdWNoIGFzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi48L3NhbXA+IGluCi10aGUgY2FzZSBvZiBKYXZhU2NyaXB04oSiIG9yIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDs8L3NhbXA+IGluIHRoZSBjYXNlCi1vZiBIVE1MIGFuZCBYTUwuIFRvIHNldCB0aGlzIHByZWZlcmVuY2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4gZnJvbQotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gbWVudSwgYW5kIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQKLVhNTCBGaWxlczwvc3Bhbj4sIGZvbGxvd2VkIGJ5IG9uZSBvZiB0aGUgZm9sbG93aW5nIHNlcXVlbmNlczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgU291cmNlPC9zcGFuPgotPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmFTY3JpcHQgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YVNjcmlwdAotU291cmNlPC9zcGFuPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIFNvdXJjZTwvc3Bhbj4KLTwvc3Bhbj48L2xpPgotCi08L3VsPgotSW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgYXNzaXN0PC9zcGFuPiBncm91cCBib3gsIHNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXV0b21hdGljYWxseQotbWFrZSBzdWdnZXN0aW9uczwvc3Bhbj4gY2hlY2sgYm94LCBhbmQgc3VwcGx5IGFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMKLXRoYXQgc2hvdWxkIHRyaWdnZXIgY29udGVudCBhc3Npc3QuPC9kaXY+Ci08cD5JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uCi13aGVyZSBjb250ZW50IGFzc2lzdCBpcyBhdmFpbGFibGUsIGEgcG9wLXVwIGxpc3Qgb2YgYWxsIGF2YWlsYWJsZSBjaG9pY2VzCi1pcyBkaXNwbGF5ZWQuIEZvciBlYWNoIG9mIHRoZXNlIGNob2ljZXMsIGEgYnJpZWYgZGVzY3JpcHRpb24gb2YgdGhlIGNvZGUgaXMKLXByb3ZpZGVkLjwvcD4KLTwvZGl2PgotCi0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNi5odG1sIiB0aXRsZT0iQ29udGVudCBhc3Npc3QgaGVscHMgeW91IGluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhlIHBsYWNlbWVudCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dCBmb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLiI+Q29udGVudCBhc3Npc3Q8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyMy5odG1sIiB0aXRsZT0iSGF2aW5nIHRoZSBwcm9wZXIgZmlsZXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBidWlsZCBjbGFzcyBwYXRoIGlzIGVzc2VudGlhbCBmb3IgY29udGVudCBhc3Npc3QgdG8gd29yayBwcm9wZXJseSBpbiBKU1AgZmlsZXMuIEl0IGlzIGFsc28gZXNzZW50aWFsIGZvciB0aGUgbGlua3MgYnVpbGRlciB0byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIEphdmEgYmVhbnMgaW4gSlNQIGFuZCBIVE1MIGZpbGVzLiI+TWFraW5nIGNvbnRlbnQgYXNzaXN0IHdvcmsgZm9yIEpTUAotZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjcuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UKLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4YWE4YjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDA3LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDA3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZWFyY2hpbmcgb3IgZmluZGluZyB0ZXh0IHdpdGhpbiBhIGZpbGU8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPGluZGV4dGVybT50ZXh0IHNlYXJjaDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPHByZXJlcT48bm90ZSB0eXBlPSJ0aXAiPkJlZm9yZSB5b3UgZG8gYSBTZWFyY2ggb3BlcmF0aW9uIGluIGEgc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yLCBzYXZlIHRoZSBmaWxlIHlvdSBhcmUgc2VhcmNoaW5nLiBUaGUgc2VhcmNoIGZ1bmN0aW9uIHdvcmtzIGZyb20NCi10aGUgbW9zdCByZWNlbnRseSBzYXZlZCB2ZXJzaW9uIG9mIHRoZSBmaWxlIHJhdGhlciB0aGFuIGZyb20gdGhlIGNvbnRlbnRzDQotdGhhdCB5b3Ugc2VlIGluIHRoZSBlZGl0b3IgYXJlYS4gWW91IGRvIG5vdCBuZWVkIHRvIHNhdmUgeW91ciBmaWxlIGJlZm9yZQ0KLXlvdSBkbyBhIEZpbmQvUmVwbGFjZSBvcGVyYXRpb24uIDwvbm90ZT48L3ByZXJlcT4NCi08Y29udGV4dD5FYWNoIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgcHJvdmlkZXMgdHdvIHdheXMgdG8gbG9jYXRlIGEgdGV4dCBzdHJpbmcNCi1pbiB0aGUgZmlsZSB5b3UgYXJlIGVkaXRpbmcgYW5kIG9wdGlvbmFsbHkgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3RyaW5nOiA8ZGw+DQotPGRsZW50cnk+DQotPGR0PkZpbmQvUmVwbGFjZTwvZHQ+DQotPGRkPkxldHMgeW91IGxvY2F0ZSB0ZXh0IGluIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBlZGl0ZWQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlNlYXJjaDwvZHQ+DQotPGRkPkxldHMgeW91IGxvY2F0ZSB0ZXh0IGluIGZpbGVzIHRoYXQgaGF2ZSBiZWVuIHNhdmVkIHRvIHlvdXIgd29ya3NwYWNlLjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PHA+VG8gbG9jYXRlIGFuZCBvcHRpb25hbGx5IHJlcGxhY2UgdGV4dCwgc2VsZWN0IG9uZSBvZiB0aGUNCi1mb2xsb3dpbmcgbWVudSBwYXRoczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcy11bm9yZGVyZWQ+DQotPHN0ZXA+PGNtZD48bWVudWNhc2NhZGU+PHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+PHVpY29udHJvbD5GaW5kL1JlcGxhY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiAob3IgPHVpY29udHJvbD5DdHJsK0Y8L3VpY29udHJvbD4pPC9jbWQ+PGluZm8+VGhpcyBvcHRpb24gaXMNCi1zZWxmLWV4cGxhbmF0b3J5LjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcy11bm9yZGVyZWQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzZhNzg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwNy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlIiAvPgotPG1ldGEgY29udGVudD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIHRleHQgc2VhcmNoIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMsIHRleHQgc2VhcmNoIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAwNyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNlYXJjaGluZyBvciBmaW5kaW5nIHRleHQgd2l0aGluIGEgZmlsZTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAwNyI+PGEgbmFtZT0idHNyY2VkdDAwNyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2VhcmNoaW5nIG9yIGZpbmRpbmcgdGV4dCB3aXRoaW4gYSBmaWxlPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0icCI+PGRpdiBjbGFzcz0idGlwIj48c3BhbiBjbGFzcz0idGlwdGl0bGUiPlRpcDo8L3NwYW4+IEJlZm9yZSB5b3UgZG8gYSBTZWFyY2ggb3BlcmF0aW9uIGluIGEgc3RydWN0dXJlZAotdGV4dCBlZGl0b3IsIHNhdmUgdGhlIGZpbGUgeW91IGFyZSBzZWFyY2hpbmcuIFRoZSBzZWFyY2ggZnVuY3Rpb24gd29ya3MgZnJvbQotdGhlIG1vc3QgcmVjZW50bHkgc2F2ZWQgdmVyc2lvbiBvZiB0aGUgZmlsZSByYXRoZXIgdGhhbiBmcm9tIHRoZSBjb250ZW50cwotdGhhdCB5b3Ugc2VlIGluIHRoZSBlZGl0b3IgYXJlYS4gWW91IGRvIG5vdCBuZWVkIHRvIHNhdmUgeW91ciBmaWxlIGJlZm9yZQoteW91IGRvIGEgRmluZC9SZXBsYWNlIG9wZXJhdGlvbi4gPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+RWFjaCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHByb3ZpZGVzIHR3byB3YXlzIHRvIGxvY2F0ZSBhIHRleHQgc3RyaW5nCi1pbiB0aGUgZmlsZSB5b3UgYXJlIGVkaXRpbmcgYW5kIG9wdGlvbmFsbHkgcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgc3RyaW5nOiA8ZGw+Ci0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5GaW5kL1JlcGxhY2U8L2R0PgotCi08ZGQ+TGV0cyB5b3UgbG9jYXRlIHRleHQgaW4gdGhlIGZpbGUgY3VycmVudGx5IGJlaW5nIGVkaXRlZC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5TZWFyY2g8L2R0PgotCi08ZGQ+TGV0cyB5b3UgbG9jYXRlIHRleHQgaW4gZmlsZXMgdGhhdCBoYXZlIGJlZW4gc2F2ZWQgdG8geW91ciB3b3Jrc3BhY2UuPC9kZD4KLQotPC9kbD4KLTxwPlRvIGxvY2F0ZSBhbmQgb3B0aW9uYWxseSByZXBsYWNlIHRleHQsIHNlbGVjdCBvbmUgb2YgdGhlCi1mb2xsb3dpbmcgbWVudSBwYXRoczo8L3A+Ci08L2Rpdj4KLQotCi08ZGl2IGNsYXNzPSJwIj48c3Bhbj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQ8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluZC9SZXBsYWNlPC9zcGFuPgotPC9zcGFuPiAob3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3RybCtGPC9zcGFuPik8L3NwYW4+IFRoaXMgb3B0aW9uIGlzCi1zZWxmLWV4cGxhbmF0b3J5LjwvZGl2PgotCi0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxMC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDEwLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYzZkMDEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDEwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDEwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DaGVja2luZyBzcGVsbGluZzwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvci48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zcGVsbCBjaGVjazxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPnN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzPGluZGV4dGVybT5zcGVsbCBjaGVjazwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPlRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyAoYWNjZXNzZWQgZnJvbQ0KLXRoZSBQcm9qZWN0IEV4cGxvcmVyJ3MgcG9wLXVwIG1lbnUgb3IgYnkgY2xpY2tpbmcgdGhlIFNvdXJjZSB0YWIgaW4gY2VydGFpbg0KLWVkaXRvcnMpIHByb3ZpZGUgYSBzcGVsbCBjaGVja2luZyBmZWF0dXJlLjwvcD48cD5UbyBjaGVjayBzcGVsbGluZyBpbiBhbiBIVE1MLA0KLVhNTCwgb3Igb3RoZXIgZmlsZSB0aGF0IHVzZXMgYSBzdHJ1Y3R1cmVkIG1hcmt1cCBsYW5ndWFnZTo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFRvIHNlbGVjdCB0aGUgZGljdGlvbmFyeSB0aGF0IHdpbGwgYmUgdXNlZCwgY2xpY2sgPG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+PHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPjx1aWNvbnRyb2w+U3BlbGwNCi1DaGVjazwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPk9wZW4gaW4gYSAgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciB0aGUgZmlsZSB3aG9zZSBzcGVsbGluZyB5b3Ugd2FudA0KLXRvIGNoZWNrLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlN0YXJ0IHRoZSBzcGVsbGluZyBjaGVja2VyIGJ5IGNsaWNraW5nIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4NCi08dWljb250cm9sPlNwZWxsIENoZWNrPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSBhIG5ldyBzcGVsbGluZyBpbnRvIHRoZSA8dWljb250cm9sPkNoYW5nZSB0bzwvdWljb250cm9sPiBmaWVsZCwNCi1vciBzZWxlY3Qgb25lIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4gQ2xpY2sgdGhlIDx1aWNvbnRyb2w+Q2hhbmdlPC91aWNvbnRyb2w+IGJ1dHRvbg0KLXRvIGNoYW5nZSB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgd29yZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudC4gQ2xpY2sNCi10aGUgPHVpY29udHJvbD5DaGFuZ2UgQWxsPC91aWNvbnRyb2w+IGJ1dHRvbiB0byBjaGFuZ2UgYWxsIGluc3RhbmNlcyBvZiB0aGUNCi13b3JkIGluIHRoZSBjdXJyZW50IGRvY3VtZW50LiBZb3UgY2FuIGFsc28gY2xpY2sgdGhlIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+IGJ1dHRvbg0KLXRvIGFkZCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHNwZWxsaW5nIHRvIHlvdXIgZGljdGlvbmFyeS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Vc2UgdGhlIGNvbnRyb2xzIGluIHRoZSBTcGVsbCBDaGVjayBkaWFsb2cgYm94IHRvIGlnbm9yZSwgY2hhbmdlLA0KLW9yIGFkZCB0ZXJtcyB0byB0aGUgY3VycmVudCBkaWN0aW9uYXJ5LiAoVG8gcmVtb3ZlIGEgd29yZCBhZnRlciBpdCBoYXMgYmVlbg0KLWFkZGVkIHRvIHRoZSBkaWN0aW9uYXJ5LCBjbGljayB0aGUgPHVpY29udHJvbD5EaWN0aW9uYXJ5PC91aWNvbnRyb2w+IHB1c2gNCi1idXR0b24uKTwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDEwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmMjczMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNoZWNraW5nIHNwZWxsaW5nIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGNoZWNrIHNwZWxsaW5nIGluIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gY2hlY2sgc3BlbGxpbmcgaW4gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InNwZWxsIGNoZWNrLCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNwZWxsIGNoZWNrLCBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMTAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DaGVja2luZyBzcGVsbGluZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAxMCI+PGEgbmFtZT0idHNyY2VkdDAxMCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q2hlY2tpbmcgc3BlbGxpbmc8L2gxPgotCi0KLQotPGRpdj48cD5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQKLXRleHQgZWRpdG9yLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyAoYWNjZXNzZWQgZnJvbQotdGhlIFByb2plY3QgRXhwbG9yZXIncyBwb3AtdXAgbWVudSBvciBieSBjbGlja2luZyB0aGUgU291cmNlIHRhYiBpbiBjZXJ0YWluCi1lZGl0b3JzKSBwcm92aWRlIGEgc3BlbGwgY2hlY2tpbmcgZmVhdHVyZS48L3A+Ci08cD5UbyBjaGVjayBzcGVsbGluZyBpbiBhbiBIVE1MLAotWE1MLCBvciBvdGhlciBmaWxlIHRoYXQgdXNlcyBhIHN0cnVjdHVyZWQgbWFya3VwIGxhbmd1YWdlOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPihPcHRpb25hbCkgVG8gc2VsZWN0IHRoZSBkaWN0aW9uYXJ5IHRoYXQgd2lsbCBiZSB1c2VkLCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWxsCi1DaGVjazwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+T3BlbiBpbiBhICBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIHRoZSBmaWxlIHdob3NlIHNwZWxsaW5nIHlvdSB3YW50Ci10byBjaGVjay48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPlN0YXJ0IHRoZSBzcGVsbGluZyBjaGVja2VyIGJ5IGNsaWNraW5nIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWxsIENoZWNrPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5UeXBlIGEgbmV3IHNwZWxsaW5nIGludG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNoYW5nZSB0bzwvc3Bhbj4gZmllbGQsCi1vciBzZWxlY3Qgb25lIG9mIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4gQ2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNoYW5nZTwvc3Bhbj4gYnV0dG9uCi10byBjaGFuZ2UgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIHdvcmQgaW4gdGhlIGN1cnJlbnQgZG9jdW1lbnQuIENsaWNrCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2hhbmdlIEFsbDwvc3Bhbj4gYnV0dG9uIHRvIGNoYW5nZSBhbGwgaW5zdGFuY2VzIG9mIHRoZQotd29yZCBpbiB0aGUgY3VycmVudCBkb2N1bWVudC4gWW91IGNhbiBhbHNvIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IGJ1dHRvbgotdG8gYWRkIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgc3BlbGxpbmcgdG8geW91ciBkaWN0aW9uYXJ5Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+VXNlIHRoZSBjb250cm9scyBpbiB0aGUgU3BlbGwgQ2hlY2sgZGlhbG9nIGJveCB0byBpZ25vcmUsIGNoYW5nZSwKLW9yIGFkZCB0ZXJtcyB0byB0aGUgY3VycmVudCBkaWN0aW9uYXJ5LiAoVG8gcmVtb3ZlIGEgd29yZCBhZnRlciBpdCBoYXMgYmVlbgotYWRkZWQgdG8gdGhlIGRpY3Rpb25hcnksIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EaWN0aW9uYXJ5PC9zcGFuPiBwdXNoCi1idXR0b24uKTwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTUyMWEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAxNCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcNCi1ieSBhZGRpbmcgYSBuZXcgZHJhd2VyLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNuaXBwZXRzPGluZGV4dGVybT5kcmF3ZXJzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48aW5kZXh0ZXJtPmRlbGV0aW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5lZGl0aW5nIGl0ZW1zPC9pbmRleHRlcm0+PGluZGV4dGVybT5oaWRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRvIGFkZCBhIG5ldyBkcmF3ZXIgdG8gdGhlIFNuaXBwZXRzIHZpZXc6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIHRoZSBTbmlwcGV0cyB2aWV3IGFuZCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPkNhdGVnb3J5PC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gYW5kIHR5cGUgdGhlIG5hbWUgb2YgdGhlIG5ldyBkcmF3ZXIgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5PcHRpb25hbGx5LCB0eXBlIGEgZGVzY3JpcHRpb24gaW4gdGhlIDx1aWNvbnRyb2w+RGVzY3JpcHRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBkcmF3ZXIncyBiZWhhdmlvciBieSBjaGVja2luZyBjaGVjayBib3hlcyBhcyBhcHByb3ByaWF0ZS4NCi1UaGUgY2hlY2sgYm94ZXMgYXJlIGFzIGZvbGxvd3M6PC9jbWQ+DQotPGNob2ljZXRhYmxlPg0KLTxjaHJvdz48Y2hvcHRpb24+SGlkZTwvY2hvcHRpb24+PGNoZGVzYz5EbyBub3QgZGlzcGxheSB0aGUgZHJhd2VyLjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5PcGVuIGRyYXdlciBhdCBzdGFydC11cDwvY2hvcHRpb24+PGNoZGVzYz5BdCBzdGFydC11cCwgZGlzcGxheQ0KLXRoZSBkcmF3ZXIncyBpdGVtcy48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+UGluIGRyYXdlciBvcGVuIGF0IHN0YXJ0LXVwPC9jaG9wdGlvbj48Y2hkZXNjPktlZXAgdGhlIGRyYXdlcg0KLW9wZW4uPC9jaGRlc2M+PC9jaHJvdz4NCi08L2Nob2ljZXRhYmxlPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIFRoZSBuZXcgZHJhd2VyIHdpbGwgYmUgYWRkZWQgdG8NCi10aGUgbGlzdCBvZiBkcmF3ZXJzIGluIHRoZSBTbmlwcGV0cyB2aWV3LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI2LmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTUuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyYmJiODQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgc25pcHBldHMgZHJhd2VycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZXhwbGFpbnMgaG93IHRvIGN1c3RvbWl6ZSB0aGUgU25pcHBldHMgdmlldyBieSBhZGRpbmcgYSBuZXcgZHJhd2VyLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBkcmF3ZXJzLCBhZGRpbmcsIGRlbGV0aW5nLCBlZGl0aW5nIGl0ZW1zLCBoaWRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZHJhd2VycywgYWRkaW5nLCBkZWxldGluZywgZWRpdGluZyBpdGVtcywgaGlkaW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwMS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE2Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAxNCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDE0Ij48YSBuYW1lPSJ0c3JjZWR0MDE0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvaDE+Ci0KLQotCi08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBleHBsYWlucyBob3cgdG8gY3VzdG9taXplIHRoZSBTbmlwcGV0cyB2aWV3Ci1ieSBhZGRpbmcgYSBuZXcgZHJhd2VyLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gYWRkIGEgbmV3IGRyYXdlciB0byB0aGUgU25pcHBldHMgdmlldzo8L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPlJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIHRoZSBTbmlwcGV0cyB2aWV3IGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VzdG9taXplPC9zcGFuPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DYXRlZ29yeTwvc3Bhbj4KLTwvc3Bhbj4gYW5kIHR5cGUgdGhlIG5hbWUgb2YgdGhlIG5ldyBkcmF3ZXIgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5PcHRpb25hbGx5LCB0eXBlIGEgZGVzY3JpcHRpb24gaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBkcmF3ZXIncyBiZWhhdmlvciBieSBjaGVja2luZyBjaGVjayBib3hlcyBhcyBhcHByb3ByaWF0ZS4KLVRoZSBjaGVjayBib3hlcyBhcmUgYXMgZm9sbG93czo8L3NwYW4+Ci0KLTx0YWJsZSBjbGFzcz0iY2hvaWNldGFibGVib3JkZXIiIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBydWxlcz0icm93cyIgZnJhbWU9ImhzaWRlcyIgYm9yZGVyPSIxIj4KLTx0aGVhZD48dHI+PHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMEE0LW9wdGlvbiIgYWxpZ249ImxlZnQiPk9wdGlvbjwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwQTQtZGVzYyIgYWxpZ249ImxlZnQiPkRlc2NyaXB0aW9uPC90aD48L3RyPjwvdGhlYWQ+Ci08dGJvZHk+Ci08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwQTQtb3B0aW9uIiBpZD0iTjEwMEFFIj48c3Ryb25nPkhpZGU8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwQTQtZGVzYyBOMTAwQUUiPkRvIG5vdCBkaXNwbGF5IHRoZSBkcmF3ZXIuPC90ZD4KLQotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEE0LW9wdGlvbiIgaWQ9Ik4xMDBCRSI+PHN0cm9uZz5PcGVuIGRyYXdlciBhdCBzdGFydC11cDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBBNC1kZXNjIE4xMDBCRSI+QXQgc3RhcnQtdXAsIGRpc3BsYXkKLXRoZSBkcmF3ZXIncyBpdGVtcy48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEE0LW9wdGlvbiIgaWQ9Ik4xMDBDRCI+PHN0cm9uZz5QaW4gZHJhd2VyIG9wZW4gYXQgc3RhcnQtdXA8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwQTQtZGVzYyBOMTAwQ0QiPktlZXAgdGhlIGRyYXdlcgotb3Blbi48L3RkPgotPC90cj4KLQotPC90Ym9keT48L3RhYmxlPgotCi08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LiBUaGUgbmV3IGRyYXdlciB3aWxsIGJlIGFkZGVkIHRvCi10aGUgbGlzdCBvZiBkcmF3ZXJzIGluIHRoZSBTbmlwcGV0cyB2aWV3Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDEuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4iPlNuaXBwZXRzIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNi5odG1sIiB0aXRsZT0iVGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcgb2JqZWN0cywgc3VjaCBhcyBIVE1MIHRhZ2dpbmcsIEphdmFTY3JpcHQsIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aCBmaWxlcyBhbmQgY3VzdG9tIEpTUCB0YWdzLiBUaGUgdmlldyBjYW4gYmUgZXh0ZW5kZWQgYmFzZWQgb24gYWRkaXRpb25hbCBvYmplY3RzIHRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS4iPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDdhNzZkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAxNSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNuaXBwZXQgZHJhd2VyczxpbmRleHRlcm0+YWRkaW5nIGl0ZW1zIHRvPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5zbmlwcGV0IGl0ZW1zPGluZGV4dGVybT5hZGRpbmcgdG8gZHJhd2VyczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IFRvIGFkZCBuZXcgaXRlbXMgdG8gYW4gZXhpc3Rpbmcgc25pcHBldHMgZHJhd2VyOjo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hvaWNlczo8L2NtZD48aW5mbz48dGFibGUgY29sc2VwPSIwIiBmcmFtZT0idG9wYm90Ij4NCi08dGdyb3VwIGNvbHM9IjIiPjxjb2xzcGVjIGNvbG5hbWU9ImNvbDEiIGNvbHdpZHRoPSI3MioiLz48Y29sc3BlYyBjb2xuYW1lPSJjb2wyIg0KLWNvbHdpZHRoPSIxMjcqIi8+DQotPHRoZWFkPg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiIHZhbGlnbj0idG9wIj5UbyBzdGFydCB3aXRoIHRoaXM6PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiIgdmFsaWduPSJ0b3AiPkRvIHRoaXM6PC9lbnRyeT4NCi08L3Jvdz4NCi08L3RoZWFkPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJjb2wxIj5BbiBlbXB0eSBpdGVtIHRoYXQgeW91IGNhbiBlZGl0PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+UmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyLCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4sDQotYW5kIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+TmV3IEl0ZW08L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDEiPkV4aXN0aW5nIHRleHQgcGFzdGVkIGludG8gYSBuZXcgaXRlbSBpbiBhbiBleGlzdGluZw0KLWRyYXdlcjwvZW50cnk+DQotPGVudHJ5IGNvbG5hbWU9ImNvbDIiPkNvcHkgb3IgY3V0IHRleHQgdG8gdGhlIGNsaXBib2FyZC4gSW4gdGhlIFNuaXBwZXRzIHZpZXcsDQotcmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyIGFuZCBjbGljayA8dWljb250cm9sPlBhc3RlPC91aWNvbnRyb2w+LjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iY29sMSI+RXhpc3RpbmcgdGV4dCBwYXN0ZWQgaW50byBhIG5ldyBpdGVtIGluIGEgbmV3IG9yIGV4aXN0aW5nDQotZHJhd2VyPC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iY29sMiI+U2VsZWN0IHRoZSB0ZXh0LCByaWdodC1jbGljaywgY2xpY2sgPHVpY29udHJvbD5BZGQgdG8NCi1TbmlwcGV0czwvdWljb250cm9sPiwgc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgZHJhd2VyIGluIHRoZSBTbmlwcGV0cyB2aWV3DQotdG8gd2hpY2ggeW91IHdhbnQgdG8gYWRkIHRoZSBpdGVtLCBhbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT48L2luZm8+PHN0ZXByZXN1bHQ+QSA8d2ludGl0bGU+Q3VzdG9taXplIFBhbGV0dGU8L3dpbnRpdGxlPiB3aW5kb3cNCi1hcHBlYXJzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgbmFtZSBmb3IgdGhlIG5ldyBpdGVtLCBhbmQsIG9wdGlvbmFsbHksIHByb3ZpZGUgYSBkZXNjcmlwdGlvbi48L2NtZD4NCi08c3RlcHJlc3VsdD5UaGUgdmFsdWUgdGhhdCB5b3UgdHlwZSBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkDQotd2lsbCBhcHBlYXIgbmV4dCB0byB0aGUgaXRlbSdzIGljb24gaW4gdGhlIFNuaXBwZXRzIHZpZXcuPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGluY2x1ZGUgaW4gdGhlIDx1aWNvbnRyb2w+VGVtcGxhdGUgUGF0dGVybjwvdWljb250cm9sPiBmaWVsZA0KLWEgdmFyaWFibGUgdGhhdCB5b3UgaGF2ZSBhbHJlYWR5IGRlZmluZWQsIGNsaWNrIDx1aWNvbnRyb2w+SW5zZXJ0IFZhcmlhYmxlDQotUGxhY2Vob2xkZXI8L3VpY29udHJvbD4uIDwvY21kPjxpbmZvPkEgdmFyaWFibGUgcGxhY2Vob2xkZXIgaXMgYSBtYXJrZXIgdGhhdCwNCi13aGVuIHRhZ2dpbmcgaXMgaW5zZXJ0ZWQgaW50byB0aGUgYWN0aXZlIGZpbGUsIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZhbHVlDQotdGhhdCBpcyBlbnRlcmVkIGludG8gdGhlIDx1aWNvbnRyb2w+SW5zZXJ0IFRlbXBsYXRlOjwvdWljb250cm9sPjx2YXJuYW1lPkl0ZW1fbmFtZTwvdmFybmFtZT4gZGlhbG9nDQotYXQgaW5zZXJ0aW9uIHRpbWUuIENsaWNraW5nIHRoZSA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvdWljb250cm9sPiBidXR0b24NCi1vciB0eXBpbmcgQ3RybCtTcGFjZSBhY3RpdmF0ZXMgYSBwb3AtdXAgaW4gdGhlIHRleHQgYXJlYSB0aGF0IHByb21wdHMgeW91DQotd2l0aCB0aGUgY29ycmVjdCBzZXF1ZW5jZXMgdG8gY3JlYXRlIGEgbWFya2VyIGZvciB0aGUgdmFyaWFibGUuPC9pbmZvPjxzdGVweG1wPkZvcg0KLWV4YW1wbGUsIGlmIHlvdSBjcmVhdGUgdHdvIHZhcmlhYmxlcyBuYW1lZCA8dmFybmFtZT51cmk8L3Zhcm5hbWU+IGFuZCA8dmFybmFtZT5wcmVmaXg8L3Zhcm5hbWU+LA0KLWFuZCBjcmVhdGUgdmFyaWFibGUgcGxhY2Vob2xkZXJzIGZvciBib3RoLCB0aGUgdGVtcGxhdGUgcGF0dGVybiBtaWdodCBsb29rDQotbGlrZSB0aGlzOjxjb2RlYmxvY2s+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICU+PC9jb2RlYmxvY2s+PC9zdGVweG1wPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5UaGUgbmV3IGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUNCi1kcmF3ZXIuPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDIyLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE2LmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcg0KLWRyYXdlcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDE1Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM5MjhhYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VycyIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXQgZHJhd2VycywgYWRkaW5nIGl0ZW1zIHRvLCBzbmlwcGV0IGl0ZW1zLCBhZGRpbmcgdG8gZHJhd2VycyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXQgZHJhd2VycywgYWRkaW5nIGl0ZW1zIHRvLCBzbmlwcGV0IGl0ZW1zLCBhZGRpbmcgdG8gZHJhd2VycyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjIuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMTUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAxNSI+PGEgbmFtZT0idHNyY2VkdDAxNSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGl0ZW1zIHRvIHNuaXBwZXRzIGRyYXdlcnM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gVG8gYWRkIG5ldyBpdGVtcyB0byBhbiBleGlzdGluZyBzbmlwcGV0cyBkcmF3ZXI6OjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkRvIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6PC9zcGFuPiAKLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImhzaWRlcyIgYm9yZGVyPSIxIiBydWxlcz0icm93cyI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyPgotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iMzYuMTgwOTA0NTIyNjEzMDclIiBpZD0iTjEwMDc5Ij5UbyBzdGFydCB3aXRoIHRoaXM6PC90aD4KLQotPHRoIHZhbGlnbj0idG9wIiB3aWR0aD0iNjMuODE5MDk1NDc3Mzg2OTMlIiBpZD0iTjEwMDgxIj5EbyB0aGlzOjwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjE4MDkwNDUyMjYxMzA3JSIgaGVhZGVycz0iTjEwMDc5ICI+QW4gZW1wdHkgaXRlbSB0aGF0IHlvdSBjYW4gZWRpdDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzLjgxOTA5NTQ3NzM4NjkzJSIgaGVhZGVycz0iTjEwMDgxICI+UmlnaHQtY2xpY2sgYW55d2hlcmUgaW4gYW4gZXhpc3RpbmcgZHJhd2VyLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VzdG9taXplPC9zcGFuPiwKLWFuZCBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXcgSXRlbTwvc3Bhbj4KLTwvc3Bhbj4uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiB3aWR0aD0iMzYuMTgwOTA0NTIyNjEzMDclIiBoZWFkZXJzPSJOMTAwNzkgIj5FeGlzdGluZyB0ZXh0IHBhc3RlZCBpbnRvIGEgbmV3IGl0ZW0gaW4gYW4gZXhpc3RpbmcKLWRyYXdlcjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjYzLjgxOTA5NTQ3NzM4NjkzJSIgaGVhZGVycz0iTjEwMDgxICI+Q29weSBvciBjdXQgdGV4dCB0byB0aGUgY2xpcGJvYXJkLiBJbiB0aGUgU25pcHBldHMgdmlldywKLXJpZ2h0LWNsaWNrIGFueXdoZXJlIGluIGFuIGV4aXN0aW5nIGRyYXdlciBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGFzdGU8L3NwYW4+LjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgd2lkdGg9IjM2LjE4MDkwNDUyMjYxMzA3JSIgaGVhZGVycz0iTjEwMDc5ICI+RXhpc3RpbmcgdGV4dCBwYXN0ZWQgaW50byBhIG5ldyBpdGVtIGluIGEgbmV3IG9yIGV4aXN0aW5nCi1kcmF3ZXI8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIHdpZHRoPSI2My44MTkwOTU0NzczODY5MyUiIGhlYWRlcnM9Ik4xMDA4MSAiPlNlbGVjdCB0aGUgdGV4dCwgcmlnaHQtY2xpY2ssIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCB0bwotU25pcHBldHM8L3NwYW4+LCBzcGVjaWZ5IHRoZSBuYW1lIG9mIHRoZSBkcmF3ZXIgaW4gdGhlIFNuaXBwZXRzIHZpZXcKLXRvIHdoaWNoIHlvdSB3YW50IHRvIGFkZCB0aGUgaXRlbSwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0gQSA8c3BhbiBjbGFzcz0id2ludGl0bGUiPkN1c3RvbWl6ZSBQYWxldHRlPC9zcGFuPiB3aW5kb3cKLWFwcGVhcnMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgbmFtZSBmb3IgdGhlIG5ldyBpdGVtLCBhbmQsIG9wdGlvbmFsbHksIHByb3ZpZGUgYSBkZXNjcmlwdGlvbi48L3NwYW4+Ci0gVGhlIHZhbHVlIHRoYXQgeW91IHR5cGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkCi13aWxsIGFwcGVhciBuZXh0IHRvIHRoZSBpdGVtJ3MgaWNvbiBpbiB0aGUgU25pcHBldHMgdmlldy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGluY2x1ZGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlbXBsYXRlIFBhdHRlcm48L3NwYW4+IGZpZWxkCi1hIHZhcmlhYmxlIHRoYXQgeW91IGhhdmUgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQgVmFyaWFibGUKLVBsYWNlaG9sZGVyPC9zcGFuPi4gPC9zcGFuPiBBIHZhcmlhYmxlIHBsYWNlaG9sZGVyIGlzIGEgbWFya2VyIHRoYXQsCi13aGVuIHRhZ2dpbmcgaXMgaW5zZXJ0ZWQgaW50byB0aGUgYWN0aXZlIGZpbGUsIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZhbHVlCi10aGF0IGlzIGVudGVyZWQgaW50byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFRlbXBsYXRlOjwvc3Bhbj48dmFyIGNsYXNzPSJ2YXJuYW1lIj5JdGVtX25hbWU8L3Zhcj4gZGlhbG9nCi1hdCBpbnNlcnRpb24gdGltZS4gQ2xpY2tpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvc3Bhbj4gYnV0dG9uCi1vciB0eXBpbmcgQ3RybCtTcGFjZSBhY3RpdmF0ZXMgYSBwb3AtdXAgaW4gdGhlIHRleHQgYXJlYSB0aGF0IHByb21wdHMgeW91Ci13aXRoIHRoZSBjb3JyZWN0IHNlcXVlbmNlcyB0byBjcmVhdGUgYSBtYXJrZXIgZm9yIHRoZSB2YXJpYWJsZS4gRm9yCi1leGFtcGxlLCBpZiB5b3UgY3JlYXRlIHR3byB2YXJpYWJsZXMgbmFtZWQgPHZhciBjbGFzcz0idmFybmFtZSI+dXJpPC92YXI+IGFuZCA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5wcmVmaXg8L3Zhcj4sCi1hbmQgY3JlYXRlIHZhcmlhYmxlIHBsYWNlaG9sZGVycyBmb3IgYm90aCwgdGhlIHRlbXBsYXRlIHBhdHRlcm4gbWlnaHQgbG9vawotbGlrZSB0aGlzOjxwcmU+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICUmZ3Q7PC9wcmU+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgbmV3IGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUKLWRyYXdlci48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzYxNWQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAxNiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VyczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08bmF2dGl0bGU+RGVsZXRpbmcgYW5kIGhpZGluZyBkcmF3ZXJzIGFuZCBpdGVtczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZA0KLWl0ZW1zIGluIHRoZSBTbmlwcGV0cyB2aWV3Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNuaXBwZXRzPGluZGV4dGVybT5kZWxldGluZyBvciBoaWRpbmcgZHJhd2VyczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+ZHJhd2VyczxpbmRleHRlcm0+ZGVsZXRpbmcgc25pcHBldHM8L2luZGV4dGVybT48aW5kZXh0ZXJtPmhpZGluZyBzbmlwcGV0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+WW91IGNhbiBoaWRlIGFueSBkcmF3ZXIgb3IgaXRlbSB0aGF0IHNob3dzIHVwIGluIHRoZSBTbmlwcGV0cyB2aWV3Lg0KLUlmIHRoZSBkcmF3ZXIgb3IgaXRlbSBpcyB1c2VyLWRlZmluZWQsIHlvdSBjYW4gZGVsZXRlIGl0IHBlcm1hbmVudGx5LiBUbyBkZWxldGUNCi1vciBoaWRlIGEgZHJhd2VyIG9yIGl0ZW0sIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgdGhhdCB5b3Ugd2FudCB0byByZW1vdmUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQtY2xpY2sgYW5kIHNlbGVjdCA8dWljb250cm9sPkN1c3RvbWl6ZTwvdWljb250cm9sPiBmcm9tIHRoZQ0KLXBvcC11cCBtZW51LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RGVsZXRlPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+SGlkZTwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiBUaGUgaXRlbSBvciBkcmF3ZXIgd2lsbCBiZSBkZWxldGVkDQotb3IgaGlkZGVuIGZyb20gdGhlIFNuaXBwZXRzIHZpZXcuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjIuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgc25pcHBldCBpdGVtczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMTYuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2Q3NTA0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAxNi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2VycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZCBpdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIGRlbGV0aW5nIG9yIGhpZGluZyBkcmF3ZXJzLCBkcmF3ZXJzLCBkZWxldGluZyBzbmlwcGV0cywgaGlkaW5nIHNuaXBwZXRzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIGRlbGV0aW5nIG9yIGhpZGluZyBkcmF3ZXJzLCBkcmF3ZXJzLCBkZWxldGluZyBzbmlwcGV0cywgaGlkaW5nIHNuaXBwZXRzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwMS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDIyLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHNyY2VkdDAxNiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMTYiPjxhIG5hbWU9InRzcmNlZHQwMTYiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yIGRyYXdlcnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgZG9jdW1lbnRhdGlvbiBkZXNjcmliZXMgaG93IHRvIGRlbGV0ZSBvciBoaWRlIGRyYXdlcnMgYW5kCi1pdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gaGlkZSBhbnkgZHJhd2VyIG9yIGl0ZW0gdGhhdCBzaG93cyB1cCBpbiB0aGUgU25pcHBldHMgdmlldy4KLUlmIHRoZSBkcmF3ZXIgb3IgaXRlbSBpcyB1c2VyLWRlZmluZWQsIHlvdSBjYW4gZGVsZXRlIGl0IHBlcm1hbmVudGx5LiBUbyBkZWxldGUKLW9yIGhpZGUgYSBkcmF3ZXIgb3IgaXRlbSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPlNlbGVjdCB0aGUgaXRlbSBvciBkcmF3ZXIgdGhhdCB5b3Ugd2FudCB0byByZW1vdmUuPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5SaWdodC1jbGljayBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZTwvc3Bhbj4gZnJvbSB0aGUKLXBvcC11cCBtZW51Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBpdGVtIG9yIGRyYXdlciBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVsZXRlPC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IaWRlPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LiBUaGUgaXRlbSBvciBkcmF3ZXIgd2lsbCBiZSBkZWxldGVkCi1vciBoaWRkZW4gZnJvbSB0aGUgU25pcHBldHMgdmlldy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2IzMWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyMiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zbmlwcGV0czxpbmRleHRlcm0+ZWRpdGluZyBpdGVtczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IFRvIG1vZGlmeSBhbiBleGlzdGluZyBpdGVtIGluIGEgU25pcHBldHMgZHJhd2VyLCBjb21wbGV0ZSB0aGUgc3RlcHMNCi1saXN0ZWQgYmVsb3cuIElmIHlvdSBoYXZlIGp1c3QgY29tcGxldGVkIHRoZSB0YXNrIDx4cmVmIGhyZWY9InRzcmNlZHQwMTUuZGl0YSINCi10eXBlPSJ0YXNrIj5BZGRpbmcgYW4gaXRlbSB0byBhIHNuaXBwZXRzIGRyYXdlcjwveHJlZj4gYW5kIHRoZSA8d2ludGl0bGU+Q3VzdG9taXplDQotUGFsZXR0ZTwvd2ludGl0bGU+IHdpbmRvdyBpcyBzdGlsbCBvcGVuLCB5b3UgY2FuIHNraXAgc3RlcHMgMSBhbmQgMi48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFNuaXBwZXRzIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBuYW1lIG9mIHRoZSBpdGVtIHRoYXQgeW91DQotd2FudCB0byBtb2RpZnksIGFuZCBzZWxlY3QgPHVpY29udHJvbD5DdXN0b21pemU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+T3B0aW9uYWxseSwgdHlwZSBhIG5ldyBuYW1lIGFuZCBhIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIGl0ZW0uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gZGVjbGFyZSBhIHZhcmlhYmxlLCBjbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPiBhbmQgdHlwZQ0KLXRoZSB2YXJpYWJsZSdzIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgZGVmYXVsdCB2YWx1ZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBlZGl0IGFuIGV4aXN0aW5nIHZhcmlhYmxlLCB0eXBlIG92ZXIgdGhlIGV4aXN0aW5nIHZhbHVlcy48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UbyBlZGl0IHRoZSA8dWljb250cm9sPlRlbXBsYXRlIFBhdHRlcm48L3VpY29udHJvbD4gZmllbGQsIHR5cGUNCi1pbnRvIHRoZSBmaWVsZCwgY3V0IGFuZCBwYXN0ZSBpbnRvIHRoZSBmaWVsZCwgb3IsIGlmIHlvdSBoYXZlIGRlZmluZWQgb25lDQotb3IgbW9yZSB2YXJpYWJsZXMsIGNsaWNrIHRoZSA8dWljb250cm9sPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvdWljb250cm9sPiBidXR0b24sDQotYW5kIGRvdWJsZS1jbGljayB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB5b3Ugd2FudCB0byBpbnNlcnQuPC9jbWQ+PHN0ZXB4bXA+Rm9yDQotZXhhbXBsZSwgaWYgeW91IGhhdmUgZGVjbGFyZSB2YXJpYWJsZXMgbmFtZWQgPHZhcm5hbWU+dXJpPC92YXJuYW1lPiBhbmQgPHZhcm5hbWU+cHJlZml4PC92YXJuYW1lPiwNCi1jbGlja2luZyB0aGUgYnV0dG9uIGJyaW5ncyB1cCBhIG1lbnUgdGhhdCBjb250YWlucyB0aG9zZSBuYW1lcy4gRG91YmxlLWNsaWNraW5nIDx2YXJuYW1lPnVyaTwvdmFybmFtZT4gaW5zZXJ0cyA8Y29kZXBoPiR7dXJpfTwvY29kZXBoPiwNCi1hcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6PGNvZGVibG9jaz4mbHQ7JUAgdGFnbGliIHVyaT0iJHt1cml9IiBwcmVmaXg9IiR7cHJlZml4fSIgJT48L2NvZGVibG9jaz48L3N0ZXB4bXA+DQotPHN0ZXByZXN1bHQ+TGF0ZXIsIHdoZW4geW91IGluc2VydCB0aGUgc25pcHBldCBpbnRvIGEgZmlsZSwgPGNvZGVwaD4ke3VyaX08L2NvZGVwaD4gYW5kIDxjb2RlcGg+JHtwcmVmaXh9PC9jb2RlcGg+IGFyZQ0KLWVhY2ggY29udmVydGVkIHRvIHRoZSBkZWZhdWx0IHZhbHVlIGRlY2xhcmVkIGluIHRoZSBWYXJpYWJsZXMgdGFibGUuIFVzZXJzDQotY2FuIHJlcGxhY2UgdGhlIGRlZmF1bHQgdmFsdWVzIGluIHRoZSA8dWljb250cm9sPkluc2VydCBUZW1wbGF0ZTo8L3VpY29udHJvbD48dmFybmFtZT5JdGVtX25hbWU8L3Zhcm5hbWU+IGRpYWxvZw0KLWF0IGluc2VydGlvbiB0aW1lLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIG1vZGlmaWVkIGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUNCi1kcmF3ZXIuPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwMS5kaXRhIj48bGlua3RleHQ+U25pcHBldHMgdmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIHNuaXBwZXRzIGRyYXdlcnM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE1LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgaXRlbXMgdG8gc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTYuZGl0YSI+PGxpbmt0ZXh0PkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yDQotZHJhd2VyczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWE4OTg3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBzbmlwcGV0IGl0ZW1zIiAvPgotPG1ldGEgY29udGVudD0ic25pcHBldHMsIGVkaXRpbmcgaXRlbXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgZWRpdGluZyBpdGVtcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDEuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAxNi5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIHNuaXBwZXQgaXRlbXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjIiPjxhIG5hbWU9InRzcmNlZHQwMjIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiBUbyBtb2RpZnkgYW4gZXhpc3RpbmcgaXRlbSBpbiBhIFNuaXBwZXRzIGRyYXdlciwgY29tcGxldGUgdGhlIHN0ZXBzCi1saXN0ZWQgYmVsb3cuIElmIHlvdSBoYXZlIGp1c3QgY29tcGxldGVkIHRoZSB0YXNrIDxhIGhyZWY9InRzcmNlZHQwMTUuaHRtbCI+QWRkaW5nIGFuIGl0ZW0gdG8gYSBzbmlwcGV0cyBkcmF3ZXI8L2E+IGFuZCB0aGUgPHNwYW4gY2xhc3M9IndpbnRpdGxlIj5DdXN0b21pemUKLVBhbGV0dGU8L3NwYW4+IHdpbmRvdyBpcyBzdGlsbCBvcGVuLCB5b3UgY2FuIHNraXAgc3RlcHMgMSBhbmQgMi48L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgU25pcHBldHMgdmlldywgcmlnaHQtY2xpY2sgdGhlIG5hbWUgb2YgdGhlIGl0ZW0gdGhhdCB5b3UKLXdhbnQgdG8gbW9kaWZ5LCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1c3RvbWl6ZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3B0aW9uYWxseSwgdHlwZSBhIG5ldyBuYW1lIGFuZCBhIG5ldyBkZXNjcmlwdGlvbiBmb3IgdGhlIGl0ZW0uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBkZWNsYXJlIGEgdmFyaWFibGUsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gYW5kIHR5cGUKLXRoZSB2YXJpYWJsZSdzIG5hbWUsIGRlc2NyaXB0aW9uLCBhbmQgZGVmYXVsdCB2YWx1ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBlZGl0IGFuIGV4aXN0aW5nIHZhcmlhYmxlLCB0eXBlIG92ZXIgdGhlIGV4aXN0aW5nIHZhbHVlcy48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGVkaXQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlbXBsYXRlIFBhdHRlcm48L3NwYW4+IGZpZWxkLCB0eXBlCi1pbnRvIHRoZSBmaWVsZCwgY3V0IGFuZCBwYXN0ZSBpbnRvIHRoZSBmaWVsZCwgb3IsIGlmIHlvdSBoYXZlIGRlZmluZWQgb25lCi1vciBtb3JlIHZhcmlhYmxlcywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZSBQbGFjZWhvbGRlcjwvc3Bhbj4gYnV0dG9uLAotYW5kIGRvdWJsZS1jbGljayB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdGhhdCB5b3Ugd2FudCB0byBpbnNlcnQuPC9zcGFuPiBGb3IKLWV4YW1wbGUsIGlmIHlvdSBoYXZlIGRlY2xhcmUgdmFyaWFibGVzIG5hbWVkIDx2YXIgY2xhc3M9InZhcm5hbWUiPnVyaTwvdmFyPiBhbmQgPHZhciBjbGFzcz0idmFybmFtZSI+cHJlZml4PC92YXI+LAotY2xpY2tpbmcgdGhlIGJ1dHRvbiBicmluZ3MgdXAgYSBtZW51IHRoYXQgY29udGFpbnMgdGhvc2UgbmFtZXMuIERvdWJsZS1jbGlja2luZyA8dmFyIGNsYXNzPSJ2YXJuYW1lIj51cmk8L3Zhcj4gaW5zZXJ0cyA8c2FtcCBjbGFzcz0iY29kZXBoIj4ke3VyaX08L3NhbXA+LAotYXMgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOjxwcmU+Jmx0OyVAIHRhZ2xpYiB1cmk9IiR7dXJpfSIgcHJlZml4PSIke3ByZWZpeH0iICUmZ3Q7PC9wcmU+Ci0KLSBMYXRlciwgd2hlbiB5b3UgaW5zZXJ0IHRoZSBzbmlwcGV0IGludG8gYSBmaWxlLCA8c2FtcCBjbGFzcz0iY29kZXBoIj4ke3VyaX08L3NhbXA+IGFuZCA8c2FtcCBjbGFzcz0iY29kZXBoIj4ke3ByZWZpeH08L3NhbXA+IGFyZQotZWFjaCBjb252ZXJ0ZWQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgZGVjbGFyZWQgaW4gdGhlIFZhcmlhYmxlcyB0YWJsZS4gVXNlcnMKLWNhbiByZXBsYWNlIHRoZSBkZWZhdWx0IHZhbHVlcyBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SW5zZXJ0IFRlbXBsYXRlOjwvc3Bhbj48dmFyIGNsYXNzPSJ2YXJuYW1lIj5JdGVtX25hbWU8L3Zhcj4gZGlhbG9nCi1hdCBpbnNlcnRpb24gdGltZS48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIG1vZGlmaWVkIGl0ZW0gd2lsbCBiZSBhZGRlZCB0byB0aGUgbGlzdCBvZiBpdGVtcyBpbiB0aGUgYXBwcm9wcmlhdGUKLWRyYXdlci48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDAxLmh0bWwiIHRpdGxlPSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIj5TbmlwcGV0cyB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjYuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4gVGhlIHZpZXcgY2FuIGJlIGV4dGVuZGVkIGJhc2VkIG9uIGFkZGl0aW9uYWwgb2JqZWN0cyB0aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuIj5FZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE2Lmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBkZWxldGUgb3IgaGlkZSBkcmF3ZXJzIGFuZCBpdGVtcyBpbiB0aGUgU25pcHBldHMgdmlldy4iPkRlbGV0aW5nIG9yIGhpZGluZyBzbmlwcGV0IGl0ZW1zIG9yCi1kcmF3ZXJzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyMy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYTQ1ZWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDIzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FbmFibGluZyBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPkhhdmluZyB0aGUgcHJvcGVyIGZpbGVzIGRlZmluZWQgaW4gdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50DQotYXNzaXN0IHRvIHdvcmsgcHJvcGVybHkgaW4gSlNQIGZpbGVzLiBJdCBpcyBhbHNvIGVzc2VudGlhbCBmb3IgdGhlIGxpbmtzIGJ1aWxkZXINCi10byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJlYW5zDQotaW4gSlNQIGFuZCBIVE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkpTUCBmaWxlczxpbmRleHRlcm0+Y29udGVudCBhc3Npc3QgZW5hYmxlbWVudDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+Y29udGVudCBhc3Npc3Q8aW5kZXh0ZXJtPmVuYWJsaW5nIGZvciBKU1AgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRvIGVuYWJsZSBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzOjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5UbyBkZXRlcm1pbmUgd2hldGhlciB0aGUgYnVpbGQgcGF0aCBpcyBjb3JyZWN0LCBzZWxlY3QgPHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+IGZyb20NCi10aGUgcHJvamVjdCdzIHBvcC11cCBtZW51LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5KYXZhIEJ1aWxkIFBhdGg8L3VpY29udHJvbD4sIGFuZCB0aGVuIHRoZSA8dWljb250cm9sPkxpYnJhcmllczwvdWljb250cm9sPiBwYWdlLiA8L2NtZD4NCi08aW5mbz5Zb3Ugc2hvdWxkIHNlZSB0aGUgZm9sbG93aW5nIGZpbGVzOjx1bD4NCi08bGk+ajJlZS5qYXI8L2xpPg0KLTxsaT5ydC5qYXIgPC9saT4NCi08bGk+c2VydmxldC5qYXI8L2xpPg0KLTxsaT53ZWJjb250YWluZXIuamFyPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB0aGV5IGFyZSBub3QgcHJlc2VudCwgYWRkIHRoZW0gYXMgRXh0ZXJuYWwgSkFSIGZpbGVzLiBZb3UgbWF5DQotaGF2ZSB5b3VyIG93biB2ZXJzaW9ucyBvZiB0aGVzZSBmaWxlcywgZGVwZW5kaW5nIG9uIHRoZSBsZXZlbCBvZiBKREsgb3IgU2VydmxldA0KLUFQSSBmb3Igd2hpY2ggeW91IGFyZSBkZXZlbG9waW5nLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdXIgV2ViIGFwcGxpY2F0aW9ucyByZWZlcmVuY2Ugb3RoZXIgSkFScywgeW91IGNhbiBwbGFjZSB0aGVtDQotaW4gdGhlIGJ1aWxkIHBhdGggYXMgZm9sbG93czo8L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5Vc2UgdGhlIDx1aWNvbnRyb2w+QWRkIEpBUnM8L3VpY29udHJvbD4gYnV0dG9uIG9uIHRoZSBMaWJyYXJ5DQotcGFnZS4gWW91IG11c3QgZW5zdXJlIHRoYXQgdGhlIEpBUiBmaWxlIGlzIGF2YWlsYWJsZSB0byB0aGUgc2VydmVyIGJ5IHByb3Blcmx5DQotY29uZmlndXJpbmcgdGhlIHNlcnZlci48L2NtZD48L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5BZGQgdGhlIEpBUnMgdG8gdGhlIDxmaWxlcGF0aD5XRUItSU5GL2xpYjwvZmlsZXBhdGg+IGRpcmVjdG9yeS4NCi1UaGV5IHdpbGwgYmUgYXV0b21hdGljYWxseSBhZGRlZCB0byB0aGUgYnVpbGQgcGF0aCBhbmQgZGVwbG95ZWQgdG8gdGhlIHNlcnZlcg0KLWluIGFzIHBhcnQgb2YgdGhlIHByb2plY3QgV0FSLjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDYuZGl0YSI+PGxpbmt0ZXh0PkNvbnRlbnQgYXNzaXN0PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDUuZGl0YSI+PGxpbmt0ZXh0PkdldHRpbmcgY29udGVudCBhc3Npc3RhbmNlIGluIHN0cnVjdHVyZWQNCi10ZXh0IGVkaXRvcnM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI4LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDIzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUwYTE1NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVuYWJsaW5nIGNvbnRlbnQgYXNzaXN0IGZvciBKU1AgZmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSGF2aW5nIHRoZSBwcm9wZXIgZmlsZXMgZGVmaW5lZCBpbiB0aGUgSmF2YSBidWlsZCBjbGFzcyBwYXRoIGlzIGVzc2VudGlhbCBmb3IgY29udGVudCBhc3Npc3QgdG8gd29yayBwcm9wZXJseSBpbiBKU1AgZmlsZXMuIEl0IGlzIGFsc28gZXNzZW50aWFsIGZvciB0aGUgbGlua3MgYnVpbGRlciB0byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIEphdmEgYmVhbnMgaW4gSlNQIGFuZCBIVE1MIGZpbGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJIYXZpbmcgdGhlIHByb3BlciBmaWxlcyBkZWZpbmVkIGluIHRoZSBKYXZhIGJ1aWxkIGNsYXNzIHBhdGggaXMgZXNzZW50aWFsIGZvciBjb250ZW50IGFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyIHRvIGJlIGFibGUgdG8gY29ycmVjdGx5IHJlc29sdmUgbGlua3MgdG8gc2VydmxldHMgb3IgSmF2YSBiZWFucyBpbiBKU1AgYW5kIEhUTUwgZmlsZXMuIiAvPgotPG1ldGEgY29udGVudD0iSlNQIGZpbGVzLCBjb250ZW50IGFzc2lzdCBlbmFibGVtZW50LCBjb250ZW50IGFzc2lzdCwgZW5hYmxpbmcgZm9yIEpTUCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkpTUCBmaWxlcywgY29udGVudCBhc3Npc3QgZW5hYmxlbWVudCwgY29udGVudCBhc3Npc3QsIGVuYWJsaW5nIGZvciBKU1AgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjc3JjZWR0MDA2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwNS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI4Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDIzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyMyI+PGEgbmFtZT0idHNyY2VkdDAyMyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RW5hYmxpbmcgY29udGVudCBhc3Npc3QgZm9yIEpTUCBmaWxlczwvaDE+Ci0KLQotCi08ZGl2PjxwPkhhdmluZyB0aGUgcHJvcGVyIGZpbGVzIGRlZmluZWQgaW4gdGhlIEphdmHihKIgYnVpbGQgY2xhc3MgcGF0aCBpcyBlc3NlbnRpYWwgZm9yIGNvbnRlbnQKLWFzc2lzdCB0byB3b3JrIHByb3Blcmx5IGluIEpTUCBmaWxlcy4gSXQgaXMgYWxzbyBlc3NlbnRpYWwgZm9yIHRoZSBsaW5rcyBidWlsZGVyCi10byBiZSBhYmxlIHRvIGNvcnJlY3RseSByZXNvbHZlIGxpbmtzIHRvIHNlcnZsZXRzIG9yIEphdmEgYmVhbnMKLWluIEpTUCBhbmQgSFRNTCBmaWxlcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGVuYWJsZSBjb250ZW50IGFzc2lzdCBmb3IgSlNQIGZpbGVzOjwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBidWlsZCBwYXRoIGlzIGNvcnJlY3QsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPiBmcm9tCi10aGUgcHJvamVjdCdzIHBvcC11cCBtZW51LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YSBCdWlsZCBQYXRoPC9zcGFuPiwgYW5kIHRoZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpYnJhcmllczwvc3Bhbj4gcGFnZS4gPC9zcGFuPgotIFlvdSBzaG91bGQgc2VlIHRoZSBmb2xsb3dpbmcgZmlsZXM6PHVsPgotPGxpPmoyZWUuamFyPC9saT4KLQotPGxpPnJ0LmphciA8L2xpPgotCi08bGk+c2VydmxldC5qYXI8L2xpPgotCi08bGk+d2ViY29udGFpbmVyLmphcjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHRoZXkgYXJlIG5vdCBwcmVzZW50LCBhZGQgdGhlbSBhcyBFeHRlcm5hbCBKQVIgZmlsZXMuIFlvdSBtYXkKLWhhdmUgeW91ciBvd24gdmVyc2lvbnMgb2YgdGhlc2UgZmlsZXMsIGRlcGVuZGluZyBvbiB0aGUgbGV2ZWwgb2YgSkRLIG9yIFNlcnZsZXQKLUFQSSBmb3Igd2hpY2ggeW91IGFyZSBkZXZlbG9waW5nLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdXIgV2ViIGFwcGxpY2F0aW9ucyByZWZlcmVuY2Ugb3RoZXIgSkFScywgeW91IGNhbiBwbGFjZSB0aGVtCi1pbiB0aGUgYnVpbGQgcGF0aCBhcyBmb2xsb3dzOjwvc3Bhbj4KLTxvbCB0eXBlPSJhIj4KLTxsaT48c3Bhbj5Vc2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBKQVJzPC9zcGFuPiBidXR0b24gb24gdGhlIExpYnJhcnkKLXBhZ2UuIFlvdSBtdXN0IGVuc3VyZSB0aGF0IHRoZSBKQVIgZmlsZSBpcyBhdmFpbGFibGUgdG8gdGhlIHNlcnZlciBieSBwcm9wZXJseQotY29uZmlndXJpbmcgdGhlIHNlcnZlci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkFkZCB0aGUgSkFScyB0byB0aGUgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5XRUItSU5GL2xpYjwvc3Bhbj4gZGlyZWN0b3J5LgotVGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIGJ1aWxkIHBhdGggYW5kIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIKLWluIGFzIHBhcnQgb2YgdGhlIHByb2plY3QgV0FSLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDYuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB0aGUgc291cmNlIGZpbGUgcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHRoZSBjb250ZW50IGFzc2lzdCB0byBvZmZlciBzdWdnZXN0aW9ucyBmb3IgY29tcGxldGlvbi4iPkNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDUuaHRtbCIgdGl0bGU9IlRvIGdldCBoZWxwIGluIGFkZGluZyBtYXJrdXAgdG8gYSBmaWxlLCB5b3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIENvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBpbnNlcnQgb3IgZmluaXNoIGEgdGFnIG9yIGZ1bmN0aW9uIG9yIGZpbmlzaCBhIGxpbmUgb2YgY29kZSBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5HZXR0aW5nIGNvbnRlbnQgYXNzaXN0YW5jZSBpbiBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvcnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NzVlOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0c3JjZWR0MDI0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkDQotY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzDQotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5yZW1vdmluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5IVE1MPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5IVE1MPGluZGV4dGVybT50ZW1wbGF0ZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBIVE1MIHBhZ2VzIHRoYXQgc2hvdWxkDQotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucw0KLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQ0KLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQNCi1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQuKSBUaGVuIHNlbGVjdA0KLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UNCi13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIEhUTUwgb3IgWEhUTUwgZmlsZS48L3A+PHA+VG8gYWRkDQotYSBuZXcgSFRNTCB0ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPiBtZW51LCBzZWxlY3QgPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYiBhbmQNCi1YTUw8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgVGVtcGxhdGVzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24NCi1vZiB0aGUgdGVtcGxhdGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VXNpbmcgdGhlIDx1aWNvbnRyb2w+Q29udGV4dDwvdWljb250cm9sPiBkcm9wLWRvd24gbGlzdCwgc3BlY2lmeQ0KLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50DQotYXNzaXN0IGlzIHJlcXVlc3RlZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUNCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlDQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8dWljb250cm9sPlZhcmlhYmxlPC91aWNvbnRyb2w+IGJ1dHRvbg0KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvY21kPjxzdGVweG1wPkZvciBleGFtcGxlLCB0aGUgPHZhcm5hbWU+d29yZF9zZWxlY3Rpb248L3Zhcm5hbWU+IHZhcmlhYmxlDQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sDQotYW5kIHRoZSA8dmFybmFtZT5jdXJzb3I8L3Zhcm5hbWU+IHZhcmlhYmxlIGRldGVybWluZXMgd2hlcmUgdGhlIGN1cnNvciB3aWxsDQotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBIVE1MIGRvY3VtZW50Ljwvc3RlcHhtcD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUNCi1zYW1lIFByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlDQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQ0KLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD48cD5JZiB5b3UgaGF2ZSBhIHRlbXBsYXRlDQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhcg0KLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sNCi1pdHMgY2hlY2sgYm94LjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjcuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlDQotdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI4LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI5LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjYyNzM3MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkhUTUwsIHRlbXBsYXRlcywgcmVtb3ZpbmcsIGFkZGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkhUTUwsIHRlbXBsYXRlcywgcmVtb3ZpbmcsIGFkZGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI4Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjkuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3JjZWR0MDI0Ij48YSBuYW1lPSJ0c3JjZWR0MDI0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9oMT4KLQotCi0KLTxkaXY+PHA+SFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQKLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcwotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIEhUTUwgcGFnZXMgdGhhdCBzaG91bGQKLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMKLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQotdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlIHRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dAotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKSBUaGVuIHNlbGVjdAotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBIVE1MIG9yIFhIVE1MIGZpbGUuPC9wPgotPHA+VG8gYWRkCi1hIG5ldyBIVE1MIHRlbXBsYXRlLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SFRNTCBUZW1wbGF0ZXM8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24KLW9mIHRoZSB0ZW1wbGF0ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Vc2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkKLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50Ci1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlhYmxlPC9zcGFuPiBidXR0b24KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj53b3JkX3NlbGVjdGlvbjwvdmFyPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sCi1hbmQgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPmN1cnNvcjwvdmFyPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbAotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBIVE1MIGRvY3VtZW50LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUKLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLTxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyOC5odG1sIiB0aXRsZT0iSlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjkuaHRtbCIgdGl0bGU9IlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZCBjb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzkwNTQyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPlNldHRpbmcgc3RydWN0dXJlZCB0ZXh0IGVkaXRvciBwcmVmZXJlbmNlczwvbmF2dGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8aW5kZXh0ZXJtPnByZWZlcmVuY2Ugc2V0dGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+WW91IGNhbiBjdXN0b21pemUgeW91ciB3b3JraW5nIGVudmlyb25tZW50IGJ5IHNwZWNpZnlpbmcgcHJlZmVyZW5jZXMNCi1mb3IgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBtYWluIG1lbnUsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3Qgb25lIG9mIHRoZSBjaG9pY2VzIHRoYXQgYXJlIHNob3duIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6PC9jbWQ+DQotPGNob2ljZXRhYmxlIHJlbGNvbHdpZHRoPSIxMCogMzAqIj4NCi08Y2hoZWFkPjxjaG9wdGlvbmhkPkl0ZW08L2Nob3B0aW9uaGQ+PGNoZGVzY2hkPk1lbnUgcGF0aDwvY2hkZXNjaGQ+PC9jaGhlYWQ+DQotPGNocm93PjxjaG9wdGlvbj5Bbm5vdGF0aW9uIHNldHRpbmdzPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+QW5ub3RhdGlvbnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5DaGFyYWN0ZXIgZW5jb2Rpbmc8L2Nob3B0aW9uPjxjaGRlc2M+PHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPiwNCi10aGVuIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNob2ljZXM6IDx1aWNvbnRyb2w+Q1NTIEZpbGVzPC91aWNvbnRyb2w+LCA8dWljb250cm9sPkhUTUwNCi1GaWxlczwvdWljb250cm9sPiwgPHVpY29udHJvbD5KU1AgRmlsZXM8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+KlhNTCBGaWxlcw0KLSggKm5vdCBpbXBsZW1lbnRlZCBpbiBXVFApPC91aWNvbnRyb2w+PC9jaGRlc2M+PC9jaHJvdz4NCi08Y2hyb3c+PGNob3B0aW9uPkNvbnRlbnQgYXNzaXN0OiBIVE1MPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYg0KLWFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPkhUTUwgU291cmNlPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+Q29udGVudCBhc3Npc3Q6IEphdmFTY3JpcHQ8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+V2ViIGFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPkphdmFTY3JpcHQgRmlsZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPkphdmFTY3JpcHQgU291cmNlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+Q29udGVudCBhc3Npc3Q6IFhNTDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWINCi1hbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD4qWE1MIEZpbGVzICgqbm90IGltcGxlbWVudGVkIGluIFdUUCk8L3VpY29udHJvbD4NCi08dWljb250cm9sPlhNTCBTb3VyY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5FZGl0b3IgYXBwZWFyYW5jZTwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3VpY29udHJvbD4NCi08dWljb250cm9sPkFwcGVhcmFuY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5FZGl0b3IgZm9udDwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkNvbG9ycyBhbmQgRm9udHM8L3VpY29udHJvbD48dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5FZGl0b3IgbmF2aWdhdGlvbjwvY2hvcHRpb24+PGNoZGVzYz48bWVudWNhc2NhZGU+PHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4NCi08dWljb250cm9sPkVkaXRvcnM8L3VpY29udHJvbD48dWljb250cm9sPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3VpY29udHJvbD4NCi08dWljb250cm9sPk5hdmlnYXRpb248L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY2hkZXNjPjwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5GaWxlLXR5cGUtc3BlY2lmaWMgc2V0dGluZ3M8L2Nob3B0aW9uPjxjaGRlc2M+PHVpY29udHJvbD5XZWINCi1hbmQgWE1MPC91aWNvbnRyb2w+LCB0aGVuIG5hdmlnYXRlIHRvIHRoZSBmaWxlIHR5cGUgYW5kIHBhcnRpY3VsYXIgc2V0dGluZzwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5Ib3ZlciBoZWxwPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+RWRpdG9yczwvdWljb250cm9sPjx1aWNvbnRyb2w+U3RydWN0dXJlZCBUZXh0IEVkaXRvcjwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+SG92ZXJzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L2NoZGVzYz48L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+S2V5IGJpbmRpbmdzPC9jaG9wdGlvbj48Y2hkZXNjPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+S2V5czwvdWljb250cm9sPjx1aWNvbnRyb2w+S2V5Ym9hcmQgU2hvcnRjdXRzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gdGhlbg0KLWluIHRoZSA8dWljb250cm9sPkNhdGVnb3J5PC91aWNvbnRyb2w+IGZpZWxkIHNwZWNpZnkgPHVpY29udHJvbD5Tb3VyY2U8L3VpY29udHJvbD48L2NoZGVzYz4NCi08L2Nocm93Pg0KLTxjaHJvdz48Y2hvcHRpb24+U3BlbGwgY2hlY2tpbmc8L2Nob3B0aW9uPjxjaGRlc2M+PHVpY29udHJvbD5TcGVsbCBDaGVjazwvdWljb250cm9sPjwvY2hkZXNjPg0KLTwvY2hyb3c+DQotPGNocm93PjxjaG9wdGlvbj5TeW50YXggY2hlY2tpbmc8L2Nob3B0aW9uPjxjaGRlc2M+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V29ya2JlbmNoPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5FZGl0b3JzPC91aWNvbnRyb2w+PHVpY29udHJvbD5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5BcHBlYXJhbmNlPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gdGhlbiBjaGVjayBvciB1bmNoZWNrIHRoZSA8dWljb250cm9sPkFuYWx5emUNCi1hbm5vdGF0aW9ucyB3aGlsZSB0eXBpbmc8L3VpY29udHJvbD4gYm94LjwvY2hkZXNjPjwvY2hyb3c+DQotPC9jaG9pY2V0YWJsZT4NCi08aW5mbz48bm90ZT5Zb3UgY2Fubm90IHNldCA8dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+IHByZWZlcmVuY2VzDQotdW5sZXNzIHRoZSBDb3JlIFhNTCBTdXBwb3J0IGNhcGFiaWxpdHkgKDxtZW51Y2FzY2FkZT48dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+Q2FwYWJpbGl0aWVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4pIGlzIGVuYWJsZWQsIGFuZCB5b3UgY2Fubm90DQotc2V0IHByZWZlcmVuY2VzIGZvciBEVEQgZmlsZXMgdW5sZXNzIHRoZSBYTUwgRGV2ZWxvcG1lbnQgY2FwYWJpbGl0eSBpcyBlbmFibGVkLjwvbm90ZT48L2luZm8+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGlua3Bvb2wgdHlwZT0iY29uY2VwdCI+DQotPGxpbmsgaHJlZj0iY3NyY2VkdDAwNC5kaXRhIj48bGlua3RleHQ+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cA0KLWxhbmd1YWdlczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPGxpbmtwb29sIHR5cGU9InRhc2siPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNldHRpbmcgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBmb3INCi1tYXJrdXAgbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxMC5kaXRhIj48bGlua3RleHQ+Q2hlY2tpbmcgc3BlbGxpbmc8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI1Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE5NGYxZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLCBwcmVmZXJlbmNlIHNldHRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycywgcHJlZmVyZW5jZSBzZXR0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDAxLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTAuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjUiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIHByZWZlcmVuY2VzIGZvciBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNSI+PGEgbmFtZT0idHNyY2VkdDAyNSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnM8L2gxPgotCi0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gY3VzdG9taXplIHlvdXIgd29ya2luZyBlbnZpcm9ubWVudCBieSBzcGVjaWZ5aW5nIHByZWZlcmVuY2VzCi1mb3IgdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIG1haW4gbWVudSwgY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBvbmUgb2YgdGhlIGNob2ljZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGZvbGxvd2luZyB0YWJsZTo8L3NwYW4+Ci0KLTx0YWJsZSBjbGFzcz0iY2hvaWNldGFibGVib3JkZXIiIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBydWxlcz0icm93cyIgZnJhbWU9ImhzaWRlcyIgYm9yZGVyPSIxIj4KLTx0aGVhZD48dHI+PHRoIHZhbGlnbj0iYm90dG9tIiBpZD0iTjEwMDZFLW9wdGlvbiI+SXRlbTwvdGg+Ci08dGggdmFsaWduPSJib3R0b20iIGlkPSJOMTAwNkUtZGVzYyI+TWVudSBwYXRoPC90aD48L3RyPjwvdGhlYWQ+Ci08dGJvZHk+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1vcHRpb24iIGlkPSJOMTAwODgiPjxzdHJvbmc+QW5ub3RhdGlvbiBzZXR0aW5nczwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1kZXNjIE4xMDA4OCI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFubm90YXRpb25zPC9zcGFuPjwvc3Bhbj48L3RkPgotCi08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkUtb3B0aW9uIiBpZD0iTjEwMEFCIj48c3Ryb25nPkNoYXJhY3RlciBlbmNvZGluZzwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1kZXNjIE4xMDBBQiI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+LAotdGhlbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBjaG9pY2VzOiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DU1MgRmlsZXM8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MCi1GaWxlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCBGaWxlczwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPipYTUwgRmlsZXMKLSggKm5vdCBpbXBsZW1lbnRlZCBpbiBXVFApPC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkUtb3B0aW9uIiBpZD0iTjEwMEQ2Ij48c3Ryb25nPkNvbnRlbnQgYXNzaXN0OiBIVE1MPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLWRlc2MgTjEwMEQ2Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgU291cmNlPC9zcGFuPgotPC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkUtb3B0aW9uIiBpZD0iTjEwMEY4Ij48c3Ryb25nPkNvbnRlbnQgYXNzaXN0OiBKYXZhU2NyaXB0PC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLWRlc2MgTjEwMEY4Ij48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPgotPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SmF2YVNjcmlwdCBGaWxlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmFTY3JpcHQgU291cmNlPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLW9wdGlvbiIgaWQ9Ik4xMDExQiI+PHN0cm9uZz5Db250ZW50IGFzc2lzdDogWE1MPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLWRlc2MgTjEwMTFCIj48c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYgotYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4qWE1MIEZpbGVzICgqbm90IGltcGxlbWVudGVkIGluIFdUUCk8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgU291cmNlPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLW9wdGlvbiIgaWQ9Ik4xMDEzRCI+PHN0cm9uZz5FZGl0b3IgYXBwZWFyYW5jZTwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1kZXNjIE4xMDEzRCI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBlYXJhbmNlPC9zcGFuPjwvc3Bhbj48L3RkPgotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLW9wdGlvbiIgaWQ9Ik4xMDE2NSI+PHN0cm9uZz5FZGl0b3IgZm9udDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1kZXNjIE4xMDE2NSI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db2xvcnMgYW5kIEZvbnRzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+Ci08L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1vcHRpb24iIGlkPSJOMTAxODgiPjxzdHJvbmc+RWRpdG9yIG5hdmlnYXRpb248L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkUtZGVzYyBOMTAxODgiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmF2aWdhdGlvbjwvc3Bhbj48L3NwYW4+PC90ZD4KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1vcHRpb24iIGlkPSJOMTAxQjAiPjxzdHJvbmc+RmlsZS10eXBlLXNwZWNpZmljIHNldHRpbmdzPC9zdHJvbmc+PC90ZD4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLWRlc2MgTjEwMUIwIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIKLWFuZCBYTUw8L3NwYW4+LCB0aGVuIG5hdmlnYXRlIHRvIHRoZSBmaWxlIHR5cGUgYW5kIHBhcnRpY3VsYXIgc2V0dGluZzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj48dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1vcHRpb24iIGlkPSJOMTAxQzUiPjxzdHJvbmc+SG92ZXIgaGVscDwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1kZXNjIE4xMDFDNSI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0b3JzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cnVjdHVyZWQgVGV4dCBFZGl0b3I8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ib3ZlcnM8L3NwYW4+PC9zcGFuPjwvdGQ+Ci08L3RyPgotCi08dHI+PHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkUtb3B0aW9uIiBpZD0iTjEwMUVEIj48c3Ryb25nPktleSBiaW5kaW5nczwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1kZXNjIE4xMDFFRCI+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2g8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXlzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleWJvYXJkIFNob3J0Y3V0czwvc3Bhbj48L3NwYW4+IHRoZW4KLWluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DYXRlZ29yeTwvc3Bhbj4gZmllbGQgc3BlY2lmeSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Tb3VyY2U8L3NwYW4+PC90ZD4KLQotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLW9wdGlvbiIgaWQ9Ik4xMDIxQyI+PHN0cm9uZz5TcGVsbCBjaGVja2luZzwvc3Ryb25nPjwvdGQ+Ci08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDA2RS1kZXNjIE4xMDIxQyI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlbGwgQ2hlY2s8L3NwYW4+PC90ZD4KLQotPC90cj4KLQotPHRyPjx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMDZFLW9wdGlvbiIgaWQ9Ik4xMDIzMCI+PHN0cm9uZz5TeW50YXggY2hlY2tpbmc8L3N0cm9uZz48L3RkPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwNkUtZGVzYyBOMTAyMzAiPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdG9yczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TdHJ1Y3R1cmVkIFRleHQgRWRpdG9yPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwZWFyYW5jZTwvc3Bhbj48L3NwYW4+IHRoZW4gY2hlY2sgb3IgdW5jaGVjayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QW5hbHl6ZQotYW5ub3RhdGlvbnMgd2hpbGUgdHlwaW5nPC9zcGFuPiBib3guPC90ZD4KLTwvdHI+Ci0KLTwvdGJvZHk+PC90YWJsZT4KLQotIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2Fubm90IHNldCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gcHJlZmVyZW5jZXMKLXVubGVzcyB0aGUgQ29yZSBYTUwgU3VwcG9ydCBjYXBhYmlsaXR5ICg8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNhcGFiaWxpdGllczwvc3Bhbj48L3NwYW4+KSBpcyBlbmFibGVkLCBhbmQgeW91IGNhbm5vdAotc2V0IHByZWZlcmVuY2VzIGZvciBEVEQgZmlsZXMgdW5sZXNzIHRoZSBYTUwgRGV2ZWxvcG1lbnQgY2FwYWJpbGl0eSBpcyBlbmFibGVkLjwvZGl2PgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDQuaHRtbCIgdGl0bGU9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaXMgYW55IG9mIHNldmVyYWwgdGV4dCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCB2YXJpb3VzIG1hcmt1cCBsYW5ndWFnZXMgc3VjaCBhcyBIVE1MLCBKYXZhU2NyaXB0LCBvciBYTUwuIj5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwCi1sYW5ndWFnZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMS5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gc2V0IGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yIFdlYiBhbmQgWE1MIGZpbGVzLiBUaGUgYW5ub3RhdGlvbiBwcmVmZXJlbmNlcyBpbmNsdWRlIHdoZXRoZXIgdG8gYW5hbHl6ZSB0aGUgc3ludGFjdGljIHZhbGlkaXR5IG9mIHlvdXIgZmlsZSB3aGlsZSB5b3UgYXJlIHR5cGluZyBhbmQgd2hhdCBjb2xvcnMgdG8gdXNlIHRvIGhpZ2hsaWdodCBlcnJvcnMsIHdhcm5pbmdzLCB0YXNrcywgc2VhcmNoIHJlc3VsdHMsIGJvb2ttYXJrcywgYW5kIG90aGVyIHRleHQuIj5TZXR0aW5nIGFubm90YXRpb24gcHJlZmVyZW5jZXMgZm9yCi1tYXJrdXAgbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDEwLmh0bWwiIHRpdGxlPSJUaGlzIGRvY3VtZW50YXRpb24gZGVzY3JpYmVzIGhvdyB0byBjaGVjayBzcGVsbGluZyBpbiBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIj5DaGVja2luZyBzcGVsbGluZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjYuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjBlNDJlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcNCi1vYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sIGFuZCBKU1AgY29kZSwgYWxvbmcgd2l0aA0KLWZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMNCi10aGF0IHlvdSBkZWZpbmUgYW5kIGluY2x1ZGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c25pcHBldHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5IVE1MPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5yZXVzZSB3aXRoIHNuaXBwZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5KYXZhU2NyaXB0PGluZGV4dGVybT5yZXVzZSB3aXRoIHNuaXBwZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5KU1AgY29kZTxpbmRleHRlcm0+cmV1c2Ugd2l0aCBzbmlwcGV0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+SlNQIHRhZ3M8aW5kZXh0ZXJtPmN1c3RvbTxpbmRleHRlcm0+cmV1c2Ugd2l0aCBzbmlwcGV0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+cmV1c2Ugd2l0aCBzbmlwcGV0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLQ0KLQ0KLQ0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+SW4gdGhlIFNuaXBwZXRzIHZpZXcgeW91IGNhbiBwZXJmb3JtIHRoZSBmb2xsb3dpbmcgdGFza3M6PC9jb250ZXh0Pg0KLTxzdGVwcy11bm9yZGVyZWQ+DQotPHN0ZXA+PGNtZD5BZGQgc25pcHBldHMgZHJhd2VyczwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkFkZCBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RWRpdCBzbmlwcGV0IGl0ZW1zPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RGVsZXRlIG9yIGhpZGUgc25pcHBldCBpdGVtcyBvciBkcmF3ZXJzPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHMtdW5vcmRlcmVkPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDEuZGl0YSI+PGxpbmt0ZXh0PlNuaXBwZXRzIHZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDE0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgc25pcHBldHMgZHJhd2VyczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMTUuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyMi5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBzbmlwcGV0IGl0ZW1zPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAxNi5kaXRhIj48bGlua3RleHQ+RGVsZXRpbmcgb3IgaGlkaW5nIHNuaXBwZXQgaXRlbXMgb3INCi1kcmF3ZXJzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZTAzZWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI2Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIHdpdGggc25pcHBldHMgLSBvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgU25pcHBldHMgdmlldyBsZXRzIHlvdSBjYXRhbG9nIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwgdGFnZ2luZywgSmF2YVNjcmlwdCwgYW5kIEpTUCBjb2RlLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMgdGhhdCB5b3UgZGVmaW5lIGFuZCBpbmNsdWRlLiIgLz4KLTxtZXRhIGNvbnRlbnQ9InNuaXBwZXRzLCBvdmVydmlldywgSFRNTCwgZWRpdGluZywgcmV1c2Ugd2l0aCBzbmlwcGV0cywgSmF2YVNjcmlwdCwgSlNQIGNvZGUsIEpTUCB0YWdzLCBjdXN0b20iIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzbmlwcGV0cywgb3ZlcnZpZXcsIEhUTUwsIGVkaXRpbmcsIHJldXNlIHdpdGggc25pcHBldHMsIEphdmFTY3JpcHQsIEpTUCBjb2RlLCBKU1AgdGFncywgY3VzdG9tIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iY3NyY2VkdDAwMS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMTUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyMi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDE2Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMDAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0c3JjZWR0MDI2IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyB3aXRoIHNuaXBwZXRzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjYiPjxhIG5hbWU9InRzcmNlZHQwMjYiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgd2l0aCBzbmlwcGV0cyAtIG92ZXJ2aWV3PC9oMT4KLQotCi0KLTxkaXY+PHA+VGhlIFNuaXBwZXRzIHZpZXcgbGV0cyB5b3UgY2F0YWxvZyBhbmQgb3JnYW5pemUgcmV1c2FibGUgcHJvZ3JhbW1pbmcKLW9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB04oSiLCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGgKLWZpbGVzIGFuZCBjdXN0b20gSlNQIHRhZ3MuIFRoZSB2aWV3IGNhbiBiZSBleHRlbmRlZCBiYXNlZCBvbiBhZGRpdGlvbmFsIG9iamVjdHMKLXRoYXQgeW91IGRlZmluZSBhbmQgaW5jbHVkZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPkluIHRoZSBTbmlwcGV0cyB2aWV3IHlvdSBjYW4gcGVyZm9ybSB0aGUgZm9sbG93aW5nIHRhc2tzOjwvZGl2PgotCi08dWw+Ci08bGk+PHNwYW4+QWRkIHNuaXBwZXRzIGRyYXdlcnM8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkFkZCBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5FZGl0IHNuaXBwZXQgaXRlbXM8L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkRlbGV0ZSBvciBoaWRlIHNuaXBwZXQgaXRlbXMgb3IgZHJhd2Vyczwvc3Bhbj48L2xpPgotCi08L3VsPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9ImNzcmNlZHQwMDEuaHRtbCIgdGl0bGU9IlRoZSBTbmlwcGV0cyB2aWV3IGxldHMgeW91IGNhdGFsb2cgYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCB0YWdnaW5nLCBKYXZhU2NyaXB0LCBhbmQgSlNQIGNvZGUsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSBKU1AgdGFncy4iPlNuaXBwZXRzIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNC5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGV4cGxhaW5zIGhvdyB0byBjdXN0b21pemUgdGhlIFNuaXBwZXRzIHZpZXcgYnkgYWRkaW5nIGEgbmV3IGRyYXdlci4iPkFkZGluZyBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDE1Lmh0bWwiIHRpdGxlPSIiPkFkZGluZyBpdGVtcyB0byBzbmlwcGV0cyBkcmF3ZXJzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDIyLmh0bWwiIHRpdGxlPSIiPkVkaXRpbmcgc25pcHBldCBpdGVtczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAxNi5odG1sIiB0aXRsZT0iVGhpcyBkb2N1bWVudGF0aW9uIGRlc2NyaWJlcyBob3cgdG8gZGVsZXRlIG9yIGhpZGUgZHJhd2VycyBhbmQgaXRlbXMgaW4gdGhlIFNuaXBwZXRzIHZpZXcuIj5EZWxldGluZyBvciBoaWRpbmcgc25pcHBldCBpdGVtcyBvcgotZHJhd2VyczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyN2M5NWY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAiLi5cZHRkXHRhc2suZHRkIj4NCi08dGFzayBpZD0idHNyY2VkdDAyNyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPG5hdnRpdGxlPkFkZGluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzPC9uYXZ0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwNCi10aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsDQotY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5tYXJrdXAgbGFuZ3VhZ2VzPGluZGV4dGVybT5hZGRpbmcgYW5kIHJlbW92aW5nIHRlbXBsYXRlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VGVtcGxhdGVzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBmb2xsb3dpbmcgbWFya3VwIGxhbmd1YWdlczo8dWw+DQotPGxpPkhUTUwgb3IgWEhUTUw8L2xpPg0KLTxsaT5KU1A8L2xpPg0KLTwvdWw+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI0LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyOS5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAwMC5kaXRhIj48bGlua3RleHQ+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMNCi0tIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyNy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDM0YzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI3Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQ29udGVudCBhc3Npc3QgcHJvdmlkZXMgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgY29udGVudD0ibWFya3VwIGxhbmd1YWdlcywgYWRkaW5nIGFuZCByZW1vdmluZyB0ZW1wbGF0ZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJtYXJrdXAgbGFuZ3VhZ2VzLCBhZGRpbmcgYW5kIHJlbW92aW5nIHRlbXBsYXRlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI4Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjkuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZSB0ZW1wbGF0ZXMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHNyY2VkdDAyNyI+PGEgbmFtZT0idHNyY2VkdDAyNyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UgdGVtcGxhdGVzIC0gb3ZlcnZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwKLXRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwKLWN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UZW1wbGF0ZXMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIGZvbGxvd2luZyBtYXJrdXAgbGFuZ3VhZ2VzOjx1bD4KLTxsaT5IVE1MIG9yIFhIVE1MPC9saT4KLQotPGxpPkpTUDwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjQuaHRtbCIgdGl0bGU9IkhUTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjguaHRtbCIgdGl0bGU9IkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBKU1AgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI5Lmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMDAuaHRtbCIgdGl0bGU9IllvdSBjYW4gZWRpdCB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgd2l0aCBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IuIFRoaXMgaXMgYSBnZW5lcmljIHRlcm0gZm9yIHNldmVyYWwgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgYW55IG9mIHNldmVyYWwgbWFya3VwIGxhbmd1YWdlcywgc3VjaCBhcyBIVE1MLiI+RWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMKLS0gb3ZlcnZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI4LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUzMzI1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gIi4uXGR0ZFx0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRzcmNlZHQwMjgiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5KU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkDQotY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzDQotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SlNQIHRlbXBsYXRlczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5yZW1vdmluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5KU1A8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5Gb3IgZXhhbXBsZSwgeW91IG1heSB3b3JrIG9uIGEgZ3JvdXAgb2YgSlNQIHBhZ2VzIHRoYXQgc2hvdWxkDQotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucw0KLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQ0KLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQNCi1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQuKSBUaGVuIHNlbGVjdA0KLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UNCi13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGEgSlNQIGZpbGUuPC9wPjxwPlRvIGFkZCBhIG5ldyBKU1AgdGVtcGxhdGUsDQotY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPiBtZW51LCBzZWxlY3QgPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgcGFnZSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYiBhbmQNCi1YTUw8L3VpY29udHJvbD48dWljb250cm9sPkpTUCBGaWxlczwvdWljb250cm9sPjx1aWNvbnRyb2w+SlNQIFRlbXBsYXRlczwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5FbnRlciB0aGUgbmV3IHRlbXBsYXRlIG5hbWUgKGEgdGV4dCBzdHJpbmcpIGFuZCBhIGJyaWVmIGRlc2NyaXB0aW9uDQotb2YgdGhlIHRlbXBsYXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlVzaW5nIHRoZSA8dWljb250cm9sPkNvbnRleHQ8L3VpY29udHJvbD4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkNCi10aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbCBsaXN0IHdoZW4gY29udGVudA0KLWFzc2lzdCBpcyByZXF1ZXN0ZWQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+UGF0dGVybjwvdWljb250cm9sPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlDQotdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyAodGhlIGNvbnRlbnQgb2YgdGhlIHRlbXBsYXRlKSB0byBiZQ0KLWluc2VydGVkIGJ5IGNvbnRlbnQgYXNzaXN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHVpY29udHJvbD5WYXJpYWJsZTwvdWljb250cm9sPiBidXR0b24NCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC48L2NtZD48c3RlcHhtcD5Gb3IgZXhhbXBsZSwgdGhlIDx2YXJuYW1lPndvcmRfc2VsZWN0aW9uPC92YXJuYW1lPiB2YXJpYWJsZQ0KLWluZGljYXRlcyB0aGUgd29yZCB0aGF0IGlzIHNlbGVjdGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGVtcGxhdGUgaW5zZXJ0aW9uLA0KLWFuZCB0aGUgPHZhcm5hbWU+Y3Vyc29yPC92YXJuYW1lPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbA0KLWJlIGFmdGVyIHRoZSB0ZW1wbGF0ZSBpcyBpbnNlcnRlZCBpbiB0aGUgSFRNTCBkb2N1bWVudC48L3N0ZXB4bXA+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHRoZSBuZXcgdGVtcGxhdGUuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlDQotc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQ0KLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUNCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC48L3A+PHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQ0KLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXINCi1pbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIFRlbXBsYXRlcyBwcmVmZXJlbmNlcyBwYWdlIGFuZCB1bmNoZWNrDQotaXRzIGNoZWNrIGJveC48L3A+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPg0KLTxsaW5rIGhyZWY9ImNzcmNlZHQwMDQuZGl0YSI+PGxpbmt0ZXh0PlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXANCi1sYW5ndWFnZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTxsaW5rcG9vbCB0eXBlPSJ0YXNrIj4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI3LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIG1hcmt1cCBsYW5ndWFnZQ0KLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNC5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjkuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMDAuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzDQotLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2NmMmQ0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSlNQIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgY29udGVudD0iSlNQIHRlbXBsYXRlcywgYWRkaW5nLCByZW1vdmluZywgdGVtcGxhdGVzLCBKU1AiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJKU1AgdGVtcGxhdGVzLCBhZGRpbmcsIHJlbW92aW5nLCB0ZW1wbGF0ZXMsIEpTUCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjkuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjgiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjgiPjxhIG5hbWU9InRzcmNlZHQwMjgiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvaDE+Ci0KLQotCi08ZGl2PjxwPkpTUCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQKLWNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcwotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+Rm9yIGV4YW1wbGUsIHlvdSBtYXkgd29yayBvbiBhIGdyb3VwIG9mIEpTUCBwYWdlcyB0aGF0IHNob3VsZAotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucwotdGhlIHRhZ3MgZm9yIHRoYXQgdGFibGUsIGluY2x1ZGluZyB0aGUgYXBwcm9wcmlhdGUgYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlCi12YWx1ZXMgZm9yIGVhY2ggdGFnLiAoWW91IGNhbiBjb3B5IGFuZCBwYXN0ZSB0aGUgdGFncyBmcm9tIGEgc3RydWN0dXJlZCB0ZXh0Ci1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZC4pIFRoZW4gc2VsZWN0Ci10aGUgbmFtZSBvZiB0aGUgdGVtcGxhdGUgZnJvbSBhIGNvbnRlbnQgYXNzaXN0IHByb3Bvc2FsIGxpc3Qgd2hlbmV2ZXIgeW91Ci13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGEgSlNQIGZpbGUuPC9wPgotPHA+VG8gYWRkIGEgbmV3IEpTUCB0ZW1wbGF0ZSwKLWNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVmZXJlbmNlcyBwYWdlLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kCi1YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SlNQIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUCBUZW1wbGF0ZXM8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24KLW9mIHRoZSB0ZW1wbGF0ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Vc2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkKLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50Ci1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlhYmxlPC9zcGFuPiBidXR0b24KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj53b3JkX3NlbGVjdGlvbjwvdmFyPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sCi1hbmQgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPmN1cnNvcjwvdmFyPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbAotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBIVE1MIGRvY3VtZW50LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIHNhdmUgdGhlIG5ldyB0ZW1wbGF0ZS48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGVkaXQsIHJlbW92ZSwgaW1wb3J0LCBvciBleHBvcnQgYSB0ZW1wbGF0ZSBieSB1c2luZyB0aGUKLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUKLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUKLW5vdCBleGl0ZWQgZnJvbSB0aGUgd29ya2JlbmNoIHNpbmNlIGl0IHdhcyByZW1vdmVkLjwvcD4KLTxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUKLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IHRoZSB0ZW1wbGF0ZSB0byBhcHBlYXIKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgVGVtcGxhdGVzIHByZWZlcmVuY2VzIHBhZ2UgYW5kIHVuY2hlY2sKLWl0cyBjaGVjayBib3guPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iY3NyY2VkdDAwNC5odG1sIiB0aXRsZT0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvciBpcyBhbnkgb2Ygc2V2ZXJhbCB0ZXh0IGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IHZhcmlvdXMgbWFya3VwIGxhbmd1YWdlcyBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHQsIG9yIFhNTC4iPlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAKLWxhbmd1YWdlczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI3Lmh0bWwiIHRpdGxlPSJDb250ZW50IGFzc2lzdCBwcm92aWRlcyB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgbWFya3VwIGxhbmd1YWdlCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyNC5odG1sIiB0aXRsZT0iSFRNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBzZXZlcmFsIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBIVE1MIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAyOS5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDAwLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGVkaXQgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIHdpdGggYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yLiBUaGlzIGlzIGEgZ2VuZXJpYyB0ZXJtIGZvciBzZXZlcmFsIGVkaXRvcnMgdGhhdCB5b3UgY2FuIHVzZSB0byBlZGl0IGFueSBvZiBzZXZlcmFsIG1hcmt1cCBsYW5ndWFnZXMsIHN1Y2ggYXMgSFRNTC4iPkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzCi0tIG92ZXJ2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAyOS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTE3NDkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICIuLlxkdGRcdGFzay5kdGQiPg0KLTwhLS0gJElkOiB0c3JjZWR0MDI5LmRpdGEsdiAxLjQgMjAwNi8wNC8xMyAyMDozNzoxMyBia29ybiBFeHAgJCAtLT4NCi08dGFzayBpZD0idHNyY2VkdDAyNyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGFuZCByZW1vdmluZyBYTUwgdGVtcGxhdGVzPC90aXRsZT4NCi08c2hvcnRkZXNjPlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZA0KLWNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMNCi1wcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+eG1sIHRlbXBsYXRlczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5yZW1vdmluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+dGVtcGxhdGVzPGluZGV4dGVybT5YTUw8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi0NCi0NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5Gb3IgZXhhbXBsZSwgeW91IG1heSB3b3JrIG9uIGEgZ3JvdXAgb2YgWE1MIHBhZ2VzIHRoYXQgc2hvdWxkDQotYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGEgdGVtcGxhdGUgdGhhdCBjb250YWlucw0KLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQ0KLXZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZSB0YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQNCi1lZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQuKSBUaGVuIHNlbGVjdA0KLXRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlciB5b3UNCi13YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIFhNTCBmaWxlLjwvcD48cD5UbyBhZGQgYSBuZXcgWE1MDQotdGVtcGxhdGUsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6IDwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkZyb20gdGhlIDx1aWNvbnRyb2w+V2luZG93PC91aWNvbnRyb2w+IG1lbnUsIHNlbGVjdCA8dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcmVmZXJlbmNlcyBwYWdlLCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2ViIGFuZA0KLVhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgVGVtcGxhdGVzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24NCi1vZiB0aGUgdGVtcGxhdGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VXNpbmcgdGhlIDx1aWNvbnRyb2w+Q29udGV4dDwvdWljb250cm9sPiBkcm9wLWRvd24gbGlzdCwgc3BlY2lmeQ0KLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50DQotYXNzaXN0IGlzIHJlcXVlc3RlZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5QYXR0ZXJuPC91aWNvbnRyb2w+IGZpZWxkLCBlbnRlciB0aGUgYXBwcm9wcmlhdGUNCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlDQotaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW5zZXJ0IGEgdmFyaWFibGUsIGNsaWNrIHRoZSA8dWljb250cm9sPlZhcmlhYmxlPC91aWNvbnRyb2w+IGJ1dHRvbg0KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvY21kPjxzdGVweG1wPkZvciBleGFtcGxlLCB0aGUgPHZhcm5hbWU+d29yZF9zZWxlY3Rpb248L3Zhcm5hbWU+IHZhcmlhYmxlDQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sDQotYW5kIHRoZSA8dmFybmFtZT5jdXJzb3I8L3Zhcm5hbWU+IHZhcmlhYmxlIGRldGVybWluZXMgd2hlcmUgdGhlIGN1cnNvciB3aWxsDQotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBYTUwgZG9jdW1lbnQuPC9zdGVweG1wPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8gc2F2ZSB0aGUgbmV3IHRlbXBsYXRlLjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZQ0KLXNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUNCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlDQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPjxwPklmIHlvdSBoYXZlIGEgdGVtcGxhdGUNCi10aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCB0aGUgdGVtcGxhdGUgdG8gYXBwZWFyDQotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGdvIHRvIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMgcGFnZSBhbmQgdW5jaGVjaw0KLWl0cyBjaGVjayBib3guPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rcG9vbCB0eXBlPSJjb25jZXB0Ij4NCi08bGluayBocmVmPSJjc3JjZWR0MDA0LmRpdGEiPjxsaW5rdGV4dD5TdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwDQotbGFuZ3VhZ2VzPC9saW5rdGV4dD48L2xpbms+DQotPC9saW5rcG9vbD4NCi08bGlua3Bvb2wgdHlwZT0idGFzayI+DQotPGxpbmsgaHJlZj0idHNyY2VkdDAyNy5kaXRhIj48bGlua3RleHQ+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UNCi10ZW1wbGF0ZXMgLSBvdmVydmlldzwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRzcmNlZHQwMjQuZGl0YSI+PGxpbmt0ZXh0PkFkZGluZyBhbmQgcmVtb3ZpbmcgSFRNTCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDI4LmRpdGEiPjxsaW5rdGV4dD5BZGRpbmcgYW5kIHJlbW92aW5nIEpTUCB0ZW1wbGF0ZXM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0c3JjZWR0MDAwLmRpdGEiPjxsaW5rdGV4dD5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcw0KLS0gb3ZlcnZpZXc8L2xpbmt0ZXh0PjwvbGluaz4NCi08L2xpbmtwb29sPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDI5Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdkMjY2OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjkuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGUgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIiAvPgotPG1ldGEgY29udGVudD0ieG1sIHRlbXBsYXRlcywgYWRkaW5nLCByZW1vdmluZywgdGVtcGxhdGVzLCBYTUwiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJ4bWwgdGVtcGxhdGVzLCBhZGRpbmcsIHJlbW92aW5nLCB0ZW1wbGF0ZXMsIFhNTCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9ImNzcmNlZHQwMDQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAyNy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0c3JjZWR0MDI0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRzcmNlZHQwMjguaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idHNyY2VkdDAwMC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzcmNlZHQwMjciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYW5kIHJlbW92aW5nIFhNTCB0ZW1wbGF0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRzcmNlZHQwMjciPjxhIG5hbWU9InRzcmNlZHQwMjciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBhbmQgcmVtb3ZpbmcgWE1MIHRlbXBsYXRlczwvaDE+Ci0KLQotCi08ZGl2PjxwPlhNTCBjb250ZW50IGFzc2lzdCBwcm92aWRlcyBhIGNvbW1lbnQgdGVtcGxhdGUsIGEgY2h1bmsgb2YgcHJlZGVmaW5lZAotY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZSBhcwotcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGF0IHRlbXBsYXRlLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkZvciBleGFtcGxlLCB5b3UgbWF5IHdvcmsgb24gYSBncm91cCBvZiBYTUwgcGFnZXMgdGhhdCBzaG91bGQKLWFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhIHRlbXBsYXRlIHRoYXQgY29udGFpbnMKLXRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlIGF0dHJpYnV0ZXMgYW5kIGF0dHJpYnV0ZQotdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlIHRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dAotZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKSBUaGVuIHNlbGVjdAotdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyIHlvdQotd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48L3A+Ci08cD5UbyBhZGQgYSBuZXcgWE1MCi10ZW1wbGF0ZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcmVmZXJlbmNlcyBwYWdlLCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kCi1YTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBUZW1wbGF0ZXM8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkVudGVyIHRoZSBuZXcgdGVtcGxhdGUgbmFtZSAoYSB0ZXh0IHN0cmluZykgYW5kIGEgYnJpZWYgZGVzY3JpcHRpb24KLW9mIHRoZSB0ZW1wbGF0ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Vc2luZyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGV4dDwvc3Bhbj4gZHJvcC1kb3duIGxpc3QsIHNwZWNpZnkKLXRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSB0ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIHByb3Bvc2FsIGxpc3Qgd2hlbiBjb250ZW50Ci1hc3Npc3QgaXMgcmVxdWVzdGVkLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuPC9zcGFuPiBmaWVsZCwgZW50ZXIgdGhlIGFwcHJvcHJpYXRlCi10YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzICh0aGUgY29udGVudCBvZiB0aGUgdGVtcGxhdGUpIHRvIGJlCi1pbnNlcnRlZCBieSBjb250ZW50IGFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlhYmxlPC9zcGFuPiBidXR0b24KLWFuZCBzZWxlY3QgdGhlIHZhcmlhYmxlIHRvIGJlIGluc2VydGVkLjwvc3Bhbj4gRm9yIGV4YW1wbGUsIHRoZSA8dmFyIGNsYXNzPSJ2YXJuYW1lIj53b3JkX3NlbGVjdGlvbjwvdmFyPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSB3b3JkIHRoYXQgaXMgc2VsZWN0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0ZW1wbGF0ZSBpbnNlcnRpb24sCi1hbmQgdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPmN1cnNvcjwvdmFyPiB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoZXJlIHRoZSBjdXJzb3Igd2lsbAotYmUgYWZ0ZXIgdGhlIHRlbXBsYXRlIGlzIGluc2VydGVkIGluIHRoZSBYTUwgZG9jdW1lbnQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8gc2F2ZSB0aGUgbmV3IHRlbXBsYXRlLjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gZWRpdCwgcmVtb3ZlLCBpbXBvcnQsIG9yIGV4cG9ydCBhIHRlbXBsYXRlIGJ5IHVzaW5nIHRoZQotc2FtZSBQcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQotaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZQotbm90IGV4aXRlZCBmcm9tIHRoZSB3b3JrYmVuY2ggc2luY2UgaXQgd2FzIHJlbW92ZWQuPC9wPgotPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgdGhlIHRlbXBsYXRlIHRvIGFwcGVhcgotaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGdvIHRvIHRoZSBUZW1wbGF0ZXMgcHJlZmVyZW5jZXMgcGFnZSBhbmQgdW5jaGVjawotaXRzIGNoZWNrIGJveC48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSJjc3JjZWR0MDA0Lmh0bWwiIHRpdGxlPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGlzIGFueSBvZiBzZXZlcmFsIHRleHQgZWRpdG9ycyB0aGF0IHlvdSBjYW4gdXNlIHRvIGVkaXQgdmFyaW91cyBtYXJrdXAgbGFuZ3VhZ2VzIHN1Y2ggYXMgSFRNTCwgSmF2YVNjcmlwdCwgb3IgWE1MLiI+U3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cAotbGFuZ3VhZ2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRzcmNlZHQwMjcuaHRtbCIgdGl0bGU9IkNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHRlbXBsYXRlcywgb3IgY2h1bmtzIG9mIHByZWRlZmluZWQgY29kZSwgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IGNhbiB1c2UgdGhlIGRlZmF1bHQgdGVtcGxhdGVzIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhlIGRlZmF1bHQgdGVtcGxhdGVzLCBvciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLiI+QWRkaW5nIGFuZCByZW1vdmluZyBtYXJrdXAgbGFuZ3VhZ2UKLXRlbXBsYXRlcyAtIG92ZXJ2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI0Lmh0bWwiIHRpdGxlPSJIVE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIHNldmVyYWwgdGVtcGxhdGVzLCBvciBjaHVua3Mgb2YgcHJlZGVmaW5lZCBjb2RlLCB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgY2FuIHVzZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMgYXMgcHJvdmlkZWQsIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0ZW1wbGF0ZXMsIG9yIGNyZWF0ZSB5b3VyIG93biB0ZW1wbGF0ZXMuIj5BZGRpbmcgYW5kIHJlbW92aW5nIEhUTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0c3JjZWR0MDI4Lmh0bWwiIHRpdGxlPSJKU1AgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgc2V2ZXJhbCB0ZW1wbGF0ZXMsIG9yIGNodW5rcyBvZiBwcmVkZWZpbmVkIGNvZGUsIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSBkZWZhdWx0IHRlbXBsYXRlcyBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoZSBkZWZhdWx0IHRlbXBsYXRlcywgb3IgY3JlYXRlIHlvdXIgb3duIHRlbXBsYXRlcy4iPkFkZGluZyBhbmQgcmVtb3ZpbmcgSlNQIHRlbXBsYXRlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHNyY2VkdDAwMC5odG1sIiB0aXRsZT0iWW91IGNhbiBlZGl0IHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyB3aXRoIGEgc3RydWN0dXJlZCB0ZXh0IGVkaXRvci4gVGhpcyBpcyBhIGdlbmVyaWMgdGVybSBmb3Igc2V2ZXJhbCBlZGl0b3JzIHRoYXQgeW91IGNhbiB1c2UgdG8gZWRpdCBhbnkgb2Ygc2V2ZXJhbCBtYXJrdXAgbGFuZ3VhZ2VzLCBzdWNoIGFzIEhUTUwuIj5FZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcwotLSBvdmVydmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8ucHJvamVjdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDljYzg0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLk1hbmlmZXN0QnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuU2NoZW1hQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLlBsdWdpbk5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmE1YzkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQ4YjVjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjM3OjIxIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5jbGVhbk91dHB1dEZvbGRlcj1jbGVhbgotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5kdXBsaWNhdGVSZXNvdXJjZVRhc2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5pbnZhbGlkQ2xhc3NwYXRoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuYnVpbGRlci5yZXNvdXJjZUNvcHlFeGNsdXNpb25GaWx0ZXI9Ki5sYXVuY2gKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNpcmN1bGFyQ2xhc3NwYXRoPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGguZXhjbHVzaW9uUGF0dGVybnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLm11bHRpcGxlT3V0cHV0TG9jYXRpb25zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udGFyZ2V0UGxhdGZvcm09MS4yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnVudXNlZExvY2FsPXByZXNlcnZlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb21wbGlhbmNlPTEuNAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubGluZU51bWJlcj1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcubG9jYWxWYXJpYWJsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZGVidWcuc291cmNlRmlsZT1nZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuZG9jLmNvbW1lbnQuc3VwcG9ydD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5tYXhQcm9ibGVtUGVyVW5pdD0xMDAKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYW5ub3RhdGlvblN1cGVySW50ZXJmYWNlPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXNzZXJ0SWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmF1dG9ib3hpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25JbkRlcHJlY2F0ZWRDb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uV2hlbk92ZXJyaWRpbmdEZXByZWNhdGVkTWV0aG9kPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGlzY291cmFnZWRSZWZlcmVuY2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVtcHR5U3RhdGVtZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maWVsZEhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxQYXJhbWV0ZXJCb3VuZD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmluYWxseUJsb2NrTm90Q29tcGxldGluZ05vcm1hbGx5PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZvcmJpZGRlblJlZmVyZW5jZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5oaWRkZW5DYXRjaEJsb2NrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wYXRpYmxlTm9uSW5oZXJpdGVkSW50ZXJmYWNlTWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5jb21wbGV0ZUVudW1Td2l0Y2g9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluZGlyZWN0U3RhdGljQWNjZXNzPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NEZXByZWNhdGVkUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzTm90VmlzaWJsZVJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5sb2NhbFZhcmlhYmxlSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5tZXRob2RXaXRoQ29uc3RydWN0b3JOYW1lPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdEZXByZWNhdGVkQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50cz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzVmlzaWJpbGl0eT1wdWJsaWMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdPdmVycmlkZUFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdTZXJpYWxWZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9FZmZlY3RBc3NpZ25tZW50PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vSW1wbGljaXRTdHJpbmdDb252ZXJzaW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9uRXh0ZXJuYWxpemVkU3RyaW5nTGl0ZXJhbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ub3ZlcnJpZGluZ1BhY2thZ2VEZWZhdWx0TWV0aG9kPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ucG9zc2libGVBY2NpZGVudGFsQm9vbGVhbkFzc2lnbm1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zcGVjaWFsUGFyYW1ldGVySGlkaW5nRmllbGQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdGF0aWNBY2Nlc3NSZWNlaXZlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zdXBwcmVzc1dhcm5pbmdzPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3ludGhldGljQWNjZXNzRW11bGF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udHlwZVBhcmFtZXRlckhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5jaGVja2VkVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuZG9jdW1lbnRlZEVtcHR5QmxvY2s9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuaGFuZGxlZFdhcm5pbmdUb2tlbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5RWxzZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlUeXBlQ2hlY2s9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5xdWFsaWZpZWRGaWVsZEFjY2Vzcz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5zYWZlVHlwZU9wZXJhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbldoZW5PdmVycmlkaW5nPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZEltcG9ydD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMYWJlbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRMb2NhbD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXI9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5JbXBsZW1lbnRpbmdBYnN0cmFjdD1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuT3ZlcnJpZGluZ0NvbmNyZXRlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFByaXZhdGVNZW1iZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udmFyYXJnc0FyZ3VtZW50TmVlZENhc3Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuc291cmNlPTEuMwotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wYXRpYmxlSkRLTGV2ZWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBsZXRlQ2xhc3NwYXRoPWVycm9yCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYyYWM2NS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozOSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWludGVybmFsLmRlZmF1bHQuY29tcGxpYW5jZT1kZWZhdWx0CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1OTM2OGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLmVuYWJsZS5wcm9qZWN0LnJlZmFjdG9yaW5nLmhpc3Rvcnk9ZmFsc2UKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzI0OTU4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi0jU3VuIEFwciAxNiAxNDowNToyOSBFRFQgMjAwNgotY29tcGlsZXJzLnAuYnVpbGQ9MAotY29tcGlsZXJzLnAuZGVwcmVjYXRlZD0xCi1jb21waWxlcnMucC5pbGxlZ2FsLWF0dC12YWx1ZT0wCi1jb21waWxlcnMucC5uby1yZXF1aXJlZC1hdHQ9MAotY29tcGlsZXJzLnAubm90LWV4dGVybmFsaXplZC1hdHQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnAudW5rbm93bi1jbGFzcz0wCi1jb21waWxlcnMucC51bmtub3duLWVsZW1lbnQ9MAotY29tcGlsZXJzLnAudW5rbm93bi1yZXNvdXJjZT0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWV4LXBvaW50cz0wCi1jb21waWxlcnMucC51bnJlc29sdmVkLWltcG9ydD0wCi1jb21waWxlcnMucC51bnVzZWQtZWxlbWVudC1vci1hdHRyaWJ1dGU9MAotY29tcGlsZXJzLnVzZS1wcm9qZWN0PXRydWUKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2ODA2N2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvRWRpdG9yQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMSwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLQotPGNvbnRleHQgaWQ9InN0ZWQwMDAxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRoZSBhcHBlYXJhbmNlIG9mIHRoZSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycy4KLVdoZW4gdGhlIDxiPkhpZ2hsaWdodCBtYXRjaGluZyBicmFja2V0czwvYj4gb3B0aW9uIGlzIHNlbGVjdGVkLCB3aGVuZXZlciB0aGUgY3Vyc29yIGlzIG5leHQgdG8gYSBicmFja2V0IG9yIGN1cmx5IGJyYWNlcywgaXRzIG9wZW5pbmcgb3IgY2xvc2luZyBjb3VudGVyIHBhcnQgaXMgaGlnaGxpZ2h0ZWQuCi1TZWxlY3QgdGhlIDxiPlJlcG9ydCBwcm9ibGVtcyBhcyB5b3UgdHlwZTwvYj4gY2hlY2sgYm94IHRvIHVwZGF0ZSB2YWxpZGl0eSBhbm5vdGF0aW9ucyAodGVtcG9yYXJ5IGFubm90YXRpb25zLCBzdWNoIGFzIG1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyBiYXNlZCBvbiBhIERURCwgdGhhdCBnbyBhd2F5IHdoZW4gdGhlIGVkaXRvciBpcyBjbG9zZWQsIG9yIHRoZSBwcm9ibGVtIGlzIGZpeGVkKSBhcyB0aGUgdXNlciB0eXBlcy4KLUluIHRoZSA8Yj5BcHBlYXJhbmNlIGNvbG9yIG9wdGlvbnM8L2I+IHRhYmxlLCB5b3UgY2FuIGFkanVzdCB2YXJpb3VzIGVkaXRvciBhcHBlYXJhbmNlIGZlYXR1cmVzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InN0ZWQwMDAzIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIGhvdmVyIHRleHQgaW4gdGhlIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBwcmVmZXJlbmNlcyBmb3Igc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMjUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXNwZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDEwIj4KLTxkZXNjcmlwdGlvbj5Db250ZW50IGFzc2lzdCBoZWxwcyB5b3UgdG8gZmluaXNoIHRhZ3Mgb3IgbGluZXMgb2YgY29kZSBhbmQgaW5zZXJ0IHRlbXBsYXRlcy4gRGVwZW5kaW5nIG9uIHRoZSBzb3VyY2UgbWFya3VwIGxhbmd1YWdlLCB0aGUgY2hvaWNlcyB0aGF0IGFyZSBhdmFpbGFibGUgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgYXJlIGJhc2VkIG9uIHRhZ3MgZGVmaW5lZCBieSBEVEQgYW5kIHNjaGVtYSBmaWxlcywgdGFnIGxpYnJhcnkgZGVzY3JpcHRvcnMsIG9yIGNvbnRlbnQgbW9kZWwgc3RhbmRhcmQgdGhhdCBpcyBzcGVjaWZpZWQgZm9yIHRoZSBmaWxlIGJlaW5nIGVkaXRlZC4gSFRNTCBjb250ZW50IGFzc2lzdCBjaG9pY2VzIGFyZSBiYXNlZCBvbiB0aGUgVzNDIEhUTUwgNC4wMSBjb250ZW50IG1vZGVsLgotCi1JZiB5b3VyIGN1cnNvciBpcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZiBhdmFpbGFibGUgY2hvaWNlcyBpcyBkaXNwbGF5ZWQuIFRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGRpc3BsYXlzIGFsbCBhdmFpbGFibGUgY29tcGxldGlvbnMgZm9yIHRoZSBjdXJyZW50IGN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gQ29udGVudCBhc3Npc3QgaXMgYWxzbyBhdmFpbGFibGUgYnkgcHJlc3NpbmcgQ3RybCtTcGFjZS4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IkNvbnRlbnQgYXNzaXN0IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2V0dGluZyBjb250ZW50IGFzc2lzdGFuY2UgaW4gc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDMwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gZm9ybWF0IGFuIGVudGlyZSBkb2N1bWVudC4gRm9ybWF0dGluZyByZXN0b3JlcyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgaW5kZW50YXRpb24gYW5kIHBvc2l0aW9uaW5nLCB3aGljaCBtYXkgaGF2ZSBiZWVuIG9mZnNldCBkdXJpbmcgZWRpdGluZywgdG8gc2VlIG5lc3RpbmcgaGllcmFyY2hpZXMgYW5kIHJlbGF0aW9uc2hpcHMgbW9yZSBjbGVhcmx5IGluIHRoZSBmaWxlLiBFZGl0IHRoZSBhcHByb3ByaWF0ZSBQcmVmZXJlbmNlcyBwYWdlcyB0byBtYWtlIGNoYW5nZXMgaW4gc3BlY2lmaWMgZm9ybWF0dGluZyBiZWhhdmlvci4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ4bWxtMTA0MCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoaXMgb3B0aW9uIHRvIGZvcm1hdCBzZWxlY3RlZCBlbGVtZW50cy4gRm9ybWF0dGluZyByZXN0b3JlcyBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgaW5kZW50YXRpb24gYW5kIHBvc2l0aW9uaW5nLCB3aGljaCBtYXkgaGF2ZSBiZWVuIG9mZnNldCBkdXJpbmcgZWRpdGluZywgdG8gc2VlIG5lc3RpbmcgaGllcmFyY2hpZXMgYW5kIHJlbGF0aW9uc2hpcHMgbW9yZSBjbGVhcmx5IGluIHRoZSBmaWxlLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0xMDcwIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhpcyBvcHRpb24gdG8gb3BlbiB0aGUgPGI+UHJvcGVydGllczwvYj4gdmlldywgd2hpY2ggZGlzcGxheXMgcHJvcGVydGllcyByZWxldmFudCB0byB0aGUgY3VycmVudCBlbGVtZW50IGlmIGFueSBleGlzdC4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlByb3BlcnRpZXMgdmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2UucGxhdGZvcm0uZG9jLnVzZXIvY29uY2VwdHMvY3Byb3B2aWV3Lmh0bSIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9InhtbG0yMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIHRleHQgZmlsZSB0aGF0IGlzIGNvZGVkIGluIGEgbWFya3VwIGxhbmd1YWdlLiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLiBGb3IgYSBtb3JlIHNwZWNpZmljIGxpc3Qgb2YgZWRpdGluZyBmZWF0dXJlcywgc2VlIHRoZSBmaXJzdCBsaW5rIGJlbG93LgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLQotPGNvbnRleHQgaWQ9IndlYngwMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3VzdG9taXplIHRhc2sgdGFnIGRpc2NvdmVyeSBpbiB0aGUgc3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMuCi08L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0iZWNzczAwMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBDU1Mgc291cmNlIHBhZ2UgZWRpdG9yIGxldHMgeW91IGVkaXQgYSBjYXNjYWRpbmcgc3R5bGUgc2hlZXQuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJTdHJ1Y3R1cmVkIHRleHQgZWRpdG9ycyBmb3IgbWFya3VwIGxhbmd1YWdlcyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvY3NyY2VkdDAwNC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgdGV4dCBjb2RlZCBpbiBtYXJrdXAgbGFuZ3VhZ2VzIC0gb3ZlcnZpZXciIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL3RzcmNlZHQwMDAuaHRtbCIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9Im1pc2MwMTgwIj4KLSA8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGVkaXQgdGhlIENTUyBjb250ZW50IHNldHRpbmdzIGZvciBhIENTUyBmaWxlLiBZb3UgY2FuIHNwZWNpZnkgQ1NTIHByb2ZpbGUgb3IgcmVzdG9yZSB0aGUgZGVmYXVsdCBieSBjbGlja2luZyA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPi4KLSA8L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNzc0NvbnRleHRzMi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9FZGl0b3JDc3NDb250ZXh0czIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGJjMzlkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL0VkaXRvckNzc0NvbnRleHRzMi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzc3NvdXJjZV9zb3VyY2VfSGVscElkIj4KLTxkZXNjcmlwdGlvbj5UaGUgQ1NTIHNvdXJjZSBwYWdlIGVkaXRvciBsZXRzIHlvdSBlZGl0IGEgY2FzY2FkaW5nIHN0eWxlIHNoZWV0LiBUaGUgZWRpdG9yIHByb3ZpZGVzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LCBzeW50YXggaGlnaGxpZ2h0aW5nLCB1bmxpbWl0ZWQgdW5kbyBhbmQgcmVkbywgZWxlbWVudCBzZWxlY3Rpb24gYW5kIGZvcm1hdHRpbmcsIGFuZCBkb2N1bWVudCBmb3JtYXR0aW5nLgotPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iU3RydWN0dXJlZCB0ZXh0IGVkaXRvcnMgZm9yIG1hcmt1cCBsYW5ndWFnZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIHRleHQgY29kZWQgaW4gbWFya3VwIGxhbmd1YWdlcyAtIG92ZXJ2aWV3IiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy90c3JjZWR0MDAwLmh0bWwiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJlY3NzMDAwMCI+Ci08ZGVzY3JpcHRpb24+VGhlIENTUyBzb3VyY2UgcGFnZSBlZGl0b3IgbGV0cyB5b3UgZWRpdCBhIGNhc2NhZGluZyBzdHlsZSBzaGVldC4gVGhlIGVkaXRvciBwcm92aWRlcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhcyBjb250ZW50IGFzc2lzdCwgc3ludGF4IGhpZ2hsaWdodGluZywgdW5saW1pdGVkIHVuZG8gYW5kIHJlZG8sIGVsZW1lbnQgc2VsZWN0aW9uIGFuZCBmb3JtYXR0aW5nLCBhbmQgZG9jdW1lbnQgZm9ybWF0dGluZy4KLTwvZGVzY3JpcHRpb24+Ci08dG9waWMgbGFiZWw9IlN0cnVjdHVyZWQgdGV4dCBlZGl0b3JzIGZvciBtYXJrdXAgbGFuZ3VhZ2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyB0ZXh0IGNvZGVkIGluIG1hcmt1cCBsYW5ndWFnZXMgLSBvdmVydmlldyIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlci90b3BpY3MvdHNyY2VkdDAwMC5odG1sIi8+Ci08L2NvbnRleHQ+Ci0gPGNvbnRleHQgaWQ9Im1pc2MwMTgwIj4KLSA8ZGVzY3JpcHRpb24+VXNlIHRoaXMgZGlhbG9nIHRvIGVkaXQgdGhlIENTUyBjb250ZW50IHNldHRpbmdzIGZvciBhIENTUyBmaWxlLiBZb3UgY2FuIHNwZWNpZnkgQ1NTIHByb2ZpbGUgb3IgcmVzdG9yZSB0aGUgZGVmYXVsdCBieSBjbGlja2luZyA8Yj5SZXN0b3JlIERlZmF1bHRzPC9iPi4KLSA8L2Rlc2NyaXB0aW9uPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YTRmNWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVCdW5kbGUtTmFtZS4wCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3A7IHNpbmdsZXRvbjo9dHJ1ZQotQnVuZGxlLVZlcnNpb246IDEuMC4xMDEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlQnVuZGxlLVZlbmRvci4wCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZDQ3MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBFZGl0b3JDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLyxcCi0gICAgICAgICAgICAgICBFZGl0b3JDc3NDb250ZXh0czIueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGYzMDZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIHByb3BlcnRpZXMgZmlsZSBmb3Igb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wCi1CdW5kbGUtVmVuZG9yLjAgPSBFY2xpcHNlLm9yZwotQnVuZGxlLU5hbWUuMCA9IFNTRSBpbmZvcG9wcwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC5zc2UudWkuaW5mb3BvcC9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTM3OTZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnNzZS51aS5pbmZvcG9wL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAxLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IkVkaXRvckNzc0NvbnRleHRzMi54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC5zc2UudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTQ0ODdjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYzRhNmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3A8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmEwMzc3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiBTdGF0aWMgV2ViIGluZm9wb3AKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMS5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVwbHVnaW5Qcm92aWRlcgotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUF1dG9TdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvU3RhdGljV2ViV2l6Q29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvU3RhdGljV2ViV2l6Q29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjBmNDAzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL1N0YXRpY1dlYldpekNvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0id2VidzIwMDAiPgotPGRlc2NyaXB0aW9uPiBVc2UgdGhpcyBwYWdlIHRvIG5hbWUgeW91ciBXZWIgcHJvamVjdCBhbmQgc3BlY2lmeSB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gKHRoZSBwbGFjZSB3aGVyZSB0aGUgcmVzb3VyY2VzIHlvdSBjcmVhdGUgYXJlIHN0b3JlZC4pIFdoZW4gdGhlIFVzZSBkZWZhdWx0IGNoZWNrIGJveCBpcyBzZWxlY3RlZCwgdGhlIHByb2plY3Qgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiB3aGVyZSB5b3VyIHdvcmtzcGFjZSByZXNpZGVzLiBUbyBjaGFuZ2UgdGhlIGRlZmF1bHQgZmlsZSBzeXN0ZW0gbG9jYXRpb24sIGNsZWFyIHRoZSBjaGVja2JveCBhbmQgbG9jYXRlIHRoZSBwYXRoIHVzaW5nIHRoZSA8Yj5Ccm93c2U8L2I+IGJ1dHRvbi4gVG8gY29uZmlndXJlIGFkZGl0aW9uYWwgb3B0aW9ucywgc2VsZWN0IHRoZSA8Yj5OZXh0PC9iPiBidXR0b24uCi1JbiB0aGUgVGFyZ2V0IFJ1bnRpbWUgZmllbGQsIHNlbGVjdCB0aGUgc2VydmVyIHdoZXJlIHlvdSB3YW50IHRvIHB1Ymxpc2ggdGhlIFdlYiBwcm9qZWN0LiBpZiBhIHNlcnZlciBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCBjbGljayA8Yj5OZXc8L2I+IHRvIHNlbGVjdCBhIHNlcnZlciBydW50aW1lIGVudmlyb25tZW50LiA8L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLTxjb250ZXh0IGlkPSJ3ZWJ3MjEwMCI+Ci08ZGVzY3JpcHRpb24+UHJlc2V0cyBhcmUgdXNlZCB0byBkZWZpbmUgYSBkZWZhdWx0IHNldCBvZiBmYWNldCB2ZXJzaW9ucyB0aGF0IHdpbGwgY29uZmlndXJlIGEgcHJvamVjdCBmb3IgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgZGV2ZWxvcG1lbnQuIFRoZSBTdGF0aWMgV2ViIE1vZHVsZSBmYWNldCBlbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGEgc3RhdGljCi1XZWIgbW9kdWxlLiBDbGljayBTaG93IFJ1bnRpbWVzIHRvIHZpZXcgdGhlIGF2YWlsYWJsZSBydW50aW1lcyBhbmQgcnVudGltZSBjb21wb3NpdGlvbnMuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuaHRtbCIvPgotPC9jb250ZXh0PgotCi08Y29udGV4dCBpZD0id2VidzIyMDAiPgotPGRlc2NyaXB0aW9uPlRoZSBXZWIgY29udGVudCBmb2xkZXIgaXMgd2hlcmUgdGhlIGVsZW1lbnRzIG9mIHlvdXIgV2ViIHNpdGUgc3VjaCBhcyBXZWIgcGFnZXMsIGdyYXBoaWNzIGFuZCBzdHlsZSBzaGVldHMgYXJlIHN0b3JlZC4gVGhpcyBkaXJlY3Rvcnkgc3RydWN0dXJlIGlzIG5lY2Vzc2FyeSB0byBlbnN1cmUgdGhhdCB0aGUgY29udGVudCBvZiB5b3VyIFdlYiBzaXRlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIGF0IGRlcGxveW1lbnQgYW5kIHRoYXQgbGluayB2YWxpZGF0aW9uIHdpbGwgd29yayBjb3JyZWN0bHkuCi08L2Rlc2NyaXB0aW9uPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIi8+Ci08L2NvbnRleHQ+Ci0KLQotPC9jb250ZXh0cz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlhOTNkOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBTdGF0aWNXZWJXaXpDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYxZDJkZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICAgID0gU3RhdGljIFdlYiBpbmZvcG9wCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYi51aS5pbmZvcG9wL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYWMwMTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2ViLnVpLmluZm9wb3AvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotCi08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj4KLSAgICAgIDxjb250ZXh0cyBmaWxlPSJTdGF0aWNXZWJXaXpDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkiLz4KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWRjYTk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyXzEuMC4wLmphcgotdGVtcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvLnByb2plY3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNWIxNTcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGM5MzdlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL01FVEEtSU5GL01BTklGRVNULk1GCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1NYW5pZmVzdC1WZXJzaW9uOiAxLjAKLUJ1bmRsZS1NYW5pZmVzdFZlcnNpb246IDIKLUJ1bmRsZS1OYW1lOiAlcGx1Z2luTmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAzLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXByb3ZpZGVyTmFtZQotQnVuZGxlLUxvY2FsaXphdGlvbjogcGx1Z2luCi1FY2xpcHNlLUxhenlTdGFydDogdHJ1ZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxIVE1MPgotCi08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci0KLTxCT0RZIGxhbmc9IkVOLVVTIj4KLQotPEgzPkFib3V0IFRoaXMgQ29udGVudDwvSDM+Ci0KLTxQPk1heSAyLCAyMDA2PC9QPgotCi08SDM+TGljZW5zZTwvSDM+Ci0KLTxQPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAKLSgiQ29udGVudCIpLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IAotdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIAotKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHAiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotCi08UD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSAKLUNvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgiUmVkaXN0cmlidXRvciIpIGFuZCBkaWZmZXJlbnQgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkgYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAKLUNoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yknMgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiBJZiBubyBzdWNoIAotbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgCi10ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudCAKLWFuZCBzdWNoIHNvdXJjZSBjb2RlIG1heSBiZSBvYnRhaW5lZCBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy8iPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvPC9BPi48L1A+Ci0KLTwvQk9EWT4KLTwvSFRNTD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWI4ZDYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IHBsdWdpbi54bWwsXAotICAgICAgICAgICAgICAgd2VidG9vbHNfdG9jLnhtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHRvcGljcy8sXAotICAgICAgICAgICAgICAgTUVUQS1JTkYvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzCi1zcmMuaW5jbHVkZXMgPSBidWlsZC5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvZml4aXQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2ZpeGl0LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhZmMzZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvZml4aXQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2dycHR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL2dycHR5cGUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmQyNDVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ncnB0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9tZW51YnV0dG9uLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9tZW51YnV0dG9uLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmMWE2Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbWVudWJ1dHRvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbmxpbnV4LmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzEzNWNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ubGludXguZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL25zaG93ZXJyLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9uc2hvd2Vyci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYmZkZDYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL25zaG93ZXJyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2FybmluZy5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndhcm5pbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjRmZGY5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2FybmluZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndpbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndpbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5NWY5Y2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253aW4uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rYnJrLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Jyay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjE0MzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rYnJrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Nzcy5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtjc3MuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTBjYWY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2Nzcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtnci1sLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLWwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzczYjZhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rZ3IuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rZ3IuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2M2MjYxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2dyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2luZC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtpbmQuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDNmNzU2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua2luZC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmttYWwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbWFsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg5YzQ3Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmttYWwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbnVtLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua251bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzMjRhNjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua290ci5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtvdHIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTk2NTkxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua290ci5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtxdWUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rcXVlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1ZjkzOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvbndsbmtxdWUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rdHNrLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9ud2xua3Rzay5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZDQ3ZWUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL253bG5rdHNrLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL2ltYWdlcy9za2lwaXQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3NraXBpdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ZjViMWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3NraXBpdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvdmlld2xpbmsuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvaW1hZ2VzL3ZpZXdsaW5rLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA3YjA1MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9pbWFnZXMvdmlld2xpbmsuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvbXlwbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZGFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PiAKLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0gICA8cGx1Z2luPiAKLSAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICAgICAJPHRvYyBmaWxlPSJ3ZWJ0b29sc190b2MueG1sIiAvPiAKLSAgICAgICAgIAkgICA8L2V4dGVuc2lvbj4gIAotICAgICAgICAgCSAgIAotICAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci5tYXBsaXN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZDUyZGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyLm1hcGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxtYXBsaXN0IHZlcnNpb249IjMuNi4yIj4NCi0gIDxuYXY+DQotICAgIDxtYXAgZmlsZT0id2VidG9vbHNfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0icmVsYXRlZGxpbmtzLmRpdGFtYXAiLz4NCi0gIDwvbGluaz4NCi08L21hcGxpc3Q+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlcmluZGV4Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjOGM5NzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTGljZW5zZWQgTWF0ZXJpYWxzIFByb3BlcnR5IG9mIElCTSAtLT4KLTwhLS0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtLT4KLTwhLS0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgLS0+Ci08IS0tIEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9jb20uaWJtLmhlbHAuZG9jL2Nzcy9pYm1kaXRhLmNzcyIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Ii4uLy4uL2NvbS5pYm0uaGVscC5kb2MvY3NzL3N3Z19pbmZvX2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+SW5kZXg8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+SW5kZXg8L2gxPgotPGEgbmFtZT0iSURYMF80MyIgaHJlZj0iI0lEWDFfNDMiPkM8L2E+Ci08YSBuYW1lPSJJRFgwXzQ0IiBocmVmPSIjSURYMV80NCI+RDwvYT4KLTxhIG5hbWU9IklEWDBfNDUiIGhyZWY9IiNJRFgxXzQ1Ij5FPC9hPgotPGEgbmFtZT0iSURYMF80NiIgaHJlZj0iI0lEWDFfNDYiPkY8L2E+Ci08YSBuYW1lPSJJRFgwXzQ4IiBocmVmPSIjSURYMV80OCI+SDwvYT4KLTxhIG5hbWU9IklEWDBfNDkiIGhyZWY9IiNJRFgxXzQ5Ij5JPC9hPgotPGEgbmFtZT0iSURYMF80QSIgaHJlZj0iI0lEWDFfNEEiPko8L2E+Ci08YSBuYW1lPSJJRFgwXzUwIiBocmVmPSIjSURYMV81MCI+UDwvYT4KLTxhIG5hbWU9IklEWDBfNTMiIGhyZWY9IiNJRFgxXzUzIj5TPC9hPgotPGEgbmFtZT0iSURYMF81NiIgaHJlZj0iI0lEWDFfNTYiPlY8L2E+Ci08YSBuYW1lPSJJRFgwXzU3IiBocmVmPSIjSURYMV81NyI+VzwvYT4KLTxhIG5hbWU9IklEWDBfNTgiIGhyZWY9IiNJRFgxXzU4Ij5YPC9hPgotPGhyPjwvaHI+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDMiIGhyZWY9IiNJRFgwXzQzIj5DPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPkNWUwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCN0d2N2c3IiPnNldHRpbmcgcmVwb3NpdG9yeSBkZWZhdWx0czwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5jdnNpZ25vcmUgZmlsZQotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCN0d2N2c3IiPmNyZWF0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80NCIgaHJlZj0iI0lEWDBfNDQiPkQ8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+ZGV2ZWxvcG1lbnQgcGhhc2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2Njd3RvdmVyLmh0bWwjY2N3dG92ZXIiPldlYiBhcHBsaWNhdGlvbnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+RE9DVFlQRSBkZWNsYXJhdGlvbgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90anByZWZzLmh0bWwjdGpwcmVmcyI+YWRkaW5nIGF1dG9tYXRpY2FsbHk8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZHluYW1pYyBjb250ZW50Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2N3c2VydmJuLmh0bWwjY3dzZXJ2Ym4iPnNlcnZsZXRzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmR5bmFtaWMgV2ViIGNvbnRlbnQKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3BkanNwcy5odG1sI2NwZGpzcHMiPmdlbmVyYXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZHluYW1pYyBXZWIgcHJvamVjdHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdwY252cnQuaHRtbCN0d3BjbnZydCI+Y29udmVydGluZyBmcm9tIHN0YXRpYzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmh0bWwjdHdjcmVwcmoiPmNyZWF0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouaHRtbCNjY3dlYnByaiI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ1IiBocmVmPSIjSURYMF80NSI+RTwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5leHBvcnRpbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuaHRtbCN0d2NyZXdhciI+V2FyIGZpbGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80NiIgaHJlZj0iI0lEWDBfNDYiPkY8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+ZnJhbWVzZXRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqY3JlaHRtLmh0bWwjdGpjcmVodG0iPmNyZWF0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV80OCIgaHJlZj0iI0lEWDBfNDgiPkg8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+SFRNTCBmaWxlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sI3RqY3JlaHRtIj5jcmVhdGluZzwvYT4KLTwvbGk+Ci08bGk+ZWRpdGluZwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90anByZWZzLmh0bWwjdGpwcmVmcyI+cHJlZmVyZW5jZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNDkiIGhyZWY9IiNJRFgwXzQ5Ij5JPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPmluZm9ybWF0aW9uIHBhdGh3YXlzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2Njd3RvdmVyLmh0bWwjY2N3dG92ZXIiPldlYiBhcHBsaWNhdGlvbnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzRBIiBocmVmPSIjSURYMF80QSI+SjwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5KYXZhU2VydmVyIHBhZ2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2NwZGpzcHMuaHRtbCNjcGRqc3BzIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5KU1AgZmlsZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuaHRtbCN0amNyZWpzcCI+Y3JlYXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzUwIiBocmVmPSIjSURYMF81MCI+UDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5odG1sI2Njd2VidnciPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81MyIgaHJlZj0iI0lEWDBfNTMiPlM8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+c2VydmVycwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwjdHNlcnZlcnRhcmdldCI+dGFyZ2V0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnNlcnZsZXRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3c3J2d2l6Lmh0bWwjdHdzcnZ3aXoiPmNyZWF0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uaHRtbCNjd3NlcnZibiI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+c3RhdGljIFdlYiBwcm9qZWN0cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sI3R3cGNudnJ0Ij5jb252ZXJ0aW5nIHRvIGR5bmFtaWM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90d2NyZXN0YS5odG1sI3R3Y3Jlc3RhIj5jcmVhdGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2Njc3RhdGljLmh0bWwjY2NzdGF0aWMiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnN0eWxlIHNoZWV0cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90c3R5bGVzaGVldC5odG1sI3RzdHlsZXNoZWV0Ij5jcmVhdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTYiIGhyZWY9IiNJRFgwXzU2Ij5WPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPnZlcnNpb24gY29udHJvbCBtYW5hZ2VtZW50Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2Njd2VidncuaHRtbCNjY3dlYnZ3Ij50dXJuaW5nIG9uIGFuZCBvZmY8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+dmlydHVhbCBKQVIgZmlsZXMgYXNzb2NpYXRpb25zCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3cGxpYi5odG1sI3R3cGxpYiI+V2ViIGxpYnJhcnkgcHJvamVjdHM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzU3IiBocmVmPSIjSURYMF81NyI+VzwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5XQVIgZmlsZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuaHRtbCN0d2NyZXdhciI+ZXhwb3J0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuaHRtbCN0d2ltcHdhciI+aW1wb3J0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuaHRtbCNjd3dhcm92ciI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+V2ViIGFwcGxpY2F0aW9ucwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jd2VicHJvamVjdHMuaHRtbCNjd2VicHJvamVjdHMiPmNyZWF0aW5nIG9yIGltcG9ydGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2Njd3RvdmVyLmh0bWwjY2N3dG92ZXIiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHNlcnZlcnRhcmdldC5odG1sI3RzZXJ2ZXJ0YXJnZXQiPnNlcnZlciB0YXJnZXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+V2ViIGRldmVsb3BtZW50Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2Njd2VidncuaHRtbCNjY3dlYnZ3Ij5Qcm9qZWN0IEV4cGxvcmVyIHZpZXc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+V2ViIGVkaXRvcnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3d3ZWR0dncuaHRtbCNjd3dlZHR2dyI+d29ya2JlbmNoIGludGVncmF0aW9uPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPldlYiBsaWJyYXJ5IHByb2plY3RzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3cGxpYi5odG1sI3R3cGxpYiI+dmlydHVhbCBKQVIgZmlsZXMgYW5kIHByb2plY3RzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPldlYiBwYWdlIGRlc2lnbgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sI2N3ZWJwYWdlZGVzaWduIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5XZWIgcGFnZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuaHRtbCN0amRldGFncyI+Y3JlYXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+V2ViIHBlcnNwZWN0aXZlCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL2Njd2VidncuaHRtbCNjY3dlYnZ3Ij5wcm9qZWN0IGV4cGxvcmVyIHZpZXc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+V2ViIHByb2plY3RzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmh0bWwjdHdjcmVzdGEiPmNyZWF0aW5nIHN0YXRpYzwvYT4KLTwvbGk+Ci08bGk+ZHluYW1pYwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sI3R3cGNudnJ0Ij5jb252ZXJ0aW5nIGZyb20gc3RhdGljPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdjcmVwcmouaHRtbCN0d2NyZXByaiI+Y3JlYXRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9jY3dlYnByai5odG1sI2Njd2VicHJqIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuaHRtbCN0d2NyZXdhciI+ZXhwb3J0aW5nIFdBUiBmaWxlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5odG1sI2N3ZWJwcm9qZWN0cyI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90d3ByanNldC5odG1sI3R3cHJqc2V0Ij5wcm9wZXJ0aWVzIHNldHRpbmdzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuaHRtbCNjY3N0YXRpYyI+c3RhdGljPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPldlYiByZXNvdXJjZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5odG1sI2N3ZWJyZXNvdXJjZXMiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPldlYiB0b29scwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jd3RmZWF0dXJlcy5odG1sI2N3dGZlYXR1cmVzIj5mZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPldNTCBmaWxlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sI3RqY3JlaHRtIj5jcmVhdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08c3Ryb25nPjxhIG5hbWU9IklEWDFfNTgiIGhyZWY9IiNJRFgwXzU4Ij5YPC9hPjwvc3Ryb25nPgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPlhIVE1MIGZpbGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RqY3JlaHRtLmh0bWwjdGpjcmVodG0iPmNyZWF0aW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwY2I2ZWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyaW5kZXgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08aW5kZXg+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgYXBwbGljYXRpb25zIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3d0b3Zlci5odG1sI2Njd3RvdmVyIiB0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmcgb3IgaW1wb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmh0bWwjY3dlYnByb2plY3RzIiB0aXRsZT0iV2ViIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2VydmVyIHRhcmdldGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbCN0c2VydmVydGFyZ2V0IiB0aXRsZT0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkZXZlbG9wbWVudCBwaGFzZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXZWIgYXBwbGljYXRpb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuaHRtbCNjY3d0b3ZlciIgdGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJpbmZvcm1hdGlvbiBwYXRod2F5cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IldlYiBhcHBsaWNhdGlvbnMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3d0b3Zlci5odG1sI2Njd3RvdmVyIiB0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiB0b29scyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd3RmZWF0dXJlcy5odG1sI2N3dGZlYXR1cmVzIiB0aXRsZT0iV2ViIHRvb2xzIGZlYXR1cmVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlByb2plY3QgRXhwbG9yZXIgdmlldyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5odG1sI2Njd2VidnciIHRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgcGVyc3BlY3RpdmUiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJwcm9qZWN0IGV4cGxvcmVyIHZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3dlYnZ3Lmh0bWwjY2N3ZWJ2dyIgdGl0bGU9IlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZlcnNpb24gY29udHJvbCBtYW5hZ2VtZW50Ij4KLSAgICA8ZW50cnkga2V5d29yZD0idHVybmluZyBvbiBhbmQgb2ZmIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3ZWJ2dy5odG1sI2Njd2VidnciIHRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgZGV2ZWxvcG1lbnQiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3dlYnZ3Lmh0bWwjY2N3ZWJ2dyIgdGl0bGU9IlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiByZXNvdXJjZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCNjd2VicmVzb3VyY2VzIiB0aXRsZT0iV2ViIHJlc291cmNlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJXZWIgcGFnZSBkZXNpZ24iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3ZWJwYWdlZGVzaWduLmh0bWwjY3dlYnBhZ2VkZXNpZ24iIHRpdGxlPSJXZWIgcGFnZSBkZXNpZ24iLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV2ViIHByb2plY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd2VicHJvamVjdHMuaHRtbCNjd2VicHJvamVjdHMiIHRpdGxlPSJXZWIgcHJvamVjdHMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkeW5hbWljIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjcmVwcmouaHRtbCN0d2NyZXByaiIgdGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouaHRtbCNjY3dlYnByaiIgdGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY29udmVydGluZyBmcm9tIHN0YXRpYyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwY252cnQuaHRtbCN0d3BjbnZydCIgdGl0bGU9IkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyBzdGF0aWMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXN0YS5odG1sI3R3Y3Jlc3RhIiB0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzdGF0aWMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sI2Njc3RhdGljIiB0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImV4cG9ydGluZyBXQVIgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXdhci5odG1sI3R3Y3Jld2FyIiB0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvcGVydGllcyBzZXR0aW5ncyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3cHJqc2V0Lmh0bWwjdHdwcmpzZXQiIHRpdGxlPSJTZXR0aW5nIFdlYiBwcm9qZWN0IHByb3BlcnRpZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV0FSIGZpbGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jd3dhcm92ci5odG1sI2N3d2Fyb3ZyIiB0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2ltcHdhci5odG1sI3R3aW1wd2FyIiB0aXRsZT0iSW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZXhwb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjcmV3YXIuaHRtbCN0d2NyZXdhciIgdGl0bGU9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkeW5hbWljIFdlYiBwcm9qZWN0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjcmVwcmouaHRtbCN0d2NyZXByaiIgdGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouaHRtbCNjY3dlYnByaiIgdGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb252ZXJ0aW5nIGZyb20gc3RhdGljIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwY252cnQuaHRtbCN0d3BjbnZydCIgdGl0bGU9IkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJzdGF0aWMgV2ViIHByb2plY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXN0YS5odG1sI3R3Y3Jlc3RhIiB0aXRsZT0iQ3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3QiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb252ZXJ0aW5nIHRvIGR5bmFtaWMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sI3R3cGNudnJ0IiB0aXRsZT0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ib3ZlcnZpZXciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sI2Njc3RhdGljIiB0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJleHBvcnRpbmciPgotICAgIDxlbnRyeSBrZXl3b3JkPSJXYXIgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2NyZXdhci5odG1sI3R3Y3Jld2FyIiB0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBsaWJyYXJ5IHByb2plY3RzIj4KLSAgICA8ZW50cnkga2V5d29yZD0idmlydHVhbCBKQVIgZmlsZXMgYW5kIHByb2plY3RzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwjdHdwbGliIiB0aXRsZT0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InZpcnR1YWwgSkFSIGZpbGVzIGFzc29jaWF0aW9ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IldlYiBsaWJyYXJ5IHByb2plY3RzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwjdHdwbGliIiB0aXRsZT0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBlZGl0b3JzIj4KLSAgICA8ZW50cnkga2V5d29yZD0id29ya2JlbmNoIGludGVncmF0aW9uIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3d3ZWR0dncuaHRtbCNjd3dlZHR2dyIgdGl0bGU9IldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IldlYiBwYWdlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuaHRtbCN0amRldGFncyIgdGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ii8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkhUTUwgZmlsZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqY3JlaHRtLmh0bWwjdGpjcmVodG0iIHRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0icHJlZmVyZW5jZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCN0anByZWZzIiB0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYSFRNTCBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVodG0uaHRtbCN0amNyZWh0bSIgdGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iV01MIGZpbGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sI3RqY3JlaHRtIiB0aXRsZT0iQ3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJmcmFtZXNldHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqY3JlaHRtLmh0bWwjdGpjcmVodG0iIHRpdGxlPSJDcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb24iPgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmcgYXV0b21hdGljYWxseSI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCN0anByZWZzIiB0aXRsZT0iRGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InN0eWxlIHNoZWV0cyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCN0c3R5bGVzaGVldCIgdGl0bGU9IkNyZWF0aW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0ic2VydmxldHMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3c3J2d2l6Lmh0bWwjdHdzcnZ3aXoiIHRpdGxlPSJDcmVhdGluZyBzZXJ2bGV0cyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uaHRtbCNjd3NlcnZibiIgdGl0bGU9IlNlcnZsZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImR5bmFtaWMgY29udGVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNlcnZsZXRzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uaHRtbCNjd3NlcnZibiIgdGl0bGU9IlNlcnZsZXRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IkpTUCBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuaHRtbCN0amNyZWpzcCIgdGl0bGU9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iSmF2YVNlcnZlciBwYWdlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3BkanNwcy5odG1sI2NwZGpzcHMiIHRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iZHluYW1pYyBXZWIgY29udGVudCI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9jcGRqc3BzLmh0bWwjY3BkanNwcyIgdGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJDVlMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJzZXR0aW5nIHJlcG9zaXRvcnkgZGVmYXVsdHMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCN0d2N2c3IiIHRpdGxlPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9ImN2c2lnbm9yZSBmaWxlIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d2N2c3IuaHRtbCN0d2N2c3IiIHRpdGxlPSJTZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InNlcnZlcnMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJ0YXJnZXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwjdHNlcnZlcnRhcmdldCIgdGl0bGU9IlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnMiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotPC9pbmRleD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2JhMDI2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDEsIDIwMDQgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotcGx1Z2luTmFtZSAgID0gV2ViIHRvb2xzIGRvY3VtZW50YXRpb24KLXByb3ZpZGVyTmFtZSA9IEVjbGlwc2Uub3JnClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTJkYWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PiAKLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0gICA8cGx1Z2luPiAKLSAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgICAgICAJPHRvYyBmaWxlPSJ3ZWJ0b29sc190b2MueG1sIiAvPiAKLSAgICAgICAgIAkgICA8L2V4dGVuc2lvbj4gIAotICAgICAgICAgCSAgIAotICAgICAgICA8ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXJpbmRleC54bWwiLz4KLSAgIDwvZXh0ZW5zaW9uPgotICAgIDwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3JlbGF0ZWRsaW5rcy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcmVsYXRlZGxpbmtzLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMjZkZmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvcmVsYXRlZGxpbmtzLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw0NDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9JQk0vL0RURCBESVRBIElCTSBNYXAvL0VOIg0KLSAiaWJtLW1hcC5kdGQiPg0KLTxtYXAgdGl0bGU9IldlYiB0b29scyByZWxhdGVkIGxpbmtzIj48P1B1YiBDYXJldDE/Pg0KLTxyZWx0YWJsZT4NCi08cmVsaGVhZGVyPg0KLTxyZWxjb2xzcGVjIHR5cGU9ImNvbmNlcHQiPjwvcmVsY29sc3BlYz4NCi08cmVsY29sc3BlYyB0eXBlPSJ0YXNrIj48L3JlbGNvbHNwZWM+DQotPHJlbGNvbHNwZWMgdHlwZT0icmVmZXJlbmNlIj48L3JlbGNvbHNwZWM+DQotPC9yZWxoZWFkZXI+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY2hneGR0LmRpdGEiIG5hdnRpdGxlPSJTcGVjaWZ5aW5nIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWh0bS5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jcGRqc3BzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHNlcnZlcnRhcmdldC5kaXRhIiBuYXZ0aXRsZT0iU2VydmVyIHRhcmdldGluZyBmb3IgV2ViIGFwcGxpY2F0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuZGl0YSIgbmF2dGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiIHNjb3BlPSJwZWVyIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWpzcC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIHNjb3BlPSJwZWVyIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmRpdGEiIG5hdnRpdGxlPSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Zzci5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIHNjb3BlPSJwZWVyIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3aW1wd2FyLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3N0YXRpYy5kaXRhIiBuYXZ0aXRsZT0iU3RhdGljIFdlYiBwcm9qZWN0cyIgc2NvcGU9InBlZXIiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3BjbnZydC5kaXRhIiBuYXZ0aXRsZT0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3BsaWIuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0cyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dzZXJ2Ym4uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlNlcnZsZXRzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3Nydndpei5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgc2VydmxldHMiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd2VidncuZGl0YSIgbmF2dGl0bGU9IlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmRpdGEiIG5hdnRpdGxlPSJXZWIgcHJvamVjdHMiIHNjb3BlPSJwZWVyIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3dG92ZXIuZGl0YSIgbmF2dGl0bGU9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2ltcHdhci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iSW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3d0b3Zlci5kaXRhIiBuYXZ0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiB0b29scyBmZWF0dXJlcyI+DQotPC90b3BpY3JlZj4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3dGZlYXR1cmVzLmRpdGEiIG5hdnRpdGxlPSJXZWIgdG9vbHMgZmVhdHVyZXMiPjwvdG9waWNyZWY+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHBhZ2UgZGVzaWduIj4NCi08L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VidGVjaG5vbG9naWVzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgdGVjaG5vbG9naWVzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3Nydndpei5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgc2VydmxldHMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnRlY2hub2xvZ2llcy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHRlY2hub2xvZ2llcyI+DQotPC90b3BpY3JlZj4gLS0+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3c2VydmJuLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJTZXJ2bGV0cyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3c2VydmJuLmRpdGEiIG5hdnRpdGxlPSJTZXJ2bGV0cyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciPg0KLTwvdG9waWNyZWY+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3c3J2d2l6LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBzZXJ2bGV0cyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njc3RhdGljLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJTdGF0aWMgV2ViIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amNyZWh0bS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0cyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIg0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3d0b3Zlci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3ZWR0dncuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqcHJlZnMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3BkanNwcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iSmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHByb2plY3RzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVzdGEuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuZGl0YSIgbmF2dGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgcmVzb3VyY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3YXJvdnIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXByai5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0Ig0KLXNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJwYWdlZGVzaWduLmRpdGEiIG5hdnRpdGxlPSJXZWIgcGFnZSBkZXNpZ24iPjwvdG9waWNyZWY+DQotPCEtLSA8dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJkZXZlbG9wbWVudHRvb2xzLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJXZWIgZGV2ZWxvcG1lbnQgdG9vbHMiPg0KLTwvdG9waWNyZWY+IC0tPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amRldGFncy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dhcm92ci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij48L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTxyZWxyb3c+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d3ZWR0dncuZGl0YSIgbmF2dGl0bGU9IldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzIj4NCi08L3RvcGljcmVmPg0KLTwhLS0gPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2ViZGV2ZWxvcG1lbnR0b29scy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGRldmVsb3BtZW50IHRvb2xzIj4NCi08L3RvcGljcmVmPiAtLT4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVqc3AuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdpbXB3YXIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyINCi1zY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFeHBvcnRpbmcgV2ViIEFyY2hpdmUgKFdBUikgZmlsZXMiDQotc2NvcGU9InBlZXIiPjwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIHJlc291cmNlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGwgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPjwvcmVsY2VsbD4NCi08cmVsY2VsbD48L3JlbGNlbGw+DQotPC9yZWxyb3c+DQotPHJlbHJvdz4NCi08cmVsY2VsbD4NCi08IS0tIDx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dlYmRldmVsb3BtZW50dG9vbHMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IldlYiBkZXZlbG9wbWVudCB0b29scyI+DQotPC90b3BpY3JlZj4gLS0+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3d0b3Zlci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvcmVsY2VsbD4NCi08cmVsY2VsbCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amRldGFncy5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciPg0KLTwvdG9waWNyZWY+DQotPC9yZWxjZWxsPg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08L3JlbHJvdz4NCi08cmVscm93Pg0KLTxyZWxjZWxsPjwvcmVsY2VsbD4NCi08cmVsY2VsbD4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqcHJlZnMuZGl0YSIgbmF2dGl0bGU9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08L3JlbGNlbGw+DQotPHJlbGNlbGw+PC9yZWxjZWxsPg0KLTwvcmVscm93Pg0KLTwvcmVsdGFibGU+DQotPC9tYXA+DQotPD9QdWIgKjAwMDAwMTQ5NDQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njc3RhdGljLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlODA5ZmIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njc3RhdGljLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImNjc3RhdGljIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TdGF0aWMgV2ViIHByb2plY3RzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPnN0YXRpYzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+c3RhdGljIFdlYiBwcm9qZWN0czxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+SWYgeW91ICB3YW50IHRvIGNyZWF0ZSBhIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uIHRoYXQgZG9lcyBub3QgY29udGFpbg0KLWFueSBkeW5hbWljIGNvbnRlbnQgIChzdWNoIGFzIHNlcnZsZXRzLCBKU1AgZmlsZXMsIGZpbHRlcnMsIGFuZCBhc3NvY2lhdGVkDQotbWV0YWRhdGEpIHlvdSBtaWdodCBwcmVmZXIgdG8gY3JlYXRlIGEgc3RhdGljIFdlYiBwcm9qZWN0LCBhcyBvcHBvc2VkIHRvIGEgPHhyZWYNCi1ocmVmPSJjY3dlYnByai5kaXRhIiBzY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPmR5bmFtaWMgV2ViIHByb2plY3Q8L3hyZWY+LjwvcD4NCi08cD5TdGF0aWMgV2ViIHByb2plY3RzIGhhdmUgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXJpc3RpY3M6ICA8dWw+DQotPGxpPmEgV2ViIGNvbnRlbnQgZm9sZGVyIChjYWxsZWQgV2ViQ29udGVudCkgZm9yIGFsbCBwdWJsaXNoYWJsZSByZXNvdXJjZXMsDQotWW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBmb2xkZXIgZnJvbSB0aGUgcHJvamVjdCdzIHBvcC11cCBtZW51LjwvbGk+DQotPGxpPmEgVGhlbWUgZm9sZGVyLCB0aGUgc3VnZ2VzdGVkIGRpcmVjdG9yeSBmb3Igc3RvcmluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzDQotYW5kIG90aGVyIHN0eWxlLXJlbGF0ZWQgb2JqZWN0cy48L2xpPg0KLTxsaT50aGUgYWJpbGl0eSB0byBkZWZpbmUgZm9sZGVycyBvdXRzaWRlIG9mIHRoZSBXZWIgY29udGVudCBmb2xkZXIsIGZvciBzdG9yaW5nDQotaW50ZXJtZWRpYXRlIGZpbGVzLCBzdWNoIGFzIE1JRiBmaWxlczwvbGk+DQotPGxpPmEgY29udmVyc2lvbiBwYXRoIGZyb20gYSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYSBkeW5hbWljIFdlYiBwcm9qZWN0Lg0KLUlmIHlvdSBkZWNpZGUgdG8gPHhyZWYgaHJlZj0idHdwY252cnQuZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz5jb252ZXJ0PC94cmVmPiB0aGUNCi1wcm9qZWN0LCBpdCB3aWxsIGJlIGEgZnVsbHktdmFsaWQgZHluYW1pYyBXZWIgcHJvamVjdC4gPC9saT4NCi08L3VsPjwvcD4NCi08cD5JbiBhZGRpdGlvbiwgeW91ciBwcm9qZWN0IHdpbGwgc3RpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGZlYXR1cmVzICh3aGljaA0KLWFyZSBjb21tb24gdG8gYm90aCBzdGF0aWMgYW5kIGR5bmFtaWMgV2ViIHByb2plY3RzICkgOiA8dWw+DQotPGxpPkhUTUwgc3ludGF4IHZhbGlkYXRpb248L2xpPg0KLTxsaT5hIGJyb2tlbiBsaW5rIGZpeC11cCB3aXphcmQ8L2xpPg0KLTxsaT5hIFdlYiBzaXRlIG5hdmlnYXRpb24gdG9vbDwvbGk+DQotPGxpPmEgbmV3IHNlcnZlciB0eXBlLCB0aGUgU3RhdGljIFdlYiBzZXJ2ZXIsIHdoaWNoIG1ha2VzIGl0IGVhc3kgdG8gcHVibGlzaA0KLXN0YXRpYyBXZWIgcHJvamVjdHM8L2xpPg0KLTwvdWw+IDwvcD4NCi08cD5UaGUgZm9sZGVyIHRoYXQgYSBzdGF0aWMgV2ViIHByb2plY3QgaXMgcHVibGlzaGVkIHRvIGlzIG1vZGlmaWFibGUsIHNvDQotdGhhdCB3aGVuIHlvdSBzZXQgdGhlIHB1Ymxpc2hpbmcgInJvb3QiIHZhbHVlIChjYWxsZWQgYSA8aT5jb250ZXh0IHJvb3Q8L2k+KSwNCi1zdWNoIGFzIDxjb2RlcGg+L3dlYjE8L2NvZGVwaD4sIGZvciBhIHN0YXRpYyBwcm9qZWN0LCBldmVyeXRoaW5nIGluIHRoZSBXZWINCi1jb250ZW50IGZvbGRlciB3aWxsIGJlIHB1Ymxpc2hlZCB0byB0aGUgPGZpbGVwYXRoPndlYjE8L2ZpbGVwYXRoPiBmb2xkZXIgdW5kZXINCi10aGUgV2ViIHNlcnZlcidzIGRvYyByb290LiBUaGlzIGVuYWJsZXMgeW91IHRvIGdyb3VwIFdlYiByZXNvdXJjZXMgb24gYSBXZWINCi1zZXJ2ZXIgaW4gZm9sZGVycyB0aGF0IGNvcnJlc3BvbmQgdG8gV2ViIHByb2plY3RzIGluIHRoZSB3b3JrYmVuY2guIFdoZW4gcHJvamVjdHMNCi1kZWZpbmVkIGluIHRoaXMgd2F5IGFyZSByZWFkeSBmb3IgcHJvZHVjdGlvbiwgeW91IGNhbiBwdWJsaXNoIHNwZWNpZmljIHByb2plY3RzDQotZGlyZWN0bHkgdG8gdGhlIGRvYyByb290IGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSB0byA8Y29kZXBoPi88L2NvZGVwaD4gYW5kIGFsbA0KLXB1Ymxpc2hpbmcsIGxpbmsgZml4aW5nLCBhbmQgYnJvd3Npbmcgd2lsbCB1cGRhdGUgYXV0b21hdGljYWxseS48L3A+DQotPHA+QWxpYXNlcyBjYW4gYWxzbyBiZSB1c2VkIHRvIHNwZWNpZnkgYSBjb250ZXh0IHJvb3QgdmFsdWUuIEZvciBleGFtcGxlLA0KLXN1cHBvc2UgdGhhdCB0aGVyZSBpcyBhbiBhbGlhcyB0aGF0IGlzIGRlZmluZWQgb24gdGhlIHRhcmdldCBXZWIgc2VydmVyLCBhcw0KLWZvbGxvd3M6IDxjb2RlYmxvY2s+QWxpYXMgL3NjcmlwdHMvICIvdmFyL3d3dy9zY3JpcHRzIjwvY29kZWJsb2NrPkluIHRoaXMNCi1leGFtcGxlLCBpbiB3aGljaCB0aGUgY3VycmVudCBzdGF0aWMgV2ViIHByb2plY3Qgd2lsbCBjb250YWluIGNvbW1vbiA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBmaWxlcywNCi15b3UgY2FuIHNldCB0aGUgY29udGV4dCByb290IHZhbHVlIHRvIGJlIDxwaD4ic2NyaXB0cyI8L3BoPi4gIEluIG9yZGVyIGZvcg0KLXRoZSByZXNvdXJjZXMgaW4gdGhlIHN0YXRpYyBXZWIgcHJvamVjdCB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIGNvcnJlY3QgbG9jYXRpb24NCi1vbiB0aGUgV2ViIHNlcnZlciwgeW91IG11c3QgYWRkIHRoaXMgQWxpYXMgbWFwcGluZyB0byB0aGUgc2VydmVyIHRvb2xzIGluc3RhbmNlDQotb2YgdGhlIHN0YXRpYyBXZWIgc2VydmVyLCBhcyBmb2xsb3dzLiAgPG9sPg0KLTxsaT5Gcm9tIHRoZSBTZXJ2ZXIgdmlldywgZG91YmxlLWNsaWNrIG9uIHRoZSBzdGF0aWMgV2ViIHNlcnZlciBjb25maWd1cmF0aW9uDQotdG8gb3BlbiB0aGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gZWRpdG9yLjxub3RlPlRoaXMgYXNzdW1lcyB0aGF0IHlvdSd2ZSBhbHJlYWR5DQotZGVmaW5lZCB0aGUgc3RhdGljIFdlYiBzZXJ2ZXIuPC9ub3RlPjwvbGk+DQotPGxpPkNsaWNrIHRoZSA8dWljb250cm9sPkNvbmZpZ3VyYXRpb248L3VpY29udHJvbD4gZWRpdG9yIHRhYi48L2xpPg0KLTxsaT5TY3JvbGwgZG93biB0byB0aGUgPHVpY29udHJvbD5BbGlhcyBQYXRoIE1hcHBpbmc8L3VpY29udHJvbD4gc2VjdGlvbiwNCi1hbmQgYWRkIHRoZSBuZXcgQWxpYXMgbWFwcGluZy48L2xpPg0KLTwvb2w+Tm93IHRoYXQgPHBoPiJzY3JpcHRzIjwvcGg+IGlzIGRlZmluZWQgYXMgYW4gQWxpYXMsIHRoZSBXZWIgY29udGVudCBpbg0KLXRoZSBzdGF0aWMgV2ViIHByb2plY3Qgd2lsbCBiZSBwdWJsaXNoZWQgdG8gdGhlIG1hcHBlZCBwYXRoLCA8ZmlsZXBhdGg+L3Zhci93d3cvc2NyaXB0czwvZmlsZXBhdGg+LjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3N0YXRpYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njc3RhdGljLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMTY0YzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njc3RhdGljLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTdGF0aWMgV2ViIHByb2plY3RzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBzdGF0aWMsIHN0YXRpYyBXZWIgcHJvamVjdHMsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHByb2plY3RzLCBzdGF0aWMsIHN0YXRpYyBXZWIgcHJvamVjdHMsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjY3N0YXRpYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlN0YXRpYyBXZWIgcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNjc3RhdGljIj48YSBuYW1lPSJjY3N0YXRpYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3RhdGljIFdlYiBwcm9qZWN0czwvaDE+Ci0KLQotPGRpdj4KLTxwPklmIHlvdSAgd2FudCB0byBjcmVhdGUgYSBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiB0aGF0IGRvZXMgbm90IGNvbnRhaW4KLWFueSBkeW5hbWljIGNvbnRlbnQgIChzdWNoIGFzIHNlcnZsZXRzLCBKU1AgZmlsZXMsIGZpbHRlcnMsIGFuZCBhc3NvY2lhdGVkCi1tZXRhZGF0YSkgeW91IG1pZ2h0IHByZWZlciB0byBjcmVhdGUgYSBzdGF0aWMgV2ViIHByb2plY3QsIGFzIG9wcG9zZWQgdG8gYSA8YSBocmVmPSJjY3dlYnByai5odG1sIiB0aXRsZT0iIj5keW5hbWljIFdlYiBwcm9qZWN0PC9hPi48L3A+Ci0KLTxkaXYgY2xhc3M9InAiPlN0YXRpYyBXZWIgcHJvamVjdHMgaGF2ZSB0aGUgZm9sbG93aW5nIGNoYXJhY3RlcmlzdGljczogIDx1bD4KLTxsaT5hIFdlYiBjb250ZW50IGZvbGRlciAoY2FsbGVkIFdlYkNvbnRlbnQpIGZvciBhbGwgcHVibGlzaGFibGUgcmVzb3VyY2VzLAotWW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUgb2YgdGhpcyBmb2xkZXIgZnJvbSB0aGUgcHJvamVjdCdzIHBvcC11cCBtZW51LjwvbGk+Ci0KLTxsaT5hIFRoZW1lIGZvbGRlciwgdGhlIHN1Z2dlc3RlZCBkaXJlY3RvcnkgZm9yIHN0b3JpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cwotYW5kIG90aGVyIHN0eWxlLXJlbGF0ZWQgb2JqZWN0cy48L2xpPgotCi08bGk+dGhlIGFiaWxpdHkgdG8gZGVmaW5lIGZvbGRlcnMgb3V0c2lkZSBvZiB0aGUgV2ViIGNvbnRlbnQgZm9sZGVyLCBmb3Igc3RvcmluZwotaW50ZXJtZWRpYXRlIGZpbGVzLCBzdWNoIGFzIE1JRiBmaWxlczwvbGk+Ci0KLTxsaT5hIGNvbnZlcnNpb24gcGF0aCBmcm9tIGEgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGEgZHluYW1pYyBXZWIgcHJvamVjdC4KLUlmIHlvdSBkZWNpZGUgdG8gPGEgaHJlZj0idHdwY252cnQuaHRtbCIgdGl0bGU9IiI+Y29udmVydDwvYT4gdGhlCi1wcm9qZWN0LCBpdCB3aWxsIGJlIGEgZnVsbHktdmFsaWQgZHluYW1pYyBXZWIgcHJvamVjdC4gPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJwIj5JbiBhZGRpdGlvbiwgeW91ciBwcm9qZWN0IHdpbGwgc3RpbGwgaGF2ZSB0aGUgZm9sbG93aW5nIGZlYXR1cmVzICh3aGljaAotYXJlIGNvbW1vbiB0byBib3RoIHN0YXRpYyBhbmQgZHluYW1pYyBXZWIgcHJvamVjdHMgKSA6IDx1bD4KLTxsaT5IVE1MIHN5bnRheCB2YWxpZGF0aW9uPC9saT4KLQotPGxpPmEgYnJva2VuIGxpbmsgZml4LXVwIHdpemFyZDwvbGk+Ci0KLTxsaT5hIFdlYiBzaXRlIG5hdmlnYXRpb24gdG9vbDwvbGk+Ci0KLTxsaT5hIG5ldyBzZXJ2ZXIgdHlwZSwgdGhlIFN0YXRpYyBXZWIgc2VydmVyLCB3aGljaCBtYWtlcyBpdCBlYXN5IHRvIHB1Ymxpc2gKLXN0YXRpYyBXZWIgcHJvamVjdHM8L2xpPgotCi08L3VsPgotIDwvZGl2PgotCi08cD5UaGUgZm9sZGVyIHRoYXQgYSBzdGF0aWMgV2ViIHByb2plY3QgaXMgcHVibGlzaGVkIHRvIGlzIG1vZGlmaWFibGUsIHNvCi10aGF0IHdoZW4geW91IHNldCB0aGUgcHVibGlzaGluZyAicm9vdCIgdmFsdWUgKGNhbGxlZCBhIDxlbT5jb250ZXh0IHJvb3Q8L2VtPiksCi1zdWNoIGFzIDxzYW1wIGNsYXNzPSJjb2RlcGgiPi93ZWIxPC9zYW1wPiwgZm9yIGEgc3RhdGljIHByb2plY3QsIGV2ZXJ5dGhpbmcgaW4gdGhlIFdlYgotY29udGVudCBmb2xkZXIgd2lsbCBiZSBwdWJsaXNoZWQgdG8gdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+d2ViMTwvc3Bhbj4gZm9sZGVyIHVuZGVyCi10aGUgV2ViIHNlcnZlcidzIGRvYyByb290LiBUaGlzIGVuYWJsZXMgeW91IHRvIGdyb3VwIFdlYiByZXNvdXJjZXMgb24gYSBXZWIKLXNlcnZlciBpbiBmb2xkZXJzIHRoYXQgY29ycmVzcG9uZCB0byBXZWIgcHJvamVjdHMgaW4gdGhlIHdvcmtiZW5jaC4gV2hlbiBwcm9qZWN0cwotZGVmaW5lZCBpbiB0aGlzIHdheSBhcmUgcmVhZHkgZm9yIHByb2R1Y3Rpb24sIHlvdSBjYW4gcHVibGlzaCBzcGVjaWZpYyBwcm9qZWN0cwotZGlyZWN0bHkgdG8gdGhlIGRvYyByb290IGJ5IGNoYW5naW5nIHRoZSB2YWx1ZSB0byA8c2FtcCBjbGFzcz0iY29kZXBoIj4vPC9zYW1wPiBhbmQgYWxsCi1wdWJsaXNoaW5nLCBsaW5rIGZpeGluZywgYW5kIGJyb3dzaW5nIHdpbGwgdXBkYXRlIGF1dG9tYXRpY2FsbHkuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5BbGlhc2VzIGNhbiBhbHNvIGJlIHVzZWQgdG8gc3BlY2lmeSBhIGNvbnRleHQgcm9vdCB2YWx1ZS4gRm9yIGV4YW1wbGUsCi1zdXBwb3NlIHRoYXQgdGhlcmUgaXMgYW4gYWxpYXMgdGhhdCBpcyBkZWZpbmVkIG9uIHRoZSB0YXJnZXQgV2ViIHNlcnZlciwgYXMKLWZvbGxvd3M6IDxwcmU+QWxpYXMgL3NjcmlwdHMvICIvdmFyL3d3dy9zY3JpcHRzIjwvcHJlPgotSW4gdGhpcwotZXhhbXBsZSwgaW4gd2hpY2ggdGhlIGN1cnJlbnQgc3RhdGljIFdlYiBwcm9qZWN0IHdpbGwgY29udGFpbiBjb21tb24gSmF2YVNjcmlwdOKEoiBmaWxlcywKLXlvdSBjYW4gc2V0IHRoZSBjb250ZXh0IHJvb3QgdmFsdWUgdG8gYmUgPHNwYW4+InNjcmlwdHMiPC9zcGFuPi4gIEluIG9yZGVyIGZvcgotdGhlIHJlc291cmNlcyBpbiB0aGUgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGJlIHB1Ymxpc2hlZCB0byB0aGUgY29ycmVjdCBsb2NhdGlvbgotb24gdGhlIFdlYiBzZXJ2ZXIsIHlvdSBtdXN0IGFkZCB0aGlzIEFsaWFzIG1hcHBpbmcgdG8gdGhlIHNlcnZlciB0b29scyBpbnN0YW5jZQotb2YgdGhlIHN0YXRpYyBXZWIgc2VydmVyLCBhcyBmb2xsb3dzLiAgPG9sPgotPGxpPkZyb20gdGhlIFNlcnZlciB2aWV3LCBkb3VibGUtY2xpY2sgb24gdGhlIHN0YXRpYyBXZWIgc2VydmVyIGNvbmZpZ3VyYXRpb24KLXRvIG9wZW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIGVkaXRvci48ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhpcyBhc3N1bWVzIHRoYXQgeW91J3ZlIGFscmVhZHkKLWRlZmluZWQgdGhlIHN0YXRpYyBXZWIgc2VydmVyLjwvZGl2PgotPC9saT4KLQotPGxpPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25maWd1cmF0aW9uPC9zcGFuPiBlZGl0b3IgdGFiLjwvbGk+Ci0KLTxsaT5TY3JvbGwgZG93biB0byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWxpYXMgUGF0aCBNYXBwaW5nPC9zcGFuPiBzZWN0aW9uLAotYW5kIGFkZCB0aGUgbmV3IEFsaWFzIG1hcHBpbmcuPC9saT4KLQotPC9vbD4KLU5vdyB0aGF0IDxzcGFuPiJzY3JpcHRzIjwvc3Bhbj4gaXMgZGVmaW5lZCBhcyBhbiBBbGlhcywgdGhlIFdlYiBjb250ZW50IGluCi10aGUgc3RhdGljIFdlYiBwcm9qZWN0IHdpbGwgYmUgcHVibGlzaGVkIHRvIHRoZSBtYXBwZWQgcGF0aCwgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj4vdmFyL3d3dy9zY3JpcHRzPC9zcGFuPi48L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VicHJqLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhYTZkMzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VicHJqLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjY3dlYnByaiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHByb2plY3RzPGluZGV4dGVybT5keW5hbWljPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+ZHluYW1pYyBXZWIgcHJvamVjdHM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgV2ViIHByb2plY3RzOiBkeW5hbWljIGFuZCA8eHJlZiBocmVmPSJjY3N0YXRpYy5kaXRhIg0KLXNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+c3RhdGljPC94cmVmPi4gRHluYW1pYyB3ZWIgcHJvamVjdHMgY2FuIGNvbnRhaW4NCi1keW5hbWljIEoyRUUgcmVzb3VyY2VzIHN1Y2ggYXMgc2VydmxldHMsIEpTUCBmaWxlcywgZmlsdGVycywgYW5kIGFzc29jaWF0ZWQNCi1tZXRhZGF0YSwgaW4gYWRkaXRpb24gdG8gc3RhdGljIHJlc291cmNlcyBzdWNoIGFzIGltYWdlcyBhbmQgSFRNTCBmaWxlcy4gU3RhdGljDQotd2ViIHByb2plY3RzIG9ubHkgY29udGFpbnMgc3RhdGljIHJlc291cmNlcy4gV2hlbiB5b3UgY3JlYXRlIFdlYiBwcm9qZWN0cywNCi15b3UgY2FuIGluY2x1ZGUgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBhbmQgSlNQIHRhZyBsaWJyYXJpZXMgKGZvciBkeW5hbWljDQotV2ViIHByb2plY3RzKSwgc28gdGhhdCB5b3UgY2FuIGJlZ2luIGRldmVsb3BtZW50IHdpdGggYSByaWNoZXIgc2V0IG9mIHByb2plY3QNCi1yZXNvdXJjZXMuPC9wPg0KLTxwPkR5bmFtaWMgV2ViIHByb2plY3RzIGFyZSBhbHdheXMgaW1iZWRkZWQgaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0cy4NCi1UaGUgd2l6YXJkIHRoYXQgeW91IHVzZSB0byBjcmVhdGUgYSBkeW5hbWljIFdlYiBwcm9qZWN0IHdpbGwgYWxzbyBjcmVhdGUgYW4NCi1FbnRlcnByaXNlIEFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gVGhlIHdpemFyZA0KLXdpbGwgYWxzbyB1cGRhdGUgdGhlIDxmaWxlcGF0aD5hcHBsaWNhdGlvbi54bWw8L2ZpbGVwYXRoPiBkZXBsb3ltZW50IGRlc2NyaXB0b3INCi1vZiB0aGUgc3BlY2lmaWVkIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCB0byBkZWZpbmUgdGhlIFdlYiBwcm9qZWN0DQotYXMgYSBtb2R1bGUgZWxlbWVudC4gSWYgeW91IGFyZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSByYXRoZXIgdGhhbiBjcmVhdGluZw0KLWEgZHluYW1pYyBXZWIgcHJvamVjdCBuZXcsIHRoZSBXQVIgSW1wb3J0IHdpemFyZCByZXF1aXJlcyB0aGF0IHlvdSBzcGVjaWZ5DQotYSBXZWIgcHJvamVjdCwgd2hpY2ggYWxyZWFkeSByZXF1aXJlcyBhbiBFQVIgcHJvamVjdC4gPC9wPg0KLTxwPkoyRUUgY29udmVudGlvbnMgbWF5IHJlcHJlc2VudCBleHRyYSBvdmVyaGVhZCBpZiB5b3Ugb25seSB3YW50IHRvIGNyZWF0ZQ0KLWEgc3RhdGljLCBjb250ZW50LWJhc2VkIFdlYiBhcHBsaWNhdGlvbiwgd2hpY2ggY29udGFpbnMgbm8gZHluYW1pYyBmaWxlcywNCi1zdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cy4gSW4gdGhpcyBjYXNlLCB3aGVuIHlvdSBuZWVkIG9ubHkgdGhlIG1vc3QgYmFzaWMNCi1XZWIgcHJvamVjdCwgeW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSA8aT5zdGF0aWM8L2k+IFdlYiBwcm9qZWN0IHR5cGUgKHNlZSA8eHJlZg0KLWhyZWY9ImNjc3RhdGljLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+U3RhdGljIFdlYiBwcm9qZWN0czwveHJlZj4pLg0KLSBOb3RlIHRoYXQgc3RhdGljIFdlYiBwcm9qZWN0cyBjYW4gIGJlIGNvbnZlcnRlZCB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyBieQ0KLXNlbGVjdGluZyA8Yj5Db252ZXJ0IHRvIGEgRHluYW1pYyBXZWIgUHJvamVjdDwvYj4sIGZyb20gdGhlIFByb2plY3QgbWVudS48L3A+DQotPHA+VGhlIEoyRUUgbW9kZWwsIGFuZCBtb3JlIHNwZWNpZmljYWxseSwgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiwgZGVmaW5lcyBhIFdlYiBhcHBsaWNhdGlvbiBkaXJlY3Rvcnkgc3RydWN0dXJlIHRoYXQNCi1zcGVjaWZpZXMgdGhlIGxvY2F0aW9uIG9mIFdlYiBjb250ZW50IGZpbGVzLCBjbGFzcyBmaWxlcywgY2xhc3MgcGF0aHMsIGRlcGxveW1lbnQNCi1kZXNjcmlwdG9ycywgYW5kIHN1cHBvcnRpbmcgbWV0YWRhdGEuIFRoZSBXZWIgcHJvamVjdCBoaWVyYXJjaHkgbWlycm9ycyB0aGF0DQotb2YgdGhlIFdlYiBhcHBsaWNhdGlvbiBjcmVhdGVkIGZyb20gYSBwcm9qZWN0LiBJbiB0aGUgd29ya2JlbmNoLCB5b3UgY2FuIHVzZQ0KLXRoZSA8cGg+TmV3IFdlYiBQcm9qZWN0PC9waD4gd2l6YXJkIHRvIGNyZWF0ZSBhIG5ldyBXZWIgcHJvamVjdC48L3A+DQotPHA+VGhlIG1haW4gcHJvamVjdCBmb2xkZXIgY29udGFpbnMgYWxsIGRldmVsb3BtZW50IG9iamVjdHMgcmVsYXRlZCB0byBhIFdlYg0KLWFwcGxpY2F0aW9uLiBUaGUgV2ViIGNvbnRlbnQgZm9sZGVyIGNvbnRhaW5zIHRoZSBlbGVtZW50cyBvZiB0aGUgcHJvamVjdCBuZWNlc3NhcnkNCi10byBjcmVhdGUgYSBXZWIgYXBwbGljYXRpb24uIFRoaXMgZm9sZGVyIHN0cnVjdHVyZSBtYXBzIHRvIHRoZSBXZWIgYXBwbGljYXRpb24NCi1hcmNoaXZlIChXQVIpIHN0cnVjdHVyZSBkZWZpbmVkIGJ5IFN1biBNaWNyb3N5c3RlbXMuLiBUaGUgZm9sbG93aW5nIGRlZmF1bHQNCi1lbGVtZW50cyBhcmUgbG9jYXRlZCBpbiB0aGUgV2ViIHByb2plY3QgZm9sZGVyIGhpZXJhcmNoeTogPG5vdGU+SW4gdGhlIFByb2plY3QNCi1FeHBsb3JlciB2aWV3LCBXZWIgcHJvamVjdHMgYXJlIGZpbHRlcmVkIGludG8gZm9sZGVyIG5vZGVzIHRvIGN1c3RvbWl6ZSB0aGUNCi1kaXNwbGF5IG9mIFdlYiByZXNvdXJjZXMgZm9yIGVhc3kgbWFuYWdlbWVudCBkdXJpbmcgZGV2ZWxvcG1lbnQuIEZvciBpbmZvcm1hdGlvbg0KLW9uIHRoZSBmaWx0ZXJlZCBzdHJ1Y3R1cmUsIHNlZSA8eHJlZiBocmVmPSJjY3dlYnZ3LmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+UHJvamVjdA0KLUV4cGxvcmVyIHZpZXc8L3hyZWY+Ljwvbm90ZT48ZGw+PGRsZW50cnk+DQotPGR0PldlYiBEZXBsb3ltZW50IERlc2NyaXB0b3I8L2R0Pg0KLTxkZD5UaGUgc3RhbmRhcmQgV2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAodGhlIDxmaWxlcGF0aD53ZWIueG1sPC9maWxlcGF0aD4gZmlsZSkuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkphdmFTb3VyY2U8L2R0Pg0KLTxkZD5Db250YWlucyB0aGUgcHJvamVjdCdzIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZSBjb2RlIGZvciBjbGFzc2VzLCBiZWFucywgYW5kDQotc2VydmxldHMuIFdoZW4gdGhlc2UgcmVzb3VyY2VzIGFyZSBhZGRlZCB0byBhIFdlYiBwcm9qZWN0LCB0aGV5IGFyZSBhdXRvbWF0aWNhbGx5DQotY29tcGlsZWQgYW5kIHRoZSBnZW5lcmF0ZWQgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBXRUItSU5GL2NsYXNzZXMgZGlyZWN0b3J5Lg0KLVRoZSBjb250ZW50cyBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhcmUgbm90IHBhY2thZ2VkIGluIFdBUiBmaWxlcyB1bmxlc3MNCi1hbiBvcHRpb24gaXMgc3BlY2lmaWVkIHdoZW4gYSBXQVIgZmlsZSBpcyBjcmVhdGVkLiA8bm90ZT5UaG91Z2ggdGhlIGRlZmF1bHQNCi1uYW1lIGdpdmVuIHRvIHRoZSBmb2xkZXIgaXMgSmF2YVNvdXJjZXMsIHlvdSBjYW4gY2hhbmdlIHRoZSBuYW1lIGJ5IHJpZ2h0DQotY2xpY2tpbmcgb24gdGhlIG5hbWUgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIGNsaWNraW5nIG9uIDxtZW51Y2FzY2FkZT4NCi08dWljb250cm9sPlJlZmFjdG9yPC91aWNvbnRyb2w+PHVpY29udHJvbD5SZW5hbWU8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L25vdGU+PC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PmltcG9ydGVkX2NsYXNzZXMgZm9sZGVyPC9kdD4NCi08ZGQ+VGhpcyBmb2xkZXIgbWF5IGJlIGNyZWF0ZWQgZHVyaW5nIGEgV0FSIGltcG9ydCwgYW5kIGNvbnRhaW5zIGNsYXNzIGZpbGVzDQotdGhhdCBkbyBub3QgaGF2ZSBhY2NvbXBhbnlpbmcgc291cmNlLiAgVGhlIDx1aWNvbnRyb2w+aW1wb3J0ZWRfY2xhc3NlczwvdWljb250cm9sPiBmb2xkZXINCi1pcyBhIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGFzc2VzDQotZm9sZGVyOyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjbGFzc2VzIGZvbGRlcnMgY2FuIGFsc28gYmUgY3JlYXRlZCB1c2luZyB0aGUgV2ViDQotcHJvamVjdCA8dWljb250cm9sPkphdmEgQnVpbGQgUGF0aDwvdWljb250cm9sPiBwcm9wZXJ0aWVzIHBhZ2UuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PldlYkNvbnRlbnQgZm9sZGVyPC9kdD4NCi08ZGQ+VGhlIG1hbmRhdG9yeSBsb2NhdGlvbiBvZiBhbGwgV2ViIHJlc291cmNlcywgaW5jbHVkaW5nIEhUTUwsIEpTUCwgZ3JhcGhpYw0KLWZpbGVzLCBhbmQgc28gb24uIElmIHRoZSBmaWxlcyBhcmUgbm90IHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSAob3IgaW4gYSBzdWJkaXJlY3RvcnkNCi1zdHJ1Y3R1cmUgdW5kZXIgdGhpcyBkaXJlY3RvcnkpLCB0aGUgZmlsZXMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIHdoZW4gdGhlDQotYXBwbGljYXRpb24gaXMgZXhlY3V0ZWQgb24gYSBzZXJ2ZXIuIFRoZSBXZWIgY29udGVudCBmb2xkZXIgcmVwcmVzZW50cyB0aGUNCi1jb250ZW50cyBvZiB0aGUgV0FSIGZpbGUgdGhhdCB3aWxsIGJlIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIEFueSBmaWxlcyBub3QNCi11bmRlciB0aGUgV2ViIGNvbnRlbnQgZm9sZGVyIGFyZSBjb25zaWRlcmVkIGRldmVsb3BtZW50LXRpbWUgcmVzb3VyY2VzIChmb3INCi1leGFtcGxlLCAuamF2YSBmaWxlcywgLnNxbCBmaWxlcywgYW5kIC5taWYgZmlsZXMpLCBhbmQgYXJlIG5vdCBkZXBsb3llZCB3aGVuDQotdGhlIHByb2plY3QgaXMgdW5pdCB0ZXN0ZWQgb3IgcHVibGlzaGVkLiA8bm90ZT5UaG91Z2ggdGhlIGRlZmF1bHQgbmFtZSBnaXZlbg0KLXRvIHRoZSBmb2xkZXIgaXMgPGZpbGVwYXRoPldlYkNvbnRlbnQ8L2ZpbGVwYXRoPiwgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUNCi0gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYnkgcmlnaHQtY2xpY2tpbmcgdGhlIGZvbGRlciBhbmQgc2VsZWN0aW5nIDx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD48dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPiBvcg0KLWZyb20gdGhlIFdlYiBwYWdlIG9mIHRoZSBwcm9qZWN0J3MgUHJvcGVydGllcyBkaWFsb2cuIEluIGEgZHluYW1pYyBXZWIgcHJvamVjdCwNCi1jaGFuZ2luZyB0aGUgZm9sZGVyIG5hbWUgd2lsbCB1cGRhdGUgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkuIDwvbm90ZT48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TUVUQS1JTkY8L2R0Pg0KLTxkZD5UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgPGZpbGVwYXRoPk1BTklGRVNULk1GPC9maWxlcGF0aD4gZmlsZSwgd2hpY2gNCi1pcyB1c2VkIHRvIG1hcCBjbGFzcyBwYXRocyBmb3IgZGVwZW5kZW50IEpBUiBmaWxlcyB0aGF0IGV4aXN0IGluIG90aGVyIHByb2plY3RzDQotaW4gdGhlIHNhbWUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LiBBbiBlbnRyeSBpbiB0aGlzIGZpbGUgd2lsbCB1cGRhdGUNCi10aGUgcnVuLXRpbWUgcHJvamVjdCBjbGFzcyBwYXRoIGFuZCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBidWlsZCBzZXR0aW5ncyB0byBpbmNsdWRlIHRoZSByZWZlcmVuY2VkDQotSkFSIGZpbGVzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD50aGVtZTwvZHQ+DQotPGRkPlRoZSBzdWdnZXN0ZWQgZGlyZWN0b3J5IGZvciBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGFuZCBvdGhlciBzdHlsZS1yZWxhdGVkDQotb2JqZWN0cy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+V0VCLUlORjwvZHQ+DQotPGRkPkJhc2VkIG9uIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LCB0aGlzDQotZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBzdXBwb3J0aW5nIFdlYiByZXNvdXJjZXMgZm9yIGEgV2ViIGFwcGxpY2F0aW9uLCBpbmNsdWRpbmcNCi10aGUgPGZpbGVwYXRoPndlYi54bWw8L2ZpbGVwYXRoPiBmaWxlIGFuZCB0aGUgY2xhc3NlcyBhbmQgbGliIGRpcmVjdG9yaWVzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD4vY2xhc3NlczwvZHQ+DQotPGRkPlRoaXMgZGlyZWN0b3J5IGlzIGZvciBzZXJ2bGV0cywgdXRpbGl0eSBjbGFzc2VzLCBhbmQgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGNvbXBpbGVyDQotb3V0cHV0IGRpcmVjdG9yeS4gVGhlIGNsYXNzZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIHVzZWQgYnkgdGhlIGFwcGxpY2F0aW9uDQotY2xhc3MgbG9hZGVyIHRvIGxvYWQgdGhlIGNsYXNzZXMuIEZvbGRlcnMgaW4gdGhpcyBkaXJlY3Rvcnkgd2lsbCBtYXAgcGFja2FnZQ0KLWFuZCBjbGFzcyBuYW1lcywgYXMgaW46IDxjb2RlcGg+L1dFQi1JTkYvY2xhc3Nlcy9jb20vbXljb3JwL3NlcnZsZXRzL015U2VydmxldC5jbGFzczwvY29kZXBoPi48cD5Ebw0KLW5vdCBwbGFjZSBhbnkgLmNsYXNzIGZpbGVzIGRpcmVjdGx5IGludG8gdGhpcyBkaXJlY3RvcnkuIFRoZSAuY2xhc3MgZmlsZXMNCi1hcmUgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29tcGlsZXINCi1jb21waWxlcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIDxmaWxlcGF0aD5KYXZhIFJlc291cmNlczwvZmlsZXBhdGg+IGRpcmVjdG9yeS4NCi1BbnkgZmlsZXMgcGxhY2VkIGRpcmVjdGx5IGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgYmUgZGVsZXRlZCBieSB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gY29tcGlsZXINCi13aGVuIGl0IHJ1bnMuPC9wPjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD4vbGliPC9kdD4NCi08ZGQ+VGhlIHN1cHBvcnRpbmcgSkFSIGZpbGVzIHRoYXQgeW91ciBXZWIgYXBwbGljYXRpb24gcmVmZXJlbmNlcy4gQW55IGNsYXNzZXMNCi1pbiAuamFyIGZpbGVzIHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSB3aWxsIGJlIGF2YWlsYWJsZSBmb3IgeW91ciBXZWIgYXBwbGljYXRpb248L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TGlicmFyaWVzPC9kdD4NCi08ZGQ+VGhlIHN1cHBvcnRpbmcgSkFSIGZpbGVzIHRoYXQgeW91ciBXZWIgYXBwbGljYXRpb24gcmVmZXJlbmNlcy4gVGhpcyBmb2xkZXINCi1taXJyb3JzIHRoZSBjb250ZW50IG9mIHRoZSBsaWIgZm9sZGVyLiBJbiBhZGRpdGlvbiwgV2ViIExpYnJhcnkgUHJvamVjdHMsDQotd2hpY2ggYXJlICJ2aXJ0dWFsIiBKQVIgZmlsZXMgdGhhdCBkbyBub3QgcGh5c2ljYWxseSByZXNpZGUgaW4gdGhlIFdlYiBwcm9qZWN0LA0KLWJ1dCBhcmUgYXNzb2NpYXRlZCB3aXRoIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHByb2plY3RzIGVsc2V3aGVyZSBpbiB5b3VyIHdvcmtzcGFjZSwNCi1hcmUgaW5jbHVkZWQgaW4gdGhpcyBmb2xkZXIuIFRoZXkgYXJlIHBhY2thZ2VkIHdpdGggeW91ciBwcm9qZWN0IHdoZW4geW91DQotZXhwb3J0IHRoZSBhcHBsaWNhdGlvbidzIFdBUiBmaWxlLjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+IDxub3RlPkEgbGlicmFyeSBlbnRyeSBvbiB0aGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQgcGF0aCB3aWxsIHJlbWFpbiB0aGVyZSB1bmxlc3MNCi10aGUgYWN0dWFsIEpBUiBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgV0VCLUlORi9saWIgZm9sZGVyLiBJZiB5b3UgcmVtb3ZlDQotYSBsaWJyYXJ5IHBhdGggZW50cnkgYnV0IG5vdCB0aGUgSkFSIGZpbGUsIHRoZSBsaWJyYXJ5IGVudHJ5IHdpbGwgYmUgcmUtYWRkZWQNCi10byB0aGUgcGF0aCBhdXRvbWF0aWNhbGx5Ljwvbm90ZT48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJwcmouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWMzYjQ1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnByai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIGR5bmFtaWMsIG92ZXJ2aWV3LCBkeW5hbWljIFdlYiBwcm9qZWN0cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwcm9qZWN0cywgZHluYW1pYywgb3ZlcnZpZXcsIGR5bmFtaWMgV2ViIHByb2plY3RzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjY3dlYnByaiIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNjd2VicHJqIj48YSBuYW1lPSJjY3dlYnByaiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RHluYW1pYyBXZWIgcHJvamVjdHMgYW5kIGFwcGxpY2F0aW9uczwvaDE+Ci0KLQotPGRpdj4KLTxwPlRoZXJlIGFyZSB0d28gdHlwZXMgb2YgV2ViIHByb2plY3RzOiBkeW5hbWljIGFuZCA8YSBocmVmPSJjY3N0YXRpYy5odG1sIiB0aXRsZT0iIj5zdGF0aWM8L2E+LiBEeW5hbWljIHdlYiBwcm9qZWN0cyBjYW4gY29udGFpbgotZHluYW1pYyBKMkVFIHJlc291cmNlcyBzdWNoIGFzIHNlcnZsZXRzLCBKU1AgZmlsZXMsIGZpbHRlcnMsIGFuZCBhc3NvY2lhdGVkCi1tZXRhZGF0YSwgaW4gYWRkaXRpb24gdG8gc3RhdGljIHJlc291cmNlcyBzdWNoIGFzIGltYWdlcyBhbmQgSFRNTCBmaWxlcy4gU3RhdGljCi13ZWIgcHJvamVjdHMgb25seSBjb250YWlucyBzdGF0aWMgcmVzb3VyY2VzLiBXaGVuIHlvdSBjcmVhdGUgV2ViIHByb2plY3RzLAoteW91IGNhbiBpbmNsdWRlIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgYW5kIEpTUCB0YWcgbGlicmFyaWVzIChmb3IgZHluYW1pYwotV2ViIHByb2plY3RzKSwgc28gdGhhdCB5b3UgY2FuIGJlZ2luIGRldmVsb3BtZW50IHdpdGggYSByaWNoZXIgc2V0IG9mIHByb2plY3QKLXJlc291cmNlcy48L3A+Ci0KLTxwPkR5bmFtaWMgV2ViIHByb2plY3RzIGFyZSBhbHdheXMgaW1iZWRkZWQgaW4gRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0cy4KLVRoZSB3aXphcmQgdGhhdCB5b3UgdXNlIHRvIGNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3Qgd2lsbCBhbHNvIGNyZWF0ZSBhbgotRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiAoRUFSKSBwcm9qZWN0IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuIFRoZSB3aXphcmQKLXdpbGwgYWxzbyB1cGRhdGUgdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+YXBwbGljYXRpb24ueG1sPC9zcGFuPiBkZXBsb3ltZW50IGRlc2NyaXB0b3IKLW9mIHRoZSBzcGVjaWZpZWQgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IHRvIGRlZmluZSB0aGUgV2ViIHByb2plY3QKLWFzIGEgbW9kdWxlIGVsZW1lbnQuIElmIHlvdSBhcmUgaW1wb3J0aW5nIGEgV0FSIGZpbGUgcmF0aGVyIHRoYW4gY3JlYXRpbmcKLWEgZHluYW1pYyBXZWIgcHJvamVjdCBuZXcsIHRoZSBXQVIgSW1wb3J0IHdpemFyZCByZXF1aXJlcyB0aGF0IHlvdSBzcGVjaWZ5Ci1hIFdlYiBwcm9qZWN0LCB3aGljaCBhbHJlYWR5IHJlcXVpcmVzIGFuIEVBUiBwcm9qZWN0LiA8L3A+Ci0KLTxwPkoyRUUgY29udmVudGlvbnMgbWF5IHJlcHJlc2VudCBleHRyYSBvdmVyaGVhZCBpZiB5b3Ugb25seSB3YW50IHRvIGNyZWF0ZQotYSBzdGF0aWMsIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uLCB3aGljaCBjb250YWlucyBubyBkeW5hbWljIGZpbGVzLAotc3VjaCBhcyBKU1AgZmlsZXMgb3Igc2VydmxldHMuIEluIHRoaXMgY2FzZSwgd2hlbiB5b3UgbmVlZCBvbmx5IHRoZSBtb3N0IGJhc2ljCi1XZWIgcHJvamVjdCwgeW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSA8ZW0+c3RhdGljPC9lbT4gV2ViIHByb2plY3QgdHlwZSAoc2VlIDxhIGhyZWY9ImNjc3RhdGljLmh0bWwiIHRpdGxlPSIiPlN0YXRpYyBXZWIgcHJvamVjdHM8L2E+KS4KLSBOb3RlIHRoYXQgc3RhdGljIFdlYiBwcm9qZWN0cyBjYW4gIGJlIGNvbnZlcnRlZCB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyBieQotc2VsZWN0aW5nIDxzdHJvbmc+Q29udmVydCB0byBhIER5bmFtaWMgV2ViIFByb2plY3Q8L3N0cm9uZz4sIGZyb20gdGhlIFByb2plY3QgbWVudS48L3A+Ci0KLTxwPlRoZSBKMkVFIG1vZGVsLCBhbmQgbW9yZSBzcGVjaWZpY2FsbHksIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmHihKIgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LCBkZWZpbmVzIGEgV2ViIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdGhhdAotc3BlY2lmaWVzIHRoZSBsb2NhdGlvbiBvZiBXZWIgY29udGVudCBmaWxlcywgY2xhc3MgZmlsZXMsIGNsYXNzIHBhdGhzLCBkZXBsb3ltZW50Ci1kZXNjcmlwdG9ycywgYW5kIHN1cHBvcnRpbmcgbWV0YWRhdGEuIFRoZSBXZWIgcHJvamVjdCBoaWVyYXJjaHkgbWlycm9ycyB0aGF0Ci1vZiB0aGUgV2ViIGFwcGxpY2F0aW9uIGNyZWF0ZWQgZnJvbSBhIHByb2plY3QuIEluIHRoZSB3b3JrYmVuY2gsIHlvdSBjYW4gdXNlCi10aGUgPHNwYW4+TmV3IFdlYiBQcm9qZWN0PC9zcGFuPiB3aXphcmQgdG8gY3JlYXRlIGEgbmV3IFdlYiBwcm9qZWN0LjwvcD4KLQotPGRpdiBjbGFzcz0icCI+VGhlIG1haW4gcHJvamVjdCBmb2xkZXIgY29udGFpbnMgYWxsIGRldmVsb3BtZW50IG9iamVjdHMgcmVsYXRlZCB0byBhIFdlYgotYXBwbGljYXRpb24uIFRoZSBXZWIgY29udGVudCBmb2xkZXIgY29udGFpbnMgdGhlIGVsZW1lbnRzIG9mIHRoZSBwcm9qZWN0IG5lY2Vzc2FyeQotdG8gY3JlYXRlIGEgV2ViIGFwcGxpY2F0aW9uLiBUaGlzIGZvbGRlciBzdHJ1Y3R1cmUgbWFwcyB0byB0aGUgV2ViIGFwcGxpY2F0aW9uCi1hcmNoaXZlIChXQVIpIHN0cnVjdHVyZSBkZWZpbmVkIGJ5IFN1biBNaWNyb3N5c3RlbXMuLiBUaGUgZm9sbG93aW5nIGRlZmF1bHQKLWVsZW1lbnRzIGFyZSBsb2NhdGVkIGluIHRoZSBXZWIgcHJvamVjdCBmb2xkZXIgaGllcmFyY2h5OiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gSW4gdGhlIFByb2plY3QKLUV4cGxvcmVyIHZpZXcsIFdlYiBwcm9qZWN0cyBhcmUgZmlsdGVyZWQgaW50byBmb2xkZXIgbm9kZXMgdG8gY3VzdG9taXplIHRoZQotZGlzcGxheSBvZiBXZWIgcmVzb3VyY2VzIGZvciBlYXN5IG1hbmFnZW1lbnQgZHVyaW5nIGRldmVsb3BtZW50LiBGb3IgaW5mb3JtYXRpb24KLW9uIHRoZSBmaWx0ZXJlZCBzdHJ1Y3R1cmUsIHNlZSA8YSBocmVmPSJjY3dlYnZ3Lmh0bWwiIHRpdGxlPSIiPlByb2plY3QgRXhwbG9yZXIgdmlldzwvYT4uPC9kaXY+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+V2ViIERlcGxveW1lbnQgRGVzY3JpcHRvcjwvZHQ+Ci0KLTxkZD5UaGUgc3RhbmRhcmQgV2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAodGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+d2ViLnhtbDwvc3Bhbj4gZmlsZSkuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YVNvdXJjZTwvZHQ+Ci0KLTxkZD5Db250YWlucyB0aGUgcHJvamVjdCdzIEphdmEgc291cmNlIGNvZGUgZm9yIGNsYXNzZXMsIGJlYW5zLCBhbmQKLXNlcnZsZXRzLiBXaGVuIHRoZXNlIHJlc291cmNlcyBhcmUgYWRkZWQgdG8gYSBXZWIgcHJvamVjdCwgdGhleSBhcmUgYXV0b21hdGljYWxseQotY29tcGlsZWQgYW5kIHRoZSBnZW5lcmF0ZWQgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSBXRUItSU5GL2NsYXNzZXMgZGlyZWN0b3J5LgotVGhlIGNvbnRlbnRzIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFyZSBub3QgcGFja2FnZWQgaW4gV0FSIGZpbGVzIHVubGVzcwotYW4gb3B0aW9uIGlzIHNwZWNpZmllZCB3aGVuIGEgV0FSIGZpbGUgaXMgY3JlYXRlZC4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IFRob3VnaCB0aGUgZGVmYXVsdAotbmFtZSBnaXZlbiB0byB0aGUgZm9sZGVyIGlzIEphdmFTb3VyY2VzLCB5b3UgY2FuIGNoYW5nZSB0aGUgbmFtZSBieSByaWdodAotY2xpY2tpbmcgb24gdGhlIG5hbWUgaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgYW5kIGNsaWNraW5nIG9uIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+Ci08c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWZhY3Rvcjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZW5hbWU8L3NwYW4+PC9zcGFuPi48L2Rpdj4KLTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPmltcG9ydGVkX2NsYXNzZXMgZm9sZGVyPC9kdD4KLQotPGRkPlRoaXMgZm9sZGVyIG1heSBiZSBjcmVhdGVkIGR1cmluZyBhIFdBUiBpbXBvcnQsIGFuZCBjb250YWlucyBjbGFzcyBmaWxlcwotdGhhdCBkbyBub3QgaGF2ZSBhY2NvbXBhbnlpbmcgc291cmNlLiAgVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmltcG9ydGVkX2NsYXNzZXM8L3NwYW4+IGZvbGRlcgotaXMgYSBKYXZhIGNsYXNzZXMKLWZvbGRlcjsgSmF2YSBjbGFzc2VzIGZvbGRlcnMgY2FuIGFsc28gYmUgY3JlYXRlZCB1c2luZyB0aGUgV2ViCi1wcm9qZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkphdmEgQnVpbGQgUGF0aDwvc3Bhbj4gcHJvcGVydGllcyBwYWdlLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPldlYkNvbnRlbnQgZm9sZGVyPC9kdD4KLQotPGRkPlRoZSBtYW5kYXRvcnkgbG9jYXRpb24gb2YgYWxsIFdlYiByZXNvdXJjZXMsIGluY2x1ZGluZyBIVE1MLCBKU1AsIGdyYXBoaWMKLWZpbGVzLCBhbmQgc28gb24uIElmIHRoZSBmaWxlcyBhcmUgbm90IHBsYWNlZCBpbiB0aGlzIGRpcmVjdG9yeSAob3IgaW4gYSBzdWJkaXJlY3RvcnkKLXN0cnVjdHVyZSB1bmRlciB0aGlzIGRpcmVjdG9yeSksIHRoZSBmaWxlcyB3aWxsIG5vdCBiZSBhdmFpbGFibGUgd2hlbiB0aGUKLWFwcGxpY2F0aW9uIGlzIGV4ZWN1dGVkIG9uIGEgc2VydmVyLiBUaGUgV2ViIGNvbnRlbnQgZm9sZGVyIHJlcHJlc2VudHMgdGhlCi1jb250ZW50cyBvZiB0aGUgV0FSIGZpbGUgdGhhdCB3aWxsIGJlIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIEFueSBmaWxlcyBub3QKLXVuZGVyIHRoZSBXZWIgY29udGVudCBmb2xkZXIgYXJlIGNvbnNpZGVyZWQgZGV2ZWxvcG1lbnQtdGltZSByZXNvdXJjZXMgKGZvcgotZXhhbXBsZSwgLmphdmEgZmlsZXMsIC5zcWwgZmlsZXMsIGFuZCAubWlmIGZpbGVzKSwgYW5kIGFyZSBub3QgZGVwbG95ZWQgd2hlbgotdGhlIHByb2plY3QgaXMgdW5pdCB0ZXN0ZWQgb3IgcHVibGlzaGVkLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhvdWdoIHRoZSBkZWZhdWx0IG5hbWUgZ2l2ZW4KLXRvIHRoZSBmb2xkZXIgaXMgPHNwYW4gY2xhc3M9ImZpbGVwYXRoIj5XZWJDb250ZW50PC9zcGFuPiwgeW91IGNhbiBjaGFuZ2UgdGhlIG5hbWUKLSBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciBieSByaWdodC1jbGlja2luZyB0aGUgZm9sZGVyIGFuZCBzZWxlY3RpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmYWN0b3I8L3NwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVuYW1lPC9zcGFuPiBvcgotZnJvbSB0aGUgV2ViIHBhZ2Ugb2YgdGhlIHByb2plY3QncyBQcm9wZXJ0aWVzIGRpYWxvZy4gSW4gYSBkeW5hbWljIFdlYiBwcm9qZWN0LAotY2hhbmdpbmcgdGhlIGZvbGRlciBuYW1lIHdpbGwgdXBkYXRlIHRoZSBKYXZhIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkuIDwvZGl2PgotPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+TUVUQS1JTkY8L2R0PgotCi08ZGQ+VGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+TUFOSUZFU1QuTUY8L3NwYW4+IGZpbGUsIHdoaWNoCi1pcyB1c2VkIHRvIG1hcCBjbGFzcyBwYXRocyBmb3IgZGVwZW5kZW50IEpBUiBmaWxlcyB0aGF0IGV4aXN0IGluIG90aGVyIHByb2plY3RzCi1pbiB0aGUgc2FtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuIEFuIGVudHJ5IGluIHRoaXMgZmlsZSB3aWxsIHVwZGF0ZQotdGhlIHJ1bi10aW1lIHByb2plY3QgY2xhc3MgcGF0aCBhbmQgSmF2YSBidWlsZCBzZXR0aW5ncyB0byBpbmNsdWRlIHRoZSByZWZlcmVuY2VkCi1KQVIgZmlsZXMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+dGhlbWU8L2R0PgotCi08ZGQ+VGhlIHN1Z2dlc3RlZCBkaXJlY3RvcnkgZm9yIGNhc2NhZGluZyBzdHlsZSBzaGVldHMgYW5kIG90aGVyIHN0eWxlLXJlbGF0ZWQKLW9iamVjdHMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+V0VCLUlORjwvZHQ+Ci0KLTxkZD5CYXNlZCBvbiB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LCB0aGlzCi1kaXJlY3RvcnkgY29udGFpbnMgdGhlIHN1cHBvcnRpbmcgV2ViIHJlc291cmNlcyBmb3IgYSBXZWIgYXBwbGljYXRpb24sIGluY2x1ZGluZwotdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+d2ViLnhtbDwvc3Bhbj4gZmlsZSBhbmQgdGhlIGNsYXNzZXMgYW5kIGxpYiBkaXJlY3Rvcmllcy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj4vY2xhc3NlczwvZHQ+Ci0KLTxkZD5UaGlzIGRpcmVjdG9yeSBpcyBmb3Igc2VydmxldHMsIHV0aWxpdHkgY2xhc3NlcywgYW5kIHRoZSBKYXZhIGNvbXBpbGVyCi1vdXRwdXQgZGlyZWN0b3J5LiBUaGUgY2xhc3NlcyBpbiB0aGlzIGRpcmVjdG9yeSBhcmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24KLWNsYXNzIGxvYWRlciB0byBsb2FkIHRoZSBjbGFzc2VzLiBGb2xkZXJzIGluIHRoaXMgZGlyZWN0b3J5IHdpbGwgbWFwIHBhY2thZ2UKLWFuZCBjbGFzcyBuYW1lcywgYXMgaW46IDxzYW1wIGNsYXNzPSJjb2RlcGgiPi9XRUItSU5GL2NsYXNzZXMvY29tL215Y29ycC9zZXJ2bGV0cy9NeVNlcnZsZXQuY2xhc3M8L3NhbXA+LjxwPkRvCi1ub3QgcGxhY2UgYW55IC5jbGFzcyBmaWxlcyBkaXJlY3RseSBpbnRvIHRoaXMgZGlyZWN0b3J5LiBUaGUgLmNsYXNzIGZpbGVzCi1hcmUgcGxhY2VkIGluIHRoaXMgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgSmF2YSBjb21waWxlcgotY29tcGlsZXMgSmF2YSBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgaW4gdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+SmF2YSBSZXNvdXJjZXM8L3NwYW4+IGRpcmVjdG9yeS4KLUFueSBmaWxlcyBwbGFjZWQgZGlyZWN0bHkgaW4gdGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBkZWxldGVkIGJ5IHRoZSBKYXZhIGNvbXBpbGVyCi13aGVuIGl0IHJ1bnMuPC9wPgotPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+L2xpYjwvZHQ+Ci0KLTxkZD5UaGUgc3VwcG9ydGluZyBKQVIgZmlsZXMgdGhhdCB5b3VyIFdlYiBhcHBsaWNhdGlvbiByZWZlcmVuY2VzLiBBbnkgY2xhc3NlcwotaW4gLmphciBmaWxlcyBwbGFjZWQgaW4gdGhpcyBkaXJlY3Rvcnkgd2lsbCBiZSBhdmFpbGFibGUgZm9yIHlvdXIgV2ViIGFwcGxpY2F0aW9uPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+TGlicmFyaWVzPC9kdD4KLQotPGRkPlRoZSBzdXBwb3J0aW5nIEpBUiBmaWxlcyB0aGF0IHlvdXIgV2ViIGFwcGxpY2F0aW9uIHJlZmVyZW5jZXMuIFRoaXMgZm9sZGVyCi1taXJyb3JzIHRoZSBjb250ZW50IG9mIHRoZSBsaWIgZm9sZGVyLiBJbiBhZGRpdGlvbiwgV2ViIExpYnJhcnkgUHJvamVjdHMsCi13aGljaCBhcmUgInZpcnR1YWwiIEpBUiBmaWxlcyB0aGF0IGRvIG5vdCBwaHlzaWNhbGx5IHJlc2lkZSBpbiB0aGUgV2ViIHByb2plY3QsCi1idXQgYXJlIGFzc29jaWF0ZWQgd2l0aCBKYXZhIHByb2plY3RzIGVsc2V3aGVyZSBpbiB5b3VyIHdvcmtzcGFjZSwKLWFyZSBpbmNsdWRlZCBpbiB0aGlzIGZvbGRlci4gVGhleSBhcmUgcGFja2FnZWQgd2l0aCB5b3VyIHByb2plY3Qgd2hlbiB5b3UKLWV4cG9ydCB0aGUgYXBwbGljYXRpb24ncyBXQVIgZmlsZS48L2RkPgotCi08L2RsPgotIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGxpYnJhcnkgZW50cnkgb24gdGhlIEphdmEgYnVpbGQgcGF0aCB3aWxsIHJlbWFpbiB0aGVyZSB1bmxlc3MKLXRoZSBhY3R1YWwgSkFSIGZpbGUgaXMgZGVsZXRlZCBmcm9tIHRoZSBXRUItSU5GL2xpYiBmb2xkZXIuIElmIHlvdSByZW1vdmUKLWEgbGlicmFyeSBwYXRoIGVudHJ5IGJ1dCBub3QgdGhlIEpBUiBmaWxlLCB0aGUgbGlicmFyeSBlbnRyeSB3aWxsIGJlIHJlLWFkZGVkCi10byB0aGUgcGF0aCBhdXRvbWF0aWNhbGx5LjwvZGl2PgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2NzY5YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3ZWJ2dy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDYsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjY3dlYnZ3IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudDwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+UHJvamVjdCBFeHBsb3JlciB2aWV3PGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+V2ViIHBlcnNwZWN0aXZlPGluZGV4dGVybT5wcm9qZWN0IGV4cGxvcmVyIHZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPnZlcnNpb24gY29udHJvbCBtYW5hZ2VtZW50PGluZGV4dGVybT50dXJuaW5nIG9uIGFuZCBvZmY8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBkZXZlbG9wbWVudDxpbmRleHRlcm0+UHJvamVjdCBFeHBsb3JlciB2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT52ZXJzaW9uIGNvbnRyb2wgbWFuYWdlbWVudDxpbmRleHRlcm0+dHVybmluZyBvbiBhbmQgb2ZmPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxzZWN0aW9uPjxwPlRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBub3RhYmxlIGZlYXR1cmVzOiA8dWw+DQotPGxpPjxpbWFnZSBhbHQ9IkZvciBXaW5kb3dzIiBocmVmPSIuLi9pbWFnZXMvbndpbi5naWYiIHBsYWNlbWVudD0iaW5saW5lIj4NCi08L2ltYWdlPiBZb3UgY2FuIGRyYWcgYW5kIGRyb3AgZmlsZXMgZnJvbSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iTWljcm9zb2Z0IENvcnBvcmF0aW9uIg0KLXRtdHlwZT0icmVnIiB0cmFkZW1hcms9IldpbmRvd3MiPldpbmRvd3M8L3RtPiBFeHBsb3JlciBvciB0aGUgZGVza3RvcCBpbnRvDQotdGhlIE5hdmlnYXRvciB2aWV3LjwvbGk+DQotPGxpPlZpZXcgZmlsdGVyaW5nIGlzIHN1cHBvcnRlZCBieSBzZWxlY3RpbmcgPHBoPjx1aWNvbnRyb2w+RmlsdGVyczwvdWljb250cm9sPjwvcGg+IGZyb20NCi10aGUgTmF2aWdhdG9yIHZpZXcgPHBoPjx1aWNvbnRyb2w+TWVudTwvdWljb250cm9sPjwvcGg+IGJ1dHRvbi4gUmVzb3VyY2VzDQotY2FuIGJlIGZpbHRlcmVkIGJ5IG5hbWUsIHByb2plY3QgdHlwZSBvciBjb250ZW50IHR5cGUuIEZpbGVzIGJlZ2lubmluZyB3aXRoDQotYSBwZXJpb2QgYXJlIGZpbHRlcmVkIG91dCBieSBkZWZhdWx0LjwvbGk+DQotPGxpPlRoZSBzdGF0dXMgbGluZSBzaG93cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZS48L2xpPg0KLTxsaT5EcmFnZ2luZyBhIC5qYXZhIGZpbGUgZnJvbSB0aGUgTmF2aWdhdG9yIHZpZXcgaW50byBhIEpTUCBmaWxlIHdpbGwgaW5zZXJ0DQotYSB1c2ViZWFuIHRhZywgdGhlIHNhbWUgYmVoYXZpb3IgdGhhdCBpcyBleGhpYml0ZWQgd2hlbiBhIC5jbGFzcyBmaWxlIGlzIGRyYWdnZWQNCi1pbnRvIGEgSlNQIGZpbGUuPC9saT4NCi08bGk+RXJyb3JzIGFuZCB3YXJuaW5ncyBvbiByZXNvdXJjZXMgKGluY2x1ZGluZyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiwgSFRNTC9KU1AsIGFuZCBMaW5rcyBCdWlsZGVyIGVycm9ycw0KLWFuZCB3YXJuaW5ncykgYXJlIGluZGljYXRlZCB3aXRoIGEgcmVkIGVycm9yIDxpbWFnZSBhbHQ9IkVycm9yIGljb24iIGhyZWY9Ii4uL2ltYWdlcy9uc2hvd2Vyci5naWYiDQotcGxhY2VtZW50PSJpbmxpbmUiPjwvaW1hZ2U+IG9yIHllbGxvdyB3YXJuaW5nIDxpbWFnZSBhbHQ9Ildhcm5pbmcgaWNvbiIgaHJlZj0iLi4vaW1hZ2VzL253YXJuaW5nLmdpZiINCi1wbGFjZW1lbnQ9ImlubGluZSI+PC9pbWFnZT4gbmV4dCB0byB0aGUgcmVzb3VyY2Ugd2l0aCB0aGUgZXJyb3IsIGFzIHdlbGwgYXMNCi10aGUgcGFyZW50IGNvbnRhaW5lcnMgdXAgdG8gdGhlIHByb2plY3QuIFRoaXMgYXBwbGllcyBmb3IgYWxsIHByb2plY3QgdHlwZXMsDQotbm90IG9ubHkgV2ViIHByb2plY3RzLjwvbGk+DQotPGxpPkl0ZW1zIGF2YWlsYWJsZSBmcm9tIHRoZSA8cGg+PHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48L3BoPiBjYXNjYWRpbmcNCi1tZW51IGluIHRoZSBwcm9qZWN0IHBvcC11cCBtZW51IGFyZSBjb250ZXh0IHNlbnNpdGl2ZS4gIEFsbCBtZW51cyB3aWxsIGhhdmUgPHBoPjx1aWNvbnRyb2w+UHJvamVjdDwvdWljb250cm9sPjwvcGg+IGFuZCA8cGg+PHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sDQotPjwvcGg+IG9wdGlvbnMuPC9saT4NCi08L3VsPjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPk9yZ2FuaXphdGlvbiBvZiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC90aXRsZT48cD5UaGUgUHJvamVjdA0KLUV4cGxvcmVyIHZpZXcgc2hvd3MgYSBjdXN0b20gdmlldyBvZiBhbGwgV2ViIHByb2plY3RzLiBUaGUgZm9sbG93aW5nIGFyZSBzb21lDQotb2YgdGhlIG5vdGFibGUgdG9wLWxldmVsIG9iamVjdHMgdGhhdCBhcHBlYXIgYmVuZWF0aCB0aGUgcHJvamVjdCBub2RlIChiYXNlZA0KLW9uIGRlZmF1bHQgZm9sZGVyIG5hbWVzKS48L3A+PHA+PGI+V2ViIGNvbnRlbnQgZm9sZGVyPC9iPiAtIFRoaXMgZm9sZGVyIGNvbnRhaW5zDQotaXRlbXMgdG8gYmUgcHVibGlzaGVkIHRvIHRoZSBzZXJ2ZXIuIEJ5IGRlZmF1bHQsIHRoaXMgZm9sZGVyIHdpbGwgYmUgbmFtZWQgPGI+V2ViQ29udGVudDwvYj4gZm9yDQotbmV3bHkgY3JlYXRlZCBzdGF0aWMgYW5kIGR5bmFtaWMgV2ViIHByb2plY3RzLiA8bm90ZT5Zb3UgY2FuIGNoYW5nZSB0aGUgbmFtZQ0KLWluIHRoZSBjcmVhdGlvbiB3aXphcmQgV2ViIGZhY2V0IHBhZ2UuPC9ub3RlPjx1bD4NCi08bGk+PGI+TUVUQS1JTkY8L2I+IC0gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIDxmaWxlcGF0aD5NQU5JRkVTVC5NRjwvZmlsZXBhdGg+IGZpbGUsDQotd2hpY2ggaXMgdXNlZCB0byBtYXAgY2xhc3MgcGF0aHMgZm9yIGRlcGVuZGVudCBKQVIgZmlsZXMgdGhhdCBleGlzdCBpbiBvdGhlcg0KLXByb2plY3RzIGluIHRoZSBzYW1lIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdC4gQW4gZW50cnkgaW4gdGhpcyBmaWxlDQotd2lsbCB1cGRhdGUgdGhlIHJ1bi10aW1lIHByb2plY3QgY2xhc3MgcGF0aCBhbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQgc2V0dGluZ3MgdG8gaW5jbHVkZSB0aGUgcmVmZXJlbmNlZA0KLUpBUiBmaWxlcy48L2xpPg0KLTwvdWw+PHVsPg0KLTxsaT48Yj5XRUItSU5GPC9iPiAtIFRoZSBkaXJlY3Rvcnkgd2hlcmUgc3VwcG9ydGluZyBXZWIgcmVzb3VyY2VzIGZvciBhIFdlYg0KLWFwcGxpY2F0aW9uIGFyZSBrZXB0IChmb3IgZXhhbXBsZTogLnhtaSBmaWxlcywgLnhtbCBmaWxlcywgYW5kIHdlYi54bWwuKSA8L2xpPg0KLTwvdWw+IDwvcD4gPC9zZWN0aW9uPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3dlYnZ3Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjdkNmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd2VidncuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlByb2plY3QgRXhwbG9yZXIgdmlldyBhbmQgV2ViIGRldmVsb3BtZW50IiAvPgotPG1ldGEgY29udGVudD0iUHJvamVjdCBFeHBsb3JlciB2aWV3LCBvdmVydmlldywgV2ViIHBlcnNwZWN0aXZlLCBwcm9qZWN0IGV4cGxvcmVyIHZpZXcsIHZlcnNpb24gY29udHJvbCBtYW5hZ2VtZW50LCB0dXJuaW5nIG9uIGFuZCBvZmYsIFdlYiBkZXZlbG9wbWVudCIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlByb2plY3QgRXhwbG9yZXIgdmlldywgb3ZlcnZpZXcsIFdlYiBwZXJzcGVjdGl2ZSwgcHJvamVjdCBleHBsb3JlciB2aWV3LCB2ZXJzaW9uIGNvbnRyb2wgbWFuYWdlbWVudCwgdHVybmluZyBvbiBhbmQgb2ZmLCBXZWIgZGV2ZWxvcG1lbnQiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImNjd2VidnciIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Qcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY2N3ZWJ2dyI+PGEgbmFtZT0iY2N3ZWJ2dyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQ8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJwIj5UaGUgUHJvamVjdCBFeHBsb3JlciB2aWV3IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgbm90YWJsZSBmZWF0dXJlczogPHVsPgotPGxpPjxpbWcgc3JjPSIuLi9pbWFnZXMvbndpbi5naWYiIGFsdD0iRm9yIFdpbmRvd3MiIC8+IFlvdSBjYW4gZHJhZyBhbmQgZHJvcCBmaWxlcyBmcm9tIFdpbmRvd3M8c3VwPsKuPC9zdXA+IEV4cGxvcmVyIG9yIHRoZSBkZXNrdG9wIGludG8KLXRoZSBOYXZpZ2F0b3Igdmlldy48L2xpPgotCi08bGk+VmlldyBmaWx0ZXJpbmcgaXMgc3VwcG9ydGVkIGJ5IHNlbGVjdGluZyA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWx0ZXJzPC9zcGFuPjwvc3Bhbj4gZnJvbQotdGhlIE5hdmlnYXRvciB2aWV3IDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1lbnU8L3NwYW4+PC9zcGFuPiBidXR0b24uIFJlc291cmNlcwotY2FuIGJlIGZpbHRlcmVkIGJ5IG5hbWUsIHByb2plY3QgdHlwZSBvciBjb250ZW50IHR5cGUuIEZpbGVzIGJlZ2lubmluZyB3aXRoCi1hIHBlcmlvZCBhcmUgZmlsdGVyZWQgb3V0IGJ5IGRlZmF1bHQuPC9saT4KLQotPGxpPlRoZSBzdGF0dXMgbGluZSBzaG93cyB0aGUgZnVsbCBwYXRoIG9mIHRoZSBzZWxlY3RlZCByZXNvdXJjZS48L2xpPgotCi08bGk+RHJhZ2dpbmcgYSAuamF2YSBmaWxlIGZyb20gdGhlIE5hdmlnYXRvciB2aWV3IGludG8gYSBKU1AgZmlsZSB3aWxsIGluc2VydAotYSB1c2ViZWFuIHRhZywgdGhlIHNhbWUgYmVoYXZpb3IgdGhhdCBpcyBleGhpYml0ZWQgd2hlbiBhIC5jbGFzcyBmaWxlIGlzIGRyYWdnZWQKLWludG8gYSBKU1AgZmlsZS48L2xpPgotCi08bGk+RXJyb3JzIGFuZCB3YXJuaW5ncyBvbiByZXNvdXJjZXMgKGluY2x1ZGluZyBKYXZh4oSiLCBIVE1ML0pTUCwgYW5kIExpbmtzIEJ1aWxkZXIgZXJyb3JzCi1hbmQgd2FybmluZ3MpIGFyZSBpbmRpY2F0ZWQgd2l0aCBhIHJlZCBlcnJvciA8aW1nIHNyYz0iLi4vaW1hZ2VzL25zaG93ZXJyLmdpZiIgYWx0PSJFcnJvciBpY29uIiAvPiBvciB5ZWxsb3cgd2FybmluZyA8aW1nIHNyYz0iLi4vaW1hZ2VzL253YXJuaW5nLmdpZiIgYWx0PSJXYXJuaW5nIGljb24iIC8+IG5leHQgdG8gdGhlIHJlc291cmNlIHdpdGggdGhlIGVycm9yLCBhcyB3ZWxsIGFzCi10aGUgcGFyZW50IGNvbnRhaW5lcnMgdXAgdG8gdGhlIHByb2plY3QuIFRoaXMgYXBwbGllcyBmb3IgYWxsIHByb2plY3QgdHlwZXMsCi1ub3Qgb25seSBXZWIgcHJvamVjdHMuPC9saT4KLQotPGxpPkl0ZW1zIGF2YWlsYWJsZSBmcm9tIHRoZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+PC9zcGFuPiBjYXNjYWRpbmcKLW1lbnUgaW4gdGhlIHByb2plY3QgcG9wLXVwIG1lbnUgYXJlIGNvbnRleHQgc2Vuc2l0aXZlLiAgQWxsIG1lbnVzIHdpbGwgaGF2ZSA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9qZWN0PC9zcGFuPjwvc3Bhbj4gYW5kIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk90aGVyPC9zcGFuPjwvc3Bhbj4gb3B0aW9ucy48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPk9yZ2FuaXphdGlvbiBvZiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3PC9oND48cD5UaGUgUHJvamVjdAotRXhwbG9yZXIgdmlldyBzaG93cyBhIGN1c3RvbSB2aWV3IG9mIGFsbCBXZWIgcHJvamVjdHMuIFRoZSBmb2xsb3dpbmcgYXJlIHNvbWUKLW9mIHRoZSBub3RhYmxlIHRvcC1sZXZlbCBvYmplY3RzIHRoYXQgYXBwZWFyIGJlbmVhdGggdGhlIHByb2plY3Qgbm9kZSAoYmFzZWQKLW9uIGRlZmF1bHQgZm9sZGVyIG5hbWVzKS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48c3Ryb25nPldlYiBjb250ZW50IGZvbGRlcjwvc3Ryb25nPiAtIFRoaXMgZm9sZGVyIGNvbnRhaW5zCi1pdGVtcyB0byBiZSBwdWJsaXNoZWQgdG8gdGhlIHNlcnZlci4gQnkgZGVmYXVsdCwgdGhpcyBmb2xkZXIgd2lsbCBiZSBuYW1lZCA8c3Ryb25nPldlYkNvbnRlbnQ8L3N0cm9uZz4gZm9yCi1uZXdseSBjcmVhdGVkIHN0YXRpYyBhbmQgZHluYW1pYyBXZWIgcHJvamVjdHMuIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIGNoYW5nZSB0aGUgbmFtZQotaW4gdGhlIGNyZWF0aW9uIHdpemFyZCBXZWIgZmFjZXQgcGFnZS48L2Rpdj4KLTx1bD4KLTxsaT48c3Ryb25nPk1FVEEtSU5GPC9zdHJvbmc+IC0gVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+TUFOSUZFU1QuTUY8L3NwYW4+IGZpbGUsCi13aGljaCBpcyB1c2VkIHRvIG1hcCBjbGFzcyBwYXRocyBmb3IgZGVwZW5kZW50IEpBUiBmaWxlcyB0aGF0IGV4aXN0IGluIG90aGVyCi1wcm9qZWN0cyBpbiB0aGUgc2FtZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QuIEFuIGVudHJ5IGluIHRoaXMgZmlsZQotd2lsbCB1cGRhdGUgdGhlIHJ1bi10aW1lIHByb2plY3QgY2xhc3MgcGF0aCBhbmQgSmF2YSBidWlsZCBzZXR0aW5ncyB0byBpbmNsdWRlIHRoZSByZWZlcmVuY2VkCi1KQVIgZmlsZXMuPC9saT4KLQotPC91bD4KLTx1bD4KLTxsaT48c3Ryb25nPldFQi1JTkY8L3N0cm9uZz4gLSBUaGUgZGlyZWN0b3J5IHdoZXJlIHN1cHBvcnRpbmcgV2ViIHJlc291cmNlcyBmb3IgYSBXZWIKLWFwcGxpY2F0aW9uIGFyZSBrZXB0IChmb3IgZXhhbXBsZTogLnhtaSBmaWxlcywgLnhtbCBmaWxlcywgYW5kIHdlYi54bWwuKSA8L2xpPgotCi08L3VsPgotIDwvZGl2PgotIDwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2Njd3RvdmVyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzNjJjYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgMTk4OC0yMDAyLCB2LjQwMDIgLS0+DQotPGNvbmNlcHQgaWQ9ImNjd3RvdmVyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5kZXZlbG9wbWVudCBwaGFzZXM8aW5kZXh0ZXJtPldlYiBhcHBsaWNhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmluZm9ybWF0aW9uIHBhdGh3YXlzPGluZGV4dGVybT5XZWIgYXBwbGljYXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIHRvb2xzIHlvdSBuZWVkIHRvIGRldmVsb3ANCi1XZWIgYXBwbGljYXRpb25zIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gU2VydmxldA0KLTIuMyBTcGVjaWZpY2F0aW9uPC9jaXRlPiBhbmQgdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPi4NCi1XZWIgYXBwbGljYXRpb25zIGNhbiBiZSBzaW1wbGUgKGNvbnNpc3Rpbmcgb2Ygb25seSBzdGF0aWMgV2ViIHBhZ2VzKSBvciB0aGV5DQotY2FuIGJlIG1vcmUgYWR2YW5jZWQgYW5kIGluY2x1ZGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyBhbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gc2VydmxldHMuDQotVGhlc2UgcmVzb3VyY2VzLCBhbG9uZyB3aXRoIGFuIFhNTCBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKGFuZCBvdGhlciA8eHJlZg0KLWhyZWY9ImN3ZWJyZXNvdXJjZXMuZGl0YSIgc2NvcGU9InBlZXIiPjxkZXNjPjwvZGVzYz4gV2ViIHJlc291cmNlczwveHJlZj4sIGFyZSBjb250YWluZWQNCi13aXRoaW4gYSBXZWIgcHJvamVjdCBkdXJpbmcgZGV2ZWxvcG1lbnQuIFdoZW4geW91IGFyZSByZWFkeSB0byBwdWJsaXNoIHRoZQ0KLVdlYiBhcHBsaWNhdGlvbiB0byB0aGUgV2ViLCB5b3UgZGVwbG95IHRoZSBXZWIgcHJvamVjdCB0byB0aGUgc2VydmVyIGluIHRoZQ0KLWZvcm0gb2YgYSBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlIC4gVGhlIGVuZCB1c2VyIGNhbiB0aGVuIHZpZXcgdGhlIFdlYiBhcHBsaWNhdGlvbg0KLWFzIGEgV2ViIHNpdGUgZnJvbSBhIFVSTC48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY2N3dG92ZXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3d0b3Zlci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmJmNjliLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jY3d0b3Zlci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3IiAvPgotPG1ldGEgY29udGVudD0iV2ViIGFwcGxpY2F0aW9ucywgb3ZlcnZpZXcsIGRldmVsb3BtZW50IHBoYXNlcywgaW5mb3JtYXRpb24gcGF0aHdheXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgYXBwbGljYXRpb25zLCBvdmVydmlldywgZGV2ZWxvcG1lbnQgcGhhc2VzLCBpbmZvcm1hdGlvbiBwYXRod2F5cyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY2N3dG92ZXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5XZWIgYXBwbGljYXRpb24gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImNjd3RvdmVyIj48YSBuYW1lPSJjY3d0b3ZlciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIGFwcGxpY2F0aW9uIG92ZXJ2aWV3PC9oMT4KLQotCi08ZGl2PgotPHA+VGhlIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBwcm92aWRlcyB0aGUgdG9vbHMgeW91IG5lZWQgdG8gZGV2ZWxvcAotV2ViIGFwcGxpY2F0aW9ucyBhcyBkZWZpbmVkIGluIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEphdmHihKIgU2VydmxldAotMi4zIFNwZWNpZmljYXRpb248L2NpdGU+IGFuZCB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKU1AgMS4yIFNwZWNpZmljYXRpb248L2NpdGU+LgotV2ViIGFwcGxpY2F0aW9ucyBjYW4gYmUgc2ltcGxlIChjb25zaXN0aW5nIG9mIG9ubHkgc3RhdGljIFdlYiBwYWdlcykgb3IgdGhleQotY2FuIGJlIG1vcmUgYWR2YW5jZWQgYW5kIGluY2x1ZGUgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlcyBhbmQgSmF2YSBzZXJ2bGV0cy4KLVRoZXNlIHJlc291cmNlcywgYWxvbmcgd2l0aCBhbiBYTUwgZGVwbG95bWVudCBkZXNjcmlwdG9yIChhbmQgb3RoZXIgPGEgaHJlZj0iY3dlYnJlc291cmNlcy5odG1sIiB0aXRsZT0iIj5XZWIgcmVzb3VyY2VzPC9hPiwgYXJlIGNvbnRhaW5lZAotd2l0aGluIGEgV2ViIHByb2plY3QgZHVyaW5nIGRldmVsb3BtZW50LiBXaGVuIHlvdSBhcmUgcmVhZHkgdG8gcHVibGlzaCB0aGUKLVdlYiBhcHBsaWNhdGlvbiB0byB0aGUgV2ViLCB5b3UgZGVwbG95IHRoZSBXZWIgcHJvamVjdCB0byB0aGUgc2VydmVyIGluIHRoZQotZm9ybSBvZiBhIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUgLiBUaGUgZW5kIHVzZXIgY2FuIHRoZW4gdmlldyB0aGUgV2ViIGFwcGxpY2F0aW9uCi1hcyBhIFdlYiBzaXRlIGZyb20gYSBVUkwuPC9wPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2NwZGpzcHMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjMmNlYmUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2NwZGpzcHMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3BkanNwcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5PC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5KYXZhU2VydmVyIHBhZ2VzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+ZHluYW1pYyBXZWIgY29udGVudDxpbmRleHRlcm0+Z2VuZXJhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgSmF2YVNlcnZlciBQYWdlcyB0ZWNobm9sb2d5IGVuYWJsZXMgeW91IHRvIGdlbmVyYXRlIGR5bmFtaWMgd2ViIGNvbnRlbnQsDQotc3VjaCBhcyBIVE1MLCBESFRNTCwgWEhUTUwsIGFuZCBYTUwgZmlsZXMsIHRvIGluY2x1ZGUgaW4gYSBXZWIgYXBwbGljYXRpb24uDQotSlNQIGZpbGVzIGFyZSBvbmUgd2F5IHRvIGltcGxlbWVudCBzZXJ2ZXItc2lkZSBkeW5hbWljIHBhZ2UgY29udGVudC4gSlNQIGZpbGVzDQotYWxsb3cgYSBXZWIgc2VydmVyLCBzdWNoIGFzIEFwYWNoZSBUb21jYXQsIHRvIGFkZCBjb250ZW50IGR5bmFtaWNhbGx5IHRvIHlvdXINCi1IVE1MIHBhZ2VzIGJlZm9yZSB0aGV5IGFyZSBzZW50IHRvIGEgcmVxdWVzdGluZyBicm93c2VyLjwvcD4NCi08cD5XaGVuIHlvdSBkZXBsb3kgYSBKU1AgZmlsZSB0byBhIFdlYiBzZXJ2ZXIgdGhhdCBwcm92aWRlcyBhIHNlcnZsZXQgZW5naW5lLA0KLWl0IGlzIHByZXByb2Nlc3NlZCBpbnRvIGEgc2VydmxldCB0aGF0IHJ1bnMgb24gdGhlIFdlYiBzZXJ2ZXIuIFRoaXMgaXMgaW4NCi1jb250cmFzdCB3aXRoIGNsaWVudC1zaWRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+ICh3aXRoaW4gPGNvZGVwaD4mbHQ7U0NSSVBUPjwvY29kZXBoPiB0YWdzKSwNCi13aGljaCBpcyBydW4gaW4gYSBicm93c2VyLiBBIEpTUCBwYWdlIGlzIGlkZWFsIGZvciB0YXNrcyB0aGF0IGFyZSBiZXR0ZXIgc3VpdGVkDQotdG8gZXhlY3V0aW9uIG9uIHRoZSBzZXJ2ZXIsIHN1Y2ggYXMgYWNjZXNzaW5nIGRhdGFiYXNlcyBvciBjYWxsaW5nIEVudGVycHJpc2UgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYmVhbnMuPC9wPg0KLTxwPllvdSBjYW4gY3JlYXRlIGFuZCBlZGl0IGEgSlNQIGZpbGUgaW4gdGhlIEhUTUwgZWRpdG9yIGJ5IGFkZGluZyB5b3VyIG93bg0KLXRleHQgYW5kIGltYWdlcyB1c2luZyBIVE1MLCBKU1AgdGFnZ2luZywgb3IgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sIGluY2x1ZGluZyA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzb3VyY2UNCi1jb2RlIGluc2lkZSBvZiBzY3JpcHRsZXQgdGFncy4gVHlwaWNhbGx5LCBKU1AgZmlsZXMgaGF2ZSB0aGUgZmlsZSBleHRlbnNpb24NCi0uanNwLiBBZGRpdGlvbmFsbHksIHRoZSBKU1Agc3BlY2lmaWNhdGlvbiBzdWdnZXN0cyB0aGF0IEpTUCBmcmFnbWVudCBmaWxlcw0KLXNob3VsZCBoYXZlIGZpbGUgZXh0ZW5zaW9uIC5qc3BmLiBJZiB0aGlzIGNvbnZlbnRpb24gaXMgbm90IGZvbGxvd2VkLCB0aGUNCi1KU1AgdmFsaWRhdG9yIHdpbGwgdHJlYXQgSlNQIGZyYWdtZW50cyBhcyByZWd1bGFyIHN0YW5kYWxvbmUgSlNQIGZpbGVzLCBhbmQNCi1jb21waWxhdGlvbiBlcnJvcnMgbWlnaHQgYmUgcmVwb3J0ZWQuPC9wPg0KLTxwPlRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIEpTUCAxLjIgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gcHJvdmlkZXMgdGhlIGFiaWxpdHkNCi10byBjcmVhdGUgY3VzdG9tIEpTUCB0YWdzLiBDdXN0b20gdGFncyBzaW1wbGlmeSBjb21wbGV4IGFjdGlvbnMgYW5kICBwcm92aWRlDQotZGV2ZWxvcGVycyB3aXRoIGdyZWF0ZXIgY29udHJvbCBvdmVyIHBhZ2UgY29udGVudC4gQ3VzdG9tIHRhZ3MgYXJlIGNvbGxlY3RlZA0KLWludG8gYSBsaWJyYXJ5ICh0YWdsaWIpLiBBIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZmlsZSAodGFnbGliLnRsZCkgaXMgYW4NCi1YTUwgZG9jdW1lbnQgdGhhdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFnIGxpYnJhcnksIGluY2x1ZGluZyB0aGUNCi10YWdsaWIgc2hvcnQgbmFtZSwgbGlicmFyeSBkZXNjcmlwdGlvbiwgYW5kIHRhZyBkZXNjcmlwdGlvbnMuIFJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4NCi1NaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPiBmb3IgbW9yZSBkZXRhaWxzLjwvcD4NCi08cD5UbyB1c2UgSlNQIDEuMiBjdXN0b20gdGFnbGlicywgeW91IGNhbiBpbXBvcnQgdGhlIHRhZyBsaWJyYXJ5IC50bGQgYW5kDQotLmphciBmaWxlcyBpbnRvIHlvdXIgcHJvamVjdCB0byB1c2UgdGhlbSwgb3IgYXNzb2NpYXRlIHRoZW0gYXMgV2ViIExpYnJhcnkNCi1wcm9qZWN0cy4gWW91IGNhbiBhbHNvIHJlZmVyZW5jZSBhIFRMRCBmaWxlIGJ5IHVzaW5nIGEgVVJJLjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3BkanNwcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODNhMzc1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jcGRqc3BzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJKYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3kiIC8+Ci08bWV0YSBjb250ZW50PSJKYXZhU2VydmVyIHBhZ2VzLCBvdmVydmlldywgZHluYW1pYyBXZWIgY29udGVudCwgZ2VuZXJhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkphdmFTZXJ2ZXIgcGFnZXMsIG92ZXJ2aWV3LCBkeW5hbWljIFdlYiBjb250ZW50LCBnZW5lcmF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjcGRqc3BzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcGRqc3BzIj48YSBuYW1lPSJjcGRqc3BzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5KYXZhU2VydmVyIFBhZ2VzIChKU1ApIHRlY2hub2xvZ3k8L2gxPgotCi0KLTxkaXY+Ci08cD5UaGUgSmF2YVNlcnZlciBQYWdlcyB0ZWNobm9sb2d5IGVuYWJsZXMgeW91IHRvIGdlbmVyYXRlIGR5bmFtaWMgd2ViIGNvbnRlbnQsCi1zdWNoIGFzIEhUTUwsIERIVE1MLCBYSFRNTCwgYW5kIFhNTCBmaWxlcywgdG8gaW5jbHVkZSBpbiBhIFdlYiBhcHBsaWNhdGlvbi4KLUpTUCBmaWxlcyBhcmUgb25lIHdheSB0byBpbXBsZW1lbnQgc2VydmVyLXNpZGUgZHluYW1pYyBwYWdlIGNvbnRlbnQuIEpTUCBmaWxlcwotYWxsb3cgYSBXZWIgc2VydmVyLCBzdWNoIGFzIEFwYWNoZSBUb21jYXQsIHRvIGFkZCBjb250ZW50IGR5bmFtaWNhbGx5IHRvIHlvdXIKLUhUTUwgcGFnZXMgYmVmb3JlIHRoZXkgYXJlIHNlbnQgdG8gYSByZXF1ZXN0aW5nIGJyb3dzZXIuPC9wPgotCi08cD5XaGVuIHlvdSBkZXBsb3kgYSBKU1AgZmlsZSB0byBhIFdlYiBzZXJ2ZXIgdGhhdCBwcm92aWRlcyBhIHNlcnZsZXQgZW5naW5lLAotaXQgaXMgcHJlcHJvY2Vzc2VkIGludG8gYSBzZXJ2bGV0IHRoYXQgcnVucyBvbiB0aGUgV2ViIHNlcnZlci4gVGhpcyBpcyBpbgotY29udHJhc3Qgd2l0aCBjbGllbnQtc2lkZSBKYXZhU2NyaXB04oSiICh3aXRoaW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+Jmx0O1NDUklQVCZndDs8L3NhbXA+IHRhZ3MpLAotd2hpY2ggaXMgcnVuIGluIGEgYnJvd3Nlci4gQSBKU1AgcGFnZSBpcyBpZGVhbCBmb3IgdGFza3MgdGhhdCBhcmUgYmV0dGVyIHN1aXRlZAotdG8gZXhlY3V0aW9uIG9uIHRoZSBzZXJ2ZXIsIHN1Y2ggYXMgYWNjZXNzaW5nIGRhdGFiYXNlcyBvciBjYWxsaW5nIEVudGVycHJpc2UgSmF2YeKEoiBiZWFucy48L3A+Ci0KLTxwPllvdSBjYW4gY3JlYXRlIGFuZCBlZGl0IGEgSlNQIGZpbGUgaW4gdGhlIEhUTUwgZWRpdG9yIGJ5IGFkZGluZyB5b3VyIG93bgotdGV4dCBhbmQgaW1hZ2VzIHVzaW5nIEhUTUwsIEpTUCB0YWdnaW5nLCBvciBKYXZhU2NyaXB0LCBpbmNsdWRpbmcgSmF2YSBzb3VyY2UKLWNvZGUgaW5zaWRlIG9mIHNjcmlwdGxldCB0YWdzLiBUeXBpY2FsbHksIEpTUCBmaWxlcyBoYXZlIHRoZSBmaWxlIGV4dGVuc2lvbgotLmpzcC4gQWRkaXRpb25hbGx5LCB0aGUgSlNQIHNwZWNpZmljYXRpb24gc3VnZ2VzdHMgdGhhdCBKU1AgZnJhZ21lbnQgZmlsZXMKLXNob3VsZCBoYXZlIGZpbGUgZXh0ZW5zaW9uIC5qc3BmLiBJZiB0aGlzIGNvbnZlbnRpb24gaXMgbm90IGZvbGxvd2VkLCB0aGUKLUpTUCB2YWxpZGF0b3Igd2lsbCB0cmVhdCBKU1AgZnJhZ21lbnRzIGFzIHJlZ3VsYXIgc3RhbmRhbG9uZSBKU1AgZmlsZXMsIGFuZAotY29tcGlsYXRpb24gZXJyb3JzIG1pZ2h0IGJlIHJlcG9ydGVkLjwvcD4KLQotPHA+VGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSlNQIDEuMiBTcGVjaWZpY2F0aW9uPC9jaXRlPiBwcm92aWRlcyB0aGUgYWJpbGl0eQotdG8gY3JlYXRlIGN1c3RvbSBKU1AgdGFncy4gQ3VzdG9tIHRhZ3Mgc2ltcGxpZnkgY29tcGxleCBhY3Rpb25zIGFuZCAgcHJvdmlkZQotZGV2ZWxvcGVycyB3aXRoIGdyZWF0ZXIgY29udHJvbCBvdmVyIHBhZ2UgY29udGVudC4gQ3VzdG9tIHRhZ3MgYXJlIGNvbGxlY3RlZAotaW50byBhIGxpYnJhcnkgKHRhZ2xpYikuIEEgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmaWxlICh0YWdsaWIudGxkKSBpcyBhbgotWE1MIGRvY3VtZW50IHRoYXQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZyBsaWJyYXJ5LCBpbmNsdWRpbmcgdGhlCi10YWdsaWIgc2hvcnQgbmFtZSwgbGlicmFyeSBkZXNjcmlwdGlvbiwgYW5kIHRhZyBkZXNjcmlwdGlvbnMuIFJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4KLU1pY3Jvc3lzdGVtcyBKU1AgMS4yIFNwZWNpZmljYXRpb248L2NpdGU+IGZvciBtb3JlIGRldGFpbHMuPC9wPgotCi08cD5UbyB1c2UgSlNQIDEuMiBjdXN0b20gdGFnbGlicywgeW91IGNhbiBpbXBvcnQgdGhlIHRhZyBsaWJyYXJ5IC50bGQgYW5kCi0uamFyIGZpbGVzIGludG8geW91ciBwcm9qZWN0IHRvIHVzZSB0aGVtLCBvciBhc3NvY2lhdGUgdGhlbSBhcyBXZWIgTGlicmFyeQotcHJvamVjdHMuIFlvdSBjYW4gYWxzbyByZWZlcmVuY2UgYSBUTEQgZmlsZSBieSB1c2luZyBhIFVSSS48L3A+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjE2MjRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd2VicGFnZWRlc2lnbiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V2ViIHBhZ2UgZGVzaWduPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcGFnZSBkZXNpZ248aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPldlYiBwYWdlcyBhcmUgYW4gaW50ZWdyYWwgcGFydCBvZiBldmVyeSBXZWIgYXBwbGljYXRpb24uIEVhY2ggV2ViIHBhZ2UNCi1zaG91bGQgc2VydmUgdG8gaGVscCBhY2hpZXZlIHRoZSBvdmVyYWxsIGdvYWwgb2YgdGhlIGVudGlyZSBXZWIgc2l0ZS48L3A+DQotPHA+IFRoZXJlIGFyZSBtYW55IHR5cGVzIG9mIFdlYiBwYWdlcywgcmFuZ2luZyBmcm9tIHNpbXBsZSBIVE1MIHBhZ2VzIHRoYXQNCi1jb250YWluIG5vIGR5bmFtaWMgZWxlbWVudHMsIHRvIGFkdmFuY2VkIEphdmEtYmFzZWQgcGFnZXMgdGhhdCBtYWtlIHVzZSBvZg0KLXNlcnZsZXRzLCBzY3JpcHRzLCBmb3Jtcywgb3IgZGF0YSBhY2Nlc3MgY29tcG9uZW50cy48L3A+DQotPHA+QSBmZXcgb2YgdGhlIG1hbnkgaXRlbXMgeW91IHNob3VsZCBjb25zaWRlciB3aGVuIGRlc2lnbmluZyB5b3VyIHBhZ2VzIGFyZQ0KLW1hcmt1cCBsYW5ndWFnZSwgbGlua3MsIGltYWdlcywgYW5kIHN0eWxlIHNoZWV0cy48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnBhZ2VkZXNpZ24uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTMzMzU5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIHBhZ2UgZGVzaWduIiAvPgotPG1ldGEgY29udGVudD0iV2ViIHBhZ2UgZGVzaWduLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwYWdlIGRlc2lnbiwgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3ZWJwYWdlZGVzaWduIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V2ViIHBhZ2UgZGVzaWduPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd2VicGFnZWRlc2lnbiI+PGEgbmFtZT0iY3dlYnBhZ2VkZXNpZ24iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldlYiBwYWdlIGRlc2lnbjwvaDE+Ci0KLQotPGRpdj4KLTxwPldlYiBwYWdlcyBhcmUgYW4gaW50ZWdyYWwgcGFydCBvZiBldmVyeSBXZWIgYXBwbGljYXRpb24uIEVhY2ggV2ViIHBhZ2UKLXNob3VsZCBzZXJ2ZSB0byBoZWxwIGFjaGlldmUgdGhlIG92ZXJhbGwgZ29hbCBvZiB0aGUgZW50aXJlIFdlYiBzaXRlLjwvcD4KLQotPHA+IFRoZXJlIGFyZSBtYW55IHR5cGVzIG9mIFdlYiBwYWdlcywgcmFuZ2luZyBmcm9tIHNpbXBsZSBIVE1MIHBhZ2VzIHRoYXQKLWNvbnRhaW4gbm8gZHluYW1pYyBlbGVtZW50cywgdG8gYWR2YW5jZWQgSmF2YS1iYXNlZCBwYWdlcyB0aGF0IG1ha2UgdXNlIG9mCi1zZXJ2bGV0cywgc2NyaXB0cywgZm9ybXMsIG9yIGRhdGEgYWNjZXNzIGNvbXBvbmVudHMuPC9wPgotCi08cD5BIGZldyBvZiB0aGUgbWFueSBpdGVtcyB5b3Ugc2hvdWxkIGNvbnNpZGVyIHdoZW4gZGVzaWduaW5nIHlvdXIgcGFnZXMgYXJlCi1tYXJrdXAgbGFuZ3VhZ2UsIGxpbmtzLCBpbWFnZXMsIGFuZCBzdHlsZSBzaGVldHMuPC9wPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWI4MmNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3dlYnByb2plY3RzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgcHJvamVjdHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBhcHBsaWNhdGlvbnM8aW5kZXh0ZXJtPmNyZWF0aW5nIG9yIGltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5XZWIgcHJvamVjdHMgaG9sZCBhbGwgb2YgdGhlIFdlYiByZXNvdXJjZXMgdGhhdCBhcmUgY3JlYXRlZCBhbmQgdXNlZCB3aGVuDQotZGV2ZWxvcGluZyB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIGZpcnN0IHN0ZXAgdG8gY3JlYXRpbmcgb3IgaW1wb3J0aW5nIGENCi1XZWIgYXBwbGljYXRpb24gaXMgdG8gY3JlYXRlIGVpdGhlciBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QuIFN0YXRpYw0KLVdlYiBwcm9qZWN0cyBhcmUgbWVhbnQgdG8gY29udGFpbiBvbmx5IHNpbXBsZSBXZWIgc2l0ZSByZXNvdXJjZXMsIHN1Y2ggYXMNCi1IVE1MIGZpbGVzLiBEeW5hbWljIFdlYiBwcm9qZWN0cyBhcmUgdXNlZCB0byBzdHJ1Y3R1cmUgV2ViIGFwcGxpY2F0aW9ucyB0aGF0DQotd2lsbCB1c2UgbW9yZSBjb21wbGljYXRlZCwgZHluYW1pYyBXZWIgdGVjaG5vbG9naWVzLCBzdWNoIGFzIEphdmFTZXJ2ZXIgUGFnZXMNCi1maWxlcywgYW5kIHBvc3NpYmx5IGRhdGEgYWNjZXNzIHJlc291cmNlcy48L3A+DQotPHA+VGhvdWdoIHRoZSBXZWIgcHJvamVjdCBpcyBzdHJ1Y3R1cmVkIG9uIHlvdXIgZmlsZSBzeXN0ZW0gaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIEoyRUUgV2ViIGFwcGxpY2F0aW9uIHN0YW5kYXJkIGZvciBkZXBsb3ltZW50IHB1cnBvc2VzLCB0aGUgUHJvamVjdA0KLUV4cGxvcmVyIHZpZXcgaXMgZGVzaWduZWQgdG8gc2hvdyB0aGUgbW9zdCBjb252ZW5pZW50IGRpc3BsYXkgb2YgcHJvamVjdCByZXNvdXJjZXMNCi1mb3IgdXNlIHdoaWxlIHlvdSBhcmUgYWN0dWFsbHkgZGV2ZWxvcGluZyB0aGUgV2ViIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBhcmUNCi1maW5pc2hlZCBkZXZlbG9waW5nIHlvdXIgV2ViIGFwcGxpY2F0aW9uLCB5b3UgdXNlIHRoZSBXZWIgcHJvamVjdCB0byBkZXBsb3kNCi10aGUgY29ycmVjdCByZXNvdXJjZXMgdG8gdGhlIHNlcnZlci4gVGhlc2UgcmVzb3VyY2VzIHdpbGwgYmUgcGFja2FnZWQgaW4gYQ0KLWZpbGUgY2FsbGVkIGEgV2ViIGFyY2hpdmUsIG9yIFdBUiBmaWxlLjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicHJvamVjdHMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgyZmNmZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnByb2plY3RzLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXZWIgcHJvamVjdHMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIG92ZXJ2aWV3LCBXZWIgYXBwbGljYXRpb25zLCBjcmVhdGluZyBvciBpbXBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcHJvamVjdHMsIG92ZXJ2aWV3LCBXZWIgYXBwbGljYXRpb25zLCBjcmVhdGluZyBvciBpbXBvcnRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3ZWJwcm9qZWN0cyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldlYiBwcm9qZWN0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYnByb2plY3RzIj48YSBuYW1lPSJjd2VicHJvamVjdHMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldlYiBwcm9qZWN0czwvaDE+Ci0KLQotPGRpdj4KLTxwPldlYiBwcm9qZWN0cyBob2xkIGFsbCBvZiB0aGUgV2ViIHJlc291cmNlcyB0aGF0IGFyZSBjcmVhdGVkIGFuZCB1c2VkIHdoZW4KLWRldmVsb3BpbmcgeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBmaXJzdCBzdGVwIHRvIGNyZWF0aW5nIG9yIGltcG9ydGluZyBhCi1XZWIgYXBwbGljYXRpb24gaXMgdG8gY3JlYXRlIGVpdGhlciBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QuIFN0YXRpYwotV2ViIHByb2plY3RzIGFyZSBtZWFudCB0byBjb250YWluIG9ubHkgc2ltcGxlIFdlYiBzaXRlIHJlc291cmNlcywgc3VjaCBhcwotSFRNTCBmaWxlcy4gRHluYW1pYyBXZWIgcHJvamVjdHMgYXJlIHVzZWQgdG8gc3RydWN0dXJlIFdlYiBhcHBsaWNhdGlvbnMgdGhhdAotd2lsbCB1c2UgbW9yZSBjb21wbGljYXRlZCwgZHluYW1pYyBXZWIgdGVjaG5vbG9naWVzLCBzdWNoIGFzIEphdmFTZXJ2ZXIgUGFnZXMKLWZpbGVzLCBhbmQgcG9zc2libHkgZGF0YSBhY2Nlc3MgcmVzb3VyY2VzLjwvcD4KLQotPHA+VGhvdWdoIHRoZSBXZWIgcHJvamVjdCBpcyBzdHJ1Y3R1cmVkIG9uIHlvdXIgZmlsZSBzeXN0ZW0gaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgSjJFRSBXZWIgYXBwbGljYXRpb24gc3RhbmRhcmQgZm9yIGRlcGxveW1lbnQgcHVycG9zZXMsIHRoZSBQcm9qZWN0Ci1FeHBsb3JlciB2aWV3IGlzIGRlc2lnbmVkIHRvIHNob3cgdGhlIG1vc3QgY29udmVuaWVudCBkaXNwbGF5IG9mIHByb2plY3QgcmVzb3VyY2VzCi1mb3IgdXNlIHdoaWxlIHlvdSBhcmUgYWN0dWFsbHkgZGV2ZWxvcGluZyB0aGUgV2ViIGFwcGxpY2F0aW9uLiBXaGVuIHlvdSBhcmUKLWZpbmlzaGVkIGRldmVsb3BpbmcgeW91ciBXZWIgYXBwbGljYXRpb24sIHlvdSB1c2UgdGhlIFdlYiBwcm9qZWN0IHRvIGRlcGxveQotdGhlIGNvcnJlY3QgcmVzb3VyY2VzIHRvIHRoZSBzZXJ2ZXIuIFRoZXNlIHJlc291cmNlcyB3aWxsIGJlIHBhY2thZ2VkIGluIGEKLWZpbGUgY2FsbGVkIGEgV2ViIGFyY2hpdmUsIG9yIFdBUiBmaWxlLjwvcD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dlYnJlc291cmNlcy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWY4ZDcxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3ZWJyZXNvdXJjZXMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldlYiByZXNvdXJjZXM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiByZXNvdXJjZXM8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPkluIG1vc3QgY2FzZXMsIGFsbCBvZiB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IG5lZWQgdG8gY3JlYXRlIGZvciB5b3VyIFdlYg0KLWFwcGxpY2F0aW9uIGFyZSBkZXZlbG9wZWQgZHVyaW5nIFdlYiBzaXRlIG9yIFdlYiBwYWdlIGRlc2lnbjsgaG93ZXZlciwgdGhlcmUNCi1hcmUgYWRkaXRpb25hbCByZXNvdXJjZXMgdGhhdCB5b3UgbWF5IG5lZWQgdG8gaW5jbHVkZSBpbiB5b3VyIFdlYiBwcm9qZWN0DQotaWYgeW91IGFyZSB1c2luZyBtb3JlIGFkdmFuY2VkIFdlYiB0ZWNobm9sb2dpZXMgaW4geW91ciBhcHBsaWNhdGlvbi48L3A+DQotPHA+VGhlc2UgV2ViIHJlc291cmNlcyBhcmUgbm90IHR5cGljYWwgV2ViIHBhZ2UgZmlsZXMsIGFuZCBhcmUgb2Z0ZW4gbm90IHRoZQ0KLXJlc291cmNlcyB0aGF0IHlvdSBjb25zaWRlciBwYXJ0IG9mIHRoZSBmaW5hbCBXZWIgc2l0ZS4gRm9yIGV4YW1wbGUsIHRhZyBsaWJyYXJpZXMNCi1hbmQgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHJlc291cmNlcywNCi1zdWNoIGFzIEpBUiBmaWxlcywgYXJlIHJlc291cmNlcyB5b3UgbWlnaHQgbmVlZCB0byBpbmNsdWRlIGluIHlvdXIgV2ViIHByb2plY3QuIDwvcD4NCi08cD5JbiBmYWN0LCBldmVuIHRoZSBXQVIgZmlsZSBpdHNlbGYgY291bGQgYmUgY29uc2lkZXJlZCBhIFdlYiByZXNvdXJjZSwgaWYNCi15b3UgY29uc2lkZXIgaW1wb3J0aW5nIG9yIGV4cG9ydGluZyB0aGUgcmVzb3VyY2UuPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd2VicmVzb3VyY2VzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyODhiYzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldlYiByZXNvdXJjZXMiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcmVzb3VyY2VzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiByZXNvdXJjZXMsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjd2VicmVzb3VyY2VzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V2ViIHJlc291cmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0iY3dlYnJlc291cmNlcyI+PGEgbmFtZT0iY3dlYnJlc291cmNlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIHJlc291cmNlczwvaDE+Ci0KLQotPGRpdj4KLTxwPkluIG1vc3QgY2FzZXMsIGFsbCBvZiB0aGUgcmVzb3VyY2VzIHRoYXQgeW91IG5lZWQgdG8gY3JlYXRlIGZvciB5b3VyIFdlYgotYXBwbGljYXRpb24gYXJlIGRldmVsb3BlZCBkdXJpbmcgV2ViIHNpdGUgb3IgV2ViIHBhZ2UgZGVzaWduOyBob3dldmVyLCB0aGVyZQotYXJlIGFkZGl0aW9uYWwgcmVzb3VyY2VzIHRoYXQgeW91IG1heSBuZWVkIHRvIGluY2x1ZGUgaW4geW91ciBXZWIgcHJvamVjdAotaWYgeW91IGFyZSB1c2luZyBtb3JlIGFkdmFuY2VkIFdlYiB0ZWNobm9sb2dpZXMgaW4geW91ciBhcHBsaWNhdGlvbi48L3A+Ci0KLTxwPlRoZXNlIFdlYiByZXNvdXJjZXMgYXJlIG5vdCB0eXBpY2FsIFdlYiBwYWdlIGZpbGVzLCBhbmQgYXJlIG9mdGVuIG5vdCB0aGUKLXJlc291cmNlcyB0aGF0IHlvdSBjb25zaWRlciBwYXJ0IG9mIHRoZSBmaW5hbCBXZWIgc2l0ZS4gRm9yIGV4YW1wbGUsIHRhZyBsaWJyYXJpZXMKLWFuZCBKYXZh4oSiIHJlc291cmNlcywKLXN1Y2ggYXMgSkFSIGZpbGVzLCBhcmUgcmVzb3VyY2VzIHlvdSBtaWdodCBuZWVkIHRvIGluY2x1ZGUgaW4geW91ciBXZWIgcHJvamVjdC4gPC9wPgotCi08cD5JbiBmYWN0LCBldmVuIHRoZSBXQVIgZmlsZSBpdHNlbGYgY291bGQgYmUgY29uc2lkZXJlZCBhIFdlYiByZXNvdXJjZSwgaWYKLXlvdSBjb25zaWRlciBpbXBvcnRpbmcgb3IgZXhwb3J0aW5nIHRoZSByZXNvdXJjZS48L3A+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3dzZXJ2Ym4uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2ZlZWY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd3NlcnZibiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2VydmxldHM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNlcnZsZXRzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+ZHluYW1pYw0KLWNvbnRlbnQ8aW5kZXh0ZXJtPnNlcnZsZXRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlNlcnZsZXRzIGFyZSBzZXJ2ZXItc2lkZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiINCi10bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBwcm9ncmFtcyB0aGF0IHVzZSB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBTZXJ2bGV0DQotQVBJPC9jaXRlPiBhbmQgaXRzIGFzc29jaWF0ZWQgY2xhc3NlcyBhbmQgbWV0aG9kcywgYXMgZGVmaW5lZCBpbiB0aGUgPGNpdGU+U3VuDQotTWljcm9zeXN0ZW1zIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIg0KLXRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQgMi4zIFNwZWNpZmljYXRpb248L2NpdGU+LiBUaGVzZSA8dG0gdG1jbGFzcz0ic3BlY2lhbCINCi10bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBwcm9ncmFtcw0KLWV4dGVuZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhIFdlYiBzZXJ2ZXIgYnkgZ2VuZXJhdGluZyBkeW5hbWljIGNvbnRlbnQgYW5kDQotcmVzcG9uZGluZyB0byBXZWIgY2xpZW50IHJlcXVlc3RzLiBXaGVuIGEgYnJvd3NlciBzZW5kcyBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciwNCi10aGUgc2VydmVyIGNhbiBzZW5kIHRoZSByZXF1ZXN0IGluZm9ybWF0aW9uIHRvIGEgc2VydmxldCwgc28gdGhhdCB0aGUgc2VydmxldA0KLWNhbiBjb25zdHJ1Y3QgdGhlIHJlc3BvbnNlIHRoYXQgaXMgc2VudCBiYWNrIHRvIHRoZSBicm93c2VyLjwvcD4NCi08cD5KdXN0IGFzIGFwcGxldHMgcnVuIG9uIGEgV2ViIGJyb3dzZXIgYW5kIGV4dGVuZCB0aGUgYnJvd3NlcidzIGNhcGFiaWxpdGllcywNCi1zZXJ2bGV0cyBydW4gb24gYSBKYXZhLWVuYWJsZWQgV2ViIHNlcnZlciBhbmQgZXh0ZW5kIHRoZSBzZXJ2ZXIncyBjYXBhYmlsaXRpZXMuDQotQmVjYXVzZSBvZiB0aGVpciBmbGV4aWJpbGl0eSBhbmQgc2NhbGFiaWxpdHksIHNlcnZsZXRzIGFyZSBjb21tb25seSB1c2VkIHRvDQotZW5hYmxlIGJ1c2luZXNzZXMgdG8gY29ubmVjdCBkYXRhYmFzZXMgdG8gdGhlIFdlYi48L3A+DQotPHA+QWx0aG91Z2ggYSBzZXJ2bGV0IGNhbiBiZSBhIGNvbXBsZXRlbHkgc2VsZi1jb250YWluZWQgcHJvZ3JhbSwgeW91IGNhbg0KLXNwbGl0IGFwcGxpY2F0aW9uIGRldmVsb3BtZW50IGludG8gdHdvIHBvcnRpb25zOiAgPHVsPg0KLTxsaT5UaGUgYnVzaW5lc3MgbG9naWMgKGNvbnRlbnQgZ2VuZXJhdGlvbiksIHdoaWNoIGdvdmVybnMgdGhlIHJlbGF0aW9uc2hpcA0KLWJldHdlZW4gaW5wdXQsIHByb2Nlc3NpbmcsIGFuZCBvdXRwdXQ8L2xpPg0KLTxsaT5UaGUgcHJlc2VudGF0aW9uIGxvZ2ljIChjb250ZW50IHByZXNlbnRhdGlvbiwgb3IgZ3JhcGhpYyBkZXNpZ24gcnVsZXMpLA0KLXdoaWNoIGRldGVybWluZXMgaG93IGluZm9ybWF0aW9uIGlzIHByZXNlbnRlZCB0byB0aGUgdXNlcjwvbGk+DQotPC91bD5Vc2luZyB0aGlzIHBhcmFkaWdtLCB5b3UgbWF5IGNob29zZSB0byBoYXZlIGJ1c2luZXNzIGxvZ2ljIGhhbmRsZWQgYnkgPHRtDQotdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYmVhbnMsDQotdGhlIHByZXNlbnRhdGlvbiBsb2dpYyBoYW5kbGVkIGJ5IEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgb3IgSFRNTCBmaWxlcywgYW5kDQotdGhlIEhUVFAgcHJvdG9jb2wgaGFuZGxlZCBieSBhIHNlcnZsZXQuIDxub3RlPkpTUCBmaWxlcyBjYW4gYmUgdXNlZCB0byBtYW5hZ2UNCi1ib3RoIHRoZSBwcmVzZW50YXRpb24gYW5kIGJ1c2luZXNzIGxvZ2ljIGZvciBhIFdlYiBhcHBsaWNhdGlvbi4gSlNQIGZpbGVzDQotdXNlIHN0cnVjdHVyZWQgbWFya3VwIGZvciBwcmVzZW50YXRpb24sIGFuZCBzdXBwbHkgc2VydmxldCBtb2RlbCBiZWhhdmlvcg0KLWF0IHJ1biB0aW1lLjwvbm90ZT48L3A+DQotPHA+WW91IGNhbiBkZXZlbG9wLCBkZWJ1ZywgYW5kIGRlcGxveSBzZXJ2bGV0cywgc2V0IGJyZWFrcG9pbnRzIHdpdGhpbiBzZXJ2bGV0DQotb2JqZWN0cywgYW5kIHN0ZXAgdGhyb3VnaCBjb2RlIHRvIG1ha2UgY2hhbmdlcyB0aGF0IGFyZSBkeW5hbWljYWxseSBmb2xkZWQNCi1pbnRvIHRoZSBydW5uaW5nIHNlcnZsZXQgb24gYSBydW5uaW5nIHNlcnZlciwgd2l0aG91dCBoYXZpbmcgdG8gcmVzdGFydCBlYWNoDQotdGltZS48L3A+DQotPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgc2VydmxldHMsIHJlZmVyIHRvIHRoZSA8Y2l0ZT5TdW4gTWljcm9zeXN0ZW1zIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IFNlcnZsZXQNCi0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPGNvZGVwaD5qYXZhLnN1bi5jb20vcHJvZHVjdHMvc2VydmxldC9kb3dubG9hZC5odG1sPC9jb2RlcGg+LjwvcD4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3NlcnZibi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYjc4MTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3c2VydmJuLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTZXJ2bGV0cyIgLz4KLTxtZXRhIGNvbnRlbnQ9InNlcnZsZXRzLCBvdmVydmlldywgZHluYW1pYyBjb250ZW50IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic2VydmxldHMsIG92ZXJ2aWV3LCBkeW5hbWljIGNvbnRlbnQiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3c2VydmJuIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+U2VydmxldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3c2VydmJuIj48YSBuYW1lPSJjd3NlcnZibiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2VydmxldHM8L2gxPgotCi0KLTxkaXY+Ci08cD5TZXJ2bGV0cyBhcmUgc2VydmVyLXNpZGUgSmF2YeKEoiBwcm9ncmFtcyB0aGF0IHVzZSB0aGUgPGNpdGU+U3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFNlcnZsZXQKLUFQSTwvY2l0ZT4gYW5kIGl0cyBhc3NvY2lhdGVkIGNsYXNzZXMgYW5kIG1ldGhvZHMsIGFzIGRlZmluZWQgaW4gdGhlIDxjaXRlPlN1bgotTWljcm9zeXN0ZW1zIEphdmEgU2VydmxldCAyLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4uIFRoZXNlIEphdmEgcHJvZ3JhbXMKLWV4dGVuZCB0aGUgZnVuY3Rpb25hbGl0eSBvZiBhIFdlYiBzZXJ2ZXIgYnkgZ2VuZXJhdGluZyBkeW5hbWljIGNvbnRlbnQgYW5kCi1yZXNwb25kaW5nIHRvIFdlYiBjbGllbnQgcmVxdWVzdHMuIFdoZW4gYSBicm93c2VyIHNlbmRzIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyLAotdGhlIHNlcnZlciBjYW4gc2VuZCB0aGUgcmVxdWVzdCBpbmZvcm1hdGlvbiB0byBhIHNlcnZsZXQsIHNvIHRoYXQgdGhlIHNlcnZsZXQKLWNhbiBjb25zdHJ1Y3QgdGhlIHJlc3BvbnNlIHRoYXQgaXMgc2VudCBiYWNrIHRvIHRoZSBicm93c2VyLjwvcD4KLQotPHA+SnVzdCBhcyBhcHBsZXRzIHJ1biBvbiBhIFdlYiBicm93c2VyIGFuZCBleHRlbmQgdGhlIGJyb3dzZXIncyBjYXBhYmlsaXRpZXMsCi1zZXJ2bGV0cyBydW4gb24gYSBKYXZhLWVuYWJsZWQgV2ViIHNlcnZlciBhbmQgZXh0ZW5kIHRoZSBzZXJ2ZXIncyBjYXBhYmlsaXRpZXMuCi1CZWNhdXNlIG9mIHRoZWlyIGZsZXhpYmlsaXR5IGFuZCBzY2FsYWJpbGl0eSwgc2VydmxldHMgYXJlIGNvbW1vbmx5IHVzZWQgdG8KLWVuYWJsZSBidXNpbmVzc2VzIHRvIGNvbm5lY3QgZGF0YWJhc2VzIHRvIHRoZSBXZWIuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5BbHRob3VnaCBhIHNlcnZsZXQgY2FuIGJlIGEgY29tcGxldGVseSBzZWxmLWNvbnRhaW5lZCBwcm9ncmFtLCB5b3UgY2FuCi1zcGxpdCBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCBpbnRvIHR3byBwb3J0aW9uczogIDx1bD4KLTxsaT5UaGUgYnVzaW5lc3MgbG9naWMgKGNvbnRlbnQgZ2VuZXJhdGlvbiksIHdoaWNoIGdvdmVybnMgdGhlIHJlbGF0aW9uc2hpcAotYmV0d2VlbiBpbnB1dCwgcHJvY2Vzc2luZywgYW5kIG91dHB1dDwvbGk+Ci0KLTxsaT5UaGUgcHJlc2VudGF0aW9uIGxvZ2ljIChjb250ZW50IHByZXNlbnRhdGlvbiwgb3IgZ3JhcGhpYyBkZXNpZ24gcnVsZXMpLAotd2hpY2ggZGV0ZXJtaW5lcyBob3cgaW5mb3JtYXRpb24gaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyPC9saT4KLQotPC91bD4KLVVzaW5nIHRoaXMgcGFyYWRpZ20sIHlvdSBtYXkgY2hvb3NlIHRvIGhhdmUgYnVzaW5lc3MgbG9naWMgaGFuZGxlZCBieSBKYXZhIGJlYW5zLAotdGhlIHByZXNlbnRhdGlvbiBsb2dpYyBoYW5kbGVkIGJ5IEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgb3IgSFRNTCBmaWxlcywgYW5kCi10aGUgSFRUUCBwcm90b2NvbCBoYW5kbGVkIGJ5IGEgc2VydmxldC4gPGRpdiBjbGFzcz0ibm90ZSI+PHNwYW4gY2xhc3M9Im5vdGV0aXRsZSI+Tm90ZTo8L3NwYW4+IEpTUCBmaWxlcyBjYW4gYmUgdXNlZCB0byBtYW5hZ2UKLWJvdGggdGhlIHByZXNlbnRhdGlvbiBhbmQgYnVzaW5lc3MgbG9naWMgZm9yIGEgV2ViIGFwcGxpY2F0aW9uLiBKU1AgZmlsZXMKLXVzZSBzdHJ1Y3R1cmVkIG1hcmt1cCBmb3IgcHJlc2VudGF0aW9uLCBhbmQgc3VwcGx5IHNlcnZsZXQgbW9kZWwgYmVoYXZpb3IKLWF0IHJ1biB0aW1lLjwvZGl2PgotPC9kaXY+Ci0KLTxwPllvdSBjYW4gZGV2ZWxvcCwgZGVidWcsIGFuZCBkZXBsb3kgc2VydmxldHMsIHNldCBicmVha3BvaW50cyB3aXRoaW4gc2VydmxldAotb2JqZWN0cywgYW5kIHN0ZXAgdGhyb3VnaCBjb2RlIHRvIG1ha2UgY2hhbmdlcyB0aGF0IGFyZSBkeW5hbWljYWxseSBmb2xkZWQKLWludG8gdGhlIHJ1bm5pbmcgc2VydmxldCBvbiBhIHJ1bm5pbmcgc2VydmVyLCB3aXRob3V0IGhhdmluZyB0byByZXN0YXJ0IGVhY2gKLXRpbWUuPC9wPgotCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBzZXJ2bGV0cywgcmVmZXIgdG8gdGhlIDxjaXRlPlN1biBNaWNyb3N5c3RlbXMgSmF2YSBTZXJ2bGV0Ci0yLjMgU3BlY2lmaWNhdGlvbjwvY2l0ZT4gYXQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+amF2YS5zdW4uY29tL3Byb2R1Y3RzL3NlcnZsZXQvZG93bmxvYWQuaHRtbDwvc2FtcD4uPC9wPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3dGZlYXR1cmVzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxMWJiMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgMTk4OC0yMDAyLCB2LjQwMDIgLS0+DQotPGNvbmNlcHQgaWQ9ImN3dGZlYXR1cmVzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgdG9vbHMgZmVhdHVyZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+IFRoZSBpbnRlZ3JhdGVkIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBtYWtlcyBpdCBlYXN5IHRvIGNvb3BlcmF0aXZlbHkNCi1jcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V2ViIHRvb2xzPGluZGV4dGVybT5mZWF0dXJlcyBhbmQgY2FwYWJpbGl0aWVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZSBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyBoaWdoLWxldmVsIGNhcGFiaWxpdGllczoNCi0gPHVsPg0KLTxsaT5EeW5hbWljIFdlYiBwcm9qZWN0IGNyZWF0aW9uLCB1c2luZyB0aGUgSjJFRS1kZWZpbmVkIGhpZXJhcmNoeSwgb3IgYSBzdGF0aWMNCi12ZXJzaW9uIHRoYXQgcmVkdWNlcyBwcm9qZWN0IG92ZXJoZWFkIHdoZW4gZHluYW1pYyBlbGVtZW50cyBhcmUgbm90IHJlcXVpcmVkLg0KLSBTdGF0aWMgV2ViIHByb2plY3RzIGNhbiBsYXRlciBiZSBjb252ZXJ0ZWQgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMuPHA+PC9wPjwvbGk+DQotPGxpPkNyZWF0aW9uIGFuZCBlZGl0aW5nIG9mIGEgV2ViIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgZGVzY3JpcHRvciAoPGZpbGVwYXRoPndlYi54bWw8L2ZpbGVwYXRoPikNCi0gZmlsZTxwPjwvcD48L2xpPg0KLTxsaT5KU1AgYW5kIEhUTUwgZmlsZSBjcmVhdGlvbiwgdmFsaWRhdGlvbiwgZWRpdGluZywgYW5kIGRlYnVnZ2luZzxwPjwvcD48L2xpPg0KLTxsaT5BbiBleHRlbnNpYmxlIHZpZXcsIGNhbGxlZCB0aGUgU25pcHBldHMgdmlldywgd2hpY2ggYWxsb3dzIHVzZXJzIHRvIGNhdGFsb2cNCi0gYW5kIG9yZ2FuaXplIHJldXNhYmxlIHByb2dyYW1taW5nIG9iamVjdHMsIHN1Y2ggYXMgSFRNTCwgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4sDQotIGFuZCBKU1AgbWFya3VwLCBhbG9uZyB3aXRoIGZpbGVzIGFuZCBjdXN0b20gdGFncywgdGhhdCBjYW4gYmUgZW1iZWRkZWQgaW4NCi0gZXhpc3RpbmcgZmlsZXM8cD48L3A+PC9saT4NCi08bGk+RHluYW1pYyB0YWcgaGVscCAoY29udGVudCBhc3Npc3QpICwgd2hpY2ggZGlzcGxheXMgdGFnIHVzYWdlIGFuZCBhdHRyaWJ1dGUNCi1pbmZvcm1hdGlvbiBmb3IgIEhUTUwsIEpTUCwgYW5kIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YVNjcmlwdCI+SmF2YVNjcmlwdDwvdG0+IHRhZ3MgYmFzZWQgb24gY3Vyc29yIGxvY2F0aW9uDQotIGluIHRoZSBTb3VyY2UgcGFnZS4gKFlvdSBpbnZva2UgQ29udGVudCBBc3Npc3QgYnkgcHJlc3NpbmcgKEN0cmwrU3BhY2ViYXIpDQotKTxwPjwvcD48L2xpPg0KLTxsaT5DYXNjYWRpbmcgc3R5bGUgc2hlZXQgKENTUykgZWRpdGluZyBzdXBwb3J0PHA+PC9wPjwvbGk+DQotPGxpPkhUVFAvRlRQIGltcG9ydDxwPjwvcD48L2xpPg0KLTxsaT5GVFAgZXhwb3J0IChzaW1wbGUgcmVzb3VyY2UgY29weSkgdG8gYSBzZXJ2ZXI8cD48L3A+PC9saT4NCi08bGk+V0FSIGZpbGUgaW1wb3J0LCBleHBvcnQsIGFuZCB2YWxpZGF0aW9uPHA+PC9wPjwvbGk+DQotPGxpPlNlcnZsZXQgY3JlYXRpb24sIHdoaWNoIGVtcGxveXMgdGhlIFNlcnZsZXQgV2l6YXJkIHRvIGNyZWF0ZSBuZXcgc2VydmxldHMuPHA+PC9wPjwvbGk+DQotPC91bD48L3A+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d0ZmVhdHVyZXMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3RmZWF0dXJlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjMzMjNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3RmZWF0dXJlcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV2ViIHRvb2xzIGZlYXR1cmVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBpbnRlZ3JhdGVkIFdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCBtYWtlcyBpdCBlYXN5IHRvIGNvb3BlcmF0aXZlbHkgY3JlYXRlLCBhc3NlbWJsZSwgcHVibGlzaCwgZGVwbG95IGFuZCBtYWludGFpbiBkeW5hbWljLCBpbnRlcmFjdGl2ZSBXZWIgYXBwbGljYXRpb25zLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgaW50ZWdyYXRlZCBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgbWFrZXMgaXQgZWFzeSB0byBjb29wZXJhdGl2ZWx5IGNyZWF0ZSwgYXNzZW1ibGUsIHB1Ymxpc2gsIGRlcGxveSBhbmQgbWFpbnRhaW4gZHluYW1pYywgaW50ZXJhY3RpdmUgV2ViIGFwcGxpY2F0aW9ucy4iIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgdG9vbHMsIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgdG9vbHMsIGZlYXR1cmVzIGFuZCBjYXBhYmlsaXRpZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3dGZlYXR1cmVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V2ViIHRvb2xzIGZlYXR1cmVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3RmZWF0dXJlcyI+PGEgbmFtZT0iY3d0ZmVhdHVyZXMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPldlYiB0b29scyBmZWF0dXJlczwvaDE+Ci0KLQotCi08ZGl2PjxwPiBUaGUgaW50ZWdyYXRlZCBXZWIgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQgbWFrZXMgaXQgZWFzeSB0byBjb29wZXJhdGl2ZWx5Ci1jcmVhdGUsIGFzc2VtYmxlLCBwdWJsaXNoLCBkZXBsb3kgYW5kIG1haW50YWluIGR5bmFtaWMsIGludGVyYWN0aXZlIFdlYiBhcHBsaWNhdGlvbnMuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgaGlnaC1sZXZlbCBjYXBhYmlsaXRpZXM6Ci0gPHVsPgotPGxpPkR5bmFtaWMgV2ViIHByb2plY3QgY3JlYXRpb24sIHVzaW5nIHRoZSBKMkVFLWRlZmluZWQgaGllcmFyY2h5LCBvciBhIHN0YXRpYwotdmVyc2lvbiB0aGF0IHJlZHVjZXMgcHJvamVjdCBvdmVyaGVhZCB3aGVuIGR5bmFtaWMgZWxlbWVudHMgYXJlIG5vdCByZXF1aXJlZC4KLSBTdGF0aWMgV2ViIHByb2plY3RzIGNhbiBsYXRlciBiZSBjb252ZXJ0ZWQgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMuPHAgLz4KLTwvbGk+Ci0KLTxsaT5DcmVhdGlvbiBhbmQgZWRpdGluZyBvZiBhIFdlYiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxzcGFuIGNsYXNzPSJmaWxlcGF0aCI+d2ViLnhtbDwvc3Bhbj4pCi0gZmlsZTxwIC8+Ci08L2xpPgotCi08bGk+SlNQIGFuZCBIVE1MIGZpbGUgY3JlYXRpb24sIHZhbGlkYXRpb24sIGVkaXRpbmcsIGFuZCBkZWJ1Z2dpbmc8cCAvPgotPC9saT4KLQotPGxpPkFuIGV4dGVuc2libGUgdmlldywgY2FsbGVkIHRoZSBTbmlwcGV0cyB2aWV3LCB3aGljaCBhbGxvd3MgdXNlcnMgdG8gY2F0YWxvZwotIGFuZCBvcmdhbml6ZSByZXVzYWJsZSBwcm9ncmFtbWluZyBvYmplY3RzLCBzdWNoIGFzIEhUTUwsIEphdmFTY3JpcHTihKIsCi0gYW5kIEpTUCBtYXJrdXAsIGFsb25nIHdpdGggZmlsZXMgYW5kIGN1c3RvbSB0YWdzLCB0aGF0IGNhbiBiZSBlbWJlZGRlZCBpbgotIGV4aXN0aW5nIGZpbGVzPHAgLz4KLTwvbGk+Ci0KLTxsaT5EeW5hbWljIHRhZyBoZWxwIChjb250ZW50IGFzc2lzdCkgLCB3aGljaCBkaXNwbGF5cyB0YWcgdXNhZ2UgYW5kIGF0dHJpYnV0ZQotaW5mb3JtYXRpb24gZm9yICBIVE1MLCBKU1AsIGFuZCBKYXZhU2NyaXB0IHRhZ3MgYmFzZWQgb24gY3Vyc29yIGxvY2F0aW9uCi0gaW4gdGhlIFNvdXJjZSBwYWdlLiAoWW91IGludm9rZSBDb250ZW50IEFzc2lzdCBieSBwcmVzc2luZyAoQ3RybCtTcGFjZWJhcikKLSk8cCAvPgotPC9saT4KLQotPGxpPkNhc2NhZGluZyBzdHlsZSBzaGVldCAoQ1NTKSBlZGl0aW5nIHN1cHBvcnQ8cCAvPgotPC9saT4KLQotPGxpPkhUVFAvRlRQIGltcG9ydDxwIC8+Ci08L2xpPgotCi08bGk+RlRQIGV4cG9ydCAoc2ltcGxlIHJlc291cmNlIGNvcHkpIHRvIGEgc2VydmVyPHAgLz4KLTwvbGk+Ci0KLTxsaT5XQVIgZmlsZSBpbXBvcnQsIGV4cG9ydCwgYW5kIHZhbGlkYXRpb248cCAvPgotPC9saT4KLQotPGxpPlNlcnZsZXQgY3JlYXRpb24sIHdoaWNoIGVtcGxveXMgdGhlIFNlcnZsZXQgV2l6YXJkIHRvIGNyZWF0ZSBuZXcgc2VydmxldHMuPHAgLz4KLTwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy9jd3dhcm92ci5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZTFlZTAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN3d2Fyb3ZyIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5XZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V0FSIGZpbGVzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD4gQSBXZWIgYXBwbGljYXRpb24gaXMgYSBncm91cCBvZiBIVE1MIHBhZ2VzLCBKU1AgcGFnZXMsIHNlcnZsZXRzLCByZXNvdXJjZXMNCi1hbmQgc291cmNlIGZpbGUsIHdoaWNoIGNhbiBiZSBtYW5hZ2VkIGFzIGEgc2luZ2xlIHVuaXQuIEEgV2ViIGFyY2hpdmUgKFdBUikNCi1maWxlIGlzIGEgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uLiBXQVIgZmlsZXMgY2FuIGJlIHVzZWQgdG8gaW1wb3J0IGEgV2ViDQotYXBwbGljYXRpb24gaW50byBhIFdlYiBzZXJ2ZXIuPC9wPg0KLTxwPkluIGFkZGl0aW9uIHRvIHByb2plY3QgcmVzb3VyY2VzLCB0aGUgV0FSIGZpbGUgaW5jbHVkZXMgYSBXZWIgZGVwbG95bWVudA0KLWRlc2NyaXB0b3IgZmlsZS4gVGhlIFdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgYW4gWE1MIGZpbGUgdGhhdCBjb250YWlucw0KLWRlcGxveW1lbnQgaW5mb3JtYXRpb24sIE1JTUUgdHlwZXMsIHNlc3Npb24gY29uZmlndXJhdGlvbiBkZXRhaWxzLCBhbmQgb3RoZXINCi1zZXR0aW5ncyBmb3IgYSBXZWIgYXBwbGljYXRpb24uIFRoZSBXZWIgZGVwbG95bWVudCBkZXNjcmlwdG9yIGZpbGUgKDxmaWxlcGF0aD53ZWIueG1sPC9maWxlcGF0aD4pDQotcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFdBUiBmaWxlIGlzIHNoYXJlZCB3aXRoIHRoZSBkZXZlbG9wZXJzLCBhc3NlbWJsZXJzLA0KLWFuZCBkZXBsb3llcnMgaW4gYSBKMkVFIGVudmlyb25tZW50LjwvcD4NCi08cD5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nDQotV0FSIGZpbGVzLCB1c2luZyB0aGUgZm9sbG93aW5nIHdpemFyZHM6IDx1bD4NCi08bGk+PHBoPkltcG9ydCBSZXNvdXJjZXMgZnJvbSBhIFdBUiBGaWxlPC9waD4sIHdoaWNoIHJlcXVpcmVzIHRoYXQgeW91IHRvDQotc3BlY2lmeSBhIFdlYiBwcm9qZWN0LiBZb3UgY2FuIHVzZSBleGlzdGluZyBwcm9qZWN0cyBvciBjcmVhdGUgdGhlbSBhcyB5b3UNCi11c2UgdGhlIHdpemFyZC48L2xpPg0KLTxsaT48cGg+RXhwb3J0IFJlc291cmNlcyB0byBhIFdBUiBGaWxlPC9waD4sIHdoaWNoIHJlcXVpcmVzIG9ubHkgYW4gZXhwb3J0DQotbG9jYXRpb24gYW5kIHNvbWUgb3B0aW9uYWwgc2V0dGluZ3M8L2xpPg0KLTwvdWw+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2Fyb3ZyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZkNTBjNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3YXJvdnIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldlYiBhcmNoaXZlIChXQVIpIGZpbGVzIiAvPgotPG1ldGEgY29udGVudD0iV0FSIGZpbGVzLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldBUiBmaWxlcywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3d2Fyb3ZyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3d2Fyb3ZyIj48YSBuYW1lPSJjd3dhcm92ciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L2gxPgotCi0KLTxkaXY+Ci08cD4gQSBXZWIgYXBwbGljYXRpb24gaXMgYSBncm91cCBvZiBIVE1MIHBhZ2VzLCBKU1AgcGFnZXMsIHNlcnZsZXRzLCByZXNvdXJjZXMKLWFuZCBzb3VyY2UgZmlsZSwgd2hpY2ggY2FuIGJlIG1hbmFnZWQgYXMgYSBzaW5nbGUgdW5pdC4gQSBXZWIgYXJjaGl2ZSAoV0FSKQotZmlsZSBpcyBhIHBhY2thZ2VkIFdlYiBhcHBsaWNhdGlvbi4gV0FSIGZpbGVzIGNhbiBiZSB1c2VkIHRvIGltcG9ydCBhIFdlYgotYXBwbGljYXRpb24gaW50byBhIFdlYiBzZXJ2ZXIuPC9wPgotCi08cD5JbiBhZGRpdGlvbiB0byBwcm9qZWN0IHJlc291cmNlcywgdGhlIFdBUiBmaWxlIGluY2x1ZGVzIGEgV2ViIGRlcGxveW1lbnQKLWRlc2NyaXB0b3IgZmlsZS4gVGhlIFdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgaXMgYW4gWE1MIGZpbGUgdGhhdCBjb250YWlucwotZGVwbG95bWVudCBpbmZvcm1hdGlvbiwgTUlNRSB0eXBlcywgc2Vzc2lvbiBjb25maWd1cmF0aW9uIGRldGFpbHMsIGFuZCBvdGhlcgotc2V0dGluZ3MgZm9yIGEgV2ViIGFwcGxpY2F0aW9uLiBUaGUgV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlICg8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPndlYi54bWw8L3NwYW4+KQotcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFdBUiBmaWxlIGlzIHNoYXJlZCB3aXRoIHRoZSBkZXZlbG9wZXJzLCBhc3NlbWJsZXJzLAotYW5kIGRlcGxveWVycyBpbiBhIEoyRUUgZW52aXJvbm1lbnQuPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5UaGUgV2ViIGRldmVsb3BtZW50IGVudmlyb25tZW50IHByb3ZpZGVzIGZhY2lsaXRpZXMgZm9yIGltcG9ydGluZyBhbmQgZXhwb3J0aW5nCi1XQVIgZmlsZXMsIHVzaW5nIHRoZSBmb2xsb3dpbmcgd2l6YXJkczogPHVsPgotPGxpPjxzcGFuPkltcG9ydCBSZXNvdXJjZXMgZnJvbSBhIFdBUiBGaWxlPC9zcGFuPiwgd2hpY2ggcmVxdWlyZXMgdGhhdCB5b3UgdG8KLXNwZWNpZnkgYSBXZWIgcHJvamVjdC4gWW91IGNhbiB1c2UgZXhpc3RpbmcgcHJvamVjdHMgb3IgY3JlYXRlIHRoZW0gYXMgeW91Ci11c2UgdGhlIHdpemFyZC48L2xpPgotCi08bGk+PHNwYW4+RXhwb3J0IFJlc291cmNlcyB0byBhIFdBUiBGaWxlPC9zcGFuPiwgd2hpY2ggcmVxdWlyZXMgb25seSBhbiBleHBvcnQKLWxvY2F0aW9uIGFuZCBzb21lIG9wdGlvbmFsIHNldHRpbmdzPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M4ZWE2MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3d3ZWR0dnciIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgZWRpdG9yczxpbmRleHRlcm0+d29ya2JlbmNoIGludGVncmF0aW9uPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZXJlIGFyZSBzZXZlcmFsIGVkaXRvcnMgZm9yIHVzZSBpbiB2YXJpb3VzIGNvbnRleHRzIGZvciB2YXJpb3VzIGZpbGUNCi10eXBlcy4gVG8gZWRpdCBhIGZpbGUgdXNpbmcgaXRzIGRlZmF1bHQgZWRpdG9yLCBkb3VibGUtY2xpY2sgb24gdGhlIGZpbGUgbmFtZQ0KLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIG9yIHJpZ2h0LWNsaWNrIG9uIHRoZSBmaWxlIGFuZCBzZWxlY3QgPHVpY29udHJvbD5PcGVuPC91aWNvbnRyb2w+Lg0KLVRoZSBlZGl0b3IgdGhhdCBpcyBsYXN0IHVzZWQgdG8gb3BlbiBhIGZpbGUgYmVjb21lcyB0aGUgZGVmYXVsdCBmb3IgdGhhdCBwYXJ0aWN1bGFyDQotZmlsZS4gVG8gZWRpdCB0aGUgZmlsZSB3aXRoIGEgZGlmZmVyZW50IGVkaXRvciwgcmlnaHQtY2xpY2sgb24gdGhlIGZpbGUgYW5kDQotc2VsZWN0IDx1aWNvbnRyb2w+T3BlbiBXaXRoPC91aWNvbnRyb2w+IHRvIGNob29zZSBmcm9tIGEgbGlzdCBvZiBhdmFpbGFibGUNCi1lZGl0b3JzLjwvcD4NCi08cD5JbiB0aGUgd29ya2JlbmNoLCB5b3UgY2FuIGFzc29jaWF0ZSBmaWxlLW5hbWUgZXh0ZW5zaW9ucyBmb3IgZGlmZmVyZW50DQotdHlwZXMgb2YgcmVzb3VyY2VzIHdpdGggdmFyaW91cyBlZGl0b3JzLiBBIHJlc291cmNlIGV4dGVuc2lvbiBjYW4gaGF2ZSBtb3JlDQotdGhhbiBvbmUgZWRpdG9yIGFzc29jaWF0ZWQgd2l0aCBpdDsgdGhlIGxhc3QgZWRpdG9yIHVzZWQgZm9yIGEgcGFydGljdWxhcg0KLWV4dGVuc2lvbiB0eXBlIGlzIGluZGljYXRlZCBieSBhIGJsYWNrIGRvdCBiZWZvcmUgaXQgaW4gdGhlIDx1aWNvbnRyb2w+T3Blbg0KLVdpdGg8L3VpY29udHJvbD4gcG9wLXVwIG1lbnUuIFlvdSBjYW4gYXNzb2NpYXRlIGV4dGVuc2lvbnMgdGhhdCBhcmUga25vd24NCi10byB0aGUgd29ya2JlbmNoIHdpdGggYWRkaXRpb25hbCBlZGl0b3JzLCBieSB1c2luZyB0aGUgPGI+RmlsZSBBc3NvY2lhdGlvbnM8L2I+IHByZWZlcmVuY2VzDQotcGFnZSwgYWNjZXNzZWQgYnkgc2VsZWN0aW5nIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldvcmtiZW5jaDwvdWljb250cm9sPjx1aWNvbnRyb2w+RmlsZSBBc3NvY2lhdGlvbnM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L3A+DQotPHA+VGhlIFByb3BlcnRpZXMgdmlldyBwcm92aWRlcyBnZW5lcmFsIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBhZHZhbnRhZ2VvdXMNCi10byBXZWIgZWRpdG9yIHVzZXJzLiA8ZGw+PGRsZW50cnk+DQotPGR0PlByb3BlcnRpZXMgdmlldzwvZHQ+DQotPGRkPlRoZSBQcm9wZXJ0aWVzIHZpZXcgKDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+U2hvdw0KLVZpZXc8L3VpY29udHJvbD48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPikgY29udGFpbnMNCi1hIGxpc3Qgb2YgYXR0cmlidXRlcyBhbmQgZWRpdGFibGUgYXR0cmlidXRlIHZhbHVlcy4gRm9yIGV4YW1wbGUsIHdoZW4geW91DQotc2VsZWN0IGFuIGltYWdlIHRhZyA8dWljb250cm9sPmltZzwvdWljb250cm9sPiAsIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcw0KLWFwcGVhciBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIGFueSBvdGhlciBhdHRyaWJ1dGVzIGFsbG93ZWQgYnkgdGhlIHN0YW5kYXJkDQotc3BlY2lmaWVkIGluIHRoZSBET0NUWVBFIGZvciB0aGUgZmlsZSAoc3VjaCBhcyB0aGUgSFRNTCA0LjAuMSBEVEQpIGFyZSBsaXN0ZWQuDQotV2hlbiB5b3UgY2xpY2sgdGhlIHZhbHVlIGNvbHVtbiBvZiBhIHByb3BlcnR5LCB5b3UgY2FuIHNlbGVjdCBmcm9tIGFtb25nIHRoZQ0KLWxpc3Qgb2YgYXZhaWxhYmxlIGF0dHJpYnV0ZSB2YWx1ZXMuIDxwPlRoZSBwb3AtdXAgbWVudSBpbiB0aGUgUHJvcGVydGllcyB2aWV3DQotZW5hYmxlcyB5b3UgdG8gdW5kbywgY3V0LCBjb3B5LCBwYXN0ZSwgZGVsZXRlLCBhbmQgc2VsZWN0IGFsbC4gVGhlIG9wdGlvbnMNCi10aGF0IGFyZSBhdmFpbGFibGUgYXQgYSBnaXZlbiB0aW1lIGRlcGVuZHMgb24gd2hlcmUgdGhlIGN1cnNvciBpcyBsb2NhdGVkDQotd2hlbiB5b3UgcmlnaHQtY2xpY2sgdG8gZGlzcGxheSB0aGUgcG9wLXVwIG1lbnUuIFRvIHNlZSB0aGUgcG9wLXVwIG1lbnUgdGhhdA0KLWNvbnRhaW5zIHVuZG8sIGN1dCwgYW5kIHNvIG9uLCB0aGUgcHJvcGVydHkgdmFsdWUgZmllbGQgbXVzdCBiZSBhY3RpdmUuIChUaGlzDQotaXMgYWNjb21wbGlzaGVkIGJ5IHNlbGVjdGluZyB0aGUgcHJvcGVydHkgYW5kIHRoZW4gc2VsZWN0aW5nIGl0cyB2YWx1ZS4pIE90aGVyd2lzZSwNCi10aGUgcG9wLXVwIG1lbnUgd2lsbCBjb250YWluIGRpZmZlcmVudCBvcHRpb25zLjwvcD4gPHA+VXNlIHRoZSA8dWljb250cm9sPlJlc3RvcmUNCi1EZWZhdWx0IFZhbHVlPC91aWNvbnRyb2w+IGJ1dHRvbiB0byBjaGFuZ2UgYW55IHZhbHVlIGJhY2sgdG8gdGhlIGRlZmF1bHQgc2V0dGluZy48L3A+IDxwPkFmdGVyDQoteW91IGFyZSBpbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIG1vZGlmeSBvdGhlciBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHNwZWNpZmljDQotdGFncy4gVG8gZWRpdCBhbm90aGVyIHRhZyB1c2luZyB0aGUgUHJvcGVydGllcyB2aWV3LCBtb3ZlIHRoZSBjdXJzb3Igd2l0aGluDQotdGhlIGVkaXRpbmcgYXJlYSBvZiB0aGUgU291cmNlIHBhZ2Ugb3IgRGVzaWduIHBhZ2UgdG8gdGhlIHRhZyB5b3Ugd2FudCB0bw0KLWVkaXQuIFRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgUHJvcGVydGllcw0KLXZpZXcuPC9wPjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL2N3d2VkdHZ3Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2ZmZjZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvY3d3ZWR0dncuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IldvcmtiZW5jaCBpbnRlZ3JhdGlvbiB3aXRoIFdlYiBlZGl0b3JzIiAvPgotPG1ldGEgY29udGVudD0iV2ViIGVkaXRvcnMsIHdvcmtiZW5jaCBpbnRlZ3JhdGlvbiIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBlZGl0b3JzLCB3b3JrYmVuY2ggaW50ZWdyYXRpb24iIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN3d2VkdHZ3IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN3d2VkdHZ3Ij48YSBuYW1lPSJjd3dlZHR2dyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnM8L2gxPgotCi0KLTxkaXY+Ci08cD5UaGVyZSBhcmUgc2V2ZXJhbCBlZGl0b3JzIGZvciB1c2UgaW4gdmFyaW91cyBjb250ZXh0cyBmb3IgdmFyaW91cyBmaWxlCi10eXBlcy4gVG8gZWRpdCBhIGZpbGUgdXNpbmcgaXRzIGRlZmF1bHQgZWRpdG9yLCBkb3VibGUtY2xpY2sgb24gdGhlIGZpbGUgbmFtZQotaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldywgb3IgcmlnaHQtY2xpY2sgb24gdGhlIGZpbGUgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuPC9zcGFuPi4KLVRoZSBlZGl0b3IgdGhhdCBpcyBsYXN0IHVzZWQgdG8gb3BlbiBhIGZpbGUgYmVjb21lcyB0aGUgZGVmYXVsdCBmb3IgdGhhdCBwYXJ0aWN1bGFyCi1maWxlLiBUbyBlZGl0IHRoZSBmaWxlIHdpdGggYSBkaWZmZXJlbnQgZWRpdG9yLCByaWdodC1jbGljayBvbiB0aGUgZmlsZSBhbmQKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuIFdpdGg8L3NwYW4+IHRvIGNob29zZSBmcm9tIGEgbGlzdCBvZiBhdmFpbGFibGUKLWVkaXRvcnMuPC9wPgotCi08cD5JbiB0aGUgd29ya2JlbmNoLCB5b3UgY2FuIGFzc29jaWF0ZSBmaWxlLW5hbWUgZXh0ZW5zaW9ucyBmb3IgZGlmZmVyZW50Ci10eXBlcyBvZiByZXNvdXJjZXMgd2l0aCB2YXJpb3VzIGVkaXRvcnMuIEEgcmVzb3VyY2UgZXh0ZW5zaW9uIGNhbiBoYXZlIG1vcmUKLXRoYW4gb25lIGVkaXRvciBhc3NvY2lhdGVkIHdpdGggaXQ7IHRoZSBsYXN0IGVkaXRvciB1c2VkIGZvciBhIHBhcnRpY3VsYXIKLWV4dGVuc2lvbiB0eXBlIGlzIGluZGljYXRlZCBieSBhIGJsYWNrIGRvdCBiZWZvcmUgaXQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4KLVdpdGg8L3NwYW4+IHBvcC11cCBtZW51LiBZb3UgY2FuIGFzc29jaWF0ZSBleHRlbnNpb25zIHRoYXQgYXJlIGtub3duCi10byB0aGUgd29ya2JlbmNoIHdpdGggYWRkaXRpb25hbCBlZGl0b3JzLCBieSB1c2luZyB0aGUgPHN0cm9uZz5GaWxlIEFzc29jaWF0aW9uczwvc3Ryb25nPiBwcmVmZXJlbmNlcwotcGFnZSwgYWNjZXNzZWQgYnkgc2VsZWN0aW5nIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGUgQXNzb2NpYXRpb25zPC9zcGFuPjwvc3Bhbj4uPC9wPgotCi08ZGl2IGNsYXNzPSJwIj5UaGUgUHJvcGVydGllcyB2aWV3IHByb3ZpZGVzIGdlbmVyYWwgY2FwYWJpbGl0aWVzIHRoYXQgYXJlIGFkdmFudGFnZW91cwotdG8gV2ViIGVkaXRvciB1c2Vycy4gPGRsPgotPGR0IGNsYXNzPSJkbHRlcm0iPlByb3BlcnRpZXMgdmlldzwvZHQ+Ci0KLTxkZD5UaGUgUHJvcGVydGllcyB2aWV3ICg8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TaG93Ci1WaWV3PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+PC9zcGFuPikgY29udGFpbnMKLWEgbGlzdCBvZiBhdHRyaWJ1dGVzIGFuZCBlZGl0YWJsZSBhdHRyaWJ1dGUgdmFsdWVzLiBGb3IgZXhhbXBsZSwgd2hlbiB5b3UKLXNlbGVjdCBhbiBpbWFnZSB0YWcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+aW1nPC9zcGFuPiAsIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IHZhbHVlcwotYXBwZWFyIGZvciBlZGl0aW5nLiBJbiBhZGRpdGlvbiwgYW55IG90aGVyIGF0dHJpYnV0ZXMgYWxsb3dlZCBieSB0aGUgc3RhbmRhcmQKLXNwZWNpZmllZCBpbiB0aGUgRE9DVFlQRSBmb3IgdGhlIGZpbGUgKHN1Y2ggYXMgdGhlIEhUTUwgNC4wLjEgRFREKSBhcmUgbGlzdGVkLgotV2hlbiB5b3UgY2xpY2sgdGhlIHZhbHVlIGNvbHVtbiBvZiBhIHByb3BlcnR5LCB5b3UgY2FuIHNlbGVjdCBmcm9tIGFtb25nIHRoZQotbGlzdCBvZiBhdmFpbGFibGUgYXR0cmlidXRlIHZhbHVlcy4gPHA+VGhlIHBvcC11cCBtZW51IGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcKLWVuYWJsZXMgeW91IHRvIHVuZG8sIGN1dCwgY29weSwgcGFzdGUsIGRlbGV0ZSwgYW5kIHNlbGVjdCBhbGwuIFRoZSBvcHRpb25zCi10aGF0IGFyZSBhdmFpbGFibGUgYXQgYSBnaXZlbiB0aW1lIGRlcGVuZHMgb24gd2hlcmUgdGhlIGN1cnNvciBpcyBsb2NhdGVkCi13aGVuIHlvdSByaWdodC1jbGljayB0byBkaXNwbGF5IHRoZSBwb3AtdXAgbWVudS4gVG8gc2VlIHRoZSBwb3AtdXAgbWVudSB0aGF0Ci1jb250YWlucyB1bmRvLCBjdXQsIGFuZCBzbyBvbiwgdGhlIHByb3BlcnR5IHZhbHVlIGZpZWxkIG11c3QgYmUgYWN0aXZlLiAoVGhpcwotaXMgYWNjb21wbGlzaGVkIGJ5IHNlbGVjdGluZyB0aGUgcHJvcGVydHkgYW5kIHRoZW4gc2VsZWN0aW5nIGl0cyB2YWx1ZS4pIE90aGVyd2lzZSwKLXRoZSBwb3AtdXAgbWVudSB3aWxsIGNvbnRhaW4gZGlmZmVyZW50IG9wdGlvbnMuPC9wPgotIDxwPlVzZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZQotRGVmYXVsdCBWYWx1ZTwvc3Bhbj4gYnV0dG9uIHRvIGNoYW5nZSBhbnkgdmFsdWUgYmFjayB0byB0aGUgZGVmYXVsdCBzZXR0aW5nLjwvcD4KLSA8cD5BZnRlcgoteW91IGFyZSBpbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIG1vZGlmeSBvdGhlciBwcm9wZXJ0eSB2YWx1ZXMgZm9yIHNwZWNpZmljCi10YWdzLiBUbyBlZGl0IGFub3RoZXIgdGFnIHVzaW5nIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIG1vdmUgdGhlIGN1cnNvciB3aXRoaW4KLXRoZSBlZGl0aW5nIGFyZWEgb2YgdGhlIFNvdXJjZSBwYWdlIG9yIERlc2lnbiBwYWdlIHRvIHRoZSB0YWcgeW91IHdhbnQgdG8KLWVkaXQuIFRoZSBhcHByb3ByaWF0ZSBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMgYXJlIGRpc3BsYXllZCBpbiB0aGUgUHJvcGVydGllcwotdmlldy48L3A+Ci08L2RkPgotCi08L2RsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNoZ3hkdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDVhMDFhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNoZ3hkdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amNoZ3hkdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U3BlY2lmeWluZyBhbiBpbXBsaWNpdCBkb2N1bWVudCB0eXBlIGZvciBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50PC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5kb2N1bWVudCB0eXBlczxpbmRleHRlcm0+aW1wbGljaXQgZm9yIGZyYWdtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+SFRNTDxpbmRleHRlcm0+ZnJhZ21lbnRzPGluZGV4dGVybT5pbXBsaWNpdCBkb2N1bWVudCB0eXBlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YSFRNTDxpbmRleHRlcm0+ZnJhZ21lbnRzPGluZGV4dGVybT5pbXBsaWNpdCBkb2N1bWVudCB0eXBlPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5KU1A8aW5kZXh0ZXJtPmZyYWdtZW50czxpbmRleHRlcm0+aW1wbGljaXQgZG9jdW1lbnQgdHlwZTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+ZG9jdHlwZSBkZWNsYXJhdGlvbjxpbmRleHRlcm0+aW1wbGljaXQgZm9yIGZyYWdtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPkFuIDxpPmltcGxpY2l0PC9pPiBkb2N1bWVudCB0eXBlIGlzIHVzZWQgZm9yIGNvbnRlbnQgYXNzaXN0IChDVFJMK1NwYWNlYmFyKSwNCi10aGUgUHJvcGVydGllcyB2aWV3LCBhbmQgb3RoZXIgZWRpdGluZyBjb250ZXh0cyB3aGVuIG5vIERPQ1RZUEUgZGVjbGFyYXRpb24NCi1pcyBzcGVjaWZpZWQgaW4gYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmaWxlLiBUeXBpY2FsbHksIHRoaXMgZmVhdHVyZSBpcyB1c2VkDQotZm9yIGEgZnJhZ21lbnQgKHBhcnRpYWwgZG9jdW1lbnQpIHRoYXQgY2FuIGJlIGluY2x1ZGVkIGluIG90aGVyIHBhZ2VzIHVzaW5nDQotSlNQIGluY2x1ZGUgb3Igc2VydmVyLXNpZGUgaW5jbHVkZS48L3A+PHA+VG8gYXNzaWduIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUNCi10byBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZyYWdtZW50LCBkbyB0aGUgZm9sbG93aW5nOiA8L3A+IDwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIHNlbGVjdCB0aGUgSFRNTCwgWEhUTUwsIG9yIEpTUA0KLWZyYWdtZW50LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8cGg+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PC9waD4gZnJvbSB0aGUgZmlsZSdzDQotcG9wLXVwIG1lbnUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3VpY29udHJvbD4gcGFnZSwgc2VsZWN0DQotdGhlIGRlc2lyZWQgRE9DVFlQRSBmcm9tIHRoZSA8cGg+PHVpY29udHJvbD5Eb2N1bWVudCB0eXBlPC91aWNvbnRyb2w+PC9waD4gZHJvcC1kb3duDQotbGlzdC48L2NtZD48aW5mbz48cD5UaGUgPHBoPjx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPjwvcGg+IGRpYWxvZw0KLWZvciBXZWIgcHJvamVjdHMgYWxzbyBpbmNsdWRlcyBhbiA8cGg+PHVpY29udHJvbD5XZWIgQ29udGVudCBTZXR0aW5nczwvdWljb250cm9sPjwvcGg+IHBhZ2UsDQotd2hlcmUgeW91IGNhbiBzcGVjaWZ5IHByb2plY3QtZGVmYXVsdCBIVE1MIGRvY3VtZW50IHR5cGUuIFRoaXMgc2V0dGluZyB3aWxsDQotYmUgdXNlZCBpZiBubyBET0NUWVBFIGRlY2xhcmF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgZmlsZSwgYW5kIG5vIGRlZmF1bHQNCi1kb2N1bWVudCB0eXBlIGlzIHNwZWNpZmllZCBpbiB0aGUgPHBoPjx1aWNvbnRyb2w+V2ViIENvbnRlbnQgU2V0dGluZ3M8L3VpY29udHJvbD48L3BoPiBwYWdlDQotb24gdGhlIDxwaD48dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD48L3BoPiBkaWFsb2cgZm9yIHRoZSBmaWxlLjwvcD48L2luZm8+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY2hneGR0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhOTc0ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjaGd4ZHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL0lFVEYvL0RURCBIVE1MIDQuMC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPjxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQ8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRqY2hneGR0Ij48YSBuYW1lPSJ0amNoZ3hkdCI+PCEtLSAtLT48L2E+Ci08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TcGVjaWZ5aW5nIGFuIGltcGxpY2l0IGRvY3VtZW50IHR5cGUgZm9yIGFuIEhUTUwsIFhIVE1MLCBvciBKU1AgZnJhZ21lbnQ8L2gxPgotPGRpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+QW4gPGVtPmltcGxpY2l0PC9lbT4gZG9jdW1lbnQgdHlwZSBpcyB1c2VkIGZvciBjb250ZW50IGFzc2lzdCAoQ1RSTCtTcGFjZWJhciksCi10aGUgUHJvcGVydGllcyB2aWV3LCBhbmQgb3RoZXIgZWRpdGluZyBjb250ZXh0cyB3aGVuIG5vIERPQ1RZUEUgZGVjbGFyYXRpb24KLWlzIHNwZWNpZmllZCBpbiBhbiBIVE1MLCBYSFRNTCwgb3IgSlNQIGZpbGUuIFR5cGljYWxseSwgdGhpcyBmZWF0dXJlIGlzIHVzZWQKLWZvciBhIGZyYWdtZW50IChwYXJ0aWFsIGRvY3VtZW50KSB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiBvdGhlciBwYWdlcyB1c2luZwotSlNQIGluY2x1ZGUgb3Igc2VydmVyLXNpZGUgaW5jbHVkZS48L3A+Ci08cD5UbyBhc3NpZ24gYW4gaW1wbGljaXQgZG9jdW1lbnQgdHlwZQotdG8gYW4gSFRNTCwgWEhUTUwsIG9yIEpTUCBmcmFnbWVudCwgZG8gdGhlIGZvbGxvd2luZzogPC9wPgotIDwvZGl2PgotPG9sPjxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBzZWxlY3QgdGhlIEhUTUwsIFhIVE1MLCBvciBKU1AKLWZyYWdtZW50Ljwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4+PGI+UHJvcGVydGllczwvYj48L3NwYW4+IGZyb20gdGhlIGZpbGUncwotcG9wLXVwIG1lbnUuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSA8Yj5XZWIgQ29udGVudCBTZXR0aW5nczwvYj4gcGFnZSwgc2VsZWN0Ci10aGUgZGVzaXJlZCBET0NUWVBFIGZyb20gdGhlIDxzcGFuPjxiPkRvY3VtZW50IHR5cGU8L2I+PC9zcGFuPiBkcm9wLWRvd24KLWxpc3QuPC9zcGFuPiA8cD5UaGUgPHNwYW4+PGI+UHJvcGVydGllczwvYj48L3NwYW4+IGRpYWxvZwotZm9yIFdlYiBwcm9qZWN0cyBhbHNvIGluY2x1ZGVzIGFuIDxzcGFuPjxiPldlYiBDb250ZW50IFNldHRpbmdzPC9iPjwvc3Bhbj4gcGFnZSwKLXdoZXJlIHlvdSBjYW4gc3BlY2lmeSBwcm9qZWN0LWRlZmF1bHQgSFRNTCBkb2N1bWVudCB0eXBlLiBUaGlzIHNldHRpbmcgd2lsbAotYmUgdXNlZCBpZiBubyBET0NUWVBFIGRlY2xhcmF0aW9uIGlzIHNwZWNpZmllZCBpbiB0aGUgZmlsZSwgYW5kIG5vIGRlZmF1bHQKLWRvY3VtZW50IHR5cGUgaXMgc3BlY2lmaWVkIGluIHRoZSA8c3Bhbj48Yj5XZWIgQ29udGVudCBTZXR0aW5nczwvYj48L3NwYW4+IHBhZ2UKLW9uIHRoZSA8c3Bhbj48Yj5Qcm9wZXJ0aWVzPC9iPjwvc3Bhbj4gZGlhbG9nIGZvciB0aGUgZmlsZS48L3A+Ci08L2xpPgotPC9vbD4KLTwvZGl2PgotPGRpdj48L2Rpdj4KLTwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlaHRtLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY2OGIzNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpjcmVodG0iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIE5ldyBIVE1MIEZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBIVE1MIGFuZCBYSFRNTCBmaWxlcw0KLWFuZCBmcmFtZXNldHMuIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz4NCi08aW5kZXh0ZXJtPkhUTUwgZmlsZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YSFRNTCBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldNTCBmaWxlczxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmZyYW1lc2V0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQ0KLWRvbmUgc28uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIGV4cGFuZCB5b3VyIHByb2plY3QgYW5kIHJpZ2h0IGNsaWNrIG9uDQoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgPC9jbWQ+PGluZm8+Tm90ZQ0KLXRoYXQgaWYgeW91IGNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSFRNTCBmaWxlLCB0aGVuDQotaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gSW4NCi1hZGRpdGlvbiwgbGluayB2YWxpZGF0aW9uIHdpbGwgbm90IGVuY29tcGFzcyBmaWxlcyB0aGF0IGFyZSBub3QgdW5kZXIgdGhlDQotV2ViQ29udGVudCBmb2xkZXIuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbD48dWljb250cm9sPldlYjwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+LjwvY21kPjxzdGVwcmVzdWx0PlRoZSBOZXcgSFRNTCBQYWdlIHdpbmRvdyBhcHBlYXJzIHdpdGggeW91cg0KLWZvbGRlciBzZWxlY3RlZDwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUNCi1hbiBodG1sIGV4dGVuc2lvbiAoaHRtbCwgaHRtLCB4aHRtbCwgaHRwbCwgd21sLCBzaHRtbCwgb3Igc2h0bSkgaW4gdGhlIGZpbGUNCi1uYW1lLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBIVE1MIGZpbGUsIHNlbGVjdCA8dWljb250cm9sPkZpbmlzaC48L3VpY29udHJvbD48L2Nob2ljZT4NCi08Y2hvaWNlPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSFRNTCBwYWdlLA0KLXNlbGVjdCA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uIFRoZSBTZWxlY3QgSFRNTCBUZW1wbGF0ZSB3aW5kb3cgYXBwZWFycy4NCi1TZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlIEhUTUwgVGVtcGxhdGU8L3VpY29udHJvbD4gY2hlY2sgYm94LCBhbmQgdGhlbiBzZWxlY3QNCi1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDx1aWNvbnRyb2w+SFRNTCBUZW1wbGF0ZXM8L3VpY29udHJvbD4gbGluaw0KLXRvIGFkZCBvciByZW1vdmUgSFRNTCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlaHRtLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFmNzM4Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVodG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIE5ldyBIVE1MIEZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgTmV3IEhUTUwgRmlsZSB3aXphcmQgdG8gY3JlYXRlIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMuIiAvPgotPG1ldGEgY29udGVudD0iSFRNTCBmaWxlcywgY3JlYXRpbmcsIFhIVE1MIGZpbGVzLCBXTUwgZmlsZXMsIGZyYW1lc2V0cyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IkhUTUwgZmlsZXMsIGNyZWF0aW5nLCBYSFRNTCBmaWxlcywgV01MIGZpbGVzLCBmcmFtZXNldHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRqY3JlaHRtIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgSFRNTCBhbmQgWEhUTUwgZmlsZXMgYW5kIGZyYW1lc2V0czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpjcmVodG0iPjxhIG5hbWU9InRqY3JlaHRtIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBIVE1MIGFuZCBYSFRNTCBmaWxlcyBhbmQgZnJhbWVzZXRzPC9oMT4KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgdGhlIE5ldyBIVE1MIEZpbGUgd2l6YXJkIHRvIGNyZWF0ZSBIVE1MIGFuZCBYSFRNTCBmaWxlcwotYW5kIGZyYW1lc2V0cy4gPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgc3RhdGljIG9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCBpZiB5b3UgaGF2ZSBub3QgYWxyZWFkeQotZG9uZSBzby48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24KLXlvdXIgV2ViQ29udGVudCBmb2xkZXIgb3Igb24gYSBzdWJmb2xkZXIgdW5kZXIgV2ViQ29udGVudC4gIDwvc3Bhbj4gTm90ZQotdGhhdCBpZiB5b3UgY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBIVE1MIGZpbGUsIHRoZW4KLWl0IHdpbGwgbm90IGJlIGluY2x1ZGVkIGluIHRoZSBXQVIgZmlsZSB0aGF0IGlzIGRlcGxveWVkIHRvIHRoZSBzZXJ2ZXIuIEluCi1hZGRpdGlvbiwgbGluayB2YWxpZGF0aW9uIHdpbGwgbm90IGVuY29tcGFzcyBmaWxlcyB0aGF0IGFyZSBub3QgdW5kZXIgdGhlCi1XZWJDb250ZW50IGZvbGRlci48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV3PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUw8L3NwYW4+Ci08L3NwYW4+Ljwvc3Bhbj4gVGhlIE5ldyBIVE1MIFBhZ2Ugd2luZG93IGFwcGVhcnMgd2l0aCB5b3VyCi1mb2xkZXIgc2VsZWN0ZWQ8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgYSBmaWxlIG5hbWUgaW50byB0aGUgRmlsZSBuYW1lIGZpZWxkLCBtYWtpbmcgc3VyZSB5b3UgaW5jbHVkZQotYW4gaHRtbCBleHRlbnNpb24gKGh0bWwsIGh0bSwgeGh0bWwsIGh0cGwsIHdtbCwgc2h0bWwsIG9yIHNodG0pIGluIHRoZSBmaWxlCi1uYW1lLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9zcGFuPgotPHVsPgotPGxpPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IEhUTUwgZmlsZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaC48L3NwYW4+PC9saT4KLQotPGxpPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSFRNTCBwYWdlLAotc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LiBUaGUgU2VsZWN0IEhUTUwgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuCi1TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBIVE1MIFRlbXBsYXRlPC9zcGFuPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdAotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIFRlbXBsYXRlczwvc3Bhbj4gbGluawotdG8gYWRkIG9yIHJlbW92ZSBIVE1MIHRlbXBsYXRlcyB0byB5b3VyIGxpc3Qgb2YgdGVtcGxhdGVzLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVqc3AuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTc1YjMxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amNyZWpzcC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0amNyZWpzcCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgSmF2YVNlcnZlciBQYWdlcyAoSlNQKSBmaWxlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+SlNQIGZpbGVzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+TW9zdCB0eXBlcyBvZiBKU1AgZmlsZXMgY2FuIGJlIGNyZWF0ZWQgdXNpbmcgdGhlIE5ldyBKU1AgRmlsZQ0KLXdpemFyZC4gVG8gY3JlYXRlIGEgYmFzaWMgSlNQIGZpbGUgdXNpbmcgdGhlIHdpemFyZCwgY29tcGxldGUgdGhlIGZvbGxvd2luZw0KLXN0ZXBzOiA8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIGR5bmFtaWMgV2ViIHByb2plY3QgaWYgeW91IGhhdmUgbm90IGFscmVhZHkgZG9uZSBzby48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24NCi15b3VyIFdlYkNvbnRlbnQgZm9sZGVyIG9yIG9uIGEgc3ViZm9sZGVyIHVuZGVyIFdlYkNvbnRlbnQuICBOb3RlIHRoYXQgaWYgeW91DQotY2hvb3NlIGFueSBvdGhlciBmb2xkZXIgaW4gd2hpY2ggdG8gY3JlYXRlIHRoZSBKU1AsIHRoZW4gaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQNCi1pbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBJbiBhZGRpdGlvbiwgbGluayB2YWxpZGF0aW9uDQotd2lsbCBub3QgZW5jb21wYXNzIGZpbGVzIHRoYXQgYXJlIG5vdCB1bmRlciB0aGUgV2ViQ29udGVudCBmb2xkZXIuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgY29udGV4dCBtZW51LCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+TmV3PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5KU1A8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48c3RlcHJlc3VsdD5UaGUgTmV3IEphdmEgU2VydmVyDQotUGFnZSB3aW5kb3cgYXBwZWFycyB3aXRoIHlvdXIgZm9sZGVyIHNlbGVjdGVkPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPlR5cGUgYSBmaWxlIG5hbWUgaW50byB0aGUgRmlsZSBuYW1lIGZpZWxkLCBtYWtpbmcgc3VyZSB5b3UgaW5jbHVkZQ0KLXRoZSBqc3AgZXh0ZW5zaW9uIChqc3AsIGpzdiwganRwbCwgb3IganNweCkgaW4gdGhlIGZpbGUgbmFtZS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+VG8gYWNjZXB0IHRoZSBkZWZhdWx0cyBhc3NvY2lhdGVkIHdpdGggYSBuZXcgSlNQIGZpbGUsIHNlbGVjdCA8dWljb250cm9sPkZpbmlzaC48L3VpY29udHJvbD48L2Nob2ljZT4NCi08Y2hvaWNlPlRvIGxpbmsgdG8gYSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgc3BlY2lmeSBwYXRoIHZhcmlhYmxlcywgc2VsZWN0IDx1aWNvbnRyb2w+QWR2YW5jZWQ8L3VpY29udHJvbD4gYW5kDQotdGhlbiBtYWtlIHlvdXIgc2VsZWN0aW9ucyB1c2luZyB0aGUgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gYW5kIDx1aWNvbnRyb2w+VmFyaWFibGVzPC91aWNvbnRyb2w+IGJ1dHRvbnMuIDwvY2hvaWNlPg0KLTxjaG9pY2U+IFRvIHVzZSBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgeW91ciBKU1AgcGFnZSwNCi1zZWxlY3QgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiBUaGUgU2VsZWN0IEpTUCBUZW1wbGF0ZSB3aW5kb3cgYXBwZWFycy4NCi1TZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlIEpTUCBUZW1wbGF0ZTwvdWljb250cm9sPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdA0KLW9uZSBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgPHVpY29udHJvbD5KU1AgVGVtcGxhdGVzPC91aWNvbnRyb2w+IGxpbmsNCi10byBhZGQgb3IgcmVtb3ZlIEpTUCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqY3JlanNwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVqc3AuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1NjMwMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpjcmVqc3AuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiIC8+Ci08bWV0YSBjb250ZW50PSJKU1AgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iSlNQIGZpbGVzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpjcmVqc3AiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0amNyZWpzcCI+PGEgbmFtZT0idGpjcmVqc3AiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Nb3N0IHR5cGVzIG9mIEpTUCBmaWxlcyBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUgTmV3IEpTUCBGaWxlCi13aXphcmQuIFRvIGNyZWF0ZSBhIGJhc2ljIEpTUCBmaWxlIHVzaW5nIHRoZSB3aXphcmQsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcKLXN0ZXBzOiA8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5IGRvbmUgc28uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgZXhwYW5kIHlvdXIgcHJvamVjdCBhbmQgcmlnaHQgY2xpY2sgb24KLXlvdXIgV2ViQ29udGVudCBmb2xkZXIgb3Igb24gYSBzdWJmb2xkZXIgdW5kZXIgV2ViQ29udGVudC4gIE5vdGUgdGhhdCBpZiB5b3UKLWNob29zZSBhbnkgb3RoZXIgZm9sZGVyIGluIHdoaWNoIHRvIGNyZWF0ZSB0aGUgSlNQLCB0aGVuIGl0IHdpbGwgbm90IGJlIGluY2x1ZGVkCi1pbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiBJbiBhZGRpdGlvbiwgbGluayB2YWxpZGF0aW9uCi13aWxsIG5vdCBlbmNvbXBhc3MgZmlsZXMgdGhhdCBhcmUgbm90IHVuZGVyIHRoZSBXZWJDb250ZW50IGZvbGRlci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIHRoZSBjb250ZXh0IG1lbnUsIHNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkpTUDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4gVGhlIE5ldyBKYXZhIFNlcnZlcgotUGFnZSB3aW5kb3cgYXBwZWFycyB3aXRoIHlvdXIgZm9sZGVyIHNlbGVjdGVkPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUKLXRoZSBqc3AgZXh0ZW5zaW9uIChqc3AsIGpzdiwganRwbCwgb3IganNweCkgaW4gdGhlIGZpbGUgbmFtZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gWW91IGhhdmUgc2V2ZXJhbCBvcHRpb25zIGZvciBwcm9jZWVkaW5nOjwvc3Bhbj4KLTx1bD4KLTxsaT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBKU1AgZmlsZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaC48L3NwYW4+PC9saT4KLQotPGxpPlRvIGxpbmsgdG8gYSBmaWxlIGluIHRoZSBmaWxlIHN5c3RlbSBhbmQgc3BlY2lmeSBwYXRoIHZhcmlhYmxlcywgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkdmFuY2VkPC9zcGFuPiBhbmQKLXRoZW4gbWFrZSB5b3VyIHNlbGVjdGlvbnMgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlhYmxlczwvc3Bhbj4gYnV0dG9ucy4gPC9saT4KLQotPGxpPiBUbyB1c2UgYSB0ZW1wbGF0ZSBmaWxlIGZvciB0aGUgaW5pdGlhbCBjb250ZW50IG9mIHlvdXIgSlNQIHBhZ2UsCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIFRoZSBTZWxlY3QgSlNQIFRlbXBsYXRlIHdpbmRvdyBhcHBlYXJzLgotU2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Vc2UgSlNQIFRlbXBsYXRlPC9zcGFuPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdAotb25lIG9mIHRoZSBzYW1wbGUgdGVtcGxhdGVzLiBZb3UgY2FuIGFsc28gc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5KU1AgVGVtcGxhdGVzPC9zcGFuPiBsaW5rCi10byBhZGQgb3IgcmVtb3ZlIEpTUCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqZGV0YWdzLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ4ZjE5Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGpkZXRhZ3MiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3PC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgcGFnZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VG8gYWlkIGluIFdlYiBzaXRlIGRldmVsb3BtZW50IGFuZCBlZGl0aW5nLCB0aGVyZSBpcyBsb2NhbCB0YWcNCi1ob3ZlciBoZWxwIGZvciBhbGwgc3VwcG9ydGVkIHRhZyBzZXRzLCBhcyB3ZWxsIGFzIDx4cmVmIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5zc2UuZG9jLnVzZXIvdG9waWNzL2NzcmNlZHQwMDYuZGl0YSINCi1zY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPmNvbnRlbnQgYXNzaXN0PC94cmVmPiAoQ3RybCtTcGFjZWJhciksIGEgdG9vbCB0aGF0IGhlbHBzIHlvdQ0KLWluc2VydCBvciBmaW5pc2ggYSB0YWcgb3IgZnVuY3Rpb24gb3IgZmluaXNoIGEgbGluZSBvZiBjb2RlIGluIGEgc3RydWN0dXJlZA0KLXRleHQgZWRpdG9yLjwvcD48cD48aW1hZ2UgYWx0PSJGb3IgV2luZG93cyIgaHJlZj0iLi4vaW1hZ2VzL253aW4uZ2lmIiBwbGFjZW1lbnQ9ImlubGluZSI+DQotPC9pbWFnZT4gWW91IGNhbiB0b2dnbGUgYW1vbmcgdGhyZWUgbW9kZXMgdG8gdmlzdWFsbHkgZGVzaWduIHBhZ2VzLCB3b3JrIHdpdGgNCi1IVE1MLCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhU2NyaXB0Ij5KYXZhU2NyaXB0PC90bT4gb3INCi1KU1AgY29udGVudCwgYW5kIHByZXZpZXcgeW91ciBwYWdlcy4gVG8gaGVscCB5b3UgY3JlYXRlIHRoZSB2aXN1YWwgaW1wYWN0DQoteW91IHdhbnQgb24geW91ciBXZWIgc2l0ZXMsIHRoZSBlZGl0b3IgaW5jbHVkZXMgaXRzIG93biBsaWJyYXJ5IG9mIHJldXNhYmxlDQotZ3JhcGhpY3MgYW5kIHR3byBncmFwaGljIHByb2dyYW1zIGZvciBjcmVhdGluZywgZWRpdGluZywgYW5kIGFuaW1hdGluZyBpbWFnZQ0KLWZpbGVzLiA8L3A+PHA+PGltYWdlIGFsdD0iRm9yIExpbnV4IiBocmVmPSIuLi9pbWFnZXMvbmxpbnV4LmdpZiIgcGxhY2VtZW50PSJpbmxpbmUiPg0KLTwvaW1hZ2U+IFlvdSBjYW4gdG9nZ2xlIGJldHdlZW4gdHdvIG1vZGVzIHRvIHZpc3VhbGx5IGRlc2lnbiBwYWdlcyBvciB3b3JrDQotd2l0aCBIVE1MLCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmFTY3JpcHQiPkphdmFTY3JpcHQ8L3RtPiBvciBKU1AgY29udGVudC4gVG8gaGVscCB5b3UgY3JlYXRlDQotdGhlIHZpc3VhbCBpbXBhY3QgeW91IHdhbnQgb24geW91ciBXZWIgc2l0ZXMsIHRoZSBlZGl0b3IgaW5jbHVkZXMgaXRzIG93bg0KLWxpYnJhcnkgb2YgcmV1c2FibGUgZ3JhcGhpY3MgYW5kIGEgZ3JhcGhpYyBwcm9ncmFtIGZvciBjcmVhdGluZywgZWRpdGluZywNCi1hbmQgYW5pbWF0aW5nIGltYWdlIGZpbGVzLjwvcD48bm90ZT5Vc2UgZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UgYWxwaGFudW1lcmljDQotY2hhcmFjdGVycyBjb25zaXN0ZW50bHkgd2hlbiBuYW1pbmcgSFRNTCBmaWxlcyBhbmQgZW1iZWRkZWQgZmlsZXMgKHN1Y2ggYXMNCi1pbWFnZSBmaWxlcykgdXNlZCBpbiB5b3VyIFdlYiBwYWdlcywgYmVjYXVzZSBzb21lIHNlcnZlciBvcGVyYXRpbmcgc3lzdGVtcw0KLWFyZSBjYXNlIHNlbnNpdGl2ZS4gRG8gbm90IHVzZSBzcGFjZXMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMgZXhjbGFtYXRpb24NCi1wb2ludHMgb3IgcXVlc3Rpb24gbWFya3MgaW4gZmlsZSBuYW1lcy48L25vdGU+IDwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdGpkZXRhZ3MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTVlOWNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90amRldGFncy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgcGFnZXMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV2ViIHBhZ2VzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpkZXRhZ3MiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpkZXRhZ3MiPjxhIG5hbWU9InRqZGV0YWdzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBhbmQgZWRpdGluZyBXZWIgcGFnZXMgLSBvdmVydmlldzwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5UbyBhaWQgaW4gV2ViIHNpdGUgZGV2ZWxvcG1lbnQgYW5kIGVkaXRpbmcsIHRoZXJlIGlzIGxvY2FsIHRhZwotaG92ZXIgaGVscCBmb3IgYWxsIHN1cHBvcnRlZCB0YWcgc2V0cywgYXMgd2VsbCBhcyA8YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3Quc3NlLmRvYy51c2VyL3RvcGljcy9jc3JjZWR0MDA2Lmh0bWwiIHRpdGxlPSIiPmNvbnRlbnQgYXNzaXN0PC9hPiAoQ3RybCtTcGFjZWJhciksIGEgdG9vbCB0aGF0IGhlbHBzIHlvdQotaW5zZXJ0IG9yIGZpbmlzaCBhIHRhZyBvciBmdW5jdGlvbiBvciBmaW5pc2ggYSBsaW5lIG9mIGNvZGUgaW4gYSBzdHJ1Y3R1cmVkCi10ZXh0IGVkaXRvci48L3A+Ci08cD48aW1nIHNyYz0iLi4vaW1hZ2VzL253aW4uZ2lmIiBhbHQ9IkZvciBXaW5kb3dzIiAvPiBZb3UgY2FuIHRvZ2dsZSBhbW9uZyB0aHJlZSBtb2RlcyB0byB2aXN1YWxseSBkZXNpZ24gcGFnZXMsIHdvcmsgd2l0aAotSFRNTCwgSmF2YVNjcmlwdOKEoiBvcgotSlNQIGNvbnRlbnQsIGFuZCBwcmV2aWV3IHlvdXIgcGFnZXMuIFRvIGhlbHAgeW91IGNyZWF0ZSB0aGUgdmlzdWFsIGltcGFjdAoteW91IHdhbnQgb24geW91ciBXZWIgc2l0ZXMsIHRoZSBlZGl0b3IgaW5jbHVkZXMgaXRzIG93biBsaWJyYXJ5IG9mIHJldXNhYmxlCi1ncmFwaGljcyBhbmQgdHdvIGdyYXBoaWMgcHJvZ3JhbXMgZm9yIGNyZWF0aW5nLCBlZGl0aW5nLCBhbmQgYW5pbWF0aW5nIGltYWdlCi1maWxlcy4gPC9wPgotPHA+PGltZyBzcmM9Ii4uL2ltYWdlcy9ubGludXguZ2lmIiBhbHQ9IkZvciBMaW51eCIgLz4gWW91IGNhbiB0b2dnbGUgYmV0d2VlbiB0d28gbW9kZXMgdG8gdmlzdWFsbHkgZGVzaWduIHBhZ2VzIG9yIHdvcmsKLXdpdGggSFRNTCwgSmF2YVNjcmlwdCBvciBKU1AgY29udGVudC4gVG8gaGVscCB5b3UgY3JlYXRlCi10aGUgdmlzdWFsIGltcGFjdCB5b3Ugd2FudCBvbiB5b3VyIFdlYiBzaXRlcywgdGhlIGVkaXRvciBpbmNsdWRlcyBpdHMgb3duCi1saWJyYXJ5IG9mIHJldXNhYmxlIGdyYXBoaWNzIGFuZCBhIGdyYXBoaWMgcHJvZ3JhbSBmb3IgY3JlYXRpbmcsIGVkaXRpbmcsCi1hbmQgYW5pbWF0aW5nIGltYWdlIGZpbGVzLjwvcD4KLTxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBVc2UgZWl0aGVyIHVwcGVyY2FzZSBvciBsb3dlcmNhc2UgYWxwaGFudW1lcmljCi1jaGFyYWN0ZXJzIGNvbnNpc3RlbnRseSB3aGVuIG5hbWluZyBIVE1MIGZpbGVzIGFuZCBlbWJlZGRlZCBmaWxlcyAoc3VjaCBhcwotaW1hZ2UgZmlsZXMpIHVzZWQgaW4geW91ciBXZWIgcGFnZXMsIGJlY2F1c2Ugc29tZSBzZXJ2ZXIgb3BlcmF0aW5nIHN5c3RlbXMKLWFyZSBjYXNlIHNlbnNpdGl2ZS4gRG8gbm90IHVzZSBzcGFjZXMgb3Igc3BlY2lhbCBjaGFyYWN0ZXJzIHN1Y2ggYXMgZXhjbGFtYXRpb24KLXBvaW50cyBvciBxdWVzdGlvbiBtYXJrcyBpbiBmaWxlIG5hbWVzLjwvZGl2PgotIDwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90anByZWZzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMWU2OTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgIDE5ODgtMjAwMiwgdi40MDAyLS0+DQotPHRhc2sgaWQ9InRqcHJlZnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPjxpbmRleHRlcm0+SFRNTCBmaWxlczxpbmRleHRlcm0+ZWRpdGluZzxpbmRleHRlcm0+cHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb248aW5kZXh0ZXJtPmFkZGluZyBhdXRvbWF0aWNhbGx5PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5IVE1MIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5wcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+RE9DVFlQRSBkZWNsYXJhdGlvbjxpbmRleHRlcm0+YWRkaW5nIGF1dG9tYXRpY2FsbHk8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi1UbyBkZWZpbmUgZ2VuZXJhbCBIVE1MIGZpbGUgcHJlZmVyZW5jZXMsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSA8dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPiBtZW51LCBzZWxlY3QgPHVpY29udHJvbD5QcmVmZXJlbmNlczwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2ViIGFuZA0KLVhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+SFRNTCBGaWxlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIGZvbGxvd2luZyBzZXR0aW5ncyByZWxhdGVkIHRvIHNhdmluZyBhbiBIVE1MIHNvdXJjZQ0KLXBhZ2UuIFRoZSBkZWZhdWx0cyBhcmUgcmVjb21tZW5kZWQgYW5kIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlcmUNCi1pcyBhIHNwZWNpZmljIHJlYXNvbiB0byBkbyBzby4gPC9jbWQ+PGluZm8+PGRsPjxkbGVudHJ5Pg0KLTxkdD5MaW5lIGRlbGltaXRlcjwvZHQ+DQotPGRkPlNwZWNpZnkgdGhlIGFwcHJvcHJpYXRlIEVPTCBjaGFyYWN0ZXIgZm9yIHlvdXIgZW52aXJvbm1lbnQuIFRoZSBkZWZhdWx0DQotaXMgPHVpY29udHJvbD5ObyB0cmFuc2xhdGlvbjwvdWljb250cm9sPi48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+QWRkIHRoaXMgc3VmZml4PC9kdD4NCi08ZGQ+U3BlY2lmeSBhIGRlZmF1bHQgc3VmZml4IGZvciBmaWxlcyB0aGF0IHlvdSBzYXZlLiBUaGUgZGVmYXVsdCBpcyA8dXNlcmlucHV0Pmh0bWw8L3VzZXJpbnB1dD4uPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkVuY29kaW5nLCBJQU5BLCAoVXNlIHdvcmtiZW5jaCBkZWZhdWx0KTwvZHQ+DQotPGRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKGNvZGUgcGFnZSkgZm9yIGZpbGVzIHRoYXQgeW91IGNyZWF0ZS4gVGhlDQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pkluc2VydCBET0NUWVBFIGRlY2xhcmF0aW9uPC9kdD4NCi08ZGQ+T3B0aW9uYWxseSwgeW91IGNhbiBhdXRvbWF0aWNhbGx5IGFkZCBhIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gSFRNTCBmaWxlcy4NCi1UaGUgZGVmYXVsdCBET0NUWVBFIGlzIGRldGVybWluZWQgd2hlbiB5b3UgY3JlYXRlIGFuIEhUTUwgZmlsZSBvciBhIEpTUCBmaWxlDQotdXNpbmcgYSB3aXphcmQuIElmIHlvdSBhZGQgdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24sIHlvdSBzaG91bGQgaW5jbHVkZSBhdA0KLWxlYXN0IGEgUHVibGljIElEIHNwZWNpZmljYXRpb24sIGFuZCwgb3B0aW9uYWxseSwgYSBTeXN0ZW0gSUQuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pkluc2VydCBHRU5FUkFUT1Igd2l0aCBNRVRBIHRhZzwvZHQ+DQotPGRkPk9wdGlvbmFsbHksIHNlbGVjdCB0aGUgY2hlY2sgYm94IHRvIHNwZWNpZnkgR0VORVJBVE9SIGluIGEgTUVUQSB0YWcgaW4NCi10aGUgSFRNTCBmaWxlIGhlYWRlci48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+TG9hZGluZyBmaWxlczwvZHQ+DQotPGRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKGNvZGUgcGFnZSkgZm9yIGZpbGVzIHRoYXQgeW91IG9wZW4uIFRoZQ0KLWRlZmF1bHQgaXMgdGhlIFdvcmtiZW5jaCdzIGVuY29kaW5nIHByZWZlcmVuY2UuIERlc2VsZWN0IHRoZSA8dWljb250cm9sPlVzZQ0KLXdvcmtiZW5jaCBkZWZhdWx0PC91aWNvbnRyb2w+IGNoZWNrIGJveCB0byBzZWxlY3QgYW5vdGhlciBlbmNvZGluZy4gICA8bm90ZT5FbmNvZGluZw0KLWRldGVjdGlvbiAod2hlbiBsb2FkaW5nIGZpbGVzKSBpcyBwZXJmb3JtZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogICA8dWw+DQotPGxpPkxvY2F0ZSB0aGUgZW5jb2RpbmcgbmFtZSBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQuPC9saT4NCi08bGk+V2hlbiBubyBlbmNvZGluZyBpcyBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQsIGFuIGF1dG9tYXRpYyBlbmNvZGluZyBkZXRlY3Rvcg0KLWF0dGVtcHRzIHRvIGRldGVybWluZSBlbmNvZGluZyB1c2VkIGluIHRoZSBkb2N1bWVudC48L2xpPg0KLTxsaT5JZiB0aGUgZW5jb2Rpbmcgc3RpbGwgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSBlbmNvZGluZyBkZWZpbmVkIGluIHRoZSA8dWljb250cm9sPkVuY29kaW5nPC91aWNvbnRyb2w+IGZpZWxkDQotaXMgdXNlZC48L2xpPg0KLTwvdWw+IDwvbm90ZT4gPC9kZD4NCi08L2RsZW50cnk+PC9kbD4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4gdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90anByZWZzLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YWIxMmQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RqcHJlZnMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGpwcmVmcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGpwcmVmcyI+PGEgbmFtZT0idGpwcmVmcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVmaW5pbmcgSFRNTCBmaWxlIHByZWZlcmVuY2VzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPgotVG8gZGVmaW5lIGdlbmVyYWwgSFRNTCBmaWxlIHByZWZlcmVuY2VzLCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nCi1zdGVwczo6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByZWZlcmVuY2VzIHdpbmRvdywgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZAotWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUTUwgRmlsZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSBmb2xsb3dpbmcgc2V0dGluZ3MgcmVsYXRlZCB0byBzYXZpbmcgYW4gSFRNTCBzb3VyY2UKLXBhZ2UuIFRoZSBkZWZhdWx0cyBhcmUgcmVjb21tZW5kZWQgYW5kIHNob3VsZCBvbmx5IGJlIG1vZGlmaWVkIHdoZW4gdGhlcmUKLWlzIGEgc3BlY2lmaWMgcmVhc29uIHRvIGRvIHNvLiA8L3NwYW4+IDxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5MaW5lIGRlbGltaXRlcjwvZHQ+Ci0KLTxkZD5TcGVjaWZ5IHRoZSBhcHByb3ByaWF0ZSBFT0wgY2hhcmFjdGVyIGZvciB5b3VyIGVudmlyb25tZW50LiBUaGUgZGVmYXVsdAotaXMgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Tm8gdHJhbnNsYXRpb248L3NwYW4+LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkFkZCB0aGlzIHN1ZmZpeDwvZHQ+Ci0KLTxkZD5TcGVjaWZ5IGEgZGVmYXVsdCBzdWZmaXggZm9yIGZpbGVzIHRoYXQgeW91IHNhdmUuIFRoZSBkZWZhdWx0IGlzIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+aHRtbDwva2JkPi48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5FbmNvZGluZywgSUFOQSwgKFVzZSB3b3JrYmVuY2ggZGVmYXVsdCk8L2R0PgotCi08ZGQ+U3BlY2lmeSB0aGUgZGVmYXVsdCBlbmNvZGluZyAoY29kZSBwYWdlKSBmb3IgZmlsZXMgdGhhdCB5b3UgY3JlYXRlLiBUaGUKLWRlZmF1bHQgaXMgdGhlIFdvcmtiZW5jaCdzIGVuY29kaW5nIHByZWZlcmVuY2UuIDwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkluc2VydCBET0NUWVBFIGRlY2xhcmF0aW9uPC9kdD4KLQotPGRkPk9wdGlvbmFsbHksIHlvdSBjYW4gYXV0b21hdGljYWxseSBhZGQgYSBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIEhUTUwgZmlsZXMuCi1UaGUgZGVmYXVsdCBET0NUWVBFIGlzIGRldGVybWluZWQgd2hlbiB5b3UgY3JlYXRlIGFuIEhUTUwgZmlsZSBvciBhIEpTUCBmaWxlCi11c2luZyBhIHdpemFyZC4gSWYgeW91IGFkZCB0aGUgRE9DVFlQRSBkZWNsYXJhdGlvbiwgeW91IHNob3VsZCBpbmNsdWRlIGF0Ci1sZWFzdCBhIFB1YmxpYyBJRCBzcGVjaWZpY2F0aW9uLCBhbmQsIG9wdGlvbmFsbHksIGEgU3lzdGVtIElELjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkluc2VydCBHRU5FUkFUT1Igd2l0aCBNRVRBIHRhZzwvZHQ+Ci0KLTxkZD5PcHRpb25hbGx5LCBzZWxlY3QgdGhlIGNoZWNrIGJveCB0byBzcGVjaWZ5IEdFTkVSQVRPUiBpbiBhIE1FVEEgdGFnIGluCi10aGUgSFRNTCBmaWxlIGhlYWRlci48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Mb2FkaW5nIGZpbGVzPC9kdD4KLQotPGRkPlNwZWNpZnkgdGhlIGRlZmF1bHQgZW5jb2RpbmcgKGNvZGUgcGFnZSkgZm9yIGZpbGVzIHRoYXQgeW91IG9wZW4uIFRoZQotZGVmYXVsdCBpcyB0aGUgV29ya2JlbmNoJ3MgZW5jb2RpbmcgcHJlZmVyZW5jZS4gRGVzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZQotd29ya2JlbmNoIGRlZmF1bHQ8L3NwYW4+IGNoZWNrIGJveCB0byBzZWxlY3QgYW5vdGhlciBlbmNvZGluZy4gICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gRW5jb2RpbmcKLWRldGVjdGlvbiAod2hlbiBsb2FkaW5nIGZpbGVzKSBpcyBwZXJmb3JtZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogICA8dWw+Ci08bGk+TG9jYXRlIHRoZSBlbmNvZGluZyBuYW1lIGVtYmVkZGVkIGluIHRoZSBkb2N1bWVudC48L2xpPgotCi08bGk+V2hlbiBubyBlbmNvZGluZyBpcyBlbWJlZGRlZCBpbiB0aGUgZG9jdW1lbnQsIGFuIGF1dG9tYXRpYyBlbmNvZGluZyBkZXRlY3RvcgotYXR0ZW1wdHMgdG8gZGV0ZXJtaW5lIGVuY29kaW5nIHVzZWQgaW4gdGhlIGRvY3VtZW50LjwvbGk+Ci0KLTxsaT5JZiB0aGUgZW5jb2Rpbmcgc3RpbGwgY2Fubm90IGJlIGRldGVybWluZWQsIHRoZSBlbmNvZGluZyBkZWZpbmVkIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNvZGluZzwvc3Bhbj4gZmllbGQKLWlzIHVzZWQuPC9saT4KLQotPC91bD4KLSA8L2Rpdj4KLSA8L2RkPgotCi08L2RsPgotIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+IHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvCi1zYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHNlcnZlcnRhcmdldC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzQ4MWQ3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9InRzZXJ2ZXJ0YXJnZXQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnNlcnZlcnM8aW5kZXh0ZXJtPnRhcmdldGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+V2ViIGFwcGxpY2F0aW9uczxpbmRleHRlcm0+c2VydmVyIHRhcmdldGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UbyBzdXBwb3J0IGRpZmZlcmVudCBKMkVFIGFwcGxpY2F0aW9uIHNlcnZlcnMsIHRoZSBKMkVFIHRvb2xpbmcgYWxsb3dzDQoteW91IHRvIHRhcmdldCBhIHNwZWNpZmljIHNlcnZlciBkdXJpbmcgeW91ciBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QNCi1kZXZlbG9wbWVudC4gSW4gbW9zdCBjYXNlcywgYSBXZWIgcHJvamVjdCBtdXN0IHRhcmdldCB0aGUgc2FtZSBzZXJ2ZXIgYXMgdGhlDQotRUFSIHByb2plY3QgaW4gb3JkZXIgdG8gZGVwbG95IHRoZSBXZWIgYXBwbGljYXRpb24gdG8gdGhlIHNlcnZlciBwcm9wZXJseS4gPC9wPg0KLTxwPkFmdGVyIHlvdSBoYXZlIGEgV2ViIHByb2plY3QgY3JlYXRlZCwgeW91IGNhbiBtb2RpZnkgdGhlIHRhcmdldCBzZXJ2ZXINCi11c2luZyB0aGUgcHJvamVjdCdzIHByb3BlcnRpZXMgZGlhbG9nLiBUbyBkbyB0aGlzLCByaWdodC1jbGljayBvbiB0aGUgcHJvamVjdA0KLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIGFuZCBzZWxlY3QgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+U2VydmVyPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9wPg0KLTwvY29uYm9keT4NCi08L2NvbmNlcHQ+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5ODA3NDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzZXJ2ZXJ0YXJnZXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnMiIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2ZXJzLCB0YXJnZXRpbmcsIFdlYiBhcHBsaWNhdGlvbnMsIHNlcnZlciB0YXJnZXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2ZXJzLCB0YXJnZXRpbmcsIFdlYiBhcHBsaWNhdGlvbnMsIHNlcnZlciB0YXJnZXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRzZXJ2ZXJ0YXJnZXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c2VydmVydGFyZ2V0Ij48YSBuYW1lPSJ0c2VydmVydGFyZ2V0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5TZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zPC9oMT4KLQotCi08ZGl2PgotPHA+VG8gc3VwcG9ydCBkaWZmZXJlbnQgSjJFRSBhcHBsaWNhdGlvbiBzZXJ2ZXJzLCB0aGUgSjJFRSB0b29saW5nIGFsbG93cwoteW91IHRvIHRhcmdldCBhIHNwZWNpZmljIHNlcnZlciBkdXJpbmcgeW91ciBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIChFQVIpIHByb2plY3QKLWRldmVsb3BtZW50LiBJbiBtb3N0IGNhc2VzLCBhIFdlYiBwcm9qZWN0IG11c3QgdGFyZ2V0IHRoZSBzYW1lIHNlcnZlciBhcyB0aGUKLUVBUiBwcm9qZWN0IGluIG9yZGVyIHRvIGRlcGxveSB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIHRoZSBzZXJ2ZXIgcHJvcGVybHkuIDwvcD4KLQotPHA+QWZ0ZXIgeW91IGhhdmUgYSBXZWIgcHJvamVjdCBjcmVhdGVkLCB5b3UgY2FuIG1vZGlmeSB0aGUgdGFyZ2V0IHNlcnZlcgotdXNpbmcgdGhlIHByb2plY3QncyBwcm9wZXJ0aWVzIGRpYWxvZy4gVG8gZG8gdGhpcywgcmlnaHQtY2xpY2sgb24gdGhlIHByb2plY3QKLWluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2VydmVyPC9zcGFuPjwvc3Bhbj4uPC9wPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVmMzdlMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHN0eWxlc2hlZXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHN0eWxlc2hlZXQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+Q2FzY2FkaW5nIHN0eWxlIHNoZWV0cyBlbmFibGUgeW91IHRvIGRlZmluZSBhIGNvbnNpc3RlbnQgbG9vayBhbmQNCi1mZWVsIHRocm91Z2hvdXQgeW91ciBXZWIgc2l0ZSBieSBtYWludGFpbmluZyB0aGUgY29udGVudHMgKFdlYiBwYWdlcykgYW5kDQotdGhlIGRlc2lnbiAodGhlIHN0eWxlIHNoZWV0KSBzZXBhcmF0ZWx5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPnN0eWxlIHNoZWV0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PlRvIGNyZWF0ZSBhIG5ldyBjYXNjYWRpbmcgc3R5bGUgc2hlZXQ6PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIHN0YXRpYyBvciBhIGR5bmFtaWMgV2ViIHByb2plY3QgaWYgeW91IGhhdmUgbm90IGFscmVhZHkNCi1kb25lIHNvLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCBleHBhbmQgeW91ciBwcm9qZWN0IGFuZCByaWdodCBjbGljayBvbg0KLXlvdXIgV2ViQ29udGVudCBmb2xkZXIgb3Igb24gYSBzdWJmb2xkZXIgdW5kZXIgV2ViQ29udGVudC4gIDwvY21kPjxpbmZvPk5vdGUNCi10aGF0IGlmIHlvdSBjaG9vc2UgYW55IG90aGVyIGZvbGRlciBpbiB3aGljaCB0byBjcmVhdGUgdGhlIENTUyBmaWxlLCB0aGVuDQotaXQgd2lsbCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIFdBUiBmaWxlIHRoYXQgaXMgZGVwbG95ZWQgdG8gdGhlIHNlcnZlci4gPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZyb20gdGhlIGNvbnRleHQgbWVudSwgc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbD48dWljb250cm9sPldlYjwvdWljb250cm9sPjx1aWNvbnRyb2w+Q1NTPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uPC9jbWQ+PHN0ZXByZXN1bHQ+VGhlIE5ldyBDYXNjYWRpbmcgU3R5bGUgU2hlZXQgd2luZG93IGFwcGVhcnMNCi13aXRoIHlvdXIgZm9sZGVyIHNlbGVjdGVkPC9zdGVwcmVzdWx0Pjwvc3RlcD4NCi08c3RlcD48Y21kPlR5cGUgYSBmaWxlIG5hbWUgaW50byB0aGUgRmlsZSBuYW1lIGZpZWxkLCBtYWtpbmcgc3VyZSB5b3UgaW5jbHVkZQ0KLWEgY3NzIGV4dGVuc2lvbiBpbiB0aGUgZmlsZSBuYW1lLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT5UbyBhY2NlcHQgdGhlIGRlZmF1bHRzIGFzc29jaWF0ZWQgd2l0aCBhIG5ldyBDU1MgZmlsZSwgc2VsZWN0IDx1aWNvbnRyb2w+RmluaXNoLjwvdWljb250cm9sPjwvY2hvaWNlPg0KLTxjaG9pY2U+IFRvIHVzZSBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgeW91ciBDU1MgZmlsZSwNCi1zZWxlY3QgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiBUaGUgU2VsZWN0IENTUyBUZW1wbGF0ZSB3aW5kb3cgYXBwZWFycy4NCi1TZWxlY3QgdGhlIDx1aWNvbnRyb2w+VXNlIENTUyBUZW1wbGF0ZTwvdWljb250cm9sPiBjaGVjayBib3gsIGFuZCB0aGVuIHNlbGVjdA0KLW9uZSBvZiB0aGUgc2FtcGxlIHRlbXBsYXRlcy4gWW91IGNhbiBhbHNvIHNlbGVjdCB0aGUgPHVpY29udHJvbD5DU1MgVGVtcGxhdGVzPC91aWNvbnRyb2w+IGxpbmsNCi10byBhZGQgb3IgcmVtb3ZlIEhUTUwgdGVtcGxhdGVzIHRvIHlvdXIgbGlzdCBvZiB0ZW1wbGF0ZXMuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90c3R5bGVzaGVldC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYWEwOWIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3RzdHlsZXNoZWV0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkNhc2NhZGluZyBzdHlsZSBzaGVldHMgZW5hYmxlIHlvdSB0byBkZWZpbmUgYSBjb25zaXN0ZW50IGxvb2sgYW5kIGZlZWwgdGhyb3VnaG91dCB5b3VyIFdlYiBzaXRlIGJ5IG1haW50YWluaW5nIHRoZSBjb250ZW50cyAoV2ViIHBhZ2VzKSBhbmQgdGhlIGRlc2lnbiAodGhlIHN0eWxlIHNoZWV0KSBzZXBhcmF0ZWx5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJDYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGVuYWJsZSB5b3UgdG8gZGVmaW5lIGEgY29uc2lzdGVudCBsb29rIGFuZCBmZWVsIHRocm91Z2hvdXQgeW91ciBXZWIgc2l0ZSBieSBtYWludGFpbmluZyB0aGUgY29udGVudHMgKFdlYiBwYWdlcykgYW5kIHRoZSBkZXNpZ24gKHRoZSBzdHlsZSBzaGVldCkgc2VwYXJhdGVseS4iIC8+Ci08bWV0YSBjb250ZW50PSJzdHlsZSBzaGVldHMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic3R5bGUgc2hlZXRzLCBjcmVhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHN0eWxlc2hlZXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0c3R5bGVzaGVldCI+PGEgbmFtZT0idHN0eWxlc2hlZXQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIGNhc2NhZGluZyBzdHlsZSBzaGVldHM8L2gxPgotCi0KLQotPGRpdj48cD5DYXNjYWRpbmcgc3R5bGUgc2hlZXRzIGVuYWJsZSB5b3UgdG8gZGVmaW5lIGEgY29uc2lzdGVudCBsb29rIGFuZAotZmVlbCB0aHJvdWdob3V0IHlvdXIgV2ViIHNpdGUgYnkgbWFpbnRhaW5pbmcgdGhlIGNvbnRlbnRzIChXZWIgcGFnZXMpIGFuZAotdGhlIGRlc2lnbiAodGhlIHN0eWxlIHNoZWV0KSBzZXBhcmF0ZWx5LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VG8gY3JlYXRlIGEgbmV3IGNhc2NhZGluZyBzdHlsZSBzaGVldDo8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBzdGF0aWMgb3IgYSBkeW5hbWljIFdlYiBwcm9qZWN0IGlmIHlvdSBoYXZlIG5vdCBhbHJlYWR5Ci1kb25lIHNvLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCBleHBhbmQgeW91ciBwcm9qZWN0IGFuZCByaWdodCBjbGljayBvbgoteW91ciBXZWJDb250ZW50IGZvbGRlciBvciBvbiBhIHN1YmZvbGRlciB1bmRlciBXZWJDb250ZW50LiAgPC9zcGFuPiBOb3RlCi10aGF0IGlmIHlvdSBjaG9vc2UgYW55IG90aGVyIGZvbGRlciBpbiB3aGljaCB0byBjcmVhdGUgdGhlIENTUyBmaWxlLCB0aGVuCi1pdCB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgV0FSIGZpbGUgdGhhdCBpcyBkZXBsb3llZCB0byB0aGUgc2VydmVyLiAKLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgY29udGV4dCBtZW51LCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWI8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q1NTPC9zcGFuPgotPC9zcGFuPi48L3NwYW4+IFRoZSBOZXcgQ2FzY2FkaW5nIFN0eWxlIFNoZWV0IHdpbmRvdyBhcHBlYXJzCi13aXRoIHlvdXIgZm9sZGVyIHNlbGVjdGVkPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGEgZmlsZSBuYW1lIGludG8gdGhlIEZpbGUgbmFtZSBmaWVsZCwgbWFraW5nIHN1cmUgeW91IGluY2x1ZGUKLWEgY3NzIGV4dGVuc2lvbiBpbiB0aGUgZmlsZSBuYW1lLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBZb3UgaGF2ZSBzZXZlcmFsIG9wdGlvbnMgZm9yIHByb2NlZWRpbmc6PC9zcGFuPgotPHVsPgotPGxpPlRvIGFjY2VwdCB0aGUgZGVmYXVsdHMgYXNzb2NpYXRlZCB3aXRoIGEgbmV3IENTUyBmaWxlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoLjwvc3Bhbj48L2xpPgotCi08bGk+IFRvIHVzZSBhIHRlbXBsYXRlIGZpbGUgZm9yIHRoZSBpbml0aWFsIGNvbnRlbnQgb2YgeW91ciBDU1MgZmlsZSwKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gVGhlIFNlbGVjdCBDU1MgVGVtcGxhdGUgd2luZG93IGFwcGVhcnMuCi1TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBDU1MgVGVtcGxhdGU8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHRoZW4gc2VsZWN0Ci1vbmUgb2YgdGhlIHNhbXBsZSB0ZW1wbGF0ZXMuIFlvdSBjYW4gYWxzbyBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNTUyBUZW1wbGF0ZXM8L3NwYW4+IGxpbmsKLXRvIGFkZCBvciByZW1vdmUgSFRNTCB0ZW1wbGF0ZXMgdG8geW91ciBsaXN0IG9mIHRlbXBsYXRlcy48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3JlcHJqLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5ZDI0MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08IS0tIEFyYm9yVGV4dCwgSW5jLiwgMTk4OC0yMDAyLCB2LjQwMDItLT4NCi08dGFzayBpZD0idHdjcmVwcmoiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIGEgZHluYW1pYyBXZWIgcHJvamVjdDwvdGl0bGU+DQotPHNob3J0ZGVzYz5Zb3UgY3JlYXRlIGFuZCBtYWludGFpbiB0aGUgcmVzb3VyY2VzIGZvciB5b3VyIFdlYiBhcHBsaWNhdGlvbnMNCi1pbiBXZWIgcHJvamVjdHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+ZHluYW1pYyBXZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmR5bmFtaWM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotDQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+IFVubGlrZSB3aXRoIDx4cmVmIGhyZWY9InR3Y3Jlc3RhLmRpdGEiIHNjb3BlPSJwZWVyIj48ZGVzYz48L2Rlc2M+c3RhdGljPC94cmVmPiBXZWINCi1wcm9qZWN0cywgIGR5bmFtaWMgV2ViIHByb2plY3RzIGVuYWJsZSB5b3UgdG8gY3JlYXRlIHJlc291cmNlcyBzdWNoIGFzIEphdmFTZXJ2ZXINCi1QYWdlcyBhbmQgc2VydmxldHMuPC9wPjxwPlRvIGNyZWF0ZSBhIG5ldyBkeW5hbWljIFdlYiBwcm9qZWN0LCBjb21wbGV0ZSB0aGUNCi1mb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBKMkVFIHBlcnNwZWN0aXZlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9qZWN0IEV4cGxvcmVyLCByaWdodCBjbGljayBvbiBEeW5hbWljIFdlYiBQcm9qZWN0cywgYW5kDQotc2VsZWN0IDxtZW51Y2FzY2FkZT48dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+RHluYW1pYyBXZWIgUHJvamVjdDwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+IGZyb20gdGhlIGNvbnRleHQgbWVudS4gVGhlIE5ldyBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPjxiPkdlbmVyYWwgSW5mb3JtYXRpb248L2I+PC9wPjxkbD48ZGxlbnRyeT4NCi08ZHQ+UHJvamVjdCBGYWNldHMgPC9kdD4NCi08ZGQ+QSBmYWNldCByZXByZXNlbnRzIGEgdW5pdCBvZiBmdW5jdGlvbmFsaXR5IGluIGEgV2ViIHByb2plY3QuIEZvciBleGFtcGxlLA0KLXRoZSBEeW5hbWljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIGR5bmFtaWMNCi1XZWIgbW9kdWxlLiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBmYWNldCBhcHBlYXJzIGluIHRoZSB3aXphcmQgd2hlbg0KLXlvdSBzZWxlY3QgaXQuICBOb3RlIHRoYXQgaW4gbWFueSBpbnN0YW5jZXMsIHlvdSBjYW4gdmlldyB0aGUgY29uc3RyYWludHMNCi1mb3IgYSBwcm9qZWN0IGZhY2V0IGJ5IHJpZ2h0IGNsaWNraW5nIG9uIHRoZSBmYWNldCBhbmQgc2VsZWN0aW5nIHByb2plY3QgY29uc3RyYWludHMNCi1mcm9tIHRoZSBwb3AgdXAgbWVudS4gIDwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5UYXJnZXQgUnVudGltZTwvZHQ+DQotPGRkPlVzZSB0aGlzIGZpZWxkIHRvIGRlZmluZSBhIG5ldyBpbnN0YWxsZWQgcnVudGltZSBlbnZpcm9ubWVudC4gUnVudGltZXMNCi1hcmUgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGNvbXBpbGUgcHJvamVjdHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCAoRUFSIFByb2plY3QpPC9kdD4NCi08ZGQ+QSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IChFQVIgUHJvamVjdCkgbXVzdCBiZQ0KLWFzc29jaWF0ZWQgd2l0aCB5b3VyIG5ldyBXZWIgcHJvamVjdCB0byBmYWNpbGl0YXRlIGRlcGxveW1lbnQuIElmIHlvdSB3YW50DQotdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgc2V0dGluZ3MgZm9yIHRoZSBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QsIHlvdQ0KLWNhbiBkbyBzbyB1c2luZyB0aGUgd2l6YXJkLiBXaGVuIHlvdXIgV2ViIHByb2plY3QgaXMgY3JlYXRlZCBhdCB0aGUgZW5kIG9mDQotdGhlIHdpemFyZCwgdGhlIG5ldyBFbnRlcnByaXNlIEFwcGxpY2F0aW9uIHByb2plY3QgaXMgYWxzbyBjcmVhdGVkIHdpdGggdGhlDQotbmFtZSBzcGVjaWZpZWQgaW4gdGhlIEVBUiBwcm9qZWN0IGZpZWxkLiBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgaXMgdGhlIG5hbWUNCi1vZiB0aGUgd2ViIHByb2plY3QgYXBwZW5kZWQgd2l0aCBFQVIgKHVubGVzcyB0aGUgZWFyIHByb2plY3Qgd2FzIHNlbGVjdGVkDQotd2hlbiB5b3Ugb3BlbmVkIHRoZSB3aXphcmQuKTwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Db250ZXh0IFJvb3Q8L2R0Pg0KLTxkZD5UaGUgY29udGV4dCByb290IGlzIHRoZSBXZWIgYXBwbGljYXRpb24gcm9vdCwgd2hpY2ggaXMgdGhlIHRvcC1sZXZlbCBkaXJlY3RvcnkNCi1vZiB5b3VyIGFwcGxpY2F0aW9uIHdoZW4gaXQgaXMgZGVwbG95ZWQgdG8gdGhlIFdlYiBzZXJ2ZXIuIFlvdSBjYW4gY2hhbmdlDQotdGhlIGNvbnRleHQgcm9vdCBhZnRlciB5b3UgY3JlYXRlIGEgcHJvamVjdCB1c2luZyB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZywNCi13aGljaCB5b3UgYWNjZXNzIGZyb20gdGhlIHByb2plY3QncyBwb3AtdXAgbWVudS4gVGhlIGNvbnRleHQgcm9vdCBjYW4gYWxzbw0KLWJlIHVzZWQgYnkgdGhlIGxpbmtzIGJ1aWxkZXIgdG8gZW5zdXJlIHRoYXQgeW91ciBsaW5rcyByZW1haW4gcmVhZHkgdG8gcHVibGlzaA0KLWFzIHlvdSBtb3ZlIGFuZCByZW5hbWUgZmlsZXMgaW5zaWRlIHlvdXIgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48L2RsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVwcmouaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDY5OWIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXByai5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjcmVhdGUgYW5kIG1haW50YWluIHRoZSByZXNvdXJjZXMgZm9yIHlvdXIgV2ViIGFwcGxpY2F0aW9ucyBpbiBXZWIgcHJvamVjdHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjcmVhdGUgYW5kIG1haW50YWluIHRoZSByZXNvdXJjZXMgZm9yIHlvdXIgV2ViIGFwcGxpY2F0aW9ucyBpbiBXZWIgcHJvamVjdHMuIiAvPgotPG1ldGEgY29udGVudD0iZHluYW1pYyBXZWIgcHJvamVjdHMsIGNyZWF0aW5nLCBXZWIgcHJvamVjdHMsIGR5bmFtaWMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJkeW5hbWljIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcsIFdlYiBwcm9qZWN0cywgZHluYW1pYyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdjcmVwcmoiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y3JlcHJqIj48YSBuYW1lPSJ0d2NyZXByaiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0PC9oMT4KLQotCi0KLTxkaXY+PHA+WW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gdGhlIHJlc291cmNlcyBmb3IgeW91ciBXZWIgYXBwbGljYXRpb25zCi1pbiBXZWIgcHJvamVjdHMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+IFVubGlrZSB3aXRoIDxhIGhyZWY9InR3Y3Jlc3RhLmh0bWwiIHRpdGxlPSIiPnN0YXRpYzwvYT4gV2ViCi1wcm9qZWN0cywgIGR5bmFtaWMgV2ViIHByb2plY3RzIGVuYWJsZSB5b3UgdG8gY3JlYXRlIHJlc291cmNlcyBzdWNoIGFzIEphdmFTZXJ2ZXIKLVBhZ2VzIGFuZCBzZXJ2bGV0cy48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgZHluYW1pYyBXZWIgcHJvamVjdCwgY29tcGxldGUgdGhlCi1mb2xsb3dpbmcgc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5PcGVuIHRoZSBKMkVFIHBlcnNwZWN0aXZlLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIFByb2plY3QgRXhwbG9yZXIsIHJpZ2h0IGNsaWNrIG9uIER5bmFtaWMgV2ViIFByb2plY3RzLCBhbmQKLXNlbGVjdCA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EeW5hbWljIFdlYiBQcm9qZWN0PC9zcGFuPgotPC9zcGFuPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIFRoZSBOZXcgRHluYW1pYyBXZWIgUHJvamVjdCB3aXphcmQgc3RhcnRzLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHMuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPjxzdHJvbmc+R2VuZXJhbCBJbmZvcm1hdGlvbjwvc3Ryb25nPjwvcD4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Qcm9qZWN0IEZhY2V0cyA8L2R0PgotCi08ZGQ+QSBmYWNldCByZXByZXNlbnRzIGEgdW5pdCBvZiBmdW5jdGlvbmFsaXR5IGluIGEgV2ViIHByb2plY3QuIEZvciBleGFtcGxlLAotdGhlIER5bmFtaWMgV2ViIE1vZHVsZSBmYWNldCBlbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGEgZHluYW1pYwotV2ViIG1vZHVsZS4gQSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIHByb2plY3QgZmFjZXQgYXBwZWFycyBpbiB0aGUgd2l6YXJkIHdoZW4KLXlvdSBzZWxlY3QgaXQuICBOb3RlIHRoYXQgaW4gbWFueSBpbnN0YW5jZXMsIHlvdSBjYW4gdmlldyB0aGUgY29uc3RyYWludHMKLWZvciBhIHByb2plY3QgZmFjZXQgYnkgcmlnaHQgY2xpY2tpbmcgb24gdGhlIGZhY2V0IGFuZCBzZWxlY3RpbmcgcHJvamVjdCBjb25zdHJhaW50cwotZnJvbSB0aGUgcG9wIHVwIG1lbnUuICA8L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5UYXJnZXQgUnVudGltZTwvZHQ+Ci0KLTxkZD5Vc2UgdGhpcyBmaWVsZCB0byBkZWZpbmUgYSBuZXcgaW5zdGFsbGVkIHJ1bnRpbWUgZW52aXJvbm1lbnQuIFJ1bnRpbWVzCi1hcmUgdXNlZCBhdCBidWlsZCB0aW1lIHRvIGNvbXBpbGUgcHJvamVjdHMuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+RW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IChFQVIgUHJvamVjdCk8L2R0PgotCi08ZGQ+QSBuZXcgb3IgZXhpc3RpbmcgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0IChFQVIgUHJvamVjdCkgbXVzdCBiZQotYXNzb2NpYXRlZCB3aXRoIHlvdXIgbmV3IFdlYiBwcm9qZWN0IHRvIGZhY2lsaXRhdGUgZGVwbG95bWVudC4gSWYgeW91IHdhbnQKLXRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IHNldHRpbmdzIGZvciB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0LCB5b3UKLWNhbiBkbyBzbyB1c2luZyB0aGUgd2l6YXJkLiBXaGVuIHlvdXIgV2ViIHByb2plY3QgaXMgY3JlYXRlZCBhdCB0aGUgZW5kIG9mCi10aGUgd2l6YXJkLCB0aGUgbmV3IEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdCBpcyBhbHNvIGNyZWF0ZWQgd2l0aCB0aGUKLW5hbWUgc3BlY2lmaWVkIGluIHRoZSBFQVIgcHJvamVjdCBmaWVsZC4gTm90ZSB0aGF0IHRoZSBkZWZhdWx0IGlzIHRoZSBuYW1lCi1vZiB0aGUgd2ViIHByb2plY3QgYXBwZW5kZWQgd2l0aCBFQVIgKHVubGVzcyB0aGUgZWFyIHByb2plY3Qgd2FzIHNlbGVjdGVkCi13aGVuIHlvdSBvcGVuZWQgdGhlIHdpemFyZC4pPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+Q29udGV4dCBSb290PC9kdD4KLQotPGRkPlRoZSBjb250ZXh0IHJvb3QgaXMgdGhlIFdlYiBhcHBsaWNhdGlvbiByb290LCB3aGljaCBpcyB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeQotb2YgeW91ciBhcHBsaWNhdGlvbiB3aGVuIGl0IGlzIGRlcGxveWVkIHRvIHRoZSBXZWIgc2VydmVyLiBZb3UgY2FuIGNoYW5nZQotdGhlIGNvbnRleHQgcm9vdCBhZnRlciB5b3UgY3JlYXRlIGEgcHJvamVjdCB1c2luZyB0aGUgcHJvamVjdCBQcm9wZXJ0aWVzIGRpYWxvZywKLXdoaWNoIHlvdSBhY2Nlc3MgZnJvbSB0aGUgcHJvamVjdCdzIHBvcC11cCBtZW51LiBUaGUgY29udGV4dCByb290IGNhbiBhbHNvCi1iZSB1c2VkIGJ5IHRoZSBsaW5rcyBidWlsZGVyIHRvIGVuc3VyZSB0aGF0IHlvdXIgbGlua3MgcmVtYWluIHJlYWR5IHRvIHB1Ymxpc2gKLWFzIHlvdSBtb3ZlIGFuZCByZW5hbWUgZmlsZXMgaW5zaWRlIHlvdXIgcHJvamVjdC48L2RkPgotCi08L2RsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmVzdGEuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2U2YjU5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d2NyZXN0YSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgYSBzdGF0aWMgV2ViIHByb2plY3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c3RhdGljIFdlYiBwcm9qZWN0czxpbmRleHRlcm0+Y3JlYXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+Y3JlYXRpbmcgc3RhdGljPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gSW4gdGhlIHdvcmtiZW5jaCwgeW91IGNyZWF0ZSBhbmQgbWFpbnRhaW4gcmVzb3VyY2VzIGZvciBXZWIgYXBwbGljYXRpb25zDQotaW4gV2ViIHByb2plY3RzLiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBzdGF0aWMsIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uDQotdGhhdCBjb250YWlucyBubyBkeW5hbWljIGVsZW1lbnRzLCBzdWNoIGFzIEpTUCBmaWxlcyBvciBzZXJ2bGV0cywgdXNlIHRoZSA8cGg+PHVpY29udHJvbD5OZXcNCi1TdGF0aWMgV2ViIFByb2plY3Q8L3VpY29udHJvbD48L3BoPiB3aXphcmQuIDwvcD48cD5UbyBjcmVhdGUgYSBuZXcgc3RhdGljDQotV2ViIHByb2plY3QsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcgc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBKMkVFIHBlcnNwZWN0aXZlIDwvY21kPjxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQgY2xpY2sgb24gT3RoZXIgUHJvamVjdHMgYW5kIHNlbGVjdCA8Yj5OZXctPk90aGVyLT5XZWItPlN0YXRpYw0KLVdlYiBQcm9qZWN0PC9iPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIFRoZSBOZXcgU3RhdGljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkZvbGxvdyB0aGUgcHJvamVjdCB3aXphcmQgcHJvbXB0czwvY21kPjxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT48cD48Yj5HZW5lcmFsIEluZm9ybWF0aW9uPC9iPjwvcD48ZGw+PGRsZW50cnk+DQotPGR0PlByb2plY3QgRmFjZXRzIDwvZHQ+DQotPGRkPkEgZmFjZXQgcmVwcmVzZW50cyBhIHVuaXQgb2YgZnVuY3Rpb25hbGl0eSBpbiBhIFdlYiBwcm9qZWN0LiBGb3IgZXhhbXBsZSwNCi10aGUgU3RhdGljIFdlYiBNb2R1bGUgZmFjZXQgZW5hYmxlcyB0aGUgcHJvamVjdCB0byBiZSBkZXBsb3llZCBhcyBhIHN0YXRpYw0KLVdlYiBtb2R1bGUuIEEgYnJpZWYgZGVzY3JpcHRpb24gb2YgYSBwcm9qZWN0IGZhY2V0IGFwcGVhcnMgaW4gdGhlIHdpemFyZCB3aGVuDQoteW91IHNlbGVjdCBpdC4gIE5vdGUgdGhhdCBpbiBtYW55IGluc3RhbmNlcywgeW91IGNhbiB2aWV3IHRoZSBjb25zdHJhaW50cw0KLWZvciBhIHByb2plY3QgZmFjZXQgYnkgcmlnaHQgY2xpY2tpbmcgb24gdGhlIGZhY2V0IGFuZCBzZWxlY3RpbmcgcHJvamVjdCBjb25zdHJhaW50cw0KLWZyb20gdGhlIHBvcCB1cCBtZW51LiAgPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PlRhcmdldCBSdW50aW1lPC9kdD4NCi08ZGQ+VXNlIHRoaXMgZmllbGQgdG8gZGVmaW5lIGEgbmV3IGluc3RhbGxlZCBydW50aW1lIGVudmlyb25tZW50LiBSdW50aW1lcw0KLWFyZSB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gY29tcGlsZSBwcm9qZWN0cy4gPC9kZD4NCi08L2RsZW50cnk+PC9kbD48ZGw+PGRsZW50cnk+DQotPGR0PldlYiBDb250ZW50IEZvbGRlcjwvZHQ+DQotPGRkPlRoZSBmb2xkZXIgaW4gd2hpY2ggeW91IHdhbnQgdG8gc3RvcmUgeW91ciBwdWJsaXNoYWJsZSByZXNvdXJjZXMuIDwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2NyZXN0YS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZTUyZjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jlc3RhLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSIiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iIiAvPgotPG1ldGEgY29udGVudD0ic3RhdGljIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcsIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcgc3RhdGljIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0ic3RhdGljIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcsIFdlYiBwcm9qZWN0cywgY3JlYXRpbmcgc3RhdGljIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d2NyZXN0YSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2NyZXN0YSI+PGEgbmFtZT0idHdjcmVzdGEiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkNyZWF0aW5nIGEgc3RhdGljIFdlYiBwcm9qZWN0PC9oMT4KLQotCi0KLTxkaXY+PHAgLz4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IEluIHRoZSB3b3JrYmVuY2gsIHlvdSBjcmVhdGUgYW5kIG1haW50YWluIHJlc291cmNlcyBmb3IgV2ViIGFwcGxpY2F0aW9ucwotaW4gV2ViIHByb2plY3RzLiBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBzdGF0aWMsIGNvbnRlbnQtYmFzZWQgV2ViIGFwcGxpY2F0aW9uCi10aGF0IGNvbnRhaW5zIG5vIGR5bmFtaWMgZWxlbWVudHMsIHN1Y2ggYXMgSlNQIGZpbGVzIG9yIHNlcnZsZXRzLCB1c2UgdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldwotU3RhdGljIFdlYiBQcm9qZWN0PC9zcGFuPjwvc3Bhbj4gd2l6YXJkLiA8L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcgc3RhdGljCi1XZWIgcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHRoZSBKMkVFIHBlcnNwZWN0aXZlIDwvc3Bhbj4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvamVjdCBFeHBsb3JlciwgcmlnaHQgY2xpY2sgb24gT3RoZXIgUHJvamVjdHMgYW5kIHNlbGVjdCA8c3Ryb25nPk5ldy0mZ3Q7T3RoZXItJmd0O1dlYi0mZ3Q7U3RhdGljCi1XZWIgUHJvamVjdDwvc3Ryb25nPiBmcm9tIHRoZSBjb250ZXh0IG1lbnUuIFRoZSBOZXcgU3RhdGljIFdlYiBQcm9qZWN0IHdpemFyZCBzdGFydHMuIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzPC9zcGFuPiA8L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3Ryb25nPkdlbmVyYWwgSW5mb3JtYXRpb248L3N0cm9uZz48L3A+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+UHJvamVjdCBGYWNldHMgPC9kdD4KLQotPGRkPkEgZmFjZXQgcmVwcmVzZW50cyBhIHVuaXQgb2YgZnVuY3Rpb25hbGl0eSBpbiBhIFdlYiBwcm9qZWN0LiBGb3IgZXhhbXBsZSwKLXRoZSBTdGF0aWMgV2ViIE1vZHVsZSBmYWNldCBlbmFibGVzIHRoZSBwcm9qZWN0IHRvIGJlIGRlcGxveWVkIGFzIGEgc3RhdGljCi1XZWIgbW9kdWxlLiBBIGJyaWVmIGRlc2NyaXB0aW9uIG9mIGEgcHJvamVjdCBmYWNldCBhcHBlYXJzIGluIHRoZSB3aXphcmQgd2hlbgoteW91IHNlbGVjdCBpdC4gIE5vdGUgdGhhdCBpbiBtYW55IGluc3RhbmNlcywgeW91IGNhbiB2aWV3IHRoZSBjb25zdHJhaW50cwotZm9yIGEgcHJvamVjdCBmYWNldCBieSByaWdodCBjbGlja2luZyBvbiB0aGUgZmFjZXQgYW5kIHNlbGVjdGluZyBwcm9qZWN0IGNvbnN0cmFpbnRzCi1mcm9tIHRoZSBwb3AgdXAgbWVudS4gIDwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlRhcmdldCBSdW50aW1lPC9kdD4KLQotPGRkPlVzZSB0aGlzIGZpZWxkIHRvIGRlZmluZSBhIG5ldyBpbnN0YWxsZWQgcnVudGltZSBlbnZpcm9ubWVudC4gUnVudGltZXMKLWFyZSB1c2VkIGF0IGJ1aWxkIHRpbWUgdG8gY29tcGlsZSBwcm9qZWN0cy4gPC9kZD4KLQotPC9kbD4KLTxkbD4KLTxkdCBjbGFzcz0iZGx0ZXJtIj5XZWIgQ29udGVudCBGb2xkZXI8L2R0PgotCi08ZGQ+VGhlIGZvbGRlciBpbiB3aGljaCB5b3Ugd2FudCB0byBzdG9yZSB5b3VyIHB1Ymxpc2hhYmxlIHJlc291cmNlcy4gPC9kZD4KLQotPC9kbD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiYTk3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdjcmV3YXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V0FSIGZpbGVzPGluZGV4dGVybT5leHBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPmV4cG9ydGluZzxpbmRleHRlcm0+V2FyIGZpbGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5XZWINCi1wcm9qZWN0czxpbmRleHRlcm0+ZXhwb3J0aW5nIFdBUiBmaWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+ZXhwb3J0aW5nPGluZGV4dGVybT5XYXINCi1maWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPiBBIFdlYiBhcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24gdGhhdA0KLWNhbiBiZSBleHBvcnRlZCB0byB0ZXN0LCBwdWJsaXNoLCBhbmQgZGVwbG95IHRoZSByZXNvdXJjZXMgZGV2ZWxvcGVkIHdpdGhpbg0KLWEgV2ViIHByb2plY3QuPC9wPjxwPlRvIGV4cG9ydCBhIFdBUiBmaWxlIGZyb20gYSBXZWIgcHJvamVjdCwgZG8gdGhlIGZvbGxvd2luZzogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5SaWdodCBjbGljayBvbiBhIFdlYiBwcm9qZWN0IGZvbGRlciBhbmQgc2VsZWN0IDxiPkV4cG9ydDwvYj4gZnJvbQ0KLXRoZSBwb3AtdXAgbWVudS4gVGhlbiBzZWxlY3Q8Yj4gV0FSIGZpbGU8L2I+IGluIHRoZSBFeHBvcnQgd2luZG93IGFuZCB0aGVuDQotc2VsZWN0IDxiPk5leHQ8L2I+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNwZWNpZnkgdGhlIFdlYiBwcm9qZWN0IHlvdSB3YW50IHRvIGV4cG9ydCAodGhpcyBmaWVsZCBpcyBwcmltZWQNCi1pZiB5b3UgdXNlZCB0aGUgcG9wLXVwIG1lbnUgdG8gb3BlbiB0aGUgd2l6YXJkKSwgYW5kIHNwZWNpZnkgYSBsb2NhdGlvbiBmb3INCi10aGUgbmV3IFdBUiBmaWxlPC9jbWQ+PC9zdGVwPg0KLTxzdGVwIGltcG9ydGFuY2U9Im9wdGlvbmFsIj48Y21kPk9wdGlvbmFsbHksIHN1cHBseSBXQVIgZXhwb3J0IDxwaD5PcHRpb25zPC9waD4sDQotc3VjaCBhcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZSBmaWxlcyBpbiB0aGUgV0FSLCBhbmQgd2hldGhlcg0KLXRvIG92ZXJ3cml0ZSBhbnkgZXhpc3RpbmcgcmVzb3VyY2VzIGR1cmluZyB0aGUgZXhwb3J0IHByb2Nlc3MuIDwvY21kPjxpbmZvPlNvdXJjZQ0KLWZpbGVzIGFyZSBub3QgdXN1YWxseSBpbmNsdWRlZCBpbiBhIFdBUiBmaWxlLCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBuZWNlc3NhcnkNCi1mb3IgdGhlIHNlcnZlciB0byBydW4gdGhlIHdlYiBhcHBsaWNhdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHBoPjx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+PC9waD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Jld2FyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVkNDUzNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjcmV3YXIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IldBUiBmaWxlcywgZXhwb3J0aW5nLCBXYXIgZmlsZXMsIFdlYiBwcm9qZWN0cywgZXhwb3J0aW5nIFdBUiBmaWxlcywgV2FyIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iV0FSIGZpbGVzLCBleHBvcnRpbmcsIFdhciBmaWxlcywgV2ViIHByb2plY3RzLCBleHBvcnRpbmcgV0FSIGZpbGVzLCBXYXIgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y3Jld2FyIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2NyZXdhciI+PGEgbmFtZT0idHdjcmV3YXIiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlczwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD4gQSBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlIGlzIGEgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uIHRoYXQKLWNhbiBiZSBleHBvcnRlZCB0byB0ZXN0LCBwdWJsaXNoLCBhbmQgZGVwbG95IHRoZSByZXNvdXJjZXMgZGV2ZWxvcGVkIHdpdGhpbgotYSBXZWIgcHJvamVjdC48L3A+Ci08cD5UbyBleHBvcnQgYSBXQVIgZmlsZSBmcm9tIGEgV2ViIHByb2plY3QsIGRvIHRoZSBmb2xsb3dpbmc6IDwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIG9uIGEgV2ViIHByb2plY3QgZm9sZGVyIGFuZCBzZWxlY3QgPHN0cm9uZz5FeHBvcnQ8L3N0cm9uZz4gZnJvbQotdGhlIHBvcC11cCBtZW51LiBUaGVuIHNlbGVjdDxzdHJvbmc+IFdBUiBmaWxlPC9zdHJvbmc+IGluIHRoZSBFeHBvcnQgd2luZG93IGFuZCB0aGVuCi1zZWxlY3QgPHN0cm9uZz5OZXh0PC9zdHJvbmc+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIFdlYiBwcm9qZWN0IHlvdSB3YW50IHRvIGV4cG9ydCAodGhpcyBmaWVsZCBpcyBwcmltZWQKLWlmIHlvdSB1c2VkIHRoZSBwb3AtdXAgbWVudSB0byBvcGVuIHRoZSB3aXphcmQpLCBhbmQgc3BlY2lmeSBhIGxvY2F0aW9uIGZvcgotdGhlIG5ldyBXQVIgZmlsZTwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzdHJvbmc+T3B0aW9uYWw6IDwvc3Ryb25nPjxzcGFuPk9wdGlvbmFsbHksIHN1cHBseSBXQVIgZXhwb3J0IDxzcGFuPk9wdGlvbnM8L3NwYW4+LAotc3VjaCBhcyB3aGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIEphdmHihKIgc291cmNlIGZpbGVzIGluIHRoZSBXQVIsIGFuZCB3aGV0aGVyCi10byBvdmVyd3JpdGUgYW55IGV4aXN0aW5nIHJlc291cmNlcyBkdXJpbmcgdGhlIGV4cG9ydCBwcm9jZXNzLiA8L3NwYW4+IFNvdXJjZQotZmlsZXMgYXJlIG5vdCB1c3VhbGx5IGluY2x1ZGVkIGluIGEgV0FSIGZpbGUsIGJlY2F1c2UgdGhleSBhcmUgbm90IG5lY2Vzc2FyeQotZm9yIHRoZSBzZXJ2ZXIgdG8gcnVuIHRoZSB3ZWIgYXBwbGljYXRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2N2c3IuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE3ODdiMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3Y3ZzciIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0czwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+Q1ZTPGluZGV4dGVybT5zZXR0aW5nIHJlcG9zaXRvcnkgZGVmYXVsdHM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmN2c2lnbm9yZSBmaWxlPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPldoZW4geW91IHVzZSBhIENWUyByZXBvc2l0b3J5IGR1cmluZyB0ZWFtIGRldmVsb3BtZW50LCB5b3UgbWlnaHQNCi13YW50IHRvIHVzZSB0aGUgZm9sbG93aW5nIHNldHVwIHRvIGVuc3VyZSB0aGF0IHRoZSBDVlMgdmVyc2lvbmluZyBzdXBwb3J0DQotaWdub3JlcyB0aGUgcHJvamVjdCdzIGJ1aWxkIG91dHB1dCBmb2xkZXI6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgZmlsZSBjYWxsZWQgLmN2c2lnbm9yZSBpbiB5b3VyIHByb2plY3QncyA8ZmlsZXBhdGg+V2ViQ29udGVudC9XRUItSU5GPC9maWxlcGF0aD4gZm9sZGVyLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoaXMgZmlsZSwgYWRkIGEgbGluZSB3aXRoIHRoZSBuYW1lIG9mIHRoZSBidWlsZCBvdXRwdXQgZm9sZGVyDQotKGZvciBleGFtcGxlLCA8Y29kZXBoPmNsYXNzZXM8L2NvZGVwaD4pLjwvY21kPjxpbmZvPjxwPkN1cnJlbnRseSwgeW91IGhhdmUNCi10aGUgb3B0aW9uIG9mIGNyZWF0aW5nIHRoaXMgZmlsZSBhdXRvbWF0aWNhbGx5IChhcyBhIGZlYXR1cmUpIHdoZW4gdXNpbmcgdGhlDQotTmV3IER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvcD48cD5XaGVuIHlvdSBzeW5jaHJvbml6ZSB3aXRoIGEgQ1ZTIHRlYW0NCi1zdHJlYW0sIHRoZSBvdXRwdXQgZm9sZGVyIHdpbGwgYmUgaWdub3JlZC48L3A+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIGFkZGl0aW9uLCB5b3Ugc2hvdWxkIHR1cm4gb2ZmIHRoZSA8cGg+PHVpY29udHJvbD5QcnVuZSBlbXB0eQ0KLWRpcmVjdG9yaWVzPC91aWNvbnRyb2w+PC9waD4gb3B0aW9uLiBTZWxlY3QgPHBoPjxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvd3M8L3VpY29udHJvbD4NCi08dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L3BoPiwgc3dpdGNoIHRvIHRoZSA8cGg+PG1lbnVjYXNjYWRlPg0KLTx1aWNvbnRyb2w+VGVhbTwvdWljb250cm9sPjx1aWNvbnRyb2w+Q1ZTPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT48L3BoPiBwcm9wZXJ0aWVzDQotcGFnZSwgYW5kIGVuc3VyZSB0aGF0IHRoZSA8cGg+PHVpY29udHJvbD5QcnVuZSBlbXB0eSBkaXJlY3RvcmllczwvdWljb250cm9sPjwvcGg+IGNoZWNrDQotYm94IGlzIG5vdCBjaGVja2VkLjwvY21kPjxpbmZvPjxwPklmIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIHlvdXIgV2ViIHByb2plY3Qncw0KLXNvdXJjZSBkaXJlY3RvcnkgaXMgZW1wdHksIGl0IHdpbGwgYmUgZGVsZXRlZCB3aGVuIHRoZSBwcm9qZWN0IGlzIGFkZGVkIHRvDQoteW91ciB3b3Jrc3BhY2UgZnJvbSBhIENWUyByZXBvc2l0b3J5LCBjYXVzaW5nIGEgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gYnVpbGQgZXJyb3IuPC9wPjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdjdnNyLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlYTU0YWEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3Y3Zzci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIgLz4KLTxtZXRhIGNvbnRlbnQ9IkNWUywgc2V0dGluZyByZXBvc2l0b3J5IGRlZmF1bHRzLCBjdnNpZ25vcmUgZmlsZSwgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJDVlMsIHNldHRpbmcgcmVwb3NpdG9yeSBkZWZhdWx0cywgY3ZzaWdub3JlIGZpbGUsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d2N2c3IiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIENWUyByZXBvc2l0b3J5IGRlZmF1bHRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d2N2c3IiPjxhIG5hbWU9InR3Y3ZzciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0czwvaDE+Ci0KLQotPGRpdj4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPiA8cD5XaGVuIHlvdSB1c2UgYSBDVlMgcmVwb3NpdG9yeSBkdXJpbmcgdGVhbSBkZXZlbG9wbWVudCwgeW91IG1pZ2h0Ci13YW50IHRvIHVzZSB0aGUgZm9sbG93aW5nIHNldHVwIHRvIGVuc3VyZSB0aGF0IHRoZSBDVlMgdmVyc2lvbmluZyBzdXBwb3J0Ci1pZ25vcmVzIHRoZSBwcm9qZWN0J3MgYnVpbGQgb3V0cHV0IGZvbGRlcjo8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgZmlsZSBjYWxsZWQgLmN2c2lnbm9yZSBpbiB5b3VyIHByb2plY3QncyA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPldlYkNvbnRlbnQvV0VCLUlORjwvc3Bhbj4gZm9sZGVyLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhpcyBmaWxlLCBhZGQgYSBsaW5lIHdpdGggdGhlIG5hbWUgb2YgdGhlIGJ1aWxkIG91dHB1dCBmb2xkZXIKLShmb3IgZXhhbXBsZSwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Y2xhc3Nlczwvc2FtcD4pLjwvc3Bhbj4gPHA+Q3VycmVudGx5LCB5b3UgaGF2ZQotdGhlIG9wdGlvbiBvZiBjcmVhdGluZyB0aGlzIGZpbGUgYXV0b21hdGljYWxseSAoYXMgYSBmZWF0dXJlKSB3aGVuIHVzaW5nIHRoZQotTmV3IER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvcD4KLTxwPldoZW4geW91IHN5bmNocm9uaXplIHdpdGggYSBDVlMgdGVhbQotc3RyZWFtLCB0aGUgb3V0cHV0IGZvbGRlciB3aWxsIGJlIGlnbm9yZWQuPC9wPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiBhZGRpdGlvbiwgeW91IHNob3VsZCB0dXJuIG9mZiB0aGUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJ1bmUgZW1wdHkKLWRpcmVjdG9yaWVzPC9zcGFuPjwvc3Bhbj4gb3B0aW9uLiBTZWxlY3QgPHNwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3dzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+PC9zcGFuPjwvc3Bhbj4sIHN3aXRjaCB0byB0aGUgPHNwYW4+PHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRlYW08L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q1ZTPC9zcGFuPjwvc3Bhbj48L3NwYW4+IHByb3BlcnRpZXMKLXBhZ2UsIGFuZCBlbnN1cmUgdGhhdCB0aGUgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJ1bmUgZW1wdHkgZGlyZWN0b3JpZXM8L3NwYW4+PC9zcGFuPiBjaGVjawotYm94IGlzIG5vdCBjaGVja2VkLjwvc3Bhbj4gPHA+SWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgeW91ciBXZWIgcHJvamVjdCdzCi1zb3VyY2UgZGlyZWN0b3J5IGlzIGVtcHR5LCBpdCB3aWxsIGJlIGRlbGV0ZWQgd2hlbiB0aGUgcHJvamVjdCBpcyBhZGRlZCB0bwoteW91ciB3b3Jrc3BhY2UgZnJvbSBhIENWUyByZXBvc2l0b3J5LCBjYXVzaW5nIGEgSmF2YeKEoiBidWlsZCBlcnJvci48L3A+Ci08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3aW1wd2FyLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5N2JkMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdpbXB3YXIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkltcG9ydGluZyBXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlczwvdGl0bGU+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+V0FSIGZpbGVzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD5BIFdlYiBBcmNoaXZlIChXQVIpIGZpbGUgaXMgYSBwb3J0YWJsZSwgcGFja2FnZWQgV2ViIGFwcGxpY2F0aW9uDQotdGhhdCB5b3UgY2FuIGltcG9ydCBpbnRvIHlvdXIgd29ya3NwYWNlLiA8L3A+PHA+IEJlZm9yZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSwNCi15b3Ugc2hvdWxkIGZpcnN0IGRldGVybWluZSBpZiB0aGUgV0FSIGZpbGUgY29udGFpbnMgbmVlZGVkIDx0bSB0bWNsYXNzPSJzcGVjaWFsIg0KLXRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNvdXJjZQ0KLWZpbGVzLiBXaGVuIGltcG9ydGluZyBhIFdBUiBmaWxlIGludG8gYW4gZXhpc3RpbmcgV2ViIHByb2plY3QsIHRoZSBpbXBvcnRlZA0KLVdlYiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZmlsZXMgYXJlIGVpdGhlciBub3QgY2hhbmdlZCBvciBvdmVyd3JpdHRlbiBieSB0aGUNCi1vbmVzIGluY2x1ZGVkIGluIHRoZSBpbXBvcnRlZCBXQVIgZmlsZSwgYmFzZWQgb24geW91ciByZXNwb25zZSB0byB0aGUgcHJvbXB0DQotdGhhdCBpcyBwcm92aWRlZC4gIEluIGVpdGhlciBjYXNlLCB0aGlzIGFjdGlvbiBkb2VzIDxpPm5vdDwvaT4gcmVwcmVzZW50IGENCi1tZXJnaW5nIG9mIHRoZSB0d28gc2V0cyBvZiBkZXBsb3ltZW50IGRlc2NyaXB0b3JzLiAgPC9wPiAgPHA+VG8gaW1wb3J0IHRoZQ0KLVdlYiBwcm9qZWN0IHJlc291cmNlcyBpbiBhIFdBUiBmaWxlIGludG8geW91ciB3b3Jrc3BhY2UsIGNvbXBsZXRlIHRoZSBmb2xsb3dpbmcNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlNlbGVjdCA8cGg+PG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZTwvdWljb250cm9sPjx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT48L3BoPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD4gSW4gdGhlIEltcG9ydCBkaWFsb2csIHNlbGVjdCA8cGg+PHVpY29udHJvbD5XQVIgZmlsZTwvdWljb250cm9sPjwvcGg+IGFuZA0KLXRoZW4gY2xpY2sgPHBoPjx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPjwvcGg+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Mb2NhdGUgdGhlIFdBUiBmaWxlIHRoYXQgeW91IHdhbnQgdG8gaW1wb3J0IHVzaW5nIHRoZSA8cGg+PHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD48L3BoPiBidXR0b24uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+IFRoZSB3aXphcmQgYXNzdW1lcyB5b3Ugd2FudCB0byBjcmVhdGUgYSBuZXcgV2ViIHByb2plY3Qgd2l0aCB0aGUNCi1zYW1lIG5hbWUgYXMgdGhlIFdBUiBmaWxlLiBJZiB5b3UgYWNjZXB0IHRoaXMgY2hvaWNlLCB0aGUgcHJvamVjdCB3aWxsIGJlDQotY3JlYXRlZCB3aXRoIHRoZSBzYW1lIHNlcnZsZXQgdmVyc2lvbiBhcyBzcGVjaWZpZWQgYnkgdGhlIFdBUiBmaWxlIGFuZCBpbg0KLXRoZSBzYW1lIGxvY2F0aW9uLiBJZiB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGVzZSBzZXR0aW5ncywgeW91IGNhbiBjbGljayA8Yj5OZXc8L2I+IGFuZA0KLXNwZWNpZnkgeW91ciBuZXcgc2V0dGluZ3MgaW4gdGhlIER5bmFtaWMgV2ViIFByb2plY3Qgd2l6YXJkLjwvY21kPjxpbmZvPiA8cD5JZg0KLXlvdSB3YW50IHRvIGltcG9ydCB0aGUgV0FSIGZpbGUgaW50byBhbiBleGlzdGluZyBXZWIgcHJvamVjdCwgeW91IGNhbiBzZWxlY3QNCi10aGUgcHJvamVjdCBmcm9tIHRoZSBXZWIgcHJvamVjdCBkcm9wLWRvd24gbGlzdC4gTm90ZSB0aGF0IGlmIHlvdSBzZWxlY3QgYW4NCi1leGlzdGluZyBwcm9qZWN0LCB5b3UgbXVzdCBkZWNpZGUgd2hldGhlciB5b3Ugd2FudCB0byBzZWxlY3QgdGhlIHNldHRpbmcgdG8gPGI+b3ZlcndyaXRlDQotZXhpc3RpbmcgcmVzb3VyY2VzIHdpdGhvdXQgd2FybmluZzwvYj48L3A+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDxwaD48dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPjwvcGg+IHRvIHBvcHVsYXRlIHRoZSBXZWINCi1wcm9qZWN0LjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtwb29sIHR5cGU9ImNvbmNlcHQiPjwvbGlua3Bvb2w+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdpbXB3YXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQwYTk2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d2ltcHdhci5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzIiAvPgotPG1ldGEgY29udGVudD0iV0FSIGZpbGVzLCBpbXBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXQVIgZmlsZXMsIGltcG9ydGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdpbXB3YXIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5JbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3aW1wd2FyIj48YSBuYW1lPSJ0d2ltcHdhciI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SW1wb3J0aW5nIFdlYiBhcmNoaXZlIChXQVIpIGZpbGVzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPkEgV2ViIEFyY2hpdmUgKFdBUikgZmlsZSBpcyBhIHBvcnRhYmxlLCBwYWNrYWdlZCBXZWIgYXBwbGljYXRpb24KLXRoYXQgeW91IGNhbiBpbXBvcnQgaW50byB5b3VyIHdvcmtzcGFjZS4gPC9wPgotPHA+IEJlZm9yZSBpbXBvcnRpbmcgYSBXQVIgZmlsZSwKLXlvdSBzaG91bGQgZmlyc3QgZGV0ZXJtaW5lIGlmIHRoZSBXQVIgZmlsZSBjb250YWlucyBuZWVkZWQgSmF2YeKEoiBzb3VyY2UKLWZpbGVzLiBXaGVuIGltcG9ydGluZyBhIFdBUiBmaWxlIGludG8gYW4gZXhpc3RpbmcgV2ViIHByb2plY3QsIHRoZSBpbXBvcnRlZAotV2ViIGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlcyBhcmUgZWl0aGVyIG5vdCBjaGFuZ2VkIG9yIG92ZXJ3cml0dGVuIGJ5IHRoZQotb25lcyBpbmNsdWRlZCBpbiB0aGUgaW1wb3J0ZWQgV0FSIGZpbGUsIGJhc2VkIG9uIHlvdXIgcmVzcG9uc2UgdG8gdGhlIHByb21wdAotdGhhdCBpcyBwcm92aWRlZC4gIEluIGVpdGhlciBjYXNlLCB0aGlzIGFjdGlvbiBkb2VzIDxlbT5ub3Q8L2VtPiByZXByZXNlbnQgYQotbWVyZ2luZyBvZiB0aGUgdHdvIHNldHMgb2YgZGVwbG95bWVudCBkZXNjcmlwdG9ycy4gIDwvcD4KLSAgPHA+VG8gaW1wb3J0IHRoZQotV2ViIHByb2plY3QgcmVzb3VyY2VzIGluIGEgV0FSIGZpbGUgaW50byB5b3VyIHdvcmtzcGFjZSwgY29tcGxldGUgdGhlIGZvbGxvd2luZwotc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+Ci08L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4gSW4gdGhlIEltcG9ydCBkaWFsb2csIHNlbGVjdCA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XQVIgZmlsZTwvc3Bhbj48L3NwYW4+IGFuZAotdGhlbiBjbGljayA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPjwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkxvY2F0ZSB0aGUgV0FSIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBpbXBvcnQgdXNpbmcgdGhlIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj48L3NwYW4+IGJ1dHRvbi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBUaGUgd2l6YXJkIGFzc3VtZXMgeW91IHdhbnQgdG8gY3JlYXRlIGEgbmV3IFdlYiBwcm9qZWN0IHdpdGggdGhlCi1zYW1lIG5hbWUgYXMgdGhlIFdBUiBmaWxlLiBJZiB5b3UgYWNjZXB0IHRoaXMgY2hvaWNlLCB0aGUgcHJvamVjdCB3aWxsIGJlCi1jcmVhdGVkIHdpdGggdGhlIHNhbWUgc2VydmxldCB2ZXJzaW9uIGFzIHNwZWNpZmllZCBieSB0aGUgV0FSIGZpbGUgYW5kIGluCi10aGUgc2FtZSBsb2NhdGlvbi4gSWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhlc2Ugc2V0dGluZ3MsIHlvdSBjYW4gY2xpY2sgPHN0cm9uZz5OZXc8L3N0cm9uZz4gYW5kCi1zcGVjaWZ5IHlvdXIgbmV3IHNldHRpbmdzIGluIHRoZSBEeW5hbWljIFdlYiBQcm9qZWN0IHdpemFyZC48L3NwYW4+ICA8cD5JZgoteW91IHdhbnQgdG8gaW1wb3J0IHRoZSBXQVIgZmlsZSBpbnRvIGFuIGV4aXN0aW5nIFdlYiBwcm9qZWN0LCB5b3UgY2FuIHNlbGVjdAotdGhlIHByb2plY3QgZnJvbSB0aGUgV2ViIHByb2plY3QgZHJvcC1kb3duIGxpc3QuIE5vdGUgdGhhdCBpZiB5b3Ugc2VsZWN0IGFuCi1leGlzdGluZyBwcm9qZWN0LCB5b3UgbXVzdCBkZWNpZGUgd2hldGhlciB5b3Ugd2FudCB0byBzZWxlY3QgdGhlIHNldHRpbmcgdG8gPHN0cm9uZz5vdmVyd3JpdGUKLWV4aXN0aW5nIHJlc291cmNlcyB3aXRob3V0IHdhcm5pbmc8L3N0cm9uZz48L3A+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj48L3NwYW4+IHRvIHBvcHVsYXRlIHRoZSBXZWIKLXByb2plY3QuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwY252cnQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2QyNzNkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BjbnZydC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0d3BjbnZydCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5zdGF0aWMgV2ViIHByb2plY3RzPGluZGV4dGVybT5jb252ZXJ0aW5nIHRvIGR5bmFtaWM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPmR5bmFtaWMgV2ViIHByb2plY3RzPGluZGV4dGVybT5jb252ZXJ0aW5nIGZyb20gc3RhdGljPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5XZWIgcHJvamVjdHM8aW5kZXh0ZXJtPmR5bmFtaWM8aW5kZXh0ZXJtPmNvbnZlcnRpbmcgZnJvbSBzdGF0aWM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PiA8cD4gSWYgeW91IHdhbnQgdG8gYWRkIGR5bmFtaWMgZWxlbWVudHMgdG8gYSBzdGF0aWMgd2ViIHByb2plY3QsDQotc3VjaCBhcyA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSINCi10cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBzZXJ2bGV0cyBhbmQgSlNQIGZpbGVzLCB5b3UgbXVzdCBjb252ZXJ0IHRoZSBwcm9qZWN0DQotZnJvbSBhIHN0YXRpYyB0byBhIGR5bmFtaWMgb25lLiBUbyBjb252ZXJ0IGEgc3RhdGljIFdlYiBwcm9qZWN0IHRvIGEgZHluYW1pYw0KLVdlYiBwcm9qZWN0LCBjb21wbGV0ZSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgcHJvamVjdCBpbiB0aGUgUHJvamVjdCBFeHBsb3JlciB2aWV3LCBhbmQgdGhlbiBzZWxlY3QgPHBoPjx1aWNvbnRyb2w+Q29udmVydA0KLXRvIGEgRHluYW1pYyBXZWIgUHJvamVjdDwvdWljb250cm9sPjwvcGg+IGZyb20gdGhlIDxiPlByb2plY3Q8L2I+IG1lbnUuPC9jbWQ+DQotPGluZm8+VGhpcyBjb252ZXJzaW9uIGFzc3VtZXMgdGhlICBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uIHdpbGwgYmUgdGhlIHNhbWUuDQotVGhlIGNvbnZlcnNpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBDU1MgZmlsZSBzcGVjaWZpZWQgaW4gdGhlIG9yaWdpbmFsIHN0YXRpYw0KLXByb2plY3QsIHNvIGl0IHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHJlc3VsdGluZyBkeW5hbWljIFdlYiBwcm9qZWN0LiA8L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+IFNwZWNpZnkgdGhlIHByb2plY3QgcHJvcGVydGllcyB0aGF0IGFyZSBhdmFpbGFibGUgd2hlbiAgPHhyZWYNCi1ocmVmPSJ0d2NyZXByai5kaXRhIiBzY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPkNyZWF0aW5nIGEgRHluYW1pYyBXZWIgcHJvamVjdC48L3hyZWY+PC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGNudnJ0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwY252cnQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIyYTQ4NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwY252cnQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNvbnZlcnRpbmcgc3RhdGljIFdlYiBwcm9qZWN0cyB0byBkeW5hbWljIFdlYiBwcm9qZWN0cyIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0YXRpYyBXZWIgcHJvamVjdHMsIGNvbnZlcnRpbmcgdG8gZHluYW1pYywgZHluYW1pYyBXZWIgcHJvamVjdHMsIGNvbnZlcnRpbmcgZnJvbSBzdGF0aWMsIFdlYiBwcm9qZWN0cywgZHluYW1pYyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InN0YXRpYyBXZWIgcHJvamVjdHMsIGNvbnZlcnRpbmcgdG8gZHluYW1pYywgZHluYW1pYyBXZWIgcHJvamVjdHMsIGNvbnZlcnRpbmcgZnJvbSBzdGF0aWMsIFdlYiBwcm9qZWN0cywgZHluYW1pYyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdwY252cnQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Db252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3cGNudnJ0Ij48YSBuYW1lPSJ0d3BjbnZydCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPiBJZiB5b3Ugd2FudCB0byBhZGQgZHluYW1pYyBlbGVtZW50cyB0byBhIHN0YXRpYyB3ZWIgcHJvamVjdCwKLXN1Y2ggYXMgSmF2YeKEoiBzZXJ2bGV0cyBhbmQgSlNQIGZpbGVzLCB5b3UgbXVzdCBjb252ZXJ0IHRoZSBwcm9qZWN0Ci1mcm9tIGEgc3RhdGljIHRvIGEgZHluYW1pYyBvbmUuIFRvIGNvbnZlcnQgYSBzdGF0aWMgV2ViIHByb2plY3QgdG8gYSBkeW5hbWljCi1XZWIgcHJvamVjdCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci0gPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBwcm9qZWN0IGluIHRoZSBQcm9qZWN0IEV4cGxvcmVyIHZpZXcsIGFuZCB0aGVuIHNlbGVjdCA8c3Bhbj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Db252ZXJ0Ci10byBhIER5bmFtaWMgV2ViIFByb2plY3Q8L3NwYW4+PC9zcGFuPiBmcm9tIHRoZSA8c3Ryb25nPlByb2plY3Q8L3N0cm9uZz4gbWVudS48L3NwYW4+Ci0gVGhpcyBjb252ZXJzaW9uIGFzc3VtZXMgdGhlICBwcm9qZWN0IG5hbWUgYW5kIGxvY2F0aW9uIHdpbGwgYmUgdGhlIHNhbWUuCi1UaGUgY29udmVyc2lvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIENTUyBmaWxlIHNwZWNpZmllZCBpbiB0aGUgb3JpZ2luYWwgc3RhdGljCi1wcm9qZWN0LCBzbyBpdCB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRpbmcgZHluYW1pYyBXZWIgcHJvamVjdC4gCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBTcGVjaWZ5IHRoZSBwcm9qZWN0IHByb3BlcnRpZXMgdGhhdCBhcmUgYXZhaWxhYmxlIHdoZW4gIDxhIGhyZWY9InR3Y3JlcHJqLmh0bWwiIHRpdGxlPSIiPkNyZWF0aW5nIGEgRHluYW1pYyBXZWIgcHJvamVjdC48L2E+PC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZiYjEwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwbGliLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3cGxpYiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzPC90aXRsZT4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5XZWIgbGlicmFyeSBwcm9qZWN0czxpbmRleHRlcm0+dmlydHVhbCBKQVIgZmlsZXMgYW5kDQotcHJvamVjdHM8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPnZpcnR1YWwgSkFSIGZpbGVzIGFzc29jaWF0aW9uczxpbmRleHRlcm0+V2ViDQotbGlicmFyeSBwcm9qZWN0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPldlYiBsaWJyYXJ5IHByb2plY3RzIGFsbG93IHlvdSB0byBhc3NvY2lhdGUgPHRtIHRtY2xhc3M9InNwZWNpYWwiDQotdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gcHJvamVjdHMNCi13aXRoICJ2aXJ0dWFsIiBKQVIgZmlsZXMgaW4gYSBXZWIgcHJvamVjdCdzIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4gWW91IGNhbg0KLXJlZmVyZW5jZSBKQVIgZmlsZXMgdGhhdCBleGlzdCBlbHNld2hlcmUgaW4gdGhlIEVudGVycHJpc2UgQXBwbGljYXRpb24gcHJvamVjdA0KLXRoYXQgY29udGFpbnMgeW91ciBXZWIgcHJvamVjdCwgaWYgdGhleSBhcmUgaW4gdGhlIFdlYiBwcm9qZWN0J3MgYnVpbGQgcGF0aCwNCi1hbmQgYXZvaWQgdGhlIG5lZWQgdG8gZXhwbGljaXRseSBjb3B5IHRoZXNlIEpBUiBmaWxlcyBpbnRvIHRoZSBwcm9qZWN0J3MgbGliDQotZm9sZGVyIGJlZm9yZSB5b3UgcHVibGlzaCB0aGUgV2ViIGFwcGxpY2F0aW9uIHRvIGEgc2VydmVyLjwvcD48cD5UbyBzZXQgdXANCi10aGVzZSBhc3NvY2lhdGlvbnM6PC9wPiA8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+UmlnaHQgY2xpY2sgb24gYSBXZWIgcHJvamVjdCBhbmQgc2VsZWN0IDx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPiBmcm9tDQotdGhlIHBvcC11cCBtZW51LjwvY21kPjxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayBvbiA8dWljb250cm9sPkoyRUUgTW9kdWxlIERlcGVuZGVuY2llczwvdWljb250cm9sPjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNldCB1cCB5b3VyIGFzc29jaWF0aW9ucyBpbiB0aGUgSjJFRSBNb2R1bGUgRGVwZW5kZW5jaWVzIHdpbmRvdzwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDxwaD48dWljb250cm9sPk9LPC91aWNvbnRyb2w+PC9waD4gd2hlbiB5b3UgYXJlIGRvbmUuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cGxpYi5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWFlMzk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3BsaWIuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBXZWIgbGlicmFyeSBwcm9qZWN0cyIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBsaWJyYXJ5IHByb2plY3RzLCB2aXJ0dWFsIEpBUiBmaWxlcyBhbmQgcHJvamVjdHMsIHZpcnR1YWwgSkFSIGZpbGVzIGFzc29jaWF0aW9ucywgV2ViIGxpYnJhcnkgcHJvamVjdHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJXZWIgbGlicmFyeSBwcm9qZWN0cywgdmlydHVhbCBKQVIgZmlsZXMgYW5kIHByb2plY3RzLCB2aXJ0dWFsIEpBUiBmaWxlcyBhc3NvY2lhdGlvbnMsIFdlYiBsaWJyYXJ5IHByb2plY3RzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0d3BsaWIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgV2ViIGxpYnJhcnkgcHJvamVjdHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3cGxpYiI+PGEgbmFtZT0idHdwbGliIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgV2ViIGxpYnJhcnkgcHJvamVjdHM8L2gxPgotCi0KLTxkaXY+Ci08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+V2ViIGxpYnJhcnkgcHJvamVjdHMgYWxsb3cgeW91IHRvIGFzc29jaWF0ZSBKYXZh4oSiIHByb2plY3RzCi13aXRoICJ2aXJ0dWFsIiBKQVIgZmlsZXMgaW4gYSBXZWIgcHJvamVjdCdzIFdFQi1JTkYvbGliIGRpcmVjdG9yeS4gWW91IGNhbgotcmVmZXJlbmNlIEpBUiBmaWxlcyB0aGF0IGV4aXN0IGVsc2V3aGVyZSBpbiB0aGUgRW50ZXJwcmlzZSBBcHBsaWNhdGlvbiBwcm9qZWN0Ci10aGF0IGNvbnRhaW5zIHlvdXIgV2ViIHByb2plY3QsIGlmIHRoZXkgYXJlIGluIHRoZSBXZWIgcHJvamVjdCdzIGJ1aWxkIHBhdGgsCi1hbmQgYXZvaWQgdGhlIG5lZWQgdG8gZXhwbGljaXRseSBjb3B5IHRoZXNlIEpBUiBmaWxlcyBpbnRvIHRoZSBwcm9qZWN0J3MgbGliCi1mb2xkZXIgYmVmb3JlIHlvdSBwdWJsaXNoIHRoZSBXZWIgYXBwbGljYXRpb24gdG8gYSBzZXJ2ZXIuPC9wPgotPHA+VG8gc2V0IHVwCi10aGVzZSBhc3NvY2lhdGlvbnM6PC9wPgotIDwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0IGNsaWNrIG9uIGEgV2ViIHByb2plY3QgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzPC9zcGFuPiBmcm9tCi10aGUgcG9wLXVwIG1lbnUuPC9zcGFuPiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIG9uIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkoyRUUgTW9kdWxlIERlcGVuZGVuY2llczwvc3Bhbj48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNldCB1cCB5b3VyIGFzc29jaWF0aW9ucyBpbiB0aGUgSjJFRSBNb2R1bGUgRGVwZW5kZW5jaWVzIHdpbmRvdzwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+PC9zcGFuPiB3aGVuIHlvdSBhcmUgZG9uZS48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3cHJqc2V0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlZjI1YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNiwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3cHJqc2V0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIFdlYiBwcm9qZWN0IHByb3BlcnRpZXM8L3RpdGxlPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPldlYiBwcm9qZWN0czxpbmRleHRlcm0+cHJvcGVydGllcyBzZXR0aW5nczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+IDxwPlRoZXJlIGFyZSBtYW55IFdlYiBwcm9qZWN0IHByb3BlcnRpZXMgdGhhdCB5b3UgY2FuIHNldCB0aGF0IGFmZmVjdA0KLXRoZSBwaGFzZXMgaW4gdGhlIGxpZmVjeWNsZSBvZiB5b3VyIHByb2plY3QgYW5kIGl0cyBkZXBlbmRlbmNpZXMgb24gb3RoZXINCi1XZWIgcmVzb3VyY2VzIGFuZCBXZWIgZGV2ZWxvcG1lbnQgcHJvY2Vzc2VzLiBZb3UgbWlnaHQgd2FudCB0byB2ZXJpZnkgb3IgdXBkYXRlDQotdGhlc2UgcHJvcGVydGllcyBhZnRlciB5b3UgaGF2ZSB1cGRhdGVkIGFuIGV4aXN0aW5nIHByb2plY3Qgb3IgaGF2ZSBpbXBvcnRlZA0KLVdlYiByZXNvdXJjZXMgaW50byBhIHByb2plY3QgLjwvcD48cD5UbyB2aWV3IG9yIHNldCBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzLA0KLWRvIHRoZSBmb2xsb3dpbmc6IDwvcD4gPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIG9uIGEgV2ViIFByb2plY3QsIGFuZCBmcm9tIHRoZSBwb3AtdXAgbWVudSBzZWxlY3QgPHBoPjx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPjwvcGg+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBhIHByb3BlcnR5IHR5cGUgaW4gdGhlIGxlZnQgcGFuZSBvZiB0aGUgUHJvcGVydGllcyBkaWFsb2cNCi10byB2aWV3IG9yIHVwZGF0ZSBwcm9wZXJ0aWVzIGluIHRoZSBXZWIgcHJvamVjdC4gRm9yIGVhY2ggcHJvcGVydHksIHlvdSBjYW4NCi1hcHBseSBjaGFuZ2VzIGFuZCBtb2RpZnkgZGVmYXVsdCBzZXR0aW5ncy4gQmFzZWQgb24gd2hldGhlciB5b3UgaGF2ZSBhIHN0YXRpYw0KLW9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSB0eXBlcyBhcmUgYXZhaWxhYmxlOjwvY21kPg0KLTxpbmZvPjxkbD48ZGxlbnRyeT4NCi08ZHQ+SW5mbzwvZHQ+DQotPGRkPlByb3ZpZGVzIGdlbmVyYWwgaW5mb3JtYXRpb24gYWJvdXQgcHJvamVjdCB0eXBlLCBsb2NhdGlvbiwgYW5kIG1vZGlmaWNhdGlvbg0KLXN0YXR1cy4gPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkJlYW5JbmZvIFBhdGggKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5JZiB5b3Ugc2VsZWN0IHRoZSBFbmFibGUgQmVhbmluZm8gSW50cm9zcGVjdGlvbiBvbiB0aGlzIHByb2plY3QsIHlvdSBjYW4NCi1zcGVjaWZ5IHRoZSBjb250ZW50cyBhbmQgb3JkZXIgb2YgPHRtIHRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iDQotdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gQmVhbiBzZWFyY2ggcGF0aHMgdG8gcHJvdmlkZSBCZWFuIGluZm9ybWF0aW9uDQotcmVsZXZhbnQgdG8gdGhlIHByb2plY3QuIFlvdSBjYW4gYWRkLCByZW1vdmUsIGFuZCByZW9yZGVyICh1c2luZyB0aGUgPHBoPlVwPC9waD4gYW5kIDxwaD5Eb3duPC9waD4gYnV0dG9ucykNCi10aGUgcGFja2FnZXMgdXNlZCB0byBpbmNsdWRlIEJlYW4gaW5mb3JtYXRpb24uPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkJ1aWxkZXJzPC9kdD4NCi08ZGQ+QWRkLCByZW1vdmUsIG9yIHJlb3JkZXIgZXh0ZXJuYWwgdG9vbHMgaW4gdGhlIGJ1aWxkIG9yZGVyLiBXaGVuIHlvdSBzZWxlY3QgPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD4gdG8NCi1jcmVhdGUgYSBuZXcgZXh0ZXJuYWwgdG9vbCB0byB0aGUgbGlzdCwgdGhlIE5ldyBFeHRlcm5hbCBUb29sIHdpemFyZCBvcGVucywNCi1zbyB0aGF0IHlvdSBjYW4gZGVmaW5lIHRoZSBuZXcgYnVpbGQgdG9vbC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+SjJFRSAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPklkZW50aWZ5IFdlYiBsZXZlbCBzcGVjaWZpY2F0aW9uIGFuZCBtb2RpZnkgY29udGV4dCByb290IGFuZCBXZWIgY29udGVudA0KLWZvbGRlciBuYW1lPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBCdWlsZA0KLVBhdGggKER5bmFtaWMgV2ViIHByb2plY3Qgb25seSk8L2R0Pg0KLTxkZD5WaWV3IG9yIGNoYW5nZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkIHBhdGggdGhhdCB5b3Ugc3VwcGxpZWQgd2hlbiBjcmVhdGluZw0KLXRoZSBwcm9qZWN0IHVzaW5nIHRoZSA8cGg+Q3JlYXRlIGEgRHluYW1pY1dlYiBQcm9qZWN0PC9waD4gd2l6YXJkLiBXaGVuZXZlcg0KLXRoZSBXZWIgcHJvamVjdCBpcyByZWJ1aWx0LCBhbnkgY2xhc3MgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBvciB1cGRhdGVkIHdpbGwNCi1iZSBvdXRwdXQgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgZm9sZGVyLiA8bm90ZT5BIGxpYnJhcnkgZW50cnkgb24gdGhlIDx0bQ0KLXRtY2xhc3M9InNwZWNpYWwiIHRtb3duZXI9IlN1biBNaWNyb3N5c3RlbXMsIEluYy4iIHRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IGJ1aWxkDQotcGF0aCB3aWxsIHJlbWFpbiB0aGVyZSB1bmxlc3MgdGhlIGFjdHVhbCBKQVIgZmlsZSBpcyBkZWxldGVkIGZyb20gdGhlIFdFQi1JTkYvbGliDQotZm9sZGVyLiBJZiB5b3UgcmVtb3ZlIGEgbGlicmFyeSBwYXRoIGVudHJ5IGJ1dCBub3QgdGhlIEpBUiBmaWxlLCB0aGUgbGlicmFyeQ0KLWVudHJ5IHdpbGwgYmUgcmUtYWRkZWQgdG8gdGhlIHBhdGggYXV0b21hdGljYWxseS48L25vdGU+PC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0Pjx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBDb21waWxlcg0KLShEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+RGVmaW5lIHdoZXRoZXIgdG8gdXNlIHdvcmtzcGFjZSBzZXR0aW5ncyBvciBwcm9qZWN0IHNldHRpbmcgZm9yIGNvbXBpbGluZyA8dG0NCi10bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIiB0bXR5cGU9InRtIiB0cmFkZW1hcms9IkphdmEiPkphdmE8L3RtPiBjb2RlLA0KLWluY2x1ZGluZyBzZXR0aW5ncyBmb3IgUHJvYmxlbXMsIFN0eWxlLCBDb21wbGlhbmNlIGFuZCBDbGFzc2ZpbGVzLCBhbmQgQnVpbGQNCi1QYXRoLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5KYXZhZG9jIExvY2F0aW9uIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+RGVmaW5lIGEgZGVmYXVsdCBsb2NhdGlvbiAoVVJMKSBmb3IgYW55IEphdmFkb2MgYXZhaWxhYmxlIHRvIHRoZSBwcm9qZWN0LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD48dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiIgdG10eXBlPSJ0bSIgdHJhZGVtYXJrPSJKYXZhIj5KYXZhPC90bT4gSkFSDQotRGVwZW5kZW5jaWVzIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4NCi08ZGQ+RGVmaW5lIGFuZCByZW9yZGVyIEpBUiBkZXBlbmRlbmNpZXMgZm9yIHRoZSBwcm9qZWN0LiBOb3RlIHRoYXQgdGhlc2UgZGVwZW5kZW5jaWVzDQotbWF5IGRpZmZlciBiYXNlZCBvbiBhIFdlYiBwcm9qZWN0J3MgYXNzb2NpYXRpb24gd2l0aCBtdWx0aXBsZSBFbnRlcnByaXNlIGFwcGxpY2F0aW9uDQotcHJvamVjdHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkpTUCBUYXNrIFRhZ3M8L2R0Pg0KLTxkZD5BZGQsIGVkaXQsIG9yIHJlbW92ZSBKU1AgdGFzayB0YWdzIGFuZCBhc3NpZ24gdGFnIHByaW9yaXRpZXMuIFRoZXNlICJ0bw0KLWRvIiBpdGVtcyBhcHBlYXIgaW4geW91ciBUYXNrcyB2aWV3LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5KU1AgQ29tcGlsYXRpb248L2R0Pg0KLTxkZD5TcGVjaWZ5IHdoZW4gaW4gdGhlIGJ1aWxkIHByb2Nlc3MgYSBKU1Agc2hvdWxkIGJlIHNldCB0byBjb21waWxlPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkpTUCBGcmFnbWVudCAoZHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+DQotPGRkPkRlZmluZSBkZWZhdWx0IGVuY29kaW5nLCBwYWdlIGRpcmVjdGl2ZSwgYW5kIGNvbnRlbnQgdHlwZSB2YWx1ZXMgZm9yIEpTUA0KLWZyYWdtZW50IGRvY3VtZW50cyBpbiB0aGUgd2ViIHByb2plY3QuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PkxpbmtzIFZhbGlkYXRpb24vUmVmYWN0b3Jpbmc8L2R0Pg0KLTxkZD5EZWZpbmUgcHJvamVjdC1sZXZlbCBsaW5rIG1hbmFnZW1lbnQgYW5kIHZhbGlkYXRpb24gc2V0dGluZ3MuIFRoZXNlIHNldHRpbmdzDQotb3ZlcnJpZGUgY29ycmVzcG9uZGluZyBzZXR0aW5ncyBpbiB0aGUgV29ya2JlbmNoIFByZWZlcmVuY2Ugc2V0dGluZ3MgZm9yIHRoZQ0KLWN1cnJlbnQgcHJvamVjdC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+UHJvamVjdCBSZWZlcmVuY2VzPC9kdD4NCi08ZGQ+UmVmZXJlbmNlIG90aGVyIFdlYiBwcm9qZWN0cyB0aGF0IGV4aXN0IG9uIHlvdXIgd29ya2JlbmNoIHdvcmtzcGFjZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+U2VydmVyPC9kdD4NCi08ZGQ+U2VsZWN0IHRoZSBzZXJ2ZXIgaW5zdGFuY2UgdXNlZCB0byBwZXJmb3JtIG5lY2Vzc2FyeSBkZXZlbG9wbWVudCwgdGVzdCwNCi1hbmQgcHVibGlzaGluZyBmdW5jdGlvbnMgZm9yIHRoZSBwcm9qZWN0LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5WYWxpZGF0aW9uPC9kdD4NCi08ZGQ+U3BlY2lmeSB3aGljaCB2YWxpZGF0b3JzIHNob3VsZCBydW4gZm9yIHRoZSBwcm9qZWN0LCBhbmQgd2hldGhlciB2YWxpZGF0aW9uDQotc2hvdWxkIG9jY3VyIGF1dG9tYXRpY2FsbHkgd2hlbiByZXNvdXJjZSB1cGRhdGVzIGFyZSB3cml0dGVuIHRvIHRoZSBwcm9qZWN0Lg0KLVRoZSBhdmFpbGFibGUgdmFsaWRhdG9ycyBhcmUgYmFzZWQgb24gdGhlIHR5cGVzIG9mIHJlc291cmNlcyBpbiB5b3VyIHByb2plY3QuDQotQnkgZGVmYXVsdCwgdmFsaWRhdG9ycyBhcmUgYXV0b21hdGljYWxseSBydW4gd2hlbiB5b3Ugc2F2ZSByZXNvdXJjZXMgaW4gYQ0KLVdlYiBwcm9qZWN0LiBJZiB5b3UgZG8gbm90IHdhbnQgdmFsaWRhdG9ycyB0byBydW4gYXV0b21hdGljYWxseSB3aGVuIHlvdSBzYXZlDQotdGhlc2UgcmVzb3VyY2VzLCBlbmFibGUgdGhlIDx1aWNvbnRyb2w+T3ZlcnJpZGUgdmFsaWRhdGlvbjwvdWljb250cm9sPiBwcmVmZXJlbmNlcw0KLW9wdGlvbiBhbmQgZGlzYWJsZSB0aGUgPHVpY29udHJvbD5SdW4gdmFsaWRhdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUNCi1jaGFuZ2VzIHRvIHJlc291cmNlczwvdWljb250cm9sPiBvcHRpb24uIDxub3RlPllvdSBjYW4gYWxzbyAgZGlzYWJsZSBhdXRvbWF0aWMNCi12YWxpZGF0aW9uIChhbmQgYnVpbGRzKSBmb3IgYWxsIHByb2plY3RzIGJ5IGRpc2FibGluZyA8dWljb250cm9sPlBlcmZvcm0gYnVpbGQNCi0gYXV0b21hdGljYWxseSBvbiByZXNvdXJjZSBtb2RpZmljYXRpb248L3VpY29udHJvbD4gZnJvbSB0aGUgPHVpY29udHJvbD5Xb3JrYmVuY2g8L3VpY29udHJvbD4gcHJvcGVydGllcy4NCi1JZiAgeW91IGRpc2FibGUgYXV0b21hdGljIGJ1aWxkcywgeW91IGNhbiBtYW51YWxseSAgcnVuIGEgYnVpbGQgKGFuZCB2YWxpZGF0aW9uKQ0KLWJ5IHNlbGVjdGluZyAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UHJvamVjdDwvdWljb250cm9sPjx1aWNvbnRyb2w+UmVidWlsZA0KLXByb2plY3Q8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L25vdGU+PC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PldlYiBDb250ZW50IFNldHRpbmdzPC9kdD4NCi08ZGQ+UHJvdmlkZSBhbnkgYXBwbGljYWJsZSBXZWIgY29udGVudCBzZXR0aW5ncyBmb3IgYSBXZWIgcHJvamVjdC4gWW91IGNhbg0KLXNwZWNpZnkgdGhlIGRvY3VtZW50IHR5cGUsIENTUyBwcm9maWxlLCBhbmQgdGFyZ2V0IGRldmljZS48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+V2ViIFByb2plY3QgRmVhdHVyZXM8L2R0Pg0KLTxkZD5TZWxlY3QgdGhlIGZlYXR1cmVzIHlvdSB3YW50IHRvIGJlIGVuYWJsZWQgZm9yIHlvdXIgV2ViIHByb2plY3QsIHN1Y2gNCi1hcyBQYWdlIFRlbXBsYXRlIHN1cHBvcnQuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgaGF2ZSBjb21wbGV0ZWQgdXBkYXRlcyB0byBXZWIgcHJvamVjdCBzZXR0aW5ncywgY2xpY2sgPHBoPjx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD48L3BoPiB0bw0KLXNhdmUgYW5kIGNsb3NlIHRoZSBQcm9wZXJ0aWVzIGRpYWxvZy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdwcmpzZXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3ByanNldC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmNlYzMwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3ByanNldC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgV2ViIHByb2plY3QgcHJvcGVydGllcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwcm9qZWN0cywgcHJvcGVydGllcyBzZXR0aW5ncyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IldlYiBwcm9qZWN0cywgcHJvcGVydGllcyBzZXR0aW5ncyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdwcmpzZXQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIFdlYiBwcm9qZWN0IHByb3BlcnRpZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3cHJqc2V0Ij48YSBuYW1lPSJ0d3ByanNldCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzPC9oMT4KLQotCi08ZGl2PgotPGRpdiBjbGFzcz0ic2VjdGlvbiI+IDxwPlRoZXJlIGFyZSBtYW55IFdlYiBwcm9qZWN0IHByb3BlcnRpZXMgdGhhdCB5b3UgY2FuIHNldCB0aGF0IGFmZmVjdAotdGhlIHBoYXNlcyBpbiB0aGUgbGlmZWN5Y2xlIG9mIHlvdXIgcHJvamVjdCBhbmQgaXRzIGRlcGVuZGVuY2llcyBvbiBvdGhlcgotV2ViIHJlc291cmNlcyBhbmQgV2ViIGRldmVsb3BtZW50IHByb2Nlc3Nlcy4gWW91IG1pZ2h0IHdhbnQgdG8gdmVyaWZ5IG9yIHVwZGF0ZQotdGhlc2UgcHJvcGVydGllcyBhZnRlciB5b3UgaGF2ZSB1cGRhdGVkIGFuIGV4aXN0aW5nIHByb2plY3Qgb3IgaGF2ZSBpbXBvcnRlZAotV2ViIHJlc291cmNlcyBpbnRvIGEgcHJvamVjdCAuPC9wPgotPHA+VG8gdmlldyBvciBzZXQgV2ViIHByb2plY3QgcHJvcGVydGllcywKLWRvIHRoZSBmb2xsb3dpbmc6IDwvcD4KLSA8L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodC1jbGljayBvbiBhIFdlYiBQcm9qZWN0LCBhbmQgZnJvbSB0aGUgcG9wLXVwIG1lbnUgc2VsZWN0IDxzcGFuPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCBhIHByb3BlcnR5IHR5cGUgaW4gdGhlIGxlZnQgcGFuZSBvZiB0aGUgUHJvcGVydGllcyBkaWFsb2cKLXRvIHZpZXcgb3IgdXBkYXRlIHByb3BlcnRpZXMgaW4gdGhlIFdlYiBwcm9qZWN0LiBGb3IgZWFjaCBwcm9wZXJ0eSwgeW91IGNhbgotYXBwbHkgY2hhbmdlcyBhbmQgbW9kaWZ5IGRlZmF1bHQgc2V0dGluZ3MuIEJhc2VkIG9uIHdoZXRoZXIgeW91IGhhdmUgYSBzdGF0aWMKLW9yIGEgZHluYW1pYyBXZWIgcHJvamVjdCwgdGhlIGZvbGxvd2luZyBwcm9wZXJ0eSB0eXBlcyBhcmUgYXZhaWxhYmxlOjwvc3Bhbj4KLSA8ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+SW5mbzwvZHQ+Ci0KLTxkZD5Qcm92aWRlcyBnZW5lcmFsIGluZm9ybWF0aW9uIGFib3V0IHByb2plY3QgdHlwZSwgbG9jYXRpb24sIGFuZCBtb2RpZmljYXRpb24KLXN0YXR1cy4gPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+QmVhbkluZm8gUGF0aCAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5JZiB5b3Ugc2VsZWN0IHRoZSBFbmFibGUgQmVhbmluZm8gSW50cm9zcGVjdGlvbiBvbiB0aGlzIHByb2plY3QsIHlvdSBjYW4KLXNwZWNpZnkgdGhlIGNvbnRlbnRzIGFuZCBvcmRlciBvZiBKYXZh4oSiIEJlYW4gc2VhcmNoIHBhdGhzIHRvIHByb3ZpZGUgQmVhbiBpbmZvcm1hdGlvbgotcmVsZXZhbnQgdG8gdGhlIHByb2plY3QuIFlvdSBjYW4gYWRkLCByZW1vdmUsIGFuZCByZW9yZGVyICh1c2luZyB0aGUgPHNwYW4+VXA8L3NwYW4+IGFuZCA8c3Bhbj5Eb3duPC9zcGFuPiBidXR0b25zKQotdGhlIHBhY2thZ2VzIHVzZWQgdG8gaW5jbHVkZSBCZWFuIGluZm9ybWF0aW9uLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkJ1aWxkZXJzPC9kdD4KLQotPGRkPkFkZCwgcmVtb3ZlLCBvciByZW9yZGVyIGV4dGVybmFsIHRvb2xzIGluIHRoZSBidWlsZCBvcmRlci4gV2hlbiB5b3Ugc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gdG8KLWNyZWF0ZSBhIG5ldyBleHRlcm5hbCB0b29sIHRvIHRoZSBsaXN0LCB0aGUgTmV3IEV4dGVybmFsIFRvb2wgd2l6YXJkIG9wZW5zLAotc28gdGhhdCB5b3UgY2FuIGRlZmluZSB0aGUgbmV3IGJ1aWxkIHRvb2wuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SjJFRSAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5JZGVudGlmeSBXZWIgbGV2ZWwgc3BlY2lmaWNhdGlvbiBhbmQgbW9kaWZ5IGNvbnRleHQgcm9vdCBhbmQgV2ViIGNvbnRlbnQKLWZvbGRlciBuYW1lPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SmF2YSBCdWlsZAotUGF0aCAoRHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5WaWV3IG9yIGNoYW5nZSB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEphdmEgYnVpbGQgcGF0aCB0aGF0IHlvdSBzdXBwbGllZCB3aGVuIGNyZWF0aW5nCi10aGUgcHJvamVjdCB1c2luZyB0aGUgPHNwYW4+Q3JlYXRlIGEgRHluYW1pY1dlYiBQcm9qZWN0PC9zcGFuPiB3aXphcmQuIFdoZW5ldmVyCi10aGUgV2ViIHByb2plY3QgaXMgcmVidWlsdCwgYW55IGNsYXNzIGZpbGVzIHRoYXQgYXJlIGNyZWF0ZWQgb3IgdXBkYXRlZCB3aWxsCi1iZSBvdXRwdXQgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgZm9sZGVyLiA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gQSBsaWJyYXJ5IGVudHJ5IG9uIHRoZSBKYXZhIGJ1aWxkCi1wYXRoIHdpbGwgcmVtYWluIHRoZXJlIHVubGVzcyB0aGUgYWN0dWFsIEpBUiBmaWxlIGlzIGRlbGV0ZWQgZnJvbSB0aGUgV0VCLUlORi9saWIKLWZvbGRlci4gSWYgeW91IHJlbW92ZSBhIGxpYnJhcnkgcGF0aCBlbnRyeSBidXQgbm90IHRoZSBKQVIgZmlsZSwgdGhlIGxpYnJhcnkKLWVudHJ5IHdpbGwgYmUgcmUtYWRkZWQgdG8gdGhlIHBhdGggYXV0b21hdGljYWxseS48L2Rpdj4KLTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkphdmEgQ29tcGlsZXIKLShEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4KLQotPGRkPkRlZmluZSB3aGV0aGVyIHRvIHVzZSB3b3Jrc3BhY2Ugc2V0dGluZ3Mgb3IgcHJvamVjdCBzZXR0aW5nIGZvciBjb21waWxpbmcgSmF2YSBjb2RlLAotaW5jbHVkaW5nIHNldHRpbmdzIGZvciBQcm9ibGVtcywgU3R5bGUsIENvbXBsaWFuY2UgYW5kIENsYXNzZmlsZXMsIGFuZCBCdWlsZAotUGF0aC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KYXZhZG9jIExvY2F0aW9uIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4KLQotPGRkPkRlZmluZSBhIGRlZmF1bHQgbG9jYXRpb24gKFVSTCkgZm9yIGFueSBKYXZhZG9jIGF2YWlsYWJsZSB0byB0aGUgcHJvamVjdC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KYXZhIEpBUgotRGVwZW5kZW5jaWVzIChEeW5hbWljIFdlYiBwcm9qZWN0IG9ubHkpPC9kdD4KLQotPGRkPkRlZmluZSBhbmQgcmVvcmRlciBKQVIgZGVwZW5kZW5jaWVzIGZvciB0aGUgcHJvamVjdC4gTm90ZSB0aGF0IHRoZXNlIGRlcGVuZGVuY2llcwotbWF5IGRpZmZlciBiYXNlZCBvbiBhIFdlYiBwcm9qZWN0J3MgYXNzb2NpYXRpb24gd2l0aCBtdWx0aXBsZSBFbnRlcnByaXNlIGFwcGxpY2F0aW9uCi1wcm9qZWN0cy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KU1AgVGFzayBUYWdzPC9kdD4KLQotPGRkPkFkZCwgZWRpdCwgb3IgcmVtb3ZlIEpTUCB0YXNrIHRhZ3MgYW5kIGFzc2lnbiB0YWcgcHJpb3JpdGllcy4gVGhlc2UgInRvCi1kbyIgaXRlbXMgYXBwZWFyIGluIHlvdXIgVGFza3Mgdmlldy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5KU1AgQ29tcGlsYXRpb248L2R0PgotCi08ZGQ+U3BlY2lmeSB3aGVuIGluIHRoZSBidWlsZCBwcm9jZXNzIGEgSlNQIHNob3VsZCBiZSBzZXQgdG8gY29tcGlsZTwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkpTUCBGcmFnbWVudCAoZHluYW1pYyBXZWIgcHJvamVjdCBvbmx5KTwvZHQ+Ci0KLTxkZD5EZWZpbmUgZGVmYXVsdCBlbmNvZGluZywgcGFnZSBkaXJlY3RpdmUsIGFuZCBjb250ZW50IHR5cGUgdmFsdWVzIGZvciBKU1AKLWZyYWdtZW50IGRvY3VtZW50cyBpbiB0aGUgd2ViIHByb2plY3QuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+TGlua3MgVmFsaWRhdGlvbi9SZWZhY3RvcmluZzwvZHQ+Ci0KLTxkZD5EZWZpbmUgcHJvamVjdC1sZXZlbCBsaW5rIG1hbmFnZW1lbnQgYW5kIHZhbGlkYXRpb24gc2V0dGluZ3MuIFRoZXNlIHNldHRpbmdzCi1vdmVycmlkZSBjb3JyZXNwb25kaW5nIHNldHRpbmdzIGluIHRoZSBXb3JrYmVuY2ggUHJlZmVyZW5jZSBzZXR0aW5ncyBmb3IgdGhlCi1jdXJyZW50IHByb2plY3QuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+UHJvamVjdCBSZWZlcmVuY2VzPC9kdD4KLQotPGRkPlJlZmVyZW5jZSBvdGhlciBXZWIgcHJvamVjdHMgdGhhdCBleGlzdCBvbiB5b3VyIHdvcmtiZW5jaCB3b3Jrc3BhY2UuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+U2VydmVyPC9kdD4KLQotPGRkPlNlbGVjdCB0aGUgc2VydmVyIGluc3RhbmNlIHVzZWQgdG8gcGVyZm9ybSBuZWNlc3NhcnkgZGV2ZWxvcG1lbnQsIHRlc3QsCi1hbmQgcHVibGlzaGluZyBmdW5jdGlvbnMgZm9yIHRoZSBwcm9qZWN0LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlZhbGlkYXRpb248L2R0PgotCi08ZGQ+U3BlY2lmeSB3aGljaCB2YWxpZGF0b3JzIHNob3VsZCBydW4gZm9yIHRoZSBwcm9qZWN0LCBhbmQgd2hldGhlciB2YWxpZGF0aW9uCi1zaG91bGQgb2NjdXIgYXV0b21hdGljYWxseSB3aGVuIHJlc291cmNlIHVwZGF0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHByb2plY3QuCi1UaGUgYXZhaWxhYmxlIHZhbGlkYXRvcnMgYXJlIGJhc2VkIG9uIHRoZSB0eXBlcyBvZiByZXNvdXJjZXMgaW4geW91ciBwcm9qZWN0LgotQnkgZGVmYXVsdCwgdmFsaWRhdG9ycyBhcmUgYXV0b21hdGljYWxseSBydW4gd2hlbiB5b3Ugc2F2ZSByZXNvdXJjZXMgaW4gYQotV2ViIHByb2plY3QuIElmIHlvdSBkbyBub3Qgd2FudCB2YWxpZGF0b3JzIHRvIHJ1biBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUKLXRoZXNlIHJlc291cmNlcywgZW5hYmxlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVycmlkZSB2YWxpZGF0aW9uPC9zcGFuPiBwcmVmZXJlbmNlcwotb3B0aW9uIGFuZCBkaXNhYmxlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SdW4gdmFsaWRhdGlvbiBhdXRvbWF0aWNhbGx5IHdoZW4geW91IHNhdmUKLWNoYW5nZXMgdG8gcmVzb3VyY2VzPC9zcGFuPiBvcHRpb24uIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBZb3UgY2FuIGFsc28gIGRpc2FibGUgYXV0b21hdGljCi12YWxpZGF0aW9uIChhbmQgYnVpbGRzKSBmb3IgYWxsIHByb2plY3RzIGJ5IGRpc2FibGluZyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QZXJmb3JtIGJ1aWxkCi0gYXV0b21hdGljYWxseSBvbiByZXNvdXJjZSBtb2RpZmljYXRpb248L3NwYW4+IGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaDwvc3Bhbj4gcHJvcGVydGllcy4KLUlmICB5b3UgZGlzYWJsZSBhdXRvbWF0aWMgYnVpbGRzLCB5b3UgY2FuIG1hbnVhbGx5ICBydW4gYSBidWlsZCAoYW5kIHZhbGlkYXRpb24pCi1ieSBzZWxlY3RpbmcgIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvamVjdDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWJ1aWxkCi1wcm9qZWN0PC9zcGFuPjwvc3Bhbj4uPC9kaXY+Ci08L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5XZWIgQ29udGVudCBTZXR0aW5nczwvZHQ+Ci0KLTxkZD5Qcm92aWRlIGFueSBhcHBsaWNhYmxlIFdlYiBjb250ZW50IHNldHRpbmdzIGZvciBhIFdlYiBwcm9qZWN0LiBZb3UgY2FuCi1zcGVjaWZ5IHRoZSBkb2N1bWVudCB0eXBlLCBDU1MgcHJvZmlsZSwgYW5kIHRhcmdldCBkZXZpY2UuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+V2ViIFByb2plY3QgRmVhdHVyZXM8L2R0PgotCi08ZGQ+U2VsZWN0IHRoZSBmZWF0dXJlcyB5b3Ugd2FudCB0byBiZSBlbmFibGVkIGZvciB5b3VyIFdlYiBwcm9qZWN0LCBzdWNoCi1hcyBQYWdlIFRlbXBsYXRlIHN1cHBvcnQuPC9kZD4KLQotPC9kbD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgaGF2ZSBjb21wbGV0ZWQgdXBkYXRlcyB0byBXZWIgcHJvamVjdCBzZXR0aW5ncywgY2xpY2sgPHNwYW4+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+PC9zcGFuPiB0bwotc2F2ZSBhbmQgY2xvc2UgdGhlIFByb3BlcnRpZXMgZGlhbG9nLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxMTAyYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci90b3BpY3MvdHdzcnZ3aXouZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA2LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idHdzcnZ3aXoiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIHNlcnZsZXRzPC90aXRsZT4NCi08c2hvcnRkZXNjPlRoZSBzZXJ2bGV0IHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIDx0bSB0bWNsYXNzPSJzcGVjaWFsIiB0bW93bmVyPSJTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIg0KLXRtdHlwZT0idG0iIHRyYWRlbWFyaz0iSmF2YSI+SmF2YTwvdG0+IHNlcnZsZXRzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlDQotY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yDQotdGhhdCB5b3UgY2FuIG1vZGlmeSBmb3IgdXNlIHdpdGggeW91ciBXZWIgYXBwbGljYXRpb24uIFRoZSBzZXJ2bGV0cyBjYW4gcnVuDQotb24gSjJFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+c2VydmxldHM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD4gPHA+VG8gY3JlYXRlIGEgc2VydmxldCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5Gcm9tIHRoZSBKMkVFIHBlcnNwZWN0aXZlLCBleHBhbmQgeW91ciAgPHhyZWYgaHJlZj0iY2N3ZWJwcmouZGl0YSINCi1zY29wZT0icGVlciI+PGRlc2M+PC9kZXNjPmR5bmFtaWMgcHJvamVjdDwveHJlZj4gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5SaWdodCBjbGljayBvbiB0aGUgPGI+U2VydmxldDwvYj4gaWNvbiwgYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+DQotPHVpY29udHJvbD5OZXc8L3VpY29udHJvbD48dWljb250cm9sPlNlcnZsZXQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPiBmcm9tDQotdGhlIHBvcC11cCBtZW51LjwvY21kPjxzdGVwcmVzdWx0PiBUaGUgPHVpY29udHJvbD5DcmVhdGUgU2VydmxldDwvdWljb250cm9sPiB3aXphcmQNCi1hcHBlYXJzLjwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Gb2xsb3cgdGhlIHByb2plY3Qgd2l6YXJkIHByb21wdHMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+PGI+R2VuZXJhbCBJbmZvcm1hdGlvbjwvYj48L3A+PGRsPjxkbGVudHJ5Pg0KLTxkdD5Nb2RpZmllcnM8L2R0Pg0KLTxkZD5Zb3UgY2FuIHNlbGVjdCBhIG1vZGlmaWVyIGluIHRoZSB3aXphcmQgdG8gc3BlY2lmeSB3aGV0aGVyIHlvdXIgc2VydmxldA0KLWNsYXNzIGlzIHB1YmxpYywgYWJzdHJhY3QsIG9yIGZpbmFsLiBOb3RlIHRoYXQgY2xhc3NlcyBjYW5ub3QgYmUgYm90aCBhYnN0cmFjdA0KLWFuZCBmaW5hbC48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+amF2YXguc2VydmxldC5TZXJ2bGV0PC9kdD4NCi08ZGQ+QWx0aG91Z2ggamF2YXguc2VydmxldC5TZXJ2bGV0IGlzIHByb3ZpZGVkIGFzIHRoZSBkZWZhdWx0IGludGVyZmFjZSwgeW91DQotY2FuIHVzZSB0aGUgd2l6YXJkIHRvIGFkZCBhZGRpdGlvbmFsIGludGVyZmFjZXMgdG8gaW1wbGVtZW50LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5JbnRlcmZhY2Ugc2VsZWN0aW9uIGRpYWxvZzwvZHQ+DQotPGRkPlRoaXMgZGlhbG9nIGFwcGVhcnMgaWYgeW91IGVsZWN0IHRvIGFkZCBhbiBpbnRlcmZhY2UgdG8geW91ciBzZXJ2bGV0Lg0KLUFzIHlvdSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UgdGhhdCB5b3UgYXJlIGFkZGluZywgYSBsaXN0IG9mIGF2YWlsYWJsZQ0KLWludGVyZmFjZXMgbGlzdGVkIGluIHRoZSBNYXRjaGluZyB0eXBlcyBsaXN0IGJveCB1cGRhdGVzIGR5bmFtaWNhbGx5IHRvIGRpc3BsYXkNCi1vbmx5IHRoZSBpbnRlcmZhY2VzIHRoYXQgbWF0Y2ggdGhlIHBhdHRlcm4uIFlvdSBzaG91bGQgY2hvb3NlIGFuIGludGVyZmFjZQ0KLXRvIHNlZSB0aGUgcXVhbGlmaWVyLCBhbmQgdGhlbiBjbGljayBPSyB3aGVuIGZpbmlzaGVkLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5NZXRob2Qgc3R1YnM8L2R0Pg0KLTxkZD5Zb3UgY2FuIHNlbGVjdCBhbnkgYXBwcm9wcmlhdGUgbWV0aG9kIHN0dWJzIHRvIGJlIGNyZWF0ZWQgaW4gdGhlIHNlcnZsZXQNCi1maWxlLiBUaGUgc3R1YnMgY3JlYXRlZCBieSB1c2luZyB0aGUgSW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMgb3B0aW9uIG11c3QNCi1iZSBpbXBsZW1lbnRlZCBpZiB5b3UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW4gYWJzdHJhY3Qgc2VydmxldC4gTm90ZSB0aGF0DQotdGhpcyBpcyBub3QgdHJ1ZSBmb3IgQ29uc3RydWN0b3JzIGZyb20gc3VwZXJjbGFzczwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3RvcGljcy90d3Nydndpei5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjhjY2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3Qud2VidG9vbHMuZG9jLnVzZXIvdG9waWNzL3R3c3J2d2l6Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBzZXJ2bGV0cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgc2VydmxldCB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSBKYXZhIHNlcnZsZXRzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlIGNyZWF0aW9uIHByb2Nlc3MgYW5kIGJ5IHByb3ZpZGluZyB5b3Ugd2l0aCBvdXRwdXQgZmlsZXMgdGhhdCB5b3UgY2FuIHVzZSBvciB0aGF0IHlvdSBjYW4gbW9kaWZ5IGZvciB1c2Ugd2l0aCB5b3VyIFdlYiBhcHBsaWNhdGlvbi4gVGhlIHNlcnZsZXRzIGNhbiBydW4gb24gSjJFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBzZXJ2bGV0IHdpemFyZCBoZWxwcyB5b3UgY3JlYXRlIEphdmEgc2VydmxldHMgYnkgd2Fsa2luZyB5b3UgdGhyb3VnaCB0aGUgY3JlYXRpb24gcHJvY2VzcyBhbmQgYnkgcHJvdmlkaW5nIHlvdSB3aXRoIG91dHB1dCBmaWxlcyB0aGF0IHlvdSBjYW4gdXNlIG9yIHRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgc2VydmxldHMgY2FuIHJ1biBvbiBKMkVFLWNvbXBsaWFudCBXZWIgc2VydmVycy4iIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJzZXJ2bGV0cywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3c3J2d2l6IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgc2VydmxldHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3c3J2d2l6Ij48YSBuYW1lPSJ0d3NydndpeiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgc2VydmxldHM8L2gxPgotCi0KLQotPGRpdj48cD5UaGUgc2VydmxldCB3aXphcmQgaGVscHMgeW91IGNyZWF0ZSBKYXZh4oSiIHNlcnZsZXRzIGJ5IHdhbGtpbmcgeW91IHRocm91Z2ggdGhlCi1jcmVhdGlvbiBwcm9jZXNzIGFuZCBieSBwcm92aWRpbmcgeW91IHdpdGggb3V0cHV0IGZpbGVzIHRoYXQgeW91IGNhbiB1c2Ugb3IKLXRoYXQgeW91IGNhbiBtb2RpZnkgZm9yIHVzZSB3aXRoIHlvdXIgV2ViIGFwcGxpY2F0aW9uLiBUaGUgc2VydmxldHMgY2FuIHJ1bgotb24gSjJFRS1jb21wbGlhbnQgV2ViIHNlcnZlcnMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj4gPHA+VG8gY3JlYXRlIGEgc2VydmxldCwgY29tcGxldGUgdGhlIGZvbGxvd2luZyBzdGVwczogPC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+RnJvbSB0aGUgSjJFRSBwZXJzcGVjdGl2ZSwgZXhwYW5kIHlvdXIgIDxhIGhyZWY9ImNjd2VicHJqLmh0bWwiIHRpdGxlPSIiPmR5bmFtaWMgcHJvamVjdDwvYT4gaW4gdGhlIFByb2plY3QgRXhwbG9yZXIgdmlldy48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodCBjbGljayBvbiB0aGUgPHN0cm9uZz5TZXJ2bGV0PC9zdHJvbmc+IGljb24sIGFuZCBzZWxlY3QgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj4KLTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TZXJ2bGV0PC9zcGFuPjwvc3Bhbj4gZnJvbQotdGhlIHBvcC11cCBtZW51Ljwvc3Bhbj4gIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgU2VydmxldDwvc3Bhbj4gd2l6YXJkCi1hcHBlYXJzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Rm9sbG93IHRoZSBwcm9qZWN0IHdpemFyZCBwcm9tcHRzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD48c3Ryb25nPkdlbmVyYWwgSW5mb3JtYXRpb248L3N0cm9uZz48L3A+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+TW9kaWZpZXJzPC9kdD4KLQotPGRkPllvdSBjYW4gc2VsZWN0IGEgbW9kaWZpZXIgaW4gdGhlIHdpemFyZCB0byBzcGVjaWZ5IHdoZXRoZXIgeW91ciBzZXJ2bGV0Ci1jbGFzcyBpcyBwdWJsaWMsIGFic3RyYWN0LCBvciBmaW5hbC4gTm90ZSB0aGF0IGNsYXNzZXMgY2Fubm90IGJlIGJvdGggYWJzdHJhY3QKLWFuZCBmaW5hbC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5qYXZheC5zZXJ2bGV0LlNlcnZsZXQ8L2R0PgotCi08ZGQ+QWx0aG91Z2ggamF2YXguc2VydmxldC5TZXJ2bGV0IGlzIHByb3ZpZGVkIGFzIHRoZSBkZWZhdWx0IGludGVyZmFjZSwgeW91Ci1jYW4gdXNlIHRoZSB3aXphcmQgdG8gYWRkIGFkZGl0aW9uYWwgaW50ZXJmYWNlcyB0byBpbXBsZW1lbnQuPC9kZD4KLQotCi08ZHQgY2xhc3M9ImRsdGVybSI+SW50ZXJmYWNlIHNlbGVjdGlvbiBkaWFsb2c8L2R0PgotCi08ZGQ+VGhpcyBkaWFsb2cgYXBwZWFycyBpZiB5b3UgZWxlY3QgdG8gYWRkIGFuIGludGVyZmFjZSB0byB5b3VyIHNlcnZsZXQuCi1BcyB5b3UgdHlwZSB0aGUgbmFtZSBvZiB0aGUgaW50ZXJmYWNlIHRoYXQgeW91IGFyZSBhZGRpbmcsIGEgbGlzdCBvZiBhdmFpbGFibGUKLWludGVyZmFjZXMgbGlzdGVkIGluIHRoZSBNYXRjaGluZyB0eXBlcyBsaXN0IGJveCB1cGRhdGVzIGR5bmFtaWNhbGx5IHRvIGRpc3BsYXkKLW9ubHkgdGhlIGludGVyZmFjZXMgdGhhdCBtYXRjaCB0aGUgcGF0dGVybi4gWW91IHNob3VsZCBjaG9vc2UgYW4gaW50ZXJmYWNlCi10byBzZWUgdGhlIHF1YWxpZmllciwgYW5kIHRoZW4gY2xpY2sgT0sgd2hlbiBmaW5pc2hlZC48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5NZXRob2Qgc3R1YnM8L2R0PgotCi08ZGQ+WW91IGNhbiBzZWxlY3QgYW55IGFwcHJvcHJpYXRlIG1ldGhvZCBzdHVicyB0byBiZSBjcmVhdGVkIGluIHRoZSBzZXJ2bGV0Ci1maWxlLiBUaGUgc3R1YnMgY3JlYXRlZCBieSB1c2luZyB0aGUgSW5oZXJpdGVkIGFic3RyYWN0IG1ldGhvZHMgb3B0aW9uIG11c3QKLWJlIGltcGxlbWVudGVkIGlmIHlvdSBkbyBub3QgaW50ZW5kIHRvIGNyZWF0ZSBhbiBhYnN0cmFjdCBzZXJ2bGV0LiBOb3RlIHRoYXQKLXRoaXMgaXMgbm90IHRydWUgZm9yIENvbnN0cnVjdG9ycyBmcm9tIHN1cGVyY2xhc3M8L2RkPgotCi08L2RsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy5kaXRhbWFwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWVkMDFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgbGlua2luZz0ibm9uZSIgdGl0bGU9IldlYiBhcHBsaWNhdGlvbiBkZXZlbG9wbWVudCI+DQotPHRvcGljbWV0YT48L3RvcGljbWV0YT4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2Njd3RvdmVyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXBwbGljYXRpb24gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d0ZmVhdHVyZXMuZGl0YSIgbmF2dGl0bGU9IldlYiB0b29scyBmZWF0dXJlcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3dlYnZ3LmRpdGEiIG5hdnRpdGxlPSJQcm9qZWN0IEV4cGxvcmVyIHZpZXcgYW5kIFdlYiBkZXZlbG9wbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuZGl0YSIgbmF2dGl0bGU9IldlYiByZXNvdXJjZXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5kaXRhIiBuYXZ0aXRsZT0iV2ViIHBhZ2UgZGVzaWduIj48L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3ZWJwcm9qZWN0cy5kaXRhIiBuYXZ0aXRsZT0iV2ViIHByb2plY3RzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmRpdGEiIG5hdnRpdGxlPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3JlcHJqLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIGR5bmFtaWMgV2ViIHByb2plY3QiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2N3ZWJwcmouZGl0YSIgbmF2dGl0bGU9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3BjbnZydC5kaXRhIiBuYXZ0aXRsZT0iQ29udmVydGluZyBzdGF0aWMgV2ViIHByb2plY3RzIHRvIGR5bmFtaWMgV2ViIHByb2plY3RzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY2NzdGF0aWMuZGl0YSIgbmF2dGl0bGU9IlN0YXRpYyBXZWIgcHJvamVjdHMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3aW1wd2FyLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NyZXdhci5kaXRhIiBuYXZ0aXRsZT0iRXhwb3J0aW5nIFdlYiBBcmNoaXZlIChXQVIpIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdwbGliLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgV2ViIGxpYnJhcnkgcHJvamVjdHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d3ByanNldC5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3dlZHR2dy5kaXRhIiBuYXZ0aXRsZT0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90amRldGFncy5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgYW5kIGVkaXRpbmcgV2ViIHBhZ2VzIC0gb3ZlcnZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGpjcmVodG0uZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90anByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBIVE1MIGZpbGUgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c3R5bGVzaGVldC5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3c3J2d2l6LmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBzZXJ2bGV0cyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3NlcnZibi5kaXRhIiBuYXZ0aXRsZT0iU2VydmxldHMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RqY3JlanNwLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBKYXZhU2VydmVyIFBhZ2VzIChKU1ApIGZpbGVzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2NwZGpzcHMuZGl0YSIgbmF2dGl0bGU9IkphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgdGVjaG5vbG9neSI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2N2c3IuZGl0YSIgbmF2dGl0bGU9IlNldHRpbmcgQ1ZTIHJlcG9zaXRvcnkgZGVmYXVsdHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0LmRpdGEiIG5hdnRpdGxlPSJTZXJ2ZXIgdGFyZ2V0aW5nIGZvciBXZWIgYXBwbGljYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlci93ZWJ0b29sc190b2MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjc0YmQ1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LndlYnRvb2xzLmRvYy51c2VyL3dlYnRvb2xzX3RvYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIGxhYmVsPSJXZWIgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQiIHRvcGljPSJ0b3BpY3MvY2N3dG92ZXIuaHRtbCI+Ci08dG9waWMgbGFiZWw9IldlYiBhcHBsaWNhdGlvbiBvdmVydmlldyIgaHJlZj0idG9waWNzL2Njd3RvdmVyLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXZWIgdG9vbHMgZmVhdHVyZXMiIGhyZWY9InRvcGljcy9jd3RmZWF0dXJlcy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iUHJvamVjdCBFeHBsb3JlciB2aWV3IGFuZCBXZWIgZGV2ZWxvcG1lbnQiIGhyZWY9InRvcGljcy9jY3dlYnZ3Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV2ViIHJlc291cmNlcyIgaHJlZj0idG9waWNzL2N3ZWJyZXNvdXJjZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJXZWIgcGFnZSBkZXNpZ24iIGhyZWY9InRvcGljcy9jd2VicGFnZWRlc2lnbi5odG1sIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iV2ViIHByb2plY3RzIiBocmVmPSJ0b3BpY3MvY3dlYnByb2plY3RzLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXZWIgYXJjaGl2ZSAoV0FSKSBmaWxlcyIgaHJlZj0idG9waWNzL2N3d2Fyb3ZyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgYSBkeW5hbWljIFdlYiBwcm9qZWN0IiBocmVmPSJ0b3BpY3MvdHdjcmVwcmouaHRtbCI+Ci08dG9waWMgbGFiZWw9IkR5bmFtaWMgV2ViIHByb2plY3RzIGFuZCBhcHBsaWNhdGlvbnMiIGhyZWY9InRvcGljcy9jY3dlYnByai5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBhIHN0YXRpYyBXZWIgcHJvamVjdCIgaHJlZj0idG9waWNzL3R3Y3Jlc3RhLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDb252ZXJ0aW5nIHN0YXRpYyBXZWIgcHJvamVjdHMgdG8gZHluYW1pYyBXZWIgcHJvamVjdHMiIGhyZWY9InRvcGljcy90d3BjbnZydC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlN0YXRpYyBXZWIgcHJvamVjdHMiIGhyZWY9InRvcGljcy9jY3N0YXRpYy5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJJbXBvcnRpbmcgV2ViIGFyY2hpdmUgKFdBUikgZmlsZXMiIGhyZWY9InRvcGljcy90d2ltcHdhci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkV4cG9ydGluZyBXZWIgQXJjaGl2ZSAoV0FSKSBmaWxlcyIgaHJlZj0idG9waWNzL3R3Y3Jld2FyLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIFdlYiBsaWJyYXJ5IHByb2plY3RzIiBocmVmPSJ0b3BpY3MvdHdwbGliLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBXZWIgcHJvamVjdCBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdHdwcmpzZXQuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iV29ya2JlbmNoIGludGVncmF0aW9uIHdpdGggV2ViIGVkaXRvcnMiIGhyZWY9InRvcGljcy9jd3dlZHR2dy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIGFuZCBlZGl0aW5nIFdlYiBwYWdlcyAtIG92ZXJ2aWV3IiBocmVmPSJ0b3BpY3MvdGpkZXRhZ3MuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIEhUTUwgYW5kIFhIVE1MIGZpbGVzIGFuZCBmcmFtZXNldHMiIGhyZWY9InRvcGljcy90amNyZWh0bS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkRlZmluaW5nIEhUTUwgZmlsZSBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RqcHJlZnMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBjYXNjYWRpbmcgc3R5bGUgc2hlZXRzIiBocmVmPSJ0b3BpY3MvdHN0eWxlc2hlZXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBzZXJ2bGV0cyIgaHJlZj0idG9waWNzL3R3c3J2d2l6Lmh0bWwiPgotPHRvcGljIGxhYmVsPSJTZXJ2bGV0cyIgaHJlZj0idG9waWNzL2N3c2VydmJuLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIEphdmFTZXJ2ZXIgUGFnZXMgKEpTUCkgZmlsZXMiIGhyZWY9InRvcGljcy90amNyZWpzcC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iSmF2YVNlcnZlciBQYWdlcyAoSlNQKSB0ZWNobm9sb2d5IiBocmVmPSJ0b3BpY3MvY3BkanNwcy5odG1sIi8+Ci08L3RvcGljPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBDVlMgcmVwb3NpdG9yeSBkZWZhdWx0cyIgaHJlZj0idG9waWNzL3R3Y3Zzci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNlcnZlciB0YXJnZXRpbmcgZm9yIFdlYiBhcHBsaWNhdGlvbnMiIGhyZWY9InRvcGljcy90c2VydmVydGFyZ2V0Lmh0bWwiLz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLmN2c2lnbm9yZSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnByb2plY3QgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwZmY2OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcDwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5NYW5pZmVzdEJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLlNjaGVtYUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5QbHVnaW5OYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuY29yZS5yZXNvdXJjZXMucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotZW5jb2RpbmcvPHByb2plY3Q+PUlTTy04ODU5LTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0jU3VuIEFwciAxNiAxNDozNzoyMSBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuY2xlYW5PdXRwdXRGb2xkZXI9Y2xlYW4KLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuZHVwbGljYXRlUmVzb3VyY2VUYXNrPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIuaW52YWxpZENsYXNzcGF0aD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmJ1aWxkZXIucmVzb3VyY2VDb3B5RXhjbHVzaW9uRmlsdGVyPSoubGF1bmNoCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jaXJjdWxhckNsYXNzcGF0aD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2xhc3NwYXRoLmV4Y2x1c2lvblBhdHRlcm5zPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5tdWx0aXBsZU91dHB1dExvY2F0aW9ucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLmlubGluZUpzckJ5dGVjb2RlPWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuMgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi51bnVzZWRMb2NhbD1wcmVzZXJ2ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29tcGxpYW5jZT0xLjQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxpbmVOdW1iZXI9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLmxvY2FsVmFyaWFibGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRlYnVnLnNvdXJjZUZpbGU9Z2VuZXJhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmRvYy5jb21tZW50LnN1cHBvcnQ9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIubWF4UHJvYmxlbVBlclVuaXQ9MTAwCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFubm90YXRpb25TdXBlckludGVyZmFjZT13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hdXRvYm94aW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRlcHJlY2F0aW9uSW5EZXByZWNhdGVkQ29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbldoZW5PdmVycmlkaW5nRGVwcmVjYXRlZE1ldGhvZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmRpc2NvdXJhZ2VkUmVmZXJlbmNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbXB0eVN0YXRlbWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZmllbGRIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsUGFyYW1ldGVyQm91bmQ9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpbmFsbHlCbG9ja05vdENvbXBsZXRpbmdOb3JtYWxseT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5mb3JiaWRkZW5SZWZlcmVuY2U9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaGlkZGVuQ2F0Y2hCbG9jaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGF0aWJsZU5vbkluaGVyaXRlZEludGVyZmFjZU1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmluY29tcGxldGVFbnVtU3dpdGNoPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmRpcmVjdFN0YXRpY0FjY2Vzcz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvYz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzRGVwcmVjYXRlZFJlZj1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc05vdFZpc2libGVSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubG9jYWxWYXJpYWJsZUhpZGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWV0aG9kV2l0aENvbnN0cnVjdG9yTmFtZT1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nRGVwcmVjYXRlZEFubm90YXRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHM9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNPdmVycmlkaW5nPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NDb21tZW50c1Zpc2liaWxpdHk9cHVibGljCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFncz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0phdmFkb2NUYWdzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc1Zpc2liaWxpdHk9cHJpdmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nT3ZlcnJpZGVBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nU2VyaWFsVmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vRWZmZWN0QXNzaWdubWVudD1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0ltcGxpY2l0U3RyaW5nQ29udmVyc2lvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm5vbkV4dGVybmFsaXplZFN0cmluZ0xpdGVyYWw9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm92ZXJyaWRpbmdQYWNrYWdlRGVmYXVsdE1ldGhvZD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnBvc3NpYmxlQWNjaWRlbnRhbEJvb2xlYW5Bc3NpZ25tZW50PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3BlY2lhbFBhcmFtZXRlckhpZGluZ0ZpZWxkPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3RhdGljQWNjZXNzUmVjZWl2ZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uc3VwcHJlc3NXYXJuaW5ncz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN5bnRoZXRpY0FjY2Vzc0VtdWxhdGlvbj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnR5cGVQYXJhbWV0ZXJIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuY2hlY2tlZFR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmRvY3VtZW50ZWRFbXB0eUJsb2NrPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmhhbmRsZWRXYXJuaW5nVG9rZW49d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeUVsc2U9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVubmVjZXNzYXJ5VHlwZUNoZWNrPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVucXVhbGlmaWVkRmllbGRBY2Nlc3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVuc2FmZVR5cGVPcGVyYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWREZWNsYXJlZFRocm93bkV4Y2VwdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb25XaGVuT3ZlcnJpZGluZz1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRJbXBvcnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTGFiZWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkTG9jYWw9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQYXJhbWV0ZXJXaGVuSW1wbGVtZW50aW5nQWJzdHJhY3Q9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbk92ZXJyaWRpbmdDb25jcmV0ZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnVzZWRQcml2YXRlTWVtYmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnZhcmFyZ3NBcmd1bWVudE5lZWRDYXN0PXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjMKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGF0aWJsZUpES0xldmVsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuaW5jb21wbGV0ZUNsYXNzcGF0aD1lcnJvcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC51aS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzkgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1pbnRlcm5hbC5kZWZhdWx0LmNvbXBsaWFuY2U9ZGVmYXVsdApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI1R1ZSBBcHIgMDQgMDM6MzY6MzIgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5sdGsuY29yZS5yZWZhY3RvcmluZy5lbmFibGUucHJvamVjdC5yZWZhY3RvcmluZy5oaXN0b3J5PWZhbHNlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UucGRlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6MDU6MjkgRURUIDIwMDYKLWNvbXBpbGVycy5wLmJ1aWxkPTAKLWNvbXBpbGVycy5wLmRlcHJlY2F0ZWQ9MQotY29tcGlsZXJzLnAuaWxsZWdhbC1hdHQtdmFsdWU9MAotY29tcGlsZXJzLnAubm8tcmVxdWlyZWQtYXR0PTAKLWNvbXBpbGVycy5wLm5vdC1leHRlcm5hbGl6ZWQtYXR0PTAKLWNvbXBpbGVycy5wLnVua25vd24tYXR0cmlidXRlPTAKLWNvbXBpbGVycy5wLnVua25vd24tY2xhc3M9MAotY29tcGlsZXJzLnAudW5rbm93bi1lbGVtZW50PTAKLWNvbXBpbGVycy5wLnVua25vd24tcmVzb3VyY2U9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1leC1wb2ludHM9MAotY29tcGlsZXJzLnAudW5yZXNvbHZlZC1pbXBvcnQ9MAotY29tcGlsZXJzLnAudW51c2VkLWVsZW1lbnQtb3ItYXR0cmlidXRlPTAKLWNvbXBpbGVycy51c2UtcHJvamVjdD10cnVlCi1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjRmY2E5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL0VkaXRvclhtbENvbnRleHRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9OTFMgdHlwZT0ib3JnLmVjbGlwc2UuaGVscC5jb250ZXh0cyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotPGRlc2NyaXB0aW9uLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA2MCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IHNwZWNpZnkgdGhlIGxpbmUgZGVsaW1pdGVyIGFuZCB0aGUgdGV4dCBlbmNvZGluZyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHlvdSBjcmVhdGUgb3Igc2F2ZSBhbiBYTUwgcmVsYXRlZCBmaWxlLgotCi1WYXJpb3VzIGRldmVsb3BtZW50IHBsYXRmb3JtcyB1c2UgZGlmZmVyZW50IGxpbmUgZGVsaW1pdGVycyB0byBpbmRpY2F0ZSB0aGUgc3RhcnQgb2YgYSBuZXcgbGluZS4gU2VsZWN0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgY29ycmVzcG9uZHMgdG8geW91ciBkZXZlbG9wbWVudCBvciBkZXBsb3ltZW50IHBsYXRmb3JtLgotCi08Yj5Ob3RlOjwvYj4gVGhpcyBkZWxpbWl0ZXIgd2lsbCBub3QgYXV0b21hdGljYWxseSBiZSBhZGRlZCB0byBhbnkgZG9jdW1lbnRzIHRoYXQgY3VycmVudGx5IGV4aXN0LiBJdCB3aWxsIGJlIGFkZGVkIG9ubHkgdG8gZG9jdW1lbnRzIHRoYXQgeW91IGNyZWF0ZSBhZnRlciB5b3Ugc2VsZWN0IHRoZSBsaW5lIGRlbGltaXRlciB0eXBlIGFuZCBjbGljayA8Yj5BcHBseTwvYj4sIG9yIHRvIGV4aXN0aW5nIGZpbGVzIHRoYXQgeW91IG9wZW4gYW5kIHRoZW4gcmVzYXZlIGFmdGVyIHlvdSBzZWxlY3QgdGhlIGxpbmUgZGVsaW1pdGVyIHR5cGUgYW5kIGNsaWNrIDxiPkFwcGx5PC9iPi4KLQotVGhlIGVuY29kaW5nIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRlZmF1bHQgY2hhcmFjdGVyIGVuY29kaW5nIHNldCB0aGF0IGlzIHVzZWQgd2hlbiBjcmVhdGluZyBYTUwgcmVsYXRlZCBmaWxlcyAoRFREcywgWE1MIGZpbGVzLCBYTUwgc2NoZW1hcykuIENoYW5naW5nIHRoZSBlbmNvZGluZyBjYXVzZXMgYW55IG5ldywgWE1MIHJlbGF0ZWQgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRlbmMuaHRtbCIgbGFiZWw9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgYW5kIGxpbmUgZGVsaW1pdGVycyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IndlYngwMDYxIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgZm9ybWF0dGluZyBhbmQgY29udGVudCBhc3Npc3QgcHJlZmVyZW5jZXMgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiBlZGl0aW5nIGFuIFhNTCBmaWxlLgotCi1FbnRlciBhIG1heGltdW0gd2lkdGggaW4gdGhlIDxiPkxpbmUgd2lkdGg8L2I+IGZpZWxkIHRvIHNwZWNpZnkgd2hlbiBhIGxpbmUgc2hvdWxkIGJlIGJyb2tlbiB0byBmaXQgb250byBtb3JlIHRoYW4gb25lIGxpbmUuIFRoaXMgd2lsbCBiZSBhcHBsaWVkIHdoZW4gdGhlIGRvY3VtZW50IGlzIGZvcm1hdHRlZC4KLQotU2VsZWN0IDxiPlNwbGl0IG11bHRpcGxlIGF0dHJpYnV0ZXMgZWFjaCBvbiBhIG5ldyBsaW5lPC9iPiB0byBzdGFydCBldmVyeSBhdHRyaWJ1dGUgb24gYSBuZXcgbGluZSB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQuCi0KLVNlbGVjdCA8Yj5DbGVhciBhbGwgYmxhbmsgbGluZXM8L2I+IHRvIHJlbW92ZSBibGFuayBsaW5lcyB3aGVuIHRoZSBkb2N1bWVudCBpcyBmb3JtYXR0ZWQuCi0KLVNlbGVjdCA8Yj5JbmRlbnQgdXNpbmcgdGFiczwvYj4gaWYgeW91IHdhbnQgdG8gdXNlIHRhYiBjaGFyYWN0ZXJzIChcdCkgYXMgdGhlIHN0YW5kYXJkIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uCi0KLUlmIHlvdSBwcmVmZXIgdG8gdXNlIHNwYWNlcywgc2VsZWN0IDxiPkluZGVudCB1c2luZyBzcGFjZXM8L2I+LgotCi1Zb3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgPGI+SW5kZW50YXRpb24gc2l6ZTwvYj4gd2hpY2ggaXMgdGhlIG51bWJlciBvZiB0YWJzIG9yIHNwYWNlIGNoYXJhY3RlcnMgdXNlZCBmb3IgZm9ybWF0dGluZyBpbmRlbnRhdGlvbi4KLQotVG8gYXBwbHkgdGhlc2UgZm9ybWF0dGluZyBzdHlsZXMsIHJpZ2h0LWNsaWNrIGluIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgPGI+Rm9ybWF0ICZndDsgRG9jdW1lbnQ8L2I+LgotCi1JZiB0aGUgPGI+QXV0b21hdGljYWxseSBtYWtlIHN1Z2dlc3Rpb25zPC9iPiBjaGVjayBib3ggaXMgc2VsZWN0ZWQsIHlvdSBjYW4gc3BlY2lmeSB0aGF0IGNlcnRhaW4gY2hhcmFjdGVycyB3aWxsIGNhdXNlIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IHRvIHBvcCB1cCBhdXRvbWF0aWNhbGx5LiBTcGVjaWZ5IHRoZXNlIGNoYXJhY3RlcnMgaW4gdGhlIDxiPlByb21wdCB3aGVuIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGluc2VydGVkPC9iPiBmaWVsZC4KLQotSWYgeW91IHNlbGVjdCA8Yj5TdHJpY3Q8L2I+IGZyb20gdGhlIDxiPlN1Z2dlc3Rpb24gc3RyYXRlZ3k8L2I+IGxpc3QsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBzaG93biBmaXJzdCAod2l0aCBib2xkIGljb25zKSBpbiB0aGUgY29udGVudCBhc3Npc3QgbGlzdC4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGUgZWxlbWVudCBzY29wZSwgYnV0IG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIHNob3duIGJlbG93IHRoZW0gd2l0aCBhIGRlLWVtcGhhc2l6ZWQgaWNvbi4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgPGI+TGF4PC9iPi4KLQotSWYgYSBEVEQgb3Igc2NoZW1hIChvciBvdGhlciBtb2RlbCkgaXMgbm90IHNwZWNpZmllZCBmb3IgYW4gWE1MIGZpbGUsIHNlbGVjdGluZyA8Yj5Vc2UgaW5mZXJyZWQgZ3JhbW1hciBpbiBhYnNlbmNlIG9mIERURC9TY2hlbWE8L2I+IGFsbG93cyB0aGUgZWRpdG9yIHRvICJndWVzcyIgd2hhdCBlbGVtZW50cyBvciBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgYmFzZWQgb24gZXhpc3RpbmcgY29udGVudC48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbCIgbGFiZWw9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ3ZWJ4MDA2MiI+Ci08ZGVzY3JpcHRpb24+VGhpcyBwYWdlIGxldHMgeW91IGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZyB0aGF0IHRoZSBYTUwgZWRpdG9yIGRvZXMgd2hlbiB5b3UgYXJlIGVkaXRpbmcgYSBmaWxlLgotCi1UaGUgPGI+Q29udGVudCB0eXBlPC9iPiBmaWVsZCBjb250YWlucyBhIGxpc3Qgb2YgYWxsIHRoZSBzb3VyY2UgdHlwZXMgdGhhdCB5b3UgY2FuIHNlbGVjdCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gZWl0aGVyIHNlbGVjdCB0aGUgY29udGVudCB0eXBlIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoIGZyb20gdGhlIGRyb3AtZG93biBsaXN0LCBvciBjbGljayB0ZXh0IGluIHRoZSB0ZXh0IHNhbXBsZSB3aW5kb3cgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgY29udGVudCB0eXBlIGZvciB3aGljaCB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIHRleHQgaGlnaGxpZ2h0aW5nLgotCi1UaGUgPGI+Rm9yZWdyb3VuZDwvYj4gYW5kIDxiPkJhY2tncm91bmQ8L2I+IGJ1dHRvbnMgb3BlbiA8Yj5Db2xvcjwvYj4gZGlhbG9nIGJveGVzIHRoYXQgYWxsb3cgeW91IHRvIHNwZWNpZnkgdGV4dCBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycywgcmVzcGVjdGl2ZWx5LiBTZWxlY3QgdGhlIDxiPkJvbGQ8L2I+IGNoZWNrIGJveCB0byBtYWtlIHRoZSBzcGVjaWZpZWQgY29udGVudCB0eXBlIGFwcGVhciBpbiBib2xkLgotCi1DbGljayB0aGUgPGI+UmVzdG9yZSBEZWZhdWx0czwvYj4gYnV0dG9uIHRvIHNldCB0aGUgaGlnaGxpZ2h0aW5nIHN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBJZiB5b3Ugb25seSB3YW50IHRvIHJlc2V0IHRoZSB2YWx1ZSBmb3IgYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8Yj5Db250ZW50IHR5cGU8L2I+IGZpZWxkLCB0aGUgY2xpY2sgdGhlIDxiPlJlc3RvcmUgRGVmYXVsdDwvYj4gYnV0dG9uIG5leHQgdG8gaXQuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sIiBsYWJlbD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9IndlYngwMDYzIj4KLTxkZXNjcmlwdGlvbj5UaGlzIHBhZ2UgbGV0cyB5b3UgY3JlYXRlIG5ldyB0ZW1wbGF0ZXMgYW5kIGVkaXQgZXhpc3Rpbmcgb25lcyB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gZWRpdGluZyBhbiBYTUwgZmlsZS4gQSB0ZW1wbGF0ZSBpcyBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLgotCi1DbGljayA8Yj5OZXc8L2I+IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkgbmV3IHRlbXBsYXRlLgotCi1TdXBwbHkgYSBuZXcgdGVtcGxhdGUgPGI+TmFtZTwvYj4gYW5kIDxiPkRlc2NyaXB0aW9uPC9iPi4gVGhlIDxiPkNvbnRleHQ8L2I+IGZvciB0aGUgdGVtcGxhdGUgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwgbGlzdCB3aGVuIGNvbnRlbnQgYXNzaXN0IGlzIHJlcXVlc3RlZC4gU3BlY2lmeSB0aGUgPGI+UGF0dGVybjwvYj4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIHRhZ3MsIGF0dHJpYnV0ZXMsIG9yIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gYmUgaW5zZXJ0ZWQgYnkgY29udGVudCBhc3Npc3QuCi0KLUlmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPGI+SW5zZXJ0IFZhcmlhYmxlPC9iPiBidXR0b24gYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIEZvciBleGFtcGxlLCB0aGUgPGI+ZGF0ZTwvYj4gdmFyaWFibGUgaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4KLQotWW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUgUHJlZmVyZW5jZXMgcGFnZS4gSWYgeW91IGhhdmUgbW9kaWZpZWQgYSBkZWZhdWx0IHRlbXBsYXRlLCB5b3UgY2FuIHJlc3RvcmUgaXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUuIFlvdSBjYW4gYWxzbyByZXN0b3JlIGEgcmVtb3ZlZCB0ZW1wbGF0ZSBpZiB5b3UgaGF2ZSBub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC4KLQotSWYgeW91IGhhdmUgYSB0ZW1wbGF0ZSB0aGF0IHlvdSBkbyBub3Qgd2FudCB0byByZW1vdmUgYnV0IHlvdSBubyBsb25nZXIgd2FudCBpdCB0byBhcHBlYXIgaW4gdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QsIGNsZWFyIGl0cyBjaGVjayBib3ggaW4gdGhlIDxiPlRlbXBsYXRlczwvYj4gcHJlZmVyZW5jZXMgcGFnZS48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3bWFjcm8uaHRtbCIgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sbTEyMDAiPgotPGRlc2NyaXB0aW9uPkNsZWFudXAgb3B0aW9ucyBlbmFibGUgeW91IHRvIHVwZGF0ZSBhIGRvY3VtZW50IHNvIHRoYXQgaXQgaXMgd2VsbC1mb3JtZWQgYW5kIGNvbnNpc3RlbnRseSBmb3JtYXR0ZWQuCi0KLVRoZSBmb2xsb3dpbmcgY2xlYW51cCBvcHRpb25zIGNhbiBiZSBzZXQgdG8gb24gb3Igb2ZmLCBzbyB0aGF0IHlvdSBjYW4gbGltaXQgdGhlIHR5cGUgb2YgY2xlYW51cCBwZXJmb3JtZWQ6Ci0KLS0gPGI+Q29tcHJlc3MgZW1wdHkgZWxlbWVudCB0YWdzPC9iPjogQ29tcHJlc3MgZWxlbWVudCB0YWdzIHdpdGggbm8gY29udGVudCB0byBvbmUgdGFnIHdpdGggYW4gZW5kIHRhZyBkZWxpbWl0ZXIgKGllOiBjaGFuZ2UgJmx0O3RhZyZndDsmbHQ7L3RhZyZndDsgdG8gJmx0O3RhZy8mZ3Q7KS4KLQotLSA8Yj5JbnNlcnQgcmVxdWlyZWQgYXR0cmlidXRlczwvYj46IEluc2VydHMgYW55IG1pc3NpbmcgYXR0cmlidXRlcyB0aGF0IGFyZSByZXF1aXJlZCBieSB0aGUgdGFnIHRvIG1ha2UgdGhlIGVsZW1lbnQgb3IgZG9jdW1lbnQgd2VsbC1mb3JtZWQuCi0KLS0gPGI+SW5zZXJ0IG1pc3NpbmcgdGFnczwvYj46IENvbXBsZXRlcyBhbnkgbWlzc2luZyB0YWdzIChzdWNoIGFzIGFkZGluZyBhbiBlbmQgdGFnKSBuZWNlc3NhcnkgdG8gbWFrZSB0aGUgZWxlbWVudCBvciBkb2N1bWVudCB3ZWxsLWZvcm1lZC4KLQotLSA8Yj5RdW90ZSBhdHRyaWJ1dGUgdmFsdWVzPC9iPjogQXBwcm9wcmlhdGVseSBhZGRzIGRvdWJsZS0gb3Igc2luZ2xlLXF1b3RlcyBiZWZvcmUgYW5kIGFmdGVyIGF0dHJpYnV0ZSB2YWx1ZXMgaWYgdGhleSBhcmUgbWlzc2luZy4KLQotLSA8Yj5Gb3JtYXQgc291cmNlPC9iPjogRm9ybWF0cyB0aGUgZG9jdW1lbnQganVzdCBhcyB0aGUgPGI+Rm9ybWF0IERvY3VtZW50PC9iPiBjb250ZXh0IG1lbnUgb3B0aW9uIGRvZXMsIGltbWVkaWF0ZWx5IGFmdGVyIHBlcmZvcm1pbmcgYW55IG90aGVyIHNwZWNpZmllZCA8Yj5DbGVhbnVwPC9iPiBvcHRpb25zLgotCi0tIDxiPkNvbnZlcnQgbGluZSBkZWxpbWl0ZXJzIHRvPC9iPjogQ29udmVydHMgYWxsIGxpbmUgZGVsaW1pdGVycyBpbiB0aGUgZmlsZSB0byB0aGUgc2VsZWN0ZWQgb3BlcmF0aW5nIHN5c3RlbSdzIHR5cGUuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4Y3VpMDUwMCI+Ci08ZGVzY3JpcHRpb24+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgPGI+TmFtZTwvYj4gZmllbGQsIHRoZW4gZW50ZXIgdGhlIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUgaW4gdGhlIDxiPlZhbHVlPC9iPiBmaWVsZC4gQ2xpY2sgPGI+T0s8L2I+LiBUaGUgYXR0cmlidXRlIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpbGUuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4Y3VpMDAxMCI+Ci08ZGVzY3JpcHRpb24+VGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gdXNlIHRoZSA8Yj5QdWJsaWMgSUQ8L2I+IGZpZWxkIHRvIGNyZWF0ZSBhbiBhc3NvY2lhdGlvbiB1c2luZyBhbiBYTUwgQ2F0YWxvZyBlbnRyeSBvciB0aGUgPGI+U3lzdGVtIElEPC9iPiBmaWVsZCB0byBjcmVhdGUgYW4gYXNzb2NpYXRpb24gdXNpbmcgYSBmaWxlIGluIHRoZSB3b3JrYmVuY2guPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTAwMjAiPgotPGRlc2NyaXB0aW9uPlRoaXMgc2hvdWxkIG1hdGNoIHRoZSBuYW1lIG9mIHlvdXIgWE1MIGZpbGUncyByb290IGVsZW1lbnQuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTAwMzAiPgotPGRlc2NyaXB0aW9uPlRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlzIHRoZSBQdWJsaWMgSWRlbnRpZmllci4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlIFhNTCBmaWxlICh1c2luZyBhbiBYTUwgY2F0YWxvZyBlbnRyeSkgd2l0aCBhIERURCBmaWxlIGJ5IHByb3ZpZGluZyBhIGhpbnQgdG8gdGhlIFhNTCBwcm9jZXNzb3IuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwiIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTAwNTAiPgotPGRlc2NyaXB0aW9uPlRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlzIHRoZSBEVEQgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gWW91IGNhbiBjaGFuZ2UgdGhlIERURCB0aGUgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYnkgZWRpdGluZyB0aGlzIGZpZWxkLiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHRyeSB0byB1c2UgdGhlIFB1YmxpYyBJRCB0byBsb2NhdGUgdGhlIERURCwgYW5kIGlmIHRoaXMgZmFpbHMsIGl0IHdpbGwgdXNlIHRoZSBTeXN0ZW0gSUQgdG8gZmluZCBpdC48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuaHRtbCIgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4Y3VpMDYwMCI+Ci08ZGVzY3JpcHRpb24+RW50ZXIgdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIDxiPkVsZW1lbnQgbmFtZTwvYj4gZmllbGQsIHRoZW4gY2xpY2sgPGI+T0s8L2I+LiBUaGUgZWxlbWVudCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBmaWxlLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbCIgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ii8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTAzMDAiPgotPGRlc2NyaXB0aW9uPkEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpcyBhIHN5bnRheCBpbiBYTUwgZm9yIHBhc3NpbmcgaW5zdHJ1Y3Rpb25zIGFsb25nIHRvIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQuIFRoZSA8Yj5UYXJnZXQ8L2I+IGZpZWxkIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlIGFwcGxpY2F0aW9uIHRoZSBpbnN0cnVjdGlvbnMgYmVsb25ncyB0by4gVGhlIDxiPkRhdGE8L2I+IGZpZWxkIGNvbnRhaW5zIHRoZSBpbnN0cnVjdGlvbnMuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJvYy5odG1sIiBsYWJlbD0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4Y3VpMDEwMCI+Ci08ZGVzY3JpcHRpb24+VGhpcyBpcyBhIHJlYWQtb25seSBkaWFsb2cuIFNlbGVjdCB0aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPGI+RWRpdDwvYj4uPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIiBsYWJlbD0iRWRpdGluZyB5b3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhjdWkwMjAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgdmFsdWUgaW4gdGhlIDxiPk5hbWVzcGFjZSBOYW1lPC9iPiBmaWVsZCBpcyB0aGUgbmFtZXNwYWNlIHRoZSBYTUwgZmlsZSBiZWxvbmdzIHRvLgotCi1BbGwgcXVhbGlmaWVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDxiPlByZWZpeDwvYj4gdmFsdWUuCi0KLVRoZSA8Yj5Mb2NhdGlvbiBIaW50PC9iPiBmaWVsZCBjb250YWlucyB0aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWEgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gQW4gWE1MIENhdGFsb2cgSUQgb3IgYSBVUkkgY2FuIGJlIHNwZWNpZmllZCBpbiB0aGlzIGZpZWxkLiBZb3UgY2FuIHNlYXJjaCBmb3IgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byB1c2UgYnkgY2xpY2tpbmcgPGI+QnJvd3NlPC9iPi4gT25jZSB5b3Ugc2VsZWN0IGEgZmlsZSwgdGhlIDxiPk5hbWVzcGFjZSBOYW1lPC9iPiBhbmQgPGI+UHJlZml4PC9iPiBmaWVsZHMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGZpbGxlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZnJvbSB0aGUgc2NoZW1hICh5b3UgbXVzdCBsZWF2ZSB0aGUgZmllbGRzIGJsYW5rIGZvciB0aGlzIHRvIG9jY3VyKS4gPGI+Tm90ZTwvYj46IElmIHlvdSBhcmUgY3JlYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hLCB5b3UgY2Fubm90IGNoYW5nZSB0aGUgPGI+TmFtZXNwYWNlIE5hbWU8L2I+IG9yIDxiPkxvY2F0aW9uIEhpbnQ8L2I+IHZhbHVlcy48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIHlvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieGN1aTA0MDAiPgotPGRlc2NyaXB0aW9uPkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIFVSSSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gU2VsZWN0IHRoZSBjYXRhbG9nIGVudHJ5IHlvdSB3YW50IHRvIGFzc29jaWF0ZSB5b3VyIFhNTCBmaWxlIHdpdGguPC9kZXNjcmlwdGlvbj4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0czIueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvRWRpdG9yWG1sQ29udGV4dHMyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYmFiNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9FZGl0b3JYbWxDb250ZXh0czIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxjb250ZXh0cz4KLTxjb250ZXh0IGlkPSJjc2hfb3V0ZXJfY29udGFpbmVyIj4KLTxkZXNjcmlwdGlvbi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sX3NvdXJjZV9IZWxwSWQiPgotPGRlc2NyaXB0aW9uPlRoZSBYTUwgc291cmNlIHZpZXcgbGV0cyB5b3UgZWRpdCBhIGZpbGUgdGhhdCBpcyBjb2RlZCBpbiB0aGUgRXh0ZW5zaWJsZSBNYXJrdXAgTGFuZ3VhZ2UuIFRoZSBlZGl0b3IgcHJvdmlkZXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QsIHVzZXItZGVmaW5lZCB0ZW1wbGF0ZXMsIHN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvIGFuZCByZWRvLCBlbGVtZW50IHNlbGVjdGlvbiBhbmQgZm9ybWF0dGluZywgYW5kIGRvY3VtZW50IGZvcm1hdHRpbmcuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdHNyYy5odG1sIiBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciLz4KLTwvY29udGV4dD4KLTwvY29udGV4dHM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvTUVUQS1JTkYvTUFOSUZFU1QuTUYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkZjA3OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9NRVRBLUlORi9NQU5JRkVTVC5NRgorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotTWFuaWZlc3QtVmVyc2lvbjogMS4wCi1CdW5kbGUtTWFuaWZlc3RWZXJzaW9uOiAyCi1CdW5kbGUtTmFtZTogJXBsdWdpbk5hbWUKLUJ1bmRsZS1TeW1ib2xpY05hbWU6IG9yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcDsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjEucXVhbGlmaWVyCi1CdW5kbGUtVmVuZG9yOiAlcGx1Z2luUHJvdmlkZXIKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvVGFibGVUcmVlLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL1RhYmxlVHJlZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2M2ZTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvVGFibGVUcmVlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P05MUyB0eXBlPSJvcmcuZWNsaXBzZS5oZWxwLmNvbnRleHRzIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci0gCi08Y29udGV4dHM+Ci08Y29udGV4dCBpZD0iY3NoX291dGVyX2NvbnRhaW5lciI+Ci08ZGVzY3JpcHRpb24vPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbG0zMDAwIj4KLTxkZXNjcmlwdGlvbj5UaGUgRGVzaWduIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IgcmVwcmVzZW50cyB5b3VyIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLCB3aGljaCBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBEZXBlbmRpbmcgb24gdGhlIGtpbmQgb2YgZmlsZSB5b3UgYXJlIHdvcmtpbmcgd2l0aCwgY29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBsb2NhdGlvbi48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIvPgotPC9jb250ZXh0PgotPC9jb250ZXh0cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YTUxXaXphcmRDb250ZXh0cy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9YTUxXaXphcmRDb250ZXh0cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlNzgxYzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvWE1MV2l6YXJkQ29udGV4dHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/TkxTIHR5cGU9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLQotPGNvbnRleHRzPgotPGNvbnRleHQgaWQ9ImNzaF9vdXRlcl9jb250YWluZXIiPgotPGRlc2NyaXB0aW9uLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4bWxjMDEwMSI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSA8Yj5DcmVhdGUgWE1MIGZpbGUgZnJvbSBhIERURCBmaWxlPC9iPiByYWRpbyBidXR0b24gdG8gY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZS4gVGhlIGZpbGUgd2lsbCBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQsIHBvcHVsYXRlZCB3aXRoIGFueSByZXF1aXJlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4bWxjMDEwMiI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSA8Yj5DcmVhdGUgWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hIGZpbGU8L2I+IHJhZGlvIGJ1dHRvbiB0byBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hLiBUaGUgZmlsZSB3aWxsIGNvbnRhaW4gdGhlIHNlbGVjdGVkIHJvb3QgZWxlbWVudCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgYW55IGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXMgaXQgY29udGFpbnMuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbGMwMTAzIj4KLTxkZXNjcmlwdGlvbj5TZWxlY3QgdGhlIDxiPkNyZWF0ZSBYTUwgZmlsZSBmcm9tIHNjcmF0Y2g8L2I+IHJhZGlvIGJ1dHRvbiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYW4gWE1MIGZpbGUgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgWE1MIHNjaGVtYSBvciBEVEQgZmlsZS48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmh0bWwiIGxhYmVsPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4bWxjMDUwMCI+Ci08ZGVzY3JpcHRpb24+U2VsZWN0IHRoZSA8Yj5TZWxlY3QgZmlsZSBmcm9tIHdvcmtiZW5jaDwvYj4gcmFkaW8gYnV0dG9uIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSB5b3VyIFhNTCBmaWxlIGZyb20gYSBEVEQgb3IgWE1MIHNjaGVtYSB0aGF0IGlzIGluIHRoZSB3b3JrYmVuY2guCi0KLVNlbGVjdCB0aGUgPGI+U2VsZWN0IFhNTCBDYXRhbG9nIGVudHJ5PC9iPiByYWRpbyBidXR0b24gaWYgeW91IHdhbnQgdG8gdXNlIGEgZmlsZSBsaXN0ZWQgaW4gdGhlIFhNTCBDYXRhbG9nIHRvIGNyZWF0ZSB5b3VyIFhNTCBmaWxlLjwvZGVzY3JpcHRpb24+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sYzA0MTAiPgotPGRlc2NyaXB0aW9uPlRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXIgZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgRFREIG9yIGFsbCBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBpbiB0aGUgWE1MIHNjaGVtYSBhcmUgaW5jbHVkZWQgaW4gdGhpcyBsaXN0LgotCi08Yj5Ob3RlPC9iPjogSWYgeW91IGRvIG5vdCBoYXZlIGFueSBlbGVtZW50cyBpbiB5b3VyIERURCBvciBhbnkgZ2xvYmFsIGVsZW1lbnRzIGluIHlvdXIgWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBpdC48L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbGMwNDQxIj4KLTxkZXNjcmlwdGlvbj5JZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCBib3RoIG1hbmRhdG9yeSBhbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC4gSWYgeW91IGRvIG5vdCBzZWxlY3QgaXQsIG9ubHkgbWFuZGF0b3J5IGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIi8+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXMiLz4KLTwvY29udGV4dD4KLTxjb250ZXh0IGlkPSJ4bWxjMDQ0MiI+Ci08ZGVzY3JpcHRpb24+SWYgeW91IHNlbGVjdCB0aGlzIGNoZWNrIGJveCwgYm90aCB0aGUgbWFuZGF0b3J5IGFuZCBvcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC4gSWYgeW91IGRvIG5vdCBzZWxlY3QgaXQsIG9ubHkgbWFuZGF0b3J5IGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sYzA0NDMiPgotPGRlc2NyaXB0aW9uPklmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIHRoZSBmaXJzdCBjaG9pY2Ugb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS4KLQotRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIHRoZSBmb2xsb3dpbmcgY29kZSBpbiB5b3VyIHNvdXJjZSBmaWxlOgotCi08Yj4mbHQ7Y2hvaWNlJmd0OyAmbHQ7ZWxlbWVudCBuYW1lPSJhIiB0eXBlPSJzdHJpbmcmZ3Q7ICZsdDtlbGVtZW50IG5hbWU9ImIiIHR5cGU9ImludGVnZXImZ3Q7ICZsdDsvY2hvaWNlJmd0OzwvYj4gCi0KLWFuZCB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCBhbiBlbGVtZW50IHN1Y2ggYXMgdGhlIGZvbGxvd2luZyB3aWxsIGJlIGNyZWF0ZWQgaW4geW91ciBYTUwgZmlsZToKLQotPGI+Jmx0O2EmZ3Q7aGVsbG8mbHQ7L2EmZ3Q7PC9iPiA8L2Rlc2NyaXB0aW9uPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmh0bWwiIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiLz4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIvPgotPC9jb250ZXh0PgotPGNvbnRleHQgaWQ9InhtbGMwNDQ0Ij4KLTxkZXNjcmlwdGlvbj5JZiB5b3Ugc2VsZWN0IHRoaXMgY2hlY2sgYm94LCBhbnkgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEsIHN1Y2ggYXMgPGI+Jmx0O3RleHQmZ3Q7RW1wdHlUZXh0Jmx0Oy90ZXh0Jmd0Oy48L2I+IE90aGVyd2lzZSwgdGhleSB3aWxsIGJlIGVtcHR5IC0gdGhhdCBpcywgPGI+Jmx0O3RleHQmZ3Q7Jmx0Oy90ZXh0Jmd0Oy48L2I+IDwvZGVzY3JpcHRpb24+Ci08dG9waWMgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbCIgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIvPgotPHRvcGljIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmh0bWwiIGxhYmVsPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sYzAyMTAiPgotPGRlc2NyaXB0aW9uPlRoZSBTeXN0ZW0gSUQgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIFVSSSAocGh5c2ljYWwgbG9jYXRpb24pIG9mIHRoZSBEVEQgZmlsZS4gVGhlIFB1YmxpYyBJRCB2YWx1ZSBjYW4gcmVmZXIgdG8gYSBEVEQgZW50cnkgaW4gYW4gWE1MIENhdGFsb2cuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIi8+Ci08L2NvbnRleHQ+Ci08Y29udGV4dCBpZD0ieG1sYzAyMjAiPgotPGRlc2NyaXB0aW9uPlRoZSBTeXN0ZW0gSUQgdmFsdWUgY29ycmVzcG9uZHMgdG8gdGhlIFVSSSAocGh5c2ljYWwgbG9jYXRpb24pIG9mIHRoZSBEVEQgZmlsZS4gVGhlIFB1YmxpYyBJRCB2YWx1ZSBjYW4gcmVmZXIgdG8gYSBEVEQgZW50cnkgaW4gYW4gWE1MIENhdGFsb2cuPC9kZXNjcmlwdGlvbj4KLTx0b3BpYyBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIiBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzIi8+Ci08L2NvbnRleHQ+Ci08L2NvbnRleHRzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbC51aS5pbmZvcG9wL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlhOTY5Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBNRVRBLUlORi8sXAotICAgICAgICAgICAgICAgRWRpdG9yWG1sQ29udGV4dHMueG1sLFwKLSAgICAgICAgICAgICAgIEVkaXRvclhtbENvbnRleHRzMi54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBwbHVnaW4ucHJvcGVydGllcyxcCi0gICAgICAgICAgICAgICBwbHVnaW4ueG1sCi1zcmMuaW5jbHVkZXMgPSBYTUxXaXphcmRDb250ZXh0cy54bWwsXAotICAgICAgICAgICAgICAgVGFibGVUcmVlLnhtbApkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNWY5NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXBsdWdpbk5hbWUgICAgID0gWE1MIGluZm9wb3BzCi1wbHVnaW5Qcm92aWRlciA9IEVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AvcGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4N2M4NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWwudWkuaW5mb3BvcC9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjEiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuY29udGV4dHMiPgotICAgICAgIDxjb250ZXh0cyBmaWxlPSJFZGl0b3JYbWxDb250ZXh0cy54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iRWRpdG9yWG1sQ29udGV4dHMyLnhtbCIgcGx1Z2luID0ib3JnLmVjbGlwc2UuY29yZS5ydW50aW1lIi8+Ci0gICAgICAgPGNvbnRleHRzIGZpbGU9IlRhYmxlVHJlZS54bWwiIHBsdWdpbiA9Im9yZy5lY2xpcHNlLndzdC54bWwudWkiLz4KLSAgICAgICA8Y29udGV4dHMgZmlsZT0iWE1MV2l6YXJkQ29udGV4dHMueG1sIiBwbHVnaW4gPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpIi8+Ci0KLTwvZXh0ZW5zaW9uPgotCi0KLTwvcGx1Z2luPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uY3ZzaWdub3JlIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MzI5OGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlcl8xLjAuMC5qYXIKLWJhawotdGVtcAotRGl0YUxpbmsuY2F0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTMzYWY2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2MGQyYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVwbHVnaW5OYW1lCi1CdW5kbGUtU3ltYm9saWNOYW1lOiBvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyOyBzaW5nbGV0b246PXRydWUKLUJ1bmRsZS1WZXJzaW9uOiAxLjAuMjAzLnF1YWxpZmllcgotQnVuZGxlLVZlbmRvcjogJXBsdWdpblByb3ZpZGVyCi1CdW5kbGUtTG9jYWxpemF0aW9uOiBwbHVnaW4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZWE0MmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLmRpdGFtYXAKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIiAibWFwLmR0ZCI+DQotPG1hcCBjb2xsZWN0aW9uLXR5cGU9InNlcXVlbmNlIiB0aXRsZT0iRGV2ZWxvcGluZyBYTUwgZmlsZXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3dvcmtYTUwuZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgZmlsZXMiPjw/UHViIENhcmV0MT8+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jY3JlYXR4bS5kaXRhIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgWE1MIGZpbGVzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0eG1sLmRpdGEiIGlkPSJ4bWxjcmV0eG1sIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YSIgbmF2dGl0bGU9IkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3IiDQotdG9jPSJubyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jd3htbGVkdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGVkaXRvciI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eHByZWZzLmRpdGEiIG5hdnRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R0YWdoaWx0LmRpdGEiIGlkPSJ0YWdoaWx0IiBuYXZ0aXRsZT0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRlbmMuZGl0YSIgbmF2dGl0bGU9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxlbmMuZGl0YSIgbmF2dGl0bGU9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RzdWdzdHJhdC5kaXRhIiBuYXZ0aXRsZT0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgaWQ9InR4ZWR0ZGVzIiBsaW5raW5nPSJub25lIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5kaXRhIiBpZD0idGVkdGRvYyIgbmF2dGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NoLmRpdGEiIGlkPSJ0ZWR0c2NoIiBuYXZ0aXRsZT0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBpZD0idGVkdHByb2MiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgaWQ9InR4ZWRzcmMiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NkYXN0LmRpdGEiIG5hdnRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d21hY3JvLmRpdGEiIGlkPSJ0d21hY3JvIiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIGlkPSJ0ZWR0Y250IiBuYXZ0aXRsZT0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhzaXR5cC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgeHNpOnR5cGUiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9yZXh0Y3RuLmRpdGEiIGlkPSJyZXh0Y3RuIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuZGl0YSIgaWQ9InhtbHZhbGlkIiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBYTUwgZmlsZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIGxpbmtpbmc9Im5vbmUiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eG1sY2F0LmRpdGEiIGlkPSJ0eG1sY2F0IiBuYXZ0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uZGl0YSIgaWQ9InRlZHRncmFtIiBuYXZ0aXRsZT0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuZGl0YSIgaWQ9InJpY29ucyIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L21hcD4NCi08P1B1YiAqMDAwMDAwMzE0Mz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVybWFwX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhNGRhMTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJtYXBfdG9jLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci0KLTx0b2MgbGFiZWw9IkRldmVsb3BpbmcgWE1MIGZpbGVzIiB0b3BpYz0idG9waWNzL2N3b3JrWE1MLmh0bWwiPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvY3dvcmtYTUwuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL2NjcmVhdHhtLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90Y3JldHhtbC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjcmV4eHNkLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3R4cHJlZnMuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIGhyZWY9InRvcGljcy90dGFnaGlsdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIiBocmVmPSJ0b3BpY3MvdGVkdGVuYy5odG1sIj4KLTx0b3BpYyBsYWJlbD0iWE1MIGFuZCBIVE1MIGVuY29kaW5ncyIgaHJlZj0idG9waWNzL2N4bWxlbmMuaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90c3Vnc3RyYXQuaHRtbCIvPgotPC90b3BpYz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCI+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiPgotPHRvcGljIGxhYmVsPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiIGhyZWY9InRvcGljcy90d2NkYXN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwiLz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgeHNpOnR5cGUiIGhyZWY9InRvcGljcy90eHNpdHlwLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlcyIgaHJlZj0idG9waWNzL3JleHRjdG4uaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90d3h2YWxpZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCIvPgotPC90b3BpYz4KLTx0b3BpYyBsYWJlbD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuaHRtbCIvPgotPC90b3BpYz4KLTwvdG9jPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9YTUxCdWlsZGVycmVsLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0ZGRiN2MuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIG1hcCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBNYXAvL0VOIiAibWFwLmR0ZCI+DQotPG1hcD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+PD9QdWIgQ2FyZXQxPz4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV0eG1sLmRpdGEiIGlkPSJ4bWxjcmV0eG1sIiBuYXZ0aXRsZT0iQ3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuZGl0YSIgbmF2dGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3eG1sZWR0LmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0ZG9jLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5kaXRhIiBpZD0idHhtbGNhdCIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRncmFtLmRpdGEiIGlkPSJ0ZWR0Z3JhbSIgbmF2dGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sY2F0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRjbnN0LmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NoLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRncmFtLmRpdGEiIG5hdnRpdGxlPSJVcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiIGxpbmtpbmc9Im5vcm1hbCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBpZD0idGVkdHByb2MiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxjYXQuZGl0YSIgbmF2dGl0bGU9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSIgbGlua2luZz0ibm9ybWFsIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3eG1sZWR0LmRpdGEiIG5hdnRpdGxlPSJYTUwgZWRpdG9yIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbGNhdC5kaXRhIiBuYXZ0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5IiBsaW5raW5nPSJub3JtYWwiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuZGl0YSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIGZpbGVzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuZGl0YSIgbmF2dGl0bGU9IlhNTCBlZGl0b3IiPjwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjcmV4eHNkLmRpdGEiIG5hdnRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuZGl0YSINCi1saW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIG5hbWVzcGFjZXMiIHNjb3BlPSJwZWVyIj48L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NoLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0iLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEiDQotbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBuYW1lc3BhY2VzIiBzY29wZT0icGVlciI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgaWQ9InR4ZWRzcmMiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R3Y2Rhc3QuZGl0YSIgbmF2dGl0bGU9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdtYWNyby5kaXRhIiBuYXZ0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R0YWdoaWx0LmRpdGEiIG5hdnRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d2NkYXN0LmRpdGEiIG5hdnRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90d21hY3JvLmRpdGEiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5kaXRhIiBuYXZ0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0LmRpdGEiIG5hdnRpdGxlPSJYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRkb2MuZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2guZGl0YSIgbmF2dGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90eGVkdGRlcy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJvYy5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmRpdGEiIG5hdnRpdGxlPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3J4bWxiaWNvbnMuZGl0YSIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTwvbWFwPg0KLTw/UHViICowMDAwMDA2MDAyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcnJlbC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvWE1MQnVpbGRlcnJlbC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2ODczNzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL1hNTEJ1aWxkZXJyZWwueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyB0b3BpYz0idG9waWNzL3RjcmV0eG1sLmh0bWwiPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBlbXB0eSBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90Y3JldHhtbC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjcmV4eHNkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgZmlsZXMiIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBlZGl0b3IiIGhyZWY9InRvcGljcy9jd3htbGVkdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIGZpbGVzIiBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIGhyZWY9InRvcGljcy90eGVkdHNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciIGhyZWY9InRvcGljcy90eG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXMiIGhyZWY9InRvcGljcy90ZWR0Z3JhbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIiBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIgaHJlZj0idG9waWNzL3R3eHZhbGlkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIGVkaXRvciIgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iR2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjcmV4eHNkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIG5hbWVzcGFjZXMiIGhyZWY9Ii4uL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBuYW1lc3BhY2VzIiBocmVmPSIuLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgaHJlZj0idG9waWNzL3R0YWdoaWx0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0IiBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIiBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJTZXR0aW5nIHRoZSBYTUwgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdCIgaHJlZj0idG9waWNzL3RzdWdzdHJhdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiIgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgaHJlZj0idG9waWNzL3R4ZWR0ZGVzLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3IiBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJJY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yIiBocmVmPSJ0b3BpY3MvcnhtbGJpY29ucy5odG1sIi8+Ci08L3RvYz4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlYzU5ODkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08SFRNTD4KLQotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotCi08Qk9EWSBsYW5nPSJFTi1VUyI+Ci0KLTxIMz5BYm91dCBUaGlzIENvbnRlbnQ8L0gzPgotCi08UD5NYXkgMiwgMjAwNjwvUD4KLQotPEgzPkxpY2Vuc2U8L0gzPgotCi08UD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gCi0oIkNvbnRlbnQiKS4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSAKLXVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAKLSgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdAotPEEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZXBsLXYxMC5waHA8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLQotPFA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgCi1Db250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoIlJlZGlzdHJpYnV0b3IiKSBhbmQgZGlmZmVyZW50IAotdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5IGFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gCi1DaGVjayB0aGUgUmVkaXN0cmlidXRvcpJzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gSWYgbm8gc3VjaCAKLWxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIAotdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQgCi1hbmQgc3VjaCBzb3VyY2UgY29kZSBtYXkgYmUgb2J0YWluZWQgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnLzwvQT4uPC9QPgotCi08L0JPRFk+Ci08L0hUTUw+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzZiN2E5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBYTUxCdWlsZGVybWFwX3RvYy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBpbWFnZXMvLFwKLSAgICAgICAgICAgICAgIHBsdWdpbi5wcm9wZXJ0aWVzLFwKLSAgICAgICAgICAgICAgIG9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjA4NzJjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY2RhdGFzZWN0aW9uLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjMGRlNS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2NvbW1lbnRfb2JqLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGMyY2NiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvY29tbWVudF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZG9jdHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMDBmODIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9kb2N0eXBlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL2V4cGFuZF9hbGwuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTJjMTRmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvZXhwYW5kX2FsbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uYXR0cmliLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVhOTk3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25hdHRyaWIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9uZWxlbS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhYmRkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL25lbGVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvbnJzdHJ2YWwuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NDJiOGMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ucnN0cnZhbC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3Byb2luc3Rfb2JqLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQzNmQ4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcHJvaW5zdF9vYmouZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvcmxkZ3Jtci5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWNhYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9ybGRncm1yLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL3N1Z2dlc3Rpb24uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGVhODQ5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9pbWFnZXMvc3VnZ2VzdGlvbi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwM2M3Ni4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvbXlwbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9IlhNTEJ1aWxkZXJtYXBfdG9jLnhtbCIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotPGV4dGVuc2lvbgotICAgICAgICBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICAgIDxpbmRleCBmaWxlPSJvcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIi8+ICAgICAKLSAgPC9leHRlbnNpb24+Ci0gIAotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzQ0ODcxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIGh0bWwKLSAgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9InNlY3VyaXR5IiBjb250ZW50PSJwdWJsaWMiIC8+Ci08bWV0YSBuYW1lPSJSb2JvdHMiIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgbmFtZT0iREMuRm9ybWF0IiBjb250ZW50PSJYSFRNTCIgLz4KLTwhLS0gQWxsIHJpZ2h0cyByZXNlcnZlZC4gTGljZW5zZWQgTWF0ZXJpYWxzIFByb3BlcnR5IG9mIElCTSAtLT4KLTwhLS0gVVMgR292ZXJubWVudCBVc2VycyBSZXN0cmljdGVkIFJpZ2h0cyAtLT4KLTwhLS0gVXNlLCBkdXBsaWNhdGlvbiBvciBkaXNjbG9zdXJlIHJlc3RyaWN0ZWQgYnkgLS0+Ci08IS0tIEdTQSBBRFAgU2NoZWR1bGUgQ29udHJhY3Qgd2l0aCBJQk0gQ29ycC4gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJpYm1kaXRhLmNzcyIgLz4KLTxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9InN3Z19pbmZvX2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+SW5kZXg8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+SW5kZXg8L2gxPgotPGEgbmFtZT0iSURYMF80NSIgaHJlZj0iI0lEWDFfNDUiPkU8L2E+Ci08YSBuYW1lPSJJRFgwXzU4IiBocmVmPSIjSURYMV81OCI+WDwvYT4KLTxocj48L2hyPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ1IiBocmVmPSIjSURYMF80NSI+RTwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5FbmNvZGluZ3MKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3htbGVuYy5odG1sI2N4bWxlbmMiPkhUTUw8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9jeG1sZW5jLmh0bWwjY3htbGVuYyI+WE1MPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81OCIgaHJlZj0iI0lEWDBfNTgiPlg8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+WE1MIGNhdGFsb2cKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sI3R4bWxjYXQiPmFkZGluZyBlbnRyaWVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sI3R4bWxjYXQiPmV4cG9ydGluZyBlbnRyaWVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sI3R4bWxjYXQiPmltcG9ydGluZyBlbnRyaWVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlhNTCBlZGl0b3IKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sI3R3Y2Rhc3QiPmNvbnRlbnQgYXNzaXN0PC9hPgotPC9saT4KLTxsaT5ET0NUWVBFIGRlY2xhcmF0aW9ucwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwjdGVkdGRvYyI+ZWRpdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCN0eGVkdHRhZyI+ZWRpdGluZzwvYT4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sI3R3Y2Rhc3QiPmNvbnRlbnQgYXNzaXN0PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiPkRPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhlZHRkZXMuaHRtbCN0eGVkdGRlcyI+aW4gdGhlIERlc2lnbiB2aWV3PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhlZHRzcmMuaHRtbCN0eGVkdHNyYyI+aW4gdGhlIFNvdXJjZSB2aWV3PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sI3RlZHRzY2giPm5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwjdGVkdHByb2MiPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCN0ZWR0Y25zdCI+d2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnhtbGJpY29ucy5odG1sI3JpY29ucyI+aWNvbnM8L2E+Ci08L2xpPgotPGxpPm5hbWVzcGFjZSBpbmZvcm1hdGlvbgotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCI+ZWRpdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3d4bWxlZHQuaHRtbCNjd3htbGVkdCI+b3ZlcnZpZXc8L2E+Ci08L2xpPgotPGxpPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwjdGVkdHByb2MiPmVkaXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+c2V0dGluZwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwjdHhwcmVmcyI+Y29udGVudCBhc3Npc3QgcnVsZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwjdHhwcmVmcyI+aW5kZW50YXRpb24gc3R5bGU8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwjdHhwcmVmcyI+bGluZSB3cmFwcGluZyBydWxlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RzdWdzdHJhdC5odG1sI3htbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSI+c291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3k8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R0YWdoaWx0Lmh0bWwjdHRhZ2hpbHQiPnNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2E+Ci08L2xpPgotPGxpPnVwZGF0aW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwjdGVkdGdyYW0iPlhNTCBmaWxlcyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCN0eGVkdHRhZyI+WE1MIGZpbGVzPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPlhNTCBmaWxlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9jeG1sY2F0Lmh0bWwjY3htbGNhdCI+YXNzb2NpYXRpbmcgd2l0aCBEVERzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiPmFzc29jaWF0aW5nIHdpdGggWE1MIHNjaGVtYXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90Y3JldHhtbC5odG1sI3RjcmV0eG1sIj5jcmVhdGluZzwvYT4KLTwvbGk+Ci08bGk+RE9DVFlQRSBkZWNsYXJhdGlvbnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdGRvYy5odG1sI3RlZHRkb2MiPmVkaXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciPmVkaXRpbmc8L2E+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0Ij5jb250ZW50IGFzc2lzdDwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCN0ZWR0ZG9jIj5ET0NUWVBFIGRlY2xhcmF0aW9uczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCN0ZWR0c2NoIj5uYW1lc3BhY2UgaW5mb3JtYXRpb248L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIj5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwjdGVkdGNuc3QiPndpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RjcmV4ZHRkLmh0bWwjdGNyZXhkdGQiPmdlbmVyYXRpbmcgZnJvbSBEVERzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGNyZXh4c2QuaHRtbCN0Y3JleHhzZCI+Z2VuZXJhdGluZyBmcm9tIFhNTCBzY2hlbWFzPC9hPgotPC9saT4KLTxsaT5uYW1lc3BhY2UgaW5mb3JtYXRpb24KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHNjaC5odG1sI3RlZHRzY2giPmVkaXRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGVkdHByb2MuaHRtbCN0ZWR0cHJvYyI+ZWRpdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5zcGVjaWZ5aW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCN0ZWR0ZW5jIj5lbmNvZGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRlbmMuaHRtbCN0ZWR0ZW5jIj5saW5lIGRlbGltaXRlcnM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRncmFtLmh0bWwjdGVkdGdyYW0iPnVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHd4dmFsaWQuaHRtbCN0d3h2YWxpZCI+dmFsaWRhdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5YTUwgdGVtcGxhdGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIj5jcmVhdGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIj5lZGl0aW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iPmV4cG9ydGluZzwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIj5pbXBvcnRpbmc8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyI+cmVtb3Zpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08L3VsPgotPC9ib2R5PjwvaHRtbD4KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MWE1N2QuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxpbmRleD4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNyZWF0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXR4bWwuaHRtbCN0Y3JldHhtbCIgdGl0bGU9IkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZnJvbSBEVERzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGNyZXhkdGQuaHRtbCN0Y3JleGR0ZCIgdGl0bGU9IkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjcmV4eHNkLmh0bWwjdGNyZXh4c2QiIHRpdGxlPSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0dGFnLmh0bWwjdHhlZHR0YWciIHRpdGxlPSJFZGl0aW5nIFhNTCBmaWxlcyIvPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwjdGVkdGRvYyIgdGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ibmFtZXNwYWNlIGluZm9ybWF0aW9uIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCIgdGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9InByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIiB0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBhc3Npc3QiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9IndpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRjbnN0Lmh0bWwjdGVkdGNuc3QiIHRpdGxlPSJFZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic3BlY2lmeWluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ibGluZSBkZWxpbWl0ZXJzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0ZW5jLmh0bWwjdGVkdGVuYyIgdGl0bGU9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImVuY29kaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0ZW5jLmh0bWwjdGVkdGVuYyIgdGl0bGU9IlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IkRPQ1RZUEUgZGVjbGFyYXRpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0ZG9jLmh0bWwjdGVkdGRvYyIgdGl0bGU9IkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ibmFtZXNwYWNlIGluZm9ybWF0aW9uIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0c2NoLmh0bWwjdGVkdHNjaCIgdGl0bGU9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90ZWR0cHJvYy5odG1sI3RlZHRwcm9jIiB0aXRsZT0iRWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3eHZhbGlkLmh0bWwjdHd4dmFsaWQiIHRpdGxlPSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFzc29jaWF0aW5nIHdpdGggRFREcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxjYXQuaHRtbCNjeG1sY2F0IiB0aXRsZT0iWE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhc3NvY2lhdGluZyB3aXRoIFhNTCBzY2hlbWFzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiIHRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCN0ZWR0Z3JhbSIgdGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBlZGl0b3IiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhlZHR0YWcuaHRtbCN0eGVkdHRhZyIgdGl0bGU9IkVkaXRpbmcgWE1MIGZpbGVzIi8+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iaW4gdGhlIERlc2lnbiB2aWV3Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdGRlcy5odG1sI3R4ZWR0ZGVzIiB0aXRsZT0iRWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXciLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iRE9DVFlQRSBkZWNsYXJhdGlvbnMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCN0ZWR0ZG9jIiB0aXRsZT0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJuYW1lc3BhY2UgaW5mb3JtYXRpb24iPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCN0ZWR0c2NoIiB0aXRsZT0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0icHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwjdGVkdHByb2MiIHRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJpbiB0aGUgU291cmNlIHZpZXciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4ZWR0c3JjLmh0bWwjdHhlZHRzcmMiIHRpdGxlPSJFZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdjZGFzdC5odG1sI3R3Y2Rhc3QiIHRpdGxlPSJVc2luZyBYTUwgY29udGVudCBhc3Npc3QiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0id2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGNuc3QuaHRtbCN0ZWR0Y25zdCIgdGl0bGU9IkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJYTUwgZmlsZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eGVkdHRhZy5odG1sI3R4ZWR0dGFnIiB0aXRsZT0iRWRpdGluZyBYTUwgZmlsZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N3eG1sZWR0Lmh0bWwjY3d4bWxlZHQiIHRpdGxlPSJYTUwgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ibGluZSB3cmFwcGluZyBydWxlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhwcmVmcy5odG1sI3R4cHJlZnMiIHRpdGxlPSJEZWZpbmluZyBYTUwgZWRpdG9yIHByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgYXNzaXN0IHJ1bGVzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eHByZWZzLmh0bWwjdHhwcmVmcyIgdGl0bGU9IkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iaW5kZW50YXRpb24gc3R5bGUiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4cHJlZnMuaHRtbCN0eHByZWZzIiB0aXRsZT0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHN1Z3N0cmF0Lmh0bWwjeG1sc291cmNlc3VnZ2VzdGlvbnN0cmF0ZWd5IiB0aXRsZT0iU2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3QiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0ic2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R0YWdoaWx0Lmh0bWwjdHRhZ2hpbHQiIHRpdGxlPSJTZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iRE9DVFlQRSBkZWNsYXJhdGlvbnMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRkb2MuaHRtbCN0ZWR0ZG9jIiB0aXRsZT0iRWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9ucyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJuYW1lc3BhY2UgaW5mb3JtYXRpb24iPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRzY2guaHRtbCN0ZWR0c2NoIiB0aXRsZT0iRWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24iLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRwcm9jLmh0bWwjdGVkdHByb2MiIHRpdGxlPSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IGFzc2lzdCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3Y2Rhc3QuaHRtbCN0d2NkYXN0IiB0aXRsZT0iVXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0Ii8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idXBkYXRpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBmaWxlcyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdGdyYW0uaHRtbCN0ZWR0Z3JhbSIgdGl0bGU9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imljb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhtbGJpY29ucy5odG1sI3JpY29ucyIgdGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iRW5jb2RpbmdzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iSFRNTCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxlbmMuaHRtbCNjeG1sZW5jIiB0aXRsZT0iWE1MIGFuZCBIVE1MIGVuY29kaW5ncyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL2N4bWxlbmMuaHRtbCNjeG1sZW5jIiB0aXRsZT0iWE1MIGFuZCBIVE1MIGVuY29kaW5ncyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgdGVtcGxhdGVzIj4KLSAgICA8ZW50cnkga2V5d29yZD0iY3JlYXRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyIgdGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWRpdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZW1vdmluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R3bWFjcm8uaHRtbCN0d21hY3JvIiB0aXRsZT0iV29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnRpbmciPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90d21hY3JvLmh0bWwjdHdtYWNybyIgdGl0bGU9Ildvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZXhwb3J0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHdtYWNyby5odG1sI3R3bWFjcm8iIHRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJYTUwgY2F0YWxvZyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbGNhdC5odG1sI2N4bWxjYXQiIHRpdGxlPSJYTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyBlbnRyaWVzIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHhtbGNhdC5odG1sI3R4bWxjYXQiIHRpdGxlPSJBZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2ciLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnRpbmcgZW50cmllcyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R4bWxjYXQuaHRtbCN0eG1sY2F0IiB0aXRsZT0iQWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZXhwb3J0aW5nIGVudHJpZXMiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90eG1sY2F0Lmh0bWwjdHhtbGNhdCIgdGl0bGU9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIvPgotICAgIDwvZW50cnk+Ci0gIDwvZW50cnk+Ci08L2luZGV4PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcyBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNlZDFlZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1wbHVnaW5OYW1lICAgICA9IFhNTCBlZGl0b3IKLXBsdWdpblByb3ZpZGVyID0gRWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMDNjNzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3BsdWdpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPD9lY2xpcHNlIHZlcnNpb249IjMuMCI/PgotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLTwhLS0gLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSAqIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotICogd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0gKiAKLSAqIENvbnRyaWJ1dG9yczoKLSAqICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLyAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLTwhLS0gVGhpcyBpcyB0aGUgcGx1Z2luIGZvciBkZWNsYXJpbmcgdGhlIGhlbHAgICAgICAgICAtLT4KLTwhLS0gY29udHJpYnV0aW9ucyBmb3IgdXNpbmcgdGhlIHRvb2wuICAgICAgICAgICAgICAgICAtLT4KLTwhLS0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAtLT4KLQotPHBsdWdpbj4KLQotPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC50b2MiPgotICAgIDx0b2MgZmlsZT0iWE1MQnVpbGRlcm1hcF90b2MueG1sIi8+Ci0gICAgICAKLTwvZXh0ZW5zaW9uPgotCi08ZXh0ZW5zaW9uCi0gICAgICAgIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLmluZGV4Ij4KLSAgICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4gICAgIAotICA8L2V4dGVuc2lvbj4KLSAgCi08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2NjcmVhdHhtLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMTk0NTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIiAgImNvbmNlcHQuZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTxjb25jZXB0IGlkPSJjcmVhdGluZ3htbGZpbGVzIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5DcmVhdGluZyBYTUwgZmlsZXM8L3RpdGxlPg0KLTxzaG9ydGRlc2M+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczo8L3Nob3J0ZGVzYz4NCi08Y29uYm9keT48L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pg0KLTxsaW5rIGhyZWY9InRjcmV0eG1sLmRpdGEiPjxsaW5rdGV4dD5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0Y3JleGR0ZC5kaXRhIj48bGlua3RleHQ+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBhIERURHM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0Y3JleHhzZC5kaXRhIj48bGlua3RleHQ+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSA8P1B1YiBDYXJldD8+WE1MDQotc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTwvbGlua2xpc3Q+DQotPC9yZWxhdGVkLWxpbmtzPg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMDcxOD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jY3JlYXR4bS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGM0Y2I5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY2NyZWF0eG0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgWE1MIGZpbGVzOiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gY3JlYXRpbmcgWE1MIGZpbGVzOiIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGNyZXR4bWwuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGNyZXhkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0idGNyZXh4c2QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjcmVhdGluZ3htbGZpbGVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgWE1MIGZpbGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjcmVhdGluZ3htbGZpbGVzIj48YSBuYW1lPSJjcmVhdGluZ3htbGZpbGVzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5DcmVhdGluZyBYTUwgZmlsZXM8L2gxPgotCi0KLTxkaXY+PHA+VGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIGNyZWF0aW5nIFhNTCBmaWxlczo8L3A+Ci08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij4KLTxkaXY+PGEgaHJlZj0idGNyZXR4bWwuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3JlYXRlIGEgbmV3LCBlbXB0eSBYTUwgZmlsZSwgd2hpY2ggeW91IGNhbiB0aGVuIGVkaXQgaW4gdGhlIFhNTCBlZGl0b3IuIFdoZW4geW91IGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIGl0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mIGNvbnRlbnQgaXQgY2FuIGNvbnRhaW4uIj5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gYSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0Y3JleHhzZC5odG1sIiB0aXRsZT0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYSwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MCi1zY2hlbWFzPC9hPjwvZGl2PjwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWE1MLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0YWE0MGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hNTC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzoiIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6IiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjY3JlYXR4bS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0eGVkdHRhZy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0d3h2YWxpZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJjeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InJ4bWxiaWNvbnMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JraW5nd2l0aHhtbGZpbGVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0id29ya2luZ3dpdGh4bWxmaWxlcyI+PGEgbmFtZT0id29ya2luZ3dpdGh4bWxmaWxlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvaDE+Ci0KLQotPGRpdj48cD5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3A+Ci08L2Rpdj4KLQotPGRpdj4KLTxkaXYgY2xhc3M9ImxpbmtsaXN0Ij4KLTxkaXY+PGEgaHJlZj0iY2NyZWF0eG0uaHRtbCIgdGl0bGU9IlRoaXMgc2VjdGlvbiBjb250YWlucyBpbmZvcm1hdGlvbiBvbiBjcmVhdGluZyBYTUwgZmlsZXM6Ij5DcmVhdGluZyBYTUwgZmlsZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InR4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHd4dmFsaWQuaHRtbCIgdGl0bGU9IldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8gc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC4iPlZhbGlkYXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJjeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MCi1zY2hlbWE8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJ4bWxiaWNvbnMuaHRtbCIgdGl0bGU9IlRoZSBmb2xsb3dpbmcgWE1MIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgYW5kIERlc2lnbiB2aWV3LiI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvYT48L2Rpdj48L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya3htbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTcwY2ZmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3dvcmt4bWwuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiIgICJjb25jZXB0LmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08Y29uY2VwdCBpZD0id29ya2luZ3dpdGh4bWxmaWxlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBmaWxlczwvdGl0bGU+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gb24gdGhlIGZvbGxvd2luZzo8L3Nob3J0ZGVzYz4NCi08Y29uYm9keT48L2NvbmJvZHk+DQotPHJlbGF0ZWQtbGlua3M+DQotPGxpbmtsaXN0Pg0KLTxsaW5rIGhyZWY9ImNjcmVhdHhtLmRpdGEiPjxsaW5rdGV4dD5DcmVhdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0eGVkdHRhZy5kaXRhIj48bGlua3RleHQ+RWRpdGluZyBYTUwgZmlsZXM8L2xpbmt0ZXh0Pjw/UHViIENhcmV0MT8+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InR3eHZhbGlkLmRpdGEiPjxsaW5rdGV4dD5WYWxpZGF0aW5nIFhNTCBmaWxlczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9ImN4bWxjYXQuZGl0YSI+PGxpbmt0ZXh0PlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTA0KLXNjaGVtYTwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InJ4bWxiaWNvbnMuZGl0YSI+PGxpbmt0ZXh0Pkljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3I8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08L2xpbmtsaXN0Pg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L2NvbmNlcHQ+DQotPD9QdWIgKjAwMDAwMDA4NzE/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFiYTA3NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3eG1sZWR0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjd3htbGVkdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIGVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5Zb3UgY2FuIHVzZSBpdCB0byBwZXJmb3JtIGEgdmFyaWV0eSBvZiB0YXNrcyBzdWNoIGFzOjwvcD4NCi08dWw+DQotPGxpPkNyZWF0aW5nIG5ldywgZW1wdHkgWE1MIGZpbGVzIG9yIGdlbmVyYXRpbmcgdGhlbSBmcm9tIGV4aXN0aW5nIERURHMgb3INCi1leGlzdGluZyBYTUwgc2NoZW1hczwvbGk+DQotPGxpPkVkaXRpbmcgWE1MIGZpbGVzPC9saT4NCi08bGk+SW1wb3J0aW5nIGV4aXN0aW5nIFhNTCBmaWxlcyBmb3Igc3RydWN0dXJlZCB2aWV3aW5nPC9saT4NCi08bGk+QXNzb2NpYXRpbmcgWE1MIGZpbGVzIHdpdGggRFREcyBvciBYTUwgc2NoZW1hczwvbGk+DQotPC91bD4NCi08cD5UaGUgWE1MIGVkaXRvciBoYXMgdHdvIG1haW4gdmlld3MgLSB0aGUgU291cmNlIHZpZXcgYW5kIHRoZSBEZXNpZ24gdmlldy4NCi1Zb3UgY2FuIGFsc28gdXNlIHRoZSA8Yj5PdXRsaW5lPC9iPiB2aWV3IHRvIGluc2VydCBhbmQgZGVsZXRlIGVsZW1lbnRzLjwvcD4NCi08c2VjdGlvbj48dGl0bGU+U291cmNlIHZpZXc8L3RpdGxlPjxwPlRoZSBTb3VyY2UgdmlldyBlbmFibGVzIHlvdSB0byB2aWV3DQotYW5kIHdvcmsgZGlyZWN0bHkgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZS4gTWFueSBvZiB0aGUgWE1MIGVkaXRpbmcgZmVhdHVyZXMNCi1pbiB0aGUgWE1MIGVkaXRvciBTb3VyY2UgdmlldyBhcmUgdmVyeSBzaW1pbGFyIHRvIHRob3NlIGF2YWlsYWJsZSBpbiB0aGUgU291cmNlDQotdmlldyBvZiBQYWdlIERlc2lnbmVyLjwvcD48cD5UaGUgU291cmNlIHZpZXcgaGFzIG1hbnkgdGV4dCBlZGl0aW5nIGZlYXR1cmVzLA0KLXN1Y2ggYXM6IDx1bD4NCi08bGk+IFN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvL3JlZG8sIGFuZCB1c2VyLWRlZmluZWQgdGVtcGxhdGVzLjwvbGk+DQotPGxpPiBDb250ZW50IGFzc2lzdCwgd2hpY2ggdXNlcyB0aGUgaW5mb3JtYXRpb24gaW4gYSBEVEQgb3Igc2NoZW1hIGNvbnRlbnQNCi1tb2RlbCB0byBwcm92aWRlIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGNvbnRpbnVhdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZQ0KLWN1cnNvciBpcyBsb2NhdGVkIGluIGFuIFhNTCBmaWxlLCBvciB3aGF0IGhhcyBqdXN0IGJlZW4gdHlwZTwvbGk+DQotPGxpPiJTbWFydCIgZG91YmxlLWNsaWNraW5nIGJlaGF2aW9yLiBJZiB5b3VyIGN1cnNvciBpcyBwbGFjZWQgaW4gYW4gYXR0cmlidXRlDQotdmFsdWUsIG9uZSBkb3VibGUtY2xpY2sgc2VsZWN0cyB0aGF0IHZhbHVlLCBhbm90aGVyIGRvdWJsZSBjbGljayBzZWxlY3RzIHRoZQ0KLWF0dHJpYnV0ZS12YWx1ZSBwYWlyLCBhbmQgYSB0aGlyZCBkb3VibGUtY2xpY2sgc2VsZWN0cyB0aGUgZW50aXJlIHRhZy4gVGhpcw0KLW1ha2VzIGl0IGVhc2llciB0byBjb3B5IGFuZCBwYXN0ZSBjb21tb25seSB1c2VkIHBpZWNlcyBvZiBYTUwuPC9saT4NCi08L3VsPjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPkRlc2lnbiB2aWV3PC90aXRsZT48cD5UaGUgWE1MIGVkaXRvciBhbHNvIGhhcyBhIERlc2lnbiB2aWV3Lg0KLUluIGl0OiA8dWw+DQotPGxpPlRoZSBYTUwgZmlsZSBpcyByZXByZXNlbnRlZCBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMNCi1oZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLjwvbGk+DQotPGxpPkNvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsDQotd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIG5vZGVzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvcg0KLXRoYXQgbG9jYXRpb24uICBGb3IgZXhhbXBsZSwgdGhlIDx1aWNvbnRyb2w+QWRkIGNoaWxkPC91aWNvbnRyb2w+IG1lbnUgaXRlbQ0KLXdpbGwgbGlzdCBvbmx5IHRob3NlIGVsZW1lbnRzIGZyb20gYSBEVEQgb3IgWE1MIHNjaGVtYSB3aGljaCB3b3VsZCBiZSB2YWxpZA0KLWNoaWxkcmVuIGF0IHRoYXQgcG9pbnQgKGFzIGxvbmcgYXMgZ3JhbW1hciBjb25zdHJhaW50cyBhcmUgb24pLjwvbGk+DQotPC91bD48L3A+PHA+VGhlIERlc2lnbiB2aWV3IGlzIGVzcGVjaWFsbHkgaGVscGZ1bCBpZiB5b3UgYXJlIG5ldyB0byBYTUwsIG9yDQotbmVlZCB0byBkbyBmb3JtLW9yaWVudGVkIGVkaXRpbmcuIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIHRoZSBDcmVhdGUgWE1MDQotRmlsZSB3aXphcmQgdG8gY3JlYXRlIGEgdGVtcGxhdGUgWE1MIGZpbGUgZm9yIGEgam9iIGRlc2NyaXB0aW9uIGZvcm0gZnJvbQ0KLWEgam9iIGRlc2NyaXB0aW9uIDw/UHViIENhcmV0Pz5EVEQuIEFmdGVyIHRob3NlIHN0ZXBzIGFyZSBjb21wbGV0ZWQsIHlvdSB3b3VsZA0KLW9ubHkgaGF2ZSB0byBmaWxsIGluIHRoZSBmb3JtIGRhdGEgdXNpbmcgdGhlIERlc2lnbiB2aWV3LjwvcD48cD5UaGUgZm9sbG93aW5nDQotbGlua3MgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZWRpdG9yOjwvcD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMjk5ND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd3htbGVkdC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd3htbGVkdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzlmYWRiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3d4bWxlZHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJYTUwgZWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleGR0ZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXh4c2QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3eHZhbGlkLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3d4bWxlZHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjd3htbGVkdCI+PGEgbmFtZT0iY3d4bWxlZHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCBlZGl0b3I8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLjwvcD4KLQotPHA+WW91IGNhbiB1c2UgaXQgdG8gcGVyZm9ybSBhIHZhcmlldHkgb2YgdGFza3Mgc3VjaCBhczo8L3A+Ci0KLTx1bD4KLTxsaT5DcmVhdGluZyBuZXcsIGVtcHR5IFhNTCBmaWxlcyBvciBnZW5lcmF0aW5nIHRoZW0gZnJvbSBleGlzdGluZyBEVERzIG9yCi1leGlzdGluZyBYTUwgc2NoZW1hczwvbGk+Ci0KLTxsaT5FZGl0aW5nIFhNTCBmaWxlczwvbGk+Ci0KLTxsaT5JbXBvcnRpbmcgZXhpc3RpbmcgWE1MIGZpbGVzIGZvciBzdHJ1Y3R1cmVkIHZpZXdpbmc8L2xpPgotCi08bGk+QXNzb2NpYXRpbmcgWE1MIGZpbGVzIHdpdGggRFREcyBvciBYTUwgc2NoZW1hczwvbGk+Ci0KLTwvdWw+Ci0KLTxwPlRoZSBYTUwgZWRpdG9yIGhhcyB0d28gbWFpbiB2aWV3cyAtIHRoZSBTb3VyY2UgdmlldyBhbmQgdGhlIERlc2lnbiB2aWV3LgotWW91IGNhbiBhbHNvIHVzZSB0aGUgPHN0cm9uZz5PdXRsaW5lPC9zdHJvbmc+IHZpZXcgdG8gaW5zZXJ0IGFuZCBkZWxldGUgZWxlbWVudHMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U291cmNlIHZpZXc8L2g0PjxwPlRoZSBTb3VyY2UgdmlldyBlbmFibGVzIHlvdSB0byB2aWV3Ci1hbmQgd29yayBkaXJlY3RseSB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlLiBNYW55IG9mIHRoZSBYTUwgZWRpdGluZyBmZWF0dXJlcwotaW4gdGhlIFhNTCBlZGl0b3IgU291cmNlIHZpZXcgYXJlIHZlcnkgc2ltaWxhciB0byB0aG9zZSBhdmFpbGFibGUgaW4gdGhlIFNvdXJjZQotdmlldyBvZiBQYWdlIERlc2lnbmVyLjwvcD4KLTxkaXYgY2xhc3M9InAiPlRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsCi1zdWNoIGFzOiA8dWw+Ci08bGk+IFN5bnRheCBoaWdobGlnaHRpbmcsIHVubGltaXRlZCB1bmRvL3JlZG8sIGFuZCB1c2VyLWRlZmluZWQgdGVtcGxhdGVzLjwvbGk+Ci0KLTxsaT4gQ29udGVudCBhc3Npc3QsIHdoaWNoIHVzZXMgdGhlIGluZm9ybWF0aW9uIGluIGEgRFREIG9yIHNjaGVtYSBjb250ZW50Ci1tb2RlbCB0byBwcm92aWRlIGEgbGlzdCBvZiBhY2NlcHRhYmxlIGNvbnRpbnVhdGlvbnMgZGVwZW5kaW5nIG9uIHdoZXJlIHRoZQotY3Vyc29yIGlzIGxvY2F0ZWQgaW4gYW4gWE1MIGZpbGUsIG9yIHdoYXQgaGFzIGp1c3QgYmVlbiB0eXBlPC9saT4KLQotPGxpPiJTbWFydCIgZG91YmxlLWNsaWNraW5nIGJlaGF2aW9yLiBJZiB5b3VyIGN1cnNvciBpcyBwbGFjZWQgaW4gYW4gYXR0cmlidXRlCi12YWx1ZSwgb25lIGRvdWJsZS1jbGljayBzZWxlY3RzIHRoYXQgdmFsdWUsIGFub3RoZXIgZG91YmxlIGNsaWNrIHNlbGVjdHMgdGhlCi1hdHRyaWJ1dGUtdmFsdWUgcGFpciwgYW5kIGEgdGhpcmQgZG91YmxlLWNsaWNrIHNlbGVjdHMgdGhlIGVudGlyZSB0YWcuIFRoaXMKLW1ha2VzIGl0IGVhc2llciB0byBjb3B5IGFuZCBwYXN0ZSBjb21tb25seSB1c2VkIHBpZWNlcyBvZiBYTUwuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5EZXNpZ24gdmlldzwvaDQ+PGRpdiBjbGFzcz0icCI+VGhlIFhNTCBlZGl0b3IgYWxzbyBoYXMgYSBEZXNpZ24gdmlldy4KLUluIGl0OiA8dWw+Ci08bGk+VGhlIFhNTCBmaWxlIGlzIHJlcHJlc2VudGVkIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcwotaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci48L2xpPgotCi08bGk+Q29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywKLXdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBub2RlcyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IKLXRoYXQgbG9jYXRpb24uICBGb3IgZXhhbXBsZSwgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBjaGlsZDwvc3Bhbj4gbWVudSBpdGVtCi13aWxsIGxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2ggd291bGQgYmUgdmFsaWQKLWNoaWxkcmVuIGF0IHRoYXQgcG9pbnQgKGFzIGxvbmcgYXMgZ3JhbW1hciBjb25zdHJhaW50cyBhcmUgb24pLjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwPlRoZSBEZXNpZ24gdmlldyBpcyBlc3BlY2lhbGx5IGhlbHBmdWwgaWYgeW91IGFyZSBuZXcgdG8gWE1MLCBvcgotbmVlZCB0byBkbyBmb3JtLW9yaWVudGVkIGVkaXRpbmcuIEZvciBleGFtcGxlLCB5b3UgY291bGQgdXNlIHRoZSBDcmVhdGUgWE1MCi1GaWxlIHdpemFyZCB0byBjcmVhdGUgYSB0ZW1wbGF0ZSBYTUwgZmlsZSBmb3IgYSBqb2IgZGVzY3JpcHRpb24gZm9ybSBmcm9tCi1hIGpvYiBkZXNjcmlwdGlvbiBEVEQuIEFmdGVyIHRob3NlIHN0ZXBzIGFyZSBjb21wbGV0ZWQsIHlvdSB3b3VsZAotb25seSBoYXZlIHRvIGZpbGwgaW4gdGhlIGZvcm0gZGF0YSB1c2luZyB0aGUgRGVzaWduIHZpZXcuPC9wPgotPHA+VGhlIGZvbGxvd2luZwotbGlua3MgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZWRpdG9yOjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiI+Q3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXh4c2QuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3eHZhbGlkLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIj5WYWxpZGF0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTM5ZjNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgY29uY2VwdCBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBDb25jZXB0Ly9FTiINCi0gImNvbmNlcHQuZHRkIj4NCi08Y29uY2VwdCBpZD0iY3htbGNhdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzDQotYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZA0KLWEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLA0KLWFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5hc3NvY2lhdGluZyB3aXRoIERURHM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+YXNzb2NpYXRpbmcgd2l0aCBYTUwgc2NoZW1hczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGNhdGFsb2c8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPlRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgdG8gYXNzb2NpYXRlIFhNTCBmaWxlcyB3aXRoIERURHMgb3IgWE1MIHNjaGVtYXMuPC9wPg0KLTxvbD4NCi08bGk+RGlyZWN0IGFzc29jaWF0aW9uIC0gVGhlIFhNTCBmaWxlIGNvbnRhaW5zIGVpdGhlciB0aGUgbmFtZSBvZiBhIERURCBpbg0KLWl0cyBkb2N0eXBlIGRlY2xhcmF0aW9uIChmb3IgZXhhbXBsZSwgJmx0OyFET0NUWVBFIHJvb3QtZWxlbWVudCBTWVNURU0gIiA8dmFybmFtZT5kdGRmaWxlLmR0ZDwvdmFybmFtZT4iDQotPiwgd2hlcmUgIDx2YXJuYW1lPmR0ZGZpbGUuZHRkPC92YXJuYW1lPiBpcyB0aGUgbmFtZSBvZiB0aGUgRFREIGZpbGUpIG9yIGl0DQotY29udGFpbnMgdGhlIHBhdGggb2YgYW4gWE1MIHNjaGVtYSBpbiB0aGUgc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIG9mIHRoZQ0KLVhNTCBmaWxlIHJvb3QgZWxlbWVudCAoZm9yIGV4YW1wbGUsICZsdDt4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbQ0KLSA8dmFybmFtZT5zY2hlbWEueHNkPC92YXJuYW1lPiI+LCB3aGVyZSAgPHZhcm5hbWU+c2NoZW1hLnhzZDwvdmFybmFtZT4gaXMNCi10aGUgbmFtZSBvZiB0aGUgWE1MIHNjaGVtYS48L2xpPg0KLTxsaT5YTUwgQ2F0YWxvZyBlbnRyeSAtIFlvdSBjYW4gcmVnaXN0ZXIgRFREIGFuZCBYTUwgc2NoZW1hIGZpbGVzIGluIHRoZSBYTUwNCi1DYXRhbG9nIGFuZCBhc3NvY2lhdGUgdGhlbSB3aXRoIGEgIDx2YXJuYW1lPktleTwvdmFybmFtZT4gdGhhdCByZXByZXNlbnRzDQotdGhlbS4gWW91IGNhbiB0aGVuIHJlZmVyIHRvIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSAgPHZhcm5hbWU+S2V5PC92YXJuYW1lPiBmcm9tDQotYW4gWE1MIGZpbGUgaW5zdGVhZCBvZiByZWZlcnJpbmcgZGlyZWN0bHkgdG8gdGhlIERURCBvciBYTUwgc2NoZW1hIGZpbGUuIEFuDQotWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gdGhlIEtleSAod2hpY2ggcmVwcmVzZW50cyB0aGUgRFREIG9yDQotWE1MIHNjaGVtYSkgYW5kIGEgVVJJICh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgRFREIG9yIFhNTCBzY2hlbWENCi1sb2NhdGlvbikuPC9saT4NCi08L29sPg0KLTxzZWN0aW9uPjx0aXRsZT5Ib3cgYW4gYXNzb2NpYXRpb24gd29ya3M8L3RpdGxlPjxiPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlDQotd2l0aCBhIERURCA8L2I+PHA+SWYgYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFRELCBhIERPQ1RZUEUgdGFnIHN1Y2gNCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGU6PGNvZGVibG9jaz4mbHQ7IURPQ1RZUEUgcm9vdC1uYW1lIFBVQkxJQyAiPHZhcm5hbWU+SW52b2ljZUlkPC92YXJuYW1lPiIgIjx2YXJuYW1lPkM6XG15ZHRkc1xJbnZvaWNlLmR0ZDwvdmFybmFtZQ0KLT4iPg0KLTwvY29kZWJsb2NrPjwvcD48cD48dmFybmFtZT5JbnZvaWNlSWQ8L3Zhcm5hbWU+IGlzIHRoZSBwdWJsaWMgaWRlbnRpZmllciBvZg0KLXRoZSBEVEQgZmlsZS4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlIFhNTCBmaWxlIHdpdGggYSBEVEQgZmlsZSAoaW4gdGhpcw0KLWNhc2UsIHRoZSBEVEQgZmlsZSBpcyAgPHZhcm5hbWU+SW52b2ljZS5kdGQ8L3Zhcm5hbWU+KS4gSWYgdGhlIHB1YmxpYyBpZGVudGlmaWVyDQotSW52b2ljZUlkIGNvcnJlc3BvbmRzIHRvIHRoZSAgPHZhcm5hbWU+S2V5PC92YXJuYW1lPiBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkNCi1mb3IgSW52b2ljZS5kdGQsIHRoZW4gdGhlICA8dmFybmFtZT5VUkk8L3Zhcm5hbWU+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQ0KLSh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgSW52b2ljZS5kdGQpIGlzIHVzZWQgdG8NCi1sb2NhdGUgdGhlIERURC4gT3RoZXJ3aXNlLCB0aGUgRE9DVFlQRSdzIHN5c3RlbSBpZGVudGlmaWVyICggPHZhcm5hbWU+IkM6XG15ZHRkc1xJbnZvaWNlLmR0ZCI8L3Zhcm5hbWU+KSwNCi13aGljaCByZWZlcnMgZGlyZWN0bHkgdG8gdGhlIGZpbGUgc3lzdGVtIGxvY2F0aW9uIG9mIHRoZSBEVEQsIGlzIHVzZWQgdG8gbG9jYXRlDQotdGhlIERURC48L3A+PHA+IDxiPk5vdGU8L2I+OiBZb3UgY2FuIGFsc28gdXNlIGEgc3lzdGVtIGlkZW50aWZpZXIgYXMgYSBLZXkNCi1pbiBhbiBYTUwgQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5LCBhIERPQ1RZUEUNCi10YWcgc3VjaCBhcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiBhbiBYTUwgZmlsZTo8L3A+PGNvZGVibG9jaz4mbHQ7IURPQ1RZUEUgUm9vdC1uYW1lIFNZU1RFTSAiPHZhcm5hbWU+TXlEVEQuZHRkPC92YXJuYW1lPiI+IDwvY29kZWJsb2NrDQotPjxwPndoZXJlICA8dmFybmFtZT5NeURURC5kdGQ8L3Zhcm5hbWU+IGlzIHRoZSBzeXN0ZW0gaWRlbnRpZmllciB0aGF0IGNvcnJlc3BvbmRzDQotdG8gdGhlIEtleSBvZiBhbiBYTUwgQ2F0YWxvZyBlbnRyeS48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjxiPkFzc29jaWF0aW5nIGFuIFhNTCBmaWxlIHdpdGggYW4gWE1MIHNjaGVtYTwvYj48cD5JZiBhbiBYTUwgZmlsZQ0KLWlzIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hLCBvbmUgb3IgbW9yZSBzY2hlbWEgbG9jYXRpb24gYXR0cmlidXRlcyBhcmUNCi1pbmNsdWRlZCBpbiB0aGUgWE1MIGZpbGUuIFRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgc2NoZW1hTG9jYXRpb24gaXMgcHJvdmlkZWQNCi1hcyBhICJoaW50IiB0byB0aGUgWE1MIHByb2Nlc3Nvci4gVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IHNjaGVtYUxvY2F0aW9uDQotYXR0cmlidXRlcy48L3A+PHA+IDxiPkV4YW1wbGUgMSA8L2I+PGNvZGVibG9jaz4mbHQ7cHVyY2hhc2VPcmRlciB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIg0KLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIEM6XG15c2NoZW1hc1xQdXJjaGFzZU9yZGVyLnhzZCI+DQotJmx0O3NoaXBUbyBjb3VudHJ5PSJVUyI+DQotLi4uPC9jb2RlYmxvY2s+ICAgIDwvcD48cD48Yj5FeGFtcGxlIDIgPC9iPjxjb2RlYmxvY2s+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSINCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBQTy54c2QiPg0KLSZsdDtzaGlwVG8gY291bnRyeT0iVVMiPg0KLS4uLi48L2NvZGVibG9jaz4gIDwvcD48cD5JbiBFeGFtcGxlIDEsIHRoZSBzY2hlbWFMb2NhdGlvbiAnaGludCcgKCdDOlxteXNjaGVtYXNcUHVyY2hhc2VPcmRlci54c2QnKQ0KLXJlZmVycyBkaXJlY3RseSB0byB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb3IgVVJJIG9mIHRoZSBYTUwgc2NoZW1hLiBJbiB0aGlzDQotY2FzZSwgdGhlIHNjaGVtYSBmaWxlIHdpbGwgYmUgbG9jYXRlZCBieSB0aGUgWE1MIHByb2Nlc3NvciBkaXJlY3RseS48L3A+PHA+SW4NCi1FeGFtcGxlIDIsIHRoZSBzY2hlbWFMb2NhdGlvbiAnaGludCcgKCdQTy54c2QnKSByZWZlcnMgdG8gYW4gWE1MIENhdGFsb2cgZW50cnkuDQotUE8ueHNkIGNvcnJlc3BvbmRzIHRvIHRoZSAgPHZhcm5hbWU+S2V5PC92YXJuYW1lPiBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkNCi1mb3IgUHVyY2hhc2VPcmRlci54c2QsIGFuZCB0aGUgVVJJIG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSAod2hpY2ggY29udGFpbnMNCi1pbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9jYXRpb24gb2YgUHVyY2hhc2VPcmRlci54c2QpIHdpbGwgYmUgdXNlZCB0byBsb2NhdGVkDQotdGhlIFhNTCBzY2hlbWEuPC9wPjxwPkluIGJvdGggZXhhbXBsZXMsIDxjb2RlcGg+aHR0cDovL3d3dy5pYm0uY29tPC9jb2RlcGg+IGluDQotdGhlIDxjb2RlcGg+eHNpOnNjaGVtYUxvY2F0aW9uPC9jb2RlcGg+IHRhZyBpcyBhIFVSSSB0aGF0IGlkZW50aWZpZXMgdGhlIG5hbWVzcGFjZQ0KLWZvciB0aGUgWE1MIHNjaGVtYS48L3A+PHA+WW91IGNhbiBhbHNvIHVzZSBhIG5hbWVzcGFjZSBhcyBhIEtleSBmb3IgYW4gWE1MDQotQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIG5hbWVzcGFjZSBhcyBhIEtleSwgYSBzY2hlbWFMb2NhdGlvbiB0YWcgc3VjaA0KLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIGFuIFhNTCBmaWxlOjxjb2RlYmxvY2s+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM6PSJ3d3cuaWJtLmNvbSINCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBwby94c2QvUHVyY2hhc2VPcmRlci54c2QgIj48L2NvZGVibG9jaz48L3A+PHA+VGhlDQotc2NoZW1hTG9jYXRpb24gYXR0cmlidXRlIHBvaW50cyB0byBib3RoIHRoZSBLZXkgYW5kIHRoZSBhY3R1YWwgbG9jYXRpb24gb2YNCi10aGUgc2NoZW1hLjwvcD48cD48Yj5EVEQgb3IgWE1MIHNjaGVtYSByZXNpZGVzIG9uIGEgcmVtb3RlIHNlcnZlcjwvYj48L3A+PHA+U2V2ZXJhbA0KLWZ1bmN0aW9ucyBpbiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB2YWxpZGF0aW9uIGFuZCBjb250ZW50IGFzc2lzdCwgcmVxdWlyZQ0KLXRoZSBhdmFpbGFiaWxpdHkgb2YgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYS4gVGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiBwcm92aWRlcw0KLXVzYWdlIGluZm9ybWF0aW9uIGZvciBjYXNlcyB3aGVuIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSByZXNpZGVzIG9uIHlvdXIgbG9jYWwNCi1tYWNoaW5lLiBIb3dldmVyLCBpbiBtYW55IGNhc2VzLCB0aGUgRFREIG9yIFhNTCBzY2hlbWEgY2FuIHJlc2lkZSBvbiBhIHJlbW90ZQ0KLXNlcnZlciwgZm9yIGV4YW1wbGU6PC9wPjxwPjxjb2RlcGg+Jmx0OyFET0NUWVBFIENhdGFsb2cgUFVCTElDICJhYmMvQ2F0YWxvZyINCi0iaHR0cDovL3h5ei5hYmMub3JnL2R0ZHMvY2F0YWxvZy5kdGQiPjwvY29kZXBoPjwvcD48cD5Ob3JtYWxseSwgdGhpcyBjYXNlDQotcG9zZXMgbm8gcHJvYmxlbSwgYmVjYXVzZSB0aGUgRFREIG9yIFhNTCBzY2hlbWEgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZQ0KLXJlbW90ZSBzZXJ2ZXIuIEhvd2V2ZXIsIGlmIHlvdSBhcmUgYmVoaW5kIGEgZmlyZXdhbGwsIGFuZCBkbyBub3QgaGF2ZSBhIFNPQ0tTaWZpZWQNCi1zeXN0ZW0sIHRoZSB3b3JrYmVuY2ggY3VycmVudGx5IGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgZm9yIHlvdSB0byBzcGVjaWZ5DQotYSBzb2NrcyBzZXJ2ZXIgZm9yIHJldHJpZXZpbmcgYSBEVEQgb3IgWE1MIHNjaGVtYS4gSWYgeW91IGFyZSB1bmFibGUgdG8gU09DS1NpZnkNCi15b3VyIHN5c3RlbSwgdGhlIHdvcmthcm91bmQgZm9yIHRoaXMgcHJvYmxlbSBpcyB0byByZXRyaWV2ZSBhIGNvcHkgb2YgdGhlDQotRFREIG9yIFhNTCBzY2hlbWEgKHVzaW5nIGEgV2ViIGJyb3dzZXIsIGZvciBleGFtcGxlKSBhbmQgc2F2ZSB0aGF0IGNvcHkgb24NCi15b3VyIGxvY2FsIG1hY2hpbmUuIFRoZW4sIHlvdSBjYW4gZWl0aGVyIHBsYWNlIGEgbG9jYWwgY29weSBpbiB0aGUgc2FtZSBwcm9qZWN0DQotYXMgeW91ciBYTUwgZmlsZSwgb3IgdXNlIHRoZSBYTUwgQ2F0YWxvZyB0byBhc3NvY2lhdGUgYSBwdWJsaWMgaWRlbnRpZmllcg0KLXdpdGggdGhlIERURCdzIChsb2NhbCkgbG9jYXRpb24uPC9wPjxwPjxiPk5vdGU8L2I+OiBJZiB5b3UgaGF2ZSBhbiBYTUwgZmlsZQ0KLWFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hIG9yIERURCB0aGF0IGlzIGVsc2V3aGVyZSBpbiB0aGUgbmV0d29yaywgYW5kDQoteW91IGFyZSB3b3JraW5nIG9uIGEgbWFjaGluZSBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbmV0d29yaywgeW91IGNhbiBmb2xsb3cNCi10aGUgc3RlcHMgZGVzY3JpYmVkIHByZXZpb3VzbHkgaWYgeW91IHdhbnQgdG8gdXNlIGNvbnRlbnQgYXNzaXN0IG9yIHZhbGlkYXRlDQoteW91ciBYTUwgZmlsZS4gIDwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPkFkdmFudGFnZXMgb2YgWE1MIENhdGFsb2cgZW50cnkgYXNzb2NpYXRpb25zPC90aXRsZT48cD5JZg0KLXlvdSBjcmVhdGUgYSBkaXJlY3QgYXNzb2NpYXRpb24gYmV0d2VlbiBhbiBYTUwgZmlsZSBhbmQgYW4gWE1MIHNjaGVtYSBvciBEVEQNCi1maWxlLCBhbnkgdGltZSB5b3UgY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hIG9yIERURCB5b3UgaGF2ZSB0byB0cmFjaw0KLWRvd24gYW5kIHVwZGF0ZSBhbGwgb2YgdGhlIHJlZmVyZW5jaW5nIFhNTCBmaWxlcyB3aXRoIHRoZSBuZXcgbG9jYXRpb24gb2YNCi10aGUgRFREIG9yIHNjaGVtYS4gSWYsIGhvd2V2ZXIsIHlvdSBhc3NvY2lhdGUgYW4gWE1MIGZpbGUgd2l0aCBhbiBYTUwgc2NoZW1hDQotb3IgRFREIEtleSwgdGhlbiwgd2hlbiB5b3UgY2hhbmdlIHRoZSBsb2NhdGlvbiBvZiB0aGUgc2NoZW1hIG9yIERURCwgeW91IG9ubHkNCi1oYXZlIHRvIHVwZGF0ZSB0aGUgWE1MIENhdGFsb2cgZW50cnksIGluc3RlYWQgb2YgZWFjaCBpbmRpdmlkdWFsIFhNTCBmaWxlLjwvcD48cD5Gb3INCi1leGFtcGxlLCB5b3UgaGF2ZSBhIERURCBjYWxsZWQgIkJ1aWxkaW5nLmR0ZCIsIHdoaWNoIGlzIGFzc29jaWF0ZWQgd2l0aCBmaXZlDQotWE1MIGZpbGVzIC0gT2ZmaWNlLnhtbCwgSG91c2UueG1sLCBBcGFydG1lbnQueG1sLCBCYW5rLnhtbCwgYW5kIFBvc3RPZmZpY2UueG1sLg0KLVlvdSBtb3ZlIHRoZSBEVEQgZmlsZSBCdWlsZGluZy5kdGQgdG8gYSBuZXcgbG9jYXRpb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0aW9uDQotYXNzb2NpYXRpb24gYmV0d2VlbiBCdWlsZGluZy5kdGQgYW5kIGFsbCB0aGUgWE1MIGZpbGVzLCB5b3Ugd2lsbCBoYXZlIHRvIHVwZGF0ZQ0KLXRoZSAmbHQ7RE9DVFRZUEU+IGRlY2xhcmF0aW9uIGluIGVhY2ggWE1MIGZpbGUgdG8gcmVmbGVjdCB0aGUgbmV3IGxvY2F0aW9uDQotb2YgQnVpbGRpbmcuZHRkLiBJZiwgaG93ZXZlciwgeW91IGhhdmUgYW4gWE1MIENhdGFsb2cgYXNzb2NpYXRpb24sIGFuZCBhbGwNCi10aGUgWE1MIGZpbGVzIGp1c3QgcmVmZXIgdG8gdGhlIEtleSBvZiBCdWlsZGluZy5kdGQsIHRoZW4geW91IG9ubHkgaGF2ZSB0bw0KLXVwZGF0ZSB0aGUgVVJJIGFuZCBhbGwgdGhlIFhNTCBmaWxlcyB3aWxsIHBvaW50IHRvIHRoZSBuZXcgbG9jYXRpb24gb2YgQnVpbGRpbmcuZHRkLjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlVwZGF0aW5nIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZzwvdGl0bGU+PHA+QWZ0ZXIgeW91IGhhdmUNCi11cGRhdGVkIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZywgeW91IG1pZ2h0IG5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvcg0KLXZpZXcgc28gdGhhdCBpdCB1c2VzIHRoZSBuZXcgaW5mb3JtYXRpb24uIFRvIGRvIHRoaXMsIGNsaWNrIHRoZSA8dWljb250cm9sPlJlbG9hZA0KLURlcGVuZGVuY2llczwvdWljb250cm9sPiB0b29sYmFyIGJ1dHRvbiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL3JsZGdybXIuZ2lmIj4NCi08YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgUmVsb2FkIERlcGVuZGVuY2llcyB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IGFuZA0KLXRoZSB2aWV3IHdpbGwgYmUgdXBkYXRlZCB1c2luZyB0aGUgY3VycmVudCBYTUwgQ2F0YWxvZyBzZXR0aW5ncy4gWW91IG9ubHkNCi1uZWVkIHRvIHJlZnJlc2ggdGhlIFhNTCBlZGl0b3IgdmlldyB3aGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIG9wZW4gdGhhdCByZWZlcmVuY2VzDQotdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRoYXQgd2FzIHVwZGF0ZWQuPC9wPjxwPkZvciBtb3JlIGluZm9ybWF0aW9uLCByZWZlcg0KLXRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxjYXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU1NTY3Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGNhdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBhc3NvY2lhdGluZyB3aXRoIERURHMsIGFzc29jaWF0aW5nIHdpdGggWE1MIHNjaGVtYXMsIFhNTCBjYXRhbG9nLCBvdmVydmlldyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgYXNzb2NpYXRpbmcgd2l0aCBEVERzLCBhc3NvY2lhdGluZyB3aXRoIFhNTCBzY2hlbWFzLCBYTUwgY2F0YWxvZywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRwcm9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0iY3htbGNhdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sY2F0Ij48YSBuYW1lPSJjeG1sY2F0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMKLWJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQKLWEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLAotYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS48L3A+Ci0KLTxwPlRoZXJlIGFyZSB0d28gZGlmZmVyZW50IHdheXMgdG8gYXNzb2NpYXRlIFhNTCBmaWxlcyB3aXRoIERURHMgb3IgWE1MIHNjaGVtYXMuPC9wPgotCi08b2w+Ci08bGk+RGlyZWN0IGFzc29jaWF0aW9uIC0gVGhlIFhNTCBmaWxlIGNvbnRhaW5zIGVpdGhlciB0aGUgbmFtZSBvZiBhIERURCBpbgotaXRzIGRvY3R5cGUgZGVjbGFyYXRpb24gKGZvciBleGFtcGxlLCAmbHQ7IURPQ1RZUEUgcm9vdC1lbGVtZW50IFNZU1RFTSAiIDx2YXIgY2xhc3M9InZhcm5hbWUiPmR0ZGZpbGUuZHRkPC92YXI+IgotJmd0Oywgd2hlcmUgIDx2YXIgY2xhc3M9InZhcm5hbWUiPmR0ZGZpbGUuZHRkPC92YXI+IGlzIHRoZSBuYW1lIG9mIHRoZSBEVEQgZmlsZSkgb3IgaXQKLWNvbnRhaW5zIHRoZSBwYXRoIG9mIGFuIFhNTCBzY2hlbWEgaW4gdGhlIHNjaGVtYUxvY2F0aW9uIGF0dHJpYnV0ZSBvZiB0aGUKLVhNTCBmaWxlIHJvb3QgZWxlbWVudCAoZm9yIGV4YW1wbGUsICZsdDt4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbQotIDx2YXIgY2xhc3M9InZhcm5hbWUiPnNjaGVtYS54c2Q8L3Zhcj4iJmd0Oywgd2hlcmUgIDx2YXIgY2xhc3M9InZhcm5hbWUiPnNjaGVtYS54c2Q8L3Zhcj4gaXMKLXRoZSBuYW1lIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+Ci0KLTxsaT5YTUwgQ2F0YWxvZyBlbnRyeSAtIFlvdSBjYW4gcmVnaXN0ZXIgRFREIGFuZCBYTUwgc2NoZW1hIGZpbGVzIGluIHRoZSBYTUwKLUNhdGFsb2cgYW5kIGFzc29jaWF0ZSB0aGVtIHdpdGggYSAgPHZhciBjbGFzcz0idmFybmFtZSI+S2V5PC92YXI+IHRoYXQgcmVwcmVzZW50cwotdGhlbS4gWW91IGNhbiB0aGVuIHJlZmVyIHRvIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSAgPHZhciBjbGFzcz0idmFybmFtZSI+S2V5PC92YXI+IGZyb20KLWFuIFhNTCBmaWxlIGluc3RlYWQgb2YgcmVmZXJyaW5nIGRpcmVjdGx5IHRvIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLiBBbgotWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gdGhlIEtleSAod2hpY2ggcmVwcmVzZW50cyB0aGUgRFREIG9yCi1YTUwgc2NoZW1hKSBhbmQgYSBVUkkgKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBEVEQgb3IgWE1MIHNjaGVtYQotbG9jYXRpb24pLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5Ib3cgYW4gYXNzb2NpYXRpb24gd29ya3M8L2g0PjxzdHJvbmc+QXNzb2NpYXRpbmcgYW4gWE1MIGZpbGUKLXdpdGggYSBEVEQgPC9zdHJvbmc+PGRpdiBjbGFzcz0icCI+SWYgYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFRELCBhIERPQ1RZUEUgdGFnIHN1Y2gKLWFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIHRoZSBYTUwgZmlsZTo8cHJlPiZsdDshRE9DVFlQRSByb290LW5hbWUgUFVCTElDICI8dmFyIGNsYXNzPSJ2YXJuYW1lIj5JbnZvaWNlSWQ8L3Zhcj4iICI8dmFyIGNsYXNzPSJ2YXJuYW1lIj5DOlxteWR0ZHNcSW52b2ljZS5kdGQ8L3Zhcj4iJmd0OwotPC9wcmU+Ci08L2Rpdj4KLTxwPjx2YXIgY2xhc3M9InZhcm5hbWUiPkludm9pY2VJZDwvdmFyPiBpcyB0aGUgcHVibGljIGlkZW50aWZpZXIgb2YKLXRoZSBEVEQgZmlsZS4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlIFhNTCBmaWxlIHdpdGggYSBEVEQgZmlsZSAoaW4gdGhpcwotY2FzZSwgdGhlIERURCBmaWxlIGlzICA8dmFyIGNsYXNzPSJ2YXJuYW1lIj5JbnZvaWNlLmR0ZDwvdmFyPikuIElmIHRoZSBwdWJsaWMgaWRlbnRpZmllcgotSW52b2ljZUlkIGNvcnJlc3BvbmRzIHRvIHRoZSAgPHZhciBjbGFzcz0idmFybmFtZSI+S2V5PC92YXI+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQotZm9yIEludm9pY2UuZHRkLCB0aGVuIHRoZSAgPHZhciBjbGFzcz0idmFybmFtZSI+VVJJPC92YXI+IG9mIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeQotKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZSBsb2NhdGlvbiBvZiBJbnZvaWNlLmR0ZCkgaXMgdXNlZCB0bwotbG9jYXRlIHRoZSBEVEQuIE90aGVyd2lzZSwgdGhlIERPQ1RZUEUncyBzeXN0ZW0gaWRlbnRpZmllciAoIDx2YXIgY2xhc3M9InZhcm5hbWUiPiJDOlxteWR0ZHNcSW52b2ljZS5kdGQiPC92YXI+KSwKLXdoaWNoIHJlZmVycyBkaXJlY3RseSB0byB0aGUgZmlsZSBzeXN0ZW0gbG9jYXRpb24gb2YgdGhlIERURCwgaXMgdXNlZCB0byBsb2NhdGUKLXRoZSBEVEQuPC9wPgotPHA+IDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogWW91IGNhbiBhbHNvIHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5Ci1pbiBhbiBYTUwgQ2F0YWxvZyBlbnRyeS4gSWYgeW91IHVzZSBhIHN5c3RlbSBpZGVudGlmaWVyIGFzIGEgS2V5LCBhIERPQ1RZUEUKLXRhZyBzdWNoIGFzIHRoZSBmb2xsb3dpbmcgb25lIGlzIGluY2x1ZGVkIGluIGFuIFhNTCBmaWxlOjwvcD4KLTxwcmU+Jmx0OyFET0NUWVBFIFJvb3QtbmFtZSBTWVNURU0gIjx2YXIgY2xhc3M9InZhcm5hbWUiPk15RFRELmR0ZDwvdmFyPiImZ3Q7IDwvcHJlPgotPHA+d2hlcmUgIDx2YXIgY2xhc3M9InZhcm5hbWUiPk15RFRELmR0ZDwvdmFyPiBpcyB0aGUgc3lzdGVtIGlkZW50aWZpZXIgdGhhdCBjb3JyZXNwb25kcwotdG8gdGhlIEtleSBvZiBhbiBYTUwgQ2F0YWxvZyBlbnRyeS48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHN0cm9uZz5Bc3NvY2lhdGluZyBhbiBYTUwgZmlsZSB3aXRoIGFuIFhNTCBzY2hlbWE8L3N0cm9uZz48cD5JZiBhbiBYTUwgZmlsZQotaXMgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEsIG9uZSBvciBtb3JlIHNjaGVtYSBsb2NhdGlvbiBhdHRyaWJ1dGVzIGFyZQotaW5jbHVkZWQgaW4gdGhlIFhNTCBmaWxlLiBUaGUgaW5mb3JtYXRpb24gaW4gdGhlIHNjaGVtYUxvY2F0aW9uIGlzIHByb3ZpZGVkCi1hcyBhICJoaW50IiB0byB0aGUgWE1MIHByb2Nlc3Nvci4gVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IHNjaGVtYUxvY2F0aW9uCi1hdHRyaWJ1dGVzLjwvcD4KLTxkaXYgY2xhc3M9InAiPiA8c3Ryb25nPkV4YW1wbGUgMSA8L3N0cm9uZz48cHJlPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBDOlxteXNjaGVtYXNcUHVyY2hhc2VPcmRlci54c2QiJmd0OwotJmx0O3NoaXBUbyBjb3VudHJ5PSJVUyImZ3Q7Ci0uLi48L3ByZT4KLSAgICA8L2Rpdj4KLTxkaXYgY2xhc3M9InAiPjxzdHJvbmc+RXhhbXBsZSAyIDwvc3Ryb25nPjxwcmU+Jmx0O3B1cmNoYXNlT3JkZXIgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSIKLXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIFBPLnhzZCImZ3Q7Ci0mbHQ7c2hpcFRvIGNvdW50cnk9IlVTIiZndDsKLS4uLi48L3ByZT4KLSAgPC9kaXY+Ci08cD5JbiBFeGFtcGxlIDEsIHRoZSBzY2hlbWFMb2NhdGlvbiAnaGludCcgKCdDOlxteXNjaGVtYXNcUHVyY2hhc2VPcmRlci54c2QnKQotcmVmZXJzIGRpcmVjdGx5IHRvIHRoZSBmaWxlIHN5c3RlbSBsb2NhdGlvbiBvciBVUkkgb2YgdGhlIFhNTCBzY2hlbWEuIEluIHRoaXMKLWNhc2UsIHRoZSBzY2hlbWEgZmlsZSB3aWxsIGJlIGxvY2F0ZWQgYnkgdGhlIFhNTCBwcm9jZXNzb3IgZGlyZWN0bHkuPC9wPgotPHA+SW4KLUV4YW1wbGUgMiwgdGhlIHNjaGVtYUxvY2F0aW9uICdoaW50JyAoJ1BPLnhzZCcpIHJlZmVycyB0byBhbiBYTUwgQ2F0YWxvZyBlbnRyeS4KLVBPLnhzZCBjb3JyZXNwb25kcyB0byB0aGUgIDx2YXIgY2xhc3M9InZhcm5hbWUiPktleTwvdmFyPiBvZiB0aGUgWE1MIENhdGFsb2cgZW50cnkKLWZvciBQdXJjaGFzZU9yZGVyLnhzZCwgYW5kIHRoZSBVUkkgb2YgdGhlIFhNTCBDYXRhbG9nIGVudHJ5ICh3aGljaCBjb250YWlucwotaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxvY2F0aW9uIG9mIFB1cmNoYXNlT3JkZXIueHNkKSB3aWxsIGJlIHVzZWQgdG8gbG9jYXRlZAotdGhlIFhNTCBzY2hlbWEuPC9wPgotPHA+SW4gYm90aCBleGFtcGxlcywgPHNhbXAgY2xhc3M9ImNvZGVwaCI+aHR0cDovL3d3dy5pYm0uY29tPC9zYW1wPiBpbgotdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnhzaTpzY2hlbWFMb2NhdGlvbjwvc2FtcD4gdGFnIGlzIGEgVVJJIHRoYXQgaWRlbnRpZmllcyB0aGUgbmFtZXNwYWNlCi1mb3IgdGhlIFhNTCBzY2hlbWEuPC9wPgotPGRpdiBjbGFzcz0icCI+WW91IGNhbiBhbHNvIHVzZSBhIG5hbWVzcGFjZSBhcyBhIEtleSBmb3IgYW4gWE1MCi1DYXRhbG9nIGVudHJ5LiBJZiB5b3UgdXNlIGEgbmFtZXNwYWNlIGFzIGEgS2V5LCBhIHNjaGVtYUxvY2F0aW9uIHRhZyBzdWNoCi1hcyB0aGUgZm9sbG93aW5nIG9uZSBpcyBpbmNsdWRlZCBpbiBhbiBYTUwgZmlsZTo8cHJlPiZsdDtwdXJjaGFzZU9yZGVyIHhtbG5zOj0id3d3LmlibS5jb20iCi14c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBwby94c2QvUHVyY2hhc2VPcmRlci54c2QgIiZndDs8L3ByZT4KLTwvZGl2PgotPHA+VGhlCi1zY2hlbWFMb2NhdGlvbiBhdHRyaWJ1dGUgcG9pbnRzIHRvIGJvdGggdGhlIEtleSBhbmQgdGhlIGFjdHVhbCBsb2NhdGlvbiBvZgotdGhlIHNjaGVtYS48L3A+Ci08cD48c3Ryb25nPkRURCBvciBYTUwgc2NoZW1hIHJlc2lkZXMgb24gYSByZW1vdGUgc2VydmVyPC9zdHJvbmc+PC9wPgotPHA+U2V2ZXJhbAotZnVuY3Rpb25zIGluIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHZhbGlkYXRpb24gYW5kIGNvbnRlbnQgYXNzaXN0LCByZXF1aXJlCi10aGUgYXZhaWxhYmlsaXR5IG9mIGEgRFREIG9yIGFuIFhNTCBzY2hlbWEuIFRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gcHJvdmlkZXMKLXVzYWdlIGluZm9ybWF0aW9uIGZvciBjYXNlcyB3aGVuIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSByZXNpZGVzIG9uIHlvdXIgbG9jYWwKLW1hY2hpbmUuIEhvd2V2ZXIsIGluIG1hbnkgY2FzZXMsIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBjYW4gcmVzaWRlIG9uIGEgcmVtb3RlCi1zZXJ2ZXIsIGZvciBleGFtcGxlOjwvcD4KLTxwPjxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDshRE9DVFlQRSBDYXRhbG9nIFBVQkxJQyAiYWJjL0NhdGFsb2ciCi0iaHR0cDovL3h5ei5hYmMub3JnL2R0ZHMvY2F0YWxvZy5kdGQiJmd0Ozwvc2FtcD48L3A+Ci08cD5Ob3JtYWxseSwgdGhpcyBjYXNlCi1wb3NlcyBubyBwcm9ibGVtLCBiZWNhdXNlIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlCi1yZW1vdGUgc2VydmVyLiBIb3dldmVyLCBpZiB5b3UgYXJlIGJlaGluZCBhIGZpcmV3YWxsLCBhbmQgZG8gbm90IGhhdmUgYSBTT0NLU2lmaWVkCi1zeXN0ZW0sIHRoZSB3b3JrYmVuY2ggY3VycmVudGx5IGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgZm9yIHlvdSB0byBzcGVjaWZ5Ci1hIHNvY2tzIHNlcnZlciBmb3IgcmV0cmlldmluZyBhIERURCBvciBYTUwgc2NoZW1hLiBJZiB5b3UgYXJlIHVuYWJsZSB0byBTT0NLU2lmeQoteW91ciBzeXN0ZW0sIHRoZSB3b3JrYXJvdW5kIGZvciB0aGlzIHByb2JsZW0gaXMgdG8gcmV0cmlldmUgYSBjb3B5IG9mIHRoZQotRFREIG9yIFhNTCBzY2hlbWEgKHVzaW5nIGEgV2ViIGJyb3dzZXIsIGZvciBleGFtcGxlKSBhbmQgc2F2ZSB0aGF0IGNvcHkgb24KLXlvdXIgbG9jYWwgbWFjaGluZS4gVGhlbiwgeW91IGNhbiBlaXRoZXIgcGxhY2UgYSBsb2NhbCBjb3B5IGluIHRoZSBzYW1lIHByb2plY3QKLWFzIHlvdXIgWE1MIGZpbGUsIG9yIHVzZSB0aGUgWE1MIENhdGFsb2cgdG8gYXNzb2NpYXRlIGEgcHVibGljIGlkZW50aWZpZXIKLXdpdGggdGhlIERURCdzIChsb2NhbCkgbG9jYXRpb24uPC9wPgotPHA+PHN0cm9uZz5Ob3RlPC9zdHJvbmc+OiBJZiB5b3UgaGF2ZSBhbiBYTUwgZmlsZQotYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEgb3IgRFREIHRoYXQgaXMgZWxzZXdoZXJlIGluIHRoZSBuZXR3b3JrLCBhbmQKLXlvdSBhcmUgd29ya2luZyBvbiBhIG1hY2hpbmUgZGlzY29ubmVjdGVkIGZyb20gdGhlIG5ldHdvcmssIHlvdSBjYW4gZm9sbG93Ci10aGUgc3RlcHMgZGVzY3JpYmVkIHByZXZpb3VzbHkgaWYgeW91IHdhbnQgdG8gdXNlIGNvbnRlbnQgYXNzaXN0IG9yIHZhbGlkYXRlCi15b3VyIFhNTCBmaWxlLiAgPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5BZHZhbnRhZ2VzIG9mIFhNTCBDYXRhbG9nIGVudHJ5IGFzc29jaWF0aW9uczwvaDQ+PHA+SWYKLXlvdSBjcmVhdGUgYSBkaXJlY3QgYXNzb2NpYXRpb24gYmV0d2VlbiBhbiBYTUwgZmlsZSBhbmQgYW4gWE1MIHNjaGVtYSBvciBEVEQKLWZpbGUsIGFueSB0aW1lIHlvdSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgb3IgRFREIHlvdSBoYXZlIHRvIHRyYWNrCi1kb3duIGFuZCB1cGRhdGUgYWxsIG9mIHRoZSByZWZlcmVuY2luZyBYTUwgZmlsZXMgd2l0aCB0aGUgbmV3IGxvY2F0aW9uIG9mCi10aGUgRFREIG9yIHNjaGVtYS4gSWYsIGhvd2V2ZXIsIHlvdSBhc3NvY2lhdGUgYW4gWE1MIGZpbGUgd2l0aCBhbiBYTUwgc2NoZW1hCi1vciBEVEQgS2V5LCB0aGVuLCB3aGVuIHlvdSBjaGFuZ2UgdGhlIGxvY2F0aW9uIG9mIHRoZSBzY2hlbWEgb3IgRFRELCB5b3Ugb25seQotaGF2ZSB0byB1cGRhdGUgdGhlIFhNTCBDYXRhbG9nIGVudHJ5LCBpbnN0ZWFkIG9mIGVhY2ggaW5kaXZpZHVhbCBYTUwgZmlsZS48L3A+Ci08cD5Gb3IKLWV4YW1wbGUsIHlvdSBoYXZlIGEgRFREIGNhbGxlZCAiQnVpbGRpbmcuZHRkIiwgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIGZpdmUKLVhNTCBmaWxlcyAtIE9mZmljZS54bWwsIEhvdXNlLnhtbCwgQXBhcnRtZW50LnhtbCwgQmFuay54bWwsIGFuZCBQb3N0T2ZmaWNlLnhtbC4KLVlvdSBtb3ZlIHRoZSBEVEQgZmlsZSBCdWlsZGluZy5kdGQgdG8gYSBuZXcgbG9jYXRpb24uIElmIHlvdSBoYXZlIGEgZGlyZWN0aW9uCi1hc3NvY2lhdGlvbiBiZXR3ZWVuIEJ1aWxkaW5nLmR0ZCBhbmQgYWxsIHRoZSBYTUwgZmlsZXMsIHlvdSB3aWxsIGhhdmUgdG8gdXBkYXRlCi10aGUgJmx0O0RPQ1RUWVBFJmd0OyBkZWNsYXJhdGlvbiBpbiBlYWNoIFhNTCBmaWxlIHRvIHJlZmxlY3QgdGhlIG5ldyBsb2NhdGlvbgotb2YgQnVpbGRpbmcuZHRkLiBJZiwgaG93ZXZlciwgeW91IGhhdmUgYW4gWE1MIENhdGFsb2cgYXNzb2NpYXRpb24sCi1hbmQgYWxsIHRoZSBYTUwgZmlsZXMganVzdCByZWZlciB0byB0aGUgS2V5IG9mIEJ1aWxkaW5nLmR0ZCwgdGhlbiB5b3Ugb25seQotaGF2ZSB0byB1cGRhdGUgdGhlIFVSSSBhbmQgYWxsIHRoZSBYTUwgZmlsZXMgd2lsbCBwb2ludCB0byB0aGUgbmV3IGxvY2F0aW9uCi1vZiBCdWlsZGluZy5kdGQuPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5VcGRhdGluZyBhbiBlbnRyeSBpbiB0aGUgWE1MIENhdGFsb2c8L2g0PjxwPkFmdGVyIHlvdSBoYXZlCi11cGRhdGVkIGFuIGVudHJ5IGluIHRoZSBYTUwgQ2F0YWxvZywgeW91IG1pZ2h0IG5lZWQgdG8gcmVmcmVzaCB0aGUgWE1MIGVkaXRvcgotdmlldyBzbyB0aGF0IGl0IHVzZXMgdGhlIG5ldyBpbmZvcm1hdGlvbi4gVG8gZG8gdGhpcywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbG9hZAotRGVwZW5kZW5jaWVzPC9zcGFuPiB0b29sYmFyIGJ1dHRvbiA8aW1nIHNyYz0iLi4vaW1hZ2VzL3JsZGdybXIuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgUmVsb2FkIERlcGVuZGVuY2llcyB0b29sYmFyIGJ1dHRvbiIgLz4gYW5kCi10aGUgdmlldyB3aWxsIGJlIHVwZGF0ZWQgdXNpbmcgdGhlIGN1cnJlbnQgWE1MIENhdGFsb2cgc2V0dGluZ3MuIFlvdSBvbmx5Ci1uZWVkIHRvIHJlZnJlc2ggdGhlIFhNTCBlZGl0b3IgdmlldyB3aGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIG9wZW4gdGhhdCByZWZlcmVuY2VzCi10aGUgWE1MIENhdGFsb2cgZW50cnkgdGhhdCB3YXMgdXBkYXRlZC48L3A+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIKLXRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBYTUwgZmlsZXMuIj5YTUwgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzICh0aGF0IGlzLCBhIHNldCBvZiBydWxlcykgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHByb2MuaHRtbCIgdGl0bGU9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBwYXNzIGFsb25nIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiB0aXRsZT0iVGhlIFhNTCBlZGl0b3IgaGFzIGEgRGVzaWduIHZpZXcsIHdoaWNoIHJlcHJlc2VudHMgdGhlIFhNTCBmaWxlIHNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcgZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLCB3aGlsZSBwb3AtdXAgbWVudXMgb24gdGhlIHRyZWUgZWxlbWVudHMgZ2l2ZSBhbHRlcm5hdGl2ZXMgdGhhdCBhcmUgdmFsaWQgZm9yIHRoYXQgcGFydGljdWxhciBlbGVtZW50LiI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iPkVkaXRpbmcgaW4gdGhlIFNvdXJjZSB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyZTNlYWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sZW5jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIiAgImNvbmNlcHQuZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTxjb25jZXB0IGlkPSJjeG1sZW5jIiB4bWw6bGFuZz0iZW4tdXMiPjw/UHViIENhcmV0Pz4NCi08dGl0bGU+WE1MIGFuZCBIVE1MIGVuY29kaW5nczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIGFuZCBIVE1MIGVuY29kaW5nczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5FbmNvZGluZ3MgZW5hYmxlIHlvdSB0byBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHlvdXIgdGV4dA0KLWlzIGluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPkVuY29kaW5nczxpbmRleHRlcm0+SFRNTDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+RW5jb2RpbmdzPGluZGV4dGVybT5YTUw8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPGNvbmJvZHk+DQotPHA+VGhlIElBTkEgbmFtZSBpcyB1c2VkIGluIHRoZSBlbmNvZGluZyBzdGF0ZW1lbnQgb2YgYW4gWE1MIGZpbGUsIG9yIGNoYXJzZXQNCi1kaXJlY3RpdmUgaW4gYW4gSFRNTCBmaWxlLjwvcD4NCi08cD5UaGUgSFRNTCBhbmQgWE1MIGVkaXRvcnMgc3VwcG9ydCB0aGUgZm9sbG93aW5nIGVuY29kaW5nczo8L3A+DQotPHRhYmxlIHJvd2hlYWRlcj0iZmlyc3Rjb2wiPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0aGVhZD4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCIgdmFsaWduPSJ0b3AiPiA8cD48Yj5YTUwgRW5jb2RpbmcgKElBTkEgTmFtZSk8L2I+PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSIgdmFsaWduPSJ0b3AiPiA8cD48Yj5EZXNjcmlwdGlvbjwvYj48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPC90aGVhZD4NCi08dGJvZHk+DQotPHJvdz4NCi08ZW50cnk+IDxwPkJJRzU8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5CaWc1LCBUcmFkaXRpb25hbCBDaGluZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5FVUMtSlA8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5FVUMgZW5jb2RpbmcsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5FVUMtS1I8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5FVUMgZW5jb2RpbmcsIEtvcmVhbjwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+R0IyMzEyPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+R0JLLCBTaW1wbGlmaWVkIENoaW5lc2U8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+R0IxODAzMDwvZW50cnk+DQotPGVudHJ5Pk5hdGlvbmFsIFN0YW5kYXJkLCBDaGluZXNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JQk04NjQ8L2VudHJ5Pg0KLTxlbnRyeT5QQyBBcmFiaWMgKGVuY29kaW5nIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFBhZ2UgRGVzaWduZXIgRGVzaWduIHBhZ2UuDQotKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy0yMDIyLUpQPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SVNPIDIwMjIsIEphcGFuZXNlPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5JU08tMjAyMi1LUjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPklTTyAyMDIyLCBLb3JlYW48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPklTTy04ODU5LTE8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gTGF0aW4tMTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS0yPC9lbnRyeT4NCi08ZW50cnk+Q2VudHJhbC9FYXN0IEV1cm9wZWFuIChTbGF2aWMpPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5JU08tODg1OS0zPC9lbnRyeT4NCi08ZW50cnk+U291dGhlcm4gRXVyb3BlYW48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTQ8L2VudHJ5Pg0KLTxlbnRyeT5JU08gODg1OS00LCBDeXJpbGxpYzwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktNTwvZW50cnk+DQotPGVudHJ5PklTTyA4ODU5LTUsIEN5cmlsbGljPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTg4NTktNjwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkFyYWJpYyAoTG9naWNhbCk8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+SVNPLTg4NTktNzwvZW50cnk+DQotPGVudHJ5PkdyZWVrPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTg4NTktOC1JPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SGVicmV3IChMb2dpY2FsKTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+SVNPLTg4NTktODwvcD4gPC9lbnRyeT4NCi08ZW50cnk+IDxwPkhlYnJldyAoVmlzdWFsKShlbmNvZGluZyBzdXBwb3J0ZWQsIGJ1dCBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBQYWdlDQotRGVzaWduZXIgRGVzaWduIHBhZ2UpPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PklTTy04ODU5LTk8L2VudHJ5Pg0KLTxlbnRyeT5UdXJraXNoPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+U0hJRlRfSklTPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+U2hpZnQtSklTLCBKYXBhbmVzZTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT5USVMtNjIwPC9lbnRyeT4NCi08ZW50cnk+VElTSSwgVGhhaTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVTLUFTQ0lJPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+VVMgQVNDSUk8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi04PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SVNPIDEwNjQ2L1VuaWNvZGUsIG9uZS1ieXRlIGVuY29kaW5nPC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5VVEYtMTY8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gMTA2NDYvVW5pY29kZSwgdHdvLWJ5dGUgZW5jb2Rpbmc8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi0xNkJFPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+VW5pY29kZSBCaWdFbmRpYW48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxwPlVURi0xNkxFPC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+VW5pY29kZSBMaXR0bGVFbmRpYW48L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+V0lORE9XUy04NzQ8L2VudHJ5Pg0KLTxlbnRyeT5UaGFpLCA8dG0gdG1jbGFzcz0ic3BlY2lhbCIgdG1vd25lcj0iTWljcm9zb2Z0IENvcnBvcmF0aW9uIiB0bXR5cGU9InJlZyINCi10cmFkZW1hcms9Ik1pY3Jvc29mdCI+TWljcm9zb2Z0PC90bT48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5XSU5ET1dTLTEyNTI8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5JU08gTGF0aW4tMTwvcD4gPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPHA+V0lORE9XUy0xMjU1PC9wPiA8L2VudHJ5Pg0KLTxlbnRyeT4gPHA+SGVicmV3PC9wPiA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8cD5XSU5ET1dTLTEyNTY8L3A+IDwvZW50cnk+DQotPGVudHJ5PiA8cD5BcmFiaWM8L3A+IDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+WC1FVUMtSlA8L2VudHJ5Pg0KLTxlbnRyeT5FVUMgZW5jb2RpbmcsIEphcGFuZXNlIChhbGlhcyBmb3IgRVVDLUpQKTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+WC1TSklTPC9lbnRyeT4NCi08ZW50cnk+U2hpZnQtSklTLCBKYXBhbmVzZSAoYWxpYXMgZm9yIFNISUZUX0pJUyk8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT4NCi08L2NvbmJvZHk+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAzOTkxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxlbmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmIxMDE4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbGVuYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJjb25jZXB0IiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlhNTCBhbmQgSFRNTCBlbmNvZGluZ3MiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iRW5jb2RpbmdzIGVuYWJsZSB5b3UgdG8gc3BlY2lmeSB3aGF0IGNoYXJhY3RlciBlbmNvZGluZyB5b3VyIHRleHQgaXMgaW4uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVuY29kaW5ncyBlbmFibGUgeW91IHRvIHNwZWNpZnkgd2hhdCBjaGFyYWN0ZXIgZW5jb2RpbmcgeW91ciB0ZXh0IGlzIGluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IkVuY29kaW5ncywgSFRNTCwgWE1MIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iRW5jb2RpbmdzLCBIVE1MLCBYTUwiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9ImN4bWxlbmMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sZW5jIj48YSBuYW1lPSJjeG1sZW5jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5YTUwgYW5kIEhUTUwgZW5jb2RpbmdzPC9oMT4KLQotCi0KLQotPGRpdj48cD5FbmNvZGluZ3MgZW5hYmxlIHlvdSB0byBzcGVjaWZ5IHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIHlvdXIgdGV4dAotaXMgaW4uPC9wPgotCi08cD5UaGUgSUFOQSBuYW1lIGlzIHVzZWQgaW4gdGhlIGVuY29kaW5nIHN0YXRlbWVudCBvZiBhbiBYTUwgZmlsZSwgb3IgY2hhcnNldAotZGlyZWN0aXZlIGluIGFuIEhUTUwgZmlsZS48L3A+Ci0KLTxwPlRoZSBIVE1MIGFuZCBYTUwgZWRpdG9ycyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgZW5jb2RpbmdzOjwvcD4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGhlYWQgYWxpZ249ImxlZnQiPgotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAwN0IiPiA8cD48c3Ryb25nPlhNTCBFbmNvZGluZyAoSUFOQSBOYW1lKTwvc3Ryb25nPjwvcD4KLSA8L3RoPgotCi08dGggdmFsaWduPSJ0b3AiIGlkPSJOMTAwOEQiPiA8cD48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC9wPgotIDwvdGg+Ci0KLTwvdHI+Ci0KLTwvdGhlYWQ+Ci0KLTx0Ym9keT4KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMEFCIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+QklHNTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBBQiBOMTAwOEQgIj4gPHA+QmlnNSwgVHJhZGl0aW9uYWwgQ2hpbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBDQiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPkVVQy1KUDwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBDQiBOMTAwOEQgIj4gPHA+RVVDIGVuY29kaW5nLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDBFQiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPkVVQy1LUjwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBFQiBOMTAwOEQgIj4gPHA+RVVDIGVuY29kaW5nLCBLb3JlYW48L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxMEIiIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5HQjIzMTI8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMEIgTjEwMDhEICI+IDxwPkdCSywgU2ltcGxpZmllZCBDaGluZXNlPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTJCIiBoZWFkZXJzPSJOMTAwN0IgIj5HQjE4MDMwPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxMkIgTjEwMDhEICI+TmF0aW9uYWwgU3RhbmRhcmQsIENoaW5lc2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDEzRiIgaGVhZGVycz0iTjEwMDdCICI+SUJNODY0PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxM0YgTjEwMDhEICI+UEMgQXJhYmljIChlbmNvZGluZyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBQYWdlIERlc2lnbmVyIERlc2lnbiBwYWdlLgotKTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTUzIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+SVNPLTIwMjItSlA8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxNTMgTjEwMDhEICI+IDxwPklTTyAyMDIyLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDE3MyIgaGVhZGVycz0iTjEwMDdCICI+IDxwPklTTy0yMDIyLUtSPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMTczIE4xMDA4RCAiPiA8cD5JU08gMjAyMiwgS29yZWFuPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMTkzIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+SVNPLTg4NTktMTwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDE5MyBOMTAwOEQgIj4gPHA+SVNPIExhdGluLTE8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxQjMiIGhlYWRlcnM9Ik4xMDA3QiAiPklTTy04ODU5LTI8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFCMyBOMTAwOEQgIj5DZW50cmFsL0Vhc3QgRXVyb3BlYW4gKFNsYXZpYyk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDFDNyIgaGVhZGVycz0iTjEwMDdCICI+SVNPLTg4NTktMzwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMUM3IE4xMDA4RCAiPlNvdXRoZXJuIEV1cm9wZWFuPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAxREIiIGhlYWRlcnM9Ik4xMDA3QiAiPklTTy04ODU5LTQ8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDFEQiBOMTAwOEQgIj5JU08gODg1OS00LCBDeXJpbGxpYzwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMUVGIiBoZWFkZXJzPSJOMTAwN0IgIj5JU08tODg1OS01PC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAxRUYgTjEwMDhEICI+SVNPIDg4NTktNSwgQ3lyaWxsaWM8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDIwMyIgaGVhZGVycz0iTjEwMDdCICI+IDxwPklTTy04ODU5LTY8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyMDMgTjEwMDhEICI+IDxwPkFyYWJpYyAoTG9naWNhbCk8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyMjMiIGhlYWRlcnM9Ik4xMDA3QiAiPklTTy04ODU5LTc8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDIyMyBOMTAwOEQgIj5HcmVlazwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjM3IiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+SVNPLTg4NTktOC1JPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjM3IE4xMDA4RCAiPiA8cD5IZWJyZXcgKExvZ2ljYWwpPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMjU3IiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+SVNPLTg4NTktODwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI1NyBOMTAwOEQgIj4gPHA+SGVicmV3IChWaXN1YWwpKGVuY29kaW5nIHN1cHBvcnRlZCwgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgdGhlIFBhZ2UKLURlc2lnbmVyIERlc2lnbiBwYWdlKTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDI3NyIgaGVhZGVycz0iTjEwMDdCICI+SVNPLTg4NTktOTwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMjc3IE4xMDA4RCAiPlR1cmtpc2g8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDI4QiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPlNISUZUX0pJUzwvcD4KLSA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDI4QiBOMTAwOEQgIj4gPHA+U2hpZnQtSklTLCBKYXBhbmVzZTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDJBQiIgaGVhZGVycz0iTjEwMDdCICI+VElTLTYyMDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMkFCIE4xMDA4RCAiPlRJU0ksIFRoYWk8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDJCRiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPlVTLUFTQ0lJPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMkJGIE4xMDA4RCAiPiA8cD5VUyBBU0NJSTwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDJERiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPlVURi04PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMkRGIE4xMDA4RCAiPiA8cD5JU08gMTA2NDYvVW5pY29kZSwgb25lLWJ5dGUgZW5jb2Rpbmc8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAyRkYiIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5VVEYtMTY8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAyRkYgTjEwMDhEICI+IDxwPklTTyAxMDY0Ni9Vbmljb2RlLCB0d28tYnl0ZSBlbmNvZGluZzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDMxRiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPlVURi0xNkJFPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMzFGIE4xMDA4RCAiPiA8cD5Vbmljb2RlIEJpZ0VuZGlhbjwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDMzRiIgaGVhZGVycz0iTjEwMDdCICI+IDxwPlVURi0xNkxFPC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMzNGIE4xMDA4RCAiPiA8cD5Vbmljb2RlIExpdHRsZUVuZGlhbjwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDM1RiIgaGVhZGVycz0iTjEwMDdCICI+V0lORE9XUy04NzQ8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDM1RiBOMTAwOEQgIj5UaGFpLCBNaWNyb3NvZnQ8c3VwPsKuPC9zdXA+PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzN0MiIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5XSU5ET1dTLTEyNTI8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzN0MgTjEwMDhEICI+IDxwPklTTyBMYXRpbi0xPC9wPgotIDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwMzlDIiBoZWFkZXJzPSJOMTAwN0IgIj4gPHA+V0lORE9XUy0xMjU1PC9wPgotIDwvdGg+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMzlDIE4xMDA4RCAiPiA8cD5IZWJyZXc8L3A+Ci0gPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRoIHZhbGlnbj0idG9wIiBjbGFzcz0iZmlyc3Rjb2wiIGlkPSJOMTAzQkMiIGhlYWRlcnM9Ik4xMDA3QiAiPiA8cD5XSU5ET1dTLTEyNTY8L3A+Ci0gPC90aD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAzQkMgTjEwMDhEICI+IDxwPkFyYWJpYzwvcD4KLSA8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGggdmFsaWduPSJ0b3AiIGNsYXNzPSJmaXJzdGNvbCIgaWQ9Ik4xMDNEQyIgaGVhZGVycz0iTjEwMDdCICI+WC1FVUMtSlA8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDNEQyBOMTAwOEQgIj5FVUMgZW5jb2RpbmcsIEphcGFuZXNlIChhbGlhcyBmb3IgRVVDLUpQKTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0aCB2YWxpZ249InRvcCIgY2xhc3M9ImZpcnN0Y29sIiBpZD0iTjEwM0YwIiBoZWFkZXJzPSJOMTAwN0IgIj5YLVNKSVM8L3RoPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDNGMCBOMTAwOEQgIj5TaGlmdC1KSVMsIEphcGFuZXNlIChhbGlhcyBmb3IgU0hJRlRfSklTKTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxZTAwMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWx0b29sLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iICAiY29uY2VwdC5kdGQiPg0KLTxjb25jZXB0IGlkPSJjeG1sdG9vbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+WE1MIHRvb2xzIC0gb3ZlcnZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCB0b29scyAtIG92ZXJ2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoaXMgcHJvZHVjdCBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgdmlzdWFsIFhNTCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4NCi1UaGUgdG9vbCBzZXQgaW5jbHVkZXMgY29tcG9uZW50cyBmb3IgYnVpbGRpbmcgRFREcywgWE1MIHNjaGVtYXMsIGFuZCBYTUwgZmlsZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHRvb2xzPGluZGV4dGVybT5vdmVydmlldzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08Y29uYm9keT4NCi08cD5UaGUgZm9sbG93aW5nIFhNTCB0b29scyBhcmUgYXZhaWxhYmxlLiA8L3A+DQotPHA+VGhlIDxiPlhNTCBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiBZb3UNCi1jYW4gdXNlIGl0IHRvIGNyZWF0ZSBuZXcgWE1MIGZpbGVzLCBlaXRoZXIgZnJvbSBzY3JhdGNoLCBleGlzdGluZyBEVERzLCBvcg0KLWV4aXN0aW5nIFhNTCBzY2hlbWFzLiBZb3UgY2FuIGFsc28gdXNlIGl0IHRvIGVkaXQgWE1MIGZpbGVzLCBhc3NvY2lhdGUgdGhlbQ0KLXdpdGggRFREcyBvciBzY2hlbWFzLCBhbmQgdmFsaWRhdGUgdGhlbS4gPC9wPg0KLTxwPiBUaGUgPGI+RFREIGVkaXRvcjwvYj4gaXMgYSB0b29sIGZvciBjcmVhdGluZyBhbmQgdmlld2luZyBEVERzLiAgIDwvcD4NCi08cD5UaGUgPGI+WE1MIHNjaGVtYSBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcsIHZpZXdpbmcsIGFuZCB2YWxpZGF0aW5nDQotWE1MIHNjaGVtYXMuIFlvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIGVkaXRvciB0byBwZXJmb3JtIHRhc2tzIHN1Y2ggYXMgY3JlYXRpbmcNCi1YTUwgc2NoZW1hIGNvbXBvbmVudHMgYW5kIGltcG9ydGluZyBhbmQgdmlld2luZyBYTUwgc2NoZW1hcy4gPC9wPjw/UHViIENhcmV0MT8+DQotPHA+PGI+Tm90ZXM6PC9iPjwvcD4NCi08c2VjdGlvbj5FeGVyY2lzZSBjYXV0aW9uIHdoZW4gb3BlbmluZyBsYXJnZSBmaWxlcyB3aXRoIGFueSBvZiB0aGUgWE1MIGVkaXRvcnMuDQotSWYgdGhlIG1lbW9yeSBsaW1pdHMgb2YgdGhlIHdvcmtiZW5jaCBhcmUgZXhjZWVkZWQsIGl0IHdpbGwgYWJydXB0bHkgY2xvc2UNCi13aXRob3V0IHNhdmluZyBhbnkgZGF0YSAoYW5kIHdpdGhvdXQgd2FybmluZyBvciBlcnJvciBtZXNzYWdlcykuIFRoZSBudW1iZXINCi1vZiBlbGVtZW50cyBpbiBhbiBYTUwgZmlsZSwgbm90IGl0cyBzaXplLCBpcyB0aGUgYmVzdCBpbmRpY2F0b3Igb2YgaG93IG11Y2gNCi1tZW1vcnkgd2lsbCBiZSByZXF1aXJlZC4gTWVtb3J5IHJlcXVpcmVtZW50cyBhbHNvIGRlcGVuZCBvbiB3aGF0IGVsc2UgaXMgb3Blbg0KLWluIHRoZSB3b3JrYmVuY2ggLSBpbiBzb21lIGNhc2VzIHlvdSBjYW4gb3BlbiBhIGZpZnRlZW4gbWVnYWJ5dGVzIGZpbGUsIGJ1dA0KLWluIG90aGVyIGNhc2VzIGEgb25lIG1lZ2FieXRlIGZpbGUgbWlnaHQgY2F1c2UgcHJvYmxlbXMuIFRoZXJlZm9yZSwgd2UgcmVjb21tZW5kDQoteW91IHNhdmUgYWxsIGRhdGEgaW4gdGhlIHdvcmtiZW5jaCBiZWZvcmUgb3BlbmluZyBsYXJnZSBYTUwgZmlsZXMuIFRoaXMgaXMNCi1hIHBlcm1hbmVudCByZXN0cmljdGlvbi48L3NlY3Rpb24+DQotPHNlY3Rpb24gY29ucmVmPSJybGltaXRhdGlvbnNfc2x1c2hYTUwuZGl0YSNybGltaXRhdGlvbnNfc2x1c2hYTUwvdW5yZXNvbHZfVVJJIj48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMjA2ND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sdG9vbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sdG9vbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjY5NjMzLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHRvb2wuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IURPQ1RZUEUgaHRtbAotICBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbD4KLTxoZWFkPgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIC8+Ci08dGl0bGU+WE1MIHRvb2xzIC0gb3ZlcnZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9ImN4bWx0b29sIj48YSBuYW1lPSJjeG1sdG9vbCI+PCEtLSAtLT48L2E+Ci0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCB0b29scyAtIG92ZXJ2aWV3PC9oMT4KLTxkaXY+PHA+VGhpcyBwcm9kdWN0IHByb3ZpZGVzIGEgY29tcHJlaGVuc2l2ZSB2aXN1YWwgWE1MIGRldmVsb3BtZW50IGVudmlyb25tZW50LgotVGhlIHRvb2wgc2V0IGluY2x1ZGVzIGNvbXBvbmVudHMgZm9yIGJ1aWxkaW5nIERURHMsIFhNTCBzY2hlbWFzLCBhbmQgWE1MIGZpbGVzLjwvcD48cD5UaGUgZm9sbG93aW5nIFhNTCB0b29scyBhcmUgYXZhaWxhYmxlOjwvcD4KLTxwPlRoZSA8Yj5YTUwgZWRpdG9yPC9iPiBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4gWW91Ci1jYW4gdXNlIGl0IHRvIGNyZWF0ZSBuZXcgWE1MIGZpbGVzLCBlaXRoZXIgZnJvbSBzY3JhdGNoLCBleGlzdGluZyBEVERzLCBvcgotZXhpc3RpbmcgWE1MIHNjaGVtYXMuIFlvdSBjYW4gYWxzbyB1c2UgaXQgdG8gZWRpdCBYTUwgZmlsZXMsIGFzc29jaWF0ZSB0aGVtCi13aXRoIERURHMgb3Igc2NoZW1hcywgYW5kIHZhbGlkYXRlIHRoZW0uPC9wPgotPHA+VGhlIDxiPkRURCBlZGl0b3I8L2I+IGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgRFREcy4gPC9wPgotPHA+VGhlIDxiPlhNTCBzY2hlbWEgZWRpdG9yPC9iPiBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyAKLVhNTCBzY2hlbWFzLiBZb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSBlZGl0b3IgdG8gcGVyZm9ybSB0YXNrcyBzdWNoIGFzIGNyZWF0aW5nIAotWE1MIHNjaGVtYSBjb21wb25lbnRzIGFuZCBpbXBvcnRpbmcgYW5kIHZpZXdpbmcgWE1MIHNjaGVtYXMuIDwvcD4KLTxkaXYgY2xhc3M9InNraXBzcGFjZSI+RXhlcmNpc2UgY2F1dGlvbiB3aGVuIG9wZW5pbmcgbGFyZ2UgZmlsZXMgd2l0aCBhbnkgb2YgdGhlIFhNTCBlZGl0b3JzLgotSWYgdGhlIG1lbW9yeSBsaW1pdHMgb2YgdGhlIHdvcmtiZW5jaCBhcmUgZXhjZWVkZWQsIGl0IHdpbGwgYWJydXB0bHkgY2xvc2UKLXdpdGhvdXQgc2F2aW5nIGFueSBkYXRhIChhbmQgd2l0aG91dCB3YXJuaW5nIG9yIGVycm9yIG1lc3NhZ2VzKS4gVGhlIG51bWJlcgotb2YgZWxlbWVudHMgaW4gYW4gWE1MIGZpbGUsIG5vdCBpdHMgc2l6ZSwgaXMgdGhlIGJlc3QgaW5kaWNhdG9yIG9mIGhvdyBtdWNoCi1tZW1vcnkgd2lsbCBiZSByZXF1aXJlZC4gTWVtb3J5IHJlcXVpcmVtZW50cyBhbHNvIGRlcGVuZCBvbiB3aGF0IGVsc2UgaXMgb3BlbgotaW4gdGhlIHdvcmtiZW5jaCAtIGluIHNvbWUgY2FzZXMgeW91IGNhbiBvcGVuIGEgMTUgbWVnYWJ5dGVzIGZpbGUsIGJ1dCBpbgotb3RoZXIgY2FzZXMgYSBvbmUtbWVnYWJ5dGUgZmlsZSBtYXkgY2F1c2UgcHJvYmxlbXMuIFRoZXJlZm9yZSwgd2UgcmVjb21tZW5kCi15b3Ugc2F2ZSBhbGwgZGF0YSBpbiB0aGUgd29ya2JlbmNoIGJlZm9yZSBvcGVuaW5nIGxhcmdlIFhNTCBmaWxlcy4gVGhpcyBpcwotYSBwZXJtYW5lbnQgcmVzdHJpY3Rpb24uPC9kaXY+Ci08ZGl2IGNsYXNzPSJza2lwc3BhY2UiPjxwPlRoZQotYmVoYXZpb3Igb2YgdGhlIFhNTCBwYXJzZXIgd2hlbiBlbmNvdW50ZXJpbmcgYW4gdW5yZXNvbHZhYmxlIFVSSSAoZm9yIGV4YW1wbGUsCi1pbiBhIERPQ1RZUEUgZGVjbGFyYXRpb24pIGlzIHRvIHJlcG9ydCBhIGZhdGFsIElPIGVycm9yIGFuZCBzdG9wIGFueSBmdXJ0aGVyCi1wcm9jZXNzaW5nLiBBbiB1bnJlc29sdmVkIFVSSSBpcyBzZWVuIG5laXRoZXIgYXMgYSBzeW50YWN0aWMgbm9yIGEgc2VtYW50aWMKLWVycm9yIGFuZCBhcyBzdWNoLCB0aGUgcGFyc2VyIGRvZXMgbm90IGF0dGVtcHQgdG8gaGFuZGxlIGl0LiBFc3NlbnRpYWxseSwKLXRoZSBkb2N1bWVudCByZW1haW5zIHVuY2hlY2tlZC4gVGhpcyBpcyBhIGtub3duIHByb2JsZW0uPC9wPgotPC9kaXY+Ci08L2Rpdj4KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmJlNzE0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmV4dGN0bi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJyZXh0Y3RuIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIFhNTCBkb2N1bWVudHMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQgdG8gZXh0ZW5kDQotdGhlIGNvbnRlbnQgbW9kZWwgb2YgYW4gWE1MIGRvY3VtZW50Ljwvc2hvcnRkZXNjPg0KLTxyZWZib2R5Pg0KLTxzZWN0aW9uPjxwPkZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbiBYTUwgc2NoZW1hIGZpbGUgY2FsbGVkIEJvb2sueHNkIHRoYXQNCi1jb250YWlucyBhIGNvbXBsZXggdHlwZSBjYWxsZWQgQm9va1R5cGUuIEJvb2tUeXBlIGNvbnRhaW5zIDQgZWxlbWVudHMgKHRpdGxlLA0KLWF1dGhvciwgeWVhciwgYW5kIElTQk4pIGFuZCBvbmUgIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQuIFRoZSBuYW1lc3BhY2UNCi1mb3IgdGhlIDxjb2RlcGg+YW55PC9jb2RlcGg+ICBlbGVtZW50IGlzICA8Y29kZXBoPiMjYW55PC9jb2RlcGg+LiBUaGlzIG1lYW5zDQotdGhhdCBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudCwgeW91IGNhbiBpbnNlcnQgYW55IFhNTCBlbGVtZW50IHRvIGV4dGVuZCB0aGUNCi1kZWZpbml0aW9uIG9mIHRoZSBCb29rVHlwZS48L3A+PHA+WW91IGNhbiBhbHNvIHByb3ZpZGUgYSBtb3JlIHNwZWNpZmljIG5hbWVzcGFjZS4NCi1Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW5vdGhlciBzY2hlbWEgY2FsbGVkIE15X0Jvb2sueHNkLCB3aGljaCBjb250YWlucyBhDQotY29tcGxleCB0eXBlIGNhbGxlZCBNeV9Cb29rVHlwZS4gTXlfQm9va1R5cGUgY29udGFpbnMgNCBlbGVtZW50cyAodGl0bGUsIGF1dGhvciwNCi15ZWFyLCBhbmQgSVNCTikgYW5kIG9uZSAgPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCwgYnV0IGluIHRoaXMgY2FzZSB0aGUNCi1uYW1lc3BhY2UgZm9yIHRoZSAgQm9va1R5cGUgZWxlbWVudCBpcyB3d3cud2VzbGV5LmNvbS4gVGhpcyBtZWFucyB0aGF0IGluDQotYW4gaW5zdGFuY2UgZG9jdW1lbnQsIHlvdSBjYW4gaW5zZXJ0IGFueSBYTUwgZWxlbWVudCB0byBleHRlbmQgdGhlIGRlZmluaXRpb24NCi1vZiB0aGUgQm9va1R5cGUsIHByb3ZpZGVkIHRoYXQgdGhleSBiZWxvbmcgdG8gdGhlIG5hbWVzcGFjZSBodHRwOi8vd3d3Lndlc2xleS5jb20uPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yZXh0Y3RuLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU5MDg2Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JleHRjdG4uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSBhbnkgZWxlbWVudCB0byBleHRlbmQgdGhlIGNvbnRlbnQgbW9kZWwgb2YgYW4gWE1MIGRvY3VtZW50LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgWE1MIHNjaGVtYSBhbnkgZWxlbWVudCB0byBleHRlbmQgdGhlIGNvbnRlbnQgbW9kZWwgb2YgYW4gWE1MIGRvY3VtZW50LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJyZXh0Y3RuIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmV4dGN0biI+PGEgbmFtZT0icmV4dGN0biI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgZG9jdW1lbnRzIHdpdGggbXVsdGlwbGUgbmFtZXNwYWNlczwvaDE+Ci0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSBYTUwgc2NoZW1hIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCB0byBleHRlbmQKLXRoZSBjb250ZW50IG1vZGVsIG9mIGFuIFhNTCBkb2N1bWVudC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbiBYTUwgc2NoZW1hIGZpbGUgY2FsbGVkIEJvb2sueHNkIHRoYXQKLWNvbnRhaW5zIGEgY29tcGxleCB0eXBlIGNhbGxlZCBCb29rVHlwZS4gQm9va1R5cGUgY29udGFpbnMgNCBlbGVtZW50cyAodGl0bGUsCi1hdXRob3IsIHllYXIsIGFuZCBJU0JOKSBhbmQgb25lICA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQuIFRoZSBuYW1lc3BhY2UKLWZvciB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiAgZWxlbWVudCBpcyAgPHNhbXAgY2xhc3M9ImNvZGVwaCI+IyNhbnk8L3NhbXA+LiBUaGlzIG1lYW5zCi10aGF0IGluIGFuIGluc3RhbmNlIGRvY3VtZW50LCB5b3UgY2FuIGluc2VydCBhbnkgWE1MIGVsZW1lbnQgdG8gZXh0ZW5kIHRoZQotZGVmaW5pdGlvbiBvZiB0aGUgQm9va1R5cGUuPC9wPgotPHA+WW91IGNhbiBhbHNvIHByb3ZpZGUgYSBtb3JlIHNwZWNpZmljIG5hbWVzcGFjZS4KLUZvciBleGFtcGxlLCB5b3UgaGF2ZSBhbm90aGVyIHNjaGVtYSBjYWxsZWQgTXlfQm9vay54c2QsIHdoaWNoIGNvbnRhaW5zIGEKLWNvbXBsZXggdHlwZSBjYWxsZWQgTXlfQm9va1R5cGUuIE15X0Jvb2tUeXBlIGNvbnRhaW5zIDQgZWxlbWVudHMgKHRpdGxlLCBhdXRob3IsCi15ZWFyLCBhbmQgSVNCTikgYW5kIG9uZSAgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50LCBidXQgaW4gdGhpcyBjYXNlIHRoZQotbmFtZXNwYWNlIGZvciB0aGUgIEJvb2tUeXBlIGVsZW1lbnQgaXMgd3d3Lndlc2xleS5jb20uIFRoaXMgbWVhbnMgdGhhdCBpbgotYW4gaW5zdGFuY2UgZG9jdW1lbnQsIHlvdSBjYW4gaW5zZXJ0IGFueSBYTUwgZWxlbWVudCB0byBleHRlbmQgdGhlIGRlZmluaXRpb24KLW9mIHRoZSBCb29rVHlwZSwgcHJvdmlkZWQgdGhhdCB0aGV5IGJlbG9uZyB0byB0aGUgbmFtZXNwYWNlIGh0dHA6Ly93d3cud2VzbGV5LmNvbS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2VlNGIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWE1MLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiIgInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhNTCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+TGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+TGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvcjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy48L3Nob3J0ZGVzYz4NCi08cmVmYm9keT4NCi08IS0tVXNlIHRoaXMgdGVtcGxhdGUgdG8gc2luZ2xlIHNvdXJjZSB0aGUgcmVhZG1lIGluZm9ybWF0aW9uLiAgVGhlIGNvbnRlbnQgZm9yIHRoZSByZWFkbWUgaW5mb3JtYXRpb24gaXMgbWFpbnRhaW5lZCBpbiB0aGlzIHRvcGljIGFuZCBpcyBpbnNlcnRlZCBpbnRvIHRoZSByZWxhdGVkIHRvcGljIHVzaW5nIHRoZSBjb25yZWYgYXR0cmlidXRlLiBUaGlzIGZpbGUgd2lsbCBub3QgYmUgc3VyZmFjZWQgaW4geW91ciBuYXZpZ2F0aW9uLi0tPg0KLTxzZWN0aW9uIGlkPSJ1bnJlc29sdl9VUkkiPjwhLS1ObyBkZWZlY3QgYXNzb2NpYXRlZCB3aXRoIHRoaXMuIEl0IGlzIGZyb20gdGhlIDUuMS4gcmVhZG1lLi0tPjxwPlRoZQ0KLWJlaGF2aW9yIG9mIHRoZSBYTUwgcGFyc2VyIHdoZW4gZW5jb3VudGVyaW5nIGFuIHVucmVzb2x2YWJsZSBVUkkgKGZvciBleGFtcGxlLA0KLWluIGEgRE9DVFlQRSBkZWNsYXJhdGlvbikgaXMgdG8gcmVwb3J0IGEgZmF0YWwgSU8gZXJyb3IgYW5kIHN0b3AgYW55IGZ1cnRoZXINCi1wcm9jZXNzaW5nLiBBbiB1bnJlc29sdmVkIFVSSSBpcyBzZWVuIG5laXRoZXIgYXMgYSBzeW50YWN0aWMgbm9yIGEgc2VtYW50aWMNCi1lcnJvciBhbmQgYXMgc3VjaCwgdGhlIHBhcnNlciBkb2VzIG5vdCBhdHRlbXB0IHRvIGhhbmRsZSBpdC4gRXNzZW50aWFsbHksDQotdGhlIGRvY3VtZW50IHJlbWFpbnMgdW5jaGVja2VkLiBUaGlzIGlzIGEga25vd24gcHJvYmxlbS48L3A+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYTUwuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlY2U2YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhNTC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJMaW1pdGF0aW9ucyBvZiBYTUwgRWRpdG9yIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoaXMgc2VjdGlvbiBkZXNjcmliZXMga25vd24gcHJvZHVjdCBhc3BlY3QgbGltaXRhdGlvbnMgYW5kIHdvcmthcm91bmRzLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmxpbWl0YXRpb25zX3NsdXNoWE1MIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+TGltaXRhdGlvbnMgb2YgWE1MIEVkaXRvcjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icmxpbWl0YXRpb25zX3NsdXNoWE1MIj48YSBuYW1lPSJybGltaXRhdGlvbnNfc2x1c2hYTUwiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkxpbWl0YXRpb25zIG9mIFhNTCBFZGl0b3I8L2gxPgotCi0KLQotPGRpdj48cD5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy48L3A+Ci0KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgaWQ9InJsaW1pdGF0aW9uc19zbHVzaFhNTF9fdW5yZXNvbHZfVVJJIj48YSBuYW1lPSJybGltaXRhdGlvbnNfc2x1c2hYTUxfX3VucmVzb2x2X1VSSSI+PCEtLSAtLT48L2E+PHA+VGhlCi1iZWhhdmlvciBvZiB0aGUgWE1MIHBhcnNlciB3aGVuIGVuY291bnRlcmluZyBhbiB1bnJlc29sdmFibGUgVVJJIChmb3IgZXhhbXBsZSwKLWluIGEgRE9DVFlQRSBkZWNsYXJhdGlvbikgaXMgdG8gcmVwb3J0IGEgZmF0YWwgSU8gZXJyb3IgYW5kIHN0b3AgYW55IGZ1cnRoZXIKLXByb2Nlc3NpbmcuIEFuIHVucmVzb2x2ZWQgVVJJIGlzIHNlZW4gbmVpdGhlciBhcyBhIHN5bnRhY3RpYyBub3IgYSBzZW1hbnRpYwotZXJyb3IgYW5kIGFzIHN1Y2gsIHRoZSBwYXJzZXIgZG9lcyBub3QgYXR0ZW1wdCB0byBoYW5kbGUgaXQuIEVzc2VudGlhbGx5LAotdGhlIGRvY3VtZW50IHJlbWFpbnMgdW5jaGVja2VkLiBUaGlzIGlzIGEga25vd24gcHJvYmxlbS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2MmQyZWYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiIgInJlZmVyZW5jZS5kdGQiPg0KLTw/UHViIEluYz8+DQotPHJlZmVyZW5jZSBpZD0icmljb25zIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBmb2xsb3dpbmcgWE1MIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgYW5kIERlc2lnbg0KLXZpZXcuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+aWNvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHRhYmxlPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCIgdmFsaWduPSJib3R0b20iPjxiPkljb248L2I+PC9lbnRyeT48P1B1YiBDYXJldDE/Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSIgdmFsaWduPSJib3R0b20iPjxiPkRlc2NyaXB0aW9uPC9iPjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvbmF0dHJpYi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUNCi1pY29uPC9hbHQ+PC9pbWFnZT4gPC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1jaGFyYWN0ZXIgZGF0YSBpY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jaGFyYWN0ZXIgZGF0YSAoQ0RBVEEpIHNlY3Rpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NvbW1lbnRfb2JqLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGNvbW1lbnQNCi1pY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5jb21tZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9kb2N0eXBlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIERPQ1RZUEUNCi1pY29uPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5ET0NUWVBFIGRlY2xhcmF0aW9uPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT4gPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9uZWxlbS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50DQotaWNvbjwvYWx0PjwvaW1hZ2U+IDwvZW50cnk+DQotPGVudHJ5PmVsZW1lbnQ8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL3Byb2luc3Rfb2JqLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIHByb2Nlc3NpbmcNCi1pbnN0cnVjdGlvbnMgaWNvbjwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2VudHJ5Pg0KLTwvcm93Pg0KLTwvdGJvZHk+DQotPC90Z3JvdXA+DQotPC90YWJsZT4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQotPD9QdWIgKjAwMDAwMDE4MjQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvcnhtbGJpY29ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMDg3YTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeG1sYmljb25zLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0icmVmZXJlbmNlIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBmb2xsb3dpbmcgWE1MIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUgYW5kIERlc2lnbiB2aWV3LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGljb25zIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgaWNvbnMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJyaWNvbnMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJyaWNvbnMiPjxhIG5hbWU9InJpY29ucyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduCi12aWV3LjwvcD4KLQotCi08ZGl2IGNsYXNzPSJ0YWJsZW5vYm9yZGVyIj48dGFibGUgc3VtbWFyeT0iIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiIGZyYW1lPSJib3JkZXIiIGJvcmRlcj0iMSIgcnVsZXM9ImFsbCI+Ci08dGJvZHk+Ci08dHI+Ci08dGQgdmFsaWduPSJib3R0b20iPjxzdHJvbmc+SWNvbjwvc3Ryb25nPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5EZXNjcmlwdGlvbjwvc3Ryb25nPjwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+IDxpbWcgc3JjPSIuLi9pbWFnZXMvbmF0dHJpYi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUmIzEwO2ljb24iIC8+IDwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+YXR0cmlidXRlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9jZGF0YXNlY3Rpb24uZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUmIzEwO2NoYXJhY3RlciBkYXRhIGljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jaGFyYWN0ZXIgZGF0YSAoQ0RBVEEpIHNlY3Rpb248L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL2NvbW1lbnRfb2JqLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGNvbW1lbnQmIzEwO2ljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jb21tZW50PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9kb2N0eXBlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIERPQ1RZUEUmIzEwO2ljb24iIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5ET0NUWVBFIGRlY2xhcmF0aW9uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9uZWxlbS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50JiMxMDtpY29uIiAvPiA8L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL3Byb2luc3Rfb2JqLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIHByb2Nlc3NpbmcmIzEwO2luc3RydWN0aW9ucyBpY29uIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3RkPgotCi08L3RyPgotCi08L3Rib2R5PgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV0eG1sLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5Y2YwNzMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y3JldHhtbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+Q3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCB3aGljaCB5b3UgY2FuIHRoZW4gZWRpdCBpbg0KLXRoZSBYTUwgZWRpdG9yLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCBpdCBpcyBub3QgYXNzb2NpYXRlZA0KLXdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mDQotY29udGVudCBpdCBjYW4gY29udGFpbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gY3JlYXRlIGEgbmV3LA0KLWVtcHR5IFhNTCBmaWxlLCBmb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SWYgbmVjZXNzYXJ5LCBjcmVhdGUgYSBwcm9qZWN0IHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSB3b3JrYmVuY2gsIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGU8L3VpY29udHJvbD4NCi08dWljb250cm9sPk5ldzwvdWljb250cm9sPjx1aWNvbnRyb2w+T3RoZXI8L3VpY29udHJvbD48dWljb250cm9sPlhNTDwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+WE1MPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+Q3JlYXRlIFhNTCBmaWxlIGZyb20gc2NyYXRjaDwvdWljb250cm9sPiByYWRpbw0KLWJ1dHRvbi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5leHQuPC91aWNvbnRyb2w+PC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIGZpbGUuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+RmlsZSBuYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mDQotdGhlIFhNTCBmaWxlLCBmb3IgZXhhbXBsZSA8dXNlcmlucHV0Pk15WE1MRmlsZS54bWw8L3VzZXJpbnB1dD4uIFRoZSBuYW1lIG9mDQoteW91ciBYTUwgZmlsZSAgPHZhcm5hbWU+bXVzdDwvdmFybmFtZT4gZW5kIGluIDx1c2VyaW5wdXQ+LnhtbDwvdXNlcmlucHV0Pi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JldHhtbC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDBhOWQ2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXR4bWwuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkNyZWF0aW5nIGVtcHR5IFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgY3JlYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNyZXR4bWwiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5DcmVhdGluZyBlbXB0eSBYTUwgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjcmV0eG1sIj48YSBuYW1lPSJ0Y3JldHhtbCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluCi10aGUgWE1MIGVkaXRvci4gV2hlbiB5b3UgY3JlYXRlIGEgbmV3LCBlbXB0eSBYTUwgZmlsZSwgaXQgaXMgbm90IGFzc29jaWF0ZWQKLXdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSBmaWxlLCBzbyB0aGVyZSBhcmUgbm8gcmVzdHJpY3Rpb25zIG9uIHRoZSBraW5kIG9mCi1jb250ZW50IGl0IGNhbiBjb250YWluLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBjcmVhdGUgYSBuZXcsCi1lbXB0eSBYTUwgZmlsZSwgZm9sbG93IHRoZXNlIGluc3RydWN0aW9uczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPklmIG5lY2Vzc2FyeSwgY3JlYXRlIGEgcHJvamVjdCB0byBjb250YWluIHRoZSBYTUwgZmlsZS48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSB3b3JrYmVuY2gsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZTwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUw8L3NwYW4+PC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIFhNTCBmaWxlIGZyb20gc2NyYXRjaDwvc3Bhbj4gcmFkaW8KLWJ1dHRvbi48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQuPC9zcGFuPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBwcm9qZWN0IG9yIGZvbGRlciB0aGF0IHdpbGwgY29udGFpbiB0aGUgWE1MIGZpbGUuPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIG5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mCi10aGUgWE1MIGZpbGUsIGZvciBleGFtcGxlIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+TXlYTUxGaWxlLnhtbDwva2JkPi4gVGhlIG5hbWUgb2YKLXlvdXIgWE1MIGZpbGUgIDx2YXIgY2xhc3M9InZhcm5hbWUiPm11c3Q8L3Zhcj4gZW5kIGluIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+LnhtbDwva2JkPi48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4ZHRkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBEVEQgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIERURC4iPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV4eHNkLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIHRpdGxlPSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIj5FZGl0aW5nIFhNTCBmaWxlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4ZHRkLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyNjBkM2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0Y3JleGR0ZCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5HZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5DQotY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyDQotRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGgNCi15b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXINCi1EVEQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5nZW5lcmF0aW5nIGZyb20gRFREczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+QWZ0ZXIgeW91IGhhdmUgZ2VuZXJhdGVkIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4gZnVydGhlciBjdXN0b21pemUNCi1pdCBpbiB0aGUgWE1MIGVkaXRvci48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUNCi1SZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBEVEQgZmlsZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgTmF2aWdhdG9yIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBEVEQgZmlsZSB0aGF0IHlvdSB3YW50IHRvDQotd29yayB3aXRoLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkZyb20gaXRzIHBvcC11cCBtZW51IGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYXRlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5YTUwgRmlsZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlIGFuZCB0eXBlIGEgbmFtZQ0KLWZvciBpdC48L2NtZD48aW5mbz5UaGUgbmFtZSBvZiB0aGUgZmlsZSBtdXN0IGVuZCBpbiA8dXNlcmlucHV0Pi54bWw8L3VzZXJpbnB1dD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrICA8dWljb250cm9sPk5leHQ8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPlJvb3QgZWxlbWVudDwvdWljb250cm9sPiBvZiB0aGUgWE1MIGZpbGUuPC9jbWQ+DQotPGluZm8+VGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcg0KLWVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIHRoZSBlbGVtZW50cyB0aGF0IHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlIERURCB3aWxsDQotYmUgc2hvd24gaW4gdGhlIDx1aWNvbnRyb2w+Um9vdCBlbGVtZW50PC91aWNvbnRyb2w+IGxpc3QuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBmcm9tIHRoZSBmb2xsb3dpbmcgY29udGVudCBvcHRpb25zOiAgPC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPkNyZWF0ZSBvcHRpb25hbCBhdHRyaWJ1dGVzPC91aWNvbnRyb2w+LiBCb3RoIG1hbmRhdG9yeQ0KLWFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgZWxlbWVudHM8L3VpY29udHJvbD4uIEJvdGggbWFuZGF0b3J5IGFuZA0KLW9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvY2hvaWNlPjw/UHViIENhcmV0MT8+DQotPGNob2ljZT48dWljb250cm9sPkNyZWF0ZSBmaXJzdCBjaG9pY2Ugb2YgcmVxdWlyZWQgY2hvaWNlPC91aWNvbnRyb2w+LiBUaGUNCi1maXJzdCBvcHRpb24gb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+RmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3aXRoIGRhdGE8L3VpY29udHJvbD4uIEFueQ0KLWVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNhbXBsZSBkYXRhLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08aW5mbz4gPHA+SWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bQ0KLWFtb3VudCBvZiBjb250ZW50IHJlcXVpcmVkIGZvciB0aGUgWE1MIGZpbGUgd2lsbCBiZSBjcmVhdGVkLjwvcD48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5QdWJsaWMgSUQ8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5TeXN0ZW0NCi1JRDwvdWljb250cm9sPi48L2NtZD48aW5mbz5Zb3UgZG8gbm90IG5lZWQgdG8gc3BlY2lmeSBib3RoLiBJZiB5b3UgZG8sIHRoZQ0KLVB1YmxpYyBJRCB3aWxsIGJlIHVzZWQgYmVmb3JlIHRoZSBTeXN0ZW0gSUQuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBYTUwgZmlsZSB3aWxsIG9ubHkgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IGFuZCBhbnkNCi1lbGVtZW50cyBvciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMsDQotYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMgdG8gdGhlIFhNTCBmaWxlLCBob3dldmVyLCB0aGV5IG11c3QgZm9sbG93DQotdGhlIHJ1bGVzIGVzdGFibGlzaGVkIGluIHRoZSBEVEQgdGhhdCB5b3UgdXNlZCB0byBjcmVhdGUgdGhlIFhNTCBmaWxlLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzMzND8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleGR0ZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmU1NWVhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXhkdGQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIERURHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgRFREIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBEVEQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBmaWxlcywgZ2VuZXJhdGluZyBmcm9tIERURHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGdlbmVyYXRpbmcgZnJvbSBEVERzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JleHhzZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGNyZXhkdGQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5HZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0Y3JleGR0ZCI+PGEgbmFtZT0idGNyZXhkdGQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gRFREczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBnZW5lcmF0ZSBhbiBYTUwgZmlsZSBmcm9tIHlvdXIgRFREIGlmIHlvdSB3YW50IHRvIHF1aWNrbHkKLWNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91cgotRFREIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGgKLXlvdXIgRFRELCBhbmQgY29udGFpbnMgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4geW91cgotRFRELjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QWZ0ZXIgeW91IGhhdmUgZ2VuZXJhdGVkIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4gZnVydGhlciBjdXN0b21pemUKLWl0IGluIHRoZSBYTUwgZWRpdG9yLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlCi1SZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWNyZWF0ZSBhbiBYTUwgZmlsZSBmcm9tIGEgRFREIGZpbGUgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgdGhlIERURCBmaWxlIHRoYXQgeW91IHdhbnQgdG8KLXdvcmsgd2l0aC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIGl0cyBwb3AtdXAgbWVudSBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYXRlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGU8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSBhbmQgdHlwZSBhIG5hbWUKLWZvciBpdC48L3NwYW4+IFRoZSBuYW1lIG9mIHRoZSBmaWxlIG11c3QgZW5kIGluIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+LnhtbDwva2JkPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50PC9zcGFuPiBvZiB0aGUgWE1MIGZpbGUuPC9zcGFuPgotIFRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXIKLWVsZW1lbnRzIGluIHRoYXQgZmlsZS4gQWxsIHRoZSBlbGVtZW50cyB0aGF0IHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlIERURCB3aWxsCi1iZSBzaG93biBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50PC9zcGFuPiBsaXN0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6ICA8L3NwYW4+Ci08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3JlYXRlIG9wdGlvbmFsIGF0dHJpYnV0ZXM8L3NwYW4+LiBCb3RoIG1hbmRhdG9yeQotYW5kIG9wdGlvbmFsIGF0dHJpYnV0ZXMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBlbGVtZW50czwvc3Bhbj4uIEJvdGggbWFuZGF0b3J5IGFuZAotb3B0aW9uYWwgZWxlbWVudHMgd2lsbCBiZSBnZW5lcmF0ZWQuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBmaXJzdCBjaG9pY2Ugb2YgcmVxdWlyZWQgY2hvaWNlPC9zcGFuPi4gVGhlCi1maXJzdCBvcHRpb24gb2YgYSByZXF1aXJlZCBjaG9pY2Ugd2lsbCBiZSBnZW5lcmF0ZWQgaW4geW91ciBYTUwgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyB3aXRoIGRhdGE8L3NwYW4+LiBBbnkKLWVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGdlbmVyYXRlZCB3aWxsIGJlIGZpbGxlZCB3aXRoIHNhbXBsZSBkYXRhLjwvbGk+Ci0KLTwvdWw+Ci0KLSAgPHA+SWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bQotYW1vdW50IG9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9wPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TcGVjaWZ5IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMgSUQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN5c3RlbQotSUQ8L3NwYW4+Ljwvc3Bhbj4gWW91IGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYm90aC4gSWYgeW91IGRvLCB0aGUKLVB1YmxpYyBJRCB3aWxsIGJlIHVzZWQgYmVmb3JlIHRoZSBTeXN0ZW0gSUQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBmaWxlIHdpbGwgb25seSBjb250YWluIHRoZSBzZWxlY3RlZCByb290IGVsZW1lbnQgYW5kIGFueQotZWxlbWVudHMgb3IgYXR0cmlidXRlcyBjb250YWluZWQgaW4gdGhlIHJvb3QgZWxlbWVudC4gWW91IGNhbiBub3cgYWRkIGVsZW1lbnRzLAotYXR0cmlidXRlcywgZW50aXRpZXMsIGFuZCBub3RhdGlvbnMgdG8gdGhlIFhNTCBmaWxlLCBob3dldmVyLCB0aGV5IG11c3QgZm9sbG93Ci10aGUgcnVsZXMgZXN0YWJsaXNoZWQgaW4gdGhlIERURCB0aGF0IHlvdSB1c2VkIHRvIGNyZWF0ZSB0aGUgWE1MIGZpbGUuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiI+Q3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXh4c2QuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuIj5HZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFlMTM2My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjcmV4eHNkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGNyZXh4c2QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8NCi1xdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIFhNTCBzY2hlbWEgZmlsZS4gR2VuZXJhdGluZyBhbiBYTUwNCi1maWxlIGZyb20geW91ciBYTUwgc2NoZW1hIHNhdmVzIHlvdSB0aW1lIGJ5IGNyZWF0aW5nIGFuIFhNTCBmaWxlIHRoYXQgaXMgYWxyZWFkeQ0KLWFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cw0KLWFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPmdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+QWZ0ZXIgeW91IGhhdmUgZ2VuZXJhdGVkIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4gZnVydGhlciBjdXN0b21pemUNCi1pdCBpbiB0aGUgWE1MIGVkaXRvci48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUNCi1SZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSBhIHNjaGVtYSBmaWxlIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBOYXZpZ2F0b3IgdmlldywgcmlnaHQtY2xpY2sgdGhlIFhNTCBzY2hlbWEgZmlsZSB0aGF0IHlvdQ0KLXdhbnQgdG8gd29yayB3aXRoLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkZyb20gaXRzIHBvcC11cCBtZW51IGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkdlbmVyYXRlPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5YTUwgRmlsZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBhIHByb2plY3Qgb3IgZm9sZGVyIHRvIGNvbnRhaW4gdGhlIFhNTCBmaWxlLCB0eXBlIGEgbmFtZQ0KLWZvciBpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPlRoZSBuYW1lIG9mIHRoZSBmaWxlDQotbXVzdCBlbmQgaW48c3lzdGVtb3V0cHV0Pi54bWwuPC9zeXN0ZW1vdXRwdXQ+IDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQ8L3VpY29udHJvbD4gb2YgdGhlIFhNTCBmaWxlLjwvY21kPg0KLTxpbmZvPlRoZSByb290IGVsZW1lbnQgb2YgYW4gWE1MIGZpbGUgaXMgdGhlIGVsZW1lbnQgdGhhdCBjb250YWlucyBhbGwgb3RoZXINCi1lbGVtZW50cyBpbiB0aGF0IGZpbGUuIEFsbCBvZiB0aGUgZ2xvYmFsIGVsZW1lbnRzIHlvdSBoYXZlIGRlZmluZWQgaW4gdGhlDQotWE1MIHNjaGVtYSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBSb290IGVsZW1lbnQgbGlzdC4gSWYgeW91IGRvIG5vdCBoYXZlIGFueQ0KLWdsb2JhbCBlbGVtZW50cyBpbiB5b3VyIFhNTCBzY2hlbWEsIHlvdSBjYW5ub3QgY3JlYXRlIGFuIFhNTCBmaWxlIGZyb20gaXQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCBmcm9tIHRoZSBmb2xsb3dpbmcgY29udGVudCBvcHRpb25zOjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PHVpY29udHJvbD5DcmVhdGUgb3B0aW9uYWwgYXR0cmlidXRlczwvdWljb250cm9sPi4gQm90aCBtYW5kYXRvcnkNCi1hbmQgb3B0aW9uYWwgYXR0cmlidXRlcyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIG9wdGlvbmFsIGVsZW1lbnRzPC91aWNvbnRyb2w+LiBCb3RoIG1hbmRhdG9yeSBhbmQNCi1vcHRpb25hbCBlbGVtZW50cyB3aWxsIGJlIGdlbmVyYXRlZC48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Q3JlYXRlIGZpcnN0IGNob2ljZSBvZiByZXF1aXJlZCBjaG9pY2U8L3VpY29udHJvbD4uIFRoZQ0KLWZpcnN0IG9wdGlvbiBvZiBhIHJlcXVpcmVkIGNob2ljZSB3aWxsIGJlIGdlbmVyYXRlZCBpbiB5b3VyIFhNTCBmaWxlLjwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD5GaWxsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIHdpdGggZGF0YTwvdWljb250cm9sPi4gQW55DQotZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgZ2VuZXJhdGVkIHdpbGwgYmUgZmlsbGVkIHdpdGggc2FtcGxlIGRhdGEuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPklmIHlvdSBkbyBub3Qgc2VsZWN0IGFueSBvZiB0aGVzZSBvcHRpb25zLCB0aGVuIG9ubHkgdGhlIG1pbmltdW0gYW1vdW50DQotb2YgY29udGVudCByZXF1aXJlZCBmb3IgdGhlIFhNTCBmaWxlIHdpbGwgYmUgY3JlYXRlZC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIE5hbWVzcGFjZSBpbmZvcm1hdGlvbiBzZWN0aW9uIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQ0KLXRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEsIGl0cyBwcmVmaXgsIGFuZCB0aGUgc2NoZW1hIGxvY2F0aW9uLjwvY21kPg0KLTxpbmZvPkZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IG5hbWVzcGFjZXMgYW5kIG5hbWVzcGFjZSBwcmVmaXhlcywgcmVmZXINCi10byB0aGUgcmVsYXRlZCByZWZlcmVuY2VzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGVudHJ5IHlvdSB3YW50IHRvIGVkaXQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZXNwYWNlIE5hbWU8L3VpY29udHJvbD4gZmllbGQgaXMNCi10aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgWE1MIHNjaGVtYS48L2NtZD48aW5mbz5Zb3VyIFhNTCBmaWxlIHNob3VsZCBiZQ0KLWFzc29jaWF0ZWQgd2l0aCB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgaXRzIFhNTCBzY2hlbWEgaXMgYXNzb2NpYXRlZCB3aXRoLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbGwgcXVhbGlmaWVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHRoZSBYTUwgZmlsZSBhc3NvY2lhdGVkDQotd2l0aCB0aGUgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgPHVpY29udHJvbD5QcmVmaXg8L3VpY29udHJvbD4gdmFsdWUuPC9jbWQ+PD9QdWIgQ2FyZXQxPz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgIDx1aWNvbnRyb2w+TG9jYXRpb24gSGludDwvdWljb250cm9sPiBmaWVsZCBjb250YWlucyB0aGUgbG9jYXRpb24NCi1vZiB0aGUgWE1MIHNjaGVtYS48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LCB0aGVuIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIFhNTCBmaWxlIHdpbGwgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IGFuZCBhbnkgZWxlbWVudHMNCi1vciBhdHRyaWJ1dGVzIGNvbnRhaW5lZCBpbiB0aGUgcm9vdCBlbGVtZW50LiBJdCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uDQotYWJvdXQgdGhlIFhNTCBmaWxlIG5hbWVzcGFjZSBhbmQgbG9jYXRpb24uIFlvdSBjYW4gbm93IGFkZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcw0KLXRvIHRoZSBYTUwgZmlsZS48L3A+PHA+PGI+Tm90ZTo8L2I+IEluIGNlcnRhaW4gY2FzZXMsIHdoZW4gYW4gWE1MIGZpbGUgaXMNCi1nZW5lcmF0ZWQgZnJvbSBhIGNvbXBsZXggWE1MIHNjaGVtYSBmaWxlLCB0aGUgWE1MIGZpbGUgbWlnaHQgbm90IGJlIHZhbGlkLg0KLUlmIHRoaXMgb2NjdXJzLCB5b3UgY2FuIG9wZW4gdGhlIGdlbmVyYXRlZCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yIGFuZCBjb3JyZWN0DQotYW55IGVycm9ycyB0aGF0IG9jY3VyLiBVc3VhbGx5LCBvbmx5IGEgZmV3IGVycm9ycyBuZWVkIHRvIGJlIGZpeGVkLiBUaGUgZm9sbG93aW5nDQotWE1MIHNjaGVtYSBjb25zdHJ1Y3RzIG1pZ2h0IHByZXNlbnQgcHJvYmxlbXM6PC9wPjxvbD4NCi08bGk+UmVzdHJpY3Rpb25zLiBTb21ldGltZXMgcmVzdHJpY3RlZCBlbGVtZW50cyBhcmUgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLiA8L2xpPg0KLTxsaT5GYWNldHM6IERlZmF1bHQgZ2VuZXJhdGVkIGRhdGEgdmFsdWVzIG1pZ2h0IG5vdCBjb25mb3JtIHRvIGNvbXBsZXggZmFjZXRzDQotKGZvciBleGFtcGxlLCBwYXR0ZXJucykuPC9saT4NCi08bGk+QWJzdHJhY3QgZWxlbWVudHMuIGFic3RyYWN0IGVsZW1lbnRzIGFyZSBzb21ldGltZXMgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLjwvbGk+DQotPC9vbD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDc1Nz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3JleHhzZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmRhOWZlLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGNyZXh4c2QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJHZW5lcmF0aW5nIFhNTCBmaWxlcyBmcm9tIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8gcXVpY2tseSBjcmVhdGUgYW4gWE1MIGZpbGUgYmFzZWQgb24geW91ciBYTUwgc2NoZW1hIGZpbGUuIEdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBpbiB5b3VyIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGZpbGVzLCBnZW5lcmF0aW5nIGZyb20gWE1MIHNjaGVtYXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGdlbmVyYXRpbmcgZnJvbSBYTUwgc2NoZW1hcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90Y3JldHhtbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0dGFnLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jd3htbGVkdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi8uLi9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0Y3JleHhzZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkdlbmVyYXRpbmcgYW4gWE1MIGZpbGUgZnJvbSBhbiBYTUwgc2NoZW1hPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0Y3JleHhzZCI+PGEgbmFtZT0idGNyZXh4c2QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkdlbmVyYXRpbmcgWE1MIGZpbGVzIGZyb20gWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIFhNTCBzY2hlbWEgaWYgeW91IHdhbnQgdG8KLXF1aWNrbHkgY3JlYXRlIGFuIFhNTCBmaWxlIGJhc2VkIG9uIHlvdXIgWE1MIHNjaGVtYSBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTAotZmlsZSBmcm9tIHlvdXIgWE1MIHNjaGVtYSBzYXZlcyB5b3UgdGltZSBieSBjcmVhdGluZyBhbiBYTUwgZmlsZSB0aGF0IGlzIGFscmVhZHkKLWFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEsIGFuZCBjb250YWlucyBhdCBsZWFzdCBzb21lIG9mIHRoZSBlbGVtZW50cwotYW5kIGF0dHJpYnV0ZXMgaW4geW91ciBYTUwgc2NoZW1hLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+QWZ0ZXIgeW91IGhhdmUgZ2VuZXJhdGVkIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4gZnVydGhlciBjdXN0b21pemUKLWl0IGluIHRoZSBYTUwgZWRpdG9yLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlCi1SZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWdlbmVyYXRlIGFuIFhNTCBmaWxlIGZyb20gYSBzY2hlbWEgZmlsZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE5hdmlnYXRvciB2aWV3LCByaWdodC1jbGljayB0aGUgWE1MIHNjaGVtYSBmaWxlIHRoYXQgeW91Ci13YW50IHRvIHdvcmsgd2l0aC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gcm9tIGl0cyBwb3AtdXAgbWVudSBjbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYXRlPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGU8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgYSBwcm9qZWN0IG9yIGZvbGRlciB0byBjb250YWluIHRoZSBYTUwgZmlsZSwgdHlwZSBhIG5hbWUKLWZvciBpdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPiBUaGUgbmFtZSBvZiB0aGUgZmlsZQotbXVzdCBlbmQgaW48dHQgY2xhc3M9InN5c291dCI+LnhtbC48L3R0PiA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Sb290IGVsZW1lbnQ8L3NwYW4+IG9mIHRoZSBYTUwgZmlsZS48L3NwYW4+Ci0gVGhlIHJvb3QgZWxlbWVudCBvZiBhbiBYTUwgZmlsZSBpcyB0aGUgZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCBvdGhlcgotZWxlbWVudHMgaW4gdGhhdCBmaWxlLiBBbGwgb2YgdGhlIGdsb2JhbCBlbGVtZW50cyB5b3UgaGF2ZSBkZWZpbmVkIGluIHRoZQotWE1MIHNjaGVtYSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBSb290IGVsZW1lbnQgbGlzdC4gSWYgeW91IGRvIG5vdCBoYXZlIGFueQotZ2xvYmFsIGVsZW1lbnRzIGluIHlvdXIgWE1MIHNjaGVtYSwgeW91IGNhbm5vdCBjcmVhdGUgYW4gWE1MIGZpbGUgZnJvbSBpdC4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IGZyb20gdGhlIGZvbGxvd2luZyBjb250ZW50IG9wdGlvbnM6PC9zcGFuPgotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNyZWF0ZSBvcHRpb25hbCBhdHRyaWJ1dGVzPC9zcGFuPi4gQm90aCBtYW5kYXRvcnkKLWFuZCBvcHRpb25hbCBhdHRyaWJ1dGVzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgb3B0aW9uYWwgZWxlbWVudHM8L3NwYW4+LiBCb3RoIG1hbmRhdG9yeSBhbmQKLW9wdGlvbmFsIGVsZW1lbnRzIHdpbGwgYmUgZ2VuZXJhdGVkLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5DcmVhdGUgZmlyc3QgY2hvaWNlIG9mIHJlcXVpcmVkIGNob2ljZTwvc3Bhbj4uIFRoZQotZmlyc3Qgb3B0aW9uIG9mIGEgcmVxdWlyZWQgY2hvaWNlIHdpbGwgYmUgZ2VuZXJhdGVkIGluIHlvdXIgWE1MIGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbGwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgd2l0aCBkYXRhPC9zcGFuPi4gQW55Ci1lbGVtZW50cyBhbmQgYXR0cmlidXRlcyBnZW5lcmF0ZWQgd2lsbCBiZSBmaWxsZWQgd2l0aCBzYW1wbGUgZGF0YS48L2xpPgotCi08L3VsPgotCi0gSWYgeW91IGRvIG5vdCBzZWxlY3QgYW55IG9mIHRoZXNlIG9wdGlvbnMsIHRoZW4gb25seSB0aGUgbWluaW11bSBhbW91bnQKLW9mIGNvbnRlbnQgcmVxdWlyZWQgZm9yIHRoZSBYTUwgZmlsZSB3aWxsIGJlIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgTmFtZXNwYWNlIGluZm9ybWF0aW9uIHNlY3Rpb24gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCi10YXJnZXQgbmFtZXNwYWNlIG9mIHRoZSBYTUwgc2NoZW1hLCBpdHMgcHJlZml4LCBhbmQgdGhlIHNjaGVtYSBsb2NhdGlvbi48L3NwYW4+Ci0gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgbmFtZXNwYWNlcyBhbmQgbmFtZXNwYWNlIHByZWZpeGVzLCByZWZlcgotdG8gdGhlIHJlbGF0ZWQgcmVmZXJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgZW50cnkgeW91IHdhbnQgdG8gZWRpdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWVzcGFjZSBOYW1lPC9zcGFuPiBmaWVsZCBpcwotdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIFhNTCBzY2hlbWEuPC9zcGFuPiBZb3VyIFhNTCBmaWxlIHNob3VsZCBiZQotYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQKLXdpdGggdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gdmFsdWUuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxvY2F0aW9uIEhpbnQ8L3NwYW4+IGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbgotb2YgdGhlIFhNTCBzY2hlbWEuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LCB0aGVuIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBmaWxlIHdpbGwgY29udGFpbiB0aGUgc2VsZWN0ZWQgcm9vdCBlbGVtZW50IGFuZCBhbnkgZWxlbWVudHMKLW9yIGF0dHJpYnV0ZXMgY29udGFpbmVkIGluIHRoZSByb290IGVsZW1lbnQuIEl0IGFsc28gY29udGFpbnMgaW5mb3JtYXRpb24KLWFib3V0IHRoZSBYTUwgZmlsZSBuYW1lc3BhY2UgYW5kIGxvY2F0aW9uLiBZb3UgY2FuIG5vdyBhZGQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMKLXRvIHRoZSBYTUwgZmlsZS48L3A+Ci08cD48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IEluIGNlcnRhaW4gY2FzZXMsIHdoZW4gYW4gWE1MIGZpbGUgaXMKLWdlbmVyYXRlZCBmcm9tIGEgY29tcGxleCBYTUwgc2NoZW1hIGZpbGUsIHRoZSBYTUwgZmlsZSBtaWdodCBub3QgYmUgdmFsaWQuCi1JZiB0aGlzIG9jY3VycywgeW91IGNhbiBvcGVuIHRoZSBnZW5lcmF0ZWQgZmlsZSBpbiB0aGUgWE1MIGVkaXRvciBhbmQgY29ycmVjdAotYW55IGVycm9ycyB0aGF0IG9jY3VyLiBVc3VhbGx5LCBvbmx5IGEgZmV3IGVycm9ycyBuZWVkIHRvIGJlIGZpeGVkLiBUaGUgZm9sbG93aW5nCi1YTUwgc2NoZW1hIGNvbnN0cnVjdHMgbWlnaHQgcHJlc2VudCBwcm9ibGVtczo8L3A+Ci08b2w+Ci08bGk+UmVzdHJpY3Rpb25zLiBTb21ldGltZXMgcmVzdHJpY3RlZCBlbGVtZW50cyBhcmUgZXJyb25lb3VzbHkgZ2VuZXJhdGVkLiA8L2xpPgotCi08bGk+RmFjZXRzOiBEZWZhdWx0IGdlbmVyYXRlZCBkYXRhIHZhbHVlcyBtaWdodCBub3QgY29uZm9ybSB0byBjb21wbGV4IGZhY2V0cwotKGZvciBleGFtcGxlLCBwYXR0ZXJucykuPC9saT4KLQotPGxpPkFic3RyYWN0IGVsZW1lbnRzLiBhYnN0cmFjdCBlbGVtZW50cyBhcmUgc29tZXRpbWVzIGVycm9uZW91c2x5IGdlbmVyYXRlZC48L2xpPgotCi08L29sPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RjcmV0eG1sLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhIG5ldywgZW1wdHkgWE1MIGZpbGUsIHdoaWNoIHlvdSBjYW4gdGhlbiBlZGl0IGluIHRoZSBYTUwgZWRpdG9yLiBXaGVuIHlvdSBjcmVhdGUgYSBuZXcsIGVtcHR5IFhNTCBmaWxlLCBpdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEgZmlsZSwgc28gdGhlcmUgYXJlIG5vIHJlc3RyaWN0aW9ucyBvbiB0aGUga2luZCBvZiBjb250ZW50IGl0IGNhbiBjb250YWluLiI+Q3JlYXRpbmcgZW1wdHkgWE1MIGZpbGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGNyZXhkdGQuaHRtbCIgdGl0bGU9IllvdSBjYW4gZ2VuZXJhdGUgYW4gWE1MIGZpbGUgZnJvbSB5b3VyIERURCBpZiB5b3Ugd2FudCB0byBxdWlja2x5IGNyZWF0ZSBhbiBYTUwgZmlsZSBiYXNlZCBvbiB5b3VyIERURCBmaWxlLiBHZW5lcmF0aW5nIGFuIFhNTCBmaWxlIGZyb20geW91ciBEVEQgc2F2ZXMgeW91IHRpbWUgYnkgY3JlYXRpbmcgYW4gWE1MIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGFzc29jaWF0ZWQgd2l0aCB5b3VyIERURCwgYW5kIGNvbnRhaW5zIGF0IGxlYXN0IHNvbWUgb2YgdGhlIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGluIHlvdXIgRFRELiI+R2VuZXJhdGluZyBYTUwgZmlsZXMgZnJvbSBEVERzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHR0YWcuaHRtbCIgdGl0bGU9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iPkVkaXRpbmcgWE1MIGZpbGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxpbmZvIj48c3Ryb25nPlJlbGF0ZWQgaW5mb3JtYXRpb248L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBkZTBjOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRjbnN0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5JbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YNCi1jb25zdHJhaW50cyAodGhhdCBpcywgYSBzZXQgb2YgcnVsZXMpIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91DQotY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdQ0KLWVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT53aXRoIERURCBvciBYTUwNCi1zY2hlbWEgY29uc3RyYWludHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBmaWxlczw/UHViIENhcmV0Pz48aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPndpdGgNCi1EVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+IFdoZW4gdGhlIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQgb24sIGFuZCB5b3UgYXJlIHdvcmtpbmcgaW4gdGhlDQotRGVzaWduIHZpZXcsIHRoZSBYTUwgZWRpdG9yIHByZXZlbnRzIHlvdSBmcm9tIGluc2VydGluZyBlbGVtZW50cywgYXR0cmlidXRlcywNCi1vciBhdHRyaWJ1dGUgdmFsdWVzIG5vdCBwZXJtaXR0ZWQgYnkgdGhlIHJ1bGVzIG9mIHRoZSBYTUwgc2NoZW1hIG9yIERURCwgYW5kDQotZnJvbSByZW1vdmluZyBuZWNlc3Nhcnkgb3IgcHJlZGVmaW5lZCBzZXRzIG9mIHRhZ3MgYW5kIHZhbHVlcy4gSW4gdGhpcyBtb2RlLA0KLWFuIGVsZW1lbnQncyBjb250ZW50IG11c3QgYmUgdmFsaWQgdG8gdXNlIHRoZSBYTUwgZWRpdG9yJ3MgZ3VpZGVkIGVkaXRpbmcNCi1vcHRpb25zLjwvcD48cD5Zb3UgbWlnaHQgd2FudCB0byB0dXJuIHRoZSBjb25zdHJhaW50cyBvZmYgZm9yIGFuIFhNTCBmaWxlDQotaWYgeW91IG5lZWQgbW9yZSBmbGV4aWJpbGl0eS4gRm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIHRyeSB3b3JraW5nIHdpdGggZWxlbWVudHMNCi1vciBhdHRyaWJ1dGVzIG5vdCBwZXJtaXR0ZWQgYnkgdGhlIGFzc29jaWF0ZWQgRFREIG9yIFhNTCBzY2hlbWEsIHdpdGhvdXQgYWN0dWFsbHkNCi1yZW1vdmluZyB0aGUgYXNzb2NpYXRpb24gd2l0aCB0aGUgRFREIG9yIFhNTCBzY2hlbWEuPC9wPjxwPlRvIHR1cm4gdGhlIGNvbnN0cmFpbnRzDQotZm9yIGFuIFhNTCBmaWxlIG9mZiwgY2xpY2sgPHVpY29udHJvbD5YTUwgPiBUdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT2ZmPC91aWNvbnRyb2w+Lg0KLUFmdGVyIHlvdSBoYXZlIHR1cm5lZCB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhIGZpbGUsIHlvdSBjYW4gaW5zZXJ0IG9yIGRlbGV0ZQ0KLWFueSBlbGVtZW50IG9yIGF0dHJpYnV0ZSByZWdhcmRsZXNzIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBydWxlcy4gWW91IGNhbg0KLWNyZWF0ZSBuZXcgZWxlbWVudHMgb3IgYXR0cmlidXRlcyB0aGF0IGFyZSBub3QgaW4gdGhlIERURCBvciBzY2hlbWEgLSB0aGVzZQ0KLURlc2lnbiB2aWV3IHByb21wdHMgd2lsbCBvbmx5IGFwcGVhciB3aGVuIHlvdSBoYXZlIHR1cm5lZCBjb25zdHJhaW50cyBvZmYuDQotVGhlIGZpbGUgbWlnaHQgbm90IGJlIHZhbGlkLCBob3dldmVyLCBpZiB5b3UgZG8gdGhpcy4gPC9wPjxwPlRoZSBmb2xsb3dpbmcNCi1pbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbw0KLXdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB3aGF0IHlvdQ0KLWNhbiBkbyBpZiB5b3UgdHVybiB0aGUgY29uc3RyYWludHMgb2YgYSBEVEQgb2ZmOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IgKHJpZ2h0LWNsaWNrIHRoZSBmaWxlIGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8dWljb250cm9sPk9wZW4gV2l0aCA+IFhNTCBFZGl0b3I8L3VpY29udHJvbD4pLiA8L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgaGF2ZSBhIERURCB0aGF0IHNwZWNpZmllcyB0aGF0IGFuIGVsZW1lbnQgcmVxdWlyZXMgYXQgbGVhc3QNCi1vbmUgb2YgYSBzcGVjaWZpYyBjaGlsZCBlbGVtZW50OiAgPC9jbWQ+PGluZm8+PGNvZGVibG9jaz4mbHQ7IUVMRU1FTlQgcGFyZW50RWxlbWVudCAoY2hpbGRFbGVtZW50Kyk+DQotPC9jb2RlYmxvY2s+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmLCBpbiBhbiBYTUwgZmlsZSBhc3NvY2lhdGVkIHdpdGggeW91ciBEVEQsIHlvdSBhdHRlbXB0IHRvIHJlbW92ZQ0KLXRoZSBmaW5hbCBjaGlsZCBlbGVtZW50IG9mIHRoZSBlbGVtZW50IHdpdGggdGhlIERURCBjb25zdHJhaW50cyB0dXJuZWQgb24sDQotdGhlIGVkaXRvciB3aWxsIG5vdCBhbGxvdyB5b3UgdG8gZG8gdGhpcywgYXMgaXQgd2lsbCBtYWtlIHRoZSBkb2N1bWVudCBpbnZhbGlkLjwvY21kPg0KLTxpbmZvPllvdSBjYW4gY29uZmlybSB0aGlzIGJ5IHVzaW5nIHRoZSBlbGVtZW50J3MgcG9wLXVwIG1lbnUgdG8gdmVyaWZ5IHRoYXQNCi10aGUgPHVpY29udHJvbD5SZW1vdmU8L3VpY29udHJvbD4gb3B0aW9uIGlzIGdyYXllZCBvdXQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIHR1cm4gdGhlIERURCBjb25zdHJhaW50cyBvZmYsIGNsaWNrIDx1aWNvbnRyb2w+WE1MID4gVHVybiBHcmFtbWFyDQotQ29uc3RyYWludHMgT2ZmPC91aWNvbnRyb2w+LiA8L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3UgYXR0ZW1wdCB0byByZW1vdmUgdGhlIHNhbWUgY2hpbGQgZWxlbWVudCB3aXRoIGNvbnN0cmFpbnRzDQotb2ZmLCB0aGUgZWRpdG9yIHdpbGwgYWxsb3cgeW91IHRvLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGNvcnJlY3QgdGhlIGludmFsaWQgZG9jdW1lbnQsIHlvdSB3aWxsIGhhdmUgdG8gcmUtYWRkIHRoZSBuZWNlc3NhcnkNCi1lbGVtZW50LCBvciByZW1vdmUgdGhlIGludmFsaWQgdGFnZ2luZyBvciB2YWx1ZS48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PklmIHlvdSBpbnRyb2R1Y2UgZXJyb3JzIGludG8geW91ciBmaWxlcywgeW91IG11c3Qgc2F2ZSBhbmQgdmFsaWRhdGUNCi10aGUgZmlsZSBpbiBvcmRlciB0byBzZWUgYSBsaXN0IG9mIHRoZSBlcnJvcnMgeW91IGhhdmUgaW50cm9kdWNlZC4gVGhleSB3aWxsDQotYmUgbGlzdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiBBZnRlciB5b3UgZml4IHRoZSBlcnJvcnMsIHlvdSBtdXN0IHNhdmUgYW5kDQotdmFsaWRhdGUgeW91ciBmaWxlIGFnYWluIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBub3cgdmFsaWQuPC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM4NTQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGNuc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4YWNkNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRjbnN0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkluIHRoZSBEZXNpZ24gdmlldywgd2hlbiB5b3UgZWRpdCBhbiBYTUwgZmlsZSB0aGF0IGhhcyBhIHNldCBvZiBjb25zdHJhaW50cyAodGhhdCBpcywgYSBzZXQgb2YgcnVsZXMpIGRlZmluZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UgZWRpdCwgYnV0IHN0aWxsIG1haW50YWluIHRoZSB2YWxpZGl0eSBvZiB0aGUgZG9jdW1lbnQgcGVyaW9kaWNhbGx5LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgKHRoYXQgaXMsIGEgc2V0IG9mIHJ1bGVzKSBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzLCBYTUwgZmlsZXMsIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzLCBYTUwgZmlsZXMsIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdGNuc3QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRlZHRjbnN0Ij48YSBuYW1lPSJ0ZWR0Y25zdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyB3aXRoIERURCBvciBYTUwgc2NoZW1hIGNvbnN0cmFpbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YKLWNvbnN0cmFpbnRzICh0aGF0IGlzLCBhIHNldCBvZiBydWxlcykgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UKLWNhbiB0dXJuIHRoZSBjb25zdHJhaW50cyBvbiBhbmQgb2ZmIHRvIHByb3ZpZGUgZmxleGliaWxpdHkgaW4gdGhlIHdheSB5b3UKLWVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPiBXaGVuIHRoZSBjb25zdHJhaW50cyBhcmUgdHVybmVkIG9uLCBhbmQgeW91IGFyZSB3b3JraW5nIGluIHRoZQotRGVzaWduIHZpZXcsIHRoZSBYTUwgZWRpdG9yIHByZXZlbnRzIHlvdSBmcm9tIGluc2VydGluZyBlbGVtZW50cywgYXR0cmlidXRlcywKLW9yIGF0dHJpYnV0ZSB2YWx1ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgcnVsZXMgb2YgdGhlIFhNTCBzY2hlbWEgb3IgRFRELCBhbmQKLWZyb20gcmVtb3ZpbmcgbmVjZXNzYXJ5IG9yIHByZWRlZmluZWQgc2V0cyBvZiB0YWdzIGFuZCB2YWx1ZXMuIEluIHRoaXMgbW9kZSwKLWFuIGVsZW1lbnQncyBjb250ZW50IG11c3QgYmUgdmFsaWQgdG8gdXNlIHRoZSBYTUwgZWRpdG9yJ3MgZ3VpZGVkIGVkaXRpbmcKLW9wdGlvbnMuPC9wPgotPHA+WW91IG1pZ2h0IHdhbnQgdG8gdHVybiB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhbiBYTUwgZmlsZQotaWYgeW91IG5lZWQgbW9yZSBmbGV4aWJpbGl0eS4gRm9yIGV4YW1wbGUsIHlvdSB3YW50IHRvIHRyeSB3b3JraW5nIHdpdGggZWxlbWVudHMKLW9yIGF0dHJpYnV0ZXMgbm90IHBlcm1pdHRlZCBieSB0aGUgYXNzb2NpYXRlZCBEVEQgb3IgWE1MIHNjaGVtYSwgd2l0aG91dCBhY3R1YWxseQotcmVtb3ZpbmcgdGhlIGFzc29jaWF0aW9uIHdpdGggdGhlIERURCBvciBYTUwgc2NoZW1hLjwvcD4KLTxwPlRvIHR1cm4gdGhlIGNvbnN0cmFpbnRzCi1mb3IgYW4gWE1MIGZpbGUgb2ZmLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgJmd0OyBUdXJuIEdyYW1tYXIgQ29uc3RyYWludHMgT2ZmPC9zcGFuPi4KLUFmdGVyIHlvdSBoYXZlIHR1cm5lZCB0aGUgY29uc3RyYWludHMgb2ZmIGZvciBhIGZpbGUsIHlvdSBjYW4gaW5zZXJ0IG9yIGRlbGV0ZQotYW55IGVsZW1lbnQgb3IgYXR0cmlidXRlIHJlZ2FyZGxlc3Mgb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIHJ1bGVzLiBZb3UgY2FuCi1jcmVhdGUgbmV3IGVsZW1lbnRzIG9yIGF0dHJpYnV0ZXMgdGhhdCBhcmUgbm90IGluIHRoZSBEVEQgb3Igc2NoZW1hIC0gdGhlc2UKLURlc2lnbiB2aWV3IHByb21wdHMgd2lsbCBvbmx5IGFwcGVhciB3aGVuIHlvdSBoYXZlIHR1cm5lZCBjb25zdHJhaW50cyBvZmYuCi1UaGUgZmlsZSBtaWdodCBub3QgYmUgdmFsaWQsIGhvd2V2ZXIsIGlmIHlvdSBkbyB0aGlzLiA8L3A+Ci08cD5UaGUgZm9sbG93aW5nCi1pbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbwotd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3Mgd2hhdCB5b3UKLWNhbiBkbyBpZiB5b3UgdHVybiB0aGUgY29uc3RyYWludHMgb2YgYSBEVEQgb2ZmOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4gdGhlIFhNTCBmaWxlIGluIHRoZSBYTUwgZWRpdG9yIChyaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUKLU5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuIFdpdGggJmd0OyBYTUwgRWRpdG9yPC9zcGFuPikuIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGhhdmUgYSBEVEQgdGhhdCBzcGVjaWZpZXMgdGhhdCBhbiBlbGVtZW50IHJlcXVpcmVzIGF0IGxlYXN0Ci1vbmUgb2YgYSBzcGVjaWZpYyBjaGlsZCBlbGVtZW50OiAgPC9zcGFuPiA8cHJlPiZsdDshRUxFTUVOVCBwYXJlbnRFbGVtZW50IChjaGlsZEVsZW1lbnQrKSZndDsKLTwvcHJlPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiwgaW4gYW4gWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHlvdXIgRFRELCB5b3UgYXR0ZW1wdCB0byByZW1vdmUKLXRoZSBmaW5hbCBjaGlsZCBlbGVtZW50IG9mIHRoZSBlbGVtZW50IHdpdGggdGhlIERURCBjb25zdHJhaW50cyB0dXJuZWQgb24sCi10aGUgZWRpdG9yIHdpbGwgbm90IGFsbG93IHlvdSB0byBkbyB0aGlzLCBhcyBpdCB3aWxsIG1ha2UgdGhlIGRvY3VtZW50IGludmFsaWQuPC9zcGFuPgotIFlvdSBjYW4gY29uZmlybSB0aGlzIGJ5IHVzaW5nIHRoZSBlbGVtZW50J3MgcG9wLXVwIG1lbnUgdG8gdmVyaWZ5IHRoYXQKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZW1vdmU8L3NwYW4+IG9wdGlvbiBpcyBncmF5ZWQgb3V0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gdHVybiB0aGUgRFREIGNvbnN0cmFpbnRzIG9mZiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MICZndDsgVHVybiBHcmFtbWFyCi1Db25zdHJhaW50cyBPZmY8L3NwYW4+LiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3UgYXR0ZW1wdCB0byByZW1vdmUgdGhlIHNhbWUgY2hpbGQgZWxlbWVudCB3aXRoIGNvbnN0cmFpbnRzCi1vZmYsIHRoZSBlZGl0b3Igd2lsbCBhbGxvdyB5b3UgdG8uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gY29ycmVjdCB0aGUgaW52YWxpZCBkb2N1bWVudCwgeW91IHdpbGwgaGF2ZSB0byByZS1hZGQgdGhlIG5lY2Vzc2FyeQotZWxlbWVudCwgb3IgcmVtb3ZlIHRoZSBpbnZhbGlkIHRhZ2dpbmcgb3IgdmFsdWUuPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPklmIHlvdSBpbnRyb2R1Y2UgZXJyb3JzIGludG8geW91ciBmaWxlcywgeW91IG11c3Qgc2F2ZSBhbmQgdmFsaWRhdGUKLXRoZSBmaWxlIGluIG9yZGVyIHRvIHNlZSBhIGxpc3Qgb2YgdGhlIGVycm9ycyB5b3UgaGF2ZSBpbnRyb2R1Y2VkLiBUaGV5IHdpbGwKLWJlIGxpc3RlZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4gQWZ0ZXIgeW91IGZpeCB0aGUgZXJyb3JzLCB5b3UgbXVzdCBzYXZlIGFuZAotdmFsaWRhdGUgeW91ciBmaWxlIGFnYWluIHRvIHNlZSBpZiB0aGUgZmlsZSBpcyBub3cgdmFsaWQuPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiB0aXRsZT0iVGhlIERPQ1RZUEUgZGVjbGFyYXRpb24gaW4gYW4gWE1MIGZpbGUgaXMgdXNlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24gdG8gY2hhbmdlIHRoZSBEVEQgZmlsZSB5b3VyIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4iPkVkaXRpbmcgRE9DVFlQRSBkZWNsYXJhdGlvbnM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90eG1sY2F0Lmh0bWwiIHRpdGxlPSJBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5Ij5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiB0aXRsZT0iSWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgWE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llcyB0byB1cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIGd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuIj5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgdGl0bGU9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIj5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRkb2MuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGM1YzJkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0ZG9jIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZw0KLW9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24NCi10byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPkRPQ1RZUEUgZGVjbGFyYXRpb25zPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5ET0NUWVBFIGRlY2xhcmF0aW9uczxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5ET0NUWVBFIGRlY2xhcmF0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5ET0NUWVBFIGRlY2xhcmF0aW9uczxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGVkaXQgeW91ciBET0NUWVBFDQotZGVjbGFyYXRpb24sIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgPHVpY29udHJvbD5ET0NUWVBFPC91aWNvbnRyb2w+IGFuZA0KLWNsaWNrIDx1aWNvbnRyb2w+RWRpdCBET0NUWVBFPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5Sb290IGVsZW1lbnQgbmFtZTwvdWljb250cm9sPiBmaWVsZA0KLXNob3VsZCBtYXRjaCB0aGUgcm9vdCBlbGVtZW50IG9mIHlvdXIgWE1MIGZpbGUgZXhhY3RseS48L2NtZD48aW5mbz5Zb3Ugc2hvdWxkDQotb25seSBlZGl0IHRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIGlmIHlvdXIgcm9vdCBlbGVtZW50IGNoYW5nZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdSBjYW4gc2VsZWN0IGEgUHVibGljIElEIGZvciBhbnkgZXhpc3RpbmcgWE1MIENhdGFsb2cgZW50cmllcw0KLWJ5IGNsaWNraW5nIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+LiA8L2NtZD48aW5mbz5UaGUgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+UHVibGljDQotSUQ8L3VpY29udHJvbD4gZmllbGQgaXMgdGhlIFB1YmxpYyBJZGVudGlmaWVyLiBJdCBpcyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUNCi1YTUwgZmlsZSAodXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkpIHdpdGggYSBEVEQgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24NCi1vbiBYTUwgQ2F0YWxvZyBlbnRyaWVzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPlN5c3RlbSBJRDwvdWljb250cm9sPiBmaWVsZCBpcyB0aGUNCi1EVEQgdGhlIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aC4gVHlwZSB0aGUgcGF0aCBvZiB0aGUgRFREIGZpbGUgKG9yIGJyb3dzZQ0KLWZvciBpdCkgeW91IHdhbnQgdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBpbiB0aGlzIGZpZWxkLiA8L2NtZD48aW5mbz4gIDxiPk5vdGU8L2I+Og0KLVdoZW4gdGhlIFhNTCBmaWxlIGlzIHByb2Nlc3NlZCBieSB0aGUgWE1MIHByb2Nlc3NvciwgaXQgd2lsbCBmaXJzdCB0cnkgdG8NCi11c2UgdGhlIFB1YmxpYyBJRCB0byBsb2NhdGUgdGhlIERURCwgYW5kIGlmIHRoaXMgZmFpbHMsIGl0IHdpbGwgdXNlIHRoZSBTeXN0ZW0NCi1JRCB0byBmaW5kIGl0LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cG9zdHJlcT5JZiB5b3UgZG8gbm90IGhhdmUgYSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4NCi1yaWdodC1jbGljayBpbiB0aGUgRGVzaWduIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIERURCBJbmZvcm1hdGlvbjwvdWljb250cm9sPiB0bw0KLWFkZCBvbmUuPC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGRvYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkODc3YTMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZG9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZywgRE9DVFlQRSBkZWNsYXJhdGlvbnMsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGVkaXRpbmcsIERPQ1RZUEUgZGVjbGFyYXRpb25zLCBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRkb2MiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0ZG9jIj48YSBuYW1lPSJ0ZWR0ZG9jIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcKLW9mIGl0IHRvIGFzc29jaWF0ZSBpdCB3aXRoIGEgRFREIGZpbGUuIFlvdSBjYW4gZWRpdCB5b3VyIERPQ1RZUEUgZGVjbGFyYXRpb24KLXRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGVkaXQgeW91ciBET0NUWVBFCi1kZWNsYXJhdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RE9DVFlQRTwvc3Bhbj4gYW5kCi1jbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IERPQ1RZUEU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSB2YWx1ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Um9vdCBlbGVtZW50IG5hbWU8L3NwYW4+IGZpZWxkCi1zaG91bGQgbWF0Y2ggdGhlIHJvb3QgZWxlbWVudCBvZiB5b3VyIFhNTCBmaWxlIGV4YWN0bHkuPC9zcGFuPiBZb3Ugc2hvdWxkCi1vbmx5IGVkaXQgdGhlIHZhbHVlIGluIHRoaXMgZmllbGQgaWYgeW91ciByb290IGVsZW1lbnQgY2hhbmdlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gc2VsZWN0IGEgUHVibGljIElEIGZvciBhbnkgZXhpc3RpbmcgWE1MIENhdGFsb2cgZW50cmllcwotYnkgY2xpY2tpbmcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPi4gPC9zcGFuPiBUaGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlB1YmxpYwotSUQ8L3NwYW4+IGZpZWxkIGlzIHRoZSBQdWJsaWMgSWRlbnRpZmllci4gSXQgaXMgdXNlZCB0byBhc3NvY2lhdGUgdGhlCi1YTUwgZmlsZSAodXNpbmcgYW4gWE1MIENhdGFsb2cgZW50cnkpIHdpdGggYSBEVEQgZmlsZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24KLW9uIFhNTCBDYXRhbG9nIGVudHJpZXMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TeXN0ZW0gSUQ8L3NwYW4+IGZpZWxkIGlzIHRoZQotRFREIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIFR5cGUgdGhlIHBhdGggb2YgdGhlIERURCBmaWxlIChvciBicm93c2UKLWZvciBpdCkgeW91IHdhbnQgdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBpbiB0aGlzIGZpZWxkLiA8L3NwYW4+ICAgPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OgotV2hlbiB0aGUgWE1MIGZpbGUgaXMgcHJvY2Vzc2VkIGJ5IHRoZSBYTUwgcHJvY2Vzc29yLCBpdCB3aWxsIGZpcnN0IHRyeSB0bwotdXNlIHRoZSBQdWJsaWMgSUQgdG8gbG9jYXRlIHRoZSBEVEQsIGFuZCBpZiB0aGlzIGZhaWxzLCBpdCB3aWxsIHVzZSB0aGUgU3lzdGVtCi1JRCB0byBmaW5kIGl0LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+SWYgeW91IGRvIG5vdCBoYXZlIGEgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiB5b3VyIFhNTCBmaWxlLCB5b3UgY2FuCi1yaWdodC1jbGljayBpbiB0aGUgRGVzaWduIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBEVEQgSW5mb3JtYXRpb248L3NwYW4+IHRvCi1hZGQgb25lLjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgKHRoYXQgaXMsIGEgc2V0IG9mIHJ1bGVzKSBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0OGM5OGIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRlbmMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlNwZWNpZnlpbmcgWE1MIGRlZmF1bHQgZW5jb2RpbmcgbGluZSBkZWxpbWl0ZXJzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5TcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVyczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5UaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nDQotdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnNwZWNpZnlpbmcgPGluZGV4dGVybT5saW5lIGRlbGltaXRlcnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+c3BlY2lmeWluZyA8aW5kZXh0ZXJtPmVuY29kaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UbyBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciB5b3Ugd2FudCB0byB1c2U6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MIEZpbGVzPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+TGluZSBkZWxpbWl0ZXI8L3VpY29udHJvbD4gbGlzdCwgc2VsZWN0IHRoZSBvcGVyYXRpbmcNCi1zeXN0ZW0gdGhhdCBhcHBsaWVzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybS4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgPHVpY29udHJvbD5FbmNvZGluZzwvdWljb250cm9sPjw/UHViIENhcmV0Pz4gZmllbGQsIHNwZWNpZnkNCi10aGUgZGVmYXVsdCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2V0IHRoYXQgaXMgdXNlZCB3aGVuIGNyZWF0aW5nIFhNTCByZWxhdGVkDQotZmlsZXMgKERURHMsIFhNTCBmaWxlcywgWE1MIHNjaGVtYXMpLiBDaGFuZ2luZyB0aGUgZW5jb2RpbmcgY2F1c2VzIGFueSBuZXcsDQotWE1MIHJlbGF0ZWQgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiwgdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDE2OTg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGVuYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMGNmZDcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0ZW5jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJTcGVjaWZ5aW5nIFhNTCBkZWZhdWx0IGVuY29kaW5nIGxpbmUgZGVsaW1pdGVycyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHBhZ2UgbGV0cyB5b3Ugc3BlY2lmeSB0aGUgbGluZSBkZWxpbWl0ZXIgYW5kIHRoZSB0ZXh0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSBvciBzYXZlIGFuIFhNTCByZWxhdGVkIGZpbGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcgdGhhdCB3aWxsIGJlIHVzZWQgd2hlbiB5b3UgY3JlYXRlIG9yIHNhdmUgYW4gWE1MIHJlbGF0ZWQgZmlsZS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHNwZWNpZnlpbmcsIGxpbmUgZGVsaW1pdGVycywgZW5jb2RpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHNwZWNpZnlpbmcsIGxpbmUgZGVsaW1pdGVycywgZW5jb2RpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRlbmMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TcGVjaWZ5aW5nIGxpbmUgZGVsaW1pdGVyczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdGVuYyI+PGEgbmFtZT0idGVkdGVuYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U3BlY2lmeWluZyBYTUwgZGVmYXVsdCBlbmNvZGluZyBsaW5lIGRlbGltaXRlcnM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgcGFnZSBsZXRzIHlvdSBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciBhbmQgdGhlIHRleHQgZW5jb2RpbmcKLXRoYXQgd2lsbCBiZSB1c2VkIHdoZW4geW91IGNyZWF0ZSBvciBzYXZlIGFuIFhNTCByZWxhdGVkIGZpbGUuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBzcGVjaWZ5IHRoZSBsaW5lIGRlbGltaXRlciB5b3Ugd2FudCB0byB1c2U6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBGaWxlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5JbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGluZSBkZWxpbWl0ZXI8L3NwYW4+IGxpc3QsIHNlbGVjdCB0aGUgb3BlcmF0aW5nCi1zeXN0ZW0gdGhhdCBhcHBsaWVzIHRvIHlvdXIgZGV2ZWxvcG1lbnQgb3IgZGVwbG95bWVudCBwbGF0Zm9ybS4gPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNvZGluZzwvc3Bhbj4gZmllbGQsIHNwZWNpZnkKLXRoZSBkZWZhdWx0IGNoYXJhY3RlciBlbmNvZGluZyBzZXQgdGhhdCBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgWE1MIHJlbGF0ZWQKLWZpbGVzIChEVERzLCBYTUwgZmlsZXMsIFhNTCBzY2hlbWFzKS4gQ2hhbmdpbmcgdGhlIGVuY29kaW5nIGNhdXNlcyBhbnkgbmV3LAotWE1MIHJlbGF0ZWQgZmlsZXMgdGhhdCBhcmUgY3JlYXRlZCBmcm9tIHNjcmF0Y2ggdG8gdXNlIHRoZSBzZWxlY3RlZCBlbmNvZGluZy48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiwgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY1ZGFjMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRncmFtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRncmFtIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5VcGRhdGluZyBYTUwgZmlsZXMgd2l0aCBjaGFuZ2VzIG1hZGUgdG8gRFREcyBhbmQgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXBkYXRpbmcgWE1MIGZpbGVzIHdpdGggY2hhbmdlcyBtYWRlIHRvIERURHMgYW5kIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IG1ha2UgY2hhbmdlcyB0byBhIERURCBmaWxlIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoDQotYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayA8dWljb250cm9sPlhNTCA+IFJlbG9hZCBEZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gdG8NCi11cGRhdGUgdGhlIFhNTCBmaWxlIHdpdGggdGhlc2UgY2hhbmdlcy4gVGhlIGNoYW5nZXMgd2lsbCBiZSByZWZsZWN0ZWQgaW4gPD9QdWIgQ2FyZXQ/PnRoZQ0KLWd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+dXBkYXRpbmc8aW5kZXh0ZXJtPlhNTCBmaWxlcyB3aXRoDQotYXNzb2NpYXRlZCBjaGFuZ2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPnVwZGF0aW5nDQotd2l0aCBhc3NvY2lhdGVkIGNoYW5nZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkZvciBleGFtcGxlLCB5b3UgaGF2ZSBhIERURCBmaWxlIGNhbGxlZCAiQ29udGFjdC5kdGQiIGFuZCBhbiBYTUwNCi1maWxlIGNhbGxlZCAiQ29udGFjdC54bWwiIGFzc29jaWF0ZWQgd2l0aCBpdC4gQ29udGFjdC5kdGQgY29udGFpbnMgYSByb290DQotZWxlbWVudCBjYWxsZWQgIDx1aWNvbnRyb2w+Q29udGFjdDwvdWljb250cm9sPiB0aGF0IGNhbiBjb250YWluIGFueSBvZiB0aGUNCi1mb2xsb3dpbmcgY2hpbGRyZW4gZWxlbWVudHM6ICA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4sICA8dWljb250cm9sPlBvc3RhbEFkZHJlc3M8L3VpY29udHJvbD4sDQotIDx1aWNvbnRyb2w+RW1haWw8L3VpY29udHJvbD4uIElmIHlvdSByZW1vdmUgdGhlIGNoaWxkIGVsZW1lbnQgIDx1aWNvbnRyb2w+RW1haWw8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSBEVEQsIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFkZCBhbiAgPHVpY29udHJvbD5FbWFpbDwvdWljb250cm9sPiBjaGlsZA0KLWVsZW1lbnQgdG8geW91ciByb290IGVsZW1lbnQgQ29udGFjdCBpbiB5b3VyIENvbnRhY3QueG1sIGZpbGUuIFRoaXMgY2hhbmdlLA0KLWhvd2V2ZXIsIHdpbGwgbm90IGNvbWUgaW50byBlZmZlY3QgdW50aWwgeW91IHNhdmUgeW91ciBjaGFuZ2VzIGluIHRoZSBEVEQNCi1hbmQgY2xpY2sgPHVpY29udHJvbD5YTUwgPiBSZWxvYWQgRGVwZW5kZW5jaWVzPC91aWNvbnRyb2w+IGluIHRoZSBYTUwgZWRpdG9yLg0KLVVudGlsIHlvdSBjbGljayBpdCwgeW91IHdpbGwgc3RpbGwgYmUgYWJsZSB0byBhZGQgPHVpY29udHJvbD5FbWFpbDwvdWljb250cm9sPiBlbGVtZW50cw0KLXRvIENvbnRhY3QueG1sLjwvcD48cD5UaGlzIGZlYXR1cmUgaXMgdmVyeSBoYW5keSB3aGVuIHlvdSBhcmUgbWFraW5nIHVwZGF0ZXMNCi10byBib3RoIERURHMgYW5kIFhNTCBzY2hlbWFzIGFuZCBYTUwgZmlsZXMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIERURHMgYW5kDQotWE1MIHNjaGVtYXMuPC9wPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjA0MD8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0Z3JhbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWFiYTFkLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdGdyYW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBtYWtlIGNoYW5nZXMgdG8gYSBEVEQgZmlsZSBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgZmlsZSAodGhhdCBpcyBjdXJyZW50bHkgb3BlbiksIGNsaWNrIFhNTCAmZ3Q7IFJlbG9hZCBEZXBlbmRlbmNpZXMgdG8gdXBkYXRlIHRoZSBYTUwgZmlsZSB3aXRoIHRoZXNlIGNoYW5nZXMuIFRoZSBjaGFuZ2VzIHdpbGwgYmUgcmVmbGVjdGVkIGluIHRoZSBndWlkZWQgZWRpdGluZyBtZWNoYW5pc21zIGF2YWlsYWJsZSBpbiB0aGUgZWRpdG9yLCBzdWNoIGFzIGNvbnRlbnQgYXNzaXN0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCB1cGRhdGluZywgWE1MIGZpbGVzIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzLCBYTUwgZmlsZXMsIHVwZGF0aW5nIHdpdGggYXNzb2NpYXRlZCBjaGFuZ2VzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgdXBkYXRpbmcsIFhNTCBmaWxlcyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlcywgWE1MIGZpbGVzLCB1cGRhdGluZyB3aXRoIGFzc29jaWF0ZWQgY2hhbmdlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGRvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0Z3JhbSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0Z3JhbSI+PGEgbmFtZT0idGVkdGdyYW0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGgKLWFuIFhNTCBmaWxlICh0aGF0IGlzIGN1cnJlbnRseSBvcGVuKSwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MICZndDsgUmVsb2FkIERlcGVuZGVuY2llczwvc3Bhbj4gdG8KLXVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUKLWd1aWRlZCBlZGl0aW5nIG1lY2hhbmlzbXMgYXZhaWxhYmxlIGluIHRoZSBlZGl0b3IsIHN1Y2ggYXMgY29udGVudCBhc3Npc3QuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYSBEVEQgZmlsZSBjYWxsZWQgIkNvbnRhY3QuZHRkIiBhbmQgYW4gWE1MCi1maWxlIGNhbGxlZCAiQ29udGFjdC54bWwiIGFzc29jaWF0ZWQgd2l0aCBpdC4gQ29udGFjdC5kdGQgY29udGFpbnMgYSByb290Ci1lbGVtZW50IGNhbGxlZCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29udGFjdDwvc3Bhbj4gdGhhdCBjYW4gY29udGFpbiBhbnkgb2YgdGhlCi1mb2xsb3dpbmcgY2hpbGRyZW4gZWxlbWVudHM6ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lPC9zcGFuPiwgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlBvc3RhbEFkZHJlc3M8L3NwYW4+LAotIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVtYWlsPC9zcGFuPi4gSWYgeW91IHJlbW92ZSB0aGUgY2hpbGQgZWxlbWVudCAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW1haWw8L3NwYW4+IGZyb20KLXRoZSBEVEQsIHlvdSB3aWxsIG5vIGxvbmdlciBiZSBhYmxlIHRvIGFkZCBhbiAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW1haWw8L3NwYW4+IGNoaWxkCi1lbGVtZW50IHRvIHlvdXIgcm9vdCBlbGVtZW50IENvbnRhY3QgaW4geW91ciBDb250YWN0LnhtbCBmaWxlLiBUaGlzIGNoYW5nZSwKLWhvd2V2ZXIsIHdpbGwgbm90IGNvbWUgaW50byBlZmZlY3QgdW50aWwgeW91IHNhdmUgeW91ciBjaGFuZ2VzIGluIHRoZSBEVEQKLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzPC9zcGFuPiBpbiB0aGUgWE1MIGVkaXRvci4KLVVudGlsIHlvdSBjbGljayBpdCwgeW91IHdpbGwgc3RpbGwgYmUgYWJsZSB0byBhZGQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW1haWw8L3NwYW4+IGVsZW1lbnRzCi10byBDb250YWN0LnhtbC48L3A+Ci08cD5UaGlzIGZlYXR1cmUgaXMgdmVyeSBoYW5keSB3aGVuIHlvdSBhcmUgbWFraW5nIHVwZGF0ZXMKLXRvIGJvdGggRFREcyBhbmQgWE1MIHNjaGVtYXMgYW5kIFhNTCBmaWxlcyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggRFREcyBhbmQKLVhNTCBzY2hlbWFzLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgKHRoYXQgaXMsIGEgc2V0IG9mIHJ1bGVzKSBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgdGl0bGU9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiB0aXRsZT0iQW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMgYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpICh3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIERURCBvciBYTUwgc2NoZW1hJ3MgbG9jYXRpb24pLiBZb3UgY2FuIHBsYWNlIHRoZSBLZXkgaW4gYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nIGVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleSI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEyNjVmYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRwcm9jIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9uczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHBhc3MgYWxvbmcgdG8gYW4gYXBwbGljYXRpb24NCi11c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+ZWRpdGluZzxpbmRleHRlcm0+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPGluZGV4dGVybT5lZGl0aW5nIDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT5wcm9jZXNzaW5nIGluc3RydWN0aW9uczxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGVkaXQgYSBwcm9jZXNzaW5nDQotaW5zdHJ1Y3Rpb24sIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgeW91ciBwcm9jZXNzaW5nDQotaW5zdHJ1Y3Rpb24sIGFuZCBjbGljayA8dWljb250cm9sPkVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5UYXJnZXQ8L3VpY29udHJvbD4gZmllbGQgaXMgdXNlZCB0byBpZGVudGlmeSB0aGUNCi1hcHBsaWNhdGlvbiB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG9uZ3MgdG8uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIDx1aWNvbnRyb2w+RGF0YTwvdWljb250cm9sPiBmaWVsZCBjb250YWlucyB0aGUgaW5zdHJ1Y3Rpb25zLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+VG8gY3JlYXRlIGEgbmV3IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24sIHJpZ2h0LWNsaWNrIGluIHRoZSBEZXNpZ24NCi12aWV3LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQ2hpbGQ8L3VpY29udHJvbD4sIDx1aWNvbnRyb2w+QWRkIEJlZm9yZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPkFkZA0KLUFmdGVyPC91aWNvbnRyb2w+LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+QWRkIFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3VpY29udHJvbD4uPC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHByb2MuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwNTM0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcm9jLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gcGFzcyBhbG9uZyB0byBhbiBhcHBsaWNhdGlvbiB1c2luZyBhbiBYTUwgZG9jdW1lbnQsIHlvdSBjYW4gdXNlIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iSWYgeW91IGhhdmUgaW5zdHJ1Y3Rpb25zIHlvdSB3YW50IHRvIHBhc3MgYWxvbmcgdG8gYW4gYXBwbGljYXRpb24gdXNpbmcgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZywgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMsIGVkaXRpbmcsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGVkaXRpbmcsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLCBlZGl0aW5nLCBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0cHJvYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0cHJvYyI+PGEgbmFtZT0idGVkdHByb2MiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiB5b3UgaGF2ZSBpbnN0cnVjdGlvbnMgeW91IHdhbnQgdG8gcGFzcyBhbG9uZyB0byBhbiBhcHBsaWNhdGlvbgotdXNpbmcgYW4gWE1MIGRvY3VtZW50LCB5b3UgY2FuIHVzZSBhIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBlZGl0IGEgcHJvY2Vzc2luZwotaW5zdHJ1Y3Rpb24sIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgeW91ciBwcm9jZXNzaW5nCi1pbnN0cnVjdGlvbiwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQgUHJvY2Vzc2luZyBJbnN0cnVjdGlvbjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UYXJnZXQ8L3NwYW4+IGZpZWxkIGlzIHVzZWQgdG8gaWRlbnRpZnkgdGhlCi1hcHBsaWNhdGlvbiB0aGUgaW5zdHJ1Y3Rpb25zIGJlbG9uZ3MgdG8uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGF0YTwvc3Bhbj4gZmllbGQgY29udGFpbnMgdGhlIGluc3RydWN0aW9ucy48L3NwYW4+Ci08L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UbyBjcmVhdGUgYSBuZXcgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiwgcmlnaHQtY2xpY2sgaW4gdGhlIERlc2lnbgotdmlldywgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4sIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBCZWZvcmU8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotQWZ0ZXI8L3NwYW4+LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC9zcGFuPi48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZTJiZjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NoLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRlZHRzY2giIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3VyIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvIHByb3ZpZGUgdmFyaW91cyBpbmZvcm1hdGlvbg0KLWFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQNCi13aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcw0KLWFzc29jaWF0ZWQgd2l0aCBvciBhZGQgYSBuZXcgYXNzb2NpYXRpb24uIE1vZGlmeWluZyBhbnkgYXNzb2NpYXRpb25zIGNhbiBpbXBhY3QNCi13aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+ZWRpdGluZzxpbmRleHRlcm0+bmFtZXNwYWNlIGluZm9ybWF0aW9uPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5uYW1lc3BhY2UgaW5mb3JtYXRpb248aW5kZXh0ZXJtPmVkaXRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+ZWRpdGluZzxpbmRleHRlcm0+bmFtZXNwYWNlIGluZm9ybWF0aW9uPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgZmlsZXM8aW5kZXh0ZXJtPm5hbWVzcGFjZSBpbmZvcm1hdGlvbjxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGVkaXQgeW91ciBzY2hlbWENCi1pbmZvcm1hdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCByaWdodC1jbGljayB5b3VyIHJvb3QgZWxlbWVudA0KLWFuZCBjbGljayA8dWljb250cm9sPkVkaXQgTmFtZXNwYWNlczwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3VyIFhNTCBmaWxlIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggbW9yZSB0aGFuIG9uZSBuYW1lc3BhY2Ugb3INCi1zY2hlbWEuPC9jbWQ+PGluZm8+U2VsZWN0IHRoZSBlbnRyeSB5b3Ugd2FudCB0byBlZGl0IGFuZCBjbGljayA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4uPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5OYW1lc3BhY2UgTmFtZTwvdWljb250cm9sPiBmaWVsZCBpcw0KLWEgbmFtZXNwYWNlIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9jbWQ+PGluZm8+WW91ciBYTUwgZmlsZSBzaG91bGQNCi1iZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNhbWUgbmFtZXNwYWNlKHMpIGl0cyBYTUwgc2NoZW1hIGlzIGFzc29jaWF0ZWQgd2l0aC4NCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBuYW1lc3BhY2VzLCByZWZlciB0byB0aGUgcmVsYXRlZCByZWZlcmVuY2UuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQNCi13aXRoIHRoZSBuYW1lc3BhY2Ugd2lsbCBiZSBwcmVmaXhlZCB3aXRoIHRoZSA8dWljb250cm9sPlByZWZpeDwvdWljb250cm9sPiB2YWx1ZS48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5Mb2NhdGlvbiBIaW50PC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zIHRoZSBsb2NhdGlvbg0KLW9mIHRoZSBYTUwgc2NoZW1hIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9jbWQ+PGluZm8+QW4gWE1MIENhdGFsb2cNCi1LZXkgb3IgYSBuYW1lc3BhY2UgbmFtZSBjYW4gYmUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQuIENsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IHRvDQotdmlldyBhbGwgWE1MIHNjaGVtYXMgaW4gdGhlIHdvcmtiZW5jaCBhbmQgWE1MIENhdGFsb2cuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4sIHRoZW4gY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiBhZ2Fpbi48L2NtZD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBhc3NvY2lhdGlvbiwgY2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4gaW5zdGVhZA0KLW9mIDx1aWNvbnRyb2w+RWRpdDwvdWljb250cm9sPi4gWW91IGNhbiB0aGVuIGVpdGhlciBjbGljayB0aGUgPHVpY29udHJvbD5TcGVjaWZ5DQotRnJvbSBSZWdpc3RlcmVkIE5hbWVzcGFjZTwvdWljb250cm9sPiByYWRpbyBidXR0b24gYW5kIHNlbGVjdCB0aGUgbmFtZXNwYWNlDQotZGVjbGFyYXRpb25zIHlvdSB3YW50IHRvIGFkZCBvciBjbGljayB0aGUgPHVpY29udHJvbD5TcGVjaWZ5IE5ldyBOYW1lc3BhY2U8L3VpY29udHJvbD4gcmFkaW8NCi1idXR0b24gYW5kIGZpbGwgaW4gdGhlIGZpZWxkcyBhcyBuZWNlc3NhcnkuPC9wPjwvcmVzdWx0Pg0KLTxwb3N0cmVxPklmIHlvdSBkbyBub3QgaGF2ZSBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaW4geW91ciBYTUwgZmlsZSwgeW91IGNhbg0KLXJpZ2h0LWNsaWNrIHlvdXIgcm9vdCBlbGVtZW50IGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0DQotTmFtZXNwYWNlczwvdWljb250cm9sPiB0byBhZGQgaXQuIElmIHlvdSBkbyBub3QgaGF2ZSBhIHJvb3QgZWxlbWVudCwgeW91IG11c3QNCi1jcmVhdGUgb25lIGJlZm9yZSB5b3UgY2FuIGFkZCB0aGUgbmFtZXNwYWNlIGluZm9ybWF0aW9uLjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2guaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjY5MzgxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdGVkdHNjaC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZmlsZSwgc3VjaCBhcyB0aGUgWE1MIHNjaGVtYSBhbmQgbmFtZXNwYWNlIGl0IGlzIGFzc29jaWF0ZWQgd2l0aC4gSWYgZGVzaXJlZCwgeW91IGNhbiBjaGFuZ2UgdGhlIHNjaGVtYSBhbmQgbmFtZXNwYWNlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdCB3aGF0IGNvbnRlbnQgaXMgYWxsb3dlZCBpbiB0aGUgWE1MIGZpbGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZywgbmFtZXNwYWNlIGluZm9ybWF0aW9uLCBYTUwgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBuYW1lc3BhY2UgaW5mb3JtYXRpb24sIFhNTCBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhtbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGdyYW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdGRlcy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRlZHRzY2giIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdHNjaCI+PGEgbmFtZT0idGVkdHNjaCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdXIgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gcHJvdmlkZSB2YXJpb3VzIGluZm9ybWF0aW9uCi1hYm91dCB0aGUgWE1MIGZpbGUsIHN1Y2ggYXMgdGhlIFhNTCBzY2hlbWEgYW5kIG5hbWVzcGFjZSBpdCBpcyBhc3NvY2lhdGVkCi13aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcwotYXNzb2NpYXRlZCB3aXRoIG9yIGFkZCBhIG5ldyBhc3NvY2lhdGlvbi4gTW9kaWZ5aW5nIGFueSBhc3NvY2lhdGlvbnMgY2FuIGltcGFjdAotd2hhdCBjb250ZW50IGlzIGFsbG93ZWQgaW4gdGhlIFhNTCBmaWxlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBlZGl0IHlvdXIgc2NoZW1hCi1pbmZvcm1hdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgcmlnaHQtY2xpY2sgeW91ciByb290IGVsZW1lbnQKLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IE5hbWVzcGFjZXM8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdXIgWE1MIGZpbGUgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIG5hbWVzcGFjZSBvcgotc2NoZW1hLjwvc3Bhbj4gU2VsZWN0IHRoZSBlbnRyeSB5b3Ugd2FudCB0byBlZGl0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OYW1lc3BhY2UgTmFtZTwvc3Bhbj4gZmllbGQgaXMKLWEgbmFtZXNwYWNlIHRoZSBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguPC9zcGFuPiBZb3VyIFhNTCBmaWxlIHNob3VsZAotYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzYW1lIG5hbWVzcGFjZShzKSBpdHMgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGguCi1Gb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBuYW1lc3BhY2VzLCByZWZlciB0byB0aGUgcmVsYXRlZCByZWZlcmVuY2UuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFsbCBxdWFsaWZpZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFhNTCBmaWxlIGFzc29jaWF0ZWQKLXdpdGggdGhlIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZpeDwvc3Bhbj4gdmFsdWUuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TG9jYXRpb24gSGludDwvc3Bhbj4gZmllbGQgY29udGFpbnMgdGhlIGxvY2F0aW9uCi1vZiB0aGUgWE1MIHNjaGVtYSB0aGUgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLjwvc3Bhbj4gQW4gWE1MIENhdGFsb2cKLUtleSBvciBhIG5hbWVzcGFjZSBuYW1lIGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhpcyBmaWVsZC4gQ2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiB0bwotdmlldyBhbGwgWE1MIHNjaGVtYXMgaW4gdGhlIHdvcmtiZW5jaCBhbmQgWE1MIENhdGFsb2cuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4sIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IGFnYWluLjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPklmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBhc3NvY2lhdGlvbiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPiBpbnN0ZWFkCi1vZiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPi4gWW91IGNhbiB0aGVuIGVpdGhlciBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlY2lmeQotRnJvbSBSZWdpc3RlcmVkIE5hbWVzcGFjZTwvc3Bhbj4gcmFkaW8gYnV0dG9uIGFuZCBzZWxlY3QgdGhlIG5hbWVzcGFjZQotZGVjbGFyYXRpb25zIHlvdSB3YW50IHRvIGFkZCBvciBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlY2lmeSBOZXcgTmFtZXNwYWNlPC9zcGFuPiByYWRpbwotYnV0dG9uIGFuZCBmaWxsIGluIHRoZSBmaWVsZHMgYXMgbmVjZXNzYXJ5LjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5JZiB5b3UgZG8gbm90IGhhdmUgbmFtZXNwYWNlIGluZm9ybWF0aW9uIGluIHlvdXIgWE1MIGZpbGUsIHlvdSBjYW4KLXJpZ2h0LWNsaWNrIHlvdXIgcm9vdCBlbGVtZW50IGluIHRoZSBEZXNpZ24gdmlldyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdAotTmFtZXNwYWNlczwvc3Bhbj4gdG8gYWRkIGl0LiBJZiB5b3UgZG8gbm90IGhhdmUgYSByb290IGVsZW1lbnQsIHlvdSBtdXN0Ci1jcmVhdGUgb25lIGJlZm9yZSB5b3UgY2FuIGFkZCB0aGUgbmFtZXNwYWNlIGluZm9ybWF0aW9uLjwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIHRpdGxlPSJJbiB0aGUgRGVzaWduIHZpZXcsIHdoZW4geW91IGVkaXQgYW4gWE1MIGZpbGUgdGhhdCBoYXMgYSBzZXQgb2YgY29uc3RyYWludHMgKHRoYXQgaXMsIGEgc2V0IG9mIHJ1bGVzKSBkZWZpbmVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gdHVybiB0aGUgY29uc3RyYWludHMgb24gYW5kIG9mZiB0byBwcm92aWRlIGZsZXhpYmlsaXR5IGluIHRoZSB3YXkgeW91IGVkaXQsIGJ1dCBzdGlsbCBtYWludGFpbiB0aGUgdmFsaWRpdHkgb2YgdGhlIGRvY3VtZW50IHBlcmlvZGljYWxseS4iPkVkaXRpbmcgd2l0aCBEVEQgb3IgWE1MIHNjaGVtYSBjb25zdHJhaW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4bWxjYXQuaHRtbCIgdGl0bGU9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRkZXMuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxpbmZvIj48c3Ryb25nPlJlbGF0ZWQgaW5mb3JtYXRpb248L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmh0bWwiPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RzdWdzdHJhdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmFiOWYwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+U2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3Q8L3RpdGxlPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQNCi1hc3Npc3QgYnkgY2hvb3NpbmcgYSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHByZWZlcmVuY2UuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kNCi1pcyBzZXQgdG8gIlN0cmljdCIsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlICdzdHJpY3RseScgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsDQotYmUgZGlzcGxheWVkIGZpcnN0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMgYW5kIGhpZ2hsaWdodGVkIGJ5IGJvbGQgaWNvbnMuIE90aGVyDQotc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5DQotdmFsaWQsIHdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbg0KLXRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byAiTGF4IiwgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluDQotdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnNldHRpbmc8aW5kZXh0ZXJtPnNvdXJjZSBzdWdnZXN0aW9uDQotc3RyYXRlZ3k8P1B1YiBDYXJldD8+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD5UbyBzZXQgdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgdXNlZCBieSBjb250ZW50IGFzc2lzdDo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+RnJvbSB0aGUgbWVudSBiYXIsIENsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPg0KLTx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MDQotRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBTb3VyY2U8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5CZXNpZGUgU3VnZ2VzdGlvbiBzdHJhdGVneSBpbiB0aGUgQ29udGVudCBhc3Npc3Qgc2VjdGlvbiwgc2VsZWN0DQotdGhlIGFwcHJvcHJpYXRlIHNldHRpbmcgKGZvciBleGFtcGxlLCA8dWljb250cm9sPlN0cmljdDwvdWljb250cm9sPikuPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPGV4YW1wbGU+PHA+VGhlIGZvbGxvd2luZyBzY3JlZW4gY2FwdHVyZSBkZW1vbnN0cmF0ZXMgY29udGVudCBhc3Npc3Qgd2l0aA0KLXRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHNldCB0byAiU3RyaWN0Ijo8L3A+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9zdWdnZXN0aW9uLmdpZiINCi1wbGFjZW1lbnQ9ImJyZWFrIj48YWx0PkV4YW1wbGUgb2YgU3RyaWN0IFN1Z2dlc3Rpb24gU3RyYXRlZ3k8L2FsdD48L2ltYWdlPjwvZXhhbXBsZT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMTkxNz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHN1Z3N0cmF0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NGZmOTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90c3Vnc3RyYXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0IiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gJnF1b3Q7U3RyaWN0JnF1b3Q7LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSAnc3RyaWN0bHknIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvICZxdW90O0xheCZxdW90OywgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBjdXN0b21pemUgdGhlIGZvcm1hdHRpbmcgb2YgdGhlIHN1Z2dlc3Rpb25zIGdpdmVuIGJ5IGNvbnRlbnQgYXNzaXN0IGJ5IGNob29zaW5nIGEgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IGlzIHNldCB0byAmcXVvdDtTdHJpY3QmcXVvdDssIHN1Z2dlc3Rpb25zIHRoYXQgYXJlICdzdHJpY3RseScgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsIGJlIGRpc3BsYXllZCBmaXJzdCBpbiB0aGUgbGlzdCBvZiBvcHRpb25zIGFuZCBoaWdobGlnaHRlZCBieSBib2xkIGljb25zLiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoaXMgZWxlbWVudCdzIHNjb3BlIGJ1dCBhcmUgbm90IGdyYW1tYXRpY2FsbHkgdmFsaWQsIHdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gJnF1b3Q7TGF4JnF1b3Q7LCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4gdGhlIGxpc3Qgd2l0aCBkZS1lbXBoYXNpemVkIGljb25zLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNldHRpbmcsIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgc2V0dGluZywgc291cmNlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHdjZGFzdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ4bWxzb3VyY2VzdWdnZXN0aW9uc3RyYXRlZ3kiPjxhIG5hbWU9InhtbHNvdXJjZXN1Z2dlc3Rpb25zdHJhdGVneSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+U2V0dGluZyB0aGUgWE1MIHNvdXJjZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHVzZWQgYnkgY29udGVudCBhc3Npc3Q8L2gxPgotCi0KLQotPGRpdj48cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgZm9ybWF0dGluZyBvZiB0aGUgc3VnZ2VzdGlvbnMgZ2l2ZW4gYnkgY29udGVudAotYXNzaXN0IGJ5IGNob29zaW5nIGEgc3VnZ2VzdGlvbiBzdHJhdGVneSBwcmVmZXJlbmNlLiBXaGVuIHRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5Ci1pcyBzZXQgdG8gIlN0cmljdCIsIHN1Z2dlc3Rpb25zIHRoYXQgYXJlICdzdHJpY3RseScgZ3JhbW1hdGljYWxseSB2YWxpZCB3aWxsCi1iZSBkaXNwbGF5ZWQgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIKLXN1Z2dlc3Rpb25zIHRoYXQgYXJlIGFwcGxpY2FibGUgdG8gdGhpcyBlbGVtZW50J3Mgc2NvcGUgYnV0IGFyZSBub3QgZ3JhbW1hdGljYWxseQotdmFsaWQsIHdpbGwgYmUgZGlzcGxheWVkIGxvd2VyIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4gV2hlbgotdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvICJMYXgiLCBhbGwgc3VnZ2VzdGlvbnMgd2lsbCBkaXNwbGF5ZWQgaW4KLXRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIHNldCB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0OjwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+RnJvbSB0aGUgbWVudSBiYXIsIENsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+PC9zcGFuPjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1GaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgU291cmNlPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5CZXNpZGUgU3VnZ2VzdGlvbiBzdHJhdGVneSBpbiB0aGUgQ29udGVudCBhc3Npc3Qgc2VjdGlvbiwgc2VsZWN0Ci10aGUgYXBwcm9wcmlhdGUgc2V0dGluZyAoZm9yIGV4YW1wbGUsIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlN0cmljdDwvc3Bhbj4pLjwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9ImV4YW1wbGUiPjxwPlRoZSBmb2xsb3dpbmcgc2NyZWVuIGNhcHR1cmUgZGVtb25zdHJhdGVzIGNvbnRlbnQgYXNzaXN0IHdpdGgKLXRoZSBzdWdnZXN0aW9uIHN0cmF0ZWd5IHNldCB0byAiU3RyaWN0Ijo8L3A+Ci08YnIgLz48aW1nIHNyYz0iLi4vaW1hZ2VzL3N1Z2dlc3Rpb24uZ2lmIiBhbHQ9IkV4YW1wbGUgb2YgU3RyaWN0IFN1Z2dlc3Rpb24gU3RyYXRlZ3kiIC8+PGJyIC8+PC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHRhZ2hpbHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY1NGM2MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR0YWdoaWx0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UNCi1jb2RlIGlzIGRpc3BsYXllZCBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IsIHN1Y2ggYXMgdGhlIGNvbG9ycw0KLXRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgWE1MIGNvZGUsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPiBYTUwNCi1TdHlsZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5Db250ZW50IHR5cGU8L3VpY29udHJvbD4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UNCi10YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldCBhIGhpZ2hsaWdodGluZyBzdHlsZSBmb3IuIFlvdSBjYW4gYWxzbyBjbGljaw0KLXRleHQgaW4gdGhlIHNhbXBsZSB0ZXh0IHRvIHNwZWNpZnkgdGhlIHNvdXJjZSB0YWcgdHlwZSB0aGF0IHlvdSB3aXNoIHRvIHNldA0KLWEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Gb3JlZ3JvdW5kPC91aWNvbnRyb2w+IGJveC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5CYWNrZ3JvdW5kPC91aWNvbnRyb2w+IGJveC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdG8gYXBwZWFyIGJlaGluZCB0aGUgdGFnIGFuZCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5Cb2xkPC91aWNvbnRyb2w+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bw0KLW1ha2UgdGhlIHR5cGUgYm9sZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZw0KLXN0eWxlcyBiYWNrIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLiBJZiB5b3Ugb25seSB3YW50IHRvIHJlc2V0IHRoZSB2YWx1ZSBmb3INCi1hIHBhcnRpY3VsYXIgY29udGVudCB0eXBlLCBzZWxlY3QgaXQgaW4gdGhlIDx1aWNvbnRyb2w+Q29udGVudCB0eXBlIDwvdWljb250cm9sPiA8P1B1YiBDYXJldD8+ZmllbGQsDQotdGhlIGNsaWNrIHRoZSA8dWljb250cm9sPlJlc3RvcmUgRGVmYXVsdDwvdWljb250cm9sPiBidXR0b24gbmV4dCB0byBpdC4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMjYyPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R0YWdoaWx0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMmRkNDguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dGFnaGlsdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iU2V0dGluZyBzb3VyY2UgaGlnaGxpZ2h0aW5nIHN0eWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB2YXJpb3VzIGFzcGVjdHMgb2YgaG93IHRoZSBYTUwgc291cmNlIGNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzIHRoZSB0YWdzIHdpbGwgYmUgZGlzcGxheWVkIGluLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBzZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHRhZ2hpbHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0dGFnaGlsdCI+PGEgbmFtZT0idHRhZ2hpbHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlNldHRpbmcgc291cmNlIGhpZ2hsaWdodGluZyBzdHlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UKLWNvZGUgaXMgZGlzcGxheWVkIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvciwgc3VjaCBhcyB0aGUgY29sb3JzCi10aGUgdGFncyB3aWxsIGJlIGRpc3BsYXllZCBpbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIHNldCBoaWdobGlnaHRpbmcgc3R5bGVzIGZvciB0aGUgWE1MIGNvZGUsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2luZG93PC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByZWZlcmVuY2VzPC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V2ViIGFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBYTUwKLVN0eWxlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRlbnQgdHlwZTwvc3Bhbj4gbGlzdCwgc2VsZWN0IHRoZSBzb3VyY2UKLXRhZyB0eXBlIHRoYXQgeW91IHdpc2ggdG8gc2V0IGEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci4gWW91IGNhbiBhbHNvIGNsaWNrCi10ZXh0IGluIHRoZSBzYW1wbGUgdGV4dCB0byBzcGVjaWZ5IHRoZSBzb3VyY2UgdGFnIHR5cGUgdGhhdCB5b3Ugd2lzaCB0byBzZXQKLWEgaGlnaGxpZ2h0aW5nIHN0eWxlIGZvci48L3NwYW4+PC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JlZ3JvdW5kPC9zcGFuPiBib3guPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIGNvbG9yIHRoYXQgeW91IHdhbnQgdGhlIHRleHQgb2YgdGhlIHRhZyB0byBhcHBlYXIgaW4KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmFja2dyb3VuZDwvc3Bhbj4gYm94Ljwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+U2VsZWN0IHRoZSBjb2xvciB0aGF0IHlvdSB3YW50IHRvIGFwcGVhciBiZWhpbmQgdGhlIHRhZyBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJvbGQ8L3NwYW4+IGNoZWNrIGJveCBpZiB5b3Ugd2FudCB0bwotbWFrZSB0aGUgdHlwZSBib2xkLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiB0byBzZXQgdGhlIGhpZ2hsaWdodGluZwotc3R5bGVzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuIElmIHlvdSBvbmx5IHdhbnQgdG8gcmVzZXQgdGhlIHZhbHVlIGZvcgotYSBwYXJ0aWN1bGFyIGNvbnRlbnQgdHlwZSwgc2VsZWN0IGl0IGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IHR5cGUgPC9zcGFuPiBmaWVsZCwKLXRoZSBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVzdG9yZSBEZWZhdWx0PC9zcGFuPiBidXR0b24gbmV4dCB0byBpdC4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPiB0byBzYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiIgLz4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWVjZTE2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdjZGFzdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InR3Y2Rhc3QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mDQotY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QNCi10byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgZWRpdG9yPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+Y29udGVudCBhc3Npc3Q8L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTA0KLWZpbGVzPGluZGV4dGVybT5lZGl0aW5nPGluZGV4dGVybT5jb250ZW50IGFzc2lzdDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+PD9QdWIgQ2FyZXQxPz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgcGxhY2VtZW50IG9mIHRoZSBjdXJzb3IgaW4geW91ciBzb3VyY2UgZmlsZSBwcm92aWRlcyB0aGUgY29udGV4dA0KLWZvciB0aGUgY29udGVudCBhc3Npc3QgdG8gb2ZmZXIgc3VnZ2VzdGlvbnMgZm9yIGNvbXBsZXRpb24uPC9wPjxwPllvdSBjYW4NCi1sYXVuY2ggY29udGVudCBhc3Npc3QgaW4gZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmcgd2F5czo8L3A+PHVsPg0KLTxsaT5Gcm9tIHRoZSA8dWljb250cm9sPkVkaXQ8L3VpY29udHJvbD4gbWVudSwgY2xpY2sgPHVpY29udHJvbD5Db250ZW50IEFzc2lzdDwvdWljb250cm9sPiwNCi1vcjwvbGk+DQotPGxpPlByZXNzIEN0cmwrU3BhY2U8L2xpPg0KLTwvdWw+PHA+SW4gYWRkaXRpb24sIHlvdSBjYW4gc2V0IHVwIGFuIG9wdGlvbiB0aGF0IGNhdXNlcyBjb250ZW50IGFzc2lzdCB0bw0KLXBvcCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VydGFpbiBjaGFyYWN0ZXJzIGFyZSB0eXBlZC4gVG8gc2V0IHVwIHRoaXMgb3B0aW9uLA0KLWNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+IFByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gdG8gb3BlbiB0aGUgUHJlZmVyZW5jZXMgd2luZG93LCB0aGVuIGNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldlYg0KLWFuZCBYTUw8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBGaWxlcyA8L3VpY29udHJvbD48dWljb250cm9sPlhNTCBTb3VyY2U8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiAuIEluIHRoZSA8dWljb250cm9sPkNvbnRlbnQgYXNzaXN0PC91aWNvbnRyb2w+IGdyb3VwIGJveCwgc2VsZWN0DQotdGhlIDx1aWNvbnRyb2w+QXV0b21hdGljYWxseSBtYWtlIHN1Z2dlc3Rpb25zPC91aWNvbnRyb2w+IGNoZWNrIGJveCwgYW5kIHN1cHBseQ0KLWFueSBhZGRpdGlvbmFsIGNoYXJhY3RlcnMgdGhhdCBzaG91bGQgdHJpZ2dlciBjb250ZW50IGFzc2lzdC48L3A+PHA+SWYgeW91cg0KLWN1cnNvciBpcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZg0KLWF2YWlsYWJsZSBjaG9pY2VzIGlzIGRpc3BsYXllZCB3aGVuIHlvdSBsYXVuY2ggY29udGVudCBhc3Npc3QuIFRoZSBsaXN0IGlzDQotYmFzZWQgb24gdGhlIGNvbnRleHQgYW5kIHdoZXRoZXIgYSBEVEQgb3IgWE1MIHNjaGVtYSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlDQotWE1MIGZpbGUgYmVpbmcgZWRpdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gQWRkcmVzcyBlbGVtZW50IHRoYXQgY2FuDQotY29udGFpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjaGlsZHJlbiBlbGVtZW50czogTmFtZSwgU3RyZWV0LCBDaXR5LCBaaXAgQ29kZSwNCi1Db3VudHJ5LCBhbmQgUHJvdmluY2UsIGFuZCB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYWZ0ZXIgYW55IG9mIHRoZW0gYW5kIGxhdW5jaA0KLWNvbnRlbnQgYXNzaXN0LCBhbGwgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgbGlzdGVkIGluIHRoZSBjb250ZW50IGFzc2lzdA0KLWxpc3QuPC9wPjxwPlRoZSBjb250ZW50IGFzc2lzdCBsaXN0IGRpc3BsYXlzIGFsbCB2YWxpZCB0YWdzIGZvciB0aGUgY3VycmVudA0KLWN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gSWYgeW91ciBncmFtbWFyIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQNCi1vZmYsIGFsbCBhdmFpbGFibGUgdGFncywgbm90IGp1c3QgdmFsaWQgb25lcyBhcmUgZGlzcGxheWVkLiA8L3A+PHA+IDwvcD48cD5Bcw0KLXlvdSB0eXBlIHRoZSBmaXJzdCBvbmUgb3IgdHdvIGxldHRlcnMgb2YgdGhlIHRhZyB0aGF0IHlvdSB3YW50LCB0aGUgbGlzdCBhdXRvbWF0aWNhbGx5DQotcmVmcmVzaGVzIHdpdGggYWxwaGFiZXRpemVkIGNob2ljZXMgdGhhdCBtYXRjaCB5b3VyIGlucHV0LjwvcD48cD48Yj5Ob3RlPC9iPjoNCi1UaGUgbGlzdCBvbmx5IHJlZnJlc2hlcyBhcyBkZXNjcmliZWQgaWYgeW91IGZpcnN0IHR5cGUgPHVzZXJpbnB1dD4mbHQ7PC91c2VyaW5wdXQ+IGJlZm9yZQ0KLXByb21wdGluZyBmb3IgY29udGVudCBhc3Npc3QuPC9wPjxwPlNjcm9sbCBkb3duIGFuZCBzZWxlY3QgdGhlIHRhZyB0aGF0IHlvdQ0KLXdhbnQgdG8gdXNlIGJ5IGRvdWJsZS1jbGlja2luZyBvbiBpdC4gPC9wPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMzA2MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d2NkYXN0Lmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwZTA1MC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3Y2Rhc3QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdCIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5pc2ggYSB0YWcgb3IgbGluZSBvZiBjb2RlIGluIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MIGVkaXRvci4gWW91IGNhbiBhbHNvIHVzZSBjb250ZW50IGFzc2lzdCB0byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YgY29kZSBpbiB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3IuIFlvdSBjYW4gYWxzbyB1c2UgY29udGVudCBhc3Npc3QgdG8gaW5zZXJ0IHRlbXBsYXRlcyBpbnRvIHlvdXIgWE1MIGNvZGUuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIGVkaXRvciwgZWRpdGluZywgY29udGVudCBhc3Npc3QsIFhNTCBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIGVkaXRpbmcsIGNvbnRlbnQgYXNzaXN0LCBYTUwgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R3bWFjcm8uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RzdWdzdHJhdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR3Y2Rhc3QiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Vc2luZyBYTUwgY29udGVudCBhc3Npc3Q8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR3Y2Rhc3QiPjxhIG5hbWU9InR3Y2Rhc3QiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzaW5nIFhNTCBjb250ZW50IGFzc2lzdDwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiB1c2UgY29udGVudCBhc3Npc3QgdG8gaGVscCB5b3UgZmluaXNoIGEgdGFnIG9yIGxpbmUgb2YKLWNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0Ci10byBpbnNlcnQgdGVtcGxhdGVzIGludG8geW91ciBYTUwgY29kZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBwbGFjZW1lbnQgb2YgdGhlIGN1cnNvciBpbiB5b3VyIHNvdXJjZSBmaWxlIHByb3ZpZGVzIHRoZSBjb250ZXh0Ci1mb3IgdGhlIGNvbnRlbnQgYXNzaXN0IHRvIG9mZmVyIHN1Z2dlc3Rpb25zIGZvciBjb21wbGV0aW9uLjwvcD4KLTxwPllvdSBjYW4KLWxhdW5jaCBjb250ZW50IGFzc2lzdCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB3YXlzOjwvcD4KLTx1bD4KLTxsaT5Gcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPiBtZW51LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IEFzc2lzdDwvc3Bhbj4sCi1vcjwvbGk+Ci0KLTxsaT5QcmVzcyBDdHJsK1NwYWNlPC9saT4KLQotPC91bD4KLTxwPkluIGFkZGl0aW9uLCB5b3UgY2FuIHNldCB1cCBhbiBvcHRpb24gdGhhdCBjYXVzZXMgY29udGVudCBhc3Npc3QgdG8KLXBvcCB1cCBhdXRvbWF0aWNhbGx5IHdoZW4gY2VydGFpbiBjaGFyYWN0ZXJzIGFyZSB0eXBlZC4gVG8gc2V0IHVwIHRoaXMgb3B0aW9uLAotY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IFByZWZlcmVuY2VzPC9zcGFuPgotPC9zcGFuPiB0byBvcGVuIHRoZSBQcmVmZXJlbmNlcyB3aW5kb3csIHRoZW4gY2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIKLWFuZCBYTUw8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MIEZpbGVzIDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgU291cmNlPC9zcGFuPgotPC9zcGFuPiAuIEluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db250ZW50IGFzc2lzdDwvc3Bhbj4gZ3JvdXAgYm94LCBzZWxlY3QKLXRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdXRvbWF0aWNhbGx5IG1ha2Ugc3VnZ2VzdGlvbnM8L3NwYW4+IGNoZWNrIGJveCwgYW5kIHN1cHBseQotYW55IGFkZGl0aW9uYWwgY2hhcmFjdGVycyB0aGF0IHNob3VsZCB0cmlnZ2VyIGNvbnRlbnQgYXNzaXN0LjwvcD4KLTxwPklmIHlvdXIKLWN1cnNvciBpcyBpbiBhIHBvc2l0aW9uIHdoZXJlIGNvbnRlbnQgYXNzaXN0IGlzIGF2YWlsYWJsZSwgYSBwb3AtdXAgbGlzdCBvZgotYXZhaWxhYmxlIGNob2ljZXMgaXMgZGlzcGxheWVkIHdoZW4geW91IGxhdW5jaCBjb250ZW50IGFzc2lzdC4gVGhlIGxpc3QgaXMKLWJhc2VkIG9uIHRoZSBjb250ZXh0IGFuZCB3aGV0aGVyIGEgRFREIG9yIFhNTCBzY2hlbWEgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZQotWE1MIGZpbGUgYmVpbmcgZWRpdGVkLiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYW4gQWRkcmVzcyBlbGVtZW50IHRoYXQgY2FuCi1jb250YWluIGFueSBvZiB0aGUgZm9sbG93aW5nIGNoaWxkcmVuIGVsZW1lbnRzOiBOYW1lLCBTdHJlZXQsIENpdHksIFppcCBDb2RlLAotQ291bnRyeSwgYW5kIFByb3ZpbmNlLCBhbmQgeW91IHBsYWNlIHlvdXIgY3Vyc29yIGFmdGVyIGFueSBvZiB0aGVtIGFuZCBsYXVuY2gKLWNvbnRlbnQgYXNzaXN0LCBhbGwgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIHdpbGwgYmUgbGlzdGVkIGluIHRoZSBjb250ZW50IGFzc2lzdAotbGlzdC48L3A+Ci08cD5UaGUgY29udGVudCBhc3Npc3QgbGlzdCBkaXNwbGF5cyBhbGwgdmFsaWQgdGFncyBmb3IgdGhlIGN1cnJlbnQKLWN1cnNvciBwb3NpdGlvbiwgaW5jbHVkaW5nIHRlbXBsYXRlcy4gSWYgeW91ciBncmFtbWFyIGNvbnN0cmFpbnRzIGFyZSB0dXJuZWQKLW9mZiwgYWxsIGF2YWlsYWJsZSB0YWdzLCBub3QganVzdCB2YWxpZCBvbmVzIGFyZSBkaXNwbGF5ZWQuIDwvcD4KLTxwPiA8L3A+Ci08cD5BcwoteW91IHR5cGUgdGhlIGZpcnN0IG9uZSBvciB0d28gbGV0dGVycyBvZiB0aGUgdGFnIHRoYXQgeW91IHdhbnQsIHRoZSBsaXN0IGF1dG9tYXRpY2FsbHkKLXJlZnJlc2hlcyB3aXRoIGFscGhhYmV0aXplZCBjaG9pY2VzIHRoYXQgbWF0Y2ggeW91ciBpbnB1dC48L3A+Ci08cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46Ci1UaGUgbGlzdCBvbmx5IHJlZnJlc2hlcyBhcyBkZXNjcmliZWQgaWYgeW91IGZpcnN0IHR5cGUgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij4mbHQ7PC9rYmQ+IGJlZm9yZQotcHJvbXB0aW5nIGZvciBjb250ZW50IGFzc2lzdC48L3A+Ci08cD5TY3JvbGwgZG93biBhbmQgc2VsZWN0IHRoZSB0YWcgdGhhdCB5b3UKLXdhbnQgdG8gdXNlIGJ5IGRvdWJsZS1jbGlja2luZyBvbiBpdC4gPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90d21hY3JvLmh0bWwiIHRpdGxlPSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiI+V29ya2luZyB3aXRoIFhNTCB0ZW1wbGF0ZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90c3Vnc3RyYXQuaHRtbCIgdGl0bGU9IllvdSBjYW4gY3VzdG9taXplIHRoZSBmb3JtYXR0aW5nIG9mIHRoZSBzdWdnZXN0aW9ucyBnaXZlbiBieSBjb250ZW50IGFzc2lzdCBieSBjaG9vc2luZyBhIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgcHJlZmVyZW5jZS4gV2hlbiB0aGUgc3VnZ2VzdGlvbiBzdHJhdGVneSBpcyBzZXQgdG8gJnF1b3Q7U3RyaWN0JnF1b3Q7LCBzdWdnZXN0aW9ucyB0aGF0IGFyZSAnc3RyaWN0bHknIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBkaXNwbGF5ZWQgZmlyc3QgaW4gdGhlIGxpc3Qgb2Ygb3B0aW9ucyBhbmQgaGlnaGxpZ2h0ZWQgYnkgYm9sZCBpY29ucy4gT3RoZXIgc3VnZ2VzdGlvbnMgdGhhdCBhcmUgYXBwbGljYWJsZSB0byB0aGlzIGVsZW1lbnQncyBzY29wZSBidXQgYXJlIG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIGRpc3BsYXllZCBsb3dlciBpbiB0aGUgbGlzdCB3aXRoIGRlLWVtcGhhc2l6ZWQgaWNvbnMuIFdoZW4gdGhlIHN1Z2dlc3Rpb24gc3RyYXRlZ3kgaXMgc2V0IHRvICZxdW90O0xheCZxdW90OywgYWxsIHN1Z2dlc3Rpb25zIHdpbGwgZGlzcGxheWVkIGluIHRoZSBsaXN0IHdpdGggZGUtZW1waGFzaXplZCBpY29ucy4iPlNldHRpbmcgdGhlIFhNTCBzb3VyY2Ugc3VnZ2VzdGlvbiBzdHJhdGVneSB1c2VkIGJ5IGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ODU1YzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3bWFjcm8iIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5YTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQNCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuDQoteW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdQ0KLWRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCB0ZW1wbGF0ZXM8aW5kZXh0ZXJtPmNyZWF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgdGVtcGxhdGVzPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwNCi10ZW1wbGF0ZXM8aW5kZXh0ZXJtPnJlbW92aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgdGVtcGxhdGVzPGluZGV4dGVybT5pbXBvcnRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCB0ZW1wbGF0ZXM8aW5kZXh0ZXJtPmV4cG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WW91IGNhbiB1c2UgYSBkZWZhdWx0IHRlbXBsYXRlIGFzIHByb3ZpZGVkLCBjdXN0b21pemUgdGhhdCB0ZW1wbGF0ZSwNCi1vciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD5Gb3IgZXhhbXBsZSwgeW91IGNhbiB3b3JrIG9uIGEgZ3JvdXAgb2YgWE1MDQotcGFnZXMgdGhhdCBzaG91bGQgYWxsIGNvbnRhaW4gYSB0YWJsZSB3aXRoIGEgc3BlY2lmaWMgYXBwZWFyYW5jZS4gQ3JlYXRlIGENCi10ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zIHRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlDQotYXR0cmlidXRlcyBhbmQgYXR0cmlidXRlIHZhbHVlcyBmb3IgZWFjaCB0YWcuIChZb3UgY2FuIGNvcHkgYW5kIHBhc3RlIHRoZQ0KLXRhZ3MgZnJvbSBhIHN0cnVjdHVyZWQgdGV4dCBlZGl0b3IgaW50byB0aGUgdGVtcGxhdGUncyA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZmllbGQuKQ0KLVRoZW4gc2VsZWN0IHRoZSBuYW1lIG9mIHRoZSB0ZW1wbGF0ZSBmcm9tIGEgY29udGVudCBhc3Npc3QgcHJvcG9zYWwgbGlzdCB3aGVuZXZlcg0KLXlvdSB3YW50IHRvIGluc2VydCB5b3VyIGN1c3RvbSB0YWJsZSBpbnRvIGFuIFhNTCBmaWxlLjxwPlRvIGNyZWF0ZSBhIG5ldyBYTUwNCi10ZW1wbGF0ZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5DbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5XaW5kb3c8L3VpY29udHJvbD48dWljb250cm9sPlByZWZlcmVuY2VzPC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5XZWIgYW5kIFhNTDwvdWljb250cm9sPjx1aWNvbnRyb2w+WE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwNCi1UZW1wbGF0ZXM8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk5ldzwvdWljb250cm9sPiBpZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBjb21wbGV0ZWx5DQotbmV3IHRlbXBsYXRlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlN1cHBseSBhIG5ldyB0ZW1wbGF0ZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gYW5kIDx1aWNvbnRyb2w+RGVzY3JpcHRpb248L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+U3BlY2lmeSB0aGUgPHVpY29udHJvbD5Db250ZXh0PC91aWNvbnRyb2w+IGZvciB0aGUgdGVtcGxhdGUuPC9jbWQ+DQotPGluZm8+VGhpcyBpcyB0aGUgY29udGV4dCBpbiB3aGljaCB0aGUgdGVtcGxhdGUgaXMgYXZhaWxhYmxlIGluIHRoZSBwcm9wb3NhbA0KLWxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIDwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TcGVjaWZ5IHRoZSA8dWljb250cm9sPlBhdHRlcm48L3VpY29udHJvbD4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcNCi10aGUgYXBwcm9wcmlhdGUgdGFncywgYXR0cmlidXRlcywgb3IgYXR0cmlidXRlIHZhbHVlcyB0byBiZSBpbnNlcnRlZCBieSBjb250ZW50DQotYXNzaXN0LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGluc2VydCBhIHZhcmlhYmxlLCBjbGljayB0aGUgPHVpY29udHJvbD5JbnNlcnQgVmFyaWFibGU8L3VpY29udHJvbD4gYnV0dG9uDQotYW5kIHNlbGVjdCB0aGUgdmFyaWFibGUgdG8gYmUgaW5zZXJ0ZWQuIDwvY21kPjxpbmZvPkZvciBleGFtcGxlLCB0aGUgPGI+ZGF0ZTwvYj4gdmFyaWFibGUNCi1pbmRpY2F0ZXMgdGhlIGN1cnJlbnQgZGF0ZSB3aWxsIGJlIGluc2VydGVkLiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5BcHBseTwvdWljb250cm9sPiBhbmQgdGhlbiA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotc2F2ZSB5b3VyIGNoYW5nZXMuPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUNCi1wcmVmZXJlbmNlcyBwYWdlLiBJZiB5b3UgaGF2ZSBtb2RpZmllZCBhIGRlZmF1bHQgdGVtcGxhdGUsIHlvdSBjYW4gcmVzdG9yZQ0KLWl0IHRvIGl0cyBkZWZhdWx0IHZhbHVlLiBZb3UgY2FuIGFsc28gcmVzdG9yZSBhIHJlbW92ZWQgdGVtcGxhdGUgaWYgeW91IGhhdmUNCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC4gPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQ0KLXRoYXQgeW91IGRvIG5vdCB3YW50IHRvIHJlbW92ZSBidXQgeW91IG5vIGxvbmdlciB3YW50IGl0IHRvIGFwcGVhciBpbiB0aGUNCi1jb250ZW50IGFzc2lzdCBsaXN0LCBnbyB0byB0aGUgPGI+WE1MIFRlbXBsYXRlczwvYj4gcHJlZmVyZW5jZXMgcGFnZSBhbmQgY2xlYXINCi1pdHMgY2hlY2sgYm94LjwvcD48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDM0Mjc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHdtYWNyby5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjZmM1MTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90d21hY3JvLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJXb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJYTUwgY29udGVudCBhc3Npc3QgcHJvdmlkZXMgYSBjb21tZW50IHRlbXBsYXRlLCBhIGNodW5rIG9mIHByZWRlZmluZWQgY29kZSB0aGF0IHlvdSBjYW4gaW5zZXJ0IGludG8gYSBmaWxlLiBZb3UgbWF5IGZpbmQgYSB0ZW1wbGF0ZSB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91IGRvIG5vdCB3YW50IHRvIHdyaXRlIGl0IG91dCBldmVyeSB0aW1lLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCB0ZW1wbGF0ZXMsIGNyZWF0aW5nLCBlZGl0aW5nLCBYTUwgdGVtcGxhdGVzLCByZW1vdmluZywgaW1wb3J0aW5nLCBleHBvcnRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgdGVtcGxhdGVzLCBjcmVhdGluZywgZWRpdGluZywgWE1MIHRlbXBsYXRlcywgcmVtb3ZpbmcsIGltcG9ydGluZywgZXhwb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHdtYWNybyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0d21hY3JvIj48YSBuYW1lPSJ0d21hY3JvIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggWE1MIHRlbXBsYXRlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkCi1jb2RlIHRoYXQgeW91IGNhbiBpbnNlcnQgaW50byBhIGZpbGUuIFlvdSBtYXkgZmluZCBhIHRlbXBsYXRlIHVzZWZ1bCB3aGVuCi15b3UgaGF2ZSBhIGNlcnRhaW4gcGllY2Ugb2YgY29kZSB5b3Ugd2FudCB0byByZXVzZSBzZXZlcmFsIHRpbWVzLCBhbmQgeW91Ci1kbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPllvdSBjYW4gdXNlIGEgZGVmYXVsdCB0ZW1wbGF0ZSBhcyBwcm92aWRlZCwgY3VzdG9taXplIHRoYXQgdGVtcGxhdGUsCi1vciBjcmVhdGUgeW91ciBvd24gdGVtcGxhdGVzLjwvcD4KLUZvciBleGFtcGxlLCB5b3UgY2FuIHdvcmsgb24gYSBncm91cCBvZiBYTUwKLXBhZ2VzIHRoYXQgc2hvdWxkIGFsbCBjb250YWluIGEgdGFibGUgd2l0aCBhIHNwZWNpZmljIGFwcGVhcmFuY2UuIENyZWF0ZSBhCi10ZW1wbGF0ZSB0aGF0IGNvbnRhaW5zIHRoZSB0YWdzIGZvciB0aGF0IHRhYmxlLCBpbmNsdWRpbmcgdGhlIGFwcHJvcHJpYXRlCi1hdHRyaWJ1dGVzIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGZvciBlYWNoIHRhZy4gKFlvdSBjYW4gY29weSBhbmQgcGFzdGUgdGhlCi10YWdzIGZyb20gYSBzdHJ1Y3R1cmVkIHRleHQgZWRpdG9yIGludG8gdGhlIHRlbXBsYXRlJ3MgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZmllbGQuKQotVGhlbiBzZWxlY3QgdGhlIG5hbWUgb2YgdGhlIHRlbXBsYXRlIGZyb20gYSBjb250ZW50IGFzc2lzdCBwcm9wb3NhbCBsaXN0IHdoZW5ldmVyCi15b3Ugd2FudCB0byBpbnNlcnQgeW91ciBjdXN0b20gdGFibGUgaW50byBhbiBYTUwgZmlsZS48cD5UbyBjcmVhdGUgYSBuZXcgWE1MCi10ZW1wbGF0ZSBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1UZW1wbGF0ZXM8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXc8L3NwYW4+IGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGNvbXBsZXRlbHkKLW5ldyB0ZW1wbGF0ZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TdXBwbHkgYSBuZXcgdGVtcGxhdGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2NyaXB0aW9uPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnRleHQ8L3NwYW4+IGZvciB0aGUgdGVtcGxhdGUuPC9zcGFuPgotIFRoaXMgaXMgdGhlIGNvbnRleHQgaW4gd2hpY2ggdGhlIHRlbXBsYXRlIGlzIGF2YWlsYWJsZSBpbiB0aGUgcHJvcG9zYWwKLWxpc3Qgd2hlbiBjb250ZW50IGFzc2lzdCBpcyByZXF1ZXN0ZWQuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U3BlY2lmeSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UGF0dGVybjwvc3Bhbj4gZm9yIHlvdXIgdGVtcGxhdGUgdXNpbmcKLXRoZSBhcHByb3ByaWF0ZSB0YWdzLCBhdHRyaWJ1dGVzLCBvciBhdHRyaWJ1dGUgdmFsdWVzIHRvIGJlIGluc2VydGVkIGJ5IGNvbnRlbnQKLWFzc2lzdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbnNlcnQgYSB2YXJpYWJsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluc2VydCBWYXJpYWJsZTwvc3Bhbj4gYnV0dG9uCi1hbmQgc2VsZWN0IHRoZSB2YXJpYWJsZSB0byBiZSBpbnNlcnRlZC4gPC9zcGFuPiBGb3IgZXhhbXBsZSwgdGhlIDxzdHJvbmc+ZGF0ZTwvc3Ryb25nPiB2YXJpYWJsZQotaW5kaWNhdGVzIHRoZSBjdXJyZW50IGRhdGUgd2lsbCBiZSBpbnNlcnRlZC4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHBseTwvc3Bhbj4gYW5kIHRoZW4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvCi1zYXZlIHlvdXIgY2hhbmdlcy48L3NwYW4+PC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+WW91IGNhbiBlZGl0LCByZW1vdmUsIGltcG9ydCwgb3IgZXhwb3J0IGEgdGVtcGxhdGUgYnkgdXNpbmcgdGhlIHNhbWUKLXByZWZlcmVuY2VzIHBhZ2UuIElmIHlvdSBoYXZlIG1vZGlmaWVkIGEgZGVmYXVsdCB0ZW1wbGF0ZSwgeW91IGNhbiByZXN0b3JlCi1pdCB0byBpdHMgZGVmYXVsdCB2YWx1ZS4gWW91IGNhbiBhbHNvIHJlc3RvcmUgYSByZW1vdmVkIHRlbXBsYXRlIGlmIHlvdSBoYXZlCi1ub3QgZXhpdGVkIGZyb20gdGhlIHdvcmtiZW5jaCBzaW5jZSBpdCB3YXMgcmVtb3ZlZC4gPHA+SWYgeW91IGhhdmUgYSB0ZW1wbGF0ZQotdGhhdCB5b3UgZG8gbm90IHdhbnQgdG8gcmVtb3ZlIGJ1dCB5b3Ugbm8gbG9uZ2VyIHdhbnQgaXQgdG8gYXBwZWFyIGluIHRoZQotY29udGVudCBhc3Npc3QgbGlzdCwgZ28gdG8gdGhlIDxzdHJvbmc+WE1MIFRlbXBsYXRlczwvc3Ryb25nPiBwcmVmZXJlbmNlcyBwYWdlIGFuZCBjbGVhcgotaXRzIGNoZWNrIGJveC48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzUzNTBiNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR3eHZhbGlkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBmaWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VmFsaWRhdGluZyBYTUwgZmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+V2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0bw0KLXNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGZpbGVzPGluZGV4dGVybT52YWxpZGF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgWE1MIGVkaXRvciB3aWxsIHByb2Nlc3MgWE1MIGZpbGVzIHRoYXQgYXJlIGludmFsaWQgb3Igbm90DQotd2VsbC1mb3JtZWQuIFRoZSBlZGl0b3IgdXNlcyBoZXVyaXN0aWNzIHRvIG9wZW4gYSBmaWxlIHVzaW5nIHRoZSBiZXN0IGludGVycHJldGF0aW9uDQotb2YgdGhlIHRhZ2dpbmcgdGhhdCBpdCBjYW4uIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIGVuZCB0YWcNCi1pcyBzaW1wbHkgYXNzdW1lZCB0byBlbmQgYXQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuIEFzIHlvdSBtYWtlIHVwZGF0ZXMgdG8NCi1hIGZpbGUsIHRoZSBlZGl0b3IgaW5jcmVtZW50YWxseSByZWludGVycHJldHMgeW91ciBkb2N1bWVudCwgY2hhbmdpbmcgdGhlDQotaGlnaGxpZ2h0aW5nLCB0cmVlIHZpZXcsIGFuZCBzbyBvbi4gTWFueSBmb3JtYXRpb24gZXJyb3JzIGFyZSBlYXN5IHRvIHNwb3QNCi1pbiB0aGUgc3ludGF4IGhpZ2hsaWdodGluZywgc28geW91IGNhbiBlYXNpbHkgY29ycmVjdCBvYnZpb3VzIGVycm9ycyBvbi10aGUtZmx5Lg0KLUhvd2V2ZXIsIHRoZXJlIHdpbGwgYmUgb3RoZXIgY2FzZXMgd2hlbiBpdCB3aWxsIGJlIGJlbmVmaWNpYWwgdG8gcGVyZm9ybSBmb3JtYWwNCi12YWxpZGF0aW9uIG9uIHlvdXIgZG9jdW1lbnRzLjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiB2YWxpZGF0ZSB5b3VyIGZpbGUgYnkgc2VsZWN0aW5nIGl0IGluIHRoZSBOYXZpZ2F0b3IgdmlldywNCi1yaWdodC1jbGlja2luZyBpdCwgYW5kIGNsaWNraW5nIDx1aWNvbnRyb2w+VmFsaWRhdGUgWE1MIGZpbGU8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5BbnkgdmFsaWRhdGlvbiBwcm9ibGVtcyBhcmUgaW5kaWNhdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiA8L3A+PC9yZXN1bHQ+DQotPHBvc3RyZXE+PHA+SW4gdGhlIFByb2JsZW1zIHZpZXcsIHlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGluZGl2aWR1YWwgZXJyb3JzLA0KLWFuZCB5b3Ugd2lsbCBiZSB0YWtlbiB0byB0aGUgaW52YWxpZCB0YWcgaW4gdGhlIGZpbGUsIHNvIHRoYXQgeW91IGNhbiBtYWtlDQotY29ycmVjdGlvbnMuIDwvcD48cD48Yj5Ob3RlPC9iPjogSWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nDQotdGhhdCB0aGUgUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMNCi1hbGxvd2VkIGJ5IHNlbGVjdGluZyA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5Qcm9wZXJ0aWVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5WYWxpZGF0aW9uPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gZnJvbSB0aGUgcHJvamVjdCdzIHBvcC11cCBtZW51IGFuZCBzcGVjaWZ5aW5nIHRoZSBtYXhpbXVtIG51bWJlcg0KLW9mIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQuIFlvdSBtdXN0IHNlbGVjdCB0aGUgPHVpY29udHJvbD5PdmVycmlkZSB2YWxpZGF0aW9uDQotcHJlZmVyZW5jZXM8L3VpY29udHJvbD4gY2hlY2sgYm94IGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZG8gdGhpcy48L3A+PHA+QXMNCi13ZWxsLCB5b3UgY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QNCi1yZXNvdXJjZXMgYXJlIGF1dG9tYXRpY2FsbHkgdmFsaWRhdGVkIHdoZW4geW91IHNhdmUgdGhlbS4gRnJvbSBhIHByb2plY3Qncw0KLXBvcC11cCBtZW51IHNlbGVjdCA8dWljb250cm9sPlByb3BlcnRpZXM8L3VpY29udHJvbD4sIHRoZW4gc2VsZWN0IDx1aWNvbnRyb2w+VmFsaWRhdGlvbjwvdWljb250cm9sPi4NCi1BbnkgdmFsaWRhdG9ycyB5b3UgY2FuIHJ1biBhZ2FpbnN0IHlvdXIgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgVmFsaWRhdGlvbg0KLXBhZ2UuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5kaXRhIiBzY29wZT0icGVlciI+DQotPGRlc2M+R2VuZXJhbCB2YWxpZGF0aW9uIGluZm9ybWF0aW9uPC9kZXNjPg0KLTwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHd4dmFsaWQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I1ZWNhNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R3eHZhbGlkLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIHlvdSB2YWxpZGF0ZSB5b3VyIFhNTCBmaWxlLCB0aGUgWE1MIHZhbGlkYXRvciB3aWxsIGNoZWNrIHRvIHNlZSB0aGF0IHlvdXIgZmlsZSBpcyB2YWxpZCBhbmQgd2VsbC1mb3JtZWQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IHZhbGlkYXRlIHlvdXIgWE1MIGZpbGUsIHRoZSBYTUwgdmFsaWRhdG9yIHdpbGwgY2hlY2sgdG8gc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHd4dmFsaWQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5WYWxpZGF0aW5nIFhNTCBmaWxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHd4dmFsaWQiPjxhIG5hbWU9InR3eHZhbGlkIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5WYWxpZGF0aW5nIFhNTCBmaWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgdmFsaWRhdGUgeW91ciBYTUwgZmlsZSwgdGhlIFhNTCB2YWxpZGF0b3Igd2lsbCBjaGVjayB0bwotc2VlIHRoYXQgeW91ciBmaWxlIGlzIHZhbGlkIGFuZCB3ZWxsLWZvcm1lZC48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBYTUwgZWRpdG9yIHdpbGwgcHJvY2VzcyBYTUwgZmlsZXMgdGhhdCBhcmUgaW52YWxpZCBvciBub3QKLXdlbGwtZm9ybWVkLiBUaGUgZWRpdG9yIHVzZXMgaGV1cmlzdGljcyB0byBvcGVuIGEgZmlsZSB1c2luZyB0aGUgYmVzdCBpbnRlcnByZXRhdGlvbgotb2YgdGhlIHRhZ2dpbmcgdGhhdCBpdCBjYW4uIEZvciBleGFtcGxlLCBhbiBlbGVtZW50IHdpdGggYSBtaXNzaW5nIGVuZCB0YWcKLWlzIHNpbXBseSBhc3N1bWVkIHRvIGVuZCBhdCB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4gQXMgeW91IG1ha2UgdXBkYXRlcyB0bwotYSBmaWxlLCB0aGUgZWRpdG9yIGluY3JlbWVudGFsbHkgcmVpbnRlcnByZXRzIHlvdXIgZG9jdW1lbnQsIGNoYW5naW5nIHRoZQotaGlnaGxpZ2h0aW5nLCB0cmVlIHZpZXcsIGFuZCBzbyBvbi4gTWFueSBmb3JtYXRpb24gZXJyb3JzIGFyZSBlYXN5IHRvIHNwb3QKLWluIHRoZSBzeW50YXggaGlnaGxpZ2h0aW5nLCBzbyB5b3UgY2FuIGVhc2lseSBjb3JyZWN0IG9idmlvdXMgZXJyb3JzIG9uLXRoZS1mbHkuCi1Ib3dldmVyLCB0aGVyZSB3aWxsIGJlIG90aGVyIGNhc2VzIHdoZW4gaXQgd2lsbCBiZSBiZW5lZmljaWFsIHRvIHBlcmZvcm0gZm9ybWFsCi12YWxpZGF0aW9uIG9uIHlvdXIgZG9jdW1lbnRzLjwvcD4KLTwvZGl2PgotCi0KLTxkaXYgY2xhc3M9InAiPjxzcGFuPllvdSBjYW4gdmFsaWRhdGUgeW91ciBmaWxlIGJ5IHNlbGVjdGluZyBpdCBpbiB0aGUgTmF2aWdhdG9yIHZpZXcsCi1yaWdodC1jbGlja2luZyBpdCwgYW5kIGNsaWNraW5nIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRlIFhNTCBmaWxlPC9zcGFuPi48L3NwYW4+Ci08L2Rpdj4KLQotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BbnkgdmFsaWRhdGlvbiBwcm9ibGVtcyBhcmUgaW5kaWNhdGVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiA8L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+SW4gdGhlIFByb2JsZW1zIHZpZXcsIHlvdSBjYW4gZG91YmxlLWNsaWNrIG9uIGluZGl2aWR1YWwgZXJyb3JzLAotYW5kIHlvdSB3aWxsIGJlIHRha2VuIHRvIHRoZSBpbnZhbGlkIHRhZyBpbiB0aGUgZmlsZSwgc28gdGhhdCB5b3UgY2FuIG1ha2UKLWNvcnJlY3Rpb25zLiA8L3A+Ci08cD48c3Ryb25nPk5vdGU8L3N0cm9uZz46IElmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2UgaW5kaWNhdGluZwotdGhhdCB0aGUgUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgZXJyb3IgbWVzc2FnZXMKLWFsbG93ZWQgYnkgc2VsZWN0aW5nIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYWxpZGF0aW9uPC9zcGFuPgotPC9zcGFuPiBmcm9tIHRoZSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUgYW5kIHNwZWNpZnlpbmcgdGhlIG1heGltdW0gbnVtYmVyCi1vZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkLiBZb3UgbXVzdCBzZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk92ZXJyaWRlIHZhbGlkYXRpb24KLXByZWZlcmVuY2VzPC9zcGFuPiBjaGVjayBib3ggaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBkbyB0aGlzLjwvcD4KLTxwPkFzCi13ZWxsLCB5b3UgY2FuIHNldCB1cCBhIHByb2plY3QncyBwcm9wZXJ0aWVzIHNvIHRoYXQgZGlmZmVyZW50IHR5cGVzIG9mIHByb2plY3QKLXJlc291cmNlcyBhcmUgYXV0b21hdGljYWxseSB2YWxpZGF0ZWQgd2hlbiB5b3Ugc2F2ZSB0aGVtLiBGcm9tIGEgcHJvamVjdCdzCi1wb3AtdXAgbWVudSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvcGVydGllczwvc3Bhbj4sIHRoZW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhbGlkYXRpb248L3NwYW4+LgotQW55IHZhbGlkYXRvcnMgeW91IGNhbiBydW4gYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24KLXBhZ2UuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbGluZm8iPjxzdHJvbmc+UmVsYXRlZCBpbmZvcm1hdGlvbjwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuaHRtbCIgdGl0bGU9IkdlbmVyYWwgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbiI+Li4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWw8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTI1ZWNhLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDk0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0eGVkdGRlcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgaW4gdGhlIERlc2lnbiB2aWV3PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZQ0KLXNpbXVsdGFuZW91c2x5IGFzIGEgdGFibGUgYW5kIGEgdHJlZS4gVGhpcyBoZWxwcyBtYWtlIG5hdmlnYXRpb24gYW5kIGVkaXRpbmcNCi1lYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsDQotd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvcg0KLXRoYXQgcGFydGljdWxhciBlbGVtZW50Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPmluIHRoZSBEZXNpZ24NCi12aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gRm9yIGV4YW1wbGUsIHRoZSA8dWljb250cm9sPkFkZCBjaGlsZDwvdWljb250cm9sPiBtZW51IGl0ZW0gd2lsbA0KLWxpc3Qgb25seSB0aG9zZSBlbGVtZW50cyBmcm9tIGEgRFREIG9yIFhNTCBzY2hlbWEgd2hpY2ggd291bGQgYmUgdmFsaWQgY2hpbGRyZW4NCi1hdCB0aGF0IHBvaW50LjwvcD48cD5XaGVuIHlvdSBoYXZlIGFuIFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwgc2NoZW1hDQotb3IgRFREIGZpbGUsIGNlcnRhaW4gdGFncyBhbmQgcnVsZXMgZm9yIHRoYXQgZmlsZSBoYXZlIGFscmVhZHkgYmVlbiBlc3RhYmxpc2hlZCwNCi13aGljaCBpcyB3aHkgdGhlIERlc2lnbiB2aWV3IGNhbiBwcm92aWRlIHByb21wdHMgKHZpYSBhIHBvcC11cCBtZW51KSBmb3IgdGhvc2UNCi10YWdzLiBXaGVuIHlvdSBjcmVhdGUgYW4gWE1MIGZpbGUgdGhhdCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWENCi1vciBEVEQgZmlsZSwgaXQgaGFzIG5vIHRhZ3Mgb3IgcnVsZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBzbyB0aGUgRGVzaWduIHZpZXcNCi1jYW5ub3QgcHJvdmlkZSBwcm9tcHRzIGZvciBzcGVjaWZpYyB0YWdzLCBidXQgaXQgY2FuIHByb3ZpZGUgcHJvbXB0cyB0byBjcmVhdGUNCi1uZXcgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMuPC9wPjxwPkZvciBhbnkgWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTA0KLXNjaGVtYSBvciBEVEQgZmlsZSwgeW91IGNhbiB1c2UgdGhlIERlc2lnbiB2aWV3IHRvIGFkZCBhbnkgaXRlbXMgZGVmaW5lZCBpbg0KLXRoZSBYTUwgc2NoZW1hIG9yIERURCAoc3VjaCBhcyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcykgdG8gdGhlIFhNTCBmaWxlLiBZb3UNCi1jYW4gYWxzbyB1c2UgaXQgdG8gYWRkIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFuZCBjb21tZW50cyB0byBhbGwgWE1MIGZpbGVzLjwvcD48cD5Gb3INCi1tb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBpY29ucyB1c2VkIGluIHRoZSBEZXNpZ24gdmlldywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQNCi1yZWZlcmVuY2UuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWVkaXQgYW4gWE1MIGZpbGUgaW4gdGhlIERlc2lnbiB2aWV3LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHRoZSBYTUwgZmlsZSB0aGF0IHlvdSB3YW50IHRvIHdvcmsgd2l0aCBpbiB0aGUgWE1MIGVkaXRvcg0KLShyaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoDQotPiBYTUwgRWRpdG9yPC91aWNvbnRyb2w+KS4gSWYgbmVjZXNzYXJ5LCBjbGljayB0aGUgPHVpY29udHJvbD5EZXNpZ248L3VpY29udHJvbD4gdGFiLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGV4cGFuZCBhbGwgdGhlIGl0ZW1zIGluIHlvdXIgWE1MIGZpbGUsIGNsaWNrIHRoZSA8dWljb250cm9sPkV4cGFuZA0KLUFsbDwvdWljb250cm9sPiB0b29sYmFyIGJ1dHRvbiAgPGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9leHBhbmRfYWxsLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgRXhwYW5kIEFsbCB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGNvbGxhcHNlIHRoZW0sIGNsaWNrIHRoZSA8dWljb250cm9sPkNvbGxhcHNlIEFsbDwvdWljb250cm9sPiB0b29sYmFyDQotYnV0dG9uICA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL2NvbGxhcHNlX2FsbC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLUNvbGxhcHNlIEFsbCB0b29sYmFyIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlJpZ2h0LWNsaWNrIHRoZSBpdGVtIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoLjwvY21kPjxpbmZvPlNvbWUNCi1vciBhbGwgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zIChhcyBhcHBsaWNhYmxlKSB3aWxsIGJlIGF2YWlsYWJsZSBmcm9tIHRoZQ0KLXBvcC11cCBtZW51IHRoYXQgYXBwZWFyczo8dWw+DQotPGxpPiA8dWljb250cm9sPkFkZCBEVEQgSW5mb3JtYXRpb248L3VpY29udHJvbD4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvDQotYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFRELjwvbGk+DQotPGxpPiA8dWljb250cm9sPkVkaXQgRE9DVFlQRTwvdWljb250cm9sPiAtIENsaWNrIHRoaXMgaWYgeW91IHdhbnQgdG8gZWRpdA0KLXRoZSBET0NUWVBFIGRlY2xhcmF0aW9uLiBSZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuPC9saT4NCi08bGk+IDx1aWNvbnRyb2w+RWRpdCBOYW1lc3BhY2VzPC91aWNvbnRyb2w+IC0gQ2xpY2sgdGhpcyBpZiB5b3Ugd2FudCB0byBlZGl0DQotdGhlIGV4aXN0aW5nIG5hbWVzcGFjZSBpbmZvcm1hdGlvbiBvciBjcmVhdGUgYSBuZXcgYXNzb2NpYXRpb24gd2l0aCBhIG5hbWVzcGFjZS4NCi1SZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuPC9saT4NCi08bGk+IDx1aWNvbnRyb2w+RWRpdCBQcm9jZXNzaW5nIEluc3RydWN0aW9uPC91aWNvbnRyb2w+IC0gQ2xpY2sgdGhpcyBpZiB5b3UNCi13YW50IHRvIGVkaXQgdGhlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUNCi1kZXRhaWxzLjwvbGk+DQotPGxpPiA8dWljb250cm9sPlJlbW92ZTwvdWljb250cm9sPiAtIENsaWNrIHRoaXMgaWYgeW91IHdhbnQgdG8gcmVtb3ZlIHRoZQ0KLWl0ZW0gdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCBmcm9tIHRoZSBYTUwgZmlsZS4gVGhpcyBvcHRpb24gd2lsbCBub3QgYmUgYXZhaWxhYmxlDQotaWYgdGhlIGl0ZW0geW91IHdhbnQgdG8gcmVtb3ZlIG11c3QgZXhpc3QgKGZvciBleGFtcGxlLCBpbiB5b3VyIERURCwgeW91IGhhdmUNCi1kZWNsYXJlZCB0aGF0ICJPbmUgb3IgbW9yZSIgb2YgdGhlIGl0ZW0gbXVzdCBhbHdheXMgZXhpc3QgaW4geW91ciBYTUwgZmlsZSwNCi1hbmQgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQgaXMgdGhlIG9ubHkgb25lIHRoYXQgZXhpc3RzIGluIHlvdXIgWE1MIGZpbGUpLjwvbGk+DQotPGxpPiA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGU8L3VpY29udHJvbD4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvIGFkZA0KLWFuIGF0dHJpYnV0ZSB0byB0aGUgZWxlbWVudCB0aGF0IHlvdSBzZWxlY3RlZC4gQW55IGF0dHJpYnV0ZXMgeW91IGFyZSBhbGxvd2VkDQotdG8gYWRkIHRvIHRoZSBlbGVtZW50IHdpbGwgYmUgbGlzdGVkLiBBZnRlciB5b3UgaGF2ZSBhZGRlZCB0aGUgYXR0cmlidXRlIHRvDQotdGhlIFhNTCBmaWxlLCB5b3UgY2FuIGNsaWNrIGluIHRoZSByaWdodC1oYW5kIGNvbHVtbiB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mDQotdGhlIGF0dHJpYnV0ZS4gSWYgdGhlIGF0dHJpYnV0ZSBoYXMgc2V0IHZhbHVlcywgdGhleSB3aWxsIGFwcGVhciBpbiBhIGxpc3Q8P1B1YiBDYXJldD8+LjwvbGk+DQotPGxpPiA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiAtIENsaWNrIHRoaXMgdG8gYWRkIGFub3RoZXIgZWxlbWVudCwNCi1hIGNvbW1lbnQsIG9yIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgZWxlbWVudC48L2xpPg0KLTxsaT4gPHVpY29udHJvbD5BZGQgQmVmb3JlPC91aWNvbnRyb2w+ICAtIENsaWNrIHRoaXMgdG8gYWRkIGEgY2hpbGQgZWxlbWVudCwNCi1jb21tZW50LCBvciBwcm9jZXNzaW5nIGluc3RydWN0aW9uIHRoYXQgY2FuIGdvIGJlZm9yZSB0aGUgaXRlbSB5b3UgaGF2ZSBzZWxlY3RlZC4NCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgIkNEIENvbGxlY3Rpb25zIiB0aGF0IGNhbg0KLWNvbnRhaW4gYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgIkNEIiwgeW91IGNvdWxkIGNsaWNrIGEgQ0QNCi1lbGVtZW50IGFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5BZGQgQmVmb3JlPC91aWNvbnRyb2w+PHVpY29udHJvbD4gQ0Q8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiAsIGFzIGEgQ0QgZWxlbWVudCBjYW4gZ28gYmVmb3JlIGFub3RoZXIgQ0QgZWxlbWVudC48L2xpPg0KLTxsaT4gPHVpY29udHJvbD5BZGQgQWZ0ZXI8L3VpY29udHJvbD4gLSBDbGljayB0aGlzIHRvIGFkZCBhIGNoaWxkIGVsZW1lbnQsDQotY29tbWVudCwgb3IgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB0aGF0IGNhbiBnbyBhZnRlciB0aGUgaXRlbSB5b3UgaGF2ZSBzZWxlY3RlZC4NCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgIkNEIENvbGxlY3Rpb25zIiB0aGF0IGNhbg0KLWNvbnRhaW4gYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgIkNEIiwgeW91IGNvdWxkIGNsaWNrIGEgQ0QNCi1lbGVtZW50IGFuZCBjbGljayAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+QWRkIEFmdGVyPC91aWNvbnRyb2w+PHVpY29udHJvbD4gQ0Q8L3VpY29udHJvbD4NCi08L21lbnVjYXNjYWRlPiwgYXMgYSBDRCBlbGVtZW50IGNhbiBnbyBhZnRlciBhbm90aGVyIENEIGVsZW1lbnQuPC9saT4NCi08bGk+IDx1aWNvbnRyb2w+UmVwbGFjZSBXaXRoPC91aWNvbnRyb2w+IC0gQ2xpY2sgdGhpcyBpZiB5b3Ugd2FudCB0byByZXBsYWNlDQotb25lIGl0ZW0gd2l0aCBhbm90aGVyLiBUaGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIGlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMNCi1vZmYgb3IgaWYgdGhlcmUgYXJlIG5vIHZhbGlkIGFsdGVybmF0aXZlcyBmb3IgeW91IHRvIHJlcGxhY2UgdGhlIGl0ZW0gd2l0aC48L2xpPg0KLTwvdWw+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSBhcHByb3ByaWF0ZSBvcHRpb24uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgRGVzaWduIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQ0KLVNvdXJjZSB2aWV3IGFuZCB0aGUgT3V0bGluZSB2aWV3LjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNTk3MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eGVkdGRlcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2UwNWIyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRkZXMuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZSBzaW11bHRhbmVvdXNseSBhcyBhIHRhYmxlIGFuZCBhIHRyZWUuIFRoaXMgaGVscHMgbWFrZSBuYXZpZ2F0aW9uIGFuZCBlZGl0aW5nIGVhc2llci4gQ29udGVudCBhbmQgYXR0cmlidXRlIHZhbHVlcyBjYW4gYmUgZWRpdGVkIGRpcmVjdGx5IGluIHRoZSB0YWJsZSBjZWxscywgd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvciB0aGF0IHBhcnRpY3VsYXIgZWxlbWVudC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBpbiB0aGUgRGVzaWduIHZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBpbiB0aGUgRGVzaWduIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0cHJvYy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvcnhtbGJpY29ucy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0ZGVzIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0ZGVzIj48YSBuYW1lPSJ0eGVkdGRlcyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBpbiB0aGUgRGVzaWduIHZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoZSBYTUwgZWRpdG9yIGhhcyBhIERlc2lnbiB2aWV3LCB3aGljaCByZXByZXNlbnRzIHRoZSBYTUwgZmlsZQotc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZwotZWFzaWVyLiBDb250ZW50IGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGNhbiBiZSBlZGl0ZWQgZGlyZWN0bHkgaW4gdGhlIHRhYmxlIGNlbGxzLAotd2hpbGUgcG9wLXVwIG1lbnVzIG9uIHRoZSB0cmVlIGVsZW1lbnRzIGdpdmUgYWx0ZXJuYXRpdmVzIHRoYXQgYXJlIHZhbGlkIGZvcgotdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD4gRm9yIGV4YW1wbGUsIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgY2hpbGQ8L3NwYW4+IG1lbnUgaXRlbSB3aWxsCi1saXN0IG9ubHkgdGhvc2UgZWxlbWVudHMgZnJvbSBhIERURCBvciBYTUwgc2NoZW1hIHdoaWNoIHdvdWxkIGJlIHZhbGlkIGNoaWxkcmVuCi1hdCB0aGF0IHBvaW50LjwvcD4KLTxwPldoZW4geW91IGhhdmUgYW4gWE1MIGZpbGUgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTCBzY2hlbWEKLW9yIERURCBmaWxlLCBjZXJ0YWluIHRhZ3MgYW5kIHJ1bGVzIGZvciB0aGF0IGZpbGUgaGF2ZSBhbHJlYWR5IGJlZW4gZXN0YWJsaXNoZWQsCi13aGljaCBpcyB3aHkgdGhlIERlc2lnbiB2aWV3IGNhbiBwcm92aWRlIHByb21wdHMgKHZpYSBhIHBvcC11cCBtZW51KSBmb3IgdGhvc2UKLXRhZ3MuIFdoZW4geW91IGNyZWF0ZSBhbiBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIHNjaGVtYQotb3IgRFREIGZpbGUsIGl0IGhhcyBubyB0YWdzIG9yIHJ1bGVzIGFzc29jaWF0ZWQgd2l0aCBpdCwgc28gdGhlIERlc2lnbiB2aWV3Ci1jYW5ub3QgcHJvdmlkZSBwcm9tcHRzIGZvciBzcGVjaWZpYyB0YWdzLCBidXQgaXQgY2FuIHByb3ZpZGUgcHJvbXB0cyB0byBjcmVhdGUKLW5ldyBlbGVtZW50cyBhbmQgYXR0cmlidXRlcy48L3A+Ci08cD5Gb3IgYW55IFhNTCBmaWxlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwKLXNjaGVtYSBvciBEVEQgZmlsZSwgeW91IGNhbiB1c2UgdGhlIERlc2lnbiB2aWV3IHRvIGFkZCBhbnkgaXRlbXMgZGVmaW5lZCBpbgotdGhlIFhNTCBzY2hlbWEgb3IgRFREIChzdWNoIGFzIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzKSB0byB0aGUgWE1MIGZpbGUuIFlvdQotY2FuIGFsc28gdXNlIGl0IHRvIGFkZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhbmQgY29tbWVudHMgdG8gYWxsIFhNTCBmaWxlcy48L3A+Ci08cD5Gb3IKLW1vcmUgaW5mb3JtYXRpb24gb24gdGhlIGljb25zIHVzZWQgaW4gdGhlIERlc2lnbiB2aWV3LCByZWZlciB0byB0aGUgcmVsYXRlZAotcmVmZXJlbmNlLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWVkaXQgYW4gWE1MIGZpbGUgaW4gdGhlIERlc2lnbiB2aWV3LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB0aGUgWE1MIGZpbGUgdGhhdCB5b3Ugd2FudCB0byB3b3JrIHdpdGggaW4gdGhlIFhNTCBlZGl0b3IKLShyaWdodC1jbGljayB0aGUgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aAotJmd0OyBYTUwgRWRpdG9yPC9zcGFuPikuIElmIG5lY2Vzc2FyeSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlc2lnbjwvc3Bhbj4gdGFiLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VG8gZXhwYW5kIGFsbCB0aGUgaXRlbXMgaW4geW91ciBYTUwgZmlsZSwgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4cGFuZAotQWxsPC9zcGFuPiB0b29sYmFyIGJ1dHRvbiAgPGltZyBzcmM9Ii4uL2ltYWdlcy9leHBhbmRfYWxsLmdpZiIgYWx0PSJUaGlzJiMxMDtncmFwaGljIGlzIHRoZSBFeHBhbmQgQWxsIHRvb2xiYXIgYnV0dG9uIiAvPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjb2xsYXBzZSB0aGVtLCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q29sbGFwc2UgQWxsPC9zcGFuPiB0b29sYmFyCi1idXR0b24gIDxpbWcgc3JjPSIuLi9pbWFnZXMvY29sbGFwc2VfYWxsLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlJiMxMDtDb2xsYXBzZSBBbGwgdG9vbGJhciBidXR0b24iIC8+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0LWNsaWNrIHRoZSBpdGVtIHRoYXQgeW91IHdhbnQgdG8gd29yayB3aXRoLjwvc3Bhbj4gU29tZQotb3IgYWxsIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9ucyAoYXMgYXBwbGljYWJsZSkgd2lsbCBiZSBhdmFpbGFibGUgZnJvbSB0aGUKLXBvcC11cCBtZW51IHRoYXQgYXBwZWFyczo8dWw+Ci08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBEVEQgSW5mb3JtYXRpb248L3NwYW4+IC0gQ2xpY2sgdGhpcyBpZiB5b3Ugd2FudCB0bwotYXNzb2NpYXRlIHRoZSBYTUwgZmlsZSB3aXRoIGEgRFRELjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RWRpdCBET0NUWVBFPC9zcGFuPiAtIENsaWNrIHRoaXMgaWYgeW91IHdhbnQgdG8gZWRpdAotdGhlIERPQ1RZUEUgZGVjbGFyYXRpb24uIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVkaXQgTmFtZXNwYWNlczwvc3Bhbj4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvIGVkaXQKLXRoZSBleGlzdGluZyBuYW1lc3BhY2UgaW5mb3JtYXRpb24gb3IgY3JlYXRlIGEgbmV3IGFzc29jaWF0aW9uIHdpdGggYSBuYW1lc3BhY2UuCi1SZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrIGZvciBtb3JlIGRldGFpbHMuPC9saT4KLQotPGxpPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0IFByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb248L3NwYW4+IC0gQ2xpY2sgdGhpcyBpZiB5b3UKLXdhbnQgdG8gZWRpdCB0aGUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFzayBmb3IgbW9yZQotZGV0YWlscy48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlbW92ZTwvc3Bhbj4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvIHJlbW92ZSB0aGUKLWl0ZW0gdGhhdCB5b3UgaGF2ZSBzZWxlY3RlZCBmcm9tIHRoZSBYTUwgZmlsZS4gVGhpcyBvcHRpb24gd2lsbCBub3QgYmUgYXZhaWxhYmxlCi1pZiB0aGUgaXRlbSB5b3Ugd2FudCB0byByZW1vdmUgbXVzdCBleGlzdCAoZm9yIGV4YW1wbGUsIGluIHlvdXIgRFRELCB5b3UgaGF2ZQotZGVjbGFyZWQgdGhhdCAiT25lIG9yIG1vcmUiIG9mIHRoZSBpdGVtIG11c3QgYWx3YXlzIGV4aXN0IGluIHlvdXIgWE1MIGZpbGUsCi1hbmQgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQgaXMgdGhlIG9ubHkgb25lIHRoYXQgZXhpc3RzIGluIHlvdXIgWE1MIGZpbGUpLjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZTwvc3Bhbj4gLSBDbGljayB0aGlzIGlmIHlvdSB3YW50IHRvIGFkZAotYW4gYXR0cmlidXRlIHRvIHRoZSBlbGVtZW50IHRoYXQgeW91IHNlbGVjdGVkLiBBbnkgYXR0cmlidXRlcyB5b3UgYXJlIGFsbG93ZWQKLXRvIGFkZCB0byB0aGUgZWxlbWVudCB3aWxsIGJlIGxpc3RlZC4gQWZ0ZXIgeW91IGhhdmUgYWRkZWQgdGhlIGF0dHJpYnV0ZSB0bwotdGhlIFhNTCBmaWxlLCB5b3UgY2FuIGNsaWNrIGluIHRoZSByaWdodC1oYW5kIGNvbHVtbiB0byBjaGFuZ2UgdGhlIHZhbHVlIG9mCi10aGUgYXR0cmlidXRlLiBJZiB0aGUgYXR0cmlidXRlIGhhcyBzZXQgdmFsdWVzLCB0aGV5IHdpbGwgYXBwZWFyIGluIGEgbGlzdC48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4gLSBDbGljayB0aGlzIHRvIGFkZCBhbm90aGVyIGVsZW1lbnQsCi1hIGNvbW1lbnQsIG9yIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhcyBhIGNoaWxkIG9mIHRoZSBwYXJlbnQgZWxlbWVudC48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBCZWZvcmU8L3NwYW4+ICAtIENsaWNrIHRoaXMgdG8gYWRkIGEgY2hpbGQgZWxlbWVudCwKLWNvbW1lbnQsIG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gZ28gYmVmb3JlIHRoZSBpdGVtIHlvdSBoYXZlIHNlbGVjdGVkLgotRm9yIGV4YW1wbGUsIGlmIHlvdSBoYXZlIGEgcGFyZW50IGVsZW1lbnQgY2FsbGVkICJDRCBDb2xsZWN0aW9ucyIgdGhhdCBjYW4KLWNvbnRhaW4gYW4gdW5saW1pdGVkIGFtb3VudCBvZiBjaGlsZHJlbiBjYWxsZWQgIkNEIiwgeW91IGNvdWxkIGNsaWNrIGEgQ0QKLWVsZW1lbnQgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEJlZm9yZTwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj4gQ0Q8L3NwYW4+Ci08L3NwYW4+ICwgYXMgYSBDRCBlbGVtZW50IGNhbiBnbyBiZWZvcmUgYW5vdGhlciBDRCBlbGVtZW50LjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFmdGVyPC9zcGFuPiAtIENsaWNrIHRoaXMgdG8gYWRkIGEgY2hpbGQgZWxlbWVudCwKLWNvbW1lbnQsIG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gZ28gYWZ0ZXIgdGhlIGl0ZW0geW91IGhhdmUgc2VsZWN0ZWQuCi1Gb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBwYXJlbnQgZWxlbWVudCBjYWxsZWQgIkNEIENvbGxlY3Rpb25zIiB0aGF0IGNhbgotY29udGFpbiBhbiB1bmxpbWl0ZWQgYW1vdW50IG9mIGNoaWxkcmVuIGNhbGxlZCAiQ0QiLCB5b3UgY291bGQgY2xpY2sgYSBDRAotZWxlbWVudCBhbmQgY2xpY2sgIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFmdGVyPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBDRDwvc3Bhbj4KLTwvc3Bhbj4sIGFzIGEgQ0QgZWxlbWVudCBjYW4gZ28gYWZ0ZXIgYW5vdGhlciBDRCBlbGVtZW50LjwvbGk+Ci0KLTxsaT4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVwbGFjZSBXaXRoPC9zcGFuPiAtIENsaWNrIHRoaXMgaWYgeW91IHdhbnQgdG8gcmVwbGFjZQotb25lIGl0ZW0gd2l0aCBhbm90aGVyLiBUaGlzIG9wdGlvbiBpcyBub3QgYXZhaWxhYmxlIGlmIHlvdSB0dXJuIGdyYW1tYXIgY29uc3RyYWludHMKLW9mZiBvciBpZiB0aGVyZSBhcmUgbm8gdmFsaWQgYWx0ZXJuYXRpdmVzIGZvciB5b3UgdG8gcmVwbGFjZSB0aGUgaXRlbSB3aXRoLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSBhcHByb3ByaWF0ZSBvcHRpb24uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkFueSBjaGFuZ2VzIHlvdSBtYWtlIGluIHRoZSBEZXNpZ24gdmlldyBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhlCi1Tb3VyY2UgdmlldyBhbmQgdGhlIE91dGxpbmUgdmlldy48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgdGl0bGU9IlRoZSBYTUwgZWRpdG9yIGlzIGEgdG9vbCBmb3IgY3JlYXRpbmcgYW5kIHZpZXdpbmcgWE1MIGZpbGVzLiI+WE1MIGVkaXRvcjwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgdGl0bGU9IldoZW4gYW4gWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoIGEgRFREIG9yIFhNTCBzY2hlbWEsIGl0IGlzIGJvdW5kIGJ5IGFueSBzdHJ1Y3R1cmFsIHJ1bGVzIGNvbnRhaW5lZCBpbiB0aGUgRFREIG9yIFhNTCBzY2hlbWEuIFRvIGJlIGNvbnNpZGVyZWQgYSB2YWxpZCBYTUwgZmlsZSwgYSBkb2N1bWVudCBtdXN0IGJlIGFjY29tcGFuaWVkIGJ5IGEgRFREIG9yIGFuIFhNTCBzY2hlbWEsIGFuZCBjb25mb3JtIHRvIGFsbCBvZiB0aGUgZGVjbGFyYXRpb25zIGluIHRoZSBEVEQgb3IgdGhlIFhNTCBzY2hlbWEuIj5YTUwgZmlsZSBhc3NvY2lhdGlvbnMgd2l0aCBEVERzIGFuZCBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHhlZHRzcmMuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlIGNvZGUgZGlyZWN0bHkuIj5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRkb2MuaHRtbCIgdGl0bGU9IlRoZSBET0NUWVBFIGRlY2xhcmF0aW9uIGluIGFuIFhNTCBmaWxlIGlzIHVzZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBpdCB0byBhc3NvY2lhdGUgaXQgd2l0aCBhIERURCBmaWxlLiBZb3UgY2FuIGVkaXQgeW91ciBET0NUWVBFIGRlY2xhcmF0aW9uIHRvIGNoYW5nZSB0aGUgRFREIGZpbGUgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGguIj5FZGl0aW5nIERPQ1RZUEUgZGVjbGFyYXRpb25zPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHByb2MuaHRtbCIgdGl0bGU9IklmIHlvdSBoYXZlIGluc3RydWN0aW9ucyB5b3Ugd2FudCB0byBwYXNzIGFsb25nIHRvIGFuIGFwcGxpY2F0aW9uIHVzaW5nIGFuIFhNTCBkb2N1bWVudCwgeW91IGNhbiB1c2UgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uLiI+RWRpdGluZyBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvcnhtbGJpY29ucy5odG1sIiB0aXRsZT0iVGhlIGZvbGxvd2luZyBYTUwgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSBhbmQgRGVzaWduIHZpZXcuIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEyMThiNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4ZWR0c3JjIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIGluIHRoZSBTb3VyY2UgdmlldzwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UNCi1jb2RlIGRpcmVjdGx5Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPmluIHRoZSBTb3VyY2UNCi12aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD4gVGhlIFNvdXJjZSB2aWV3IGhhcyBtYW55IHRleHQgZWRpdGluZyBmZWF0dXJlcywgc3VjaCBhczo8L3A+PGRsPg0KLTxkbGVudHJ5Pg0KLTxkdD5TeW50YXggaGlnaGxpZ2h0aW5nPC9kdD4NCi08ZGQ+RWFjaCB0YWcgdHlwZSBpcyBoaWdobGlnaHRlZCBkaWZmZXJlbnRseSwgZW5hYmxpbmcgeW91IHRvIGVhc2lseSBmaW5kDQotYSBjZXJ0YWluIGtpbmQgb2YgdGFnIGZvciBlZGl0aW5nLiBJbiBhZGRpdGlvbiwgc3ludGF4IGhpZ2hsaWdodGluZyBpcyB2YWx1YWJsZQ0KLWluIGxvY2F0aW5nIHN5bnRheCBlcnJvcnMuIEZvciBleGFtcGxlLCBpZiB5b3UgYmVnaW4gYSBjb21tZW50IGluIHRoZSBtaWRkbGUNCi1vZiB0aGUgZG9jdW1lbnQgd2l0aCA8Y29kZXBoPiZsdDshLS08L2NvZGVwaD4gZXZlcnl0aGluZyB1bnRpbCB0aGUgbmV4dCA8Y29kZXBoPi0tPjwvY29kZXBoPiBpcw0KLWNvbnNpZGVyZWQgYSBjb21tZW50LCBhbmQgd2lsbCBiZSBoaWdobGlnaHRlZCBhY2NvcmRpbmdseS4gVGhlIGxhcmdlIGhpZ2hsaWdodGVkDQotYXJlYSB3aWxsIGluZGljYXRlIHRoYXQgeW91IG5lZWQgdG8gYWRkIDxjb2RlcGg+LS0+PC9jb2RlcGg+IHRvIGNsb3NlIHRoZQ0KLWNvbW1lbnQuPHA+WW91IGNhbiBjdXN0b21pemUgdGhlIHN5bnRheCBoaWdobGlnaHRpbmcuIFJlZmVyIHRvIHRoZSByZWxhdGVkDQotdGFza3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uPC9wPjwvZGQ+DQotPC9kbGVudHJ5PjwvZGw+PGRsPjxkbGVudHJ5Pg0KLTxkdD5VbmxpbWl0ZWQgdW5kbyBhbmQgcmVkbzwvZHQ+DQotPGRkPlRoZXNlIG9wdGlvbnMgYWxsb3cgeW91IHRvIGluY3JlbWVudGFsbHkgdW5kbyBhbmQgcmVkbyBldmVyeSBjaGFuZ2UgbWFkZQ0KLXRvIGEgZmlsZSBmb3IgdGhlIGVudGlyZSBlZGl0aW5nIHNlc3Npb24uIEZvciB0ZXh0LCBjaGFuZ2VzIGFyZSBpbmNyZW1lbnRlZA0KLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Db250ZW50IGFzc2lzdDwvZHQ+DQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBmaW5pc2ggdGFncyBhbmQgaW5zZXJ0IG1hY3Jvcy4gPD9QdWIgQ2FyZXQ/PlJlZmVyDQotdG8gdGhlIHJlbGF0ZWQgdGFzayBmb3IgbW9yZSBkZXRhaWxzLjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5UZW1wbGF0ZTwvZHQ+DQotPGRkPllvdSBjYW4gYWNjZXNzIHRlbXBsYXRlcyAodXNpbmcgY29udGVudCBhc3Npc3QpIHRvIGhlbHAgeW91IHF1aWNrbHkgYWRkDQotcmVndWxhcmx5LXVzZWQgdGFnZ2luZyBjb21iaW5hdGlvbnMuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPg0KLTwvZGxlbnRyeT48ZGxlbnRyeT4NCi08ZHQ+Tm9kZSBzZWxlY3Rpb248L2R0Pg0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IgKG9yIHNlbGVjdGlvbiBpbiB0aGUgT3V0bGluZSB2aWV3KSwNCi10aGUgbm9kZSBzZWxlY3Rpb24gaW5kaWNhdG9yIGhpZ2hsaWdodHMgdGhlIGxpbmUgbnVtYmVycyB0aGF0IGluY2x1ZGUgYSBub2RlDQotKGZvciBleGFtcGxlLCBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZSksIGluIHRoZSB2ZXJ0aWNhbCBydWxlciBpbiB0aGUgbGVmdA0KLWFyZWEgb2YgdGhlIFNvdXJjZSB2aWV3LjwvZGQ+DQotPC9kbGVudHJ5PjxkbGVudHJ5Pg0KLTxkdD5Qb3AtdXAgbWVudSBvcHRpb25zPC9kdD4NCi08ZGQ+RnJvbSB0aGUgZWRpdG9yJ3MgcG9wLXVwIG1lbnUsIHlvdSBoYXZlIG1hbnkgb2YgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zDQotYXZhaWxhYmxlIGFzIHlvdSBkbyBmcm9tIHRoZSB3b3JrYmVuY2ggIDxiPkVkaXQ8L2I+IG1lbnUuIFlvdSBjYW4gc2VsZWN0IG1lbnUNCi1vcHRpb25zIHN1Y2ggYXM6IDx1aWNvbnRyb2w+Q2xlYW51cCBEb2N1bWVudCw8L3VpY29udHJvbD4gdG8gb3BlbiB0aGUgPHVpY29udHJvbD5DbGVhbnVwPC91aWNvbnRyb2w+IA0KLWRpYWxvZywgd2hpY2ggY29udGFpbnMgc2V0dGluZ3MgdG8gdXBkYXRlIGEgZG9jdW1lbnQgc28gdGhhdCBpdCBpcyB3ZWxsLWZvcm1lZA0KLWFuZCBmb3JtYXR0ZWQgYW5kIDx1aWNvbnRyb2w+Rm9ybWF0LDwvdWljb250cm9sPiB3aGljaCBmb3JtYXRzIGVpdGhlciB0aGUNCi1lbnRpcmUgZG9jdW1lbnQgb3Igc2VsZWN0ZWQgZWxlbWVudHMuPC9kZD4NCi08L2RsZW50cnk+PGRsZW50cnk+DQotPGR0PiJTbWFydCIgZG91YmxlIGNsaWNraW5nPC9kdD4NCi08ZGQ+WW91IGNhbiB1c2UgZG91YmxlLWNsaWNrIHRvIHNlbGVjdCBhdHRyaWJ1dGUgdmFsdWVzLCBhdHRyaWJ1dGUtdmFsdWUgcGFpcnMsDQotYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwgY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuPC9kZD4NCi08L2RsZW50cnk+PC9kbD48cD5UbyBlZGl0IGFuIFhNTCBmaWxlIGluIHRoZSBTb3VyY2UgdmlldywgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgWE1MIGZpbGUgeW91IHdhbnQgdG8gd29yayB3aXRoIGluIHRoZSBYTUwgZWRpdG9yICAocmlnaHQtY2xpY2sNCi10aGUgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDx1aWNvbnRyb2w+T3BlbiBXaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPikuIDwvY21kPg0KLTxpbmZvPllvdSBtaWdodCBuZWVkIHRvIGNsaWNrIHRoZSA8dWljb250cm9sPlNvdXJjZTwvdWljb250cm9sPiB0YWIuIFR5cGljYWxseSwNCi1hbGwgdGhhdCB5b3Ugd2lsbCBuZWVkIHRvIGRvIHRvIG9wZW4gdGhlIGZpbGUgaXMgdG8gZG91YmxlLWNsaWNrIGl0IGluIHRoZQ0KLU5hdmlnYXRvciB2aWV3LiBJZiB0aGlzIGRvZXMgbm90IHdvcmssIHJpZ2h0LWNsaWNrIGl0IGFuZCBjbGljayA8dWljb250cm9sPk9wZW4NCi1XaXRoID4gWE1MIEVkaXRvcjwvdWljb250cm9sPi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+RWRpdCB0aGUgY29kZSBhcyBuZWNlc3NhcnksIHVzaW5nIGFueSBvZiB0aGUgYXZhaWxhYmxlIGZlYXR1cmVzLjwvY21kPg0KLTxpbmZvPkFzIHlvdSBtb3ZlIHRoZSBjdXJzb3Igd2l0aGluIHlvdXIgWE1MIGZpbGUgKG9yIHNlbGVjdCBpdGVtcyBmcm9tIHRoZQ0KLU91dGxpbmUgdmlldyksIHRoZSBub2RlIHNlbGVjdGlvbiBpbmRpY2F0b3Igd2lsbCBoaWdobGlnaHQgdGhlIGxpbmUgbnVtYmVycw0KLXRoYXQgZW5jb21wYXNzIHRoZSBub2RlIChmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLiBZb3UgY2FuIHVzZQ0KLXNtYXJ0IGRvdWJsZS1jbGlja2luZyBiZWhhdmlvciB0byBzZWxlY3QgYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlDQotcGFpcnMsIGFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsIGNvcHksIG9yIHJlbW92ZSBjb250ZW50LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BdCBpbnRlcnZhbHMsIHlvdSBtaWdodCB3aXNoIHRvIGZvcm1hdCBpbmRpdmlkdWFsIG5vZGVzLCBvciB0aGUNCi1lbnRpcmUgWE1MIGZpbGUgdG8gcmVzdG9yZSBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgaW5kZW50YXRpb24gdG8gc2VlIG5lc3RpbmcNCi1oaWVyYXJjaGllcyBtb3JlIGNsZWFybHkgaW4gdGhlIGZpbGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgZGVzaXJlZCwgdmFsaWRhdGUgYW5kIHNhdmUgdGhlIFhNTCBmaWxlLjwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+QW55IGNoYW5nZXMgeW91IG1ha2UgaW4gdGhlIFNvdXJjZSB2aWV3IGFyZSBhbHNvIHJlZmxlY3RlZCBpbiB0aGUNCi1EZXNpZ24gdmlldyBhbmQgdGhlIE91dGxpbmUgdmlldy48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDQ0MjM/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHRzcmMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk2YzQzZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0c3JjLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXciIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIFNvdXJjZSB2aWV3IHRvIHZpZXcgYW5kIHdvcmsgd2l0aCBhIGZpbGUncyBzb3VyY2UgY29kZSBkaXJlY3RseS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBpbiB0aGUgU291cmNlIHZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZWRpdG9yLCBlZGl0aW5nLCBpbiB0aGUgU291cmNlIHZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d2NkYXN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90d21hY3JvLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dGFnaGlsdC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0c3JjIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0c3JjIj48YSBuYW1lPSJ0eGVkdHNyYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSBTb3VyY2UgdmlldyB0byB2aWV3IGFuZCB3b3JrIHdpdGggYSBmaWxlJ3Mgc291cmNlCi1jb2RlIGRpcmVjdGx5LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IFRoZSBTb3VyY2UgdmlldyBoYXMgbWFueSB0ZXh0IGVkaXRpbmcgZmVhdHVyZXMsIHN1Y2ggYXM6PC9wPgotPGRsPgotCi08ZHQgY2xhc3M9ImRsdGVybSI+U3ludGF4IGhpZ2hsaWdodGluZzwvZHQ+Ci0KLTxkZD5FYWNoIHRhZyB0eXBlIGlzIGhpZ2hsaWdodGVkIGRpZmZlcmVudGx5LCBlbmFibGluZyB5b3UgdG8gZWFzaWx5IGZpbmQKLWEgY2VydGFpbiBraW5kIG9mIHRhZyBmb3IgZWRpdGluZy4gSW4gYWRkaXRpb24sIHN5bnRheCBoaWdobGlnaHRpbmcgaXMgdmFsdWFibGUKLWluIGxvY2F0aW5nIHN5bnRheCBlcnJvcnMuIEZvciBleGFtcGxlLCBpZiB5b3UgYmVnaW4gYSBjb21tZW50IGluIHRoZSBtaWRkbGUKLW9mIHRoZSBkb2N1bWVudCB3aXRoIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDshLS08L3NhbXA+IGV2ZXJ5dGhpbmcgdW50aWwgdGhlIG5leHQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+LS0mZ3Q7PC9zYW1wPiBpcwotY29uc2lkZXJlZCBhIGNvbW1lbnQsIGFuZCB3aWxsIGJlIGhpZ2hsaWdodGVkIGFjY29yZGluZ2x5LiBUaGUgbGFyZ2UgaGlnaGxpZ2h0ZWQKLWFyZWEgd2lsbCBpbmRpY2F0ZSB0aGF0IHlvdSBuZWVkIHRvIGFkZCA8c2FtcCBjbGFzcz0iY29kZXBoIj4tLSZndDs8L3NhbXA+IHRvIGNsb3NlIHRoZQotY29tbWVudC48cD5Zb3UgY2FuIGN1c3RvbWl6ZSB0aGUgc3ludGF4IGhpZ2hsaWdodGluZy4gUmVmZXIgdG8gdGhlIHJlbGF0ZWQKLXRhc2tzIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KLTwvZGQ+Ci0KLTwvZGw+Ci08ZGw+Ci08ZHQgY2xhc3M9ImRsdGVybSI+VW5saW1pdGVkIHVuZG8gYW5kIHJlZG88L2R0PgotCi08ZGQ+VGhlc2Ugb3B0aW9ucyBhbGxvdyB5b3UgdG8gaW5jcmVtZW50YWxseSB1bmRvIGFuZCByZWRvIGV2ZXJ5IGNoYW5nZSBtYWRlCi10byBhIGZpbGUgZm9yIHRoZSBlbnRpcmUgZWRpdGluZyBzZXNzaW9uLiBGb3IgdGV4dCwgY2hhbmdlcyBhcmUgaW5jcmVtZW50ZWQKLW9uZSBjaGFyYWN0ZXIgb3Igc2V0IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgYXQgYSB0aW1lLjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPkNvbnRlbnQgYXNzaXN0PC9kdD4KLQotPGRkPkNvbnRlbnQgYXNzaXN0IGhlbHBzIHlvdSBmaW5pc2ggdGFncyBhbmQgaW5zZXJ0IG1hY3Jvcy4gUmVmZXIKLXRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5UZW1wbGF0ZTwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIGFjY2VzcyB0ZW1wbGF0ZXMgKHVzaW5nIGNvbnRlbnQgYXNzaXN0KSB0byBoZWxwIHlvdSBxdWlja2x5IGFkZAotcmVndWxhcmx5LXVzZWQgdGFnZ2luZyBjb21iaW5hdGlvbnMuIFJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2sgZm9yIG1vcmUgZGV0YWlscy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj5Ob2RlIHNlbGVjdGlvbjwvZHQ+Ci0KLTxkZD5CYXNlZCBvbiB0aGUgbG9jYXRpb24gb2YgeW91ciBjdXJzb3IgKG9yIHNlbGVjdGlvbiBpbiB0aGUgT3V0bGluZSB2aWV3KSwKLXRoZSBub2RlIHNlbGVjdGlvbiBpbmRpY2F0b3IgaGlnaGxpZ2h0cyB0aGUgbGluZSBudW1iZXJzIHRoYXQgaW5jbHVkZSBhIG5vZGUKLShmb3IgZXhhbXBsZSwgYW4gZWxlbWVudCBvciBhdHRyaWJ1dGUpLCBpbiB0aGUgdmVydGljYWwgcnVsZXIgaW4gdGhlIGxlZnQKLWFyZWEgb2YgdGhlIFNvdXJjZSB2aWV3LjwvZGQ+Ci0KLQotPGR0IGNsYXNzPSJkbHRlcm0iPlBvcC11cCBtZW51IG9wdGlvbnM8L2R0PgotCi08ZGQ+RnJvbSB0aGUgZWRpdG9yJ3MgcG9wLXVwIG1lbnUsIHlvdSBoYXZlIG1hbnkgb2YgdGhlIHNhbWUgZWRpdGluZyBvcHRpb25zCi1hdmFpbGFibGUgYXMgeW91IGRvIGZyb20gdGhlIHdvcmtiZW5jaCAgPHN0cm9uZz5FZGl0PC9zdHJvbmc+IG1lbnUuIFlvdSBjYW4gc2VsZWN0IG1lbnUKLW9wdGlvbnMgc3VjaCBhczogPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q2xlYW51cCBEb2N1bWVudCw8L3NwYW4+IHRvIG9wZW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNsZWFudXA8L3NwYW4+IAotZGlhbG9nLCB3aGljaCBjb250YWlucyBzZXR0aW5ncyB0byB1cGRhdGUgYSBkb2N1bWVudCBzbyB0aGF0IGl0IGlzIHdlbGwtZm9ybWVkCi1hbmQgZm9ybWF0dGVkIGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Gb3JtYXQsPC9zcGFuPiB3aGljaCBmb3JtYXRzIGVpdGhlciB0aGUKLWVudGlyZSBkb2N1bWVudCBvciBzZWxlY3RlZCBlbGVtZW50cy48L2RkPgotCi0KLTxkdCBjbGFzcz0iZGx0ZXJtIj4iU21hcnQiIGRvdWJsZSBjbGlja2luZzwvZHQ+Ci0KLTxkZD5Zb3UgY2FuIHVzZSBkb3VibGUtY2xpY2sgdG8gc2VsZWN0IGF0dHJpYnV0ZSB2YWx1ZXMsIGF0dHJpYnV0ZS12YWx1ZSBwYWlycywKLWFuZCBlbnRpcmUgdGFnIHNldHMgdG8gcXVpY2tseSB1cGRhdGUsIGNvcHksIG9yIHJlbW92ZSBjb250ZW50LjwvZGQ+Ci0KLTwvZGw+Ci08cD5UbyBlZGl0IGFuIFhNTCBmaWxlIGluIHRoZSBTb3VyY2UgdmlldywgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4gdGhlIFhNTCBmaWxlIHlvdSB3YW50IHRvIHdvcmsgd2l0aCBpbiB0aGUgWE1MIGVkaXRvciAgKHJpZ2h0LWNsaWNrCi10aGUgZmlsZSBpbiB0aGUgTmF2aWdhdG9yIHZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9wZW4gV2l0aCAmZ3Q7IFhNTCBFZGl0b3I8L3NwYW4+KS4gPC9zcGFuPgotIFlvdSBtaWdodCBuZWVkIHRvIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Tb3VyY2U8L3NwYW4+IHRhYi4gVHlwaWNhbGx5LAotYWxsIHRoYXQgeW91IHdpbGwgbmVlZCB0byBkbyB0byBvcGVuIHRoZSBmaWxlIGlzIHRvIGRvdWJsZS1jbGljayBpdCBpbiB0aGUKLU5hdmlnYXRvciB2aWV3LiBJZiB0aGlzIGRvZXMgbm90IHdvcmssIHJpZ2h0LWNsaWNrIGl0IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PcGVuCi1XaXRoICZndDsgWE1MIEVkaXRvcjwvc3Bhbj4uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FZGl0IHRoZSBjb2RlIGFzIG5lY2Vzc2FyeSwgdXNpbmcgYW55IG9mIHRoZSBhdmFpbGFibGUgZmVhdHVyZXMuPC9zcGFuPgotIEFzIHlvdSBtb3ZlIHRoZSBjdXJzb3Igd2l0aGluIHlvdXIgWE1MIGZpbGUgKG9yIHNlbGVjdCBpdGVtcyBmcm9tIHRoZQotT3V0bGluZSB2aWV3KSwgdGhlIG5vZGUgc2VsZWN0aW9uIGluZGljYXRvciB3aWxsIGhpZ2hsaWdodCB0aGUgbGluZSBudW1iZXJzCi10aGF0IGVuY29tcGFzcyB0aGUgbm9kZSAoZm9yIGV4YW1wbGUsIGFuIGVsZW1lbnQgb3IgYXR0cmlidXRlKS4gWW91IGNhbiB1c2UKLXNtYXJ0IGRvdWJsZS1jbGlja2luZyBiZWhhdmlvciB0byBzZWxlY3QgYXR0cmlidXRlIHZhbHVlcywgYXR0cmlidXRlLXZhbHVlCi1wYWlycywgYW5kIGVudGlyZSB0YWcgc2V0cyB0byBxdWlja2x5IHVwZGF0ZSwgY29weSwgb3IgcmVtb3ZlIGNvbnRlbnQuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkF0IGludGVydmFscywgeW91IG1pZ2h0IHdpc2ggdG8gZm9ybWF0IGluZGl2aWR1YWwgbm9kZXMsIG9yIHRoZQotZW50aXJlIFhNTCBmaWxlIHRvIHJlc3RvcmUgZWxlbWVudCBhbmQgYXR0cmlidXRlIGluZGVudGF0aW9uIHRvIHNlZSBuZXN0aW5nCi1oaWVyYXJjaGllcyBtb3JlIGNsZWFybHkgaW4gdGhlIGZpbGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgZGVzaXJlZCwgdmFsaWRhdGUgYW5kIHNhdmUgdGhlIFhNTCBmaWxlLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5BbnkgY2hhbmdlcyB5b3UgbWFrZSBpbiB0aGUgU291cmNlIHZpZXcgYXJlIGFsc28gcmVmbGVjdGVkIGluIHRoZQotRGVzaWduIHZpZXcgYW5kIHRoZSBPdXRsaW5lIHZpZXcuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sY2F0Lmh0bWwiIHRpdGxlPSJXaGVuIGFuIFhNTCBmaWxlIGlzIGFzc29jaWF0ZWQgd2l0aCBhIERURCBvciBYTUwgc2NoZW1hLCBpdCBpcyBib3VuZCBieSBhbnkgc3RydWN0dXJhbCBydWxlcyBjb250YWluZWQgaW4gdGhlIERURCBvciBYTUwgc2NoZW1hLiBUbyBiZSBjb25zaWRlcmVkIGEgdmFsaWQgWE1MIGZpbGUsIGEgZG9jdW1lbnQgbXVzdCBiZSBhY2NvbXBhbmllZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCBhbmQgY29uZm9ybSB0byBhbGwgb2YgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgRFREIG9yIHRoZSBYTUwgc2NoZW1hLiI+WE1MIGZpbGUgYXNzb2NpYXRpb25zIHdpdGggRFREcyBhbmQgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R3Y2Rhc3QuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmlzaCBhIHRhZyBvciBsaW5lIG9mIGNvZGUgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBZb3UgY2FuIGFsc28gdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGluc2VydCB0ZW1wbGF0ZXMgaW50byB5b3VyIFhNTCBjb2RlLiI+VXNpbmcgWE1MIGNvbnRlbnQgYXNzaXN0PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHdtYWNyby5odG1sIiB0aXRsZT0iWE1MIGNvbnRlbnQgYXNzaXN0IHByb3ZpZGVzIGEgY29tbWVudCB0ZW1wbGF0ZSwgYSBjaHVuayBvZiBwcmVkZWZpbmVkIGNvZGUgdGhhdCB5b3UgY2FuIGluc2VydCBpbnRvIGEgZmlsZS4gWW91IG1heSBmaW5kIGEgdGVtcGxhdGUgdXNlZnVsIHdoZW4geW91IGhhdmUgYSBjZXJ0YWluIHBpZWNlIG9mIGNvZGUgeW91IHdhbnQgdG8gcmV1c2Ugc2V2ZXJhbCB0aW1lcywgYW5kIHlvdSBkbyBub3Qgd2FudCB0byB3cml0ZSBpdCBvdXQgZXZlcnkgdGltZS4iPldvcmtpbmcgd2l0aCBYTUwgdGVtcGxhdGVzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdHRhZ2hpbHQuaHRtbCIgdGl0bGU9IklmIGRlc2lyZWQsIHlvdSBjYW4gY2hhbmdlIHZhcmlvdXMgYXNwZWN0cyBvZiBob3cgdGhlIFhNTCBzb3VyY2UgY29kZSBpcyBkaXNwbGF5ZWQgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLCBzdWNoIGFzIHRoZSBjb2xvcnMgdGhlIHRhZ3Mgd2lsbCBiZSBkaXNwbGF5ZWQgaW4uIj5TZXR0aW5nIHNvdXJjZSBoaWdobGlnaHRpbmcgc3R5bGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJiNzYwMy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4ZWR0dGFnIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBmaWxlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgZmlsZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBmaWxlIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVkaXRpbmcgWE1MIGZpbGVzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBmaWxlczxpbmRleHRlcm0+ZWRpdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MDQotZWRpdG9yPGluZGV4dGVybT5lZGl0aW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgZmlsZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIG9wZW4gYW4gWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIGl0IGluIHRoZSBOYXZpZ2F0b3INCi12aWV3IGFuZCBjbGljayA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5PcGVuIFdpdGg8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLUVkaXRvcjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LiA8L3A+PHA+V2UgcmVjb21tZW5kIHdvcmtpbmcgaW4gdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUgd2hlbiB5b3UgYXJlIGRldmVsb3BpbmcgWE1MIGZpbGVzLiBUaGUgdmlld3MgdGhhdCBhcHBlYXIgYnkgZGVmYXVsdA0KLWluIHRoaXMgcGVyc3BlY3RpdmUgKHN1Y2ggYXMgdGhlIE91dGxpbmUgdmlldykgaGVscCBmYWNpbGl0YXRlIFhNTCBkZXZlbG9wbWVudC48L3A+PHA+VGhlDQotWE1MIGVkaXRvciBlbmFibGVzIHlvdSB0byBkaXJlY3RseSBlZGl0IFhNTCBmaWxlcy4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50DQotdmlld3MgeW91IGNhbiB1c2UgdG8gZWRpdCB5b3VyIGZpbGVzOjwvcD48dWw+DQotPGxpPjxiPlNvdXJjZSB2aWV3PC9iPiAtIHlvdSBjYW4gbWFudWFsbHkgaW5zZXJ0LCBlZGl0LCBhbmQgZGVsZXRlIGVsZW1lbnRzDQotYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBUbyBmYWNpbGl0YXRlIHRoaXMgZWZmb3J0LA0KLXlvdSBjYW4gdXNlIGNvbnRlbnQgYXNzaXN0IHdoaWxlIHlvdSBhcmUgaW4gdGhlIFNvdXJjZSB2aWV3LjwvbGk+DQotPGxpPjxiPkRlc2lnbiB2aWV3PC9iPiAtIHlvdSBjYW4gaW5zZXJ0LCBkZWxldGUsIGFuZCBlZGl0IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLA0KLWNvbW1lbnRzLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+DQotPGxpPjxiPk91dGxpbmUgdmlldyA8L2I+LSB5b3UgY2FuIGluc2VydCBhbmQgZGVsZXRlIGVsZW1lbnRzIGF0dHJpYnV0ZXMsIGNvbW1lbnRzLA0KLWFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHZpZXcuPC9saT4NCi08L3VsPjxwPk9mdGVuLCB5b3UgbWF5IGZpbmQgdGhhdCB5b3UgaGF2ZSBtb3JlIHRoYW4gb25lIHdheSB0byBwZXJmb3JtIGEgc3BlY2lmaWMNCi10YXNrLiBGb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIGZpbGUgIk15U2Nob29sU3ViamVjdHMueG1sIiBhc3NvY2lhdGVkDQotd2l0aCBhbiBYTUwgc2NoZW1hIGZpbGUgIlNjaG9vbFN1YmplY3RzLnhzZCIsIHdoaWNoIGxpc3QgYWxsIHRoZSBzdWJqZWN0cw0KLXRhdWdodCBpbiBhIHNjaG9vbC4gWW91IHdhbnQgdG8gaW5zZXJ0IGEgbmV3IGVsZW1lbnQgIk1hdGgiIGludG8geW91ciBmaWxlLg0KLVlvdSBjYW4gZG8gc28gaW4gdGhlIGZvbGxvd2luZyB3YXlzOjwvcD48dWw+DQotPGxpPkluIHRoZSBPdXRsaW5lIG9yIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgYXBwcm9wcmlhdGUgcGFyZW50IGVsZW1lbnQNCi1hbmQgc2VsZWN0IDx1aWNvbnRyb2w+TWF0aDwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPkFkZCBDaGlsZDwvdWljb250cm9sPiBwb3AtdXANCi1tZW51LjwvbGk+DQotPGxpPkluIHRoZSBTb3VyY2UgdmlldywgdXNlIGNvbnRlbnQgYXNzaXN0IHRvIGhlbHAgeW91IGZpbmQgdGhlIGFwcHJvcHJpYXRlDQotbG9jYXRpb24gYW5kIGNvZGUgZm9yIHRoZSA8dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4gZWxlbWVudC48L2xpPg0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHR5cGUgdGhlIGNvZGUgZm9yIHRoZSA8dWljb250cm9sPk1hdGg8L3VpY29udHJvbD4gZWxlbWVudA0KLWluIHRoZSBmaWxlLjwvbGk+DQotPC91bD48L2NvbnRleHQ+DQotPHBvc3RyZXE+VGhlIGZvbGxvd2luZyBsaW5rcyBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBlZGl0b3INCi1hbmQgZWRpdGluZyBYTUwgZmlsZXM6PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhlZHR0YWcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YjY5Mi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4ZWR0dGFnLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJFZGl0aW5nIFhNTCBmaWxlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIGZpbGUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgZWRpdGluZyBYTUwgZmlsZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGVkaXRpbmcsIFhNTCBlZGl0b3IiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgZmlsZXMsIGVkaXRpbmcsIFhNTCBlZGl0b3IiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3d4bWxlZHQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90eGVkdHNyYy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InR4ZWR0dGFnIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+RWRpdGluZyBYTUwgZmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4ZWR0dGFnIj48YSBuYW1lPSJ0eGVkdHRhZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RWRpdGluZyBYTUwgZmlsZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPlRoaXMgZmlsZSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBlZGl0aW5nIFhNTCBmaWxlcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIG9wZW4gYW4gWE1MIGZpbGUgaW4gdGhlIFhNTCBlZGl0b3IsIHJpZ2h0LWNsaWNrIGl0IGluIHRoZSBOYXZpZ2F0b3IKLXZpZXcgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3BlbiBXaXRoPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTAotRWRpdG9yPC9zcGFuPjwvc3Bhbj4uIDwvcD4KLTxwPldlIHJlY29tbWVuZCB3b3JraW5nIGluIHRoZSBSZXNvdXJjZQotcGVyc3BlY3RpdmUgd2hlbiB5b3UgYXJlIGRldmVsb3BpbmcgWE1MIGZpbGVzLiBUaGUgdmlld3MgdGhhdCBhcHBlYXIgYnkgZGVmYXVsdAotaW4gdGhpcyBwZXJzcGVjdGl2ZSAoc3VjaCBhcyB0aGUgT3V0bGluZSB2aWV3KSBoZWxwIGZhY2lsaXRhdGUgWE1MIGRldmVsb3BtZW50LjwvcD4KLTxwPlRoZQotWE1MIGVkaXRvciBlbmFibGVzIHlvdSB0byBkaXJlY3RseSBlZGl0IFhNTCBmaWxlcy4gVGhlcmUgYXJlIHNldmVyYWwgZGlmZmVyZW50Ci12aWV3cyB5b3UgY2FuIHVzZSB0byBlZGl0IHlvdXIgZmlsZXM6PC9wPgotPHVsPgotPGxpPjxzdHJvbmc+U291cmNlIHZpZXc8L3N0cm9uZz4gLSB5b3UgY2FuIG1hbnVhbGx5IGluc2VydCwgZWRpdCwgYW5kIGRlbGV0ZSBlbGVtZW50cwotYW5kIGF0dHJpYnV0ZXMgaW4gdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLiBUbyBmYWNpbGl0YXRlIHRoaXMgZWZmb3J0LAoteW91IGNhbiB1c2UgY29udGVudCBhc3Npc3Qgd2hpbGUgeW91IGFyZSBpbiB0aGUgU291cmNlIHZpZXcuPC9saT4KLQotPGxpPjxzdHJvbmc+RGVzaWduIHZpZXc8L3N0cm9uZz4gLSB5b3UgY2FuIGluc2VydCwgZGVsZXRlLCBhbmQgZWRpdCBlbGVtZW50cywgYXR0cmlidXRlcywKLWNvbW1lbnRzLCBhbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+Ci0KLTxsaT48c3Ryb25nPk91dGxpbmUgdmlldyA8L3N0cm9uZz4tIHlvdSBjYW4gaW5zZXJ0IGFuZCBkZWxldGUgZWxlbWVudHMgYXR0cmlidXRlcywgY29tbWVudHMsCi1hbmQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyB2aWV3LjwvbGk+Ci0KLTwvdWw+Ci08cD5PZnRlbiwgeW91IG1heSBmaW5kIHRoYXQgeW91IGhhdmUgbW9yZSB0aGFuIG9uZSB3YXkgdG8gcGVyZm9ybSBhIHNwZWNpZmljCi10YXNrLiBGb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIGZpbGUgIk15U2Nob29sU3ViamVjdHMueG1sIiBhc3NvY2lhdGVkCi13aXRoIGFuIFhNTCBzY2hlbWEgZmlsZSAiU2Nob29sU3ViamVjdHMueHNkIiwgd2hpY2ggbGlzdCBhbGwgdGhlIHN1YmplY3RzCi10YXVnaHQgaW4gYSBzY2hvb2wuIFlvdSB3YW50IHRvIGluc2VydCBhIG5ldyBlbGVtZW50ICJNYXRoIiBpbnRvIHlvdXIgZmlsZS4KLVlvdSBjYW4gZG8gc28gaW4gdGhlIGZvbGxvd2luZyB3YXlzOjwvcD4KLTx1bD4KLTxsaT5JbiB0aGUgT3V0bGluZSBvciBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGFwcHJvcHJpYXRlIHBhcmVudCBlbGVtZW50Ci1hbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1hdGg8L3NwYW4+IGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaGlsZDwvc3Bhbj4gcG9wLXVwCi1tZW51LjwvbGk+Ci0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHVzZSBjb250ZW50IGFzc2lzdCB0byBoZWxwIHlvdSBmaW5kIHRoZSBhcHByb3ByaWF0ZQotbG9jYXRpb24gYW5kIGNvZGUgZm9yIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXRoPC9zcGFuPiBlbGVtZW50LjwvbGk+Ci0KLTxsaT5JbiB0aGUgU291cmNlIHZpZXcsIHR5cGUgdGhlIGNvZGUgZm9yIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXRoPC9zcGFuPiBlbGVtZW50Ci1pbiB0aGUgZmlsZS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBmb2xsb3dpbmcgbGlua3MgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBYTUwgZWRpdG9yCi1hbmQgZWRpdGluZyBYTUwgZmlsZXM6PC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N3eG1sZWR0Lmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBpcyBhIHRvb2wgZm9yIGNyZWF0aW5nIGFuZCB2aWV3aW5nIFhNTCBmaWxlcy4iPlhNTCBlZGl0b3I8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0ZGVzLmh0bWwiIHRpdGxlPSJUaGUgWE1MIGVkaXRvciBoYXMgYSBEZXNpZ24gdmlldywgd2hpY2ggcmVwcmVzZW50cyB0aGUgWE1MIGZpbGUgc2ltdWx0YW5lb3VzbHkgYXMgYSB0YWJsZSBhbmQgYSB0cmVlLiBUaGlzIGhlbHBzIG1ha2UgbmF2aWdhdGlvbiBhbmQgZWRpdGluZyBlYXNpZXIuIENvbnRlbnQgYW5kIGF0dHJpYnV0ZSB2YWx1ZXMgY2FuIGJlIGVkaXRlZCBkaXJlY3RseSBpbiB0aGUgdGFibGUgY2VsbHMsIHdoaWxlIHBvcC11cCBtZW51cyBvbiB0aGUgdHJlZSBlbGVtZW50cyBnaXZlIGFsdGVybmF0aXZlcyB0aGF0IGFyZSB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIGVsZW1lbnQuIj5FZGl0aW5nIGluIHRoZSBEZXNpZ24gdmlldzwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R4ZWR0c3JjLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgU291cmNlIHZpZXcgdG8gdmlldyBhbmQgd29yayB3aXRoIGEgZmlsZSdzIHNvdXJjZSBjb2RlIGRpcmVjdGx5LiI+RWRpdGluZyBpbiB0aGUgU291cmNlIHZpZXc8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eG1sY2F0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFlMjhhYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idHhtbGNhdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZW50cmllcyB0byB0aGUgWE1MIENhdGFsb2c8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QW4gWE1MIENhdGFsb2cgZW50cnkgY29udGFpbnMgdHdvIHBhcnRzIC0gYSBLZXkgKHdoaWNoIHJlcHJlc2VudHMNCi1hIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgKHdoaWNoIGNvbnRhaW5zDQotaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluDQotYW4gWE1MIGZpbGUuIFdoZW4gdGhlIFhNTCBwcm9jZXNzb3IgZW5jb3VudGVycyBpdCwgaXQgd2lsbCB1c2UgdGhlIFhNTCBDYXRhbG9nDQotZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5PC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIGNhdGFsb2c8aW5kZXh0ZXJtPmFkZGluZyBlbnRyaWVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgY2F0YWxvZzxpbmRleHRlcm0+aW1wb3J0aW5nIGVudHJpZXM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBjYXRhbG9nPGluZGV4dGVybT5leHBvcnRpbmcgZW50cmllczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WE1MIENhdGFsb2cgZW50cmllcyBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuIEZvciBleGFtcGxlLA0KLXlvdSBhcmUgd29ya2luZyBvbiBhbiBYTUwgZmlsZSBvbiB5b3VyIG1haW4gZGVza3RvcCBjb21wdXRlciBhbmQgcG9pbnQgaXRzIDxjb2RlcGg+c2NoZW1hTG9jYXRpb248L2NvZGVwaD4gdG93YXJkcw0KLWEgc2NoZW1hIGNhbGxlZCA8Y29kZXBoPmM6XE15U2NoZW1hLnhzZDwvY29kZXBoPi4gWW91IHRoZW4gc2F2ZSBpdCB0byB5b3VyDQotbGFwdG9wIGNvbXB1dGVyIHNvIHlvdSBjYW4gd29yayBvbiBpdCBsYXRlci4gV2hlbiB5b3Ugb3BlbiB0aGUgZmlsZSBvbiB5b3VyDQotbGFwdG9wLCBob3dldmVyLCB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSAtIHRoZSBYTUwgZWRpdG9yIGNhbm5vdCBmaW5kIHRoZSA8Y29kZXBoPk15U2NoZW1hLnhzZDwvY29kZXBoPiBzY2hlbWENCi1iZWNhdXNlIGl0IGlzIGFjdHVhbGx5IGluc3RhbGxlZCBvbiB5b3VyIEQgZHJpdmUuIFlvdSB3aWxsIGhhdmUgdG8gZWRpdCB0aGUgPGNvZGVwaD5zY2hlbWFMb2NhdGlvbjwvY29kZXBoPiB0bw0KLXBvaW50IHRvIDxjb2RlcGg+ZDpcTXlTY2hlbWEueHNkPC9jb2RlcGg+LiBXaGVuIHlvdSBoYXZlIGZpbmlzaGVkIGVkaXRpbmcNCi10aGUgWE1MIGZpbGUgYW5kIGFyZSByZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdA0KLXRoZSBVUkkgYWdhaW4gc28gdGhhdCBpdCBwb2ludHMgdG8gYSByZXNvdXJjZSB0aGF0IGlzIGFjY2Vzc2libGUgb24gdGhlIFdlYi4NCi1CeSBub3csIHRoZSBwcm9ibGVtIGlzIG9idmlvdXMuIEEgVVJJIHVzZWQgd2l0aGluIGFuIFhNTCBmaWxlIGlzIG5vdCBhcyBwb3J0YWJsZQ0KLWFzIHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlLiBUbyBhdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwNCi15b3UgY2FuIHVzZSB0aGUgWE1MIENhdGFsb2cuPC9wPjxwPkFuIFhNTCBDYXRhbG9nIGVudHJ5IGlzIHVzZWQgYnkgYW4gWE1MDQotcHJvY2Vzc29yIHdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cNCi10byBzcGVjaWZ5IGhvdyBlbnRpdGllcyBzaG91bGQgYmUgcmVzb2x2ZWQuIElmIHlvdSBjb25zaWRlciB0aGUgcHJlY2VkaW5nDQotZXhhbXBsZSwgeW91IGNvdWxkIHNwZWNpZnkgYSBydWxlIHRoYXQgcmVkaXJlY3RzIGFuIEludGVybmV0IHJlc291cmNlIHJlZmVyZW5jZQ0KLShmb3IgZXhhbXBsZSwgIDxjb2RlcGg+Imh0dHA6Ly93d3cuaWJtLmNvbS9wdWJsaXNoZWQtc2NoZW1hcy9NeVNjaGVtYS54c2QiPC9jb2RlcGg+KQ0KLXNvIHRoYXQgaXQgcG9pbnRzIHRvIGEgcmVzb3VyY2Ugb24gdGhlIGRldmVsb3BlcidzIGxvY2FsIG1hY2hpbmUgKGZvciBleGFtcGxlLA0KLSA8Y29kZXBoPiJmaWxlOi8vL0M6L015U2NoZW1hLnhzZCI8L2NvZGVwaD4pLiBOb3csIGluc3RlYWQgb2YgZnJlcXVlbnRseSBlZGl0aW5nDQotWE1MIGRvY3VtZW50cyB0byB1cGRhdGUgdGhlIFVSSXMgKGVzcGVjaWFsbHkgd2hlbiB0aGVyZSBhcmUgbWFueSBkb2N1bWVudHMNCi1pbiB5b3VyIHByb2plY3QpLCB5b3Ugb25seSBuZWVkIHRvIHVwZGF0ZSBhIHNpbmdsZSBydWxlIGluIHlvdXIgWE1MIENhdGFsb2cuPC9wPjxwPlRoZQ0KLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5DQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBlbnRyeSB0byB0aGUgWE1MDQotQ2F0YWxvZywgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB0aGUgWE1MIGZpbGUgdGhhdCB5b3Ugd2FudCB0byBhc3NvY2lhdGUgd2l0aCBhIERURCBvciBYTUwNCi1zY2hlbWEuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgQ2F0YWxvZzwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSAgPHVpY29udHJvbD5YTUwgQ2F0YWxvZyBFbnRyaWVzPC91aWNvbnRyb2w+IGZpZWxkIGNvbnRhaW5zDQotYSBsaXN0IG9mIGFueSB1c2VyLWRlZmluZWQgYW5kIHBsdWctaW4gZGVmaW5lZCBjYXRhbG9nIGVudHJpZXMuPC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IGFueSBlbnRyeSB0byBzZWUgZGV0YWlscyBhYm91dCBpdCBpbiB0aGUgPHVpY29udHJvbD5EZXRhaWxzPC91aWNvbnRyb2w+IGZpZWxkLiA8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiB0byBjcmVhdGUgYSBuZXcgY2F0YWxvZyBlbnRyeS48L2NtZD4NCi08L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5VUkk8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgdGhlIGxvY2F0aW9uIG9mIHRoZQ0KLURURCBvciBYTUwgc2NoZW1hIG9yIGJyb3dzZSBmb3IgaXQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNwZWNpZmllZCBhIERURCBpbiB0aGUgPHVpY29udHJvbD5VUkk8L3VpY29udHJvbD4gZmllbGQsDQoteW91IGNhbiBzZWxlY3QgZWl0aGVyIDx1aWNvbnRyb2w+UHVibGljIElEPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+U3lzdGVtDQotSUQ8L3VpY29udHJvbD4gZnJvbSB0aGUgPHVpY29udHJvbD5LZXkgVHlwZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD48aW5mbz5JZg0KLXlvdSBzZWxlY3QgPHVpY29udHJvbD5QdWJsaWMgSUQsPC91aWNvbnRyb2w+IHRoZSB2YWx1ZSB5b3UgZW50ZXIgaW4gdGhlIDx1aWNvbnRyb2w+S2V5PC91aWNvbnRyb2w+IGZpZWxkDQotc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBQdWJsaWMgSUQgaW4gdGhlIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4NCi1JZiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+U3lzdGVtIElEPC91aWNvbnRyb2w+LCB0aGUgdmFsdWUgeW91IGVudGVyIHNob3VsZA0KLWNvcnJlc3BvbmQgdG8gdGhlIFN5c3RlbSBJRCBpbiBhbiBYTUwgZmlsZSdzIERPQ1RZUEUgZGVjbGFyYXRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBzcGVjaWZpZWQgYW4gWE1MIHNjaGVtYSBpbiB0aGUgPHVpY29udHJvbD5VUkk8L3VpY29udHJvbD4gZmllbGQsDQoteW91IGNhbiBzZWxlY3QgZWl0aGVyIDx1aWNvbnRyb2w+TmFtZXNwYWNlIE5hbWU8L3VpY29udHJvbD4gb3IgIDx1aWNvbnRyb2w+U2NoZW1hDQotTG9jYXRpb248L3VpY29udHJvbD4gZnJvbSB0aGUgPHVpY29udHJvbD5LZXkgVHlwZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08aW5mbz5JZiB0aGUgc2NoZW1hIGRlZmluZXMgYSB0YXJnZXQgbmFtZXNwYWNlLCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYXBwZWFyDQotaW4gdGhlIDx1aWNvbnRyb2w+S2V5PC91aWNvbnRyb2w+IGZpZWxkLiBPdGhlcndpc2UsIHlvdSBjYW4gZW50ZXIgdGhlIHNjaGVtYQ0KLWxvY2F0aW9uIGluIHRoZSA8dWljb250cm9sPktleTwvdWljb250cm9sPiBmaWVsZC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSA8dWljb250cm9sPlNwZWNpZnkgYWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3M8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHJlc291cmNlLjwvY21kPg0KLTxpbmZvPlRoaXMgV2ViIGFkZHJlc3MgaXMgdXNlZCB3aGVuIGFuIFhNTCBpbnN0YW5jZSBpcyBnZW5lcmF0ZWQgZnJvbSB0aGlzDQotY2F0YWxvZyBlbnRyeS4gIDxiPk5vdGU8L2I+OiBUaGlzIG9wdGlvbiBpcyBvbmx5IGF2YWlsYWJsZSBpZiB5b3Ugc2VsZWN0IDx1aWNvbnRyb2w+UHVibGljDQotSUQ8L3VpY29udHJvbD4gKGZvciBhIERURCkgb3IgIDx1aWNvbnRyb2w+TmFtZXNwYWNlIE5hbWU8L3VpY29udHJvbD4gKGZvcg0KLWEgc2NoZW1hKSBpbiB0aGUgIDx1aWNvbnRyb2w+S2V5IHR5cGU8L3VpY29udHJvbD4gZmllbGQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFub3RoZXIgY2F0YWxvZyB3aXRob3V0IGltcG9ydGluZyBpdCBpbnRvDQotdGhlIHdvcmtiZW5jaCwgY2xpY2sgPHVpY29udHJvbD5OZXh0IENhdGFsb2c8L3VpY29udHJvbD4uIFR5cGUgb3IgYnJvd3NlIGZvcg0KLXRoZSBYTUwgY2F0YWxvZyB5b3Ugd2FudCB0byByZWZlciB0by4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+V2hlbiB5b3UgYXJlIGRvbmUgY3JlYXRpbmcgY2F0YWxvZyBlbnRyaWVzLCBjbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvDQotY2xvc2UgdGhlIEFkZCBYTUwgQ2F0YWxvZyBFbnRyeSBkaWFsb2cuIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QWR2YW5jZWQ8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdG8gaW1wb3J0IG9yDQotZXhwb3J0IGFueSBYTUwgQ2F0YWxvZyBzZXR0aW5ncy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5FeHBvcnQ8L3VpY29udHJvbD4gaWYgeW91IHdhbnQgdG8gcGVyc2lzdCB0aGUNCi1YTUwgQ2F0YWxvZyBpbmZvcm1hdGlvbi4gT25seSB5b3VyIHVzZXIgc3BlY2lmaWVkIGVudHJpZXMgd2lsbCBiZSBleHBvcnRlZC48L2NtZD4NCi08c3Vic3RlcHM+DQotPHN1YnN0ZXA+PGNtZD5Zb3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBzZWxlY3QgYSBwcm9qZWN0IGFuZCBwcm92aWRlIGEgZmlsZQ0KLW5hbWUgdG8gc3RvcmUgeW91ciBjYXRhbG9nIGVudHJpZXMgaW4gYW4gLnhtbGNhdGFsb2cgZmlsZSwgd2hpY2ggY2FuIGJlIG9wZW5lZA0KLWZyb20gdGhlIE5hdmlnYXRvciB2aWV3LiBTbmNlIHlvdXIgY2F0YWxvZyBlbnRyaWVzIGFyZSBzdG9yZWQgaW4gYW4gLnhtbGNhdGFsb2cNCi1maWxlLCB5b3UgY2FuIGNoZWNrIHRoZW0gaW4gYW5kIG91dCBhbmQgc2hhcmUgdGhlbSBsaWtlIGFueSBvdGhlciBwcm9qZWN0DQotcmVzb3VyY2UuIDwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdWJzdGVwPg0KLTwvc3Vic3RlcHM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDx1aWNvbnRyb2w+SW1wb3J0PC91aWNvbnRyb2w+IGlmIHlvdSB3YW50IHRvIGltcG9ydCBhbiAueG1sY2F0YWxvZw0KLWZpbGUuPD9QdWIgQ2FyZXQ/PiBZb3Ugd2lsbCBiZSBwcm9tcHRlZCB0byBzZWxlY3QgdGhlIGZpbGUgeW91IHdhbnQgdG8gaW1wb3J0LjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPldoZW4geW91IGltcG9ydCBhIC54bWxjYXRhbG9nIGZpbGUsIGFueSBlbnRyaWVzIGluIGl0IHdpbGwgYmUNCi1sb2FkZWQgaW50byB0aGUgWE1MIENhdGFsb2cgKGFuZCBhbnkgZXhpc3RpbmcgZW50cmllcyB3aWxsIGJlIG92ZXJ3cml0dGVuKS4gPC9jbWQ+DQotPC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5PSzwvdWljb250cm9sPi48L2NtZD48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+IHRvIGNsb3NlIHRoZSBBZHZhbmNlZCBYTUwgQ2F0YWxvZw0KLVByZWZlcmVuY2VzIGRpYWxvZy48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5NYWtlIHN1cmUgdGhlIFhNTCBmaWxlIGlzIGluIGZvY3VzIGFuZCBjbGljayB0aGUgPHVpY29udHJvbD5SZWxvYWQNCi1kZXBlbmRlbmNpZXM8L3VpY29udHJvbD4gdG9vbGJhciBidXR0b24uIDwvY21kPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIFhNTCBmaWxlIGlzIG5vdyBhc3NvY2lhdGVkIHdpdGggdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBYTUwNCi1zY2hlbWEgb3IgRFRELjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA3MDg3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4bWxjYXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDE3MmI0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhtbGNhdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cyBhIERURCBvciBYTUwgc2NoZW1hKSBhbmQgYSBVbmlmb3JtIFJlc291cmNlIElkZW50aWZpZXIgKFVSSSkgKHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgRFREIG9yIFhNTCBzY2hlbWEncyBsb2NhdGlvbikuIFlvdSBjYW4gcGxhY2UgdGhlIEtleSBpbiBhbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cgZW50cnkgdG8gZmluZCB0aGUgbG9jYXRpb24gb2YgdGhlIERURCBvciBYTUwgc2NoZW1hIGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5IiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFuIFhNTCBDYXRhbG9nIGVudHJ5IGNvbnRhaW5zIHR3byBwYXJ0cyAtIGEgS2V5ICh3aGljaCByZXByZXNlbnRzIGEgRFREIG9yIFhNTCBzY2hlbWEpIGFuZCBhIFVuaWZvcm0gUmVzb3VyY2UgSWRlbnRpZmllciAoVVJJKSAod2hpY2ggY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluIGFuIFhNTCBmaWxlLiBXaGVuIHRoZSBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMgaXQsIGl0IHdpbGwgdXNlIHRoZSBYTUwgQ2F0YWxvZyBlbnRyeSB0byBmaW5kIHRoZSBsb2NhdGlvbiBvZiB0aGUgRFREIG9yIFhNTCBzY2hlbWEgYXNzb2NpYXRlZCB3aXRoIHRoZSBLZXkiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgY2F0YWxvZywgYWRkaW5nIGVudHJpZXMsIGltcG9ydGluZyBlbnRyaWVzLCBleHBvcnRpbmcgZW50cmllcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBjYXRhbG9nLCBhZGRpbmcgZW50cmllcywgaW1wb3J0aW5nIGVudHJpZXMsIGV4cG9ydGluZyBlbnRyaWVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxjYXQuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRjbnN0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0Z3JhbS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdGNuc3QuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhtbGNhdCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBlbnRyaWVzIHRvIHRoZSBYTUwgQ2F0YWxvZzwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idHhtbGNhdCI+PGEgbmFtZT0idHhtbGNhdCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGVudHJpZXMgdG8gdGhlIFhNTCBDYXRhbG9nPC9oMT4KLQotCi0KLQotPGRpdj48cD5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBjb250YWlucyB0d28gcGFydHMgLSBhIEtleSAod2hpY2ggcmVwcmVzZW50cwotYSBEVEQgb3IgWE1MIHNjaGVtYSkgYW5kIGEgVW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVyIChVUkkpICh3aGljaCBjb250YWlucwotaW5mb3JtYXRpb24gYWJvdXQgYSBEVEQgb3IgWE1MIHNjaGVtYSdzIGxvY2F0aW9uKS4gWW91IGNhbiBwbGFjZSB0aGUgS2V5IGluCi1hbiBYTUwgZmlsZS4gV2hlbiB0aGUgWE1MIHByb2Nlc3NvciBlbmNvdW50ZXJzIGl0LCBpdCB3aWxsIHVzZSB0aGUgWE1MIENhdGFsb2cKLWVudHJ5IHRvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBEVEQgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleTwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WE1MIENhdGFsb2cgZW50cmllcyBjYW4gYmUgdXNlZCBpbiB2YXJpb3VzIHNpdHVhdGlvbnMuIEZvciBleGFtcGxlLAoteW91IGFyZSB3b3JraW5nIG9uIGFuIFhNTCBmaWxlIG9uIHlvdXIgbWFpbiBkZXNrdG9wIGNvbXB1dGVyIGFuZCBwb2ludCBpdHMgPHNhbXAgY2xhc3M9ImNvZGVwaCI+c2NoZW1hTG9jYXRpb248L3NhbXA+IHRvd2FyZHMKLWEgc2NoZW1hIGNhbGxlZCA8c2FtcCBjbGFzcz0iY29kZXBoIj5jOlxNeVNjaGVtYS54c2Q8L3NhbXA+LiBZb3UgdGhlbiBzYXZlIGl0IHRvIHlvdXIKLWxhcHRvcCBjb21wdXRlciBzbyB5b3UgY2FuIHdvcmsgb24gaXQgbGF0ZXIuIFdoZW4geW91IG9wZW4gdGhlIGZpbGUgb24geW91cgotbGFwdG9wLCBob3dldmVyLCB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSAtIHRoZSBYTUwgZWRpdG9yIGNhbm5vdCBmaW5kIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5NeVNjaGVtYS54c2Q8L3NhbXA+IHNjaGVtYQotYmVjYXVzZSBpdCBpcyBhY3R1YWxseSBpbnN0YWxsZWQgb24geW91ciBEIGRyaXZlLiBZb3Ugd2lsbCBoYXZlIHRvIGVkaXQgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPnNjaGVtYUxvY2F0aW9uPC9zYW1wPiB0bwotcG9pbnQgdG8gPHNhbXAgY2xhc3M9ImNvZGVwaCI+ZDpcTXlTY2hlbWEueHNkPC9zYW1wPi4gV2hlbiB5b3UgaGF2ZSBmaW5pc2hlZCBlZGl0aW5nCi10aGUgWE1MIGZpbGUgYW5kIGFyZSByZWFkeSB0byBwdWJsaXNoIGl0IG9uIHRoZSBXZWIsIHlvdSB3aWxsIG5lZWQgdG8gZWRpdAotdGhlIFVSSSBhZ2FpbiBzbyB0aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIHRoYXQgaXMgYWNjZXNzaWJsZSBvbiB0aGUgV2ViLgotQnkgbm93LCB0aGUgcHJvYmxlbSBpcyBvYnZpb3VzLiBBIFVSSSB1c2VkIHdpdGhpbiBhbiBYTUwgZmlsZSBpcyBub3QgYXMgcG9ydGFibGUKLWFzIHlvdSB3b3VsZCBsaWtlIGl0IHRvIGJlLiBUbyBhdm9pZCBtYWtpbmcgZnJlcXVlbnQgY2hhbmdlcyB0byB5b3VyIFhNTCBkb2N1bWVudCwKLXlvdSBjYW4gdXNlIHRoZSBYTUwgQ2F0YWxvZy48L3A+Ci08cD5BbiBYTUwgQ2F0YWxvZyBlbnRyeSBpcyB1c2VkIGJ5IGFuIFhNTAotcHJvY2Vzc29yIHdoZW4gcmVzb2x2aW5nIGVudGl0eSByZWZlcmVuY2VzLiBZb3UgY2FuIHByb3ZpZGUgcnVsZXMgdG8gdGhlIGNhdGFsb2cKLXRvIHNwZWNpZnkgaG93IGVudGl0aWVzIHNob3VsZCBiZSByZXNvbHZlZC4gSWYgeW91IGNvbnNpZGVyIHRoZSBwcmVjZWRpbmcKLWV4YW1wbGUsIHlvdSBjb3VsZCBzcGVjaWZ5IGEgcnVsZSB0aGF0IHJlZGlyZWN0cyBhbiBJbnRlcm5ldCByZXNvdXJjZSByZWZlcmVuY2UKLShmb3IgZXhhbXBsZSwgIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiJodHRwOi8vd3d3LmlibS5jb20vcHVibGlzaGVkLXNjaGVtYXMvTXlTY2hlbWEueHNkIjwvc2FtcD4pCi1zbyB0aGF0IGl0IHBvaW50cyB0byBhIHJlc291cmNlIG9uIHRoZSBkZXZlbG9wZXIncyBsb2NhbCBtYWNoaW5lIChmb3IgZXhhbXBsZSwKLSA8c2FtcCBjbGFzcz0iY29kZXBoIj4iZmlsZTovLy9DOi9NeVNjaGVtYS54c2QiPC9zYW1wPikuIE5vdywgaW5zdGVhZCBvZiBmcmVxdWVudGx5IGVkaXRpbmcKLVhNTCBkb2N1bWVudHMgdG8gdXBkYXRlIHRoZSBVUklzIChlc3BlY2lhbGx5IHdoZW4gdGhlcmUgYXJlIG1hbnkgZG9jdW1lbnRzCi1pbiB5b3VyIHByb2plY3QpLCB5b3Ugb25seSBuZWVkIHRvIHVwZGF0ZSBhIHNpbmdsZSBydWxlIGluIHlvdXIgWE1MIENhdGFsb2cuPC9wPgotPHA+VGhlCi1mb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIGVudHJ5IHRvIHRoZSBYTUwKLUNhdGFsb2csIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHRoZSBYTUwgZmlsZSB0aGF0IHlvdSB3YW50IHRvIGFzc29jaWF0ZSB3aXRoIGEgRFREIG9yIFhNTAotc2NoZW1hLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdzwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmZXJlbmNlczwvc3Bhbj4KLSAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldlYiBhbmQgWE1MPC9zcGFuPiAmZ3Q7IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBDYXRhbG9nPC9zcGFuPjwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UaGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBDYXRhbG9nIEVudHJpZXM8L3NwYW4+IGZpZWxkIGNvbnRhaW5zCi1hIGxpc3Qgb2YgYW55IHVzZXItZGVmaW5lZCBhbmQgcGx1Zy1pbiBkZWZpbmVkIGNhdGFsb2cgZW50cmllcy48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+U2VsZWN0IGFueSBlbnRyeSB0byBzZWUgZGV0YWlscyBhYm91dCBpdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGV0YWlsczwvc3Bhbj4gZmllbGQuIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+IHRvIGNyZWF0ZSBhIG5ldyBjYXRhbG9nIGVudHJ5Ljwvc3Bhbj4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVSSTwvc3Bhbj4gZmllbGQsIHR5cGUgdGhlIGxvY2F0aW9uIG9mIHRoZQotRFREIG9yIFhNTCBzY2hlbWEgb3IgYnJvd3NlIGZvciBpdC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc3BlY2lmaWVkIGEgRFREIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VUkk8L3NwYW4+IGZpZWxkLAoteW91IGNhbiBzZWxlY3QgZWl0aGVyIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlB1YmxpYyBJRDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtCi1JRDwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5IFR5cGU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4gSWYKLXlvdSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHVibGljIElELDwvc3Bhbj4gdGhlIHZhbHVlIHlvdSBlbnRlciBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2V5PC9zcGFuPiBmaWVsZAotc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBQdWJsaWMgSUQgaW4gdGhlIFhNTCBmaWxlJ3MgRE9DVFlQRSBkZWNsYXJhdGlvbi4KLUlmIHlvdSBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3lzdGVtIElEPC9zcGFuPiwgdGhlIHZhbHVlIHlvdSBlbnRlciBzaG91bGQKLWNvcnJlc3BvbmQgdG8gdGhlIFN5c3RlbSBJRCBpbiBhbiBYTUwgZmlsZSdzIERPQ1RZUEUgZGVjbGFyYXRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc3BlY2lmaWVkIGFuIFhNTCBzY2hlbWEgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVSSTwvc3Bhbj4gZmllbGQsCi15b3UgY2FuIHNlbGVjdCBlaXRoZXIgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlIE5hbWU8L3NwYW4+IG9yICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY2hlbWEKLUxvY2F0aW9uPC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXkgVHlwZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotIElmIHRoZSBzY2hlbWEgZGVmaW5lcyBhIHRhcmdldCBuYW1lc3BhY2UsIGl0IHdpbGwgYXV0b21hdGljYWxseSBhcHBlYXIKLWluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LZXk8L3NwYW4+IGZpZWxkLiBPdGhlcndpc2UsIHlvdSBjYW4gZW50ZXIgdGhlIHNjaGVtYQotbG9jYXRpb24gaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleTwvc3Bhbj4gZmllbGQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNwZWNpZnkgYWx0ZXJuYXRpdmUgV2ViIGFkZHJlc3M8L3NwYW4+IGNoZWNrCi1ib3ggaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBzcGVjaWZ5IGFuIGFsdGVybmF0ZSBXZWIgYWRkcmVzcyBmb3IgdGhlIHJlc291cmNlLjwvc3Bhbj4KLSBUaGlzIFdlYiBhZGRyZXNzIGlzIHVzZWQgd2hlbiBhbiBYTUwgaW5zdGFuY2UgaXMgZ2VuZXJhdGVkIGZyb20gdGhpcwotY2F0YWxvZyBlbnRyeS4gIDxzdHJvbmc+Tm90ZTwvc3Ryb25nPjogVGhpcyBvcHRpb24gaXMgb25seSBhdmFpbGFibGUgaWYgeW91IHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QdWJsaWMKLUlEPC9zcGFuPiAoZm9yIGEgRFREKSBvciAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlIE5hbWU8L3NwYW4+IChmb3IKLWEgc2NoZW1hKSBpbiB0aGUgIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPktleSB0eXBlPC9zcGFuPiBmaWVsZC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIHJlZmVyIHRvIGFub3RoZXIgY2F0YWxvZyB3aXRob3V0IGltcG9ydGluZyBpdCBpbnRvCi10aGUgd29ya2JlbmNoLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0IENhdGFsb2c8L3NwYW4+LiBUeXBlIG9yIGJyb3dzZSBmb3IKLXRoZSBYTUwgY2F0YWxvZyB5b3Ugd2FudCB0byByZWZlciB0by4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgYXJlIGRvbmUgY3JlYXRpbmcgY2F0YWxvZyBlbnRyaWVzLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLWNsb3NlIHRoZSBBZGQgWE1MIENhdGFsb2cgRW50cnkgZGlhbG9nLiA8L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZHZhbmNlZDwvc3Bhbj4gaWYgeW91IHdhbnQgdG8gaW1wb3J0IG9yCi1leHBvcnQgYW55IFhNTCBDYXRhbG9nIHNldHRpbmdzLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHBvcnQ8L3NwYW4+IGlmIHlvdSB3YW50IHRvIHBlcnNpc3QgdGhlCi1YTUwgQ2F0YWxvZyBpbmZvcm1hdGlvbi4gT25seSB5b3VyIHVzZXIgc3BlY2lmaWVkIGVudHJpZXMgd2lsbCBiZSBleHBvcnRlZC48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+WW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gc2VsZWN0IGEgcHJvamVjdCBhbmQgcHJvdmlkZSBhIGZpbGUKLW5hbWUgdG8gc3RvcmUgeW91ciBjYXRhbG9nIGVudHJpZXMgaW4gYW4gLnhtbGNhdGFsb2cgZmlsZSwgd2hpY2ggY2FuIGJlIG9wZW5lZAotZnJvbSB0aGUgTmF2aWdhdG9yIHZpZXcuIFNuY2UgeW91ciBjYXRhbG9nIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBhbiAueG1sY2F0YWxvZwotZmlsZSwgeW91IGNhbiBjaGVjayB0aGVtIGluIGFuZCBvdXQgYW5kIHNoYXJlIHRoZW0gbGlrZSBhbnkgb3RoZXIgcHJvamVjdAotcmVzb3VyY2UuIDwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbXBvcnQ8L3NwYW4+IGlmIHlvdSB3YW50IHRvIGltcG9ydCBhbiAueG1sY2F0YWxvZwotZmlsZS4gWW91IHdpbGwgYmUgcHJvbXB0ZWQgdG8gc2VsZWN0IHRoZSBmaWxlIHlvdSB3YW50IHRvIGltcG9ydC48L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGk+PHNwYW4+V2hlbiB5b3UgaW1wb3J0IGEgLnhtbGNhdGFsb2cgZmlsZSwgYW55IGVudHJpZXMgaW4gaXQgd2lsbCBiZQotbG9hZGVkIGludG8gdGhlIFhNTCBDYXRhbG9nIChhbmQgYW55IGV4aXN0aW5nIGVudHJpZXMgd2lsbCBiZSBvdmVyd3JpdHRlbikuIDwvc3Bhbj4KLTwvbGk+Ci0KLTxsaT48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+IHRvIGNsb3NlIHRoZSBBZHZhbmNlZCBYTUwgQ2F0YWxvZwotUHJlZmVyZW5jZXMgZGlhbG9nLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk1ha2Ugc3VyZSB0aGUgWE1MIGZpbGUgaXMgaW4gZm9jdXMgYW5kIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZWxvYWQKLWRlcGVuZGVuY2llczwvc3Bhbj4gdG9vbGJhciBidXR0b24uIDwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgWE1MIGZpbGUgaXMgbm93IGFzc29jaWF0ZWQgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIFhNTAotc2NoZW1hIG9yIERURC48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsY29uY2VwdHMiPjxzdHJvbmc+UmVsYXRlZCBjb25jZXB0czwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvY3htbGNhdC5odG1sIiB0aXRsZT0iV2hlbiBhbiBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgaXQgaXMgYm91bmQgYnkgYW55IHN0cnVjdHVyYWwgcnVsZXMgY29udGFpbmVkIGluIHRoZSBEVEQgb3IgWE1MIHNjaGVtYS4gVG8gYmUgY29uc2lkZXJlZCBhIHZhbGlkIFhNTCBmaWxlLCBhIGRvY3VtZW50IG11c3QgYmUgYWNjb21wYW5pZWQgYnkgYSBEVEQgb3IgYW4gWE1MIHNjaGVtYSwgYW5kIGNvbmZvcm0gdG8gYWxsIG9mIHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIERURCBvciB0aGUgWE1MIHNjaGVtYS4iPlhNTCBmaWxlIGFzc29jaWF0aW9ucyB3aXRoIERURHMgYW5kIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0Y25zdC5odG1sIiB0aXRsZT0iSW4gdGhlIERlc2lnbiB2aWV3LCB3aGVuIHlvdSBlZGl0IGFuIFhNTCBmaWxlIHRoYXQgaGFzIGEgc2V0IG9mIGNvbnN0cmFpbnRzICh0aGF0IGlzLCBhIHNldCBvZiBydWxlcykgZGVmaW5lZCBieSBhIERURCBvciBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIHR1cm4gdGhlIGNvbnN0cmFpbnRzIG9uIGFuZCBvZmYgdG8gcHJvdmlkZSBmbGV4aWJpbGl0eSBpbiB0aGUgd2F5IHlvdSBlZGl0LCBidXQgc3RpbGwgbWFpbnRhaW4gdGhlIHZhbGlkaXR5IG9mIHRoZSBkb2N1bWVudCBwZXJpb2RpY2FsbHkuIj5FZGl0aW5nIHdpdGggRFREIG9yIFhNTCBzY2hlbWEgY29uc3RyYWludHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0ZG9jLmh0bWwiIHRpdGxlPSJUaGUgRE9DVFlQRSBkZWNsYXJhdGlvbiBpbiBhbiBYTUwgZmlsZSBpcyB1c2VkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaXQgdG8gYXNzb2NpYXRlIGl0IHdpdGggYSBEVEQgZmlsZS4gWW91IGNhbiBlZGl0IHlvdXIgRE9DVFlQRSBkZWNsYXJhdGlvbiB0byBjaGFuZ2UgdGhlIERURCBmaWxlIHlvdXIgWE1MIGZpbGUgaXMgYXNzb2NpYXRlZCB3aXRoLiI+RWRpdGluZyBET0NUWVBFIGRlY2xhcmF0aW9uczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RlZHRncmFtLmh0bWwiIHRpdGxlPSJJZiB5b3UgbWFrZSBjaGFuZ2VzIHRvIGEgRFREIGZpbGUgb3IgWE1MIHNjaGVtYSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MIGZpbGUgKHRoYXQgaXMgY3VycmVudGx5IG9wZW4pLCBjbGljayBYTUwgJmd0OyBSZWxvYWQgRGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSB0aGUgWE1MIGZpbGUgd2l0aCB0aGVzZSBjaGFuZ2VzLiBUaGUgY2hhbmdlcyB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgZ3VpZGVkIGVkaXRpbmcgbWVjaGFuaXNtcyBhdmFpbGFibGUgaW4gdGhlIGVkaXRvciwgc3VjaCBhcyBjb250ZW50IGFzc2lzdC4iPlVwZGF0aW5nIFhNTCBmaWxlcyB3aXRoIGNoYW5nZXMgbWFkZSB0byBEVERzIGFuZCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaC5odG1sIiB0aXRsZT0iWW91ciBuYW1lc3BhY2UgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcm92aWRlIHZhcmlvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFhNTCBmaWxlLCBzdWNoIGFzIHRoZSBYTUwgc2NoZW1hIGFuZCBuYW1lc3BhY2UgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLiBJZiBkZXNpcmVkLCB5b3UgY2FuIGNoYW5nZSB0aGUgc2NoZW1hIGFuZCBuYW1lc3BhY2UgeW91ciBYTUwgZmlsZSBpcyBhc3NvY2lhdGVkIHdpdGggb3IgYWRkIGEgbmV3IGFzc29jaWF0aW9uLiBNb2RpZnlpbmcgYW55IGFzc29jaWF0aW9ucyBjYW4gaW1wYWN0IHdoYXQgY29udGVudCBpcyBhbGxvd2VkIGluIHRoZSBYTUwgZmlsZS4iPkVkaXRpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNWY5M2UuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHByZWZzLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InR4cHJlZnMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgdGhlIFNvdXJjZSB2aWV3IG9mIHRoZSBYTUwNCi1lZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudA0KLWFzc2lzdCBydWxlcy4gIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gaW4gdGhlIFNvdXJjZQ0KLXZpZXcgZm9yIHlvdXIgWE1MIGRvY3VtZW50LCBhbmQgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+Rm9ybWF0PC91aWNvbnRyb2w+DQotPHVpY29udHJvbD5Eb2N1bWVudDwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+Ljwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBlZGl0b3I8aW5kZXh0ZXJtPnNldHRpbmc8aW5kZXh0ZXJtPmxpbmUgd3JhcHBpbmcNCi1ydWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+c2V0dGluZzxpbmRleHRlcm0+Y29udGVudA0KLWFzc2lzdCBydWxlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MIGVkaXRvcjxpbmRleHRlcm0+c2V0dGluZzxpbmRleHRlcm0+aW5kZW50YXRpb24NCi1zdHlsZTwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VG8gZGVmaW5lIFhNTCBwcmVmZXJlbmNlcywgcGVyZm9ybSB0aGUgZm9sbG93aW5nIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgIDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MPC91aWNvbnRyb2w+PHVpY29udHJvbD5YTUwgRmlsZXM8L3VpY29udHJvbD48dWljb250cm9sPlhNTA0KLVNvdXJjZTwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkVudGVyIGEgbWF4aW11bSB3aWR0aCBmb3IgZm9ybWF0dGVkIGxpbmVzIGluIHRoZSA8dWljb250cm9sPkxpbmUNCi13aWR0aDwvdWljb250cm9sPiBmaWVsZDwvY21kPjxpbmZvPlRoZSBkZWZhdWx0IHZhbHVlIGlzIDcyLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvdWljb250cm9sPiB0bw0KLXN0YXJ0IGV2ZXJ5IGF0dHJpYnV0ZSBvbiBhIG5ldyBsaW5lLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IGJsYW5rIGxpbmVzIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLA0KLXNlbGVjdCB0aGUgPHVpY29udHJvbD5DbGVhciBhbGwgYmxhbmsgbGluZXM8L3VpY29udHJvbD4gY2hlY2sgYm94LiA8L2NtZD4NCi08aW5mbz5CeSBkZWZhdWx0LCBibGFuayBsaW5lcyBhcmUgcHJlc2VydmVkIGluIGEgZm9ybWF0dGVkIGRvY3VtZW50LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgPHVpY29udHJvbD5JbmRlbnQgdXNpbmcgdGFiczwvdWljb250cm9sPiBpZiB5b3Ugd2FudCB0bw0KLXVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLCBvciwgaWYgeW91DQotcHJlZmVyIHRvIHVzZSBzcGFjZXMsIHNlbGVjdCA8dWljb250cm9sPkluZGVudCB1c2luZyBzcGFjZXM8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDx1aWNvbnRyb2w+SW5kZW50YXRpb24gc2l6ZTwvdWljb250cm9sPiB3aGljaA0KLWlzIHRoZSBudW1iZXIgb2YgdGFicyBvciBzcGFjZSBjaGFyYWN0ZXJzIHVzZWQgZm9yIGZvcm1hdHRpbmcgaW5kZW50YXRpb24uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBzcGVjaWZ5IGNlcnRhaW4gY2hhcmFjdGVycyAoJyZsdDsnIGlzIGRlZmF1bHQpIHRoYXQgd2lsbA0KLWNhdXNlIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0IHRvIHBvcCB1cCBhdXRvbWF0aWNhbGx5LiBFbnN1cmUgdGhlIDx1aWNvbnRyb2w+QXV0b21hdGljYWxseQ0KLW1ha2Ugc3VnZ2VzdGlvbnM8L3VpY29udHJvbD4gY2hlY2sgYm94IGlzIHNlbGVjdGVkIGFuZCBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXJzDQotaW4gdGhlIDx1aWNvbnRyb2w+UHJvbXB0IHdoZW4gdGhlc2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ8L3VpY29udHJvbD4gZmllbGQuIDwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSBzZWxlY3QgPGI+U3RyaWN0PC9iPiBmcm9tIHRoZSA8Yj5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9iPiBsaXN0LA0KLXN1Z2dlc3Rpb25zIHRoYXQgYXJlIGdyYW1tYXRpY2FsbHkgdmFsaWQgd2lsbCBiZSBzaG93biBmaXJzdCAod2l0aCBib2xkIGljb25zKQ0KLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbGVtZW50DQotc2NvcGUsIGJ1dCBub3QgZ3JhbW1hdGljYWxseSB2YWxpZCwgd2lsbCBiZSBzaG93biBiZWxvdyB0aGVtIHdpdGggYSBkZS1lbXBoYXNpemVkDQotaWNvbi4gVGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQgaXMgPGI+U3RyaWN0PC9iPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5Vc2UgaW5mZXJyZWQgZ3JhbW1hciBpbiBhYnNlbmNlIG9mIERURC9TY2hlbWE8L3VpY29udHJvbD4gY2hlY2sNCi1ib3ggaXMgc2VsZWN0ZWQgYnkgZGVmYXVsdC4gPC9jbWQ+PGluZm8+SWYgdGhpcyBib3ggaXMgc2VsZWN0ZWQsIHdoZW4geW91DQotaGF2ZSBhbiBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgeW91IHdpbGwNCi1zdGlsbCBiZSBhYmxlIHRvIGdldCBjb250ZW50IGFzc2lzdCAtIHRoZSB0b29sIHdpbGwgaW5mZXIgd2hhdCBzaG91bGQgY29tZQ0KLW5leHQgaW4geW91ciBmaWxlIGJhc2VkIG9uIHRoZSBleGlzdGluZyBjb250ZW50LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkFwcGx5PC91aWNvbnRyb2w+IGFuZCB0aGVuIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4gdG8NCi1zYXZlIHlvdXIgY2hhbmdlcy48L2NtZD48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4cHJlZnMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTI4OGM2Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhwcmVmcy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVmaW5pbmcgWE1MIGVkaXRvciBwcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudCBhc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gaW4gdGhlIFNvdXJjZSB2aWV3IGZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIEZvcm1hdCAmZ3Q7IERvY3VtZW50LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIHNldCB2YXJpb3VzIHByZWZlcmVuY2VzIGZvciB0aGUgU291cmNlIHZpZXcgb2YgdGhlIFhNTCBlZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudCBhc3Npc3QgcnVsZXMuIFRvIGFwcGx5IHRoZSBmb3JtYXR0aW5nIHN0eWxlcywgcmlnaHQtY2xpY2sgaW4gaW4gdGhlIFNvdXJjZSB2aWV3IGZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIEZvcm1hdCAmZ3Q7IERvY3VtZW50LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNldHRpbmcsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGNvbnRlbnQgYXNzaXN0IHJ1bGVzLCBpbmRlbnRhdGlvbiBzdHlsZSIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBlZGl0b3IsIHNldHRpbmcsIGxpbmUgd3JhcHBpbmcgcnVsZXMsIGNvbnRlbnQgYXNzaXN0IHJ1bGVzLCBpbmRlbnRhdGlvbiBzdHlsZSIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idHhwcmVmcyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4cHJlZnMiPjxhIG5hbWU9InR4cHJlZnMiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkRlZmluaW5nIFhNTCBlZGl0b3IgcHJlZmVyZW5jZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIHRoZSBTb3VyY2UgdmlldyBvZiB0aGUgWE1MCi1lZGl0b3Igc3VjaCBhcyB0aGUgZm9ybWF0dGVyIGluZGVudGF0aW9uIHN0eWxlLCBsaW5lIHdyYXBwaW5nIHJ1bGVzLCBhbmQgY29udGVudAotYXNzaXN0IHJ1bGVzLiAgVG8gYXBwbHkgdGhlIGZvcm1hdHRpbmcgc3R5bGVzLCByaWdodC1jbGljayBpbiBpbiB0aGUgU291cmNlCi12aWV3IGZvciB5b3VyIFhNTCBkb2N1bWVudCwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Rm9ybWF0PC9zcGFuPgotICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnQ8L3NwYW4+PC9zcGFuPi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRvIGRlZmluZSBYTUwgcHJlZmVyZW5jZXMsIHBlcmZvcm0gdGhlIGZvbGxvd2luZyBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTDwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5YTUwgRmlsZXM8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+WE1MCi1Tb3VyY2U8L3NwYW4+PC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5FbnRlciBhIG1heGltdW0gd2lkdGggZm9yIGZvcm1hdHRlZCBsaW5lcyBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TGluZQotd2lkdGg8L3NwYW4+IGZpZWxkPC9zcGFuPiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA3Mi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TcGxpdCBtdWx0aXBsZSBhdHRyaWJ1dGVzIGVhY2ggb24gYSBuZXcgbGluZTwvc3Bhbj4gdG8KLXN0YXJ0IGV2ZXJ5IGF0dHJpYnV0ZSBvbiBhIG5ldyBsaW5lLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IGJsYW5rIGxpbmVzIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgZG9jdW1lbnQgaXMgZm9ybWF0dGVkLAotc2VsZWN0IHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DbGVhciBhbGwgYmxhbmsgbGluZXM8L3NwYW4+IGNoZWNrIGJveC4gPC9zcGFuPgotIEJ5IGRlZmF1bHQsIGJsYW5rIGxpbmVzIGFyZSBwcmVzZXJ2ZWQgaW4gYSBmb3JtYXR0ZWQgZG9jdW1lbnQuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbmRlbnQgdXNpbmcgdGFiczwvc3Bhbj4gaWYgeW91IHdhbnQgdG8KLXVzZSB0YWIgY2hhcmFjdGVycyAoXHQpIGFzIHRoZSBzdGFuZGFyZCBmb3JtYXR0aW5nIGluZGVudGF0aW9uLCBvciwgaWYgeW91Ci1wcmVmZXIgdG8gdXNlIHNwYWNlcywgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluZGVudCB1c2luZyBzcGFjZXM8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBhbHNvIHNwZWNpZnkgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluZGVudGF0aW9uIHNpemU8L3NwYW4+IHdoaWNoCi1pcyB0aGUgbnVtYmVyIG9mIHRhYnMgb3Igc3BhY2UgY2hhcmFjdGVycyB1c2VkIGZvciBmb3JtYXR0aW5nIGluZGVudGF0aW9uLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBzcGVjaWZ5IGNlcnRhaW4gY2hhcmFjdGVycyAoJyZsdDsnIGlzIGRlZmF1bHQpIHRoYXQgd2lsbAotY2F1c2UgdGhlIGNvbnRlbnQgYXNzaXN0IGxpc3QgdG8gcG9wIHVwIGF1dG9tYXRpY2FsbHkuIEVuc3VyZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXV0b21hdGljYWxseQotbWFrZSBzdWdnZXN0aW9uczwvc3Bhbj4gY2hlY2sgYm94IGlzIHNlbGVjdGVkIGFuZCBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXJzCi1pbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJvbXB0IHdoZW4gdGhlc2UgY2hhcmFjdGVycyBhcmUgaW5zZXJ0ZWQ8L3NwYW4+IGZpZWxkLiA8L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBzZWxlY3QgPHN0cm9uZz5TdHJpY3Q8L3N0cm9uZz4gZnJvbSB0aGUgPHN0cm9uZz5TdWdnZXN0aW9uIHN0cmF0ZWd5PC9zdHJvbmc+IGxpc3QsCi1zdWdnZXN0aW9ucyB0aGF0IGFyZSBncmFtbWF0aWNhbGx5IHZhbGlkIHdpbGwgYmUgc2hvd24gZmlyc3QgKHdpdGggYm9sZCBpY29ucykKLWluIHRoZSBjb250ZW50IGFzc2lzdCBsaXN0LiBPdGhlciBzdWdnZXN0aW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbGVtZW50Ci1zY29wZSwgYnV0IG5vdCBncmFtbWF0aWNhbGx5IHZhbGlkLCB3aWxsIGJlIHNob3duIGJlbG93IHRoZW0gd2l0aCBhIGRlLWVtcGhhc2l6ZWQKLWljb24uIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkIGlzIDxzdHJvbmc+U3RyaWN0PC9zdHJvbmc+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZSBpbmZlcnJlZCBncmFtbWFyIGluIGFic2VuY2Ugb2YgRFREL1NjaGVtYTwvc3Bhbj4gY2hlY2sKLWJveCBpcyBzZWxlY3RlZCBieSBkZWZhdWx0LiA8L3NwYW4+IElmIHRoaXMgYm94IGlzIHNlbGVjdGVkLCB3aGVuIHlvdQotaGF2ZSBhbiBYTUwgZmlsZSB0aGF0IGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYSBEVEQgb3IgWE1MIHNjaGVtYSwgeW91IHdpbGwKLXN0aWxsIGJlIGFibGUgdG8gZ2V0IGNvbnRlbnQgYXNzaXN0IC0gdGhlIHRvb2wgd2lsbCBpbmZlciB3aGF0IHNob3VsZCBjb21lCi1uZXh0IGluIHlvdXIgZmlsZSBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgY29udGVudC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFwcGx5PC9zcGFuPiBhbmQgdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4gdG8KLXNhdmUgeW91ciBjaGFuZ2VzLjwvc3Bhbj48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTVhNmJkYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R4c2l0eXAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idHhzaXR5cCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VXNpbmcgeHNpOnR5cGU8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlVzaW5nIHhzaTp0eXBlPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSBoYXZlIGVsZW1lbnRzIGluIHlvdXIgWE1MIGZpbGUgd2hvc2UgdHlwZSBpcyBhIGNvbXBsZXggdHlwZSwNCi14c2k6dHlwZSBzdXBwb3J0IGluIHRoZSBYTUwgZWRpdG9yIGxldHMgeW91IGNob29zZSBiZXR3ZWVuIHRoZSBjb21wbGV4IHR5cGUNCi1hbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0Ljwvc2hvcnRkZXNjPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGFsbG93cyB5b3UgdG8gZGVyaXZlIHR5cGVzIGJ5IGV4dGVuc2lvbi4NCi1Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBhbmQgeW91IGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBmb3IgaXQgY2FsbGVkDQotIDx1c2VyaW5wdXQ+QWRkcmVzczwvdXNlcmlucHV0Pi4gWW91IHRoZW4gYWRkIHNvbWUgYmFzaWMgZWxlbWVudHMgdG8gPHVzZXJpbnB1dD5BZGRyZXNzPC91c2VyaW5wdXQ+LA0KLXN1Y2ggYXMgPHVzZXJpbnB1dD5zdHJlZXROYW1lPC91c2VyaW5wdXQ+IGFuZCA8dXNlcmlucHV0PmNpdHk8L3VzZXJpbnB1dD4uPC9wPjxwPkFmdGVyDQotdGhpcywgeW91IGRlcml2ZSAoYnkgZXh0ZW5zaW9uKSB0d28gbmV3IGNvbXBsZXggdHlwZXMgZnJvbSAgPHVzZXJpbnB1dD5BZGRyZXNzPC91c2VyaW5wdXQ+IC0gPHVzZXJpbnB1dD5VU0FkZHJlc3M8L3VzZXJpbnB1dD4gYW5kIDx1c2VyaW5wdXQ+VUtBZGRyZXNzPC91c2VyaW5wdXQNCi0+IFlvdSBhZGQgYSBuZXcgZWxlbWVudCB0byA8dXNlcmlucHV0PlVTQWRkcmVzczwvdXNlcmlucHV0PiBjYWxsZWQgIDx1c2VyaW5wdXQ+c3RhdGU8L3VzZXJpbnB1dD4sDQotYW5kIGFsc28gYSBuZXcgZWxlbWVudCB0byA8dXNlcmlucHV0PlVLQWRkcmVzczwvdXNlcmlucHV0PiBjYWxsZWQgPHVzZXJpbnB1dD5wb3N0Y29kZTwvdXNlcmlucHV0Pi48L3A+PHA+QWZ0ZXINCi15b3UgaGF2ZSBkb25lIHRoaXMsIHlvdSBjcmVhdGUgdHdvIG1vcmUgZWxlbWVudHMgLSA8dXNlcmlucHV0PmJpbGxUbzwvdXNlcmlucHV0PiBhbmQgPHVzZXJpbnB1dD5zaGlwVG88L3VzZXJpbnB1dD4gLQ0KLWFzICA8c3lzdGVtb3V0cHV0PkFkZHJlc3M8L3N5c3RlbW91dHB1dD4gdHlwZXMuPC9wPjxwPldoZW4geW91IGNyZWF0ZSBhbiBYTUwNCi1pbnN0YW5jZSBkb2N1bWVudCBmb3IgYW4gZWxlbWVudCBzdWNoIGFzICA8c3lzdGVtb3V0cHV0PmJpbGxUbzwvc3lzdGVtb3V0cHV0PiBvcg0KLSA8dXNlcmlucHV0PkFkZHJlc3M8L3VzZXJpbnB1dD4sIGFuIHhzaTp0eXBlIGF0dHJpYnV0ZSB3aWxsIGF1dG9tYXRpY2FsbHkNCi1iZSBhZGRlZCB0byBpdC4gRm9yIGV4YW1wbGU6PC9wPjxjb2RlYmxvY2s+Jmx0O2JpbGxUbyB4c2k6dHlwZT0iaXBvOkFkZHJlc3MiPjwvY29kZWJsb2NrPjxwPlRoZQ0KLXhzaTp0eXBlIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIGlkZW50aWZ5IGRlcml2ZWQgY29tcGxleCB0eXBlcyAoYXMgd2VsbCBhcyBjb21wbGV4DQotdHlwZXMgdGhhdCBoYXZlIGJlZW4gZGVyaXZlZCBmcm9tKS48L3A+PHA+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLA0KLWEgbGlzdCB3aWxsIGJlIGF2YWlsYWJsZSwgbGV0dGluZyB5b3Ugc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB0eXBlIGRlZmluaXRpb24NCi0oPHVpY29udHJvbD5BZGRyZXNzPC91aWNvbnRyb2w+LCA8dWljb250cm9sPlVTQWRkcmVzczwvdWljb250cm9sPiwgb3IgIDx1aWNvbnRyb2w+VUtBZGRyZXNzPC91aWNvbnRyb2w+KS4NCi1UaGUgZ3VpZGVkIGVkaXRpbmcgZm9yIHRoZSBjb250ZW50IG1vZGVsIHdpbGwgcmVmbGVjdCB0aGUgdHlwZSBkZWZpbml0aW9uDQotdGhhdCB5b3UgY2hvb3NlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHNlbGVjdCAgPHVpY29udHJvbD5VU0FkZHJlc3M8L3VpY29udHJvbD4gLA0KLXlvdXIgPGNvZGVwaD5iaWxsVG88L2NvZGVwaD4gZWxlbWVudCBjYW4gY29udGFpbiBhIDxjb2RlcGg+c3RhdGU8L2NvZGVwaD4gZWxlbWVudCwNCi1idXQgaXQgY2Fubm90IGNvbnRhaW4gYSA8Y29kZXBoPnBvc3Rjb2RlPC9jb2RlcGg+IGVsZW1lbnQuPC9wPjxwPlRoZSBYTUwgZXhhbXBsZQ0KLSJFZGl0aW5nIGFuZCB2YWxpZGF0aW5nIFhNTCBmaWxlcyIgZGVtb25zdHJhdGVzIDxiPnhzaTp0eXBlPC9iPiBzdXBwb3J0LjwvcD48cD5Gb3INCi1tb3JlIGluZm9ybWF0aW9uIGFib3V0IHhzaTp0eXBlLCByZWZlciB0byB0aGUgPGI+VXNpbmcgRGVyaXZlZCBUeXBlcyBpbiBJbnN0YW5jZQ0KLURvY3VtZW50czwvYj4gc2VjdGlvbiBpbiA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLyNVc2VEZXJpdkluSW5zdERvY3MiDQotc2NvcGU9ImV4dGVybmFsIj5YTUwgU2NoZW1hIFBhcnQgMDogUHJpbWVyLjwveHJlZj48L3A+PHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24NCi1hYm91dCB2YWxpZGF0aW9uIHNlbWFudGljcyB3aGVuIHhzaTp0eXBlIGlzIHVzZWQsIHJlZmVyIHRvIHRoZSA8Yj5TY2hlbWEtUmVsYXRlZA0KLU1hcmt1cCBpbiBEb2N1bWVudHMgQmVpbmcgVmFsaWRhdGVkPC9iPiBzZWN0aW9uIGluICA8eHJlZiBmb3JtYXQ9Imh0bWwiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyN4c2lfdHlwZSINCi1zY29wZT0iZXh0ZXJuYWwiPlhNTCBTY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzPC94cmVmPiA8L3A+PC9jb250ZXh0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhtbGVkaXRvci5kb2MudXNlci90b3BpY3MvdHhzaXR5cC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZWQyYzYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueG1sZWRpdG9yLmRvYy51c2VyL3RvcGljcy90eHNpdHlwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJVc2luZyB4c2k6dHlwZSIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJJZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsIHhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZSBhbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3UgaGF2ZSBlbGVtZW50cyBpbiB5b3VyIFhNTCBmaWxlIHdob3NlIHR5cGUgaXMgYSBjb21wbGV4IHR5cGUsIHhzaTp0eXBlIHN1cHBvcnQgaW4gdGhlIFhNTCBlZGl0b3IgbGV0cyB5b3UgY2hvb3NlIGJldHdlZW4gdGhlIGNvbXBsZXggdHlwZSBhbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0eHNpdHlwIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+VXNpbmcgeHNpOnR5cGU8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR4c2l0eXAiPjxhIG5hbWU9InR4c2l0eXAiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlVzaW5nIHhzaTp0eXBlPC9oMT4KLQotCi0KLTxkaXY+PHA+SWYgeW91IGhhdmUgZWxlbWVudHMgaW4geW91ciBYTUwgZmlsZSB3aG9zZSB0eXBlIGlzIGEgY29tcGxleCB0eXBlLAoteHNpOnR5cGUgc3VwcG9ydCBpbiB0aGUgWE1MIGVkaXRvciBsZXRzIHlvdSBjaG9vc2UgYmV0d2VlbiB0aGUgY29tcGxleCB0eXBlCi1hbmQgYW55IG90aGVyIGNvbXBsZXggdHlwZXMgZGVyaXZlZCBmcm9tIGl0LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBhbGxvd3MgeW91IHRvIGRlcml2ZSB0eXBlcyBieSBleHRlbnNpb24uCi1Gb3IgZXhhbXBsZSwgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBhbmQgeW91IGNyZWF0ZSBhIGNvbXBsZXggdHlwZSBmb3IgaXQgY2FsbGVkCi0gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5BZGRyZXNzPC9rYmQ+LiBZb3UgdGhlbiBhZGQgc29tZSBiYXNpYyBlbGVtZW50cyB0byA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkFkZHJlc3M8L2tiZD4sCi1zdWNoIGFzIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+c3RyZWV0TmFtZTwva2JkPiBhbmQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5jaXR5PC9rYmQ+LjwvcD4KLTxwPkFmdGVyCi10aGlzLCB5b3UgZGVyaXZlIChieSBleHRlbnNpb24pIHR3byBuZXcgY29tcGxleCB0eXBlcyBmcm9tICA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkFkZHJlc3M8L2tiZD4gLSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPlVTQWRkcmVzczwva2JkPiBhbmQgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VS0FkZHJlc3M8L2tiZD4gWW91IGFkZCBhIG5ldyBlbGVtZW50IHRvIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+VVNBZGRyZXNzPC9rYmQ+IGNhbGxlZCAgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5zdGF0ZTwva2JkPiwKLWFuZCBhbHNvIGEgbmV3IGVsZW1lbnQgdG8gPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5VS0FkZHJlc3M8L2tiZD4gY2FsbGVkIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+cG9zdGNvZGU8L2tiZD4uPC9wPgotPHA+QWZ0ZXIKLXlvdSBoYXZlIGRvbmUgdGhpcywgeW91IGNyZWF0ZSB0d28gbW9yZSBlbGVtZW50cyAtIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+YmlsbFRvPC9rYmQ+IGFuZCA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPnNoaXBUbzwva2JkPiAtCi1hcyAgPHR0IGNsYXNzPSJzeXNvdXQiPkFkZHJlc3M8L3R0PiB0eXBlcy48L3A+Ci08cD5XaGVuIHlvdSBjcmVhdGUgYW4gWE1MCi1pbnN0YW5jZSBkb2N1bWVudCBmb3IgYW4gZWxlbWVudCBzdWNoIGFzICA8dHQgY2xhc3M9InN5c291dCI+YmlsbFRvPC90dD4gb3IKLSA8a2JkIGNsYXNzPSJ1c2VyaW5wdXQiPkFkZHJlc3M8L2tiZD4sIGFuIHhzaTp0eXBlIGF0dHJpYnV0ZSB3aWxsIGF1dG9tYXRpY2FsbHkKLWJlIGFkZGVkIHRvIGl0LiBGb3IgZXhhbXBsZTo8L3A+Ci08cHJlPiZsdDtiaWxsVG8geHNpOnR5cGU9ImlwbzpBZGRyZXNzIiZndDs8L3ByZT4KLTxwPlRoZQoteHNpOnR5cGUgYXR0cmlidXRlIGlzIHVzZWQgdG8gaWRlbnRpZnkgZGVyaXZlZCBjb21wbGV4IHR5cGVzIChhcyB3ZWxsIGFzIGNvbXBsZXgKLXR5cGVzIHRoYXQgaGF2ZSBiZWVuIGRlcml2ZWQgZnJvbSkuPC9wPgotPHA+SW4gdGhlIERlc2lnbiB2aWV3IG9mIHRoZSBYTUwgZWRpdG9yLAotYSBsaXN0IHdpbGwgYmUgYXZhaWxhYmxlLCBsZXR0aW5nIHlvdSBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHR5cGUgZGVmaW5pdGlvbgotKDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZHJlc3M8L3NwYW4+LCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VU0FkZHJlc3M8L3NwYW4+LCBvciAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VUtBZGRyZXNzPC9zcGFuPikuCi1UaGUgZ3VpZGVkIGVkaXRpbmcgZm9yIHRoZSBjb250ZW50IG1vZGVsIHdpbGwgcmVmbGVjdCB0aGUgdHlwZSBkZWZpbml0aW9uCi10aGF0IHlvdSBjaG9vc2UuIEZvciBleGFtcGxlLCBpZiB5b3Ugc2VsZWN0ICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5VU0FkZHJlc3M8L3NwYW4+ICwKLXlvdXIgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YmlsbFRvPC9zYW1wPiBlbGVtZW50IGNhbiBjb250YWluIGEgPHNhbXAgY2xhc3M9ImNvZGVwaCI+c3RhdGU8L3NhbXA+IGVsZW1lbnQsCi1idXQgaXQgY2Fubm90IGNvbnRhaW4gYSA8c2FtcCBjbGFzcz0iY29kZXBoIj5wb3N0Y29kZTwvc2FtcD4gZWxlbWVudC48L3A+Ci08cD5UaGUgWE1MIGV4YW1wbGUKLSJFZGl0aW5nIGFuZCB2YWxpZGF0aW5nIFhNTCBmaWxlcyIgZGVtb25zdHJhdGVzIDxzdHJvbmc+eHNpOnR5cGU8L3N0cm9uZz4gc3VwcG9ydC48L3A+Ci08cD5Gb3IKLW1vcmUgaW5mb3JtYXRpb24gYWJvdXQgeHNpOnR5cGUsIHJlZmVyIHRvIHRoZSA8c3Ryb25nPlVzaW5nIERlcml2ZWQgVHlwZXMgaW4gSW5zdGFuY2UKLURvY3VtZW50czwvc3Ryb25nPiBzZWN0aW9uIGluIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0wLyNVc2VEZXJpdkluSW5zdERvY3MiIHRhcmdldD0iX2JsYW5rIj5YTUwgU2NoZW1hIFBhcnQgMDogUHJpbWVyLjwvYT48L3A+Ci08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbgotYWJvdXQgdmFsaWRhdGlvbiBzZW1hbnRpY3Mgd2hlbiB4c2k6dHlwZSBpcyB1c2VkLCByZWZlciB0byB0aGUgPHN0cm9uZz5TY2hlbWEtUmVsYXRlZAotTWFya3VwIGluIERvY3VtZW50cyBCZWluZyBWYWxpZGF0ZWQ8L3N0cm9uZz4gc2VjdGlvbiBpbiAgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvI3hzaV90eXBlIiB0YXJnZXQ9Il9ibGFuayI+WE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L2E+IDwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5jdnNpZ25vcmUgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDE2NjIyOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotYnVpbGQueG1sCi1vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyXzEuMC4wLmphcgotdGVtcAotRGl0YUxpbmsuY2F0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0IGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjE3MGI1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXI8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuTWFuaWZlc3RCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5TY2hlbWFCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuUGx1Z2luTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWZhNWM5MS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jVHVlIEFwciAwNCAwMzozNjozMiBFRFQgMjAwNgotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLWVuY29kaW5nLzxwcm9qZWN0Pj1JU08tODg1OS0xCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRkOGI1Yy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotI1N1biBBcHIgMTYgMTQ6Mzc6MjEgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmNsZWFuT3V0cHV0Rm9sZGVyPWNsZWFuCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmR1cGxpY2F0ZVJlc291cmNlVGFzaz13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLmludmFsaWRDbGFzc3BhdGg9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5idWlsZGVyLnJlc291cmNlQ29weUV4Y2x1c2lvbkZpbHRlcj0qLmxhdW5jaAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY2lyY3VsYXJDbGFzc3BhdGg9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNsYXNzcGF0aC5leGNsdXNpb25QYXR0ZXJucz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jbGFzc3BhdGgubXVsdGlwbGVPdXRwdXRMb2NhdGlvbnM9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5pbmxpbmVKc3JCeXRlY29kZT1kaXNhYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjIKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS40Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kb2MuY29tbWVudC5zdXBwb3J0PWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLm1heFByb2JsZW1QZXJVbml0PTEwMAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hbm5vdGF0aW9uU3VwZXJJbnRlcmZhY2U9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uYXV0b2JveGluZz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kZXByZWNhdGlvbkluRGVwcmVjYXRlZENvZGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZGVwcmVjYXRpb25XaGVuT3ZlcnJpZGluZ0RlcHJlY2F0ZWRNZXRob2Q9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5kaXNjb3VyYWdlZFJlZmVyZW5jZT1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW1wdHlTdGF0ZW1lbnQ9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5lbnVtSWRlbnRpZmllcj13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmZpZWxkSGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbFBhcmFtZXRlckJvdW5kPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5maW5hbGx5QmxvY2tOb3RDb21wbGV0aW5nTm9ybWFsbHk9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZm9yYmlkZGVuUmVmZXJlbmNlPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmhpZGRlbkNhdGNoQmxvY2s9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBhdGlibGVOb25Jbmhlcml0ZWRJbnRlcmZhY2VNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbmNvbXBsZXRlRW51bVN3aXRjaD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW5kaXJlY3RTdGF0aWNBY2Nlc3M9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmludmFsaWRKYXZhZG9jVGFnc0RlcHJlY2F0ZWRSZWY9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5pbnZhbGlkSmF2YWRvY1RhZ3NOb3RWaXNpYmxlUmVmPWVuYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uaW52YWxpZEphdmFkb2NUYWdzVmlzaWJpbGl0eT1wcml2YXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmxvY2FsVmFyaWFibGVIaWRpbmc9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1ldGhvZFdpdGhDb25zdHJ1Y3Rvck5hbWU9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ0RlcHJlY2F0ZWRBbm5vdGF0aW9uPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY0NvbW1lbnRzT3ZlcnJpZGluZz1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jQ29tbWVudHNWaXNpYmlsaXR5PXB1YmxpYwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3M9aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLm1pc3NpbmdKYXZhZG9jVGFnc092ZXJyaWRpbmc9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5taXNzaW5nSmF2YWRvY1RhZ3NWaXNpYmlsaXR5PXByaXZhdGUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ092ZXJyaWRlQW5ub3RhdGlvbj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubWlzc2luZ1NlcmlhbFZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub0VmZmVjdEFzc2lnbm1lbnQ9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0ubm9JbXBsaWNpdFN0cmluZ0NvbnZlcnNpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5ub25FeHRlcm5hbGl6ZWRTdHJpbmdMaXRlcmFsPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5vdmVycmlkaW5nUGFja2FnZURlZmF1bHRNZXRob2Q9d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5wb3NzaWJsZUFjY2lkZW50YWxCb29sZWFuQXNzaWdubWVudD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnNwZWNpYWxQYXJhbWV0ZXJIaWRpbmdGaWVsZD1lbmFibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN0YXRpY0FjY2Vzc1JlY2VpdmVyPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnN1cHByZXNzV2FybmluZ3M9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5zeW50aGV0aWNBY2Nlc3NFbXVsYXRpb249d2FybmluZwotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS50eXBlUGFyYW1ldGVySGlkaW5nPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bmNoZWNrZWRUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5kb2N1bWVudGVkRW1wdHlCbG9jaz1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5oYW5kbGVkV2FybmluZ1Rva2VuPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW5uZWNlc3NhcnlFbHNlPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bm5lY2Vzc2FyeVR5cGVDaGVjaz1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnF1YWxpZmllZEZpZWxkQWNjZXNzPWlnbm9yZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS51bnNhZmVUeXBlT3BlcmF0aW9uPXdhcm5pbmcKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkRGVjbGFyZWRUaHJvd25FeGNlcHRpb249aWdub3JlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZERlY2xhcmVkVGhyb3duRXhjZXB0aW9uV2hlbk92ZXJyaWRpbmc9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkSW1wb3J0PWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExhYmVsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZExvY2FsPWVycm9yCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcj1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUGFyYW1ldGVyV2hlbkltcGxlbWVudGluZ0Fic3RyYWN0PWRpc2FibGVkCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLnVudXNlZFBhcmFtZXRlcldoZW5PdmVycmlkaW5nQ29uY3JldGU9ZGlzYWJsZWQKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0udW51c2VkUHJpdmF0ZU1lbWJlcj1lcnJvcgotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS52YXJhcmdzQXJndW1lbnROZWVkQ2FzdD13YXJuaW5nCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5zb3VyY2U9MS4zCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5pbmNvbXBhdGlibGVKREtMZXZlbD1pZ25vcmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmluY29tcGxldGVDbGFzc3BhdGg9ZXJyb3IKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LnVpLnByZWZzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmMmFjNjUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQudWkucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjM5IEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotaW50ZXJuYWwuZGVmYXVsdC5jb21wbGlhbmNlPWRlZmF1bHQKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmx0ay5jb3JlLnJlZmFjdG9yaW5nLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTkzNjhjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcucHJlZnMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSNUdWUgQXByIDA0IDAzOjM2OjMyIEVEVCAyMDA2Ci1lY2xpcHNlLnByZWZlcmVuY2VzLnZlcnNpb249MQotb3JnLmVjbGlwc2UubHRrLmNvcmUucmVmYWN0b3JpbmcuZW5hYmxlLnByb2plY3QucmVmYWN0b3JpbmcuaGlzdG9yeT1mYWxzZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5wZGUucHJlZnMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcyNDk1OC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvLnNldHRpbmdzL29yZy5lY2xpcHNlLnBkZS5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLSNTdW4gQXByIDE2IDE0OjA1OjI5IEVEVCAyMDA2Ci1jb21waWxlcnMucC5idWlsZD0wCi1jb21waWxlcnMucC5kZXByZWNhdGVkPTEKLWNvbXBpbGVycy5wLmlsbGVnYWwtYXR0LXZhbHVlPTAKLWNvbXBpbGVycy5wLm5vLXJlcXVpcmVkLWF0dD0wCi1jb21waWxlcnMucC5ub3QtZXh0ZXJuYWxpemVkLWF0dD0wCi1jb21waWxlcnMucC51bmtub3duLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMucC51bmtub3duLWNsYXNzPTAKLWNvbXBpbGVycy5wLnVua25vd24tZWxlbWVudD0wCi1jb21waWxlcnMucC51bmtub3duLXJlc291cmNlPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtZXgtcG9pbnRzPTAKLWNvbXBpbGVycy5wLnVucmVzb2x2ZWQtaW1wb3J0PTAKLWNvbXBpbGVycy5wLnVudXNlZC1lbGVtZW50LW9yLWF0dHJpYnV0ZT0wCi1jb21waWxlcnMudXNlLXByb2plY3Q9dHJ1ZQotZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9NRVRBLUlORi9NQU5JRkVTVC5NRgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFhNjEzYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvTUVUQS1JTkYvTUFOSUZFU1QuTUYKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLU1hbmlmZXN0LVZlcnNpb246IDEuMAotQnVuZGxlLU1hbmlmZXN0VmVyc2lvbjogMgotQnVuZGxlLU5hbWU6ICVQbHVnaW4ubmFtZQotQnVuZGxlLVN5bWJvbGljTmFtZTogb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcjsgc2luZ2xldG9uOj10cnVlCi1CdW5kbGUtVmVyc2lvbjogMS4wLjIwMy5xdWFsaWZpZXIKLUJ1bmRsZS1WZW5kb3I6ICVCdW5kbGUtVmVuZG9yLjAKLUJ1bmRsZS1Mb2NhbGl6YXRpb246IHBsdWdpbgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwuZGl0YW1hcCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RMZWRpdG9ycmVsLmRpdGFtYXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExM2VlMDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRExlZGl0b3JyZWwuZGl0YW1hcAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotIDwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiIgIm1hcC5kdGQiPg0KLTxtYXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guZGl0YSIgbmF2dGl0bGU9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuZGl0YSIgaWQ9InhzZGNvbmNlcHRzIiBsaW5raW5nPSJ0YXJnZXRvbmx5Ig0KLW5hdnRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R2ZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sc2NlZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmR0c2NobS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGltcHNjaG0uZGl0YSIgbmF2dGl0bGU9IkltcG9ydGluZyBYTUwgc2NoZW1hcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxzY2VkLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3R2ZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGltcHQuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW5jbC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RuYXZzcmMuZGl0YSIgbmF2dGl0bGU9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9jeG1sc2NlZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxzY2VkLmRpdGEiIGxpbmtpbmc9Im5vcm1hbCIgbmF2dGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbXh0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgY29tcGxleCB0eXBlcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbW9kLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRnbGVtLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBjb250ZW50IG1vZGVscyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ2xlbS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGdsb2JhbCBlbGVtZW50cyI+PC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdydXAuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBncm91cHMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3Jwci5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY21vZC5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3Jwci5kaXRhIiBsaW5raW5nPSJub3JtYWwiIG5hdnRpdGxlPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRncnVwLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZ3JvdXBzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW1wdC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRpbmNsLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRyZGZuLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ybm1zcGMuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IlhNTCBuYW1lc3BhY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90dmR0c2NobS5kaXRhIiBuYXZ0aXRsZT0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjeG1sc2NoLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJDcmVhdGluZyBYTUwgc2NoZW1hcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ycmVmaW50Zy5kaXRhIiBuYXZ0aXRsZT0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N4bWxzY2VkLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRzY2htLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3Mvcm5tc3BjLmRpdGEiIG5hdnRpdGxlPSJYTUwgbmFtZXNwYWNlcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RlZHRwcmVmLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcyI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljZ3JvdXA+DQotPHRvcGljZ3JvdXAgY29sbGVjdGlvbi10eXBlPSJmYW1pbHkiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBzaW1wbGUgdHlwZXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkcmVnLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY21vZC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIj48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG0uZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBlbGVtZW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG1yLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTwvdG9waWNncm91cD4NCi08dG9waWNncm91cCBjb2xsZWN0aW9uLXR5cGU9ImZhbWlseSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZGVsc2NtcC5kaXRhIiBuYXZ0aXRsZT0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnJlZmludGcuZGl0YSIgbmF2dGl0bGU9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG0uZGl0YSIgbGlua2luZz0ic291cmNlb25seSIgbmF2dGl0bGU9IkFkZGluZyBlbGVtZW50cyI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG1yLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRnbGJhLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTx0b3BpY2dyb3VwIGNvbGxlY3Rpb24tdHlwZT0iZmFtaWx5Ij4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRlbG1yLmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5kaXRhIiBsaW5raW5nPSJ0YXJnZXRvbmx5IiBuYXZ0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuZGl0YSIgbGlua2luZz0idGFyZ2V0b25seSIgbmF2dGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRnbGJhLmRpdGEiIGxpbmtpbmc9InRhcmdldG9ubHkiIG5hdnRpdGxlPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY2dyb3VwPg0KLTwvbWFwPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RMZWRpdG9ycmVsLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9YU0RMZWRpdG9ycmVsLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JhYzZmZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNETGVkaXRvcnJlbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotCi08dG9jIHRvcGljPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCI+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iVmFsaWRhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGltcHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9jeG1sc2NlZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdG5hdnNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3htbHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIiBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29tcGxleCB0eXBlcyIgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIiBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29udGVudCBtb2RlbHMiIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29udGVudCBtb2RlbHMiIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBncm91cHMiIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29udGVudCBtb2RlbHMiIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ3JvdXBzIiBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0idG9waWNzL3JubXNwYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlZhbGlkYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90dmR0c2NobS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkNyZWF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQ3JlYXRpbmcgWE1MIHNjaGVtYXMiIGhyZWY9InRvcGljcy90Y3htbHNjaC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iWE1MIG5hbWVzcGFjZXMiIGhyZWY9InRvcGljcy9ybm1zcGMuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHNpbXBsZSB0eXBlcyIgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyIgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29udGVudCBtb2RlbHMiIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZWxtci5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiIGhyZWY9InRvcGljcy90ZGVsc2NtcC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBlbGVtZW50cyIgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIiBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCIvPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MuZGl0YW1hcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM0YmNmNy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBtYXAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgTWFwLy9FTiINCi0gIm1hcC5kdGQiPg0KLTxtYXAgY29sbGVjdGlvbi10eXBlPSJzZXF1ZW5jZSIgaWQ9IndzdHhzZHRvYyIgdGl0bGU9IlhNTCBzY2hlbWFzIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL2N3b3JrWFNELmRpdGEiIGxpbmtpbmc9InNvdXJjZW9ubHkiIG5hdnRpdGxlPSJXb3JraW5nIHdpdGggWE1MIHNjaGVtYXMgKFhTRHMpIj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RjeG1sc2NoLmRpdGEiIG5hdnRpdGxlPSJDcmVhdGluZyBYTUwgc2NoZW1hcyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5kaXRhIiBuYXZ0aXRsZT0iWFNEIFNsdXNoIGZpbGUiDQotdG9jPSJubyI+PC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RpbXBzY2htLmRpdGEiIG5hdnRpdGxlPSJJbXBvcnRpbmcgYW4gWE1MIHNjaGVtYSI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RuYXZzcmMuZGl0YSIgbmF2dGl0bGU9Ik5hdmlnYXRpbmcgWE1MIHNjaGVtYXMiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5kaXRhIiBuYXZ0aXRsZT0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0cHJlZi5kaXRhIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hICBlZGl0b3IgcHJlZmVyZW5jZXMiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90ZWR0c2NobS5kaXRhIiBsaW5raW5nPSJub25lIiBuYXZ0aXRsZT0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvY3htbHNjZWQuZGl0YSIgaWQ9InhzZGNvbmNlcHRzIiBuYXZ0aXRsZT0iWE1MIHNjaGVtYSBlZGl0b3IiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkYWdycC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGF0dHJpYnV0ZSBncm91cCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRjbXh0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBjb21wbGV4IHR5cGUiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkY21vZC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgY29udGVudCBtb2RlbCI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkYW55ZS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ij48L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGVsbS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGVsZW1lbnQiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZWxtci5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGVsZW1lbnQgcmVmZXJlbmNlIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdycHIuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGdyb3VwIHJlZmVyZW5jZSI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhIGdsb2JhbCBhdHRyaWJ1dGUiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ2xlbS5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZ2xvYmFsIGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkZ3J1cC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgZ3JvdXAiPjwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkaW1wdC5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGFuIGltcG9ydCBlbGVtZW50Ij4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGFkZGluY2wuZGl0YSIgbmF2dGl0bGU9IkFkZGluZyBhbiBpbmNsdWRlIGVsZW1lbnQiPg0KLTwvdG9waWNyZWY+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkcmRmbi5kaXRhIiBuYXZ0aXRsZT0iQWRkaW5nIGEgcmVkZWZpbmUgZWxlbWVudCI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3RhZGRzbXB0LmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBzaW1wbGUgdHlwZSI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy90YWRkcmVnLmRpdGEiIG5hdnRpdGxlPSJBZGRpbmcgYSBwYXR0ZXJuIGZhY2V0IHRvIGEgc2ltcGxlIHR5cGUiPg0KLTwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmRpdGEiIGlkPSJ4c2RpY29ucyIgbmF2dGl0bGU9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuZGl0YSIgbmF2dGl0bGU9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyI+DQotPHRvcGljcmVmIGhyZWY9InRvcGljcy9ycmVmaW50Zy5kaXRhIiBuYXZ0aXRsZT0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciI+DQotPC90b3BpY3JlZj4NCi08L3RvcGljcmVmPg0KLTx0b3BpY3JlZiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uZGl0YSIgbmF2dGl0bGU9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSI+DQotPC90b3BpY3JlZj4NCi08dG9waWNyZWYgaHJlZj0idG9waWNzL3JubXNwYy5kaXRhIiBuYXZ0aXRsZT0iWE1MIG5hbWVzcGFjZXMiPjwvdG9waWNyZWY+DQotPC90b3BpY3JlZj4NCi08L21hcD4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvWFNEZWRpdG9ybWFwX3RvYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjMTBiMWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL1hTRGVkaXRvcm1hcF90b2MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPD9OTFMgVFlQRT0ib3JnLmVjbGlwc2UuaGVscC50b2MiPz4KLQotPHRvYyBsYWJlbD0iWE1MIHNjaGVtYXMiIHRvcGljPSJ0b3BpY3MvY3dvcmtYU0QuaHRtbCI+Ci08dG9waWMgbGFiZWw9Ildvcmtpbmcgd2l0aCBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL2N3b3JrWFNELmh0bWwiPgotPHRvcGljIGxhYmVsPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iSW1wb3J0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdGltcHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdG5hdnNyYy5odG1sIi8+Ci08dG9waWMgbGFiZWw9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIiBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwiPgotPHRvcGljIGxhYmVsPSJYTUwgc2NoZW1hIGVkaXRvciIgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGF0dHJpYnV0ZSBncm91cHMiIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBjb21wbGV4IHR5cGVzIiBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgY29udGVudCBtb2RlbHMiIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGFuIGFueSBlbGVtZW50IiBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlcyIgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBncm91cHMiIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIiBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCIvPgotPHRvcGljIGxhYmVsPSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sIi8+Ci08dG9waWMgbGFiZWw9IkFkZGluZyBzaW1wbGUgdHlwZXMiIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sIj4KLTx0b3BpYyBsYWJlbD0iQWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlcyIgaHJlZj0idG9waWNzL3RhZGRyZWcuaHRtbCIvPgotPC90b3BpYz4KLTwvdG9waWM+Ci08dG9waWMgbGFiZWw9Ikljb25zIHVzZWQgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yIiBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmh0bWwiLz4KLTx0b3BpYyBsYWJlbD0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIiBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCI+Ci08dG9waWMgbGFiZWw9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sIi8+Ci08L3RvcGljPgotPHRvcGljIGxhYmVsPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCIvPgotPHRvcGljIGxhYmVsPSJYTUwgbmFtZXNwYWNlcyIgaHJlZj0idG9waWNzL3JubXNwYy5odG1sIi8+Ci08L3RvcGljPgotPC90b2M+CmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYWJvdXQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM1OTg5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPEhUTUw+Ci0KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLQotPEJPRFkgbGFuZz0iRU4tVVMiPgotCi08SDM+QWJvdXQgVGhpcyBDb250ZW50PC9IMz4KLQotPFA+TWF5IDIsIDIwMDY8L1A+Ci0KLTxIMz5MaWNlbnNlPC9IMz4KLQotPFA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluIAotKCJDb250ZW50IikuIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgCi11bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgCi0oIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQKLTxBIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lcGwtdjEwLnBocCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VwbC12MTAucGhwPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci0KLTxQPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIAotQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCJSZWRpc3RyaWJ1dG9yIikgYW5kIGRpZmZlcmVudCAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG1heSBhcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuIAotQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3KScyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuIElmIG5vIHN1Y2ggCi1saWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSAKLXRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50IAotYW5kIHN1Y2ggc291cmNlIGNvZGUgbWF5IGJlIG9idGFpbmVkIGF0Ci08QSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnLyI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy88L0E+LjwvUD4KLQotPC9CT0RZPgotPC9IVE1MPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2J1aWxkLnByb3BlcnRpZXMgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwMzZmYS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gWFNEZWRpdG9ybWFwX3RvYy54bWwsXAotICAgICAgICAgICAgICAgYWJvdXQuaHRtbCxcCi0gICAgICAgICAgICAgICBvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXgueG1sLFwKLSAgICAgICAgICAgICAgIGltYWdlcy8sXAotICAgICAgICAgICAgICAgcGx1Z2luLnByb3BlcnRpZXMsXAotICAgICAgICAgICAgICAgcGx1Z2luLnhtbCxcCi0gICAgICAgICAgICAgICB0b3BpY3MvLFwKLSAgICAgICAgICAgICAgIE1FVEEtSU5GLwotc3JjLmluY2x1ZGVzID0gYnVpbGQucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Ccm93c2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9Ccm93c2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxMWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvQnJvd3NlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvTW9yZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL01vcmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzIxMWJmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvTW9yZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFsbC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFsbC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMzdmYmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbGwuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnkuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBbnkuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzlmOTNjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55LmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI4MGNjMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREFueUF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5ZDQ5ZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWE4ZGY3My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzFkYjkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzNjVhZjIuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RBdHRyaWJ1dGVSZWYuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDaG9pY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YWY1ODNmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ2hvaWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEQ29tcGxleFR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGI5NGYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNERWxlbWVudFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0OWFjZmMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzlkNDlkMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHbG9iYWxFbGVtZW50LmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ0NWYwOC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYyYzJkNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREdyb3VwLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNER3JvdXBSZWYuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cFJlZi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ODk4N2IuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RHcm91cFJlZi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREltcG9ydC5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTREltcG9ydC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDRjZTUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbXBvcnQuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbmNsdWRlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNESW5jbHVkZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyNmM1MjcuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RJbmNsdWRlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEUmVkZWZpbmUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RSZWRlZmluZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2OTY0YzEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RSZWRlZmluZS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmI4NjEyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZiBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlRW51bS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExZDc5NTguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVBhdHRlcm4uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTEzY2Y0Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL2ltYWdlcy9YU0RTaW1wbGVUeXBlLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3NDQzMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvaW1hZ2VzL1hTRFNpbXBsZVR5cGUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9teXBsdWdpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiODczMzkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL215cGx1Z2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08P2VjbGlwc2UgdmVyc2lvbj0iMy4wIj8+Ci08P05MUyBUWVBFPSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI/PgotPCEtLSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotICogYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0gKiB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSAqIAotICogQ29udHJpYnV0b3JzOgotICogICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotPCEtLSBUaGlzIGlzIHRoZSBwbHVnaW4gZm9yIGRlY2xhcmluZyB0aGUgaGVscCAgICAgICAgIC0tPgotPCEtLSBjb250cmlidXRpb25zIGZvciB1c2luZyB0aGUgdG9vbC4gICAgICAgICAgICAgICAgIC0tPgotPCEtLSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08cGx1Z2luPgotCi08ZXh0ZW5zaW9uIHBvaW50PSJvcmcuZWNsaXBzZS5oZWxwLnRvYyI+Ci0gICAgPHRvYyBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLnhtbCIvPgotICAgICAgCi08L2V4dGVuc2lvbj4KLQotCTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAuaW5kZXgiPgotICAgICAgPGluZGV4IGZpbGU9Im9yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwiLz4KLTwvZXh0ZW5zaW9uPgotPC9wbHVnaW4+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIubWFwbGlzdCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyLm1hcGxpc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNmY0NjMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIubWFwbGlzdAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPG1hcGxpc3QgdmVyc2lvbj0iMy42LjIiPg0KLSAgPG5hdj4NCi0gICAgPG1hcCBmaWxlPSJYU0RlZGl0b3JtYXBfdG9jLmRpdGFtYXAiLz4NCi0gIDwvbmF2Pg0KLSAgPGxpbms+DQotICAgIDxtYXAgZmlsZT0iWFNEZWRpdG9ybWFwX3RvYy5kaXRhbWFwIi8+DQotICAgIDxtYXAgZmlsZT0iWFNETGVkaXRvcnJlbC5kaXRhbWFwIi8+DQotICA8L2xpbms+DQotPC9tYXBsaXN0Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyaW5kZXguaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTljMTg4OS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJzZWN1cml0eSIgY29udGVudD0icHVibGljIiAvPgotPG1ldGEgbmFtZT0iUm9ib3RzIiBjb250ZW50PSJpbmRleCxmb2xsb3ciIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIG5hbWU9IkRDLkZvcm1hdCIgY29udGVudD0iWEhUTUwiIC8+Ci08IS0tIEFsbCByaWdodHMgcmVzZXJ2ZWQuIExpY2Vuc2VkIE1hdGVyaWFscyBQcm9wZXJ0eSBvZiBJQk0gLS0+Ci08IS0tIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLS0+Ci08IS0tIFVzZSwgZHVwbGljYXRpb24gb3IgZGlzY2xvc3VyZSByZXN0cmljdGVkIGJ5IC0tPgotPCEtLSBHU0EgQURQIFNjaGVkdWxlIENvbnRyYWN0IHdpdGggSUJNIENvcnAuIC0tPgotPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaWJtZGl0YS5jc3MiIC8+Ci08dGl0bGU+SW5kZXg8L3RpdGxlPgotPC9oZWFkPgotPGJvZHk+Ci08aDE+SW5kZXg8L2gxPgotPGEgbmFtZT0iSURYMF80NCIgaHJlZj0iI0lEWDFfNDQiPkQ8L2E+Ci08YSBuYW1lPSJJRFgwXzQ1IiBocmVmPSIjSURYMV80NSI+RTwvYT4KLTxhIG5hbWU9IklEWDBfNDkiIGhyZWY9IiNJRFgxXzQ5Ij5JPC9hPgotPGEgbmFtZT0iSURYMF81MiIgaHJlZj0iI0lEWDFfNTIiPlI8L2E+Ci08YSBuYW1lPSJJRFgwXzU4IiBocmVmPSIjSURYMV81OCI+WDwvYT4KLTxocj48L2hyPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ0IiBocmVmPSIjSURYMF80NCI+RDwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+ZGVwZW5kYW50IGFydGlmYWN0czwvYT4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ1IiBocmVmPSIjSURYMF80NSI+RTwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+ZWRpdGluZyBYTUwgc2NoZW1hczwvYT4KLTwvbGk+Ci08L3VsPgotPHN0cm9uZz48YSBuYW1lPSJJRFgxXzQ5IiBocmVmPSIjSURYMF80OSI+STwvYT48L3N0cm9uZz4KLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT5JY29ucwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy9yeHNkaWNvbnMuaHRtbCNyaWNvbnMiPlhNTCBzY2hlbWEgZWRpdG9yPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81MiIgaHJlZj0iI0lEWDBfNTIiPlI8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciPnJlZmFjdG9yaW5nPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+cmVuYW1pbmc8L2E+Ci08L2xpPgotPC91bD4KLTxzdHJvbmc+PGEgbmFtZT0iSURYMV81OCIgaHJlZj0iI0lEWDBfNTgiPlg8L2E+PC9zdHJvbmc+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+WE1MIG5hbWVzcGFjZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3Mvcm5tc3BjLmh0bWwjcm5tc3BjIj5vdmVydmlldzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyI+WE1MIHNjaGVtYSBlZGl0b3I8L2E+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+YWRkaW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiPmFuIGFueSBlbGVtZW50PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCI+YXR0cmlidXRlIGdyb3VwczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiPmNvbXBsZXggdHlwZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIj5jb250ZW50IG1vZGVsczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiPmVsZW1lbnQgcmVmZXJlbmNlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIj5lbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiPmdsb2JhbCBhdHRyaWJ1dGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSI+Z2xvYmFsIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciI+Z3JvdXAgcmVmZXJlbmNlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiPmdyb3VwczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiPmltcG9ydCBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiPmluY2x1ZGUgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyI+cGF0dGVybiBmYWNldHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIj5yZWRlZmluZSBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiPnNpbXBsZSB0eXBlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5hbiBhbnkgZWxlbWVudAotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sI3RhZGRhbnllIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+YXR0cmlidXRlcyBncm91cHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sI3JyZWZpbnRnIj5jbGVhbiB1cCBpbjwvYT4KLTwvbGk+Ci08bGk+Y29tcGxleCB0eXBlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0Ij5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Y29udGVudCBtb2RlbHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNtb2QuaHRtbCN0YWRkY21vZCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmRlbGV0aW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RkZWxzY21wLmh0bWwjdGRlbHNjbXAiPmNvbXBvbmVudHM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZWRpdGluZyBYTUwgc2NoZW1hcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90ZWR0c2NobS5odG1sI3RlZHRzY2htIj5zaW1wbGUgdHlwZXM8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZWxlbWVudCByZWZlcmVuY2VzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5lbGVtZW50cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwjdGFkZGVsbSI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmdsb2JhbCBhdHRyaWJ1dGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5nbG9iYWwgZWxlbWVudHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmdyb3VwIHJlZmVyZW5jZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmdyb3VwcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sI3RhZGRncnVwIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3J4c2RpY29ucy5odG1sI3JpY29ucyI+aWNvbnM8L2E+Ci08L2xpPgotPGxpPmltcG9ydCBlbGVtZW50cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0Ij5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+aW5jbHVkZSBlbGVtZW50cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sI3RhZGRpbmNsIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL2N4bWxzY2VkLmh0bWwjY3htbHNjZWQiPm92ZXJ2aWV3PC9hPgotPC9saT4KLTxsaT5wYXR0ZXJuIGZhY2V0cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPnJlZGVmaW5lIGVsZW1lbnRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCNycmVmaW50ZyI+cmVmZXJlbnRpYWwgaW50ZWdyaXR5PC9hPgotPC9saT4KLTxsaT5zaW1wbGUgdHlwZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciPlhNTCBzY2hlbWEgZmlsZXM8L2E+Ci08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+YWRkaW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiPmFuIGFueSBlbGVtZW50PC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCI+YXR0cmlidXRlIGdyb3VwczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiPmNvbXBsZXggdHlwZXM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIj5jb250ZW50IG1vZGVsczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiPmVsZW1lbnQgcmVmZXJlbmNlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIj5lbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiPmdsb2JhbCBhdHRyaWJ1dGVzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSI+Z2xvYmFsIGVsZW1lbnRzPC9hPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciI+Z3JvdXAgcmVmZXJlbmNlczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiPmdyb3VwczwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiPmltcG9ydCBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiPmluY2x1ZGUgZWxlbWVudHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyI+cGF0dGVybiBmYWNldHM8L2E+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIj5yZWRlZmluZSBlbGVtZW50czwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiPnNpbXBsZSB0eXBlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5hbiBhbnkgZWxlbWVudAotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sI3RhZGRhbnllIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+YXR0cmlidXRlcyBncm91cHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmNvbXBsZXggdHlwZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmNvbnRlbnQgbW9kZWxzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGN4bWxzY2guaHRtbCN0Y3htbHNjaCI+Y3JlYXRpbmc8L2E+Ci08L2xpPgotPGxpPmRlZmluaW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwjdGVkdHByZWYiPmRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZTwvYT4KLTwvbGk+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwjdGVkdHByZWYiPnNjaGVtYSBwcmVmaXg8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+ZGVsZXRpbmcKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCN0ZGVsc2NtcCI+Y29tcG9uZW50czwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5lZGl0aW5nCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwjdGVkdHNjaG0iPnNpbXBsZSB0eXBlczwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5lbGVtZW50IHJlZmVyZW5jZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmVsZW1lbnRzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Z2xvYmFsIGF0dHJpYnV0ZXMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPmdsb2JhbCBlbGVtZW50cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ2xlbS5odG1sI3RhZGRnbGVtIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Z3JvdXAgcmVmZXJlbmNlcwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+Z3JvdXBzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5pbXBvcnQgZWxlbWVudHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90aW1wc2NobS5odG1sI3RpbXBzY2htIj5pbXBvcnRpbmc8L2E+Ci08L2xpPgotPGxpPmluY2x1ZGUgZWxlbWVudHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZGluY2wuaHRtbCN0YWRkaW5jbCI+YWRkaW5nPC9hPgotPC9saT4KLTwvdWw+Ci08L2xpPgotPGxpPjxhIGhyZWY9InRvcGljcy90bmF2c3JjLmh0bWwjdG5hdnNyYyI+bmF2aWdhdGluZzwvYT4KLTwvbGk+Ci08bGk+cGF0dGVybiBmYWNldHMKLTx1bCBjbGFzcz0iaW5kZXhsaXN0Ij4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sI3RhZGRyZWciPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT5yZWRlZmluZSBlbGVtZW50cwotPHVsIGNsYXNzPSJpbmRleGxpc3QiPgotPGxpPjxhIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIj5hZGRpbmc8L2E+Ci08L2xpPgotPC91bD4KLTwvbGk+Ci08bGk+c2ltcGxlIHR5cGVzCi08dWwgY2xhc3M9ImluZGV4bGlzdCI+Ci08bGk+PGEgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiPmFkZGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTxsaT48YSBocmVmPSJ0b3BpY3MvdHZkdHNjaG0uaHRtbCN0dmR0c2NobSI+dmFsaWRhdGluZzwvYT4KLTwvbGk+Ci08L3VsPgotPC9saT4KLTwvdWw+Ci08L2JvZHk+PC9odG1sPgpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXJpbmRleC54bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTIxMzc3Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGluZGV4PgotICA8ZW50cnkga2V5d29yZD0iWE1MIHNjaGVtYSBmaWxlcyI+Ci0gICAgPHRvcGljIGhyZWY9InRvcGljcy90cmVmYWN0clhTRC5odG1sI3JlZmFjdG9yaW5nIiB0aXRsZT0iUmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlcyIvPgotICAgIDxlbnRyeSBrZXl3b3JkPSJjcmVhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RjeG1sc2NoLmh0bWwjdGN4bWxzY2giIHRpdGxlPSJDcmVhdGluZyBYTUwgc2NoZW1hcyIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RpbXBzY2htLmh0bWwjdGltcHNjaG0iIHRpdGxlPSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJuYXZpZ2F0aW5nIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdG5hdnNyYy5odG1sI3RuYXZzcmMiIHRpdGxlPSJOYXZpZ2F0aW5nIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGVmaW5pbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHByZWYuaHRtbCN0ZWR0cHJlZiIgdGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9InNjaGVtYSBwcmVmaXgiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRwcmVmLmh0bWwjdGVkdHByZWYiIHRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJzaW1wbGUgdHlwZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RlZHRzY2htLmh0bWwjdGVkdHNjaG0iIHRpdGxlPSJFZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZSBncm91cHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwjdGFkZGFncnAiIHRpdGxlPSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJjb21wbGV4IHR5cGVzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY214dC5odG1sI3RhZGRjbXh0IiB0aXRsZT0iQWRkaW5nIGNvbXBsZXggdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY29udGVudCBtb2RlbHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiIHRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYW4gYW55IGVsZW1lbnQiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiIHRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG0uaHRtbCN0YWRkZWxtIiB0aXRsZT0iQWRkaW5nIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnQgcmVmZXJlbmNlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciIgdGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXAgcmVmZXJlbmNlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciIgdGl0bGU9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBhdHRyaWJ1dGVzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ2xiYS5odG1sI3RhZGRnbGJhIiB0aXRsZT0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBlbGVtZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXBzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sI3RhZGRncnVwIiB0aXRsZT0iQWRkaW5nIGdyb3VwcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnQgZWxlbWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbXB0Lmh0bWwjdGFkZGltcHQiIHRpdGxlPSJBZGRpbmcgaW1wb3J0IGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImluY2x1ZGUgZWxlbWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiIHRpdGxlPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJyZWRlZmluZSBlbGVtZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCN0YWRkcmRmbiIgdGl0bGU9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJzaW1wbGUgdHlwZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRzbXB0Lmh0bWwjdGFkZHNtcHQiIHRpdGxlPSJBZGRpbmcgc2ltcGxlIHR5cGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9InBhdHRlcm4gZmFjZXRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyIgdGl0bGU9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYXR0cmlidXRlcyBncm91cHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFncnAuaHRtbCN0YWRkYWdycCIgdGl0bGU9IkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbXBsZXggdHlwZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCIgdGl0bGU9IkFkZGluZyBjb21wbGV4IHR5cGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgbW9kZWxzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbW9kLmh0bWwjdGFkZGNtb2QiIHRpdGxlPSJBZGRpbmcgY29udGVudCBtb2RlbHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYW4gYW55IGVsZW1lbnQiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGFueWUuaHRtbCN0YWRkYW55ZSIgdGl0bGU9IkFkZGluZyBhbiBhbnkgZWxlbWVudCIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwjdGFkZGVsbSIgdGl0bGU9IkFkZGluZyBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50IHJlZmVyZW5jZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbXIuaHRtbCN0YWRkZWxtciIgdGl0bGU9IkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXAgcmVmZXJlbmNlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3Jwci5odG1sI3RhZGRncnByIiB0aXRsZT0iQWRkaW5nIGdyb3VwIHJlZmVyZW5jZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGF0dHJpYnV0ZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgZWxlbWVudHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsZW0uaHRtbCN0YWRkZ2xlbSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ3JvdXBzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnVwLmh0bWwjdGFkZGdydXAiIHRpdGxlPSJBZGRpbmcgZ3JvdXBzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImltcG9ydCBlbGVtZW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0IiB0aXRsZT0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbmNsdWRlIGVsZW1lbnRzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRpbmNsLmh0bWwjdGFkZGluY2wiIHRpdGxlPSJBZGRpbmcgaW5jbHVkZSBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZWRlZmluZSBlbGVtZW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmRmbi5odG1sI3RhZGRyZGZuIiB0aXRsZT0iQWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9InNpbXBsZSB0eXBlcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sI3RhZGRzbXB0IiB0aXRsZT0iQWRkaW5nIHNpbXBsZSB0eXBlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJwYXR0ZXJuIGZhY2V0cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkcmVnLmh0bWwjdGFkZHJlZyIgdGl0bGU9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZGVsZXRpbmciPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImNvbXBvbmVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RkZWxzY21wLmh0bWwjdGRlbHNjbXAiIHRpdGxlPSJEZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0idmFsaWRhdGluZyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3R2ZHRzY2htLmh0bWwjdHZkdHNjaG0iIHRpdGxlPSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9IlhNTCBzY2hlbWEgZWRpdG9yIj4KLSAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImVkaXRpbmcgWE1MIHNjaGVtYXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9InNpbXBsZSB0eXBlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGVkdHNjaG0uaHRtbCN0ZWR0c2NobSIgdGl0bGU9IkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Im92ZXJ2aWV3Ij4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvY3htbHNjZWQuaHRtbCNjeG1sc2NlZCIgdGl0bGU9IlhNTCBzY2hlbWEgZWRpdG9yIi8+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhdHRyaWJ1dGUgZ3JvdXBzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkYWdycC5odG1sI3RhZGRhZ3JwIiB0aXRsZT0iQWRkaW5nIGF0dHJpYnV0ZSBncm91cHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY29tcGxleCB0eXBlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGNteHQuaHRtbCN0YWRkY214dCIgdGl0bGU9IkFkZGluZyBjb21wbGV4IHR5cGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImNvbnRlbnQgbW9kZWxzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIiB0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFuIGFueSBlbGVtZW50Ij4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkYW55ZS5odG1sI3RhZGRhbnllIiB0aXRsZT0iQWRkaW5nIGFuIGFueSBlbGVtZW50Ii8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImVsZW1lbnRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZWxtLmh0bWwjdGFkZGVsbSIgdGl0bGU9IkFkZGluZyBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJlbGVtZW50IHJlZmVyZW5jZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiIHRpdGxlPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Imdyb3VwIHJlZmVyZW5jZXMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRncnByLmh0bWwjdGFkZGdycHIiIHRpdGxlPSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgYXR0cmlidXRlcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdsYmEuaHRtbCN0YWRkZ2xiYSIgdGl0bGU9IkFkZGluZyBnbG9iYWwgYXR0cmlidXRlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJnbG9iYWwgZWxlbWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwjdGFkZGdsZW0iIHRpdGxlPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgICAgPGVudHJ5IGtleXdvcmQ9Imdyb3VwcyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdydXAuaHRtbCN0YWRkZ3J1cCIgdGl0bGU9IkFkZGluZyBncm91cHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iaW1wb3J0IGVsZW1lbnRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW1wdC5odG1sI3RhZGRpbXB0IiB0aXRsZT0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJpbmNsdWRlIGVsZW1lbnRzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sI3RhZGRpbmNsIiB0aXRsZT0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0icmVkZWZpbmUgZWxlbWVudHMiPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRyZGZuLmh0bWwjdGFkZHJkZm4iIHRpdGxlPSJBZGRpbmcgcmVkZWZpbmUgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgICA8ZW50cnkga2V5d29yZD0ic2ltcGxlIHR5cGVzIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkc21wdC5odG1sI3RhZGRzbXB0IiB0aXRsZT0iQWRkaW5nIHNpbXBsZSB0eXBlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJwYXR0ZXJuIGZhY2V0cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sI3RhZGRyZWciIHRpdGxlPSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImF0dHJpYnV0ZXMgZ3JvdXBzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhZ3JwLmh0bWwjdGFkZGFncnAiIHRpdGxlPSJBZGRpbmcgYXR0cmlidXRlIGdyb3VwcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb21wbGV4IHR5cGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRjbXh0Lmh0bWwjdGFkZGNteHQiIHRpdGxlPSJBZGRpbmcgY29tcGxleCB0eXBlcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJjb250ZW50IG1vZGVscyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkY21vZC5odG1sI3RhZGRjbW9kIiB0aXRsZT0iQWRkaW5nIGNvbnRlbnQgbW9kZWxzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImFuIGFueSBlbGVtZW50Ij4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRhbnllLmh0bWwjdGFkZGFueWUiIHRpdGxlPSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGVsbS5odG1sI3RhZGRlbG0iIHRpdGxlPSJBZGRpbmcgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZWxlbWVudCByZWZlcmVuY2VzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRlbG1yLmh0bWwjdGFkZGVsbXIiIHRpdGxlPSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdyb3VwIHJlZmVyZW5jZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGdycHIuaHRtbCN0YWRkZ3JwciIgdGl0bGU9IkFkZGluZyBncm91cCByZWZlcmVuY2VzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdsb2JhbCBhdHRyaWJ1dGVzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRnbGJhLmh0bWwjdGFkZGdsYmEiIHRpdGxlPSJBZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iZ2xvYmFsIGVsZW1lbnRzIj4KLSAgICAgIDxlbnRyeSBrZXl3b3JkPSJhZGRpbmciPgotICAgICAgICA8dG9waWMgaHJlZj0idG9waWNzL3RhZGRnbGVtLmh0bWwjdGFkZGdsZW0iIHRpdGxlPSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imdyb3VwcyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkZ3J1cC5odG1sI3RhZGRncnVwIiB0aXRsZT0iQWRkaW5nIGdyb3VwcyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJpbXBvcnQgZWxlbWVudHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZGltcHQuaHRtbCN0YWRkaW1wdCIgdGl0bGU9IkFkZGluZyBpbXBvcnQgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0iaW5jbHVkZSBlbGVtZW50cyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iYWRkaW5nIj4KLSAgICAgICAgPHRvcGljIGhyZWY9InRvcGljcy90YWRkaW5jbC5odG1sI3RhZGRpbmNsIiB0aXRsZT0iQWRkaW5nIGluY2x1ZGUgZWxlbWVudHMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icmVkZWZpbmUgZWxlbWVudHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJkZm4uaHRtbCN0YWRkcmRmbiIgdGl0bGU9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJzaW1wbGUgdHlwZXMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHNtcHQuaHRtbCN0YWRkc21wdCIgdGl0bGU9IkFkZGluZyBzaW1wbGUgdHlwZXMiLz4KLSAgICAgIDwvZW50cnk+Ci0gICAgPC9lbnRyeT4KLSAgICA8ZW50cnkga2V5d29yZD0icGF0dGVybiBmYWNldHMiPgotICAgICAgPGVudHJ5IGtleXdvcmQ9ImFkZGluZyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGFkZHJlZy5odG1sI3RhZGRyZWciIHRpdGxlPSJBZGRpbmcgcGF0dGVybiBmYWNldHMgdG8gc2ltcGxlIHR5cGVzIi8+Ci0gICAgICA8L2VudHJ5PgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9Imljb25zIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmh0bWwjcmljb25zIiB0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJkZWxldGluZyI+Ci0gICAgICA8ZW50cnkga2V5d29yZD0iY29tcG9uZW50cyI+Ci0gICAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdGRlbHNjbXAuaHRtbCN0ZGVsc2NtcCIgdGl0bGU9IkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50cyIvPgotICAgICAgPC9lbnRyeT4KLSAgICA8L2VudHJ5PgotICAgIDxlbnRyeSBrZXl3b3JkPSJyZWZlcmVudGlhbCBpbnRlZ3JpdHkiPgotICAgICAgPHRvcGljIGhyZWY9InRvcGljcy9ycmVmaW50Zy5odG1sI3JyZWZpbnRnIiB0aXRsZT0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIvPgotICAgIDwvZW50cnk+Ci0gICAgPGVudHJ5IGtleXdvcmQ9ImNsZWFuIHVwIGluIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnJlZmludGcuaHRtbCNycmVmaW50ZyIgdGl0bGU9IlJlZmVyZW50aWFsIGludGVncml0eSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0icmVmYWN0b3JpbmciPgotICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvdHJlZmFjdHJYU0QuaHRtbCNyZWZhY3RvcmluZyIgdGl0bGU9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiLz4KLSAgPC9lbnRyeT4KLSAgPGVudHJ5IGtleXdvcmQ9InJlbmFtaW5nIj4KLSAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJlZGl0aW5nIFhNTCBzY2hlbWFzIj4KLSAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJkZXBlbmRhbnQgYXJ0aWZhY3RzIj4KLSAgICA8dG9waWMgaHJlZj0idG9waWNzL3RyZWZhY3RyWFNELmh0bWwjcmVmYWN0b3JpbmciIHRpdGxlPSJSZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzIi8+Ci0gIDwvZW50cnk+Ci0gIDxlbnRyeSBrZXl3b3JkPSJJY29ucyI+Ci0gICAgPGVudHJ5IGtleXdvcmQ9IlhNTCBzY2hlbWEgZWRpdG9yIj4KLSAgICAgIDx0b3BpYyBocmVmPSJ0b3BpY3MvcnhzZGljb25zLmh0bWwjcmljb25zIiB0aXRsZT0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiLz4KLSAgICA8L2VudHJ5PgotICA8L2VudHJ5PgotICA8ZW50cnkga2V5d29yZD0iWE1MIG5hbWVzcGFjZXMiPgotICAgIDxlbnRyeSBrZXl3b3JkPSJvdmVydmlldyI+Ci0gICAgICA8dG9waWMgaHJlZj0idG9waWNzL3JubXNwYy5odG1sI3JubXNwYyIgdGl0bGU9IlhNTCBuYW1lc3BhY2VzIi8+Ci0gICAgPC9lbnRyeT4KLSAgPC9lbnRyeT4KLTwvaW5kZXg+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjFhMTFhMS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLVBsdWdpbi5uYW1lID0gWE1MIHNjaGVtYSBlZGl0b3IKLQotQnVuZGxlLVZlbmRvci4wID0gRWNsaXBzZS5vcmcKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvcGx1Z2luLnhtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjg3MzM5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci9wbHVnaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTw/ZWNsaXBzZSB2ZXJzaW9uPSIzLjAiPz4KLTw/TkxTIFRZUEU9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj8+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci08IS0tIFRoaXMgaXMgdGhlIHBsdWdpbiBmb3IgZGVjbGFyaW5nIHRoZSBoZWxwICAgICAgICAgLS0+Ci08IS0tIGNvbnRyaWJ1dGlvbnMgZm9yIHVzaW5nIHRoZSB0b29sLiAgICAgICAgICAgICAgICAgLS0+Ci08IS0tID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLS0+Ci0KLTxwbHVnaW4+Ci0KLTxleHRlbnNpb24gcG9pbnQ9Im9yZy5lY2xpcHNlLmhlbHAudG9jIj4KLSAgICA8dG9jIGZpbGU9IlhTRGVkaXRvcm1hcF90b2MueG1sIi8+Ci0gICAgICAKLTwvZXh0ZW5zaW9uPgotCi0JPGV4dGVuc2lvbiBwb2ludD0ib3JnLmVjbGlwc2UuaGVscC5pbmRleCI+Ci0gICAgICA8aW5kZXggZmlsZT0ib3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlcmluZGV4LnhtbCIvPgotPC9leHRlbnNpb24+Ci08L3BsdWdpbj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwYjFiZmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSBjb25jZXB0IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIENvbmNlcHQvL0VOIg0KLSAiY29uY2VwdC5kdGQiPg0KLTw/UHViIEluYz8+DQotPGNvbmNlcHQgaWQ9Indvcmtpbmd3aXRoeG1sc2NoZW1hcyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+V29ya2luZyB3aXRoIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08c2hvcnRkZXNjPlhNTCBzY2hlbWFzIGFyZSBhbiBYTUwgbGFuZ3VhZ2UgZm9yIGRlc2NyaWJpbmcgYW5kIGNvbnN0cmFpbmluZw0KLXRoZSBjb250ZW50IG9mIFhNTCBmaWxlcy48L3Nob3J0ZGVzYz4NCi08Y29uYm9keT4NCi08cD5UaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPjw/UHViIENhcmV0MT8+DQotPC9jb25ib2R5Pg0KLTxyZWxhdGVkLWxpbmtzPg0KLTxsaW5rIGhyZWY9InRjeG1sc2NoLmRpdGEiPjxsaW5rdGV4dD5DcmVhdGluZyBYTUwgc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InRpbXBzY2htLmRpdGEiPjxsaW5rdGV4dD5JbXBvcnRpbmcgWE1MIHNjaGVtYXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08bGluayBocmVmPSJ0bmF2c3JjLmRpdGEiPjxsaW5rdGV4dD5OYXZpZ2F0aW5nIFhNTCBzY2hlbWFzPC9saW5rdGV4dD48L2xpbms+DQotPGxpbmsgaHJlZj0idHJlZmFjdHJYU0QuZGl0YSI+PGxpbmt0ZXh0PlJlZmFjdG9yaW5nIGluIFhNTCBzY2hlbWFzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0idGVkdHByZWYuZGl0YSI+PGxpbmt0ZXh0PkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC9saW5rdGV4dD4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0icnhzZGljb25zLmRpdGEiPjxsaW5rdGV4dD5JY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvbGlua3RleHQ+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9InRkZWxzY21wLmRpdGEiPjxsaW5rdGV4dD5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L2xpbmt0ZXh0Pg0KLTwvbGluaz4NCi08bGluayBocmVmPSJ0dmR0c2NobS5kaXRhIj48bGlua3RleHQ+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvbGlua3RleHQ+PC9saW5rPg0KLTxsaW5rIGhyZWY9InJubXNwYy5kaXRhIj48bGlua3RleHQ+WE1MIG5hbWVzcGFjZXM8L2xpbmt0ZXh0PjwvbGluaz4NCi08L3JlbGF0ZWQtbGlua3M+DQotPC9jb25jZXB0Pg0KLTw/UHViICowMDAwMDAxMjY3Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N3b3JrWFNELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1ZjM1YjYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jd29ya1hTRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9ImNvbmNlcHQiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iV29ya2luZyB3aXRoIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlhNTCBzY2hlbWFzIGFyZSBhbiBYTUwgbGFuZ3VhZ2UgZm9yIGRlc2NyaWJpbmcgYW5kIGNvbnN0cmFpbmluZyB0aGUgY29udGVudCBvZiBYTUwgZmlsZXMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlhNTCBzY2hlbWFzIGFyZSBhbiBYTUwgbGFuZ3VhZ2UgZm9yIGRlc2NyaWJpbmcgYW5kIGNvbnN0cmFpbmluZyB0aGUgY29udGVudCBvZiBYTUwgZmlsZXMuIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0Y3htbHNjaC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0aW1wc2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0bmF2c3JjLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRyZWZhY3RyWFNELmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InRlZHRwcmVmLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9InJ4c2RpY29ucy5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0ZGVsc2NtcC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJ0dmR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJybm1zcGMuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ3b3JraW5nd2l0aHhtbHNjaGVtYXMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5Xb3JraW5nIHdpdGggWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9Indvcmtpbmd3aXRoeG1sc2NoZW1hcyI+PGEgbmFtZT0id29ya2luZ3dpdGh4bWxzY2hlbWFzIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5Xb3JraW5nIHdpdGggWE1MIHNjaGVtYXM8L2gxPgotCi0KLTxkaXY+PHA+WE1MIHNjaGVtYXMgYXJlIGFuIFhNTCBsYW5ndWFnZSBmb3IgZGVzY3JpYmluZyBhbmQgY29uc3RyYWluaW5nCi10aGUgY29udGVudCBvZiBYTUwgZmlsZXMuPC9wPgotCi08cD5UaGlzIHNlY3Rpb25zIGNvbnRhaW5zIGluZm9ybWF0aW9uIG9uIHRoZSBmb2xsb3dpbmc6PC9wPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9InRjeG1sc2NoLmh0bWwiIHRpdGxlPSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiI+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRpbXBzY2htLmh0bWwiIHRpdGxlPSJJZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggWE1MIHNjaGVtYSBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcgb2YgdGhlIFhNTCBzY2hlbWEuIj5JbXBvcnRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRuYXZzcmMuaHRtbCIgdGl0bGU9IldoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSBTb3VyY2UgdmlldywgeW91IGNhbiB1c2UgRjMgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBjbGlja2luZyBGMyB0byBqdW1wIHRvIHRoZSBpdGVtIGl0IHJlZmVycyB0by4iPk5hdmlnYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InRyZWZhY3RyWFNELmh0bWwiIHRpdGxlPSJXaXRoaW4gYW4gWE1MIFNjaGVtYSBmaWxlLCByZWZhY3RvcmluZyBhbGxvd3MgYXV0aG9ycyB0byBtYWtlIGEgc2luZ2xlIGFydGlmYWN0IGNoYW5nZSwgYW5kIGhhdmUgdGhhdCBjaGFuZ2UgaW1wbGVtZW50ZWQgdGhyb3VnaG91dCBhbGwgb3RoZXIgZGVwZW5kYW50IGFydGlmYWN0cy4iPlJlZmFjdG9yaW5nIGluIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0ZWR0cHJlZi5odG1sIiB0aXRsZT0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC4iPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJ0ZGVsc2NtcC5odG1sIiB0aXRsZT0iSWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwgeW91IGNhbiBkZWxldGUgdGhlbS4iPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0idHZkdHNjaG0uaHRtbCIgdGl0bGU9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIj5WYWxpZGF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxyZWYiPjxzdHJvbmc+UmVsYXRlZCByZWZlcmVuY2U8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0icnhzZGljb25zLmh0bWwiIHRpdGxlPSJUaGUgZm9sbG93aW5nIFhNTCBzY2hlbWEgZWRpdG9yIGljb25zIGFwcGVhciBpbiB0aGUgT3V0bGluZSwgRGVzaWduLCBhbmQgUHJvcGVydGllcyB2aWV3LiI+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3I8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9InJubXNwYy5odG1sIiB0aXRsZT0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iPlhNTCBuYW1lc3BhY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiNGFlNC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL2N4bWxzY2VkLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIGNvbmNlcHQgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgQ29uY2VwdC8vRU4iDQotICJjb25jZXB0LmR0ZCI+DQotPGNvbmNlcHQgaWQ9ImN4bWxzY2VkIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5YTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+WE1MIHNjaGVtYSBlZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywNCi1hbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWDw/UHViIENhcmV0MT8+TUwgc2NoZW1hcyBhcmUgYSBmb3JtYWwgc3BlY2lmaWNhdGlvbg0KLW9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsDQotYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4gPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPm92ZXJ2aWV3PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTxjb25ib2R5Pg0KLTxwPkEgc2NoZW1hIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGEgRFRELCBidXQgaXMgd3JpdHRlbiBpbiBYTUw7IGENCi1zY2hlbWEgYWxzbyBwcm92aWRlcyBmb3IgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGRhdGEgdHlwaW5nLCBpbmhlcml0YW5jZSwNCi1hbmQgcHJlc2VudGF0aW9uIHJ1bGVzLjwvcD4NCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgc2NoZW1hLCByZWZlciB0bzo8L3A+DQotPHVsPg0KLTxsaT4gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMC8iIHNjb3BlPSJleHRlcm5hbCI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvPC94cmVmPiA8L2xpPg0KLTxsaT4gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMS8iIHNjb3BlPSJleHRlcm5hbCI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEvPC94cmVmPiA8L2xpPg0KLTxsaT4gPHhyZWYgZm9ybWF0PSJodG1sIiBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8iIHNjb3BlPSJleHRlcm5hbCI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTIvPC94cmVmPiA8L2xpPg0KLTwvdWw+DQotPHA+VXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuOjwvcD4NCi08dWw+DQotPGxpPkNyZWF0ZSBhbmQgZGVsZXRlIFhNTCBzY2hlbWEgY29tcG9uZW50cyBzdWNoIGFzIGNvbXBsZXggdHlwZXMsIHNpbXBsZQ0KLXR5cGVzLCBlbGVtZW50cywgYXR0cmlidXRlcywgYXR0cmlidXRlIGdyb3VwcywgYW5kIGdyb3Vwcy48L2xpPg0KLTxsaT5FZGl0IFhNTCBzY2hlbWFzLjwvbGk+DQotPGxpPkltcG9ydCBleGlzdGluZyBYTUwgc2NoZW1hcyBmb3Igc3RydWN0dXJlZCB2aWV3aW5nLjwvbGk+DQotPC91bD4NCi08cD5UaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9uIGZyb20gdGhlIFczQyBXZWIgc2l0ZSBpcyB1c2VkIGZvciB2YWxpZGF0aW9uLjwvcD4NCi08c2VjdGlvbj48dGl0bGU+WE1MIHNjaGVtYSBlZGl0b3Igdmlld3MgLSBEZXNpZ24sIE91dGxpbmUsIFByb3BlcnRpZXMsIGFuZA0KLVNvdXJjZTwvdGl0bGU+VGhlcmUgYXJlIGZvdXIgbWFpbiB2aWV3cyB5b3UgY2FuIHdvcmsgd2l0aCBpbiB0aGUgWE1MIHNjaGVtYQ0KLWVkaXRvcjo8dWw+DQotPGxpPkRlc2lnbiAtIHRoZSBEZXNpZ24gdmlldyBwcm92aWRlcyBhIGdyYXBoaWNhbCB3YXkgdG8gZWRpdCB5b3VyIHNjaGVtYTwvbGk+DQotPGxpPk91dGxpbmUgLSB0aGUgT3V0bGluZSB2aWV3IHNob3dzIHlvdSB0aGUgbWFpbiBjb21wb25lbnRzIGluIHlvdXIgWE1MIHNjaGVtYS4NCi1Zb3UgY2FuIHVzZSB0aGlzIHZpZXcgdG8gYWRkIGFuZCByZW1vdmUgY2VydGFpbiBjb21wb25lbnRzLjwvbGk+DQotPGxpPlByb3BlcnRpZXMgLSB0aGUgUHJvcGVydGllcyB2aWV3IGVuYWJsZXMgeW91IHRvIGVkaXQgdGhlIHByb3BlcnRpZXMgb2YNCi15b3VyIFhNTCBzY2hlbWEgY29tcG9uZW50czwvbGk+DQotPGxpPlNvdXJjZSAtIHRoZSBTb3VyY2UgdmlldyBlbmFibGVzIHlvdSB0byBlZGl0IHlvdXIgc291cmNlIGNvZGUgZGlyZWN0bHk8L2xpPg0KLTwvdWw+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TdGF0dXMgb2YgdGhlIFhNTCBzY2hlbWE8L3RpdGxlPjxwPjwvcD48cD5UaHJlZSBzdGF0dXMgaW5kaWNhdG9ycw0KLWZvciB0aGUgc2NoZW1hIGFyZSBhdmFpbGFibGUuIFRoZXkgYXJlIGluIHRoZSBib3R0b20gcmlnaHQgY29ybmVyOjwvcD48dWw+DQotPGxpPiA8dWljb250cm9sPldyaXRhYmxlPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+UmVhZCBPbmx5PC91aWNvbnRyb2w+LiA8L2xpPg0KLTxsaT4gKFNvdXJjZSB2aWV3IG9ubHkpIDx1aWNvbnRyb2w+U21hcnQgSW5zZXJ0PC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+T3ZlcndyaXRlPC91aWNvbnRyb2w+Lg0KLVRvIHRvZ2dsZSBiZXR3ZWVuIHRoZXNlIG1vZGVzLCBwcmVzcyB0aGUgPHVpY29udHJvbD5JbnNlcnQ8L3VpY29udHJvbD4gYnV0dG9uDQotb24geW91ciBrZXlib2FyZC48L2xpPg0KLTxsaT4gPHVpY29udHJvbD5MaW5lPC91aWNvbnRyb2w+IGFuZCA8dWljb250cm9sPmNvbHVtbjwvdWljb250cm9sPiBudW1iZXIuIDwvbGk+DQotPC91bD48L3NlY3Rpb24+DQotPC9jb25ib2R5Pg0KLTwvY29uY2VwdD4NCi08P1B1YiAqMDAwMDAwMjg4Mz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9jeG1sc2NlZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjlhZDM5Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvY3htbHNjZWQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0iY29uY2VwdCIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIG92ZXJ2aWV3IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIG92ZXJ2aWV3IiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RjeG1sc2NoLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJjeG1sc2NlZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJjeG1sc2NlZCI+PGEgbmFtZT0iY3htbHNjZWQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPlhNTCBzY2hlbWEgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLAotYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uCi1vZiBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLAotYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4gPC9wPgotCi08cD5BIHNjaGVtYSBpcyBmdW5jdGlvbmFsbHkgZXF1aXZhbGVudCB0byBhIERURCwgYnV0IGlzIHdyaXR0ZW4gaW4gWE1MOyBhCi1zY2hlbWEgYWxzbyBwcm92aWRlcyBmb3IgZXh0ZW5kZWQgZnVuY3Rpb25hbGl0eSBzdWNoIGFzIGRhdGEgdHlwaW5nLCBpbmhlcml0YW5jZSwKLWFuZCBwcmVzZW50YXRpb24gcnVsZXMuPC9wPgotCi08cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgc2NoZW1hLCByZWZlciB0bzo8L3A+Ci0KLTx1bD4KLTxsaT4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvIiB0YXJnZXQ9Il9ibGFuayI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTAvPC9hPiA8L2xpPgotCi08bGk+IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLyIgdGFyZ2V0PSJfYmxhbmsiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xLzwvYT4gPC9saT4KLQotPGxpPiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi8iIHRhcmdldD0iX2JsYW5rIj5odHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMi88L2E+IDwvbGk+Ci0KLTwvdWw+Ci0KLTxwPlVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbjo8L3A+Ci0KLTx1bD4KLTxsaT5DcmVhdGUgYW5kIGRlbGV0ZSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgc3VjaCBhcyBjb21wbGV4IHR5cGVzLCBzaW1wbGUKLXR5cGVzLCBlbGVtZW50cywgYXR0cmlidXRlcywgYXR0cmlidXRlIGdyb3VwcywgYW5kIGdyb3Vwcy48L2xpPgotCi08bGk+RWRpdCBYTUwgc2NoZW1hcy48L2xpPgotCi08bGk+SW1wb3J0IGV4aXN0aW5nIFhNTCBzY2hlbWFzIGZvciBzdHJ1Y3R1cmVkIHZpZXdpbmcuPC9saT4KLQotPC91bD4KLQotPHA+VGhlIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbiBmcm9tIHRoZSBXM0MgV2ViIHNpdGUgaXMgdXNlZCBmb3IgdmFsaWRhdGlvbi48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5YTUwgc2NoZW1hIGVkaXRvciB2aWV3cyAtIERlc2lnbiwgT3V0bGluZSwgUHJvcGVydGllcywgYW5kCi1Tb3VyY2U8L2g0PlRoZXJlIGFyZSBmb3VyIG1haW4gdmlld3MgeW91IGNhbiB3b3JrIHdpdGggaW4gdGhlIFhNTCBzY2hlbWEKLWVkaXRvcjo8dWw+Ci08bGk+RGVzaWduIC0gdGhlIERlc2lnbiB2aWV3IHByb3ZpZGVzIGEgZ3JhcGhpY2FsIHdheSB0byBlZGl0IHlvdXIgc2NoZW1hPC9saT4KLQotPGxpPk91dGxpbmUgLSB0aGUgT3V0bGluZSB2aWV3IHNob3dzIHlvdSB0aGUgbWFpbiBjb21wb25lbnRzIGluIHlvdXIgWE1MIHNjaGVtYS4KLVlvdSBjYW4gdXNlIHRoaXMgdmlldyB0byBhZGQgYW5kIHJlbW92ZSBjZXJ0YWluIGNvbXBvbmVudHMuPC9saT4KLQotPGxpPlByb3BlcnRpZXMgLSB0aGUgUHJvcGVydGllcyB2aWV3IGVuYWJsZXMgeW91IHRvIGVkaXQgdGhlIHByb3BlcnRpZXMgb2YKLXlvdXIgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9saT4KLQotPGxpPlNvdXJjZSAtIHRoZSBTb3VyY2UgdmlldyBlbmFibGVzIHlvdSB0byBlZGl0IHlvdXIgc291cmNlIGNvZGUgZGlyZWN0bHk8L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TdGF0dXMgb2YgdGhlIFhNTCBzY2hlbWE8L2g0PjxwIC8+Ci08cD5UaHJlZSBzdGF0dXMgaW5kaWNhdG9ycwotZm9yIHRoZSBzY2hlbWEgYXJlIGF2YWlsYWJsZS4gVGhleSBhcmUgaW4gdGhlIGJvdHRvbSByaWdodCBjb3JuZXI6PC9wPgotPHVsPgotPGxpPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xcml0YWJsZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVhZCBPbmx5PC9zcGFuPi4gPC9saT4KLQotPGxpPiAoU291cmNlIHZpZXcgb25seSkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U21hcnQgSW5zZXJ0PC9zcGFuPiBvciA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdmVyd3JpdGU8L3NwYW4+LgotVG8gdG9nZ2xlIGJldHdlZW4gdGhlc2UgbW9kZXMsIHByZXNzIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5JbnNlcnQ8L3NwYW4+IGJ1dHRvbgotb24geW91ciBrZXlib2FyZC48L2xpPgotCi08bGk+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkxpbmU8L3NwYW4+IGFuZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5jb2x1bW48L3NwYW4+IG51bWJlci4gPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3htbHNjaC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcmxpbWl0YXRpb25zX3NsdXNoWFNELmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1MDI2MGQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlICBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBSZWZlcmVuY2UvL0VOIiAicmVmZXJlbmNlLmR0ZCI+DQotPHJlZmVyZW5jZSBpZD0icmxpbWl0YXRpb25zX3NsdXNoWFNEIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5MaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvcjwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+TGltaXRhdGlvbnMgb2YgWE1MIHNjaGVtYSBlZGl0b3I8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuPC9zaG9ydGRlc2M+DQotPHJlZmJvZHk+DQotPCEtLVVzZSB0aGlzIHRlbXBsYXRlIHRvIHNpbmdsZSBzb3VyY2UgdGhlIHJlYWRtZSBpbmZvcm1hdGlvbi4gIFRoZSBjb250ZW50IGZvciB0aGUgcmVhZG1lIGluZm9ybWF0aW9uIGlzIG1haW50YWluZWQgaW4gdGhpcyB0b3BpYyBhbmQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgcmVsYXRlZCB0b3BpYyB1c2luZyB0aGUgY29ucmVmIGF0dHJpYnV0ZS4gVGhpcyBmaWxlIHdpbGwgbm90IGJlIHN1cmZhY2VkIGluIHlvdXIgbmF2aWdhdGlvbi4tLT4NCi08c2VjdGlvbj48dGl0bGU+SGVicmV3IExvZ2ljYWwgZW5jb2Rpbmc8L3RpdGxlPjxwIGlkPSJlbmNvZGluZyI+PCEtLVRoZXJlIGlzIG5vIGRlZmVjdCBhc3NvY2lhdGVkIHdpdGggdGhpcyBlbnRyeS4gSXQgaXMgZnJvbSB0aGUgNS4xIHJlYWRtZS4tLT5XaGVuDQotSGVicmV3IExvZ2ljYWwgKElTTy04ODU5LTgtSSkgZW5jb2RpbmcgaXMgc2VsZWN0ZWQgYXMgYSBwcmVmZXJlbmNlIGZvciBlbmNvZGluZw0KLW9mIEhUTUwgZmlsZXMgKDxtZW51Y2FzY2FkZT48dWljb250cm9sPldpbmRvdzwvdWljb250cm9sPjx1aWNvbnRyb2w+UHJlZmVyZW5jZXM8L3VpY29udHJvbD4NCi08dWljb250cm9sPldlYiBhbmQgWE1MIEZpbGVzPC91aWNvbnRyb2w+PHVpY29udHJvbD5IVE1MIGZpbGVzPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4gaW4gdGhlICJXaGVuIGNyZWF0aW5nIGZpbGVzIiBzZWN0aW9uKSwgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbg0KLWZpbGVzIGdlbmVyYXRlZCBmcm9tIGFuIFhNTCBzY2hlbWEgZmlsZSB3aWxsIHN0aWxsIGhhdmUgYSBVVEYtOCBlbmNvZGluZy4NCi1UaGlzIGlzIGEga25vd24gcHJvYmxlbS48L3A+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybGltaXRhdGlvbnNfc2x1c2hYU0QuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE1Y2M1NC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JsaW1pdGF0aW9uc19zbHVzaFhTRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InJlZmVyZW5jZSIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJMaW1pdGF0aW9ucyBvZiBYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBrbm93biBwcm9kdWN0IGFzcGVjdCBsaW1pdGF0aW9ucyBhbmQgd29ya2Fyb3VuZHMuIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJsaW1pdGF0aW9uc19zbHVzaFhTRCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkxpbWl0YXRpb25zIG9mIFhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJybGltaXRhdGlvbnNfc2x1c2hYU0QiPjxhIG5hbWU9InJsaW1pdGF0aW9uc19zbHVzaFhTRCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+TGltaXRhdGlvbnMgb2YgWE1MIHNjaGVtYSBlZGl0b3I8L2gxPgotCi0KLQotPGRpdj48cD5UaGlzIHNlY3Rpb24gZGVzY3JpYmVzIGtub3duIHByb2R1Y3QgYXNwZWN0IGxpbWl0YXRpb25zIGFuZCB3b3JrYXJvdW5kcy48L3A+Ci0KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPkhlYnJldyBMb2dpY2FsIGVuY29kaW5nPC9oND48cCBpZD0icmxpbWl0YXRpb25zX3NsdXNoWFNEX19lbmNvZGluZyI+PGEgbmFtZT0icmxpbWl0YXRpb25zX3NsdXNoWFNEX19lbmNvZGluZyI+PCEtLSAtLT48L2E+V2hlbgotSGVicmV3IExvZ2ljYWwgKElTTy04ODU5LTgtSSkgZW5jb2RpbmcgaXMgc2VsZWN0ZWQgYXMgYSBwcmVmZXJlbmNlIGZvciBlbmNvZGluZwotb2YgSFRNTCBmaWxlcyAoPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5XaW5kb3c8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZmVyZW5jZXM8L3NwYW4+Ci0gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5XZWIgYW5kIFhNTCBGaWxlczwvc3Bhbj4gJmd0OyA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVE1MIGZpbGVzPC9zcGFuPgotPC9zcGFuPiBpbiB0aGUgIldoZW4gY3JlYXRpbmcgZmlsZXMiIHNlY3Rpb24pLCB0aGUgSFRNTCBkb2N1bWVudGF0aW9uCi1maWxlcyBnZW5lcmF0ZWQgZnJvbSBhbiBYTUwgc2NoZW1hIGZpbGUgd2lsbCBzdGlsbCBoYXZlIGEgVVRGLTggZW5jb2RpbmcuCi1UaGlzIGlzIGEga25vd24gcHJvYmxlbS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjM3ZTk4Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3Mvcm5tc3BjLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSByZWZlcmVuY2UgIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJybm1zcGMiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPlhNTCBuYW1lc3BhY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5YTUwgbmFtZXNwYWNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSQ0KLXJlZmVyZW5jZSwgd2hpY2ggYXJlIHVzZWQgaW4gWE1MIGRvY3VtZW50cyBhcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGUNCi1uYW1lcy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgbmFtZXNwYWNlczxpbmRleHRlcm0+b3ZlcnZpZXc8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHNlY3Rpb24+WE1MIG5hbWVzcGFjZXMgYXJlIGRlZmluZWQgYnkgYSBXM0MgcmVjb21tZW5kYXRpb24sIGRhdGluZyAxNCBKYW51YXJ5DQotMTk5OSwgY2FsbGVkIDx4cmVmIGZvcm1hdD0iaHRtbCIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy8iDQotc2NvcGU9ImV4dGVybmFsIj5OYW1lc3BhY2VzIGluIFhNTDwveHJlZj4uIFhNTCB0YWcgbmFtZXMgc2hvdWxkIGJlIGdsb2JhbGx5DQotdW5pcXVlLCBhcyB3ZWxsIGFzIHNob3J0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJbiBvcmRlciB0byByZXNvbHZlIHRoaXMNCi1jb25mbGljdCwgdGhlIFczQyBuYW1lc3BhY2UgcmVjb21tZW5kYXRpb24gZGVmaW5lcyBhbiBhdHRyaWJ1dGUgPGI+eG1sbnM8L2I+IHdoaWNoDQotY2FuIGFtZW5kIGFueSBYTUwgZWxlbWVudC4gSWYgaXQgaXMgcHJlc2VudCBpbiBhbiBlbGVtZW50LCBpdCBpZGVudGlmaWVzIHRoZQ0KLW5hbWVzcGFjZSBmb3IgdGhpcyBlbGVtZW50Ljwvc2VjdGlvbj4NCi08c2VjdGlvbj48cD5UaGUgeG1sbnMgYXR0cmlidXRlIGhhcyB0aGUgZm9sbG93aW5nIHN5bnRheDo8L3A+PHA+PGNvZGVwaD54bWxuczo8dmFybmFtZT5wcmVmaXg8L3Zhcm5hbWU+PW5hbWVzcGFjZTwvY29kZXBoPiA8L3A+PHA+d2hlcmUgPGNvZGVwaD5uYW1lc3BhY2U8L2NvZGVwaA0KLT4gaXMgYSB1bmlxdWUgVVJJIChzdWNoIGFzIHd3dy5pYm0uY29tKSBhbmQgd2hlcmUgPGNvZGVwaD48dmFybmFtZT5wcmVmaXg8L3Zhcm5hbWU+PC9jb2RlcGg+IHJlcHJlc2VudHMNCi10aGUgbmFtZXNwYWNlIGFuZCBwcm92aWRlcyBhIHBvaW50ZXIgdG8gaXQuPC9wPjxwPkluIHRoZSBmb2xsb3dpbmcgY3VzdG9tZXINCi1lbGVtZW50IGRlZmluaXRpb24sIGFuIGFjY291bnRpbmcgbmFtZXNwYWNlIGlzIGRlZmluZWQgaW4gb3JkZXIgdG8gYmUgYWJsZQ0KLXRvIGRpc3Rpbmd1aXNoIHRoZSBlbGVtZW50IHRhZ3MgZnJvbSB0aG9zZSBhcHBlYXJpbmcgaW4gY3VzdG9tZXIgcmVjb3JkcyBjcmVhdGVkDQotYnkgb3RoZXIgYnVzaW5lc3MgYXBwbGljYXRpb25zOjwvcD48cD48Y29kZWJsb2NrPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zOmFjY3Q9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAiPg0KLQkmbHQ7YWNjdDpuYW1lPkNvcnBvcmF0aW9uJmx0Oy9hY2N0Om5hbWU+DQotCSZsdDthY2N0Om9yZGVyIGFjY3Q6cmVmPSI1NTY2Ii8+DQotCSZsdDthY2N0OnN0YXR1cz5pbnZvaWNlJmx0Oy9hY2N0OnN0YXR1cz4NCi0mbHQ7L2FjY3Q6Y3VzdG9tZXI+ICA8L2NvZGVibG9jaz4gPC9wPjxwPlRoZSA8aT5uYW1lc3BhY2UgZGVmaW5pdGlvbjwvaT4gaW4NCi10aGUgZmlyc3QgbGluZSBhc3NpZ25zIHRoZSBuYW1lc3BhY2UgPGk+aHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMDwvaT4gdG8NCi10aGUgcHJlZml4LiBUaGlzIHByZWZpeCBpcyB1c2VkIG9uIHRoZSBlbGVtZW50IG5hbWVzIHN1Y2ggYXMgbmFtZSBpbiBvcmRlcg0KLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBuYW1lc3BhY2UuIEEgc2Vjb25kIGFwcGxpY2F0aW9uLCBmb3IgZXhhbXBsZSwgYSBmdWxmaWxsbWVudA0KLXN5c3RlbSwgY2FuIGFzc2lnbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdG8gaXRzIGN1c3RvbWVyIGVsZW1lbnRzOjwvcD48cD48Y29kZWJsb2NrPiZsdDtmdWw6Y3VzdG9tZXIgeG1sbnM6ZnVsPSJodHRwOi8vd3d3LnlvdXIuY29tL2Z1bCI+DQotCSZsdDtmdWw6bmFtZT5Db3Jwb3JhdGlvbiZsdDsvZnVsOm5hbWU+DQotCSZsdDtmdWw6b3JkZXIgZnVsOnJlZj0iQTk4NzU2Ii8+DQotCSZsdDtmdWw6c3RhdHVzPnNoaXBwZWQmbHQ7L2Z1bDpzdGF0dXM+DQotICZsdDsvZnVsOmN1c3RvbWVyPjwvY29kZWJsb2NrPiA8L3A+PHA+QW4gYXBwbGljYXRpb24gcHJvY2Vzc2luZyBib3RoIGRhdGENCi1zdHJ1Y3R1cmVzIGlzIG5vdyBhYmxlIHRvIHRyZWF0IHRoZSBhY2NvdW50aW5nIGFuZCB0aGUgZnVsZmlsbG1lbnQgZGF0YSBkaWZmZXJlbnRseS4NCi1UaGVyZSBpcyBhIGRlZmF1bHQgbmFtZXNwYWNlLiBJdCBpcyBzZXQgaWYgbm8gbG9jYWwgbmFtZSBpcyBhc3NpZ25lZCBpbiB0aGUNCi1uYW1lc3BhY2UgZGVmaW5pdGlvbjo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7YWNjdDpjdXN0b21lciB4bWxucz0iaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCIgeG1sbnM6YWNjdD0iaHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMCAiPg0KLSZsdDtuYW1lPkNvcnBvcmF0aW9uJmx0Oy9uYW1lPg0KLSZsdDtvcmRlciBhY2N0OnJlZj0iNTU2NiIvPg0KLSZsdDtzdGF0dXM+aW52b2ljZSZsdDsvc3RhdHVzPg0KLSZsdDsvY3VzdG9tZXI+PC9jb2RlYmxvY2s+PC9wPjxwPkluIHRoaXMgZXhhbXBsZSwgYWxsIHRhZ3MgaW4gdGhlIGN1c3RvbWVyDQotcmVjb3JkIGFyZSBxdWFsaWZpZWQgdG8gcmVzaWRlIGluIHRoZSBuYW1lc3BhY2UgPGk+aHR0cDovL3d3dy5teS5jb20vYWNjdC1SRVYxMC48L2k+IE5vDQotZXhwbGljaXQgcHJlZml4IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBpcyB1c2VkLiBOb3RlIHRoYXQNCi10aGUgZGVmYXVsdCBuYW1lc3BhY2UgYXBwbGllcyB0byBhbnkgYXR0cmlidXRlcyBkZWZpbml0aW9ucy48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5YTUwgc2NoZW1hcyBhbmQgbmFtZXNwYWNlczwvdGl0bGU+PHA+SW4gdGhlIGZvbGxvd2luZyBYTUwNCi1zY2hlbWEsIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSBmb3IgdGhlIHNjaGVtYSBpcyBkZWZpbmVkIGFzIHRoZSBzdGFuZGFyZCBYTUwNCi1zY2hlbWEgbmFtZXNwYWNlIDxpPmh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW08L2k+YTsgdGhlcmUgaXMgYWxzbyBhDQotc2NoZW1hIHNwZWNpZmljIG5hbWVzcGFjZSA8aT5odHRwOi8vd3d3LmlibS5jb208L2k+LjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDtzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6VGVzdFNjaGVtYT0iaHR0cDovL3d3dy5pYm0uY29tIj4NCi0gJmx0O3NpbXBsZVR5cGUgbmFtZT0iWmlwQ29kZVR5cGUiPg0KLSAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0iaW50ZWdlciI+DQotICAmbHQ7bWluSW5jbHVzaXZlIHZhbHVlPSIxMDAwMCIvPg0KLSAmbHQ7bWF4SW5jbHVzaXZlIHZhbHVlPSI5OTk5OSIvPg0KLSZsdDsvcmVzdHJpY3Rpb24+DQotICZsdDsvc2ltcGxlVHlwZT4gDQotICZsdDshLS1lbGVtZW50IGRlZmluaXRpb25zIHNraXBwZWQgLS0+ICANCi0mbHQ7L3NjaGVtYT4gIDwvY29kZWJsb2NrPjwvcD48cD5Bc3N1bWluZyB0aGF0IHRoZSBwcmVjZWRpbmcgWE1MIHNjaGVtYSBpcw0KLXNhdmVkIGFzIDxmaWxlcGF0aD5DOlx0ZW1wXFRlc3RTY2hlbWEueHNkPC9maWxlcGF0aD4sIGEgc2FtcGxlIFhNTCBmaWxlIHRoYXQNCi12YWxpZGF0ZXMgYWdhaW5zdCB0aGlzIHNjaGVtYSBpczo8L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7eDphZGRyZXNzTGlzdCB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiPg0KLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiPg0KLSZsdDt4OmFkZHJlc3M+DQotICZsdDt4OnN0cmVldD54OlZhbmdlcm93c3RyYXNzZSZsdDsveDpzdHJlZXQ+DQotICAmbHQ7eDp6aXBDb2RlPjY5MTE1Jmx0Oy94OnppcENvZGU+DQotICZsdDt4OmNpdHk+eDpIZWlkZWxiZXJnJmx0Oy94OmNpdHk+DQotICZsdDsveDphZGRyZXNzPg0KLSAgICAmbHQ7eDphZGRyZXNzPiANCi0mbHQ7eDpzdHJlZXQ+eDpCZXJuYWwgUm9hZCZsdDsveDpzdHJlZXQ+IA0KLSZsdDt4OnppcENvZGU+OTAzNzUmbHQ7L3g6emlwQ29kZT4NCi0gICAgICZsdDt4OmNpdHk+eDpTYW4gSm9zZSZsdDsveDpjaXR5Pg0KLSAmbHQ7L3g6YWRkcmVzcz4NCi0mbHQ7L3g6YWRkcmVzc0xpc3Q+IDwvY29kZWJsb2NrPjwvcD48L3NlY3Rpb24+DQotPHNlY3Rpb24+PHRpdGxlPlRhcmdldCBuYW1lc3BhY2U8L3RpdGxlPjxwPiBUaGUgdGFyZ2V0IG5hbWVzcGFjZSBzZXJ2ZXMgdG8NCi1pZGVudGlmeSB0aGUgbmFtZXNwYWNlIHdpdGhpbiB3aGljaCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZWxlbWVudCBhbmQNCi1pdHMgbmFtZSBleGlzdHMuIEluIHRoZSBjYXNlIG9mIGRlY2xhcmF0aW9ucywgdGhpcyBhc3NvY2lhdGlvbiBkZXRlcm1pbmVzDQotdGhlIG5hbWVzcGFjZSBvZiB0aGUgZWxlbWVudHMgaW4gWE1MIGZpbGVzIGNvbmZvcm1pbmcgdG8gdGhlIHNjaGVtYS4gQW4gWE1MDQotZmlsZSBpbXBvcnRpbmcgYSBzY2hlbWEgbXVzdCByZWZlcmVuY2UgaXRzIHRhcmdldCBuYW1lc3BhY2UgaW4gdGhlIHNjaGVtYUxvY2F0aW9uDQotYXR0cmlidXRlLiBBbnkgbWlzbWF0Y2hlcyBiZXR3ZWVuIHRoZSB0YXJnZXQgYW5kIHRoZSBhY3R1YWwgbmFtZXNwYWNlIG9mIGFuDQotZWxlbWVudCBhcmUgcmVwb3J0ZWQgYXMgc2NoZW1hIHZhbGlkYXRpb24gZXJyb3JzLiBJbiBvdXIgZXhhbXBsZSwgdGhlIHRhcmdldA0KLW5hbWVzcGFjZSBpcyBodHRwOi8vd3d3LmlibS5jb207IGl0IGlzIGRlZmluZWQgaW4gdGhlICBYTUwgc2NoZW1hIGZpbGUgYW5kDQotcmVmZXJlbmNlZCB0d2ljZSBpbiB0aGUgWE1MIGZpbGUuIEFueSBtaXNtYXRjaCBiZXR3ZWVuIHRoZXNlIHRocmVlIG9jY3VycmVuY2VzDQotb2YgdGhlIG5hbWVzcGFjZSBsZWFkIHRvIHZhbGlkYXRpb24gZXJyb3JzLjwvcD48cD4gVGhlIGZvbGxvd2luZyBleGFtcGxlcw0KLXNob3cgaG93IHRhcmdldCBuYW1lc3BhY2VzIGFuZCBuYW1lc3BhY2UgcHJlZml4ZXMgd29yayBpbiBYTUwgc2NoZW1hcyBhbmQNCi10aGVpciBjb3JyZXNwb25kaW5nIFhNTCBpbnN0YW5jZSBkb2N1bWVudHMuPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2FtcGxlIDEgLSBBIHNjaGVtYSB3aXRoIGJvdGggYSBkZWZhdWx0IGFuZCB0YXJnZXQgbmFtZXNwYWNlDQotYW5kIHVucXVhbGlmaWVkIGxvY2FsczwvdGl0bGU+PHA+VGhlIFhNTCBzY2hlbWE6ICA8L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSI+DQotJmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIj4NCi0mbHQ7c2VxdWVuY2U+DQotJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIj4mbHQ7L2VsZW1lbnQ+DQotJmx0Oy9zZXF1ZW5jZT4NCi0mbHQ7L2NvbXBsZXhUeXBlPg0KLSZsdDtlbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0ieDpBZGRyZXNzVHlwZSI+Jmx0Oy9lbGVtZW50Pg0KLSZsdDsvc2NoZW1hPiA8L2NvZGVibG9jaz4gPC9wPjxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQgZnJvbQ0KLXRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIDxpPnVucXVhbGlmaWVkPC9pPi48L3A+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiPg0KLSZsdDtuYW1lPlBldGVyIFNtaXRoJmx0Oy9uYW1lPg0KLSZsdDsveDpNeUFkZHJlc3M+IDwvY29kZWJsb2NrPjwvcD48cD5XaGVuIGxvY2FsIGVsZW1lbnRzIChzdWNoIGFzIHRoZSA8aT4ibmFtZSI8L2k+IGVsZW1lbnQpDQotYW5kIGF0dHJpYnV0ZXMgYXJlIHVucXVhbGlmaWVkIGluIGFuIFhNTCBmaWxlLCB0aGVuIG9ubHkgdGhlIHJvb3QgZWxlbWVudA0KLWlzIHF1YWxpZmllZC4gU28sIGluIHRoaXMgZXhhbXBsZSwgdGhlIDxpPiJ4IjwvaT4gbmFtZXNwYWNlIHByZWZpeCBpcyBhc3NpZ25lZA0KLXRvIHRoZSByb290IGVsZW1lbnQgPGk+Ik15QWRkcmVzcyI8L2k+LCBhc3NvY2lhdGluZyBpdCB3aXRoIHRoZSBuYW1lc3BhY2UgPGk+Imh0dHA6Ly93d3cuaWJtLmNvbSIsPC9pPiBidXQNCi10aGU8aT4ieCI8L2k+IHByZWZpeCBpcyBub3QgYXNzaWduZWQgdG8gdGhlIGxvY2FsIGVsZW1lbnQgPGk+Im5hbWUiPC9pPi48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgMiAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldCBuYW1lc3BhY2UNCi1hbmQgcXVhbGlmaWVkIGxvY2FsczwvdGl0bGU+PHA+PGNvZGVibG9jaz4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4NCi0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiPg0KLSZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3NlcXVlbmNlPg0KLSZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+Jmx0Oy9lbGVtZW50Pg0KLSZsdDsvc2VxdWVuY2U+DQotJmx0Oy9jb21wbGV4VHlwZT4NCi0mbHQ7ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiPiZsdDsvZWxlbWVudD4NCi0gJmx0Oy9zY2hlbWE+ICA8L2NvZGVibG9jaz48L3A+PHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tDQotdGhpcyBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBMb2NhbCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcyBhcmUgPGk+cXVhbGlmaWVkPC9pPiBUaGlzDQotaXMgYmVjYXVzZSB0aGUgZWxlbWVudEZvcm1EZWZhdWx0IGF0dHJpYnV0ZSBpcyBzZXQgdG8gcXVhbGlmaWVkIGluIHRoZSBYTUwNCi1zY2hlbWEuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotICAmbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiPiANCi0mbHQ7eDpuYW1lPlBldGVyIFNtaXRoJmx0Oy94Om5hbWU+DQotICZsdDsveDpNeUFkZHJlc3M+PC9jb2RlYmxvY2s+IDwvcD48cD5JbiB0aGlzIGV4YW1wbGUsIHRoZSA8aT4ieCI8L2k+IG5hbWVzcGFjZQ0KLXByZWZpeCBpcyBhc3NpZ25lZCB0byBib3RoIHRoZSByb290IGVsZW1lbnQgPGk+Ik15QWRkcmVzcyI8L2k+IGFuZCB0aGUgbG9jYWwNCi1lbGVtZW50IDxpPiJuYW1lIjwvaT4sIGFzc29jaWF0aW5nIHRoZW0gd2l0aCB0aGUgbmFtZXNwYWNlIDxpPiJodHRwOi8vd3d3LmlibS5jb20iLDwvaT4uPC9wPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+U2FtcGxlIDMgLSBTY2hlbWEgd2l0aCB0YXJnZXQgTmFtZXNwYWNlLCBhbmQgZXhwbGljaXRseSBkZWZpbmVzDQoteG1sbnM6eHNkPC90aXRsZT48cD5UaGlzIFhNTCBzY2hlbWEgYWRkcyB0aGlzIGF0dHJpYnV0ZTogIDwvcD48Y29kZXBoPnhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEgPC9jb2RlcGg+PHA+V2hhdA0KLXRoaXMgbWVhbnMgaXMgdGhhdCBlYWNoIG9mIHRoZSBjb25zdHJ1Y3RzIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlIFhNTCBzY2hlbWENCi1sYW5ndWFnZSB3aWxsIG5lZWQgdG8gYmUgcXVhbGlmaWVkIHdpdGggdGhlIDx2YXJuYW1lPiJ4c2QiPC92YXJuYW1lPiBwcmVmaXguDQotRm9yIGV4YW1wbGUsIHhzZDpjb21wbGV4VHlwZSBhbmQgIHhzZDpzdHJpbmc8L3A+PHA+LiBOb3RlIHRoYXQgeW91IGNhbiBjaG9zZQ0KLWFueSBvdGhlciBwcmVmaXhlcyBzdWNoIGFzIDx2YXJuYW1lPiJ4cyI8L3Zhcm5hbWU+IG9yIDx2YXJuYW1lPiJmb29iYXIiPC92YXJuYW1lPiBpbg0KLXlvdXIgZGVjbGFyYXRpb24gYW5kIHVzYWdlLjwvcD48cD5Zb3UgY2FuIHNwZWNpZnkgdGhpcyBwcmVmaXggaW4gdGhlIFhNTCBzY2hlbWENCi1wcmVmZXJlbmNlcyBwYWdlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wPjxwPkFsbA0KLXVzZXIgZGVmaW5lZCB0eXBlcyBiZWxvbmcgdG8gdGhlIG5hbWVzcGFjZSAgaHR0cDovL3d3dy5pYm0uY29tIGFzIGRlZmluZWQNCi1ieSB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSwgYW5kIHRoZSBwcmVmaXggaXMgPGk+IngiPC9pPiBhcyBkZWZpbmVkDQotYnkgdGhlIHhtbG5zOnggYXR0cmlidXRlLjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Pg0KLSZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iPg0KLSZsdDt4c2Q6Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiPg0KLSZsdDt4c2Q6c2VxdWVuY2U+DQotCQkgJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciPiZsdDsveHNkOmVsZW1lbnQ+DQotJmx0Oy94c2Q6c2VxdWVuY2U+DQotICZsdDsveHNkOmNvbXBsZXhUeXBlPg0KLSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSZsdDsveHNkOnNjaGVtYT48L2NvZGVibG9jaz4gPC9wPjxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQNCi1mcm9tIHRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIDxpPnVucXVhbGlmaWVkPC9pPi4NCi1UaGUgc2VtYW50aWNzIG9mIHF1YWxpZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgU2FtcGxlIDEuPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotICZsdDt4Ok15QWRkcmVzcyB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UieHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIj4NCi0mbHQ7bmFtZT5QZXRlciBTbWl0aCZsdDsvbmFtZT4NCi0gJmx0Oy94Ok15QWRkcmVzcz48L2NvZGVibG9jaz48L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgNCAtIFNjaGVtYSB3aXRoIHVuZGVjbGFyZWQgdGFyZ2V0IE5hbWVzcGFjZSB0aGF0IGV4cGxpY2l0bHkNCi1kZWZpbmVzIHhtbG5zOnhzZDwvdGl0bGU+PHA+VGhpcyBYTUwgc2NoZW1hIGhhcyBubyB0YXJnZXQgbmFtZXNwYWNlIGZvciBpdHNlbGYuDQotSW4gdGhpcyBjYXNlLCBpdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCBhbGwgWE1MIHNjaGVtYSBjb25zdHJ1Y3RzIGJlIGV4cGxpY2l0bHkNCi1xdWFsaWZpZWQgd2l0aCBhIHByZWZpeCBzdWNoIGFzIDxpPiJ4c2QiPC9pPi4gVGhlIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMNCi1mcm9tIHRoaXMgc2NoZW1hIHN1Y2ggYXMgPGk+QWRkcmVzc1R5cGU8L2k+IGFyZSByZWZlcmVuY2VkIHdpdGhvdXQgbmFtZXNwYWNlDQotcXVhbGlmaWNhdGlvbiBzaW5jZSB0aGVyZSBpcyBubyBuYW1lc3BhY2UgcHJlZml4LiAgPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+DQotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSI+DQotJmx0O3hzZDpzZXF1ZW5jZT4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyI+Jmx0Oy94c2Q6ZWxlbWVudD4gDQotJmx0Oy94c2Q6c2VxdWVuY2U+IA0KLSZsdDsveHNkOmNvbXBsZXhUeXBlPg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9IkFkZHJlc3NUeXBlIj4mbHQ7L3hzZDplbGVtZW50PiANCi0mbHQ7L3hzZDpzY2hlbWE+IDwvY29kZWJsb2NrPjwvcD48cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkDQotZnJvbSB0aGUgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gQWxsIGVsZW1lbnRzIGFyZSA8aT51bnF1YWxpZmllZDwvaT4uPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotJmx0O015QWRkcmVzcyB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0ieC54c2QiPg0KLSZsdDtuYW1lPm5hbWUmbHQ7L25hbWU+DQotJmx0Oy9NeUFkZHJlc3M+PC9jb2RlYmxvY2s+ICA8L3A+PC9zZWN0aW9uPg0KLTxzZWN0aW9uPjx0aXRsZT5TYW1wbGUgNSAtIEEgc2NoZW1hIHdoZXJlIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIHRoZSBkZWZhdWx0DQotbmFtZXNwYWNlPC90aXRsZT48cD5UaGlzIGlzIGFuIFhNTCBzY2hlbWEgd2hlcmUgdGhlIHRhcmdldCBuYW1lc3BhY2UgaXMgdGhlDQotZGVmYXVsdCBuYW1lc3BhY2UuIEFzIHdlbGwsIHRoZSBuYW1lc3BhY2UgaGFzIG5vIG5hbWVzcGFjZSBwcmVmaXguPC9wPjxwPjxjb2RlYmxvY2s+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8+DQotICZsdDt4c2Q6c2NoZW1hIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIj4NCi0mbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIj4NCi0mbHQ7eHNkOnNlcXVlbmNlPg0KLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIj4mbHQ7L3hzZDplbGVtZW50Pg0KLSZsdDsveHNkOnNlcXVlbmNlPg0KLSZsdDsveHNkOmNvbXBsZXhUeXBlPg0KLSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJBZGRyZXNzVHlwZSI+Jmx0Oy94c2Q6ZWxlbWVudD4NCi0gJmx0Oy94c2Q6c2NoZW1hPiA8L2NvZGVibG9jaz4gPC9wPjxwPkEgdmFsaWQgWE1MIGluc3RhbmNlIGRvY3VtZW50IGNyZWF0ZWQNCi1mcm9tIHRoZSBzY2hlbWEgbG9va3MgbGlrZSB0aGlzOjwvcD48cD48Y29kZWJsb2NrPiZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotJmx0O015QWRkcmVzcyB4bWxucz0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBOZXdYTUxTY2hlbWEueHNkIj4NCi0mbHQ7bmFtZT5uYW1lJmx0Oy9uYW1lPg0KLSAmbHQ7L015QWRkcmVzcz4gIDwvY29kZWJsb2NrPiA8L3A+PC9zZWN0aW9uPg0KLTwvcmVmYm9keT4NCi08L3JlZmVyZW5jZT4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ybm1zcGMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRhMGI0Zi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JubXNwYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iWE1MIG5hbWVzcGFjZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQW4gWE1MIG5hbWVzcGFjZSBpcyBhIGNvbGxlY3Rpb24gb2YgbmFtZXMsIGlkZW50aWZpZWQgYnkgYSBVUkkgcmVmZXJlbmNlLCB3aGljaCBhcmUgdXNlZCBpbiBYTUwgZG9jdW1lbnRzIGFzIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZSBuYW1lcy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgbmFtZXNwYWNlcywgb3ZlcnZpZXciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgbmFtZXNwYWNlcywgb3ZlcnZpZXciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InJubXNwYyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlhNTCBuYW1lc3BhY2VzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJybm1zcGMiPjxhIG5hbWU9InJubXNwYyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+WE1MIG5hbWVzcGFjZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVVJJCi1yZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlCi1uYW1lcy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlhNTCBuYW1lc3BhY2VzIGFyZSBkZWZpbmVkIGJ5IGEgVzNDIHJlY29tbWVuZGF0aW9uLCBkYXRpbmcgMTQgSmFudWFyeQotMTk5OSwgY2FsbGVkIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwtbmFtZXMvIiB0YXJnZXQ9Il9ibGFuayI+TmFtZXNwYWNlcyBpbiBYTUw8L2E+LiBYTUwgdGFnIG5hbWVzIHNob3VsZCBiZSBnbG9iYWxseQotdW5pcXVlLCBhcyB3ZWxsIGFzIHNob3J0IGZvciBwZXJmb3JtYW5jZSByZWFzb25zLiBJbiBvcmRlciB0byByZXNvbHZlIHRoaXMKLWNvbmZsaWN0LCB0aGUgVzNDIG5hbWVzcGFjZSByZWNvbW1lbmRhdGlvbiBkZWZpbmVzIGFuIGF0dHJpYnV0ZSA8c3Ryb25nPnhtbG5zPC9zdHJvbmc+IHdoaWNoCi1jYW4gYW1lbmQgYW55IFhNTCBlbGVtZW50LiBJZiBpdCBpcyBwcmVzZW50IGluIGFuIGVsZW1lbnQsIGl0IGlkZW50aWZpZXMgdGhlCi1uYW1lc3BhY2UgZm9yIHRoaXMgZWxlbWVudC48L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIHhtbG5zIGF0dHJpYnV0ZSBoYXMgdGhlIGZvbGxvd2luZyBzeW50YXg6PC9wPgotPHA+PHNhbXAgY2xhc3M9ImNvZGVwaCI+eG1sbnM6PHZhciBjbGFzcz0idmFybmFtZSI+cHJlZml4PC92YXI+PW5hbWVzcGFjZTwvc2FtcD4gPC9wPgotPHA+d2hlcmUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+bmFtZXNwYWNlPC9zYW1wPiBpcyBhIHVuaXF1ZSBVUkkgKHN1Y2ggYXMgd3d3LmlibS5jb20pIGFuZCB3aGVyZSA8c2FtcCBjbGFzcz0iY29kZXBoIj48dmFyIGNsYXNzPSJ2YXJuYW1lIj5wcmVmaXg8L3Zhcj48L3NhbXA+IHJlcHJlc2VudHMKLXRoZSBuYW1lc3BhY2UgYW5kIHByb3ZpZGVzIGEgcG9pbnRlciB0byBpdC48L3A+Ci08cD5JbiB0aGUgZm9sbG93aW5nIGN1c3RvbWVyCi1lbGVtZW50IGRlZmluaXRpb24sIGFuIGFjY291bnRpbmcgbmFtZXNwYWNlIGlzIGRlZmluZWQgaW4gb3JkZXIgdG8gYmUgYWJsZQotdG8gZGlzdGluZ3Vpc2ggdGhlIGVsZW1lbnQgdGFncyBmcm9tIHRob3NlIGFwcGVhcmluZyBpbiBjdXN0b21lciByZWNvcmRzIGNyZWF0ZWQKLWJ5IG90aGVyIGJ1c2luZXNzIGFwcGxpY2F0aW9uczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zOmFjY3Q9Imh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAiJmd0OwotCSZsdDthY2N0Om5hbWUmZ3Q7Q29ycG9yYXRpb24mbHQ7L2FjY3Q6bmFtZSZndDsKLQkmbHQ7YWNjdDpvcmRlciBhY2N0OnJlZj0iNTU2NiIvJmd0OwotCSZsdDthY2N0OnN0YXR1cyZndDtpbnZvaWNlJmx0Oy9hY2N0OnN0YXR1cyZndDsKLSZsdDsvYWNjdDpjdXN0b21lciZndDsgIDwvcHJlPgotIDwvZGl2PgotPHA+VGhlIDxlbT5uYW1lc3BhY2UgZGVmaW5pdGlvbjwvZW0+IGluCi10aGUgZmlyc3QgbGluZSBhc3NpZ25zIHRoZSBuYW1lc3BhY2UgPGVtPmh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTA8L2VtPiB0bwotdGhlIHByZWZpeC4gVGhpcyBwcmVmaXggaXMgdXNlZCBvbiB0aGUgZWxlbWVudCBuYW1lcyBzdWNoIGFzIG5hbWUgaW4gb3JkZXIKLXRvIGF0dGFjaCB0aGVtIHRvIHRoZSBuYW1lc3BhY2UuIEEgc2Vjb25kIGFwcGxpY2F0aW9uLCBmb3IgZXhhbXBsZSwgYSBmdWxmaWxsbWVudAotc3lzdGVtLCBjYW4gYXNzaWduIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0byBpdHMgY3VzdG9tZXIgZWxlbWVudHM6PC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7ZnVsOmN1c3RvbWVyIHhtbG5zOmZ1bD0iaHR0cDovL3d3dy55b3VyLmNvbS9mdWwiJmd0OwotCSZsdDtmdWw6bmFtZSZndDtDb3Jwb3JhdGlvbiZsdDsvZnVsOm5hbWUmZ3Q7Ci0JJmx0O2Z1bDpvcmRlciBmdWw6cmVmPSJBOTg3NTYiLyZndDsKLQkmbHQ7ZnVsOnN0YXR1cyZndDtzaGlwcGVkJmx0Oy9mdWw6c3RhdHVzJmd0OwotICZsdDsvZnVsOmN1c3RvbWVyJmd0OzwvcHJlPgotIDwvZGl2PgotPHA+QW4gYXBwbGljYXRpb24gcHJvY2Vzc2luZyBib3RoIGRhdGEKLXN0cnVjdHVyZXMgaXMgbm93IGFibGUgdG8gdHJlYXQgdGhlIGFjY291bnRpbmcgYW5kIHRoZSBmdWxmaWxsbWVudCBkYXRhIGRpZmZlcmVudGx5LgotVGhlcmUgaXMgYSBkZWZhdWx0IG5hbWVzcGFjZS4gSXQgaXMgc2V0IGlmIG5vIGxvY2FsIG5hbWUgaXMgYXNzaWduZWQgaW4gdGhlCi1uYW1lc3BhY2UgZGVmaW5pdGlvbjo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDthY2N0OmN1c3RvbWVyIHhtbG5zPSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwIiB4bWxuczphY2N0PSJodHRwOi8vd3d3Lm15LmNvbS9hY2N0LVJFVjEwICImZ3Q7Ci0mbHQ7bmFtZSZndDtDb3Jwb3JhdGlvbiZsdDsvbmFtZSZndDsKLSZsdDtvcmRlciBhY2N0OnJlZj0iNTU2NiIvJmd0OwotJmx0O3N0YXR1cyZndDtpbnZvaWNlJmx0Oy9zdGF0dXMmZ3Q7Ci0mbHQ7L2N1c3RvbWVyJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5JbiB0aGlzIGV4YW1wbGUsIGFsbCB0YWdzIGluIHRoZSBjdXN0b21lcgotcmVjb3JkIGFyZSBxdWFsaWZpZWQgdG8gcmVzaWRlIGluIHRoZSBuYW1lc3BhY2UgPGVtPmh0dHA6Ly93d3cubXkuY29tL2FjY3QtUkVWMTAuPC9lbT4gTm8KLWV4cGxpY2l0IHByZWZpeCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgdXNlZC4gTm90ZSB0aGF0Ci10aGUgZGVmYXVsdCBuYW1lc3BhY2UgYXBwbGllcyB0byBhbnkgYXR0cmlidXRlcyBkZWZpbml0aW9ucy48L3A+Ci08L2Rpdj4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PGg0IGNsYXNzPSJzZWN0aW9udGl0bGUiPlhNTCBzY2hlbWFzIGFuZCBuYW1lc3BhY2VzPC9oND48cD5JbiB0aGUgZm9sbG93aW5nIFhNTAotc2NoZW1hLCB0aGUgZGVmYXVsdCBuYW1lc3BhY2UgZm9yIHRoZSBzY2hlbWEgaXMgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgWE1MCi1zY2hlbWEgbmFtZXNwYWNlIDxlbT5odHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtPC9lbT5hOyB0aGVyZSBpcyBhbHNvIGEKLXNjaGVtYSBzcGVjaWZpYyBuYW1lc3BhY2UgPGVtPmh0dHA6Ly93d3cuaWJtLmNvbTwvZW0+LjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOlRlc3RTY2hlbWE9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0gJmx0O3NpbXBsZVR5cGUgbmFtZT0iWmlwQ29kZVR5cGUiJmd0OwotICZsdDtyZXN0cmljdGlvbiBiYXNlPSJpbnRlZ2VyIiZndDsKLSAgJmx0O21pbkluY2x1c2l2ZSB2YWx1ZT0iMTAwMDAiLyZndDsKLSAmbHQ7bWF4SW5jbHVzaXZlIHZhbHVlPSI5OTk5OSIvJmd0OwotJmx0Oy9yZXN0cmljdGlvbiZndDsKLSAmbHQ7L3NpbXBsZVR5cGUmZ3Q7IAotICZsdDshLS1lbGVtZW50IGRlZmluaXRpb25zIHNraXBwZWQgLS0mZ3Q7ICAKLSZsdDsvc2NoZW1hJmd0OyAgPC9wcmU+Ci08L2Rpdj4KLTxwPkFzc3VtaW5nIHRoYXQgdGhlIHByZWNlZGluZyBYTUwgc2NoZW1hIGlzCi1zYXZlZCBhcyA8c3BhbiBjbGFzcz0iZmlsZXBhdGgiPkM6XHRlbXBcVGVzdFNjaGVtYS54c2Q8L3NwYW4+LCBhIHNhbXBsZSBYTUwgZmlsZSB0aGF0Ci12YWxpZGF0ZXMgYWdhaW5zdCB0aGlzIHNjaGVtYSBpczo8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3g6YWRkcmVzc0xpc3QgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gZmlsZTovLy9DOi90ZW1wL1Rlc3RTY2hlbWEueHNkIiZndDsKLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSBmaWxlOi8vL0M6L3RlbXAvVGVzdFNjaGVtYS54c2QiJmd0OwotJmx0O3g6YWRkcmVzcyZndDsKLSAmbHQ7eDpzdHJlZXQmZ3Q7eDpWYW5nZXJvd3N0cmFzc2UmbHQ7L3g6c3RyZWV0Jmd0OwotICAmbHQ7eDp6aXBDb2RlJmd0OzY5MTE1Jmx0Oy94OnppcENvZGUmZ3Q7Ci0gJmx0O3g6Y2l0eSZndDt4OkhlaWRlbGJlcmcmbHQ7L3g6Y2l0eSZndDsKLSAmbHQ7L3g6YWRkcmVzcyZndDsKLSAgICAmbHQ7eDphZGRyZXNzJmd0OyAKLSZsdDt4OnN0cmVldCZndDt4OkJlcm5hbCBSb2FkJmx0Oy94OnN0cmVldCZndDsgCi0mbHQ7eDp6aXBDb2RlJmd0OzkwMzc1Jmx0Oy94OnppcENvZGUmZ3Q7Ci0gICAgICZsdDt4OmNpdHkmZ3Q7eDpTYW4gSm9zZSZsdDsveDpjaXR5Jmd0OwotICZsdDsveDphZGRyZXNzJmd0OwotJmx0Oy94OmFkZHJlc3NMaXN0Jmd0OyA8L3ByZT4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5UYXJnZXQgbmFtZXNwYWNlPC9oND48cD4gVGhlIHRhcmdldCBuYW1lc3BhY2Ugc2VydmVzIHRvCi1pZGVudGlmeSB0aGUgbmFtZXNwYWNlIHdpdGhpbiB3aGljaCB0aGUgYXNzb2NpYXRpb24gYmV0d2VlbiB0aGUgZWxlbWVudCBhbmQKLWl0cyBuYW1lIGV4aXN0cy4gSW4gdGhlIGNhc2Ugb2YgZGVjbGFyYXRpb25zLCB0aGlzIGFzc29jaWF0aW9uIGRldGVybWluZXMKLXRoZSBuYW1lc3BhY2Ugb2YgdGhlIGVsZW1lbnRzIGluIFhNTCBmaWxlcyBjb25mb3JtaW5nIHRvIHRoZSBzY2hlbWEuIEFuIFhNTAotZmlsZSBpbXBvcnRpbmcgYSBzY2hlbWEgbXVzdCByZWZlcmVuY2UgaXRzIHRhcmdldCBuYW1lc3BhY2UgaW4gdGhlIHNjaGVtYUxvY2F0aW9uCi1hdHRyaWJ1dGUuIEFueSBtaXNtYXRjaGVzIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIGFjdHVhbCBuYW1lc3BhY2Ugb2YgYW4KLWVsZW1lbnQgYXJlIHJlcG9ydGVkIGFzIHNjaGVtYSB2YWxpZGF0aW9uIGVycm9ycy4gSW4gb3VyIGV4YW1wbGUsIHRoZSB0YXJnZXQKLW5hbWVzcGFjZSBpcyBodHRwOi8vd3d3LmlibS5jb207IGl0IGlzIGRlZmluZWQgaW4gdGhlICBYTUwgc2NoZW1hIGZpbGUgYW5kCi1yZWZlcmVuY2VkIHR3aWNlIGluIHRoZSBYTUwgZmlsZS4gQW55IG1pc21hdGNoIGJldHdlZW4gdGhlc2UgdGhyZWUgb2NjdXJyZW5jZXMKLW9mIHRoZSBuYW1lc3BhY2UgbGVhZCB0byB2YWxpZGF0aW9uIGVycm9ycy48L3A+Ci08cD4gVGhlIGZvbGxvd2luZyBleGFtcGxlcwotc2hvdyBob3cgdGFyZ2V0IG5hbWVzcGFjZXMgYW5kIG5hbWVzcGFjZSBwcmVmaXhlcyB3b3JrIGluIFhNTCBzY2hlbWFzIGFuZAotdGhlaXIgY29ycmVzcG9uZGluZyBYTUwgaW5zdGFuY2UgZG9jdW1lbnRzLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+U2FtcGxlIDEgLSBBIHNjaGVtYSB3aXRoIGJvdGggYSBkZWZhdWx0IGFuZCB0YXJnZXQgbmFtZXNwYWNlCi1hbmQgdW5xdWFsaWZpZWQgbG9jYWxzPC9oND48cD5UaGUgWE1MIHNjaGVtYTogIDwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7c2NoZW1hIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzc1R5cGUiJmd0OwotJmx0O3NlcXVlbmNlJmd0OwotJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7Ci0mbHQ7L3NlcXVlbmNlJmd0OwotJmx0Oy9jb21wbGV4VHlwZSZndDsKLSZsdDtlbGVtZW50IG5hbWU9Ik15QWRkcmVzcyIgdHlwZT0ieDpBZGRyZXNzVHlwZSImZ3Q7Jmx0Oy9lbGVtZW50Jmd0OwotJmx0Oy9zY2hlbWEmZ3Q7IDwvcHJlPgotIDwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tCi10aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSA8ZW0+dW5xdWFsaWZpZWQ8L2VtPi48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20geC54c2QgIiZndDsKLSZsdDtuYW1lJmd0O1BldGVyIFNtaXRoJmx0Oy9uYW1lJmd0OwotJmx0Oy94Ok15QWRkcmVzcyZndDsgPC9wcmU+Ci08L2Rpdj4KLTxwPldoZW4gbG9jYWwgZWxlbWVudHMgKHN1Y2ggYXMgdGhlIDxlbT4ibmFtZSI8L2VtPiBlbGVtZW50KQotYW5kIGF0dHJpYnV0ZXMgYXJlIHVucXVhbGlmaWVkIGluIGFuIFhNTCBmaWxlLCB0aGVuIG9ubHkgdGhlIHJvb3QgZWxlbWVudAotaXMgcXVhbGlmaWVkLiBTbywgaW4gdGhpcyBleGFtcGxlLCB0aGUgPGVtPiJ4IjwvZW0+IG5hbWVzcGFjZSBwcmVmaXggaXMgYXNzaWduZWQKLXRvIHRoZSByb290IGVsZW1lbnQgPGVtPiJNeUFkZHJlc3MiPC9lbT4sIGFzc29jaWF0aW5nIGl0IHdpdGggdGhlIG5hbWVzcGFjZSA8ZW0+Imh0dHA6Ly93d3cuaWJtLmNvbSIsPC9lbT4gYnV0Ci10aGU8ZW0+IngiPC9lbT4gcHJlZml4IGlzIG5vdCBhc3NpZ25lZCB0byB0aGUgbG9jYWwgZWxlbWVudCA8ZW0+Im5hbWUiPC9lbT4uPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgMiAtIEEgc2NoZW1hIHdpdGggYm90aCBhIGRlZmF1bHQgYW5kIHRhcmdldCBuYW1lc3BhY2UKLWFuZCBxdWFsaWZpZWQgbG9jYWxzPC9oND48ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3NjaGVtYSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4PSJodHRwOi8vd3d3LmlibS5jb20iIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIiZndDsKLSZsdDtjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7c2VxdWVuY2UmZ3Q7Ci0mbHQ7ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJzdHJpbmciJmd0OyZsdDsvZWxlbWVudCZndDsKLSZsdDsvc2VxdWVuY2UmZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotJmx0O2VsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJ4OkFkZHJlc3NUeXBlIiZndDsmbHQ7L2VsZW1lbnQmZ3Q7Ci0gJmx0Oy9zY2hlbWEmZ3Q7ICA8L3ByZT4KLTwvZGl2PgotPHA+QSB2YWxpZCBYTUwgaW5zdGFuY2UgZG9jdW1lbnQgY3JlYXRlZCBmcm9tCi10aGlzIHNjaGVtYSBsb29rcyBsaWtlIHRoaXMuIExvY2FsIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSA8ZW0+cXVhbGlmaWVkPC9lbT4gVGhpcwotaXMgYmVjYXVzZSB0aGUgZWxlbWVudEZvcm1EZWZhdWx0IGF0dHJpYnV0ZSBpcyBzZXQgdG8gcXVhbGlmaWVkIGluIHRoZSBYTUwKLXNjaGVtYS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICAmbHQ7eDpNeUFkZHJlc3MgeG1sbnM6eD0iaHR0cDovL3d3dy5pYm0uY29tIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3d3dy5pYm0uY29tIHgueHNkICImZ3Q7IAotJmx0O3g6bmFtZSZndDtQZXRlciBTbWl0aCZsdDsveDpuYW1lJmd0OwotICZsdDsveDpNeUFkZHJlc3MmZ3Q7PC9wcmU+Ci0gPC9kaXY+Ci08cD5JbiB0aGlzIGV4YW1wbGUsIHRoZSA8ZW0+IngiPC9lbT4gbmFtZXNwYWNlCi1wcmVmaXggaXMgYXNzaWduZWQgdG8gYm90aCB0aGUgcm9vdCBlbGVtZW50IDxlbT4iTXlBZGRyZXNzIjwvZW0+IGFuZCB0aGUgbG9jYWwKLWVsZW1lbnQgPGVtPiJuYW1lIjwvZW0+LCBhc3NvY2lhdGluZyB0aGVtIHdpdGggdGhlIG5hbWVzcGFjZSA8ZW0+Imh0dHA6Ly93d3cuaWJtLmNvbSIsPC9lbT4uPC9wPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgMyAtIFNjaGVtYSB3aXRoIHRhcmdldCBOYW1lc3BhY2UsIGFuZCBleHBsaWNpdGx5IGRlZmluZXMKLXhtbG5zOnhzZDwvaDQ+PHA+VGhpcyBYTUwgc2NoZW1hIGFkZHMgdGhpcyBhdHRyaWJ1dGU6ICA8L3A+Ci08c2FtcCBjbGFzcz0iY29kZXBoIj54bWxuczp4c2Q9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIDwvc2FtcD48cD5XaGF0Ci10aGlzIG1lYW5zIGlzIHRoYXQgZWFjaCBvZiB0aGUgY29uc3RydWN0cyB0aGF0IGFyZSBkZWZpbmVkIGJ5IHRoZSBYTUwgc2NoZW1hCi1sYW5ndWFnZSB3aWxsIG5lZWQgdG8gYmUgcXVhbGlmaWVkIHdpdGggdGhlIDx2YXIgY2xhc3M9InZhcm5hbWUiPiJ4c2QiPC92YXI+IHByZWZpeC4KLUZvciBleGFtcGxlLCB4c2Q6Y29tcGxleFR5cGUgYW5kICB4c2Q6c3RyaW5nPC9wPgotPHA+LiBOb3RlIHRoYXQgeW91IGNhbiBjaG9zZQotYW55IG90aGVyIHByZWZpeGVzIHN1Y2ggYXMgPHZhciBjbGFzcz0idmFybmFtZSI+InhzIjwvdmFyPiBvciA8dmFyIGNsYXNzPSJ2YXJuYW1lIj4iZm9vYmFyIjwvdmFyPiBpbgoteW91ciBkZWNsYXJhdGlvbiBhbmQgdXNhZ2UuPC9wPgotPHA+WW91IGNhbiBzcGVjaWZ5IHRoaXMgcHJlZml4IGluIHRoZSBYTUwgc2NoZW1hCi1wcmVmZXJlbmNlcyBwYWdlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wPgotPHA+QWxsCi11c2VyIGRlZmluZWQgdHlwZXMgYmVsb25nIHRvIHRoZSBuYW1lc3BhY2UgIGh0dHA6Ly93d3cuaWJtLmNvbSBhcyBkZWZpbmVkCi1ieSB0aGUgdGFyZ2V0TmFtZXNwYWNlIGF0dHJpYnV0ZSwgYW5kIHRoZSBwcmVmaXggaXMgPGVtPiJ4IjwvZW0+IGFzIGRlZmluZWQKLWJ5IHRoZSB4bWxuczp4IGF0dHJpYnV0ZS48L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSImZ3Q7Ci0mbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIiZndDsKLSZsdDt4c2Q6c2VxdWVuY2UmZ3Q7Ci0JCSAmbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSZsdDsveHNkOnNlcXVlbmNlJmd0OwotICZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OwotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9Ing6QWRkcmVzc1R5cGUiJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7L3hzZDpzY2hlbWEmZ3Q7PC9wcmU+Ci0gPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkCi1mcm9tIHRoaXMgc2NoZW1hIGxvb2tzIGxpa2UgdGhpcy4gTG9jYWwgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMgYXJlIDxlbT51bnF1YWxpZmllZDwvZW0+LgotVGhlIHNlbWFudGljcyBvZiBxdWFsaWZpY2F0aW9uIGlzIHRoZSBzYW1lIGFzIFNhbXBsZSAxLjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0gJmx0O3g6TXlBZGRyZXNzIHhtbG5zOng9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSJ4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuaWJtLmNvbSB4LnhzZCAiJmd0OwotJmx0O25hbWUmZ3Q7UGV0ZXIgU21pdGgmbHQ7L25hbWUmZ3Q7Ci0gJmx0Oy94Ok15QWRkcmVzcyZndDs8L3ByZT4KLTwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgNCAtIFNjaGVtYSB3aXRoIHVuZGVjbGFyZWQgdGFyZ2V0IE5hbWVzcGFjZSB0aGF0IGV4cGxpY2l0bHkKLWRlZmluZXMgeG1sbnM6eHNkPC9oND48cD5UaGlzIFhNTCBzY2hlbWEgaGFzIG5vIHRhcmdldCBuYW1lc3BhY2UgZm9yIGl0c2VsZi4KLUluIHRoaXMgY2FzZSwgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgYWxsIFhNTCBzY2hlbWEgY29uc3RydWN0cyBiZSBleHBsaWNpdGx5Ci1xdWFsaWZpZWQgd2l0aCBhIHByZWZpeCBzdWNoIGFzIDxlbT4ieHNkIjwvZW0+LiBUaGUgZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucwotZnJvbSB0aGlzIHNjaGVtYSBzdWNoIGFzIDxlbT5BZGRyZXNzVHlwZTwvZW0+IGFyZSByZWZlcmVuY2VkIHdpdGhvdXQgbmFtZXNwYWNlCi1xdWFsaWZpY2F0aW9uIHNpbmNlIHRoZXJlIGlzIG5vIG5hbWVzcGFjZSBwcmVmaXguICA8L3A+Ci08ZGl2IGNsYXNzPSJwIj48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSImZ3Q7Ci0mbHQ7eHNkOmNvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3NUeXBlIiZndDsKLSZsdDt4c2Q6c2VxdWVuY2UmZ3Q7Ci0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ieHNkOnN0cmluZyImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsKLSZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJuYW1lIiB0eXBlPSJ4c2Q6c3RyaW5nIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7IAotJmx0Oy94c2Q6c2VxdWVuY2UmZ3Q7IAotJmx0Oy94c2Q6Y29tcGxleFR5cGUmZ3Q7Ci0mbHQ7eHNkOmVsZW1lbnQgbmFtZT0iTXlBZGRyZXNzIiB0eXBlPSJBZGRyZXNzVHlwZSImZ3Q7Jmx0Oy94c2Q6ZWxlbWVudCZndDsgCi0mbHQ7L3hzZDpzY2hlbWEmZ3Q7IDwvcHJlPgotPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkCi1mcm9tIHRoZSBzY2hlbWEgbG9va3MgbGlrZSB0aGlzLiBBbGwgZWxlbWVudHMgYXJlIDxlbT51bnF1YWxpZmllZDwvZW0+LjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0mbHQ7TXlBZGRyZXNzIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJ4LnhzZCImZ3Q7Ci0mbHQ7bmFtZSZndDtuYW1lJmx0Oy9uYW1lJmd0OwotJmx0Oy9NeUFkZHJlc3MmZ3Q7PC9wcmU+Ci0gIDwvZGl2PgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxoNCBjbGFzcz0ic2VjdGlvbnRpdGxlIj5TYW1wbGUgNSAtIEEgc2NoZW1hIHdoZXJlIHRoZSB0YXJnZXQgbmFtZXNwYWNlIGlzIHRoZSBkZWZhdWx0Ci1uYW1lc3BhY2U8L2g0PjxwPlRoaXMgaXMgYW4gWE1MIHNjaGVtYSB3aGVyZSB0aGUgdGFyZ2V0IG5hbWVzcGFjZSBpcyB0aGUKLWRlZmF1bHQgbmFtZXNwYWNlLiBBcyB3ZWxsLCB0aGUgbmFtZXNwYWNlIGhhcyBubyBuYW1lc3BhY2UgcHJlZml4LjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0gJmx0O3hzZDpzY2hlbWEgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LmlibS5jb20iIHhtbG5zPSJodHRwOi8vd3d3LmlibS5jb20iJmd0OwotJmx0O3hzZDpjb21wbGV4VHlwZSBuYW1lPSJBZGRyZXNzVHlwZSImZ3Q7Ci0mbHQ7eHNkOnNlcXVlbmNlJmd0OwotJmx0O3hzZDplbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InhzZDpzdHJpbmciJmd0OyZsdDsveHNkOmVsZW1lbnQmZ3Q7Ci0mbHQ7L3hzZDpzZXF1ZW5jZSZndDsKLSZsdDsveHNkOmNvbXBsZXhUeXBlJmd0OwotICZsdDt4c2Q6ZWxlbWVudCBuYW1lPSJNeUFkZHJlc3MiIHR5cGU9IkFkZHJlc3NUeXBlIiZndDsmbHQ7L3hzZDplbGVtZW50Jmd0OwotICZsdDsveHNkOnNjaGVtYSZndDsgPC9wcmU+Ci0gPC9kaXY+Ci08cD5BIHZhbGlkIFhNTCBpbnN0YW5jZSBkb2N1bWVudCBjcmVhdGVkCi1mcm9tIHRoZSBzY2hlbWEgbG9va3MgbGlrZSB0aGlzOjwvcD4KLTxkaXYgY2xhc3M9InAiPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPyZndDsKLSZsdDtNeUFkZHJlc3MgeG1sbnM9Imh0dHA6Ly93d3cuaWJtLmNvbSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LmlibS5jb20gTmV3WE1MU2NoZW1hLnhzZCImZ3Q7Ci0mbHQ7bmFtZSZndDtuYW1lJmx0Oy9uYW1lJmd0OwotICZsdDsvTXlBZGRyZXNzJmd0OyAgPC9wcmU+Ci0gPC9kaXY+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdkOTg5My4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3JyZWZpbnRnLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHJlZmVyZW5jZSAgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgUmVmZXJlbmNlLy9FTiIgInJlZmVyZW5jZS5kdGQiPg0KLTxyZWZlcmVuY2UgaWQ9InJyZWZpbnRnIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5SZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5SZWZlcmVudGlhbCBpbnRlZ3JpdHk8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwNCi1pbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBub2RlcywgY2xlYW4gdXAgZm9yIGFueSBub2RlcyBhZmZlY3RlZA0KLXdpbGwgYXV0b21hdGljYWxseSBvY2N1ci48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+cmVmZXJlbnRpYWwgaW50ZWdyaXR5PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Y2xlYW4gdXAgaW48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHJlZmJvZHk+DQotPHNlY3Rpb24+V2hlbiB5b3UgZGVmaW5lIGEgY29tcGxleCB0eXBlLCB5b3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gaXQNCi1hbmQgcmVmZXJlbmNlIGEgZ2xvYmFsIGVsZW1lbnQuIDxwPkZvciBleGFtcGxlOjxjb2RlYmxvY2s+Jmx0O3NjaGVtYT4NCi0gJmx0O2VsZW1lbnQgbmFtZT0iY29tbWVudCIgdHlwZT0ic3RyaW5nIj4NCi0JJmx0O2NvbXBsZXhUeXBlIG5hbWU9Ikl0ZW1zIj4NCi0JCSZsdDtzZXF1ZW5jZT4NCi0JCQkJJmx0O2VsZW1lbnQgcmVmPSJjb21tZW50Ij4NCi0JCSAmbHQ7L3NlcXVlbmNlPg0KLQkgJmx0Oy9jb21wbGV4VHlwZT4NCi0mbHQ7L3NjaGVtYT48L2NvZGVibG9jaz48L3A+PHA+SWYgdGhlIGdsb2JhbCBlbGVtZW50IChjb21tZW50KSB3YXMgZGVsZXRlZCwNCi1hbGwgcmVmZXJlbmNlcyB0byBpdCB3b3VsZCBiZSBpbiBlcnJvci4gSG93ZXZlciwgd2hlbiB5b3UgZGVsZXRlIHRoZSBnbG9iYWwNCi1lbGVtZW50LCB0aGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCBjbGVhbiB1cCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTo8L3A+PHVsPg0KLTxsaT5JZiB0aGVyZSBhcmUgb25lIG9yIG1vcmUgZ2xvYmFsIGVsZW1lbnRzIGluIHRoZSBzY2hlbWEsIGl0IHdpbGwgY2hhbmdlDQotYWxsIGV4aXN0aW5nIHJlZmVyZW5jZXMgdG8gdGhlIGZpcnN0IGdsb2JhbCBlbGVtZW50LjwvbGk+DQotPGxpPklmIHRoZXJlIGlzIG5vIGdsb2JhbCBlbGVtZW50LCB0aGVuIGl0IHdpbGwgZGVsZXRlIHRoZSBlbGVtZW50IHJlZmVyZW5jZQ0KLWZyb20gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4NCi08L3VsPjwvc2VjdGlvbj4NCi08c2VjdGlvbj48dGl0bGU+RGVsZXRpbmcgaW5jbHVkZWQgYW5kIGltcG9ydGVkIHNjaGVtYTwvdGl0bGU+PHA+SWYgYW4gaW5jbHVkZWQNCi1vciBpbXBvcnRlZCBzY2hlbWEgaXMgZGVsZXRlZCwgeW91IG11c3QgbWFudWFsbHkgcmVzZXQgdGhlIGZvbGxvd2luZyB0eXBlDQotcmVmZXJlbmNlcyBhcyBhcHByb3ByaWF0ZTogPHVsPg0KLTxsaT5HbG9iYWwgZWxlbWVudCBhbmQgZWxlbWVudCdzIHR5cGU8L2xpPg0KLTxsaT5BdHRyaWJ1dGUgdHlwZTwvbGk+DQotPGxpPkNvbXBsZXggdHlwZSBkZXJpdmF0aW9uPC9saT4NCi08bGk+U2ltcGxlIHR5cGUgZGVyaXZhdGlvbiA8L2xpPg0KLTwvdWw+VGhleSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIHJlc2V0IGlmIGFuIGluY2x1ZGVkIG9yIGltcG9ydGVkIHNjaGVtYQ0KLWlzIGRlbGV0ZWQuPC9wPjwvc2VjdGlvbj4NCi08L3JlZmJvZHk+DQotPC9yZWZlcmVuY2U+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9ycmVmaW50Zy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzE5YTNiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvcnJlZmludGcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iUmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJUaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbCBpbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBub2RlcywgY2xlYW4gdXAgZm9yIGFueSBub2RlcyBhZmZlY3RlZCB3aWxsIGF1dG9tYXRpY2FsbHkgb2NjdXIuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlRoZSBYTUwgc2NoZW1hIGVkaXRvciBoYXMgYSBidWlsdC1pbiBtZWNoYW5pc20gdG8gaGFuZGxlIHJlZmVyZW50aWFsIGludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIG5vZGVzLCBjbGVhbiB1cCBmb3IgYW55IG5vZGVzIGFmZmVjdGVkIHdpbGwgYXV0b21hdGljYWxseSBvY2N1ci4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgcmVmZXJlbnRpYWwgaW50ZWdyaXR5LCBjbGVhbiB1cCBpbiIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCByZWZlcmVudGlhbCBpbnRlZ3JpdHksIGNsZWFuIHVwIGluIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGRlbHNjbXAuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJycmVmaW50ZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlJlZmVyZW50aWFsIGludGVncml0eTwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0icnJlZmludGciPjxhIG5hbWU9InJyZWZpbnRnIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5SZWZlcmVudGlhbCBpbnRlZ3JpdHkgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yPC9oMT4KLQotCi0KLQotPGRpdj48cD5UaGUgWE1MIHNjaGVtYSBlZGl0b3IgaGFzIGEgYnVpbHQtaW4gbWVjaGFuaXNtIHRvIGhhbmRsZSByZWZlcmVudGlhbAotaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQKLXdpbGwgYXV0b21hdGljYWxseSBvY2N1ci48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPldoZW4geW91IGRlZmluZSBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0Ci1hbmQgcmVmZXJlbmNlIGEgZ2xvYmFsIGVsZW1lbnQuIDxkaXYgY2xhc3M9InAiPkZvciBleGFtcGxlOjxwcmU+Jmx0O3NjaGVtYSZndDsKLSAmbHQ7ZWxlbWVudCBuYW1lPSJjb21tZW50IiB0eXBlPSJzdHJpbmciJmd0OwotCSZsdDtjb21wbGV4VHlwZSBuYW1lPSJJdGVtcyImZ3Q7Ci0JCSZsdDtzZXF1ZW5jZSZndDsKLQkJCQkmbHQ7ZWxlbWVudCByZWY9ImNvbW1lbnQiJmd0OwotCQkgJmx0Oy9zZXF1ZW5jZSZndDsKLQkgJmx0Oy9jb21wbGV4VHlwZSZndDsKLSZsdDsvc2NoZW1hJmd0OzwvcHJlPgotPC9kaXY+Ci08cD5JZiB0aGUgZ2xvYmFsIGVsZW1lbnQgKGNvbW1lbnQpIHdhcyBkZWxldGVkLAotYWxsIHJlZmVyZW5jZXMgdG8gaXQgd291bGQgYmUgaW4gZXJyb3IuIEhvd2V2ZXIsIHdoZW4geW91IGRlbGV0ZSB0aGUgZ2xvYmFsCi1lbGVtZW50LCB0aGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCBjbGVhbiB1cCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTo8L3A+Ci08dWw+Ci08bGk+SWYgdGhlcmUgYXJlIG9uZSBvciBtb3JlIGdsb2JhbCBlbGVtZW50cyBpbiB0aGUgc2NoZW1hLCBpdCB3aWxsIGNoYW5nZQotYWxsIGV4aXN0aW5nIHJlZmVyZW5jZXMgdG8gdGhlIGZpcnN0IGdsb2JhbCBlbGVtZW50LjwvbGk+Ci0KLTxsaT5JZiB0aGVyZSBpcyBubyBnbG9iYWwgZWxlbWVudCwgdGhlbiBpdCB3aWxsIGRlbGV0ZSB0aGUgZWxlbWVudCByZWZlcmVuY2UKLWZyb20gdGhlIGNvbnRlbnQgbW9kZWwuPC9saT4KLQotPC91bD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDQgY2xhc3M9InNlY3Rpb250aXRsZSI+RGVsZXRpbmcgaW5jbHVkZWQgYW5kIGltcG9ydGVkIHNjaGVtYTwvaDQ+PGRpdiBjbGFzcz0icCI+SWYgYW4gaW5jbHVkZWQKLW9yIGltcG9ydGVkIHNjaGVtYSBpcyBkZWxldGVkLCB5b3UgbXVzdCBtYW51YWxseSByZXNldCB0aGUgZm9sbG93aW5nIHR5cGUKLXJlZmVyZW5jZXMgYXMgYXBwcm9wcmlhdGU6IDx1bD4KLTxsaT5HbG9iYWwgZWxlbWVudCBhbmQgZWxlbWVudCdzIHR5cGU8L2xpPgotCi08bGk+QXR0cmlidXRlIHR5cGU8L2xpPgotCi08bGk+Q29tcGxleCB0eXBlIGRlcml2YXRpb248L2xpPgotCi08bGk+U2ltcGxlIHR5cGUgZGVyaXZhdGlvbiA8L2xpPgotCi08L3VsPgotVGhleSB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGJlIHJlc2V0IGlmIGFuIGluY2x1ZGVkIG9yIGltcG9ydGVkIHNjaGVtYQotaXMgZGVsZXRlZC48L2Rpdj4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiB0aXRsZT0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZGVsc2NtcC5odG1sIiB0aXRsZT0iSWYgeW91IGhhdmUgY3JlYXRlZCBhbnkgWE1MIHNjaGVtYSBjb21wb25lbnRzIHlvdSBubyBsb25nZXIgbmVlZCwgeW91IGNhbiBkZWxldGUgdGhlbS4iPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjg0MDE0Yi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgcmVmZXJlbmNlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFJlZmVyZW5jZS8vRU4iDQotICJyZWZlcmVuY2UuZHRkIj4NCi08cmVmZXJlbmNlIGlkPSJyaWNvbnMiIHhtbDpsYW5nPSJlbi11cyI+PD9QdWIgQ2FyZXQxPz4NCi08dGl0bGU+SWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3I8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPlhNTCBzY2hlbWEgZWRpdG9yIGljb25zPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPlRoZSBmb2xsb3dpbmcgWE1MIHNjaGVtYSBlZGl0b3IgaWNvbnMgYXBwZWFyIGluIHRoZSBPdXRsaW5lLCBEZXNpZ24sDQotYW5kIFByb3BlcnRpZXMgdmlldy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+aWNvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPkljb25zPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08cmVmYm9keT4NCi08c2VjdGlvbj48L3NlY3Rpb24+DQotPHRhYmxlPg0KLTx0Z3JvdXAgY29scz0iMiI+PGNvbHNwZWMgY29sbmFtZT0iQ09MU1BFQzAiLz48Y29sc3BlYyBjb2xuYW1lPSJDT0xTUEVDMSIvPg0KLTx0Ym9keT4NCi08cm93Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMCIgdmFsaWduPSJib3R0b20iPjxiPkljb248L2I+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiIHZhbGlnbj0iYm90dG9tIj48Yj5EZXNjcmlwdGlvbjwvYj48L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQW55QXR0cmlidXRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotYW55IGF0dHJpYnV0ZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+PGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREFueS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBhbnkgZWxlbWVudA0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT48Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50PC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSBhdHRyaWJ1dGUNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+YXR0cmlidXRlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZUdyb3VwLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMNCi10aGUgYXR0cmlidXRlIGdyb3VwIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGUgZ3JvdXA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXBSZWYuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYw0KLWlzIHRoZSBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5hdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTREF0dHJpYnV0ZVJlZi5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZQ0KLWF0dHJpYnV0ZSByZWZlcmVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmF0dHJpYnV0ZSByZWZlcmVuY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQWxsLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGNvbnRlbnQNCi1tb2RlbCAtIGFsbCBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Y29udGVudCBtb2RlbCAtIGFsbDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzAiPjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNEQ2hvaWNlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgY29udGVudCBtb2RlbCAtIGNob2ljZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnkgY29sbmFtZT0iQ09MU1BFQzEiPmNvbnRlbnQgbW9kZWwgLSBjaG9pY2U8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5IGNvbG5hbWU9IkNPTFNQRUMwIj48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNlcXVlbmNlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgY29udGVudCBtb2RlbCAtIHNlcXVlbmNlIGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeSBjb2xuYW1lPSJDT0xTUEVDMSI+Y29udGVudCBtb2RlbCAtIHNlcXVlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRENvbXBsZXhUeXBlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotYW55IGVsZW1lbnQgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmNvbXBsZXggdHlwZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RFbGVtZW50LmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGVsZW1lbnQNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+ZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RFbGVtZW50UmVmLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotZWxlbWVudCByZWZlcmVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmVsZW1lbnQgcmVmZXJlbmNlPC9lbnRyeT4NCi08L3Jvdz4NCi08cm93Pg0KLTxlbnRyeT48aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL1hTRFNpbXBsZUVudW0uZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUNCi1lbnVtZXJhdGlvbiBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+ZW51bWVyYXRpb248L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNER2xvYmFsQXR0cmlidXRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMNCi10aGUgZ2xvYmFsIGF0dHJpYnV0ZSBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Z2xvYmFsIGF0dHJpYnV0ZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNER2xvYmFsRWxlbWVudC5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzDQotdGhlIGdsb2JhbCBlbGVtZW50IGljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5nbG9iYWwgZWxlbWVudDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNER3JvdXAuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgZ3JvdXANCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+Z3JvdXA8L2VudHJ5Pg0KLTwvcm93Pg0KLTxyb3c+DQotPGVudHJ5PjxpbWFnZSBocmVmPSIuLi9pbWFnZXMvWFNER3JvdXBSZWYuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgZ3JvdXANCi1yZWZlcmVuY2UgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5Pmdyb3VwIHJlZmVyZW5jZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RJbXBvcnQuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgaW1wb3J0DQotaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PmltcG9ydDwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RJbmNsdWRlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIGluY2x1ZGUNCi1pY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+aW5jbHVkZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RTaW1wbGVQYXR0ZXJuLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotcGF0dGVybiBpY29uIDwvYWx0PjwvaW1hZ2U+PC9lbnRyeT4NCi08ZW50cnk+cGF0dGVybjwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RSZWRlZmluZS5naWYiPjxhbHQ+VGhpcyBncmFwaGljIGlzIHRoZSByZWRlZmluZQ0KLWljb24gPC9hbHQ+PC9pbWFnZT48L2VudHJ5Pg0KLTxlbnRyeT5yZWRlZmluZTwvZW50cnk+DQotPC9yb3c+DQotPHJvdz4NCi08ZW50cnk+PGltYWdlIGhyZWY9Ii4uL2ltYWdlcy9YU0RTaW1wbGVUeXBlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlDQotc2ltcGxlIHR5cGUgaWNvbiA8L2FsdD48L2ltYWdlPjwvZW50cnk+DQotPGVudHJ5PnNpbXBsZSB0eXBlPC9lbnRyeT4NCi08L3Jvdz4NCi08L3Rib2R5Pg0KLTwvdGdyb3VwPg0KLTwvdGFibGU+DQotPC9yZWZib2R5Pg0KLTwvcmVmZXJlbmNlPg0KLTw/UHViICowMDAwMDA0NTgxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy9yeHNkaWNvbnMuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmNjhhNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3J4c2RpY29ucy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJyZWZlcmVuY2UiIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iSWNvbnMgdXNlZCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgc2NoZW1hIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUsIERlc2lnbiwgYW5kIFByb3BlcnRpZXMgdmlldy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iVGhlIGZvbGxvd2luZyBYTUwgc2NoZW1hIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUsIERlc2lnbiwgYW5kIFByb3BlcnRpZXMgdmlldy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgaWNvbnMsIEljb25zIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGljb25zLCBJY29ucyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0icmljb25zIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+WE1MIHNjaGVtYSBlZGl0b3IgaWNvbnM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJpY29ucyI+PGEgbmFtZT0icmljb25zIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5JY29ucyB1c2VkIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VGhlIGZvbGxvd2luZyBYTUwgc2NoZW1hIGVkaXRvciBpY29ucyBhcHBlYXIgaW4gdGhlIE91dGxpbmUsIERlc2lnbiwKLWFuZCBQcm9wZXJ0aWVzIHZpZXcuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi0KLTxkaXYgY2xhc3M9InRhYmxlbm9ib3JkZXIiPjx0YWJsZSBzdW1tYXJ5PSIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNCIgZnJhbWU9ImJvcmRlciIgYm9yZGVyPSIxIiBydWxlcz0iYWxsIj4KLTx0Ym9keT4KLTx0cj4KLTx0ZCB2YWxpZ249ImJvdHRvbSI+PHN0cm9uZz5JY29uPC9zdHJvbmc+PC90ZD4KLQotPHRkIHZhbGlnbj0iYm90dG9tIj48c3Ryb25nPkRlc2NyaXB0aW9uPC9zdHJvbmc+PC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREFueUF0dHJpYnV0ZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7YW55IGF0dHJpYnV0ZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPjxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREFueS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBhbnkgZWxlbWVudCYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj48c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGF0dHJpYnV0ZSYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5hdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlR3JvdXAuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyYjMTA7dGhlIGF0dHJpYnV0ZSBncm91cCBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmF0dHJpYnV0ZSBncm91cDwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RBdHRyaWJ1dGVHcm91cFJlZi5naWYiIGFsdD0iVGhpcyBncmFwaGljJiMxMDtpcyB0aGUgYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEQXR0cmlidXRlUmVmLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlJiMxMDthdHRyaWJ1dGUgcmVmZXJlbmNlIGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+YXR0cmlidXRlIHJlZmVyZW5jZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RBbGwuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgY29udGVudCYjMTA7bW9kZWwgLSBhbGwgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jb250ZW50IG1vZGVsIC0gYWxsPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTRENob2ljZS5naWYiIGFsdD0iVGhpcyYjMTA7Z3JhcGhpYyBpcyB0aGUgY29udGVudCBtb2RlbCAtIGNob2ljZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNvbnRlbnQgbW9kZWwgLSBjaG9pY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEU2VxdWVuY2UuZ2lmIiBhbHQ9IlRoaXMmIzEwO2dyYXBoaWMgaXMgdGhlIGNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmNvbnRlbnQgbW9kZWwgLSBzZXF1ZW5jZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RDb21wbGV4VHlwZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7YW55IGVsZW1lbnQgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5jb21wbGV4IHR5cGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNERWxlbWVudC5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBlbGVtZW50JiMxMDtpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNERWxlbWVudFJlZi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7ZWxlbWVudCByZWZlcmVuY2UgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5lbGVtZW50IHJlZmVyZW5jZTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCI+PGltZyBzcmM9Ii4uL2ltYWdlcy9YU0RTaW1wbGVFbnVtLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlJiMxMDtlbnVtZXJhdGlvbiBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmVudW1lcmF0aW9uPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREdsb2JhbEF0dHJpYnV0ZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzJiMxMDt0aGUgZ2xvYmFsIGF0dHJpYnV0ZSBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmdsb2JhbCBhdHRyaWJ1dGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREdsb2JhbEVsZW1lbnQuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyYjMTA7dGhlIGdsb2JhbCBlbGVtZW50IGljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+Z2xvYmFsIGVsZW1lbnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREdyb3VwLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGdyb3VwJiMxMDtpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmdyb3VwPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIj48aW1nIHNyYz0iLi4vaW1hZ2VzL1hTREdyb3VwUmVmLmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGdyb3VwJiMxMDtyZWZlcmVuY2UgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5ncm91cCByZWZlcmVuY2U8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNESW1wb3J0LmdpZiIgYWx0PSJUaGlzIGdyYXBoaWMgaXMgdGhlIGltcG9ydCYjMTA7aWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5pbXBvcnQ8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNESW5jbHVkZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBpbmNsdWRlJiMxMDtpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPmluY2x1ZGU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEU2ltcGxlUGF0dGVybi5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7cGF0dGVybiBpY29uICIgLz48L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiPnBhdHRlcm48L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEUmVkZWZpbmUuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgcmVkZWZpbmUmIzEwO2ljb24gIiAvPjwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCI+cmVkZWZpbmU8L3RkPgotCi08L3RyPgotCi08dHI+Ci08dGQgdmFsaWduPSJ0b3AiPjxpbWcgc3JjPSIuLi9pbWFnZXMvWFNEU2ltcGxlVHlwZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSYjMTA7c2ltcGxlIHR5cGUgaWNvbiAiIC8+PC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIj5zaW1wbGUgdHlwZTwvdGQ+Ci0KLTwvdHI+Ci0KLTwvdGJvZHk+Ci0KLTwvdGFibGU+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXYgLz4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFncnAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjMTliMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0YWRkYWdycCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGF0dHJpYnV0ZSBncm91cHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBuYW1lDQotYW5kIGEgc2V0IG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuIE5hbWVkIGdyb3VwcyBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zDQotY2FuIGdyZWF0bHkgZmFjaWxpdGF0ZSB0aGUgbWFpbnRlbmFuY2UgYW5kIHJldXNlIG9mIGNvbW1vbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zDQotaW4gYW4gWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5hdHRyaWJ1dGUNCi1ncm91cHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hdHRyaWJ1dGVzDQotZ3JvdXBzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTA0KLXNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5hdHRyaWJ1dGUgZ3JvdXBzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hdHRyaWJ1dGVzIGdyb3VwczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGFuIGF0dHJpYnV0ZQ0KLWdyb3VwIHRvIGFuIFhNTCBzY2hlbWEsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB0aGUgPHVpY29udHJvbD5BdHRyaWJ1dGUgR3JvdXBzPC91aWNvbnRyb2w+IGZvbGRlcg0KLWFuZCBjbGljayAgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlIEdyb3VwPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPkl0IGFwcGVhcnMNCi1pbiB0aGUgPHVpY29udHJvbD5BdHRyaWJ1dGUgR3JvdXBzPC91aWNvbnRyb2w+IGZvbGRlci48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHlvdXIgbmV3IGdyb3VwLCBhbmQgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUNCi1hdHRyaWJ1dGUgZ3JvdXAgYW5kIHNlbGVjdCA8bWVudWNhc2NhZGU+PHVpY29udHJvbD5SZWZhY3RvcjwvdWljb250cm9sPjx1aWNvbnRyb2w+UmVuYW1lPC91aWNvbnRyb2w+DQotPC9tZW51Y2FzY2FkZT4uIEluIHRoZSA8dWljb250cm9sPk5ldyBOYW1lPC91aWNvbnRyb2w+IGZpZWxkLCB0eXBlIGEgbmFtZQ0KLWZvciB0aGUgYXR0cmlidXRlIGdyb3VwLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRvIGFkZCBhbiBhdHRyaWJ1dGUsIHJpZ2h0LWNsaWNrIHlvdXIgYXR0cmlidXRlIGdyb3VwIGluIHRoZSBPdXRsaW5lDQotdmlldywgY2xpY2sgPHVpY29udHJvbD5BZGQgQXR0cmlidXRlPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPlRoZSBhdHRyaWJ1dGUNCi1hcHBlYXJzIGJlbG93IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaW4gdGhlIE91dGxpbmUgdmlldy48L2luZm8+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IHRoZSBhdHRyaWJ1dGUsIGFuZCBpbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSBjdXJyZW50DQotKGRlZmF1bHQpIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSwgdGhlbiB0eXBlIHRoZSBuZXcgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQgKGRlZmF1bHQpIGF0dHJpYnV0ZSB0eXBlDQotYW5kIHNlbGVjdCBhIHR5cGUgZnJvbSB0aGUgbWVudS4gQWx0ZXJuYXRlbHksIHlvdSBjYW4gc2VsZWN0IGJyb3dzZSB0byBpbnZva2UNCi10aGUgU2V0IFR5cGUgbWVudSBmb3IgbW9yZSBvcHRpb25zLjwvY21kPjxpbmZvPlRoZSBTZXQgVHlwZSBkaWFsb2cgbGlzdHMgYWxsDQotYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZg0KLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluDQoteW91ciB3b3Jrc3BhY2UuIDwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RW5jbG9zaW5nIFByb2plY3Q8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGF0dHJpYnV0ZS4NCi1UbyBhZGQgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29tcGxleA0KLXR5cGUgY29udGFpbmluZyB0aGUgZWxlbWVudCwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZSBSZWY8L3VpY29udHJvbD4uPC9jbWQ+DQotPGluZm8+QSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgYXR0cmlidXRlIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQNCi1hdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcNCi1kZWNsYXJhdGlvbi4gU2VsZWN0IHRoZSByZWZlcmVuY2UsIHRoZW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQNCi1pdCB0byByZWZlcmVuY2UgaW4gdGhlIFByb3BlcnRpZXMgdmlldywgZnJvbSB0aGU8dWljb250cm9sPlJlZjwvdWljb250cm9sPiBtZW51LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGFuIGF0dHJpYnV0ZQ0KLWdyb3VwLiBUbyBhZGQgYW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljaw0KLXRoZSBjb21wbGV4IHR5cGUgY29udGFpbmluZyB0aGUgZWxlbWVudCwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZQ0KLUdyb3VwIFJlZjwvdWljb250cm9sPi48L2NtZD48aW5mbz5BIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBhdHRyaWJ1dGUNCi1lbmFibGVzIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZQ0KLWNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbiBzZWxlY3QNCi10aGUgYXR0cmlidXRlIGdyb3VwIHlvdSB3YW50IGl0IHRvIHJlZmVyZW5jZSBpbiB0aGUgUHJvcGVydGllcyB2aWV3LCBmcm9tDQotdGhlPHVpY29udHJvbD5SZWY8L3VpY29udHJvbD4gbWVudS48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudCBlbmFibGVzIGVsZW1lbnQgY29udGVudCBhY2NvcmRpbmcNCi10byBuYW1lc3BhY2VzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlIGVsZW1lbnQNCi1lbmFibGVzIGF0dHJpYnV0ZXMgdG8gYXBwZWFyIGluIGVsZW1lbnRzLiBUbyBhZGQgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlLA0KLXJpZ2h0LWNsaWNrIHlvdXIgYXR0cmlidXRlIGdyb3VwIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBbnkgQXR0cmlidXRlPC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPlRoZSA8Y29kZXBoPmFueTwvY29kZXBoPiBhcHBlYXJzIGJlbG93IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgaW4gdGhlIE91dGxpbmUNCi12aWV3LiBZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZTo8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT5Gb3IgYSA8dWljb250cm9sPm5hbWVzcGFjZTwvdWljb250cm9sPjw/UHViIENhcmV0Pz4gdmFsdWUsIHlvdSBjYW4NCi1zZWxlY3Q6PHVsPg0KLTxsaT48Yj4jI2FueTwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgZnJvbSBhbnkgbmFtZXNwYWNlLjwvbGk+DQotPGxpPjxiPiMjbG9jYWwgPC9iPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBkZWNsYXJlZA0KLXRvIGJlIGluIGEgbmFtZXNwYWNlLjwvbGk+DQotPGxpPjxiPiMjb3RoZXI8L2I+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGZyb20gdGhlIHRhcmdldA0KLW5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+DQotPGxpPjxiPiMjdGFyZ2V0TmFtZXNwYWNlIDwvYj4uIFRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQ0KLW9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4NCi08L3VsPjwvY2hvaWNlPg0KLTxjaG9pY2U+Rm9yIGEgPHVpY29udHJvbD5wcm9jZXNzQ29udGVudHM8L3VpY29udHJvbD4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0Ojx1bD4NCi08bGk+PGI+c2tpcDwvYj4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm90IHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudA0KLWF0IGFsbC48L2xpPg0KLTxsaT48Yj5sYXg8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudCBhcyBtdWNoDQotYXMgaXQgY2FuLjwvbGk+DQotPGxpPjxiPnN0cmljdDwvYj4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgYWxsIHRoZSBhdHRyaWJ1dGUgY29udGVudC48L2xpPg0KLTwvdWw+PC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA1NzY5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhZ3JwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwMGIzYjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYWdycC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBhdHRyaWJ1dGUgZ3JvdXBzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFuIGF0dHJpYnV0ZSBncm91cCBkZWZpbml0aW9uIGlzIGFuIGFzc29jaWF0aW9uIGJldHdlZW4gYSBuYW1lIGFuZCBhIHNldCBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBOYW1lZCBncm91cHMgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBjYW4gZ3JlYXRseSBmYWNpbGl0YXRlIHRoZSBtYWludGVuYW5jZSBhbmQgcmV1c2Ugb2YgY29tbW9uIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMgaW4gYW4gWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQW4gYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24gaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIG5hbWUgYW5kIGEgc2V0IG9mIGF0dHJpYnV0ZSBkZWNsYXJhdGlvbnMuIE5hbWVkIGdyb3VwcyBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zIGNhbiBncmVhdGx5IGZhY2lsaXRhdGUgdGhlIG1haW50ZW5hbmNlIGFuZCByZXVzZSBvZiBjb21tb24gYXR0cmlidXRlIGRlY2xhcmF0aW9ucyBpbiBhbiBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGF0dHJpYnV0ZSBncm91cHMsIGF0dHJpYnV0ZXMgZ3JvdXBzLCBYTUwgc2NoZW1hIGZpbGVzLCBhdHRyaWJ1dGUgZ3JvdXBzLCBYTUwgc2NoZW1hIGZpbGVzLCBhdHRyaWJ1dGVzIGdyb3VwcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGF0dHJpYnV0ZSBncm91cHMsIGF0dHJpYnV0ZXMgZ3JvdXBzLCBYTUwgc2NoZW1hIGZpbGVzLCBhdHRyaWJ1dGUgZ3JvdXBzLCBYTUwgc2NoZW1hIGZpbGVzLCBhdHRyaWJ1dGVzIGdyb3VwcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGFncnAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgYXR0cmlidXRlIGdyb3VwczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGFncnAiPjxhIG5hbWU9InRhZGRhZ3JwIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYXR0cmlidXRlIGdyb3VwczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QW4gYXR0cmlidXRlIGdyb3VwIGRlZmluaXRpb24gaXMgYW4gYXNzb2NpYXRpb24gYmV0d2VlbiBhIG5hbWUKLWFuZCBhIHNldCBvZiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zLiBOYW1lZCBncm91cHMgb2YgYXR0cmlidXRlIGRlY2xhcmF0aW9ucwotY2FuIGdyZWF0bHkgZmFjaWxpdGF0ZSB0aGUgbWFpbnRlbmFuY2UgYW5kIHJldXNlIG9mIGNvbW1vbiBhdHRyaWJ1dGUgZGVjbGFyYXRpb25zCi1pbiBhbiBYTUwgc2NoZW1hLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gYXR0cmlidXRlCi1ncm91cCB0byBhbiBYTUwgc2NoZW1hLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BdHRyaWJ1dGUgR3JvdXBzPC9zcGFuPiBmb2xkZXIKLWFuZCBjbGljayAgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZSBHcm91cDwvc3Bhbj4uPC9zcGFuPiBJdCBhcHBlYXJzCi1pbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXR0cmlidXRlIEdyb3Vwczwvc3Bhbj4gZm9sZGVyLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHlvdXIgbmV3IGdyb3VwLCBhbmQgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUKLWF0dHJpYnV0ZSBncm91cCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmYWN0b3I8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVuYW1lPC9zcGFuPgotPC9zcGFuPi4gSW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5ldyBOYW1lPC9zcGFuPiBmaWVsZCwgdHlwZSBhIG5hbWUKLWZvciB0aGUgYXR0cmlidXRlIGdyb3VwLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFkZCBhbiBhdHRyaWJ1dGUsIHJpZ2h0LWNsaWNrIHlvdXIgYXR0cmlidXRlIGdyb3VwIGluIHRoZSBPdXRsaW5lCi12aWV3LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlPC9zcGFuPi48L3NwYW4+IFRoZSBhdHRyaWJ1dGUKLWFwcGVhcnMgYmVsb3cgdGhlIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZSB2aWV3LgotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIGF0dHJpYnV0ZSwgYW5kIGluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQKLShkZWZhdWx0KSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIHRoZW4gdHlwZSB0aGUgbmV3IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCBjbGljayB0aGUgY3VycmVudCAoZGVmYXVsdCkgYXR0cmlidXRlIHR5cGUKLWFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdCBicm93c2UgdG8gaW52b2tlCi10aGUgU2V0IFR5cGUgbWVudSBmb3IgbW9yZSBvcHRpb25zLjwvc3Bhbj4gVGhlIFNldCBUeXBlIGRpYWxvZyBsaXN0cyBhbGwKLWJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZgotdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluCi15b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+KERlZmF1bHQpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPC9vbD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGF0dHJpYnV0ZS4KLVRvIGFkZCBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb21wbGV4Ci10eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlIFJlZjwvc3Bhbj4uPC9zcGFuPgotIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkCi1hdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcKLWRlY2xhcmF0aW9uLiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSBncm91cCB5b3Ugd2FudAotaXQgdG8gcmVmZXJlbmNlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGZyb20gdGhlPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmPC9zcGFuPiBtZW51LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGFuIGF0dHJpYnV0ZQotZ3JvdXAuIFRvIGFkZCBhbiBhdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrCi10aGUgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlCi1Hcm91cCBSZWY8L3NwYW4+Ljwvc3Bhbj4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgYXR0cmlidXRlCi1lbmFibGVzIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZQotY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIFNlbGVjdCB0aGUgcmVmZXJlbmNlLCB0aGVuIHNlbGVjdAotdGhlIGF0dHJpYnV0ZSBncm91cCB5b3Ugd2FudCBpdCB0byByZWZlcmVuY2UgaW4gdGhlIFByb3BlcnRpZXMgdmlldywgZnJvbQotdGhlPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmPC9zcGFuPiBtZW51LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGVuYWJsZXMgZWxlbWVudCBjb250ZW50IGFjY29yZGluZwotdG8gbmFtZXNwYWNlcywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlIGVsZW1lbnQKLWVuYWJsZXMgYXR0cmlidXRlcyB0byBhcHBlYXIgaW4gZWxlbWVudHMuIFRvIGFkZCBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZSwKLXJpZ2h0LWNsaWNrIHlvdXIgYXR0cmlidXRlIGdyb3VwIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQW55IEF0dHJpYnV0ZTwvc3Bhbj4uPC9zcGFuPgotIFRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGFwcGVhcnMgYmVsb3cgdGhlIGF0dHJpYnV0ZSBncm91cCBpbiB0aGUgT3V0bGluZQotdmlldy4gWW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvciBhbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGF0dHJpYnV0ZToKLTx1bD4KLTxsaT5Gb3IgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5uYW1lc3BhY2U8L3NwYW4+IHZhbHVlLCB5b3UgY2FuCi1zZWxlY3Q6PHVsPgotPGxpPjxzdHJvbmc+IyNhbnk8L3N0cm9uZz4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgZnJvbSBhbnkgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjbG9jYWwgPC9zdHJvbmc+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGRlY2xhcmVkCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI290aGVyPC9zdHJvbmc+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGZyb20gdGhlIHRhcmdldAotbmFtZXNwYWNlIG9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4KLQotPGxpPjxzdHJvbmc+IyN0YXJnZXROYW1lc3BhY2UgPC9zdHJvbmc+LiBUaGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldCBuYW1lc3BhY2UKLW9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaT5Gb3IgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5wcm9jZXNzQ29udGVudHM8L3NwYW4+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+Ci08bGk+PHN0cm9uZz5za2lwPC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQKLWF0IGFsbC48L2xpPgotCi08bGk+PHN0cm9uZz5sYXg8L3N0cm9uZz4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50IGFzIG11Y2gKLWFzIGl0IGNhbi48L2xpPgotCi08bGk+PHN0cm9uZz5zdHJpY3Q8L3N0cm9uZz4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgYWxsIHRoZSBhdHRyaWJ1dGUgY29udGVudC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAyNTgyZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRhbnllLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGFueWUiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGFuIGFueSBlbGVtZW50PC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gdXNlIHRoZSA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMNCi1hIERURCdzIEFOWSBjb250ZW50IG1vZGVsLCBob3dldmVyLCBpdCBtdXN0IGJlIGRvbmUgaW4gY29uanVuY3Rpb24gd2l0aCBuYW1lc3BhY2VzLg0KLVRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWINCi1wYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5hbiBhbnkgZWxlbWVudDwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFuIGFueSBlbGVtZW50PGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+YW4gYW55IGVsZW1lbnQ8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFuIGFueSBlbGVtZW50PGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPkZvciBleGFtcGxlOjwvcD48cD48Y29kZWJsb2NrPiZsdDtlbGVtZW50IG5hbWUgPSAiTXlXZWJQYWdlIj4NCi0mbHQ7Y29tcGxleFR5cGU+DQotJmx0O2FueSBuYW1lc3BhY2UgPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sPg0KLSAmbHQ7IG1pbk9jY3Vycz0iMSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHByb2Nlc3NDb250ZW50cz0ic2tpcCIvPg0KLSZsdDsvY29tcGxleFR5cGU+DQotJmx0Oy9lbGVtZW50PjwvY29kZWJsb2NrPjwvcD48cD5UaGUgcHJlY2VkaW5nIHNjaGVtYSBmcmFnbWVudCBhbGxvd3MgYSA8Y29kZXBoPiZsdDtNeVdlYlBhZ2U+PC9jb2RlcGg+IGVsZW1lbnQNCi10byBjb250YWluIGFueSB3ZWxsLWZvcm1lZCBYSFRNTCBkYXRhIHRoYXQgYXBwZWFycyBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS48L3A+PHA+VGhlDQotZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkNCi13aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQ6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB0aGF0IHlvdSB3YW50DQotdG8gd29yayB3aXRoIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBbnk8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgbmV3IDxjb2RlcGg+YW55PC9jb2RlcGg+IGVsZW1lbnQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldyBvZiB0aGUgc2NoZW1hIGVkaXRvciwgZm9yIGEgPHVpY29udHJvbD5uYW1lc3BhY2U8L3VpY29udHJvbD4gPD9QdWIgQ2FyZXQxPz52YWx1ZSwNCi15b3UgY2FuIHNlbGVjdDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPjxiPiMjYW55PC9iPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9jaG9pY2U+DQotPGNob2ljZT48Yj4jI2xvY2FsIDwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQNCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2Nob2ljZT4NCi08Y2hvaWNlPjxiPiMjb3RoZXIgPC9iPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tDQotdGhlIHRhcmdldCBuYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2Nob2ljZT4NCi08Y2hvaWNlPjxiPiMjdGFyZ2V0TmFtZXNwYWNlPC9iPi4gVGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlDQotb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Rm9yIGEgPHVpY29udHJvbD5wcm9jZXNzQ29udGVudHM8L3VpY29udHJvbD4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0OjwvY21kPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+PGI+c2tpcDwvYj4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm90IHZhbGlkYXRlIHRoZSBjb250ZW50IGF0IGFsbC48L2Nob2ljZT4NCi08Y2hvaWNlPjxiPmxheDwvYj4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgdGhlIGNvbnRlbnQgYXMgbXVjaCBhcw0KLWl0IGNhbi48L2Nob2ljZT4NCi08Y2hvaWNlPjxiPnN0cmljdDwvYj4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgYWxsIHRoZSBjb250ZW50LjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgPHVpY29udHJvbD5taW5PY2N1cnM8L3VpY29udHJvbD4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiB0aW1lcw0KLXRoZSA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50IG11c3QgYXBwZWFyIGluIGFuIGluc3RhbmNlIGRvY3VtZW50LiBZb3UNCi1jYW4gc2VsZWN0IDx1aWNvbnRyb2w+MDwvdWljb250cm9sPiBpZiB5b3Ugd2FudCB0aGUgZWxlbWVudCB0byBiZSBvcHRpb25hbDsNCi1vdGhlcndpc2UsIHNlbGVjdCA8dWljb250cm9sPjE8L3VpY29udHJvbD4uIDwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSA8dWljb250cm9sPm1heE9jY3VyczwvdWljb250cm9sPiB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXINCi1vZiB0aW1lcyBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50IGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuDQotWW91IGNhbiBzZWxlY3QgPHVpY29udHJvbD4wPC91aWNvbnRyb2w+LCA8dWljb250cm9sPjE8L3VpY29udHJvbD4sIG9yLCB0bw0KLWluZGljYXRlIHRoZXJlIGlzIG5vIG1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLCA8dWljb250cm9sPnVuYm91bmRlZDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZWxlbWVudC48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHBvc3RyZXE+PHA+KGMpIENvcHlyaWdodCAyMDAxLCBXb3JsZCBXaWRlIFdlYiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YNCi1UZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLA0KLUtlaW8gVW5pdmVyc2l0eSkuPC9wPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNDI5MT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkYW55ZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTQwZWNiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGFueWUuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgYW4gYW55IGVsZW1lbnQiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIGFueSBlbGVtZW50IGluIGEgc2ltaWxhciB3YXkgYXMgYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4gVGhpcyBlbmFibGVzIHlvdSB0byBpbmNsdWRlIGFueSB3ZWxsLWZvcm1lZCBYTUwgY29udGVudCwgc3VjaCBhcyBhbiBIVE1MIFdlYiBwYWdlIHRoYXQgY29uZm9ybXMgdG8gWEhUTUwgMS4wIHN5bnRheC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBhbiBhbnkgZWxlbWVudCwgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGFuIGFueSBlbGVtZW50LCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkYW55ZSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBhbiBhbnkgZWxlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGFueWUiPjxhIG5hbWU9InRhZGRhbnllIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gdXNlIHRoZSA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgaW4gYSBzaW1pbGFyIHdheSBhcwotYSBEVEQncyBBTlkgY29udGVudCBtb2RlbCwgaG93ZXZlciwgaXQgbXVzdCBiZSBkb25lIGluIGNvbmp1bmN0aW9uIHdpdGggbmFtZXNwYWNlcy4KLVRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIKLXBhZ2UgdGhhdCBjb25mb3JtcyB0byBYSFRNTCAxLjAgc3ludGF4LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+Rm9yIGV4YW1wbGU6PC9wPgotPGRpdiBjbGFzcz0icCI+PHByZT4mbHQ7ZWxlbWVudCBuYW1lID0gIk15V2ViUGFnZSImZ3Q7Ci0mbHQ7Y29tcGxleFR5cGUmZ3Q7Ci0mbHQ7YW55IG5hbWVzcGFjZSA9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwmZ3Q7Ci0gJmx0OyBtaW5PY2N1cnM9IjEiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBwcm9jZXNzQ29udGVudHM9InNraXAiLyZndDsKLSZsdDsvY29tcGxleFR5cGUmZ3Q7Ci0mbHQ7L2VsZW1lbnQmZ3Q7PC9wcmU+Ci08L2Rpdj4KLTxwPlRoZSBwcmVjZWRpbmcgc2NoZW1hIGZyYWdtZW50IGFsbG93cyBhIDxzYW1wIGNsYXNzPSJjb2RlcGgiPiZsdDtNeVdlYlBhZ2UmZ3Q7PC9zYW1wPiBlbGVtZW50Ci10byBjb250YWluIGFueSB3ZWxsLWZvcm1lZCBYSFRNTCBkYXRhIHRoYXQgYXBwZWFycyBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS48L3A+Ci08cD5UaGUKLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5Ci13aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50OjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIHRoYXQgeW91IHdhbnQKLXRvIHdvcmsgd2l0aCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFueTwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgbmV3IDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3IG9mIHRoZSBzY2hlbWEgZWRpdG9yLCBmb3IgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5uYW1lc3BhY2U8L3NwYW4+IHZhbHVlLAoteW91IGNhbiBzZWxlY3Q6PC9zcGFuPgotPHVsPgotPGxpPjxzdHJvbmc+IyNhbnk8L3N0cm9uZz4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgZnJvbSBhbnkgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjbG9jYWwgPC9zdHJvbmc+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGRlY2xhcmVkCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI290aGVyIDwvc3Ryb25nPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tCi10aGUgdGFyZ2V0IG5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjdGFyZ2V0TmFtZXNwYWNlPC9zdHJvbmc+LiBUaGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldCBuYW1lc3BhY2UKLW9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Gb3IgYSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5wcm9jZXNzQ29udGVudHM8L3NwYW4+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8L3NwYW4+Ci08dWw+Ci08bGk+PHN0cm9uZz5za2lwPC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgY29udGVudCBhdCBhbGwuPC9saT4KLQotPGxpPjxzdHJvbmc+bGF4PC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBjb250ZW50IGFzIG11Y2ggYXMKLWl0IGNhbi48L2xpPgotCi08bGk+PHN0cm9uZz5zdHJpY3Q8L3N0cm9uZz4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgYWxsIHRoZSBjb250ZW50LjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPm1pbk9jY3Vyczwvc3Bhbj4gdmFsdWUgaXMgdGhlIG51bWJlciBvZiB0aW1lcwotdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudCBtdXN0IGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gWW91Ci1jYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjA8L3NwYW4+IGlmIHlvdSB3YW50IHRoZSBlbGVtZW50IHRvIGJlIG9wdGlvbmFsOwotb3RoZXJ3aXNlLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4uIDwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5tYXhPY2N1cnM8L3NwYW4+IHZhbHVlIGlzIHRoZSBtYXhpbXVtIG51bWJlcgotb2YgdGltZXMgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBlbGVtZW50IGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuCi1Zb3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4wPC9zcGFuPiwgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MTwvc3Bhbj4sIG9yLCB0bwotaW5kaWNhdGUgdGhlcmUgaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMsIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuYm91bmRlZDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPihjKSBDb3B5cmlnaHQgMjAwMSwgV29ybGQgV2lkZSBXZWIgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mCi1UZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLAotS2VpbyBVbml2ZXJzaXR5KS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI4MzEzOS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbW9kLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGNtb2QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBjb250ZW50IG1vZGVsczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkDQotaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbA0KLWRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsDQotZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudA0KLWluc3RhbmNlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmNvbnRlbnQNCi1tb2RlbHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5jb250ZW50DQotbW9kZWxzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTA0KLXNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5jb250ZW50IG1vZGVsczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+Y29udGVudCBtb2RlbHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCBraW5kcyBvZiBjb250ZW50IG1vZGVsczo8dWw+DQotPGxpPjxiPlNlcXVlbmNlPC9iPiwgd2hpY2ggbWVhbnMgdGhhdCBhbGwgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbiBjYW4NCi1hcHBlYXIgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBzY2hlbWEuIFRoZXkgbXVzdCwgaG93ZXZlciwgYXBwZWFyIGluIHRoZQ0KLW9yZGVyIHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgY29udGVudCBtb2RlbC48L2xpPg0KLTxsaT48Yj5DaG9pY2U8L2I+LCB3aGljaCBtZWFucyB0aGF0IG9ubHkgb25lIG9mIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4NCi1jYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hLjwvbGk+DQotPGxpPjxiPkFsbDwvYj4sIHdoaWNoIG1lYW5zIHRoYXQgYWxsIG9mIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4gY2FuIGFwcGVhcg0KLW9uY2Ugb3Igbm90IGF0IGFsbCwgYW5kIHRoZXkgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIuIElmIHlvdSBzZWxlY3QgdGhpcyBvcHRpb24sDQotYWxsIG9mIHRoZSBjb250ZW50cyBtb2RlbCdzIGNoaWxkcmVuIG11c3QgYmUgaW5kaXZpZHVhbCBlbGVtZW50cyBhbmQgbm8gZWxlbWVudA0KLWluIHRoZSBjb250ZW50IG1vZGVsIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UuPC9saT4NCi08L3VsPjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGEgY29udGVudA0KLW1vZGVsIHRvIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCBmb2xsb3cgdGhlc2UNCi1zdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHlvdXIgY29tcGxleCB0eXBlLCBvciBncm91cDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPklmIHlvdSBzZWxlY3RlZCBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiByaWdodC1jbGljayBpdCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1TZXF1ZW5jZTwvdWljb250cm9sPiwgb3IgPHVpY29udHJvbD5BZGQgQ2hvaWNlPC91aWNvbnRyb2w+IHRvIGFkZCB0aGUgdHlwZQ0KLW9mIGNvbnRlbnQgbW9kZWwgeW91IHdhbnQgdG8geW91ciBjb21wbGV4IHR5cGUuIElmIHlvdSB3aXNoIHRvIHVzZSB0aGUgPHVpY29udHJvbD5hbGw8L3VpY29udHJvbD4gY29udGVudA0KLW1vZGVsLCB5b3UgY2FuIGNoYW5nZSB0aGUgbW9kZWwgYnkgY2xpY2tpbmcgdGhlIG1vZGVsIGluIHRoZSBEZXNpZ24gdmlldywNCi1hbmQgaW4gcHJvcGVydGllcywgc2VsZWN0IDx1aWNvbnRyb2w+YWxsPC91aWNvbnRyb2w+IGFzIHRoZSA8dWljb250cm9sPktpbmQ8L3VpY29udHJvbD4uDQotWW91ciBjb250ZW50IG1vZGVsIGlzIGF1dG9tYXRpY2FsbHkgYWRkZWQgYXMgYSBjaGlsZCBvZiB5b3VyIGNvbXBsZXggdHlwZQ0KLS0gZXhwYW5kIGluIHRoZSBPdXRsaW5lIHZpZXcgdG8gc2VlIGl0LiA8Yj5Ob3RlOjwvYj4gVGhlc2Ugb3B0aW9ucyB3aWxsIG5vdA0KLWFwcGVhciBpZiB5b3UgaGF2ZSBzZXQgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLiBZb3UgY2FuIGVpdGhlciBzZXQNCi1hIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdSBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0LCBidXQgeW91DQotY2Fubm90IGRvIGJvdGguPC9jaG9pY2U+DQotPGNob2ljZT5Zb3VyIGdyb3VwIGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCB3aXRoIGEgc2VxdWVuY2UgY29udGVudCBtb2RlbA0KLWNoaWxkLiBFeHBhbmQgaXQgaW4gdGhlIE91dGxpbmUgdmlldyB0byBzZWUgaXQgYW5kIHNlbGVjdCBpdC4gSW4gdGhlIFByb3BlcnRpZXMNCi12aWV3LCB5b3UgY2FuIHNlbGVjdCB0byBjaGFuZ2UgaXQgdG8gYSA8dWljb250cm9sPmNob2ljZTwvdWljb250cm9sPiBvciA8dWljb250cm9sPmFsbDwvdWljb250cm9sPiBjb250ZW50DQotbW9kZWwgYnkgc2VsZWN0aW5nIHRoZXNlIG9wdGlvbnMgZnJvbSB0aGUgPHVpY29udHJvbD5LaW5kPC91aWNvbnRyb2w+IG1lbnUuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NaW5PY2N1cnM8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPGluZm8+VGhpcyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGNvbnRlbnQgbW9kZWwgbXVzdCBhcHBlYXIuIElmDQoteW91IHdhbnQgdGhlIGNvbnRlbnQgbW9kZWwgdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4uDQotT3RoZXJ3aXNlLCBzZWxlY3QgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk1heE9jY3VyczwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08aW5mbz5UaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyBhIGNvbnRlbnQgbW9kZWwgY2FuIGFwcGVhci4gWW91DQotY2FuIHNlbGVjdCA8dWljb250cm9sPnVuYm91bmRlZDwvdWljb250cm9sPiB0byBpbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtDQotbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29udGVudCBtb2RlbC48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjw/UHViIENhcmV0Pz48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPjxwPllvdSBjYW4gYWRkIHRoZSBmb2xsb3dpbmcgaXRlbXMgdG8gYSBjb250ZW50IG9iamVjdCBtb2RlbC4gPC9wPjx1bD4NCi08bGk+QW5vdGhlciBjb250ZW50IG1vZGVsLjwvbGk+DQotPGxpPkEgZ3JvdXAgcmVmZXJlbmNlIHdoaWNoIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZQ0KLWluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gVGhpcyBtZW51DQotb3B0aW9uIG9ubHkgYXBwZWFycyBpZiB0aGVyZSBhcmUgZ2xvYmFsIGdyb3VwcyBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQNCi1vciBpZiBncm91cHMgYXJlIGRlZmluZWQgaW4gaW5jbHVkZWQgc2NoZW1hcy48L2xpPg0KLTxsaT5BbiBlbGVtZW50LCBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLjwvbGk+DQotPGxpPkFuIGVsZW1lbnQgcmVmZXJlbmNlLCB3aGljaCBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50Lg0KLVRoaXMgbWVudSBvcHRpb24gb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgZWxlbWVudHMgZGVmaW5lZCBlbHNld2hlcmUNCi1pbiB0aGUgZG9jdW1lbnQuPC9saT4NCi08bGk+QW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudC4gWW91IGNhbiB1c2UgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gZWxlbWVudA0KLXRvIGV4dGVuZCB5b3VyIGNvbnRlbnQgbW9kZWwgYnkgYW55IGVsZW1lbnRzIGJlbG9uZ2luZyB0byBhIHNwZWNpZmllZCBuYW1lc3BhY2UuPC9saT4NCi08L3VsPjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNTMxNz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY21vZC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTBhZmUxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNtb2QuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgY29udGVudCBtb2RlbHMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsIGRlc2NyaXB0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgYW5kIHBlcm1pc3NpYmxlIGNvbnRlbnQgb2YgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAsIHdoaWNoIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIGEgZG9jdW1lbnQgaW5zdGFuY2UuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgY29udGVudCBtb2RlbHMsIFhNTCBzY2hlbWEgZmlsZXMsIGNvbnRlbnQgbW9kZWxzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgY29udGVudCBtb2RlbHMsIFhNTCBzY2hlbWEgZmlsZXMsIGNvbnRlbnQgbW9kZWxzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdycHIuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkY21vZCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBjb250ZW50IG1vZGVsczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGNtb2QiPjxhIG5hbWU9InRhZGRjbW9kIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgY29udGVudCBtb2RlbHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkCi1pbnNpZGUgYW4gZWxlbWVudCwgZ2xvYmFsIGVsZW1lbnQsIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXAuIEl0IGlzIGEgZm9ybWFsCi1kZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbAotZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudAotaW5zdGFuY2UuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48ZGl2IGNsYXNzPSJwIj5UaGVyZSBhcmUgdGhyZWUgZGlmZmVyZW50IGtpbmRzIG9mIGNvbnRlbnQgbW9kZWxzOjx1bD4KLTxsaT48c3Ryb25nPlNlcXVlbmNlPC9zdHJvbmc+LCB3aGljaCBtZWFucyB0aGF0IGFsbCB0aGUgY29udGVudCBtb2RlbCdzIGNoaWxkcmVuIGNhbgotYXBwZWFyIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hLiBUaGV5IG11c3QsIGhvd2V2ZXIsIGFwcGVhciBpbiB0aGUKLW9yZGVyIHRoZXkgYXJlIGxpc3RlZCBpbiB0aGUgY29udGVudCBtb2RlbC48L2xpPgotCi08bGk+PHN0cm9uZz5DaG9pY2U8L3N0cm9uZz4sIHdoaWNoIG1lYW5zIHRoYXQgb25seSBvbmUgb2YgdGhlIGNvbnRlbnQgbW9kZWwncyBjaGlsZHJlbgotY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYS48L2xpPgotCi08bGk+PHN0cm9uZz5BbGw8L3N0cm9uZz4sIHdoaWNoIG1lYW5zIHRoYXQgYWxsIG9mIHRoZSBjb250ZW50IG1vZGVsJ3MgY2hpbGRyZW4gY2FuIGFwcGVhcgotb25jZSBvciBub3QgYXQgYWxsLCBhbmQgdGhleSBjYW4gYXBwZWFyIGluIGFueSBvcmRlci4gSWYgeW91IHNlbGVjdCB0aGlzIG9wdGlvbiwKLWFsbCBvZiB0aGUgY29udGVudHMgbW9kZWwncyBjaGlsZHJlbiBtdXN0IGJlIGluZGl2aWR1YWwgZWxlbWVudHMgYW5kIG5vIGVsZW1lbnQKLWluIHRoZSBjb250ZW50IG1vZGVsIGNhbiBhcHBlYXIgbW9yZSB0aGFuIG9uY2UuPC9saT4KLQotPC91bD4KLTwvZGl2PgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBhZGQgYSBjb250ZW50Ci1tb2RlbCB0byBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgZm9sbG93IHRoZXNlCi1zdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHNlbGVjdCB5b3VyIGNvbXBsZXggdHlwZSwgb3IgZ3JvdXA6PC9zcGFuPgotPHVsPgotPGxpPklmIHlvdSBzZWxlY3RlZCBhIGNvbXBsZXggdHlwZSwgeW91IGNhbiByaWdodC1jbGljayBpdCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkCi1TZXF1ZW5jZTwvc3Bhbj4sIG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBDaG9pY2U8L3NwYW4+IHRvIGFkZCB0aGUgdHlwZQotb2YgY29udGVudCBtb2RlbCB5b3Ugd2FudCB0byB5b3VyIGNvbXBsZXggdHlwZS4gSWYgeW91IHdpc2ggdG8gdXNlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5hbGw8L3NwYW4+IGNvbnRlbnQKLW1vZGVsLCB5b3UgY2FuIGNoYW5nZSB0aGUgbW9kZWwgYnkgY2xpY2tpbmcgdGhlIG1vZGVsIGluIHRoZSBEZXNpZ24gdmlldywKLWFuZCBpbiBwcm9wZXJ0aWVzLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+YWxsPC9zcGFuPiBhcyB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+S2luZDwvc3Bhbj4uCi1Zb3VyIGNvbnRlbnQgbW9kZWwgaXMgYXV0b21hdGljYWxseSBhZGRlZCBhcyBhIGNoaWxkIG9mIHlvdXIgY29tcGxleCB0eXBlCi0tIGV4cGFuZCBpbiB0aGUgT3V0bGluZSB2aWV3IHRvIHNlZSBpdC4gPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGVzZSBvcHRpb25zIHdpbGwgbm90Ci1hcHBlYXIgaWYgeW91IGhhdmUgc2V0IGEgYmFzZSB0eXBlIGZvciB5b3VyIGNvbXBsZXggdHlwZS4gWW91IGNhbiBlaXRoZXIgc2V0Ci1hIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdSBhZGQgYSBjb250ZW50IG1vZGVsIHRvIGl0LCBidXQgeW91Ci1jYW5ub3QgZG8gYm90aC48L2xpPgotCi08bGk+WW91ciBncm91cCBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCBhIHNlcXVlbmNlIGNvbnRlbnQgbW9kZWwKLWNoaWxkLiBFeHBhbmQgaXQgaW4gdGhlIE91dGxpbmUgdmlldyB0byBzZWUgaXQgYW5kIHNlbGVjdCBpdC4gSW4gdGhlIFByb3BlcnRpZXMKLXZpZXcsIHlvdSBjYW4gc2VsZWN0IHRvIGNoYW5nZSBpdCB0byBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmNob2ljZTwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+YWxsPC9zcGFuPiBjb250ZW50Ci1tb2RlbCBieSBzZWxlY3RpbmcgdGhlc2Ugb3B0aW9ucyBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5LaW5kPC9zcGFuPiBtZW51LjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NaW5PY2N1cnM8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgY29udGVudCBtb2RlbCBtdXN0IGFwcGVhci4gSWYKLXlvdSB3YW50IHRoZSBjb250ZW50IG1vZGVsIHRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4uCi1PdGhlcndpc2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4xPC9zcGFuPi4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1heE9jY3Vyczwvc3Bhbj4gZmllbGQuPC9zcGFuPgotIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIGEgY29udGVudCBtb2RlbCBjYW4gYXBwZWFyLiBZb3UKLWNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+dW5ib3VuZGVkPC9zcGFuPiB0byBpbmRpY2F0ZSB0aGVyZSBpcyBubyBtYXhpbXVtCi1udW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGNvbnRlbnQgbW9kZWwuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhZGQgdGhlIGZvbGxvd2luZyBpdGVtcyB0byBhIGNvbnRlbnQgb2JqZWN0IG1vZGVsLiA8L3A+Ci08dWw+Ci08bGk+QW5vdGhlciBjb250ZW50IG1vZGVsLjwvbGk+Ci0KLTxsaT5BIGdyb3VwIHJlZmVyZW5jZSB3aGljaCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUKLWluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gVGhpcyBtZW51Ci1vcHRpb24gb25seSBhcHBlYXJzIGlmIHRoZXJlIGFyZSBnbG9iYWwgZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudAotb3IgaWYgZ3JvdXBzIGFyZSBkZWZpbmVkIGluIGluY2x1ZGVkIHNjaGVtYXMuPC9saT4KLQotPGxpPkFuIGVsZW1lbnQsIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuPC9saT4KLQotPGxpPkFuIGVsZW1lbnQgcmVmZXJlbmNlLCB3aGljaCBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LgotVGhpcyBtZW51IG9wdGlvbiBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlIGdsb2JhbCBlbGVtZW50cyBkZWZpbmVkIGVsc2V3aGVyZQotaW4gdGhlIGRvY3VtZW50LjwvbGk+Ci0KLTxsaT5BbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQuIFlvdSBjYW4gdXNlIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gZWxlbWVudAotdG8gZXh0ZW5kIHlvdXIgY29udGVudCBtb2RlbCBieSBhbnkgZWxlbWVudHMgYmVsb25naW5nIHRvIGEgc3BlY2lmaWVkIG5hbWVzcGFjZS48L2xpPgotCi08L3VsPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgYW55IGVsZW1lbnQgaW4gYSBzaW1pbGFyIHdheSBhcyBhIERURCdzIEFOWSBjb250ZW50IG1vZGVsLCBob3dldmVyLCBpdCBtdXN0IGJlIGRvbmUgaW4gY29uanVuY3Rpb24gd2l0aCBuYW1lc3BhY2VzLiBUaGlzIGVuYWJsZXMgeW91IHRvIGluY2x1ZGUgYW55IHdlbGwtZm9ybWVkIFhNTCBjb250ZW50LCBzdWNoIGFzIGFuIEhUTUwgV2ViIHBhZ2UgdGhhdCBjb25mb3JtcyB0byBYSFRNTCAxLjAgc3ludGF4LiI+QWRkaW5nIGFuIGFueSBlbGVtZW50PC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGVsbS5odG1sIiB0aXRsZT0iRWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zIHByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLCBlc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLiI+QWRkaW5nIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgdGl0bGU9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iPkFkZGluZyBlbGVtZW50IHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ3Jwci5odG1sIiB0aXRsZT0iQSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iPkFkZGluZyBncm91cCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2QxZjczZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRjbXh0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRjbXh0IiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgY29tcGxleCB0eXBlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIGNvbXBsZXggdHlwZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBjb21wbGV4IHR5cGUgYWxsb3dzIGVsZW1lbnRzIGluIGl0cyBjb250ZW50IGFuZCBjYW4gY2FycnkgYXR0cmlidXRlcy4NCi1Db21wbGV4IHR5cGVzIGNhbiBiZSB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IGZvciBhbnkNCi1pbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5jb21wbGV4DQotdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5jb21wbGV4DQotdHlwZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MIHNjaGVtYQ0KLWZpbGVzPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmNvbXBsZXggdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmNvbXBsZXggdHlwZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+WW91IGNhbiBhZGQgYXMgbWFueSBjb21wbGV4IHR5cGVzIGFzIHlvdSB3YW50IHRvIGFuIFhNTCBzY2hlbWEuPC9wPjxwPlRoZQ0KLWZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5DQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIGNvbXBsZXggdHlwZSB0bw0KLWFuIFhNTCBzY2hlbWEsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5SaWdodC1jbGljayB0aGUgVHlwZXMgY2F0ZWdvcnkgaW4gdGhlIERlc2lnbiB2aWV3LCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1Db21wbGV4IFR5cGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgY29tcGxleCB0eXBlIGluDQotdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPg0KLTxhbHQ+QnJvd3NlIGljb248L2FsdD48L2ltYWdlPiB0byBzZWxlY3QgYSBiYXNlIHR5cGUgZm9yIHlvdXIgY29tcGxleCB0eXBlLjwvY21kPg0KLTxpbmZvPllvdSBjYW4gZWl0aGVyIHNldCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdSBjYW4gYWRkDQotYSBjb250ZW50IG1vZGVsIHRvIGl0ICh3aGljaCByZXByZXNlbnRzIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUNCi1hbiBlbGVtZW50KSwgYnV0IHlvdSBjYW5ub3QgZG8gYm90aC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgY29udGVudCBtb2RlbHMsDQotcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPnJlc3RyaWN0aW9uPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+ZXh0ZW5zaW9uPC91aWNvbnRyb2w+IGZyb20NCi10aGUgPHVpY29udHJvbD5Jbmhlcml0ZWQgYnk8L3VpY29udHJvbD4gbGlzdC48L2NtZD48aW5mbz5UaGlzIHNwZWNpZmllcyB3aGV0aGVyDQoteW91ciB0eXBlIGlzIGRlcml2ZWQgZnJvbSBpdHMgYmFzZSB0eXBlIGJ5IHJlc3RyaWN0aW9uIG9yIGV4dGVuc2lvbi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIERlc2lnbiB2aWV3IHdpbGwgZGlzcGxheSB0aGUgYXR0cmlidXRlcyB3aXRoaW4gdGhlIGNvbXBsZXgNCi10eXBlLjwvY21kPjxpbmZvPllvdSBjYW4gYWxzbyB1c2UgdGhpcyB2aWV3IHRvIGFkZCBhdHRyaWJ1dGVzIHRvIHlvdXIgY29tcGxleA0KLXR5cGUuIEFuIGF0dHJpYnV0ZSBhc3NvY2lhdGVzIGFuIGF0dHJpYnV0ZSBuYW1lIHdpdGggYSBzcGVjaWZpYyB0eXBlIGFuZCB2YWx1ZS48L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT5UbyBhZGQgYW4gYXR0cmlidXRlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0IGNsaWNrIHlvdXIgY29tcGxleA0KLXR5cGUgYW5kIHNlbGVjdCA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGU8L3VpY29udHJvbD4uPHVsPg0KLTxsaT48dWljb250cm9sPm5hbWU8L3VpY29udHJvbD4uIEluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIG5hbWUgb2YgdGhlDQotYXR0cmlidXRlIHRvIG1ha2UgYSBjaGFuZ2UuPC9saT4NCi08bGk+PHVpY29udHJvbD50eXBlPC91aWNvbnRyb2w+LiBJbiB0aGUgRGVzaWduIHZpZXcsIGNsaWNrIHRoZSB0eXBlIG9mIHRoZQ0KLWF0dHJpYnV0ZSB0byBtYWtlIGEgY2hhbmdlLiBUaGUgZHJvcC1kb3duIG1lbnUgcHJvdmlkZXMgY29tbW9ubHkgdXNlZCB0eXBlcy4NCi1Gb3IgbW9yZSBvcHRpb25zLCBzaW1wbHkgc2VsZWN0IDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGZyb20gdGhlIG1lbnUuPC9saT4NCi08L3VsPjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGF0dHJpYnV0ZS4NCi1UbyBhZGQgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29tcGxleA0KLXR5cGUgY29udGFpbmluZyB0aGUgZWxlbWVudCwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZSBSZWY8L3VpY29udHJvbD4uPC9jbWQ+DQotPGluZm8+QSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgYXR0cmlidXRlIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQNCi1hdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcNCi1kZWNsYXJhdGlvbi4gU2VsZWN0IHRoZSByZWZlcmVuY2UsIHRoZW4gc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQNCi1pdCB0byByZWZlcmVuY2UgaW4gdGhlIFByb3BlcnRpZXMgdmlldywgZnJvbSB0aGU8dWljb250cm9sPiBSZWY8L3VpY29udHJvbD4gbWVudS48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUNCi1ncm91cC4gVG8gYWRkIGFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sNCi10aGUgY29tcGxleCB0eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGUNCi1Hcm91cCBSZWY8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+QSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYW4gYXR0cmlidXRlDQotZ3JvdXAgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudA0KLWluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gU2VsZWN0IHRoZSByZWZlcmVuY2UsIHRoZW4NCi1zZWxlY3QgdGhlIGF0dHJpYnV0ZSBncm91cCB5b3Ugd2FudCBpdCB0byByZWZlcmVuY2UgaW4gdGhlIFByb3BlcnRpZXMgdmlldywNCi1mcm9tIHRoZTx1aWNvbnRyb2w+IFJlZjwvdWljb250cm9sPiBtZW51LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbiA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50IGVuYWJsZXMgZWxlbWVudCBjb250ZW50IGFjY29yZGluZw0KLXRvIG5hbWVzcGFjZXMsIGFuZCB0aGUgY29ycmVzcG9uZGluZyA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGUgZWxlbWVudA0KLWVuYWJsZXMgYXR0cmlidXRlcyB0byBhcHBlYXIgaW4gZWxlbWVudHMuIFRvIGFkZCBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGUsDQotcmlnaHQtY2xpY2sgaW4gdGhlIGNvbXBsZXggdHlwZSBoZWFkZXIsIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBBbnkgQXR0cmlidXRlPC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPllvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgYW4gPGNvZGVwaD5hbnk8L2NvZGVwaD4gYXR0cmlidXRlOjwvaW5mbz4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPkZvciBhIDx1aWNvbnRyb2w+bmFtZXNwYWNlPC91aWNvbnRyb2w+IDw/UHViIENhcmV0MT8+dmFsdWUsIHlvdSBjYW4NCi1zZWxlY3Q6PHVsPg0KLTxsaT48Yj4jI2FueTwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgZnJvbSBhbnkgbmFtZXNwYWNlLjwvbGk+DQotPGxpPjxiPiMjbG9jYWwgPC9iPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBkZWNsYXJlZA0KLXRvIGJlIGluIGEgbmFtZXNwYWNlLjwvbGk+DQotPGxpPjxiPiMjb3RoZXI8L2I+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIHRoYXQgaXMgbm90IGZyb20gdGhlIHRhcmdldA0KLW5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+DQotPGxpPjxiPiMjdGFyZ2V0TmFtZXNwYWNlIDwvYj4uIFRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQ0KLW9mIHRoZSB0eXBlIGJlaW5nIGRlZmluZWQuPC9saT4NCi08L3VsPjwvY2hvaWNlPg0KLTxjaG9pY2U+Rm9yIGEgPHVpY29udHJvbD5wcm9jZXNzQ29udGVudHM8L3VpY29udHJvbD4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0Ojx1bD4NCi08bGk+PGI+c2tpcDwvYj4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm90IHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudA0KLWF0IGFsbC48L2xpPg0KLTxsaT48Yj5sYXg8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudCBhcyBtdWNoDQotYXMgaXQgY2FuLjwvbGk+DQotPGxpPjxiPnN0cmljdDwvYj4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgdmFsaWRhdGUgYWxsIHRoZSBhdHRyaWJ1dGUgY29udGVudC48L2xpPg0KLTwvdWw+PC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxpbmZvPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcGxleCB0eXBlLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwNjIwNz8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkY214dC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjA0YzQwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGNteHQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgY29tcGxleCB0eXBlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGNvbXBsZXggdHlwZSBhbGxvd3MgZWxlbWVudHMgaW4gaXRzIGNvbnRlbnQgYW5kIGNhbiBjYXJyeSBhdHRyaWJ1dGVzLiBDb21wbGV4IHR5cGVzIGNhbiBiZSB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IGZvciBhbnkgaW5zdGFuY2UgZG9jdW1lbnRzIGdlbmVyYXRlZCBmcm9tIG9yIGFzc29jaWF0ZWQgd2l0aCB5b3VyIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgY29tcGxleCB0eXBlIGFsbG93cyBlbGVtZW50cyBpbiBpdHMgY29udGVudCBhbmQgY2FuIGNhcnJ5IGF0dHJpYnV0ZXMuIENvbXBsZXggdHlwZXMgY2FuIGJlIHVzZWQgdG8gaGVscCBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGNvbnRlbnQgZm9yIGFueSBpbnN0YW5jZSBkb2N1bWVudHMgZ2VuZXJhdGVkIGZyb20gb3IgYXNzb2NpYXRlZCB3aXRoIHlvdXIgWE1MIHNjaGVtYS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBjb21wbGV4IHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzLCBjb21wbGV4IHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgY29tcGxleCB0eXBlcywgWE1MIHNjaGVtYSBmaWxlcywgY29tcGxleCB0eXBlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRjbXh0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGNvbXBsZXggdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRjbXh0Ij48YSBuYW1lPSJ0YWRkY214dCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGNvbXBsZXggdHlwZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgY29tcGxleCB0eXBlIGFsbG93cyBlbGVtZW50cyBpbiBpdHMgY29udGVudCBhbmQgY2FuIGNhcnJ5IGF0dHJpYnV0ZXMuCi1Db21wbGV4IHR5cGVzIGNhbiBiZSB1c2VkIHRvIGhlbHAgZGV0ZXJtaW5lIHRoZSBhcHByb3ByaWF0ZSBjb250ZW50IGZvciBhbnkKLWluc3RhbmNlIGRvY3VtZW50cyBnZW5lcmF0ZWQgZnJvbSBvciBhc3NvY2lhdGVkIHdpdGggeW91ciBYTUwgc2NoZW1hLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+WW91IGNhbiBhZGQgYXMgbWFueSBjb21wbGV4IHR5cGVzIGFzIHlvdSB3YW50IHRvIGFuIFhNTCBzY2hlbWEuPC9wPgotPHA+VGhlCi1mb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleQotd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgY29tcGxleCB0eXBlIHRvCi1hbiBYTUwgc2NoZW1hLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlJpZ2h0LWNsaWNrIHRoZSBUeXBlcyBjYXRlZ29yeSBpbiB0aGUgRGVzaWduIHZpZXcsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUNvbXBsZXggVHlwZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgY29tcGxleCB0eXBlIGluCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iQnJvd3NlIGljb24iIC8+IHRvIHNlbGVjdCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUuPC9zcGFuPgotIFlvdSBjYW4gZWl0aGVyIHNldCBhIGJhc2UgdHlwZSBmb3IgeW91ciBjb21wbGV4IHR5cGUsIG9yIHlvdSBjYW4gYWRkCi1hIGNvbnRlbnQgbW9kZWwgdG8gaXQgKHdoaWNoIHJlcHJlc2VudHMgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZQotYW4gZWxlbWVudCksIGJ1dCB5b3UgY2Fubm90IGRvIGJvdGguIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGNvbnRlbnQgbW9kZWxzLAotcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cmVzdHJpY3Rpb248L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmV4dGVuc2lvbjwvc3Bhbj4gZnJvbQotdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkluaGVyaXRlZCBieTwvc3Bhbj4gbGlzdC48L3NwYW4+IFRoaXMgc3BlY2lmaWVzIHdoZXRoZXIKLXlvdXIgdHlwZSBpcyBkZXJpdmVkIGZyb20gaXRzIGJhc2UgdHlwZSBieSByZXN0cmljdGlvbiBvciBleHRlbnNpb24uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSBEZXNpZ24gdmlldyB3aWxsIGRpc3BsYXkgdGhlIGF0dHJpYnV0ZXMgd2l0aGluIHRoZSBjb21wbGV4Ci10eXBlLjwvc3Bhbj4gWW91IGNhbiBhbHNvIHVzZSB0aGlzIHZpZXcgdG8gYWRkIGF0dHJpYnV0ZXMgdG8geW91ciBjb21wbGV4Ci10eXBlLiBBbiBhdHRyaWJ1dGUgYXNzb2NpYXRlcyBhbiBhdHRyaWJ1dGUgbmFtZSB3aXRoIGEgc3BlY2lmaWMgdHlwZSBhbmQgdmFsdWUuCi08dWw+Ci08bGk+VG8gYWRkIGFuIGF0dHJpYnV0ZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodCBjbGljayB5b3VyIGNvbXBsZXgKLXR5cGUgYW5kIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlPC9zcGFuPi48dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+bmFtZTwvc3Bhbj4uIEluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIG5hbWUgb2YgdGhlCi1hdHRyaWJ1dGUgdG8gbWFrZSBhIGNoYW5nZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+dHlwZTwvc3Bhbj4uIEluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIHR5cGUgb2YgdGhlCi1hdHRyaWJ1dGUgdG8gbWFrZSBhIGNoYW5nZS4gVGhlIGRyb3AtZG93biBtZW51IHByb3ZpZGVzIGNvbW1vbmx5IHVzZWQgdHlwZXMuCi1Gb3IgbW9yZSBvcHRpb25zLCBzaW1wbHkgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gZnJvbSB0aGUgbWVudS48L2xpPgotCi08L3VsPgotPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGF0dHJpYnV0ZS4KLVRvIGFkZCBhbiBhdHRyaWJ1dGUgcmVmZXJlbmNlLCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb21wbGV4Ci10eXBlIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQXR0cmlidXRlIFJlZjwvc3Bhbj4uPC9zcGFuPgotIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkCi1hdHRyaWJ1dGUgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcKLWRlY2xhcmF0aW9uLiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSBncm91cCB5b3Ugd2FudAotaXQgdG8gcmVmZXJlbmNlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGZyb20gdGhlPHNwYW4gY2xhc3M9InVpY29udHJvbCI+IFJlZjwvc3Bhbj4gbWVudS4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUKLWdyb3VwLiBUbyBhZGQgYW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSwgaW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljawotdGhlIGNvbXBsZXggdHlwZSBjb250YWluaW5nIHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZQotR3JvdXAgUmVmPC9zcGFuPi48L3NwYW4+IEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGFuIGF0dHJpYnV0ZQotZ3JvdXAgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudAotaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbgotc2VsZWN0IHRoZSBhdHRyaWJ1dGUgZ3JvdXAgeW91IHdhbnQgaXQgdG8gcmVmZXJlbmNlIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsCi1mcm9tIHRoZTxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPiBSZWY8L3NwYW4+IG1lbnUuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgZW5hYmxlcyBlbGVtZW50IGNvbnRlbnQgYWNjb3JkaW5nCi10byBuYW1lc3BhY2VzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhdHRyaWJ1dGUgZWxlbWVudAotZW5hYmxlcyBhdHRyaWJ1dGVzIHRvIGFwcGVhciBpbiBlbGVtZW50cy4gVG8gYWRkIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlLAotcmlnaHQtY2xpY2sgaW4gdGhlIGNvbXBsZXggdHlwZSBoZWFkZXIsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgQW55IEF0dHJpYnV0ZTwvc3Bhbj4uPC9zcGFuPgotIFlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHZhbHVlcyBmb3IgYW4gPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhdHRyaWJ1dGU6Ci08dWw+Ci08bGk+Rm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+bmFtZXNwYWNlPC9zcGFuPiB2YWx1ZSwgeW91IGNhbgotc2VsZWN0Ojx1bD4KLTxsaT48c3Ryb25nPiMjYW55PC9zdHJvbmc+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPgotCi08bGk+PHN0cm9uZz4jI2xvY2FsIDwvc3Ryb25nPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBkZWNsYXJlZAotdG8gYmUgaW4gYSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNvdGhlcjwvc3Ryb25nPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tIHRoZSB0YXJnZXQKLW5hbWVzcGFjZSBvZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjdGFyZ2V0TmFtZXNwYWNlIDwvc3Ryb25nPi4gVGhpcyBpcyBzaG9ydGhhbmQgZm9yIHRoZSB0YXJnZXQgbmFtZXNwYWNlCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGk+Rm9yIGEgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cHJvY2Vzc0NvbnRlbnRzPC9zcGFuPiB2YWx1ZSwgeW91IGNhbiBzZWxlY3Q6PHVsPgotPGxpPjxzdHJvbmc+c2tpcDwvc3Ryb25nPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCBub3QgdmFsaWRhdGUgdGhlIGF0dHJpYnV0ZSBjb250ZW50Ci1hdCBhbGwuPC9saT4KLQotPGxpPjxzdHJvbmc+bGF4PC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudCBhcyBtdWNoCi1hcyBpdCBjYW4uPC9saT4KLQotPGxpPjxzdHJvbmc+c3RyaWN0PC9zdHJvbmc+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgYXR0cmlidXRlIGNvbnRlbnQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvdWw+Ci0KLSA8L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29tcGxleCB0eXBlLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiB0aXRsZT0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDA5OTkuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGVsbSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZWxlbWVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+RWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zDQotcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sDQotZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywNCi1hbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+ZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5lbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+ZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBlbGVtZW50OjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+VG8gYWRkIGFuIGVsZW1lbnQsIGluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQNCi1tb2RlbCB5b3Ugd2FudCB0byB3b3JrIHdpdGggYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEVsZW1lbnQ8L3VpY29udHJvbD4uPC9jbWQ+DQotPGluZm8+VGhlIGVsZW1lbnQgYXBwZWFycyBhdHRhY2hlZCB0byB0aGUgY29udGVudCBtb2RlbCBpbiB0aGUgRGVzaWduIHZpZXcuPC9pbmZvPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgdGhlIGN1cnJlbnQNCi0oZGVmYXVsdCkgbmFtZSBvZiB0aGUgZWxlbWVudCwgd2hpY2ggcHV0cyB5b3UgaW4gZGlyZWN0IGVkaXRpbmcgbW9kZSwgdGhlbg0KLXR5cGUgdGhlIG5ldyA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gYW5kIHByZXNzIGVudGVyLjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQgKGRlZmF1bHQpIGVsZW1lbnQgdHlwZQ0KLWFuZCBzZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUuIEFsdGVybmF0ZWx5LCB5b3UgY2FuIHNlbGVjdCBicm93c2UgdG8gaW52b2tlDQotdGhlIFNldCBUeXBlIGRpYWxvZyBmb3IgbW9yZSBvcHRpb25zLjwvY21kPjxpbmZvPlRoZSBTZXQgVHlwZSBkaWFsb2cgbGlzdHMNCi1hbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZg0KLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluDQoteW91ciB3b3Jrc3BhY2UuIDwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RW5jbG9zaW5nIFByb2plY3Q8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIEluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUNCi1pbiB0aGUgPHVpY29udHJvbD5NaW5PY2N1cnM8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhpcyBpcyB0aGUgPD9QdWIgQ2FyZXQ/Pm51bWJlcg0KLW9mIHRpbWVzIHRoZSBlbGVtZW50IGNhbiBhcHBlYXIgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIElmIHlvdSB3YW50IHRoZSBlbGVtZW50DQotdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4uIE90aGVyd2lzZSwgc2VsZWN0IDx1aWNvbnRyb2w+MTwvdWljb250cm9sPi4gPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NYXhPY2N1cnM8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPGluZm8+VGhpcyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZQ0KLWRvY3VtZW50LiBTZWxlY3QgPHVpY29udHJvbD51bmJvdW5kZWQ8L3VpY29udHJvbD4gdG8gaW5kaWNhdGUgdGhlcmUgaXMgbm8NCi1tYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhbiBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24NCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbg0KLWFib3V0IHdvcmtpbmcgd2l0aCBjb250ZW50IG1vZGVscywgcmVmZXIgdG8gdGhlIHJlbGF0ZWQgdGFza3MuPC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA0MDc5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY5ZjFjLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJFbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMgcHJvdmlkZSB2YWx1ZSBjb25zdHJhaW50cywgcHJvdmlkZSBhIGRlc2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHZhbGlkYXRpb24sIGVzdGFibGlzaCBjb25zdHJhaW5pbmcgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIHJlbGF0ZWQgZWxlbWVudHMgYW5kIGF0dHJpYnV0ZXMsIGFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkVsZW1lbnRzIGFyZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgaW4gWE1MLiBFbGVtZW50IGRlY2xhcmF0aW9ucyBwcm92aWRlIHZhbHVlIGNvbnN0cmFpbnRzLCBwcm92aWRlIGEgZGVzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiwgZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywgYW5kIGNvbnRyb2wgdGhlIHN1YnN0aXR1dGlvbiBvZiBlbGVtZW50cy4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRjbW9kLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZWxtci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRnbGJhLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGVsbSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGVsbSI+PGEgbmFtZT0idGFkZGVsbSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGVsZW1lbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5FbGVtZW50cyBhcmUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIGluIFhNTC4gRWxlbWVudCBkZWNsYXJhdGlvbnMKLXByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLAotZXN0YWJsaXNoIGNvbnN0cmFpbmluZyByZWxhdGlvbnNoaXBzIGJldHdlZW4gcmVsYXRlZCBlbGVtZW50cyBhbmQgYXR0cmlidXRlcywKLWFuZCBjb250cm9sIHRoZSBzdWJzdGl0dXRpb24gb2YgZWxlbWVudHMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhbiBlbGVtZW50OjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFkZCBhbiBlbGVtZW50LCBpbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50Ci1tb2RlbCB5b3Ugd2FudCB0byB3b3JrIHdpdGggYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBFbGVtZW50PC9zcGFuPi48L3NwYW4+Ci0gVGhlIGVsZW1lbnQgYXBwZWFycyBhdHRhY2hlZCB0byB0aGUgY29udGVudCBtb2RlbCBpbiB0aGUgRGVzaWduIHZpZXcuCi08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgc2VsZWN0IHRoZSBlbGVtZW50LCBhbmQgY2xpY2sgdGhlIGN1cnJlbnQKLShkZWZhdWx0KSBuYW1lIG9mIHRoZSBlbGVtZW50LCB3aGljaCBwdXRzIHlvdSBpbiBkaXJlY3QgZWRpdGluZyBtb2RlLCB0aGVuCi10eXBlIHRoZSBuZXcgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gYW5kIHByZXNzIGVudGVyLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgY2xpY2sgdGhlIGN1cnJlbnQgKGRlZmF1bHQpIGVsZW1lbnQgdHlwZQotYW5kIHNlbGVjdCBhIHR5cGUgZnJvbSB0aGUgbWVudS4gQWx0ZXJuYXRlbHksIHlvdSBjYW4gc2VsZWN0IGJyb3dzZSB0byBpbnZva2UKLXRoZSBTZXQgVHlwZSBkaWFsb2cgZm9yIG1vcmUgb3B0aW9ucy48L3NwYW4+IFRoZSBTZXQgVHlwZSBkaWFsb2cgbGlzdHMKLWFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY29wZTwvc3Bhbj4gb2YKLXRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlIGZvbGxvd2luZyBvcHRpb25zOjx1bD4KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3Jrc3BhY2U8L3NwYW4+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZSBpbgoteW91ciB3b3Jrc3BhY2UuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5FbmNsb3NpbmcgUHJvamVjdDwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4KLQotPGxpPihEZWZhdWx0KSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5DdXJyZW50IFJlc291cmNlPC9zcGFuPi4gTGlzdCBhbGwgb2YgdGhlIHR5cGVzCi1hdmFpbGFibGUgaW4geW91ciBjdXJyZW50IGZpbGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtpbmcgU2V0czwvc3Bhbj4uIExpc3QgYWxsIHRoZSB0eXBlcyBhdmFpbGFibGUgd2l0aGluCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBJbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlCi1pbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TWluT2NjdXJzPC9zcGFuPiBmaWVsZC48L3NwYW4+IFRoaXMgaXMgdGhlIG51bWJlcgotb2YgdGltZXMgdGhlIGVsZW1lbnQgY2FuIGFwcGVhciBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSWYgeW91IHdhbnQgdGhlIGVsZW1lbnQKLXRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4uIE90aGVyd2lzZSwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPjE8L3NwYW4+LiAKLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NYXhPY2N1cnM8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgZWxlbWVudCBjYW4gYXBwZWFyIGluIGFuIGluc3RhbmNlCi1kb2N1bWVudC4gU2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnVuYm91bmRlZDwvc3Bhbj4gdG8gaW5kaWNhdGUgdGhlcmUgaXMgbm8KLW1heGltdW0gbnVtYmVyIG9mIG9jY3VycmVuY2VzLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50Ljwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5Zb3UgY2FuIGFkZCBhIGNvbnRlbnQgbW9kZWwgdG8gYW4gZWxlbWVudCwgd2hpY2ggaXMgdGhlIHJlcHJlc2VudGF0aW9uCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQgbW9kZWxzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgdGl0bGU9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIHRpdGxlPSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIj5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ2xiYS5odG1sIiB0aXRsZT0iQSBnbG9iYWwgYXR0cmlidXRlIGlzIGFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSByZWNvZ25pemVkIGFueXdoZXJlIGluIGEgZG9jdW1lbnQuIE9uY2UgZGVjbGFyZWQsIGEgZ2xvYmFsIGF0dHJpYnV0ZSBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUgb3IgbW9yZSBkZWNsYXJhdGlvbnMgdXNpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS4iPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDY2NzUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZWxtci5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRlbG1yIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuDQotQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbA0KLWVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcNCi1kZWNsYXJhdGlvbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5lbGVtZW50DQotcmVmZXJlbmNlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmVsZW1lbnQNCi1yZWZlcmVuY2VzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTA0KLXNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5lbGVtZW50IHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmVsZW1lbnQgcmVmZXJlbmNlczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGFuIGVsZW1lbnQNCi1yZWZlcmVuY2U6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIHRoZSBjb250ZW50IG1vZGVsIHlvdSB3YW50IHRvIHdvcmsNCi13aXRoIGFuZCBjbGljayA8dWljb250cm9sPkFkZCBFbGVtZW50IFJlZjwvdWljb250cm9sPi48L2NtZD48c3RlcHJlc3VsdD5JZg0KLW5vIGdsb2JhbCBlbGVtZW50IGlzIGRlZmluZWQgaW4gdGhlIGRvY3VtZW50LCBhIG5ldyBnbG9iYWwgZWxlbWVudCBpcyBjcmVhdGVkDQotZm9yIHlvdSwgYW5kIHRoZSBlbGVtZW50IHJlZmVyZW5jZSB3aWxsIHBvaW50IHRvIGl0Ljwvc3RlcHJlc3VsdD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLiBUbyBzcGVjaWZ5IHZhbHVlcyBmb3IgYW4gZWxlbWVudA0KLXJlZmVyZW5jZTo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPkNsaWNrIHRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IHJlZmVyZW5jZSBpbiB0aGUgRGVzaWduIHZpZXcuIEVudGVyDQotdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLjwvY2hvaWNlPg0KLTxjaG9pY2U+Q2xpY2sgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIHR5cGUgaW4gdGhlIERlc2lnbjw/UHViIENhcmV0Pz4gdmlldy4NCi1TZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUsIG9yIHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmb3IgbW9yZQ0KLW9wdGlvbnMuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPihPcHRpb25hbCkgU2VsZWN0IHRoZSBhcHByb3ByaWF0ZSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5NaW5PY2N1cnM8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPGluZm8+VGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwgZWxlbWVudCByZWZlcmVuY2VkIGNhbiBhcHBlYXINCi1pbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSWYgeW91IHdhbnQgdGhlIGVsZW1lbnQgdG8gYmUgb3B0aW9uYWwsIHNlbGVjdCA8dWljb250cm9sPjA8L3VpY29udHJvbD4uDQotT3RoZXJ3aXNlLCBzZWxlY3QgPHVpY29udHJvbD4xPC91aWNvbnRyb2w+LiA8L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8dWljb250cm9sPk1heE9jY3VyczwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08aW5mbz5UaGlzIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgZ2xvYmFsIGVsZW1lbnQgcmVmZXJlbmNlZCBjYW4NCi1hcHBlYXIuIFlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+dW5ib3VuZGVkPC91aWNvbnRyb2w+IHRvIGluZGljYXRlIHRoZXJlDQotaXMgbm8gbWF4aW11bSBudW1iZXIgb2Ygb2NjdXJyZW5jZXMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBlbGVtZW50IHJlZmVyZW5jZS48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDMyMzI/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGVsbXIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAxNzdlYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRlbG1yLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFuIGVsZW1lbnQgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGVsZW1lbnQuIEEgZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGEgZ2xvYmFsIGVsZW1lbnQgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBnbG9iYWwgZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQW4gZWxlbWVudCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYSBnbG9iYWwgZWxlbWVudC4gQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbCBlbGVtZW50IHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGVsZW1lbnQgcmVmZXJlbmNlcywgWE1MIHNjaGVtYSBmaWxlcywgZWxlbWVudCByZWZlcmVuY2VzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgZWxlbWVudCByZWZlcmVuY2VzLCBYTUwgc2NoZW1hIGZpbGVzLCBlbGVtZW50IHJlZmVyZW5jZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGdsZW0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRlbG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRhbnllLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ2xiYS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRlbG1yIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIGVsZW1lbnQgcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGVsbXIiPjxhIG5hbWU9InRhZGRlbG1yIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LgotQSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBnbG9iYWwgZWxlbWVudCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdsb2JhbAotZWxlbWVudCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZwotZGVjbGFyYXRpb24uPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhbiBlbGVtZW50Ci1yZWZlcmVuY2U6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayB0aGUgY29udGVudCBtb2RlbCB5b3Ugd2FudCB0byB3b3JrCi13aXRoIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgRWxlbWVudCBSZWY8L3NwYW4+Ljwvc3Bhbj4gSWYKLW5vIGdsb2JhbCBlbGVtZW50IGlzIGRlZmluZWQgaW4gdGhlIGRvY3VtZW50LCBhIG5ldyBnbG9iYWwgZWxlbWVudCBpcyBjcmVhdGVkCi1mb3IgeW91LCBhbmQgdGhlIGVsZW1lbnQgcmVmZXJlbmNlIHdpbGwgcG9pbnQgdG8gaXQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5TZWxlY3QgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLiBUbyBzcGVjaWZ5IHZhbHVlcyBmb3IgYW4gZWxlbWVudAotcmVmZXJlbmNlOjwvc3Bhbj4KLTx1bD4KLTxsaT5DbGljayB0aGUgbmFtZSBvZiB0aGUgZWxlbWVudCByZWZlcmVuY2UgaW4gdGhlIERlc2lnbiB2aWV3LiBFbnRlcgotdGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgcmVmZXJlbmNlLjwvbGk+Ci0KLTxsaT5DbGljayB0aGUgZWxlbWVudCByZWZlcmVuY2UgdHlwZSBpbiB0aGUgRGVzaWduIHZpZXcuCi1TZWxlY3QgYSB0eXBlIGZyb20gdGhlIG1lbnUsIG9yIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGZvciBtb3JlCi1vcHRpb25zLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBTZWxlY3QgdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5NaW5PY2N1cnM8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSBUaGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGdsb2JhbCBlbGVtZW50IHJlZmVyZW5jZWQgY2FuIGFwcGVhcgotaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIElmIHlvdSB3YW50IHRoZSBlbGVtZW50IHRvIGJlIG9wdGlvbmFsLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+MDwvc3Bhbj4uCi1PdGhlcndpc2UsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj4xPC9zcGFuPi4gPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIFNlbGVjdCB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1heE9jY3Vyczwvc3Bhbj4gZmllbGQuPC9zcGFuPgotIFRoaXMgaXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBnbG9iYWwgZWxlbWVudCByZWZlcmVuY2VkIGNhbgotYXBwZWFyLiBZb3UgY2FuIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmJvdW5kZWQ8L3NwYW4+IHRvIGluZGljYXRlIHRoZXJlCi1pcyBubyBtYXhpbXVtIG51bWJlciBvZiBvY2N1cnJlbmNlcy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZWxlbWVudCByZWZlcmVuY2UuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRnbGVtLmh0bWwiIHRpdGxlPSJBIGdsb2JhbCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgd2l0aCBhIGdsb2JhbCBzY29wZS4gSXQgaXMgb25lIHRoYXQgaGFzIGJlZW4gZGVjbGFyZWQgYXMgcGFydCBvZiB0aGUgbWFpbiBzY2hlbWEgcmF0aGVyIHRoYW4gYXMgcGFydCBvZiBhIGNvbnRlbnQgbW9kZWwuIj5BZGRpbmcgZ2xvYmFsIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGVsbS5odG1sIiB0aXRsZT0iRWxlbWVudHMgYXJlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBpbiBYTUwuIEVsZW1lbnQgZGVjbGFyYXRpb25zIHByb3ZpZGUgdmFsdWUgY29uc3RyYWludHMsIHByb3ZpZGUgYSBkZXNjcmlwdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLCBlc3RhYmxpc2ggY29uc3RyYWluaW5nIHJlbGF0aW9uc2hpcHMgYmV0d2VlbiByZWxhdGVkIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzLCBhbmQgY29udHJvbCB0aGUgc3Vic3RpdHV0aW9uIG9mIGVsZW1lbnRzLiI+QWRkaW5nIGVsZW1lbnRzPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGFueWUuaHRtbCIgdGl0bGU9IllvdSBjYW4gdXNlIHRoZSBhbnkgZWxlbWVudCBpbiBhIHNpbWlsYXIgd2F5IGFzIGEgRFREJ3MgQU5ZIGNvbnRlbnQgbW9kZWwsIGhvd2V2ZXIsIGl0IG11c3QgYmUgZG9uZSBpbiBjb25qdW5jdGlvbiB3aXRoIG5hbWVzcGFjZXMuIFRoaXMgZW5hYmxlcyB5b3UgdG8gaW5jbHVkZSBhbnkgd2VsbC1mb3JtZWQgWE1MIGNvbnRlbnQsIHN1Y2ggYXMgYW4gSFRNTCBXZWIgcGFnZSB0aGF0IGNvbmZvcm1zIHRvIFhIVE1MIDEuMCBzeW50YXguIj5BZGRpbmcgYW4gYW55IGVsZW1lbnQ8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkZ2xiYS5odG1sIiB0aXRsZT0iQSBnbG9iYWwgYXR0cmlidXRlIGlzIGFuIGF0dHJpYnV0ZSB0aGF0IGNhbiBiZSByZWNvZ25pemVkIGFueXdoZXJlIGluIGEgZG9jdW1lbnQuIE9uY2UgZGVjbGFyZWQsIGEgZ2xvYmFsIGF0dHJpYnV0ZSBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUgb3IgbW9yZSBkZWNsYXJhdGlvbnMgdXNpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS4iPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzVlMWMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRnbGJhIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBnbG9iYWwgYXR0cmlidXRlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUNCi1pbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lDQotb3IgbW9yZSBkZWNsYXJhdGlvbnMgdXNpbmcgYW4gYXR0cmlidXRlIHJlZmVyZW5jZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5nbG9iYWwgYXR0cmlidXRlczwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmdsb2JhbCBhdHRyaWJ1dGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Z2xvYmFsIGF0dHJpYnV0ZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmdsb2JhbCBhdHRyaWJ1dGVzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLA0KLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBnbG9iYWwNCi1hdHRyaWJ1dGU6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+QXR0cmlidXRlczwvYj4gc2VjdGlvbg0KLWFuZCBjbGljayA8dWljb250cm9sPkFkZCBBdHRyaWJ1dGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgZW50ZXIgYSBuYW1lIGZvciB0aGUgYXR0cmlidXRlIGluIHRoZSA8dWljb250cm9sPk5hbWU8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgeW91IGNhbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSA8dWljb250cm9sPlR5cGU8L3VpY29udHJvbD4gZnJvbQ0KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPjxwPkFsdGVybmF0aXZlbHk8P1B1YiBDYXJldD8+LCB5b3UgY2FuIHNlbGVjdCA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiBmcm9tDQotdGhlIGxpc3QgZm9yIG1vcmUgb3B0aW9ucy4gPC9wPjxwPlRoZSBTZXQgVHlwZSBkaWFsb2cgd2lsbCBhcHBlYXIsIGFuZCBsaXN0cw0KLWFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlNjb3BlPC91aWNvbnRyb2w+IG9mDQotdGhlIGxpc3QgYnkgc2VsZWN0aW5nIG9uZSBvZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPg0KLTxsaT48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4NCi15b3VyIHdvcmtzcGFjZS4gPC9saT4NCi08bGk+PHVpY29udHJvbD5FbmNsb3NpbmcgUHJvamVjdDwvdWljb250cm9sPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUNCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4NCi08bGk+KERlZmF1bHQpIDx1aWNvbnRyb2w+Q3VycmVudCBSZXNvdXJjZTwvdWljb250cm9sPi4gTGlzdCBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+V29ya2luZyBTZXRzPC91aWNvbnRyb2w+LiBMaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbg0KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPg0KLTwvdWw+PC9wPjxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIDwvcD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdsb2JhbCBhdHRyaWJ1dGUuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMjMwPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGJhLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5YjBhYmYuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xiYS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lIG9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkEgZ2xvYmFsIGF0dHJpYnV0ZSBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBjYW4gYmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiBhIGRvY3VtZW50LiBPbmNlIGRlY2xhcmVkLCBhIGdsb2JhbCBhdHRyaWJ1dGUgY2FuIGJlIHJlZmVyZW5jZWQgaW4gb25lIG9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgZ2xvYmFsIGF0dHJpYnV0ZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBnbG9iYWwgYXR0cmlidXRlcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGdsYmEiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZ2xvYmFsIGF0dHJpYnV0ZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRnbGJhIj48YSBuYW1lPSJ0YWRkZ2xiYSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdsb2JhbCBhdHRyaWJ1dGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BIGdsb2JhbCBhdHRyaWJ1dGUgaXMgYW4gYXR0cmlidXRlIHRoYXQgY2FuIGJlIHJlY29nbml6ZWQgYW55d2hlcmUKLWluIGEgZG9jdW1lbnQuIE9uY2UgZGVjbGFyZWQsIGEgZ2xvYmFsIGF0dHJpYnV0ZSBjYW4gYmUgcmVmZXJlbmNlZCBpbiBvbmUKLW9yIG1vcmUgZGVjbGFyYXRpb25zIHVzaW5nIGFuIGF0dHJpYnV0ZSByZWZlcmVuY2UuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIGdsb2JhbAotYXR0cmlidXRlOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8c3Ryb25nPkF0dHJpYnV0ZXM8L3N0cm9uZz4gc2VjdGlvbgotYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBBdHRyaWJ1dGU8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGVudGVyIGEgbmFtZSBmb3IgdGhlIGF0dHJpYnV0ZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHNlbGVjdCB0aGUgYXR0cmlidXRlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGZyb20KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VHlwZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotIDxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gZnJvbQotdGhlIGxpc3QgZm9yIG1vcmUgb3B0aW9ucy4gPC9wPgotPGRpdiBjbGFzcz0icCI+VGhlIFNldCBUeXBlIGRpYWxvZyB3aWxsIGFwcGVhciwgYW5kIGxpc3RzCi1hbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLiBZb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mCi10aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4KLXlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JraW5nIFNldHM8L3NwYW4+LiBMaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbgotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2Rpdj4KLTxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk9LPC9zcGFuPi4gPC9wPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ2xvYmFsIGF0dHJpYnV0ZS48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPC9kaXY+Ci0KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwMTM5ZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRnbGVtLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRnbGVtIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZ2xvYmFsIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZ2xvYmFsIGVsZW1lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdA0KLWhhcyBiZWVuIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1haW4gc2NoZW1hIHJhdGhlciB0aGFuIGFzIHBhcnQgb2YgYSBjb250ZW50DQotbW9kZWwuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Z2xvYmFsIGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Z2xvYmFsIGVsZW1lbnRzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Z2xvYmFsIGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5nbG9iYWwgZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIGdsb2JhbA0KLWVsZW1lbnQ6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvY21kPjxpbmZvPlRoZSBlbnRpcmUNCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPGI+RWxlbWVudHM8L2I+IHNlY3Rpb24NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgRWxlbWVudDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYiwNCi1hbmQgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgZ2xvYmFsIGVsZW1lbnQgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHNlbGVjdCB0aGUgYXR0cmlidXRlIHR5cGUgZnJvbQ0KLXRoZSBwcmVkZWZpbmVkIGxpc3QgaW4gdGhlIG1lbnUgbmV4dCB0byB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTxpbmZvPjxwPkFsdGVybmF0aXZlbHksIHlvdSBjYW4gc2VsZWN0IDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGZyb20NCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+PHA+VGhlIDx1aWNvbnRyb2w+U2V0IFR5cGU8L3VpY29udHJvbD4gZGlhbG9nDQotYm94IGFwcGVhcnMsIGFuZCBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLg0KLVlvdSBjYW4gY2hhbmdlIHRoZSA8dWljb250cm9sPlNjb3BlPC91aWNvbnRyb2w+IG9mIHRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUNCi1vZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPg0KLTxsaT48dWljb250cm9sPldvcmtzcGFjZTwvdWljb250cm9sPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4NCi15b3VyIHdvcmtzcGFjZS4gPC9saT4NCi08bGk+PHVpY29udHJvbD5FbmNsb3NpbmcgUHJvamVjdDwvdWljb250cm9sPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUNCi1pbiB0aGUgcHJvamVjdCB0aGF0IGNvbnRhaW5zIHlvdXIgZmlsZS4gPC9saT4NCi08bGk+KERlZmF1bHQpIDx1aWNvbnRyb2w+Q3VycmVudCBSZXNvdXJjZTwvdWljb250cm9sPi4gTGlzdCBhbGwgb2YgdGhlIHR5cGVzDQotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+DQotPGxpPjx1aWNvbnRyb2w+V29ya2luZyBTZXRzPC91aWNvbnRyb2w+LiBMaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbg0KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPg0KLTwvdWw+PC9wPjxwPlNlbGVjdCB0aGUgdHlwZSB5b3Ugd2FudCBpbiB0aGUgdHlwZSBsaXN0LCB0aGVuIGNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uIDwvcD48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+KE9wdGlvbmFsKSBDbGljayB0aGUgPHVpY29udHJvbD5PdGhlcjwvdWljb250cm9sPiB0YWIuPC9jbWQ+PGluZm8+SW4NCi10aGlzIHBhZ2UsIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9sbG93aW5nIHZhcmlvdXMgdmFsdWVzIGZvciB0aGUgZ2xvYmFsIGVsZW1lbnQ6IDwvaW5mbz4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+YWJzdHJhY3Q8L3VpY29udHJvbD4uIENsaWNrIDxiPnRydWUgPC9iPmlmIHlvdSB3YW50IHRoZQ0KLWdsb2JhbCBlbGVtZW50IHRvIGJlIGFic3RyYWN0LiBXaGVuIGEgZ2xvYmFsIGVsZW1lbnQgaXMgZGVjbGFyZWQgdG8gYmUgYWJzdHJhY3QsDQotaXQgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIEluc3RlYWQsIGEgbWVtYmVyIG9mIHRoYXQgZ2xvYmFsDQotZWxlbWVudCdzIHN1YnN0aXR1dGlvbiBncm91cCBtdXN0IGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPmJsb2NrPC91aWNvbnRyb2w+LiBUaGlzIGZpZWxkIGRldGVybWluZXMgd2hldGhlciB0aGUgZ2xvYmFsDQotZWxlbWVudCBtYXkgYmUgcmVwbGFjZWQgYnkgYW4gZWxlbWVudCBkZXJpdmVkIGZyb20gaXQuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPmZpbmFsPC91aWNvbnRyb2w+LiBUaGlzIGZpZWxkIGRldGVybWluZXMgd2hldGhlciB0aGlzIGdsb2JhbA0KLWVsZW1lbnQgbWF5IGJlIGRlcml2ZWQgZnJvbS48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Zml4ZWQvZGVmYXVsdDwvdWljb250cm9sPi4gQ2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gYW5kDQotc2VsZWN0IDx1aWNvbnRyb2w+Rml4ZWQ8L3VpY29udHJvbD4gb3IgPHVpY29udHJvbD5EZWZhdWx0PC91aWNvbnRyb2w+IGFuZA0KLXNwZWNpZnkgYW4gYXBwcm9wcmlhdGUgdmFsdWUuIElmIHlvdSBzZWxlY3QgPGI+Rml4ZWQ8L2I+LCB0aGUgZ2xvYmFsIGVsZW1lbnQNCi1oYXMgYSBmaXhlZCB2YWx1ZSwgd2hpY2ggY2Fubm90IGJlIGNoYW5nZWQuIElmIHlvdSBzZWxlY3QgPGI+RGVmYXVsdDwvYj4sDQotdGhlIGVsZW1lbnQgaGFzIGEgZGVmYXVsdCB2YWx1ZS48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+Zm9ybTwvdWljb250cm9sPi4gVXNlIHRoaXMgZmllbGQgdG8gaW5kaWNhdGUgaWYgdGhlIGFwcGVhcmFuY2UNCi1vZiB0aGlzIGdsb2JhbCBlbGVtZW50IGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hIChhbiBYTUwgZmlsZSBhc3NvY2lhdGVkDQotd2l0aCB0aGUgWE1MIHNjaGVtYSkgbXVzdCBiZSBxdWFsaWZpZWQgYnkgYSBuYW1lc3BhY2UuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPm5pbGxhYmxlPC91aWNvbnRyb2w+LiBTZWxlY3QgPGI+dHJ1ZTwvYj4gaWYgeW91IGRvIG5vdA0KLXdhbnQgdGhlIGdsb2JhbCBlbGVtZW50IHRvIGJlIGFibGUgdG8gaGF2ZSBhbnkgY2hpbGQgZWxlbWVudHMsIG9ubHkgYXR0cmlidXRlcy4gPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPnN1YnN0aXR1dGlvbkdyb3VwPC91aWNvbnRyb2w+LiBBIHN1YnN0aXR1dGlvbiBncm91cCBhbGxvd3MNCi1lbGVtZW50cyB0byBiZSBzdWJzdGl0dXRlZCBmb3Igb3RoZXIgZWxlbWVudHMuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkF0dHJpYnV0ZXM8L3VpY29udHJvbD4gdGFiLjwvY21kPjxpbmZvPllvdQ0KLWNhbiB1c2UgdGhpcyBwYWdlIHRvIGFkZCBhdHRyaWJ1dGVzLCBhdHRyaWJ1dGUgcmVmZXJlbmNlcywgYXR0cmlidXRlcyBncm91cA0KLXJlZmVyZW5jZXMsIGFuZCA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGVzIHRvIHlvdXIgZ2xvYmFsIGVsZW1lbnQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkFuIGF0dHJpYnV0ZSBhc3NvY2lhdGVzIGFuIGF0dHJpYnV0ZSBuYW1lIHdpdGggYSBzcGVjaWZpYyB0eXBlDQotYW5kIHZhbHVlLiBUbyBhZGQgYW4gYXR0cmlidXRlLCByaWdodC1jbGljayBpbiB0aGUgQXR0cmlidXRlcyBwYWdlLCBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1BdHRyaWJ1dGU8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+WW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFsdWVzIGZvcg0KLWFuIGF0dHJpYnV0ZTo8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPmZpeGVkL2RlZmF1bHQ8L3VpY29udHJvbD4uIENsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IGFuZA0KLXNlbGVjdCA8dWljb250cm9sPkZpeGVkPC91aWNvbnRyb2w+IG9yIDx1aWNvbnRyb2w+RGVmYXVsdDwvdWljb250cm9sPiBhbmQNCi1zcGVjaWZ5IGFuIGFwcHJvcHJpYXRlIHZhbHVlLiBJZiB5b3Ugc2VsZWN0IDxiPkZpeGVkPC9iPiwgdGhlIGF0dHJpYnV0ZSBoYXMNCi1hIGZpeGVkIHZhbHVlLCB3aGljaCBjYW5ub3QgYmUgY2hhbmdlZC4gSWYgeW91IHNlbGVjdCA8Yj5EZWZhdWx0PC9iPiwgdGhlDQotYXR0cmlidXRlIGhhcyBhIGRlZmF1bHQgdmFsdWUuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPmZvcm08L3VpY29udHJvbD4uIFVzZSB0aGlzIGZpZWxkIHRvIGluZGljYXRlIGlmIHRoZSBhcHBlYXJhbmNlDQotb2YgdGhpcyBhdHRyaWJ1dGUgaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFhNTCBzY2hlbWEgbXVzdCBiZSBxdWFsaWZpZWQgYnkgYQ0KLW5hbWVzcGFjZS48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+bmFtZTwvdWljb250cm9sPi4gRW50ZXIgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZS48L2Nob2ljZT4NCi08Y2hvaWNlPjx1aWNvbnRyb2w+dHlwZTwvdWljb250cm9sPi4gQ2xpY2sgPHVpY29udHJvbD5Ccm93c2U8L3VpY29udHJvbD4gYW5kDQotc2VsZWN0IHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuIDwvY2hvaWNlPg0KLTxjaG9pY2U+PHVpY29udHJvbD51c2U8L3VpY29udHJvbD4uIFRoaXMgZmllbGQgaW5kaWNhdGVzIGhvdyBhbiBhdHRyaWJ1dGUNCi1jYW4gYmUgdXNlZCBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSWYgeW91IHNlbGVjdCBvcHRpb25hbCwgdGhlIGF0dHJpYnV0ZQ0KLWNhbiBhcHBlYXIgb25jZSwgYnV0IGl0IGRvZXMgbm90IGhhdmUgdG8uIElmIHlvdSBzZWxlY3QgcmVxdWlyZWQsIHRoZSBhdHRyaWJ1dGUNCi1tdXN0IGFwcGVhciBvbmNlLiBJZiB5b3Ugc2VsZWN0IHByb2hpYml0ZWQsIHRoZSBhdHRyaWJ1dGUgbXVzdCBub3QgYXBwZWFyLiA8Yj5Ob3RlPC9iPjoNCi1JZiB5b3Ugc2VsZWN0ZWQgPHVpY29udHJvbD5EZWZhdWx0PC91aWNvbnRyb2w+LCB5b3UgbXVzdCBzZWxlY3QgPGI+b3B0aW9uYWw8L2I+IGluDQotdGhpcyBmaWVsZCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgbm90IGJlIHZhbGlkLjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbiBhdHRyaWJ1dGUgcmVmZXJlbmNlIHByb3ZpZGVzIGEgcmVmZXJlbmNlIHRvIGEgZ2xvYmFsIGF0dHJpYnV0ZS4NCi1UbyBhZGQgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSwgcmlnaHQtY2xpY2sgaW4gdGhlIEF0dHJpYnV0ZXMgcGFnZSwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotQXR0cmlidXRlIFJlZjwvdWljb250cm9sPi48L2NtZD48aW5mbz5BIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbA0KLWF0dHJpYnV0ZSBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZSB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50DQotaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiBUaGUgbWVudSBvcHRpb24gdG8gYWRkIGFuIGF0dHJpYnV0ZQ0KLXJlZmVyZW5jZSBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlIGdsb2JhbCBhdHRyaWJ1dGVzIGRlZmluZWQgZWxzZXdoZXJlIGluDQotdGhlIGRvY3VtZW50LiBTZWxlY3QgdGhlIHJlZmVyZW5jZSwgdGhlbiBzZWxlY3QgdGhlIGdsb2JhbCBhdHRyaWJ1dGUgeW91IHdhbnQNCi1pdCB0byByZWZlcmVuY2UgZnJvbSB0aGUgPHVpY29udHJvbD5yZWY8L3VpY29udHJvbD4gbGlzdC48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+QW4gYXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhbiBhdHRyaWJ1dGUNCi1ncm91cC4gVG8gYWRkIGFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UsIHJpZ2h0LWNsaWNrIGluIHRoZSBBdHRyaWJ1dGVzDQotcGFnZSwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEF0dHJpYnV0ZSBHcm91cCBSZWY8L3VpY29udHJvbD4uPC9jbWQ+PGluZm8+QQ0KLWRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhbiBhdHRyaWJ1dGUgZ3JvdXAgZW5hYmxlcyB0aGUgcmVmZXJlbmNlZCBhdHRyaWJ1dGUNCi1ncm91cCB0byBhcHBlYXIgaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50IGluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZw0KLWRlY2xhcmF0aW9uLiBUaGUgbWVudSBvcHRpb24gdG8gYWRkIGFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2Ugb25seSBhcHBlYXJzDQotaWYgdGhlcmUgYXJlIGF0dHJpYnV0ZSBncm91cHMgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50LiBTZWxlY3QgdGhlDQotcmVmZXJlbmNlLCB0aGVuIHNlbGVjdCB0aGUgYXR0cmlidXRlIGdyb3VwIHlvdSB3YW50IGl0IHRvIHJlZmVyZW5jZSBmcm9tIHRoZSA8dWljb250cm9sPnJlZjwvdWljb250cm9sPiBsaXN0LjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5BbiA8Y29kZXBoPmFueTwvY29kZXBoPiBlbGVtZW50IGVuYWJsZXMgZWxlbWVudCBjb250ZW50IGFjY29yZGluZw0KLXRvIG5hbWVzcGFjZXMsIGFuZCB0aGUgY29ycmVzcG9uZGluZyA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGUgZWxlbWVudA0KLWVuYWJsZXMgYXR0cmlidXRlcyB0byBhcHBlYXIgaW4gZWxlbWVudHMuIFRvIGFkZCBhbiA8Y29kZXBoPmFueTwvY29kZXBoPiBhdHRyaWJ1dGUsDQotcmlnaHQtY2xpY2sgaW4gdGhlIEF0dHJpYnV0ZXMgcGFnZSBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgQW55IEF0dHJpYnV0ZTwvdWljb250cm9sPi48L2NtZD4NCi08aW5mbz5Zb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIGFuIDxjb2RlcGg+YW55PC9jb2RlcGg+IGF0dHJpYnV0ZTo8L2luZm8+DQotPGNob2ljZXM+DQotPGNob2ljZT5Gb3IgYSA8dWljb250cm9sPm5hbWVzcGFjZTwvdWljb250cm9sPiA8P1B1YiBDYXJldDE/PnZhbHVlLCB5b3UgY2FuDQotc2VsZWN0Ojx1bD4NCi08bGk+PGI+IyNhbnk8L2I+LiBUaGlzIGFsbG93cyBhbnkgd2VsbC1mb3JtZWQgWE1MIGZyb20gYW55IG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI2xvY2FsIDwvYj4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQNCi10byBiZSBpbiBhIG5hbWVzcGFjZS48L2xpPg0KLTxsaT48Yj4jI290aGVyPC9iPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCB0aGF0IGlzIG5vdCBmcm9tIHRoZSB0YXJnZXQNCi1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPg0KLTxsaT48Yj4jI3RhcmdldE5hbWVzcGFjZSA8L2I+LiBUaGlzIGlzIHNob3J0aGFuZCBmb3IgdGhlIHRhcmdldCBuYW1lc3BhY2UNCi1vZiB0aGUgdHlwZSBiZWluZyBkZWZpbmVkLjwvbGk+DQotPC91bD48L2Nob2ljZT4NCi08Y2hvaWNlPkZvciBhIDx1aWNvbnRyb2w+cHJvY2Vzc0NvbnRlbnRzPC91aWNvbnRyb2w+IHZhbHVlLCB5b3UgY2FuIHNlbGVjdDo8dWw+DQotPGxpPjxiPnNraXA8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIG5vdCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQNCi1hdCBhbGwuPC9saT4NCi08bGk+PGI+bGF4PC9iPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQgYXMgbXVjaA0KLWFzIGl0IGNhbi48L2xpPg0KLTxsaT48Yj5zdHJpY3Q8L2I+LiBUaGUgWE1MIHByb2Nlc3NvciB3aWxsIHZhbGlkYXRlIGFsbCB0aGUgYXR0cmlidXRlIGNvbnRlbnQuPC9saT4NCi08L3VsPjwvY2hvaWNlPg0KLTwvY2hvaWNlcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ2xvYmFsIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxwb3N0cmVxPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhIGdsb2JhbCBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24NCi1vZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIHRoZSBnbG9iYWwgZWxlbWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24NCi1hYm91dCB3b3JraW5nIHdpdGggY29udGVudCBtb2RlbHMsIHJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvcG9zdHJlcT4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwOTU3OT8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5odG1sIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkZ2xlbS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzhjMGQ1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdsZW0uaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZ2xvYmFsIGVsZW1lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkEgZ2xvYmFsIGVsZW1lbnQgaXMgYW4gZWxlbWVudCB3aXRoIGEgZ2xvYmFsIHNjb3BlLiBJdCBpcyBvbmUgdGhhdCBoYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudCBtb2RlbC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQSBnbG9iYWwgZWxlbWVudCBpcyBhbiBlbGVtZW50IHdpdGggYSBnbG9iYWwgc2NvcGUuIEl0IGlzIG9uZSB0aGF0IGhhcyBiZWVuIGRlY2xhcmVkIGFzIHBhcnQgb2YgdGhlIG1haW4gc2NoZW1hIHJhdGhlciB0aGFuIGFzIHBhcnQgb2YgYSBjb250ZW50IG1vZGVsLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGdsb2JhbCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGdsb2JhbCBlbGVtZW50cywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGVsbXIuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZ2xlbSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBnbG9iYWwgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRnbGVtIj48YSBuYW1lPSJ0YWRkZ2xlbSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdsb2JhbCBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBnbG9iYWwgZWxlbWVudCBpcyBhbiBlbGVtZW50IHdpdGggYSBnbG9iYWwgc2NvcGUuIEl0IGlzIG9uZSB0aGF0Ci1oYXMgYmVlbiBkZWNsYXJlZCBhcyBwYXJ0IG9mIHRoZSBtYWluIHNjaGVtYSByYXRoZXIgdGhhbiBhcyBwYXJ0IG9mIGEgY29udGVudAotbW9kZWwuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIGdsb2JhbAotZWxlbWVudDo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHlvdXIgc2NoZW1hLjwvc3Bhbj4gVGhlIGVudGlyZQotc2NoZW1hIGFuZCBpdHMgY29udGVudHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgRGVzaWduIHZpZXcuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8c3Ryb25nPkVsZW1lbnRzPC9zdHJvbmc+IHNlY3Rpb24KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgRWxlbWVudDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkdlbmVyYWw8L3NwYW4+IHRhYiwKLWFuZCB0eXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBnbG9iYWwgZWxlbWVudCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB5b3UgY2FuIHNlbGVjdCB0aGUgYXR0cmlidXRlIHR5cGUgZnJvbQotdGhlIHByZWRlZmluZWQgbGlzdCBpbiB0aGUgbWVudSBuZXh0IHRvIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5UeXBlPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci0gPHA+QWx0ZXJuYXRpdmVseSwgeW91IGNhbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBmcm9tCi10aGUgbGlzdCBmb3IgbW9yZSBvcHRpb25zLiA8L3A+Ci08ZGl2IGNsYXNzPSJwIj5UaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2V0IFR5cGU8L3NwYW4+IGRpYWxvZwotYm94IGFwcGVhcnMsIGFuZCBsaXN0cyBhbGwgYnVpbHQtaW4gYW5kIHVzZXItZGVmaW5lZCB0eXBlcyBjdXJyZW50bHkgYXZhaWxhYmxlLgotWW91IGNhbiBjaGFuZ2UgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjb3BlPC9zcGFuPiBvZiB0aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lCi1vZiB0aGUgZm9sbG93aW5nIG9wdGlvbnM6PHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtzcGFjZTwvc3Bhbj4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluCi15b3VyIHdvcmtzcGFjZS4gPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVuY2xvc2luZyBQcm9qZWN0PC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUKLWluIHRoZSBwcm9qZWN0IHRoYXQgY29udGFpbnMgeW91ciBmaWxlLiA8L2xpPgotCi08bGk+KERlZmF1bHQpIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkN1cnJlbnQgUmVzb3VyY2U8L3NwYW4+LiBMaXN0IGFsbCBvZiB0aGUgdHlwZXMKLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2luZyBTZXRzPC9zcGFuPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4KLXRoZSBzZWxlY3RlZCB3b3JraW5nIHNldC48L2xpPgotCi08L3VsPgotPC9kaXY+Ci08cD5TZWxlY3QgdGhlIHR5cGUgeW91IHdhbnQgaW4gdGhlIHR5cGUgbGlzdCwgdGhlbiBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uIDwvcD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj4oT3B0aW9uYWwpIENsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PdGhlcjwvc3Bhbj4gdGFiLjwvc3Bhbj4gSW4KLXRoaXMgcGFnZSwgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb2xsb3dpbmcgdmFyaW91cyB2YWx1ZXMgZm9yIHRoZSBnbG9iYWwgZWxlbWVudDogCi08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+YWJzdHJhY3Q8L3NwYW4+LiBDbGljayA8c3Ryb25nPnRydWUgPC9zdHJvbmc+aWYgeW91IHdhbnQgdGhlCi1nbG9iYWwgZWxlbWVudCB0byBiZSBhYnN0cmFjdC4gV2hlbiBhIGdsb2JhbCBlbGVtZW50IGlzIGRlY2xhcmVkIHRvIGJlIGFic3RyYWN0LAotaXQgY2Fubm90IGJlIHVzZWQgaW4gYW4gaW5zdGFuY2UgZG9jdW1lbnQuIEluc3RlYWQsIGEgbWVtYmVyIG9mIHRoYXQgZ2xvYmFsCi1lbGVtZW50J3Mgc3Vic3RpdHV0aW9uIGdyb3VwIG11c3QgYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+YmxvY2s8L3NwYW4+LiBUaGlzIGZpZWxkIGRldGVybWluZXMgd2hldGhlciB0aGUgZ2xvYmFsCi1lbGVtZW50IG1heSBiZSByZXBsYWNlZCBieSBhbiBlbGVtZW50IGRlcml2ZWQgZnJvbSBpdC48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+ZmluYWw8L3NwYW4+LiBUaGlzIGZpZWxkIGRldGVybWluZXMgd2hldGhlciB0aGlzIGdsb2JhbAotZWxlbWVudCBtYXkgYmUgZGVyaXZlZCBmcm9tLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5maXhlZC9kZWZhdWx0PC9zcGFuPi4gQ2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiBhbmQKLXNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaXhlZDwvc3Bhbj4gb3IgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVmYXVsdDwvc3Bhbj4gYW5kCi1zcGVjaWZ5IGFuIGFwcHJvcHJpYXRlIHZhbHVlLiBJZiB5b3Ugc2VsZWN0IDxzdHJvbmc+Rml4ZWQ8L3N0cm9uZz4sIHRoZSBnbG9iYWwgZWxlbWVudAotaGFzIGEgZml4ZWQgdmFsdWUsIHdoaWNoIGNhbm5vdCBiZSBjaGFuZ2VkLiBJZiB5b3Ugc2VsZWN0IDxzdHJvbmc+RGVmYXVsdDwvc3Ryb25nPiwKLXRoZSBlbGVtZW50IGhhcyBhIGRlZmF1bHQgdmFsdWUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmZvcm08L3NwYW4+LiBVc2UgdGhpcyBmaWVsZCB0byBpbmRpY2F0ZSBpZiB0aGUgYXBwZWFyYW5jZQotb2YgdGhpcyBnbG9iYWwgZWxlbWVudCBpbiBhbiBpbnN0YW5jZSBvZiB0aGUgWE1MIHNjaGVtYSAoYW4gWE1MIGZpbGUgYXNzb2NpYXRlZAotd2l0aCB0aGUgWE1MIHNjaGVtYSkgbXVzdCBiZSBxdWFsaWZpZWQgYnkgYSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPm5pbGxhYmxlPC9zcGFuPi4gU2VsZWN0IDxzdHJvbmc+dHJ1ZTwvc3Ryb25nPiBpZiB5b3UgZG8gbm90Ci13YW50IHRoZSBnbG9iYWwgZWxlbWVudCB0byBiZSBhYmxlIHRvIGhhdmUgYW55IGNoaWxkIGVsZW1lbnRzLCBvbmx5IGF0dHJpYnV0ZXMuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5zdWJzdGl0dXRpb25Hcm91cDwvc3Bhbj4uIEEgc3Vic3RpdHV0aW9uIGdyb3VwIGFsbG93cwotZWxlbWVudHMgdG8gYmUgc3Vic3RpdHV0ZWQgZm9yIG90aGVyIGVsZW1lbnRzLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkF0dHJpYnV0ZXM8L3NwYW4+IHRhYi48L3NwYW4+IFlvdQotY2FuIHVzZSB0aGlzIHBhZ2UgdG8gYWRkIGF0dHJpYnV0ZXMsIGF0dHJpYnV0ZSByZWZlcmVuY2VzLCBhdHRyaWJ1dGVzIGdyb3VwCi1yZWZlcmVuY2VzLCBhbmQgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhdHRyaWJ1dGVzIHRvIHlvdXIgZ2xvYmFsIGVsZW1lbnQuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFuIGF0dHJpYnV0ZSBhc3NvY2lhdGVzIGFuIGF0dHJpYnV0ZSBuYW1lIHdpdGggYSBzcGVjaWZpYyB0eXBlCi1hbmQgdmFsdWUuIFRvIGFkZCBhbiBhdHRyaWJ1dGUsIHJpZ2h0LWNsaWNrIGluIHRoZSBBdHRyaWJ1dGVzIHBhZ2UsIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUF0dHJpYnV0ZTwvc3Bhbj4uPC9zcGFuPiBZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yCi1hbiBhdHRyaWJ1dGU6Ci08dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+Zml4ZWQvZGVmYXVsdDwvc3Bhbj4uIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gYW5kCi1zZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Rml4ZWQ8L3NwYW4+IG9yIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+IGFuZAotc3BlY2lmeSBhbiBhcHByb3ByaWF0ZSB2YWx1ZS4gSWYgeW91IHNlbGVjdCA8c3Ryb25nPkZpeGVkPC9zdHJvbmc+LCB0aGUgYXR0cmlidXRlIGhhcwotYSBmaXhlZCB2YWx1ZSwgd2hpY2ggY2Fubm90IGJlIGNoYW5nZWQuIElmIHlvdSBzZWxlY3QgPHN0cm9uZz5EZWZhdWx0PC9zdHJvbmc+LCB0aGUKLWF0dHJpYnV0ZSBoYXMgYSBkZWZhdWx0IHZhbHVlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5mb3JtPC9zcGFuPi4gVXNlIHRoaXMgZmllbGQgdG8gaW5kaWNhdGUgaWYgdGhlIGFwcGVhcmFuY2UKLW9mIHRoaXMgYXR0cmlidXRlIGluIGFuIGluc3RhbmNlIG9mIHRoZSBYTUwgc2NoZW1hIG11c3QgYmUgcXVhbGlmaWVkIGJ5IGEKLW5hbWVzcGFjZS48L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+bmFtZTwvc3Bhbj4uIEVudGVyIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnR5cGU8L3NwYW4+LiBDbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Ccm93c2U8L3NwYW4+IGFuZAotc2VsZWN0IHRoZSB0eXBlIG9mIHRoZSBhdHRyaWJ1dGUuIDwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj51c2U8L3NwYW4+LiBUaGlzIGZpZWxkIGluZGljYXRlcyBob3cgYW4gYXR0cmlidXRlCi1jYW4gYmUgdXNlZCBpbiBhbiBpbnN0YW5jZSBkb2N1bWVudC4gSWYgeW91IHNlbGVjdCBvcHRpb25hbCwgdGhlIGF0dHJpYnV0ZQotY2FuIGFwcGVhciBvbmNlLCBidXQgaXQgZG9lcyBub3QgaGF2ZSB0by4gSWYgeW91IHNlbGVjdCByZXF1aXJlZCwgdGhlIGF0dHJpYnV0ZQotbXVzdCBhcHBlYXIgb25jZS4gSWYgeW91IHNlbGVjdCBwcm9oaWJpdGVkLCB0aGUgYXR0cmlidXRlIG11c3Qgbm90IGFwcGVhci4gPHN0cm9uZz5Ob3RlPC9zdHJvbmc+OgotSWYgeW91IHNlbGVjdGVkIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlZmF1bHQ8L3NwYW4+LCB5b3UgbXVzdCBzZWxlY3QgPHN0cm9uZz5vcHRpb25hbDwvc3Ryb25nPiBpbgotdGhpcyBmaWVsZCwgb3RoZXJ3aXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdpbGwgbm90IGJlIHZhbGlkLjwvbGk+Ci0KLTwvdWw+Ci0KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+QW4gYXR0cmlidXRlIHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBhdHRyaWJ1dGUuCi1UbyBhZGQgYW4gYXR0cmlidXRlIHJlZmVyZW5jZSwgcmlnaHQtY2xpY2sgaW4gdGhlIEF0dHJpYnV0ZXMgcGFnZSwgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotQXR0cmlidXRlIFJlZjwvc3Bhbj4uPC9zcGFuPiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbAotYXR0cmlidXRlIGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgYXR0cmlidXRlIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQKLWluIHRoZSBjb250ZXh0IG9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi4gVGhlIG1lbnUgb3B0aW9uIHRvIGFkZCBhbiBhdHRyaWJ1dGUKLXJlZmVyZW5jZSBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlIGdsb2JhbCBhdHRyaWJ1dGVzIGRlZmluZWQgZWxzZXdoZXJlIGluCi10aGUgZG9jdW1lbnQuIFNlbGVjdCB0aGUgcmVmZXJlbmNlLCB0aGVuIHNlbGVjdCB0aGUgZ2xvYmFsIGF0dHJpYnV0ZSB5b3Ugd2FudAotaXQgdG8gcmVmZXJlbmNlIGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnJlZjwvc3Bhbj4gbGlzdC48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UgcHJvdmlkZXMgYSByZWZlcmVuY2UgdG8gYW4gYXR0cmlidXRlCi1ncm91cC4gVG8gYWRkIGFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2UsIHJpZ2h0LWNsaWNrIGluIHRoZSBBdHRyaWJ1dGVzCi1wYWdlLCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEF0dHJpYnV0ZSBHcm91cCBSZWY8L3NwYW4+Ljwvc3Bhbj4gQQotZGVjbGFyYXRpb24gdGhhdCByZWZlcmVuY2VzIGFuIGF0dHJpYnV0ZSBncm91cCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGF0dHJpYnV0ZQotZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcKLWRlY2xhcmF0aW9uLiBUaGUgbWVudSBvcHRpb24gdG8gYWRkIGFuIGF0dHJpYnV0ZSBncm91cCByZWZlcmVuY2Ugb25seSBhcHBlYXJzCi1pZiB0aGVyZSBhcmUgYXR0cmlidXRlIGdyb3VwcyBkZWZpbmVkIGVsc2V3aGVyZSBpbiB0aGUgZG9jdW1lbnQuIFNlbGVjdCB0aGUKLXJlZmVyZW5jZSwgdGhlbiBzZWxlY3QgdGhlIGF0dHJpYnV0ZSBncm91cCB5b3Ugd2FudCBpdCB0byByZWZlcmVuY2UgZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cmVmPC9zcGFuPiBsaXN0LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5BbiA8c2FtcCBjbGFzcz0iY29kZXBoIj5hbnk8L3NhbXA+IGVsZW1lbnQgZW5hYmxlcyBlbGVtZW50IGNvbnRlbnQgYWNjb3JkaW5nCi10byBuYW1lc3BhY2VzLCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgPHNhbXAgY2xhc3M9ImNvZGVwaCI+YW55PC9zYW1wPiBhdHRyaWJ1dGUgZWxlbWVudAotZW5hYmxlcyBhdHRyaWJ1dGVzIHRvIGFwcGVhciBpbiBlbGVtZW50cy4gVG8gYWRkIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlLAotcmlnaHQtY2xpY2sgaW4gdGhlIEF0dHJpYnV0ZXMgcGFnZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEFueSBBdHRyaWJ1dGU8L3NwYW4+Ljwvc3Bhbj4KLSBZb3UgY2FuIHNwZWNpZnkgdGhlIGZvbGxvd2luZyB2YWx1ZXMgZm9yIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmFueTwvc2FtcD4gYXR0cmlidXRlOgotPHVsPgotPGxpPkZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPm5hbWVzcGFjZTwvc3Bhbj4gdmFsdWUsIHlvdSBjYW4KLXNlbGVjdDo8dWw+Ci08bGk+PHN0cm9uZz4jI2FueTwvc3Ryb25nPi4gVGhpcyBhbGxvd3MgYW55IHdlbGwtZm9ybWVkIFhNTCBmcm9tIGFueSBuYW1lc3BhY2UuPC9saT4KLQotPGxpPjxzdHJvbmc+IyNsb2NhbCA8L3N0cm9uZz4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZGVjbGFyZWQKLXRvIGJlIGluIGEgbmFtZXNwYWNlLjwvbGk+Ci0KLTxsaT48c3Ryb25nPiMjb3RoZXI8L3N0cm9uZz4uIFRoaXMgYWxsb3dzIGFueSB3ZWxsLWZvcm1lZCBYTUwgdGhhdCBpcyBub3QgZnJvbSB0aGUgdGFyZ2V0Ci1uYW1lc3BhY2Ugb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08bGk+PHN0cm9uZz4jI3RhcmdldE5hbWVzcGFjZSA8L3N0cm9uZz4uIFRoaXMgaXMgc2hvcnRoYW5kIGZvciB0aGUgdGFyZ2V0IG5hbWVzcGFjZQotb2YgdGhlIHR5cGUgYmVpbmcgZGVmaW5lZC48L2xpPgotCi08L3VsPgotPC9saT4KLQotPGxpPkZvciBhIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnByb2Nlc3NDb250ZW50czwvc3Bhbj4gdmFsdWUsIHlvdSBjYW4gc2VsZWN0Ojx1bD4KLTxsaT48c3Ryb25nPnNraXA8L3N0cm9uZz4uIFRoZSBYTUwgcHJvY2Vzc29yIHdpbGwgbm90IHZhbGlkYXRlIHRoZSBhdHRyaWJ1dGUgY29udGVudAotYXQgYWxsLjwvbGk+Ci0KLTxsaT48c3Ryb25nPmxheDwvc3Ryb25nPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSB0aGUgYXR0cmlidXRlIGNvbnRlbnQgYXMgbXVjaAotYXMgaXQgY2FuLjwvbGk+Ci0KLTxsaT48c3Ryb25nPnN0cmljdDwvc3Ryb25nPi4gVGhlIFhNTCBwcm9jZXNzb3Igd2lsbCB2YWxpZGF0ZSBhbGwgdGhlIGF0dHJpYnV0ZSBjb250ZW50LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ2xvYmFsIGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPllvdSBjYW4gYWRkIGEgY29udGVudCBtb2RlbCB0byBhIGdsb2JhbCBlbGVtZW50LCB3aGljaCBpcyB0aGUgcmVwcmVzZW50YXRpb24KLW9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZCBpbnNpZGUgdGhlIGdsb2JhbCBlbGVtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbgotYWJvdXQgd29ya2luZyB3aXRoIGNvbnRlbnQgbW9kZWxzLCByZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgdGl0bGU9IkEgY29udGVudCBtb2RlbCBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgY29udGFpbmVkIGluc2lkZSBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cC4gSXQgaXMgYSBmb3JtYWwgZGVzY3JpcHRpb24gb2YgdGhlIHN0cnVjdHVyZSBhbmQgcGVybWlzc2libGUgY29udGVudCBvZiBhbiBlbGVtZW50LCBnbG9iYWwgZWxlbWVudCwgY29tcGxleCB0eXBlLCBvciBncm91cCwgd2hpY2ggbWF5IGJlIHVzZWQgdG8gdmFsaWRhdGUgYSBkb2N1bWVudCBpbnN0YW5jZS4iPkFkZGluZyBjb250ZW50IG1vZGVsczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRlbG1yLmh0bWwiIHRpdGxlPSJBbiBlbGVtZW50IHJlZmVyZW5jZSBwcm92aWRlcyBhIHJlZmVyZW5jZSB0byBhIGdsb2JhbCBlbGVtZW50LiBBIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdsb2JhbCBlbGVtZW50IGVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ2xvYmFsIGVsZW1lbnQgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dCBvZiB0aGUgcmVmZXJlbmNpbmcgZGVjbGFyYXRpb24uIj5BZGRpbmcgZWxlbWVudCByZWZlcmVuY2VzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQxODcwZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGdycHIiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBncm91cCByZWZlcmVuY2VzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdA0KLWVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dA0KLW9mIHRoZSByZWZlcmVuY2luZyBkZWNsYXJhdGlvbi48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5ncm91cCByZWZlcmVuY2VzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Z3JvdXAgcmVmZXJlbmNlczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmdyb3VwIHJlZmVyZW5jZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmdyb3VwIHJlZmVyZW5jZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VGhlIG1lbnUgb3B0aW9uIHRvIGFkZCBhIGdyb3VwIHJlZmVyZW5jZSBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlDQotZ3JvdXBzIGRlZmluZWQgZWxzZXdoZXJlIGluIHRoZSBkb2N1bWVudC48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlDQotd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyDQotcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBhZGQgYSBncm91cCByZWZlcmVuY2UsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgeW91IHdhbnQgdG8gd29yaw0KLXdpdGggYW5kIHNlbGVjdCA8dWljb250cm9sPkFkZCBHcm91cCBSZWY8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBuZXcgZ3JvdXAgcmVmZXJlbmNlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIHNlbGVjdCB0aGUgZ3JvdXAgeW91IHdhbnQgdG8gcmVmZXIgdG8gaW4NCi10aGUgPHVpY29udHJvbD5yZWY8L3VpY29udHJvbD4gbGlzdC48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3JvdXAgcmVmZXJlbmNlLjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPD9QdWIgQ2FyZXQ/PjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDIyNzc/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdycHIuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMwZTQ5YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnByLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZ3JvdXAgcmVmZXJlbmNlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGdyb3VwIHJlZmVyZW5jZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBncm91cCByZWZlcmVuY2VzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRncnVwLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGdycHIiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGdycHIiPjxhIG5hbWU9InRhZGRncnByIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgZ3JvdXAgcmVmZXJlbmNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QSBncm91cCByZWZlcmVuY2UgaXMgYSBkZWNsYXJhdGlvbiB0aGF0IHJlZmVyZW5jZXMgYSBncm91cC4gSXQKLWVuYWJsZXMgdGhlIHJlZmVyZW5jZWQgZ3JvdXAgdG8gYXBwZWFyIGluIHRoZSBpbnN0YW5jZSBkb2N1bWVudCBpbiB0aGUgY29udGV4dAotb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+VGhlIG1lbnUgb3B0aW9uIHRvIGFkZCBhIGdyb3VwIHJlZmVyZW5jZSBvbmx5IGFwcGVhcnMgaWYgdGhlcmUgYXJlCi1ncm91cHMgZGVmaW5lZCBlbHNld2hlcmUgaW4gdGhlIGRvY3VtZW50LjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUKLXdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlcgotcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhIGdyb3VwIHJlZmVyZW5jZSwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgdGhlIGNvbnRlbnQgbW9kZWwgeW91IHdhbnQgdG8gd29yawotd2l0aCBhbmQgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZCBHcm91cCBSZWY8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgbmV3IGdyb3VwIHJlZmVyZW5jZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBzZWxlY3QgdGhlIGdyb3VwIHlvdSB3YW50IHRvIHJlZmVyIHRvIGluCi10aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cmVmPC9zcGFuPiBsaXN0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3JvdXAgcmVmZXJlbmNlLjwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRncnVwLmh0bWwiIHRpdGxlPSJXaGVuIHlvdSBjcmVhdGUgYSBncm91cCwgaXQgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIFRoZSBjb250ZW50IG1vZGVsIGlzIGEgcmVwcmVzZW50YXRpb24gb2YgYW55IGRhdGEgdGhhdCBjYW4gYmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuIj5BZGRpbmcgZ3JvdXBzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1Y2Y0YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InRhZGRncnVwIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5BZGRpbmcgZ3JvdXBzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgZ3JvdXBzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4NCi1UaGUgY29udGVudCBtb2RlbCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGdyb3VwZWQgdG9nZXRoZXINCi1ieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Z3JvdXBzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+Z3JvdXBzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+Z3JvdXBzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5ncm91cHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+PC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlDQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD48cD5Ubw0KLWFkZCBhIGdyb3VwLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPjwvY29udGV4dD4NCi08c3RlcHM+DQotPHN0ZXA+PGNtZD5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgPGI+R3JvdXBzPC9iPiwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotR3JvdXA8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgdHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgZ3JvdXAgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgZ3JvdXAgZWxlbWVudC48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD48P1B1YiBDYXJldD8+IHBhZ2UgYWxsb3dzIHlvdSB0bw0KLXNwZWNpZnkgdGhlIHNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIGV4cGFuZCB0aGUgPHVpY29udHJvbD5Hcm91cHM8L3VpY29udHJvbD4gZm9sZGVyDQotYW5kIHlvdXIgbmV3IGdyb3VwLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPllvdXIgZ3JvdXAgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIDwvY21kPjxpbmZvPkENCi1ncm91cCdzIGNvbnRlbnQgbW9kZWwgaXMgdGhlIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGNvbnRhaW5lZA0KLWluc2lkZSB0aGUgZ3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdvcmtpbmcgd2l0aCBjb250ZW50IG1vZGVscywNCi1yZWZlciB0byB0aGUgcmVsYXRlZCB0YXNrcy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDI1MDI/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGdydXAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxNDFlZC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRncnVwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJBZGRpbmcgZ3JvdXBzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IldoZW4geW91IGNyZWF0ZSBhIGdyb3VwLCBpdCBhdXRvbWF0aWNhbGx5IGNvbnRhaW5zIGEgY29udGVudCBtb2RlbC4gVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyIGJ5IHRoZSBncm91cCwgc3VjaCBhcyBlbGVtZW50cywgZWxlbWVudCByZWZlcmVuY2VzLCBhbmQgZ3JvdXAgcmVmZXJlbmNlcy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iV2hlbiB5b3UgY3JlYXRlIGEgZ3JvdXAsIGl0IGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLiBUaGUgY29udGVudCBtb2RlbCBpcyBhIHJlcHJlc2VudGF0aW9uIG9mIGFueSBkYXRhIHRoYXQgY2FuIGJlIGdyb3VwZWQgdG9nZXRoZXIgYnkgdGhlIGdyb3VwLCBzdWNoIGFzIGVsZW1lbnRzLCBlbGVtZW50IHJlZmVyZW5jZXMsIGFuZCBncm91cCByZWZlcmVuY2VzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGdyb3VwcywgWE1MIHNjaGVtYSBmaWxlcyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkZ3Jwci5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZGNtb2QuaHRtbCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0YWRkZ3J1cCIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBncm91cHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRncnVwIj48YSBuYW1lPSJ0YWRkZ3J1cCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIGdyb3VwczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2hlbiB5b3UgY3JlYXRlIGEgZ3JvdXAsIGl0IGF1dG9tYXRpY2FsbHkgY29udGFpbnMgYSBjb250ZW50IG1vZGVsLgotVGhlIGNvbnRlbnQgbW9kZWwgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBncm91cGVkIHRvZ2V0aGVyCi1ieSB0aGUgZ3JvdXAsIHN1Y2ggYXMgZWxlbWVudHMsIGVsZW1lbnQgcmVmZXJlbmNlcywgYW5kIGdyb3VwIHJlZmVyZW5jZXMuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cCAvPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UKLXBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbwotYWRkIGEgZ3JvdXAsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5PcGVuIHlvdXIgWE1MIHNjaGVtYSBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgcmlnaHQtY2xpY2sgPHN0cm9uZz5Hcm91cHM8L3N0cm9uZz4sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLUdyb3VwPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIGEgbmV3IG5hbWUgZm9yIHRoZSBncm91cCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj4gZmllbGQuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGdyb3VwIGVsZW1lbnQuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvCi1zcGVjaWZ5IHRoZSBzY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgZXhwYW5kIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Hcm91cHM8L3NwYW4+IGZvbGRlcgotYW5kIHlvdXIgbmV3IGdyb3VwLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdXIgZ3JvdXAgYXV0b21hdGljYWxseSBjb250YWlucyBhIGNvbnRlbnQgbW9kZWwuIDwvc3Bhbj4gQQotZ3JvdXAncyBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQKLWluc2lkZSB0aGUgZ3JvdXAuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHdvcmtpbmcgd2l0aCBjb250ZW50IG1vZGVscywKLXJlZmVyIHRvIHRoZSByZWxhdGVkIHRhc2tzLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRncnByLmh0bWwiIHRpdGxlPSJBIGdyb3VwIHJlZmVyZW5jZSBpcyBhIGRlY2xhcmF0aW9uIHRoYXQgcmVmZXJlbmNlcyBhIGdyb3VwLiBJdCBlbmFibGVzIHRoZSByZWZlcmVuY2VkIGdyb3VwIHRvIGFwcGVhciBpbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHJlZmVyZW5jaW5nIGRlY2xhcmF0aW9uLiI+QWRkaW5nIGdyb3VwIHJlZmVyZW5jZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkY21vZC5odG1sIiB0aXRsZT0iQSBjb250ZW50IG1vZGVsIGlzIHRoZSByZXByZXNlbnRhdGlvbiBvZiBhbnkgZGF0YSB0aGF0IGNhbiBiZSBjb250YWluZWQgaW5zaWRlIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLiBJdCBpcyBhIGZvcm1hbCBkZXNjcmlwdGlvbiBvZiB0aGUgc3RydWN0dXJlIGFuZCBwZXJtaXNzaWJsZSBjb250ZW50IG9mIGFuIGVsZW1lbnQsIGdsb2JhbCBlbGVtZW50LCBjb21wbGV4IHR5cGUsIG9yIGdyb3VwLCB3aGljaCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZSBhIGRvY3VtZW50IGluc3RhbmNlLiI+QWRkaW5nIGNvbnRlbnQgbW9kZWxzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhmMjUzZS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0LmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPD9QdWIgSW5jPz4NCi08dGFzayBpZD0idGFkZGltcHQiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyDQotY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwNCi1yZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSBhbiA8Y29kZXBoPmltcG9ydDwvY29kZXBoPiBlbGVtZW50IHRvDQotYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50DQotc2NoZW1hLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5pbXBvcnQgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5pbXBvcnQgZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5pbXBvcnQgZWxlbWVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmltcG9ydCBlbGVtZW50czxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgaW1wb3J0ZWQgc2NoZW1hIGNhbiBjb21lIGZyb20gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gdGhlDQotY3VycmVudCBzY2hlbWEgZG9lcy48L3A+PHA+WW91IGNhbiBhZGQgbXVsdGlwbGUgaW1wb3J0IGVsZW1lbnRzIHRvIGFuIFhNTA0KLXNjaGVtYSwgaG93ZXZlciwgcHJlZml4ZXMgYW5kIG5hbWVzcGFjZXMgaGF2ZSB0byB1bmlxdWUgYW1vbmdzdCB0aGUgaW1wb3J0ZWQNCi1zY2hlbWFzLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gYWRkIGFuIGltcG9ydA0KLWVsZW1lbnQsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgeW91ciBzY2hlbWEuPC9jbWQ+PGluZm8+VGhlIGVudGlyZQ0KLXNjaGVtYSBhbmQgaXRzIGNvbnRlbnRzIHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIERlc2lnbiB2aWV3LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0IGNsaWNrIGluIHRoZSA8Yj5EaXJlY3RpdmVzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIEltcG9ydDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPGI+R2VuZXJhbDwvYj4gdGFiIGFuZCBjbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UNCi1ocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b248L2FsdD48L2ltYWdlPiB0bw0KLXRoZSByaWdodCBvZiB0aGUgPHVpY29udHJvbD5TY2hlbWEgbG9jYXRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gaW1wb3J0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB0aGUgd29ya2JlbmNoOjwvY21kPg0KLTxzdWJzdGVwcz4NCi08c3Vic3RlcD48Y21kPlNlbGVjdCA8dWljb250cm9sPldvcmtiZW5jaCBwcm9qZWN0czwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LiA8L2NtZD4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbXBvcnQgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgb24gdGhlIFdlYjo8P1B1YiBDYXJldD8+PC9jbWQ+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+U2VsZWN0IDx1aWNvbnRyb2w+SFRUUDwvdWljb250cm9sPiBhbmQgY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+DQotPGluZm8+PG5vdGU+QSBsb2NhbCBjb3B5IG9mIHRoZSBzY2hlbWEgd2lsbCBub3QgYmUgc3RvcmVkIGluIHRoZSB3b3JrYmVuY2guDQotRXZlcnkgdGltZSB5b3UgdmFsaWRhdGUgeW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyB3aWxsIGJlIGNoZWNrZWQNCi1mcm9tIHRoZSBVUkwgeW91IHNwZWNpZnkuPC9ub3RlPjwvaW5mbz48L3N1YnN0ZXA+DQotPC9zdWJzdGVwcz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5UaGUgWE1MIHNjaGVtYSBlZGl0b3Igd2lsbCByZXRyaWV2ZSB0aGUgbmFtZXNwYWNlIGZvciB0aGUgaW1wb3J0ZWQNCi1YTUwgc2NoZW1hIGZpbGUgYW5kIGRpc3BsYXkgaXQgYXMgcmVhZC1vbmx5IGluIHRoZSA8dWljb250cm9sPk5hbWVzcGFjZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiBuZWNlc3NhcnksIHR5cGUgYSB1bmlxdWUgcHJlZml4IGZvciB0aGlzIG5hbWVzcGFjZSBpbiB0aGUgPHVpY29udHJvbD5QcmVmaXg8L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGltcG9ydCBlbGVtZW50LjwvY21kPjxpbmZvPlRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gcGFnZQ0KLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50IHRvDQotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9jbWQ+DQotPGluZm8+VGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUNCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPk9uY2UgeW91IGhhdmUgYWRkZWQgYW4gaW1wb3J0IGVsZW1lbnQgdG8geW91ciBYTUwgc2NoZW1hLCB3aGVuDQoteW91IGRlZmluZSBuZXcgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGNvbXBsZXggdHlwZXMsIG9yIHNpbXBsZSB0eXBlcyB3aGVyZQ0KLXlvdSBjYW4gc3BlY2lmeSB0eXBlIGluZm9ybWF0aW9uLCBhbnkgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYQ0KLXdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSA8dWljb250cm9sPlR5cGU8L3VpY29udHJvbD4gbGlzdCBmb3IgdGhlIGVsZW1lbnQsDQotYXR0cmlidXRlLCBjb21wbGV4IG9yIHNpbXBsZSB0eXBlLjwvcD48L3Jlc3VsdD4NCi08cG9zdHJlcT48L3Bvc3RyZXE+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDQzNDA/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGltcHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5NDZlYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbXB0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIGltcG9ydCBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJBcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwgcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgYW4gaW1wb3J0IGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIGltcG9ydCBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSBhbiBpbXBvcnRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgaW1wb3J0IGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgaW1wb3J0IGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbmNsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGltcHQiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgaW1wb3J0IGVsZW1lbnRzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkaW1wdCI+PGEgbmFtZT0idGFkZGltcHQiPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpcgotY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwKLXJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIGFuIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmltcG9ydDwvc2FtcD4gZWxlbWVudCB0bwotYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50Ci1zY2hlbWEuIDwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGltcG9ydGVkIHNjaGVtYSBjYW4gY29tZSBmcm9tIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIHRoZQotY3VycmVudCBzY2hlbWEgZG9lcy48L3A+Ci08cD5Zb3UgY2FuIGFkZCBtdWx0aXBsZSBpbXBvcnQgZWxlbWVudHMgdG8gYW4gWE1MCi1zY2hlbWEsIGhvd2V2ZXIsIHByZWZpeGVzIGFuZCBuYW1lc3BhY2VzIGhhdmUgdG8gdW5pcXVlIGFtb25nc3QgdGhlIGltcG9ydGVkCi1zY2hlbWFzLjwvcD4KLTxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGFuIGltcG9ydAotZWxlbWVudCwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgeW91ciBzY2hlbWEuPC9zcGFuPiBUaGUgZW50aXJlCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQgY2xpY2sgaW4gdGhlIDxzdHJvbmc+RGlyZWN0aXZlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIEltcG9ydDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzdHJvbmc+R2VuZXJhbDwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gdG8KLXRoZSByaWdodCBvZiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hIGxvY2F0aW9uPC9zcGFuPiBmaWVsZC48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBpbXBvcnQgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIGluIHRoZSB3b3JrYmVuY2g6PC9zcGFuPgotPG9sIHR5cGU9ImEiPgotPGxpPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JrYmVuY2ggcHJvamVjdHM8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpPjxzcGFuPlNlbGVjdCB0aGUgc2NoZW1hIHlvdSB3YW50IHRvIGltcG9ydCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIGltcG9ydCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgb24gdGhlIFdlYjo8L3NwYW4+Ci08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVFRQPC9zcGFuPiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHdvcmtiZW5jaC4KLUV2ZXJ5IHRpbWUgeW91IHZhbGlkYXRlIHlvdXIgc2NoZW1hLCB0aGUgc2NoZW1hJ3MgY29udGVudHMgd2lsbCBiZSBjaGVja2VkCi1mcm9tIHRoZSBVUkwgeW91IHNwZWNpZnkuPC9kaXY+Ci08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIHJldHJpZXZlIHRoZSBuYW1lc3BhY2UgZm9yIHRoZSBpbXBvcnRlZAotWE1MIHNjaGVtYSBmaWxlIGFuZCBkaXNwbGF5IGl0IGFzIHJlYWQtb25seSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZXNwYWNlPC9zcGFuPiBmaWVsZC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIG5lY2Vzc2FyeSwgdHlwZSBhIHVuaXF1ZSBwcmVmaXggZm9yIHRoaXMgbmFtZXNwYWNlIGluIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QcmVmaXg8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbXBvcnQgZWxlbWVudC48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCBhbiBpbXBvcnQgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsIHdoZW4KLXlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUgdHlwZXMgd2hlcmUKLXlvdSBjYW4gc3BlY2lmeSB0eXBlIGluZm9ybWF0aW9uLCBhbnkgZGVjbGFyYXRpb25zIGZyb20gdGhlIGluY2x1ZGVkIHNjaGVtYQotd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlR5cGU8L3NwYW4+IGxpc3QgZm9yIHRoZSBlbGVtZW50LAotYXR0cmlidXRlLCBjb21wbGV4IG9yIHNpbXBsZSB0eXBlLjwvcD4KLTwvZGl2PgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIiAvPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiB0aXRsZT0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiB0aXRsZT0iWW91IGNhbiB1c2UgdGhlIHJlZGVmaW5lIG1lY2hhbmlzbSB0byByZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuIj5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIHRpdGxlPSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJiODMyLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZGluY2wuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkaW5jbCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpcg0KLWNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsDQotcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgdGhlIDxjb2RlcGg+aW5jbHVkZTwvY29kZXBoPiBlbGVtZW50IHRvDQotYnJpbmc8P1B1YiBDYXJldD8+IGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hDQotaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlDQotYXMgdGhlIGluY2x1ZGluZyBzY2hlbWEuIDwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPmluY2x1ZGUNCi1lbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmluY2x1ZGUNCi1lbGVtZW50czxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwNCi1zY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+aW5jbHVkZSBlbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+aW5jbHVkZSBlbGVtZW50czxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBYTUwgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhbiBpbmNsdWRlDQotZWxlbWVudCwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHNlbGVjdCB5b3VyIHNjaGVtYS48L2NtZD48aW5mbz5UaGUgZW50aXJlDQotc2NoZW1hIGFuZCBpdHMgY29udGVudHMgYXJlIGRpc3BsYXllZCBpbiB0aGUgRGVzaWduIHZpZXcuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxiPkRpcmVjdGl2ZXM8L2I+IHNlY3Rpb24NCi1hbmQgY2xpY2sgPHVpY29udHJvbD5BZGQgSW5jbHVkZTwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPGI+R2VuZXJhbDwvYj4gdGFiIGFuZCBjbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UNCi1ocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzIGdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b248L2FsdD48L2ltYWdlPiB0bw0KLXRoZSByaWdodCBvZiB0aGUgPHVpY29udHJvbD5TY2hlbWEgbG9jYXRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+PGluZm8+VGhlDQotWE1MIHNjaGVtYSBmaWxlIHlvdSBzZWxlY3QgbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgY3VycmVudCBzY2hlbWEuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIHNlbGVjdCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4gdGhlIHdvcmtiZW5jaCwgc2VsZWN0IDx1aWNvbnRyb2w+V29ya2JlbmNoDQotcHJvamVjdHM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi4gPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+U2VsZWN0IHRoZSBzY2hlbWEgeW91IHdhbnQgdG8gaW5jbHVkZSBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHdhbnQgdG8gc2VsZWN0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBvbiB0aGUgV2ViLCBzZWxlY3QgPHVpY29udHJvbD5IVFRQPC91aWNvbnRyb2w+IGFuZA0KLWNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5UeXBlIHRoZSBVUkwgb2YgdGhlIFhNTCBzY2hlbWEgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvY21kPg0KLTxpbmZvPjxub3RlPiBBIGxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHdvcmtiZW5jaC4NCi1FdmVyeSB0aW1lIHlvdSB2YWxpZGF0ZSB5b3VyIHNjaGVtYSwgdGhlIHNjaGVtYSdzIGNvbnRlbnRzIHdpbGwgYmUgY2hlY2tlZA0KLWZyb20gdGhlIFVSTCB5b3Ugc3BlY2lmeS48L25vdGU+PC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIHJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQNCi1YTUwgc2NoZW1hIGZpbGUsIGFuZCBkaXNwbGF5IGl0IGluIHRoZSA8dWljb250cm9sPlNjaGVtYSBsb2NhdGlvbjwvdWljb250cm9sPiBmaWVsZC4NCi1UaGlzIGZpZWxkIGNhbiBiZSBlZGl0ZWQgYXQgYW55IHRpbWUgdG8gcmVmbGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWENCi1maWxlLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBpbmNsdWRlIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwgd2hlbg0KLXlvdSBkZWZpbmUgbmV3IGVsZW1lbnRzLCBhdHRyaWJ1dGVzLCBjb21wbGV4IHR5cGVzLCBvciBzaW1wbGUgdHlwZXMgd2hlcmUNCi15b3UgY2FuIHNwZWNpZnkgdHlwZSBpbmZvcm1hdGlvbiwgYW55IGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWENCi13aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgPHVpY29udHJvbD5UeXBlPC91aWNvbnRyb2w+IGxpc3QgZm9yIHRoZSBlbGVtZW50LA0KLWF0dHJpYnV0ZSwgY29tcGxleCBvciBzaW1wbGUgdHlwZS48L3A+PHA+Rm9yIGV4YW1wbGUsIGlmIEFkZHJlc3MueHNkIGhhcyB0aGUNCi1mb2xsb3dpbmcgY29udGVudDo8L3A+PGNvZGVibG9jaz4mbHQ7Y29tcGxleFR5cGUgbmFtZT0iQWRkcmVzcyI+DQotICAgICZsdDtzZXF1ZW5jZT4NCi0gICAgICAgICZsdDtlbGVtZW50IG5hbWU9Im5hbWUiIHR5cGU9InN0cmluZyI+DQotICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJzdHJlZXQiIHR5cGU9InN0cmluZyI+DQotICAgICZsdDsvc2VxdWVuY2U+DQotJmx0Oy9jb21wbGV4VHlwZT4NCi08L2NvZGVibG9jaz5hbmQgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBjYWxsZWQgUHVyY2hhc2VPcmRlci54c2QgdGhhdCBoYXMgYWRkZWQNCi1hbiBpbmNsdWRlIGZvciBBZGRyZXNzLnhzZCwgdGhlbiB3aGVuIGRlZmluaW5nIGEgbmV3IGVsZW1lbnQgaW4gIFB1cmNoYXNlT3JkZXIsDQoteW91IGNhbiBzZWxlY3QgQWRkcmVzcyBhcyBpdHMgdHlwZS4gIDxwPihjKSBDb3B5cmlnaHQgMjAwMSwgV29ybGQgV2lkZSBXZWINCi1Db25zb3J0aXVtIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUNCi1lbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA0NzI4Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRpbmNsLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhYmJhODMuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkaW5jbC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBpbmNsdWRlIGVsZW1lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIGJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiBUaGUgaW5jbHVkZWQgc2NoZW1hIG11c3QgYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgaW5jbHVkaW5nIHNjaGVtYS4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBhZGRpbmcsIGluY2x1ZGUgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMsIGluY2x1ZGUgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBpbmNsdWRlIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzLCBpbmNsdWRlIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkcmRmbi5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZGluY2wiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZGluY2wiPjxhIG5hbWU9InRhZGRpbmNsIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgaW5jbHVkZSBlbGVtZW50czwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+QXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyCi1jb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLAotcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmluY2x1ZGU8L3NhbXA+IGVsZW1lbnQgdG8KLWJyaW5nIGluIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hCi1pbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4gVGhlIGluY2x1ZGVkIHNjaGVtYSBtdXN0IGJlIGluIHRoZSBzYW1lIHRhcmdldCBuYW1lc3BhY2UKLWFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiA8L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFhNTCBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGFkZCBhbiBpbmNsdWRlCi1lbGVtZW50LCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHNlbGVjdCB5b3VyIHNjaGVtYS48L3NwYW4+IFRoZSBlbnRpcmUKLXNjaGVtYSBhbmQgaXRzIGNvbnRlbnRzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIERlc2lnbiB2aWV3LjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCByaWdodC1jbGljayBpbiB0aGUgPHN0cm9uZz5EaXJlY3RpdmVzPC9zdHJvbmc+IHNlY3Rpb24KLWFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQgSW5jbHVkZTwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDxzdHJvbmc+R2VuZXJhbDwvc3Ryb25nPiB0YWIgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMgZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gdG8KLXRoZSByaWdodCBvZiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hIGxvY2F0aW9uPC9zcGFuPiBmaWVsZC48L3NwYW4+IFRoZQotWE1MIHNjaGVtYSBmaWxlIHlvdSBzZWxlY3QgbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgY3VycmVudCBzY2hlbWEuCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIHNlbGVjdCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4gdGhlIHdvcmtiZW5jaCwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldvcmtiZW5jaAotcHJvamVjdHM8L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi4gPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBzY2hlbWEgeW91IHdhbnQgdG8gaW5jbHVkZSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSB3YW50IHRvIHNlbGVjdCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgb24gdGhlIFdlYiwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkhUVFA8L3NwYW4+IGFuZAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmV4dDwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSB0aGUgVVJMIG9mIHRoZSBYTUwgc2NoZW1hIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj4KLSA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gIEEgbG9jYWwgY29weSBvZiB0aGUgc2NoZW1hIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgd29ya2JlbmNoLgotRXZlcnkgdGltZSB5b3UgdmFsaWRhdGUgeW91ciBzY2hlbWEsIHRoZSBzY2hlbWEncyBjb250ZW50cyB3aWxsIGJlIGNoZWNrZWQKLWZyb20gdGhlIFVSTCB5b3Ugc3BlY2lmeS48L2Rpdj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIHdpbGwgcmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmNsdWRlZAotWE1MIHNjaGVtYSBmaWxlLCBhbmQgZGlzcGxheSBpdCBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NoZW1hIGxvY2F0aW9uPC9zcGFuPiBmaWVsZC4KLVRoaXMgZmllbGQgY2FuIGJlIGVkaXRlZCBhdCBhbnkgdGltZSB0byByZWZsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIHNjaGVtYQotZmlsZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGluY2x1ZGUgZWxlbWVudC48L3NwYW4+IFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiBwYWdlCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHRhYiBpZiB5b3Ugd2FudCB0bwotYWRkIGFwcGxpY2F0aW9uIGluZm9ybWF0aW9uIGVsZW1lbnRzIHRvIHlvdXIgYW5ub3RhdGlvbnMgb2Ygc2NoZW1hIGNvbXBvbmVudHMuPC9zcGFuPgotIFRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiBwYWdlIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUKLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgaW5jbHVkZSBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwgd2hlbgoteW91IGRlZmluZSBuZXcgZWxlbWVudHMsIGF0dHJpYnV0ZXMsIGNvbXBsZXggdHlwZXMsIG9yIHNpbXBsZSB0eXBlcyB3aGVyZQoteW91IGNhbiBzcGVjaWZ5IHR5cGUgaW5mb3JtYXRpb24sIGFueSBkZWNsYXJhdGlvbnMgZnJvbSB0aGUgaW5jbHVkZWQgc2NoZW1hCi13aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VHlwZTwvc3Bhbj4gbGlzdCBmb3IgdGhlIGVsZW1lbnQsCi1hdHRyaWJ1dGUsIGNvbXBsZXggb3Igc2ltcGxlIHR5cGUuPC9wPgotPHA+Rm9yIGV4YW1wbGUsIGlmIEFkZHJlc3MueHNkIGhhcyB0aGUKLWZvbGxvd2luZyBjb250ZW50OjwvcD4KLTxwcmU+Jmx0O2NvbXBsZXhUeXBlIG5hbWU9IkFkZHJlc3MiJmd0OwotICAgICZsdDtzZXF1ZW5jZSZndDsKLSAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibmFtZSIgdHlwZT0ic3RyaW5nIiZndDsKLSAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ic3RyZWV0IiB0eXBlPSJzdHJpbmciJmd0OwotICAgICZsdDsvc2VxdWVuY2UmZ3Q7Ci0mbHQ7L2NvbXBsZXhUeXBlJmd0OwotPC9wcmU+Ci1hbmQgeW91IGhhdmUgYW4gWE1MIHNjaGVtYSBjYWxsZWQgUHVyY2hhc2VPcmRlci54c2QgdGhhdCBoYXMgYWRkZWQKLWFuIGluY2x1ZGUgZm9yIEFkZHJlc3MueHNkLCB0aGVuIHdoZW4gZGVmaW5pbmcgYSBuZXcgZWxlbWVudCBpbiAgUHVyY2hhc2VPcmRlciwKLXlvdSBjYW4gc2VsZWN0IEFkZHJlc3MgYXMgaXRzIHR5cGUuICA8cD4oYykgQ29weXJpZ2h0IDIwMDEsIFdvcmxkIFdpZGUgV2ViCi1Db25zb3J0aXVtIChNYXNzYWNodXNldHRzIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUKLWVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGFkZGltcHQuaHRtbCIgdGl0bGU9IkFzIHNjaGVtYXMgYmVjb21lIGxhcmdlciwgaXQgaXMgb2Z0ZW4gZGVzaXJhYmxlIHRvIGRpdmlkZSB0aGVpciBjb250ZW50IGFtb25nIHNldmVyYWwgc2NoZW1hIGRvY3VtZW50cyBmb3IgcHVycG9zZXMgc3VjaCBhcyBlYXNlIG9mIG1haW50ZW5hbmNlLCByZXVzZSwgYW5kIHJlYWRhYmlsaXR5LiBZb3UgY2FuIHVzZSBhbiBpbXBvcnQgZWxlbWVudCB0byBicmluZyBpbiBkZWZpbml0aW9ucyBhbmQgZGVjbGFyYXRpb25zIGZyb20gYW4gaW1wb3J0ZWQgc2NoZW1hIGludG8gdGhlIGN1cnJlbnQgc2NoZW1hLiI+QWRkaW5nIGltcG9ydCBlbGVtZW50czwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRyZGZuLmh0bWwiIHRpdGxlPSJZb3UgY2FuIHVzZSB0aGUgcmVkZWZpbmUgbWVjaGFuaXNtIHRvIHJlZGVmaW5lIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3VwcyBvYnRhaW5lZCBmcm9tIGV4dGVybmFsIHNjaGVtYSBmaWxlcy4gV2hlbiB5b3UgcmVkZWZpbmUgYSBjb21wb25lbnQsIHlvdSBhcmUgbW9kaWZ5aW5nIGl0cyBjb250ZW50cy4iPkFkZGluZyByZWRlZmluZSBlbGVtZW50czwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ybm1zcGMuaHRtbCIgdGl0bGU9IkFuIFhNTCBuYW1lc3BhY2UgaXMgYSBjb2xsZWN0aW9uIG9mIG5hbWVzLCBpZGVudGlmaWVkIGJ5IGEgVVJJIHJlZmVyZW5jZSwgd2hpY2ggYXJlIHVzZWQgaW4gWE1MIGRvY3VtZW50cyBhcyBlbGVtZW50IHR5cGVzIGFuZCBhdHRyaWJ1dGUgbmFtZXMuIj5YTUwgbmFtZXNwYWNlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTY4MGVmLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRhZGRub3QiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkFkZGluZyBub3RhdGlvbnM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkFkZGluZyBub3RhdGlvbnM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QSBub3RhdGlvbiBpcyBhIG1lYW5zIG9mIGFzc29jaWF0aW5nIGEgYmluYXJ5IGRlc2NyaXB0aW9uIHdpdGgNCi1hbiBlbnRpdHkgb3IgYXR0cmlidXRlLiBUaGUgbW9zdCBjb21tb24gdXNlcyBvZiBub3RhdGlvbnMgYXJlIHRvIGluY2x1ZGUgZmFtaWxpYXINCi10eXBlcyBvZiBiaW5hcnkgcmVmZXJlbmNlcywgc3VjaCBhcyBHSUZzIGFuZCBKUEdzLCBpbiBhbiBYTUwgZmlsZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5ub3RhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5ub3RhdGlvbnM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5ub3RhdGlvbnM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPm5vdGF0aW9uczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Gb3IgZXhhbXBsZSwgeW91IGFyZSBtYWtpbmcgYSBjYXRhbG9ndWUgb2YgeW91ciBjbG90aGluZyBhbmQgd2FudA0KLXRvIGluY2x1ZGUgYW4gaW1hZ2Ugb2Ygb25lIG9mIHlvdXIgc2hpcnRzLiBZb3Ugd291bGQgaGF2ZSB0byBjcmVhdGUgYSBub3RhdGlvbg0KLWxpa2UgdGhpczogIDx1c2VyaW5wdXQ+Jmx0O25vdGF0aW9uIG5hbWU9Ik15X1NoaXJ0IiBzeXN0ZW09IkdJRiI+Jmx0Oy9ub3RhdGlvbj48L3VzZXJpbnB1dD4gd2hpY2gNCi1kZWZpbmVzIGEgbm90YXRpb24gZm9yIGEgR0lGIGltYWdlLjwvcD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlDQotd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyDQotcGVyc3BlY3RpdmVzLjwvcD48cD5UbyBjcmVhdGUgYSBub3RhdGlvbiwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIHlvdXIgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHVpY29udHJvbD5BZGQNCi1Ob3RhdGlvbjwvdWljb250cm9sPi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBub3RhdGlvbiBpbiB0aGUgPHVpY29udHJvbD5OYW1lPC91aWNvbnRyb2w+IGZpZWxkLjwvY21kPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPk90aGVyPC91aWNvbnRyb2w+IHRhYi48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgPHVpY29udHJvbD5wdWJsaWM8L3VpY29udHJvbD4gZmllbGQsIHR5cGUgYSBwdWJsaWMgaWRlbnRpZmllci48L2NtZD4NCi08aW5mbz4gVGhpcyBpcyBvcHRpb25hbCBpZiB5b3UgZW50ZXIgYSB2YWx1ZSBpbiB0aGUgPHVpY29udHJvbD5zeXN0ZW08L3VpY29udHJvbD4gZmllbGQuPC9pbmZvPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSA8dWljb250cm9sPnN5c3RlbTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSBhIFVSSSByZWZlcmVuY2UuPC9jbWQ+DQotPGluZm8+IFRoaXMgaXMgb3B0aW9uYWwgaWYgeW91IGVudGVyIGEgdmFsdWUgaW4gdGhlIDx1aWNvbnRyb2w+cHVibGljPC91aWNvbnRyb2w+IGZpZWxkLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudA0KLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbm90YXRpb24uPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi4gPHVpY29udHJvbD5BcHANCi1JbmZvPC91aWNvbnRyb2w+IHBhZ2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zLjwvaW5mbz4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PD9QdWIgQ2FyZXQ/Pjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyOTU5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRub3QuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTA3OGIwLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZG5vdC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhRE9DVFlQRSBodG1sCi0gIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sPgotPGhlYWQ+Ci08IS0tIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0gKiBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSAqIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotICogCi0gKiBDb250cmlidXRvcnM6Ci0gKiAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8gLS0+Ci08bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgLz4KLTx0aXRsZT5BZGRpbmcgbm90YXRpb25zPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0YWRkbm90Ij48YSBuYW1lPSJ0YWRkbm90Ij48IS0tIC0tPjwvYT4KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIG5vdGF0aW9uczwvaDE+Ci08ZGl2PjxwPkEgbm90YXRpb24gaXMgYSBtZWFucyBvZiBhc3NvY2lhdGluZyBhIGJpbmFyeSBkZXNjcmlwdGlvbiB3aXRoCi1hbiBlbnRpdHkgb3IgYXR0cmlidXRlLiBUaGUgbW9zdCBjb21tb24gdXNlcyBvZiBub3RhdGlvbnMgYXJlIHRvIGluY2x1ZGUgZmFtaWxpYXIKLXR5cGVzIG9mIGJpbmFyeSByZWZlcmVuY2VzLCBzdWNoIGFzIEdJRnMgYW5kIEpQR3MsIGluIGFuIFhNTCBmaWxlLjwvcD4KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkZvciBleGFtcGxlLCB5b3UgYXJlIG1ha2luZyBhIGNhdGFsb2d1ZSBvZiB5b3VyIGNsb3RoaW5nIGFuZCB3YW50Ci10byBpbmNsdWRlIGFuIGltYWdlIG9mIG9uZSBvZiB5b3VyIHNoaXJ0cy4gWW91IHdvdWxkIGhhdmUgdG8gY3JlYXRlIGEgbm90YXRpb24KLWxpa2UgdGhpczogIDxrYmQgY2xhc3M9InVzZXJpbnB1dCI+Jmx0O25vdGF0aW9uIG5hbWU9Ik15X1NoaXJ0IiBzeXN0ZW09IkdJRiImZ3Q7Jmx0Oy9ub3RhdGlvbiZndDs8L2tiZD4gd2hpY2gKLWRlZmluZXMgYSBub3RhdGlvbiBmb3IgYSBHSUYgaW1hZ2UuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCAKLXRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8KLWNyZWF0ZSBhIG5vdGF0aW9uLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci08b2w+PGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCByaWdodC1jbGljayB5b3VyIFhNTCBzY2hlbWEgYW5kIGNsaWNrIAotPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZAotTm90YXRpb248L3NwYW4+PC9iPi48L3NwYW4+PC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCB0eXBlIHRoZSBuYW1lIG9mIHRoZSBub3RhdGlvbiBpbiB0aGUgCi08Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+TmFtZTwvc3Bhbj48L2I+IGZpZWxkLjwvc3Bhbj48L2xpPgotPGxpIGNsYXNzPSJza2lwc3BhY2UiPjxzcGFuPkNsaWNrIHRoZSA8Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T3RoZXI8L3NwYW4+PC9iPiB0YWIuPC9zcGFuPjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SW4gdGhlIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5wdWJsaWM8L3NwYW4+PC9iPiBmaWVsZCwgdHlwZSBhIHB1YmxpYyBpZGVudGlmaWVyLjwvc3Bhbj4gIFRoaXMgaXMgb3B0aW9uYWwgaWYgeW91IGVudGVyIGEgdmFsdWUgaW4gdGhlIAotPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPnN5c3RlbTwvc3Bhbj48L2I+IGZpZWxkLjwvbGk+Ci08bGkgY2xhc3M9InNraXBzcGFjZSI+PHNwYW4+SW4gdGhlIDxiPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5zeXN0ZW08L3NwYW4+PC9iPiBmaWVsZCwgdHlwZSBhIFVSSSByZWZlcmVuY2UuPC9zcGFuPiAgVGhpcyBpcyBvcHRpb25hbCBpZiB5b3UgZW50ZXIgYSB2YWx1ZSBpbiB0aGUgCi08Yj4gPHNwYW4gY2xhc3M9InVpY29udHJvbCI+cHVibGljPC9zcGFuPjwvYj4gZmllbGQuPC9saT4KLTxsaSBjbGFzcz0ic2tpcHNwYWNlIj48c3Bhbj5DbGljayB0aGUgPGI+IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+PC9iPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgbm90YXRpb24uPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbiwgYW5kIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BcHAKLUluZm88L3NwYW4+IHBhZ2UgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBpbmZvcm1hdGlvbiBmb3IgYXBwbGljYXRpb25zLjwvbGk+Ci08L29sPgotPC9kaXY+Ci08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMGU3YjQxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHJkZm4uZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkcmRmbiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+WW91IGNhbiB1c2UgdGhlIDxjb2RlcGg+cmVkZWZpbmU8L2NvZGVwaD4gbWVjaGFuaXNtIHRvIHJlZGVmaW5lDQotc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwNCi1zY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuPC9zaG9ydGRlc2M+DQotPHByb2xvZz48bWV0YWRhdGE+DQotPGtleXdvcmRzPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPmFkZGluZzxpbmRleHRlcm0+cmVkZWZpbmUNCi1lbGVtZW50czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MIHNjaGVtYSBlZGl0b3I8aW5kZXh0ZXJtPnJlZGVmaW5lDQotZWxlbWVudHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjxpbmRleHRlcm0+WE1MDQotc2NoZW1hIGZpbGVzPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPnJlZGVmaW5lIGVsZW1lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5yZWRlZmluZSBlbGVtZW50czxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5MaWtlIHRoZSA8Y29kZXBoPmluY2x1ZGU8L2NvZGVwaD4gbWVjaGFuaXNtLCA8Y29kZXBoPnJlZGVmaW5lPC9jb2RlcGg+IHJlcXVpcmVzDQotdGhlIGV4dGVybmFsIGNvbXBvbmVudHMgdG8gYmUgaW4gdGhlIHNhbWUgdGFyZ2V0IG5hbWVzcGFjZSBhcyB0aGUgcmVkZWZpbmluZw0KLXNjaGVtYSwgYWx0aG91Z2ggZXh0ZXJuYWwgY29tcG9uZW50cyBmcm9tIHNjaGVtYXMgdGhhdCBoYXZlIG5vIG5hbWVzcGFjZSBjYW4NCi1hbHNvIGJlIHJlZGVmaW5lZC48L3A+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UNCi1wZXJzcGVjdGl2ZSwgYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvDQotYWRkIGEgcmVkZWZpbmUgZWxlbWVudDo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgeW91ciBzY2hlbWEuPC9jbWQ+PGluZm8+VGhlIGVudGlyZQ0KLXNjaGVtYSBhbmQgaXRzIGNvbnRlbnRzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIERlc2lnbiB2aWV3LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgRGVzaWduIHZpZXcsIHJpZ2h0LWNsaWNrIGluIHRoZSA8Yj5EaXJlY3RpdmVzPC9iPiBzZWN0aW9uDQotYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkIFJlZGVmaW5lPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8Yj5HZW5lcmFsPC9iPiB0YWIgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IDxpbWFnZQ0KLWhyZWY9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIj48YWx0PlRoaXMgZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IHRvDQotPD9QdWIgQ2FyZXQ/PnRoZSByaWdodCBvZiB0aGUgPHVpY29udHJvbD5TY2hlbWEgbG9jYXRpb248L3VpY29udHJvbD4gZmllbGQuPC9jbWQ+DQotPGluZm8+VGhlIFhNTCBzY2hlbWEgZmlsZSB5b3Ugc2VsZWN0IG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lc3BhY2UgYXMgdGhlIGN1cnJlbnQNCi1zY2hlbWEuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPklmIHlvdSB3YW50IHRvIHNlbGVjdCBhbiBYTUwgc2NoZW1hIGxvY2F0ZWQgaW4gdGhlIHdvcmtiZW5jaCwgc2VsZWN0IDx1aWNvbnRyb2w+V29ya2JlbmNoDQotcHJvamVjdHM8L3VpY29udHJvbD4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dC48L3VpY29udHJvbD48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHNjaGVtYSB5b3Ugd2FudCB0byBpbmNsdWRlIGFuZCBjbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugd2FudCB0byBzZWxlY3QgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWIsIHNlbGVjdCA8dWljb250cm9sPkhUVFA8L3VpY29udHJvbD4gYW5kDQotY2xpY2sgPHVpY29udHJvbD5OZXh0PC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+DQotPGluZm8+IDxub3RlPkEgbG9jYWwgY29weSBvZiB0aGUgc2NoZW1hIHdpbGwgbm90IGJlIHN0b3JlZCBpbiB0aGUgd29ya2JlbmNoLg0KLUV2ZXJ5IHRpbWUgeW91IHZhbGlkYXRlIHlvdXIgc2NoZW1hLCB0aGUgc2NoZW1hJ3MgY29udGVudHMgd2lsbCBiZSBjaGVja2VkDQotZnJvbSB0aGUgVVJMIHlvdSBzcGVjaWZ5Ljwvbm90ZT48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIHdpbGwgcmV0cmlldmUgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbmNsdWRlZA0KLVhNTCBzY2hlbWEgZmlsZSwgYW5kIGRpc3BsYXkgaXQgaW4gdGhlIDx1aWNvbnRyb2w+U2NoZW1hIGxvY2F0aW9uPC91aWNvbnRyb2w+IGZpZWxkLg0KLVRoaXMgZmllbGQgY2FuIGJlIGVkaXRlZCBhdCBhbnkgdGltZSB0byByZWZsZWN0IHRoZSBsb2NhdGlvbiBvZiB0aGUgWE1MIHNjaGVtYQ0KLWZpbGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHJlZGVmaW5lIGVsZW1lbnQuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+T25jZSB5b3UgaGF2ZSBhZGRlZCB0aGUgcmVkZWZpbmUgZWxlbWVudCB0byB5b3VyIFhNTCBzY2hlbWEsIHlvdQ0KLWNhbiByZWRlZmluZSBhbnkgb2YgdGhlIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3Vwcw0KLWluIHRoZSBYTUwgc2NoZW1hIHlvdSBzZWxlY3RlZCBpbiB0aGUgcmVkZWZpbmUgZWxlbWVudC4gPC9wPjwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDA0MDU1Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZGZuLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3ODIwYzguLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmRmbi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyByZWRlZmluZSBlbGVtZW50cyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIHVzZSB0aGUgcmVkZWZpbmUgbWVjaGFuaXNtIHRvIHJlZGVmaW5lIHNpbXBsZSBhbmQgY29tcGxleCB0eXBlcywgZ3JvdXBzLCBhbmQgYXR0cmlidXRlIGdyb3VwcyBvYnRhaW5lZCBmcm9tIGV4dGVybmFsIHNjaGVtYSBmaWxlcy4gV2hlbiB5b3UgcmVkZWZpbmUgYSBjb21wb25lbnQsIHlvdSBhcmUgbW9kaWZ5aW5nIGl0cyBjb250ZW50cy4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiB1c2UgdGhlIHJlZGVmaW5lIG1lY2hhbmlzbSB0byByZWRlZmluZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMgb2J0YWluZWQgZnJvbSBleHRlcm5hbCBzY2hlbWEgZmlsZXMuIFdoZW4geW91IHJlZGVmaW5lIGEgY29tcG9uZW50LCB5b3UgYXJlIG1vZGlmeWluZyBpdHMgY29udGVudHMuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgcmVkZWZpbmUgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMsIHJlZGVmaW5lIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgcmVkZWZpbmUgZWxlbWVudHMsIFhNTCBzY2hlbWEgZmlsZXMsIHJlZGVmaW5lIGVsZW1lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZHJkZm4iIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5BZGRpbmcgcmVkZWZpbmUgZWxlbWVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRyZGZuIj48YSBuYW1lPSJ0YWRkcmRmbiI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+QWRkaW5nIHJlZGVmaW5lIGVsZW1lbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5Zb3UgY2FuIHVzZSB0aGUgPHNhbXAgY2xhc3M9ImNvZGVwaCI+cmVkZWZpbmU8L3NhbXA+IG1lY2hhbmlzbSB0byByZWRlZmluZQotc2ltcGxlIGFuZCBjb21wbGV4IHR5cGVzLCBncm91cHMsIGFuZCBhdHRyaWJ1dGUgZ3JvdXBzIG9idGFpbmVkIGZyb20gZXh0ZXJuYWwKLXNjaGVtYSBmaWxlcy4gV2hlbiB5b3UgcmVkZWZpbmUgYSBjb21wb25lbnQsIHlvdSBhcmUgbW9kaWZ5aW5nIGl0cyBjb250ZW50cy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkxpa2UgdGhlIDxzYW1wIGNsYXNzPSJjb2RlcGgiPmluY2x1ZGU8L3NhbXA+IG1lY2hhbmlzbSwgPHNhbXAgY2xhc3M9ImNvZGVwaCI+cmVkZWZpbmU8L3NhbXA+IHJlcXVpcmVzCi10aGUgZXh0ZXJuYWwgY29tcG9uZW50cyB0byBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSByZWRlZmluaW5nCi1zY2hlbWEsIGFsdGhvdWdoIGV4dGVybmFsIGNvbXBvbmVudHMgZnJvbSBzY2hlbWFzIHRoYXQgaGF2ZSBubyBuYW1lc3BhY2UgY2FuCi1hbHNvIGJlIHJlZGVmaW5lZC48L3A+Ci08cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZQotcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvCi1hZGQgYSByZWRlZmluZSBlbGVtZW50OjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgeW91ciBzY2hlbWEuPC9zcGFuPiBUaGUgZW50aXJlCi1zY2hlbWEgYW5kIGl0cyBjb250ZW50cyBhcmUgZGlzcGxheWVkIGluIHRoZSBEZXNpZ24gdmlldy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBEZXNpZ24gdmlldywgcmlnaHQtY2xpY2sgaW4gdGhlIDxzdHJvbmc+RGlyZWN0aXZlczwvc3Ryb25nPiBzZWN0aW9uCi1hbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkIFJlZGVmaW5lPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHN0cm9uZz5HZW5lcmFsPC9zdHJvbmc+IHRhYiBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iVGhpcyBncmFwaGljIGlzIHRoZSBCcm93c2UgYnV0dG9uIiAvPiB0bwotdGhlIHJpZ2h0IG9mIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5TY2hlbWEgbG9jYXRpb248L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLSBUaGUgWE1MIHNjaGVtYSBmaWxlIHlvdSBzZWxlY3QgbXVzdCBoYXZlIHRoZSBzYW1lIG5hbWVzcGFjZSBhcyB0aGUgY3VycmVudAotc2NoZW1hLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SWYgeW91IHdhbnQgdG8gc2VsZWN0IGFuIFhNTCBzY2hlbWEgbG9jYXRlZCBpbiB0aGUgd29ya2JlbmNoLCBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya2JlbmNoCi1wcm9qZWN0czwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQuPC9zcGFuPjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgc2NoZW1hIHlvdSB3YW50IHRvIGluY2x1ZGUgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugd2FudCB0byBzZWxlY3QgYW4gWE1MIHNjaGVtYSBsb2NhdGVkIG9uIHRoZSBXZWIsIHNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5IVFRQPC9zcGFuPiBhbmQKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlR5cGUgdGhlIFVSTCBvZiB0aGUgWE1MIHNjaGVtYSBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmluaXNoPC9zcGFuPi48L3NwYW4+Ci0gIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBBIGxvY2FsIGNvcHkgb2YgdGhlIHNjaGVtYSB3aWxsIG5vdCBiZSBzdG9yZWQgaW4gdGhlIHdvcmtiZW5jaC4KLUV2ZXJ5IHRpbWUgeW91IHZhbGlkYXRlIHlvdXIgc2NoZW1hLCB0aGUgc2NoZW1hJ3MgY29udGVudHMgd2lsbCBiZSBjaGVja2VkCi1mcm9tIHRoZSBVUkwgeW91IHNwZWNpZnkuPC9kaXY+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRoZSBYTUwgc2NoZW1hIGVkaXRvciB3aWxsIHJldHJpZXZlIHRoZSBsb2NhdGlvbiBvZiB0aGUgaW5jbHVkZWQKLVhNTCBzY2hlbWEgZmlsZSwgYW5kIGRpc3BsYXkgaXQgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlNjaGVtYSBsb2NhdGlvbjwvc3Bhbj4gZmllbGQuCi1UaGlzIGZpZWxkIGNhbiBiZSBlZGl0ZWQgYXQgYW55IHRpbWUgdG8gcmVmbGVjdCB0aGUgbG9jYXRpb24gb2YgdGhlIFhNTCBzY2hlbWEKLWZpbGUuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHRhYiBpZiB5b3Ugd2FudAotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyByZWRlZmluZSBlbGVtZW50Ljwvc3Bhbj4gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UKLWlzIHVzZWQgZm9yIGh1bWFuIHJlYWRhYmxlIG1hdGVyaWFsLCBzdWNoIGFzIGEgZGVzY3JpcHRpb24uPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50IHRvCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L3NwYW4+Ci0gVGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkV4dGVuc2lvbnM8L3NwYW4+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5PbmNlIHlvdSBoYXZlIGFkZGVkIHRoZSByZWRlZmluZSBlbGVtZW50IHRvIHlvdXIgWE1MIHNjaGVtYSwgeW91Ci1jYW4gcmVkZWZpbmUgYW55IG9mIHRoZSBzaW1wbGUgYW5kIGNvbXBsZXggdHlwZXMsIGdyb3VwcywgYW5kIGF0dHJpYnV0ZSBncm91cHMKLWluIHRoZSBYTUwgc2NoZW1hIHlvdSBzZWxlY3RlZCBpbiB0aGUgcmVkZWZpbmUgZWxlbWVudC4gPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIHRpdGxlPSJBcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwgcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgYW4gaW1wb3J0IGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4iPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiB0aXRsZT0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTxkaXYgY2xhc3M9InJlbHJlZiI+PHN0cm9uZz5SZWxhdGVkIHJlZmVyZW5jZTwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3Mvcm5tc3BjLmh0bWwiIHRpdGxlPSJBbiBYTUwgbmFtZXNwYWNlIGlzIGEgY29sbGVjdGlvbiBvZiBuYW1lcywgaWRlbnRpZmllZCBieSBhIFVSSSByZWZlcmVuY2UsIHdoaWNoIGFyZSB1c2VkIGluIFhNTCBkb2N1bWVudHMgYXMgZWxlbWVudCB0eXBlcyBhbmQgYXR0cmlidXRlIG5hbWVzLiI+WE1MIG5hbWVzcGFjZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmYzczYi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08dGFzayBpZD0idGFkZHJlZyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIHBhdHRlcm4gZmFjZXRzIHRvIHNpbXBsZSB0eXBlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5BIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncw0KLWxleGljYWwgc3BhY2UgKHRoZSBzZXQgb2Ygc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSB0eXBlKSwNCi13aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5hZGRpbmc8aW5kZXh0ZXJtPnBhdHRlcm4NCi1mYWNldHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5wYXR0ZXJuDQotZmFjZXRzPGluZGV4dGVybT5hZGRpbmc8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTA0KLXNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5wYXR0ZXJuIGZhY2V0czwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+cGF0dGVybiBmYWNldHM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+IFRoZSB2YWx1ZSBvZiB0aGUgcGF0dGVybiBpcyBjYWxsZWQgYSByZWd1bGFyIGV4cHJlc3Npb24uIFlvdQ0KLWNhbiBzcGVjaWZ5IGl0IHVzaW5nIHRoZSA8dWljb250cm9sPlJlZ3VsYXIgRXhwcmVzc2lvbjwvdWljb250cm9sPiB3aXphcmQuPC9wPjxwPlRvDQotYWRkIGEgcGF0dGVybiB0byBhIHNpbXBsZSB0eXBlOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgdGhlIHNpbXBsZSB0eXBlIHlvdSB3YW50IHRvIHdvcmsgd2l0aC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHVpY29udHJvbD5Db25zdHJhaW50czwvdWljb250cm9sPiB0YWIsDQotdGhlbiA8dWljb250cm9sPlBhdHRlcm5zPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+QWRkPC91aWNvbnRyb2w+LjwvY21kPjxpbmZvPlRoZSBSZWd1bGFyIEV4cHJlc3Npb24NCi13aXphcmQgb3BlbnMuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgdG9rZW4geW91IHdhbnQgdG8gYWRkIHRvIHRoZSBleHByZXNzaW9uLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluZGljYXRlIGhvdyBvZnRlbiB5b3Ugd2FudCB0aGUgdG9rZW4gdG8gYXBwZWFyIGluIG9yZGVyIGZvciBhDQotbWF0Y2ggdG8gc3VjY2VlZDo8L2NtZD4NCi08Y2hvaWNlcz4NCi08Y2hvaWNlPklmIHlvdSB3YW50IHRoZSB0b2tlbiB0byByZXBlYXQsIGNsaWNrIDx1aWNvbnRyb2w+UmVwZWF0PC91aWNvbnRyb2w+IGFuZA0KLXNwZWNpZnkgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdG9rZW4gbXVzdCBhcHBlYXIuPC9jaG9pY2U+DQotPC9jaG9pY2VzPg0KLTxjaG9pY2VzPg0KLTxjaG9pY2U+IElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUNCi10b2tlbiBjYW4gYXBwZWFyLCBjbGljayA8dWljb250cm9sPlJhbmdlPC91aWNvbnRyb2w+IGFuZCBlbnRlciBhIG1pbmltdW0gYW5kDQotbWF4aW11bSB2YWx1ZS48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gYWRkIHRoZSB0b2tlbiB0byB0aGUgcmVndWxhciBleHByZXNzaW9uLCBjbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi4gPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gY3JlYXRlIHRoZSBlbnRpcmUgZXhwcmVzc2lvbiwgcmVwZWF0IHN0ZXBzIDQgLSA2IGFzIG5lY2Vzc2FyeS48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5XaGVuIHlvdSBhcmUgZmluaXNoZWQsIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD4oT3B0aW9uYWwpIFRvIHRlc3QgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uIGFuZCBzZWUgaWYgYQ0KLW1hdGNoIG9jY3VycywgZW50ZXIgc2FtcGxlIHRleHQuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PHN0ZXByZXN1bHQ+IFRoZSByZWd1bGFyDQotZXhwcmVzc2lvbiB3aWxsIGFwcGVhciBpbiB0aGUgUGF0dGVybnMgcGFnZS4gPG5vdGUgdHlwZT0idGlwIj4gVG8gZWRpdCBhbg0KLWV4aXN0aW5nIHBhdHRlcm4sIHNlbGVjdCBpdCBpbiB0aGUgUGF0dGVybnMgcGFnZSBhbmQgY2xpY2sgPHVpY29udHJvbD5FZGl0PC91aWNvbnRyb2w+Lg0KLVRvIGRlbGV0ZSBhbiBleGlzdGluZyBwYXR0ZXJuLCBzZWxlY3QgaXQgaW4gdGhlIFBhdHRlcm5zIHBhZ2UgYW5kIGNsaWNrIDx1aWNvbnRyb2w+RGVsZXRlPC91aWNvbnRyb2w+LiA8P1B1YiBDYXJldD8+PC9ub3RlPjwvc3RlcHJlc3VsdD4NCi08L3N0ZXA+DQotPC9zdGVwcz4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCi08P1B1YiAqMDAwMDAwMjk1Mj8+DQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkcmVnLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmEwYzA3YS4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRyZWcuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQSBwYXR0ZXJuIGZhY2V0IGNhbiBiZSB1c2VkIHRvIGNvbnN0cmFpbiB0aGUgdmFsdWUgb2YgYSB0eXBlJ3MgbGV4aWNhbCBzcGFjZSAodGhlIHNldCBvZiBzdHJpbmcgbGl0ZXJhbHMgdGhhdCByZXByZXNlbnQgdGhlIHZhbHVlcyBvZiBhIHR5cGUpLCB3aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJBIHBhdHRlcm4gZmFjZXQgY2FuIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSB2YWx1ZSBvZiBhIHR5cGUncyBsZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksIHdoaWNoIGluZGlyZWN0bHkgY29uc3RyYWlucyB0aGUgdmFsdWUgc3BhY2UuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgcGF0dGVybiBmYWNldHMsIFhNTCBzY2hlbWEgZmlsZXMsIHBhdHRlcm4gZmFjZXRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGFkZGluZywgcGF0dGVybiBmYWNldHMsIFhNTCBzY2hlbWEgZmlsZXMsIHBhdHRlcm4gZmFjZXRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRzbXB0Lmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGFkZHJlZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRhZGRyZWciPjxhIG5hbWU9InRhZGRyZWciPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPkEgcGF0dGVybiBmYWNldCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIHZhbHVlIG9mIGEgdHlwZSdzCi1sZXhpY2FsIHNwYWNlICh0aGUgc2V0IG9mIHN0cmluZyBsaXRlcmFscyB0aGF0IHJlcHJlc2VudCB0aGUgdmFsdWVzIG9mIGEgdHlwZSksCi13aGljaCBpbmRpcmVjdGx5IGNvbnN0cmFpbnMgdGhlIHZhbHVlIHNwYWNlLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+IFRoZSB2YWx1ZSBvZiB0aGUgcGF0dGVybiBpcyBjYWxsZWQgYSByZWd1bGFyIGV4cHJlc3Npb24uIFlvdQotY2FuIHNwZWNpZnkgaXQgdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZ3VsYXIgRXhwcmVzc2lvbjwvc3Bhbj4gd2l6YXJkLjwvcD4KLTxwPlRvCi1hZGQgYSBwYXR0ZXJuIHRvIGEgc2ltcGxlIHR5cGU6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIERlc2lnbiB2aWV3LCBzZWxlY3QgdGhlIHNpbXBsZSB0eXBlIHlvdSB3YW50IHRvIHdvcmsgd2l0aC48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Db25zdHJhaW50czwvc3Bhbj4gdGFiLAotdGhlbiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuczwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPi48L3NwYW4+IFRoZSBSZWd1bGFyIEV4cHJlc3Npb24KLXdpemFyZCBvcGVucy48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgdG9rZW4geW91IHdhbnQgdG8gYWRkIHRvIHRoZSBleHByZXNzaW9uLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluZGljYXRlIGhvdyBvZnRlbiB5b3Ugd2FudCB0aGUgdG9rZW4gdG8gYXBwZWFyIGluIG9yZGVyIGZvciBhCi1tYXRjaCB0byBzdWNjZWVkOjwvc3Bhbj4KLTx1bD4KLTxsaT5JZiB5b3Ugd2FudCB0aGUgdG9rZW4gdG8gcmVwZWF0LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SZXBlYXQ8L3NwYW4+IGFuZAotc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSB0b2tlbiBtdXN0IGFwcGVhci48L2xpPgotCi08L3VsPgotCi08dWw+Ci08bGk+IElmIHlvdSB3YW50IHRvIHNwZWNpZnkgYSBtaW5pbXVtIGFuZCBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUKLXRva2VuIGNhbiBhcHBlYXIsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJhbmdlPC9zcGFuPiBhbmQgZW50ZXIgYSBtaW5pbXVtIGFuZAotbWF4aW11bSB2YWx1ZS48L2xpPgotCi08L3VsPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlRvIGFkZCB0aGUgdG9rZW4gdG8gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QWRkPC9zcGFuPi4gPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyBjcmVhdGUgdGhlIGVudGlyZSBleHByZXNzaW9uLCByZXBlYXQgc3RlcHMgNCAtIDYgYXMgbmVjZXNzYXJ5Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+V2hlbiB5b3UgYXJlIGZpbmlzaGVkLCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPihPcHRpb25hbCkgVG8gdGVzdCBhZ2FpbnN0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24gYW5kIHNlZSBpZiBhCi1tYXRjaCBvY2N1cnMsIGVudGVyIHNhbXBsZSB0ZXh0Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9zcGFuPiAgVGhlIHJlZ3VsYXIKLWV4cHJlc3Npb24gd2lsbCBhcHBlYXIgaW4gdGhlIFBhdHRlcm5zIHBhZ2UuIDxkaXYgY2xhc3M9InRpcCI+PHNwYW4gY2xhc3M9InRpcHRpdGxlIj5UaXA6PC9zcGFuPiAgVG8gZWRpdCBhbgotZXhpc3RpbmcgcGF0dGVybiwgc2VsZWN0IGl0IGluIHRoZSBQYXR0ZXJucyBwYWdlIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FZGl0PC9zcGFuPi4KLVRvIGRlbGV0ZSBhbiBleGlzdGluZyBwYXR0ZXJuLCBzZWxlY3QgaXQgaW4gdGhlIFBhdHRlcm5zIHBhZ2UgYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGV0ZTwvc3Bhbj4uIDwvZGl2PgotCi08L2xpPgotCi08L29sPgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkc21wdC5odG1sIiB0aXRsZT0iU2ltcGxlIHR5cGVzIGFyZSB1c2VkIHRvIGNyZWF0ZSBkZXJpdmVkIGRhdGF0eXBlcy4gVGhleSBwcm92aWRlIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKSBhbmQgdGhlIGxleGljYWwgc3BhY2UgKGEgc2V0IG9mIHZhbGlkIGxpdGVyYWxzKSBvZiBhIGRhdGF0eXBlLiI+QWRkaW5nIHNpbXBsZSB0eXBlczwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0LmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0LmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjExMTEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90YWRkc21wdC5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiINCi0gInRhc2suZHRkIj4NCi08P1B1YiBJbmM/Pg0KLTx0YXNrIGlkPSJ0YWRkc21wdCIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+QWRkaW5nIHNpbXBsZSB0eXBlczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+QWRkaW5nIHNpbXBsZSB0eXBlczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5TaW1wbGUgdHlwZXMgYXJlIHVzZWQgdG8gY3JlYXRlPD9QdWIgQ2FyZXQ/PiBkZXJpdmVkIGRhdGF0eXBlcy4NCi1UaGV5IHByb3ZpZGUgYSBzZXQgb2YgY29uc3RyYWludHMgb24gdGhlIHZhbHVlIHNwYWNlIChhIHNldCBvZiB2YWx1ZXMpIGFuZA0KLXRoZSBsZXhpY2FsIHNwYWNlIChhIHNldCBvZiB2YWxpZCBsaXRlcmFscykgb2YgYSBkYXRhdHlwZS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5zaW1wbGUgdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZWRpdG9yPGluZGV4dGVybT5zaW1wbGUgdHlwZXM8aW5kZXh0ZXJtPmFkZGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+WE1MIHNjaGVtYSBmaWxlczxpbmRleHRlcm0+YWRkaW5nPGluZGV4dGVybT5zaW1wbGUgdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPnNpbXBsZSB0eXBlczxpbmRleHRlcm0+YWRkaW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5BIHNpbXBsZSB0eXBlIGNhbm5vdCBoYXZlIGVsZW1lbnQgY29udGVudCBhbmQgY2Fubm90IGNhcnJ5IGF0dHJpYnV0ZXMuDQotRWxlbWVudHMgdGhhdCBjb250YWluIG51bWJlcnMgKGFuZCBzdHJpbmdzLCBhbmQgZGF0ZXMsIGFuZCBzbyBvbikgYnV0IGRvIG5vdA0KLWNvbnRhaW4gYW55IHN1Yi1lbGVtZW50cyBoYXZlIGEgc2ltcGxlIHR5cGUuPC9wPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zDQotd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsIGJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkNCi1vdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGFkZCBhIHNpbXBsZSB0eXBlOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIDxiPlR5cGVzPC9iPiwgYW5kIGNsaWNrIDx1aWNvbnRyb2w+QWRkDQotU2ltcGxlIFR5cGU8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgc2VsZWN0IHRoZSBuZXcgc2ltcGxlIHR5cGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIFByb3BlcnRpZXMgdmlldywgY2xpY2sgdGhlIDx1aWNvbnRyb2w+R2VuZXJhbDwvdWljb250cm9sPiB0YWIuPC9jbWQ+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgc2ltcGxlIHR5cGUgaW4gdGhlIDx1aWNvbnRyb2w+TmFtZTwvdWljb250cm9sPiBmaWVsZC48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIHNlbGVjdCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgZnJvbSB0aGUgPHVpY29udHJvbD5WYXJpZXR5PC91aWNvbnRyb2w+IGxpc3Q6PC9jbWQ+DQotPGNob2ljZXM+DQotPGNob2ljZT48dWljb250cm9sPmF0b21pYzwvdWljb250cm9sPi4gQXRvbWljIHR5cGVzIGFyZSBhbGwgdGhlIHNpbXBsZSB0eXBlcw0KLWJ1aWx0IGludG8gdGhlIFhNTCBzY2hlbWEgbGFuZ3VhZ2UuPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPmxpc3Q8L3VpY29udHJvbD4uIExpc3QgdHlwZXMgYXJlIGNvbXByaXNlZCBvZiBzZXF1ZW5jZXMNCi1vZiBhdG9taWMgdHlwZXMuIFRoZXkgaGF2ZSB2YWx1ZXMgdGhhdCBhcmUgY29tcHJpc2VkIG9mIGZpbml0ZS1sZW5ndGggc2VxdWVuY2VzDQotb2YgYXRvbWljIHZhbHVlcy4gPC9jaG9pY2U+DQotPGNob2ljZT48dWljb250cm9sPnVuaW9uPC91aWNvbnRyb2w+LiBBIHVuaW9uIHR5cGUgZW5hYmxlcyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZQ0KLXZhbHVlIHRvIGJlIG9uZSBvciBtb3JlIGluc3RhbmNlcyBvZiBvbmUgdHlwZSBkcmF3biBmcm9tIHRoZSB1bmlvbiBvZiBtdWx0aXBsZQ0KLWF0b21pYyBhbmQgbGlzdCB0eXBlcy48L2Nob2ljZT4NCi08L2Nob2ljZXM+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SWYgeW91IHNlbGVjdGVkIDx1aWNvbnRyb2w+YXRvbWljPC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+VmFyaWV0eTwvdWljb250cm9sPiBsaXN0LA0KLWNsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IG5leHQgdG8gdGhlIDx1aWNvbnRyb2w+QmFzZSB0eXBlPC91aWNvbnRyb2w+IGZpZWxkDQotdG8gc3BlY2lmeSBhIGJhc2UgdHlwZSBmb3IgdGhlIHNpbXBsZSB0eXBlLjwvY21kPjxpbmZvPlRoZSBTZXQgVHlwZSBkaWFsb2cNCi1ib3ggbGlzdHMgYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbg0KLWNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZiB0aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZQ0KLWZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluDQoteW91ciB3b3Jrc3BhY2UuIDwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RW5jbG9zaW5nIFByb2plY3Q8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugc2VsZWN0ZWQgPHVpY29udHJvbD5saXN0PC91aWNvbnRyb2w+IGZyb20gdGhlIDx1aWNvbnRyb2w+VmFyaWV0eTwvdWljb250cm9sPiBsaXN0LA0KLWNsaWNrIDx1aWNvbnRyb2w+QnJvd3NlPC91aWNvbnRyb2w+IDxpbWFnZSBocmVmPSIuLi9pbWFnZXMvQnJvd3NlLmdpZiI+PGFsdD5UaGlzDQotZ3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbjwvYWx0PjwvaW1hZ2U+IG5leHQgdG8gdGhlIDx1aWNvbnRyb2w+SXRlbSB0eXBlPC91aWNvbnRyb2w+IGZpZWxkDQotdG8gc3BlY2lmeSBhIGl0ZW0gdHlwZSBmb3IgdGhlIHNpbXBsZSB0eXBlLjwvY21kPjxpbmZvPlRoZSBTZXQgVHlwZSBkaWFsb2cNCi1ib3ggbGlzdHMgYWxsIGJ1aWx0LWluIGFuZCB1c2VyLWRlZmluZWQgdHlwZXMgY3VycmVudGx5IGF2YWlsYWJsZS4gWW91IGNhbg0KLWNoYW5nZSB0aGUgPHVpY29udHJvbD5TY29wZTwvdWljb250cm9sPiBvZiB0aGUgbGlzdCBieSBzZWxlY3Rpbmcgb25lIG9mIHRoZQ0KLWZvbGxvd2luZyBvcHRpb25zOjx1bD4NCi08bGk+PHVpY29udHJvbD5Xb3Jrc3BhY2U8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlIGluDQoteW91ciB3b3Jrc3BhY2UuIDwvbGk+DQotPGxpPjx1aWNvbnRyb2w+RW5jbG9zaW5nIFByb2plY3Q8L3VpY29udHJvbD4uIExpc3RzIGFsbCBvZiB0aGUgdHlwZXMgYXZhaWxhYmxlDQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+DQotPGxpPihEZWZhdWx0KSA8dWljb250cm9sPkN1cnJlbnQgUmVzb3VyY2U8L3VpY29udHJvbD4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcw0KLWF2YWlsYWJsZSBpbiB5b3VyIGN1cnJlbnQgZmlsZS48L2xpPg0KLTxsaT48dWljb250cm9sPldvcmtpbmcgU2V0czwvdWljb250cm9sPi4gTGlzdCBhbGwgdGhlIHR5cGVzIGF2YWlsYWJsZSB3aXRoaW4NCi10aGUgc2VsZWN0ZWQgd29ya2luZyBzZXQuPC9saT4NCi08L3VsPjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JZiB5b3Ugc2VsZWN0ZWQgPHVpY29udHJvbD51bmlvbjwvdWljb250cm9sPiBmcm9tIHRoZSA8dWljb250cm9sPlZhcmlldHk8L3VpY29udHJvbD4gbGlzdCwNCi1jbGljayA8dWljb250cm9sPkJyb3dzZTwvdWljb250cm9sPiA8aW1hZ2UgaHJlZj0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiPjxhbHQ+VGhpcw0KLWdyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b248L2FsdD48L2ltYWdlPiBuZXh0IHRvIHRoZSA8dWljb250cm9sPk1lbWJlciB0eXBlczwvdWljb250cm9sPiBmaWVsZA0KLXRvIHNwZWNpZnkgdGhlIG1lbWJlciB0eXBlcyBmb3IgdGhlIHNpbXBsZSB0eXBlLjwvY21kPjxpbmZvPllvdSBjYW4gc2VsZWN0DQotdG8gYWRkIGJvdGggPHVpY29udHJvbD5CdWlsdC1pbiBzaW1wbGUgdHlwZXM8L3VpY29udHJvbD4gYW5kIDx1aWNvbnRyb2w+VXNlci1kZWZpbmVkDQotc2ltcGxlIHR5cGVzPC91aWNvbnRyb2w+IHRvIHRoZSBtZW1iZXIgdHlwZXMgdmFsdWUgbGlzdC4gPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkNvbnN0cmFpbnRzPC91aWNvbnRyb2w+IHRhYi48L2NtZD48aW5mbz5Gcm9tDQotaGVyZSB5b3Ugd2lsbCBiZSBhYmxlIHRvIHNldCBzcGVjaWZpYyBjb25zdHJhaW50IHZhbHVlcyBpbmNsdWRpbmcgbGVuZ3RoIGNvbnN0cmFpbnRzLA0KLWVudW1lcmF0aW9ucywgYW5kIHBhdHRlcm5zLiA8L2luZm8+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+RW51bWVyYXRpb25zIGhlbHAgeW91IHRvIGRlZmluZSBhIHNldCBvZiB2YWxpZCB2YWx1ZXMgZm9yIHNpbXBsZQ0KLXR5cGVzLiBUaGV5IGFyZSB0aGUgYWN0dWFsIHZhbHVlcyB0aGUgc2ltcGxlIHR5cGUgY2FuIHRha2UgYXMgdmFsaWQgdmFsdWVzDQotaW4gdGhlIGluc3RhbmNlIGRvY3VtZW50LiBZb3UgY2FuIGVpdGhlciBhZGQgb25lIGVudW1lcmF0aW9uIG9yIHNldmVyYWwgZW51bWVyYXRpb25zDQotYXQgYSB0aW1lOjwvY21kPjxpbmZvPjx1bD4NCi08bGk+VG8gYWRkIG9uZSBlbnVtZXJhdGlvbiBhdCBhIHRpbWUsIHVuZGVyIDx1aWNvbnRyb2w+U3BlY2lmaWMgY29uc3RyYWludA0KLXZhbHVlczwvdWljb250cm9sPiwgc2VsZWN0IDx1aWNvbnRyb2w+RW51bWVyYXRpb25zPC91aWNvbnRyb2w+IGFuZCBjbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPiBhbmQNCi1zcGVjaWZ5IGEgdmFsdWUgZm9yIHRoZSBlbnVtZXJhdGlvbi48L2xpPg0KLTxsaT5UbyBhZGQgc2V2ZXJhbCBlbnVtZXJhdGlvbnMgYXQgb25lIHRpbWUsIGZvbGxvdyB0aGVzZSBzdGVwczo8b2w+DQotPGxpPlNlbGVjdCA8dWljb250cm9sPkVudW1lcmF0aW9uczwvdWljb250cm9sPi48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPkFkZDwvdWljb250cm9sPi48L2xpPg0KLTxsaT5FbnRlciB0aGUgdmFsdWUgb2YgZWFjaCBlbnVtZXJhdGlvbi4gRWFjaCB2YWx1ZSBtdXN0IGJlIHNlcGFyYXRlZCBieSB0aGUgPHVpY29udHJvbD5EZWxpbWl0ZXINCi1jaGFyYWN0ZXI8L3VpY29udHJvbD4uIEZvciBleGFtcGxlOiA8Y29kZXBoPkZpcnN0LCBTZWNvbmQ8L2NvZGVwaD4gd2lsbCBjcmVhdGUNCi10d28gZW51bWVyYXRpb25zLCBvbmUgd2l0aCB0aGUgdmFsdWUgIkZpcnN0IiBhbmQgb25lIHdpdGggdGhlIHZhbHVlICJTZWNvbmQiLjwvbGk+DQotPGxpPlNlbGVjdCB0aGUgPHVpY29udHJvbD5QcmVzZXJ2ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlPC91aWNvbnRyb2w+IGNoZWNrDQotYm94IGlmIHlvdSB3YW50IGFueSB3aGl0ZSBzcGFjZSBhcm91bmQgeW91ciBlbnVtZXJhdGlvbiB2YWx1ZXMgdG8gYmUgcHJlc2VydmVkLg0KLUlmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIHRoZSB2YWx1ZXMgb2YgPGNvZGVwaD5GaXJzdCwgU2Vjb25kPC9jb2RlcGg+IHdpbGwNCi1zaG93IHVwIGFzICJGaXJzdCIgYW5kICIgU2Vjb25kIiAodGhlcmUgaXMgYSBzcGFjZSBiZWZvcmUgU2Vjb25kKSBiZWNhdXNlDQoteW91IHB1dCBhIHNwYWNlIGJlZm9yZSAiU2Vjb25kIiB3aGVuIGVudGVyaW5nIHRoZSB2YWx1ZS48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPk9LPC91aWNvbnRyb2w+LiBZb3VyIGVudW1lcmF0aW9ucyB3aWxsIGJlIGNyZWF0ZWQgYW5kDQotYXBwZWFyIGluIHRoZSBQcm9wZXJ0aWVzIHZpZXcuPC9saT4NCi08L29sPjwvbGk+DQotPC91bD48L2luZm8+PC9zdWJzdGVwPg0KLTxzdWJzdGVwPjxjbWQ+UGF0dGVybnMgaGVscCB5b3UgdG8gcGxhY2UgY2VydGFpbiBjb25zdHJhaW50cyByZWdhcmRpbmcgYWxsb3dhYmxlDQotdmFsdWVzLjwvY21kPjxpbmZvPkZvciBleGFtcGxlLCB5b3UgY291bGQgcmVzdHJpY3QgdGhlIGZpZWxkIHRvIG9ubHkgYWNjZXB0DQotaW5wdXQgd2hpY2ggZm9sbG93cyB0aGUgcGF0dGVybiAiZml2ZSBkaWdpdHMgZm9sbG93ZWQgYnkgdHdvIHVwcGVyLWNhc2UgQVNDSUkNCi1sZXR0ZXJzIi4gVG8gc2V0IGEgcGF0dGVybiBjb25zdHJhaW50OjxvbD4NCi08bGk+U2VsZWN0IDx1aWNvbnRyb2w+UGF0dGVybnM8L3VpY29udHJvbD4uPC9saT4NCi08bGk+Q2xpY2sgPHVpY29udHJvbD5BZGQ8L3VpY29udHJvbD4uPC9saT4NCi08bGk+Q3JlYXRlIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybiB5b3Ugd2lzaCB0byB1c2UgYXMgeW91ciBjb25zdHJhaW50DQotdXNpbmcgdGhlIDx1aWNvbnRyb2w+UmVndWxhciBFeHByZXNzaW9uPC91aWNvbnRyb2w+IHdpemFyZC48L2xpPg0KLTxsaT5DbGljayA8dWljb250cm9sPkZpbmlzaDwvdWljb250cm9sPi48L2xpPg0KLTwvb2w+PC9pbmZvPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIHRoZSA8dWljb250cm9sPkRvY3VtZW50YXRpb248L3VpY29udHJvbD4gdGFiIGlmIHlvdSB3YW50DQotdG8gcHJvdmlkZSBhbnkgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzaW1wbGUgdHlwZS48L2NtZD48aW5mbz5UaGUgPHVpY29udHJvbD5Eb2N1bWVudGF0aW9uPC91aWNvbnRyb2w+IHBhZ2UNCi1pcyB1c2VkIGZvciBodW1hbiByZWFkYWJsZSBtYXRlcmlhbCwgc3VjaCBhcyBhIGRlc2NyaXB0aW9uLjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayB0aGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHRhYiBpZiB5b3Ugd2FudCB0bw0KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvY21kPg0KLTxpbmZvPlRoZSA8dWljb250cm9sPkV4dGVuc2lvbnM8L3VpY29udHJvbD4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlDQotc2NoZW1hIGFuZCBhZGQgWE1MIGNvbnRlbnQgdG8geW91ciBhbm5vdGF0aW9ucy48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDc4Mjk/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGFkZHNtcHQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY5OTE2Ny4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RhZGRzbXB0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iQWRkaW5nIHNpbXBsZSB0eXBlcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJTaW1wbGUgdHlwZXMgYXJlIHVzZWQgdG8gY3JlYXRlIGRlcml2ZWQgZGF0YXR5cGVzLiBUaGV5IHByb3ZpZGUgYSBzZXQgb2YgY29uc3RyYWludHMgb24gdGhlIHZhbHVlIHNwYWNlIChhIHNldCBvZiB2YWx1ZXMpIGFuZCB0aGUgbGV4aWNhbCBzcGFjZSAoYSBzZXQgb2YgdmFsaWQgbGl0ZXJhbHMpIG9mIGEgZGF0YXR5cGUuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlNpbXBsZSB0eXBlcyBhcmUgdXNlZCB0byBjcmVhdGUgZGVyaXZlZCBkYXRhdHlwZXMuIFRoZXkgcHJvdmlkZSBhIHNldCBvZiBjb25zdHJhaW50cyBvbiB0aGUgdmFsdWUgc3BhY2UgKGEgc2V0IG9mIHZhbHVlcykgYW5kIHRoZSBsZXhpY2FsIHNwYWNlIChhIHNldCBvZiB2YWxpZCBsaXRlcmFscykgb2YgYSBkYXRhdHlwZS4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBzaW1wbGUgdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgYWRkaW5nLCBzaW1wbGUgdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMiIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGFkZHJlZy5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRhZGRzbXB0IiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+QWRkaW5nIHNpbXBsZSB0eXBlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGFkZHNtcHQiPjxhIG5hbWU9InRhZGRzbXB0Ij48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5BZGRpbmcgc2ltcGxlIHR5cGVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5TaW1wbGUgdHlwZXMgYXJlIHVzZWQgdG8gY3JlYXRlIGRlcml2ZWQgZGF0YXR5cGVzLgotVGhleSBwcm92aWRlIGEgc2V0IG9mIGNvbnN0cmFpbnRzIG9uIHRoZSB2YWx1ZSBzcGFjZSAoYSBzZXQgb2YgdmFsdWVzKSBhbmQKLXRoZSBsZXhpY2FsIHNwYWNlIChhIHNldCBvZiB2YWxpZCBsaXRlcmFscykgb2YgYSBkYXRhdHlwZS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPkEgc2ltcGxlIHR5cGUgY2Fubm90IGhhdmUgZWxlbWVudCBjb250ZW50IGFuZCBjYW5ub3QgY2FycnkgYXR0cmlidXRlcy4KLUVsZW1lbnRzIHRoYXQgY29udGFpbiBudW1iZXJzIChhbmQgc3RyaW5ncywgYW5kIGRhdGVzLCBhbmQgc28gb24pIGJ1dCBkbyBub3QKLWNvbnRhaW4gYW55IHN1Yi1lbGVtZW50cyBoYXZlIGEgc2ltcGxlIHR5cGUuPC9wPgotPHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMKLXdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLCBidXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55Ci1vdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gYWRkIGEgc2ltcGxlIHR5cGU6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBPdXRsaW5lIHZpZXcsIHJpZ2h0LWNsaWNrIDxzdHJvbmc+VHlwZXM8L3N0cm9uZz4sIGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQKLVNpbXBsZSBUeXBlPC9zcGFuPi48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBzZWxlY3QgdGhlIG5ldyBzaW1wbGUgdHlwZS48L3NwYW4+PC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+R2VuZXJhbDwvc3Bhbj4gdGFiLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+VHlwZSBhIG5ldyBuYW1lIGZvciB0aGUgc2ltcGxlIHR5cGUgaW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5hbWU8L3NwYW4+IGZpZWxkLjwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBzZWxlY3QgdGhlIGZvbGxvd2luZyBvcHRpb25zIGZyb20gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlZhcmlldHk8L3NwYW4+IGxpc3Q6PC9zcGFuPgotPHVsPgotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmF0b21pYzwvc3Bhbj4uIEF0b21pYyB0eXBlcyBhcmUgYWxsIHRoZSBzaW1wbGUgdHlwZXMKLWJ1aWx0IGludG8gdGhlIFhNTCBzY2hlbWEgbGFuZ3VhZ2UuPC9saT4KLQotPGxpPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPmxpc3Q8L3NwYW4+LiBMaXN0IHR5cGVzIGFyZSBjb21wcmlzZWQgb2Ygc2VxdWVuY2VzCi1vZiBhdG9taWMgdHlwZXMuIFRoZXkgaGF2ZSB2YWx1ZXMgdGhhdCBhcmUgY29tcHJpc2VkIG9mIGZpbml0ZS1sZW5ndGggc2VxdWVuY2VzCi1vZiBhdG9taWMgdmFsdWVzLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+dW5pb248L3NwYW4+LiBBIHVuaW9uIHR5cGUgZW5hYmxlcyBhbiBlbGVtZW50IG9yIGF0dHJpYnV0ZQotdmFsdWUgdG8gYmUgb25lIG9yIG1vcmUgaW5zdGFuY2VzIG9mIG9uZSB0eXBlIGRyYXduIGZyb20gdGhlIHVuaW9uIG9mIG11bHRpcGxlCi1hdG9taWMgYW5kIGxpc3QgdHlwZXMuPC9saT4KLQotPC91bD4KLQotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JZiB5b3Ugc2VsZWN0ZWQgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+YXRvbWljPC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpZXR5PC9zcGFuPiBsaXN0LAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iVGhpcyYjMTA7Z3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gbmV4dCB0byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QmFzZSB0eXBlPC9zcGFuPiBmaWVsZAotdG8gc3BlY2lmeSBhIGJhc2UgdHlwZSBmb3IgdGhlIHNpbXBsZSB0eXBlLjwvc3Bhbj4gVGhlIFNldCBUeXBlIGRpYWxvZwotYm94IGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4KLWNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mIHRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlCi1mb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4KLXlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JraW5nIFNldHM8L3NwYW4+LiBMaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbgotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5saXN0PC9zcGFuPiBmcm9tIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5WYXJpZXR5PC9zcGFuPiBsaXN0LAotY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QnJvd3NlPC9zcGFuPiA8aW1nIHNyYz0iLi4vaW1hZ2VzL0Jyb3dzZS5naWYiIGFsdD0iVGhpcyYjMTA7Z3JhcGhpYyBpcyB0aGUgQnJvd3NlIGJ1dHRvbiIgLz4gbmV4dCB0byB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+SXRlbSB0eXBlPC9zcGFuPiBmaWVsZAotdG8gc3BlY2lmeSBhIGl0ZW0gdHlwZSBmb3IgdGhlIHNpbXBsZSB0eXBlLjwvc3Bhbj4gVGhlIFNldCBUeXBlIGRpYWxvZwotYm94IGxpc3RzIGFsbCBidWlsdC1pbiBhbmQgdXNlci1kZWZpbmVkIHR5cGVzIGN1cnJlbnRseSBhdmFpbGFibGUuIFlvdSBjYW4KLWNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U2NvcGU8L3NwYW4+IG9mIHRoZSBsaXN0IGJ5IHNlbGVjdGluZyBvbmUgb2YgdGhlCi1mb2xsb3dpbmcgb3B0aW9uczo8dWw+Ci08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+V29ya3NwYWNlPC9zcGFuPi4gTGlzdHMgYWxsIG9mIHRoZSB0eXBlcyBhdmFpbGFibGUgaW4KLXlvdXIgd29ya3NwYWNlLiA8L2xpPgotCi08bGk+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RW5jbG9zaW5nIFByb2plY3Q8L3NwYW4+LiBMaXN0cyBhbGwgb2YgdGhlIHR5cGVzIGF2YWlsYWJsZQotaW4gdGhlIHByb2plY3QgdGhhdCBjb250YWlucyB5b3VyIGZpbGUuIDwvbGk+Ci0KLTxsaT4oRGVmYXVsdCkgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+Q3VycmVudCBSZXNvdXJjZTwvc3Bhbj4uIExpc3QgYWxsIG9mIHRoZSB0eXBlcwotYXZhaWxhYmxlIGluIHlvdXIgY3VycmVudCBmaWxlLjwvbGk+Ci0KLTxsaT48c3BhbiBjbGFzcz0idWljb250cm9sIj5Xb3JraW5nIFNldHM8L3NwYW4+LiBMaXN0IGFsbCB0aGUgdHlwZXMgYXZhaWxhYmxlIHdpdGhpbgotdGhlIHNlbGVjdGVkIHdvcmtpbmcgc2V0LjwvbGk+Ci0KLTwvdWw+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPklmIHlvdSBzZWxlY3RlZCA8c3BhbiBjbGFzcz0idWljb250cm9sIj51bmlvbjwvc3Bhbj4gZnJvbSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFyaWV0eTwvc3Bhbj4gbGlzdCwKLWNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJyb3dzZTwvc3Bhbj4gPGltZyBzcmM9Ii4uL2ltYWdlcy9Ccm93c2UuZ2lmIiBhbHQ9IlRoaXMmIzEwO2dyYXBoaWMgaXMgdGhlIEJyb3dzZSBidXR0b24iIC8+IG5leHQgdG8gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk1lbWJlciB0eXBlczwvc3Bhbj4gZmllbGQKLXRvIHNwZWNpZnkgdGhlIG1lbWJlciB0eXBlcyBmb3IgdGhlIHNpbXBsZSB0eXBlLjwvc3Bhbj4gWW91IGNhbiBzZWxlY3QKLXRvIGFkZCBib3RoIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkJ1aWx0LWluIHNpbXBsZSB0eXBlczwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlVzZXItZGVmaW5lZAotc2ltcGxlIHR5cGVzPC9zcGFuPiB0byB0aGUgbWVtYmVyIHR5cGVzIHZhbHVlIGxpc3QuIDwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q2xpY2sgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkNvbnN0cmFpbnRzPC9zcGFuPiB0YWIuPC9zcGFuPiBGcm9tCi1oZXJlIHlvdSB3aWxsIGJlIGFibGUgdG8gc2V0IHNwZWNpZmljIGNvbnN0cmFpbnQgdmFsdWVzIGluY2x1ZGluZyBsZW5ndGggY29uc3RyYWludHMsCi1lbnVtZXJhdGlvbnMsIGFuZCBwYXR0ZXJucy4gCi08b2wgdHlwZT0iYSI+Ci08bGkgY2xhc3M9InN1YnN0ZXBleHBhbmQiPjxzcGFuPkVudW1lcmF0aW9ucyBoZWxwIHlvdSB0byBkZWZpbmUgYSBzZXQgb2YgdmFsaWQgdmFsdWVzIGZvciBzaW1wbGUKLXR5cGVzLiBUaGV5IGFyZSB0aGUgYWN0dWFsIHZhbHVlcyB0aGUgc2ltcGxlIHR5cGUgY2FuIHRha2UgYXMgdmFsaWQgdmFsdWVzCi1pbiB0aGUgaW5zdGFuY2UgZG9jdW1lbnQuIFlvdSBjYW4gZWl0aGVyIGFkZCBvbmUgZW51bWVyYXRpb24gb3Igc2V2ZXJhbCBlbnVtZXJhdGlvbnMKLWF0IGEgdGltZTo8L3NwYW4+IDx1bD4KLTxsaT5UbyBhZGQgb25lIGVudW1lcmF0aW9uIGF0IGEgdGltZSwgdW5kZXIgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+U3BlY2lmaWMgY29uc3RyYWludAotdmFsdWVzPC9zcGFuPiwgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkVudW1lcmF0aW9uczwvc3Bhbj4gYW5kIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4gYW5kCi1zcGVjaWZ5IGEgdmFsdWUgZm9yIHRoZSBlbnVtZXJhdGlvbi48L2xpPgotCi08bGk+VG8gYWRkIHNldmVyYWwgZW51bWVyYXRpb25zIGF0IG9uZSB0aW1lLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PG9sIHR5cGU9ImkiPgotPGxpPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FbnVtZXJhdGlvbnM8L3NwYW4+LjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5BZGQ8L3NwYW4+LjwvbGk+Ci0KLTxsaT5FbnRlciB0aGUgdmFsdWUgb2YgZWFjaCBlbnVtZXJhdGlvbi4gRWFjaCB2YWx1ZSBtdXN0IGJlIHNlcGFyYXRlZCBieSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RGVsaW1pdGVyCi1jaGFyYWN0ZXI8L3NwYW4+LiBGb3IgZXhhbXBsZTogPHNhbXAgY2xhc3M9ImNvZGVwaCI+Rmlyc3QsIFNlY29uZDwvc2FtcD4gd2lsbCBjcmVhdGUKLXR3byBlbnVtZXJhdGlvbnMsIG9uZSB3aXRoIHRoZSB2YWx1ZSAiRmlyc3QiIGFuZCBvbmUgd2l0aCB0aGUgdmFsdWUgIlNlY29uZCIuPC9saT4KLQotPGxpPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlc2VydmUgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZTwvc3Bhbj4gY2hlY2sKLWJveCBpZiB5b3Ugd2FudCBhbnkgd2hpdGUgc3BhY2UgYXJvdW5kIHlvdXIgZW51bWVyYXRpb24gdmFsdWVzIHRvIGJlIHByZXNlcnZlZC4KLUlmIHlvdSBzZWxlY3QgdGhpcyBjaGVjayBib3gsIHRoZSB2YWx1ZXMgb2YgPHNhbXAgY2xhc3M9ImNvZGVwaCI+Rmlyc3QsIFNlY29uZDwvc2FtcD4gd2lsbAotc2hvdyB1cCBhcyAiRmlyc3QiIGFuZCAiIFNlY29uZCIgKHRoZXJlIGlzIGEgc3BhY2UgYmVmb3JlIFNlY29uZCkgYmVjYXVzZQoteW91IHB1dCBhIHNwYWNlIGJlZm9yZSAiU2Vjb25kIiB3aGVuIGVudGVyaW5nIHRoZSB2YWx1ZS48L2xpPgotCi08bGk+Q2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+T0s8L3NwYW4+LiBZb3VyIGVudW1lcmF0aW9ucyB3aWxsIGJlIGNyZWF0ZWQgYW5kCi1hcHBlYXIgaW4gdGhlIFByb3BlcnRpZXMgdmlldy48L2xpPgotCi08L29sPgotPC9saT4KLQotPC91bD4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+UGF0dGVybnMgaGVscCB5b3UgdG8gcGxhY2UgY2VydGFpbiBjb25zdHJhaW50cyByZWdhcmRpbmcgYWxsb3dhYmxlCi12YWx1ZXMuPC9zcGFuPiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHJlc3RyaWN0IHRoZSBmaWVsZCB0byBvbmx5IGFjY2VwdAotaW5wdXQgd2hpY2ggZm9sbG93cyB0aGUgcGF0dGVybiAiZml2ZSBkaWdpdHMgZm9sbG93ZWQgYnkgdHdvIHVwcGVyLWNhc2UgQVNDSUkKLWxldHRlcnMiLiBUbyBzZXQgYSBwYXR0ZXJuIGNvbnN0cmFpbnQ6PG9sIHR5cGU9ImkiPgotPGxpPlNlbGVjdCA8c3BhbiBjbGFzcz0idWljb250cm9sIj5QYXR0ZXJuczwvc3Bhbj4uPC9saT4KLQotPGxpPkNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkFkZDwvc3Bhbj4uPC9saT4KLQotPGxpPkNyZWF0ZSB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4geW91IHdpc2ggdG8gdXNlIGFzIHlvdXIgY29uc3RyYWludAotdXNpbmcgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlJlZ3VsYXIgRXhwcmVzc2lvbjwvc3Bhbj4gd2l6YXJkLjwvbGk+Ci0KLTxsaT5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+LjwvbGk+Ci0KLTwvb2w+Ci08L2xpPgotCi08L29sPgotCi08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5Eb2N1bWVudGF0aW9uPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQKLXRvIHByb3ZpZGUgYW55IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2ltcGxlIHR5cGUuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbHRhc2tzIj48c3Ryb25nPlJlbGF0ZWQgdGFza3M8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRyZWcuaHRtbCIgdGl0bGU9IkEgcGF0dGVybiBmYWNldCBjYW4gYmUgdXNlZCB0byBjb25zdHJhaW4gdGhlIHZhbHVlIG9mIGEgdHlwZSdzIGxleGljYWwgc3BhY2UgKHRoZSBzZXQgb2Ygc3RyaW5nIGxpdGVyYWxzIHRoYXQgcmVwcmVzZW50IHRoZSB2YWx1ZXMgb2YgYSB0eXBlKSwgd2hpY2ggaW5kaXJlY3RseSBjb25zdHJhaW5zIHRoZSB2YWx1ZSBzcGFjZS4iPkFkZGluZyBwYXR0ZXJuIGZhY2V0cyB0byBzaW1wbGUgdHlwZXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90Y3htbHNjaC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU0NWQxLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGN4bWxzY2giIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5DcmVhdGluZyBYTUwgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5Zb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWENCi1lZGl0b3IuIFVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvciwgeW91IGNhbiBzcGVjaWZ5IGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMNCi13aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5jcmVhdGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+VG8gY3JlYXRlIGFuIFhNTCBzY2hlbWEsIGZvbGxvdyB0aGVzZSBzdGVwczo8L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+Q3JlYXRlIGEgcHJvamVjdCB0byBjb250YWluIHRoZSBYTUwgc2NoZW1hLjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPkluIHRoZSB3b3JrYmVuY2gsIHNlbGVjdCAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+RmlsZSA+IE5ldyA+DQotT3RoZXIgPiBYTUwgPiBYTUwgU2NoZW1hPC91aWNvbnRyb2w+PC9tZW51Y2FzY2FkZT4gYW5kIGNsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIHByb2plY3Qgb3IgZm9sZGVyIHRoYXQgd2lsbCBjb250YWluIHRoZSBYTUwgc2NoZW1hLg0KLUluIHRoZSA8L2NtZD48aW5mbz48dWljb250cm9sPkZpbGUgbmFtZTwvdWljb250cm9sPiBmaWVsZCwgdHlwZSB0aGUgbmFtZSBvZg0KLXRoZSBYTUwgc2NoZW1hLCBmb3IgZXhhbXBsZSA8dXNlcmlucHV0Pk15WE1MU2NoZW1hLnhzZDwvdXNlcmlucHV0Pi4gVGhlIG5hbWUNCi1vZiB5b3VyIFhNTCBzY2hlbWEgbXVzdCBlbmQgaW4gPHN5c3RlbW91dHB1dD4ueHNkPC9zeXN0ZW1vdXRwdXQ+LjwvaW5mbz48L3N0ZXA+DQotPHN0ZXA+PGNtZD5DbGljayAgPHVpY29udHJvbD5GaW5pc2g8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD5UaGUgWE1MIHNjaGVtYSBvcGVucyBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIDwvcmVzdWx0Pg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGN4bWxzY2guaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFlYzkzMi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RjeG1sc2NoLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJDcmVhdGluZyBYTUwgc2NoZW1hcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJZb3UgY2FuIGNyZWF0ZSBhbiBYTUwgc2NoZW1hIGFuZCB0aGVuIGVkaXQgaXQgdXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzIHdoaWNoIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGluIGFuIFhNTCBmaWxlLCBhbmQgaW4gd2hpY2ggY29tYmluYXRpb25zLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIGNyZWF0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgY3JlYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRjeG1sc2NoIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRjeG1sc2NoIj48YSBuYW1lPSJ0Y3htbHNjaCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+Q3JlYXRpbmcgWE1MIHNjaGVtYXM8L2gxPgotCi0KLQotCi08ZGl2PjxwPllvdSBjYW4gY3JlYXRlIGFuIFhNTCBzY2hlbWEgYW5kIHRoZW4gZWRpdCBpdCB1c2luZyB0aGUgWE1MIHNjaGVtYQotZWRpdG9yLiBVc2luZyB0aGUgWE1MIHNjaGVtYSBlZGl0b3IsIHlvdSBjYW4gc3BlY2lmeSBlbGVtZW50IG5hbWVzIHRoYXQgaW5kaWNhdGVzCi13aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRvIGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+Q3JlYXRlIGEgcHJvamVjdCB0byBjb250YWluIHRoZSBYTUwgc2NoZW1hLjwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSB3b3JrYmVuY2gsIHNlbGVjdCAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlICZndDsgTmV3ICZndDsKLU90aGVyICZndDsgWE1MICZndDsgWE1MIFNjaGVtYTwvc3Bhbj48L3NwYW4+IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5OZXh0PC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgcHJvamVjdCBvciBmb2xkZXIgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIFhNTCBzY2hlbWEuCi1JbiB0aGUgPC9zcGFuPiA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaWxlIG5hbWU8L3NwYW4+IGZpZWxkLCB0eXBlIHRoZSBuYW1lIG9mCi10aGUgWE1MIHNjaGVtYSwgZm9yIGV4YW1wbGUgPGtiZCBjbGFzcz0idXNlcmlucHV0Ij5NeVhNTFNjaGVtYS54c2Q8L2tiZD4uIFRoZSBuYW1lCi1vZiB5b3VyIFhNTCBzY2hlbWEgbXVzdCBlbmQgaW4gPHR0IGNsYXNzPSJzeXNvdXQiPi54c2Q8L3R0Pi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrICA8c3BhbiBjbGFzcz0idWljb250cm9sIj5GaW5pc2g8L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj5UaGUgWE1MIHNjaGVtYSBvcGVucyBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuIDwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWxjb25jZXB0cyI+PHN0cm9uZz5SZWxhdGVkIGNvbmNlcHRzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiB0aXRsZT0iVGhpcyBwcm9kdWN0IHByb3ZpZGVzIGFuIFhNTCBzY2hlbWEgZWRpdG9yIGZvciBjcmVhdGluZywgdmlld2luZywgYW5kIHZhbGlkYXRpbmcgWE1MIHNjaGVtYXMuIFhNTCBzY2hlbWFzIGFyZSBhIGZvcm1hbCBzcGVjaWZpY2F0aW9uIG9mIGVsZW1lbnQgbmFtZXMgdGhhdCBpbmRpY2F0ZXMgd2hpY2ggZWxlbWVudHMgYXJlIGFsbG93ZWQgaW4gYW4gWE1MIGZpbGUsIGFuZCBpbiB3aGljaCBjb21iaW5hdGlvbnMuIj5YTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPGRpdiBjbGFzcz0icmVsdGFza3MiPjxzdHJvbmc+UmVsYXRlZCB0YXNrczwvc3Ryb25nPjxiciAvPgotPGRpdj48YSBocmVmPSIuLi90b3BpY3MvdGVkdHNjaG0uaHRtbCIgdGl0bGU9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiI+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90dmR0c2NobS5odG1sIiB0aXRsZT0iVmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgWE1MIHNjaGVtYSBmaWxlIGlzIHNlbWFudGljYWxseSB2YWxpZC4gQW55IGVycm9ycyB3aWxsIGJlIGRpc3BsYXllZCBpbiB0aGUgUHJvYmxlbXMgdmlldy4iPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5kaXRhIGIvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5kaXRhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWQzZDFiLi4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGRlbHNjbXAuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idGRlbHNjbXAiIHhtbDpsYW5nPSJlbi11cyI+DQotPHRpdGxlPkRlbGV0aW5nIFhNTCBzY2hlbWEgY29tcG9uZW50czwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsDQoteW91IGNhbiBkZWxldGUgdGhlbS48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+ZGVsZXRpbmc8aW5kZXh0ZXJtPmNvbXBvbmVudHM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmRlbGV0aW5nPGluZGV4dGVybT5jb21wb25lbnRzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gZGVsZXRlIGFuIFhNTA0KLXNjaGVtYSBjb21wb25lbnQsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPk9wZW4geW91ciBYTUwgc2NoZW1hIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2NtZD48L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgT3V0bGluZSB2aWV3LCBjbGljayB0aGUgaXRlbSB0byBkZWxldGUuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+UmlnaHQtY2xpY2sgdGhlIGl0ZW0sIGFuZCwgZnJvbSBpdHMgcG9wLXVwIG1lbnUsIGNsaWNrIDx1aWNvbnRyb2w+RGVsZXRlPC91aWNvbnRyb2w+LjwvY21kPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+PHA+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwNCi1pbnRlZ3JpdHkgaXNzdWVzLiBXaGVuIHlvdSBkZWxldGUgY2VydGFpbiBjb21wb25lbnRzLCBjbGVhbnVwIHdpbGwgYXV0b21hdGljYWxseQ0KLW9jY3VyLjwvcD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RkZWxzY21wLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0Y2MyMDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZGVsc2NtcC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsIHlvdSBjYW4gZGVsZXRlIHRoZW0uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IklmIHlvdSBoYXZlIGNyZWF0ZWQgYW55IFhNTCBzY2hlbWEgY29tcG9uZW50cyB5b3Ugbm8gbG9uZ2VyIG5lZWQsIHlvdSBjYW4gZGVsZXRlIHRoZW0uIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGRlbGV0aW5nLCBjb21wb25lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBlZGl0b3IsIGRlbGV0aW5nLCBjb21wb25lbnRzLCBYTUwgc2NoZW1hIGZpbGVzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3JyZWZpbnRnLmh0bWwiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGRlbHNjbXAiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5EZWxldGluZyBYTUwgc2NoZW1hIGNvbXBvbmVudHM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InRkZWxzY21wIj48YSBuYW1lPSJ0ZGVsc2NtcCI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+RGVsZXRpbmcgWE1MIHNjaGVtYSBjb21wb25lbnRzPC9oMT4KLQotCi0KLQotPGRpdj48cD5JZiB5b3UgaGF2ZSBjcmVhdGVkIGFueSBYTUwgc2NoZW1hIGNvbXBvbmVudHMgeW91IG5vIGxvbmdlciBuZWVkLAoteW91IGNhbiBkZWxldGUgdGhlbS48L3A+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPjxwPlRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdlcmUgd3JpdHRlbiBmb3IgdGhlIFJlc291cmNlIHBlcnNwZWN0aXZlLAotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPgotPHA+VG8gZGVsZXRlIGFuIFhNTAotc2NoZW1hIGNvbXBvbmVudCwgZm9sbG93IHRoZXNlIHN0ZXBzOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGk+PHNwYW4+T3BlbiB5b3VyIFhNTCBzY2hlbWEgaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgdGhlIGl0ZW0gdG8gZGVsZXRlLjwvc3Bhbj48L2xpPgotCi08bGk+PHNwYW4+UmlnaHQtY2xpY2sgdGhlIGl0ZW0sIGFuZCwgZnJvbSBpdHMgcG9wLXVwIG1lbnUsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkRlbGV0ZTwvc3Bhbj4uPC9zcGFuPgotPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwKLWludGVncml0eSBpc3N1ZXMuIFdoZW4geW91IGRlbGV0ZSBjZXJ0YWluIGNvbXBvbmVudHMsIGNsZWFudXAgd2lsbCBhdXRvbWF0aWNhbGx5Ci1vY2N1ci48L3A+Ci08L2Rpdj4KLQotPC9kaXY+Ci0KLTxkaXY+PGRpdiBjbGFzcz0icmVscmVmIj48c3Ryb25nPlJlbGF0ZWQgcmVmZXJlbmNlPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy9ycmVmaW50Zy5odG1sIiB0aXRsZT0iVGhlIFhNTCBzY2hlbWEgZWRpdG9yIGhhcyBhIGJ1aWx0LWluIG1lY2hhbmlzbSB0byBoYW5kbGUgcmVmZXJlbnRpYWwgaW50ZWdyaXR5IGlzc3Vlcy4gV2hlbiB5b3UgZGVsZXRlIGNlcnRhaW4gbm9kZXMsIGNsZWFuIHVwIGZvciBhbnkgbm9kZXMgYWZmZWN0ZWQgd2lsbCBhdXRvbWF0aWNhbGx5IG9jY3VyLiI+UmVmZXJlbnRpYWwgaW50ZWdyaXR5IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvcjwvYT48L2Rpdj4KLTwvZGl2PgotPC9kaXY+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NjA3MmEuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIiAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0ZWR0cHJlZiIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXM8L3RpdGxlPg0KLTx0aXRsZWFsdHM+DQotPHNlYXJjaHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPllvdSBjYW4gc2V0IHZhcmlvdXMgcHJlZmVyZW5jZXMgZm9yIFhNTCBzY2hlbWEgZmlsZXMgc3VjaCBhcyB0aGUNCi1kZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5kZWZpbmluZzxpbmRleHRlcm0+ZGVmYXVsdA0KLXRhcmdldCBuYW1lc3BhY2U8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWENCi1maWxlczxpbmRleHRlcm0+ZGVmaW5pbmc8aW5kZXh0ZXJtPnNjaGVtYSBwcmVmaXg8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT4NCi08L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxjb250ZXh0PjxwPlRvIGRlZmluZSBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMsIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPlNlbGVjdCAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+V2luZG93ID4gUHJlZmVyZW5jZXMgPiBXZWIgYW5kDQotWE1MID4gWE1MIFNjaGVtYSBGaWxlczwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPlNlbGVjdCB0aGUgPHVpY29udHJvbD5RdWFsaWZ5IFhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0czwvdWljb250cm9sPiBjaGVjaw0KLWJveCBpZiB5b3Ugd2FudCBhIHByZWZpeCBhcHBsaWVkIHRvIGFsbCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgaW4NCi15b3VyIFhNTCBzY2hlbWEuPC9jbWQ+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIDx1aWNvbnRyb2w+WE1MIHNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIHByZWZpeDwvdWljb250cm9sPiBmaWVsZCwNCi10eXBlIHRoZSBwcmVmaXggeW91IHdhbnQgYXBwbGllZCB0byBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgaW4geW91cg0KLVhNTCBzY2hlbWEuPC9jbWQ+PGluZm8+IFRoZSBwcmVmaXggPHVpY29udHJvbD54c2Q8L3VpY29udHJvbD4gaXMgdXNlZCBieSBjb252ZW50aW9uDQotdG8gZGVub3RlIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSwgYnV0IGFueSBwcmVmaXggY2FuIGJlIHVzZWQuIFRoZSBwdXJwb3NlDQotb2YgdGhlIGFzc29jaWF0aW9uIGlzIHRvIGlkZW50aWZ5IHRoZSBlbGVtZW50cyBhbmQgc2ltcGxlIHR5cGVzIGFzIGJlbG9uZ2luZw0KLXRvIHRoZSB2b2NhYnVsYXJ5IG9mIHRoZSBYTUwgU2NoZW1hIGxhbmd1YWdlIHJhdGhlciB0aGFuIHRoZSB2b2NhYnVsYXJ5IG9mDQotdGhlIHNjaGVtYSBhdXRob3IuICA8bm90ZT5UaGlzIHByZWZpeCB3aWxsIG5vdCBhcHBlYXIgaW4gYW55IHNjaGVtYXMgdGhhdA0KLWN1cnJlbnRseSBleGlzdCAtIGl0IHdpbGwgb25seSBhcHBlYXIgaW4gbmV3IHNjaGVtYXMgeW91IGNyZWF0ZSBhZnRlciB5b3UNCi10eXBlIHRoZSBwcmVmaXggYW5kIGNsaWNrIDx1aWNvbnRyb2w+QXBwbHk8L3VpY29udHJvbD4uIEFueSBzY2hlbWFzIHRoYXQgYWxyZWFkeQ0KLWV4aXN0IHdpbGwgaGF2ZSB0aGUgcHJlZml4IHNwZWNpZmllZCBpbiB0aGUgc2NoZW1hIGFwcGxpZWQgdG8gdGhlIFhNTCBzY2hlbWENCi1sYW5ndWFnZSBjb25zdHJ1Y3RzLjwvbm90ZT48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBjaGFuZ2UgdGhlIDx1aWNvbnRyb2w+RGVmYXVsdCBUYXJnZXQgTmFtZXNwYWNlPC91aWNvbnRyb2w+IHZhbHVlLjwvY21kPg0KLTxpbmZvPlRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhpcyBmaWVsZCB3aWxsIGJlIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UNCi1mb3IgYW55IG5ldyBYTUwgc2NoZW1hIGZpbGVzIGNyZWF0ZWQuPC9pbmZvPjwvc3RlcD4NCi08c3RlcD48Y21kPkNsaWNrIDx1aWNvbnRyb2w+T0s8L3VpY29udHJvbD4uPC9jbWQ+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48L3Jlc3VsdD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRwcmVmLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlNzY0MzAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0cHJlZi5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBYTUwgc2NoZW1hIGZpbGUgcHJlZmVyZW5jZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC4iIC8+Ci08bWV0YSBuYW1lPSJkZXNjcmlwdGlvbiIgY29udGVudD0iWW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZSBkZWZhdWx0IHRhcmdldCBuYW1lc3BhY2UgYW5kIFhNTCBTY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXggdXNlZC4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBkZWZpbmluZywgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlLCBYTUwgc2NoZW1hIGZpbGVzLCBzY2hlbWEgcHJlZml4IiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgZGVmaW5pbmcsIGRlZmF1bHQgdGFyZ2V0IG5hbWVzcGFjZSwgWE1MIHNjaGVtYSBmaWxlcywgc2NoZW1hIHByZWZpeCIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBjb250ZW50PSJYSFRNTCIgbmFtZT0iREMuRm9ybWF0IiAvPgotPG1ldGEgY29udGVudD0idGVkdHByZWYiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keSBpZD0idGVkdHByZWYiPjxhIG5hbWU9InRlZHRwcmVmIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5FZGl0aW5nIFhNTCBzY2hlbWEgZmlsZSBwcmVmZXJlbmNlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+WW91IGNhbiBzZXQgdmFyaW91cyBwcmVmZXJlbmNlcyBmb3IgWE1MIHNjaGVtYSBmaWxlcyBzdWNoIGFzIHRoZQotZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlIGFuZCBYTUwgU2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHMgcHJlZml4IHVzZWQuPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UbyBkZWZpbmUgWE1MIHNjaGVtYSBmaWxlIHByZWZlcmVuY2VzLCBmb2xsb3cgdGhlc2Ugc3RlcHM6PC9wPgotPC9kaXY+Ci0KLTxvbD4KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0ICA8c3BhbiBjbGFzcz0ibWVudWNhc2NhZGUiPjxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPldpbmRvdyAmZ3Q7IFByZWZlcmVuY2VzICZndDsgV2ViIGFuZAotWE1MICZndDsgWE1MIFNjaGVtYSBGaWxlczwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPlNlbGVjdCB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UXVhbGlmeSBYTUwgc2NoZW1hIGxhbmd1YWdlIGNvbnN0cnVjdHM8L3NwYW4+IGNoZWNrCi1ib3ggaWYgeW91IHdhbnQgYSBwcmVmaXggYXBwbGllZCB0byBhbGwgWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluCi15b3VyIFhNTCBzY2hlbWEuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+SW4gdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlhNTCBzY2hlbWEgbGFuZ3VhZ2UgY29uc3RydWN0cyBwcmVmaXg8L3NwYW4+IGZpZWxkLAotdHlwZSB0aGUgcHJlZml4IHlvdSB3YW50IGFwcGxpZWQgdG8gWE1MIFNjaGVtYSBsYW5ndWFnZSBjb25zdHJ1Y3RzIGluIHlvdXIKLVhNTCBzY2hlbWEuPC9zcGFuPiAgVGhlIHByZWZpeCA8c3BhbiBjbGFzcz0idWljb250cm9sIj54c2Q8L3NwYW4+IGlzIHVzZWQgYnkgY29udmVudGlvbgotdG8gZGVub3RlIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSwgYnV0IGFueSBwcmVmaXggY2FuIGJlIHVzZWQuIFRoZSBwdXJwb3NlCi1vZiB0aGUgYXNzb2NpYXRpb24gaXMgdG8gaWRlbnRpZnkgdGhlIGVsZW1lbnRzIGFuZCBzaW1wbGUgdHlwZXMgYXMgYmVsb25naW5nCi10byB0aGUgdm9jYWJ1bGFyeSBvZiB0aGUgWE1MIFNjaGVtYSBsYW5ndWFnZSByYXRoZXIgdGhhbiB0aGUgdm9jYWJ1bGFyeSBvZgotdGhlIHNjaGVtYSBhdXRob3IuICA8ZGl2IGNsYXNzPSJub3RlIj48c3BhbiBjbGFzcz0ibm90ZXRpdGxlIj5Ob3RlOjwvc3Bhbj4gVGhpcyBwcmVmaXggd2lsbCBub3QgYXBwZWFyIGluIGFueSBzY2hlbWFzIHRoYXQKLWN1cnJlbnRseSBleGlzdCAtIGl0IHdpbGwgb25seSBhcHBlYXIgaW4gbmV3IHNjaGVtYXMgeW91IGNyZWF0ZSBhZnRlciB5b3UKLXR5cGUgdGhlIHByZWZpeCBhbmQgY2xpY2sgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+QXBwbHk8L3NwYW4+LiBBbnkgc2NoZW1hcyB0aGF0IGFscmVhZHkKLWV4aXN0IHdpbGwgaGF2ZSB0aGUgcHJlZml4IHNwZWNpZmllZCBpbiB0aGUgc2NoZW1hIGFwcGxpZWQgdG8gdGhlIFhNTCBzY2hlbWEKLWxhbmd1YWdlIGNvbnN0cnVjdHMuPC9kaXY+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPllvdSBjYW4gY2hhbmdlIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EZWZhdWx0IFRhcmdldCBOYW1lc3BhY2U8L3NwYW4+IHZhbHVlLjwvc3Bhbj4KLSBUaGUgdmFsdWUgc3BlY2lmaWVkIGluIHRoaXMgZmllbGQgd2lsbCBiZSB0aGUgZGVmYXVsdCB0YXJnZXQgbmFtZXNwYWNlCi1mb3IgYW55IG5ldyBYTUwgc2NoZW1hIGZpbGVzIGNyZWF0ZWQuPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSzwvc3Bhbj4uPC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NzgzMGUuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTw/UHViIEluYz8+DQotPHRhc2sgaWQ9InRlZHRzY2htIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+RWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+QWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywNCi1zdWNoIGFzIGl0cyBuYW1lc3BhY2UgYW5kIHByZWZpeC48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjxpbmRleHRlcm0+ZWRpdGluZyBYTUwgc2NoZW1hczxpbmRleHRlcm0+c2ltcGxlDQotdHlwZXM8L2luZGV4dGVybT48L2luZGV4dGVybT48L2luZGV4dGVybT48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmVkaXRpbmc8aW5kZXh0ZXJtPnNpbXBsZQ0KLXR5cGVzPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9pbmRleHRlcm0+PC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gZWRpdCBhbiBYTUwgc2NoZW1hJ3MNCi1wcm9wZXJ0aWVzIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hIG9yIGRvdWJsZS1jbGljayBhbiBleGlzdGluZyBzY2hlbWEgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcuPC9jbWQ+PGluZm8+IEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+SW4gdGhlIE91dGxpbmUgdmlldywgY2xpY2sgPHVpY29udHJvbD5EaXJlY3RpdmVzPC91aWNvbnRyb2w+Ljw/UHViIENhcmV0Pz48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5JbiB0aGUgUHJvcGVydGllcyB2aWV3LCBjbGljayB0aGUgPHVpY29udHJvbD5HZW5lcmFsPC91aWNvbnRyb2w+IHRhYi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5Zb3UgY2FuIGNoYW5nZSB0aGUgPHVpY29udHJvbD5QcmVmaXg8L3VpY29udHJvbD4gYXNzb2NpYXRlZCB3aXRoDQotdGhlIGN1cnJlbnQgbmFtZXNwYWNlLjwvY21kPjxpbmZvPkVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGFyZSBhc3NvY2lhdGVkDQotd2l0aCB0aGlzIG5hbWVzcGFjZSB3aWxsIGJlIHByZWZpeGVkIHdpdGggdGhpcyB2YWx1ZS48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+WW91IGNhbiBhbHNvIGVkaXQgdGhlIDx1aWNvbnRyb2w+VGFyZ2V0IG5hbWVzcGFjZTwvdWljb250cm9sPiBmb3INCi10aGlzIHNjaGVtYS48L2NtZD48aW5mbz4gQSBuYW1lc3BhY2UgaXMgYSBVUkkgdGhhdCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lDQotdG8gYXNzb2NpYXRlIHdpdGggYWxsIHRoZSBlbGVtZW50cyBhbmQgdHlwZSBkZWZpbml0aW9ucyBpbiBhIHNjaGVtYS48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQNCi10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFhNTCBzY2hlbWEuPC9jbWQ+PGluZm8+VGhlIDx1aWNvbnRyb2w+RG9jdW1lbnRhdGlvbjwvdWljb250cm9sPiBwYWdlDQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2luZm8+PC9zdGVwPg0KLTxzdGVwPjxjbWQ+Q2xpY2sgdGhlIDx1aWNvbnRyb2w+RXh0ZW5zaW9uczwvdWljb250cm9sPiB0YWIgaWYgeW91IHdhbnQgdG8NCi1hZGQgYXBwbGljYXRpb24gaW5mb3JtYXRpb24gZWxlbWVudHMgdG8geW91ciBhbm5vdGF0aW9ucyBvZiBzY2hlbWEgY29tcG9uZW50cy48L2NtZD4NCi08aW5mbz5UaGUgPHVpY29udHJvbD5FeHRlbnNpb25zPC91aWNvbnRyb2w+IHBhZ2UgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZQ0KLXNjaGVtYSBhbmQgYWRkIFhNTCBjb250ZW50IHRvIHlvdXIgYW5ub3RhdGlvbnMuPC9pbmZvPjwvc3RlcD4NCi08L3N0ZXBzPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAyMzg5Pz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RlZHRzY2htLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0MGVmM2EuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90ZWR0c2NobS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iRWRpdGluZyBYTUwgc2NoZW1hIHByb3BlcnRpZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iQWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IkFmdGVyIHlvdSBjcmVhdGUgYW4gWE1MIHNjaGVtYSwgeW91IGNhbiBlZGl0IGl0cyB2YXJpb3VzIHByb3BlcnRpZXMsIHN1Y2ggYXMgaXRzIG5hbWVzcGFjZSBhbmQgcHJlZml4LiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZWRpdG9yLCBlZGl0aW5nIFhNTCBzY2hlbWFzLCBzaW1wbGUgdHlwZXMsIFhNTCBzY2hlbWEgZmlsZXMsIGVkaXRpbmciIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGVkaXRvciwgZWRpdGluZyBYTUwgc2NoZW1hcywgc2ltcGxlIHR5cGVzLCBYTUwgc2NoZW1hIGZpbGVzLCBlZGl0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0ZWR0c2NobSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0ZWR0c2NobSI+PGEgbmFtZT0idGVkdHNjaG0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkVkaXRpbmcgWE1MIHNjaGVtYSBwcm9wZXJ0aWVzPC9oMT4KLQotCi0KLQotPGRpdj48cD5BZnRlciB5b3UgY3JlYXRlIGFuIFhNTCBzY2hlbWEsIHlvdSBjYW4gZWRpdCBpdHMgdmFyaW91cyBwcm9wZXJ0aWVzLAotc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwKLWJ1dCB0aGV5IHdpbGwgYWxzbyB3b3JrIGluIG1hbnkgb3RoZXIgcGVyc3BlY3RpdmVzLjwvcD4KLTxwPlRvIGVkaXQgYW4gWE1MIHNjaGVtYSdzCi1wcm9wZXJ0aWVzIGZvbGxvdyB0aGVzZSBzdGVwczo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hIGluIHRoZQotTmF2aWdhdG9yIHZpZXcuPC9zcGFuPiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5JbiB0aGUgT3V0bGluZSB2aWV3LCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5EaXJlY3RpdmVzPC9zcGFuPi48L3NwYW4+Ci08L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkluIHRoZSBQcm9wZXJ0aWVzIHZpZXcsIGNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5HZW5lcmFsPC9zcGFuPiB0YWIuPC9zcGFuPgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5Zb3UgY2FuIGNoYW5nZSB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UHJlZml4PC9zcGFuPiBhc3NvY2lhdGVkIHdpdGgKLXRoZSBjdXJyZW50IG5hbWVzcGFjZS48L3NwYW4+IEVsZW1lbnQgYW5kIGF0dHJpYnV0ZSBuYW1lcyB0aGF0IGFyZSBhc3NvY2lhdGVkCi13aXRoIHRoaXMgbmFtZXNwYWNlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGlzIHZhbHVlLjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+WW91IGNhbiBhbHNvIGVkaXQgdGhlIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlRhcmdldCBuYW1lc3BhY2U8L3NwYW4+IGZvcgotdGhpcyBzY2hlbWEuPC9zcGFuPiAgQSBuYW1lc3BhY2UgaXMgYSBVUkkgdGhhdCBwcm92aWRlcyBhIHVuaXF1ZSBuYW1lCi10byBhc3NvY2lhdGUgd2l0aCBhbGwgdGhlIGVsZW1lbnRzIGFuZCB0eXBlIGRlZmluaXRpb25zIGluIGEgc2NoZW1hLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayB0aGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gdGFiIGlmIHlvdSB3YW50Ci10byBwcm92aWRlIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIFhNTCBzY2hlbWEuPC9zcGFuPiBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RG9jdW1lbnRhdGlvbjwvc3Bhbj4gcGFnZQotaXMgdXNlZCBmb3IgaHVtYW4gcmVhZGFibGUgbWF0ZXJpYWwsIHN1Y2ggYXMgYSBkZXNjcmlwdGlvbi48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIHRoZSA8c3BhbiBjbGFzcz0idWljb250cm9sIj5FeHRlbnNpb25zPC9zcGFuPiB0YWIgaWYgeW91IHdhbnQgdG8KLWFkZCBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBlbGVtZW50cyB0byB5b3VyIGFubm90YXRpb25zIG9mIHNjaGVtYSBjb21wb25lbnRzLjwvc3Bhbj4KLSBUaGUgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+RXh0ZW5zaW9uczwvc3Bhbj4gcGFnZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlCi1zY2hlbWEgYW5kIGFkZCBYTUwgY29udGVudCB0byB5b3VyIGFubm90YXRpb25zLjwvbGk+Ci0KLTwvb2w+Ci0KLTwvZGl2PgotCi0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXBzY2htLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXBzY2htLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3MGY1ZDAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90aW1wc2NobS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0aW1wc2NobSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5JbXBvcnRpbmcgWE1MIHNjaGVtYXM8L3NlYXJjaHRpdGxlPg0KLTwvdGl0bGVhbHRzPg0KLTxzaG9ydGRlc2M+SWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlDQotb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlDQotWE1MIHNjaGVtYSBlZGl0b3IuIFRoZSBYTUwgc2NoZW1hIGVkaXRvciBwcm92aWRlcyB5b3Ugd2l0aCBhIHN0cnVjdHVyZWQgdmlldw0KLW9mIHRoZSBYTUwgc2NoZW1hLjwvc2hvcnRkZXNjPg0KLTxwcm9sb2c+PG1ldGFkYXRhPg0KLTxrZXl3b3Jkcz48aW5kZXh0ZXJtPlhNTCBzY2hlbWEgZmlsZXM8aW5kZXh0ZXJtPmltcG9ydGluZzwvaW5kZXh0ZXJtPjwvaW5kZXh0ZXJtPg0KLTwva2V5d29yZHM+DQotPC9tZXRhZGF0YT48L3Byb2xvZz4NCi08dGFza2JvZHk+DQotPGNvbnRleHQ+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsDQotYnV0IHRoZXkgd2lsbCBhbHNvIHdvcmsgaW4gbWFueSBvdGhlciBwZXJzcGVjdGl2ZXMuPC9wPjxwPlRvIGltcG9ydCBhbiBYTUwNCi1zY2hlbWEgaW50byB0aGUgd29ya2JlbmNoPD9QdWIgQ2FyZXQ/Pjo8L3A+PC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNsaWNrIDxtZW51Y2FzY2FkZT48dWljb250cm9sPkZpbGUgPiBJbXBvcnQ8L3VpY29udHJvbD48L21lbnVjYXNjYWRlPi48L2NtZD4NCi08L3N0ZXA+DQotPHN0ZXA+PGNtZD5TZWxlY3QgdGhlIGltcG9ydCBzb3VyY2UuPC9jbWQ+PGluZm8+IENsaWNrIDx1aWNvbnRyb2w+TmV4dDwvdWljb250cm9sPi48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+RmlsbCBpbiB0aGUgZmllbGRzIGluIHRoZSBJbXBvcnQgd2l6YXJkIGFzIG5lY2Vzc2FyeS48L2NtZD48aW5mbz4gV2hlbg0KLXlvdSBhcmUgZmluaXNoZWQsIGNsaWNrIDx1aWNvbnRyb2w+RmluaXNoPC91aWNvbnRyb2w+LjwvaW5mbz48L3N0ZXA+DQotPC9zdGVwcz4NCi08cmVzdWx0PjxwPlRoZSBpbXBvcnRlZCBzY2hlbWEgbm93IGFwcGVhcnMgaW4gdGhlIE5hdmlnYXRvciB2aWV3LiBEb3VibGUtY2xpY2sNCi1pdCB0byBvcGVuIGl0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDE0NDg/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdGltcHNjaG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcyNmEyYy4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RpbXBzY2htLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJJbXBvcnRpbmcgWE1MIHNjaGVtYXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iSWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBwcm9kdWN0LCB5b3UgY2FuIGltcG9ydCB0aGVtIGludG8gdGhlIHdvcmtiZW5jaCBhbmQgb3BlbiB0aGVtIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhlIFhNTCBzY2hlbWEgZWRpdG9yIHByb3ZpZGVzIHlvdSB3aXRoIGEgc3RydWN0dXJlZCB2aWV3IG9mIHRoZSBYTUwgc2NoZW1hLiIgLz4KLTxtZXRhIG5hbWU9ImRlc2NyaXB0aW9uIiBjb250ZW50PSJJZiB5b3Ugd2FudCB0byB3b3JrIHdpdGggWE1MIHNjaGVtYSBmaWxlcyB0aGF0IHlvdSBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIHByb2R1Y3QsIHlvdSBjYW4gaW1wb3J0IHRoZW0gaW50byB0aGUgd29ya2JlbmNoIGFuZCBvcGVuIHRoZW0gaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcgb2YgdGhlIFhNTCBzY2hlbWEuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgaW1wb3J0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgaW1wb3J0aW5nIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RlZHRzY2htLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdHZkdHNjaG0uaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRpbXBzY2htIiBuYW1lPSJEQy5JZGVudGlmaWVyIiAvPgotPG1ldGEgY29udGVudD0iZW4tdXMiIG5hbWU9IkRDLkxhbmd1YWdlIiAvPgotPGxpbmsgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2Uud3N0LmRvYy51c2VyL2NvbW1vbi5jc3MiIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+Ci08dGl0bGU+SW1wb3J0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0aW1wc2NobSI+PGEgbmFtZT0idGltcHNjaG0iPjwhLS0gLS0+PC9hPgotCi0KLTxoMSBjbGFzcz0idG9waWN0aXRsZTEiPkltcG9ydGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+SWYgeW91IHdhbnQgdG8gd29yayB3aXRoIFhNTCBzY2hlbWEgZmlsZXMgdGhhdCB5b3UgY3JlYXRlZCBvdXRzaWRlCi1vZiB0aGUgcHJvZHVjdCwgeW91IGNhbiBpbXBvcnQgdGhlbSBpbnRvIHRoZSB3b3JrYmVuY2ggYW5kIG9wZW4gdGhlbSBpbiB0aGUKLVhNTCBzY2hlbWEgZWRpdG9yLiBUaGUgWE1MIHNjaGVtYSBlZGl0b3IgcHJvdmlkZXMgeW91IHdpdGggYSBzdHJ1Y3R1cmVkIHZpZXcKLW9mIHRoZSBYTUwgc2NoZW1hLjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyBpbXBvcnQgYW4gWE1MCi1zY2hlbWEgaW50byB0aGUgd29ya2JlbmNoOjwvcD4KLTwvZGl2PgotCi08b2w+Ci08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPkNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+RmlsZSAmZ3Q7IEltcG9ydDwvc3Bhbj48L3NwYW4+Ljwvc3Bhbj4KLTwvbGk+Ci0KLTxsaSBjbGFzcz0ic3RlcGV4cGFuZCI+PHNwYW4+U2VsZWN0IHRoZSBpbXBvcnQgc291cmNlLjwvc3Bhbj4gIENsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPk5leHQ8L3NwYW4+LgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5GaWxsIGluIHRoZSBmaWVsZHMgaW4gdGhlIEltcG9ydCB3aXphcmQgYXMgbmVjZXNzYXJ5Ljwvc3Bhbj4gIFdoZW4KLXlvdSBhcmUgZmluaXNoZWQsIGNsaWNrIDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPkZpbmlzaDwvc3Bhbj4uPC9saT4KLQotPC9vbD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGltcG9ydGVkIHNjaGVtYSBub3cgYXBwZWFycyBpbiB0aGUgTmF2aWdhdG9yIHZpZXcuIERvdWJsZS1jbGljawotaXQgdG8gb3BlbiBpdCBpbiB0aGUgWE1MIHNjaGVtYSBlZGl0b3IuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIHRpdGxlPSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPlhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90ZWR0c2NobS5odG1sIiB0aXRsZT0iQWZ0ZXIgeW91IGNyZWF0ZSBhbiBYTUwgc2NoZW1hLCB5b3UgY2FuIGVkaXQgaXRzIHZhcmlvdXMgcHJvcGVydGllcywgc3VjaCBhcyBpdHMgbmFtZXNwYWNlIGFuZCBwcmVmaXguIj5FZGl0aW5nIFhNTCBzY2hlbWEgcHJvcGVydGllczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3R2ZHRzY2htLmh0bWwiIHRpdGxlPSJWYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBYTUwgc2NoZW1hIGZpbGUgaXMgc2VtYW50aWNhbGx5IHZhbGlkLiBBbnkgZXJyb3JzIHdpbGwgYmUgZGlzcGxheWVkIGluIHRoZSBQcm9ibGVtcyB2aWV3LiI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvYT48L2Rpdj4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL3RhZGRpbXB0Lmh0bWwiIHRpdGxlPSJBcyBzY2hlbWFzIGJlY29tZSBsYXJnZXIsIGl0IGlzIG9mdGVuIGRlc2lyYWJsZSB0byBkaXZpZGUgdGhlaXIgY29udGVudCBhbW9uZyBzZXZlcmFsIHNjaGVtYSBkb2N1bWVudHMgZm9yIHB1cnBvc2VzIHN1Y2ggYXMgZWFzZSBvZiBtYWludGVuYW5jZSwgcmV1c2UsIGFuZCByZWFkYWJpbGl0eS4gWW91IGNhbiB1c2UgYW4gaW1wb3J0IGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIGFuIGltcG9ydGVkIHNjaGVtYSBpbnRvIHRoZSBjdXJyZW50IHNjaGVtYS4iPkFkZGluZyBpbXBvcnQgZWxlbWVudHM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90YWRkaW5jbC5odG1sIiB0aXRsZT0iQXMgc2NoZW1hcyBiZWNvbWUgbGFyZ2VyLCBpdCBpcyBvZnRlbiBkZXNpcmFibGUgdG8gZGl2aWRlIHRoZWlyIGNvbnRlbnQgYW1vbmcgc2V2ZXJhbCBzY2hlbWEgZG9jdW1lbnRzIGZvciBwdXJwb3NlcyBzdWNoIGFzIGVhc2Ugb2YgbWFpbnRlbmFuY2UsIHJldXNlLCBhbmQgcmVhZGFiaWxpdHkuIFlvdSBjYW4gdXNlIHRoZSBpbmNsdWRlIGVsZW1lbnQgdG8gYnJpbmcgaW4gZGVmaW5pdGlvbnMgYW5kIGRlY2xhcmF0aW9ucyBmcm9tIHRoZSBpbmNsdWRlZCBzY2hlbWEgaW50byB0aGUgY3VycmVudCBzY2hlbWEuIFRoZSBpbmNsdWRlZCBzY2hlbWEgbXVzdCBiZSBpbiB0aGUgc2FtZSB0YXJnZXQgbmFtZXNwYWNlIGFzIHRoZSBpbmNsdWRpbmcgc2NoZW1hLiI+QWRkaW5nIGluY2x1ZGUgZWxlbWVudHM8L2E+PC9kaXY+Ci08L2Rpdj4KLTwvZGl2PgotCi08L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90bmF2c3JjLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRmMmEwZi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuZGl0YQorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQotPCEtLUFyYm9ydGV4dCwgSW5jLiwgMTk4OC0yMDA1LCB2LjQwMDItLT4NCi08IURPQ1RZUEUgdGFzayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRElUQSBUYXNrLy9FTiIgInRhc2suZHRkIj4NCi08dGFzayBpZD0idG5hdnNyYyIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+TmF2aWdhdGluZyBYTUwgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5XaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgU291cmNlIHZpZXcsIHlvdSBjYW4gdXNlIEYzIHRvIG5hdmlnYXRlDQotdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBjbGlja2luZw0KLUYzIHRvIGp1bXAgdG8gdGhlIGl0ZW0gaXQgcmVmZXJzIHRvLiA8L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT5uYXZpZ2F0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5Zb3UgY2FuIGp1bXAgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgaXRlbXM6PC9wPjx1bD4NCi08bGk+RWxlbWVudCBvciBhdHRyaWJ1dGUgZGVjbGFyYXRpb24ncyB0eXBlPC9saT4NCi08bGk+RWxlbWVudCByZWZlcmVuY2VzPC9saT4NCi08bGk+R3JvdXAgcmVmZXJlbmNlczwvbGk+DQotPGxpPkF0dHJpYnV0ZSByZWZlcmVuY2VzPC9saT4NCi08bGk+QXR0cmlidXRlIGdyb3VwIHJlZmVyZW5jZXM8L2xpPg0KLTxsaT5JbXBvcnQsIGluY2x1ZGUsIGFuZCByZWRlZmluZSBlbGVtZW50ICh0aGUgZXh0ZXJuYWwgc2NoZW1hIHdpbGwgb3BlbiBpbg0KLXRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVGhpcyBvbmx5IHdvcmtzIHdpdGggc2NoZW1hcyBpbiB0aGUgd29ya3NwYWNlKS48L2xpPg0KLTwvdWw+PHA+WW91IG11c3QgcGxhY2UgeW91ciBjdXJzb3IgZXhhY3RseSBpbiB0aGUgbG9jYXRpb24gb2YgdGhlIHJlZmVyZW5jZQ0KLShmb3IgZXhhbXBsZSBiZXR3ZWVuIHRoZSBkb3VibGUgcXVvdGVzIGZvciA8c3lzdGVtb3V0cHV0PnR5cGUgPSAiICI8L3N5c3RlbW91dHB1dD4gb3INCi0gPHN5c3RlbW91dHB1dD5iYXNlID0gIiAiPC9zeXN0ZW1vdXRwdXQ+KS48L3A+PHA+Rm9yIGV4YW1wbGUsIGlmIHlvdSBwbGFjZQ0KLXlvdXIgY3Vyc29yIGFueXdoZXJlIGluIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgY2xpY2sgRjM6PC9wPjxwPiA8c3lzdGVtb3V0cHV0PiZsdDtlbGVtZW50DQotbmFtZT0ic2hpcFRvIiB0eXBlPSJwbzpVU0FkZHJlc3MiPiZsdDsvZWxlbWVudD48L3N5c3RlbW91dHB1dD4gPC9wPjxwPnRoZQ0KLWN1cnNvciB3aWxsIGF1dG9tYXRpY2FsbHkganVtcCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIHR5cGUNCi1VU0FkZHJlc3MgaXMgZGVmaW5lZC48L3A+PHA+T3IsIGlmIHlvdSBwbGFjZSB5b3VyIGN1cnNvciBhbnl3aGVyZSBpbiB0aGUgZm9sbG93aW5nDQotdGV4dCBhbmQgY2xpY2sgRjM6PC9wPjxwPiA8c3lzdGVtb3V0cHV0PiZsdDtlbGVtZW50IHJlZj0icG86Q29udGFjdEVsZW1lbnQiPiZsdDsvZWxlbWVudD48L3N5c3RlbW91dHB1dD4gPC9wPjxwPnRoZQ0KLWN1cnNvciB3aWxsIGF1dG9tYXRpY2FsbHkganVtcCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIGdsb2JhbA0KLWVsZW1lbnQgQ29udGFjdEVsZW1lbnQgaXMgZGVmaW5lZC48L3A+PHA+VGhpcyB3b3JrcyBhY3Jvc3MgZmlsZXMuIEZvciBleGFtcGxlLA0KLWlmIHRoZSB0eXBlIHlvdSBoYXZlIHNlbGVjdGVkIGlzIGRlZmluZWQgaW4gYW5vdGhlciBYTUwgc2NoZW1hIGFuZCB5b3UgY2xpY2sNCi1GMywgeW91IHdpbGwgYXV0b21hdGljYWxseSBiZSB0YWtlbiB0byB0aGF0IGZpbGUuPC9wPjwvY29udGV4dD4NCi08L3Rhc2tib2R5Pg0KLTwvdGFzaz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RuYXZzcmMuaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdG5hdnNyYy5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ODJkZWY1Li4wMDAwMDAwCi0tLSBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdG5hdnNyYy5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+Ci08aHRtbCBsYW5nPSJlbi11cyIgeG1sOmxhbmc9ImVuLXVzIj4KLTxoZWFkPgotPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04IiBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIC8+Ci08bWV0YSBuYW1lPSJjb3B5cmlnaHQiIGNvbnRlbnQ9IkNvcHlyaWdodCAoYykgMjAwMCwgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuIENvbnRyaWJ1dG9yczogSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uIiAvPgotPG1ldGEgbmFtZT0iREMucmlnaHRzLm93bmVyIiBjb250ZW50PSIoQykgQ29weXJpZ2h0IDIwMDAsIDIwMDYiIC8+Ci08bWV0YSBjb250ZW50PSJwdWJsaWMiIG5hbWU9InNlY3VyaXR5IiAvPgotPG1ldGEgY29udGVudD0iaW5kZXgsZm9sbG93IiBuYW1lPSJSb2JvdHMiIC8+Ci08bWV0YSBodHRwLWVxdWl2PSJQSUNTLUxhYmVsIiBjb250ZW50PScoUElDUy0xLjEgImh0dHA6Ly93d3cuaWNyYS5vcmcvcmF0aW5nc3YwMi5odG1sIiBsIGdlbiB0cnVlIHIgKGN6IDEgbHogMSBueiAxIG96IDEgdnogMSkgImh0dHA6Ly93d3cucnNhYy5vcmcvcmF0aW5nc3YwMS5odG1sIiBsIGdlbiB0cnVlIHIgKG4gMCBzIDAgdiAwIGwgMCkgImh0dHA6Ly93d3cuY2xhc3NpZnkub3JnL3NhZmVzdXJmLyIgbCBnZW4gdHJ1ZSByIChTU35+MDAwIDEpKScgLz4KLTxtZXRhIGNvbnRlbnQ9InRhc2siIG5hbWU9IkRDLlR5cGUiIC8+Ci08bWV0YSBuYW1lPSJEQy5UaXRsZSIgY29udGVudD0iTmF2aWdhdGluZyBYTUwgc2NoZW1hcyIgLz4KLTxtZXRhIG5hbWU9ImFic3RyYWN0IiBjb250ZW50PSJXaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgU291cmNlIHZpZXcsIHlvdSBjYW4gdXNlIEYzIHRvIG5hdmlnYXRlIHRocm91Z2ggdGhlIGZpbGUgYnkgcGxhY2luZyB5b3VyIGN1cnNvciBpbiB0aGUgYXBwcm9wcmlhdGUgaXRlbSBhbmQgY2xpY2tpbmcgRjMgdG8ganVtcCB0byB0aGUgaXRlbSBpdCByZWZlcnMgdG8uIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldoZW4geW91IGFyZSB3b3JraW5nIGluIHRoZSBTb3VyY2UgdmlldywgeW91IGNhbiB1c2UgRjMgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgZmlsZSBieSBwbGFjaW5nIHlvdXIgY3Vyc29yIGluIHRoZSBhcHByb3ByaWF0ZSBpdGVtIGFuZCBjbGlja2luZyBGMyB0byBqdW1wIHRvIHRoZSBpdGVtIGl0IHJlZmVycyB0by4iIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBuYXZpZ2F0aW5nIiBuYW1lPSJEQy5zdWJqZWN0IiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgbmF2aWdhdGluZyIgbmFtZT0ia2V5d29yZHMiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Ii4uL3RvcGljcy9jeG1sc2NlZC5odG1sIiAvPgotPG1ldGEgY29udGVudD0iWEhUTUwiIG5hbWU9IkRDLkZvcm1hdCIgLz4KLTxtZXRhIGNvbnRlbnQ9InRuYXZzcmMiIG5hbWU9IkRDLklkZW50aWZpZXIiIC8+Ci08bWV0YSBjb250ZW50PSJlbi11cyIgbmFtZT0iREMuTGFuZ3VhZ2UiIC8+Ci08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS53c3QuZG9jLnVzZXIvY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiIHJlbD0ic3R5bGVzaGVldCIgLz4KLTx0aXRsZT5OYXZpZ2F0aW5nIFhNTCBzY2hlbWFzPC90aXRsZT4KLTwvaGVhZD4KLTxib2R5IGlkPSJ0bmF2c3JjIj48YSBuYW1lPSJ0bmF2c3JjIj48IS0tIC0tPjwvYT4KLQotCi08aDEgY2xhc3M9InRvcGljdGl0bGUxIj5OYXZpZ2F0aW5nIFhNTCBzY2hlbWFzPC9oMT4KLQotCi0KLQotPGRpdj48cD5XaGVuIHlvdSBhcmUgd29ya2luZyBpbiB0aGUgU291cmNlIHZpZXcsIHlvdSBjYW4gdXNlIEYzIHRvIG5hdmlnYXRlCi10aHJvdWdoIHRoZSBmaWxlIGJ5IHBsYWNpbmcgeW91ciBjdXJzb3IgaW4gdGhlIGFwcHJvcHJpYXRlIGl0ZW0gYW5kIGNsaWNraW5nCi1GMyB0byBqdW1wIHRvIHRoZSBpdGVtIGl0IHJlZmVycyB0by4gPC9wPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5Zb3UgY2FuIGp1bXAgdG8gYW55IG9mIHRoZSBmb2xsb3dpbmcgaXRlbXM6PC9wPgotPHVsPgotPGxpPkVsZW1lbnQgb3IgYXR0cmlidXRlIGRlY2xhcmF0aW9uJ3MgdHlwZTwvbGk+Ci0KLTxsaT5FbGVtZW50IHJlZmVyZW5jZXM8L2xpPgotCi08bGk+R3JvdXAgcmVmZXJlbmNlczwvbGk+Ci0KLTxsaT5BdHRyaWJ1dGUgcmVmZXJlbmNlczwvbGk+Ci0KLTxsaT5BdHRyaWJ1dGUgZ3JvdXAgcmVmZXJlbmNlczwvbGk+Ci0KLTxsaT5JbXBvcnQsIGluY2x1ZGUsIGFuZCByZWRlZmluZSBlbGVtZW50ICh0aGUgZXh0ZXJuYWwgc2NoZW1hIHdpbGwgb3BlbiBpbgotdGhlIFhNTCBzY2hlbWEgZWRpdG9yLiBUaGlzIG9ubHkgd29ya3Mgd2l0aCBzY2hlbWFzIGluIHRoZSB3b3Jrc3BhY2UpLjwvbGk+Ci0KLTwvdWw+Ci08cD5Zb3UgbXVzdCBwbGFjZSB5b3VyIGN1cnNvciBleGFjdGx5IGluIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVmZXJlbmNlCi0oZm9yIGV4YW1wbGUgYmV0d2VlbiB0aGUgZG91YmxlIHF1b3RlcyBmb3IgPHR0IGNsYXNzPSJzeXNvdXQiPnR5cGUgPSAiICI8L3R0PiBvcgotIDx0dCBjbGFzcz0ic3lzb3V0Ij5iYXNlID0gIiAiPC90dD4pLjwvcD4KLTxwPkZvciBleGFtcGxlLCBpZiB5b3UgcGxhY2UKLXlvdXIgY3Vyc29yIGFueXdoZXJlIGluIHRoZSBmb2xsb3dpbmcgdGV4dCBhbmQgY2xpY2sgRjM6PC9wPgotPHA+IDx0dCBjbGFzcz0ic3lzb3V0Ij4mbHQ7ZWxlbWVudAotbmFtZT0ic2hpcFRvIiB0eXBlPSJwbzpVU0FkZHJlc3MiJmd0OyZsdDsvZWxlbWVudCZndDs8L3R0PiA8L3A+Ci08cD50aGUKLWN1cnNvciB3aWxsIGF1dG9tYXRpY2FsbHkganVtcCB0byB0aGUgbG9jYXRpb24gaW4gdGhlIGZpbGUgd2hlcmUgdGhlIHR5cGUKLVVTQWRkcmVzcyBpcyBkZWZpbmVkLjwvcD4KLTxwPk9yLCBpZiB5b3UgcGxhY2UgeW91ciBjdXJzb3IgYW55d2hlcmUgaW4gdGhlIGZvbGxvd2luZwotdGV4dCBhbmQgY2xpY2sgRjM6PC9wPgotPHA+IDx0dCBjbGFzcz0ic3lzb3V0Ij4mbHQ7ZWxlbWVudCByZWY9InBvOkNvbnRhY3RFbGVtZW50IiZndDsmbHQ7L2VsZW1lbnQmZ3Q7PC90dD4gPC9wPgotPHA+dGhlCi1jdXJzb3Igd2lsbCBhdXRvbWF0aWNhbGx5IGp1bXAgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBmaWxlIHdoZXJlIHRoZSBnbG9iYWwKLWVsZW1lbnQgQ29udGFjdEVsZW1lbnQgaXMgZGVmaW5lZC48L3A+Ci08cD5UaGlzIHdvcmtzIGFjcm9zcyBmaWxlcy4gRm9yIGV4YW1wbGUsCi1pZiB0aGUgdHlwZSB5b3UgaGF2ZSBzZWxlY3RlZCBpcyBkZWZpbmVkIGluIGFub3RoZXIgWE1MIHNjaGVtYSBhbmQgeW91IGNsaWNrCi1GMywgeW91IHdpbGwgYXV0b21hdGljYWxseSBiZSB0YWtlbiB0byB0aGF0IGZpbGUuPC9wPgotPC9kaXY+Ci0KLTwvZGl2PgotCi08ZGl2PjxkaXYgY2xhc3M9InJlbGNvbmNlcHRzIj48c3Ryb25nPlJlbGF0ZWQgY29uY2VwdHM8L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vdG9waWNzL2N4bWxzY2VkLmh0bWwiIHRpdGxlPSJUaGlzIHByb2R1Y3QgcHJvdmlkZXMgYW4gWE1MIHNjaGVtYSBlZGl0b3IgZm9yIGNyZWF0aW5nLCB2aWV3aW5nLCBhbmQgdmFsaWRhdGluZyBYTUwgc2NoZW1hcy4gWE1MIHNjaGVtYXMgYXJlIGEgZm9ybWFsIHNwZWNpZmljYXRpb24gb2YgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPlhNTCBzY2hlbWEgZWRpdG9yPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuZGl0YSBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHJlZmFjdHJYU0QuZGl0YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQxYzBiMC4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmRpdGEKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS1BcmJvcnRleHQsIEluYy4sIDE5ODgtMjAwNSwgdi40MDAyLS0+DQotPCFET0NUWVBFIHRhc2sgUFVCTElDICItLy9PQVNJUy8vRFREIERJVEEgVGFzay8vRU4iDQotICJ0YXNrLmR0ZCI+DQotPHRhc2sgaWQ9InJlZmFjdG9yaW5nIiB4bWw6bGFuZz0iZW4tdXMiPg0KLTx0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC90aXRsZT4NCi08dGl0bGVhbHRzPg0KLTxzZWFyY2h0aXRsZT5SZWZhY3RvcmluZyBpbiBYTUwgU2NoZW1hIEZpbGVzPC9zZWFyY2h0aXRsZT4NCi08L3RpdGxlYWx0cz4NCi08c2hvcnRkZXNjPldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYQ0KLXNpbmdsZSBhcnRpZmFjdCBjaGFuZ2UsIGFuZCBoYXZlIHRoYXQgY2hhbmdlIGltcGxlbWVudGVkIHRocm91Z2hvdXQgYWxsIG90aGVyDQotZGVwZW5kYW50IGFydGlmYWN0cy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPC9pbmRleHRlcm0+PGluZGV4dGVybT5YTUwgc2NoZW1hIGVkaXRvcjwvaW5kZXh0ZXJtPg0KLTxpbmRleHRlcm0+cmVmYWN0b3Jpbmc8L2luZGV4dGVybT48aW5kZXh0ZXJtPnJlbmFtaW5nPC9pbmRleHRlcm0+PGluZGV4dGVybT5lZGl0aW5nDQotWE1MIHNjaGVtYXM8L2luZGV4dGVybT48aW5kZXh0ZXJtPmRlcGVuZGFudCBhcnRpZmFjdHM8L2luZGV4dGVybT48L2tleXdvcmRzPg0KLTwvbWV0YWRhdGE+PC9wcm9sb2c+DQotPHRhc2tib2R5Pg0KLTxwcmVyZXE+PC9wcmVyZXE+DQotPGNvbnRleHQ+UmVmYWN0b3JpbmcgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgdGhlIHRlZGlvdXMgZWRpdGluZyBuZWNlc3NhcnkNCi10byByZWNvdmVyIGJyb2tlbiBkZXBlbmRlbmNpZXMgY2F1c2VkIGJ5IGFydGlmYWN0IGNoYW5nZXMgd2hpY2ggY2F1c2UgcmlwcGxlDQotZWZmZWN0cyBvbiBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzIChzdWNoIGFzIHJlbmFtaW5nIGFuIFhNTCBTY2hlbWEgZWxlbWVudCkuPC9jb250ZXh0Pg0KLTxzdGVwcz4NCi08c3RlcD48Y21kPkNyZWF0ZSBhIG5ldyBYTUwgc2NoZW1hIG9yIGRvdWJsZS1jbGljayBhbiBleGlzdGluZyBzY2hlbWEgaW4gdGhlDQotTmF2aWdhdG9yIHZpZXcuPC9jbWQ+PGluZm8+IEl0IHdpbGwgYXV0b21hdGljYWxseSBvcGVuIGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvci48L2luZm8+DQotPC9zdGVwPg0KLTxzdGVwPjxjbWQ+VG8gcmVmYWN0b3IgYW4gYXJ0aWZhY3QsIHBvc2l0aW9uIGN1cnNvciB3aXRoaW4gdGhlIGFydGlmYWN0LCByaWdodC1jbGljaw0KLXRoZSBhcnRpZmFjdCwgY2xpY2sgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UmVmYWN0b3I8L3VpY29udHJvbD48dWljb250cm9sPlJlbmFtZTwvdWljb250cm9sPg0KLTwvbWVudWNhc2NhZGU+PC9jbWQ+PGluZm8+QSBwb3B1cCBkaWFsb2cgd2lsbCByZXF1ZXN0IHRoZSBlbnRyeSBvZiBhIG5ldyBuYW1lDQotZm9yIHRoYXQgYXJ0aWZhY3Q8L2luZm8+DQotPHN1YnN0ZXBzPg0KLTxzdWJzdGVwPjxjbWQ+VHlwZSBpbiB0aGUgbmV3IG5hbWUgb2YgdGhlIGFydGlmYWN0LjwvY21kPjwvc3Vic3RlcD4NCi08c3Vic3RlcD48Y21kPihPcHRpb25hbCkgQ2xpY2sgPGI+UHJldmlldzwvYj48P1B1YiBDYXJldD8+LjwvY21kPjxpbmZvPkEgd2luZG93DQotd2lsbCBvcGVuIGluZGljYXRpbmcgYWxsIG9mIHRoZSBjaGFuZ2VzIHdoaWNoIHdpbGwgdGFrZSBwbGFjZSBkdWUgdG8gdGhlIHJlZmFjdG9yaW5nLjwvaW5mbz4NCi08L3N1YnN0ZXA+DQotPHN1YnN0ZXA+PGNtZD5DbGljayA8dWljb250cm9sPk9LLjwvdWljb250cm9sPjwvY21kPjwvc3Vic3RlcD4NCi08L3N1YnN0ZXBzPg0KLTwvc3RlcD4NCi08L3N0ZXBzPg0KLTxyZXN1bHQ+VGhlIG5ldyBuYW1lIHdpbGwgYmUgZW50ZXJlZCBpbiB0aGUgb3BlbmVkIFhTRCBzb3VyY2UsIGFzIHdlbGwgYXMNCi1pbiBhbGwgZGVwZW5kYW50IGFydGlmYWN0czwvcmVzdWx0Pg0KLTxleGFtcGxlPjxiPjx1PkNvbXBvbmVudCBSZWZlcmVuY2VzIGluIFhNTCBTY2hlbWE8L3U+PC9iPjxzaW1wbGV0YWJsZT4NCi08c3RoZWFkPg0KLTxzdGVudHJ5Pkdsb2JhbCBuYW1lZCBjb21wb25lbnRzPC9zdGVudHJ5Pg0KLTxzdGVudHJ5PlJlZmVyZW5jZTwvc3RlbnRyeT4NCi08L3N0aGVhZD4NCi08c3Ryb3c+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7ZWxlbWVudCBuYW1lPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7ZWxlbWVudCByZWY9ImZvbyI+PC9saT4NCi08bGk+Jmx0O2VsZW1lbnQgc3Vic3RpdHV0aW9uR3JvdXA9ImZvbyI8L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPHN0cm93Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O3NpbXBsZS9jb21wbGV4VHlwZSBuYW1lPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7ZWxlbWVudCB0eXBlPSJmb28iPjwvbGk+DQotPGxpPiZsdDthdHRyaWJ1dGUgdHlwZT0iZm9vIj48L2xpPg0KLTxsaT4mbHQ7cmVzdHJpY3Rpb24gYmFzZT0iZm9vIj48L2xpPg0KLTxsaT4mbHQ7c3Vic3RpdHV0aW9uIGJhc2U9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDthdHRyaWJ1dGUgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2F0dHJpYnV0ZSByZWY9ImZvbyI+PC9saT4NCi08L3VsPjwvc3RlbnRyeT4NCi08L3N0cm93Pg0KLTxzdHJvdz4NCi08c3RlbnRyeT48dWw+DQotPGxpPiZsdDthdHRyaWJ1dGVHcm91cCBuYW1lPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7YXR0cmlidXRlR3JvdXAgcmVmPSJmb28iPjwvbGk+DQotPC91bD48L3N0ZW50cnk+DQotPC9zdHJvdz4NCi08c3Ryb3c+DQotPHN0ZW50cnk+PHVsPg0KLTxsaT4mbHQ7Z3JvdXAgbmFtZT0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTxzdGVudHJ5Pjx1bD4NCi08bGk+Jmx0O2dyb3VwIHJlZj0iZm9vIj48L2xpPg0KLTwvdWw+PC9zdGVudHJ5Pg0KLTwvc3Ryb3c+DQotPC9zaW1wbGV0YWJsZT48L2V4YW1wbGU+DQotPHBvc3RyZXE+PC9wb3N0cmVxPg0KLTwvdGFza2JvZHk+DQotPC90YXNrPg0KLTw/UHViICowMDAwMDAzMTMxPz4NCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmh0bWwgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3RyZWZhY3RyWFNELmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlYjg4MWQuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90cmVmYWN0clhTRC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXRyYW5zaXRpb25hbC5kdGQiPgotPGh0bWwgbGFuZz0iZW4tdXMiIHhtbDpsYW5nPSJlbi11cyI+Ci08aGVhZD4KLTxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCIgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiAvPgotPG1ldGEgbmFtZT0iY29weXJpZ2h0IiBjb250ZW50PSJDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLiBDb250cmlidXRvcnM6IElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbiIgLz4KLTxtZXRhIG5hbWU9IkRDLnJpZ2h0cy5vd25lciIgY29udGVudD0iKEMpIENvcHlyaWdodCAyMDAwLCAyMDA2IiAvPgotPG1ldGEgY29udGVudD0icHVibGljIiBuYW1lPSJzZWN1cml0eSIgLz4KLTxtZXRhIGNvbnRlbnQ9ImluZGV4LGZvbGxvdyIgbmFtZT0iUm9ib3RzIiAvPgotPG1ldGEgaHR0cC1lcXVpdj0iUElDUy1MYWJlbCIgY29udGVudD0nKFBJQ1MtMS4xICJodHRwOi8vd3d3LmljcmEub3JnL3JhdGluZ3N2MDIuaHRtbCIgbCBnZW4gdHJ1ZSByIChjeiAxIGx6IDEgbnogMSBveiAxIHZ6IDEpICJodHRwOi8vd3d3LnJzYWMub3JnL3JhdGluZ3N2MDEuaHRtbCIgbCBnZW4gdHJ1ZSByIChuIDAgcyAwIHYgMCBsIDApICJodHRwOi8vd3d3LmNsYXNzaWZ5Lm9yZy9zYWZlc3VyZi8iIGwgZ2VuIHRydWUgciAoU1N+fjAwMCAxKSknIC8+Ci08bWV0YSBjb250ZW50PSJ0YXNrIiBuYW1lPSJEQy5UeXBlIiAvPgotPG1ldGEgbmFtZT0iREMuVGl0bGUiIGNvbnRlbnQ9IlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXMiIC8+Ci08bWV0YSBuYW1lPSJhYnN0cmFjdCIgY29udGVudD0iV2l0aGluIGFuIFhNTCBTY2hlbWEgZmlsZSwgcmVmYWN0b3JpbmcgYWxsb3dzIGF1dGhvcnMgdG8gbWFrZSBhIHNpbmdsZSBhcnRpZmFjdCBjaGFuZ2UsIGFuZCBoYXZlIHRoYXQgY2hhbmdlIGltcGxlbWVudGVkIHRocm91Z2hvdXQgYWxsIG90aGVyIGRlcGVuZGFudCBhcnRpZmFjdHMuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IldpdGhpbiBhbiBYTUwgU2NoZW1hIGZpbGUsIHJlZmFjdG9yaW5nIGFsbG93cyBhdXRob3JzIHRvIG1ha2UgYSBzaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlciBkZXBlbmRhbnQgYXJ0aWZhY3RzLiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIFhNTCBzY2hlbWEgZWRpdG9yLCByZWZhY3RvcmluZywgcmVuYW1pbmcsIGVkaXRpbmcgWE1MIHNjaGVtYXMsIGRlcGVuZGFudCBhcnRpZmFjdHMiIG5hbWU9IkRDLnN1YmplY3QiIC8+Ci08bWV0YSBjb250ZW50PSJYTUwgc2NoZW1hIGZpbGVzLCBYTUwgc2NoZW1hIGVkaXRvciwgcmVmYWN0b3JpbmcsIHJlbmFtaW5nLCBlZGl0aW5nIFhNTCBzY2hlbWFzLCBkZXBlbmRhbnQgYXJ0aWZhY3RzIiBuYW1lPSJrZXl3b3JkcyIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJyZWZhY3RvcmluZyIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlJlZmFjdG9yaW5nIGluIFhNTCBTY2hlbWEgRmlsZXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InJlZmFjdG9yaW5nIj48YSBuYW1lPSJyZWZhY3RvcmluZyI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+UmVmYWN0b3JpbmcgaW4gWE1MIFNjaGVtYSBGaWxlczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+V2l0aGluIGFuIFhNTCBTY2hlbWEgZmlsZSwgcmVmYWN0b3JpbmcgYWxsb3dzIGF1dGhvcnMgdG8gbWFrZSBhCi1zaW5nbGUgYXJ0aWZhY3QgY2hhbmdlLCBhbmQgaGF2ZSB0aGF0IGNoYW5nZSBpbXBsZW1lbnRlZCB0aHJvdWdob3V0IGFsbCBvdGhlcgotZGVwZW5kYW50IGFydGlmYWN0cy48L3A+Ci0KLTxkaXYgY2xhc3M9InAiIC8+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlJlZmFjdG9yaW5nIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIHRoZSB0ZWRpb3VzIGVkaXRpbmcgbmVjZXNzYXJ5Ci10byByZWNvdmVyIGJyb2tlbiBkZXBlbmRlbmNpZXMgY2F1c2VkIGJ5IGFydGlmYWN0IGNoYW5nZXMgd2hpY2ggY2F1c2UgcmlwcGxlCi1lZmZlY3RzIG9uIG90aGVyIGRlcGVuZGFudCBhcnRpZmFjdHMgKHN1Y2ggYXMgcmVuYW1pbmcgYW4gWE1MIFNjaGVtYSBlbGVtZW50KS48L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5DcmVhdGUgYSBuZXcgWE1MIHNjaGVtYSBvciBkb3VibGUtY2xpY2sgYW4gZXhpc3Rpbmcgc2NoZW1hIGluIHRoZQotTmF2aWdhdG9yIHZpZXcuPC9zcGFuPiAgSXQgd2lsbCBhdXRvbWF0aWNhbGx5IG9wZW4gaW4gdGhlIFhNTCBzY2hlbWEgZWRpdG9yLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5UbyByZWZhY3RvciBhbiBhcnRpZmFjdCwgcG9zaXRpb24gY3Vyc29yIHdpdGhpbiB0aGUgYXJ0aWZhY3QsIHJpZ2h0LWNsaWNrCi10aGUgYXJ0aWZhY3QsIGNsaWNrIDxzcGFuIGNsYXNzPSJtZW51Y2FzY2FkZSI+PHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVmYWN0b3I8L3NwYW4+ICZndDsgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+UmVuYW1lPC9zcGFuPgotPC9zcGFuPjwvc3Bhbj4gQSBwb3B1cCBkaWFsb2cgd2lsbCByZXF1ZXN0IHRoZSBlbnRyeSBvZiBhIG5ldyBuYW1lCi1mb3IgdGhhdCBhcnRpZmFjdAotPG9sIHR5cGU9ImEiPgotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5UeXBlIGluIHRoZSBuZXcgbmFtZSBvZiB0aGUgYXJ0aWZhY3QuPC9zcGFuPjwvbGk+Ci0KLTxsaSBjbGFzcz0ic3Vic3RlcGV4cGFuZCI+PHNwYW4+KE9wdGlvbmFsKSBDbGljayA8c3Ryb25nPlByZXZpZXc8L3N0cm9uZz4uPC9zcGFuPiBBIHdpbmRvdwotd2lsbCBvcGVuIGluZGljYXRpbmcgYWxsIG9mIHRoZSBjaGFuZ2VzIHdoaWNoIHdpbGwgdGFrZSBwbGFjZSBkdWUgdG8gdGhlIHJlZmFjdG9yaW5nLgotPC9saT4KLQotPGxpIGNsYXNzPSJzdWJzdGVwZXhwYW5kIj48c3Bhbj5DbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5PSy48L3NwYW4+PC9zcGFuPjwvbGk+Ci0KLTwvb2w+Ci0KLTwvbGk+Ci0KLTwvb2w+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iPlRoZSBuZXcgbmFtZSB3aWxsIGJlIGVudGVyZWQgaW4gdGhlIG9wZW5lZCBYU0Qgc291cmNlLCBhcyB3ZWxsIGFzCi1pbiBhbGwgZGVwZW5kYW50IGFydGlmYWN0czwvZGl2PgotCi08ZGl2IGNsYXNzPSJleGFtcGxlIj48c3Ryb25nPjx1PkNvbXBvbmVudCBSZWZlcmVuY2VzIGluIFhNTCBTY2hlbWE8L3U+PC9zdHJvbmc+PHRhYmxlIHN1bW1hcnk9IiIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0IiBib3JkZXI9IjEiIGNsYXNzPSJzaW1wbGV0YWJsZWJvcmRlciI+Ci08dHI+Ci08dGggdmFsaWduPSJib3R0b20iIGFsaWduPSJsZWZ0IiBpZD0iTjEwMEVCIj5HbG9iYWwgbmFtZWQgY29tcG9uZW50czwvdGg+Ci0KLTx0aCB2YWxpZ249ImJvdHRvbSIgYWxpZ249ImxlZnQiIGlkPSJOMTAwRjEiPlJlZmVyZW5jZTwvdGg+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVCIj48dWw+Ci08bGk+Jmx0O2VsZW1lbnQgbmFtZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRjEiPjx1bD4KLTxsaT4mbHQ7ZWxlbWVudCByZWY9ImZvbyImZ3Q7PC9saT4KLQotPGxpPiZsdDtlbGVtZW50IHN1YnN0aXR1dGlvbkdyb3VwPSJmb28iPC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVCIj48dWw+Ci08bGk+Jmx0O3NpbXBsZS9jb21wbGV4VHlwZSBuYW1lPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08dGQgdmFsaWduPSJ0b3AiIGhlYWRlcnM9Ik4xMDBGMSI+PHVsPgotPGxpPiZsdDtlbGVtZW50IHR5cGU9ImZvbyImZ3Q7PC9saT4KLQotPGxpPiZsdDthdHRyaWJ1dGUgdHlwZT0iZm9vIiZndDs8L2xpPgotCi08bGk+Jmx0O3Jlc3RyaWN0aW9uIGJhc2U9ImZvbyImZ3Q7PC9saT4KLQotPGxpPiZsdDtzdWJzdGl0dXRpb24gYmFzZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRUIiPjx1bD4KLTxsaT4mbHQ7YXR0cmlidXRlIG5hbWU9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEYxIj48dWw+Ci08bGk+Jmx0O2F0dHJpYnV0ZSByZWY9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTwvdHI+Ci0KLTx0cj4KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEVCIj48dWw+Ci08bGk+Jmx0O2F0dHJpYnV0ZUdyb3VwIG5hbWU9ImZvbyImZ3Q7PC9saT4KLQotPC91bD4KLTwvdGQ+Ci0KLTx0ZCB2YWxpZ249InRvcCIgaGVhZGVycz0iTjEwMEYxIj48dWw+Ci08bGk+Jmx0O2F0dHJpYnV0ZUdyb3VwIHJlZj0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPC90cj4KLQotPHRyPgotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRUIiPjx1bD4KLTxsaT4mbHQ7Z3JvdXAgbmFtZT0iZm9vIiZndDs8L2xpPgotCi08L3VsPgotPC90ZD4KLQotPHRkIHZhbGlnbj0idG9wIiBoZWFkZXJzPSJOMTAwRjEiPjx1bD4KLTxsaT4mbHQ7Z3JvdXAgcmVmPSJmb28iJmd0OzwvbGk+Ci0KLTwvdWw+Ci08L3RkPgotCi08L3RyPgotCi08L3RhYmxlPgotPC9kaXY+Ci0KLTxkaXYgY2xhc3M9InNlY3Rpb24iIC8+Ci0KLTwvZGl2PgotCi08ZGl2IC8+Ci0KLTwvYm9keT4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmRpdGEgYi9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmRpdGEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkY2ZmYjAuLjAwMDAwMDAKLS0tIGEvZG9jcy9vcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyL3RvcGljcy90dmR0c2NobS5kaXRhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCi08IS0tQXJib3J0ZXh0LCBJbmMuLCAxOTg4LTIwMDUsIHYuNDAwMi0tPg0KLTwhRE9DVFlQRSB0YXNrIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBESVRBIFRhc2svL0VOIg0KLSAidGFzay5kdGQiPg0KLTx0YXNrIGlkPSJ0dmR0c2NobSIgeG1sOmxhbmc9ImVuLXVzIj4NCi08dGl0bGU+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvdGl0bGU+DQotPHRpdGxlYWx0cz4NCi08c2VhcmNodGl0bGU+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvc2VhcmNodGl0bGU+DQotPC90aXRsZWFsdHM+DQotPHNob3J0ZGVzYz5WYWxpZGF0aW5nIGFuIFhNTCBzY2hlbWEgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IHN0YXRlIG9mDQotdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4NCi10aGUgUHJvYmxlbXMgdmlldy48L3Nob3J0ZGVzYz4NCi08cHJvbG9nPjxtZXRhZGF0YT4NCi08a2V5d29yZHM+PGluZGV4dGVybT5YTUwgc2NoZW1hIGZpbGVzPGluZGV4dGVybT52YWxpZGF0aW5nPC9pbmRleHRlcm0+PC9pbmRleHRlcm0+DQotPC9rZXl3b3Jkcz4NCi08L21ldGFkYXRhPjwvcHJvbG9nPg0KLTx0YXNrYm9keT4NCi08Y29udGV4dD48cD5UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3ZXJlIHdyaXR0ZW4gZm9yIHRoZSBSZXNvdXJjZSBwZXJzcGVjdGl2ZSwNCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+PHA+VG8gdmFsaWRhdGUgYW4gWE1MDQotc2NoZW1hOjwvcD48L2NvbnRleHQ+DQotPHN0ZXBzPg0KLTxzdGVwPjxjbWQ+UmlnaHQtY2xpY2sgeW91ciBmaWxlIGluIHRoZSBOYXZpZ2F0b3IgdmlldyBhbmQgY2xpY2sgPHVpY29udHJvbD5SdW4NCi1WYWxpZGF0aW9uPC91aWNvbnRyb2w+LjwvY21kPjwvc3RlcD4NCi08c3RlcD48Y21kPiBJZiB2YWxpZGF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwgeW91IGNhbiByZWZlciB0byB0aGUgUHJvYmxlbXMNCi12aWV3IHRvIHNlZSB3aGF0IHByb2JsZW1zIHdlcmUgbG9nZ2VkLiA8L2NtZD48aW5mbz4gPG5vdGU+SWYgeW91IHJlY2VpdmUgYW4NCi1lcnJvciBtZXNzYWdlIGluZGljYXRpbmcgdGhhdCB0aGUgUHJvYmxlbXMgdmlldyBpcyBmdWxsLCB5b3UgY2FuIGluY3JlYXNlDQotdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkIGJ5IHNlbGVjdGluZyAgPG1lbnVjYXNjYWRlPjx1aWNvbnRyb2w+UHJvcGVydGllcw0KLT4gVmFsaWRhdGlvbjwvdWljb250cm9sPjwvbWVudWNhc2NhZGU+IDw/UHViIENhcmV0Pz5hbmQgc3BlY2lmeWluZyB0aGUgbWF4aW11bQ0KLW51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkLjwvbm90ZT48L2luZm8+PC9zdGVwPg0KLTwvc3RlcHM+DQotPHJlc3VsdD48cD5UaGUgWE1MIHNjaGVtYSBzdXBwb3J0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciBpcyBiYXNlZCBvbiB0aGUNCi1XM0MgWE1MIFNjaGVtYSBSZWNvbW1lbmRhdGlvbiBTcGVjaWZpY2F0aW9uLiBUaGUgWE1MIFNjaGVtYSBzcGVjaWZpY2F0aW9ucw0KLVhNTCBTY2hlbWEgUGFydCAxOiBTdHJ1Y3R1cmVzIGFuZCBYTUwgU2NoZW1hIFBhcnQgMjogRGF0YXR5cGVzIGZyb20gdGhlIFczQw0KLVdlYiBzaXRlIGFyZSB1c2VkIGZvciB2YWxpZGF0aW9uLjwvcD48cD5DZXJ0YWluIGVycm9yIG1lc3NhZ2VzIGNvbnRhaW4gYSByZWZlcmVuY2UNCi10byB0aGUgc2NoZW1hIGNvbnN0cmFpbnRzIGxpc3RlZCBpbiBBcHBlbmRpeCBDIG9mIHRoZSBYTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlcw0KLWRvY3VtZW50LiBFYWNoIGNvbnN0cmFpbnQgaGFzIGEgdW5pcXVlIG5hbWUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgaW4gdGhlDQotZXJyb3IgbWVzc2FnZS4gRm9yIGV4YW1wbGUsIGlmIHlvdSByZWNlaXZlIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCB0aGlzIHRleHQ6DQotIDxzeXN0ZW1vdXRwdXQ+Y3QtcHJvcHMtY29ycmVjdDwvc3lzdGVtb3V0cHV0PiBhbmQgeW91IHNlYXJjaGVkIGluIHRoZSBTdHJ1Y3R1cmUNCi1kb2N1bWVudCBmb3IgdGhlIHRleHQsIHlvdSB3b3VsZCBmaW5kIHRoYXQgaXQgaXMgZm9yIHRoZSBzZWN0aW9uICJTY2hlbWEgQ29tcG9uZW50DQotQ29uc3RyYWludDogQ29tcGxleCBUeXBlIERlZmluaXRpb24gUHJvcGVydGllcyBDb3JyZWN0Ii4gPC9wPjxwPllvdSBjYW4gc2V0DQotdXAgYSBwcm9qZWN0J3MgcHJvcGVydGllcyBzbyB0aGF0IGRpZmZlcmVudCB0eXBlcyBvZiBwcm9qZWN0IHJlc291cmNlcyBhcmUNCi1hdXRvbWF0aWNhbGx5IHZhbGlkYXRlZCB3aGVuIHlvdSBzYXZlIHRoZW0uIEZyb20gYSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUgc2VsZWN0IDx1aWNvbnRyb2w+UHJvcGVydGllczwvdWljb250cm9sPiwNCi10aGVuIHNlbGVjdCA8dWljb250cm9sPlZhbGlkYXRpb248L3VpY29udHJvbD4uIEFueSB2YWxpZGF0b3JzIHlvdSBjYW4gcnVuDQotYWdhaW5zdCB5b3VyIHByb2plY3Qgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIFZhbGlkYXRpb24gcGFnZS48L3A+PC9yZXN1bHQ+DQotPC90YXNrYm9keT4NCi08cmVsYXRlZC1saW5rcz4NCi08bGluayBocmVmPSIuLi8uLi9vcmcuZWNsaXBzZS5qc3QuajJlZS5kb2MudXNlci90b3BpY3MvdGp2YWwuZGl0YSIgc2NvcGU9InBlZXIiPg0KLTxkZXNjPkdlbmVyYWwgdmFsaWRhdGlvbiBpbmZvcm1hdGlvbjwvZGVzYz4NCi08L2xpbms+DQotPGxpbmsgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sc2NoZW1hLTEiIHNjb3BlPSJleHRlcm5hbCI+PGxpbmt0ZXh0PlhNTA0KLVNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L2xpbmt0ZXh0Pg0KLTxkZXNjPlNlZSB0aGUgVzNDIFdlYiBzaXRlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnM8L2Rlc2M+DQotPC9saW5rPg0KLTxsaW5rIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yIiBzY29wZT0iZXh0ZXJuYWwiPjxsaW5rdGV4dD5YTUwNCi1TY2hlbWEgUGFydCAyOiBEYXRhdHlwZXM8L2xpbmt0ZXh0Pg0KLTxkZXNjPlNlZSB0aGUgVzNDIFdlYiBzaXRlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnM8L2Rlc2M+DQotPC9saW5rPg0KLTwvcmVsYXRlZC1saW5rcz4NCi08L3Rhc2s+DQotPD9QdWIgKjAwMDAwMDMxMjQ/Pg0KZGlmZiAtLWdpdCBhL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uaHRtbCBiL2RvY3Mvb3JnLmVjbGlwc2Uud3N0LnhzZGVkaXRvci5kb2MudXNlci90b3BpY3MvdHZkdHNjaG0uaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY4NGFmNi4uMDAwMDAwMAotLS0gYS9kb2NzL29yZy5lY2xpcHNlLndzdC54c2RlZGl0b3IuZG9jLnVzZXIvdG9waWNzL3R2ZHRzY2htLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PjwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4KLTxodG1sIGxhbmc9ImVuLXVzIiB4bWw6bGFuZz0iZW4tdXMiPgotPGhlYWQ+Ci08bWV0YSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KLTxtZXRhIG5hbWU9ImNvcHlyaWdodCIgY29udGVudD0iQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC4gQ29udHJpYnV0b3JzOiBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24iIC8+Ci08bWV0YSBuYW1lPSJEQy5yaWdodHMub3duZXIiIGNvbnRlbnQ9IihDKSBDb3B5cmlnaHQgMjAwMCwgMjAwNiIgLz4KLTxtZXRhIGNvbnRlbnQ9InB1YmxpYyIgbmFtZT0ic2VjdXJpdHkiIC8+Ci08bWV0YSBjb250ZW50PSJpbmRleCxmb2xsb3ciIG5hbWU9IlJvYm90cyIgLz4KLTxtZXRhIGh0dHAtZXF1aXY9IlBJQ1MtTGFiZWwiIGNvbnRlbnQ9JyhQSUNTLTEuMSAiaHR0cDovL3d3dy5pY3JhLm9yZy9yYXRpbmdzdjAyLmh0bWwiIGwgZ2VuIHRydWUgciAoY3ogMSBseiAxIG56IDEgb3ogMSB2eiAxKSAiaHR0cDovL3d3dy5yc2FjLm9yZy9yYXRpbmdzdjAxLmh0bWwiIGwgZ2VuIHRydWUgciAobiAwIHMgMCB2IDAgbCAwKSAiaHR0cDovL3d3dy5jbGFzc2lmeS5vcmcvc2FmZXN1cmYvIiBsIGdlbiB0cnVlIHIgKFNTfn4wMDAgMSkpJyAvPgotPG1ldGEgY29udGVudD0idGFzayIgbmFtZT0iREMuVHlwZSIgLz4KLTxtZXRhIG5hbWU9IkRDLlRpdGxlIiBjb250ZW50PSJWYWxpZGF0aW5nIFhNTCBzY2hlbWFzIiAvPgotPG1ldGEgbmFtZT0iYWJzdHJhY3QiIGNvbnRlbnQ9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIiAvPgotPG1ldGEgbmFtZT0iZGVzY3JpcHRpb24iIGNvbnRlbnQ9IlZhbGlkYXRpbmcgYW4gWE1MIHNjaGVtYSBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4gdGhlIFByb2JsZW1zIHZpZXcuIiAvPgotPG1ldGEgY29udGVudD0iWE1MIHNjaGVtYSBmaWxlcywgdmFsaWRhdGluZyIgbmFtZT0iREMuc3ViamVjdCIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhNTCBzY2hlbWEgZmlsZXMsIHZhbGlkYXRpbmciIG5hbWU9ImtleXdvcmRzIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSIuLi90b3BpY3MvdGN4bWxzY2guaHRtbCIgLz4KLTxtZXRhIHNjaGVtZT0iVVJJIiBuYW1lPSJEQy5SZWxhdGlvbiIgY29udGVudD0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIC8+Ci08bWV0YSBzY2hlbWU9IlVSSSIgbmFtZT0iREMuUmVsYXRpb24iIGNvbnRlbnQ9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0xIiAvPgotPG1ldGEgc2NoZW1lPSJVUkkiIG5hbWU9IkRDLlJlbGF0aW9uIiBjb250ZW50PSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMiIgLz4KLTxtZXRhIGNvbnRlbnQ9IlhIVE1MIiBuYW1lPSJEQy5Gb3JtYXQiIC8+Ci08bWV0YSBjb250ZW50PSJ0dmR0c2NobSIgbmFtZT0iREMuSWRlbnRpZmllciIgLz4KLTxtZXRhIGNvbnRlbnQ9ImVuLXVzIiBuYW1lPSJEQy5MYW5ndWFnZSIgLz4KLTxsaW5rIGhyZWY9Ii4uLy4uL29yZy5lY2xpcHNlLndzdC5kb2MudXNlci9jb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiAvPgotPHRpdGxlPlZhbGlkYXRpbmcgWE1MIHNjaGVtYXM8L3RpdGxlPgotPC9oZWFkPgotPGJvZHkgaWQ9InR2ZHRzY2htIj48YSBuYW1lPSJ0dmR0c2NobSI+PCEtLSAtLT48L2E+Ci0KLQotPGgxIGNsYXNzPSJ0b3BpY3RpdGxlMSI+VmFsaWRhdGluZyBYTUwgc2NoZW1hczwvaDE+Ci0KLQotCi0KLTxkaXY+PHA+VmFsaWRhdGluZyBhbiBYTUwgc2NoZW1hIGRldGVybWluZXMgd2hldGhlciB0aGUgY3VycmVudCBzdGF0ZSBvZgotdGhlIFhNTCBzY2hlbWEgZmlsZSBpcyBzZW1hbnRpY2FsbHkgdmFsaWQuIEFueSBlcnJvcnMgd2lsbCBiZSBkaXNwbGF5ZWQgaW4KLXRoZSBQcm9ibGVtcyB2aWV3LjwvcD4KLQotPGRpdiBjbGFzcz0ic2VjdGlvbiI+PHA+VGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2VyZSB3cml0dGVuIGZvciB0aGUgUmVzb3VyY2UgcGVyc3BlY3RpdmUsCi1idXQgdGhleSB3aWxsIGFsc28gd29yayBpbiBtYW55IG90aGVyIHBlcnNwZWN0aXZlcy48L3A+Ci08cD5UbyB2YWxpZGF0ZSBhbiBYTUwKLXNjaGVtYTo8L3A+Ci08L2Rpdj4KLQotPG9sPgotPGxpIGNsYXNzPSJzdGVwZXhwYW5kIj48c3Bhbj5SaWdodC1jbGljayB5b3VyIGZpbGUgaW4gdGhlIE5hdmlnYXRvciB2aWV3IGFuZCBjbGljayA8c3BhbiBjbGFzcz0idWljb250cm9sIj5SdW4KLVZhbGlkYXRpb248L3NwYW4+Ljwvc3Bhbj48L2xpPgotCi08bGkgY2xhc3M9InN0ZXBleHBhbmQiPjxzcGFuPiBJZiB2YWxpZGF0aW9uIHdhcyBub3Qgc3VjY2Vzc2Z1bCwgeW91IGNhbiByZWZlciB0byB0aGUgUHJvYmxlbXMKLXZpZXcgdG8gc2VlIHdoYXQgcHJvYmxlbXMgd2VyZSBsb2dnZWQuIDwvc3Bhbj4gIDxkaXYgY2xhc3M9Im5vdGUiPjxzcGFuIGNsYXNzPSJub3RldGl0bGUiPk5vdGU6PC9zcGFuPiBJZiB5b3UgcmVjZWl2ZSBhbgotZXJyb3IgbWVzc2FnZSBpbmRpY2F0aW5nIHRoYXQgdGhlIFByb2JsZW1zIHZpZXcgaXMgZnVsbCwgeW91IGNhbiBpbmNyZWFzZQotdGhlIG51bWJlciBvZiBlcnJvciBtZXNzYWdlcyBhbGxvd2VkIGJ5IHNlbGVjdGluZyAgPHNwYW4gY2xhc3M9Im1lbnVjYXNjYWRlIj48c3BhbiBjbGFzcz0idWljb250cm9sIj5Qcm9wZXJ0aWVzCi0mZ3Q7IFZhbGlkYXRpb248L3NwYW4+PC9zcGFuPiBhbmQgc3BlY2lmeWluZyB0aGUgbWF4aW11bQotbnVtYmVyIG9mIGVycm9yIG1lc3NhZ2VzIGFsbG93ZWQuPC9kaXY+Ci08L2xpPgotCi08L29sPgotCi08ZGl2IGNsYXNzPSJzZWN0aW9uIj48cD5UaGUgWE1MIHNjaGVtYSBzdXBwb3J0IGluIHRoZSBYTUwgc2NoZW1hIGVkaXRvciBpcyBiYXNlZCBvbiB0aGUKLVczQyBYTUwgU2NoZW1hIFJlY29tbWVuZGF0aW9uIFNwZWNpZmljYXRpb24uIFRoZSBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zCi1YTUwgU2NoZW1hIFBhcnQgMTogU3RydWN0dXJlcyBhbmQgWE1MIFNjaGVtYSBQYXJ0IDI6IERhdGF0eXBlcyBmcm9tIHRoZSBXM0MKLVdlYiBzaXRlIGFyZSB1c2VkIGZvciB2YWxpZGF0aW9uLjwvcD4KLTxwPkNlcnRhaW4gZXJyb3IgbWVzc2FnZXMgY29udGFpbiBhIHJlZmVyZW5jZQotdG8gdGhlIHNjaGVtYSBjb25zdHJhaW50cyBsaXN0ZWQgaW4gQXBwZW5kaXggQyBvZiB0aGUgWE1MIFNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXMKLWRvY3VtZW50LiBFYWNoIGNvbnN0cmFpbnQgaGFzIGEgdW5pcXVlIG5hbWUgdGhhdCB3aWxsIGJlIHJlZmVyZW5jZWQgaW4gdGhlCi1lcnJvciBtZXNzYWdlLiBGb3IgZXhhbXBsZSwgaWYgeW91IHJlY2VpdmUgYW4gZXJyb3IgbWVzc2FnZSB3aXRoIHRoaXMgdGV4dDoKLSA8dHQgY2xhc3M9InN5c291dCI+Y3QtcHJvcHMtY29ycmVjdDwvdHQ+IGFuZCB5b3Ugc2VhcmNoZWQgaW4gdGhlIFN0cnVjdHVyZQotZG9jdW1lbnQgZm9yIHRoZSB0ZXh0LCB5b3Ugd291bGQgZmluZCB0aGF0IGl0IGlzIGZvciB0aGUgc2VjdGlvbiAiU2NoZW1hIENvbXBvbmVudAotQ29uc3RyYWludDogQ29tcGxleCBUeXBlIERlZmluaXRpb24gUHJvcGVydGllcyBDb3JyZWN0Ii4gPC9wPgotPHA+WW91IGNhbiBzZXQKLXVwIGEgcHJvamVjdCdzIHByb3BlcnRpZXMgc28gdGhhdCBkaWZmZXJlbnQgdHlwZXMgb2YgcHJvamVjdCByZXNvdXJjZXMgYXJlCi1hdXRvbWF0aWNhbGx5IHZhbGlkYXRlZCB3aGVuIHlvdSBzYXZlIHRoZW0uIEZyb20gYSBwcm9qZWN0J3MgcG9wLXVwIG1lbnUgc2VsZWN0IDxzcGFuIGNsYXNzPSJ1aWNvbnRyb2wiPlByb3BlcnRpZXM8L3NwYW4+LAotdGhlbiBzZWxlY3QgPHNwYW4gY2xhc3M9InVpY29udHJvbCI+VmFsaWRhdGlvbjwvc3Bhbj4uIEFueSB2YWxpZGF0b3JzIHlvdSBjYW4gcnVuCi1hZ2FpbnN0IHlvdXIgcHJvamVjdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgVmFsaWRhdGlvbiBwYWdlLjwvcD4KLTwvZGl2PgotCi08L2Rpdj4KLQotPGRpdj48ZGl2IGNsYXNzPSJyZWx0YXNrcyI+PHN0cm9uZz5SZWxhdGVkIHRhc2tzPC9zdHJvbmc+PGJyIC8+Ci08ZGl2PjxhIGhyZWY9Ii4uL3RvcGljcy90Y3htbHNjaC5odG1sIiB0aXRsZT0iWW91IGNhbiBjcmVhdGUgYW4gWE1MIHNjaGVtYSBhbmQgdGhlbiBlZGl0IGl0IHVzaW5nIHRoZSBYTUwgc2NoZW1hIGVkaXRvci4gVXNpbmcgdGhlIFhNTCBzY2hlbWEgZWRpdG9yLCB5b3UgY2FuIHNwZWNpZnkgZWxlbWVudCBuYW1lcyB0aGF0IGluZGljYXRlcyB3aGljaCBlbGVtZW50cyBhcmUgYWxsb3dlZCBpbiBhbiBYTUwgZmlsZSwgYW5kIGluIHdoaWNoIGNvbWJpbmF0aW9ucy4iPkNyZWF0aW5nIFhNTCBzY2hlbWFzPC9hPjwvZGl2PgotPC9kaXY+Ci08ZGl2IGNsYXNzPSJyZWxpbmZvIj48c3Ryb25nPlJlbGF0ZWQgaW5mb3JtYXRpb248L3N0cm9uZz48YnIgLz4KLTxkaXY+PGEgaHJlZj0iLi4vLi4vb3JnLmVjbGlwc2UuanN0LmoyZWUuZG9jLnVzZXIvdG9waWNzL3RqdmFsLmh0bWwiIHRpdGxlPSJHZW5lcmFsIHZhbGlkYXRpb24gaW5mb3JtYXRpb24iPi4uLy4uL29yZy5lY2xpcHNlLmpzdC5qMmVlLmRvYy51c2VyL3RvcGljcy90anZhbC5odG1sPC9hPjwvZGl2PgotPGRpdj48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxzY2hlbWEtMSIgdGFyZ2V0PSJfYmxhbmsiIHRpdGxlPSJTZWUgdGhlIFczQyBXZWIgc2l0ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBYTUwgU2NoZW1hIHNwZWNpZmljYXRpb25zIj5YTUwKLVNjaGVtYSBQYXJ0IDE6IFN0cnVjdHVyZXM8L2E+PC9kaXY+Ci08ZGl2PjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbHNjaGVtYS0yIiB0YXJnZXQ9Il9ibGFuayIgdGl0bGU9IlNlZSB0aGUgVzNDIFdlYiBzaXRlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIFhNTCBTY2hlbWEgc3BlY2lmaWNhdGlvbnMiPlhNTAotU2NoZW1hIFBhcnQgMjogRGF0YXR5cGVzPC9hPjwvZGl2PgotPC9kaXY+Ci08L2Rpdj4KLQotPC9ib2R5PgotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTliMDY1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTBjZTFmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDUyMDAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBDb3JlCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V2ViIHRvb2xzIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNmMWRlNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxyZXF1aXJlcz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UucGxhdGZvcm0iIHZlcnNpb249IjMuMiIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UuZW1mIiB2ZXJzaW9uPSIyLjIiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmplbSIgdmVyc2lvbj0iMS4yIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3Quc2VydmVyX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3QuY29tbW9uX2NvcmUuZmVhdHVyZSIgdmVyc2lvbj0iMS4wLjAiIG1hdGNoPSJncmVhdGVyT3JFcXVhbCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MuY29yZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLmNvcmUiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuamF2YXNjcmlwdC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYiIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5odG1sLnN0YW5kYXJkLmR0ZHMiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjQ5ZTlmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI0Zjc2Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBDb3JlIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciBXU1QgV2ViIGNvcmUuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmQyYzJmLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjYuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPHRpdGxlPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz0iRU4tVVMiIGxpbms9Ymx1ZSB2bGluaz1wdXJwbGU+Ci08aDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9oMj4KLTxwPk1hcmNoIDE3LCAyMDA1PC9wPgotCi08aDM+VXNhZ2UgT2YgQ29udGVudDwvaDM+Ci0KLTxwPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUwotICAgKENPTExFQ1RJVkVMWSAmcXVvdDtDT05URU5UJnF1b3Q7KS4gIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UKLSAgIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SCi0gICBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQKLSAgIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvcD4KLSAgIAotPGgzPkFwcGxpY2FibGUgTGljZW5zZXM8L2gzPiAgIAotICAgCi08cD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wCi0gICAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyBDb250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotICAgRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIGRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5ICgmcXVvdDtSZXBvc2l0b3J5JnF1b3Q7KSBpbiBDVlMKLSAgIG1vZHVsZXMgKCZxdW90O01vZHVsZXMmcXVvdDspIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCZxdW90O0Rvd25sb2FkcyZxdW90OykuPC9wPgotICAgCi08dWw+Ci0JPGxpPkNvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoJnF1b3Q7UGx1Zy1pbnMmcXVvdDspLCBwbHVnLWluIGZyYWdtZW50cyAoJnF1b3Q7RnJhZ21lbnRzJnF1b3Q7KSwgYW5kIGZlYXR1cmVzICgmcXVvdDtGZWF0dXJlcyZxdW90OykuPC9saT4KLQk8bGk+RWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhJnRyYWRlOyBBUmNoaXZlKSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtwbHVnaW5zJnF1b3Q7LjwvbGk+Ci0JPGxpPkEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7ZmVhdHVyZXMmcXVvdDsuICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zCi0gICAgICBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuPC9saT4KLQk8bGk+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoJnF1b3Q7SW5jbHVkZWQgRmVhdHVyZXMmcXVvdDspLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnhtbCZxdW90OyBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuPC9saT4KLTwvdWw+ICAgCi0gCi08cD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDthYm91dC5odG1sJnF1b3Q7ICgmcXVvdDtBYm91dHMmcXVvdDspLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZAotSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAmcXVvdDtsaWNlbnNlLmh0bWwmcXVvdDsgKCZxdW90O0ZlYXR1cmUgTGljZW5zZXMmcXVvdDspLiAgQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOjwvcD4KLQotPHVsPgotCTxsaT5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3Rvcnk8L2xpPgotCTxsaT5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllczwvbGk+Ci0JPGxpPkluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnM8L2xpPgotCTxsaT5TdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtzcmMmcXVvdDsgb2YgY2VydGFpbiBQbHVnLWluczwvbGk+Ci0JPGxpPkZlYXR1cmUgZGlyZWN0b3JpZXM8L2xpPgotPC91bD4KLQkJCi08cD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoJnF1b3Q7RmVhdHVyZSBVcGRhdGUgTGljZW5zZSZxdW90OykgZHVyaW5nIHRoZQotaW5zdGFsbGF0aW9uIHByb2Nlc3MuICBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yCi1pbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uICBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICZxdW90O2xpY2Vuc2UmcXVvdDsgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS5wcm9wZXJ0aWVzJnF1b3Q7IGZvdW5kIHdpdGhpbiBhIEZlYXR1cmUuCi1TdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcywgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4KLXRoYXQgZGlyZWN0b3J5LjwvcD4KLQotPHA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUywgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gIFNPTUUgT0YgVEhFU0UKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9wPgotCi08dWw+Ci0JPGxpPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvYT4pPC9saT4KLQk8bGk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvYT4pPC9saT4JCi0JPGxpPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvYT4pPC9saT4KLQk8bGk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9hPik8L2xpPgotPC91bD4KLQotPHA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiBUTyBVU0UgT0YgVEhFIENPTlRFTlQuICBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlLCBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIHByb3ZpZGVkLCBwbGVhc2UKLWNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9wPgotCi08aDM+Q3J5cHRvZ3JhcGh5PC9oMz4KLQotPHA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIGN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIHJlLWV4cG9ydCB0bwotICAgYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsCi0gICBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvcD4KLSAgIAotPHNtYWxsPkphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLjwvc21hbGw+ICAgCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4YWVhMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTx0aXRsZT5BYm91dDwvdGl0bGU+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9SVNPLTg4NTktMSI+Ci08L2hlYWQ+Ci08Ym9keSBsYW5nPSJFTi1VUyI+Ci08aDI+QWJvdXQgVGhpcyBDb250ZW50PC9oMj4KLQotPHA+RmVicnVhcnkgMjQsIDIwMDU8L3A+CQotPGgzPkxpY2Vuc2U8L2gzPgotCi08cD5UaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1ha2VzIGF2YWlsYWJsZSBhbGwgY29udGVudCBpbiB0aGlzIHBsdWctaW4gKCZxdW90O0NvbnRlbnQmcXVvdDspLiAgVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQgYmVsb3csIHRoZSBDb250ZW50IGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlCi1FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5JZiB5b3UgZGlkIG5vdCByZWNlaXZlIHRoaXMgQ29udGVudCBkaXJlY3RseSBmcm9tIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24sIHRoZSBDb250ZW50IGlzIGJlaW5nIHJlZGlzdHJpYnV0ZWQgYnkgYW5vdGhlciBwYXJ0eSAoJnF1b3Q7UmVkaXN0cmlidXRvciZxdW90OykgYW5kIGRpZmZlcmVudCB0ZXJtcyBhbmQgY29uZGl0aW9ucyBtYXkKLWFwcGx5IHRvIHlvdXIgdXNlIG9mIGFueSBvYmplY3QgY29kZSBpbiB0aGUgQ29udGVudC4gIENoZWNrIHRoZSBSZWRpc3RyaWJ1dG9yJ3MgbGljZW5zZSB0aGF0IHdhcyBwcm92aWRlZCB3aXRoIHRoZSBDb250ZW50LiAgSWYgbm8gc3VjaCBsaWNlbnNlIGV4aXN0cywgY29udGFjdCB0aGUgUmVkaXN0cmlidXRvci4gIFVubGVzcyBvdGhlcndpc2UKLWluZGljYXRlZCBiZWxvdywgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFUEwgc3RpbGwgYXBwbHkgdG8gYW55IHNvdXJjZSBjb2RlIGluIHRoZSBDb250ZW50LjwvcD4KLQotPGgzPlNvdXJjZSBDb2RlPC9oMz4KLTxwPlRoaXMgcGx1Zy1pbiBjb250YWlucyBzb3VyY2UgY29kZSB6aXAgZmlsZXMgKCZxdW90O1NvdXJjZSBaaXBzJnF1b3Q7KSB0aGF0IGNvcnJlc3BvbmQgdG8gYmluYXJ5IGNvbnRlbnQgaW4gb3RoZXIgcGx1Zy1pbnMuIFRoZXNlIFNvdXJjZSBaaXBzIG1heSBiZSBkaXN0cmlidXRlZCB1bmRlciBkaWZmZXJlbnQgbGljZW5zZQotYWdyZWVtZW50cyBhbmQvb3Igbm90aWNlcy4gRGV0YWlscyBhYm91dCB0aGVzZSBsaWNlbnNlIGFncmVlbWVudHMgYW5kIG5vdGljZXMgYXJlIGNvbnRhaW5lZCBpbiAmcXVvdDthYm91dC5odG1sJnF1b3Q7IGZpbGVzICgmcXVvdDtBYm91dHMmcXVvdDspIGxvY2F0ZWQgaW4gc3ViLWRpcmVjdG9yaWVzIGluIHRoZQotc3JjLyBkaXJlY3Rvcnkgb2YgdGhpcyBwbHVnLWluLiBTdWNoIEFib3V0cyBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIFNvdXJjZSBaaXBzIGluIHRoYXQgZGlyZWN0b3J5LCBub3QgdGhlIEVQTC48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0jIGFib3V0LmluaQotIyBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIGZlYXR1cmUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgIiVrZXkiIGFyZSBleHRlcm5hbGl6ZWQgc3RyaW5ncyBkZWZpbmVkIGluIGFib3V0LnByb3BlcnRpZXMKLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4KLQotIyBQcm9wZXJ0eSAiYWJvdXRUZXh0IiBjb250YWlucyBibHVyYiBmb3IgIkFib3V0IiBkaWFsb2cgKHRyYW5zbGF0ZWQpCi1hYm91dFRleHQ9JWJsdXJiCi0KLSMgUHJvcGVydHkgIndpbmRvd0ltYWdlIiBjb250YWlucyBwYXRoIHRvIHdpbmRvdyBpY29uICgxNngxNikKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiZmVhdHVyZUltYWdlIiBjb250YWlucyBwYXRoIHRvIGZlYXR1cmUgaW1hZ2UgKDMyeDMyKQotZmVhdHVyZUltYWdlPWVjbGlwc2UzMi5naWYKLQotIyBQcm9wZXJ0eSAiYWJvdXRJbWFnZSIgY29udGFpbnMgcGF0aCB0byBwcm9kdWN0IGltYWdlICg1MDB4MzMwIG9yIDExNXgxNjQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImFwcE5hbWUiIGNvbnRhaW5zIG5hbWUgb2YgdGhlIGFwcGxpY2F0aW9uIChub3QgdHJhbnNsYXRlZCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBhZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2VsY29tZSBwYWdlIChzcGVjaWFsIFhNTC1iYXNlZCBmb3JtYXQpCi0jIG9wdGlvbmFsCi0KLSMgUHJvcGVydHkgIndlbGNvbWVQZXJzcGVjdGl2ZSIgY29udGFpbnMgdGhlIGlkIG9mIHRoZSBwZXJzcGVjdGl2ZSBpbiB3aGljaCB0aGUKLSMgd2VsY29tZSBwYWdlIGlzIHRvIGJlIG9wZW5lZC4KLSMgb3B0aW9uYWwKLQotCi0KLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIyBhYm91dC5tYXBwaW5ncw0KLSMgY29udGFpbnMgZmlsbC1pbnMgZm9yIGFib3V0LnByb3BlcnRpZXMNCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpDQotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLg0KLQ0KLTA9QGJ1aWxkQA0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWYxZTZlLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBhYm91dC5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBhYm91dC5pbmkKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgZmlsbC1pbnMgYXJlIHN1cHBsaWVkIGJ5IGFib3V0Lm1hcHBpbmdzCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLSMKLSMgRG8gbm90IHRyYW5zbGF0ZSBhbnkgdmFsdWVzIHN1cnJvdW5kZWQgYnkge30KLQotYmx1cmI9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmVcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTViNDU3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGFib3V0Lmh0bWwsIGFib3V0LmluaSwgYWJvdXQubWFwcGluZ3MsIGFib3V0LnByb3BlcnRpZXMsIGVjbGlwc2UzMi5naWYsIHBsdWdpbi5wcm9wZXJ0aWVzLCBwbHVnaW4ueG1sLCBzcmMvKiosIE1FVEEtSU5GLwotc291cmNlUGx1Z2luID0gdHJ1ZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWQzOGQ2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLXBsdWdpbk5hbWU9V2ViIFN0YW5kYXJkIFRvb2xzIC0gV2ViIENvcmUgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFkMzAyZS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLWJ1aWxkLnhtbAotZmVhdHVyZXMKLXBsdWdpbnMKLW9yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmVfMS4wLjAuYmluLmRpc3QuemlwCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc5Zjg0Yi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzg2MDYxMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotICAgICAgICAgICAgICAgZXBsLXYxMC5odG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTE3NDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBQbHVnLWluIERldmVsb3BlciBSZXNvdXJjZXMKLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1Tb3VyY2UgY29kZSB6aXBzIGZvciB0aGUgV1NUIHdlYiB0b29scwotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDAsIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTdkODcwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfc2RrLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSJsaWNlbnNlLmh0bWwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl9zZGsuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzA2MC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8uY3ZzaWdub3JlIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1idWlsZC54bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YjQ3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvLnByb2plY3QKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3REZXNjcmlwdGlvbj4KLQk8bmFtZT5vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ3Njk0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc4OTI4Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBVSQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdlYiBVSSB0b29scy4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNWJhYjIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZSIgdmVyc2lvbj0iMS42LjAiLz4KLSAgIDwvcmVxdWlyZXM+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aS5pbmZvcG9wIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmphdmFzY3JpcHQudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWIudWkuaW5mb3BvcCIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5jc3MudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuaHRtbC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5qYXZhc2NyaXB0LnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYi51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ4YTYxOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotYmluLmluY2x1ZGVzID1cCi1lcGwtdjEwLmh0bWwsXAotZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi1mZWF0dXJlLnhtbCxcCi1mZWF0dXJlLnByb3BlcnRpZXMsXAotbGljZW5zZS5odG1sCi0KLWdlbmVyYXRlLmZlYXR1cmVAb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUuc291cmNlID0gb3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyMmFkMjkuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2JjMjNhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTMyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBVSSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFdlYiBVSS4KLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODYzOTIwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfY29yZS5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LndlYl9jb3JlLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08dGl0bGU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPSJFTi1VUyIgbGluaz1ibHVlIHZsaW5rPXB1cnBsZT4KLTxoMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L2gyPgotPHA+TWFyY2ggMTcsIDIwMDU8L3A+Ci0KLTxoMz5Vc2FnZSBPZiBDb250ZW50PC9oMz4KLQotPHA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTCi0gICAoQ09MTEVDVElWRUxZICZxdW90O0NPTlRFTlQmcXVvdDspLiAgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRQotICAgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IKLSAgIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuICBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORAotICAgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9wPgotICAgCi08aDM+QXBwbGljYWJsZSBMaWNlbnNlczwvaDM+ICAgCi0gICAKLTxwPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAKLSAgICgmcXVvdDtFUEwmcXVvdDspLiAgQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIENvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvYT4uCi0gICBGb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgJnF1b3Q7UHJvZ3JhbSZxdW90OyB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9wPgotCi08cD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgKCZxdW90O1JlcG9zaXRvcnkmcXVvdDspIGluIENWUwotICAgbW9kdWxlcyAoJnF1b3Q7TW9kdWxlcyZxdW90OykgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoJnF1b3Q7RG93bmxvYWRzJnF1b3Q7KS48L3A+Ci0gICAKLTx1bD4KLQk8bGk+Q29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZywgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiAgVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgmcXVvdDtQbHVnLWlucyZxdW90OyksIHBsdWctaW4gZnJhZ21lbnRzICgmcXVvdDtGcmFnbWVudHMmcXVvdDspLCBhbmQgZmVhdHVyZXMgKCZxdW90O0ZlYXR1cmVzJnF1b3Q7KS48L2xpPgotCTxsaT5FYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmEmdHJhZGU7IEFSY2hpdmUpIGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O3BsdWdpbnMmcXVvdDsuPC9saT4KLQk8bGk+QSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAmcXVvdDtmZWF0dXJlcyZxdW90Oy4gIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMKLSAgICAgIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS48L2xpPgotCTxsaT5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgmcXVvdDtJbmNsdWRlZCBGZWF0dXJlcyZxdW90OykuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUueG1sJnF1b3Q7IG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy48L2xpPgotPC91bD4gICAKLSAKLTxwPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgKCZxdW90O0Fib3V0cyZxdW90OykuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kCi1JbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICZxdW90O2xpY2Vuc2UuaHRtbCZxdW90OyAoJnF1b3Q7RmVhdHVyZSBMaWNlbnNlcyZxdW90OykuICBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZQotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6PC9wPgotCi08dWw+Ci0JPGxpPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeTwvbGk+Ci0JPGxpPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzPC9saT4KLQk8bGk+SW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSczwvbGk+Ci0JPGxpPlN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICZxdW90O3NyYyZxdW90OyBvZiBjZXJ0YWluIFBsdWctaW5zPC9saT4KLQk8bGk+RmVhdHVyZSBkaXJlY3RvcmllczwvbGk+Ci08L3VsPgotCQkKLTxwPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgmcXVvdDtGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlJnF1b3Q7KSBkdXJpbmcgdGhlCi1pbnN0YWxsYXRpb24gcHJvY2Vzcy4gIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IKLWluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgJnF1b3Q7bGljZW5zZSZxdW90OyBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAmcXVvdDtmZWF0dXJlLnByb3BlcnRpZXMmcXVvdDsgZm91bmQgd2l0aGluIGEgRmVhdHVyZS4KLVN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzLCBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbgotdGhhdCBkaXJlY3RvcnkuPC9wPgotCi08cD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTLCBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiAgU09NRSBPRiBUSEVTRQotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L3A+Ci0KLTx1bD4KLQk8bGk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9hPik8L2xpPgotCTxsaT5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9hPik8L2xpPgotCTxsaT5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9hPik8L2xpPgkKLQk8bGk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9hPik8L2xpPgotCTxsaT5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L2E+KTwvbGk+Ci08L3VsPgotCi08cD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIFRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2UsIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgcHJvdmlkZWQsIHBsZWFzZQotY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L3A+Ci0KLTxoMz5DcnlwdG9ncmFwaHk8L2gzPgotCi08cD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgcmUtZXhwb3J0IHRvCi0gICBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwKLSAgIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9wPgotICAgCi08c21hbGw+SmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguPC9zbWFsbD4gICAKLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGFlYTAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wLy9FTiI+Ci08aHRtbD4KLTxoZWFkPgotPHRpdGxlPkFib3V0PC90aXRsZT4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIj4KLTwvaGVhZD4KLTxib2R5IGxhbmc9IkVOLVVTIj4KLTxoMj5BYm91dCBUaGlzIENvbnRlbnQ8L2gyPgotCi08cD5GZWJydWFyeSAyNCwgMjAwNTwvcD4JCi08aDM+TGljZW5zZTwvaDM+Ci0KLTxwPlRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWFrZXMgYXZhaWxhYmxlIGFsbCBjb250ZW50IGluIHRoaXMgcGx1Zy1pbiAoJnF1b3Q7Q29udGVudCZxdW90OykuICBVbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCBiZWxvdywgdGhlIENvbnRlbnQgaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUKLUVjbGlwc2UgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPklmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBDb250ZW50IGRpcmVjdGx5IGZyb20gdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgdGhlIENvbnRlbnQgaXMgYmVpbmcgcmVkaXN0cmlidXRlZCBieSBhbm90aGVyIHBhcnR5ICgmcXVvdDtSZWRpc3RyaWJ1dG9yJnF1b3Q7KSBhbmQgZGlmZmVyZW50IHRlcm1zIGFuZCBjb25kaXRpb25zIG1heQotYXBwbHkgdG8geW91ciB1c2Ugb2YgYW55IG9iamVjdCBjb2RlIGluIHRoZSBDb250ZW50LiAgQ2hlY2sgdGhlIFJlZGlzdHJpYnV0b3IncyBsaWNlbnNlIHRoYXQgd2FzIHByb3ZpZGVkIHdpdGggdGhlIENvbnRlbnQuICBJZiBubyBzdWNoIGxpY2Vuc2UgZXhpc3RzLCBjb250YWN0IHRoZSBSZWRpc3RyaWJ1dG9yLiAgVW5sZXNzIG90aGVyd2lzZQotaW5kaWNhdGVkIGJlbG93LCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVQTCBzdGlsbCBhcHBseSB0byBhbnkgc291cmNlIGNvZGUgaW4gdGhlIENvbnRlbnQuPC9wPgotCi08aDM+U291cmNlIENvZGU8L2gzPgotPHA+VGhpcyBwbHVnLWluIGNvbnRhaW5zIHNvdXJjZSBjb2RlIHppcCBmaWxlcyAoJnF1b3Q7U291cmNlIFppcHMmcXVvdDspIHRoYXQgY29ycmVzcG9uZCB0byBiaW5hcnkgY29udGVudCBpbiBvdGhlciBwbHVnLWlucy4gVGhlc2UgU291cmNlIFppcHMgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIGRpZmZlcmVudCBsaWNlbnNlCi1hZ3JlZW1lbnRzIGFuZC9vciBub3RpY2VzLiBEZXRhaWxzIGFib3V0IHRoZXNlIGxpY2Vuc2UgYWdyZWVtZW50cyBhbmQgbm90aWNlcyBhcmUgY29udGFpbmVkIGluICZxdW90O2Fib3V0Lmh0bWwmcXVvdDsgZmlsZXMgKCZxdW90O0Fib3V0cyZxdW90OykgbG9jYXRlZCBpbiBzdWItZGlyZWN0b3JpZXMgaW4gdGhlCi1zcmMvIGRpcmVjdG9yeSBvZiB0aGlzIHBsdWctaW4uIFN1Y2ggQWJvdXRzIGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgU291cmNlIFppcHMgaW4gdGhhdCBkaXJlY3RvcnksIG5vdCB0aGUgRVBMLjwvcD4KLQotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSMgYWJvdXQuaW5pCi0jIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGEgZmVhdHVyZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyAiJWtleSIgYXJlIGV4dGVybmFsaXplZCBzdHJpbmdzIGRlZmluZWQgaW4gYWJvdXQucHJvcGVydGllcwotIyBUaGlzIGZpbGUgZG9lcyBub3QgbmVlZCB0byBiZSB0cmFuc2xhdGVkLgotCi0jIFByb3BlcnR5ICJhYm91dFRleHQiIGNvbnRhaW5zIGJsdXJiIGZvciAiQWJvdXQiIGRpYWxvZyAodHJhbnNsYXRlZCkKLWFib3V0VGV4dD0lYmx1cmIKLQotIyBQcm9wZXJ0eSAid2luZG93SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gd2luZG93IGljb24gKDE2eDE2KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJmZWF0dXJlSW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gZmVhdHVyZSBpbWFnZSAoMzJ4MzIpCi1mZWF0dXJlSW1hZ2U9ZWNsaXBzZTMyLmdpZgotCi0jIFByb3BlcnR5ICJhYm91dEltYWdlIiBjb250YWlucyBwYXRoIHRvIHByb2R1Y3QgaW1hZ2UgKDUwMHgzMzAgb3IgMTE1eDE2NCkKLSMgbmVlZGVkIGZvciBwcmltYXJ5IGZlYXR1cmVzIG9ubHkKLQotIyBQcm9wZXJ0eSAiYXBwTmFtZSIgY29udGFpbnMgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gKG5vdCB0cmFuc2xhdGVkKQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGFnZSIgY29udGFpbnMgcGF0aCB0byB3ZWxjb21lIHBhZ2UgKHNwZWNpYWwgWE1MLWJhc2VkIGZvcm1hdCkKLSMgb3B0aW9uYWwKLQotIyBQcm9wZXJ0eSAid2VsY29tZVBlcnNwZWN0aXZlIiBjb250YWlucyB0aGUgaWQgb2YgdGhlIHBlcnNwZWN0aXZlIGluIHdoaWNoIHRoZQotIyB3ZWxjb21lIHBhZ2UgaXMgdG8gYmUgb3BlbmVkLgotIyBvcHRpb25hbAotCi0KLQotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jIGFib3V0Lm1hcHBpbmdzDQotIyBjb250YWlucyBmaWxsLWlucyBmb3IgYWJvdXQucHJvcGVydGllcw0KLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykNCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuDQotDQotMD1AYnVpbGRADQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE5NWMwYS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFib3V0LnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGFib3V0LmluaQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBmaWxsLWlucyBhcmUgc3VwcGxpZWQgYnkgYWJvdXQubWFwcGluZ3MKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotIwotIyBEbyBub3QgdHJhbnNsYXRlIGFueSB2YWx1ZXMgc3Vycm91bmRlZCBieSB7fQotCi1ibHVyYj1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUlcblwKLVxuXAotVmVyc2lvbjoge2ZlYXR1cmVWZXJzaW9ufVxuXAotQnVpbGQgaWQ6IHswfVxuXAotXG5cCi0oYykgQ29weXJpZ2h0IEVjbGlwc2UgY29udHJpYnV0b3JzIGFuZCBvdGhlcnMgMjAwNS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG5cCi1WaXNpdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL3dlYnRvb2xzCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4OTU1OTcuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLQotYmluLmluY2x1ZGVzID0gYWJvdXQuaHRtbCwgYWJvdXQuaW5pLCBhYm91dC5tYXBwaW5ncywgYWJvdXQucHJvcGVydGllcywgZWNsaXBzZTMyLmdpZiwgcGx1Z2luLnByb3BlcnRpZXMsIHBsdWdpbi54bWwsIHNyYy8qKiwgTUVUQS1JTkYvCi1zb3VyY2VQbHVnaW4gPSB0cnVlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLmdpZiBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5wbmcgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1NmZiOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotcGx1Z2luTmFtZT1XZWIgU3RhbmRhcmQgVG9vbHMgLSBXZWIgVUkgU291cmNlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2ZlMTc0Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmVfMS4wLjAuamFyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjVlYjMxLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmU8L25hbWU+Ci0JPGNvbW1lbnQ+PC9jb21tZW50PgotCTxwcm9qZWN0cz4KLQk8L3Byb2plY3RzPgotCTxidWlsZFNwZWM+Ci0JCTxidWlsZENvbW1hbmQ+Ci0JCQk8bmFtZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZUJ1aWxkZXI8L25hbWU+Ci0JCQk8YXJndW1lbnRzPgotCQkJPC9hcmd1bWVudHM+Ci0JCTwvYnVpbGRDb21tYW5kPgotCTwvYnVpbGRTcGVjPgotCTxuYXR1cmVzPgotCQk8bmF0dXJlPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlTmF0dXJlPC9uYXR1cmU+Ci0JPC9uYXR1cmVzPgotPC9wcm9qZWN0RGVzY3JpcHRpb24+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y0NzY5NC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBmZWF0dXJlLnhtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBsaWNlbnNlLmh0bWwsXAotICAgICAgICAgICAgICAgZmVhdHVyZS5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDRiMTk2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi08aHRtbCB4bWxuczpvPSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTpvZmZpY2UiCi14bWxuczp3PSJ1cm46c2NoZW1hcy1taWNyb3NvZnQtY29tOm9mZmljZTp3b3JkIgoteG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAiPgotCi08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD13aW5kb3dzLTEyNTIiPgotPG1ldGEgbmFtZT1Qcm9nSWQgY29udGVudD1Xb3JkLkRvY3VtZW50PgotPG1ldGEgbmFtZT1HZW5lcmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bWV0YSBuYW1lPU9yaWdpbmF0b3IgY29udGVudD0iTWljcm9zb2Z0IFdvcmQgOSI+Ci08bGluayByZWw9RmlsZS1MaXN0Ci1ocmVmPSIuL0VjbGlwc2UlMjBFUEwlMjAyMDAzXzExXzEwJTIwRmluYWxfZmlsZXMvZmlsZWxpc3QueG1sIj4KLTx0aXRsZT5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gVmVyc2lvbiAxLjA8L3RpdGxlPgotPCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPG86RG9jdW1lbnRQcm9wZXJ0aWVzPgotICA8bzpSZXZpc2lvbj4yPC9vOlJldmlzaW9uPgotICA8bzpUb3RhbFRpbWU+MzwvbzpUb3RhbFRpbWU+Ci0gIDxvOkNyZWF0ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286Q3JlYXRlZD4KLSAgPG86TGFzdFNhdmVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkxhc3RTYXZlZD4KLSAgPG86UGFnZXM+NDwvbzpQYWdlcz4KLSAgPG86V29yZHM+MTYyNjwvbzpXb3Jkcz4KLSAgPG86Q2hhcmFjdGVycz45MjcwPC9vOkNoYXJhY3RlcnM+Ci0gICA8bzpMaW5lcz43NzwvbzpMaW5lcz4KLSAgPG86UGFyYWdyYXBocz4xODwvbzpQYXJhZ3JhcGhzPgotICA8bzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4xMTM4NDwvbzpDaGFyYWN0ZXJzV2l0aFNwYWNlcz4KLSAgPG86VmVyc2lvbj45LjQ0MDI8L286VmVyc2lvbj4KLSA8L286RG9jdW1lbnRQcm9wZXJ0aWVzPgotPC94bWw+PCFbZW5kaWZdLS0+PCEtLVtpZiBndGUgbXNvIDldPjx4bWw+Ci0gPHc6V29yZERvY3VtZW50PgotICA8dzpUcmFja1JldmlzaW9ucy8+Ci0gPC93OldvcmREb2N1bWVudD4KLTwveG1sPjwhW2VuZGlmXS0tPgotPHN0eWxlPgotPCEtLQotIC8qIEZvbnQgRGVmaW5pdGlvbnMgKi8KLUBmb250LWZhY2UKLQl7Zm9udC1mYW1pbHk6VGFob21hOwotCXBhbm9zZS0xOjIgMTEgNiA0IDMgNSA0IDQgMiA0OwotCW1zby1mb250LWNoYXJzZXQ6MDsKLQltc28tZ2VuZXJpYy1mb250LWZhbWlseTpzd2lzczsKLQltc28tZm9udC1waXRjaDp2YXJpYWJsZTsKLQltc28tZm9udC1zaWduYXR1cmU6NTUzNjc5NDk1IC0yMTQ3NDgzNjQ4IDggMCA2NjA0NyAwO30KLSAvKiBTdHlsZSBEZWZpbml0aW9ucyAqLwotcC5Nc29Ob3JtYWwsIGxpLk1zb05vcm1hbCwgZGl2Lk1zb05vcm1hbAotCXttc28tc3R5bGUtcGFyZW50OiIiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAKLQl7bWFyZ2luLXJpZ2h0OjBpbjsKLQltc28tbWFyZ2luLXRvcC1hbHQ6YXV0bzsKLQltc28tbWFyZ2luLWJvdHRvbS1hbHQ6YXV0bzsKLQltYXJnaW4tbGVmdDowaW47Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcC5CYWxsb29uVGV4dCwgbGkuQmFsbG9vblRleHQsIGRpdi5CYWxsb29uVGV4dAotCXttc28tc3R5bGUtbmFtZToiQmFsbG9vbiBUZXh0IjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjguMHB0OwotCWZvbnQtZmFtaWx5OlRhaG9tYTsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1AcGFnZSBTZWN0aW9uMQotCXtzaXplOjguNWluIDExLjBpbjsKLQltYXJnaW46MS4waW4gMS4yNWluIDEuMGluIDEuMjVpbjsKLQltc28taGVhZGVyLW1hcmdpbjouNWluOwotCW1zby1mb290ZXItbWFyZ2luOi41aW47Ci0JbXNvLXBhcGVyLXNvdXJjZTowO30KLWRpdi5TZWN0aW9uMQotCXtwYWdlOlNlY3Rpb24xO30KLS0tPgotPC9zdHlsZT4KLTwvaGVhZD4KLQotPGJvZHkgbGFuZz1FTi1VUyBzdHlsZT0ndGFiLWludGVydmFsOi41aW4nPgotCi08ZGl2IGNsYXNzPVNlY3Rpb24xPgotCi08cCBhbGlnbj1jZW50ZXIgc3R5bGU9J3RleHQtYWxpZ246Y2VudGVyJz48Yj5FY2xpcHNlIFB1YmxpYyBMaWNlbnNlIC0gdiAxLjA8L2I+Ci08L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5USEUgQUNDT01QQU5ZSU5HIFBST0dSQU0gSVMgUFJPVklERUQgVU5ERVIKLVRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UgUFVCTElDIExJQ0VOU0UgKCZxdW90O0FHUkVFTUVOVCZxdW90OykuIEFOWSBVU0UsCi1SRVBST0RVQ1RJT04gT1IgRElTVFJJQlVUSU9OIE9GIFRIRSBQUk9HUkFNIENPTlNUSVRVVEVTIFJFQ0lQSUVOVCdTIEFDQ0VQVEFOQ0UKLU9GIFRISVMgQUdSRUVNRU5ULjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+MS4gREVGSU5JVElPTlM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRpb24mcXVvdDsgbWVhbnM6PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29kZSBhbmQgZG9jdW1lbnRhdGlvbgotZGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZDxiciBjbGVhcj1sZWZ0PgotYikgaW4gdGhlIGNhc2Ugb2YgZWFjaCBzdWJzZXF1ZW50IENvbnRyaWJ1dG9yOjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1jaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbTs8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz53aGVyZQotc3VjaCBjaGFuZ2VzIGFuZC9vciBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW0gb3JpZ2luYXRlIGZyb20gYW5kIGFyZSBkaXN0cmlidXRlZAotYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiBBIENvbnRyaWJ1dGlvbiAnb3JpZ2luYXRlcycgZnJvbSBhIENvbnRyaWJ1dG9yCi1pZiBpdCB3YXMgYWRkZWQgdG8gdGhlIFByb2dyYW0gYnkgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbgotc3VjaCBDb250cmlidXRvcidzIGJlaGFsZi4gQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBhZGRpdGlvbnMgdG8gdGhlCi1Qcm9ncmFtIHdoaWNoOiAoaSkgYXJlIHNlcGFyYXRlIG1vZHVsZXMgb2Ygc29mdHdhcmUgZGlzdHJpYnV0ZWQgaW4gY29uanVuY3Rpb24KLXdpdGggdGhlIFByb2dyYW0gdW5kZXIgdGhlaXIgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBhbmQgKGlpKSBhcmUgbm90IGRlcml2YXRpdmUKLXdvcmtzIG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0b3ImcXVvdDsgbWVhbnMgYW55IHBlcnNvbiBvcgotZW50aXR5IHRoYXQgZGlzdHJpYnV0ZXMgdGhlIFByb2dyYW0uPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtMaWNlbnNlZCBQYXRlbnRzICZxdW90OyBtZWFuIHBhdGVudAotY2xhaW1zIGxpY2Vuc2FibGUgYnkgYSBDb250cmlidXRvciB3aGljaCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2UKLW9yIHNhbGUgb2YgaXRzIENvbnRyaWJ1dGlvbiBhbG9uZSBvciB3aGVuIGNvbWJpbmVkIHdpdGggdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtQcm9ncmFtJnF1b3Q7IG1lYW5zIHRoZSBDb250cmlidXRpb25zCi1kaXN0cmlidXRlZCBpbiBhY2NvcmRhbmNlIHdpdGggdGhpcyBBZ3JlZW1lbnQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtSZWNpcGllbnQmcXVvdDsgbWVhbnMgYW55b25lIHdobwotcmVjZWl2ZXMgdGhlIFByb2dyYW0gdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGluY2x1ZGluZyBhbGwgQ29udHJpYnV0b3JzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Mi4gR1JBTlQgT0YgUklHSFRTPC9zcGFuPjwvYj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyBSZWNpcGllbnQKLWEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgY29weXJpZ2h0IGxpY2Vuc2UgdG88c3Bhbgotc3R5bGU9J2NvbG9yOnJlZCc+IDwvc3Bhbj5yZXByb2R1Y2UsIHByZXBhcmUgZGVyaXZhdGl2ZSB3b3JrcyBvZiwgcHVibGljbHkKLWRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIGRpc3RyaWJ1dGUgYW5kIHN1YmxpY2Vuc2UgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoCi1Db250cmlidXRvciwgaWYgYW55LCBhbmQgc3VjaCBkZXJpdmF0aXZlIHdvcmtzLCBpbiBzb3VyY2UgY29kZSBhbmQgb2JqZWN0IGNvZGUKLWZvcm0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMKLVJlY2lwaWVudCBhIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSw8c3BhbiBzdHlsZT0nY29sb3I6Z3JlZW4nPiA8L3NwYW4+cm95YWx0eS1mcmVlCi1wYXRlbnQgbGljZW5zZSB1bmRlciBMaWNlbnNlZCBQYXRlbnRzIHRvIG1ha2UsIHVzZSwgc2VsbCwgb2ZmZXIgdG8gc2VsbCwgaW1wb3J0Ci1hbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaCBDb250cmlidXRvciwgaWYgYW55LCBpbiBzb3VyY2UKLWNvZGUgYW5kIG9iamVjdCBjb2RlIGZvcm0uIFRoaXMgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgYXBwbHkgdG8gdGhlIGNvbWJpbmF0aW9uCi1vZiB0aGUgQ29udHJpYnV0aW9uIGFuZCB0aGUgUHJvZ3JhbSBpZiwgYXQgdGhlIHRpbWUgdGhlIENvbnRyaWJ1dGlvbiBpcyBhZGRlZAotYnkgdGhlIENvbnRyaWJ1dG9yLCBzdWNoIGFkZGl0aW9uIG9mIHRoZSBDb250cmlidXRpb24gY2F1c2VzIHN1Y2ggY29tYmluYXRpb24KLXRvIGJlIGNvdmVyZWQgYnkgdGhlIExpY2Vuc2VkIFBhdGVudHMuIFRoZSBwYXRlbnQgbGljZW5zZSBzaGFsbCBub3QgYXBwbHkgdG8KLWFueSBvdGhlciBjb21iaW5hdGlvbnMgd2hpY2ggaW5jbHVkZSB0aGUgQ29udHJpYnV0aW9uLiBObyBoYXJkd2FyZSBwZXIgc2UgaXMKLWxpY2Vuc2VkIGhlcmV1bmRlci4gPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YykKLVJlY2lwaWVudCB1bmRlcnN0YW5kcyB0aGF0IGFsdGhvdWdoIGVhY2ggQ29udHJpYnV0b3IgZ3JhbnRzIHRoZSBsaWNlbnNlcyB0byBpdHMKLUNvbnRyaWJ1dGlvbnMgc2V0IGZvcnRoIGhlcmVpbiwgbm8gYXNzdXJhbmNlcyBhcmUgcHJvdmlkZWQgYnkgYW55IENvbnRyaWJ1dG9yCi10aGF0IHRoZSBQcm9ncmFtIGRvZXMgbm90IGluZnJpbmdlIHRoZSBwYXRlbnQgb3Igb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5Ci1yaWdodHMgb2YgYW55IG90aGVyIGVudGl0eS4gRWFjaCBDb250cmlidXRvciBkaXNjbGFpbXMgYW55IGxpYWJpbGl0eSB0byBSZWNpcGllbnQKLWZvciBjbGFpbXMgYnJvdWdodCBieSBhbnkgb3RoZXIgZW50aXR5IGJhc2VkIG9uIGluZnJpbmdlbWVudCBvZiBpbnRlbGxlY3R1YWwKLXByb3BlcnR5IHJpZ2h0cyBvciBvdGhlcndpc2UuIEFzIGEgY29uZGl0aW9uIHRvIGV4ZXJjaXNpbmcgdGhlIHJpZ2h0cyBhbmQKLWxpY2Vuc2VzIGdyYW50ZWQgaGVyZXVuZGVyLCBlYWNoIFJlY2lwaWVudCBoZXJlYnkgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5Ci10byBzZWN1cmUgYW55IG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLAotaWYgYSB0aGlyZCBwYXJ0eSBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gZGlzdHJpYnV0ZQotdGhlIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlIGJlZm9yZQotZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmQpCi1FYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcyBzdWZmaWNpZW50IGNvcHlyaWdodAotcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQgdGhlIGNvcHlyaWdodCBsaWNlbnNlIHNldCBmb3J0aCBpbgotdGhpcyBBZ3JlZW1lbnQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4zLiBSRVFVSVJFTUVOVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BIENvbnRyaWJ1dG9yIG1heSBjaG9vc2UgdG8gZGlzdHJpYnV0ZSB0aGUKLVByb2dyYW0gaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciBpdHMgb3duIGxpY2Vuc2UgYWdyZWVtZW50LCBwcm92aWRlZCB0aGF0Ojwvc3Bhbj4KLTwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IGNvbXBsaWVzIHdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotaXRzIGxpY2Vuc2UgYWdyZWVtZW50Ojwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmkpCi1lZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIHdhcnJhbnRpZXMgYW5kCi1jb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIHRpdGxlCi1hbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kIGltcGxpZWQgd2FycmFudGllcyBvciBjb25kaXRpb25zIG9mIG1lcmNoYW50YWJpbGl0eQotYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paSkKLWVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCBsaWFiaWxpdHkgZm9yIGRhbWFnZXMsCi1pbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBhbmQgY29uc2VxdWVudGlhbCBkYW1hZ2VzLCBzdWNoCi1hcyBsb3N0IHByb2ZpdHM7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpaSkKLXN0YXRlcyB0aGF0IGFueSBwcm92aXNpb25zIHdoaWNoIGRpZmZlciBmcm9tIHRoaXMgQWdyZWVtZW50IGFyZSBvZmZlcmVkIGJ5IHRoYXQKLUNvbnRyaWJ1dG9yIGFsb25lIGFuZCBub3QgYnkgYW55IG90aGVyIHBhcnR5OyBhbmQ8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pdikKLXN0YXRlcyB0aGF0IHNvdXJjZSBjb2RlIGZvciB0aGUgUHJvZ3JhbSBpcyBhdmFpbGFibGUgZnJvbSBzdWNoIENvbnRyaWJ1dG9yLCBhbmQKLWluZm9ybXMgbGljZW5zZWVzIGhvdyB0byBvYnRhaW4gaXQgaW4gYSByZWFzb25hYmxlIG1hbm5lciBvbiBvciB0aHJvdWdoIGEKLW1lZGl1bSBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBleGNoYW5nZS48c3BhbiBzdHlsZT0nY29sb3I6Ymx1ZSc+IDwvc3Bhbj48L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+V2hlbiB0aGUgUHJvZ3JhbSBpcyBtYWRlIGF2YWlsYWJsZSBpbiBzb3VyY2UKLWNvZGUgZm9ybTo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQ7IGFuZCA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKSBhCi1jb3B5IG9mIHRoaXMgQWdyZWVtZW50IG11c3QgYmUgaW5jbHVkZWQgd2l0aCBlYWNoIGNvcHkgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55Ci1jb3B5cmlnaHQgbm90aWNlcyBjb250YWluZWQgd2l0aGluIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RWFjaCBDb250cmlidXRvciBtdXN0IGlkZW50aWZ5IGl0c2VsZiBhcyB0aGUKLW9yaWdpbmF0b3Igb2YgaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCBpbiBhIG1hbm5lciB0aGF0IHJlYXNvbmFibHkgYWxsb3dzCi1zdWJzZXF1ZW50IFJlY2lwaWVudHMgdG8gaWRlbnRpZnkgdGhlIG9yaWdpbmF0b3Igb2YgdGhlIENvbnRyaWJ1dGlvbi4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjQuIENPTU1FUkNJQUwgRElTVFJJQlVUSU9OPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29tbWVyY2lhbCBkaXN0cmlidXRvcnMgb2Ygc29mdHdhcmUgbWF5Ci1hY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIHdpdGggcmVzcGVjdCB0byBlbmQgdXNlcnMsIGJ1c2luZXNzIHBhcnRuZXJzCi1hbmQgdGhlIGxpa2UuIFdoaWxlIHRoaXMgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZQotb2YgdGhlIFByb2dyYW0sIHRoZSBDb250cmlidXRvciB3aG8gaW5jbHVkZXMgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsCi1wcm9kdWN0IG9mZmVyaW5nIHNob3VsZCBkbyBzbyBpbiBhIG1hbm5lciB3aGljaCBkb2VzIG5vdCBjcmVhdGUgcG90ZW50aWFsCi1saWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgc3VjaCBDb250cmlidXRvciAoJnF1b3Q7Q29tbWVyY2lhbAotQ29udHJpYnV0b3ImcXVvdDspIGhlcmVieSBhZ3JlZXMgdG8gZGVmZW5kIGFuZCBpbmRlbW5pZnkgZXZlcnkgb3RoZXIKLUNvbnRyaWJ1dG9yICgmcXVvdDtJbmRlbW5pZmllZCBDb250cmlidXRvciZxdW90OykgYWdhaW5zdCBhbnkgbG9zc2VzLCBkYW1hZ2VzIGFuZAotY29zdHMgKGNvbGxlY3RpdmVseSAmcXVvdDtMb3NzZXMmcXVvdDspIGFyaXNpbmcgZnJvbSBjbGFpbXMsIGxhd3N1aXRzIGFuZCBvdGhlcgotbGVnYWwgYWN0aW9ucyBicm91Z2h0IGJ5IGEgdGhpcmQgcGFydHkgYWdhaW5zdCB0aGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgdG8KLXRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4KLWNvbm5lY3Rpb24gd2l0aCBpdHMgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0Ci1vZmZlcmluZy4gVGhlIG9ibGlnYXRpb25zIGluIHRoaXMgc2VjdGlvbiBkbyBub3QgYXBwbHkgdG8gYW55IGNsYWltcyBvciBMb3NzZXMKLXJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZCBpbnRlbGxlY3R1YWwgcHJvcGVydHkgaW5mcmluZ2VtZW50LiBJbiBvcmRlcgotdG8gcXVhbGlmeSwgYW4gSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsCi1Db250cmlidXRvciBpbiB3cml0aW5nIG9mIHN1Y2ggY2xhaW0sIGFuZCBiKSBhbGxvdyB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvcgotdG8gY29udHJvbCwgYW5kIGNvb3BlcmF0ZSB3aXRoIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluLCB0aGUgZGVmZW5zZSBhbmQKLWFueSByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5IHBhcnRpY2lwYXRlCi1pbiBhbnkgc3VjaCBjbGFpbSBhdCBpdHMgb3duIGV4cGVuc2UuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Gb3IgZXhhbXBsZSwgYSBDb250cmlidXRvciBtaWdodCBpbmNsdWRlIHRoZQotUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdCBvZmZlcmluZywgUHJvZHVjdCBYLiBUaGF0IENvbnRyaWJ1dG9yIGlzIHRoZW4gYQotQ29tbWVyY2lhbCBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKLWNsYWltcywgb3Igb2ZmZXJzIHdhcnJhbnRpZXMgcmVsYXRlZCB0byBQcm9kdWN0IFgsIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQKLXdhcnJhbnRpZXMgYXJlIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvcidzIHJlc3BvbnNpYmlsaXR5IGFsb25lLiBVbmRlciB0aGlzCi1zZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvIGRlZmVuZCBjbGFpbXMgYWdhaW5zdCB0aGUKLW90aGVyIENvbnRyaWJ1dG9ycyByZWxhdGVkIHRvIHRob3NlIHBlcmZvcm1hbmNlIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEKLWNvdXJ0IHJlcXVpcmVzIGFueSBvdGhlciBDb250cmlidXRvciB0byBwYXkgYW55IGRhbWFnZXMgYXMgYSByZXN1bHQsIHRoZQotQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheSB0aG9zZSBkYW1hZ2VzLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NS4gTk8gV0FSUkFOVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIFRIRSBQUk9HUkFNIElTIFBST1ZJREVEIE9OIEFOICZxdW90O0FTIElTJnF1b3Q7IEJBU0lTLCBXSVRIT1VUCi1XQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQgSU5DTFVESU5HLAotV0lUSE9VVCBMSU1JVEFUSU9OLCBBTlkgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULAotTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBFYWNoIFJlY2lwaWVudCBpcyBzb2xlbHkKLXJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlCi1Qcm9ncmFtIGFuZCBhc3N1bWVzIGFsbCByaXNrcyBhc3NvY2lhdGVkIHdpdGggaXRzIGV4ZXJjaXNlIG9mIHJpZ2h0cyB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSByaXNrcyBhbmQgY29zdHMgb2YgcHJvZ3JhbSBlcnJvcnMsCi1jb21wbGlhbmNlIHdpdGggYXBwbGljYWJsZSBsYXdzLCBkYW1hZ2UgdG8gb3IgbG9zcyBvZiBkYXRhLCBwcm9ncmFtcyBvcgotZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz42LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgTkVJVEhFUiBSRUNJUElFTlQgTk9SIEFOWSBDT05UUklCVVRPUlMgU0hBTEwgSEFWRSBBTlkgTElBQklMSVRZIEZPUgotQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCi0oSU5DTFVESU5HIFdJVEhPVVQgTElNSVRBVElPTiBMT1NUIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWQotT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLU5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT1IgRElTVFJJQlVUSU9OIE9GCi1USEUgUFJPR1JBTSBPUiBUSEUgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GCi1USEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0VTLjwvc3Bhbj4gPC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ny4gR0VORVJBTDwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZAotb3IgdW5lbmZvcmNlYWJsZSB1bmRlciBhcHBsaWNhYmxlIGxhdywgaXQgc2hhbGwgbm90IGFmZmVjdCB0aGUgdmFsaWRpdHkgb3IKLWVuZm9yY2VhYmlsaXR5IG9mIHRoZSByZW1haW5kZXIgb2YgdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBhbmQgd2l0aG91dAotZnVydGhlciBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKLW1pbmltdW0gZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIHN1Y2ggcHJvdmlzaW9uIHZhbGlkIGFuZCBlbmZvcmNlYWJsZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPklmIFJlY2lwaWVudCBpbnN0aXR1dGVzIHBhdGVudCBsaXRpZ2F0aW9uCi1hZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpCi1hbGxlZ2luZyB0aGF0IHRoZSBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoCi1vdGhlciBzb2Z0d2FyZSBvciBoYXJkd2FyZSkgaW5mcmluZ2VzIHN1Y2ggUmVjaXBpZW50J3MgcGF0ZW50KHMpLCB0aGVuIHN1Y2gKLVJlY2lwaWVudCdzIHJpZ2h0cyBncmFudGVkIHVuZGVyIFNlY3Rpb24gMihiKSBzaGFsbCB0ZXJtaW5hdGUgYXMgb2YgdGhlIGRhdGUKLXN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQKLXNoYWxsIHRlcm1pbmF0ZSBpZiBpdCBmYWlscyB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIG1hdGVyaWFsIHRlcm1zIG9yCi1jb25kaXRpb25zIG9mIHRoaXMgQWdyZWVtZW50IGFuZCBkb2VzIG5vdCBjdXJlIHN1Y2ggZmFpbHVyZSBpbiBhIHJlYXNvbmFibGUKLXBlcmlvZCBvZiB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCi1yaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgdGVybWluYXRlLCBSZWNpcGllbnQgYWdyZWVzIHRvIGNlYXNlIHVzZSBhbmQKLWRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBhcyBzb29uIGFzIHJlYXNvbmFibHkgcHJhY3RpY2FibGUuIEhvd2V2ZXIsCi1SZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzIGdyYW50ZWQgYnkKLVJlY2lwaWVudCByZWxhdGluZyB0byB0aGUgUHJvZ3JhbSBzaGFsbCBjb250aW51ZSBhbmQgc3Vydml2ZS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlCi1jb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGJ1dCBpbiBvcmRlciB0byBhdm9pZCBpbmNvbnNpc3RlbmN5IHRoZSBBZ3JlZW1lbnQgaXMKLWNvcHlyaWdodGVkIGFuZCBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudAotU3Rld2FyZCByZXNlcnZlcyB0aGUgcmlnaHQgdG8gcHVibGlzaCBuZXcgdmVyc2lvbnMgKGluY2x1ZGluZyByZXZpc2lvbnMpIG9mCi10aGlzIEFncmVlbWVudCBmcm9tIHRpbWUgdG8gdGltZS4gTm8gb25lIG90aGVyIHRoYW4gdGhlIEFncmVlbWVudCBTdGV3YXJkIGhhcwotdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyB0aGUgaW5pdGlhbAotQWdyZWVtZW50IFN0ZXdhcmQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gbWF5IGFzc2lnbiB0aGUgcmVzcG9uc2liaWxpdHkgdG8KLXNlcnZlIGFzIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCB0byBhIHN1aXRhYmxlIHNlcGFyYXRlIGVudGl0eS4gRWFjaCBuZXcgdmVyc2lvbgotb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIFRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIENvbnRyaWJ1dGlvbnMpIG1heSBhbHdheXMgYmUgZGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCB1bmRlciB3aGljaCBpdCB3YXMgcmVjZWl2ZWQuIEluIGFkZGl0aW9uLCBhZnRlciBhIG5ldyB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwgQ29udHJpYnV0b3IgbWF5IGVsZWN0IHRvIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KLShpbmNsdWRpbmcgaXRzIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4gRXhjZXB0IGFzIGV4cHJlc3NseSBzdGF0ZWQKLWluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudCByZWNlaXZlcyBubyByaWdodHMgb3IgbGljZW5zZXMgdG8KLXRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgb2YgYW55IENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyCi1leHByZXNzbHksIGJ5IGltcGxpY2F0aW9uLCBlc3RvcHBlbCBvciBvdGhlcndpc2UuIEFsbCByaWdodHMgaW4gdGhlIFByb2dyYW0gbm90Ci1leHByZXNzbHkgZ3JhbnRlZCB1bmRlciB0aGlzIEFncmVlbWVudCBhcmUgcmVzZXJ2ZWQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5UaGlzIEFncmVlbWVudCBpcyBnb3Zlcm5lZCBieSB0aGUgbGF3cyBvZiB0aGUKLVN0YXRlIG9mIE5ldyBZb3JrIGFuZCB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGxhd3Mgb2YgdGhlIFVuaXRlZCBTdGF0ZXMgb2YKLUFtZXJpY2EuIE5vIHBhcnR5IHRvIHRoaXMgQWdyZWVtZW50IHdpbGwgYnJpbmcgYSBsZWdhbCBhY3Rpb24gdW5kZXIgdGhpcwotQWdyZWVtZW50IG1vcmUgdGhhbiBvbmUgeWVhciBhZnRlciB0aGUgY2F1c2Ugb2YgYWN0aW9uIGFyb3NlLiBFYWNoIHBhcnR5IHdhaXZlcwotaXRzIHJpZ2h0cyB0byBhIGp1cnkgdHJpYWwgaW4gYW55IHJlc3VsdGluZyBsaXRpZ2F0aW9uLjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWw+PCFbaWYgIXN1cHBvcnRFbXB0eVBhcmFzXT4mbmJzcDs8IVtlbmRpZl0+PG86cD48L286cD48L3A+Ci0KLTwvZGl2PgotCi08L2JvZHk+Ci0KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkODlkM2QuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGZlYXR1cmUucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgZmVhdHVyZS54bWwKLSMgIiVmb28iIGluIGZlYXR1cmUueG1sIGNvcnJlc3BvbmRzIHRvIHRoZSBrZXkgImZvbyIgaW4gdGhpcyBmaWxlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIFRoaXMgZmlsZSBzaG91bGQgYmUgdHJhbnNsYXRlZC4KLQotIyAiZmVhdHVyZU5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgZmVhdHVyZQotZmVhdHVyZU5hbWU9V1NUIFdlYiBVc2VyIERvY3VtZW50YXRpb24KLQotIyAicHJvdmlkZXJOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGNvbXBhbnkgdGhhdCBwcm92aWRlcyB0aGUgZmVhdHVyZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCi0KLSMgInVwZGF0ZVNpdGVOYW1lIiBwcm9wZXJ0eSAtIGxhYmVsIGZvciB0aGUgdXBkYXRlIHNpdGUKLXVwZGF0ZVNpdGVOYW1lPVRoZSBFY2xpcHNlIFdlYiBUb29scyBQbGF0Zm9ybSAoV1RQKSBQcm9qZWN0IHVwZGF0ZSBzaXRlCi0KLSMgImRlc2NyaXB0aW9uIiBwcm9wZXJ0eSAtIGRlc2NyaXB0aW9uIG9mIHRoZSBmZWF0dXJlCi1kZXNjcmlwdGlvbj1XU1QgV2ViIHVzZXIgZG9jdW1lbnRhdGlvbgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0YTg0YzIuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Qud2ViX3VzZXJkb2MuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjYuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0ibGljZW5zZS5odG1sIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC53ZWJ0b29scy5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotPC9mZWF0dXJlPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LndlYl91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC53ZWJfdXNlcmRvYy5mZWF0dXJlL2xpY2Vuc2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczYy5vcmcvVFIvMTk5OS9SRUMtaHRtbDQwMS0xOTk5MTIyNC9sb29zZS5kdGQiPgotPCEtLSBzYXZlZCBmcm9tIHVybD0oMDA0NClodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC9ub3RpY2UuaHRtbCAtLT4KLTxIVE1MPjxIRUFEPjxUSVRMRT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvVElUTEU+Ci08TUVUQSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9aXNvLTg4NTktMSI+Ci08TUVUQSBjb250ZW50PSJNU0hUTUwgNi4wMC4yODAwLjE0NzkiIG5hbWU9R0VORVJBVE9SPjwvSEVBRD4KLTxCT0RZIGxhbmc9RU4tVVMgdkxpbms9cHVycGxlIGxpbms9Ymx1ZT4KLTxIMj5FY2xpcHNlIEZvdW5kYXRpb24gU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L0gyPgotPFA+SmFudWFyeSAyOCwgMjAwNTwvUD4KLTxIMz5Vc2FnZSBPZiBDb250ZW50PC9IMz4KLTxQPlRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiAKLUFORC9PUiBPVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS4gVVNFIE9GIAotVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCAKLUJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VIEFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgCi1CWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgCi1BR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgCi1BUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSAKLU1BWSBOT1QgVVNFIFRIRSBDT05URU5ULjwvUD4KLTxIMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9IMz4KLTxQPlVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSAKLUZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSAKLVB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpcyAKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IDxBIAotaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9BPi4gCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC48L1A+Ci08UD5Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSwgCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAKLSgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZSBhcyBkb3dubG9hZGFibGUgCi1hcmNoaXZlcyAoIkRvd25sb2FkcyIpLjwvUD4KLTxQPkNvbnRlbnQgbWF5IGJlIGFwcG9ydGlvbmVkIGludG8gcGx1Zy1pbnMgKCJQbHVnLWlucyIpLCBwbHVnLWluIGZyYWdtZW50cyAKLSgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSAKLVBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuIEZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IAotY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgCi1hc3NvY2lhdGVkIHdpdGggYSBGZWF0dXJlLiBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIAotbmFtZWQgInBsdWdpbnMiIGFuZCBGZWF0dXJlcyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyBuYW1lZCAiZmVhdHVyZXMiLjwvUD4KLTxQPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZCAKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIAotRmVhdHVyZXMuPC9QPgotPFA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgCi1pbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyAKLUZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiIAotKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgCi1kaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGUgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyAKLWxvY2F0aW9uczo8L1A+Ci08VUw+Ci0gIDxMST5UaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnkgCi0gIDxMST5QbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3RvcmllcyAKLSAgPExJPlN1YmRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWlucyAKLSAgPExJPkZlYXR1cmUgZGlyZWN0b3JpZXMgPC9MST48L1VMPgotPFA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIAotdXNpbmcgdGhlIEVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlIAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zIEluY2x1ZGVkIAotRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgCi1hbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybSB5b3Ugd2hlcmUgeW91IGNhbiAKLWxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW4gdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiAKLWZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cywgRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSAKLVVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCAKLWRpcmVjdG9yeS48L1A+Ci08UD5USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCAKLU9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy4gU09NRSBPRiBUSEVTRSAKLU9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6PC9QPgotPFVMPgotICA8TEk+Q29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbDwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMDwvQT4pIAotCi0gIDxMST5JQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sIj5odHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbDwvQT4pIAotCi0gIDxMST5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwiPmh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sPC9BPikgCi0KLSAgPExJPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sIj5odHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWw8L0E+KSAKLSAgPC9MST48L1VMPgotPFA+SVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUiAKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIGlzIAotcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIAotY29uZGl0aW9ucyBnb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuPC9QPgotPEgzPkNyeXB0b2dyYXBoeTwvSDM+Ci08UD5Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmUgCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciAKLXJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRSB1c2luZyBhbnkgCi1lbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgCi1jb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSwgYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCAKLXRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L1A+PC9CT0RZPjwvSFRNTD4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8uY3ZzaWdub3JlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmE1Njg5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5jdnNpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWJ1aWxkLnhtbAotb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmVfMS41LjAuMjAwNjA1MDgwMTA0LmJpbi5kaXN0LnppcApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhZTI0OC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvLnNldHRpbmdzL29yZy5lY2xpcHNlLmNvcmUucmVzb3VyY2VzLnByZWZzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA5Mjc2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5jb3JlLnJlc291cmNlcy5wcmVmcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotI01vbiBNYXkgMDggMDk6MTA6MjcgRURUIDIwMDYKLWVjbGlwc2UucHJlZmVyZW5jZXMudmVyc2lvbj0xCi1lbmNvZGluZy88cHJvamVjdD49SVNPLTg4NTktMQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZThkODRhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgQ29yZQotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVdTVCBYTUwgY29yZS4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIxODJkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS42LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuYXBhY2hlLnhlcmNlcy5mZWF0dXJlIiB2ZXJzaW9uPSIyLjguMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLnJjcCIgdmVyc2lvbj0iMy4yIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5wbGF0Zm9ybSIgdmVyc2lvbj0iMy4yIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS5lbWYiIHZlcnNpb249IjIuMiIgbWF0Y2g9ImVxdWl2YWxlbnQiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl9jb3JlLmZlYXR1cmUiIHZlcnNpb249IjEuMC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2UueHNkIiB2ZXJzaW9uPSIyLjIiIG1hdGNoPSJlcXVpdmFsZW50Ii8+Ci0gICA8L3JlcXVpcmVzPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LmR0ZC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhzZC5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5jb3JlIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI0OWU5Zi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1iaW4uaW5jbHVkZXMgPVwKLWVwbC12MTAuaHRtbCxcCi1lY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLWZlYXR1cmUueG1sLFwKLWZlYXR1cmUucHJvcGVydGllcyxcCi1saWNlbnNlLmh0bWwKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIyYWQyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NTVkZGYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgQ29yZSBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgV1NUIFhNTCBjb3JlLgotCi0jICJjb3B5cmlnaHQiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIENvcHlyaWdodCIKLWNvcHlyaWdodD1cCi1Db3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuXG5cCi1BbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzXG5cCi1hcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjBcblwKLXdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG5cCi1odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbFxuXAotXG5cCi1Db250cmlidXRvcnM6XG5cCi0gICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uXG4KLSMjIyMjIyMjIyMjIyMjIyMgZW5kIG9mIGNvcHlyaWdodCBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyAibGljZW5zZVVSTCIgcHJvcGVydHkgLSBVUkwgb2YgdGhlICJGZWF0dXJlIExpY2Vuc2UiCi0jIGRvIG5vdCB0cmFuc2xhdGUgdmFsdWUgLSBqdXN0IGNoYW5nZSB0byBwb2ludCB0byBhIGxvY2FsZS1zcGVjaWZpYyBIVE1MIHBhZ2UKLWxpY2Vuc2VVUkw9bGljZW5zZS5odG1sCi0KLSMgImxpY2Vuc2UiIHByb3BlcnR5IC0gdGV4dCBvZiB0aGUgIkZlYXR1cmUgVXBkYXRlIExpY2Vuc2UiCi0jIHNob3VsZCBiZSBwbGFpbiB0ZXh0IHZlcnNpb24gb2YgbGljZW5zZSBhZ3JlZW1lbnQgcG9pbnRlZCB0byBiZSAibGljZW5zZVVSTCIKLWxpY2Vuc2U9XAotRUNMSVBTRSBGT1VOREFUSU9OIFNPRlRXQVJFIFVTRVIgQUdSRUVNRU5UXG5cCi1NYXJjaCAxNywgMjAwNVxuXAotXG5cCi1Vc2FnZSBPZiBDb250ZW50XG5cCi1cblwKLVRIRSBFQ0xJUFNFIEZPVU5EQVRJT04gTUFLRVMgQVZBSUxBQkxFIFNPRlRXQVJFLCBET0NVTUVOVEFUSU9OLCBJTkZPUk1BVElPTiBBTkQvT1JcblwKLU9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLlxuXAotVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTXG5cCi1BR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBMSUNFTlNFIEFHUkVFTUVOVFMgT1JcblwKLU5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1VcblwKLUFHUkVFIFRIQVQgWU9VUiBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhJUyBBR1JFRU1FTlRcblwKLUFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTXG5cCi1PUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRVxuXAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OU1xuXAotT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRURcblwKLUJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC5cblwKLVxuXAotQXBwbGljYWJsZSBMaWNlbnNlc1xuXAotXG5cCi1Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvblxuXAotaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWNcblwKLUxpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzXG5cCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbC5cblwKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LlxuXAotXG5cCi1Db250ZW50IGluY2x1ZGVzLCBidXQgaXMgbm90IGxpbWl0ZWQgdG8sIHNvdXJjZSBjb2RlLCBvYmplY3QgY29kZSxcblwKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWU1xuXAotcmVwb3NpdG9yeSAoIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGVcblwKLWFzIGRvd25sb2FkYWJsZSBhcmNoaXZlcyAoIkRvd25sb2FkcyIpLlxuXAotXG5cCi0gICAtIENvbnRlbnQgbWF5IGJlIHN0cnVjdHVyZWQgYW5kIHBhY2thZ2VkIGludG8gbW9kdWxlcyB0byBmYWNpbGl0YXRlIGRlbGl2ZXJpbmcsXG5cCi0gICAgIGV4dGVuZGluZywgYW5kIHVwZ3JhZGluZyB0aGUgQ29udGVudC4gVHlwaWNhbCBtb2R1bGVzIG1heSBpbmNsdWRlIHBsdWctaW5zICgiUGx1Zy1pbnMiKSxcblwKLSAgICAgcGx1Zy1pbiBmcmFnbWVudHMgKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS5cblwKLSAgIC0gRWFjaCBQbHVnLWluIG9yIEZyYWdtZW50IG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3Rvcnkgb3IgSkFSIChKYXZhPyBBUmNoaXZlKVxuXAotICAgICBpbiBhIGRpcmVjdG9yeSBuYW1lZCAicGx1Z2lucyIuXG5cCi0gICAtIEEgRmVhdHVyZSBpcyBhIGJ1bmRsZSBvZiBvbmUgb3IgbW9yZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLlxuXAotICAgICBFYWNoIEZlYXR1cmUgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBpbiBhIGRpcmVjdG9yeSBuYW1lZCAiZmVhdHVyZXMiLlxuXAotICAgICBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb25cblwKLSAgICAgbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLlxuXAotICAgLSBGZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXNcblwKLSAgICAgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLUZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBGaWxlcyBuYW1lZFxuXAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2ZcblwKLUluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlXG5cCi1jb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgZ292ZXJuaW5nIEZlYXR1cmVzIGFuZCBJbmNsdWRlZCBGZWF0dXJlcyBzaG91bGQgYmUgY29udGFpbmVkXG5cCi1pbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAoIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlXG5cCi1MaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlXG5cCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczpcblwKLVxuXAotICAgLSBUaGUgdG9wLWxldmVsIChyb290KSBkaXJlY3RvcnlcblwKLSAgIC0gUGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXNcblwKLSAgIC0gSW5zaWRlIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgcGFja2FnZWQgYXMgSkFSc1xuXAotICAgLSBTdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zXG5cCi0gICAtIEZlYXR1cmUgZGlyZWN0b3JpZXNcblwKLVxuXAotTm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZVxuXAotRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGVcblwKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWluc1xuXAotSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3VcblwKLXdpdGggdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtXG5cCi15b3Ugd2hlcmUgeW91IGNhbiBsb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluXG5cCi10aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICJmZWF0dXJlLnByb3BlcnRpZXMiLiBTdWNoIEFib3V0cyxcblwKLUZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyXG5cCi11c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IGRpcmVjdG9yeS5cblwKLVxuXAotVEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSXG5cCi1UTyBUSEUgRVBMIE9SIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUywgTk9USUNFUyBPUiBURVJNUyBBTkQgQ09ORElUSU9OUy5cblwKLVNPTUUgT0YgVEhFU0UgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTpcblwKLVxuXAotICAgIC0gQ29tbW9uIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSlcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDIuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMClcblwKLSAgICAtIElCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbClcblwKLSAgICAtIE1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sKVxuXAotICAgIC0gTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbClcblwKLVxuXAotSVQgSVMgWU9VUiBPQkxJR0FUSU9OIFRPIFJFQUQgQU5EIEFDQ0VQVCBBTEwgU1VDSCBURVJNUyBBTkQgQ09ORElUSU9OUyBQUklPUlxuXAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VcblwKLWlzIHByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCBjb25kaXRpb25zXG5cCi1nb3Zlcm4gdGhhdCBwYXJ0aWN1bGFyIENvbnRlbnQuXG5cCi1cblwKLUNyeXB0b2dyYXBoeVxuXAotXG5cCi1Db250ZW50IG1heSBjb250YWluIGVuY3J5cHRpb24gc29mdHdhcmUuIFRoZSBjb3VudHJ5IGluIHdoaWNoIHlvdSBhcmVcblwKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSxcblwKLWFuZC9vciByZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkVcblwKLXVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLFxuXAotcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIGNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLFxuXAotYW5kIHJlLWV4cG9ydCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLCB0byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuXG5cCi1cblwKLUphdmEgYW5kIGFsbCBKYXZhLWJhc2VkIHRyYWRlbWFya3MgYXJlIHRyYWRlbWFya3Mgb2YgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBpbiB0aGUgVW5pdGVkIFN0YXRlcywgb3RoZXIgY291bnRyaWVzLCBvciBib3RoLlxuCi0jIyMjIyMjIyMjIyBlbmQgb2YgbGljZW5zZSBwcm9wZXJ0eSAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQyMzZlNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPGZlYXR1cmUKLSAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5zb3VyY2UiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS42LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhZjk2Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGFlYTAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5pbmkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZWUzNmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lm1hcHBpbmdzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmI3MzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTFjMjcxNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBDb3JlXG5cCi1cblwKLVZlcnNpb246IHtmZWF0dXJlVmVyc2lvbn1cblwKLUJ1aWxkIGlkOiB7MH1cblwKLVxuXAotKGMpIENvcHlyaWdodCBFY2xpcHNlIGNvbnRyaWJ1dG9ycyBhbmQgb3RoZXJzIDIwMDUuICBBbGwgcmlnaHRzIHJlc2VydmVkLlxuXAotVmlzaXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy93ZWJ0b29scwotCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1YjQ1Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkN2NjLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBhZTQ5ZC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vcGx1Z2luLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0Mzc3Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBDb3JlIFNvdXJjZQotcHJvdmlkZXJOYW1lPUVjbGlwc2Uub3JnCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMDllODUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8uY3ZzaWdub3JlCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1mZWF0dXJlcwotcGx1Z2lucwotYnVpbGQueG1sCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3NWZhNi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlLy5wcm9qZWN0CisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0RGVzY3JpcHRpb24+Ci0JPG5hbWU+b3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg0NjAyOS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKLQotZ2VuZXJhdGUuZmVhdHVyZUBvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlPW9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZmRmNzA4Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGIxOTYuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTAzOTNmOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgUGx1Zy1pbiBEZXZlbG9wZXIgUmVzb3VyY2VzCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249U291cmNlIGNvZGUgemlwcyBmb3IgdGhlIFdTVCBYTUwgdG9vbHMKLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDAwLCAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZS9mZWF0dXJlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQyNmRjNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9zZGsuZmVhdHVyZSIKLSAgICAgIGxhYmVsPSIlZmVhdHVyZU5hbWUiCi0gICAgICB2ZXJzaW9uPSIxLjYuMC5xdWFsaWZpZXIiCi0gICAgICBwcm92aWRlci1uYW1lPSIlcHJvdmlkZXJOYW1lIj4KLQotICAgPGRlc2NyaXB0aW9uPgotICAgICAgJWRlc2NyaXB0aW9uCi0gICA8L2Rlc2NyaXB0aW9uPgotCi0gICA8Y29weXJpZ2h0PgotICAgICAgJWNvcHlyaWdodAotICAgPC9jb3B5cmlnaHQ+Ci0KLSAgIDxsaWNlbnNlIHVybD0iJWxpY2Vuc2VVUkwiPgotICAgICAgJWxpY2Vuc2UKLSAgIDwvbGljZW5zZT4KLQotICAgPHVybD4KLSAgICAgIDx1cGRhdGUgbGFiZWw9IiV1cGRhdGVTaXRlTmFtZSIgdXJsPSJodHRwOi8vZG93bmxvYWQuZWNsaXBzZS5vcmcvd2VidG9vbHMvdXBkYXRlcy8iLz4KLSAgIDwvdXJsPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUuc291cmNlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPHJlcXVpcmVzPgotICAgICAgPGltcG9ydCBmZWF0dXJlPSJvcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUiIHZlcnNpb249IjAuMC4wIi8+Ci0gICA8L3JlcXVpcmVzPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3Nkay5mZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfc2RrLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5jdnNpZ25vcmUgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0NDg3Yy4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5wcm9qZWN0IGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLy5wcm9qZWN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTMxOGM3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZTwvbmFtZT4KLQk8Y29tbWVudD48L2NvbW1lbnQ+Ci0JPHByb2plY3RzPgotCTwvcHJvamVjdHM+Ci0JPGJ1aWxkU3BlYz4KLQkJPGJ1aWxkQ29tbWFuZD4KLQkJCTxuYW1lPm9yZy5lY2xpcHNlLnBkZS5GZWF0dXJlQnVpbGRlcjwvbmFtZT4KLQkJCTxhcmd1bWVudHM+Ci0JCQk8L2FyZ3VtZW50cz4KLQkJPC9idWlsZENvbW1hbmQ+Ci0JPC9idWlsZFNwZWM+Ci0JPG5hdHVyZXM+Ci0JCTxuYXR1cmU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVOYXR1cmU8L25hdHVyZT4KLQk8L25hdHVyZXM+Ci08L3Byb2plY3REZXNjcmlwdGlvbj4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWZmYzUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLWJpbi5pbmNsdWRlcyA9IGZlYXR1cmUueG1sLFwKLSAgICAgICAgICAgICAgIGVwbC12MTAuaHRtbCxcCi0gICAgICAgICAgICAgICBlY2xpcHNlX3VwZGF0ZV8xMjAuanBnLFwKLSAgICAgICAgICAgICAgIGxpY2Vuc2UuaHRtbCxcCi0gICAgICAgICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXMKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9lY2xpcHNlX3VwZGF0ZV8xMjAuanBnIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzcyNzM3Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgZmVhdHVyZS5wcm9wZXJ0aWVzCi0jIGNvbnRhaW5zIGV4dGVybmFsaXplZCBzdHJpbmdzIGZvciBmZWF0dXJlLnhtbAotIyAiJWZvbyIgaW4gZmVhdHVyZS54bWwgY29ycmVzcG9uZHMgdG8gdGhlIGtleSAiZm9vIiBpbiB0aGlzIGZpbGUKLSMgamF2YS5pby5Qcm9wZXJ0aWVzIGZpbGUgKElTTyA4ODU5LTEgd2l0aCAiXCIgZXNjYXBlcykKLSMgVGhpcyBmaWxlIHNob3VsZCBiZSB0cmFuc2xhdGVkLgotCi0jICJmZWF0dXJlTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBmZWF0dXJlCi1mZWF0dXJlTmFtZT1XU1QgWE1MIFVJCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V2ViIFhNTCB0b29scy4KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzNjMmEuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlIgotICAgICAgbGFiZWw9IiVmZWF0dXJlTmFtZSIKLSAgICAgIHZlcnNpb249IjEuNi4wLnF1YWxpZmllciIKLSAgICAgIHByb3ZpZGVyLW5hbWU9IiVwcm92aWRlck5hbWUiPgotCi0gICA8ZGVzY3JpcHRpb24+Ci0gICAgICAlZGVzY3JpcHRpb24KLSAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgIDxjb3B5cmlnaHQ+Ci0gICAgICAlY29weXJpZ2h0Ci0gICA8L2NvcHlyaWdodD4KLQotICAgPGxpY2Vuc2UgdXJsPSIlbGljZW5zZVVSTCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxpbmNsdWRlcwotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiLz4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi0gICA8cmVxdWlyZXM+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5hcGFjaGUueGVyY2VzLmZlYXR1cmUiIHZlcnNpb249IjIuOC4wIiBtYXRjaD0iZ3JlYXRlck9yRXF1YWwiLz4KLSAgICAgIDxpbXBvcnQgZmVhdHVyZT0ib3JnLmVjbGlwc2Uud3N0LmNvbW1vbl91aS5mZWF0dXJlIiB2ZXJzaW9uPSIxLjAuMCIgbWF0Y2g9ImdyZWF0ZXJPckVxdWFsIi8+Ci0gICAgICA8aW1wb3J0IGZlYXR1cmU9Im9yZy5lY2xpcHNlLmdlZiIgdmVyc2lvbj0iMy4yIiBtYXRjaD0iZXF1aXZhbGVudCIvPgotICAgPC9yZXF1aXJlcz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC5kdGQudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sLnVpLmluZm9wb3AiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3Quc3NlLnVpIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbC51aSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54c2QudWkiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLTwvZmVhdHVyZT4KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzQ3MDYwLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9saWNlbnNlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53M2Mub3JnL1RSLzE5OTkvUkVDLWh0bWw0MDEtMTk5OTEyMjQvbG9vc2UuZHRkIj4KLTwhLS0gc2F2ZWQgZnJvbSB1cmw9KDAwNDQpaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwvbm90aWNlLmh0bWwgLS0+Ci08SFRNTD48SEVBRD48VElUTEU+RWNsaXBzZS5vcmcgU29mdHdhcmUgVXNlciBBZ3JlZW1lbnQ8L1RJVExFPgotPE1FVEEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PWlzby04ODU5LTEiPgotPE1FVEEgY29udGVudD0iTVNIVE1MIDYuMDAuMjgwMC4xNDc5IiBuYW1lPUdFTkVSQVRPUj48L0hFQUQ+Ci08Qk9EWSBsYW5nPUVOLVVTIHZMaW5rPXB1cnBsZSBsaW5rPWJsdWU+Ci08SDI+RWNsaXBzZSBGb3VuZGF0aW9uIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9IMj4KLTxQPkphbnVhcnkgMjgsIDIwMDU8L1A+Ci08SDM+VXNhZ2UgT2YgQ29udGVudDwvSDM+Ci08UD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gCi1BTkQvT1IgT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuIFVTRSBPRiAKLVRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIAotVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgCi1CRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIAotQlkgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIAotQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBJRiBZT1UgRE8gTk9UIEFHUkVFIFRPIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIAotQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVywgVEhFTiBZT1UgCi1NQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L1A+Ci08SDM+QXBwbGljYWJsZSBMaWNlbnNlczwvSDM+Ci08UD5Vbmxlc3Mgb3RoZXJ3aXNlIGluZGljYXRlZCwgYWxsIENvbnRlbnQgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgCi1Gb3VuZGF0aW9uIGlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgCi1QdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgCi1Db250ZW50IGFuZCBpcyBhbHNvIGF2YWlsYWJsZSBhdCA8QSAKLWhyZWY9Imh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sIj5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbDwvQT4uIAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuPC9QPgotPFA+Q29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsIAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTIHJlcG9zaXRvcnkgCi0oIlJlcG9zaXRvcnkiKSBpbiBDVlMgbW9kdWxlcyAoIk1vZHVsZXMiKSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIAotYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS48L1A+Ci08UD5Db250ZW50IG1heSBiZSBhcHBvcnRpb25lZCBpbnRvIHBsdWctaW5zICgiUGx1Zy1pbnMiKSwgcGx1Zy1pbiBmcmFnbWVudHMgCi0oIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLiBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgCi1QbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFuZCBhc3NvY2lhdGVkIG1hdGVyaWFsLiBGaWxlcyBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSAKLWNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIAotYXNzb2NpYXRlZCB3aXRoIGEgRmVhdHVyZS4gUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBhcmUgbG9jYXRlZCBpbiBkaXJlY3RvcmllcyAKLW5hbWVkICJwbHVnaW5zIiBhbmQgRmVhdHVyZXMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgbmFtZWQgImZlYXR1cmVzIi48L1A+Ci08UD5GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWQgCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCAKLUZlYXR1cmVzLjwvUD4KLTxQPlRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmUgY29udGFpbmVkIAotaW4gZmlsZXMgbmFtZWQgImFib3V0Lmh0bWwiICgiQWJvdXRzIikuIFRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgCi1GZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAibGljZW5zZS5odG1sIiAKLSgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmUgTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IAotZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlIGluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgCi1sb2NhdGlvbnM6PC9QPgotPFVMPgotICA8TEk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5IAotICA8TEk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXMgCi0gIDxMST5TdWJkaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnMgCi0gIDxMST5GZWF0dXJlIGRpcmVjdG9yaWVzIDwvTEk+PC9VTD4KLTxQPk5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCAKLXVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZSAKLUxpY2Vuc2UiKSBkdXJpbmcgdGhlIGluc3RhbGxhdGlvbiBwcm9jZXNzLiBJZiB0aGUgRmVhdHVyZSBjb250YWlucyBJbmNsdWRlZCAKLUZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91IHdpdGggdGhlIHRlcm1zIAotYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm0geW91IHdoZXJlIHlvdSBjYW4gCi1sb2NhdGUgdGhlbS4gRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgCi1maWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMgYW5kIEZlYXR1cmUgCi1VcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyAKLWFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgCi1kaXJlY3RvcnkuPC9QPgotPFA+VEhFIEFCT1VUUywgRkVBVFVSRSBMSUNFTlNFUyBBTkQgRkVBVFVSRSBVUERBVEUgTElDRU5TRVMgTUFZIFJFRkVSIFRPIFRIRSBFUEwgCi1PUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuIFNPTUUgT0YgVEhFU0UgCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvUD4KLTxVTD4KLSAgPExJPkNvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvQT4pIAotCi0gIDxMST5BcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L0E+KSAKLQotICA8TEk+SUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L0E+KSAKLQotICA8TEk+TWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vcGVubW90aWYvc3VwcG9ydGVycy9tZXRyb2xpbmsvbGljZW5zZS5odG1sIj5odHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbDwvQT4pIAotCi0gIDxMST5Nb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbCI+aHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sPC9BPikgCi0gIDwvTEk+PC9VTD4KLTxQPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyAKLXByb3ZpZGVkLCBwbGVhc2UgY29udGFjdCB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIHRvIGRldGVybWluZSB3aGF0IHRlcm1zIGFuZCAKLWNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvUD4KLTxIMz5DcnlwdG9ncmFwaHk8L0gzPgotPFA+Q29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlIAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLCBhbmQvb3IgCi1yZS1leHBvcnQgdG8gYW5vdGhlciBjb3VudHJ5LCBvZiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBCRUZPUkUgdXNpbmcgYW55IAotZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cywgcmVndWxhdGlvbnMgYW5kIHBvbGljaWVzIAotY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsIGFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgCi10byBzZWUgaWYgdGhpcyBpcyBwZXJtaXR0ZWQuPC9QPjwvQk9EWT48L0hUTUw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Yjc0NjguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLWJpbi5pbmNsdWRlcyA9XAotZXBsLXYxMC5odG1sLFwKLWVjbGlwc2VfdXBkYXRlXzEyMC5qcGcsXAotZmVhdHVyZS54bWwsXAotZmVhdHVyZS5wcm9wZXJ0aWVzLFwKLWxpY2Vuc2UuaHRtbAotCi1nZW5lcmF0ZS5mZWF0dXJlQG9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlLnNvdXJjZSA9IG9yZy5lY2xpcHNlLndzdC54bWxfY29yZS5mZWF0dXJlCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmZkZjcwOC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjJhZDI5Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZXBsLXYxMC5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLTxodG1sIHhtbG5zOm89InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOm9mZmljZSIKLXhtbG5zOnc9InVybjpzY2hlbWFzLW1pY3Jvc29mdC1jb206b2ZmaWNlOndvcmQiCi14bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+Ci0KLTxoZWFkPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXdpbmRvd3MtMTI1MiI+Ci08bWV0YSBuYW1lPVByb2dJZCBjb250ZW50PVdvcmQuRG9jdW1lbnQ+Ci08bWV0YSBuYW1lPUdlbmVyYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxtZXRhIG5hbWU9T3JpZ2luYXRvciBjb250ZW50PSJNaWNyb3NvZnQgV29yZCA5Ij4KLTxsaW5rIHJlbD1GaWxlLUxpc3QKLWhyZWY9Ii4vRWNsaXBzZSUyMEVQTCUyMDIwMDNfMTFfMTAlMjBGaW5hbF9maWxlcy9maWxlbGlzdC54bWwiPgotPHRpdGxlPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSBWZXJzaW9uIDEuMDwvdGl0bGU+Ci08IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8bzpEb2N1bWVudFByb3BlcnRpZXM+Ci0gIDxvOlJldmlzaW9uPjI8L286UmV2aXNpb24+Ci0gIDxvOlRvdGFsVGltZT4zPC9vOlRvdGFsVGltZT4KLSAgPG86Q3JlYXRlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpDcmVhdGVkPgotICA8bzpMYXN0U2F2ZWQ+MjAwNC0wMy0wNVQyMzowMzowMFo8L286TGFzdFNhdmVkPgotICA8bzpQYWdlcz40PC9vOlBhZ2VzPgotICA8bzpXb3Jkcz4xNjI2PC9vOldvcmRzPgotICA8bzpDaGFyYWN0ZXJzPjkyNzA8L286Q2hhcmFjdGVycz4KLSAgIDxvOkxpbmVzPjc3PC9vOkxpbmVzPgotICA8bzpQYXJhZ3JhcGhzPjE4PC9vOlBhcmFncmFwaHM+Ci0gIDxvOkNoYXJhY3RlcnNXaXRoU3BhY2VzPjExMzg0PC9vOkNoYXJhY3RlcnNXaXRoU3BhY2VzPgotICA8bzpWZXJzaW9uPjkuNDQwMjwvbzpWZXJzaW9uPgotIDwvbzpEb2N1bWVudFByb3BlcnRpZXM+Ci08L3htbD48IVtlbmRpZl0tLT48IS0tW2lmIGd0ZSBtc28gOV0+PHhtbD4KLSA8dzpXb3JkRG9jdW1lbnQ+Ci0gIDx3OlRyYWNrUmV2aXNpb25zLz4KLSA8L3c6V29yZERvY3VtZW50PgotPC94bWw+PCFbZW5kaWZdLS0+Ci08c3R5bGU+Ci08IS0tCi0gLyogRm9udCBEZWZpbml0aW9ucyAqLwotQGZvbnQtZmFjZQotCXtmb250LWZhbWlseTpUYWhvbWE7Ci0JcGFub3NlLTE6MiAxMSA2IDQgMyA1IDQgNCAyIDQ7Ci0JbXNvLWZvbnQtY2hhcnNldDowOwotCW1zby1nZW5lcmljLWZvbnQtZmFtaWx5OnN3aXNzOwotCW1zby1mb250LXBpdGNoOnZhcmlhYmxlOwotCW1zby1mb250LXNpZ25hdHVyZTo1NTM2Nzk0OTUgLTIxNDc0ODM2NDggOCAwIDY2MDQ3IDA7fQotIC8qIFN0eWxlIERlZmluaXRpb25zICovCi1wLk1zb05vcm1hbCwgbGkuTXNvTm9ybWFsLCBkaXYuTXNvTm9ybWFsCi0Je21zby1zdHlsZS1wYXJlbnQ6IiI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZToxMi4wcHQ7Ci0JZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotcAotCXttYXJnaW4tcmlnaHQ6MGluOwotCW1zby1tYXJnaW4tdG9wLWFsdDphdXRvOwotCW1zby1tYXJnaW4tYm90dG9tLWFsdDphdXRvOwotCW1hcmdpbi1sZWZ0OjBpbjsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wLkJhbGxvb25UZXh0LCBsaS5CYWxsb29uVGV4dCwgZGl2LkJhbGxvb25UZXh0Ci0Je21zby1zdHlsZS1uYW1lOiJCYWxsb29uIFRleHQiOwotCW1hcmdpbjowaW47Ci0JbWFyZ2luLWJvdHRvbTouMDAwMXB0OwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6OC4wcHQ7Ci0JZm9udC1mYW1pbHk6VGFob21hOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLUBwYWdlIFNlY3Rpb24xCi0Je3NpemU6OC41aW4gMTEuMGluOwotCW1hcmdpbjoxLjBpbiAxLjI1aW4gMS4waW4gMS4yNWluOwotCW1zby1oZWFkZXItbWFyZ2luOi41aW47Ci0JbXNvLWZvb3Rlci1tYXJnaW46LjVpbjsKLQltc28tcGFwZXItc291cmNlOjA7fQotZGl2LlNlY3Rpb24xCi0Je3BhZ2U6U2VjdGlvbjE7fQotLS0+Ci08L3N0eWxlPgotPC9oZWFkPgotCi08Ym9keSBsYW5nPUVOLVVTIHN0eWxlPSd0YWItaW50ZXJ2YWw6LjVpbic+Ci0KLTxkaXYgY2xhc3M9U2VjdGlvbjE+Ci0KLTxwIGFsaWduPWNlbnRlciBzdHlsZT0ndGV4dC1hbGlnbjpjZW50ZXInPjxiPkVjbGlwc2UgUHVibGljIExpY2Vuc2UgLSB2IDEuMDwvYj4KLTwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRIRSBBQ0NPTVBBTllJTkcgUFJPR1JBTSBJUyBQUk9WSURFRCBVTkRFUgotVEhFIFRFUk1TIE9GIFRISVMgRUNMSVBTRSBQVUJMSUMgTElDRU5TRSAoJnF1b3Q7QUdSRUVNRU5UJnF1b3Q7KS4gQU5ZIFVTRSwKLVJFUFJPRFVDVElPTiBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gQ09OU1RJVFVURVMgUkVDSVBJRU5UJ1MgQUNDRVBUQU5DRQotT0YgVEhJUyBBR1JFRU1FTlQuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4xLiBERUZJTklUSU9OUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dGlvbiZxdW90OyBtZWFuczo8L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLWluIHRoZSBjYXNlIG9mIHRoZSBpbml0aWFsIENvbnRyaWJ1dG9yLCB0aGUgaW5pdGlhbCBjb2RlIGFuZCBkb2N1bWVudGF0aW9uCi1kaXN0cmlidXRlZCB1bmRlciB0aGlzIEFncmVlbWVudCwgYW5kPGJyIGNsZWFyPWxlZnQ+Ci1iKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWNoYW5nZXMgdG8gdGhlIFByb2dyYW0sIGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtOzwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPndoZXJlCi1zdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbSBhbmQgYXJlIGRpc3RyaWJ1dGVkCi1ieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uICdvcmlnaW5hdGVzJyBmcm9tIGEgQ29udHJpYnV0b3IKLWlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieSBzdWNoIENvbnRyaWJ1dG9yIGl0c2VsZiBvciBhbnlvbmUgYWN0aW5nIG9uCi1zdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLiBDb250cmlidXRpb25zIGRvIG5vdCBpbmNsdWRlIGFkZGl0aW9ucyB0byB0aGUKLVByb2dyYW0gd2hpY2g6IChpKSBhcmUgc2VwYXJhdGUgbW9kdWxlcyBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCBpbiBjb25qdW5jdGlvbgotd2l0aCB0aGUgUHJvZ3JhbSB1bmRlciB0aGVpciBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIGFuZCAoaWkpIGFyZSBub3QgZGVyaXZhdGl2ZQotd29ya3Mgb2YgdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4mcXVvdDtDb250cmlidXRvciZxdW90OyBtZWFucyBhbnkgcGVyc29uIG9yCi1lbnRpdHkgdGhhdCBkaXN0cmlidXRlcyB0aGUgUHJvZ3JhbS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0xpY2Vuc2VkIFBhdGVudHMgJnF1b3Q7IG1lYW4gcGF0ZW50Ci1jbGFpbXMgbGljZW5zYWJsZSBieSBhIENvbnRyaWJ1dG9yIHdoaWNoIGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlIHVzZQotb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lIG9yIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1Byb2dyYW0mcXVvdDsgbWVhbnMgdGhlIENvbnRyaWJ1dGlvbnMKLWRpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzIEFncmVlbWVudC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O1JlY2lwaWVudCZxdW90OyBtZWFucyBhbnlvbmUgd2hvCi1yZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIGFsbCBDb250cmlidXRvcnMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz4yLiBHUkFOVCBPRiBSSUdIVFM8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIFJlY2lwaWVudAotYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQgbGljZW5zZSB0bzxzcGFuCi1zdHlsZT0nY29sb3I6cmVkJz4gPC9zcGFuPnJlcHJvZHVjZSwgcHJlcGFyZSBkZXJpdmF0aXZlIHdvcmtzIG9mLCBwdWJsaWNseQotZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgZGlzdHJpYnV0ZSBhbmQgc3VibGljZW5zZSB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2gKLUNvbnRyaWJ1dG9yLCBpZiBhbnksIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MsIGluIHNvdXJjZSBjb2RlIGFuZCBvYmplY3QgY29kZQotZm9ybS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5iKQotU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cwotUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLDxzcGFuIHN0eWxlPSdjb2xvcjpncmVlbic+IDwvc3Bhbj5yb3lhbHR5LWZyZWUKLXBhdGVudCBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLCBpbXBvcnQKLWFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLCBpZiBhbnksIGluIHNvdXJjZQotY29kZSBhbmQgb2JqZWN0IGNvZGUgZm9ybS4gVGhpcyBwYXRlbnQgbGljZW5zZSBzaGFsbCBhcHBseSB0byB0aGUgY29tYmluYXRpb24KLW9mIHRoZSBDb250cmlidXRpb24gYW5kIHRoZSBQcm9ncmFtIGlmLCBhdCB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkCi1ieSB0aGUgQ29udHJpYnV0b3IsIHN1Y2ggYWRkaXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbgotdG8gYmUgY292ZXJlZCBieSB0aGUgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0bwotYW55IG90aGVyIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcwotbGljZW5zZWQgaGVyZXVuZGVyLiA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5jKQotUmVjaXBpZW50IHVuZGVyc3RhbmRzIHRoYXQgYWx0aG91Z2ggZWFjaCBDb250cmlidXRvciBncmFudHMgdGhlIGxpY2Vuc2VzIHRvIGl0cwotQ29udHJpYnV0aW9ucyBzZXQgZm9ydGggaGVyZWluLCBubyBhc3N1cmFuY2VzIGFyZSBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IKLXRoYXQgdGhlIFByb2dyYW0gZG9lcyBub3QgaW5mcmluZ2UgdGhlIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkKLXJpZ2h0cyBvZiBhbnkgb3RoZXIgZW50aXR5LiBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudAotZm9yIGNsYWltcyBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAotcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUgcmlnaHRzIGFuZAotbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieSBhc3N1bWVzIHNvbGUgcmVzcG9uc2liaWxpdHkKLXRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyBuZWVkZWQsIGlmIGFueS4gRm9yIGV4YW1wbGUsCi1pZiBhIHRoaXJkIHBhcnR5IHBhdGVudCBsaWNlbnNlIGlzIHJlcXVpcmVkIHRvIGFsbG93IFJlY2lwaWVudCB0byBkaXN0cmlidXRlCi10aGUgUHJvZ3JhbSwgaXQgaXMgUmVjaXBpZW50J3MgcmVzcG9uc2liaWxpdHkgdG8gYWNxdWlyZSB0aGF0IGxpY2Vuc2UgYmVmb3JlCi1kaXN0cmlidXRpbmcgdGhlIFByb2dyYW0uPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+ZCkKLUVhY2ggQ29udHJpYnV0b3IgcmVwcmVzZW50cyB0aGF0IHRvIGl0cyBrbm93bGVkZ2UgaXQgaGFzIHN1ZmZpY2llbnQgY29weXJpZ2h0Ci1yaWdodHMgaW4gaXRzIENvbnRyaWJ1dGlvbiwgaWYgYW55LCB0byBncmFudCB0aGUgY29weXJpZ2h0IGxpY2Vuc2Ugc2V0IGZvcnRoIGluCi10aGlzIEFncmVlbWVudC4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjMuIFJFUVVJUkVNRU5UUzwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkEgQ29udHJpYnV0b3IgbWF5IGNob29zZSB0byBkaXN0cmlidXRlIHRoZQotUHJvZ3JhbSBpbiBvYmplY3QgY29kZSBmb3JtIHVuZGVyIGl0cyBvd24gbGljZW5zZSBhZ3JlZW1lbnQsIHByb3ZpZGVkIHRoYXQ6PC9zcGFuPgotPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgY29tcGxpZXMgd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQ7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1pdHMgbGljZW5zZSBhZ3JlZW1lbnQ6PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aSkKLWVmZmVjdGl2ZWx5IGRpc2NsYWltcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgd2FycmFudGllcyBhbmQKLWNvbmRpdGlvbnMsIGV4cHJlc3MgYW5kIGltcGxpZWQsIGluY2x1ZGluZyB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgdGl0bGUKLWFuZCBub24taW5mcmluZ2VtZW50LCBhbmQgaW1wbGllZCB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMgb2YgbWVyY2hhbnRhYmlsaXR5Ci1hbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2U7IDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmlpKQotZWZmZWN0aXZlbHkgZXhjbHVkZXMgb24gYmVoYWxmIG9mIGFsbCBDb250cmlidXRvcnMgYWxsIGxpYWJpbGl0eSBmb3IgZGFtYWdlcywKLWluY2x1ZGluZyBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIGFuZCBjb25zZXF1ZW50aWFsIGRhbWFnZXMsIHN1Y2gKLWFzIGxvc3QgcHJvZml0czsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWlpKQotc3RhdGVzIHRoYXQgYW55IHByb3Zpc2lvbnMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBBZ3JlZW1lbnQgYXJlIG9mZmVyZWQgYnkgdGhhdAotQ29udHJpYnV0b3IgYWxvbmUgYW5kIG5vdCBieSBhbnkgb3RoZXIgcGFydHk7IGFuZDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPml2KQotc3RhdGVzIHRoYXQgc291cmNlIGNvZGUgZm9yIHRoZSBQcm9ncmFtIGlzIGF2YWlsYWJsZSBmcm9tIHN1Y2ggQ29udHJpYnV0b3IsIGFuZAotaW5mb3JtcyBsaWNlbnNlZXMgaG93IHRvIG9idGFpbiBpdCBpbiBhIHJlYXNvbmFibGUgbWFubmVyIG9uIG9yIHRocm91Z2ggYQotbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGV4Y2hhbmdlLjxzcGFuIHN0eWxlPSdjb2xvcjpibHVlJz4gPC9zcGFuPjwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5XaGVuIHRoZSBQcm9ncmFtIGlzIG1hZGUgYXZhaWxhYmxlIGluIHNvdXJjZQotY29kZSBmb3JtOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaXQgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGlzIEFncmVlbWVudDsgYW5kIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpIGEKLWNvcHkgb2YgdGhpcyBBZ3JlZW1lbnQgbXVzdCBiZSBpbmNsdWRlZCB3aXRoIGVhY2ggY29weSBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbnRyaWJ1dG9ycyBtYXkgbm90IHJlbW92ZSBvciBhbHRlciBhbnkKLWNvcHlyaWdodCBub3RpY2VzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0uIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FYWNoIENvbnRyaWJ1dG9yIG11c3QgaWRlbnRpZnkgaXRzZWxmIGFzIHRoZQotb3JpZ2luYXRvciBvZiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIGluIGEgbWFubmVyIHRoYXQgcmVhc29uYWJseSBhbGxvd3MKLXN1YnNlcXVlbnQgUmVjaXBpZW50cyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgQ29udHJpYnV0aW9uLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+NC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT048L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5Db21tZXJjaWFsIGRpc3RyaWJ1dG9ycyBvZiBzb2Z0d2FyZSBtYXkKLWFjY2VwdCBjZXJ0YWluIHJlc3BvbnNpYmlsaXRpZXMgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMKLWFuZCB0aGUgbGlrZS4gV2hpbGUgdGhpcyBsaWNlbnNlIGlzIGludGVuZGVkIHRvIGZhY2lsaXRhdGUgdGhlIGNvbW1lcmNpYWwgdXNlCi1vZiB0aGUgUHJvZ3JhbSwgdGhlIENvbnRyaWJ1dG9yIHdobyBpbmNsdWRlcyB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKLXByb2R1Y3Qgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKLWxpYWJpbGl0eSBmb3Igb3RoZXIgQ29udHJpYnV0b3JzLiBUaGVyZWZvcmUsIGlmIGEgQ29udHJpYnV0b3IgaW5jbHVkZXMgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBzdWNoIENvbnRyaWJ1dG9yICgmcXVvdDtDb21tZXJjaWFsCi1Db250cmlidXRvciZxdW90OykgaGVyZWJ5IGFncmVlcyB0byBkZWZlbmQgYW5kIGluZGVtbmlmeSBldmVyeSBvdGhlcgotQ29udHJpYnV0b3IgKCZxdW90O0luZGVtbmlmaWVkIENvbnRyaWJ1dG9yJnF1b3Q7KSBhZ2FpbnN0IGFueSBsb3NzZXMsIGRhbWFnZXMgYW5kCi1jb3N0cyAoY29sbGVjdGl2ZWx5ICZxdW90O0xvc3NlcyZxdW90OykgYXJpc2luZyBmcm9tIGNsYWltcywgbGF3c3VpdHMgYW5kIG90aGVyCi1sZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciB0bwotdGhlIGV4dGVudCBjYXVzZWQgYnkgdGhlIGFjdHMgb3Igb21pc3Npb25zIG9mIHN1Y2ggQ29tbWVyY2lhbCBDb250cmlidXRvciBpbgotY29ubmVjdGlvbiB3aXRoIGl0cyBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3QKLW9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdCBhcHBseSB0byBhbnkgY2xhaW1zIG9yIExvc3NlcwotcmVsYXRpbmcgdG8gYW55IGFjdHVhbCBvciBhbGxlZ2VkIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyCi10byBxdWFsaWZ5LCBhbiBJbmRlbW5pZmllZCBDb250cmlidXRvciBtdXN0OiBhKSBwcm9tcHRseSBub3RpZnkgdGhlIENvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yIGluIHdyaXRpbmcgb2Ygc3VjaCBjbGFpbSwgYW5kIGIpIGFsbG93IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yCi10byBjb250cm9sLCBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZAotYW55IHJlbGF0ZWQgc2V0dGxlbWVudCBuZWdvdGlhdGlvbnMuIFRoZSBJbmRlbW5pZmllZCBDb250cmlidXRvciBtYXkgcGFydGljaXBhdGUKLWluIGFueSBzdWNoIGNsYWltIGF0IGl0cyBvd24gZXhwZW5zZS48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkZvciBleGFtcGxlLCBhIENvbnRyaWJ1dG9yIG1pZ2h0IGluY2x1ZGUgdGhlCi1Qcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yLiBJZiB0aGF0IENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdGhlbiBtYWtlcyBwZXJmb3JtYW5jZQotY2xhaW1zLCBvciBvZmZlcnMgd2FycmFudGllcyByZWxhdGVkIHRvIFByb2R1Y3QgWCwgdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZAotd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkgYWxvbmUuIFVuZGVyIHRoaXMKLXNlY3Rpb24sIHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHdvdWxkIGhhdmUgdG8gZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZQotb3RoZXIgQ29udHJpYnV0b3JzIHJlbGF0ZWQgdG8gdGhvc2UgcGVyZm9ybWFuY2UgY2xhaW1zIGFuZCB3YXJyYW50aWVzLCBhbmQgaWYgYQotY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvIHBheSBhbnkgZGFtYWdlcyBhcyBhIHJlc3VsdCwgdGhlCi1Db21tZXJjaWFsIENvbnRyaWJ1dG9yIG11c3QgcGF5IHRob3NlIGRhbWFnZXMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz41LiBOTyBXQVJSQU5UWTwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVYQ0VQVCBBUyBFWFBSRVNTTFkgU0VUIEZPUlRIIElOIFRISVMKLUFHUkVFTUVOVCwgVEhFIFBST0dSQU0gSVMgUFJPVklERUQgT04gQU4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsIFdJVEhPVVQKLVdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1MgT1IgSU1QTElFRCBJTkNMVURJTkcsCi1XSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsCi1NRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseQotcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZSBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgYW5kIGRpc3RyaWJ1dGluZyB0aGUKLVByb2dyYW0gYW5kIGFzc3VtZXMgYWxsIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBpdHMgZXhlcmNpc2Ugb2YgcmlnaHRzIHVuZGVyIHRoaXMKLUFncmVlbWVudCAsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIHJpc2tzIGFuZCBjb3N0cyBvZiBwcm9ncmFtIGVycm9ycywKLWNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zIG9yCi1lcXVpcG1lbnQsIGFuZCB1bmF2YWlsYWJpbGl0eSBvciBpbnRlcnJ1cHRpb24gb2Ygb3BlcmF0aW9ucy4gPC9zcGFuPjwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjYuIERJU0NMQUlNRVIgT0YgTElBQklMSVRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUyBTSEFMTCBIQVZFIEFOWSBMSUFCSUxJVFkgRk9SCi1BTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKLShJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIExPU1QgUFJPRklUUyksIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZCi1PRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORwotTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YKLVRIRSBQUk9HUkFNIE9SIFRIRSBFWEVSQ0lTRSBPRiBBTlkgUklHSFRTIEdSQU5URUQgSEVSRVVOREVSLCBFVkVOIElGIEFEVklTRUQgT0YKLVRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuPC9zcGFuPiA8L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz43LiBHRU5FUkFMPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgYW55IHByb3Zpc2lvbiBvZiB0aGlzIEFncmVlbWVudCBpcyBpbnZhbGlkCi1vciB1bmVuZm9yY2VhYmxlIHVuZGVyIGFwcGxpY2FibGUgbGF3LCBpdCBzaGFsbCBub3QgYWZmZWN0IHRoZSB2YWxpZGl0eSBvcgotZW5mb3JjZWFiaWxpdHkgb2YgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0Ci1mdXJ0aGVyIGFjdGlvbiBieSB0aGUgcGFydGllcyBoZXJldG8sIHN1Y2ggcHJvdmlzaW9uIHNoYWxsIGJlIHJlZm9ybWVkIHRvIHRoZQotbWluaW11bSBleHRlbnQgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VjaCBwcm92aXNpb24gdmFsaWQgYW5kIGVuZm9yY2VhYmxlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+SWYgUmVjaXBpZW50IGluc3RpdHV0ZXMgcGF0ZW50IGxpdGlnYXRpb24KLWFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkKLWFsbGVnaW5nIHRoYXQgdGhlIFByb2dyYW0gaXRzZWxmIChleGNsdWRpbmcgY29tYmluYXRpb25zIG9mIHRoZSBQcm9ncmFtIHdpdGgKLW90aGVyIHNvZnR3YXJlIG9yIGhhcmR3YXJlKSBpbmZyaW5nZXMgc3VjaCBSZWNpcGllbnQncyBwYXRlbnQocyksIHRoZW4gc3VjaAotUmVjaXBpZW50J3MgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZQotc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QWxsIFJlY2lwaWVudCdzIHJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudAotc2hhbGwgdGVybWluYXRlIGlmIGl0IGZhaWxzIHRvIGNvbXBseSB3aXRoIGFueSBvZiB0aGUgbWF0ZXJpYWwgdGVybXMgb3IKLWNvbmRpdGlvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZQotcGVyaW9kIG9mIHRpbWUgYWZ0ZXIgYmVjb21pbmcgYXdhcmUgb2Ygc3VjaCBub25jb21wbGlhbmNlLiBJZiBhbGwgUmVjaXBpZW50J3MKLXJpZ2h0cyB1bmRlciB0aGlzIEFncmVlbWVudCB0ZXJtaW5hdGUsIFJlY2lwaWVudCBhZ3JlZXMgdG8gY2Vhc2UgdXNlIGFuZAotZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4gSG93ZXZlciwKLVJlY2lwaWVudCdzIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFuZCBhbnkgbGljZW5zZXMgZ3JhbnRlZCBieQotUmVjaXBpZW50IHJlbGF0aW5nIHRvIHRoZSBQcm9ncmFtIHNoYWxsIGNvbnRpbnVlIGFuZCBzdXJ2aXZlLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUKLWNvcGllcyBvZiB0aGlzIEFncmVlbWVudCwgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcwotY29weXJpZ2h0ZWQgYW5kIG1heSBvbmx5IGJlIG1vZGlmaWVkIGluIHRoZSBmb2xsb3dpbmcgbWFubmVyLiBUaGUgQWdyZWVtZW50Ci1TdGV3YXJkIHJlc2VydmVzIHRoZSByaWdodCB0byBwdWJsaXNoIG5ldyB2ZXJzaW9ucyAoaW5jbHVkaW5nIHJldmlzaW9ucykgb2YKLXRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgaGFzCi10aGUgcmlnaHQgdG8gbW9kaWZ5IHRoaXMgQWdyZWVtZW50LiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIHRoZSBpbml0aWFsCi1BZ3JlZW1lbnQgU3Rld2FyZC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYXkgYXNzaWduIHRoZSByZXNwb25zaWJpbGl0eSB0bwotc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUgZW50aXR5LiBFYWNoIG5ldyB2ZXJzaW9uCi1vZiB0aGUgQWdyZWVtZW50IHdpbGwgYmUgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0KLShpbmNsdWRpbmcgQ29udHJpYnV0aW9ucykgbWF5IGFsd2F5cyBiZSBkaXN0cmlidXRlZCBzdWJqZWN0IHRvIHRoZSB2ZXJzaW9uIG9mCi10aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcyByZWNlaXZlZC4gSW4gYWRkaXRpb24sIGFmdGVyIGEgbmV3IHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgaXMgcHVibGlzaGVkLCBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQotKGluY2x1ZGluZyBpdHMgQ29udHJpYnV0aW9ucykgdW5kZXIgdGhlIG5ldyB2ZXJzaW9uLiBFeGNlcHQgYXMgZXhwcmVzc2x5IHN0YXRlZAotaW4gU2VjdGlvbnMgMihhKSBhbmQgMihiKSBhYm92ZSwgUmVjaXBpZW50IHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0bwotdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBvZiBhbnkgQ29udHJpYnV0b3IgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIHdoZXRoZXIKLWV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sIGVzdG9wcGVsIG9yIG90aGVyd2lzZS4gQWxsIHJpZ2h0cyBpbiB0aGUgUHJvZ3JhbSBub3QKLWV4cHJlc3NseSBncmFudGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC48L3NwYW4+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPlRoaXMgQWdyZWVtZW50IGlzIGdvdmVybmVkIGJ5IHRoZSBsYXdzIG9mIHRoZQotU3RhdGUgb2YgTmV3IFlvcmsgYW5kIHRoZSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgbGF3cyBvZiB0aGUgVW5pdGVkIFN0YXRlcyBvZgotQW1lcmljYS4gTm8gcGFydHkgdG8gdGhpcyBBZ3JlZW1lbnQgd2lsbCBicmluZyBhIGxlZ2FsIGFjdGlvbiB1bmRlciB0aGlzCi1BZ3JlZW1lbnQgbW9yZSB0aGFuIG9uZSB5ZWFyIGFmdGVyIHRoZSBjYXVzZSBvZiBhY3Rpb24gYXJvc2UuIEVhY2ggcGFydHkgd2FpdmVzCi1pdHMgcmlnaHRzIHRvIGEganVyeSB0cmlhbCBpbiBhbnkgcmVzdWx0aW5nIGxpdGlnYXRpb24uPC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbD48IVtpZiAhc3VwcG9ydEVtcHR5UGFyYXNdPiZuYnNwOzwhW2VuZGlmXT48bzpwPjwvbzpwPjwvcD4KLQotPC9kaXY+Ci0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhZDc2Mi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwMCwgMjAwNSBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgVUkgRGV2ZWxvcGVyIFJlc291cmNlcwotCi0jICJwcm92aWRlck5hbWUiIHByb3BlcnR5IC0gbmFtZSBvZiB0aGUgY29tcGFueSB0aGF0IHByb3ZpZGVzIHRoZSBmZWF0dXJlCi1wcm92aWRlck5hbWU9RWNsaXBzZS5vcmcKLQotIyAidXBkYXRlU2l0ZU5hbWUiIHByb3BlcnR5IC0gbGFiZWwgZm9yIHRoZSB1cGRhdGUgc2l0ZQotdXBkYXRlU2l0ZU5hbWU9VGhlIEVjbGlwc2UgV2ViIFRvb2xzIFBsYXRmb3JtIChXVFApIFByb2plY3QgdXBkYXRlIHNpdGUKLQotIyAiZGVzY3JpcHRpb24iIHByb3BlcnR5IC0gZGVzY3JpcHRpb24gb2YgdGhlIGZlYXR1cmUKLWRlc2NyaXB0aW9uPVNvdXJjZSBjb2RlIHppcHMgZm9yIFdTVCBYTUwgVUkuCi0KLSMgImNvcHlyaWdodCIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgQ29weXJpZ2h0IgotY29weXJpZ2h0PVwKLUNvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy5cblwKLUFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHNcblwKLWFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMFxuXAotd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcblwKLWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sXG5cCi1cblwKLUNvbnRyaWJ1dG9yczpcblwKLSAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb25cbgotIyMjIyMjIyMjIyMjIyMjIyBlbmQgb2YgY29weXJpZ2h0IHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jICJsaWNlbnNlVVJMIiBwcm9wZXJ0eSAtIFVSTCBvZiB0aGUgIkZlYXR1cmUgTGljZW5zZSIKLSMgZG8gbm90IHRyYW5zbGF0ZSB2YWx1ZSAtIGp1c3QgY2hhbmdlIHRvIHBvaW50IHRvIGEgbG9jYWxlLXNwZWNpZmljIEhUTUwgcGFnZQotbGljZW5zZVVSTD1saWNlbnNlLmh0bWwKLQotIyAibGljZW5zZSIgcHJvcGVydHkgLSB0ZXh0IG9mIHRoZSAiRmVhdHVyZSBVcGRhdGUgTGljZW5zZSIKLSMgc2hvdWxkIGJlIHBsYWluIHRleHQgdmVyc2lvbiBvZiBsaWNlbnNlIGFncmVlbWVudCBwb2ludGVkIHRvIGJlICJsaWNlbnNlVVJMIgotbGljZW5zZT1cCi1FQ0xJUFNFIEZPVU5EQVRJT04gU09GVFdBUkUgVVNFUiBBR1JFRU1FTlRcblwKLU1hcmNoIDE3LCAyMDA1XG5cCi1cblwKLVVzYWdlIE9mIENvbnRlbnRcblwKLVxuXAotVEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIEFORC9PUlxuXAotT1RIRVIgTUFURVJJQUxTIEZPUiBPUEVOIFNPVVJDRSBQUk9KRUNUUyAoQ09MTEVDVElWRUxZICJDT05URU5UIikuXG5cCi1VU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVNcblwKLUFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUlxuXAotTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVVxuXAotQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVFxuXAotQU5EL09SIFRIRSBURVJNUyBBTkQgQ09ORElUSU9OUyBPRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFNcblwKLU9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1cuIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFXG5cCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TXG5cCi1PRiBBTlkgQVBQTElDQUJMRSBMSUNFTlNFIEFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRFxuXAotQkVMT1csIFRIRU4gWU9VIE1BWSBOT1QgVVNFIFRIRSBDT05URU5ULlxuXAotXG5cCi1BcHBsaWNhYmxlIExpY2Vuc2VzXG5cCi1cblwKLVVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkLCBhbGwgQ29udGVudCBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uXG5cCi1pcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIFB1YmxpY1xuXAotTGljZW5zZSBWZXJzaW9uIDEuMCAoIkVQTCIpLiBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXNcblwKLUNvbnRlbnQgYW5kIGlzIGFsc28gYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sLlxuXAotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICJQcm9ncmFtIiB3aWxsIG1lYW4gdGhlIENvbnRlbnQuXG5cCi1cblwKLUNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLFxuXAotZG9jdW1lbnRhdGlvbiBhbmQgb3RoZXIgZmlsZXMgbWFpbnRhaW5lZCBpbiB0aGUgRWNsaXBzZS5vcmcgQ1ZTXG5cCi1yZXBvc2l0b3J5ICgiUmVwb3NpdG9yeSIpIGluIENWUyBtb2R1bGVzICgiTW9kdWxlcyIpIGFuZCBtYWRlIGF2YWlsYWJsZVxuXAotYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgiRG93bmxvYWRzIikuXG5cCi1cblwKLSAgIC0gQ29udGVudCBtYXkgYmUgc3RydWN0dXJlZCBhbmQgcGFja2FnZWQgaW50byBtb2R1bGVzIHRvIGZhY2lsaXRhdGUgZGVsaXZlcmluZyxcblwKLSAgICAgZXh0ZW5kaW5nLCBhbmQgdXBncmFkaW5nIHRoZSBDb250ZW50LiBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCJQbHVnLWlucyIpLFxuXAotICAgICBwbHVnLWluIGZyYWdtZW50cyAoIkZyYWdtZW50cyIpLCBhbmQgZmVhdHVyZXMgKCJGZWF0dXJlcyIpLlxuXAotICAgLSBFYWNoIFBsdWctaW4gb3IgRnJhZ21lbnQgbWF5IGJlIHBhY2thZ2VkIGFzIGEgc3ViLWRpcmVjdG9yeSBvciBKQVIgKEphdmE/IEFSY2hpdmUpXG5cCi0gICAgIGluIGEgZGlyZWN0b3J5IG5hbWVkICJwbHVnaW5zIi5cblwKLSAgIC0gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYW5kIGFzc29jaWF0ZWQgbWF0ZXJpYWwuXG5cCi0gICAgIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICJmZWF0dXJlcyIuXG5cCi0gICAgIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvblxuXAotICAgICBudW1iZXJzIG9mIHRoZSBQbHVnLWlucyBhbmQvb3IgRnJhZ21lbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IEZlYXR1cmUuXG5cCi0gICAtIEZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCJJbmNsdWRlZCBGZWF0dXJlcyIpLiBXaXRoaW4gYSBGZWF0dXJlLCBmaWxlc1xuXAotICAgICBuYW1lZCAiZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiBJbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkXG5cCi0iZmVhdHVyZS54bWwiIG1heSBjb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZlxuXAotSW5jbHVkZWQgRmVhdHVyZXMuXG5cCi1cblwKLVRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBzaG91bGQgYmVcblwKLWNvbnRhaW5lZCBpbiBmaWxlcyBuYW1lZCAiYWJvdXQuaHRtbCIgKCJBYm91dHMiKS4gVGhlIHRlcm1zIGFuZFxuXAotY29uZGl0aW9ucyBnb3Zlcm5pbmcgRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWRcblwKLWluIGZpbGVzIG5hbWVkICJsaWNlbnNlLmh0bWwiICgiRmVhdHVyZSBMaWNlbnNlcyIpLiBBYm91dHMgYW5kIEZlYXR1cmVcblwKLUxpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSBkaXJlY3Rvcnkgb2YgYSBEb3dubG9hZCBvciBNb2R1bGVcblwKLWluY2x1ZGluZywgYnV0IG5vdCBsaW1pdGVkIHRvIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOlxuXAotXG5cCi0gICAtIFRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeVxuXAotICAgLSBQbHVnLWluIGFuZCBGcmFnbWVudCBkaXJlY3Rvcmllc1xuXAotICAgLSBJbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzXG5cCi0gICAtIFN1Yi1kaXJlY3RvcmllcyBvZiB0aGUgZGlyZWN0b3J5IG5hbWVkICJzcmMiIG9mIGNlcnRhaW4gUGx1Zy1pbnNcblwKLSAgIC0gRmVhdHVyZSBkaXJlY3Rvcmllc1xuXAotXG5cCi1Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgdXNpbmcgdGhlXG5cCi1FY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCJGZWF0dXJlIFVwZGF0ZVxuXAotTGljZW5zZSIpIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uIHByb2Nlc3MuIElmIHRoZSBGZWF0dXJlIGNvbnRhaW5zXG5cCi1JbmNsdWRlZCBGZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdVxuXAotd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvciBpbmZvcm1cblwKLXlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBtYXkgYmUgZm91bmQgaW5cblwKLXRoZSAibGljZW5zZSIgcHJvcGVydHkgb2YgZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLFxuXAotRmVhdHVyZSBMaWNlbnNlcyBhbmQgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgY29udGFpbiB0aGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgYW5kIGNvbmRpdGlvbnMpIHRoYXQgZ292ZXJuIHlvdXJcblwKLXVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluIHRoYXQgZGlyZWN0b3J5LlxuXAotXG5cCi1USEUgQUJPVVRTLCBGRUFUVVJFIExJQ0VOU0VTIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVJcblwKLVRPIFRIRSBFUEwgT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLlxuXAotU09NRSBPRiBUSEVTRSBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOlxuXAotXG5cCi0gICAgLSBDb21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbClcblwKLSAgICAtIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wKVxuXAotICAgIC0gSUJNIFB1YmxpYyBMaWNlbnNlIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sKVxuXAotICAgIC0gTWV0cm8gTGluayBQdWJsaWMgTGljZW5zZSAxLjAwIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWwpXG5cCi0gICAgLSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tb3ppbGxhLm9yZy9NUEwvTVBMLTEuMS5odG1sKVxuXAotXG5cCi1JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SXG5cCi1UTyBVU0UgT0YgVEhFIENPTlRFTlQuIElmIG5vIEFib3V0LCBGZWF0dXJlIExpY2Vuc2Ugb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZVxuXAotaXMgcHJvdmlkZWQsIHBsZWFzZSBjb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnNcblwKLWdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC5cblwKLVxuXAotQ3J5cHRvZ3JhcGh5XG5cCi1cblwKLUNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZVxuXAotY3VycmVudGx5IG1heSBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBhbmQgdXNlLFxuXAotYW5kL29yIHJlLWV4cG9ydCB0byBhbm90aGVyIGNvdW50cnksIG9mIGVuY3J5cHRpb24gc29mdHdhcmUuIEJFRk9SRVxuXAotdXNpbmcgYW55IGVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsXG5cCi1yZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LCBwb3NzZXNzaW9uLCBvciB1c2UsXG5cCi1hbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC5cblwKLVxuXAotSmF2YSBhbmQgYWxsIEphdmEtYmFzZWQgdHJhZGVtYXJrcyBhcmUgdHJhZGVtYXJrcyBvZiBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIGluIHRoZSBVbml0ZWQgU3RhdGVzLCBvdGhlciBjb3VudHJpZXMsIG9yIGJvdGguXG4KLSMjIyMjIyMjIyMjIGVuZCBvZiBsaWNlbnNlIHByb3BlcnR5ICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvZmVhdHVyZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZWFlMGUuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlRmVhdHVyZS9mZWF0dXJlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08ZmVhdHVyZQotICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS5zb3VyY2UiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS42LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9IiVsaWNlbnNlVVJMIj4KLSAgICAgICVsaWNlbnNlCi0gICA8L2xpY2Vuc2U+Ci0KLSAgIDx1cmw+Ci0gICAgICA8dXBkYXRlIGxhYmVsPSIldXBkYXRlU2l0ZU5hbWUiIHVybD0iaHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3dlYnRvb2xzL3VwZGF0ZXMvIi8+Ci0gICA8L3VybD4KLQotICAgPGluY2x1ZGVzCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF9jb3JlLmZlYXR1cmUiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHNlYXJjaC1sb2NhdGlvbj0iYm90aCIvPgotCi0gICA8aW5jbHVkZXMKLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueG1sX2NvcmUuZmVhdHVyZS5zb3VyY2UiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHNlYXJjaC1sb2NhdGlvbj0iYm90aCIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlLnNvdXJjZSIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVGZWF0dXJlL2xpY2Vuc2UuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmFmOTY2Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZUZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMC8vRU4iPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTx0aXRsZT5FY2xpcHNlLm9yZyBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9IkVOLVVTIiBsaW5rPWJsdWUgdmxpbms9cHVycGxlPgotPGgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvaDI+Ci08cD5NYXJjaCAxNywgMjAwNTwvcD4KLQotPGgzPlVzYWdlIE9mIENvbnRlbnQ8L2gzPgotCi08cD5USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMKLSAgIChDT0xMRUNUSVZFTFkgJnF1b3Q7Q09OVEVOVCZxdW90OykuICBVU0UgT0YgVEhFIENPTlRFTlQgSVMgR09WRVJORUQgQlkgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiAgQlkgVVNJTkcgVEhFIENPTlRFTlQsIFlPVSBBR1JFRSBUSEFUIFlPVVIgVVNFCi0gICBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSElTIEFHUkVFTUVOVCBBTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUgotICAgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gIElGIFlPVSBETyBOT1QgQUdSRUUgVE8gVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5ECi0gICBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLCBUSEVOIFlPVSBNQVkgTk9UIFVTRSBUSEUgQ09OVEVOVC48L3A+Ci0gICAKLTxoMz5BcHBsaWNhYmxlIExpY2Vuc2VzPC9oMz4gICAKLSAgIAotPHA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgcHJvdmlkZWQgdG8geW91IHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMAotICAgKCZxdW90O0VQTCZxdW90OykuICBBIGNvcHkgb2YgdGhlIEVQTCBpcyBwcm92aWRlZCB3aXRoIHRoaXMgQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sPC9hPi4KLSAgIEZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAmcXVvdDtQcm9ncmFtJnF1b3Q7IHdpbGwgbWVhbiB0aGUgQ29udGVudC48L3A+Ci0KLTxwPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCBkb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlMgcmVwb3NpdG9yeSAoJnF1b3Q7UmVwb3NpdG9yeSZxdW90OykgaW4gQ1ZTCi0gICBtb2R1bGVzICgmcXVvdDtNb2R1bGVzJnF1b3Q7KSBhbmQgbWFkZSBhdmFpbGFibGUgYXMgZG93bmxvYWRhYmxlIGFyY2hpdmVzICgmcXVvdDtEb3dubG9hZHMmcXVvdDspLjwvcD4KLSAgIAotPHVsPgotCTxsaT5Db250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLCBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuICBUeXBpY2FsIG1vZHVsZXMgbWF5IGluY2x1ZGUgcGx1Zy1pbnMgKCZxdW90O1BsdWctaW5zJnF1b3Q7KSwgcGx1Zy1pbiBmcmFnbWVudHMgKCZxdW90O0ZyYWdtZW50cyZxdW90OyksIGFuZCBmZWF0dXJlcyAoJnF1b3Q7RmVhdHVyZXMmcXVvdDspLjwvbGk+Ci0JPGxpPkVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YSZ0cmFkZTsgQVJjaGl2ZSkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7cGx1Z2lucyZxdW90Oy48L2xpPgotCTxsaT5BIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gIEVhY2ggRmVhdHVyZSBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IGluIGEgZGlyZWN0b3J5IG5hbWVkICZxdW90O2ZlYXR1cmVzJnF1b3Q7LiAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIHRoZSBQbHVnLWlucwotICAgICAgYW5kL29yIEZyYWdtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCBGZWF0dXJlLjwvbGk+Ci0JPGxpPkZlYXR1cmVzIG1heSBhbHNvIGluY2x1ZGUgb3RoZXIgRmVhdHVyZXMgKCZxdW90O0luY2x1ZGVkIEZlYXR1cmVzJnF1b3Q7KS4gV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgJnF1b3Q7ZmVhdHVyZS54bWwmcXVvdDsgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLjwvbGk+Ci08L3VsPiAgIAotIAotPHA+VGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KS4gVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQKLUluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgJnF1b3Q7bGljZW5zZS5odG1sJnF1b3Q7ICgmcXVvdDtGZWF0dXJlIExpY2Vuc2VzJnF1b3Q7KS4gIEFib3V0cyBhbmQgRmVhdHVyZSBMaWNlbnNlcyBtYXkgYmUgbG9jYXRlZCBpbiBhbnkgZGlyZWN0b3J5IG9mIGEgRG93bmxvYWQgb3IgTW9kdWxlCi1pbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczo8L3A+Ci0KLTx1bD4KLQk8bGk+VGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5PC9saT4KLQk8bGk+UGx1Zy1pbiBhbmQgRnJhZ21lbnQgZGlyZWN0b3JpZXM8L2xpPgotCTxsaT5JbnNpZGUgUGx1Zy1pbnMgYW5kIEZyYWdtZW50cyBwYWNrYWdlZCBhcyBKQVJzPC9saT4KLQk8bGk+U3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgJnF1b3Q7c3JjJnF1b3Q7IG9mIGNlcnRhaW4gUGx1Zy1pbnM8L2xpPgotCTxsaT5GZWF0dXJlIGRpcmVjdG9yaWVzPC9saT4KLTwvdWw+Ci0JCQotPHA+Tm90ZTogaWYgYSBGZWF0dXJlIG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgaW5zdGFsbGVkIHVzaW5nIHRoZSBFY2xpcHNlIFVwZGF0ZSBNYW5hZ2VyLCB5b3UgbXVzdCBhZ3JlZSB0byBhIGxpY2Vuc2UgKCZxdW90O0ZlYXR1cmUgVXBkYXRlIExpY2Vuc2UmcXVvdDspIGR1cmluZyB0aGUKLWluc3RhbGxhdGlvbiBwcm9jZXNzLiAgSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgRmVhdHVyZXMsIHRoZSBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIHNob3VsZCBlaXRoZXIgcHJvdmlkZSB5b3Ugd2l0aCB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIHRoZSBJbmNsdWRlZCBGZWF0dXJlcyBvcgotaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIGxvY2F0ZSB0aGVtLiAgRmVhdHVyZSBVcGRhdGUgTGljZW5zZXMgbWF5IGJlIGZvdW5kIGluIHRoZSAmcXVvdDtsaWNlbnNlJnF1b3Q7IHByb3BlcnR5IG9mIGZpbGVzIG5hbWVkICZxdW90O2ZlYXR1cmUucHJvcGVydGllcyZxdW90OyBmb3VuZCB3aXRoaW4gYSBGZWF0dXJlLgotU3VjaCBBYm91dHMsIEZlYXR1cmUgTGljZW5zZXMsIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyAob3IgcmVmZXJlbmNlcyB0byBzdWNoIHRlcm1zIGFuZCBjb25kaXRpb25zKSB0aGF0IGdvdmVybiB5b3VyIHVzZSBvZiB0aGUgYXNzb2NpYXRlZCBDb250ZW50IGluCi10aGF0IGRpcmVjdG9yeS48L3A+Ci0KLTxwPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMsIEFORCBGRUFUVVJFIFVQREFURSBMSUNFTlNFUyBNQVkgUkVGRVIgVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuICBTT01FIE9GIFRIRVNFCi1PVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMgTUFZIElOQ0xVREUgKEJVVCBBUkUgTk9UIExJTUlURUQgVE8pOjwvcD4KLQotPHVsPgotCTxsaT5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2NwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRTwvYT4pPC9saT4KLQk8bGk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjA8L2E+KTwvbGk+Ci0JPGxpPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vb3NzLnNvZnR3YXJlLmlibS5jb20vZGV2ZWxvcGVyd29ya3Mvb3BlbnNvdXJjZS9saWNlbnNlMTAuaHRtbCI+aHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWw8L2E+KTwvbGk+CQotCTxsaT5NZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L2E+KTwvbGk+Ci0JPGxpPk1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvYT4pPC9saT4KLTwvdWw+Ci0KLTxwPklUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1IgVE8gVVNFIE9GIFRIRSBDT05URU5ULiAgSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSwgb3IgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBpcyBwcm92aWRlZCwgcGxlYXNlCi1jb250YWN0IHRoZSBFY2xpcHNlIEZvdW5kYXRpb24gdG8gZGV0ZXJtaW5lIHdoYXQgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LjwvcD4KLQotPGgzPkNyeXB0b2dyYXBoeTwvaDM+Ci0KLTxwPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSBjdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsIGFuZC9vciByZS1leHBvcnQgdG8KLSAgIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSBlbmNyeXB0aW9uIHNvZnR3YXJlLCBwbGVhc2UgY2hlY2sgdGhlIGNvdW50cnkncyBsYXdzLCByZWd1bGF0aW9ucyBhbmQgcG9saWNpZXMgY29uY2VybmluZyB0aGUgaW1wb3J0LAotICAgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIHRvIHNlZSBpZiB0aGlzIGlzIHBlcm1pdHRlZC48L3A+Ci0gICAKLTxzbWFsbD5KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC48L3NtYWxsPiAgIAotPC9ib2R5PgotPC9odG1sPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0Lmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE4YWVhMC4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAvL0VOIj4KLTxodG1sPgotPGhlYWQ+Ci08dGl0bGU+QWJvdXQ8L3RpdGxlPgotPG1ldGEgaHR0cC1lcXVpdj1Db250ZW50LVR5cGUgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgotPC9oZWFkPgotPGJvZHkgbGFuZz0iRU4tVVMiPgotPGgyPkFib3V0IFRoaXMgQ29udGVudDwvaDI+Ci0KLTxwPkZlYnJ1YXJ5IDI0LCAyMDA1PC9wPgkKLTxoMz5MaWNlbnNlPC9oMz4KLQotPHA+VGhlIEVjbGlwc2UgRm91bmRhdGlvbiBtYWtlcyBhdmFpbGFibGUgYWxsIGNvbnRlbnQgaW4gdGhpcyBwbHVnLWluICgmcXVvdDtDb250ZW50JnF1b3Q7KS4gIFVubGVzcyBvdGhlcndpc2UgaW5kaWNhdGVkIGJlbG93LCB0aGUgQ29udGVudCBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQotRWNsaXBzZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoJnF1b3Q7RVBMJnF1b3Q7KS4gIEEgY29weSBvZiB0aGUgRVBMIGlzIGF2YWlsYWJsZSBhdCA8YSBocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L2E+LgotRm9yIHB1cnBvc2VzIG9mIHRoZSBFUEwsICZxdW90O1Byb2dyYW0mcXVvdDsgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvcD4KLQotPHA+SWYgeW91IGRpZCBub3QgcmVjZWl2ZSB0aGlzIENvbnRlbnQgZGlyZWN0bHkgZnJvbSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uLCB0aGUgQ29udGVudCBpcyBiZWluZyByZWRpc3RyaWJ1dGVkIGJ5IGFub3RoZXIgcGFydHkgKCZxdW90O1JlZGlzdHJpYnV0b3ImcXVvdDspIGFuZCBkaWZmZXJlbnQgdGVybXMgYW5kIGNvbmRpdGlvbnMgbWF5Ci1hcHBseSB0byB5b3VyIHVzZSBvZiBhbnkgb2JqZWN0IGNvZGUgaW4gdGhlIENvbnRlbnQuICBDaGVjayB0aGUgUmVkaXN0cmlidXRvcidzIGxpY2Vuc2UgdGhhdCB3YXMgcHJvdmlkZWQgd2l0aCB0aGUgQ29udGVudC4gIElmIG5vIHN1Y2ggbGljZW5zZSBleGlzdHMsIGNvbnRhY3QgdGhlIFJlZGlzdHJpYnV0b3IuICBVbmxlc3Mgb3RoZXJ3aXNlCi1pbmRpY2F0ZWQgYmVsb3csIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgRVBMIHN0aWxsIGFwcGx5IHRvIGFueSBzb3VyY2UgY29kZSBpbiB0aGUgQ29udGVudC48L3A+Ci0KLTxoMz5Tb3VyY2UgQ29kZTwvaDM+Ci08cD5UaGlzIHBsdWctaW4gY29udGFpbnMgc291cmNlIGNvZGUgemlwIGZpbGVzICgmcXVvdDtTb3VyY2UgWmlwcyZxdW90OykgdGhhdCBjb3JyZXNwb25kIHRvIGJpbmFyeSBjb250ZW50IGluIG90aGVyIHBsdWctaW5zLiBUaGVzZSBTb3VyY2UgWmlwcyBtYXkgYmUgZGlzdHJpYnV0ZWQgdW5kZXIgZGlmZmVyZW50IGxpY2Vuc2UKLWFncmVlbWVudHMgYW5kL29yIG5vdGljZXMuIERldGFpbHMgYWJvdXQgdGhlc2UgbGljZW5zZSBhZ3JlZW1lbnRzIGFuZCBub3RpY2VzIGFyZSBjb250YWluZWQgaW4gJnF1b3Q7YWJvdXQuaHRtbCZxdW90OyBmaWxlcyAoJnF1b3Q7QWJvdXRzJnF1b3Q7KSBsb2NhdGVkIGluIHN1Yi1kaXJlY3RvcmllcyBpbiB0aGUKLXNyYy8gZGlyZWN0b3J5IG9mIHRoaXMgcGx1Zy1pbi4gU3VjaCBBYm91dHMgZ292ZXJuIHlvdXIgdXNlIG9mIHRoZSBTb3VyY2UgWmlwcyBpbiB0aGF0IGRpcmVjdG9yeSwgbm90IHRoZSBFUEwuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2Fib3V0LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlZTM2YS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQuaW5pCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotIyBhYm91dC5pbmkKLSMgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBmZWF0dXJlCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jICIla2V5IiBhcmUgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZGVmaW5lZCBpbiBhYm91dC5wcm9wZXJ0aWVzCi0jIFRoaXMgZmlsZSBkb2VzIG5vdCBuZWVkIHRvIGJlIHRyYW5zbGF0ZWQuCi0KLSMgUHJvcGVydHkgImFib3V0VGV4dCIgY29udGFpbnMgYmx1cmIgZm9yICJBYm91dCIgZGlhbG9nICh0cmFuc2xhdGVkKQotYWJvdXRUZXh0PSVibHVyYgotCi0jIFByb3BlcnR5ICJ3aW5kb3dJbWFnZSIgY29udGFpbnMgcGF0aCB0byB3aW5kb3cgaWNvbiAoMTZ4MTYpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgImZlYXR1cmVJbWFnZSIgY29udGFpbnMgcGF0aCB0byBmZWF0dXJlIGltYWdlICgzMngzMikKLWZlYXR1cmVJbWFnZT1lY2xpcHNlMzIuZ2lmCi0KLSMgUHJvcGVydHkgImFib3V0SW1hZ2UiIGNvbnRhaW5zIHBhdGggdG8gcHJvZHVjdCBpbWFnZSAoNTAweDMzMCBvciAxMTV4MTY0KQotIyBuZWVkZWQgZm9yIHByaW1hcnkgZmVhdHVyZXMgb25seQotCi0jIFByb3BlcnR5ICJhcHBOYW1lIiBjb250YWlucyBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAobm90IHRyYW5zbGF0ZWQpCi0jIG5lZWRlZCBmb3IgcHJpbWFyeSBmZWF0dXJlcyBvbmx5Ci0KLSMgUHJvcGVydHkgIndlbGNvbWVQYWdlIiBjb250YWlucyBwYXRoIHRvIHdlbGNvbWUgcGFnZSAoc3BlY2lhbCBYTUwtYmFzZWQgZm9ybWF0KQotIyBvcHRpb25hbAotCi0jIFByb3BlcnR5ICJ3ZWxjb21lUGVyc3BlY3RpdmUiIGNvbnRhaW5zIHRoZSBpZCBvZiB0aGUgcGVyc3BlY3RpdmUgaW4gd2hpY2ggdGhlCi0jIHdlbGNvbWUgcGFnZSBpcyB0byBiZSBvcGVuZWQuCi0jIG9wdGlvbmFsCi0KLQotCi0KZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5tYXBwaW5ncwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRmYjczNS4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQubWFwcGluZ3MKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLSMgYWJvdXQubWFwcGluZ3MNCi0jIGNvbnRhaW5zIGZpbGwtaW5zIGZvciBhYm91dC5wcm9wZXJ0aWVzDQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQ0KLSMgVGhpcyBmaWxlIGRvZXMgbm90IG5lZWQgdG8gYmUgdHJhbnNsYXRlZC4NCi0NCi0wPUBidWlsZEANCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYWJvdXQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGUxMGVhLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9hYm91dC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDb3B5cmlnaHQgKGMpIDIwMDAsIDIwMDUgSUJNIENvcnBvcmF0aW9uIGFuZCBvdGhlcnMuCi0jIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMKLSMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wCi0jIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0Ci0jIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYxMC5odG1sCi0jIAotIyBDb250cmlidXRvcnM6Ci0jICAgICBJQk0gQ29ycG9yYXRpb24gLSBpbml0aWFsIEFQSSBhbmQgaW1wbGVtZW50YXRpb24KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgYWJvdXQucHJvcGVydGllcwotIyBjb250YWlucyBleHRlcm5hbGl6ZWQgc3RyaW5ncyBmb3IgYWJvdXQuaW5pCi0jIGphdmEuaW8uUHJvcGVydGllcyBmaWxlIChJU08gODg1OS0xIHdpdGggIlwiIGVzY2FwZXMpCi0jIGZpbGwtaW5zIGFyZSBzdXBwbGllZCBieSBhYm91dC5tYXBwaW5ncwotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0jCi0jIERvIG5vdCB0cmFuc2xhdGUgYW55IHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHt9Ci0KLWJsdXJiPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBVSVxuXAotXG5cCi1WZXJzaW9uOiB7ZmVhdHVyZVZlcnNpb259XG5cCi1CdWlsZCBpZDogezB9XG5cCi1cblwKLShjKSBDb3B5cmlnaHQgRWNsaXBzZSBjb250cmlidXRvcnMgYW5kIG90aGVycyAyMDA1LiAgQWxsIHJpZ2h0cyByZXNlcnZlZC5cblwKLVZpc2l0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvd2VidG9vbHMKLQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2J1aWxkLnByb3BlcnRpZXMgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg5NTU5Ny4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotCi1iaW4uaW5jbHVkZXMgPSBhYm91dC5odG1sLCBhYm91dC5pbmksIGFib3V0Lm1hcHBpbmdzLCBhYm91dC5wcm9wZXJ0aWVzLCBlY2xpcHNlMzIuZ2lmLCBwbHVnaW4ucHJvcGVydGllcywgcGx1Z2luLnhtbCwgc3JjLyoqLCBNRVRBLUlORi8KLXNvdXJjZVBsdWdpbiA9IHRydWUKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIuZ2lmIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWQ3Y2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL2VjbGlwc2UzMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VpLmZlYXR1cmUvc291cmNlVGVtcGxhdGVQbHVnaW4vZWNsaXBzZTMyLnBuZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGFlNDlkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9lY2xpcHNlMzIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91aS5mZWF0dXJlL3NvdXJjZVRlbXBsYXRlUGx1Z2luL3BsdWdpbi5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWI1ZjRkLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdWkuZmVhdHVyZS9zb3VyY2VUZW1wbGF0ZVBsdWdpbi9wbHVnaW4ucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ29weXJpZ2h0IChjKSAyMDA1IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLgotIyBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzCi0jIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjEuMAotIyB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdAotIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbAotIyAKLSMgQ29udHJpYnV0b3JzOgotIyAgICAgSUJNIENvcnBvcmF0aW9uIC0gaW5pdGlhbCBBUEkgYW5kIGltcGxlbWVudGF0aW9uCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1wbHVnaW5OYW1lPVdlYiBTdGFuZGFyZCBUb29scyAtIFhNTCBVSSBTb3VyY2UKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZSBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlLy5jdnNpZ25vcmUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNDQ4N2MuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLmN2c2lnbm9yZQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWJ1aWxkLnhtbApkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvLnByb2plY3QgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzOTFiMi4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS8ucHJvamVjdAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdERlc2NyaXB0aW9uPgotCTxuYW1lPm9yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlPC9uYW1lPgotCTxjb21tZW50PjwvY29tbWVudD4KLQk8cHJvamVjdHM+Ci0JPC9wcm9qZWN0cz4KLQk8YnVpbGRTcGVjPgotCQk8YnVpbGRDb21tYW5kPgotCQkJPG5hbWU+b3JnLmVjbGlwc2UucGRlLkZlYXR1cmVCdWlsZGVyPC9uYW1lPgotCQkJPGFyZ3VtZW50cz4KLQkJCTwvYXJndW1lbnRzPgotCQk8L2J1aWxkQ29tbWFuZD4KLQk8L2J1aWxkU3BlYz4KLQk8bmF0dXJlcz4KLQkJPG5hdHVyZT5vcmcuZWNsaXBzZS5wZGUuRmVhdHVyZU5hdHVyZTwvbmF0dXJlPgotCTwvbmF0dXJlcz4KLTwvcHJvamVjdERlc2NyaXB0aW9uPgpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmNDc2OTQuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvYnVpbGQucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotYmluLmluY2x1ZGVzID0gZmVhdHVyZS54bWwsXAotICAgICAgICAgICAgICAgZWNsaXBzZV91cGRhdGVfMTIwLmpwZyxcCi0gICAgICAgICAgICAgICBlcGwtdjEwLmh0bWwsXAotICAgICAgICAgICAgICAgbGljZW5zZS5odG1sLFwKLSAgICAgICAgICAgICAgIGZlYXR1cmUucHJvcGVydGllcwpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZyBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VjbGlwc2VfdXBkYXRlXzEyMC5qcGcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZGY3MDguLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZWNsaXBzZV91cGRhdGVfMTIwLmpwZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2VwbC12MTAuaHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ0YjE5Ni4uMDAwMDAwMAotLS0gYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9lcGwtdjEwLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotPGh0bWwgeG1sbnM6bz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6b2ZmaWNlIgoteG1sbnM6dz0idXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTpvZmZpY2U6d29yZCIKLXhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj4KLQotPGhlYWQ+Ci08bWV0YSBodHRwLWVxdWl2PUNvbnRlbnQtVHlwZSBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9d2luZG93cy0xMjUyIj4KLTxtZXRhIG5hbWU9UHJvZ0lkIGNvbnRlbnQ9V29yZC5Eb2N1bWVudD4KLTxtZXRhIG5hbWU9R2VuZXJhdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPG1ldGEgbmFtZT1PcmlnaW5hdG9yIGNvbnRlbnQ9Ik1pY3Jvc29mdCBXb3JkIDkiPgotPGxpbmsgcmVsPUZpbGUtTGlzdAotaHJlZj0iLi9FY2xpcHNlJTIwRVBMJTIwMjAwM18xMV8xMCUyMEZpbmFsX2ZpbGVzL2ZpbGVsaXN0LnhtbCI+Ci08dGl0bGU+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIFZlcnNpb24gMS4wPC90aXRsZT4KLTwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDxvOkRvY3VtZW50UHJvcGVydGllcz4KLSAgPG86UmV2aXNpb24+MjwvbzpSZXZpc2lvbj4KLSAgPG86VG90YWxUaW1lPjM8L286VG90YWxUaW1lPgotICA8bzpDcmVhdGVkPjIwMDQtMDMtMDVUMjM6MDM6MDBaPC9vOkNyZWF0ZWQ+Ci0gIDxvOkxhc3RTYXZlZD4yMDA0LTAzLTA1VDIzOjAzOjAwWjwvbzpMYXN0U2F2ZWQ+Ci0gIDxvOlBhZ2VzPjQ8L286UGFnZXM+Ci0gIDxvOldvcmRzPjE2MjY8L286V29yZHM+Ci0gIDxvOkNoYXJhY3RlcnM+OTI3MDwvbzpDaGFyYWN0ZXJzPgotICAgPG86TGluZXM+Nzc8L286TGluZXM+Ci0gIDxvOlBhcmFncmFwaHM+MTg8L286UGFyYWdyYXBocz4KLSAgPG86Q2hhcmFjdGVyc1dpdGhTcGFjZXM+MTEzODQ8L286Q2hhcmFjdGVyc1dpdGhTcGFjZXM+Ci0gIDxvOlZlcnNpb24+OS40NDAyPC9vOlZlcnNpb24+Ci0gPC9vOkRvY3VtZW50UHJvcGVydGllcz4KLTwveG1sPjwhW2VuZGlmXS0tPjwhLS1baWYgZ3RlIG1zbyA5XT48eG1sPgotIDx3OldvcmREb2N1bWVudD4KLSAgPHc6VHJhY2tSZXZpc2lvbnMvPgotIDwvdzpXb3JkRG9jdW1lbnQ+Ci08L3htbD48IVtlbmRpZl0tLT4KLTxzdHlsZT4KLTwhLS0KLSAvKiBGb250IERlZmluaXRpb25zICovCi1AZm9udC1mYWNlCi0Je2ZvbnQtZmFtaWx5OlRhaG9tYTsKLQlwYW5vc2UtMToyIDExIDYgNCAzIDUgNCA0IDIgNDsKLQltc28tZm9udC1jaGFyc2V0OjA7Ci0JbXNvLWdlbmVyaWMtZm9udC1mYW1pbHk6c3dpc3M7Ci0JbXNvLWZvbnQtcGl0Y2g6dmFyaWFibGU7Ci0JbXNvLWZvbnQtc2lnbmF0dXJlOjU1MzY3OTQ5NSAtMjE0NzQ4MzY0OCA4IDAgNjYwNDcgMDt9Ci0gLyogU3R5bGUgRGVmaW5pdGlvbnMgKi8KLXAuTXNvTm9ybWFsLCBsaS5Nc29Ob3JtYWwsIGRpdi5Nc29Ob3JtYWwKLQl7bXNvLXN0eWxlLXBhcmVudDoiIjsKLQltYXJnaW46MGluOwotCW1hcmdpbi1ib3R0b206LjAwMDFwdDsKLQltc28tcGFnaW5hdGlvbjp3aWRvdy1vcnBoYW47Ci0JZm9udC1zaXplOjEyLjBwdDsKLQlmb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjsKLQltc28tZmFyZWFzdC1mb250LWZhbWlseToiVGltZXMgTmV3IFJvbWFuIjt9Ci1wCi0Je21hcmdpbi1yaWdodDowaW47Ci0JbXNvLW1hcmdpbi10b3AtYWx0OmF1dG87Ci0JbXNvLW1hcmdpbi1ib3R0b20tYWx0OmF1dG87Ci0JbWFyZ2luLWxlZnQ6MGluOwotCW1zby1wYWdpbmF0aW9uOndpZG93LW9ycGhhbjsKLQlmb250LXNpemU6MTIuMHB0OwotCWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iOwotCW1zby1mYXJlYXN0LWZvbnQtZmFtaWx5OiJUaW1lcyBOZXcgUm9tYW4iO30KLXAuQmFsbG9vblRleHQsIGxpLkJhbGxvb25UZXh0LCBkaXYuQmFsbG9vblRleHQKLQl7bXNvLXN0eWxlLW5hbWU6IkJhbGxvb24gVGV4dCI7Ci0JbWFyZ2luOjBpbjsKLQltYXJnaW4tYm90dG9tOi4wMDAxcHQ7Ci0JbXNvLXBhZ2luYXRpb246d2lkb3ctb3JwaGFuOwotCWZvbnQtc2l6ZTo4LjBwdDsKLQlmb250LWZhbWlseTpUYWhvbWE7Ci0JbXNvLWZhcmVhc3QtZm9udC1mYW1pbHk6IlRpbWVzIE5ldyBSb21hbiI7fQotQHBhZ2UgU2VjdGlvbjEKLQl7c2l6ZTo4LjVpbiAxMS4waW47Ci0JbWFyZ2luOjEuMGluIDEuMjVpbiAxLjBpbiAxLjI1aW47Ci0JbXNvLWhlYWRlci1tYXJnaW46LjVpbjsKLQltc28tZm9vdGVyLW1hcmdpbjouNWluOwotCW1zby1wYXBlci1zb3VyY2U6MDt9Ci1kaXYuU2VjdGlvbjEKLQl7cGFnZTpTZWN0aW9uMTt9Ci0tLT4KLTwvc3R5bGU+Ci08L2hlYWQ+Ci0KLTxib2R5IGxhbmc9RU4tVVMgc3R5bGU9J3RhYi1pbnRlcnZhbDouNWluJz4KLQotPGRpdiBjbGFzcz1TZWN0aW9uMT4KLQotPHAgYWxpZ249Y2VudGVyIHN0eWxlPSd0ZXh0LWFsaWduOmNlbnRlcic+PGI+RWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMS4wPC9iPgotPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSCi1USEUgVEVSTVMgT0YgVEhJUyBFQ0xJUFNFIFBVQkxJQyBMSUNFTlNFICgmcXVvdDtBR1JFRU1FTlQmcXVvdDspLiBBTlkgVVNFLAotUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFCi1PRiBUSElTIEFHUkVFTUVOVC48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjEuIERFRklOSVRJT05TPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7Q29udHJpYnV0aW9uJnF1b3Q7IG1lYW5zOjwvc3Bhbj4gPC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5hKQotaW4gdGhlIGNhc2Ugb2YgdGhlIGluaXRpYWwgQ29udHJpYnV0b3IsIHRoZSBpbml0aWFsIGNvZGUgYW5kIGRvY3VtZW50YXRpb24KLWRpc3RyaWJ1dGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQ8YnIgY2xlYXI9bGVmdD4KLWIpIGluIHRoZSBjYXNlIG9mIGVhY2ggc3Vic2VxdWVudCBDb250cmlidXRvcjo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotY2hhbmdlcyB0byB0aGUgUHJvZ3JhbSwgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1hZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07PC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+d2hlcmUKLXN1Y2ggY2hhbmdlcyBhbmQvb3IgYWRkaXRpb25zIHRvIHRoZSBQcm9ncmFtIG9yaWdpbmF0ZSBmcm9tIGFuZCBhcmUgZGlzdHJpYnV0ZWQKLWJ5IHRoYXQgcGFydGljdWxhciBDb250cmlidXRvci4gQSBDb250cmlidXRpb24gJ29yaWdpbmF0ZXMnIGZyb20gYSBDb250cmlidXRvcgotaWYgaXQgd2FzIGFkZGVkIHRvIHRoZSBQcm9ncmFtIGJ5IHN1Y2ggQ29udHJpYnV0b3IgaXRzZWxmIG9yIGFueW9uZSBhY3Rpbmcgb24KLXN1Y2ggQ29udHJpYnV0b3IncyBiZWhhbGYuIENvbnRyaWJ1dGlvbnMgZG8gbm90IGluY2x1ZGUgYWRkaXRpb25zIHRvIHRoZQotUHJvZ3JhbSB3aGljaDogKGkpIGFyZSBzZXBhcmF0ZSBtb2R1bGVzIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIGluIGNvbmp1bmN0aW9uCi13aXRoIHRoZSBQcm9ncmFtIHVuZGVyIHRoZWlyIG93biBsaWNlbnNlIGFncmVlbWVudCwgYW5kIChpaSkgYXJlIG5vdCBkZXJpdmF0aXZlCi13b3JrcyBvZiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPiZxdW90O0NvbnRyaWJ1dG9yJnF1b3Q7IG1lYW5zIGFueSBwZXJzb24gb3IKLWVudGl0eSB0aGF0IGRpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7TGljZW5zZWQgUGF0ZW50cyAmcXVvdDsgbWVhbiBwYXRlbnQKLWNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2ggYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGUgdXNlCi1vciBzYWxlIG9mIGl0cyBDb250cmlidXRpb24gYWxvbmUgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UHJvZ3JhbSZxdW90OyBtZWFucyB0aGUgQ29udHJpYnV0aW9ucwotZGlzdHJpYnV0ZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoaXMgQWdyZWVtZW50Ljwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+JnF1b3Q7UmVjaXBpZW50JnF1b3Q7IG1lYW5zIGFueW9uZSB3aG8KLXJlY2VpdmVzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBpbmNsdWRpbmcgYWxsIENvbnRyaWJ1dG9ycy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjIuIEdSQU5UIE9GIFJJR0hUUzwvc3Bhbj48L2I+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YSkKLVN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgQWdyZWVtZW50LCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgUmVjaXBpZW50Ci1hIG5vbi1leGNsdXNpdmUsIHdvcmxkd2lkZSwgcm95YWx0eS1mcmVlIGNvcHlyaWdodCBsaWNlbnNlIHRvPHNwYW4KLXN0eWxlPSdjb2xvcjpyZWQnPiA8L3NwYW4+cmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUgd29ya3Mgb2YsIHB1YmxpY2x5Ci1kaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBkaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAotQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggZGVyaXZhdGl2ZSB3b3JrcywgaW4gc291cmNlIGNvZGUgYW5kIG9iamVjdCBjb2RlCi1mb3JtLjwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmIpCi1TdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzCi1SZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsPHNwYW4gc3R5bGU9J2NvbG9yOmdyZWVuJz4gPC9zcGFuPnJveWFsdHktZnJlZQotcGF0ZW50IGxpY2Vuc2UgdW5kZXIgTGljZW5zZWQgUGF0ZW50cyB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIHRvIHNlbGwsIGltcG9ydAotYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgQ29udHJpYnV0aW9uIG9mIHN1Y2ggQ29udHJpYnV0b3IsIGlmIGFueSwgaW4gc291cmNlCi1jb2RlIGFuZCBvYmplY3QgY29kZSBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsIGFwcGx5IHRvIHRoZSBjb21iaW5hdGlvbgotb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0IHRoZSB0aW1lIHRoZSBDb250cmlidXRpb24gaXMgYWRkZWQKLWJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbiBvZiB0aGUgQ29udHJpYnV0aW9uIGNhdXNlcyBzdWNoIGNvbWJpbmF0aW9uCi10byBiZSBjb3ZlcmVkIGJ5IHRoZSBMaWNlbnNlZCBQYXRlbnRzLiBUaGUgcGF0ZW50IGxpY2Vuc2Ugc2hhbGwgbm90IGFwcGx5IHRvCi1hbnkgb3RoZXIgY29tYmluYXRpb25zIHdoaWNoIGluY2x1ZGUgdGhlIENvbnRyaWJ1dGlvbi4gTm8gaGFyZHdhcmUgcGVyIHNlIGlzCi1saWNlbnNlZCBoZXJldW5kZXIuIDwvc3Bhbj48L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmMpCi1SZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUgbGljZW5zZXMgdG8gaXRzCi1Db250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlIHByb3ZpZGVkIGJ5IGFueSBDb250cmlidXRvcgotdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUgcGF0ZW50IG9yIG90aGVyIGludGVsbGVjdHVhbCBwcm9wZXJ0eQotcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuIEVhY2ggQ29udHJpYnV0b3IgZGlzY2xhaW1zIGFueSBsaWFiaWxpdHkgdG8gUmVjaXBpZW50Ci1mb3IgY2xhaW1zIGJyb3VnaHQgYnkgYW55IG90aGVyIGVudGl0eSBiYXNlZCBvbiBpbmZyaW5nZW1lbnQgb2YgaW50ZWxsZWN0dWFsCi1wcm9wZXJ0eSByaWdodHMgb3Igb3RoZXJ3aXNlLiBBcyBhIGNvbmRpdGlvbiB0byBleGVyY2lzaW5nIHRoZSByaWdodHMgYW5kCi1saWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciwgZWFjaCBSZWNpcGllbnQgaGVyZWJ5IGFzc3VtZXMgc29sZSByZXNwb25zaWJpbGl0eQotdG8gc2VjdXJlIGFueSBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG5lZWRlZCwgaWYgYW55LiBGb3IgZXhhbXBsZSwKLWlmIGEgdGhpcmQgcGFydHkgcGF0ZW50IGxpY2Vuc2UgaXMgcmVxdWlyZWQgdG8gYWxsb3cgUmVjaXBpZW50IHRvIGRpc3RyaWJ1dGUKLXRoZSBQcm9ncmFtLCBpdCBpcyBSZWNpcGllbnQncyByZXNwb25zaWJpbGl0eSB0byBhY3F1aXJlIHRoYXQgbGljZW5zZSBiZWZvcmUKLWRpc3RyaWJ1dGluZyB0aGUgUHJvZ3JhbS48L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5kKQotRWFjaCBDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQgdG8gaXRzIGtub3dsZWRnZSBpdCBoYXMgc3VmZmljaWVudCBjb3B5cmlnaHQKLXJpZ2h0cyBpbiBpdHMgQ29udHJpYnV0aW9uLCBpZiBhbnksIHRvIGdyYW50IHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4KLXRoaXMgQWdyZWVtZW50LiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+My4gUkVRVUlSRU1FTlRTPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+QSBDb250cmlidXRvciBtYXkgY2hvb3NlIHRvIGRpc3RyaWJ1dGUgdGhlCi1Qcm9ncmFtIGluIG9iamVjdCBjb2RlIGZvcm0gdW5kZXIgaXRzIG93biBsaWNlbnNlIGFncmVlbWVudCwgcHJvdmlkZWQgdGhhdDo8L3NwYW4+Ci08L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBjb21wbGllcyB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudDsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikKLWl0cyBsaWNlbnNlIGFncmVlbWVudDo8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5pKQotZWZmZWN0aXZlbHkgZGlzY2xhaW1zIG9uIGJlaGFsZiBvZiBhbGwgQ29udHJpYnV0b3JzIGFsbCB3YXJyYW50aWVzIGFuZAotY29uZGl0aW9ucywgZXhwcmVzcyBhbmQgaW1wbGllZCwgaW5jbHVkaW5nIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZQotYW5kIG5vbi1pbmZyaW5nZW1lbnQsIGFuZCBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkKLWFuZCBmaXRuZXNzIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aWkpCi1lZmZlY3RpdmVseSBleGNsdWRlcyBvbiBiZWhhbGYgb2YgYWxsIENvbnRyaWJ1dG9ycyBhbGwgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLAotaW5jbHVkaW5nIGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaAotYXMgbG9zdCBwcm9maXRzOyA8L3NwYW4+PC9wPgotCi08cCBjbGFzcz1Nc29Ob3JtYWwgc3R5bGU9J21hcmdpbi1sZWZ0Oi41aW4nPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5paWkpCi1zdGF0ZXMgdGhhdCBhbnkgcHJvdmlzaW9ucyB3aGljaCBkaWZmZXIgZnJvbSB0aGlzIEFncmVlbWVudCBhcmUgb2ZmZXJlZCBieSB0aGF0Ci1Db250cmlidXRvciBhbG9uZSBhbmQgbm90IGJ5IGFueSBvdGhlciBwYXJ0eTsgYW5kPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+aXYpCi1zdGF0ZXMgdGhhdCBzb3VyY2UgY29kZSBmb3IgdGhlIFByb2dyYW0gaXMgYXZhaWxhYmxlIGZyb20gc3VjaCBDb250cmlidXRvciwgYW5kCi1pbmZvcm1zIGxpY2Vuc2VlcyBob3cgdG8gb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhCi1tZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2UuPHNwYW4gc3R5bGU9J2NvbG9yOmJsdWUnPiA8L3NwYW4+PC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPldoZW4gdGhlIFByb2dyYW0gaXMgbWFkZSBhdmFpbGFibGUgaW4gc291cmNlCi1jb2RlIGZvcm06PC9zcGFuPiA8L3A+Ci0KLTxwIGNsYXNzPU1zb05vcm1hbCBzdHlsZT0nbWFyZ2luLWxlZnQ6LjVpbic+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPmEpCi1pdCBtdXN0IGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50OyBhbmQgPC9zcGFuPjwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsIHN0eWxlPSdtYXJnaW4tbGVmdDouNWluJz48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+YikgYQotY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mIHRoZSBQcm9ncmFtLiA8L3NwYW4+PC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Q29udHJpYnV0b3JzIG1heSBub3QgcmVtb3ZlIG9yIGFsdGVyIGFueQotY29weXJpZ2h0IG5vdGljZXMgY29udGFpbmVkIHdpdGhpbiB0aGUgUHJvZ3JhbS4gPC9zcGFuPjwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkVhY2ggQ29udHJpYnV0b3IgbXVzdCBpZGVudGlmeSBpdHNlbGYgYXMgdGhlCi1vcmlnaW5hdG9yIG9mIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgaW4gYSBtYW5uZXIgdGhhdCByZWFzb25hYmx5IGFsbG93cwotc3Vic2VxdWVudCBSZWNpcGllbnRzIHRvIGlkZW50aWZ5IHRoZSBvcmlnaW5hdG9yIG9mIHRoZSBDb250cmlidXRpb24uIDwvc3Bhbj48L3A+Ci0KLTxwPjxiPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz40LiBDT01NRVJDSUFMIERJU1RSSUJVVElPTjwvc3Bhbj48L2I+IDwvcD4KLQotPHA+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPkNvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heQotYWNjZXB0IGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyB3aXRoIHJlc3BlY3QgdG8gZW5kIHVzZXJzLCBidXNpbmVzcyBwYXJ0bmVycwotYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzIGxpY2Vuc2UgaXMgaW50ZW5kZWQgdG8gZmFjaWxpdGF0ZSB0aGUgY29tbWVyY2lhbCB1c2UKLW9mIHRoZSBQcm9ncmFtLCB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbAotcHJvZHVjdCBvZmZlcmluZyBzaG91bGQgZG8gc28gaW4gYSBtYW5uZXIgd2hpY2ggZG9lcyBub3QgY3JlYXRlIHBvdGVudGlhbAotbGlhYmlsaXR5IGZvciBvdGhlciBDb250cmlidXRvcnMuIFRoZXJlZm9yZSwgaWYgYSBDb250cmlidXRvciBpbmNsdWRlcyB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IgKCZxdW90O0NvbW1lcmNpYWwKLUNvbnRyaWJ1dG9yJnF1b3Q7KSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5IG90aGVyCi1Db250cmlidXRvciAoJnF1b3Q7SW5kZW1uaWZpZWQgQ29udHJpYnV0b3ImcXVvdDspIGFnYWluc3QgYW55IGxvc3NlcywgZGFtYWdlcyBhbmQKLWNvc3RzIChjb2xsZWN0aXZlbHkgJnF1b3Q7TG9zc2VzJnF1b3Q7KSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cyBhbmQgb3RoZXIKLWxlZ2FsIGFjdGlvbnMgYnJvdWdodCBieSBhIHRoaXJkIHBhcnR5IGFnYWluc3QgdGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIHRvCi10aGUgZXh0ZW50IGNhdXNlZCBieSB0aGUgYWN0cyBvciBvbWlzc2lvbnMgb2Ygc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCi1jb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwgcHJvZHVjdAotb2ZmZXJpbmcuIFRoZSBvYmxpZ2F0aW9ucyBpbiB0aGlzIHNlY3Rpb24gZG8gbm90IGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzCi1yZWxhdGluZyB0byBhbnkgYWN0dWFsIG9yIGFsbGVnZWQgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGluZnJpbmdlbWVudC4gSW4gb3JkZXIKLXRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG11c3Q6IGEpIHByb21wdGx5IG5vdGlmeSB0aGUgQ29tbWVyY2lhbAotQ29udHJpYnV0b3IgaW4gd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IKLXRvIGNvbnRyb2wsIGFuZCBjb29wZXJhdGUgd2l0aCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiwgdGhlIGRlZmVuc2UgYW5kCi1hbnkgcmVsYXRlZCBzZXR0bGVtZW50IG5lZ290aWF0aW9ucy4gVGhlIEluZGVtbmlmaWVkIENvbnRyaWJ1dG9yIG1heSBwYXJ0aWNpcGF0ZQotaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Rm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUKLVByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIFByb2R1Y3QgWC4gVGhhdCBDb250cmlidXRvciBpcyB0aGVuIGEKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IuIElmIHRoYXQgQ29tbWVyY2lhbCBDb250cmlidXRvciB0aGVuIG1ha2VzIHBlcmZvcm1hbmNlCi1jbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kCi13YXJyYW50aWVzIGFyZSBzdWNoIENvbW1lcmNpYWwgQ29udHJpYnV0b3IncyByZXNwb25zaWJpbGl0eSBhbG9uZS4gVW5kZXIgdGhpcwotc2VjdGlvbiwgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3Igd291bGQgaGF2ZSB0byBkZWZlbmQgY2xhaW1zIGFnYWluc3QgdGhlCi1vdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZSBjbGFpbXMgYW5kIHdhcnJhbnRpZXMsIGFuZCBpZiBhCi1jb3VydCByZXF1aXJlcyBhbnkgb3RoZXIgQ29udHJpYnV0b3IgdG8gcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUKLUNvbW1lcmNpYWwgQ29udHJpYnV0b3IgbXVzdCBwYXkgdGhvc2UgZGFtYWdlcy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjUuIE5PIFdBUlJBTlRZPC9zcGFuPjwvYj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+RVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUwotQUdSRUVNRU5ULCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywgV0lUSE9VVAotV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVEIElOQ0xVRElORywKLVdJVEhPVVQgTElNSVRBVElPTiwgQU5ZIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwKLU1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gRWFjaCBSZWNpcGllbnQgaXMgc29sZWx5Ci1yZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBhbmQgZGlzdHJpYnV0aW5nIHRoZQotUHJvZ3JhbSBhbmQgYXNzdW1lcyBhbGwgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcwotQWdyZWVtZW50ICwgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAotY29tcGxpYW5jZSB3aXRoIGFwcGxpY2FibGUgbGF3cywgZGFtYWdlIHRvIG9yIGxvc3Mgb2YgZGF0YSwgcHJvZ3JhbXMgb3IKLWVxdWlwbWVudCwgYW5kIHVuYXZhaWxhYmlsaXR5IG9yIGludGVycnVwdGlvbiBvZiBvcGVyYXRpb25zLiA8L3NwYW4+PC9wPgotCi08cD48Yj48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+Ni4gRElTQ0xBSU1FUiBPRiBMSUFCSUxJVFk8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FWENFUFQgQVMgRVhQUkVTU0xZIFNFVCBGT1JUSCBJTiBUSElTCi1BR1JFRU1FTlQsIE5FSVRIRVIgUkVDSVBJRU5UIE5PUiBBTlkgQ09OVFJJQlVUT1JTIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IKLUFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUwotKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVCBQUk9GSVRTKSwgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkKLU9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HCi1ORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9SIERJU1RSSUJVVElPTiBPRgotVEhFIFBST0dSQU0gT1IgVEhFIEVYRVJDSVNFIE9GIEFOWSBSSUdIVFMgR1JBTlRFRCBIRVJFVU5ERVIsIEVWRU4gSUYgQURWSVNFRCBPRgotVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy48L3NwYW4+IDwvcD4KLQotPHA+PGI+PHNwYW4gc3R5bGU9J2ZvbnQtc2l6ZToxMC4wcHQnPjcuIEdFTkVSQUw8L3NwYW4+PC9iPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBhbnkgcHJvdmlzaW9uIG9mIHRoaXMgQWdyZWVtZW50IGlzIGludmFsaWQKLW9yIHVuZW5mb3JjZWFibGUgdW5kZXIgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yCi1lbmZvcmNlYWJpbGl0eSBvZiB0aGUgcmVtYWluZGVyIG9mIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgYW5kIHdpdGhvdXQKLWZ1cnRoZXIgYWN0aW9uIGJ5IHRoZSBwYXJ0aWVzIGhlcmV0bywgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgdG8gdGhlCi1taW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuPC9zcGFuPiA8L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5JZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbgotYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KQotYWxsZWdpbmcgdGhhdCB0aGUgUHJvZ3JhbSBpdHNlbGYgKGV4Y2x1ZGluZyBjb21iaW5hdGlvbnMgb2YgdGhlIFByb2dyYW0gd2l0aAotb3RoZXIgc29mdHdhcmUgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoCi1SZWNpcGllbnQncyByaWdodHMgZ3JhbnRlZCB1bmRlciBTZWN0aW9uIDIoYikgc2hhbGwgdGVybWluYXRlIGFzIG9mIHRoZSBkYXRlCi1zdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5BbGwgUmVjaXBpZW50J3MgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50Ci1zaGFsbCB0ZXJtaW5hdGUgaWYgaXQgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvcgotY29uZGl0aW9ucyBvZiB0aGlzIEFncmVlbWVudCBhbmQgZG9lcyBub3QgY3VyZSBzdWNoIGZhaWx1cmUgaW4gYSByZWFzb25hYmxlCi1wZXJpb2Qgb2YgdGltZSBhZnRlciBiZWNvbWluZyBhd2FyZSBvZiBzdWNoIG5vbmNvbXBsaWFuY2UuIElmIGFsbCBSZWNpcGllbnQncwotcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UgYW5kCi1kaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYXMgc29vbiBhcyByZWFzb25hYmx5IHByYWN0aWNhYmxlLiBIb3dldmVyLAotUmVjaXBpZW50J3Mgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGJ5Ci1SZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuIDwvc3Bhbj48L3A+Ci0KLTxwPjxzcGFuIHN0eWxlPSdmb250LXNpemU6MTAuMHB0Jz5FdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZQotY29waWVzIG9mIHRoaXMgQWdyZWVtZW50LCBidXQgaW4gb3JkZXIgdG8gYXZvaWQgaW5jb25zaXN0ZW5jeSB0aGUgQWdyZWVtZW50IGlzCi1jb3B5cmlnaHRlZCBhbmQgbWF5IG9ubHkgYmUgbW9kaWZpZWQgaW4gdGhlIGZvbGxvd2luZyBtYW5uZXIuIFRoZSBBZ3JlZW1lbnQKLVN0ZXdhcmQgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgotdGhpcyBBZ3JlZW1lbnQgZnJvbSB0aW1lIHRvIHRpbWUuIE5vIG9uZSBvdGhlciB0aGFuIHRoZSBBZ3JlZW1lbnQgU3Rld2FyZCBoYXMKLXRoZSByaWdodCB0byBtb2RpZnkgdGhpcyBBZ3JlZW1lbnQuIFRoZSBFY2xpcHNlIEZvdW5kYXRpb24gaXMgdGhlIGluaXRpYWwKLUFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlIHJlc3BvbnNpYmlsaXR5IHRvCi1zZXJ2ZSBhcyB0aGUgQWdyZWVtZW50IFN0ZXdhcmQgdG8gYSBzdWl0YWJsZSBzZXBhcmF0ZSBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24KLW9mIHRoZSBBZ3JlZW1lbnQgd2lsbCBiZSBnaXZlbiBhIGRpc3Rpbmd1aXNoaW5nIHZlcnNpb24gbnVtYmVyLiBUaGUgUHJvZ3JhbQotKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlIGRpc3RyaWJ1dGVkIHN1YmplY3QgdG8gdGhlIHZlcnNpb24gb2YKLXRoZSBBZ3JlZW1lbnQgdW5kZXIgd2hpY2ggaXQgd2FzIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZgotdGhlIEFncmVlbWVudCBpcyBwdWJsaXNoZWQsIENvbnRyaWJ1dG9yIG1heSBlbGVjdCB0byBkaXN0cmlidXRlIHRoZSBQcm9ncmFtCi0oaW5jbHVkaW5nIGl0cyBDb250cmlidXRpb25zKSB1bmRlciB0aGUgbmV3IHZlcnNpb24uIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkCi1pbiBTZWN0aW9ucyAyKGEpIGFuZCAyKGIpIGFib3ZlLCBSZWNpcGllbnQgcmVjZWl2ZXMgbm8gcmlnaHRzIG9yIGxpY2Vuc2VzIHRvCi10aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueSBDb250cmlidXRvciB1bmRlciB0aGlzIEFncmVlbWVudCwgd2hldGhlcgotZXhwcmVzc2x5LCBieSBpbXBsaWNhdGlvbiwgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdAotZXhwcmVzc2x5IGdyYW50ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgYXJlIHJlc2VydmVkLjwvc3Bhbj4gPC9wPgotCi08cD48c3BhbiBzdHlsZT0nZm9udC1zaXplOjEwLjBwdCc+VGhpcyBBZ3JlZW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIGxhd3Mgb2YgdGhlCi1TdGF0ZSBvZiBOZXcgWW9yayBhbmQgdGhlIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBsYXdzIG9mIHRoZSBVbml0ZWQgU3RhdGVzIG9mCi1BbWVyaWNhLiBObyBwYXJ0eSB0byB0aGlzIEFncmVlbWVudCB3aWxsIGJyaW5nIGEgbGVnYWwgYWN0aW9uIHVuZGVyIHRoaXMKLUFncmVlbWVudCBtb3JlIHRoYW4gb25lIHllYXIgYWZ0ZXIgdGhlIGNhdXNlIG9mIGFjdGlvbiBhcm9zZS4gRWFjaCBwYXJ0eSB3YWl2ZXMKLWl0cyByaWdodHMgdG8gYSBqdXJ5IHRyaWFsIGluIGFueSByZXN1bHRpbmcgbGl0aWdhdGlvbi48L3NwYW4+IDwvcD4KLQotPHAgY2xhc3M9TXNvTm9ybWFsPjwhW2lmICFzdXBwb3J0RW1wdHlQYXJhc10+Jm5ic3A7PCFbZW5kaWZdPjxvOnA+PC9vOnA+PC9wPgotCi08L2Rpdj4KLQotPC9ib2R5PgotCi08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzIGIvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvZmVhdHVyZS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDEyN2UzLi4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENvcHlyaWdodCAoYykgMjAwNiBJQk0gQ29ycG9yYXRpb24gYW5kIG90aGVycy4KLSMgQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscwotIyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYxLjAKLSMgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXQKLSMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwKLSMgCi0jIENvbnRyaWJ1dG9yczoKLSMgICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvbgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBmZWF0dXJlLnByb3BlcnRpZXMKLSMgY29udGFpbnMgZXh0ZXJuYWxpemVkIHN0cmluZ3MgZm9yIGZlYXR1cmUueG1sCi0jICIlZm9vIiBpbiBmZWF0dXJlLnhtbCBjb3JyZXNwb25kcyB0byB0aGUga2V5ICJmb28iIGluIHRoaXMgZmlsZQotIyBqYXZhLmlvLlByb3BlcnRpZXMgZmlsZSAoSVNPIDg4NTktMSB3aXRoICJcIiBlc2NhcGVzKQotIyBUaGlzIGZpbGUgc2hvdWxkIGJlIHRyYW5zbGF0ZWQuCi0KLSMgImZlYXR1cmVOYW1lIiBwcm9wZXJ0eSAtIG5hbWUgb2YgdGhlIGZlYXR1cmUKLWZlYXR1cmVOYW1lPVdTVCBYTUwgVXNlciBEb2N1bWVudGF0aW9uCi0KLSMgInByb3ZpZGVyTmFtZSIgcHJvcGVydHkgLSBuYW1lIG9mIHRoZSBjb21wYW55IHRoYXQgcHJvdmlkZXMgdGhlIGZlYXR1cmUKLXByb3ZpZGVyTmFtZT1FY2xpcHNlLm9yZwotCi0jICJ1cGRhdGVTaXRlTmFtZSIgcHJvcGVydHkgLSBsYWJlbCBmb3IgdGhlIHVwZGF0ZSBzaXRlCi11cGRhdGVTaXRlTmFtZT1UaGUgRWNsaXBzZSBXZWIgVG9vbHMgUGxhdGZvcm0gKFdUUCkgUHJvamVjdCB1cGRhdGUgc2l0ZQotCi0jICJkZXNjcmlwdGlvbiIgcHJvcGVydHkgLSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZQotZGVzY3JpcHRpb249V1NUIFhNTCB1c2VyIGRvY3VtZW50YXRpb24KLQotIyAiY29weXJpZ2h0IiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBDb3B5cmlnaHQiCi1jb3B5cmlnaHQ9XAotQ29weXJpZ2h0IChjKSAyMDA2IElCTSBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzLlxuXAotQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFsc1xuXAotYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2MS4wXG5cCi13aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuXAotaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWxcblwKLVxuXAotQ29udHJpYnV0b3JzOlxuXAotICAgIElCTSBDb3Jwb3JhdGlvbiAtIGluaXRpYWwgQVBJIGFuZCBpbXBsZW1lbnRhdGlvblxuCi0jIyMjIyMjIyMjIyMjIyMjIGVuZCBvZiBjb3B5cmlnaHQgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMgImxpY2Vuc2VVUkwiIHByb3BlcnR5IC0gVVJMIG9mIHRoZSAiRmVhdHVyZSBMaWNlbnNlIgotIyBkbyBub3QgdHJhbnNsYXRlIHZhbHVlIC0ganVzdCBjaGFuZ2UgdG8gcG9pbnQgdG8gYSBsb2NhbGUtc3BlY2lmaWMgSFRNTCBwYWdlCi1saWNlbnNlVVJMPWxpY2Vuc2UuaHRtbAotCi0jICJsaWNlbnNlIiBwcm9wZXJ0eSAtIHRleHQgb2YgdGhlICJGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlIgotIyBzaG91bGQgYmUgcGxhaW4gdGV4dCB2ZXJzaW9uIG9mIGxpY2Vuc2UgYWdyZWVtZW50IHBvaW50ZWQgdG8gYmUgImxpY2Vuc2VVUkwiCi1saWNlbnNlPVwKLUVDTElQU0UgRk9VTkRBVElPTiBTT0ZUV0FSRSBVU0VSIEFHUkVFTUVOVFxuXAotTWFyY2ggMTcsIDIwMDVcblwKLVxuXAotVXNhZ2UgT2YgQ29udGVudFxuXAotXG5cCi1USEUgRUNMSVBTRSBGT1VOREFUSU9OIE1BS0VTIEFWQUlMQUJMRSBTT0ZUV0FSRSwgRE9DVU1FTlRBVElPTiwgSU5GT1JNQVRJT04gQU5EL09SXG5cCi1PVEhFUiBNQVRFUklBTFMgRk9SIE9QRU4gU09VUkNFIFBST0pFQ1RTIChDT0xMRUNUSVZFTFkgIkNPTlRFTlQiKS5cblwKLVVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJU1xuXAotQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgTElDRU5TRSBBR1JFRU1FTlRTIE9SXG5cCi1OT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIEJFTE9XLiBCWSBVU0lORyBUSEUgQ09OVEVOVCwgWU9VXG5cCi1BR1JFRSBUSEFUIFlPVVIgVVNFIE9GIFRIRSBDT05URU5UIElTIEdPVkVSTkVEIEJZIFRISVMgQUdSRUVNRU5UXG5cCi1BTkQvT1IgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UU1xuXAotT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEVcblwKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIFRISVMgQUdSRUVNRU5UIEFORCBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlNcblwKLU9GIEFOWSBBUFBMSUNBQkxFIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEXG5cCi1CRUxPVywgVEhFTiBZT1UgTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuXG5cCi1cblwKLUFwcGxpY2FibGUgTGljZW5zZXNcblwKLVxuXAotVW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIEZvdW5kYXRpb25cblwKLWlzIHByb3ZpZGVkIHRvIHlvdSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEVjbGlwc2UgUHVibGljXG5cCi1MaWNlbnNlIFZlcnNpb24gMS4wICgiRVBMIikuIEEgY29weSBvZiB0aGUgRVBMIGlzIHByb3ZpZGVkIHdpdGggdGhpc1xuXAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWwuXG5cCi1Gb3IgcHVycG9zZXMgb2YgdGhlIEVQTCwgIlByb2dyYW0iIHdpbGwgbWVhbiB0aGUgQ29udGVudC5cblwKLVxuXAotQ29udGVudCBpbmNsdWRlcywgYnV0IGlzIG5vdCBsaW1pdGVkIHRvLCBzb3VyY2UgY29kZSwgb2JqZWN0IGNvZGUsXG5cCi1kb2N1bWVudGF0aW9uIGFuZCBvdGhlciBmaWxlcyBtYWludGFpbmVkIGluIHRoZSBFY2xpcHNlLm9yZyBDVlNcblwKLXJlcG9zaXRvcnkgKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlXG5cCi1hcyBkb3dubG9hZGFibGUgYXJjaGl2ZXMgKCJEb3dubG9hZHMiKS5cblwKLVxuXAotICAgLSBDb250ZW50IG1heSBiZSBzdHJ1Y3R1cmVkIGFuZCBwYWNrYWdlZCBpbnRvIG1vZHVsZXMgdG8gZmFjaWxpdGF0ZSBkZWxpdmVyaW5nLFxuXAotICAgICBleHRlbmRpbmcsIGFuZCB1cGdyYWRpbmcgdGhlIENvbnRlbnQuIFR5cGljYWwgbW9kdWxlcyBtYXkgaW5jbHVkZSBwbHVnLWlucyAoIlBsdWctaW5zIiksXG5cCi0gICAgIHBsdWctaW4gZnJhZ21lbnRzICgiRnJhZ21lbnRzIiksIGFuZCBmZWF0dXJlcyAoIkZlYXR1cmVzIikuXG5cCi0gICAtIEVhY2ggUGx1Zy1pbiBvciBGcmFnbWVudCBtYXkgYmUgcGFja2FnZWQgYXMgYSBzdWItZGlyZWN0b3J5IG9yIEpBUiAoSmF2YT8gQVJjaGl2ZSlcblwKLSAgICAgaW4gYSBkaXJlY3RvcnkgbmFtZWQgInBsdWdpbnMiLlxuXAotICAgLSBBIEZlYXR1cmUgaXMgYSBidW5kbGUgb2Ygb25lIG9yIG1vcmUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC5cblwKLSAgICAgRWFjaCBGZWF0dXJlIG1heSBiZSBwYWNrYWdlZCBhcyBhIHN1Yi1kaXJlY3RvcnkgaW4gYSBkaXJlY3RvcnkgbmFtZWQgImZlYXR1cmVzIi5cblwKLSAgICAgV2l0aGluIGEgRmVhdHVyZSwgZmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uXG5cCi0gICAgIG51bWJlcnMgb2YgdGhlIFBsdWctaW5zIGFuZC9vciBGcmFnbWVudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgRmVhdHVyZS5cblwKLSAgIC0gRmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIFdpdGhpbiBhIEZlYXR1cmUsIGZpbGVzXG5cCi0gICAgIG5hbWVkICJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mIEluY2x1ZGVkIEZlYXR1cmVzLlxuXAotXG5cCi1GZWF0dXJlcyBtYXkgYWxzbyBpbmNsdWRlIG90aGVyIEZlYXR1cmVzICgiSW5jbHVkZWQgRmVhdHVyZXMiKS4gRmlsZXMgbmFtZWRcblwKLSJmZWF0dXJlLnhtbCIgbWF5IGNvbnRhaW4gYSBsaXN0IG9mIHRoZSBuYW1lcyBhbmQgdmVyc2lvbiBudW1iZXJzIG9mXG5cCi1JbmNsdWRlZCBGZWF0dXJlcy5cblwKLVxuXAotVGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGdvdmVybmluZyBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHNob3VsZCBiZVxuXAotY29udGFpbmVkIGluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kXG5cCi1jb25kaXRpb25zIGdvdmVybmluZyBGZWF0dXJlcyBhbmQgSW5jbHVkZWQgRmVhdHVyZXMgc2hvdWxkIGJlIGNvbnRhaW5lZFxuXAotaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgKCJGZWF0dXJlIExpY2Vuc2VzIikuIEFib3V0cyBhbmQgRmVhdHVyZVxuXAotTGljZW5zZXMgbWF5IGJlIGxvY2F0ZWQgaW4gYW55IGRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZVxuXAotaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6XG5cCi1cblwKLSAgIC0gVGhlIHRvcC1sZXZlbCAocm9vdCkgZGlyZWN0b3J5XG5cCi0gICAtIFBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzXG5cCi0gICAtIEluc2lkZSBQbHVnLWlucyBhbmQgRnJhZ21lbnRzIHBhY2thZ2VkIGFzIEpBUnNcblwKLSAgIC0gU3ViLWRpcmVjdG9yaWVzIG9mIHRoZSBkaXJlY3RvcnkgbmFtZWQgInNyYyIgb2YgY2VydGFpbiBQbHVnLWluc1xuXAotICAgLSBGZWF0dXJlIGRpcmVjdG9yaWVzXG5cCi1cblwKLU5vdGU6IGlmIGEgRmVhdHVyZSBtYWRlIGF2YWlsYWJsZSBieSB0aGUgRWNsaXBzZSBGb3VuZGF0aW9uIGlzIGluc3RhbGxlZCB1c2luZyB0aGVcblwKLUVjbGlwc2UgVXBkYXRlIE1hbmFnZXIsIHlvdSBtdXN0IGFncmVlIHRvIGEgbGljZW5zZSAoIkZlYXR1cmUgVXBkYXRlXG5cCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnNcblwKLUluY2x1ZGVkIEZlYXR1cmVzLCB0aGUgRmVhdHVyZSBVcGRhdGUgTGljZW5zZSBzaG91bGQgZWl0aGVyIHByb3ZpZGUgeW91XG5cCi13aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBnb3Zlcm5pbmcgdGhlIEluY2x1ZGVkIEZlYXR1cmVzIG9yIGluZm9ybVxuXAoteW91IHdoZXJlIHlvdSBjYW4gbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpblxuXAotdGhlICJsaWNlbnNlIiBwcm9wZXJ0eSBvZiBmaWxlcyBuYW1lZCAiZmVhdHVyZS5wcm9wZXJ0aWVzIi4gU3VjaCBBYm91dHMsXG5cCi1GZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlcyBjb250YWluIHRoZSB0ZXJtcyBhbmRcblwKLWNvbmRpdGlvbnMgKG9yIHJlZmVyZW5jZXMgdG8gc3VjaCB0ZXJtcyBhbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91clxuXAotdXNlIG9mIHRoZSBhc3NvY2lhdGVkIENvbnRlbnQgaW4gdGhhdCBkaXJlY3RvcnkuXG5cCi1cblwKLVRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUlxuXAotVE8gVEhFIEVQTCBPUiBPVEhFUiBMSUNFTlNFIEFHUkVFTUVOVFMsIE5PVElDRVMgT1IgVEVSTVMgQU5EIENPTkRJVElPTlMuXG5cCi1TT01FIE9GIFRIRVNFIE9USEVSIExJQ0VOU0UgQUdSRUVNRU5UUyBNQVkgSU5DTFVERSAoQlVUIEFSRSBOT1QgTElNSVRFRCBUTyk6XG5cCi1cblwKLSAgICAtIENvbW1vbiBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMCAoYXZhaWxhYmxlIGF0IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sKVxuXAotICAgIC0gQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMS4xIChhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UpXG5cCi0gICAgLSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSAyLjAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjApXG5cCi0gICAgLSBJQk0gUHVibGljIExpY2Vuc2UgMS4wIChhdmFpbGFibGUgYXQgaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwpXG5cCi0gICAgLSBNZXRybyBMaW5rIFB1YmxpYyBMaWNlbnNlIDEuMDAgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbClcblwKLSAgICAtIE1vemlsbGEgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKGF2YWlsYWJsZSBhdCBodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwpXG5cCi1cblwKLUlUIElTIFlPVVIgT0JMSUdBVElPTiBUTyBSRUFEIEFORCBBQ0NFUFQgQUxMIFNVQ0ggVEVSTVMgQU5EIENPTkRJVElPTlMgUFJJT1JcblwKLVRPIFVTRSBPRiBUSEUgQ09OVEVOVC4gSWYgbm8gQWJvdXQsIEZlYXR1cmUgTGljZW5zZSBvciBGZWF0dXJlIFVwZGF0ZSBMaWNlbnNlXG5cCi1pcyBwcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgY29uZGl0aW9uc1xuXAotZ292ZXJuIHRoYXQgcGFydGljdWxhciBDb250ZW50LlxuXAotXG5cCi1DcnlwdG9ncmFwaHlcblwKLVxuXAotQ29udGVudCBtYXkgY29udGFpbiBlbmNyeXB0aW9uIHNvZnR3YXJlLiBUaGUgY291bnRyeSBpbiB3aGljaCB5b3UgYXJlXG5cCi1jdXJyZW50bHkgbWF5IGhhdmUgcmVzdHJpY3Rpb25zIG9uIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIGFuZCB1c2UsXG5cCi1hbmQvb3IgcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFXG5cCi11c2luZyBhbnkgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgcGxlYXNlIGNoZWNrIHRoZSBjb3VudHJ5J3MgbGF3cyxcblwKLXJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyBjb25jZXJuaW5nIHRoZSBpbXBvcnQsIHBvc3Nlc3Npb24sIG9yIHVzZSxcblwKLWFuZCByZS1leHBvcnQgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZSwgdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLlxuXAotXG5cCi1KYXZhIGFuZCBhbGwgSmF2YS1iYXNlZCB0cmFkZW1hcmtzIGFyZSB0cmFkZW1hcmtzIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gaW4gdGhlIFVuaXRlZCBTdGF0ZXMsIG90aGVyIGNvdW50cmllcywgb3IgYm90aC5cbgotIyMjIyMjIyMjIyMgZW5kIG9mIGxpY2Vuc2UgcHJvcGVydHkgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9mZWF0dXJlLnhtbCBiL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjQzODA1Li4wMDAwMDAwCi0tLSBhL2ZlYXR1cmVzL29yZy5lY2xpcHNlLndzdC54bWxfdXNlcmRvYy5mZWF0dXJlL2ZlYXR1cmUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxmZWF0dXJlCi0gICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUiCi0gICAgICBsYWJlbD0iJWZlYXR1cmVOYW1lIgotICAgICAgdmVyc2lvbj0iMS42LjAucXVhbGlmaWVyIgotICAgICAgcHJvdmlkZXItbmFtZT0iJXByb3ZpZGVyTmFtZSI+Ci0KLSAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICVkZXNjcmlwdGlvbgotICAgPC9kZXNjcmlwdGlvbj4KLQotICAgPGNvcHlyaWdodD4KLSAgICAgICVjb3B5cmlnaHQKLSAgIDwvY29weXJpZ2h0PgotCi0gICA8bGljZW5zZSB1cmw9ImxpY2Vuc2UuaHRtbCI+Ci0gICAgICAlbGljZW5zZQotICAgPC9saWNlbnNlPgotCi0gICA8dXJsPgotICAgICAgPHVwZGF0ZSBsYWJlbD0iJXVwZGF0ZVNpdGVOYW1lIiB1cmw9Imh0dHA6Ly9kb3dubG9hZC5lY2xpcHNlLm9yZy93ZWJ0b29scy91cGRhdGVzLyIvPgotICAgPC91cmw+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QuZHRkZWRpdG9yLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi0gICA8cGx1Z2luCi0gICAgICAgICBpZD0ib3JnLmVjbGlwc2Uud3N0LnNzZS5kb2MudXNlciIKLSAgICAgICAgIGRvd25sb2FkLXNpemU9IjAiCi0gICAgICAgICBpbnN0YWxsLXNpemU9IjAiCi0gICAgICAgICB2ZXJzaW9uPSIwLjAuMCIKLSAgICAgICAgIHVucGFjaz0iZmFsc2UiLz4KLQotICAgPHBsdWdpbgotICAgICAgICAgaWQ9Im9yZy5lY2xpcHNlLndzdC54bWxlZGl0b3IuZG9jLnVzZXIiCi0gICAgICAgICBkb3dubG9hZC1zaXplPSIwIgotICAgICAgICAgaW5zdGFsbC1zaXplPSIwIgotICAgICAgICAgdmVyc2lvbj0iMC4wLjAiCi0gICAgICAgICB1bnBhY2s9ImZhbHNlIi8+Ci0KLSAgIDxwbHVnaW4KLSAgICAgICAgIGlkPSJvcmcuZWNsaXBzZS53c3QueHNkZWRpdG9yLmRvYy51c2VyIgotICAgICAgICAgZG93bmxvYWQtc2l6ZT0iMCIKLSAgICAgICAgIGluc3RhbGwtc2l6ZT0iMCIKLSAgICAgICAgIHZlcnNpb249IjAuMC4wIgotICAgICAgICAgdW5wYWNrPSJmYWxzZSIvPgotCi08L2ZlYXR1cmU+CmRpZmYgLS1naXQgYS9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwgYi9mZWF0dXJlcy9vcmcuZWNsaXBzZS53c3QueG1sX3VzZXJkb2MuZmVhdHVyZS9saWNlbnNlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzNDcwNjAuLjAwMDAwMDAKLS0tIGEvZmVhdHVyZXMvb3JnLmVjbGlwc2Uud3N0LnhtbF91c2VyZG9jLmZlYXR1cmUvbGljZW5zZS5odG1sCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIgImh0dHA6Ly93d3cudzNjLm9yZy9UUi8xOTk5L1JFQy1odG1sNDAxLTE5OTkxMjI0L2xvb3NlLmR0ZCI+Ci08IS0tIHNhdmVkIGZyb20gdXJsPSgwMDQ0KWh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsL25vdGljZS5odG1sIC0tPgotPEhUTUw+PEhFQUQ+PFRJVExFPkVjbGlwc2Uub3JnIFNvZnR3YXJlIFVzZXIgQWdyZWVtZW50PC9USVRMRT4KLTxNRVRBIGh0dHAtZXF1aXY9Q29udGVudC1UeXBlIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIj4KLTxNRVRBIGNvbnRlbnQ9Ik1TSFRNTCA2LjAwLjI4MDAuMTQ3OSIgbmFtZT1HRU5FUkFUT1I+PC9IRUFEPgotPEJPRFkgbGFuZz1FTi1VUyB2TGluaz1wdXJwbGUgbGluaz1ibHVlPgotPEgyPkVjbGlwc2UgRm91bmRhdGlvbiBTb2Z0d2FyZSBVc2VyIEFncmVlbWVudDwvSDI+Ci08UD5KYW51YXJ5IDI4LCAyMDA1PC9QPgotPEgzPlVzYWdlIE9mIENvbnRlbnQ8L0gzPgotPFA+VEhFIEVDTElQU0UgRk9VTkRBVElPTiBNQUtFUyBBVkFJTEFCTEUgU09GVFdBUkUsIERPQ1VNRU5UQVRJT04sIElORk9STUFUSU9OIAotQU5EL09SIE9USEVSIE1BVEVSSUFMUyBGT1IgT1BFTiBTT1VSQ0UgUFJPSkVDVFMgKENPTExFQ1RJVkVMWSAiQ09OVEVOVCIpLiBVU0UgT0YgCi1USEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCBCWSBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQgQU5EL09SIFRIRSAKLVRFUk1TIEFORCBDT05ESVRJT05TIE9GIExJQ0VOU0UgQUdSRUVNRU5UUyBPUiBOT1RJQ0VTIElORElDQVRFRCBPUiBSRUZFUkVOQ0VEIAotQkVMT1cuIEJZIFVTSU5HIFRIRSBDT05URU5ULCBZT1UgQUdSRUUgVEhBVCBZT1VSIFVTRSBPRiBUSEUgQ09OVEVOVCBJUyBHT1ZFUk5FRCAKLUJZIFRISVMgQUdSRUVNRU5UIEFORC9PUiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgQU5ZIEFQUExJQ0FCTEUgTElDRU5TRSAKLUFHUkVFTUVOVFMgT1IgTk9USUNFUyBJTkRJQ0FURUQgT1IgUkVGRVJFTkNFRCBCRUxPVy4gSUYgWU9VIERPIE5PVCBBR1JFRSBUTyBUSEUgCi1URVJNUyBBTkQgQ09ORElUSU9OUyBPRiBUSElTIEFHUkVFTUVOVCBBTkQgVEhFIFRFUk1TIEFORCBDT05ESVRJT05TIE9GIEFOWSAKLUFQUExJQ0FCTEUgTElDRU5TRSBBR1JFRU1FTlRTIE9SIE5PVElDRVMgSU5ESUNBVEVEIE9SIFJFRkVSRU5DRUQgQkVMT1csIFRIRU4gWU9VIAotTUFZIE5PVCBVU0UgVEhFIENPTlRFTlQuPC9QPgotPEgzPkFwcGxpY2FibGUgTGljZW5zZXM8L0gzPgotPFA+VW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQsIGFsbCBDb250ZW50IG1hZGUgYXZhaWxhYmxlIGJ5IHRoZSBFY2xpcHNlIAotRm91bmRhdGlvbiBpcyBwcm92aWRlZCB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBFY2xpcHNlIAotUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKCJFUEwiKS4gQSBjb3B5IG9mIHRoZSBFUEwgaXMgcHJvdmlkZWQgd2l0aCB0aGlzIAotQ29udGVudCBhbmQgaXMgYWxzbyBhdmFpbGFibGUgYXQgPEEgCi1ocmVmPSJodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MTAuaHRtbCI+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjEwLmh0bWw8L0E+LiAKLUZvciBwdXJwb3NlcyBvZiB0aGUgRVBMLCAiUHJvZ3JhbSIgd2lsbCBtZWFuIHRoZSBDb250ZW50LjwvUD4KLTxQPkNvbnRlbnQgaW5jbHVkZXMsIGJ1dCBpcyBub3QgbGltaXRlZCB0bywgc291cmNlIGNvZGUsIG9iamVjdCBjb2RlLCAKLWRvY3VtZW50YXRpb24gYW5kIG90aGVyIGZpbGVzIG1haW50YWluZWQgaW4gdGhlIEVjbGlwc2Uub3JnIENWUyByZXBvc2l0b3J5IAotKCJSZXBvc2l0b3J5IikgaW4gQ1ZTIG1vZHVsZXMgKCJNb2R1bGVzIikgYW5kIG1hZGUgYXZhaWxhYmxlIGFzIGRvd25sb2FkYWJsZSAKLWFyY2hpdmVzICgiRG93bmxvYWRzIikuPC9QPgotPFA+Q29udGVudCBtYXkgYmUgYXBwb3J0aW9uZWQgaW50byBwbHVnLWlucyAoIlBsdWctaW5zIiksIHBsdWctaW4gZnJhZ21lbnRzIAotKCJGcmFnbWVudHMiKSwgYW5kIGZlYXR1cmVzICgiRmVhdHVyZXMiKS4gQSBGZWF0dXJlIGlzIGEgYnVuZGxlIG9mIG9uZSBvciBtb3JlIAotUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyBhbmQgYXNzb2NpYXRlZCBtYXRlcmlhbC4gRmlsZXMgbmFtZWQgImZlYXR1cmUueG1sIiBtYXkgCi1jb250YWluIGEgbGlzdCBvZiB0aGUgbmFtZXMgYW5kIHZlcnNpb24gbnVtYmVycyBvZiB0aGUgUGx1Zy1pbnMgYW5kL29yIEZyYWdtZW50cyAKLWFzc29jaWF0ZWQgd2l0aCBhIEZlYXR1cmUuIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgYXJlIGxvY2F0ZWQgaW4gZGlyZWN0b3JpZXMgCi1uYW1lZCAicGx1Z2lucyIgYW5kIEZlYXR1cmVzIGFyZSBsb2NhdGVkIGluIGRpcmVjdG9yaWVzIG5hbWVkICJmZWF0dXJlcyIuPC9QPgotPFA+RmVhdHVyZXMgbWF5IGFsc28gaW5jbHVkZSBvdGhlciBGZWF0dXJlcyAoIkluY2x1ZGVkIEZlYXR1cmVzIikuIEZpbGVzIG5hbWVkIAotImZlYXR1cmUueG1sIiBtYXkgY29udGFpbiBhIGxpc3Qgb2YgdGhlIG5hbWVzIGFuZCB2ZXJzaW9uIG51bWJlcnMgb2YgSW5jbHVkZWQgCi1GZWF0dXJlcy48L1A+Ci08UD5UaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIFBsdWctaW5zIGFuZCBGcmFnbWVudHMgc2hvdWxkIGJlIGNvbnRhaW5lZCAKLWluIGZpbGVzIG5hbWVkICJhYm91dC5odG1sIiAoIkFib3V0cyIpLiBUaGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZ292ZXJuaW5nIAotRmVhdHVyZXMgYW5kIEluY2x1ZGVkIEZlYXR1cmVzIHNob3VsZCBiZSBjb250YWluZWQgaW4gZmlsZXMgbmFtZWQgImxpY2Vuc2UuaHRtbCIgCi0oIkZlYXR1cmUgTGljZW5zZXMiKS4gQWJvdXRzIGFuZCBGZWF0dXJlIExpY2Vuc2VzIG1heSBiZSBsb2NhdGVkIGluIGFueSAKLWRpcmVjdG9yeSBvZiBhIERvd25sb2FkIG9yIE1vZHVsZSBpbmNsdWRpbmcsIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgZm9sbG93aW5nIAotbG9jYXRpb25zOjwvUD4KLTxVTD4KLSAgPExJPlRoZSB0b3AtbGV2ZWwgKHJvb3QpIGRpcmVjdG9yeSAKLSAgPExJPlBsdWctaW4gYW5kIEZyYWdtZW50IGRpcmVjdG9yaWVzIAotICA8TEk+U3ViZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yeSBuYW1lZCAic3JjIiBvZiBjZXJ0YWluIFBsdWctaW5zIAotICA8TEk+RmVhdHVyZSBkaXJlY3RvcmllcyA8L0xJPjwvVUw+Ci08UD5Ob3RlOiBpZiBhIEZlYXR1cmUgbWFkZSBhdmFpbGFibGUgYnkgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiBpcyBpbnN0YWxsZWQgCi11c2luZyB0aGUgRWNsaXBzZSBVcGRhdGUgTWFuYWdlciwgeW91IG11c3QgYWdyZWUgdG8gYSBsaWNlbnNlICgiRmVhdHVyZSBVcGRhdGUgCi1MaWNlbnNlIikgZHVyaW5nIHRoZSBpbnN0YWxsYXRpb24gcHJvY2Vzcy4gSWYgdGhlIEZlYXR1cmUgY29udGFpbnMgSW5jbHVkZWQgCi1GZWF0dXJlcywgdGhlIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2Ugc2hvdWxkIGVpdGhlciBwcm92aWRlIHlvdSB3aXRoIHRoZSB0ZXJtcyAKLWFuZCBjb25kaXRpb25zIGdvdmVybmluZyB0aGUgSW5jbHVkZWQgRmVhdHVyZXMgb3IgaW5mb3JtIHlvdSB3aGVyZSB5b3UgY2FuIAotbG9jYXRlIHRoZW0uIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2VzIG1heSBiZSBmb3VuZCBpbiB0aGUgImxpY2Vuc2UiIHByb3BlcnR5IG9mIAotZmlsZXMgbmFtZWQgImZlYXR1cmUucHJvcGVydGllcyIuIFN1Y2ggQWJvdXRzLCBGZWF0dXJlIExpY2Vuc2VzIGFuZCBGZWF0dXJlIAotVXBkYXRlIExpY2Vuc2VzIGNvbnRhaW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIChvciByZWZlcmVuY2VzIHRvIHN1Y2ggdGVybXMgCi1hbmQgY29uZGl0aW9ucykgdGhhdCBnb3Zlcm4geW91ciB1c2Ugb2YgdGhlIGFzc29jaWF0ZWQgQ29udGVudCBpbiB0aGF0IAotZGlyZWN0b3J5LjwvUD4KLTxQPlRIRSBBQk9VVFMsIEZFQVRVUkUgTElDRU5TRVMgQU5EIEZFQVRVUkUgVVBEQVRFIExJQ0VOU0VTIE1BWSBSRUZFUiBUTyBUSEUgRVBMIAotT1IgT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTLCBOT1RJQ0VTIE9SIFRFUk1TIEFORCBDT05ESVRJT05TLiBTT01FIE9GIFRIRVNFIAotT1RIRVIgTElDRU5TRSBBR1JFRU1FTlRTIE1BWSBJTkNMVURFIChCVVQgQVJFIE5PVCBMSU1JVEVEIFRPKTo8L1A+Ci08VUw+Ci0gIDxMST5Db21tb24gUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9jcGwtdjEwLmh0bWwiPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvY3BsLXYxMC5odG1sPC9BPikgCi0KLSAgPExJPkFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRSI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0U8L0E+KSAKLQotICA8TEk+QXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgMi4wIChhdmFpbGFibGUgYXQgPEEgCi0gIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wPC9BPikgCi0KLSAgPExJPklCTSBQdWJsaWMgTGljZW5zZSAxLjAgKGF2YWlsYWJsZSBhdCA8QSAKLSAgaHJlZj0iaHR0cDovL29zcy5zb2Z0d2FyZS5pYm0uY29tL2RldmVsb3BlcndvcmtzL29wZW5zb3VyY2UvbGljZW5zZTEwLmh0bWwiPmh0dHA6Ly9vc3Muc29mdHdhcmUuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9vcGVuc291cmNlL2xpY2Vuc2UxMC5odG1sPC9BPikgCi0KLSAgPExJPk1ldHJvIExpbmsgUHVibGljIExpY2Vuc2UgMS4wMCAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb3Blbm1vdGlmL3N1cHBvcnRlcnMvbWV0cm9saW5rL2xpY2Vuc2UuaHRtbCI+aHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29wZW5tb3RpZi9zdXBwb3J0ZXJzL21ldHJvbGluay9saWNlbnNlLmh0bWw8L0E+KSAKLQotICA8TEk+TW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAoYXZhaWxhYmxlIGF0IDxBIAotICBocmVmPSJodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC9NUEwtMS4xLmh0bWwiPmh0dHA6Ly93d3cubW96aWxsYS5vcmcvTVBML01QTC0xLjEuaHRtbDwvQT4pIAotICA8L0xJPjwvVUw+Ci08UD5JVCBJUyBZT1VSIE9CTElHQVRJT04gVE8gUkVBRCBBTkQgQUNDRVBUIEFMTCBTVUNIIFRFUk1TIEFORCBDT05ESVRJT05TIFBSSU9SIAotVE8gVVNFIE9GIFRIRSBDT05URU5ULiBJZiBubyBBYm91dCwgRmVhdHVyZSBMaWNlbnNlIG9yIEZlYXR1cmUgVXBkYXRlIExpY2Vuc2UgaXMgCi1wcm92aWRlZCwgcGxlYXNlIGNvbnRhY3QgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiB0byBkZXRlcm1pbmUgd2hhdCB0ZXJtcyBhbmQgCi1jb25kaXRpb25zIGdvdmVybiB0aGF0IHBhcnRpY3VsYXIgQ29udGVudC48L1A+Ci08SDM+Q3J5cHRvZ3JhcGh5PC9IMz4KLTxQPkNvbnRlbnQgbWF5IGNvbnRhaW4gZW5jcnlwdGlvbiBzb2Z0d2FyZS4gVGhlIGNvdW50cnkgaW4gd2hpY2ggeW91IGFyZSAKLWN1cnJlbnRseSBtYXkgaGF2ZSByZXN0cmljdGlvbnMgb24gdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgYW5kIHVzZSwgYW5kL29yIAotcmUtZXhwb3J0IHRvIGFub3RoZXIgY291bnRyeSwgb2YgZW5jcnlwdGlvbiBzb2Z0d2FyZS4gQkVGT1JFIHVzaW5nIGFueSAKLWVuY3J5cHRpb24gc29mdHdhcmUsIHBsZWFzZSBjaGVjayB0aGUgY291bnRyeSdzIGxhd3MsIHJlZ3VsYXRpb25zIGFuZCBwb2xpY2llcyAKLWNvbmNlcm5pbmcgdGhlIGltcG9ydCwgcG9zc2Vzc2lvbiwgb3IgdXNlLCBhbmQgcmUtZXhwb3J0IG9mIGVuY3J5cHRpb24gc29mdHdhcmUsIAotdG8gc2VlIGlmIHRoaXMgaXMgcGVybWl0dGVkLjwvUD48L0JPRFk+PC9IVE1MPgo=